Repository: shantigilbert/EmuELEC Branch: dev Commit: 2587930f1857 Files: 5232 Total size: 24.8 MB Directory structure: gitextract_da2ktlda/ ├── .editorconfig ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ ├── config.yml │ │ ├── feature_request.md │ │ └── other-issue.md │ └── config.yml ├── .gitignore ├── CHANGELOG ├── CONTRIBUTING.md ├── Makefile ├── README.md ├── config/ │ ├── addon/ │ │ ├── dummy.xml │ │ ├── xbmc.broken.xml │ │ ├── xbmc.python.module.xml │ │ ├── xbmc.python.script.xml │ │ ├── xbmc.service.library.xml │ │ ├── xbmc.service.pluginsource.xml │ │ └── xbmc.service.xml │ ├── arch.aarch64 │ ├── arch.arm │ ├── arch.x86_64 │ ├── docker/ │ │ ├── changelog.txt │ │ ├── package.mk │ │ └── source/ │ │ ├── bin/ │ │ │ └── docker │ │ ├── default.py │ │ ├── resources/ │ │ │ ├── language/ │ │ │ │ └── English/ │ │ │ │ └── strings.po │ │ │ └── settings.xml │ │ └── system.d/ │ │ └── docker.service │ ├── functions │ ├── graphic │ ├── multithread │ ├── noobs/ │ │ ├── marketing/ │ │ │ ├── slides/ │ │ │ │ └── noobs.psd │ │ │ └── slides_vga/ │ │ │ └── noobs_vga.psd │ │ ├── os.json │ │ ├── partition_setup.sh │ │ └── partitions.json │ ├── optimize │ ├── options │ ├── options32 │ ├── path │ ├── show_config │ └── sources ├── create_tar.sh ├── distributions/ │ ├── CoreELEC/ │ │ ├── options │ │ ├── show_config │ │ ├── splash/ │ │ │ ├── Amlogic-ne/ │ │ │ │ └── progress/ │ │ │ │ └── splash-1080-config │ │ │ └── Amlogic-ng/ │ │ │ └── progress/ │ │ │ └── splash-1080-config │ │ └── version │ ├── EmuELEC/ │ │ ├── options │ │ ├── show_config │ │ ├── splash/ │ │ │ ├── Amlogic-ne/ │ │ │ │ └── progress/ │ │ │ │ └── splash-1080-config │ │ │ ├── Amlogic-ng/ │ │ │ │ └── progress/ │ │ │ │ └── splash-1080-config │ │ │ └── Amlogic-no/ │ │ │ └── progress/ │ │ │ └── splash-1080-config │ │ └── version │ └── LibreELEC/ │ ├── kernel_options │ ├── options │ ├── show_config │ └── version ├── licenses/ │ ├── 7-Zip.txt │ ├── APL-1.0.txt │ ├── APSL-2.0.txt │ ├── APSL.txt │ ├── ATI.txt │ ├── Apache-2.0.txt │ ├── Artistic.txt │ ├── BSD-1-Clause.txt │ ├── BSD-2-Clause.txt │ ├── BSD-3-Clause.txt │ ├── BSD-4-Clause.txt │ ├── BSL.txt │ ├── Clarified_Artistic.txt │ ├── FDL.txt │ ├── FDL1_2.txt │ ├── FDL1_3.txt │ ├── FLIRC.txt │ ├── GPL-1.0-only.txt │ ├── GPL-2.0-only.txt │ ├── GPL-2.0-or-later.txt │ ├── GPL-3.0-only.txt │ ├── GPL-3.0-or-later.txt │ ├── HIDAPI-orig.txt │ ├── ISC.txt │ ├── Info-ZIP.txt │ ├── LGPL-2.0-only.txt │ ├── LGPL-2.0-or-later.txt │ ├── LGPL-2.1-only.txt │ ├── LGPL-2.1-or-later.txt │ ├── LGPL-3.0-only.txt │ ├── LGPL-3.0-or-later.txt │ ├── LibPNG2.txt │ ├── MIT.txt │ ├── MIT_Modified.txt │ ├── MPL-1.1.txt │ ├── MPL-2.0.txt │ ├── NVIDIA.txt │ ├── NextPVR.txt │ ├── OFL-1.1.txt │ ├── QCA.txt │ ├── Radeon_rlc.txt │ ├── Vim.txt │ └── Zlib.txt ├── package_bump.sh ├── packages/ │ ├── README.md │ ├── addons/ │ │ ├── addon-depends/ │ │ │ ├── adafruit-libraries-depends/ │ │ │ │ ├── Adafruit_Python_ADS1x15/ │ │ │ │ │ └── package.mk │ │ │ │ ├── Adafruit_Python_ADXL345/ │ │ │ │ │ └── package.mk │ │ │ │ ├── Adafruit_Python_BMP/ │ │ │ │ │ └── package.mk │ │ │ │ ├── Adafruit_Python_CharLCD/ │ │ │ │ │ └── package.mk │ │ │ │ ├── Adafruit_Python_DHT/ │ │ │ │ │ └── package.mk │ │ │ │ ├── Adafruit_Python_GPIO/ │ │ │ │ │ └── package.mk │ │ │ │ ├── Adafruit_Python_LED_Backpack/ │ │ │ │ │ └── package.mk │ │ │ │ ├── Adafruit_Python_LSM303/ │ │ │ │ │ └── package.mk │ │ │ │ ├── Adafruit_Python_MCP3008/ │ │ │ │ │ └── package.mk │ │ │ │ ├── Adafruit_Python_MCP4725/ │ │ │ │ │ └── package.mk │ │ │ │ ├── Adafruit_Python_PCA9685/ │ │ │ │ │ └── package.mk │ │ │ │ ├── Adafruit_Python_PureIO/ │ │ │ │ │ └── package.mk │ │ │ │ ├── Adafruit_Python_SI1145/ │ │ │ │ │ └── package.mk │ │ │ │ ├── Adafruit_Python_SSD1306/ │ │ │ │ │ └── package.mk │ │ │ │ ├── Adafruit_Python_TCS34725/ │ │ │ │ │ └── package.mk │ │ │ │ ├── Adafruit_Python_VCNL40xx/ │ │ │ │ │ └── package.mk │ │ │ │ └── Adafruit_Python_WS2801/ │ │ │ │ └── package.mk │ │ │ ├── argtable2/ │ │ │ │ └── package.mk │ │ │ ├── ccid/ │ │ │ │ └── package.mk │ │ │ ├── chrome-depends/ │ │ │ │ ├── at-spi2-atk/ │ │ │ │ │ └── package.mk │ │ │ │ ├── at-spi2-core/ │ │ │ │ │ └── package.mk │ │ │ │ ├── atk/ │ │ │ │ │ └── package.mk │ │ │ │ ├── chrome-libXcomposite/ │ │ │ │ │ └── package.mk │ │ │ │ ├── chrome-libXdamage/ │ │ │ │ │ └── package.mk │ │ │ │ ├── chrome-libXfixes/ │ │ │ │ │ └── package.mk │ │ │ │ ├── chrome-libXi/ │ │ │ │ │ └── package.mk │ │ │ │ ├── chrome-libXrender/ │ │ │ │ │ └── package.mk │ │ │ │ ├── chrome-libXtst/ │ │ │ │ │ └── package.mk │ │ │ │ ├── chrome-libxcb/ │ │ │ │ │ └── package.mk │ │ │ │ ├── chrome-libxkbcommon/ │ │ │ │ │ └── package.mk │ │ │ │ ├── chrome-libxshmfence/ │ │ │ │ │ └── package.mk │ │ │ │ ├── cups/ │ │ │ │ │ └── package.mk │ │ │ │ ├── gtk3/ │ │ │ │ │ ├── files/ │ │ │ │ │ │ └── settings.ini │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── disable-to-pixdata-build.patch │ │ │ │ ├── harfbuzz-icu/ │ │ │ │ │ └── package.mk │ │ │ │ ├── libXScrnSaver/ │ │ │ │ │ └── package.mk │ │ │ │ ├── libXcursor/ │ │ │ │ │ └── package.mk │ │ │ │ ├── libXft/ │ │ │ │ │ └── package.mk │ │ │ │ ├── libxss/ │ │ │ │ │ └── package.mk │ │ │ │ ├── scrnsaverproto/ │ │ │ │ │ └── package.mk │ │ │ │ ├── unclutter/ │ │ │ │ │ └── package.mk │ │ │ │ └── unix_ar/ │ │ │ │ └── package.mk │ │ │ ├── comskip/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── Comskip-0001-Fix-compilation-with-gcc10.patch │ │ │ ├── cxxtools/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── cxxtools-2.2-Char_operator_eq_unsigned_int.patch │ │ │ │ ├── cxxtools-2.2-hdstream_stdio.patch │ │ │ │ ├── cxxtools-2.2.1-make-cxxtools-char-a-trivial-class-by-defining-the-default.patch │ │ │ │ ├── cxxtools-3.0-gcc12-time.patch │ │ │ │ ├── cxxtools-3.0-lld-linking-openssl.patch │ │ │ │ └── cxxtools-crosscompile.patch │ │ │ ├── docker/ │ │ │ │ ├── cli/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── cli-0001-path-for-cli-plugins.patch │ │ │ │ ├── containerd/ │ │ │ │ │ └── package.mk │ │ │ │ ├── ctop/ │ │ │ │ │ └── package.mk │ │ │ │ ├── moby/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ ├── moby-001-user-addon-storage-location.patch │ │ │ │ │ └── moby-002-use-unconfined-seccomp-profile-as-default.patch │ │ │ │ └── tini/ │ │ │ │ └── package.mk │ │ │ ├── dotnet-runtime-depends/ │ │ │ │ └── aspnet6-runtime/ │ │ │ │ └── package.mk │ │ │ ├── dvb-tools-depends/ │ │ │ │ ├── blindscan-s2/ │ │ │ │ │ └── package.mk │ │ │ │ ├── depends/ │ │ │ │ │ ├── bitstream/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ └── libev/ │ │ │ │ │ └── package.mk │ │ │ │ ├── dvb-apps/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ ├── dvb-apps-10_reorder-includes.patch │ │ │ │ │ ├── dvb-apps-20_build-static-libs.patch │ │ │ │ │ ├── dvb-apps-30_remove-av7110_loadkeys.patch │ │ │ │ │ ├── dvb-apps-40-kernel-fix-4.14.patch │ │ │ │ │ ├── dvb-apps-50-glibc-2.31-fix.patch │ │ │ │ │ └── dvb-apps-60-dont-build-tests.patch │ │ │ │ ├── dvblast/ │ │ │ │ │ └── package.mk │ │ │ │ ├── dvbsnoop/ │ │ │ │ │ └── package.mk │ │ │ │ ├── mumudvb/ │ │ │ │ │ └── package.mk │ │ │ │ ├── szap-s2/ │ │ │ │ │ └── package.mk │ │ │ │ ├── t2scan/ │ │ │ │ │ └── package.mk │ │ │ │ ├── tune-s2/ │ │ │ │ │ └── package.mk │ │ │ │ └── w_scan/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── w_scan-0001-Fix-building-with-gcc10.patch │ │ │ ├── enca/ │ │ │ │ └── package.mk │ │ │ ├── enet/ │ │ │ │ └── package.mk │ │ │ ├── faad2/ │ │ │ │ └── package.mk │ │ │ ├── ffmpegx/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── ffmpeg-openssl3.patch │ │ │ ├── ffmpegx-depends/ │ │ │ │ ├── x264/ │ │ │ │ │ └── package.mk │ │ │ │ └── x265/ │ │ │ │ └── package.mk │ │ │ ├── game-tools/ │ │ │ │ ├── bchunk/ │ │ │ │ │ └── package.mk │ │ │ │ ├── ecm-tools/ │ │ │ │ │ └── package.mk │ │ │ │ ├── iat/ │ │ │ │ │ └── package.mk │ │ │ │ └── linuxconsoletools/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── linuxconsoletools-0001-disable-building-ffmvforce.patch │ │ │ ├── go/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── go-0001-add-ca-cert-location.patch │ │ │ ├── hidapi/ │ │ │ │ └── package.mk │ │ │ ├── icu/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── icu-01_ldflags.patch │ │ │ ├── inadyn/ │ │ │ │ └── libconfuse/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── gettext-0.20-libconfuse.patch │ │ │ ├── jre-depends/ │ │ │ │ ├── apache-ant/ │ │ │ │ │ └── package.mk │ │ │ │ ├── jdk-aarch64-zulu/ │ │ │ │ │ └── package.mk │ │ │ │ ├── jdk-arm-zulu/ │ │ │ │ │ └── package.mk │ │ │ │ ├── jdk-x86_64-zulu/ │ │ │ │ │ └── package.mk │ │ │ │ ├── jre-libXinerama/ │ │ │ │ │ └── package.mk │ │ │ │ └── jre-libbluray/ │ │ │ │ └── package.mk │ │ │ ├── lcdd-depends/ │ │ │ │ ├── libugpio/ │ │ │ │ │ └── package.mk │ │ │ │ └── serdisplib/ │ │ │ │ └── package.mk │ │ │ ├── libconfig/ │ │ │ │ └── package.mk │ │ │ ├── libdvbcsa/ │ │ │ │ └── package.mk │ │ │ ├── libexif/ │ │ │ │ └── package.mk │ │ │ ├── libhdhomerun/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── shared-to-static.patch │ │ │ ├── libiconv/ │ │ │ │ └── package.mk │ │ │ ├── libid3tag/ │ │ │ │ ├── package.mk │ │ │ │ └── sources/ │ │ │ │ └── id3tag.pc │ │ │ ├── libimobiledevice/ │ │ │ │ └── package.mk │ │ │ ├── libmad/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── libmad-0.15.1b-automake_1.13.patch │ │ │ │ ├── libmad-0.15.1b-cflags-O2.patch │ │ │ │ └── libmad-0.15.1b-cflags.patch │ │ │ ├── libmpdclient/ │ │ │ │ └── package.mk │ │ │ ├── librespot-depends/ │ │ │ │ └── rustup.rs/ │ │ │ │ └── package.mk │ │ │ ├── libseccomp/ │ │ │ │ └── package.mk │ │ │ ├── libusbmuxd/ │ │ │ │ └── package.mk │ │ │ ├── libvncserver/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── fix-build-with-openssl-3.0.0.patch │ │ │ ├── libvpx/ │ │ │ │ └── package.mk │ │ │ ├── libzip/ │ │ │ │ └── package.mk │ │ │ ├── moonlight-common-c/ │ │ │ │ └── package.mk │ │ │ ├── moonlight-embedded/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── 01-surround-fix.patch │ │ │ ├── mpd-mpc/ │ │ │ │ └── package.mk │ │ │ ├── multimedia-tools-depends/ │ │ │ │ ├── depends/ │ │ │ │ │ ├── libmediainfo/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ └── libzen/ │ │ │ │ │ └── package.mk │ │ │ │ ├── mediainfo/ │ │ │ │ │ └── package.mk │ │ │ │ ├── mesa-demos/ │ │ │ │ │ └── package.mk │ │ │ │ ├── mpg123/ │ │ │ │ │ └── package.mk │ │ │ │ ├── mpv-drmprime/ │ │ │ │ │ └── package.mk │ │ │ │ ├── opencaster/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ ├── opencaster-02_headers.patch │ │ │ │ │ └── opencaster-03_dont-build-dvbobjects.patch │ │ │ │ ├── squeezelite/ │ │ │ │ │ └── package.mk │ │ │ │ ├── tsdecrypt/ │ │ │ │ │ └── package.mk │ │ │ │ └── tstools/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── build.patch │ │ │ │ └── crossstrip.patch │ │ │ ├── network-tools-depends/ │ │ │ │ ├── bwm-ng/ │ │ │ │ │ └── package.mk │ │ │ │ ├── depends/ │ │ │ │ │ ├── libpcap/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ └── remove-manpages.patch │ │ │ │ │ └── libstatgrab/ │ │ │ │ │ └── package.mk │ │ │ │ ├── iftop/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ ├── iftop-Fix-building-with-gcc10.patch │ │ │ │ │ ├── iftop-boo.patch │ │ │ │ │ └── iftop-variable-to-be-local-due-to-pcap-1-10-0.patch │ │ │ │ ├── iperf/ │ │ │ │ │ └── package.mk │ │ │ │ ├── irssi/ │ │ │ │ │ └── package.mk │ │ │ │ ├── lftp/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── lftp-0001-link-readline-with-termcap.patch │ │ │ │ ├── ncftp/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── ncftpd-gcc10-build-fix.patch │ │ │ │ ├── ngrep/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── port-to-pcre2-api-and-enable-jit-compilation.patch │ │ │ │ ├── nmap/ │ │ │ │ │ └── package.mk │ │ │ │ ├── rar2fs/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── 001-remove-man-pages-1.29.3.patch │ │ │ │ ├── sshfs/ │ │ │ │ │ └── package.mk │ │ │ │ ├── tcpdump/ │ │ │ │ │ └── package.mk │ │ │ │ ├── udpxy/ │ │ │ │ │ └── package.mk │ │ │ │ └── wireless_tools/ │ │ │ │ └── package.mk │ │ │ ├── opus/ │ │ │ │ └── package.mk │ │ │ ├── pcsc-lite/ │ │ │ │ └── package.mk │ │ │ ├── pngquant/ │ │ │ │ └── package.mk │ │ │ ├── protobuf/ │ │ │ │ └── package.mk │ │ │ ├── qtbase/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── qtbase-0001-use-sysroot-path-for-pkgconfig-and-libtool.patch │ │ │ │ ├── qtbase-0002-fix-build-with-gcc-11.patch │ │ │ │ └── qtbase-0003-More-build-fixes-for-GCC-11.patch │ │ │ ├── rpi-tools-depends/ │ │ │ │ ├── RPi.GPIO/ │ │ │ │ │ └── package.mk │ │ │ │ ├── colorzero/ │ │ │ │ │ └── package.mk │ │ │ │ ├── gpiozero/ │ │ │ │ │ └── package.mk │ │ │ │ └── lan951x-led-ctl/ │ │ │ │ └── package.mk │ │ │ ├── rpi_ws281x/ │ │ │ │ └── package.mk │ │ │ ├── rsyslog-depends/ │ │ │ │ ├── libestr/ │ │ │ │ │ └── package.mk │ │ │ │ ├── libfastjson/ │ │ │ │ │ └── package.mk │ │ │ │ ├── liblogging/ │ │ │ │ │ └── package.mk │ │ │ │ ├── liblognorm/ │ │ │ │ │ └── package.mk │ │ │ │ └── librelp/ │ │ │ │ └── package.mk │ │ │ ├── runc/ │ │ │ │ └── package.mk │ │ │ ├── sdlgamecontrollerdb/ │ │ │ │ └── package.mk │ │ │ ├── snapcast-depends/ │ │ │ │ ├── aixlog/ │ │ │ │ │ └── package.mk │ │ │ │ ├── alsa-plugins/ │ │ │ │ │ └── package.mk │ │ │ │ ├── asio/ │ │ │ │ │ └── package.mk │ │ │ │ ├── libsodium/ │ │ │ │ │ └── package.mk │ │ │ │ ├── nqptp/ │ │ │ │ │ └── package.mk │ │ │ │ ├── popl/ │ │ │ │ │ └── package.mk │ │ │ │ ├── shairport-sync/ │ │ │ │ │ └── package.mk │ │ │ │ └── snapcast/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── snapcast-01_makefiles.patch │ │ │ │ └── snapcast-02_avahi.patch │ │ │ ├── system-tools-depends/ │ │ │ │ ├── autossh/ │ │ │ │ │ └── package.mk │ │ │ │ ├── bottom/ │ │ │ │ │ └── package.mk │ │ │ │ ├── depends/ │ │ │ │ │ ├── efivar/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ ├── efivar-01-compile-with-glibc-2.36.patch │ │ │ │ │ │ └── efivar-01-static_lib.patch │ │ │ │ │ ├── libmtp/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ └── libmtp-0001-dont-execute-compiled-tools.patch │ │ │ │ │ ├── libssh2/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ └── oniguruma/ │ │ │ │ │ └── package.mk │ │ │ │ ├── diffutils/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── diffutils-001-no-man-or-doc.patch │ │ │ │ ├── dool/ │ │ │ │ │ └── package.mk │ │ │ │ ├── dtach/ │ │ │ │ │ └── package.mk │ │ │ │ ├── efibootmgr/ │ │ │ │ │ └── package.mk │ │ │ │ ├── encfs/ │ │ │ │ │ └── package.mk │ │ │ │ ├── evtest/ │ │ │ │ │ └── package.mk │ │ │ │ ├── fdupes/ │ │ │ │ │ └── package.mk │ │ │ │ ├── file/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── file-move-magic.mgc-to-addon-data.patch │ │ │ │ ├── getscancodes/ │ │ │ │ │ └── package.mk │ │ │ │ ├── hd-idle/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── hd-idle-makefile.patch │ │ │ │ ├── hddtemp/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ ├── hddtemp-0001-add-missing-default-Language-PO-header-field.patch │ │ │ │ │ └── hddtemp-0002-Allow-building-with-gettext-0-20.patch │ │ │ │ ├── hid_mapper/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ ├── hid_mapper-01_crosscompile.patch │ │ │ │ │ ├── hid_mapper-02_include-sys-time.patch │ │ │ │ │ └── hid_mapper-03_fix-parser.patch │ │ │ │ ├── htop/ │ │ │ │ │ └── package.mk │ │ │ │ ├── i2c-tools/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── pyinstalldir.patch │ │ │ │ ├── inotify-tools/ │ │ │ │ │ └── package.mk │ │ │ │ ├── jq/ │ │ │ │ │ └── package.mk │ │ │ │ ├── libgpiod/ │ │ │ │ │ └── package.mk │ │ │ │ ├── lm_sensors/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── lm_sensors-01_link-static.patch │ │ │ │ ├── lshw/ │ │ │ │ │ └── package.mk │ │ │ │ ├── mc/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── wrapper/ │ │ │ │ │ ├── mc │ │ │ │ │ ├── mcedit │ │ │ │ │ └── mcview │ │ │ │ ├── mmc-utils/ │ │ │ │ │ └── package.mk │ │ │ │ ├── mtpfs/ │ │ │ │ │ └── package.mk │ │ │ │ ├── nmon/ │ │ │ │ │ └── package.mk │ │ │ │ ├── patch/ │ │ │ │ │ └── package.mk │ │ │ │ ├── pv/ │ │ │ │ │ └── package.mk │ │ │ │ ├── screen/ │ │ │ │ │ └── package.mk │ │ │ │ ├── sdparm/ │ │ │ │ │ └── package.mk │ │ │ │ ├── smartmontools/ │ │ │ │ │ └── package.mk │ │ │ │ ├── st/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ ├── st-001-le_fixes.patch │ │ │ │ │ └── st-002-scrollback-20200419-72e3f6c.patch │ │ │ │ ├── stress-ng/ │ │ │ │ │ └── package.mk │ │ │ │ ├── unrar/ │ │ │ │ │ └── package.mk │ │ │ │ └── usb-modeswitch/ │ │ │ │ └── package.mk │ │ │ ├── tinc-depends/ │ │ │ │ └── miniupnpc/ │ │ │ │ └── package.mk │ │ │ ├── tntnet/ │ │ │ │ └── package.mk │ │ │ ├── tslib/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── tslib-02-add-additional-eGalax-touchscreens.patch │ │ │ │ ├── tslib-06-linear-print-coordinates.patch │ │ │ │ ├── tslib-10-ts_uinput_touch-daemon.patch │ │ │ │ ├── tslib-20-fbutils_fix_x64_execution.patch │ │ │ │ └── tslib-30-support-time-bits-64.patch │ │ │ ├── ttyd-depends/ │ │ │ │ ├── libuv/ │ │ │ │ │ └── package.mk │ │ │ │ └── libwebsockets/ │ │ │ │ └── package.mk │ │ │ ├── tvh-dtv-scan-tables/ │ │ │ │ └── package.mk │ │ │ ├── vdr/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── vdr-01-decrease-channels.conf-autosave-delay.patch │ │ │ │ └── vdr-02-disable-logspam.patch │ │ │ └── vdr-plugins/ │ │ │ ├── vdr-plugin-ddci2/ │ │ │ │ └── package.mk │ │ │ ├── vdr-plugin-dummydevice/ │ │ │ │ └── package.mk │ │ │ ├── vdr-plugin-dvbapi/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── vdr-plugin-dvbapi-01_crosscompiling.patch │ │ │ ├── vdr-plugin-eepg/ │ │ │ │ └── package.mk │ │ │ ├── vdr-plugin-epgfixer/ │ │ │ │ └── package.mk │ │ │ ├── vdr-plugin-epgsearch/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── vdr-plugin-epgsearch-02_don-t-build-unused-plugins.patch │ │ │ │ └── vdr-plugin-epgsearch-03-no_docs.patch │ │ │ ├── vdr-plugin-iptv/ │ │ │ │ └── package.mk │ │ │ ├── vdr-plugin-live/ │ │ │ │ └── package.mk │ │ │ ├── vdr-plugin-restfulapi/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── vdr-plugin-restfulapi-01-static-lib-order.patch │ │ │ │ └── vdr-plugin-restfulapi-02-webapp-path.patch │ │ │ ├── vdr-plugin-robotv/ │ │ │ │ └── package.mk │ │ │ ├── vdr-plugin-satip/ │ │ │ │ └── package.mk │ │ │ ├── vdr-plugin-streamdev/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── vdr-plugin-streamdev-01_4k_hevc_support.patch │ │ │ │ ├── vdr-plugin-streamdev-02_2.3.9_lock_fix.patch │ │ │ │ ├── vdr-plugin-streamdev-03_i18n.patch │ │ │ │ └── vdr-plugin-streamdev-04_fix_vdr_2.6.x_build_error.patch │ │ │ ├── vdr-plugin-vnsiserver/ │ │ │ │ └── package.mk │ │ │ ├── vdr-plugin-wirbelscan/ │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── vdr-plugin-wirbelscan-01-fixes.patch │ │ │ │ │ └── vdr-plugin-wirbelscan-02-countries_utf8.patch │ │ │ │ └── sources/ │ │ │ │ └── Makefile │ │ │ ├── vdr-plugin-wirbelscancontrol/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── vdr-plugin-wirbelscancontrol-02-vdr_2.3.patch │ │ │ └── vdr-plugin-xmltv2vdr/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── vdr-plugin-xmltv2vdr-02_gcc721_fixes.patch │ │ │ └── vdr-plugin-xmltv2vdr-03-fix-epgdata2xmltv-linking.patch │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── config/ │ │ │ │ │ ├── Xdefaults │ │ │ │ │ ├── pango.modules │ │ │ │ │ ├── pangorc │ │ │ │ │ └── pixbuf.loaders.cache │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ ├── chrome-downloader │ │ │ │ │ ├── chrome-start │ │ │ │ │ └── deb_extract_data │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ └── settings-default.xml │ │ │ └── chromium/ │ │ │ └── package.mk │ │ ├── driver/ │ │ │ ├── hdhomerun/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── config/ │ │ │ │ │ └── dvbhdhomerun.sample │ │ │ │ ├── package.mk │ │ │ │ ├── settings-default.xml │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── userspace-driver.sh │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── actions.py │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.xml │ │ │ │ │ ├── lib/ │ │ │ │ │ │ ├── functions.py │ │ │ │ │ │ └── xmlpp.py │ │ │ │ │ └── settings.xml │ │ │ │ └── sleep.d/ │ │ │ │ └── 99-hdhomerun.power │ │ │ ├── imon-mce/ │ │ │ │ └── package.mk │ │ │ ├── sapphire/ │ │ │ │ └── package.mk │ │ │ ├── steamcontroller/ │ │ │ │ └── package.mk │ │ │ └── sundtek-mediatv/ │ │ │ ├── changelog.txt │ │ │ ├── config/ │ │ │ │ ├── sundtek.conf │ │ │ │ └── sundtek.conf.full │ │ │ ├── package.mk │ │ │ ├── settings-default.xml │ │ │ └── source/ │ │ │ ├── bin/ │ │ │ │ ├── sundtek-mediatv.start │ │ │ │ ├── sundtek-mediatv.stop │ │ │ │ ├── sundtek-update-driver.sh │ │ │ │ └── userspace-driver.sh │ │ │ ├── default.py │ │ │ ├── resources/ │ │ │ │ ├── actions.py │ │ │ │ ├── language/ │ │ │ │ │ ├── resource.language.de_de/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── resource.language.en_gb/ │ │ │ │ │ └── strings.po │ │ │ │ ├── lib/ │ │ │ │ │ ├── functions.py │ │ │ │ │ └── xmlpp.py │ │ │ │ └── settings.xml │ │ │ ├── sleep.d/ │ │ │ │ └── 99-sundtek-mediatv.power │ │ │ └── system.d/ │ │ │ └── driver.dvb.sundtek-mediatv.service │ │ ├── libraries/ │ │ │ └── adafruit-libraries/ │ │ │ ├── changelog.txt │ │ │ ├── package.mk │ │ │ └── source/ │ │ │ └── default.py │ │ ├── repository/ │ │ │ └── repository.linuxserver.docker/ │ │ │ ├── changelog.txt │ │ │ ├── package.mk │ │ │ └── sources/ │ │ │ └── addon.xml │ │ ├── script/ │ │ │ ├── driverselect/ │ │ │ │ └── package.mk │ │ │ ├── luna/ │ │ │ │ └── package.mk │ │ │ ├── moonlight/ │ │ │ │ └── package.mk │ │ │ └── script.config.vdr/ │ │ │ ├── changelog.txt │ │ │ ├── package.mk │ │ │ └── sources/ │ │ │ └── addon.xml │ │ ├── service/ │ │ │ ├── bluetooth-audio/ │ │ │ │ ├── changelog.txt │ │ │ │ └── package.mk │ │ │ ├── boblightd/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── config/ │ │ │ │ │ ├── boblight.X11.sample │ │ │ │ │ └── boblight.conf │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── boblightd-2.0.5-getopt-includes.patch │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── boblightd.start │ │ │ │ ├── default.py │ │ │ │ ├── sleep.d/ │ │ │ │ │ └── boblightd.power │ │ │ │ └── system.d/ │ │ │ │ └── service.multimedia.boblightd.service │ │ │ ├── dispmanx_vnc/ │ │ │ │ └── package.mk │ │ │ ├── docker/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── docker-config │ │ │ │ ├── config/ │ │ │ │ │ └── docker.conf │ │ │ │ ├── default.py │ │ │ │ ├── examples/ │ │ │ │ │ ├── couchpotato.service │ │ │ │ │ ├── mysql.service │ │ │ │ │ ├── sabnzbd.service │ │ │ │ │ ├── sickbeard.service │ │ │ │ │ ├── transmission.service │ │ │ │ │ └── var-lib-docker.mount │ │ │ │ ├── lib/ │ │ │ │ │ └── dockermon.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ └── system.d/ │ │ │ │ └── service.system.docker.service │ │ │ ├── emby/ │ │ │ │ └── package.mk │ │ │ ├── emby4/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── emby4.start │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ └── system.d/ │ │ │ │ └── service.emby4.service │ │ │ ├── hyperion/ │ │ │ │ ├── changelog.txt │ │ │ │ └── package.mk │ │ │ ├── inadyn/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── inadyn-service │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ └── system.d/ │ │ │ │ └── service.system.inadyn.service │ │ │ ├── jellyfin/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ ├── jellyfin-downloader │ │ │ │ │ └── jellyfin-start │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ └── system.d/ │ │ │ │ └── service.jellyfin.service │ │ │ ├── lcdd/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── lcdd-0.5.6-dm140_henlar_v0.2.patch │ │ │ │ │ └── lcdd-0.5.6-libftdi1.patch │ │ │ │ ├── resources/ │ │ │ │ │ └── settings.xml │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── lcdd.start │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ └── language/ │ │ │ │ │ └── English/ │ │ │ │ │ └── strings.po │ │ │ │ └── system.d/ │ │ │ │ └── service.lcdd.service │ │ │ ├── librespot/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── onevent.py │ │ │ │ ├── default.py │ │ │ │ └── resources/ │ │ │ │ ├── language/ │ │ │ │ │ └── English/ │ │ │ │ │ └── strings.po │ │ │ │ ├── lib/ │ │ │ │ │ ├── external_player.py │ │ │ │ │ ├── internal_player.py │ │ │ │ │ ├── librespot.py │ │ │ │ │ ├── librespot_alsa.py │ │ │ │ │ ├── librespot_pulseaudio_rtp.py │ │ │ │ │ ├── player.py │ │ │ │ │ └── service.py │ │ │ │ └── settings.xml │ │ │ ├── locale/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ ├── resources/ │ │ │ │ │ └── settings.xml │ │ │ │ └── source/ │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ └── language/ │ │ │ │ │ └── resource.language.en_gb/ │ │ │ │ │ └── strings.po │ │ │ │ └── settings-default.xml │ │ │ ├── mariadb/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── mariadb-0001-disable-plugin-auth-pam.patch │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ ├── mariadb.start │ │ │ │ │ └── mariadb.stop │ │ │ │ ├── config/ │ │ │ │ │ └── my.cnf │ │ │ │ ├── default.py │ │ │ │ ├── profile.d/ │ │ │ │ │ └── 99-mysql-histfile.profile │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ └── system.d/ │ │ │ │ └── service.mariadb.service │ │ │ ├── minidlna/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── minidlna-01-fix-config.patch │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── minidlna.start │ │ │ │ ├── config/ │ │ │ │ │ └── minidlna.conf │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ ├── sleep.d/ │ │ │ │ │ └── minidlna.power │ │ │ │ └── system.d/ │ │ │ │ └── service.minidlna.service │ │ │ ├── minisatip/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── minisatip.start │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ ├── sleep.d/ │ │ │ │ │ └── minisatip.power │ │ │ │ └── system.d/ │ │ │ │ └── service.minisatip.service │ │ │ ├── mpd/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── mpd.start │ │ │ │ ├── config/ │ │ │ │ │ └── mpd.conf │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ ├── sleep.d/ │ │ │ │ │ └── mpd.power │ │ │ │ └── system.d/ │ │ │ │ └── service.multimedia.mpd.service │ │ │ ├── net-snmp/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── net-snmp-0001-read_config.c.patch │ │ │ │ │ └── net-snmp-0002-net-snmp-create-v3-user.in.patch │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ ├── snmpd.start │ │ │ │ │ └── snmpd.stop │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ └── system.d/ │ │ │ │ └── service.net-snmp.service │ │ │ ├── nextpvr/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── addon.py │ │ │ │ ├── bin/ │ │ │ │ │ ├── nextpvr-downloader │ │ │ │ │ └── nextpvr.start │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── Language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ └── system.d/ │ │ │ │ └── service.nextpvr.service │ │ │ ├── oscam/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── oscam-01-revision.patch │ │ │ │ │ ├── oscam-02-link-with-ludev.patch │ │ │ │ │ └── oscam-03-pcsc-pthread.patch │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── oscam.start │ │ │ │ ├── default.py │ │ │ │ ├── oscam-default.conf │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ ├── sleep.d/ │ │ │ │ │ └── oscam.power │ │ │ │ └── system.d/ │ │ │ │ └── service.softcam.oscam.service │ │ │ ├── pcscd/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── config/ │ │ │ │ │ └── reader.conf │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── pcscd.start │ │ │ │ ├── default.py │ │ │ │ └── system.d/ │ │ │ │ └── service.pcscd.service │ │ │ ├── proftpd/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── proftpd-100-llu.patch │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── proftpd.start │ │ │ │ ├── default.py │ │ │ │ ├── etc/ │ │ │ │ │ ├── openssl.cnf │ │ │ │ │ └── proftpd.conf │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── resource.language.en_gb/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ └── system.d/ │ │ │ │ └── service.proftpd.service │ │ │ ├── prometheus-node-exporter/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── prometheus-node-exporter.start │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ └── system.d/ │ │ │ │ └── service.prometheus-node-exporter.service │ │ │ ├── rsyslog/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── rsyslog.init │ │ │ │ ├── config/ │ │ │ │ │ ├── common.conf │ │ │ │ │ ├── journal.conf │ │ │ │ │ ├── kodi.conf │ │ │ │ │ └── relp.conf │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ └── system.d/ │ │ │ │ └── service.rsyslog.service │ │ │ ├── snapclient/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── addon.py │ │ │ │ ├── bin/ │ │ │ │ │ └── snapclient.start │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ └── system.d/ │ │ │ │ └── service.snapclient.service │ │ │ ├── snapserver/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ ├── snapweb/ │ │ │ │ │ ├── 3rd-party/ │ │ │ │ │ │ └── libflac.js │ │ │ │ │ ├── config.js │ │ │ │ │ ├── index.html │ │ │ │ │ ├── manifest.json │ │ │ │ │ ├── snapcontrol.js │ │ │ │ │ ├── snapstream.js │ │ │ │ │ └── styles.css │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── snapserver.start │ │ │ │ ├── config/ │ │ │ │ │ └── pulseaudio.conf │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ └── system.d/ │ │ │ │ └── service.snapserver.service │ │ │ ├── syncthing/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── syncthing-service │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ └── system.d/ │ │ │ │ └── service.system.syncthing.service │ │ │ ├── tigervnc/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── tigervnc-system-notests.patch │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── tigervnc.start │ │ │ │ ├── config/ │ │ │ │ │ └── passwd │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ └── system.d/ │ │ │ │ └── service.tigervnc.service │ │ │ ├── tinc/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── tinc-0001-fix-autoconf-archive.patch │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── tinc.start │ │ │ │ ├── config/ │ │ │ │ │ ├── subnet-down │ │ │ │ │ ├── subnet-up │ │ │ │ │ ├── tinc-up │ │ │ │ │ └── tinc.conf │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ └── system.d/ │ │ │ │ └── service.system.tinc.service │ │ │ ├── touchscreen/ │ │ │ │ ├── addon.xml │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ ├── ts_calibrate.sh │ │ │ │ │ ├── ts_env.sh │ │ │ │ │ └── ts_uinput_touch.sh │ │ │ │ ├── calibrate.py │ │ │ │ ├── config/ │ │ │ │ │ ├── ts.conf-generic │ │ │ │ │ ├── ts.conf-udoo_15_6 │ │ │ │ │ ├── ts.conf-udoo_7 │ │ │ │ │ ├── ts.conf-waveshare │ │ │ │ │ ├── ts_env.sh-sample │ │ │ │ │ └── ts_env.sh-waveshare │ │ │ │ ├── lock-screen.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ ├── English/ │ │ │ │ │ │ │ └── strings.xml │ │ │ │ │ │ └── German/ │ │ │ │ │ │ └── strings.xml │ │ │ │ │ └── settings.xml │ │ │ │ ├── service.py │ │ │ │ └── system.d/ │ │ │ │ └── service.touchscreen.service │ │ │ ├── ttyd/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── ttyd.start │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ └── system.d/ │ │ │ │ └── service.ttyd.service │ │ │ ├── tvheadend/ │ │ │ │ └── package.mk │ │ │ ├── tvheadend42/ │ │ │ │ ├── addon.xml │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── tvheadend42-01-dvb-scan-path.patch │ │ │ │ │ ├── tvheadend42-02-hdhomerun-includes.patch │ │ │ │ │ ├── tvheadend42-03-hdhomerun-fix.patch │ │ │ │ │ ├── tvheadend42-04-Fix-building-with-fno-common.patch │ │ │ │ │ ├── tvheadend42-05-webui-query-url-fix.patch │ │ │ │ │ └── tvheadend42-06-satip-upnp-fix.patch │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ ├── tv_grab_file │ │ │ │ │ └── tvheadend42.start │ │ │ │ ├── default.py │ │ │ │ ├── defaults/ │ │ │ │ │ ├── comskip/ │ │ │ │ │ │ └── comskip.ini │ │ │ │ │ ├── config │ │ │ │ │ ├── dvr/ │ │ │ │ │ │ └── config/ │ │ │ │ │ │ └── 8d0f5b7ae354d956d7fe5db25f5d0d24 │ │ │ │ │ ├── epggrab/ │ │ │ │ │ │ └── config │ │ │ │ │ ├── timeshift/ │ │ │ │ │ │ └── config │ │ │ │ │ └── xmltv/ │ │ │ │ │ └── config │ │ │ │ ├── download.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ ├── sleep.d/ │ │ │ │ │ └── tvheadend.power │ │ │ │ └── system.d/ │ │ │ │ └── service.tvheadend42.service │ │ │ ├── tvheadend43/ │ │ │ │ ├── addon.xml │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── tvheadend43-01-dvb-scan-path.patch │ │ │ │ │ └── tvheadend43-02-hdhomerun-includes.patch │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ ├── tv_grab_file │ │ │ │ │ └── tvheadend43.start │ │ │ │ ├── default.py │ │ │ │ ├── defaults/ │ │ │ │ │ ├── comskip/ │ │ │ │ │ │ └── comskip.ini │ │ │ │ │ ├── config │ │ │ │ │ ├── dvr/ │ │ │ │ │ │ └── config/ │ │ │ │ │ │ └── 8d0f5b7ae354d956d7fe5db25f5d0d24 │ │ │ │ │ ├── epggrab/ │ │ │ │ │ │ └── config │ │ │ │ │ ├── timeshift/ │ │ │ │ │ │ └── config │ │ │ │ │ └── xmltv/ │ │ │ │ │ └── config │ │ │ │ ├── download.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ ├── sleep.d/ │ │ │ │ │ └── tvheadend.power │ │ │ │ └── system.d/ │ │ │ │ └── service.tvheadend43.service │ │ │ ├── tvmosaic/ │ │ │ │ └── package.mk │ │ │ ├── usbmuxd/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── usbmuxd-0001-remove-duplicate-functions.patch │ │ │ │ └── source/ │ │ │ │ ├── default.py │ │ │ │ └── system.d/ │ │ │ │ └── service.usbmuxd.service │ │ │ ├── vdr-addon/ │ │ │ │ ├── changelog.txt │ │ │ │ ├── package.mk │ │ │ │ └── source/ │ │ │ │ ├── bin/ │ │ │ │ │ └── vdr.start │ │ │ │ ├── default.py │ │ │ │ ├── resources/ │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── English/ │ │ │ │ │ │ └── strings.po │ │ │ │ │ └── settings.xml │ │ │ │ ├── settings-default.xml │ │ │ │ ├── sleep.d/ │ │ │ │ │ └── vdr.power │ │ │ │ └── system.d/ │ │ │ │ └── service.multimedia.vdr-addon.service │ │ │ └── webgrabplus/ │ │ │ └── package.mk │ │ ├── skin/ │ │ │ └── estouchy/ │ │ │ └── package.mk │ │ └── tools/ │ │ ├── btrfs-progs/ │ │ │ ├── changelog.txt │ │ │ ├── package.mk │ │ │ └── source/ │ │ │ └── default.py │ │ ├── dotnet-runtime/ │ │ │ ├── changelog.txt │ │ │ └── package.mk │ │ ├── dvb-tools/ │ │ │ ├── changelog.txt │ │ │ ├── package.mk │ │ │ └── source/ │ │ │ └── default.py │ │ ├── ffmpeg-tools/ │ │ │ ├── changelog.txt │ │ │ ├── package.mk │ │ │ └── source/ │ │ │ ├── default.py │ │ │ └── resources/ │ │ │ └── language/ │ │ │ └── English/ │ │ │ └── strings.po │ │ ├── flirc_util/ │ │ │ ├── changelog.txt │ │ │ ├── package.mk │ │ │ └── source/ │ │ │ └── default.py │ │ ├── game-tools/ │ │ │ ├── changelog.txt │ │ │ ├── package.mk │ │ │ └── source/ │ │ │ └── default.py │ │ ├── jre.zulu/ │ │ │ ├── changelog.txt │ │ │ ├── package.mk │ │ │ ├── profile.d/ │ │ │ │ └── jre.profile │ │ │ └── source/ │ │ │ └── default.py │ │ ├── mono/ │ │ │ └── package.mk │ │ ├── multimedia-tools/ │ │ │ ├── changelog.txt │ │ │ ├── package.mk │ │ │ └── source/ │ │ │ └── default.py │ │ ├── network-tools/ │ │ │ ├── changelog.txt │ │ │ ├── package.mk │ │ │ └── source/ │ │ │ └── default.py │ │ ├── rpi-tools/ │ │ │ ├── changelog.txt │ │ │ ├── package.mk │ │ │ └── source/ │ │ │ └── default.py │ │ └── system-tools/ │ │ ├── changelog.txt │ │ ├── package.mk │ │ └── source/ │ │ ├── bin/ │ │ │ ├── 7z │ │ │ └── 7za │ │ └── default.py │ ├── audio/ │ │ ├── alsa-lib/ │ │ │ ├── config/ │ │ │ │ └── modprobe.d/ │ │ │ │ └── disable-spdif-for-hd-audio.conf │ │ │ ├── modprobe.d/ │ │ │ │ ├── alsa-base.conf │ │ │ │ └── intel-audio.conf │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── alsa-lib-asound.conf_configdir.patch │ │ ├── alsa-topology-conf/ │ │ │ └── package.mk │ │ ├── alsa-ucm-conf/ │ │ │ └── package.mk │ │ ├── alsa-utils/ │ │ │ ├── package.mk │ │ │ ├── scripts/ │ │ │ │ └── soundconfig │ │ │ └── udev.d/ │ │ │ └── 90-alsa-restore.rules │ │ ├── espeak-ng/ │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ └── PR1858-fix-compiling-in-build-directory.patch │ │ │ └── pcaudiolib/ │ │ │ └── package.mk │ │ ├── flac/ │ │ │ └── package.mk │ │ ├── fluidsynth/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── libsndfile-use-static-libraries.patch │ │ ├── lame/ │ │ │ └── package.mk │ │ ├── ldacBT/ │ │ │ └── package.mk │ │ ├── libcdio/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── 0001-Use-getmntent-setmntent-for-reading-mounts.patch │ │ ├── libfreeaptx/ │ │ │ └── package.mk │ │ ├── libldac/ │ │ │ └── package.mk │ │ ├── libmodplug/ │ │ │ └── package.mk │ │ ├── libogg/ │ │ │ └── package.mk │ │ ├── libopenmpt/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── libopenmpt-add-libvorbisfile-to-pkgconfig.patch │ │ ├── libsamplerate/ │ │ │ └── package.mk │ │ ├── libsndfile/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── libsndfile-add-required-static-libaries-to-pkg-config.patch │ │ ├── libvorbis/ │ │ │ └── package.mk │ │ ├── openal-soft/ │ │ │ └── package.mk │ │ ├── pipewire/ │ │ │ └── package.mk │ │ ├── pulseaudio/ │ │ │ ├── config/ │ │ │ │ ├── pulse-daemon.conf.d/ │ │ │ │ │ └── README │ │ │ │ └── system.pa │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ ├── pulseaudio-100.01-never-append-dirty-to-server-module-version.patch │ │ │ │ └── pulseaudio-100.02-check_uid.patch │ │ │ ├── profile.d/ │ │ │ │ └── 99-pulseaudio.conf │ │ │ └── system.d/ │ │ │ └── pulseaudio.service │ │ ├── rpi-cirrus-config/ │ │ │ ├── config/ │ │ │ │ └── rpi-cirrus-config.sh.sample │ │ │ ├── modprobe.d/ │ │ │ │ └── rpi-cirrus.conf │ │ │ ├── package.mk │ │ │ ├── scripts/ │ │ │ │ └── rpi-cirrus-config │ │ │ └── udev.d/ │ │ │ └── 90-alsa-restore.rules │ │ ├── sbc/ │ │ │ └── package.mk │ │ ├── sidplay-libs/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── sidplay-libs-01-m4-tests.patch │ │ │ ├── sidplay-libs-02-inherited.patch │ │ │ ├── sidplay-libs-03-operator.patch │ │ │ └── sidplay-libs-04-includes.patch │ │ ├── soxr/ │ │ │ └── package.mk │ │ ├── speex/ │ │ │ └── package.mk │ │ ├── speexdsp/ │ │ │ └── package.mk │ │ ├── taglib/ │ │ │ └── package.mk │ │ ├── wavpack/ │ │ │ └── package.mk │ │ └── wireplumber/ │ │ └── package.mk │ ├── compress/ │ │ ├── 7-zip/ │ │ │ └── package.mk │ │ ├── bzip2/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── bzip2-1.0.8-cflags.patch │ │ ├── libarchive/ │ │ │ └── package.mk │ │ ├── lz4/ │ │ │ └── package.mk │ │ ├── lzo/ │ │ │ └── package.mk │ │ ├── p7zip/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── p7zip-0100-CVE-2016-9296.patch │ │ │ ├── p7zip-0200-CVE-2017-17969.patch │ │ │ ├── p7zip-0300-CVE-2018-5996.patch │ │ │ ├── p7zip-0400-CVE-2018-10115.patch │ │ │ ├── p7zip-0500-gcc10-build-fix.patch │ │ │ └── p7zip-0501-change-numMethods-from-bool-to-unsigned.patch │ │ ├── pigz/ │ │ │ └── package.mk │ │ ├── xz/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── xz-01-init-uninitialized-variables.patch │ │ ├── zip/ │ │ │ └── package.mk │ │ ├── zlib/ │ │ │ └── package.mk │ │ └── zstd/ │ │ └── package.mk │ ├── databases/ │ │ ├── mariadb-connector-c/ │ │ │ └── package.mk │ │ └── sqlite/ │ │ ├── package.mk │ │ └── patches/ │ │ └── sqlite-01_map_populate.patch │ ├── debug/ │ │ ├── edid-decode/ │ │ │ └── package.mk │ │ ├── gdb/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── 0001-gdbserver-ctrl-c-handling.patch │ │ │ └── gdb-001-notex.patch │ │ ├── libunwind/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── libunwind-0001-fix-multiple-definition.patch │ │ │ └── libunwind-0002-add-dependant-static-libraries.patch │ │ ├── libva-utils/ │ │ │ └── package.mk │ │ ├── memtester/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── memtester-001-cross-compile.patch │ │ ├── strace/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── strace-0001-autoreconf.patch │ │ │ └── strace-0002-fix-autoconf-archive.patch │ │ ├── vadumpcaps/ │ │ │ └── package.mk │ │ ├── valgrind/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── valgrind-0001-enable-armv8.patch │ │ ├── vdpauinfo/ │ │ │ └── package.mk │ │ └── xorg-intel-gpu-tools/ │ │ └── package.mk │ ├── devel/ │ │ ├── arm-mem/ │ │ │ └── package.mk │ │ ├── asn1c/ │ │ │ └── package.mk │ │ ├── attr/ │ │ │ └── package.mk │ │ ├── autoconf/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── autoconf-autoreconf-exclude.patch │ │ │ └── man-exclude.patch │ │ ├── autoconf-archive/ │ │ │ └── package.mk │ │ ├── automake/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── automake-01-fix-help2man.patch │ │ ├── binutils/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── binutils-01-warn-for-uses-of-system-directories-when-link.patch │ │ │ └── binutils-02-binutils-2-39-dont-error-on-missing-makeinfo.patch │ │ ├── binutils-aarch64/ │ │ │ └── package.mk │ │ ├── binutils-arm-none-eabi/ │ │ │ └── package.mk │ │ ├── binutils-bpf/ │ │ │ └── package.mk │ │ ├── binutils-or1k/ │ │ │ └── package.mk │ │ ├── bison/ │ │ │ └── package.mk │ │ ├── boost/ │ │ │ └── package.mk │ │ ├── ccache/ │ │ │ └── package.mk │ │ ├── cmake/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── cmake-001-disable-free-comp-methods.patch │ │ ├── configtools/ │ │ │ └── package.mk │ │ ├── crossguid/ │ │ │ └── package.mk │ │ ├── dbus-glib/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── dbus-glib-01-dont-build-tools-examples.patch │ │ ├── elfutils/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── elfutils-001-make-executables-optional.patch │ │ ├── fakeroot/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── fakeroot-001-disable-docs-tests.patch │ │ ├── flatbuffers/ │ │ │ └── package.mk │ │ ├── flex/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── c5a26b17a2b091c560f6c4e6703e55f496bf74fa.patch │ │ │ └── flex-002-nocrap.patch │ │ ├── fribidi/ │ │ │ ├── package.mk │ │ │ └── scripts/ │ │ │ └── fribidi-config │ │ ├── gettext/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── gettext-0.18.2-non_interactive.patch │ │ │ └── gettext-dont_build_docs_and_examples.patch │ │ ├── glib/ │ │ │ └── package.mk │ │ ├── glibc/ │ │ │ ├── config/ │ │ │ │ ├── gai.conf │ │ │ │ ├── host.conf │ │ │ │ ├── nsswitch-init.conf │ │ │ │ └── nsswitch-target.conf │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── arm/ │ │ │ │ ├── 0001-Revert-Linux-statx-syscall-number-is-always-availabl.patch │ │ │ │ ├── 0002-Linux-arm-fixup-statx-syscall-number-missing.patch │ │ │ │ └── 0003-arm-disable-__NR_statx-as-it-s-not-available-in-4.9.patch │ │ │ ├── glibc-fix-dns-with-broken-routers.patch │ │ │ ├── glibc-ld.so.cache-to-writable-cache.patch │ │ │ └── widevine-arm/ │ │ │ ├── glibc-HACK-Don-t-check-GLIBC_ABI_DT_RELR-support-for-Chrom.patch │ │ │ └── glibc-tls-libwidevinecdm.so-since-4.10.2252.0-has-TLS-with.patch │ │ ├── gmp/ │ │ │ └── package.mk │ │ ├── gnulib/ │ │ │ └── package.mk │ │ ├── gobject-introspection/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── gobject-introspection-0004-fix-7568.patch │ │ ├── gperftools/ │ │ │ └── package.mk │ │ ├── heimdal/ │ │ │ └── package.mk │ │ ├── intltool/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── intltool-0001-fix-regex-expressions.patch │ │ ├── json-c/ │ │ │ └── package.mk │ │ ├── json-glib/ │ │ │ └── package.mk │ │ ├── libaio/ │ │ │ └── package.mk │ │ ├── libbpf/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── libbpf-fix-crosscompile-and-sysroot.patch │ │ ├── libcap/ │ │ │ └── package.mk │ │ ├── libcec/ │ │ │ └── package.mk │ │ ├── libdaemon/ │ │ │ └── package.mk │ │ ├── libevent/ │ │ │ └── package.mk │ │ ├── libffi/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── libffi-Fix-installation-location-of-libffi.patch │ │ │ └── libffi-fix-pkgconf.patch │ │ ├── libfmt/ │ │ │ └── package.mk │ │ ├── libfstrcmp/ │ │ │ └── package.mk │ │ ├── libftdi1/ │ │ │ └── package.mk │ │ ├── libirman/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── libirman-0001-fix-poll-include.patch │ │ ├── libplist/ │ │ │ └── package.mk │ │ ├── libpthread-stubs/ │ │ │ └── package.mk │ │ ├── libtool/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── libtool-01_dont_relink_against_host.patch │ │ │ ├── libtool-02-use_ld.patch │ │ │ └── libtool-03-remove-help2man-dependency.patch │ │ ├── m4/ │ │ │ └── package.mk │ │ ├── make/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── make-02-fix-large-command-line-on-POSIX-systems.patch │ │ ├── mimalloc/ │ │ │ └── package.mk │ │ ├── mold/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── mold-999.01-PR740-allow-custom-mold-binary-install-path.patch │ │ ├── mpc/ │ │ │ └── package.mk │ │ ├── mpfr/ │ │ │ └── package.mk │ │ ├── ncurses/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── ncurses-001-terminfo-xterm.patch │ │ │ ├── ncurses-002-alloc-fallbacks.patch │ │ │ ├── ncurses-003-fix_hints.patch │ │ │ └── ncurses-004-fix_configure_pkgconfig.patch │ │ ├── pcre/ │ │ │ └── package.mk │ │ ├── pcre2/ │ │ │ └── package.mk │ │ ├── pkg-config/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── 0001-Add-support-for-multiple-sysroots.patch │ │ ├── popt/ │ │ │ └── package.mk │ │ ├── rapidjson/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── rapidjson-0001-remove_custom_cxx_flags.patch │ │ ├── readline/ │ │ │ └── package.mk │ │ ├── shared-mime-info/ │ │ │ └── package.mk │ │ ├── slang/ │ │ │ └── package.mk │ │ ├── spdlog/ │ │ │ └── package.mk │ │ ├── swig/ │ │ │ └── package.mk │ │ ├── tbb/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── tbb-999.01-PR824-retry-if-pthread_create-fails-with-EAGAIN.patch │ │ ├── xxd/ │ │ │ └── package.mk │ │ └── yajl/ │ │ └── package.mk │ ├── emulation/ │ │ ├── cyclone68000/ │ │ │ └── package.mk │ │ ├── libretro-2048/ │ │ │ └── package.mk │ │ ├── libretro-atari800/ │ │ │ └── package.mk │ │ ├── libretro-beetle-bsnes/ │ │ │ └── package.mk │ │ ├── libretro-beetle-gba/ │ │ │ └── package.mk │ │ ├── libretro-beetle-lynx/ │ │ │ └── package.mk │ │ ├── libretro-beetle-ngp/ │ │ │ └── package.mk │ │ ├── libretro-beetle-pce-fast/ │ │ │ └── package.mk │ │ ├── libretro-beetle-pcfx/ │ │ │ └── package.mk │ │ ├── libretro-beetle-psx/ │ │ │ └── package.mk │ │ ├── libretro-beetle-supergrafx/ │ │ │ └── package.mk │ │ ├── libretro-beetle-vb/ │ │ │ └── package.mk │ │ ├── libretro-beetle-wswan/ │ │ │ └── package.mk │ │ ├── libretro-bluemsx/ │ │ │ └── package.mk │ │ ├── libretro-bnes/ │ │ │ └── package.mk │ │ ├── libretro-bsnes-mercury-accuracy/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── libretro-bsnes-mercury-accuracy-0001_fix-cross-compile.patch │ │ ├── libretro-bsnes-mercury-balanced/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── libretro-bsnes-mercury-balanced-0001_fix-cross-compile.patch │ │ ├── libretro-bsnes-mercury-performance/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── libretro-bsnes-mercury-performance-0001_fix-cross-compile.patch │ │ ├── libretro-cap32/ │ │ │ └── package.mk │ │ ├── libretro-common/ │ │ │ └── package.mk │ │ ├── libretro-dinothawr/ │ │ │ └── package.mk │ │ ├── libretro-dosbox/ │ │ │ └── package.mk │ │ ├── libretro-dosbox-pure/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── libretro-dosbox-pure-001-cross-compile-fix.patch │ │ ├── libretro-fbneo/ │ │ │ └── package.mk │ │ ├── libretro-fceumm/ │ │ │ └── package.mk │ │ ├── libretro-fmsx/ │ │ │ └── package.mk │ │ ├── libretro-fsuae/ │ │ │ └── package.mk │ │ ├── libretro-fuse/ │ │ │ └── package.mk │ │ ├── libretro-gambatte/ │ │ │ └── package.mk │ │ ├── libretro-genplus/ │ │ │ └── package.mk │ │ ├── libretro-gw/ │ │ │ └── package.mk │ │ ├── libretro-handy/ │ │ │ └── package.mk │ │ ├── libretro-hatari/ │ │ │ └── package.mk │ │ ├── libretro-mame2000/ │ │ │ └── package.mk │ │ ├── libretro-mame2003/ │ │ │ └── package.mk │ │ ├── libretro-mame2003_plus/ │ │ │ └── package.mk │ │ ├── libretro-mame2010/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── libretro-mame2010-0001_fix-cross-build.patch │ │ ├── libretro-mame2015/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── libretro-mame2015-100.01-cross-compile.patch │ │ │ └── libretro-mame2015-100.02-python-3.patch │ │ ├── libretro-mame2016/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── bgfx.patch │ │ │ ├── build.patch │ │ │ ├── genie.patch │ │ │ ├── pregenerate.patch │ │ │ └── python3.patch │ │ ├── libretro-mesen/ │ │ │ └── package.mk │ │ ├── libretro-meteor/ │ │ │ └── package.mk │ │ ├── libretro-mgba/ │ │ │ └── package.mk │ │ ├── libretro-mrboom/ │ │ │ └── package.mk │ │ ├── libretro-nestopia/ │ │ │ └── package.mk │ │ ├── libretro-nx/ │ │ │ └── package.mk │ │ ├── libretro-o2em/ │ │ │ └── package.mk │ │ ├── libretro-opera/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── libretro-opera-995.01-crosscompile.patch │ │ ├── libretro-pcsx-rearmed/ │ │ │ └── package.mk │ │ ├── libretro-picodrive/ │ │ │ └── package.mk │ │ ├── libretro-pokemini/ │ │ │ └── package.mk │ │ ├── libretro-prboom/ │ │ │ └── package.mk │ │ ├── libretro-prosystem/ │ │ │ └── package.mk │ │ ├── libretro-quicknes/ │ │ │ └── package.mk │ │ ├── libretro-sameboy/ │ │ │ └── package.mk │ │ ├── libretro-scummvm/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── 0001-libretro-Move-scummvm.ini-to-writable-save-directory.patch │ │ ├── libretro-snes9x/ │ │ │ └── package.mk │ │ ├── libretro-snes9x2002/ │ │ │ └── package.mk │ │ ├── libretro-snes9x2010/ │ │ │ └── package.mk │ │ ├── libretro-stella/ │ │ │ └── package.mk │ │ ├── libretro-tgbdual/ │ │ │ └── package.mk │ │ ├── libretro-tyrquake/ │ │ │ └── package.mk │ │ ├── libretro-uae/ │ │ │ └── package.mk │ │ ├── libretro-uae4arm/ │ │ │ └── package.mk │ │ ├── libretro-vba-next/ │ │ │ └── package.mk │ │ ├── libretro-vbam/ │ │ │ └── package.mk │ │ ├── libretro-vecx/ │ │ │ └── package.mk │ │ ├── libretro-vice/ │ │ │ └── package.mk │ │ ├── libretro-vircon32/ │ │ │ └── package.mk │ │ ├── libretro-virtualjaguar/ │ │ │ └── package.mk │ │ ├── libretro-yabause/ │ │ │ └── package.mk │ │ └── rcheevos/ │ │ ├── package.mk │ │ └── source/ │ │ └── CMakeLists.txt │ ├── graphics/ │ │ ├── assimp/ │ │ │ └── package.mk │ │ ├── bcm2835-driver/ │ │ │ └── package.mk │ │ ├── cairo/ │ │ │ └── package.mk │ │ ├── ftgl/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── ftgl-01-cmake.patch │ │ │ └── ftgl-01-ftgl-disable-docs.patch │ │ ├── gdk-pixbuf/ │ │ │ └── package.mk │ │ ├── giflib/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── giflib-01-static-lib.patch │ │ ├── glew/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── glew-01-fix-pkgconf.patch │ │ ├── glm/ │ │ │ ├── config/ │ │ │ │ ├── glm.pc │ │ │ │ ├── glmConfig.cmake │ │ │ │ ├── glmConfigVersion.cmake │ │ │ │ └── glmTargets.cmake │ │ │ └── package.mk │ │ ├── glmark2/ │ │ │ └── package.mk │ │ ├── glu/ │ │ │ └── package.mk │ │ ├── harfbuzz/ │ │ │ └── package.mk │ │ ├── jasper/ │ │ │ └── package.mk │ │ ├── kmscube/ │ │ │ └── package.mk │ │ ├── kmsxx/ │ │ │ └── package.mk │ │ ├── lcms2/ │ │ │ └── package.mk │ │ ├── libde265/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── libde265-0002-Add-CMake-option-ENABLE-ENCODER.patch │ │ ├── libdrm/ │ │ │ └── package.mk │ │ ├── libepoxy/ │ │ │ └── package.mk │ │ ├── libglvnd/ │ │ │ └── package.mk │ │ ├── libheif/ │ │ │ └── package.mk │ │ ├── libjpeg-turbo/ │ │ │ └── package.mk │ │ ├── libmali/ │ │ │ ├── package.mk │ │ │ ├── scripts/ │ │ │ │ └── libmali-setup │ │ │ └── system.d/ │ │ │ └── libmali-setup.service │ │ ├── libpng/ │ │ │ └── package.mk │ │ ├── libprojectM/ │ │ │ └── package.mk │ │ ├── libraw/ │ │ │ └── package.mk │ │ ├── libspng/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── libspng-0001-implement-BGRA8-for-framebuffer.patch │ │ ├── libwebp/ │ │ │ └── package.mk │ │ ├── mesa/ │ │ │ └── package.mk │ │ ├── nvidia/ │ │ │ ├── modprobe.d/ │ │ │ │ └── nvidia-modesetting.conf │ │ │ └── package.mk │ │ ├── pango/ │ │ │ ├── config/ │ │ │ │ ├── pango.modules │ │ │ │ └── pangorc │ │ │ └── package.mk │ │ ├── tiff/ │ │ │ └── package.mk │ │ └── vulkan/ │ │ ├── glslang/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── glslang-100.01-build-static-spirv-tools.patch │ │ ├── spirv-headers/ │ │ │ └── package.mk │ │ ├── spirv-tools/ │ │ │ └── package.mk │ │ ├── vkmark/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── vkmark-999.01-PR47-drop-the-vkCreateDmaBufImageINTEL-extension.patch │ │ ├── vulkan-headers/ │ │ │ └── package.mk │ │ ├── vulkan-loader/ │ │ │ └── package.mk │ │ └── vulkan-tools/ │ │ ├── package.mk │ │ └── patches/ │ │ ├── vulkan-tools-995.01-cmakelists-opts.patch │ │ └── vulkan-tools-995.04-fix-glslangValidator-logik.patch │ ├── lang/ │ │ ├── Python3/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── 0001-Make-the-build-of-pyc-files-conditional.patch │ │ │ ├── 0002-Disable-buggy_getaddrinfo-configure-test-when-cross-.patch │ │ │ ├── 0003-Add-infrastructure-to-disable-the-build-of-certain-e.patch │ │ │ ├── 0004-Adjust-library-header-paths-for-cross-compilation.patch │ │ │ ├── 0005-Don-t-look-in-usr-lib-termcap-for-libraries.patch │ │ │ ├── 0006-Don-t-add-multiarch-paths.patch │ │ │ ├── 0007-Abort-on-failed-module-build.patch │ │ │ ├── 0008-Serial-ioctl-workaround.patch │ │ │ ├── 0009-Do-not-adjust-the-shebang-of-Python-scripts-for-cros.patch │ │ │ ├── 0010-Misc-python-config.sh.in-ensure-sed-invocations-only.patch │ │ │ ├── 0011-Add-an-option-to-disable-pydoc.patch │ │ │ ├── 0012-Add-an-option-to-disable-lib2to3.patch │ │ │ ├── 0013-Add-option-to-disable-the-sqlite3-module.patch │ │ │ ├── 0014-Add-an-option-to-disable-the-tk-module.patch │ │ │ ├── 0015-Add-an-option-to-disable-the-curses-module.patch │ │ │ ├── 0016-Add-an-option-to-disable-expat.patch │ │ │ ├── 0017-Add-an-option-to-disable-CJK-codecs.patch │ │ │ ├── 0018-Add-an-option-to-disable-NIS.patch │ │ │ ├── 0019-Add-an-option-to-disable-unicodedata.patch │ │ │ ├── 0020-Add-an-option-to-disable-IDLE.patch │ │ │ ├── 0021-Add-an-option-to-disable-decimal.patch │ │ │ ├── 0022-Add-an-option-to-disable-the-ossaudiodev-module.patch │ │ │ ├── 0023-Add-an-option-to-disable-openssl-support.patch │ │ │ ├── 0024-Add-an-option-to-disable-the-readline-module.patch │ │ │ ├── 0025-Add-options-to-disable-zlib-bzip2-and-xz-modules.patch │ │ │ ├── 0026-python-config.sh-don-t-reassign-prefix.patch │ │ │ ├── 0027-Add-an-option-to-disable-uuid-module.patch │ │ │ ├── 0029-configure.ac-fixup-CC-print-multiarch-output-for-mus.patch │ │ │ ├── 0030-Add-an-option-to-disable-the-berkeleydb-module.patch │ │ │ ├── 0031-lib-crypt-uClibc-ng-doesn-t-set-errno-when-encryptio.patch │ │ │ ├── Python3-0000-default-is-optimized.patch │ │ │ ├── Python3-0201-xcompile.patch │ │ │ ├── Python3-0202-xcompile.patch │ │ │ ├── Python3-0300-generate-legacy-pyc-bytecode.patch │ │ │ ├── Python3-0400-fix-bpo5537.patch │ │ │ └── arm/ │ │ │ └── Python3-0001-fix_platform_machine_func_for_32bit_userspace.patch │ │ ├── gcc/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── gcc-4.8.2-disable_multilib_i386_linux64.patch │ │ │ ├── gcc-allow-newer-autoconf.patch │ │ │ └── gcc-crosscompile-badness.patch │ │ ├── gcc-aarch64/ │ │ │ └── package.mk │ │ ├── gcc-arm-none-eabi/ │ │ │ └── package.mk │ │ ├── gcc-bpf/ │ │ │ └── package.mk │ │ ├── gcc-or1k/ │ │ │ └── package.mk │ │ ├── llvm/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── llvm-14.0.0-force-disable-cmakelist-options.patch │ │ │ └── llvm-15.0.0-D108864-misleading-indentation.patch │ │ ├── lua52/ │ │ │ ├── config/ │ │ │ │ └── lua52.pc │ │ │ └── package.mk │ │ ├── lua54/ │ │ │ ├── config/ │ │ │ │ └── lua54.pc │ │ │ └── package.mk │ │ └── nasm/ │ │ └── package.mk │ ├── lib32/ │ │ ├── audio/ │ │ │ ├── lib32-SDL2_mixer/ │ │ │ │ └── package.mk │ │ │ ├── lib32-alsa-lib/ │ │ │ │ └── package.mk │ │ │ ├── lib32-flac/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libmodplug/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libogg/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libpulse/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libsndfile/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libvorbis/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libvorbisidec/ │ │ │ │ └── package.mk │ │ │ ├── lib32-mpg123-compat/ │ │ │ │ └── package.mk │ │ │ ├── lib32-openal-soft/ │ │ │ │ └── package.mk │ │ │ ├── lib32-opus/ │ │ │ │ └── package.mk │ │ │ └── lib32-opusfile/ │ │ │ └── package.mk │ │ ├── compress/ │ │ │ ├── lib32-bzip2/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libzip/ │ │ │ │ └── package.mk │ │ │ ├── lib32-zlib/ │ │ │ │ └── package.mk │ │ │ └── lib32-zstd/ │ │ │ └── package.mk │ │ ├── devel/ │ │ │ ├── lib32-binutils/ │ │ │ │ └── package.mk │ │ │ ├── lib32-fribidi/ │ │ │ │ └── package.mk │ │ │ ├── lib32-glib/ │ │ │ │ └── package.mk │ │ │ ├── lib32-glibc/ │ │ │ │ └── package.mk │ │ │ ├── lib32-gmp/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libcap/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libffi/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libpcap/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libtool/ │ │ │ │ └── package.mk │ │ │ ├── lib32-linux-headers/ │ │ │ │ └── package.mk │ │ │ ├── lib32-pcre/ │ │ │ │ └── package.mk │ │ │ └── lib32-pcre2/ │ │ │ └── package.mk │ │ ├── emuelec/ │ │ │ ├── emulators/ │ │ │ │ ├── lib32-box86/ │ │ │ │ │ └── package.mk │ │ │ │ └── lib32-droidports/ │ │ │ │ └── package.mk │ │ │ ├── libretro/ │ │ │ │ ├── lib32-desmume/ │ │ │ │ │ └── package.mk │ │ │ │ ├── lib32-flycast/ │ │ │ │ │ └── package.mk │ │ │ │ ├── lib32-mupen64plus/ │ │ │ │ │ └── package.mk │ │ │ │ ├── lib32-parallel-n64/ │ │ │ │ │ └── package.mk │ │ │ │ ├── lib32-pcsx_rearmed/ │ │ │ │ │ └── package.mk │ │ │ │ ├── lib32-retroarch/ │ │ │ │ │ └── package.mk │ │ │ │ ├── lib32-retrorun/ │ │ │ │ │ └── package.mk │ │ │ │ └── lib32-uae4arm/ │ │ │ │ └── package.mk │ │ │ └── ports/ │ │ │ └── lib32-bennugd-monolithic/ │ │ │ └── package.mk │ │ ├── graphics/ │ │ │ ├── lib32-SDL2_image/ │ │ │ │ └── package.mk │ │ │ ├── lib32-cairo/ │ │ │ │ └── package.mk │ │ │ ├── lib32-gl4es/ │ │ │ │ └── package.mk │ │ │ ├── lib32-harfbuzz/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libdrm/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libpng/ │ │ │ │ └── package.mk │ │ │ ├── lib32-librga/ │ │ │ │ └── package.mk │ │ │ ├── lib32-mali-bifrost/ │ │ │ │ └── package.mk │ │ │ └── lib32-opengl-meson/ │ │ │ └── package.mk │ │ ├── lang/ │ │ │ └── lib32-gcc/ │ │ │ └── package.mk │ │ ├── multimedia/ │ │ │ ├── lib32-SDL2/ │ │ │ │ └── package.mk │ │ │ ├── lib32-ffmpeg/ │ │ │ │ └── package.mk │ │ │ └── lib32-libass/ │ │ │ └── package.mk │ │ ├── print/ │ │ │ └── lib32-freetype/ │ │ │ └── package.mk │ │ ├── readme.MD │ │ ├── security/ │ │ │ ├── lib32-gnutls/ │ │ │ │ └── package.mk │ │ │ ├── lib32-nettle/ │ │ │ │ └── package.mk │ │ │ └── lib32-openssl/ │ │ │ └── package.mk │ │ ├── sysutils/ │ │ │ ├── lib32-dbus/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libevdev/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libgo2/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libusb/ │ │ │ │ └── package.mk │ │ │ ├── lib32-systemd-libs/ │ │ │ │ └── package.mk │ │ │ └── lib32-util-linux/ │ │ │ └── package.mk │ │ ├── textproc/ │ │ │ ├── lib32-expat/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libidn2/ │ │ │ │ └── package.mk │ │ │ ├── lib32-libxml2/ │ │ │ │ └── package.mk │ │ │ └── lib32-tre/ │ │ │ └── package.mk │ │ ├── tools/ │ │ │ ├── lib32-ldconfig/ │ │ │ │ ├── package.mk │ │ │ │ └── system.d/ │ │ │ │ └── ldconfig.service │ │ │ └── lib32-nold/ │ │ │ └── package.mk │ │ ├── virtual/ │ │ │ ├── lib32-essential/ │ │ │ │ └── package.mk │ │ │ └── lib32-toolchain/ │ │ │ └── package.mk │ │ └── x11/ │ │ ├── lib/ │ │ │ ├── lib32-libpciaccess/ │ │ │ │ └── package.mk │ │ │ └── lib32-pixman/ │ │ │ └── package.mk │ │ ├── other/ │ │ │ └── lib32-fontconfig/ │ │ │ └── package.mk │ │ └── util/ │ │ └── lib32-util-macros/ │ │ └── package.mk │ ├── linux/ │ │ ├── package.mk │ │ ├── patches/ │ │ │ ├── default/ │ │ │ │ ├── linux-020-ALSA-pcm-fix-ELD-constraints-for-E-AC3-DTS-HD-and-ML.patch │ │ │ │ ├── linux-021-ASoC-hdmi-codec-don-t-set-channel-and-speaker-info-f.patch │ │ │ │ ├── linux-022-ASoC-hdmi-codec-Fix-broken-channel-map-reporting.patch │ │ │ │ ├── linux-051-ouya_controller_support.patch │ │ │ │ ├── linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch │ │ │ │ ├── linux-062-imon_pad_ignore_diagonal.patch │ │ │ │ ├── linux-121-rtw88-linux-next-6-2.patch │ │ │ │ ├── linux-122-rtw88-USB-fixes.patch │ │ │ │ ├── linux-122-rtw88-USB-fixes2.patch │ │ │ │ ├── linux-122-rtw88-fix-rcu-lock.patch │ │ │ │ ├── linux-122-rtw88-rfc-v1.patch │ │ │ │ ├── linux-150-dev_input_xpad_add_8bitdo_pro_2_wired_controller_support.patch │ │ │ │ ├── linux-999-no-lzma-in-x86-perf-build.patch │ │ │ │ └── linux-999.02-0001-pm-disable-async-suspend-resume-by-default.patch │ │ │ └── raspberrypi/ │ │ │ ├── linux-051-ouya_controller_support.patch │ │ │ └── linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch │ │ ├── sysctl.d/ │ │ │ ├── network.conf │ │ │ └── qdisc.conf │ │ └── udev.d/ │ │ ├── 30-disable-wakeup.rules │ │ └── 40-modeswitch.rules │ ├── linux-driver-addons/ │ │ └── dvb/ │ │ ├── crazycat/ │ │ │ ├── changelog.txt │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ └── disable-pci/ │ │ │ │ └── crazycat-03-disable-partly-pci.patch │ │ │ └── source/ │ │ │ └── default.py │ │ ├── depends/ │ │ │ ├── media_tree/ │ │ │ │ └── package.mk │ │ │ └── media_tree_cc/ │ │ │ └── package.mk │ │ ├── digital_devices/ │ │ │ ├── changelog.txt │ │ │ ├── package.mk │ │ │ └── source/ │ │ │ └── default.py │ │ └── dvb-latest/ │ │ ├── changelog.txt │ │ ├── package.mk │ │ ├── patches/ │ │ │ └── disable-pci/ │ │ │ └── dvb-latest-03-disable-partly-pci.patch │ │ └── source/ │ │ └── default.py │ ├── linux-drivers/ │ │ ├── RTL8192DU/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── RTL8192DU-0001-remove_overlapping_pids.patch │ │ │ └── aarch64/ │ │ │ └── RTL8192DU-0101-PR63.patch │ │ ├── RTL8812AU/ │ │ │ └── package.mk │ │ ├── bcm_sta/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── bcm_sta-0001-change-eth-to-wlan.patch │ │ │ ├── bcm_sta-0002-user_ioctl.patch │ │ │ ├── bcm_sta-0003-remove-date-time-macros.patch │ │ │ ├── bcm_sta-0004-null-pointer-crash.patch │ │ │ ├── bcm_sta-0005-rdtscl.patch │ │ │ ├── bcm_sta-0006-kernel-4.7.patch │ │ │ ├── bcm_sta-0007-kernel-4.8.patch │ │ │ ├── bcm_sta-0008-kernel-4.11.patch │ │ │ ├── bcm_sta-0009-kernel-4.12.patch │ │ │ ├── bcm_sta-0010-kernel-4.15.patch │ │ │ ├── bcm_sta-0011-fix-kernel-warnings.patch │ │ │ ├── bcm_sta-0012-kernel-4.14.patch │ │ │ ├── bcm_sta-0200-kernel-5.1-rc1-fix.patch │ │ │ ├── bcm_sta-0300-kernel-5.6-rc1-fix.patch │ │ │ ├── bcm_sta-0400-kernel-5.9-fix.patch │ │ │ ├── bcm_sta-0500-kernel-5.10-fix.patch │ │ │ ├── bcm_sta-0600-kernel-5.17-fix.patch │ │ │ ├── bcm_sta-0600-kernel-5.18-fix.patch │ │ │ ├── bcm_sta-0600-kernel-6.0-fix.patch │ │ │ └── bcm_sta-0600-kernel-6.1-fix.patch │ │ ├── mali-bifrost/ │ │ │ └── package.mk │ │ ├── mali-midgard/ │ │ │ └── package.mk │ │ └── mali-utgard/ │ │ └── package.mk │ ├── linux-firmware/ │ │ ├── brcmfmac_sdio-firmware/ │ │ │ ├── package.mk │ │ │ ├── scripts/ │ │ │ │ └── brcmfmac-firmware-setup │ │ │ └── system.d/ │ │ │ └── brcmfmac-firmware.service │ │ ├── brcmfmac_sdio-firmware-imx/ │ │ │ ├── package.mk │ │ │ ├── system.d/ │ │ │ │ └── brcmfmac_sdio-firmware@.service │ │ │ └── udev.d/ │ │ │ └── 80-brcmfmac_sdio.rules │ │ ├── brcmfmac_sdio-firmware-rpi/ │ │ │ └── package.mk │ │ ├── dvb-firmware/ │ │ │ └── package.mk │ │ ├── firmware-dragonboard/ │ │ │ └── package.mk │ │ ├── firmware-imx/ │ │ │ └── package.mk │ │ ├── intel-ucode/ │ │ │ ├── package.mk │ │ │ └── sources/ │ │ │ └── intel-microcode2ucode.c │ │ ├── iwlwifi-firmware/ │ │ │ └── package.mk │ │ ├── kernel-firmware/ │ │ │ └── package.mk │ │ ├── misc-firmware/ │ │ │ └── package.mk │ │ ├── rtl8723bs_bt/ │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ ├── rtl8723bs_bt-001-Makefile.patch │ │ │ │ └── rtl8723bs_bt-002-firmware_path.patch │ │ │ ├── system.d/ │ │ │ │ └── rtl8723bs_bt-firmware.service │ │ │ └── udev.d/ │ │ │ └── 80-rtl8723_bt.rules │ │ └── wlan-firmware/ │ │ └── package.mk │ ├── mediacenter/ │ │ ├── JsonSchemaBuilder/ │ │ │ └── package.mk │ │ ├── LibreELEC-settings/ │ │ │ ├── package.mk │ │ │ ├── scripts/ │ │ │ │ ├── backup-restore │ │ │ │ └── factory-reset │ │ │ └── system.d/ │ │ │ ├── backup-restore.service │ │ │ ├── backup-restore.target │ │ │ ├── factory-reset.service │ │ │ └── factory-reset.target │ │ ├── TexturePacker/ │ │ │ └── package.mk │ │ ├── kodi/ │ │ │ ├── config/ │ │ │ │ ├── 70-libinput-ignore-power-button.rules │ │ │ │ ├── advancedsettings.xml │ │ │ │ ├── appliance-gbm-generic.xml │ │ │ │ ├── appliance-gbm.xml │ │ │ │ ├── appliance.xml │ │ │ │ ├── guisettings.xml │ │ │ │ ├── kodi.conf.in │ │ │ │ ├── network_wait │ │ │ │ ├── repository.libreelec.tv/ │ │ │ │ │ └── addon.xml │ │ │ │ └── sources.xml │ │ │ ├── debug.d/ │ │ │ │ └── kodi.conf │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ ├── README.patches │ │ │ │ ├── cec-framework/ │ │ │ │ │ └── kodi-100.17-tinker-s-cec-disable-polling.patch │ │ │ │ ├── drmprime-filter/ │ │ │ │ │ ├── 0001-WIP-DVDVideoCodecDRMPRIME-add-support-for-filters.patch │ │ │ │ │ ├── 0002-WIP-DRMPRIME-deinterlace-filter.patch │ │ │ │ │ ├── 0003-DVDVideoCodecDRMPRIME-Avoid-exception-with-AV_PIX_FM.patch │ │ │ │ │ ├── 0004-DVDVideoCodecDRMPRIME-Leave-deinterlace-filter-activ.patch │ │ │ │ │ ├── 0005-SetVideoInterlaced-Set-and-unset-deinterlace-method-.patch │ │ │ │ │ ├── 0006-DVDVideoCodecDRMPRIME-Close-deinterlace-filter-on-er.patch │ │ │ │ │ └── 0007-DVDVideoCodecDRMPRIME-Fix-missing-flush-after-eof.patch │ │ │ │ ├── kodi-100.02-add-libreelec.tv-RSS-news.patch │ │ │ │ ├── kodi-100.03-disable-online-check.patch │ │ │ │ ├── kodi-100.04-use-udevil-to-umount.patch │ │ │ │ ├── kodi-100.05-make-binary-addons-executable.patch │ │ │ │ ├── kodi-100.07-disable-minimize.patch │ │ │ │ ├── kodi-100.08-setup-timezone.patch │ │ │ │ ├── kodi-100.09-use-a-wrapper-to-setup-service-addons.patch │ │ │ │ ├── kodi-100.10-handle-SIGTERM.patch │ │ │ │ ├── kodi-100.13-udevprovider-filter-out-OE-specific-mounts.patch │ │ │ │ ├── kodi-100.15-rename-default-pulse-device.patch │ │ │ │ ├── kodi-100.16-remove-sysinfo-battery.patch │ │ │ │ ├── kodi-100.25-hack-fix-texture-packer-cmake-source-dir.patch │ │ │ │ ├── kodi-100.26-disable-internal-texturepacker.patch │ │ │ │ ├── kodi-100.30-addons-refresh-etc-environment.patch │ │ │ │ ├── kodi-100.32.add-le-repository-to-officials.patch │ │ │ │ ├── kodi-100.40-estuary-settings-icon.patch │ │ │ │ ├── kodi-995.10-devinputmappings.patch │ │ │ │ ├── kodi-995.21-keymaps-change-remote-poweroff-action-to-show-shutdo.patch │ │ │ │ ├── kodi-999.15-disable-using-tv-menu-language-by-default.patch │ │ │ │ ├── kodi-999.20-headers-only.patch │ │ │ │ └── wayland/ │ │ │ │ ├── kodi-995.01-fix-missing-wayland-scanner-pkg-config.patch │ │ │ │ └── kodi-999.16-PR20632-base-m_bFullScreenRoot-setting-on-res-infos-bFullScreen.patch │ │ │ ├── profile.d/ │ │ │ │ ├── 00-addons.conf │ │ │ │ └── 99-kodi.conf │ │ │ ├── scripts/ │ │ │ │ ├── kodi-config │ │ │ │ ├── kodi-remote │ │ │ │ ├── kodi-safe-mode │ │ │ │ ├── kodi.sh │ │ │ │ ├── pastekodi │ │ │ │ ├── service-addon-wrapper │ │ │ │ ├── setwakeup.sh │ │ │ │ └── xml_merge.py │ │ │ ├── sleep.d/ │ │ │ │ └── openelec-sleep.sh │ │ │ ├── sleep.d.serial/ │ │ │ │ ├── 10-addon-sleep.sh │ │ │ │ └── 20-custom-sleep.sh │ │ │ ├── system.d/ │ │ │ │ ├── kodi-autostart.service │ │ │ │ ├── kodi-cleanlogs.service │ │ │ │ ├── kodi-halt.service │ │ │ │ ├── kodi-lirc-suspend.service │ │ │ │ ├── kodi-poweroff.service │ │ │ │ ├── kodi-reboot.service │ │ │ │ ├── kodi-waitonnetwork.service │ │ │ │ ├── kodi.service │ │ │ │ └── kodi.target │ │ │ └── tmpfiles.d/ │ │ │ ├── kodi-userdirs.conf │ │ │ └── kodi.conf │ │ ├── kodi-binary-addons/ │ │ │ ├── audiodecoder.2sf/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.asap/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.dumb/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.fluidsynth/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.gme/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.gsf/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.modplug/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.ncsf/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── audiodecoder.ncsf-0001-fix-build-with-gcc5.patch │ │ │ │ └── audiodecoder.ncsf-0002-fix-build-with-gcc-10.patch │ │ │ ├── audiodecoder.nosefart/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.openmpt/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.organya/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.qsf/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.sacd/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.sidplay/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.snesapu/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.ssf/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.stsound/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.timidity/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.upse/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.usf/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.vgmstream/ │ │ │ │ └── package.mk │ │ │ ├── audiodecoder.wsr/ │ │ │ │ └── package.mk │ │ │ ├── audioencoder.flac/ │ │ │ │ └── package.mk │ │ │ ├── audioencoder.lame/ │ │ │ │ └── package.mk │ │ │ ├── audioencoder.vorbis/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.2048/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.atari800/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.beetle-bsnes/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.beetle-gba/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.beetle-lynx/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.beetle-ngp/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.beetle-pce-fast/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.beetle-pcfx/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.beetle-psx/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.beetle-supergrafx/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.beetle-vb/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.beetle-wswan/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.bluemsx/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.bnes/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.bsnes-mercury-accuracy/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.bsnes-mercury-balanced/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.bsnes-mercury-performance/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.cap32/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.dinothawr/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.dosbox/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.dosbox-pure/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.fbneo/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.fceumm/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.fmsx/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.fsuae/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.fuse/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.gambatte/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.genplus/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.gw/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.handy/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.hatari/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.mame2000/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.mame2003/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.mame2003_plus/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.mame2010/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.mame2015/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.mame2016/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.mesen/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.meteor/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.mgba/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.mrboom/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.nestopia/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.nx/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.o2em/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.opera/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.pcsx-rearmed/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.picodrive/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.pokemini/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.prboom/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.prosystem/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.quicknes/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.sameboy/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.scummvm/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.snes9x/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.snes9x2002/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.snes9x2010/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.stella/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.tgbdual/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.tyrquake/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.uae/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.uae4arm/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.vba-next/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.vbam/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.vecx/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.vice/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.virtualjaguar/ │ │ │ │ └── package.mk │ │ │ ├── game.libretro.yabause/ │ │ │ │ └── package.mk │ │ │ ├── imagedecoder.heif/ │ │ │ │ └── package.mk │ │ │ ├── imagedecoder.mpo/ │ │ │ │ └── package.mk │ │ │ ├── imagedecoder.raw/ │ │ │ │ └── package.mk │ │ │ ├── inputstream.adaptive/ │ │ │ │ └── package.mk │ │ │ ├── inputstream.ffmpegdirect/ │ │ │ │ └── package.mk │ │ │ ├── inputstream.rtmp/ │ │ │ │ └── package.mk │ │ │ ├── peripheral.joystick/ │ │ │ │ └── package.mk │ │ │ ├── peripheral.xarcade/ │ │ │ │ └── package.mk │ │ │ ├── pvr.argustv/ │ │ │ │ └── package.mk │ │ │ ├── pvr.demo/ │ │ │ │ └── package.mk │ │ │ ├── pvr.dvblink/ │ │ │ │ └── package.mk │ │ │ ├── pvr.dvbviewer/ │ │ │ │ └── package.mk │ │ │ ├── pvr.filmon/ │ │ │ │ └── package.mk │ │ │ ├── pvr.freebox/ │ │ │ │ └── package.mk │ │ │ ├── pvr.hdhomerun/ │ │ │ │ └── package.mk │ │ │ ├── pvr.hts/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── pvr.hts-0001-set-speed.patch │ │ │ ├── pvr.iptvsimple/ │ │ │ │ └── package.mk │ │ │ ├── pvr.mediaportal.tvserver/ │ │ │ │ └── package.mk │ │ │ ├── pvr.mythtv/ │ │ │ │ └── package.mk │ │ │ ├── pvr.nextpvr/ │ │ │ │ └── package.mk │ │ │ ├── pvr.njoy/ │ │ │ │ └── package.mk │ │ │ ├── pvr.octonet/ │ │ │ │ └── package.mk │ │ │ ├── pvr.pctv/ │ │ │ │ └── package.mk │ │ │ ├── pvr.plutotv/ │ │ │ │ └── package.mk │ │ │ ├── pvr.sledovanitv.cz/ │ │ │ │ └── package.mk │ │ │ ├── pvr.stalker/ │ │ │ │ └── package.mk │ │ │ ├── pvr.teleboy/ │ │ │ │ └── package.mk │ │ │ ├── pvr.vbox/ │ │ │ │ └── package.mk │ │ │ ├── pvr.vdr.vnsi/ │ │ │ │ └── package.mk │ │ │ ├── pvr.vuplus/ │ │ │ │ └── package.mk │ │ │ ├── pvr.waipu/ │ │ │ │ └── package.mk │ │ │ ├── pvr.wmc/ │ │ │ │ └── package.mk │ │ │ ├── pvr.zattoo/ │ │ │ │ └── package.mk │ │ │ ├── screensaver.asteroids/ │ │ │ │ └── package.mk │ │ │ ├── screensaver.asterwave/ │ │ │ │ └── package.mk │ │ │ ├── screensaver.biogenesis/ │ │ │ │ └── package.mk │ │ │ ├── screensaver.greynetic/ │ │ │ │ └── package.mk │ │ │ ├── screensaver.matrixtrails/ │ │ │ │ └── package.mk │ │ │ ├── screensaver.pingpong/ │ │ │ │ └── package.mk │ │ │ ├── screensaver.pyro/ │ │ │ │ └── package.mk │ │ │ ├── screensaver.shadertoy/ │ │ │ │ └── package.mk │ │ │ ├── screensaver.stars/ │ │ │ │ └── package.mk │ │ │ ├── vfs.libarchive/ │ │ │ │ └── package.mk │ │ │ ├── vfs.sftp/ │ │ │ │ └── package.mk │ │ │ ├── visualization.fishbmc/ │ │ │ │ └── package.mk │ │ │ ├── visualization.goom/ │ │ │ │ └── package.mk │ │ │ ├── visualization.matrix/ │ │ │ │ └── package.mk │ │ │ ├── visualization.pictureit/ │ │ │ │ └── package.mk │ │ │ ├── visualization.projectm/ │ │ │ │ └── package.mk │ │ │ ├── visualization.shadertoy/ │ │ │ │ └── package.mk │ │ │ ├── visualization.spectrum/ │ │ │ │ └── package.mk │ │ │ ├── visualization.starburst/ │ │ │ │ └── package.mk │ │ │ └── visualization.waveform/ │ │ │ └── package.mk │ │ ├── kodi-platform/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── kodi-platform-01_crosscompile-badness.patch │ │ ├── kodi-theme-Estuary/ │ │ │ └── package.mk │ │ └── p8-platform/ │ │ ├── package.mk │ │ └── patches/ │ │ ├── p8-platform-01-revert-cc-badness.patch │ │ └── p8-platform-02-cmake_install_prefix_toolchain.patch │ ├── multimedia/ │ │ ├── SDL2/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── Amlogic/ │ │ │ │ └── 0001-mali-fbdev-add-driver.patch │ │ │ ├── OdroidGoAdvance/ │ │ │ │ ├── 0005-SDL2-2.28.1.odroidgoa-support.patch │ │ │ │ └── 0006-KMSDRM-Also-rotate-the-cursor.patch │ │ │ └── Rockchip/ │ │ │ └── 0001-kmsdrm-Workaround-missing-gbm_bo_get_offset-and-SDL_.patch │ │ ├── aom/ │ │ │ └── package.mk │ │ ├── bento4/ │ │ │ └── package.mk │ │ ├── dav1d/ │ │ │ └── package.mk │ │ ├── ffmpeg/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── dav1d/ │ │ │ │ └── ffmpeg-support-dav1d-1-0-0.patch │ │ │ ├── dv/ │ │ │ │ ├── ffmpeg-001-avformat-dovi_isom-Implement-Dolby-Vision-configurat.patch │ │ │ │ └── ffmpeg-002-avformat-matroska-dec-enc-Parse-BlockAdditionMapping.patch │ │ │ ├── ffmpeg-force_sdl2.patch │ │ │ ├── ffmpeg-openssl3.patch │ │ │ ├── kodi/ │ │ │ │ └── ffmpeg-001-kodi.patch │ │ │ ├── libreelec/ │ │ │ │ └── ffmpeg-001-libreelec.patch │ │ │ ├── rpi/ │ │ │ │ └── ffmpeg-001-rpi.patch │ │ │ ├── v4l2-drmprime/ │ │ │ │ └── ffmpeg-001-v4l2-drmprime.patch │ │ │ └── v4l2-request/ │ │ │ └── ffmpeg-001-v4l2-request.patch │ │ ├── gmmlib/ │ │ │ └── package.mk │ │ ├── gstreamer/ │ │ │ ├── gst-plugins-bad/ │ │ │ │ └── package.mk │ │ │ ├── gst-plugins-base/ │ │ │ │ └── package.mk │ │ │ └── gstreamer/ │ │ │ └── package.mk │ │ ├── intel-vaapi-driver/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── 0001-intel-vaapi-driver-2.4.1-Handle-odd-resolution.patch │ │ ├── libaacs/ │ │ │ └── package.mk │ │ ├── libass/ │ │ │ └── package.mk │ │ ├── libbdplus/ │ │ │ └── package.mk │ │ ├── libbluray/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── libbluray-00-fix-build-with-autoconf-archive-2016-or-later.patch │ │ │ └── libbluray-03-set-headless-false.patch │ │ ├── libdvdcss/ │ │ │ └── package.mk │ │ ├── libdvdnav/ │ │ │ └── package.mk │ │ ├── libdvdread/ │ │ │ └── package.mk │ │ ├── libmpeg2/ │ │ │ └── package.mk │ │ ├── libudfread/ │ │ │ └── package.mk │ │ ├── libva/ │ │ │ └── package.mk │ │ ├── libvdpau/ │ │ │ └── package.mk │ │ ├── media-driver/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── media-driver-999.01-PR1162-use-forward_references-as-the-reference-for-ADI.patch │ │ ├── nv-codec-headers/ │ │ │ └── package.mk │ │ ├── nvidia-vaapi-driver/ │ │ │ └── package.mk │ │ ├── rtmpdump/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── 001_fix-racing-build-issue.patch │ │ │ └── 002_build-with-openssl11.patch │ │ └── zvbi/ │ │ ├── package.mk │ │ └── patches/ │ │ ├── zvbi-0010-fix-static-linking.patch │ │ ├── zvbi-0020-ioctl.patch │ │ ├── zvbi-0030-ssize_max.patch │ │ ├── zvbi-0040-fix-clang-support.patch │ │ └── zvbi-0050-prevent-test.patch │ ├── network/ │ │ ├── avahi/ │ │ │ ├── debug.d/ │ │ │ │ └── avahi.conf │ │ │ ├── default.d/ │ │ │ │ └── avahi.conf │ │ │ ├── package.mk │ │ │ └── system.d/ │ │ │ ├── avahi-daemon.service │ │ │ └── avahi-defaults.service │ │ ├── bluez/ │ │ │ ├── debug.d/ │ │ │ │ ├── bluez.conf │ │ │ │ └── obexd.conf │ │ │ ├── default.d/ │ │ │ │ └── bluez.conf │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ ├── bluez-01_add-obexd-policy.patch │ │ │ │ ├── bluez-02_obexd-use-system-bus.patch │ │ │ │ ├── bluez-03_storagedir.patch │ │ │ │ ├── bluez-04_work-around-Logitech-diNovo-Edge-keyboard-firmware-i.patch │ │ │ │ ├── bluez-05-046d-c52b-Logitech-Inc.-Unifying-Receiver.patch │ │ │ │ ├── bluez-06-raspberry-pi-mods.patch │ │ │ │ ├── bluez-08-hciattach-retry-device-reset-when-no-response.patch │ │ │ │ ├── bluez-11_sixaxis-fix-PID-navigation-controller.patch │ │ │ │ ├── bluez-12-fix-obexd-after-5_50.patch │ │ │ │ ├── bluez-21-hciattach-add-QCA9377-Tuffello-support.patch │ │ │ │ ├── bluez-40-Add-support-for-sprd-type-in-hciattach.patch │ │ │ │ └── fake-ps3.patch │ │ │ ├── system.d/ │ │ │ │ ├── bluetooth-defaults.service │ │ │ │ ├── bluetooth.service │ │ │ │ └── obex.service │ │ │ └── tmpfiles.d/ │ │ │ └── z_05_bluez.conf │ │ ├── connman/ │ │ │ ├── config/ │ │ │ │ └── settings │ │ │ ├── debug.d/ │ │ │ │ └── connman.conf │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ ├── connman-01-do-not-cleanup-routes.patch │ │ │ │ ├── connman-04-ipv6-disabled-by-default.patch │ │ │ │ └── connman-05_link-against-ncurses.patch │ │ │ ├── scripts/ │ │ │ │ └── connman-setup │ │ │ ├── system.d/ │ │ │ │ ├── connman-vpn.service │ │ │ │ ├── connman.service │ │ │ │ └── network-online.service │ │ │ └── tmpfiles.d/ │ │ │ └── z_03_connman.conf │ │ ├── ethtool/ │ │ │ ├── package.mk │ │ │ └── udev.d/ │ │ │ └── 99-wakeup-eth.rules │ │ ├── iptables/ │ │ │ ├── config/ │ │ │ │ ├── README │ │ │ │ ├── home.v4 │ │ │ │ ├── home.v6 │ │ │ │ ├── public.v4 │ │ │ │ └── public.v6 │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ └── iptables-0002-xshared-fix-for-build-in-sub-directory.patch │ │ │ ├── scripts/ │ │ │ │ └── iptables_helper │ │ │ └── system.d/ │ │ │ └── iptables.service │ │ ├── iw/ │ │ │ ├── package.mk │ │ │ ├── scripts/ │ │ │ │ └── setregdomain │ │ │ └── udev.d/ │ │ │ └── 60-iw-regdomain.rules │ │ ├── iwd/ │ │ │ └── package.mk │ │ ├── libdnet/ │ │ │ └── package.mk │ │ ├── libmnl/ │ │ │ └── package.mk │ │ ├── libnfs/ │ │ │ └── package.mk │ │ ├── libnftnl/ │ │ │ └── package.mk │ │ ├── libnl/ │ │ │ └── package.mk │ │ ├── libshairplay/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── libshairplay-read_airportkey_from_etc.patch │ │ ├── libssh/ │ │ │ └── package.mk │ │ ├── libtirpc/ │ │ │ └── package.mk │ │ ├── netbase/ │ │ │ └── package.mk │ │ ├── nfs-utils/ │ │ │ ├── config/ │ │ │ │ └── exports.sample │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ └── nfs-utils-01-ce-specific.patch │ │ │ ├── system.d/ │ │ │ │ └── load-module-nfsd.service │ │ │ └── tmpfiles.d/ │ │ │ └── nfs-utils.conf │ │ ├── nss-mdns/ │ │ │ ├── config/ │ │ │ │ └── nsswitch.conf │ │ │ └── package.mk │ │ ├── openssh/ │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ ├── openssh-8.9p1-keydir.patch │ │ │ │ ├── openssh-motd-add-device-info.patch │ │ │ │ ├── openssh-silence-missing-identity-error.patch │ │ │ │ └── openssh-source-etc-environment.patch │ │ │ ├── system.d/ │ │ │ │ └── sshd.service │ │ │ └── tmpfiles.d/ │ │ │ └── z_04_openssh.conf │ │ ├── openvpn/ │ │ │ └── package.mk │ │ ├── rpcbind/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── rpcbind-01-drop-warm-start-as-it-fails.patch │ │ │ └── rpcbind-1.2.6-vulnerability_fixes-1.patch │ │ ├── rpcsvc-proto/ │ │ │ └── package.mk │ │ ├── rsync/ │ │ │ └── package.mk │ │ ├── samba/ │ │ │ ├── config/ │ │ │ │ ├── samba4-cache.txt │ │ │ │ └── smb.conf │ │ │ ├── default.d/ │ │ │ │ └── samba.conf │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ ├── samba-200-4.11-fix-ASN1-bso14164.patch │ │ │ │ ├── samba-950-no-man.patch │ │ │ │ └── samba-951-no-man-4.16.patch │ │ │ ├── scripts/ │ │ │ │ ├── samba-autoshare │ │ │ │ ├── samba-config │ │ │ │ └── smbpasswd │ │ │ ├── system.d/ │ │ │ │ └── samba-config.service │ │ │ └── system.d.opt/ │ │ │ ├── nmbd.service │ │ │ └── smbd.service │ │ ├── sshpass/ │ │ │ └── package.mk │ │ ├── wireguard-linux-compat/ │ │ │ ├── modules-load.d/ │ │ │ │ └── wireguard.conf │ │ │ └── package.mk │ │ ├── wireguard-tools/ │ │ │ ├── config/ │ │ │ │ ├── system.d/ │ │ │ │ │ └── wireguard.service.sample │ │ │ │ └── wireguard/ │ │ │ │ └── wireguard.config.sample │ │ │ ├── package.mk │ │ │ ├── scripts/ │ │ │ │ └── wg-keygen │ │ │ └── tmpfiles.d/ │ │ │ └── z_03_wireguard.conf │ │ ├── wireless-regdb/ │ │ │ └── package.mk │ │ ├── wpa_supplicant/ │ │ │ ├── config/ │ │ │ │ └── makefile.config │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── wpa_supplicant-2.4-libnl3-includes.patch │ │ └── wsdd2/ │ │ └── package.mk │ ├── oem/ │ │ └── package.mk │ ├── packages.mk.addon_template │ ├── packages.mk.template │ ├── print/ │ │ └── freetype/ │ │ ├── package.mk │ │ └── patches/ │ │ └── freetype-01-fix-pkgconf.patch │ ├── python/ │ │ ├── devel/ │ │ │ ├── Jinja2/ │ │ │ │ └── package.mk │ │ │ ├── Mako/ │ │ │ │ └── package.mk │ │ │ ├── MarkupSafe/ │ │ │ │ └── package.mk │ │ │ ├── distutilscross/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── distutilscross-0000-fix-python3.patch │ │ │ ├── meson/ │ │ │ │ └── package.mk │ │ │ ├── ninja/ │ │ │ │ └── package.mk │ │ │ ├── pgi/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── pgi-0001-remove-type-as-it-s-not-Python-3-compatible.patch │ │ │ ├── pygobject/ │ │ │ │ └── package.mk │ │ │ ├── setuptools/ │ │ │ │ └── package.mk │ │ │ └── waf/ │ │ │ └── package.mk │ │ ├── graphics/ │ │ │ └── Pillow/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── Pillow-0001-crosscompiling.patch │ │ ├── python-uinput/ │ │ │ └── package.mk │ │ ├── security/ │ │ │ └── pycryptodome/ │ │ │ └── package.mk │ │ └── system/ │ │ ├── dbus-python/ │ │ │ └── package.mk │ │ ├── dbussy/ │ │ │ └── package.mk │ │ └── simplejson/ │ │ └── package.mk │ ├── rust/ │ │ ├── cargo/ │ │ │ └── package.mk │ │ ├── cargo-c/ │ │ │ └── package.mk │ │ ├── cargo-snapshot/ │ │ │ └── package.mk │ │ ├── rust/ │ │ │ ├── package.mk │ │ │ └── targets/ │ │ │ ├── aarch64-libreelec-linux-gnu.json │ │ │ ├── arm-libreelec-linux-gnueabihf.json │ │ │ └── x86_64-libreelec-linux-gnu.json │ │ ├── rust-std-snapshot/ │ │ │ └── package.mk │ │ └── rustc-snapshot/ │ │ └── package.mk │ ├── security/ │ │ ├── gnutls/ │ │ │ └── package.mk │ │ ├── libgcrypt/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── libgcrypt-01-dont_replace_parts_of_path-0.1.patch │ │ │ └── libgcrypt-ac_cv_sys_symbol_underscore.patch │ │ ├── libgpg-error/ │ │ │ └── package.mk │ │ ├── nettle/ │ │ │ └── package.mk │ │ ├── nspr/ │ │ │ └── package.mk │ │ ├── nss/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── nss-02_3.15.5-standalone-1.patch │ │ │ ├── nss-04-skip_shlibsign.patch │ │ │ ├── nss-05-disable_host_cflags.patch │ │ │ └── nss-09-gcc-warning-workaround.patch │ │ └── openssl/ │ │ ├── cert/ │ │ │ └── cacert.pem │ │ ├── package.mk │ │ ├── scripts/ │ │ │ └── openssl-config │ │ └── system.d/ │ │ └── openssl-config.service │ ├── sx05re/ │ │ ├── Amlogic/ │ │ │ └── package.mk │ │ ├── Amlogic-ng/ │ │ │ └── package.mk │ │ ├── Amlogic-no/ │ │ │ └── package.mk │ │ ├── emuelec/ │ │ │ ├── bin/ │ │ │ │ ├── batocera/ │ │ │ │ │ ├── batocera-bluetooth │ │ │ │ │ ├── batocera-bluetooth-agent │ │ │ │ │ ├── batocera-brightness │ │ │ │ │ ├── batocera-bt-list-devices │ │ │ │ │ ├── batocera-bt-test-device │ │ │ │ │ ├── batocera-btDaemon │ │ │ │ │ ├── batocera-config │ │ │ │ │ ├── batocera-es-thebezelproject │ │ │ │ │ ├── batocera-es-theme │ │ │ │ │ ├── batocera-info │ │ │ │ │ ├── batocera-resolution │ │ │ │ │ ├── batocera-retroachievements-info │ │ │ │ │ ├── batocera-scraper │ │ │ │ │ ├── batocera-settings │ │ │ │ │ ├── batocera-systems │ │ │ │ │ ├── batocera-wifi │ │ │ │ │ ├── emuelec-bluetooth │ │ │ │ │ ├── emuelec-bluetooth-legacy │ │ │ │ │ └── emuelec-upgrade │ │ │ │ ├── bezels.sh │ │ │ │ ├── check_res.sh │ │ │ │ ├── connectbtwii.sh │ │ │ │ ├── emuelec-utils │ │ │ │ ├── emuelecRunApp.sh │ │ │ │ ├── emuelecRunEmu.sh │ │ │ │ ├── emuelec_autostart.sh │ │ │ │ ├── emueleclogs.sh │ │ │ │ ├── emustation-config │ │ │ │ ├── env.sh │ │ │ │ ├── fbterm.sh │ │ │ │ ├── find.sh │ │ │ │ ├── gamelist-cleaner.sh │ │ │ │ ├── hypseus.start.sh │ │ │ │ ├── joy2key.py │ │ │ │ ├── joy_common.sh │ │ │ │ ├── killes.sh │ │ │ │ ├── ldd_32 │ │ │ │ ├── mount_romfs.sh │ │ │ │ ├── pico8.sh │ │ │ │ ├── playvideo.sh │ │ │ │ ├── romconf.sh │ │ │ │ ├── rr_audio.sh │ │ │ │ ├── runwiimote.sh │ │ │ │ ├── scripts/ │ │ │ │ │ ├── scriptmodules/ │ │ │ │ │ │ ├── archivefuncs.sh │ │ │ │ │ │ ├── helpers.sh │ │ │ │ │ │ ├── inifuncs.sh │ │ │ │ │ │ ├── packages.sh │ │ │ │ │ │ ├── supplementary/ │ │ │ │ │ │ │ ├── bluetoothcontroller.py │ │ │ │ │ │ │ ├── esthemes.sh │ │ │ │ │ │ │ ├── reicast.sh │ │ │ │ │ │ │ ├── scraper.sh │ │ │ │ │ │ │ ├── skyscraper.sh │ │ │ │ │ │ │ ├── systeminfo.sh │ │ │ │ │ │ │ └── wifi.sh │ │ │ │ │ │ └── system.sh │ │ │ │ │ └── setup/ │ │ │ │ │ ├── CMD_MAKER.py │ │ │ │ │ ├── EKA_INSTALL.py │ │ │ │ │ ├── Skyscraper.start │ │ │ │ │ ├── btconnect.sh │ │ │ │ │ ├── btsetup.sh │ │ │ │ │ ├── cmdmaker.sh │ │ │ │ │ ├── copy_usb_roms_to_device.sh │ │ │ │ │ ├── create_rom_dirs.sh │ │ │ │ │ ├── eka-install.sh │ │ │ │ │ ├── file_manager.sh │ │ │ │ │ ├── gamelist.xml │ │ │ │ │ ├── install_cheats.sh │ │ │ │ │ ├── install_drastic.sh │ │ │ │ │ ├── install_pixelcade.sh │ │ │ │ │ ├── install_portmaster.sh │ │ │ │ │ ├── launch_terminal_(kb).sh │ │ │ │ │ ├── listmedia.txt │ │ │ │ │ ├── macrorun.py │ │ │ │ │ ├── macrorun.sh │ │ │ │ │ ├── macrosetup.py │ │ │ │ │ ├── macrosetup.sh │ │ │ │ │ ├── scan_scummVM_games.sh │ │ │ │ │ ├── scraper.start │ │ │ │ │ ├── send_logs.sh │ │ │ │ │ ├── show_last_emuelec.log.sh │ │ │ │ │ ├── skyscraper.sh │ │ │ │ │ ├── sselphs_scraper.sh │ │ │ │ │ ├── system_info.sh │ │ │ │ │ ├── wifi.sh │ │ │ │ │ └── youtube_search.sh │ │ │ │ ├── setres.sh │ │ │ │ ├── setsettings.sh │ │ │ │ ├── setterm │ │ │ │ ├── show_splash.sh │ │ │ │ └── updatecheck.sh │ │ │ ├── config/ │ │ │ │ ├── EE_VERSION │ │ │ │ ├── asound.conf-amlogic │ │ │ │ ├── asound.conf-amlogic-ng │ │ │ │ ├── asound.conf-amlogic-no │ │ │ │ ├── autostart.sh │ │ │ │ ├── custom_start.sh │ │ │ │ ├── emuelec/ │ │ │ │ │ ├── bin/ │ │ │ │ │ │ └── put_user_bins_here │ │ │ │ │ ├── configs/ │ │ │ │ │ │ ├── all/ │ │ │ │ │ │ │ ├── autoconf.cfg │ │ │ │ │ │ │ ├── bluetooth.cfg │ │ │ │ │ │ │ ├── scraper.cfg │ │ │ │ │ │ │ └── skyscraper.cfg │ │ │ │ │ │ ├── atari800.cfg │ │ │ │ │ │ ├── bezels/ │ │ │ │ │ │ │ └── arcademap.cfg │ │ │ │ │ │ ├── buttonmapping.cfg │ │ │ │ │ │ ├── dimensions.conf │ │ │ │ │ │ ├── emuelec.conf │ │ │ │ │ │ ├── emuoptions.conf │ │ │ │ │ │ ├── gptokeyb/ │ │ │ │ │ │ │ ├── fallout.gptk │ │ │ │ │ │ │ └── sorr.gptk │ │ │ │ │ │ ├── jslisten.cfg │ │ │ │ │ │ ├── pico-8/ │ │ │ │ │ │ │ └── sdl_controllers.txt │ │ │ │ │ │ └── tz │ │ │ │ │ ├── lib/ │ │ │ │ │ │ └── put_user_libs_here │ │ │ │ │ ├── lib32/ │ │ │ │ │ │ └── put_32b_user_libs_here │ │ │ │ │ └── scripts/ │ │ │ │ │ └── put_user_scripts_here │ │ │ │ ├── emulationstation/ │ │ │ │ │ └── scripts/ │ │ │ │ │ ├── es_env.sh │ │ │ │ │ ├── inputconfiguration.sh │ │ │ │ │ ├── pixel.sh │ │ │ │ │ ├── setvolume.sh │ │ │ │ │ └── wifi.sh │ │ │ │ ├── profile.d/ │ │ │ │ │ └── 99-emuelec_functions.conf │ │ │ │ ├── retroarch/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── DuckStation/ │ │ │ │ │ │ │ └── DuckStation.opt │ │ │ │ │ │ ├── MAME/ │ │ │ │ │ │ │ └── MAME.opt │ │ │ │ │ │ ├── Mupen64Plus-Next GLES2/ │ │ │ │ │ │ │ └── Mupen64Plus-Next GLES2.opt │ │ │ │ │ │ ├── Neko Project II/ │ │ │ │ │ │ │ └── Neko_Project_II.opt │ │ │ │ │ │ ├── Neko Project II kai/ │ │ │ │ │ │ │ └── Neko_Project_II_kai.opt │ │ │ │ │ │ ├── SwanStation/ │ │ │ │ │ │ │ └── SwanStation.opt │ │ │ │ │ │ └── remappings/ │ │ │ │ │ │ ├── Flycast/ │ │ │ │ │ │ │ └── Flycast.rmp │ │ │ │ │ │ ├── Mupen64Plus/ │ │ │ │ │ │ │ └── Mupen64Plus.rmp │ │ │ │ │ │ ├── Mupen64Plus GLES2/ │ │ │ │ │ │ │ └── Mupen64Plus GLES2.rmp │ │ │ │ │ │ ├── Mupen64Plus-Next/ │ │ │ │ │ │ │ └── Mupen64Plus-Next.rmp │ │ │ │ │ │ ├── Mupen64Plus-Next GLES2/ │ │ │ │ │ │ │ └── Mupen64Plus-Next GLES2.rmp │ │ │ │ │ │ └── ParaLLEl N64/ │ │ │ │ │ │ └── ParaLLEl N64.rmp │ │ │ │ │ └── retroarch-core-options.cfg │ │ │ │ └── system.d/ │ │ │ │ ├── storage-roms.mount.sample │ │ │ │ └── storage-roms.mount.sample.nfs │ │ │ ├── gamepads/ │ │ │ │ ├── 8BitDo SN30 pro.cfg │ │ │ │ ├── GO-Advance Gamepad (rev 1.1).cfg │ │ │ │ ├── GO-Advance Gamepad (rev 1.1)_vertical.cfg │ │ │ │ ├── GO-Advance Gamepad.cfg │ │ │ │ ├── GO-Advance Gamepad_vertical.cfg │ │ │ │ ├── GO-Super Gamepad.cfg │ │ │ │ ├── GO-Super Gamepad_vertical.cfg │ │ │ │ ├── GZ RX CO.,LTD. RX Gamepad.cfg │ │ │ │ ├── Google LLC Stadia Controller rev. A.cfg │ │ │ │ ├── HORI CO.,LTD. HORIPAD S.cfg │ │ │ │ ├── Logitech Gamepad F310.cfg │ │ │ │ ├── PlayGame PS2.cfg │ │ │ │ ├── Sony Interactive Entertainment Wireless Controller.cfg │ │ │ │ ├── Sony PLAYSTATION(R)3 Controller.cfg │ │ │ │ ├── Xbox 360 Controller.cfg │ │ │ │ ├── gameforce_gamepad.cfg │ │ │ │ └── iNNEXT SNES.cfg │ │ │ ├── overlay/ │ │ │ │ ├── bezels/ │ │ │ │ │ └── default.cfg │ │ │ │ └── emuelec/ │ │ │ │ └── scanlines_single_1920x1080.cfg │ │ │ ├── package.mk │ │ │ ├── profile.d/ │ │ │ │ └── 99-emuelec.conf │ │ │ ├── shaders/ │ │ │ │ ├── crt/ │ │ │ │ │ ├── crt-nes-mini.glslp │ │ │ │ │ ├── crt-pi-vertical.glslp │ │ │ │ │ ├── crt-pi.glslp │ │ │ │ │ ├── fakelottes.glslp │ │ │ │ │ ├── scanline.glslp │ │ │ │ │ ├── shaders/ │ │ │ │ │ │ ├── crt-nes-mini.glsl │ │ │ │ │ │ ├── crt-pi-vertical.glsl │ │ │ │ │ │ ├── crt-pi.glsl │ │ │ │ │ │ ├── fakelottes.glsl │ │ │ │ │ │ ├── scanlines.glsl │ │ │ │ │ │ └── zfast_crt.glsl │ │ │ │ │ └── zfast-crt.glslp │ │ │ │ ├── kurg/ │ │ │ │ │ ├── kurg-ROPi-scanlines-3x.glsl │ │ │ │ │ ├── kurg-ROPi-scanlines-3x.glslp │ │ │ │ │ ├── kurg-ROPi-scanlines-3x_v2.glsl │ │ │ │ │ ├── kurg-ROPi-scanlines-3x_v2.glslp │ │ │ │ │ ├── kurg_scanlines_source.glsl │ │ │ │ │ └── kurg_scanlines_source_nearest.glslp │ │ │ │ └── sharp/ │ │ │ │ ├── shaders/ │ │ │ │ │ ├── sharp-bilinear-scanlines.glsl │ │ │ │ │ ├── sharp-bilinear-simple.glsl │ │ │ │ │ └── stock.glsl │ │ │ │ ├── sharp-bilinear-2x-prescale.glslp │ │ │ │ ├── sharp-bilinear-scanlines.glslp │ │ │ │ └── sharp-bilinear-simple.glslp │ │ │ ├── system.d/ │ │ │ │ ├── emuelec-autostart.service │ │ │ │ ├── emuelec-disable_small_cores.service │ │ │ │ ├── emuelec-reboot.service │ │ │ │ ├── emuelec-shutdown.service │ │ │ │ └── emuelec.target │ │ │ └── tmpfiles.d/ │ │ │ └── emuelec-dirs.conf │ │ ├── emuelec-emulationstation/ │ │ │ ├── config/ │ │ │ │ ├── es_features.cfg │ │ │ │ ├── es_input.cfg │ │ │ │ ├── es_settings.cfg │ │ │ │ ├── es_systems.json │ │ │ │ ├── resources/ │ │ │ │ │ └── services/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── main.css │ │ │ │ │ └── main.js │ │ │ │ └── scripts/ │ │ │ │ ├── combined/ │ │ │ │ │ └── example.sh.example │ │ │ │ ├── configscripts/ │ │ │ │ │ ├── gamecontrollerdb.sh │ │ │ │ │ └── retroarch.sh │ │ │ │ └── say/ │ │ │ │ └── 01-say.sh │ │ │ ├── depends/ │ │ │ │ └── fping/ │ │ │ │ └── package.mk │ │ │ ├── generate_es_systems.py │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ └── Rockchip/ │ │ │ │ ├── HH/ │ │ │ │ │ └── emuelec-emulationstation-oga-fixes.patch │ │ │ │ └── emuelec-emulationstation-window-fix-rockchip.patch │ │ │ ├── system.d/ │ │ │ │ └── emustation.service │ │ │ └── themes/ │ │ │ ├── Crystal/ │ │ │ │ ├── Crystal-Collections/ │ │ │ │ │ └── package.mk │ │ │ │ └── package.mk │ │ │ └── es-theme-EmuELEC-carbon/ │ │ │ └── package.mk │ │ ├── emuelec-ports/ │ │ │ ├── VVVVVV/ │ │ │ │ ├── config/ │ │ │ │ │ └── saves/ │ │ │ │ │ └── settings.vvv │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── VVVVVV-01-bios_path.patch │ │ │ ├── abuse/ │ │ │ │ ├── config/ │ │ │ │ │ └── gptokeyb/ │ │ │ │ │ └── abuse.gptk │ │ │ │ └── package.mk │ │ │ ├── augustus/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── 01-augustus-EmuELEC-fixes.patch │ │ │ ├── bennugd-monolithic/ │ │ │ │ ├── package.mk │ │ │ │ └── tre/ │ │ │ │ └── package.mk │ │ │ ├── bermuda/ │ │ │ │ └── package.mk │ │ │ ├── broguece/ │ │ │ │ └── package.mk │ │ │ ├── bstone/ │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── bstone.sh │ │ │ ├── ccleste/ │ │ │ │ └── package.mk │ │ │ ├── cdogs-sdl/ │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── cdogs-sdl.sh │ │ │ ├── celeste/ │ │ │ │ ├── package.mk │ │ │ │ └── sources/ │ │ │ │ ├── celeste.sh │ │ │ │ └── celeste.tar.xz │ │ │ ├── chocolate-doom/ │ │ │ │ ├── config/ │ │ │ │ │ ├── chocolate-doom.cfg │ │ │ │ │ └── default.cfg │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── chocodoom.sh │ │ │ ├── commander-genius/ │ │ │ │ ├── config/ │ │ │ │ │ └── cgenius.cfg │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── commander-genius-02-show-emuelec-rom-path.patch │ │ │ ├── devilutionX/ │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── DevilutionX-fix-mouse.patch │ │ │ │ └── scripts/ │ │ │ │ └── devilutionx.sh │ │ │ ├── eduke/ │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── eduke-04-recast-function.patch │ │ │ │ │ └── eduke-05-fix-emuelec-compile.patch │ │ │ │ └── scripts/ │ │ │ │ └── eduke.sh │ │ │ ├── falloutce1/ │ │ │ │ ├── config/ │ │ │ │ │ └── fallout.cfg │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── falloutce1.sh │ │ │ ├── falloutce2/ │ │ │ │ ├── config/ │ │ │ │ │ └── fallout2.cfg │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── falloutce2.sh │ │ │ ├── fheroes2/ │ │ │ │ ├── config/ │ │ │ │ │ └── fheroes2.cfg │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── fheroes2-01-init-game-controller-unconditionally.patch │ │ │ │ └── scripts/ │ │ │ │ └── fheroes2.sh │ │ │ ├── gzdoom/ │ │ │ │ ├── config/ │ │ │ │ │ ├── N2/ │ │ │ │ │ │ └── gzdoom.ini │ │ │ │ │ └── OGA/ │ │ │ │ │ └── gzdoom.ini │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── 000-fix-build.patch │ │ │ │ ├── scripts/ │ │ │ │ │ └── gzdoom.sh │ │ │ │ └── zmusic/ │ │ │ │ └── package.mk │ │ │ ├── hodesdl/ │ │ │ │ ├── package.mk │ │ │ │ └── sources/ │ │ │ │ └── hode.ini │ │ │ ├── hurrican/ │ │ │ │ ├── config/ │ │ │ │ │ └── gptokeyb/ │ │ │ │ │ └── hurrican.gptk │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── hurrican.sh │ │ │ ├── hydracastlelabyrinth/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── 01-change-back-to-guide.patch │ │ │ ├── lzdoom/ │ │ │ │ ├── config/ │ │ │ │ │ └── lzdoom.ini │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── lzdoom.sh │ │ │ ├── openjazz/ │ │ │ │ └── package.mk │ │ │ ├── opentyrian/ │ │ │ │ ├── config/ │ │ │ │ │ ├── opentyrian.cfg │ │ │ │ │ ├── tyrian.cfg │ │ │ │ │ └── tyrian.sav │ │ │ │ └── package.mk │ │ │ ├── package.mk │ │ │ ├── rigelengine/ │ │ │ │ └── package.mk │ │ │ ├── sdlpop/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── 001-addsdlgamecontrollerdb.patch │ │ │ ├── shovelknight/ │ │ │ │ ├── package.mk │ │ │ │ └── sources/ │ │ │ │ └── shovelknight.sh │ │ │ ├── sonic2013/ │ │ │ │ ├── config/ │ │ │ │ │ └── settings.ini │ │ │ │ └── package.mk │ │ │ ├── soniccd/ │ │ │ │ ├── config/ │ │ │ │ │ └── settings.ini │ │ │ │ ├── libtheora/ │ │ │ │ │ └── package.mk │ │ │ │ └── package.mk │ │ │ ├── sonicmania/ │ │ │ │ ├── config/ │ │ │ │ │ └── Settings.ini │ │ │ │ └── package.mk │ │ │ ├── sources/ │ │ │ │ ├── gamelist.xml.j2 │ │ │ │ ├── port.sh.j2 │ │ │ │ ├── port_builder.py │ │ │ │ └── ports.yaml │ │ │ ├── supermariowar/ │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── supermariowar-emuelec-001-config-path.patch │ │ │ │ └── scripts/ │ │ │ │ └── run_smw.sh │ │ │ ├── supertux/ │ │ │ │ ├── config/ │ │ │ │ │ └── config │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── run_supertux.sh │ │ │ ├── supertuxkart/ │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── run_supertuxkart.sh │ │ │ ├── tmntsr/ │ │ │ │ ├── package.mk │ │ │ │ └── sources/ │ │ │ │ ├── tmntsr.sh │ │ │ │ └── tmntsr.tar.xz │ │ │ └── xash3d/ │ │ │ ├── files/ │ │ │ │ ├── config.cfg │ │ │ │ └── xash3d.sh │ │ │ ├── hlsdk-portable/ │ │ │ │ └── package.mk │ │ │ ├── package.mk │ │ │ └── tmpfiles.d/ │ │ │ └── xash3d.conf │ │ ├── emulators/ │ │ │ ├── PPSSPPSDL/ │ │ │ │ ├── config/ │ │ │ │ │ └── PSP/ │ │ │ │ │ └── SYSTEM/ │ │ │ │ │ ├── Cheats/ │ │ │ │ │ │ ├── NPEG00023.ini │ │ │ │ │ │ ├── NPEG00044.ini │ │ │ │ │ │ ├── NPUG80325.ini │ │ │ │ │ │ ├── UCES00019.ini │ │ │ │ │ │ ├── UCES00842.ini │ │ │ │ │ │ ├── UCES01184.ini │ │ │ │ │ │ ├── UCES01401.ini │ │ │ │ │ │ ├── UCES01473.ini │ │ │ │ │ │ ├── UCUS98640.ini │ │ │ │ │ │ ├── UCUS98653.ini │ │ │ │ │ │ ├── UCUS98668.ini │ │ │ │ │ │ ├── UCUS98737.ini │ │ │ │ │ │ ├── ULES00033.ini │ │ │ │ │ │ ├── ULES00034.ini │ │ │ │ │ │ ├── ULES00035.ini │ │ │ │ │ │ ├── ULES00125.ini │ │ │ │ │ │ ├── ULES00483.ini │ │ │ │ │ │ ├── ULES00625.ini │ │ │ │ │ │ ├── ULES00626.ini │ │ │ │ │ │ ├── ULES00703.ini │ │ │ │ │ │ ├── ULES00968.ini │ │ │ │ │ │ ├── ULES00981.ini │ │ │ │ │ │ ├── ULES00982.ini │ │ │ │ │ │ ├── ULES01214.ini │ │ │ │ │ │ ├── ULES01402.ini │ │ │ │ │ │ ├── ULES01406.ini │ │ │ │ │ │ ├── ULUS00125.ini │ │ │ │ │ │ ├── ULUS10014.ini │ │ │ │ │ │ ├── ULUS10189.ini │ │ │ │ │ │ ├── ULUS10197.ini │ │ │ │ │ │ ├── ULUS10213.ini │ │ │ │ │ │ ├── ULUS10236.ini │ │ │ │ │ │ ├── ULUS10328.ini │ │ │ │ │ │ ├── ULUS10345.ini │ │ │ │ │ │ ├── ULUS10390.ini │ │ │ │ │ │ └── ULUS10507.ini │ │ │ │ │ ├── NPUG80325_ppsspp.ini │ │ │ │ │ ├── UCES00422_ppsspp.ini │ │ │ │ │ ├── UCUS98737_ppsspp.ini │ │ │ │ │ ├── ULUS10001_ppsspp.ini │ │ │ │ │ ├── ULUS10064_ppsspp.ini │ │ │ │ │ ├── controls.ini │ │ │ │ │ └── ppsspp.ini │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── PPSSPPSDL-05-fix-fmv-stutter.patch │ │ │ │ │ └── emuelec-paths.patch │ │ │ │ └── scripts/ │ │ │ │ ├── ppsspp.sh │ │ │ │ ├── ppssppcheevos.sh │ │ │ │ └── set_ppsspp_joy.sh │ │ │ ├── advancemame/ │ │ │ │ ├── bin/ │ │ │ │ │ ├── advmame.sh │ │ │ │ │ └── set_advmame_joy.sh │ │ │ │ ├── config/ │ │ │ │ │ ├── advmame.rc │ │ │ │ │ ├── advmame.rc_gf │ │ │ │ │ └── advmame.rc_oga │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── advancemame-002-fix-vfb.patch │ │ │ │ ├── advancemame-999-modify-advj.patch │ │ │ │ ├── advancemame-fix-slang.patch │ │ │ │ ├── advancemame-fix-vfb-fps.patch │ │ │ │ └── advancemame-return-0-on-terminate.patch │ │ │ ├── amiberry/ │ │ │ │ ├── config/ │ │ │ │ │ └── conf/ │ │ │ │ │ ├── AmigaA1200-default.uae │ │ │ │ │ ├── AmigaA500-default.uae │ │ │ │ │ └── amiberry.conf │ │ │ │ ├── libenet/ │ │ │ │ │ └── package.mk │ │ │ │ ├── libportmidi/ │ │ │ │ │ └── package.mk │ │ │ │ ├── libserialport/ │ │ │ │ │ └── package.mk │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── 001-default_fullscreen.patch │ │ │ │ │ ├── 002-paths.patch │ │ │ │ │ ├── 003-use_udev_gamepad_name.patch │ │ │ │ │ └── fix_fbdev_window.patch │ │ │ │ └── scripts/ │ │ │ │ └── amiberry.start │ │ │ ├── amiberry-lite/ │ │ │ │ ├── config/ │ │ │ │ │ └── conf/ │ │ │ │ │ ├── AmigaA1200-default.uae │ │ │ │ │ ├── AmigaA500-default.uae │ │ │ │ │ ├── adfdir.conf │ │ │ │ │ └── amiberry-lite.conf │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── 001-default_fullscreen.patch │ │ │ │ ├── 002-paths.patch │ │ │ │ ├── 003-use_udev_gamepad_name.patch │ │ │ │ └── fix_fbdev_window.patch │ │ │ ├── atari800sa/ │ │ │ │ └── package.mk │ │ │ ├── biginstinct/ │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── biginstinctstart.sh │ │ │ ├── bigpemu/ │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── bigpemustart.sh │ │ │ ├── box64/ │ │ │ │ └── package.mk │ │ │ ├── box86/ │ │ │ │ └── package.mk │ │ │ ├── dolphinSA/ │ │ │ │ ├── config/ │ │ │ │ │ ├── Dolphin.ini │ │ │ │ │ ├── GCPadNew.ini │ │ │ │ │ ├── GFX.ini │ │ │ │ │ ├── Logger.ini │ │ │ │ │ └── WiimoteNew.ini │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── 000-hotkeys.patch │ │ │ │ │ ├── 001-padorder.patch │ │ │ │ │ └── 002-savestat-names.patch │ │ │ │ └── scripts/ │ │ │ │ ├── dolphin.sh │ │ │ │ └── set_dolphin_joy.sh │ │ │ ├── dosbox-sdl2/ │ │ │ │ ├── config/ │ │ │ │ │ ├── dosbox-SDL2-MT32.conf │ │ │ │ │ ├── dosbox-SDL2.conf │ │ │ │ │ ├── dosbox-SVN.conf │ │ │ │ │ └── games/ │ │ │ │ │ └── + Scan DOSBox Games.sh │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── dosbox-sdl2.995.01-add-mt32emu-MIDI-device.patch │ │ │ │ └── scripts/ │ │ │ │ └── dosbox.start │ │ │ ├── dosbox-staging/ │ │ │ │ ├── config/ │ │ │ │ │ └── dosbox-staging.conf │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── dosbox.start │ │ │ ├── dosbox-x/ │ │ │ │ ├── config/ │ │ │ │ │ ├── dosbox-x-SDL2-MT32.conf │ │ │ │ │ ├── dosbox-x-SDL2.conf │ │ │ │ │ ├── dosbox-x-SVN.conf │ │ │ │ │ └── dosbox-x.conf │ │ │ │ ├── include/ │ │ │ │ │ └── gpio.h │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── 000-arm_configure.patch │ │ │ │ │ ├── 001-sdl-config.patch │ │ │ │ │ └── 003-dosboxconf.patch │ │ │ │ └── scripts/ │ │ │ │ └── dosbox-x.start │ │ │ ├── droidports/ │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── 01-EmuELEC-set-save-path.patch │ │ │ │ └── scripts/ │ │ │ │ └── gmloader.sh │ │ │ ├── duckstation/ │ │ │ │ ├── config/ │ │ │ │ │ └── settings.ini │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── 000-fix-cmake.patch │ │ │ │ │ ├── 001-path-program.patch │ │ │ │ │ ├── 002-path-getdirectory.patch │ │ │ │ │ ├── 003-path-language.patch │ │ │ │ │ └── 006-maxbuttons.patch │ │ │ │ └── scripts/ │ │ │ │ ├── duckstation.sh │ │ │ │ ├── duckstationcheevos.sh │ │ │ │ └── set_duckstation_joy.sh │ │ │ ├── ecwolf/ │ │ │ │ ├── config/ │ │ │ │ │ └── ecwolf.cfg │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── ecwolf-001-add-video-modes.patch │ │ │ │ │ └── ecwolf-002-add-exit-menu.patch │ │ │ │ └── scripts/ │ │ │ │ └── ecwolf.sh │ │ │ ├── eka2l1/ │ │ │ │ ├── config/ │ │ │ │ │ └── eka.gptk │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── ekastart.sh │ │ │ ├── fbneoSA/ │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── fbneoSA-EmuELEC-rom-path.patch │ │ │ │ └── scripts/ │ │ │ │ └── fbneo.sh │ │ │ ├── flycast-dojo/ │ │ │ │ ├── config/ │ │ │ │ │ └── emu.cfg │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── 03-sdl.patch │ │ │ │ │ └── arm/ │ │ │ │ │ └── 01-EmuELEC-fix-arm-compile.patch │ │ │ │ └── scripts/ │ │ │ │ └── flycastdojo.sh │ │ │ ├── flycastsa/ │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── 03-sdl.patch │ │ │ │ │ └── arm/ │ │ │ │ │ └── 01-EmuELEC-fix-arm-compile.patch │ │ │ │ └── scripts/ │ │ │ │ ├── flycast.sh │ │ │ │ ├── flycastcheevos.sh │ │ │ │ └── set_flycast_joy.sh │ │ │ ├── hatarisa/ │ │ │ │ ├── config/ │ │ │ │ │ └── conf/ │ │ │ │ │ └── Atari-ST-default.cfg │ │ │ │ ├── package.mk │ │ │ │ ├── portaudio/ │ │ │ │ │ └── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── hatari.start │ │ │ ├── hypseus-singe/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── hypseus-singe-001-buildfix.patch │ │ │ │ ├── hypseus-singe-002-headersfix.patch │ │ │ │ └── manymouse.patch │ │ │ ├── ikemen-go/ │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── 0001-enhance_joystick_and_game_controller_support.patch │ │ │ │ ├── sdlgamepadmap/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── src/ │ │ │ │ │ └── sdl_gamepadmap.c │ │ │ │ └── src/ │ │ │ │ ├── Ikemen_Go.sh │ │ │ │ └── asound-ikemen.conf │ │ │ ├── jzintv/ │ │ │ │ ├── config/ │ │ │ │ │ └── jzintv_keyb.hack │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── 01-emuelec-only-build-emu.patch │ │ │ │ └── scripts/ │ │ │ │ └── jzintv.sh │ │ │ ├── mesen2/ │ │ │ │ ├── package.mk │ │ │ │ └── sources/ │ │ │ │ └── makefile │ │ │ ├── mupen64plussa/ │ │ │ │ ├── mupen64plussa-audio-sdl/ │ │ │ │ │ └── package.mk │ │ │ │ ├── mupen64plussa-core/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── mupen64plus.cfg │ │ │ │ │ ├── m64p.sh │ │ │ │ │ ├── package.mk │ │ │ │ │ └── set_mupen64_joy.sh │ │ │ │ ├── mupen64plussa-input-sdl/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── InputAutoCfg.ini │ │ │ │ │ └── package.mk │ │ │ │ ├── mupen64plussa-rsp-hle/ │ │ │ │ │ └── package.mk │ │ │ │ ├── mupen64plussa-ui-console/ │ │ │ │ │ └── package.mk │ │ │ │ ├── mupen64plussa-video-glide64mk2/ │ │ │ │ │ └── package.mk │ │ │ │ ├── mupen64plussa-video-rice/ │ │ │ │ │ └── package.mk │ │ │ │ └── package.mk │ │ │ ├── openbor/ │ │ │ │ ├── config/ │ │ │ │ │ ├── gptokeyb/ │ │ │ │ │ │ └── openbor.gptk │ │ │ │ │ └── master.cfg │ │ │ │ ├── openborff/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── master.cfg │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── emuelec-aarch64/ │ │ │ │ │ └── openborff-01-addplatform_fixes.patch │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── 002openbor-defaultfs.patch │ │ │ │ │ ├── 007-version.patch │ │ │ │ │ ├── arm/ │ │ │ │ │ │ └── openbor-02-addplatform.patch │ │ │ │ │ └── emuelec-aarch64/ │ │ │ │ │ └── openbor-02-addplatform.patch │ │ │ │ └── scripts/ │ │ │ │ └── openbor.sh │ │ │ ├── oricutron/ │ │ │ │ ├── config/ │ │ │ │ │ ├── oricutron.cfg │ │ │ │ │ └── oricutron.gptk │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── oricutronstart.sh │ │ │ ├── picodrivesa/ │ │ │ │ └── package.mk │ │ │ ├── scummvmsa/ │ │ │ │ ├── bin/ │ │ │ │ │ └── scummvm.start │ │ │ │ ├── config/ │ │ │ │ │ └── scummvm.ini │ │ │ │ └── package.mk │ │ │ ├── simcoupe/ │ │ │ │ ├── config/ │ │ │ │ │ └── simcoupe.gptk │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── simcoupestart.sh │ │ │ ├── solarus/ │ │ │ │ ├── config/ │ │ │ │ │ └── pads.ini │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── solarus-001-addFindOpenGles2.patch │ │ │ │ │ ├── solarus-002-pad.patch │ │ │ │ │ └── solarus-003-dirs.patch │ │ │ │ └── scripts/ │ │ │ │ └── solarus.sh │ │ │ ├── stellasa/ │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── stella.sh │ │ │ ├── sundog/ │ │ │ │ └── package.mk │ │ │ ├── ti99sim/ │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── ti99sdlstart.sh │ │ │ ├── vector06sdl/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── patch.patch │ │ │ ├── viceSA/ │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── viceSA-001-no-docs.patch │ │ │ │ └── xa/ │ │ │ │ └── package.mk │ │ │ ├── x16/ │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── x16emustart.sh │ │ │ ├── xroar/ │ │ │ │ ├── config/ │ │ │ │ │ └── xroar.gptk │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── xroar.sh │ │ │ ├── yabasanshiroSA_1_11/ │ │ │ │ ├── config/ │ │ │ │ │ └── input.cfg │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── 02-yabasanshiroSA-use-system-libpng.patch │ │ │ │ │ └── 04-yabasanshiroSA-use-paths.patch │ │ │ │ └── scripts/ │ │ │ │ ├── set_yabasanshiro_joy.sh │ │ │ │ └── yabasanshiro.sh │ │ │ └── yabasanshiroSA_1_5/ │ │ │ ├── config/ │ │ │ │ └── input.cfg │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ ├── 01-yabasanshiroSA-EmuELEC-add-missing-include.patch │ │ │ │ ├── 02-yabasanshiroSA-EmuELEC-use-system-libpng.patch │ │ │ │ ├── 03-yabasanshiroSA-removegl3ext.patch │ │ │ │ └── 04-yabasanshiroSA-use-EmuELEC-paths.patch │ │ │ └── scripts/ │ │ │ ├── set_yabasanshiro_joy.sh │ │ │ └── yabasanshiro1_5.sh │ │ ├── libretro/ │ │ │ ├── 2048/ │ │ │ │ └── package.mk │ │ │ ├── 81/ │ │ │ │ └── package.mk │ │ │ ├── a5200/ │ │ │ │ └── package.mk │ │ │ ├── arduous/ │ │ │ │ └── package.mk │ │ │ ├── atari800/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── aarch64/ │ │ │ │ │ └── atari800-01-add-emuelec-platform.patch │ │ │ │ └── arm/ │ │ │ │ └── atari800-01-add-emuelec-platform.patch │ │ │ ├── b2/ │ │ │ │ └── package.mk │ │ │ ├── beetle-gba/ │ │ │ │ └── package.mk │ │ │ ├── beetle-lynx/ │ │ │ │ └── package.mk │ │ │ ├── beetle-ngp/ │ │ │ │ └── package.mk │ │ │ ├── beetle-pce/ │ │ │ │ └── package.mk │ │ │ ├── beetle-pcfx/ │ │ │ │ └── package.mk │ │ │ ├── beetle-psx-hw/ │ │ │ │ └── package.mk │ │ │ ├── beetle-saturn/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── 02.patch │ │ │ ├── beetle-supergrafx/ │ │ │ │ └── package.mk │ │ │ ├── beetle-vb/ │ │ │ │ └── package.mk │ │ │ ├── beetle-wswan/ │ │ │ │ └── package.mk │ │ │ ├── bk/ │ │ │ │ └── package.mk │ │ │ ├── bluemsx/ │ │ │ │ └── package.mk │ │ │ ├── bnes/ │ │ │ │ └── package.mk │ │ │ ├── bsnes_hd/ │ │ │ │ └── package.mk │ │ │ ├── cannonball/ │ │ │ │ └── package.mk │ │ │ ├── cap32/ │ │ │ │ └── package.mk │ │ │ ├── chaigame/ │ │ │ │ └── package.mk │ │ │ ├── chailove/ │ │ │ │ └── package.mk │ │ │ ├── clownmdemu/ │ │ │ │ └── package.mk │ │ │ ├── craft/ │ │ │ │ └── package.mk │ │ │ ├── crocods/ │ │ │ │ └── package.mk │ │ │ ├── daphne/ │ │ │ │ └── package.mk │ │ │ ├── desmume/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── desmume-001-arm64-build-fix.patch │ │ │ │ └── desmume-002-disable-ogl.patch │ │ │ ├── desmume-2015/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── desmume-2015-001-arm64-build-fix.patch │ │ │ ├── dice/ │ │ │ │ └── package.mk │ │ │ ├── dinothawr/ │ │ │ │ └── package.mk │ │ │ ├── dosbox/ │ │ │ │ └── package.mk │ │ │ ├── dosbox-pure/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── dosbox-pure-add-emuelec-platform.patch │ │ │ ├── dosbox-svn/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── dosbox-svn-use-sdl-config.patch │ │ │ ├── duckstation-lr/ │ │ │ │ └── package.mk │ │ │ ├── easyrpg/ │ │ │ │ ├── liblcf/ │ │ │ │ │ └── package.mk │ │ │ │ ├── libspeexdsp/ │ │ │ │ │ └── package.mk │ │ │ │ ├── libxmp-lite/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── sources/ │ │ │ │ │ └── CMakeLists.txt │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── easyrpg-disable-manpage-doxygen.patch │ │ │ ├── emuscv/ │ │ │ │ └── package.mk │ │ │ ├── emux-sms/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── emux-sms-01-buildfix.patch │ │ │ ├── ep128emu/ │ │ │ │ └── package.mk │ │ │ ├── fake_08/ │ │ │ │ └── package.mk │ │ │ ├── fbalpha/ │ │ │ │ └── package.mk │ │ │ ├── fbalpha2012/ │ │ │ │ └── package.mk │ │ │ ├── fbneo/ │ │ │ │ └── package.mk │ │ │ ├── fceumm/ │ │ │ │ └── package.mk │ │ │ ├── fceumm-mod/ │ │ │ │ └── package.mk │ │ │ ├── flycast/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── Amlogic/ │ │ │ │ ├── flycast-01-buildfix.patch │ │ │ │ └── flycast-02-set_optim.patch │ │ │ ├── fmsx-libretro/ │ │ │ │ └── package.mk │ │ │ ├── freechaf/ │ │ │ │ └── package.mk │ │ │ ├── freeintv/ │ │ │ │ └── package.mk │ │ │ ├── freej2me/ │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── 01-emuelec-paths.patch │ │ │ │ └── scripts/ │ │ │ │ └── freej2me.sh │ │ │ ├── frodo/ │ │ │ │ └── package.mk │ │ │ ├── fsuae/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── fsuae-libretro-001-link-glib.patch │ │ │ ├── fuse-libretro/ │ │ │ │ └── package.mk │ │ │ ├── gambatte/ │ │ │ │ └── package.mk │ │ │ ├── gearboy/ │ │ │ │ └── package.mk │ │ │ ├── gearcoleco/ │ │ │ │ └── package.mk │ │ │ ├── geargrafx/ │ │ │ │ └── package.mk │ │ │ ├── gearlynx/ │ │ │ │ └── package.mk │ │ │ ├── gearsystem/ │ │ │ │ └── package.mk │ │ │ ├── genesis-plus-gx/ │ │ │ │ └── package.mk │ │ │ ├── genesis-plus-gx-wide/ │ │ │ │ └── package.mk │ │ │ ├── genesis_plus_gx_cart_special/ │ │ │ │ ├── genesis_plus_gx_cart_special.info │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── ae77caee6d249667d3cbdbb1bcdfa8d5186f949b.patch │ │ │ ├── geolith/ │ │ │ │ └── package.mk │ │ │ ├── gme/ │ │ │ │ └── package.mk │ │ │ ├── gpsp/ │ │ │ │ └── package.mk │ │ │ ├── gw-libretro/ │ │ │ │ └── package.mk │ │ │ ├── handy/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── aarch64/ │ │ │ │ └── handy-01-add-emuelec.patch │ │ │ ├── hatari/ │ │ │ │ └── package.mk │ │ │ ├── imame4all/ │ │ │ │ └── package.mk │ │ │ ├── jaxe/ │ │ │ │ └── package.mk │ │ │ ├── jollycv/ │ │ │ │ └── package.mk │ │ │ ├── libretro-bash-launcher/ │ │ │ │ └── package.mk │ │ │ ├── lowresnx/ │ │ │ │ └── package.mk │ │ │ ├── lr-dolphin/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── 001-openglmessage.patch │ │ │ │ └── dolphin-01-buildfix-libusb.patch │ │ │ ├── lutro/ │ │ │ │ └── package.mk │ │ │ ├── m2000/ │ │ │ │ └── package.mk │ │ │ ├── mame/ │ │ │ │ ├── config/ │ │ │ │ │ ├── MAME/ │ │ │ │ │ │ └── MAME.opt │ │ │ │ │ └── ini/ │ │ │ │ │ ├── fmtownsftv.ini │ │ │ │ │ ├── fmtownshr.ini │ │ │ │ │ ├── fmtownsux.ini │ │ │ │ │ └── mame.ini │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── mame-crosscompile.patch │ │ │ │ │ ├── mame-remove-bgfx.patch │ │ │ │ │ ├── mame-workaround-for-arm-cross-compilation.patch │ │ │ │ │ ├── neww.patch │ │ │ │ │ └── thread-patch │ │ │ │ └── scripts/ │ │ │ │ └── mame.sh │ │ │ ├── mame2000/ │ │ │ │ └── package.mk │ │ │ ├── mame2003/ │ │ │ │ └── package.mk │ │ │ ├── mame2003-midway/ │ │ │ │ └── package.mk │ │ │ ├── mame2003-plus/ │ │ │ │ └── package.mk │ │ │ ├── mame2003-xtreme/ │ │ │ │ ├── package.mk │ │ │ │ └── sources/ │ │ │ │ └── km_mame2003_xtreme_libretro.info │ │ │ ├── mame2010/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── libretro-mame2010-0001_fix-cross-build.patch │ │ │ │ └── libretro-mame2010-0002_fix-cheats.patch │ │ │ ├── mame2015/ │ │ │ │ └── package.mk │ │ │ ├── mame2016/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── 57.patch │ │ │ │ ├── bgfx.patch │ │ │ │ ├── build.patch │ │ │ │ ├── genie.patch │ │ │ │ ├── mame2016-libretro-crosscompile.patch │ │ │ │ ├── pregenerate.patch │ │ │ │ └── pythonfix.patch │ │ │ ├── melonds/ │ │ │ │ └── package.mk │ │ │ ├── meowpc98/ │ │ │ │ └── package.mk │ │ │ ├── mesen/ │ │ │ │ └── package.mk │ │ │ ├── mesen-s/ │ │ │ │ └── package.mk │ │ │ ├── meteor/ │ │ │ │ └── package.mk │ │ │ ├── mgba/ │ │ │ │ └── package.mk │ │ │ ├── minivmac/ │ │ │ │ └── package.mk │ │ │ ├── mojozork/ │ │ │ │ └── package.mk │ │ │ ├── mrboom/ │ │ │ │ └── package.mk │ │ │ ├── multiemu/ │ │ │ │ ├── config/ │ │ │ │ │ └── ini/ │ │ │ │ │ ├── fmtownsftv.ini │ │ │ │ │ ├── fmtownshr.ini │ │ │ │ │ ├── fmtownsux.ini │ │ │ │ │ └── mame.ini │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── fmtownshash.patch │ │ │ │ │ ├── mame-crosscompile.patch │ │ │ │ │ ├── mame-remove-bgfx.patch │ │ │ │ │ ├── mame-workaround-for-arm-cross-compilation.patch │ │ │ │ │ ├── mutex.patch │ │ │ │ │ ├── new.patch │ │ │ │ │ └── thread-patch │ │ │ │ └── scripts/ │ │ │ │ └── multiemu.sh │ │ │ ├── mupen64plus/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── mupen64plus-fixdouble.patch │ │ │ │ ├── mupen64plus-gcc10-32bit-fix.patch │ │ │ │ └── mupen64plus-sx05re-neonfix.patch │ │ │ ├── mupen64plus-nx/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── mupen64plus-nx-01-add-amlogic64.patch │ │ │ ├── mupen64plus-nx-alt/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── mupen64plus-nx-01-add-amlogic64.patch │ │ │ ├── neocd_libretro/ │ │ │ │ └── package.mk │ │ │ ├── nestopia/ │ │ │ │ └── package.mk │ │ │ ├── nestopiaCV/ │ │ │ │ └── package.mk │ │ │ ├── np2kai/ │ │ │ │ └── package.mk │ │ │ ├── nxengine/ │ │ │ │ └── package.mk │ │ │ ├── o2em/ │ │ │ │ └── package.mk │ │ │ ├── opera/ │ │ │ │ └── package.mk │ │ │ ├── parallel-n64/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── emuelec-aarch64/ │ │ │ │ │ └── parallel-n64-add_platform.patch │ │ │ │ └── emuelec-arm32/ │ │ │ │ └── parallel-n64-add_platform.patch │ │ │ ├── pcsx_rearmed/ │ │ │ │ └── package.mk │ │ │ ├── picodrive/ │ │ │ │ └── package.mk │ │ │ ├── pocketcdg/ │ │ │ │ └── package.mk │ │ │ ├── pokemini/ │ │ │ │ └── package.mk │ │ │ ├── potator/ │ │ │ │ └── package.mk │ │ │ ├── ppsspp/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── ppsspp-x86_64-fix.patch │ │ │ ├── prboom/ │ │ │ │ └── package.mk │ │ │ ├── prosystem/ │ │ │ │ └── package.mk │ │ │ ├── psp1/ │ │ │ │ └── package.mk │ │ │ ├── puae/ │ │ │ │ └── package.mk │ │ │ ├── puae2021/ │ │ │ │ └── package.mk │ │ │ ├── px68k/ │ │ │ │ └── package.mk │ │ │ ├── quasi88/ │ │ │ │ └── package.mk │ │ │ ├── quicknes/ │ │ │ │ └── package.mk │ │ │ ├── reminiscence/ │ │ │ │ └── package.mk │ │ │ ├── same_cdi/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── mame-crosscompile.patch │ │ │ ├── sameboy/ │ │ │ │ └── package.mk │ │ │ ├── sameduck/ │ │ │ │ └── package.mk │ │ │ ├── scummvm/ │ │ │ │ └── package.mk │ │ │ ├── snes9x/ │ │ │ │ └── package.mk │ │ │ ├── snes9x2002/ │ │ │ │ └── package.mk │ │ │ ├── snes9x2005/ │ │ │ │ └── package.mk │ │ │ ├── snes9x2005_plus/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── aarch64/ │ │ │ │ │ └── 01-snes9x2005_plux-01-fix-fpic.patch │ │ │ │ └── arm/ │ │ │ │ └── 01-snes9x2005_plux-01-fix-fpic.patch │ │ │ ├── snes9x2010/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── snes9x2010-add-oga.patch │ │ │ ├── spring/ │ │ │ │ ├── package.mk │ │ │ │ └── sources/ │ │ │ │ ├── retroarch32.sh │ │ │ │ ├── spring_pcsx_rearmed32_libretro.info │ │ │ │ ├── spring_ppsspp_libretro.info │ │ │ │ └── spring_shell_libretro.info │ │ │ ├── stella/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── stella-01-emuelec-platform.patch │ │ │ ├── supafaust/ │ │ │ │ └── package.mk │ │ │ ├── swanstation/ │ │ │ │ └── package.mk │ │ │ ├── tgbdual/ │ │ │ │ └── package.mk │ │ │ ├── theodore/ │ │ │ │ └── package.mk │ │ │ ├── tic-80/ │ │ │ │ └── package.mk │ │ │ ├── tyrquake/ │ │ │ │ └── package.mk │ │ │ ├── uae4arm/ │ │ │ │ └── package.mk │ │ │ ├── uzebox/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── uzebox-01-buildfix.patch │ │ │ ├── uzem/ │ │ │ │ └── package.mk │ │ │ ├── vba-next/ │ │ │ │ └── package.mk │ │ │ ├── vbam/ │ │ │ │ └── package.mk │ │ │ ├── vecx/ │ │ │ │ └── package.mk │ │ │ ├── vice/ │ │ │ │ └── package.mk │ │ │ ├── vircon32/ │ │ │ │ └── package.mk │ │ │ ├── virtualjaguar/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── 001-optimize.patch │ │ │ ├── wasm4/ │ │ │ │ └── package.mk │ │ │ ├── xmil/ │ │ │ │ └── package.mk │ │ │ ├── xrick/ │ │ │ │ └── package.mk │ │ │ ├── yabasanshiro/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── aarch64/ │ │ │ │ └── 01-optimization.patch │ │ │ └── yabause/ │ │ │ └── package.mk │ │ ├── libretro_base/ │ │ │ ├── common-shaders/ │ │ │ │ └── package.mk │ │ │ ├── core-info/ │ │ │ │ └── package.mk │ │ │ ├── glsl-shaders/ │ │ │ │ └── package.mk │ │ │ ├── libretro-database/ │ │ │ │ └── package.mk │ │ │ ├── retroarch/ │ │ │ │ ├── modprobe.d/ │ │ │ │ │ └── usbhid.conf │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── 13pixel.patch │ │ │ │ │ ├── Amlogic-old/ │ │ │ │ │ │ └── 01-ALSA_fix.patch │ │ │ │ │ ├── OdroidGoAdvance/ │ │ │ │ │ │ ├── 0001-video_thread_wrapper-implement-RETRO_ENVIRONMENT_GET.patch │ │ │ │ │ │ ├── 999-emuelec-add-vertical.patch │ │ │ │ │ │ ├── 999-enable_rga_scaling_for_gf.patch │ │ │ │ │ │ └── 9999-emuelec-unify-brightness.patch │ │ │ │ │ ├── retroarch-01-xkb-fix.patch │ │ │ │ │ ├── retroarch-02_disable_search.patch │ │ │ │ │ ├── retroarch-04-enablecontent.patch │ │ │ │ │ ├── retroarch-10-Exit_menu.patch │ │ │ │ │ └── retroarch-12-input_sort_devices.patch │ │ │ │ ├── scripts/ │ │ │ │ │ └── retroarch-config │ │ │ │ ├── system.d/ │ │ │ │ │ ├── retroarch.service │ │ │ │ │ ├── tmp-assets.mount │ │ │ │ │ ├── tmp-cores.mount │ │ │ │ │ ├── tmp-database.mount │ │ │ │ │ ├── tmp-joypads.mount │ │ │ │ │ ├── tmp-overlays.mount │ │ │ │ │ └── tmp-shaders.mount │ │ │ │ ├── tmpfiles.d/ │ │ │ │ │ └── retroarch-userdirs.conf │ │ │ │ └── udev.d/ │ │ │ │ ├── 99-8bitdo-bluetooth-controllers.rules │ │ │ │ ├── 99-ION-iCade-bluetooth.rules │ │ │ │ ├── 99-bluetooth-power-on.rules │ │ │ │ ├── 99-evdev.rules │ │ │ │ ├── 99-gen-game-s3-controller.rules │ │ │ │ ├── 99-homatics-gamepad.rules │ │ │ │ ├── 99-juyao-dual-arcade.rules │ │ │ │ ├── 99-nintendo-wii-remote.rules │ │ │ │ ├── 99-ninteno-wii-remote.rules │ │ │ │ ├── 99-nv-shield-controller.rules │ │ │ │ ├── 99-ouya-controller.rules │ │ │ │ └── 99-terios-t3.rules │ │ │ ├── retroarch-assets/ │ │ │ │ └── package.mk │ │ │ ├── retroarch-overlays/ │ │ │ │ └── package.mk │ │ │ └── wii-u-gc-adapter/ │ │ │ ├── package.mk │ │ │ └── system.d/ │ │ │ └── wii-u-gc-adapter.service │ │ └── tools/ │ │ ├── 32bit/ │ │ │ ├── emuelec-32bit-info/ │ │ │ │ └── package.mk │ │ │ └── emuelec-32bit-libs/ │ │ │ ├── infos/ │ │ │ │ ├── flycast_32b_libretro.info │ │ │ │ ├── mupen64plus_32b_libretro.info │ │ │ │ ├── mupen64plus_next_alt_libretro.info │ │ │ │ ├── pcsx_rearmed_32b_libretro.info │ │ │ │ ├── uae4arm_32b_libretro.info │ │ │ │ └── vice_x64dtv_libretro.info │ │ │ └── package.mk │ │ ├── SDL/ │ │ │ └── SDL_net/ │ │ │ └── package.mk │ │ ├── SDL2/ │ │ │ ├── SDL2_gfx/ │ │ │ │ └── package.mk │ │ │ ├── SDL2_image/ │ │ │ │ └── package.mk │ │ │ ├── SDL2_mixer/ │ │ │ │ └── package.mk │ │ │ ├── SDL2_net/ │ │ │ │ └── package.mk │ │ │ ├── SDL2_ttf/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── SDL2_ttf-001-opengl-only-with-x.patch │ │ │ └── SDL_sound/ │ │ │ └── package.mk │ │ ├── btop/ │ │ │ └── package.mk │ │ ├── emuelec-tools/ │ │ │ └── package.mk │ │ ├── qt-everywhere/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── qt-everywhere-5.15.0.GCC11-limits.patch │ │ ├── scrapers/ │ │ │ └── Skyscraper/ │ │ │ ├── config/ │ │ │ │ ├── artwork.xml │ │ │ │ └── config.ini │ │ │ ├── package.mk │ │ │ └── scripts/ │ │ │ └── skyscraper │ │ ├── sdl12-compat/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── fix-pkgconfig.patch │ │ │ └── fix-sdlconfig.patch │ │ ├── sound/ │ │ │ ├── espeak/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── espeak-1.47-ftbs-ld-libm.patch │ │ │ │ ├── espeak-1.47-wav-close.patch │ │ │ │ └── espeak-1.48-gcc-6-fix.patch │ │ │ ├── fluidsynth-git/ │ │ │ │ ├── config/ │ │ │ │ │ └── fluidsynth.conf │ │ │ │ ├── package.mk │ │ │ │ └── system.d/ │ │ │ │ └── fluidsynth.service │ │ │ ├── libvorbisidec/ │ │ │ │ └── package.mk │ │ │ ├── modplug/ │ │ │ │ └── package.mk │ │ │ ├── mpg123-compat/ │ │ │ │ └── package.mk │ │ │ ├── opusfile/ │ │ │ │ └── package.mk │ │ │ ├── soundfont-generaluser/ │ │ │ │ └── package.mk │ │ │ ├── timidity/ │ │ │ │ ├── config/ │ │ │ │ │ ├── GeneralUser.cfg │ │ │ │ │ ├── fluidr3_gm.cfg │ │ │ │ │ ├── fluidr3_gs.cfg │ │ │ │ │ ├── freepats.cfg │ │ │ │ │ ├── soundfont_readme.txt │ │ │ │ │ └── timidity.cfg │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── 02-calcnewt-host-build.patch │ │ │ │ └── 03-ar-cru-fix.patch │ │ │ └── wildmidi/ │ │ │ ├── package.mk │ │ │ └── sources/ │ │ │ └── CMakeLists.txt │ │ ├── sysutils/ │ │ │ ├── 351Files/ │ │ │ │ ├── config/ │ │ │ │ │ └── gptokeyb/ │ │ │ │ │ └── 351Files.gptk │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── 01-EmuELEC.patch │ │ │ ├── MC/ │ │ │ │ ├── etc/ │ │ │ │ │ ├── edit.indent.rc │ │ │ │ │ ├── edit.spell.rc │ │ │ │ │ ├── filehighlight.ini │ │ │ │ │ ├── ini │ │ │ │ │ ├── mc.ext │ │ │ │ │ ├── mc.keymap │ │ │ │ │ ├── mc.keymap.default │ │ │ │ │ ├── mc.keymap.emacs │ │ │ │ │ ├── mc.menu │ │ │ │ │ ├── mc.menu.sr │ │ │ │ │ ├── mcedit.menu │ │ │ │ │ ├── panels.ini │ │ │ │ │ └── sfs.ini │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── MC-01-utf8.patch │ │ │ │ └── profile.d/ │ │ │ │ └── 52-mc.conf │ │ │ ├── SDL_GameControllerDB/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── add-emuelec-gamepads.patch │ │ │ ├── TvTextViewer/ │ │ │ │ └── package.mk │ │ │ ├── bluetool/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── 12.patch │ │ │ ├── coreutils/ │ │ │ │ └── package.mk │ │ │ ├── dasbus/ │ │ │ │ └── package.mk │ │ │ ├── dialog/ │ │ │ │ └── package.mk │ │ │ ├── ee_utils/ │ │ │ │ ├── package.mk │ │ │ │ └── sources/ │ │ │ │ ├── ee_asd.c │ │ │ │ └── ees.c │ │ │ ├── eemount/ │ │ │ │ └── package.mk │ │ │ ├── empty/ │ │ │ │ └── package.mk │ │ │ ├── evdev_tools/ │ │ │ │ ├── package.mk │ │ │ │ └── sources/ │ │ │ │ ├── evkill.c │ │ │ │ ├── evtest.c │ │ │ │ ├── remap.c │ │ │ │ └── send.c │ │ │ ├── exfat/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── 01-no-fuse.patch │ │ │ ├── exfat-linux/ │ │ │ │ └── package.mk │ │ │ ├── fbdump/ │ │ │ │ └── package.mk │ │ │ ├── fbfix/ │ │ │ │ ├── package.mk │ │ │ │ └── sources/ │ │ │ │ └── fbfix.c │ │ │ ├── fbgrab/ │ │ │ │ ├── package.mk │ │ │ │ └── sources/ │ │ │ │ └── screenshot.sh │ │ │ ├── fbterm/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── 0001-fbio.cpp-improxy.cpp-fbterm.cpp-fix-musl-compile.patch │ │ │ │ └── gcc-6-build-fixes.patch │ │ │ ├── freeimage/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── freeimage-02-makefix.patch │ │ │ ├── git/ │ │ │ │ └── package.mk │ │ │ ├── gptokeyb/ │ │ │ │ └── package.mk │ │ │ ├── grep/ │ │ │ │ └── package.mk │ │ │ ├── iotop/ │ │ │ │ └── package.mk │ │ │ ├── joyutils/ │ │ │ │ └── package.mk │ │ │ ├── jslisten/ │ │ │ │ └── package.mk │ │ │ ├── light/ │ │ │ │ └── package.mk │ │ │ ├── luajit/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── luajit-crosscompile.patch │ │ │ ├── munt/ │ │ │ │ ├── munt_alsadrv/ │ │ │ │ │ └── package.mk │ │ │ │ └── package.mk │ │ │ ├── patchelf/ │ │ │ │ └── package.mk │ │ │ ├── physfs/ │ │ │ │ └── package.mk │ │ │ ├── poppler/ │ │ │ │ └── package.mk │ │ │ ├── progressor/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── gles.patch │ │ │ ├── pygame/ │ │ │ │ └── package.mk │ │ │ ├── python-evdev/ │ │ │ │ └── package.mk │ │ │ ├── python3-protobuf/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── python3-protobuf-001-add-experimental_allow_proto3_optional.patch │ │ │ ├── pyudev/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── pyudev-001-libraryfix.patch │ │ │ ├── pyyaml/ │ │ │ │ └── package.mk │ │ │ ├── rclone/ │ │ │ │ ├── bin/ │ │ │ │ │ └── ra_rclone.sh │ │ │ │ ├── config/ │ │ │ │ │ └── emuelec-cloud-filter.cfg │ │ │ │ └── package.mk │ │ │ ├── rs97-commander-sdl2/ │ │ │ │ └── package.mk │ │ │ ├── sdljoytest/ │ │ │ │ └── package.mk │ │ │ ├── sdlterm/ │ │ │ │ ├── package.mk │ │ │ │ └── sources/ │ │ │ │ └── sdlterm.cpp │ │ │ ├── six/ │ │ │ │ └── package.mk │ │ │ ├── sixaxis/ │ │ │ │ ├── package.mk │ │ │ │ ├── system.d/ │ │ │ │ │ └── sixaxis@.service │ │ │ │ └── udev.d/ │ │ │ │ └── 99-sixaxis.rules │ │ │ ├── sixpair/ │ │ │ │ └── package.mk │ │ │ ├── tcpbridge/ │ │ │ │ └── package.mk │ │ │ ├── triggerhappy/ │ │ │ │ └── package.mk │ │ │ ├── vim/ │ │ │ │ └── package.mk │ │ │ ├── wget/ │ │ │ │ └── package.mk │ │ │ ├── xow/ │ │ │ │ └── package.mk │ │ │ └── yasm/ │ │ │ └── package.mk │ │ ├── unused/ │ │ │ ├── eigen/ │ │ │ │ └── package.mk │ │ │ ├── emulators/ │ │ │ │ ├── fba4arm/ │ │ │ │ │ └── package.mk │ │ │ │ ├── mba.mini.plus/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── emuelec-aarch64/ │ │ │ │ │ └── mba.mini.plus-01-add-emuelec-64b.patch │ │ │ │ └── reicastsa/ │ │ │ │ ├── config/ │ │ │ │ │ └── reicast/ │ │ │ │ │ ├── emu_new.cfg │ │ │ │ │ ├── f310.cfg │ │ │ │ │ ├── mappings/ │ │ │ │ │ │ ├── Logitech Gamepad F310.cfg │ │ │ │ │ │ ├── controller_gcwz.cfg │ │ │ │ │ │ ├── controller_generic.cfg │ │ │ │ │ │ ├── controller_pandora.cfg │ │ │ │ │ │ ├── controller_xboxdrv.cfg │ │ │ │ │ │ ├── controller_xpad.cfg │ │ │ │ │ │ └── keyboard.cfg │ │ │ │ │ └── x360.cfg │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── Amlogic/ │ │ │ │ │ │ ├── reicastsa-02-add_platform_OdroidC2.patch │ │ │ │ │ │ └── reicastsa-03-mali.patch │ │ │ │ │ ├── Amlogic-ng/ │ │ │ │ │ │ ├── reicastsa-02-add_platform_OdroidC2.patch │ │ │ │ │ │ ├── reicastsa-03-mali.patch │ │ │ │ │ │ └── reicastsa-05-fix-gles.patch │ │ │ │ │ ├── reicastsa-01-libpng-fix-arm-neon.patch │ │ │ │ │ └── reicastsa-04-fix-neon.patch │ │ │ │ ├── reicastsa_old/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── reicast/ │ │ │ │ │ │ └── emu_old.cfg │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ ├── Amlogic/ │ │ │ │ │ │ └── reicastsa-02-add_platform_OdroidC2.patch │ │ │ │ │ ├── Amlogic-ng/ │ │ │ │ │ │ └── reicastsa-02-add_platform_OdroidC2.patch │ │ │ │ │ ├── reicastsa-01-libpng-fix-arm-neon.patch │ │ │ │ │ └── reicastsa-04-fix-neon.patch │ │ │ │ └── scripts/ │ │ │ │ └── reicast.sh │ │ │ ├── fbida/ │ │ │ │ └── package.mk │ │ │ ├── fbpad/ │ │ │ │ ├── package.mk │ │ │ │ └── sources/ │ │ │ │ ├── Makefile │ │ │ │ ├── conf.h │ │ │ │ ├── courr.tf │ │ │ │ ├── draw.c │ │ │ │ └── fbpad-256 │ │ │ ├── munt_neon/ │ │ │ │ ├── math_neon/ │ │ │ │ │ └── package.mk │ │ │ │ └── package.mk_ │ │ │ └── steam-controller/ │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ ├── steamcontroller-0001-fix-include-dir.patch │ │ │ │ ├── steamcontroller-0002-append-python-path.patch │ │ │ │ ├── steamcontroller-0003-wait-for-controller-connection.patch │ │ │ │ ├── steamcontroller-0004-use-run-for-pid-directory.patch │ │ │ │ └── steamcontroller-0005-steam-client-will-never-be-running.patch │ │ │ └── system.d/ │ │ │ └── driver.steam-controller.service │ │ ├── video/ │ │ │ ├── capsimg/ │ │ │ │ └── package.mk │ │ │ ├── gl4es/ │ │ │ │ ├── axe11/ │ │ │ │ │ ├── X11/ │ │ │ │ │ │ ├── X.h │ │ │ │ │ │ ├── Xatom.h │ │ │ │ │ │ ├── Xdefs.h │ │ │ │ │ │ ├── Xfuncproto.h │ │ │ │ │ │ ├── Xlib.h │ │ │ │ │ │ ├── Xmd.h │ │ │ │ │ │ ├── Xosdefs.h │ │ │ │ │ │ ├── Xutil.h │ │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ │ ├── Xrandr.h │ │ │ │ │ │ │ ├── Xrender.h │ │ │ │ │ │ │ ├── randr.h │ │ │ │ │ │ │ ├── render.h │ │ │ │ │ │ │ ├── xf86vm.h │ │ │ │ │ │ │ └── xf86vmode.h │ │ │ │ │ │ ├── keysym.h │ │ │ │ │ │ └── keysymdef.h │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── 01-EmuELEC-compile-fix.patch │ │ │ │ ├── libglu/ │ │ │ │ │ ├── gl.pc │ │ │ │ │ └── package.mk │ │ │ │ ├── package.mk │ │ │ │ └── pkgconfig/ │ │ │ │ └── gl.pc │ │ │ ├── imagemagick/ │ │ │ │ └── package.mk │ │ │ ├── libdvbpsi/ │ │ │ │ └── package.mk │ │ │ ├── mpv/ │ │ │ │ └── package.mk │ │ │ ├── vlc/ │ │ │ │ └── package.mk │ │ │ └── youtube-dl/ │ │ │ └── package.mk │ │ └── vksdl/ │ │ ├── package.mk │ │ └── virtual_keyboard.cpp │ ├── sysutils/ │ │ ├── bash/ │ │ │ └── package.mk │ │ ├── bkeymaps/ │ │ │ └── package.mk │ │ ├── busybox/ │ │ │ ├── config/ │ │ │ │ ├── busybox-init.conf │ │ │ │ ├── busybox-target.conf │ │ │ │ ├── inputrc │ │ │ │ ├── profile │ │ │ │ └── suspend-modules.conf │ │ │ ├── default.d/ │ │ │ │ └── crond.conf │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ ├── busybox-00_halt_no_init.patch │ │ │ │ ├── busybox-02_silence-crond-startup-logging.patch │ │ │ │ ├── busybox-03-make_unicode_printable.patch │ │ │ │ ├── busybox-04-revert-dd-fsync-change.patch │ │ │ │ ├── busybox-05-update-shadow-or-passwd-not-both.patch │ │ │ │ ├── busybox-06-prevent-root-weak-passwd.patch │ │ │ │ └── busybox-10-add-MS_BIND-option-when-remouting-bind-mount.patch │ │ │ ├── profile.d/ │ │ │ │ ├── 10-locale.conf │ │ │ │ └── 98-busybox.conf │ │ │ ├── scripts/ │ │ │ │ ├── apt-get │ │ │ │ ├── convert_dtname │ │ │ │ ├── create-edid-cpio │ │ │ │ ├── createlog │ │ │ │ ├── dthelper │ │ │ │ ├── dump-active-edids-drm │ │ │ │ ├── fs-resize │ │ │ │ ├── functions │ │ │ │ ├── getedid │ │ │ │ ├── getedid-drm │ │ │ │ ├── init │ │ │ │ ├── kernel-overlays-setup │ │ │ │ ├── ledfix │ │ │ │ ├── libreelec-target-generator │ │ │ │ ├── lsb_release │ │ │ │ ├── pastebinit │ │ │ │ ├── rpi-flash-firmware │ │ │ │ ├── sudo │ │ │ │ ├── update-bootloader-edid-rpi │ │ │ │ └── vfd-clock │ │ │ ├── sleep.d.serial/ │ │ │ │ └── 99-suspend-modules.sh │ │ │ ├── sysctl.d/ │ │ │ │ ├── 99-coredump.conf │ │ │ │ ├── cdrom.conf │ │ │ │ └── memory.conf │ │ │ ├── system.d/ │ │ │ │ ├── fs-resize.service │ │ │ │ ├── fs-resize.target │ │ │ │ ├── ledfix.service │ │ │ │ ├── locale.service │ │ │ │ ├── rpi-flash-firmware.service │ │ │ │ ├── rpi-flash-firmware.target │ │ │ │ ├── shell.service │ │ │ │ ├── show-version.service │ │ │ │ ├── storage-log.service │ │ │ │ ├── textmode.target │ │ │ │ ├── var-log.mount │ │ │ │ ├── var.mount │ │ │ │ └── vfd-clock.service │ │ │ ├── system.d.opt/ │ │ │ │ ├── cron-defaults.service │ │ │ │ └── cron.service │ │ │ └── tmpfiles.d/ │ │ │ └── z_01_busybox.conf │ │ ├── cryptsetup/ │ │ │ └── package.mk │ │ ├── dbus/ │ │ │ └── package.mk │ │ ├── diskdev_cmds/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── diskdev_cmds-332.14-main.patch │ │ ├── dosfstools/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── dosfstools-01-silence_backup_boot_sector_diff.patch │ │ ├── e2fsprogs/ │ │ │ └── package.mk │ │ ├── entropy/ │ │ │ ├── package.mk │ │ │ ├── sources/ │ │ │ │ ├── add-entropy │ │ │ │ └── add-random-at-shutdown │ │ │ └── system.d/ │ │ │ ├── add-entropy.service │ │ │ └── add-random-at-shutdown.service │ │ ├── ethmactool/ │ │ │ ├── package.mk │ │ │ ├── scripts/ │ │ │ │ └── ethmactool-config │ │ │ └── system.d/ │ │ │ └── ethmactool-config.service │ │ ├── eventlircd/ │ │ │ ├── evmap/ │ │ │ │ ├── 03_03eb_0002.evmap │ │ │ │ ├── 03_0419_0001.evmap │ │ │ │ ├── 03_046d_c101.evmap │ │ │ │ ├── 03_05a4_9881.evmap │ │ │ │ ├── 03_05ac_8241.evmap │ │ │ │ ├── 03_0709_9137.evmap │ │ │ │ ├── 03_0755_2626.evmap │ │ │ │ ├── 03_0bc7_0006.evmap │ │ │ │ ├── 03_1241_e000.evmap │ │ │ │ ├── 03_13ec_0006.evmap │ │ │ │ ├── 03_147a_e02d.evmap │ │ │ │ ├── 03_18b1_0037.evmap │ │ │ │ ├── 03_1d57_ac01.evmap │ │ │ │ ├── aftvsremote.evmap │ │ │ │ ├── bdremoteng.evmap │ │ │ │ ├── cypress.evmap │ │ │ │ ├── default.evmap │ │ │ │ ├── mcekbd.evmap │ │ │ │ ├── ps3remote.evmap │ │ │ │ ├── skyqremote.evmap │ │ │ │ ├── spinelplus.evmap │ │ │ │ ├── tevii_s660.evmap │ │ │ │ ├── topseed.evmap │ │ │ │ ├── wiimote.evmap │ │ │ │ ├── xiaomibtremote.evmap │ │ │ │ └── xiaomibtremoteAM.evmap │ │ │ ├── package.mk │ │ │ ├── system.d/ │ │ │ │ └── eventlircd.service │ │ │ ├── tmpfiles.d/ │ │ │ │ └── z_62_eventlircd.conf │ │ │ └── udev.d/ │ │ │ └── 98-eventlircd.rules │ │ ├── evrepeat/ │ │ │ ├── package.mk │ │ │ └── udev.d/ │ │ │ └── 70-input-repeat.rules │ │ ├── exfatprogs/ │ │ │ └── package.mk │ │ ├── fuse/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── fuse-0001_aarch64-support.patch │ │ │ ├── fuse-0002-dont-run-update-rc.d.patch │ │ │ └── fuse-0003-build-with-glibc-2.34.patch │ │ ├── fuse-exfat/ │ │ │ └── package.mk │ │ ├── fuse3/ │ │ │ └── package.mk │ │ ├── gptfdisk/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── 0001-Fix-failure-crash-of-sgdisk-when-compiled-with-lates.patch │ │ │ ├── 0002-Updated-guid.cc-to-deal-with-minor-change-in-libuuid.patch │ │ │ ├── 0003-Updated-URLs-in-man-pages-to-HTTPS-rather-than-HTTP.patch │ │ │ ├── 0004-Fix-NULL-dereference-when-duplicating-string-argumen.patch │ │ │ ├── 0005-Use-64bit-time_t-on-linux-as-well.patch │ │ │ ├── 0006-Allow-partition-dynamically-allocated-by-largest-new.patch │ │ │ ├── 0007-Document-recent-merge.patch │ │ │ ├── 0008-Document-recent-mergest.patch │ │ │ ├── 0009-Do-some-explicit-casts-in-gptcurses.cc-to-eliminate-.patch │ │ │ ├── 0010-Truncate-decimal-inputs-e.g.-9.5G-becomes-9G.patch │ │ │ ├── 0011-Document-previous-merge.patch │ │ │ └── 0012-Minor-code-cleanup-based-on-valgrind-analysis.patch │ │ ├── ir-bpf-decoders/ │ │ │ └── package.mk │ │ ├── keyutils/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── keyutils-02-cflags.patch │ │ ├── kmod/ │ │ │ ├── modprobe.d/ │ │ │ │ ├── aliases.conf │ │ │ │ └── i2c.conf │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── kmod-02_fix-pkgconf.patch │ │ ├── libdevmapper/ │ │ │ └── package.mk │ │ ├── libevdev/ │ │ │ └── package.mk │ │ ├── libhid/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── libhid-0.2.16-automake-1.13.patch │ │ │ ├── libhid-disable_docs.patch │ │ │ └── libhid-use_pkgconfig.patch │ │ ├── libusb/ │ │ │ └── package.mk │ │ ├── libusb-compat/ │ │ │ └── package.mk │ │ ├── lirc/ │ │ │ ├── config/ │ │ │ │ └── lirc_options.conf │ │ │ ├── default.d/ │ │ │ │ └── lircd.conf │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ ├── lirc-0001-fix-zotac-poll.patch │ │ │ │ └── lirc-0100-disable-python.patch │ │ │ ├── scripts/ │ │ │ │ ├── lircd_helper │ │ │ │ └── lircd_uinput_helper │ │ │ ├── system.d/ │ │ │ │ ├── lircd-uinput.service │ │ │ │ ├── lircd.service │ │ │ │ └── lircd.socket │ │ │ └── tmpfiles.d/ │ │ │ └── z_61_lirc.conf │ │ ├── ntfs-3g_ntfsprogs/ │ │ │ └── package.mk │ │ ├── open-iscsi/ │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ ├── open-iscsi-01_dynamic_linked_iscsistart.patch │ │ │ │ ├── open-iscsi-02-cross_compile.patch │ │ │ │ ├── open-iscsi-03_enable-multicast.patch │ │ │ │ ├── open-iscsi-04-no_iscsiuio.patch │ │ │ │ ├── open-iscsi-05-Updates-to-support-gcc-fno-common-option.patch │ │ │ │ ├── open-iscsi-06-Fix-attribute.patch │ │ │ │ └── open-iscsi-07-usr-run-for-config.patch │ │ │ ├── system.d/ │ │ │ │ └── iscsi-initiator.service │ │ │ └── tmpfiles.d/ │ │ │ └── iscsi.conf │ │ ├── open-vm-tools/ │ │ │ ├── package.mk │ │ │ └── system.d/ │ │ │ ├── vmtoolsd.service │ │ │ └── vmware-vmblock-fuse.service │ │ ├── parted/ │ │ │ └── package.mk │ │ ├── pciutils/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── pciutils-01-fix-pkgconf.patch │ │ ├── sed/ │ │ │ └── package.mk │ │ ├── squashfs-tools/ │ │ │ └── package.mk │ │ ├── systemd/ │ │ │ ├── config/ │ │ │ │ ├── hosts.conf │ │ │ │ ├── hwdb.d/ │ │ │ │ │ └── README │ │ │ │ ├── logind.conf.d/ │ │ │ │ │ └── README │ │ │ │ ├── modules-load.d/ │ │ │ │ │ └── README │ │ │ │ ├── sleep.conf.d/ │ │ │ │ │ ├── README │ │ │ │ │ └── sleep.conf.sample │ │ │ │ ├── sysctl.d/ │ │ │ │ │ └── README │ │ │ │ ├── system.d/ │ │ │ │ │ ├── README │ │ │ │ │ ├── cifs.mount.sample │ │ │ │ │ ├── nfs.mount.sample │ │ │ │ │ └── openvpn.service.sample │ │ │ │ ├── timesyncd.conf.d/ │ │ │ │ │ └── README │ │ │ │ ├── tmpfiles.d/ │ │ │ │ │ └── README │ │ │ │ └── udev.rules.d/ │ │ │ │ └── README │ │ │ ├── hwdb.d/ │ │ │ │ └── 70-local-keyboard.hwdb │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ ├── systemd-0001-move-etc-systemd-system-to-storage-.config-system.d.patch │ │ │ │ ├── systemd-0002-move-hwdb.bin-to-run.patch │ │ │ │ ├── systemd-0003-remove-nonexistant-dependency.patch │ │ │ │ ├── systemd-0200-persist-persistent-timer-stamps.patch │ │ │ │ ├── systemd-0300-config-env-unhide-cursor.patch │ │ │ │ ├── systemd-0500-Add-working-directory-storage-for-debug-shell.patch │ │ │ │ ├── systemd-0600-SDCARDFS_SUPER_MAGIC.patch │ │ │ │ └── systemd-501-Start-debug-service-after-locale-to-ensure-file-syst.patch │ │ │ ├── profile.d/ │ │ │ │ └── 90-systemd.conf │ │ │ ├── scripts/ │ │ │ │ ├── cpufreq │ │ │ │ ├── environment-setup │ │ │ │ ├── network-base-setup │ │ │ │ ├── systemd-machine-id-setup │ │ │ │ ├── systemd-timesyncd-setup │ │ │ │ ├── usercache-setup │ │ │ │ └── userconfig-setup │ │ │ ├── system.d/ │ │ │ │ ├── cpufreq.service │ │ │ │ ├── debugconfig.service │ │ │ │ ├── envconfig.service │ │ │ │ ├── flash.mount.d/ │ │ │ │ │ └── dependencies.conf │ │ │ │ ├── machine-id.service │ │ │ │ ├── network-base.service │ │ │ │ ├── storage.mount.d/ │ │ │ │ │ └── dependencies.conf │ │ │ │ ├── systemd-timesyncd-setup.service │ │ │ │ ├── systemd-timesyncd.service.d/ │ │ │ │ │ └── depend-on-kernel-ip-config.conf │ │ │ │ ├── usercache.service │ │ │ │ └── userconfig.service │ │ │ ├── tmpfiles.d/ │ │ │ │ └── z_01_openelec.conf │ │ │ └── udev.d/ │ │ │ └── 60-not-joysticks.rules │ │ ├── terminus-font/ │ │ │ └── package.mk │ │ ├── tz/ │ │ │ ├── package.mk │ │ │ └── system.d/ │ │ │ └── tz-data.service │ │ ├── udevil/ │ │ │ ├── config/ │ │ │ │ └── udevil.conf │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ └── udevil-fix-build.patch │ │ │ ├── system.d/ │ │ │ │ └── udevil-mount@.service │ │ │ └── udev.d/ │ │ │ └── 95-udevil-mount.rules │ │ ├── usbutils/ │ │ │ └── package.mk │ │ ├── util-linux/ │ │ │ ├── config/ │ │ │ │ └── swap.conf │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ └── util-linux-01-fix-pkgconf.patch │ │ │ ├── scripts/ │ │ │ │ └── mount-swap │ │ │ ├── sysctl.d/ │ │ │ │ └── swappiness.conf │ │ │ └── system.d/ │ │ │ ├── fstrim.service │ │ │ ├── fstrim.timer │ │ │ └── swap.service │ │ ├── v4l-utils/ │ │ │ ├── config/ │ │ │ │ ├── rc_keymaps/ │ │ │ │ │ ├── README │ │ │ │ │ └── protocols/ │ │ │ │ │ └── README │ │ │ │ └── rc_maps.cfg.sample │ │ │ ├── keymaps/ │ │ │ │ ├── a95x.toml │ │ │ │ ├── beelink.toml │ │ │ │ ├── beelink_bt_ir.toml │ │ │ │ ├── beelink_pwr_only.toml │ │ │ │ ├── cubox_i.toml │ │ │ │ ├── kvim.toml │ │ │ │ ├── kvim2.toml │ │ │ │ ├── mecool.toml │ │ │ │ ├── minix_neo_pwr_only.toml │ │ │ │ ├── tanix.toml │ │ │ │ ├── xbox_360.toml │ │ │ │ ├── xbox_one.toml │ │ │ │ └── zotac.toml │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ ├── v4l-utils-001-disable-doxygen-in-automake.patch │ │ │ │ ├── v4l-utils-002-support-libbpf-1-0-0.patch │ │ │ │ ├── v4l-utils-003-add-power-on-argument.patch │ │ │ │ └── v4l-utils-003-enable-bpf-without-clang.patch │ │ │ └── udev.d/ │ │ │ └── 70-infrared.rules │ │ └── wait-time-sync/ │ │ ├── package.mk │ │ ├── sources/ │ │ │ ├── Makefile │ │ │ └── wait-time-sync.c │ │ └── system.d/ │ │ └── wait-time-sync.service │ ├── testing/ │ │ └── package.mk │ ├── textproc/ │ │ ├── expat/ │ │ │ └── package.mk │ │ ├── itstool/ │ │ │ └── package.mk │ │ ├── jsoncpp/ │ │ │ └── package.mk │ │ ├── libidn2/ │ │ │ └── package.mk │ │ ├── libxml2/ │ │ │ └── package.mk │ │ ├── libxslt/ │ │ │ └── package.mk │ │ ├── nlohmann-json/ │ │ │ └── package.mk │ │ ├── pugixml/ │ │ │ └── package.mk │ │ ├── tinyxml/ │ │ │ └── package.mk │ │ ├── tinyxml2/ │ │ │ └── package.mk │ │ └── xmlstarlet/ │ │ ├── package.mk │ │ └── patches/ │ │ └── xmlstarlet-0001-usage2c.awk-fix-wrong-basename-regexp.patch │ ├── tools/ │ │ ├── amlogic-boot-fip/ │ │ │ └── package.mk │ │ ├── atf/ │ │ │ └── package.mk │ │ ├── bcm2835-bootloader/ │ │ │ ├── files/ │ │ │ │ ├── config.txt │ │ │ │ ├── distroconfig-composite.txt │ │ │ │ ├── distroconfig.txt │ │ │ │ └── update.sh │ │ │ ├── package.mk │ │ │ └── release │ │ ├── bcmstat/ │ │ │ └── package.mk │ │ ├── crust/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── fix-binutils-2-39.patch │ │ │ └── fix-stack.patch │ │ ├── dt-overlays/ │ │ │ └── package.mk │ │ ├── dtc/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── dtc-0001-libfdt-soname-version.patch │ │ │ ├── dtc-0002-link-with-libfdt-archive.patch │ │ │ └── dtc-0003-Add-Amlogic-multi-dtb-and-add-gzipped-dtb-support.patch │ │ ├── emmctool/ │ │ │ ├── package.mk │ │ │ └── scripts/ │ │ │ └── emmctool │ │ ├── exynos-boot-fip/ │ │ │ └── package.mk │ │ ├── flashrom/ │ │ │ └── package.mk │ │ ├── grub/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── grub-0001-Fix-Werror-array-bounds-array-subscript-0-is-outside-array-bounds.patch │ │ │ ├── grub-0002-lib-reed-solomon-Fix-array-subscript-0-outside-array-bounds.patch │ │ │ └── grub-gnulib-acprereq-2-64.patch │ │ ├── hdparm/ │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ └── hdparm-9.42-cflags.patch │ │ │ └── udev.d/ │ │ │ └── 61-cdrom.rules │ │ ├── installer/ │ │ │ ├── config/ │ │ │ │ └── installer.conf │ │ │ ├── package.mk │ │ │ ├── scripts/ │ │ │ │ └── installer │ │ │ └── system.d/ │ │ │ ├── installer.service │ │ │ └── installer.target │ │ ├── megatools/ │ │ │ └── package.mk │ │ ├── mkbootimg/ │ │ │ └── package.mk │ │ ├── mtools/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── mtools-05-fix-install.patch │ │ ├── nano/ │ │ │ ├── config/ │ │ │ │ └── nanorc │ │ │ ├── package.mk │ │ │ └── profile.d/ │ │ │ └── 52-nano.conf │ │ ├── newt/ │ │ │ └── package.mk │ │ ├── plymouth-lite/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── plymouth-lite-0.6.0-01-fix-build.patch │ │ │ ├── plymouth-lite-0.6.0-02-libpng_1.4.0.patch │ │ │ ├── plymouth-lite-0.6.0-11-cursor.patch │ │ │ ├── plymouth-lite-0.6.0-12-resize.patch │ │ │ ├── plymouth-lite-0.6.0-21-16bpp.patch │ │ │ └── plymouth-lite-0.6.0-22-link-static.patch │ │ ├── populatefs/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── fix-compilation-issue.patch │ │ ├── procps-ng/ │ │ │ └── package.mk │ │ ├── qemu/ │ │ │ └── package.mk │ │ ├── rkbin/ │ │ │ └── package.mk │ │ ├── rpi-eeprom/ │ │ │ ├── config/ │ │ │ │ └── rpi-eeprom-update │ │ │ ├── package.mk │ │ │ └── source/ │ │ │ └── rpi-eeprom-update │ │ ├── splash-image/ │ │ │ └── package.mk │ │ ├── syslinux/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── syslinux-0001-fix-build-with-glibc_2.28.patch │ │ │ └── syslinux-0002-fix-build-with-glibc_2.36.patch │ │ ├── texturecache.py/ │ │ │ └── package.mk │ │ ├── u-boot/ │ │ │ └── package.mk │ │ ├── u-boot-script/ │ │ │ └── package.mk │ │ └── u-boot-tools/ │ │ └── package.mk │ ├── virtual/ │ │ ├── alsa/ │ │ │ └── package.mk │ │ ├── autotools/ │ │ │ └── package.mk │ │ ├── corefonts/ │ │ │ └── package.mk │ │ ├── debug/ │ │ │ └── package.mk │ │ ├── image/ │ │ │ └── package.mk │ │ ├── initramfs/ │ │ │ ├── config/ │ │ │ │ └── initramfs.conf │ │ │ └── package.mk │ │ ├── libc/ │ │ │ └── package.mk │ │ ├── linux-drivers/ │ │ │ └── package.mk │ │ ├── linux-firmware/ │ │ │ └── package.mk │ │ ├── mediacenter/ │ │ │ └── package.mk │ │ ├── misc-packages/ │ │ │ └── package.mk │ │ ├── network/ │ │ │ └── package.mk │ │ ├── remote/ │ │ │ └── package.mk │ │ ├── toolchain/ │ │ │ └── package.mk │ │ ├── virtual/ │ │ │ └── package.mk │ │ ├── wl/ │ │ │ └── package.mk │ │ └── x11/ │ │ └── package.mk │ ├── wayland/ │ │ ├── compositor/ │ │ │ └── sway/ │ │ │ ├── config/ │ │ │ │ ├── colorscheme │ │ │ │ ├── config │ │ │ │ └── sway-daemon.conf │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ ├── sway-100.01-static-ipc-socket.patch │ │ │ │ ├── sway-100.02-allow-running-as-root.patch │ │ │ │ └── sway-100.03-do-not-use-git-version.patch │ │ │ ├── profile.d/ │ │ │ │ └── 04-sway.conf │ │ │ ├── scripts/ │ │ │ │ ├── sway-config │ │ │ │ └── sway.sh │ │ │ └── system.d/ │ │ │ └── sway.service │ │ ├── lib/ │ │ │ ├── fcft/ │ │ │ │ └── package.mk │ │ │ ├── hwdata/ │ │ │ │ └── package.mk │ │ │ ├── seatd/ │ │ │ │ ├── package.mk │ │ │ │ └── system.d/ │ │ │ │ └── seatd.service │ │ │ ├── tllist/ │ │ │ │ └── package.mk │ │ │ └── wlroots/ │ │ │ └── package.mk │ │ ├── libinput/ │ │ │ └── package.mk │ │ ├── libxkbcommon/ │ │ │ └── package.mk │ │ ├── mtdev/ │ │ │ └── package.mk │ │ ├── util/ │ │ │ ├── bemenu/ │ │ │ │ └── package.mk │ │ │ ├── foot/ │ │ │ │ ├── config/ │ │ │ │ │ └── foot.ini │ │ │ │ ├── package.mk │ │ │ │ └── scripts/ │ │ │ │ └── foot.sh │ │ │ ├── swaybg/ │ │ │ │ └── package.mk │ │ │ └── wlr-randr/ │ │ │ └── package.mk │ │ ├── wayland/ │ │ │ └── package.mk │ │ ├── wayland-protocols/ │ │ │ └── package.mk │ │ ├── waylandpp/ │ │ │ └── package.mk │ │ └── weston/ │ │ ├── config/ │ │ │ └── weston.ini │ │ ├── package.mk │ │ ├── profile.d/ │ │ │ └── 04-weston.conf │ │ ├── scripts/ │ │ │ └── weston-config │ │ └── system.d/ │ │ └── weston.service │ ├── web/ │ │ ├── curl/ │ │ │ └── package.mk │ │ ├── libmicrohttpd/ │ │ │ └── package.mk │ │ └── nghttp2/ │ │ └── package.mk │ └── x11/ │ ├── app/ │ │ ├── setxkbmap/ │ │ │ ├── package.mk │ │ │ └── udev.d/ │ │ │ └── 98-xorg-xkb.rules │ │ ├── xkbcomp/ │ │ │ └── package.mk │ │ └── xrandr/ │ │ └── package.mk │ ├── data/ │ │ └── xkeyboard-config/ │ │ └── package.mk │ ├── driver/ │ │ ├── xf86-input-evdev/ │ │ │ └── package.mk │ │ ├── xf86-input-libinput/ │ │ │ └── package.mk │ │ ├── xf86-input-synaptics/ │ │ │ └── package.mk │ │ ├── xf86-video-amdgpu/ │ │ │ └── package.mk │ │ ├── xf86-video-ati/ │ │ │ ├── config/ │ │ │ │ └── xorg-radeon.conf │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── xf86-video-ati-999.01-fix-gcc-10.patch │ │ │ └── xf86-video-ati-999.02-cleanup-terminology-to-use-primary-secondary.patch │ │ ├── xf86-video-intel/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── xf86-video-intel-100.01-prefer-iris-and-crocus-over-i965.patch │ │ ├── xf86-video-nvidia/ │ │ │ ├── config/ │ │ │ │ └── xorg-nvidia.conf │ │ │ ├── package.mk │ │ │ ├── scripts/ │ │ │ │ ├── compare_nvidia.py │ │ │ │ └── make_nvidia_udev.py │ │ │ └── udev.d/ │ │ │ └── 96-nvidia.rules │ │ ├── xf86-video-nvidia-legacy/ │ │ │ ├── config/ │ │ │ │ └── xorg-nvidia-legacy.conf │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── xf86-video-nvidia-legacy-100.01-kernel-5.7.patch │ │ │ ├── xf86-video-nvidia-legacy-100.02-kernel-5.8.patch │ │ │ ├── xf86-video-nvidia-legacy-100.03-kernel-5.9.patch │ │ │ ├── xf86-video-nvidia-legacy-100.04-kernel-5.10.patch │ │ │ ├── xf86-video-nvidia-legacy-100.05-kernel-5.11.patch │ │ │ ├── xf86-video-nvidia-legacy-100.06-kernel-5.14.patch │ │ │ ├── xf86-video-nvidia-legacy-100.07-kernel-5.15.patch │ │ │ ├── xf86-video-nvidia-legacy-100.08-kernel-5.16.patch │ │ │ ├── xf86-video-nvidia-legacy-100.09-kernel-5.17.patch │ │ │ ├── xf86-video-nvidia-legacy-100.10-kernel-5.18.patch │ │ │ └── xf86-video-nvidia-legacy-100.11-kernel-6.0.patch │ │ └── xf86-video-vmware/ │ │ └── package.mk │ ├── font/ │ │ ├── encodings/ │ │ │ └── package.mk │ │ ├── font-bitstream-type1/ │ │ │ └── package.mk │ │ ├── font-cursor-misc/ │ │ │ └── package.mk │ │ ├── font-misc-misc/ │ │ │ └── package.mk │ │ ├── font-util/ │ │ │ └── package.mk │ │ ├── font-xfree86-type1/ │ │ │ └── package.mk │ │ └── liberation-fonts-ttf/ │ │ └── package.mk │ ├── lib/ │ │ ├── libICE/ │ │ │ └── package.mk │ │ ├── libSM/ │ │ │ └── package.mk │ │ ├── libX11/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── libX11-disable_nls_tests.patch │ │ ├── libXau/ │ │ │ └── package.mk │ │ ├── libXcomposite/ │ │ │ └── package.mk │ │ ├── libXdamage/ │ │ │ └── package.mk │ │ ├── libXext/ │ │ │ └── package.mk │ │ ├── libXfixes/ │ │ │ └── package.mk │ │ ├── libXfont2/ │ │ │ └── package.mk │ │ ├── libXi/ │ │ │ └── package.mk │ │ ├── libXinerama/ │ │ │ └── package.mk │ │ ├── libXrandr/ │ │ │ └── package.mk │ │ ├── libXrender/ │ │ │ └── package.mk │ │ ├── libXt/ │ │ │ └── package.mk │ │ ├── libXtst/ │ │ │ └── package.mk │ │ ├── libXxf86vm/ │ │ │ └── package.mk │ │ ├── libfontenc/ │ │ │ └── package.mk │ │ ├── libpciaccess/ │ │ │ └── package.mk │ │ ├── libxcb/ │ │ │ └── package.mk │ │ ├── libxcvt/ │ │ │ └── package.mk │ │ ├── libxkbfile/ │ │ │ └── package.mk │ │ ├── libxshmfence/ │ │ │ └── package.mk │ │ ├── pixman/ │ │ │ └── package.mk │ │ └── xtrans/ │ │ └── package.mk │ ├── other/ │ │ ├── fluxbox/ │ │ │ ├── config/ │ │ │ │ ├── apps │ │ │ │ ├── init │ │ │ │ └── keys │ │ │ ├── package.mk │ │ │ ├── patches/ │ │ │ │ ├── fluxbox-01_hack-avoid-potential-SIGFPE-in-Menu-updateMenu.patch │ │ │ │ ├── fluxbox-02_hide-useless-errors.patch │ │ │ │ ├── fluxbox-03_fixes-bug-1138.patch │ │ │ │ └── fluxbox-dont_build_fbrun.patch │ │ │ └── system.d/ │ │ │ └── windowmanager.service │ │ └── fontconfig/ │ │ └── package.mk │ ├── proto/ │ │ ├── xcb-proto/ │ │ │ └── package.mk │ │ └── xorgproto/ │ │ └── package.mk │ ├── util/ │ │ ├── util-macros/ │ │ │ └── package.mk │ │ └── xorg-launch-helper/ │ │ ├── package.mk │ │ ├── patches/ │ │ │ ├── xorg-launch-helper-automake-1.14.patch │ │ │ ├── xorg-launch-helper-dont-check-for-libsystemd-daemon.patch │ │ │ └── xorg-launch-helper-increase-timeout.patch │ │ └── scripts/ │ │ └── xorg-launch │ └── xserver/ │ └── xorg-server/ │ ├── debug.d/ │ │ └── xorg.conf │ ├── package.mk │ ├── patches/ │ │ ├── xorg-server-100.01-detect-radeon.patch │ │ └── xorg-server-100.02-add-fedora-extra-modes-list.patch │ ├── profile.d/ │ │ └── 11-xorg-server.conf │ ├── scripts/ │ │ └── xorg-configure │ ├── system.d/ │ │ ├── xorg-configure@.service │ │ └── xorg.service │ ├── tmpfiles.d/ │ │ └── z_90_xorg-server.conf │ └── udev.d/ │ └── 97-xorg.rules ├── projects/ │ ├── ARM/ │ │ ├── README.md │ │ ├── devices/ │ │ │ ├── ARMv7/ │ │ │ │ └── options │ │ │ └── ARMv8/ │ │ │ └── options │ │ ├── linux/ │ │ │ ├── linux.aarch64.conf │ │ │ └── linux.arm.conf │ │ └── options │ ├── Allwinner/ │ │ ├── bootloader/ │ │ │ ├── config │ │ │ ├── firmware │ │ │ ├── install │ │ │ ├── mkimage │ │ │ ├── release │ │ │ └── update.sh │ │ ├── devices/ │ │ │ ├── A64/ │ │ │ │ └── options │ │ │ ├── H2-plus/ │ │ │ │ ├── options │ │ │ │ └── patches/ │ │ │ │ └── u-boot/ │ │ │ │ ├── 0001-DO-NOT-MERGE-sunxi-psci-Delegate-PSCI-to-SCPI.patch │ │ │ │ ├── 0007-sunxi-psci-Add-support-for-H3-CPU-0-hotplug.patch │ │ │ │ └── 0010-sunxi-Enable-support-for-SCP-firmware-on-H3.patch │ │ │ ├── H3/ │ │ │ │ ├── options │ │ │ │ └── patches/ │ │ │ │ └── u-boot/ │ │ │ │ ├── 0001-DO-NOT-MERGE-sunxi-psci-Delegate-PSCI-to-SCPI.patch │ │ │ │ ├── 0007-sunxi-psci-Add-support-for-H3-CPU-0-hotplug.patch │ │ │ │ └── 0010-sunxi-Enable-support-for-SCP-firmware-on-H3.patch │ │ │ ├── H5/ │ │ │ │ └── options │ │ │ ├── H6/ │ │ │ │ └── options │ │ │ └── R40/ │ │ │ └── options │ │ ├── filesystem/ │ │ │ └── usr/ │ │ │ ├── bin/ │ │ │ │ ├── cputemp │ │ │ │ ├── gputemp │ │ │ │ └── install2emmc │ │ │ ├── lib/ │ │ │ │ └── systemd/ │ │ │ │ └── sleep.conf.d/ │ │ │ │ └── memonly.conf │ │ │ └── share/ │ │ │ └── alsa/ │ │ │ └── cards/ │ │ │ ├── H3_Audio_Codec.conf │ │ │ ├── simple-card.conf │ │ │ └── sun50i-a64-audi.conf │ │ ├── kodi/ │ │ │ └── appliance.xml │ │ ├── linux/ │ │ │ ├── linux.aarch64.conf │ │ │ └── linux.arm.conf │ │ ├── options │ │ └── patches/ │ │ ├── atf/ │ │ │ ├── 0001-refactor-fdt-introduce-common-fdt_node_is_enabled.patch │ │ │ ├── 0002-fix-allwinner-check-RSB-availability-in-DT-on-H6.patch │ │ │ └── 0003-sunxi-Don-t-enable-referenced-regulators.patch │ │ ├── ffmpeg/ │ │ │ ├── 0001-WIP-deint-filter.patch │ │ │ ├── 0002-libavfilter-v4l2deinterlace-dequeue-both-destination.patch │ │ │ └── 0003-v4l2_request-revert-changes.patch │ │ ├── linux/ │ │ │ ├── 0001-Input-axp20x-pek-allow-wakeup-after-shutdown.patch │ │ │ ├── 0002-clk-Implement-protected-clocks-for-all-OF-clock-prov.patch │ │ │ ├── 0003-Revert-clk-qcom-Support-protected-clocks-property.patch │ │ │ ├── 0004-DO-NOT-MERGE-ARM-dts-sunxi-h3-h5-Protect-SCP-clocks.patch │ │ │ ├── 0005-DO-NOT-MERGE-arm64-dts-allwinner-a64-Protect-SCP-clo.patch │ │ │ ├── 0006-DO-NOT-MERGE-arm64-dts-allwinner-h6-Protect-SCP-cloc.patch │ │ │ ├── 0007-rtc-sun6i-Allow-RTC-wakeup-after-shutdown.patch │ │ │ ├── 0009-firmware-arm_scpi-Support-unidirectional-mailbox-cha.patch │ │ │ ├── 0010-ARM-dts-sunxi-h3-h5-Add-SCPI-protocol.patch │ │ │ ├── 0011-arm64-dts-allwinner-a64-Add-SCPI-protocol.patch │ │ │ ├── 0012-arm64-dts-allwinner-h6-Add-SCPI-protocol.patch │ │ │ ├── 0013-ASoC-hdmi-codec-fix-channel-allocation.patch │ │ │ ├── 0014-drm_call_drm_atomic_helper_shutdown_at_shutdown.patch │ │ │ ├── 0020-media-cedrus-Add-callback-for-buffer-cleanup.patch │ │ │ ├── 0021-media-cedrus-hevc-Improve-buffer-management.patch │ │ │ ├── 0022-media-cedrus-h264-Improve-buffer-management.patch │ │ │ ├── 0024-WIP-dw-hdmi-cec-sleep-100ms-on-error.patch │ │ │ ├── 0027-drm-sun4i-mixer-Add-caching-support.patch │ │ │ ├── 0028-mfd-Add-support-for-AC200.patch │ │ │ ├── 0029-net-phy-Add-support-for-AC200-EPHY.patch │ │ │ ├── 0030-wip-H6-deinterlace.patch │ │ │ ├── 0031-arm64-dts-h6-deinterlace.patch │ │ │ ├── 0033-WIP-I2S-multi-channel.patch │ │ │ ├── 0034-HACK-h3-h5-Add-HDMI-sound-card.patch │ │ │ ├── 0036-wip-h3-h5-cvbs.patch │ │ │ ├── 0039-HACK-a64-Add-HDMI-sound-card.patch │ │ │ ├── 0041-bpi-m2u-analog-codec.patch │ │ │ ├── 0042-r40-hdmi-audio-wip.patch │ │ │ ├── 0043-HACK-h6-Add-HDMI-sound-card.patch │ │ │ ├── 0044-net-stmmac-sun8i-Use-devm_regulator_get-for-PHY-regu.patch │ │ │ ├── 0045-net-stmmac-sun8i-Rename-PHY-regulator-variable-to-re.patch │ │ │ ├── 0046-net-stmmac-sun8i-Add-support-for-enabling-a-regulato.patch │ │ │ ├── 0047-arm64-dts-allwinner-orange-pi-3-Enable-ethernet.patch │ │ │ ├── 0048-arm64-allwinner-dts-h6-enable-USB3-port-on-Pine-H64.patch │ │ │ ├── 0049-arm64-dts-allwinner-h6-Add-AC200-EPHY-related-nodes.patch │ │ │ ├── 0051-arm64-dts-allwinner-h6-tanix-tx6-enable-ethernet.patch │ │ │ ├── 0052-arm64-allwinner-h6-Enable-USB3-for-OrangePi-Lite2.patch │ │ │ ├── 0053-mmc-sunxi-fix-unusuable-eMMC-on-some-H6-boards-by-di.patch │ │ │ ├── 0054-arm64-dts-allwinner-h6-tanix-tx6-enable-rtw88-wifi-in-dts.patch │ │ │ ├── 0055-WIp-10-bit-HEVC-support.patch │ │ │ ├── 0056-bluetooth-btrtl-add-hci-ver-rtl8822cs.patch │ │ │ ├── 0057-HACK-Disable-MBUS-due-to-fw_devlink-on.patch │ │ │ ├── 0058-WIP-OPi3-DT-fixes.patch │ │ │ ├── 0060-WIP-drm-bridge-synopsys-Fix-CEC-not-working-after-power.patch │ │ │ ├── 0061-media--cedrus--Don-t-CPU-map-source-buffers.patch │ │ │ ├── 0063-HACK-SW-CEC-implementation-for-H3.patch │ │ │ ├── 0065-wip-fix-H6-4k-60.patch │ │ │ ├── 0066-arm64-dts-allwinner-h6-Fix-Cedrus-IOMMU-again.patch │ │ │ ├── 0073-iommu-sun50i-Allow-page-sizes-multiple-of-4096.patch │ │ │ ├── 0075-Revert-drm-sun4i-dw-hdmi-Fix-ddc-en-GPIO-consumer-co.patch │ │ │ ├── 0076-net-phy-add-support-for-motorcomm-yt8531c-phy.patch │ │ │ ├── 0077-OrangePi-3-LTS-support.patch │ │ │ ├── 0100-tanix-mmc-rtw88-keep-power-in-suspend.patch │ │ │ ├── 0101-Bluetooth-btrtl-Add-support-for-RTL8822BS.patch │ │ │ ├── 0105-ARM-dts-sun8i-r40-Add-interconnect-to-video-codec.patch │ │ │ ├── 0106-media-cedrus-h265-Fix-configuring-bitstream-size.patch │ │ │ └── 0107-wip-media-sunxi-sun8i-di-fix-race-condition.patch │ │ └── u-boot/ │ │ ├── 0001-Kconfig-Remove-an-impossible-condition.patch │ │ ├── 0002-binman-Prevent-entries-in-a-section-from-overlapping.patch │ │ ├── 0003-sunxi-binman-Enable-SPL-FIT-loading-for-32-bit-SoCs.patch │ │ ├── 0005-sunxi-psci-Avoid-hanging-when-CPU-0-is-hot-unplugged.patch │ │ ├── 0008-remoteproc-Add-a-driver-for-the-Allwinner-AR100.patch │ │ ├── 0009-arm-dts-sunxi-h3-Add-nodes-for-AR100-remoteproc.patch │ │ ├── 0010-sunxi-Add-OrangePi-3-LTS-board.patch │ │ ├── 0011-arm-psci-Add-definitions-for-PSCI-v1.1.patch │ │ ├── 0012-DO-NOT-MERGE-sunxi-Enable-remoteproc-on-H3.patch │ │ ├── 0013-sunxi-mmc-increase-stabilization-delay-from-1ms-to-20ms.patch │ │ └── 0014-sunxi-dram-Fix-incorrect-ram-size-detection-for-some-H6-boards.patch │ ├── Amlogic/ │ │ ├── README.md │ │ ├── bootloader/ │ │ │ ├── box.ini │ │ │ ├── canupdate.sh │ │ │ ├── config │ │ │ ├── install │ │ │ ├── mkimage │ │ │ ├── release │ │ │ ├── scripts/ │ │ │ │ ├── aml_autoscript.src │ │ │ │ ├── boot.scr.src │ │ │ │ ├── emmc_autoscript.src │ │ │ │ └── s905_autoscript.src │ │ │ └── update.sh │ │ ├── devices/ │ │ │ └── AMLGX/ │ │ │ ├── options │ │ │ └── patches/ │ │ │ └── linux/ │ │ │ ├── amlogic-0001-LOCAL-set-meson-gx-cma-pool-to-896MB.patch │ │ │ ├── amlogic-0002-LOCAL-set-meson-g12-cma-pool-to-896MB.patch │ │ │ ├── amlogic-0003-LOCAL-arm64-fix-Kodi-sysinfo-CPU-information.patch │ │ │ ├── amlogic-0004-LOCAL-arm64-meson-add-Amlogic-Meson-GX-PM-Suspend.patch │ │ │ ├── amlogic-0005-LOCAL-arm64-dts-meson-add-support-for-GX-PM-and-Virt.patch │ │ │ ├── amlogic-0006-LOCAL-arm64-dts-meson-add-rtc-vrtc-aliases-to-Khadas.patch │ │ │ ├── amlogic-0007-LOCAL-arm64-dts-meson-add-rtc-vrtc-aliases-to-Khadas.patch │ │ │ ├── amlogic-0008-LOCAL-arm64-dts-meson-add-rtc-vrtc-aliases-to-Minix-.patch │ │ │ ├── amlogic-0009-LOCAL-ALSA-Assign-internal-PCM-chmap-ELD-IEC958-kctl.patch │ │ │ ├── amlogic-0010-LOCAL-usb-hub-disable-autosuspend-for-Genesys-Logic-.patch │ │ │ ├── amlogic-0011-LOCAL-of-partial-revert-of-fdt.c-changes.patch │ │ │ ├── amlogic-0012-FROMGIT-FIXES-drm-meson-meson_venc-Relax-the-support.patch │ │ │ ├── amlogic-0014-FROMGIT-6.2-Revert-arm64-dts-meson-sm1-odroid-hc4-di.patch │ │ │ ├── amlogic-0015-FROMGIT-6.3-arm64-dts-meson-add-Broadcom-WiFi-to-P21.patch │ │ │ ├── amlogic-0016-FROMGIT-6.3-arm64-dts-meson-move-pwm_ef-node-in-P212.patch │ │ │ ├── amlogic-0017-FROMGIT-6.3-arm64-dts-meson-remove-WiFi-BT-nodes-fro.patch │ │ │ ├── amlogic-0018-FROMGIT-6.3-arm64-dts-meson-add-audio-playback-to-S9.patch │ │ │ ├── amlogic-0019-FROMGIT-6.3-dt-bindings-reset-meson-g12a-Add-missing.patch │ │ │ ├── amlogic-0020-FROMGIT-6.3-dt-bindings-power-Add-G12A-NNA-power-dom.patch │ │ │ ├── amlogic-0021-FROMGIT-6.3-soc-amlogic-meson-pwrc-Add-NNA-power-dom.patch │ │ │ ├── amlogic-0022-FROMGIT-6.3-arm64-dts-Add-DT-node-for-the-VIPNano-QI.patch │ │ │ ├── amlogic-0023-FROMGIT-6.3-drm-etnaviv-Add-nn_core_count-to-chip-fe.patch │ │ │ ├── amlogic-0024-FROMGIT-6.3-drm-etnaviv-Warn-when-probing-on-NPUs.patch │ │ │ ├── amlogic-0025-FROMGIT-6.3-drm-etnaviv-add-HWDB-entry-for-VIPNano-Q.patch │ │ │ ├── amlogic-0026-FROMGIT-6.3-arm64-dts-Fix-NPU-power-domain-reference.patch │ │ │ ├── amlogic-0027-FROMGIT-6.3-clk-meson-mpll-Switch-from-.round_rate-t.patch │ │ │ ├── amlogic-0028-FROMGIT-6.3-clk-meson-dualdiv-switch-from-.round_rat.patch │ │ │ ├── amlogic-0029-FROMGIT-6.3-clk-meson-sclk-div-switch-from-.round_ra.patch │ │ │ ├── amlogic-0030-FROMGIT-6.3-clk-meson-clk-cpu-dyndiv-switch-from-.ro.patch │ │ │ ├── amlogic-0031-FROMGIT-6.3-arm64-dts-meson-make-dts-use-gpio-fan-ma.patch │ │ │ ├── amlogic-0032-FROMGIT-6.3-arm64-dts-meson-meson-sm1-bananapi-m5-co.patch │ │ │ ├── amlogic-0033-FROMGIT-6.3-dt-bindings-arm-amlogic-add-support-for-.patch │ │ │ ├── amlogic-0034-FROMGIT-6.3-arm64-dts-meson-add-support-for-BananaPi.patch │ │ │ ├── amlogic-0035-FROMGIT-6.3-dt-bindings-arm-amlogic-add-support-for-.patch │ │ │ ├── amlogic-0036-FROMGIT-6.3-arm64-dts-meson-add-support-for-Radxa-Ze.patch │ │ │ ├── amlogic-0037-FROMGIT-6.4-dt-bindings-net-add-amlogic-gxl-mdio-mul.patch │ │ │ ├── amlogic-0038-FROMGIT-6.4-net-mdio-add-amlogic-gxl-mdio-mux-suppor.patch │ │ │ ├── amlogic-0039-FROMGIT-6.4-mmc-meson-gx-remove-meson_mmc_get_cd.patch │ │ │ ├── amlogic-0040-FROMGIT-6.4-media-meson-vdec-remove-redundant-if-sta.patch │ │ │ ├── amlogic-0041-FROMGIT-6.4-dt-bindings-media-rc-add-rc-dreambox-bin.patch │ │ │ ├── amlogic-0042-FROMGIT-6.4-media-rc-add-common-keymap-for-Dreambox-.patch │ │ │ ├── amlogic-0043-FROMGIT-6.4-dt-bindings-media-rc-add-rc-beelink-mxii.patch │ │ │ ├── amlogic-0044-FROMGIT-6.4-media-rc-add-Beelink-Mini-MXIII-keymap.patch │ │ │ ├── amlogic-0045-FROMGIT-6.4-arm64-dts-meson-gxbb-kii-pro-sort-and-ti.patch │ │ │ ├── amlogic-0046-FROMGIT-6.4-arm64-dts-meson-gxbb-kii-pro-complete-th.patch │ │ │ ├── amlogic-0047-FROMGIT-6.4-arm64-dts-meson-gxbb-kii-pro-add-initial.patch │ │ │ ├── amlogic-0048-FROMGIT-6.4-dt-bindings-arm-amlogic-Document-the-boa.patch │ │ │ ├── amlogic-0049-FROMGIT-6.4-arm64-dts-amlogic-Add-initial-support-fo.patch │ │ │ ├── amlogic-0051-FROMLIST-v5-dt-bindings-vendor-prefixes-Add-Titan-Mi.patch │ │ │ ├── amlogic-0052-FROMLIST-v5-dt-bindings-auxdisplay-Add-Titan-Micro-E.patch │ │ │ ├── amlogic-0053-FROMLIST-v5-docs-ABI-document-tm1628-attribute-displ.patch │ │ │ ├── amlogic-0054-FROMLIST-v5-auxdisplay-add-support-for-Titanmec-TM16.patch │ │ │ ├── amlogic-0055-FROMLIST-v5-arm64-dts-meson-gxl-s905w-tx3-mini-add-s.patch │ │ │ ├── amlogic-0056-FROMLIST-v5-MAINTAINERS-Add-entry-for-tm1628-auxdisp.patch │ │ │ ├── amlogic-0057-FROMLIST-v1-ASoC-hdmi-codec-reorder-channel-allocati.patch │ │ │ ├── amlogic-0058-FROMLIST-v1-media-meson-vdec-esparser-check-parsing-.patch │ │ │ ├── amlogic-0059-FROMLIST-v2-media-meson-vdec-implement-10bit-bitstre.patch │ │ │ ├── amlogic-0060-FROMLIST-v2-media-meson-vdec-add-HEVC-decode-codec.patch │ │ │ ├── amlogic-0061-FROMLIST-v2-dt-bindings-serial-amlogic-meson-uart-Ad.patch │ │ │ ├── amlogic-0062-FROMLIST-v2-tty-serial-meson-Add-a-new-compatible-st.patch │ │ │ ├── amlogic-0063-FROMLIST-v2-arm64-dts-meson-g12-common-Use-the-G12A-.patch │ │ │ ├── amlogic-0064-WIP-media-meson-vdec-disable-MPEG1-MPEG2-hardware-de.patch │ │ │ ├── amlogic-0065-WIP-arm64-dts-meson-set-p212-p23x-q20x-SDIO-to-100MH.patch │ │ │ ├── amlogic-0066-WIP-arm64-dts-meson-add-UHS-SDIO-capabilities-to-p21.patch │ │ │ ├── amlogic-0067-WIP-arm64-dts-meson-remove-SDIO-node-from-Khadas-VIM.patch │ │ │ ├── amlogic-0068-WIP-arm64-dts-meson-add-audio-playback-to-p201.patch │ │ │ ├── amlogic-0069-WIP-arm64-dts-meson-add-audio-playback-to-p200.patch │ │ │ ├── amlogic-0070-WIP-arm64-dts-meson-add-audio-playback-to-u200.patch │ │ │ ├── amlogic-0071-WIP-arm64-dts-meson-add-Headphone-output-to-Beelink-.patch │ │ │ ├── amlogic-0072-WIP-dt-bindings-arm-amlogic-add-support-for-the-Tani.patch │ │ │ ├── amlogic-0073-WIP-arm64-dts-meson-add-support-for-the-Tanix-TX5-Ma.patch │ │ │ ├── amlogic-0074-WIP-arm64-dts-meson-add-multiple-MeCool-device-trees.patch │ │ │ ├── amlogic-0075-WIP-dt-bindings-arm-amlogic-add-support-for-Minix-NE.patch │ │ │ ├── amlogic-0076-WIP-arm64-dts-meson-add-initial-device-tree-for-Mini.patch │ │ │ ├── amlogic-0077-LOCAL-arm64-dts-meson-add-rtc-vrtc-aliases-to-Minix-.patch │ │ │ ├── amlogic-0078-WIP-dt-bindings-arm-amlogic-add-support-for-Beelink-.patch │ │ │ ├── amlogic-0079-WIP-arm64-dts-meson-add-support-for-Beelink-Mini-MXI.patch │ │ │ ├── amlogic-0080-WIP-media-rc-add-keymap-for-MeCool-M8S-Pro-W-remote.patch │ │ │ ├── amlogic-0081-WIP-dt-bindings-arm-amlogic-add-support-for-MeCool-M.patch │ │ │ ├── amlogic-0082-WIP-arm64-dts-meson-add-support-for-MeCool-M8S-Pro-W.patch │ │ │ ├── amlogic-0083-WIP-dt-bindings-arm-amlogic-add-Vero-4K-binding.patch │ │ │ ├── amlogic-0084-WIP-arm64-dts-meson-add-support-for-OSMC-Vero-4K.patch │ │ │ ├── amlogic-0085-WIP-arm64-dts-meson-sm1-x96-air-add-RTL8822CS-WiFi-a.patch │ │ │ ├── amlogic-0086-WIP-media-rc-add-keymap-for-Venz-V10-remote.patch │ │ │ ├── amlogic-0087-WIP-dt-bindings-arm-amlogic-add-S905L-and-Venz-V10-b.patch │ │ │ ├── amlogic-0088-WIP-arm64-dts-meson-add-support-for-Venz-V10.patch │ │ │ ├── amlogic-0089-WIP-dt-bindings-vendor-prefixes-add-tbee-prefix.patch │ │ │ ├── amlogic-0090-WIP-dt-bindings-arm-amlogic-add-TBee-Box-binding.patch │ │ │ ├── amlogic-0091-WIP-arm64-dts-meson-add-support-for-TBee-Box.patch │ │ │ ├── amlogic-0092-WIP-dt-bindings-arm-amlogic-add-Beelink-GT1-binding.patch │ │ │ ├── amlogic-0093-WIP-arm64-dts-meson-add-support-for-Beelink-GT1.patch │ │ │ ├── amlogic-0094-WIP-arm64-dts-meson-add-vcc_5v-regulator-to-WeTek-dt.patch │ │ │ ├── amlogic-0095-WIP-arm64-dts-meson-add-audio-lineout-to-WeTek-Play2.patch │ │ │ ├── amlogic-0096-WIP-arm64-dts-amlogic-fix-cvbs-disable-on-WeTek-Hub.patch │ │ │ ├── amlogic-0097-WIP-ASoC-dt-bindings-add-compatible-for-es8323-i2c.patch │ │ │ ├── amlogic-0098-WIP-ASoC-codecs-add-support-for-ES8323.patch │ │ │ ├── amlogic-0099-WIP-dt-bindings-add-dream-vendor-prefix.patch │ │ │ ├── amlogic-0100-WIP-dt-bindings-arm-amlogic-add-support-for-Dreambox.patch │ │ │ ├── amlogic-0101-WIP-arm64-dts-meson-add-initial-device-trees-for-Dre.patch │ │ │ ├── amlogic-0102-WIP-dt-bindings-arm-amlogic-add-support-for-Ugoos-AM.patch │ │ │ ├── amlogic-0103-WIP-arm64-dts-meson-add-support-for-Ugoos-AM6-Plus.patch │ │ │ ├── amlogic-0104-WIP-arm64-dts-meson-add-support-for-MeCool-M8S-Pro-P.patch │ │ │ ├── amlogic-0105-WIP-arm64-dts-meson-radxa-zero2-add-pwm-fan-support.patch │ │ │ ├── amlogic-0106-WIP-dt-bindings-arm-amlogic-add-support-for-Tanix-TX.patch │ │ │ ├── amlogic-0107-WIP-arm64-dts-meson-add-initial-device-tree-for-Tani.patch │ │ │ ├── amlogic-0108-WIP-arm64-dts-meson-add-7-segment-display-to-Tanix-T.patch │ │ │ ├── amlogic-0109-WIP-net-phy-add-support-for-Maxio-MAE0621A.patch │ │ │ ├── amlogic-0110-WIP-dt-bindings-add-sunvell-vendor-prefix.patch │ │ │ ├── amlogic-0111-WIP-dt-bindings-media-rc-add-rc-sunvell-t95z-plus.patch │ │ │ ├── amlogic-0112-WIP-media-rc-add-keymap-for-Sunvell-T95Z-Plus.patch │ │ │ ├── amlogic-0113-WIP-dt-bindings-arm-amlogic-add-support-for-Sunvell-.patch │ │ │ ├── amlogic-0114-WIP-arm64-dts-meson-add-support-for-Sunvell-T95Z-Plu.patch │ │ │ ├── amlogic-0115-WIP-arm64-dts-meson-add-SPI-VFD-to-Sunvell-T95Z-Plus.patch │ │ │ ├── amlogic-0116-WIP-dt-bindings-arm-amlogic-add-support-for-BananaPi.patch │ │ │ ├── amlogic-0117-WIP-arm64-dts-meson-add-support-for-BananaPi-M2S-var.patch │ │ │ ├── amlogic-0118-WIP-arm64-dts-meson-p23x-q20x-fix-usb-init-don-t-for.patch │ │ │ ├── amlogic-0119-WIP-arm64-dts-meson-add-WiFi-BT-support-to-BananaPi-.patch │ │ │ └── amlogic-0120-WIP-media-meson-vdec-fix-memory-leak-of-new_frame.patch │ │ ├── filesystem/ │ │ │ └── usr/ │ │ │ └── bin/ │ │ │ └── cputemp │ │ ├── kodi/ │ │ │ └── appliance.xml │ │ ├── linux/ │ │ │ └── linux.aarch64.conf │ │ ├── options │ │ ├── packages/ │ │ │ └── systemd/ │ │ │ └── scripts/ │ │ │ └── cpufreq │ │ └── patches/ │ │ ├── alsa-lib/ │ │ │ ├── amlogic-0001-WIP-add-confs-for-gx-sound-card-and-axg-sound-card.patch │ │ │ └── amlogic-0002-WIP-add-Amlogic-cards-to-Makefile.am.patch │ │ ├── ffmpeg/ │ │ │ ├── ffmpeg-hevc-001.patch │ │ │ ├── ffmpeg-hevc-002.patch │ │ │ └── ffmpeg-hevc-003.patch │ │ └── u-boot/ │ │ ├── u-boot-0001-LOCAL-configs-meson64-prevent-stdout-stderr-on-video.patch │ │ ├── u-boot-0002-LOCAL-configs-meson64-remove-amlogic-so-fdtdir-finds.patch │ │ ├── u-boot-0003-LOCAL-board-amlogic-odroid-n2-remove-amlogic-prefix-.patch │ │ ├── u-boot-0004-BACKPORT-arm64-dts-meson-nanopi-k2-readd-PHY-reset-p.patch │ │ ├── u-boot-0005-WIP-ARM-dts-import-WeTek-Hub-Play2-DTs-from-Linux-5..patch │ │ ├── u-boot-0006-WIP-ARM-dts-use-snps-reset-on-WeTek-devices-to-fix-E.patch │ │ ├── u-boot-0007-WIP-boards-amlogic-add-board-files-for-wetek-gxbb-de.patch │ │ ├── u-boot-0008-WIP-boards-amlogic-add-WeTek-Hub-defconfig.patch │ │ ├── u-boot-0009-WIP-boards-amlogic-add-WeTek-Play2-defconfig.patch │ │ ├── u-boot-0010-WIP-ARM-dts-add-support-for-Radxa-Zero2.patch │ │ ├── u-boot-0011-WIP-boards-amlogic-add-Radxa-Zero2-defconfig.patch │ │ ├── u-boot-0012-WIP-doc-boards-amlogic-update-for-Radxa-Zero2.patch │ │ ├── u-boot-0013-WIP-ARM-dts-import-Beelink-GT1-DT-from-Linux-5.21.patch │ │ ├── u-boot-0014-WIP-boards-amlogic-add-Beelink-GT1-defconfig.patch │ │ ├── u-boot-0015-WIP-doc-boards-amlogic-update-for-Beelink-GT1.patch │ │ ├── u-boot-0016-WIP-ARM-dts-convert-bananapi-m5-to-dtsi.patch │ │ ├── u-boot-0017-WIP-ARM-dts-add-support-for-BananaPi-M2-Pro.patch │ │ ├── u-boot-0018-WIP-boards-add-BananaPi-M2-Pro-defconfig.patch │ │ ├── u-boot-0019-WIP-docs-boards-amlogic-update-for-BananaPi-M2-Pro.patch │ │ ├── u-boot-0020-WIP-boards-add-BananaPi-M2S-defconfig.patch │ │ ├── u-boot-0021-WIP-docs-boards-amlogic-update-for-BananaPi-M2S.patch │ │ ├── u-boot-0022-WIP-ARM-dts-add-support-for-BananaPi-M2S.patch │ │ ├── u-boot-0023-WIP-boards-add-BananaPi-CM4IO-defconfig.patch │ │ ├── u-boot-0024-WIP-docs-boards-amlogic-update-for-BananaPi-CM4IO.patch │ │ └── u-boot-0025-WIP-ARM-dts-add-support-for-BananaPi-CM4IO.patch │ ├── Amlogic-ce/ │ │ ├── devices/ │ │ │ ├── Amlogic-ng/ │ │ │ │ ├── bootloader/ │ │ │ │ │ ├── LaFrite_boot.ini │ │ │ │ │ ├── LePotato_boot.ini │ │ │ │ │ ├── Odroid_C4_boot.ini │ │ │ │ │ ├── Odroid_HC4_boot.ini │ │ │ │ │ ├── Odroid_N2L_boot.ini │ │ │ │ │ ├── Odroid_N2_boot.ini │ │ │ │ │ ├── Radxa_Zero2_boot.ini │ │ │ │ │ ├── Radxa_Zero_boot.ini │ │ │ │ │ ├── canupdate.sh │ │ │ │ │ ├── config.ini │ │ │ │ │ ├── dtb.conf │ │ │ │ │ ├── dtb.xml │ │ │ │ │ ├── mkbootimg │ │ │ │ │ ├── mkimage │ │ │ │ │ ├── release │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ ├── Generic_cfgload.src │ │ │ │ │ │ ├── aml_autoscript.src │ │ │ │ │ │ └── libretech_chain_boot.src │ │ │ │ │ └── update.sh │ │ │ │ ├── filesystem/ │ │ │ │ │ └── usr/ │ │ │ │ │ ├── lib/ │ │ │ │ │ │ ├── coreelec/ │ │ │ │ │ │ │ └── smp-affinity.sh │ │ │ │ │ │ ├── kodi/ │ │ │ │ │ │ │ └── aml-hdmimonitor.sh │ │ │ │ │ │ └── systemd/ │ │ │ │ │ │ └── system/ │ │ │ │ │ │ └── kodi-aml-hdmimonitor.service │ │ │ │ │ └── sbin/ │ │ │ │ │ └── installtoemmc │ │ │ │ ├── initramfs/ │ │ │ │ │ └── platform_init │ │ │ │ ├── kodi/ │ │ │ │ │ ├── appliance.xml │ │ │ │ │ ├── g12x/ │ │ │ │ │ │ └── appliance.xml │ │ │ │ │ └── gxx/ │ │ │ │ │ └── appliance.xml │ │ │ │ ├── linux/ │ │ │ │ │ └── linux.aarch64.conf │ │ │ │ ├── options │ │ │ │ ├── packages/ │ │ │ │ │ ├── opengl-meson/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ │ └── libmali-overlay-setup │ │ │ │ │ │ ├── sources/ │ │ │ │ │ │ │ └── pkgconfig/ │ │ │ │ │ │ │ ├── egl.pc │ │ │ │ │ │ │ ├── glesv1_cm.pc │ │ │ │ │ │ │ ├── glesv2.pc │ │ │ │ │ │ │ └── glesv3.pc │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ ├── libmali.service │ │ │ │ │ │ └── unbind-console.service │ │ │ │ │ ├── u-boot/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── u-boot-LaFrite/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── u-boot-LePotato/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── u-boot-Odroid_C4/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── u-boot-Odroid_N2/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── u-boot-Odroid_N2L/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── u-boot-Radxa_Zero/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ └── u-boot-Radxa_Zero2/ │ │ │ │ │ └── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── kodi/ │ │ │ │ │ ├── 0001-Android-improve-Dolby-Vision-compatibility.patch │ │ │ │ │ ├── 0002-Improve-Dolby-Vision-detection-for-Android.patch │ │ │ │ │ ├── 0003-WinSystemAmlogic-rework-EGL-native-window.patch │ │ │ │ │ ├── 0004-WinSystemAmlogicGLES-clean-up-GLES-references-on-win.patch │ │ │ │ │ ├── 0005-tools-depends-Add-Rust-toolchain-cargo-c-and-libdovi.patch │ │ │ │ │ ├── 0006-Add-libdovi-as-optional-build-dependency.patch │ │ │ │ │ ├── 0007-Optionally-convert-Dolby-Vision.patch │ │ │ │ │ ├── 0008-tools-depends-Enable-libdovi-by-default.patch │ │ │ │ │ ├── 0009-libdovi-use-and-adjust-libdovi-for-Amlogic-linux-pla.patch │ │ │ │ │ ├── 0010-AMLCodec-add-support-of-Dolby-Vision.patch │ │ │ │ │ ├── 0011-libdovi-add-option-to-change-used-mode.patch │ │ │ │ │ ├── 0012-AMLCodec-add-user-setting-player-led.patch │ │ │ │ │ ├── 0013-Always-force-a-mode-switch-on-resolution-change-on-A.patch │ │ │ │ │ ├── 0014-AMLCodec-on-Dolby-Vision-playback-stop-wait-until-vi.patch │ │ │ │ │ ├── 0015-WinSystemAmlogic-rework-mode-switch-mechanism.patch │ │ │ │ │ ├── 0016-AMLUtils-add-display-DV-support-check.patch │ │ │ │ │ ├── 0017-AMLCodec-Restart-codec-in-dec_mode-STREAM_TYPE_FRAME.patch │ │ │ │ │ ├── 0018-libdovi-change-default-conversion-to-Lossless-for-Am.patch │ │ │ │ │ ├── 0019-AMLCodec-set-also-dolby_vision_ll_policy-when-force-.patch │ │ │ │ │ ├── 0020-WinSystemAmlogic-backup-correct-colour-subsampling-a.patch │ │ │ │ │ ├── 0021-AMLCodec-marginal-increase-frame-buffer-levels.patch │ │ │ │ │ └── kodi-temp-03-TEMP-fix-OnSettingChanged-signal.patch │ │ │ │ └── linux/ │ │ │ │ ├── 0001-g12b_s922z_amazon_2nd_gen_cube_dts.patch │ │ │ │ ├── 0002-amdv-dv-not-enabled-when-dolby_vision_policy-changed.patch │ │ │ │ ├── 0003-hdmitx-forcely-send-bt.2020-for-all-DV-case-1-2.patch │ │ │ │ ├── 0004-DT-make-a-copy-from-arm64-to-arm.patch │ │ │ │ ├── 0007-vfm-change-vfm-path-to-match-CE-for-DV.patch │ │ │ │ ├── 0008-auto-cs-do-not-force-vuy420-on-4k-50-60Hz-when-sourc.patch │ │ │ │ ├── 0009-dolby_vision-adjust-DV-policy.patch │ │ │ │ ├── 0010-dolby_vision-provide-ATTR-ko_info.patch │ │ │ │ ├── 0011-hdmitx-force-correct-colour-sampling-on-Dolby-Vision.patch │ │ │ │ ├── 0012-hdmitx-fix-display-of-current-hdmi-config-with-colou.patch │ │ │ │ ├── 0013-hdmitx-force-YUV444-on-Dolby-Vision-RGB-on-modes-wit.patch │ │ │ │ ├── 0014-hdmitx-provide-colour-subsampling-and-colour-depth-b.patch │ │ │ │ ├── 0015-dolby_vision-provide-Dolby-Vision-video-on-by-sysfs.patch │ │ │ │ ├── 0016-hdmitx-add-dolby-vision-support-for-display-current-.patch │ │ │ │ ├── 0018-dolby_vision-add-is_mel-sysfs.patch │ │ │ │ ├── linux-010-usbhid-quirks.patch │ │ │ │ ├── linux-02-fix_bluetooth_reconnect.patch │ │ │ │ ├── linux-03-stop-hid-generic-from-grabing-xbone.patch │ │ │ │ ├── linux-04-xpadneo.patch │ │ │ │ ├── linux-10-add-compatibility-macro-for-input_event_sec.patch │ │ │ │ ├── linux-emmc-partitions.patch │ │ │ │ ├── linux-temp-02-fo_on_source.patch │ │ │ │ ├── linux-uapi-fix_linux-if.h-userspace-compilation-errors.patch │ │ │ │ ├── linux-z89-emuelec-set-colordepth.patch │ │ │ │ ├── linux-z90-emuelec-gpio-drivers.patch │ │ │ │ ├── linux-z92-emuelec-gpio-dts.patch │ │ │ │ ├── linux-z93-emuelec-refresh-rate-fix-1024x768p60hz.patch │ │ │ │ ├── linux-z99-emuelec-bluetoothfix_mediatek.patch │ │ │ │ └── linux-z99-emuelec-gpio-fix1.patch │ │ │ ├── Amlogic-ng-dv/ │ │ │ │ ├── bootloader/ │ │ │ │ │ ├── canupdate.sh │ │ │ │ │ ├── config.ini │ │ │ │ │ ├── dtb.conf │ │ │ │ │ ├── dtb.xml │ │ │ │ │ ├── mkbootimg │ │ │ │ │ ├── mkimage │ │ │ │ │ ├── release │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ ├── Generic_cfgload.src │ │ │ │ │ │ └── aml_autoscript.src │ │ │ │ │ └── update.sh │ │ │ │ ├── filesystem/ │ │ │ │ │ └── usr/ │ │ │ │ │ └── lib/ │ │ │ │ │ ├── coreelec/ │ │ │ │ │ │ └── smp-affinity.sh │ │ │ │ │ ├── kodi/ │ │ │ │ │ │ └── aml-hdmimonitor.sh │ │ │ │ │ └── systemd/ │ │ │ │ │ └── system/ │ │ │ │ │ └── kodi-aml-hdmimonitor.service │ │ │ │ ├── initramfs/ │ │ │ │ │ └── platform_init │ │ │ │ ├── kodi/ │ │ │ │ │ ├── appliance.xml │ │ │ │ │ ├── g12x/ │ │ │ │ │ │ └── appliance.xml │ │ │ │ │ └── gxx/ │ │ │ │ │ └── appliance.xml │ │ │ │ ├── linux/ │ │ │ │ │ └── linux.arm.conf │ │ │ │ ├── options │ │ │ │ ├── packages/ │ │ │ │ │ ├── opengl-meson/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ │ └── libmali-overlay-setup │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ ├── libmali.service │ │ │ │ │ │ └── unbind-console.service │ │ │ │ │ └── u-boot/ │ │ │ │ │ └── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── kodi/ │ │ │ │ │ ├── 0001-Android-improve-Dolby-Vision-compatibility.patch │ │ │ │ │ ├── 0002-Improve-Dolby-Vision-detection-for-Android.patch │ │ │ │ │ ├── 0003-WinSystemAmlogic-rework-EGL-native-window.patch │ │ │ │ │ ├── 0004-WinSystemAmlogicGLES-clean-up-GLES-references-on-win.patch │ │ │ │ │ ├── 0005-tools-depends-Add-Rust-toolchain-cargo-c-and-libdovi.patch │ │ │ │ │ ├── 0006-Add-libdovi-as-optional-build-dependency.patch │ │ │ │ │ ├── 0007-Optionally-convert-Dolby-Vision.patch │ │ │ │ │ ├── 0008-tools-depends-Enable-libdovi-by-default.patch │ │ │ │ │ ├── 0009-libdovi-use-and-adjust-libdovi-for-Amlogic-linux-pla.patch │ │ │ │ │ ├── 0010-AMLCodec-add-support-of-Dolby-Vision.patch │ │ │ │ │ ├── 0011-libdovi-add-option-to-change-used-mode.patch │ │ │ │ │ ├── 0012-AMLCodec-add-user-setting-player-led.patch │ │ │ │ │ ├── 0013-Always-force-a-mode-switch-on-resolution-change-on-A.patch │ │ │ │ │ ├── 0014-AMLCodec-on-Dolby-Vision-playback-stop-wait-until-vi.patch │ │ │ │ │ ├── 0015-WinSystemAmlogic-rework-mode-switch-mechanism.patch │ │ │ │ │ ├── 0016-AMLUtils-add-display-DV-support-check.patch │ │ │ │ │ ├── 0017-AMLCodec-Restart-codec-in-dec_mode-STREAM_TYPE_FRAME.patch │ │ │ │ │ ├── 0018-libdovi-change-default-conversion-to-Lossless-for-Am.patch │ │ │ │ │ ├── 0019-AMLCodec-set-also-dolby_vision_ll_policy-when-force-.patch │ │ │ │ │ ├── 0020-WinSystemAmlogic-backup-correct-colour-subsampling-a.patch │ │ │ │ │ ├── 0021-AMLCodec-marginal-increase-frame-buffer-levels.patch │ │ │ │ │ └── kodi-temp-03-TEMP-fix-OnSettingChanged-signal.patch │ │ │ │ ├── linux/ │ │ │ │ │ ├── 0001-Revert-hdmitx-fix-reading-hdmitx-register-when-uboot.patch │ │ │ │ │ ├── 0002-amdv-dv-not-enabled-when-dolby_vision_policy-changed.patch │ │ │ │ │ ├── 0003-hdmitx-forcely-send-bt.2020-for-all-DV-case-1-2.patch │ │ │ │ │ ├── 0004-DT-make-a-copy-from-arm64-to-arm.patch │ │ │ │ │ ├── 0005-arm-error-static-declaration-of-machine_name-follows.patch │ │ │ │ │ ├── 0006-arm-config-item-AMLOGIC_DVB_COMPAT-is-needed-for-com.patch │ │ │ │ │ ├── 0007-vfm-change-vfm-path-to-match-CE-for-DV.patch │ │ │ │ │ ├── 0008-auto-cs-do-not-force-vuy420-on-4k-50-60Hz-when-sourc.patch │ │ │ │ │ ├── 0009-dolby_vision-adjust-DV-policy.patch │ │ │ │ │ ├── 0010-dolby_vision-provide-ATTR-ko_info.patch │ │ │ │ │ ├── 0011-hdmitx-force-correct-colour-sampling-on-Dolby-Vision.patch │ │ │ │ │ ├── 0012-hdmitx-fix-display-of-current-hdmi-config-with-colou.patch │ │ │ │ │ ├── 0013-hdmitx-force-YUV444-on-Dolby-Vision-RGB-on-modes-wit.patch │ │ │ │ │ ├── 0014-hdmitx-provide-colour-subsampling-and-colour-depth-b.patch │ │ │ │ │ ├── 0015-dolby_vision-provide-Dolby-Vision-video-on-by-sysfs.patch │ │ │ │ │ ├── 0016-hdmitx-add-dolby-vision-support-for-display-current-.patch │ │ │ │ │ ├── 0017-ARM-8933-1-replace-Sun-Solaris-style-flag-on-section.patch │ │ │ │ │ ├── 0018-dolby_vision-add-is_mel-sysfs.patch │ │ │ │ │ ├── linux-02-fix_bluetooth_reconnect.patch │ │ │ │ │ ├── linux-03-stop-hid-generic-from-grabing-xbone.patch │ │ │ │ │ ├── linux-04-xpadneo.patch │ │ │ │ │ ├── linux-10-add-compatibility-macro-for-input_event_sec.patch │ │ │ │ │ ├── linux-netlink-fix_add-variables-needed-for-iwd-package.patch │ │ │ │ │ ├── linux-temp-02-fo_on_source.patch │ │ │ │ │ └── linux-uapi-fix_linux-if.h-userspace-compilation-errors.patch │ │ │ │ └── systemd/ │ │ │ │ └── systemd-ignore-sdcardfs-from-linux.patch │ │ │ ├── Amlogic-no/ │ │ │ │ ├── bootloader/ │ │ │ │ │ ├── Alta_boot.ini │ │ │ │ │ ├── Khadas_VIM1S_boot.ini │ │ │ │ │ ├── Khadas_VIM4_boot.ini │ │ │ │ │ ├── Odroid_C4_boot.ini │ │ │ │ │ ├── Odroid_N2_boot.ini │ │ │ │ │ ├── Radxa_Zero2_boot.ini │ │ │ │ │ ├── Radxa_Zero_boot.ini │ │ │ │ │ ├── Solitude_boot.ini │ │ │ │ │ ├── canupdate.sh │ │ │ │ │ ├── config.ini │ │ │ │ │ ├── dtb.conf │ │ │ │ │ ├── dtb.xml │ │ │ │ │ ├── mkbootimg │ │ │ │ │ ├── mkimage │ │ │ │ │ ├── release │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ ├── Generic_cfgload.src │ │ │ │ │ │ └── aml_autoscript.src │ │ │ │ │ ├── subdevice_config.sh │ │ │ │ │ └── update.sh │ │ │ │ ├── filesystem/ │ │ │ │ │ ├── etc/ │ │ │ │ │ │ ├── dbus-1/ │ │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ │ └── coreelec.settings-xdbus-stoploop.conf │ │ │ │ │ │ └── lirc/ │ │ │ │ │ │ └── lircd.conf.d/ │ │ │ │ │ │ └── odroid-amremote.conf │ │ │ │ │ └── usr/ │ │ │ │ │ ├── bin/ │ │ │ │ │ │ ├── cputemp │ │ │ │ │ │ └── gputemp │ │ │ │ │ ├── lib/ │ │ │ │ │ │ ├── coreelec/ │ │ │ │ │ │ │ └── smp-affinity.sh │ │ │ │ │ │ ├── modprobe.d/ │ │ │ │ │ │ │ ├── disable-ir-remotes.conf │ │ │ │ │ │ │ └── mali.conf │ │ │ │ │ │ ├── modules-load.d/ │ │ │ │ │ │ │ └── amlvideodri.conf │ │ │ │ │ │ ├── systemd/ │ │ │ │ │ │ │ ├── sleep.conf.d/ │ │ │ │ │ │ │ │ └── sleep.conf │ │ │ │ │ │ │ ├── system/ │ │ │ │ │ │ │ │ └── smp-affinity.service │ │ │ │ │ │ │ ├── system-shutdown/ │ │ │ │ │ │ │ │ └── disk-park.sh │ │ │ │ │ │ │ └── system-sleep/ │ │ │ │ │ │ │ ├── disk-park.sh │ │ │ │ │ │ │ └── reset_usb_hub.sh │ │ │ │ │ │ └── udev/ │ │ │ │ │ │ └── rules.d/ │ │ │ │ │ │ ├── 99-spidev.rules │ │ │ │ │ │ └── 99-xpadneo.rules │ │ │ │ │ ├── sbin/ │ │ │ │ │ │ ├── installtointernal │ │ │ │ │ │ └── update-ce │ │ │ │ │ └── share/ │ │ │ │ │ └── alsa/ │ │ │ │ │ └── cards/ │ │ │ │ │ ├── AML-AUGESOUND.conf │ │ │ │ │ └── AML-MESONAUDIO.conf │ │ │ │ ├── initramfs/ │ │ │ │ │ └── platform_init │ │ │ │ ├── kodi/ │ │ │ │ │ └── appliance.xml │ │ │ │ ├── linux/ │ │ │ │ │ └── linux.aarch64.conf │ │ │ │ ├── options │ │ │ │ ├── packages/ │ │ │ │ │ ├── addons/ │ │ │ │ │ │ ├── addon-depends/ │ │ │ │ │ │ │ ├── jsonschema/ │ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ │ ├── mbedtls/ │ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ │ ├── qmdnsengine/ │ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ │ └── qt-everywhere/ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ │ └── xkb_fix_build_with_libxkbcommon_1_6_0_and_later.patch │ │ │ │ │ │ └── service/ │ │ │ │ │ │ ├── aml-vnc/ │ │ │ │ │ │ │ ├── changelog.txt │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ └── source/ │ │ │ │ │ │ │ ├── bin/ │ │ │ │ │ │ │ │ └── aml-vnc.start │ │ │ │ │ │ │ ├── default.py │ │ │ │ │ │ │ ├── power.d/ │ │ │ │ │ │ │ │ └── aml-vnc.power │ │ │ │ │ │ │ ├── resources/ │ │ │ │ │ │ │ │ ├── language/ │ │ │ │ │ │ │ │ │ ├── resource.language.en_gb/ │ │ │ │ │ │ │ │ │ │ └── strings.po │ │ │ │ │ │ │ │ │ └── resource.language.hu_hu/ │ │ │ │ │ │ │ │ │ └── strings.po │ │ │ │ │ │ │ │ └── settings.xml │ │ │ │ │ │ │ ├── settings-default.xml │ │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ │ └── service.aml-vnc.service │ │ │ │ │ │ ├── homatics-leds/ │ │ │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ │ │ ├── addon.xml │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ └── source/ │ │ │ │ │ │ │ ├── default.py │ │ │ │ │ │ │ ├── resources/ │ │ │ │ │ │ │ │ ├── language/ │ │ │ │ │ │ │ │ │ ├── resource.language.de_de/ │ │ │ │ │ │ │ │ │ │ └── strings.po │ │ │ │ │ │ │ │ │ ├── resource.language.en_gb/ │ │ │ │ │ │ │ │ │ │ └── strings.po │ │ │ │ │ │ │ │ │ └── resource.language.hu_hu/ │ │ │ │ │ │ │ │ │ └── strings.po │ │ │ │ │ │ │ │ └── settings.xml │ │ │ │ │ │ │ ├── service.py │ │ │ │ │ │ │ └── settings-default.xml │ │ │ │ │ │ ├── hyperion.ng/ │ │ │ │ │ │ │ ├── changelog.txt │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ ├── patches/ │ │ │ │ │ │ │ │ ├── 0001-Remove-unused-libs-for-Amlogic-platform.patch │ │ │ │ │ │ │ │ └── 0002-Embed-image-format-plugins-at-Amlogic-platform.patch │ │ │ │ │ │ │ └── source/ │ │ │ │ │ │ │ ├── bin/ │ │ │ │ │ │ │ │ ├── hyperiond.start │ │ │ │ │ │ │ │ └── platform.sh │ │ │ │ │ │ │ ├── default.py │ │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ │ └── service.hyperion.ng.service │ │ │ │ │ │ └── openvfd/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── devel/ │ │ │ │ │ │ └── msgpack-c/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── lang/ │ │ │ │ │ │ ├── clang/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ ├── gcc-linaro-aarch64-elf/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ ├── gcc-linaro-arm-eabi/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ ├── gcc-riscv-none-embed/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ └── gcc7-linaro-aarch64-elf/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── lib32/ │ │ │ │ │ │ ├── lib32-glibc/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ ├── lib32-libdrm/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ └── lib32-opengl-meson/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── linux/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ ├── patches/ │ │ │ │ │ │ │ ├── linux-004_lower_undefined_mode_timeout.patch │ │ │ │ │ │ │ ├── linux-007_die_floppy_die.patch │ │ │ │ │ │ │ └── linux-009_disable_i8042_check_on_apple_mac.patch │ │ │ │ │ │ ├── sysctl.d/ │ │ │ │ │ │ │ ├── network.conf │ │ │ │ │ │ │ └── qdisc.conf │ │ │ │ │ │ └── udev.d/ │ │ │ │ │ │ ├── 30-disable-wakeup.rules │ │ │ │ │ │ └── 40-modeswitch.rules │ │ │ │ │ ├── linux-driver-addons/ │ │ │ │ │ │ └── dvb/ │ │ │ │ │ │ └── AVL6862/ │ │ │ │ │ │ ├── changelog.txt │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── source/ │ │ │ │ │ │ ├── default.py │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ └── amlogic-dvb.service │ │ │ │ │ ├── linux-drivers/ │ │ │ │ │ │ ├── RTL8851BU/ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ │ ├── RTL8851BU-0001-fix.patch │ │ │ │ │ │ │ └── RTL8851BU-0002-Fix-compiling-for-Amlogic-5.15.119.patch │ │ │ │ │ │ ├── RTW88/ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ │ └── 0001-8822cs-add-0x024C-0xD821.patch │ │ │ │ │ │ ├── aic8800-sdio/ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ │ └── aic8800-sdio-fixes.patch │ │ │ │ │ │ ├── amlogic/ │ │ │ │ │ │ │ ├── RTL8723DS-aml/ │ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ │ │ └── 0001-Fix-for-Amlogic-kernel-5.15.119.patch │ │ │ │ │ │ │ ├── RTL8852BE-aml/ │ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ │ ├── RTL8852BS-aml/ │ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ │ ├── ap6xxx-aml/ │ │ │ │ │ │ │ │ ├── modprobe.d/ │ │ │ │ │ │ │ │ │ ├── dhd_sdio.conf │ │ │ │ │ │ │ │ │ └── dhdpci.conf │ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ │ ├── common_drivers/ │ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ │ ├── media_modules-aml/ │ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ │ │ │ ├── media_modules-aml.sh │ │ │ │ │ │ │ │ │ └── read-firmware-version.sh │ │ │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ │ │ └── media_modules-aml.service │ │ │ │ │ │ │ ├── mt76/ │ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ │ ├── mt7668-wifi-bt/ │ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ │ ├── opentee_linuxdriver/ │ │ │ │ │ │ │ │ ├── filesystem/ │ │ │ │ │ │ │ │ │ ├── aarch64/ │ │ │ │ │ │ │ │ │ │ ├── ta/ │ │ │ │ │ │ │ │ │ │ │ └── v3.8/ │ │ │ │ │ │ │ │ │ │ │ ├── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ └── dev/ │ │ │ │ │ │ │ │ │ │ │ ├── A311D2/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── A311D2J/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── POP1/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── S805C3/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── S805C3L/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── S805X2/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── S805X2G/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── S905C2/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── S905C2ENG/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── S905C2L/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── S905C3/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── S905C3ENG/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── S905C3NMA/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── S905W2/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── S905X4/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── S905Y4/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── S928X/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── T963D4/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── T965D4/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ ├── T982/ │ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ │ └── V918D/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ └── usr/ │ │ │ │ │ │ │ │ │ │ ├── lib/ │ │ │ │ │ │ │ │ │ │ │ ├── libteec.so.1 │ │ │ │ │ │ │ │ │ │ │ └── libteec.so.1.0 │ │ │ │ │ │ │ │ │ │ └── sbin/ │ │ │ │ │ │ │ │ │ │ ├── tee-supplicant │ │ │ │ │ │ │ │ │ │ ├── tee_preload_fw │ │ │ │ │ │ │ │ │ │ └── tee_stest │ │ │ │ │ │ │ │ │ └── arm/ │ │ │ │ │ │ │ │ │ ├── ta/ │ │ │ │ │ │ │ │ │ │ └── v3.8/ │ │ │ │ │ │ │ │ │ │ ├── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ └── dev/ │ │ │ │ │ │ │ │ │ │ ├── A311D2/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── A311D2J/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── POP1/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── S805C3/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── S805X2/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── S805X2G/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── S905C2/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── S905C2ENG/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── S905C2L/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── S905C3/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── S905C3ENG/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── S905C3NMA/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── S905W2/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── S905X4/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── S905Y4/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── T963D4/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── T965D4/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ ├── T982/ │ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ │ └── V918D/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ └── usr/ │ │ │ │ │ │ │ │ │ ├── lib/ │ │ │ │ │ │ │ │ │ │ ├── libteec.so.1 │ │ │ │ │ │ │ │ │ │ └── libteec.so.1.0 │ │ │ │ │ │ │ │ │ └── sbin/ │ │ │ │ │ │ │ │ │ ├── tee-supplicant │ │ │ │ │ │ │ │ │ ├── tee_preload_fw │ │ │ │ │ │ │ │ │ └── tee_stest │ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ │ │ │ ├── dovi-loader.sh │ │ │ │ │ │ │ │ │ └── tee-loader.sh │ │ │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ │ │ └── opentee_linuxdriver.service │ │ │ │ │ │ │ ├── w1-aml/ │ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ │ └── udev.d/ │ │ │ │ │ │ │ │ └── 80-aml_sdio.rules │ │ │ │ │ │ │ └── wifi_dummy-aml/ │ │ │ │ │ │ │ ├── modules-load.d/ │ │ │ │ │ │ │ │ └── wifi_dummy.conf │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ └── sources/ │ │ │ │ │ │ │ ├── Makefile │ │ │ │ │ │ │ └── wifi_dummy.c │ │ │ │ │ │ ├── gpu-aml/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ └── openvfd-driver/ │ │ │ │ │ │ ├── openvfd.conf.d/ │ │ │ │ │ │ │ └── hc4.conf │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ │ └── openvfd-start │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ └── openvfd.service │ │ │ │ │ ├── linux-firmware/ │ │ │ │ │ │ ├── amlogic/ │ │ │ │ │ │ │ ├── bl30/ │ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ │ ├── qca-firmware-aml/ │ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ │ ├── system.d/ │ │ │ │ │ │ │ │ │ └── qca-firmware-aml.service │ │ │ │ │ │ │ │ └── udev.d/ │ │ │ │ │ │ │ │ └── 80-qca-firmware-aml.rules │ │ │ │ │ │ │ └── rtkbt-firmware-aml/ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ ├── system.d/ │ │ │ │ │ │ │ │ └── rtkbt-firmware-aml.service │ │ │ │ │ │ │ └── udev.d/ │ │ │ │ │ │ │ └── 80-rtkbt-firmware-aml.rules │ │ │ │ │ │ ├── brcmfmac_sdio-firmware-aml/ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ ├── system.d/ │ │ │ │ │ │ │ │ ├── brcmfmac_sdio-firmware-aml.service │ │ │ │ │ │ │ │ └── brcmfmac_sdio-firmware@.service │ │ │ │ │ │ │ └── udev.d/ │ │ │ │ │ │ │ ├── 80-brcmfmac_pci.rules │ │ │ │ │ │ │ └── 80-brcmfmac_sdio.rules │ │ │ │ │ │ └── wlan-firmware/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── mediacenter/ │ │ │ │ │ │ ├── CoreELEC-settings/ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ │ │ ├── backup-restore │ │ │ │ │ │ │ │ └── factory-reset │ │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ │ ├── backup-restore.service │ │ │ │ │ │ │ ├── backup-restore.target │ │ │ │ │ │ │ ├── factory-reset.service │ │ │ │ │ │ │ └── factory-reset.target │ │ │ │ │ │ └── kodi/ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ ├── advancedsettings.xml │ │ │ │ │ │ │ ├── appliance.xml │ │ │ │ │ │ │ ├── guisettings.xml │ │ │ │ │ │ │ ├── kodi.conf.in │ │ │ │ │ │ │ ├── network_wait │ │ │ │ │ │ │ ├── repository.coreelec/ │ │ │ │ │ │ │ │ └── addon.xml │ │ │ │ │ │ │ └── sources.xml │ │ │ │ │ │ ├── debug.d/ │ │ │ │ │ │ │ └── kodi.conf │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ ├── profile.d/ │ │ │ │ │ │ │ ├── 00-addons.conf │ │ │ │ │ │ │ └── 99-kodi.conf │ │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ │ ├── kodi-after │ │ │ │ │ │ │ ├── kodi-config │ │ │ │ │ │ │ ├── kodi-remote │ │ │ │ │ │ │ ├── kodi-safe-mode │ │ │ │ │ │ │ ├── kodi.sh │ │ │ │ │ │ │ ├── pastekodi │ │ │ │ │ │ │ ├── service-addon-wrapper │ │ │ │ │ │ │ ├── setwakeup.sh │ │ │ │ │ │ │ └── xml_merge.py │ │ │ │ │ │ ├── sleep.d/ │ │ │ │ │ │ │ ├── openelec-sleep.sh │ │ │ │ │ │ │ └── wifi.power │ │ │ │ │ │ ├── sleep.d.serial/ │ │ │ │ │ │ │ ├── 10-addon-sleep.sh │ │ │ │ │ │ │ └── 20-custom-sleep.sh │ │ │ │ │ │ ├── system.d/ │ │ │ │ │ │ │ ├── kodi-autostart.service │ │ │ │ │ │ │ ├── kodi-cleanlogs.service │ │ │ │ │ │ │ ├── kodi-cleanpackagecache.service │ │ │ │ │ │ │ ├── kodi-halt.service │ │ │ │ │ │ │ ├── kodi-lirc-suspend.service │ │ │ │ │ │ │ ├── kodi-poweroff.service │ │ │ │ │ │ │ ├── kodi-reboot.service │ │ │ │ │ │ │ ├── kodi-waitonnetwork.service │ │ │ │ │ │ │ ├── kodi.service │ │ │ │ │ │ │ └── kodi.target │ │ │ │ │ │ └── tmpfiles.d/ │ │ │ │ │ │ ├── kodi-userdirs.conf │ │ │ │ │ │ └── kodi.conf │ │ │ │ │ ├── multimedia/ │ │ │ │ │ │ ├── libamcodec/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ ├── libdovi/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ └── obu_util/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── sources/ │ │ │ │ │ │ ├── aom_codec.h │ │ │ │ │ │ ├── aom_config.h │ │ │ │ │ │ ├── aom_config.h-orig.h │ │ │ │ │ │ ├── aom_image.h │ │ │ │ │ │ ├── aom_integer.c │ │ │ │ │ │ ├── aom_integer.h │ │ │ │ │ │ ├── bitops.h │ │ │ │ │ │ ├── bitreader_buffer.c │ │ │ │ │ │ ├── bitreader_buffer.h │ │ │ │ │ │ ├── msvc.h │ │ │ │ │ │ ├── obu_util.c │ │ │ │ │ │ ├── obu_util.h │ │ │ │ │ │ └── recenter.h │ │ │ │ │ ├── network/ │ │ │ │ │ │ └── rfkill/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ └── rfkill-0001-fix-version-sh.patch │ │ │ │ │ ├── opengl-meson/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ │ └── libmali-overlay-setup │ │ │ │ │ │ ├── sources/ │ │ │ │ │ │ │ └── pkgconfig/ │ │ │ │ │ │ │ ├── egl.pc │ │ │ │ │ │ │ ├── glesv1_cm.pc │ │ │ │ │ │ │ ├── glesv2.pc │ │ │ │ │ │ │ └── glesv3.pc │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ ├── libmali.service │ │ │ │ │ │ └── unbind-console.service │ │ │ │ │ ├── parse-android-dynparts/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ └── remove-warning-skip-zero-length-partition.patch │ │ │ │ │ ├── sysutils/ │ │ │ │ │ │ ├── amremote/ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ │ │ └── remote-config │ │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ │ └── remote-config.service │ │ │ │ │ │ ├── dtb-xml/ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ │ │ └── dtb-xml.sh │ │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ │ └── dtb-xml.service │ │ │ │ │ │ ├── inject_bl301/ │ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ │ └── bl301.conf │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ │ │ ├── check-bl301.sh │ │ │ │ │ │ │ │ └── update-bl301.sh │ │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ │ └── update-bl301.service │ │ │ │ │ │ └── tmate/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ ├── patches/ │ │ │ │ │ │ │ └── path-adjustments.patch │ │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ │ └── tmate-pre.sh │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ └── tmate.service │ │ │ │ │ ├── tools/ │ │ │ │ │ │ ├── CoreELEC-Debug-Scripts/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ ├── aml-dtbtools/ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ │ ├── 0001-change-permisson-on-output-file.patch │ │ │ │ │ │ │ └── 0002-add-gzip-compression-support.patch │ │ │ │ │ │ ├── ceemmc/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ ├── entware/ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ ├── profile.d/ │ │ │ │ │ │ │ │ └── 99-entware.conf │ │ │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ │ │ └── installentware │ │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ │ └── entware.service │ │ │ │ │ │ ├── rtk_hciattach/ │ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ │ ├── rtk_hciattach-01-Makefile.patch │ │ │ │ │ │ │ └── rtk_hciattach-02-change-location-of-btaddr-file.patch │ │ │ │ │ │ ├── u-boot-Alta/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ ├── u-boot-Khadas_VIM1S/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ ├── u-boot-Khadas_VIM4/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ ├── u-boot-Odroid_C4/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ ├── u-boot-Odroid_N2/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ ├── u-boot-Radxa_Zero/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ ├── u-boot-Radxa_Zero2/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ ├── u-boot-Solitude/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ ├── u-boot-script/ │ │ │ │ │ │ │ └── package.mk │ │ │ │ │ │ └── u-boot-tools/ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ └── fw_env.config │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ ├── u-boot-tools-0001-dummy_defconfig.patch │ │ │ │ │ │ ├── u-boot-tools-0002-allow-multiple-entries.patch │ │ │ │ │ │ └── u-boot-tools-0003-nand_env-hack.patch │ │ │ │ │ ├── u-boot/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ └── virtual/ │ │ │ │ │ └── remote/ │ │ │ │ │ └── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── RTL8852BS-aml/ │ │ │ │ │ └── 0001-Fix-build-for-Amlogic-kernel-version-5.15.119.patch │ │ │ │ ├── kodi/ │ │ │ │ │ ├── kodi-04-pvr-catchup-lower-optimization.patch │ │ │ │ │ ├── kodi-05-libdvd-upnp-remove-warnings.patch │ │ │ │ │ └── kodi-temp-03-TEMP-fix-OnSettingChanged-signal.patch │ │ │ │ └── linux/ │ │ │ │ ├── amlogic-0003-HACK-arm64-fix-Kodi-sysinfo-CPU-information.patch │ │ │ │ └── linux-04-xpadneo.patch │ │ │ └── Amlogic-old/ │ │ │ ├── bootloader/ │ │ │ │ ├── LePotato_boot.ini │ │ │ │ ├── Odroid_C2_boot.ini │ │ │ │ ├── canupdate.sh │ │ │ │ ├── config.ini │ │ │ │ ├── dtb.conf │ │ │ │ ├── mkbootimg │ │ │ │ ├── mkimage │ │ │ │ ├── release │ │ │ │ ├── scripts/ │ │ │ │ │ └── aml_autoscript.src │ │ │ │ └── update.sh │ │ │ ├── filesystem/ │ │ │ │ ├── etc/ │ │ │ │ │ └── lirc/ │ │ │ │ │ └── lircd.conf.d/ │ │ │ │ │ └── odroid-amremote.conf │ │ │ │ └── usr/ │ │ │ │ ├── bin/ │ │ │ │ │ └── cputemp │ │ │ │ ├── lib/ │ │ │ │ │ ├── kernel-overlays/ │ │ │ │ │ │ └── base/ │ │ │ │ │ │ └── lib/ │ │ │ │ │ │ └── firmware/ │ │ │ │ │ │ └── rtl_bt/ │ │ │ │ │ │ ├── rtl8723b_config │ │ │ │ │ │ └── rtl8723b_fw │ │ │ │ │ ├── kodi/ │ │ │ │ │ │ └── aml-hdmimonitor.sh │ │ │ │ │ ├── modprobe.d/ │ │ │ │ │ │ ├── disable-ir-remotes.conf │ │ │ │ │ │ └── mali.conf │ │ │ │ │ ├── modules-load.d/ │ │ │ │ │ │ ├── amlvideodri.conf │ │ │ │ │ │ └── wifi_dummy.conf │ │ │ │ │ ├── systemd/ │ │ │ │ │ │ ├── sleep.conf.d/ │ │ │ │ │ │ │ └── sleep.conf │ │ │ │ │ │ └── system/ │ │ │ │ │ │ ├── amlogic-dvb.service │ │ │ │ │ │ ├── fstrim.service │ │ │ │ │ │ ├── kodi-aml-hdmimonitor.service │ │ │ │ │ │ └── wetekdvb.service │ │ │ │ │ └── udev/ │ │ │ │ │ └── rules.d/ │ │ │ │ │ └── 99-spidev.rules │ │ │ │ ├── sbin/ │ │ │ │ │ ├── installtointernal │ │ │ │ │ ├── lepotatotoemmc │ │ │ │ │ └── rebootfromnand │ │ │ │ └── share/ │ │ │ │ └── alsa/ │ │ │ │ └── cards/ │ │ │ │ └── AML-M8AUDIO.conf │ │ │ ├── initramfs/ │ │ │ │ └── platform_init │ │ │ ├── kodi/ │ │ │ │ └── appliance.xml │ │ │ ├── linux/ │ │ │ │ └── linux.aarch64.conf │ │ │ ├── options │ │ │ ├── packages/ │ │ │ │ ├── android-headers/ │ │ │ │ │ └── package.mk │ │ │ │ ├── bluez/ │ │ │ │ │ ├── debug.d/ │ │ │ │ │ │ ├── bluez.conf │ │ │ │ │ │ └── obexd.conf │ │ │ │ │ ├── default.d/ │ │ │ │ │ │ └── bluez.conf │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── patches/ │ │ │ │ │ │ ├── 0001-obexd-client-sync.c-fix-conflict-with-unistd.c.patch │ │ │ │ │ │ ├── 0002-profiles-audio-media.c-fix-conflict-with-unistd.c.patch │ │ │ │ │ │ ├── bluez-01_add-obexd-policy.patch │ │ │ │ │ │ ├── bluez-02_obexd-use-system-bus.patch │ │ │ │ │ │ ├── bluez-03_storagedir.patch │ │ │ │ │ │ ├── bluez-04_work-around-Logitech-diNovo-Edge-keyboard-firmware-i.patch │ │ │ │ │ │ ├── bluez-05-046d-c52b-Logitech-Inc.-Unifying-Receiver.patch │ │ │ │ │ │ ├── bluez-06-broadcom-fixes.patch │ │ │ │ │ │ ├── bluez-07-broadcom-dont-set-speed-before-loading.patch │ │ │ │ │ │ ├── bluez-08-hciattach-retry-device-reset-when-no-response.patch │ │ │ │ │ │ ├── bluez-09-hciattach-more-verbose.patch │ │ │ │ │ │ ├── bluez-11_sixaxis-fix-PID-navigation-controller.patch │ │ │ │ │ │ ├── bluez-12-fix-obexd-after-5_50.patch │ │ │ │ │ │ ├── bluez-20-sixaxis-autotrust.patch │ │ │ │ │ │ └── bluez-21-hciattach-add-QCA9377-Tuffello-support.patch │ │ │ │ │ ├── system.d/ │ │ │ │ │ │ ├── bluetooth-defaults.service │ │ │ │ │ │ ├── bluetooth.service │ │ │ │ │ │ └── obex.service │ │ │ │ │ └── tmpfiles.d/ │ │ │ │ │ └── z_05_bluez.conf │ │ │ │ ├── device-trees-amlogic/ │ │ │ │ │ └── package.mk │ │ │ │ ├── iptables/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── README │ │ │ │ │ │ ├── home.v4 │ │ │ │ │ │ ├── home.v6 │ │ │ │ │ │ ├── public.v4 │ │ │ │ │ │ └── public.v6 │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ └── iptables_helper │ │ │ │ │ └── system.d/ │ │ │ │ │ └── iptables.service │ │ │ │ ├── kvimfan-aml/ │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── sources/ │ │ │ │ │ │ ├── Makefile │ │ │ │ │ │ └── khadas-fan.c │ │ │ │ │ └── system.d/ │ │ │ │ │ └── kvimfan.service │ │ │ │ ├── linux-drivers/ │ │ │ │ │ ├── RTL8188EU-aml/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ └── RTL8188EU-aml-0001-Add-support-for-a-few-USB-dongles.patch │ │ │ │ │ ├── RTL8723DS-aml/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── RTL8821CU/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── mt7601u-aml/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ └── mt7601u-aml-001-firmware-path.patch │ │ │ │ │ ├── mt7603u-aml/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ ├── mt7603u-aml-001-firmware-path.patch │ │ │ │ │ │ ├── mt7603u-aml-002-fix-building.patch │ │ │ │ │ │ └── mt7603u-aml-003-fix-build-the-vpeter-way.patch │ │ │ │ │ ├── mt7610u-aml/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ ├── mt7610u-0001-fix-cross-compiling.patch │ │ │ │ │ │ ├── mt7610u-0002-support-more-cards.patch │ │ │ │ │ │ └── mt7610u-aml-003-fix-build-the-vpeter-way.patch │ │ │ │ │ ├── mt7668-aml/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── rtl8822b_bt/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ ├── system.d/ │ │ │ │ │ │ │ └── rtl8822b_bt-firmware.service │ │ │ │ │ │ └── udev.d/ │ │ │ │ │ │ └── 80-rtl8822b_bt.rules │ │ │ │ │ └── ssv6xxx-aml-3.14/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── ssv6xxx-aml-3.14-001-fix-build-and-firmware-path.patch │ │ │ │ ├── old_ee_3.14_kernel/ │ │ │ │ │ └── package.mk │ │ │ │ ├── opengl-meson/ │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ └── libmali-overlay-setup │ │ │ │ │ ├── sources/ │ │ │ │ │ │ └── pkgconfig/ │ │ │ │ │ │ ├── egl.pc │ │ │ │ │ │ ├── glesv1_cm.pc │ │ │ │ │ │ ├── glesv2.pc │ │ │ │ │ │ └── glesv3.pc │ │ │ │ │ ├── system.d/ │ │ │ │ │ │ └── unbind-console.service │ │ │ │ │ └── system.d-disabled/ │ │ │ │ │ └── libmali.service │ │ │ │ ├── qca9377-aml/ │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── patches/ │ │ │ │ │ │ └── amlogic-3.14/ │ │ │ │ │ │ └── patch.patch │ │ │ │ │ └── udev.d/ │ │ │ │ │ └── 99-qca9377-wireless.rules │ │ │ │ ├── qca9377-firmware-aml/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── udev.d/ │ │ │ │ │ └── 80-qca-firmware-aml.rules │ │ │ │ ├── systemd/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── hosts.conf │ │ │ │ │ │ ├── hwdb.d/ │ │ │ │ │ │ │ └── README │ │ │ │ │ │ ├── logind.conf.d/ │ │ │ │ │ │ │ └── README │ │ │ │ │ │ ├── modules-load.d/ │ │ │ │ │ │ │ └── README │ │ │ │ │ │ ├── sleep.conf.d/ │ │ │ │ │ │ │ ├── README │ │ │ │ │ │ │ └── sleep.conf.sample │ │ │ │ │ │ ├── sysctl.d/ │ │ │ │ │ │ │ ├── README │ │ │ │ │ │ │ └── qdisc.conf.sample │ │ │ │ │ │ ├── system.d/ │ │ │ │ │ │ │ ├── README │ │ │ │ │ │ │ ├── cifs.mount.sample │ │ │ │ │ │ │ ├── nfs.mount.sample │ │ │ │ │ │ │ └── openvpn.service.sample │ │ │ │ │ │ ├── timesyncd.conf.d/ │ │ │ │ │ │ │ └── README │ │ │ │ │ │ ├── tmpfiles.d/ │ │ │ │ │ │ │ └── README │ │ │ │ │ │ └── udev.rules.d/ │ │ │ │ │ │ └── README │ │ │ │ │ ├── hwdb.d/ │ │ │ │ │ │ └── 70-local-keyboard.hwdb │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── patches/ │ │ │ │ │ │ ├── amlogic/ │ │ │ │ │ │ │ ├── systemd-0203-syscall_397_doesnt_exists_on_3.14.patch │ │ │ │ │ │ │ ├── systemd-9999.1-backport.patch │ │ │ │ │ │ │ ├── systemd-9999.2-backport.patch │ │ │ │ │ │ │ ├── systemd-9999.3-backport.patch │ │ │ │ │ │ │ └── systemd-9999.4-backport.patch │ │ │ │ │ │ ├── systemd-0001-move-etc-systemd-system-to-storage-.config-system.d.patch │ │ │ │ │ │ ├── systemd-0002-move-hwdb.bin-to-run.patch │ │ │ │ │ │ ├── systemd-0003-remove-nonexistant-dependency.patch │ │ │ │ │ │ ├── systemd-0200-persist-persistent-timer-stamps.patch │ │ │ │ │ │ ├── systemd-0300-config-env-unhide-cursor.patch │ │ │ │ │ │ ├── systemd-0400-eat-up-rrdrand-on-amd.patch │ │ │ │ │ │ ├── systemd-0500-Add-working-directory-storage-for-debug-shell.patch │ │ │ │ │ │ └── systemd-0900-backport-do-not-update-exec-deps-on-mountinfo-changes.patch │ │ │ │ │ ├── profile.d/ │ │ │ │ │ │ └── 90-systemd.conf │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ ├── kernel-overlays-setup │ │ │ │ │ │ ├── network-base-setup │ │ │ │ │ │ ├── systemd-machine-id-setup │ │ │ │ │ │ ├── systemd-timesyncd-setup │ │ │ │ │ │ ├── usercache-setup │ │ │ │ │ │ └── userconfig-setup │ │ │ │ │ ├── system.d/ │ │ │ │ │ │ ├── debugconfig.service │ │ │ │ │ │ ├── flash.mount.d/ │ │ │ │ │ │ │ └── dependencies.conf │ │ │ │ │ │ ├── hwdb.service │ │ │ │ │ │ ├── kernel-overlays.service │ │ │ │ │ │ ├── machine-id.service │ │ │ │ │ │ ├── network-base.service │ │ │ │ │ │ ├── storage.mount.d/ │ │ │ │ │ │ │ └── dependencies.conf │ │ │ │ │ │ ├── systemd-timesyncd-setup.service │ │ │ │ │ │ ├── systemd-timesyncd.service.d/ │ │ │ │ │ │ │ └── depend-on-kernel-ip-config.conf │ │ │ │ │ │ ├── usercache.service │ │ │ │ │ │ └── userconfig.service │ │ │ │ │ ├── tmpfiles.d/ │ │ │ │ │ │ └── z_01_openelec.conf │ │ │ │ │ └── udev.d/ │ │ │ │ │ ├── 51-these-are-not-joysticks.rules │ │ │ │ │ ├── 60-not-joysticks.rules │ │ │ │ │ └── 80-clock.rules │ │ │ │ ├── u-boot/ │ │ │ │ │ └── package.mk │ │ │ │ ├── u-boot-LePotato/ │ │ │ │ │ └── package.mk │ │ │ │ ├── u-boot-Odroid_C2/ │ │ │ │ │ └── package.mk │ │ │ │ ├── u-boot-tools-aml/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── fw_env.config │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ ├── u-boot-tools-0001-dummy_defconfig.patch │ │ │ │ │ ├── u-boot-tools-0002-allow-multiple-entries.patch │ │ │ │ │ └── u-boot-tools-0003-nand_env-hack.patch │ │ │ │ ├── u-boot_firmware/ │ │ │ │ │ └── package.mk │ │ │ │ └── util-linux/ │ │ │ │ ├── config/ │ │ │ │ │ └── swap.conf │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── util-linux-01-fix-pkgconf.patch │ │ │ │ │ ├── util-linux-0100-enable-lscpu.patch │ │ │ │ │ └── util-linux-blkid_swapon_mkfs_uuidgen.patch │ │ │ │ ├── scripts/ │ │ │ │ │ └── mount-swap │ │ │ │ ├── sysctl.d/ │ │ │ │ │ └── swappiness.conf │ │ │ │ └── system.d/ │ │ │ │ └── swap.service │ │ │ └── patches/ │ │ │ ├── box64/ │ │ │ │ └── 01-fixhwcapatomics.patch │ │ │ ├── box86/ │ │ │ │ └── 01-fixhwcap.patch │ │ │ └── linux/ │ │ │ ├── 0001-backport-upstream-fix-8c0d0da3197815f04252866c2cbd5b.patch │ │ │ ├── 0002-backport-upstream-fix-2cd5629f66e2d55b17d9c66affeccf.patch │ │ │ └── linux-10-add-compatibility-macro-for-input_event_sec.patch │ │ ├── filesystem/ │ │ │ ├── etc/ │ │ │ │ ├── dbus-1/ │ │ │ │ │ └── system.d/ │ │ │ │ │ └── coreelec.settings-xdbus-stoploop.conf │ │ │ │ └── lirc/ │ │ │ │ └── lircd.conf.d/ │ │ │ │ └── odroid-amremote.conf │ │ │ └── usr/ │ │ │ ├── bin/ │ │ │ │ └── cputemp │ │ │ ├── lib/ │ │ │ │ ├── modprobe.d/ │ │ │ │ │ ├── disable-ir-remotes.conf │ │ │ │ │ └── mali.conf │ │ │ │ ├── modules-load.d/ │ │ │ │ │ └── amlvideodri.conf │ │ │ │ ├── systemd/ │ │ │ │ │ ├── sleep.conf.d/ │ │ │ │ │ │ └── sleep.conf │ │ │ │ │ ├── system/ │ │ │ │ │ │ ├── amlogic-dvb.service │ │ │ │ │ │ └── smp-affinity.service │ │ │ │ │ ├── system-shutdown/ │ │ │ │ │ │ └── disk-park.sh │ │ │ │ │ └── system-sleep/ │ │ │ │ │ └── reset_usb_hub.sh │ │ │ │ └── udev/ │ │ │ │ ├── hwdb.d/ │ │ │ │ │ └── 99-buzztv-bt-400-rf.hwdb │ │ │ │ └── rules.d/ │ │ │ │ ├── 99-spidev.rules │ │ │ │ └── 99-xpadneo.rules │ │ │ ├── sbin/ │ │ │ │ └── rebootfromnand │ │ │ └── share/ │ │ │ └── alsa/ │ │ │ └── cards/ │ │ │ ├── AML-AUGESOUND.conf │ │ │ └── AML-MESONAUDIO.conf │ │ ├── packages/ │ │ │ ├── addons/ │ │ │ │ ├── addon-depends/ │ │ │ │ │ ├── attrs/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── jsonschema/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── mbedtls/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── pyrsistent/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ └── qmdnsengine/ │ │ │ │ │ └── package.mk │ │ │ │ ├── driver/ │ │ │ │ │ ├── crazycat/ │ │ │ │ │ │ ├── changelog.txt │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ ├── patches/ │ │ │ │ │ │ │ ├── amlogic-4.9/ │ │ │ │ │ │ │ │ ├── driver.dvb.crazycat-01-remove-rmmod.pl.patch │ │ │ │ │ │ │ │ ├── driver.dvb.crazycat-02-disable-modules.patch │ │ │ │ │ │ │ │ ├── driver.dvb.crazycat-03-config_mycompat_h.patch │ │ │ │ │ │ │ │ ├── driver.dvb.crazycat-04-add-include-prandom-h.patch │ │ │ │ │ │ │ │ └── driver.dvb.crazycat-05-media_build-handle-kernel-sublevel-255.patch │ │ │ │ │ │ │ └── amlogic-5.4/ │ │ │ │ │ │ │ ├── driver.dvb.crazycat-01-remove-rmmod.pl.patch │ │ │ │ │ │ │ ├── driver.dvb.crazycat-02-disable-modules.patch │ │ │ │ │ │ │ ├── driver.dvb.crazycat-03-config_mycompat_h.patch │ │ │ │ │ │ │ ├── driver.dvb.crazycat-04-add-include-prandom-h.patch │ │ │ │ │ │ │ └── driver.dvb.crazycat-05-do-not-handle-warning-as-error.patch │ │ │ │ │ │ └── source/ │ │ │ │ │ │ └── default.py │ │ │ │ │ └── dvb-latest/ │ │ │ │ │ ├── changelog.txt │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── patches/ │ │ │ │ │ │ ├── amlogic-4.9/ │ │ │ │ │ │ │ ├── driver.dvb.dvb-latest-01-remove-rmmod.pl.patch │ │ │ │ │ │ │ ├── driver.dvb.dvb-latest-03-add-include-prandom-h.patch │ │ │ │ │ │ │ └── driver.dvb.dvb-latest-04-media_build-handle-kernel-sublevel-255.patch │ │ │ │ │ │ ├── amlogic-5.4/ │ │ │ │ │ │ │ ├── driver.dvb.dvb-latest-01-remove-rmmod.pl.patch │ │ │ │ │ │ │ ├── driver.dvb.dvb-latest-03-add-include-prandom-h.patch │ │ │ │ │ │ │ └── driver.dvb.dvb-latest-05-do-not-handle-warning-as-error.patch │ │ │ │ │ │ ├── amlogic-common/ │ │ │ │ │ │ │ ├── driver.dvb.dvb-latest-01-config_mycompat_h.patch │ │ │ │ │ │ │ ├── driver.dvb.dvb-latest-02-disable-modules.patch │ │ │ │ │ │ │ ├── driver.dvb.dvb-latest-03-versions.patch │ │ │ │ │ │ │ └── driver.dvb.dvb-latest-06-sched_signal-fix.patch │ │ │ │ │ │ └── driver.dvb.dvb-latest-02-add-to-backports.patch │ │ │ │ │ └── source/ │ │ │ │ │ └── default.py │ │ │ │ └── service/ │ │ │ │ ├── aml-vnc/ │ │ │ │ │ ├── changelog.txt │ │ │ │ │ ├── package.mk │ │ │ │ │ └── source/ │ │ │ │ │ ├── bin/ │ │ │ │ │ │ └── aml-vnc.start │ │ │ │ │ ├── default.py │ │ │ │ │ ├── power.d/ │ │ │ │ │ │ └── aml-vnc.power │ │ │ │ │ ├── resources/ │ │ │ │ │ │ ├── language/ │ │ │ │ │ │ │ ├── resource.language.en_gb/ │ │ │ │ │ │ │ │ └── strings.po │ │ │ │ │ │ │ └── resource.language.hu_hu/ │ │ │ │ │ │ │ └── strings.po │ │ │ │ │ │ └── settings.xml │ │ │ │ │ ├── settings-default.xml │ │ │ │ │ └── system.d/ │ │ │ │ │ └── service.aml-vnc.service │ │ │ │ ├── homatics-leds/ │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── addon.xml │ │ │ │ │ ├── package.mk │ │ │ │ │ └── source/ │ │ │ │ │ ├── default.py │ │ │ │ │ ├── resources/ │ │ │ │ │ │ ├── language/ │ │ │ │ │ │ │ ├── resource.language.de_de/ │ │ │ │ │ │ │ │ └── strings.po │ │ │ │ │ │ │ ├── resource.language.en_gb/ │ │ │ │ │ │ │ │ └── strings.po │ │ │ │ │ │ │ └── resource.language.hu_hu/ │ │ │ │ │ │ │ └── strings.po │ │ │ │ │ │ └── settings.xml │ │ │ │ │ ├── service.py │ │ │ │ │ └── settings-default.xml │ │ │ │ ├── hyperion.ng/ │ │ │ │ │ ├── changelog.txt │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── patches/ │ │ │ │ │ │ ├── Embed-QSQLITE-driver-and-qjpeg-plugin-at-Amlogic-platform.patch │ │ │ │ │ │ └── Fix-missing-Include.patch │ │ │ │ │ └── source/ │ │ │ │ │ ├── bin/ │ │ │ │ │ │ ├── hyperiond.start │ │ │ │ │ │ └── platform.sh │ │ │ │ │ ├── default.py │ │ │ │ │ └── system.d/ │ │ │ │ │ └── service.hyperion.ng.service │ │ │ │ └── openvfd/ │ │ │ │ └── package.mk │ │ │ ├── compress/ │ │ │ │ └── cpio/ │ │ │ │ └── package.mk │ │ │ ├── devel/ │ │ │ │ ├── android-headers/ │ │ │ │ │ └── package.mk │ │ │ │ └── msgpack-c/ │ │ │ │ └── package.mk │ │ │ ├── lang/ │ │ │ │ ├── gcc-linaro-aarch64-elf/ │ │ │ │ │ └── package.mk │ │ │ │ ├── gcc-linaro-arm-eabi/ │ │ │ │ │ └── package.mk │ │ │ │ ├── gcc-riscv-none-embed/ │ │ │ │ │ └── package.mk │ │ │ │ └── gcc7-linaro-aarch64-elf/ │ │ │ │ └── package.mk │ │ │ ├── linux/ │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── amlogic-3.14/ │ │ │ │ │ │ ├── linux-010_sx05re_set_colordepth.patch │ │ │ │ │ │ ├── linux-011-HID-input-fix-confusion-on-conflicting-mappings.patch │ │ │ │ │ │ └── linux-012-HID-fixup-the-conflicting-keyboard-mappings-quirk.patch │ │ │ │ │ ├── default/ │ │ │ │ │ │ ├── linux-051-ouya_controller_support.patch │ │ │ │ │ │ ├── linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch │ │ │ │ │ │ ├── linux-062-imon_pad_ignore_diagonal.patch │ │ │ │ │ │ ├── linux-904-improve-xbox-dvd-remote-performance.patch │ │ │ │ │ │ ├── linux-999-no-lzma-in-x86-perf-build.patch │ │ │ │ │ │ ├── linux-999.02-0001-pm-disable-async-suspend-resume-by-default.patch │ │ │ │ │ │ ├── linux-999.20-i915-pm-Be-less-agressive-with-clockfreq-changes-on-Bay-Trail.patch │ │ │ │ │ │ └── linux-999.21-intel_idle-Disable-C6N-and-C6S-on-Bay-Trail.patch │ │ │ │ │ ├── linux-004_lower_undefined_mode_timeout.patch │ │ │ │ │ ├── linux-007_die_floppy_die.patch │ │ │ │ │ ├── linux-009_disable_i8042_check_on_apple_mac.patch │ │ │ │ │ └── raspberrypi/ │ │ │ │ │ ├── linux-051-ouya_controller_support.patch │ │ │ │ │ ├── linux-052-xbox_dvd_remote_support.patch │ │ │ │ │ ├── linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch │ │ │ │ │ ├── linux-062-imon_pad_ignore_diagonal.patch │ │ │ │ │ ├── linux-902-extend-rc6-toggle-support-for-zotac.patch │ │ │ │ │ ├── linux-903-backport-rcmm-ir-decoder.patch │ │ │ │ │ ├── linux-904-improve-xbox-dvd-remote-performance.patch │ │ │ │ │ └── linux-999.02-0001-pm-disable-async-suspend-resume-by-default.patch │ │ │ │ ├── sysctl.d/ │ │ │ │ │ ├── network.conf │ │ │ │ │ └── qdisc.conf │ │ │ │ └── udev.d/ │ │ │ │ └── 30-disable-wakeup.rules │ │ │ ├── linux-driver-addons/ │ │ │ │ └── dvb/ │ │ │ │ ├── media_tree/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ ├── amlogic-4.9/ │ │ │ │ │ │ ├── media_tree-01-m88ds3103b.patch │ │ │ │ │ │ ├── media_tree-02-add-t230c2.patch │ │ │ │ │ │ ├── media_tree-06-of-node.patch │ │ │ │ │ │ ├── media_tree-08-fix-dvbsky-frontend-detach.patch │ │ │ │ │ │ ├── media_tree-09-revert-access_ok.patch │ │ │ │ │ │ └── media_tree_01-m2m-job-resume-pause.patch │ │ │ │ │ ├── amlogic-5.4/ │ │ │ │ │ │ └── media_tree_01-m2m-job-resume-pause.patch │ │ │ │ │ ├── media_tree-04-fix-blocking-demux.patch │ │ │ │ │ ├── media_tree-06-fix-si2168-cmd-timeout.patch │ │ │ │ │ ├── media_tree-07-fix-si2157-init.patch │ │ │ │ │ └── media_tree-10-revert-serialize-reset-messages-in-m88ds3103_set_frontend.patch │ │ │ │ ├── media_tree_aml/ │ │ │ │ │ └── package.mk │ │ │ │ └── media_tree_cc/ │ │ │ │ └── package.mk │ │ │ ├── linux-drivers/ │ │ │ │ ├── RTL8188EU/ │ │ │ │ │ └── package.mk │ │ │ │ ├── RTL8189FS/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ ├── 0001-Fix-build-for-Amlogic-kernel-version-5.15.78.patch │ │ │ │ │ ├── 0002-Fix-build-for-Amlogic-kernel-version-5.15.119.patch │ │ │ │ │ └── linux-6.7-temp.patch │ │ │ │ ├── RTL8192CU/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ ├── RTL8192CU-0001-add_device_ID_330d.patch │ │ │ │ │ ├── RTL8192CU-0002-fix_310_proc2.patch │ │ │ │ │ ├── RTL8192CU-0101-gcc-4.9.patch │ │ │ │ │ └── RTL8192CU-0102-gcc-5.patch │ │ │ │ ├── RTL8192DU/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ ├── RTL8192DU-0001-remove_overlapping_pids.patch │ │ │ │ │ ├── RTL8192DU-0002-PR61.patch │ │ │ │ │ ├── RTL8192DU-0003-fix-vfs-read.patch │ │ │ │ │ ├── RTL8192DU-0004-revert-fix-for-old-kernels.patch │ │ │ │ │ └── aarch64/ │ │ │ │ │ ├── RTL8192DU-0101-PR63.patch │ │ │ │ │ └── RTL8192DU-0102-fix-multiple-definitions.patch │ │ │ │ ├── RTL8192EU/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── RTL8192EU-0101-gcc-5.patch │ │ │ │ ├── RTL8821CU/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── 001-Enable-RTW-debug-to-get-message-if-RFE-type-is-not-defined.patch │ │ │ │ ├── amlogic/ │ │ │ │ │ ├── RTL8152-aml/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── RTL8188FTV-aml/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── RTL8189ES-aml/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── RTL8189FS-aml/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── RTL8723BS-aml/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── RTL8821CS-aml/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── RTL8822BS-aml/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── RTL8822BU-aml/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── RTL8822CS-aml/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── RTL8822CU-aml/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── RTL8852BS-aml/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── ap6xxx-aml/ │ │ │ │ │ │ ├── modprobe.d/ │ │ │ │ │ │ │ ├── dhd.conf │ │ │ │ │ │ │ └── dhd_sdio.conf │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── udev.d/ │ │ │ │ │ │ └── 80-dhd_sdio.rules │ │ │ │ │ ├── media_modules-aml/ │ │ │ │ │ │ ├── modules-load.d/ │ │ │ │ │ │ │ └── media_modules.conf │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ ├── 002-fix-building.patch │ │ │ │ │ │ └── 003-multi-decoders-limit-maximum-number-of-decoder.patch │ │ │ │ │ ├── mt7668-wifi-bt/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── opentee_linuxdriver/ │ │ │ │ │ │ ├── filesystem/ │ │ │ │ │ │ │ ├── aarch64/ │ │ │ │ │ │ │ │ ├── ta/ │ │ │ │ │ │ │ │ │ └── v3.8/ │ │ │ │ │ │ │ │ │ ├── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ └── dev/ │ │ │ │ │ │ │ │ │ ├── A311D2/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── A311D2J/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── POP1/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── S805C3/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── S805C3L/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── S805X2/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── S805X2G/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── S905C2/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── S905C2ENG/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── S905C2L/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── S905C3/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── S905C3ENG/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── S905C3NMA/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── S905W2/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── S905X4/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── S905Y4/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── T963D4/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── T965D4/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ ├── T982/ │ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ │ └── V918D/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ └── usr/ │ │ │ │ │ │ │ │ ├── lib/ │ │ │ │ │ │ │ │ │ ├── libteec.so.1 │ │ │ │ │ │ │ │ │ └── libteec.so.1.0 │ │ │ │ │ │ │ │ └── sbin/ │ │ │ │ │ │ │ │ ├── tee-supplicant │ │ │ │ │ │ │ │ ├── tee_preload_fw │ │ │ │ │ │ │ │ └── tee_stest │ │ │ │ │ │ │ └── arm/ │ │ │ │ │ │ │ ├── ta/ │ │ │ │ │ │ │ │ └── v3.8/ │ │ │ │ │ │ │ │ ├── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ └── dev/ │ │ │ │ │ │ │ │ ├── A311D2/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── A311D2J/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── POP1/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── S805C3/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── S805X2/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── S805X2G/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── S905C2/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── S905C2ENG/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── S905C2L/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── S905C3/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── S905C3ENG/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── S905C3NMA/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── S905W2/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── S905X4/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── S905Y4/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── T963D4/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── T965D4/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ ├── T982/ │ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ │ └── V918D/ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ └── usr/ │ │ │ │ │ │ │ ├── lib/ │ │ │ │ │ │ │ │ ├── libteec.so.1 │ │ │ │ │ │ │ │ └── libteec.so.1.0 │ │ │ │ │ │ │ └── sbin/ │ │ │ │ │ │ │ ├── tee-supplicant │ │ │ │ │ │ │ ├── tee_preload_fw │ │ │ │ │ │ │ └── tee_stest │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ │ ├── dovi-loader.sh │ │ │ │ │ │ │ └── tee-loader.sh │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ └── opentee_linuxdriver.service │ │ │ │ │ ├── qca6174-aml/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── qca9377-aml/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ ├── patches/ │ │ │ │ │ │ │ ├── amlogic-3.14/ │ │ │ │ │ │ │ │ └── qca9377-aml-001-Modify-SDIO-and-firmware-handling-to-support-chips-u.patch │ │ │ │ │ │ │ └── amlogic-4.9/ │ │ │ │ │ │ │ ├── qca9377-aml-001-fix-amlogic-4.9-compatibility.patch │ │ │ │ │ │ │ ├── qca9377-aml-002-sdio-enable-only-QCA9377-vendor-device-id.patch │ │ │ │ │ │ │ └── qca9377-aml-003-Add-Amlogic-CONFIG_BUILDROOT-for-firmware-path.patch │ │ │ │ │ │ └── udev.d/ │ │ │ │ │ │ └── 99-qca9377-wireless.rules │ │ │ │ │ ├── ssv6xxx-aml/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── patches/ │ │ │ │ │ │ ├── ssv6xxx-aml-001-fix-build-and-firmware-path.patch │ │ │ │ │ │ ├── ssv6xxx-aml-002-fix-driver-after-update.patch │ │ │ │ │ │ └── ssv6xxx-aml-003-force-SSV6051P-when-SSV6030P-is-detected.patch │ │ │ │ │ ├── uwe5631-aml/ │ │ │ │ │ │ ├── firmware/ │ │ │ │ │ │ │ └── wifi_56630001_3ant.ini │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ ├── system.d/ │ │ │ │ │ │ │ └── sprd_sdio-firmware-aml.service │ │ │ │ │ │ └── udev.d/ │ │ │ │ │ │ └── 80-unisoc_sdio.rules │ │ │ │ │ ├── w1-aml/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── udev.d/ │ │ │ │ │ │ └── 80-aml_sdio.rules │ │ │ │ │ └── wifi_dummy-aml/ │ │ │ │ │ ├── modules-load.d/ │ │ │ │ │ │ └── wifi_dummy.conf │ │ │ │ │ ├── package.mk │ │ │ │ │ └── sources/ │ │ │ │ │ ├── Makefile │ │ │ │ │ └── wifi_dummy.c │ │ │ │ ├── gpu-aml/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ ├── gpu-aml-ng-01-fix-cp-error.patch │ │ │ │ │ └── gpu-aml-ng-02-disable-tracepoints.patch │ │ │ │ ├── openvfd-driver/ │ │ │ │ │ ├── openvfd.conf.d/ │ │ │ │ │ │ └── hc4.conf │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ └── openvfd-start │ │ │ │ │ └── system.d/ │ │ │ │ │ └── openvfd.service │ │ │ │ └── smartchip/ │ │ │ │ └── package.mk │ │ │ ├── linux-firmware/ │ │ │ │ ├── amlogic/ │ │ │ │ │ ├── bl301_091020/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── bl301_221119/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── bl301_xxxxxx/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ ├── qca-firmware-aml/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ ├── system.d/ │ │ │ │ │ │ │ └── qca-firmware-aml.service │ │ │ │ │ │ └── udev.d/ │ │ │ │ │ │ └── 80-qca-firmware-aml.rules │ │ │ │ │ └── rtkbt-firmware-aml/ │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── system.d/ │ │ │ │ │ │ └── rtkbt-firmware-aml.service │ │ │ │ │ └── udev.d/ │ │ │ │ │ └── 80-rtkbt-firmware-aml.rules │ │ │ │ ├── brcmfmac_sdio-firmware-aml/ │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── system.d/ │ │ │ │ │ │ ├── brcmfmac_sdio-firmware-aml.service │ │ │ │ │ │ └── brcmfmac_sdio-firmware@.service │ │ │ │ │ └── udev.d/ │ │ │ │ │ └── 80-brcmfmac_sdio.rules │ │ │ │ └── wlan-firmware/ │ │ │ │ └── package.mk │ │ │ ├── mediacenter/ │ │ │ │ ├── CoreELEC-settings/ │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ ├── backup-restore │ │ │ │ │ │ └── factory-reset │ │ │ │ │ └── system.d/ │ │ │ │ │ ├── backup-restore.service │ │ │ │ │ ├── backup-restore.target │ │ │ │ │ ├── factory-reset.service │ │ │ │ │ └── factory-reset.target │ │ │ │ └── kodi/ │ │ │ │ ├── config/ │ │ │ │ │ ├── advancedsettings.xml │ │ │ │ │ ├── appliance.xml │ │ │ │ │ ├── guisettings.xml │ │ │ │ │ ├── kodi.conf.in │ │ │ │ │ ├── network_wait │ │ │ │ │ ├── repository.coreelec/ │ │ │ │ │ │ └── addon.xml │ │ │ │ │ └── sources.xml │ │ │ │ ├── debug.d/ │ │ │ │ │ └── kodi.conf │ │ │ │ ├── package.mk │ │ │ │ ├── profile.d/ │ │ │ │ │ ├── 00-addons.conf │ │ │ │ │ └── 99-kodi.conf │ │ │ │ ├── scripts/ │ │ │ │ │ ├── aml-wait-for-dispcap.sh │ │ │ │ │ ├── kodi-after │ │ │ │ │ ├── kodi-config │ │ │ │ │ ├── kodi-remote │ │ │ │ │ ├── kodi-safe-mode │ │ │ │ │ ├── kodi.sh │ │ │ │ │ ├── pastekodi │ │ │ │ │ ├── service-addon-wrapper │ │ │ │ │ ├── setwakeup.sh │ │ │ │ │ └── xml_merge.py │ │ │ │ ├── sleep.d/ │ │ │ │ │ ├── openelec-sleep.sh │ │ │ │ │ └── wifi.power │ │ │ │ ├── sleep.d.serial/ │ │ │ │ │ ├── 10-addon-sleep.sh │ │ │ │ │ └── 20-custom-sleep.sh │ │ │ │ ├── system.d/ │ │ │ │ │ ├── kodi-autostart.service │ │ │ │ │ ├── kodi-cleanlogs.service │ │ │ │ │ ├── kodi-cleanpackagecache.service │ │ │ │ │ ├── kodi-halt.service │ │ │ │ │ ├── kodi-lirc-suspend.service │ │ │ │ │ ├── kodi-poweroff.service │ │ │ │ │ ├── kodi-reboot.service │ │ │ │ │ ├── kodi-waitonnetwork.service │ │ │ │ │ ├── kodi.service │ │ │ │ │ └── kodi.target │ │ │ │ └── tmpfiles.d/ │ │ │ │ ├── kodi-userdirs.conf │ │ │ │ └── kodi.conf │ │ │ ├── multimedia/ │ │ │ │ ├── libamcodec/ │ │ │ │ │ └── package.mk │ │ │ │ ├── libdovi/ │ │ │ │ │ └── package.mk │ │ │ │ └── obu_util/ │ │ │ │ ├── package.mk │ │ │ │ └── sources/ │ │ │ │ ├── aom_codec.h │ │ │ │ ├── aom_config.h │ │ │ │ ├── aom_config.h-orig.h │ │ │ │ ├── aom_image.h │ │ │ │ ├── aom_integer.c │ │ │ │ ├── aom_integer.h │ │ │ │ ├── bitops.h │ │ │ │ ├── bitreader_buffer.c │ │ │ │ ├── bitreader_buffer.h │ │ │ │ ├── msvc.h │ │ │ │ ├── obu_util.c │ │ │ │ ├── obu_util.h │ │ │ │ └── recenter.h │ │ │ ├── network/ │ │ │ │ └── rfkill/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── rfkill-0001-fix-version-sh.patch │ │ │ ├── sysutils/ │ │ │ │ ├── amremote/ │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ └── remote-config │ │ │ │ │ └── system.d/ │ │ │ │ │ └── remote-config.service │ │ │ │ ├── dtb-xml/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── scripts/ │ │ │ │ │ └── dtb-xml.sh │ │ │ │ ├── inject_bl301/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── bl301.conf │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ ├── check-bl301.sh │ │ │ │ │ │ └── update-bl301.sh │ │ │ │ │ └── system.d/ │ │ │ │ │ └── update-bl301.service │ │ │ │ ├── tee_preload_fw/ │ │ │ │ │ ├── filesystem/ │ │ │ │ │ │ └── usr/ │ │ │ │ │ │ ├── lib/ │ │ │ │ │ │ │ ├── libteec.so.1.0 │ │ │ │ │ │ │ └── ta/ │ │ │ │ │ │ │ ├── A311D2/ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ ├── S905W2/ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ ├── S905X4/ │ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ │ └── S905Y4/ │ │ │ │ │ │ │ └── 526fc4fc-7ee6-4a12-96e3-83da9565bce8.ta │ │ │ │ │ │ └── sbin/ │ │ │ │ │ │ ├── tee-supplicant │ │ │ │ │ │ ├── tee_preload_fw │ │ │ │ │ │ └── tee_stest │ │ │ │ │ ├── package.mk │ │ │ │ │ └── scripts/ │ │ │ │ │ └── trusted-application-setup │ │ │ │ └── tmate/ │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ └── path-adjustments.patch │ │ │ │ ├── scripts/ │ │ │ │ │ └── tmate-pre.sh │ │ │ │ └── system.d/ │ │ │ │ └── tmate.service │ │ │ ├── tools/ │ │ │ │ ├── CoreELEC-Debug-Scripts/ │ │ │ │ │ └── package.mk │ │ │ │ ├── aml-dtbtools/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ ├── 0001-change-permisson-on-output-file.patch │ │ │ │ │ └── 0002-add-gzip-compression-support.patch │ │ │ │ ├── ceemmc/ │ │ │ │ │ └── package.mk │ │ │ │ ├── entware/ │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── profile.d/ │ │ │ │ │ │ └── 99-entware.conf │ │ │ │ │ ├── scripts/ │ │ │ │ │ │ └── installentware │ │ │ │ │ └── system.d/ │ │ │ │ │ └── entware.service │ │ │ │ ├── rtk_hciattach/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ ├── rtk_hciattach-01-Makefile.patch │ │ │ │ │ └── rtk_hciattach-02-change-location-of-btaddr-file.patch │ │ │ │ ├── u-boot-script/ │ │ │ │ │ └── package.mk │ │ │ │ └── u-boot-tools/ │ │ │ │ ├── config/ │ │ │ │ │ └── fw_env.config │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ ├── u-boot-tools-0001-dummy_defconfig.patch │ │ │ │ ├── u-boot-tools-0002-allow-multiple-entries.patch │ │ │ │ └── u-boot-tools-0003-nand_env-hack.patch │ │ │ └── virtual/ │ │ │ └── remote/ │ │ │ └── package.mk │ │ └── patches/ │ │ ├── RTL8812AU-/ │ │ │ └── 0001-Fix-for-Amlogic-kernel-5.15.78.patch │ │ └── RTL8822BU-aml/ │ │ └── 0001-Fix-for-Amlogic-kernel-5.15.78.patch │ ├── Generic/ │ │ ├── config/ │ │ │ └── ovf.template │ │ ├── devices/ │ │ │ ├── gbm/ │ │ │ │ └── options │ │ │ ├── wayland/ │ │ │ │ └── options │ │ │ └── x11/ │ │ │ ├── filesystem/ │ │ │ │ ├── etc/ │ │ │ │ │ └── X11/ │ │ │ │ │ └── xorg-i915.conf │ │ │ │ └── usr/ │ │ │ │ ├── bin/ │ │ │ │ │ └── intel-fullrange.sh │ │ │ │ └── lib/ │ │ │ │ └── systemd/ │ │ │ │ └── system/ │ │ │ │ ├── intel-fullrange-resume.service │ │ │ │ └── intel-fullrange.service │ │ │ ├── options │ │ │ └── patches/ │ │ │ ├── kodi/ │ │ │ │ ├── kodi-100.06-dont-set-_NET_WM_STATE_FULLSCREEN.patch │ │ │ │ └── kodi-100.12-prevent-kodi-switching-to-windowed-mode.patch │ │ │ └── linux/ │ │ │ ├── linux-revert-acpi-bus-get-device-5-18.patch │ │ │ └── linux-revert-fbdev--Make-registered-fb---private-to-fbmem-6-1.patch │ │ ├── filesystem/ │ │ │ └── usr/ │ │ │ ├── bin/ │ │ │ │ └── cputemp │ │ │ └── share/ │ │ │ └── bootloader/ │ │ │ └── canupdate.sh │ │ ├── kodi/ │ │ │ └── advancedsettings.xml │ │ ├── linux/ │ │ │ └── linux.x86_64.conf │ │ ├── options │ │ └── packages/ │ │ ├── initramfs/ │ │ │ └── config/ │ │ │ └── initramfs.x86_64.conf │ │ └── linux/ │ │ └── modprobe.d/ │ │ └── ath9k.conf │ ├── NXP/ │ │ ├── devices/ │ │ │ ├── iMX6/ │ │ │ │ ├── bootloader/ │ │ │ │ │ ├── canupdate.sh │ │ │ │ │ ├── install │ │ │ │ │ ├── mkimage │ │ │ │ │ ├── release │ │ │ │ │ └── update.sh │ │ │ │ ├── filesystem/ │ │ │ │ │ └── usr/ │ │ │ │ │ ├── bin/ │ │ │ │ │ │ ├── rdu-audio │ │ │ │ │ │ └── rdu-network │ │ │ │ │ ├── lib/ │ │ │ │ │ │ └── systemd/ │ │ │ │ │ │ └── system/ │ │ │ │ │ │ ├── rdu-audio.service │ │ │ │ │ │ └── rdu-network.service │ │ │ │ │ └── share/ │ │ │ │ │ └── alsa/ │ │ │ │ │ └── cards/ │ │ │ │ │ └── dw-hdmi-ahb-aud.conf │ │ │ │ ├── linux/ │ │ │ │ │ └── linux.arm.conf │ │ │ │ ├── options │ │ │ │ └── patches/ │ │ │ │ ├── kodi/ │ │ │ │ │ ├── 0001-hack-force-YUYV-output-from-v4l2.patch │ │ │ │ │ └── 0002-hack-disable-use-of-video-plane.patch │ │ │ │ └── linux/ │ │ │ │ ├── linux-001-imx6qdl-wandboard-revc1-dtsi-bluetooth.patch │ │ │ │ └── linux-011-imx6qdl-sr-som-brcm-dtsi-bluetooth.patch │ │ │ └── iMX8/ │ │ │ ├── bootloader/ │ │ │ │ ├── firmware │ │ │ │ ├── install │ │ │ │ ├── mkimage │ │ │ │ ├── release │ │ │ │ └── update.sh │ │ │ ├── filesystem/ │ │ │ │ └── usr/ │ │ │ │ └── bin/ │ │ │ │ ├── cputemp │ │ │ │ ├── gputemp │ │ │ │ └── install2emmc │ │ │ ├── linux/ │ │ │ │ └── linux.aarch64.conf │ │ │ ├── options │ │ │ └── patches/ │ │ │ ├── linux/ │ │ │ │ ├── 0001-drm-bridge-mhdp-Add-cdns-mhdp-driver-bridge-driver.patch │ │ │ │ ├── 0002-MLK-24065-1-drm-bridge-cadence-fix-dp_aux_transfer-w.patch │ │ │ │ ├── 0003-MLK-24065-3-drm-bridge-cadence-use-the-lane-mapping-.patch │ │ │ │ ├── 0004-MLK-24065-2-drm-bridge-cadence-print-error-when-cloc.patch │ │ │ │ ├── 0005-LF-1511-drm-cdn-cec-replace-i-with-i-in-loop.patch │ │ │ │ ├── 0006-LF-1512-drm-cdns-mhdp-avoid-potentially-overflowing.patch │ │ │ │ ├── 0007-MLK-24335-drm-bridge-cdns-hdmi-support-work-in-DVI-m.patch │ │ │ │ ├── 0008-LF-1762-21-gpu-drm-bridge-cadence-hdmi-update-API-.m.patch │ │ │ │ ├── 0009-LF-2271-1-drm-bridge-cdns-Use-colorspace-connector-p.patch │ │ │ │ ├── 0010-MLK-24770-drm-mhdp-Sync-DPTX-capability-with-Cadence.patch │ │ │ │ ├── 0011-MLK-24520-drm-bridge-cdns-increase-maximum-width-fro.patch │ │ │ │ ├── 0012-MLK-24521-drm-bridge-hdmi-Prevent-the-driver-from-re.patch │ │ │ │ ├── 0013-MLK-23642-1-drm-bridge-cadence-support-HBR-and-6-cha.patch │ │ │ │ ├── 0014-MLK-24611-2-drm-bridge-cdns-Add-callback-function-fo.patch │ │ │ │ ├── 0015-gpu-drm-dridge-hdp-audio-change-to-mute_stream.patch │ │ │ │ ├── 0016-LF-2744-drm-cdns-reset-force_mode_set-flag-in-atomic.patch │ │ │ │ ├── 0017-MLK-24081-03-drm-bridge-cdns-cec-support-hdmi-rx-cec.patch │ │ │ │ ├── 0018-MLK-25199-3-drm-bridge-mhdp_common-add-apb-config-fu.patch │ │ │ │ ├── 0019-MLK-25199-4-drm-bridge-mhdp_hdmi-set-clear-avmute-bi.patch │ │ │ │ ├── 0020-MLK-25199-5-drm-bridge-mhdp_hdcp-add-HDMI-TX-HDCP-dr.patch │ │ │ │ ├── 0021-LF-3272-drm-cdns_mhdp-fix-Coverity-Issue-11566406.patch │ │ │ │ ├── 0022-LF-3271-drm-cdns-hdmi-fix-Coverity-Issue-11566407.patch │ │ │ │ ├── 0023-LF-3270-drm-cdns-hdmi-fix-coverity-Issue-11566405.patch │ │ │ │ ├── 0024-LF-3269-drm-cdns-hdmi-fix-coverity-Issue-11566404.patch │ │ │ │ ├── 0025-LF-3268-drm-cdns-hdmi-fix-Coverity-Issue-11566403.patch │ │ │ │ ├── 0026-LF-3367-1-drm-cdns_hdmi-HDCP_STATE_DISABLING-may-mis.patch │ │ │ │ ├── 0027-LF-3367-2-drm-mhdp-more-time-for-FW-alive-check.patch │ │ │ │ ├── 0028-LF-3367-3-drm-mhdp-hdcp-adjust-state-handle-priority.patch │ │ │ │ ├── 0029-clk-imx8mq-add-27MHz-PHY-ref-clock.patch │ │ │ │ ├── 0030-drm-imx-Add-mhdp-dp-hdmi-driver-for-imx8x-platform.patch │ │ │ │ ├── 0031-LF-1514-drm-cdns-mhdp-check-link-rate-index.patch │ │ │ │ ├── 0032-LF-1516-drm-cdns-mhdp-fix-error-check-variable-name-.patch │ │ │ │ ├── 0033-MLK-24601-drm-imx-mhdp-DP-PHY-support-1-2-lanes-mode.patch │ │ │ │ ├── 0034-MLK-24519-2-gpu-imx-Increase-maximum-single-pipe-wid.patch │ │ │ │ ├── 0035-MLK-24072-drm-imx8-correct-mhdp-files-copyright.patch │ │ │ │ ├── 0036-LF-2744-drm-cdns-reset-force_mode_set-flag-in-atomic.patch │ │ │ │ ├── 0037-MLK-25199-1-drm-mhdp-Add-hdmi-phy-reset-poweroff-fun.patch │ │ │ │ ├── 0038-MLK-25199-2-drm-mhdp-Fix-typo-for-hdmi-phy-configura.patch │ │ │ │ ├── 0040-drm-imx-dcss-use-the-external-27MHz-phy-clock.patch │ │ │ │ ├── 0041-drm-imx-dcss-add-component-framework-functionality.patch │ │ │ │ ├── 0043-arm64-dts-imx8mq-add-DCSS-node.patch │ │ │ │ ├── 0044-arm64-dts-imx8mq-add-DCSS-external-oscillator-suppor.patch │ │ │ │ ├── 0045-arm64-dts-fsl-imx8mq-add-HDP-bridge-node.patch │ │ │ │ ├── 0046-arm64-dts-fsl-imx8mq-evk-enable-DCSS-and-HDMI.patch │ │ │ │ ├── 0047-arm64-dts-fsl-imx8mq-pico-pi-enable-DCSS-and-HDMI.patch │ │ │ │ ├── 0048-drm-imx-mhdp-don-t-depend-on-DRM_IMX.patch │ │ │ │ ├── 0049-drm-cadence-shutup-cec-logging.patch │ │ │ │ └── 0050-drm-display-drm-hdmi-helper-h.patch │ │ │ └── u-boot/ │ │ │ └── 0005-pico-imx8mq-add-distro-boot-cmd-support.patch │ │ └── options │ ├── Qualcomm/ │ │ └── devices/ │ │ └── Dragonboard/ │ │ ├── README.md │ │ ├── bootloader/ │ │ │ ├── install │ │ │ ├── release │ │ │ └── update.sh │ │ ├── linux/ │ │ │ └── linux.aarch64.conf │ │ ├── options │ │ ├── packages/ │ │ │ └── mkbootimg/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ └── mkbootimg-0001-add-extra-devices.patch │ │ └── patches/ │ │ └── linux/ │ │ └── linux-0001-set-default-mac.patch │ ├── RPi/ │ │ ├── devices/ │ │ │ ├── RPi/ │ │ │ │ ├── config/ │ │ │ │ │ └── distroconfig.txt │ │ │ │ ├── kodi/ │ │ │ │ │ └── appliance.xml │ │ │ │ ├── linux/ │ │ │ │ │ └── linux.arm.conf │ │ │ │ └── options │ │ │ ├── RPi2/ │ │ │ │ ├── config/ │ │ │ │ │ ├── distroconfig-composite.txt │ │ │ │ │ └── distroconfig.txt │ │ │ │ ├── linux/ │ │ │ │ │ └── linux.arm.conf │ │ │ │ └── options │ │ │ ├── RPi4/ │ │ │ │ ├── config/ │ │ │ │ │ ├── distroconfig-composite.txt │ │ │ │ │ └── distroconfig.txt │ │ │ │ ├── kodi/ │ │ │ │ │ └── appliance.xml │ │ │ │ ├── linux/ │ │ │ │ │ └── linux.aarch64.conf │ │ │ │ └── options │ │ │ └── RPi5/ │ │ │ ├── config/ │ │ │ │ ├── config.txt │ │ │ │ ├── distroconfig-composite.txt │ │ │ │ └── distroconfig.txt │ │ │ ├── kodi/ │ │ │ │ └── appliance.xml │ │ │ ├── linux/ │ │ │ │ └── linux.aarch64.conf │ │ │ ├── options │ │ │ └── patches/ │ │ │ └── mesa/ │ │ │ ├── 0001-broadcom-cle-clif-common-simulator-add-7.1-version-o.patch │ │ │ ├── 0002-broadcom-simulator-reset-CFG7-for-compute-dispatch-i.patch │ │ │ ├── 0003-broadcom-cle-update-the-packet-definitions-for-new-g.patch │ │ │ ├── 0004-broadcom-common-retrieve-V3D-revision-number.patch │ │ │ ├── 0005-broadcom-common-add-some-common-v71-helpers.patch │ │ │ ├── 0006-broadcom-qpu-add-comments-on-waddr-not-used-on-V3D-7.patch │ │ │ ├── 0007-broadcom-qpu-set-V3D-7.x-names-for-some-waddr-aliasi.patch │ │ │ ├── 0008-broadcom-compiler-rename-small_imm-to-small_imm_b.patch │ │ │ ├── 0009-broadcom-compiler-add-small_imm-a-c-d-on-v3d_qpu_sig.patch │ │ │ ├── 0010-broadcom-qpu-add-v71-signal-map.patch │ │ │ ├── 0011-broadcom-qpu-define-v3d_qpu_input-use-on-v3d_qpu_alu.patch │ │ │ ├── 0012-broadcom-qpu-add-raddr-on-v3d_qpu_input.patch │ │ │ ├── 0013-broadcom-qpu-defining-shift-mask-for-raddr_c-d.patch │ │ │ ├── 0014-broadcom-commmon-add-has_accumulators-field-on-v3d_d.patch │ │ │ ├── 0015-broadcom-qpu-add-qpu_writes_rf0_implicitly-helper.patch │ │ │ ├── 0016-broadcom-qpu-add-pack-unpack-support-for-v71.patch │ │ │ ├── 0017-broadcom-compiler-update-node-temp-translation-for-v.patch │ │ │ ├── 0018-broadcom-compiler-phys-index-depends-on-hw-version.patch │ │ │ ├── 0019-broadcom-compiler-don-t-favor-select-accum-registers.patch │ │ │ ├── 0020-broadcom-vir-implement-is_no_op_mov-for-v71.patch │ │ │ ├── 0021-broadcom-compiler-update-vir_to_qpu-set_src-for-v71.patch │ │ │ ├── 0022-broadcom-qpu_schedule-add-process_raddr_deps.patch │ │ │ ├── 0023-broadcom-qpu-update-disasm_raddr-for-v71.patch │ │ │ ├── 0024-broadcom-qpu-return-false-on-qpu_writes_accumulatorX.patch │ │ │ ├── 0025-broadcom-compiler-add-support-for-varyings-on-nir-to.patch │ │ │ ├── 0026-broadcom-compiler-payload_w-is-loaded-on-rf3-for-v71.patch │ │ │ ├── 0027-broadcom-qpu_schedule-update-write-deps-for-v71.patch │ │ │ ├── 0028-broadcom-compiler-update-register-classes-to-not-inc.patch │ │ │ ├── 0029-broadcom-compiler-implement-reads-writes-too-soon-ch.patch │ │ │ ├── 0030-broadcom-compiler-implement-read-stall-check-for-v71.patch │ │ │ ├── 0031-broadcom-compiler-add-a-v3d71_qpu_writes_waddr_expli.patch │ │ │ ├── 0032-broadcom-compiler-prevent-rf2-3-usage-in-thread-end-.patch │ │ │ ├── 0033-broadcom-qpu-add-new-ADD-opcodes-for-FMOV-MOV-in-v71.patch │ │ │ ├── 0034-broadcom-qpu-fix-packing-unpacking-of-fmov-variants-.patch │ │ │ ├── 0035-broadcom-qpu-implement-switch-rules-for-fmin-fmax-fa.patch │ │ │ ├── 0036-broadcom-compiler-make-vir_write_rX-return-false-on-.patch │ │ │ ├── 0037-broadcom-compiler-rename-vir_writes_rX-to-vir_writes.patch │ │ │ ├── 0038-broadcom-compiler-only-handle-accumulator-classes-if.patch │ │ │ ├── 0039-broadcom-compiler-don-t-assign-rf0-to-temps-across-i.patch │ │ │ ├── 0040-broadcom-compiler-CS-payload-registers-have-changed-.patch │ │ │ ├── 0041-broadcom-compiler-don-t-schedule-rf0-writes-right-af.patch │ │ │ ├── 0042-broadcom-compiler-allow-instruction-merges-in-v71.patch │ │ │ ├── 0043-broadcom-qpu-add-MOV-integer-packing-unpacking-varia.patch │ │ │ ├── 0044-broadcom-qpu-fail-packing-on-unhandled-mul-pack-unpa.patch │ │ │ ├── 0045-broadcom-compiler-generalize-check-for-shaders-using.patch │ │ │ ├── 0046-broadcom-compiler-v71-isn-t-affected-by-double-round.patch │ │ │ ├── 0047-broadcom-compiler-update-one-TMUWT-restriction-for-v.patch │ │ │ ├── 0048-broadcom-compiler-update-ldunif-ldvary-comment-for-v.patch │ │ │ ├── 0049-broadcom-compiler-update-payload-registers-handling-.patch │ │ │ ├── 0050-broadcom-compiler-update-peripheral-access-restricti.patch │ │ │ ├── 0051-broadcom-qpu-add-packing-for-fmov-on-ADD-alu.patch │ │ │ ├── 0052-broadcom-compiler-handle-rf0-flops-storage-restricti.patch │ │ │ ├── 0053-broadcom-compiler-enable-ldvary-pipelining-on-v71.patch │ │ │ ├── 0054-broadcom-compiler-try-to-use-ldunif-a-instead-of-ldu.patch │ │ │ ├── 0055-broadcom-compiler-don-t-assign-rf0-to-temps-that-con.patch │ │ │ ├── 0056-broadcom-compiler-convert-mul-to-add-when-needed-to-.patch │ │ │ ├── 0057-broadcom-compiler-implement-small-immediates-for-v71.patch │ │ │ ├── 0058-broadcom-compiler-update-thread-end-restrictions-for.patch │ │ │ ├── 0059-broadcom-compiler-update-ldvary-thread-switch-delay-.patch │ │ │ ├── 0060-broadcom-compiler-lift-restriction-for-branch-msfign.patch │ │ │ ├── 0061-broadcom-compiler-start-allocating-from-RF-4-in-V7.x.patch │ │ │ ├── 0062-broadcom-compiler-validate-restrictions-after-TLB-Z-.patch │ │ │ ├── 0063-broadcom-compiler-lift-restriction-on-vpmwt-in-last-.patch │ │ │ ├── 0064-broadcom-compiler-fix-up-copy-propagation-for-v71.patch │ │ │ ├── 0065-broadcom-qpu-new-packing-conversion-v71-instructions.patch │ │ │ ├── 0066-nir-add-new-opcodes-to-map-new-v71-packing-conversio.patch │ │ │ ├── 0067-broadcom-compiler-update-image-store-lowering-to-use.patch │ │ │ ├── 0068-broadcom-compiler-don-t-allocate-spill-base-to-rf0-i.patch │ │ │ ├── 0069-broadcom-compiler-improve-allocation-for-final-progr.patch │ │ │ ├── 0070-broadcom-compiler-don-t-assign-registers-to-unused-n.patch │ │ │ ├── 0071-broadcom-compiler-only-assign-rf0-as-last-resort-in-.patch │ │ │ ├── 0072-v3dv-recover-non-conformant-warning-for-not-fully-su.patch │ │ │ ├── 0073-v3dv-meson-add-v71-hw-generation.patch │ │ │ ├── 0074-v3dv-expose-V3D-revision-number-in-device-name.patch │ │ │ ├── 0075-v3dv-device-handle-new-rpi5-device-bcm2712.patch │ │ │ ├── 0076-v3dv-cmd_buffer-emit-TILE_BINNING_MODE_CFG-for-v71.patch │ │ │ ├── 0077-v3dv-emit-TILE_RENDERING_MODE_CFG_COMMON-for-v71.patch │ │ │ ├── 0078-v3dv-cmd_buffer-emit-TILE_RENDERING_MODE_CFG_RENDER_.patch │ │ │ ├── 0079-v3dvx-cmd_buffer-emit-CLEAR_RENDER_TARGETS-for-v71.patch │ │ │ ├── 0080-v3dv-cmd_buffer-emit-CLIPPER_XY_SCALING-for-v71.patch │ │ │ ├── 0081-v3dv-uniforms-update-VIEWPORT_X-Y_SCALE-uniforms-for.patch │ │ │ ├── 0082-v3dv-cmd_buffer-just-don-t-fill-up-early-z-fields-fo.patch │ │ │ ├── 0083-v3dv-default-vertex-attribute-values-are-gen-dependa.patch │ │ │ ├── 0084-v3dv-pipeline-default-vertex-attributes-values-are-n.patch │ │ │ ├── 0085-v3dv-pipeline-handle-GL_SHADER_STATE_RECORD-changed-.patch │ │ │ ├── 0086-v3dv-setup-render-pass-color-clears-for-any-format-b.patch │ │ │ ├── 0087-v3dv-setup-TLB-clear-color-for-meta-operations-in-v7.patch │ │ │ ├── 0088-v3dv-fix-up-texture-shader-state-for-v71.patch │ │ │ ├── 0089-v3dv-handle-new-texture-state-transfer-functions-in-.patch │ │ │ ├── 0090-v3dv-implement-noop-job-for-v71.patch │ │ │ ├── 0091-v3dv-handle-render-pass-global-clear-for-v71.patch │ │ │ ├── 0092-v3dv-GFX-1461-does-not-affect-V3D-7.x.patch │ │ │ ├── 0093-v3dv-update-thread-end-restrictions-validation-for-v.patch │ │ │ ├── 0094-v3dv-handle-early-Z-S-clears-for-v71.patch │ │ │ ├── 0095-v3dv-handle-RTs-with-no-color-targets-in-v71.patch │ │ │ ├── 0096-v3dv-no-specific-separate_segments-flag-for-V3D-7.1.patch │ │ │ ├── 0097-v3dv-don-t-convert-floating-point-border-colors-in-v.patch │ │ │ ├── 0098-v3dv-handle-Z-clipping-in-v71.patch │ │ │ ├── 0099-broadcom-common-add-TFU-register-definitions-for-v71.patch │ │ │ ├── 0100-broadcom-simulator-TFU-register-names-changed-for-v7.patch │ │ │ ├── 0101-v3dv-add-support-for-TFU-jobs-in-v71.patch │ │ │ ├── 0102-v3dv-make-v3dv_viewport_compute_xform-depend-on-the-.patch │ │ │ ├── 0103-v3dv-fix-depth-clipping-then-Z-scale-is-too-small-in.patch │ │ │ ├── 0104-v3d-add-a-non-conformant-warning-for-not-fully-suppo.patch │ │ │ ├── 0105-v3d-add-v71-hw-generation.patch │ │ │ ├── 0106-v3d-emit-TILE_BINNING_MODE_CFG-for-v71.patch │ │ │ ├── 0107-v3d-emit-TILE_RENDERING_MODE_CFG_COMMON-for-v71.patch │ │ │ ├── 0108-v3d-TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1.patch │ │ │ ├── 0109-v3d-emit-CLEAR_RENDER_TARGETS-for-v71.patch │ │ │ ├── 0110-v3d-just-don-t-fill-up-early-z-fields-for-CFG_BITS-f.patch │ │ │ ├── 0111-v3d-emit-CLIPPER_XY_SCALING-for-v71.patch │ │ │ ├── 0112-v3d-no-specific-separate_segments-flag-for-V3D-7.1.patch │ │ │ ├── 0113-v3d-default-vertex-attributes-values-are-not-needed-.patch │ │ │ ├── 0114-v3d-uniforms-update-VIEWPORT_X-Y_SCALE-uniforms-for-.patch │ │ │ ├── 0115-v3d-handle-new-texture-state-transfer-functions-in-v.patch │ │ │ ├── 0116-v3d-handle-new-TEXTURE_SHADER_STATE-v71-YCbCr-fields.patch │ │ │ ├── 0117-v3d-setup-render-pass-color-clears-for-any-format-bp.patch │ │ │ ├── 0118-v3d-GFX-1461-does-not-affect-V3D-7.x.patch │ │ │ ├── 0119-v3d-don-t-convert-floating-point-border-colors-in-v7.patch │ │ │ ├── 0120-v3d-handle-Z-clipping-in-v71.patch │ │ │ ├── 0121-v3d-add-support-for-TFU-blit-in-v71.patch │ │ │ ├── 0122-v3d-v3dv-fix-texture-state-array-stride-packing-for-.patch │ │ │ ├── 0123-v3d-v3dv-support-up-to-8-render-targets-in-v7.1.patch │ │ │ ├── 0124-v3d-v3dv-don-t-use-max-internal-bpp-for-tile-sizing-.patch │ │ │ ├── 0125-v3dv-implement-depthBounds-support-for-v71.patch │ │ │ ├── 0126-v3d-v3dv-propagate-NaNs-bits-in-shader-state-records.patch │ │ │ ├── 0127-v3dv-use-new-texture-shader-state-rb_swap-and-revers.patch │ │ │ ├── 0128-v3dv-fix-color-write-mask-for-v3d-7.x.patch │ │ │ ├── 0129-v3d-v3dv-fix-depth-bias-for-v3d-7.x.patch │ │ │ ├── 0130-v3d-v3dv-fix-compute-for-V3D-7.1.6.patch │ │ │ ├── 0131-broadcom-add-performance-counters-for-V3D-7.x.patch │ │ │ ├── 0132-broadcom-simulator-add-per-hw-version-calls.patch │ │ │ ├── 0133-v3dv-expose-fullDrawIndexUint32-in-V3D-7.x.patch │ │ │ ├── 0134-v3dv-expose-depthClamp-in-V3D-7.x.patch │ │ │ ├── 0135-v3dv-temporary-disable-EXT_acquire_drm_display.patch │ │ │ ├── 0136-v3dv-expose-scalarBlockLayout-on-V3D-7.x.patch │ │ │ ├── 0137-dri-Limit-the-max_num_back-to-2-on-COMPLETE_MODE_FLI.patch │ │ │ ├── 0138-v3d-Ignore-SCANOUT-usage-flags-when-not-needed-under.patch │ │ │ ├── 0139-Add-a-hack-to-avoid-the-shadow-tex-update-for-import.patch │ │ │ ├── 0140-vc4-Fix-mask-RGBA-validation-at-YUV-blit.patch │ │ │ ├── 0141-vc4-mark-buffers-as-initialized-at-vc4_texture_subda.patch │ │ │ └── 0142-gallium-Add-kmsro-drivers-for-RP1-DSI-DPI-and-VEC-de.patch │ │ ├── filesystem/ │ │ │ └── usr/ │ │ │ ├── bin/ │ │ │ │ └── cputemp │ │ │ ├── lib/ │ │ │ │ └── udev/ │ │ │ │ └── rules.d/ │ │ │ │ └── 80-alsa-preallocsize.rules │ │ │ └── share/ │ │ │ └── alsa/ │ │ │ └── cards/ │ │ │ ├── RPi-WM8804.conf │ │ │ └── bcm2835_alsa.conf │ │ ├── kodi/ │ │ │ ├── advancedsettings.xml │ │ │ └── appliance.xml │ │ ├── options │ │ ├── packages/ │ │ │ ├── linux/ │ │ │ │ └── modprobe.d/ │ │ │ │ └── ath9k.conf │ │ │ └── systemd/ │ │ │ └── scripts/ │ │ │ └── cpufreq │ │ └── patches/ │ │ └── kodi/ │ │ ├── 0001-CDVDVideoCodecDRMPRIME-Also-support-YUV420-buffers.patch │ │ ├── 0002-gbm-Set-max-bpc-for-high-bit-depth-videos.patch │ │ ├── 0003-CVideoLayerBridgeDRMPRIME-add-colourspace-connector-.patch │ │ ├── 0004-CDVDVideoCodecDRMPRIME-Adjust-av-formats-to-match-re.patch │ │ ├── 0005-DVDVideoCodecDRMPRIME-Support-YUV422-and-YUV444-form.patch │ │ ├── 0006-VideoBufferDMA-Support-exporting-YCbCr444-buffers.patch │ │ └── 0007-DVDVideoCodecDRMPRIME-Add-support-for-arbitrary-outp.patch │ ├── Rockchip/ │ │ ├── README.md │ │ ├── bootloader/ │ │ │ ├── canupdate.sh │ │ │ ├── config │ │ │ ├── firmware │ │ │ ├── install │ │ │ ├── mkimage │ │ │ ├── release │ │ │ └── update.sh │ │ ├── devices/ │ │ │ ├── GameForce/ │ │ │ │ ├── README.md │ │ │ │ ├── bootloader/ │ │ │ │ │ ├── canupdate.sh │ │ │ │ │ ├── config │ │ │ │ │ ├── install │ │ │ │ │ ├── mkimage │ │ │ │ │ ├── release │ │ │ │ │ └── update.sh │ │ │ │ ├── linux/ │ │ │ │ │ └── gameforce-4.4/ │ │ │ │ │ └── linux.aarch64.conf │ │ │ │ ├── options │ │ │ │ ├── packages/ │ │ │ │ │ ├── enable-oga-sleep/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ └── sources/ │ │ │ │ │ │ ├── sleep.conf │ │ │ │ │ │ └── sleep.sh │ │ │ │ │ ├── odroidgoa-utils/ │ │ │ │ │ │ ├── package.mk │ │ │ │ │ │ ├── sources/ │ │ │ │ │ │ │ ├── headphone_sense.sh │ │ │ │ │ │ │ ├── odroidgoa_utils.sh │ │ │ │ │ │ │ └── oga_events.py │ │ │ │ │ │ └── system.d/ │ │ │ │ │ │ ├── odroidgoa-headphones.service │ │ │ │ │ │ └── odroidgoa-hotkeys.service │ │ │ │ │ ├── rkwifibt/ │ │ │ │ │ │ └── package.mk │ │ │ │ │ └── uinput_joystick/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── system.d/ │ │ │ │ │ └── uinput_joystick.service │ │ │ │ └── patches/ │ │ │ │ ├── lib32-retrorun/ │ │ │ │ │ └── flycast_gameforce_chi_rotation_fix.patch │ │ │ │ ├── libgo2/ │ │ │ │ │ └── libgo2-gameforce-gamepad.patch │ │ │ │ └── retrorun/ │ │ │ │ └── flycast_gameforce_chi_rotation_fix.patch │ │ │ ├── OdroidGoAdvance/ │ │ │ │ ├── README.md │ │ │ │ ├── bootloader/ │ │ │ │ │ ├── canupdate.sh │ │ │ │ │ ├── config │ │ │ │ │ ├── install │ │ │ │ │ ├── mkimage │ │ │ │ │ ├── release │ │ │ │ │ └── update.sh │ │ │ │ ├── linux/ │ │ │ │ │ └── odroid-go-a-4.4/ │ │ │ │ │ └── linux.aarch64.conf │ │ │ │ ├── options │ │ │ │ └── packages/ │ │ │ │ ├── enable-oga-sleep/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── sources/ │ │ │ │ │ ├── sleep.conf │ │ │ │ │ └── sleep.sh │ │ │ │ └── odroidgoa-utils/ │ │ │ │ ├── package.mk │ │ │ │ ├── sources/ │ │ │ │ │ ├── headphone_sense.sh │ │ │ │ │ ├── odroidgoa_utils.sh │ │ │ │ │ └── oga_events.py │ │ │ │ └── system.d/ │ │ │ │ ├── odroidgoa-headphones.service │ │ │ │ └── odroidgoa-hotkeys.service │ │ │ ├── OdroidM1/ │ │ │ │ ├── README.md │ │ │ │ ├── bootloader/ │ │ │ │ │ ├── canupdate.sh │ │ │ │ │ ├── config │ │ │ │ │ ├── install │ │ │ │ │ ├── mkimage │ │ │ │ │ ├── release │ │ │ │ │ └── update.sh │ │ │ │ ├── linux/ │ │ │ │ │ └── OdroidM1-4.19/ │ │ │ │ │ └── linux.aarch64.conf │ │ │ │ ├── options │ │ │ │ └── packages/ │ │ │ │ ├── dtc/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── dtc-0001-libfdt-soname-version.patch │ │ │ │ ├── enable-oga-sleep/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── sources/ │ │ │ │ │ ├── sleep.conf │ │ │ │ │ └── sleep.sh │ │ │ │ ├── odroidgoa-utils/ │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── sources/ │ │ │ │ │ │ ├── headphone_sense.sh │ │ │ │ │ │ ├── odroidgoa_utils.sh │ │ │ │ │ │ └── oga_events.py │ │ │ │ │ └── system.d/ │ │ │ │ │ ├── odroidgoa-headphones.service │ │ │ │ │ └── odroidgoa-hotkeys.service │ │ │ │ ├── rkbin/ │ │ │ │ │ └── package.mk │ │ │ │ └── u-boot-tools/ │ │ │ │ └── package.mk │ │ │ ├── RK3288/ │ │ │ │ ├── README.md │ │ │ │ ├── bootloader/ │ │ │ │ │ └── config │ │ │ │ ├── filesystem/ │ │ │ │ │ └── usr/ │ │ │ │ │ └── bin/ │ │ │ │ │ ├── cputemp │ │ │ │ │ └── gputemp │ │ │ │ ├── linux/ │ │ │ │ │ └── default/ │ │ │ │ │ └── linux.arm.conf │ │ │ │ └── options │ │ │ ├── RK3328/ │ │ │ │ ├── README.md │ │ │ │ ├── linux/ │ │ │ │ │ └── default/ │ │ │ │ │ └── linux.aarch64.conf │ │ │ │ └── options │ │ │ ├── RK3399/ │ │ │ │ ├── README.md │ │ │ │ ├── linux/ │ │ │ │ │ └── default/ │ │ │ │ │ └── linux.aarch64.conf │ │ │ │ └── options │ │ │ └── RK356x/ │ │ │ ├── README.md │ │ │ ├── bootloader/ │ │ │ │ ├── canupdate.sh │ │ │ │ ├── config │ │ │ │ ├── install │ │ │ │ ├── mkimage │ │ │ │ ├── release │ │ │ │ └── update.sh │ │ │ ├── linux/ │ │ │ │ └── rk356x-4.19/ │ │ │ │ └── linux.aarch64.conf │ │ │ ├── options │ │ │ ├── packages/ │ │ │ │ ├── dtc/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── patches/ │ │ │ │ │ └── dtc-0001-libfdt-soname-version.patch │ │ │ │ ├── enable-oga-sleep/ │ │ │ │ │ ├── package.mk │ │ │ │ │ └── sources/ │ │ │ │ │ ├── sleep.conf │ │ │ │ │ └── sleep.sh │ │ │ │ ├── odroidgoa-utils/ │ │ │ │ │ ├── package.mk │ │ │ │ │ ├── sources/ │ │ │ │ │ │ ├── headphone_sense.sh │ │ │ │ │ │ ├── odroidgoa_utils.sh │ │ │ │ │ │ └── oga_events.py │ │ │ │ │ └── system.d/ │ │ │ │ │ ├── odroidgoa-headphones.service │ │ │ │ │ └── odroidgoa-hotkeys.service │ │ │ │ └── rkbin/ │ │ │ │ └── package.mk │ │ │ └── patches/ │ │ │ └── linux/ │ │ │ └── linux-disablerk3568mmu.patch │ │ ├── filesystem/ │ │ │ └── usr/ │ │ │ ├── bin/ │ │ │ │ └── cputemp │ │ │ ├── lib/ │ │ │ │ └── systemd/ │ │ │ │ └── sleep.conf.d/ │ │ │ │ └── sleep.conf │ │ │ └── share/ │ │ │ └── alsa/ │ │ │ └── cards/ │ │ │ ├── Analog.conf │ │ │ ├── SPDIF.conf │ │ │ └── simple-card.conf │ │ ├── kodi/ │ │ │ └── appliance.xml │ │ ├── options │ │ ├── packages/ │ │ │ ├── bootini/ │ │ │ │ ├── package.mk │ │ │ │ └── sources/ │ │ │ │ ├── boot_gameforce.ini │ │ │ │ └── boot_oga.ini │ │ │ ├── iptables/ │ │ │ │ ├── config/ │ │ │ │ │ ├── README │ │ │ │ │ ├── home.v4 │ │ │ │ │ ├── home.v6 │ │ │ │ │ ├── public.v4 │ │ │ │ │ └── public.v6 │ │ │ │ ├── package.mk │ │ │ │ ├── scripts/ │ │ │ │ │ └── iptables_helper │ │ │ │ └── system.d/ │ │ │ │ └── iptables.service │ │ │ ├── kmscon/ │ │ │ │ ├── libtsm/ │ │ │ │ │ └── package.mk │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── kmscon-fixbuild.patch │ │ │ ├── libgo2/ │ │ │ │ ├── librga/ │ │ │ │ │ └── package.mk │ │ │ │ └── package.mk │ │ │ ├── linux/ │ │ │ │ ├── package.mk │ │ │ │ ├── patches/ │ │ │ │ │ ├── GameForce/ │ │ │ │ │ │ └── linux-999-Valadaa-OC-1.5.patch │ │ │ │ │ ├── OdroidGoAdvance/ │ │ │ │ │ │ ├── linux-998-Revert_ODROID-GOA_Support_overclock.patch_ │ │ │ │ │ │ ├── linux-999-Valadaa-OC-1.5.patch_ │ │ │ │ │ │ └── r13p0_20200103.patch │ │ │ │ │ ├── RK356x/ │ │ │ │ │ │ ├── 0001-perf-fix.patch │ │ │ │ │ │ ├── 0002-perf-bench-Share-some-global-variables-to-fix-build-.patch │ │ │ │ │ │ └── linux-tools-libtraceevent.patch │ │ │ │ │ └── base/ │ │ │ │ │ ├── 0001-BACKPORT-arm64-don-t-zero-in-__copy_from_user-_inato.patch │ │ │ │ │ ├── 0001-perf-cs-etm-fix-duplicate-def-of-traceid_list.patch │ │ │ │ │ ├── 0001-scripts-dtc-Remove-redundant-YYLOC-global-declaratio.patch │ │ │ │ │ ├── 0002-perf-bench-Share-some-global-variables-to-fix-build-.patch │ │ │ │ │ ├── 0003-perf-Make-perf-able-to-build-with-latest-libbfd.patch │ │ │ │ │ ├── 0004-tools-lib-api-fs-Fix-gcc9-stringop-truncation-compil.patch │ │ │ │ │ ├── 0005-Clean-the-new-GCC-9-Wmissing-attributes-warnings.patch │ │ │ │ │ ├── 0006-nf_conntrack_core-Fix-gcc-10-compilation.patch │ │ │ │ │ ├── 0007-wlcore-debugfs-Remove-unused-variable-res.patch │ │ │ │ │ ├── 0008-usb-ehci-avoid-gcc-10-zero-length-bounds-warning.patch │ │ │ │ │ ├── 0009-gcc-10-warnings-fix-low-hanging-fruit.patch │ │ │ │ │ ├── 0010-Fix-joystick-analog.c-GCC-10-Wrestrict-warning.patch │ │ │ │ │ ├── 0011-drivers-net-phy-mdio_bus-Fix-gcc-10-Wrestrict.patch │ │ │ │ │ ├── 0012-drivers-net-wireless-Fix-gcc-10-Wrestrict.patch │ │ │ │ │ ├── esp8089.patch │ │ │ │ │ ├── linux-RTL8821CU-fix-compile.patch │ │ │ │ │ ├── linux-emuelec-random_fixes_gcc10.patch │ │ │ │ │ ├── linux-fix_bt.patch │ │ │ │ │ ├── linux-rtl8723bu.patch │ │ │ │ │ ├── linux-tools-libtraceevent.patch │ │ │ │ │ ├── linux-usbhid-quircks.patch │ │ │ │ │ ├── linux-wiimote-abs-not-hat.patch │ │ │ │ │ └── v2-arm64-atomics-lse-Dereference-matching-size.diff │ │ │ │ ├── sysctl.d/ │ │ │ │ │ ├── network.conf │ │ │ │ │ └── qdisc.conf │ │ │ │ └── udev.d/ │ │ │ │ ├── 30-disable-wakeup.rules │ │ │ │ ├── 40-modeswitch.rules │ │ │ │ └── 50-wlan-powersave.rules │ │ │ ├── mali-bifrost/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── mali-bitfrost-001-gbminclude.patch │ │ │ ├── retrorun/ │ │ │ │ ├── package.mk │ │ │ │ └── patches/ │ │ │ │ └── 001-tatemode.patch │ │ │ ├── systemd/ │ │ │ │ └── scripts/ │ │ │ │ └── cpufreq │ │ │ └── u-boot/ │ │ │ ├── package.mk │ │ │ └── patches/ │ │ │ ├── OdroidGoAdvance/ │ │ │ │ └── 01-u-boot-EmuELEC.patch │ │ │ └── base/ │ │ │ ├── 0001-Kbuild-fix-escaping-in-.cmd-files-for-future-Make.patch │ │ │ ├── 0001-kbuild-fix-escaping-in-appending-U-Boot-own-DT.patch │ │ │ └── 0001-scripts-dtc-Remove-redundant-YYLOC-global-declaratio.patch │ │ └── patches/ │ │ ├── atf/ │ │ │ └── 0001-rk3399-atf-fix-baud.patch │ │ ├── linux/ │ │ │ └── default/ │ │ │ ├── linux-0002-rockchip-from-list.patch │ │ │ ├── linux-0011-v4l2-from-list.patch │ │ │ ├── linux-0020-drm-from-list.patch │ │ │ ├── linux-1000-drm-rockchip.patch │ │ │ ├── linux-1001-v4l2-rockchip.patch │ │ │ ├── linux-1002-for-libreelec.patch │ │ │ ├── linux-2000-v4l2-wip-rkvdec-hevc.patch │ │ │ └── linux-2001-v4l2-wip-iep-driver.patch │ │ └── u-boot/ │ │ └── 0001-202301-arm-rockchip-rk3399-Program-PLL-clock-for-DDR-at-50-.patch │ └── Samsung/ │ ├── bootloader/ │ │ ├── config │ │ ├── install │ │ ├── mkimage │ │ ├── release │ │ └── update.sh │ ├── devices/ │ │ └── Exynos/ │ │ └── options │ ├── filesystem/ │ │ └── usr/ │ │ ├── bin/ │ │ │ └── cputemp │ │ └── config/ │ │ └── pulse-daemon.conf.d/ │ │ ├── daemon.conf │ │ └── system.pa │ ├── linux/ │ │ └── linux.arm.conf │ ├── options │ └── patches/ │ ├── kodi/ │ │ ├── kodi-0001-LOCAL-WinSystemGbmGLESContext-wait-longer-for-vsync.patch │ │ └── kodi-0002-LOCAL-changes-for-Odroid-XU3-XU4.patch │ ├── linux/ │ │ ├── samsung-0001-HACK-drm-set-DRM_RENDER_ALLOW-flag-on-DRM_IOCTL_MODE.patch │ │ ├── samsung-0002-WIP-media-videobuf2-always-enable-V4L2_MEMORY_FLAG_N.patch │ │ ├── samsung-0003-WIP-iommu-io-pgtable-arm-Fix-coherency-support-for-M.patch │ │ ├── samsung-0004-WIP-soc-samsung-pm_domains-Bring-back-old-driver-imp.patch │ │ ├── samsung-0005-WIP-arm-dts-exynos5422-HC1-XU3-XU4-model-name-is-ODR.patch │ │ ├── samsung-0006-WIP-media-s5p-mfc-Allow-cache-hints-for-queues.patch │ │ ├── samsung-0007-WIP-media-s5p-mfc-use-EAGAIN-not-EIO-for-MFCINST_ERR.patch │ │ ├── samsung-0008-WIP-ARM-dma-mapping-implement-alloc_noncontiguous.patch │ │ ├── samsung-0009-MEMEKA-ARM-dma-mapping-increase-DMA-coherent-pool-si.patch │ │ ├── samsung-0010-MEMEKA-drm-exynos-mixer-never-blend-the-base-layer.patch │ │ ├── samsung-0011-MEMEKA-media-exynos-gsc-fix-v4l2-SELECTION-api.patch │ │ ├── samsung-0012-MEMEKA-media-s5p-mfc-copy-timestamp-and-timecode-in-.patch │ │ └── samsung-0013-MEMEKA-media-s5p-mfc-stop-streaming-before-releasing.patch │ └── u-boot/ │ └── u-boot-0001-add-xu4-defconfig.patch ├── scripts/ │ ├── autoreconf │ ├── autoremove │ ├── build │ ├── build_mt │ ├── ccache_stats │ ├── checkdeps │ ├── clean │ ├── create_addon │ ├── create_docker_package │ ├── extract │ ├── genbuildplan.py │ ├── get │ ├── get_archive │ ├── get_file │ ├── get_git │ ├── image │ ├── install │ ├── install_addon │ ├── makefile_helper │ ├── mkimage │ ├── pkgbuild │ ├── pkgbuilder.py │ ├── pkgjson │ ├── uboot_helper │ └── unpack └── tools/ ├── RPi/ │ ├── gen-rpi-kodi-patch.sh │ └── rpi-kodi-rebase.sh ├── adjust_kernel_config ├── change_addon_version ├── check_kernel_config ├── checkunpack ├── dashboard ├── distro-tool ├── docker/ │ ├── README.md │ ├── aarch64/ │ │ ├── bionic/ │ │ │ └── Dockerfile │ │ └── focal/ │ │ └── Dockerfile │ ├── bionic/ │ │ └── Dockerfile │ ├── buster/ │ │ └── Dockerfile │ ├── focal/ │ │ └── Dockerfile │ ├── jammy/ │ │ └── Dockerfile │ ├── kinetic/ │ │ └── Dockerfile │ ├── sid/ │ │ └── Dockerfile │ └── stretch/ │ └── Dockerfile ├── download-cleaner ├── download-tool ├── ffmpeg/ │ └── gen-patches.sh ├── fixlecode.py ├── mkpkg/ │ ├── mkpkg_bcm2835-driver │ ├── mkpkg_boblightd │ ├── mkpkg_libcec │ ├── mkpkg_media_build │ ├── mkpkg_pvr │ ├── mkpkg_rtmpdump │ ├── mkpkg_vboxguest │ ├── update_adafruit-libraries │ ├── update_binary-addons │ ├── update_common_functions │ └── update_retroplayer-addons ├── mtstats.py ├── packages-checker ├── pkgcheck ├── pkginfo ├── refresh-patches ├── repo-tool ├── update-scan ├── viewconfig └── viewplan ================================================ FILE CONTENTS ================================================ ================================================ FILE: .editorconfig ================================================ # EditorConfig is awesome: https://EditorConfig.org # top-most EditorConfig file root = true # Unix-style newlines with a newline ending every file [*] end_of_line = lf insert_final_newline = true # Default indent via 2 spaces indent_style = space indent_size = 2 trim_trailing_whitespace = true [*.py] # Set default charset charset = utf-8 # 4 space indentation, required by Python indent_style = space indent_size = 4 # Tab indentation (no size specified) [Makefile] indent_style = tab [*.{md, markdown}] # Trailing space has meaning trim_trailing_whitespace = false [CHANGELOG] # Trailing space has meaning trim_trailing_whitespace = false ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms github: shantigilbert # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: emuelec # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username custom: ['https://paypal.me/shantigilbert'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Create a report to help us improve title: '' labels: '' assignees: '' --- # BEFORE YOU OPEN AN ISSUE MAKE SURE IT IS NOT ALREADY RESOLVED IN THE WIKI https://github.com/EmuELEC/EmuELEC/wiki # MAKE SURE YOUR DEVICE IS A [SUPPORTED DEVICE](https://github.com/EmuELEC/EmuELEC/wiki/Supported-Devices) # PLEASE DO NOT POST GENERAL HELP QUESTIONS! EITHER USE THE FORUM (https://emuelec.org) OR USE DISCORD FOR THAT (https://discord.gg/cbgtJTu), THIS IS ONLY FOR BUG/ISSUES REPORTING! # DELETE EVERYTHING ABOVE THIS LINE (INCLUDING THIS LINE) BEFORE SUBMITTING TO MAKE SURE YOU'VE READ THIS! **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. **EmuELEC version:** - Version [e.g. 22] **Device (please complete the following information):** - SOC: [e.g. S095x3] - Brand: [e.g. Beelink] - Model [e.g. mini g1] - Version [e.g. 22] **Additional context** Add any other context about the problem here. ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: false contact_links: - name: EmuELEC Forum url: https://emuelec.org about: If you have a regular/general questions, please use the forum instead of a GH issue. - name: Discord url: https://discord.gg/jQWCFwTn5T about: If you have a regular/general question, please use discord instead of a GH issue. ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: Suggest an idea for this project title: '' labels: '' assignees: '' --- # BEFORE YOU OPEN AN ISSUE MAKE SURE IT IS NOT ALREADY RESOLVED IN THE WIKI https://github.com/EmuELEC/EmuELEC/wiki # MAKE SURE YOUR DEVICE IS A [SUPPORTED DEVICE](https://github.com/EmuELEC/EmuELEC/wiki/Supported-Devices) # PLEASE DO NOT POST GENERAL HELP QUESTIONS! EITHER USE THE FORUM (https://emuelec.org) OR USE DISCORD FOR THAT (https://discord.gg/cbgtJTu), THIS IS ONLY FOR BUG/ISSUES REPORTING! # DELETE EVERYTHING ABOVE THIS LINE (INCLUDING THIS LINE) BEFORE SUBMITTING TO MAKE SURE YOU'VE READ THIS! **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. ================================================ FILE: .github/ISSUE_TEMPLATE/other-issue.md ================================================ --- name: Other issue about: Describe this issue template's purpose here. title: '' labels: '' assignees: '' --- # BEFORE YOU OPEN AN ISSUE MAKE SURE IT IS NOT ALREADY RESOLVED IN THE WIKI https://github.com/EmuELEC/EmuELEC/wiki # MAKE SURE YOUR DEVICE IS A [SUPPORTED DEVICE](https://github.com/EmuELEC/EmuELEC/wiki/Supported-Devices) # PLEASE DO NOT POST GENERAL HELP QUESTIONS! EITHER USE THE FORUM (https://emuelec.org) OR USE DISCORD FOR THAT (https://discord.gg/cbgtJTu), THIS IS ONLY FOR BUG/ISSUES REPORTING! # DELETE EVERYTHING ABOVE THIS LINE (INCLUDING THIS LINE) BEFORE SUBMITTING TO MAKE SURE YOU'VE READ THIS! ================================================ FILE: .github/config.yml ================================================ blank_issues_enabled: false contact_links: - name: EmuELEC Forum url: https://emuelec.org about: If you have a regular/general questions, please use the forum instead of a GH issue. - name: Discord url: https://discord.com/invite/cbgtJTu about: If you have a regular/general question, please use discord instead of a GH issue. ================================================ FILE: .gitignore ================================================ # build directorys /build.*/ /builds /.fakeroot.* # automatically downloaded source files /sources/ # prebuild target binarys to provide /target/ # mkpkg temp mkpkg-temp # options /.libreelec # private working directory /.work/ # dedicated filesystem /lost+found/ # symlinks... /sources /.work # ccache /.ccache/ # backup files *.orig # crap .DS_Store .directory # ignore git repos from update scripts tools/mkpkg/*.git # ignore old linux configs projects/**/*.old repo/ repo local.conf sx05re-kodi*.log packages/sx05re/experimental/ packages/sx05re/emuelec-emulationstation/api_keys.txt ================================================ FILE: CHANGELOG ================================================ EmuELEC CHANGELOG ================== # v4.8 Finally It's here! ## Changes * Removed preinstalled ports: Ports were taking a lof of space on the system partition and added a lot to the main build time, with PortMaster now fully mature and working extremly well, we decide to use it instead, all the ports we had preinstalled are available in PortMaster. However one thing keep in mind is that all ports from PortMaster are intended for handheld devices, so EmuELEC on SBC's is not officially supported, worstcase_scenario has tested a lot of games running on a s905x2 SBC and installed directly from PortMaster: https://github.com/EmuELEC/EmuELEC/wiki/List-of-Ports-running-on-EmuElec-(work-in-progress) Just remember to follow their instructions. https://portmaster.games/ as some games require special steps. To install PortMaster Scroll to the Setup Scripts, select "Install PortMaster" and follow the instructions, after restarting ES, you should now see "Launch Portmaster" in the Ports section. * A new and improved Splash system: Thanks to Langerz82 and worstcase_scenario it has never been as easy to customize how EmuELEC looks while loading a game! there are many splash options to display in game launching and exit available, including: * Default - Legacy option, will load the default splash. * Enable Platform/Rom loading: Legacy option, will look for a file in /storage/splash/{platform}/{rom_name}.png if not found it will look for /storage/splash/{platform}/launching.png * Custom - Select your own image/video! * Random - automatically selects video/image from the defined path! * Scraped media - This option will read your platform gamelist.xml for a predefined tag and use any media you have scraped, options: random, image, thumbnail, video, marquee, fanart * Many other improvements: We removed mame2016 and added MAME 0.282 (with full MESS support), while not everything has ben setup automatically, you can load any system that MAME supports from Retroarch directly. Added Fmtowns using MESS. Added Satellaview and Sufami Turbo thanks to Qbertaddict for the suggestion Wii Remotes are now easy to setup directly from ES Volume is now controlled globally from ES Updated Amiberry to v8, added Amiberry-lite Added Ikemen-GO, a M.U.G.E.N alternative. Full midi/mt32/fluidsynth support(core dependent) The ability to use a normal IR sensor bar (or candles) with a wiimote inside retroarch Automatic shutdown timer after user inactivity script for saving and enabling multiple macros for controllers Audio connection via Bluetooth devices customizable scroll sound for ES menu enabled cheat function for Mame2010 new and updated emulators: gearlynx bk electronika, supafaust, amiberry-lite, dosbox-pure, stella2023 and PUAE2021, most of the libretro cores ... and many other changes, If you find any issues with this update, please first test with a clean installation! if problem persists feel free to open an issue or visit us on [Discord](https://discord.gg/jQWCFwTn5T). ## Other versions While I tried testing as much as I could on Odroidm1, RK356x, OGA/OGS and GameForce, due to lack of time these devices are not properly tested, not everything is workin as smooth as on Amlogic devices, please update at your own risk. If you find any issue with these versions, please open an issue or visit us on [Discord](https://discord.gg/jQWCFwTn5T). # v4.7 It has been a long time since we released a new version, and after many changes, many bug fixes and the help of many people, finally here it is v4.7! If you find any issues with this update, please first test with a clean installation! I apologize in advance, but the changelog is going to be automatically created from the GitHub commits and PRs since there are many and I will most likely miss some. But here is a short (incomplete) version: Added support for PortMaster! in addition we have added a few new ports. Added FMtowns emulator Updated most emulators to the latest version Fixed many Bluetoth gamepad issues, specially with fake PS3 Gamepads (tested with shanwan and guo hua) Added support for MT7668 BT chip Updated to the latest CoreELEC base (CE-20 branch) Autogamepad configs should now work much better and support more controllers Fixed some issues with resolution switching Enabled TTS on Emulationstation ... And many, many changes under the hood! ## Thanks to the always supportive Patreons Scott O'Connell Libre Computer Project John Johnson victor manuel sanchez lopez Daniel Iruegas John Gamester Matthew S jmthill Russ Crandall Peter Shaw Tony Escobar Dennis W. Michael Brown AlienatedDiego2 And all the others that helped in the past, from the bottom of my heart thank you all! ## Special thanks And in no particular order, I would like to personally thank: Vpeter Langerz82 7ji Miwasp Kelv JohnnyonFlame ebeem-sama Qbertaddict Dim (I still love the Crystal theme!) SamWilson (Happy BD!) AlienatedDiego tobetter portisch danielmx f.caruso Pro-me3us worstcase_scenario Hardkernel GameForce LibreComputer CoreELEC team ...And you! Thanks! Please note that due to lack of testing time, some devices have not been properly tested, if you find a bug or an issue, please don't hesitate to let us know via [Discord](https://discord.gg/cbgtJTul), or opening an issue in github. In other news...the EmuELEC forum is closing soon!. We regret to inform you that the EmuELEC forum will be shut down by the end of February 2024. We hope to preserve the forum in read-only mode, but we cannot guarantee it. The main reason for this decision is that we have outgrown the free package offered by discourse, and we do not have the resources to upgrade it. The second reason is that most of the forum activity is from users of unsupported devices and unofficial images, which we cannot and do not want to moderate or endorse. If you need support for our supported devices and official images, please join our [Discord](https://discord.gg/cbgtJTul) server. ## Github Automatic Changelog: * Updating Virtual Jaguar and enabling it by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1068 * Added script for setting cheevos if entries are missing in settings.ini by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1074 * Update flycast gles by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1112 * ampart: remove package and installation script by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/1119 * fix broken packages by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/1123 * Add sharp x1 by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1117 * Dev Retroarch setkillkey option by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1109 * ES input PS3 GamePad Default Controller Assignment Fix. by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1088 * Dev advmame joy update by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1103 * oga patch for scummvm is no longer needed by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1130 * Make python-evdev for oga/gf compilable again by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1131 * GF patch for scummvm is no longer needed. by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1133 * Fix brightness reset on GF (issue #1136) by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1139 * Revert ethtool to version 6.0 to make oga/gf compilable again by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1132 * Dev flycast joy fixes by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1113 * Updating version of emuelec-emulationstation by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1128 * Match kernel versions identical to 64 bit version by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1142 * Make glibc compilable for oga and gf by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1129 * Dev - Amlogic Different Resolutions other than 1080p fix. (in seperate PR) by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1171 * Enable CIFS on Odroid-M1 by @drizzt in https://github.com/EmuELEC/EmuELEC/pull/1175 * RTL8821CU: switch source to 8821cu-20210916 by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/1176 * poppler: switch source to freedesktop's gitlab by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/1177 * dosbox-svn: bump to 53ca2f6 (2023.04.08) by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/1178 * scummvm: bump to b5ca1b3 (2023.04.09) by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/1180 * xash3d: remove configure option --disable-vgui by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/1182 * minor fix - advmame - joy assign - menu cancel button to left thumb by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1172 * Dev ppssppsdl auto joypad by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1134 * Dev auto gamepad yabasanshiro by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1126 * Dev joy common update by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1060 * inject_bl301: fix PKG_SHA256 and add PKG_ARCH by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/1183 * opengl-meson: fix for Amlogic-ne by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/1184 * amiberry: fix for Amlogic-ne and improve by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/1185 * lib32-opengl-meson: support Amlogic-ne by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/1186 * [EE - Emulator][FbNeoSA] Adds DPAD hats assignments by default. by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1187 * Amlogic-ne: fix cfgload by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/1204 * EE - Display Resolution - Configurable FrameBuffer, and some fixes. by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1208 * [EE 4.4+ Fix] Better Game Controller Bluetooth Support. by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1201 * Emulators update for next Emuelec version by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1205 * Modified patches for SDL2.28.1 OGA by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1215 * Modifed patch for RA version 1.15 OGA by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1216 * Bump bstone by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1214 * Added Vircon32 libretro core by @Chandler-Kluser in https://github.com/EmuELEC/EmuELEC/pull/1229 * Fix apache-ant version, 1.10.13 by @yingw in https://github.com/EmuELEC/EmuELEC/pull/1226 * New Emulators update for version 4.6.5 by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1218 * Modified patch for Retroarch version 1.16 by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1219 * test function added to emuelec-utils. by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1234 * New updates for EmuElec 4.6.5 by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1235 * EE - set fb and resize - fixes. by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1237 * opengl-meson: fix lib32 mali symlinks for Amlogic-ne by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/1203 * EE - display - 480i support by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1206 * Update es_systems.cfg by @yingw in https://github.com/EmuELEC/EmuELEC/pull/1253 * System updates 4.7 by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1251 * New emu update for 47 by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1252 * Updated SDL2_mixer 32 bit and 64 by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1250 * Fixes4.7 by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1258 * Latest changes for Crystal theme by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1259 * Update submodule in dosbox-svn by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1262 * Update joy_common.sh GUID fix by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1271 * Update retroarch fix audio amlogic old by @bennydiamond in https://github.com/EmuELEC/EmuELEC/pull/1260 * Dev virtualjaguar clock experimental by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1236 * EE - setres.sh - 480cvbs 576cvbs default fix by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1270 * EE - hypseus gamepad config fix by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1199 * EE - Advmame auto gamepad fixes 2. by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1272 * Add missing dependency by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1275 * b2024 - Advmame Button Remap New Revision 2 by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1274 * [Bug Fix] GameForce chi - Retrorun-go2 - Rotation Fix. by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1267 * [Bug Fix] Fix EE Audio Volume Adjustment on reset. by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1266 * Update emuelec-bluetooth - v2.1 revision by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1276 * Update es_features.cfg by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1279 * EE 4.7 - emuelec-bluetooth - RSSI fix for Bluez 5.72 by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1281 * dev - OpenBOR - joypad fix by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1287 * Bump bstone by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1288 * Revert part of the latest changes in script image by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1293 * EE - Port - Native Video support, and virtual keyboard fixes by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1291 * Fixing Half Life and updating by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1296 * xow package include in image. by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1298 * Multiemu Emulator by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1300 * Last emus update 4.7 by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1301 * Generate correct advmame.rc by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1303 * dev - auto gamepad - strip unneeded backslash in expressions by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1304 * Fix supertuxkart by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1306 * Fix segfault when exiting directly after startup by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1307 * EE - ES Shutdown/Restart Fix by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1308 * Bump some emulators by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1311 * EE - Device Gameforce - Retrorun - Rotation and controls Fix by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1310 ## New Contributors * @drizzt made their first contribution in https://github.com/EmuELEC/EmuELEC/pull/1175 * @Chandler-Kluser made their first contribution in https://github.com/EmuELEC/EmuELEC/pull/1229 * @yingw made their first contribution in https://github.com/EmuELEC/EmuELEC/pull/1226 * @bennydiamond made their first contribution in https://github.com/EmuELEC/EmuELEC/pull/1260 **Full Changelog**: https://github.com/EmuELEC/EmuELEC/compare/v4.6...v4,7 # v4.6 ## Please read the complete change-log before updating. A lot of the changes have been done to the base system. specially to the way the partitions are handled so you might need/want to do a clean install. There is now a new tool for mounting systemd and external sources for ROMS you can read more about it here: https://github.com/EmuELEC/EmuELEC/pull/980 EEROMS partition will only be created on SD cards bigger than 8gb. For detail explanation: https://github.com/EmuELEC/EmuELEC/pull/979 This also changes how the second partition is created, It is now 6GB (unless you use a 4GB sd card, then it will be 2GB) If you update from 4.5 or lower you will keep the 2GB STORAGE partition, but if you need your STORAGE partition to be bigger (6GB), then you will need to do a clean install on a SD card bigger than 8GB. The System base is now from CoreELEC 20 and all emulators, cores and ports have been updated to their most recent version at the time of this release. Please note that due to lack of time, some devices have not been properly tested, if you find a bug or an issue, please don't hesitate to let us know via [Discord](https://discord.gg/cbgtJTul), the [EmuELEC forum](https://emuelec.org) or opening an issue in github. # Thanks to the always supportive Patreons John Johnson victor manuel sanchez lopez Daniel Iruegas Victor Davis John Gamester Matthew S jmthill Russ Crandall tailbøx Peter Shaw Noah Heninger BSM_Mylock Tony Escobar Dennis W. Nina Seramour Michael Brown Tomas Radej Brian Chad Barker AlienatedDiego Bryan Pizzuti And anyone else who has supported via other means, in the past, present and future, I really appreciate it! ## What's Changed * fakeroot: bump to 1.28 (from no-longer-existing 1.27) by @JohnnyonFlame in https://github.com/EmuELEC/EmuELEC/pull/884 * Update libretro core cap32 by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/886 * Update hypseus-singe to fix some games by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/887 * Bump RigelEngine to latest version by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/889 * Fix audio stuttering in lzdoom again by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/888 * Multiple controller mappings - iNNEXT USB and PlayGame USB by @nwildner in https://github.com/EmuELEC/EmuELEC/pull/840 * dev joy advmame fix - 1 controller controlling 2 players and more bug. by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/891 * Fix for mpv not compiling on OGA/OGS/GF by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/919 * fix fs-resize would break on 4GB drives, and EEROMS was not properly formatted on USB drives by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/921 * RK356x: update uboot for firefly devices by @shantigilbert in https://github.com/EmuELEC/EmuELEC/pull/926 * EE-ES Multidisc creation support. by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/923 * implements installtointernal via a new package ampart by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/928 * introduce new emmc installation method aminstall by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/930 * Remove duplicate PKG_VERSION in bstone package.mk by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/938 * mount_romfs.sh: rewrite to properly support 2-partition layout by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/942 * ampart: bump version f0c3cc44; aminstall: misc fixes and better migration of EEROMS by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/943 * mount_romfs.sh: ensure /storage/.update is always mounted as long as EEROMS is valid; mount EEROMS when user-defined storage-roms.mount failed by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/944 * Misc packages fixes by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/946 * Revert RTL8812AU to previous version by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/947 * poppler: bump version 32fa288 (22.06.0) and deps fix by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/948 * jslisten: add systemd as dependency as it includes libudev.h by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/949 * emuelec-32bit-libs: fix typo PKG_BUID -> PKG_BUILD by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/951 * exfat-linux: seperate from linux to save build time by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/950 * Misc depedency fixes (qt-everywhere, ampart) by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/953 * Introduce actual multilib support by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/956 * Flycast Textures folders by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/960 * Fix typo description heart of darkness by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/959 * DuckStation Textures - Modify emuelec-dirs add /roms/psx/textures by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/958 * lib32: optimize, behaviour change and mali fix by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/957 * Updating duckstation to the latest working version by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/967 * Adding symlink logic in duckstation.sh to redirect to texture replacement by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/966 * Add PKG_NEED_UNPACK to lib32 packages that need it. by @shantigilbert in https://github.com/EmuELEC/EmuELEC/pull/971 * fheroes2: fix controller not working; SDL2 cleanup by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/974 * Fix assets dir in devilutionX by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/976 * fs-resize: raise storage size to 6g, allow omitting eeroms manually by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/979 * eemount: introduce package & change mount logic by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/980 * eemount: bump 4adf3138; init: fix disabled systemds units by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/983 * eemount: bump 2321603 by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/984 * force overwrite file on unziping files by @lihexali in https://github.com/EmuELEC/EmuELEC/pull/989 * Update Emulators 4.6 by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1013 * lib32-libdrm: keep up with generic-libdrm by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/1016 * ffmpeg: fix dep x264; lib32-ffmpeg: switch to openssl by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/1019 * options: raise default ccache limit to 20G by @7Ji in https://github.com/EmuELEC/EmuELEC/pull/1022 * package emulator advmame - patch for vsync to work with the fps. by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/992 * Bump bstone to latest by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1023 * Update emulators 46 part 2 by @Kelvfimer in https://github.com/EmuELEC/EmuELEC/pull/1018 * emulator - duckstation standalone - game controller autoconfiguration by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/994 * [Feature] Cloud Loading and Saving for retroarch auto saves and state saves. by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/997 * EE - joy common - controller - order fix and revision by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/936 * Check resolution fixes, Setres overhaul, cvbs fix other resolutions people could not see. Borders option added. AdvMame Exit Display Fix. by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1021 * Update es_systems.cfg by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1054 * Update 99-emuelec.conf by @miwasp in https://github.com/EmuELEC/EmuELEC/pull/1055 * Set Resolution - Fixes by @Langerz82 in https://github.com/EmuELEC/EmuELEC/pull/1058 ## New Contributors * @JohnnyonFlame made their first contribution in https://github.com/EmuELEC/EmuELEC/pull/884 * @7Ji made their first contribution in https://github.com/EmuELEC/EmuELEC/pull/921 * @lihexali made their first contribution in https://github.com/EmuELEC/EmuELEC/pull/989 # 4.5 ## EmuELEC v4.5 - Core/Emulator Update This version is just an emulators and cores update, but it also has some small bug fixes. ## Bug fixes * Add 32-bit .info files for the libretro cores that need it, this fixes issues as save states not working. * Fix audio stuttering in lzdoom again (#888) * Fix an issue where gptokeyb would not kill emulators if hotkey was set to the `select` button * Fixed a small issue with cloud sync if the configuration file was edited in windows ## Core and emulator updates While this looks like a small changelog, keep in mind this is mostly an update for most cores, ports and emulators (60+) have been updated to the latest commits on github, we tested them internally but as always we cannot test with all devices and with all games, so if you find issues please post them on the forum or discord, unless, if you are 100% sure it's a reproducible bug then open a Github issue. ## Special thanks! I want to thank the [Patreon](https://patreon.com/emuelec)/[Github Sponsors](https://github.com/sponsors/shantigilbert) supporters that have made working on EmuELEC possible (In no particular order). Dewen Hsu John Gamester Matthew Seashore Craig Hibbert jmthill Russ Crandall tailbøx Peter Shaw Noah Heninger BSM_Mylock Tony Escobar Dennis W. Tim Wilson Jason Burns Nina Seramour David Simmons Michael Brown pyjmj05 Tomas Radej Brian Hoffman Chad Barker AlienatedDiego Bryan Pizzuti Sylvia van Os And everyone else that has supported EmuELEC in the past in any way shape or form! Thank you for your support! # 4.4 General: Huge update to base build system: * All Amlogic devices now use the same kernel 4.9-19! * You might notice a bit more performance on some emulators as well usage in general. * IMPORTANT: S905 (GXBB, p201) for the moment is no longer supported. If you have one of those devices (s905 no letter after the 5) DO NOT UPDATE, stay in 4.3. Fixed Bugs: * One of the most annyoing bugs that plagued fbdev with Retroarch was finally fixed (Issue #76) fixed in PR `mali_fbdev fix for fps drop after egl_destroy` (#789) by @spleen1981! This means that using retroarch as bootup option is now possible (some small changes need to be done). * Fixed bluetooth connectivity issues * Fix zoom not working on manuals * Fix many external mounting issues * Backup will now rename the file instead of deleting it after restore. * Fixed SuperTux and SuperTuxKart data download * Fixed autoupdate would show update available even if there was none. Additions and other fixes: * Added WIP Mupen64plus Standalone * Added fbneo Standalone * Added Duckstation Standalone * Added Yabasanshiro Standalone * Added Blake Stone to ports * Added iotop * Added VIM * Added External Mount settings in ES * Added option to create key remaps for Advance MAME * Switch to SDL 2.0.20 for all devices * Support for Pixelcade (Install script is in Setup) * Retroachievements encore is now configurable from ES * Added Enable Integer Overscaling in ES * Use toggle for fast forward instead of hold * Add .68k .68K .sgd .SGD to genesis/md * Added gamepad auto configuration for Dolphin and Flycast Thanks to Joshua L (@Langerz82) * Reworked Advance MAME gamepad auto configuration Thanks to Joshua L (@Langerz82) * Removed ceemmc because it's no longer compatible with 3 partitions * Added option to backup to cloud services using rclone. * Switch to parallel_n64_32b as default n64 emulator for handhelds. * Add Heart Of Darkness to ports (PR #863) * Added a5200 core as default emulator for Atari 5200 * Added gearcoleco core (PR #859) * Updated several emulators (PR #856) * Added Messen-s to gameboy to allow for Super GameBoy emulation (PR #848) And many other changes! for the full list check out the commit history. Cloud sync note: Be sure to read https://rclone.org/remote_setup/#configuring-by-copying-the-config-file Name your remote as `EmuELEC_Remote` and copy rclone.conf to `/emuelec/configs/rclone/` finally create a folder named `EmuELEC_Backup` on your cloud service. If you would like to use another name for the remote or backup folder you can create a file named `/emuelec/configs/rclone/ee_cloud_sync.cfg` and add this to the file: ``` EE_SYNC_REMOTE="your_remote_name" EE_SYNC_PATH="your_backup_folder" ``` Cloud backup and restore options are in "Main Menu > EmuELEC Settings > Danger Zone > Cloud Backup Settings and Game Saves" "Main Menu > EmuELEC Settings > Danger Zone > Cloud Restore Settings and Game Saves" # 4.3 General: * Fix Autoupdate * Fix no backup restore if EEROMS was set to fat32 * Fix no external ROMS if EEROMS was set to fat32 * Fix typo on Parallel N64 32b core name * Unify Brightness between ES and RA * Fix advmame.sh: unset DISPLAY for Amlogic and Amlogic-ng * Fix SuperTux2: Fix sed in launch script * Fix vertical mode not respecting index ratio * Fix Connect to WiFi on first boot if using es_defaults.txt * Fix volume resets to 98% using AV * Fix Do not redirect stdout/stderr to /dev/null in maxperf and normperf. (#661) * Fix Amstrad GX4000 * Fix create /storage/roms/amstradgx4000 on boot * emuelecRunEmu.sh: remove hardcoded bin path, this allows to use most of the binaries/scripts be called from `/emuelec/bin` or `/usr/bin` in that order * Add Megadrive MSU to es_systems.cfg * Add fceumm-mod libretro core to play some additional NES ROM hacks. (#658) * New Packages: Box64, Box86, GL4es, Axe11, libglu (for future use) * Bump most cores and emulators to current versions * Bump Retroarch to 1.9.6 * Add Flycast Stand Alone * Add Alternate version of Mupen64plus-nx * Replace old filemanager for 351Files * Cleanup es_systems.cfg remove and add some extentions * Add Hurrican port (Handhelds currently have no working controls) * Atomiswave: Remove workaround for nvmem * Fix Stadia Gamepad. Thanks to amuzulo#1322 * Fix issue with lzdoom loading .doom files and sound on mods * Update some sound packages * Fix es_systems.cfg: Add extensions to c64/c128 and Amiga (#677) * Add Cdogs-sdl to ports * Add Abuse to ports NOTE: WIP controls * Add Streets of Rage Remake * Fix Retroarch display of CJK characters (Fixes #534 & #431) * Fix SFC not scraping * Updated most emulators and cores * Create folders for fbneo consoles * Minor changes to fix switching of resolutions. * fheroes2: Add Free Heroes of Might & Magic II port * SoRR: Fix controls on Gameforce and OGA * Fix bezels downloaded to the wrong location * Enable Random Boot videos (see note) * es_systems.cfg: C64 add .tap extension * Add "Set as bootgame" option to advance game options (see notes) * Stop using autostart.sh and use /usr/bin/emuelec_autostart.sh (if you need to use autostart please use /storage/.config/custom_start.sh) * emuelec-emulationstation: use GLES2 renderer * Many small fixes I may have missed on this changelog Amlogic-ng: * Add preliminary support for Raxda Zero * Add RTL8761 Bluetooth Support (#698) * Include ssv6xxx-aml drivers Odroid Go Advance: * Enable bluetooth support for OGA/OGS (#725) Note about random intro videos: mp4 files only and they should be in `/storage/roms/splash/introvideos` if no mp4 file is found the default intro video is shown. In ES, enabling "Randomize Boot Video" will also enable "Always Show Boot Video" Note about "Set as bootgame": This will allow to select a single game to start at boot, useful for arcade systems or for handhelds if you have a favorite game and what to launch it on boot. This game is launched by ES before it loads the game gamelists, so any stats recorded by ES will saved (e.g. times played, last played, etc) Select the game and open the "Advance Game Options" and then set "Launch This Game At Startup" to "On" * After the game is ended (via hotkey+start) normal boot will continue. * Not all systems support this (e.g, ports). * Any retroarch settings (shaders, filters, bezels, splash, etc) will be respected. * To remove bootgame, select the game that is currently set to boot and set "Launch This Game At Startup" to "Off", or go into "System Settings > Developer > Stop Launching This Game At Startup" Fixes #728 # 4.2 A new forum has been open for emuelec: https://emuelec.org General: * Add ee_fstype to set the EEROMS partitions to the desired file system, between FAT32 (default), EXT4, EXFAT and NTFS (read the warning about using NTFS). Instructions coming soon to Wiki/forum * Fix OGG background music * Update setres.sh and advmame.sh for resolution 1280x1024p60hz (PR #600) * Fix drastic game saves & save states erased when resetting scripts & binaries to default (PR #595) * Add Potator a Watara Supervision emulator core, roms go into /storage/roms/supervision * gptokeyb bump and fix missing trigger actions * Crystal bump to latest * emuelec-emulationstation bump to latest * Bump Retroarch to v1.9.4 * Switch Duckstation name to Swanstation * Rework 32bit core detection on emuelecRunEmu.sh * Yabasanshiro: Revert back to 7ae0de7 as it gives much better performance * Added freej2me Java games emulator, it accepts .jar files and they should go into /storage/roms/freej2me. Internet is required only on first run to download the Java JDK. * Bump RigelEnfgine to fix a bug * Hypseus replaced by Hypseus-singe * Add auto gamepad configuration for Hypseus * Add Non-Commercial Duckstation core (untested) * Always update es_systems.cfg on system update * Fix unusual bug that metadata would not save on quit or restart (You need to remove the directory /storage/.config/emulationstation/scripts/quit) * Replace SDL1.2 with SDL1.2-compat * Bezels will now respect ratio and integer scale set in menu Amlogic-ng: * Enable qca6174 drivers (Fixes issues #611) * Update SDL2 to SDL 2.0.12 * Fix Retroarch not updating after applying CPU video filter * Bump kernel to 640e3a3 Odroid Go Advance/Super & GameForce: * Bump kernel to use latest Mali G31 blobs * Introduce RetroRun, available for Flycast for the moment * Use gptokeyb for controls on Solarus * Fix reboot while charging * Fix retrorun reversed analogs * Convert screenshots from pbm to png GameForce: * Move global hotkey to button 1 to avoid conflicting hotkeys in retroarch, 1+Dpad up/down for volume, 1+Dpad lef/right for brightness * Brightness was not correctly calculated on GameForce (PR #619) * Fix hypseus controls (#622) * Update U-boot and Kernel * Fix Opentyrian * Fix Advancemame # New ee_fstype Starting with 4.2 a new option for people that are having issues with the EEROMS partition is available, but it comes with a few warnings, please read carefully and decide if this is for you: * To be able to use this option a fresh install is required * Do not change anything if FAT32 works for you * Use EXFAT instead of NTFS when possible * If you use Linux EXT4 might be the best option for you! * I repeat do not change anything if FAT32 works for you * Keep in mind this is a very experimental feature * If you insist in using NTFS please read the warning below ## Intructions If you would like to use FAT32 skip steps 2,3 and 4 1.- Flash the correct test image to your SD, it needs to be the .img.gz on a CLEAN sd, it will not work on update (.tar) 2.- Right after it is flashed open the first partition EMUELEC 3.- Create a file named ee_fstype (no extension!) on the root of the EMUELEC partition 4.- Open the file and type `exfat`,`ntfs` or `ext4` save it and close it 5.- Do whatever you do to the partition (dtb change, ee_default.txt, etc) 6.- Test Keep in mind this is an experimental feature, only enable it if you would like to help testing it, please report any issues to the EmuELEC forum, Discord or Github # NTFS Filesystem warning While I tried to do as much testing as possible with the new ee_fstype option, there still might be issues, NTFS is by far the most problematic so I suggest you first try fat32 or exfat, both will work on Windows computers and Macs. NTFS might have some issues with mounting the update folder, so please use it as a last resort. # 4.1 General: * Emulationstation: While in a game list, pressing X/Y will move to a random game/open game options, holding X/Y will mark it as favorite/open search (thanks to @lethal-guitar) * Bump PPSSPPSDL to v1.11 * Bump Duckstation to abb7631 * Pico-8: Allow saving favorite carts, include binary in backup * Update Sonic 1 and 2 so that they work with multiple gamepads * Bump most emulators and cores to newest git hash (check commits for specifics) * Bump Crystal theme which now includes a new panel (boxart), 16:9, 4:3 and CRT versions * Enable bezels on OGS, not fully tested yet * Bump Genesis-plus-gx and Genesis-plus-gx-wide to support FM music * Use DinguxFileManager as default on all platforms * Use gptokeyb as a fake keyboard for OpenBOR * Bump Retroarch to 1.9.1 * API keys for Emulationstation have been changed, please refer to the emuelec-emulationstation/package.mk Additions: * Added Chocolate-Doom and lzdoom with support for mods * Added SuperTux and SuperTuxKart to ports * Added Imagemagick (mainly for screenshot manipulation from CLI) * Added logos to the ports (Thanks to Dim!) * Added vertical aspect ratio option to OGA/S * Added gptokeyb to enable video controls on all devices with SDL support! with configuration support * Replace jslisten with gptokeyb to kill emulators * Added easyrpg to es_systems.cfg * Added Ecwolf with support for mods * Added supermariowar to ports, on the first run a fake keyboard will be used, make sure you set your gamepad and restart the game, if you need to run the fake keyboard again delete /emuelec/configs/smw/nofakekeyb and run the game again. * Added Flycast 32bit as core option for Dreamcast/Atomiswave/Naomi * Added Amstrad GX4000 Fixes: * Removed unused scripts, and fixed many small issues with scripts * Fixed many script that were causing hangups or other issues * Fixed gamecontrollerdb.sh it will now replace the UUID from the one in the db, this fixes weird controllers that use the same UUID as others (but are not the same) * Fixed an issue with unicode characters not displaying correctly on the EEROMS partition (CN, JP, etc) * Fix SonicCD Gamepad for the OGS * Fix Pico-8 disappearing splore file * Fix Scummvm game scan * Fix brightness not restored after reboot on OGA/S, thanks to @miwasp, fixes issue #470 * Fixed issue with OGA/S OC not beeing applied correctly (this does not solve the random lockups on some devices) * Fix backup/restore issues * Fixed Retroach video recording * Fixed Eduke not running when having lots or ROMS in ES, by enabling swap (much testing needed!) * Fixed an issue with ES not playing .ogg music files in BGM * Fixed some errors messages were not wrapped and could not be read * Fixed OpenBor would not work after playing one game * Fixed DevilutionX character voices were wrong * Fixed DevilutionX mouse emulation was not working * ARM32 interpreter is now symlinked so no need for patchelf * Fix some TimeZones not displaying/working correctly (#546) * Fix hand-held bezels for 720p and 1080p This version includes a big change on how binaries and scripts are stored, basically to deal with the issue of people not reading how to properly update and since I am getting tired of answering the same question over and over again, lets just move all binaries and scripts to RO /usr/bin, this will force update all of these and make updating much simpler. If you use custom scripts /emuelec/bin and /emuelec/lib are still in the path so you will have to deal with it accordingly. All configurations regarding emuelec will still be handled in /emuelec/config Note that this is probably not final, I still need to do a lot of testing, but keep that in mind if you want to update # 4.0 Yes its finally here :) The change log is HUGE so I am just going to focus on the most important parts (and the ones I can remember): * EmuELEC is no longer 32bit, it has now moved to AARCH64 (With some small parts still being 32 bit, like PCSX_Rearmed and Parallel64) * A brand new default theme made specifically for EmuELEC! Crystal! https://github.com/dm2912/Crystal * For easy access with any computer a third partition (EEROMS) will now be created on the first boot as FAT32, which is where all the ROMS will be stored. * Update folder is now located in EEROMS/.update in case you want to copy the update files directly, its also still accesible from the samba share * S912 (Including most Pandora) will no longer be supported, if you have one of those 3.9 is the latest version * Most save states are now in one folder (/storage/roms/savestates/[system] or EEROMS/savestates/[system]) I might have missed a few of the standalone emulators, but if you find any issues with that, please let me know, please make sure you move them there if you plan to keep using your old ones * Introduced ee_defaults.txt https://github.com/EmuELEC/EmuELEC/commit/9358efe01af501326526ce479ca6c5f55932e34a * Switch all error messages and scripts to use [TvTextViewer](https://github.com/lethal-guitar/TvTextViewer), also improve how these are displayed * New emulator/cores added Dosbox-pure, Solarus, Tic-80, Mesen, DosBox-Staging, DosBox-X and others * Dolphin has been added to the Amlogic-ng devices, but it is only really playable on S922x devices and gamepad stills needs to be set manually. Will fix this on v4.1 * Added many ports including Duke Nukem 3D, Sonic 1, 2 and CD, RigelEngine, Bermuda Syndrome, Hydra Castle Labyrinth and others. Keep in mind most of the ports still need the DATA as it is not included! (check `Missing Bios` in the `Game Options`) * Better Bluetooth manager and connection in general also Keep Bluetooth pairings even if doing a full reset * Most emulators and cores are updated * Support for the Odroid-Go Super As well as many, many other issues, bug fixes and additions I probably forgot! but you can check the (mostly) full change log here: https://github.com/EmuELEC/EmuELEC/compare/v3.9...EmuELEC:master # Very important note! This version is NOT backwards compatible, meaning this release cannot be used to upgrade older versions! I know lots of people hate reinstalling, but due to the nature of the changes this is a MUST but now with the third partition you can copy the ROMS directly, faster and safer! no messing around with software that corrupts the data! be warned that if you do not do a clean install, you will have issues! This version also includes a new auto update script that will hopefully make it easier than ever to update when new versions come out. If you are new to EmuELEC please READ the WiKi at https://github.com/EmuELEC/EmuELEC/wiki BEFORE asking for any help. You can also join us in discord! https://discord.gg/cbgtJTu If you want to support EmuELEC please click on the "Support" button on top to find out how! We have tried our best to test each and every aspect of EmuELEC but keep in mind we cannot test each and every game and setting, so I am sure you will find new and improved bugs and issues! so don't hesitate to jump into discord to let us know, or open an issue right here in GitHub (but please follow the template!) # 3.9 This is the last 32bit release of EmuELEC, this also concludes support for the S912 devices (including Pandora boxes) as there is no 64bit drivers for this SOC. Starting from v4.0 EmuELEC will only be 64bits, this unfortunately means that you cannot upgrade from 3.9 to v4.0, so a clean install must be made, but you can do a backup of your roms and settings and copy them over to v4.0 if you like but this has to be done manually. This release is mostly bug fixes: * Emuelec-Emulationstation: Bump to dbb576d * Retroarch: Fix crash with CHD + Cheevos * Odroid N2+ :Fix reboot after danger zone reset * Add Pico-8 Support * Rename n64.rmp to Mupen64Plus-Next.rmp and Fix remapping loading * Disable digital to analog on ParaLLEl N64 too * es-theme-EmuELEC-carbon: Bump to ca062ff * Fix DOOM location (#308) * Fix killall triggering crash detection (#303) * fix ee_backup * OdroidGoAdvance: FIX RGA scaling not covering the whole screen * Other small changes and fixes. # 3.8 Due to some confusion I removed the v11 from the OdroidGoAdvance name, since the image works on both v1.0 and v1.1, this should not affect functionality at all. As a reminder, starting with v4 there will be no more 32bit releases, only ARM64 and upgrading from one to the other is not possible. ## BEFORE OPENING AN ISSUE OR ASKING FOR HELP I BEG YOU TO CHECK THE WIKI! IT IS VERY FRUSTRATING TO RESPOND TO THE SAME QUESTIONS OVER AND OVER AGAIN WHEN THE ANSWER IS ALREADY ON THE WIKI! https://github.com/EmuELEC/EmuELEC/wiki ## Please remember, EmuELEC is COMPLETELY FREE! it is not to be sold or included in ANY commercial products as a whole, if you have paid for EmuELEC or an image, DEMAND YOUR MONEY BACK! For more license info read https://github.com/EmuELEC/EmuELEC/blob/master/README.md * Bios check will now be performed AFTER and ONLY if a game crashes * OdroidGoAdvance: New feature! Added vertical mode for some cores (mostly arcade cores) * New Emulationstation option: Random video screen saver, place videos in /storage/roms/mplayer * Fix: ports showed error even on gracious exit * SDLPoP: Fix settings not being saved * Mupen64plus-nx: Use Gles3 for OdroidGoAdvance fixes #260 * emuelec-utils: Unify some small scripts for easy management * Added a timezone selection to make it easier to set your current time * S922x: Disabled small cores for a little performance boost * Remove some unused cores for space ---beetle-lynx ---crocods ---dosbox-x ---easyrpg ---xow ---libretro-bash-launcher They can be brought back if demand exists * re-add ssv6xxx-aml: fixes #261 (hopefully) * Add DOSBox scan script (#292) - Easier way to add DOSBox games (untested) * Use GCC optim -O3 system-wide - Squeeze a bit more performance on some cases * OdroidGoAdvance: use internal terminal to display error - Uses proper rotation and error message will properly close! * S922x/A311D: Use a service to handle small cores - Fixes the reboot issue * Add pcenginecd to bios check * Add .mdf for Sega Saturn (#288) * Odroid Go Advance: Enable rs97-commander-sdl2 * VLC: bump to 3.0.11.1 * Fix MSX2 platform for scrapping * Retroarch: Added some default core settings * Amlogic-ng: Goodbye libhybris! - Use proper GLES headers, this fixes some gfx errors on some cores, like Mupen64 * Amiberry: Fix WHDload not working * Bump Retroarch * Bump Emulationstation * Many other small under the hood fixes # 3.7 # Important notes This release has many new features some of them that will require a bit of setting up if you are upgrading. The biggest change is that the getcores.sh file that was responsible for showing what emulator was used for what platform is no longer used, this means that emuelec.conf and emuoptions.conf from earlier versions will no longer will compatible! (well only the core/emulator part) so if you previously had set some games to run on certain emulators this needs to be redone, sorry about that but its for the better! It is highly recommended to do a clean install and just transfer your /storage/roms folder again! If you are doing this, also make sure your saves are transferred, since there was a bug on v3.6 that used `/storage/.config/retroarch/saves` instead of saving on the same path as the ROM. **WARNING:** This will REPLACE the es_systems.cfg file, if you manually changed this file those changes will need to be redone, sorry can't seem to find a better way yet. **WARNING 2:** If your saves are in /storage/.config/retroarch/save* (or any other place other than the /storage/roms folder) make a backup of them BEFORE you update! or they will be lost, RA should now save them on the same folder as the ROM (as it did before) but you need to replace the retroarch.cfg (you can just delete it from network share or ssh and reboot) or change the `savefiles_in_content_dir` and `savestates_in_content_dir` to true in the retroarch.cfg file If you are updating, remember to run "RESET EMUELEC SCRIPTS AND BINARIES TO DEFAULT" from the EmuELEC meu > Danger Zone after the update is done, otherwise you will run into problems. # Project Support If you wish to support EmuELEC you can use Patreon or Paypal, note that this is absolutely not required to enjoy EmuELEC but it helps a lot and it is greatly appreciated! https://patreon.com/emuelec https://paypal.me/shantigilbert Also, we have started a new official EmuELEC Youtube channel aimed at showcasing EmuELEC running different systems on different boards/tv boxes, and why not maybe some tutorials or game-plays in the future!! please drop by and subscribe! https://www.youtube.com/emuelec ## We have very little time to fully test everything but we have tried our best to test each feature, keep in mind there are so many variables it is possible that we missed some! So if you find any sort of problem please don't hesitate to open an Issue, check out the (very WIP) wiki https://github.com/EmuELEC/EmuELEC/wiki (which you can also help by adding or editing it!) or you can also join us in discord: https://discord.gg/cbgtJTu ## BEFORE OPENING AN ISSUE OR ASKING FOR HELP I BEG YOU TO CHECK THE WIKI! IT IS VERY FRUSTRATING TO RESPOND TO THE SAME QUESTIONS OVER AND OVER AGAIN WHEN THE ANSWER IS ALREADY ON THE WIKI! https://github.com/EmuELEC/EmuELEC/wiki ## Please remember, EmuELEC is COMPLETELY FREE! it is not to be sold or included in ANY commercial products as a whole, if you have paid for EmuELEC or an image, DEMAND YOUR MONEY BACK! For more license info read https://github.com/EmuELEC/EmuELEC/blob/master/README.md Now for the update notes! # Fixes and new features * Netplay lobby is now accessible directly from ES for the cores that support it * Add support for Odroid N2+ (to OC you need to edit config.ini in the first partition `max_freq_a73=2400` and `max_freq_a53=2016`, watch your temps) * Added (untested) support for LaFrite * Introduce ee_check_bios: This will check for missing bios before launching a game, and it will display a dialog box if any required bios are missing. Based on #218 by @TheLastProject The only one I did not add to this list is Cgenius as it seems it can be used for several games not just one, so having a requirement for all games seemed bad. * Add a Bluetooth on/off switch to ES, this will allow you to disable BT if you are not using it. * setsettings.sh: fix atari800 loading and gambatte colorization * es_systems.cfg: remove all groups * Add support to read profile.d from /storage/.config * SDL_GameControllerDB: Fix Oga v1.1 mapping * Emuelec-emulationstation: Change default settings * advmame: Another attempt at auto config joysticks that should work on the OGA (hopefully) * fbterm.sh: add "error" to display a dialog box with an error for 10 secs * emustation-config: make sure the BT agent is not running (this one is important) * Add sanity checks when launching Cave Story (#218) * missing-bios: add --filter * updatecheck.sh: Add forceupdate test * Added NEC PC-9800 to es_systems.cfg * Ports: Included hydracastlelabyrinth, OpenTyrian, HodeSDL, Bermuda but only OpenTyrian has a launch script, as soon as I test the others I will add the launch script * Added a missing core "Quicknes" * OdroidGoAdvance: Enable 3do and Saturn, I have no idea why people want to play these systems on the OGA, but by popular demand, here they are. * Fix/improve Bluetooth pairing * Bluetooth: Try to pair gamepads at boot, to make this work you need to set your game-pad in pairing mode when EmuELEC is booting * Initial Bluetooth management menu (#209) under setup scripts you will find a new menu driven Bluetooth pairing method, by coach1988, very useful if the regular method does not work for you. * YouTube search: Add default search word to ES. under the EmuELEC settings menu there is a new option to set the default word to search, in case you don't have a keyboard this can be used, not ideal, but it works. * Remove "tiggerhappy", was planing on using it but never got to, so it was just wasting space * ES can now show PDF manuals from games. * set_advmame_joy.sh: force button "a" as "ui_select" ## bumps * Cyclone68000: bump to 94a9d9a * Libretro: Bump some cores * Retroarch: Bump to a308be6 * Advancemame: Bump to ceabee9 * Dosbox-x: bump to d13deeb * Amiberry: Bump to 0209dbf * PPSSPPSDL: Bump to 3403e28 * ResidualVM: Bump to 626c557 * ScummVMSA: Bump to 4d99e3a * StellaSA: Bump to 5f5ac95 * OpenBOR: Bump to e761464 * Mupen64plus-nx: Bump Amlogic-ng to be9b85a * HatariSA: Bump to 453e88b * Skyscraper: Bump to e39e882 * youtube-dl: Bump to 2020.06.16.1 * xow: bump to 9e86c52 * Parallel64: bump to 76193f8 * emuelec-emulationstation: Bump to 5e9dc64 # 3.6 * Fixed AdvanceMame gamepad auto-configuration, a new option to enable/disable this has been set in the Main Menu - EmuELEC Settings. * Removed steam controller support, I don't think anyone was using it and it was just eating resources, if many people ask for it I will enable it again. * Added small youtube search engine (needs a keyboard) for now its included in the Setup menu script #14. * Mplayer: Added support for .twi and .ytb files, if you include a file with a twitch or youtube address it will be played by mplayer (needs internet). * Added Skip Song to ES, using the left thumb button (l3) you can skip the current song. * Added a small (VERY BETA) way to view videos directly from ES, drop your .mp4, .mkv, mpg, .mov videos to /storage/roms/mplayer and they will appear in ES, it still needs theming, so they will show up withouth an image/icon. * Fixed splash screen on 720p resolution or below. * Enabled CEC support and Remote support for devices that support it. * ES now has some new options to play with including hiding extensions per platform, so if you have .bin/.cue files you can hide one of them and now have no doubles, its available on the "select" menu from a gamelist, under "view customisation" (which has a typo, but thats besides the point). * Flycast is now working again, plus added PSP to the no rewind list so it should work even with no rewind enabled globally (it didn't before). * Most emulators have been updated to the latest git. * OdroidGoAdvance: Use upstream PPSSPPSDL instead of PPSSPPSDL-GO, there might be gamepad issues. * OdroidGoAdvance: Add support for V1.1 with extra buttons and WiFi module, buttons might have changed a bit, taking suggestions on how to best set them up!. * OdroidGoAdvance: Besides all the changes mentioned above a sleep mode added by @KiwiHop (many thanks!). * OdroidGoAdvance: Fixed a bug that would trigger a black screen on the OGA 10 min after waking up the device. * OdroidGoAdvance: Switched global HOTKEY to F5. * Synched with CoreELEC 9.2.3. * Small script cleanups, other bug fixes and few other tweaks I am forgetting probably. EmuELEC will now force copy es_systems.cfg because when changes were made upstream to es_systems.cfg the update did not copy the new file, this version fixes that. WARNING: This will REPLACE the es_systems.cfg file, if you manually changed this file those changes will need to be redone, sorry can't seem to find a better way yet. # 3.5 * Fixed FPS on Emulationstation would drop after returning from a game (Amlogic-ng) * Add ee_alsa.always option emuelec.cong use to dissable pulseaudio, this might fix some issues when returning from a game, you will loose mixing sounds in ES * Moved splash screens to /storage/roms/splash and also load splash per platform * Backup will now backup more settings (like VVVVVVV,PPSSPP configs) * Remove avahi requirement for pulseaudio in hopes that it will fix a rare bug * Added many Wifi/Bt chips to Amlogic-ng project (Thanks to CE!) * Added images and descriptions (only in ENG) for the setup scripts! * Removed ev-tools as they were not being used, use regular evtest * Updated emulators and cores to current GIT versions. * Danger zone "reset system to default config" will now leave ROMS folders in place * Introduce maxperf option (enabled by default) useful for OdroidGoAdvance and S912 * Removed core updater from retroarch to keep people from screwing up their installation * Probably other changes I forgot to mention New device supported! OdroidGoAdvance This is the first official release for the OGA, although there are still many know issues, bugs and changes needed I felt it is at a place where I could release the first official version. NOTE: I still expect MANY issues with the OGA release, please bear with me while I keep investigating on known issues and try to fix them # 3.4 This is a bug fix release that also adds a few features * Added VVVVVV and 2048 to ports * Reworked how bezels are used, they should now go into /storage/roms/bezels * Fix Muppen64plus-nx on S905/S912 * Fix rare bug where ES would hang after returning from retroarch * Reworked the "Danger Zone" options * Use ffplay for intro video and splashes, this also enables gif splashes to be used (not yet configurable, s912 still has a few problems) * Include extra WiFi drivers for Amlogic-ng * Bump Amiberry to 3.10 * Fix NeoCD not working with CHD * Fix Scummvm libretro not loading games after scanning * Make HatariSA use the same bios path as libretro /storage/roms/bios/tos.img * Bumped a few libretro cores and emulators * Other small bugfixes Please remember, EmuELEC is COMPLETELY FREE! it is not to be sold or included in ANY commercial products, if you have paid for EmuELEC or an image, DEMAND YOUR MONEY BACK! --------------------------- # 3.3 This is just a small bug fix release that also adds S905x3 support * Added support for the S905x3 chip-sets, keep in mind many functions might still not work for your device (WiFi, Bluetooth, Ethernet, etc) * Added script to open a terminal window, needs a Keyboard but you can kill it with Hotkey+start * Added script to view last emuelec.log * Fixed issue with rom names with single quotes not saving advanced options * Fixed manual delay on show-splash script * Remove unnecessary extensions for Saturn * Sync base with CE * Bumped a few emulator/cores to latest git. --------------------------- # 3.2 * Added option to prioritize gamepads (for up tp 5 players) in Emulationstation * Added new script to copy ROMS from USB to internal storage * Added newest changes to ES by Fabrice Caruso and the Batocera team, with some minor menu changes * Added a new option to emuelec.conf "global.retroarch.menu_driver" to select the Retroarch menu driver from ozonoe (default), rgui and xmb * Added Fakelottes, scanline and sharp shaders * Added option to select RA menu driver in emuelec.conf * Added option to set a delay to wait for slow external drives in emuelec.conf * Added ports: Cannonball, Xrick (Rick Dangerous), Commander-Genius (Commander Keen), Doom, Doom2, Quake, Mr.Boom, REminiscence (FLASHBACK), Cave Story, Dinothawr. Thanks to KEgg Roms for each port should go into the /storage/roms/ports/[game] * Added Steam Controller support (ONLY WITH DONGLE NO BT!) * Added Stella stand alone * Added PSPminis in Es menu * Added support for PNG and MP4 splash screens * Added a simple backup option to EmuELEC settings under danger zone * Removed sixais as it seems its not needed for PS3/PS4 gamepads * Reverted back to GIT e723594 for PPSSPPSDL and ppsspp_libretro as it seems it has better performance * Switch to es-theme-EmuELEC-carbon with changes made by drixplm which now inlclude all system logos supported in EmuELEC! * Switch back to Muppenplus64-next git version f77c16f for performance reasons (still not final change, maybe) * Separated configuration files to improve performance, emuoptions.conf now hold all the settings for games and platforms * Bumped most libretro cores and emulators to latest version available * Fixed a longstanding issue with advancemame and some games displaying only black screen! * Fixed a rare issue where the system would hang if you ran Retroarch directly then return to Emulationstation * Fixed many wrong and missing extensions in es_systems.cfg * Fixed Advmane not displaying correctly on 720p * Fixed lot of other minor bugs ------------------ # 3.1 Mostly bug fixes and emulator updates, but there is also a new feature that many have asked for, choosing emulators per game! Change emulator per system: On the main menu select "GAME SETTINGS" > "ADVANCED" > [Choose system] > "EMULATOR" Change emulator per game: Navigate to the game you want to choose emu for, press select on the gamepad (Game options menu) choose "ADVANCED GAME OPTIONS" > "EMULATOR" ------------------ # 3.0 Huge update! New look, new logo (by Prizco), and intro video (by ElF0rma) included! Emulationstation now has many new options coming from Batocera-emulationstation and adapted for EmuELEC Notable features include: * Game Settings: You can set some setting that are used on Retroarch directly on this menu, can be set (by priority) per game, per system or globally * Background music has been upgraded and it now shows the titles, music still goes into /storage/roms/BGM * Bluetooth controllers! Easy to pair Bluetooth controllers (still need a keybord or other gamepad first) * Wifi has been revamped, you can still use the old method (By script in setup) or use the on-screen-keyboard to connect to WiFi directly from ES! * ES Built-in scraper is now working, but Skyscrapper and Selph's scraper are still included * Themes and Bezels can now be downloaded directly from ES (in menu: system settings, updates) * Multi language support! * Many other new features and small changes! Fixes: All platforms: * OpenBOR: Removed gl4es, it now uses less resources to run * ResidualVM is now included, put roms in /storage/roms/residualvm, use the included "Scan ResidualVM games" script to populate the list (see note 1) * ScummVM now includeds a "Scan ScummVM Games" script to populate the list * Fixed Amiberry sound * Almost all emulators/cores updated to current versions * ComicBook theme has a bug that would play multiple videos at the same time so it has been replaced by es-theme-carbon (Fabrice Carusos's version) S905 * Fixed Reicast sound issue Many more small bug fixes and changes, check the git history for those. Note 1: ResidualVM still has a small bug where the pointer in GUI will not show, so you might need a keyboard to run some games, after the game has started you can use the gamepad withouth an issue. # 2.7.1 Mostly small bugfixes All platforms * Return to fbterm because fbpad did not work with a keyboard * Fix bezels not showing if first argument was "LIBRETRO" * Skyscraper fix launch script S922x/A311D/S905x2 * Fix audio not working on emulators # 2.7 All platforms * Emulationstation - Sound Mix! BG music, video music and theme audio now all sound at the same time (if you want) * Switched fbterm for fbpad, much faster, lighter and looks better. * Add option in ES to switch video mode * Retroarch updated to 1.7.8 * Add more controllers to advmame * Add Scummvm Standalone * Most libretro cores bumped to latest git available * A default bezel for retroarch cores is now included, disabled by default * Added an automatic re-pair for bluetooth gamepads (not tested) * Added Libretro Daphne (untested) * Bug fixes S922x/A311D/S905x2 * Amiberry is now working S905/S912/PK7 * Fix scaling after video mode selection ------------------------------- # 2.6 All platforms * Update base to CoreELEC 9.2 * Consolidate all log files to /emuelec/log the samba share "logfiles" now also point to this location * Removed less used cores and emulators to reduce space (see removed cores) * Fixed parallel-n64 * Updated PPSSPP * Updated Flycast, performance is much better even on s905 * DosboxSDL is playable again * Advancemame will now auto-configure P1 according to the gamepad that is connected on js0 as long as it has been configured in Emulationstation * ES input configuration will automatically set the Keycombo to kill running emulators (HK + START) for the device in js0 (WIP may not work on all gamepads yet) * ES will prompt you to configure a new gamepad by pressing any button * ES sort emulator options and add SMS selection * ES add Hatari emulator choice * ES much needed system sort and cleanup * Add HATARISA * You can now use a global bezel for all platforms and games /storage/overlays/bezels/default.cfg * Updated retroarch to latest git * Most Libretro cores have been bumped to current versions * Minor bug fixes * Samba shares have been updated: added Bezels, Splash and pointed logfiles to /emuelec/logs. Important please delete /storage/.config/samba.conf if you can't see the new shares S922x/S905x2/A311D * Add support for generic S922x (GT king) * Add support for Khadas VIM3 * Preliminary support for S905X2 (very alpha, untested) * Added Yabasanshiro, 4DO, MESEN and MESEN-S * ES add Saturn (Yabasanshiro) to es_systems.cfg Removed Cores: cannonball chailove desmume desmume-2015 dinothawr higan-sfc higan-sfc-balanced lutro mame2003-midway mame2015 melonds mrboom mupen64plus (replaced by mupen64plus-next) o2em pocketcdg quicknes snes9x2005 snes9x2010 virtualjaguar xrick ------------------------------- # 2.5.4 All platforms * Fix for manually set bezels * Fix for ROM folders not being created at first boot * Amiberry now uses the same gamepad config as Retroarch * Emulationstation now waits for mounts to be ready before it starts so fix the issue where external drives would not show any roms * Completely replace Final Burn Alpha with FinalBurn Neo (rom folder is now fbneo) * Emulationstation: Add NES and SNES hacks to es_systems.cfg * Emulationstation: Change SuperGrafx core * Emulationstation: Change Openbor theme from Ports to Openbor * Emulationstation: Fix favorites not being saved after restart * Remove Virtual Jaguar from supported platforms (as it was unplayable) * Updated Mupen64plus-nx libretro core, it is now faster and uses GLideN64 * Update Parallel 64 * Neocd Libretro updated to newest git, now supports CHD * Add many missing platform and collections to es_systems.cfg * Minor changes and fixes * Bettle-dc is now Flycast * New libretro core MBA Mini Plus (included but not yet enabled) * Retroarch: let user set if they want shutdown and reboot from RA, useful if you want to use RA as the default launcher. * Include extra cores for testing (dinothawr, higan-sfc, higan-sfc-balanced, lutro, mame2003-midway, mrboom, easyrpg, mesen, desmume, desmume-2015, pocketcdg, melonds, virtualjaguar) Odroid N2 * OC by default freq_a73 "1908" freq_a53 "1992" governor "performance" Addon: * Fixes for Odroid N2 * Fix for no audio * Use Kodi option to set audio-output (HDMI or front) ------------------------------- # 2.5.3 All platforms * New feature "Force Update" that will hopefully solve the update process, updating only the files that need to be updated and leaving the rest intact. (More info on the Wiki) * New feature custom_start.sh if you need anything to run at boot place it in this file /storage/.config/custom_start.sh * Enable/Disable custom bezels and splash screens from the ES menu. * Fix crash when disconnecting gamepad * Fix DS4/DS3 motion controls causing problems with ES * Fixed bug with some handheld platforms not showing bezels * Fixed bug where bezels/splash would show a different game * Added getcores_override.sh in case you add a new core and need it to appear as an option in ES. * To avoid confusion libretro cores now have Libretro_ in the name when selecting an emulator in Emulationstation * Change path to external fonts for ES * Bezels will now make a backup copy of retroarch.cfg from when you enabled them, when they are disabled again that backup copy is restored, so make sure you change all of your settings before enabling bezels * Replace Libretro Fbalpha with FbalphaFB * Added PCengineCD, Saturn, Naomi, Atomiswave and MSX2 to es_systems.cfg * Bumped several Libretro cores, PPSSPPSDL, REICASTSA, Retroarch, etc. to the newest version. ------------------------------- # 2.5.2 All platforms * Fix scripts not displaying correctly * Fix PPSSPP render error * Added custom_scripts directory, any .sh script that is put in here will automatically appear in "Retropie" menu in ES S912 * Disabled splash screen after quitting a game, it was causing rendering/resolution issues ------------------------------- # 2.5.1 All platforms * Fixed DOSBOX Rom path * Fix for ES crashing when no es_settings.cfg was found * Fixed a bug that prevented the mounting of USB roms if there were multiple "emuelecrom" files * Improved logging, use emueleclogs.sh to create a support log file. * Improved reicast.sh gamepad search * Move ES resources folder to /storage/.emulationstation/resources for easy editing * Removed pocketcdg and melonds * New platform: Neo-Geo CD. ROMS should go into /storage/roms/neocd and bios into /storage/roms/bios * Retroarch has been upgraded to 1.7.7 * Updated some Libretro Cores * Bumped PPSSPPSDL, Skyscraper * Bezels & Splash screens are still WIP but they should work if you use your own. Odroid N2 * Fix Odroid N2 framebuffer issues with scripts, retroarch and some emus. S912 * Fixed Reicast in S912/Pk7 * Fixed Retropie scripts for S912/Pk7 ------------------------------- # 2.5 Initial EmuELEC release Sx05RE is now EmuELEC, a pure emulation build that does not include Kodi or anything else related to Kodi in order to free resources and space. The main goal of EmuELEC is to be the best and easiest wat to emulate retro games on Amlogic hardware. However if you still like to have Kodi on the same installation, you can also use the Kodi Add-on version. But keep in mind it will have less features than EmuELEC ================================================ FILE: CONTRIBUTING.md ================================================ ### Questions about LibreELEC? To get your questions answered, please ask in the LibreELEC [Forum], on IRC: \#libreelec on Libera.Chat. Do not open an issue. ### Issue Reports **BEFORE you report a bug make sure you got the latest testing version of LibreELEC. Your bug might be already fixed.** If you are at all unsure whether it's a bug in LibreELEC or a problem with something else, post in the LibreELEC [Forum] instead. If it turns out that it is a bug, an issue can always be opened later. If you are sure that it's a bug in LibreELEC and you have not found a [similar issue], open a new [issue] and try to answer the following questions: - What did you do? - What did you expect to happen? - What happened instead? **It is also importent to provide logs for debugging. A zip file can be found in the [logfiles] samba share, this will contain all the logs needed.** Make sure to specify which version of LibreELEC you are using. - LibreELEC version - LibreELEC build - LibreELEC arch Please don't paste log messages in the issue reports or issue comments - use [sprunge.us](http://sprunge.us) instead. Feature requests are great, but they usually end up lying around the issue tracker indefinitely. Sending a pull request is a much better way of getting a particular feature into LibreELEC. Please dont ask us to add 3rdparty drivers unless you are the maintainer/developer of the driver, we have no manpower to support a non-mainlined kernel driver for your hardware. However, LibreELEC comes with minimal set of kernel drivers enabled, if you are sure that your hardware is supported in mainline kernel, feel free to send us a Pull Request to enable it in our kernel defconfigs. We are always happy to support known-working hardware. ### Reporting build failures As buildsystem / core packages (toolchain) / random libraries change from time to time, it is required that you always do a clean build (make clean) before reporting build failures. Also make sure that you have a clean, unmodified git clone, we can't fix bugs caused by you failed to merge / rebase on your own fork. ### Pull Requests - **Create topic branches**. Don't ask us to pull from your master branch. - **One pull request per feature**. If you want to do more than one thing, send multiple pull requests. - **Send coherent history**. Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please squash them before sending them to us. Please follow this process; it's the best way to get your work included in the project: - [Fork](http://help.github.com/fork-a-repo/) the project, clone your fork, and configure the remotes: ```bash # clone your fork of the repo into the current directory in terminal git clone git@github.com:/LibreELEC.tv.git # navigate to the newly cloned directory cd LibreELEC.tv # assign the original repo to a remote called "upstream" git remote add upstream https://github.com/LibreELEC/LibreELEC.tv.git ``` - If you cloned a while ago, get the latest changes from upstream: ```bash # fetch upstream changes git fetch upstream # make sure you are on your 'master' branch git checkout master # merge upstream changes git merge upstream/master ``` - Create a new topic branch to contain your feature, change, or fix: ```bash git checkout -b ``` - Commit your changes in logical chunks. or your pull request is unlikely be merged into the main project. Use git's [interactive rebase](https://docs.github.com/en/github/getting-started-with-github/about-git-rebase) feature to tidy up your commits before making them public. - Push your topic branch up to your fork: ```bash git push origin ``` - [Open a Pull Request](https://help.github.com/articles/using-pull-requests) with a clear title and description. [Forum]: https://forum.libreelec.tv/ [issue]: https://github.com/LibreELEC/LibreELEC.tv/issues [logfiles]: https://wiki.libreelec.tv/index.php?title=LibreELEC_FAQ#Support_Logs [similar issue]: https://github.com/LibreELEC/LibreELEC.tv/search?&ref=cmdform&type=Issues ================================================ FILE: Makefile ================================================ all: release system: ./scripts/image release: ./scripts/image release image: ./scripts/image mkimage noobs: ./scripts/image noobs clean: ./scripts/makefile_helper --clean distclean: ./scripts/makefile_helper --distclean src-pkg: tar cvJf sources.tar.xz sources ================================================ FILE: README.md ================================================ # EmuELEC Retro emulation for Amlogic devices. Based on [CoreELEC](https://github.com/CoreELEC/CoreELEC) and [Lakka](https://github.com/libretro/Lakka-LibreELEC) with tidbits from [Batocera](https://github.com/batocera-linux/batocera.linux). I just combine them with [Batocera-Emulationstation](https://github.com/batocera-linux/batocera-emulationstation) and some standalone emulators ([Advancemame](https://github.com/amadvance/advancemame), [PPSSPP](https://github.com/hrydgard/ppsspp), [Reicast](https://github.com/reicast/reicast-emulator), [Amiberry](https://github.com/midwan/amiberry) and others). --- [![GitHub Release](https://img.shields.io/github/release/EmuELEC/EmuELEC.svg)](https://github.com/EmuELEC/EmuELEC/releases/latest) [![GPL-2.0 Licensed](https://shields.io/badge/license-GPL2-blue)](https://github.com/EmuELEC/EmuELEC/blob/master/licenses/GPL2.txt) [![Discord](https://img.shields.io/badge/chat-on%20discord-7289da.svg?logo=discord)](https://discord.gg/jQWCFwTn5T) ### ⚠️**IMPORTANT**⚠️ #### EmuELEC is now aarch64 ONLY, compiling and using the ARM version after version 3.9 is no longer supported. Please have a look at the master_32bit branch if you want to build the 32-bit version. --- ## Development ### Build prerequisites These instructions are only for Debian/Ubuntu based systems. ``` $ apt install gcc make git unzip wget xz-utils libsdl2-dev libsdl2-mixer-dev libfreeimage-dev libfreetype6-dev libcurl4-openssl-dev rapidjson-dev libasound2-dev libgl1-mesa-dev build-essential libboost-all-dev cmake fonts-droid-fallback libvlc-dev libvlccore-dev vlc-bin texinfo premake4 golang libssl-dev curl patchelf xmlstarlet default-jre xsltproc libvpx-dev rdfind ``` ### Building EmuELEC To build EmuELEC locally do the following: ``` $ git clone https://github.com/EmuELEC/EmuELEC.git $ cd EmuELEC $ git checkout dev $ PROJECT=Amlogic-ce DEVICE=Amlogic-ng ARCH=aarch64 DISTRO=EmuELEC make image ``` For the Odroid GO Advance/Super: ``` $ PROJECT=Rockchip DEVICE=OdroidGoAdvance ARCH=aarch64 DISTRO=EmuELEC make image ``` Note: In some cases you may also need to install the tzdata, xfonts-utils and/or lzop packages. ``` $ apt install tzdata xfonts-utils lzop ``` **Remember to use the proper DTB for your device!** ### Submitting patches Please create a pull request with the changes you made in the dev branch and make sure to include a brief description of what you changed and why you did it. ## Get in touch If you have a question, suggestions for new features, or need help configuring or installing EmuELEC, please visit [our forum](https://emuelec.org/). You may also want to visit our [wiki](https://github.com/EmuELEC/EmuELEC/wiki) or join our [Discord](https://discord.gg/jQWCFwTn5T). **EmuELEC DOES NOT INCLUDE KODI** Please note, this is mainly a personal project, I can't guarantee it will work with your box. I've spent many hours tweaking many things and making sure everything works, but I can't test everything and some things may not work yet. Also, be aware of hardware limitations and don't expect everything to run at 60FPS (especially N64, PSP, and Reicast). I can't guarantee that changes will be incorporated to fit your specific needs, but I welcome pull requests, help testing other boxes, and fixing problems in general. I'm working on this project in my spare time, I'm not making any money from it, so it will take me a while to test all the changes properly, but I'll do my best to help you fix any problems you might have on other boxes, in my spare time. ## License EmuELEC is based on CoreELEC, which in turn is licensed under the GPLv2 (and GPLv2-or-later). All original files created by the EmuELEC team are licensed as GPLv2-or-later and marked as such. However, the distro contains many non-commercial emulators/libraries/cores/binaries and therefore **cannot be sold, bundled, offered, included in commercial products/applications or anything similar, including but not limited to Android devices, smart TVs, TV boxes, handheld devices, computers, SBCs or anything else that can run EmuELEC** with the included emulators/libraries/cores/binaries. Also note the license section from the README from the CoreELEC team, which has been adapted for EmuELEC: As EmuELEC includes code from many upstream projects it includes many copyright owners. EmuELEC makes NO claim of copyright on any upstream code. Patches to upstream code have the same license as the upstream project, unless specified otherwise. For a complete copyright list please checkout the source code to examine license headers. Unless expressly stated otherwise all code submitted to the EmuELEC project (in any form) is licensed under GPLv2-or-later. You are absolutely free to retain copyright. To retain copyright simply add a copyright header to each submitted code page. If you submit code that is not your own work it is your responsibility to place a header stating the copyright. ### Branding All EmuELEC related logos, videos, images and branding in general are the sole property of EmuELEC. They are all copyrighted by the EmuELEC team and may not be included in any commercial application without proper permission (yes, that includes EmuELEC bundled with ROMS for donations!). However, you have permission to include/modify them in your forks/projects as long as they are fully open source and freely available (i.e. not under a bunch of "click on this sponsored ad to get the link!" buttons) and do not violate any copyright laws, even if you receive donations for such a project (we are not against donations for honest people!), we just ask that you give us the appropriate credits and if possible a link to this repo. Happy retrogaming! ================================================ FILE: config/addon/dummy.xml ================================================ ================================================ FILE: config/addon/xbmc.broken.xml ================================================ @REQUIRES@ @PKG_ADDON_PROVIDES@ @PKG_SHORTDESC@ @PKG_LONGDESC@ @PKG_DISCLAIMER@ @PKG_ADDON_BROKEN@ all @PKG_ADDON_NEWS@ resources/icon.png resources/fanart.png @PKG_ADDON_SCREENSHOT@ ================================================ FILE: config/addon/xbmc.python.module.xml ================================================ @REQUIRES@ @PKG_SHORTDESC@ @PKG_LONGDESC@ @PKG_DISCLAIMER@ all @PKG_ADDON_NEWS@ resources/icon.png resources/fanart.png @PKG_ADDON_SCREENSHOT@ ================================================ FILE: config/addon/xbmc.python.script.xml ================================================ @REQUIRES@ @PKG_ADDON_PROVIDES@ @PKG_SHORTDESC@ @PKG_LONGDESC@ @PKG_DISCLAIMER@ all @PKG_ADDON_NEWS@ resources/icon.png resources/fanart.png @PKG_ADDON_SCREENSHOT@ ================================================ FILE: config/addon/xbmc.service.library.xml ================================================ @REQUIRES@ @PKG_ADDON_PROVIDES@ @PKG_SHORTDESC@ @PKG_LONGDESC@ @PKG_DISCLAIMER@ all @PKG_ADDON_NEWS@ resources/icon.png resources/fanart.png @PKG_ADDON_SCREENSHOT@ ================================================ FILE: config/addon/xbmc.service.pluginsource.xml ================================================  @REQUIRES@ @PKG_ADDON_PROVIDES@ @PKG_SHORTDESC@ @PKG_LONGDESC@ @PKG_DISCLAIMER@ all @PKG_ADDON_NEWS@ resources/icon.png resources/fanart.png @PKG_ADDON_SCREENSHOT@ ================================================ FILE: config/addon/xbmc.service.xml ================================================ @REQUIRES@ @PKG_ADDON_PROVIDES@ @PKG_SHORTDESC@ @PKG_LONGDESC@ @PKG_DISCLAIMER@ all @PKG_ADDON_NEWS@ resources/icon.png resources/fanart.png @PKG_ADDON_SCREENSHOT@ ================================================ FILE: config/arch.aarch64 ================================================ # determines TARGET_CPU, if not forced by user if [ -z "$TARGET_CPU" ]; then TARGET_CPU=cortex-a53 fi # 64bit userland and neon required by armv8 if [ -z "${TARGET_FEATURES}" ]; then TARGET_FEATURES="64bit neon" else TARGET_FEATURES+=" 64bit neon" fi # TARGET_CPU: # generic cortex-a35 cortex-a53 cortex-a55 cortex-a57 cortex-a72 cortex-a76 # exynos-m1 qdf24xx thunderx xgene1 cortex-a57.cortex-a53 # cortex-a72.cortex-a53 # determine architecture's family case $TARGET_CPU in generic|cortex-a35|cortex-a53|cortex-a57|cortex-a72|exynos-m1|qdf24xx|thunderx|xgene1|cortex-a57.cortex-a53|cortex-a72.cortex-a53|cortex-a73.cortex-a53) TARGET_SUBARCH=aarch64 TARGET_VARIANT=armv8-a TARGET_EXTRA_FLAGS="-mcpu=${TARGET_CPU}${TARGET_CPU_FLAGS}" ;; cortex-a76) TARGET_SUBARCH=aarch64 TARGET_VARIANT=armv8.2-a ;; cortex-a55) TARGET_SUBARCH=aarch64 TARGET_VARIANT=armv8.2-a TARGET_ABI=eabi TARGET_EXTRA_FLAGS="-mcpu=${TARGET_CPU}${TARGET_CPU_FLAGS}" TARGET_FEATURES+=" neon" ;; esac TARGET_GCC_ARCH=${TARGET_SUBARCH/-} TARGET_KERNEL_ARCH=arm64 # setup ARCH specific *FLAGS TARGET_CFLAGS="-march=${TARGET_VARIANT}${TARGET_CPU_FLAGS} -mabi=lp64 -Wno-psabi -mtune=$TARGET_CPU" # Disable runtime checking support of ARMv8.0's optional LSE feature. Breaks gdb and mesa compile. TARGET_CFLAGS="${TARGET_CFLAGS} -mno-outline-atomics" TARGET_LDFLAGS="" TARGET_ARCH_GCC_OPTS="--with-abi=lp64 --with-arch=$TARGET_VARIANT" ================================================ FILE: config/arch.arm ================================================ # determines TARGET_CPU, if not forced by user if [ -z "$TARGET_CPU" ]; then TARGET_CPU=cortex-a8 fi # 32bit userland if [ -z "${TARGET_FEATURES}" ]; then TARGET_FEATURES="32bit" else TARGET_FEATURES+=" 32bit" fi # TARGET_CPU: # arm2 arm250 arm3 arm6 arm60 arm600 arm610 arm620 arm7 arm7m arm7d # arm7dm arm7di arm7dmi arm70 arm700 arm700i arm710 arm710c # arm7100 arm720 arm7500 arm7500fe arm7tdmi arm7tdmi-s arm710t # arm720t arm740t strongarm strongarm110 strongarm1100 # strongarm1110 arm8 arm810 arm9 arm9e arm920 arm920t arm922t # arm946e-s arm966e-s arm968e-s arm926ej-s arm940t arm9tdmi # arm10tdmi arm1020t arm1026ej-s arm10e arm1020e arm1022e # arm1136j-s arm1136jf-s mpcore mpcorenovfp arm1156t2-s # arm1176jz-s arm1176jzf-s cortex-a8 cortex-a9 cortex-r4 # cortex-r4f cortex-m3 cortex-m1 xscale iwmmxt iwmmxt2 ep9312. # TARGET_FPU: # This specifies what floating point hardware (or hardware emulation) is # available on the target. Permissible names are: # fpa fpe2 fpe3 maverick vfp vfpv3 vfpv3-fp16 vfpv3-d16 vfpv3-d16-fp16 # vfpv3xd vfpv3xd-fp16 neon neon-fp16 vfpv4 vfpv4-d16 fpv4-sp-d16 # neon-vfpv4. # determine architecture's family case $TARGET_CPU in arm1176jzf-s) TARGET_SUBARCH=armv6zk TARGET_ABI=eabi TARGET_FPU_FLAGS="-mfloat-abi=$TARGET_FLOAT -mfpu=$TARGET_FPU" ;; cortex-a7|cortex-a15|cortex-a17|cortex-a15.cortex-a7|cortex-a17.cortex-a7) TARGET_SUBARCH=armv7ve TARGET_ABI=eabi TARGET_FPU_FLAGS="-mfloat-abi=$TARGET_FLOAT -mfpu=$TARGET_FPU" TARGET_FEATURES+=" neon" ;; cortex-a5|cortex-a8|cortex-a9) TARGET_SUBARCH=armv7-a TARGET_ABI=eabi TARGET_FPU_FLAGS="-mfloat-abi=$TARGET_FLOAT -mfpu=$TARGET_FPU" TARGET_FEATURES+=" neon" ;; cortex-a55|cortex-a53|cortex-a35|cortex-a72.cortex-a53) TARGET_SUBARCH=armv8-a TARGET_ABI=eabi TARGET_FPU_FLAGS="-mfloat-abi=$TARGET_FLOAT -mfpu=$TARGET_FPU" TARGET_FEATURES+=" neon" ;; esac if [ "${TARGET_FLOAT}" = "hard" ]; then TARGET_ABI+="hf" fi TARGET_VARIANT="${TARGET_SUBARCH}${TARGET_CPU_FLAGS}" TARGET_GCC_ARCH=${TARGET_SUBARCH/-} TARGET_KERNEL_ARCH=${TARGET_KERNEL_ARCH:-arm} if [ "${TARGET_KERNEL_ARCH}" = "arm64" ]; then TARGET_KERNEL_PATCH_ARCH="aarch64" fi # setup ARCH specific *FLAGS TARGET_CFLAGS="-march=$TARGET_VARIANT -mtune=$TARGET_CPU -mabi=aapcs-linux -Wno-psabi -Wa,-mno-warn-deprecated" [ -n "$TARGET_FPU" ] && TARGET_CFLAGS="$TARGET_CFLAGS $TARGET_FPU_FLAGS" TARGET_LDFLAGS="" TARGET_ARCH_GCC_OPTS="--with-abi=aapcs-linux --with-arch=$TARGET_SUBARCH --with-float=$TARGET_FLOAT --with-fpu=$TARGET_FPU" ================================================ FILE: config/arch.x86_64 ================================================ # determines TARGET_CPU, if not forced by user if [ -z "${TARGET_CPU}" ]; then TARGET_CPU="x86-64" fi # determine architecture's family TARGET_SUBARCH="x86_64" TARGET_GCC_ARCH="${TARGET_SUBARCH/-/}" TARGET_KERNEL_ARCH="x86" # setup ARCH specific *FLAGS TARGET_CFLAGS="-march=${TARGET_CPU}" TARGET_LDFLAGS="" # build with microarchitecture feature support defined by the TARGET_CPU value # see https://gitlab.com/x86-psABIs/x86-64-ABI/-/wikis/home for further details TARGET_FEATURES="64bit cmov cx8 fpu fxsr mmx osfxsr sce sse sse2" TARGET_FEATURES_X86_64_V2="cmpxchg16b lahf-sahf popcnt sse3 sse4_1 sse4_2 ssse3" TARGET_FEATURES_X86_64_V3="avx avx2 bmi1 bmi2 f16c fma lzcnt movbe osxsave" if [ "${TARGET_CPU}" = "x86-64" ]; then TARGET_FEATURES+=" no_sahf" elif [ "${TARGET_CPU}" = "x86-64-v2" ]; then TARGET_FEATURES+=" ${TARGET_FEATURES_X86_64_V2}" elif [ "${TARGET_CPU}" = "x86-64-v3" ]; then TARGET_FEATURES+=" ${TARGET_FEATURES_X86_64_V2} ${TARGET_FEATURES_X86_64_V3}" else TARGET_FEATURES+=" UNKNOWN_ADDITIONAL_CPU_SPECIFIC_FEATURES" fi TARGET_FEATURES="$(echo ${TARGET_FEATURES} | xargs -n1 | sort -u | xargs)" ================================================ FILE: config/docker/changelog.txt ================================================ 100 - Initial addon ================================================ FILE: config/docker/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="@NAME@" PKG_VERSION="@VERSION@" # Update bin/docker.@NAME@ accordingly PKG_REV="100" PKG_ARCH="@ARCH@" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="docker" PKG_SITE="" PKG_SHORTDESC="" PKG_LONGDESC="" PKG_IS_ADDON="yes" PKG_ADDON_NAME=" (@IMAGE@:$PKG_VERSION)" PKG_ADDON_PROJECTS="@PROJECTS@" PKG_ADDON_REQUIRES="service.system.docker:0.0.0" PKG_ADDON_TYPE="xbmc.service" make_target() { : # } makeinstall_target() { : # } addon() { : # } ================================================ FILE: config/docker/source/bin/docker ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) name="$(basename $0)" . /etc/profile oe_setup_addon "$name" docker rm "$name" 2>/dev/null docker run --name="$name" \ ================================================ FILE: config/docker/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == '__main__': Monitor().waitForAbort() ================================================ FILE: config/docker/source/resources/language/English/strings.po ================================================ msgid "" msgstr "" msgctxt "#30000" msgid "Configuration" msgstr "" msgctxt "#30001" msgid "Note: Kodi remote sources can not be used as Docker volume host sources" msgstr "" ================================================ FILE: config/docker/source/resources/settings.xml ================================================ @SETTINGS@ ================================================ FILE: config/docker/source/system.d/docker.service ================================================ [Unit] Description=%p container Requires=service.system.docker.service After=service.system.docker.service [Service] Restart=always RestartSec=10s TimeoutStartSec=0 ExecStart=/bin/sh /storage/.kodi/addons/%p/bin/%p ExecStop=/storage/.kodi/addons/service.system.docker/bin/docker kill %p [Install] WantedBy=multi-user.target ================================================ FILE: config/functions ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) ### FUNCTION HELPERS ### # die (message, code) abort with optional message and code die() { if [ -n "$1" ]; then echo -e "$1" >&2 fi exit "${2:-1}" } onexitcleanup() { [ $? -eq 0 ] && return local _BASH_COMMAND="${BASH_COMMAND}" if [ -n "${PKG_CURRENT_CALL}" ]; then print_color CLR_ERROR "FAILURE: $* during ${PKG_CURRENT_CALL} (${PKG_CURRENT_CALL_TYPE})" echo fi if [ -n "${_BASH_COMMAND}" ]; then if [[ ! ${_BASH_COMMAND} =~ ^exit\ ]] && [[ ! ${_BASH_COMMAND} =~ ^return\ ]]; then echo "*********** FAILED COMMAND ***********" echo "${_BASH_COMMAND}" echo "**************************************" fi fi } [ "${NOONEXIT}" != "yes" ] && trap "onexitcleanup $0 $@" EXIT # return 0 if $2 in space-separated list $1, otherwise return 1 listcontains() { if [ -n "$1" -a -n "$2" ]; then [[ ${1} =~ (^|[[:space:]])${2}($|[[:space:]]) ]] && return 0 || return 1 else return 1 fi } # remove item(s) from list. # looping makes it greedy (eg. listremoveitem "abc def ghi" "(abc|def)" removes both "abc" and "def"). listremoveitem() { local data="${1}" odata tmp_array if [ -n "$1" -a -n "$2" ]; then while [ : ]; do odata="${data}" data="$(echo "${data}" | sed -E "s (^|[[:space:]])${2}($|[[:space:]]) \ g")" [ "${odata}" = "${data}" ] && break done fi # Use array word splitting to squash spaces tmp_array=(${data}) echo "${tmp_array[@]}" } print_color() { local clr_name="$1" clr_text="$2" clr_actual local black red green yellow blue magenta cyan white endcolor local boldblack boldred boldgreen boldyellow boldblue boldmagenta boldcyan boldwhite [ -z "${clr_name}" ] && return 0 if [ "$DISABLE_COLORS" = "yes" ]; then [ $# -eq 2 ] && echo -en "${clr_text}" return 0 fi black="\e[0;30m" boldblack="\e[1;30m" red="\e[0;31m" boldred="\e[1;31m" green="\e[0;32m" boldgreen="\e[1;32m" yellow="\e[0;33m" boldyellow="\e[1;33m" blue="\e[0;34m" boldblue="\e[1;34m" magenta="\e[0;35m" boldmagenta="\e[1;35m" cyan="\e[0;36m" boldcyan="\e[1;36m" white="\e[0;37m" boldwhite="\e[1;37m" endcolor="\e[0m" # $clr_name can be a color variable (boldgreen etc.) or a # "standard" color determined by an indirect name (CLR_ERROR etc.) # # If ${!clr_name} doesn't exist then assume it's a standard color. # If ${!clr_name} does exist then check it's not a custom color mapping. # Custom color mappings can be configured in options files. # clr_actual="${!clr_name}" if [ -n "${clr_actual}" ]; then clr_actual="${!clr_actual}" else case "${clr_name}" in CLR_ERROR) clr_actual="${boldred}";; CLR_WARNING) clr_actual="${boldred}";; CLR_WARNING_DIM) clr_actual="${red}";; CLR_APPLY_PATCH) clr_actual="${boldgreen}";; CLR_AUTORECONF) clr_actual="${boldmagenta}";; CLR_BUILD) clr_actual="${boldyellow}";; CLR_TOOLCHAIN) clr_actual="${boldmagenta}";; CLR_CLEAN) clr_actual="${boldred}";; CLR_FIXCONFIG) clr_actual="${boldyellow}";; CLR_GET) clr_actual="${boldcyan}";; CLR_INFO) clr_actual="${boldgreen}";; CLR_INSTALL) clr_actual="${boldgreen}";; CLR_PATCH_DESC) clr_actual="${boldwhite}";; CLR_TARGET) clr_actual="${boldwhite}";; CLR_UNPACK) clr_actual="${boldcyan}";; CLR_AUTOREMOVE) clr_actual="${boldblue}";; CLR_ENDCOLOR) clr_actual="${endcolor}";; *) clr_actual="${endcolor}";; esac fi if [ $# -eq 2 ]; then echo -en "${clr_actual}${clr_text}${endcolor}" else echo -en "${clr_actual}" fi } # print build progress messages # param1: message color, p2: label, p3: text, p4: indent (optional) build_msg() { local spaces [ -n "${BUILD_INDENT}" ] && spaces="$(printf "%${BUILD_INDENT}c" " ")" || spaces="" if [ -n "${3}" ]; then echo -e "${spaces}$(print_color "${1}" "${2}") ${3}" >&${SILENT_OUT} else echo -e "${spaces}$(print_color "${1}" "${2}")" >&${SILENT_OUT} fi # pad left space to create "indent" effect if [ "${4}" = "indent" ]; then export BUILD_INDENT=$((${BUILD_INDENT:-0}+${BUILD_INDENT_SIZE})) elif [ -n "${4}" ]; then die "ERROR: ${0} unexpected parameter: ${4}" fi } print_qa_checks() { [[ -d "${BUILD}/qa_checks" ]] || mkdir -p "${BUILD}/qa_checks" if [ -n "${PKG_NAME}" ]; then if [ -d "${PKG_QA_CHECKS}" ]; then for qa_check in ${PKG_QA_CHECKS}/*; do print_color CLR_WARNING "[QA CHECK] [${PKG_NAME}] [$(basename ${qa_check})]:\n$(cat ${qa_check})\n\n" done fi fi } log_qa_check() { local qa_check_title="${1}" local qa_check_message="${2}" if [ -n "${qa_check_title}" -a -n "${qa_check_message}" ]; then if [ -n "${PKG_NAME}" ]; then print_color CLR_WARNING "[QA CHECK] [${PKG_NAME}] [${qa_check_title}]:\n${qa_check_message}\n" mkdir -p "${PKG_QA_CHECKS}" echo -e "${qa_check_message}" >> ${PKG_QA_CHECKS}/${qa_check_title} else print_color CLR_WARNING "[QA CHECK] [general] [${qa_check_title}]:\n${qa_check_message}\n" mkdir -p "${BUILD}/qa_checks/general" echo -e "${qa_check_message}" >> ${BUILD}/qa_checks/general/${qa_check_title} fi fi } # prints a warning if the file slated for removal doesn't exist # this allows us to continue instead of bailing out with just "rm" safe_remove() { local path for path in "$@" ; do if [ -e "${path}" -o -L "${path}" ]; then rm -r "${path}" else log_qa_check "safe_remove" "path does not exist: ${path}" fi done } ### BUILDSYSTEM HELPERS ### # check if a flag is enabled # $1: flag-name, $2: default (yes/no), $3: ingenious check (none,only-disable,only-enable) # return 0 if flag is enabled, otherwise 1 flag_enabled() { # check flag if [ -n "${PKG_BUILD_FLAGS}" ] && listcontains "${PKG_BUILD_FLAGS}" "[+]?$1"; then if [ "${3:none}" = "only-disable" ]; then die "ERROR: $1 cannot enable via PKG_BUILD_FLAGS (found in $PKG_NAME)" fi return 0 elif [ "$2" = "yes" ] && ! listcontains "${PKG_BUILD_FLAGS}" "-$1"; then return 0 else if [ "${3:none}" = "only-enable" ]; then die "ERROR: $1 cannot disable via PKG_BUILD_FLAGS (found in $PKG_NAME)" fi return 1 fi } setup_pkg_config_target() { export PKG_CONFIG="$TOOLCHAIN/bin/pkg-config" export PKG_CONFIG_PATH="" export PKG_CONFIG_LIBDIR="$SYSROOT_PREFIX/usr/lib/pkgconfig:$SYSROOT_PREFIX/usr/share/pkgconfig" export PKG_CONFIG_SYSROOT_BASE="$BUILD" export PKG_CONFIG_SYSROOT_DIR="$SYSROOT_PREFIX" export PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 export PKG_CONFIG_ALLOW_SYSTEM_LIBS=1 } setup_pkg_config_host() { export PKG_CONFIG="$TOOLCHAIN/bin/pkg-config" export PKG_CONFIG_PATH="" export PKG_CONFIG_LIBDIR="$TOOLCHAIN/lib/pkgconfig:$TOOLCHAIN/share/pkgconfig" export PKG_CONFIG_SYSROOT_BASE="" export PKG_CONFIG_SYSROOT_DIR="" unset PKG_CONFIG_ALLOW_SYSTEM_CFLAGS unset PKG_CONFIG_ALLOW_SYSTEM_LIBS } check_toolchain_config() { local target=${1^^} local toolchain=${2^^} local var if [ "${toolchain}" == "AUTOTOOLS" ]; then toolchain="CONFIGURE" fi if [ "${toolchain}" == "CMAKE-MAKE" ]; then toolchain="CMAKE" fi for var in "${!PKG_@}"; do if [[ "${var}" =~ INSTALL_OPTS_ || "${var}" =~ _MAKE_OPTS || "${var}" =~ _TAR_COPY_OPTS ]]; then continue fi if [[ "${var}" =~ _OPTS_${target}$ \ && ! "${var}" =~ _${toolchain}_OPTS_${target}$ || "${var}" =~ _OPTS$ && ! "${var}" =~ _${toolchain}_OPTS$ ]]; then die "ERROR: using $2 toolchain but ${var} is configured." fi done } # args: linker, default availability yes/no linker_allowed() { if flag_enabled "$1" "$2"; then # bfd is always available, others need to be enabled with _SUPPORT="yes" local linker_support="${1^^}_SUPPORT" if [ "$1" = "bfd" ] || [ "${!linker_support}" = "yes" ]; then return 0 fi fi return 1 } # return target linker to use for a package get_target_linker() { # all known linkers, in descending order of priority # those are candidates for explicit opt-in via PKG_BUILD_FLAGS local all_linkers="mold gold bfd" # linkers to choose from unless disabled via PKG_BUILD_FLAGS local linker_candidates="${DEFAULT_LINKER:-bfd} ${all_linkers}" local linker # check if package prefers a specific linker for linker in ${all_linkers}; do if linker_allowed "${linker}" "no"; then echo "${linker}" return fi done # select linker which isn't disabled by PKG_BUILD_FLAGS for linker in ${linker_candidates}; do if linker_allowed "${linker}" "yes"; then echo "${linker}" return fi done # none of our linkers matched, use the compiler's default linker echo "compiler_default" } setup_toolchain() { if [ "$LTO_SUPPORT" = "yes" ]; then if flag_enabled "lto-parallel" "no"; then TARGET_CFLAGS+=" $FLAGS_OPTIM_LTO_PARALLEL $FLAGS_OPTIM_LTO_NO_FAT" TARGET_CXXFLAGS+=" $FLAGS_OPTIM_LTO_PARALLEL $FLAGS_OPTIM_LTO_NO_FAT" TARGET_LDFLAGS+=" $LDFLAGS_OPTIM_LTO_COMMON $FLAGS_OPTIM_LTO_PARALLEL" elif flag_enabled "lto-fat" "no"; then TARGET_CFLAGS+=" $FLAGS_OPTIM_LTO_NO_PARALLEL $FLAGS_OPTIM_LTO_FAT" TARGET_CXXFLAGS+=" $FLAGS_OPTIM_LTO_NO_PARALLEL $FLAGS_OPTIM_LTO_FAT" TARGET_LDFLAGS+=" $LDFLAGS_OPTIM_LTO_COMMON $FLAGS_OPTIM_LTO_NO_PARALLEL" elif flag_enabled "lto" "no"; then TARGET_CFLAGS+=" $FLAGS_OPTIM_LTO_NO_PARALLEL $FLAGS_OPTIM_LTO_NO_FAT" TARGET_CXXFLAGS+=" $FLAGS_OPTIM_LTO_NO_PARALLEL $FLAGS_OPTIM_LTO_NO_FAT" TARGET_LDFLAGS+=" $LDFLAGS_OPTIM_LTO_COMMON $FLAGS_OPTIM_LTO_NO_PARALLEL" fi fi if flag_enabled "lto-off" "no"; then TARGET_CFLAGS+=" $FLAGS_OPTIM_LTO_OFF" TARGET_CXXFLAGS+=" $FLAGS_OPTIM_LTO_OFF" TARGET_LDFLAGS+=" $FLAGS_OPTIM_LTO_OFF" fi local linker="$(get_target_linker)" local linker_opts="LDFLAGS_OPTIM_LINKER_${linker^^}" TARGET_LDFLAGS+=" ${!linker_opts}" # compiler optimization, descending priority: speed, size, default if [ "${BUILD_WITH_DEBUG}" = "yes" ]; then if [ "${SPLIT_DEBUG_INFO}" = "yes" -a "${linker}" = "gold" ]; then TARGET_CFLAGS+=" $CFLAGS_OPTIM_DEBUG_SPLIT" TARGET_CXXFLAGS+=" $CXXFLAGS_OPTIM_DEBUG_SPLIT" TARGET_LDFLAGS+=" $LDFLAGS_OPTIM_DEBUG_SPLIT" else TARGET_CFLAGS+=" $CFLAGS_OPTIM_DEBUG" TARGET_CXXFLAGS+=" $CXXFLAGS_OPTIM_DEBUG" TARGET_LDFLAGS+=" $LDFLAGS_OPTIM_DEBUG" fi elif flag_enabled "speed" "no"; then TARGET_CFLAGS+=" $CFLAGS_OPTIM_SPEED" TARGET_CXXFLAGS+=" $CXXFLAGS_OPTIM_SPEED" elif flag_enabled "size" "no"; then TARGET_CFLAGS+=" $CFLAGS_OPTIM_SIZE" TARGET_CXXFLAGS+=" $CXXFLAGS_OPTIM_SIZE" else TARGET_CFLAGS+=" $CFLAGS_OPTIM_DEFAULT" TARGET_CXXFLAGS+=" $CXXFLAGS_OPTIM_DEFAULT" fi # position-independent code if flag_enabled "pic" "no"; then TARGET_CFLAGS+=" $CFLAGS_OPTIM_PIC" TARGET_CXXFLAGS+=" $CXXFLAGS_OPTIM_PIC" TARGET_LDFLAGS+=" $LDFLAGS_OPTIM_PIC" fi if flag_enabled "pic:host" "no"; then HOST_CFLAGS+=" $CFLAGS_OPTIM_PIC" HOST_CXXFLAGS+=" $CXXFLAGS_OPTIM_PIC" HOST_LDFLAGS+=" $LDFLAGS_OPTIM_PIC" fi # hardening support if flag_enabled "hardening" "$HARDENING_SUPPORT"; then TARGET_CFLAGS+=" $CFLAGS_OPTIM_HARDENING" TARGET_CXXFLAGS+=" $CXXFLAGS_OPTIM_HARDENING" TARGET_CFLAGS+=" $CPPFLAGS_OPTIM_HARDENING" TARGET_LDFLAGS+=" $LDFLAGS_OPTIM_HARDENING" fi # parallel if flag_enabled "parallel" "yes"; then NINJA_OPTS="-j$CONCURRENCY_MAKE_LEVEL" MAKEFLAGS="-j$CONCURRENCY_MAKE_LEVEL" else NINJA_OPTS="-j1" MAKEFLAGS="-j1" fi # verbose flag if flag_enabled "verbose" "no"; then NINJA_OPTS+=" -v" MAKEFLAGS+=" V=1 VERBOSE=1" fi # average load limit if [ "${CONCURRENCY_LOAD}" != "0" ]; then NINJA_OPTS+=" -l${CONCURRENCY_LOAD}" MAKEFLAGS+=" -l${CONCURRENCY_LOAD}" fi export MAKEFLAGS case "$1:$2" in target:meson|init:meson) export DESTIMAGE="target" export AWK="gawk" export CC="$TOOLCHAIN/bin/host-gcc" export CXX="$TOOLCHAIN/bin/host-g++" export CPP="cpp" export LD="ld" export AS="as" export AR="ar" export NM="nm" export RANLIB="ranlib" export OBJCOPY="objcopy" export OBJDUMP="objdump" export STRIP="strip" export CPPFLAGS="$HOST_CPPFLAGS" export CFLAGS="$HOST_CFLAGS" export CXXFLAGS="$HOST_CXXFLAGS" export LDFLAGS="$HOST_LDFLAGS" setup_pkg_config_target export TARGET_CC="${TARGET_PREFIX}gcc" export TARGET_CXX="${TARGET_PREFIX}g++" export TARGET_AR="${TARGET_PREFIX}ar" export TARGET_STRIP="${TARGET_PREFIX}strip" export TARGET_CFLAGS="$TARGET_CFLAGS" export TARGET_CXXFLAGS="$TARGET_CXXFLAGS" export TARGET_LDFLAGS="$TARGET_LDFLAGS" export HOST_CC="$CC" export HOST_CXX="$CXX" export HOSTCC="$CC" export HOSTCXX="$CXX" export CC_FOR_BUILD="$CC" export CXX_FOR_BUILD="$CXX" export BUILD_CC="$CC" export BUILD_CXX="$CXX" export _python_sysroot="$SYSROOT_PREFIX" export _python_prefix=/usr export _python_exec_prefix=/usr ;; target:*|init:*) export DESTIMAGE="target" export CC="${TARGET_PREFIX}gcc" export CXX="${TARGET_PREFIX}g++" export CPP="${TARGET_PREFIX}cpp" export LD="${TARGET_PREFIX}ld" export AS="${TARGET_PREFIX}as" export AR="${TARGET_PREFIX}ar" export NM="${TARGET_PREFIX}nm" export RANLIB="${TARGET_PREFIX}ranlib" export OBJCOPY="${TARGET_PREFIX}objcopy" export OBJDUMP="${TARGET_PREFIX}objdump" export STRIP="${TARGET_PREFIX}strip" export CPPFLAGS="$TARGET_CPPFLAGS" export CFLAGS="$TARGET_CFLAGS" export CXXFLAGS="$TARGET_CXXFLAGS" export LDFLAGS="$TARGET_LDFLAGS" setup_pkg_config_target export CMAKE_CONF=$TOOLCHAIN/etc/cmake-$TARGET_NAME.conf export CMAKE="cmake -DCMAKE_TOOLCHAIN_FILE=$CMAKE_CONF -DCMAKE_INSTALL_PREFIX=/usr" if [ ! -f $CMAKE_CONF ] ; then mkdir -p $TOOLCHAIN/etc echo "SET(CMAKE_SYSTEM_NAME Linux)" >> $CMAKE_CONF echo "SET(CMAKE_SYSTEM_VERSION 1)" >> $CMAKE_CONF echo "SET(CMAKE_SYSTEM_PROCESSOR $TARGET_ARCH)" >> $CMAKE_CONF echo "SET(CMAKE_C_COMPILER $CC)" >> $CMAKE_CONF echo "SET(CMAKE_CXX_COMPILER $CXX)" >> $CMAKE_CONF echo "SET(CMAKE_CPP_COMPILER $CPP)" >> $CMAKE_CONF echo "SET(CMAKE_ASM_FLAGS_MINSIZEREL -DDUMMYOPT)" >> $CMAKE_CONF echo "SET(CMAKE_CXX_FLAGS_MINSIZEREL -DDUMMYOPT)" >> $CMAKE_CONF echo "SET(CMAKE_C_FLAGS_MINSIZEREL -DDUMMYOPT)" >> $CMAKE_CONF echo "SET(CMAKE_FIND_ROOT_PATH $SYSROOT_PREFIX)" >> $CMAKE_CONF echo "SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)" >> $CMAKE_CONF echo "SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)" >> $CMAKE_CONF echo "SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)" >> $CMAKE_CONF echo "SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)" >> $CMAKE_CONF if [ "${DISPLAYSERVER}" = "x11" ]; then if [ "${OPENGL}" = "mesa" ] || listcontains "${GRAPHIC_DRIVERS}" "nvidia"; then echo "SET(OpenGL_GL_PREFERENCE GLVND)" >> $CMAKE_CONF fi fi fi export HOST_CC="$TOOLCHAIN/bin/host-gcc" export HOST_CXX="$TOOLCHAIN/bin/host-g++" export HOSTCC="$HOST_CC" export HOSTCXX="$HOST_CXX" export CC_FOR_BUILD="$HOST_CC" export CXX_FOR_BUILD="$HOST_CXX" export BUILD_CC="$HOST_CC" export BUILD_CXX="$HOST_CXX" export _python_sysroot="$SYSROOT_PREFIX" export _python_prefix=/usr export _python_exec_prefix=/usr # rust export CARGO_TARGET_DIR="${PKG_BUILD}/.${TARGET_NAME}/target" export CARGO_HOME="$(get_build_dir rust)/cargo_home" export RUST_TARGET_PATH="${TOOLCHAIN}/lib/rustlib/" ;; host:*|bootstrap:*) export DESTIMAGE="host" export AWK="gawk" if [ "$1" = "host" ] && flag_enabled "local-cc" "no"; then export CC="${LOCAL_CC}" export CXX="${LOCAL_CXX}" if [ -n "${LOCAL_CCACHE}" ]; then export CCACHE_DIR="${LOCAL_CCACHE_DIR}" export CC="${LOCAL_CCACHE} ${CC}"; export CXX="${LOCAL_CCACHE} ${CXX}"; fi else export CC="$TOOLCHAIN/bin/host-gcc" export CXX="$TOOLCHAIN/bin/host-g++" fi export CPP="cpp" export LD="ld" export AS="as" export AR="ar" export NM="nm" export RANLIB="ranlib" export OBJCOPY="objcopy" export OBJDUMP="objdump" export STRIP="strip" export CPPFLAGS="$HOST_CPPFLAGS" export CFLAGS="$HOST_CFLAGS" export CXXFLAGS="$HOST_CXXFLAGS" export LDFLAGS="$HOST_LDFLAGS" setup_pkg_config_host export CMAKE_CONF=$TOOLCHAIN/etc/cmake-$HOST_NAME.conf export CMAKE="cmake -DCMAKE_TOOLCHAIN_FILE=$CMAKE_CONF -DCMAKE_INSTALL_PREFIX=$TOOLCHAIN" if [ ! -f $CMAKE_CONF ] ; then mkdir -p $TOOLCHAIN/etc echo "SET(CMAKE_SYSTEM_NAME Linux)" >> $CMAKE_CONF echo "SET(CMAKE_SYSTEM_VERSION 1)" >> $CMAKE_CONF echo "SET(CMAKE_SYSTEM_PROCESSOR ${MACHINE_HARDWARE_NAME})" >> $CMAKE_CONF echo "SET(CMAKE_C_COMPILER $CC)" >> $CMAKE_CONF echo "SET(CMAKE_CXX_COMPILER $CXX)" >> $CMAKE_CONF echo "SET(CMAKE_CPP_COMPILER $CXX)" >> $CMAKE_CONF echo "SET(CMAKE_ASM_FLAGS_RELEASE -DDUMMYOPT)" >> $CMAKE_CONF echo "SET(CMAKE_CXX_FLAGS_RELEASE -DDUMMYOPT)" >> $CMAKE_CONF echo "SET(CMAKE_C_FLAGS_RELEASE -DDUMMYOPT)" >> $CMAKE_CONF echo "SET(CMAKE_AR $AR CACHE FILEPATH "Archiver")" >> $CMAKE_CONF # hum? echo "SET(CMAKE_FIND_ROOT_PATH $TOOLCHAIN)" >> $CMAKE_CONF echo "SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)" >> $CMAKE_CONF echo "SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)" >> $CMAKE_CONF echo "SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)" >> $CMAKE_CONF echo "SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)" >> $CMAKE_CONF fi export HOST_CC="$CC" export HOST_CXX="$CXX" export HOSTCC="$CC" export HOSTCXX="$CXX" export CC_FOR_BUILD="$CC" export CXX_FOR_BUILD="$CXX" export BUILD_CC="$CC" export BUILD_CXX="$CXX" export _python_sysroot="$TOOLCHAIN" export _python_prefix=/ export _python_exec_prefix=/ # rust case "${MACHINE_HARDWARE_NAME}" in "arm") RUST_HOST="arm-unknown-linux-gnueabihf" ;; "aarch64") RUST_HOST="aarch64-unknown-linux-gnu" ;; "x86_64") RUST_HOST="x86_64-unknown-linux-gnu" ;; esac export CARGO_TARGET_DIR="${PKG_BUILD}/.${RUST_HOST}/target" export CARGO_HOME="$(get_build_dir rust)/cargo_home" export RUST_TARGET_PATH="${TOOLCHAIN}/lib/rustlib/" ;; esac } create_meson_conf_host() { local properties properties="PKG_MESON_PROPERTIES_${1^^}" cat > $2 < $2 </dev/null || : fi } init_package_cache() { local _ANCHOR="@?+?@" local temp_global temp_local # If the package caches are unset, then populate them if [ -z "${_CACHE_PACKAGE_LOCAL}" -o -z "${_CACHE_PACKAGE_GLOBAL}" -o -z "${_CACHE_PACKAGE_LOCAL_DEVICE}" ]; then temp_global="$(mktemp)" temp_local="$(mktemp)" temp_local_device="$(mktemp)" # cache project/device folder for packages if [ -n "${DEVICE}" ]; then find "${ROOT}/projects/${PROJECT}/devices/${DEVICE}/packages" -type f -name package.mk 2>/dev/null | sed "s#/package\.mk\$#${_ANCHOR}#" >> "${temp_local_device}" fi # cache project folder for packages find "${ROOT}/projects/${PROJECT}/packages" -type f -name package.mk 2>/dev/null | sed "s#/package\.mk\$#${_ANCHOR}#" >> "${temp_local}" # cache packages folder find "${ROOT}/${PACKAGES}" -type f -name package.mk 2>/dev/null | sed "s#/package\.mk\$#${_ANCHOR}#" >> "${temp_global}" _CACHE_PACKAGE_LOCAL="${BUILD}/.cache_package_local" _CACHE_PACKAGE_LOCAL_DEVICE="${BUILD}/.cache_package_local_device" _CACHE_PACKAGE_GLOBAL="${BUILD}/.cache_package_global" export _CACHE_PACKAGE_LOCAL _CACHE_PACKAGE_GLOBAL _CACHE_PACKAGE_LOCAL_DEVICE # overwrite existing cache files only when they are invalid, or not yet created mkdir -p "${_CACHE_PACKAGE_GLOBAL%/*}" if [ -f "${_CACHE_PACKAGE_LOCAL_DEVICE}" ] && cmp -s "${temp_local_device}" "${_CACHE_PACKAGE_LOCAL_DEVICE}"; then rm "${temp_local_device}" else mv "${temp_local_device}" "${_CACHE_PACKAGE_LOCAL_DEVICE}" fi if [ -f "${_CACHE_PACKAGE_LOCAL}" ] && cmp -s "${temp_local}" "${_CACHE_PACKAGE_LOCAL}"; then rm "${temp_local}" else mv "${temp_local}" "${_CACHE_PACKAGE_LOCAL}" fi if [ -f "${_CACHE_PACKAGE_GLOBAL}" ] && cmp -s "${temp_global}" "${_CACHE_PACKAGE_GLOBAL}"; then rm "${temp_global}" else mv "${temp_global}" "${_CACHE_PACKAGE_GLOBAL}" fi fi if [ -z "${_DEBUG_DEPENDS_LIST+x}" ]; then set_debug_depends fi } load_build_config() { if [ -d "${1}" -a -f ${1}/.build.conf ]; then source ${1}/.build.conf return 0 fi return 1 } save_build_config() { local var mkdir -p ${BUILD} rm -f ${BUILD}/.build.conf for var in PROJECT DEVICE ARCH DEBUG BUILD_SUFFIX; do echo "export ${var}=\"${!var}\"" >> ${BUILD}/.build.conf done } check_path() { local dashes="===========================" path_err_msg if [ "${PWD##/usr}" != "${PWD}" ]; then path_err_msg="\n ${dashes}${dashes}${dashes}" path_err_msg+="\n ERROR: Detected building inside /usr" path_err_msg+="\n ${dashes}${dashes}${dashes}" path_err_msg+="\n This is not supported by the buildsystem." path_err_msg+="\n Please use another directory (for example your \$HOME) to build ${DISTRONAME}" die "${path_err_msg}" fi } check_distro() { local dashes="===========================" distro_err_msg if [ -z "${DISTRO}" -o ! -d "${DISTRO_DIR}/${DISTRO}" ]; then distro_err_msg="\n ${dashes}${dashes}${dashes}" distro_err_msg+="\n ERROR: Distro not found, use a valid distro or create a new config" distro_err_msg+="\n ${dashes}${dashes}${dashes}" distro_err_msg+="\n\n Valid distros:" for distros in ${DISTRO_DIR}/*; do distro_err_msg+="\n - ${distros##*/}" done die "${distro_err_msg}" fi } check_project() { local dashes="===========================" project_err_msg if [ -z "${PROJECT}" -o ! -d "${PROJECT_DIR}/${PROJECT}" ]; then project_err_msg="\n ${dashes}${dashes}${dashes}" project_err_msg+="\n ERROR: Project not found. Use a valid project or create a new config" project_err_msg+="\n ${dashes}${dashes}${dashes}" project_err_msg+="\n\n Valid projects:" for projects in ${PROJECT_DIR}/*; do project_err_msg+="\n - ${projects##*/}" done die "${project_err_msg}" fi } check_device() { local dashes="===========================" device_err_msg if [ -n "${DEVICE}" -a ! -d "${PROJECT_DIR}/${PROJECT}/devices" ]; then device_err_msg="\n $dashes$dashes$dashes" device_err_msg+="\n ERROR: You must not specify DEVICE for the $PROJECT project" device_err_msg+="\n $dashes$dashes$dashes" device_err_msg+="\n\n There are no devices for project: ${PROJECT}" die "${device_err_msg}" elif [ \( -z "${DEVICE}" -a -d "${PROJECT_DIR}/${PROJECT}/devices" \) -o \ \( -n "${DEVICE}" -a ! -d "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}" \) ]; then device_err_msg="\n ${dashes}${dashes}${dashes}" device_err_msg+="\n ERROR: Specify a valid device for the ${PROJECT} project" device_err_msg+="\n ${dashes}${dashes}${dashes}" device_err_msg+="\n\n Valid devices for project: ${PROJECT}" for device in ${PROJECT_DIR}/${PROJECT}/devices/*; do device_err_msg+="\n - ${device##*/}" done die "${device_err_msg}" fi } check_arch() { local dashes="===========================" arch_err_msg linux_config_dir if [ -d "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/linux" ]; then linux_config_dir="${PROJECT_DIR}/${PROJECT}/devices/$DEVICE/linux" else linux_config_dir="${PROJECT_DIR}/${PROJECT}/linux" fi if [ ! -e "${linux_config_dir}/linux.${TARGET_KERNEL_PATCH_ARCH:-$TARGET_ARCH}.conf" ] && ! ls "${linux_config_dir}/"*/linux.${TARGET_KERNEL_PATCH_ARCH:-$TARGET_ARCH}.conf &>/dev/null; then arch_err_msg="\n ${dashes}${dashes}${dashes}" arch_err_msg+="\n ERROR: Architecture not found. Use a valid Architecture" arch_err_msg+="\n for your project or create a new config" arch_err_msg+="\n ${dashes}${dashes}${dashes}" arch_err_msg+="\n\n Valid Architectures for project: ${PROJECT}" for arch in ${linux_config_dir}/*.conf ${linux_config_dir}/*/linux.${TARGET_ARCH}.conf; do [[ ${arch} =~ .*\*.* ]] && continue #ignore unexpanded wildcard arch_err_msg+="\n - $(echo ${arch##*/} | cut -f2 -d".")" done die "${arch_err_msg}" fi } check_config() { check_path check_distro check_project check_device check_arch } do_autoreconf() { export ACLOCAL_DIR=$SYSROOT_PREFIX/usr/share/aclocal if [ -e "$TOOLCHAIN/bin/autoconf" ]; then export AUTOCONF=$TOOLCHAIN/bin/autoconf fi if [ -e "$TOOLCHAIN/bin/automake" ]; then export AUTOMAKE=$TOOLCHAIN/bin/automake fi if [ -e "$TOOLCHAIN/bin/autopoint" ]; then export AUTOPOINT=$TOOLCHAIN/bin/autopoint fi if [ -e "$TOOLCHAIN/bin/libtoolize" ]; then export LIBTOOLIZE=$TOOLCHAIN/bin/libtoolize fi if [ -e "$TOOLCHAIN/bin/intltoolize" ]; then export INTLTOOLIZE=$TOOLCHAIN/bin/intltoolize fi if [ -e "$TOOLCHAIN/bin/aclocal" ]; then export ACLOCAL="$TOOLCHAIN/bin/aclocal -I $ACLOCAL_DIR" fi if [ -e "$TOOLCHAIN/bin/autoheader" ]; then export AUTOHEADER=$TOOLCHAIN/bin/autoheader fi if [ -e "$TOOLCHAIN/bin/libtool" ]; then export LIBTOOL=$TOOLCHAIN/bin/libtool fi # >autoconf-2.69 will call gtkdocize when used in macros # when called with --install parameter. # use "true" unless gtkdocsize is in the toolchain. if [ -e "$TOOLCHAIN/bin/gtkdocize" ]; then export GTKDOCIZE=$TOOLCHAIN/bin/gtkdocize else export GTKDOCIZE=true fi if [ -e "$TOOLCHAIN/bin/autoreconf" -a -e "$INTLTOOLIZE" ]; then mkdir -p $ACLOCAL_DIR if [ -e "$LIBTOOLIZE" ]; then export AUTORECONF="$TOOLCHAIN/bin/autoreconf --verbose --force --install -I $ACLOCAL_DIR" else export AUTORECONF="$TOOLCHAIN/bin/autoreconf --verbose --force -I $ACLOCAL_DIR" fi $AUTORECONF $@ fi } # True if this is a sequential build, false if multithreaded is_sequential_build() { [ "${MTWITHLOCKS}" != "yes" ] && return 0 || return 1 } # arg1: filename (libtool) to remove hardcode rpath when --disable-rpath is not supported by configure libtool_remove_rpath() { sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' ${1} sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' ${1} } ### PACKAGE HELPERS ### # get variable ($2) for package ($1). # avoid infinite recursion if required package is already loaded. get_pkg_variable() { if [ -n "$1" -a -n "$2" ] ; then if [ "$1" != "$PKG_NAME" ]; then source_package "${1}" fi echo "${!2}" fi } # get package's build dir get_build_dir() { local _PKG_NAME="${1%:*}" _PKG_VERSION="$(get_pkg_version "$1")" if [ -n "$_PKG_NAME" -a -n "$_PKG_VERSION" ]; then echo $BUILD/build/${_PKG_NAME}-${_PKG_VERSION} fi } get_install_dir() { get_pkg_variable "$1" PKG_INSTALL } get_pkg_version() { get_pkg_variable "$1" PKG_VERSION } get_pkg_version_maj_min() { local pkg_version [ -n "${1}" ] && pkg_version="$(get_pkg_version "${1}")" || pkg_version="${PKG_VERSION}" if [[ ${pkg_version} =~ ^[0-9A-Za-z]*\.[0-9A-Za-z]*\.[0-9A-za-z]*$ ]]; then echo "${pkg_version%.*}" elif [[ ${pkg_version} =~ ^[0-9A-Za-z]*\.[0-9A-Za-z]*$ ]]; then echo "${pkg_version}" else echo "${pkg_version}" fi } get_pkg_directory() { local _PKG_ROOT_NAME=${1%:*} _ALL_DIRS _FOUND=0 _ANCHOR="@?+?@" _PKG_DIR _DIR # Check for any available local_device package in preference to a global package for _DIR in $(grep -F "/${_PKG_ROOT_NAME}${_ANCHOR}" "${_CACHE_PACKAGE_LOCAL_DEVICE}"); do _DIR="${_DIR%${_ANCHOR}}" # found first, set $_PKG_DIR _PKG_DIR="$_DIR" # keep track of dirs with package.mk for detecting multiple folders _ALL_DIRS+="${_DIR}\n" _FOUND=$((_FOUND+1)) done # If there's no local_device package available, use the global package if [ $_FOUND -eq 0 ]; then # Check for any available local package in preference to a global package for _DIR in $(grep -F "/${_PKG_ROOT_NAME}${_ANCHOR}" "${_CACHE_PACKAGE_LOCAL}"); do _DIR="${_DIR%${_ANCHOR}}" # found first, set $_PKG_DIR _PKG_DIR="$_DIR" # keep track of dirs with package.mk for detecting multiple folders _ALL_DIRS+="${_DIR}\n" _FOUND=$((_FOUND+1)) done fi # If there's no local package available, use the global package if [ $_FOUND -eq 0 ]; then for _DIR in $(grep -F "/${_PKG_ROOT_NAME}${_ANCHOR}" "${_CACHE_PACKAGE_GLOBAL}"); do _DIR="${_DIR%${_ANCHOR}}" # found first, set $_PKG_DIR _PKG_DIR="$_DIR" # keep track of dirs with package.mk for detecting multiple folders _ALL_DIRS+="${_DIR}\n" _FOUND=$((_FOUND+1)) done fi # _FOUND multiple packages? fail if [ $_FOUND -gt 1 ]; then echo "Error - multiple package folders for package ${_PKG_ROOT_NAME}:" >&2 echo -e "$_ALL_DIRS" >&2 die fi echo "$_PKG_DIR" } # Return a list of sorted package names for this project/device/arch get_all_package_names() { sed -e 's#@?+?@##g; s#.*/##g' ${_CACHE_PACKAGE_GLOBAL} ${_CACHE_PACKAGE_LOCAL} ${_CACHE_PACKAGE_LOCAL_DEVICE} | sort --ignore-case --unique } calculate_stamp() { local stamp data stamp="$PKG_DIR $PROJECT_DIR/$PROJECT/patches/$PKG_NAME $PROJECT_DIR/$PROJECT/packages/$PKG_NAME" [ -n "$DEVICE" ] && stamp+=" $PROJECT_DIR/$PROJECT/devices/$DEVICE/patches/$PKG_NAME" [ -n "$PKG_NEED_UNPACK" ] && stamp+=" $PKG_NEED_UNPACK" if [ -n "$PKG_STAMP_VAR" ]; then local TMP_VAR="$(get_build_dir $PKG_NAME)/.pkg_stamp_var" echo "$PKG_STAMP_VAR" > $TMP_VAR stamp+=" $TMP_VAR" fi data="$(find -L ${stamp} -type f -not -name '.*' 2>/dev/null | sed "s|^${ROOT}/||" | LC_ALL=C sort -u | xargs -d '\n' sha256sum)" [ -n "${PKG_STAMP}" ] && data+=$'\n'"$(echo "${PKG_STAMP}" | sha256sum)" echo "${data}" | sha256sum | cut -d" " -f1 } target_has_feature() { listcontains "$TARGET_FEATURES" "$1" } # configure variables for go go_configure() { unset GOARCH GOARM case ${TARGET_ARCH} in x86_64) export GOARCH=amd64 ;; arm) export GOARCH=arm case ${TARGET_CPU} in arm1176jzf-s) export GOARM=6 ;; *) export GOARM=7 ;; esac ;; aarch64) export GOARCH=arm64 ;; esac export GOOS=linux export GOROOT=${TOOLCHAIN}/lib/golang export PATH=${PATH}:${GOROOT}/bin go_configure_path export CGO_ENABLED=1 export CGO_NO_EMULATION=1 export CGO_CFLAGS=$CFLAGS } go_configure_path() { export GOLANG=${TOOLCHAIN}/lib/golang/bin/go export GOPATH=${PKG_BUILD}/.gopath export GOFLAGS="-modcacherw" } # find path for matching file or directory, searching standard directory hierarchy, using optional default # if a path is located it will be set in FOUND_PATH and exit code will be 0. find_path() { local test_func="$1" search="$2" default="$3" local dir match wildcard=0 ftype # support wildcard matches [[ $search =~ \* || $search =~ \? ]] && wildcard=1 [ "$test_func" = "-f" ] && ftype="file" || ftype="dir" for dir in $PROJECT_DIR/$PROJECT/devices/$DEVICE/packages/$PKG_NAME \ $PROJECT_DIR/$PROJECT/devices/$DEVICE \ $PROJECT_DIR/$PROJECT/packages/$PKG_NAME \ $PROJECT_DIR/$PROJECT \ $DISTRO_DIR/$DISTRO/packages/$PKG_NAME \ $DISTRO_DIR/$DISTRO \ $PKG_DIR \ ; do # ignore directories with missing DEVICE or PKG_NAME components [[ $dir =~ /packages/$ ]] && continue [[ $dir =~ /devices/$ ]] && continue [[ $dir =~ /devices//packages/$PKG_NAME$ ]] && continue if [ $wildcard -eq 1 ]; then ls $dir/$search 1>/dev/null 2>&1 && match="$dir/$search" && break else [ $test_func "$dir/$search" ] && match="$dir/$search" && break fi done if [ -z "$match" -a -n "$default" ]; then if [[ $default =~ \* || $default =~ \? ]]; then ls $default 1>/dev/null 2>&1 && match="$default" else [ $test_func "$default" ] && match="$default" fi fi if [ -n "$match" ]; then FOUND_PATH="$match" [ "${VERBOSE_FIND_PATH,,}" = "yes" ] && echo "find_path: Searching for $ftype: \"$search\", found: \"$FOUND_PATH\"" >&2 return 0 else unset FOUND_PATH [ "${VERBOSE_FIND_PATH,,}" = "yes" ] && echo "find_path: Searching for $ftype: \"$search\" - not found" >&2 return 1 fi } find_file_path() { find_path -f "$1" "$2" } find_dir_path() { find_path -d "$1" "$2" } # p1: name of function to test for # return 0 if function exists, 1 if not pkg_call_exists() { PKG_CURRENT_CALL="${1}" if [ "$(type -t ${1})" = "function" ]; then PKG_CURRENT_CALL_TYPE="package.mk" return 0 else PKG_CURRENT_CALL_TYPE="default" return 1 fi } # Optional variant of pkg_call_exists() # Clear PKG_CURRENT_CALL when function is not implemented. pkg_call_exists_opt() { if pkg_call_exists $1; then return 0 else pkg_call_finish return 1 fi } # Function to be called is set by pkg_call_exists/pkg_call_exists_opt # Args: whatever the called function expects # testing the exit code value of this function is likely to break set -e fail-on-error behaviour pkg_call() { [ -n "${PKG_CURRENT_CALL}" ] || die "$(print_color CLR_ERROR "PKG_CURRENT_CALL is not set!")" [ -n "${PKG_NAME}" ] || die "$(print_color CLR_ERROR "FAILURE: Cannot call ${PKG_CURRENT_CALL} package function when package is not known!")" ${PKG_CURRENT_CALL} "${@}" pkg_call_finish } pkg_call_finish() { PKG_CURRENT_CALL="" } unset_functions() { local target unset -f configure_package unset -f pre_unpack unpack post_unpack unset -f pre_patch post_patch for target in target host init bootstrap; do unset -f pre_build_${target} unset -f pre_configure_${target} configure_${target} post_configure_${target} unset -f pre_make_${target} make_${target} post_make_${target} unset -f pre_makeinstall_${target} makeinstall_${target} post_makeinstall_${target} done unset -f pre_install post_install unset -f addon post_install_addon } # p1: name of package to be sourced source_package() { local opwd="${PWD}" # Don't use BUILD_WITH_DEBUG in "global" package.mk - instead, call the function # build_with_debug() directly as the function depends on various package.mk # variables that will be in the process of being configured. Once package.mk is # fully sourced we can set this variable and use it in situations where we know the # package has already been sourced. unset BUILD_WITH_DEBUG reset_pkg_vars unset_functions if [ -n "${1}" ]; then [ -f "${1}" ] && PKG_DIR="${1%/*}" || PKG_DIR="$(get_pkg_directory "${1}")" [ -n "$PKG_DIR" -a -r $PKG_DIR/package.mk ] || die "FAILURE: unable to source package - ${1}/package.mk does not exist" cd "${ROOT}" . ${PKG_DIR}/package.mk || die "FAILURE: an error occurred while sourcing ${PKG_DIR}/package.mk" cd "${opwd}" PKG_SHORTDESC="${PKG_SHORTDESC:-${PKG_NAME} (autogenerated)}" PKG_LONGDESC="${PKG_LONGDESC:-${PKG_NAME} (autogenerated)}" if [ "$PKG_IS_ADDON" = "yes" -o "$PKG_IS_ADDON" = "embedded" ] ; then [ -z $PKG_SECTION ] && PKG_ADDON_ID="$PKG_NAME" || PKG_ADDON_ID="${PKG_SECTION//\//.}.$PKG_NAME" [ "$PKG_ADDON_IS_STANDALONE" != "yes" ] && PKG_NEED_UNPACK="${PKG_NEED_UNPACK} $(get_pkg_directory $MEDIACENTER)" fi if [ -n "${PKG_IS_KERNEL_PKG}" -a "${PKG_NAME}" != "linux" ]; then PKG_DEPENDS_TARGET="toolchain linux ${PKG_DEPENDS_TARGET}" PKG_DEPENDS_UNPACK="linux ${PKG_DEPENDS_UNPACK}" PKG_NEED_UNPACK="${LINUX_DEPENDS} ${PKG_NEED_UNPACK}" fi if [ -n "${PKG_DEPENDS_UNPACK}" ]; then for _p in ${PKG_DEPENDS_UNPACK}; do PKG_NEED_UNPACK+=" $(get_pkg_directory ${_p})" done fi # Automatically set PKG_SOURCE_NAME unless it is already defined. # PKG_SOURCE_NAME will be automatically set to a name based on # the $PKG_NAME-$PKG_VERSION convention. # # Any $PKG_URL that references more than a single url will abort # the build as these are no longer supported - use mkpkg instead. if [ -n "$PKG_URL" -a -z "$PKG_SOURCE_NAME" ]; then if [[ $PKG_URL =~ .*\ .* ]]; then echo "Error - packages with multiple urls are no longer supported, use mkpkg." echo "$PKG_URL" die fi if [[ ${PKG_URL} =~ .git$ || ${PKG_URL} =~ ^git:// ]]; then PKG_SOURCE_NAME=${PKG_NAME}-${PKG_VERSION} elif [[ ${PKG_URL} =~ ^file:// ]]; then PKG_SOURCE_NAME=${PKG_URL#file://} # if no specific PKG_TAR_COPY_OPTS then default to excluding .git and .svn as they can be huge [ -z "${PKG_TAR_COPY_OPTS+x}" ] && PKG_TAR_COPY_OPTS="--exclude=.git --exclude=.svn" else PKG_SOURCE_NAME="${PKG_URL##*/}" case $PKG_SOURCE_NAME in ${PKG_NAME}-${PKG_VERSION}.*) PKG_SOURCE_NAME=$PKG_SOURCE_NAME ;; *.tar | *.tbz | *.tgz | *.txz | *.tzst | *.7z | *.zip) PKG_SOURCE_NAME=${PKG_NAME}-${PKG_VERSION}.${PKG_SOURCE_NAME##*\.} ;; *.tar.bz2 | *.tar.gz | *.tar.xz | *.tar.zst ) PKG_SOURCE_NAME=${PKG_NAME}-${PKG_VERSION}.tar.${PKG_SOURCE_NAME##*\.} ;; *.diff | *.patch | *.diff.bz2 | *.patch.bz2 | patch-*.bz2 | *.diff.gz | *.patch.gz | patch-*.gz) PKG_SOURCE_NAME=$PKG_SOURCE_NAME ;; *) PKG_SOURCE_NAME=${PKG_NAME}-${PKG_VERSION}.${PKG_SOURCE_NAME##*\.} ;; esac fi fi PKG_BUILD="$BUILD/build/${PKG_NAME}-${PKG_VERSION}" if [[ "${1}" =~ :target$ || "${1//:/}" = "${1}" ]]; then PKG_INSTALL="$BUILD/install_pkg/${PKG_NAME}-${PKG_VERSION}" elif [[ "${1}" =~ :init$ ]]; then PKG_INSTALL="$BUILD/install_init/${PKG_NAME}-${PKG_VERSION}" fi PKG_QA_CHECKS="${BUILD}/qa_checks/${PKG_NAME}-${PKG_VERSION}" fi build_with_debug && BUILD_WITH_DEBUG="yes" || BUILD_WITH_DEBUG="no" # Late variable binding - allow the package to now evaluate any variables # that we may have initialised after sourcing the package, typically # PKG_BUILD etc. if [ -n "${PKG_NAME}" ]; then if pkg_call_exists_opt configure_package; then pkg_call fi fi } # arg1: file, or directory to recursively compile. python_compile() { local path="${1:-${INSTALL}/usr/lib/${PKG_PYTHON_VERSION}}" ${TOOLCHAIN}/bin/python3 -Wi -t -B ${TOOLCHAIN}/lib/${PKG_PYTHON_VERSION}/compileall.py -f -d "${path#${INSTALL}}" "${path}" python_remove_source "${path}" } # arg1: file, or directory from which to recursively remove all py source code python_remove_source() { local path="${1:-${INSTALL}/usr/lib/${PKG_PYTHON_VERSION}}" if [ -d "${path}" ]; then find "${path}" -type f -name '*.py' -delete else rm -f "${path}" fi } # arg1: directory to process recursively # strip incorrect build-host ABI from native Python3 modules (see PEP3149) python_fix_abi() { local pymodule pyname for pymodule in $(find ${1} -type f -name '*.cpython-*.so' 2>/dev/null); do pyname=${pymodule##*/} pyname=${pyname%.so} # strip extension pyname=${pyname%.*} # strip incorrect ABI echo "python_fix_abi: Removing ABI from ${pymodule} -> ${pyname}.so" mv ${pymodule} ${pymodule%/*}/${pyname}.so done } ### KERNEL HELPERS ### kernel_path() { get_build_dir linux } kernel_version() { get_pkg_version linux } kernel_config_path() { local cfg pkg_linux_dir pkg_linux_version config_name pkg_linux_version="$(get_pkg_version linux)" pkg_linux_dir="$(get_pkg_directory linux)" config_name="linux.${TARGET_KERNEL_PATCH_ARCH:-$TARGET_ARCH}.conf" for cfg in $PROJECT_DIR/$PROJECT/devices/$DEVICE/linux/$pkg_linux_version/$config_name \ $PROJECT_DIR/$PROJECT/devices/$DEVICE/linux/$LINUX/$config_name \ $PROJECT_DIR/$PROJECT/devices/$DEVICE/linux/$config_name \ $PROJECT_DIR/$PROJECT/linux/$pkg_linux_version/$config_name \ $PROJECT_DIR/$PROJECT/linux/$LINUX/$config_name \ $PROJECT_DIR/$PROJECT/linux/$config_name \ $pkg_linux_dir/config/$pkg_linux_version/$config_name \ $pkg_linux_dir/config/$LINUX/$config_name \ $pkg_linux_dir/config/$config_name \ ; do [[ $cfg =~ /devices//linux/ ]] && continue [ -f "$cfg" ] && echo "$cfg" && return done die "ERROR: Unable to locate kernel config for ${LINUX} - looking for ${config_name}" } kernel_initramfs_confs() { local config_name cfg confs config_name="initramfs.${TARGET_KERNEL_PATCH_ARCH:-$TARGET_ARCH}.conf" confs="$(get_pkg_directory initramfs)/config/initramfs.conf" for cfg in $PROJECT_DIR/$PROJECT/packages/initramfs/config/$config_name \ $PROJECT_DIR/$PROJECT/devices/$DEVICE/packages/initramfs/config/$config_name \ ; do [[ $cfg =~ /devices//packages/ ]] && continue [ -f "$cfg" ] && confs+=" $cfg" done echo "$confs" } kernel_make() { ( setup_pkg_config_host LDFLAGS="" make CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ ARCH="$TARGET_KERNEL_ARCH" \ HOSTCC="$TOOLCHAIN/bin/host-gcc" \ HOSTCXX="$TOOLCHAIN/bin/host-g++" \ HOSTCFLAGS="$HOST_CFLAGS" \ HOSTLDFLAGS="$HOST_LDFLAGS" \ HOSTCXXFLAGS="$HOST_CXXFLAGS" \ DEPMOD="$TOOLCHAIN/bin/depmod" \ "$@" ) } # get kernel module dir get_module_dir() { if [ -n "${_CACHED_KERNEL_MODULE_DIR}" ]; then echo "${_CACHED_KERNEL_MODULE_DIR}" else basename $(ls -d $(get_install_dir linux)/usr/lib/kernel-overlays/base/lib/modules/*) fi } # get base path to kernel modules and firmware get_kernel_overlay_dir() { echo "usr/lib/kernel-overlays/${1:-base}" } # get full path to kernel module dir # optional parameter specifies overlay level (default is base) get_full_module_dir() { echo "$(get_kernel_overlay_dir $1)/lib/modules/$(get_module_dir)" } # get full path to firmware dir # optional parameter specifies overlay level (default is base) get_full_firmware_dir() { echo "$(get_kernel_overlay_dir $1)/lib/firmware" } ### ADDON HELPERS ### install_binary_addon() { local addon_id="$1" addon_so mkdir -p $ADDON_BUILD/$addon_id/ cp -R $PKG_INSTALL/usr/share/$MEDIACENTER/addons/$addon_id/* $ADDON_BUILD/$addon_id/ addon_so=$(xmlstarlet sel -t -v "/addon/extension/@library_linux" $ADDON_BUILD/$addon_id/addon.xml || :) if [ -n "$addon_so" ]; then cp -L $PKG_INSTALL/usr/lib/$MEDIACENTER/addons/$addon_id/$addon_so $ADDON_BUILD/$addon_id/ chmod +x $ADDON_BUILD/$addon_id/$addon_so fi if [ -d $PKG_INSTALL/usr/lib/kernel-overlays/$addon_id ] ; then mkdir -p $ADDON_BUILD/$addon_id/kernel-overlay cp -PR $PKG_INSTALL/usr/lib/kernel-overlays/$addon_id/* $ADDON_BUILD/$addon_id/kernel-overlay fi } install_addon_source() { if [ -d $PKG_DIR/source ]; then cp -R $PKG_DIR/source/* "$1" fi } install_addon_images() { local dest_dir="$1" if [ -f "$PKG_DIR/icon/icon.png" ]; then mkdir -p "$dest_dir/resources" cp "$PKG_DIR/icon/icon.png" "$dest_dir/resources" fi if [ -f "$DISTRO_DIR/$DISTRO/addons/fanart.png" ]; then mkdir -p "$dest_dir/resources" cp "$DISTRO_DIR/$DISTRO/addons/fanart.png" "$dest_dir/resources" fi } create_addon_xml() { local addon_xml addon_version addon_name provider_name requires requires_addonname requires_addonversion screenshots local tmp_changelog addon_xml="$1/addon.xml" IFS=" " for i in $PKG_ADDON_REQUIRES; do requires_addonname=`echo $i | cut -f1 -d ":"` requires_addonversion=`echo $i | cut -f2 -d ":"` requires="$requires\n " done unset IFS if [ ! -f "$addon_xml" ] ; then cp $ROOT/config/addon/${PKG_ADDON_TYPE}.xml "$addon_xml" addon_version=${PKG_ADDON_VERSION:-${ADDON_VERSION}.${PKG_REV}} else if ! command -v xmlstarlet >/dev/null ; then die "*** ERROR: $ADDON has addon.xml shipped, you need 'xmlstarlet' ***" "255" fi addon_version="${PKG_ADDON_VERSION:-$(xmlstarlet sel -t -v "/addon/@version" "$addon_xml").$PKG_REV}" xmlstarlet ed --inplace -u "/addon[@version]/@version" -v "$addon_version" "$addon_xml" fi if [ -f $PKG_DIR/changelog.txt ]; then tmp_changelog="$(mktemp)" cat ${PKG_DIR}/changelog.txt | xmlstarlet esc >"${tmp_changelog}" sed -e "/@PKG_ADDON_NEWS@/ \ { r ${tmp_changelog} d }" -i "$addon_xml" rm -f "${tmp_changelog}" else sed -e "s|@PKG_ADDON_NEWS@||g" -i "$addon_xml" fi provider_name=${PKG_MAINTAINER:-"Team ${DISTRONAME}"} addon_name=${PKG_ADDON_NAME:-"$PKG_NAME"} for f in $PKG_DIR/source/resources/screenshot-*.{jpg,png}; do if [ -f "$f" ]; then screenshots+="resources/${f##*/}\n" fi done sed -e "s|@PKG_ADDON_ID@|$PKG_ADDON_ID|g" \ -e "s|@ADDON_NAME@|$addon_name|g" \ -e "s|@ADDON_VERSION@|$addon_version|g" \ -e "s|@REQUIRES@|$requires|g" \ -e "s|@PKG_SHORTDESC@|$PKG_SHORTDESC|g" \ -e "s|@OS_VERSION@|$OS_VERSION|g" \ -e "s|@PKG_LONGDESC@|$PKG_LONGDESC|g" \ -e "s|@PKG_DISCLAIMER@|$PKG_DISCLAIMER|g" \ -e "s|@PROVIDER_NAME@|$provider_name|g" \ -e "s|@PKG_ADDON_PROVIDES@|$PKG_ADDON_PROVIDES|g" \ -e "s|@PKG_ADDON_SCREENSHOT@|$screenshots|g" \ -e "s|@PKG_ADDON_BROKEN@|$PKG_ADDON_BROKEN|g" \ -i "$addon_xml" } install_addon_files() { mkdir -p "$1" install_addon_source "$1" install_addon_images "$1" create_addon_xml "$1" python_fix_abi "$1" if pkg_call_exists_opt post_install_addon; then INSTALL="$1" pkg_call fi } install_driver_addon_files() { if [ "$#" -eq 0 ] ; then die "$(print_color CLR_ERROR "no module search path defined")" fi PKG_MODULE_DIR="$INSTALL/$(get_full_module_dir $PKG_ADDON_ID)/updates/$PKG_ADDON_ID" PKG_ADDON_DIR="$INSTALL/usr/share/$MEDIACENTER/addons/$PKG_ADDON_ID" mkdir -p $PKG_MODULE_DIR find $@ -name \*.ko -exec cp {} $PKG_MODULE_DIR \; find $PKG_MODULE_DIR -name \*.ko -exec ${TARGET_KERNEL_PREFIX}strip --strip-debug {} \; mkdir -p $PKG_ADDON_DIR cp $PKG_DIR/changelog.txt $PKG_ADDON_DIR install_addon_files "$PKG_ADDON_DIR" } ### TARGET CONFIGURATION HELPERS ### add_user() { # Usage: add_user "username" "password" "userid" "groupid" "description" "home" "shell" mkdir -p ${INSTALL}/etc touch ${INSTALL}/etc/passwd if ! grep -q "^$1:" ${INSTALL}/etc/passwd; then echo "$1:x:$3:$4:$5:$6:$7" >> ${INSTALL}/etc/passwd fi mkdir -p ${INSTALL}/usr/cache touch ${INSTALL}/usr/cache/shadow ln -sf /storage/.cache/shadow ${INSTALL}/etc/shadow 2>/dev/null || true PASSWORD="$2" if [ "$PASSWORD" = "x" ]; then PASSWORD="*" else PASSWORD=$(openssl passwd -6 "${PASSWORD}") fi if ! grep -q "^$1:" ${INSTALL}/usr/cache/shadow; then echo "$1:$PASSWORD:::::::" >> ${INSTALL}/usr/cache/shadow fi } add_group() { # Usage: add_group "groupname" "groupid" ("members") mkdir -p ${INSTALL}/etc touch ${INSTALL}/etc/group if [ -z "`grep "$1:" ${INSTALL}/etc/group`" ]; then echo "$1:x:$2:$3" >> ${INSTALL}/etc/group fi } # Usage: enable_service [target] enable_service() { local unit="$1" local unit_dir="usr/lib/systemd/system" local target="$2" local target_dir=$INSTALL [ -f "$target_dir/$unit_dir/$unit" ] || die "ERROR: cannot enable non-existent service $target_dir/$unit_dir/$unit" if [ -z "$target" ] ; then for target in `grep '^WantedBy' $target_dir/$unit_dir/$unit | cut -f2 -d=` ; do if [ -n "$target" ]; then mkdir -p ${target_dir}/$unit_dir/${target}.wants ln -sf ../${unit} ${target_dir}/$unit_dir/${target}.wants/ fi done fi for target in `grep '^Alias' $target_dir/$unit_dir/$unit | cut -f2 -d=` ; do if [ -n "$target" ]; then ln -sf ${unit} ${target_dir}/$unit_dir/${target} fi done } ### MULTI-THREADED FUNCTION HELPERS ### # flocks: 94 (pkg_lock_status) # 95 (scripts/pkgbuild) # 96 (acquire_exclusive_lock) # 97 (acquire_update_lock) # 98 (pkg_lock) # 99 (scripts/get) # Test build type so that these functions are a no-op during non-multithreaded builds. # Prevent concurrent modifications to a package during certain activities. # With dynamic scheduling we now only need to acquire the lock # during unpack and reconf, all other activities do not need to acquire a # lock as there should be no concurrent access however the existing code path # potentially generates useful logging for minimal cost so keep it. # # If a package is already locked and the owner is ourselves # then assume we already have the required lock. pkg_lock() { is_sequential_build && return 0 local pkg="$1" task="$2" parent_pkg="$3" local this_job="${MTJOBID}" local lock_job lock_seq lock_task lock_pkg locked=no idwidth if [ "${task}" = "unpack" -o "${task}" = "reconf" ]; then exec 98>"${THREAD_CONTROL}/locks/${pkg}.${task}" while [ : ]; do read -r lock_job lock_seq lock_task lock_pkg <<<$(cat "${THREAD_CONTROL}/locks/${pkg}.${task}.owner" 2>/dev/null) [ -n "${lock_job}" ] && break flock --wait 1 --exclusive 98 && locked=yes && break done if [ "${locked}" = "no" -a "${lock_job}/${lock_seq}" != "${this_job}/${PARALLEL_SEQ}" ]; then [ "${THREADCOUNT}" = "0" ] && idwidth=${#MTMAXJOBS} || idwidth=2 pkg_lock_status "STALLED" "${parent_pkg}" "${task}" "$(printf "waiting on [%0*d] %s %s" ${idwidth} ${lock_job} "${lock_task}" "${lock_pkg}")" flock --exclusive 98 fi fi pkg_lock_status "LOCKED" "${pkg}" "${task}" } # Log additional information for a locked package. pkg_lock_status() { is_sequential_build && return 0 local status="$1" pkg="$2" task="$3" msg="$4" local this_job="${MTJOBID}" line idwidth [ "${THREADCOUNT}" = "0" ] && idwidth=${#MTMAXJOBS} || idwidth=2 ( flock --exclusive 94 # Write the configured number of slots to history to improve accuracy of later analysis if [ ! -f "${THREAD_CONTROL}/history" ]; then printf "%s: <%06d> [%0*d/%0*d] %-7s %-7s %s %s\n" \ "$(date +%Y-%m-%d\ %H:%M:%S.%N)" $$ ${idwidth} 0 ${#MTMAXJOBS} 0 "IDLE" "config" "info" "slots=${MTMAXSLOT};jobs=${MTMAXJOBS}" >>"${THREAD_CONTROL}/history" fi printf -v line "%s: <%06d> [%0*d/%0*d] %-7s %-7s %-35s" \ "$(date +%Y-%m-%d\ %H:%M:%S.%N)" $$ ${idwidth} ${this_job} ${#MTMAXJOBS} ${PARALLEL_SEQ:-0} "${status}" "${task}" "${pkg}" [ -n "${msg}" ] && line+=" (${msg})" echo "${line}" >>"${THREAD_CONTROL}/history" if [ "${DASHBOARD}" != "no" ]; then update_dashboard "${status}" "${pkg}" "${task}" "${msg}" fi ) 94>"${THREAD_CONTROL}/locks/.history" if [ "${status}" = "LOCKED" ]; then echo "${this_job} ${PARALLEL_SEQ} ${task} ${pkg}" >"${THREAD_CONTROL}/locks/${pkg}.${task}.owner" elif [ "${status}" = "UNLOCK" ]; then rm "${THREAD_CONTROL}/locks/${pkg}.${task}.owner" fi return 0 } update_dashboard() { is_sequential_build && return 0 local status="$1" pkg="$2" task="$3" msg="$4" local line preamble num elapsed projdevarch local boldred boldgreen boldyellow endcolor idwidth [ "${THREADCOUNT}" = "0" ] && idwidth=${#MTMAXSLOT} || idwidth=2 if [ ! -s ${THREAD_CONTROL}/status ]; then echo "" >"${THREAD_CONTROL}/status" echo "" >>"${THREAD_CONTROL}/status" for i in $(seq 1 $((MTMAXSLOT))); do printf "[%0*d/%0*d] %-7s\n" ${idwidth} ${i} ${#MTMAXJOBS} 0 "IDLE" >>"${THREAD_CONTROL}/status" done fi num=$(< "${THREAD_CONTROL}/progress.prev") projdevarch="${PROJECT}/" [ -n "${DEVICE}" ] && projdevarch+="${DEVICE}/" projdevarch+="${TARGET_ARCH}" [ -n "${BUILD_SUFFIX}" ] && projdevarch+=", ${BUILD_SUFFIX}" TZ=UTC0 printf -v elapsed "%(%H:%M:%S)T" $(($(date +%s) - MTBUILDSTART)) printf -v preamble "%s Dashboard (%s) - %d of %d jobs completed, %s elapsed" "${DISTRONAME}" "${projdevarch}" $((num + 1)) ${MTMAXJOBS} "${elapsed}" printf -v preamble "%b%-105s %s" "\e[2J\e[0;0H" "${preamble}" "$(date "+%Y-%m-%d %H:%M:%S")" if [ "${DISABLE_COLORS}" != "yes" ]; then boldred="\e[1;31m" boldgreen="\e[1;32m" boldyellow="\e[1;33m" white="\e[0;37m" endcolor="\e[0m" case "${status}" in IDLE) color="${white}";; STALLED) color="${boldyellow}";; MUTEX/W) color="${boldyellow}";; FAILED ) color="${boldred}";; *) color="${boldgreen}";; esac fi printf -v line "[%0*d/%0*d] %b%-7s%b %-7s %-35s" ${idwidth} ${MTJOBID} ${#MTMAXJOBS} ${PARALLEL_SEQ:-0} "${color}" "${status}" "${endcolor}" "${task}" "${pkg}" [ -n "${msg}" ] && line+=" ${msg}" sed -e "1s@.*@${preamble}@;$((MTJOBID + 2))s@.*@${line}@" -i "${THREAD_CONTROL}/status" } # Thread concurrency helpers to avoid concurrency issues with some code, # eg. when Python installs directly into $TOOLCHAIN. acquire_exclusive_lock() { is_sequential_build && return 0 local pkg="$1" task="$2" lockfile="${3:-global}" local this_job="${MTJOBID}" local lock_job lock_seq lock_task lock_pkg locked=no idwidth exec 96>"${THREAD_CONTROL}/locks/.mutex.${lockfile}" while [ : ]; do read -r lock_job lock_seq lock_task lock_pkg <<<$(cat "${THREAD_CONTROL}/locks/.mutex.${lockfile}.owner" 2>/dev/null) [ -n "${lock_job}" ] && break flock --wait 1 --exclusive 96 && locked=yes && break done if [ "${locked}" = "no" -a "${lock_job}/${lock_seq}" != "${this_job}/${PARALLEL_SEQ}" ]; then [ "${THREADCOUNT}" = "0" ] && idwidth=${#MTMAXJOBS} || idwidth=2 pkg_lock_status "MUTEX/W" "${pkg}" "${task}" "$(printf "mutex: %s; waiting on [%0*d] %s %s" "${lockfile}" ${idwidth} ${lock_job} "${lock_task}" "${lock_pkg}")" flock --exclusive 96 fi pkg_lock_status "MUTEX" "${pkg}" "${task}" "mutex: ${lockfile}" echo "${this_job} ${PARALLEL_SEQ} ${task} ${pkg}" >"${THREAD_CONTROL}/locks/.mutex.${lockfile}.owner" } release_exclusive_lock() { is_sequential_build && return 0 local pkg="$1" task="$2" lockfile="${3:-global}" pkg_lock_status "ACTIVE" "${pkg}" "${task}" rm "${THREAD_CONTROL}/locks/.mutex.${lockfile}.owner" flock --unlock 96 2>/dev/null } # Execute single command using mutex exec_thread_safe() { local result acquire_exclusive_lock "${PKG_NAME:exec}" "execcmd" $@ result=$? release_exclusive_lock "${PKG_NAME:exec}" "execcmd" return ${result} } # A lightweight target specific lock (eg. image, sysroot) acquire_update_lock() { is_sequential_build && return 0 exec 97>"${THREAD_CONTROL}/locks/.update.${1}" flock --exclusive 97 } release_update_lock() { is_sequential_build && return 0 flock --unlock 97 2>/dev/null } # Multilib support use_32_options() { LIB64_TARGET_NAME="${TARGET_NAME}" TARGET_NAME="${LIB32_TARGET_NAME}" TARGET_ARCH="arm" TARGET_SUBARCH="${LIB32_TARGET_SUBARCH}" LIB64_TARGET_PREFIX="${TARGET_PREFIX}" TARGET_PREFIX="${LIB32_TARGET_PREFIX}" TARGET_CFLAGS="${LIB32_TARGET_CFLAGS}" TARGET_CXXFLAGS="${LIB32_TARGET_CXXFLAGS}" TARGET_LDFLAGS="${LIB32_TARGET_LDFLAGS}" SYSROOT_PREFIX="${LIB32_SYSROOT_PREFIX}" } # store current timestamp in TIMESTAMP_xxx variable (xxx set by arg) # timestamps are seconds.milliseconds since epoch record_timestamp() { if [ -n "${TRACE_BUILD_TIMING}" ]; then typeset -g "TIMESTAMP_$1=$(date +%s.%3N)" fi } # args: text, start timestamp, end timestamp show_timestamp_diff() { if [ -n "${TRACE_BUILD_TIMING}" ]; then local start="TIMESTAMP_$2" local end="TIMESTAMP_$3" local timediff=$(echo "${!end}-${!start}" | bc) printf '%20s: %10.3f\n' "$1" "${timediff}" fi } # Use distribution functions if any if [ -f "distributions/$DISTRO/config/functions" ]; then . distributions/$DISTRO/config/functions fi ================================================ FILE: config/graphic ================================================ [ -z "${OPENGL}" ] && OPENGL="no" [ -z "${OPENGLES}" ] && OPENGLES="no" [ -z "${VULKAN}" ] && VULKAN="no" if [ "${OPENGL}" = "no" ]; then OPENGL_SUPPORT="no" else OPENGL_SUPPORT="yes" fi if [ "${OPENGLES}" = "no" ]; then OPENGLES_SUPPORT="no" else OPENGLES_SUPPORT="yes" fi if [ "${VULKAN}" = "no" ]; then VULKAN_SUPPORT="no" else VULKAN_SUPPORT="yes" fi get_graphicdrivers() { # set defaults GALLIUM_DRIVERS="" XORG_DRIVERS="" VULKAN_DRIVERS_CONFIG="" VULKAN_DRIVERS_MESA="" LLVM_SUPPORT="no" COMPOSITE_SUPPORT="no" VDPAU_SUPPORT="no" VAAPI_SUPPORT="no" V4L2_SUPPORT="no" if [ "${GRAPHIC_DRIVERS}" = "all" ]; then GRAPHIC_DRIVERS="crocus i915 iris r300 r600 radeonsi nvidia nvidia-legacy nvidia-ng vmware virtio vc4" fi if listcontains "${GRAPHIC_DRIVERS}" "crocus"; then GALLIUM_DRIVERS+=" crocus" XORG_DRIVERS+=" intel" COMPOSITE_SUPPORT="yes" VAAPI_SUPPORT="yes" fi if listcontains "${GRAPHIC_DRIVERS}" "etnaviv"; then GALLIUM_DRIVERS+=" etnaviv kmsro" V4L2_SUPPORT="yes" VAAPI_SUPPORT="no" VDPAU_SUPPORT="no" fi if listcontains "${GRAPHIC_DRIVERS}" "freedreno"; then GALLIUM_DRIVERS+=" freedreno" V4L2_SUPPORT="yes" VAAPI_SUPPORT="no" VDPAU_SUPPORT="no" fi if listcontains "${GRAPHIC_DRIVERS}" "i915"; then GALLIUM_DRIVERS+=" i915" XORG_DRIVERS+=" intel" COMPOSITE_SUPPORT="yes" VAAPI_SUPPORT="yes" fi if listcontains "${GRAPHIC_DRIVERS}" "iris"; then GALLIUM_DRIVERS+=" iris" XORG_DRIVERS+=" intel" VULKAN_DRIVERS_MESA+=" intel" COMPOSITE_SUPPORT="yes" VAAPI_SUPPORT="yes" fi if listcontains "${GRAPHIC_DRIVERS}" "lima"; then GALLIUM_DRIVERS+=" kmsro lima" V4L2_SUPPORT="yes" fi if listcontains "${GRAPHIC_DRIVERS}" "mali"; then V4L2_SUPPORT="yes" fi if listcontains "${GRAPHIC_DRIVERS}" "nvidia"; then XORG_DRIVERS+=" nvidia" VULKAN_DRIVERS_CONFIG+=" nvidia" VDPAU_SUPPORT="yes" fi if listcontains "${GRAPHIC_DRIVERS}" "nvidia-legacy"; then XORG_DRIVERS+=" nvidia-legacy" VDPAU_SUPPORT="yes" fi if listcontains "${GRAPHIC_DRIVERS}" "nvidia-ng"; then VULKAN_DRIVERS_CONFIG+=" nvidia-ng" VAAPI_SUPPORT="yes" fi if listcontains "${GRAPHIC_DRIVERS}" "panfrost"; then GALLIUM_DRIVERS+=" kmsro panfrost" VULKAN_DRIVERS_MESA+=" panfrost" V4L2_SUPPORT="yes" fi if listcontains "${GRAPHIC_DRIVERS}" "r300"; then GALLIUM_DRIVERS+=" r300" XORG_DRIVERS+=" ati" LLVM_SUPPORT="yes" COMPOSITE_SUPPORT="yes" VDPAU_SUPPORT="yes" fi if listcontains "${GRAPHIC_DRIVERS}" "r600"; then GALLIUM_DRIVERS+=" r600" XORG_DRIVERS+=" ati" LLVM_SUPPORT="yes" COMPOSITE_SUPPORT="yes" VDPAU_SUPPORT="yes" VAAPI_SUPPORT="yes" fi if listcontains "${GRAPHIC_DRIVERS}" "radeonsi"; then GALLIUM_DRIVERS+=" radeonsi" XORG_DRIVERS+=" ati amdgpu" VULKAN_DRIVERS_MESA+=" amd" LLVM_SUPPORT="yes" COMPOSITE_SUPPORT="yes" VDPAU_SUPPORT="yes" VAAPI_SUPPORT="yes" fi if listcontains "${GRAPHIC_DRIVERS}" "vc4"; then GALLIUM_DRIVERS+=" vc4 v3d kmsro" VULKAN_DRIVERS_MESA+=" broadcom" V4L2_SUPPORT="yes" VAAPI_SUPPORT="no" VDPAU_SUPPORT="no" fi if listcontains "${GRAPHIC_DRIVERS}" "virtio"; then GALLIUM_DRIVERS+=" virgl" fi if listcontains "${GRAPHIC_DRIVERS}" "vmware"; then GALLIUM_DRIVERS+=" svga" XORG_DRIVERS+=" vmware" COMPOSITE_SUPPORT="yes" fi # VDPAU Support depends on X11 if [ ! "${DISPLAYSERVER}" = "x11" ]; then VDPAU_SUPPORT="no" fi # remove duplicate entries GALLIUM_DRIVERS="$(echo ${GALLIUM_DRIVERS} | xargs -n1 | sort -u | xargs)" GRAPHIC_DRIVERS="$(echo ${GRAPHIC_DRIVERS} | xargs -n1 | sort -u | xargs)" XORG_DRIVERS="$(echo ${XORG_DRIVERS} | xargs -n1 | sort -u | xargs)" VULKAN_DRIVERS_MESA="$(echo ${VULKAN_DRIVERS_MESA} | xargs -n1 | sort -u | xargs)" VULKAN_DRIVERS_CONFIG+=" ${VULKAN_DRIVERS_MESA}" VULKAN_DRIVERS_CONFIG="$(echo ${VULKAN_DRIVERS_CONFIG} | xargs -n1 | sort -u | xargs)" } ================================================ FILE: config/multithread ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) THREADCOUNT=${THREADCOUNT:-$(nproc)} start_multithread_build() { local buildopts result=0 # init thread control folder rm -rf "${THREAD_CONTROL}" mkdir -p "${THREAD_CONTROL}/locks" echo -1 >"${THREAD_CONTROL}/progress.prev" echo 0 >"${THREAD_CONTROL}/progress" touch "${THREAD_CONTROL}/status" # Increase file descriptors if building one thread/package [ "${THREADCOUNT}" = "0" ] && ulimit -n ${ULIMITN:-10240} # create a single log file by default for a single threaded build (or the builder is a masochist) if [ ${THREADCOUNT} -eq 1 -a "${ONELOG,,}" != "no" ] || [ "${ONELOG,,}" = "yes" ]; then buildopts+=" --no-log-burst" else mkdir -p "${THREAD_CONTROL}/logs" buildopts+=" --log-burst" fi buildopts+=" --log-combine ${LOGCOMBINE:-always}" [ "${AUTOREMOVE}" = "yes" ] && buildopts+=" --auto-remove" # When building addons, don't halt on error - keep building all packages/addons [ "${MTADDONBUILD}" = "yes" ] && buildopts+=" --continue-on-error" || buildopts+=" --halt-on-error" [ "${MTPROGRESS}" = "yes" ] && buildopts+=" --progress" [ "${MTVERBOSE}" = "yes" ] && buildopts+=" --verbose" [ "${MTDEBUG}" = "yes" ] && buildopts+=" --debug" if [ "${DISABLE_COLORS}" = "yes" ]; then buildopts+=" --colors=never" else buildopts+=" --colors=${MTCOLORS:-auto}" fi [ "${MTBOOKENDS}" = "no" ] && buildopts+=" --without-bookends" || buildopts+=" --with-bookends" [ "${MTIMMEDIATE}" = "no" ] && buildopts+=" --fail-after-active" || buildopts+=" --fail-immediately" buildopts+=" --stats-interval ${MTINTERVAL:-60}" # pipefail: return value of a pipeline is the value of the last (rightmost) command to exit with a non-zero status set -o pipefail ${SCRIPTS}/pkgjson | ${SCRIPTS}/genbuildplan.py --show-wants --with-json "${THREAD_CONTROL}"/plan.json \ --build ${@} > "${THREAD_CONTROL}"/plan || result=1 if [ ${result} -eq 0 ]; then save_build_config # export the following vars so that they will be available to subprocesses of pkgbuilder.py export ROOT SCRIPTS THREAD_CONTROL MTBUILDSTART=$(date +%s) MTWITHLOCKS=yes ${SCRIPTS}/pkgbuilder.py \ --plan "${THREAD_CONTROL}"/plan.json \ --joblog "${THREAD_CONTROL}"/joblog \ --loadstats "${THREAD_CONTROL}"/loadstats \ --max-procs ${THREADCOUNT} ${buildopts} || result=1 [ ${result} -eq 0 -a -f "${THREAD_CONTROL}"/history ] && echo && cat "${THREAD_CONTROL}"/history | ${ROOT}/tools/mtstats.py rm -f "${THREAD_CONTROL}/parallel.pid" fi set +o pipefail return ${result} } ================================================ FILE: config/noobs/os.json ================================================ { "name": "@DISTRONAME@_@PROJECT@", "version": "@LIBREELEC_VERSION@", "release_date": "@RELEASE_DATE@", "kernel": "@KERNEL_VERSION@", "description": "@DESCRIPTION@", "username": "root", "password": "@ROOT_PASSWORD@", "supported_hex_revisions": "@NOOBS_HEX@", "supported_models": [@NOOBS_SUPPORTED_MODELS@] } ================================================ FILE: config/noobs/partition_setup.sh ================================================ #!/bin/sh -x # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) MOUNTPOINT="/tmp/LibreELEC-System" md5sumCheck() { ( cd $MOUNTPOINT echo "checking MD5: $1" md5sum -c $1.md5 if [ "$?" = "1" ]; then echo "#######################################################" echo "# #" echo "# LibreELEC failed md5 check - Installation will quit #" echo "# #" echo "# Your original download was probably corrupt. #" echo "# Please visit libreelec.tv and get another copy #" echo "# #" echo "#######################################################" exit 1 fi rm -rf $1.md5 ) } if [ -z $part1 -o -z $part2 -o -z $id1 -o -z $id2 ]; then echo "error: part1, part2, id1 or id2 not specified" echo "actual values:" echo "part1:" $part1 echo "part2:" $part2 echo "id1 :" $id1 echo "id2 :" $id2 exit 1 fi # create mountpoint mkdir -p $MOUNTPOINT # mount needed partition mount $part1 $MOUNTPOINT # check md5sum md5sumCheck kernel.img md5sumCheck SYSTEM # create bootloader configuration echo "creating bootloader configuration..." echo "boot=$id1 disk=$id2 quiet @EXTRA_CMDLINE@" > $MOUNTPOINT/cmdline.txt # cleanup mountpoint umount $MOUNTPOINT rmdir $MOUNTPOINT ================================================ FILE: config/noobs/partitions.json ================================================ { "partitions": [ { "label": "System", "filesystem_type": "FAT", "partition_size_nominal": @SYSTEM_SIZE@, "want_maximised": false, "uncompressed_tarball_size": 120, "mkfs_options": "" }, { "label": "Storage", "filesystem_type": "ext4", "partition_size_nominal": 512, "want_maximised": true, "uncompressed_tarball_size": 10, "mkfs_options": "" } ] } ================================================ FILE: config/optimize ================================================ # Linker hash-style is set to gnu via gcc default LD_OPTIM="-Wl,--as-needed" TARGET_CPPFLAGS="" TARGET_CFLAGS="$TARGET_CFLAGS -Wall -pipe $PROJECT_CFLAGS" TARGET_CXXFLAGS="$TARGET_CFLAGS" TARGET_LDFLAGS="$TARGET_LDFLAGS $LD_OPTIM" TARGET_LIBDIR="$SYSROOT_PREFIX/lib $SYSROOT_PREFIX/usr/lib" TARGET_INCDIR="$SYSROOT_PREFIX/include $SYSROOT_PREFIX/usr/include" HOST_CPPFLAGS="" HOST_CFLAGS="-march=native -O2 -Wall -pipe -I$TOOLCHAIN/include" HOST_CXXFLAGS="$HOST_CFLAGS" HOST_LDFLAGS="-Wl,-rpath,$TOOLCHAIN/lib -L$TOOLCHAIN/lib" HOST_INCDIR="$TOOLCHAIN/include /usr/include" # work around Ubuntu default C*FLAGS # see https://wiki.ubuntu.com/ToolChain/CompilerFlags#A-Wformat_-Wformat-security HOST_CFLAGS="$HOST_CFLAGS -Wno-format-security" HOST_CXXFLAGS="$HOST_CXXFLAGS -Wno-format-security" # lto flags FLAGS_OPTIM_LTO_NO_PARALLEL="-flto" FLAGS_OPTIM_LTO_PARALLEL="-flto=${CONCURRENCY_MAKE_LEVEL}" FLAGS_OPTIM_LTO_NO_FAT="-fno-fat-lto-objects" FLAGS_OPTIM_LTO_FAT="-ffat-lto-objects" FLAGS_OPTIM_LTO_OFF="-fno-lto" LDFLAGS_OPTIM_LTO_COMMON="-fuse-linker-plugin" # linker specific flags LDFLAGS_OPTIM_LINKER_COMPILER_DEFAULT="" LDFLAGS_OPTIM_LINKER_BFD="-fuse-ld=bfd" LDFLAGS_OPTIM_LINKER_GOLD="-fuse-ld=gold" LDFLAGS_OPTIM_LINKER_MOLD="-fuse-ld=mold" # default compiler optimization CFLAGS_OPTIM_DEFAULT="-O2 -fomit-frame-pointer -DNDEBUG" CXXFLAGS_OPTIM_DEFAULT="$CFLAGS_OPTIM_DEFAULT" # speed flag CFLAGS_OPTIM_SPEED="-O3 -fomit-frame-pointer -DNDEBUG" CXXFLAGS_OPTIM_SPEED="$CFLAGS_OPTIM_SPEED" # size flag CFLAGS_OPTIM_SIZE="-Os -fomit-frame-pointer -DNDEBUG" CXXFLAGS_OPTIM_SIZE="$CFLAGS_OPTIM_SIZE" # debug settings CFLAGS_OPTIM_DEBUG="-ggdb -Og" CXXFLAGS_OPTIM_DEBUG="$CFLAGS_OPTIM_DEBUG" LDFLAGS_OPTIM_DEBUG="-ggdb" # split debug settings (requires gold) CFLAGS_OPTIM_DEBUG_SPLIT="-gdwarf-4 -gsplit-dwarf -Og" CXXFLAGS_OPTIM_DEBUG_SPLIT="$CFLAGS_OPTIM_DEBUG_SPLIT" LDFLAGS_OPTIM_DEBUG_SPLIT="-gdwarf-4 -Wl,--gdb-index" # position-independent code CFLAGS_OPTIM_PIC="-fPIC -DPIC" CXXFLAGS_OPTIM_PIC="-fPIC -DPIC" LDFLAGS_OPTIM_PIC="-fPIC" # hardening support # TODO: basiclly copied from debian 9, should adjust for LE CFLAGS_OPTIM_HARDENING="-fstack-protector-strong -Wformat -Werror=format-security -fPIE" CXXFLAGS_OPTIM_HARDENING="-fstack-protector-strong -Wformat -Werror=format-security -fPIE" CPPFLAGS_OPTIM_HARDENING="-D_FORTIFY_SOURCE=2" LDFLAGS_OPTIM_HARDENING="-Wl,-z,relro -Wl,-z,now" # add distro specific library dirs if [ -z "$HOST_LIBDIR" ]; then HOST_LIBDIR="$TOOLCHAIN/lib" # ubuntu/debian specific "multiarch support" export MACHINE_HARDWARE_NAME="$(uname -m)" FAMILY_TRIPLET=$($LOCAL_CC -print-multiarch) if [ -n "$FAMILY_TRIPLET" ]; then if [ -d /lib/$FAMILY_TRIPLET ]; then HOST_LIBDIR="$HOST_LIBDIR /lib/$FAMILY_TRIPLET" fi if [ -d /usr/lib/$FAMILY_TRIPLET ]; then HOST_LIBDIR="$HOST_LIBDIR /usr/lib/$FAMILY_TRIPLET" fi fi # default multiarch support case "${MACHINE_HARDWARE_NAME}" in i*86) if [ -d /lib32 ]; then HOST_LIBDIR="$HOST_LIBDIR /lib32" fi if [ -d /usr/lib32 ]; then HOST_LIBDIR="$HOST_LIBDIR /usr/lib32" fi ;; x86_64) if [ -d /lib64 ]; then HOST_LIBDIR="$HOST_LIBDIR /lib64" fi if [ -d /usr/lib64 ]; then HOST_LIBDIR="$HOST_LIBDIR /usr/lib64" fi ;; esac # default dirs export HOST_LIBDIR="$HOST_LIBDIR /lib /usr/lib" fi ================================================ FILE: config/options ================================================ # Do not build as root. Ever. if [[ "${EUID}" -eq 0 ]]; then echo "Building as the root user is NOT supported. Use a regular user account for the build." 1>&2 exit 1 fi # Spaces in paths are verboten if [[ ${PWD} =~ [[:space:]] ]]; then echo "Current PWD: \"${PWD}\"" 1>&2 echo 1>&2 echo "Building in a folder that includes spaces is NOT supported. Use a folder without spaces." 1>&2 exit 1 fi # set default language for buildsystem export LC_ALL=C # set default independent variables ROOT="${PWD}" DISTRO_DIR="${ROOT}/distributions" PROJECT_DIR="${ROOT}/projects" # determines DISTRO, if not forced by user DISTRO="${DISTRO:-EmuELEC}" # determines PROJECT, if not forced by user export PROJECT="${PROJECT:-Amlogic-ce}" # determines DEVICE, if not forced by user export DEVICE="${DEVICE:-Amlogic-ng}" # default to Generic device if building Generic project without device set if [ "${PROJECT}" = "Generic" -a -z "${DEVICE}" ]; then export DEVICE="Generic" fi # determines TARGET_ARCH, if not forced by user export ARCH="${ARCH:-aarch64}" TARGET_ARCH="${ARCH}" # include arm-mem package on arm if [ "${TARGET_ARCH}" = "arm" ]; then ARM_MEM_SUPPORT="yes" else ARM_MEM_SUPPORT="no" fi # include helper functions . config/functions # read DISTRO version information . "${DISTRO_DIR}/${DISTRO}/version" || die "\nERROR: No distro version present\n" # read DISTRO options if [ -f "${DISTRO_DIR}/${DISTRO}/options" ]; then . "${DISTRO_DIR}/${DISTRO}/options" fi # read PROJECT options if [ -f "${PROJECT_DIR}/${PROJECT}/options" ]; then . "${PROJECT_DIR}/${PROJECT}/options" fi # read DEVICE options if [ -f "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/options" ]; then . "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/options" fi # read architecture defaults if [ -f "config/arch.${TARGET_ARCH}" ]; then . "config/arch.${TARGET_ARCH}" fi # projects can set KERNEL_NAME (kernel.img) KERNEL_NAME="${KERNEL_NAME:-KERNEL}" LINUX_DEPENDS="${PROJECT_DIR}/${PROJECT}/linux ${PROJECT_DIR}/${PROJECT}/patches/linux ${PROJECT_DIR}/${PROJECT}/packages/linux ${ROOT}/packages/linux" [ -n "${DEVICE}" ] && LINUX_DEPENDS+=" ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/linux ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/patches/linux ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/packages/linux" # Need to point to your actual cc # If you have ccache installed, take care that LOCAL_CC does not point to it [ -z "${LOCAL_CC}" ] && export LOCAL_CC="$(command -v gcc)" if [ -z "${LOCAL_CC}" ]; then die "***** Please install gcc - run scripts/checkdeps *****" "127" fi # Need to point to your actual g++ # If you have ccache installed, take care that LOCAL_CXX does not point to it [ -z "${LOCAL_CXX}" ] && export LOCAL_CXX="$(command -v g++)" # verbose compilation mode (yes/no) VERBOSE="${VERBOSE:-yes}" # Concurrency make level (-j option) # Try values between 1 and number of processor cores present. # default: use all cores [ -z "${CONCURRENCY_MAKE_LEVEL}" ] && export CONCURRENCY_MAKE_LEVEL=$(nproc) [ -z "${CONCURRENCY_LOAD}" ] && export CONCURRENCY_LOAD=$(python3 -c "import os; print(f'{os.cpu_count() * 1.5:.2f}')") # cache size for ccache # Set the maximum size of the files stored in the cache. You can specify a # value in gigabytes, megabytes or kilobytes by appending a G, M or K to the # value. The default is gigabytes. The actual value stored is rounded down to # the nearest multiple of 16 kilobytes. Keep in mind this per project .ccache # directory. CCACHE_CACHE_SIZE="20G" # compression level for ccache # This option determines the level at which ccache will compress object files # using the real-time compression algorithm Zstandard. It only has effect if # compression is enabled (which it is by default). Zstandard is extremely fast # for decompression and very fast for compression for lower compression # levels. The default is 0. The value 0 means that ccache will choose a # suitable zstd level, currently 1. CCACHE_COMPRESSLEVEL="0" # set addon paths if [ -z "$ADDON_PATH" ]; then if [ -n "$ADDON_PROJECT" ]; then ADDON_PATH="$ADDON_VERSION/$ADDON_PROJECT/$TARGET_ARCH" else ADDON_PATH="$ADDON_VERSION/$TARGET_ARCH" fi fi if [ -z "$ADDON_URL" ]; then ADDON_URL="$ADDON_SERVER_URL/$ADDON_PATH" fi # read local persistent options from $ROOT if available if [ -f "${ROOT}/.coreelec/options" ]; then . "${ROOT}/.coreelec/options" fi # read global persistent options from $HOME if available if [ -f "${HOME}/.coreelec/options" ]; then . "${HOME}/.coreelec/options" fi if [ "${LOCAL_CCACHE_SUPPORT}" = "yes" ] && [ -z "${CCACHE_DISABLE}" ]; then # like LOCAL_CC check for local ccache only on the very first # call to config/options, before toolchain has been added to the path, # otherwise we might pick up ccache from toolchain/bin here if [ -z "${LOCAL_CCACHE}" ] && [ "${LOCAL_CCACHE_CHECKED}" != "yes" ]; then export LOCAL_CCACHE="$(command -v ccache)" export LOCAL_CCACHE_CHECKED="yes" fi else export LOCAL_CCACHE="" fi # overwrite OEM_SUPPORT via commandline if [ "${OEM}" = "yes" -o "${OEM}" = "no" ]; then OEM_SUPPORT="${OEM}" fi check_config . config/graphic . config/path $1 # Multilib Magics if [ "$ARCH" = "aarch64" ]; then . config/options32 fi ## package processing # If the package caches are unset, then populate them init_package_cache if [ -z "${DEFAULT_PYTHON_VERSION+set}" ]; then export DEFAULT_PYTHON_VERSION="$(get_pkg_variable Python3 PKG_PYTHON_VERSION)" fi # set package metadata source_package "${1}" ================================================ FILE: config/options32 ================================================ # This command requires BASH >= v4.0, since we're using Ubuntu 20 as a baseline, this should not be a problem # This reads those options into an array, one element per line, and keep empty line as is, also removing trailing \n readarray -t OPTIONS32 < <( ARCH=arm TARGET_ARCH=arm # read DEVICE options if [ -f "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/options" ]; then . "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/options" fi # read architecture defaults if [ -f "config/arch.${TARGET_ARCH}" ]; then . "config/arch.${TARGET_ARCH}" fi echo $TARGET_ABI echo $TARGET_GCC_ARCH echo $TARGET_CFLAGS echo $TARGET_LDFLAGS echo $TARGET_ARCH_GCC_OPTS echo $TARGET_CPU echo $TARGET_FPU echo $TARGET_SUBARCH ) LIB32_TARGET_ABI="${OPTIONS32[0]}" LIB32_TARGET_GCC_ARCH="${OPTIONS32[1]}" LIB32_TARGET_CFLAGS="${OPTIONS32[2]}" LIB32_TARGET_LDFLAGS="${OPTIONS32[3]}" LIB32_TARGET_ARCH_GCC_OPTS="${OPTIONS32[4]}" LIB32_TARGET_CPU="${OPTIONS32[5]}" LIB32_TARGET_FPU="${OPTIONS32[6]}" LIB32_TARGET_SUBARCH="${OPTIONS32[7]}" LIB32_TARGET_NAME="${LIB32_TARGET_GCC_ARCH}-emuelec-linux-gnu${LIB32_TARGET_ABI}" LIB32_SYSROOT_PREFIX="${TOOLCHAIN}/${LIB32_TARGET_NAME}/sysroot" LIB32_TARGET_PREFIX="$TOOLCHAIN/bin/$LIB32_TARGET_NAME-" LIB32_TARGET_CFLAGS="$LIB32_TARGET_CFLAGS -Wall -pipe $PROJECT_CFLAGS" LIB32_TARGET_CXXFLAGS="$LIB32_TARGET_CFLAGS" LIB32_TARGET_LDFLAGS="$LIB32_TARGET_LDFLAGS $LD_OPTIM" unset OPTIONS32 ================================================ FILE: config/path ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) set -e # setup initial directorys (relative to root) CONFIG=config SCRIPTS=scripts PACKAGES=packages SOURCES=${SOURCES_DIR:-$ROOT/sources} BUILD_ROOT=${BUILD_DIR:-$ROOT} BUILD_BASE=build TARGET_IMG=${TARGET_DIR:-$ROOT/target} ADDONS=addons [ -z "${HOST_NAME}" ] && export HOST_NAME="$($LOCAL_CC -dumpmachine)" TARGET_NAME=$TARGET_GCC_ARCH-libreelec-linux-gnu${TARGET_ABI} BUILD=${BUILD_ROOT}/${BUILD_BASE}.${DISTRONAME}-${DEVICE:-$PROJECT}.${TARGET_ARCH}-${OS_MAJOR} if [ -n "$BUILD_SUFFIX" ]; then BUILD=$BUILD-$BUILD_SUFFIX fi THREAD_CONTROL=${BUILD}/.threads TARGET_ADDONS="$TARGET_IMG/$ADDONS/$ADDON_PATH" ADDON_BUILD="$BUILD/$ADDONS/$1" STAMPS=$BUILD/.stamps STAMPS_INSTALL=$BUILD/image/.stamps DOCS=DOCS TOOLCHAIN=$BUILD/toolchain SYSROOT_PREFIX=$TOOLCHAIN/$TARGET_NAME/sysroot LIB_PREFIX=$SYSROOT_PREFIX/usr TARGET_PREFIX=$TOOLCHAIN/bin/$TARGET_NAME- FAKEROOT_SCRIPT=$BUILD/.fakeroot if [ -z "$INSTALL" ]; then INSTALL=$BUILD/image/system fi . config/sources MAKE="$TOOLCHAIN/bin/make" XORG_PATH_DRI=/usr/lib/dri XORG_PATH_XKB=/usr/share/X11/xkb XORG_PATH_XKB_OUTPUT=/var/lib/xkb XORG_PATH_RGB=/usr/lib/X11/rgb XORG_PATH_MODULES=/usr/lib/xorg/modules XORG_PATH_DRIVERS=/usr/lib/xorg/modules/drivers . config/optimize # use different toolchain for 64/32 split builds if [ -z "$KERNEL_TOOLCHAIN" -a "$TARGET_KERNEL_ARCH" = "arm64" -a "$TARGET_ARCH" = "arm" ]; then KERNEL_TOOLCHAIN="aarch64" fi if [ -n "$KERNEL_TOOLCHAIN" ]; then TARGET_KERNEL_PREFIX=$KERNEL_TOOLCHAIN-none-elf- else TARGET_KERNEL_PREFIX=$TARGET_PREFIX fi if [ -z "$CCACHE_DIR" ]; then export CCACHE_DIR=$BUILD/.ccache fi # keep a copy of ccache dir used for toolchain ccache export BUILD_CCACHE_DIR="${CCACHE_DIR}" # local ccache dir in case we build early packages with local ccache if [ -z "${LOCAL_CCACHE_DIR}" ]; then export LOCAL_CCACHE_DIR="${BUILD}/.ccache-local" fi if [[ -z "$PATH" || ( "$PATH" != "$TOOLCHAIN/bin:$TOOLCHAIN/sbin" && "$PATH" = "${PATH#$TOOLCHAIN/bin:$TOOLCHAIN/sbin:}" ) ]]; then export PATH="$TOOLCHAIN/bin:$TOOLCHAIN/sbin${PATH:+":$PATH"}" fi # redirect formatted output export BUILD_INDENT_SIZE=4 SILENT_OUT=3 VERBOSE_OUT=4 if [ "$VERBOSE" = yes ]; then exec 3>&1 exec 4>&1 else exec 3>&2 exec 4>/dev/null fi unset LD_LIBRARY_PATH # multilib? nah unset CONFIG_SITE # Ignore custom python installs... unset PYTHONHOME PYTHONPATH PYTHONSTARTUP export PYTHONNOUSERSITE=yes #disable PEP 370 # Fix #4737 unset PYTHONDONTWRITEBYTECODE ================================================ FILE: config/show_config ================================================ #!/bin/bash show_config() { # load graphic configuration get_graphicdrivers dashes="===========================" config_message="\n ${dashes}${dashes}${dashes}" config_message+="\n Configuration for ${DISTRONAME} " if [ "${OFFICIAL}" = "yes" ]; then config_message+="(official)" else config_message+="(community)" fi config_message+="\n ${dashes}${dashes}${dashes}" # Build options config_message+="\n\n Buildsystem configuration:" config_message+="\n ${dashes}${dashes}" config_message+="\n - CPU:\t\t\t\t\t ${TARGET_CPU}" config_message+="\n - Kernel Architecture:\t\t\t ${TARGET_KERNEL_ARCH}" config_message+="\n - Userland Architecture:\t\t ${TARGET_ARCH}" if [ -n "${TARGET_FLOAT}" ]; then config_message+="\n - FLOAT:\t\t\t\t ${TARGET_FLOAT}" fi if [ -n "${TARGET_FPU}" ]; then config_message+="\n - FPU:\t\t\t\t\t ${TARGET_FPU}" fi config_message+="\n - CPU features:\t\t\t ${TARGET_FEATURES}" config_message+="\n - LTO (Link Time Optimization) support: ${LTO_SUPPORT}" config_message+="\n - GOLD (Google Linker) Support:\t ${GOLD_SUPPORT}" config_message+="\n - MOLD (Modern Linker) Support:\t ${MOLD_SUPPORT}" config_message+="\n - Default Linker:\t\t\t ${DEFAULT_LINKER}" config_message+="\n - LLVM support:\t\t\t ${LLVM_SUPPORT}" config_message+="\n - DEBUG:\t\t\t\t ${DEBUG:-no}" config_message+="\n - CFLAGS:\t\t\t\t ${TARGET_CFLAGS}" config_message+="\n - LDFLAGS:\t\t\t\t $(sed 's/^ *//' <<< ${TARGET_LDFLAGS})" config_message+="\n - Local Ccache:\t\t\t ${LOCAL_CCACHE:-no}" # Misc. hardware configuration config_message+="\n\n Misc. hardware configuration:" config_message+="\n ${dashes}${dashes}" config_message+="\n - ALSA support:\t\t\t ${ALSA_SUPPORT}" config_message+="\n - Pulseaudio support:\t\t\t ${PULSEAUDIO_SUPPORT}" config_message+="\n - Bluetooth support:\t\t\t ${BLUETOOTH_SUPPORT}" for config_driver in ${ADDITIONAL_DRIVERS}; do config_message+="\n - Include driver:\t\t\t ${config_driver}" done if [ "${DRIVER_ADDONS_SUPPORT}" = "yes" ]; then for config_driver_addons in ${DRIVER_ADDONS}; do config_message+="\n - Include driver add-ons:\t\t ${config_driver_addons}" done fi for config_firmware in ${FIRMWARE}; do config_message+="\n - Include firmware:\t\t\t ${config_firmware}" done # Misc. Filesystems config_message+="\n\n Misc. Filesystems:" config_message+="\n ${dashes}${dashes}" config_message+="\n - Swap Support:\t\t\t ${SWAP_SUPPORT}" if [ "${SWAP_SUPPORT}" = "yes" ]; then config_message+="\n - Swapfile default size:\t\t ${SWAPFILESIZE}" fi config_message+="\n - exFAT Support (via Fuse):\t\t ${EXFAT}" config_message+="\n - NTFS Support (via Fuse):\t\t ${NTFS3G}" config_message+="\n - Install HFS Tools:\t\t\t ${HFSTOOLS}" # Network service configuration config_message+="\n\n Network service configuration:" config_message+="\n ${dashes}${dashes}" config_message+="\n - Avahi (Zeroconf) support:\t\t ${AVAHI_DAEMON}" config_message+="\n - NFS mounting support:\t\t ${NFS_SUPPORT}" config_message+="\n - SAMBA mounting support:\t\t ${SAMBA_SUPPORT}" config_message+="\n - SAMBA server support:\t\t ${SAMBA_SERVER}" config_message+="\n - SFTP server support:\t\t\t ${SFTP_SERVER}" config_message+="\n - OpenVPN support:\t\t\t ${OPENVPN_SUPPORT}" config_message+="\n - WireGuard support:\t\t\t ${WIREGUARD_SUPPORT}" # Graphic configuration config_message+="\n\n Graphic configuration:" config_message+="\n ${dashes}${dashes}" config_message+="\n - Graphic Drivers:\t\t\t ${GRAPHIC_DRIVERS}" config_message+="\n - Display Server:\t\t\t ${DISPLAYSERVER}" if [ "${DISPLAYSERVER}" = "x11" ] ; then for drv in ${XORG_DRIVERS}; do XORG_DRIVERS_CONFIG+="xf86-video-${drv} " done config_message+="\n - X.Org Graphic Drivers:\t\t ${XORG_DRIVERS_CONFIG}" config_message+="\n - X.Org Composite support:\t\t ${COMPOSITE_SUPPORT}" fi config_message+="\n - Window Manager / Compositor:\t\t ${WINDOWMANAGER}" config_message+="\n - OpenGL (GLX) support (provider):\t ${OPENGL_SUPPORT}" [ "${OPENGL}" != "no" ] && config_message+=" (${OPENGL})" config_message+="\n - OpenGL ES support (provider):\t ${OPENGLES_SUPPORT}" [ "${OPENGLES}" != "no" ] && config_message+=" (${OPENGLES})" config_message+="\n - Vulkan API support (provider):\t ${VULKAN_SUPPORT}" [ "${VULKAN}" != "no" ] && config_message+=" (${VULKAN})" if [ "${VULKAN_SUPPORT}" = "yes" ]; then config_message+="\n - Vulkan Graphic Drivers:\t\t ${VULKAN_DRIVERS_CONFIG}" fi # Video Acceleration configuration config_message+="\n\n Video Acceleration configuration:" config_message+="\n ${dashes}${dashes}" config_message+="\n - VA-API Support:\t\t\t ${VAAPI_SUPPORT}" config_message+="\n - VDPAU Support:\t\t\t ${VDPAU_SUPPORT}" # OS configuration config_message+="\n\n OS configuration:" config_message+="\n ${dashes}${dashes}" config_message+="\n - OEM Support:\t\t\t\t ${OEM_SUPPORT}" config_message+="\n - Default ROOT Password:\t\t ${ROOT_PASSWORD}" config_message+="\n - Bootloader:\t\t\t\t ${BOOTLOADER}" config_message+="\n - UDevil support:\t\t\t ${UDEVIL}" config_message+="\n - Installer support:\t\t\t ${INSTALLER_SUPPORT}" for config_package in ${ADDITIONAL_PACKAGES}; do config_message+="\n - Include package:\t\t\t ${config_package}" done # Distribution specific configuration # show_distro_config() should be included in one of: # $DISTRO/config/functions # $DISTRO/show_config if [ -f distributions/${DISTRO}/show_config ]; then . distributions/${DISTRO}/show_config fi if [ "$(type -t show_distro_config)" = "function" ]; then show_distro_config fi config_message+="\n\n ${dashes}${dashes}${dashes}" config_message+="\n End Configuration for ${DISTRONAME}" config_message+="\n ${dashes}${dashes}${dashes}" config_message+="\n\n\n" echo -e "${config_message}" } ================================================ FILE: config/sources ================================================ # Sourceforge download site SOURCEFORGE_SRC="https://prdownloads.sourceforge.net" ================================================ FILE: create_tar.sh ================================================ #!/bin/sh git archive --format=tar --prefix=LibreELEC-source-$1/ tags/$1 | bzip2 > LibreELEC-source-$1.tar.bz2 ================================================ FILE: distributions/CoreELEC/options ================================================ ### DISTRO INFORMATION ### # Name of the Distro to build (full name, without special characters) DISTRONAME="CoreELEC" # short project description DESCRIPTION="CoreELEC is a fast and user-friendly Kodi Entertainment Center distribution." ### USER INTERFACE SETTINGS ### # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# CoreELEC #" GREETING2="# https://coreelec.org #" GREETING3="##############################################" GREETING4="" # Root password to integrate in the target system ROOT_PASSWORD="coreelec" # Partition labels for USB/SD installation media DISTRO_BOOTLABEL="COREELEC" DISTRO_DISKLABEL="STORAGE" ### BUILDSYSTEM SETTINGS #### # LTO (Link Time Optimization) support LTO_SUPPORT="yes" # GOLD (Google Linker) support GOLD_SUPPORT="yes" # MOLD (Modern Linker) support MOLD_SUPPORT="no" # default linker (bfd / gold / mold) DEFAULT_LINKER="gold" # HARDENING (security relevant linker and compiler flags) support HARDENING_SUPPORT="no" # Default supported get handlers (archive, git, file etc.) GET_HANDLER_SUPPORT="archive" # use local ccache on build host, if available, for early package # builds before ccache has been built LOCAL_CCACHE_SUPPORT="yes" ### OS CONFIGURATION ### # Install glibc locales to the build (yes / no) GLIBC_LOCALES="yes" # additional drivers to install: # for a list of additional drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="gpu-aml openvfd-driver media_modules-aml wifi_dummy-aml ap6xxx-aml uwe5631-aml RTL8812AU RTL8822BU-aml RTL8822CS-aml RTL8822CU-aml RTL8852BS-aml RTL8152-aml w1-aml" # Default size of system partition, in MB, eg. 512 SYSTEM_SIZE=512 # Default system partition offset, in sectors, eg. 2048 SYSTEM_PART_START=8192 # build with swap support (yes / no) SWAP_SUPPORT="yes" # swap support enabled per default (yes / no) SWAP_ENABLED_DEFAULT="no" # swapfile size if SWAP_SUPPORT=yes in MB SWAPFILESIZE="128" # debug tty path DEBUG_TTY="/dev/ttyS0" ### KODI SETTINGS ### # Mediacenter to use (kodi / no) MEDIACENTER="kodi" # Skins to install (Estuary) # Space separated list is supported, # e.g. SKINS="Estuary" SKINS="Estuary" # Default Skin (Estuary) SKIN_DEFAULT="Estuary" # install extra subtitle Fonts for KODI (yes / no) KODI_EXTRA_FONTS="yes" # build and install PulseAudio support (yes / no) PULSEAUDIO_SUPPORT="yes" # build and install pipewire support (yes / no) PIPEWIRE_SUPPORT="no" # build and install eSpeak-NG support (yes / no) ESPEAK_SUPPORT="no" # build and install with BluRay support (yes / no) KODI_BLURAY_SUPPORT="yes" # build and install with BD+ support # (BD+ decryption support in KODI) (yes / no) BLURAY_BDPLUS_SUPPORT="yes" # build and install with AACS support # (BD decryption support in KODI) (yes / no) BLURAY_AACS_SUPPORT="yes" # build and install with DVDCSS support # (DVD decryption support in KODI) (yes / no) KODI_DVDCSS_SUPPORT="yes" # build and install bluetooth support (yes / no) BLUETOOTH_SUPPORT="yes" # build and install with KODI webfrontend (yes / no) KODI_WEBSERVER_SUPPORT="yes" # build and install Avahi (Zeroconf) daemon (yes / no) AVAHI_DAEMON="yes" # build with UPnP support (yes / no) KODI_UPNP_SUPPORT="yes" # build with MySQL support (mariadb / none) KODI_MYSQL_SUPPORT="mariadb" # build xbmc with optical drive support (yes / no) KODI_OPTICAL_SUPPORT="yes" # build with AirPlay support (stream videos from iDevices to KODI) (yes / no) KODI_AIRPLAY_SUPPORT="yes" # build with AirTunes support (stream music from iDevices to KODI) (yes / no) KODI_AIRTUNES_SUPPORT="yes" # build with libnfs support (mounting nfs shares with KODI) (yes / no) KODI_NFS_SUPPORT="yes" # build with Samba Client support (mounting SAMBA shares with KODI) (yes / no) KODI_SAMBA_SUPPORT="yes" # build kodi with alsa support (yes/no) KODI_ALSA_SUPPORT="yes" # build kodi with pulseaudio support (yes/no) KODI_PULSEAUDIO_SUPPORT="yes" # build kodi with pipewire support (yes/no) KODI_PIPEWIRE_SUPPORT="no" ### KODI ADDONS ### # Distribution Specific source location DISTRO_MIRROR="http://sources.coreelec.org http://sources.libreelec.tv/mirror" DISTRO_SRC="http://sources.libreelec.tv/$LIBREELEC_VERSION" # Addon Server Url ADDON_SERVER_URL="https://addons.coreelec.org" # ID of the default addon repository ADDON_REPO_ID="repository.coreelec" # Name of the default addon repository ADDON_REPO_NAME="CoreELEC Add-ons" # set the addon dirs ADDON_PATH="$DEVICE/$ADDON_VERSION/$TARGET_ARCH" # Settings package name - blank if not required DISTRO_PKG_SETTINGS="CoreELEC-settings" DISTRO_PKG_SETTINGS_ID="service.coreelec.settings" ### ADDITIONAL PROGRAMS / FUNCTIONS ### # Testpackages for development (yes / no) TESTING="no" # Configure debug groups (space delimited key=value pairs, with each value comma-delimited) and default group when DEBUG=yes # Use ! or - prefix to prevent a dependent package from being built with debug. Add + suffix to build dependenencies with debug. DEBUG_GROUPS="kodi+=kodi+,kodi-platform+,p8-platform+,!mesa" DEBUG_GROUP_YES="kodi+" # wireless daemon to use (wpa_supplicant/iwd) WIRELESS_DAEMON="wpa_supplicant" # build and install iSCSI support - iscsistart (yes / no) ISCSI_SUPPORT="no" # build with NFS support (mounting nfs shares via the OS) (yes / no) NFS_SUPPORT="yes" # build with Samba Client support (mounting samba shares via the OS) (yes / no) SAMBA_SUPPORT="yes" # build and install Samba Server (yes / no) SAMBA_SERVER="yes" # build and install SFTP Server (yes / no) SFTP_SERVER="yes" # build and install OpenVPN support (yes / no) OPENVPN_SUPPORT="yes" # build and install WireGuard support (yes / no) WIREGUARD_SUPPORT="yes" # build and install diskmounter support (udevil) # this service provide auto mounting support for external drives in the # mediacenter also automount internally drives at boottime via udev (yes / no) UDEVIL="yes" # Support for partitioning and formating disks in initramfs (yes / no) # This adds support for parted and mkfs.ext3/4 to initramfs for OEM usage INITRAMFS_PARTED_SUPPORT="no" # build and install exFAT fuse support (yes / no) EXFAT="yes" # build and install NTFS-3G fuse support (yes / no) NTFS3G="yes" # build and install hfs filesystem utilities (yes / no) HFSTOOLS="yes" # build and install nano text editor (yes / no) NANO_EDITOR="yes" # cron support (yes / no) CRON_SUPPORT="yes" # build with installer (yes / no) INSTALLER_SUPPORT="yes" # build and install remote support (yes / no) REMOTE_SUPPORT="yes" # IR remote keymaps supported in default config IR_REMOTE_KEYMAPS="rc6_mce xbox_360 xbox_one odroid wetek_hub wetek_play_2 tanix" # build and install Joystick support (yes / no) JOYSTICK_SUPPORT="yes" # build and install CEC adapter support (yes / no) CEC_SUPPORT="yes" # build and install CEC framework support (yes / no) CEC_FRAMEWORK_SUPPORT="no" # OEM packages for OEM's (yes / no) OEM_SUPPORT="no" # build and install ALSA Audio support (yes / no) ALSA_SUPPORT="yes" # additional packages to install: # Space separated list is supported, # e.g. ADDITIONAL_PACKAGES="PACKAGE1 PACKAGE2" ADDITIONAL_PACKAGES="u-boot-script dtc CoreELEC-Debug-Scripts inject_bl301 ceemmc nfs-utils dtb-xml megatools" ================================================ FILE: distributions/CoreELEC/show_config ================================================ show_distro_config() { # Hardware decoder support config_message+="\n\n Kodi Hardware configuration:" config_message+="\n $dashes$dashes" config_message+="\n - Video Acceleration provider:\t\t $KODIPLAYER_DRIVER" # Input device configuration config_message+="\n - Remote support:\t\t\t $REMOTE_SUPPORT" config_message+="\n - CEC Adapter support:\t\t\t $CEC_SUPPORT" config_message+="\n - CEC Framework support:\t\t $CEC_FRAMEWORK_SUPPORT" config_message+="\n - Kodi Joystick support:\t\t $JOYSTICK_SUPPORT" # Kodi configuration config_message+="\n\n Kodi Software configuration:" config_message+="\n $dashes$dashes" config_message+="\n - Kodi Blu-ray support:\t\t $KODI_BLURAY_SUPPORT" if [ "$KODI_BLURAY_SUPPORT" = "yes" ] ; then config_message+="\n - Blu-ray BD+ support:\t\t $BLURAY_BDPLUS_SUPPORT" config_message+="\n - Blu-ray AACS support:\t\t $BLURAY_AACS_SUPPORT" fi config_message+="\n - Kodi DVDCSS support:\t\t\t $KODI_DVDCSS_SUPPORT" config_message+="\n - Kodi Airplay support:\t\t $KODI_AIRPLAY_SUPPORT" config_message+="\n - Kodi Airtunes support:\t\t $KODI_AIRTUNES_SUPPORT" config_message+="\n - Kodi NFS support:\t\t\t $KODI_NFS_SUPPORT" config_message+="\n - Kodi MySQL support:\t\t\t $KODI_MYSQL_SUPPORT" config_message+="\n - Kodi Optical Drive support:\t\t $KODI_OPTICAL_SUPPORT" config_message+="\n - Kodi SAMBA client support:\t\t $KODI_SAMBA_SUPPORT" config_message+="\n - Kodi UPNP support:\t\t\t $KODI_UPNP_SUPPORT" config_message+="\n - Kodi Webserver support:\t\t $KODI_WEBSERVER_SUPPORT" for config_skin in $SKINS; do config_message+="\n - Include Skin:\t\t\t $config_skin" done config_message+="\n - Default Skin:\t\t\t $SKIN_DEFAULT" config_message+="\n - Include extra fonts:\t\t\t $KODI_EXTRA_FONTS" } ================================================ FILE: distributions/CoreELEC/splash/Amlogic-ne/progress/splash-1080-config ================================================ animation_offset_x=635 animation_offset_y=135 frames_per_second=20 ================================================ FILE: distributions/CoreELEC/splash/Amlogic-ng/progress/splash-1080-config ================================================ animation_offset_x=635 animation_offset_y=135 frames_per_second=20 ================================================ FILE: distributions/CoreELEC/version ================================================ # OS_MAJOR: OS major Version OS_MAJOR="20" # OS_MINOR: OS minor Version OS_MINOR="3" # OS_VERSION: OS Version OS_VERSION="${OS_MAJOR}.${OS_MINOR}" # OS_CODENAME: OS Codename OS_CODENAME="Nexus" # OS_STAGE: OS Release Stage (alpha, beta, rc, build) OS_STAGE="" # BUILD_NUM: Build number BUILD_NUM="" # ADDON_VERSION: Addon version ADDON_VERSION=${OS_VERSION} ================================================ FILE: distributions/EmuELEC/options ================================================ ## DISTRO INFORMATION ### # Name of the Distro to build (full name, without special characters) DISTRONAME="EmuELEC" # short project description DESCRIPTION="Retro emulation for Amlogic Devices." ### USER INTERFACE SETTINGS ### # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# EmuELEC #" GREETING2="# Retro emulation for Amlogic Devices #" GREETING3="# Based on CoreELEC #" GREETING4="##############################################" # Root password to integrate in the target system ROOT_PASSWORD="emuelec" # Partition labels for USB/SD installation media DISTRO_BOOTLABEL="EMUELEC" DISTRO_DISKLABEL="STORAGE" ### BUILDSYSTEM SETTINGS #### # LTO (Link Time Optimization) support LTO_SUPPORT="yes" # GOLD (Google Linker) support GOLD_SUPPORT="yes" # MOLD (Modern Linker) support MOLD_SUPPORT="no" # default linker (bfd / gold / mold) DEFAULT_LINKER="gold" # HARDENING (security relevant linker and compiler flags) support HARDENING_SUPPORT="no" # Default supported get handlers (archive, git, file etc.) GET_HANDLER_SUPPORT="archive git file" # use local ccache on build host, if available, for early package # builds before ccache has been built LOCAL_CCACHE_SUPPORT="yes" ### OS CONFIGURATION ### # Install glibc locales to the build (yes / no) GLIBC_LOCALES="yes" # additional drivers to install: # for a list of additional drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="gpu-aml openvfd-driver media_modules-aml wifi_dummy-aml ap6xxx-aml uwe5631-aml RTL8812AU RTL8822BU-aml RTL8822CS-aml RTL8822CU-aml RTL8852BS-aml RTL8152-aml w1-aml" # Default size of system partition, in MB, eg. 512 SYSTEM_SIZE=2048 # Default system partition offset, in sectors, eg. 2048 SYSTEM_PART_START=8192 # build with swap support (yes / no) SWAP_SUPPORT="yes" # swap support enabled per default (yes / no) SWAP_ENABLED_DEFAULT="no" # swapfile size if SWAP_SUPPORT=yes in MB SWAPFILESIZE="128" # debug tty path DEBUG_TTY="/dev/ttyS0" ### KODI SETTINGS ### # Mediacenter to use (kodi / no) MEDIACENTER="emuelec" # Skins to install (Estuary) # Space separated list is supported, # e.g. SKINS="Estuary" SKINS="Estuary" # Default Skin (Estuary) SKIN_DEFAULT="Estuary" # install extra subtitle Fonts for KODI (yes / no) KODI_EXTRA_FONTS="yes" # build and install PulseAudio support (yes / no) PULSEAUDIO_SUPPORT="yes" # build and install pipewire support (yes / no) PIPEWIRE_SUPPORT="no" # build and install eSpeak-NG support (yes / no) ESPEAK_SUPPORT="no" # build and install with BluRay support (yes / no) KODI_BLURAY_SUPPORT="yes" # build and install with BD+ support # (BD+ decryption support in KODI) (yes / no) BLURAY_BDPLUS_SUPPORT="yes" # build and install with AACS support # (BD decryption support in KODI) (yes / no) BLURAY_AACS_SUPPORT="yes" # build and install with DVDCSS support # (DVD decryption support in KODI) (yes / no) KODI_DVDCSS_SUPPORT="yes" # build and install bluetooth support (yes / no) BLUETOOTH_SUPPORT="yes" # build and install with KODI webfrontend (yes / no) KODI_WEBSERVER_SUPPORT="yes" # build and install Avahi (Zeroconf) daemon (yes / no) AVAHI_DAEMON="yes" # build with UPnP support (yes / no) KODI_UPNP_SUPPORT="yes" # build with MySQL support (mariadb / none) KODI_MYSQL_SUPPORT="mariadb" # build xbmc with optical drive support (yes / no) KODI_OPTICAL_SUPPORT="yes" # build with AirPlay support (stream videos from iDevices to KODI) (yes / no) KODI_AIRPLAY_SUPPORT="yes" # build with AirTunes support (stream music from iDevices to KODI) (yes / no) KODI_AIRTUNES_SUPPORT="yes" # build with libnfs support (mounting nfs shares with KODI) (yes / no) KODI_NFS_SUPPORT="yes" # build with Samba Client support (mounting SAMBA shares with KODI) (yes / no) KODI_SAMBA_SUPPORT="yes" # build kodi with alsa support (yes/no) KODI_ALSA_SUPPORT="yes" # build kodi with pulseaudio support (yes/no) KODI_PULSEAUDIO_SUPPORT="yes" # build kodi with pipewire support (yes/no) KODI_PIPEWIRE_SUPPORT="no" ### KODI ADDONS ### # Distribution Specific source location DISTRO_MIRROR="http://sources.coreelec.org http://sources.libreelec.tv/mirror" DISTRO_SRC="http://sources.libreelec.tv/$LIBREELEC_VERSION" # Addon Server Url ADDON_SERVER_URL="https://addons.coreelec.org" # ID of the default addon repository ADDON_REPO_ID="repository.coreelec" # Name of the default addon repository ADDON_REPO_NAME="CoreELEC Add-ons" # set the addon dirs ADDON_PATH="$DEVICE/$ADDON_VERSION/$TARGET_ARCH" # Settings package name - blank if not required DISTRO_PKG_SETTINGS="" DISTRO_PKG_SETTINGS_ID="" ### ADDITIONAL PROGRAMS / FUNCTIONS ### # Testpackages for development (yes / no) TESTING="no" # Configure debug groups (space delimited key=value pairs, with each value comma-delimited) and default group when DEBUG=yes # Use ! or - prefix to prevent a dependent package from being built with debug. Add + suffix to build dependenencies with debug. DEBUG_GROUPS="kodi+=kodi+,kodi-platform+,p8-platform+,!mesa" DEBUG_GROUP_YES="kodi+" # wireless daemon to use (wpa_supplicant/iwd) WIRELESS_DAEMON="wpa_supplicant" # build and install iSCSI support - iscsistart (yes / no) ISCSI_SUPPORT="no" # build with NFS support (mounting nfs shares via the OS) (yes / no) NFS_SUPPORT="yes" # build with Samba Client support (mounting samba shares via the OS) (yes / no) SAMBA_SUPPORT="yes" # build and install Samba Server (yes / no) SAMBA_SERVER="yes" # build and install SFTP Server (yes / no) SFTP_SERVER="yes" # build and install OpenVPN support (yes / no) OPENVPN_SUPPORT="no" # build and install WireGuard support (yes / no) WIREGUARD_SUPPORT="no" # build and install diskmounter support (udevil) # this service provide auto mounting support for external drives in the # mediacenter also automount internally drives at boottime via udev (yes / no) UDEVIL="yes" # Support for partitioning and formating disks in initramfs (yes / no) # This adds support for parted and mkfs.ext3/4 to initramfs for OEM usage INITRAMFS_PARTED_SUPPORT="no" # build and install exFAT fuse support (yes / no) EXFAT="yes" # build and install NTFS-3G fuse support (yes / no) NTFS3G="yes" # build and install hfs filesystem utilities (yes / no) HFSTOOLS="yes" # build and install nano text editor (yes / no) NANO_EDITOR="yes" # cron support (yes / no) CRON_SUPPORT="yes" # build with installer (yes / no) INSTALLER_SUPPORT="yes" # build and install remote support (yes / no) REMOTE_SUPPORT="yes" # IR remote keymaps supported in default config IR_REMOTE_KEYMAPS="rc6_mce xbox_360 xbox_one odroid wetek_hub wetek_play_2 tanix" # build and install Joystick support (yes / no) JOYSTICK_SUPPORT="yes" # build and install CEC adapter support (yes / no) CEC_SUPPORT="yes" # build and install CEC framework support (yes / no) CEC_FRAMEWORK_SUPPORT="no" # OEM packages for OEM's (yes / no) OEM_SUPPORT="no" # build and install ALSA Audio support (yes / no) ALSA_SUPPORT="yes" # additional packages to install: # Space separated list is supported, # e.g. ADDITIONAL_PACKAGES="PACKAGE1 PACKAGE2" ADDITIONAL_PACKAGES="u-boot-script dtc CoreELEC-Debug-Scripts inject_bl301 nfs-utils dtb-xml megatools" # start SX05RE added options LIBRETRO_CORES="2048 \ 81 \ a5200 \ arduous \ atari800 \ b2 \ beetle-lynx \ beetle-ngp \ beetle-pce \ beetle-pcfx \ beetle-supergrafx \ beetle-vb \ beetle-wswan \ bk \ bluemsx \ cannonball \ cap32 \ clownmdemu \ daphne \ dice \ dinothawr \ dosbox-svn \ easyrpg \ emuscv \ ep128emu \ fake_08 \ fbalpha2012 \ fbneo \ fceumm \ fceumm-mod \ flycast \ freechaf \ freeintv \ fuse-libretro \ gambatte \ gearboy \ gearcoleco \ geargrafx \ gearlynx \ gearsystem \ genesis-plus-gx \ genesis_plus_gx_cart_special \ genesis-plus-gx-wide \ geolith \ gme \ gpsp \ gw-libretro \ handy \ hatari \ jaxe \ jollycv \ lowresnx \ m2000 \ mame2003-plus \ mame2010 \ meowpc98 \ mgba \ minivmac \ mojozork \ mrboom \ mupen64plus \ neocd_libretro \ nestopia \ nxengine \ o2em \ opera \ parallel-n64 \ pcsx_rearmed \ picodrive \ pocketcdg \ pokemini \ prboom \ prosystem \ puae \ puae2021 \ px68k \ reminiscence \ sameboy \ sameduck \ scummvm \ snes9x \ snes9x2002 \ snes9x2005_plus \ snes9x2010 \ spring \ stella \ supafaust \ tgbdual \ theodore \ tic-80 \ tyrquake \ xrick \ uae4arm \ uzem \ vba-next \ vbam \ vecx \ vice \ vircon32 \ wasm4 \ yabasanshiro" LIBRETRO_EXTRA_CORES="chailove \ crocods \ desmume \ desmume-2015 \ lutro \ melonds \ snes9x2005 \ yabause" LIBRETRO_S922X_CORES="beetle-saturn \ mesen \ mesen-s \ quicknes \ virtualjaguar" RA_PLAYLIST_NAMES=""\ "Atari - 2600.lpl;"\ "Atari - 5200.lpl;"\ "Atari - 7800.lpl;"\ "Atari - Jaguar.lpl;"\ "Atari - Lynx.lpl;"\ "Atari - ST.lpl;"\ "Bandai - WonderSwan Color.lpl;"\ "Bandai - WonderSwan.lpl;"\ "Cave Story.lpl;"\ "ChaiLove.lpl;"\ "Coleco - ColecoVision.lpl;"\ "Commodore - 64 (PP).lpl;"\ "Commodore - 64 (Tapes).lpl;"\ "Commodore - 64.lpl;"\ "Commodore - Amiga.lpl;"\ "Commodore - Plus-4.lpl;"\ "Commodore - VIC20.lpl;"\ "Dinothawr.lpl;"\ "DOOM.lpl;"\ "DOS.lpl;"\ "FBNeo - Arcade Games.lpl;"\ "Flashback.lpl;"\ "GCE - Vectrex.lpl;"\ "Lutro.lpl;"\ "Magnavox - Odyssey2.lpl;"\ "MAME 2003-Plus.lpl;"\ "MAME 2010.lpl;"\ "Mattel - Intellivision.lpl;"\ "Microsoft - MSX2.lpl;"\ "Microsoft - MSX.lpl;"\ "NEC - PC Engine SuperGrafx.lpl;"\ "NEC - PC Engine - TurboGrafx 16.lpl;"\ "Nintendo - Famicom Disk System.lpl;"\ "Nintendo - Game Boy Advance (e-Cards).lpl;"\ "Nintendo - Game Boy Advance.lpl;"\ "Nintendo - Game Boy Color.lpl;"\ "Nintendo - Game Boy.lpl;"\ "Nintendo - GameCube.lpl;"\ "Nintendo - Nintendo 3DS.lpl;"\ "Nintendo - Nintendo 64.lpl;"\ "Nintendo - Nintendo DS.lpl;"\ "Nintendo - Nintendo DS Decrypted.lpl;"\ "Nintendo - Nintendo DS (Download Play) (BETA).lpl;"\ "Nintendo - Nintendo DSi Decrypted.lpl;"\ "Nintendo - Nintendo DSi (DLC).lpl;"\ "Nintendo - Nintendo Entertainment System.lpl;"\ "Nintendo - Satellaview.lpl;"\ "Nintendo - Super Nintendo Entertainment System.lpl;"\ "Nintendo - Virtual Boy.lpl;"\ "Nintendo - Wii.lpl;"\ "Nintendo - Pokemon Mini (PokeMini).lpl;"\ "Quake.lpl;"\ "ScummVM.lpl;"\ "Sega - 32X.lpl;"\ "Sega - Dreamcast.lpl;"\ "Sega - Game Gear.lpl;"\ "Sega - Master System - Mark III.lpl;"\ "Sega - Mega Drive - Genesis.lpl;"\ "Sega - PICO.lpl;"\ "Sega - SG-1000.lpl;"\ "Sega - Saturn.lpl;"\ "Sinclair - ZX Spectrum +3.lpl;"\ "SNK - Neo Geo Pocket Color.lpl;"\ "SNK - Neo Geo Pocket.lpl;"\ "Sony - PlayStation 2.lpl;"\ "Sony - PlayStation Portable.lpl;"\ "Sony - PlayStation.lpl;"\ "Thomson - MOTO.lpl;"\ "TIC-80.lpl;"\ "The 3DO Company - 3DO.lpl" RA_PLAYLIST_CORES=""\ "/tmp/cores/stella_libretro.so;"\ "/tmp/cores/atari800_libretro.so;"\ "/tmp/cores/prosystem_libretro.so;"\ "/tmp/cores/virtualjaguar_libretro.so;"\ "/tmp/cores/handy_libretro.so;"\ "/tmp/cores/hatari_libretro.so;"\ "/tmp/cores/mednafen_wswan_libretro.so;"\ "/tmp/cores/nxengine_libretro.so;"\ "/tmp/cores/chailove_libretro.so;"\ "/tmp/cores/bluemsx_libretro.so;"\ "/tmp/cores/vice_x64_libretro.so;"\ "/tmp/cores/puae_libretro.so;"\ "/tmp/cores/vice_xplus4_libretro.so;"\ "/tmp/cores/vice_xvic_libretro.so;"\ "/tmp/cores/dinothawr_libretro.so;"\ "/tmp/cores/prboom_libretro.so;"\ "/tmp/cores/dosbox_libretro.so;"\ "/tmp/cores/fbneo_libretro.so;"\ "/tmp/cores/reminiscence_libretro.so;"\ "/tmp/cores/vecx_libretro.so;"\ "/tmp/cores/lutro_libretro.so;"\ "/tmp/cores/o2em_libretro.so;"\ "/tmp/cores/mame2003_plus_libretro.so;"\ "/tmp/cores/mame2010_libretro.so;"\ "/tmp/cores/freeintv_libretro.so;"\ "/tmp/cores/bluemsx_libretro.so;"\ "/tmp/cores/mednafen_supergrafx_libretro.so;"\ "/tmp/cores/mednafen_pce_fast_libretro.so;"\ "/tmp/cores/nestopia_libretro.so;"\ "/tmp/cores/mgba_libretro.so;"\ "/tmp/cores/gambatte_libretro.so;"\ "/tmp/cores/dolphin_libretro.so;"\ "/tmp/cores/citra_libretro.so;"\ "/tmp/cores/parallel_n64_libretro.so;"\ "/tmp/cores/desmume_libretro.so;"\ "/tmp/cores/nestopia_libretro.so;"\ "/tmp/cores/snes9x2010_libretro.so;"\ "/tmp/cores/mednafen_vb_libretro.so;"\ "/tmp/cores/dolphin_libretro.so;"\ "/tmp/cores/pokemini_libretro.so;"\ "/tmp/cores/tyrquake_libretro.so;"\ "/tmp/cores/scummvm_libretro.so;"\ "/tmp/cores/picodrive_libretro.so;"\ "/tmp/cores/flycast_libretro.so;"\ "/tmp/cores/genesis_plus_gx_libretro.so;"\ "/tmp/cores/genesis_plus_gx_cart_special_libretro.so;"\ "/tmp/cores/picodrive_libretro.so;"\ "/tmp/cores/yabause_libretro.so;"\ "/tmp/cores/fuse_libretro.so;"\ "/tmp/cores/mednafen_ngp_libretro.so;"\ "/tmp/cores/mednafen_ngp_libretro.so;"\ "/tmp/cores/play_libretro.so;"\ "/tmp/cores/ppsspp_libretro.so;"\ "/tmp/cores/pcsx_rearmed_libretro.so;"\ "/tmp/cores/theodore_libretro.so;"\ "/tmp/cores/tic80_libretro.so;"\ "/tmp/cores/4do_libretro.so;"\ "/tmp/cores/mednafen_saturn_libretro.so" ================================================ FILE: distributions/EmuELEC/show_config ================================================ show_distro_config() { # Hardware decoder support config_message+="\n\n Kodi Hardware configuration:" config_message+="\n $dashes$dashes" config_message+="\n - Video Acceleration provider:\t\t $KODIPLAYER_DRIVER" # Input device configuration config_message+="\n - Remote support:\t\t\t $REMOTE_SUPPORT" config_message+="\n - CEC Adapter support:\t\t\t $CEC_SUPPORT" config_message+="\n - CEC Framework support:\t\t $CEC_FRAMEWORK_SUPPORT" config_message+="\n - Kodi Joystick support:\t\t $JOYSTICK_SUPPORT" # Kodi configuration config_message+="\n\n Kodi Software configuration:" config_message+="\n $dashes$dashes" config_message+="\n - Kodi Blu-ray support:\t\t $KODI_BLURAY_SUPPORT" if [ "$KODI_BLURAY_SUPPORT" = "yes" ] ; then config_message+="\n - Blu-ray BD+ support:\t\t $BLURAY_BDPLUS_SUPPORT" config_message+="\n - Blu-ray AACS support:\t\t $BLURAY_AACS_SUPPORT" fi config_message+="\n - Kodi DVDCSS support:\t\t\t $KODI_DVDCSS_SUPPORT" config_message+="\n - Kodi Airplay support:\t\t $KODI_AIRPLAY_SUPPORT" config_message+="\n - Kodi Airtunes support:\t\t $KODI_AIRTUNES_SUPPORT" config_message+="\n - Kodi NFS support:\t\t\t $KODI_NFS_SUPPORT" config_message+="\n - Kodi MySQL support:\t\t\t $KODI_MYSQL_SUPPORT" config_message+="\n - Kodi Optical Drive support:\t\t $KODI_OPTICAL_SUPPORT" config_message+="\n - Kodi SAMBA client support:\t\t $KODI_SAMBA_SUPPORT" config_message+="\n - Kodi UPNP support:\t\t\t $KODI_UPNP_SUPPORT" config_message+="\n - Kodi Webserver support:\t\t $KODI_WEBSERVER_SUPPORT" for config_skin in $SKINS; do config_message+="\n - Include Skin:\t\t\t $config_skin" done config_message+="\n - Default Skin:\t\t\t $SKIN_DEFAULT" config_message+="\n - Include extra fonts:\t\t\t $KODI_EXTRA_FONTS" } ================================================ FILE: distributions/EmuELEC/splash/Amlogic-ne/progress/splash-1080-config ================================================ animation_offset_x=635 animation_offset_y=135 frames_per_second=20 ================================================ FILE: distributions/EmuELEC/splash/Amlogic-ng/progress/splash-1080-config ================================================ animation_offset_x=635 animation_offset_y=135 frames_per_second=20 ================================================ FILE: distributions/EmuELEC/splash/Amlogic-no/progress/splash-1080-config ================================================ animation_offset_x=635 animation_offset_y=135 frames_per_second=20 ================================================ FILE: distributions/EmuELEC/version ================================================ # OS_MAJOR: OS major Version OS_MAJOR="4" # OS_MINOR: OS minor Version OS_MINOR="8" # OS_VERSION: OS Version OS_VERSION="${OS_MAJOR}.${OS_MINOR}" # OS_CODENAME: OS Codename OS_CODENAME="Nexus" # OS_STAGE: OS Release Stage (alpha, beta, rc, build) OS_STAGE="alpha" # BUILD_NUM: Build number BUILD_NUM="1" # ADDON_VERSION: Addon version ADDON_VERSION=${OS_VERSION} ================================================ FILE: distributions/LibreELEC/kernel_options ================================================ # general CONFIG_DRM=y CONFIG_SQUASHFS=y CONFIG_SQUASHFS_ZSTD=y CONFIG_VFAT_FS=y CONFIG_EXT4_FS=y CONFIG_HUGETLBFS=n # netfilter CONFIG_NETFILTER=y CONFIG_NF_CONNTRACK=m CONFIG_NETFILTER_XTABLES=m CONFIG_NF_REJECT_IPV4=m CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m CONFIG_IP_NF_MANGLE=m CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_NF_REJECT_IPV6=m CONFIG_IP6_NF_IPTABLES=m CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m CONFIG_IP6_NF_MANGLE=m CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m # packages/network/iwd CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD5=y CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y CONFIG_CRYPTO_USER_API_SKCIPHER=y CONFIG_CRYPTO_DES=y CONFIG_CRYPTO_ECB=y CONFIG_CRYPTO_CBC=y CONFIG_KEY_DH_OPERATIONS=y CONFIG_KEYS=y CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS7_MESSAGE_PARSER=y CONFIG_PKCS8_PRIVATE_KEY_PARSER=m CONFIG_NLMON=m CONFIG_RFKILL=m # packages/network/wireguard CONFIG_NET=y CONFIG_INET=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_NET_UDP_TUNNEL=m CONFIG_CRYPTO_ALGAPI=y CONFIG_WIREGUARD=m # packages/sysutils/systemd CONFIG_DEVTMPFS=y CONFIG_CGROUPS=y CONFIG_INOTIFY_USER=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EPOLL=y # CONFIG_NET=y # already set in packages/network/wireguard CONFIG_SYSFS=y CONFIG_PROC_FS=y CONFIG_FHANDLE=y # CONFIG_CRYPTO_USER_API_HASH=y # already set in packages/network/iwd # CONFIG_CRYPTO_HMAC=y # already set in packages/network/iwd # CONFIG_CRYPTO_SHA256=y # already set in packages/network/iwd CONFIG_SYSFS_DEPRECATED=n CONFIG_UEVENT_HELPER=n CONFIG_FW_LOADER_USER_HELPER=n CONFIG_IPV6=y CONFIG_AUTOFS4_FS=y CONFIG_TMPFS_XATTR=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_BTRFS_FS_POSIX_ACL=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y CONFIG_KCMP=y CONFIG_RT_GROUP_SCHED=n CONFIG_CGROUP_BPF=y CONFIG_BPF_SYSCALL=y # Native language support CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y CONFIG_NLS_UTF8=y # Human Interface Device (HID) CONFIG_HID_NINTENDO=m CONFIG_NINTENDO_FF=y # Docker CONFIG_NAMESPACES=y CONFIG_NET_NS=y CONFIG_PID_NS=y CONFIG_IPC_NS=y CONFIG_UTS_NS=y # CONFIG_CGROUPS=y # already set in packages/sysutils/systemd CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_SCHED=y CONFIG_CPUSETS=y CONFIG_MEMCG=y # CONFIG_KEYS=y # already set in packages/network/iwd CONFIG_VETH=m CONFIG_BRIDGE=m CONFIG_BRIDGE_NETFILTER=m # CONFIG_IP_NF_FILTER=m # already set in netfilter # CONFIG_IP_NF_TARGET_MASQUERADE=m # already set in netfilter CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m CONFIG_NETFILTER_XT_MATCH_COMMENT=m CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m CONFIG_NETFILTER_XT_MATCH_IPVS=m CONFIG_NETFILTER_XT_MARK=m # CONFIG_IP_NF_NAT=m # already set in netfilter CONFIG_NF_NAT=m CONFIG_POSIX_MQUEUE=y # CONFIG_CGROUP_BPF=y # already set in packages/sysutils/systemd CONFIG_USER_NS=y # CONFIG_SECCOMP=y # already set in packages/sysutils/systemd # CONFIG_SECCOMP_FILTER=y # already set in packages/sysutils/systemd CONFIG_CGROUP_PIDS=y CONFIG_BLK_CGROUP=y CONFIG_BLK_DEV_THROTTLING=y CONFIG_CGROUP_PERF=y CONFIG_NET_SCHED=y CONFIG_NET_CLS_CGROUP=m CONFIG_CGROUP_NET_PRIO=y CONFIG_CFS_BANDWIDTH=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_VS=m CONFIG_IP_VS_NFCT=y CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y CONFIG_IP_VS_RR=m # CONFIG_EXT4_FS=y # already set in general # CONFIG_EXT4_FS_POSIX_ACL=y # already set in packages/sysutils/systemd CONFIG_EXT4_FS_SECURITY=y CONFIG_VXLAN=m CONFIG_BRIDGE_VLAN_FILTERING=y CONFIG_CRYPTO=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_GHASH=y CONFIG_XFRM=y CONFIG_XFRM_USER=y CONFIG_XFRM_ALGO=y CONFIG_INET_ESP=y CONFIG_IPVLAN=m CONFIG_MACVLAN=m CONFIG_DUMMY=m CONFIG_NF_NAT_FTP=m CONFIG_NF_CONNTRACK_FTP=m CONFIG_NF_NAT_TFTP=m CONFIG_NF_CONNTRACK_TFTP=m CONFIG_MD=y CONFIG_BLK_DEV_DM=m CONFIG_DM_THIN_PROVISIONING=m CONFIG_OVERLAY_FS=m ================================================ FILE: distributions/LibreELEC/options ================================================ ### DISTRO INFORMATION ### # Name of the Distro to build (full name, without special characters) DISTRONAME="LibreELEC" # short project description DESCRIPTION="LibreELEC is a fast and user-friendly Kodi Entertainment Center distribution." ### USER INTERFACE SETTINGS ### # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# LibreELEC #" GREETING2="# https://libreelec.tv #" GREETING3="##############################################" GREETING4="" # Root password to integrate in the target system ROOT_PASSWORD="libreelec" # Partition labels for USB/SD installation media DISTRO_BOOTLABEL="LIBREELEC" DISTRO_DISKLABEL="STORAGE" ### BUILDSYSTEM SETTINGS #### # LTO (Link Time Optimization) support LTO_SUPPORT="yes" # GOLD (Google Linker) support GOLD_SUPPORT="yes" # MOLD (Modern Linker) support MOLD_SUPPORT="no" # default linker (bfd / gold / mold) DEFAULT_LINKER="gold" # HARDENING (security relevant linker and compiler flags) support HARDENING_SUPPORT="no" # Default supported get handlers (archive, git, file etc.) GET_HANDLER_SUPPORT="archive" # use local ccache on build host, if available, for early package # builds before ccache has been built LOCAL_CCACHE_SUPPORT="yes" ### OS CONFIGURATION ### # Install glibc locales to the build (yes / no) GLIBC_LOCALES="yes" # additional drivers to install: # for a list of additional drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="RTL8192DU RTL8812AU" # Default size of system partition, in MB, eg. 512 SYSTEM_SIZE=512 # Default system partition offset, in sectors, eg. 2048 SYSTEM_PART_START=8192 # build with swap support (yes / no) SWAP_SUPPORT="yes" # swap support enabled per default (yes / no) SWAP_ENABLED_DEFAULT="no" # swapfile size if SWAP_SUPPORT=yes in MB SWAPFILESIZE="128" # debug tty path DEBUG_TTY="/dev/tty3" ### KODI SETTINGS ### # Mediacenter to use (kodi / no) MEDIACENTER="kodi" # Skins to install (Estuary) # Space separated list is supported, # e.g. SKINS="Estuary" SKINS="Estuary" # Default Skin (Estuary) SKIN_DEFAULT="Estuary" # install extra subtitle Fonts for KODI (yes / no) KODI_EXTRA_FONTS="yes" # build and install PulseAudio support (yes / no) PULSEAUDIO_SUPPORT="yes" # build and install pipewire support (yes / no) PIPEWIRE_SUPPORT="no" # build and install eSpeak-NG support (yes / no) ESPEAK_SUPPORT="no" # build and install with BluRay support (yes / no) KODI_BLURAY_SUPPORT="yes" # build and install with BD+ support # (BD+ decryption support in KODI) (yes / no) BLURAY_BDPLUS_SUPPORT="yes" # build and install with AACS support # (BD decryption support in KODI) (yes / no) BLURAY_AACS_SUPPORT="yes" # build and install with DVDCSS support # (DVD decryption support in KODI) (yes / no) KODI_DVDCSS_SUPPORT="yes" # build and install bluetooth support (yes / no) BLUETOOTH_SUPPORT="yes" # build and install with KODI webfrontend (yes / no) KODI_WEBSERVER_SUPPORT="yes" # build and install Avahi (Zeroconf) daemon (yes / no) AVAHI_DAEMON="yes" # build with UPnP support (yes / no) KODI_UPNP_SUPPORT="yes" # build with MySQL support (mariadb / none) KODI_MYSQL_SUPPORT="mariadb" # build xbmc with optical drive support (yes / no) KODI_OPTICAL_SUPPORT="yes" # build with AirPlay support (stream videos from iDevices to KODI) (yes / no) KODI_AIRPLAY_SUPPORT="yes" # build with AirTunes support (stream music from iDevices to KODI) (yes / no) KODI_AIRTUNES_SUPPORT="yes" # build with libnfs support (mounting nfs shares with KODI) (yes / no) KODI_NFS_SUPPORT="yes" # build with Samba Client support (mounting SAMBA shares with KODI) (yes / no) KODI_SAMBA_SUPPORT="yes" # build kodi with alsa support (yes/no) KODI_ALSA_SUPPORT="yes" # build kodi with pulseaudio support (yes/no) KODI_PULSEAUDIO_SUPPORT="yes" # build kodi with pipewire support (yes/no) KODI_PIPEWIRE_SUPPORT="no" ### KODI ADDONS ### # Distribution Specific source location DISTRO_MIRROR="http://sources.libreelec.tv/mirror" DISTRO_SRC="http://sources.libreelec.tv/$LIBREELEC_VERSION" # Addon Server Url ADDON_SERVER_URL="https://addons.libreelec.tv" # set the default addon project ADDON_PROJECT="${DEVICE:-$PROJECT}" # Settings package name - blank if not required DISTRO_PKG_SETTINGS="LibreELEC-settings" DISTRO_PKG_SETTINGS_ID="service.libreelec.settings" ### ADDITIONAL PROGRAMS / FUNCTIONS ### # Testpackages for development (yes / no) TESTING="no" # Configure debug groups (space delimited key=value pairs, with each value comma-delimited) and default group when DEBUG=yes # Use ! or - prefix to prevent a dependent package from being built with debug. Add + suffix to build dependenencies with debug. DEBUG_GROUPS="kodi+=kodi+,kodi-platform+,p8-platform+,!mesa" DEBUG_GROUP_YES="kodi+" # wireless daemon to use (wpa_supplicant/iwd) WIRELESS_DAEMON="iwd" # build and install iSCSI support - iscsistart (yes / no) ISCSI_SUPPORT="no" # build with NFS support (mounting nfs shares via the OS) (yes / no) NFS_SUPPORT="yes" # build with Samba Client support (mounting samba shares via the OS) (yes / no) SAMBA_SUPPORT="yes" # build and install Samba Server (yes / no) SAMBA_SERVER="yes" # build and install SFTP Server (yes / no) SFTP_SERVER="yes" # build and install OpenVPN support (yes / no) OPENVPN_SUPPORT="yes" # build and install WireGuard support (yes / no) WIREGUARD_SUPPORT="yes" # build and install diskmounter support (udevil) # this service provide auto mounting support for external drives in the # mediacenter also automount internally drives at boottime via udev (yes / no) UDEVIL="yes" # Support for partitioning and formating disks in initramfs (yes / no) # This adds support for parted and mkfs.ext3/4 to initramfs for OEM usage INITRAMFS_PARTED_SUPPORT="no" # build and install hfs filesystem utilities (yes / no) HFSTOOLS="yes" # build and install nano text editor (yes / no) NANO_EDITOR="yes" # cron support (yes / no) CRON_SUPPORT="yes" # build with installer (yes / no) INSTALLER_SUPPORT="yes" # build and install remote support (yes / no) REMOTE_SUPPORT="yes" # IR remote keymaps supported in default config IR_REMOTE_KEYMAPS="rc6_mce xbox_360 xbox_one" # build and install Joystick support (yes / no) JOYSTICK_SUPPORT="yes" # build and install CEC adapter support (yes / no) CEC_SUPPORT="yes" # build and install CEC framework support (yes / no) CEC_FRAMEWORK_SUPPORT="no" # OEM packages for OEM's (yes / no) OEM_SUPPORT="no" # build and install ALSA Audio support (yes / no) ALSA_SUPPORT="yes" # additional packages to install: # Space separated list is supported, # e.g. ADDITIONAL_PACKAGES="PACKAGE1 PACKAGE2" ADDITIONAL_PACKAGES="" ================================================ FILE: distributions/LibreELEC/show_config ================================================ show_distro_config() { # Hardware decoder support config_message+="\n\n Kodi Hardware configuration:" config_message+="\n ${dashes}${dashes}" config_message+="\n - Video Acceleration provider:\t\t ${KODIPLAYER_DRIVER}" # Input device configuration config_message+="\n - Remote support:\t\t\t ${REMOTE_SUPPORT}" config_message+="\n - CEC Adapter support:\t\t\t ${CEC_SUPPORT}" config_message+="\n - CEC Framework support:\t\t ${CEC_FRAMEWORK_SUPPORT}" config_message+="\n - Kodi Joystick support:\t\t ${JOYSTICK_SUPPORT}" # Kodi configuration config_message+="\n\n Kodi Software configuration:" config_message+="\n ${dashes}${dashes}" config_message+="\n - Kodi Blu-ray support:\t\t ${KODI_BLURAY_SUPPORT}" if [ "${KODI_BLURAY_SUPPORT}" = "yes" ] ; then config_message+="\n - Blu-ray BD+ support:\t\t ${BLURAY_BDPLUS_SUPPORT}" config_message+="\n - Blu-ray AACS support:\t\t ${BLURAY_AACS_SUPPORT}" fi config_message+="\n - Kodi DVDCSS support:\t\t\t ${KODI_DVDCSS_SUPPORT}" config_message+="\n - Kodi Airplay support:\t\t ${KODI_AIRPLAY_SUPPORT}" config_message+="\n - Kodi Airtunes support:\t\t ${KODI_AIRTUNES_SUPPORT}" config_message+="\n - Kodi NFS support:\t\t\t ${KODI_NFS_SUPPORT}" config_message+="\n - Kodi MySQL support:\t\t\t ${KODI_MYSQL_SUPPORT}" config_message+="\n - Kodi Optical Drive support:\t\t ${KODI_OPTICAL_SUPPORT}" config_message+="\n - Kodi SAMBA client support:\t\t ${KODI_SAMBA_SUPPORT}" config_message+="\n - Kodi UPNP support:\t\t\t ${KODI_UPNP_SUPPORT}" config_message+="\n - Kodi Webserver support:\t\t ${KODI_WEBSERVER_SUPPORT}" for config_skin in ${SKINS}; do config_message+="\n - Include Skin:\t\t\t ${config_skin}" done config_message+="\n - Default Skin:\t\t\t ${SKIN_DEFAULT}" config_message+="\n - Include extra fonts:\t\t\t ${KODI_EXTRA_FONTS}" } ================================================ FILE: distributions/LibreELEC/version ================================================ # VERSION: set full version, use "devel" for development version LIBREELEC_VERSION="devel" # OS_VERSION: OS Version OS_VERSION="11.0" # ADDON_VERSION: Addon version ADDON_VERSION="11.0.0" ================================================ FILE: licenses/7-Zip.txt ================================================ 7-Zip source code ~~~~~~~~~~~~~~~~~ License for use and distribution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 7-Zip Copyright (C) 1999-2020 Igor Pavlov. The licenses for files are: 1) CPP/7zip/Compress/Rar* files: the "GNU LGPL" with "unRAR license restriction" 2) CPP/7zip/Compress/LzfseDecoder.cpp: the "BSD 3-clause License" 3) Some files are "public domain" files, if "public domain" status is stated in source file. 4) the "GNU LGPL" for all other files. If there is no license information in some source file, that file is under the "GNU LGPL". The "GNU LGPL" with "unRAR license restriction" means that you must follow both "GNU LGPL" rules and "unRAR license restriction" rules. GNU LGPL information -------------------- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA BSD 3-clause License -------------------- The "BSD 3-clause License" is used for the code in LzfseDecoder.cpp that implements LZFSE data decompression. That code was derived from the code in the "LZFSE compression library" developed by Apple Inc, that also uses the "BSD 3-clause License": ---- Copyright (c) 2015-2016, Apple Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder(s) nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---- unRAR license restriction ------------------------- The decompression engine for RAR archives was developed using source code of unRAR program. All copyrights to original unRAR code are owned by Alexander Roshal. The license for original unRAR code has the following restriction: The unRAR sources cannot be used to re-create the RAR compression algorithm, which is proprietary. Distribution of modified unRAR sources in separate form or as a part of other software is permitted, provided that it is clearly stated in the documentation and source comments that the code may not be used to develop a RAR (WinRAR) compatible archiver. -- Igor Pavlov ================================================ FILE: licenses/APL-1.0.txt ================================================ ADAPTIVE PUBLIC LICENSE Version 1.0 THE LICENSED WORK IS PROVIDED UNDER THE TERMS OF THIS ADAPTIVE PUBLIC LICENSE ("LICENSE"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE LICENSED WORK CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS LICENSE AND ITS TERMS, WHETHER OR NOT SUCH RECIPIENT READS THE TERMS OF THIS LICENSE. "LICENSED WORK" AND "RECIPIENT" ARE DEFINED BELOW. IMPORTANT NOTE: This License is "adaptive", and the generic version or another version of an Adaptive Public License should not be relied upon to determine your rights and obligations under this License. You must read the specific Adaptive Public License that you receive with the Licensed Work, as certain terms are defined at the outset by the Initial Contributor. See Section 2.2 below, Exhibit A attached, and any Suppfile.txt accompanying this License to determine the specific adaptive features applicable to this License. For example, without limiting the foregoing, (a) for selected choice of law and jurisdiction see Part 3 of Exhibit A; (b) for the selected definition of Third Party see Part 4 of Exhibit A; and (c) for selected patent licensing terms (if any) see Section 2.2 below and Part 6 of Exhibit A. 1. DEFINITIONS. 1.1. "CONTRIBUTION" means: (a) In the case of the Initial Contributor, the Initial Work distributed under this License by the Initial Contributor; and (b) In the case of each Subsequent Contributor, the Subsequent Work originating from and distributed by such Subsequent Contributor. 1.2. "DESIGNATED WEB SITE" means the web site having the URL identified in Part 1 of Exhibit A, which URL may be changed by the Initial Contributor by posting on the current Designated Web Site the new URL for at least sixty (60) days. 1.3. "DISTRIBUTOR" means any Person that distributes the Licensed Work or any portion thereof to at least one Third Party. 1.4. "ELECTRONIC DISTRIBUTION MECHANISM" means any mechanism generally accepted in the software development community for the electronic transfer of data. 1.5. "EXECUTABLE" means the Licensed Work in any form other than Source Code. 1.6. "GOVERNING JURISDICTION" means the state, province or other legal jurisdiction identified in Part 3 of Exhibit A. 1.7. "INDEPENDENT MODULE" means a separate module of software and/or data that is not a derivative work of or copied from the Licensed Work or any portion thereof. In addition, a module does not qualify as an Independent Module but instead forms part of the Licensed Work if the module: (a) is embedded in the Licensed Work; (b) is included by reference in the Licensed Work other than by a function call or a class reference; or (c) must be included or contained, in whole or in part, within a file directory or subdirectory actually containing files making up the Licensed Work. 1.8. "INITIAL CONTRIBUTOR" means the Person or entity identified as the Initial Contributor in the notice required by Part 1 of Exhibit A. 1.9. "INITIAL WORK" means the initial Source Code, object code (if any) and documentation for the computer program identified in Part 2 of Exhibit A, as such Source Code, object code and documentation is distributed under this License by the Initial Contributor. 1.10. "LARGER WORK" means a work that combines the Licensed Work or portions thereof with code not governed by this License. 1.11. "LICENSED WORK" means the Initial Work and/or any Subsequent Work, in each case including portions thereof. 1.12. "LICENSE NOTICE" has the meaning assigned in Part 5 of Exhibit A. 1.13. "MODIFICATION" or "MODIFICATIONS" means any change to and/or addition to the Licensed Work. 1.14. "PERSON" means an individual or other legal entity, including a corporation, partnership or other body. 1.15. "RECIPIENT" means any Person who receives or obtains the Licensed Work under this License (by way of example, without limiting the foregoing, any Subsequent Contributor or Distributor). 1.16. "SOURCE CODE" means the source code for a computer program, including the source code for all modules and components of the computer program, plus any associated interface definition files, and scripts used to control compilation and installation of an executable. 1.17. "SUBSEQUENT CONTRIBUTOR" means any Person that makes or contributes to the making of any Subsequent Work and that distributes that Subsequent Work to at least one Third Party. 1.18. "SUBSEQUENT WORK" means a work that has resulted or arises from changes to and/or additions to: (a) the Initial Work; (b) any other Subsequent Work; or (c) to any combination of the Initial Work and any such other Subsequent Work; where such changes and/or additions originate from a Subsequent Contributor. A Subsequent Work will "originate" from a Subsequent Contributor if the Subsequent Work was a result of efforts by such Subsequent Contributor (or anyone acting on such Subsequent Contributor's behalf, such as, a contractor or other entity that is engaged by or under the direction of the Subsequent Contributor). For greater certainty, a Subsequent Work expressly excludes and shall not capture within its meaning any Independent Module. 1.19. "SUPPLEMENT FILE" means a file distributed with the Licensed Work having a file name "suppfile.txt". 1.20. "THIRD PARTY" has the meaning assigned in Part 4 of Exhibit A. 2. LICENSE. 2.1. COPYRIGHT LICENSE FROM INITIAL AND SUBSEQUENT CONTRIBUTORS. (a) Subject to the terms of this License, the Initial Contributor hereby grants each Recipient a world-wide, royalty-free, non-exclusive copyright license to: (i) reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Initial Work; and (ii) reproduce, publicly display, publicly perform, distribute, and sublicense any derivative works (if any) prepared by Recipient; in Source Code and Executable form, either with other Modifications, on an unmodified basis, or as part of a Larger Work. (b) Subject to the terms of this License, each Subsequent Contributor hereby grants each Recipient a world-wide, royalty-free, non-exclusive copyright license to: (i) reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Subsequent Work of such Subsequent Contributor; and (ii) reproduce, publicly display, publicly perform, distribute, and sublicense any derivative works (if any) prepared by Recipient; in Source Code and Executable form, either with other Modifications, on an unmodified basis, or as part of a Larger Work. 2.2. PATENT LICENSE FROM INITIAL AND SUBSEQUENT CONTRIBUTORS. (a) This License does not include or grant any patent license whatsoever from the Initial Contributor, Subsequent Contributor, or any Distributor unless, at the time the Initial Work is first distributed or made available under this License (as the case may be), the Initial Contributor has selected pursuant to Part 6 of Exhibit A the patent terms in paragraphs A, B, C, D and E from Part 6 of Exhibit A. If this is not done then the Initial Work and any other Subsequent Work is made available under the License without any patent license (the "PATENTS-EXCLUDED LICENSE"). (b) However, the Initial Contributor may subsequently distribute or make available (as the case may be) future copies of: (1) the Initial Work; or (2) any Licensed Work distributed by the Initial Contributor which includes the Initial Work (or any portion thereof) and/or any Modification made by the Initial Contributor; available under a License which includes a patent license (the "PATENTS-INCLUDED LICENSE") by selecting pursuant to Part 6 of Exhibit A the patent terms in paragraphs A, B, C, D and E from Part 6 of Exhibit A, when the Initial Contributor distributes or makes available (as the case may be) such future copies under this License. (c) If any Recipient receives or obtains one or more copies of the Initial Work or any other portion of the Licensed Work under the Patents-Included License, then all licensing of such copies under this License shall include the terms in paragraphs A, B, C, D and E from Part 6 of Exhibit A and that Recipient shall not be able to rely upon the Patents-Excluded License for any such copies. However, all Recipients that receive one or more copies of the Initial Work or any other portion of the Licensed Work under a copy of the License which includes the Patents-Excluded License shall have no patent license with respect to such copies received under the Patents-Excluded License and availability and distribution of such copies, including Modifications made by such Recipient to such copies, shall be under a copy of the License without any patent license. (d) Where a Recipient uses in combination or combines any copy of the Licensed Work (or portion thereof) licensed under a copy of the License having a Patents-Excluded License with any copy of the Licensed Work (or portion thereof) licensed under a copy of the License having a Patents-Included License, the combination (and any portion thereof) shall, from the first time such Recipient uses, makes available or distributes the combination (as the case may be), be subject to only the terms of the License having the Patents-Included License which shall include the terms in paragraphs A, B, C, D and E from Part 6 of Exhibit A. 2.3. ACKNOWLEDGEMENT AND DISCLAIMER. Recipient understands and agrees that although Initial Contributor and each Subsequent Contributor grants the licenses to its Contributions set forth herein, no representation, warranty, guarantee or assurance is provided by any Initial Contributor, Subsequent Contributor, or Distributor that the Licensed Work does not infringe the patent or other intellectual property rights of any other entity. Initial Contributor, Subsequent Contributor, and each Distributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise, in relation to the Licensed Works. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, without limiting the foregoing disclaimers, if a third party patent license is required to allow Recipient to distribute the Licensed Work, it is Recipient's responsibility to acquire that license before distributing the Licensed Work. 2.4. RESERVATION. Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Initial Contributor, Subsequent Contributor, or Distributor except as expressly stated herein. 3. DISTRIBUTION OBLIGATIONS. 3.1. DISTRIBUTION GENERALLY. (a) A Subsequent Contributor shall make that Subsequent Contributor's Subsequent Work(s) available to the public via an Electronic Distribution Mechanism for a period of at least twelve (12) months. The aforesaid twelve (12) month period shall begin within a reasonable time after the creation of the Subsequent Work and no later than sixty (60) days after first distribution of that Subsequent Contributor's Subsequent Work. (b) All Distributors must distribute the Licensed Work in accordance with the terms of the License, and must include a copy of this License (including without limitation Exhibit A and the accompanying Supplement File) with each copy of the Licensed Work distributed. In particular, this License must be prominently distributed with the Licensed Work in a file called "license.txt." In addition, the License Notice in Part 5 of Exhibit A must be included at the beginning of all Source Code files, and viewable to a user in any executable such that the License Notice is reasonably brought to the attention of any party using the Licensed Work. 3.2. EXECUTABLE DISTRIBUTIONS OF THE LICENSED WORK. A Distributor may choose to distribute the Licensed Work, or any portion thereof, in Executable form (an "EXECUTABLE DISTRIBUTION") to any third party, under the terms of Section 2 of this License, provided the Executable Distribution is made available under and accompanied by a copy of this License, AND provided at least ONE of the following conditions is fulfilled: (a) The Executable Distribution must be accompanied by the Source Code for the Licensed Work making up the Executable Distribution, and the Source Code must be distributed on the same media as the Executable Distribution or using an Electronic Distribution Mechanism; or (b) The Executable Distribution must be accompanied with a written offer, valid for at least thirty six (36) months, to give any third party under the terms of this License, for a charge no more than the cost of physically performing source distribution, a complete machine-readable copy of the Source Code for the Licensed Work making up the Executable Distribution, to be available and distributed using an Electronic Distribution Mechanism, and such Executable Distribution must remain available in Source Code form to any third party via the Electronic Distribution Mechanism (or any replacement Electronic Distribution Mechanism the particular Distributor may reasonably need to turn to as a substitute) for said at least thirty six (36) months. For greater certainty, the above-noted requirements apply to any Licensed Work or portion thereof distributed to any third party in Executable form, whether such distribution is made alone, in combination with a Larger Work or Independent Modules, or in some other combination. 3.3. SOURCE CODE DISTRIBUTIONS. When a Distributor makes the Licensed Work, or any portion thereof, available to any Person in Source Code form, it must be made available under this License and a copy of this License must be included with each copy of the Source Code, situated so that the copy of the License is conspicuously brought to the attention of that Person. For greater clarification, this Section 3.3 applies to all distribution of the Licensed Work in any Source Code form. A Distributor may charge a fee for the physical act of transferring a copy, which charge shall be no more than the cost of physically performing source distribution. 3.4. REQUIRED NOTICES IN SOURCE CODE. Each Subsequent Contributor must ensure that the notice set out in Part 5 of Exhibit A is included in each file of the Source Code for each Subsequent Work originating from that particular Subsequent Contributor, if such notice is not already included in each such file. If it is not possible to put such notice in a particular Source Code file due to its structure, then the Subsequent Contributor must include such notice in a location (such as a relevant directory in which the file is stored) where a user would be likely to look for such a notice. 3.5. NO DISTRIBUTION REQUIREMENTS FOR INTERNALLY USED MODIFICATIONS. Notwithstanding Sections 3.2, 3.3 and 3.4, Recipient may, internally within its own corporation or organization use the Licensed Work, including the Initial Work and Subsequent Works, and make Modifications for internal use within Recipient's own corporation or organization (collectively, "INTERNAL USE MODIFICATIONS"). The Recipient shall have no obligation to distribute, in either Source Code or Executable form, any such Internal Use Modifications made by Recipient in the course of such internal use, except where required below in this Section 3.5. All Internal Use Modifications distributed to any Person, whether or not a Third Party, shall be distributed pursuant to and be accompanied by the terms of this License. If the Recipient chooses to distribute any such Internal Use Modifications to any Third Party, then the Recipient shall be deemed a Subsequent Contributor, and any such Internal Use Modifications distributed to any Third Party shall be deemed a Subsequent Work originating from that Subsequent Contributor, and shall from the first such instance become part of the Licensed Work that must thereafter be distributed and made available to third parties in accordance with the terms of Sections 3.1 to 3.4 inclusive. 3.6. INDEPENDENT MODULES. This License shall not apply to Independent Modules of any Initial Contributor, Subsequent Contributor, Distributor or any Recipient, and such Independent Modules may be licensed or made available under one or more separate license agreements. 3.7. LARGER WORKS. Any Distributor or Recipient may create or contribute to a Larger Work by combining any of the Licensed Work with other code not governed by the terms of this License, and may distribute the Larger Work as one or more products. However, in any such case, Distributor or Recipient (as the case may be) must make sure that the requirements of this License are fulfilled for the Licensed Work portion of the Larger Work. 3.8. DESCRIPTION OF DISTRIBUTED MODIFICATIONS. (a) Each Subsequent Contributor (including the Initial Contributor where the Initial Contributor also qualifies as a Subsequent Contributor) must cause each Subsequent Work created or contributed to by that Subsequent Contributor to contain a file documenting the changes, in accordance with the requirements of Part 1 of the Supplement File, that such Subsequent Contributor made in the creation or contribution to that Subsequent Work. If no Supplement File exists or no requirements are set out in Part 1 of the Supplement File, then there are no requirements for Subsequent Contributors to document changes that they make resulting in Subsequent Works. (b) The Initial Contributor may at any time introduce requirements or add to or change earlier requirements (in each case, the "EARLIER DESCRIPTION REQUIREMENTS") for documenting changes resulting in Subsequent Works by revising Part 1 of each copy of the Supplement File distributed by the Initial Contributor with future copies of the Licensed Work so that Part 1 then contains new requirements (the "NEW DESCRIPTION REQUIREMENTS") for documenting such changes. (c) Any Recipient receiving at any time any copy of an Initial Work or any Subsequent Work under a copy of this License (in each case, an "Earlier LICENSED COPY") having the Earlier Description Requirements may choose, with respect to each such Earlier Licensed Copy, to comply with the Earlier Description Requirements or the New Description Requirements. Where a Recipient chooses to comply with the New Description Requirements, that Recipient will, when thereafter distributing any copies of any such Earlier Licensed Copy, include a Supplement File having a section entitled Part 1 that contains a copy of the New Description Requirements. (d) For greater certainty, the intent of Part 1 of the Supplement File is to provide a mechanism (if any) by which Subsequent Contributors must document changes that they make to the Licensed Work resulting in Subsequent Works. Part 1 of any Supplement File shall not be used to increase or reduce the scope of the license granted in Article 2 of this License or in any other way increase or decrease the rights and obligations of any Recipient, and shall at no time serve as the basis for terminating the License. Further, a Recipient can be required to correct and change its documentation procedures to comply with Part 1 of the Supplement File, but cannot be penalised with damages. Part 1 of any Supplement File is only binding on each Recipient of any Licensed Work to the extent Part 1 sets out the requirements for documenting changes to the Initial Work or any Subsequent Work. (e) An example of a set of requirements for documenting changes and contributions made by Subsequent Contributor is set out in Part 7 of Exhibit A of this License. Part 7 is a sample only and is not binding on Recipients, unless (subject to the earlier paragraphs of this Section 3.8) those are the requirements that the Initial Contributor includes in Part 1 of the Supplement File with the copies of the Initial Work distributed under this License. 3.9. USE OF DISTRIBUTOR NAME. The name of a Distributor may not be used by any other Distributor to endorse or promote the Licensed Work or products derived from the Licensed Work, without prior written permission. 3.10. LIMITED RECOGNITION OF INITIAL CONTRIBUTOR. (a) As a modest attribution to the Initial Contributor, in the hope that its promotional value may help justify the time, money and effort invested in writing the Initial Work, the Initial Contributor may include in Part 2 of the Supplement File a requirement that each time an executable program resulting from the Initial Work or any Subsequent Work, or a program dependent thereon, is launched or run, a prominent display of the Initial Contributor's attribution information must occur (the "ATTRIBUTION INFORMATION"). The Attribution Information must be included at the beginning of each Source Code file. For greater certainty, the Initial Contributor may specify in the Supplement File that the above attribution requirement only applies to an executable program resulting from the Initial Work or any Subsequent Work, but not a program dependent thereon. The intent is to provide for reasonably modest attribution, therefore the Initial Contributor may not require Recipients to display, at any time, more than the following Attribution Information: (a) a copyright notice including the name of the Initial Contributor; (b) a word or one phrase (not exceeding 10 words); (c) one digital image or graphic provided with the Initial Work; and (d) a URL (collectively, the "ATTRIBUTION LIMITS"). (b) If no Supplement File exists, or no Attribution Information is set out in Part 2 of the Supplement File, then there are no requirements for Recipients to display any Attribution Information of the Initial Contributor. (c) Each Recipient acknowledges that all trademarks, service marks and/or trade names contained within Part 2 of the Supplement File distributed with the Licensed Work are the exclusive property of the Initial Contributor and may only be used with the permission of the Initial Contributor, or under circumstances otherwise permitted by law, or as expressly set out in this License. 3.11. For greater certainty, any description or attribution provisions contained within a Supplement File may only be used to specify the nature of the description or attribution requirements, as the case may be. Any provision in a Supplement File that otherwise purports to modify, vary, nullify or amend any right, obligation or representation contained herein shall be deemed void to that extent, and shall be of no force or effect. 4. COMMERCIAL USE AND INDEMNITY. 4.1. COMMERCIAL SERVICES. A Recipient ("COMMERCIAL RECIPIENT") may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations (collectively, "SERVICES") to one or more other Recipients or Distributors. However, such Commercial Recipient may do so only on that Commercial Recipient's own behalf, and not on behalf of any other Distributor or Recipient, and Commercial Recipient must make it clear than any such warranty, support, indemnity or liability obligation(s) is/are offered by Commercial Recipient alone. At no time may Commercial Recipient use any Services to deny any party the Licensed Work in Source Code or Executable form when so required under any of the other terms of this License. For greater certainty, this Section 4.1 does not diminish any of the other terms of this License, including without limitation the obligation of the Commercial Recipient as a Distributor, when distributing any of the Licensed Work in Source Code or Executable form, to make such distribution royalty-free (subject to the right to charge a fee of no more than the cost of physically performing Source Code or Executable distribution (as the case may be)). 4.2. INDEMNITY. Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this License is intended to facilitate the commercial use of the Licensed Work, the Distributor who includes any of the Licensed Work in a commercial product offering should do so in a manner which does not create potential liability for other Distributors. Therefore, if a Distributor includes the Licensed Work in a commercial product offering or offers any Services, such Distributor ("COMMERCIAL DISTRIBUTOR") hereby agrees to defend and indemnify every other Distributor or Subsequent Contributor (in each case an "INDEMNIFIED PARTY") against any losses, damages and costs (collectively "LOSSES") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Party to the extent caused by the acts or omissions of such Commercial Distributor in connection with its distribution of any of the Licensed Work in a commercial product offering or in connection with any Services. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Party must: (a) promptly notify the Commercial Distributor in writing of such claim; and (b) allow the Commercial Distributor to control, and co-operate with the Commercial Distributor in, the defense and any related settlement negotiations. The Indemnified Party may participate in any such claim at its own expense. 5. VERSIONS OF THE LICENSE. 5.1. NEW VERSIONS. The Initial Contributor may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. 5.2. EFFECT OF NEW VERSIONS. Once the Licensed Work or any portion thereof has been published by Initial Contributor under a particular version of the License, Recipient may choose to continue to use it under the terms of that version. However, if a Recipient chooses to use the Licensed Work under the terms of any subsequent version of the License published by the Initial Contributor, then from the date of making this choice, the Recipient must comply with the terms of that subsequent version with respect to all further reproduction, preparation of derivative works, public display of, public performance of, distribution and sublicensing by the Recipient in connection with the Licensed Work. No one other than the Initial Contributor has the right to modify the terms applicable to the Licensed Work 6. DISCLAIMER OF WARRANTY. 6.1. GENERAL DISCLAIMER. EXCEPT AS EXPRESSLY SET FORTH IN THIS LICENSE, THE LICENSED WORK IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT ANY REPRESENTATION, WARRANTY, GUARANTEE, ASSURANCE OR CONDITION OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LICENSED WORK IS WITH RECIPIENT. SHOULD ANY LICENSED WORK PROVE DEFECTIVE IN ANY RESPECT, RECIPIENT (NOT THE INITIAL CONTRIBUTOR OR ANY SUBSEQUENT CONTRIBUTOR) ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS CLAUSE CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY LICENSED WORK IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS LICENSE INCLUDING WITHOUT LIMITATION THIS DISCLAIMER. 6.2. RESPONSIBILITY OF RECIPIENTS. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Licensed Work and assumes all risks associated with its exercise of rights under this License, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 7. TERMINATION. 7.1. This License shall continue until terminated in accordance with the express terms herein. 7.2. Recipient may choose to terminate this License automatically at any time. 7.3. This License, including without limitation the rights granted hereunder to a particular Recipient, will terminate automatically if such Recipient is in material breach of any of the terms of this License and fails to cure such breach within sixty (60) days of becoming aware of the breach. Without limiting the foregoing, any material breach by such Recipient of any term of any other License under which such Recipient is granted any rights to the Licensed Work shall constitute a material breach of this License. 7.4. Upon termination of this License by or with respect to a particular Recipient for any reason, all rights granted hereunder and under any other License to that Recipient shall terminate. However, all sublicenses to the Licensed Work which were previously properly granted by such Recipient under a copy of this License (in each case, an "Other License" and in plural, "Other Licenses") shall survive any such termination of this License, including without limitation the rights and obligations under such Other Licenses as set out in their respective Sections 2, 3, 4, 5, 6, 7 and 8, mutatis mutandis, for so long as the respective sublicensees (i.e. other Recipients) remain in compliance with the terms of the copy of this License under which such sublicensees received rights to the Licensed Work. Any termination of such Other Licenses shall be pursuant to their respective Section 7, mutatis mutandis. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 7.5. Upon any termination of this License by or with respect to a particular Recipient, Sections 4.1, 4.2, 6.1, 6.2, 7.4, 7.5, 8.1, and 8.2, together with all provisions of this License necessary for the interpretation and enforcement of same, shall expressly survive such termination. 8. LIMITATION OF LIABILITY. 8.1. IN NO EVENT SHALL ANY OF INITIAL CONTRIBUTOR, ITS SUBSIDIARIES, OR AFFILIATES, OR ANY OF ITS OR THEIR RESPECTIVE OFFICERS, DIRECTORS, EMPLOYEES, AND/OR AGENTS (AS THE CASE MAY BE), HAVE ANY LIABILITY FOR ANY DIRECT DAMAGES, INDIRECT DAMAGES, PUNITIVE DAMAGES, INCIDENTAL DAMAGES, SPECIAL DAMAGES, EXEMPLARY DAMAGES, CONSEQUENTIAL DAMAGES OR ANY OTHER DAMAGES WHATSOEVER (INCLUDING WITHOUT LIMITATION LOSS OF USE, DATA OR PROFITS, OR ANY OTHER LOSS ARISING OUT OF OR IN ANY WAY RELATED TO THE USE, INABILITY TO USE, UNAUTHORIZED USE, PERFORMANCE, OR NON-PERFORMANCE OF THE LICENSED WORK OR ANY PART THEREOF OR THE PROVISION OF OR FAILURE TO PROVIDE SUPPORT SERVICES, OR THAT RESULT FROM ERRORS, DEFECTS, OMISSIONS, DELAYS IN OPERATION OR TRANSMISSION, OR ANY OTHER FAILURE OF PERFORMANCE), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) IN RELATION TO OR ARISING IN ANY WAY OUT OF THIS LICENSE OR THE USE OR DISTRIBUTION OF THE LICENSED WORK OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. THIS CLAUSE CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY LICENSED WORK IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS LICENSE INCLUDING WITHOUT LIMITATION THE LIMITATIONS SET FORTH IN THIS SECTION 8.1. 8.2. EXCEPT AS EXPRESSLY SET FORTH IN THIS LICENSE, EACH RECIPIENT SHALL NOT HAVE ANY LIABILITY FOR ANY EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE LICENSED WORK OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. 9. GOVERNING LAW AND LEGAL ACTION. 9.1. This License shall be governed by and construed in accordance with the laws of the Governing Jurisdiction assigned in Part 3 of Exhibit A, without regard to its conflict of law provisions. No party may bring a legal action under this License more than one year after the cause of the action arose. Each party waives its rights (if any) to a jury trial in any litigation arising under this License. Note that if the Governing Jurisdiction is not assigned in Part 3 of Exhibit A, then the Governing Jurisdiction shall be the State of New York. 9.2. The courts of the Governing Jurisdiction shall have jurisdiction, but not exclusive jurisdiction, to entertain and determine all disputes and claims, whether for specific performance, injunction, damages or otherwise, both at law and in equity, arising out of or in any way relating to this License, including without limitation, the legality, validity, existence and enforceability of this License. Each party to this License hereby irrevocably attorns to and accepts the jurisdiction of the courts of the Governing Jurisdiction for such purposes. 9.3. Except as expressly set forth elsewhere herein, in the event of any action or proceeding brought by any party against another under this License the prevailing party shall be entitled to recover all costs and expenses including the fees of its attorneys in such action or proceeding in such amount as the court may adjudge reasonable. 10. MISCELLANEOUS. 10.1. The obligations imposed by this License are for the benefit of the Initial Contributor and any Recipient, and each Recipient acknowledges and agrees that the Initial Contributor and/or any other Recipient may enforce the terms and conditions of this License against any Recipient. 10.2. This License represents the complete agreement concerning subject matter hereof, and supersedes and cancels all previous oral and written communications, representations, agreements and understandings between the parties with respect to the subject matter hereof. 10.3. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. 10.4. The language in all parts of this License shall be in all cases construed simply according to its fair meaning, and not strictly for or against any of the parties hereto. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. 10.5. If any provision of this License is invalid or unenforceable under the laws of the Governing Jurisdiction, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. 10.6. The paragraph headings of this License are for reference and convenience only and are not a part of this License, and they shall have no effect upon the construction or interpretation of any part hereof. 10.7. Each of the terms "including", "include" and "includes", when used in this License, is not limiting whether or not non-limiting language (such as "without limitation" or "but not limited to" or words of similar import) is used with reference thereto. 10.8. The parties hereto acknowledge they have expressly required that this License and notices relating thereto be drafted in the English language. //***THE LICENSE TERMS END HERE (OTHER THAN AS SET OUT IN EXHIBIT A).***// EXHIBIT A (to the Adaptive Public License) PART 1: INITIAL CONTRIBUTOR AND DESIGNATED WEB SITE The Initial Contributor is: ____________________________________________________   [Enter full name of Initial Contributor] Address of Initial Contributor: ________________________________________________   ________________________________________________   ________________________________________________   [Enter address above] The Designated Web Site is: __________________________________________________   [Enter URL for Designated Web Site of Initial Contributor] NOTE: The Initial Contributor is to complete this Part 1, along with Parts 2, 3, and 5, and, if applicable, Parts 4 and 6. PART 2: INITIAL WORK The Initial Work comprises the computer program(s) distributed by the Initial Contributor having the following title(s): _______________________________________________. The date on which the Initial Work was first available under this License: _________________ PART 3: GOVERNING JURISDICTION For the purposes of this License, the Governing Jurisdiction is _________________________________________________. 
[Initial Contributor to Enter Governing Jurisdiction here] PART 4: THIRD PARTIES For the purposes of this License, "Third Party" has the definition set forth below in the ONE paragraph selected by the Initial Contributor from paragraphs A, B, C, D and E when the Initial Work is distributed or otherwise made available by the Initial Contributor. To select one of the following paragraphs, the Initial Contributor must place an "X" or "x" in the selection box alongside the one respective paragraph selected. SELECTION   BOX PARAGRAPH [  ] A. "THIRD PARTY" means any third party.     [  ] B. "THIRD PARTY" means any third party except for any of the following: (a) a wholly owned subsidiary of the Subsequent Contributor in question; (b) a legal entity (the "PARENT") that wholly owns the Subsequent Contributor in question; or (c) a wholly owned subsidiary of the wholly owned subsidiary in (a) or of the Parent in (b).     [  ] C. "THIRD PARTY" means any third party except for any of the following: (a) any Person directly or indirectly owning a majority of the voting interest in the Subsequent Contributor or (b) any Person in which the Subsequent Contributor directly or indirectly owns a majority voting interest.     [  ] D. "THIRD PARTY" means any third party except for any Person directly or indirectly controlled by the Subsequent Contributor. For purposes of this definition, "control" shall mean the power to direct or cause the direction of, the management and policies of such Person whether through the ownership of voting interests, by contract, or otherwise.     [  ] E. "THIRD PARTY" means any third party except for any Person directly or indirectly controlling, controlled by, or under common control with the Subsequent Contributor. For purposes of this definition, "control" shall mean the power to direct or cause the direction of, the management and policies of such Person whether through the ownership of voting interests, by contract, or otherwise. The default definition of "THIRD PARTY" is the definition set forth in paragraph A, if NONE OR MORE THAN ONE of paragraphs A, B, C, D or E in this Part 4 are selected by the Initial Contributor. PART 5: NOTICE THE LICENSED WORK IS PROVIDED UNDER THE TERMS OF THE ADAPTIVE PUBLIC LICENSE ("LICENSE") AS FIRST COMPLETED BY: ______________________ [Insert the name of the Initial Contributor here]. ANY USE, PUBLIC DISPLAY, PUBLIC PERFORMANCE, REPRODUCTION OR DISTRIBUTION OF, OR PREPARATION OF DERIVATIVE WORKS BASED ON, THE LICENSED WORK CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS LICENSE AND ITS TERMS, WHETHER OR NOT SUCH RECIPIENT READS THE TERMS OF THE LICENSE. "LICENSED WORK" AND "RECIPIENT" ARE DEFINED IN THE LICENSE. A COPY OF THE LICENSE IS LOCATED IN THE TEXT FILE ENTITLED "LICENSE.TXT" ACCOMPANYING THE CONTENTS OF THIS FILE. IF A COPY OF THE LICENSE DOES NOT ACCOMPANY THIS FILE, A COPY OF THE LICENSE MAY ALSO BE OBTAINED AT THE FOLLOWING WEB SITE: ___________________________________________________[Insert Initial Contributor's Designated Web Site here] Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. PART 6: PATENT LICENSING TERMS For the purposes of this License, paragraphs A, B, C, D and E of this Part 6 of Exhibit A are only incorporated and form part of the terms of the License if the Initial Contributor places an "X" or "x" in the selection box alongside the YES answer to the question immediately below. Is this a Patents-Included License pursuant to Section 2.2 of the License? YES [      ] NO [      ] By default, if YES is not selected by the Initial Contributor, the answer is NO. A. For the purposes of the paragraphs in this Part 6 of Exhibit A, "LICENSABLE" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights granted herein. B. The Initial Contributor hereby grants all Recipients a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims, under patent claim(s) Licensable by the Initial Contributor that are or would be infringed by the making, using, selling, offering for sale, having made, importing, exporting, transfer or disposal of such Initial Work or any portion thereof. Notwithstanding the foregoing, no patent license is granted under this Paragraph B by the Initial Contributor: (1) for any code that the Initial Contributor deletes from the Initial Work (or any portion thereof) distributed by the Initial Contributor prior to such distribution; (2) for any Modifications made to the Initial Work (or any portion thereof) by any other Person; or (3) separate from the Initial Work (or portions thereof) distributed or made available by the Initial Contributor. C. Effective upon distribution by a Subsequent Contributor to a Third Party of any Modifications made by that Subsequent Contributor, such Subsequent Contributor hereby grants all Recipients a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims, under patent claim(s) Licensable by such Subsequent Contributor that are or would be infringed by the making, using, selling, offering for sale, having made, importing, exporting, transfer or disposal of any such Modifications made by that Subsequent Contributor alone and/or in combination with its Subsequent Work (or portions of such combination) to make, use, sell, offer for sale, have made, import, export, transfer and otherwise dispose of: (1) Modifications made by that Subsequent Contributor (or portions thereof); and (2) the combination of Modifications made by that Subsequent Contributor with its Subsequent Work (or portions of such combination); (collectively and in each case, the "SUBSEQUENT CONTRIBUTOR VERSION"). Notwithstanding the foregoing, no patent license is granted under this Paragraph C by such Subsequent Contributor: (1) for any code that such Subsequent Contributor deletes from the Subsequent Contributor Version (or any portion thereof) distributed by the Subsequent Contributor prior to such distribution; (2) for any Modifications made to the Subsequent Contributor Version (or any portion thereof) by any other Person; or (3) separate from the Subsequent Contributor Version (or portions thereof) distributed or made available by the Subsequent Contributor. D. Effective upon distribution of any Licensed Work by a Distributor to a Third Party, such Distributor hereby grants all Recipients a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims, under patent claim(s) Licensable by such Distributor that are or would be infringed by the making, using, selling, offering for sale, having made, importing, exporting, transfer or disposal of any such Licensed Work distributed by such Distributor, to make, use, sell, offer for sale, have made, import, export, transfer and otherwise dispose of such Licensed Work or portions thereof (collectively and in each case, the "DISTRIBUTOR VERSION"). Notwithstanding the foregoing, no patent license is granted under this Paragraph D by such Distributor: (1) for any code that such Distributor deletes from the Distributor Version (or any portion thereof) distributed by the Distributor prior to such distribution; (2) for any Modifications made to the Distributor Version (or any portion thereof) by any other Person; or (3) separate from the Distributor Version (or portions thereof) distributed or made available by the Distributor. E. If Recipient institutes patent litigation against another Recipient (a "USER") with respect to a patent applicable to a computer program or software (including a cross-claim or counterclaim in a lawsuit, and whether or not any of the patent claims are directed to a system, method, process, apparatus, device, product, article of manufacture or any other form of patent claim), then any patent or copyright license granted by that User to such Recipient under this License or any other copy of this License shall terminate. The termination shall be effective ninety (90) days after notice of termination from User to Recipient, unless the Recipient withdraws the patent litigation claim before the end of the ninety (90) day period. To be effective, any such notice of license termination must include a specific list of applicable patents and/or a copy of the copyrighted work of User that User alleges will be infringed by Recipient upon License termination. License termination is only effective with respect to patents and/or copyrights for which proper notice has been given. PART 7: SAMPLE REQUIREMENTS FOR THE DESCRIPTION OF DISTRIBUTED MODIFICATIONS Each Subsequent Contributor (including the Initial Contributor where the Initial Contributor qualifies as a Subsequent Contributor) is invited (but not required) to cause each Subsequent Work created or contributed to by that Subsequent Contributor to contain a file documenting the changes such Subsequent Contributor made to create that Subsequent Work and the date of any change. //***EXHIBIT A ENDS HERE.***// ================================================ FILE: licenses/APSL-2.0.txt ================================================ APPLE PUBLIC SOURCE LICENSE Version 2.0 - August 6, 2003 Please read this License carefully before downloading this software. By downloading or using this software, you are agreeing to be bound by the terms of this License. If you do not or cannot agree to the terms of this License, please do not download or use the software. Apple Note: In January 2007, Apple changed its corporate name from "Apple Computer, Inc." to "Apple Inc." This change has been reflected below and copyright years updated, but no other changes have been made to the APSL 2.0. 1. General; Definitions. This License applies to any program or other work which Apple Inc. ("Apple") makes publicly available and which contains a notice placed by Apple identifying such program or work as "Original Code" and stating that it is subject to the terms of this Apple Public Source License version 2.0 ("License"). As used in this License: 1.1 "Applicable Patent Rights" mean: (a) in the case where Apple is the grantor of rights, (i) claims of patents that are now or hereafter acquired, owned by or assigned to Apple and (ii) that cover subject matter contained in the Original Code, but only to the extent necessary to use, reproduce and/or distribute the Original Code without infringement; and (b) in the case where You are the grantor of rights, (i) claims of patents that are now or hereafter acquired, owned by or assigned to You and (ii) that cover subject matter in Your Modifications, taken alone or in combination with Original Code. 1.2 "Contributor" means any person or entity that creates or contributes to the creation of Modifications. 1.3 "Covered Code" means the Original Code, Modifications, the combination of Original Code and any Modifications, and/or any respective portions thereof. 1.4 "Externally Deploy" means: (a) to sublicense, distribute or otherwise make Covered Code available, directly or indirectly, to anyone other than You; and/or (b) to use Covered Code, alone or as part of a Larger Work, in any way to provide a service, including but not limited to delivery of content, through electronic communication with a client other than You. 1.5 "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. 1.6 "Modifications" mean any addition to, deletion from, and/or change to, the substance and/or structure of the Original Code, any previous Modifications, the combination of Original Code and any previous Modifications, and/or any respective portions thereof. When code is released as a series of files, a Modification is: (a) any addition to or deletion from the contents of a file containing Covered Code; and/or (b) any new file or other representation of computer program statements that contains any part of Covered Code. 1.7 "Original Code" means (a) the Source Code of a program or other work as originally made available by Apple under this License, including the Source Code of any updates or upgrades to such programs or works made available by Apple under this License, and that has been expressly identified by Apple as such in the header file(s) of such work; and (b) the object code compiled from such Source Code and originally made available by Apple under this License 1.8 "Source Code" means the human readable form of a program or other work that is suitable for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an executable (object code). 1.9 "You" or "Your" means an individual or a legal entity exercising rights under this License. For legal entities, "You" or "Your" includes any entity which controls, is controlled by, or is under common control with, You, where "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. 2. Permitted Uses; Conditions & Restrictions. Subject to the terms and conditions of this License, Apple hereby grants You, effective on the date You accept this License and download the Original Code, a world-wide, royalty-free, non-exclusive license, to the extent of Apple's Applicable Patent Rights and copyrights covering the Original Code, to do the following: 2.1 Unmodified Code. You may use, reproduce, display, perform, internally distribute within Your organization, and Externally Deploy verbatim, unmodified copies of the Original Code, for commercial or non-commercial purposes, provided that in each instance: (a) You must retain and reproduce in all copies of Original Code the copyright and other proprietary notices and disclaimers of Apple as they appear in the Original Code, and keep intact all notices in the Original Code that refer to this License; and (b) You must include a copy of this License with every copy of Source Code of Covered Code and documentation You distribute or Externally Deploy, and You may not offer or impose any terms on such Source Code that alter or restrict this License or the recipients' rights hereunder, except as permitted under Section 6. 2.2 Modified Code. You may modify Covered Code and use, reproduce, display, perform, internally distribute within Your organization, and Externally Deploy Your Modifications and Covered Code, for commercial or non-commercial purposes, provided that in each instance You also meet all of these conditions: (a) You must satisfy all the conditions of Section 2.1 with respect to the Source Code of the Covered Code; (b) You must duplicate, to the extent it does not already exist, the notice in Exhibit A in each file of the Source Code of all Your Modifications, and cause the modified files to carry prominent notices stating that You changed the files and the date of any change; and (c) If You Externally Deploy Your Modifications, You must make Source Code of all Your Externally Deployed Modifications either available to those to whom You have Externally Deployed Your Modifications, or publicly available. Source Code of Your Externally Deployed Modifications must be released under the terms set forth in this License, including the license grants set forth in Section 3 below, for as long as you Externally Deploy the Covered Code or twelve (12) months from the date of initial External Deployment, whichever is longer. You should preferably distribute the Source Code of Your Externally Deployed Modifications electronically (e.g. download from a web site). 2.3 Distribution of Executable Versions. In addition, if You Externally Deploy Covered Code (Original Code and/or Modifications) in object code, executable form only, You must include a prominent notice, in the code itself as well as in related documentation, stating that Source Code of the Covered Code is available under the terms of this License with information on how and where to obtain such Source Code. 2.4 Third Party Rights. You expressly acknowledge and agree that although Apple and each Contributor grants the licenses to their respective portions of the Covered Code set forth herein, no assurances are provided by Apple or any Contributor that the Covered Code does not infringe the patent or other intellectual property rights of any other entity. Apple and each Contributor disclaim any liability to You for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, You hereby assume sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow You to distribute the Covered Code, it is Your responsibility to acquire that license before distributing the Covered Code. 3. Your Grants. In consideration of, and as a condition to, the licenses granted to You under this License, You hereby grant to any person or entity receiving or distributing Covered Code under this License a non-exclusive, royalty-free, perpetual, irrevocable license, under Your Applicable Patent Rights and other intellectual property rights (other than patent) owned or controlled by You, to use, reproduce, display, perform, modify, sublicense, distribute and Externally Deploy Your Modifications of the same scope and extent as Apple's licenses under Sections 2.1 and 2.2 above. 4. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In each such instance, You must make sure the requirements of this License are fulfilled for the Covered Code or any portion thereof. 5. Limitations on Patent License. Except as expressly stated in Section 2, no other patent rights, express or implied, are granted by Apple herein. Modifications and/or Larger Works may require additional patent licenses from Apple which Apple may grant in its sole discretion. 6. Additional Terms. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations and/or other rights consistent with the scope of the license granted herein ("Additional Terms") to one or more recipients of Covered Code. However, You may do so only on Your own behalf and as Your sole responsibility, and not on behalf of Apple or any Contributor. You must obtain the recipient's agreement that any such Additional Terms are offered by You alone, and You hereby agree to indemnify, defend and hold Apple and every Contributor harmless for any liability incurred by or claims asserted against Apple or such Contributor by reason of any such Additional Terms. 7. Versions of the License. Apple may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Once Original Code has been published under a particular version of this License, You may continue to use it under the terms of that version. You may also choose to use such Original Code under the terms of any subsequent version of this License published by Apple. No one other than Apple has the right to modify the terms applicable to Covered Code created under this License. 8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in part pre-release, untested, or not fully tested works. The Covered Code may contain errors that could cause failures or loss of data, and may be incomplete or contain inaccuracies. You expressly acknowledge and agree that use of the Covered Code, or any portion thereof, is at Your sole and entire risk. THE COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF ANY KIND AND APPLE AND APPLE'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS "APPLE" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. APPLE AND EACH CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY APPLE, AN APPLE AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. You acknowledge that the Covered Code is not intended for use in the operation of nuclear facilities, aircraft navigation, communication systems, or air traffic control machines in which case the failure of the Covered Code could lead to death, personal injury, or severe physical or environmental damage. 9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT SHALL APPLE OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF APPLE OR SUCH CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event shall Apple's total liability to You for all damages (other than as may be required by applicable law) under this License exceed the amount of fifty dollars ($50.00). 10. Trademarks. This License does not grant any rights to use the trademarks or trade names "Apple", "Mac", "Mac OS", "QuickTime", "QuickTime Streaming Server" or any other trademarks, service marks, logos or trade names belonging to Apple (collectively "Apple Marks") or to any trademark, service mark, logo or trade name belonging to any Contributor. You agree not to use any Apple Marks in or as part of the name of products derived from the Original Code or to endorse or promote products derived from the Original Code other than as expressly permitted by and in strict compliance at all times with Apple's third party trademark usage guidelines which are posted at http://www.apple.com/legal/guidelinesfor3rdparties.html. 11. Ownership. Subject to the licenses granted under this License, each Contributor retains all rights, title and interest in and to any Modifications made by such Contributor. Apple retains all rights, title and interest in and to the Original Code and any Modifications made by or on behalf of Apple ("Apple Modifications"), and such Apple Modifications will not be automatically subject to this License. Apple may, at its sole discretion, choose to license such Apple Modifications under this License, or on different terms from those contained in this License or may choose not to license them at all. 12. Termination. 12.1 Termination. This License and the rights granted hereunder will terminate: (a) automatically without notice from Apple if You fail to comply with any term(s) of this License and fail to cure such breach within 30 days of becoming aware of such breach; (b) immediately in the event of the circumstances described in Section 13.5(b); or (c) automatically without notice from Apple if You, at any time during the term of this License, commence an action for patent infringement against Apple; provided that Apple did not first commence an action for patent infringement against You in that instance. 12.2 Effect of Termination. Upon termination, You agree to immediately stop any further use, reproduction, modification, sublicensing and distribution of the Covered Code. All sublicenses to the Covered Code which have been properly granted prior to termination shall survive any termination of this License. Provisions which, by their nature, should remain in effect beyond the termination of this License shall survive, including but not limited to Sections 3, 5, 8, 9, 10, 11, 12.2 and 13. No party will be liable to any other for compensation, indemnity or damages of any sort solely as a result of terminating this License in accordance with its terms, and termination of this License will be without prejudice to any other right or remedy of any party. 13. Miscellaneous. 13.1 Government End Users. The Covered Code is a "commercial item" as defined in FAR 2.101. Government software and technical data rights in the Covered Code include only those rights customarily provided to the public as defined in this License. This customary commercial license in technical data and software is provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software or Computer Software Documentation). Accordingly, all U.S. Government End Users acquire Covered Code with only those rights set forth herein. 13.2 Relationship of Parties. This License will not be construed as creating an agency, partnership, joint venture or any other form of legal association between or among You, Apple or any Contributor, and You will not represent to the contrary, whether expressly, by implication, appearance or otherwise. 13.3 Independent Development. Nothing in this License will impair Apple's right to acquire, license, develop, have others develop for it, market and/or distribute technology or products that perform the same or similar functions as, or otherwise compete with, Modifications, Larger Works, technology or products that You may develop, produce, market or distribute. 13.4 Waiver; Construction. Failure by Apple or any Contributor to enforce any provision of this License will not be deemed a waiver of future enforcement of that or any other provision. Any law or regulation which provides that the language of a contract shall be construed against the drafter will not apply to this License. 13.5 Severability. (a) If for any reason a court of competent jurisdiction finds any provision of this License, or portion thereof, to be unenforceable, that provision of the License will be enforced to the maximum extent permissible so as to effect the economic benefits and intent of the parties, and the remainder of this License will continue in full force and effect. (b) Notwithstanding the foregoing, if applicable law prohibits or restricts You from fully and/or specifically complying with Sections 2 and/or 3 or prevents the enforceability of either of those Sections, this License will immediately terminate and You must immediately discontinue any use of the Covered Code and destroy all copies of it that are in your possession or control. 13.6 Dispute Resolution. Any litigation or other dispute resolution between You and Apple relating to this License shall take place in the Northern District of California, and You and Apple hereby consent to the personal jurisdiction of, and venue in, the state and federal courts within that District with respect to this License. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. 13.7 Entire Agreement; Governing Law. This License constitutes the entire agreement between the parties with respect to the subject matter hereof. This License shall be governed by the laws of the United States and the State of California, except that body of California law concerning conflicts of law. Where You are located in the province of Quebec, Canada, the following clause applies: The parties hereby confirm that they have requested that this License and all related documents be drafted in English. Les parties ont exigé que le présent contrat et tous les documents connexes soient rédigés en anglais. EXHIBIT A. "Portions Copyright (c) 1999-2007 Apple Inc. All Rights Reserved. This file contains Original Code and/or Modifications of Original Code as defined in and that are subject to the Apple Public Source License Version 2.0 (the 'License'). You may not use this file except in compliance with the License. Please obtain a copy of the License at http://www.opensource.apple.com/apsl/ and read it before using this file. The Original Code and all software distributed under the License are distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the specific language governing rights and limitations under the License." ================================================ FILE: licenses/APSL.txt ================================================ APPLE PUBLIC SOURCE LICENSE Version 2.0 - August 6, 2003 Please read this License carefully before downloading this software. By downloading or using this software, you are agreeing to be bound by the terms of this License. If you do not or cannot agree to the terms of this License, please do not download or use the software. Apple Note: In January 2007, Apple changed its corporate name from "Apple Computer, Inc." to "Apple Inc." This change has been reflected below and copyright years updated, but no other changes have been made to the APSL 2.0. 1. General; Definitions. This License applies to any program or other work which Apple Inc. ("Apple") makes publicly available and which contains a notice placed by Apple identifying such program or work as "Original Code" and stating that it is subject to the terms of this Apple Public Source License version 2.0 ("License"). As used in this License: 1.1 "Applicable Patent Rights" mean: (a) in the case where Apple is the grantor of rights, (i) claims of patents that are now or hereafter acquired, owned by or assigned to Apple and (ii) that cover subject matter contained in the Original Code, but only to the extent necessary to use, reproduce and/or distribute the Original Code without infringement; and (b) in the case where You are the grantor of rights, (i) claims of patents that are now or hereafter acquired, owned by or assigned to You and (ii) that cover subject matter in Your Modifications, taken alone or in combination with Original Code. 1.2 "Contributor" means any person or entity that creates or contributes to the creation of Modifications. 1.3 "Covered Code" means the Original Code, Modifications, the combination of Original Code and any Modifications, and/or any respective portions thereof. 1.4 "Externally Deploy" means: (a) to sublicense, distribute or otherwise make Covered Code available, directly or indirectly, to anyone other than You; and/or (b) to use Covered Code, alone or as part of a Larger Work, in any way to provide a service, including but not limited to delivery of content, through electronic communication with a client other than You. 1.5 "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. 1.6 "Modifications" mean any addition to, deletion from, and/or change to, the substance and/or structure of the Original Code, any previous Modifications, the combination of Original Code and any previous Modifications, and/or any respective portions thereof. When code is released as a series of files, a Modification is: (a) any addition to or deletion from the contents of a file containing Covered Code; and/or (b) any new file or other representation of computer program statements that contains any part of Covered Code. 1.7 "Original Code" means (a) the Source Code of a program or other work as originally made available by Apple under this License, including the Source Code of any updates or upgrades to such programs or works made available by Apple under this License, and that has been expressly identified by Apple as such in the header file(s) of such work; and (b) the object code compiled from such Source Code and originally made available by Apple under this License 1.8 "Source Code" means the human readable form of a program or other work that is suitable for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an executable (object code). 1.9 "You" or "Your" means an individual or a legal entity exercising rights under this License. For legal entities, "You" or "Your" includes any entity which controls, is controlled by, or is under common control with, You, where "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. 2. Permitted Uses; Conditions & Restrictions. Subject to the terms and conditions of this License, Apple hereby grants You, effective on the date You accept this License and download the Original Code, a world-wide, royalty-free, non-exclusive license, to the extent of Apple's Applicable Patent Rights and copyrights covering the Original Code, to do the following: 2.1 Unmodified Code. You may use, reproduce, display, perform, internally distribute within Your organization, and Externally Deploy verbatim, unmodified copies of the Original Code, for commercial or non-commercial purposes, provided that in each instance: (a) You must retain and reproduce in all copies of Original Code the copyright and other proprietary notices and disclaimers of Apple as they appear in the Original Code, and keep intact all notices in the Original Code that refer to this License; and (b) You must include a copy of this License with every copy of Source Code of Covered Code and documentation You distribute or Externally Deploy, and You may not offer or impose any terms on such Source Code that alter or restrict this License or the recipients' rights hereunder, except as permitted under Section 6. 2.2 Modified Code. You may modify Covered Code and use, reproduce, display, perform, internally distribute within Your organization, and Externally Deploy Your Modifications and Covered Code, for commercial or non-commercial purposes, provided that in each instance You also meet all of these conditions: (a) You must satisfy all the conditions of Section 2.1 with respect to the Source Code of the Covered Code; (b) You must duplicate, to the extent it does not already exist, the notice in Exhibit A in each file of the Source Code of all Your Modifications, and cause the modified files to carry prominent notices stating that You changed the files and the date of any change; and (c) If You Externally Deploy Your Modifications, You must make Source Code of all Your Externally Deployed Modifications either available to those to whom You have Externally Deployed Your Modifications, or publicly available. Source Code of Your Externally Deployed Modifications must be released under the terms set forth in this License, including the license grants set forth in Section 3 below, for as long as you Externally Deploy the Covered Code or twelve (12) months from the date of initial External Deployment, whichever is longer. You should preferably distribute the Source Code of Your Externally Deployed Modifications electronically (e.g. download from a web site). 2.3 Distribution of Executable Versions. In addition, if You Externally Deploy Covered Code (Original Code and/or Modifications) in object code, executable form only, You must include a prominent notice, in the code itself as well as in related documentation, stating that Source Code of the Covered Code is available under the terms of this License with information on how and where to obtain such Source Code. 2.4 Third Party Rights. You expressly acknowledge and agree that although Apple and each Contributor grants the licenses to their respective portions of the Covered Code set forth herein, no assurances are provided by Apple or any Contributor that the Covered Code does not infringe the patent or other intellectual property rights of any other entity. Apple and each Contributor disclaim any liability to You for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, You hereby assume sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow You to distribute the Covered Code, it is Your responsibility to acquire that license before distributing the Covered Code. 3. Your Grants. In consideration of, and as a condition to, the licenses granted to You under this License, You hereby grant to any person or entity receiving or distributing Covered Code under this License a non-exclusive, royalty-free, perpetual, irrevocable license, under Your Applicable Patent Rights and other intellectual property rights (other than patent) owned or controlled by You, to use, reproduce, display, perform, modify, sublicense, distribute and Externally Deploy Your Modifications of the same scope and extent as Apple's licenses under Sections 2.1 and 2.2 above. 4. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In each such instance, You must make sure the requirements of this License are fulfilled for the Covered Code or any portion thereof. 5. Limitations on Patent License. Except as expressly stated in Section 2, no other patent rights, express or implied, are granted by Apple herein. Modifications and/or Larger Works may require additional patent licenses from Apple which Apple may grant in its sole discretion. 6. Additional Terms. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations and/or other rights consistent with the scope of the license granted herein ("Additional Terms") to one or more recipients of Covered Code. However, You may do so only on Your own behalf and as Your sole responsibility, and not on behalf of Apple or any Contributor. You must obtain the recipient's agreement that any such Additional Terms are offered by You alone, and You hereby agree to indemnify, defend and hold Apple and every Contributor harmless for any liability incurred by or claims asserted against Apple or such Contributor by reason of any such Additional Terms. 7. Versions of the License. Apple may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Once Original Code has been published under a particular version of this License, You may continue to use it under the terms of that version. You may also choose to use such Original Code under the terms of any subsequent version of this License published by Apple. No one other than Apple has the right to modify the terms applicable to Covered Code created under this License. 8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in part pre-release, untested, or not fully tested works. The Covered Code may contain errors that could cause failures or loss of data, and may be incomplete or contain inaccuracies. You expressly acknowledge and agree that use of the Covered Code, or any portion thereof, is at Your sole and entire risk. THE COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF ANY KIND AND APPLE AND APPLE'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS "APPLE" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. APPLE AND EACH CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY APPLE, AN APPLE AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. You acknowledge that the Covered Code is not intended for use in the operation of nuclear facilities, aircraft navigation, communication systems, or air traffic control machines in which case the failure of the Covered Code could lead to death, personal injury, or severe physical or environmental damage. 9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT SHALL APPLE OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF APPLE OR SUCH CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event shall Apple's total liability to You for all damages (other than as may be required by applicable law) under this License exceed the amount of fifty dollars ($50.00). 10. Trademarks. This License does not grant any rights to use the trademarks or trade names "Apple", "Mac", "Mac OS", "QuickTime", "QuickTime Streaming Server" or any other trademarks, service marks, logos or trade names belonging to Apple (collectively "Apple Marks") or to any trademark, service mark, logo or trade name belonging to any Contributor. You agree not to use any Apple Marks in or as part of the name of products derived from the Original Code or to endorse or promote products derived from the Original Code other than as expressly permitted by and in strict compliance at all times with Apple's third party trademark usage guidelines which are posted at http://www.apple.com/legal/guidelinesfor3rdparties.html. 11. Ownership. Subject to the licenses granted under this License, each Contributor retains all rights, title and interest in and to any Modifications made by such Contributor. Apple retains all rights, title and interest in and to the Original Code and any Modifications made by or on behalf of Apple ("Apple Modifications"), and such Apple Modifications will not be automatically subject to this License. Apple may, at its sole discretion, choose to license such Apple Modifications under this License, or on different terms from those contained in this License or may choose not to license them at all. 12. Termination. 12.1 Termination. This License and the rights granted hereunder will terminate: (a) automatically without notice from Apple if You fail to comply with any term(s) of this License and fail to cure such breach within 30 days of becoming aware of such breach; (b) immediately in the event of the circumstances described in Section 13.5(b); or (c) automatically without notice from Apple if You, at any time during the term of this License, commence an action for patent infringement against Apple; provided that Apple did not first commence an action for patent infringement against You in that instance. 12.2 Effect of Termination. Upon termination, You agree to immediately stop any further use, reproduction, modification, sublicensing and distribution of the Covered Code. All sublicenses to the Covered Code which have been properly granted prior to termination shall survive any termination of this License. Provisions which, by their nature, should remain in effect beyond the termination of this License shall survive, including but not limited to Sections 3, 5, 8, 9, 10, 11, 12.2 and 13. No party will be liable to any other for compensation, indemnity or damages of any sort solely as a result of terminating this License in accordance with its terms, and termination of this License will be without prejudice to any other right or remedy of any party. 13. Miscellaneous. 13.1 Government End Users. The Covered Code is a "commercial item" as defined in FAR 2.101. Government software and technical data rights in the Covered Code include only those rights customarily provided to the public as defined in this License. This customary commercial license in technical data and software is provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software or Computer Software Documentation). Accordingly, all U.S. Government End Users acquire Covered Code with only those rights set forth herein. 13.2 Relationship of Parties. This License will not be construed as creating an agency, partnership, joint venture or any other form of legal association between or among You, Apple or any Contributor, and You will not represent to the contrary, whether expressly, by implication, appearance or otherwise. 13.3 Independent Development. Nothing in this License will impair Apple's right to acquire, license, develop, have others develop for it, market and/or distribute technology or products that perform the same or similar functions as, or otherwise compete with, Modifications, Larger Works, technology or products that You may develop, produce, market or distribute. 13.4 Waiver; Construction. Failure by Apple or any Contributor to enforce any provision of this License will not be deemed a waiver of future enforcement of that or any other provision. Any law or regulation which provides that the language of a contract shall be construed against the drafter will not apply to this License. 13.5 Severability. (a) If for any reason a court of competent jurisdiction finds any provision of this License, or portion thereof, to be unenforceable, that provision of the License will be enforced to the maximum extent permissible so as to effect the economic benefits and intent of the parties, and the remainder of this License will continue in full force and effect. (b) Notwithstanding the foregoing, if applicable law prohibits or restricts You from fully and/or specifically complying with Sections 2 and/or 3 or prevents the enforceability of either of those Sections, this License will immediately terminate and You must immediately discontinue any use of the Covered Code and destroy all copies of it that are in your possession or control. 13.6 Dispute Resolution. Any litigation or other dispute resolution between You and Apple relating to this License shall take place in the Northern District of California, and You and Apple hereby consent to the personal jurisdiction of, and venue in, the state and federal courts within that District with respect to this License. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. 13.7 Entire Agreement; Governing Law. This License constitutes the entire agreement between the parties with respect to the subject matter hereof. This License shall be governed by the laws of the United States and the State of California, except that body of California law concerning conflicts of law. Where You are located in the province of Quebec, Canada, the following clause applies: The parties hereby confirm that they have requested that this License and all related documents be drafted in English. Les parties ont exigé que le présent contrat et tous les documents connexes soient rédigés en anglais. EXHIBIT A. "Portions Copyright (c) 1999-2007 Apple Inc. All Rights Reserved. This file contains Original Code and/or Modifications of Original Code as defined in and that are subject to the Apple Public Source License Version 2.0 (the 'License'). You may not use this file except in compliance with the License. Please obtain a copy of the License at http://www.opensource.apple.com/apsl/ and read it before using this file. The Original Code and all software distributed under the License are distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the specific language governing rights and limitations under the License." ================================================ FILE: licenses/ATI.txt ================================================ AMD Software End User License Agreement PLEASE READ THIS LICENSE CAREFULLY BEFORE USING THE SOFTWARE. BY DOWNLOADING, INSTALLING, COPYING OR USING THE SOFTWARE, YOU ARE AGREEING TO BE BOUND BY THE TERMS OF THIS LICENSE. IF YOU ARE ACCESSING THE SOFTWARE ELECTRONICALLY, SIGNIFY YOUR AGREEMENT BY CLICKING THE "AGREE/ACCEPT" BUTTON. IF YOU DO NOT AGREE TO THE TERMS OF THIS LICENSE, PROMPTLY RETURN THE SOFTWARE TO THE PLACE WHERE YOU OBTAINED IT AND (IF APPLICABLE) YOUR MONEY WILL BE REFUNDED OR IF THE SOFTWARE WAS ACCESSED ELECTRONICALLY CLICK "DISAGREE/DECLINE". 1. License. Advanced Micro Devices, Inc., on behalf of itself, its subsidiaries and licensors (referred collectively as "AMD") grants to you the following non-exclusive, right to use the software accompanying this License (hereinafter "Software") subject to the following terms and limitations: (a) Regardless of the media upon which it is distributed, the Software is licensed to you for use solely in conjunction with AMD hardware products to which the Software relates ("AMD Hardware"). (b) You own the medium on which the Software is recorded, but AMD and, if applicable, its licensors retain title to the Software and related documentation. (c) You may: i) use the Software solely in connection with the AMD Hardware on a single computer; ii) make one copy of the Software in machine-readable form for backup purposes only. You must reproduce on such copy AMD's copyright notice and any other proprietary legends that were on the original copy of the Software; iii) transfer all your license rights in the Software provided you must also transfer a copy of this License, the backup copy of the Software, the AMD Hardware and the related documentation and provided the other party reads and agrees to accept the terms and conditions of this License. Upon such transfer your license rights are then terminated. (d) In addition to the license terms above, with respect to portions of the Software in source code or binary form designed exclusively for use with the Linux operating system ("AMD Linux Code"), you may use, display, modify, copy, distribute, allow others to re-distribute, package and re- package such AMD Linux Code for commercial and non-commercial purposes, provided that: i) all binary components of the AMD Linux Code are not modified in any way; ii) the AMD Linux Code is only used as part of the Software and in connection with AMD Hardware; iii) all copyright notices of AMD are reproduced and you refer to these license terms; iv) you may not offer or impose any terms on the use of AMD Linux Code that alter or restrict this License; and v) if you have modified the AMD Linux Code, such modifications will be made publicly available and are licensed under the same terms provided herein to AMD or any other third party without further restriction, royalty or any other license requirement; vi) to the extent there is any AMD sample or control panel source code included in the AMD Linux Code, no rights are granted to modify such code except for portions thereof that may be subject to third party license terms that grant such rights; vii) no rights are granted to distribute the binary form of the AMD Linux Kernel Module made by linking the AMD Proprietary Kernel Library and the AMD Kernel Compatibility Layer binary compiled using Linux kernel headers; viii) AMD is not obligated to provide any maintenance or technical support for any code resulting from AMD Linux Code. 2. Restrictions. The Software contains copyrighted and patented material, trade secrets and other proprietary material. In order to protect them, and except as permitted by this license or applicable legislation, you may not: a) decompile, reverse engineer, disassemble or otherwise reduce the Software to a human-perceivable form; b) modify, network, rent, lend, loan, distribute or create derivative works based upon the Software in whole or in part; or c) electronically transmit the Software from one computer to another or over a network or otherwise transfer the Software except as permitted by this License. 3. Termination. This License is effective until terminated. You may terminate this License at any time by destroying the Software, related documentation and all copies thereof. This License will terminate immediately without notice from AMD if you fail to comply with any provision of this License. Upon termination you must destroy the Software, related documentation and all copies thereof. 4. Government End Users. If you are acquiring the Software on behalf of any unit or agency of the United States Government, the following provisions apply. The Government agrees the Software and documentation were developed at private expense and are provided with "RESTRICTED RIGHTS". Use, duplication, or disclosure by the Government is subject to restrictions as set forth in DFARS 227.7202-1(a) and 227.7202-3(a) (1995), DFARS 252.227-7013(c)(1)(ii) (Oct 1988), FAR 12.212(a)(1995), FAR 52.227- 19, (June 1987) or FAR 52.227-14(ALT III) (June 1987),as amended from time to time. In the event that this License, or any part thereof, is deemed inconsistent with the minimum rights identified in the Restricted Rights provisions, the minimum rights shall prevail. 5. No Other License. No rights or licenses are granted by AMD under this License, expressly or by implication, with respect to any proprietary information or patent, copyright, trade secret or other intellectual property right owned or controlled by AMD, except as expressly provided in this License. 6. Additional Licenses. DISTRIBUTION OR USE OF THE SOFTWARE WITH AN OPERATING SYSTEM MAY REQUIRE ADDITIONAL LICENSES FROM THE OPERATING SYSTEM VENDOR. 7. Disclaimer of Warranty on Software. You expressly acknowledge and agree that use of the Software is at your sole risk. The Software and related documentation are provided "AS IS" and without warranty of any kind and AMD EXPRESSLY DISCLAIMS ALL WARRANTIES, EXPRESS AND IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FORA PARTICULAR PURPOSE, OF QUALITY, OF QUIET ENJOYMENT AND OF NON- INFRINGEMENT OF THIRD PARTY RIGHTS. AMD DOES NOT WARRANT THAT THE FUNCTIONS CONTAINED IN THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE SOFTWARE WILL BE CORRECTED. THE ENTIRE RISK AS TO THE RESULTS AND PERFORMANCE OF THE SOFTWARE IS ASSUMED BY YOU. FURTHERMORE, AMD DOES NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE ORTHE RESULTS OF THE USE OF THE SOFTWARE OR RELATED DOCUMENTATION IN TERMS OF THEIR CORRECTNESS, ACCURACY, RELIABILITY, CURRENTNESS, OR OTHERWISE. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY AMD OR AMD'S AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY OR IN ANY WAY INCREASE THE SCOPE OF THIS WARRANTY. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU (AND NOT AMD OR AMD'S AUTHORIZED REPRESENTATIVE) ASSUME THE ENTIRE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. THE SOFTWARE IS NOT INTENDED FOR USE IN MEDICAL, LIFE SAVING OR LIFE SUSTAINING APPLICATIONS. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSION MAY NOT APPLY TO YOU. 8. Limitation of Liability. TO THE MAXIMUM EXTENT PERMITTED BY LAW, UNDER NO CIRCUMSTANCES INCLUDING NEGLIGENCE, SHALL AMD, OR ITS DIRECTORS, OFFICERS, EMPLOYEES OR AGENTS, BE LIABLE TO YOU FOR ANY INCIDENTAL, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES (INCLUDING DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, AND THE LIKE) ARISING OUT OF THE USE, MISUSE OR INABILITY TO USE THE SOFTWARE OR RELATED DOCUMENTATION, BREACH OR DEFAULT, INCLUDING THOSE ARISING FROM INFRINGEMENT OR ALLEGED INFRINGEMENT OF ANY PATENT, TRADEMARK, COPYRIGHT OR OTHER INTELLECTUAL PROPERTY RIGHT, BY AMD, EVEN IF AMD OR AMD'S AUTHORIZED REPRESENTATIVE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THE ABOVE LIMITATION OR EXCLUSION MAY NOT APPLY TO YOU. AMD will not be liable for 1) loss of, or damage to, your records or data or 2) any damages claimed by you based on any third party claim. In no event shall AMD's total liability to you for all damages, losses, and causes of action (whether in contract, tort (including negligence) or otherwise) exceed the amount paid by you for the Software. The foregoing limitations will apply even if the above stated limitation fails of its essential purpose. 9. Controlling Law and Severability. This License shall be governed by and construed under the laws of the Province of Ontario, Canada without reference to its conflict of law principles. Any dispute related hereto will be brought only in the courts in Toronto, Ontario, Canada and such courts are agreed to be the convenient forum. In the event of any conflicts between foreign law, rules, and regulations, and Canadian law, rules, and regulations, Canadian law, rules and regulations shall prevail and govern. The United Nations Convention on Contracts for the International Sale of Goods shall not apply to this License. If for any reason a court of competent jurisdiction finds any provision of this License or portion thereof, to be unenforceable, that provision of the License shall be enforced to the maximum extent permissible so as to effect the intent of the parties, and the remainder of this License shall continue in full force and effect. 10. Complete Agreement. This License constitutes the entire agreement between the parties with respect to the use of the Software and the related documentation, and supersedes all prior or contemporaneous understandings or agreements, written or oral, regarding such subject matter. No amendment to or modification of this License will be binding unless in writing and signed by a duly authorized representative of AMD. ================================================ FILE: licenses/Apache-2.0.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: licenses/Artistic.txt ================================================ The "Artistic License" Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder as specified below. "Copyright Holder" is whoever is named in the copyright or copyrights for the package. "You" is you, if you're thinking about copying or distributing this Package. "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) give non-standard executables non-standard names, and clearly document the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. You may embed this Package's interpreter within an executable of yours (by linking); this shall be construed as a mere form of aggregation, provided that the complete Standard Version of the interpreter is so embedded. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whoever generated them, and may be sold commercially, and may be aggregated with this Package. If such scripts or library files are aggregated with this Package via the so-called "undump" or "unexec" methods of producing a binary executable image, then distribution of such an image shall neither be construed as a distribution of this Package nor shall it fall under the restrictions of Paragraphs 3 and 4, provided that you do not represent such an executable image as a Standard Version of this Package. 7. C subroutines (or comparably compiled subroutines in other languages) supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language. 8. Aggregation of this Package with a commercial distribution is always permitted provided that the use of this Package is embedded; that is, when no overt attempt is made to make this Package's interfaces visible to the end user of the commercial distribution. Such use shall not be construed as a distribution of this Package. 9. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End ================================================ FILE: licenses/BSD-1-Clause.txt ================================================ Copyright (c) 1995, 1999 Berkeley Software Design, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: licenses/BSD-2-Clause.txt ================================================ Copyright (c) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: licenses/BSD-3-Clause.txt ================================================ Copyright (c) . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: licenses/BSD-4-Clause.txt ================================================ Copyright (c) . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the the organization. 4. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY COPYRIGHT HOLDER "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: licenses/BSL.txt ================================================ Boost Software License - Version 1.0 - August 17th, 2003 Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: licenses/Clarified_Artistic.txt ================================================ The Clarified Artistic License Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder as specified below. "Copyright Holder" is whoever is named in the copyright or copyrights for the package. "You" is you, if you're thinking about copying or distributing this Package. "Distribution fee" is a fee you charge for providing a copy of this Package to another party. "Freely Available" means that no fee is charged for the right to use the item, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain, or those made Freely Available, or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major network archive site allowing unrestricted access to them, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. e) permit and encourge anyone who receives a copy of the modified Package permission to make your modifications Freely Available in some specific way. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) give non-standard executables non-standard names, and clearly document the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. e) offer the machine-readable source of the Package, with your modifications, by mail order. 5. You may charge a distribution fee for any distribution of this Package. If you offer support for this Package, you may charge any fee you choose for that support. You may not charge a license fee for the right to use this Package itself. You may distribute this Package in aggregate with other (possibly commercial and possibly nonfree) programs as part of a larger (possibly commercial and possibly nonfree) software distribution, and charge license fees for other parts of that software distribution, provided that you do not advertise this Package as a product of your own. If the Package includes an interpreter, You may embed this Package's interpreter within an executable of yours (by linking); this shall be construed as a mere form of aggregation, provided that the complete Standard Version of the interpreter is so embedded. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whoever generated them, and may be sold commercially, and may be aggregated with this Package. If such scripts or library files are aggregated with this Package via the so-called "undump" or "unexec" methods of producing a binary executable image, then distribution of such an image shall neither be construed as a distribution of this Package nor shall it fall under the restrictions of Paragraphs 3 and 4, provided that you do not represent such an executable image as a Standard Version of this Package. 7. C subroutines (or comparably compiled subroutines in other languages) supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language. 8. Aggregation of the Standard Version of the Package with a commercial distribution is always permitted provided that the use of this Package is embedded; that is, when no overt attempt is made to make this Package's interfaces visible to the end user of the commercial distribution. Such use shall not be construed as a distribution of this Package. 9. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End ================================================ FILE: licenses/FDL.txt ================================================ GNU Free Documentation License Version 1.2, November 2002 Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. ================================================ FILE: licenses/FDL1_2.txt ================================================ GNU Free Documentation License Version 1.2, November 2002 Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. ================================================ FILE: licenses/FDL1_3.txt ================================================ GNU Free Documentation License Version 1.3, 3 November 2008 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The "publisher" means any person or entity that distributes copies of the Document to the public. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. ================================================ FILE: licenses/FLIRC.txt ================================================ /* * Copyright 2023 Flirc Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY FLIRC INC. \`\`AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ${AUTHOR_UPPER} OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * * The views and conclusions contained in the software and documentation * are those of the authors and should not be interpreted as representing * official policies, either expressed or implied, of Flirc Inc. */ ================================================ FILE: licenses/GPL-1.0-only.txt ================================================ GNU GENERAL PUBLIC LICENSE Version 1, February 1989 Copyright (C) 1989 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The license agreements of most software companies try to keep users at the mercy of those companies. By contrast, our General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. The General Public License applies to the Free Software Foundation's software and to any other program whose authors commit to using it. You can use it for your programs, too. When we speak of free software, we are referring to freedom, not price. Specifically, the General Public License is designed to make sure that you have the freedom to give away or sell copies of free software, that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of a such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must tell them their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any work containing the Program or a portion of it, either verbatim or with modifications. Each licensee is addressed as "you". 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this General Public License and to the absence of any warranty; and give any other recipients of the Program a copy of this General Public License along with the Program. You may charge a fee for the physical act of transferring a copy. 2. You may modify your copy or copies of the Program or any portion of it, and copy and distribute such modifications under the terms of Paragraph 1 above, provided that you also do the following: a) cause the modified files to carry prominent notices stating that you changed the files and the date of any change; and b) cause the whole of any work that you distribute or publish, that in whole or in part contains the Program or any part thereof, either with or without modifications, to be licensed at no charge to all third parties under the terms of this General Public License (except that you may choose to grant warranty protection to some or all third parties, at your option). c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the simplest and most usual way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this General Public License. d) You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. Mere aggregation of another independent work with the Program (or its derivative) on a volume of a storage or distribution medium does not bring the other work under the scope of these terms. 3. You may copy and distribute the Program (or a portion or derivative of it, under Paragraph 2) in object code or executable form under the terms of Paragraphs 1 and 2 above provided that you also do one of the following: a) accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Paragraphs 1 and 2 above; or, b) accompany it with a written offer, valid for at least three years, to give any third party free (except for a nominal charge for the cost of distribution) a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Paragraphs 1 and 2 above; or, c) accompany it with the information you received as to where the corresponding source code may be obtained. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form alone.) Source code for a work means the preferred form of the work for making modifications to it. For an executable file, complete source code means all the source code for all modules it contains; but, as a special exception, it need not include source code for modules which are standard libraries that accompany the operating system on which the executable file runs, or for standard header files or definitions files that accompany that operating system. 4. You may not copy, modify, sublicense, distribute or transfer the Program except as expressly provided under this General Public License. Any attempt otherwise to copy, modify, sublicense, distribute or transfer the Program is void, and will automatically terminate your rights to use the Program under this License. However, parties who have received copies, or rights to use copies, from you under this General Public License will not have their licenses terminated so long as such parties remain in full compliance. 5. By copying, distributing or modifying the Program (or any work based on the Program) you indicate your acceptance of this license to do so, and all its terms and conditions. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. 7. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of the license which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the license, you may choose any version ever published by the Free Software Foundation. 8. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to humanity, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19xx name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (a program to direct compilers to make passes at assemblers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice That's all there is to it! ================================================ FILE: licenses/GPL-2.0-only.txt ================================================ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the program's name and an idea of what it does. Copyright (C) yyyy name of author This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice ================================================ FILE: licenses/GPL-2.0-or-later.txt ================================================ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the program's name and an idea of what it does. Copyright (C) yyyy name of author This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice ================================================ FILE: licenses/GPL-3.0-only.txt ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright © 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. “This License” refers to version 3 of the GNU General Public License. “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. A “covered work” means either the unmodified Program or a work based on the Program. To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: licenses/GPL-3.0-or-later.txt ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright © 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. “This License” refers to version 3 of the GNU General Public License. “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. A “covered work” means either the unmodified Program or a work based on the Program. To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: licenses/HIDAPI-orig.txt ================================================ HIDAPI - Multi-Platform library for communication with HID devices. Copyright 2009, Alan Ott, Signal 11 Software. All Rights Reserved. This software may be used by anyone for any reason so long as the copyright notice in the source files remains intact. ================================================ FILE: licenses/ISC.txt ================================================ ISC License: Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") Copyright (c) 1995-2003 by Internet Software Consortium Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ================================================ FILE: licenses/Info-ZIP.txt ================================================ This is version 2007-Mar-4 of the Info-ZIP license. The definitive version of this document should be available at ftp://ftp.info-zip.org/pub/infozip/license.html indefinitely and a copy at http://www.info-zip.org/pub/infozip/license.html. Copyright (c) 1990-2007 Info-ZIP. All rights reserved. For the purposes of this copyright and license, "Info-ZIP" is defined as the following set of individuals: Mark Adler, John Bush, Karl Davis, Harald Denker, Jean-Michel Dubois, Jean-loup Gailly, Hunter Goatley, Ed Gordon, Ian Gorman, Chris Herborth, Dirk Haase, Greg Hartwig, Robert Heath, Jonathan Hudson, Paul Kienitz, David Kirschbaum, Johnny Lee, Onno van der Linden, Igor Mandrichenko, Steve P. Miller, Sergio Monesi, Keith Owens, George Petrov, Greg Roelofs, Kai Uwe Rommel, Steve Salisbury, Dave Smith, Steven M. Schweda, Christian Spieler, Cosmin Truta, Antoine Verheijen, Paul von Behren, Rich Wales, Mike White. This software is provided "as is," without warranty of any kind, express or implied. In no event shall Info-ZIP or its contributors be held liable for any direct, indirect, incidental, special or consequential damages arising out of the use of or inability to use this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the above disclaimer and the following restrictions: 1. Redistributions of source code (in whole or in part) must retain the above copyright notice, definition, disclaimer, and this list of conditions. 2. Redistributions in binary form (compiled executables and libraries) must reproduce the above copyright notice, definition, disclaimer, and this list of conditions in documentation and/or other materials provided with the distribution. The sole exception to this condition is redistribution of a standard UnZipSFX binary (including SFXWiz) as part of a self-extracting archive; that is permitted without inclusion of this license, as long as the normal SFX banner has not been removed from the binary or disabled. 3. Altered versions--including, but not limited to, ports to new operating systems, existing ports with new graphical interfaces, versions with modified or added functionality, and dynamic, shared, or static library versions not from Info-ZIP--must be plainly marked as such and must not be misrepresented as being the original source or, if binaries, compiled from the original source. Such altered versions also must not be misrepresented as being Info-ZIP releases--including, but not limited to, labeling of the altered versions with the names "Info-ZIP" (or any variation thereof, including, but not limited to, different capitalizations), "Pocket UnZip," "WiZ" or "MacZip" without the explicit permission of Info-ZIP. Such altered versions are further prohibited from misrepresentative use of the Zip-Bugs or Info-ZIP e-mail addresses or the Info-ZIP URL(s), such as to imply Info-ZIP will provide support for the altered versions. 4. Info-ZIP retains the right to use the names "Info-ZIP," "Zip," "UnZip," "UnZipSFX," "WiZ," "Pocket UnZip," "Pocket Zip," and "MacZip" for its own source and binary releases. ================================================ FILE: licenses/LGPL-2.0-only.txt ================================================ GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the library's name and an idea of what it does. Copyright (C) year name of author This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. signature of Ty Coon, 1 April 1990 Ty Coon, President of Vice That's all there is to it! ================================================ FILE: licenses/LGPL-2.0-or-later.txt ================================================ GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the library's name and an idea of what it does. Copyright (C) year name of author This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. signature of Ty Coon, 1 April 1990 Ty Coon, President of Vice That's all there is to it! ================================================ FILE: licenses/LGPL-2.1-only.txt ================================================ GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the library's name and an idea of what it does. Copyright (C) year name of author This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. signature of Ty Coon, 1 April 1990 Ty Coon, President of Vice That's all there is to it! ================================================ FILE: licenses/LGPL-2.1-or-later.txt ================================================ GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the library's name and an idea of what it does. Copyright (C) year name of author This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. signature of Ty Coon, 1 April 1990 Ty Coon, President of Vice That's all there is to it! ================================================ FILE: licenses/LGPL-3.0-only.txt ================================================ GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. ================================================ FILE: licenses/LGPL-3.0-or-later.txt ================================================ GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. ================================================ FILE: licenses/LibPNG2.txt ================================================ COPYRIGHT NOTICE, DISCLAIMER, and LICENSE ========================================= PNG Reference Library License version 2 --------------------------------------- * Copyright (c) 1995-2019 The PNG Reference Library Authors. * Copyright (c) 2018-2019 Cosmin Truta. * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. * Copyright (c) 1996-1997 Andreas Dilger. * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. The software is supplied "as is", without warranty of any kind, express or implied, including, without limitation, the warranties of merchantability, fitness for a particular purpose, title, and non-infringement. In no event shall the Copyright owners, or anyone distributing the software, be liable for any damages or other liability, whether in contract, tort or otherwise, arising from, out of, or in connection with the software, or the use or other dealings in the software, even if advised of the possibility of such damage. Permission is hereby granted to use, copy, modify, and distribute this software, or portions hereof, for any purpose, without fee, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated, but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This Copyright notice may not be removed or altered from any source or altered source distribution. PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35) ----------------------------------------------------------------------- libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are derived from libpng-1.0.6, and are distributed according to the same disclaimer and license as libpng-1.0.6 with the following individuals added to the list of Contributing Authors: Simon-Pierre Cadieux Eric S. Raymond Mans Rullgard Cosmin Truta Gilles Vollant James Yu Mandar Sahastrabuddhe Google Inc. Vadim Barkov and with the following additions to the disclaimer: There is no warranty against interference with your enjoyment of the library or against infringement. There is no warranty that our efforts or the library will fulfill any of your particular purposes or needs. This library is provided with all faults, and the entire risk of satisfactory quality, performance, accuracy, and effort is with the user. Some files in the "contrib" directory and some configure-generated files that are distributed with libpng have other copyright owners, and are released under other open source licenses. libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from libpng-0.96, and are distributed according to the same disclaimer and license as libpng-0.96, with the following individuals added to the list of Contributing Authors: Tom Lane Glenn Randers-Pehrson Willem van Schaik libpng versions 0.89, June 1996, through 0.96, May 1997, are Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88, and are distributed according to the same disclaimer and license as libpng-0.88, with the following individuals added to the list of Contributing Authors: John Bowler Kevin Bracey Sam Bushell Magnus Holmgren Greg Roelofs Tom Tanner Some files in the "scripts" directory have other copyright owners, but are released under this license. libpng versions 0.5, May 1995, through 0.88, January 1996, are Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. For the purposes of this copyright and license, "Contributing Authors" is defined as the following set of individuals: Andreas Dilger Dave Martindale Guy Eric Schalnat Paul Schmidt Tim Wegner The PNG Reference Library is supplied "AS IS". The Contributing Authors and Group 42, Inc. disclaim all warranties, expressed or implied, including, without limitation, the warranties of merchantability and of fitness for any purpose. The Contributing Authors and Group 42, Inc. assume no liability for direct, indirect, incidental, special, exemplary, or consequential damages, which may result from the use of the PNG Reference Library, even if advised of the possibility of such damage. Permission is hereby granted to use, copy, modify, and distribute this source code, or portions hereof, for any purpose, without fee, subject to the following restrictions: 1. The origin of this source code must not be misrepresented. 2. Altered versions must be plainly marked as such and must not be misrepresented as being the original source. 3. This Copyright notice may not be removed or altered from any source or altered source distribution. The Contributing Authors and Group 42, Inc. specifically permit, without fee, and encourage the use of this source code as a component to supporting the PNG file format in commercial products. If you use this source code in a product, acknowledgment is not required but would be appreciated. ================================================ FILE: licenses/MIT.txt ================================================ MIT License Copyright (c) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: licenses/MIT_Modified.txt ================================================ The MIT License Copyright (c) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: licenses/MPL-1.1.txt ================================================ Mozilla Public License Version 1.1 1. Definitions. 1.0.1. "Commercial Use" means distribution or otherwise making the Covered Code available to a third party. 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. 1.3. "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. 1.5. "Executable" means Covered Code in any form other than Source Code. 1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. 1.7. "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. 1.8. "License" means this document. 1.8.1. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. Any new file that contains any part of the Original Code or previous Modifications. 1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. 1.10.1. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. 1.11. "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. 1.12. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. Source Code License. 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: a. under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and b. under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). c. the licenses granted in this Section 2.1 (a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. d. Notwithstanding Section 2.1 (b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. 2.2. Contributor Grant. Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license a. under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and b. under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). c. the licenses granted in Sections 2.2 (a) and 2.2 (b) are effective on the date Contributor first makes Commercial Use of the Covered Code. d. Notwithstanding Section 2.2 (b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. 3. Distribution Obligations. 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. 3.3. Description of Modifications. You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. 3.4. Intellectual Property Matters (a) Third Party Claims If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. (b) Contributor APIs If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. (c) Representations. Contributor represents that, except as disclosed pursuant to Section 3.4 (a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Sections 3.1, 3.2, 3.3, 3.4 and 3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. 4. Inability to Comply Due to Statute or Regulation. If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Application of this License. This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. 6. Versions of the License. 6.1. New Versions Netscape Communications Corporation ("Netscape") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. 6.2. Effect of New Versions Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. 6.3. Derivative Works If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", "MPL", "NPL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) 7. DISCLAIMER OF WARRANTY COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 8. Termination 8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 8.2. If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: a. such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. b. any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. 8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. 8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. 9. LIMITATION OF LIABILITY UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 10. U.S. government end users The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. 11. Miscellaneous This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. 12. Responsibility for claims As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. 13. Multiple-licensed code Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the MPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. Exhibit A - Mozilla Public License. "The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is ______________________________________. The Initial Developer of the Original Code is ________________________. Portions created by ______________________ are Copyright (C) ______ _______________________. All Rights Reserved. Contributor(s): ______________________________________. Alternatively, the contents of this file may be used under the terms of the _____ license (the "[___] License"), in which case the provisions of [______] License are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the [___] License." NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications. ================================================ FILE: licenses/MPL-2.0.txt ================================================ Mozilla Public License Version 2.0 1. Definitions 1.1. "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. 1.2. "Contributor Version" means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution. 1.3. "Contribution" means Covered Software of a particular Contributor. 1.4. "Covered Software" means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. 1.5. "Incompatible With Secondary Licenses" means (a) that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or (b) that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. 1.6. "Executable Form" means any form of the work other than Source Code Form. 1.7. "Larger Work" means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. 1.8. "License" means this document. 1.9. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. 1.10. "Modifications" means any of the following: (a) any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or (b) any new file in Source Code Form that contains any Covered Software. 1.11. "Patent Claims" of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. 1.12. "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. 1.13. "Source Code Form" means the form of the work preferred for making modifications. 1.14. "You" (or "Your") means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. License Grants and Conditions 2.1. Grants Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and (b) under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. 2.2. Effective Date The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. 2.3. Limitations on Grant Scope The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: (a) for any code that a Contributor has removed from Covered Software; or (b) for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or (c) under Patent Claims infringed by Covered Software in the absence of its Contributions. This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). 2.4. Subsequent Licenses No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). 2.5. Representation Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. 2.6. Fair Use This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. 2.7. Conditions Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. 3. Responsibilities 3.1. Distribution of Source Form All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form. 3.2. Distribution of Executable Form If You distribute Covered Software in Executable Form then: (a) such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and (b) You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License. 3.3. Distribution of a Larger Work You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). 3.4. Notices You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. 3.5. Application of Additional Terms You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. 4. Inability to Comply Due to Statute or Regulation If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Termination 5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. 5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. 6. Disclaimer of Warranty Covered Software is provided under this License on an "as is" basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer. 7. Limitation of Liability Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. 8. Litigation Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims. 9. Miscellaneous This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. 10. Versions of the License 10.1. New Versions Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. 10.2. Effect of New Versions You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. 10.3. Modified Versions If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. Exhibit A - Source Code Form License Notice This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. You may add additional accurate notices of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" Notice This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0. ================================================ FILE: licenses/NVIDIA.txt ================================================ License For Customer Use of NVIDIA Software IMPORTANT NOTICE -- READ CAREFULLY: This License For Customer Use of NVIDIA Software ("LICENSE") is the agreement which governs use of the software of NVIDIA Corporation and its subsidiaries ("NVIDIA") downloadable herefrom, including computer software and associated printed materials ("SOFTWARE"). By downloading, installing, copying, or otherwise using the SOFTWARE, you agree to be bound by the terms of this LICENSE. If you do not agree to the terms of this LICENSE, do not download the SOFTWARE. RECITALS Use of NVIDIA's products requires three elements: the SOFTWARE, the hardware on a graphics controller board, and a personal computer. The SOFTWARE is protected by copyright laws and international copyright treaties, as well as other intellectual property laws and treaties. The SOFTWARE is not sold, and instead is only licensed for use, strictly in accordance with this document. The hardware is protected by various patents, and is sold, but this agreement does not cover that sale, since it may not necessarily be sold as a package with the SOFTWARE. This agreement sets forth the terms and conditions of the SOFTWARE LICENSE only. 1. DEFINITIONS 1.1 Customer. Customer means the entity or individual that downloads the SOFTWARE. 2. GRANT OF LICENSE 2.1 Rights and Limitations of Grant. NVIDIA hereby grants Customer the following non-exclusive, non-transferable right to use the SOFTWARE, with the following limitations: 2.1.1 Rights. Customer may install and use one copy of the SOFTWARE on a single computer, and except for making one back-up copy of the Software, may not otherwise copy the SOFTWARE. This LICENSE of SOFTWARE may not be shared or used concurrently on different computers. 2.1.2 Linux/FreeBSD Exception. Notwithstanding the foregoing terms of Section 2.1.1, SOFTWARE designed exclusively for use on the Linux or FreeBSD operating systems, or other operating systems derived from the source code to these operating systems, may be copied and redistributed, provided that the binary files thereof are not modified in any way (except for unzipping of compressed files). 2.1.3 Limitations. No Reverse Engineering. Customer may not reverse engineer, decompile, or disassemble the SOFTWARE, nor attempt in any other manner to obtain the source code. No Separation of Components. The SOFTWARE is licensed as a single product. Its component parts may not be separated for use on more than one computer, nor otherwise used separately from the other parts. No Rental. Customer may not rent or lease the SOFTWARE to someone else. 3. TERMINATION This LICENSE will automatically terminate if Customer fails to comply with any of the terms and conditions hereof. In such event, Customer must destroy all copies of the SOFTWARE and all of its component parts. Defensive Suspension. If Customer commences or participates in any legal proceeding against NVIDIA, then NVIDIA may, in its sole discretion, suspend or terminate all license grants and any other rights provided under this LICENSE during the pendency of such legal proceedings. 4. COPYRIGHT All title and copyrights in and to the SOFTWARE (including but not limited to all images, photographs, animations, video, audio, music, text, and other information incorporated into the SOFTWARE), the accompanying printed materials, and any copies of the SOFTWARE, are owned by NVIDIA, or its suppliers. The SOFTWARE is protected by copyright laws and international treaty provisions. Accordingly, Customer is required to treat the SOFTWARE like any other copyrighted material, except as otherwise allowed pursuant to this LICENSE and that it may make one copy of the SOFTWARE solely for backup or archive purposes. 5. APPLICABLE LAW This agreement shall be deemed to have been made in, and shall be construed pursuant to, the laws of the State of California. 6. DISCLAIMER OF WARRANTIES AND LIMITATION ON LIABILITY 6.1 No Warranties. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE SOFTWARE IS PROVIDED "AS IS" AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 6.2 No Liability for Consequential Damages. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE THE SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. MISCELLANEOUS The United Nations Convention on Contracts for the International Sale of Goods is specifically disclaimed. If any provision of this LICENSE is inconsistent with, or cannot be fully enforced under, the law, such provision will be construed as limited to the extent necessary to be consistent with and fully enforceable under the law. This agreement is the final, complete and exclusive agreement between the parties relating to the subject matter hereof, and supersedes all prior or contemporaneous understandings and agreements relating to such subject matter, whether oral or written. Customer agrees that it will not ship, transfer or export the SOFTWARE into any country, or use the SOFTWARE in any manner, prohibited by the United States Bureau of Export Administration or any export laws, restrictions or regulations. This LICENSE may only be modified in writing signed by an authorized officer of NVIDIA. ================================================ FILE: licenses/NextPVR.txt ================================================ Software License Agreement for NextPVR IMPORTANT- PLEASE READ CAREFULLY BEFORE USING THIS SOFTWARE: THIS LICENSE AGREEMENT FOR NextPVR ("LICENSE AGREEMENT") IS A LEGAL AGREEMENT BETWEEN YOU (EITHER ON BEHALF OF YOURSELF AS AN INDIVIDUAL OR ON BEHALF OF AN ENTITY AS ITS AUTHORIZED REPRESENTATIVE) AND PINSTRIPE LIMITED. FOR THE NextPVR SOFTWARE ("SOFTWARE"). THIS LICENSE AGREEMENT FOR NextPVR SUPERSEDES PREVIOUS VERSIONS. BY INSTALLING THE SOFTWARE (AS DEFINED BELOW), COPYING OR OTHERWISE USING THE SOFTWARE YOU AGREE TO BE BOUND BY ALL OF THE TERMS OF THIS END USER LICENSE AGREEMENT REGARDING YOUR USE OF THE SOFTWARE. IF YOU DO NOT AGREE TO THE TERMS OF THIS LICENSE AGREEMENT, UNINSTALL THE SOFTWARE, AND DO NOT COPY OR OTHERWISE USE THE SOFTWARE. GRANT OF LICENSE: Subject to the following terms, PINSTRIPE LIMITED hereby grants you a non-exclusive, perpetual, non-transferable license to install and to use the NextPVR software ("Software") for personal, non-commercial use. You may copy the Software for back-up or archival purposes. LICENSE RESTRICTIONS: You may not: (i) reverse engineer, decompile, or disassemble the Software; (ii) modify, or create derivative works based upon, the Software in whole or in part; (iii) distribute copies of the Software; (iv) remove any proprietary notices or labels on the Software; or (v) resell, lease, rent, transfer, sublicense, or otherwise transfer rights to the Software. You agree that the NextPVR software will not be used for commercial purposes without full written permission. Any such forbidden use shall immediately terminate your license to the software. TITLE: You agree that no title to the intellectual property in the Software is transferred to you. Title, ownership, rights, and intellectual property rights in and to the Software shall remain in PINSTRIPE LIMITED. UPDATES: From time to time, PINSTRIPE LIMITED may make updates to the Software generally available. You may download and install these software updates released by PINSTRIPE LIMITED. All updates to the Software shall be governed by this Agreement, unless other license terms are provided with the update. Under the Software's default configuration, if you are connected to the Internet, the Software is enabled by default to query latest version of Software and display if updates are available. You may choose to switch this version check off and not use it. TECHNICAL SUPPORT: Technical support for the software, as made available by PINSTRIPE LIMITED, is available on the web site at: http://www.nextpvr.com DISCLAIMER OF WARRANTY: The Software is provided to you at minimal charge. ACCORDINGLY, YOU AGREE THAT PINSTRIPE LIMITED HAS MADE NO EXPRESS WARRANTIES, ORAL OR WRITTEN, TO YOU REGARDING THE SOFTWARE AND THAT THE SOFTWARE IS BEING PROVIDED TO YOU "AS IS" WITHOUT WARRANTY OF ANY KIND. PINSTRIPE LIMITED DISCLAIMS ANY AND ALL OTHER WARRANTIES, WHETHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF NONINFRINGEMENT OF THIRD PARTY RIGHTS, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. PINSTRIPE LIMITED SHALL NOT BE LIABLE FOR INDIRECT, INCIDENTAL, SPECIAL, COVER, RELIANCE, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOSS OF ANTICIPATED PROFIT) ARISING FROM ANY CAUSE UNDER OR RELATED TO THIS AGREEMENT. LIMITATION OF LIABILITY: You must assume the entire risk of using the program. IN NO EVENT SHALL PINSTRIPE LIMITED BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING ANY LOST PROFITS, LOST SAVINGS, OR OTHER INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND ARISING OUT OF THE USE OF THE PINSTRIPE LIMITED SOFTWARE, EVEN IF PINSTRIPE LIMITED HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN NO EVENT WILL PINSTRIPE LIMITED'S LIABILITY FOR ANY CLAIM, WHETHER IN CONTRACT, TORT, OR ANY OTHER THEORY OF LIABILITY, EXCEED THE LICENSE FEE PAID BY YOU, PROVIDED, HOWEVER, IF THE RELEVANT SOFTWARE WAS PROVIDED TO YOU AT NO CHARGE YOU AGREE PINSTRIPE LIMITED SHALL NOT BE LIABLE TO YOU FOR ANY DAMAGES. THIS LIMITATION SHALL APPLY TO CLAIMS OF PERSONAL INJURY TO THE EXTENT PERMITTED BY LAW. ================================================ FILE: licenses/OFL-1.1.txt ================================================ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting — in part or in whole — any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. ================================================ FILE: licenses/QCA.txt ================================================ Copyright (c) 2013-2017 Qualcomm Atheros, Inc. All rights reserved. Redistribution and use in binary forms, without modification, are permitted (subject to the limitations in the disclaimer below) provided that the following conditions are met: * Redistributions must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Qualcomm Atheros, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. * No Reverse engineering, decompiling, decrypting, or disassembling of this software is permitted. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. NO LICENSES OR OTHER RIGHTS, WHETHER EXPRESS, IMPLIED, BASED ON ESTOPPEL OR OTHERWISE, ARE GRANTED TO ANY PARTY'S PATENTS, PATENT APPLICATIONS, OR PATENTABLE INVENTIONS BY VIRTUE OF THIS LICENSE OR THE DELIVERY OR PROVISION BY QUALCOMM ATHEROS, INC. OF THE SOFTWARE. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ANY CONTRIBUTOR BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND REGARDLESS OF ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF OR RESULTING FROM THE USE OF THE SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN ANY EVENT, THE TOTAL AGGREGATE LIABILITY THAT MAY BE IMPOSED ON QUALCOMM ATHEROS, INC. FOR ANY DIRECT DAMAGES ARISING UNDER OR RESULTING FROM THIS AGREEMENT OR IN CONNECTION WITH ANY USE OF THE SOFTWARE SHALL NOT EXCEED A TOTAL AMOUNT OF US$5.00. IF ANY OF THE ABOVE PROVISIONS ARE HELD TO BE VOID, INVALID, UNENFORCEABLE, OR ILLEGAL, THE OTHER PROVISIONS SHALL CONTINUE IN FULL FORCE AND EFFECT. ================================================ FILE: licenses/Radeon_rlc.txt ================================================ Copyright (C) 2009, 2010 Advanced Micro Devices, Inc. All rights reserved. REDISTRIBUTION: Permission is hereby granted, free of any license fees, to any person obtaining a copy of this microcode (the "Software"), to install, reproduce, copy and distribute copies, in binary form only, of the Software and to permit persons to whom the Software is provided to do the same, provided that the following conditions are met: No reverse engineering, decompilation, or disassembly of this Software is permitted. Redistributions must reproduce the above copyright notice, this permission notice, and the following disclaimers and notices in the Software documentation and/or other materials provided with the Software. DISCLAIMER: THE USE OF THE SOFTWARE IS AT YOUR SOLE RISK. THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND AND COPYRIGHT HOLDER AND ITS LICENSORS EXPRESSLY DISCLAIM ALL WARRANTIES, EXPRESS AND IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. COPYRIGHT HOLDER AND ITS LICENSORS DO NOT WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. THE ENTIRE RISK ASSOCIATED WITH THE USE OF THE SOFTWARE IS ASSUMED BY YOU. FURTHERMORE, COPYRIGHT HOLDER AND ITS LICENSORS DO NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OR THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY, CURRENTNESS, OR OTHERWISE. DISCLAIMER: UNDER NO CIRCUMSTANCES INCLUDING NEGLIGENCE, SHALL COPYRIGHT HOLDER AND ITS LICENSORS OR ITS DIRECTORS, OFFICERS, EMPLOYEES OR AGENTS ("AUTHORIZED REPRESENTATIVES") BE LIABLE FOR ANY INCIDENTAL, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES (INCLUDING DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, AND THE LIKE) ARISING OUT OF THE USE, MISUSE OR INABILITY TO USE THE SOFTWARE, BREACH OR DEFAULT, INCLUDING THOSE ARISING FROM INFRINGEMENT OR ALLEGED INFRINGEMENT OF ANY PATENT, TRADEMARK, COPYRIGHT OR OTHER INTELLECTUAL PROPERTY RIGHT EVEN IF COPYRIGHT HOLDER AND ITS AUTHORIZED REPRESENTATIVES HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN NO EVENT SHALL COPYRIGHT HOLDER OR ITS AUTHORIZED REPRESENTATIVES TOTAL LIABILITY FOR ALL DAMAGES, LOSSES, AND CAUSES OF ACTION (WHETHER IN CONTRACT, TORT (INCLUDING NEGLIGENCE) OR OTHERWISE) EXCEED THE AMOUNT OF US$10. Notice: The Software is subject to United States export laws and regulations. You agree to comply with all domestic and international export laws and regulations that apply to the Software, including but not limited to the Export Administration Regulations administered by the U.S. Department of Commerce and International Traffic in Arm Regulations administered by the U.S. Department of State. These laws include restrictions on destinations, end users and end use. ================================================ FILE: licenses/Vim.txt ================================================ VIM LICENSE I) There are no restrictions on distributing unmodified copies of Vim except that they must include this license text. You can also distribute unmodified parts of Vim, likewise unrestricted except that they must include this license text. You are also allowed to include executables that you made from the unmodified Vim sources, plus your own usage examples and Vim scripts. II) It is allowed to distribute a modified (or extended) version of Vim, including executables and/or source code, when the following four conditions are met: 1) This license text must be included unmodified. 2) The modified Vim must be distributed in one of the following five ways: a) If you make changes to Vim yourself, you must clearly describe in the distribution how to contact you. When the maintainer asks you (in any way) for a copy of the modified Vim you distributed, you must make your changes, including source code, available to the maintainer without fee. The maintainer reserves the right to include your changes in the official version of Vim. What the maintainer will do with your changes and under what license they will be distributed is negotiable. If there has been no negotiation then this license, or a later version, also applies to your changes. The current maintainer is Bram Moolenaar . If this changes it will be announced in appropriate places (most likely vim.sf.net, www.vim.org and/or comp.editors). When it is completely impossible to contact the maintainer, the obligation to send him your changes ceases. Once the maintainer has confirmed that he has received your changes they will not have to be sent again. b) If you have received a modified Vim that was distributed as mentioned under a) you are allowed to further distribute it unmodified, as mentioned at I). If you make additional changes the text under a) applies to those changes. c) Provide all the changes, including source code, with every copy of the modified Vim you distribute. This may be done in the form of a context diff. You can choose what license to use for new code you add. The changes and their license must not restrict others from making their own changes to the official version of Vim. d) When you have a modified Vim which includes changes as mentioned under c), you can distribute it without the source code for the changes if the following three conditions are met: - The license that applies to the changes permits you to distribute the changes to the Vim maintainer without fee or restriction, and permits the Vim maintainer to include the changes in the official version of Vim without fee or restriction. - You keep the changes for at least three years after last distributing the corresponding modified Vim. When the maintainer or someone who you distributed the modified Vim to asks you (in any way) for the changes within this period, you must make them available to him. - You clearly describe in the distribution how to contact you. This contact information must remain valid for at least three years after last distributing the corresponding modified Vim, or as long as possible. e) When the GNU General Public License (GPL) applies to the changes, you can distribute the modified Vim under the GNU GPL version 2 or any later version. 3) A message must be added, at least in the output of the ":version" command and in the intro screen, such that the user of the modified Vim is able to see that it was modified. When distributing as mentioned under 2)e) adding the message is only required for as far as this does not conflict with the license used for the changes. 4) The contact information as required under 2)a) and 2)d) must not be removed or changed, except that the person himself can make corrections. III) If you distribute a modified version of Vim, you are encouraged to use the Vim license for your changes and make them available to the maintainer, including the source code. The preferred way to do this is by e-mail or by uploading the files to a server and e-mailing the URL. If the number of changes is small (e.g., a modified Makefile) e-mailing a context diff will do. The e-mail address to be used is IV) It is not allowed to remove this license from the distribution of the Vim sources, parts of it or from a modified version. You may use this license for previous Vim releases instead of the license that they came with, at your option. ================================================ FILE: licenses/Zlib.txt ================================================ zlib License This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. ================================================ FILE: package_bump.sh ================================================ #!/bin/bash # This file is part of the Lakka project and was created by ToKe79. It is originally from https://github.com/libretro/Lakka-LibreELEC/blob/master/libretro_update.sh # It has been modified by Shanti Gilbert to work with EmuELEC [ -z "$BUMPS" ] && BUMPS="yes" [ -z "$LR_PKG_PATH" ] && LR_PKG_PATH="./packages" [ -z "$PROJECT" ] && PROJECT="Amlogic-ce" [ -z "$DEVICE" ] && DEVICE="Amlogic-ng" [ -z "$DISTRO" ] && DISTRO="EmuELEC" usage() { echo "" echo "$0 <--all [--exclude list] | --used [--exclude list] | --packages list>" echo "" echo "Updates PKG_VERSION in package.mk of libretro packages to latest." echo "" echo "Parameters:" echo " -a --all Update all libretro packages" echo " -u --used Update only libretro packages used by Lakka" echo " -p list --packages list Update listed libretro packages" echo " -e list --exclude list Update all/used packages except listed ones" echo "" } [ "$1" == "" ] && { usage ; exit ; } case $1 in -a | --all ) s=$1 shift if [ "$1" != "" ] ; then case $1 in -e | --exclude ) PACKAGES_EX="" x="$1" shift v="$@" [ "$v" == "" ] && { echo "Error: You must provide name(s) of package(s) to exclude after $x" ; exit 1 ; } for a in $v ; do if [ -f $(find $LR_PKG_PATH -wholename */$a/package.mk) ] ; then PACKAGES_EX="$PACKAGES_EX $a" else echo "Warning: $a is not a libretro package." fi done [ "$PACKAGES_EX" == "" ] && { echo "No valid packages to exclude given! Aborting." ; exit 1 ; } ;; * ) echo "Error: After $s use only --exclude (-e) to exclude some packages." exit 1 ;; esac fi # Get list of all libretro packages PACKAGES_ALL=`ls $LR_PKG_PATH` ;; -u | --used ) s=$1 shift if [ "$1" != "" ] ; then case $1 in -e | --exclude ) PACKAGES_EX="" x="$1" shift v="$@" [ "$v" == "" ] && { echo "Error: You must provide name(s) of package(s) to exclude after $x" ; exit 1 ; } for a in $v ; do if [ -f $(find $LR_PKG_PATH -wholename */$a/package.mk) ] ; then PACKAGES_EX="$PACKAGES_EX $a" else echo "Warning: $a is not a libretro package." fi done [ "$PACKAGES_EX" == "" ] && { echo "No valid packages to exclude given! Aborting." ; exit 1 ; } ;; * ) echo "Error: After $s use only --exclude (-e) to exclude some packages." exit 1 ;; esac fi # Get list of cores, which are used with Lakka: OPTIONS_FILE="distributions/Sx05RE/options" [ -f "$OPTIONS_FILE" ] && source "$OPTIONS_FILE" || { echo "$OPTIONS_FILE: not found! Aborting." ; exit 1 ; } [ -z "$LIBRETRO_CORES" ] && { echo "LIBRETRO_CORES: empty. Aborting!" ; exit 1 ; } # List of core retroarch packages RA_PACKAGES="retroarch retroarch-assets retroarch-joypad-autoconfig retroarch-overlays libretro-database core-info glsl-shaders" # List of all libretro packages to update: PACKAGES_ALL=" $RA_PACKAGES $LIBRETRO_CORES " ;; -p | --packages ) PACKAGES_ALL="" x="$1" shift v="$@" [ "$v" == "" ] && { echo "Error: You must provide name(s) of package(s) after $x" ; exit 1 ; } for a in $v ; do if [ -f $(find $LR_PKG_PATH -wholename */$a/package.mk) ] ; then PACKAGES_ALL="$PACKAGES_ALL $a " else echo "Warning: $a is not a libretro package - skipping." fi done [ "$PACKAGES_ALL" == "" ] && { echo "No valid packages given! Aborting." ; exit 1 ; } ;; * ) usage echo "Unknown parameter: $1" exit 1 ;; esac if [ "$PACKAGES_EX" != "" ] ; then for a in $PACKAGES_EX ; do PACKAGES_ALL=$(echo " "$PACKAGES_ALL" " | sed "s/\ $a\ /\ /g") done fi echo "Checking following packages: "$PACKAGES_ALL declare -i i=0 declare -i ii=0 for p in $PACKAGES_ALL do f=$(find $LR_PKG_PATH -wholename */$p/package.mk) if [ ! -f "$f" ] ; then echo "$f: not found! Skipping." continue else echo "working on : $f" source config/options "$p" source "$f" fi if [ -z "$PKG_VERSION" ] || [ -z "$PKG_SITE" ] ; then echo "$f: does not have PKG_VERSION or PKG_SITE" echo "PKG_VERSION: $PKG_VERSION" echo "PKG_SITE: $PKG_SITE" echo "Skipping update." continue fi if [ $BUMPS != "no" ]; then if [ "$p" != "linux" ]; then PKG_SITE=$PKG_SITE PKG_SITE_EXT="${PKG_URL: -4}" if [[ $PKG_SITE != *"github.com"* ]]; then echo "Package is not hosted in github, skipping" continue fi if [[ $PKG_EE_UPDATE == "no" ]]; then echo "Package is protected, skipping" continue fi else PKG_SITE=$(echo $PKG_URL | sed 's/\/archive.*//g') fi echo "URL $PKG_SITE" [ -n "$PKG_GIT_BRANCH" ] && PKG_GIT_CLONE_BRANCH="$PKG_GIT_BRANCH" [ -n "$PKG_GIT_CLONE_BRANCH" ] && GIT_HEAD="heads/$PKG_GIT_CLONE_BRANCH" || GIT_HEAD="HEAD" UPS_VERSION=`git ls-remote $PKG_SITE | grep ${GIT_HEAD}$` UPS_VERSION=${UPS_VERSION:0:40} if [ "$UPS_VERSION" == "$PKG_VERSION" ]; then echo "$PKG_NAME is up to date ($UPS_VERSION)" else i+=1 echo "$PKG_NAME updated from $PKG_VERSION to $UPS_VERSION" sed -i "s|PKG_VERSION=\"$PKG_VERSION|PKG_VERSION=\"$UPS_VERSION|" $f fi else UPS_VERSION=$PKG_VERSION fi if [ "$GET_HANDLER_SUPPORT" != "git" ] && [ "${PKG_SITE_EXT}" != ".git" ]; then if grep -q PKG_SHA256 "$f"; then echo "PKG_SHA256 exists on $f, clearing" sed -i "s/PKG_SHA256=\"$PKG_SHA256\"/PKG_SHA256=\"\"/" $f else echo "PKG_SHA256 does not exists on $f, creating" sed -i -e "s/PKG_VERSION=\"$UPS_VERSION\(.*\)\"/PKG_VERSION=\"$UPS_VERSION\1\"\nPKG_SHA256=\"\"/g" $f fi source "$f" ./scripts/get "$PKG_NAME" if [ "$p" != "linux" ]; then CALCSHA=$(cat ${SOURCES_DIR}/$PKG_NAME/$PKG_NAME-$UPS_VERSION.*.sha256) else CALCSHA=$(cat ${SOURCES_DIR}/$PKG_NAME/linux-$LINUX-$UPS_VERSION.tar.gz.sha256) fi echo "NEW SHA256 $CALCSHA" #sed -i -e "s/PKG_VERSION=\"$UPS_VERSION\(.*\)\"\n\(.*\)\PKG_SHA256=\"\"/PKG_VERSION=\"$UPS_VERSION\1\"\nPKG_SHA256=\"$CALCSHA\"/g" $f sed -e "/PKG_VERSION=\"$UPS_VERSION\"/{ N; s/PKG_VERSION=\"$UPS_VERSION\".*PKG_SHA256=\"\"/PKG_VERSION=\"$UPS_VERSION\"\nPKG_SHA256=\"$CALCSHA\"/;}" -i $f # sed -i "s/PKG_SHA256=\"$PKG_SHA256/PKG_SHA256=\"$CALCSHA/" $f ii+=1 fi done echo "$i package(s) bumped. $ii sha256 updated packages" ================================================ FILE: packages/README.md ================================================ # Structure of package.mk files ## Introduction The package.mk file defines variables and functions to build a package. ## Variables To control the build behaviour of your package, use variables in the top-down order listed here. #### Base | Variable | Default | Required |Description | |-------------|---------|----------|------------| | PKG_NAME | - | yes | Name of the packaged software application. Should be lowercase | | PKG_VERSION | - | yes | Version of the packaged software application. If the version is a githash, please use the full githash, not the abbreviated form. | | PKG_SHA256 | - | yes | SHA256 hashsum of the application download file | | PKG_ARCH | any | no | Architectures for which the package builds. `any` or a space separated list of `aarch64`, `arm` or `x86_64` | | PKG_LICENSE | - | yes | License of the software application. [Reference](https://github.com/LibreELEC/LibreELEC.tv/tree/master/licenses) | | PKG_SITE | - | yes | Site of the software application | | PKG_URL | - | yes | Address at which the source of the software application can be retrieved | | PKG_MAINTAINER | - | no | Your name | | PKG_DEPENDS_BOOTSTRAP
PKG_DEPENDS_HOST PKG_DEPENDS_INIT PKG_DEPENDS_TARGET | - | no | A space separated list of name of packages required to build the software application | | PKG_SECTION | - | no | virtual if the package only defines dependencies | | PKG_SHORTDESC | - | no
yes for addons | Short description of the software package | | PKG_LONGDESC | - | yes | Long description of the package including purpose or function within LibreELEC or Kodi | #### Universal Build Option | Variable | Default | Required |Description | |-------------|---------|----------|------------| | PKG_SOURCE_DIR | - | no | Force the folder name that application sources are unpacked to. Used when sources do not automatically unpack to a folder with the `PKG_NAME-PKG_VERSION` naming convention. | | PKG_TAR_STRIP_COMPONENTS | - | no | When this option is set the top level directory is not get stripped off while extracting an archive. | | PKG_SOURCE_NAME | - | no | Force the filename of the application sources. Used when the filename is not the basename of `PKG_URL` | | PKG_PATCH_DIRS | - | no | Patches in `./patches` are automatically applied after package unpack. Use this option to include patches from an additional folder, e.g. `./patches/$PKG_PATCH_DIRS` | | PKG_NEED_UNPACK | - | no | Space separated list of files or folders to include in package stamp calculation. If the stamp is invalidated through changes to package files or dependent files/folders the package is cleaned and rebuilt. e.g. `PKG_NEED_UNPACK="$(get_pkg_directory linux)"` will trigger clean/rebuild of a Linux kernel driver package when a change to the `linux` kernel package is detected. | | PKG_TOOLCHAIN | auto | no | Control which build toolchain is used. For detailed information, see [reference](#toolchain-options). | | PKG_BUILD_FLAGS | - | no | A space separated list of flags with which to fine-tune the build process. Flags can be enabled or disabled with a `+` or `-` prefix. For detailed information, see the [Reference](#build_flags-options). | | PKG_PYTHON_VERSION | python3.8 | no | Define the Python version to be used. | | PKG_IS_KERNEL_PKG | - | no | Set to `yes` for packages that include Linux kernel modules | | PKG_DEPENDS_CONFIG | - | no | Space separated list of packages to add to PKG_CONFIG_PATH. Use this to build with support for `-sysroot` packages (See [reference](BUILD_FLAGS options). | #### Meson Options | Variable | Default | Required |Description | |-------------|---------|----------|------------| | PKG_MESON_SCRIPT | $PKG_BUILD/meson.build | no | Meson build file to use | | PKG_MESON_OPTS_TARGET | - | no | Options directly passed to meson | #### CMAKE Options | Variable | Default | Required |Description | |-------------|---------|----------|------------| | PKG_CMAKE_SCRIPT | $PKG_BUILD/CMakeLists.txt | no | CMake build file to use | | PKG_CMAKE_OPTS_HOST
PKG_CMAKE_OPTS_TARGET | - | no | Options directly passed to cmake | #### Configure Options | Variable | Default | Required |Description | |-------------|---------|----------|------------| | PKG_CONFIGURE_SCRIPT | $PKG_BUILD/configure | no | configure script to use | | PKG_CONFIGURE_OPTS
PKG_CONFIGURE_OPTS_BOOTSTRAP
PKG_CONFIGURE_OPTS_HOST
PKG_CONFIGURE_OPTS_INIT
PKG_CONFIGURE_OPTS_TARGET | - | no | Options directly passed to configure | #### Make Options | Variable | Default | Required |Description | |-------------|---------|----------|------------| | PKG_MAKE_OPTS
PKG_MAKE_OPTS_BOOTSTRP
PKG_MAKE_OPTS_HOST
PKG_MAKE_OPTS_INIT
PKG_MAKE_OPTS_TARGET | - | no | Options directly passed to make in the build step | PKG_MAKEINSTALL_OPTS_HOST
PKG_MAKEINSTALL_OPTS_TARGET | - | no | Options directly passed to make in the install step #### Addons Additional options used when the package builds an addon. | Variable | Default | Required |Description | |-------------|---------|----------|------------| | PKG_REV | - | yes | The revision number of the addon (starts at 100). Must be placed after `PKG_VERSION`. Must be incremented for each new version else Kodi clients will not detect version change and download the updated addon. | | PKG_IS_ADDON | no | yes | Must be set to `yes`
or to `embedded` when this addon is part of the image | | PKG_ADDON_NAME | - | yes | Proper name of the addon that is shown at the repo | | PKG_ADDON_TYPE | - | yes | See LE/config/addon/ for other possibilities | | PKG_ADDON_VERSION | - | no | The version of the addon, used in addon.xml | | PKG_ADDON_PROVIDES | - | no | [Provides](http://kodi.wiki/view/addon.xml#.3Cprovides.3E_element) in addon-xml | | PKG_ADDON_REQUIRES | - | no | [Requires](http://kodi.wiki/view/addon.xml#.3Crequires.3E) used in addon.xml | | PKG_ADDON_PROJECTS | @PROJECTS@ | no | for available projects or devices, see projects subdirectory (note: Use RPi for RPi project, and RPi1 for RPi device) | | PKG_DISCLAIMER | - | no | [Disclaimer](https://kodi.wiki/view/Addon.xml#.3Cdisclaimer.3E) in addon-xml | | PKG_ADDON_IS_STANDALONE | - | no | Defines if an addon depends on Kodi (on) or is standalone (yes) | | PKG_ADDON_BROKEN | - | no | Marks an addon as broken for the user | #### Detailed Information for Options ##### TOOLCHAIN options Application/packages needs different toolchains for build. For instance `cmake` or the classic `./configure` or same very different. For the most application/packages, the auto-detection of the toolchain works proper. But not always. To select a specific toolchain, you only need to set the `PKG_TOOLCHAIN` variable. | Toolchain | Description (if needed) | |----------- |-------------------------| | meson | [Meson Build System](http://mesonbuild.com/) | | cmake | [CMake](https://cmake.org/) with Ninja | | cmake-make | [CMake](https://cmake.org/) with Make | | autotools | [GNU Build System](https://en.wikipedia.org/wiki/GNU_Build_System) | configure | preconfigured [GNU Build System](https://en.wikipedia.org/wiki/GNU_Build_System) | | ninja | [Ninja Build](https://ninja-build.org/) | | make | [Makefile Based](https://www.gnu.org/software/make/) | | manual | only runs self writen build steps, see [Functions](#functions) | ###### Auto-Detection The auto-detections looks for specific files in the source path. 1. `meson.build` (PKG_MESON_SCRIPT) => meson toolchain 2. `CMakeLists.txt` (PKG_CMAKE_SCRIPT) => cmake toolchain 3. `configure` (PKG_CONFIGURE_SCRIPT) => configure toolchain 4. `Makefile` => make toolchain When none of these was found, the build abort and you have to set the toolchain via `PKG_TOOLCHAIN` ##### BUILD_FLAGS options Build flags implement often used build options. Normally these are activated be default, but single applications/packages has problems to compile/run with these. Set the variable `PKG_BUILD_FLAGS` in the `package.mk` to enable/disable the single flags. It is a space separated list. The flags can enabled with a `+` prefix, and disabled with a `-`. | flag | default | affected stage(s) | description | |----------|----------|-------------------|-------------| | pic | disabled | target, init | [Position Independent Code](https://en.wikipedia.org/wiki/Position-independent_code) | | pic:host | disabled | host, bootstrap | see above | | speed | disabled | target, init | replaces default `-O2` compiler optimization with `-O3` (can only enable; overrules size) | | size | disabled | target, init | replaces default `-O2` compiler optimization with `-Os` (can only enable) | | lto | disabled | target, init | enable LTO (Link Time optimization) in the compiler and linker unless disabled via `LTO_SUPPORT`. Compiles non-fat LTO objects (only bytecode) and performs single-threaded optimization at link stage | | lto-parallel | disabled | target, init | same as `lto` but enables parallel optimization at link stage. Only enable this if the package build doesn't run multiple linkers in parallel otherwise this can result in lots of parallel processes! | | lto-fat | disabled | target, init | same as `lto` but compile fat LTO objects (bytecode plus optimized assembly). This increases compile time but can be useful to create static libraries suitable both for LTO and non-LTO linking | | lto-off | disabled | target, init | explicitly disable LTO in the compiler and linker | | bfd | - | target, init | `+bfd` prefers bfd linker over default linker, `-bfd` disables using bfd | | gold | - | target, init | `+gold` prefers gold linker over default linker, `-gold` disables using gold | | mold | - | target, init | `+mold` prefers mold linker over default linker, `-mold` disables using gold | | parallel | enabled | all | `make` or `ninja` builds with multiple threads/processes (or not) | | strip | enabled | target | strips executables (or not) | | sysroot | enabled | target | installs the package to the sysroot folder (or not) | | local-cc | disabled | host | use compiler from buildhost instead of host-gcc/g++ in toolchain | ###### Example ``` PKG_BUILD_FLAGS="+pic -gold" PKG_BUILD_FLAGS="-parallel" ``` ## Functions All build steps in the LibreELEC build system are done by shell function. These functions can be overwritten in the `package.mk`. However, this raises problems when the build system is updated. To reduce the impact, most functions are extended by `pre_` and `post_` scripts to use instead. When it is nesseary to replace configure, make and makeinstall, please use `PKG_TOOLCHAIN="manual"`. Some of the build steps needs to be run once, like `unpack`. Other steps needs to be run multiple times, to create the toolchain (stage bootstrap & host) or to create the LE image (stage init & target). These stage specific functions have the stage as suffix, like `make_target`. Full list of overwrittable functions. | function | stages specific | description | |-------------------------|--------|-------------| | configure_package | - | Optional function to implement late binding variable assignment (see below) | | unpack
pre_unpack
post_unpack | - | Extract the source from the downloaded file | | pre_patch
post_patch | - | Apply the patches to the source, after extraction. The patch function it self is not allowed to overwritten | | pre_build_\[stage] | yes | Runs before of the start of the build | | pre_configure
pre_configure_\[stage]
configure_\[stage]
post_configure_\[stage] | yes | Configure the package for the compile. This is only relevant for toolchain, that supports it (e.g. meson, cmake, configure, manual) | | make_\[stage]
pre_make_\[stage]
post_make_\[stage] | yes | Build of the package | | makeinstall_\[stage]
pre_makeinstall_\[stage]
post_makeinstall_\[stage] | yes | Installation of the files in the correct pathes
host: TOOLCHAIN
target: SYSROOT and IMAGE
bootstrap and init: temporary destination | addon | - | Copy all files together for addon creation. This is requiered for addons | | post_install_addon | - | Post processing of installed addon files in `${INSTALL}` directory | ## Directory structure Every package has its own set of build and install directories. The sources are extracted and built in the former, and build artifacts are installed to the latter. Usually an install target provided by the package build system will populate the install directory automatically, but it's important that you use the standard `usr/lib/`, `usr/bin/` etc. structure when doing so manually, because the contents of the install directory will be part of the final image (with the exception of top level hidden directories). Sometimes it's necessary to access build artifacts from different packages - like an addon collecting files of various other packages. In that case you need to access the files using the package's install directories (and not their build directories since they might not exist anymore). If you need additional files which should not be part of the final image, you can use a hidden directory for those - grep for `.noinstall` for some examples. ## Late Binding variable assignment A package will be loaded only once, by the call to `config/options`. During this process, additional package specific variables will be initialised, such as: * `PKG_BUILD` - path to the build folder * `PKG_SOURCE_NAME` - if not already specified, generated from `PKG_URL`, `PKG_NAME` and` PKG_VERSION` Since these variables will not exist at the time the package is loaded, they can only be referenced **after** package has loaded. This can be accomplished by referencing these variables in the `configure_package()` function which is executed once the additional variables have been assigned. If necessary, the following variables would be configured in `configure_package()` as they are normally relative to `${PKG_BUILD}`: ``` PKG_CONFIGURE_SCRIPT PKG_CMAKE_SCRIPT PKG_MESON_SCRIPT ``` Further to this, toolchain variables that are defined in `setup_toolchain()` must not be referenced "globally" in the package as they will only be configured reliably after `setup_toolchain()` has been called during `scripts/build`. Any variable in the following list must instead be referenced in a package function such as `pre_build_*`, `pre_configure_*`, `pre_make_*` etc.: ``` TARGET_CFLAGS TARGET_CXXFLAGS TARGET_LDFLAGS NINJA_OPTS MAKEFLAGS DESTIMAGE CC CXX CPP LD AS AR NM RANLIB OBJCOPY OBJDUMP STRIP CPPFLAGS CFLAGS CXXFLAGS LDFLAGS PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PKG_CONFIG_SYSROOT_DIR PKG_CONFIG_ALLOW_SYSTEM_CFLAGS PKG_CONFIG_ALLOW_SYSTEM_LIBS CMAKE_CONF CMAKE HOST_CC HOST_CXX HOSTCC HOSTCXX CC_FOR_BUILD CXX_FOR_BUILD BUILD_CC BUILD_CXX _python_sysroot _python_prefix _python_exec_prefix ``` Lastly, the following variables are assigned during `scripts/build` but some packages may need to use alternative values for these variables. To do so, the package must assign alternative values in `pre_build_*`/`pre_configure_*`/`pre_make_*` etc. functions as these functions will be called after the variables are initialised with default values in `scripts/build` but before they are used by `scripts/build`. ``` CMAKE_GENERATOR_NINJA TARGET_CONFIGURE_OPTS TARGET_CMAKE_OPTS TARGET_MESON_OPTS HOST_CONFIGURE_OPTS HOST_CMAKE_OPTS HOST_MESON_OPTS INIT_CONFIGURE_OPTS INIT_CMAKE_OPTS INIT_MESON_OPTS BOOTSTRAP_CONFIGURE_OPTS BOOTSTRAP_CMAKE_OPTS BOOTSTRAP_MESON_OPTS ``` #### Example ``` configure_package() { # now we know where we're building, assign a value PKG_CONFIGURE_SCRIPT="${PKG_BUILD}/gettext-tools/configure" } post_patch() { # replace hardcoded stuff sed -i ${PKG_CONFIGURE_SCRIPT} 's|hardcoded stuff|variable stuff|' } pre_configure_target() { # add extra flag to toolchain default CFLAGS="$CFLAGS -DEXTRA_FLAG=yeah" } post_makeinstall_target() { # remove unused executable, install what remains rm $INSTALL/usr/bin/bigexecutable } ``` #### tools/pkgcheck Use `tools/pkgcheck` to verify packages. It detects the following issues: Issue | Level | Meaning | | :--- | :----: | ---- | | late binding violation | FAIL | Late binding variables referenced outside of a function - see [late binding](https://github.com/LibreELEC/LibreELEC.tv/blob/master/packages/readme.md#late-binding-variable-assignment) | | duplicate function def | FAIL | Function defined multiple times, only last definition will be used | | bad func - missing brace | FAIL | Opening brace (`{`) for function definition should be on same line as the function def, ie. `pre_configure_target() {` | | intertwined vars & funcs | WARN | Variable assignments and logic is intertwined with functions - this is cosmetic, but variables and logic should be specified before all functions | | unknown function | WARN | Could be a misspelled function, ie. `per_configure_target() {` which might fail silently.| | ignored depends assign | WARN | Values assigned to `PKG_DEPENDS_*` outside of the global section or `configure_package()` will be ignored. | ## Add a new package to the Image 1. Think about, why you need it in the image. * new multimedia tool * add a new network tool * new kernel driver * ... 2. Find a place in the packages tree * look into the package tree structure, which is generally self explaind. * do not place it in an existing package (directory that includes a `package.mk`) * when you found a place, create a directory with the name of your package (use same value for `PKG_NAME`!!) 3. Create an initial `package.mk` * you can find a template under `packages/package.mk.template`. Copy the template into the new directory and call it `package.mk` * apply any required changes to your new `package.mk` 4. Find a place in the dependency tree * when it extend an existing package, add it there to the `PKG_DEPENDS_TARGET`/`PKG_DEPENDS_HOST` etc. * take a look into the path `packages/virtual`, there you should find a virtual packages, that match your new package (misc-packages should be the last option) 5. Now you can build your image * after the build, inside the `BUILD_DIR` (normally build.*) folder you should find a directory with your package name and -version, eg. `widget-1.2.3`. ## Example ``` # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mariadb-connector-c" PKG_VERSION="3.0.2" PKG_SHA256="f44f436fc35e081db3a56516de9e3bb11ae96838e75d58910be28ddd2bc56d88" PKG_LICENSE="LGPL" PKG_SITE="https://mariadb.org/" PKG_URL="https://github.com/MariaDB/mariadb-connector-c/archive/v$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain zlib openssl" PKG_LONGDESC="mariadb-connector: library to conntect to mariadb/mysql database server" PKG_BUILD_FLAGS="-gold" PKG_CMAKE_OPTS_TARGET="-DWITH_EXTERNAL_ZLIB=ON \ -DAUTH_CLEARTEXT=STATIC \ -DAUTH_DIALOG=STATIC \ -DAUTH_OLDPASSWORD=STATIC \ -DREMOTEIO=OFF" post_makeinstall_target() { # drop all unneeded rm -rf $INSTALL/usr } ``` ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_ADS1x15/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_ADS1x15" PKG_VERSION="a963cc0ee83e2ba6d671b02df5febf7250f626aa" PKG_SHA256="2f81a9a6b7b7f46b79faa5b01df0c25fa5f16af80842d74e35b5fbf01ab0c619" PKG_LICENSE="MIT" PKG_SITE="https://github.com/adafruit/${PKG_NAME}" PKG_URL="https://github.com/adafruit/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Python code to use the ADS1015 and ADS1115 analog to digital converters with a Raspberry Pi." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_ADXL345/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_ADXL345" PKG_VERSION="dca3d90b5477a304fa130f5cc90ea59e3968ce6f" PKG_SHA256="22ec0fc6679cc3e9b5f0aff5cfeef34cbbf13e59aecfb829c2f0dc2d90b5fb8b" PKG_LICENSE="MIT" PKG_SITE="https://github.com/adafruit/${PKG_NAME}" PKG_URL="https://github.com/adafruit/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Python code to use the ADXL345 triple-axis accelerometer over I2C with a Raspberry Pi." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_BMP/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_BMP" PKG_VERSION="e8521e969afae3321d9789353d7e92ea9a5e9a56" PKG_SHA256="e5e140c34e312f6a00c62b1bd47ebe3f1857009b1c202c18c7b092ebb2e1eb9c" PKG_LICENSE="MIT" PKG_SITE="https://github.com/adafruit/${PKG_NAME}" PKG_URL="https://github.com/adafruit/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Python library for accessing the BMP series pressure and temperature sensors like the BMP085/BMP180 on a Raspberry Pi." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_CharLCD/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_CharLCD" PKG_VERSION="bc75cad284766240424f29dc8e7b84d0caceb72e" PKG_SHA256="eae4b446162feb533a469a9dacf6e750250f925561c9f7983a11d340e1dd98d4" PKG_LICENSE="MIT" PKG_SITE="https://github.com/adafruit/${PKG_NAME}" PKG_URL="https://github.com/adafruit/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Python library for accessing Adafruit character LCDs from a Raspberry Pi." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_DHT/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_DHT" PKG_VERSION="18846deec6a96572b3f2c4a9edfb5bac55b46f5b" PKG_SHA256="9125f8f42b4874db257a45184b866e8b424aa67230d2ffbc734b53686da7817f" PKG_LICENSE="MIT" PKG_SITE="https://github.com/adafruit/${PKG_NAME}" PKG_URL="https://github.com/adafruit/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Python library to read the DHT series of humidity and temperature sensors on a Raspberry Pi." PKG_TOOLCHAIN="manual" pre_make_target() { export PYTHONXCPREFIX="${SYSROOT_PREFIX}/usr" export LDSHARED="${CC} -shared" } make_target() { case "${PROJECT}:${DEVICE}" in "RPi:RPi") PKG_RPI_VERSION="--force-pi" ;; "RPi:RPi2") PKG_RPI_VERSION="--force-pi2" ;; *) PKG_RPI_VERSION="" esac python3 setup.py build ${PKG_RPI_VERSION} --cross-compile } ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_GPIO/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_GPIO" PKG_VERSION="c543d1df9c0a71bafb9f0a1f9dceecd79a920e74" PKG_SHA256="d3cb74fd033ebe5aea1786a584d64ef5eb8082ef2bf0a568b01691612cd04e88" PKG_LICENSE="MIT" PKG_SITE="https://github.com/adafruit/${PKG_NAME}" PKG_URL="https://github.com/adafruit/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Library to provide a cross-platform GPIO interface on the Raspberry Pi ." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_LED_Backpack/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_LED_Backpack" PKG_VERSION="e34b9548e86e63747563a94f02b65b2980fdefff" PKG_SHA256="244d2625cdaebdc68e299fedde276efa5c9f7c143681c4ee056fb8350a4f7167" PKG_LICENSE="MIT" PKG_SITE="https://github.com/adafruit/${PKG_NAME}" PKG_URL="https://github.com/adafruit/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Python library for controlling LED backpack displays." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_LSM303/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_LSM303" PKG_VERSION="37d288844515d7bb62a2329982eb033e92dceceb" PKG_SHA256="609591f2add15e849d3bba320417c705a50a3ed077632baf20c12c8b740d5331" PKG_LICENSE="MIT" PKG_SITE="https://github.com/adafruit/${PKG_NAME}" PKG_URL="https://github.com/adafruit/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Python code to use the LSM303 accelerometer & magnetometer with Raspberry Pi." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_MCP3008/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_MCP3008" PKG_VERSION="e721d26e650c99b0f6d3efd4ec30444e1adf5ccd" PKG_SHA256="f5e4c847a87716c16f0209df95c281b5071549644a79a143a77b212f25c464dc" PKG_LICENSE="MIT" PKG_SITE="https://github.com/adafruit/${PKG_NAME}" PKG_URL="https://github.com/adafruit/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Python code to use the MCP3008 analog to digital converter with a Raspberry Pi." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_MCP4725/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_MCP4725" PKG_VERSION="4d028bbcf58b011a8f14c5d95057b7e1dcc1064e" PKG_SHA256="6ebbd1f76807b01dc2b723064e52b0c82fc45388265b8ec867e0a42a46a6e926" PKG_LICENSE="MIT" PKG_SITE="https://github.com/adafruit/${PKG_NAME}" PKG_URL="https://github.com/adafruit/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Python code to use the MCP4725 digital to analog converter with a Raspberry Pi." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_PCA9685/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_PCA9685" PKG_VERSION="f86db2ca5de379748afd71e379ce2155f47d21e7" PKG_SHA256="46e11dcfbfaab5756ddeb6ab31740cf8c7419ec1d32be2519f19882e7d86e426" PKG_LICENSE="MIT" PKG_SITE="https://github.com/adafruit/${PKG_NAME}" PKG_URL="https://github.com/adafruit/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Python code to use the PCA9685 PWM servo/LED controller with a Raspberry Pi." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_PureIO/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_PureIO" PKG_VERSION="6f4976d91c52d70b67b28bba75a429b5328a52c1" PKG_SHA256="891a4d077fe6610de6aa4b0dc5b9933a6c7db3492072df60c0383662f28c2ae9" PKG_LICENSE="MIT" PKG_SITE="https://github.com/adafruit/${PKG_NAME}" PKG_URL="https://github.com/adafruit/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Pure python access to Linux IO including I2C and SPI." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_SI1145/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_SI1145" PKG_VERSION="18c400643b39dbf29ab7ff8e74ab0c5c36ef5cf1" PKG_SHA256="0238b2c01cfbb2890ae78468d2fc19c815748fc94860a4eb92b649d074476264" PKG_LICENSE="MIT" PKG_SITE="https://github.com/THP-JOE/Python_SI1145" PKG_URL="https://github.com/THP-JOE/Python_SI1145/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Python library for accessing the SI1145 temperature sensor on a Raspberry Pi" PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_SSD1306/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_SSD1306" PKG_VERSION="8819e2d203df49f2843059d981b7347d9881c82b" PKG_SHA256="ed1163dee2fe6c0c2065a429e1d93cff7397a309071ff83714c84566739680a2" PKG_LICENSE="MIT" PKG_SITE="https://github.com/adafruit/${PKG_NAME}" PKG_URL="https://github.com/adafruit/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="SSD1306 oled driver library for 'monochrome' 128x64 and 128x32 OLEDs." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_TCS34725/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_TCS34725" PKG_VERSION="6306f90b4601237a852acef89eeecc1261ce38b3" PKG_SHA256="f2c3218551da55d7fdbe2499a6ffa3a0b8ed1709e4402c6b0e0f37b17d4aa81f" PKG_LICENSE="MIT" PKG_SITE="https://github.com/adafruit/${PKG_NAME}" PKG_URL="https://github.com/adafruit/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Python code to use the TCS34725 color sensor with the Raspberry Pi." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_VCNL40xx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_VCNL40xx" PKG_VERSION="5c72575b7390fbedfae0b5fb2a881ca9efe9ca22" PKG_SHA256="78346836965562720248138203a4af9dc6aa18815bda2a5b7842e3b9af9d1ea8" PKG_LICENSE="MIT" PKG_SITE="https://github.com/adafruit/${PKG_NAME}" PKG_URL="https://github.com/adafruit/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Python code to use the VCNL4000 & VCNL4010 proximity sensors with the Raspberry Pi." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/adafruit-libraries-depends/Adafruit_Python_WS2801/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Adafruit_Python_WS2801" PKG_VERSION="d0c190715ffef1b00e5ffa2d7b7560e7f8ed4263" PKG_SHA256="6219edb5c1d767ff950f5020bacdfb5ba608b4995eb14d6073fdec2f17f584cb" PKG_LICENSE="MIT" PKG_SITE="https://github.com/adafruit/${PKG_NAME}" PKG_URL="https://github.com/adafruit/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Python code to control WS2801 and similar SPI interface addressable RGB LED strips on a Raspberry Pi." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/argtable2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="argtable2" PKG_VERSION="2.13" PKG_SHA256="8f77e8a7ced5301af6e22f47302fdbc3b1ff41f2b83c43c77ae5ca041771ddbf" PKG_LICENSE="BSD" PKG_SITE="http://argtable.sourceforge.net/" PKG_URL="https://downloads.sourceforge.net/project/argtable/argtable/argtable-${PKG_VERSION}/argtable2-${PKG_VERSION:2:4}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Argtable is an open source ANSI C library that parses GNU-style command-line options." PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--enable-static --disable-shared" ================================================ FILE: packages/addons/addon-depends/ccid/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ccid" PKG_VERSION="1.5.2" PKG_SHA256="13934487e6f8b48f699a16d367cc7a1af7a3ca874de721ac6e9633beb86e7219" PKG_LICENSE="LGPL" PKG_SITE="https://ccid.apdu.fr" PKG_URL="https://ccid.apdu.fr/files/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain pcsc-lite" PKG_LONGDESC="A generic USB Chip/Smart Card Interface Devices driver." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--enable-static --enable-twinserial" post_configure_target() { libtool_remove_rpath libtool } make_target() { make make -C src/ Info.plist } ================================================ FILE: packages/addons/addon-depends/chrome-depends/at-spi2-atk/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2017 Escalade # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="at-spi2-atk" PKG_VERSION="2.38.0" PKG_SHA256="cfa008a5af822b36ae6287f18182c40c91dd699c55faa38605881ed175ca464f" PKG_LICENSE="OSS" PKG_SITE="http://www.gnome.org/" PKG_URL="https://ftp.gnome.org/pub/gnome/sources/at-spi2-atk/${PKG_VERSION:0:4}/at-spi2-atk-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain at-spi2-core atk libX11 libxml2" PKG_LONGDESC="A GTK+ module that bridges ATK to D-Bus at-spi." ================================================ FILE: packages/addons/addon-depends/chrome-depends/at-spi2-core/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2017 Escalade # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="at-spi2-core" PKG_VERSION="2.47.1" PKG_SHA256="c6ba7c160434edebf09d2936933569c936f6ec972301766f2bdac5a4d418153c" PKG_LICENSE="OSS" PKG_SITE="https://www.gnome.org/" PKG_URL="https://download.gnome.org/sources/at-spi2-core/${PKG_VERSION:0:4}/at-spi2-core-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain atk dbus glib libXtst" PKG_LONGDESC="Protocol definitions and daemon for D-Bus at-spi." PKG_MESON_OPTS_TARGET="-Ddocs=false \ -Dintrospection=disabled \ -Ddbus_daemon=/usr/bin/dbus-daemon" pre_configure_target() { TARGET_LDFLAGS="${LDFLAGS} -lXext" } ================================================ FILE: packages/addons/addon-depends/chrome-depends/atk/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="atk" PKG_VERSION="2.38.0" PKG_SHA256="ac4de2a4ef4bd5665052952fe169657e65e895c5057dffb3c2a810f6191a0c36" PKG_LICENSE="GPL" PKG_SITE="http://library.gnome.org/devel/atk/" PKG_URL="https://ftp.gnome.org/pub/gnome/sources/atk/${PKG_VERSION:0:4}/atk-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain glib glib:host" PKG_LONGDESC="Provides the set of accessibility interfaces that are implemented by other applications." PKG_BUILD_FLAGS="+pic" PKG_MESON_OPTS_TARGET="-Ddocs=false \ -Dintrospection=false" ================================================ FILE: packages/addons/addon-depends/chrome-depends/chrome-libXcomposite/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) . $(get_pkg_directory libXcomposite)/package.mk PKG_NAME="chrome-libXcomposite" PKG_LONGDESC="libXcomposite for chrome" PKG_URL="" PKG_DEPENDS_UNPACK+=" libXcomposite" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="${PKG_CONFIGURE_OPTS_TARGET} \ --disable-static \ --enable-shared" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/${PKG_NAME:7}/${PKG_NAME:7}-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } ================================================ FILE: packages/addons/addon-depends/chrome-depends/chrome-libXdamage/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) . $(get_pkg_directory libXdamage)/package.mk PKG_NAME="chrome-libXdamage" PKG_LONGDESC="libXdamage for chrome" PKG_URL="" PKG_DEPENDS_UNPACK+=" libXdamage" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="${PKG_CONFIGURE_OPTS_TARGET} \ --disable-static \ --enable-shared" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/${PKG_NAME:7}/${PKG_NAME:7}-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } ================================================ FILE: packages/addons/addon-depends/chrome-depends/chrome-libXfixes/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) . $(get_pkg_directory libXfixes)/package.mk PKG_NAME="chrome-libXfixes" PKG_LONGDESC="libXfixes for chrome" PKG_URL="" PKG_DEPENDS_UNPACK+=" libXfixes" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="${PKG_CONFIGURE_OPTS_TARGET} \ --disable-static \ --enable-shared" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/${PKG_NAME:7}/${PKG_NAME:7}-${PKG_VERSION}.tar.bz2 -C ${PKG_BUILD} } ================================================ FILE: packages/addons/addon-depends/chrome-depends/chrome-libXi/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) . $(get_pkg_directory libXi)/package.mk PKG_NAME="chrome-libXi" PKG_LONGDESC="libXi for chrome" PKG_URL="" PKG_DEPENDS_UNPACK+=" libXi" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="${PKG_CONFIGURE_OPTS_TARGET} \ --disable-static \ --enable-shared" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/${PKG_NAME:7}/${PKG_NAME:7}-${PKG_VERSION}.tar.bz2 -C ${PKG_BUILD} } ================================================ FILE: packages/addons/addon-depends/chrome-depends/chrome-libXrender/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) . $(get_pkg_directory libXrender)/package.mk PKG_NAME="chrome-libXrender" PKG_LONGDESC="libXrender for chrome" PKG_URL="" PKG_DEPENDS_UNPACK+=" libXrender" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="${PKG_CONFIGURE_OPTS_TARGET} \ --disable-static \ --enable-shared" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/${PKG_NAME:7}/${PKG_NAME:7}-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } ================================================ FILE: packages/addons/addon-depends/chrome-depends/chrome-libXtst/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) . $(get_pkg_directory libXtst)/package.mk PKG_NAME="chrome-libXtst" PKG_LONGDESC="libXtst for chrome" PKG_URL="" PKG_DEPENDS_UNPACK+=" libXtst" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="${PKG_CONFIGURE_OPTS_TARGET} \ --disable-static \ --enable-shared" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/${PKG_NAME:7}/${PKG_NAME:7}-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } ================================================ FILE: packages/addons/addon-depends/chrome-depends/chrome-libxcb/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) . $(get_pkg_directory libxcb)/package.mk PKG_NAME="chrome-libxcb" PKG_LONGDESC="libxcb for chrome" PKG_URL="" PKG_DEPENDS_UNPACK+=" libxcb" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="${PKG_CONFIGURE_OPTS_TARGET} \ --disable-static \ --enable-shared" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/${PKG_NAME:7}/${PKG_NAME:7}-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } ================================================ FILE: packages/addons/addon-depends/chrome-depends/chrome-libxkbcommon/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) . $(get_pkg_directory libxkbcommon)/package.mk PKG_NAME="chrome-libxkbcommon" PKG_LONGDESC="libxkbcommon for chrome" PKG_URL="" PKG_DEPENDS_UNPACK+=" libxkbcommon" PKG_BUILD_FLAGS="-sysroot" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/${PKG_NAME:7}/${PKG_NAME:7}-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } ================================================ FILE: packages/addons/addon-depends/chrome-depends/chrome-libxshmfence/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) . $(get_pkg_directory libxshmfence)/package.mk PKG_NAME="chrome-libxshmfence" PKG_LONGDESC="libxshmfence for chrome" PKG_URL="" PKG_DEPENDS_UNPACK+=" libxshmfence" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="${PKG_CONFIGURE_OPTS_TARGET} \ --disable-static \ --enable-shared" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/${PKG_NAME:7}/${PKG_NAME:7}-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } ================================================ FILE: packages/addons/addon-depends/chrome-depends/cups/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2017 Escalade # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="cups" PKG_VERSION="2.4.2" PKG_SHA256="7095b2977bb728ded5566a5c802866062840d6541fd027836865949a407c3682" PKG_LICENSE="GPL" PKG_SITE="http://www.cups.org" PKG_URL="https://github.com/openprinting/cups/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain gnutls zlib" PKG_LONGDESC="CUPS printing system." PKG_BUILD_FLAGS="+pic -sysroot" PKG_CONFIGURE_OPTS_TARGET="--libdir=/usr/lib \ --disable-gssapi \ --with-dnssd=no \ --with-tls=gnutls --disable-unit-tests" pre_configure_target() { cd .. rm -rf .${TARGET_NAME} } makeinstall_target() { make BUILDROOT="${INSTALL}" install } ================================================ FILE: packages/addons/addon-depends/chrome-depends/gtk3/files/settings.ini ================================================ [Settings] gtk-icon-theme-name = Adwaita gtk-theme-name = Adwaita gtk-font-name = Liberation Sans 12 ================================================ FILE: packages/addons/addon-depends/chrome-depends/gtk3/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2017 Escalade # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="gtk3" PKG_VERSION="3.24.36" PKG_SHA256="27a6ef157743350c807ffea59baa1d70226dbede82a5e953ffd58ea6059fe691" PKG_LICENSE="LGPL" PKG_SITE="http://www.gtk.org/" PKG_URL="https://ftp.gnome.org/pub/gnome/sources/gtk+/${PKG_VERSION:0:4}/gtk+-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain at-spi2-atk atk cairo gdk-pixbuf glib libX11 libXi libXrandr libepoxy pango libxkbcommon" PKG_DEPENDS_CONFIG="libXft pango gdk-pixbuf shared-mime-info" PKG_LONGDESC="A library for creating graphical user interfaces for the X Window System." PKG_BUILD_FLAGS="-sysroot" PKG_MESON_OPTS_TARGET="-Dbroadway_backend=false \ -Dcloudproviders=false \ -Dcolord=no \ -Ddemos=false \ -Dexamples=false \ -Dgtk_doc=false \ -Dintrospection=false \ -Dman=false \ -Dprint_backends=file,lpr \ -Dquartz_backend=false \ -Dtests=false \ -Dwayland_backend=false \ -Dwin32_backend=false \ -Dxinerama=no \ -Dbuiltin_immodules=yes \ -Dx11_backend=true" pre_configure_target() { # ${TOOLCHAIN}/bin/glib-compile-resources requires ${TOOLCHAIN}/lib/libffi.so.6 export LD_LIBRARY_PATH="${TOOLCHAIN}/lib:${LD_LIBRARY_PATH}" export GLIB_COMPILE_RESOURCES=glib-compile-resources GLIB_MKENUMS=glib-mkenums GLIB_GENMARSHAL=glib-genmarshal } ================================================ FILE: packages/addons/addon-depends/chrome-depends/gtk3/patches/disable-to-pixdata-build.patch ================================================ --- a/gtk/gen-gtk-gresources-xml.py 2021-02-24 19:13:19.000000000 +0000 +++ b/gtk/gen-gtk-gresources-xml.py 2021-04-03 23:52:35.000000000 +0000 @@ -23,11 +23,6 @@ theme/Adwaita/gtk-contained-dark.css ''' -for f in get_files('theme/Adwaita/assets', '.png'): - xml += ' theme/Adwaita/assets/{0}\n'.format(f) - -xml += '\n' - for f in get_files('theme/Adwaita/assets', '.svg'): xml += ' theme/Adwaita/assets/{0}\n'.format(f) @@ -38,11 +33,6 @@ theme/HighContrast/gtk-contained-inverse.css ''' -for f in get_files('theme/HighContrast/assets', '.png'): - xml += ' theme/HighContrast/assets/{0}\n'.format(f) - -xml += '\n' - for f in get_files('theme/HighContrast/assets', '.svg'): xml += ' theme/HighContrast/assets/{0}\n'.format(f) ================================================ FILE: packages/addons/addon-depends/chrome-depends/harfbuzz-icu/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . $(get_pkg_directory harfbuzz)/package.mk PKG_NAME="harfbuzz-icu" PKG_URL="" PKG_DEPENDS_TARGET+=" icu" PKG_LONGDESC="HarfBuzz with icu" PKG_DEPENDS_CONFIG="icu" PKG_DEPENDS_UNPACK+=" harfbuzz" PKG_BUILD_FLAGS="-sysroot" PKG_MESON_OPTS_TARGET="-Dbenchmark=disabled \ -Dcairo=enabled \ -Ddocs=disabled \ -Dfreetype=enabled \ -Dglib=enabled \ -Dgobject=disabled \ -Dgraphite=disabled \ -Dicu=enabled \ -Dtests=disabled" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/${PKG_NAME:0:8}/${PKG_NAME:0:8}-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } ================================================ FILE: packages/addons/addon-depends/chrome-depends/libXScrnSaver/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libXScrnSaver" PKG_VERSION="1.2.4" PKG_SHA256="75cd2859f38e207a090cac980d76bc71e9da99d48d09703584e00585abc920fe" PKG_LICENSE="GPL" PKG_SITE="https://xorg.freedesktop.org/" PKG_URL="https://xorg.freedesktop.org/releases/individual/lib/libXScrnSaver-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libXext scrnsaverproto" PKG_LONGDESC="X11 Screen Saver extension client library." PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--disable-static \ --enable-shared \ --enable-malloc0returnsnull" ================================================ FILE: packages/addons/addon-depends/chrome-depends/libXcursor/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libXcursor" PKG_VERSION="1.2.1" PKG_SHA256="46c143731610bafd2070159a844571b287ac26192537d047a39df06155492104" PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/libXcursor-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libX11 libXfixes libXrender" PKG_LONGDESC="X11 Cursor management library.s" PKG_BUILD_FLAGS="+pic -sysroot" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/addons/addon-depends/chrome-depends/libXft/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libXft" PKG_VERSION="2.3.7" PKG_SHA256="79f0b37c45007381c371a790c2754644ad955166dbf2a48e3625032e9bdd4f71" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/libXft-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain fontconfig freetype libXrender util-macros xorgproto" PKG_LONGDESC="X FreeType library." PKG_BUILD_FLAGS="+pic -sysroot" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared" ================================================ FILE: packages/addons/addon-depends/chrome-depends/libxss/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libxss" PKG_VERSION="1.2.4" PKG_SHA256="75cd2859f38e207a090cac980d76bc71e9da99d48d09703584e00585abc920fe" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/libXScrnSaver-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros libXext scrnsaverproto" PKG_LONGDESC="X11 Screen Saver extension library." PKG_BUILD_FLAGS="+pic -sysroot" PKG_CONFIGURE_OPTS_TARGET="--enable-malloc0returnsnull" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/addons/addon-depends/chrome-depends/scrnsaverproto/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="scrnsaverproto" PKG_VERSION="1.2.2" PKG_SHA256="8bb70a8da164930cceaeb4c74180291660533ad3cc45377b30a795d1b85bcd65" PKG_LICENSE="GPL" PKG_SITE="http://xorg.freedesktop.org/" PKG_URL="https://xorg.freedesktop.org/releases/individual/proto/scrnsaverproto-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="X11 Screen Saver extension wire protocol." PKG_BUILD_FLAGS="-sysroot" ================================================ FILE: packages/addons/addon-depends/chrome-depends/unclutter/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="unclutter" PKG_VERSION="1.09" PKG_SHA256="3a53575fe2a75a34bc9a2b0ad92ee0f8a7dbedc05d8783f191c500060a40a9bd" PKG_LICENSE="Public Domain" PKG_SITE="https://sourceforge.net/projects/unclutter/" PKG_URL="https://sourceforge.net/projects/unclutter/unclutter/source_${PKG_VERSION}/unclutter-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libX11" PKG_LONGDESC="Unclutter runs in the background of an X11 session and hides the X11 Cursor." make_target() { rm -f Makefile LDFLAGS="${LDFLAGS} -lX11" ${MAKE} unclutter } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin install -m 755 unclutter ${INSTALL}/usr/bin/ } ================================================ FILE: packages/addons/addon-depends/chrome-depends/unix_ar/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="unix_ar" PKG_VERSION="0.2.1" PKG_SHA256="4e1c6e8fe5255b7babe93b9af51532ba09c6946eee413c5db00cab3878d7ed2f" PKG_LICENSE="BSD 3-Clause" PKG_SITE="https://github.com/getninjas/unix_ar" PKG_URL="https://github.com/getninjas/unix_ar/archive/refs/tags/${PKG_VERSION}.tar.gz" PKG_TOOLCHAIN="manual" PKG_LONGDESC="Python: This packages allows the reading and writing of AR archive files." ================================================ FILE: packages/addons/addon-depends/comskip/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="comskip" PKG_VERSION="84fcd7388394c95fc8a7e558642bbadb43134507" PKG_SHA256="4d45d30335ce1c28fb4de8865ada57f81de18d83a77950e9ab7c3ea26d24a883" PKG_LICENSE="GPL" PKG_SITE="http://www.kaashoek.com/comskip/" PKG_URL="https://github.com/erikkaashoek/Comskip/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain argtable2 ffmpegx" PKG_DEPENDS_CONFIG="argtable2 ffmpegx" PKG_LONGDESC="Comskip detects commercial breaks from a video stream. It can be used for post-processing recordings." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" pre_configure_target() { # pass ffmpegx to build CFLAGS+=" -I$(get_install_dir ffmpegx)/usr/local/include" LDFLAGS+=" -L$(get_install_dir ffmpegx)/usr/local/lib -ldl" } ================================================ FILE: packages/addons/addon-depends/comskip/patches/Comskip-0001-Fix-compilation-with-gcc10.patch ================================================ diff --git a/mpeg2dec.c b/mpeg2dec.c index 3013dc1..5b79227 100755 --- a/mpeg2dec.c +++ b/mpeg2dec.c @@ -161,7 +161,6 @@ int64_t pev_best_effort_timestamp = 0; int video_stream_index = -1; int audio_stream_index = -1; -int width, height; int have_frame_rate ; int stream_index; ================================================ FILE: packages/addons/addon-depends/cxxtools/package.mk ================================================ # 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="cxxtools" PKG_VERSION="3.0" PKG_SHA256="07b18037fb0983f6292f5c8d53e2369e9e7a9711df2c9ad50838aacbc8c62f7c" PKG_LICENSE="GPL-2" PKG_SITE="http://www.tntnet.org/cxxtools.html" PKG_URL="http://www.tntnet.org/download/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host openssl:host" PKG_DEPENDS_TARGET="toolchain cxxtools:host openssl" PKG_LONGDESC="Cxxtools is a collection of general-purpose C++ classes." PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_HOST="--disable-demos --with-atomictype=pthread --disable-unittest" PKG_CONFIGURE_OPTS_TARGET="--enable-static --disable-shared --disable-demos --with-atomictype=pthread --disable-unittest" post_makeinstall_host() { rm -rf ${TOOLCHAIN}/bin/cxxtools-config } post_makeinstall_target() { cp ${PKG_NAME}-config ${TOOLCHAIN}/bin sed -e "s:\(['= ]\)/usr:\\1${PKG_ORIG_SYSROOT_PREFIX}/usr:g" -i ${TOOLCHAIN}/bin/${PKG_NAME}-config chmod +x ${TOOLCHAIN}/bin/${PKG_NAME}-config rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/cxxtools/patches/cxxtools-2.2-Char_operator_eq_unsigned_int.patch ================================================ Index: cxxtools-2.2/include/cxxtools/char.h =================================================================== --- cxxtools-2.2.orig/include/cxxtools/char.h 2013-05-05 14:18:00.180572107 +0300 +++ cxxtools-2.2/include/cxxtools/char.h 2013-05-05 14:18:00.176571966 +0300 @@ -148,6 +148,12 @@ friend bool operator==(char a, const Char& b) { return a == b.value(); } + //! @brief Returns $true$ if the a and b are the same character; $false$ otherwise. + //! @return $true$ if the a and b are the same character; $false$ otherwise. + friend bool operator==(const Char& a, unsigned int b) + { return a.value() == b; } + + //! @brief Returns $true$ if the a and b are not the same character; $false$ otherwise. //! @return $true$ if the a and b are not the same character; $false$ otherwise. friend bool operator!=(const Char& a, const Char& b) ================================================ FILE: packages/addons/addon-depends/cxxtools/patches/cxxtools-2.2-hdstream_stdio.patch ================================================ Index: cxxtools-2.0/src/hdstream.cpp =================================================================== --- cxxtools-2.0.orig/src/hdstream.cpp 2011-08-08 13:07:59.567275994 +0300 +++ cxxtools-2.0/src/hdstream.cpp 2011-08-08 13:08:11.447275959 +0300 @@ -30,6 +30,7 @@ #include #include #include +#include namespace cxxtools { ================================================ FILE: packages/addons/addon-depends/cxxtools/patches/cxxtools-2.2.1-make-cxxtools-char-a-trivial-class-by-defining-the-default.patch ================================================ From b773c01fc13d2ae67abc0839888e383be23562fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tommi=20M=C3=A4kitalo?= Date: Sun, 24 Jan 2021 17:20:24 +0100 Subject: [PATCH] make cxxtools::Char a trivial class by definining the default constructor as default --- include/cxxtools/char.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/include/cxxtools/char.h b/include/cxxtools/char.h index 1e637317..3a4ed62a 100644 --- a/include/cxxtools/char.h +++ b/include/cxxtools/char.h @@ -68,9 +68,7 @@ namespace cxxtools typedef int32_t value_type; //! Constructs a character with a value of 0. - Char() - : _value(0) - {} + Char() = default; //! Constructs a character using the given value as base for the character value. Char(value_type ch) ================================================ FILE: packages/addons/addon-depends/cxxtools/patches/cxxtools-3.0-gcc12-time.patch ================================================ https://bugs.gentoo.org/851837 --- a/src/timer.cpp +++ b/src/timer.cpp @@ -27,6 +27,7 @@ #include "cxxtools/clock.h" #include "cxxtools/selector.h" #include "cxxtools/datetime.h" +#include #include namespace cxxtools ================================================ FILE: packages/addons/addon-depends/cxxtools/patches/cxxtools-3.0-lld-linking-openssl.patch ================================================ --- a/src/Makefile.am +++ b/src/Makefile.am @@ -173,7 +173,7 @@ libcxxtools_la_LIBADD = $(LIBICONV) libcxxtools_la_LDFLAGS = -version-info @sonumber@ @SHARED_LIB_FLAG@ if MAKE_OPENSSL -libcxxtools_la_LDFLAGS += -lssl +libcxxtools_la_LIBADD += -lssl -lcrypto libcxxtools_la_SOURCES += \ sslcertificateimpl.cpp endif ================================================ FILE: packages/addons/addon-depends/cxxtools/patches/cxxtools-crosscompile.patch ================================================ diff -Naur cxxtools-2.2/configure cxxtools-2.2.patch/configure --- cxxtools-2.2/configure 2013-04-21 21:13:11.000000000 +0200 +++ cxxtools-2.2.patch/configure 2014-01-03 20:34:53.404660480 +0100 @@ -17316,8 +17316,8 @@ -CXXTOOLS_CXXFLAGS='-I${includedir}' -CXXTOOLS_LDFLAGS='-L${libdir} -lcxxtools' +CXXTOOLS_CXXFLAGS='' +CXXTOOLS_LDFLAGS='-lcxxtools' diff -Naur cxxtools-2.2/configure.ac cxxtools-2.2.patch/configure.ac --- cxxtools-2.2/configure.ac 2013-04-20 23:31:50.000000000 +0200 +++ cxxtools-2.2.patch/configure.ac 2014-01-03 20:26:32.064005192 +0100 @@ -106,8 +106,8 @@ AC_PROG_LIBTOOL -CXXTOOLS_CXXFLAGS='-I${includedir}' -CXXTOOLS_LDFLAGS='-L${libdir} -lcxxtools' +CXXTOOLS_CXXFLAGS='' +CXXTOOLS_LDFLAGS='-lcxxtools' AC_SUBST(CXXTOOLS_CXXFLAGS) AC_SUBST(CXXTOOLS_LDFLAGS) ================================================ FILE: packages/addons/addon-depends/docker/cli/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="cli" PKG_VERSION="$(get_pkg_version moby)" PKG_SHA256="b31eb0343e8bb587e921a7630baa659896602072a77ad97720e5f2a8e48005e9" PKG_LICENSE="ASL" PKG_SITE="https://github.com/docker/cli" PKG_URL="https://github.com/docker/cli/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain go:host" PKG_LONGDESC="The Docker CLI" PKG_TOOLCHAIN="manual" # Git commit of the matching release https://github.com/docker/cli/releases export PKG_GIT_COMMIT="ef23cbc4315ae76c744e02d687c09548ede461bd" configure_target() { go_configure export LDFLAGS="-w -linkmode external -extldflags -Wl,--unresolved-symbols=ignore-in-shared-libs -extld ${CC}" # used for docker version export GITCOMMIT=${PKG_GIT_COMMIT} export VERSION=${PKG_VERSION} export BUILDTIME="$(date --utc)" cat > "${PKG_BUILD}/go.mod" << EOF module github.com/docker/cli go 1.18 EOF GO111MODULE=auto ${GOLANG} mod tidy -modfile 'vendor.mod' -compat 1.18 GO111MODULE=auto ${GOLANG} mod vendor -modfile vendor.mod } make_target() { mkdir -p bin PKG_CLI_FLAGS="-X 'github.com/docker/cli/cli/version.Version=${VERSION}'" PKG_CLI_FLAGS+=" -X 'github.com/docker/cli/cli/version.GitCommit=${GITCOMMIT}'" PKG_CLI_FLAGS+=" -X 'github.com/docker/cli/cli/version.BuildTime=${BUILDTIME}'" ${GOLANG} build -mod=mod -modfile=vendor.mod -v -o bin/docker -a -tags "${PKG_DOCKER_BUILDTAGS}" -ldflags "${LDFLAGS} ${PKG_CLI_FLAGS}" ./cmd/docker } makeinstall_target() { : } ================================================ FILE: packages/addons/addon-depends/docker/cli/patches/cli-0001-path-for-cli-plugins.patch ================================================ --- a/cli-plugins/manager/manager_unix.go 2023-02-03 11:54:16.746399916 +0000 +++ b/cli-plugins/manager/manager_unix.go 2023-02-03 11:59:04.528175595 +0000 @@ -4,6 +4,6 @@ package manager var defaultSystemPluginDirs = []string{ - "/usr/local/lib/docker/cli-plugins", "/usr/local/libexec/docker/cli-plugins", - "/usr/lib/docker/cli-plugins", "/usr/libexec/docker/cli-plugins", + "/storage/.kodi/addons/service.system.docker/cli-plugins", + "/storage/.kodi/userdata/addon_data/service.system.docker/docker/cli-plugins", } ================================================ FILE: packages/addons/addon-depends/docker/containerd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Lukas Rusak (lrusak@libreelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="containerd" PKG_VERSION="1.7.1" PKG_SHA256="fd844af82afda7242d8eba5e0086c5a0d54ddc3041c1bbdd4d3c62bfee844e3a" PKG_LICENSE="APL" PKG_SITE="https://containerd.io" PKG_URL="https://github.com/containerd/containerd/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain go:host" PKG_LONGDESC="A daemon to control runC, built for performance and density." PKG_TOOLCHAIN="manual" # Git commit of the matching release https://github.com/containerd/containerd/releases PKG_GIT_COMMIT="78f51771157abb6c9ed224c22013cdf09962315d" pre_make_target() { go_configure export CONTAINERD_VERSION="${PKG_VERSION}" export CONTAINERD_REVISION="${PKG_GIT_COMMIT}" export CONTAINERD_PKG="github.com/containerd/containerd" export LDFLAGS="-w -extldflags -static -X ${CONTAINERD_PKG}/version.Version=${CONTAINERD_VERSION} -X ${CONTAINERD_PKG}/version.Revision=${CONTAINERD_REVISION} -X ${CONTAINERD_PKG}/version.Package=${CONTAINERD_PKG} -extld ${CC}" export GO111MODULE=off mkdir -p ${GOPATH} if [ -d ${PKG_BUILD}/vendor ]; then mv ${PKG_BUILD}/vendor ${GOPATH}/src fi ln -fs ${PKG_BUILD} ${GOPATH}/src/github.com/containerd/containerd } make_target() { mkdir -p bin ${GOLANG} build -v -o bin/containerd -a -tags "static_build no_btrfs" -ldflags "${LDFLAGS}" ./cmd/containerd ${GOLANG} build -v -o bin/containerd-shim -a -tags "static_build no_btrfs" -ldflags "${LDFLAGS}" ./cmd/containerd-shim ${GOLANG} build -v -o bin/containerd-shim-runc-v2 -a -tags "static_build no_btrfs" -ldflags "${LDFLAGS}" ./cmd/containerd-shim-runc-v2 } ================================================ FILE: packages/addons/addon-depends/docker/ctop/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2023-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ctop" PKG_VERSION="0.7.7" PKG_SHA256="0db439f2030af73ad5345884b08a33a762c3b41b30604223dd0ebddde72d2741" PKG_LICENSE="MIT" PKG_SITE="https://ctop.sh" PKG_URL="https://github.com/bcicen/ctop/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain go:host" PKG_LONGDESC="Top-like interface for container metrics" PKG_TOOLCHAIN="manual" # Git commit of the matching release https://github.com/bcicen/ctop/releases PKG_GIT_COMMIT="11a1cb10f416b4ca5e36c22c1acc2d11dbb24fb4" pre_make_target() { go_configure export CTOP_VERSION="${PKG_VERSION}" export CTOP_REVISION="${PKG_GIT_COMMIT}" export CTOP_PKG="github.com/bcicen/ctop" export LDFLAGS="-w -extldflags -static -X main.version=${CTOP_VERSION} -X main.build=${CTOP_REVISION} -extld ${CC}" mkdir -p ${GOPATH}/src/github.com/bcicen ln -fs ${PKG_BUILD} ${GOPATH}/src/${CTOP_PKG} } make_target() { mkdir -p bin ${GOLANG} build -v -o bin/ctop -a -tags "static_build release" -ldflags "${LDFLAGS}" } ================================================ FILE: packages/addons/addon-depends/docker/moby/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="moby" PKG_VERSION="23.0.6" PKG_SHA256="3bbd32f401f652cc15084d3c09bd7acd381571802beac9333fd63d803dc66c3e" PKG_LICENSE="ASL" PKG_SITE="https://mobyproject.org/" PKG_URL="https://github.com/moby/moby/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain go:host systemd" PKG_LONGDESC="Moby is an open-source project created by Docker to enable and accelerate software containerization." PKG_TOOLCHAIN="manual" # Git commit of the matching release https://github.com/moby/moby export PKG_GIT_COMMIT="9dbdbd4b6d7681bd18c897a6ba0376073c2a72ff" PKG_MOBY_BUILDTAGS="daemon \ autogen \ exclude_graphdriver_devicemapper \ exclude_graphdriver_aufs \ exclude_graphdriver_btrfs \ journald" configure_target() { go_configure export LDFLAGS="-w -linkmode external -extldflags -Wl,--unresolved-symbols=ignore-in-shared-libs -extld ${CC}" # used for docker version export GITCOMMIT=${PKG_GIT_COMMIT} export VERSION=${PKG_VERSION} export BUILDTIME="$(date --utc)" cat > "${PKG_BUILD}/go.mod" << EOF module github.com/docker/docker go 1.18 EOF GO111MODULE=auto ${GOLANG} mod tidy -modfile 'vendor.mod' -compat 1.18 GO111MODULE=auto ${GOLANG} mod vendor -modfile vendor.mod bash hack/make/.go-autogen } make_target() { mkdir -p bin ${GOLANG} build -mod=mod -modfile=vendor.mod -v -o bin/docker-proxy -a -ldflags "${LDFLAGS}" ./cmd/docker-proxy ${GOLANG} build -mod=mod -modfile=vendor.mod -v -o bin/dockerd -a -tags "${PKG_MOBY_BUILDTAGS}" -ldflags "${LDFLAGS}" ./cmd/dockerd } makeinstall_target() { : } ================================================ FILE: packages/addons/addon-depends/docker/moby/patches/moby-001-user-addon-storage-location.patch ================================================ # when updating this patch just create it from scratch using this command # # find . -name "*.go" -print | xargs sed -i 's/\/etc\/docker/\/storage\/.kodi\/userdata\/addon_data\/service.system.docker\/config/g' # # diff -Naur a/cmd/dockerd/daemon_unix.go b/cmd/dockerd/daemon_unix.go --- a/cmd/dockerd/daemon_unix.go 2022-06-03 10:30:24.000000000 -0700 +++ b/cmd/dockerd/daemon_unix.go 2022-06-07 14:28:05.510327911 -0700 @@ -25,7 +25,7 @@ func getDefaultDaemonConfigDir() (string, error) { if !honorXDG { - return "/etc/docker", nil + return "/storage/.kodi/userdata/addon_data/service.system.docker/config", nil } // NOTE: CLI uses ~/.docker while the daemon uses ~/.config/docker, because // ~/.docker was not designed to store daemon configurations. diff -Naur a/integration/plugin/authz/authz_plugin_test.go b/integration/plugin/authz/authz_plugin_test.go --- a/integration/plugin/authz/authz_plugin_test.go 2022-06-03 10:30:24.000000000 -0700 +++ b/integration/plugin/authz/authz_plugin_test.go 2022-06-07 14:28:05.570328822 -0700 @@ -56,15 +56,15 @@ ctrl = &authorizationController{} teardown := setupTest(t) - err := os.MkdirAll("/etc/docker/plugins", 0755) + err := os.MkdirAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins", 0755) assert.NilError(t, err) - fileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", testAuthZPlugin) + fileName := fmt.Sprintf("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/%s.spec", testAuthZPlugin) err = os.WriteFile(fileName, []byte(server.URL), 0644) assert.NilError(t, err) return func() { - err := os.RemoveAll("/etc/docker/plugins") + err := os.RemoveAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins") assert.NilError(t, err) teardown() diff -Naur a/integration/plugin/graphdriver/external_test.go b/integration/plugin/graphdriver/external_test.go --- a/integration/plugin/graphdriver/external_test.go 2022-06-03 10:30:24.000000000 -0700 +++ b/integration/plugin/graphdriver/external_test.go 2022-06-07 14:28:05.570328822 -0700 @@ -80,7 +80,7 @@ sserver.Close() jserver.Close() - err := os.RemoveAll("/etc/docker/plugins") + err := os.RemoveAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins") assert.NilError(t, err) } @@ -345,10 +345,10 @@ respond(w, &graphDriverResponse{Size: size}) }) - err = os.MkdirAll("/etc/docker/plugins", 0755) + err = os.MkdirAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins", 0755) assert.NilError(t, err) - specFile := "/etc/docker/plugins/" + name + "." + ext + specFile := "/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/" + name + "." + ext err = os.WriteFile(specFile, b, 0644) assert.NilError(t, err) } diff -Naur a/integration-cli/docker_cli_external_volume_driver_test.go b/integration-cli/docker_cli_external_volume_driver_test.go --- a/integration-cli/docker_cli_external_volume_driver_test.go 2022-06-03 10:30:24.000000000 -0700 +++ b/integration-cli/docker_cli_external_volume_driver_test.go 2022-06-07 14:28:05.556328610 -0700 @@ -258,10 +258,10 @@ send(w, `{"Capabilities": { "Scope": "global" }}`) }) - err := os.MkdirAll("/etc/docker/plugins", 0755) + err := os.MkdirAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins", 0755) assert.NilError(c, err) - err = os.WriteFile("/etc/docker/plugins/"+name+".spec", []byte(s.Server.URL), 0644) + err = os.WriteFile("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/"+name+".spec", []byte(s.Server.URL), 0644) assert.NilError(c, err) return s } @@ -269,7 +269,7 @@ func (s *DockerExternalVolumeSuite) TearDownSuite(c *testing.T) { s.volumePlugin.Close() - err := os.RemoveAll("/etc/docker/plugins") + err := os.RemoveAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins") assert.NilError(c, err) } @@ -359,7 +359,7 @@ // Make sure a request to use a down driver doesn't block other requests func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverLookupNotBlocked(c *testing.T) { - specPath := "/etc/docker/plugins/down-driver.spec" + specPath := "/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/down-driver.spec" err := os.WriteFile(specPath, []byte("tcp://127.0.0.7:9999"), 0644) assert.NilError(c, err) defer os.RemoveAll(specPath) diff -Naur a/integration-cli/docker_cli_network_unix_test.go b/integration-cli/docker_cli_network_unix_test.go --- a/integration-cli/docker_cli_network_unix_test.go 2022-06-03 10:30:24.000000000 -0700 +++ b/integration-cli/docker_cli_network_unix_test.go 2022-06-07 14:28:05.558328640 -0700 @@ -196,14 +196,14 @@ } }) - err := os.MkdirAll("/etc/docker/plugins", 0755) + err := os.MkdirAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins", 0755) assert.NilError(c, err) - fileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", netDrv) + fileName := fmt.Sprintf("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/%s.spec", netDrv) err = os.WriteFile(fileName, []byte(url), 0644) assert.NilError(c, err) - ipamFileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", ipamDrv) + ipamFileName := fmt.Sprintf("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/%s.spec", ipamDrv) err = os.WriteFile(ipamFileName, []byte(url), 0644) assert.NilError(c, err) } @@ -215,7 +215,7 @@ s.server.Close() - err := os.RemoveAll("/etc/docker/plugins") + err := os.RemoveAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins") assert.NilError(c, err) } diff -Naur a/integration-cli/docker_cli_swarm_test.go b/integration-cli/docker_cli_swarm_test.go --- a/integration-cli/docker_cli_swarm_test.go 2022-06-03 10:30:24.000000000 -0700 +++ b/integration-cli/docker_cli_swarm_test.go 2022-06-07 14:28:05.561328685 -0700 @@ -770,14 +770,14 @@ } }) - err := os.MkdirAll("/etc/docker/plugins", 0755) + err := os.MkdirAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins", 0755) assert.NilError(c, err) - fileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", netDrv) + fileName := fmt.Sprintf("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/%s.spec", netDrv) err = os.WriteFile(fileName, []byte(url), 0644) assert.NilError(c, err) - ipamFileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", ipamDrv) + ipamFileName := fmt.Sprintf("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/%s.spec", ipamDrv) err = os.WriteFile(ipamFileName, []byte(url), 0644) assert.NilError(c, err) } @@ -789,7 +789,7 @@ setupRemoteGlobalNetworkPlugin(c, mux, s.server.URL, globalNetworkPlugin, globalIPAMPlugin) defer func() { s.server.Close() - err := os.RemoveAll("/etc/docker/plugins") + err := os.RemoveAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins") assert.NilError(c, err) }() diff -Naur a/libnetwork/drivers/remote/driver_test.go b/libnetwork/drivers/remote/driver_test.go --- a/libnetwork/drivers/remote/driver_test.go 2022-06-03 10:30:24.000000000 -0700 +++ b/libnetwork/drivers/remote/driver_test.go 2022-06-07 14:28:05.586329065 -0700 @@ -41,7 +41,7 @@ } func setupPlugin(t *testing.T, name string, mux *http.ServeMux) func() { - specPath := "/etc/docker/plugins" + specPath := "/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins" if runtime.GOOS == "windows" { specPath = filepath.Join(os.Getenv("programdata"), "docker", "plugins") } diff -Naur a/libnetwork/ipams/remote/remote_test.go b/libnetwork/ipams/remote/remote_test.go --- a/libnetwork/ipams/remote/remote_test.go 2022-06-03 10:30:24.000000000 -0700 +++ b/libnetwork/ipams/remote/remote_test.go 2022-06-07 14:28:05.591329141 -0700 @@ -36,7 +36,7 @@ } func setupPlugin(t *testing.T, name string, mux *http.ServeMux) func() { - specPath := "/etc/docker/plugins" + specPath := "/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins" if runtime.GOOS == "windows" { specPath = filepath.Join(os.Getenv("programdata"), "docker", "plugins") } diff -Naur a/libnetwork/libnetwork_unix_test.go b/libnetwork/libnetwork_unix_test.go --- a/libnetwork/libnetwork_unix_test.go 2022-06-03 10:30:24.000000000 -0700 +++ b/libnetwork/libnetwork_unix_test.go 2022-06-07 14:28:05.592329156 -0700 @@ -3,4 +3,4 @@ package libnetwork_test -var specPath = "/etc/docker/plugins" +var specPath = "/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins" diff -Naur a/pkg/plugins/discovery_unix.go b/pkg/plugins/discovery_unix.go --- a/pkg/plugins/discovery_unix.go 2022-06-03 10:30:24.000000000 -0700 +++ b/pkg/plugins/discovery_unix.go 2022-06-07 14:28:05.615329505 -0700 @@ -9,7 +9,7 @@ "github.com/docker/docker/pkg/rootless" ) -const globalConfigPluginsPath = "/etc/docker/plugins" +const globalConfigPluginsPath = "/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins" const globalLibPluginsPath = "/usr/lib/docker/plugins" var globalSpecsPaths = []string{globalConfigPluginsPath, globalLibPluginsPath} diff -Naur a/pkg/plugins/plugins.go b/pkg/plugins/plugins.go --- a/pkg/plugins/plugins.go 2022-06-03 10:30:24.000000000 -0700 +++ b/pkg/plugins/plugins.go 2022-06-07 14:28:05.616329521 -0700 @@ -4,7 +4,7 @@ // Docker discovers plugins by looking for them in the plugin directory whenever // a user or container tries to use one by name. UNIX domain socket files must // be located under /run/docker/plugins, whereas spec files can be located -// either under /etc/docker/plugins or /usr/lib/docker/plugins. This is handled +// either under /storage/.kodi/userdata/addon_data/service.system.docker/config/plugins or /usr/lib/docker/plugins. This is handled // by the Registry interface, which lets you list all plugins or get a plugin by // its name if it exists. // diff -Naur a/registry/config_unix.go b/registry/config_unix.go --- a/registry/config_unix.go 2022-06-03 10:30:24.000000000 -0700 +++ b/registry/config_unix.go 2022-06-07 14:28:05.626329672 -0700 @@ -6,7 +6,7 @@ // defaultCertsDir is the platform-specific default directory where certificates // are stored. On Linux, it may be overridden through certsDir, for example, when // running in rootless mode. -const defaultCertsDir = "/etc/docker/certs.d" +const defaultCertsDir = "/storage/.kodi/userdata/addon_data/service.system.docker/config/certs.d" // cleanPath is used to ensure that a directory name is valid on the target // platform. It will be passed in something *similar* to a URL such as diff -Naur a/registry/endpoint_v1.go b/registry/endpoint_v1.go --- a/registry/endpoint_v1.go 2022-06-03 10:30:24.000000000 -0700 +++ b/registry/endpoint_v1.go 2022-06-07 14:28:05.627329688 -0700 @@ -63,7 +63,7 @@ if endpoint.IsSecure { // If registry is secure and HTTPS failed, show user the error and tell them about `--insecure-registry` // in case that's what they need. DO NOT accept unknown CA certificates, and DO NOT fallback to HTTP. - return invalidParamf("invalid registry endpoint %s: %v. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry %s` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/%s/ca.crt", endpoint, err, endpoint.URL.Host, endpoint.URL.Host) + return invalidParamf("invalid registry endpoint %s: %v. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry %s` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /storage/.kodi/userdata/addon_data/service.system.docker/config/certs.d/%s/ca.crt", endpoint, err, endpoint.URL.Host, endpoint.URL.Host) } // If registry is insecure and HTTPS failed, fallback to HTTP. ================================================ FILE: packages/addons/addon-depends/docker/moby/patches/moby-002-use-unconfined-seccomp-profile-as-default.patch ================================================ --- a/daemon/config/config.go 2022-06-03 10:30:24.000000000 -0700 +++ b/daemon/config/config.go 2022-06-07 14:29:36.755713207 -0700 @@ -59,7 +59,7 @@ LinuxV2RuntimeName = "io.containerd.runc.v2" // SeccompProfileDefault is the built-in default seccomp profile. - SeccompProfileDefault = "builtin" + SeccompProfileDefault = "unconfined" // SeccompProfileUnconfined is a special profile name for seccomp to use an // "unconfined" seccomp profile. SeccompProfileUnconfined = "unconfined" --- a/daemon/daemon_unix.go 2022-06-03 10:30:24.000000000 -0700 +++ b/daemon/daemon_unix.go 2022-06-07 14:34:55.315558083 -0700 @@ -1711,8 +1711,6 @@ func (daemon *Daemon) setupSeccompProfile() error { switch profile := daemon.configStore.SeccompProfile; profile { - case "", config.SeccompProfileDefault: - daemon.seccompProfilePath = config.SeccompProfileDefault case config.SeccompProfileUnconfined: daemon.seccompProfilePath = config.SeccompProfileUnconfined default: ================================================ FILE: packages/addons/addon-depends/docker/tini/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Lukas Rusak (lrusak@libreelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tini" PKG_VERSION="0.19.0" PKG_SHA256="0fd35a7030052acd9f58948d1d900fe1e432ee37103c5561554408bdac6bbf0d" PKG_LICENSE="MIT" PKG_SITE="https://github.com/krallin/tini" PKG_URL="https://github.com/krallin/tini/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Tini is a simplest init system." PKG_MAKE_OPTS_TARGET="tini-static" pre_configure_target(){ sed -i "s|@tini_VERSION_GIT@| - git.${PKG_VERSION}|" ${PKG_BUILD}/src/tiniConfig.h.in } makeinstall_target() { : } ================================================ FILE: packages/addons/addon-depends/dotnet-runtime-depends/aspnet6-runtime/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="aspnet6-runtime" PKG_VERSION="6.0.24" PKG_LICENSE="MIT" PKG_SITE="https://dotnet.microsoft.com/" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="ASP.NET Core Runtime enables you to run existing web/server applications." PKG_TOOLCHAIN="manual" case "${ARCH}" in "aarch64") PKG_SHA256="ee6b660b3c8b3fb88eb64690ac78a47752dae68c21647fccdc5f810bc68829ab" PKG_URL="https://download.visualstudio.microsoft.com/download/pr/d562ba2b-8e2c-48e5-9853-f8616a9cb4e4/f4e251ba67b718083c28017e3b0c6349/aspnetcore-runtime-6.0.24-linux-arm64.tar.gz" ;; "arm") PKG_SHA256="634b0ecd7312e8a46adedcbff6e1b23e514fa153f7135a6b9f6aefb5851f9d88" PKG_URL="https://download.visualstudio.microsoft.com/download/pr/9c00fe25-e1e0-4390-9061-77d07e95356f/09886ffeaed522c3fa8803e879ce070c/aspnetcore-runtime-6.0.24-linux-arm.tar.gz" ;; "x86_64") PKG_SHA256="022dc914af7490bcd2d885edeb5d4c1faa4b771b503b8059d5181f130191cf2c" PKG_URL="https://download.visualstudio.microsoft.com/download/pr/8f5a65c0-9bc8-497d-9ce2-4658c461dc55/b6c01c3cd060552d987501ba6bbde09f/aspnetcore-runtime-6.0.24-linux-x64.tar.gz" ;; esac PKG_SOURCE_NAME="aspnetcore-runtime_${PKG_VERSION}_${ARCH}.tar.gz" ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/blindscan-s2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="blindscan-s2" PKG_VERSION="28c50c6c3789ea3fcc11b992723d652378c0e925" PKG_SHA256="ac766d04bf1a32cf9c74a7ba12070ddf7c4c15bc0a94a0da60d104f2b76f0f9e" PKG_LICENSE="GPL" PKG_SITE="https://github.com/OpenVisionE2/blindscan-s2/" PKG_URL="https://github.com/OpenVisionE2/blindscan-s2/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="blindscan-s2 is a program to blindscan digital satellite signals" PKG_BUILD_FLAGS="-sysroot" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin make install BIND=${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/depends/bitstream/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="bitstream" PKG_VERSION="1.5" PKG_SHA256="45fc5a5a6e4537a69fa8440821e87b76252135180a3070c631b0b36ce0a3b90a" PKG_LICENSE="GPL" PKG_SITE="http://www.videolan.org" PKG_URL="http://download.videolan.org/pub/videolan/bitstream/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="biTStream is a set of C headers allowing a simpler access to binary structures such as specified by MPEG, DVB, IETF." PKG_MAKEINSTALL_OPTS_TARGET="PREFIX=/usr" ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/depends/libev/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libev" PKG_VERSION="4.33" PKG_SHA256="507eb7b8d1015fbec5b935f34ebed15bf346bed04a11ab82b8eee848c4205aea" PKG_LICENSE="GPL" PKG_SITE="http://software.schmorp.de/pkg/libev.html" PKG_URL="http://dist.schmorp.de/libev/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A full-featured and high-performance event loop." PKG_CONFIGURE_OPTS_TARGET="--disable-shared \ --enable-static" ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/dvb-apps/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="dvb-apps" PKG_VERSION="3d43b280298c" PKG_SHA256="f39e2f0ebed7e32bce83522062ad4d414f67fccd5df1b647618524497e15e057" PKG_LICENSE="GPL" PKG_SITE="https://www.linuxtv.org/wiki/index.php/LinuxTV_dvb-apps" PKG_URL="https://linuxtv.org/hg/dvb-apps/archive/${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Applications for initial setup, testing and operation of an DVB device supporting the DVB-S, DVB-C, DVB-T, and ATSC." PKG_BUILD_FLAGS="-sysroot" pre_make_target() { export PERL_USE_UNSAFE_INC=1 } ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/dvb-apps/patches/dvb-apps-10_reorder-includes.patch ================================================ diff -Naur dvb-apps-20090201/util/scan/diseqc.c dvb-apps-20090201a/util/scan/diseqc.c --- dvb-apps-20090201/util/scan/diseqc.c 2009-02-01 13:57:16.000000000 +0100 +++ dvb-apps-20090201a/util/scan/diseqc.c 2009-02-14 13:45:42.000000000 +0100 @@ -1,6 +1,6 @@ +#include #include #include -#include #include "scan.h" #include "diseqc.h" ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/dvb-apps/patches/dvb-apps-20_build-static-libs.patch ================================================ diff --git a/Make.rules b/Make.rules index e867c3a..b2d8663 100644 --- a/Make.rules +++ b/Make.rules @@ -9,7 +9,7 @@ ifneq ($(lib_name),) CFLAGS_LIB ?= -fPIC CFLAGS += $(CFLAGS_LIB) -libraries = $(lib_name).so $(lib_name).a +libraries = $(lib_name).a .PHONY: library ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/dvb-apps/patches/dvb-apps-30_remove-av7110_loadkeys.patch ================================================ diff -Naur a/util/Makefile b/util/Makefile --- a/util/Makefile 2014-03-21 12:26:36.000000000 -0700 +++ b/util/Makefile 2015-12-21 01:12:10.261957235 -0800 @@ -4,7 +4,6 @@ all clean install: $(MAKE) -C atsc_epg $@ - $(MAKE) -C av7110_loadkeys $@ $(MAKE) -C dib3000-watch $@ $(MAKE) -C dst-utils $@ $(MAKE) -C dvbdate $@ ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/dvb-apps/patches/dvb-apps-40-kernel-fix-4.14.patch ================================================ From: CvH Date: Wed, 22 Nov 2017 23:45:38 +0100 Subject: [PATCH] fix for kernel >=4.14 --- include/ca.h | 1 - util/dst-utils/dst_test.c | 14 -------------- 2 files changed, 15 deletions(-) diff --git a/include/ca.h b/include/ca.h index c18537f..5ad21c9 100644 --- a/include/ca.h +++ b/include/ca.h @@ -85,6 +85,5 @@ typedef struct ca_pid { #define CA_GET_MSG _IOR('o', 132, ca_msg_t) #define CA_SEND_MSG _IOW('o', 133, ca_msg_t) #define CA_SET_DESCR _IOW('o', 134, ca_descr_t) -#define CA_SET_PID _IOW('o', 135, ca_pid_t) #endif diff --git a/util/dst-utils/dst_test.c b/util/dst-utils/dst_test.c index 74385de..5cf3bd8 100644 --- a/util/dst-utils/dst_test.c +++ b/util/dst-utils/dst_test.c @@ -111,16 +111,6 @@ static int dst_reset(int cafd) return 0; } -static int dst_set_pid(int cafd) -{ - if ((ioctl(cafd, CA_SET_PID)) < 0) { - printf("%s: ioctl failed ..\n", __FUNCTION__); - return -1; - } - - return 0; -} - static int dst_get_descr(int cafd) { if ((ioctl(cafd, CA_GET_DESCR_INFO)) < 0) { @@ -229,10 +219,6 @@ int main(int argc, char *argv[]) printf("%s: Reset\n", __FUNCTION__); dst_reset(cafd); break; - case 'p': - printf("%s: PID\n", __FUNCTION__); - dst_set_pid(cafd); - break; case 'g': printf("%s: Get Desc\n", __FUNCTION__); dst_get_descr(cafd); ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/dvb-apps/patches/dvb-apps-50-glibc-2.31-fix.patch ================================================ From 6e62b334cced721b0b2bed197fd36e44878580ce Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Mon, 3 Feb 2020 23:30:43 +0000 Subject: [PATCH] replace obsolete stime after glibc-2.31 --- util/dvbdate/dvbdate.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/util/dvbdate/dvbdate.c b/util/dvbdate/dvbdate.c index f0df437..bff7204 100644 --- a/util/dvbdate/dvbdate.c +++ b/util/dvbdate/dvbdate.c @@ -309,7 +309,10 @@ int atsc_scan_date(time_t *rx_time, unsigned int to) */ int set_time(time_t * new_time) { - if (stime(new_time)) { + struct timespec ts; + ts.tv_sec = *new_time; + ts.tv_nsec = 0; + if (clock_settime(CLOCK_REALTIME, &ts) < 0) { perror("Unable to set time"); return -1; } -- 2.20.1 ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/dvb-apps/patches/dvb-apps-60-dont-build-tests.patch ================================================ diff -ru a/Makefile b/Makefile --- a/Makefile 2014-03-21 20:26:36.000000000 +0100 +++ b/Makefile 2022-12-04 20:52:52.827027541 +0100 @@ -10,7 +10,6 @@ all clean install: $(MAKE) -C lib $@ - $(MAKE) -C test $@ $(MAKE) -C util $@ update: ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/dvblast/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="dvblast" PKG_VERSION="4270dcae7b754b25ad27332bb1c55b6b23b85b0d" # 2021-01-07 PKG_SHA256="6f613b9c5e2582b7bc48458c531c926170726a094a5a93f8d9142a2382c09c58" PKG_LICENSE="GPL" PKG_SITE="https://www.videolan.org/projects/dvblast.html" PKG_URL="http://repo.or.cz/dvblast.git/snapshot/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain bitstream libev" PKG_LONGDESC="DVBlast is a simple and powerful MPEG-2/TS demux and streaming application" PKG_BUILD_FLAGS="-sysroot" pre_configure_target() { export LDFLAGS="${LDFLAGS} -lm" export PREFIX="/usr" } ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/dvbsnoop/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="dvbsnoop" PKG_VERSION="badf61fcdab1177c1162747be06d035a2b671e9b" PKG_SHA256="7f0f5d9ca15c5caae3ca249d95a5fc30cececd16f63e00a1404e0d2368ce56fa" PKG_LICENSE="GPL" PKG_SITE="http://dvbsnoop.sourceforge.net/" PKG_URL="https://github.com/Duckbox-Developers/dvbsnoop/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="dvbsnoop is a DVB/MPEG stream analyzer program" PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/mumudvb/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mumudvb" PKG_VERSION="efc815ccecf5a2b9603027c959a4966fe501f6a5" # 2021-01-06 PKG_SHA256="b3a6f4a5d2f08d31afa46504dc53644ae21d7dbfa320a216efafcf1e7c44cdba" PKG_LICENSE="GPL" PKG_SITE="http://mumudvb.net/" PKG_URL="https://github.com/braice/MuMuDVB/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libdvbcsa" PKG_LONGDESC="MuMuDVB (Multi Multicast DVB) is a program that streams from DVB on a network using multicasting or unicast" PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/szap-s2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="szap-s2" PKG_VERSION="69ff3584caf9b46f7a551b39b9f9956f8461377c" PKG_SHA256="eea8d99d2d5d6403d624acdd9df908a2dd7767dd5469b44e9a281ff863096b32" PKG_LICENSE="GPL" PKG_SITE="https://bitbucket.org/updatelee/tune-s2" PKG_URL="https://bitbucket.org/CrazyCat/szap-s2/get/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="szap-s2 is a simple zapping tool for the Linux DVB S2 API" PKG_BUILD_FLAGS="-sysroot" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin make install BIND=${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/t2scan/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="t2scan" PKG_VERSION="0.7" PKG_SHA256="44e4b738a2beed8eb964be3d90b6da48c2d1c672d81fd8db8bbda87bcc433fcb" PKG_LICENSE="GPL" PKG_SITE="https://github.com/mighty-p/t2scan" PKG_URL="https://github.com/mighty-p/t2scan/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A small channel scan tool which generates DVB-T/T2 channels.conf files." PKG_BUILD_FLAGS="-sysroot" ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/tune-s2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tune-s2" PKG_VERSION="60cc4aaa70b646d38f2e40251860375283c44816" PKG_SHA256="e39069a0f2f0930809647052fe1f8c9a13f05af537013b03a99f09ceb9bfb997" PKG_LICENSE="GPL" PKG_SITE="https://bitbucket.org/updatelee/tune-s2" PKG_URL="https://bitbucket.org/CrazyCat/tune-s2/get/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="tune-s2 is a small linux app to be able to tune a dvb devices" PKG_BUILD_FLAGS="-sysroot" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin make install BIND=${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/w_scan/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="w_scan" PKG_VERSION="20170107" PKG_SHA256="38e0f38a7bf06cff6d6ea01652ad4ee60da2cb0e937360468f936da785b46ffe" PKG_LICENSE="GPL" PKG_SITE="https://www.gen2vdr.de/wirbel/w_scan/index2.html" PKG_URL="https://www.gen2vdr.de/wirbel/w_scan/w_scan-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A channel scan tool which generates ATSC, DVB-C, DVB-S/S2 and DVB-T channels.conf files." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" ================================================ FILE: packages/addons/addon-depends/dvb-tools-depends/w_scan/patches/w_scan-0001-Fix-building-with-gcc10.patch ================================================ From edbabcc7df6cd9e282991bd550d125d7f75bd738 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Mon, 22 Jun 2020 19:42:17 +0200 Subject: [PATCH] Fix building with gcc10 --- si_types.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/si_types.h b/si_types.h index 5fc7835d80c7..41ce2e1e6603 100644 --- a/si_types.h +++ b/si_types.h @@ -114,7 +114,7 @@ struct service { uint32_t logical_channel_number; uint8_t running; void * priv; -} service_t, * p_service_t; +}; /******************************************************************************* /* transponder type. @@ -201,7 +201,7 @@ struct transponder { /*----------------------------*/ char * network_name; network_change_t network_change; -} __attribute__((packed)) transponder_t, * p_transponder_t; +} __attribute__((packed)); /******************************************************************************* /* satellite channel routing type. -- 2.27.0 ================================================ FILE: packages/addons/addon-depends/enca/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="enca" PKG_VERSION="1.19" PKG_SHA256="3a487eca40b41021e2e4b7a6440b97d822e6532db5464471f572ecf77295e8b8" PKG_LICENSE="GPL" PKG_SITE="http://freshmeat.net/projects/enca/" PKG_URL="http://dl.cihar.com/enca/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Enca detects the encoding of text files, on the basis of knowledge of their language." PKG_BUILD_FLAGS="+pic" PKG_MAKEINSTALL_OPTS_TARGET="-C lib" PKG_CONFIGURE_OPTS_TARGET="ac_cv_file__dev_random=yes \ ac_cv_file__dev_urandom=no \ ac_cv_file__dev_srandom=no \ ac_cv_file__dev_arandom=no \ CPPFLAGS="-I${SYSROOT_PREFIX}/usr/include" \ --disable-shared \ --enable-static \ --disable-external \ --without-librecode \ --disable-rpath \ --with-gnu-ld" pre_make_target() { make CC="${HOST_CC}" \ CPPFLAGS="${HOST_CPPFLAGS}" \ CFLAGS="${HOST_CFLAGS}" \ LDFLAGS="${HOST_LDFLAGS}" \ -C tools } post_makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/pkgconfig cp enca.pc ${SYSROOT_PREFIX}/usr/lib/pkgconfig } ================================================ FILE: packages/addons/addon-depends/enet/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="enet" PKG_VERSION="8d69c5abe4b699e7077395e01927bd102b3ba597" # 12 Jun 2021 PKG_SHA256="4da28dc923828f2241f9086009c87d9679cb52bb3085305754cbcac33a06f312" PKG_LICENSE="MIT" PKG_SITE="https://github.com/cgutman/enet/" PKG_URL="https://github.com/cgutman/enet/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A network communication layer on top of UDP (User Datagram Protocol)." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--enable-static --disable-shared" post_makeinstall_target() { rm -r ${INSTALL} } ================================================ FILE: packages/addons/addon-depends/faad2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="faad2" PKG_VERSION="2.10.1" PKG_SHA256="4c16c71295ca0cbf7c3dfe98eb11d8fa8d0ac3042e41604cfd6cc11a408cf264" PKG_LICENSE="GPL" PKG_SITE="https://github.com/knik0/faad2/" PKG_URL="https://github.com/knik0/faad2/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="An MPEG-4 AAC decoder." PKG_TOOLCHAIN="configure" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared \ --without-drm \ --with-gnu-ld \ --without-mpeg4ip \ --without-xmms" pre_configure_target() { ./bootstrap } post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/ffmpegx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ffmpegx" PKG_VERSION="4.4.3" PKG_SHA256="6c5b6c195e61534766a0b5fe16acc919170c883362612816d0a1c7f4f947006e" PKG_LICENSE="LGPLv2.1+" PKG_SITE="https://ffmpeg.org" PKG_URL="https://ffmpeg.org/releases/ffmpeg-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain aom bzip2 openssl lame libvorbis opus x264 zlib" PKG_LONGDESC="FFmpegx is an complete FFmpeg build to support encoding and decoding." PKG_BUILD_FLAGS="-sysroot" # Dependencies get_graphicdrivers if [ "${TARGET_ARCH}" = "x86_64" ]; then PKG_DEPENDS_TARGET+=" nasm:host x265" if listcontains "${GRAPHIC_DRIVERS}" "(crocus|i915|iris)"; then PKG_DEPENDS_TARGET+=" intel-vaapi-driver" fi fi if [[ ! ${TARGET_ARCH} = arm ]] || target_has_feature neon; then PKG_DEPENDS_TARGET+=" libvpx" fi # X11 grab for screen recording if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" libxcb libX11" fi pre_configure_target() { cd ${PKG_BUILD} rm -rf .${TARGET_NAME} # HW encoders # Generic if [[ "${TARGET_ARCH}" = "x86_64" ]]; then PKG_FFMPEG_HW_ENCODERS_GENERIC="\ `#Video encoders` \ --enable-encoder=h264_vaapi \ --enable-encoder=hevc_vaapi \ --enable-encoder=mjpeg_vaapi \ --enable-encoder=mpeg2_vaapi \ --enable-encoder=vp8_vaapi \ --enable-encoder=vp9_vaapi \ --disable-encoder=h264_nvenc \ --disable-encoder=hevc_nvenc \ \ `#Video hwaccel` \ --enable-hwaccel=h263_vaapi \ --enable-hwaccel=h264_vaapi \ --enable-hwaccel=hevc_vaapi \ --enable-hwaccel=mjpeg_vaapi \ --enable-hwaccel=mpeg2_vaapi \ --enable-hwaccel=mpeg4_vaapi \ --enable-hwaccel=vc1_vaapi \ --enable-hwaccel=vp8_vaapi \ --enable-hwaccel=vp9_vaapi \ --enable-hwaccel=wmv3_vaapi" PKG_FFMPEG_X26x_GENERIC="\ --enable-libx264 \ --enable-encoder=x264 \ --enable-libx265 \ --enable-encoder=x265" fi # Encoders PKG_FFMPEG_ENCODERS="\ `#Video encoders` \ --enable-libvpx \ --enable-encoder=libvpx_vp8 \ --enable-encoder=libvpx_vp9 \ ${PKG_FFMPEG_X26x_GENERIC} \ --enable-libaom \ --enable-encoder=libaom_av1 \ \ `#Audio encoders` \ --enable-encoder=aac \ --enable-encoder=ac3 \ --enable-encoder=eac3 \ --enable-encoder=flac \ --enable-libmp3lame \ --enable-encoder=libmp3lame \ --enable-libopus \ --enable-encoder=libopus \ --enable-libvorbis \ --enable-encoder=libvorbis" # X11 grab for screen recording if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_FFMPEG_LIBS+=" -lX11" PKG_FFMPEG_X11_GRAB="\ --enable-libxcb \ --enable-libxcb-shm \ --enable-libxcb-xfixes \ --enable-libxcb-shape" else PKG_FFMPEG_X11_GRAB="\ --disable-libxcb \ --disable-libxcb-shm \ --disable-libxcb-xfixes \ --disable-libxcb-shape" fi } configure_target() { ./configure \ \ `#Programs to build` \ --enable-ffmpeg \ --disable-ffplay \ --enable-ffprobe \ \ `#Static and Shared` \ --enable-static \ --pkg-config-flags="--static" \ --disable-shared \ \ `#Licensing options` \ --enable-gpl \ --enable-version3 \ \ `#Documentation options` \ --disable-doc \ \ `#Hardware accelerated decoding encoding` \ ${PKG_FFMPEG_HW_ENCODERS_GENERIC} \ \ ${PKG_FFMPEG_ENCODERS} \ \ `#General options` \ --enable-avresample \ --disable-lzma \ --disable-alsa \ ${PKG_FFMPEG_X11_GRAB} \ \ `#Toolchain options` \ --arch="${TARGET_ARCH}" \ --cpu="${TARGET_CPU}" \ --cross-prefix="${TARGET_PREFIX}" \ --enable-cross-compile \ --sysroot="${SYSROOT_PREFIX}" \ --sysinclude="${SYSROOT_PREFIX}/usr/include" \ --target-os="linux" \ --nm="${NM}" \ --ar="${AR}" \ --as="${CC}" \ --cc="${CC}" \ --ld="${CC}" \ --pkg-config="${TOOLCHAIN}/bin/pkg-config" \ --host-cc="${HOST_CC}" \ --host-cflags="${HOST_CFLAGS}" \ --host-ldflags="${HOST_LDFLAGS}" \ --host-extralibs="-lm" \ --extra-cflags="${CFLAGS}" \ --extra-ldflags="${LDFLAGS}" \ --extra-libs="${PKG_FFMPEG_LIBS}" \ --enable-pic \ --disable-gnutls \ --enable-openssl \ \ `#Advanced options` \ --disable-hardcoded-tables \ } ================================================ FILE: packages/addons/addon-depends/ffmpegx/patches/ffmpeg-openssl3.patch ================================================ From 1d23e125b6f76e74b754560c3b6931507cacddce Mon Sep 17 00:00:00 2001 From: Timo Rothenpieler Date: Tue, 7 Sep 2021 19:35:31 +0200 Subject: [PATCH] configure: account for openssl3 license change --- configure | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/configure b/configure index c87a010387..ed7345b2c1 100755 --- a/configure +++ b/configure @@ -1765,7 +1765,6 @@ EXTERNAL_LIBRARY_GPL_LIST=" EXTERNAL_LIBRARY_NONFREE_LIST=" decklink libfdk_aac - openssl libtls " @@ -1857,6 +1856,7 @@ EXTERNAL_LIBRARY_LIST=" mediacodec openal opengl + openssl pocketsphinx vapoursynth " @@ -6572,7 +6572,10 @@ enabled omx_rpi && { test_code cc OMX_Core.h OMX_IndexConfigBrcmVideoR die "ERROR: OpenMAX IL headers from raspberrypi/firmware not found"; } && enable omx enabled omx && require_headers OMX_Core.h -enabled openssl && { check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl || +enabled openssl && { { check_pkg_config openssl "openssl >= 3.0.0" openssl/ssl.h OPENSSL_init_ssl && + { enabled gplv3 || ! enabled gpl || enabled nonfree || die "ERROR: OpenSSL >=3.0.0 requires --enable-version3"; }; } || + { enabled gpl && ! enabled nonfree && die "ERROR: OpenSSL <3.0.0 is incompatible with the gpl"; } || + check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl || check_pkg_config openssl openssl openssl/ssl.h SSL_library_init || check_lib openssl openssl/ssl.h OPENSSL_init_ssl -lssl -lcrypto || check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto || -- 2.34.1 ================================================ FILE: packages/addons/addon-depends/ffmpegx-depends/x264/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="x264" PKG_VERSION="baee400fa9ced6f5481a728138fed6e867b0ff7f" # r3095 stable 2022-06-01 PKG_SHA256="ce6623b8b289765daee04a297c2fd1a293cb2565a1749c76d66c8d72c7ddc1ab" PKG_LICENSE="GPL" PKG_SITE="http://www.videolan.org/developers/x264.html" PKG_URL="https://code.videolan.org/videolan/x264/-/archive/${PKG_VERSION}/x264-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="x264 codec" if [ "${TARGET_ARCH}" = "x86_64" ]; then PKG_DEPENDS_TARGET+=" nasm:host" fi pre_configure_target() { cd ${PKG_BUILD} rm -rf .${TARGET_NAME} if [ "${TARGET_ARCH}" = "x86_64" ]; then export AS="${TOOLCHAIN}/bin/nasm" else PKG_X264_ASM="--disable-asm" fi } configure_target() { ./configure \ --cross-prefix="${TARGET_PREFIX}" \ --extra-cflags="${CFLAGS}" \ --extra-ldflags="${LDFLAGS}" \ --host="${TARGET_NAME}" \ --prefix="/usr" \ --sysroot="${SYSROOT_PREFIX}" \ ${PKG_X264_ASM} \ --disable-cli \ --enable-lto \ --enable-pic \ --enable-shared \ --enable-strip } ================================================ FILE: packages/addons/addon-depends/ffmpegx-depends/x265/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="x265" PKG_VERSION="3.5" PKG_SHA256="7ebc5d2de6ce5dfefb434e422e59a0c4715fe939c784ac2f3d41af5775adc706" PKG_ARCH="x86_64" PKG_LICENSE="GPL" PKG_SITE="https://www.videolan.org/developers/x265.html" PKG_URL="https://bitbucket.org/multicoreware/x265_git/get/${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="x265 is a H.265/HEVC video encoder application library" PKG_TOOLCHAIN="make" pre_configure_target() { LDFLAGS+=" -ldl" cmake -DCMAKE_INSTALL_PREFIX=/usr -G "Unix Makefiles" ./source } ================================================ FILE: packages/addons/addon-depends/game-tools/bchunk/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="bchunk" PKG_VERSION="1.2.2" PKG_SHA256="e7d99b5b60ff0b94c540379f6396a670210400124544fb1af985dd3551eabd89" PKG_LICENSE="GPL" PKG_SITE="http://he.fi/bchunk/" PKG_URL="http://he.fi/bchunk/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Tool to convert a CD image in a .bin/.cue format to a set of .iso and .cdr tracks." PKG_BUILD_FLAGS="-sysroot" make_target() { make ${PKG_MAKE_OPTS_TARGET} CC=${CC} LD=${CC} } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -p bchunk ${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/game-tools/ecm-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ecm-tools" PKG_VERSION="1.0.3" PKG_SHA256="7b7475789603e64c7ae3ddcb0e95f09640ba37a7f13b29c8e8f2f4087bd872c9" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/alucryd/ecm-tools" PKG_URL="https://github.com/alucryd/ecm-tools/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Error Code Modeler.s" PKG_BUILD_FLAGS="-sysroot" ================================================ FILE: packages/addons/addon-depends/game-tools/iat/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="iat" PKG_VERSION="0.1.7" PKG_SHA256="fb72c42f4be18107ec1bff8448bd6fac2a3926a574d4950a4d5120f0012d62ca" PKG_LICENSE="GPL" PKG_SITE="https://sourceforge.net/projects/iat.berlios/" PKG_URL="https://sourceforge.net/projects/iat.berlios/files/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Iso9660 Analyzer Tool to detect many structures of image file." PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="ac_cv_func_malloc_0_nonnull=yes" ================================================ FILE: packages/addons/addon-depends/game-tools/linuxconsoletools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="linuxconsoletools" PKG_VERSION="1.8.1" PKG_SHA256="4da29745c782b7db18f5f37c49e77bf163121dd3761e2fc7636fa0cbf35c2456" PKG_LICENSE="GPL" PKG_SITE="http://sourceforge.net/projects/linuxconsole/" PKG_URL="http://prdownloads.sourceforge.net/linuxconsole/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Set of utilities for joysticks and serial devices." PKG_BUILD_FLAGS="-sysroot" PKG_MAKE_OPTS_TARGET="SYSTEMD_SUPPORT=0" makeinstall_target() { make install PREFIX="/usr" DESTDIR="${INSTALL}" } ================================================ FILE: packages/addons/addon-depends/game-tools/linuxconsoletools/patches/linuxconsoletools-0001-disable-building-ffmvforce.patch ================================================ diff -Naur a/utils/Makefile b/utils/Makefile --- a/utils/Makefile 2022-05-21 09:44:47.000000000 +0000 +++ b/utils/Makefile 2022-05-21 18:58:51.363206817 +0000 @@ -37,7 +37,7 @@ endif ifndef DISABLE_FORCEFEEDBACK -PROGRAMS += fftest ffmvforce ffset ffcfstress +PROGRAMS += fftest ffset ffcfstress endif PREFIX ?= /usr/local ================================================ FILE: packages/addons/addon-depends/go/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Lukas Rusak (lrusak@libreelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="go" PKG_VERSION="1.21.4" PKG_SHA256="13b2395f666e77234d0731ec82c008a584ef0408ca32e52fe95b98f02f32db17" PKG_LICENSE="BSD" PKG_SITE="https://golang.org" PKG_URL="https://github.com/golang/go/archive/${PKG_NAME}${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain" PKG_LONGDESC="An programming language that makes it easy to build simple, reliable, and efficient software." PKG_TOOLCHAIN="manual" configure_host() { export GOOS=linux export GOROOT_FINAL=${TOOLCHAIN}/lib/golang if [ -x /usr/lib/go/bin/go ]; then export GOROOT_BOOTSTRAP=/usr/lib/go else export GOROOT_BOOTSTRAP=/usr/lib/golang fi export GOARCH=amd64 if [ ! -d ${GOROOT_BOOTSTRAP} ]; then cat < ${SYSROOT_PREFIX}/usr/lib/pkgconfig/mad.pc << "EOF" prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: mad Description: MPEG audio decoder Requires: Version: 0.15.1b Libs: -L${libdir} -lmad Cflags: -I${includedir} EOF } ================================================ FILE: packages/addons/addon-depends/libmad/patches/libmad-0.15.1b-automake_1.13.patch ================================================ diff -Naur libmad-0.15.1b-old/configure.ac libmad-0.15.1b-new/configure.ac --- libmad-0.15.1b-old/configure.ac 2004-01-23 01:41:32.000000000 -0800 +++ libmad-0.15.1b-new/configure.ac 2012-12-30 15:14:37.000000000 -0800 @@ -28,7 +28,7 @@ AM_INIT_AUTOMAKE -AM_CONFIG_HEADER([config.h]) +AC_CONFIG_HEADERS([config.h]) dnl System type. ================================================ FILE: packages/addons/addon-depends/libmad/patches/libmad-0.15.1b-cflags-O2.patch ================================================ diff -Naur libmad-0.15.1b-orig/configure.ac libmad-0.15.1b/configure.ac --- libmad-0.15.1b-orig/configure.ac 2007-07-01 12:58:13.000000000 -0600 +++ libmad-0.15.1b/configure.ac 2007-07-01 12:59:13.000000000 -0600 @@ -105,7 +105,7 @@ shift ;; -O2) - optimize="-O" + optimize="-O2" shift ;; -fomit-frame-pointer) ================================================ FILE: packages/addons/addon-depends/libmad/patches/libmad-0.15.1b-cflags.patch ================================================ diff -Naur libmad-0.15.1b-orig/configure.ac libmad-0.15.1b/configure.ac --- libmad-0.15.1b-orig/configure.ac 2007-06-30 20:22:31.000000000 -0600 +++ libmad-0.15.1b/configure.ac 2007-06-30 20:25:31.000000000 -0600 @@ -122,74 +122,74 @@ esac done -if test "$GCC" = yes -then - if test -z "$arch" - then - case "$host" in - i386-*) ;; - i?86-*) arch="-march=i486" ;; - arm*-empeg-*) arch="-march=armv4 -mtune=strongarm1100" ;; - armv4*-*) arch="-march=armv4 -mtune=strongarm" ;; - powerpc-*) ;; - mips*-agenda-*) arch="-mcpu=vr4100" ;; - mips*-luxsonor-*) arch="-mips1 -mcpu=r3000 -Wa,-m4010" ;; - esac - fi - - case "$optimize" in - -O|"-O "*) - optimize="-O" - optimize="$optimize -fforce-mem" - optimize="$optimize -fforce-addr" - : #x optimize="$optimize -finline-functions" - : #- optimize="$optimize -fstrength-reduce" - optimize="$optimize -fthread-jumps" - optimize="$optimize -fcse-follow-jumps" - optimize="$optimize -fcse-skip-blocks" - : #x optimize="$optimize -frerun-cse-after-loop" - : #x optimize="$optimize -frerun-loop-opt" - : #x optimize="$optimize -fgcse" - optimize="$optimize -fexpensive-optimizations" - optimize="$optimize -fregmove" - : #* optimize="$optimize -fdelayed-branch" - : #x optimize="$optimize -fschedule-insns" - optimize="$optimize -fschedule-insns2" - : #? optimize="$optimize -ffunction-sections" - : #? optimize="$optimize -fcaller-saves" - : #> optimize="$optimize -funroll-loops" - : #> optimize="$optimize -funroll-all-loops" - : #x optimize="$optimize -fmove-all-movables" - : #x optimize="$optimize -freduce-all-givs" - : #? optimize="$optimize -fstrict-aliasing" - : #* optimize="$optimize -fstructure-noalias" - - case "$host" in - arm*-*) - optimize="$optimize -fstrength-reduce" - ;; - mips*-*) - optimize="$optimize -fstrength-reduce" - optimize="$optimize -finline-functions" - ;; - i?86-*) - optimize="$optimize -fstrength-reduce" - ;; - powerpc-apple-*) - # this triggers an internal compiler error with gcc2 - : #optimize="$optimize -fstrength-reduce" - - # this is really only beneficial with gcc3 - : #optimize="$optimize -finline-functions" - ;; - *) - # this sometimes provokes bugs in gcc 2.95.2 - : #optimize="$optimize -fstrength-reduce" - ;; - esac - ;; - esac -fi +#if test "$GCC" = yes +#then +# if test -z "$arch" +# then +# case "$host" in +# i386-*) ;; +# i?86-*) arch="-march=i486" ;; +# arm*-empeg-*) arch="-march=armv4 -mtune=strongarm1100" ;; +# armv4*-*) arch="-march=armv4 -mtune=strongarm" ;; +# powerpc-*) ;; +# mips*-agenda-*) arch="-mcpu=vr4100" ;; +# mips*-luxsonor-*) arch="-mips1 -mcpu=r3000 -Wa,-m4010" ;; +# esac +# fi +# +# case "$optimize" in +# -O|"-O "*) +# optimize="-O" +# optimize="$optimize -fforce-mem" +# optimize="$optimize -fforce-addr" +# : #x optimize="$optimize -finline-functions" +# : #- optimize="$optimize -fstrength-reduce" +# optimize="$optimize -fthread-jumps" +# optimize="$optimize -fcse-follow-jumps" +# optimize="$optimize -fcse-skip-blocks" +# : #x optimize="$optimize -frerun-cse-after-loop" +# : #x optimize="$optimize -frerun-loop-opt" +# : #x optimize="$optimize -fgcse" +# optimize="$optimize -fexpensive-optimizations" +# optimize="$optimize -fregmove" +# : #* optimize="$optimize -fdelayed-branch" +# : #x optimize="$optimize -fschedule-insns" +# optimize="$optimize -fschedule-insns2" +# : #? optimize="$optimize -ffunction-sections" +# : #? optimize="$optimize -fcaller-saves" +# : #> optimize="$optimize -funroll-loops" +# : #> optimize="$optimize -funroll-all-loops" +# : #x optimize="$optimize -fmove-all-movables" +# : #x optimize="$optimize -freduce-all-givs" +# : #? optimize="$optimize -fstrict-aliasing" +# : #* optimize="$optimize -fstructure-noalias" +# +# case "$host" in +# arm*-*) +# optimize="$optimize -fstrength-reduce" +# ;; +# mips*-*) +# optimize="$optimize -fstrength-reduce" +# optimize="$optimize -finline-functions" +# ;; +# i?86-*) +# optimize="$optimize -fstrength-reduce" +# ;; +# powerpc-apple-*) +# # this triggers an internal compiler error with gcc2 +# : #optimize="$optimize -fstrength-reduce" +# +# # this is really only beneficial with gcc3 +# : #optimize="$optimize -finline-functions" +# ;; +# *) +# # this sometimes provokes bugs in gcc 2.95.2 +# : #optimize="$optimize -fstrength-reduce" +# ;; +# esac +# ;; +# esac +#fi case "$host" in mips*-agenda-*) ================================================ FILE: packages/addons/addon-depends/libmpdclient/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libmpdclient" PKG_VERSION="2.20" PKG_SHA256="18793f68e939c3301e34d8fcadea1f7daa24143941263cecadb80126194e277d" PKG_LICENSE="BSD-3c" PKG_SITE="https://www.musicpd.org" PKG_URL="https://www.musicpd.org/download/libmpdclient/2/libmpdclient-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A C library which implements the Music Player Daemon protocol." ================================================ FILE: packages/addons/addon-depends/librespot-depends/rustup.rs/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rustup.rs" PKG_VERSION="1.25.1" PKG_SHA256="4d062c77b08309bd212f22dd7da1957c1882509c478e57762f34ec4fb2884c9a" PKG_LICENSE="MIT" PKG_SITE="https://www.rust-lang.org" PKG_URL="https://github.com/rust-lang-nursery/rustup.rs/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="The Rust toolchain installer." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/libseccomp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2023-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libseccomp" PKG_VERSION="2.5.4" PKG_SHA256="d82902400405cf0068574ef3dc1fe5f5926207543ba1ae6f8e7a1576351dcbdb" PKG_LICENSE="LGPLv2.1" PKG_SITE="https://github.com/seccomp/libseccomp" PKG_URL="https://github.com/seccomp/libseccomp/releases/download/v${PKG_VERSION}/libseccomp-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="An easy to use, platform independent, interface to the Linux Kernel syscall filtering mechanism" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET+=" --enable-static --enable-shared" ================================================ FILE: packages/addons/addon-depends/libusbmuxd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libusbmuxd" PKG_VERSION="2.0.2" PKG_SHA256="cc6a808553da4efa9fa5638be256d5ae020498795d9d260d280b87074e799b20" PKG_LICENSE="GPL" PKG_SITE="http://www.libimobiledevice.org" PKG_URL="https://github.com/libimobiledevice/libusbmuxd/releases/download/${PKG_VERSION}/libusbmuxd-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libplist" PKG_LONGDESC="A USB multiplex daemon." PKG_CONFIGURE_OPTS_TARGET="ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes \ --enable-static \ --disable-shared" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/addons/addon-depends/libvncserver/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libvncserver" PKG_VERSION="0.9.14" PKG_SHA256="83104e4f7e28b02f8bf6b010d69b626fae591f887e949816305daebae527c9a5" PKG_LICENSE="GPL" PKG_SITE="https://libvnc.github.io/" PKG_URL="https://github.com/LibVNC/libvncserver/archive/LibVNCServer-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libjpeg-turbo libpng openssl systemd" PKG_LONGDESC="A C library that allow you to easily implement VNC server or client functionality." PKG_CMAKE_OPTS_TARGET="-DWITH_GCRYPT=OFF \ -DWITH_GNUTLS=OFF \ -DWITH_GTK=OFF \ -DWITH_SDL=OFF \ -DWITH_TIGHTVNC_FILETRANSFER=OFF \ -DWITH_TESTS=OFF \ -DWITH_EXAMPLES=OFF \ -DBUILD_SHARED_LIBS=ON" pre_configure_target() { # hide openssl >=3.0.0 warnings export CFLAGS+=" -Wno-deprecated-declarations" } ================================================ FILE: packages/addons/addon-depends/libvncserver/patches/fix-build-with-openssl-3.0.0.patch ================================================ From d998b74e9bfaf5c179bf4322b626506469bc694b Mon Sep 17 00:00:00 2001 From: Peter Vicman Date: Fri, 20 Jan 2023 12:13:42 +0100 Subject: [PATCH] common/crypto_openssl.c: fix build with openssl >= 3.0.0 DES encryption is considered legacy and is no longer available by default. To use it legacy provider must be load. --- common/crypto_openssl.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/common/crypto_openssl.c b/common/crypto_openssl.c index 51d7ec2d..50e8073a 100644 --- a/common/crypto_openssl.c +++ b/common/crypto_openssl.c @@ -28,6 +28,9 @@ #include #include #include +#if (OPENSSL_VERSION_NUMBER >= 0x30000000L) +#include +#endif #include "crypto.h" static unsigned char reverseByte(unsigned char b) { @@ -69,13 +72,25 @@ void random_bytes(void *out, size_t len) int encrypt_rfbdes(void *out, int *out_len, const unsigned char key[8], const void *in, const size_t in_len) { int result = 0; - EVP_CIPHER_CTX *des; + EVP_CIPHER_CTX *des = NULL; unsigned char mungedkey[8]; int i; +#if (OPENSSL_VERSION_NUMBER >= 0x30000000L) + OSSL_PROVIDER *providerLegacy = NULL; + OSSL_PROVIDER *providerDefault = NULL; +#endif for (i = 0; i < 8; i++) mungedkey[i] = reverseByte(key[i]); +#if (OPENSSL_VERSION_NUMBER >= 0x30000000L) + /* Load Multiple providers into the default (NULL) library context */ + if (!(providerLegacy = OSSL_PROVIDER_load(NULL, "legacy"))) + goto out; + if (!(providerDefault = OSSL_PROVIDER_load(NULL, "default"))) + goto out; +#endif + if(!(des = EVP_CIPHER_CTX_new())) goto out; if(!EVP_EncryptInit_ex(des, EVP_des_ecb(), NULL, mungedkey, NULL)) @@ -86,7 +101,14 @@ int encrypt_rfbdes(void *out, int *out_len, const unsigned char key[8], const vo result = 1; out: - EVP_CIPHER_CTX_free(des); + if (des) + EVP_CIPHER_CTX_free(des); +#if (OPENSSL_VERSION_NUMBER >= 0x30000000L) + if (providerLegacy) + OSSL_PROVIDER_unload(providerLegacy); + if (providerDefault) + OSSL_PROVIDER_unload(providerDefault); +#endif return result; } ================================================ FILE: packages/addons/addon-depends/libvpx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libvpx" PKG_VERSION="1.12.0" PKG_SHA256="f1acc15d0fd0cb431f4bf6eac32d5e932e40ea1186fe78e074254d6d003957bb" PKG_LICENSE="BSD" PKG_SITE="https://www.webmproject.org" PKG_URL="https://github.com/webmproject/libvpx/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="WebM VP8/VP9 Codec" if [ "${TARGET_ARCH}" = "x86_64" ]; then PKG_DEPENDS_TARGET+=" nasm:host" fi configure_target() { case ${ARCH} in aarch64) PKG_TARGET_NAME_LIBVPX="arm64-linux-gcc" ;; arm) PKG_TARGET_NAME_LIBVPX="armv7-linux-gcc" ;; x86_64) PKG_TARGET_NAME_LIBVPX="x86_64-linux-gcc" ;; esac ${PKG_CONFIGURE_SCRIPT} --prefix=/usr \ --extra-cflags="${CFLAGS}" \ --as=nasm \ --target=${PKG_TARGET_NAME_LIBVPX} \ --disable-docs \ --disable-examples \ --disable-shared \ --disable-tools \ --disable-unit-tests \ --disable-vp8-decoder \ --disable-vp9-decoder \ --enable-ccache \ --enable-pic \ --enable-static \ --enable-vp8 \ --enable-vp9 } ================================================ FILE: packages/addons/addon-depends/libzip/package.mk ================================================ # 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="libzip" PKG_VERSION="1.10.1" PKG_SHA256="dc3c8d5b4c8bbd09626864f6bcf93de701540f761d76b85d7c7d710f4bd90318" PKG_LICENSE="GPL" PKG_SITE="http://www.nih.at/libzip/" PKG_URL="http://www.nih.at/libzip/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain zlib zstd" PKG_LONGDESC="A C library for reading, creating, and modifying zip archives." ================================================ FILE: packages/addons/addon-depends/moonlight-common-c/package.mk ================================================ # SPDX-License-Identifier: GPL-3.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="moonlight-common-c" PKG_VERSION="9da632949649e8b6ea30887fdcbdc12c7c540b38" PKG_SHA256="4e370183520c791983ecfe2916211f1a8d46b08227f5f7dec56c6e27604a7e3f" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/moonlight-stream/moonlight-common-c" PKG_URL="https://github.com/moonlight-stream/moonlight-common-c/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="" PKG_SHORTDESC="Shared C code for the implementation of Nvidia's GameStream protocol" PKG_LONGDESC="Shared C code for the implementation of Nvidia's GameStream protocol" PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/moonlight-embedded/package.mk ================================================ # SPDX-License-Identifier: GPL-3.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="moonlight-embedded" PKG_VERSION="395f474cb87f1b05251e2fce098b502952af3ba9" PKG_SHA256="8d749d07144fe22febe292abc8a06b93509cfac389fbeb219f18f7925a354c1e" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/TheChoconut/moonlight-embedded" PKG_URL="https://github.com/TheChoconut/moonlight-embedded/archive/${PKG_VERSION}.tar.gz" PKG_MAINTAINER="TheChoconut" PKG_DEPENDS_TARGET="toolchain curl pulseaudio systemd alsa-lib moonlight-common-c libevdev sdlgamecontrollerdb enet opus libamcodec" PKG_SECTION="" PKG_SHORTDESC="Open source NVIDIA GameStream Linux client" PKG_LONGDESC="Moonlight Embedded is an open source implementation of NVIDIA's GameStream, as used by the NVIDIA Shield, but built for Linux." PKG_CMAKE_OPTS_TARGET="-DENABLE_FFMPEG=OFF -DENABLE_CEC=OFF -DENABLE_SDL=OFF" pre_build_target() { cp -a $(get_build_dir moonlight-common-c)/* ${PKG_BUILD}/third_party/moonlight-common-c cp -a $(get_build_dir sdlgamecontrollerdb)/* ${PKG_BUILD}/third_party/SDL_GameControllerDB cp -a $(get_build_dir enet)/* ${PKG_BUILD}/third_party/moonlight-common-c/enet } ================================================ FILE: packages/addons/addon-depends/moonlight-embedded/patches/01-surround-fix.patch ================================================ diff --git a/src/audio/alsa.c b/src/audio/alsa.c index 07f5b88..2cfe7cd 100644 --- a/src/audio/alsa.c +++ b/src/audio/alsa.c @@ -37,15 +37,13 @@ static int alsa_renderer_init(int audioConfiguration, POPUS_MULTISTREAM_CONFIGUR unsigned char alsaMapping[AUDIO_CONFIGURATION_MAX_CHANNEL_COUNT]; /* The supplied mapping array has order: FL-FR-C-LFE-RL-RR-SL-SR - * ALSA expects the order: FL-FR-RL-RR-C-LFE-SL-SR + * CoreELEC expects the order: FL-FR-LFE-C-RL-RR-SL-SR * We need copy the mapping locally and swap the channels around. */ memcpy(alsaMapping, opusConfig->mapping, sizeof(alsaMapping)); if (opusConfig->channelCount >= 6) { - alsaMapping[2] = opusConfig->mapping[4]; - alsaMapping[3] = opusConfig->mapping[5]; - alsaMapping[4] = opusConfig->mapping[2]; - alsaMapping[5] = opusConfig->mapping[3]; + alsaMapping[2] = opusConfig->mapping[3]; + alsaMapping[3] = opusConfig->mapping[2]; } samplesPerFrame = opusConfig->samplesPerFrame; diff --git a/src/audio/pulse.c b/src/audio/pulse.c index e7c1ad2..4f78594 100644 --- a/src/audio/pulse.c +++ b/src/audio/pulse.c @@ -60,15 +60,13 @@ static int pulse_renderer_init(int audioConfiguration, POPUS_MULTISTREAM_CONFIGU return -1; /* The supplied mapping array has order: FL-FR-C-LFE-RL-RR-SL-SR - * ALSA expects the order: FL-FR-RL-RR-C-LFE-SL-SR + * CoreELEC expects the order: FL-FR-LFE-C-RL-RR-SL-SR * We need copy the mapping locally and swap the channels around. */ memcpy(alsaMapping, opusConfig->mapping, sizeof(alsaMapping)); if (opusConfig->channelCount >= 6) { - alsaMapping[2] = opusConfig->mapping[4]; - alsaMapping[3] = opusConfig->mapping[5]; - alsaMapping[4] = opusConfig->mapping[2]; - alsaMapping[5] = opusConfig->mapping[3]; + alsaMapping[2] = opusConfig->mapping[3]; + alsaMapping[3] = opusConfig->mapping[2]; } decoder = opus_multistream_decoder_create(opusConfig->sampleRate, opusConfig->channelCount, opusConfig->streams, opusConfig->coupledStreams, alsaMapping, &rc); ================================================ FILE: packages/addons/addon-depends/mpd-mpc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mpd-mpc" PKG_VERSION="0.34" PKG_SHA256="691e3f3654bc10d022bb0310234d0bc2d8c075a698f09924d9ebed8f506fda20" PKG_LICENSE="GPL" PKG_SITE="https://www.musicpd.org" PKG_URL="https://www.musicpd.org/download/mpc/0/mpc-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libiconv libmpdclient" PKG_LONGDESC="Command-line client for MPD." PKG_BUILD_FLAGS="-sysroot" ================================================ FILE: packages/addons/addon-depends/multimedia-tools-depends/depends/libmediainfo/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libmediainfo" PKG_VERSION="23.07" PKG_SHA256="60456c8b2ab8769a6081d96fd7be86db4fe32520e4a022397cb22cacf47ce820" PKG_LICENSE="GPL" PKG_SITE="https://mediaarea.net/en/MediaInfo/Download/Source" PKG_URL="https://mediaarea.net/download/source/libmediainfo/${PKG_VERSION}/libmediainfo_${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libzen zlib" PKG_DEPENDS_CONFIG="libzen" PKG_LONGDESC="MediaInfo is a convenient unified display of the most relevant technical and tag data for video and audio files" PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="-sysroot" configure_target() { cd Project/GNU/Library do_autoreconf ./configure \ --host=${TARGET_NAME} \ --build=${HOST_NAME} \ --enable-static \ --disable-shared \ --prefix=/usr \ --enable-visibility } make_target() { make } makeinstall_target() { mkdir -p ${INSTALL}/usr/include/MediaInfo ${INSTALL}/usr/lib/pkgconfig cp -aP ../../../Source/MediaInfo/*.h ${INSTALL}/usr/include/MediaInfo for i in Archive Audio Duplicate Export Image Multiple Reader Tag Text Video; do mkdir -p ${INSTALL}/usr/include/MediaInfo/${i}/ cp -aP ../../../Source/MediaInfo/${i}/*.h ${INSTALL}/usr/include/MediaInfo/${i}/ done cp -P .libs/* ${INSTALL}/usr/lib cp -P libmediainfo.pc ${INSTALL}/usr/lib/pkgconfig } ================================================ FILE: packages/addons/addon-depends/multimedia-tools-depends/depends/libzen/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libzen" PKG_VERSION="0.4.41" PKG_SHA256="933bad3b7ecd29dc6bdc88a83645c83dfd098c15b0b90d6177a37fa1536704e8" PKG_LICENSE="GPL" PKG_SITE="https://mediaarea.net/en/MediaInfo/" PKG_URL="https://mediaarea.net/download/source/libzen/${PKG_VERSION}/libzen_${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="MediaInfo is a convenient unified display of the most relevant technical and tag data for video and audio files" PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="-sysroot" configure_target() { cd Project/GNU/Library do_autoreconf ./configure \ --host=${TARGET_NAME} \ --build=${HOST_NAME} \ --enable-static \ --disable-shared \ --prefix=/usr } make_target() { make } makeinstall_target() { mkdir -p ${INSTALL}/usr/include/ZenLib ${INSTALL}/usr/lib/pkgconfig cp -aP ../../../Source/ZenLib/*.h ${INSTALL}/usr/include/ZenLib for i in HTTP_Client Format/Html Format/Http; do mkdir -p ${INSTALL}/usr/include/ZenLib/${i}/ cp -aP ../../../Source/ZenLib/${i}/*.h ${INSTALL}/usr/include/ZenLib/${i}/ done cp -P .libs/* ${INSTALL}/usr/lib cp -P libzen.pc ${INSTALL}/usr/lib/pkgconfig } ================================================ FILE: packages/addons/addon-depends/multimedia-tools-depends/mediainfo/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mediainfo" PKG_VERSION="23.07" PKG_SHA256="b6d7da9e29995fd34a22100825b843e74c32c7bc67adb01166b1beedea49f5d0" PKG_LICENSE="GPL" PKG_SITE="https://mediaarea.net/en/MediaInfo/Download/Source" PKG_URL="https://mediaarea.net/download/source/mediainfo/${PKG_VERSION}/mediainfo_${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libmediainfo" PKG_DEPENDS_CONFIG="libzen libmediainfo" PKG_LONGDESC="A convenient unified display of the most relevant technical and tag data for video and audio files." PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="-sysroot" configure_target() { cd Project/GNU/CLI do_autoreconf ./configure \ --host=${TARGET_NAME} \ --build=${HOST_NAME} \ --prefix=/usr } make_target() { make } makeinstall_target() { make install DESTDIR=${INSTALL} } ================================================ FILE: packages/addons/addon-depends/multimedia-tools-depends/mesa-demos/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mesa-demos" PKG_VERSION="8.4.0" PKG_SHA256="01e99c94a0184e63e796728af89bfac559795fb2a0d6f506fa900455ca5fff7d" PKG_ARCH="x86_64" PKG_LICENSE="OSS" PKG_SITE="http://www.mesa3d.org/" PKG_URL="ftp://ftp.freedesktop.org/pub/mesa/demos/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libX11 mesa glu glew" PKG_LONGDESC="Mesa 3D demos - installed are the well known glxinfo and glxgears." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--without-glut" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -P src/xdemos/glxdemo ${INSTALL}/usr/bin cp -P src/xdemos/glxgears ${INSTALL}/usr/bin cp -P src/xdemos/glxinfo ${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/multimedia-tools-depends/mpg123/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mpg123" PKG_VERSION="1.31.3" PKG_SHA256="1ca77d3a69a5ff845b7a0536f783fee554e1041139a6b978f6afe14f5814ad1a" PKG_LICENSE="LGPLv2" PKG_SITE="https://www.mpg123.org/" PKG_URL="https://downloads.sourceforge.net/sourceforge/mpg123/mpg123-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain alsa-lib" PKG_LONGDESC="A console based real time MPEG Audio Player for Layer 1, 2 and 3." PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--disable-shared \ --enable-static" ================================================ FILE: packages/addons/addon-depends/multimedia-tools-depends/mpv-drmprime/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mpv-drmprime" PKG_VERSION="0.36.0" PKG_SHA256="29abc44f8ebee013bb2f9fe14d80b30db19b534c679056e4851ceadf5a5e8bf6" PKG_LICENSE="GPL" PKG_SITE="https://mpv.io/" PKG_URL="https://github.com/mpv-player/mpv/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain waf:host alsa ffmpeg libass libdrm lua52" PKG_LONGDESC="A media player based on MPlayer and mplayer2. It supports a wide variety of video file formats, audio and video codecs, and subtitle types." PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="-sysroot" PKG_MANUAL_OPTS_TARGET="--prefix=/usr \ --disable-libarchive \ --enable-lua \ --disable-javascript \ --disable-uchardet \ --disable-rubberband \ --disable-lcms2 \ --disable-vapoursynth \ --disable-jack \ --disable-wayland \ --disable-x11 \ --disable-vulkan \ --disable-caca \ --enable-drm \ --enable-gbm \ --enable-egl-drm" if [ "${OPENGLES_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi if [ "${OPENGL_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGL}" fi if [ "${VAAPI_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" libva" PKG_MANUAL_OPTS_TARGET+=" --enable-vaapi --enable-vaapi-drm" else PKG_MANUAL_OPTS_TARGET+=" --disable-vaapi" fi if [ "${PULSEAUDIO_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" pulseaudio" PKG_MANUAL_OPTS_TARGET+=" --enable-pulse" else PKG_MANUAL_OPTS_TARGET+=" --disable-pulse" fi if [ "${KODI_BLURAY_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" libbluray" PKG_MANUAL_OPTS_TARGET+=" --enable-libbluray" else PKG_MANUAL_OPTS_TARGET+=" --disable-libbluray" fi pre_configure_target() { #mpv does not build in the .TARGET_NAME cd ${PKG_BUILD} rm -rf .${TARGET_NAME} } configure_target() { waf configure ${PKG_MANUAL_OPTS_TARGET} } make_target() { waf build } makeinstall_target() { waf install --destdir=${INSTALL} rm -r ${INSTALL}/usr/share } ================================================ FILE: packages/addons/addon-depends/multimedia-tools-depends/opencaster/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="opencaster" PKG_VERSION="3.2.2" PKG_SHA256="c9d77f98b31d53f521e3179003a9cb66b0586704717e9d401f3bc0dafa243865" PKG_LICENSE="GPL" PKG_SITE="http://www.avalpa.com/the-key-values/15-free-software/33-opencaster" PKG_URL="http://ftp.de.debian.org/debian/pool/main/o/opencaster/opencaster_${PKG_VERSION}+dfsg.orig.tar.gz" PKG_DEPENDS_TARGET="toolchain zlib" PKG_LONGDESC="A free and open source MPEG2 transport stream data generator and packet manipulator." PKG_BUILD_FLAGS="-sysroot" pre_configure_target() { PKG_MAKE_OPTS_TARGET="CC=${CC}" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin make install DESTDIR=${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/multimedia-tools-depends/opencaster/patches/opencaster-02_headers.patch ================================================ diff --git a/tools/mpe2sec/mpe.c b/tools/mpe2sec/mpe.c index 18417af..3b71f64 100644 --- a/tools/mpe2sec/mpe.c +++ b/tools/mpe2sec/mpe.c @@ -12,7 +12,7 @@ #include #include -#include +#include #include "sectioncrc.h" ================================================ FILE: packages/addons/addon-depends/multimedia-tools-depends/opencaster/patches/opencaster-03_dont-build-dvbobjects.patch ================================================ diff --git a/libs/Makefile b/libs/Makefile index 23d951b..c442057 100755 --- a/libs/Makefile +++ b/libs/Makefile @@ -1,4 +1,4 @@ -SUBDIRS = sectioncrc dvbobjects +SUBDIRS = sectioncrc subdirs: $(SUBDIRS) $(SUBDIRS): ================================================ FILE: packages/addons/addon-depends/multimedia-tools-depends/squeezelite/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="squeezelite" PKG_VERSION="bc72c0de3fff771540a2a45aaafafed539387b3c" # 2022-04-10 # 1.9.9.1403 PKG_SHA256="5aa312d678a593b9a08f79e080a6ebe329d8fc40e6507e28b6705807c408bf7a" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/ralph-irving/squeezelite" PKG_URL="https://github.com/ralph-irving/squeezelite/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain faad2 ffmpeg flac libmad libvorbis mpg123 soxr libogg" PKG_DEPENDS_CONFIG="mpg123" PKG_LONGDESC="A client for the Logitech Media Server." PKG_BUILD_FLAGS="-sysroot" make_target() { make \ OPTS="-DDSD -DFFMPEG -DRESAMPLE -DVISEXPORT -DLINKALL" \ CFLAGS="${CFLAGS} $(pkg-config --cflags libmpg123 vorbisfile vorbis ogg)" \ LDFLAGS+=" $(pkg-config --libs libmpg123 vorbisfile vorbis ogg)" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -p squeezelite ${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/multimedia-tools-depends/tsdecrypt/package.mk ================================================ # 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="tsdecrypt" PKG_VERSION="10.0" PKG_SHA256="a337a7d60cc8f78b9dffbd7d675390497763bcb8f878ec9f1bec3eb80f32b1f1" PKG_LICENSE="GPL" PKG_SITE="http://georgi.unixsol.org/programs/tsdecrypt" PKG_URL="http://georgi.unixsol.org/programs/tsdecrypt/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libdvbcsa openssl" PKG_LONGDESC="A tool that reads incoming mpeg transport stream over UDP/RTP and then decrypts it using libdvbcsa/ffdecsa." PKG_BUILD_FLAGS="-sysroot" PKG_MAKEINSTALL_OPTS_TARGET="PREFIX=/usr" make_target() { make CC=${CC} LINK="${LD} -o" } post_make_target() { make strip STRIP=${STRIP} } ================================================ FILE: packages/addons/addon-depends/multimedia-tools-depends/tstools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tstools" PKG_VERSION="db1f79f409818fa0476ecf8593079a7ca3dbafd2" PKG_SHA256="f204229016c9deafcc75fe602c390339878312126134edbfcebf239e093dc4ff" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kynesim/tstools" PKG_URL="https://github.com/kynesim/tstools/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="This is a set of cross-platform command line tools for working with MPEG data." PKG_BUILD_FLAGS="-sysroot" PKG_MAKE_OPTS_TARGET="CROSS_COMPILE=${TARGET_PREFIX} prefix=/usr" PKG_MAKEINSTALL_OPTS_TARGET="${PKG_MAKE_OPTS_TARGET}" pre_make_target() { make builddirs } ================================================ FILE: packages/addons/addon-depends/multimedia-tools-depends/tstools/patches/build.patch ================================================ --- a/Makefile 2020-01-08 22:09:15.794660218 +0100 +++ b/Makefile 2020-01-08 22:09:18.954615301 +0100 @@ -412,6 +412,9 @@ # ------------------------------------------------------------ # Directory creation +.PHONY: builddirs +builddirs: $(OBJDIR) $(LIBDIR) $(BINDIR) + $(OBJDIR) $(LIBDIR) $(BINDIR) $(DESTDIR)$(bindir) $(DESTDIR)$(libdir) $(DESTDIR)$(man1dir): mkdir -p $@ ================================================ FILE: packages/addons/addon-depends/multimedia-tools-depends/tstools/patches/crossstrip.patch ================================================ diff -ur a/Makefile b/Makefile --- a/Makefile 2015-10-30 17:34:51.000000000 +0100 +++ b/Makefile 2019-12-14 12:58:16.655141460 +0100 @@ -43,7 +43,7 @@ man1dir=$(mandir)/man1 manext=.1 -INSTALL=install +INSTALL=install --strip-program=$(CROSS_COMPILE)strip INSTALL_PROGRAM=$(INSTALL) -m 0555 -s INSTALL_LIB=$(INSTALL) -m 0444 -s INSTALL_DATA=$(INSTALL) -m 0444 ================================================ FILE: packages/addons/addon-depends/network-tools-depends/bwm-ng/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="bwm-ng" PKG_VERSION="0.6.3" PKG_SHA256="c1a552b6ff48ea3e4e10110a7c188861abc4750befc67c6caaba8eb3ecf67f46" PKG_LICENSE="GPL" PKG_SITE="http://www.gropp.org/?id=projects&sub=bwm-ng" PKG_URL="https://github.com/vgropp/bwm-ng/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ncurses libstatgrab" PKG_LONGDESC="A small and simple console-based live network and disk io bandwidth monitor." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--with-libstatgrab \ --with-time \ --with-getifaddrs \ --with-sysctl \ --with-sysctldisk \ --with-procnetdev \ --with-partitions" ================================================ FILE: packages/addons/addon-depends/network-tools-depends/depends/libpcap/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libpcap" PKG_VERSION="1.10.3" PKG_SHA256="2a8885c403516cf7b0933ed4b14d6caa30e02052489ebd414dc75ac52e7559e6" PKG_LICENSE="GPL" PKG_SITE="https://www.tcpdump.org/" PKG_URL="https://www.tcpdump.org/release/libpcap-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A portable framework for low-level network monitoring." # use configure, not cmake. review cmake in future release. PKG_TOOLCHAIN="configure" PKG_CONFIGURE_OPTS_TARGET="LIBS=-lpthread \ ac_cv_header_libusb_1_0_libusb_h=no \ --disable-shared \ --with-pcap=linux \ --disable-bluetooth \ --disable-can \ --without-libnl \ --disable-dbus \ --disable-canusb" pre_configure_target() { # When cross-compiling, configure can't set linux version # forcing it sed -i -e 's/ac_cv_linux_vers=unknown/ac_cv_linux_vers=2/' ../configure } post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/network-tools-depends/depends/libpcap/patches/remove-manpages.patch ================================================ --- libpcap-1.10.0/CMakeLists.txt 2020-12-29 21:16:30.000000000 +0000 +++ libpcap-1.10.0/CMakeLists.txt 2021-01-02 04:34:31.834695073 +0000 @@ -2689,70 +2689,6 @@ install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/pcap-config DESTINATION bin) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpcap.pc DESTINATION lib/pkgconfig) - # - # Man pages. - # - # For each section of the manual for which we have man pages - # that require macro expansion, do the expansion. - # - # If this is MinGW, maybe we have a UN*X-style ln command and - # maybe we don't. (No, we do *NOT* require MSYS!) If we don't - # have it, don't do the man pages. - # - if(MINGW) - find_program(LINK_EXECUTABLE ln) - endif(MINGW) - if(UNIX OR (MINGW AND LINK_EXECUTABLE)) - set(MAN1 "") - foreach(MANPAGE ${MAN1_NOEXPAND}) - set(MAN1 ${MAN1} ${CMAKE_CURRENT_SOURCE_DIR}/${MANPAGE}) - endforeach(MANPAGE) - install(FILES ${MAN1} DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) - - set(MAN3PCAP "") - foreach(MANPAGE ${MAN3PCAP_NOEXPAND}) - set(MAN3PCAP ${MAN3PCAP} ${CMAKE_CURRENT_SOURCE_DIR}/${MANPAGE}) - endforeach(MANPAGE) - foreach(TEMPLATE_MANPAGE ${MAN3PCAP_EXPAND}) - string(REPLACE ".in" "" MANPAGE ${TEMPLATE_MANPAGE}) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${TEMPLATE_MANPAGE} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE} @ONLY) - set(MAN3PCAP ${MAN3PCAP} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE}) - endforeach(TEMPLATE_MANPAGE) - install(FILES ${MAN3PCAP} DESTINATION ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_datalink_val_to_name.3pcap pcap_datalink_val_to_description.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_datalink_val_to_name.3pcap pcap_datalink_val_to_description_or_dlt.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_dump_open.3pcap pcap_dump_fopen.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_findalldevs.3pcap pcap_freealldevs.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_geterr.3pcap pcap_perror.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_inject.3pcap pcap_sendpacket.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_list_datalinks.3pcap pcap_free_datalinks.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_list_tstamp_types.3pcap pcap_free_tstamp_types.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_loop.3pcap pcap_dispatch.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_major_version.3pcap pcap_minor_version.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_next_ex.3pcap pcap_next.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_open_dead.3pcap pcap_open_dead_with_tstamp_precision.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_open_offline.3pcap pcap_open_offline_with_tstamp_precision.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_open_offline.3pcap pcap_fopen_offline.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_open_offline.3pcap pcap_fopen_offline_with_tstamp_precision.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_tstamp_type_val_to_name.3pcap pcap_tstamp_type_val_to_description.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - install_manpage_symlink(pcap_setnonblock.3pcap pcap_getnonblock.3pcap ${CMAKE_INSTALL_MANDIR}/man3) - - set(MANFILE "") - foreach(TEMPLATE_MANPAGE ${MANFILE_EXPAND}) - string(REPLACE ".manfile.in" ".${MAN_FILE_FORMATS}" MANPAGE ${TEMPLATE_MANPAGE}) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${TEMPLATE_MANPAGE} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE} @ONLY) - set(MANFILE ${MANFILE} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE}) - endforeach(TEMPLATE_MANPAGE) - install(FILES ${MANFILE} DESTINATION ${CMAKE_INSTALL_MANDIR}/man${MAN_FILE_FORMATS}) - - set(MANMISC "") - foreach(TEMPLATE_MANPAGE ${MANMISC_EXPAND}) - string(REPLACE ".manmisc.in" ".${MAN_MISC_INFO}" MANPAGE ${TEMPLATE_MANPAGE}) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${TEMPLATE_MANPAGE} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE} @ONLY) - set(MANMISC ${MANMISC} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE}) - endforeach(TEMPLATE_MANPAGE) - install(FILES ${MANMISC} DESTINATION ${CMAKE_INSTALL_MANDIR}/man${MAN_MISC_INFO}) - endif(UNIX OR (MINGW AND LINK_EXECUTABLE)) endif(NOT MSVC) # uninstall target ================================================ FILE: packages/addons/addon-depends/network-tools-depends/depends/libstatgrab/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libstatgrab" PKG_VERSION="0.92.1" PKG_SHA256="5688aa4a685547d7174a8a373ea9d8ee927e766e3cc302bdee34523c2c5d6c11" PKG_SITE="https://libstatgrab.org" PKG_URL="https://github.com/libstatgrab/libstatgrab/releases/download/LIBSTATGRAB_${PKG_VERSION//./_}/libstatgrab-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION=libs PKG_LONGDESC="A library that provides cross platform access to statistics about the system on which it's run." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="ac_cv_func_malloc_0_nonnull=yes \ --enable-static \ --disable-shared \ --disable-saidar \ --disable-examples \ --disable-setuid-binaries \ --disable-setgid-binaries" ================================================ FILE: packages/addons/addon-depends/network-tools-depends/iftop/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="iftop" PKG_VERSION="77901c8c53e01359d83b8090aacfe62214658183" PKG_SHA256="f2728741f1bd2099d325271b4b2564a696dbce7c23401360ac6c9841cbda1108" PKG_LICENSE="GPL" PKG_SITE="http://www.ex-parrot.com/pdw/iftop/" PKG_URL="https://code.blinkace.com/pdw/iftop/-/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ncurses libpcap libnl" PKG_LONGDESC="A tool to display bandwidth usage on an interface." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" pre_build_target() { mkdir -p ${PKG_BUILD}/.${TARGET_NAME} cp -RP ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME} } pre_configure_target() { export LIBS="-lpcap -lnl-3 -lnl-genl-3 -lncurses" } ================================================ FILE: packages/addons/addon-depends/network-tools-depends/iftop/patches/iftop-Fix-building-with-gcc10.patch ================================================ From d9402e29486f60ea4a9b8da530c60e6c8404127b Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Mon, 22 Jun 2020 20:18:59 +0200 Subject: [PATCH] Fix building with gcc10 --- ui_common.c | 6 ++++++ ui_common.h | 12 +++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/ui_common.c b/ui_common.c index dcf66466fda4..b1027ec16da7 100644 --- a/ui_common.c +++ b/ui_common.c @@ -17,6 +17,12 @@ #include "ui_common.h" +sorted_list_type screen_list; +host_pair_line totals; +int peaksent, peakrecv, peaktotal; +hash_type* screen_hash; +hash_type* service_hash; + /* 2, 10 and 40 seconds */ int history_divs[HISTORY_DIVISIONS] = {1, 5, 20}; diff --git a/ui_common.h b/ui_common.h index 63ae5bb69886..1403d11c310c 100644 --- a/ui_common.h +++ b/ui_common.h @@ -33,12 +33,14 @@ typedef struct host_pair_line_tag { extern options_t options; -sorted_list_type screen_list; -host_pair_line totals; -int peaksent, peakrecv, peaktotal; +extern sorted_list_type screen_list; +extern host_pair_line totals; +extern int peaksent; +extern int peakrecv; +extern int peaktotal; extern history_type history_totals; -hash_type* screen_hash; -hash_type* service_hash; +extern hash_type* screen_hash; +extern hash_type* service_hash; void analyse_data(void); void screen_list_init(void); -- 2.27.0 ================================================ FILE: packages/addons/addon-depends/network-tools-depends/iftop/patches/iftop-boo.patch ================================================ diff --git a/configure.ac b/configure.ac index 671241e..b6fece6 100644 --- a/configure.ac +++ b/configure.ac @@ -294,42 +294,6 @@ if test x$libpcap_prefix = x ; then libpcap_prefix="/usr /usr/local /opt /software" fi -AC_MSG_CHECKING([where to find pcap.h]) -foundpcaph=0 -oldCPPFLAGS=$CPPFLAGS -for test_prefix in "" $libpcap_prefix ; do - for x in "" /pcap ; do - if test x$test_prefix != x ; then - CPPFLAGS="$oldCPPFLAGS -I$test_prefix/include$x" - fi - AC_TRY_CPP([ -#include - ], [ - AC_MSG_RESULT([$test_prefix/include$x]) - foundpcaph=1 - break - ]) - done - if test $foundpcaph = 1 ; then - break - fi -done - -if test $foundpcaph = 0 ; then - AC_MSG_RESULT([no idea]) - AC_MSG_ERROR([can't find pcap.h - You're not going to get very far without libpcap.]) -else - dnl assume that -lpcap is under $test_prefix/lib - if test x$test_prefix != x ; then - LDFLAGS="$LDFLAGS -L$test_prefix/lib" - fi - AC_CHECK_LIB(pcap, pcap_open_live, , [ - AC_MSG_ERROR([can't find libpcap - You're not going to get very far without libpcap.]) - ]) -fi - foundpcap=0 AC_CHECK_HEADERS([pcap.h pcap/pcap.h], [ foundpcap=1 diff --git a/edline.c b/edline.c index 75f1a5a..aed80cf 100644 --- a/edline.c +++ b/edline.c @@ -7,7 +7,7 @@ static const char rcsid[] = "$Id: edline.c,v 1.2 2002/11/04 12:27:35 chris Exp $"; #include -#include +#include #include #include "iftop.h" diff --git a/iftop.c b/iftop.c index a090dcf..5851c86 100644 --- a/iftop.c +++ b/iftop.c @@ -23,7 +23,7 @@ #endif #include -#include +#include #include #include #include ================================================ FILE: packages/addons/addon-depends/network-tools-depends/iftop/patches/iftop-variable-to-be-local-due-to-pcap-1-10-0.patch ================================================ diff -Nuar iftop-77901c8c/iftop-dump.c iftop-pcap-1-10/iftop-dump.c --- iftop-77901c8c/iftop-dump.c 2018-10-03 17:02:36.000000000 +0000 +++ iftop-pcap-1-10/iftop-dump.c 2021-01-17 23:40:39.896124155 +0000 @@ -64,7 +64,7 @@ pthread_mutex_t tick_mutex; pcap_t* pd; /* pcap descriptor */ -struct bpf_program pcap_filter; +struct bpf_program my_pcap_filter; pcap_handler packet_handler; FILE*fout = NULL; @@ -375,12 +375,12 @@ sprintf(x, "(%s) and ip", filter); } else x = xstrdup("ip"); - if (pcap_compile(pd, &pcap_filter, x, 1, 0) == -1) { + if (pcap_compile(pd, &my_pcap_filter, x, 1, 0) == -1) { xfree(x); return pcap_geterr(pd); } xfree(x); - if (pcap_setfilter(pd, &pcap_filter) == -1) + if (pcap_setfilter(pd, &my_pcap_filter) == -1) return pcap_geterr(pd); else return NULL; diff -Nuar iftop-77901c8c/iftop.c iftop-pcap-1-10/iftop.c --- iftop-77901c8c/iftop.c 2018-10-03 17:02:36.000000000 +0000 +++ iftop-pcap-1-10/iftop.c 2021-01-17 23:40:54.116240467 +0000 @@ -74,7 +74,7 @@ pthread_mutex_t tick_mutex; pcap_t* pd; /* pcap descriptor */ -struct bpf_program pcap_filter; +struct bpf_program my_pcap_filter; pcap_handler packet_handler; sig_atomic_t foad; @@ -679,12 +679,12 @@ sprintf(x, "(%s) and (ip or ip6)", filter); } else x = xstrdup("ip or ip6"); - if (pcap_compile(pd, &pcap_filter, x, 1, 0) == -1) { + if (pcap_compile(pd, &my_pcap_filter, x, 1, 0) == -1) { xfree(x); return pcap_geterr(pd); } xfree(x); - if (pcap_setfilter(pd, &pcap_filter) == -1) + if (pcap_setfilter(pd, &my_pcap_filter) == -1) return pcap_geterr(pd); else return NULL; ================================================ FILE: packages/addons/addon-depends/network-tools-depends/iperf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="iperf" PKG_VERSION="3.13" PKG_SHA256="a49d23fe0d3b1482047ad7f3b9e384c69657a63b486c4e3f0ce512a077d94434" PKG_LICENSE="BSD" PKG_SITE="http://software.es.net/iperf/" PKG_URL="https://github.com/esnet/iperf/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain openssl" PKG_LONGDESC="A tool to measuring maximum TCP and UDP bandwidth performance." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared" ================================================ FILE: packages/addons/addon-depends/network-tools-depends/irssi/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="irssi" PKG_VERSION="1.4.3" PKG_SHA256="b93f715223a322e67f42b61a08a512ae29e34bd4a53d7f223766660aaa5a0434" PKG_LICENSE="GPL" PKG_SITE="http://www.irssi.org/" PKG_URL="https://github.com/irssi/irssi/releases/download/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain glib ncurses openssl" PKG_LONGDESC="Irssi is a terminal based IRC client for UNIX systems." PKG_BUILD_FLAGS="-sysroot" PKG_MESON_OPTS_TARGET="-Dwithout-textui=no \ -Dwith-bot=no \ -Dwith-proxy=no \ -Dwith-perl=no" ================================================ FILE: packages/addons/addon-depends/network-tools-depends/lftp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="lftp" PKG_VERSION="4.9.2" PKG_SHA256="c517c4f4f9c39bd415d7313088a2b1e313b2d386867fe40b7692b83a20f0670d" PKG_LICENSE="GPLv3" PKG_SITE="http://lftp.yar.ru/" PKG_URL="http://lftp.yar.ru/ftp/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain readline openssl zlib libidn2" PKG_LONGDESC="A sophisticated ftp/http client, and a file transfer program supporting a number of network protocols." PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--disable-nls \ --disable-rpath \ --without-gnutls \ --with-openssl \ --with-readline=${SYSROOT_PREFIX}/usr \ --with-zlib=${SYSROOT_PREFIX}/usr" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/addons/addon-depends/network-tools-depends/lftp/patches/lftp-0001-link-readline-with-termcap.patch ================================================ diff -Naur a/configure b/configure --- a/configure 2016-11-16 05:11:30.000000000 -0800 +++ b/configure 2021-04-17 14:18:59.000000000 +0000 @@ -55428,7 +55428,7 @@ fi readline_ld_flags="-L$readline_prefix/lib" if test -z "$readline_lib_flags"; then - readline_lib_flags="-lreadline" + readline_lib_flags="-lreadline -lncurses" fi run_readline_test="yes" elif test "$readline_requested" = "yes"; then ================================================ FILE: packages/addons/addon-depends/network-tools-depends/ncftp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ncftp" PKG_VERSION="3.2.6" PKG_SHA256="5f200687c05d0807690d9fb770327b226f02dd86155b49e750853fce4e31098d" PKG_LICENSE="GPLv3" PKG_SITE="http://www.ncftp.com/ncftp/" PKG_URL="ftp://ftp.ncftp.com/ncftp/ncftp-${PKG_VERSION}-src.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="NcFTP is a set of application programs implementing the File Transfer Protocol." PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="ac_cv_header_librtmp_rtmp_h=yes \ --enable-readline \ --disable-universal \ --disable-ccdv \ --without-curses" pre_configure_target() { export CFLAGS="${CFLAGS} -I../" } pre_build_target() { mkdir -p ${PKG_BUILD}/.${TARGET_NAME} cp -RP ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME} } ================================================ FILE: packages/addons/addon-depends/network-tools-depends/ncftp/patches/ncftpd-gcc10-build-fix.patch ================================================ diff -Nur a/sh_util/gpshare.c b/sh_util/gpshare.c --- a/sh_util/gpshare.c 2016-11-13 00:53:39.000000000 +0100 +++ b/sh_util/gpshare.c 2020-06-22 20:24:08.160203885 +0200 @@ -28,7 +28,7 @@ static int gIsAtty1 = 1, gIsAtty2 = 1; extern int gLoadedBm, gBookmarkMatchMode; -Bookmark gBm; +extern Bookmark gBm; double FileSize(double size, const char **uStr0, double *uMult0) ================================================ FILE: packages/addons/addon-depends/network-tools-depends/ngrep/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ngrep" PKG_VERSION="2a9603bc67dface9606a658da45e1f5c65170444" # 2019-01-29 PKG_SHA256="500c29914dd26f5aa6df07446388d49b60249622c9b0fd1f266f62a5706f056c" PKG_LICENSE="GPL" PKG_SITE="https://github.com/jpr5/ngrep" PKG_URL="https://github.com/jpr5/ngrep/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libpcap pcre2" PKG_LONGDESC="A tool like GNU grep applied to the network layer." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot -parallel" PKG_CONFIGURE_OPTS_TARGET="--with-pcap-includes=${SYSROOT_PREFIX}/usr/include \ --enable-ipv6 \ --enable-pcre2 \ --disable-dropprivs" pre_build_target() { mkdir -p ${PKG_BUILD}/.${TARGET_NAME} cp -RP ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME} } ================================================ FILE: packages/addons/addon-depends/network-tools-depends/ngrep/patches/port-to-pcre2-api-and-enable-jit-compilation.patch ================================================ From cfcf1e6e9c4f8a2404810d8d1d90e6d1eaa0abdd Mon Sep 17 00:00:00 2001 From: Romain Francoise Date: Sat, 20 Nov 2021 23:28:15 +0100 Subject: [PATCH] Port to PCRE2 API and enable JIT compilation The original PCRE API provided on most systems by libpcre3 is no longer maintained upstream and is superseded by the new PCRE2 API, which was first released in 2015. pcre3 will be removed from Debian in 2023, as noted in this bug report: https://bugs.debian.org/1000080 This commit replaces the existing PCRE implementation with a new one using PCRE2, which is quite similar. One benefit is that PCRE2 provides a JIT compiler which can replace the interpretive regular expression evaluation code with native machine code on most modern platforms: https://pcre.org/current/doc/html/pcre2jit.html Depending on the length and complexity of the pattern used, enabling JIT compilation makes Ngrep 50x to 150x faster, testing in quiet mode on a multi-gigabyte PCAP file stored on tmpfs. --- configure.in | 24 ++++++------ ngrep.c | 106 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 82 insertions(+), 48 deletions(-) diff --git a/configure.in b/configure.in index dbef39b..0806a62 100644 --- a/configure.in +++ b/configure.in @@ -141,16 +141,16 @@ dnl REGEX_DIR='' REGEX_OBJS='' -AC_ARG_ENABLE(pcre, -[ --enable-pcre use PCRE instead of GNU regex (default GNU)], -[ use_pcre="$enableval" ], -[ use_pcre="no" ]) - -if test $use_pcre = yes; then - USE_PCRE="1" - EXTRA_LIBS="$EXTRA_LIBS -lpcre" +AC_ARG_ENABLE(pcre2, +[ --enable-pcre2 use PCRE2 instead of GNU regex (default GNU)], +[ use_pcre2="$enableval" ], +[ use_pcre2="no" ]) + +if test $use_pcre2 = yes; then + USE_PCRE2="1" + EXTRA_LIBS="$EXTRA_LIBS -lpcre2-8" else - USE_PCRE="0" + USE_PCRE2="0" AC_MSG_RESULT AC_MSG_RESULT(Configuring GNU Regular Expression library ...) @@ -476,7 +476,7 @@ dnl AC_DEFINE_UNQUOTED(USE_PCAP_RESTART, $USE_PCAP_RESTART, [whether to call the BPF lexer restart function between multiple BPF filter compilation attempts (default no)]) AC_DEFINE_UNQUOTED(PCAP_RESTART_FUNC, $PCAP_RESTART_FUNC, [routine used for restarting the BPF lexer]) -AC_DEFINE_UNQUOTED(USE_PCRE, $USE_PCRE, [whether to use PCRE (default GNU Regex)]) +AC_DEFINE_UNQUOTED(USE_PCRE2, $USE_PCRE2, [whether to use PCRE2 (default GNU Regex)]) AC_DEFINE_UNQUOTED(USE_IPv6, $USE_IPv6, [whether to use IPv6 (default off)]) AC_DEFINE_UNQUOTED(USE_TCPKILL, $USE_TCPKILL, [whether to enable tcpkill functionality (default off)]) AC_DEFINE_UNQUOTED(USE_VLAN_HACK, $USE_VLAN_HACK, [whether to automatically include VLAN frames (default on)]) @@ -524,8 +524,8 @@ else AC_MSG_RESULT(CONFIG: privilege dropping DISABLED) fi -if test "$USE_PCRE" = "1"; then - AC_MSG_RESULT(CONFIG: using PCRE regex library) +if test "$USE_PCRE2" = "1"; then + AC_MSG_RESULT(CONFIG: using PCRE2 regex library) else AC_MSG_RESULT(CONFIG: using GNU regex library) fi diff --git a/ngrep.c b/ngrep.c index 3df9389..dcf0555 100644 --- a/ngrep.c +++ b/ngrep.c @@ -91,8 +91,9 @@ #include #endif -#if USE_PCRE -#include +#if USE_PCRE2 +#define PCRE2_CODE_UNIT_WIDTH 8 +#include #else #include #endif @@ -128,12 +129,14 @@ char nonprint_char = '.'; * GNU Regex/PCRE */ -#if USE_PCRE -int32_t err_offset; -char *re_err = NULL; +#if USE_PCRE2 +PCRE2_SIZE err_offset; +int re_err; -pcre *pattern = NULL; -pcre_extra *pattern_extra = NULL; +pcre2_code *re; +pcre2_match_data *pcre2_md; +PCRE2_SPTR pattern; +uint32_t pcre2_jit_on = 0; #else const char *re_err = NULL; @@ -189,6 +192,7 @@ uint32_t ws_row, ws_col = 80, ws_col_forced = 0; int main(int argc, char **argv) { int32_t c; + const char *extra = ""; signal(SIGINT, clean_exit); signal(SIGABRT, clean_exit); @@ -394,8 +398,12 @@ int main(int argc, char **argv) { if (setup_matcher()) clean_exit(2); +#if USE_PCRE2 + if (pcre2_jit_on) + extra = " (JIT)"; +#endif if (quiet < 2 && strlen(match_data)) - printf("%smatch: %s%s\n", invert_match?"don't ":"", + printf("%smatch%s: %s%s\n", invert_match?"don't ":"", extra, (bin_data && !strchr(match_data, 'x'))?"0x":"", match_data); if (re_match_word) free(match_data); @@ -631,14 +639,14 @@ int setup_matcher(void) { } else { -#if USE_PCRE - uint32_t pcre_options = PCRE_UNGREEDY; +#if USE_PCRE2 + uint32_t pcre_options = PCRE2_UNGREEDY; if (re_ignore_case) - pcre_options |= PCRE_CASELESS; + pcre_options |= PCRE2_CASELESS; if (re_multiline_match) - pcre_options |= PCRE_DOTALL; + pcre_options |= PCRE2_DOTALL; #else re_syntax_options = RE_CHAR_CLASSES | RE_NO_BK_PARENS | RE_NO_BK_VBAR | RE_CONTEXT_INDEP_ANCHORS | RE_CONTEXT_INDEP_OPS; @@ -673,15 +681,36 @@ int setup_matcher(void) { match_data = word_regex; } -#if USE_PCRE - pattern = pcre_compile(match_data, pcre_options, (const char **)&re_err, &err_offset, 0); +#if USE_PCRE2 + re = pcre2_compile((PCRE2_SPTR8)match_data, PCRE2_ZERO_TERMINATED, + pcre_options, &re_err, &err_offset, NULL); + if (!re) { + PCRE2_UCHAR buffer[256]; + pcre2_get_error_message(re_err, buffer, sizeof(buffer)); + fprintf(stderr, "regex compile failed: %s (offset: %zd)\n", buffer, + err_offset); + return 1; + } - if (!pattern) { - fprintf(stderr, "compile failed: %s\n", re_err); + pcre2_md = pcre2_match_data_create_from_pattern(re, NULL); + if (!pcre2_md) { + fprintf(stderr, "unable to alloc pcre2 match data\n"); return 1; } - pattern_extra = pcre_study(pattern, 0, (const char **)&re_err); + pcre2_config(PCRE2_CONFIG_JIT, &pcre2_jit_on); + if (pcre2_jit_on) { + int rc; + size_t jitsz; + + if (pcre2_jit_compile(re, PCRE2_JIT_COMPLETE) != 0) { + fprintf(stderr, "unable to JIT-compile pcre2 regular expression\n"); + return 1; + } + rc = pcre2_pattern_info(re, PCRE2_INFO_JITSIZE, &jitsz); + if (rc || jitsz == 0) + pcre2_jit_on = 0; + } #else re_err = re_compile_pattern(match_data, strlen(match_data), &pattern); if (re_err) { @@ -990,24 +1019,29 @@ void dump_packet(struct pcap_pkthdr *h, u_char *p, uint8_t proto, unsigned char } int8_t re_match_func(unsigned char *data, uint32_t len, uint16_t *mindex, uint16_t *msize) { -#if USE_PCRE - - static int sub[2]; - switch(pcre_exec(pattern, 0, (char const *)data, (int32_t)len, 0, 0, 0, 0)) { - case PCRE_ERROR_NULL: - case PCRE_ERROR_BADOPTION: - case PCRE_ERROR_BADMAGIC: - case PCRE_ERROR_UNKNOWN_NODE: - case PCRE_ERROR_NOMEMORY: - perror("she's dead, jim\n"); - clean_exit(2); +#if USE_PCRE2 + int rc; + PCRE2_SIZE *ovector; + PCRE2_UCHAR errbuf[256]; - case PCRE_ERROR_NOMATCH: - return 0; + if (pcre2_jit_on) + rc = pcre2_jit_match(re, data, len, 0, 0, pcre2_md, NULL); + else + rc = pcre2_match(re, data, len, 0, 0, pcre2_md, NULL); - default: - *mindex = sub[0]; - *msize = sub[1] - sub[0]; + if (rc < 0) { + switch (rc) { + case PCRE2_ERROR_NOMATCH: + return 0; + default: + pcre2_get_error_message(rc, errbuf, sizeof(errbuf)); + fprintf(stderr, "she's dead, jim: %s (error %d)\n", errbuf, rc); + clean_exit(2); + } + } else { + ovector = pcre2_get_ovector_pointer(pcre2_md); + *mindex = ovector[0]; + *msize = ovector[1] - ovector[0]; } #else @@ -1479,9 +1513,9 @@ void clean_exit(int32_t sig) { if (quiet < 1 && sig >= 0) printf("exit\n"); -#if USE_PCRE - if (pattern) pcre_free(pattern); - if (pattern_extra) pcre_free(pattern_extra); +#if USE_PCRE2 + if (re) pcre2_code_free(re); + if (pcre2_md) pcre2_match_data_free(pcre2_md); #else if (pattern.translate) free(pattern.translate); if (pattern.fastmap) free(pattern.fastmap); ================================================ FILE: packages/addons/addon-depends/network-tools-depends/nmap/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nmap" PKG_VERSION="7.93" PKG_SHA256="55bcfe4793e25acc96ba4274d8c4228db550b8e8efd72004b38ec55a2dd16651" PKG_LICENSE="GPL" PKG_SITE="https://nmap.org/" PKG_URL="https://nmap.org/dist/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain openssl" PKG_LONGDESC="Free Security Scanned for Network." PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --with-pcap=linux \ --with-libpcap=included \ --with-libpcre=included \ --with-libdnet=included \ --with-liblua=included \ --with-liblinear=included \ --with-openssl=${SYSROOT_PREFIX}" pre_configure_target() { # nmap fails to build in subdirs cd ${PKG_BUILD} rm -rf .${TARGET_NAME} export CPPFLAGS="${CPPFLAGS} -Iliblua" } ================================================ FILE: packages/addons/addon-depends/network-tools-depends/rar2fs/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rar2fs" PKG_VERSION="1.29.6" PKG_SHA256="ba3a0b649f2322498d54168f03d2e8bca9b1c96d70d0d97d83ea336a7525d4cb" PKG_LICENSE="GPL3" PKG_SITE="https://github.com/hasse69/rar2fs" PKG_URL="https://github.com/hasse69/rar2fs/releases/download/v${PKG_VERSION}/rar2fs-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain fuse unrar" PKG_LONGDESC="FUSE file system for reading RAR archives" PKG_BUILD_FLAGS="-sysroot" pre_configure_target() { PKG_CONFIGURE_OPTS_TARGET="--with-unrar=${PKG_BUILD}/unrar \ --with-unrar-lib=${PKG_BUILD}/unrar \ --disable-static-unrar" cp -a $(get_install_dir unrar)/usr/include/unrar ${PKG_BUILD}/ cp -p $(get_install_dir unrar)/usr/lib/libunrar.a ${PKG_BUILD}/unrar/ } ================================================ FILE: packages/addons/addon-depends/network-tools-depends/rar2fs/patches/001-remove-man-pages-1.29.3.patch ================================================ diff -Nur rar2fs-1.29.3.orig/Makefile.am rar2fs-1.29.3/Makefile.am --- rar2fs-1.29.3.orig/Makefile.am 2020-11-08 19:41:41.000000000 +0000 +++ rar2fs-1.29.3/Makefile.am 2021-01-01 11:33:42.609539322 +0000 @@ -1,4 +1,4 @@ ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = src man +SUBDIRS = src EXTRA_DIST = get-version.sh rarconfig.example diff -Nur rar2fs-1.29.3.orig/Makefile.in rar2fs-1.29.3/Makefile.in --- rar2fs-1.29.3.orig/Makefile.in 2020-12-15 13:06:30.000000000 +0000 +++ rar2fs-1.29.3/Makefile.in 2021-01-01 11:34:20.496533359 +0000 @@ -233,7 +233,7 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = src man +SUBDIRS = src EXTRA_DIST = get-version.sh rarconfig.example all: all-recursive ================================================ FILE: packages/addons/addon-depends/network-tools-depends/sshfs/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="sshfs" PKG_VERSION="3.7.3" PKG_SHA256="5218ce7bdd2ce0a34137a0d7798e0f6d09f0e6d21b1e98ee730a18b0699c2e99" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libfuse/sshfs" PKG_URL="https://github.com/libfuse/sshfs/releases/download/sshfs-${PKG_VERSION}/sshfs-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain fuse3 glib" PKG_LONGDESC="A filesystem client based on the SSH File Transfer Protocol." PKG_BUILD_FLAGS="-sysroot" ================================================ FILE: packages/addons/addon-depends/network-tools-depends/tcpdump/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tcpdump" PKG_VERSION="4.99.3" PKG_SHA256="ad75a6ed3dc0d9732945b2e5483cb41dc8b4b528a169315e499c6861952e73b3" PKG_SITE="https://www.tcpdump.org/" PKG_URL="https://www.tcpdump.org/release/tcpdump-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libpcap libtirpc" PKG_LONGDESC="A program that allows you to dump the traffic on a network." PKG_BUILD_FLAGS="-sysroot" # use configure, not cmake. review cmake in future release. PKG_TOOLCHAIN="configure" PKG_CONFIGURE_OPTS_TARGET="--with-crypto=no" pre_configure_target() { # When cross-compiling, configure can't set linux version # forcing it sed -i -e 's/ac_cv_linux_vers=unknown/ac_cv_linux_vers=2/' ../configure CFLAGS+=" -I${SYSROOT_PREFIX}/usr/include/tirpc" LDFLAGS+=" -ltirpc" } post_configure_target() { # discard native system includes sed -i "s%-I/usr/include%%g" Makefile } ================================================ FILE: packages/addons/addon-depends/network-tools-depends/udpxy/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="udpxy" PKG_VERSION="1.0-25.1" PKG_SHA256="a1a16e60895c6b2fd151321db47f5d5373843116f1b98ed9749e6c25a6c44497" PKG_LICENSE="GPLv3" PKG_SITE="http://www.udpxy.com" PKG_URL="https://github.com/pcherenkov/udpxy/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A UDP-to-HTTP multicast traffic relay daemon." PKG_BUILD_FLAGS="-sysroot" PKG_MAKEINSTALL_OPTS_TARGET="PREFIX=/usr" post_unpack() { mv ${PKG_BUILD}/README ${PKG_BUILD}/README- mv ${PKG_BUILD}/chipmunk/* ${PKG_BUILD} rmdir ${PKG_BUILD}/chipmunk } configure_target() { export CFLAGS+=" -Wno-stringop-truncation" } ================================================ FILE: packages/addons/addon-depends/network-tools-depends/wireless_tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="wireless_tools" PKG_VERSION="30.pre9" PKG_SHA256="abd9c5c98abf1fdd11892ac2f8a56737544fe101e1be27c6241a564948f34c63" PKG_LICENSE="GPL" PKG_SITE="https://github.com/HewlettPackard/wireless-tools" PKG_URL="https://hewlettpackard.github.io/wireless-tools/${PKG_NAME}.${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="The Wireless Tools (WT) is a set of tools allowing to manipulate the Wireless Extensions." PKG_BUILD_FLAGS="-sysroot" make_target() { make PREFIX=/usr CC="${CC}" AR="${AR}" \ CFLAGS="${CFLAGS}" CPPFLAGS="${CPPFLAGS}" iwmulticall } makeinstall_target() { make PREFIX=${INSTALL}/usr install-iwmulticall } ================================================ FILE: packages/addons/addon-depends/opus/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="opus" PKG_VERSION="1.4" PKG_SHA256="c9b32b4253be5ae63d1ff16eea06b94b5f0f2951b7a02aceef58e3a3ce49c51f" PKG_LICENSE="BSD" PKG_SITE="http://www.opus-codec.org" PKG_URL="https://github.com/xiph/opus/releases/download/v${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Codec designed for interactive speech and audio transmission over the Internet." PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="+pic" if [ "${TARGET_ARCH}" = "arm" ]; then PKG_FIXED_POINT="--enable-fixed-point" else PKG_FIXED_POINT="--disable-fixed-point" fi PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared \ ${PKG_FIXED_POINT}" ================================================ FILE: packages/addons/addon-depends/pcsc-lite/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pcsc-lite" PKG_VERSION="1.9.9" PKG_SHA256="cbcc3b34c61f53291cecc0d831423c94d437b188eb2b97b7febc08de1c914e8a" PKG_LICENSE="GPL" PKG_SITE="https://pcsclite.apdu.fr" PKG_URL="https://pcsclite.apdu.fr/files/pcsc-lite-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libusb" PKG_LONGDESC="Middleware to access a smart card using SCard API (PC/SC)." PKG_CONFIGURE_OPTS_TARGET="--disable-shared \ --enable-static \ --disable-libudev \ --enable-libusb \ --enable-usbdropdir=/storage/.kodi/addons/service.pcscd/drivers" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/addons/addon-depends/pngquant/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pngquant" PKG_VERSION="2.18.0" PKG_SHA256="e72194b52b36f040deaec49a1ddd5dcd8d4feecc3a5fe6c5e9589a9707b233d4" PKG_LICENSE="GPLv3" PKG_SITE="https://pngquant.org" PKG_URL="https://pngquant.org/pngquant-${PKG_VERSION}-src.tar.gz" PKG_DEPENDS_HOST="toolchain:host libpng:host zlib:host" PKG_LONGDESC="A lossy PNG compressor." configure_host() { : } make_host() { cd ${PKG_BUILD} BIN=${PKG_BUILD}/pngquant make ${STRIP} ${PKG_BUILD}/pngquant } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp ${PKG_BUILD}/pngquant ${TOOLCHAIN}/bin } ================================================ FILE: packages/addons/addon-depends/protobuf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="protobuf" PKG_VERSION="3.14.0" PKG_SHA256="50ec5a07c0c55d4ec536dd49021f2e194a26bfdbc531d03d1e9d4d3e27175659" PKG_LICENSE="OSS" PKG_SITE="https://developers.google.com/protocol-buffers/" PKG_URL="https://github.com/google/${PKG_NAME}/releases/download/v${PKG_VERSION}/${PKG_NAME}-cpp-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host zlib:host" PKG_DEPENDS_TARGET="toolchain zlib protobuf:host" PKG_LONGDESC="Protocol Buffers for Google's data interchange format." PKG_CMAKE_OPTS_HOST="-DCMAKE_NO_SYSTEM_FROM_IMPORTED=1 \ -DBUILD_SHARED_LIBS=0 \ -Dprotobuf_BUILD_TESTS=0 \ -Dprotobuf_BUILD_EXAMPLES=0 \ -Dprotobuf_WITH_ZLIB=1" PKG_CMAKE_OPTS_TARGET="${PKG_CMAKE_OPTS_HOST}" configure_package() { PKG_CMAKE_SCRIPT="${PKG_BUILD}/cmake/CMakeLists.txt" } post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin # HACK: we have protoc in ${TOOLCHAIN}/bin but it seems # the one from sysroot prefix is picked when building hyperion. remove it! rm -f ${SYSROOT_PREFIX}/usr/bin/protoc } ================================================ FILE: packages/addons/addon-depends/qtbase/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Lukas Rusak (lrusak@libreelec.tv) # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="qtbase" PKG_VERSION="5.14.0" PKG_SHA256="4ef921c0f208a1624439801da8b3f4344a3793b660ce1095f2b7f5c4246b9463" PKG_LICENSE="GPL" PKG_SITE="http://qt-project.org" PKG_URL="http://download.qt.io/archive/qt/${PKG_VERSION%.*}/${PKG_VERSION}/submodules/${PKG_NAME}-everywhere-src-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="freetype libjpeg-turbo libpng openssl sqlite zlib" PKG_LONGDESC="A cross-platform application and UI framework." PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="-prefix /usr -sysroot "${SYSROOT_PREFIX}" -hostprefix "${TOOLCHAIN}" -device linux-libreelec-g++ -opensource -confirm-license -release -optimize-size -strip -static -silent -force-pkg-config -make libs -no-dbus -no-accessibility -no-glib -no-iconv -no-icu -qt-pcre -system-zlib -no-zstd -openssl-linked -no-libproxy -no-cups -no-fontconfig -system-freetype -no-harfbuzz -no-opengl -no-egl -no-eglfs -no-gbm -no-kms -no-linuxfb -no-xcb -no-feature-vnc -no-feature-sessionmanager -no-feature-easingcurve -no-feature-effects -no-feature-gestures -no-feature-itemmodel -no-libudev -no-evdev -no-libinput -no-mtdev -no-tslib -no-xkbcommon -no-gif -no-ico -system-libpng -system-libjpeg -no-sql-mysql -system-sqlite" configure_target() { QMAKE_CONF_DIR="mkspecs/devices/linux-libreelec-g++" cd .. mkdir -p ${QMAKE_CONF_DIR} cat >"${QMAKE_CONF_DIR}/qmake.conf" <"${QMAKE_CONF_DIR}/qplatformdefs.h" < Date: Tue, 14 Jan 2020 21:35:57 +0000 Subject: [PATCH] use sysroot path for pkgconfig and libtool --- mkspecs/features/qt_module.prf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mkspecs/features/qt_module.prf b/mkspecs/features/qt_module.prf index 828a9621b9..0f3472fffc 100644 --- a/mkspecs/features/qt_module.prf +++ b/mkspecs/features/qt_module.prf @@ -275,12 +275,12 @@ load(qt_targets) host_build: \ QMAKE_PKGCONFIG_LIBDIR = $$[QT_HOST_LIBS] else: \ - QMAKE_PKGCONFIG_LIBDIR = $$[QT_INSTALL_LIBS/raw] + QMAKE_PKGCONFIG_LIBDIR = $$[QT_INSTALL_LIBS] lib_bundle { - QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_LIBS/raw]/$${MODULE_INCNAME}.framework/Headers + QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_LIBS]/$${MODULE_INCNAME}.framework/Headers QMAKE_PKGCONFIG_CFLAGS = -D$$MODULE_DEFINE } else { - QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_HEADERS/raw] + QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_HEADERS] QMAKE_PKGCONFIG_CFLAGS = -D$$MODULE_DEFINE -I${includedir}/$$MODULE_INCNAME for(inc, MODULE_AUX_INCLUDES): \ QMAKE_PKGCONFIG_CFLAGS += -I${includedir}/$$section(inc, /, 1, 1) @@ -308,7 +308,7 @@ load(qt_targets) host_build: \ QMAKE_LIBTOOL_LIBDIR = $$[QT_HOST_LIBS] else: \ - QMAKE_LIBTOOL_LIBDIR = "=$$[QT_INSTALL_LIBS/raw]" + QMAKE_LIBTOOL_LIBDIR = "=$$[QT_INSTALL_LIBS]" !isEmpty(lib_replace0.match) { ltlib_replace0.match = $$lib_replace0.match ltlib_replace0.replace = $$QMAKE_LIBTOOL_LIBDIR/ -- 2.17.1 ================================================ FILE: packages/addons/addon-depends/qtbase/patches/qtbase-0002-fix-build-with-gcc-11.patch ================================================ From 0afad46bb71b106780dd641de768a81d9f6c6a51 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 18 Jan 2021 07:40:54 -0800 Subject: Fix build with GCC 11: include Fixes: QTBUG-90395 Change-Id: Iecc74d2000eb40dfbe7bfffd165b5dd3708b7a40 Reviewed-by: Edward Welbourne (cherry picked from commit 9c56d4da2ff631a8c1c30475bd792f6c86bda53c) Reviewed-by: Andy Shaw --- src/corelib/global/qendian.h | 4 +++- src/corelib/global/qfloat16.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/corelib/global/qendian.h b/src/corelib/global/qendian.h index 2fe29e4338..3abd6a000c 100644 --- a/src/corelib/global/qendian.h +++ b/src/corelib/global/qendian.h @@ -44,6 +44,8 @@ #include #include +#include + // include stdlib.h and hope that it defines __GLIBC__ for glibc-based systems #include #include diff --git a/src/corelib/global/qfloat16.h b/src/corelib/global/qfloat16.h index 5b369bf3c5..6c52c94466 100644 --- a/src/corelib/global/qfloat16.h +++ b/src/corelib/global/qfloat16.h @@ -43,6 +43,7 @@ #include #include +#include #include #if defined(QT_COMPILER_SUPPORTS_F16C) && defined(__AVX2__) && !defined(__F16C__) -- cgit v1.2.1 ================================================ FILE: packages/addons/addon-depends/qtbase/patches/qtbase-0003-More-build-fixes-for-GCC-11.patch ================================================ From 8bcf1828f4d75606fb8d6913dfe09e2363a06cac Mon Sep 17 00:00:00 2001 From: Ville Voutilainen Date: Mon, 18 Jan 2021 09:58:17 +0200 Subject: [PATCH 002/132] Build fixes for GCC 11 Task-number: QTBUG-89977 Change-Id: Ic1b7ddbffb8a0a00f8c621d09a868f1d94a52c21 Reviewed-by: Lars Knoll Reviewed-by: Thiago Macieira (cherry picked from commit 813a928c7c3cf98670b6043149880ed5c955efb9) --- src/corelib/text/qbytearraymatcher.h | 2 ++ src/corelib/tools/qsharedpointer_impl.h | 3 --- src/plugins/platforms/xcb/qxcbwindow.cpp | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/corelib/text/qbytearraymatcher.h b/src/corelib/text/qbytearraymatcher.h index 0eedfc1d20..f5f9bef7b8 100644 --- a/src/corelib/text/qbytearraymatcher.h +++ b/src/corelib/text/qbytearraymatcher.h @@ -42,6 +42,8 @@ #include +#include + QT_BEGIN_NAMESPACE diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index 790c187cb9..4aee98af53 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -155,9 +155,6 @@ namespace QtSharedPointer { #endif inline void checkQObjectShared(...) { } inline void setQObjectShared(...) { } - - inline void operator delete(void *ptr) { ::operator delete(ptr); } - inline void operator delete(void *, void *) { } }; // sizeof(ExternalRefCountData) = 12 (32-bit) / 16 (64-bit) diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 9e7e1a5572..f0866a90ac 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -698,7 +698,7 @@ void QXcbWindow::show() if (isTransient(window())) { const QWindow *tp = window()->transientParent(); if (tp && tp->handle()) - transientXcbParent = static_cast(tp->handle())->winId(); + transientXcbParent = tp->handle()->winId(); // Default to client leader if there is no transient parent, else modal dialogs can // be hidden by their parents. if (!transientXcbParent) -- 2.35.1 ================================================ FILE: packages/addons/addon-depends/rpi-tools-depends/RPi.GPIO/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="RPi.GPIO" PKG_VERSION="0.7.1" PKG_SHA256="cd61c4b03c37b62bba4a5acfea9862749c33c618e0295e7e90aa4713fb373b70" PKG_ARCH="arm" PKG_LICENSE="MIT" PKG_SITE="https://sourceforge.net/projects/raspberry-gpio-python/" PKG_URL="https://files.pythonhosted.org/packages/source/${PKG_NAME:0:1}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="A module to control Raspberry Pi GPIO channels." PKG_TOOLCHAIN="manual" pre_configure_target() { export PYTHONXCPREFIX="${SYSROOT_PREFIX}/usr" export LDSHARED="${CC} -shared" export CFLAGS="${CFLAGS} -fcommon" export CPPFLAGS="${TARGET_CPPFLAGS} -I${SYSROOT_PREFIX}/usr/include/${PKG_PYTHON_VERSION}" } make_target() { python3 setup.py build } ================================================ FILE: packages/addons/addon-depends/rpi-tools-depends/colorzero/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="colorzero" PKG_VERSION="2.0" PKG_SHA256="86c9933b004aec8ce1c476d1d1129e00325c7724df3c09aa353d5f8e883ed08d" PKG_ARCH="arm" PKG_LICENSE="BSD" PKG_SITE="https://github.com/waveform80/colorzero" PKG_URL="https://github.com/waveform80/colorzero/archive/release-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Another color manipulation library for Python (originally from picamera)." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/rpi-tools-depends/gpiozero/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="gpiozero" PKG_VERSION="1.6.2" PKG_SHA256="0eb95a9db372146813276f92de7f43c883a3e9fe69597fc3d29c04ef3d5d5f9e" PKG_ARCH="arm" PKG_LICENSE="BSD" PKG_SITE="https://github.com/RPi-Distro/python-gpiozero" PKG_URL="https://files.pythonhosted.org/packages/source/${PKG_NAME:0:1}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain colorzero" PKG_LONGDESC="A simple interface to everyday GPIO components used with Raspberry Pi." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/rpi-tools-depends/lan951x-led-ctl/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="lan951x-led-ctl" PKG_VERSION="1.0" PKG_SHA256="27d607d3c5c7b142681dcd9fd0afecb7fcb052abfaffc330b28906f782e602f3" PKG_ARCH="arm" PKG_LICENSE="GPL" PKG_SITE="https://familie-radermacher.ch/dominic/computer/raspberry-pi/lan951x-led-ctl/" PKG_URL="https://mockmoon-cybernetics.ch/cgi/cgit/lan951x-led-ctl.git/snapshot/lan951x-led-ctl-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libusb" PKG_LONGDESC="Control LEDs connected to LAN9512/LAN9514 ethernet USB controllers." PKG_TOOLCHAIN="manual" make_target() { ${CC} -std=c11 -I./include -Wall -Wstrict-prototypes -Wconversion \ -Wmissing-prototypes -Wshadow -Wextra -Wunused \ ${CFLAGS} -lusb-1.0 ${LDFLAGS} -o lan951x-led-ctl src/lan951x-led-ctl.c ${STRIP} lan951x-led-ctl } ================================================ FILE: packages/addons/addon-depends/rpi_ws281x/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rpi_ws281x" PKG_VERSION="6c5ade93d1af78cd19e60ee5ecc34adfd111b186" PKG_SHA256="e8fb94429edc21cfd894548755a417eb5b2e121329f4b54270cfb3f727696e21" PKG_LICENSE="BSD-3c" PKG_SITE="https://github.com/hyperion-project/rpi_ws281x" PKG_URL="https://github.com/hyperion-project/rpi_ws281x/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Userspace Raspberry Pi PWM library for WS281X LEDs." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/rsyslog-depends/libestr/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libestr" PKG_VERSION="0.1.11" PKG_SHA256="46b53b80f875fd82981d927a45f0c9df9d17ee1d0e29efab76aaa9cd54a46bb4" PKG_LICENSE="GPL" PKG_SITE="http://libestr.adiscon.com" PKG_URL="https://github.com/rsyslog/libestr/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_TOOLCHAIN="autotools" PKG_LONGDESC="Some essentials for string handling." PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared \ ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes" ================================================ FILE: packages/addons/addon-depends/rsyslog-depends/libfastjson/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libfastjson" PKG_VERSION="1.2304.0" PKG_SHA256="ef30d1e57a18ec770f90056aaac77300270c6203bbe476f4181cc83a2d5dc80c" PKG_LICENSE="GPL" PKG_SITE="https://www.rsyslog.com/tag/libfastjson" PKG_URL="https://download.rsyslog.com/libfastjson/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A fast json library for C." PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared \ ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes" ================================================ FILE: packages/addons/addon-depends/rsyslog-depends/liblogging/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="liblogging" PKG_VERSION="1.0.6" PKG_SHA256="338c6174e5c8652eaa34f956be3451f7491a4416ab489aef63151f802b00bf93" PKG_LICENSE="GPL" PKG_SITE="http://www.liblogging.org" PKG_URL="https://download.rsyslog.com/liblogging/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain systemd" PKG_LONGDESC="An easy to use and lightweight signal-safe logging library." PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared \ --disable-man-pages \ ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes" ================================================ FILE: packages/addons/addon-depends/rsyslog-depends/liblognorm/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="liblognorm" PKG_VERSION="2.0.6" PKG_SHA256="594ea3318ef419cb7f21cf81c513db35a838b32207999a11a82b709da9ff9a2b" PKG_LICENSE="GPL" PKG_SITE="https://www.liblognorm.com" PKG_URL="https://github.com/rsyslog/liblognorm/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libestr libfastjson" PKG_TOOLCHAIN="autotools" PKG_LONGDESC="A fast samples-based log normalization library." PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared \ ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes" ================================================ FILE: packages/addons/addon-depends/rsyslog-depends/librelp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="librelp" PKG_VERSION="1.11.0" PKG_SHA256="7719b5f31e07cbb9872289ad32b787c613b5355d407982a0a2c4d69938457fd6" PKG_LICENSE="GPL" PKG_SITE="https://www.rsyslog.com/category/librelp/" PKG_URL="https://download.rsyslog.com/librelp/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Provides reliable event logging over the network." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared \ --disable-tls \ ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes" ================================================ FILE: packages/addons/addon-depends/runc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Lukas Rusak (lrusak@libreelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="runc" PKG_VERSION="1.1.7" PKG_SHA256="f1885d6dfa188f8112328ac2355e5d67346174a2e2e795ec514a972bcbfcc2fa" PKG_LICENSE="APL" PKG_SITE="https://github.com/opencontainers/runc" PKG_URL="https://github.com/opencontainers/runc/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain go:host libseccomp" PKG_LONGDESC="A CLI tool for spawning and running containers according to the OCI specification." PKG_TOOLCHAIN="manual" # Git commit of the matching release https://github.com/opencontainers/runc/releases PKG_GIT_COMMIT="6724737f999df9ee0d8ca5c6d7b81f97adc34374" pre_make_target() { go_configure export LDFLAGS="-w -extldflags -static -X main.gitCommit=${PKG_GIT_COMMIT} -X main.version=$(cat ./VERSION) -extld ${CC}" export PKG_CONFIG_PATH="$(get_install_dir libseccomp)/usr/lib/pkgconfig:${PKG_CONFIG_PATH}" mkdir -p ${GOPATH} if [ -d ${PKG_BUILD}/vendor ]; then mv ${PKG_BUILD}/vendor ${GOPATH}/src fi ln -fs ${PKG_BUILD} ${GOPATH}/src/github.com/opencontainers/runc } make_target() { mkdir -p bin ${GOLANG} build -v -o bin/runc -a -tags "cgo seccomp static_build" -ldflags "${LDFLAGS}" ./ } ================================================ FILE: packages/addons/addon-depends/sdlgamecontrollerdb/package.mk ================================================ # SPDX-License-Identifier: GPL-3.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="sdlgamecontrollerdb" PKG_VERSION="adf7ec1edfc0371ebf5fb469b61f301b8e26ec81" PKG_SHA256="efe9e6f98e4a635e8d0dc8634bd80b409efae7d45b100179018c9c31d119a857" PKG_ARCH="any" PKG_LICENSE="zlib" PKG_SITE="https://github.com/gabomdq/SDL_GameControllerDB" PKG_URL="https://github.com/gabomdq/SDL_GameControllerDB/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="" PKG_SHORTDESC="SDL2 game controller mappings database" PKG_LONGDESC="A community sourced database of game controller mappings to be used with SDL2 Game Controller functionality." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/addons/addon-depends/snapcast-depends/aixlog/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="aixlog" PKG_VERSION="1.5.0" PKG_SHA256="c32b2b2e7ed2632fab53aba01f731fce1e7b150fe7d08bccdafc250e5cb836a8" PKG_LICENSE="MIT" PKG_SITE="https://github.com/badaix/aixlog" PKG_URL="https://github.com/badaix/aixlog/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Header-only C++ logging library." PKG_BUILD_FLAGS="-sysroot" PKG_CMAKE_OPTS_TARGET="-DBUILD_EXAMPLE=OFF" ================================================ FILE: packages/addons/addon-depends/snapcast-depends/alsa-plugins/package.mk ================================================ # 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) PKG_NAME="alsa-plugins" PKG_VERSION="1.2.7.1" PKG_SHA256="8c337814954bb7c167456733a6046142a2931f12eccba3ec2a4ae618a3432511" PKG_LICENSE="GPL" PKG_SITE="http://www.alsa-project.org/" PKG_URL="ftp://ftp.alsa-project.org/pub/plugins/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain alsa-lib" PKG_LONGDESC="Alsa plugins." if [ "${PULSEAUDIO_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" pulseaudio" SUBDIR_PULSEAUDIO="pulse" fi PKG_CONFIGURE_OPTS_TARGET="--with-plugindir=/usr/lib/alsa" PKG_MAKE_OPTS_TARGET="SUBDIRS=${SUBDIR_PULSEAUDIO}" PKG_MAKEINSTALL_OPTS_TARGET="SUBDIRS=${SUBDIR_PULSEAUDIO}" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/addons/addon-depends/snapcast-depends/asio/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="asio" PKG_VERSION="1.28.0" PKG_SHA256="5c2af07ef73b42a2d48e34c0ecbf41cd40dc823bc681bf5833c129384999c963" PKG_LICENSE="BSL" PKG_SITE="http://think-async.com/Asio" PKG_URL="https://github.com/chriskohlhoff/asio/archive/asio-${PKG_VERSION//./-}.zip" PKG_SOURCE_DIR="asio-asio-${PKG_VERSION//./-}" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Asio C++ Library." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--without-boost --without-openssl" configure_package() { PKG_CONFIGURE_SCRIPT="${PKG_BUILD}/asio/configure" } ================================================ FILE: packages/addons/addon-depends/snapcast-depends/libsodium/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libsodium" PKG_VERSION="e2bd4024008c73f1c0402e1c2f4db9a2300e9c95" # 1.0.18-stable 2022-09-24 PKG_SHA256="b5035fcc061e410291baded4098a3ab56da90eb7d47d82ba2d0e05e3d105b8f6" PKG_LICENSE="ISC" PKG_SITE="https://libsodium.org/" PKG_URL="https://github.com/jedisct1/libsodium/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A modern, portable, easy to use crypto library" PKG_CONFIGURE_OPTS_TARGET="--disable-shared" ================================================ FILE: packages/addons/addon-depends/snapcast-depends/nqptp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nqptp" PKG_VERSION="1.2.1" PKG_SHA256="fab700572961ca81addb405e8bd4bd57c47259f91e7e8e0f5f82240c38c63ce5" PKG_LICENSE="GPL-2.0" PKG_SITE="https://github.com/mikebrady/nqptp" PKG_URL="https://github.com/mikebrady/nqptp/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Not Quite PTP" PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--with-systemd-startup" ================================================ FILE: packages/addons/addon-depends/snapcast-depends/popl/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="popl" PKG_VERSION="1.3.0" PKG_SHA256="7c59554371da3c6c093bd79c2f403f921c1938bd523f1a48682352e0d92883a6" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/badaix/popl" PKG_URL="https://github.com/badaix/popl/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Header-only C++ program options parser library." PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="-sysroot" makeinstall_target() { mkdir -p ${INSTALL}/usr/include cp -p ${PKG_BUILD}/include/popl.hpp ${INSTALL}/usr/include } ================================================ FILE: packages/addons/addon-depends/snapcast-depends/shairport-sync/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="shairport-sync" PKG_VERSION="4.2" PKG_SHA256="649d95eede8b9284b2e8b9c97d18c1c64cffae0a6c75bc4f03e3ae494a3e25b6" PKG_LICENSE="OSS" PKG_SITE="https://github.com/mikebrady/shairport-sync" PKG_URL="https://github.com/mikebrady/shairport-sync/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain alsa-lib avahi ffmpeg libconfig libdaemon libgcrypt libplist libsndfile libsodium nqptp openssl popt pulseaudio soxr util-linux xxd:host" PKG_LONGDESC="AirPlay audio player." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--with-alsa \ --with-avahi \ --with-convolution \ --with-metadata \ --with-pa \ --with-pipe \ --with-pkg-config \ --with-soxr \ --with-ssl=openssl \ --with-stdout \ --without-configfiles \ --with-airplay-2" ================================================ FILE: packages/addons/addon-depends/snapcast-depends/snapcast/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="snapcast" PKG_VERSION="0.27.0" PKG_SHA256="c662c6eafbaa42a4797a4ed6ba4a7602332abf99f6ba6ea88ff8ae59978a86ba" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/badaix/snapcast" PKG_URL="https://github.com/badaix/snapcast/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain aixlog alsa-lib asio avahi flac libvorbis popl pulseaudio boost opus" PKG_LONGDESC="Synchronous multi-room audio player." PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="-sysroot" pre_configure_target() { cd .. rm -rf .${TARGET_NAME} CXXFLAGS="${CXXFLAGS} -pthread \ -I$(get_install_dir aixlog)/usr/include \ -I$(get_install_dir asio)/usr/include \ -I$(get_install_dir popl)/usr/include" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -p server/snapserver client/snapclient ${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/snapcast-depends/snapcast/patches/snapcast-01_makefiles.patch ================================================ --- snapcast-0.14.0/client/Makefile 2018-04-27 19:43:25.000000000 +0200 +++ snapcast-0.14.0.makefiles/client/Makefile 2018-05-21 13:14:12.388757526 +0200 @@ -83,7 +83,6 @@ else -CXX = g++ CXXFLAGS += -pthread -DHAS_VORBIS -DHAS_ALSA -DHAS_PULSE -DHAS_AVAHI -DHAS_DAEMON -LDFLAGS += -lrt -lasound -lpulse -lvorbis -lavahi-client -lavahi-common -latomic +LDFLAGS += -lrt -lasound -lpulse -lvorbis -lavahi-client -lavahi-common -logg OBJ += ../common/daemon.o player/alsa_player.o player/pulse_player.o browseZeroConf/browse_avahi.o diff -Naur snapcast-0.14.0/server/Makefile snapcast-0.14.0.makefiles/server/Makefile --- snapcast-0.14.0/server/Makefile 2018-04-27 19:43:25.000000000 +0200 +++ snapcast-0.14.0.makefiles/server/Makefile 2018-05-21 13:14:56.881206277 +0200 @@ -88,7 +88,6 @@ else -CXX = g++ CXXFLAGS += -DHAS_AVAHI -DHAS_DAEMON -DHAS_ALSA -pthread -LDFLAGS += -lrt -lasound -lavahi-client -lavahi-common -latomic +LDFLAGS += -lrt -lasound -lavahi-client -lavahi-common OBJ += ../common/daemon.o publishZeroConf/publish_avahi.o streamreader/alsa_stream.o ================================================ FILE: packages/addons/addon-depends/snapcast-depends/snapcast/patches/snapcast-02_avahi.patch ================================================ --- a/server/streamreader/airplay_stream.cpp 2021-12-22 17:40:36.000000000 +0000 +++ b/server/streamreader/airplay_stream.cpp 2022-10-03 12:05:31.690039620 +0000 @@ -58,7 +58,7 @@ string devicename = uri_.getQuery("devicename", "Snapcast"); string password = uri_.getQuery("password", ""); - params_wo_port_ = "\"--name=" + devicename + "\" --output=stdout --use-stderr --get-coverart"; + params_wo_port_ = "\"--name=" + devicename + "\" --output=stdout --use-stderr --get-coverart --mdns=avahi"; if (!password.empty()) params_wo_port_ += " --password \"" + password + "\""; if (!params_.empty()) ================================================ FILE: packages/addons/addon-depends/system-tools-depends/autossh/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="autossh" PKG_VERSION="1.4g" PKG_SHA256="5fc3cee3361ca1615af862364c480593171d0c54ec156de79fc421e31ae21277" PKG_LICENSE="GPL" PKG_SITE="http://www.harding.motd.ca/" PKG_URL="http://www.harding.motd.ca/autossh/autossh-${PKG_VERSION}.tgz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Automatically restart SSH sessions and tunnels." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes" pre_configure_target() { export CFLAGS="${CFLAGS} -I." } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -p autossh ${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/bottom/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="bottom" PKG_VERSION="0.9.4" PKG_SHA256="199123ef354bcabaa8a2e3b7b477b324f5b647d503a2599d08296733846eea6e" PKG_LICENSE="MIT" PKG_SITE="https://github.com/ClementTsang/bottom" PKG_URL="https://github.com/ClementTsang/bottom/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain cargo:host" PKG_LONGDESC="A TUI system monitor written in Rust." PKG_TOOLCHAIN="manual" make_target() { cargo build \ --target ${TARGET_NAME} \ --release \ --locked \ --all-features } makeinstall_target() { mkdir -p ${INSTALL} cp ${PKG_BUILD}/.${TARGET_NAME}/target/${TARGET_NAME}/release/btm ${INSTALL} } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/depends/efivar/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="efivar" PKG_VERSION="b920a6ca82250504167066d24aa8731ad29a0de8" # 10 Dec 2021 PKG_SHA256="def327792854bdb5bc442e2907e1871c954e55e33d67045dcd2d2988f8a08afd" PKG_ARCH="x86_64" PKG_LICENSE="LGPL" PKG_SITE="https://github.com/rhboot/efivar" PKG_URL="https://github.com/rhboot/efivar/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain efivar:host" PKG_LONGDESC="Tools and library to manipulate EFI variables." PKG_BUILD_FLAGS="-gold" pre_make_host() { export TOPDIR=${PKG_BUILD} } make_host() { make -C src/ include/efivar/efivar-guids.h } pre_make_target() { sed -e 's/-Werror//' -i src/include/gcc.specs export TOPDIR=${PKG_BUILD} } make_target() { make CROSS_COMPILE=${TARGET_NAME}- -C src/ libefivar.a libefiboot.a efivar.h efivar } makeinstall_host() { : # noop } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib cp -P src/libefivar.a src/libefiboot.a ${SYSROOT_PREFIX}/usr/lib/ mkdir -p ${SYSROOT_PREFIX}/usr/include/efivar cp -P src/include/efivar/*.h ${SYSROOT_PREFIX}/usr/include/efivar } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/depends/efivar/patches/efivar-01-compile-with-glibc-2.36.patch ================================================ --- a/src/util.h 2022-01-14 19:29:35.000000000 +0000 +++ b/src/util.h 2022-07-19 09:43:36.718759307 +0000 @@ -23,7 +23,9 @@ #include #include #include -#include +#define BLKGETSIZE _IO(0x12, 96) /* Return device size. */ +#define BLKSSZGET _IO(0x12,104) /* Get block device sector size. */ +#define BLKGETSIZE64 _IOR(0x12,114,size_t) /* return device size. */ #include #include #include ================================================ FILE: packages/addons/addon-depends/system-tools-depends/depends/efivar/patches/efivar-01-static_lib.patch ================================================ --- a/src/Makefile 2018-10-01 21:30:06.000000000 +0200 +++ b/src/Makefile 2018-10-17 14:16:46.000000000 +0200 @@ -93,7 +93,7 @@ libefivar.so : LIBS=dl libefivar.so : MAP=libefivar.map -efivar : $(EFIVAR_OBJECTS) | libefivar.so +efivar : $(EFIVAR_OBJECTS) | libefivar.a efivar : LIBS=efivar dl efivar-static : $(EFIVAR_OBJECTS) $(patsubst %.o,%.static.o,$(LIBEFIVAR_OBJECTS)) ================================================ FILE: packages/addons/addon-depends/system-tools-depends/depends/libmtp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libmtp" PKG_VERSION="1.1.21" PKG_SHA256="c4ffa5ab8c8f48c91b0047f2e253c101c418d5696a5ed65c839922a4280872a7" PKG_LICENSE="GPL" PKG_SITE="http://libmtp.sourceforge.net/" PKG_URL="${SOURCEFORGE_SRC}/project/${PKG_NAME}/${PKG_NAME}/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libusb" PKG_LONGDESC="An Initiator implementation of the Media Transfer Protocol (MTP)." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="ac_cv_func_malloc_0_nonnull=yes \ --disable-shared \ --enable-static \ --disable-mtpz" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/depends/libmtp/patches/libmtp-0001-dont-execute-compiled-tools.patch ================================================ diff -Naur a/Makefile.am b/Makefile.am --- a/Makefile.am 2015-10-07 00:43:15.000000000 -0700 +++ b/Makefile.am 2016-04-22 14:16:07.656866841 -0700 @@ -11,21 +11,6 @@ if USE_LINUX udevrulesdir=@UDEV@/rules.d hwdbdir=@UDEV@/hwdb.d -udevrules_DATA=@UDEV_RULES@ -hwdb_DATA=69-libmtp.hwdb -noinst_DATA=libmtp.usermap libmtp.fdi - -libmtp.usermap: util/mtp-hotplug - util/mtp-hotplug > libmtp.usermap - -@UDEV_RULES@: util/mtp-hotplug - util/mtp-hotplug -u -p"@UDEV@" @UDEV_GROUP@ @UDEV_MODE@ > @UDEV_RULES@ - -libmtp.fdi: util/mtp-hotplug - util/mtp-hotplug -H > libmtp.fdi - -$(hwdb_DATA): util/mtp-hotplug - util/mtp-hotplug -w > $(hwdb_DATA) CLEANFILES = libmtp.usermap @UDEV_RULES@ libmtp.fdi libmtp.hwdb endif diff -Naur a/Makefile.in b/Makefile.in --- a/Makefile.in 2016-02-10 12:17:34.000000000 -0800 +++ b/Makefile.in 2016-04-22 14:14:22.638794537 -0700 @@ -161,7 +161,7 @@ } am__installdirs = "$(DESTDIR)$(hwdbdir)" "$(DESTDIR)$(pkgconfigdir)" \ "$(DESTDIR)$(udevrulesdir)" -DATA = $(hwdb_DATA) $(noinst_DATA) $(pkgconfig_DATA) $(udevrules_DATA) +DATA = $(pkgconfig_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ @@ -452,21 +452,8 @@ distclean-libtool: -rm -f libtool config.lt -install-hwdbDATA: $(hwdb_DATA) - @$(NORMAL_INSTALL) - @list='$(hwdb_DATA)'; test -n "$(hwdbdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(hwdbdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(hwdbdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(hwdbdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(hwdbdir)" || exit $$?; \ - done +install-hwdbDATA: + echo nope uninstall-hwdbDATA: @$(NORMAL_UNINSTALL) @@ -871,7 +858,7 @@ info-am: -install-data-am: install-hwdbDATA install-pkgconfigDATA \ +install-data-am: install-pkgconfigDATA \ install-udevrulesDATA install-dvi: install-dvi-recursive @@ -932,7 +919,7 @@ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ - install-hwdbDATA install-info install-info-am install-man \ + install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgconfigDATA install-ps \ install-ps-am install-strip install-udevrulesDATA installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ @@ -944,19 +931,6 @@ .PRECIOUS: Makefile - -@USE_LINUX_TRUE@libmtp.usermap: util/mtp-hotplug -@USE_LINUX_TRUE@ util/mtp-hotplug > libmtp.usermap - -@USE_LINUX_TRUE@@UDEV_RULES@: util/mtp-hotplug -@USE_LINUX_TRUE@ util/mtp-hotplug -u -p"@UDEV@" @UDEV_GROUP@ @UDEV_MODE@ > @UDEV_RULES@ - -@USE_LINUX_TRUE@libmtp.fdi: util/mtp-hotplug -@USE_LINUX_TRUE@ util/mtp-hotplug -H > libmtp.fdi - -@USE_LINUX_TRUE@$(hwdb_DATA): util/mtp-hotplug -@USE_LINUX_TRUE@ util/mtp-hotplug -w > $(hwdb_DATA) - # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: ================================================ FILE: packages/addons/addon-depends/system-tools-depends/depends/libssh2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libssh2" PKG_VERSION="1.11.0" PKG_SHA256="3736161e41e2693324deb38c26cfdc3efe6209d634ba4258db1cecff6a5ad461" PKG_LICENSE="BSD" PKG_SITE="https://www.libssh2.org" PKG_URL="https://www.libssh2.org/download/libssh2-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain openssl" PKG_LONGDESC="A library implementing the SSH2 protocol" PKG_BUILD_FLAGS="+pic" PKG_CMAKE_OPTS_TARGET="-DBUILD_EXAMPLES=OFF \ -DBUILD_SHARED_LIBS=OFF \ -DBUILD_TESTING=OFF" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/depends/oniguruma/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="oniguruma" PKG_VERSION="6.9.8" PKG_SHA256="28cd62c1464623c7910565fb1ccaaa0104b2fe8b12bcd646e81f73b47535213e" PKG_LICENSE="BSD" PKG_SITE="https://github.com/kkos/oniguruma" PKG_URL="https://github.com/kkos/oniguruma/releases/download/v${PKG_VERSION}/onig-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A regular expression library" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/diffutils/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="diffutils" PKG_VERSION="3.10" PKG_SHA256="90e5e93cc724e4ebe12ede80df1634063c7a855692685919bfe60b556c9bd09e" PKG_LICENSE="GPL" PKG_SITE="http://www.gnu.org/software/diffutils/" PKG_URL="http://ftpmirror.gnu.org/diffutils/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A package of several programs related to finding differences between files." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--disable-nls \ --without-libsigsegv-prefix \ --without-libiconv-prefix \ --without-libintl-prefix" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/diffutils/patches/diffutils-001-no-man-or-doc.patch ================================================ --- diffutils-3.5/Makefile.am.org 2017-05-24 18:54:09.404508347 +0200 +++ diffutils-3.5/Makefile.am 2017-05-24 18:46:25.238456499 +0200 @@ -19,7 +19,7 @@ ALL_RECURSIVE_TARGETS = EXTRA_DIST = bootstrap exgettext ChangeLog-2008 cfg.mk dist-check.mk -SUBDIRS = lib src tests doc man po gnulib-tests +SUBDIRS = lib src tests po gnulib-tests ACLOCAL_AMFLAGS = -I m4 AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS) ================================================ FILE: packages/addons/addon-depends/system-tools-depends/dool/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2023-present Team LibreELEC (https://libreelec.tv) PKG_NAME="dool" PKG_VERSION="1.2.0" PKG_SHA256="a626ec796a2508443625314e464adec885cb22543157794a6255570b19f68a7d" PKG_LICENSE="GPL-3.0-or-later" PKG_SITE="https://github.com/scottchiefbaker/dool" PKG_URL="https://github.com/scottchiefbaker/dool/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3" PKG_LONGDESC="Python3 compatible clone of dstat" PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="-sysroot" post_unpack() { rm ${PKG_BUILD}/Makefile } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -p dool ${INSTALL}/usr/bin cp -pr plugins ${INSTALL}/usr/bin printf "#!/bin/sh\n\necho \"\${0} has been replaced by dool\"" > ${INSTALL}/usr/bin/dstat chmod 755 ${INSTALL}/usr/bin/dstat } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/dtach/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="dtach" PKG_VERSION="0.9" PKG_SHA256="5f7e8c835ee49a9e6dcf89f4e8ccbe724b061c0fc8565b504dd8b3e67ab79f82" PKG_LICENSE="GPL" PKG_SITE="http://dtach.sourceforge.net" PKG_URL="https://github.com/crigler/dtach/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A program that emulates the detach feature of screen." PKG_BUILD_FLAGS="-sysroot" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -p dtach ${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/efibootmgr/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="efibootmgr" PKG_VERSION="18" PKG_SHA256="442867d12f8525034a404fc8af3036dba8e1fc970998af2486c3b940dfad0874" PKG_ARCH="x86_64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/rhboot/efibootmgr" PKG_URL="https://github.com/rhboot/efibootmgr/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain efivar pciutils zlib" PKG_LONGDESC="Tool to modify UEFI Firmware Boot Manager Variables." PKG_BUILD_FLAGS="-sysroot" make_target() { export CFLAGS="${CFLAGS} -I${SYSROOT_PREFIX}/usr/include -I${SYSROOT_PREFIX}/usr/include/efivar -fgnu89-inline -Wno-pointer-sign" export LDFLAGS="${LDFLAGS} -L${SYSROOT_PREFIX}/usr/lib -ludev -ldl" make EFIDIR=BOOT EFI_LOADER=bootx64.efi PKG_CONFIG=true \ LDLIBS="-lefiboot -lefivar" \ efibootmgr } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -p src/efibootmgr ${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/encfs/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="encfs" PKG_VERSION="1.9.5" PKG_SHA256="4709f05395ccbad6c0a5b40a4619d60aafe3473b1a79bafb3aa700b1f756fd63" PKG_LICENSE="LGPL" PKG_SITE="https://vgough.github.io/encfs/" PKG_URL="https://github.com/vgough/encfs/releases/download/v${PKG_VERSION}/encfs-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain fuse openssl" PKG_LONGDESC="A Encrypted Filesystem for FUSE." PKG_BUILD_FLAGS="-sysroot" PKG_CMAKE_OPTS_TARGET="-DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES=${SYSROOT_PREFIX}/usr/include \ -DBUILD_UNIT_TESTS=OFF \ -DCMAKE_SKIP_RPATH=ON" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/evtest/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="evtest" PKG_VERSION="1.35" PKG_SHA256="a224abeb783561193660999b0c986216d691cb271b5ec3af88c6bb37b55ff51c" PKG_LICENSE="GPL" PKG_SITE="http://cgit.freedesktop.org/evtest/" PKG_URL="https://repo.or.cz/evtest.git/snapshot/evtest-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libxml2" PKG_LONGDESC="A simple tool for input event debugging." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/fdupes/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="fdupes" PKG_VERSION="2.2.1" PKG_SHA256="846bb79ca3f0157856aa93ed50b49217feb68e1b35226193b6bc578be0c5698d" PKG_LICENSE="GPL" PKG_SITE="https://github.com/adrianlopezroche/fdupes" PKG_URL="https://github.com/adrianlopezroche/fdupes/releases/download/v${PKG_VERSION}/fdupes-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ncurses" PKG_LONGDESC="A program for identifying or deleting duplicate files residing within specified directories." PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--without-ncurses" PKG_MAKE_OPTS_TARGET="PREFIX=/usr" PKG_MAKEINSTALL_OPTS_TARGET="${PKG_MAKE_OPTS_TARGET}" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/file/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="file" PKG_VERSION="5.45" PKG_SHA256="28c01a5ef1a127ef71758222ca019ba6c6bfa4a8fe20c2b525ce75943ee9da3c" PKG_LICENSE="BSD" PKG_SITE="http://www.darwinsys.com/file/" PKG_URL="https://github.com/file/file/archive/FILE${PKG_VERSION/./_}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain file:host zlib" PKG_LONGDESC="The file utility is used to determine the types of various files." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_HOST="--enable-fsect-man5 \ --enable-static \ --disable-shared" PKG_CONFIGURE_OPTS_TARGET="${PKG_CONFIGURE_OPTS_HOST}" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/file/patches/file-move-magic.mgc-to-addon-data.patch ================================================ From 1191268f518d298c8617a4a74644ee1bb627f614 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Mon, 25 Aug 2014 15:35:14 +0300 Subject: [PATCH] move magic.mgc to addon/data --- src/magic.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/src/magic.c b/src/magic.c index e4bd12b..59c1456 100644 --- a/src/magic.c +++ b/src/magic.c @@ -100,7 +100,7 @@ get_default_magic(void) if ((home = getenv("HOME")) == NULL) return MAGIC; - if (asprintf(&hmagicpath, "%s/.magic.mgc", home) < 0) + if (asprintf(&hmagicpath, "%s/.kodi/addons/virtual.system-tools/data/magic.mgc", home) < 0) return MAGIC; if (stat(hmagicpath, &st) == -1) { free(hmagicpath); -- 1.7.2.5 ================================================ FILE: packages/addons/addon-depends/system-tools-depends/getscancodes/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="getscancodes" PKG_VERSION="1.0" PKG_SHA256="5f4e2ab22dc3890392ab8870fb79bbebdfd39b34dcd5bafcb51edee554855d34" PKG_LICENSE="GPL" PKG_SITE="http://keytouch.sourceforge.net" PKG_URL="${SOURCEFORGE_SRC}/keytouch/getscancodes-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Shows the scancode of the pressed or released key." PKG_BUILD_FLAGS="-sysroot" pre_configure_target() { PKG_MAKE_OPTS_TARGET="CC=${CC}" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -p getscancodes ${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/hd-idle/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="hd-idle" PKG_VERSION="1.05" PKG_SHA256="4efefe79d145b50e055582730d9d685e485da3df3dad90fef030036d52aa3a0c" PKG_LICENSE="GPL" PKG_SITE="http://hd-idle.sourceforge.net/" PKG_URL="http://downloads.sourceforge.net/project/hd-idle/${PKG_NAME}-${PKG_VERSION}.tgz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A utility for spinning-down external disks after a period of idle time." PKG_BUILD_FLAGS="-sysroot" makeinstall_target() { mkdir -p ${INSTALL}/usr/sbin cp -a ${PKG_BUILD}/hd-idle ${INSTALL}/usr/sbin } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/hd-idle/patches/hd-idle-makefile.patch ================================================ diff --git a/Makefile b/Makefile index 130afd8..480032e 100644 --- a/Makefile +++ b/Makefile @@ -43,8 +43,8 @@ clean: rm -f $(OBJS) $(TARGET) install: $(TARGET) - install -D -g root -o root $(TARGET) $(TARGET_DIR)/sbin/$(TARGET) - install -D -g root -o root $(TARGET).1 $(TARGET_DIR)/share/man/man1/$(TARGET).1 + install -D $(TARGET) $(TARGET_DIR)/sbin/$(TARGET) + install -D $(TARGET).1 $(TARGET_DIR)/share/man/man1/$(TARGET).1 hd-idle.o: hd-idle.c ================================================ FILE: packages/addons/addon-depends/system-tools-depends/hddtemp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="hddtemp" PKG_VERSION="0.4.3" PKG_SHA256="592322c64f0d5f035132249e3d051b752f5d24867514522a17285d5e72d21075" PKG_LICENSE="GPL" PKG_SITE="https://savannah.nongnu.org/projects/hddtemp" PKG_URL="https://github.com/vitlav/hddtemp/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A utility that gives you the temperature of your hard drive by reading S.M.A.R.T.." PKG_BUILD_FLAGS="-sysroot" PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--with-db-path=/storage/.kodi/addons/virtual.system-tools/data/hddtemp.db" post_makeinstall_target() { mkdir -p ${INSTALL}/usr/share/misc cp ${PKG_DIR}/db/* ${INSTALL}/usr/share/misc } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/hddtemp/patches/hddtemp-0001-add-missing-default-Language-PO-header-field.patch ================================================ commit ba91ffb6d96528fa2d449586f0757d1028cdaa6d Author: Rudi Heitbaum Date: Mon Dec 12 11:03:18 2022 +0000 add missing default Language PO header field diff --git a/po/de.po b/po/de.po index 31d02c7..b0d8b7e 100644 --- a/po/de.po +++ b/po/de.po @@ -13,7 +13,7 @@ msgstr "" "PO-Revision-Date: 2011-08-30 16:40+0200\n" "Last-Translator: Vinzenz Vietzke \n" "Language-Team: \n" -"Language: \n" +"Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/po/fr.po b/po/fr.po index 2af6500..433ced0 100644 --- a/po/fr.po +++ b/po/fr.po @@ -12,7 +12,7 @@ msgstr "" "PO-Revision-Date: 2011-08-30 16:38+0200\n" "Last-Translator: Aurelien Jarno \n" "Language-Team: FRANCAIS \n" -"Language: \n" +"Language: fr_FR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/po/hddtemp.pot b/po/hddtemp.pot index 40936d9..a3d9af8 100644 --- a/po/hddtemp.pot +++ b/po/hddtemp.pot @@ -12,6 +12,7 @@ msgstr "" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/po/pt.po b/po/pt.po index 8583dd6..23c0e49 100644 --- a/po/pt.po +++ b/po/pt.po @@ -11,6 +11,7 @@ msgstr "" "PO-Revision-Date: 2006-03-29 23:22+0000\n" "Last-Translator: Miguel Figueiredo \n" "Language-Team: Portuguese \n" +"Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/po/ru.po b/po/ru.po index 3d06da3..7ebceb0 100644 --- a/po/ru.po +++ b/po/ru.po @@ -11,6 +11,7 @@ msgstr "" "PO-Revision-Date: 2003-03-08 16:42+0300\n" "Last-Translator: Michael Shigorin \n" "Language-Team: Russian \n" +"Language: ru_RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=koi8-r\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/po/sv.po b/po/sv.po index d235e52..2729e59 100644 --- a/po/sv.po +++ b/po/sv.po @@ -11,6 +11,7 @@ msgstr "" "PO-Revision-Date: 2005-11-02 19:03+0100\n" "Last-Translator: Daniel Nylander \n" "Language-Team: Swedish \n" +"Language: sv_SV\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/hddtemp/patches/hddtemp-0002-Allow-building-with-gettext-0-20.patch ================================================ commit 12eb958f85084485a4c9768e595c64993996f4a6 Author: Rudi Heitbaum Date: Mon Dec 12 11:16:29 2022 +0000 Allow building with gettext ≥ 0.20 The use of AM_GNU_GETTEXT_VERSION in configure.ac instructs autopoint to copy po/Makefile.in.in from the exact gettext version. It is fine if the version of gettext installed on the system has the same minor version number with the requested version, but it fails if you have a newer version of gettext because of the mismatch between autoconf macros and Makefile.in.in. *** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version 0.19 but the autoconf macros are from gettext version 0.20 Instead of specifying the exact version with AM_GNU_GETTEXT_VERSION, we can use AM_GNU_GETTEXT_REQUIRE_VERSION to ask autopoint to simply use the gettext version installed on the system to prevent the mismatch. This also bumps the version requirement on gettext to 0.19.6 because AM_GNU_GETTEXT_REQUIRE_VERSION was added in this version. diff --git a/configure.ac b/configure.ac index 6729c9f..d9c4128 100644 --- a/configure.ac +++ b/configure.ac @@ -26,7 +26,8 @@ AC_C_CONST AC_STRUCT_TM dnl internationalization macros -AM_GNU_GETTEXT_VERSION([0.18.1]) +AM_GNU_GETTEXT_VERSION([0.19.6]) +AM_GNU_GETTEXT_REQUIRE_VERSION([0.19.6]) AM_GNU_GETTEXT([external]) dnl reasonable guesses for where stuff is installed ================================================ FILE: packages/addons/addon-depends/system-tools-depends/hid_mapper/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="hid_mapper" PKG_VERSION="2.1.0" PKG_SHA256="e740c1f3a99f260f015ea7d415f0419e27171356e2eddff1781fc5d936cc86cd" PKG_LICENSE="GPL" PKG_SITE="https://github.com/s-leroux/hid_mapper" PKG_URL="https://github.com/s-leroux/hid_mapper/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A Generic HID mapper." PKG_BUILD_FLAGS="-sysroot" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -p hid_mapper ${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/hid_mapper/patches/hid_mapper-01_crosscompile.patch ================================================ diff --git a/Makefile b/Makefile index f98abbd..9d1d524 100755 --- a/Makefile +++ b/Makefile @@ -9,13 +9,13 @@ EXEC=hid_mapper VERSION=1.0 all: $(OBJS) - g++ $(LDFLAGS) $(OBJS) -o $(EXEC) + ${CXX} $(LDFLAGS) $(OBJS) -o $(EXEC) %.o: %.cpp - g++ -c $(CPPFLAGS) $< + ${CXX} -c $(CPPFLAGS) $< %.o: %.c - gcc -c $(CFLAGS) $< + ${CC} -c $(CFLAGS) $< deb: cp $(EXEC) package/usr/bin ================================================ FILE: packages/addons/addon-depends/system-tools-depends/hid_mapper/patches/hid_mapper-02_include-sys-time.patch ================================================ diff --git a/hid.c b/hid.c index 2830b58..a652222 100644 --- a/hid.c +++ b/hid.c @@ -22,6 +22,7 @@ #include #include #include +#include #define SYSFS_HIDRAW_CLASS_PATH "/sys/class/hidraw" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/hid_mapper/patches/hid_mapper-03_fix-parser.patch ================================================ --- a/MapReader.cpp +++ b/MapReader.cpp @@ -106,7 +106,10 @@ i = 0; while(i Date: Sun, 10 Aug 2014 14:21:19 +0300 Subject: [PATCH] link static --- prog/sensors/Module.mk | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/prog/sensors/Module.mk b/prog/sensors/Module.mk index b656441..ad59874 100644 --- a/prog/sensors/Module.mk +++ b/prog/sensors/Module.mk @@ -40,7 +40,7 @@ REMOVESENSORSMAN := $(patsubst $(MODULE_DIR)/%,$(DESTDIR)$(PROGSENSORSMAN1DIR)/% LIBICONV := $(shell if /sbin/ldconfig -p | grep -q '/libiconv\.so$$' ; then echo \-liconv; else echo; fi) $(PROGSENSORSTARGETS): $(PROGSENSORSSOURCES:.c=.ro) lib/$(LIBSHBASENAME) - $(CC) $(EXLDFLAGS) -o $@ $(PROGSENSORSSOURCES:.c=.ro) $(LIBICONV) -Llib -lsensors + $(CC) $(EXLDFLAGS) -o $@ $(PROGSENSORSSOURCES:.c=.ro) $(LIBICONV) -Llib -Wl,-Bstatic -lsensors -Wl,-Bdynamic -lm all-prog-sensors: $(PROGSENSORSTARGETS) user :: all-prog-sensors -- 1.7.2.5 ================================================ FILE: packages/addons/addon-depends/system-tools-depends/lshw/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="lshw" PKG_VERSION="02.19.2" PKG_SHA256="9bb347ac87142339a366a1759ac845e3dbb337ec000aa1b99b50ac6758a80f80" PKG_LICENSE="GPL" PKG_SITE="http://ezix.org/project/wiki/HardwareLiSter" PKG_URL="http://ezix.org/software/files/lshw-B.${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A small tool to provide detailed information on the hardware configuration of the machine." PKG_BUILD_FLAGS="-sysroot" make_target() { export VERSION="B.${PKG_VERSION}" make CXX=${CXX} -C src/ } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/mc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mc" PKG_VERSION="4.8.30" PKG_SHA256="5ebc3cb2144b970c5149fda556c4ad50b78780494696cdf2d14a53204c95c7df" PKG_LICENSE="GPL" PKG_SITE="http://www.midnight-commander.org" PKG_URL="http://ftp.midnight-commander.org/mc-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain gettext:host glib libssh2 libtool:host ncurses pcre" PKG_LONGDESC="Midnight Commander is a text based filemanager that emulates Norton Commander." PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET=" \ --datadir=/storage/.kodi/addons/virtual.system-tools/data \ --libexecdir=/storage/.kodi/addons/virtual.system-tools/mclib \ --with-homedir=/storage/.kodi/userdata/addon_data/virtual.system-tools \ --sysconfdir=/storage/.kodi/addons/virtual.system-tools/etc \ --with-screen=ncurses \ --with-sysroot=${SYSROOT_PREFIX} \ --disable-aspell \ --without-diff-viewer \ --disable-doxygen-doc \ --disable-doxygen-dot \ --disable-doxygen-html \ --with-gnu-ld \ --without-libiconv-prefix \ --without-libintl-prefix \ --with-internal-edit \ --disable-mclib \ --with-subshell \ --enable-vfs-extfs \ --enable-vfs-ftp \ --enable-vfs-sftp \ --enable-vfs-tar \ --without-x" pre_configure_target() { LDFLAGS+=" -lcrypto -lssl" } post_makeinstall_target() { rm -rf ${INSTALL}/storage/.kodi/addons/virtual.system-tools/data/locale rm -rf ${INSTALL}/storage/.kodi/addons/virtual.system-tools/data/mc/help/mc.hlp.* mv ${INSTALL}/usr/bin/mc ${INSTALL}/usr/bin/mc-bin rm -f ${INSTALL}/usr/bin/{mcedit,mcview} cp -p ${PKG_DIR}/wrapper/* ${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/mc/wrapper/mc ================================================ #!/bin/sh HISTFILE="/run/mc_histfile" export HISTFILE exec mc-bin "$@" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/mc/wrapper/mcedit ================================================ #!/bin/sh HISTFILE="/run/mc_histfile" export HISTFILE exec mc-bin -e "$@" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/mc/wrapper/mcview ================================================ #!/bin/sh HISTFILE="/run/mc_histfile" export HISTFILE exec mc-bin -v "$@" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/mmc-utils/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mmc-utils" PKG_VERSION="c62dd8e415b12cc7f9a362db23cd384caf77ff03" # 2022-11-09 PKG_SHA256="181ec6a2657f19472672372a80488a624be3e9368176b836404ca29c1405374a" PKG_LICENSE="GPL" PKG_SITE="https://www.kernel.org/doc/html/latest/driver-api/mmc/mmc-tools.html" PKG_URL="https://git.kernel.org/pub/scm/utils/mmc/mmc-utils.git/snapshot/mmc-utils-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Configure MMC storage devices from userspace." PKG_BUILD_FLAGS="-sysroot" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/mtpfs/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mtpfs" PKG_VERSION="d228a21b07062170e05fb71a7a7bf4a74ad559e1" PKG_SHA256="4b89e014201a01634022a6348874361f5ca729e455b8c1f9990fa10647590b52" PKG_LICENSE="GPL" PKG_SITE="https://www.adebenham.com/mtpfs/" PKG_URL="https://github.com/cjd/mtpfs/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain fuse glib libmtp" PKG_LONGDESC="MTPfs is a FUSE filesystem that supports reading and writing from any MTP device." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--disable-mad" # TODO: mtpfs runs host utils while building, fix and set pre_configure_target() { export LIBS="-lusb-1.0 -ludev" } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/nmon/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nmon" PKG_VERSION="16n" PKG_SHA256="c0012cc2d925dee940c37ceae297abac64ba5a5c30e575e7418b04028613f5f2" PKG_LICENSE="GPL" PKG_SITE="http://nmon.sourceforge.net/pmwiki.php?n=Site.CompilingNmon" PKG_URL="http://sourceforge.net/projects/nmon/files/lmon16n.c" PKG_DEPENDS_TARGET="toolchain ncurses" PKG_LONGDESC="Systems administrator, tuner, benchmark tool gives you a huge amount of important performance information in one go." PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="-sysroot" unpack() { mkdir -p ${PKG_BUILD} cp -p ${SOURCES}/nmon/${PKG_SOURCE_NAME} ${PKG_BUILD} } make_target() { case ${ARCH} in x86_64) arch="X86" ;; *) arch="arm" ;; esac # original makefile is located at # - https://downloads.sourceforge.net/project/nmon/makefile CFLAGS+=" -g -O3 -Wall -D JFS -D GETUSER -D LARGEMEM" LDFLAGS+=" -lncurses -lm -g" ${CC} -o nmon nmon-${PKG_VERSION}.c ${CFLAGS} ${LDFLAGS} -D ${arch} -DUBUNTU } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -p nmon ${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/patch/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="patch" PKG_VERSION="2.7.6" PKG_SHA256="ac610bda97abe0d9f6b7c963255a11dcb196c25e337c61f94e4778d632f1d8fd" PKG_LICENSE="GPL" PKG_SITE="http://savannah.gnu.org/projects/patch/" PKG_URL="http://ftpmirror.gnu.org/patch/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Patch takes a patch file containing a difference listing produced by the diff." PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--disable-xattr" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/pv/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pv" PKG_VERSION="1.7.24" PKG_SHA256="3bf43c5809c8d50066eaeaea5a115f6503c57a38c151975b710aa2bee857b65e" PKG_LICENSE="GNU" PKG_SITE="http://www.ivarch.com/programs/pv.shtml" PKG_URL="http://www.ivarch.com/programs/sources/pv-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Pipe Viewer can be inserted into any normal pipeline between two processes." PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--enable-static-nls" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/screen/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="screen" PKG_VERSION="4.9.1" PKG_SHA256="26cef3e3c42571c0d484ad6faf110c5c15091fbf872b06fa7aa4766c7405ac69" PKG_LICENSE="GPL" PKG_SITE="http://www.gnu.org/software/screen/" PKG_URL="http://ftpmirror.gnu.org/screen/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ncurses" PKG_LONGDESC="Screen is a window manager that multiplexes a physical terminal between several processes" PKG_BUILD_FLAGS="-sysroot -parallel" PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="ac_cv_header_utempter_h=no \ --enable-colors256 \ --disable-pam \ --disable-use-locale \ --disable-telnet \ --disable-socket-dir" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/sdparm/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="sdparm" PKG_VERSION="1.12" PKG_SHA256="c4c9efafdbeb662e2f9712707ec490932bd4d010bb1129ae7a99526546eeadbe" PKG_LICENSE="BSD" PKG_SITE="https://sg.danny.cz/sg/sdparm.html" PKG_URL="https://sg.danny.cz/sg/p/sdparm-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="The sdparm utility accesses SCSI device parameters." PKG_BUILD_FLAGS="-sysroot" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/smartmontools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="smartmontools" PKG_VERSION="7.4" PKG_SHA256="e9a61f641ff96ca95319edfb17948cd297d0cd3342736b2c49c99d4716fb993d" PKG_LICENSE="GPL" PKG_SITE="https://www.smartmontools.org" PKG_URL="https://downloads.sourceforge.net/sourceforge/smartmontools/smartmontools-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Control and monitor storage systems using S.M.A.R.T." PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="--prefix=/usr \ --without-initscriptdir \ --without-nvme-devicescan \ --without-systemdenvfile \ --without-systemdsystemunitdir \ --without-systemdenvfile \ --without-systemdsystemunitdir" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/st/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="st" PKG_VERSION="0.9" PKG_SHA256="f36359799734eae785becb374063f0be833cf22f88b4f169cd251b99324e08e7" PKG_ARCH="x86_64" PKG_LICENSE="GPL" PKG_SITE="https://st.suckless.org/" PKG_URL="https://dl.suckless.org/st/st-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libX11 libXft libXrender fontconfig freetype ncurses" PKG_LONGDESC="A simple terminal implementation for X" PKG_BUILD_FLAGS="-sysroot" PKG_MAKE_OPTS_TARGET="X11INC=$(get_build_dir libXft)/include \ X11LIB=$(get_build_dir libXft)/.${TARGET_NAME}/src/.libs" pre_configure_target() { LDFLAGS="-lXrender ${LDFLAGS}" } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/st/patches/st-001-le_fixes.patch ================================================ - XftColorAllocName() is failing on "#rrggbb", use XParseColor() - Xutf8TextListToTextProperty() needs locale to be set. --- a/x.c 2020-06-19 11:29:45.000000000 +0200 +++ b/x.c 2020-06-26 01:07:13.000000000 +0200 @@ -754,6 +754,7 @@ xloadcolor(int i, const char *name, Color *ncolor) { XRenderColor color = { .alpha = 0xffff }; + XColor xcol; if (!name) { if (BETWEEN(i, 16, 255)) { /* 256 color */ @@ -771,6 +772,14 @@ name = colorname[i]; } + if (XParseColor(xw.dpy, xw.cmap, name, &xcol)) { + color.green = xcol.green; + color.blue = xcol.blue; + color.red = xcol.red; + return XftColorAllocValue(xw.dpy, xw.vis, + xw.cmap, &color, ncolor); + } + return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor); } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/st/patches/st-002-scrollback-20200419-72e3f6c.patch ================================================ diff --git a/config.def.h b/config.def.h index 0895a1f..eef24df 100644 --- a/config.def.h +++ b/config.def.h @@ -188,6 +188,8 @@ static Shortcut shortcuts[] = { { TERMMOD, XK_Y, selpaste, {.i = 0} }, { ShiftMask, XK_Insert, selpaste, {.i = 0} }, { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, + { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, + { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, }; /* diff --git a/st.c b/st.c index 0ce6ac2..641edc0 100644 --- a/st.c +++ b/st.c @@ -35,6 +35,7 @@ #define ESC_ARG_SIZ 16 #define STR_BUF_SIZ ESC_BUF_SIZ #define STR_ARG_SIZ ESC_ARG_SIZ +#define HISTSIZE 2000 /* macros */ #define IS_SET(flag) ((term.mode & (flag)) != 0) @@ -42,6 +43,9 @@ #define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f)) #define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c)) #define ISDELIM(u) (u && wcschr(worddelimiters, u)) +#define TLINE(y) ((y) < term.scr ? term.hist[((y) + term.histi - \ + term.scr + HISTSIZE + 1) % HISTSIZE] : \ + term.line[(y) - term.scr]) enum term_mode { MODE_WRAP = 1 << 0, @@ -117,6 +121,9 @@ typedef struct { int col; /* nb col */ Line *line; /* screen */ Line *alt; /* alternate screen */ + Line hist[HISTSIZE]; /* history buffer */ + int histi; /* history index */ + int scr; /* scroll back */ int *dirty; /* dirtyness of lines */ TCursor c; /* cursor */ int ocx; /* old cursor col */ @@ -185,8 +192,8 @@ static void tnewline(int); static void tputtab(int); static void tputc(Rune); static void treset(void); -static void tscrollup(int, int); -static void tscrolldown(int, int); +static void tscrollup(int, int, int); +static void tscrolldown(int, int, int); static void tsetattr(const int *, int); static void tsetchar(Rune, const Glyph *, int, int); static void tsetdirt(int, int); @@ -415,10 +422,10 @@ tlinelen(int y) { int i = term.col; - if (term.line[y][i - 1].mode & ATTR_WRAP) + if (TLINE(y)[i - 1].mode & ATTR_WRAP) return i; - while (i > 0 && term.line[y][i - 1].u == ' ') + while (i > 0 && TLINE(y)[i - 1].u == ' ') --i; return i; @@ -527,7 +534,7 @@ selsnap(int *x, int *y, int direction) * Snap around if the word wraps around at the end or * beginning of a line. */ - prevgp = &term.line[*y][*x]; + prevgp = &TLINE(*y)[*x]; prevdelim = ISDELIM(prevgp->u); for (;;) { newx = *x + direction; @@ -542,14 +549,14 @@ selsnap(int *x, int *y, int direction) yt = *y, xt = *x; else yt = newy, xt = newx; - if (!(term.line[yt][xt].mode & ATTR_WRAP)) + if (!(TLINE(yt)[xt].mode & ATTR_WRAP)) break; } if (newx >= tlinelen(newy)) break; - gp = &term.line[newy][newx]; + gp = &TLINE(newy)[newx]; delim = ISDELIM(gp->u); if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim || (delim && gp->u != prevgp->u))) @@ -570,14 +577,14 @@ selsnap(int *x, int *y, int direction) *x = (direction < 0) ? 0 : term.col - 1; if (direction < 0) { for (; *y > 0; *y += direction) { - if (!(term.line[*y-1][term.col-1].mode + if (!(TLINE(*y-1)[term.col-1].mode & ATTR_WRAP)) { break; } } } else if (direction > 0) { for (; *y < term.row-1; *y += direction) { - if (!(term.line[*y][term.col-1].mode + if (!(TLINE(*y)[term.col-1].mode & ATTR_WRAP)) { break; } @@ -608,13 +615,13 @@ getsel(void) } if (sel.type == SEL_RECTANGULAR) { - gp = &term.line[y][sel.nb.x]; + gp = &TLINE(y)[sel.nb.x]; lastx = sel.ne.x; } else { - gp = &term.line[y][sel.nb.y == y ? sel.nb.x : 0]; + gp = &TLINE(y)[sel.nb.y == y ? sel.nb.x : 0]; lastx = (sel.ne.y == y) ? sel.ne.x : term.col-1; } - last = &term.line[y][MIN(lastx, linelen-1)]; + last = &TLINE(y)[MIN(lastx, linelen-1)]; while (last >= gp && last->u == ' ') --last; @@ -849,6 +856,9 @@ void ttywrite(const char *s, size_t n, int may_echo) { const char *next; + Arg arg = (Arg) { .i = term.scr }; + + kscrolldown(&arg); if (may_echo && IS_SET(MODE_ECHO)) twrite(s, n, 1); @@ -1060,13 +1070,53 @@ tswapscreen(void) } void -tscrolldown(int orig, int n) +kscrolldown(const Arg* a) +{ + int n = a->i; + + if (n < 0) + n = term.row + n; + + if (n > term.scr) + n = term.scr; + + if (term.scr > 0) { + term.scr -= n; + selscroll(0, -n); + tfulldirt(); + } +} + +void +kscrollup(const Arg* a) +{ + int n = a->i; + + if (n < 0) + n = term.row + n; + + if (term.scr <= HISTSIZE-n) { + term.scr += n; + selscroll(0, n); + tfulldirt(); + } +} + +void +tscrolldown(int orig, int n, int copyhist) { int i; Line temp; LIMIT(n, 0, term.bot-orig+1); + if (copyhist) { + term.histi = (term.histi - 1 + HISTSIZE) % HISTSIZE; + temp = term.hist[term.histi]; + term.hist[term.histi] = term.line[term.bot]; + term.line[term.bot] = temp; + } + tsetdirt(orig, term.bot-n); tclearregion(0, term.bot-n+1, term.col-1, term.bot); @@ -1076,17 +1126,28 @@ tscrolldown(int orig, int n) term.line[i-n] = temp; } - selscroll(orig, n); + if (term.scr == 0) + selscroll(orig, n); } void -tscrollup(int orig, int n) +tscrollup(int orig, int n, int copyhist) { int i; Line temp; LIMIT(n, 0, term.bot-orig+1); + if (copyhist) { + term.histi = (term.histi + 1) % HISTSIZE; + temp = term.hist[term.histi]; + term.hist[term.histi] = term.line[orig]; + term.line[orig] = temp; + } + + if (term.scr > 0 && term.scr < HISTSIZE) + term.scr = MIN(term.scr + n, HISTSIZE-1); + tclearregion(0, orig, term.col-1, orig+n-1); tsetdirt(orig+n, term.bot); @@ -1096,7 +1157,8 @@ tscrollup(int orig, int n) term.line[i+n] = temp; } - selscroll(orig, -n); + if (term.scr == 0) + selscroll(orig, -n); } void @@ -1135,7 +1197,7 @@ tnewline(int first_col) int y = term.c.y; if (y == term.bot) { - tscrollup(term.top, 1); + tscrollup(term.top, 1, 1); } else { y++; } @@ -1300,14 +1362,14 @@ void tinsertblankline(int n) { if (BETWEEN(term.c.y, term.top, term.bot)) - tscrolldown(term.c.y, n); + tscrolldown(term.c.y, n, 0); } void tdeleteline(int n) { if (BETWEEN(term.c.y, term.top, term.bot)) - tscrollup(term.c.y, n); + tscrollup(term.c.y, n, 0); } int32_t @@ -1738,11 +1800,11 @@ csihandle(void) break; case 'S': /* SU -- Scroll line up */ DEFAULT(csiescseq.arg[0], 1); - tscrollup(term.top, csiescseq.arg[0]); + tscrollup(term.top, csiescseq.arg[0], 0); break; case 'T': /* SD -- Scroll line down */ DEFAULT(csiescseq.arg[0], 1); - tscrolldown(term.top, csiescseq.arg[0]); + tscrolldown(term.top, csiescseq.arg[0], 0); break; case 'L': /* IL -- Insert blank lines */ DEFAULT(csiescseq.arg[0], 1); @@ -2248,7 +2310,7 @@ eschandle(uchar ascii) return 0; case 'D': /* IND -- Linefeed */ if (term.c.y == term.bot) { - tscrollup(term.top, 1); + tscrollup(term.top, 1, 1); } else { tmoveto(term.c.x, term.c.y+1); } @@ -2261,7 +2323,7 @@ eschandle(uchar ascii) break; case 'M': /* RI -- Reverse index */ if (term.c.y == term.top) { - tscrolldown(term.top, 1); + tscrolldown(term.top, 1, 1); } else { tmoveto(term.c.x, term.c.y-1); } @@ -2482,7 +2544,7 @@ twrite(const char *buf, int buflen, int show_ctrl) void tresize(int col, int row) { - int i; + int i, j; int minrow = MIN(row, term.row); int mincol = MIN(col, term.col); int *bp; @@ -2519,6 +2581,14 @@ tresize(int col, int row) term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); + for (i = 0; i < HISTSIZE; i++) { + term.hist[i] = xrealloc(term.hist[i], col * sizeof(Glyph)); + for (j = mincol; j < col; j++) { + term.hist[i][j] = term.c.attr; + term.hist[i][j].u = ' '; + } + } + /* resize each row to new width, zero-pad if needed */ for (i = 0; i < minrow; i++) { term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); @@ -2577,7 +2647,7 @@ drawregion(int x1, int y1, int x2, int y2) continue; term.dirty[y] = 0; - xdrawline(term.line[y], x1, y, x2); + xdrawline(TLINE(y), x1, y, x2); } } @@ -2598,8 +2668,9 @@ draw(void) cx--; drawregion(0, 0, term.col, term.row); - xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], - term.ocx, term.ocy, term.line[term.ocy][term.ocx]); + if (term.scr == 0) + xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], + term.ocx, term.ocy, term.line[term.ocy][term.ocx]); term.ocx = cx; term.ocy = term.c.y; xfinishdraw(); diff --git a/st.h b/st.h index d978458..b9a4eeb 100644 --- a/st.h +++ b/st.h @@ -81,6 +81,8 @@ void die(const char *, ...); void redraw(void); void draw(void); +void kscrolldown(const Arg *); +void kscrollup(const Arg *); void printscreen(const Arg *); void printsel(const Arg *); void sendbreak(const Arg *); ================================================ FILE: packages/addons/addon-depends/system-tools-depends/stress-ng/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="stress-ng" PKG_VERSION="0.16.04" PKG_SHA256="3453719508e9e02c57a736c154408538372d078be7dcf8e0165d37a821cdba45" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/ColinIanKing/stress-ng" PKG_URL="https://github.com/ColinIanKing/stress-ng/archive/refs/tags/V${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain attr keyutils libaio libcap zlib" PKG_LONGDESC="stress-ng will stress test a computer system in various selectable ways" PKG_BUILD_FLAGS="-sysroot" ================================================ FILE: packages/addons/addon-depends/system-tools-depends/unrar/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="unrar" PKG_VERSION="6.2.10" PKG_SHA256="55fe6ebd5e48d6655bfda3fd19b55438ca05e13c7e69772420caad9fdb68ef42" PKG_LICENSE="free" PKG_SITE="https://www.rarlab.com/rar_add.htm" PKG_URL="https://www.rarlab.com/rar/unrarsrc-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="unrar extract, test and view RAR archives" PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="+pic -sysroot -parallel" unpack() { mkdir -p ${PKG_BUILD}/unrar lib tar -xf ${SOURCES}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz -C ${PKG_BUILD}/ cp -a ${PKG_BUILD}/unrar ${PKG_BUILD}/lib } make_target() { make CXX="${CXX}" \ CXXFLAGS="${TARGET_CXXFLAGS}" \ RANLIB="${RANLIB}" \ AR="${AR}" \ STRIP="${STRIP}" \ -C unrar \ -f makefile make CXX="${CXX}" \ CXXFLAGS="${TARGET_CXXFLAGS}" \ RANLIB="${RANLIB}" \ AR="${AR}" \ -C lib \ -f makefile lib } post_make_target() { rm -f libunrar.so } makeinstall_target() { mkdir -p ${INSTALL}/usr/include/unrar ${INSTALL}/usr/lib ${INSTALL}/usr/bin cp -p lib/*.hpp ${INSTALL}/usr/include/unrar/ cp -p lib/libunrar.a ${INSTALL}/usr/lib/ cp -p unrar/unrar ${INSTALL}/usr/bin/ } ================================================ FILE: packages/addons/addon-depends/system-tools-depends/usb-modeswitch/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="usb-modeswitch" PKG_VERSION="2.6.1" PKG_SHA256="5195d9e136e52f658f19e9f93e4f982b1b67bffac197d0a455cd8c2cd245fa34" PKG_LICENSE="GPL" PKG_SITE="http://www.draisberghof.de/usb_modeswitch/" PKG_URL="http://www.draisberghof.de/usb_modeswitch/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libusb" PKG_LONGDESC="USB_ModeSwitch - Handling Mode-Switching USB Devices on Linux" PKG_BUILD_FLAGS="-sysroot" makeinstall_target() { mkdir -p $INSTALL/usr/sbin cp usb_modeswitch $INSTALL/usr/sbin } ================================================ FILE: packages/addons/addon-depends/tinc-depends/miniupnpc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="miniupnpc" PKG_VERSION="2.2.4" PKG_SHA256="481a5e4aede64e9ef29895b218836c3608d973e77a35b4f228ab1f3629412c4b" PKG_LICENSE="BSD" PKG_SITE="http://miniupnp.free.fr" PKG_URL="http://miniupnp.free.fr/files/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="The MiniUPnP project offers software which supports the UPnP Internet Gateway Device (IGD) specifications" PKG_CMAKE_OPTS_TARGET="-DUPNPC_BUILD_SHARED=OFF -DUPNPC_BUILD_STATIC=ON" ================================================ FILE: packages/addons/addon-depends/tntnet/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tntnet" PKG_VERSION="3.0" PKG_SHA256="718e5519b0a403f7f766358bf66a85c008119c48189d1c2b7651fd0af9018e27" PKG_LICENSE="GPL-2" PKG_SITE="http://www.tntnet.org/" PKG_URL="http://www.tntnet.org/download/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="cxxtools:host zlib:host" PKG_DEPENDS_TARGET="toolchain tntnet:host libtool cxxtools zlib" PKG_LONGDESC="A web application server for C++." PKG_CONFIGURE_OPTS_HOST="--disable-unittest \ --with-server=no \ --with-sdk=yes \ --with-demos=no \ --with-epoll=yes \ --with-ssl=no \ --with-stressjob=no" PKG_CONFIGURE_OPTS_TARGET="--disable-unittest \ --with-sysroot=${SYSROOT_PREFIX} \ --with-server=no \ --with-sdk=no \ --with-demos=no \ --with-epoll=yes \ --with-ssl=no \ --with-stressjob=no" post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin rm -rf ${INSTALL}/usr/share } ================================================ FILE: packages/addons/addon-depends/tslib/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tslib" PKG_VERSION="1.1" PKG_SHA256="fe35e5f710ea933b118f710e2ce4403ac076fe69926b570333867d4de082a51c" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kergoth/tslib" PKG_URL="https://github.com/kergoth/tslib/releases/download/1.1/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain evtest" PKG_LONGDESC="Touchscreen access library with ts_uinput_touch daemon." PKG_TOOLCHAIN="autotools" TSLIB_MODULES_ENABLED="linear dejitter variance pthres ucb1x00 tatung input galax dmc touchkit st1232 waveshare" TSLIB_MODULES_DISABLED="arctic2 corgi collie h3600 linear_h2200 mk712 cy8mrln_palmpre" TSLIB_BUILD_STATIC="yes" # no .so files (easy to manage) pre_configure_target() { local OPTS_MODULES="" if [ "${TSLIB_BUILD_STATIC}" = "yes" ]; then OPTS_MODULES="--enable-static --disable-shared" for module in ${TSLIB_MODULES_ENABLED}; do OPTS_MODULES+=" --enable-${module}=static" done fi for module in ${TSLIB_MODULES_DISABLED}; do OPTS_MODULES+=" --disable-${module}" done PKG_CONFIGURE_OPTS_TARGET="${OPTS_MODULES} \ --sysconfdir=/storage/.kodi/userdata/addon_data/service.touchscreen" } post_makeinstall_target() { rm -fr ${INSTALL}/etc rm -fr ${INSTALL}/storage debug_strip ${INSTALL}/usr/bin } ================================================ FILE: packages/addons/addon-depends/tslib/patches/tslib-02-add-additional-eGalax-touchscreens.patch ================================================ From f60540a1e0c120dfb6a7452470b3e56bee91c7d7 Mon Sep 17 00:00:00 2001 From: Dirk Gerdes Date: Mon, 22 Dec 2014 11:07:13 +0100 Subject: [PATCH] Added support for additional model of eGalax Touchscreen --- plugins/galax-raw.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/galax-raw.c b/plugins/galax-raw.c index c8689e2..6cacc56 100644 --- a/plugins/galax-raw.c +++ b/plugins/galax-raw.c @@ -93,8 +93,9 @@ static int ts_galax_check_fd (struct tslib_galax *i) if ((ioctl(ts->fd, EVIOCGID, &infos) < 0)) { fprintf (stderr, "tslib: warning, can not read device identifier\n"); - } else if (infos.bustype != 3 || infos.vendor != 0x0EEF || infos.product != 0x0001) { - fprintf (stderr, "tslib: this is not an eGalax touchscreen (3,0x0EEF,1,0x0112)\n" + } else if (infos.bustype != 3 || infos.vendor != 0x0EEF + || (infos.product != 0x0001 && infos.product != 0x7200 && infos.product != 0x7201 && infos.product != 0xC000)) { + fprintf (stderr, "tslib: this is not an eGalax touchscreen (3,0x0EEF,1/7200/7201/C000,0x0112)\n" "Your device: bus=%d, vendor=0x%X, product=0x%X, version=0x%X\n",infos.bustype, infos.vendor, infos.product, infos.version); return -1; } ================================================ FILE: packages/addons/addon-depends/tslib/patches/tslib-06-linear-print-coordinates.patch ================================================ diff -aurN a/plugins/linear.c b/plugins/linear.c --- a/plugins/linear.c 2013-08-08 02:23:04.000000000 +0200 +++ b/plugins/linear.c 2015-09-04 20:21:50.376205701 +0200 @@ -187,11 +187,11 @@ for (index = 0; index < 7; index++) if (fscanf(pcal_fd, "%d", &lin->a[index]) != 1) break; fscanf(pcal_fd, "%d %d", &lin->cal_res_x, &lin->cal_res_y); -#ifdef DEBUG +/*#ifdef DEBUG*/ printf("Linear calibration constants: "); for(index=0;index<7;index++) printf("%d ",lin->a[index]); printf("\n"); -#endif /*DEBUG*/ +/*#endif*/ /*DEBUG*/ fclose(pcal_fd); } ================================================ FILE: packages/addons/addon-depends/tslib/patches/tslib-10-ts_uinput_touch-daemon.patch ================================================ From 2ae91258548c3682ad5df16ee22bdf28d9769bfe Mon Sep 17 00:00:00 2001 From: vpeter4 Date: Mon, 29 Jun 2015 17:08:17 +0200 Subject: [PATCH 01/11] ts_uinput_touch: daemon translates tslib events to uinput On one side it gets events from touchscreen using tslib library. On the other end it creates one new virtual device using uinput kernel module that allows to handle the input subsystem from user land. Inside application data from tslib is translated to uinput events. For now only ABS_X, ABS_Y, ABS_PRESSURE and BTN_TOUCH. It behaves in a similar way than touchpad. Short tap sends button press event and long slide sends only xy coordinates. Currently using it in OpenELEC distribution and Kodi application. I think something like this was proposed in TODO. Also ST1232 raw input plugin is included for "st1232-touchscreen" (found on 7" display for Udoo board with i.MX6 SoC). --- configure.ac | 1 + plugins/Makefile.am | 13 +- plugins/plugins.h | 1 + plugins/st1232-raw.c | 303 +++++++++++++++++++++++ src/Makefile.am | 4 + src/ts_load_module.c | 3 + tests/Makefile.am | 5 +- tests/testutils.c | 7 + tests/ts_calibrate.c | 4 + tests/ts_uinput_touch.c | 624 ++++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 963 insertions(+), 2 deletions(-) create mode 100644 plugins/st1232-raw.c create mode 100644 tests/ts_uinput_touch.c diff --git a/configure.ac b/configure.ac index dfdf269..6984002 100644 --- a/configure.ac +++ b/configure.ac @@ -69,6 +69,7 @@ TSLIB_CHECK_MODULE([dmc], [yes], [Enable building of dmc raw module (HP iPaq DMC TSLIB_CHECK_MODULE([input], [yes], [Enable building of generic input raw module (Linux /dev/input/eventN support)]) TSLIB_CHECK_MODULE([touchkit], [yes], [Enable building of serial TouchKit raw module (Linux /dev/ttySX support)]) TSLIB_CHECK_MODULE([galax], [yes], [Enable building of HID USB eGalax raw module (Linux /dev/hiddevN support)]) +TSLIB_CHECK_MODULE([st1232], [yes], [Enable building of ST1232 raw module (Linux /dev/input/eventN support)]) diff --git a/plugins/Makefile.am b/plugins/Makefile.am index e938e17..e8e89e0 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -121,6 +121,12 @@ else CY8MRLN_PALMPRE_MODULE = endif +if ENABLE_ST1232_MODULE +ST1232_MODULE = st1232.la +else +ST1232_MODULE = +endif + pluginexec_LTLIBRARIES = \ $(LINEAR_MODULE) \ $(DEJITTER_MODULE) \ @@ -138,7 +144,8 @@ pluginexec_LTLIBRARIES = \ $(INPUT_MODULE) \ $(GALAX_MODULE) \ $(TOUCHKIT_MODULE) \ - $(CY8MRLN_PALMPRE_MODULE) + $(CY8MRLN_PALMPRE_MODULE) \ + $(ST1232_MODULE) variance_la_SOURCES = variance.c variance_la_LDFLAGS = -module $(LTVSN) @@ -197,3 +204,7 @@ linear_h2200_la_LDFLAGS = -module $(LTVSN) cy8mrln_palmpre_la_SOURCES = cy8mrln-palmpre.c cy8mrln_palmpre_la_LDFLAGS = -module $(LTVSN) + +st1232_la_SOURCES = st1232-raw.c +st1232_la_LDFLAGS = -module $(LTVSN) +st1232_la_LIBADD = $(top_builddir)/src/libts.la diff --git a/plugins/plugins.h b/plugins/plugins.h index 873aba5..d78877e 100644 --- a/plugins/plugins.h +++ b/plugins/plugins.h @@ -16,3 +16,4 @@ TSLIB_DECLARE_MODULE(arctic2); TSLIB_DECLARE_MODULE(tatung); TSLIB_DECLARE_MODULE(input); TSLIB_DECLARE_MODULE(cy8mrln_palmpre); +TSLIB_DECLARE_MODULE(st1232); diff --git a/plugins/st1232-raw.c b/plugins/st1232-raw.c new file mode 100644 index 0000000..f05d21d --- /dev/null +++ b/plugins/st1232-raw.c @@ -0,0 +1,303 @@ +/* + * tslib/plugins/st1232-raw.c + * + * based on input-raw.c + * 2015.06 Peter Vicman + * + * Original version: + * Copyright (C) 2001 Russell King. + * + * Rewritten for the Linux input device API: + * Copyright (C) 2002 Nicolas Pitre + * + * This file is placed under the LGPL. Please see the file + * COPYING for more details. + * + * + * Plugin for "st1232-touchscreen" (found on 7" display for Udoo board with i.MX6 SoC) + * + * Read raw x, y, and timestamp from a touchscreen device. + * Only first mt report is taken and send upstream. + * ST1232 driver doesn't report ABS_X/Y events - only MT - and + * doesn't report BTN_TOUCH event. + * + * In memory of my mom and dad ... + */ +#include "config.h" + +#include +#include +#include + +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include + +#include +#ifndef EV_SYN /* 2.4 kernel headers */ +# define EV_SYN 0x00 +#endif +#ifndef EV_CNT +# define EV_CNT (EV_MAX+1) +#endif +#ifndef ABS_CNT +# define ABS_CNT (ABS_MAX+1) +#endif +#ifndef KEY_CNT +# define KEY_CNT (KEY_MAX+1) +#endif + +#ifndef ABS_MT_POSITION_X +# define ABS_MT_POSITION_X 0x35 /* Center X ellipse position */ +# define ABS_MT_POSITION_Y 0x36 /* Center Y ellipse position */ +#endif + +#define SYN_MT_REPORT 2 + +#include "tslib-private.h" + +#define GRAB_EVENTS_WANTED 1 +#define GRAB_EVENTS_ACTIVE 2 + +struct tslib_input { + struct tslib_module_info module; + + int current_x; + int current_y; + int current_p; + + int sane_fd; + int using_syn; + int grab_events; + int invert_y; +}; + +#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) +#define BIT(nr) (1UL << (nr)) +#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) +#define BIT_WORD(nr) ((nr) / BITS_PER_LONG) +#define BITS_PER_BYTE 8 +#define BITS_PER_LONG (sizeof(long) * BITS_PER_BYTE) +#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) + +static int check_fd(struct tslib_input *i) +{ + struct tsdev *ts = i->module.dev; + int version; + long evbit[BITS_TO_LONGS(EV_CNT)]; + long absbit[BITS_TO_LONGS(ABS_CNT)]; + + if (ioctl(ts->fd, EVIOCGVERSION, &version) < 0) { + fprintf(stderr, "tslib: Selected device is not a Linux input event device\n"); + return -1; + } + + if (version < EV_VERSION) { + fprintf(stderr, "tslib: Selected device uses a different version of the event protocol than tslib was compiled for\n"); + return -1; + } + + if ( (ioctl(ts->fd, EVIOCGBIT(0, sizeof(evbit)), evbit) < 0) || + !(evbit[BIT_WORD(EV_ABS)] & BIT_MASK(EV_ABS)) || + !(evbit[BIT_WORD(EV_KEY)] & BIT_MASK(EV_KEY)) ) { + fprintf(stderr, "tslib: Selected device is not a touchscreen (must support ABS and KEY event types)\n"); + return -1; + } + + if ((ioctl(ts->fd, EVIOCGBIT(EV_ABS, sizeof(absbit)), absbit)) < 0 || + !(absbit[BIT_WORD(ABS_MT_POSITION_X)] & BIT_MASK(ABS_MT_POSITION_X)) || + !(absbit[BIT_WORD(ABS_MT_POSITION_Y)] & BIT_MASK(ABS_MT_POSITION_Y))) { + fprintf(stderr, "tslib: Selected device is not a touchscreen (must support ABS_MT_POSITION_X and ABS_MT_POSITION_Y events)\n"); + return -1; + } + + if (evbit[BIT_WORD(EV_SYN)] & BIT_MASK(EV_SYN)) + i->using_syn = 1; + + if (i->grab_events == GRAB_EVENTS_WANTED) { + if (ioctl(ts->fd, EVIOCGRAB, (void *)1)) { + fprintf(stderr, "tslib: Unable to grab selected input device\n"); + return -1; + } + i->grab_events = GRAB_EVENTS_ACTIVE; + } + + return 0; +} + +static int ts_st1232_read(struct tslib_module_info *inf, + struct ts_sample *samp, int nr) +{ + struct tslib_input *i = (struct tslib_input *)inf; + struct tsdev *ts = inf->dev; + struct input_event ev; + int ret = nr; + int total = 0; + int mt_cnt = 0; /* data for first finger */ + + if (i->sane_fd == -1) + i->sane_fd = check_fd(i); + + if (i->sane_fd == -1) + return 0; + + if (i->using_syn) { + while (total < nr) { + ret = read(ts->fd, &ev, sizeof(struct input_event)); + if (ret < (int) sizeof(struct input_event)) { + total = -1; + break; + } + + switch (ev.type) { + case EV_SYN: + if (ev.code == SYN_MT_REPORT) { + mt_cnt++; /* data for next finger will come */ + } else if (ev.code == SYN_REPORT) { + /* fill out a new complete event */ + /* always send coordinate (last one on finger released) */ + samp->x = i->current_x; + samp->y = i->current_y; + samp->pressure = i->current_p; /* is 0 on finger released */ + samp->tv = ev.time; + + i->current_p = 0; /* will be set again when getting xy cordinate */ + samp++; + total++; + mt_cnt = 0; + } + break; + case EV_ABS: + if (mt_cnt > 0) + break; /* save data only for first finger */ + + switch (ev.code) { + case ABS_MT_POSITION_X: + i->current_x = ev.value; + i->current_p = 255; /* touched */ + break; + case ABS_MT_POSITION_Y: + i->current_y = ev.value; + i->current_p = 255; /* touched */ + + if (i->invert_y > 0) + i->current_y = i->invert_y - i->current_y; + break; + } + break; + } + } + + ret = total; + } else { + fprintf(stderr, "tslib: st1232 and not using syn\n"); + sleep(1); + } + + return ret; +} + +static int ts_st1232_fini(struct tslib_module_info *inf) +{ + struct tslib_input *i = (struct tslib_input *)inf; + struct tsdev *ts = inf->dev; + + if (i->grab_events == GRAB_EVENTS_ACTIVE) { + if (ioctl(ts->fd, EVIOCGRAB, (void *)0)) { + fprintf(stderr, "tslib: Unable to un-grab selected input device\n"); + } + } + + free(inf); + return 0; +} + +static const struct tslib_ops __ts_st1232_ops = { + .read = ts_st1232_read, + .fini = ts_st1232_fini, +}; + +static int parse_raw_grab(struct tslib_module_info *inf, char *str, void *data) +{ + struct tslib_input *i = (struct tslib_input *)inf; + unsigned long v; + int err = errno; + + v = strtoul(str, NULL, 0); + + if (v == ULONG_MAX && errno == ERANGE) + return -1; + + errno = err; + switch ((int)data) { + case 1: + if (v) + i->grab_events = GRAB_EVENTS_WANTED; + break; + default: + return -1; + } + return 0; +} + +static int parse_invert_y(struct tslib_module_info *inf, char *str, void *data) +{ + struct tslib_input *i = (struct tslib_input *)inf; + int v; + int err = errno; + + v = atoi(str); + + if (v < 0) + return -1; + + errno = err; + switch ((int)data) { + case 1: + i->invert_y = v; + break; + default: + return -1; + } + return 0; +} + +static const struct tslib_vars raw_vars[] = +{ + { "grab_events", (void *)1, parse_raw_grab }, + { "invert_y", (void *)1, parse_invert_y }, +}; + +#define NR_VARS (sizeof(raw_vars) / sizeof(raw_vars[0])) + +TSAPI struct tslib_module_info *st1232_mod_init(struct tsdev *dev, const char *params) +{ + struct tslib_input *i; + + i = malloc(sizeof(struct tslib_input)); + if (i == NULL) + return NULL; + + i->module.ops = &__ts_st1232_ops; + i->current_x = 0; + i->current_y = 0; + i->current_p = 0; + i->sane_fd = -1; + i->using_syn = 0; + i->grab_events = 0; + i->invert_y = 0; + + if (tslib_parse_vars(&i->module, raw_vars, NR_VARS, params)) { + free(i); + return NULL; + } + + return &(i->module); +} + +#ifndef TSLIB_STATIC_ST1232_MODULE + TSLIB_MODULE_INIT(st1232_mod_init); +#endif diff --git a/src/Makefile.am b/src/Makefile.am index 5278d82..b561aa8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -71,6 +71,10 @@ if ENABLE_STATIC_INPUT_MODULE libts_la_SOURCES += $(top_srcdir)/plugins/input-raw.c endif +if ENABLE_STATIC_ST1232_MODULE +libts_la_SOURCES += $(top_srcdir)/plugins/st1232-raw.c +endif + libts_la_LDFLAGS = -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ -release $(LT_RELEASE) -export-dynamic libts_la_LIBADD = -ldl diff --git a/src/ts_load_module.c b/src/ts_load_module.c index 00486be..886ca0a 100644 --- a/src/ts_load_module.c +++ b/src/ts_load_module.c @@ -73,6 +73,9 @@ static const struct { #ifdef TSLIB_STATIC_VARIANCE_MODULE { "variance", variance_mod_init }, #endif +#ifdef TSLIB_STATIC_ST1232_MODULE + { "st1232", st1232_mod_init }, +#endif }; #define countof(arr) (sizeof(arr) / sizeof((arr)[0])) diff --git a/tests/Makefile.am b/tests/Makefile.am index b76522d..2e80c18 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -11,7 +11,7 @@ AM_CFLAGS = -DTS_POINTERCAL=\"@TS_POINTERCAL@\" $(DEBUGFLAGS) INCLUDES = -I$(top_srcdir)/src -bin_PROGRAMS = ts_test ts_calibrate ts_print ts_print_raw ts_harvest +bin_PROGRAMS = ts_test ts_calibrate ts_print ts_print_raw ts_harvest ts_uinput_touch ts_test_SOURCES = ts_test.c fbutils.c fbutils.h font_8x8.c font_8x16.c font.h ts_test_LDADD = $(top_builddir)/src/libts.la @@ -27,3 +27,6 @@ ts_calibrate_LDADD = $(top_builddir)/src/libts.la ts_harvest_SOURCES = ts_harvest.c fbutils.c fbutils.h testutils.c testutils.h font_8x8.c font_8x16.c font.h ts_harvest_LDADD = $(top_builddir)/src/libts.la + +ts_uinput_touch_SOURCES = ts_uinput_touch.c testutils.c testutils.h +ts_uinput_touch_LDADD = $(top_builddir)/src/libts.la diff --git a/tests/testutils.c b/tests/testutils.c index dbd5b41..bc3756f 100644 --- a/tests/testutils.c +++ b/tests/testutils.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include "tslib.h" #include "fbutils.h" @@ -37,6 +38,9 @@ void getxy(struct tsdev *ts, int *x, int *y) do { if (ts_read_raw(ts, &samp[0], 1) < 0) { + if (errno == EINTR) + return; + perror("ts_read"); close_framebuffer (); exit(1); @@ -50,6 +54,9 @@ void getxy(struct tsdev *ts, int *x, int *y) if (index < MAX_SAMPLES-1) index++; if (ts_read_raw(ts, &samp[index], 1) < 0) { + if (errno == EINTR) + return; + perror("ts_read"); close_framebuffer (); exit(1); diff --git a/tests/ts_calibrate.c b/tests/ts_calibrate.c index eb0aca3..522fa7c 100644 --- a/tests/ts_calibrate.c +++ b/tests/ts_calibrate.c @@ -237,12 +237,16 @@ int main() get_sample (ts, &cal, 0, 50, 50, "Top left"); clearbuf(ts); + usleep(500000); get_sample (ts, &cal, 1, xres - 50, 50, "Top right"); clearbuf(ts); + usleep(500000); get_sample (ts, &cal, 2, xres - 50, yres - 50, "Bot right"); clearbuf(ts); + usleep(500000); get_sample (ts, &cal, 3, 50, yres - 50, "Bot left"); clearbuf(ts); + usleep(500000); get_sample (ts, &cal, 4, xres / 2, yres / 2, "Center"); if (perform_calibration (&cal)) { diff --git a/tests/ts_uinput_touch.c b/tests/ts_uinput_touch.c new file mode 100644 index 0000000..60efc46 --- /dev/null +++ b/tests/ts_uinput_touch.c @@ -0,0 +1,624 @@ +/* + * tslib/src/ts_uinput_touch.c + * + * Copyright (C) 2001 Russell King. + * Copyright (C) 2015 Peter Vicman. + * + * This file is placed under the GPL. Please see the file + * COPYING for more details. + * + * + * Takes tslib events and send them to uinput as + * BTN_TOUCH, ABS_X, ABS_Y and ABS_PRESSURE values. + * Short tap send button event and longer tap send only coordinates. + * Tested only with Kodi application. + * + * code based on + * tslib/src/ts_test.c + * tslib/src/ts_calibrate.c + * http://thiemonge.org/getting-started-with-uinput + * http://lkcl.net/software/uinput/ + * + * In memory of my mom and dad ... + */ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "tslib.h" +#include "testutils.h" + +#define die(str, args...) do { \ + perror(str); \ + exit(EXIT_FAILURE); \ + } while(0); + +#define SET_ABS_MINMAX(dev, arg, min, max) do { \ + (dev).absmin[arg] = min; \ + (dev).absmax[arg] = max; \ + } while(0); + +#define CANCEL_CALIBRATION if (! calibration_mode) return; else {} + +#define SOCK_PATH "/tmp/ts_calibrate.socket" + +#define CROSSHAIR_STR1 "Top left" +#define CROSSHAIR_STR2 "Top right" +#define CROSSHAIR_STR3 "Bottom right" +#define CROSSHAIR_STR4 "Bottom left" +#define CROSSHAIR_STR5 "Center" + +typedef struct { + int x[5], xfb[5]; + int y[5], yfb[5]; + int a[7]; +} calibration; + +char *uinput_names[] = {"/dev/uinput", "/dev/input/uinput", "/dev/misc/uinput"}; +#define UINPUT_NAMES_NUM ((int) (sizeof(uinput_names)/sizeof(char *))) + +__u32 xres = 0, yres = 0; +struct timeval tv_short_tap = {0, 300}; /* sec, msec */ +bool calibration_mode = false; +int sock = -1; + +static void daemonize() { + pid_t pid; + + pid = fork(); + if (pid == -1) { + die("failed to fork while daemonising (errno=%d)", errno) + } else if (pid != 0) { + exit(0); + } + + umask(0); + + if (setsid() == -1) { + die("failed to become a session leader while daemonising(errno=%d)", errno) + } + + signal(SIGHUP,SIG_IGN); + pid=fork(); + if (pid == -1) { + die("failed to fork while daemonizing (errno=%d)", errno) + } else if (pid != 0) { + exit(0); + } + + if (chdir("/") == -1) { + die("failed to change working directory while daemonizing (errno=%d)", errno) + } + + umask(0); + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + + if (open("/dev/null", O_RDONLY) == -1) { + die("failed to reopen stdin while daemonizing (errno=%d)", errno) + } + + if (open("/dev/null", O_WRONLY) == -1) { + die("failed to reopen stdout while daemonizing (errno=%d)", errno) + } + + if (open("/dev/null", O_RDWR) == -1) { + die("failed to reopen stderr while daemonizing (errno=%d)", errno) + } +} + +static void sig(int sig) +{ + fflush(stderr); + printf("signal %d caught\n", sig); + fflush(stdout); + exit(1); +} + +static void set_ioctl(int fd, unsigned int cmd, __u16 value) +{ + if (ioctl(fd, cmd, value) < 0) + die("error: ioctl") +} + +static int send_event(int fd, __u16 type, __u16 code, __s32 value) +{ + struct input_event event; + int ret; + + memset(&event, 0, sizeof(event)); + event.type = type; + event.code = code; + event.value = value; + + ret = write(fd, &event, sizeof(event)); + if (ret != sizeof(event)) { + fprintf(stderr, "Error on send_event"); + return -1; + } + + return 0; +} + +static void signal_handler(int signal_number) { + if (signal_number == SIGUSR1) + calibration_mode = true; + else if (signal_number == SIGUSR2) + calibration_mode = false; + else + return; + + printf("signal handler %d, current calibration_mode=%d\n", signal_number, calibration_mode == true ? 1 : 0); + if (calibration_mode) { + tv_short_tap.tv_sec += 600; /* little more time */ + } else { + tv_short_tap.tv_sec -= 600; + } +} + +static int perform_calibration(calibration *cal) { + int j; + float n, x, y, x2, y2, xy, z, zx, zy; + float det, a, b, c, e, f, i; + float scaling = 65536.0; + +// Get sums for matrix + n = x = y = x2 = y2 = xy = 0; + for(j=0;j<5;j++) { + n += 1.0; + x += (float)cal->x[j]; + y += (float)cal->y[j]; + x2 += (float)(cal->x[j]*cal->x[j]); + y2 += (float)(cal->y[j]*cal->y[j]); + xy += (float)(cal->x[j]*cal->y[j]); + } + +// Get determinant of matrix -- check if determinant is too small + det = n*(x2*y2 - xy*xy) + x*(xy*y - x*y2) + y*(x*xy - y*x2); + if(det < 0.1 && det > -0.1) { + printf("ts_calibrate: determinant is too small -- %f\n",det); + return 0; + } + +// Get elements of inverse matrix + a = (x2*y2 - xy*xy)/det; + b = (xy*y - x*y2)/det; + c = (x*xy - y*x2)/det; + e = (n*y2 - y*y)/det; + f = (x*y - n*xy)/det; + i = (n*x2 - x*x)/det; + +// Get sums for x calibration + z = zx = zy = 0; + for(j=0;j<5;j++) { + z += (float)cal->xfb[j]; + zx += (float)(cal->xfb[j]*cal->x[j]); + zy += (float)(cal->xfb[j]*cal->y[j]); + } + +// Now multiply out to get the calibration for framebuffer x coord + cal->a[0] = (int)((a*z + b*zx + c*zy)*(scaling)); + cal->a[1] = (int)((b*z + e*zx + f*zy)*(scaling)); + cal->a[2] = (int)((c*z + f*zx + i*zy)*(scaling)); + + printf("%f %f %f\n",(a*z + b*zx + c*zy), + (b*z + e*zx + f*zy), + (c*z + f*zx + i*zy)); + +// Get sums for y calibration + z = zx = zy = 0; + for(j=0;j<5;j++) { + z += (float)cal->yfb[j]; + zx += (float)(cal->yfb[j]*cal->x[j]); + zy += (float)(cal->yfb[j]*cal->y[j]); + } + +// Now multiply out to get the calibration for framebuffer y coord + cal->a[3] = (int)((a*z + b*zx + c*zy)*(scaling)); + cal->a[4] = (int)((b*z + e*zx + f*zy)*(scaling)); + cal->a[5] = (int)((c*z + f*zx + i*zy)*(scaling)); + + printf("%f %f %f\n",(a*z + b*zx + c*zy), + (b*z + e*zx + f*zy), + (c*z + f*zx + i*zy)); + +// If we got here, we're OK, so assign scaling to a[6] and return + cal->a[6] = (int)scaling; + return 1; +/* +// This code was here originally to just insert default values + for(j=0;j<7;j++) { + c->a[j]=0; + } + c->a[1] = c->a[5] = c->a[6] = 1; + return 1; +*/ +} + +static void get_sample(struct tsdev *ts, calibration *cal, + int index, int x, int y, char *name) +{ + printf("getting sample for: %s\n", name); + getxy(ts, &cal->x[index], &cal->y[index]); + cal->xfb[index] = x; + cal->yfb[index] = y; + printf("%s: X = %4d Y = %4d\n", name, cal->x[index], cal->y[index]); +} + +static void clearbuf(struct tsdev *ts) +{ + int fd = ts_fd(ts); + fd_set fdset; + struct timeval tv; + int nfds; + struct ts_sample sample; + + while (1) { + FD_ZERO(&fdset); + FD_SET(fd, &fdset); + + tv.tv_sec = 0; + tv.tv_usec = 0; + + nfds = select(fd + 1, &fdset, NULL, NULL, &tv); + if (nfds == 0) break; + + if (ts_read_raw(ts, &sample, 1) < 0) { + perror("ts_read"); + exit(1); + } + } +} + +/* we don't use fb but this function is called in case of an error */ +void close_framebuffer(void) {} + +static void send_socket_crosshair_str(char *str) +{ + if (send(sock, str, strlen(str), 0) == -1) { + printf("send error\n"); + } +} + +static void run_calibration(struct tsdev *ts) +{ + calibration cal; + int cal_fd; + char cal_buffer[256]; + char *calfile; + unsigned int i, len; + + send_socket_crosshair_str(CROSSHAIR_STR1); /* show first touch point */ + clearbuf(ts); + get_sample(ts, &cal, 0, 50, 50, CROSSHAIR_STR1); + CANCEL_CALIBRATION + send_socket_crosshair_str(CROSSHAIR_STR2); + clearbuf(ts); + get_sample(ts, &cal, 1, xres - 50, 50, CROSSHAIR_STR2); + CANCEL_CALIBRATION + send_socket_crosshair_str(CROSSHAIR_STR3); + clearbuf(ts); + get_sample(ts, &cal, 2, xres - 50, yres - 50, CROSSHAIR_STR3); + CANCEL_CALIBRATION + send_socket_crosshair_str(CROSSHAIR_STR4); + clearbuf(ts); + get_sample(ts, &cal, 3, 50, yres - 50, CROSSHAIR_STR4); + CANCEL_CALIBRATION + send_socket_crosshair_str(CROSSHAIR_STR5); + clearbuf(ts); + get_sample(ts, &cal, 4, xres / 2, yres / 2, CROSSHAIR_STR5); + CANCEL_CALIBRATION + send_socket_crosshair_str("done"); + clearbuf(ts); + + if (perform_calibration(&cal)) { + printf ("Calibration constants: "); + for (i = 0; i < 7; i++) + printf("%d ", cal.a[i]); + + printf("\n"); + calfile = getenv("TSLIB_CALIBFILE"); + if (calfile != NULL) { + cal_fd = open(calfile, O_CREAT | O_TRUNC | O_RDWR, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + + if (cal_fd == -1) { + printf("Calibration failed - can't open calibration file %s.\n", calfile); + return; + } + } else { + cal_fd = open(TS_POINTERCAL, O_CREAT | O_TRUNC | O_RDWR, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + + if (cal_fd == -1) { + printf("Calibration failed - can't open calibration file %s.\n", TS_POINTERCAL); + return; + } + } + + len = sprintf(cal_buffer, "%d %d %d %d %d %d %d %d %d", + cal.a[1], cal.a[2], cal.a[0], + cal.a[4], cal.a[5], cal.a[3], cal.a[6], + xres, yres); + write(cal_fd, cal_buffer, len); + close(cal_fd); + } else { + printf("Calibration failed - wrong data.\n"); + } +} + +int get_resolution(void) +{ + static char *fbdevice; + int fd; + static struct fb_var_screeninfo var; + + fbdevice = getenv("TSLIB_FBDEVICE"); + if (fbdevice == NULL) + return -1; + + printf("using fb device: %s\n", fbdevice); + fd = open(fbdevice, O_RDWR); + if (fd == -1) { + perror("open fbdevice"); + return -1; + } + + if (ioctl(fd, FBIOGET_VSCREENINFO, &var) < 0) { + perror("ioctl FBIOGET_VSCREENINFO"); + close(fd); + return -1; + } + + xres = var.xres; + yres = var.yres; + + close(fd); + return 0; +} + +int main(int argc, char *argv[]) +{ + int c; + char *tsdevice; + struct tsdev *ts; + int ret; + struct ts_sample samp; + int uinput_fd; + struct uinput_user_dev uidev; + int daemon = 0; + struct timeval tv_last; + struct timeval tv_sub; + char *touch_str; + int val; + struct sigaction sa; + struct sockaddr_un remote_addr; + + touch_str = getenv("TSLIB_TAP_TIME"); + if (touch_str != NULL) { + val = atoi(touch_str); + if (val < 1000) { + tv_short_tap.tv_sec = 0; + tv_short_tap.tv_usec = val; + } else { + tv_short_tap.tv_sec = val / 1000; + tv_short_tap.tv_usec = val % 1000; + } + } + + get_resolution(); + + while ((c = getopt(argc, argv, "?dt:x:y:")) != -1) { + switch (c) { + case 'd': + daemon = 1; + break; + case 't': + val = atoi(optarg); + if (val < 1000) { + tv_short_tap.tv_sec = 0; + tv_short_tap.tv_usec = val; + } else { + tv_short_tap.tv_sec = val / 1000; + tv_short_tap.tv_usec = val % 1000; + } + + break; + case 'x': + xres = atoi(optarg); + break; + case 'y': + yres = atoi(optarg); + break; + case '?': + if (isprint(optopt)) + fprintf (stderr, "Unknown option '-%c'.\n", optopt); + else + fprintf (stderr, "Unknown option character '\\x%x'.\n", optopt); + return 1; + default: + die("getopt") + } + } + + printf("resolution: %dx%d\n", xres, yres); + + signal(SIGSEGV, sig); + signal(SIGINT, sig); + signal(SIGTERM, sig); + + tsdevice = getenv("TSLIB_TSDEVICE"); + + if (tsdevice == NULL) { + errno = ENOENT; + die("error: TSLIB_TSDEVICE") + } + + printf("using touch device: %s\n", tsdevice); + + ts = ts_open(tsdevice, 0); // 0 nonblock + if (!ts) { + die("ts_open") + } + + if (ts_config(ts)) { + die("ts_config") + } + + system("modprobe uinput"); + + for (c=0; c < UINPUT_NAMES_NUM; c++) { + uinput_fd = open(uinput_names[c], O_WRONLY | O_NONBLOCK); + if (uinput_fd >= 0) + break; + } + + if (uinput_fd < 0) + die("error: opening uinput") + + if (tv_short_tap.tv_sec == 0) + printf("Short tap time: %li msec\n", tv_short_tap.tv_usec); + else + printf("Short tap time: %li.%li sec\n", tv_short_tap.tv_sec, tv_short_tap.tv_usec); + + memset (&sa, 0, sizeof (sa)); + sa.sa_handler = &signal_handler; + sigaction(SIGUSR1, &sa, NULL); + sigaction(SIGUSR2, &sa, NULL); + + if (daemon == 1) { + printf("daemonizing...\n"); + daemonize(); + } + + set_ioctl(uinput_fd, UI_SET_EVBIT, EV_SYN); + set_ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY); + set_ioctl(uinput_fd, UI_SET_KEYBIT, BTN_TOUCH); + set_ioctl(uinput_fd, UI_SET_EVBIT, EV_ABS); + set_ioctl(uinput_fd, UI_SET_ABSBIT, ABS_X); + set_ioctl(uinput_fd, UI_SET_ABSBIT, ABS_Y); + set_ioctl(uinput_fd, UI_SET_ABSBIT, ABS_PRESSURE); + + memset(&uidev, 0, sizeof(uidev)); + + snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "tslib to uinput daemon"); + SET_ABS_MINMAX(uidev, ABS_X, 0, xres) + SET_ABS_MINMAX(uidev, ABS_Y, 0, yres) + SET_ABS_MINMAX(uidev, ABS_PRESSURE, 0, 255) + + uidev.id.bustype = BUS_USB; + uidev.id.vendor = 0x34a5; + uidev.id.product = 0x67b8; + uidev.id.version = 1; + + if (write(uinput_fd, &uidev, sizeof(uidev)) < 0) + die("error: write") + + if (ioctl(uinput_fd, UI_DEV_CREATE) < 0) + die("error: ioctl UI_DEV_CREATE") + + tv_short_tap.tv_usec *= 1000; /* msec to usec */ + timerclear(&tv_last); + while (1) { + touch_str = ""; + if (calibration_mode) { + usleep(250000); /* app become ready */ + printf("calibration mode started\n"); + + sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (sock == -1) { + die("socket"); + } + + printf("trying to connect\n"); + + remote_addr.sun_family = AF_UNIX; + strcpy(remote_addr.sun_path, SOCK_PATH); + val = strlen(remote_addr.sun_path) + sizeof(remote_addr.sun_family); + if (connect(sock, (struct sockaddr *) &remote_addr, val) == -1) { + calibration_mode = false; + close(sock); + printf("connect error, skip calibration\n"); + usleep(200000); + continue; + } + + printf("connected\n"); + run_calibration(ts); + calibration_mode = false; + close(sock); + printf("calibration mode finished\n"); + } + + ret = ts_read(ts, &samp, 1); + if (ret < 0) { + usleep(200000); + continue; + } else if (ret == 0) { + /* can't grab ts device */ + usleep(400000); + } else if (ret != 1) + continue; + + send_event(uinput_fd, EV_ABS, ABS_X, samp.x); + send_event(uinput_fd, EV_ABS, ABS_Y, samp.y); + + if (samp.pressure > 0) { /* touched */ + send_event(uinput_fd, EV_ABS, ABS_PRESSURE, 255); + send_event(uinput_fd, EV_SYN, 0, 0); + + if (timerisset(&tv_last) == false) { + memcpy(&tv_last, &samp.tv, sizeof(struct timeval)); /* touched first time */ + touch_str = "touched first"; + } + } else { /* released */ + timersub(&samp.tv, &tv_last, &tv_sub); + if (timercmp(&tv_sub, &tv_short_tap, <=)) { + send_event(uinput_fd, EV_ABS, ABS_PRESSURE, 255); + send_event(uinput_fd, EV_KEY, BTN_TOUCH, 1); + send_event(uinput_fd, EV_SYN, 0, 0); + send_event(uinput_fd, EV_ABS, ABS_PRESSURE, 0); + send_event(uinput_fd, EV_KEY, BTN_TOUCH, 0); + send_event(uinput_fd, EV_SYN, 0, 0); + + touch_str = "released and send button"; + } else { + send_event(uinput_fd, EV_ABS, ABS_PRESSURE, 0); + send_event(uinput_fd, EV_SYN, 0, 0); + touch_str = "released"; + } + + timerclear(&tv_last); + } + + printf("%ld.%06ld: %6d %6d %6d %s\n", samp.tv.tv_sec, samp.tv.tv_usec, + samp.x, samp.y, samp.pressure, touch_str); + } + + if (ioctl(uinput_fd, UI_DEV_DESTROY) < 0) + die("error: ioctl UI_DEV_DESTROY") + + close(uinput_fd); + + return 0; +} From b64b63ac2fc791cad6e79cf9236c47b928960c2e Mon Sep 17 00:00:00 2001 From: vpeter4 Date: Sat, 4 Jul 2015 13:46:56 +0200 Subject: [PATCH 03/11] ts_uinput_touch: add BTN_RIGHT event if tapped for more than 300 ms and less than a second BTN_RIGHT event is send --- tests/ts_uinput_touch.c | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) mode change 100644 => 100755 tests/ts_uinput_touch.c diff --git a/tests/ts_uinput_touch.c b/tests/ts_uinput_touch.c old mode 100644 new mode 100755 index 60efc46..489a22f --- a/tests/ts_uinput_touch.c +++ b/tests/ts_uinput_touch.c @@ -9,8 +9,9 @@ * * * Takes tslib events and send them to uinput as - * BTN_TOUCH, ABS_X, ABS_Y and ABS_PRESSURE values. - * Short tap send button event and longer tap send only coordinates. + * BTN_TOUCH, BTN_RIGHT, ABS_X, ABS_Y and ABS_PRESSURE values. + * Short tap send button touch event, little longer tap send button right event + * and longer tap send only coordinates. * Tested only with Kodi application. * * code based on @@ -77,7 +78,8 @@ char *uinput_names[] = {"/dev/uinput", "/dev/input/uinput", "/dev/misc/uinput"}; #define UINPUT_NAMES_NUM ((int) (sizeof(uinput_names)/sizeof(char *))) __u32 xres = 0, yres = 0; -struct timeval tv_short_tap = {0, 300}; /* sec, msec */ +struct timeval tv_short_tap = {0, 300}; /* sec, msec, short tap sends BTN_TOUCH */ +struct timeval tv_right_tap = {1, 0}; /* sec, msec, longer tap sends BTN_RIGHT */ bool calibration_mode = false; int sock = -1; @@ -169,11 +171,6 @@ static void signal_handler(int signal_number) { return; printf("signal handler %d, current calibration_mode=%d\n", signal_number, calibration_mode == true ? 1 : 0); - if (calibration_mode) { - tv_short_tap.tv_sec += 600; /* little more time */ - } else { - tv_short_tap.tv_sec -= 600; - } } static int perform_calibration(calibration *cal) { @@ -501,6 +498,11 @@ int main(int argc, char *argv[]) else printf("Short tap time: %li.%li sec\n", tv_short_tap.tv_sec, tv_short_tap.tv_usec); + if (tv_right_tap.tv_sec == 0) + printf("Right tap time: %li msec\n", tv_right_tap.tv_usec); + else + printf("Right tap time: %li.%li sec\n", tv_right_tap.tv_sec, tv_right_tap.tv_usec); + memset (&sa, 0, sizeof (sa)); sa.sa_handler = &signal_handler; sigaction(SIGUSR1, &sa, NULL); @@ -511,10 +513,11 @@ int main(int argc, char *argv[]) daemonize(); } - set_ioctl(uinput_fd, UI_SET_EVBIT, EV_SYN); - set_ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY); + set_ioctl(uinput_fd, UI_SET_EVBIT, EV_SYN); + set_ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY); set_ioctl(uinput_fd, UI_SET_KEYBIT, BTN_TOUCH); - set_ioctl(uinput_fd, UI_SET_EVBIT, EV_ABS); + set_ioctl(uinput_fd, UI_SET_KEYBIT, BTN_RIGHT); + set_ioctl(uinput_fd, UI_SET_EVBIT, EV_ABS); set_ioctl(uinput_fd, UI_SET_ABSBIT, ABS_X); set_ioctl(uinput_fd, UI_SET_ABSBIT, ABS_Y); set_ioctl(uinput_fd, UI_SET_ABSBIT, ABS_PRESSURE); @@ -538,6 +541,8 @@ int main(int argc, char *argv[]) die("error: ioctl UI_DEV_CREATE") tv_short_tap.tv_usec *= 1000; /* msec to usec */ + tv_right_tap.tv_usec *= 1000; /* msec to usec */ + timerclear(&tv_last); while (1) { touch_str = ""; @@ -601,7 +606,16 @@ int main(int argc, char *argv[]) send_event(uinput_fd, EV_KEY, BTN_TOUCH, 0); send_event(uinput_fd, EV_SYN, 0, 0); - touch_str = "released and send button"; + touch_str = "released and send tap"; + } else if (timercmp(&tv_sub, &tv_right_tap, <=)) { + send_event(uinput_fd, EV_ABS, ABS_PRESSURE, 255); + send_event(uinput_fd, EV_KEY, BTN_RIGHT, 1); + send_event(uinput_fd, EV_SYN, 0, 0); + send_event(uinput_fd, EV_ABS, ABS_PRESSURE, 0); + send_event(uinput_fd, EV_KEY, BTN_RIGHT, 0); + send_event(uinput_fd, EV_SYN, 0, 0); + + touch_str = "released and send right"; } else { send_event(uinput_fd, EV_ABS, ABS_PRESSURE, 0); send_event(uinput_fd, EV_SYN, 0, 0); From 0c95545167711eb2e906c8ef885956f3395e945a Mon Sep 17 00:00:00 2001 From: Peter Vicman Date: Mon, 31 Aug 2015 10:52:51 +0200 Subject: [PATCH 04/11] Add Waveshare touchscreen raw module inspiration from derekhe: https://github.com/derekhe/wavesahre-7inch-touchscreen-driver --- configure.ac | 1 + plugins/Makefile.am | 13 +++- plugins/plugins.h | 1 + plugins/waveshare-raw.c | 202 ++++++++++++++++++++++++++++++++++++++++++++++++ src/Makefile.am | 4 + 5 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 plugins/waveshare-raw.c diff --git a/configure.ac b/configure.ac index 6984002..598ede7 100644 --- a/configure.ac +++ b/configure.ac @@ -70,6 +70,7 @@ TSLIB_CHECK_MODULE([input], [yes], [Enable building of generic input raw module TSLIB_CHECK_MODULE([touchkit], [yes], [Enable building of serial TouchKit raw module (Linux /dev/ttySX support)]) TSLIB_CHECK_MODULE([galax], [yes], [Enable building of HID USB eGalax raw module (Linux /dev/hiddevN support)]) TSLIB_CHECK_MODULE([st1232], [yes], [Enable building of ST1232 raw module (Linux /dev/input/eventN support)]) +TSLIB_CHECK_MODULE([waveshare], [yes], [Enable building of WaveShare raw module (Linux /dev/hidrawN support)]) diff --git a/plugins/Makefile.am b/plugins/Makefile.am index e8e89e0..98881b3 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -127,6 +127,12 @@ else ST1232_MODULE = endif +if ENABLE_WAVESHARE_MODULE +WAVESHARE_MODULE = waveshare.la +else +WAVESHARE_MODULE = +endif + pluginexec_LTLIBRARIES = \ $(LINEAR_MODULE) \ $(DEJITTER_MODULE) \ @@ -145,7 +151,8 @@ pluginexec_LTLIBRARIES = \ $(GALAX_MODULE) \ $(TOUCHKIT_MODULE) \ $(CY8MRLN_PALMPRE_MODULE) \ - $(ST1232_MODULE) + $(ST1232_MODULE) \ + $(WAVESHARE_MODULE) variance_la_SOURCES = variance.c variance_la_LDFLAGS = -module $(LTVSN) @@ -208,3 +215,7 @@ cy8mrln_palmpre_la_LDFLAGS = -module $(LTVSN) st1232_la_SOURCES = st1232-raw.c st1232_la_LDFLAGS = -module $(LTVSN) st1232_la_LIBADD = $(top_builddir)/src/libts.la + +waveshare_la_SOURCES = waveshare-raw.c +waveshare_la_LDFLAGS = -module $(LTVSN) +waveshare_la_LIBADD = $(top_builddir)/src/libts.la diff --git a/plugins/plugins.h b/plugins/plugins.h index d78877e..f347e25 100644 --- a/plugins/plugins.h +++ b/plugins/plugins.h @@ -17,3 +17,4 @@ TSLIB_DECLARE_MODULE(tatung); TSLIB_DECLARE_MODULE(input); TSLIB_DECLARE_MODULE(cy8mrln_palmpre); TSLIB_DECLARE_MODULE(st1232); +TSLIB_DECLARE_MODULE(waveshare); diff --git a/plugins/waveshare-raw.c b/plugins/waveshare-raw.c new file mode 100644 index 0000000..ff13055 --- /dev/null +++ b/plugins/waveshare-raw.c @@ -0,0 +1,202 @@ +/* + * tslib driver for WaveShare touchscreens + * Copyright (C) 2015 Peter Vicman + * inspiration from derekhe: https://github.com/derekhe/wavesahre-7inch-touchscreen-driver + * + * This file is placed under the LGPL. Please see the file COPYING for more + * details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "config.h" +#include "tslib-private.h" + +struct tslib_input { + struct tslib_module_info module; + int vendor; + int product; + int len; +}; + +static int waveshare_read(struct tslib_module_info *inf, struct ts_sample *samp, int nr) +{ + static bool reopen = true; + struct stat devstat; + struct hidraw_devinfo info; + char name_buf[512]; + int cnt; + bool found = false; + struct tslib_input *i = (struct tslib_input *) inf; + struct tsdev *ts = inf->dev; + struct tsdev *ts_tmp; + char *buf; + int ret; + + if (reopen == true) { + reopen = false; + + if (i->vendor > 0 && i->product > 0) { + fprintf(stderr, "waveshare: searching for device using hidraw....\n"); + for (cnt=0; cntfd, HIDIOCGRAWINFO, &info); + if (ret < 0) { + ts_close(ts_tmp); + continue; + } + + info.vendor &= 0xFFFF; + info.product &= 0xFFFF; + fprintf(stderr, " vid=%04X, pid=%04X\n", info.vendor, info.product); + + if (i->vendor == info.vendor && i->product == info.product) { + if (ts->fd > 0) + close(ts->fd); + + ts->fd = ts_tmp->fd; + free(ts_tmp); + found = true; + fprintf(stderr, " correct device\n"); + break; + } + + ts_close(ts_tmp); + } /* for HIDRAW_MAX_DEVICES */ + + if (found == false) { + return -1; + } + } /* vid/pid set */ + } /* reopen */ + + buf = alloca(i->len * nr); + + ret = read(ts->fd, buf, i->len * nr); + if(ret > 0) { + while(ret >= (int) i->len) { + /* + 0000271: aa01 00e4 0139 bb01 01e0 0320 01e0 0320 01e0 0320 01e0 0320 cc .....9..... ... ... ... . + + "aa" is start of the command, "01" means clicked while "00" means unclicked. + "00e4" and "0139" is the X,Y position (HEX). + "bb" is start of multi-touch, and the following bytes are the position of each point. + */ + samp->pressure = buf[1] & 0xff; + samp->x = ((buf[2] & 0xff) << 8) | (buf[3] & 0xff); + samp->y = ((buf[4] & 0xff) << 8) | (buf[5] & 0xff); + gettimeofday(&samp->tv, NULL); +#ifdef DEBUG + fprintf(stderr, "waveshare raw: %d %d %d\n", samp->x, samp->y, samp->pressure); + fprintf(stderr, "%x %x %x %x %x %x\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); +#endif + samp++; + buf += i->len; + ret -= i->len; + } + } else { + return -1; + } + + return nr; +} + +static const struct tslib_ops waveshare_ops = +{ + .read = waveshare_read, +}; + +static int parse_vid_pid(struct tslib_module_info *inf, char *str, void *data) +{ + struct tslib_input *i = (struct tslib_input *)inf; + + if (strlen(str) < 9 || (int) data != 1) + return 0; /* -1 */ + + str[4] = str[9] = '\0'; + i->vendor = strtol(&str[0], NULL, 16); + i->product = strtol(&str[5], NULL, 16); +//#ifdef DEBUG + fprintf(stderr, "waveshare vid:pid - %04X:%04X\n", i->vendor, i->product); +//#endif /*DEBUG*/ + return 0; +} + +static int parse_len(struct tslib_module_info *inf, char *str, void *data) +{ + struct tslib_input *i = (struct tslib_input *)inf; + int v; + int err = errno; + + v = atoi(str); + + if (v < 0) + return -1; + + errno = err; + switch ((int) data) { + case 1: + i->len = v; + fprintf(stderr, "waveshare raw data len: %d bytes\n", i->len); + break; + default: + return -1; + } + return 0; +} + +static const struct tslib_vars raw_vars[] = +{ + { "vid_pid", (void *) 1, parse_vid_pid }, + { "len", (void *) 1, parse_len }, +}; + +#define NR_VARS (sizeof(raw_vars) / sizeof(raw_vars[0])) + +TSAPI struct tslib_module_info *waveshare_mod_init(struct tsdev *dev, const char *params) +{ + struct tslib_input *i; + + (void) dev; + + i = malloc(sizeof(struct tslib_input)); + if (i == NULL) + return NULL; + + i->module.ops = &waveshare_ops; + i->vendor = 0; + i->product = 0; + i->len = 25; + + if (tslib_parse_vars(&i->module, raw_vars, NR_VARS, params)) { + free(i); + return NULL; + } + + return &(i->module); +} + +#ifndef TSLIB_STATIC_WAVESHARE_MODULE + TSLIB_MODULE_INIT(waveshare_mod_init); +#endif diff --git a/src/Makefile.am b/src/Makefile.am index b561aa8..a8fded9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -75,6 +75,10 @@ if ENABLE_STATIC_ST1232_MODULE libts_la_SOURCES += $(top_srcdir)/plugins/st1232-raw.c endif +if ENABLE_STATIC_WAVESHARE_MODULE +libts_la_SOURCES += $(top_srcdir)/plugins/waveshare-raw.c +endif + libts_la_LDFLAGS = -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ -release $(LT_RELEASE) -export-dynamic libts_la_LIBADD = -ldl From 72128c5f16db89d7b644dd184c1b1c6dbe6ef79e Mon Sep 17 00:00:00 2001 From: Peter Vicman Date: Sun, 20 Sep 2015 10:30:33 +0200 Subject: [PATCH 05/11] waveshare: remove reopening device based on vid/pid --- plugins/waveshare-raw.c | 76 ------------------------------------------------- 1 file changed, 76 deletions(-) diff --git a/plugins/waveshare-raw.c b/plugins/waveshare-raw.c index ff13055..0839af0 100644 --- a/plugins/waveshare-raw.c +++ b/plugins/waveshare-raw.c @@ -24,73 +24,16 @@ struct tslib_input { struct tslib_module_info module; - int vendor; - int product; int len; }; static int waveshare_read(struct tslib_module_info *inf, struct ts_sample *samp, int nr) { - static bool reopen = true; - struct stat devstat; - struct hidraw_devinfo info; - char name_buf[512]; - int cnt; - bool found = false; struct tslib_input *i = (struct tslib_input *) inf; struct tsdev *ts = inf->dev; - struct tsdev *ts_tmp; char *buf; int ret; - if (reopen == true) { - reopen = false; - - if (i->vendor > 0 && i->product > 0) { - fprintf(stderr, "waveshare: searching for device using hidraw....\n"); - for (cnt=0; cntfd, HIDIOCGRAWINFO, &info); - if (ret < 0) { - ts_close(ts_tmp); - continue; - } - - info.vendor &= 0xFFFF; - info.product &= 0xFFFF; - fprintf(stderr, " vid=%04X, pid=%04X\n", info.vendor, info.product); - - if (i->vendor == info.vendor && i->product == info.product) { - if (ts->fd > 0) - close(ts->fd); - - ts->fd = ts_tmp->fd; - free(ts_tmp); - found = true; - fprintf(stderr, " correct device\n"); - break; - } - - ts_close(ts_tmp); - } /* for HIDRAW_MAX_DEVICES */ - - if (found == false) { - return -1; - } - } /* vid/pid set */ - } /* reopen */ - buf = alloca(i->len * nr); ret = read(ts->fd, buf, i->len * nr); @@ -127,22 +70,6 @@ static const struct tslib_ops waveshare_ops = .read = waveshare_read, }; -static int parse_vid_pid(struct tslib_module_info *inf, char *str, void *data) -{ - struct tslib_input *i = (struct tslib_input *)inf; - - if (strlen(str) < 9 || (int) data != 1) - return 0; /* -1 */ - - str[4] = str[9] = '\0'; - i->vendor = strtol(&str[0], NULL, 16); - i->product = strtol(&str[5], NULL, 16); -//#ifdef DEBUG - fprintf(stderr, "waveshare vid:pid - %04X:%04X\n", i->vendor, i->product); -//#endif /*DEBUG*/ - return 0; -} - static int parse_len(struct tslib_module_info *inf, char *str, void *data) { struct tslib_input *i = (struct tslib_input *)inf; @@ -168,7 +95,6 @@ static int parse_len(struct tslib_module_info *inf, char *str, void *data) static const struct tslib_vars raw_vars[] = { - { "vid_pid", (void *) 1, parse_vid_pid }, { "len", (void *) 1, parse_len }, }; @@ -185,8 +111,6 @@ TSAPI struct tslib_module_info *waveshare_mod_init(struct tsdev *dev, const char return NULL; i->module.ops = &waveshare_ops; - i->vendor = 0; - i->product = 0; i->len = 25; if (tslib_parse_vars(&i->module, raw_vars, NR_VARS, params)) { From 8b6a678e507211d5d51081655af244561a931d8f Mon Sep 17 00:00:00 2001 From: Peter Vicman Date: Sun, 20 Sep 2015 10:42:31 +0200 Subject: [PATCH 06/11] ts_reconfig: reload all modules useful to reload calibration data without closing and opening device --- src/Makefile.am | 2 +- src/ts_reconfig.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/tslib.h | 5 +++++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 src/ts_reconfig.c diff --git a/src/Makefile.am b/src/Makefile.am index a8fded9..606a5ae 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -17,7 +17,7 @@ include_HEADERS = tslib.h lib_LTLIBRARIES = libts.la libts_la_SOURCES = ts_attach.c ts_close.c ts_config.c ts_error.c \ ts_fd.c ts_load_module.c ts_open.c ts_parse_vars.c \ - ts_read.c ts_read_raw.c ts_option.c + ts_read.c ts_read_raw.c ts_option.c ts_reconfig.c if ENABLE_STATIC_LINEAR_MODULE libts_la_SOURCES += $(top_srcdir)/plugins/linear.c diff --git a/src/ts_reconfig.c b/src/ts_reconfig.c new file mode 100644 index 0000000..c94ec3e --- /dev/null +++ b/src/ts_reconfig.c @@ -0,0 +1,48 @@ +/* + * tslib/src/ts_reconfig.c + * based on tslib/src/ts_close.c + * + * Copyright (C) 2001 Russell King. + * + * This file is placed under the LGPL. Please see the file + * COPYING for more details. + * + * + * Reloads all modules - useful to reload calibration data. + */ +#include "config.h" +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +#include "tslib-private.h" + +int ts_reconfig(struct tsdev *ts) +{ + void *handle; + int ret; + struct tslib_module_info *info, *next; + int fd; + + info = ts->list; + while(info) { + /* Save the "next" pointer now because info will be freed */ + next = info->next; + + handle = info->handle; + info->ops->fini(info); + if (handle) + dlclose(handle); + + info = next; + } + + fd = ts->fd; /* save temp */ + memset(ts, 0, sizeof(struct tsdev)); + ts->fd = fd; + + ret = ts_config(ts); + return ret; +} diff --git a/src/tslib.h b/src/tslib.h index df8e284..28156ba 100644 --- a/src/tslib.h +++ b/src/tslib.h @@ -57,6 +57,11 @@ enum ts_param { TSAPI int ts_close(struct tsdev *); /* + * Reloads all modules - useful to reload calibration data. + */ +TSAPI int ts_reconfig(struct tsdev *); + +/* * Configure the touchscreen device. */ TSAPI int ts_config(struct tsdev *); From df81ed55ed9c99a8636f0b8524e0c5da0d00d33d Mon Sep 17 00:00:00 2001 From: Peter Vicman Date: Sun, 20 Sep 2015 10:45:55 +0200 Subject: [PATCH 07/11] ts_uinput_touch: reload modules (and calibration data) automatically after calibration and on SIGHUP signal --- tests/ts_uinput_touch.c | 67 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 19 deletions(-) diff --git a/tests/ts_uinput_touch.c b/tests/ts_uinput_touch.c index 489a22f..871c5e4 100755 --- a/tests/ts_uinput_touch.c +++ b/tests/ts_uinput_touch.c @@ -74,6 +74,7 @@ typedef struct { int a[7]; } calibration; +struct tsdev *ts = NULL; char *uinput_names[] = {"/dev/uinput", "/dev/input/uinput", "/dev/misc/uinput"}; #define UINPUT_NAMES_NUM ((int) (sizeof(uinput_names)/sizeof(char *))) @@ -99,7 +100,7 @@ static void daemonize() { die("failed to become a session leader while daemonising(errno=%d)", errno) } - signal(SIGHUP,SIG_IGN); + /* signal(SIGHUP,SIG_IGN); */ pid=fork(); if (pid == -1) { die("failed to fork while daemonizing (errno=%d)", errno) @@ -129,7 +130,7 @@ static void daemonize() { } } -static void sig(int sig) +static void signal_end(int sig) { fflush(stderr); printf("signal %d caught\n", sig); @@ -163,7 +164,15 @@ static int send_event(int fd, __u16 type, __u16 code, __s32 value) } static void signal_handler(int signal_number) { - if (signal_number == SIGUSR1) + if (signal_number == SIGHUP) { + /* reload modules (and calibration data) */ + printf("signal handler %d, reconfig ts\n", signal_number); + if (ts_reconfig(ts)) { + die("ts_reconfig") + } + + return; + } else if (signal_number == SIGUSR1) calibration_mode = true; else if (signal_number == SIGUSR2) calibration_mode = false; @@ -366,25 +375,25 @@ static void run_calibration(struct tsdev *ts) int get_resolution(void) { - static char *fbdevice; + char *env_str; int fd; static struct fb_var_screeninfo var; - fbdevice = getenv("TSLIB_FBDEVICE"); - if (fbdevice == NULL) - return -1; + env_str = getenv("TSLIB_FBDEVICE"); + if (env_str == NULL) + goto not_found; - printf("using fb device: %s\n", fbdevice); - fd = open(fbdevice, O_RDWR); + printf("using fb device: %s\n", env_str); + fd = open(env_str, O_RDWR); if (fd == -1) { perror("open fbdevice"); - return -1; + goto not_found; } if (ioctl(fd, FBIOGET_VSCREENINFO, &var) < 0) { perror("ioctl FBIOGET_VSCREENINFO"); close(fd); - return -1; + goto not_found; } xres = var.xres; @@ -392,13 +401,28 @@ int get_resolution(void) close(fd); return 0; + +not_found: + env_str = getenv("TSLIB_RES_X"); + if (env_str != NULL) + xres = atoi(env_str); + + env_str = getenv("TSLIB_RES_Y"); + if (env_str != NULL) + yres = atoi(env_str); + + if (xres == 0 || yres == 0) { + xres = yres = 0; + return -1; + } + + return 0; } int main(int argc, char *argv[]) { int c; char *tsdevice; - struct tsdev *ts; int ret; struct ts_sample samp; int uinput_fd; @@ -423,7 +447,7 @@ int main(int argc, char *argv[]) } } - get_resolution(); + ret = get_resolution(); while ((c = getopt(argc, argv, "?dt:x:y:")) != -1) { switch (c) { @@ -460,12 +484,11 @@ int main(int argc, char *argv[]) printf("resolution: %dx%d\n", xres, yres); - signal(SIGSEGV, sig); - signal(SIGINT, sig); - signal(SIGTERM, sig); + signal(SIGSEGV, signal_end); + signal(SIGINT, signal_end); + signal(SIGTERM, signal_end); tsdevice = getenv("TSLIB_TSDEVICE"); - if (tsdevice == NULL) { errno = ENOENT; die("error: TSLIB_TSDEVICE") @@ -482,7 +505,7 @@ int main(int argc, char *argv[]) die("ts_config") } - system("modprobe uinput"); + ret = system("modprobe uinput"); for (c=0; c < UINPUT_NAMES_NUM; c++) { uinput_fd = open(uinput_names[c], O_WRONLY | O_NONBLOCK); @@ -505,6 +528,7 @@ int main(int argc, char *argv[]) memset (&sa, 0, sizeof (sa)); sa.sa_handler = &signal_handler; + sigaction(SIGHUP, &sa, NULL); sigaction(SIGUSR1, &sa, NULL); sigaction(SIGUSR2, &sa, NULL); @@ -572,7 +596,12 @@ int main(int argc, char *argv[]) run_calibration(ts); calibration_mode = false; close(sock); - printf("calibration mode finished\n"); + printf("calibration mode finished, reload plugins\n"); + + clearbuf(ts); + if (ts_reconfig(ts)) { + die("ts_reconfig") + } } ret = ts_read(ts, &samp, 1); From dbf1c882dbc239065df422f9e16da955c0b7653f Mon Sep 17 00:00:00 2001 From: Peter Vicman Date: Sun, 20 Sep 2015 10:47:44 +0200 Subject: [PATCH 08/11] plugins: compile statically --- plugins/Makefile.am | 2 ++ plugins/dmc-raw.c | 6 +++++- plugins/plugins.h | 5 ++++- plugins/touchkit-raw.c | 6 +++++- src/Makefile.am | 12 ++++++++++++ src/ts_load_module.c | 12 ++++++++++++ 6 files changed, 40 insertions(+), 3 deletions(-) diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 98881b3..87fa18b 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -194,6 +194,7 @@ tatung_la_LDFLAGS = -module $(LTVSN) dmc_la_SOURCES = dmc-raw.c dmc_la_LDFLAGS = -module $(LTVSN) +dmc_la_LIBADD = $(top_builddir)/src/libts.la input_la_SOURCES = input-raw.c input_la_LDFLAGS = -module $(LTVSN) @@ -205,6 +206,7 @@ galax_la_LIBADD = $(top_builddir)/src/libts.la touchkit_la_SOURCES = touchkit-raw.c touchkit_la_LDFLAGS = -module $(LTVSN) +touchkit_la_LIBADD = $(top_builddir)/src/libts.la linear_h2200_la_SOURCES = linear-h2200.c linear_h2200_la_LDFLAGS = -module $(LTVSN) diff --git a/plugins/dmc-raw.c b/plugins/dmc-raw.c index f9f5381..59980cc 100644 --- a/plugins/dmc-raw.c +++ b/plugins/dmc-raw.c @@ -123,7 +123,7 @@ static const struct tslib_ops dmc_ops = .read = dmc_read, }; -TSAPI struct tslib_module_info *mod_init(struct tsdev *dev, const char *params) +TSAPI struct tslib_module_info *dmc_mod_init(struct tsdev *dev, const char *params) { struct tslib_dmc *m; @@ -137,3 +137,7 @@ TSAPI struct tslib_module_info *mod_init(struct tsdev *dev, const char *params) m->module.ops = &dmc_ops; return (struct tslib_module_info*)m; } + +#ifndef TSLIB_STATIC_DMC_MODULE + TSLIB_MODULE_INIT(dmc_mod_init); +#endif diff --git a/plugins/plugins.h b/plugins/plugins.h index f347e25..798f9b3 100644 --- a/plugins/plugins.h +++ b/plugins/plugins.h @@ -6,7 +6,6 @@ TSLIB_DECLARE_MODULE(dejitter); TSLIB_DECLARE_MODULE(linear_h2200); TSLIB_DECLARE_MODULE(variance); TSLIB_DECLARE_MODULE(pthres); - TSLIB_DECLARE_MODULE(ucb1x00); TSLIB_DECLARE_MODULE(corgi); TSLIB_DECLARE_MODULE(collie); @@ -16,5 +15,9 @@ TSLIB_DECLARE_MODULE(arctic2); TSLIB_DECLARE_MODULE(tatung); TSLIB_DECLARE_MODULE(input); TSLIB_DECLARE_MODULE(cy8mrln_palmpre); +TSLIB_DECLARE_MODULE(galax); +TSLIB_DECLARE_MODULE(dmc); +TSLIB_DECLARE_MODULE(touchkit); TSLIB_DECLARE_MODULE(st1232); TSLIB_DECLARE_MODULE(waveshare); + diff --git a/plugins/touchkit-raw.c b/plugins/touchkit-raw.c index e072f21..68179a3 100644 --- a/plugins/touchkit-raw.c +++ b/plugins/touchkit-raw.c @@ -144,7 +144,7 @@ static const struct tslib_ops touchkit_ops = { .read = touchkit_read, }; -TSAPI struct tslib_module_info *mod_init(struct tsdev *dev, const char *params) +TSAPI struct tslib_module_info *touchkit_mod_init(struct tsdev *dev, const char *params) { struct tslib_module_info *m; @@ -155,3 +155,7 @@ TSAPI struct tslib_module_info *mod_init(struct tsdev *dev, const char *params) m->ops = &touchkit_ops; return m; } + +#ifndef TSLIB_STATIC_TOUCHKIT_MODULE + TSLIB_MODULE_INIT(touchkit_mod_init); +#endif diff --git a/src/Makefile.am b/src/Makefile.am index 606a5ae..2f31519 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -71,6 +71,18 @@ if ENABLE_STATIC_INPUT_MODULE libts_la_SOURCES += $(top_srcdir)/plugins/input-raw.c endif +if ENABLE_STATIC_DMC_MODULE +libts_la_SOURCES += $(top_srcdir)/plugins/dmc-raw.c +endif + +if ENABLE_STATIC_GALAX_MODULE +libts_la_SOURCES += $(top_srcdir)/plugins/galax-raw.c +endif + +if ENABLE_STATIC_TOUCHKIT_MODULE +libts_la_SOURCES += $(top_srcdir)/plugins/touchkit-raw.c +endif + if ENABLE_STATIC_ST1232_MODULE libts_la_SOURCES += $(top_srcdir)/plugins/st1232-raw.c endif diff --git a/src/ts_load_module.c b/src/ts_load_module.c index 886ca0a..903c921 100644 --- a/src/ts_load_module.c +++ b/src/ts_load_module.c @@ -76,6 +76,18 @@ static const struct { #ifdef TSLIB_STATIC_ST1232_MODULE { "st1232", st1232_mod_init }, #endif +#ifdef TSLIB_STATIC_CY8MRLN_PALMPRE_MODULE + { "cy8mrln-palmpre", cy8mrln_palmpre_mod_init }, +#endif +#ifdef TSLIB_STATIC_DMC_MODULE + { "dmc", dmc_mod_init }, +#endif +#ifdef TSLIB_STATIC_TOUCHKIT_MODULE + { "touchkit", touchkit_mod_init }, +#endif +#ifdef TSLIB_STATIC_WAVESHARE_MODULE + { "waveshare", waveshare_mod_init }, +#endif }; #define countof(arr) (sizeof(arr) / sizeof((arr)[0])) From 72d2fe9e2ff18a9589510fd28e485b238a7bcbff Mon Sep 17 00:00:00 2001 From: Peter Vicman Date: Mon, 21 Sep 2015 09:36:38 +0200 Subject: [PATCH 09/11] file permission, tabs --- plugins/Makefile.am | 2 +- tests/ts_uinput_touch.c | 0 2 files changed, 1 insertion(+), 1 deletion(-) mode change 100755 => 100644 tests/ts_uinput_touch.c diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 87fa18b..4ed04c1 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -194,7 +194,7 @@ tatung_la_LDFLAGS = -module $(LTVSN) dmc_la_SOURCES = dmc-raw.c dmc_la_LDFLAGS = -module $(LTVSN) -dmc_la_LIBADD = $(top_builddir)/src/libts.la +dmc_la_LIBADD = $(top_builddir)/src/libts.la input_la_SOURCES = input-raw.c input_la_LDFLAGS = -module $(LTVSN) diff --git a/tests/ts_uinput_touch.c b/tests/ts_uinput_touch.c old mode 100755 new mode 100644 From aff635ded1b41ade1b2cf2203cdf30f7fcd61127 Mon Sep 17 00:00:00 2001 From: Peter Vicman Date: Sat, 10 Oct 2015 21:24:53 +0200 Subject: [PATCH 10/11] ts_uinput_touch: remove button right event because it breaks scrollbar, context menu is open on few seconds tap --- tests/ts_uinput_touch.c | 141 ++++++++++++------------------------------------ 1 file changed, 35 insertions(+), 106 deletions(-) diff --git a/tests/ts_uinput_touch.c b/tests/ts_uinput_touch.c index 871c5e4..92db9ce 100644 --- a/tests/ts_uinput_touch.c +++ b/tests/ts_uinput_touch.c @@ -9,9 +9,7 @@ * * * Takes tslib events and send them to uinput as - * BTN_TOUCH, BTN_RIGHT, ABS_X, ABS_Y and ABS_PRESSURE values. - * Short tap send button touch event, little longer tap send button right event - * and longer tap send only coordinates. + * ABS_X, ABS_Y, BTN_TOUCH and ABS_PRESSURE values. * Tested only with Kodi application. * * code based on @@ -79,8 +77,6 @@ char *uinput_names[] = {"/dev/uinput", "/dev/input/uinput", "/dev/misc/uinput"}; #define UINPUT_NAMES_NUM ((int) (sizeof(uinput_names)/sizeof(char *))) __u32 xres = 0, yres = 0; -struct timeval tv_short_tap = {0, 300}; /* sec, msec, short tap sends BTN_TOUCH */ -struct timeval tv_right_tap = {1, 0}; /* sec, msec, longer tap sends BTN_RIGHT */ bool calibration_mode = false; int sock = -1; @@ -164,15 +160,15 @@ static int send_event(int fd, __u16 type, __u16 code, __s32 value) } static void signal_handler(int signal_number) { - if (signal_number == SIGHUP) { - /* reload modules (and calibration data) */ - printf("signal handler %d, reconfig ts\n", signal_number); - if (ts_reconfig(ts)) { - die("ts_reconfig") - } - - return; - } else if (signal_number == SIGUSR1) + if (signal_number == SIGHUP) { + /* reload modules (and calibration data) */ + printf("signal handler %d, reconfig ts\n", signal_number); + if (ts_reconfig(ts)) { + die("ts_reconfig") + } + + return; + } else if (signal_number == SIGUSR1) calibration_mode = true; else if (signal_number == SIGUSR2) calibration_mode = false; @@ -403,20 +399,20 @@ int get_resolution(void) return 0; not_found: - env_str = getenv("TSLIB_RES_X"); - if (env_str != NULL) - xres = atoi(env_str); - - env_str = getenv("TSLIB_RES_Y"); - if (env_str != NULL) - yres = atoi(env_str); - - if (xres == 0 || yres == 0) { - xres = yres = 0; - return -1; - } - - return 0; + env_str = getenv("TSLIB_RES_X"); + if (env_str != NULL) + xres = atoi(env_str); + + env_str = getenv("TSLIB_RES_Y"); + if (env_str != NULL) + yres = atoi(env_str); + + if (xres == 0 || yres == 0) { + xres = yres = 0; + return -1; + } + + return 0; } int main(int argc, char *argv[]) @@ -428,43 +424,18 @@ int main(int argc, char *argv[]) int uinput_fd; struct uinput_user_dev uidev; int daemon = 0; - struct timeval tv_last; - struct timeval tv_sub; char *touch_str; int val; struct sigaction sa; struct sockaddr_un remote_addr; - touch_str = getenv("TSLIB_TAP_TIME"); - if (touch_str != NULL) { - val = atoi(touch_str); - if (val < 1000) { - tv_short_tap.tv_sec = 0; - tv_short_tap.tv_usec = val; - } else { - tv_short_tap.tv_sec = val / 1000; - tv_short_tap.tv_usec = val % 1000; - } - } - ret = get_resolution(); - while ((c = getopt(argc, argv, "?dt:x:y:")) != -1) { + while ((c = getopt(argc, argv, "?dx:y:")) != -1) { switch (c) { case 'd': daemon = 1; break; - case 't': - val = atoi(optarg); - if (val < 1000) { - tv_short_tap.tv_sec = 0; - tv_short_tap.tv_usec = val; - } else { - tv_short_tap.tv_sec = val / 1000; - tv_short_tap.tv_usec = val % 1000; - } - - break; case 'x': xres = atoi(optarg); break; @@ -516,16 +487,6 @@ int main(int argc, char *argv[]) if (uinput_fd < 0) die("error: opening uinput") - if (tv_short_tap.tv_sec == 0) - printf("Short tap time: %li msec\n", tv_short_tap.tv_usec); - else - printf("Short tap time: %li.%li sec\n", tv_short_tap.tv_sec, tv_short_tap.tv_usec); - - if (tv_right_tap.tv_sec == 0) - printf("Right tap time: %li msec\n", tv_right_tap.tv_usec); - else - printf("Right tap time: %li.%li sec\n", tv_right_tap.tv_sec, tv_right_tap.tv_usec); - memset (&sa, 0, sizeof (sa)); sa.sa_handler = &signal_handler; sigaction(SIGHUP, &sa, NULL); @@ -540,7 +501,6 @@ int main(int argc, char *argv[]) set_ioctl(uinput_fd, UI_SET_EVBIT, EV_SYN); set_ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY); set_ioctl(uinput_fd, UI_SET_KEYBIT, BTN_TOUCH); - set_ioctl(uinput_fd, UI_SET_KEYBIT, BTN_RIGHT); set_ioctl(uinput_fd, UI_SET_EVBIT, EV_ABS); set_ioctl(uinput_fd, UI_SET_ABSBIT, ABS_X); set_ioctl(uinput_fd, UI_SET_ABSBIT, ABS_Y); @@ -564,12 +524,7 @@ int main(int argc, char *argv[]) if (ioctl(uinput_fd, UI_DEV_CREATE) < 0) die("error: ioctl UI_DEV_CREATE") - tv_short_tap.tv_usec *= 1000; /* msec to usec */ - tv_right_tap.tv_usec *= 1000; /* msec to usec */ - - timerclear(&tv_last); while (1) { - touch_str = ""; if (calibration_mode) { usleep(250000); /* app become ready */ printf("calibration mode started\n"); @@ -614,44 +569,18 @@ int main(int argc, char *argv[]) } else if (ret != 1) continue; - send_event(uinput_fd, EV_ABS, ABS_X, samp.x); - send_event(uinput_fd, EV_ABS, ABS_Y, samp.y); - - if (samp.pressure > 0) { /* touched */ + if (samp.pressure > 0) { + touch_str = "touched"; + send_event(uinput_fd, EV_ABS, ABS_X, samp.x); + send_event(uinput_fd, EV_ABS, ABS_Y, samp.y); send_event(uinput_fd, EV_ABS, ABS_PRESSURE, 255); + send_event(uinput_fd, EV_KEY, BTN_TOUCH, 1); + send_event(uinput_fd, EV_SYN, 0, 0); + } else { + touch_str = "released"; + send_event(uinput_fd, EV_ABS, ABS_PRESSURE, 0); + send_event(uinput_fd, EV_KEY, BTN_TOUCH, 0); send_event(uinput_fd, EV_SYN, 0, 0); - - if (timerisset(&tv_last) == false) { - memcpy(&tv_last, &samp.tv, sizeof(struct timeval)); /* touched first time */ - touch_str = "touched first"; - } - } else { /* released */ - timersub(&samp.tv, &tv_last, &tv_sub); - if (timercmp(&tv_sub, &tv_short_tap, <=)) { - send_event(uinput_fd, EV_ABS, ABS_PRESSURE, 255); - send_event(uinput_fd, EV_KEY, BTN_TOUCH, 1); - send_event(uinput_fd, EV_SYN, 0, 0); - send_event(uinput_fd, EV_ABS, ABS_PRESSURE, 0); - send_event(uinput_fd, EV_KEY, BTN_TOUCH, 0); - send_event(uinput_fd, EV_SYN, 0, 0); - - touch_str = "released and send tap"; - } else if (timercmp(&tv_sub, &tv_right_tap, <=)) { - send_event(uinput_fd, EV_ABS, ABS_PRESSURE, 255); - send_event(uinput_fd, EV_KEY, BTN_RIGHT, 1); - send_event(uinput_fd, EV_SYN, 0, 0); - send_event(uinput_fd, EV_ABS, ABS_PRESSURE, 0); - send_event(uinput_fd, EV_KEY, BTN_RIGHT, 0); - send_event(uinput_fd, EV_SYN, 0, 0); - - touch_str = "released and send right"; - } else { - send_event(uinput_fd, EV_ABS, ABS_PRESSURE, 0); - send_event(uinput_fd, EV_SYN, 0, 0); - touch_str = "released"; - } - - timerclear(&tv_last); } printf("%ld.%06ld: %6d %6d %6d %s\n", samp.tv.tv_sec, samp.tv.tv_usec, From a5f00518cfe38002c47895424eda26746711a0da Mon Sep 17 00:00:00 2001 From: Peter Vicman Date: Tue, 24 Nov 2015 13:28:51 +0100 Subject: [PATCH 11/11] ts_uinput_touch: move cursor out of display after touched --- tests/ts_uinput_touch.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/tests/ts_uinput_touch.c b/tests/ts_uinput_touch.c index 92db9ce..8280b18 100644 --- a/tests/ts_uinput_touch.c +++ b/tests/ts_uinput_touch.c @@ -415,6 +415,22 @@ int get_resolution(void) return 0; } +int get_touch_home_time(void) +{ + char *env_str; + int touch_home_time = 0; + + env_str = getenv("TSLIB_TOUCH_HOME_TIME"); + if (env_str != NULL) { + touch_home_time = atoi(env_str); + if (touch_home_time < 0 || touch_home_time > 5000) + touch_home_time = 100; /* 100 msec */ + } + + touch_home_time *= 1000; /* msec to usec */ + return touch_home_time; +} + int main(int argc, char *argv[]) { int c; @@ -424,11 +440,25 @@ int main(int argc, char *argv[]) int uinput_fd; struct uinput_user_dev uidev; int daemon = 0; + int touch_home_time = 0; char *touch_str; int val; struct sigaction sa; struct sockaddr_un remote_addr; + printf("\nts_uinput_touch environment variables:\n"); + printf(" TSLIB_TSDEVICE: '%s'\n", getenv("TSLIB_TSDEVICE")); + printf(" TSLIB_PLUGINDIR: '%s'\n", getenv("TSLIB_PLUGINDIR")); + printf(" TSLIB_CONSOLEDEVICE: '%s'\n", getenv("TSLIB_CONSOLEDEVICE")); + printf(" TSLIB_FBDEVICE: '%s'\n", getenv("TSLIB_FBDEVICE")); + printf(" TSLIB_CALIBFILE: '%s'\n", getenv("TSLIB_CALIBFILE")); + printf(" TSLIB_CONFFILE: '%s'\n", getenv("TSLIB_CONFFILE")); + printf(" TSLIB_RES_X: '%s'\n", getenv("TSLIB_RES_X")); + printf(" TSLIB_RES_Y: '%s'\n", getenv("TSLIB_RES_Y")); + printf("TSLIB_TOUCH_HOME_TIME: '%s'\n", getenv("TSLIB_TOUCH_HOME_TIME")); + printf("\n"); + + touch_home_time = get_touch_home_time(); ret = get_resolution(); while ((c = getopt(argc, argv, "?dx:y:")) != -1) { @@ -581,6 +611,13 @@ int main(int argc, char *argv[]) send_event(uinput_fd, EV_ABS, ABS_PRESSURE, 0); send_event(uinput_fd, EV_KEY, BTN_TOUCH, 0); send_event(uinput_fd, EV_SYN, 0, 0); + + if (touch_home_time > 0) { + usleep(touch_home_time); /* short delay for kodi */ + send_event(uinput_fd, EV_ABS, ABS_X, -50); /* hide cursor */ + send_event(uinput_fd, EV_ABS, ABS_Y, -50); + send_event(uinput_fd, EV_SYN, 0, 0); + } } printf("%ld.%06ld: %6d %6d %6d %s\n", samp.tv.tv_sec, samp.tv.tv_usec, ================================================ FILE: packages/addons/addon-depends/tslib/patches/tslib-20-fbutils_fix_x64_execution.patch ================================================ From c4c59790f3191c1a233fc1a61f8fedad85de1aeb Mon Sep 17 00:00:00 2001 From: Peter Fink Date: Wed, 8 Feb 2017 14:04:45 +0100 Subject: [PATCH] fbutils: Fix x64 execution. Call malloc not with a hardcoded sizeof(__u32). This caused the application to crash with segfaults on x64 machines. --- tests/fbutils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fbutils.c b/tests/fbutils.c index 8ee494bc..fd7fbfe9 100644 --- a/tests/fbutils.c +++ b/tests/fbutils.c @@ -138,7 +138,7 @@ int open_framebuffer(void) memset(fbuffer,0,fix.smem_len); bytes_per_pixel = (var.bits_per_pixel + 7) / 8; - line_addr = malloc (sizeof (__u32) * var.yres_virtual); + line_addr = malloc (sizeof (line_addr) * var.yres_virtual); addr = 0; for (y = 0; y < var.yres_virtual; y++, addr += fix.line_length) line_addr [y] = fbuffer + addr; ================================================ FILE: packages/addons/addon-depends/tslib/patches/tslib-30-support-time-bits-64.patch ================================================ --- a/plugins/galax-raw.c 2022-07-21 15:46:14.666220340 +0000 +++ b/plugins/galax-raw.c 2022-07-22 01:11:26.708402821 +0000 @@ -198,7 +198,8 @@ samp->x = i->current_x; samp->y = i->current_y; samp->pressure = i->current_p; - samp->tv = ev.time; + samp->tv.tv_sec = ev.input_event_sec; + samp->tv.tv_usec = ev.input_event_usec; samp++; total++; break; --- a/plugins/input-raw.c 2013-08-08 00:23:04.000000000 +0000 +++ b/plugins/input-raw.c 2022-07-22 01:30:41.417546206 +0000 @@ -179,7 +179,8 @@ samp->y = i->current_y; samp->pressure = i->current_p; } - samp->tv = ev.time; + samp->tv.tv_sec = ev.input_event_sec; + samp->tv.tv_usec = ev.input_event_usec; #ifdef DEBUG fprintf(stderr, "RAW---------------------> %d %d %d %d.%d\n", samp->x, samp->y, samp->pressure, samp->tv.tv_sec, @@ -262,7 +263,8 @@ samp->pressure = i->current_p = ev.value; break; } - samp->tv = ev.time; + samp->tv.tv_sec = ev.input_event_sec; + samp->tv.tv_usec = ev.input_event_usec; #ifdef DEBUG fprintf(stderr, "RAW---------------------------> %d %d %d\n", samp->x, samp->y, samp->pressure); @@ -278,7 +280,8 @@ samp->x = 0; samp->y = 0; samp->pressure = 0; - samp->tv = ev.time; + samp->tv.tv_sec = ev.input_event_sec; + samp->tv.tv_usec = ev.input_event_usec; samp++; total++; } --- a/plugins/st1232-raw.c 2022-07-22 01:31:02.757483058 +0000 +++ b/plugins/st1232-raw.c 2022-07-22 01:27:40.174757983 +0000 @@ -162,7 +162,8 @@ samp->x = i->current_x; samp->y = i->current_y; samp->pressure = i->current_p; /* is 0 on finger released */ - samp->tv = ev.time; + samp->tv.tv_sec = ev.input_event_sec; + samp->tv.tv_usec = ev.input_event_usec; i->current_p = 0; /* will be set again when getting xy cordinate */ samp++; ================================================ FILE: packages/addons/addon-depends/ttyd-depends/libuv/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libuv" PKG_VERSION="1.44.2" PKG_SHA256="e6e2ba8b4c349a4182a33370bb9be5e23c51b32efb9b9e209d0e8556b73a48da" PKG_LICENSE="MIT" PKG_SITE="https://github.com/libuv/libuv" PKG_URL="https://github.com/libuv/libuv/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Multi-platform support library with a focus on asynchronous I/O" PKG_CMAKE_OPTS_TARGET="-DLIBUV_BUILD_TESTS=OFF" ================================================ FILE: packages/addons/addon-depends/ttyd-depends/libwebsockets/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libwebsockets" PKG_VERSION="4.3.2" PKG_SHA256="6a85a1bccf25acc7e8e5383e4934c9b32a102880d1e4c37c70b27ae2a42406e1" PKG_LICENSE="MIT" PKG_SITE="https://libwebsockets.org" PKG_URL="https://github.com/warmcat/libwebsockets/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain openssl json-c libuv" PKG_LONGDESC="Library for implementing network protocols with a tiny footprint." PKG_CMAKE_OPTS_TARGET="-DLWS_WITH_LIBUV=ON \ -DLWS_WITHOUT_TESTAPPS=ON" ================================================ FILE: packages/addons/addon-depends/tvh-dtv-scan-tables/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tvh-dtv-scan-tables" PKG_VERSION="e3138a506a064f6dfd0639d69f383e8e576609da" PKG_SHA256="b055e1f91dec43ba268b0feafac1dd23c1ca37613cc429c4be74c0c2606ad253" PKG_LICENSE="GPL" PKG_SITE="https://github.com/tvheadend" PKG_URL="https://github.com/tvheadend/dtv-scan-tables/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Digital TV scan tables, a fork from Tvh to support more recent tables." PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="-sysroot" makeinstall_target() { make install DATADIR=${INSTALL}/usr/share } ================================================ FILE: packages/addons/addon-depends/vdr/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2011 Anthony Nash (nash.ant@gmail.com) # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vdr" PKG_VERSION="2.6.3" PKG_SHA256="3db99b7ebbc0a60b72b191785af27efd49385bd08ef9fb7a8a83694323954ccf" PKG_LICENSE="GPL" PKG_SITE="http://www.tvdr.de" PKG_URL="http://git.tvdr.de/?p=vdr.git;a=snapshot;h=refs/tags/${PKG_VERSION};sf=tbz2" PKG_SOURCE_NAME="${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain bzip2 fontconfig freetype libcap libiconv libjpeg-turbo" PKG_LONGDESC="A DVB TV server application." PKG_TOOLCHAIN="manual" post_unpack() { rm -rf ${PKG_BUILD}/PLUGINS/src/skincurses } pre_configure_target() { export LDFLAGS="$(echo ${LDFLAGS} | sed -e "s|-Wl,--as-needed||") -L${SYSROOT_PREFIX}/usr/lib/iconv" } pre_make_target() { cat > Make.config < Subject: [PATCH] decrease channels.conf autosave delay --- a/vdr.c +++ b/vdr.c @@ -80,7 +80,7 @@ #define SHUTDOWNCANCELPROMPT 5 // seconds to wait in user prompt to allow canceling shutdown #define RESTARTCANCELPROMPT 5 // seconds to wait in user prompt before restarting on SIGHUP #define MANUALSTART 600 // seconds the next timer must be in the future to assume manual start -#define CHANNELSAVEDELTA 600 // seconds before saving channels.conf after automatic modifications +#define CHANNELSAVEDELTA 120 // seconds before saving channels.conf after automatic modifications #define DEVICEREADYTIMEOUT 30 // seconds to wait until all devices are ready #define MENUTIMEOUT 120 // seconds of user inactivity after which an OSD display is closed #define TIMERCHECKDELTA 10 // seconds between checks for timers that need to see their channel ================================================ FILE: packages/addons/addon-depends/vdr/patches/vdr-02-disable-logspam.patch ================================================ remove logspam ERROR: no OSD provider available - using dummy OSD! --- a/osd.c +++ b/osd.c @@ -2029,8 +2029,6 @@ cOsd *cOsdProvider::NewOsd(int Left, int Top, uint Level) } return Osd; } - else - esyslog("ERROR: no OSD provider available - using dummy OSD!"); return new cOsd(Left, Top, 999); // create a dummy cOsd, so that access won't result in a segfault } --- a/vdr.c +++ b/vdr.c @@ -784,11 +784,6 @@ int main(int argc, char *argv[]) Folders.Load(AddDirectory(ConfigDirectory, "folders.conf")); CamResponsesLoad(AddDirectory(ConfigDirectory, "camresponses.conf"), true); - if (!*cFont::GetFontFileName(Setup.FontOsd)) { - const char *msg = "no fonts available - OSD will not show any text!"; - fprintf(stderr, "vdr: %s\n", msg); - esyslog("ERROR: %s", msg); - } // Recordings: ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-ddci2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vdr-plugin-ddci2" PKG_VERSION="05dd98824092859afd2aa7a4996c8f258affd975" PKG_SHA256="b8ed2787e9140eb00a68397eaeb14862ba88a6e73480dc3220a098faffb14833" PKG_LICENSE="GPL" PKG_SITE="https://github.com/jasmin-j/vdr-plugin-ddci2" PKG_URL="https://github.com/jasmin-j/vdr-plugin-ddci2/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain vdr" PKG_NEED_UNPACK="$(get_pkg_directory vdr)" PKG_LONGDESC="Support for stand alone CI by Digital Devices." PKG_TOOLCHAIN="manual" make_target() { VDR_DIR=$(get_build_dir vdr) export PKG_CONFIG_PATH=${VDR_DIR}:${PKG_CONFIG_PATH} export CPLUS_INCLUDE_PATH=${VDR_DIR}/include make \ LIBDIR="." \ LOCDIR="./locale" \ all } post_make_target() { VDR_DIR=$(get_build_dir vdr) VDR_APIVERSION=$(sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$/\1/p' ${VDR_DIR}/config.h) LIB_NAME=lib${PKG_NAME/-plugin/} cp --remove-destination ${PKG_BUILD}/${LIB_NAME}.so ${PKG_BUILD}/${LIB_NAME}.so.${VDR_APIVERSION} ${STRIP} libvdr-*.so* } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-dummydevice/package.mk ================================================ # 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) PKG_NAME="vdr-plugin-dummydevice" PKG_VERSION="2.0.0" PKG_SHA256="5c0049824415bd463d3abc728a3136ee064b60a37b5d3a1986cf282b0d757085" PKG_LICENSE="GPL" PKG_SITE="http://www.vdr-wiki.de/wiki/index.php/Dummydevice-plugin" PKG_URL="http://phivdr.dyndns.org/vdr/vdr-dummydevice/${PKG_NAME/-plugin/}-${PKG_VERSION}.tgz" PKG_DEPENDS_TARGET="toolchain vdr" PKG_NEED_UNPACK="$(get_pkg_directory vdr)" PKG_LONGDESC="This plugin can be used to run vdr as recording server without any output devices." PKG_TOOLCHAIN="manual" make_target() { VDR_DIR=$(get_build_dir vdr) export PKG_CONFIG_PATH=${VDR_DIR}:${PKG_CONFIG_PATH} export CPLUS_INCLUDE_PATH=${VDR_DIR}/include make \ LIBDIR="." \ LOCDIR="./locale" \ all install-i18n } post_make_target() { VDR_DIR=$(get_build_dir vdr) VDR_APIVERSION=$(sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$/\1/p' ${VDR_DIR}/config.h) LIB_NAME=lib${PKG_NAME/-plugin/} cp --remove-destination ${LIB_NAME}.so ${LIB_NAME}.so.${VDR_APIVERSION} } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-dvbapi/package.mk ================================================ # 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) PKG_NAME="vdr-plugin-dvbapi" PKG_VERSION="197e7524e563923d4b86e74a121f7174373818d9" PKG_SHA256="6eee60d524c185f1f72c4413e79a80619934508b75aa27f213b2f481182ec6fb" PKG_LICENSE="GPL" PKG_SITE="https://github.com/manio/vdr-plugin-dvbapi" PKG_URL="https://github.com/manio/vdr-plugin-dvbapi/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain vdr libdvbcsa" PKG_NEED_UNPACK="$(get_pkg_directory vdr)" PKG_LONGDESC="VDR dvbapi plugin for use with OSCam" PKG_TOOLCHAIN="manual" make_target() { VDR_DIR=$(get_build_dir vdr) export PKG_CONFIG_PATH=${VDR_DIR}:${PKG_CONFIG_PATH} export CPLUS_INCLUDE_PATH=${VDR_DIR}/include make \ LIBDIR="." \ LOCDIR="./locale" \ LIBDVBCSA=1 \ all install-i18n } post_make_target() { VDR_DIR=$(get_build_dir vdr) VDR_APIVERSION=$(sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$/\1/p' ${VDR_DIR}/config.h) LIB_NAME=lib${PKG_NAME/-plugin/} cp --remove-destination ${PKG_BUILD}/${LIB_NAME}.so ${PKG_BUILD}/${LIB_NAME}.so.${VDR_APIVERSION} } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-dvbapi/patches/vdr-plugin-dvbapi-01_crosscompiling.patch ================================================ --- a/Makefile +++ b/Makefile @@ -136,7 +136,7 @@ $(SOFILE): $(OBJS) $(FFDECSA) ifndef LIBDVBCSA $(FFDECSA): $(FFDECSADIR)/*.c $(FFDECSADIR)/*.h @echo CC $@ - $(Q)@$(MAKE) COMPILER="$(CXX)" FLAGS="$(CXXFLAGS) $(LDFLAGS) $(CSAFLAGS)" PARALLEL_MODE=$(PARALLEL) -C $(FFDECSADIR) all + $(Q)@$(MAKE) COMPILER="$(CXX)" FLAGS="$(CXXFLAGS) $(LDFLAGS) $(CSAFLAGS)" PARALLEL_MODE=$(PARALLEL) -C $(FFDECSADIR) FFdecsa.o endif install-lib: $(SOFILE) ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-eepg/package.mk ================================================ # 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) PKG_NAME="vdr-plugin-eepg" PKG_VERSION="6be7f2ee644aa33bd6e6e038548be8a85514272e" PKG_SHA256="f8698d8e72c4e1239a57ba4a0b2f54020270506d5dce7298f3080fcc8d59f56f" PKG_LICENSE="GPL" PKG_SITE="http://projects.vdr-developer.org/projects/plg-eepg" PKG_URL="https://github.com/vdr-projects/vdr-plugin-eepg/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain vdr" PKG_NEED_UNPACK="$(get_pkg_directory vdr)" PKG_LONGDESC="This plugin parses the Extended EPG data which is send by providers on their portal channels." PKG_TOOLCHAIN="manual" make_target() { VDR_DIR=$(get_build_dir vdr) export PKG_CONFIG_PATH=${VDR_DIR}:${PKG_CONFIG_PATH} export CPLUS_INCLUDE_PATH=${VDR_DIR}/include make \ LIBDIR="." \ LOCDIR="./locale" \ all install-i18n } post_make_target() { VDR_DIR=$(get_build_dir vdr) VDR_APIVERSION=$(sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$/\1/p' ${VDR_DIR}/config.h) LIB_NAME=lib${PKG_NAME/-plugin/} cp --remove-destination ${PKG_BUILD}/${LIB_NAME}.so ${PKG_BUILD}/${LIB_NAME}.so.${VDR_APIVERSION} } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-epgfixer/package.mk ================================================ # 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) PKG_NAME="vdr-plugin-epgfixer" PKG_VERSION="354f28b0112ba27f08f6509243b410899f74b6ed" PKG_SHA256="15bd73116f3bda9afc274bee97eff829b98f38b13043be32d7bb7f81af294715" PKG_LICENSE="GPL" PKG_SITE="http://projects.vdr-developer.org/projects/plg-epgfixer" PKG_URL="https://github.com/vdr-projects/vdr-plugin-epgfixer/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain vdr pcre" PKG_NEED_UNPACK="$(get_pkg_directory vdr)" PKG_LONGDESC="Plugin for modifying EPG data using regular expressions." PKG_TOOLCHAIN="manual" make_target() { VDR_DIR=$(get_build_dir vdr) export PKG_CONFIG_PATH=${VDR_DIR}:${PKG_CONFIG_PATH} export CPLUS_INCLUDE_PATH=${VDR_DIR}/include make \ LIBDIR="." \ LOCDIR="./locale" \ all install-i18n } post_make_target() { VDR_DIR=$(get_build_dir vdr) VDR_APIVERSION=$(sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$/\1/p' ${VDR_DIR}/config.h) LIB_NAME=lib${PKG_NAME/-plugin/} cp --remove-destination ${PKG_BUILD}/${LIB_NAME}.so ${PKG_BUILD}/${LIB_NAME}.so.${VDR_APIVERSION} } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-epgsearch/package.mk ================================================ # 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) PKG_NAME="vdr-plugin-epgsearch" PKG_VERSION="cff8dfe58853aa0cc4f6e9a8896104a920b98730" PKG_SHA256="ad6521003ab41b76ba22cac3b086901700ed2b46ea3d48f71d28b0545cf17e94" PKG_LICENSE="GPL" PKG_SITE="http://winni.vdr-developer.org/epgsearch/" PKG_URL="https://github.com/vdr-projects/vdr-plugin-epgsearch/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain vdr pcre" PKG_NEED_UNPACK="$(get_pkg_directory vdr)" PKG_LONGDESC="EPGSearch is a plugin for the Video-Disc-Recorder (VDR)." PKG_TOOLCHAIN="manual" make_target() { VDR_DIR=$(get_build_dir vdr) export PKG_CONFIG_PATH=${VDR_DIR}:${PKG_CONFIG_PATH} export CPLUS_INCLUDE_PATH=${VDR_DIR}/include make \ LIBDIR="." \ LOCDIR="./locale" \ all install-i18n } post_make_target() { VDR_DIR=$(get_build_dir vdr) VDR_APIVERSION=$(sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$/\1/p' ${VDR_DIR}/config.h) LIB_NAME=lib${PKG_NAME/-plugin/} cp --remove-destination ${PKG_BUILD}/${LIB_NAME}.so ${PKG_BUILD}/${LIB_NAME}.so.${VDR_APIVERSION} } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-epgsearch/patches/vdr-plugin-epgsearch-02_don-t-build-unused-plugins.patch ================================================ From: Stefan Saraev Subject: [PATCH] don't build unused plugins --- a/Makefile +++ b/Makefile @@ -16,9 +16,9 @@ ### edit one of these lines to '1', if you don't want the addon epgsearchonly, ### conflictcheckonly or quickepgsearch -WITHOUT_EPGSEARCHONLY=0 -WITHOUT_CONFLICTCHECKONLY=0 -WITHOUT_QUICKSEARCH=0 +WITHOUT_EPGSEARCHONLY=1 +WITHOUT_CONFLICTCHECKONLY=1 +WITHOUT_QUICKSEARCH=1 ### edit this to '0' if you don't want epgsearch to auto config itself AUTOCONFIG=1 ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-epgsearch/patches/vdr-plugin-epgsearch-03-no_docs.patch ================================================ --- a/Makefile 2021-01-13 00:12:27.752044046 +0100 +++ b/Makefile 2021-01-13 00:24:08.199000066 +0100 @@ -184,7 +184,7 @@ LIBS4 = ### The main target: -all: $(ALL) i18n docs +all: $(ALL) i18n ### Implicit rules: ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-iptv/package.mk ================================================ # 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) PKG_NAME="vdr-plugin-iptv" PKG_VERSION="f7369c9578c1437c7a19cf11e21424844f42a341" PKG_SHA256="9045ec034182d19535ab3478152ef6a7fd2640478c78d697d2f2c93f11482316" PKG_LICENSE="GPL" PKG_SITE="http://www.saunalahti.fi/~rahrenbe/vdr/iptv/" PKG_URL="https://github.com/rofafor/vdr-plugin-iptv/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain vdr curl" PKG_NEED_UNPACK="$(get_pkg_directory vdr)" PKG_LONGDESC="vdr-iptv is an IPTV plugin for the Video Disk Recorder (VDR)" PKG_TOOLCHAIN="manual" make_target() { VDR_DIR=$(get_build_dir vdr) export PKG_CONFIG_PATH=${VDR_DIR}:${PKG_CONFIG_PATH} export CPLUS_INCLUDE_PATH=${VDR_DIR}/include make \ LIBDIR="." \ LOCDIR="./locale" \ all install-i18n } post_make_target() { VDR_DIR=$(get_build_dir vdr) VDR_APIVERSION=$(sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$/\1/p' ${VDR_DIR}/config.h) LIB_NAME=lib${PKG_NAME/-plugin/} cp --remove-destination ${PKG_BUILD}/${LIB_NAME}.so ${PKG_BUILD}/${LIB_NAME}.so.${VDR_APIVERSION} } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-live/package.mk ================================================ # 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) PKG_NAME="vdr-plugin-live" PKG_VERSION="3.1.6" PKG_SHA256="8231f22d397b6cc954615304a12319fb74553aa67fbf12536b1df6727f69b8a2" PKG_LICENSE="GPL" PKG_SITE="http://live.vdr-developer.org/en/index.php" PKG_URL="https://github.com/MarkusEh/vdr-plugin-live/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain vdr tntnet pcre2:host pcre2" PKG_NEED_UNPACK="$(get_pkg_directory vdr)" PKG_LONGDESC="Allows a comfortable operation of VDR and some of its plugins through a web interface." PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="+pic -parallel" pre_configure_target() { export LDFLAGS="${LDFLAGS} -L${SYSROOT_PREFIX}/usr/lib/iconv" } make_target() { VDR_DIR=$(get_build_dir vdr) export CPLUS_INCLUDE_PATH=${VDR_DIR}/include VDR_APIVERSION=$(sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$/\1/p' ${VDR_DIR}/config.h) LIB_NAME=lib${PKG_NAME/-plugin/} make VDRDIR=${VDR_DIR} \ LIBDIR="." \ LOCALEDIR="./locale" \ all install-i18n cp --remove-destination ${PKG_BUILD}/${LIB_NAME}.so ${PKG_BUILD}/${LIB_NAME}.so.${VDR_APIVERSION} } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-restfulapi/package.mk ================================================ # 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) PKG_NAME="vdr-plugin-restfulapi" PKG_VERSION="0.2.6.6" PKG_SHA256="a392c8ac9da58bce06674208711a786209ce802e77f93b48d21e424fa79f5eba" PKG_LICENSE="GPL" PKG_SITE="https://github.com/yavdr/vdr-plugin-restfulapi" PKG_URL="https://github.com/yavdr/${PKG_NAME}/archive/refs/tags/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain vdr cxxtools vdr-plugin-wirbelscan" PKG_NEED_UNPACK="$(get_pkg_directory vdr) $(get_pkg_directory vdr-plugin-wirbelscan)" PKG_LONGDESC="Allows to access many internals of the VDR via a restful API." PKG_TOOLCHAIN="manual" pre_build_target() { cp $(get_build_dir vdr-plugin-wirbelscan)/wirbelscan_services.h ${PKG_BUILD}/wirbelscan/ } make_target() { VDR_DIR=$(get_build_dir vdr) export PKG_CONFIG_PATH=${VDR_DIR}:${PKG_CONFIG_PATH} export CPLUS_INCLUDE_PATH=${VDR_DIR}/include make \ LIBDIR="." \ LOCDIR="./locale" \ all install-i18n \ USE_LIBMAGICKPLUSPLUS=0 } post_make_target() { VDR_DIR=$(get_build_dir vdr) VDR_APIVERSION=$(sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$/\1/p' ${VDR_DIR}/config.h) LIB_NAME=lib${PKG_NAME/-plugin/} cp --remove-destination ${PKG_BUILD}/${LIB_NAME}.so ${PKG_BUILD}/${LIB_NAME}.so.${VDR_APIVERSION} } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-restfulapi/patches/vdr-plugin-restfulapi-01-static-lib-order.patch ================================================ --- a/Makefile 2016-10-16 11:52:25.000000000 +0200 +++ b/Makefile 2021-06-23 22:49:33.447650255 +0200 @@ -51,7 +51,7 @@ SOFILE = libvdr-$(PLUGIN).so DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"' -LIBS += $(shell cxxtools-config --libs) -lcxxtools-http +LIBS += -lcxxtools-http $(shell cxxtools-config --libs) -lssl CONFDIR = $(call PKGCFG,configdir) PLGCONFDIR = $(CONFDIR)/plugins/$(PLUGIN) ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-restfulapi/patches/vdr-plugin-restfulapi-02-webapp-path.patch ================================================ --- a/tools.cpp +++ b/tools.cpp @@ -214,7 +214,7 @@ void Settings::initDefault() SetIp((string)"0.0.0.0"); SetEpgImageDirectory((string)"/var/cache/vdr/epgimages"); SetChannelLogoDirectory((string)"/usr/share/vdr/channel-logos"); - SetWebappDirectory((string)"/var/lib/vdr/plugins/restfulapi/webapp"); + SetWebappDirectory((string)"/storage/.kodi/addons/service.multimedia.vdr-addon/res/plugins/restfulapi"); SetHeaders((string)"true"); webapp_filetypes_filename = "webapp_file_types.conf"; } --- a/tools.h +++ b/tools.h @@ -40,7 +40,7 @@ #define RESTFULAPI_EXTENSIONS #ifndef DOCUMENT_ROOT -#define DOCUMENT_ROOT "/var/lib/vdr/plugins/restfulapi/" +#define DOCUMENT_ROOT "/storage/.kodi/addons/service.multimedia.vdr-addon/res/plugins/restfulapi/" #endif class Settings ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-robotv/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vdr-plugin-robotv" PKG_VERSION="f521e57e947468b54288f696bdcae8e6485c6167" PKG_SHA256="3f949fca133bdab690f0a5b4bb7d77a52e1b94c94fc8d815c2c203e9f06a6622" PKG_LICENSE="GPL" PKG_SITE="https://github.com/pipelka/roboTV" PKG_URL="https://github.com/pipelka/vdr-plugin-robotv/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain vdr avahi" PKG_NEED_UNPACK="$(get_pkg_directory vdr)" PKG_LONGDESC="RoboTV is a Android TV based frontend for VDR." PKG_TOOLCHAIN="cmake" pre_configure_target() { VDR_DIR=$(get_build_dir vdr) export PKG_CONFIG_PATH=${VDR_DIR}:${PKG_CONFIG_PATH} export CPLUS_INCLUDE_PATH=${VDR_DIR}/include export VDRDIR=${VDR_DIR} } post_make_target() { VDR_DIR=$(get_build_dir vdr) VDR_APIVERSION=$(sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$/\1/p' ${VDR_DIR}/config.h) LIB_NAME=lib${PKG_NAME/-plugin/} cp --remove-destination ${PKG_BUILD}/.${TARGET_NAME}/${LIB_NAME}.so ${PKG_BUILD}/${LIB_NAME}.so.${VDR_APIVERSION} } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-satip/package.mk ================================================ # 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) PKG_NAME="vdr-plugin-satip" PKG_VERSION="0a216f1cf9d6401b1afbff420f4fa244ec15d299" PKG_SHA256="817900c9fa5ade5c52b0391b791f801832c57bdbed5e7501d7e92b4fe29de816" PKG_LICENSE="GPL" PKG_SITE="http://www.saunalahti.fi/~rahrenbe/vdr/satip/" PKG_URL="https://github.com/rofafor/vdr-plugin-satip/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain vdr curl tinyxml" PKG_NEED_UNPACK="$(get_pkg_directory vdr)" PKG_LONGDESC="This is an SAT>IP plugin for the Video Disk Recorder (VDR)." PKG_TOOLCHAIN="manual" make_target() { VDR_DIR=$(get_build_dir vdr) export PKG_CONFIG_PATH=${VDR_DIR}:${PKG_CONFIG_PATH} export CPLUS_INCLUDE_PATH=${VDR_DIR}/include make \ SATIP_USE_TINYXML=1 \ LIBDIR="." \ LOCDIR="./locale" \ all install-i18n } post_make_target() { VDR_DIR=$(get_build_dir vdr) VDR_APIVERSION=$(sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$/\1/p' ${VDR_DIR}/config.h) LIB_NAME=lib${PKG_NAME/-plugin/} cp --remove-destination ${PKG_BUILD}/${LIB_NAME}.so ${PKG_BUILD}/${LIB_NAME}.so.${VDR_APIVERSION} } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-streamdev/package.mk ================================================ # 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) PKG_NAME="vdr-plugin-streamdev" PKG_VERSION="e2a9b979d3fb92967c7a6a8221e674eb7e55c813" PKG_SHA256="adcc08ac19cf98122576bedf63be3396d8b81ee4196c00df0e25c9fb8b7e11b8" PKG_LICENSE="GPL" PKG_SITE="http://projects.vdr-developer.org/projects/plg-streamdev" PKG_URL="https://github.com/vdr-projects/vdr-plugin-streamdev/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain vdr openssl" PKG_NEED_UNPACK="$(get_pkg_directory vdr)" PKG_LONGDESC="This PlugIn is a VDR implementation of Video Transfer and a basic HTTP Streaming Protocol." PKG_TOOLCHAIN="manual" make_target() { VDR_DIR=$(get_build_dir vdr) export PKG_CONFIG_PATH=${VDR_DIR}:${PKG_CONFIG_PATH} export CPLUS_INCLUDE_PATH=${VDR_DIR}/include make \ LIBDIR="." \ LOCDIR="./locale" \ all } post_make_target() { VDR_DIR=$(get_build_dir vdr) VDR_APIVERSION=$(sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$/\1/p' ${VDR_DIR}/config.h) LIB_NAME=lib${PKG_NAME/-plugin/} cp --remove-destination ${PKG_BUILD}/server/${LIB_NAME}-server.so ${PKG_BUILD}/server/${LIB_NAME}-server.so.${VDR_APIVERSION} cp --remove-destination ${PKG_BUILD}/client/${LIB_NAME}-client.so ${PKG_BUILD}/client/${LIB_NAME}-client.so.${VDR_APIVERSION} } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-streamdev/patches/vdr-plugin-streamdev-01_4k_hevc_support.patch ================================================ http://www.vdr-portal.de/board17-developer/board97-vdr-core/p1272182-rfc-h-265-frame-parser/#post1272182 --- a/server/livestreamer.c +++ b/server/livestreamer.c @@ -143,6 +143,8 @@ "ISO/IEC 14496-3 Audio with LATM transport syntax", "0x12", "0x13", "0x14", "0x15", "0x16", "0x17", "0x18", "0x19", "0x1a", "ISO/IEC 14496-10 Video (MPEG-4 part 10/AVC, aka H.264)", + "0x1c", "0x1d", "0x1e", "0x1f", "0x20", "0x21", "0x22","0x23", + "HEVC aka H.265", "", }; @@ -171,6 +173,7 @@ case 0x10: // ISO/IEC 14496-2 Visual (MPEG-4) case 0x11: // ISO/IEC 14496-3 Audio with LATM transport syntax case 0x1b: // ISO/IEC 14496-10 Video (MPEG-4 part 10/AVC, aka H.264) + case 0x24: // HEVC aka H.265 Dprintf("cStreamdevPatFilter PMT scanner adding PID %d (%s)\n", stream.getPid(), psStreamTypes[stream.getStreamType()]); return stream.getPid(); ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-streamdev/patches/vdr-plugin-streamdev-02_2.3.9_lock_fix.patch ================================================ https://www.vdr-portal.de/forum/index.php?thread/131708-gel%C3%B6st-vdr-2-3-9-h%C3%A4ngt-bei-der-wiedergabe-von-aufnahmen-mit-rpihddevice/&postID=1303098#post1303098 diff --git a/client/device.c b/client/device.c index a810f53..2e54e34 100644 --- a/client/device.c +++ b/client/device.c @@ -190,7 +190,6 @@ bool cStreamdevDevice::SetChannelDevice(const cChannel *Channel, bool cStreamdevDevice::SetPid(cPidHandle *Handle, int Type, bool On) { Dprintf("SetPid, Pid=%d, Type=%d, On=%d, used=%d\n", Handle->pid, Type, On, Handle->used); - LOCK_THREAD; bool res = true; if (Handle->pid && (On || !Handle->used)) { ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-streamdev/patches/vdr-plugin-streamdev-03_i18n.patch ================================================ --- a/Makefile 2017-09-30 21:31:48.000000000 +0200 +++ b/Makefile 2021-01-12 23:26:57.857536391 +0100 @@ -71,12 +71,14 @@ all: client server client: $(MAKE) -C ./tools $(MAKE) -C ./client + $(MAKE) -C ./client install-i18n server: $(MAKE) -C ./tools $(MAKE) -C ./libdvbmpeg $(MAKE) -C ./remux $(MAKE) -C ./server + $(MAKE) -C ./server install-i18n install-client: client $(MAKE) -C ./client install ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-streamdev/patches/vdr-plugin-streamdev-04_fix_vdr_2.6.x_build_error.patch ================================================ diff -r -Bc a/server/connectionVTP.c b/server/connectionVTP.c *** a/server/connectionVTP.c 2021-05-22 10:33:01.633332698 +0200 --- b/server/connectionVTP.c 2021-05-22 10:27:50.000000000 +0200 *************** *** 1882,1888 **** #endif } else { ! cDevice::SetCurrentChannel(CurrentChannel); } } isyslog("channel %d moved to %d", FromNumber, ToNumber); --- 1882,1888 ---- #endif } else { ! cDevice::SetCurrentChannel(CurrentChannel->Number()); } } isyslog("channel %d moved to %d", FromNumber, ToNumber); *************** *** 1983,1989 **** Channels.SwitchTo(CurrentChannel->Number()); #endif else ! cDevice::SetCurrentChannel(CurrentChannel); } Reply(250, "Channel \"%s\" deleted", Option); } --- 1983,1989 ---- Channels.SwitchTo(CurrentChannel->Number()); #endif else ! cDevice::SetCurrentChannel(CurrentChannel->Number()); } Reply(250, "Channel \"%s\" deleted", Option); } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-vnsiserver/package.mk ================================================ # 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) PKG_NAME="vdr-plugin-vnsiserver" PKG_VERSION="47a90dd9298753083a9a6482bb9990ea9a88aa7a" PKG_SHA256="cd8087306dc5d77b150ca9f77bba91460507dc9a2336b9f61ce13aeefecf23e3" PKG_LICENSE="GPL" PKG_SITE="https://github.com/mdre77/vdr-plugin-vnsiserver" PKG_URL="https://github.com/mdre77/vdr-plugin-vnsiserver/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain vdr" PKG_NEED_UNPACK="$(get_pkg_directory vdr) $(get_pkg_directory vdr-plugin-wirbelscan)" PKG_LONGDESC="VDR plugin to handle Kodi clients." PKG_TOOLCHAIN="manual" pre_build_target() { WIRBELSCAN_DIR=$(get_build_dir vdr-plugin-wirbelscan) ln -sf ${WIRBELSCAN_DIR}/wirbelscan_services.h ${PKG_BUILD} } make_target() { VDR_DIR=$(get_build_dir vdr) export PKG_CONFIG_PATH=${VDR_DIR}:${PKG_CONFIG_PATH} export CPLUS_INCLUDE_PATH=${VDR_DIR}/include make \ LIBDIR="." \ LOCDIR="./locale" \ all install-i18n } post_make_target() { VDR_DIR=$(get_build_dir vdr) VDR_APIVERSION=$(sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$/\1/p' ${VDR_DIR}/config.h) LIB_NAME=lib${PKG_NAME/-plugin/} cp --remove-destination ${PKG_BUILD}/${LIB_NAME}.so ${PKG_BUILD}/${LIB_NAME}.so.${VDR_APIVERSION} } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-wirbelscan/package.mk ================================================ # 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) PKG_NAME="vdr-plugin-wirbelscan" PKG_VERSION="2021.03.07" PKG_SHA256="9267ebd12a3a58e0ae453f6e311782262ae0782b25721cc8d7e5048a76cb3759" PKG_LICENSE="GPL" PKG_SITE="https://www.gen2vdr.de/wirbel/wirbelscan/index2.html" PKG_URL="https://www.gen2vdr.de/wirbel/wirbelscan/vdr-wirbelscan-${PKG_VERSION}.tgz" PKG_DEPENDS_TARGET="toolchain vdr" PKG_NEED_UNPACK="$(get_pkg_directory vdr)" PKG_LONGDESC="Performs a channel scans for DVB-T, DVB-C and DVB-S" PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="+pic" make_target() { VDR_DIR=$(get_build_dir vdr) make VDRDIR=${VDR_DIR} \ LIBDIR="." \ LOCALEDIR="./locale" } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-wirbelscan/patches/vdr-plugin-wirbelscan-01-fixes.patch ================================================ Subject: [PATCH] interface channel count diff --git a/wirbelscan.c b/wirbelscan.c index 602e659..aafbec3 100644 --- a/wirbelscan.c +++ b/wirbelscan.c @@ -12,6 +12,7 @@ #include "menusetup.h" #include "countries.h" #include "satellites.h" +extern TChannels NewChannels; static const char *WIRBELSCAN_VERSION = "2021.03.07"; static const char *WIRBELSCAN_DESCRIPTION = "DVB channel scan for VDR"; @@ -202,8 +203,8 @@ bool cPluginWirbelscan::Service(const ch strcpy(s->transponder, lTransponder.length()? lTransponder.c_str():"none"); s->progress = s->status == StatusScanning?lProgress:0; s->strength = s->status == StatusScanning?lStrength:0; - s->numChannels = 0; // Channels.Count(); // not possible any longer. - s->newChannels = channelcount; // ((Channels.Count() - channelcount) > 0) && channelcount?Channels.Count() - channelcount:0; + s->numChannels = cChannels::MaxNumber(); + s->newChannels = (NewChannels.Count() > cChannels::MaxNumber()) ? NewChannels.Count() - cChannels::MaxNumber():0; s->nextTransponders = nextTransponders; return true; } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-wirbelscan/patches/vdr-plugin-wirbelscan-02-countries_utf8.patch ================================================ --- a/countries.c 2016-07-31 10:25:01.000000000 +0200 +++ b/countries.c 2021-01-21 18:02:54.336375432 +0100 @@ -557,7 +557,7 @@ int atsc_is_qam(int atsc) { struct cCountry country_list[] = { /*- ISO 3166-1 - unique id - long country name alpha-3 numeric */ {"AF", AF, "AFGHANISTAN"}, /*AFG, 4 },*/ - {"AX", AX, "LAND ISLANDS"}, /*ALA, 248},*/ + {"AX", AX, "ÅLAND ISLANDS"}, /*ALA, 248},*/ {"AL", AL, "ALBANIA"}, /*ALB, 8 },*/ {"DZ", DZ, "ALGERIA"}, /*DZA, 12 },*/ {"AS", AS, "AMERICAN SAMOA"}, /*ASM, 16 },*/ @@ -610,10 +610,10 @@ struct cCountry country_list[] = { {"CD", CD, "CONGO, THE DEMOCRATIC REPUBLIC OF THE"}, /*COD, 180},*/ {"CK", CK, "COOK ISLANDS"}, /*COK, 184},*/ {"CR", CR, "COSTA RICA"}, /*CRI, 188},*/ - {"CI", CI, "CTE D'IVOIRE"}, /*CIV, 384},*/ + {"CI", CI, "CÔTE D'IVOIRE"}, /*CIV, 384},*/ {"HR", HR, "CROATIA"}, /*HRV, 191},*/ {"CU", CU, "CUBA"}, /*CUB, 192},*/ - {"CW", CW, "CURAAO"}, /*CUW, 531},*/ + {"CW", CW, "CURAÇAO"}, /*CUW, 531},*/ {"CY", CY, "CYPRUS"}, /*CYP, 196},*/ {"CZ", CZ, "CZECH REPUBLIC"}, /*CZE, 203},*/ {"DK", DK, "DENMARK"}, /*DNK, 208},*/ @@ -736,11 +736,11 @@ struct cCountry country_list[] = { {"PT", PT, "PORTUGAL"}, /*PRT, 620},*/ {"PR", PR, "PUERTO RICO"}, /*PRI, 630},*/ {"QA", QA, "QATA"}, /*QAT, 634},*/ - {"RE", RE, "RUNION"}, /*REU, 638},*/ + {"RE", RE, "RÉUNION"}, /*REU, 638},*/ {"RO", RO, "ROMANIA"}, /*ROU, 642},*/ {"RU", RU, "RUSSIAN FEDERATION"}, /*RUS, 643},*/ {"RW", RW, "RWANDA"}, /*RWA, 646},*/ - {"BL", BL, "SAINT BARTHLEMY"}, /*BLM, 652},*/ + {"BL", BL, "SAINT BARTHÉLEMY"}, /*BLM, 652},*/ {"SH", SH, "SAINT HELENA"}, /*SHN, 654},*/ {"KN", KN, "SAINT KITTS AND NEVIS"}, /*KNA, 659},*/ {"LC", LC, "SAINT LUCIA"}, /*LCA, 662},*/ ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-wirbelscan/sources/Makefile ================================================ # taken from wirbelscan-2017.06.04 backup/Makefile.old # -- v20120526, Winfried Koehler -- PLUGIN = wirbelscan VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g') CXX ?= g++ CXXFLAGS ?= -g -O3 -Wall -Wextra -Werror=overloaded-virtual -Wformat=2 -Wswitch-default -fstack-protector-all -D_FORTIFY_SOURCE=2 VDRDIR ?= ../../.. LIBDIR ?= ../../lib TMPDIR ?= /tmp include $(VDRDIR)/Make.global -include $(VDRDIR)/Make.config APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h) ARCHIVE = $(PLUGIN)-$(VERSION) PACKAGE = vdr-$(ARCHIVE) INCLUDES += -I$(VDRDIR)/include DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"' UNCRUSTIFY_FILES = scanner.c scanner.h scanfilter.c scanfilter.h statemachine.h statemachine.c OBJS = $(PLUGIN).o common.o menusetup.o satellites.o scanner.o dvb_wrapper.o OBJS += scanfilter.o statemachine.o countries.o all: libvdr-$(PLUGIN).so i18n %.o: %.c $(CXX) -std=c++11 $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $< MAKEDEP = $(CXX) -MM -MG DEPFILE = .dependencies $(DEPFILE): Makefile @$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@ -include $(DEPFILE) PODIR = po LOCALEDIR = $(VDRDIR)/locale I18Npo = $(wildcard $(PODIR)/*.po) I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file)))))) I18Npot = $(PODIR)/$(PLUGIN).pot %.mo: %.po @msgfmt -c -o $@ $< $(I18Npot): $(wildcard *.c) @xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='' -o $@ $^ %.po: $(I18Npot) @msgmerge -U --no-wrap --no-location --backup=none -q $@ $< @touch $@ $(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo @mkdir -p $(dir $@) @cp $< $@ .PHONY: i18n i18n: $(I18Nmsgs) $(I18Npot) libvdr-$(PLUGIN).so: $(OBJS) $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@ @cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION) perm: @chmod 644 *.{c,h,html} COPYING HISTORY README TODO Makefile @chmod 755 po/ dist: $(I18Npo) clean perm @-rm -rf $(TMPDIR)/$(ARCHIVE) @mkdir $(TMPDIR)/$(ARCHIVE) @cp -a * $(TMPDIR)/$(ARCHIVE) @tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE) @-rm -rf $(TMPDIR)/$(ARCHIVE) @echo Distribution package created as $(PACKAGE).tgz ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-wirbelscancontrol/package.mk ================================================ # 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) PKG_NAME="vdr-plugin-wirbelscancontrol" PKG_VERSION="0.0.2" PKG_SHA256="178c5768dd47355a42409a2cb2629f0762da1297865e3a84963684649145cb13" PKG_LICENSE="GPL" PKG_SITE="https://www.gen2vdr.de/wirbel/wirbelscancontrol/index2.html" PKG_URL="https://www.gen2vdr.de/wirbel/wirbelscancontrol/${PKG_NAME/-plugin/}-${PKG_VERSION}.tgz" PKG_DEPENDS_TARGET="toolchain vdr gettext:host vdr-plugin-wirbelscan" PKG_NEED_UNPACK="$(get_pkg_directory vdr)" PKG_LONGDESC="Adds menu entry for wirbelscan at VDR." PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="+pic" pre_build_target() { WIRBELSCAN_DIR=$(get_build_dir vdr-plugin-wirbelscan) ln -sf ${WIRBELSCAN_DIR}/wirbelscan_services.h ${PKG_BUILD} } make_target() { VDR_DIR=$(get_build_dir vdr) make VDRDIR=${VDR_DIR} \ LIBDIR="." \ LOCALEDIR="./locale" } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-wirbelscancontrol/patches/vdr-plugin-wirbelscancontrol-02-vdr_2.3.patch ================================================ --- a/scanmenu.c +++ b/scanmenu.c @@ -255,6 +255,9 @@ { eOSState state = cOsdMenu::ProcessKey(Key); int direction = 0; +#if APIVERSNUM >= 20301 + LOCK_CHANNELS_READ; +#endif switch (Key) { case kLeft: direction = -1; break; @@ -268,7 +271,11 @@ case SETSCAN: osdstatus = SCANNING; start = time(NULL); +#if APIVERSNUM < 20301 channelcount0 = Channels.Count(); +#else + channelcount0 = Channels->Count(); +#endif SetHelp(tr("Stop"), NULL, NULL, NULL); TransferSetup(); PutCommand(CmdStartScan); @@ -655,7 +662,8 @@ sbuf = cString::sprintf("%s (%d%% transponders from scan list + %u queued)", buf, status.progress, status.nextTransponders); ProgressBar->SetText(*sbuf); - if (TV1 && TV2 && TV3 && TV4 && TV5) +#if APIVERSNUM < 20301 + if (TV1 && TV2 && TV3 && TV4 && TV5) { switch (Channels.Count() - channelcount0) { default:; case 5: TV5->SetText(Channels.GetByNumber(Channels.Count()-4)->Name()); @@ -665,8 +673,23 @@ case 1: TV1->SetText(Channels.GetByNumber(Channels.Count()-0)->Name()); case 0:; } - + } sbuf = cString::sprintf("%s%d", tr("New channels: "), Channels.Count() - channelcount0); +#else + LOCK_CHANNELS_READ; + if (TV1 && TV2 && TV3 && TV4 && TV5) { + switch (Channels->Count() - channelcount0) { + default:; + case 5: TV5->SetText(Channels->GetByNumber(Channels->Count()-4)->Name()); + case 4: TV4->SetText(Channels->GetByNumber(Channels->Count()-3)->Name()); + case 3: TV3->SetText(Channels->GetByNumber(Channels->Count()-2)->Name()); + case 2: TV2->SetText(Channels->GetByNumber(Channels->Count()-1)->Name()); + case 1: TV1->SetText(Channels->GetByNumber(Channels->Count()-0)->Name()); + case 0:; + } + } + sbuf = cString::sprintf("%s%d", tr("New channels: "), Channels->Count() - channelcount0); +#endif if (CH) CH->SetText(*sbuf); Display(); ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-xmltv2vdr/package.mk ================================================ # 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) PKG_NAME="vdr-plugin-xmltv2vdr" PKG_VERSION="ec7bd920d94e55f2d21bfa076b7e900b7b2b7537" PKG_SHA256="eacc91062095563d8adc93873b373ddb34b076a8c0a9e5a86f6220d1d5d892e9" PKG_LICENSE="GPL" PKG_SITE="http://projects.vdr-developer.org/projects/plg-xmltv2vdr" PKG_URL="https://github.com/vdr-projects/vdr-plugin-xmltv2vdr/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain vdr sqlite openssl curl libzip libxml2 libxslt enca pcre" PKG_NEED_UNPACK="$(get_pkg_directory vdr)" PKG_LONGDESC="xmltv2vdr imports data in xmltv format" PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="+pic" pre_configure_target() { export CXXFLAGS="${CXXFLAGS} -Wno-narrowing" export LIBS="-L${SYSROOT_PREFIX}/usr/lib/iconv -lpcre -lpcrecpp -lssl -lcrypto -lbz2" } make_target() { VDR_DIR=$(get_build_dir vdr) make VDRDIR=${VDR_DIR} \ LIBDIR="." \ LOCALEDIR="./locale" } post_make_target() { cd dist/epgdata2xmltv make -j1 cd - ${STRIP} dist/epgdata2xmltv/epgdata2xmltv } ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-xmltv2vdr/patches/vdr-plugin-xmltv2vdr-02_gcc721_fixes.patch ================================================ taken from https://github.com/VDR4Arch/vdr4arch/blob/vdr-stable/plugins/vdr-xmltv2vdr/xmltv2vdr_gcc721_fixes.diff fixes event.cpp: In member function 'void cXMLTVEvent::GetSQL(const char*, int, const char*, char**, char**)': event.cpp:531:5: error: 'string' was not declared in this scope string si=sql_insert; ^~~~~~ diff --git a/dist/epgdata2xmltv/epgdata2xmltv.cpp b/dist/epgdata2xmltv/epgdata2xmltv.cpp index de6fb26..ec465fb 100644 --- a/dist/epgdata2xmltv/epgdata2xmltv.cpp +++ b/dist/epgdata2xmltv/epgdata2xmltv.cpp @@ -561,7 +561,7 @@ int cepgdata2xmltv::Process(int argc, char *argv[]) enca_analyser_free(analyser); } - string s = xmlmem; + std::string s = xmlmem; int reps=pcrecpp::RE("&(?![a-zA-Z]{1,8};)").GlobalReplace("%amp;",&s); if (reps) { xmlmem = (char *)realloc(xmlmem, s.size()+1); diff --git a/event.cpp b/event.cpp index ae33002..1df43ec 100644 --- a/event.cpp +++ b/event.cpp @@ -528,7 +528,7 @@ void cXMLTVEvent::GetSQL(const char *Source, int SrcIdx, const char *ChannelID, return; } - string si=sql_insert; + std::string si=sql_insert; int ireps; ireps=pcrecpp::RE("'").GlobalReplace("''",&si); ireps+=pcrecpp::RE("\\^").GlobalReplace("'",&si); @@ -540,7 +540,7 @@ void cXMLTVEvent::GetSQL(const char *Source, int SrcIdx, const char *ChannelID, } *Insert=sql_insert; - string su=sql_update; + std::string su=sql_update; int ureps; ureps=pcrecpp::RE("'").GlobalReplace("''",&su); ureps+=pcrecpp::RE("\\^").GlobalReplace("'",&su); diff --git a/import.cpp b/import.cpp index 0d6f7bf..e417c59 100644 --- a/import.cpp +++ b/import.cpp @@ -1401,7 +1401,7 @@ bool cImport::UpdateXMLTVEvent(cEPGSource *Source, sqlite3 *Db, cXMLTVEvent *xEv return false; } - string ed=shortdesc; + std::string ed=shortdesc; int reps; reps=pcrecpp::RE("'").GlobalReplace("''",&ed); @@ -1511,7 +1511,7 @@ bool cImport::UpdateXMLTVEvent(cEPGSource *Source, sqlite3 *Db, const cEvent *Ev return false; } - string ed=eitdescription; + std::string ed=eitdescription; int reps; reps=pcrecpp::RE("'").GlobalReplace("''",&ed); @@ -1649,7 +1649,7 @@ cXMLTVEvent *cImport::SearchXMLTVEvent(sqlite3 **Db,const char *ChannelID, const return NULL; } - string st=sqltitle; + std::string st=sqltitle; int reps; reps=pcrecpp::RE("'").GlobalReplace("''",&st); ================================================ FILE: packages/addons/addon-depends/vdr-plugins/vdr-plugin-xmltv2vdr/patches/vdr-plugin-xmltv2vdr-03-fix-epgdata2xmltv-linking.patch ================================================ diff -ru vdr-plugin-xmltv2vdr.orig/dist/epgdata2xmltv/Makefile vdr-plugin-xmltv2vdr/dist/epgdata2xmltv/Makefile --- vdr-plugin-xmltv2vdr.orig/dist/epgdata2xmltv/Makefile 2017-03-20 18:08:49.000000000 +0100 +++ vdr-plugin-xmltv2vdr/dist/epgdata2xmltv/Makefile 2020-06-17 12:34:35.472188515 +0200 @@ -19,7 +19,7 @@ DEFINES += -D__STDC_CONSTANT_MACROS -D__USE_XOPEN_EXTENDED INCLUDES += $(shell $(PKG-CONFIG) --cflags $(PKG-INCLUDES)) -LIBS += $(shell $(PKG-CONFIG) --libs $(PKG-LIBS)) +LIBS += $(shell $(PKG-CONFIG) --libs --static $(PKG-LIBS)) INCLUDES += -I.. ================================================ FILE: packages/addons/browser/chrome/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/browser/chrome/config/Xdefaults ================================================ Xft.dpi: 96 ================================================ FILE: packages/addons/browser/chrome/config/pango.modules ================================================ /storage/.kodi/addons/browser.chrome/pango-modules/pango-arabic-lang.so ArabicScriptEngineLang PangoEngineLang PangoRenderNone arabic:* /storage/.kodi/addons/browser.chrome/pango-modules/pango-basic-fc.so BasicScriptEngineFc PangoEngineShape PangoRenderFc common: /storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so devaIndicScriptEngineLang PangoEngineLang PangoRenderNone devanagari:* /storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so bengIndicScriptEngineLang PangoEngineLang PangoRenderNone bengali:* /storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so guruIndicScriptEngineLang PangoEngineLang PangoRenderNone gurmukhi:* /storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so gujrIndicScriptEngineLang PangoEngineLang PangoRenderNone gujarati:* /storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so oryaIndicScriptEngineLang PangoEngineLang PangoRenderNone oriya:* /storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so tamlIndicScriptEngineLang PangoEngineLang PangoRenderNone tamil:* /storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so teluIndicScriptEngineLang PangoEngineLang PangoRenderNone telugu:* /storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so kndaIndicScriptEngineLang PangoEngineLang PangoRenderNone kannada:* /storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so mlymIndicScriptEngineLang PangoEngineLang PangoRenderNone malayalam:* /storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so sinhIndicScriptEngineLang PangoEngineLang PangoRenderNone sinhala:* ================================================ FILE: packages/addons/browser/chrome/config/pangorc ================================================ # # pangorc file for uninstalled operation. If pango-viewer is run with # this file in the current directory it will set it as PANGO_RC_FILE # [Pango] ModuleFiles = /storage/.kodi/addons/browser.chrome/config/pango.modules [PangoX] AliasFiles = /storage/.kodi/addons/browser.chrome/config/pangx.aliases ================================================ FILE: packages/addons/browser/chrome/config/pixbuf.loaders.cache ================================================ # How to generate those file # cd /LE/build.LibreELEC-Generic/gdk-pixbuf-2.36.12/.install_pkg/usr/lib/gdk-pixbuf-2.0/2.10.0/loaders # cp /LE/build.LibreELEC-Generic/gdk-pixbuf-2.36.12/.install_pkg/usr/bin/gdk-pixbuf-query-loaders . # ./gdk-pixbuf-query-loaders *.so > pixbuf.loaders.cache # GdkPixbuf Image Loader Modules file # Automatically generated file, do not edit # Created by gdk-pixbuf-query-loaders from gdk-pixbuf-2.36.12 # "/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-ani.so" "ani" 4 "gdk-pixbuf" "Windows animated cursor" "LGPL" "application/x-navi-animation" "" "ani" "" "RIFF ACON" " xxxx " 100 "/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-bmp.so" "bmp" 5 "gdk-pixbuf" "BMP" "LGPL" "image/bmp" "image/x-bmp" "image/x-MS-bmp" "" "bmp" "" "BM" "" 100 "/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-gif.so" "gif" 4 "gdk-pixbuf" "GIF" "LGPL" "image/gif" "" "gif" "" "GIF8" "" 100 "/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-icns.so" "icns" 4 "gdk-pixbuf" "MacOS X icon" "GPL" "image/x-icns" "" "icns" "" "icns" "" 100 "/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-ico.so" "ico" 5 "gdk-pixbuf" "Windows icon" "LGPL" "image/x-icon" "image/x-ico" "image/x-win-bitmap" "image/vnd.microsoft.icon" "application/ico" "image/ico" "image/icon" "text/ico" "" "ico" "cur" "" " \001 " "zz znz" 100 " \002 " "zz znz" 100 "/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-jpeg.so" "jpeg" 5 "gdk-pixbuf" "JPEG" "LGPL" "image/jpeg" "" "jpeg" "jpe" "jpg" "" "\377\330" "" 100 "/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-png.so" "png" 5 "gdk-pixbuf" "PNG" "LGPL" "image/png" "" "png" "" "\211PNG\r\n\032\n" "" 100 "/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-pnm.so" "pnm" 4 "gdk-pixbuf" "PNM/PBM/PGM/PPM" "LGPL" "image/x-portable-anymap" "image/x-portable-bitmap" "image/x-portable-graymap" "image/x-portable-pixmap" "" "pnm" "pbm" "pgm" "ppm" "" "P1" "" 100 "P2" "" 100 "P3" "" 100 "P4" "" 100 "P5" "" 100 "P6" "" 100 "/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-qtif.so" "qtif" 4 "gdk-pixbuf" "QuickTime" "LGPL" "image/x-quicktime" "image/qtif" "" "qtif" "qif" "" "abcdidsc" "xxxx " 100 "abcdidat" "xxxx " 100 "/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-tga.so" "tga" 4 "gdk-pixbuf" "Targa" "LGPL" "image/x-tga" "" "tga" "targa" "" " \001\001" "x " 100 " \001\t" "x " 100 " \002" "xz " 99 " \003" "xz " 100 " \n" "xz " 100 " \v" "xz " 100 "/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-tiff.so" "tiff" 5 "gdk-pixbuf" "TIFF" "LGPL" "image/tiff" "" "tiff" "tif" "" "MM *" " z " 100 "II* " " z" 100 "II* \020 CR\002 " " z zzz z" 0 "/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-xbm.so" "xbm" 4 "gdk-pixbuf" "XBM" "LGPL" "image/x-xbitmap" "" "xbm" "" "#define " "" 100 "/*" "" 50 "/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-xpm.so" "xpm" 4 "gdk-pixbuf" "XPM" "LGPL" "image/x-xpixmap" "" "xpm" "" "/* XPM */" "" 100 ================================================ FILE: packages/addons/browser/chrome/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="chrome" PKG_VERSION="1.0" # curl -s http://dl.google.com/linux/chrome/deb/dists/stable/main/binary-amd64/Packages | grep -B 1 Version PKG_VERSION_NUMBER="109.0.5414.74" PKG_REV="0" PKG_ARCH="x86_64" PKG_LICENSE="Custom" PKG_SITE="http://www.google.com/chrome" PKG_DEPENDS_TARGET="toolchain at-spi2-atk atk cairo chrome-libXcomposite \ chrome-libXdamage chrome-libXfixes chrome-libXi chrome-libXrender \ chrome-libXtst chrome-libxcb chrome-libxkbcommon chrome-libxshmfence cups \ gdk-pixbuf gtk3 harfbuzz-icu libXcursor libxss nss pango \ scrnsaverproto unclutter unix_ar" PKG_SECTION="browser" PKG_SHORTDESC="Google Chrome Browser" PKG_LONGDESC="Google Chrome Browser" PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Chrome" PKG_ADDON_TYPE="xbmc.python.script" PKG_ADDON_PROVIDES="executable" make_target() { : } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/{bin,config,lib,resources} # config cp -P ${PKG_DIR}/config/* ${ADDON_BUILD}/${PKG_ADDON_ID}/config # unclutter cp -P $(get_install_dir unclutter)/usr/bin/unclutter ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # libs cp -PL $(get_install_dir atk)/usr/lib/libatk-1.0.so.0 \ $(get_install_dir cairo)/usr/lib/{libcairo-gobject.so.2,libcairo.so.2} \ $(get_install_dir gdk-pixbuf)/usr/lib/libgdk_pixbuf-2.0.so.0 \ $(get_install_dir gtk3)/usr/lib/{libgtk-3.so.0,libgdk-3.so.0} \ $(get_install_dir harfbuzz-icu)/usr/lib/{libharfbuzz.so.0,libharfbuzz-icu.so*} \ $(get_install_dir at-spi2-atk)/usr/lib/libatk-bridge-2.0.so.0 \ $(get_install_dir at-spi2-core)/usr/lib/libatspi.so.0 \ $(get_install_dir cups)/usr/lib/libcups.so.2 \ $(get_install_dir chrome-libxcb)/usr/lib/{libxcb.so.1,libxcb-dri3.so.0} \ $(get_install_dir chrome-libXcomposite)/usr/lib/libXcomposite.so.1 \ $(get_install_dir libXcursor)/usr/lib/libXcursor.so.1 \ $(get_install_dir chrome-libXdamage)/usr/lib/libXdamage.so.1 \ $(get_install_dir chrome-libXfixes)/usr/lib/libXfixes.so.3 \ $(get_install_dir chrome-libXi)/usr/lib/libXi.so.6 \ $(get_install_dir chrome-libxkbcommon)/usr/lib/libxkbcommon.so.0 \ $(get_install_dir chrome-libXrender)/usr/lib/libXrender.so.1 \ $(get_install_dir chrome-libxshmfence)/usr/lib/libxshmfence.so.1 \ $(get_install_dir libxss)/usr/lib/libXss.so.1 \ $(get_install_dir chrome-libXtst)/usr/lib/libXtst.so.6 \ $(get_install_dir pango)/usr/lib/{libpangocairo-1.0.so.0,libpango-1.0.so.0,libpangoft2-1.0.so.0} \ ${ADDON_BUILD}/${PKG_ADDON_ID}/lib # unix_ar cp -P $(get_build_dir unix_ar)/unix_ar.py ${ADDON_BUILD}/${PKG_ADDON_ID}/resources } post_install_addon() { sed -e "s/@DISTRO_PKG_SETTINGS_ID@/${DISTRO_PKG_SETTINGS_ID}/g" -i "${INSTALL}/default.py" sed -e "s/@CHROME_VERSION@/${PKG_VERSION_NUMBER}/g" -i "${INSTALL}/bin/chrome-downloader" sed -e "s/@CHROME_VERSION@/${PKG_VERSION_NUMBER}/g" -i "${INSTALL}/resources/settings.xml" sed -e "s/@CHROME_VERSION@/${PKG_VERSION_NUMBER}/g" -i "${INSTALL}/settings-default.xml" } ================================================ FILE: packages/addons/browser/chrome/source/bin/chrome-downloader ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon browser.chrome ICON="$ADDON_DIR/resources/icon.png" CONTROL_FILE="/tmp/curl.done" DATA_FILE="/tmp/curl.data" CHROME_FILE="google-chrome-stable_@CHROME_VERSION@-1_amd64.deb" # check for enough free disk space if [ $(df -P . | awk 'END {print $4}') -lt 400000 ]; then kodi-send --action="Notification(Not enough disk space, at least 400MB are required,30000,${ICON})" >/dev/null exit 0; fi # remove install status and folders if [ -f $ADDON_DIR/extract.ok ]; then rm $ADDON_DIR/extract.ok fi if [ -d $ADDON_DIR/chrome-bin ]; then rm -rf $ADDON_DIR/chrome-bin fi if [ -d $ADDON_DIR/tmp_download ]; then rm -rf $ADDON_DIR/tmp_download fi # create tmp download dir mkdir -p $ADDON_DIR/tmp_download cd $ADDON_DIR/tmp_download echo "Downloading Chrome" # download chrome rm -f ${CONTROL_FILE} ${DATA_FILE} ( curl -# -O -C - https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/${CHROME_FILE} 2>${DATA_FILE} touch ${CONTROL_FILE} ) | \ while [ : ]; do [ -f ${DATA_FILE} ] && prog="$(tr '\r' '\n' < ${DATA_FILE} | tail -n 1 | sed -r 's/^[# ]+/#/;s/^[^0-9]*//g')" || prog= kodi-send --action="Notification(Downloading Chrome,\"${prog:-0.0%}\",3000,${ICON})" >/dev/null [ -f ${CONTROL_FILE} ] && break sleep 4 done rm -f ${CONTROL_FILE} ${DATA_FILE} ## extract chrome # extrat chrome.deb data to temp kodi-send --action="Notification(Extracting Chrome,starting,1000,${ICON})" >/dev/null deb_extract_data ${CHROME_FILE} $ADDON_DIR/tmp_download mv opt/google/chrome $ADDON_DIR/chrome-bin # cleanup cd $ADDON_DIR rm -rf $ADDON_DIR/tmp_download if [ -d chrome-bin ]; then touch $ADDON_DIR/extract.ok kodi-send --action="Notification(Extracting Chrome,finished,1000,${ICON})" >/dev/null else kodi-send --action="Notification(Extracting Chrome,FAILED!,10000,${ICON})" >/dev/null fi ================================================ FILE: packages/addons/browser/chrome/source/bin/chrome-start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon browser.chrome # check if chrome is already successful installed if [ ! -f "$ADDON_DIR/extract.ok" ]; then cd $ADDON_DIR chrome-downloader fi if [ -e $ADDON_HOME/env ] then . $ADDON_HOME/env fi # fix file permissons (zip packaging) chmod +x $ADDON_DIR/chrome-bin/chrome chmod 4755 $ADDON_DIR/chrome-bin/chrome-sandbox # make sure we use "own" gtk/pango/nss/etc export LD_LIBRARY_PATH=$ADDON_DIR/lib # configure pango/pixbuf export PANGO_RC_FILE=$ADDON_DIR/config/pangorc export GDK_PIXBUF_MODULE_FILE=$ADDON_DIR/config/pixbuf.loaders.cache # font rendering in gtk widgets is brokeen with nvidia blob. use our Xdefaults export XENVIRONMENT=$ADDON_DIR/config/Xdefaults # start unclutter if [ "$HIDE_CURSOR" == "true" ] then unclutter & UNCLUTTER_PID=$! fi # vaapi LIBVA_DRIVERS_PATH="/usr/lib/dri:$ADDON_DIR/lib" LIBVA_DRIVER_NAME='' case $VAAPI_MODE in 'intel') LIBVA_DRIVER_NAME='i965' chrome_OPTS="$chrome_OPTS --use-gl=desktop --enable-features=VaapiVideoDecoder" ;; 'amd') LIBVA_DRIVER_NAME='vdpau' chrome_OPTS="$chrome_OPTS --use-gl=desktop --enable-features=VaapiVideoDecoder" ;; 'nvidia') LIBVA_DRIVER_NAME='vdpau' chrome_OPTS="$chrome_OPTS --use-gl=desktop --enable-features=VaapiVideoDecoder --allow-no-sandbox-job --disable-gpu-sandbox" ;; *) LIBGL_ALWAYS_SOFTWARE='1' export LIBGL_ALWAYS_SOFTWARE esac export LIBVA_DRIVER_NAME LIBVA_DRIVERS_PATH # windowed case $WINDOW_MODE in 'maximized') chrome_OPTS="$chrome_OPTS --start-maximized";; 'kiosk') chrome_OPTS="$chrome_OPTS --kiosk";; esac # rasterization case $RASTER_MODE in 'off') chrome_OPTS="$chrome_OPTS --disable-accelerated-2d-canvas --disable-gpu-compositing";; 'force') chrome_OPTS="$chrome_OPTS --enable-gpu-rasterization --enable-accelerated-2d-canvas --ignore-gpu-blacklist";; esac # alsa if [ "$AUDIO_DEVICE_TYPE" == "ALSA" ]; then # stop pulseaudio when using an Alsa device systemctl stop pulseaudio if [ ! -z $ALSA_DEVICE ]; then chrome_OPTS="$chrome_OPTS --alsa-output-device=$ALSA_DEVICE" fi fi # dark mode if [ "$DARK_MODE" == "true" ] then chrome_OPTS="$chrome_OPTS --force-dark-mode" fi # User-Agent if [ ! -z "$USER_AGENT" ]; then USER_AGENT="--user-agent=$USER_AGENT" fi # start chrome LD_PRELOAD=/usr/lib/libGL.so $ADDON_DIR/chrome-bin/chrome \ $chrome_OPTS \ "$USER_AGENT" \ --no-sandbox \ --user-data-dir=$ADDON_HOME/profile \ --test-type $@ \ 2>&1 | tee $ADDON_LOG_FILE # kill unclutter if [ "$HIDE_CURSOR" == "true" ] then kill $UNCLUTTER_PID fi sleep 5 if [ "$AUDIO_DEVICE_TYPE" == "ALSA" ]; then # restart pulseaudio when using an Alsa device systemctl start pulseaudio fi ================================================ FILE: packages/addons/browser/chrome/source/bin/deb_extract_data ================================================ #!/usr/bin/python3 # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) import sys sys.path.append('/storage/.kodi/addons/browser.chrome/resources') import unix_ar import tarfile if len(sys.argv) != 3: print("Parameter error", file=sys.stderr) sys.exit(1) ar = unix_ar.open(sys.argv[1]) tarball = ar.open('data.tar.xz/') tar = tarfile.open(fileobj=tarball) tar.extractall(path=sys.argv[2]) ================================================ FILE: packages/addons/browser/chrome/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) import json import linecache import os import shlex import subprocess import sys import time import xbmc import xbmcaddon __addon__ = xbmcaddon.Addon(); __path__ = os.path.join(__addon__.getAddonInfo('path'), 'bin') pauseXBMC = __addon__.getSetting("PAUSE_XBMC") def pauseXbmc(): if pauseXBMC == "true": xbmc.executebuiltin("PlayerControl(Stop)") xbmc.audioSuspend() xbmc.enableNavSounds(False) def resumeXbmc(): if pauseXBMC == "true": xbmc.audioResume() xbmc.enableNavSounds(True) def _print_exception(): exc_type, exc_obj, tb = sys.exc_info() frame = tb.tb_frame lineno = tb.tb_lineno filename = frame.f_code.co_filename linecache.checkcache(filename) line = linecache.getline(filename, lineno, frame.f_globals) xbmc.log(f'## Chrome Addon Error: in ({filename}, line {lineno}\n"{line.strip()}"):\n{repr(exc_obj)}', xbmc.LOGERROR) def startchrome(args): try: chrome_env = { 'VAAPI_MODE': __addon__.getSetting('VAAPI_MODE'), 'WINDOW_MODE': __addon__.getSetting('WINDOW_MODE'), 'RASTER_MODE': __addon__.getSetting('RASTER_MODE'), 'DARK_MODE': __addon__.getSetting('DARK_MODE') } # sound settings as environment variable if __addon__.getSetting('USE_CUST_AUDIODEVICE') == 'true': audio_device = __addon__.getSetting('CUST_AUDIODEVICE_STR') else: audio_device = getAudioDevice() chrome_env['AUDIO_DEVICE_TYPE'] = getAudioDeviceType(audio_device) if chrome_env['AUDIO_DEVICE_TYPE'] == 'ALSA': alsa_device = getAlsaAudioDevice(audio_device) chrome_env['ALSA_DEVICE'] = alsa_device if alsa_device else '' # chrome user-agent string if __addon__.getSetting('USE_CUST_USERAGENT') == 'true': chrome_env['USER_AGENT'] = __addon__.getSetting('CUST_USERAGENT_STR') # launch chrome new_env = os.environ.copy() new_env.update(chrome_env) chrome_execute = ([os.path.join(__path__, 'chrome-start')] + args + [__addon__.getSetting('HOMEPAGE')]) subprocess.call(chrome_execute, env=new_env) except Exception: _print_exception() xbmc.log(f'## Chrome Addon Error: chrome env: {chrome_env}, audio device: {audio_device}', xbmc.LOGERROR) def isRunning(pname): '''Returns True/False if pname is running''' running_commands = subprocess.run(shlex.split('ps -Ao comm'), text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) return pname in running_commands.stdout def getAudioDevice(): return json.loads(xbmc.executeJSONRPC(json.dumps({ "jsonrpc": "2.0", "method": "Settings.GetSettingValue", "params": { "setting": "audiooutput.audiodevice", }, "id": 1, })))['result']['value'] def getAudioDeviceType(dev): if dev: if dev.startswith("ALSA:"): return "ALSA" elif dev.startswith("PULSE:"): return "PULSE" else: # backwards compatibility of device string return "ALSA" return "ALSA" def getAlsaAudioDevice(dev): if not dev.startswith('ALSA:'): return dev dev = dev.split("ALSA:")[1] if dev == "@": return None if dev.startswith("@:"): dev = dev.split("@:")[1] if dev.startswith("CARD="): dev = f'plughw:{dev}' return dev if (not __addon__.getSetting("firstrun")): __addon__.setSetting("firstrun", "1") __addon__.openSettings() try: args = sys.argv[1:] except Exception: args = '' if args == 'widevine': install_widevine() elif args == 'flash': install_flash() else: if not isRunning('chrome'): pauseXbmc() startchrome(args) while isRunning('chrome'): time.sleep(1) resumeXbmc() del __addon__ ================================================ FILE: packages/addons/browser/chrome/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: chrome # Addon id: browser.chrome # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "General" msgstr "" msgctxt "#30001" msgid "Chrome Configuration" msgstr "" msgctxt "#30002" msgid "Stop Kodi Player and Suspend AudioEngine" msgstr "" msgctxt "#30003" msgid "HW Acceleration Mode" msgstr "" msgctxt "#30004" msgid "Rasterization Mode" msgstr "" msgctxt "#30005" msgid "Window Mode" msgstr "" msgctxt "#30006" msgid "Default Homepage" msgstr "" msgctxt "#30007" msgid "Use Custom Audio Device" msgstr "" msgctxt "#30008" msgid "Audio Device" msgstr "" msgctxt "#30009" msgid "Hide Cursor" msgstr "" msgctxt "#30010" msgid "Dark Mode" msgstr "" msgctxt "#30011" msgid "Use Custom User-Agent" msgstr "" msgctxt "#30012" msgid "User-Agent" msgstr "" ================================================ FILE: packages/addons/browser/chrome/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/browser/chrome/source/settings-default.xml ================================================ false https://libreelec.tv true default false intel maximized false false Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/@CHROME_VERSION@ ================================================ FILE: packages/addons/browser/chromium/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="chromium" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="x86_64" PKG_LICENSE="GPL" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="browser" PKG_SHORTDESC="Add-on removed" PKG_LONGDESC="Add-on removed" PKG_TOOLCHAIN="manual" PKG_ADDON_BROKEN="Chromium is no longer maintained and has been superseded by Chrome." PKG_IS_ADDON="yes" PKG_ADDON_NAME="Chromium" PKG_ADDON_TYPE="xbmc.broken" addon() { : } ================================================ FILE: packages/addons/driver/hdhomerun/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/driver/hdhomerun/config/dvbhdhomerun.sample ================================================ # Remember to exchange the XXXXYYYY-Z with the serial number of your HDHomeRun # tuner: # Auto detect tuner type is not possible in all cases, so you can force it # DVB-C # DVB-T # ATSC [XXXXYYYY-0] tuner_type=DVB-T [XXXXYYYY-1] tuner_type=DVB-C # You can use a full name including tuner ID. Meaning the tuner will appear as # "HDHomeRun DVB-C 1234EA3D-0" instead of just "HDHomeRun DVB-C" in for example # TVHeadend. [XXXXYYYY-0] use_full_name=true # You can disable certain tuners. As default all detected hdhomeruns are used [XXXXYYYY-2] disable=true ================================================ FILE: packages/addons/driver/hdhomerun/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="hdhomerun" PKG_VERSION="7.0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.silicondust.com/products/hdhomerun/dvbt/" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="driver/dvb" PKG_SHORTDESC="HDHomeRun: a Linux driver to add support for HDHomeRun from silicondust.com" PKG_LONGDESC="Install this to add support for HDHomeRun devices." PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="HDHomeRun" PKG_ADDON_TYPE="xbmc.python.script" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/config/ cp -P ${PKG_DIR}/config/* ${ADDON_BUILD}/${PKG_ADDON_ID}/config/ cp -P ${PKG_DIR}/settings-default.xml ${ADDON_BUILD}/${PKG_ADDON_ID}/ } ================================================ FILE: packages/addons/driver/hdhomerun/settings-default.xml ================================================ ================================================ FILE: packages/addons/driver/hdhomerun/source/bin/userspace-driver.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) . /etc/profile # start locking mechanism - allows only one instance to be run at a time HDHR_LOCKFILE="/var/lock/userspace-driver-hdhomerun.lck" HDHR_LOCKFD=99 # obtain an exclusive lock exlock() { eval "exec $HDHR_LOCKFD>\"$HDHR_LOCKFILE\""; flock -x $HDHR_LOCKFD; } # drop a lock unlock() { flock -u $HDHR_LOCKFD; flock -xn $HDHR_LOCKFD && rm -f "$HDHR_LOCKFILE"; } # end locking mechanism # exclusive lock exlock HDHR_ADDON_DIR="$HOME/.kodi/addons/driver.dvb.hdhomerun" HDHR_ADDON_HOME="$HOME/.kodi/userdata/addon_data/driver.dvb.hdhomerun" HDHR_ADDON_SETTINGS="$HDHR_ADDON_HOME/settings.xml" # modules are not automatically loaded modprobe dvb_hdhomerun modprobe dvb_hdhomerun_fe mkdir -p $HDHR_ADDON_HOME if [ ! -f "$HDHR_ADDON_HOME/dvbhdhomerun.sample" ]; then cp $HDHR_ADDON_DIR/config/* $HDHR_ADDON_HOME/ fi if [ ! -f "$HDHR_ADDON_SETTINGS" ]; then cp $HDHR_ADDON_DIR/settings-default.xml $HDHR_ADDON_SETTINGS fi mkdir -p /var/config # check settings version XML_SETTINGS_VER="$(xmlstarlet sel -t -m settings -v @version $HDHR_ADDON_SETTINGS)" if [ "$XML_SETTINGS_VER" = "2" ]; then xmlstarlet sel -t -m settings/setting -v @id -o "=\"" -v . -o "\"" -n "$HDHR_ADDON_SETTINGS" > /var/config/hdhomerun-addon.conf else xmlstarlet sel -t -m settings -m setting -v @id -o "=\"" -v @value -o "\"" -n "$HDHR_ADDON_SETTINGS" > /var/config/hdhomerun-addon.conf fi . /var/config/hdhomerun-addon.conf if [ -z "$(pidof userhdhomerun)" ]; then if [ "$ENABLE_TUNER_TYPES" = "true" ]; then DVBHDHOMERUN_CONF_TMP=/tmp/dvbhdhomerun.conf touch $HDHR_ADDON_HOME/dvbhdhomerun.conf cp $HDHR_ADDON_HOME/dvbhdhomerun.conf $DVBHDHOMERUN_CONF_TMP # get tuner serial numbers SERIALS=$(cat /var/config/hdhomerun-addon.conf | sed -n 's|^ATTACHED_TUNER_\(.*\)_DVBMODE=.*|\1|gp' | sort | uniq) . /var/config/hdhomerun-addon.conf for SERIAL_UNIQ in $SERIALS; do DVBMODE=$(eval echo \$ATTACHED_TUNER_${SERIAL_UNIQ}_DVBMODE) FULLNAME=$(eval echo \$ATTACHED_TUNER_${SERIAL_UNIQ}_FULLNAME) DISABLE=$(eval echo \$ATTACHED_TUNER_${SERIAL_UNIQ}_DISABLE) NUMBERS=$(eval echo \$ATTACHED_TUNER_${SERIAL_UNIQ}_NUMBERS) NUMBERS=$(( $NUMBERS -1 )) NUMBERS=$(( $NUMBERS *1 )) for i in $(seq 0 $NUMBERS); do SERIAL="$SERIAL_UNIQ-$i" [ "$DVBMODE" = "auto" ] && DVBMODE="" # remove setttings for this tuner awk -v val="[$SERIAL]" '$0 == val {flag=1; next} /^tuner_type=|^use_full_name=|^disable=|^#|^$/{if (flag==1) next} /.*/{flag=0; print}' $DVBHDHOMERUN_CONF_TMP >${DVBHDHOMERUN_CONF_TMP}-types mv ${DVBHDHOMERUN_CONF_TMP}-types $DVBHDHOMERUN_CONF_TMP echo "" >>$DVBHDHOMERUN_CONF_TMP # remove empty lines at the end of file sed -i -e ':a' -e '/^\n*$/{$d;N;};/\n$/ba' $DVBHDHOMERUN_CONF_TMP ADDNEW=true if [ -n "$DVBMODE" ]; then [ $ADDNEW = true ] && ADDNEW=false && echo "[$SERIAL]" >>$DVBHDHOMERUN_CONF_TMP echo "tuner_type=$DVBMODE" >>$DVBHDHOMERUN_CONF_TMP fi if [ "$FULLNAME" = "true" ]; then [ $ADDNEW = true ] && ADDNEW=false && echo "[$SERIAL]" >>$DVBHDHOMERUN_CONF_TMP echo "use_full_name=true" >>$DVBHDHOMERUN_CONF_TMP fi if [ "$DISABLE" = "true" ]; then [ $ADDNEW = true ] && ADDNEW=false && echo "[$SERIAL]" >>$DVBHDHOMERUN_CONF_TMP echo "disable=true" >>$DVBHDHOMERUN_CONF_TMP fi echo "" >>$DVBHDHOMERUN_CONF_TMP done done # remove logging from libhdhomerun library awk -v val="[libhdhomerun]" '$0 == val {flag=1; next} /^enable=|^logfile=|^#|^$/{if (flag==1) next} /.*/{flag=0; print}' $DVBHDHOMERUN_CONF_TMP >${DVBHDHOMERUN_CONF_TMP}-log mv ${DVBHDHOMERUN_CONF_TMP}-log $DVBHDHOMERUN_CONF_TMP echo "" >>$DVBHDHOMERUN_CONF_TMP # remove empty lines at the end of file sed -i -e ':a' -e '/^\n*$/{$d;N;};/\n$/ba' $DVBHDHOMERUN_CONF_TMP if [ "$LIBHDHOMERUN_LOG" = "true" ]; then cat >>$DVBHDHOMERUN_CONF_TMP << EOF [libhdhomerun] enable=true logfile=/var/log/dvbhdhomerun_libhdhomerun.log EOF fi md5_1=$(md5sum -b $DVBHDHOMERUN_CONF_TMP | awk '{print $1}') md5_2=$(md5sum -b $HDHR_ADDON_HOME/dvbhdhomerun.conf | awk '{print $1}') if [ "$md5_1" != "$md5_2" ]; then # file changed - copy to addon home cp $DVBHDHOMERUN_CONF_TMP $HDHR_ADDON_HOME/dvbhdhomerun.conf fi fi rm -f /tmp/dvbhdhomerun if [ -f $HDHR_ADDON_HOME/dvbhdhomerun.conf ]; then ln -s $HDHR_ADDON_HOME/dvbhdhomerun.conf /tmp/dvbhdhomerun fi [ -z "$PRE_WAIT" ] && PRE_WAIT=0 PRE_WAIT=$(( $PRE_WAIT *1 )) [ -z "$POST_WAIT" ] && POST_WAIT=0 POST_WAIT=$(( $POST_WAIT *1 )) logger -t HDHomeRun "### Pre wait for $PRE_WAIT sec ###" sleep $PRE_WAIT mkdir -p /var/log/ rm -f /var/log/dvbhdhomerun.log if [ "$USERHDHOMERUN_LOG" = "true" ]; then userhdhomerun -f else userhdhomerun -f -d fi logger -t HDHomeRun "### Post wait for $POST_WAIT sec ###" sleep $POST_WAIT # save adapter names in background ( sleep 4 sn_old=$(cat $HDHR_ADDON_HOME/adapters.txt 2>/dev/null) sn_new=$(grep "Name of device: " /var/log/dvbhdhomerun.log) if [ "$sn_old" != "$sn_new" ]; then echo -n $sn_new >$HDHR_ADDON_HOME/adapters.txt fi )& fi logger -t HDHomeRun "### HDHomeRun ready ###" # unlock the lock unlock ================================================ FILE: packages/addons/driver/hdhomerun/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) ================================================ FILE: packages/addons/driver/hdhomerun/source/resources/actions.py ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) import os import sys import xbmcaddon import xbmcvfs __settings__ = xbmcaddon.Addon(id = 'driver.dvb.hdhomerun') __cwd__ = __settings__.getAddonInfo('path') __resources_lib__ = xbmcvfs.translatePath(os.path.join(__cwd__, 'resources', 'lib')) __settings_xml__ = xbmcvfs.translatePath(os.path.join(__cwd__, 'resources', 'settings.xml')) if len(sys.argv) == 2 and sys.argv[1] == 'refresh_tuners': sys.path.append(__resources_lib__) from functions import refresh_hdhomerun_tuners refresh_hdhomerun_tuners(__settings_xml__) __settings__.openSettings() ================================================ FILE: packages/addons/driver/hdhomerun/source/resources/language/English/strings.xml ================================================ General Pre wait time [sec] Post wait time [sec] Enable userhdhomerun logging Enable libhdhomerun logging Enable suspend/resume the driver Tuner settings Enable modifying settings Refresh tuners... (press me) use full name number of tuners disabled ================================================ FILE: packages/addons/driver/hdhomerun/source/resources/lib/functions.py ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) import os import sys import re import subprocess import shutil import xmlpp from xml.dom import minidom __sundtek_userspace__ = '/storage/.kodi/userdata/addon_data/driver.dvb.sundtek-mediatv/' ###################################################################################################### # backup setting.xml file only if backup doesn't exist def settings_backup(settings_xml): try: with open(settings_xml + '_orig') as f: pass except IOError as e: shutil.copyfile(settings_xml, settings_xml + '_orig') ###################################################################################################### # restore setting.xml file from backup def settings_restore(settings_xml): try: shutil.copyfile(settings_xml + '_orig', settings_xml) except IOError as e: print 'Error restoring file:', settings_xml ###################################################################################################### # get hdhomerun supported devices on a system (only name like 101ADD2B-0) def get_devices_hdhomerun(): tuners = [] try: p = os.popen("hdhomerun_config discover", "r") while 1: line = p.readline() if not line: break else: str = line.strip() match = re.search(r'hdhomerun device (.+) found at .+', line) if match: name = match.group(1) print name tuners.append(name) except IOError: print 'Error getting hdhomerun tuners info' return tuners """ libreelec:~ # hdhomerun_config discover hdhomerun device 12345678 found at 192.168.0.3 """ ###################################################################################################### # get sundtek supported devices on a system (name, serial number, type) def get_devices_sundtek(mediaclient_e): tuners = [] try: p = os.popen(mediaclient_e, "r") while 1: line = p.readline() if not line: break else: str = line.strip() if str.startswith('device '): name = str[str.find("[")+1:str.find("]")] tuners.append([name, 0, 's']) if str.startswith('[SERIAL]:'): line = p.readline() str = line.strip() if str.startswith('ID:'): id = str.split(':'); id = id[1].strip() tuners[len(tuners)-1] = [name, id, 's'] if str.startswith('[DVB-C]:'): tuners[len(tuners)-1] = [name, id, 'c'] elif str.startswith('[DVB-T]:'): tuners[len(tuners)-1] = [name, id, 'c'] elif str.startswith('[DVB-T2]:'): tuners[len(tuners)-1] = [name, id, 'c'] except IOError: print 'Error getting sundtek tuners info' return tuners """ root ~ # mediaclient -e **** List of Media Hardware Devices **** device 0: [Sundtek MediaTV Pro (USB 2.0)] DVB-C, DVB-T, ANALOG-TV, FM-RADIO, REMOTE-CONTROL, OSS-AUDIO, RDS [BUS]: ID: 1-7 [SERIAL]: ID: U110763295205 [DVB-C]: FRONTEND: /dev/dvb/adapter0/frontend0 DVR: /dev/dvb/adapter0/dvr0 DMX: /dev/dvb/adapter0/demux0 [DVB-T]: FRONTEND: /dev/dvb/adapter0/frontend0 DVR: /dev/dvb/adapter0/dvr0 DMX: /dev/dvb/adapter0/demux0 [ANALOG-TV]: VIDEO0: /dev/video0 VBI0: /dev/vbi0 [FM-RADIO]: RADIO0: /dev/radio0 RDS: /dev/rds0 [REMOTECONTROL]: INPUT0: /dev/mediainput0 [OSS]: OSS0: /dev/dsp0 """ ###################################################################################################### # parse settings.xml file def parse_settings(settings_xml): try: xmldoc = minidom.parse(settings_xml) category = xmldoc.getElementsByTagName('category') return xmldoc except Exception as inst: print 'Error parse settings file', settings_xml return None ###################################################################################################### # remove all nodes with id started with ATTACHED_TUNER_ def remove_old_tuners(xmldoc): category = xmldoc.getElementsByTagName('category') for node_cat in category: setting = node_cat.getElementsByTagName('setting') for node_set in setting : if 'id' in node_set.attributes.keys() and not node_set.getAttribute('id').find('ATTACHED_TUNER_'): node_set.parentNode.removeChild(node_set) ###################################################################################################### # add new hdhomerun tuners def add_hdhomerun(xmldoc, node_cat, tuners): for ix, tuner in enumerate(tuners): #tuner_var = tuner.replace('-', '_') tuner_var = tuner print tuner node1 = xmldoc.createElement("setting") node1.setAttribute("id", 'ATTACHED_TUNER_' + tuner_var + '_DVBMODE') node1.setAttribute("label", "tuner serial " + tuner_var) node1.setAttribute("type", 'labelenum') node1.setAttribute("default", 'auto') node1.setAttribute("values", 'auto|ATSC|DVB-C|DVB-T') node_cat.appendChild(node1) node2 = xmldoc.createElement("setting") node2.setAttribute("id", 'ATTACHED_TUNER_' + tuner_var + '_FULLNAME') node2.setAttribute("label", '9020') node2.setAttribute("type", 'bool') node2.setAttribute("default", 'false') node_cat.appendChild(node2) node3 = xmldoc.createElement("setting") node3.setAttribute("id", 'ATTACHED_TUNER_' + tuner_var + '_NUMBERS') node3.setAttribute("label", '9025') node3.setAttribute("type", 'labelenum') node3.setAttribute("default", '2') node3.setAttribute("values", '1|2|3|4|5|6|7|8') node_cat.appendChild(node3) node4 = xmldoc.createElement("setting") node4.setAttribute("id", 'ATTACHED_TUNER_' + tuner_var + '_DISABLE') node4.setAttribute("label", '9030') node4.setAttribute("type", 'bool') node4.setAttribute("default", 'false') node_cat.appendChild(node4) # for tuner ###################################################################################################### # add new sundtek tuners def add_sundtek(xmldoc, node_cat, tuners): for ix, tuner in enumerate(tuners): tuner_name = tuner[0] tuner_serial = tuner[1] tuner_type = tuner[2] node1 = xmldoc.createElement("setting") node1.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_DVBMODE') node1.setAttribute("label", tuner_name + ", " + tuner_serial) node1.setAttribute("type", 'labelenum') if (tuner_type == 's'): node1.setAttribute("default", 'DVB-S') node1.setAttribute("values", 'DVB-S') else: node1.setAttribute("default", 'DVB-C') node1.setAttribute("values", 'DVB-C|DVB-T') node_cat.appendChild(node1) node2 = xmldoc.createElement("setting") node2.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_IRPROT') node2.setAttribute("label", '9020') node2.setAttribute("type", 'labelenum') node2.setAttribute("default", 'auto') node2.setAttribute("values", 'auto|RC5|NEC|RC6') node_cat.appendChild(node2) node3 = xmldoc.createElement("setting") node3.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_KEYMAP') node3.setAttribute("label", '9030') node3.setAttribute("type", 'file') node3.setAttribute("mask", '*.map') node3.setAttribute("default", __sundtek_userspace__) node_cat.appendChild(node3) # for tuner ###################################################################################################### # add new ATTACHED_TUNER_ nodes for available tuners def add_new_tuners(xmldoc, tuners, which): category = xmldoc.getElementsByTagName('category') for node_cat in category: setting = node_cat.getElementsByTagName('setting') for node_set in setting : if 'label' in node_set.attributes.keys() and '9010' in node_set.getAttribute('label'): if which == 'hdhomerun': add_hdhomerun(xmldoc, node_cat, tuners) break elif which == 'sundtek': add_sundtek(xmldoc, node_cat, tuners) break ###################################################################################################### # save settings.xml file back def save_settings(settings_xml, xmldoc): try: outputfile = open(settings_xml, 'w') xmlpp.pprint(xmldoc.toxml(), output = outputfile, indent=2) outputfile.close() except IOError: print 'Error saving file:', settings_xml settings_restore(settings_xml) ###################################################################################################### # refresh hdhomerun tuners in settings.xml file def refresh_hdhomerun_tuners(settings_xml): settings_backup(settings_xml) tuners = get_devices_hdhomerun() xmldoc = parse_settings(settings_xml) if xmldoc == None: print 'No hdhomerun tuners found' else: remove_old_tuners(xmldoc) add_new_tuners(xmldoc, tuners, 'hdhomerun') save_settings(settings_xml, xmldoc) ###################################################################################################### # refresh sundtek tuners in settings.xml file def refresh_sundtek_tuners(settings_xml, mediaclient_e): settings_backup(settings_xml) tuners = get_devices_sundtek(mediaclient_e) xmldoc = parse_settings(settings_xml) if xmldoc == None: print 'No sundtek tuners found' else: remove_old_tuners(xmldoc) add_new_tuners(xmldoc, tuners, 'sundtek') save_settings(settings_xml, xmldoc) ================================================ FILE: packages/addons/driver/hdhomerun/source/resources/lib/xmlpp.py ================================================ """Pretty print an XML document. LICENCE: Copyright (c) 2008, Fredrik Ekholdt All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Fredrik Ekholdt nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.""" import sys as _sys import re as _re def _usage(this_file): return """SYNOPSIS: pretty print an XML document USAGE: python %s \n""" % this_file def _pprint_line(indent_level, line, width=100, output=_sys.stdout, ignore_contents = False): if line.strip(): start = "" number_chars = 0 for l in range(indent_level): start = start + " " number_chars = number_chars + 1 if not ignore_contents: try: elem_start = _re.findall("(\<\W{0,1}\w+:\w+) ?", line)[0] elem_finished = _re.findall("([?|\]\]/|\-\-]*\>)", line)[0] #should not have * attrs = _re.findall("(\S*?\=\".*?\")", line) output.write(start + elem_start) number_chars = len(start + elem_start) for attr in attrs: if (attrs.index(attr) + 1) == len(attrs): number_chars = number_chars + len(elem_finished) if (number_chars + len(attr) + 1) > width: output.write("\n") for i in range(len(start + elem_start) + 1): output.write(" ") number_chars = len(start + elem_start) + 1 else: output.write(" ") number_chars = number_chars + 1 output.write(attr) number_chars = number_chars + len(attr) output.write(elem_finished + "\n") except IndexError: #give up pretty print this line output.write(start + line + "\n") else: output.write(start + line + "\n") def _pprint_elem_content(indent_level, line, output=_sys.stdout): if line.strip(): for l in range(indent_level): output.write(" ") output.write(line + "\n") def _get_next_elem(data): start_pos = data.find("<") end_pos = data.find(">") + 1 retval = data[start_pos:end_pos] stopper = retval.rfind("/") ignore_contents = False if stopper < retval.rfind("\""): stopper = -1 single = (stopper > -1 and ((retval.find(">") - stopper) < (stopper - retval.find("<")))) ignore_excl = retval.find(" -1 ignore_question = retval.find(" -1 if ignore_excl: ignore_contents = True cdata = retval.find(" -1 if cdata: end_pos = data.find("]]>") if end_pos > -1: end_pos = end_pos + len("]]>") stopper = end_pos else: end_pos = data.find("-->") if end_pos > -1: end_pos = end_pos + len("-->") stopper = end_pos retval = data[start_pos:end_pos] elif ignore_question: end_pos = data.find("?>") + len("?>") ignore = ignore_excl or ignore_question no_indent = ignore or single return start_pos, \ end_pos, \ stopper > -1, \ no_indent, \ ignore_contents def get_pprint(xml, indent=4, width=80): """Returns the pretty printed xml """ class out: output = "" def write(self, string): self.output += string out = out() pprint(xml, output=out, indent=indent, width=width) return out.output def pprint(xml, output=_sys.stdout, indent=4, width=80): """Pretty print xml. Use output to select output stream. Default is sys.stdout Use indent to select indentation level. Default is 4 """ data = xml indent_level = 0 start_pos, end_pos, is_stop, no_indent, ignore_contents = _get_next_elem(data) while ((start_pos > -1 and end_pos > -1)): _pprint_elem_content(indent_level, data[:start_pos].strip(), output=output) data = data[start_pos:] if is_stop and not no_indent: indent_level = indent_level - indent _pprint_line(indent_level, data[:end_pos - start_pos], width=width, output=output, ignore_contents=ignore_contents) data = data[end_pos - start_pos:] if not is_stop and not no_indent : indent_level = indent_level + indent if not data: break else: start_pos, end_pos, is_stop, no_indent, ignore_contents = _get_next_elem(data) if __name__ == "__main__": if "-h" in _sys.argv or "--help" in _sys.argv: _sys.stderr.write(_usage(_sys.argv[0])) _sys.exit(1) if len(_sys.argv) < 2: _sys.stderr.write(_usage(_sys.argv[0])) _sys.exit(1) else: filename = _sys.argv[1] fh = open(filename) pprint(fh.read(), output=_sys.stdout, indent=4, width=80) ================================================ FILE: packages/addons/driver/hdhomerun/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/driver/hdhomerun/source/sleep.d/99-hdhomerun.power ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /etc/profile oe_setup_addon driver.dvb.hdhomerun if [ "$SUSPEND_DRIVER" = "true" ]; then case "$1" in pre) killall -9 userhdhomerun &>/dev/null rmmod dvb_hdhomerun_fe &>/dev/null rmmod dvb_hdhomerun &>/dev/null rmmod dvb_hdhomerun_core &>/dev/null ;; post) ;; esac fi ================================================ FILE: packages/addons/driver/imon-mce/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="imon-mce" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="driver/remote" PKG_SHORTDESC="Add-on removed" PKG_LONGDESC="Add-on removed" PKG_TOOLCHAIN="manual" PKG_ADDON_BROKEN="iMON-MCE driver was removed, use .config/rc_maps.cfg instead." PKG_IS_ADDON="yes" PKG_ADDON_NAME="iMON-MCE" PKG_ADDON_TYPE="xbmc.broken" addon() { : } ================================================ FILE: packages/addons/driver/sapphire/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="sapphire" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="driver.remote" PKG_SHORTDESC="Add-on removed" PKG_LONGDESC="Add-on removed" PKG_TOOLCHAIN="manual" PKG_ADDON_BROKEN="Sapphire Remote Driver was removed." PKG_IS_ADDON="yes" PKG_ADDON_NAME="Sapphire Remote Driver" PKG_ADDON_TYPE="xbmc.broken" addon() { : } ================================================ FILE: packages/addons/driver/steamcontroller/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="steamcontroller" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="driver" PKG_SHORTDESC="Add-on removed" PKG_LONGDESC="Add-on removed" PKG_TOOLCHAIN="manual" PKG_ADDON_BROKEN="Drivers are now natively supported by the kernel." PKG_IS_ADDON="yes" PKG_ADDON_NAME="Steam Controller Driver" PKG_ADDON_TYPE="xbmc.broken" addon() { : } ================================================ FILE: packages/addons/driver/sundtek-mediatv/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/driver/sundtek-mediatv/config/sundtek.conf ================================================ # # sundtek.conf # # enable HW PID filter (default on for RPi) use_hwpidfilter=off # enable listening on network enablenetwork=off # Lowest adapter number to start with, e.g. /dev/dvb/adapter5/frontend0 first_adapter=0 # Infrared Control Support is disabled/enabled ir_disabled=1 # trigger device_attach only once if more devices is used bulk_notification=on # Get adapter serial number with mediaclient -e # or look into file adapter_serial_number.txt #[SERIALNUMBER] # Choose initial DVB mode for hybrid DVB-T/DVB-C devices only #initial_dvb_mode=[DVBC|DVBT] # default mode is DVB-C, we must set it to DVB-T if needed #initial_dvb_mode=DVBT #[U123456789012] #initial_dvb_mode=DVBT #ir_disabled=1 #[NETWORK] #device=192.168.1.1:0 #device=192.168.1.1:1 ================================================ FILE: packages/addons/driver/sundtek-mediatv/config/sundtek.conf.full ================================================ # # sundtek.conf # # ----- GLOBAL SECTION ----- #Set loglevel for logging to /var/log/mediasrv.log #loglevel=[off|max] #default: min #max .. little bit more debug #bulk_notification[on|off] #default off, bulk_notification will only trigger device_attach once #after the the first device scan when the driver is started up #after this first scan, the notification will be triggered #normally again for each device. # #for example when 2 devices are attached to the system only one #notification will be triggered initially, any at a later time #attached device will generate another device_attach notification #by default each device will call the script which is set up with #device_attach #use_hwpidfilter=[on|off] #For DVB-C, DVB-T, DVB-S/S2 #enable PID filter, please be careful with that, there are only 15 HW Pid filters available #when more than 15 pids are set up the pid filter will be disabled automatically #dmhwpidfilter=[on|off] #default on, in some cases off might be useful to disable hw pid filter for settopboxes #if you get a black image when capturing a TV channel and watching another channel on the #same transponder - try this option and reboot #usb_transaction_delay=[0-20] #throttle the USB setup transactions, this can solve problems with weak USB stacks for #example for embedded boards, unit is milliseconds #usb_timeout=[0 - N] #USB timeout for each transaction in milliseconds, 0 default infinite #voltage_tone_off=[1 or 0] #0 .. default, normal behaviour #1 .. force DVB-S/S2 to not use any Voltage or Tone (ignore any user parameters) #ir_disabled=[1 or 0] #0 .. enable remote control polling, the driver will permanently check for remote control keys #1 .. disable remote control polling, might fix bugs with weak USB stacks on embedded boards # #Enable listening on network #enablenetwork=[on|off] #default: off #Lowest adapter number to start with, e.g. /dev/dvb/adapter5/frontend0 #first_adapter=5 #Lowest videodevice number to start with, e.g. /dev/video5 #first_videodev=5 #Call attach script when new device appears #device_attach=[PATH_TO_SCRIPT] [PARAMETER|DEVID] #"DEVID" will automatically be replaced with the device ID #Call detach script when device disappears #device_detach=[PATH_TO_SCRIPT] [PARAMETER|DEVID] #"DEVID" will automatically be replaced with the device ID #Dreambox especially for DM800HD (not SE!) #vtuner_acceleration=[on|off] #default off, accelerate Dreambox 800HD datatransfer between USB Stick and #DM800HD # ----- Section for adapter with [SERIALNUMBER] ----- #Get adapter serial number with /opt/bin/mediaclient -e #[SERIALNUMBER] #Description register as dreambox tuner #dreambox_support_fe1=[on|off] #default: off #Infrared protocol to use #ir_protocol=[RC5|NEC|RC6] #default: NEC #Keymap to use, e.g. "/lib/udev/rc_keymaps/vp702x" #rcmap=[PATH_TO_KEYMAP] #default: keymap which comes with the device #Choose initial DVB mode for hybrid DVB-T/DVB-C devices only #initial_dvb_mode=[DVBC|DVBT] #Call attach script when new device appears #device_attach=[PATH_TO_SCRIPT] [PARAMETER|DEVID] #"DEVID" will automatically be replaced with the device ID #Call detach script when device disappears #device_detach=[PATH_TO_SCRIPT] [PARAMETER|DEVID] #"DEVID" will automatically be replaced with the device ID #disable_atv=[0|1] #disable initialization of analogTV Frontend #Initial Audio Volume level for DVB-C/T Hybrid devices #volume=[0-127] #default: 118 # WSS callback (see http://en.wikipedia.org/wiki/Widescreen_signaling) # trigger script when the videoformat changes between 16:9 or 4:3 #wss_callback=[scriptname] # WSS_4_3_FULL # WSS_14_9_LETTERBOX_CENTRE # WSS_14_9_LETTERBOX_TOP # WSS_16_9_LETTERBOX_CENTRE # WSS_16_9_LETTERBOX_TOP # WSS_16_9_LETTERBOX_DEEPER # WSS_14_9_FULL_HEIGHT_4_3 # WSS_16_9_FULL_HEIGHT_16_9 # WSS_UNABLE_TO_DEMODULATE #Timeout in ms after that WSS_UNABLE_TO_DEMODULATE will be called #wss_demodulation_timeout=[MILLISECONDS][/code] #vtuner_skip0=vtuner0 # skip /dev/misc/vtuner0 can also be vtunerN #vtuner_skip1=vtuner1 # skip /dev/misc/vtuner1 can also be vtunerN #fe_helper=/path/to/channellist # override frequency setup and use parameters from channellist # VDR channellists can be used here (eg. created by w_scan) # this somewhat guarantees high speed channel switching # when used with a lousy player # Astra 19.2 Channellist: 1) ================================================ FILE: packages/addons/driver/sundtek-mediatv/package.mk ================================================ # 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="sundtek-mediatv" PKG_VERSION="7.0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="nonfree" PKG_SITE="http://support.sundtek.com/" PKG_URL="" PKG_DEPENDS_TARGET="xmlstarlet:host p7zip:host" PKG_SECTION="driver/dvb" PKG_SHORTDESC="Sundtek MediaTV: a Linux driver to add support for SUNDTEK USB DVB devices" PKG_LONGDESC="Install this to add support for Sundtek USB DVB devices." PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Sundtek MediaTV" PKG_ADDON_TYPE="xbmc.service" make_target() { mkdir -p ${PKG_BUILD} cd ${PKG_BUILD} case ${TARGET_ARCH} in x86_64) INSTALLER_URL="http://sundtek.de/media/netinst/64bit/installer.tar.gz" ;; arm) INSTALLER_URL="http://sundtek.de/media/netinst/armsysvhf/installer.tar.gz" ;; aarch64) INSTALLER_URL="http://sundtek.de/media/netinst/arm64/installer.tar.gz" ;; esac wget -O installer.tar.gz ${INSTALLER_URL} tar -xzf installer.tar.gz chmod -R 755 opt/ etc/ rm -f opt/bin/getinput.sh rm -f opt/bin/lirc.sh rm -fr opt/lib/pm/ wget -O version.used http://sundtek.de/media/latest.phtml } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/config/ cp -P ${PKG_DIR}/config/* ${ADDON_BUILD}/${PKG_ADDON_ID}/config/ cp -P ${PKG_DIR}/settings-default.xml ${ADDON_BUILD}/${PKG_ADDON_ID}/ cp -Pa ${PKG_BUILD}/opt/bin ${ADDON_BUILD}/${PKG_ADDON_ID}/ cp -Pa ${PKG_BUILD}/opt/lib ${ADDON_BUILD}/${PKG_ADDON_ID}/ cp ${PKG_BUILD}/version.used ${ADDON_BUILD}/${PKG_ADDON_ID}/ } ================================================ FILE: packages/addons/driver/sundtek-mediatv/settings-default.xml ================================================ ================================================ FILE: packages/addons/driver/sundtek-mediatv/source/bin/sundtek-mediatv.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /etc/profile net_tuner_num_fix() { local num=$1 [ -z "$num" ] && num=1 num=$(( $num *1 )) [ $num -lt 1 ] && num=1 num=$(( $num -1 )) echo $num } SUNDTEK_ADDON_DIR="$HOME/.kodi/addons/driver.dvb.sundtek-mediatv" SUNDTEK_ADDON_HOME="$HOME/.kodi/userdata/addon_data/driver.dvb.sundtek-mediatv" SUNDTEK_ADDON_SETTINGS="$SUNDTEK_ADDON_HOME/settings.xml" mkdir -p $SUNDTEK_ADDON_HOME # remove the entry BUILD_DATE="#" sed -i "s|\(id=\"BUILD_DATE\" .* values=\)\"[^\"]*\"|\1\"$BUILD_DATE\"|" $SUNDTEK_ADDON_DIR/resources/settings.xml if [ ! -f "$SUNDTEK_ADDON_HOME/sundtek.conf" ]; then cp $SUNDTEK_ADDON_DIR/config/* $SUNDTEK_ADDON_HOME/ # update driver on first run echo "update driver" >/tmp/ppp systemd-run $SUNDTEK_ADDON_DIR/bin/sundtek-update-driver.sh exit 0 # will be started later else # in case of missing entries in addon home's sundtek.conf entry_set="$(grep use_hwpidfilter $SUNDTEK_ADDON_HOME/sundtek.conf 2>/dev/null)" if [ -z "$entry_set" ]; then sed -i 's|^device_attach=.*|# device_attach not used anymore\n\n# enable HW PID filter\nuse_hwpidfilter=off\n\n# enable listening on network\nenablenetwork=off|g' $SUNDTEK_ADDON_HOME/sundtek.conf sed -i 's|^#first_adapter=.*|first_adapter=0|g' $SUNDTEK_ADDON_HOME/sundtek.conf sed -i 's|.*network tuner IP address (OpenELEC specific).*||g' $SUNDTEK_ADDON_HOME/sundtek.conf sed -i 's|.*network_tuner_ip=.*||g' $SUNDTEK_ADDON_HOME/sundtek.conf fi fi if [ ! -f "$SUNDTEK_ADDON_SETTINGS" ]; then cp $SUNDTEK_ADDON_DIR/settings-default.xml $SUNDTEK_ADDON_SETTINGS fi [ ! -f $SUNDTEK_ADDON_HOME/rc_key_enter.map ] && mv $SUNDTEK_ADDON_HOME/rc_key_enter $SUNDTEK_ADDON_HOME/rc_key_enter.map [ ! -f $SUNDTEK_ADDON_HOME/rc_key_ok.map ] && mv $SUNDTEK_ADDON_HOME/rc_key_ok $SUNDTEK_ADDON_HOME/rc_key_ok.map mkdir -p /var/config # check settings version XML_SETTINGS_VER="$(xmlstarlet sel -t -m settings -v @version $SUNDTEK_ADDON_SETTINGS)" if [ "$XML_SETTINGS_VER" = "2" ]; then xmlstarlet sel -t -m settings/setting -v @id -o "=\"" -v . -o "\"" -n "$SUNDTEK_ADDON_SETTINGS" > /var/config/sundtek-addon.conf else xmlstarlet sel -t -m settings -m setting -v @id -o "=\"" -v @value -o "\"" -n "$SUNDTEK_ADDON_SETTINGS" > /var/config/sundtek-addon.conf fi . /var/config/sundtek-addon.conf # check if there is new driver on web if [ "$CHECK_BOOT" = "true" ]; then if [ ! -f /var/run/sundtek.checked ]; then # only once after boot touch /var/run/sundtek.checked ( # wait some time before checking sleep 20 cd $SUNDTEK_ADDON_DIR wget -O version.latest http://sundtek.de/media/latest.phtml version_used=$(cat version.used) version_latest=$(cat version.latest) if [ "$version_used" != "$version_latest" ]; then # new version exist kodi-send -a "Notification(Sundtek, \"New driver version exist, update manually\", 4000, $SUNDTEK_ADDON_DIR/icon.png)" fi )& fi fi if [ -z "$(pidof mediasrv)" ]; then rm -f /var/log/mediasrv.log rm -f /var/log/mediaclient.log SUNDTEK_CONF_TMP=/tmp/sundtek.conf cp $SUNDTEK_ADDON_HOME/sundtek.conf $SUNDTEK_CONF_TMP [ -z "$LOWEST_ADAPTER_NUM" ] && LOWEST_ADAPTER_NUM=0 sed -i "s|^first_adapter=.*|first_adapter=$LOWEST_ADAPTER_NUM|g" $SUNDTEK_CONF_TMP # enable HW PID filter if [ "$ENABLE_HW_PID_FILTER" = "true" ]; then sed -i 's|^use_hwpidfilter=.*|use_hwpidfilter=on|g' $SUNDTEK_CONF_TMP else sed -i 's|^use_hwpidfilter=.*|use_hwpidfilter=off|g' $SUNDTEK_CONF_TMP fi # enable IR receiver if [ "$ENABLE_IR_RECEIVER" = "true" ]; then sed -i 's|^ir_disabled=.*|ir_disabled=0|g' $SUNDTEK_CONF_TMP else sed -i 's|^ir_disabled=.*|ir_disabled=1|g' $SUNDTEK_CONF_TMP fi if [ "$ALLOW_NET_USE" = "true" ]; then sed -i 's|^enablenetwork=.*|enablenetwork=on|g' $SUNDTEK_CONF_TMP else sed -i 's|^enablenetwork=.*|enablenetwork=off|g' $SUNDTEK_CONF_TMP fi [ "$DEVICE1_IP" = "0.0.0.0" ] && DEVICE1_IP="" [ "$DEVICE2_IP" = "0.0.0.0" ] && DEVICE2_IP="" [ "$DEVICE3_IP" = "0.0.0.0" ] && DEVICE3_IP="" [ "$DEVICE4_IP" = "0.0.0.0" ] && DEVICE4_IP="" [ "$DEVICE5_IP" = "0.0.0.0" ] && DEVICE5_IP="" DEVICE1_NUM=$(net_tuner_num_fix $DEVICE1_NUM) DEVICE2_NUM=$(net_tuner_num_fix $DEVICE2_NUM) DEVICE3_NUM=$(net_tuner_num_fix $DEVICE3_NUM) DEVICE4_NUM=$(net_tuner_num_fix $DEVICE4_NUM) DEVICE5_NUM=$(net_tuner_num_fix $DEVICE5_NUM) if [ "$USE_NET_TUNERS" = "true" -a -n "$DEVICE1_IP" ]; then # delete all network tuner entries awk '/^\[NETWORK\]/{flag=1; next} /^[^\[]|^$/{if (flag==1) next} /.*/{flag=0; print}' $SUNDTEK_CONF_TMP >${SUNDTEK_CONF_TMP}-net mv ${SUNDTEK_CONF_TMP}-net $SUNDTEK_CONF_TMP echo "" >>$SUNDTEK_CONF_TMP # remove empty lines at the end of file sed -i -e ':a' -e '/^\n*$/{$d;N;};/\n$/ba' $SUNDTEK_CONF_TMP # add entries echo -e "\n[NETWORK]" >>$SUNDTEK_CONF_TMP for dev in $(seq 0 $DEVICE1_NUM); do echo "device=$DEVICE1_IP:$dev" >>$SUNDTEK_CONF_TMP done if [ -n "$DEVICE2_IP" ]; then for dev in $(seq 0 $DEVICE2_NUM); do echo "device=$DEVICE2_IP:$dev" >>$SUNDTEK_CONF_TMP done if [ -n "$DEVICE3_IP" ]; then for dev in $(seq 0 $DEVICE3_NUM); do echo "device=$DEVICE3_IP:$dev" >>$SUNDTEK_CONF_TMP done if [ -n "$DEVICE4_IP" ]; then for dev in $(seq 0 $DEVICE4_NUM); do echo "device=$DEVICE4_IP:$dev" >>$SUNDTEK_CONF_TMP done if [ -n "$DEVICE5_IP" ]; then for dev in $(seq 0 $DEVICE5_NUM); do echo "device=$DEVICE5_IP:$dev" >>$SUNDTEK_CONF_TMP done fi fi fi fi else # delete all network tuner entries awk '/^\[NETWORK\]/{flag=1; next} /^[^\[]|^$/{if (flag==1) next} /.*/{flag=0; print}' $SUNDTEK_CONF_TMP >${SUNDTEK_CONF_TMP}-net mv ${SUNDTEK_CONF_TMP}-net $SUNDTEK_CONF_TMP echo "" >>$SUNDTEK_CONF_TMP # remove empty lines at the end of file sed -i -e ':a' -e '/^\n*$/{$d;N;};/\n$/ba' $SUNDTEK_CONF_TMP fi if [ "$ENABLE_TUNER_TYPES" = "true" ]; then # get tuner serial numbers SERIALS=$(cat /var/config/sundtek-addon.conf | sed -n 's|^ATTACHED_TUNER_\(.*\)_DVBMODE=.*|\1|gp' | sort | uniq) . /var/config/sundtek-addon.conf for SERIAL in $SERIALS; do DVBMODE=$(eval echo \$ATTACHED_TUNER_${SERIAL}_DVBMODE) IRPROT=$(eval echo \$ATTACHED_TUNER_${SERIAL}_IRPROT) KEYMAP=$(eval echo \$ATTACHED_TUNER_${SERIAL}_KEYMAP) if [ "$DVBMODE" = "DVB-T" ]; then # only set DVB-T because default is DVB-C (and DVB-S/S2 is not set either) DVBMODE="DVBT" else DVBMODE="" fi [ "$IRPROT" = "NEC" -o "$IRPROT" = "auto" ] && IRPROT="" [ ! -f $KEYMAP ] && KEYMAP="" # remove setttings for this tuner awk -v val="[$SERIAL]" '$0 == val {flag=1; next} /^[^\[]|^$/{if (flag==1) next} /.*/{flag=0; print}' $SUNDTEK_CONF_TMP >${SUNDTEK_CONF_TMP}-types mv ${SUNDTEK_CONF_TMP}-types $SUNDTEK_CONF_TMP echo "" >>$SUNDTEK_CONF_TMP # remove empty lines at the end of file sed -i -e ':a' -e '/^\n*$/{$d;N;};/\n$/ba' $SUNDTEK_CONF_TMP echo "" >>$SUNDTEK_CONF_TMP echo "[$SERIAL]" >>$SUNDTEK_CONF_TMP [ -n "$DVBMODE" ] && echo "initial_dvb_mode=$DVBMODE" >>$SUNDTEK_CONF_TMP if [ "$ENABLE_IR_RECEIVER" = "true" ]; then echo "ir_disabled=0" >>$SUNDTEK_CONF_TMP else echo "ir_disabled=1" >>$SUNDTEK_CONF_TMP fi [ -n "$IRPROT" ] && echo "ir_protocol=$IRPROT" >>$SUNDTEK_CONF_TMP [ -n "$KEYMAP" ] && echo "rcmap=$KEYMAP" >>$SUNDTEK_CONF_TMP echo "" >>$SUNDTEK_CONF_TMP done fi md5_1=$(md5sum -b $SUNDTEK_CONF_TMP | awk '{print $1}') md5_2=$(md5sum -b $SUNDTEK_ADDON_HOME/sundtek.conf | awk '{print $1}') if [ "$md5_1" != "$md5_2" ]; then # file changed - copy to addon home cp $SUNDTEK_CONF_TMP $SUNDTEK_ADDON_HOME/sundtek.conf fi chmod +x $SUNDTEK_ADDON_DIR/bin/* mediasrv --wait-for-devices -p $SUNDTEK_ADDON_DIR/bin -c $SUNDTEK_ADDON_HOME/sundtek.conf -d # wait few seconds [ -z "$SETTLE_TIME" ] && SETTLE_TIME=0 SETTLE_TIME=$(( $SETTLE_TIME *1 )) if [ $SETTLE_TIME -gt 0 ]; then logger -t Sundtek "### Settle for $SETTLE_TIME sec ###" sleep $SETTLE_TIME fi if [ "$RUN_USER_SCRIPT" = "true" -a -f "$SUNDTEK_ADDON_HOME/userscript.sh" ]; then logger -t Sundtek "### Running user script $SUNDTEK_ADDON_HOME/userscript.sh ###" cat $SUNDTEK_ADDON_HOME/userscript.sh | dos2unix >/var/run/sundtek-userscript.sh sh /var/run/sundtek-userscript.sh fi # save adapter serial number serial_number_old=$(cat $SUNDTEK_ADDON_HOME/adapters.txt 2>/dev/null) serial_number_new=$(mediaclient -e | awk '/device / {print $0} /SERIAL/ {id=1} /ID:/ {if (id==1) print $2}') if [ "$serial_number_old" != "$serial_number_new" ]; then echo "$serial_number_new" >$SUNDTEK_ADDON_HOME/adapters.txt fi fi # change build date in addon settings BUILD_DATE=$(mediasrv --build 2>&1) sed -i "s|\(id=\"BUILD_DATE\" .* values=\)\"[^\"]*\"|\1\"$BUILD_DATE\"|" $SUNDTEK_ADDON_DIR/resources/settings.xml logger -t Sundtek "### Sundtek ready ($BUILD_DATE) ###" ================================================ FILE: packages/addons/driver/sundtek-mediatv/source/bin/sundtek-mediatv.stop ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /etc/profile ADDON_DIR="$HOME/.kodi/addons/driver.dvb.sundtek-mediatv" logger -t Sundtek "### Sundtek driver stop ###" mediaclient --shutdown ================================================ FILE: packages/addons/driver/sundtek-mediatv/source/bin/sundtek-update-driver.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /etc/profile SUNDTEK_ADDON_DIR="$HOME/.kodi/addons/driver.dvb.sundtek-mediatv" SUNDTEK_ADDON_HOME="$HOME/.kodi/userdata/addon_data/driver.dvb.sundtek-mediatv" SUNDTEK_ADDON_SETTINGS="$SUNDTEK_ADDON_HOME/settings.xml" trap_exit_install() { kodi-send -a "Notification(Sundtek, Something went wrong. Cleaning..., 8000, $SUNDTEK_ADDON_DIR/icon.png)" cd "$SUNDTEK_ADDON_DIR" rm -fr tmp exit 5 } # kill process systemctl stop driver.dvb.sundtek-mediatv killall -9 mediaclient &>/dev/null killall -9 mediasrv &>/dev/null # remove the entry BUILD_DATE="#" sed -i "s|\(id=\"BUILD_DATE\" .* values=\)\"[^\"]*\"|\1\"$BUILD_DATE\"|" $SUNDTEK_ADDON_DIR/resources/settings.xml # exit on errors set -e trap trap_exit_install EXIT cd "$SUNDTEK_ADDON_DIR" rm -fr tmp mkdir tmp cd tmp logger -t Sundtek "### Starting updating driver ###" kodi-send -a "Notification(Sundtek, Starting updating driver, 3000, $SUNDTEK_ADDON_DIR/icon.png)" wget -O ../version.used http://sundtek.de/media/latest.phtml if [ $? -ne 0 ]; then logger -t Sundtek "### Can't get latest version ###" kodi-send -a "Notification(Sundtek, Cant get latest version, 8000, $SUNDTEK_ADDON_DIR/icon.png)" cd .. rm -fr tmp/ exit 1 fi ARCH=$(sed -n 's|[^.]*\.\([^-]*\)-.*|\1|p' /etc/release | tr -d '\n') if [ "$ARCH" = "x86_64" ]; then INSTALLER_URL="http://sundtek.de/media/netinst/64bit/installer.tar.gz" elif [ "$ARCH" = "arm" ]; then INSTALLER_URL="http://sundtek.de/media/netinst/armsysvhf/installer.tar.gz" elif [ "$ARCH" = "aarch64" ]; then INSTALLER_URL="http://sundtek.de/media/netinst/arm64/installer.tar.gz" else logger -t Sundtek "### Unsupported architecture ###" kodi-send -a "Notification(Sundtek, Unsupported architecture, 8000, $SUNDTEK_ADDON_DIR/icon.png)" cd .. rm -fr tmp exit 2 fi logger -t Sundtek "### Downloading driver archive for $ARCH ###" kodi-send -a "Notification(Sundtek, Downloading driver archive for $ARCH, 3000, $SUNDTEK_ADDON_DIR/icon.png)" wget -O installer.tar.gz $INSTALLER_URL if [ $? -ne 0 ]; then logger -t Sundtek "### Archive damaged ###" kodi-send -a "Notification(Sundtek, Download failed, 8000, $SUNDTEK_ADDON_DIR/icon.png)" cd .. rm -fr tmp/ exit 3 fi logger -t Sundtek "### Extracting archive ###" kodi-send -a "Notification(Sundtek, Extracting archive, 3000, $SUNDTEK_ADDON_DIR/icon.png)" tar -xzf installer.tar.gz if [ $? -ne 0 ]; then logger -t Sundtek "### Archive damaged ###" kodi-send -a "Notification(Sundtek, Archive damaged, 8000, $SUNDTEK_ADDON_DIR/icon.png)" cd .. rm -fr tmp/ exit 4 fi # fix permissions chmod -R 755 opt/ etc/ rm -f opt/bin/getinput.sh rm -f opt/bin/lirc.sh rm -fr opt/lib/pm/ cp -Pa opt/bin/* ../bin/ cp -Pa opt/lib/* ../lib/ cd .. rm -fr tmp logger -t Sundtek "### Driver update finished ###" kodi-send -a "Notification(Sundtek, Driver update finished, 5000, $SUNDTEK_ADDON_DIR/icon.png)" kodi-send -a "Notification(Sundtek, Please reboot, 5000, $SUNDTEK_ADDON_DIR/icon.png)" trap - EXIT systemctl start driver.dvb.sundtek-mediatv exit 0 ================================================ FILE: packages/addons/driver/sundtek-mediatv/source/bin/userspace-driver.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /etc/profile SUNDTEK_ADDON_DIR="$HOME/.kodi/addons/driver.dvb.sundtek-mediatv" if [ -f $SUNDTEK_ADDON_DIR/lib/libmediaclient.so ]; then logger -t Sundtek "### Preloading library ###" export LD_PRELOAD=$SUNDTEK_ADDON_DIR/lib/libmediaclient.so else logger -t Sundtek "### Preloading library doesn't exist ###" fi ================================================ FILE: packages/addons/driver/sundtek-mediatv/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) ================================================ FILE: packages/addons/driver/sundtek-mediatv/source/resources/actions.py ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) import os import sys import subprocess import xbmcaddon import xbmcvfs __settings__ = xbmcaddon.Addon(id = 'driver.dvb.sundtek-mediatv') __cwd__ = __settings__.getAddonInfo('path') __resources_lib__ = xbmcvfs.translatePath(os.path.join(__cwd__, 'resources', 'lib')) __settings_xml__ = xbmcvfs.translatePath(os.path.join(__cwd__, 'resources', 'settings.xml')) __mediaclient__ = xbmcvfs.translatePath(os.path.join(__cwd__, 'bin', 'mediaclient')) __mediaclient_e__ = __mediaclient__ + ' -e' __update_sh__ = xbmcvfs.translatePath(os.path.join(__cwd__, 'bin', 'sundtek-update-driver.sh')) if len(sys.argv) == 2: if sys.argv[1] == 'refresh_tuners': print('sundtek refresh tuners') sys.path.append(__resources_lib__) from functions import refresh_sundtek_tuners refresh_sundtek_tuners(__settings_xml__, __mediaclient_e__) __settings__.openSettings() elif sys.argv[1] == 'update_driver': print('sundtek update driver') proc = subprocess.Popen([__update_sh__], shell = True) return_code = proc.wait() print('sundtek update driver return value', return_code) __settings__.openSettings() ================================================ FILE: packages/addons/driver/sundtek-mediatv/source/resources/language/resource.language.de_de/strings.po ================================================ # Kodi Media Center language file # Addon Name: Sundtek MediaTV # Addon id: driver.dvb.sundtek-mediatv # Addon Provider: Team LibreELEC msgid "" msgstr "" "Project-Id-Version: Kodi Addons\n" "Report-Msgid-Bugs-To: https://forum.libreelec.tv\n" "POT-Creation-Date: 2021-09-02 20:00+CEST\n" "PO-Revision-Date: 2021-09-02 20:00+CEST\n" "Last-Translator: vpeter\n" "Language-Team: Team LibreELEC\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: en_GB\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#1000" msgid "General" msgstr "Allgemein" msgctxt "#1014" msgid "Extra delay [sec]" msgstr "Verzögerung bevor Treiber gestartet wird [Sek.]" msgctxt "#1015" msgid "Run user script" msgstr "Skript welches vom Treiber-Stack gestartet werden soll" msgctxt "#1030" msgid "Enable hardware PID filter" msgstr "Hardware PID Filter einschalten" msgctxt "#1035" msgid "Enable IR receiver" msgstr "Fernbedienung unterstützen" msgctxt "#1040" msgid "Lowest adapter number (/dev/dvb/adapterX/)" msgstr "Niedrigste Adapter Nummer (/dev/dvb/adapterX/)" msgctxt "#1050" msgid "Enable suspend/resume the driver" msgstr "Suspend / Resume des Treibers zulassen" msgctxt "#2000" msgid "Networking" msgstr "Netzwerksupport" msgctxt "#2005" msgid "Share local tuner over network" msgstr "Netzwerkserver aktivieren" msgctxt "#2010" msgid "Use network shared tuners" msgstr "Mit Netzwerk-Tunern verbinden" msgctxt "#2020" msgid "Server 1 IP address" msgstr "Server 1 IP Adresse" msgctxt "#2021" msgid " # of tuners" msgstr " # Tuner ID" msgctxt "#2030" msgid "Server 2 IP address" msgstr "Server 2 IP Adresse" msgctxt "#2031" msgid " # of tuners" msgstr " # Tuner ID" msgctxt "#2040" msgid "Server 3 IP address" msgstr "Server 3 IP Adresse" msgctxt "#2041" msgid " # of tuners" msgstr " # Tuner ID" msgctxt "#2050" msgid "Server 4 IP address" msgstr "Server 4 IP Adresse" msgctxt "#2051" msgid " # of tuners" msgstr " # Tuner ID" msgctxt "#2060" msgid "Server 5 IP address" msgstr "Server 5 IP Adresse" msgctxt "#2061" msgid " # of tuners" msgstr " # Tuner ID" msgctxt "#3000" msgid "Driver" msgstr "Treiber" msgctxt "#3005" msgid "Driver version" msgstr "Treiber-Version" msgctxt "#3010" msgid " >>> Update driver now <<< " msgstr " >>> Treiber jetzt aktualisieren <<< " msgctxt "#3020" msgid "Check for new driver version at boot" msgstr "Bei Neustart auf neue Treiber-Version prüfen" msgctxt "#9000" msgid "Tuner settings" msgstr "Geräte Einstellungen" msgctxt "#9005" msgid "Enable modifying settings" msgstr "Geräte-Einstellung ändern" msgctxt "#9010" msgid " >>> Refresh tuners <<< " msgstr " >>> Tuner-Liste aktualisieren <<<" msgctxt "#9020" msgid " IR protocol" msgstr " IR Protokoll" msgctxt "#9030" msgid " Keymap filename" msgstr " Keymap Date" ================================================ FILE: packages/addons/driver/sundtek-mediatv/source/resources/language/resource.language.en_gb/strings.po ================================================ # Kodi Media Center language file # Addon Name: Sundtek MediaTV # Addon id: driver.dvb.sundtek-mediatv # Addon Provider: Team LibreELEC msgid "" msgstr "" "Project-Id-Version: Kodi Addons\n" "Report-Msgid-Bugs-To: https://forum.libreelec.tv\n" "POT-Creation-Date: 2021-09-02 20:00+CEST\n" "PO-Revision-Date: 2021-09-02 20:00+CEST\n" "Last-Translator: vpeter\n" "Language-Team: Team LibreELEC\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: en_GB\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#1000" msgid "General" msgstr "" msgctxt "#1014" msgid "Extra delay [sec]" msgstr "" msgctxt "#1015" msgid "Run user script" msgstr "" msgctxt "#1030" msgid "Enable hardware PID filter" msgstr "" msgctxt "#1035" msgid "Enable IR receiver" msgstr "" msgctxt "#1040" msgid "Lowest adapter number (/dev/dvb/adapterX/)" msgstr "" msgctxt "#1050" msgid "Enable suspend/resume the driver" msgstr "" msgctxt "#2000" msgid "Networking" msgstr "" msgctxt "#2005" msgid "Share local tuner over network" msgstr "" msgctxt "#2010" msgid "Use network shared tuners" msgstr "" msgctxt "#2020" msgid "Server 1 IP address" msgstr "" msgctxt "#2021" msgid " # of tuners" msgstr "" msgctxt "#2030" msgid "Server 2 IP address" msgstr "" msgctxt "#2031" msgid " # of tuners" msgstr "" msgctxt "#2040" msgid "Server 3 IP address" msgstr "" msgctxt "#2041" msgid " # of tuners" msgstr "" msgctxt "#2050" msgid "Server 4 IP address" msgstr "" msgctxt "#2051" msgid " # of tuners" msgstr "" msgctxt "#2060" msgid "Server 5 IP address" msgstr "" msgctxt "#2061" msgid " # of tuners" msgstr "" msgctxt "#3000" msgid "Driver" msgstr "" msgctxt "#3005" msgid "Driver version" msgstr "" msgctxt "#3010" msgid " >>> Update driver now <<< " msgstr "" msgctxt "#3020" msgid "Check for new driver version at boot" msgstr "" msgctxt "#9000" msgid "Tuner settings" msgstr "" msgctxt "#9005" msgid "Enable modifying settings" msgstr "" msgctxt "#9010" msgid " >>> Refresh tuners <<< " msgstr "" msgctxt "#9020" msgid " IR protocol" msgstr "" msgctxt "#9030" msgid " Keymap filename" msgstr "" ================================================ FILE: packages/addons/driver/sundtek-mediatv/source/resources/lib/functions.py ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) import os import sys import shutil import xmlpp from xml.dom import minidom __sundtek_userspace__ = '/storage/.kodi/userdata/addon_data/driver.dvb.sundtek-mediatv/' ###################################################################################################### # backup setting.xml file only if backup doesn't exist def settings_backup(settings_xml): try: with open(settings_xml + '_orig') as f: pass except IOError as e: shutil.copyfile(settings_xml, settings_xml + '_orig') ###################################################################################################### # restore setting.xml file from backup def settings_restore(settings_xml): try: shutil.copyfile(settings_xml + '_orig', settings_xml) except IOError as e: print('Error restoring file:', settings_xml) ###################################################################################################### # get hdhomerun supported devices on a system (only name like 101ADD2B-0) def get_devices_hdhomerun(hdhomerun_log): tuners = [] try: for line in open(hdhomerun_log, 'r'): line = line.strip() if line.startswith('Registered tuner'): name = line.split(':'); name = name[2].strip() tuners.append(name) except IOError: print('Error reading hdhomerun log file', hdhomerun_log) return tuners """ root ~ # grep "Registered tuner" /var/log/dvbhdhomerun.log Registered tuner, id from kernel: 0 name: 101ADD2B-0 Registered tuner, id from kernel: 1 name: 101ADD2B-1 Registered tuner, id from kernel: 2 name: 1031D75A-0 Registered tuner, id from kernel: 3 name: 1031D75A-1 """ ###################################################################################################### # get sundtek supported devices on a system (name, serial number, type) def get_devices_sundtek(mediaclient_e): tuners = [] try: p = os.popen(mediaclient_e, "r") while 1: line = p.readline() if not line: break else: str = line.strip() if str.startswith('device '): name = str[str.find("[")+1:str.find("]")] tuners.append([name, 0, []]) if str.startswith('[SERIAL]:'): line = p.readline() str = line.strip() if str.startswith('ID:'): id = str.split(':'); id = id[1].strip() tuners[len(tuners)-1][1] = id if str.startswith('[DVB'): types_arr = tuners[len(tuners)-1][2] str = str.translate(dict.fromkeys(map(ord, '[]:'), None)) types = str.split(",") for i in range(len(types)): if types[i] == 'DVB-C': types_arr.append('c') elif types[i] == 'DVB-T': types_arr.append('t') elif types[i] == 'DVB-T2': types_arr.append('t2') elif types[i] == 'DVB-S/S2': types_arr.append('s') tuners[len(tuners)-1][2] = types_arr except IOError: print('Error getting sundtek tuners info') return tuners """ root ~ # mediaclient -e **** List of Media Hardware Devices **** device 0: [Sundtek MediaTV Pro (USB 2.0)] DVB-C, DVB-T, ANALOG-TV, FM-RADIO, REMOTE-CONTROL, OSS-AUDIO, RDS [BUS]: ID: 1-7 [SERIAL]: ID: U110763295205 [DVB-C]: FRONTEND: /dev/dvb/adapter0/frontend0 DVR: /dev/dvb/adapter0/dvr0 DMX: /dev/dvb/adapter0/demux0 [DVB-T]: FRONTEND: /dev/dvb/adapter0/frontend0 DVR: /dev/dvb/adapter0/dvr0 DMX: /dev/dvb/adapter0/demux0 [ANALOG-TV]: VIDEO0: /dev/video0 VBI0: /dev/vbi0 [FM-RADIO]: RADIO0: /dev/radio0 RDS: /dev/rds0 [REMOTECONTROL]: INPUT0: /dev/mediainput0 [OSS]: OSS0: /dev/dsp0 **** List of Media Hardware Devices **** device 0: [MediaTV Digital Home III (EU)] DVB-C, DVB-T, DVB-T2, REMOTE-CONTROL [INFO]: STATUS: STANDBY [BUS]: ID: 2-5 [SERIAL]: ID: U170130193421 [DVB-C,DVB-T,DVB-T2]: FRONTEND: /dev/dvb/adapter0/frontend0 DVR: /dev/dvb/adapter0/dvr0 DMX: /dev/dvb/adapter0/demux0 [REMOTECONTROL]: INPUT0: /dev/mediainput0 """ ###################################################################################################### # parse settings.xml file def parse_settings(settings_xml): try: xmldoc = minidom.parse(settings_xml) category = xmldoc.getElementsByTagName('category') return xmldoc except Exception as inst: print('Error parse settings file', settings_xml) return None ###################################################################################################### # remove all nodes with id started with ATTACHED_TUNER_ def remove_old_tuners(xmldoc): category = xmldoc.getElementsByTagName('category') for node_cat in category: setting = node_cat.getElementsByTagName('setting') for node_set in setting : if 'id' in node_set.attributes.keys() and not node_set.getAttribute('id').find('ATTACHED_TUNER_'): node_set.parentNode.removeChild(node_set) ###################################################################################################### # add new hdhomerun tuners def add_hdhomerun(xmldoc, node_cat, tuners): for ix, tuner in enumerate(tuners): tuner_var = tuner.replace('-', '_') node1 = xmldoc.createElement("setting") node1.setAttribute("id", 'ATTACHED_TUNER_' + tuner_var + '_DVBMODE') node1.setAttribute("label", tuner) node1.setAttribute("type", 'labelenum') node1.setAttribute("default", 'auto') node1.setAttribute("values", 'auto|ATSC|DVB-C|DVB-T') node_cat.appendChild(node1) node2 = xmldoc.createElement("setting") node2.setAttribute("id", 'ATTACHED_TUNER_' + tuner_var + '_FULLNAME') node2.setAttribute("label", '9020') node2.setAttribute("type", 'bool') node2.setAttribute("default", 'false') node_cat.appendChild(node2) node3 = xmldoc.createElement("setting") node3.setAttribute("id", 'ATTACHED_TUNER_' + tuner_var + '_DISABLE') node3.setAttribute("label", '9030') node3.setAttribute("type", 'bool') node3.setAttribute("default", 'false') node_cat.appendChild(node3) # for tuner ###################################################################################################### # add new sundtek tuners def add_sundtek(xmldoc, node_cat, tuners): for ix, tuner in enumerate(tuners): tuner_name = tuner[0] tuner_serial = tuner[1] tuner_types = tuner[2] node1 = xmldoc.createElement("setting") node1.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_DVBMODE') node1.setAttribute("label", tuner_name + ", " + tuner_serial) node1.setAttribute("type", 'labelenum') if len(tuner_types) == 0: values = 'unkn' default = 'unkn' else: values = '' default = '' for ix, type in enumerate(tuner_types): if type == 'c': type_str = 'DVB-C' elif type == 't': type_str = 'DVB-T' elif type == 't2': type_str = 'DVB-T2' elif type == 's': type_str = 'DVB-S/S2' else: type_str = 'unkn' if not default: # first one default = type_str; if ix == 0: values = type_str else: values = values + '|' + type_str node1.setAttribute("default", default) node1.setAttribute("values", values) node_cat.appendChild(node1) node2 = xmldoc.createElement("setting") node2.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_IRPROT') node2.setAttribute("label", '9020') node2.setAttribute("type", 'labelenum') node2.setAttribute("default", 'auto') node2.setAttribute("values", 'auto|RC5|NEC|RC6') node_cat.appendChild(node2) node3 = xmldoc.createElement("setting") node3.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_KEYMAP') node3.setAttribute("label", '9030') node3.setAttribute("type", 'file') node3.setAttribute("mask", '*.map') node3.setAttribute("default", __sundtek_userspace__) node_cat.appendChild(node3) # for tuner ###################################################################################################### # add new ATTACHED_TUNER_ nodes for available tuners def add_new_tuners(xmldoc, tuners, which): category = xmldoc.getElementsByTagName('category') for node_cat in category: setting = node_cat.getElementsByTagName('setting') for node_set in setting : if 'label' in node_set.attributes.keys() and '9010' in node_set.getAttribute('label'): if which == 'hdhomerun': add_hdhomerun(xmldoc, node_cat, tuners) break elif which == 'sundtek': add_sundtek(xmldoc, node_cat, tuners) break ###################################################################################################### # save settings.xml file back def save_settings(settings_xml, xmldoc): try: outputfile = open(settings_xml, 'w') xmlpp.pprint(xmldoc.toxml(), output = outputfile, indent=2, width=500) outputfile.close() except IOError: print('Error saving file:', settings_xml) settings_restore(settings_xml) ###################################################################################################### # refresh hdhomerun tuners in settings.xml file def refresh_hdhomerun_tuners(settings_xml, hdhomerun_log): settings_backup(settings_xml) tuners = get_devices_hdhomerun(hdhomerun_log) xmldoc = parse_settings(settings_xml) if xmldoc == None: print('No hdhomerun tuners found') else: remove_old_tuners(xmldoc) add_new_tuners(xmldoc, tuners, 'hdhomerun') save_settings(settings_xml, xmldoc) ###################################################################################################### # refresh sundtek tuners in settings.xml file def refresh_sundtek_tuners(settings_xml, mediaclient_e): settings_backup(settings_xml) tuners = get_devices_sundtek(mediaclient_e) xmldoc = parse_settings(settings_xml) if xmldoc == None: print('No sundtek tuners found') else: remove_old_tuners(xmldoc) add_new_tuners(xmldoc, tuners, 'sundtek') save_settings(settings_xml, xmldoc) ================================================ FILE: packages/addons/driver/sundtek-mediatv/source/resources/lib/xmlpp.py ================================================ """Pretty print an XML document. LICENCE: Copyright (c) 2008, Fredrik Ekholdt All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Fredrik Ekholdt nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.""" import sys as _sys import re as _re def _usage(this_file): return """SYNOPSIS: pretty print an XML document USAGE: python %s \n""" % this_file def _pprint_line(indent_level, line, width=100, output=_sys.stdout, ignore_contents = False): if line.strip(): start = "" number_chars = 0 for l in range(indent_level): start = start + " " number_chars = number_chars + 1 if not ignore_contents: try: elem_start = _re.findall("(\<\W{0,1}\w+:\w+) ?", line)[0] elem_finished = _re.findall("([?|\]\]/|\-\-]*\>)", line)[0] #should not have * attrs = _re.findall("(\S*?\=\".*?\")", line) output.write(start + elem_start) number_chars = len(start + elem_start) for attr in attrs: if (attrs.index(attr) + 1) == len(attrs): number_chars = number_chars + len(elem_finished) if (number_chars + len(attr) + 1) > width: output.write("\n") for i in range(len(start + elem_start) + 1): output.write(" ") number_chars = len(start + elem_start) + 1 else: output.write(" ") number_chars = number_chars + 1 output.write(attr) number_chars = number_chars + len(attr) output.write(elem_finished + "\n") except IndexError: #give up pretty print this line output.write(start + line + "\n") else: output.write(start + line + "\n") def _pprint_elem_content(indent_level, line, output=_sys.stdout): if line.strip(): for l in range(indent_level): output.write(" ") output.write(line + "\n") def _get_next_elem(data): start_pos = data.find("<") end_pos = data.find(">") + 1 retval = data[start_pos:end_pos] stopper = retval.rfind("/") ignore_contents = False if stopper < retval.rfind("\""): stopper = -1 single = (stopper > -1 and ((retval.find(">") - stopper) < (stopper - retval.find("<")))) ignore_excl = retval.find(" -1 ignore_question = retval.find(" -1 if ignore_excl: ignore_contents = True cdata = retval.find(" -1 if cdata: end_pos = data.find("]]>") if end_pos > -1: end_pos = end_pos + len("]]>") stopper = end_pos else: end_pos = data.find("-->") if end_pos > -1: end_pos = end_pos + len("-->") stopper = end_pos retval = data[start_pos:end_pos] elif ignore_question: end_pos = data.find("?>") + len("?>") ignore = ignore_excl or ignore_question no_indent = ignore or single return start_pos, \ end_pos, \ stopper > -1, \ no_indent, \ ignore_contents def get_pprint(xml, indent=4, width=80): """Returns the pretty printed xml """ class out: output = "" def write(self, string): self.output += string out = out() pprint(xml, output=out, indent=indent, width=width) return out.output def pprint(xml, output=_sys.stdout, indent=4, width=80): """Pretty print xml. Use output to select output stream. Default is sys.stdout Use indent to select indentation level. Default is 4 """ data = xml indent_level = 0 start_pos, end_pos, is_stop, no_indent, ignore_contents = _get_next_elem(data) while ((start_pos > -1 and end_pos > -1)): _pprint_elem_content(indent_level, data[:start_pos].strip(), output=output) data = data[start_pos:] if is_stop and not no_indent: indent_level = indent_level - indent _pprint_line(indent_level, data[:end_pos - start_pos], width=width, output=output, ignore_contents=ignore_contents) data = data[end_pos - start_pos:] if not is_stop and not no_indent : indent_level = indent_level + indent if not data: break else: start_pos, end_pos, is_stop, no_indent, ignore_contents = _get_next_elem(data) if __name__ == "__main__": if "-h" in _sys.argv or "--help" in _sys.argv: _sys.stderr.write(_usage(_sys.argv[0])) _sys.exit(1) if len(_sys.argv) < 2: _sys.stderr.write(_usage(_sys.argv[0])) _sys.exit(1) else: filename = _sys.argv[1] fh = open(filename) pprint(fh.read(), output=_sys.stdout, indent=4, width=80) ================================================ FILE: packages/addons/driver/sundtek-mediatv/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/driver/sundtek-mediatv/source/sleep.d/99-sundtek-mediatv.power ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /etc/profile oe_setup_addon driver.dvb.sundtek-mediatv if [ "$SUSPEND_DRIVER" = "true" ]; then case "$1" in pre) systemctl stop driver.dvb.sundtek-mediatv.service ;; post) systemctl start driver.dvb.sundtek-mediatv.service ;; esac fi ================================================ FILE: packages/addons/driver/sundtek-mediatv/source/system.d/driver.dvb.sundtek-mediatv.service ================================================ [Unit] Description=Sundtek driver service After=network-online.service Requires=network-online.service [Service] Type=oneshot ExecStart=-/bin/sh -c "exec sh /storage/.kodi/addons/driver.dvb.sundtek-mediatv/bin/sundtek-mediatv.start" ExecStop=-/bin/sh -c "exec sh /storage/.kodi/addons/driver.dvb.sundtek-mediatv/bin/sundtek-mediatv.stop" RemainAfterExit=yes [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/libraries/adafruit-libraries/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/libraries/adafruit-libraries/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="adafruit-libraries" PKG_VERSION="" PKG_REV="0" PKG_ARCH="any" PKG_ADDON_PROJECTS="RPi ARM" PKG_LICENSE="MIT" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="Adafruit_Python_ADS1x15 Adafruit_Python_ADXL345 Adafruit_Python_BMP Adafruit_Python_CharLCD Adafruit_Python_DHT Adafruit_Python_GPIO Adafruit_Python_LED_Backpack Adafruit_Python_LSM303 Adafruit_Python_MCP3008 Adafruit_Python_MCP4725 Adafruit_Python_PCA9685 Adafruit_Python_PureIO Adafruit_Python_SI1145 Adafruit_Python_SSD1306 Adafruit_Python_TCS34725 Adafruit_Python_VCNL40xx Adafruit_Python_WS2801" PKG_SECTION="virtual" PKG_SHORTDESC="A bundle of libraries from Adafruit" PKG_LONGDESC="This is a bundle of various Adafruit Python libraries. Included are: ADS1x15, ADXL345, BMP, CharLCD, DHT, GPIO, LED_Backpack, LSM303, MCP3008, MCP4725, PCA9685, PureIO, SI1145, SSD1306, TCS34725, VCNL40xx, WS2801" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Adafruit Libraries" PKG_ADDON_TYPE="xbmc.python.module" PKG_ADDON_REQUIRES="virtual.rpi-tools:8.0.102" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/lib cp -PR $(get_build_dir Adafruit_Python_ADS1x15)/Adafruit_ADS1x15 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir Adafruit_Python_ADXL345)/Adafruit_ADXL345 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir Adafruit_Python_BMP)/Adafruit_BMP ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir Adafruit_Python_CharLCD)/Adafruit_CharLCD ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir Adafruit_Python_DHT)/build/lib/Adafruit_DHT ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir Adafruit_Python_GPIO)/Adafruit_GPIO ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir Adafruit_Python_LED_Backpack)/Adafruit_LED_Backpack ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir Adafruit_Python_LSM303)/Adafruit_LSM303 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir Adafruit_Python_MCP3008)/Adafruit_MCP3008 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir Adafruit_Python_MCP4725)/Adafruit_MCP4725 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir Adafruit_Python_PCA9685)/Adafruit_PCA9685 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir Adafruit_Python_PureIO)/Adafruit_PureIO ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir Adafruit_Python_SI1145)/SI1145 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir Adafruit_Python_SSD1306)/Adafruit_SSD1306 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir Adafruit_Python_TCS34725)/Adafruit_TCS34725 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir Adafruit_Python_VCNL40xx)/Adafruit_VCNL40xx ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir Adafruit_Python_WS2801)/Adafruit_WS2801 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ } ================================================ FILE: packages/addons/libraries/adafruit-libraries/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import xbmcgui dialog = xbmcgui.Dialog() dialog.ok('', 'This is a python-library-only addon') ================================================ FILE: packages/addons/repository/repository.linuxserver.docker/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/repository/repository.linuxserver.docker/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="repository.linuxserver.docker" PKG_VERSION="9.0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://linuxserver.io" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="" PKG_SHORTDESC="LinuxServer.io docker add-on repository" PKG_LONGDESC="LinuxServer.io docker add-on repository" PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="LinuxServer.io Repository" PKG_ADDON_TYPE="xbmc.addon.repository" make_target() { sed -e "s|@PKG_VERSION@|${PKG_VERSION}|g" \ -e "s|@PKG_REV@|${PKG_REV}|g" \ -i addon.xml } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID} cp -R ${PKG_BUILD}/* ${ADDON_BUILD}/${PKG_ADDON_ID} } ================================================ FILE: packages/addons/repository/repository.linuxserver.docker/sources/addon.xml ================================================ https://raw.githubusercontent.com/linuxserver/libreelec-addon-repo/master/addons.xml https://raw.githubusercontent.com/linuxserver/libreelec-addon-repo/master/addons.xml.md5 https://raw.githubusercontent.com/linuxserver/libreelec-addon-repo/master/download false Install add-ons from LinuxServer.io's docker repository Download and install docker container add-ons from the LinuxServer.io repository. Please visit https://linuxserver.io for more information. all @PKG_ADDON_NEWS@ resources/icon.png resources/fanart.png @PKG_ADDON_SCREENSHOT@ ================================================ FILE: packages/addons/script/driverselect/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) PKG_NAME="driverselect" PKG_VERSION="d0f919f165f0814533548e80d4e3c0d24c1b153a" PKG_SHA256="bc6ad1996bbc3249aa2963cd5440d9b4e043701ff0883bb54732b7e923068887" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="OSS" PKG_SITE="https://libreelec.tv" PKG_URL="https://github.com/CoreELEC/script.program.driverselect/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="script.program" PKG_SHORTDESC="script.program.driverselect" PKG_LONGDESC="script.program.driverselect" PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Driver Select" PKG_ADDON_TYPE="xbmc.python.script" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } make_target() { : } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID} cp -PR ${PKG_BUILD}/* ${ADDON_BUILD}/${PKG_ADDON_ID} } ================================================ FILE: packages/addons/script/luna/package.mk ================================================ # SPDX-License-Identifier: GPL-3.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="luna" PKG_VERSION="f46656d63027e79f66e4bcd70fd0f38a183cc24a" PKG_SHA256="72ece161770bed53763a1fb2e44b44c29af53404af882d81869671246a3b11ae" PKG_REV="152" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/TheChoconut/Luna/" PKG_URL="https://github.com/TheChoconut/Luna/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain moonlight-embedded" PKG_SECTION="script" PKG_SHORTDESC="Moonlight launcher for Kodi" PKG_LONGDESC="Luna is a Moonlight Launcher for Kodi. Launch moonlight games directly from Kodi." PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="dummy" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID} cp -PR ${PKG_BUILD}/* ${ADDON_BUILD}/${PKG_ADDON_ID} mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir moonlight-embedded)/usr/bin/moonlight ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir moonlight-embedded)/usr/etc/moonlight.conf ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir moonlight-embedded)/usr/share/moonlight/gamecontrollerdb.txt ${ADDON_BUILD}/${PKG_ADDON_ID}/bin mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/lib cp $(get_install_dir moonlight-embedded)/usr/lib/* ${ADDON_BUILD}/${PKG_ADDON_ID}/lib } ================================================ FILE: packages/addons/script/moonlight/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="moonlight" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="script" PKG_SHORTDESC="Moonlight: Add-on removed" PKG_LONGDESC="Moonlight Add-on removed" PKG_TOOLCHAIN="manual" PKG_ADDON_BROKEN="Moonlight is no longer maintained." PKG_IS_ADDON="yes" PKG_ADDON_NAME="Moonlight" PKG_ADDON_TYPE="xbmc.broken" addon() { : } ================================================ FILE: packages/addons/script/script.config.vdr/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/script/script.config.vdr/package.mk ================================================ # 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="script.config.vdr" PKG_VERSION="dbcdf65f88e8ae80c0b76b26ceeeb489134e6379" PKG_SHA256="96ee087f69301592211a740c5ea58644254b5642cfb0a1f23e5d68131042997e" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="OSS" PKG_SITE="https://libreelec.tv" PKG_URL="https://github.com/LibreELEC/script.config.vdr/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="xmlstarlet:host p7zip:host" PKG_SECTION="" PKG_SHORTDESC="script.config.vdr" PKG_LONGDESC="script.config.vdr" PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="dummy" make_target() { sed -e "s|@ADDON_VERSION@|${ADDON_VERSION}|g" \ -i addon.xml } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID} cp -PR ${PKG_BUILD}/* ${ADDON_BUILD}/${PKG_ADDON_ID} cp ${PKG_DIR}/changelog.txt ${ADDON_BUILD}/${PKG_ADDON_ID} cp ${PKG_DIR}/icon/icon.png ${ADDON_BUILD}/${PKG_ADDON_ID}/resources } ================================================ FILE: packages/addons/script/script.config.vdr/sources/addon.xml ================================================ executable VDR-Sendersuchlauf und DiSEqC-Konfiguration VDR channel scan and Diseqc Configuration VDR channel scan and DiSEqC Configuration VDR kanalų paieška ir Diseqc konfigūravimas VDR kanaal scan en Diseqc configuratie Skanowanie kanałów i konfiguracja Diseqc Escanear canais VDR e Configuração Diseqc VDR-Sendersuchlauf und DiSEqC-Konfiguration VDR channel scan and Diseqc Configuration VDR channel scan and DiSEqC Configuration VDR kanalų paieška ir Diseqc konfigūravimas VDR kanaal scan en Diseqc configuratie Skanowanie kanałów i konfiguracja Diseqc Escanear canais VDR e Configuração Diseqc all @PKG_ADDON_NEWS@ resources/icon.png resources/fanart.png @PKG_ADDON_SCREENSHOT@ ================================================ FILE: packages/addons/service/bluetooth-audio/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/bluetooth-audio/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="bluetooth-audio" PKG_VERSION="0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="service" PKG_SHORTDESC="bluetooth-audio: Add-on removed" PKG_LONGDESC="bluetooth-audio: Add-on removed" PKG_TOOLCHAIN="manual" PKG_ADDON_BROKEN="Add-on removed as the bluetooth audio auto connect is handled by CoreELEC settings." PKG_IS_ADDON="yes" PKG_ADDON_NAME="Bluetooth Audio Device Changer" PKG_ADDON_TYPE="xbmc.broken" addon() { : } ================================================ FILE: packages/addons/service/boblightd/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/boblightd/config/boblight.X11.sample ================================================ # Nothing needed in this file, just rename to boblight.X11 if not using XBMC addon ================================================ FILE: packages/addons/service/boblightd/config/boblight.conf ================================================ #config file for adalight from http://www.ladyada.net/make/adalight/ [global] interface 127.0.0.1 port 19333 [device] name device1 type momo output /dev/ttyACM0 channels 75 prefix 41 64 61 00 18 4D interval 20000 rate 115200 debug off #turn this on to see what it's doing with the serial port delayafteropen 1000000 [color] name red rgb FF0000 [color] name green rgb 00FF00 [color] name blue rgb 0000FF [light] name light1 color red device1 1 color green device1 2 color blue device1 3 hscan 33.33 44.44 vscan 83.33 100 [light] name light2 color red device1 4 color green device1 5 color blue device1 6 hscan 22.22 33.33 vscan 83.33 100 [light] name light3 color red device1 7 color green device1 8 color blue device1 9 hscan 11.11 22.22 vscan 83.33 100 [light] name light4 color red device1 10 color green device1 11 color blue device1 12 hscan 0 11.11 vscan 83.33 100 [light] name light5 color red device1 13 color green device1 14 color blue device1 15 hscan 0 11.11 vscan 66.67 83.33 [light] name light6 color red device1 16 color green device1 17 color blue device1 18 hscan 0 11.11 vscan 50 66.67 [light] name light7 color red device1 19 color green device1 20 color blue device1 21 hscan 0 11.11 vscan 33.33 50 [light] name light8 color red device1 22 color green device1 23 color blue device1 24 hscan 0 11.11 vscan 16.67 33.33 [light] name light9 color red device1 25 color green device1 26 color blue device1 27 hscan 0 11.11 vscan 0 16.67 [light] name light10 color red device1 28 color green device1 29 color blue device1 30 hscan 11.11 22.22 vscan 0 16.67 [light] name light11 color red device1 31 color green device1 32 color blue device1 33 hscan 22.22 33.33 vscan 0 16.67 [light] name light12 color red device1 34 color green device1 35 color blue device1 36 hscan 33.33 44.44 vscan 0 16.67 [light] name light13 color red device1 37 color green device1 38 color blue device1 39 hscan 44.44 55.56 vscan 0 16.67 [light] name light14 color red device1 40 color green device1 41 color blue device1 42 hscan 55.56 66.67 vscan 0 16.67 [light] name light15 color red device1 43 color green device1 44 color blue device1 45 hscan 66.67 77.78 vscan 0 16.67 [light] name light16 color red device1 46 color green device1 47 color blue device1 48 hscan 77.78 88.89 vscan 0 16.67 [light] name light17 color red device1 49 color green device1 50 color blue device1 51 hscan 88.89 100 vscan 0 16.67 [light] name light18 color red device1 52 color green device1 53 color blue device1 54 hscan 88.89 100 vscan 16.67 33.33 [light] name light19 color red device1 55 color green device1 56 color blue device1 57 hscan 88.89 100 vscan 33.33 50 [light] name light20 color red device1 58 color green device1 59 color blue device1 60 hscan 88.89 100 vscan 50 66.67 [light] name light21 color red device1 61 color green device1 62 color blue device1 63 hscan 88.89 100 vscan 66.67 83.33 [light] name light22 color red device1 64 color green device1 65 color blue device1 66 hscan 88.89 100 vscan 83.33 100 [light] name light23 color red device1 67 color green device1 68 color blue device1 69 hscan 77.78 88.89 vscan 83.33 100 [light] name light24 color red device1 70 color green device1 71 color blue device1 72 hscan 66.67 77.78 vscan 83.33 100 [light] name light25 color red device1 73 color green device1 74 color blue device1 75 hscan 55.56 66.67 vscan 83.33 100 ================================================ FILE: packages/addons/service/boblightd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="boblightd" PKG_VERSION="478" PKG_SHA256="78b82c9b133ce20c3d24aba96abe4a8302ec8dc640460b3b7302aa1d368c543a" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://code.google.com/p/boblight" PKG_URL="${DISTRO_SRC}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libusb" PKG_SECTION="service/multimedia" PKG_SHORTDESC="Boblight: an AmbiLight controller" PKG_LONGDESC="Boblight(${PKG_VERSION}) is an opensource AmbiLight implementation." PKG_IS_ADDON="yes" PKG_ADDON_NAME="Boblight" PKG_ADDON_TYPE="xbmc.service" PKG_TOOLCHAIN="autotools" if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" libX11 libXext libXrender" fi if [ "${OPENGL_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" mesa glu" fi if [ "${OPENGL}" = "no" ]; then EXTRAOPTS="--without-opengl" fi if [ ! "${DISPLAYSERVER}" = "x11" ]; then EXTRAOPTS+=" --without-x11" fi PKG_CONFIGURE_OPTS_TARGET="${EXTRAOPTS} --without-portaudio" makeinstall_target() { : # nothing to do here } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/lib cp -P ${PKG_BUILD}/.${TARGET_NAME}/src/.libs/libboblight.so* ${ADDON_BUILD}/${PKG_ADDON_ID}/lib mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P ${PKG_BUILD}/.${TARGET_NAME}/src/boblightd ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P ${PKG_BUILD}/.${TARGET_NAME}/src/boblight-constant ${ADDON_BUILD}/${PKG_ADDON_ID}/bin if [ "${DISPLAYSERVER}" = "x11" ]; then cp -P ${PKG_BUILD}/.${TARGET_NAME}/src/boblight-X11 ${ADDON_BUILD}/${PKG_ADDON_ID}/bin fi mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/config cp -R ${PKG_DIR}/config/boblight.conf ${ADDON_BUILD}/${PKG_ADDON_ID}/config if [ "${DISPLAYSERVER}" = "x11" ]; then cp -R ${PKG_DIR}/config/boblight.X11.sample ${ADDON_BUILD}/${PKG_ADDON_ID}/config fi } ================================================ FILE: packages/addons/service/boblightd/patches/boblightd-2.0.5-getopt-includes.patch ================================================ diff --git a/src/clients/flagmanager.cpp b/src/clients/flagmanager.cpp index d9f3cbf..82eb978 100644 --- a/src/clients/flagmanager.cpp +++ b/src/clients/flagmanager.cpp @@ -25,6 +25,8 @@ #define BOBLIGHT_DLOPEN_EXTERN #include "../lib/boblight.h" +#include + using namespace std; //very simple, store a copy of argc and argv ================================================ FILE: packages/addons/service/boblightd/source/bin/boblightd.start ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2010 Adam Boeglin (adamrb@gmail.com) . /etc/profile oe_setup_addon service.multimedia.boblightd chmod a+x $ADDON_DIR/bin/* cp $ADDON_DIR/config/*.sample $ADDON_HOME if [ ! -f $ADDON_HOME/boblight.conf ] ; then cp $ADDON_DIR/config/boblight.conf $ADDON_HOME/boblight.conf fi if [ -x $ADDON_DIR/bin/boblight-X11 -a -e $ADDON_HOME/boblight.X11 ] ; then boblight-X11 -f >/dev/null 2>&1 fi exec boblightd -c $ADDON_HOME/boblight.conf > $ADDON_LOG_FILE 2>&1 ================================================ FILE: packages/addons/service/boblightd/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) ================================================ FILE: packages/addons/service/boblightd/source/sleep.d/boblightd.power ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /etc/profile SERVICE="service.multimedia.boblightd.service" case "$1" in pre) if systemctl is-active "$SERVICE" &>/dev/null ; then systemctl stop "$SERVICE" fi ;; post) if systemctl is-enabled "$SERVICE" &>/dev/null ; then systemctl start "$SERVICE" fi ;; esac ================================================ FILE: packages/addons/service/boblightd/source/system.d/service.multimedia.boblightd.service ================================================ [Unit] Description=boblightd After=graphical.target [Service] ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.multimedia.boblightd/bin/boblightd.start" TimeoutStopSec=1 Restart=always RestartSec=10 StartLimitInterval=0 [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/dispmanx_vnc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="dispmanx_vnc" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="arm" PKG_ADDON_PROJECTS="RPi ARM" PKG_LICENSE="OSS" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="service/system" PKG_SHORTDESC="Addon removed" PKG_LONGDESC="Addon removed" PKG_TOOLCHAIN="manual" PKG_ADDON_BROKEN="Raspberry Pi VNC was removed." PKG_IS_ADDON="yes" PKG_ADDON_NAME="Raspberry Pi VNC" PKG_ADDON_TYPE="xbmc.broken" addon() { : } ================================================ FILE: packages/addons/service/docker/changelog.txt ================================================ 1 - not released for LE11 2 - not released for LE11 3 - fix ctop - update moby and cli to 23.0.4 - containerd: update to 1.7.0 - runc: build with seccomp - runc: update to 1.1.5 4 - update moby and cli to 23.0.6 - containerd: update to 1.7.1 - runc: update to 1.1.7 ================================================ FILE: packages/addons/service/docker/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2017 Lukas Rusak (lrusak@libreelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="docker" PKG_REV="4" PKG_ARCH="any" PKG_LICENSE="ASL" PKG_SITE="http://www.docker.com/" PKG_DEPENDS_TARGET="cli containerd ctop moby runc tini" PKG_SECTION="service/system" PKG_SHORTDESC="Docker is an open-source engine that automates the deployment of any application as a lightweight, portable, self-sufficient container that will run virtually anywhere." PKG_LONGDESC="Docker containers can encapsulate any payload, and will run consistently on and between virtually any server. The same container that a developer builds and tests on a laptop will run at scale, in production*, on VMs, bare-metal servers, OpenStack clusters, public instances, or combinations of the above." PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Docker" PKG_ADDON_TYPE="xbmc.service" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # cli cp -P $(get_build_dir cli)/bin/docker ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # moby cp -P $(get_build_dir moby)/bin/dockerd ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_build_dir moby)/bin/docker-proxy ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/docker-proxy # containerd cp -P $(get_build_dir containerd)/bin/containerd ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/containerd cp -P $(get_build_dir containerd)/bin/containerd-shim ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/containerd-shim cp -P $(get_build_dir containerd)/bin/containerd-shim-runc-v2 ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/containerd-shim-runc-v2 # ctop cp -P $(get_build_dir ctop)/bin/ctop ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ctop # runc cp -P $(get_build_dir runc)/bin/runc ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/runc # tini cp -P $(get_build_dir tini)/.${TARGET_NAME}/tini-static ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/docker-init } post_install_addon() { sed -e "s/@DISTRO_PKG_SETTINGS_ID@/${DISTRO_PKG_SETTINGS_ID}/g" -i "${INSTALL}/default.py" } ================================================ FILE: packages/addons/service/docker/source/bin/docker-config ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Lukas Rusak (lrusak@libreelec.tv) # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) ADDON_DIR="/storage/.kodi/addons/service.system.docker" ADDON_HOME_DIR="/storage/.kodi/userdata/addon_data/service.system.docker" if [ ! -d "$ADDON_HOME_DIR/config" ]; then mkdir -p $ADDON_HOME_DIR/config fi if [ ! -f "$ADDON_HOME_DIR/config/docker.conf" ]; then cp $ADDON_DIR/config/docker.conf $ADDON_HOME_DIR/config/docker.conf else # previous deprecated options before v23.0.0 need to be updated sed -i -e 's/--storage-opt overlay2.override_kernel_check=1//' \ -e 's/--graph=/--data-root=/' $ADDON_HOME_DIR/config/docker.conf fi if [ ! -d "$ADDON_HOME_DIR/docker" ]; then mkdir -p $ADDON_HOME_DIR/docker fi if [ ! -d /var/lib/docker ]; then ln -sf $ADDON_HOME_DIR/docker /var/lib/docker fi ================================================ FILE: packages/addons/service/docker/source/config/docker.conf ================================================ DOCKER_DAEMON_OPTS="--data-root=/storage/.kodi/userdata/addon_data/service.system.docker/docker" DOCKER_STORAGE_OPTS="--storage-driver=overlay2" ================================================ FILE: packages/addons/service/docker/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Lukas Rusak (lrusak@libreelec.tv) # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) import os import subprocess import sys import time import xbmc import xbmcaddon import xbmcgui __author__ = 'lrusak' __addon__ = xbmcaddon.Addon() __path__ = __addon__.getAddonInfo('path') sys.path.append(__path__ + 'lib') import dockermon # docker events for api 1.23 (docker version 1.11.x) # https://docs.docker.com/engine/reference/api/docker_remote_api_v1.23/#monitor-docker-s-events docker_events = { 'container': { 'string': 30030, 'event': { 'attach': { 'string': 30031, 'enabled': '', }, 'commit': { 'string': 30032, 'enabled': '', }, 'copy': { 'string': 30033, 'enabled': '', }, 'create': { 'string': 30034, 'enabled': '', }, 'destroy': { 'string': 30035, 'enabled': '', }, 'die': { 'string': 30036, 'enabled': '', }, 'exec_create': { 'string': 30037, 'enabled': '', }, 'exec_start': { 'string': 30038, 'enabled': '', }, 'export': { 'string': 30039, 'enabled': '', }, 'kill': { 'string': 30040, 'enabled': True, }, 'oom': { 'string': 30041, 'enabled': True, }, 'pause': { 'string': 30042, 'enabled': '', }, 'rename': { 'string': 30043, 'enabled': '', }, 'resize': { 'string': 30044, 'enabled': '', }, 'restart': { 'string': 30045, 'enabled': '', }, 'start': { 'string': 30046, 'enabled': True, }, 'stop': { 'string': 30047, 'enabled': True, }, 'top': { 'string': 30048, 'enabled': '', }, 'unpause': { 'string': 30049, 'enabled': '', }, 'update': { 'string': 30050, 'enabled': '', }, }, }, 'image': { 'string': 30060, 'event': { 'delete': { 'string': 30061, 'enabled': '', }, 'import': { 'string': 30062, 'enabled': '', }, 'pull': { 'string': 30063, 'enabled': True, }, 'push': { 'string': 30064, 'enabled': '', }, 'tag': { 'string': 30065, 'enabled': '', }, 'untag': { 'string': 30066, 'enabled': '', }, }, }, 'volume': { 'string': 30070, 'event': { 'create': { 'string': 30071, 'enabled': '', }, 'mount': { 'string': 30072, 'enabled': '', }, 'unmount': { 'string': 30073, 'enabled': '', }, 'destroy': { 'string': 30074, 'enabled': '', }, }, }, 'network': { 'string': 30080, 'event': { 'create': { 'string': 30081, 'enabled': '', }, 'connect': { 'string': 30082, 'enabled': '', }, 'disconnect': { 'string': 30083, 'enabled': '', }, 'destroy': { 'string': 30084, 'enabled': '', }, }, }, } def print_notification(json_data): event_string = docker_events[json_data['Type']]['event'][json_data['Action']]['string'] if __addon__.getSetting('notifications') == '0': # default if docker_events[json_data['Type']]['event'][json_data['Action']]['enabled']: try: message = ' '.join([__addon__.getLocalizedString(30010), json_data['Actor']['Attributes']['name'], '|', __addon__.getLocalizedString(30012), __addon__.getLocalizedString(event_string)]) except KeyError as e: message = ' '.join([__addon__.getLocalizedString(30011), json_data['Type'], '|', __addon__.getLocalizedString(30012), __addon__.getLocalizedString(event_string)]) elif __addon__.getSetting('notifications') == '1': # all try: message = ' '.join([__addon__.getLocalizedString(30010), json_data['Actor']['Attributes']['name'], '|', __addon__.getLocalizedString(30012), __addon__.getLocalizedString(event_string)]) except KeyError as e: message = ' '.join([__addon__.getLocalizedString(30011), json_data['Type'], '|', __addon__.getLocalizedString(30012), __addon__.getLocalizedString(event_string)]) elif __addon__.getSetting('notifications') == '2': # none pass elif __addon__.getSetting('notifications') == '3': # custom if __addon__.getSetting(json_data['Action']) == 'true': try: message = ' '.join([__addon__.getLocalizedString(30010), json_data['Actor']['Attributes']['name'], '|', __addon__.getLocalizedString(30012), __addon__.getLocalizedString(event_string)]) except KeyError as e: message = ' '.join([__addon__.getLocalizedString(30011), json_data['Type'], '|', __addon__.getLocalizedString(30012), __addon__.getLocalizedString(event_string)]) dialog = xbmcgui.Dialog() try: if message != '': length = int(__addon__.getSetting('notification_length')) * 1000 dialog.notification('Docker', message, __path__ + 'resources/icon.png', length) xbmc.log('## service.system.docker ## %s' % message) except NameError as e: pass class Main(object): def __init__(self, *args, **kwargs): ############################# # Temp cleanup for old method restart_docker = False if os.path.islink('/storage/.config/system.d/service.system.docker.socket'): os.remove('/storage/.config/system.d/service.system.docker.socket') if os.path.islink('/storage/.config/system.d/docker.socket'): os.remove('/storage/.config/system.d/docker.socket') if os.path.islink('/storage/.config/system.d/service.system.docker.service'): if 'systemd' in os.readlink('/storage/.config/system.d/service.system.docker.service'): os.remove('/storage/.config/system.d/service.system.docker.service') restart_docker = True if os.path.islink('/storage/.config/system.d/docker.service'): if 'systemd' in os.readlink('/storage/.config/system.d/docker.service'): os.remove('/storage/.config/system.d/docker.service') restart_docker = True if os.path.islink('/storage/.config/system.d/multi-user.target.wants/service.system.docker.service'): if 'systemd' in os.readlink('/storage/.config/system.d/multi-user.target.wants/service.system.docker.service'): os.remove('/storage/.config/system.d/multi-user.target.wants/service.system.docker.service') restart_docker = True if restart_docker: subprocess.run(['systemctl','enable','/storage/.kodi/addons/service.system.docker/system.d/service.system.docker.service'], close_fds=True) subprocess.run(['systemctl','restart','service.system.docker.service'], close_fds=True) # end temp cleanup ############################# monitor = DockerMonitor(self) while not monitor.abortRequested(): try: dockermon.watch(print_notification, run=lambda: not monitor.abortRequested()) except Exception: monitor.waitForAbort(1) del monitor class DockerMonitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) def onSettingsChanged(self): pass if ( __name__ == "__main__" ): Main() del __addon__ ================================================ FILE: packages/addons/service/docker/source/examples/couchpotato.service ================================================ [Unit] Description=%p container Requires=service.system.docker.service After=service.system.docker.service [Service] Restart=always RestartSec=10s TimeoutStartSec=0 ExecStartPre=-/bin/sh -c "mkdir -p /storage/%p/config /storage/%p/data" ExecStart=/storage/.kodi/addons/service.system.docker/bin/docker run \ --rm \ --name=%p \ --hostname=libreelec-%p \ --volume=/storage/%p/config:/config \ --volume=/storage/%p/data:/data \ --publish=5050:5050 \ timhaak/%p ExecStop=/storage/.kodi/addons/service.system.docker/bin/docker stop %p [Install] WantedBy=multi-user.target ================================================ FILE: packages/addons/service/docker/source/examples/mysql.service ================================================ [Unit] Description=%p container Requires=service.system.docker.service After=service.system.docker.service Befora=kodi.service [Service] Restart=always RestartSec=10s TimeoutStartSec=0 ExecStartPre=-/bin/sh -c "mkdir -p /storage/%p/config /storage/%p/data" ExecStart=/storage/.kodi/addons/service.system.docker/bin/docker run \ --rm \ --name=%p \ --hostname=libreelec-%p \ --volume=/storage/%p/config/:/etc/mysql/conf.d \ --volume=/storage/%p/data:/var/lib/mysql \ --publish=3306:3306 \ --env=MYSQL_ROOT_PASSWORD=libreelec \ --env=MYSQL_USER=kodi \ --env=MYSQL_PASSWORD=kodi \ %p ExecStop=/storage/.kodi/addons/service.system.docker/bin/docker stop %p [Install] WantedBy=multi-user.target ================================================ FILE: packages/addons/service/docker/source/examples/sabnzbd.service ================================================ [Unit] Description=%p container Requires=service.system.docker.service After=service.system.docker.service [Service] Restart=always RestartSec=10s TimeoutStartSec=0 ExecStartPre=-/bin/sh -c "mkdir -p /storage/%p/config /storage/%p/data" ExecStart=/storage/.kodi/addons/service.system.docker/bin/docker run \ --rm \ --name=%p \ --hostname=libreelec-%p \ --volume=/storage/%p/config:/config \ --volume=/storage/%p/data:/data \ --publish=8080:8080 \ timhaak/%p ExecStop=/storage/.kodi/addons/service.system.docker/bin/docker stop %p [Install] WantedBy=multi-user.target ================================================ FILE: packages/addons/service/docker/source/examples/sickbeard.service ================================================ [Unit] Description=%p container Requires=service.system.docker.service After=service.system.docker.service [Service] Restart=always RestartSec=10s TimeoutStartSec=0 ExecStartPre=-/bin/sh -c "mkdir -p /storage/%p/config /storage/%p/data" ExecStart=/storage/.kodi/addons/service.system.docker/bin/docker run \ --rm \ --name=%p \ --hostname=libreelec-%p \ --volume=/storage/%p/config:/config \ --volume=/storage/%p/data:/data \ --publish=8081:8081 \ timhaak/%p ExecStop=/storage/.kodi/addons/service.system.docker/bin/docker stop %p [Install] WantedBy=multi-user.target ================================================ FILE: packages/addons/service/docker/source/examples/transmission.service ================================================ [Unit] Description=%p container Requires=service.system.docker.service After=service.system.docker.service [Service] Restart=always RestartSec=10s TimeoutStartSec=0 ExecStartPre=-/bin/sh -c "mkdir -p /storage/%p/watch /storage/%p/downloads /storage/%p/incomplete /storage/%p/config" ExecStart=/storage/.kodi/addons/service.system.docker/bin/docker run \ --rm \ --name=%p \ --hostname=libreelec-%p \ --volume=/storage/%p/watch:/watch \ --volume=/storage/%p/downloads:/downloads \ --volume=/storage/%p/incomplete:/incomplete \ --volume=/storage/%p/config:/config \ --publish=9091:9091 \ timhaak/%p ExecStop=/storage/.kodi/addons/service.system.docker/bin/docker stop %p [Install] WantedBy=multi-user.target ================================================ FILE: packages/addons/service/docker/source/examples/var-lib-docker.mount ================================================ [Unit] Description=Docker loopback mount Requires=local-fs.target Before=service.system.docker.service [Mount] What=/storage/btrfs-loop.img Where=/var/lib/docker Options=loop,compress=lzo Type=btrfs [Install] WantedBy=multi-user.target ================================================ FILE: packages/addons/service/docker/source/lib/dockermon.py ================================================ #!/usr/bin/env python """docker monitor using docker /events HTTP streaming API""" """https://github.com/CyberInt/dockermon""" from contextlib import closing from functools import partial from socket import socket, AF_UNIX, timeout from subprocess import Popen, PIPE from sys import stdout, version_info import json import shlex if version_info[:2] < (3, 0): from httplib import OK as HTTP_OK from urlparse import urlparse else: from http.client import OK as HTTP_OK from urllib.parse import urlparse __version__ = '0.2.2' # buffer size must be 256 or lower otherwise events won't show in realtime bufsize = 256 default_sock_url = 'ipc:///var/run/docker.sock' class DockermonError(Exception): pass def read_http_header(sock): """Read HTTP header from socket, return header and rest of data.""" buf = [] hdr_end = '\r\n\r\n' while True: buf.append(sock.recv(bufsize).decode('utf-8')) data = ''.join(buf) i = data.find(hdr_end) if i == -1: continue return data[:i], data[i + len(hdr_end):] def header_status(header): """Parse HTTP status line, return status (int) and reason.""" status_line = header[:header.find('\r')] # 'HTTP/1.1 200 OK' -> (200, 'OK') fields = status_line.split(None, 2) return int(fields[1]), fields[2] def connect(url): """Connect to UNIX or TCP socket. url can be either tcp://:port or ipc:// """ url = urlparse(url) if url.scheme == 'tcp': sock = socket() netloc = tuple(url.netloc.rsplit(':', 1)) hostname = socket.gethostname() elif url.scheme == 'ipc': sock = socket(AF_UNIX) netloc = url.path hostname = 'localhost' else: raise ValueError('unknown socket type: %s' % url.scheme) sock.connect(netloc) return sock, hostname def watch(callback, url=default_sock_url, run=None): """Watch docker events. Will call callback with each new event (dict). url can be either tcp://:port or ipc:// """ sock, hostname = connect(url) if run: sock.settimeout(1.5) request = 'GET /events HTTP/1.1\nHost: %s\n\n' % hostname request = request.encode('utf-8') with closing(sock): sock.sendall(request) header, payload = read_http_header(sock) status, reason = header_status(header) if status != HTTP_OK: raise DockermonError('bad HTTP status: %s %s' % (status, reason)) # Messages are \r\n\r\n buf = [payload] while True: try: chunk = sock.recv(bufsize) except timeout: if run(): continue if run and not run(): raise DockermonError('stopped') if not chunk: raise EOFError('socket closed') buf.append(chunk.decode('utf-8')) data = ''.join(buf) i = data.find('\r\n') if i == -1: continue size = int(data[:i], 16) start = i + 2 # Skip initial \r\n if len(data) < start + size + 2: continue payload = data[start:start+size] callback(json.loads(payload)) buf = [data[start+size+2:]] # Skip \r\n suffix def print_callback(msg): """Print callback, prints message to stdout as JSON in one line.""" json.dump(msg, stdout) stdout.write('\n') stdout.flush() def prog_callback(prog, msg): """Program callback, calls prog with message in stdin""" pipe = Popen(prog, stdin=PIPE) data = json.dumps(msg) pipe.stdin.write(data.encode('utf-8')) pipe.stdin.close() if __name__ == '__main__': from argparse import ArgumentParser parser = ArgumentParser(description=__doc__) parser.add_argument('--prog', default=None, help='program to call (e.g. "jq --unbuffered .")') parser.add_argument( '--socket-url', default=default_sock_url, help='socket url (ipc:///path/to/sock or tcp:///host:port)') parser.add_argument( '--version', help='print version and exit', action='store_true', default=False) args = parser.parse_args() if args.version: print('dockermon %s' % __version__) raise SystemExit if args.prog: prog = shlex.split(args.prog) callback = partial(prog_callback, prog) else: callback = print_callback try: watch(callback, args.socket_url) except (KeyboardInterrupt, EOFError): pass ================================================ FILE: packages/addons/service/docker/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: docker # Addon id: service.system.docker msgid "" msgstr "" msgctxt "#30000" msgid "Settings" msgstr "" msgctxt "#30001" msgid "Notifications" msgstr "" msgctxt "#30002" msgid "Default" msgstr "" msgctxt "#30003" msgid "All" msgstr "" msgctxt "#30004" msgid "Off" msgstr "" msgctxt "#30005" msgid "Custom" msgstr "" msgctxt "#30006" msgid "Notification Length (Seconds)" msgstr "" msgctxt "#30010" msgid "Name:" msgstr "" msgctxt "#30011" msgid "Type:" msgstr "" msgctxt "#30012" msgid "Action:" msgstr "" msgctxt "#30030" msgid "Container" msgstr "" msgctxt "#30031" msgid "attach" msgstr "" msgctxt "#30032" msgid "commit" msgstr "" msgctxt "#30033" msgid "copy" msgstr "" msgctxt "#30034" msgid "create" msgstr "" msgctxt "#30035" msgid "destroy" msgstr "" msgctxt "#30036" msgid "die" msgstr "" msgctxt "#30037" msgid "exec_create" msgstr "" msgctxt "#30038" msgid "exec_start" msgstr "" msgctxt "#30039" msgid "export" msgstr "" msgctxt "#30040" msgid "kill" msgstr "" msgctxt "#30041" msgid "out of memory" msgstr "" msgctxt "#30042" msgid "pause" msgstr "" msgctxt "#30043" msgid "rename" msgstr "" msgctxt "#30044" msgid "resize" msgstr "" msgctxt "#30045" msgid "restart" msgstr "" msgctxt "#30046" msgid "start" msgstr "" msgctxt "#30047" msgid "stop" msgstr "" msgctxt "#30048" msgid "top" msgstr "" msgctxt "#30049" msgid "unpause" msgstr "" msgctxt "#30050" msgid "update" msgstr "" msgctxt "#30060" msgid "Image" msgstr "" msgctxt "#30061" msgid "delete" msgstr "" msgctxt "#30062" msgid "import" msgstr "" msgctxt "#30063" msgid "pull" msgstr "" msgctxt "#30064" msgid "push" msgstr "" msgctxt "#30065" msgid "tag" msgstr "" msgctxt "#30066" msgid "untag" msgstr "" msgctxt "#30070" msgid "Volume" msgstr "" msgctxt "#30071" msgid "create" msgstr "" msgctxt "#30072" msgid "mount" msgstr "" msgctxt "#30073" msgid "unmount" msgstr "" msgctxt "#30074" msgid "destroy" msgstr "" msgctxt "#30080" msgid "Network" msgstr "" msgctxt "#30081" msgid "create" msgstr "" msgctxt "#30082" msgid "connect" msgstr "" msgctxt "#30083" msgid "disconnect" msgstr "" msgctxt "#30084" msgid "destroy" msgstr "" ================================================ FILE: packages/addons/service/docker/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/docker/source/system.d/service.system.docker.service ================================================ [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network.target [Service] Type=idle Environment=PATH=/bin:/sbin:/usr/bin:/usr/sbin:/storage/.kodi/addons/service.system.docker/bin ExecStartPre=/storage/.kodi/addons/service.system.docker/bin/docker-config EnvironmentFile=-/storage/.kodi/userdata/addon_data/service.system.docker/config/docker.conf ExecStart=/storage/.kodi/addons/service.system.docker/bin/dockerd --exec-opt native.cgroupdriver=systemd \ --log-driver=journald \ --group=root \ $DOCKER_DAEMON_OPTS \ $DOCKER_STORAGE_OPTS ExecReload=/bin/kill -s HUP $MAINPID TasksMax=8192 LimitNOFILE=1048576 LimitNPROC=1048576 LimitCORE=infinity TimeoutStartSec=0 Restart=on-abnormal [Install] WantedBy=multi-user.target Alias=docker.service ================================================ FILE: packages/addons/service/emby/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="emby" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="OSS" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="service" PKG_SHORTDESC="Add-on removed" PKG_LONGDESC="Add-on removed" PKG_TOOLCHAIN="manual" PKG_ADDON_BROKEN="Emby Server is no longer maintained and has been superseded by Emby Server 4" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Emby Server" PKG_ADDON_TYPE="xbmc.broken" addon() { : } ================================================ FILE: packages/addons/service/emby4/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/emby4/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="emby4" PKG_VERSION="bootstrap" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="prop." PKG_SITE="http://emby.media" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="service" PKG_SHORTDESC="Emby Server: a personal media server" PKG_LONGDESC="Emby Server brings your home videos, music, and photos together, automatically converting and streaming your media on-the-fly to any device." PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Emby Server 4" PKG_ADDON_TYPE="xbmc.service" PKG_ADDON_PROJECTS="any !RPi1" PKG_ADDON_REQUIRES="tools.ffmpeg-tools:0.0.0 tools.dotnet-runtime:0.0.0" PKG_MAINTAINER="Anton Voyl (awiouy)" addon() { : } ================================================ FILE: packages/addons/service/emby4/source/bin/emby4.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.emby4 libs="${ADDON_DIR}/libs" ff="/storage/.kodi/addons/tools.ffmpeg-tools/bin" if [ ! -e "${libs}" ]; then url="https://github.com/MediaBrowser/Emby.Releases/releases" url_latest="${url}/latest" release="$(basename $(curl -fso /dev/null -w %{redirect_url} ${url_latest}))" url_download="${url}/download/${release}/embyserver-netcore_${release}.zip" zip="${ADDON_DIR}/bootstrap.zip" tmp="${ADDON_DIR}/tmp" rm -fr "${tmp}" "${zip}" mkdir -p "${tmp}" wget -q "${url_download}" -O "${zip}" && \ unzip "${zip}" -d "${tmp}" && \ mv "${tmp}" "${libs}" && \ rm -f "${zip}" || \ exit 1 fi exec \ nice -n "$emby_nice" \ dotnet "${libs}/system/EmbyServer.dll" \ -programdata "${ADDON_HOME}" \ -ffmpeg "${ff}/ffmpeg" \ -ffprobe "${ff}/ffprobe" ================================================ FILE: packages/addons/service/emby4/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import json import subprocess import xbmc import xbmcaddon import xbmcgui def jsonrpc(request): return json.loads(xbmc.executeJSONRPC(json.dumps(request))) def disable_conflicting(conficting, message='{that} conflicts with {this} and has been disabled'): is_enabled = {'jsonrpc': '2.0', 'method': 'Addons.GetAddonDetails', 'id': 1, 'params': {'addonid': conficting, 'properties': ['enabled']}} disable = {'jsonrpc': '2.0', 'method': 'Addons.SetAddonEnabled', 'id': 1, 'params': {'addonid': conficting, 'enabled': False}} try: if jsonrpc(is_enabled)['result']['addon']['enabled']: this = xbmcaddon.Addon().getAddonInfo('name') that = xbmcaddon.Addon(conficting).getAddonInfo('name') jsonrpc(disable) dialog = xbmcgui.Dialog() dialog.ok(this, message.format( this=this, that=that)) del dialog except KeyError: pass class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == '__main__': disable_conflicting('service.emby') Monitor().waitForAbort() ================================================ FILE: packages/addons/service/emby4/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: emby4 # Addon id: service.emby4 # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "Configuration" msgstr "" msgctxt "#30001" msgid "Priority (nice, 0=max, 19=min)" msgstr "" ================================================ FILE: packages/addons/service/emby4/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/emby4/source/settings-default.xml ================================================ 10 ================================================ FILE: packages/addons/service/emby4/source/system.d/service.emby4.service ================================================ [Unit] Description=Emby 4 - streaming server Documentation=http://emby.media Wants=multi-user.target After=multi-user.target [Service] SyslogIdentifier=%N ExecStart=/bin/sh /storage/.kodi/addons/%N/bin/emby4.start Restart=always [Install] WantedBy=multi-user.target ================================================ FILE: packages/addons/service/hyperion/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/hyperion/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Lukas Rusak (lrusak@libreelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="hyperion" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="service" PKG_SHORTDESC="Hyperion: Add-on removed" PKG_LONGDESC="Hyperion: Add-on removed" PKG_TOOLCHAIN="manual" PKG_ADDON_BROKEN="Hyperion Classic has been discontinued. Please go to Hyperion.NG (Next Generation)" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Hyperion" PKG_ADDON_TYPE="xbmc.broken" addon() { : } ================================================ FILE: packages/addons/service/inadyn/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/inadyn/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="inadyn" PKG_VERSION="2.10.0" PKG_SHA256="a9bc24ea8d59644f909dd98bf3b8efcfb95c153f46d9cb62e99d744d44ed9465" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="http://troglobit.com/inadyn.html" PKG_URL="https://github.com/troglobit/inadyn/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libconfuse openssl" PKG_SECTION="service/system" PKG_SHORTDESC="Inadyn: a small and simple Dynamic Domain Name System client" PKG_LONGDESC="Inadyn (${PKG_VERSION}) is a small and simple Dynamic Domain Name System (DDNS) client with HTTPS support. It is commonly available in many GNU/Linux distributions, used in off-the-shelf routers and Internet gateways to automate the task of keeping your DNS record up to date with any IP address changes from your ISP. It can also be used in installations with redundant (backup) connections to the Internet." PKG_TOOLCHAIN="autotools" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Inadyn" PKG_ADDON_TYPE="xbmc.service" PKG_MAINTAINER="Anton Voyl (awiouy)" PKG_CONFIGURE_OPTS_TARGET="--enable-openssl" makeinstall_target() { : } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp ${PKG_BUILD}/.${TARGET_NAME}/src/inadyn ${ADDON_BUILD}/${PKG_ADDON_ID}/bin } ================================================ FILE: packages/addons/service/inadyn/source/bin/inadyn-service ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) f="/storage/.kodi/userdata/addon_data/service.system.inadyn/settings.xml" [ -f "$f" ] && sed -i 's/inadyn_s/inadyn_c/g' "$f" . /etc/profile oe_setup_addon service.system.inadyn if [ "$inadyn_S" == "inadyn.conf" ]; then config="$ADDON_HOME/inadyn.conf" else config="$ADDON_HOME/inadyn.temp" if [ -z "$inadyn_a" -o -z "$inadyn_p" -o -z "$inadyn_u" ]; then rm -fr "$config" else echo "\ provider $inadyn_S { ssl = $inadyn_c username = $inadyn_u password = $inadyn_p hostname = $inadyn_a }" > "$config" fi fi if [ -f "$config" ]; then inadyn -f "$config" -l info fi ================================================ FILE: packages/addons/service/inadyn/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == "__main__": Monitor().waitForAbort() ================================================ FILE: packages/addons/service/inadyn/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: syncthing # Addon id: service.system.inadyn # Addon Provider: awiouy at gmail dot com msgid "" msgstr "" msgctxt "#30000" msgid "Configuration" msgstr "" msgctxt "#30001" msgid "Provider" msgstr "" msgctxt "#30002" msgid "Username" msgstr "" msgctxt "#30003" msgid "Password" msgstr "" msgctxt "#30004" msgid "Alias" msgstr "" msgctxt "#30005" msgid "SSL" msgstr "" ================================================ FILE: packages/addons/service/inadyn/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/inadyn/source/settings-default.xml ================================================ ================================================ FILE: packages/addons/service/inadyn/source/system.d/service.system.inadyn.service ================================================ [Unit] Description=inadyn After=network-online.target Requires=network-online.target [Service] Type=forking ExecStart=/bin/sh /storage/.kodi/addons/service.system.inadyn/bin/inadyn-service Restart=on-failure [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/jellyfin/changelog.txt ================================================ 1 - jellyfin: update to 10.8.10 ================================================ FILE: packages/addons/service/jellyfin/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="jellyfin" PKG_VERSION="1.0" PKG_VERSION_NUMBER="10.8.10" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://jellyfin.org/" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="service" PKG_SHORTDESC="Jellyfin: The Free Software Media System" PKG_LONGDESC="Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. Stream to any device from your own server." PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Jellyfin" PKG_ADDON_TYPE="xbmc.service" PKG_ADDON_REQUIRES="tools.ffmpeg-tools:0.0.0 tools.dotnet-runtime:0.0.0" PKG_ADDON_PROVIDES="executable" make_target() { : } addon() { : } post_install_addon() { sed -e "s/@JELLYFIN_VERSION@/${PKG_VERSION_NUMBER}/g" -i "${INSTALL}/bin/jellyfin-downloader" } ================================================ FILE: packages/addons/service/jellyfin/source/bin/jellyfin-downloader ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.jellyfin ICON="${ADDON_DIR}/resources/icon.png" CONTROL_FILE="/tmp/curl.done" DATA_FILE="/tmp/curl.data" JELLYFIN_FILE="jellyfin_@JELLYFIN_VERSION@.tar.gz" # check for enough free disk space if [ $(df . | awk 'END {print $4}') -lt 200000 ]; then kodi-send --action="Notification(Not enough disk space, at least 200MB are required,30000,${ICON})" >/dev/null exit 0; fi # remove install status and folders if [ -f ${ADDON_DIR}/extract.ok ]; then rm ${ADDON_DIR}/extract.ok fi if [ -d ${ADDON_DIR}/libs ]; then rm -rf ${ADDON_DIR}/libs fi # create tmp download dir TEMP_DIR=`mktemp -d` mkdir -p ${TEMP_DIR}/tmp_download if [ -d ${TEMP_DIR}/tmp_download ]; then cd ${TEMP_DIR}/tmp_download else kodi-send --action="Notification(Unable to download Jellyfin - no temp directory,30000,${ICON})" >/dev/null exit 0 fi echo "Downloading Jellyfin" # download Jellyfin rm -f ${CONTROL_FILE} ${DATA_FILE} ( curl -L -# -O -C - https://repo.jellyfin.org/releases/server/portable/versions/stable/combined/@JELLYFIN_VERSION@/${JELLYFIN_FILE} 2>${DATA_FILE} touch ${CONTROL_FILE} ) | \ while [ : ]; do [ -f ${DATA_FILE} ] && prog="$(tr '\r' '\n' < ${DATA_FILE} | tail -n 1 | sed -r 's/^[# ]+/#/;s/^[^0-9]*//g')" || prog= kodi-send --action="Notification(Downloading Jellyfin,\"${prog:-0.0%}\",3000,${ICON})" >/dev/null [ -f ${CONTROL_FILE} ] && break sleep 4 done rm -f ${CONTROL_FILE} ${DATA_FILE} # extract Jellyfin kodi-send --action="Notification(Extracting Jellyfin,Starting,1000,${ICON})" >/dev/null # extract JELLYFIN_FILE to libs directory mkdir ${ADDON_DIR}/libs tar xf ${JELLYFIN_FILE} -C ${ADDON_DIR}/libs --strip-components=2 # cleanup cd ${ADDON_DIR} rm -rf ${TEMP_DIR}/tmp_download rmdir ${TEMP_DIR} touch ${ADDON_DIR}/extract.ok kodi-send --action="Notification(Extracting Jellyfin,Finished,1000,${ICON})" >/dev/null ================================================ FILE: packages/addons/service/jellyfin/source/bin/jellyfin-start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.jellyfin # check if jellyfin is already successful installed if [ ! -f "$ADDON_DIR/extract.ok" ]; then cd $ADDON_DIR jellyfin-downloader fi libs="${ADDON_DIR}/libs" ff="/storage/.kodi/addons/tools.ffmpeg-tools/bin" exec \ nice -n "$jellyfin_nice" \ dotnet "${libs}/jellyfin.dll" \ --datadir "${ADDON_HOME}" \ --ffmpeg "${ff}/ffmpeg" ================================================ FILE: packages/addons/service/jellyfin/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import json import subprocess import xbmc import xbmcaddon import xbmcgui def jsonrpc(request): return json.loads(xbmc.executeJSONRPC(json.dumps(request))) def disable_conflicting(conficting, message='{that} conflicts with {this} and has been disabled'): is_enabled = {'jsonrpc': '2.0', 'method': 'Addons.GetAddonDetails', 'id': 1, 'params': {'addonid': conficting, 'properties': ['enabled']}} disable = {'jsonrpc': '2.0', 'method': 'Addons.SetAddonEnabled', 'id': 1, 'params': {'addonid': conficting, 'enabled': False}} try: if jsonrpc(is_enabled)['result']['addon']['enabled']: this = xbmcaddon.Addon().getAddonInfo('name') that = xbmcaddon.Addon(conficting).getAddonInfo('name') jsonrpc(disable) dialog = xbmcgui.Dialog() dialog.ok(this, message.format( this=this, that=that)) del dialog except KeyError: pass class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == '__main__': disable_conflicting('service.emby') Monitor().waitForAbort() ================================================ FILE: packages/addons/service/jellyfin/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: jellyfin # Addon id: service.jellyfin # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "Configuration" msgstr "" msgctxt "#30001" msgid "Priority (nice, 0=max, 19=min)" msgstr "" ================================================ FILE: packages/addons/service/jellyfin/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/jellyfin/source/settings-default.xml ================================================ 10 ================================================ FILE: packages/addons/service/jellyfin/source/system.d/service.jellyfin.service ================================================ [Unit] Description=Jellyfin - The Free Software Media System Documentation=https://jellyfin.org/ Wants=multi-user.target After=multi-user.target [Service] SyslogIdentifier=%N ExecStart=/bin/sh /storage/.kodi/addons/%N/bin/jellyfin-start Restart=always [Install] WantedBy=multi-user.target ================================================ FILE: packages/addons/service/lcdd/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/lcdd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="lcdd" PKG_VERSION="9ec9ba4e5dda653288bc55d2898723aa2c2ad9c1" PKG_SHA256="442f60fc7c26847508e7fb99d901e905016c136d0f6eb320e3262bef20f39452" PKG_VERSION_DATE="0.5dev+2020-07-21" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://lcdproc.org/" PKG_URL="https://github.com/lcdproc/lcdproc/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain freetype libftdi1 libhid libugpio libusb ncurses serdisplib" PKG_SECTION="service" PKG_SHORTDESC="LCDproc: Software to display system information from your Linux/*BSD box on a LCD" PKG_LONGDESC="LCDproc (${PKG_VERSION}) is a piece of software that displays real-time system information from your Linux/*BSD box on a LCD. The server supports several serial devices: Matrix Orbital, Crystal Fontz, Bayrad, LB216, LCDM001 (kernelconcepts.de), Wirz-SLI, Cwlinux(.com) and PIC-an-LCD; and some devices connected to the LPT port: HD44780, STV5730, T6963, SED1520 and SED1330. Various clients are available that display things like CPU load, system load, memory usage, uptime, and a lot more." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-parallel" PKG_IS_ADDON="yes" PKG_ADDON_NAME="LCDproc" PKG_ADDON_TYPE="xbmc.service" PKG_CONFIGURE_OPTS_TARGET="--with-ft-prefix=${SYSROOT_PREFIX}/usr \ --enable-libusb \ --enable-libftdi \ --disable-libX11 \ --enable-libhid \ --disable-libpng \ --enable-drivers=all" pre_configure_target() { CFLAGS+=" -O3" } addon() { drivers="none|$(cat ${PKG_BUILD}/.${TARGET_NAME}/config.log | sed -n "s|^DRIVERS=' \(.*\)'|\1|p" | sed "s|.so||g" | tr ' ' '|')" mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/config cp -PR ${PKG_DIR}/resources ${ADDON_BUILD}/${PKG_ADDON_ID} cp -PR ${PKG_INSTALL}/etc/LCDd.conf ${ADDON_BUILD}/${PKG_ADDON_ID}/config/ cp -PR ${PKG_INSTALL}/usr/lib ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR ${PKG_INSTALL}/usr/sbin ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ cp -L $(get_install_dir serdisplib)/usr/lib/libserdisp.so.2 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ sed -e "s|^DriverPath=.*$|DriverPath=/storage/.kodi/addons/service.lcdd/lib/lcdproc/|" \ -e "s|^#Foreground=.*$|Foreground=no|" \ -e "s|^#ServerScreen=.*$|ServerScreen=blank|" \ -e "s|^#Backlight=.*$|Backlight=open|" \ -e "s|^#Heartbeat=.*$|Heartbeat=open|" \ -e "s|^#TitleSpeed=.*$|TitleSpeed=4|" \ -e "s|^#Hello=\" Welcome to\"|Hello=\"Welcome to\"|" \ -e "s|^#Hello=\" LCDproc!\"|Hello=\"${DISTRONAME}\"|" \ -e "s|^#GoodBye=\"Thanks for using\"|GoodBye=\"Thanks for using\"|" \ -e "s|^#GoodBye=\" LCDproc!\"|GoodBye=\"${DISTRONAME}\"|" \ -e "s|^#normal_font=.*$|normal_font=/usr/share/fonts/liberation/LiberationMono-Bold.ttf|" \ -i ${ADDON_BUILD}/${PKG_ADDON_ID}/config/LCDd.conf sed -e "s/@DRIVERS@/${drivers}/" \ -i ${ADDON_BUILD}/${PKG_ADDON_ID}/resources/settings.xml } ================================================ FILE: packages/addons/service/lcdd/patches/lcdd-0.5.6-dm140_henlar_v0.2.patch ================================================ diff --git a/LCDd.conf b/LCDd.conf index 80be77e..35d53af 100644 --- a/LCDd.conf +++ b/LCDd.conf @@ -292,6 +292,9 @@ Keypad=yes #keypad_test_mode=yes +## DM140 VFD +[dm140] + ## ea65 driver for the display in AOpen XC Cube AV EA65 media barebones ## [ea65] diff --git a/acinclude.m4 b/acinclude.m4 index 14ffcf7..3a63297 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -9,7 +9,7 @@ AC_ARG_ENABLE(drivers, [ which is a comma-separated list of drivers.] [ Possible drivers are:] [ bayrad,CFontz,CFontzPacket,curses,CwLnx,ea65,] - [ EyeboxOne,futaba,g15,glcd,glcdlib,glk,hd44780,i2500vfd,] + [ dm140,EyeboxOne,futaba,g15,glcd,glcdlib,glk,hd44780,i2500vfd,] [ icp_a106,imon,imonlcd,IOWarrior,irman,irtrans,] [ joy,lb216,lcdm001,lcterm,linux_input,lirc,lis,MD8800,mdm166a,] [ ms6931,mtc_s16209x,MtxOrb,mx5000,NoritakeVFD,] @@ -23,7 +23,7 @@ drivers="$enableval", drivers=[bayrad,CFontz,CFontzPacket,curses,CwLnx,glk,lb216,lcdm001,MtxOrb,pyramid,text]) -allDrivers=[bayrad,CFontz,CFontzPacket,curses,CwLnx,ea65,EyeboxOne,futaba,g15,glcd,glcdlib,glk,hd44780,i2500vfd,icp_a106,imon,imonlcd,IOWarrior,irman,irtrans,joy,jw002,lb216,lcdm001,lcterm,linux_input,lirc,lis,MD8800,mdm166a,ms6931,mtc_s16209x,MtxOrb,mx5000,NoritakeVFD,Olimex_MOD_LCD1x9,picolcd,pyramid,sdeclcd,sed1330,sed1520,serialPOS,serialVFD,shuttleVFD,sli,stv5730,SureElec,svga,t6963,text,tyan,ula200,vlsys_m428,xosd,rawserial,yard2LCD] +allDrivers=[bayrad,CFontz,CFontzPacket,curses,CwLnx,dm140,ea65,EyeboxOne,futaba,g15,glcd,glcdlib,glk,hd44780,i2500vfd,icp_a106,imon,imonlcd,IOWarrior,irman,irtrans,joy,jw002,lb216,lcdm001,lcterm,linux_input,lirc,lis,MD8800,mdm166a,ms6931,mtc_s16209x,MtxOrb,mx5000,NoritakeVFD,Olimex_MOD_LCD1x9,picolcd,pyramid,sdeclcd,sed1330,sed1520,serialPOS,serialVFD,shuttleVFD,sli,stv5730,SureElec,svga,t6963,text,tyan,ula200,vlsys_m428,xosd,rawserial,yard2LCD] if test "$debug" = yes; then allDrivers=["${allDrivers},debug"] fi @@ -128,6 +128,10 @@ dnl else DRIVERS="$DRIVERS debug${SO}" actdrivers=["$actdrivers debug"] ;; + dm140) + DRIVERS="$DRIVERS dm140${SO}" + actdrivers=["$actdrivers dm140"] + ;; ea65) DRIVERS="$DRIVERS ea65${SO}" actdrivers=["$actdrivers ea65"] diff --git a/server/drivers/Makefile.am b/server/drivers/Makefile.am index f82df85..0d98570 100644 --- a/server/drivers/Makefile.am +++ b/server/drivers/Makefile.am @@ -23,7 +23,7 @@ lcdexecbindir = $(pkglibdir) lcdexecbin_PROGRAMS = @DRIVERS@ -EXTRA_PROGRAMS = bayrad CFontz CFontzPacket curses CwLnx debug ea65 EyeboxOne futaba g15 glcd glcdlib glk hd44780 i2500vfd icp_a106 imon imonlcd IOWarrior irman irtrans joy jw002 lb216 lcdm001 lcterm linux_input lirc lis MD8800 mdm166a ms6931 mtc_s16209x MtxOrb mx5000 NoritakeVFD Olimex_MOD_LCD1x9 picolcd pyramid rawserial sdeclcd sed1330 sed1520 serialPOS serialVFD shuttleVFD sli stv5730 SureElec svga t6963 text tyan ula200 vlsys_m428 xosd yard2LCD +EXTRA_PROGRAMS = bayrad CFontz CFontzPacket curses CwLnx debug dm140 ea65 EyeboxOne futaba g15 glcd glcdlib glk hd44780 i2500vfd icp_a106 imon imonlcd IOWarrior irman irtrans joy jw002 lb216 lcdm001 lcterm linux_input lirc lis MD8800 mdm166a ms6931 mtc_s16209x MtxOrb mx5000 NoritakeVFD Olimex_MOD_LCD1x9 picolcd pyramid rawserial sdeclcd sed1330 sed1520 serialPOS serialVFD shuttleVFD sli stv5730 SureElec svga t6963 text tyan ula200 vlsys_m428 xosd yard2LCD noinst_LIBRARIES = libLCD.a libbignum.a futaba_CFLAGS = @LIBUSB_CFLAGS@ @LIBUSB_1_0_CFLAGS@ $(AM_CFLAGS) @@ -89,6 +89,7 @@ CFontzPacket_SOURCES = lcd.h lcd_lib.h CFontzPacket.c CFontzPacket.h CFontz-char curses_SOURCES = lcd.h curses_drv.h curses_drv.c CwLnx_SOURCES = lcd.h lcd_lib.h CwLnx.c CwLnx.h debug_SOURCES = lcd.h debug.c debug.h +dm140_SOURCES = lcd.h led.c libvfd.h led.h dm140.c dm140.h report.h ea65_SOURCES = lcd.h ea65.h ea65.c EyeboxOne_SOURCES = lcd.h lcd_lib.h EyeboxOne.c EyeboxOne.h futaba_SOURCES = lcd.h futaba.c futaba.h diff --git a/server/drivers/dm140.c b/server/drivers/dm140.c new file mode 100644 index 0000000..56f9219 --- /dev/null +++ b/server/drivers/dm140.c @@ -0,0 +1,241 @@ +/* + * dm1400 vfd driver (c)2007 Henrik Larsson + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "lcd.h" +#include "dm140.h" + +#include "shared/report.h" +#include "lcd_lib.h" +#include "libvfd.h" +#include "led.h" + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + + +/* Vars for the server core */ +MODULE_EXPORT char *api_version = API_VERSION; +MODULE_EXPORT int stay_in_foreground = 0; +MODULE_EXPORT int supports_multiple = 0; +MODULE_EXPORT char *symbol_prefix = "dm140_"; + + +MODULE_EXPORT int +dm140_init (Driver *drvthis) +{ + PrivateData *p; + int i; + + /* Allocate and store private data */ + p = (PrivateData *) calloc(1, sizeof(PrivateData)); + if (p == NULL) + { + report(RPT_CRIT, "Failed to allocate memory for PrivateData\n"); + return -1; + } + + if (drvthis->store_private_ptr(drvthis, p)) + { + report(RPT_CRIT, "Failed to store Private Ptr!"); + return -1; + } + + /* initialize private data */ + p->width = 18; + p->height = 2; + p->pszVendor = "040b"; + p->pszProduct = "7001"; + + p->gIconMask = 0; + p->gLayout = VFD_STR_LAYOUT_1; + p->gScrollTime = 1; + p->gFlags = 0; + p->gDisplayMode = VFD_MODE_NONE; + + if ((p->framebuf = (char *) calloc(1, p->height)) == NULL) + { + report(RPT_CRIT, "Allocating memory for framebuffer Failed\n"); + return -1; + } + + for (i=0; iheight; i++) + { + p->framebuf[i] = (char *) calloc(1, p->width+1); + report(RPT_INFO, "Allocating memory for framebuffer[%d]\n", i); + if (p->framebuf == NULL) + return -1; + } + + if((p->fd = OpenHID(drvthis))< 0) + { + report(RPT_INFO, "Device for Vendor[%s] Product[%s] was not found, exiting\n", p->pszVendor, p->pszProduct); + return -1; + } + + //****************************************************** + // Initialize the internal report structures + //****************************************************** + if(ioctl(p->fd, HIDIOCINITREPORT,0)<0) + return -1; + + //****************************************************** + // Find out what type of reports this device accepts + //****************************************************** + //FindReports(fd); + + //****************************************************** + // Set up the display to show graphics + //****************************************************** + VFDTurnOffIcons(drvthis); + VFDSetDisplay(drvthis, VFD_MODE_NONE, 0, 0, 0); + VFDGraphicsClearBuffer(drvthis, VFD_GR_PAGE_3); + + //****************************************************** + // Set up the display, scrolling region, scroll rate etc. + //****************************************************** + VFDDisableDisplay(drvthis); + VFDClearString(drvthis, VFD_STR_REGION_1); + VFDClearString(drvthis, VFD_STR_REGION_3); + VFDEnableString(drvthis, VFD_STR_LAYOUT_2); +// VFDSetScrollRegion(drvthis, 0); +// VFDSetScrollTime(drvthis, 500); + + VFDSetString(drvthis, VFD_STR_REGION_1, 0, "DM140 online!!!"); + + return 0; + +} + +MODULE_EXPORT void +dm140_close (Driver *drvthis) +{ + PrivateData *p = drvthis->private_data; + + + VFDClearString(drvthis, VFD_STR_REGION_1); + VFDClearString(drvthis, VFD_STR_REGION_2); + VFDClearString(drvthis, VFD_STR_REGION_3); + VFDClearString(drvthis, VFD_STR_REGION_4); + + if (p != NULL) { + if (p->fd >= 0) + close(p->fd); + + free(p); + } + drvthis->store_private_ptr(drvthis, NULL); +} + +MODULE_EXPORT int +dm140_width (Driver *drvthis) +{ + PrivateData *p = drvthis->private_data; + return p->width; +} + +MODULE_EXPORT int +dm140_height (Driver *drvthis) +{ + PrivateData *p = drvthis->private_data; + return p->height; +} + +MODULE_EXPORT int +dm140_string (Driver *drvthis, int x, int y, char *buffer) +{ + PrivateData *p = drvthis->private_data; + int i; + + report(RPT_INFO, "%s called with values(x,y,c): %d, %d, %s", __FUNCTION__, x, y, buffer); + + for (i=0; iframebuf[y-1][x+i]=buffer[i]; + } + +/* + if (y > p->height) + y = p->height; + + if (y == 2) + y = VFD_STR_REGION_3; + + return VFDSetString(drvthis, y, x, buffer); +*/ + + return 0; +} + +MODULE_EXPORT int +dm140_char (Driver *drvthis, int x, int y, char c) +{ + PrivateData *p = drvthis->private_data; + + report(RPT_INFO, "%s called with values(x,y,c): %d, %d, %c", __FUNCTION__, x, y, c); + + p->framebuf[y][x] = c; + + return 0; +} + +MODULE_EXPORT int +dm140_clear (Driver *drvthis) +{ + PrivateData *p = drvthis->private_data; + int i; + + report(RPT_INFO, "%s called with values()", __FUNCTION__); + + for (i=0; iheight; i++) + { + memset(p->framebuf[i], 0x20, p->width); + p->framebuf[i][p->width] = 0x00; + } + +// VFDClearString(drvthis, VFD_STR_REGION_1); +// VFDClearString(drvthis, VFD_STR_REGION_2); +// VFDClearString(drvthis, VFD_STR_REGION_3); +// VFDClearString(drvthis, VFD_STR_REGION_4); + + return 0; +} + +MODULE_EXPORT int +dm140_flush (Driver *drvthis) +{ + PrivateData *p = drvthis->private_data; + int i; + int y; + + report(RPT_INFO, "%s called with values()", __FUNCTION__); + + for (i=0; iheight; i++) + { + y = VFD_STR_REGION_1; + if(i==0) y = VFD_STR_REGION_1; + if(i==1) y = VFD_STR_REGION_3; + // Do switch depening on VFD_LAYOUT + VFDSetString(drvthis, y, 1, p->framebuf[i]); + } + + // Don't know what to do + + return 0; +} + + diff --git a/server/drivers/dm140.h b/server/drivers/dm140.h new file mode 100644 index 0000000..4d04e2c --- /dev/null +++ b/server/drivers/dm140.h @@ -0,0 +1,38 @@ +#ifndef DM140_H +#define DM140_H + +#include "libvfd.h" + +typedef struct driver_private_data { + char device[256]; + int fd; + + int width; + int height; + + char *pszVendor; + char *pszProduct; + + int gIconMask; + char gLayout; + char gScrollTime; + char gFlags; + int gDisplayMode; + char gPages[VFD_PAGE_SIZE][VFD_PAGE_COUNT]; + + char **framebuf; + +} PrivateData; + + +/* dm140 */ +MODULE_EXPORT int dm140_init (Driver *drvthis); +MODULE_EXPORT void dm140_close (Driver *drvthis); +MODULE_EXPORT int dm140_width (Driver *drvthis); +MODULE_EXPORT int dm140_height (Driver *drvthis); +MODULE_EXPORT int dm140_string (Driver *drvthis, int y, int x, char *buffer); +MODULE_EXPORT int dm140_char (Driver *drvthis, int y, int x, char c); +MODULE_EXPORT int dm140_clear (Driver *drvthis); +MODULE_EXPORT int dm140_flush (Driver *drvthis); + +#endif diff --git a/server/drivers/led.c b/server/drivers/led.c new file mode 100644 index 0000000..0bb565c --- /dev/null +++ b/server/drivers/led.c @@ -0,0 +1,1065 @@ +/* File modified by Henrik Larsson 2007 to interface with LCDproc API + */ + +/* vfd demo application + * Copyright (C) 2006, Advanced Micro Devices, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +/* This is an example application that turns on the icons on the front panel + * and also displays text on the VFD screen + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "lcd.h" +#include "libvfd.h" +#include "shared/report.h" +#include "dm140.h" + + +//************************************************************** +// HID devices exchange data with the host computer using data bundles called +// reports. Each report is divided into "fields", each of which can have one +// or more "usages". In the hid-core each one of these usages has a single +// signed 32 bit value. +// +// read(): +// This is the event interface. When the HID device's state changes, it +// performs an interrupt transfer containing a report which contains the +// changed value. The hid-core.c module parses the report, and returns to +// hiddev.c the individual usages that have changed within the report. In +// its basic mode, the hiddev will make these individual usage changes +// available to the reader using a struct hiddev_event: +// struct hiddev_event { unsigned hid; +// containing the HID usage identifier for the status that changed, and the +// value that it was changed to. Note that the structure is defined within +// , along with some other useful #defines and structures. +// The HID usage identifier is a composite of the HID usage page shifed to +// the 16 high order bits ORed with the usage code. The behavior of the read() +// function can be modified using the HIDIOCSFLAG ioctl described below. +// +// ioctl(): +// Instructs the kernel to retrieve all input and feature report values from +// the device. At this point, all the usage structures will contain current +// values for the device, and will maintain it as the device changes. Note +// that the use of this ioctl is unnecessary in general, since later kernels +// automatically initialize the reports from the device at attach time. +//************************************************************** + +/* hack - fix improper signed char handling - it's seeing 0x80 as a negative value*/ +#define VALUE_FILTER(_value) (_value>0x7F)?(__s32)(0xFFFFFF00 | _value):(_value) + +#define VFD_PACKET_SIZE(s) (s*8) + +unsigned char amd_logo[VFD_PAGE_SIZE] = { + 0x7f,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x3f,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x1f,0xfe,0x07,0x83,0xc0,0xe3,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0f,0xfe,0x07,0x83,0xe1,0xe3,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x07,0xfe,0x07,0xc3,0xe1,0xe3,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x10,0x1e,0x0f,0xc3,0xf3,0xe3,0x87,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 0x30,0x1e,0x0e,0xe3,0xb3,0x63,0x83,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 0x30,0x1e,0x1c,0xe3,0xb7,0x63,0x83,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf0,0x1e,0x1c,0xe3,0x9e,0x63,0x83,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf0,0x1e,0x1c,0x73,0x9e,0x63,0x83,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf0,0x1e,0x3f,0xf3,0x9c,0x63,0x83,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 0xff,0xce,0x3f,0xf3,0x8c,0x63,0x8f,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 0xff,0x86,0x38,0x3b,0x80,0x63,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xff,0x02,0x70,0x3b,0x80,0x63,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; + + +char icon_bits[] = +{ + 15, 14, 13, 12, 11, 10, 9, 8, + 18, 17, 16, 19, 23, 27, 31, 35, + 39, 43, 47, 51, 55, 59, 63 +}; + +//************************************************************** +// FUNCTION: Compare +// +// INPUT: +// const char *pszValue - string to compare +// short sValue - numberic value to compare +// +// OUTPUT: +// int - Boolean value, 0 on non match, 1 on success. +// +// DESCRIPTION: Compare a character value to a numeric value. +//************************************************************** +int Compare(const char *pszValue, short sValue) +{ + int iValue; + // convert the pszValue to a number + sscanf( pszValue, "%4x", &iValue); + return( iValue == sValue ); +} + + +//************************************************************** +// FUNCTION: OpenHID +// +// INPUT: +// const char *pszVendor - Vendor ID of device to open +// const char *pszProduct - Product ID of device to open +// +// OUTPUT: +// int fd - file descriptor to the opened HID device or -1 if err. +// +// DESCRIPTION: This function will open all the HID's on the +// system until we find a match or we've exhausted our search. +//************************************************************** +int OpenHID(Driver *drvthis) +{ + int i, fd=-1; + char port[32]; + char name[256]; + const char *hiddev_prefix = "/dev/usb/hiddev"; /* in devfs */ + int version; + struct hiddev_devinfo device_info; + PrivateData *p = drvthis->private_data; + + + //****************************************************** + // Loop through all the 16 HID ports/devices looking for + // one that matches our device. + //****************************************************** + for(i=0; i<16;i++) + { + sprintf(port, "%s%d", hiddev_prefix, i); + if((fd = open(port,O_WRONLY))>=0) + { + ioctl(fd, HIDIOCGDEVINFO, &device_info); + ioctl(fd, HIDIOCGNAME(sizeof(name)), name); + + // If we've found our device, no need to look further, time to stop searching + if( Compare(p->pszVendor, device_info.vendor) && Compare(p->pszProduct, device_info.product)) + { + break; // stop the for loop + } + close(fd); // Added by HL + } + } + + //****************************************************** + // If we've found our device, print out some information about it. + //****************************************************** + if(fd != -1) + { + int appl; + report(RPT_INFO, "Found Device - Name is %s\n", name); + report(RPT_INFO, "Vendor[0x%04hx] Product[0x%04hx] Version[0x%04hx]\n\t", + device_info.vendor, device_info.product, device_info.version); + switch(device_info.bustype) + { + default: + report(RPT_INFO, " an unknown bus type: 0x%04hx ", device_info.bustype); + report(RPT_INFO, "bus[%d], devnum[%d] ifnum[%d]\n", device_info.busnum, + device_info.devnum, device_info.ifnum); + break; + } + //****************************************************** + // Read the version - it's a packed 32 field, so + // unpack it in order to display + //****************************************************** + ioctl(fd, HIDIOCGVERSION, &version); + report(RPT_INFO, "HIDdev Driver Version is %d.%d.%d\n", + version >>16, (version>>8)&0xff,version &0xff); + + report(RPT_INFO, "There are %d applications for this device\n", device_info.num_applications); + + for(i=0;i> 16) + { + case 0x01: report(RPT_INFO, "(Generic Desktop Page)\n");break; + case 0x02: report(RPT_INFO, "(Simulation Controls)\n"); break; + case 0x03: report(RPT_INFO, "(VR Controls)\n"); break; + case 0x04: report(RPT_INFO, "(Sport Controls)\n"); break; + case 0x05: report(RPT_INFO, "(Game Controls)\n"); break; + case 0x06: report(RPT_INFO, "(Generic Device Controls)\n");break; + case 0x07: report(RPT_INFO, "(Keyboard/Keypad)\n"); break; + case 0x08: report(RPT_INFO, "(LEDs)\n"); break; + case 0x09: report(RPT_INFO, "(Button)\n"); break; + case 0x0A: report(RPT_INFO, "(Ordinal)\n"); break; + case 0x0B: report(RPT_INFO, "(Telphony)\n"); break; + case 0x0C: report(RPT_INFO, "(Consumer Product Page)\n"); break; + case 0x0D: report(RPT_INFO, "(Digitizer)\n"); break; + case 0x0E: report(RPT_INFO, "(Reserved)\n"); break; + case 0x0F: report(RPT_INFO, "(PID Page)\n"); break; + case 0x14: report(RPT_INFO, "(Alphanumeric Display)\n"); break; + case 0x15: + case 0x3f: report(RPT_INFO, "(Reserved)\n"); break; + case 0x40: report(RPT_INFO, "(Medical Instruments)\n"); break; + case 0x80: report(RPT_INFO, "(USB Monitor Page)\n"); break; + case 0x81: report(RPT_INFO, "(USB Enumerated Values Page)\n"); break; + case 0x82: report(RPT_INFO, "(VESA Virtual Controls Page)\n"); break; + case 0x83: report(RPT_INFO, "(Reserved Monitor Page)\n"); break; + case 0x84: report(RPT_INFO, "(Power Device Page)\n"); break; + case 0x85: report(RPT_INFO, "(Battery System Page)\n"); break; + case 0x86: + case 0x87: report(RPT_INFO, "(Reserved Power Device Page)\n"); break; + case 0x8C: report(RPT_INFO, "(Bar Code Scanner Page)\n"); break; + case 0x8D: report(RPT_INFO, "(Scale Page)\n"); break; + case 0x8E: report(RPT_INFO, "(Magnetic Stripe Reading Device)\n"); break; + case 0x8F: report(RPT_INFO, "(Point of Sale pages)\n"); break; + case 0x90: report(RPT_INFO, "(Camera Control Page)\n"); break; + case 0x91: report(RPT_INFO, "(Arcade Page)\n"); break; + default: + { + int page = (appl >> 16) & 0x0000FFFF; + if((page >= 0xFF00) && (page <= 0xFFFF)) + report(RPT_INFO, "(Vendor Defined - 0x%04X)\n",page); + else + report(RPT_INFO, "(Unknown page - needs to be added 0x%04X)\n",(appl>>16)); + break; + } + } + } + } + return fd; +} + +//************************************************************** +// FUNCTION: FindReports +// +// INPUT: +// int fd - file descriptor to the opened HID device +// +// OUTPUT: +// none +// +// DESCRIPTION: This function will print out the type of reports +// this HID accepts. +//************************************************************** +void FindReports(Driver *drvthis) +{ + int iFields, iUsage; + int iReportType; + struct hiddev_report_info repInfo; + struct hiddev_field_info fieldInfo; + struct hiddev_usage_ref usageRef; + PrivateData *p = drvthis->private_data; + int fd = p->fd; + + //****************************************************** + // For each type of report (Input, Output, Feature) + // find out which is accepted for this device. + //****************************************************** + for(iReportType=HID_REPORT_TYPE_MIN; + iReportType<=HID_REPORT_TYPE_MAX; + iReportType ++) + { + repInfo.report_type = iReportType; + repInfo.report_id = HID_REPORT_ID_FIRST; + + //****************************************************** + // HIDIOCGREPORTINFO - struct hiddev_report_info (read/write) + // Obtain the usage information if it is found + //****************************************************** + while(ioctl(fd, HIDIOCGREPORTINFO, &repInfo)>=0) + { + report(RPT_INFO, " Report id: %d (%s) (%d fields)\n", + repInfo.report_id, + (iReportType == HID_REPORT_TYPE_INPUT) ? "Input" : + (iReportType == HID_REPORT_TYPE_OUTPUT) ? "Output" : "Feature/Other", + repInfo.num_fields); + + //****************************************************** + // HIDIOCGFIELDINFO - struct hiddev_field_info (read/write) + // Returns the field information associated with a report + // in a hiddev_field_info structure. The user must fill + // in report_id and report_type in this structure. The + // field_index should also be filled in, which should be + // a number between 0 and maxfield-1. + //****************************************************** + for(iFields = 0; iFieldsprivate_data; + int fd = p->fd; + + //****************************************************** + // Initialize the usage Reference and mark it for OUTPUT + //****************************************************** + memset(&uref, 0, sizeof(uref)); + uref.report_type = HID_REPORT_TYPE_OUTPUT; + uref.report_id = 0; + uref.field_index = 0; + + //************************************************************** + // Fill in the information that we wish to set + //************************************************************** + uref.usage_code = 0xffa10005; // unused? + for(i=0;iprivate_data; + + if(icon > VFD_ICON_DVD) + return -1; + + if(state) + p->gIconMask |= 1<gIconMask &= ~(1<gIconMask); +} + +//************************************************************** +// FUNCTION: VFDIconOn +// +// INPUT: +// int fd - file descriptor to the opened HID device +// int icon - icon to turn on +// +// OUTPUT: +// int err - result of the VFDIconSet call (On success 0, On error -1) +// +// DESCRIPTION: This function will turn on one specific icon. +//************************************************************** +int VFDIconOn(Driver *drvthis, int icon) +{ +#ifdef DEBUG + report(RPT_INFO, "VFDIconOn %d\n",icon); +#endif + return VFDIconSet(drvthis, icon, 1); +} + +//************************************************************** +// FUNCTION: VFDIconOff +// +// INPUT: +// int fd - file descriptor to the opened HID device +// int icon - icon to turn off +// +// OUTPUT: +// int err - result of the VFDIconSet call (On success 0, On error -1) +// +// DESCRIPTION: This function will turn off one specific icon. +//************************************************************** +int VFDIconOff(Driver *drvthis, int icon) +{ +#ifdef DEBUG + report(RPT_INFO, "VFDIconOff %d\n",icon); +#endif + return VFDIconSet(drvthis, icon, 0); +} + +//************************************************************** +// FUNCTION: VFDTurnOffIcons +// +// INPUT: +// int fd - file descriptor to the opened HID device +// +// OUTPUT: +// int err - result of the SendReport call (On success 0, On error -1) +// +// DESCRIPTION: This function will turn off all the icons +//************************************************************** +int VFDTurnOffIcons(Driver *drvthis) +{ +#ifdef DEBUG + report(RPT_INFO, "VFDTurnOffIcons\n"); +#endif + int err; + const char panelCmd[] = {0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}; + const char iconCmd[] = {0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //icon command + const char iconoff[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //icon data + + err = SendReport(drvthis, panelCmd, sizeof(panelCmd)); + err = SendReport(drvthis, iconCmd, sizeof(iconCmd)); + err = SendReport(drvthis, iconoff, sizeof(iconoff)); + return err; +} + +//************************************************************** +// FUNCTION: VFDSetVolume +// +// INPUT: +// int fd - file descriptor to the opened HID device +// int level - volume level (between 0 and 12) +// +// OUTPUT: +// int err - result of the SendReport call (On success 0, On error -1) +// +// DESCRIPTION: This function will raise/lower the volume indicator. +//************************************************************** +int VFDSetVolume(Driver *drvthis, int level) +{ + int i; + PrivateData *p = drvthis->private_data; + + if(level>12) + return -1; + + // Clear all of the volume values + p->gIconMask &= ~0xFFFFF800; + + for(i=0;igIconMask |= 1 << (VFD_VOLUME_1 + i); + + return VFDShowIcons(drvthis, p->gIconMask); +} + +//************************************************************** +// FUNCTION: VFDSetString +// +// INPUT: +// int fd - file descriptor to the opened HID device +// int region - region to display the string +// int offset - location to display the string +// char *buffer - string to display +// +// OUTPUT: +// int err - result of the SendReport call (On success 0, On error -1) +// +// DESCRIPTION: This function will display a string in the +// specified region. +//************************************************************** +int VFDSetString(Driver *drvthis, int region, int offset, char *buffer) +{ +#ifdef DEBUG + report(RPT_INFO, "VFDSetString region %d offset %d buffer %s\n",region,offset,buffer); +#endif + + int i,size; + int len = strlen(buffer) + 1;// make sure we make room for the NULL + char stringCmd[8]; + + if( region > VFD_STR_REGION_4) + return -1; + + if( offset > 111) + offset = 111; + + if( len > 128) + { + len = 128; + buffer[127] = 0; + } + + //****************************************************** + // Figure out how many 8 character lines we'll be sending + //****************************************************** + size = ((len + 7) / 8) + 1; + + //****************************************************** + // Setup the string command packet + //****************************************************** + memset(stringCmd, 0, 8); + stringCmd[VFD_CLC_OFFSET] = size; + stringCmd[VFD_FID_OFFSET] = VFD_FID_SET_STRING; + stringCmd[VFD_SET_STRING_RN] = region; + stringCmd[VFD_SET_STRING_SL] = len; + stringCmd[VFD_SET_STRING_XP] = offset; + SendReport(drvthis, stringCmd, sizeof(stringCmd)); + + //****************************************************** + // Now send the string for display + //****************************************************** + for(i=0; i 8) ? 8 : size; + SendReport(drvthis, &buffer[i], size); + } + return VFDGlobalUpdateDisplay(drvthis); +} + +//************************************************************** +// FUNCTION: VFDClearString +// +// INPUT: +// int fd - file descriptor to the opened HID device +// int region - region to display the string based upon the chosen layout +// +// OUTPUT: +// int err - result of the SendReport call (On success 0, On error -1) +// +// DESCRIPTION: This function will clear a string in the +// specified region. +//************************************************************** +int VFDClearString(Driver *drvthis, int region) +{ + char pszClearStr[8]; + + if( region > VFD_STR_REGION_4) + return -1; + + memset(pszClearStr, 0, 8); + pszClearStr[VFD_CLC_OFFSET] = 1; + pszClearStr[VFD_FID_OFFSET] = VFD_FID_STRING_CLEAR; + pszClearStr[VFD_STRING_CLEAR_MD] = VFD_CLEAR_STR; + pszClearStr[VFD_STRING_CLEAR_RN] = region; + return SendReport(drvthis, pszClearStr, sizeof(pszClearStr)); +} + +//************************************************************** +// FUNCTION: VFDSetDisplay +// +// INPUT: +// int fd - file descriptor to the opened HID device +// int mode - VFD_MODE_NONE, VFD_MODE_STR, VFD_MODE_GRAPHICS +// char layout - VFD_STR_LAYOUT_1, VFD_STR_LAYOUT_2, VFD_STR_LAYOUT_3 +// char time - Scrolling Time in 50 ms units +// char flags - String Scrolling Enable Flag +// +// OUTPUT: +// int err - result of the SendReport call (On success 0, On error -1) +// +// DESCRIPTION: This function will turn on scrolling in the specified region. +//************************************************************** +int VFDSetDisplay(Driver *drvthis, int mode, char layout, char time, char flags) +{ + char packet[VFD_PACKET_SIZE(1)]; + + memset(packet, 0, 8); + + packet[VFD_CLC_OFFSET] = 1; + packet[VFD_FID_OFFSET] = VFD_FID_SET_DISPLAY; + packet[VFD_SET_DISPLAY_MD] = mode; + packet[VFD_SET_DISPLAY_DM] = layout; + packet[VFD_SET_DISPLAY_ST] = time; + packet[VFD_SET_DISPLAY_SF] = flags; + return SendReport(drvthis, packet, sizeof(packet)); +} + +//************************************************************** +// FUNCTION: VFDUpdateDisplay +// +// INPUT: +// int fd - file descriptor to the opened HID device +// int mode - VFD_MODE_NONE, VFD_MODE_STR, VFD_MODE_GRAPHICS +// char layout - VFD_STR_LAYOUT_1, VFD_STR_LAYOUT_2, VFD_STR_LAYOUT_3 +// char time - Scrolling Time in 50 ms units +// char flags - String Scrolling Enable Flag +// +// OUTPUT: +// int err - result of the SendReport call (On success 0, On error -1) +// +// DESCRIPTION: This function will update the display mode/layout/scrolltime. +//************************************************************** +int VFDUpdateDisplay(Driver *drvthis, int mode, char layout, char time, char flags) +{ + PrivateData *p = drvthis->private_data; + + if(mode != p->gDisplayMode) + return 0; + + return VFDSetDisplay(drvthis, mode, layout, time, flags); +} + +//************************************************************** +// FUNCTION: VFDGlobalUpdateDisplay +// +// INPUT: +// int fd - file descriptor to the opened HID device +// +// OUTPUT: +// int err - result of the SendReport call (On success 0, On error -1) +// +// DESCRIPTION: Update the display based upon the global configuration values. +//************************************************************** +int VFDGlobalUpdateDisplay(Driver *drvthis) +{ + PrivateData *p = drvthis->private_data; + return VFDUpdateDisplay(drvthis, p->gDisplayMode, p->gLayout, p->gScrollTime, p->gFlags); +} + +//************************************************************** +// FUNCTION: VFDSetScrollRegion +// +// INPUT: +// int fd - file descriptor to the opened HID device +// int region - region to scroll +// +// OUTPUT: +// int err - result of the SendReport call (On success 0, On error -1) +// +// DESCRIPTION: This function will turn on scrolling in the specified region. +//************************************************************** +int VFDSetScrollRegion(Driver *drvthis, int region) +{ + PrivateData *p = drvthis->private_data; + +#ifdef DEBUG + report(RPT_INFO, "VFDSetScrollRegion region %d\n",region); +#endif + p->gFlags &= ~0x0F; + p->gFlags |= (region & 0x0F); + return VFDUpdateDisplay(drvthis, VFD_MODE_STR, p->gLayout, p->gScrollTime, p->gFlags | VFD_SCROLL_ENABLE); +} + +//************************************************************** +// FUNCTION: VFDSetScrollTime +// +// INPUT: +// int fd - file descriptor to the opened HID device +// int time - time in ms to scroll +// +// OUTPUT: +// int err - result of the SendReport call (On success 0, On error -1) +// +// DESCRIPTION: This function will set the rate at which to scroll +//************************************************************** +int VFDSetScrollTime(Driver *drvthis, int time) +{ + PrivateData *p = drvthis->private_data; + + p->gScrollTime = time / 50; + return VFDUpdateDisplay(drvthis, VFD_MODE_STR, p->gLayout, p->gScrollTime, p->gFlags | VFD_SCROLL_ENABLE); +} + +//************************************************************** +// FUNCTION: VFDEnableDisplay +// +// INPUT: +// int fd - file descriptor to the opened HID device +// int mode - VFD_MODE_NONE, VFD_MODE_STR, VFD_MODE_GRAPHICS +// char layout - VFD_STR_LAYOUT_1, VFD_STR_LAYOUT_2, VFD_STR_LAYOUT_3 +// char time - Scrolling Time in 50 ms units +// char flags - String Scrolling Enable Flag +// +// OUTPUT: +// int err - result of the SendReport call (On success 0, On error -1) +// +// DESCRIPTION: This function specifies how the VFD is segmented. +//************************************************************** +int VFDEnableDisplay(Driver *drvthis, int mode, char layout, char time, char flags) +{ + PrivateData *p = drvthis->private_data; + + p->gDisplayMode = mode; + return VFDSetDisplay(drvthis, mode, layout, time, flags); +} + +//************************************************************** +// FUNCTION: VFDDisableDisplay +// +// INPUT: +// int fd - file descriptor to the opened HID device +// +// OUTPUT: +// int err - result of the SendReport call (On success 0, On error -1) +// +// DESCRIPTION: This function will disable any updates to the display +//************************************************************** +int VFDDisableDisplay(Driver *drvthis) +{ + PrivateData *p = drvthis->private_data; + + p->gDisplayMode = VFD_MODE_NONE; + return VFDSetDisplay(drvthis, VFD_MODE_NONE, 0, 0, 0); +} + + +//************************************************************** +// FUNCTION: VFDEnableString +// +// INPUT: +// int fd - file descriptor to the opened HID device +// char ucLayout - specify how the VFD is segmented +// +// OUTPUT: +// int err - result of the SendReport call (On success 0, On error -1) +// +// DESCRIPTION: This function specifies how the VFD is laid out. +// LAYOUT 1 LAYOUT 2 LAYOUT 3 +// /----------------\ /---------------\ /--------------------\ +// | | | Region 1 | |Region 1 | Region 2 | +// | Region 1 | |---------------| |---------+----------| +// | | | Region 3 | |Region 3 | Region 4 | +// \----------------/ \---------------/ \--------------------/ +//************************************************************** +int VFDEnableString(Driver *drvthis, char ucLayout) +{ + PrivateData *p = drvthis->private_data; + + if(ucLayout < VFD_STR_LAYOUT_1 || ucLayout > VFD_STR_LAYOUT_3) + return -1; + + p->gLayout = ucLayout; + return VFDEnableDisplay(drvthis, VFD_MODE_STR, p->gLayout, p->gScrollTime, p->gFlags | VFD_SCROLL_ENABLE); +} + + +//************************************************************** +// FUNCTION: _set_pixel +// +// INPUT: +// int page - page to draw on(VFD_GR_PAGE_1 ... VFD_GR_PAGE_4) +// int x - coordinate +// int y - coordinate +// int color - 0 or 1 - turn on/off the LED +// +// OUTPUT: +// Nothing +// +// DESCRIPTION: This function turns on/off pixels in the graphic page. +//************************************************************** +static void _set_pixel(Driver *drvthis, int page, int x, int y, int color) +{ + PrivateData *p = drvthis->private_data; + + char dst = ((y/8) * 112) + x; + char mask = (1 << (7 - (y%8))); + + // Turn the LED on/off based upon the color setting + if(color) + p->gPages[page][dst] |= mask; + else + p->gPages[page][dst] &= ~mask; +} + + +//************************************************************** +// FUNCTION: VFDGraphicsClearBuffer +// +// INPUT: +// int page - page to clear (VFD_GR_PAGE_1 ... VFD_GR_PAGE_4) +// +// OUTPUT: +// 0 on success, -1 on error +// +// DESCRIPTION: This function clears the specified graphic page. +//************************************************************** +int VFDGraphicsClearBuffer(Driver *drvthis, int page) +{ + PrivateData *p = drvthis->private_data; + + if(page >= VFD_PAGE_COUNT) + return -1; + + // Clear the page to all off + memset(p->gPages[page], 0, VFD_PAGE_SIZE); + return 0; +} + +//************************************************************** +// FUNCTION: VFDGraphicsCopyPage +// +// INPUT: +// int page - Graphic page (dst) (VFD_GR_PAGE_1 ... VFD_GR_PAGE_4) +// char *buffer - buffer worth of data (src) +// +// OUTPUT: +// Nothing +// +// DESCRIPTION: This function turns on/off pixels in the graphic page. +//************************************************************** +int VFDGraphicsCopyPage(Driver *drvthis, int page, char *buffer) +{ + int x, y; + int shift; + + if(page >= VFD_PAGE_COUNT) + return -1; + + for(y=0; y < VFD_HEIGHT; y++) + { + for(x=0; x < VFD_WIDTH; x++) + { + char src = (y*14)+(x/8); + shift = 7 - (x%8); + if(shift == 0) + shift = 1; + else + shift = 1 << shift; + _set_pixel(drvthis, page, x, y, buffer[src] & shift); + } + } + return 0; +} + +//************************************************************** +// FUNCTION: VFDSetGraphics +// +// INPUT: +// int fd - file descriptor to the opened HID device +// char region - Graphic Page index +// char *buf - data to display +// +// OUTPUT: +// +// DESCRIPTION: +//************************************************************** +int VFDSetGraphics(Driver *drvthis, char region, char *buf) +{ + int i, size; + char packet[8]; + + // Send the Command to Set Graphics + memset(packet, 0, 8); + + packet[VFD_CLC_OFFSET] = 29; + packet[VFD_FID_OFFSET] = VFD_FID_SET_GRAPHICS; + packet[VFD_SET_GRAPHICS_GP]=region; + SendReport(drvthis, packet, sizeof(packet)); + + // Send the actual graphics + for(i=0; i 8) ? 8 : size; + SendReport(drvthis, &buf[i], size); + } + return 0; +} + +//************************************************************** +// FUNCTION: VFDGraphicsSendPage +// +// INPUT: +// int fd - file descriptor to the opened HID device +// int page - page to display (VFD_GR_PAGE_1 ... VFD_GR_PAGE_4) +// +// OUTPUT: +// -1 on error, or results of VFDSetGraphics +// +// DESCRIPTION: Sends the graphics page to the VFD to be displayed. +//************************************************************** +int VFDGraphicsSendPage(Driver *drvthis, int page) +{ + PrivateData *p = drvthis->private_data; + + if(page >= VFD_PAGE_COUNT) + return -1; + return VFDSetGraphics(drvthis, page+1, p->gPages[page]); +} + +//************************************************************** +// FUNCTION: VFDGraphicsShowPage +// +// INPUT: +// int fd - file descriptor to the opened HID device +// int page - page to get ready to show (VFD_GR_PAGE_1 ... VFD_GR_PAGE_4) +// +// OUTPUT: +// -1 on error +// +// DESCRIPTION: Sets the VFD into Graphic mode +//************************************************************** +int VFDGraphicsShowPage(Driver *drvthis, int page) +{ + if(page >= VFD_PAGE_COUNT) + return -1; + return VFDEnableDisplay(drvthis, VFD_MODE_GRAPHICS, page+1, 0, 0); +} + +//************************************************************** +// FUNCTION: VFDGraphicsRect +// +// INPUT: +// int page - page to get ready to show (VFD_GR_PAGE_1 ... VFD_GR_PAGE_4) +// char color - 0 or 1 +// int srcx - starting X Coordinate +// int srcy - starting Y Coordinate +// int width - how wide to make the box +// int height - how tall to make the box +// +// OUTPUT: +// -1 on error +// +// DESCRIPTION: Draws a box at (srcx,srcy) - (srcx+width, srcy+height) +//************************************************************** +int VFDGraphicsRect(Driver *drvthis, int page, char color, int srcx, int srcy, int width, int height) +{ + PrivateData *p = drvthis->private_data; + + char *b; + int h, w, x, y; + + if( page >= VFD_PAGE_COUNT) + return -1; + + if (srcx > VFD_WIDTH || srcy > VFD_HEIGHT) + return 0; + + h = (srcy + height > VFD_HEIGHT) ? VFD_HEIGHT - srcy : srcy + height; + w = (srcx + width > VFD_WIDTH) ? VFD_WIDTH - srcx : srcx + width; + b = p->gPages[page]; + + for( y = srcy; y < h; y++ ) + for( x = srcx; x < w; x++) + _set_pixel(drvthis, page, x, y, color); + + return 0; +} diff --git a/server/drivers/led.h b/server/drivers/led.h new file mode 100644 index 0000000..5a01f0b --- /dev/null +++ b/server/drivers/led.h @@ -0,0 +1,29 @@ +#ifndef LED_H +#define LED_H + +// led.c functions +int OpenHID(Driver *drvthis); +int VFDShowIcons(Driver *drvthis, int mask); +int VFDIconSet(Driver *drvthis, int icon, int state); +int VFDIconOn(Driver *drvthis, int icon); +int VFDIconOff(Driver *drvthis, int icon); +int VFDTurnOffIcons(Driver *drvthis); +int VFDSetVolume(Driver *drvthis, int level); +int VFDSetString(Driver *drvthis, int region, int offset, char *buffer); +int VFDClearString(Driver *drvthis, int region); +int VFDSetDisplay(Driver *drvthis, int mode, char layout, char time, char flags); +int VFDUpdateDisplay(Driver *drvthis, int mode, char layout, char time, char flags); +int VFDGlobalUpdateDisplay(Driver *drvthis); +int VFDSetScrollRegion(Driver *drvthis, int region); +int VFDSetScrollTime(Driver *drvthis, int time); +int VFDEnableDisplay(Driver *drvthis, int mode, char layout, char time, char flags); +int VFDDisableDisplay(Driver *drvthis); +int VFDEnableString(Driver *drvthis, char ucLayout); +int VFDGraphicsClearBuffer(Driver *drvthis, int page); +int VFDGraphicsCopyPage(Driver *drvthis, int page, char *buffer); +int VFDSetGraphics(Driver *drvthis, char region, char *buf); +int VFDGraphicsSendPage(Driver *drvthis, int page); +int VFDGraphicsShowPage(Driver *drvthis, int page); +int VFDGraphicsRect(Driver *drvthis, int page, char color, int srcx, int srcy, int width, int height); + +#endif diff --git a/server/drivers/libvfd.h b/server/drivers/libvfd.h new file mode 100644 index 0000000..5bd8654 --- /dev/null +++ b/server/drivers/libvfd.h @@ -0,0 +1,183 @@ +/* Header for libvfd + * Copyright (C) 2006, Advanced Micro Devices, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#ifndef LIBVFD_H_ +#define LIBVFD_H_ + +/* Offsets into the VFD command packet */ + +#define VFD_CLC_OFFSET 0x00 +#define VFD_FID_OFFSET 0x01 + +/* VFD FID (Function IDs) */ + +#define VFD_FID_PANEL_BANK 0x01 +#define VFD_FID_ICON_CONTROL 0x02 +#define VFD_FID_SET_STRING 0x03 +#define VFD_FID_STRING_CLEAR 0x04 +#define VFD_FID_SET_DISPLAY 0x05 +#define VFD_FID_SET_GRAPHICS 0x06 +#define VFD_FID_GRAPHIC_AREA 0x07 + +/* Command specific offsets */ + +/* Panel Blank */ +#define VFD_PANEL_BLANK_BL 0x02 + +/* Icon Control */ +#define VFD_ICON_CONTROL_BITMAP 0x08 + +/* Set String */ +#define VFD_SET_STRING_RN 0x02 +#define VFD_SET_STRING_SL 0x03 +#define VFD_SET_STRING_XP 0x04 +#define VFD_SET_STRING_DATA 0x08 + +/* String Clear */ +#define VFD_STRING_CLEAR_MD 0x02 +#define VFD_CLEAR_STR 0x01 +#define VFD_CLEAR_GRAPHICS 0x02 +#define VFD_STRING_CLEAR_RN 0x03 + +/* Set Display */ +#define VFD_SET_DISPLAY_MD 0x02 +#define VFD_MODE_NONE 0x00 +#define VFD_MODE_STR 0x02 +#define VFD_MODE_GRAPHICS 0x03 +#define VFD_SET_DISPLAY_DM 0x03 +#define VFD_SET_DISPLAY_ST 0x04 +#define VFD_SET_DISPLAY_SF 0x06 + +/* Set Graphics */ +#define VFD_SET_GRAPHICS_GP 0x02 +#define VFD_SET_GRAPHICS_DATA 0x08 + +/* Graphic Area */ +#define VFD_GRAPHIC_AREA_OOF 0x02 + +/* LAYOUT 1 + /-----------------------\ + | | + | Region 1 | + | | + \-----------------------/ +*/ + +/* LAYOUT 2 + /-----------------------\ + | Region 1 | + |---------------------- | + | Region 3 | + \-----------------------/ +*/ + +/* LAYOUT 3 + /-----------------------\ + | Region 1 | Region 2 | + |---------------------- | + | Region 3 | Region 4 | + \-----------------------/ +*/ + +#define VFD_GR_PAGE_1 0x0 +#define VFD_GR_PAGE_2 0x1 +#define VFD_GR_PAGE_3 0x2 +#define VFD_GR_PAGE_4 0x3 + +#define VFD_STR_LAYOUT_1 0x01 +#define VFD_STR_LAYOUT_2 0x02 +#define VFD_STR_LAYOUT_3 0x03 + +#define VFD_STR_REGION_1 0x01 +#define VFD_STR_REGION_2 0x02 +#define VFD_STR_REGION_3 0x03 +#define VFD_STR_REGION_4 0x04 + +#define VFD_SCROLL_REGION1 (1 << 0) +#define VFD_SCROLL_REGION2 (1 << 1) +#define VFD_SCROLL_REGION3 (1 << 2) +#define VFD_SCROLL_REGION4 (1 << 3) + +#define VFD_SCROLL_ENABLE (1 << 7) + +/* Graphics defintions */ +/* The graphics area has a static resolution */ + +#define VFD_WIDTH 112 +#define VFD_HEIGHT 16 +#define VFD_PITCH (112 / 8) +#define VFD_PAGE_SIZE (VFD_PITCH * VFD_HEIGHT) +#define VFD_PAGE_COUNT 4 + +#define VFD_ICON_VIDEO 0 +#define VFD_ICON_CD 1 +#define VFD_ICON_PLAY 2 +#define VFD_ICON_RWND 3 +#define VFD_ICON_PAUSE 4 +#define VFD_ICON_FFWD 5 +#define VFD_ICON_SPEAKER 6 +#define VFD_ICON_REC 7 +#define VFD_ICON_VOLUME 8 +#define VFD_ICON_RADIO 9 +#define VFD_ICON_DVD 10 + +#define VFD_VOLUME_1 11 +#define VFD_VOLUME_2 12 +#define VFD_VOLUME_3 13 +#define VFD_VOLUME_4 14 +#define VFD_VOLUME_5 15 +#define VFD_VOLUME_6 16 +#define VFD_VOLUME_7 17 +#define VFD_VOLUME_8 18 +#define VFD_VOLUME_9 19 +#define VFD_VOLUME_10 20 +#define VFD_VOLUME_11 21 +#define VFD_VOLUME_12 22 + +#define VFD_ICON_COUNT 23 + +int vfd_cmd_graphic_area_state(unsigned char); +int vfd_cmd_panel_bank(unsigned char); +int vfd_cmd_icon_control(unsigned char *); +int vfd_cmd_set_string(unsigned char, unsigned char, unsigned char *, int); +int vfd_cmd_clear(unsigned char, unsigned char); +int vfd_cmd_set_display(unsigned char, unsigned char, unsigned char, unsigned char); +int vfd_cmd_set_graphics(unsigned char, unsigned char *); + +int vfd_enable_display(int, unsigned char, unsigned char, unsigned char); +int vfd_update_display(int, unsigned char, unsigned char, unsigned char); +int vfd_disable_display(int); + +void vfd_str_set_scroll_time(int); +void vfd_str_set_scroll_speed(unsigned char); +void vfd_str_set_scroll_regions(unsigned char); +int vfd_str_set_string(unsigned char, unsigned char, const unsigned char *); +int vfd_str_clear_string(unsigned char); +int vfd_str_enable(unsigned char); +int vfd_str_disable(void); + +int vfd_gr_clear_buffer(unsigned char); +int vfd_gr_show_page(int); +int vfd_gr_disable(void); +int vfd_gr_send_page(int); +int vfd_gr_clear_page(int); +int vfd_gr_copy_page(int page, char *src); + +int vfd_icon_set(int, int); +int vfd_icon_on(int, int); +int vfd_icon_off(int, int); + +void vfr_gr_bitmap(int, char *, int, int, int, int, int, int); +int vfr_gr_rect(int, unsigned char, int, int, int, int); + +int vfd_init(void); +int vfd_send_command(unsigned char, int, unsigned char *); +void vfd_close(void); + +#endif ================================================ FILE: packages/addons/service/lcdd/patches/lcdd-0.5.6-libftdi1.patch ================================================ diff --git a/server/drivers/hd44780-low.h b/server/drivers/hd44780-low.h index 47acf45..6faa830 100644 --- a/server/drivers/hd44780-low.h +++ b/server/drivers/hd44780-low.h @@ -26,7 +26,7 @@ #endif #ifdef HAVE_LIBFTDI -# include +# include #endif /** \name Symbolic names for connection types diff --git a/server/drivers/i2500vfd.c b/server/drivers/i2500vfd.c index d896a69..7fe74f2 100644 --- a/server/drivers/i2500vfd.c +++ b/server/drivers/i2500vfd.c @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include "lcd.h" #include "i2500vfd.h" diff --git a/server/drivers/lis.c b/server/drivers/lis.c index 5d3e97a..6c26a19 100644 --- a/server/drivers/lis.c +++ b/server/drivers/lis.c @@ -42,7 +42,7 @@ #include #include -#include +#include #include "lcd.h" #include "lis.h" diff --git a/server/drivers/ula200.c b/server/drivers/ula200.c index cbdde40..a84eb49 100644 --- a/server/drivers/ula200.c +++ b/server/drivers/ula200.c @@ -31,7 +31,7 @@ #include #include -#include +#include #include "lcd.h" #include "ula200.h" ================================================ FILE: packages/addons/service/lcdd/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/lcdd/source/bin/lcdd.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.lcdd if [ -z "$LCD_DRIVER" -o "$LCD_DRIVER" == "none" ]; then exit 0 fi LCDCONF=$ADDON_HOME/LCDd.conf if [ ! -f $LCDCONF ]; then if [ -f /storage/.cache/LCDd.conf ]; then mv /storage/.cache/LCDd.conf $LCDCONF else cp $ADDON_DIR/config/LCDd.conf $LCDCONF fi fi LCDd -f -c $LCDCONF -d $LCD_DRIVER ================================================ FILE: packages/addons/service/lcdd/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == '__main__': Monitor().waitForAbort() ================================================ FILE: packages/addons/service/lcdd/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file msgid "" msgstr "" msgctxt "#30000" msgid "Configuration" msgstr "" msgctxt "#30001" msgid "LCD driver" msgstr "" ================================================ FILE: packages/addons/service/lcdd/source/system.d/service.lcdd.service ================================================ [Unit] Description=LCDProc After=multi-user.target [Service] ExecStart=/bin/sh /storage/.kodi/addons/service.lcdd/bin/lcdd.start TimeoutStopSec=1s Restart=on-failure RestartSec=5 StartLimitInterval=30 StartLimitBurst=5 [Install] WantedBy=multi-user.target ================================================ FILE: packages/addons/service/librespot/changelog.txt ================================================ 1 - update librespot to githash 03b547d (2023-04-16) 2 - update librespot to githash c964102 (2023-05-14) 3 - update librespot to githash f037e46 (2023-07-19) 4 - update librespot to githash 886617e (2023-12-06) ================================================ FILE: packages/addons/service/librespot/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017 Shane Meagher (shanemeagher) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="librespot" PKG_VERSION="886617e41c2177d0cb184cb761aa64acc8695a88" PKG_VERSION_DATE="2023-12-06" PKG_SHA256="c53fa249e2ff7c75d51f4cbe9867e9ca6a60a0d714c2810fab16a29d113b2144" PKG_REV="4" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/librespot-org/librespot/" PKG_URL="https://github.com/librespot-org/librespot/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain alsa-lib avahi pulseaudio cargo:host" PKG_SECTION="service" PKG_SHORTDESC="Librespot: play Spotify through Kodi using a Spotify app as a remote" PKG_LONGDESC="Librespot (${PKG_VERSION_DATE}) lets you play Spotify through Kodi using a Spotify app as a remote." PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Librespot" PKG_ADDON_TYPE="xbmc.service" PKG_MAINTAINER="Anton Voyl (awiouy)" make_target() { export RUSTC_LINKER=${CC} cargo build \ --target ${TARGET_NAME} \ --release \ --no-default-features \ --features "alsa-backend pulseaudio-backend with-dns-sd" ${STRIP} ${PKG_BUILD}/.${TARGET_NAME}/target/${TARGET_NAME}/release/librespot } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp ${PKG_BUILD}/.${TARGET_NAME}/target/${TARGET_NAME}/release/librespot \ ${ADDON_BUILD}/${PKG_ADDON_ID}/bin mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/lib cp $(get_build_dir avahi)/avahi-compat-libdns_sd/.libs/libdns_sd.so.1 \ ${ADDON_BUILD}/${PKG_ADDON_ID}/lib } ================================================ FILE: packages/addons/service/librespot/source/bin/onevent.py ================================================ #!/usr/bin/python import json import os import socket ADDRESS = ('127.0.0.1', 36963) BUFFER_SIZE = 1024 def send_event(event): data = json.dumps(event).encode() with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock: sock.sendto(data, ADDRESS) def receive_event(): with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock: sock.settimeout(None) sock.bind(ADDRESS) while True: data, addr = sock.recvfrom(BUFFER_SIZE) event = json.loads(data.decode()) if not event: break yield event ARG_ALBUM = 'album' ARG_ARTIST = 'artist' ARG_ART = 'art' ARG_TITLE = 'title' KEY_ALBUM = 'ALBUM' KEY_ARTISTS = 'ARTISTS' KEY_COVERS = 'COVERS' KEY_ITEM_TYPE = 'ITEM_TYPE' KEY_NAME = 'NAME' KEY_PLAYER_EVENT = 'PLAYER_EVENT' KEY_SHOW_NAME = 'SHOW_NAME' PLAYER_EVENT_STOPPED = 'stopped' PLAYER_EVENT_TRACK_CHANGED = 'track_changed' ITEM_TYPE_EPISODE = 'Episode' ITEM_TYPE_TRACK = 'Track' def get_env_value(key): return os.environ.get(key, '').partition('\n')[0] if __name__ == '__main__': player_event = get_env_value(KEY_PLAYER_EVENT) event = {KEY_PLAYER_EVENT: player_event} if player_event == PLAYER_EVENT_STOPPED: send_event(event) elif player_event == PLAYER_EVENT_TRACK_CHANGED: event[ARG_ART] = get_env_value(KEY_COVERS) event[ARG_TITLE] = get_env_value(KEY_NAME) item_type = get_env_value(KEY_ITEM_TYPE) if item_type == ITEM_TYPE_EPISODE: event[ARG_ALBUM] = get_env_value(KEY_SHOW_NAME) elif item_type == ITEM_TYPE_TRACK: event[ARG_ALBUM] = get_env_value(KEY_ALBUM) event[ARG_ARTIST] = get_env_value(KEY_ARTISTS) send_event(event) ================================================ FILE: packages/addons/service/librespot/source/default.py ================================================ import os import sys import xbmcaddon import xbmcvfs def _set_home(): home = xbmcvfs.translatePath(xbmcaddon.Addon().getAddonInfo('profile')) os.makedirs(home, exist_ok=True) os.chdir(home) def _set_paths(): path = xbmcaddon.Addon().getAddonInfo('path') os.environ['PATH'] += os.pathsep + os.path.join(path, 'bin') os.environ['LD_LIBRARY_PATH'] += os.pathsep + os.path.join(path, 'lib') sys.path.append(os.path.join(path, 'bin')) sys.path.append(os.path.join(path, 'resources', 'lib')) if __name__ == '__main__': _set_home() _set_paths() import service service.Monitor().run() ================================================ FILE: packages/addons/service/librespot/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: librespot msgid "" msgstr "" msgctxt "#30100" msgid "Configuration" msgstr "" msgctxt "#30101" msgid "Name" msgstr "" msgctxt "#30102" msgid "Do not disturb Kodi" msgstr "" msgctxt "#30103" msgid "User options" msgstr "" msgctxt "#30104" msgid "Backend" msgstr "" msgctxt "#30105" msgid "ALSA device" msgstr "" ================================================ FILE: packages/addons/service/librespot/source/resources/lib/external_player.py ================================================ import player import service class Player(player.Player): def onLibrespotTrackChanged(self, art, artist, title, **kwargs): service.notification(heading=title, message=artist, icon=art) ================================================ FILE: packages/addons/service/librespot/source/resources/lib/internal_player.py ================================================ import xbmc import xbmcgui import player import service class Player(player.Player): def __init__(self, codec='pcm_sb16be', max_fanarts='10', **kwargs): super().__init__(**kwargs) self._max_fanarts = int(max_fanarts) self._list_item = xbmcgui.ListItem(path=self.librespot.file) self._list_item.getVideoInfoTag().addAudioStream(xbmc.AudioStreamDetail(2, codec)) self._music_info_tag = self._list_item.getMusicInfoTag() def onLibrespotTrackChanged(self, album='', art='', artist='', title=''): fanart = service.get_fanart(art, self._max_fanarts) if art else art self._list_item.setArt({'fanart': fanart, 'thumb': art}) self._music_info_tag.setAlbum(album) self._music_info_tag.setArtist(artist) self._music_info_tag.setTitle(title) if self.isPlaying() and self.getPlayingFile() == self.librespot.file: self.updateInfoTag(self._list_item) else: self.stop() # fixes unepxected behaviour of Player.play() self.librespot.start_sink() self.play(self.librespot.file, listitem=self._list_item) def onLibrespotStopped(self): self.librespot.stop_sink() if self.isPlaying() and self.getPlayingFile() == self.librespot.file: self.last_file = None self.stop() ================================================ FILE: packages/addons/service/librespot/source/resources/lib/librespot.py ================================================ import shlex import socket import subprocess import threading import external_player import internal_player import service class Librespot: def __init__(self, bitrate='320', device_type='tv', max_retries='5', name='Librespot@{}', options='', **kwargs): name = name.format(socket.gethostname()) self.command = [ 'librespot', '--bitrate', f'{bitrate}', '--device-type', f'{device_type}', '--disable-audio-cache', '--disable-credential-cache', '--name', f'{name}', '--onevent', 'onevent.py', '--quiet', ] + shlex.split(options) service.log(self.command) self.file = '' self._is_started = threading.Event() self._is_stopped = threading.Event() self._librespot = None self._max_retries = int(max_retries) self._retries = 0 self._thread = threading.Thread() def get_player(self, **kwargs): return (internal_player if self.file else external_player).Player(**kwargs) def restart(self): if self._thread.is_alive(): self._librespot.terminate() else: self.start() def start(self): if not self._thread.is_alive() and self._retries < self._max_retries: self._thread = threading.Thread(daemon=True, target=self._run) self._thread.start() self._is_started.wait(1) def stop(self): if self._thread.is_alive(): self._is_stopped.set() self._librespot.terminate() self._thread.join() def start_sink(self): pass def stop_sink(self): pass def _run(self): service.log('librespot thread started') self._is_started.clear() self._is_stopped.clear() while not self._is_stopped.is_set(): with subprocess.Popen(self.command, stderr=subprocess.PIPE, text=True) as self._librespot: self._is_started.set() for line in self._librespot.stderr: service.log(line.rstrip()) self.stop_sink() if self._librespot.returncode <= 0: self._retries = 0 else: self._retries += 1 if self._retries < self._max_retries: service.notification( f'librespot failed {self._retries}/{self._max_retries}') else: service.notification('librespot failed too many times') break service.log('librespot thread stopped') def __enter__(self): subprocess.Popen('[ -f /proc/sys/abi/cp15_barrier ] && echo 2 >/proc/sys/abi/cp15_barrier', shell=True) return self def __exit__(self, *args): self.stop() ================================================ FILE: packages/addons/service/librespot/source/resources/lib/librespot_alsa.py ================================================ import librespot class Librespot(librespot.Librespot): def __init__(self, alsa_device='hw:2,0', **kwargs): super().__init__(**kwargs) self.command += [ '--backend', 'alsa', '--device', f'{alsa_device}', ] ================================================ FILE: packages/addons/service/librespot/source/resources/lib/librespot_pulseaudio_rtp.py ================================================ import socket import subprocess import librespot import service class Librespot(librespot.Librespot): def __init__(self, codec='pcm_sb16be', pa_rtp_address='127.0.0.1', pa_rtp_device='librespot', pa_rtp_port='24642', **kwargs): service.log('pulseaudio backend started') sap_cmd = f'nc -l -u -s {pa_rtp_address} -p 9875'.split() self._sap_server = subprocess.Popen(sap_cmd, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) service.log(f'sap server started') if not pa_rtp_port: with socket.socket() as s: s.bind((pa_rtp_address, 0)) pa_rtp_port = s.getsockname()[1] modules = [ [ f'module-null-sink', f'sink_name={pa_rtp_device}', ], [ f'module-rtp-send', f'destination_ip={pa_rtp_address}', f'inhibit_auto_suspend=always', f'port={pa_rtp_port}', f'source={pa_rtp_device}.monitor', ], ] self._modules = [self._pactl('load-module', *m) for m in modules] self._sink_name = f'{pa_rtp_device}' self.stop_sink() service.log(f'pulseaudio modules loaded: {self._modules}') super().__init__(**kwargs) self.command += [ '--backend', 'pulseaudio', '--device', f'{pa_rtp_device}', ] self.file = f'rtp://{pa_rtp_address}:{pa_rtp_port}' def start_sink(self): self._pactl('suspend-sink', self._sink_name, '0') def stop_sink(self): self._pactl('suspend-sink', self._sink_name, '1') def _pactl(self, command, *args): out = subprocess.run(['pactl', command, *args], stdout=subprocess.PIPE, text=True ).stdout.rstrip() service.log(f'pactl {command} {args}: {out}') return out def __exit__(self, *args): super().__exit__(*args) for module in reversed(self._modules): if module: self._pactl('unload-module', module) service.log('pulseaudio backend stopped') if self._sap_server.poll() is None: self._sap_server.terminate() self._sap_server.wait() service.log('sap server stopped') ================================================ FILE: packages/addons/service/librespot/source/resources/lib/player.py ================================================ import threading import xbmc import onevent import service class Player(xbmc.Player): def __init__(self, dnd_kodi='false', librespot=None, **kwargs): super().__init__() self._dnd_kodi = (dnd_kodi == 'true') self._thread = threading.Thread(daemon=True, target=self._run) self._thread.start() self.last_file = None self.librespot = librespot if not (self._dnd_kodi and self.isPlaying()): self.librespot.start() def onAVStarted(self): file = self.getPlayingFile() if file != self.librespot.file: if self._dnd_kodi: self.librespot.stop() elif self.last_file == self.librespot.file: self.librespot.restart() self.last_file = file def onLibrespotStopped(self): pass def onLibrespotTrackChanged(self, album='', art='', artist='', title=''): pass def onPlayBackEnded(self): if self.last_file == self.librespot.file: self.librespot.restart() else: self.librespot.start() self.last_file = None def onPlayBackError(self): self.onPlayBackEnded() def onPlayBackStopped(self): self.onPlayBackEnded() # fixes unexpected behaviour of Player.stop() def stop(self): xbmc.executebuiltin('PlayerControl(Stop)') def _run(self): service.log('onevent dispatcher started') for event in onevent.receive_event(): try: player_event = event.pop(onevent.KEY_PLAYER_EVENT) if player_event == onevent.PLAYER_EVENT_STOPPED: self.onLibrespotStopped() elif player_event == onevent.PLAYER_EVENT_TRACK_CHANGED: self.onLibrespotTrackChanged(**event) except Exception as e: service.log(e, True) service.log('onevent dispatcher stopped') def __enter__(self): return self def __exit__(self, *args): onevent.send_event({}) self._thread.join() self.onLibrespotStopped() ================================================ FILE: packages/addons/service/librespot/source/resources/lib/service.py ================================================ import PIL.Image import urllib.request import tempfile import os import xbmc import xbmcaddon import xbmcgui _ADDON = xbmcaddon.Addon() _ICON = _ADDON.getAddonInfo('icon') _NAME = _ADDON.getAddonInfo('name') _DIALOG = xbmcgui.Dialog() def log(message, show=False): xbmc.log(f'{_NAME}: {message}', xbmc.LOGINFO if show else xbmc.LOGDEBUG) def notification(message='', sound=False, heading=_NAME, icon=_ICON, time=5000): _DIALOG.notification(heading, message, icon, time, sound) _FANART_DIR = os.path.join(tempfile.gettempdir(), 'librespot.fanart') def get_fanart(url, max_fanarts): name = os.path.basename(url) target = os.path.join(_FANART_DIR, f'{name}_16x9') if not os.path.exists(target): if not os.path.exists(_FANART_DIR): os.makedirs(_FANART_DIR) files = os.listdir(_FANART_DIR) files = [os.path.join(_FANART_DIR, file) for file in files if os.path.isfile( os.path.join(_FANART_DIR, file))] files.sort(key=os.path.getmtime) for file in files[:-max_fanarts]: os.remove(file) source = os.path.join(_FANART_DIR, f'{name}_9x9') urllib.request.urlretrieve(url, source) image = PIL.Image.open(source) width, height = image.size new_width = int(height * 16 / 9) delta_w = new_width - width new_image = PIL.Image.new('RGB', (new_width, height), (0, 0, 0)) new_image.paste(image, (delta_w // 2, 0)) new_image.save(target, 'JPEG', optimize=True) os.remove(source) return target _SETTINGS = { 'alsa_device': 'hw:2,0', 'backend': 'pulseaudio_rtp', 'dnd_kodi': 'false', 'name': f'{_NAME}@{{}}', 'options': '', } def _get_setting(setting, default): value = _ADDON.getSetting(setting) return value if value else default def _get_librespot(): while True: settings = {k: _get_setting(k, v) for k, v in _SETTINGS.items()} backend = settings.pop('backend') librespot_class = __import__(f'librespot_{backend}').Librespot with librespot_class(**settings) as librespot: with librespot.get_player(librespot=librespot, **settings) as player: yield class Monitor(xbmc.Monitor): def __init__(self): self._get_librespot = _get_librespot() self.onSettingsChanged() def onSettingsChanged(self): log('settings changed') next(self._get_librespot) def run(self): self.waitForAbort() log('abort requested') self._get_librespot.close() ================================================ FILE: packages/addons/service/librespot/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/locale/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/locale/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="locale" PKG_REV="0" PKG_ARCH="any" PKG_DEPENDS_TARGET="toolchain glibc" PKG_SECTION="service" PKG_SHORTDESC="Locale: allows users to set a custom locale to override the POSIX default" PKG_LONGDESC="Locale (${PKG_REV}) allows users to set a custom locale in the OS to override the POSIX default" PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Locale" PKG_ADDON_TYPE="xbmc.service" addon() { mkdir -p "${ADDON_BUILD}/${PKG_ADDON_ID}/bin" cp -PR "$(get_install_dir glibc)/.noinstall/localedef" \ "${ADDON_BUILD}/${PKG_ADDON_ID}/bin" mkdir -p "${ADDON_BUILD}/${PKG_ADDON_ID}/i18n" cp -PR "$(get_install_dir glibc)/.noinstall/charmaps" \ "$(get_install_dir glibc)/.noinstall/locales" \ "${ADDON_BUILD}/${PKG_ADDON_ID}/i18n" mkdir -p "${ADDON_BUILD}/${PKG_ADDON_ID}/locpath" cp -PR ${PKG_DIR}/resources ${ADDON_BUILD}/${PKG_ADDON_ID} locales="" for p in "${ADDON_BUILD}/${PKG_ADDON_ID}/i18n/locales"/*; do l="$(basename ${p})" if [ "${l}" = "POSIX" ]; then continue fi locales+="$(echo -e '\\\n ')" done sed -e "s|@LOCALES@|${locales}|" \ -i ${ADDON_BUILD}/${PKG_ADDON_ID}/resources/settings.xml } ================================================ FILE: packages/addons/service/locale/resources/settings.xml ================================================
0 UTF-8 false 30001 0 en_GB @LOCALES@ 30002
================================================ FILE: packages/addons/service/locale/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) import os import subprocess import xbmc import xbmcaddon import xbmcgui class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.setLocale() def onSettingsChanged(self): self.setLocale() def setLocale(self): addon = xbmcaddon.Addon() charmap = addon.getSetting('charmap') locale = addon.getSetting('locale') lang = locale + '.' + charmap path = addon.getAddonInfo('path') i18npath = os.path.join(path, 'i18n') locpath = os.path.join(path, 'locpath') localepath = os.path.join(locpath, lang) profiled = os.path.join(path, 'profile.d') profile = os.path.join(profiled, '10-locale.profile') strings = addon.getLocalizedString if os.path.isdir(locpath) == False: os.makedirs(locpath) if os.path.isdir(localepath) == False: os.environ['I18NPATH'] = i18npath rc = subprocess.run([os.path.join(path, 'bin/localedef'), '-v', '-f', charmap, '-i', locale, localepath], capture_output=True, stdin=subprocess.DEVNULL) if rc.returncode not in [0, 1]: xbmc.log(repr(rc), xbmc.LOGERROR) try: os.rmdir(localepath) except OSError as e: pass if os.path.isfile(profile): os.unlink(profile) xbmcgui.Dialog().ok('Locale', strings(30004).format(lang)) return if os.path.isdir(profiled) == False: os.makedirs(profiled) file = open(profile, 'w') file.write('export LANG="' + lang + '"\n') file.write('export LOCPATH="' + locpath + '"\n') file.close() current = os.environ.get('LANG', '') if lang != current: if xbmcgui.Dialog().yesno('Locale', strings(30003).format(lang) ) == True: xbmc.restart() if __name__ == '__main__': Monitor().waitForAbort() ================================================ FILE: packages/addons/service/locale/source/resources/language/resource.language.en_gb/strings.po ================================================ # Kodi Media Center language file msgid "" msgstr "" msgctxt "#30000" msgid "Configuration" msgstr "" msgctxt "#30001" msgid "Charmap" msgstr "" msgctxt "#30002" msgid "Locale" msgstr "" msgctxt "#30003" msgid "Locale changed to {}. Please reboot to apply globally." msgstr "" msgctxt "#30004" msgid "Creating locale {} failed. Aborting." msgstr "" ================================================ FILE: packages/addons/service/locale/source/settings-default.xml ================================================ UTF-8 Date: Mon, 25 Nov 2019 23:54:22 +0000 Subject: [PATCH] disable PLUGIN_AUTH_PAM as we aren't able to build it --- cmake/build_configurations/mysql_release.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/build_configurations/mysql_release.cmake b/cmake/build_configurations/mysql_release.cmake index 37a6c45..e2a4ba8 100644 --- a/cmake/build_configurations/mysql_release.cmake +++ b/cmake/build_configurations/mysql_release.cmake @@ -147,7 +147,7 @@ ENDIF() IF(UNIX) SET(WITH_EXTRA_CHARSETS all CACHE STRING "") - SET(PLUGIN_AUTH_PAM YES CACHE BOOL "") + SET(PLUGIN_AUTH_PAM NO CACHE BOOL "") IF(CMAKE_SYSTEM_NAME STREQUAL "Linux") FIND_PACKAGE(URING) -- 2.7.4 ================================================ FILE: packages/addons/service/mariadb/source/bin/mariadb.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) _create_bin_link() { [ ! -L ${ADDON_DIR}/bin/${2} ] && ln -sfn ${1} ${ADDON_DIR}/bin/${2} } . /etc/profile oe_setup_addon service.mariadb # create dir for socket and pid mkdir -p /run/mysqld # exit if already running PID=$(ps aux | awk '/\/bin\/mariadbd/ {print $1; exit 0}') if [ -n "${PID}" ]; then echo "MariaDB server is already running" exit 0 fi # create symbolic links _create_bin_link mariadb mysql _create_bin_link mariadb-admin mysqladmin _create_bin_link mariadb-dump mysqldump _create_bin_link mariadb-secure-installation mysql_secure_installation _create_bin_link mariadb-upgrade mysql_upgrade _create_bin_link mariadb-install-db mysql_install_db # copy config file if [ ! -f ${ADDON_HOME}/my.cnf ]; then cp ${ADDON_DIR}/config/my.cnf ${ADDON_HOME} fi # install database if [ ! -d "${ADDON_HOME}/data/mysql" ]; then mkdir -p ${ADDON_HOME}/data echo "Installing database" ${ADDON_DIR}/bin/mariadb-install-db --basedir=${ADDON_DIR} --datadir=${ADDON_HOME}/data fi # check for first run and generate passwords if grep -q "@MYSQL_ROOT_PASS@" ${ADDON_HOME}/settings.xml; then MYSQL_ROOT_PASS="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8)" MYSQL_KODI_PASS="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8)" sed -e "s|@MYSQL_ROOT_PASS@|${MYSQL_ROOT_PASS}|g" \ -e "s|@MYSQL_KODI_PASS@|${MYSQL_KODI_PASS}|g" \ -i ${ADDON_HOME}/settings.xml fi # init script to create user kodi and change passwords init_file="" if [[ ! -f ${ADDON_HOME}/set_mysql_passwords.sql ]] || [[ ${ADDON_HOME}/settings.xml -nt ${ADDON_HOME}/set_mysql_passwords.sql ]]; then cat << SQL_DATA > ${ADDON_HOME}/set_mysql_passwords.sql SET PASSWORD FOR 'root'@'localhost'=PASSWORD('${MYSQL_ROOT_PASS}'); CREATE USER IF NOT EXISTS 'kodi'; CREATE USER IF NOT EXISTS 'kodi'@'localhost'; SET PASSWORD FOR 'kodi'=PASSWORD('${MYSQL_KODI_PASS}'); SET PASSWORD FOR 'kodi'@'localhost'=PASSWORD('${MYSQL_KODI_PASS}'); GRANT ALL ON *.* TO 'kodi'; GRANT ALL ON *.* TO 'kodi'@'localhost'; flush privileges; SQL_DATA init_file="--init-file=${ADDON_HOME}/set_mysql_passwords.sql" fi echo "Starting mariadbd" MYSQL_HOME="${ADDON_HOME}" exec ${ADDON_DIR}/bin/mariadbd ${init_file} & ================================================ FILE: packages/addons/service/mariadb/source/bin/mariadb.stop ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) kill $(cat /run/mysqld/mysqld.pid) ================================================ FILE: packages/addons/service/mariadb/source/config/my.cnf ================================================ # MariaDB database server configuration file. # # You can copy this file to one of: # - "/etc/mysql/my.cnf" to set global options, # - "~/.my.cnf" to set user-specific options. # # One can use all long options that the program supports. # Run program with --help to get a list of available options and with # --print-defaults to see which it would actually understand and use. # # For explanations see # http://dev.mysql.com/doc/mysql/en/server-system-variables.html # This will be passed to all mysql clients # It has been reported that passwords should be enclosed with ticks/quotes # escpecially if they contain "#" chars... # Remember to edit /etc/mysql/debian.cnf when changing the socket location. [client] port = 3306 socket = /run/mysqld/mysqld.sock # Here is entries for some specific programs # The following values assume you have at least 32M ram # This was formally known as [safe_mysqld]. Both versions are currently parsed. [mysqld_safe] socket = /run/mysqld/mysqld.sock nice = 0 [mysqld] # # * Basic Settings # user = root pid-file = /run/mysqld/mysqld.pid socket = /run/mysqld/mysqld.sock port = 3306 basedir = /storage/.kodi/addons/service.mariadb datadir = /storage/.kodi/userdata/addon_data/service.mariadb/data log-error = /storage/.kodi/userdata/addon_data/service.mariadb/mysqld.log tmpdir = /tmp #lc_messages_dir = /usr/share/mysql lc_messages = en_US skip-external-locking # Kodi needs more for library (256K should probably be enough) #thread_stack = 128K thread_stack = 384K # # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. #bind-address = 127.0.0.1 # # * Fine Tuning # max_connections = 100 connect_timeout = 5 wait_timeout = 600 max_allowed_packet = 16M thread_cache_size = 128 sort_buffer_size = 4M bulk_insert_buffer_size = 16M tmp_table_size = 32M max_heap_table_size = 32M # # * MyISAM # # This replaces the startup script and checks MyISAM tables if needed # the first time they are touched. On error, make copy and try a repair. myisam_recover_options = BACKUP key_buffer_size = 128M #open-files-limit = 2000 #table_open_cache = 400 table_open_cache = 1000 myisam_sort_buffer_size = 512M concurrent_insert = 2 read_buffer_size = 2M read_rnd_buffer_size = 1M # # * Query Cache Configuration # # Cache only tiny result sets, so we can fit more in the query cache. query_cache_limit = 128K query_cache_size = 64M # for more write intensive setups, set to DEMAND or OFF #query_cache_type = DEMAND # # * Logging and Replication # # Both location gets rotated by the cronjob. # Be aware that this log type is a performance killer. # As of 5.1 you can enable the log at runtime! #general_log_file = /storage/.kodi/userdata/addon_data/service.mariadb/mysql.log #general_log = 1 # # Error logging goes to syslog due to /etc/mysql/conf.d/mysqld_safe_syslog.cnf. # # we do want to know about network errors and such log_warnings = 2 # # Enable the slow query log to see queries with especially long duration #slow_query_log[={0|1}] slow_query_log_file = /storage/.kodi/userdata/addon_data/mariadb-slow.log long_query_time = 10 #log_slow_rate_limit = 1000 log_slow_verbosity = query_plan #log-queries-not-using-indexes #log_slow_admin_statements # # The following can be used as easy to replay backup logs or for replication. # note: if you are setting up a replication slave, see README.Debian about # other settings you may need to change. #server-id = 1 #report_host = master1 #auto_increment_increment = 2 #auto_increment_offset = 1 # disable binary log #log_bin = /storage/.kodi/userdata/addon_data/service.mariadb/mariadb-bin #log_bin_index = /storage/.kodi/userdata/addon_data/service.mariadb/mariadb-bin.index # not fab for performance, but safer #sync_binlog = 1 expire_logs_days = 10 max_binlog_size = 100M # slaves #relay_log = /storage/.kodi/userdata/addon_data/service.mariadb/relay-bin #relay_log_index = /storage/.kodi/userdata/addon_data/service.mariadb/relay-bin.index #relay_log_info_file = /storage/.kodi/userdata/addon_data/service.mariadb/relay-bin.info #log_slave_updates #read_only # # If applications support it, this stricter sql_mode prevents some # mistakes like inserting invalid dates etc. #sql_mode = NO_ENGINE_SUBSTITUTION,TRADITIONAL # # * InnoDB # # InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/. # Read the manual for more InnoDB related options. There are many! default_storage_engine = InnoDB # you can't just change log file size, requires special procedure #innodb_log_file_size = 50M # optimizations https://forum.kodi.tv/showthread.php?tid=329046&pid=2708799 #pid2708799 # https://discourse.coreelec.org/t/kodi-and-mariadb-part-2/513 # innodb_buffer_pool_size=2G # MariaDB recommends using 80% of your available memory but the default 1G might be enough. Always set to multiples of 1G. # innodb_buffer_pool_instances=2 # When innodb_buffer_pool_size is > 1G, MariaDB will split the pool in instances. They should be even dividers of 1G. # innodb_file_format=Barracuda # Gone in 10.3 / This is an optimized storage engine not available in MySQL # innodb_log_block_size=4096 # Gone in 10.3 / Default is 512, when using an SSD or 4k drives, block size should be 4096 # innodb_adaptive_hash_index=OFF # For Kodi no benefit is gained from additional indexes. This should only be used with large databases. # character-set-server=utf8 # I really hope you all used this in MySQL already. This avoids potential pitfalls with text in exotic codepages. # key-buffer-size=64k # When not using MyISAM as storage engine, this buffer can be reduced to a minimum # skip-name-resolve # Avoids name resolving in the local network, thus reducing overhead. That also means that all connections are done by IP only. # optimizer_search_depth=1 # Here we are, this is winner of the year. innodb_buffer_pool_size = 256M innodb_log_buffer_size = 8M innodb_file_per_table = 1 innodb_open_files = 400 innodb_io_capacity = 400 innodb_flush_method = O_DIRECT character-set-server=utf8 # This avoids potential pitfalls with text in exotic codepages. #skip-name-resolve # Avoids name resolving in the local network, thus reducing overhead. That also means that all connections are done by IP only. # well, not really according to use cases :( #optimizer_search_depth=0 # Here we are, this is winner of the year. # # * Security Features # # Read the manual, too, if you want chroot! # chroot = /var/lib/mysql/ # # For generating SSL certificates I recommend the OpenSSL GUI "tinyca". # # ssl-ca=/etc/mysql/cacert.pem # ssl-cert=/etc/mysql/server-cert.pem # ssl-key=/etc/mysql/server-key.pem # # * Galera-related settings # [galera] # Mandatory settings #wsrep_on=ON #wsrep_provider= #wsrep_cluster_address= #binlog_format=row #default_storage_engine=InnoDB #innodb_autoinc_lock_mode=2 # # Allow server to accept connections on all interfaces. # #bind-address=0.0.0.0 # # Optional setting #wsrep_slave_threads=1 #innodb_flush_log_at_trx_commit=0 [mysqldump] quick quote-names max_allowed_packet = 16M [mysql] #no-auto-rehash # faster start of mysql but no tab completion [isamchk] key_buffer = 16M ================================================ FILE: packages/addons/service/mariadb/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == "__main__": Monitor().waitForAbort() ================================================ FILE: packages/addons/service/mariadb/source/profile.d/99-mysql-histfile.profile ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) export MYSQL_HISTFILE=/storage/.kodi/userdata/addon_data/service.mariadb/mysql_history ================================================ FILE: packages/addons/service/mariadb/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: mariadb # Addon id: service.mariadb # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "Accounts" msgstr "" msgctxt "#30001" msgid "Passwords" msgstr "" msgctxt "#30002" msgid "root" msgstr "" msgctxt "#30003" msgid "kodi" msgstr "" ================================================ FILE: packages/addons/service/mariadb/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/mariadb/source/settings-default.xml ================================================ @MYSQL_ROOT_PASS@ @MYSQL_KODI_PASS@ ================================================ FILE: packages/addons/service/mariadb/source/system.d/service.mariadb.service ================================================ [Unit] Description=MariaDB server After=graphical.target network-online.service Before=kodi.service [Service] Type=forking PIDFile=/run/mysqld/mysqld.pid ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.mariadb/bin/mariadb.start" ExecStop=/bin/sh -c "exec sh /storage/.kodi/addons/service.mariadb/bin/mariadb.stop" TimeoutStartSec=60 TimeoutStopSec=60 Restart=always RestartSec=10 StartLimitInterval=0 [Install] Alias=mariadb.service WantedBy=kodi.service ================================================ FILE: packages/addons/service/minidlna/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/minidlna/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="minidlna" PKG_VERSION="1.3.2" PKG_SHA256="222ce45a1a60c3ce3de17527955d38e5ff7a4592d61db39577e6bf88e0ae1cb0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="BSD-3c/GPLv2" PKG_SITE="https://sourceforge.net/projects/minidlna/" PKG_URL="https://downloads.sourceforge.net/project/minidlna/minidlna/${PKG_VERSION}/minidlna-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ffmpeg flac libexif libiconv libid3tag libjpeg-turbo libogg libvorbis sqlite" PKG_SECTION="service" PKG_SHORTDESC="MiniDLNA (ReadyMedia): a fully compliant DLNA/UPnP-AV server" PKG_LONGDESC="MiniDLNA (${PKG_VERSION_DATE}) (ReadyMedia) is a media server, with the aim of being fully compliant with DLNA/UPnP-AV clients." PKG_TOOLCHAIN="autotools" PKG_IS_ADDON="yes" PKG_ADDON_NAME="MiniDLNA (ReadyMedia)" PKG_ADDON_TYPE="xbmc.service" PKG_CONFIGURE_OPTS_TARGET="--disable-static \ --disable-nls \ --without-libiconv-prefix \ --without-libintl-prefix \ --with-os-name="${DISTRONAME}" \ --with-db-path="/storage/.kodi/userdata/addon_data/service.minidlna/db" \ --with-os-url="https://libreelec.tv"" pre_configure_target() { export LDFLAGS="${LDFLAGS} -L$(get_install_dir ffmpeg)/usr/lib" export LIBS="${LIBS} -lid3tag -lFLAC -logg -lz -lpthread -ldl -lm" } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P ${PKG_INSTALL}/usr/sbin/minidlnad ${ADDON_BUILD}/${PKG_ADDON_ID}/bin mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/lib cp -p $(get_install_dir libexif)/usr/lib/libexif.so.12 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib } ================================================ FILE: packages/addons/service/minidlna/patches/minidlna-01-fix-config.patch ================================================ disabling editing of the configfiles at buildtime --- a/Makefile.am +++ b/Makefile.am @@ -73,19 +73,6 @@ testupnpdescgen_LDADD = \ @LIBEXIF_LIBS@ \ -lFLAC $(flacogglibs) $(vorbislibs) $(avahilibs) -SUFFIXES = .tmpl . - -.tmpl: - sed -e s@:SBINDIR:@${sbindir}@ <$< >$@ - -GENERATED_FILES = \ - linux/minidlna.init.d.script - -TEMPLATES = \ - linux/minidlna.init.d.script.tmpl - -CLEANFILES = $(GENERATED_FILES) - ACLOCAL_AMFLAGS = -I m4 EXTRA_DIST = m4/ChangeLog $(TEMPLATES) ================================================ FILE: packages/addons/service/minidlna/source/bin/minidlna.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.minidlna if [ ! -f "$ADDON_HOME/config/minidlna.conf" ]; then mkdir -p $ADDON_HOME/config cp $ADDON_DIR/config/minidlna.conf $ADDON_HOME/config fi if [ ! -d "$ADDON_HOME/db" ]; then mkdir -p $ADDON_HOME/db fi chmod a+x $ADDON_DIR/bin/* exec $ADDON_DIR/bin/minidlnad -S -f $ADDON_HOME/config/minidlna.conf -p $minidlna_port &>$ADDON_HOME/service.log ================================================ FILE: packages/addons/service/minidlna/source/config/minidlna.conf ================================================ # set this to the directory you want scanned # + "A" for audio (eg. media_dir=A,/storage/music) # + "V" for video (eg. media_dir=V,/storage/videos) # + "P" for images (eg. media_dir=P,/storage/pictures) # + "PV" for pictures and video (eg. media_dir=PV,/storage/digital_camera) media_dir=V,/storage/videos media_dir=V,/storage/tvshows media_dir=P,/storage/pictures media_dir=A,/storage/music # set this if you want to customize the name that shows up on your clients friendly_name=DLNA Server # network interfaces to serve, comma delimited (8 interfaces max) #network_interface=eth0 # set this to merge all media_dir base contents into the root container # note: the default is no #merge_media_dirs=no # set this to change the verbosity of the information that is logged # each section can use a different level: off, fatal, error, warn, info, or debug #log_level=general,artwork,database,inotify,scanner,metadata,http,ssdp,tivo=warn # this should be a list of file names to check for when searching for album art # note: names should be delimited with a forward slash ("/") album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg # set this to no to disable inotify monitoring to automatically discover new files # note: the default is yes inotify=yes # set this to yes to enable support for streaming .jpg and .mp3 files to a TiVo supporting HMO enable_tivo=no # set this to beacon to use legacy broadcast discovery method # defauts to bonjour if avahi is available tivo_discovery=bonjour # set this to strictly adhere to DLNA standards. # * This will allow server-side downscaling of very large JPEG images, # which may hurt JPEG serving performance on (at least) Sony DLNA products. strict_dlna=no # default presentation url is http address on port 80 #presentation_url=http://www.mylan/index.php # notify interval in seconds. default is 895 seconds. notify_interval=1800 # serial and model number the daemon will report to clients # in its XML description serial=12345678 model_number=1 # use different container as root of the tree # possible values: # + "." - use standard container (this is the default) # + "B" - "Browse Directory" # + "M" - "Music" # + "V" - "Video" # + "P" - "Pictures" # + Or, you can specify the ObjectID of your desired root container (eg. 1$F for Music/Playlists) # if you specify "B" and client device is audio-only then "Music/Folders" will be used as root #root_container=. # always force SortCriteria to this value, regardless of the SortCriteria passed by the client # note: you can prepend the sort criteria with "!" to alter the titles of the objects so that they # will be alphanumerically sorted in the order you specify here, to work around clients that do their # own alphanumeric sorting. #force_sort_criteria=+upnp:class,+upnp:originalTrackNumber,+dc:title # maximum number of simultaneous connections # note: many clients open several simultaneous connections while streaming #max_connections=50 # enable subtitle support by default on unknown clients. # note: the default is yes #enable_subtitles=yes ================================================ FILE: packages/addons/service/minidlna/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == "__main__": Monitor().waitForAbort() ================================================ FILE: packages/addons/service/minidlna/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: minidlna # Addon id: service.minidlna # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "Configuration" msgstr "" msgctxt "#30001" msgid "Port" msgstr "" ================================================ FILE: packages/addons/service/minidlna/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/minidlna/source/settings-default.xml ================================================ ================================================ FILE: packages/addons/service/minidlna/source/sleep.d/minidlna.power ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.minidlna SERVICE="service.minidlna" if [ "$RESTART_ON_RESUME" == "true" ] ; then case "$1" in pre) if systemctl is-active "$SERVICE" &>/dev/null ; then systemctl stop "$SERVICE" fi ;; post) if systemctl is-enabled "$SERVICE" &>/dev/null ; then systemctl start "$SERVICE" fi ;; esac fi ================================================ FILE: packages/addons/service/minidlna/source/system.d/service.minidlna.service ================================================ [Unit] Description=minidlna After=graphical.target [Service] ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.minidlna/bin/minidlna.start" TimeoutStopSec=1 Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/minisatip/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/minisatip/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="minisatip" PKG_VERSION="1.2.84" PKG_SHA256="d5a06b0c371e1f5ccba6fcb3d76abf348e93e14ab4d7317bb701ae023c085e4b" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/catalinii/minisatip" PKG_URL="https://github.com/catalinii/minisatip/archive/refs/tags/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libdvbcsa libxml2 openssl" PKG_SECTION="service" PKG_SHORTDESC="minisatip: a Sat>IP streaming server for Linux" PKG_LONGDESC="minisatip(${PKG_VERSION_NUMBER}): is a Sat>IP streaming server for Linux supporting DVB-C, DVB-S/S2, DVB-T/T2, ATSC and ISDB-T" PKG_BUILD_FLAGS="-sysroot" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Minisatip" PKG_ADDON_TYPE="xbmc.service" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-netcv \ --enable-dvbca \ --enable-dvbaes \ --enable-dvbcsa \ --with-xml2=$(get_install_dir libxml2)/usr/include/libxml2" pre_configure_target() { cd ${PKG_BUILD} rm -rf .${TARGET_NAME} } makeinstall_target() { : } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P ${PKG_BUILD}/minisatip ${ADDON_BUILD}/${PKG_ADDON_ID}/bin mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/webif cp -PR ${PKG_BUILD}/html/* ${ADDON_BUILD}/${PKG_ADDON_ID}/webif } ================================================ FILE: packages/addons/service/minisatip/source/bin/minisatip.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.minisatip chmod a+x $ADDON_DIR/bin/* # wait for dvb card if [ "$WAIT_FOR_FEINIT" = "true" ]; then while [ true ] ; do if [ -e /dev/dvb/adapter$((NUM_ADAPTERS-1))/frontend0 ]; then break fi sleep 1 done fi # sleep for x seconds if [ "$WORKAROUND_SLEEP" = "true" ]; then sleep $WORKAROUND_SLEEP_TIME fi ## options # simulate x adapters if [ "$MINISATIP_TESTMODE" = "true" ]; then MINISATIP_ARG_TEST="-a 2:2:2" fi # debug log if [ "$MINISATIP_DEBUG" = "true" ]; then MINISATIP_ARG="-l http" fi # RTSP over TCP instead UDP if [ "$MINISATIP_SATIP_TCP" = "true" ]; then MINISATIP_ARG="$MINISATIP_ARG -O" fi # clean the PSI from all CA information if [ "$MINISATIP_CLEANPSI" = "true" ]; then MINISATIP_ARG="$MINISATIP_ARG -t" fi # port for listening for rtsp requests if [ "$MINISATIP_RTSP_PORT" != "554" ]; then MINISATIP_ARG="$MINISATIP_ARG -y $MINISATIP_RTSP_PORT" fi # specify the hostname and port for the dvbapi server (oscam) if [ "$MINISATIP_CLEANPSI" = "true" ]; then MINISATIP_ARG="$MINISATIP_ARG -o ${MINISATIP_DVBAPI_IP}:${MINISATIP_DVBAPI_PORT}" fi if [ "$MINISATIP_STARTUP" = "true" ]; then echo "Minisatip was started with this settings: ${MINISATIP_STARTUP_ARGS}" > $ADDON_LOG_FILE exec $ADDON_DIR/bin/minisatip -f ${MINISATIP_ARG_TEST} -x ${MINISATIP_WEBPORT} -R /storage/.kodi/addons/service.minisatip/webif ${MINISATIP_STARTUP_ARGS} >> $ADDON_LOG_FILE else echo "Minisatip was started with this settings: ${MINISATIP_ARG}" > $ADDON_LOG_FILE $ADDON_DIR/bin/minisatip -f ${MINISATIP_ARG_TEST} -x ${MINISATIP_WEBPORT} -R /storage/.kodi/addons/service.minisatip/webif ${MINISATIP_ARG} >> $ADDON_LOG_FILE fi ================================================ FILE: packages/addons/service/minisatip/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == "__main__": Monitor().waitForAbort() ================================================ FILE: packages/addons/service/minisatip/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: minisatip # Addon id: service.minisatip # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "Hardware" msgstr "" msgctxt "#30001" msgid "Wait for frontend initialization" msgstr "" msgctxt "#30002" msgid "Number of adapters to wait for" msgstr "" msgctxt "#30003" msgid "Unload DVB modules before suspend" msgstr "" msgctxt "#30004" msgid "Delay the start of Minisatip" msgstr "" msgctxt "#30005" msgid "time (s)" msgstr "" msgctxt "#30006" msgid "Minisatip" msgstr "" msgctxt "#30007" msgid "Use RTSP over TCP for data transport" msgstr "" msgctxt "#30008" msgid "Clean the PSI from all CA information" msgstr "" msgctxt "#30009" msgid "Specify the hostname for the dvbapi server (OScam)" msgstr "" msgctxt "#30010" msgid "Specify the port for the dvbapi server (OScam)" msgstr "" msgctxt "#30011" msgid "Port for listening for RTSP requests" msgstr "" msgctxt "#30012" msgid "Webui Port" msgstr "" msgctxt "#30013" msgid "Debugging" msgstr "" msgctxt "#30014" msgid "Debug Log" msgstr "" msgctxt "#30015" msgid "Simulate DVB adapters" msgstr "" msgctxt "#30016" msgid "Advanced Options" msgstr "" msgctxt "#30017" msgid "Manually enter startup command-line" msgstr "" msgctxt "#30018" msgid "Command-line" msgstr "" ================================================ FILE: packages/addons/service/minisatip/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/minisatip/source/settings-default.xml ================================================ false false 127.0.0.1 9000 554 false false false 9999 1 false false 1 ================================================ FILE: packages/addons/service/minisatip/source/sleep.d/minisatip.power ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.minisatip SERVICE="service.minisatip" if [ "$RESTART_ON_RESUME" == "true" ] ; then case "$1" in pre) if systemctl is-active "$SERVICE" &>/dev/null ; then systemctl stop "$SERVICE" fi ;; post) if systemctl is-enabled "$SERVICE" &>/dev/null ; then systemctl start "$SERVICE" fi ;; esac fi ================================================ FILE: packages/addons/service/minisatip/source/system.d/service.minisatip.service ================================================ [Unit] Description=minisatip After=network-online.service [Service] ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.minisatip/bin/minisatip.start" TimeoutStopSec=2 Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/mpd/changelog.txt ================================================ 1 - mpd: update to 0.23.12 ================================================ FILE: packages/addons/service/mpd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mpd" PKG_VERSION="0.23.12" PKG_SHA256="b7fca62284ecc25a681ea6a07abc49200af5353be42cb5a31e3173be9d8702e7" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://www.musicpd.org" PKG_URL="http://www.musicpd.org/download/mpd/$(get_pkg_version_maj_min)/mpd-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain alsa-lib avahi boost curl faad2 ffmpeg flac glib lame libcdio libfmt \ libgcrypt libiconv libid3tag libmad libmpdclient libopenmpt libsamplerate \ libvorbis libnfs libogg mpd-mpc opus pulseaudio samba wavpack yajl" PKG_SECTION="service.multimedia" PKG_SHORTDESC="Music Player Daemon (MPD): a free and open Music Player Server" PKG_LONGDESC="Music Player Daemon (${PKG_VERSION}) is a flexible and powerful server-side application for playing music" PKG_BUILD_FLAGS="-sysroot" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Music Player Daemon (MPD)" PKG_ADDON_TYPE="xbmc.service" PKG_MESON_OPTS_TARGET="-Dadplug=disabled \ -Dalsa=enabled \ -Dao=disabled \ -Daudiofile=disabled \ -Dbzip2=enabled \ -Dcdio_paranoia=disabled \ -Dchromaprint=disabled \ -Dcue=true \ -Dcurl=enabled \ -Ddatabase=true \ -Ddocumentation=disabled \ -Ddsd=true \ -Dexpat=enabled \ -Dfaad=enabled \ -Dffmpeg=enabled \ -Dfifo=true \ -Dflac=enabled \ -Dfluidsynth=disabled \ -Dfuzzer=false \ -Dgme=disabled \ -Dhttpd=true \ -Dhtml_manual=false \ -Diconv=disabled \ -Dicu=disabled \ -Did3tag=enabled \ -Dipv6=enabled \ -Diso9660=enabled \ -Djack=disabled \ -Dlame=enabled \ -Dlibmpdclient=enabled \ -Dlibsamplerate=enabled \ -Dlocal_socket=false \ -Dmad=enabled \ -Dmanpages=false \ -Dmikmod=disabled \ -Dmms=disabled \ -Dmodplug=disabled \ -Dmpcdec=disabled \ -Dmpg123=disabled \ -Dneighbor=false \ -Dnfs=enabled \ -Dopenal=disabled \ -Dopus=enabled \ -Doss=disabled \ -Dpipe=true \ -Dpulse=enabled \ -Dqobuz=enabled \ -Drecorder=false \ -Dshine=disabled \ -Dshout=disabled \ -Dsidplay=disabled \ -Dsmbclient=enabled \ -Dsndfile=enabled \ -Dsndio=disabled \ -Dsolaris_output=disabled \ -Dsoundcloud=enabled \ -Dsoxr=enabled \ -Dsqlite=enabled \ -Dsyslog=disabled \ -Dsystemd=disabled \ -Dtest=false \ -Dtwolame=disabled \ -Dupnp=disabled \ -Dvorbis=enabled \ -Dvorbisenc=enabled \ -Dwave_encoder=true \ -Dwavpack=enabled \ -Dwebdav=enabled \ -Dwildmidi=disabled \ -Dyajl=enabled \ -Dzeroconf=avahi \ -Dzlib=enabled \ -Dzzip=disabled" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P ${PKG_INSTALL}/usr/bin/mpd ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # copy mpd cli binary cp -P $(get_install_dir mpd-mpc)/usr/bin/mpc ${ADDON_BUILD}/${PKG_ADDON_ID}/bin mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/lib cp -p $(get_install_dir libmpdclient)/usr/lib/libmpdclient.so ${ADDON_BUILD}/${PKG_ADDON_ID}/lib cp -p $(get_install_dir libmpdclient)/usr/lib/libmpdclient.so.2 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib } ================================================ FILE: packages/addons/service/mpd/source/bin/mpd.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.multimedia.mpd mkdir -p $ADDON_HOME/config mkdir -p $ADDON_HOME/log mkdir -p $ADDON_HOME/playlists mkdir -p $ADDON_HOME/music touch $ADDON_HOME/log/mpd.log touch $ADDON_HOME/mpd.db touch $ADDON_HOME/state chmod a+x $ADDON_DIR/bin/* if [ ! -f "$ADDON_HOME/config/mpd.conf" ]; then cp $ADDON_DIR/config/mpd.conf $ADDON_HOME/config/mpd.conf fi exec mpd --no-daemon $ADDON_HOME/config/mpd.conf > /dev/null 2>&1 ================================================ FILE: packages/addons/service/mpd/source/config/mpd.conf ================================================ # An example configuration file for MPD # See the mpd.conf man page for a more detailed description of each parameter. # Files and directories ####################################################### # # This setting controls the top directory which MPD will search to discover the # available audio files and add them to the daemon's online database. This # setting defaults to the XDG directory, otherwise the music directory will be # be disabled and audio files will only be accepted over ipc socket (using # file:// protocol) or streaming files over an accepted protocol. # music_directory "/storage/music" # # This setting sets the MPD internal playlist directory. The purpose of this # directory is storage for playlists created by MPD. The server will use # playlist files not created by the server but only if they are in the MPD # format. This setting defaults to playlist saving being disabled. # playlist_directory "/storage/.kodi/userdata/addon_data/service.multimedia.mpd/playlists" # # This setting sets the location of the MPD database. This file is used to # load the database at server start up and store the database while the # server is not up. This setting defaults to disabled which will allow # MPD to accept files over ipc socket (using file:// protocol) or streaming # files over an accepted protocol. # db_file "/storage/.kodi/userdata/addon_data/service.multimedia.mpd/mpd.db" # # These settings are the locations for the daemon log files for the daemon. # These logs are great for troubleshooting, depending on your log_level # settings. # # The special value "syslog" makes MPD use the local syslog daemon. This # setting defaults to logging to syslog, otherwise logging is disabled. # log_file "/storage/.kodi/userdata/addon_data/service.multimedia.mpd/log/mpd.log" # # This setting sets the location of the file which stores the process ID # for use of mpd --kill and some init scripts. This setting is disabled by # default and the pid file will not be stored. # pid_file "/var/run/mpd.pid" # # This setting sets the location of the file which contains information about # most variables to get MPD back into the same general shape it was in before # it was brought down. This setting is disabled by default and the server # state will be reset on server start up. # state_file "/storage/.kodi/userdata/addon_data/service.multimedia.mpd/state" # # The location of the sticker database. This is a database which # manages dynamic information attached to songs. # #sticker_file "/storage/.mpd/sticker.sql" # ############################################################################### # General music daemon options ################################################ # # This setting specifies the user that MPD will run as. MPD should never run as # root and you may use this setting to make MPD change its user ID after # initialization. This setting is disabled by default and MPD is run as the # current user. # #user "mpd" # # This setting specifies the group that MPD will run as. If not specified # primary group of user specified with "user" setting will be used (if set). # This is useful if MPD needs to be a member of group such as "audio" to # have permission to use sound card. # #group "nogroup" # # This setting sets the address for the daemon to listen on. Careful attention # should be paid if this is assigned to anything other then the default, any. # This setting can deny access to control of the daemon. # # For network #bind_to_address "any" # # And for Unix Socket #bind_to_address "/storage/.mpd/socket" # # This setting is the TCP port that is desired for the daemon to get assigned # to. # #port "6600" # # This setting controls the type of information which is logged. Available # setting arguments are "default", "secure" or "verbose". The "verbose" setting # argument is recommended for troubleshooting, though can quickly stretch # available resources on limited hardware storage. # #log_level "default" # # If you have a problem with your MP3s ending abruptly it is recommended that # you set this argument to "no" to attempt to fix the problem. If this solves # the problem, it is highly recommended to fix the MP3 files with vbrfix # (available from ), at which # point gapless MP3 playback can be enabled. # #gapless_mp3_playback "yes" # # Setting "restore_paused" to "yes" puts MPD into pause mode instead # of starting playback after startup. # #restore_paused "no" # # This setting enables MPD to create playlists in a format usable by other # music players. # #save_absolute_paths_in_playlists "no" # # This setting defines a list of tag types that will be extracted during the # audio file discovery process. Optionally, 'comment' can be added to this # list. # #metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc" # # This setting enables automatic update of MPD's database when files in # music_directory are changed. # #auto_update "yes" # # Limit the depth of the directories being watched, 0 means only watch # the music directory itself. There is no limit by default. # #auto_update_depth "3" # ############################################################################### # Symbolic link behavior ###################################################### # # If this setting is set to "yes", MPD will discover audio files by following # symbolic links outside of the configured music_directory. # #follow_outside_symlinks "yes" # # If this setting is set to "yes", MPD will discover audio files by following # symbolic links inside of the configured music_directory. # #follow_inside_symlinks "yes" # ############################################################################### # Zeroconf / Avahi Service Discovery ########################################## # # If this setting is set to "yes", service information will be published with # Zeroconf / Avahi. # #zeroconf_enabled "yes" # # The argument to this setting will be the Zeroconf / Avahi unique name for # this MPD server on the network. # #zeroconf_name "Music Player" # ############################################################################### # Permissions ################################################################# # # If this setting is set, MPD will require password authorization. The password # can setting can be specified multiple times for different password profiles. # #password "password@read,add,control,admin" # # This setting specifies the permissions a user has who has not yet logged in. # #default_permissions "read,add,control,admin" # ############################################################################### # Input ####################################################################### # #input { # plugin "curl" # proxy "proxy.isp.com:8080" # proxy_user "user" # proxy_password "password" #} # ############################################################################### ############################################################################### ############################################################################### # # A BIG FAT WARNING # # This may block your xbmc audio. It might also play no audio at all, # if streamsilence is enabled and you try to use the very same device. # ############################################################################### ############################################################################### # Audio Output ################################################################ # # MPD supports various audio output types, as well as playing through multiple # audio outputs at the same time, through multiple audio_output settings # blocks. Setting this block is optional, though the server will only attempt # autodetection for one sound card. # # See for examples of # other audio outputs. # # An example of an ALSA output: # ##audio_output { ## type "alsa" ## name "ALSA Device" ### device "hw:0,0" # optional #### format "44100:16:2" # optional #### mixer_type "hardware" # optional #### mixer_device "default" # optional #### mixer_control "PCM" # optional #### mixer_index "0" # optional ##} # # An example of an OSS output: # #audio_output { # type "oss" # name "My OSS Device" ## device "/dev/dsp" # optional ## format "44100:16:2" # optional ## mixer_type "hardware" # optional ## mixer_device "/dev/mixer" # optional ## mixer_control "PCM" # optional #} # # An example of a shout output (for streaming to Icecast): # #audio_output { # type "shout" # encoding "ogg" # optional # name "My Shout Stream" # host "localhost" # port "8000" # mount "/mpd.ogg" # password "hackme" # quality "5.0" # bitrate "128" # format "44100:16:1" ## protocol "icecast2" # optional ## user "source" # optional ## description "My Stream Description" # optional ## url "http://example.com" # optional ## genre "jazz" # optional ## public "no" # optional ## timeout "2" # optional ## mixer_type "software" # optional #} # # An example of a recorder output: # #audio_output { # type "recorder" # name "My recorder" # encoder "vorbis" # optional, vorbis or lame # path "/var/lib/mpd/recorder/mpd.ogg" ## quality "5.0" # do not define if bitrate is defined # bitrate "128" # do not define if quality is defined # format "44100:16:1" #} # # An example of a httpd output (built-in HTTP streaming server): # #audio_output { ## type "httpd" # name "My HTTP Stream" # encoder "vorbis" # optional, vorbis or lame # port "8000" # bind_to_address "0.0.0.0" # optional, IPv4 or IPv6 # quality "5.0" # do not define if bitrate is defined # bitrate "320" # do not define if quality is defined # format "44100:16:1" # max_clients "0" # optional 0=no limit #} # # An example of a pulseaudio output (streaming to a remote pulseaudio server) # #audio_output { # type "pulse" # name "My Pulse Output" ## server "remote_server" # optional ## sink "remote_server_sink" # optional #} # ## Example "pipe" output: # #audio_output { # type "pipe" # name "my pipe" # command "aplay -f cd 2>/dev/null" ## Or if you're want to use AudioCompress # command "AudioCompress -m | aplay -f cd 2>/dev/null" ## Or to send raw PCM stream through PCM: # command "nc example.org 8765" # format "44100:16:2" #} # ## An example of a null output (for no audio output): # audio_output { type "null" name "My Null Output" mixer_type "none" # optional } # # This setting will change all decoded audio to be converted to the specified # format before being passed to the audio outputs. By default, this setting is # disabled. # #audio_output_format "44100:16:2" # # If MPD has been compiled with libsamplerate support, this setting specifies # the sample rate converter to use. Possible values can be found in the # mpd.conf man page or the libsamplerate documentation. By default, this is # setting is disabled. # #samplerate_converter "Fastest Sinc Interpolator" # ############################################################################### # Normalization automatic volume adjustments ################################## # # This setting specifies the type of ReplayGain to use. This setting can have # the argument "off", "album" or "track". See # for more details. This setting is off by default. # #replaygain "album" # # This setting sets the pre-amp used for files that have ReplayGain tags. By # default this setting is disabled. # #replaygain_preamp "0" # # This setting enables on-the-fly normalization volume adjustment. This will # result in the volume of all playing audio to be adjusted so the output has # equal "loudness". This setting is disabled by default. # #volume_normalization "no" # ############################################################################### # MPD Internal Buffering ###################################################### # # This setting adjusts the size of internal decoded audio buffering. Changing # this may have undesired effects. Don't change this if you don't know what you # are doing. # #audio_buffer_size "2048" # # This setting controls the percentage of the buffer which is filled before # beginning to play. Increasing this reduces the chance of audio file skipping, # at the cost of increased time prior to audio playback. # #buffer_before_play "10%" # ############################################################################### # Resource Limitations ######################################################## # # These settings are various limitations to prevent MPD from using too many # resources. Generally, these settings should be minimized to prevent security # risks, depending on the operating resources. # #connection_timeout "60" #max_connections "10" #max_playlist_length "16384" #max_command_list_size "2048" #max_output_buffer_size "8192" # ############################################################################### # Client TCP keep alive ####################################################### # # For clients connected by TCP on supported platforms. # Allows detection of dangling connections due to clients disappearing from # the network without closing their connections. # # This is not usually necessary but can be useful in cases such as wifi connectected # clients that go in and out of network range or turn off wifi without closing their # connections. Combined with low max_connections this can soon cause clients to not # be able to connect. # # # Enable tcp keepalive on new client connections (default is "no") # #tcp_keep_alive "no" # # Time in seconds since the last communication on the connection and before # the keepalive probing is started. (default is 7200 seconds) #tcp_keep_alive_idle "7200" # # Interval in seconds between keepalive probes, once a probe started. # (default is 75 seconds) #tcp_keep_alive_interval "75" # # Number of failed probes before the connection is pronounced dead and # the connection is closed. (default is 9 times) #tcp_keep_alive_count "9" # ############################################################################### # Character Encoding ########################################################## # # If file or directory names do not display correctly for your locale then you # may need to modify this setting. # #filesystem_charset "UTF-8" # # This setting controls the encoding that ID3v1 tags should be converted from. # #id3v1_encoding "ISO-8859-1" # ############################################################################### # SIDPlay decoder ############################################################# # # songlength_database: # Location of your songlengths file, as distributed with the HVSC. # The sidplay plugin checks this for matching MD5 fingerprints. # See http://www.c64.org/HVSC/DOCUMENTS/Songlengths.faq # # default_songlength: # This is the default playing time in seconds for songs not in the # songlength database, or in case you're not using a database. # A value of 0 means play indefinitely. # # filter: # Turns the SID filter emulation on or off. # #decoder { # plugin "sidplay" # songlength_database "/media/C64Music/DOCUMENTS/Songlengths.txt" # default_songlength "120" # filter "true" #} # ############################################################################### ================================================ FILE: packages/addons/service/mpd/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) ================================================ FILE: packages/addons/service/mpd/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: mpd # Addon id: service.mpd # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "General" msgstr "" msgctxt "#30001" msgid "Restart on suspend / resume" msgstr "" ================================================ FILE: packages/addons/service/mpd/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/mpd/source/settings-default.xml ================================================ true ================================================ FILE: packages/addons/service/mpd/source/sleep.d/mpd.power ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.multimedia.mpd SERVICE="service.multimedia.mpd" if [ "$RESTART_ON_RESUME" == "true" ] ; then case "$1" in pre) if systemctl is-active "$SERVICE" &>/dev/null ; then systemctl stop "$SERVICE" fi ;; post) if systemctl is-enabled "$SERVICE" &>/dev/null ; then systemctl start "$SERVICE" fi ;; esac fi ================================================ FILE: packages/addons/service/mpd/source/system.d/service.multimedia.mpd.service ================================================ [Unit] Description=mpd After=graphical.target [Service] ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.multimedia.mpd/bin/mpd.start" TimeoutStopSec=1 Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/net-snmp/changelog.txt ================================================ 1 - net-snmp: update to 5.9.4 ================================================ FILE: packages/addons/service/net-snmp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="net-snmp" PKG_VERSION="5.9.4" PKG_SHA256="8b4de01391e74e3c7014beb43961a2d6d6fa03acc34280b9585f4930745b0544" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="BSD" PKG_SITE="http://www.net-snmp.org" PKG_URL="https://sourceforge.net/projects/net-snmp/files/${PKG_NAME}/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libnl openssl" PKG_SECTION="service" PKG_SHORTDESC="Simple Network Management Protocol utilities." PKG_LONGDESC="Simple Network Management Protocol (SNMP) is a widely used protocol for monitoring the health and welfare of network equipment." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-sysroot" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Net-SNMP" PKG_ADDON_TYPE="xbmc.service" configure_package() { PKG_CONFIGURE_OPTS_TARGET="--with-defaults \ --disable-applications \ --disable-manuals \ --disable-debugging \ --disable-deprecated \ --disable-snmptrapd-subagent \ --disable-scripts \ --enable-static=yes \ --enable-shared=no \ --with-nl \ --with-logfile=/storage/.kodi/userdata/addon_data/${PKG_ADDON_ID} \ --with-persistent-directory=/storage/.kodi/userdata/addon_data/${PKG_ADDON_ID} \ --sysconfdir=/storage/.kodi/userdata/addon_data/${PKG_ADDON_ID} \ --prefix=/storage/.kodi/addons/${PKG_ADDON_ID} \ --exec-prefix=/storage/.kodi/addons/${PKG_ADDON_ID} \ --datarootdir=/storage/.kodi/userdata/addon_data/${PKG_ADDON_ID}/share \ --bindir=/storage/.kodi/addons/${PKG_ADDON_ID}/bin \ --sbindir=/storage/.kodi/addons/${PKG_ADDON_ID}/bin \ --libdir=/storage/.kodi/addons/${PKG_ADDON_ID}/lib \ --disable-embedded-perl \ --with-sysroot=${SYSROOT_PREFIX}" } make_target() { make } makeinstall_target() { make install INSTALL_PREFIX=${INSTALL} } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/lib cp -r ${PKG_INSTALL}/storage/.kodi/addons/${PKG_ADDON_ID}/bin ${PKG_INSTALL}/storage/.kodi/userdata/addon_data/${PKG_ADDON_ID}/share ${ADDON_BUILD}/${PKG_ADDON_ID}/ } ================================================ FILE: packages/addons/service/net-snmp/patches/net-snmp-0001-read_config.c.patch ================================================ --- a/snmplib/read_config.c 2014-12-08 14:23:22.000000000 -0600 +++ b/snmplib/read_config.c 2017-03-30 12:21:16.351042803 -0500 @@ -1642,7 +1642,7 @@ * save a warning header to the top of the new file */ snprintf(fileold, sizeof(fileold), - "%s%s# Please save normal configuration tokens for %s in SNMPCONFPATH/%s.conf.\n# Only \"createUser\" tokens should be placed here by %s administrators.\n%s", + "%s%s# Please save normal configuration tokens for %s in /storage/.kodi/userdata/addon_data/service.net-snmp/share/snmp/%s.conf.\n# Only \"createUser\" tokens should be placed here by %s administrators.\n%s", "#\n# net-snmp (or ucd-snmp) persistent data file.\n#\n############################################################################\n# STOP STOP STOP STOP STOP STOP STOP STOP STOP \n", "#\n# **** DO NOT EDIT THIS FILE ****\n#\n# STOP STOP STOP STOP STOP STOP STOP STOP STOP \n############################################################################\n#\n# DO NOT STORE CONFIGURATION ENTRIES HERE.\n", type, type, type, ================================================ FILE: packages/addons/service/net-snmp/patches/net-snmp-0002-net-snmp-create-v3-user.in.patch ================================================ --- net-snmp-5.9/net-snmp-create-v3-user.in 2020-08-14 21:41:47.000000000 +0000 +++ net-snmp-5.9/net-snmp-create-v3-user.in 2021-01-14 07:04:26.196982169 +0000 @@ -3,10 +3,8 @@ # this shell script is designed to add new SNMPv3 users # to Net-SNMP config file. -if @PSCMD@ | @EGREP@ ' snmpd *$' > /dev/null 2>&1 ; then - echo "Apparently at least one snmpd daemon is already running." - echo "You must stop them in order to use this command." - exit 1 +if @PSCMD@ | @EGREP@ 'snmpd' > /dev/null 2>&1 ; then + systemctl stop service.net-snmp.service fi Aalgorithm="MD5" ================================================ FILE: packages/addons/service/net-snmp/source/bin/snmpd.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.net-snmp ADDON_ID=service.net-snmp ADDON_DIR="$HOME/.kodi/addons/$ADDON_ID" ADDON_HOME="$HOME/.kodi/userdata/addon_data/$ADDON_ID" $ADDON_DIR/bin/snmpd -f -LS0-6d -C -c $ADDON_HOME/share/snmp/snmpd.conf -M $ADDON_DIR/share/snmp/mibs -p /var/run/snmpd.pid ================================================ FILE: packages/addons/service/net-snmp/source/bin/snmpd.stop ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.net-snmp ADDON_ID=service.net-snmp ADDON_DIR="$HOME/.kodi/addons/$ADDON_ID" ADDON_HOME="$HOME/.kodi/userdata/addon_data/$ADDON_ID" PID=`cat /var/run/snmpd.pid` kill -TERM $PID ================================================ FILE: packages/addons/service/net-snmp/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import xbmc import xbmcvfs import xbmcaddon from os import system class MyMonitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) def onSettingsChanged(self): writeconfig() # addon __addon__ = xbmcaddon.Addon(id='service.net-snmp') __addonpath__ = xbmcvfs.translatePath(__addon__.getAddonInfo('path')) __addonhome__ = xbmcvfs.translatePath(__addon__.getAddonInfo('profile')) if not xbmcvfs.exists(xbmcvfs.translatePath(__addonhome__ + 'share/snmp/')): xbmcvfs.mkdirs(xbmcvfs.translatePath(__addonhome__ + 'share/snmp/')) config = xbmcvfs.translatePath(__addonhome__ + 'share/snmp/snmpd.conf') persistent = xbmcvfs.translatePath(__addonhome__ + 'snmpd.conf') def writeconfig(): system("systemctl stop service.net-snmp.service") community = __addon__.getSetting("COMMUNITY") location = __addon__.getSetting("LOCATION") contact = __addon__.getSetting("CONTACT") snmpversion = __addon__.getSetting("SNMPVERSION") cputemp = __addon__.getSetting("CPUTEMP") gputemp = __addon__.getSetting("GPUTEMP") if xbmcvfs.exists(persistent): xbmcvfs.delete(persistent) file = xbmcvfs.File(config, 'w') file.write('com2sec local default {}\n'.format(community)) file.write('group localgroup {} local\n'.format(snmpversion)) file.write('access localgroup "" any noauth exact all all none\n') file.write('view all included .1 80\n') file.write('syslocation {}\n'.format(location)) file.write('syscontact {}\n'.format(contact)) file.write('dontLogTCPWrappersConnects yes\n') if cputemp == "true": file.write('extend cputemp "/usr/bin/cputemp"\n') if gputemp == "true": file.write('extend gputemp "/usr/bin/gputemp"\n') if snmpversion == "v3": file.write('includeFile ../../snmpd.conf\n') snmppassword = __addon__.getSetting("SNMPPASSWORD") snmpuser = __addon__.getSetting("SNMPUSER") system("net-snmp-config --create-snmpv3-user -a MD5 -A {0} {1}".format(snmppassword,snmpuser)) file.close() system("systemctl start service.net-snmp.service") if not xbmcvfs.exists(config): writeconfig() monitor = MyMonitor() while not monitor.abortRequested(): if monitor.waitForAbort(): break ================================================ FILE: packages/addons/service/net-snmp/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: net-snmp # Addon id: service.net-snmp # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#32000" msgid "General" msgstr "" msgctxt "#32001" msgid "Community" msgstr "" msgctxt "#32002" msgid "Location" msgstr "" msgctxt "#32003" msgid "Contact" msgstr "" msgctxt "#32004" msgid "SNMP Version" msgstr "" msgctxt "#32005" msgid "SNMP User" msgstr "" msgctxt "#32006" msgid "SNMP Password" msgstr "" msgctxt "#32007" msgid "v3 account" msgstr "" msgctxt "#32008" msgid "Extends" msgstr "" msgctxt "#32009" msgid "Expose cputemp" msgstr "" msgctxt "#32010" msgid "Expose gputemp" msgstr "" ================================================ FILE: packages/addons/service/net-snmp/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/net-snmp/source/system.d/service.net-snmp.service ================================================ [Unit] Description=Net-SNMP software bundle After=network-online.target Requires=network-online.target [Service] Type=notification ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.net-snmp/bin/snmpd.start" ExecStop=/bin/sh -c "exec sh /storage/.kodi/addons/service.net-snmp/bin/snmpd.stop" ExecReload=/bin/kill -HUP $MAINPID PIDFile=/var/run/snmpd.pid [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/nextpvr/changelog.txt ================================================ 5 - download NextPVR 6.1.5 4 - download NextPVR 6.1.4 3 - download NextPVR 6.1.3 2 Fix nextpvr-downloader script initial release ================================================ FILE: packages/addons/service/nextpvr/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nextpvr" PKG_VERSION="6.1.5~Nexus" PKG_ADDON_VERSION="6.1.5~5" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="NextPVR" PKG_SITE="https://nextpvr.com" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="service" PKG_SHORTDESC="NextPVR Server" PKG_LONGDESC="NextPVR is a personal video recorder application. It allows to watch or record live TV, provides great features like series recordings and web scheduling." PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="NextPVR Server" PKG_ADDON_TYPE="xbmc.service.library" PKG_ADDON_REQUIRES="tools.ffmpeg-tools:0.0.0 tools.dotnet-runtime:0.0.0 script.module.requests:0.0.0" addon() { : } post_install_addon() { sed -e "s/@NEXTPVR_VERSION@/${PKG_ADDON_VERSION}/g" -i "${INSTALL}/bin/nextpvr-downloader" } ================================================ FILE: packages/addons/service/nextpvr/source/addon.py ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) import urllib.request, urllib.parse, urllib.error, os, zipfile from urllib.error import URLError import urllib.parse as urlparse import requests import json import subprocess from urllib.parse import parse_qs import xbmc, xbmcvfs, xbmcgui, xbmcaddon import shutil import sys import xml.etree.ElementTree as ET temp = xbmcvfs.translatePath('special://temp') ADDON_NAME = xbmcaddon.Addon().getAddonInfo('name') LS = xbmcaddon.Addon().getLocalizedString # Ignore isbn tables SCANTABLES = ['atsc', 'dvb-c', 'dvb-s', 'dvb-t'] GENERIC_URL = 'https://nextpvr.com/stable/linux/NPVR.zip' class Controller(): def __init__(self): pass def downloadScanTable(self): # Taken from TVHeadend Addon try: url = 'https://github.com/tvheadend/dtv-scan-tables/archive/tvheadend.zip' archive = os.path.join(temp, 'dtv_scantables.zip') temp_folder = os.path.join(temp, 'dtv-scan-tables-tvheadend') dest_folder = os.path.join(xbmcvfs.translatePath(xbmcaddon.Addon().getAddonInfo('path')), 'dtv-scan-tables') xbmcgui.Dialog().notification(ADDON_NAME, LS(30042), xbmcgui.NOTIFICATION_INFO) urllib.request.urlretrieve(url, archive) zip = zipfile.ZipFile(archive) if zip.testzip() is not None: raise zipfile.BadZipfile if os.path.exists(temp_folder): shutil.rmtree(temp_folder) if os.path.exists(dest_folder): shutil.rmtree(dest_folder) xbmcgui.Dialog().notification(ADDON_NAME, LS(30043), xbmcgui.NOTIFICATION_INFO) for idx, folder in enumerate(SCANTABLES): for z in zip.filelist: if folder in z.filename: zip.extract(z.filename, temp) for folder in SCANTABLES: shutil.copytree(os.path.join(temp_folder, folder), os.path.join(dest_folder, folder)) if os.path.exists(temp_folder): shutil.rmtree(temp_folder) os.remove(archive) xbmcgui.Dialog().notification(ADDON_NAME, LS(30039), xbmcgui.NOTIFICATION_INFO) except URLError as e: xbmc.log('Could not download file: %s' % e.reason, xbmc.LOGERROR) xbmcgui.Dialog().notification(ADDON_NAME, LS(30040), xbmcgui.NOTIFICATION_ERROR) except zipfile.BadZipfile: xbmc.log('Could not extract files from zip, bad zipfile', xbmc.LOGERROR) xbmcgui.Dialog().notification(ADDON_NAME, LS(30041), xbmcgui.NOTIFICATION_ERROR) def updateNextPVR(self): try: dest_folder = os.path.join(xbmcvfs.translatePath(xbmcaddon.Addon().getAddonInfo('path')), 'nextpvr-bin') archive = os.path.join(temp, 'NPVR.zip') xbmcgui.Dialog().notification(ADDON_NAME, LS(30011), xbmcgui.NOTIFICATION_INFO) urllib.request.urlretrieve(GENERIC_URL, archive) xbmcgui.Dialog().notification(ADDON_NAME, LS(30012), xbmcgui.NOTIFICATION_INFO) zip = zipfile.ZipFile(archive) if zip.testzip() is not None: raise zipfile.BadZipfile zip.close() command = 'unzip -o {0} -d {1} > /dev/null'.format(archive, dest_folder) xbmc.log('Running: %s' % command, xbmc.LOGDEBUG) os.system(command) os.remove(archive) xbmcgui.Dialog().notification(ADDON_NAME, LS(30039), xbmcgui.NOTIFICATION_INFO) xbmc.log('NPVR.zip installed', xbmc.LOGDEBUG) if xbmcgui.Dialog().yesno("NextPVR Server", LS(30020)): self.id = xbmcaddon.Addon().getAddonInfo('id') subprocess.call(['systemctl', 'restart', self.id]) except URLError as e: xbmc.log('Could not download file: %s' % e.reason, xbmc.LOGERROR) xbmcgui.Dialog().notification(ADDON_NAME, LS(30040), xbmcgui.NOTIFICATION_ERROR) except zipfile.BadZipfile: xbmc.log('Could not extract files from zip, bad zipfile', xbmc.LOGERROR) xbmcgui.Dialog().notification(ADDON_NAME, LS(30041), xbmcgui.NOTIFICATION_ERROR) def sessionLogin(self): self.session = requests.session() headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0' } response = self.session.get(self.url, headers=headers) parsed = urlparse.urlparse(response.url) salt = parse_qs(parsed.query)['salt'][0] if self.hashedPassword == None: passwordHash = self.hashMe(self.password) else: passwordHash = self.hashedPassword combined = self.hashMe(salt + ':' + self.username + ':' + passwordHash) response = self.session.get(self.url + 'login.html?hash='+combined) if response.status_code != 200 and response.status_code != 302 : print(response.text, response.status_code) sys.exit() for cookie in self.session.cookies: self.session.cookies[cookie.name] = cookie.value def doSessionRequest5(self, method, isJSON = True): xbmc.log(method, xbmc.LOGDEBUG) retval = False getResult = None url = self.url + 'service?method=' + method try: request = self.session.get(url, headers={"Accept" : "application/json"}) getResult = json.loads(request.text) if request.status_code == 200 : if 'stat' in getResult: retval = getResult['stat'] == 'ok' else: retval = True else: xbmc.log(getResult, xbmc.LOGERROR) except Exception as e: xbmc.log(str(e), xbmc.LOGERROR) return retval, getResult def hashMe (self, thedata): import hashlib h = hashlib.md5() h.update(thedata.encode('utf-8')) return h.hexdigest() def loginNextPVR(self): base = os.path.join(xbmcvfs.translatePath(xbmcaddon.Addon().getAddonInfo('profile')), 'config/config.xml') tree = ET.parse(base) root = tree.getroot() child = root.find("WebServer") self.port = child.find('Port').text self.username = child.find('Username').text self.hashedPIN = child.find('PinMD5').text self.hashedPassword = child.find('Password').text.lower() self.ip = '127.0.0.1' self.url = 'http://{}:{}/'.format(self.ip, self.port) self.sessionLogin() def showMessage(self, message): xbmc.log(message, xbmc.LOGDEBUG) xbmcgui.Dialog().notification(ADDON_NAME, message, xbmcgui.NOTIFICATION_INFO) def updateEpg(self): self.loginNextPVR() self.doSessionRequest5('system.epg.update') self.doSessionRequest5('session.logout') self.showMessage(LS(30015)) def updateM3u(self): self.loginNextPVR() self.doSessionRequest5('setting.m3u.update') self.doSessionRequest5('session.logout') self.showMessage(LS(30016)) def rescanDevices(self): self.loginNextPVR() self.doSessionRequest5('setting.devices&refresh=true') self.doSessionRequest5('session.logout') self.showMessage(LS(30017)) def transcodeHLS(self): base = os.path.join(xbmcvfs.translatePath(xbmcaddon.Addon().getAddonInfo('profile')), 'config/config.xml') tree = ET.parse(base) parser = ET.XMLParser(target=ET.TreeBuilder(insert_comments=True)) tree = ET.parse(base, parser=parser) root = tree.getroot() parent = root.find("WebServer") child = parent.find('TranscodeHLS') if child.text == 'default': child.text = '-y [ANALYZE_DURATION] [SEEK] -i [SOURCE] -map_metadata -1 -threads [THREADS] -ignore_unknown -map 0:v:0? [PREFERRED_LANGUAGE] -map 0:a:[AUDIO_STREAM] -map -0:s -vcodec copy -acodec aac -ac 2 -c:s copy -hls_time [SEGMENT_DURATION] -start_number 0 -hls_list_size [SEGMENT_COUNT] -y [TARGET]' else: child.text = 'default' tree.write(base, encoding='utf-8') if child.text == 'default': self.showMessage(LS(30018)) else: self.showMessage(LS(30019)) def resetWebCredentials(self): rewrite = False base = os.path.join(xbmcvfs.translatePath(xbmcaddon.Addon().getAddonInfo('profile')), 'config/config.xml') tree = ET.parse(base) parser = ET.XMLParser(target=ET.TreeBuilder(insert_comments=True)) tree = ET.parse(base, parser=parser) root = tree.getroot() parent = root.find("WebServer") child = parent.find('Username') if child.text != 'admin': child.text = 'admin' rewrite = True child = parent.find('Password') if child.text != '5f4dcc3b5aa765d61d8327deb882cf99': child.text = '5f4dcc3b5aa765d61d8327deb882cf99' rewrite = True if rewrite: tree.write(base, encoding='utf-8') self.showMessage(LS(30046)) if __name__ == '__main__': option = Controller() try: if sys.argv[1] == 'getscantables': option.downloadScanTable() elif sys.argv[1] == 'updategeneric': option.updateNextPVR() elif sys.argv[1] == 'updateepg': option.updateEpg() elif sys.argv[1] == 'transcode': option.transcodeHLS() elif sys.argv[1] == 'updatem3u': option.updateM3u() elif sys.argv[1] == 'rescan': option.rescanDevices() elif sys.argv[1] == 'defaults': option.resetWebCredentials() except IndexError: pass ================================================ FILE: packages/addons/service/nextpvr/source/bin/nextpvr-downloader ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.nextpvr ICON="${ADDON_DIR}/resources/icon.png" CONTROL_FILE="/tmp/curl.nextpvr.done" DATA_FILE="/tmp/curl.nextpvr.data" NEXTPVR_VERSION="@NEXTPVR_VERSION@" NEXTPVR_FILE="NPVR-${NEXTPVR_VERSION%~*}.zip" # check for enough free disk space if [ $(df . | awk 'END {print $4}') -lt 400000 ]; then kodi-send --action="Notification(Not enough disk space, at least 400MB are required,30000,${ICON})" >/dev/null exit 0 fi # remove install status and folders if [ -f ${ADDON_DIR}/extract.ok ]; then rm ${ADDON_DIR}/extract.ok fi if [ -d ${ADDON_DIR}/nextpvr-bin ]; then rm -rf ${ADDON_DIR}/nextpvr-bin fi if [ -d ${ADDON_DIR}/tmp_download ]; then rm -rf ${ADDON_DIR}/tmp_download fi # create tmp download dir mkdir -p ${ADDON_DIR}/tmp_download cd ${ADDON_DIR}/tmp_download echo "Downloading NextPVR" # download NextPVR rm -f ${CONTROL_FILE} ${DATA_FILE} ( curl -L -# -O -C - https://github.com/sub3/releases/releases/download/${NEXTPVR_VERSION%~*}/${NEXTPVR_FILE} 2>${DATA_FILE} touch ${CONTROL_FILE} ) | while [ : ]; do [ -f ${DATA_FILE} ] && prog="$(tr '\r' '\n' <${DATA_FILE} | tail -n 1 | sed -r 's/^[# ]+/#/;s/^[^0-9]*//g')" || prog= kodi-send --action="Notification(Downloading NextPVR,\"${prog:-0.0%}\",3000,${ICON})" >/dev/null [ -f ${CONTROL_FILE} ] && break sleep 4 done rm -f ${CONTROL_FILE} ${DATA_FILE} # check for failed download if [ ! -f ${NEXTPVR_FILE} ]; then kodi-send --action="Notification(Download NextPVR failed,${ICON})" exit 1 fi # extract NextPVR kodi-send --action="Notification(Extracting NextPVR,starting,1000,${ICON})" >/dev/null mkdir -p ${ADDON_DIR}/nextpvr-bin unzip ${NEXTPVR_FILE} -d ${ADDON_DIR}/nextpvr-bin >/dev/null if [ "$(uname -m)" != "x86_64" ]; then sed -i 's/default<\/TranscodeHLS>/-y [ANALYZE_DURATION] [SEEK] -i [SOURCE] -map_metadata -1 -threads [THREADS] -ignore_unknown -map 0:v:0? [PREFERRED_LANGUAGE] -map 0:a:[AUDIO_STREAM] -map -0:s -vcodec copy -acodec aac -ac 2 -c:s copy -hls_time [SEGMENT_DURATION] -start_number 0 -hls_list_size [SEGMENT_COUNT] -y [TARGET]<\/TranscodeHLS>/' ${ADDON_DIR}/nextpvr-bin/data/Config-master-dont-edit.xml fi sed -i 's/C:\\Users\\Public\\Videos\\<\/RecordingDirectory>/\/storage\/tvshows\/<\/RecordingDirectory>/' ${ADDON_DIR}/nextpvr-bin/data/Config-master-dont-edit.xml sed -i 's/C:\\Users\\Public\\Videos\\<\/LiveTVBufferDirectory>/\/tmp\/<\/LiveTVBufferDirectory>/' ${ADDON_DIR}/nextpvr-bin/data/Config-master-dont-edit.xml find ${ADDON_DIR}/nextpvr-bin/DeviceHost -name DeviceHostLinux -exec chmod 755 {} \; # cleanup cd ${ADDON_DIR} rm -rf ${ADDON_DIR}/tmp_download touch ${ADDON_DIR}/extract.ok kodi-send --action="Notification(Extracting NextPVR,finished,1000,${ICON})" >/dev/null ================================================ FILE: packages/addons/service/nextpvr/source/bin/nextpvr.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.nextpvr # check if nextpvr-server is already successful installed if [ ! -f "${ADDON_DIR}/extract.ok" ]; then cd ${ADDON_DIR} nextpvr-downloader fi export NEXTPVR_DATADIR_USERDATA=${ADDON_HOME}/config/ export NEXTPVR_DVBDIR=${ADDON_DIR}/dtv-scan-tables/ export SATIP_RTSP_PORT=$satiprtsp read -d. uptime < /proc/uptime startdelay=$((waitfor-uptime)) if [ $startdelay -gt 0 ]; then sleep $startdelay fi cd ${ADDON_DIR}/nextpvr-bin exec dotnet ${ADDON_DIR}/nextpvr-bin/NextPVRServer.dll >/dev/null ================================================ FILE: packages/addons/service/nextpvr/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) def onSettingsChanged(self): pass if __name__ == "__main__": Monitor().waitForAbort() ================================================ FILE: packages/addons/service/nextpvr/source/resources/Language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: nextpvr # Addon id: service.nextpvr # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30001" msgid "Download" msgstr "" msgctxt "#30002" msgid "Download current Linux NPVR.zip" msgstr "" msgctxt "#30003" msgid "Check the NextPVR forum before updating" msgstr "" msgctxt "#30004" msgid "Manage Server" msgstr "" msgctxt "#30005" msgid "Update guide" msgstr "" msgctxt "#30006" msgid "Start an unscheduled EPG update" msgstr "" msgctxt "#30007" msgid "Update IPTV m3u source" msgstr "" msgctxt "#30008" msgid "Rescan m3u file(s) and update URLs" msgstr "" msgctxt "#30009" msgid "Toggle custom HLS transcoding with default" msgstr "" msgctxt "#30010" msgid "Change HLS transcoding mode, default will not work on all platforms" msgstr "" msgctxt "#30011" msgid "Download NPVR.zip" msgstr "" msgctxt "#30012" msgid "Extract NPVR.zip" msgstr "" msgctxt "#30013" msgid "Rescan tuning devices" msgstr "" msgctxt "#30014" msgid "Rescan for tuner changes after start-up" msgstr "" msgctxt "#30015" msgid "Update EPG started" msgstr "" msgctxt "#30016" msgid "Update m3u started" msgstr "" msgctxt "#30017" msgid "Device refresh started" msgstr "" msgctxt "#30018" msgid "Transcode set to default" msgstr "" msgctxt "#30019" msgid "Transcode set to custom" msgstr "" msgctxt "#30020" msgid "Restart server now" msgstr "" msgctxt "#30037" msgid "Install the frequency scanning table for digital devices" msgstr "" msgctxt "#30038" msgid "Download and install Scan-Tables" msgstr "" msgctxt "#30039" msgid "Download completed and installed" msgstr "" msgctxt "#30040" msgid "Could not download zip file" msgstr "" msgctxt "#30041" msgid "Could not extract zip file" msgstr "" msgctxt "#30042" msgid "Download Scan-Tables" msgstr "" msgctxt "#30043" msgid "Extract Scan-Tables" msgstr "" msgctxt "#30044" msgid "Reset web server credentials" msgstr "" msgctxt "#30045" msgid "Reset to defaults Username: admin Password: password" msgstr "" msgctxt "#30046" msgid "Set Username: admin Password: password" msgstr "" msgctxt "#30047" msgid "SAT>IP RTSP port" msgstr "" msgctxt "#30048" msgid "Default is 554 - TVHeadend uses 9983" msgstr "" msgctxt "#30049" msgid "Startup uptime wait" msgstr "" msgctxt "#30050" msgid "Delay service launch on boot to specified uptime (seconds)" msgstr "" ================================================ FILE: packages/addons/service/nextpvr/source/resources/settings.xml ================================================
0 RunScript(service.nextpvr, getscantables) false 2 RunScript(service.nextpvr, updategeneric) false 1 5 5 1 60 false 1 RunScript(service.nextpvr, updateepg) false 3 RunScript(service.nextpvr, updatem3u) false 2 RunScript(service.nextpvr, rescan) false 3 RunScript(service.nextpvr, transcode) false 3 RunScript(service.nextpvr, defaults) false 1 554 30047
================================================ FILE: packages/addons/service/nextpvr/source/settings-default.xml ================================================ 5 554 ================================================ FILE: packages/addons/service/nextpvr/source/system.d/service.nextpvr.service ================================================ [Unit] Description=NextPVR Server Documentation=https://nextpvr.com Wants=multi-user.target After=multi-user.target [Service] SyslogIdentifier=%N ExecStart=/bin/sh /storage/.kodi/addons/%N/bin/nextpvr.start Restart=always [Install] WantedBy=multi-user.target ================================================ FILE: packages/addons/service/oscam/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/oscam/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="oscam" PKG_VERSION="db7c4cbdbd34a9b0464070b1a46e146e6029a2cb" # 2022-10-22 PKG_SHA256="b5dd1d0dc71553c8504d6982b6bae437d6bef17c6cd8a38ac4710a38300018cf" PKG_VERSION_NUMBER="11715" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://www.streamboard.tv/oscam/wiki" PKG_URL="https://repo.or.cz/oscam.git/snapshot/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain openssl pcsc-lite" PKG_SECTION="service.softcam" PKG_SHORTDESC="OSCam: an Open Source Conditional Access Modul" PKG_LONGDESC="OSCam(${PKG_VERSION_NUMBER}) is a software to be used to decrypt digital television channels, as an alternative for a conditional access module." PKG_IS_ADDON="yes" PKG_ADDON_NAME="OSCam" PKG_ADDON_TYPE="xbmc.service" PKG_CMAKE_OPTS_TARGET="\ `#Building` \ -DLIBUSBDIR=${SYSROOT_PREFIX}/usr \ -DOPTIONAL_INCLUDE_DIR=${SYSROOT_PREFIX}/usr/include \ \ `#Readers` \ -DCARDREADER_DB2COM=OFF \ -DCARDREADER_DRECAS=ON \ -DCARDREADER_INTERNAL=OFF \ -DCARDREADER_MP35=ON \ -DCARDREADER_PHOENIX=ON \ -DCARDREADER_SC8IN1=ON \ -DCARDREADER_SMARGO=ON \ -DCARDREADER_STAPI5=OFF \ -DCARDREADER_STAPI=OFF \ -DCARDREADER_STINGER=ON \ \ `#Protocol` \ -DMODULE_CAMD33=OFF \ -DMODULE_CAMD35=ON \ -DMODULE_CAMD35_TCP=ON \ -DMODULE_CCCAM=ON \ -DMODULE_CCCSHARE=ON \ -DMODULE_CONSTCW=ON \ -DMODULE_GBOX=ON \ -DMODULE_GHTTP=ON \ -DMODULE_NEWCAMD=ON \ -DMODULE_PANDORA=ON \ -DMODULE_RADEGAST=ON \ -DMODULE_SCAM=ON \ -DMODULE_SERIAL=ON \ \ `#Features` \ -DCLOCKFIX=0 \ -DCS_ANTICASC=ON \ -DCS_CACHEEX=ON \ -DCW_CYCLE_CHECK=ON \ -DHAVE_DVBAPI=1 \ -DHAVE_LIBCRYPTO=1 \ -DSTATIC_LIBUSB=1 \ -DTOUCH=ON \ -DWEBIF=1 \ -DWEBIF_LIVELOG=1 \ -DWEBIF_JQUERY=1 \ -DWITH_DEBUG=0 \ -DWITH_SSL=1 \ -DWITH_STAPI=0" pre_configure_target() { export OSCAM_ADDON_VERSION="${PKG_VERSION_NUMBER}" } makeinstall_target() { : } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P ${PKG_BUILD}/.${TARGET_NAME}/oscam ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P ${PKG_BUILD}/.${TARGET_NAME}/utils/list_smargo ${ADDON_BUILD}/${PKG_ADDON_ID}/bin } ================================================ FILE: packages/addons/service/oscam/patches/oscam-01-revision.patch ================================================ --- a/config.sh +++ b/config.sh @@ -701,7 +701,7 @@ do break ;; '-r'|'--oscam-revision') - revision=`(svnversion -n . 2>/dev/null || printf 0) | sed 's/.*://; s/[^0-9]*$//; s/^$/0/'` + echo "$OSCAM_ADDON_VERSION" if [ "$revision" = "0" ] then which git > /dev/null 2>&1 && revision=`git log -10 --pretty=%B | grep git-svn-id | head -n 1 | sed -n -e 's/^.*trunk@\([0-9]*\) .*$/\1/p'` ================================================ FILE: packages/addons/service/oscam/patches/oscam-02-link-with-ludev.patch ================================================ --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -498,7 +498,7 @@ add_library (${csoscam} STATIC ${csoscam set (exe_name "oscam") add_executable (${exe_name} ${exe_srcs} ${exe_hdrs}) -target_link_libraries (${exe_name} ${csoscam} ${csmodules} ${csreaders} csctapi cscrypt minilzo) +target_link_libraries (${exe_name} ${csoscam} ${csmodules} ${csreaders} csctapi cscrypt minilzo udev) if(HAVE_LIBRT AND HAVE_LIBUSB) if (LIBUSBDIR) set (libusb_link "imp_libusb") --- a/utils/CMakeLists.txt +++ b/utils/CMakeLists.txt @@ -12,7 +12,7 @@ file (GLOB all_srcs ${exe_srcs}) set (util_name "list_smargo") add_executable (${util_name} ${exe_srcs} ${exe_hdrs}) -target_link_libraries (${util_name} ${libusb_link} ${rt_link} ${setupapi_link} ${ole32_link} ${shell32_link} ${pthread_link} ${dl_link}) +target_link_libraries (${util_name} ${libusb_link} ${rt_link} ${setupapi_link} ${ole32_link} ${shell32_link} ${pthread_link} ${dl_link} udev) #----------------------- printout resume ----------------------------- message (STATUS "Utils: operating system: ${OSCamOperatingSystem}") ================================================ FILE: packages/addons/service/oscam/patches/oscam-03-pcsc-pthread.patch ================================================ --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -561,6 +561,7 @@ if (HAVE_PCSC) if (NOT OSCamOperatingSystem MATCHES "Mac OS X") if (NOT OSCamOperatingSystem MATCHES "Windows/Cygwin") target_link_libraries (${exe_name} pcsclite) + target_link_libraries (${exe_name} pthread) endif (NOT OSCamOperatingSystem MATCHES "Windows/Cygwin") endif (NOT OSCamOperatingSystem MATCHES "Mac OS X") endif (HAVE_PCSC) ================================================ FILE: packages/addons/service/oscam/source/bin/oscam.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.softcam.oscam mkdir -p $ADDON_HOME/config mkdir -p $ADDON_HOME/log for config_name in \ oscam.ac oscam.cert oscam.dvbapi oscam.guess oscam.ird oscam.provid \ oscam.server oscam.services oscam.srvid oscam.tiers oscam.user do [ ! -f $ADDON_HOME/config/$config_name ] && touch $ADDON_HOME/config/$config_name done if [ ! -f "$ADDON_HOME/config/oscam.conf" ]; then cp $ADDON_DIR/oscam-default.conf $ADDON_HOME/config/oscam.conf fi find $ADDON_DIR/bin -maxdepth 1 -type f ! -perm 0755 -exec chmod 0755 \{\} \; if [ "$WORKAROUND_SLEEP" == "true" ] ; then sleep $WORKAROUND_SLEEP_TIME fi # start userspace DVB driver/addon for driver_dvb in $(find /storage/.kodi/addons/driver.dvb.*/bin/userspace-driver.sh -type f 2>/dev/null); do driver_dvb_name=$(echo $driver_dvb | awk 'BEGIN {FS="/"} {printf("%s", $5)}') logger -t OSCAM "### Loading userspace DVB driver: $driver_dvb_name ###" # use ". " because of variable export . $driver_dvb done if [ "$WAIT_FOR_FEINIT" == "true" ] ; then while [ true ] ; do if [ -e /dev/dvb/adapter$((NUM_ADAPTERS-1))/frontend0 ] ; then break fi sleep 1 done fi exec oscam -c $ADDON_HOME/config > /dev/null 2>&1 ================================================ FILE: packages/addons/service/oscam/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) ================================================ FILE: packages/addons/service/oscam/source/oscam-default.conf ================================================ # # main configuration # [global] nice = -1 WaitForCards = 1 usrfile = /storage/.kodi/userdata/addon_data/service.softcam.oscam/log/oscamuser.log logfile = /storage/.kodi/userdata/addon_data/service.softcam.oscam/log/oscam.log cwlogdir = /storage/.kodi/userdata/addon_data/service.softcam.oscam/log/cw saveinithistory = 1 [monitor] port = 988 aulow = 120 hideclient_to = 15 monlevel = 1 appendchaninfo = 0 [webif] httpport = 8888 httpuser = oscam httppwd = oscam httpallowed = 0.0.0.0-255.255.255.255 [dvbapi] enabled = 1 pmt_mode = 4 boxtype = pc ================================================ FILE: packages/addons/service/oscam/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: oscam # Addon id: service.oscam # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "General" msgstr "" msgctxt "#30001" msgid "Restart on suspend / resume" msgstr "" msgctxt "#30002" msgid "DVBAPI" msgstr "" msgctxt "#30003" msgid "Delay the start of OSCam" msgstr "" msgctxt "#30004" msgid "time (s)" msgstr "" msgctxt "#30005" msgid "Wait for frontend initialization" msgstr "" msgctxt "#30006" msgid "Number of adapters to wait for" msgstr "" ================================================ FILE: packages/addons/service/oscam/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/oscam/source/settings-default.xml ================================================ 1 false false false 1 ================================================ FILE: packages/addons/service/oscam/source/sleep.d/oscam.power ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.softcam.oscam SERVICE="service.softcam.oscam.service" if [ "$RESTART_ON_RESUME" == "true" ] ; then case "$1" in pre) if systemctl is-active "$SERVICE" &>/dev/null ; then systemctl stop "$SERVICE" fi ;; post) if systemctl is-enabled "$SERVICE" &>/dev/null ; then systemctl start "$SERVICE" fi ;; esac fi ================================================ FILE: packages/addons/service/oscam/source/system.d/service.softcam.oscam.service ================================================ [Unit] Description=OSCam After=network-online.service Requires=network-online.service [Service] ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.softcam.oscam/bin/oscam.start" TimeoutStopSec=1 Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/pcscd/changelog.txt ================================================ 1 - ccid: update to 1.5.2 ================================================ FILE: packages/addons/service/pcscd/config/reader.conf ================================================ # Gemalto reader with serial communication # - n is the serial port to use n in [0..3] # - reader is the reader name. It is needed for multi-slot readers. # Possible reader values are: GemPCPinPad, GemCorePOSPro, GemCoreSIMPro, # GemPCTwin (default value) # example: /dev/ttyS0:GemPCPinPad #FRIENDLYNAME "GemPCTwin serial" #DEVICENAME /dev/ttySn[:reader] #LIBPATH /storage/.kodi/addons/service.pcscd/drivers/serial/libccidtwin.so #CHANNELID n ================================================ FILE: packages/addons/service/pcscd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2011 Gregor Fuis (gujs@openelec.tv) # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pcscd" PKG_VERSION="1.0" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain pcsc-lite libusb ccid" PKG_SECTION="service" PKG_SHORTDESC="Middleware to access a smart card using SCard API (PC/SC)" PKG_LONGDESC="Middleware to access a smart card using SCard API (PC/SC)" PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="PC/SC Smart Card Daemon" PKG_ADDON_TYPE="xbmc.service" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ cp -Pa $(get_install_dir pcsc-lite)/usr/sbin/pcscd ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/pcscd.bin cp -a $(get_install_dir ccid)/storage/.kodi/addons/${PKG_ADDON_ID}/drivers ${ADDON_BUILD}/${PKG_ADDON_ID} mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/config cp -Pa ${PKG_DIR}/config/* ${ADDON_BUILD}/${PKG_ADDON_ID}/config/ } ================================================ FILE: packages/addons/service/pcscd/source/bin/pcscd.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.pcscd mkdir -p $ADDON_HOME/config chmod a+x $ADDON_DIR/bin/* if [ ! -f "$ADDON_HOME/config/reader.conf" ]; then cp $ADDON_DIR/config/reader.conf $ADDON_HOME/config/reader.conf fi exec pcscd.bin --foreground -c $ADDON_HOME/config/reader.conf ================================================ FILE: packages/addons/service/pcscd/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == "__main__": Monitor().waitForAbort() ================================================ FILE: packages/addons/service/pcscd/source/system.d/service.pcscd.service ================================================ [Unit] Description=PCSC lite After=graphical.target [Service] ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.pcscd/bin/pcscd.start" TimeoutStopSec=1 Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/proftpd/changelog.txt ================================================ 1 - proftpd bumped to 1.3.8b use TLS protocols v1.2 and v1.3 use 2048-bit key length for certificate initial release ================================================ FILE: packages/addons/service/proftpd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2015 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="proftpd" PKG_VERSION="1.3.8b" PKG_SHA256="183ab7c6107de271a2959ff268f55c9b6c76b2cf0029e6584fccc019686601e0" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.proftpd.org/" PKG_URL="https://github.com/proftpd/proftpd/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libcap openssl ncurses pcre2" PKG_SECTION="service" PKG_SHORTDESC="ProFTPD: a FTP server for linux" PKG_LONGDESC="ProFTPD (${PKG_VERSION}): is a secure and configurable FTP server with SSL/TLS support" PKG_BUILD_FLAGS="-sysroot" PKG_IS_ADDON="yes" PKG_ADDON_NAME="ProFTPD Server" PKG_ADDON_TYPE="xbmc.service" ADDON_DIR="/storage/.kodi/addons/service.proftpd" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --enable-openssl \ --with-modules=mod_tls \ --enable-nls \ --localedir=${ADDON_DIR}/locale \ --enable-sendfile \ --enable-facl \ --enable-autoshadow \ --enable-ctrls \ --enable-ipv6 \ --enable-nls \ --enable-pcre2 \ --enable-largefile \ install_user=$(id -u) \ install_group=$(id -g)" pre_configure_target() { export CFLAGS="${CFLAGS} -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" cd .. rm -rf .${TARGET_NAME} } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp ${PKG_INSTALL}/usr/sbin/proftpd ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp ${PKG_INSTALL}/usr/bin/ftpwho ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp ${PKG_INSTALL}/usr/bin/ftptop ${ADDON_BUILD}/${PKG_ADDON_ID}/bin mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/locale for i in ${PKG_INSTALL}/storage/.kodi/addons/${PKG_ADDON_ID}/locale/*; do cp ${i}/LC_MESSAGES/proftpd.mo ${ADDON_BUILD}/${PKG_ADDON_ID}/locale/${i##*/}.mo done } ================================================ FILE: packages/addons/service/proftpd/patches/proftpd-100-llu.patch ================================================ diff -urN proftpd-1.3.4d-org/include/conf.h proftpd-1.3.4d-new/include/conf.h --- proftpd-1.3.4d-org/include/conf.h 2011-05-23 22:35:35.000000000 +0200 +++ proftpd-1.3.4d-new/include/conf.h 2013-07-20 12:25:28.000000000 +0200 @@ -360,13 +360,9 @@ #endif -#if defined(HAVE_LLU) && SIZEOF_OFF_T == 8 +/* correctly show file size larger than 2GB */ # define PR_LU "llu" # define pr_off_t unsigned long long -#else -# define PR_LU "lu" -# define pr_off_t unsigned long -#endif /******************************************************************** * This is NOT the user configurable section. Look in options.h ================================================ FILE: packages/addons/service/proftpd/source/bin/proftpd.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2012 x23 # Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2012-2015 ultraman # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) . /etc/profile mkdir -p "/storage/.kodi/userdata/addon_data/service.proftpd" oe_setup_addon service.proftpd chmod a+x $ADDON_DIR/bin/* if [ ! -f "$ADDON_HOME/proftpd.conf" ]; then cp $ADDON_DIR/etc/proftpd.conf $ADDON_HOME fi if [ ! -f "$ADDON_HOME/openssl.cnf" ]; then cp $ADDON_DIR/etc/openssl.cnf $ADDON_HOME fi [ -z "$Debuglevel" ] && Debuglevel=0 if [ ! -f "$ADDON_HOME/proftpd.cert.pem" -o ! -f "$ADDON_HOME/proftpd.key.pem" ]; then openssl req -newkey rsa:${CertBitStrength} -config $ADDON_HOME/openssl.cnf -new -x509 -days "$CertTTL" -nodes -out "$ADDON_HOME/proftpd.cert.pem" -keyout "$ADDON_HOME/proftpd.key.pem" fi # Edit proftpd.conf with user settings if [ "$TLSEngine" = "false" ]; then sed -i 's/TLSEngine.*/TLSEngine off/g' $ADDON_HOME/proftpd.conf else sed -i 's/TLSEngine.*/TLSEngine on/g' $ADDON_HOME/proftpd.conf fi if [ "$AllowOverwrite" = "false" ]; then sed -i 's/AllowOverwrite.*/AllowOverwrite off/g' $ADDON_HOME/proftpd.conf else sed -i 's/AllowOverwrite.*/AllowOverwrite on/g' $ADDON_HOME/proftpd.conf fi sed -i 's/^Port.*/Port '$Port'/g' $ADDON_HOME/proftpd.conf sed -i 's/MaxClients .*/MaxClients '$MaxClients'/g' $ADDON_HOME/proftpd.conf sed -i 's/MaxClientsPerHost.*/MaxClientsPerHost '$MaxClientsPerHost'/g' $ADDON_HOME/proftpd.conf sed -i 's/MaxHostsPerUser.*/MaxHostsPerUser '$MaxHostsPerUser'/g' $ADDON_HOME/proftpd.conf sed -i 's/MaxInstances.*/MaxInstances '$MaxInstances'/g' $ADDON_HOME/proftpd.conf sed -i 's/Umask.*/Umask '$Umask'/g' $ADDON_HOME/proftpd.conf sed -i 's/ServerName.*/ServerName "'"$ServerName"'"/g' $ADDON_HOME/proftpd.conf sed -i 's/PassivePorts.*/PassivePorts '$PassivePorts' '$PassivePorts2'/g' $ADDON_HOME/proftpd.conf sed -i '/MasqueradeAddress.*/d' $ADDON_HOME/proftpd.conf if [ "$MasqueradeAddress" = "true" ]; then sed -i '1i\MasqueradeAddress '$MasqueradeAddress2'' $ADDON_HOME/proftpd.conf fi if [ "$ServerIdent" = "false" ]; then sed -i 's/ServerIdent.*/ServerIdent off "'"$ServerIdentText"'"/g' $ADDON_HOME/proftpd.conf else sed -i 's/ServerIdent.*/ServerIdent on "'"$ServerIdentText"'"/g' $ADDON_HOME/proftpd.conf fi if [ "$AllowForeignAddress" = "false" ]; then sed -i 's/AllowForeignAddress.*/AllowForeignAddress off/g' $ADDON_HOME/proftpd.conf else sed -i 's/AllowForeignAddress.*/AllowForeignAddress on/g' $ADDON_HOME/proftpd.conf fi if [ "$AllowStoreRestart" = "false" ]; then sed -i 's/AllowStoreRestart.*/AllowStoreRestart off/g' $ADDON_HOME/proftpd.conf else sed -i 's/AllowStoreRestart.*/AllowStoreRestart on/g' $ADDON_HOME/proftpd.conf fi if [ "$AllowRetrieveRestart" = "false" ]; then sed -i 's/AllowRetrieveRestart.*/AllowRetrieveRestart off/g' $ADDON_HOME/proftpd.conf else sed -i 's/AllowRetrieveRestart.*/AllowRetrieveRestart on/g' $ADDON_HOME/proftpd.conf fi if [ "$RootLogin" = "false" ]; then sed -i 's/RootLogin.*/RootLogin off/g' $ADDON_HOME/proftpd.conf else sed -i 's/RootLogin.*/RootLogin on/g' $ADDON_HOME/proftpd.conf fi if [ "$TLSRequired" = "false" ]; then sed -i 's/TLSRequired.*/TLSRequired off/g' $ADDON_HOME/proftpd.conf else sed -i 's/TLSRequired.*/TLSRequired on/g' $ADDON_HOME/proftpd.conf fi cd "$ADDON_DIR/bin" mkdir -p /var/config/ rm -f /var/config/proftpd.passwd touch /var/config/proftpd.passwd chmod 700 /var/config/proftpd.passwd for NUM in $(seq 1 100); do USERNAME=$(eval echo \$Username${NUM}) USERPASS=$(eval echo \$Userpass${NUM}) USERPATH=$(eval echo \$Userpath${NUM}) case "$CryptoHash" in "0") password_entry=$(openssl passwd -6 "${USERPASS}");; "1") password_entry=$(openssl passwd -5 "${USERPASS}");; "2") password_entry=$(openssl passwd -1 "${USERPASS}");; esac if [ -n "$USERNAME" ]; then echo $USERNAME:$password_entry:10:10::$USERPATH:/bin/false >> /var/config/proftpd.passwd # user writes with different user/group mkdir -p "$USERPATH" chmod 777 "$USERPATH" fi done exec proftpd -n -d $Debuglevel -c $ADDON_HOME/proftpd.conf ================================================ FILE: packages/addons/service/proftpd/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == "__main__": Monitor().waitForAbort() ================================================ FILE: packages/addons/service/proftpd/source/etc/openssl.cnf ================================================ [ req ] prompt = no distinguished_name = req_distinguished_name [ req_distinguished_name ] C = GB ST = Test State L = Test Locality O = Org Name OU = Org Unit Name CN = Common Name emailAddress = test@email.com ================================================ FILE: packages/addons/service/proftpd/source/etc/proftpd.conf ================================================ ServerName "ProFTPD" ServerType standalone DefaultServer on UseReverseDNS off ServerIdent on "FTP Server" Port 21 RootLogin on ListOptions "-il" MaxClients 10 MaxHostsPerUser 5 MaxClientsPerHost 5 Umask 022 MaxInstances 30 User root Group root DefaultRoot ~ AllowForeignAddress on TransferLog /storage/.kodi/userdata/addon_data/service.proftpd/transfer.log ExtendedLog /storage/.kodi/userdata/addon_data/service.proftpd/extended.log SystemLog /storage/.kodi/userdata/addon_data/service.proftpd/service.log # Trace DEFAULT:10 # TraceLog /storage/.kodi/userdata/addon_data/service.proftpd/trace.log AuthGroupFile /etc/group AuthUserFile /var/config/proftpd.passwd RequireValidShell off AuthOrder mod_auth_unix.c mod_auth_file.c* UseFtpUsers off PersistentPasswd off Umask 022 TimesGMT off DenyFilter \*.*/ PassivePorts 45000 45100 AllowOverwrite on AllowStoreRestart on AllowRetrieveRestart on GroupOwner root TLSEngine on TLSProtocol TLSv1.2 TLSv1.3 TLSRequired off TLSVerifyClient off TLSOptions NoSessionReuseRequired TLSRSACertificateFile /storage/.kodi/userdata/addon_data/service.proftpd/proftpd.cert.pem TLSRSACertificateKeyFile /storage/.kodi/userdata/addon_data/service.proftpd/proftpd.key.pem # # UseEncoding utf8 cp1251 # ================================================ FILE: packages/addons/service/proftpd/source/resources/language/resource.language.en_gb/strings.po ================================================ # Kodi Media Center language file # Addon Name: ProFTPD Server # Addon id: service.proftpd # Addon Provider: Team LibreELEC msgid "" msgstr "" "Project-Id-Version: Kodi Addons\n" "Report-Msgid-Bugs-To: https://forum.kodi.tv/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Team-Kodi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: en_GB\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#40000" msgid "General" msgstr "" msgctxt "#40010" msgid "Settings" msgstr "" msgctxt "#40030" msgid "Allow Overwrite" msgstr "" msgctxt "#40040" msgid "Port" msgstr "" msgctxt "#40050" msgid "Max Clients" msgstr "" msgctxt "#40060" msgid "Max Clients per Host" msgstr "" msgctxt "#40070" msgid "Max Hosts per User" msgstr "" msgctxt "#40080" msgid "Max Instances" msgstr "" msgctxt "#40090" msgid "Umask" msgstr "" msgctxt "#40100" msgid "Server Name" msgstr "" msgctxt "#40110" msgid "Server Ident" msgstr "" msgctxt "#40120" msgid "Server Ident Text" msgstr "" msgctxt "#40180" msgid "Allow Store Restart" msgstr "" msgctxt "#40190" msgid "Allow Retrieve Restart" msgstr "" msgctxt "#40200" msgid "Allow Root Login" msgstr "" msgctxt "#40210" msgid "Debug level" msgstr "" msgctxt "#50000" msgid "User" msgstr "" msgctxt "#50010" msgid "Hash Algorithm" msgstr "" msgctxt "#50020" msgid "Username 1" msgstr "" msgctxt "#50030" msgid "User Password 1" msgstr "" msgctxt "#50040" msgid "User Path 1" msgstr "" msgctxt "#50050" msgid "Username 2" msgstr "" msgctxt "#50060" msgid "User Password 2" msgstr "" msgctxt "#50070" msgid "User Path 2" msgstr "" msgctxt "#50080" msgid "Username 3" msgstr "" msgctxt "#50090" msgid "User Password 3" msgstr "" msgctxt "#50100" msgid "User Path 3" msgstr "" msgctxt "#50110" msgid "Username 4" msgstr "" msgctxt "#50120" msgid "User Password 4" msgstr "" msgctxt "#50130" msgid "User Path 4" msgstr "" msgctxt "#50140" msgid "Username 5" msgstr "" msgctxt "#50150" msgid "User Password 5" msgstr "" msgctxt "#50160" msgid "User Path 5" msgstr "" msgctxt "#60000" msgid "TLS" msgstr "" msgctxt "#60010" msgid "Allow TLS Engine" msgstr "" msgctxt "#60020" msgid "TLS Required" msgstr "" msgctxt "#60030" msgid "Certificat Lifetime (Days)" msgstr "" msgctxt "#60040" msgid "Certificat Hash Algorithm" msgstr "" msgctxt "#60050" msgid "Certificat Cryptosystem" msgstr "" msgctxt "#60060" msgid "Certificat Bit-Strength" msgstr "" msgctxt "#70000" msgid "FXP" msgstr "" msgctxt "#70010" msgid "Allow Foreign Address" msgstr "" msgctxt "#70020" msgid "Passive Portrange Start" msgstr "" msgctxt "#70030" msgid "Passive Portrange End" msgstr "" msgctxt "#70040" msgid "Enable Masquerade Address" msgstr "" msgctxt "#70050" msgid "Masquerade Address" msgstr "" ================================================ FILE: packages/addons/service/proftpd/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/proftpd/source/settings-default.xml ================================================ ================================================ FILE: packages/addons/service/proftpd/source/system.d/service.proftpd.service ================================================ [Unit] Description=ProFTPD After=network-online.service Requires=network-online.service [Service] ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.proftpd/bin/proftpd.start" TimeoutStopSec=2 Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=multi-user.target ================================================ FILE: packages/addons/service/prometheus-node-exporter/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/prometheus-node-exporter/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="prometheus-node-exporter" PKG_VERSION="1.5.0" PKG_SHA256="67c6d59359d8c484e1e28d0a52a971eebe687f083c5fbb35c5e651543e5d0ea4" PKG_REV="0" PKG_LICENSE="Apache License 2.0" PKG_SITE="https://github.com/prometheus/node_exporter" PKG_URL="https://github.com/prometheus/node_exporter/archive/refs/tags/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain go:host systemd" PKG_SECTION="service" PKG_SHORTDESC="Prometheus exporter for machine metrics." PKG_LONGDESC="Prometheus exporter for hardware and OS metrics exposed by the kernel." PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Prometheus Node Exporter" PKG_ADDON_TYPE="xbmc.service" configure_target() { go_configure export LDFLAGS="-w -linkmode external -extldflags -Wl,--unresolved-symbols=ignore-in-shared-libs -extld ${CC} \ -X github.com/prometheus/common/version.Version=${PKG_VERSION} \ -X github.com/prometheus/common/version.Revision=${PKG_REV} \ -X github.com/prometheus/common/version.Branch=master \ -X github.com/prometheus/common/version.BuildUser=root@libreelec \ -X github.com/prometheus/common/version.BuildDate=$(date '+%Y%m%d-%H:%M:%S')" } make_target() { ${GOLANG} build -a -ldflags "${LDFLAGS}" -o bin/prometheus-node-exporter -v } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P ${PKG_BUILD}/bin/prometheus-node-exporter ${ADDON_BUILD}/${PKG_ADDON_ID}/bin } ================================================ FILE: packages/addons/service/prometheus-node-exporter/source/bin/prometheus-node-exporter.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.prometheus-node-exporter DAEMON_ARGS="" while read var opt ; do eval [ \"\$${var}\" = "true" ] && DAEMON_ARGS="${DAEMON_ARGS} ${opt}" done << EOF WebDisableExporterMetrics --web.disable-exporter-metrics CollectorArp --collector.arp CollectorBcache --collector.bcache CollectorBonding --collector.bonding CollectorBtrfs --collector.btrfs CollectorBuddyinfo --collector.buddyinfo CollectorConntrack --collector.conntrack CollectorCpu --collector.cpu CollectorCpufreq --collector.cpufreq CollectorDiskstats --collector.diskstats CollectorDrbd --collector.drbd CollectorEdac --collector.edac CollectorEntropy --collector.entropy CollectorEthtool --collector.ethtool CollectorFibrechannel --collector.fibrechannel CollectorFilefd --collector.filefd CollectorFilesystem --collector.filesystem CollectorHwmon --collector.hwmon CollectorInfiniband --collector.infiniband CollectorInterrupts --collector.interrupts CollectorIpvs --collector.ipvs CollectorKsmd --collector.ksmd CollectorLoadavg --collector.loadavg CollectorLogind --collector.logind CollectorMdadm --collector.mdadm CollectorMeminfo --collector.meminfo CollectorMeminfoNuma --collector.meminfo_numa CollectorMountstats --collector.mountstats CollectorNetclass --collector.netclass CollectorNetdev --collector.netdev CollectorNetstat --collector.netstat CollectorNetworkRoute --collector.network_route CollectorNfs --collector.nfs CollectorNfsd --collector.nfsd CollectorNtp --collector.ntp CollectorNvme --collector.nvme CollectorPerf --collector.perf CollectorPowersupplyclass --collector.powersupplyclass CollectorPressure --collector.pressure CollectorProcesses --collector.processes CollectorQdisc --collector.qdisc CollectorRapl --collector.rapl CollectorRunit --collector.runit CollectorSchedstat --collector.schedstat CollectorSockstat --collector.sockstat CollectorSoftnet --collector.softnet CollectorStat --collector.stat CollectorSupervisord --collector.supervisord CollectorSystemd --collector.systemd CollectorTapestats --collector.tapestats CollectorTcpstat --collector.tcpstat CollectorTextfile --collector.textfile CollectorThermalZone --collector.thermal_zone CollectorTime --collector.time CollectorTimex --collector.timex CollectorUdpQueues --collector.udp_queues CollectorUname --collector.uname CollectorVmstat --collector.vmstat CollectorWifi --collector.wifi CollectorXfs --collector.xfs CollectorZfs --collector.zfs CollectorZoneinfo --collector.zoneinfo EOF /storage/.kodi/addons/service.prometheus-node-exporter/bin/prometheus-node-exporter --collector.disable-defaults \ --web.listen-address=":$WebListenPort" \ --web.telemetry-path="$WebTelemetryPath" \ --web.max-requests=$WebMaxRequest \ $DAEMON_ARGS ================================================ FILE: packages/addons/service/prometheus-node-exporter/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == "__main__": Monitor().waitForAbort() ================================================ FILE: packages/addons/service/prometheus-node-exporter/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: node_exporter # Addon id: service.node_exporter # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "General" msgstr "" msgctxt "#30001" msgid "Listen Port" msgstr "" msgctxt "#30002" msgid "Metrics web path" msgstr "" msgctxt "#30003" msgid "Disable exporter self metrics" msgstr "" msgctxt "#30004" msgid "Max simultaneous request" msgstr "" msgctxt "#30100" msgid "Collectors" msgstr "" msgctxt "#30101" msgid "Arp" msgstr "" msgctxt "#30102" msgid "Bcache" msgstr "" msgctxt "#30103" msgid "Bonding" msgstr "" msgctxt "#30104" msgid "Btrfs" msgstr "" msgctxt "#30105" msgid "Buddyinfo" msgstr "" msgctxt "#30106" msgid "Conntrack" msgstr "" msgctxt "#30107" msgid "Cpu" msgstr "" msgctxt "#30108" msgid "Cpufreq" msgstr "" msgctxt "#30109" msgid "Diskstats" msgstr "" msgctxt "#30110" msgid "Drbd" msgstr "" msgctxt "#30111" msgid "Edac" msgstr "" msgctxt "#30112" msgid "Entropy" msgstr "" msgctxt "#30113" msgid "Ethtool" msgstr "" msgctxt "#30114" msgid "Fibrechannel" msgstr "" msgctxt "#30115" msgid "Filefd" msgstr "" msgctxt "#30116" msgid "Filesystem" msgstr "" msgctxt "#30117" msgid "Hwmon" msgstr "" msgctxt "#30118" msgid "Infiniband" msgstr "" msgctxt "#30119" msgid "Interrupts" msgstr "" msgctxt "#30120" msgid "Ipvs" msgstr "" msgctxt "#30121" msgid "Ksmd" msgstr "" msgctxt "#30122" msgid "Loadavg" msgstr "" msgctxt "#30123" msgid "Logind" msgstr "" msgctxt "#30124" msgid "Mdadm" msgstr "" msgctxt "#30125" msgid "Meminfo" msgstr "" msgctxt "#30126" msgid "MeminfoNuma" msgstr "" msgctxt "#30127" msgid "Mountstats" msgstr "" msgctxt "#30128" msgid "Netclass" msgstr "" msgctxt "#30129" msgid "Netdev" msgstr "" msgctxt "#30130" msgid "Netstat" msgstr "" msgctxt "#30131" msgid "Network Route" msgstr "" msgctxt "#30132" msgid "Nfs" msgstr "" msgctxt "#30133" msgid "Nfsd" msgstr "" msgctxt "#30134" msgid "Ntp" msgstr "" msgctxt "#30135" msgid "Nvme" msgstr "" msgctxt "#30136" msgid "Perf" msgstr "" msgctxt "#30137" msgid "Powersupplyclass" msgstr "" msgctxt "#30138" msgid "Pressure" msgstr "" msgctxt "#30139" msgid "Processes" msgstr "" msgctxt "#30140" msgid "Qdisc" msgstr "" msgctxt "#30141" msgid "Rapl" msgstr "" msgctxt "#30142" msgid "Runit" msgstr "" msgctxt "#30143" msgid "Schedstat" msgstr "" msgctxt "#30144" msgid "Sockstat" msgstr "" msgctxt "#30145" msgid "Softnet" msgstr "" msgctxt "#30146" msgid "Stat" msgstr "" msgctxt "#30147" msgid "Supervisord" msgstr "" msgctxt "#30148" msgid "Systemd" msgstr "" msgctxt "#30149" msgid "Tapestats" msgstr "" msgctxt "#30150" msgid "Tcpstat" msgstr "" msgctxt "#30151" msgid "Textfile" msgstr "" msgctxt "#30152" msgid "Thermal Zone" msgstr "" msgctxt "#30153" msgid "Time" msgstr "" msgctxt "#30154" msgid "Timex" msgstr "" msgctxt "#30155" msgid "Udp Queues" msgstr "" msgctxt "#30156" msgid "Uname" msgstr "" msgctxt "#30157" msgid "Vmstat" msgstr "" msgctxt "#30158" msgid "Wifi" msgstr "" msgctxt "#30159" msgid "Xfs" msgstr "" msgctxt "#30160" msgid "Zfs" msgstr "" msgctxt "#30161" msgid "Zoneinfo" msgstr "" ================================================ FILE: packages/addons/service/prometheus-node-exporter/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/prometheus-node-exporter/source/settings-default.xml ================================================ ================================================ FILE: packages/addons/service/prometheus-node-exporter/source/system.d/service.prometheus-node-exporter.service ================================================ [Unit] Description=Prometheus Node Exporter service After=network-online.target Requires=network-online.target [Service] ExecStart=/storage/.kodi/addons/service.prometheus-node-exporter/bin/prometheus-node-exporter.start Restart=always [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/rsyslog/changelog.txt ================================================ 1 - libfastjson: update to 1.2304.0 - rsyslog: update to 8.2308.0 ================================================ FILE: packages/addons/service/rsyslog/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rsyslog" PKG_VERSION="8.2308.0" PKG_SHA256="02086b9121e872cea69e5d0f6c8e2d8ebff33234b3cad5503665378d3af2e3c9" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/rsyslog" PKG_URL="https://www.rsyslog.com/files/download/rsyslog/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain curl libestr libfastjson libgcrypt liblogging liblognorm librelp util-linux zlib" PKG_SECTION="service" PKG_SHORTDESC="Rsyslog: a rocket-fast system for log processing." PKG_LONGDESC="Rsyslog (${PKG_VERSION}) offers high-performance, great security features and a modular design." PKG_BUILD_FLAGS="-sysroot" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Rsyslog" PKG_ADDON_TYPE="xbmc.service" PKG_CONFIGURE_OPTS_TARGET="--disable-default-tests \ --enable-imfile \ --enable-imjournal \ --enable-relp \ --enable-omjournal \ ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes" export LIBGCRYPT_CONFIG="${SYSROOT_PREFIX}/usr/bin/libgcrypt-config" pre_configure_target() { CFLAGS+=" -fcommon" } post_configure_target() { libtool_remove_rpath libtool } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp ${PKG_INSTALL}/usr/sbin/rsyslogd \ ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/rsyslog for l in $(find ${PKG_INSTALL}/usr/lib -name *.so) do cp ${l} ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/rsyslog/ done } ================================================ FILE: packages/addons/service/rsyslog/source/bin/rsyslog.init ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.rsyslog [ "$RSYSLOG_MANUAL" == "true" ] && exit ( if [ ! -z "$RSYSLOG_IP_NAME_FQDN" ] then cat "$ADDON_DIR/config/common.conf" [ "$RSYSLOG_PROTOCOL" == "RELP" ] && cat "$ADDON_DIR/config/relp.conf" [ "$RSYSLOG_JOURNAL_LOGGING" == "true" ] && cat "$ADDON_DIR/config/journal.conf" [ "$RSYSLOG_KODI_LOGGING" == "true" ] && cat "$ADDON_DIR/config/kodi.conf" [ "$RSYSLOG_PROTOCOL" == "UDP" ] && PROTOCOL="@" [ "$RSYSLOG_PROTOCOL" == "TCP" ] && PROTOCOL="@@" [ "$RSYSLOG_PROTOCOL" == "RELP" ] && PROTOCOL="omrelp" [ "$RSYSLOG_PROTOCOL" == "RELP" ] && ZLIB="0" || [ "$RSYSLOG_ZLIB_COMPRESSION" == "true" ] && ZLIB="$RSYSLOG_ZLIB_COMPRESSION_LEVEL" || ZLIB="0" [ "$RSYSLOG_PROTOCOL" == "RELP" ] && echo "action(type=\"$PROTOCOL\" target=\"$RSYSLOG_IP_NAME_FQDN\" port=\"$RSYSLOG_PORT\")" || echo "action(type=\"omfwd\" target=\"$RSYSLOG_IP_NAME_FQDN\" protocol=\"$RSYSLOG_PROTOCOL\" port=\"$RSYSLOG_PORT\")" fi ) > "$ADDON_HOME/rsyslog.conf" ================================================ FILE: packages/addons/service/rsyslog/source/config/common.conf ================================================ module(load="imuxsock" SysSock.RateLimit.Interval="1" sysSock.parseHostname="on") $AddUnixListenSocket /run/systemd/journal/syslog $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat $WorkDirectory /storage/.kodi/temp ================================================ FILE: packages/addons/service/rsyslog/source/config/journal.conf ================================================ module(load="imjournal") module(load="omjournal") module(load="imklog") ================================================ FILE: packages/addons/service/rsyslog/source/config/kodi.conf ================================================ module(load="imfile") input(type="imfile" File="/storage/.kodi/temp/kodi.log" Tag="kodi" Severity="emerg" Facility="local0" deleteStateOnFileDelete="on" escapeLF="on" PersistStateInterval="5") input(type="imfile" File="/storage/.kodi/temp/kodi.log" Tag="kodi" Severity="alert" Facility="local1" deleteStateOnFileDelete="on" escapeLF="on" PersistStateInterval="5") input(type="imfile" File="/storage/.kodi/temp/kodi.log" Tag="kodi" Severity="crit" Facility="local2" deleteStateOnFileDelete="on" escapeLF="on" PersistStateInterval="5") input(type="imfile" File="/storage/.kodi/temp/kodi.log" Tag="kodi" Severity="error" Facility="local3" deleteStateOnFileDelete="on" escapeLF="on" PersistStateInterval="5") input(type="imfile" File="/storage/.kodi/temp/kodi.log" Tag="kodi" Severity="warning" Facility="local4" deleteStateOnFileDelete="on" escapeLF="on" PersistStateInterval="5") input(type="imfile" File="/storage/.kodi/temp/kodi.log" Tag="kodi" Severity="notice" Facility="local5" deleteStateOnFileDelete="on" escapeLF="on" PersistStateInterval="5") input(type="imfile" File="/storage/.kodi/temp/kodi.log" Tag="kodi" Severity="info" Facility="local6" deleteStateOnFileDelete="on" escapeLF="on" PersistStateInterval="5") input(type="imfile" File="/storage/.kodi/temp/kodi.log" Tag="kodi" Severity="debug" Facility="local7" deleteStateOnFileDelete="on" escapeLF="on" PersistStateInterval="5") ================================================ FILE: packages/addons/service/rsyslog/source/config/relp.conf ================================================ module(load="omrelp") ================================================ FILE: packages/addons/service/rsyslog/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon ADDON = xbmcaddon.Addon() class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == "__main__": if ADDON.getSetting('RSYSLOG_WIZARD') == 'true': try: ADDON.openSettings(id) ADDON.setSetting('RSYSLOG_WIZARD', 'false') except: pass Monitor().waitForAbort() ================================================ FILE: packages/addons/service/rsyslog/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: service.rsyslog msgid "" msgstr "" msgctxt "#30000" msgid "Configuration" msgstr "" msgctxt "#30001" msgid "Configure rsyslog.conf manually" msgstr "" msgctxt "#30002" msgid "IP | Name | FQDN" msgstr "" msgctxt "#30003" msgid "Port" msgstr "" msgctxt "#30004" msgid "Protocol" msgstr "" msgctxt "#30005" msgid "Log journal and kernel" msgstr "" msgctxt "#30006" msgid "Log Kodi" msgstr "" msgctxt "#30007" msgid "Zlib Compression" msgstr "" msgctxt "#30008" msgid "Level" msgstr "" ================================================ FILE: packages/addons/service/rsyslog/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/rsyslog/source/settings-default.xml ================================================ false true false 514 UDP false false 0 ================================================ FILE: packages/addons/service/rsyslog/source/system.d/service.rsyslog.service ================================================ [Unit] Description=System Logging Service Requires=syslog.socket Documentation=http://www.rsyslog.com/doc/ [Service] Type=notify Environment=RSYSLOG_MODDIR=/storage/.kodi/addons/service.rsyslog/lib/rsyslog/ ExecStartPre=/bin/sh /storage/.kodi/addons/service.rsyslog/bin/rsyslog.init ExecStart=/storage/.kodi/addons/service.rsyslog/bin/rsyslogd -n -f /storage/.kodi/userdata/addon_data/service.rsyslog/rsyslog.conf StandardOutput=null Restart=on-failure [Install] WantedBy=kodi.target Alias=syslog.service ================================================ FILE: packages/addons/service/snapclient/changelog.txt ================================================ 2 - asio: update to 1.28.0 - nqptp: update to 1.2.1 - shairport-sync: update to 4.2 1 - asio: update to 1.27.0 - snapcast: update to 0.27.0 ================================================ FILE: packages/addons/service/snapclient/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="snapclient" PKG_VERSION="0.27.0" PKG_REV="2" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_DEPENDS_TARGET="toolchain alsa-plugins snapcast" PKG_SECTION="service" PKG_SHORTDESC="Snapclient: Synchronous multi-room audio client" PKG_LONGDESC="Snapclient (${PKG_VERSION}) is a Snapcast client. Snapcast is a multi-room client-server audio system, where all clients are time synchronized with the server to play perfectly synced audioplays." PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Snapclient" PKG_ADDON_TYPE="xbmc.service.library" PKG_MAINTAINER="Anton Voyl (awiouy)" addon() { mkdir -p "${ADDON_BUILD}/${PKG_ADDON_ID}/bin" cp "$(get_install_dir snapcast)/usr/bin/snapclient" \ "${ADDON_BUILD}/${PKG_ADDON_ID}/bin" mkdir -p "${ADDON_BUILD}/${PKG_ADDON_ID}/lib" cp "$(get_install_dir alsa-plugins)/usr/lib/alsa"/*.so \ "${ADDON_BUILD}/${PKG_ADDON_ID}/lib" } ================================================ FILE: packages/addons/service/snapclient/source/addon.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) import os.path import subprocess import xbmcaddon import xbmcgui SNAPCLIENT = os.path.join( xbmcaddon.Addon().getAddonInfo('path'), 'bin', 'snapclient') line = '' card = '' cards = [] lines = subprocess.run([SNAPCLIENT, '--list'], capture_output=True, text=True).stdout.splitlines() for line in lines: if line != '': card = card + ' ' + line else: cards.append(card) card = '' # If last line was not empty, make sure to add the last card if line != '' and card != '': cards.append(card) dialog = xbmcgui.Dialog() dialog.select(xbmcaddon.Addon().getLocalizedString(30015), cards) del dialog ================================================ FILE: packages/addons/service/snapclient/source/bin/snapclient.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.snapclient . /etc/os-release case "$LIBREELEC_ARCH" in RPi*.arm) if [ "$sc_a" == "true" ]; then ALSA="/proc/asound/ALSA" if [ ! -e "$ALSA" ]; then echo "Starting Raspberry Pi onboard audio" dtparam audio=on sleep 1 fi if [ -e "$ALSA" ]; then echo "Setting Raspberry Pi onboard audio playback route" index="$(readlink $ALSA)" index="${index##*card}" amixer -c "$index" cset name="PCM Playback Route" "$sc_r" fi fi ;; esac [ -n "$sc_h" ] && sc_H="--hostID $sc_h" [ -n "$sc_s" ] && sc_S="--soundcard $sc_s" [ -n "$sc_addr" ] && HOST="--host $sc_addr" HOME="$ADDON_HOME" \ nice -n "$sc_n" \ snapclient \ $sc_H \ --latency "$sc_l" \ $HOST \ --port "$sc_p" \ $sc_S \ > /dev/null ================================================ FILE: packages/addons/service/snapclient/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon def systemctl(command): subprocess.call( ['systemctl', command, xbmcaddon.Addon().getAddonInfo('id')]) class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.player = Player() def onSettingsChanged(self): self.player.start('restart') class Player(xbmc.Player): def __init__(self): super(Player, self).__init__(self) self.start('start') def onPlayBackEnded(self): if xbmcaddon.Addon().getSetting('sc_k') == 'true': xbmc.sleep(500) if not self.isPlaying(): systemctl('start') def onPlayBackStarted(self): if xbmcaddon.Addon().getSetting('sc_k') == 'true': systemctl('stop') def onPlayBackStopped(self): if xbmcaddon.Addon().getSetting('sc_k') == 'true': systemctl('start') def start(self, command): if xbmcaddon.Addon().getSetting('sc_k') == 'true': if self.isPlaying(): systemctl('stop') else: systemctl(command) else: systemctl(command) if __name__ == '__main__': Monitor().waitForAbort() ================================================ FILE: packages/addons/service/snapclient/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: snapclient # Addon id: service.snapclient # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "Snapclient" msgstr "" msgctxt "#30001" msgid "List sound cards" msgstr "" msgctxt "#30002" msgid "Sound card" msgstr "" msgctxt "#30003" msgid "Host ID" msgstr "" msgctxt "#30004" msgid "Port" msgstr "" msgctxt "#30005" msgid "Priority" msgstr "" msgctxt "#30006" msgid "Latency" msgstr "" msgctxt "#30007" msgid "Kodi" msgstr "" msgctxt "#30008" msgid "Stop Snapclient when Kodi plays" msgstr "" msgctxt "#30009" msgid "Rasperry Pi" msgstr "" msgctxt "#30010" msgid "Manage onboard audio" msgstr "" msgctxt "#30011" msgid "Onboard audio playback route" msgstr "" msgctxt "#30012" msgid "Autodetect" msgstr "" msgctxt "#30013" msgid "Jack" msgstr "" msgctxt "#30014" msgid "HDMI" msgstr "" msgctxt "#30015" msgid "Available sound cards" msgstr "" msgctxt "#30016" msgid "Server" msgstr "" ================================================ FILE: packages/addons/service/snapclient/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/snapclient/source/settings-default.xml ================================================ false false 0 -3 1704 0 ================================================ FILE: packages/addons/service/snapclient/source/system.d/service.snapclient.service ================================================ [Unit] Description=Snapclient After=kodi.service network-online.target sound.target Requires=kodi.service network-online.target sound.target [Service] Environment=ALSA_PLUGIN_DIR=/storage/.kodi/addons/service.snapclient/lib ExecStart=/bin/sh /storage/.kodi/addons/service.snapclient/bin/snapclient.start Restart=always [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/snapserver/changelog.txt ================================================ 2 - asio: update to 1.28.0 - nqptp: update to 1.2.1 - shairport-sync: update to 4.2 1 - asio: update to 1.27.0 - snapcast: update to 0.27.0 ================================================ FILE: packages/addons/service/snapserver/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="snapserver" PKG_VERSION="0.27.0" PKG_REV="2" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_DEPENDS_TARGET="toolchain nqptp shairport-sync snapcast" PKG_SECTION="service" PKG_SHORTDESC="Snapserver: Synchronous multi-room audio server" PKG_LONGDESC="Snapclient (${PKG_VERSION}) is a Snapcast server. Snapcast is a multi-room client-server audio system, where all clients are time synchronized with the server to play perfectly synced audioplays." PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Snapserver" PKG_ADDON_TYPE="xbmc.service" PKG_ADDON_REQUIRES="service.librespot:0.0.0" PKG_MAINTAINER="Anton Voyl (awiouy)" addon() { mkdir -p "${ADDON_BUILD}/${PKG_ADDON_ID}/bin" cp "$(get_install_dir shairport-sync)/usr/bin/shairport-sync" \ "$(get_install_dir nqptp)/usr/bin/nqptp" \ "$(get_install_dir snapcast)/usr/bin/snapserver" \ "${ADDON_BUILD}/${PKG_ADDON_ID}/bin" cp -Pr ${PKG_DIR}/snapweb ${ADDON_BUILD}/${PKG_ADDON_ID}/ } ================================================ FILE: packages/addons/service/snapserver/snapweb/3rd-party/libflac.js ================================================ // The Module object: Our interface to the outside world. We import // and export values on it. There are various ways Module can be used: // 1. Not defined. We create it here // 2. A function parameter, function(Module) { ..generated code.. } // 3. pre-run appended it, var Module = {}; ..generated code.. // 4. External script tag defines var Module. // We need to check if Module already exists (e.g. case 3 above). // Substitution will be replaced with actual code on later stage of the build, // this way Closure Compiler will not mangle it (e.g. case 4. above). // Note that if you want to run closure, and also to use Module // after the generated code, you will need to define var Module = {}; // before the code. Then that object will be used in the code, and you // can continue to use Module afterwards as well. var Module = typeof Module !== 'undefined' ? Module : {}; // --pre-jses are emitted after the Module integration code, so that they can // refer to Module (if they choose; they can also define Module) // libflac.js - port of libflac to JavaScript using emscripten (function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['module', 'require'], factory.bind(null, root)); } else if (typeof module === 'object' && module.exports) { // Node. Does not work with strict CommonJS, but // only CommonJS-like environments that support module.exports, // like Node. // use process.env (if available) for reading Flac environment settings: var env = typeof process !== 'undefined' && process && process.env? process.env : root; factory(env, module, module.require); } else { // Browser globals root.Flac = factory(root); } }(typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : this, function (global, expLib, require) { 'use strict'; var Module = Module || {}; var _flac_ready = false; //in case resources are loaded asynchronously (e.g. *.mem file for minified version): setup "ready" handling Module["onRuntimeInitialized"] = function(){ _flac_ready = true; if(!_exported){ //if _exported is not yet set (may happen, in case initialization was strictly synchronously), // do "pause" until sync initialization has run through setTimeout(function(){do_fire_event('ready', [{type: 'ready', target: _exported}], true);}, 0); } else { do_fire_event('ready', [{type: 'ready', target: _exported}], true); } }; if(global && global.FLAC_SCRIPT_LOCATION){ Module["locateFile"] = function(fileName){ var path = global.FLAC_SCRIPT_LOCATION || ''; if(path[fileName]){ return path[fileName]; } path += path && !/\/$/.test(path)? '/' : ''; return path + fileName; }; //NOTE will be overwritten if emscripten has env specific implementation for this var readBinary = function(filePath){ //for Node: use default implementation (copied from generated code): if(ENVIRONMENT_IS_NODE){ var ret = read_(filePath, true); if (!ret.buffer) { ret = new Uint8Array(ret); } assert(ret.buffer); return ret; } //otherwise: try "fallback" to AJAX return new Promise(function(resolve, reject){ var xhr = new XMLHttpRequest(); xhr.responseType = "arraybuffer"; xhr.addEventListener("load", function(evt){ resolve(xhr.response); }); xhr.addEventListener("error", function(err){ reject(err); }); xhr.open("GET", filePath); xhr.send(); }); }; } //fallback for fetch && support file://-protocol: try read as binary if fetch fails if(global && typeof global.fetch === 'function'){ var _fetch = global.fetch; global.fetch = function(url){ return _fetch.apply(null, arguments).catch(function(err){ try{ var result = readBinary(url); if(result && result.catch){ result.catch(function(_err){throw err}); } return result; } catch(_err){ throw err; } }); }; } // Sometimes an existing Module object exists with properties // meant to overwrite the default module functionality. Here // we collect those properties and reapply _after_ we configure // the current environment's defaults to avoid having to be so // defensive during initialization. var moduleOverrides = {}; var key; for (key in Module) { if (Module.hasOwnProperty(key)) { moduleOverrides[key] = Module[key]; } } var arguments_ = []; var thisProgram = './this.program'; var quit_ = function(status, toThrow) { throw toThrow; }; // Determine the runtime environment we are in. You can customize this by // setting the ENVIRONMENT setting at compile time (see settings.js). var ENVIRONMENT_IS_WEB = false; var ENVIRONMENT_IS_WORKER = false; var ENVIRONMENT_IS_NODE = false; var ENVIRONMENT_IS_SHELL = false; ENVIRONMENT_IS_WEB = typeof window === 'object'; ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; // N.b. Electron.js environment is simultaneously a NODE-environment, but // also a web environment. ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string'; ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; // `/` should be present at the end if `scriptDirectory` is not empty var scriptDirectory = ''; function locateFile(path) { if (Module['locateFile']) { return Module['locateFile'](path, scriptDirectory); } return scriptDirectory + path; } // Hooks that are implemented differently in different runtime environments. var read_, readAsync, readBinary, setWindowTitle; var nodeFS; var nodePath; if (ENVIRONMENT_IS_NODE) { if (ENVIRONMENT_IS_WORKER) { scriptDirectory = require('path').dirname(scriptDirectory) + '/'; } else { scriptDirectory = __dirname + '/'; } read_ = function shell_read(filename, binary) { var ret = tryParseAsDataURI(filename); if (ret) { return binary ? ret : ret.toString(); } if (!nodeFS) nodeFS = require('fs'); if (!nodePath) nodePath = require('path'); filename = nodePath['normalize'](filename); return nodeFS['readFileSync'](filename, binary ? null : 'utf8'); }; readBinary = function readBinary(filename) { var ret = read_(filename, true); if (!ret.buffer) { ret = new Uint8Array(ret); } assert(ret.buffer); return ret; }; if (process['argv'].length > 1) { thisProgram = process['argv'][1].replace(/\\/g, '/'); } arguments_ = process['argv'].slice(2); if (typeof module !== 'undefined') { module['exports'] = Module; } quit_ = function(status) { process['exit'](status); }; Module['inspect'] = function () { return '[Emscripten Module object]'; }; } else if (ENVIRONMENT_IS_SHELL) { if (typeof read != 'undefined') { read_ = function shell_read(f) { var data = tryParseAsDataURI(f); if (data) { return intArrayToString(data); } return read(f); }; } readBinary = function readBinary(f) { var data; data = tryParseAsDataURI(f); if (data) { return data; } if (typeof readbuffer === 'function') { return new Uint8Array(readbuffer(f)); } data = read(f, 'binary'); assert(typeof data === 'object'); return data; }; if (typeof scriptArgs != 'undefined') { arguments_ = scriptArgs; } else if (typeof arguments != 'undefined') { arguments_ = arguments; } if (typeof quit === 'function') { quit_ = function(status) { quit(status); }; } if (typeof print !== 'undefined') { // Prefer to use print/printErr where they exist, as they usually work better. if (typeof console === 'undefined') console = /** @type{!Console} */({}); console.log = /** @type{!function(this:Console, ...*): undefined} */ (print); console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr !== 'undefined' ? printErr : print); } } else // Note that this includes Node.js workers when relevant (pthreads is enabled). // Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and // ENVIRONMENT_IS_NODE. if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled scriptDirectory = self.location.href; } else if (document.currentScript) { // web scriptDirectory = document.currentScript.src; } // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. // otherwise, slice off the final part of the url to find the script directory. // if scriptDirectory does not contain a slash, lastIndexOf will return -1, // and scriptDirectory will correctly be replaced with an empty string. if (scriptDirectory.indexOf('blob:') !== 0) { scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf('/')+1); } else { scriptDirectory = ''; } // Differentiate the Web Worker from the Node Worker case, as reading must // be done differently. { read_ = function shell_read(url) { try { var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); xhr.send(null); return xhr.responseText; } catch (err) { var data = tryParseAsDataURI(url); if (data) { return intArrayToString(data); } throw err; } }; if (ENVIRONMENT_IS_WORKER) { readBinary = function readBinary(url) { try { var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); xhr.responseType = 'arraybuffer'; xhr.send(null); return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); } catch (err) { var data = tryParseAsDataURI(url); if (data) { return data; } throw err; } }; } readAsync = function readAsync(url, onload, onerror) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'arraybuffer'; xhr.onload = function xhr_onload() { if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 onload(xhr.response); return; } var data = tryParseAsDataURI(url); if (data) { onload(data.buffer); return; } onerror(); }; xhr.onerror = onerror; xhr.send(null); }; } setWindowTitle = function(title) { document.title = title }; } else { } // Set up the out() and err() hooks, which are how we can print to stdout or // stderr, respectively. var out = Module['print'] || console.log.bind(console); var err = Module['printErr'] || console.warn.bind(console); // Merge back in the overrides for (key in moduleOverrides) { if (moduleOverrides.hasOwnProperty(key)) { Module[key] = moduleOverrides[key]; } } // Free the object hierarchy contained in the overrides, this lets the GC // reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. moduleOverrides = null; // Emit code to handle expected values on the Module object. This applies Module.x // to the proper local x. This has two benefits: first, we only emit it if it is // expected to arrive, and second, by using a local everywhere else that can be // minified. if (Module['arguments']) arguments_ = Module['arguments']; if (Module['thisProgram']) thisProgram = Module['thisProgram']; if (Module['quit']) quit_ = Module['quit']; // perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message // {{PREAMBLE_ADDITIONS}} var STACK_ALIGN = 16; function dynamicAlloc(size) { var ret = HEAP32[DYNAMICTOP_PTR>>2]; var end = (ret + size + 15) & -16; HEAP32[DYNAMICTOP_PTR>>2] = end; return ret; } function alignMemory(size, factor) { if (!factor) factor = STACK_ALIGN; // stack alignment (16-byte) by default return Math.ceil(size / factor) * factor; } function getNativeTypeSize(type) { switch (type) { case 'i1': case 'i8': return 1; case 'i16': return 2; case 'i32': return 4; case 'i64': return 8; case 'float': return 4; case 'double': return 8; default: { if (type[type.length-1] === '*') { return 4; // A pointer } else if (type[0] === 'i') { var bits = Number(type.substr(1)); assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); return bits / 8; } else { return 0; } } } } function warnOnce(text) { if (!warnOnce.shown) warnOnce.shown = {}; if (!warnOnce.shown[text]) { warnOnce.shown[text] = 1; err(text); } } // Wraps a JS function as a wasm function with a given signature. function convertJsFunctionToWasm(func, sig) { return func; } var freeTableIndexes = []; // Weak map of functions in the table to their indexes, created on first use. var functionsInTableMap; // Add a wasm function to the table. function addFunctionWasm(func, sig) { var table = wasmTable; // Check if the function is already in the table, to ensure each function // gets a unique index. First, create the map if this is the first use. if (!functionsInTableMap) { functionsInTableMap = new WeakMap(); for (var i = 0; i < table.length; i++) { var item = table.get(i); // Ignore null values. if (item) { functionsInTableMap.set(item, i); } } } if (functionsInTableMap.has(func)) { return functionsInTableMap.get(func); } // It's not in the table, add it now. var ret; // Reuse a free index if there is one, otherwise grow. if (freeTableIndexes.length) { ret = freeTableIndexes.pop(); } else { ret = table.length; // Grow the table try { table.grow(1); } catch (err) { if (!(err instanceof RangeError)) { throw err; } throw 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.'; } } // Set the new value. try { // Attempting to call this with JS function will cause of table.set() to fail table.set(ret, func); } catch (err) { if (!(err instanceof TypeError)) { throw err; } var wrapped = convertJsFunctionToWasm(func, sig); table.set(ret, wrapped); } functionsInTableMap.set(func, ret); return ret; } function removeFunctionWasm(index) { functionsInTableMap.delete(wasmTable.get(index)); freeTableIndexes.push(index); } // 'sig' parameter is required for the llvm backend but only when func is not // already a WebAssembly function. function addFunction(func, sig) { return addFunctionWasm(func, sig); } function removeFunction(index) { removeFunctionWasm(index); } var funcWrappers = {}; function getFuncWrapper(func, sig) { if (!func) return; // on null pointer, return undefined assert(sig); if (!funcWrappers[sig]) { funcWrappers[sig] = {}; } var sigCache = funcWrappers[sig]; if (!sigCache[func]) { // optimize away arguments usage in common cases if (sig.length === 1) { sigCache[func] = function dynCall_wrapper() { return dynCall(sig, func); }; } else if (sig.length === 2) { sigCache[func] = function dynCall_wrapper(arg) { return dynCall(sig, func, [arg]); }; } else { // general case sigCache[func] = function dynCall_wrapper() { return dynCall(sig, func, Array.prototype.slice.call(arguments)); }; } } return sigCache[func]; } function makeBigInt(low, high, unsigned) { return unsigned ? ((+((low>>>0)))+((+((high>>>0)))*4294967296.0)) : ((+((low>>>0)))+((+((high|0)))*4294967296.0)); } /** @param {Array=} args */ function dynCall(sig, ptr, args) { if (args && args.length) { return Module['dynCall_' + sig].apply(null, [ptr].concat(args)); } else { return Module['dynCall_' + sig].call(null, ptr); } } var tempRet0 = 0; var setTempRet0 = function(value) { tempRet0 = value; }; var getTempRet0 = function() { return tempRet0; }; // The address globals begin at. Very low in memory, for code size and optimization opportunities. // Above 0 is static memory, starting with globals. // Then the stack. // Then 'dynamic' memory for sbrk. var GLOBAL_BASE = 1024; // === Preamble library stuff === // Documentation for the public APIs defined in this file must be updated in: // site/source/docs/api_reference/preamble.js.rst // A prebuilt local version of the documentation is available at: // site/build/text/docs/api_reference/preamble.js.txt // You can also build docs locally as HTML or other formats in site/ // An online HTML version (which may be of a different version of Emscripten) // is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html var wasmBinary;if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; var noExitRuntime;if (Module['noExitRuntime']) noExitRuntime = Module['noExitRuntime']; // wasm2js.js - enough of a polyfill for the WebAssembly object so that we can load // wasm2js code that way. // Emit "var WebAssembly" if definitely using wasm2js. Otherwise, in MAYBE_WASM2JS // mode, we can't use a "var" since it would prevent normal wasm from working. /** @suppress{const} */ var WebAssembly = { // Note that we do not use closure quoting (this['buffer'], etc.) on these // functions, as they are just meant for internal use. In other words, this is // not a fully general polyfill. Memory: function(opts) { this.buffer = new ArrayBuffer(opts['initial'] * 65536); this.grow = function(amount) { var ret = __growWasmMemory(amount); return ret; }; }, // Table is not a normal constructor and instead returns the array object. // That lets us use the length property automatically, which is simpler and // smaller (but instanceof will not report that an instance of Table is an // instance of this function). Table: /** @constructor */ function(opts) { var ret = new Array(opts['initial']); ret.grow = function(by) { if (ret.length >= 22 + 5) { abort('Unable to grow wasm table. Use a higher value for RESERVED_FUNCTION_POINTERS or set ALLOW_TABLE_GROWTH.') } ret.push(null); }; ret.set = function(i, func) { ret[i] = func; }; ret.get = function(i) { return ret[i]; }; return ret; }, Module: function(binary) { // TODO: use the binary and info somehow - right now the wasm2js output is embedded in // the main JS }, Instance: function(module, info) { // TODO: use the module and info somehow - right now the wasm2js output is embedded in // the main JS // This will be replaced by the actual wasm2js code. this.exports = ( function instantiate(asmLibraryArg, wasmMemory, wasmTable) { var scratchBuffer = new ArrayBuffer(8); var i32ScratchView = new Int32Array(scratchBuffer); var f32ScratchView = new Float32Array(scratchBuffer); var f64ScratchView = new Float64Array(scratchBuffer); function wasm2js_scratch_load_i32(index) { return i32ScratchView[index]; } function wasm2js_scratch_store_i32(index, value) { i32ScratchView[index] = value; } function wasm2js_scratch_load_f64() { return f64ScratchView[0]; } function wasm2js_scratch_store_f64(value) { f64ScratchView[0] = value; } function wasm2js_scratch_store_f32(value) { f32ScratchView[0] = value; } function asmFunc(global, env, buffer) { var memory = env.memory; var FUNCTION_TABLE = wasmTable; var HEAP8 = new global.Int8Array(buffer); var HEAP16 = new global.Int16Array(buffer); var HEAP32 = new global.Int32Array(buffer); var HEAPU8 = new global.Uint8Array(buffer); var HEAPU16 = new global.Uint16Array(buffer); var HEAPU32 = new global.Uint32Array(buffer); var HEAPF32 = new global.Float32Array(buffer); var HEAPF64 = new global.Float64Array(buffer); var Math_imul = global.Math.imul; var Math_fround = global.Math.fround; var Math_abs = global.Math.abs; var Math_clz32 = global.Math.clz32; var Math_min = global.Math.min; var Math_max = global.Math.max; var Math_floor = global.Math.floor; var Math_ceil = global.Math.ceil; var Math_sqrt = global.Math.sqrt; var abort = env.abort; var nan = global.NaN; var infinity = global.Infinity; var emscripten_resize_heap = env.emscripten_resize_heap; var emscripten_memcpy_big = env.emscripten_memcpy_big; var __wasi_fd_close = env.fd_close; var __wasi_fd_read = env.fd_read; var round = env.round; var __wasi_fd_write = env.fd_write; var setTempRet0 = env.setTempRet0; var legalimport$__wasi_fd_seek = env.fd_seek; var global$0 = 5257216; var global$1 = 14168; var __wasm_intrinsics_temp_i64 = 0; var __wasm_intrinsics_temp_i64$hi = 0; var i64toi32_i32$HIGH_BITS = 0; // EMSCRIPTEN_START_FUNCS ; function __wasm_call_ctors() { } function __errno_location() { return 11584; } function sbrk($0) { var $1 = 0, $2 = 0; $1 = HEAP32[3544]; $2 = $0 + 3 & -4; $0 = $1 + $2 | 0; label$1 : { if ($0 >>> 0 <= $1 >>> 0 ? ($2 | 0) >= 1 : 0) { break label$1 } if ($0 >>> 0 > __wasm_memory_size() << 16 >>> 0) { if (!emscripten_resize_heap($0 | 0)) { break label$1 } } HEAP32[3544] = $0; return $1; } HEAP32[2896] = 48; return -1; } function memset($0, $1) { var $2 = 0, $3 = 0; label$1 : { if (!$1) { break label$1 } $2 = $0 + $1 | 0; HEAP8[$2 + -1 | 0] = 0; HEAP8[$0 | 0] = 0; if ($1 >>> 0 < 3) { break label$1 } HEAP8[$2 + -2 | 0] = 0; HEAP8[$0 + 1 | 0] = 0; HEAP8[$2 + -3 | 0] = 0; HEAP8[$0 + 2 | 0] = 0; if ($1 >>> 0 < 7) { break label$1 } HEAP8[$2 + -4 | 0] = 0; HEAP8[$0 + 3 | 0] = 0; if ($1 >>> 0 < 9) { break label$1 } $3 = 0 - $0 & 3; $2 = $3 + $0 | 0; HEAP32[$2 >> 2] = 0; $3 = $1 - $3 & -4; $1 = $3 + $2 | 0; HEAP32[$1 + -4 >> 2] = 0; if ($3 >>> 0 < 9) { break label$1 } HEAP32[$2 + 8 >> 2] = 0; HEAP32[$2 + 4 >> 2] = 0; HEAP32[$1 + -8 >> 2] = 0; HEAP32[$1 + -12 >> 2] = 0; if ($3 >>> 0 < 25) { break label$1 } HEAP32[$2 + 24 >> 2] = 0; HEAP32[$2 + 20 >> 2] = 0; HEAP32[$2 + 16 >> 2] = 0; HEAP32[$2 + 12 >> 2] = 0; HEAP32[$1 + -16 >> 2] = 0; HEAP32[$1 + -20 >> 2] = 0; HEAP32[$1 + -24 >> 2] = 0; HEAP32[$1 + -28 >> 2] = 0; $1 = $3; $3 = $2 & 4 | 24; $1 = $1 - $3 | 0; if ($1 >>> 0 < 32) { break label$1 } $2 = $2 + $3 | 0; while (1) { HEAP32[$2 + 24 >> 2] = 0; HEAP32[$2 + 28 >> 2] = 0; HEAP32[$2 + 16 >> 2] = 0; HEAP32[$2 + 20 >> 2] = 0; HEAP32[$2 + 8 >> 2] = 0; HEAP32[$2 + 12 >> 2] = 0; HEAP32[$2 >> 2] = 0; HEAP32[$2 + 4 >> 2] = 0; $2 = $2 + 32 | 0; $1 = $1 + -32 | 0; if ($1 >>> 0 > 31) { continue } break; }; } return $0; } function memcpy($0, $1, $2) { var $3 = 0, $4 = 0, $5 = 0; if ($2 >>> 0 >= 512) { emscripten_memcpy_big($0 | 0, $1 | 0, $2 | 0) | 0; return $0; } $4 = $0 + $2 | 0; label$2 : { if (!(($0 ^ $1) & 3)) { label$4 : { if (($2 | 0) < 1) { $2 = $0; break label$4; } if (!($0 & 3)) { $2 = $0; break label$4; } $2 = $0; while (1) { HEAP8[$2 | 0] = HEAPU8[$1 | 0]; $1 = $1 + 1 | 0; $2 = $2 + 1 | 0; if ($2 >>> 0 >= $4 >>> 0) { break label$4 } if ($2 & 3) { continue } break; }; } $3 = $4 & -4; label$8 : { if ($3 >>> 0 < 64) { break label$8 } $5 = $3 + -64 | 0; if ($2 >>> 0 > $5 >>> 0) { break label$8 } while (1) { HEAP32[$2 >> 2] = HEAP32[$1 >> 2]; HEAP32[$2 + 4 >> 2] = HEAP32[$1 + 4 >> 2]; HEAP32[$2 + 8 >> 2] = HEAP32[$1 + 8 >> 2]; HEAP32[$2 + 12 >> 2] = HEAP32[$1 + 12 >> 2]; HEAP32[$2 + 16 >> 2] = HEAP32[$1 + 16 >> 2]; HEAP32[$2 + 20 >> 2] = HEAP32[$1 + 20 >> 2]; HEAP32[$2 + 24 >> 2] = HEAP32[$1 + 24 >> 2]; HEAP32[$2 + 28 >> 2] = HEAP32[$1 + 28 >> 2]; HEAP32[$2 + 32 >> 2] = HEAP32[$1 + 32 >> 2]; HEAP32[$2 + 36 >> 2] = HEAP32[$1 + 36 >> 2]; HEAP32[$2 + 40 >> 2] = HEAP32[$1 + 40 >> 2]; HEAP32[$2 + 44 >> 2] = HEAP32[$1 + 44 >> 2]; HEAP32[$2 + 48 >> 2] = HEAP32[$1 + 48 >> 2]; HEAP32[$2 + 52 >> 2] = HEAP32[$1 + 52 >> 2]; HEAP32[$2 + 56 >> 2] = HEAP32[$1 + 56 >> 2]; HEAP32[$2 + 60 >> 2] = HEAP32[$1 + 60 >> 2]; $1 = $1 - -64 | 0; $2 = $2 - -64 | 0; if ($2 >>> 0 <= $5 >>> 0) { continue } break; }; } if ($2 >>> 0 >= $3 >>> 0) { break label$2 } while (1) { HEAP32[$2 >> 2] = HEAP32[$1 >> 2]; $1 = $1 + 4 | 0; $2 = $2 + 4 | 0; if ($2 >>> 0 < $3 >>> 0) { continue } break; }; break label$2; } if ($4 >>> 0 < 4) { $2 = $0; break label$2; } $3 = $4 + -4 | 0; if ($3 >>> 0 < $0 >>> 0) { $2 = $0; break label$2; } $2 = $0; while (1) { HEAP8[$2 | 0] = HEAPU8[$1 | 0]; HEAP8[$2 + 1 | 0] = HEAPU8[$1 + 1 | 0]; HEAP8[$2 + 2 | 0] = HEAPU8[$1 + 2 | 0]; HEAP8[$2 + 3 | 0] = HEAPU8[$1 + 3 | 0]; $1 = $1 + 4 | 0; $2 = $2 + 4 | 0; if ($2 >>> 0 <= $3 >>> 0) { continue } break; }; } if ($2 >>> 0 < $4 >>> 0) { while (1) { HEAP8[$2 | 0] = HEAPU8[$1 | 0]; $1 = $1 + 1 | 0; $2 = $2 + 1 | 0; if (($4 | 0) != ($2 | 0)) { continue } break; } } return $0; } function dlmalloc($0) { $0 = $0 | 0; var $1 = 0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0; $11 = global$0 - 16 | 0; global$0 = $11; label$1 : { label$2 : { label$3 : { label$4 : { label$5 : { label$6 : { label$7 : { label$8 : { label$9 : { label$10 : { label$11 : { if ($0 >>> 0 <= 244) { $6 = HEAP32[2897]; $5 = $0 >>> 0 < 11 ? 16 : $0 + 11 & -8; $0 = $5 >>> 3 | 0; $1 = $6 >>> $0 | 0; if ($1 & 3) { $2 = $0 + (($1 ^ -1) & 1) | 0; $5 = $2 << 3; $1 = HEAP32[$5 + 11636 >> 2]; $0 = $1 + 8 | 0; $3 = HEAP32[$1 + 8 >> 2]; $5 = $5 + 11628 | 0; label$14 : { if (($3 | 0) == ($5 | 0)) { (wasm2js_i32$0 = 11588, wasm2js_i32$1 = __wasm_rotl_i32(-2, $2) & $6), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; break label$14; } HEAP32[$3 + 12 >> 2] = $5; HEAP32[$5 + 8 >> 2] = $3; } $2 = $2 << 3; HEAP32[$1 + 4 >> 2] = $2 | 3; $1 = $1 + $2 | 0; HEAP32[$1 + 4 >> 2] = HEAP32[$1 + 4 >> 2] | 1; break label$1; } $7 = HEAP32[2899]; if ($5 >>> 0 <= $7 >>> 0) { break label$11 } if ($1) { $2 = 2 << $0; $0 = (0 - $2 | $2) & $1 << $0; $0 = (0 - $0 & $0) + -1 | 0; $1 = $0 >>> 12 & 16; $2 = $1; $0 = $0 >>> $1 | 0; $1 = $0 >>> 5 & 8; $2 = $2 | $1; $0 = $0 >>> $1 | 0; $1 = $0 >>> 2 & 4; $2 = $2 | $1; $0 = $0 >>> $1 | 0; $1 = $0 >>> 1 & 2; $2 = $2 | $1; $0 = $0 >>> $1 | 0; $1 = $0 >>> 1 & 1; $2 = ($2 | $1) + ($0 >>> $1 | 0) | 0; $3 = $2 << 3; $1 = HEAP32[$3 + 11636 >> 2]; $0 = HEAP32[$1 + 8 >> 2]; $3 = $3 + 11628 | 0; label$17 : { if (($0 | 0) == ($3 | 0)) { $6 = __wasm_rotl_i32(-2, $2) & $6; HEAP32[2897] = $6; break label$17; } HEAP32[$0 + 12 >> 2] = $3; HEAP32[$3 + 8 >> 2] = $0; } $0 = $1 + 8 | 0; HEAP32[$1 + 4 >> 2] = $5 | 3; $4 = $1 + $5 | 0; $2 = $2 << 3; $3 = $2 - $5 | 0; HEAP32[$4 + 4 >> 2] = $3 | 1; HEAP32[$1 + $2 >> 2] = $3; if ($7) { $5 = $7 >>> 3 | 0; $1 = ($5 << 3) + 11628 | 0; $2 = HEAP32[2902]; $5 = 1 << $5; label$20 : { if (!($5 & $6)) { HEAP32[2897] = $5 | $6; $5 = $1; break label$20; } $5 = HEAP32[$1 + 8 >> 2]; } HEAP32[$1 + 8 >> 2] = $2; HEAP32[$5 + 12 >> 2] = $2; HEAP32[$2 + 12 >> 2] = $1; HEAP32[$2 + 8 >> 2] = $5; } HEAP32[2902] = $4; HEAP32[2899] = $3; break label$1; } $10 = HEAP32[2898]; if (!$10) { break label$11 } $0 = ($10 & 0 - $10) + -1 | 0; $1 = $0 >>> 12 & 16; $2 = $1; $0 = $0 >>> $1 | 0; $1 = $0 >>> 5 & 8; $2 = $2 | $1; $0 = $0 >>> $1 | 0; $1 = $0 >>> 2 & 4; $2 = $2 | $1; $0 = $0 >>> $1 | 0; $1 = $0 >>> 1 & 2; $2 = $2 | $1; $0 = $0 >>> $1 | 0; $1 = $0 >>> 1 & 1; $1 = HEAP32[(($2 | $1) + ($0 >>> $1 | 0) << 2) + 11892 >> 2]; $3 = (HEAP32[$1 + 4 >> 2] & -8) - $5 | 0; $2 = $1; while (1) { label$23 : { $0 = HEAP32[$2 + 16 >> 2]; if (!$0) { $0 = HEAP32[$2 + 20 >> 2]; if (!$0) { break label$23 } } $4 = (HEAP32[$0 + 4 >> 2] & -8) - $5 | 0; $2 = $4 >>> 0 < $3 >>> 0; $3 = $2 ? $4 : $3; $1 = $2 ? $0 : $1; $2 = $0; continue; } break; }; $9 = HEAP32[$1 + 24 >> 2]; $4 = HEAP32[$1 + 12 >> 2]; if (($4 | 0) != ($1 | 0)) { $0 = HEAP32[$1 + 8 >> 2]; HEAP32[$0 + 12 >> 2] = $4; HEAP32[$4 + 8 >> 2] = $0; break label$2; } $2 = $1 + 20 | 0; $0 = HEAP32[$2 >> 2]; if (!$0) { $0 = HEAP32[$1 + 16 >> 2]; if (!$0) { break label$10 } $2 = $1 + 16 | 0; } while (1) { $8 = $2; $4 = $0; $2 = $0 + 20 | 0; $0 = HEAP32[$2 >> 2]; if ($0) { continue } $2 = $4 + 16 | 0; $0 = HEAP32[$4 + 16 >> 2]; if ($0) { continue } break; }; HEAP32[$8 >> 2] = 0; break label$2; } $5 = -1; if ($0 >>> 0 > 4294967231) { break label$11 } $0 = $0 + 11 | 0; $5 = $0 & -8; $8 = HEAP32[2898]; if (!$8) { break label$11 } $2 = 0 - $5 | 0; $0 = $0 >>> 8 | 0; $7 = 0; label$29 : { if (!$0) { break label$29 } $7 = 31; if ($5 >>> 0 > 16777215) { break label$29 } $3 = $0 + 1048320 >>> 16 & 8; $1 = $0 << $3; $0 = $1 + 520192 >>> 16 & 4; $6 = $1 << $0; $1 = $6 + 245760 >>> 16 & 2; $0 = ($6 << $1 >>> 15 | 0) - ($1 | ($0 | $3)) | 0; $7 = ($0 << 1 | $5 >>> $0 + 21 & 1) + 28 | 0; } $3 = HEAP32[($7 << 2) + 11892 >> 2]; label$30 : { label$31 : { label$32 : { if (!$3) { $0 = 0; break label$32; } $1 = $5 << (($7 | 0) == 31 ? 0 : 25 - ($7 >>> 1 | 0) | 0); $0 = 0; while (1) { label$35 : { $6 = (HEAP32[$3 + 4 >> 2] & -8) - $5 | 0; if ($6 >>> 0 >= $2 >>> 0) { break label$35 } $4 = $3; $2 = $6; if ($2) { break label$35 } $2 = 0; $0 = $3; break label$31; } $6 = HEAP32[$3 + 20 >> 2]; $3 = HEAP32[(($1 >>> 29 & 4) + $3 | 0) + 16 >> 2]; $0 = $6 ? (($6 | 0) == ($3 | 0) ? $0 : $6) : $0; $1 = $1 << (($3 | 0) != 0); if ($3) { continue } break; }; } if (!($0 | $4)) { $0 = 2 << $7; $0 = (0 - $0 | $0) & $8; if (!$0) { break label$11 } $0 = ($0 & 0 - $0) + -1 | 0; $1 = $0 >>> 12 & 16; $3 = $1; $0 = $0 >>> $1 | 0; $1 = $0 >>> 5 & 8; $3 = $3 | $1; $0 = $0 >>> $1 | 0; $1 = $0 >>> 2 & 4; $3 = $3 | $1; $0 = $0 >>> $1 | 0; $1 = $0 >>> 1 & 2; $3 = $3 | $1; $0 = $0 >>> $1 | 0; $1 = $0 >>> 1 & 1; $0 = HEAP32[(($3 | $1) + ($0 >>> $1 | 0) << 2) + 11892 >> 2]; } if (!$0) { break label$30 } } while (1) { $3 = (HEAP32[$0 + 4 >> 2] & -8) - $5 | 0; $1 = $3 >>> 0 < $2 >>> 0; $2 = $1 ? $3 : $2; $4 = $1 ? $0 : $4; $1 = HEAP32[$0 + 16 >> 2]; if ($1) { $0 = $1 } else { $0 = HEAP32[$0 + 20 >> 2] } if ($0) { continue } break; }; } if (!$4 | $2 >>> 0 >= HEAP32[2899] - $5 >>> 0) { break label$11 } $7 = HEAP32[$4 + 24 >> 2]; $1 = HEAP32[$4 + 12 >> 2]; if (($4 | 0) != ($1 | 0)) { $0 = HEAP32[$4 + 8 >> 2]; HEAP32[$0 + 12 >> 2] = $1; HEAP32[$1 + 8 >> 2] = $0; break label$3; } $3 = $4 + 20 | 0; $0 = HEAP32[$3 >> 2]; if (!$0) { $0 = HEAP32[$4 + 16 >> 2]; if (!$0) { break label$9 } $3 = $4 + 16 | 0; } while (1) { $6 = $3; $1 = $0; $3 = $0 + 20 | 0; $0 = HEAP32[$3 >> 2]; if ($0) { continue } $3 = $1 + 16 | 0; $0 = HEAP32[$1 + 16 >> 2]; if ($0) { continue } break; }; HEAP32[$6 >> 2] = 0; break label$3; } $1 = HEAP32[2899]; if ($1 >>> 0 >= $5 >>> 0) { $0 = HEAP32[2902]; $2 = $1 - $5 | 0; label$45 : { if ($2 >>> 0 >= 16) { HEAP32[2899] = $2; $3 = $0 + $5 | 0; HEAP32[2902] = $3; HEAP32[$3 + 4 >> 2] = $2 | 1; HEAP32[$0 + $1 >> 2] = $2; HEAP32[$0 + 4 >> 2] = $5 | 3; break label$45; } HEAP32[2902] = 0; HEAP32[2899] = 0; HEAP32[$0 + 4 >> 2] = $1 | 3; $1 = $0 + $1 | 0; HEAP32[$1 + 4 >> 2] = HEAP32[$1 + 4 >> 2] | 1; } $0 = $0 + 8 | 0; break label$1; } $1 = HEAP32[2900]; if ($1 >>> 0 > $5 >>> 0) { $1 = $1 - $5 | 0; HEAP32[2900] = $1; $0 = HEAP32[2903]; $2 = $0 + $5 | 0; HEAP32[2903] = $2; HEAP32[$2 + 4 >> 2] = $1 | 1; HEAP32[$0 + 4 >> 2] = $5 | 3; $0 = $0 + 8 | 0; break label$1; } $0 = 0; $4 = $5 + 47 | 0; $3 = $4; if (HEAP32[3015]) { $2 = HEAP32[3017] } else { HEAP32[3018] = -1; HEAP32[3019] = -1; HEAP32[3016] = 4096; HEAP32[3017] = 4096; HEAP32[3015] = $11 + 12 & -16 ^ 1431655768; HEAP32[3020] = 0; HEAP32[3008] = 0; $2 = 4096; } $6 = $3 + $2 | 0; $8 = 0 - $2 | 0; $2 = $6 & $8; if ($2 >>> 0 <= $5 >>> 0) { break label$1 } $3 = HEAP32[3007]; if ($3) { $7 = HEAP32[3005]; $9 = $7 + $2 | 0; if ($9 >>> 0 <= $7 >>> 0 | $9 >>> 0 > $3 >>> 0) { break label$1 } } if (HEAPU8[12032] & 4) { break label$6 } label$51 : { label$52 : { $3 = HEAP32[2903]; if ($3) { $0 = 12036; while (1) { $7 = HEAP32[$0 >> 2]; if ($7 + HEAP32[$0 + 4 >> 2] >>> 0 > $3 >>> 0 ? $7 >>> 0 <= $3 >>> 0 : 0) { break label$52 } $0 = HEAP32[$0 + 8 >> 2]; if ($0) { continue } break; }; } $1 = sbrk(0); if (($1 | 0) == -1) { break label$7 } $6 = $2; $0 = HEAP32[3016]; $3 = $0 + -1 | 0; if ($3 & $1) { $6 = ($2 - $1 | 0) + ($1 + $3 & 0 - $0) | 0 } if ($6 >>> 0 <= $5 >>> 0 | $6 >>> 0 > 2147483646) { break label$7 } $0 = HEAP32[3007]; if ($0) { $3 = HEAP32[3005]; $8 = $3 + $6 | 0; if ($8 >>> 0 <= $3 >>> 0 | $8 >>> 0 > $0 >>> 0) { break label$7 } } $0 = sbrk($6); if (($1 | 0) != ($0 | 0)) { break label$51 } break label$5; } $6 = $8 & $6 - $1; if ($6 >>> 0 > 2147483646) { break label$7 } $1 = sbrk($6); if (($1 | 0) == (HEAP32[$0 >> 2] + HEAP32[$0 + 4 >> 2] | 0)) { break label$8 } $0 = $1; } if (!(($0 | 0) == -1 | $5 + 48 >>> 0 <= $6 >>> 0)) { $1 = HEAP32[3017]; $1 = $1 + ($4 - $6 | 0) & 0 - $1; if ($1 >>> 0 > 2147483646) { $1 = $0; break label$5; } if ((sbrk($1) | 0) != -1) { $6 = $1 + $6 | 0; $1 = $0; break label$5; } sbrk(0 - $6 | 0); break label$7; } $1 = $0; if (($0 | 0) != -1) { break label$5 } break label$7; } $4 = 0; break label$2; } $1 = 0; break label$3; } if (($1 | 0) != -1) { break label$5 } } HEAP32[3008] = HEAP32[3008] | 4; } if ($2 >>> 0 > 2147483646) { break label$4 } $1 = sbrk($2); $0 = sbrk(0); if ($1 >>> 0 >= $0 >>> 0 | ($1 | 0) == -1 | ($0 | 0) == -1) { break label$4 } $6 = $0 - $1 | 0; if ($6 >>> 0 <= $5 + 40 >>> 0) { break label$4 } } $0 = HEAP32[3005] + $6 | 0; HEAP32[3005] = $0; if ($0 >>> 0 > HEAPU32[3006]) { HEAP32[3006] = $0 } label$62 : { label$63 : { label$64 : { $3 = HEAP32[2903]; if ($3) { $0 = 12036; while (1) { $2 = HEAP32[$0 >> 2]; $4 = HEAP32[$0 + 4 >> 2]; if (($2 + $4 | 0) == ($1 | 0)) { break label$64 } $0 = HEAP32[$0 + 8 >> 2]; if ($0) { continue } break; }; break label$63; } $0 = HEAP32[2901]; if (!($1 >>> 0 >= $0 >>> 0 ? $0 : 0)) { HEAP32[2901] = $1 } $0 = 0; HEAP32[3010] = $6; HEAP32[3009] = $1; HEAP32[2905] = -1; HEAP32[2906] = HEAP32[3015]; HEAP32[3012] = 0; while (1) { $2 = $0 << 3; $3 = $2 + 11628 | 0; HEAP32[$2 + 11636 >> 2] = $3; HEAP32[$2 + 11640 >> 2] = $3; $0 = $0 + 1 | 0; if (($0 | 0) != 32) { continue } break; }; $0 = $6 + -40 | 0; $2 = $1 + 8 & 7 ? -8 - $1 & 7 : 0; $3 = $0 - $2 | 0; HEAP32[2900] = $3; $2 = $1 + $2 | 0; HEAP32[2903] = $2; HEAP32[$2 + 4 >> 2] = $3 | 1; HEAP32[($0 + $1 | 0) + 4 >> 2] = 40; HEAP32[2904] = HEAP32[3019]; break label$62; } if (HEAPU8[$0 + 12 | 0] & 8 | $1 >>> 0 <= $3 >>> 0 | $2 >>> 0 > $3 >>> 0) { break label$63 } HEAP32[$0 + 4 >> 2] = $4 + $6; $0 = $3 + 8 & 7 ? -8 - $3 & 7 : 0; $1 = $0 + $3 | 0; HEAP32[2903] = $1; $2 = HEAP32[2900] + $6 | 0; $0 = $2 - $0 | 0; HEAP32[2900] = $0; HEAP32[$1 + 4 >> 2] = $0 | 1; HEAP32[($2 + $3 | 0) + 4 >> 2] = 40; HEAP32[2904] = HEAP32[3019]; break label$62; } $0 = HEAP32[2901]; if ($1 >>> 0 < $0 >>> 0) { HEAP32[2901] = $1; $0 = 0; } $2 = $1 + $6 | 0; $0 = 12036; label$70 : { label$71 : { label$72 : { label$73 : { label$74 : { label$75 : { while (1) { if (($2 | 0) != HEAP32[$0 >> 2]) { $0 = HEAP32[$0 + 8 >> 2]; if ($0) { continue } break label$75; } break; }; if (!(HEAPU8[$0 + 12 | 0] & 8)) { break label$74 } } $0 = 12036; while (1) { $2 = HEAP32[$0 >> 2]; if ($2 >>> 0 <= $3 >>> 0) { $4 = $2 + HEAP32[$0 + 4 >> 2] | 0; if ($4 >>> 0 > $3 >>> 0) { break label$73 } } $0 = HEAP32[$0 + 8 >> 2]; continue; }; } HEAP32[$0 >> 2] = $1; HEAP32[$0 + 4 >> 2] = HEAP32[$0 + 4 >> 2] + $6; $7 = ($1 + 8 & 7 ? -8 - $1 & 7 : 0) + $1 | 0; HEAP32[$7 + 4 >> 2] = $5 | 3; $1 = $2 + ($2 + 8 & 7 ? -8 - $2 & 7 : 0) | 0; $0 = ($1 - $7 | 0) - $5 | 0; $4 = $5 + $7 | 0; if (($1 | 0) == ($3 | 0)) { HEAP32[2903] = $4; $0 = HEAP32[2900] + $0 | 0; HEAP32[2900] = $0; HEAP32[$4 + 4 >> 2] = $0 | 1; break label$71; } if (HEAP32[2902] == ($1 | 0)) { HEAP32[2902] = $4; $0 = HEAP32[2899] + $0 | 0; HEAP32[2899] = $0; HEAP32[$4 + 4 >> 2] = $0 | 1; HEAP32[$0 + $4 >> 2] = $0; break label$71; } $2 = HEAP32[$1 + 4 >> 2]; if (($2 & 3) == 1) { $9 = $2 & -8; label$83 : { if ($2 >>> 0 <= 255) { $3 = HEAP32[$1 + 8 >> 2]; $5 = $2 >>> 3 | 0; $2 = HEAP32[$1 + 12 >> 2]; if (($2 | 0) == ($3 | 0)) { (wasm2js_i32$0 = 11588, wasm2js_i32$1 = HEAP32[2897] & __wasm_rotl_i32(-2, $5)), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; break label$83; } HEAP32[$3 + 12 >> 2] = $2; HEAP32[$2 + 8 >> 2] = $3; break label$83; } $8 = HEAP32[$1 + 24 >> 2]; $6 = HEAP32[$1 + 12 >> 2]; label$86 : { if (($6 | 0) != ($1 | 0)) { $2 = HEAP32[$1 + 8 >> 2]; HEAP32[$2 + 12 >> 2] = $6; HEAP32[$6 + 8 >> 2] = $2; break label$86; } label$89 : { $3 = $1 + 20 | 0; $5 = HEAP32[$3 >> 2]; if ($5) { break label$89 } $3 = $1 + 16 | 0; $5 = HEAP32[$3 >> 2]; if ($5) { break label$89 } $6 = 0; break label$86; } while (1) { $2 = $3; $6 = $5; $3 = $5 + 20 | 0; $5 = HEAP32[$3 >> 2]; if ($5) { continue } $3 = $6 + 16 | 0; $5 = HEAP32[$6 + 16 >> 2]; if ($5) { continue } break; }; HEAP32[$2 >> 2] = 0; } if (!$8) { break label$83 } $2 = HEAP32[$1 + 28 >> 2]; $3 = ($2 << 2) + 11892 | 0; label$91 : { if (HEAP32[$3 >> 2] == ($1 | 0)) { HEAP32[$3 >> 2] = $6; if ($6) { break label$91 } (wasm2js_i32$0 = 11592, wasm2js_i32$1 = HEAP32[2898] & __wasm_rotl_i32(-2, $2)), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; break label$83; } HEAP32[$8 + (HEAP32[$8 + 16 >> 2] == ($1 | 0) ? 16 : 20) >> 2] = $6; if (!$6) { break label$83 } } HEAP32[$6 + 24 >> 2] = $8; $2 = HEAP32[$1 + 16 >> 2]; if ($2) { HEAP32[$6 + 16 >> 2] = $2; HEAP32[$2 + 24 >> 2] = $6; } $2 = HEAP32[$1 + 20 >> 2]; if (!$2) { break label$83 } HEAP32[$6 + 20 >> 2] = $2; HEAP32[$2 + 24 >> 2] = $6; } $1 = $1 + $9 | 0; $0 = $0 + $9 | 0; } HEAP32[$1 + 4 >> 2] = HEAP32[$1 + 4 >> 2] & -2; HEAP32[$4 + 4 >> 2] = $0 | 1; HEAP32[$0 + $4 >> 2] = $0; if ($0 >>> 0 <= 255) { $1 = $0 >>> 3 | 0; $0 = ($1 << 3) + 11628 | 0; $2 = HEAP32[2897]; $1 = 1 << $1; label$95 : { if (!($2 & $1)) { HEAP32[2897] = $1 | $2; $1 = $0; break label$95; } $1 = HEAP32[$0 + 8 >> 2]; } HEAP32[$0 + 8 >> 2] = $4; HEAP32[$1 + 12 >> 2] = $4; HEAP32[$4 + 12 >> 2] = $0; HEAP32[$4 + 8 >> 2] = $1; break label$71; } $6 = $4; $1 = $0 >>> 8 | 0; $2 = 0; label$97 : { if (!$1) { break label$97 } $2 = 31; if ($0 >>> 0 > 16777215) { break label$97 } $3 = $1 + 1048320 >>> 16 & 8; $2 = $1 << $3; $1 = $2 + 520192 >>> 16 & 4; $5 = $2 << $1; $2 = $5 + 245760 >>> 16 & 2; $1 = ($5 << $2 >>> 15 | 0) - ($2 | ($1 | $3)) | 0; $2 = ($1 << 1 | $0 >>> $1 + 21 & 1) + 28 | 0; } $1 = $2; HEAP32[$6 + 28 >> 2] = $1; HEAP32[$4 + 16 >> 2] = 0; HEAP32[$4 + 20 >> 2] = 0; $2 = ($1 << 2) + 11892 | 0; $3 = HEAP32[2898]; $5 = 1 << $1; label$98 : { if (!($3 & $5)) { HEAP32[2898] = $3 | $5; HEAP32[$2 >> 2] = $4; break label$98; } $3 = $0 << (($1 | 0) == 31 ? 0 : 25 - ($1 >>> 1 | 0) | 0); $1 = HEAP32[$2 >> 2]; while (1) { $2 = $1; if ((HEAP32[$1 + 4 >> 2] & -8) == ($0 | 0)) { break label$72 } $1 = $3 >>> 29 | 0; $3 = $3 << 1; $5 = ($2 + ($1 & 4) | 0) + 16 | 0; $1 = HEAP32[$5 >> 2]; if ($1) { continue } break; }; HEAP32[$5 >> 2] = $4; } HEAP32[$4 + 24 >> 2] = $2; HEAP32[$4 + 12 >> 2] = $4; HEAP32[$4 + 8 >> 2] = $4; break label$71; } $0 = $6 + -40 | 0; $2 = $1 + 8 & 7 ? -8 - $1 & 7 : 0; $8 = $0 - $2 | 0; HEAP32[2900] = $8; $2 = $1 + $2 | 0; HEAP32[2903] = $2; HEAP32[$2 + 4 >> 2] = $8 | 1; HEAP32[($0 + $1 | 0) + 4 >> 2] = 40; HEAP32[2904] = HEAP32[3019]; $0 = ($4 + ($4 + -39 & 7 ? 39 - $4 & 7 : 0) | 0) + -47 | 0; $2 = $0 >>> 0 < $3 + 16 >>> 0 ? $3 : $0; HEAP32[$2 + 4 >> 2] = 27; $0 = HEAP32[3012]; HEAP32[$2 + 16 >> 2] = HEAP32[3011]; HEAP32[$2 + 20 >> 2] = $0; $0 = HEAP32[3010]; HEAP32[$2 + 8 >> 2] = HEAP32[3009]; HEAP32[$2 + 12 >> 2] = $0; HEAP32[3011] = $2 + 8; HEAP32[3010] = $6; HEAP32[3009] = $1; HEAP32[3012] = 0; $0 = $2 + 24 | 0; while (1) { HEAP32[$0 + 4 >> 2] = 7; $1 = $0 + 8 | 0; $0 = $0 + 4 | 0; if ($4 >>> 0 > $1 >>> 0) { continue } break; }; if (($2 | 0) == ($3 | 0)) { break label$62 } HEAP32[$2 + 4 >> 2] = HEAP32[$2 + 4 >> 2] & -2; $6 = $2 - $3 | 0; HEAP32[$3 + 4 >> 2] = $6 | 1; HEAP32[$2 >> 2] = $6; if ($6 >>> 0 <= 255) { $1 = $6 >>> 3 | 0; $0 = ($1 << 3) + 11628 | 0; $2 = HEAP32[2897]; $1 = 1 << $1; label$103 : { if (!($2 & $1)) { HEAP32[2897] = $1 | $2; $1 = $0; break label$103; } $1 = HEAP32[$0 + 8 >> 2]; } HEAP32[$0 + 8 >> 2] = $3; HEAP32[$1 + 12 >> 2] = $3; HEAP32[$3 + 12 >> 2] = $0; HEAP32[$3 + 8 >> 2] = $1; break label$62; } HEAP32[$3 + 16 >> 2] = 0; HEAP32[$3 + 20 >> 2] = 0; $7 = $3; $0 = $6 >>> 8 | 0; $1 = 0; label$105 : { if (!$0) { break label$105 } $1 = 31; if ($6 >>> 0 > 16777215) { break label$105 } $2 = $0 + 1048320 >>> 16 & 8; $1 = $0 << $2; $0 = $1 + 520192 >>> 16 & 4; $4 = $1 << $0; $1 = $4 + 245760 >>> 16 & 2; $0 = ($4 << $1 >>> 15 | 0) - ($1 | ($0 | $2)) | 0; $1 = ($0 << 1 | $6 >>> $0 + 21 & 1) + 28 | 0; } $0 = $1; HEAP32[$7 + 28 >> 2] = $0; $1 = ($0 << 2) + 11892 | 0; $2 = HEAP32[2898]; $4 = 1 << $0; label$106 : { if (!($2 & $4)) { HEAP32[2898] = $2 | $4; HEAP32[$1 >> 2] = $3; HEAP32[$3 + 24 >> 2] = $1; break label$106; } $0 = $6 << (($0 | 0) == 31 ? 0 : 25 - ($0 >>> 1 | 0) | 0); $1 = HEAP32[$1 >> 2]; while (1) { $2 = $1; if (($6 | 0) == (HEAP32[$1 + 4 >> 2] & -8)) { break label$70 } $1 = $0 >>> 29 | 0; $0 = $0 << 1; $4 = ($2 + ($1 & 4) | 0) + 16 | 0; $1 = HEAP32[$4 >> 2]; if ($1) { continue } break; }; HEAP32[$4 >> 2] = $3; HEAP32[$3 + 24 >> 2] = $2; } HEAP32[$3 + 12 >> 2] = $3; HEAP32[$3 + 8 >> 2] = $3; break label$62; } $0 = HEAP32[$2 + 8 >> 2]; HEAP32[$0 + 12 >> 2] = $4; HEAP32[$2 + 8 >> 2] = $4; HEAP32[$4 + 24 >> 2] = 0; HEAP32[$4 + 12 >> 2] = $2; HEAP32[$4 + 8 >> 2] = $0; } $0 = $7 + 8 | 0; break label$1; } $0 = HEAP32[$2 + 8 >> 2]; HEAP32[$0 + 12 >> 2] = $3; HEAP32[$2 + 8 >> 2] = $3; HEAP32[$3 + 24 >> 2] = 0; HEAP32[$3 + 12 >> 2] = $2; HEAP32[$3 + 8 >> 2] = $0; } $0 = HEAP32[2900]; if ($0 >>> 0 <= $5 >>> 0) { break label$4 } $1 = $0 - $5 | 0; HEAP32[2900] = $1; $0 = HEAP32[2903]; $2 = $0 + $5 | 0; HEAP32[2903] = $2; HEAP32[$2 + 4 >> 2] = $1 | 1; HEAP32[$0 + 4 >> 2] = $5 | 3; $0 = $0 + 8 | 0; break label$1; } HEAP32[2896] = 48; $0 = 0; break label$1; } label$109 : { if (!$7) { break label$109 } $0 = HEAP32[$4 + 28 >> 2]; $3 = ($0 << 2) + 11892 | 0; label$110 : { if (HEAP32[$3 >> 2] == ($4 | 0)) { HEAP32[$3 >> 2] = $1; if ($1) { break label$110 } $8 = __wasm_rotl_i32(-2, $0) & $8; HEAP32[2898] = $8; break label$109; } HEAP32[$7 + (HEAP32[$7 + 16 >> 2] == ($4 | 0) ? 16 : 20) >> 2] = $1; if (!$1) { break label$109 } } HEAP32[$1 + 24 >> 2] = $7; $0 = HEAP32[$4 + 16 >> 2]; if ($0) { HEAP32[$1 + 16 >> 2] = $0; HEAP32[$0 + 24 >> 2] = $1; } $0 = HEAP32[$4 + 20 >> 2]; if (!$0) { break label$109 } HEAP32[$1 + 20 >> 2] = $0; HEAP32[$0 + 24 >> 2] = $1; } label$113 : { if ($2 >>> 0 <= 15) { $0 = $2 + $5 | 0; HEAP32[$4 + 4 >> 2] = $0 | 3; $0 = $0 + $4 | 0; HEAP32[$0 + 4 >> 2] = HEAP32[$0 + 4 >> 2] | 1; break label$113; } HEAP32[$4 + 4 >> 2] = $5 | 3; $1 = $4 + $5 | 0; HEAP32[$1 + 4 >> 2] = $2 | 1; HEAP32[$1 + $2 >> 2] = $2; if ($2 >>> 0 <= 255) { $2 = $2 >>> 3 | 0; $0 = ($2 << 3) + 11628 | 0; $3 = HEAP32[2897]; $2 = 1 << $2; label$116 : { if (!($3 & $2)) { HEAP32[2897] = $2 | $3; $2 = $0; break label$116; } $2 = HEAP32[$0 + 8 >> 2]; } HEAP32[$0 + 8 >> 2] = $1; HEAP32[$2 + 12 >> 2] = $1; HEAP32[$1 + 12 >> 2] = $0; HEAP32[$1 + 8 >> 2] = $2; break label$113; } $7 = $1; $0 = $2 >>> 8 | 0; $3 = 0; label$118 : { if (!$0) { break label$118 } $3 = 31; if ($2 >>> 0 > 16777215) { break label$118 } $5 = $0 + 1048320 >>> 16 & 8; $3 = $0 << $5; $0 = $3 + 520192 >>> 16 & 4; $6 = $3 << $0; $3 = $6 + 245760 >>> 16 & 2; $0 = ($6 << $3 >>> 15 | 0) - ($3 | ($0 | $5)) | 0; $3 = ($0 << 1 | $2 >>> $0 + 21 & 1) + 28 | 0; } $0 = $3; HEAP32[$7 + 28 >> 2] = $0; HEAP32[$1 + 16 >> 2] = 0; HEAP32[$1 + 20 >> 2] = 0; $3 = ($0 << 2) + 11892 | 0; label$119 : { $5 = 1 << $0; label$120 : { if (!($5 & $8)) { HEAP32[2898] = $5 | $8; HEAP32[$3 >> 2] = $1; break label$120; } $0 = $2 << (($0 | 0) == 31 ? 0 : 25 - ($0 >>> 1 | 0) | 0); $5 = HEAP32[$3 >> 2]; while (1) { $3 = $5; if ((HEAP32[$3 + 4 >> 2] & -8) == ($2 | 0)) { break label$119 } $5 = $0 >>> 29 | 0; $0 = $0 << 1; $6 = ($3 + ($5 & 4) | 0) + 16 | 0; $5 = HEAP32[$6 >> 2]; if ($5) { continue } break; }; HEAP32[$6 >> 2] = $1; } HEAP32[$1 + 24 >> 2] = $3; HEAP32[$1 + 12 >> 2] = $1; HEAP32[$1 + 8 >> 2] = $1; break label$113; } $0 = HEAP32[$3 + 8 >> 2]; HEAP32[$0 + 12 >> 2] = $1; HEAP32[$3 + 8 >> 2] = $1; HEAP32[$1 + 24 >> 2] = 0; HEAP32[$1 + 12 >> 2] = $3; HEAP32[$1 + 8 >> 2] = $0; } $0 = $4 + 8 | 0; break label$1; } label$123 : { if (!$9) { break label$123 } $0 = HEAP32[$1 + 28 >> 2]; $2 = ($0 << 2) + 11892 | 0; label$124 : { if (HEAP32[$2 >> 2] == ($1 | 0)) { HEAP32[$2 >> 2] = $4; if ($4) { break label$124 } (wasm2js_i32$0 = 11592, wasm2js_i32$1 = __wasm_rotl_i32(-2, $0) & $10), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; break label$123; } HEAP32[(HEAP32[$9 + 16 >> 2] == ($1 | 0) ? 16 : 20) + $9 >> 2] = $4; if (!$4) { break label$123 } } HEAP32[$4 + 24 >> 2] = $9; $0 = HEAP32[$1 + 16 >> 2]; if ($0) { HEAP32[$4 + 16 >> 2] = $0; HEAP32[$0 + 24 >> 2] = $4; } $0 = HEAP32[$1 + 20 >> 2]; if (!$0) { break label$123 } HEAP32[$4 + 20 >> 2] = $0; HEAP32[$0 + 24 >> 2] = $4; } label$127 : { if ($3 >>> 0 <= 15) { $0 = $3 + $5 | 0; HEAP32[$1 + 4 >> 2] = $0 | 3; $0 = $0 + $1 | 0; HEAP32[$0 + 4 >> 2] = HEAP32[$0 + 4 >> 2] | 1; break label$127; } HEAP32[$1 + 4 >> 2] = $5 | 3; $5 = $1 + $5 | 0; HEAP32[$5 + 4 >> 2] = $3 | 1; HEAP32[$3 + $5 >> 2] = $3; if ($7) { $4 = $7 >>> 3 | 0; $0 = ($4 << 3) + 11628 | 0; $2 = HEAP32[2902]; $4 = 1 << $4; label$130 : { if (!($4 & $6)) { HEAP32[2897] = $4 | $6; $6 = $0; break label$130; } $6 = HEAP32[$0 + 8 >> 2]; } HEAP32[$0 + 8 >> 2] = $2; HEAP32[$6 + 12 >> 2] = $2; HEAP32[$2 + 12 >> 2] = $0; HEAP32[$2 + 8 >> 2] = $6; } HEAP32[2902] = $5; HEAP32[2899] = $3; } $0 = $1 + 8 | 0; } global$0 = $11 + 16 | 0; return $0 | 0; } function dlfree($0) { $0 = $0 | 0; var $1 = 0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0; label$1 : { if (!$0) { break label$1 } $3 = $0 + -8 | 0; $2 = HEAP32[$0 + -4 >> 2]; $0 = $2 & -8; $5 = $3 + $0 | 0; label$2 : { if ($2 & 1) { break label$2 } if (!($2 & 3)) { break label$1 } $2 = HEAP32[$3 >> 2]; $3 = $3 - $2 | 0; if ($3 >>> 0 < HEAPU32[2901]) { break label$1 } $0 = $0 + $2 | 0; if (HEAP32[2902] != ($3 | 0)) { if ($2 >>> 0 <= 255) { $4 = HEAP32[$3 + 8 >> 2]; $2 = $2 >>> 3 | 0; $1 = HEAP32[$3 + 12 >> 2]; if (($1 | 0) == ($4 | 0)) { (wasm2js_i32$0 = 11588, wasm2js_i32$1 = HEAP32[2897] & __wasm_rotl_i32(-2, $2)), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; break label$2; } HEAP32[$4 + 12 >> 2] = $1; HEAP32[$1 + 8 >> 2] = $4; break label$2; } $7 = HEAP32[$3 + 24 >> 2]; $2 = HEAP32[$3 + 12 >> 2]; label$6 : { if (($2 | 0) != ($3 | 0)) { $1 = HEAP32[$3 + 8 >> 2]; HEAP32[$1 + 12 >> 2] = $2; HEAP32[$2 + 8 >> 2] = $1; break label$6; } label$9 : { $4 = $3 + 20 | 0; $1 = HEAP32[$4 >> 2]; if ($1) { break label$9 } $4 = $3 + 16 | 0; $1 = HEAP32[$4 >> 2]; if ($1) { break label$9 } $2 = 0; break label$6; } while (1) { $6 = $4; $2 = $1; $4 = $2 + 20 | 0; $1 = HEAP32[$4 >> 2]; if ($1) { continue } $4 = $2 + 16 | 0; $1 = HEAP32[$2 + 16 >> 2]; if ($1) { continue } break; }; HEAP32[$6 >> 2] = 0; } if (!$7) { break label$2 } $4 = HEAP32[$3 + 28 >> 2]; $1 = ($4 << 2) + 11892 | 0; label$11 : { if (HEAP32[$1 >> 2] == ($3 | 0)) { HEAP32[$1 >> 2] = $2; if ($2) { break label$11 } (wasm2js_i32$0 = 11592, wasm2js_i32$1 = HEAP32[2898] & __wasm_rotl_i32(-2, $4)), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; break label$2; } HEAP32[$7 + (HEAP32[$7 + 16 >> 2] == ($3 | 0) ? 16 : 20) >> 2] = $2; if (!$2) { break label$2 } } HEAP32[$2 + 24 >> 2] = $7; $1 = HEAP32[$3 + 16 >> 2]; if ($1) { HEAP32[$2 + 16 >> 2] = $1; HEAP32[$1 + 24 >> 2] = $2; } $1 = HEAP32[$3 + 20 >> 2]; if (!$1) { break label$2 } HEAP32[$2 + 20 >> 2] = $1; HEAP32[$1 + 24 >> 2] = $2; break label$2; } $2 = HEAP32[$5 + 4 >> 2]; if (($2 & 3) != 3) { break label$2 } HEAP32[2899] = $0; HEAP32[$5 + 4 >> 2] = $2 & -2; HEAP32[$3 + 4 >> 2] = $0 | 1; HEAP32[$0 + $3 >> 2] = $0; return; } if ($5 >>> 0 <= $3 >>> 0) { break label$1 } $2 = HEAP32[$5 + 4 >> 2]; if (!($2 & 1)) { break label$1 } label$14 : { if (!($2 & 2)) { if (($5 | 0) == HEAP32[2903]) { HEAP32[2903] = $3; $0 = HEAP32[2900] + $0 | 0; HEAP32[2900] = $0; HEAP32[$3 + 4 >> 2] = $0 | 1; if (HEAP32[2902] != ($3 | 0)) { break label$1 } HEAP32[2899] = 0; HEAP32[2902] = 0; return; } if (($5 | 0) == HEAP32[2902]) { HEAP32[2902] = $3; $0 = HEAP32[2899] + $0 | 0; HEAP32[2899] = $0; HEAP32[$3 + 4 >> 2] = $0 | 1; HEAP32[$0 + $3 >> 2] = $0; return; } $0 = ($2 & -8) + $0 | 0; label$18 : { if ($2 >>> 0 <= 255) { $1 = HEAP32[$5 + 8 >> 2]; $2 = $2 >>> 3 | 0; $4 = HEAP32[$5 + 12 >> 2]; if (($1 | 0) == ($4 | 0)) { (wasm2js_i32$0 = 11588, wasm2js_i32$1 = HEAP32[2897] & __wasm_rotl_i32(-2, $2)), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; break label$18; } HEAP32[$1 + 12 >> 2] = $4; HEAP32[$4 + 8 >> 2] = $1; break label$18; } $7 = HEAP32[$5 + 24 >> 2]; $2 = HEAP32[$5 + 12 >> 2]; label$23 : { if (($5 | 0) != ($2 | 0)) { $1 = HEAP32[$5 + 8 >> 2]; HEAP32[$1 + 12 >> 2] = $2; HEAP32[$2 + 8 >> 2] = $1; break label$23; } label$26 : { $4 = $5 + 20 | 0; $1 = HEAP32[$4 >> 2]; if ($1) { break label$26 } $4 = $5 + 16 | 0; $1 = HEAP32[$4 >> 2]; if ($1) { break label$26 } $2 = 0; break label$23; } while (1) { $6 = $4; $2 = $1; $4 = $2 + 20 | 0; $1 = HEAP32[$4 >> 2]; if ($1) { continue } $4 = $2 + 16 | 0; $1 = HEAP32[$2 + 16 >> 2]; if ($1) { continue } break; }; HEAP32[$6 >> 2] = 0; } if (!$7) { break label$18 } $4 = HEAP32[$5 + 28 >> 2]; $1 = ($4 << 2) + 11892 | 0; label$28 : { if (($5 | 0) == HEAP32[$1 >> 2]) { HEAP32[$1 >> 2] = $2; if ($2) { break label$28 } (wasm2js_i32$0 = 11592, wasm2js_i32$1 = HEAP32[2898] & __wasm_rotl_i32(-2, $4)), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; break label$18; } HEAP32[$7 + (($5 | 0) == HEAP32[$7 + 16 >> 2] ? 16 : 20) >> 2] = $2; if (!$2) { break label$18 } } HEAP32[$2 + 24 >> 2] = $7; $1 = HEAP32[$5 + 16 >> 2]; if ($1) { HEAP32[$2 + 16 >> 2] = $1; HEAP32[$1 + 24 >> 2] = $2; } $1 = HEAP32[$5 + 20 >> 2]; if (!$1) { break label$18 } HEAP32[$2 + 20 >> 2] = $1; HEAP32[$1 + 24 >> 2] = $2; } HEAP32[$3 + 4 >> 2] = $0 | 1; HEAP32[$0 + $3 >> 2] = $0; if (HEAP32[2902] != ($3 | 0)) { break label$14 } HEAP32[2899] = $0; return; } HEAP32[$5 + 4 >> 2] = $2 & -2; HEAP32[$3 + 4 >> 2] = $0 | 1; HEAP32[$0 + $3 >> 2] = $0; } if ($0 >>> 0 <= 255) { $0 = $0 >>> 3 | 0; $2 = ($0 << 3) + 11628 | 0; $1 = HEAP32[2897]; $0 = 1 << $0; label$32 : { if (!($1 & $0)) { HEAP32[2897] = $0 | $1; $0 = $2; break label$32; } $0 = HEAP32[$2 + 8 >> 2]; } HEAP32[$2 + 8 >> 2] = $3; HEAP32[$0 + 12 >> 2] = $3; HEAP32[$3 + 12 >> 2] = $2; HEAP32[$3 + 8 >> 2] = $0; return; } HEAP32[$3 + 16 >> 2] = 0; HEAP32[$3 + 20 >> 2] = 0; $5 = $3; $4 = $0 >>> 8 | 0; $1 = 0; label$34 : { if (!$4) { break label$34 } $1 = 31; if ($0 >>> 0 > 16777215) { break label$34 } $2 = $4; $4 = $4 + 1048320 >>> 16 & 8; $1 = $2 << $4; $7 = $1 + 520192 >>> 16 & 4; $1 = $1 << $7; $6 = $1 + 245760 >>> 16 & 2; $1 = ($1 << $6 >>> 15 | 0) - ($6 | ($4 | $7)) | 0; $1 = ($1 << 1 | $0 >>> $1 + 21 & 1) + 28 | 0; } HEAP32[$5 + 28 >> 2] = $1; $6 = ($1 << 2) + 11892 | 0; label$35 : { label$36 : { $4 = HEAP32[2898]; $2 = 1 << $1; label$37 : { if (!($4 & $2)) { HEAP32[2898] = $2 | $4; HEAP32[$6 >> 2] = $3; HEAP32[$3 + 24 >> 2] = $6; break label$37; } $4 = $0 << (($1 | 0) == 31 ? 0 : 25 - ($1 >>> 1 | 0) | 0); $2 = HEAP32[$6 >> 2]; while (1) { $1 = $2; if ((HEAP32[$2 + 4 >> 2] & -8) == ($0 | 0)) { break label$36 } $2 = $4 >>> 29 | 0; $4 = $4 << 1; $6 = ($1 + ($2 & 4) | 0) + 16 | 0; $2 = HEAP32[$6 >> 2]; if ($2) { continue } break; }; HEAP32[$6 >> 2] = $3; HEAP32[$3 + 24 >> 2] = $1; } HEAP32[$3 + 12 >> 2] = $3; HEAP32[$3 + 8 >> 2] = $3; break label$35; } $0 = HEAP32[$1 + 8 >> 2]; HEAP32[$0 + 12 >> 2] = $3; HEAP32[$1 + 8 >> 2] = $3; HEAP32[$3 + 24 >> 2] = 0; HEAP32[$3 + 12 >> 2] = $1; HEAP32[$3 + 8 >> 2] = $0; } $0 = HEAP32[2905] + -1 | 0; HEAP32[2905] = $0; if ($0) { break label$1 } $3 = 12044; while (1) { $0 = HEAP32[$3 >> 2]; $3 = $0 + 8 | 0; if ($0) { continue } break; }; HEAP32[2905] = -1; } } function dlcalloc($0, $1) { var $2 = 0, $3 = 0, $4 = 0; $2 = 0; label$2 : { if (!$0) { break label$2 } $3 = __wasm_i64_mul($0, 0, $1, 0); $4 = i64toi32_i32$HIGH_BITS; $2 = $3; if (($0 | $1) >>> 0 < 65536) { break label$2 } $2 = $4 ? -1 : $3; } $1 = $2; $0 = dlmalloc($1); if (!(!$0 | !(HEAPU8[$0 + -4 | 0] & 3))) { memset($0, $1) } return $0; } function dlrealloc($0, $1) { var $2 = 0, $3 = 0; if (!$0) { return dlmalloc($1) } if ($1 >>> 0 >= 4294967232) { HEAP32[2896] = 48; return 0; } $2 = try_realloc_chunk($0 + -8 | 0, $1 >>> 0 < 11 ? 16 : $1 + 11 & -8); if ($2) { return $2 + 8 | 0 } $2 = dlmalloc($1); if (!$2) { return 0 } $3 = HEAP32[$0 + -4 >> 2]; $3 = ($3 & 3 ? -4 : -8) + ($3 & -8) | 0; memcpy($2, $0, $3 >>> 0 < $1 >>> 0 ? $3 : $1); dlfree($0); return $2; } function try_realloc_chunk($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0; $7 = HEAP32[$0 + 4 >> 2]; $2 = $7 & 3; $3 = $7 & -8; $5 = $3 + $0 | 0; label$2 : { if (!$2) { $2 = 0; if ($1 >>> 0 < 256) { break label$2 } if ($3 >>> 0 >= $1 + 4 >>> 0) { $2 = $0; if ($3 - $1 >>> 0 <= HEAP32[3017] << 1 >>> 0) { break label$2 } } return 0; } label$5 : { if ($3 >>> 0 >= $1 >>> 0) { $2 = $3 - $1 | 0; if ($2 >>> 0 < 16) { break label$5 } HEAP32[$0 + 4 >> 2] = $7 & 1 | $1 | 2; $1 = $0 + $1 | 0; HEAP32[$1 + 4 >> 2] = $2 | 3; HEAP32[$5 + 4 >> 2] = HEAP32[$5 + 4 >> 2] | 1; dispose_chunk($1, $2); break label$5; } $2 = 0; if (($5 | 0) == HEAP32[2903]) { $4 = $3 + HEAP32[2900] | 0; if ($4 >>> 0 <= $1 >>> 0) { break label$2 } HEAP32[$0 + 4 >> 2] = $7 & 1 | $1 | 2; $2 = $0 + $1 | 0; $1 = $4 - $1 | 0; HEAP32[$2 + 4 >> 2] = $1 | 1; HEAP32[2900] = $1; HEAP32[2903] = $2; break label$5; } if (($5 | 0) == HEAP32[2902]) { $4 = $3 + HEAP32[2899] | 0; if ($4 >>> 0 < $1 >>> 0) { break label$2 } $2 = $4 - $1 | 0; label$9 : { if ($2 >>> 0 >= 16) { HEAP32[$0 + 4 >> 2] = $7 & 1 | $1 | 2; $1 = $0 + $1 | 0; HEAP32[$1 + 4 >> 2] = $2 | 1; $4 = $0 + $4 | 0; HEAP32[$4 >> 2] = $2; HEAP32[$4 + 4 >> 2] = HEAP32[$4 + 4 >> 2] & -2; break label$9; } HEAP32[$0 + 4 >> 2] = $4 | $7 & 1 | 2; $1 = $0 + $4 | 0; HEAP32[$1 + 4 >> 2] = HEAP32[$1 + 4 >> 2] | 1; $2 = 0; $1 = 0; } HEAP32[2902] = $1; HEAP32[2899] = $2; break label$5; } $6 = HEAP32[$5 + 4 >> 2]; if ($6 & 2) { break label$2 } $8 = $3 + ($6 & -8) | 0; if ($8 >>> 0 < $1 >>> 0) { break label$2 } $10 = $8 - $1 | 0; label$11 : { if ($6 >>> 0 <= 255) { $2 = $6 >>> 3 | 0; $6 = HEAP32[$5 + 8 >> 2]; $4 = HEAP32[$5 + 12 >> 2]; if (($6 | 0) == ($4 | 0)) { (wasm2js_i32$0 = 11588, wasm2js_i32$1 = HEAP32[2897] & __wasm_rotl_i32(-2, $2)), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; break label$11; } HEAP32[$6 + 12 >> 2] = $4; HEAP32[$4 + 8 >> 2] = $6; break label$11; } $9 = HEAP32[$5 + 24 >> 2]; $3 = HEAP32[$5 + 12 >> 2]; label$14 : { if (($5 | 0) != ($3 | 0)) { $2 = HEAP32[$5 + 8 >> 2]; HEAP32[$2 + 12 >> 2] = $3; HEAP32[$3 + 8 >> 2] = $2; break label$14; } label$17 : { $2 = $5 + 20 | 0; $6 = HEAP32[$2 >> 2]; if ($6) { break label$17 } $2 = $5 + 16 | 0; $6 = HEAP32[$2 >> 2]; if ($6) { break label$17 } $3 = 0; break label$14; } while (1) { $4 = $2; $3 = $6; $2 = $3 + 20 | 0; $6 = HEAP32[$2 >> 2]; if ($6) { continue } $2 = $3 + 16 | 0; $6 = HEAP32[$3 + 16 >> 2]; if ($6) { continue } break; }; HEAP32[$4 >> 2] = 0; } if (!$9) { break label$11 } $4 = HEAP32[$5 + 28 >> 2]; $2 = ($4 << 2) + 11892 | 0; label$19 : { if (($5 | 0) == HEAP32[$2 >> 2]) { HEAP32[$2 >> 2] = $3; if ($3) { break label$19 } (wasm2js_i32$0 = 11592, wasm2js_i32$1 = HEAP32[2898] & __wasm_rotl_i32(-2, $4)), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; break label$11; } HEAP32[(($5 | 0) == HEAP32[$9 + 16 >> 2] ? 16 : 20) + $9 >> 2] = $3; if (!$3) { break label$11 } } HEAP32[$3 + 24 >> 2] = $9; $2 = HEAP32[$5 + 16 >> 2]; if ($2) { HEAP32[$3 + 16 >> 2] = $2; HEAP32[$2 + 24 >> 2] = $3; } $2 = HEAP32[$5 + 20 >> 2]; if (!$2) { break label$11 } HEAP32[$3 + 20 >> 2] = $2; HEAP32[$2 + 24 >> 2] = $3; } if ($10 >>> 0 <= 15) { HEAP32[$0 + 4 >> 2] = $7 & 1 | $8 | 2; $1 = $0 + $8 | 0; HEAP32[$1 + 4 >> 2] = HEAP32[$1 + 4 >> 2] | 1; break label$5; } HEAP32[$0 + 4 >> 2] = $7 & 1 | $1 | 2; $2 = $0 + $1 | 0; HEAP32[$2 + 4 >> 2] = $10 | 3; $1 = $0 + $8 | 0; HEAP32[$1 + 4 >> 2] = HEAP32[$1 + 4 >> 2] | 1; dispose_chunk($2, $10); } $2 = $0; } return $2; } function dispose_chunk($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0; $5 = $0 + $1 | 0; label$1 : { label$2 : { $2 = HEAP32[$0 + 4 >> 2]; if ($2 & 1) { break label$2 } if (!($2 & 3)) { break label$1 } $2 = HEAP32[$0 >> 2]; $1 = $2 + $1 | 0; $0 = $0 - $2 | 0; if (($0 | 0) != HEAP32[2902]) { if ($2 >>> 0 <= 255) { $4 = $2 >>> 3 | 0; $2 = HEAP32[$0 + 8 >> 2]; $3 = HEAP32[$0 + 12 >> 2]; if (($3 | 0) == ($2 | 0)) { (wasm2js_i32$0 = 11588, wasm2js_i32$1 = HEAP32[2897] & __wasm_rotl_i32(-2, $4)), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; break label$2; } HEAP32[$2 + 12 >> 2] = $3; HEAP32[$3 + 8 >> 2] = $2; break label$2; } $7 = HEAP32[$0 + 24 >> 2]; $2 = HEAP32[$0 + 12 >> 2]; label$6 : { if (($2 | 0) != ($0 | 0)) { $3 = HEAP32[$0 + 8 >> 2]; HEAP32[$3 + 12 >> 2] = $2; HEAP32[$2 + 8 >> 2] = $3; break label$6; } label$9 : { $3 = $0 + 20 | 0; $4 = HEAP32[$3 >> 2]; if ($4) { break label$9 } $3 = $0 + 16 | 0; $4 = HEAP32[$3 >> 2]; if ($4) { break label$9 } $2 = 0; break label$6; } while (1) { $6 = $3; $2 = $4; $3 = $2 + 20 | 0; $4 = HEAP32[$3 >> 2]; if ($4) { continue } $3 = $2 + 16 | 0; $4 = HEAP32[$2 + 16 >> 2]; if ($4) { continue } break; }; HEAP32[$6 >> 2] = 0; } if (!$7) { break label$2 } $3 = HEAP32[$0 + 28 >> 2]; $4 = ($3 << 2) + 11892 | 0; label$11 : { if (HEAP32[$4 >> 2] == ($0 | 0)) { HEAP32[$4 >> 2] = $2; if ($2) { break label$11 } (wasm2js_i32$0 = 11592, wasm2js_i32$1 = HEAP32[2898] & __wasm_rotl_i32(-2, $3)), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; break label$2; } HEAP32[$7 + (HEAP32[$7 + 16 >> 2] == ($0 | 0) ? 16 : 20) >> 2] = $2; if (!$2) { break label$2 } } HEAP32[$2 + 24 >> 2] = $7; $3 = HEAP32[$0 + 16 >> 2]; if ($3) { HEAP32[$2 + 16 >> 2] = $3; HEAP32[$3 + 24 >> 2] = $2; } $3 = HEAP32[$0 + 20 >> 2]; if (!$3) { break label$2 } HEAP32[$2 + 20 >> 2] = $3; HEAP32[$3 + 24 >> 2] = $2; break label$2; } $2 = HEAP32[$5 + 4 >> 2]; if (($2 & 3) != 3) { break label$2 } HEAP32[2899] = $1; HEAP32[$5 + 4 >> 2] = $2 & -2; HEAP32[$0 + 4 >> 2] = $1 | 1; HEAP32[$5 >> 2] = $1; return; } $2 = HEAP32[$5 + 4 >> 2]; label$14 : { if (!($2 & 2)) { if (($5 | 0) == HEAP32[2903]) { HEAP32[2903] = $0; $1 = HEAP32[2900] + $1 | 0; HEAP32[2900] = $1; HEAP32[$0 + 4 >> 2] = $1 | 1; if (HEAP32[2902] != ($0 | 0)) { break label$1 } HEAP32[2899] = 0; HEAP32[2902] = 0; return; } if (($5 | 0) == HEAP32[2902]) { HEAP32[2902] = $0; $1 = HEAP32[2899] + $1 | 0; HEAP32[2899] = $1; HEAP32[$0 + 4 >> 2] = $1 | 1; HEAP32[$0 + $1 >> 2] = $1; return; } $1 = ($2 & -8) + $1 | 0; label$18 : { if ($2 >>> 0 <= 255) { $4 = $2 >>> 3 | 0; $2 = HEAP32[$5 + 8 >> 2]; $3 = HEAP32[$5 + 12 >> 2]; if (($2 | 0) == ($3 | 0)) { (wasm2js_i32$0 = 11588, wasm2js_i32$1 = HEAP32[2897] & __wasm_rotl_i32(-2, $4)), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; break label$18; } HEAP32[$2 + 12 >> 2] = $3; HEAP32[$3 + 8 >> 2] = $2; break label$18; } $7 = HEAP32[$5 + 24 >> 2]; $2 = HEAP32[$5 + 12 >> 2]; label$21 : { if (($5 | 0) != ($2 | 0)) { $3 = HEAP32[$5 + 8 >> 2]; HEAP32[$3 + 12 >> 2] = $2; HEAP32[$2 + 8 >> 2] = $3; break label$21; } label$24 : { $3 = $5 + 20 | 0; $4 = HEAP32[$3 >> 2]; if ($4) { break label$24 } $3 = $5 + 16 | 0; $4 = HEAP32[$3 >> 2]; if ($4) { break label$24 } $2 = 0; break label$21; } while (1) { $6 = $3; $2 = $4; $3 = $2 + 20 | 0; $4 = HEAP32[$3 >> 2]; if ($4) { continue } $3 = $2 + 16 | 0; $4 = HEAP32[$2 + 16 >> 2]; if ($4) { continue } break; }; HEAP32[$6 >> 2] = 0; } if (!$7) { break label$18 } $3 = HEAP32[$5 + 28 >> 2]; $4 = ($3 << 2) + 11892 | 0; label$26 : { if (($5 | 0) == HEAP32[$4 >> 2]) { HEAP32[$4 >> 2] = $2; if ($2) { break label$26 } (wasm2js_i32$0 = 11592, wasm2js_i32$1 = HEAP32[2898] & __wasm_rotl_i32(-2, $3)), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; break label$18; } HEAP32[$7 + (($5 | 0) == HEAP32[$7 + 16 >> 2] ? 16 : 20) >> 2] = $2; if (!$2) { break label$18 } } HEAP32[$2 + 24 >> 2] = $7; $3 = HEAP32[$5 + 16 >> 2]; if ($3) { HEAP32[$2 + 16 >> 2] = $3; HEAP32[$3 + 24 >> 2] = $2; } $3 = HEAP32[$5 + 20 >> 2]; if (!$3) { break label$18 } HEAP32[$2 + 20 >> 2] = $3; HEAP32[$3 + 24 >> 2] = $2; } HEAP32[$0 + 4 >> 2] = $1 | 1; HEAP32[$0 + $1 >> 2] = $1; if (HEAP32[2902] != ($0 | 0)) { break label$14 } HEAP32[2899] = $1; return; } HEAP32[$5 + 4 >> 2] = $2 & -2; HEAP32[$0 + 4 >> 2] = $1 | 1; HEAP32[$0 + $1 >> 2] = $1; } if ($1 >>> 0 <= 255) { $2 = $1 >>> 3 | 0; $1 = ($2 << 3) + 11628 | 0; $3 = HEAP32[2897]; $2 = 1 << $2; label$30 : { if (!($3 & $2)) { HEAP32[2897] = $2 | $3; $2 = $1; break label$30; } $2 = HEAP32[$1 + 8 >> 2]; } HEAP32[$1 + 8 >> 2] = $0; HEAP32[$2 + 12 >> 2] = $0; HEAP32[$0 + 12 >> 2] = $1; HEAP32[$0 + 8 >> 2] = $2; return; } HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 + 20 >> 2] = 0; $3 = $0; $4 = $1 >>> 8 | 0; $2 = 0; label$32 : { if (!$4) { break label$32 } $2 = 31; if ($1 >>> 0 > 16777215) { break label$32 } $6 = $4 + 1048320 >>> 16 & 8; $4 = $4 << $6; $2 = $4 + 520192 >>> 16 & 4; $5 = $4 << $2; $4 = $5 + 245760 >>> 16 & 2; $2 = ($5 << $4 >>> 15 | 0) - ($4 | ($2 | $6)) | 0; $2 = ($2 << 1 | $1 >>> $2 + 21 & 1) + 28 | 0; } HEAP32[$3 + 28 >> 2] = $2; $4 = ($2 << 2) + 11892 | 0; label$33 : { $3 = HEAP32[2898]; $6 = 1 << $2; label$34 : { if (!($3 & $6)) { HEAP32[2898] = $3 | $6; HEAP32[$4 >> 2] = $0; break label$34; } $3 = $1 << (($2 | 0) == 31 ? 0 : 25 - ($2 >>> 1 | 0) | 0); $2 = HEAP32[$4 >> 2]; while (1) { $4 = $2; if ((HEAP32[$2 + 4 >> 2] & -8) == ($1 | 0)) { break label$33 } $2 = $3 >>> 29 | 0; $3 = $3 << 1; $6 = ($4 + ($2 & 4) | 0) + 16 | 0; $2 = HEAP32[$6 >> 2]; if ($2) { continue } break; }; HEAP32[$6 >> 2] = $0; } HEAP32[$0 + 24 >> 2] = $4; HEAP32[$0 + 12 >> 2] = $0; HEAP32[$0 + 8 >> 2] = $0; return; } $1 = HEAP32[$4 + 8 >> 2]; HEAP32[$1 + 12 >> 2] = $0; HEAP32[$4 + 8 >> 2] = $0; HEAP32[$0 + 24 >> 2] = 0; HEAP32[$0 + 12 >> 2] = $4; HEAP32[$0 + 8 >> 2] = $1; } } function memchr($0, $1) { var $2 = 0; $2 = ($1 | 0) != 0; label$1 : { label$2 : { label$3 : { if (!$1 | !($0 & 3)) { break label$3 } while (1) { if (HEAPU8[$0 | 0] == 79) { break label$2 } $0 = $0 + 1 | 0; $1 = $1 + -1 | 0; $2 = ($1 | 0) != 0; if (!$1) { break label$3 } if ($0 & 3) { continue } break; }; } if (!$2) { break label$1 } } label$5 : { if (HEAPU8[$0 | 0] == 79 | $1 >>> 0 < 4) { break label$5 } while (1) { $2 = HEAP32[$0 >> 2] ^ 1330597711; if (($2 ^ -1) & $2 + -16843009 & -2139062144) { break label$5 } $0 = $0 + 4 | 0; $1 = $1 + -4 | 0; if ($1 >>> 0 > 3) { continue } break; }; } if (!$1) { break label$1 } while (1) { if (HEAPU8[$0 | 0] == 79) { return $0 } $0 = $0 + 1 | 0; $1 = $1 + -1 | 0; if ($1) { continue } break; }; } return 0; } function frexp($0, $1) { var $2 = 0, $3 = 0, $4 = 0; wasm2js_scratch_store_f64(+$0); $2 = wasm2js_scratch_load_i32(1) | 0; $3 = wasm2js_scratch_load_i32(0) | 0; $4 = $2; $2 = $2 >>> 20 & 2047; if (($2 | 0) != 2047) { if (!$2) { $2 = $1; if ($0 == 0.0) { $1 = 0 } else { $0 = frexp($0 * 18446744073709551615.0, $1); $1 = HEAP32[$1 >> 2] + -64 | 0; } HEAP32[$2 >> 2] = $1; return $0; } HEAP32[$1 >> 2] = $2 + -1022; wasm2js_scratch_store_i32(0, $3 | 0); wasm2js_scratch_store_i32(1, $4 & -2146435073 | 1071644672); $0 = +wasm2js_scratch_load_f64(); } return $0; } function __ashlti3($0, $1, $2, $3, $4, $5) { var $6 = 0, $7 = 0, $8 = 0, $9 = 0; label$1 : { if ($5 & 64) { $3 = $1; $4 = $5 + -64 | 0; $1 = $4 & 31; if (32 <= ($4 & 63) >>> 0) { $4 = $3 << $1; $3 = 0; } else { $4 = (1 << $1) - 1 & $3 >>> 32 - $1 | $2 << $1; $3 = $3 << $1; } $1 = 0; $2 = 0; break label$1; } if (!$5) { break label$1 } $6 = $3; $8 = $5; $3 = $5 & 31; if (32 <= ($5 & 63) >>> 0) { $7 = $6 << $3; $9 = 0; } else { $7 = (1 << $3) - 1 & $6 >>> 32 - $3 | $4 << $3; $9 = $6 << $3; } $3 = $2; $6 = $1; $5 = 64 - $5 | 0; $4 = $5 & 31; if (32 <= ($5 & 63) >>> 0) { $5 = 0; $3 = $3 >>> $4 | 0; } else { $5 = $3 >>> $4 | 0; $3 = ((1 << $4) - 1 & $3) << 32 - $4 | $6 >>> $4; } $3 = $9 | $3; $4 = $5 | $7; $5 = $1; $1 = $8 & 31; if (32 <= ($8 & 63) >>> 0) { $7 = $5 << $1; $1 = 0; } else { $7 = (1 << $1) - 1 & $5 >>> 32 - $1 | $2 << $1; $1 = $5 << $1; } $2 = $7; } HEAP32[$0 >> 2] = $1; HEAP32[$0 + 4 >> 2] = $2; HEAP32[$0 + 8 >> 2] = $3; HEAP32[$0 + 12 >> 2] = $4; } function __lshrti3($0, $1, $2, $3, $4, $5) { var $6 = 0, $7 = 0, $8 = 0, $9 = 0; label$1 : { if ($5 & 64) { $2 = $5 + -64 | 0; $1 = $2 & 31; if (32 <= ($2 & 63) >>> 0) { $2 = 0; $1 = $4 >>> $1 | 0; } else { $2 = $4 >>> $1 | 0; $1 = ((1 << $1) - 1 & $4) << 32 - $1 | $3 >>> $1; } $3 = 0; $4 = 0; break label$1; } if (!$5) { break label$1 } $7 = $4; $8 = $3; $9 = 64 - $5 | 0; $6 = $9 & 31; if (32 <= ($9 & 63) >>> 0) { $7 = $8 << $6; $9 = 0; } else { $7 = (1 << $6) - 1 & $8 >>> 32 - $6 | $7 << $6; $9 = $8 << $6; } $8 = $1; $6 = $5; $1 = $6 & 31; if (32 <= ($6 & 63) >>> 0) { $6 = 0; $1 = $2 >>> $1 | 0; } else { $6 = $2 >>> $1 | 0; $1 = ((1 << $1) - 1 & $2) << 32 - $1 | $8 >>> $1; } $1 = $9 | $1; $2 = $6 | $7; $6 = $3; $3 = $5 & 31; if (32 <= ($5 & 63) >>> 0) { $7 = 0; $3 = $4 >>> $3 | 0; } else { $7 = $4 >>> $3 | 0; $3 = ((1 << $3) - 1 & $4) << 32 - $3 | $6 >>> $3; } $4 = $7; } HEAP32[$0 >> 2] = $1; HEAP32[$0 + 4 >> 2] = $2; HEAP32[$0 + 8 >> 2] = $3; HEAP32[$0 + 12 >> 2] = $4; } function __trunctfdf2($0, $1, $2, $3) { var $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0; $6 = global$0 - 32 | 0; global$0 = $6; $4 = $3 & 2147483647; $8 = $4; $4 = $4 + -1006698496 | 0; $7 = $2; $5 = $2; if ($2 >>> 0 < 0) { $4 = $4 + 1 | 0 } $9 = $5; $5 = $4; $4 = $8 + -1140785152 | 0; $10 = $7; if ($7 >>> 0 < 0) { $4 = $4 + 1 | 0 } label$1 : { if (($4 | 0) == ($5 | 0) & $9 >>> 0 < $10 >>> 0 | $5 >>> 0 < $4 >>> 0) { $4 = $3 << 4 | $2 >>> 28; $2 = $2 << 4 | $1 >>> 28; $1 = $1 & 268435455; $7 = $1; if (($1 | 0) == 134217728 & $0 >>> 0 >= 1 | $1 >>> 0 > 134217728) { $4 = $4 + 1073741824 | 0; $0 = $2 + 1 | 0; if ($0 >>> 0 < 1) { $4 = $4 + 1 | 0 } $5 = $0; break label$1; } $5 = $2; $4 = $4 - (($2 >>> 0 < 0) + -1073741824 | 0) | 0; if ($0 | $7 ^ 134217728) { break label$1 } $0 = $5 + ($5 & 1) | 0; if ($0 >>> 0 < $5 >>> 0) { $4 = $4 + 1 | 0 } $5 = $0; break label$1; } if (!(!$7 & ($8 | 0) == 2147418112 ? !($0 | $1) : ($8 | 0) == 2147418112 & $7 >>> 0 < 0 | $8 >>> 0 < 2147418112)) { $4 = $3 << 4 | $2 >>> 28; $5 = $2 << 4 | $1 >>> 28; $4 = $4 & 524287 | 2146959360; break label$1; } $5 = 0; $4 = 2146435072; if ($8 >>> 0 > 1140785151) { break label$1 } $4 = 0; $7 = $8 >>> 16 | 0; if ($7 >>> 0 < 15249) { break label$1 } $4 = $3 & 65535 | 65536; __ashlti3($6 + 16 | 0, $0, $1, $2, $4, $7 + -15233 | 0); __lshrti3($6, $0, $1, $2, $4, 15361 - $7 | 0); $2 = HEAP32[$6 + 4 >> 2]; $0 = HEAP32[$6 + 8 >> 2]; $4 = HEAP32[$6 + 12 >> 2] << 4 | $0 >>> 28; $5 = $0 << 4 | $2 >>> 28; $0 = $2 & 268435455; $2 = $0; $1 = HEAP32[$6 >> 2] | ((HEAP32[$6 + 16 >> 2] | HEAP32[$6 + 24 >> 2]) != 0 | (HEAP32[$6 + 20 >> 2] | HEAP32[$6 + 28 >> 2]) != 0); if (($0 | 0) == 134217728 & $1 >>> 0 >= 1 | $0 >>> 0 > 134217728) { $0 = $5 + 1 | 0; if ($0 >>> 0 < 1) { $4 = $4 + 1 | 0 } $5 = $0; break label$1; } if ($1 | $2 ^ 134217728) { break label$1 } $0 = $5 + ($5 & 1) | 0; if ($0 >>> 0 < $5 >>> 0) { $4 = $4 + 1 | 0 } $5 = $0; } global$0 = $6 + 32 | 0; wasm2js_scratch_store_i32(0, $5 | 0); wasm2js_scratch_store_i32(1, $3 & -2147483648 | $4); return +wasm2js_scratch_load_f64(); } function FLAC__crc8($0, $1) { var $2 = 0; if ($1) { while (1) { $2 = HEAPU8[(HEAPU8[$0 | 0] ^ $2) + 1024 | 0]; $0 = $0 + 1 | 0; $1 = $1 + -1 | 0; if ($1) { continue } break; } } return $2; } function FLAC__crc16($0, $1) { var $2 = 0, $3 = 0; if ($1 >>> 0 > 7) { while (1) { $3 = $2; $2 = HEAPU8[$0 | 0] | HEAPU8[$0 + 1 | 0] << 8; $2 = $3 ^ ($2 << 8 & 16711680 | $2 << 24) >>> 16; $2 = HEAPU16[(HEAPU8[$0 + 7 | 0] << 1) + 1280 >> 1] ^ (HEAPU16[((HEAPU8[$0 + 6 | 0] << 1) + 1280 | 0) + 512 >> 1] ^ (HEAPU16[(HEAPU8[$0 + 5 | 0] << 1) + 2304 >> 1] ^ (HEAPU16[(HEAPU8[$0 + 4 | 0] << 1) + 2816 >> 1] ^ (HEAPU16[(HEAPU8[$0 + 3 | 0] << 1) + 3328 >> 1] ^ (HEAPU16[(HEAPU8[$0 + 2 | 0] << 1) + 3840 >> 1] ^ (HEAPU16[(($2 & 255) << 1) + 4352 >> 1] ^ HEAPU16[($2 >>> 7 & 510) + 4864 >> 1])))))); $0 = $0 + 8 | 0; $1 = $1 + -8 | 0; if ($1 >>> 0 > 7) { continue } break; } } if ($1) { while (1) { $2 = HEAPU16[((HEAPU8[$0 | 0] ^ ($2 & 65280) >>> 8) << 1) + 1280 >> 1] ^ $2 << 8; $0 = $0 + 1 | 0; $1 = $1 + -1 | 0; if ($1) { continue } break; } } return $2 & 65535; } function FLAC__crc16_update_words32($0, $1, $2) { var $3 = 0; if ($1 >>> 0 >= 2) { while (1) { $3 = $2; $2 = HEAP32[$0 >> 2]; $3 = $3 ^ $2 >>> 16; $3 = HEAPU16[(($3 & 255) << 1) + 4352 >> 1] ^ HEAPU16[($3 >>> 7 & 510) + 4864 >> 1] ^ HEAPU16[($2 >>> 7 & 510) + 3840 >> 1] ^ HEAPU16[(($2 & 255) << 1) + 3328 >> 1]; $2 = HEAP32[$0 + 4 >> 2]; $2 = $3 ^ HEAPU16[($2 >>> 23 & 510) + 2816 >> 1] ^ HEAPU16[($2 >>> 15 & 510) + 2304 >> 1] ^ HEAPU16[(($2 >>> 7 & 510) + 1280 | 0) + 512 >> 1] ^ HEAPU16[(($2 & 255) << 1) + 1280 >> 1]; $0 = $0 + 8 | 0; $1 = $1 + -2 | 0; if ($1 >>> 0 > 1) { continue } break; } } if ($1) { $0 = HEAP32[$0 >> 2]; $1 = $0 >>> 16 ^ $2; $2 = HEAPU16[(($1 & 255) << 1) + 2304 >> 1] ^ HEAPU16[($1 >>> 7 & 510) + 2816 >> 1] ^ HEAPU16[(($0 >>> 7 & 510) + 1280 | 0) + 512 >> 1] ^ HEAPU16[(($0 & 255) << 1) + 1280 >> 1]; } return $2 & 65535; } function memmove($0, $1, $2) { var $3 = 0; label$1 : { if (($0 | 0) == ($1 | 0)) { break label$1 } if (($1 - $0 | 0) - $2 >>> 0 <= 0 - ($2 << 1) >>> 0) { memcpy($0, $1, $2); return; } $3 = ($0 ^ $1) & 3; label$3 : { label$4 : { if ($0 >>> 0 < $1 >>> 0) { if ($3) { break label$3 } if (!($0 & 3)) { break label$4 } while (1) { if (!$2) { break label$1 } HEAP8[$0 | 0] = HEAPU8[$1 | 0]; $1 = $1 + 1 | 0; $2 = $2 + -1 | 0; $0 = $0 + 1 | 0; if ($0 & 3) { continue } break; }; break label$4; } label$9 : { if ($3) { break label$9 } if ($0 + $2 & 3) { while (1) { if (!$2) { break label$1 } $2 = $2 + -1 | 0; $3 = $2 + $0 | 0; HEAP8[$3 | 0] = HEAPU8[$1 + $2 | 0]; if ($3 & 3) { continue } break; } } if ($2 >>> 0 <= 3) { break label$9 } while (1) { $2 = $2 + -4 | 0; HEAP32[$2 + $0 >> 2] = HEAP32[$1 + $2 >> 2]; if ($2 >>> 0 > 3) { continue } break; }; } if (!$2) { break label$1 } while (1) { $2 = $2 + -1 | 0; HEAP8[$2 + $0 | 0] = HEAPU8[$1 + $2 | 0]; if ($2) { continue } break; }; break label$1; } if ($2 >>> 0 <= 3) { break label$3 } while (1) { HEAP32[$0 >> 2] = HEAP32[$1 >> 2]; $1 = $1 + 4 | 0; $0 = $0 + 4 | 0; $2 = $2 + -4 | 0; if ($2 >>> 0 > 3) { continue } break; }; } if (!$2) { break label$1 } while (1) { HEAP8[$0 | 0] = HEAPU8[$1 | 0]; $0 = $0 + 1 | 0; $1 = $1 + 1 | 0; $2 = $2 + -1 | 0; if ($2) { continue } break; }; } } function FLAC__bitreader_delete($0) { var $1 = 0; $1 = HEAP32[$0 >> 2]; if ($1) { dlfree($1) } dlfree($0); } function FLAC__bitreader_free($0) { var $1 = 0; $1 = HEAP32[$0 >> 2]; if ($1) { dlfree($1) } HEAP32[$0 + 36 >> 2] = 0; HEAP32[$0 + 40 >> 2] = 0; HEAP32[$0 >> 2] = 0; HEAP32[$0 + 4 >> 2] = 0; HEAP32[$0 + 8 >> 2] = 0; HEAP32[$0 + 12 >> 2] = 0; HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 + 20 >> 2] = 0; } function FLAC__bitreader_init($0, $1) { var $2 = 0; HEAP32[$0 + 8 >> 2] = 0; HEAP32[$0 + 12 >> 2] = 0; HEAP32[$0 + 4 >> 2] = 2048; HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 + 20 >> 2] = 0; $2 = dlmalloc(8192); HEAP32[$0 >> 2] = $2; if (!$2) { return 0 } HEAP32[$0 + 40 >> 2] = $1; HEAP32[$0 + 36 >> 2] = 7; return 1; } function FLAC__bitreader_get_read_crc16($0) { var $1 = 0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0; $5 = HEAP32[$0 + 16 >> 2]; $2 = HEAP32[$0 + 28 >> 2]; label$1 : { if ($5 >>> 0 <= $2 >>> 0) { $4 = $2; break label$1; } $1 = HEAP32[$0 + 32 >> 2]; if (!$1) { $4 = $2; break label$1; } $4 = $2 + 1 | 0; HEAP32[$0 + 28 >> 2] = $4; $3 = HEAP32[$0 + 24 >> 2]; if ($1 >>> 0 <= 31) { $2 = HEAP32[HEAP32[$0 >> 2] + ($2 << 2) >> 2]; while (1) { $3 = HEAPU16[(($2 >>> 24 - $1 & 255 ^ $3 >>> 8) << 1) + 1280 >> 1] ^ $3 << 8 & 65280; $7 = $1 >>> 0 < 24; $6 = $1 + 8 | 0; $1 = $6; if ($7) { continue } break; }; HEAP32[$0 + 32 >> 2] = $6; } HEAP32[$0 + 32 >> 2] = 0; HEAP32[$0 + 24 >> 2] = $3; } $1 = FLAC__crc16_update_words32(HEAP32[$0 >> 2] + ($4 << 2) | 0, $5 - $4 | 0, HEAPU16[$0 + 24 >> 1]); HEAP32[$0 + 28 >> 2] = 0; HEAP32[$0 + 24 >> 2] = $1; $2 = HEAP32[$0 + 20 >> 2]; label$6 : { if (!$2) { break label$6 } $3 = HEAP32[$0 + 32 >> 2]; if ($3 >>> 0 >= $2 >>> 0) { break label$6 } $4 = HEAP32[HEAP32[$0 >> 2] + (HEAP32[$0 + 16 >> 2] << 2) >> 2]; while (1) { $1 = HEAPU16[(($4 >>> 24 - $3 & 255 ^ $1 >>> 8) << 1) + 1280 >> 1] ^ $1 << 8 & 65280; $3 = $3 + 8 | 0; if ($3 >>> 0 < $2 >>> 0) { continue } break; }; HEAP32[$0 + 32 >> 2] = $3; HEAP32[$0 + 24 >> 2] = $1; } return $1; } function FLAC__bitreader_is_consumed_byte_aligned($0) { return !(HEAPU8[$0 + 20 | 0] & 7); } function FLAC__bitreader_bits_left_for_byte_alignment($0) { return 8 - (HEAP32[$0 + 20 >> 2] & 7) | 0; } function FLAC__bitreader_read_raw_uint32($0, $1, $2) { var $3 = 0, $4 = 0, $5 = 0; label$1 : { if ($2) { label$4 : { while (1) { $5 = HEAP32[$0 + 8 >> 2]; $4 = HEAP32[$0 + 16 >> 2]; $3 = HEAP32[$0 + 20 >> 2]; if ((($5 - $4 << 5) + (HEAP32[$0 + 12 >> 2] << 3) | 0) - $3 >>> 0 >= $2 >>> 0) { break label$4 } if (bitreader_read_from_client_($0)) { continue } break; }; return 0; } if ($5 >>> 0 > $4 >>> 0) { if ($3) { $5 = HEAP32[$0 >> 2]; $4 = HEAP32[$5 + ($4 << 2) >> 2] & -1 >>> $3; $3 = 32 - $3 | 0; if ($3 >>> 0 > $2 >>> 0) { HEAP32[$1 >> 2] = $4 >>> $3 - $2; HEAP32[$0 + 20 >> 2] = HEAP32[$0 + 20 >> 2] + $2; break label$1; } HEAP32[$1 >> 2] = $4; HEAP32[$0 + 20 >> 2] = 0; HEAP32[$0 + 16 >> 2] = HEAP32[$0 + 16 >> 2] + 1; $2 = $2 - $3 | 0; if (!$2) { break label$1 } $3 = HEAP32[$1 >> 2] << $2; HEAP32[$1 >> 2] = $3; HEAP32[$1 >> 2] = $3 | HEAP32[(HEAP32[$0 + 16 >> 2] << 2) + $5 >> 2] >>> 32 - $2; HEAP32[$0 + 20 >> 2] = $2; return 1; } $3 = HEAP32[HEAP32[$0 >> 2] + ($4 << 2) >> 2]; if ($2 >>> 0 <= 31) { HEAP32[$1 >> 2] = $3 >>> 32 - $2; HEAP32[$0 + 20 >> 2] = $2; break label$1; } HEAP32[$1 >> 2] = $3; HEAP32[$0 + 16 >> 2] = HEAP32[$0 + 16 >> 2] + 1; return 1; } $4 = HEAP32[HEAP32[$0 >> 2] + ($4 << 2) >> 2]; if ($3) { HEAP32[$1 >> 2] = ($4 & -1 >>> $3) >>> 32 - ($2 + $3 | 0); HEAP32[$0 + 20 >> 2] = HEAP32[$0 + 20 >> 2] + $2; break label$1; } HEAP32[$1 >> 2] = $4 >>> 32 - $2; HEAP32[$0 + 20 >> 2] = HEAP32[$0 + 20 >> 2] + $2; break label$1; } HEAP32[$1 >> 2] = 0; } return 1; } function bitreader_read_from_client_($0) { var $1 = 0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0; $6 = global$0 - 16 | 0; global$0 = $6; $5 = HEAP32[$0 + 16 >> 2]; label$1 : { if (!$5) { $2 = HEAP32[$0 + 8 >> 2]; break label$1; } $1 = HEAP32[$0 + 28 >> 2]; label$3 : { if ($5 >>> 0 <= $1 >>> 0) { $3 = $1; break label$3; } $2 = HEAP32[$0 + 32 >> 2]; if (!$2) { $3 = $1; break label$3; } $3 = $1 + 1 | 0; HEAP32[$0 + 28 >> 2] = $3; $4 = HEAP32[$0 + 24 >> 2]; if ($2 >>> 0 <= 31) { $1 = HEAP32[HEAP32[$0 >> 2] + ($1 << 2) >> 2]; while (1) { $4 = HEAPU16[(($1 >>> 24 - $2 & 255 ^ $4 >>> 8) << 1) + 1280 >> 1] ^ $4 << 8 & 65280; $7 = $2 >>> 0 < 24; $8 = $2 + 8 | 0; $2 = $8; if ($7) { continue } break; }; HEAP32[$0 + 32 >> 2] = $8; } HEAP32[$0 + 32 >> 2] = 0; HEAP32[$0 + 24 >> 2] = $4; } $1 = FLAC__crc16_update_words32(HEAP32[$0 >> 2] + ($3 << 2) | 0, $5 - $3 | 0, HEAPU16[$0 + 24 >> 1]); HEAP32[$0 + 28 >> 2] = 0; HEAP32[$0 + 24 >> 2] = $1; $3 = HEAP32[$0 >> 2]; $1 = HEAP32[$0 + 16 >> 2]; memmove($3, $3 + ($1 << 2) | 0, (HEAP32[$0 + 8 >> 2] - $1 | 0) + (HEAP32[$0 + 12 >> 2] != 0) << 2); HEAP32[$0 + 16 >> 2] = 0; $2 = HEAP32[$0 + 8 >> 2] - $1 | 0; HEAP32[$0 + 8 >> 2] = $2; } $1 = HEAP32[$0 + 12 >> 2]; $3 = (HEAP32[$0 + 4 >> 2] - $2 << 2) - $1 | 0; HEAP32[$6 + 12 >> 2] = $3; $4 = 0; label$8 : { if (!$3) { break label$8 } $3 = HEAP32[$0 >> 2] + ($2 << 2) | 0; $2 = $3 + $1 | 0; if ($1) { $1 = HEAP32[$3 >> 2]; HEAP32[$3 >> 2] = $1 << 24 | $1 << 8 & 16711680 | ($1 >>> 8 & 65280 | $1 >>> 24); } if (!FUNCTION_TABLE[HEAP32[$0 + 36 >> 2]]($2, $6 + 12 | 0, HEAP32[$0 + 40 >> 2])) { break label$8 } $5 = HEAP32[$6 + 12 >> 2]; $2 = HEAP32[$0 + 12 >> 2]; $4 = HEAP32[$0 + 8 >> 2]; $1 = $4 << 2; $3 = ($5 + ($2 + $1 | 0) | 0) + 3 >>> 2 | 0; $8 = $0; if ($4 >>> 0 < $3 >>> 0) { $2 = HEAP32[$0 >> 2]; while (1) { $7 = $2 + ($4 << 2) | 0; $1 = HEAP32[$7 >> 2]; HEAP32[$7 >> 2] = $1 << 8 & 16711680 | $1 << 24 | ($1 >>> 8 & 65280 | $1 >>> 24); $4 = $4 + 1 | 0; if (($3 | 0) != ($4 | 0)) { continue } break; }; $2 = HEAP32[$0 + 12 >> 2]; $1 = HEAP32[$0 + 8 >> 2] << 2; } $1 = $1 + ($2 + $5 | 0) | 0; HEAP32[$8 + 12 >> 2] = $1 & 3; HEAP32[$0 + 8 >> 2] = $1 >>> 2; $4 = 1; } global$0 = $6 + 16 | 0; return $4; } function FLAC__bitreader_read_raw_int32($0, $1, $2) { var $3 = 0, $4 = 0; $3 = global$0 - 16 | 0; global$0 = $3; $4 = 0; label$1 : { if (!FLAC__bitreader_read_raw_uint32($0, $3 + 12 | 0, $2)) { break label$1 } $0 = 1 << $2 + -1; HEAP32[$1 >> 2] = ($0 ^ HEAP32[$3 + 12 >> 2]) - $0; $4 = 1; } $0 = $4; global$0 = $3 + 16 | 0; return $0; } function FLAC__bitreader_read_raw_uint64($0, $1, $2) { var $3 = 0, $4 = 0, $5 = 0, $6 = 0; $3 = global$0 - 16 | 0; global$0 = $3; $4 = $1; $5 = $1; label$1 : { label$2 : { if ($2 >>> 0 >= 33) { if (!FLAC__bitreader_read_raw_uint32($0, $3 + 12 | 0, $2 + -32 | 0)) { break label$1 } if (!FLAC__bitreader_read_raw_uint32($0, $3 + 8 | 0, 32)) { break label$1 } $0 = HEAP32[$3 + 12 >> 2]; $2 = 0; HEAP32[$1 >> 2] = $2; HEAP32[$1 + 4 >> 2] = $0; $1 = HEAP32[$3 + 8 >> 2] | $2; break label$2; } if (!FLAC__bitreader_read_raw_uint32($0, $3 + 8 | 0, $2)) { break label$1 } $0 = 0; $1 = HEAP32[$3 + 8 >> 2]; } HEAP32[$5 >> 2] = $1; HEAP32[$4 + 4 >> 2] = $0; $6 = 1; } global$0 = $3 + 16 | 0; return $6; } function FLAC__bitreader_read_uint32_little_endian($0, $1) { var $2 = 0, $3 = 0, $4 = 0; $2 = global$0 - 16 | 0; global$0 = $2; HEAP32[$2 + 8 >> 2] = 0; label$1 : { if (!FLAC__bitreader_read_raw_uint32($0, $2 + 8 | 0, 8)) { break label$1 } if (!FLAC__bitreader_read_raw_uint32($0, $2 + 12 | 0, 8)) { break label$1 } $3 = HEAP32[$2 + 8 >> 2] | HEAP32[$2 + 12 >> 2] << 8; HEAP32[$2 + 8 >> 2] = $3; if (!FLAC__bitreader_read_raw_uint32($0, $2 + 12 | 0, 8)) { break label$1 } $3 = $3 | HEAP32[$2 + 12 >> 2] << 16; HEAP32[$2 + 8 >> 2] = $3; if (!FLAC__bitreader_read_raw_uint32($0, $2 + 12 | 0, 8)) { break label$1 } $0 = $3 | HEAP32[$2 + 12 >> 2] << 24; HEAP32[$2 + 8 >> 2] = $0; HEAP32[$1 >> 2] = $0; $4 = 1; } global$0 = $2 + 16 | 0; return $4; } function FLAC__bitreader_skip_bits_no_crc($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0; $3 = global$0 - 16 | 0; global$0 = $3; $4 = 1; label$1 : { if (!$1) { break label$1 } $2 = HEAP32[$0 + 20 >> 2] & 7; label$2 : { if ($2) { $2 = 8 - $2 | 0; $2 = $2 >>> 0 < $1 >>> 0 ? $2 : $1; if (!FLAC__bitreader_read_raw_uint32($0, $3 + 8 | 0, $2)) { break label$2 } $1 = $1 - $2 | 0; } $2 = $1 >>> 3 | 0; if ($2) { while (1) { label$7 : { if (!HEAP32[$0 + 20 >> 2]) { if ($2 >>> 0 > 3) { while (1) { $5 = HEAP32[$0 + 16 >> 2]; label$11 : { if ($5 >>> 0 < HEAPU32[$0 + 8 >> 2]) { HEAP32[$0 + 16 >> 2] = $5 + 1; $2 = $2 + -4 | 0; break label$11; } if (!bitreader_read_from_client_($0)) { break label$2 } } if ($2 >>> 0 > 3) { continue } break; }; if (!$2) { break label$7 } } while (1) { if (!FLAC__bitreader_read_raw_uint32($0, $3 + 12 | 0, 8)) { break label$2 } $2 = $2 + -1 | 0; if ($2) { continue } break; }; break label$7; } if (!FLAC__bitreader_read_raw_uint32($0, $3 + 12 | 0, 8)) { break label$2 } $2 = $2 + -1 | 0; if ($2) { continue } } break; }; $1 = $1 & 7; } if (!$1) { break label$1 } if (FLAC__bitreader_read_raw_uint32($0, $3 + 8 | 0, $1)) { break label$1 } } $4 = 0; } global$0 = $3 + 16 | 0; return $4; } function FLAC__bitreader_skip_byte_block_aligned_no_crc($0, $1) { var $2 = 0, $3 = 0, $4 = 0; $2 = global$0 - 16 | 0; global$0 = $2; $3 = 1; label$1 : { if (!$1) { break label$1 } while (1) { label$3 : { if (!HEAP32[$0 + 20 >> 2]) { label$5 : { if ($1 >>> 0 < 4) { break label$5 } while (1) { $4 = HEAP32[$0 + 16 >> 2]; label$7 : { if ($4 >>> 0 < HEAPU32[$0 + 8 >> 2]) { HEAP32[$0 + 16 >> 2] = $4 + 1; $1 = $1 + -4 | 0; break label$7; } if (!bitreader_read_from_client_($0)) { break label$3 } } if ($1 >>> 0 > 3) { continue } break; }; if ($1) { break label$5 } break label$1; } while (1) { if (!FLAC__bitreader_read_raw_uint32($0, $2 + 12 | 0, 8)) { break label$3 } $1 = $1 + -1 | 0; if ($1) { continue } break; }; break label$1; } if (!FLAC__bitreader_read_raw_uint32($0, $2 + 12 | 0, 8)) { break label$3 } $1 = $1 + -1 | 0; if ($1) { continue } break label$1; } break; }; $3 = 0; } global$0 = $2 + 16 | 0; return $3; } function FLAC__bitreader_read_byte_block_aligned_no_crc($0, $1, $2) { var $3 = 0, $4 = 0; $4 = global$0 - 16 | 0; global$0 = $4; label$1 : { if (!$2) { $3 = 1; break label$1; } while (1) { if (!HEAP32[$0 + 20 >> 2]) { label$5 : { if ($2 >>> 0 < 4) { break label$5 } while (1) { label$7 : { $3 = HEAP32[$0 + 16 >> 2]; if ($3 >>> 0 < HEAPU32[$0 + 8 >> 2]) { HEAP32[$0 + 16 >> 2] = $3 + 1; $3 = HEAP32[HEAP32[$0 >> 2] + ($3 << 2) >> 2]; $3 = $3 << 24 | $3 << 8 & 16711680 | ($3 >>> 8 & 65280 | $3 >>> 24); HEAP8[$1 | 0] = $3; HEAP8[$1 + 1 | 0] = $3 >>> 8; HEAP8[$1 + 2 | 0] = $3 >>> 16; HEAP8[$1 + 3 | 0] = $3 >>> 24; $2 = $2 + -4 | 0; $1 = $1 + 4 | 0; break label$7; } if (bitreader_read_from_client_($0)) { break label$7 } $3 = 0; break label$1; } if ($2 >>> 0 > 3) { continue } break; }; if ($2) { break label$5 } $3 = 1; break label$1; } while (1) { if (!FLAC__bitreader_read_raw_uint32($0, $4 + 12 | 0, 8)) { $3 = 0; break label$1; } HEAP8[$1 | 0] = HEAP32[$4 + 12 >> 2]; $3 = 1; $1 = $1 + 1 | 0; $2 = $2 + -1 | 0; if ($2) { continue } break; }; break label$1; } if (!FLAC__bitreader_read_raw_uint32($0, $4 + 12 | 0, 8)) { $3 = 0; break label$1; } HEAP8[$1 | 0] = HEAP32[$4 + 12 >> 2]; $3 = 1; $1 = $1 + 1 | 0; $2 = $2 + -1 | 0; if ($2) { continue } break; }; } global$0 = $4 + 16 | 0; return $3; } function FLAC__bitreader_read_unary_unsigned($0, $1) { var $2 = 0, $3 = 0, $4 = 0; HEAP32[$1 >> 2] = 0; label$1 : { while (1) { $3 = HEAP32[$0 + 16 >> 2]; label$3 : { if ($3 >>> 0 >= HEAPU32[$0 + 8 >> 2]) { $2 = HEAP32[$0 + 20 >> 2]; break label$3; } $2 = HEAP32[$0 + 20 >> 2]; $4 = HEAP32[$0 >> 2]; while (1) { $3 = HEAP32[$4 + ($3 << 2) >> 2] << $2; if ($3) { $2 = $1; $4 = HEAP32[$1 >> 2]; $1 = Math_clz32($3); HEAP32[$2 >> 2] = $4 + $1; $2 = ($1 + HEAP32[$0 + 20 >> 2] | 0) + 1 | 0; HEAP32[$0 + 20 >> 2] = $2; $1 = 1; if ($2 >>> 0 < 32) { break label$1 } HEAP32[$0 + 20 >> 2] = 0; HEAP32[$0 + 16 >> 2] = HEAP32[$0 + 16 >> 2] + 1; return 1; } HEAP32[$1 >> 2] = (HEAP32[$1 >> 2] - $2 | 0) + 32; $2 = 0; HEAP32[$0 + 20 >> 2] = 0; $3 = HEAP32[$0 + 16 >> 2] + 1 | 0; HEAP32[$0 + 16 >> 2] = $3; if ($3 >>> 0 < HEAPU32[$0 + 8 >> 2]) { continue } break; }; } $4 = HEAP32[$0 + 12 >> 2] << 3; if ($4 >>> 0 > $2 >>> 0) { $3 = (HEAP32[HEAP32[$0 >> 2] + ($3 << 2) >> 2] & -1 << 32 - $4) << $2; if ($3) { $2 = $1; $4 = HEAP32[$1 >> 2]; $1 = Math_clz32($3); HEAP32[$2 >> 2] = $4 + $1; HEAP32[$0 + 20 >> 2] = ($1 + HEAP32[$0 + 20 >> 2] | 0) + 1; return 1; } HEAP32[$1 >> 2] = HEAP32[$1 >> 2] + ($4 - $2 | 0); HEAP32[$0 + 20 >> 2] = $4; } if (bitreader_read_from_client_($0)) { continue } break; }; $1 = 0; } return $1; } function FLAC__bitreader_read_rice_signed_block($0, $1, $2, $3) { var $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0; $6 = global$0 - 16 | 0; global$0 = $6; $12 = ($2 << 2) + $1 | 0; label$1 : { if (!$3) { $14 = 1; if (($2 | 0) < 1) { break label$1 } while (1) { if (!FLAC__bitreader_read_unary_unsigned($0, $6 + 8 | 0)) { $14 = 0; break label$1; } $2 = HEAP32[$6 + 8 >> 2]; HEAP32[$1 >> 2] = $2 >>> 1 ^ 0 - ($2 & 1); $1 = $1 + 4 | 0; if ($1 >>> 0 < $12 >>> 0) { continue } break; }; break label$1; } label$5 : { label$6 : { $4 = HEAP32[$0 + 16 >> 2]; $10 = HEAP32[$0 + 8 >> 2]; if ($4 >>> 0 >= $10 >>> 0) { break label$6 } $11 = HEAP32[$0 >> 2]; $13 = HEAP32[$0 + 20 >> 2]; $9 = HEAP32[$11 + ($4 << 2) >> 2] << $13; $2 = 0; break label$5; } $2 = 1; } while (1) { label$9 : { label$10 : { label$11 : { label$12 : { if (!$2) { $5 = 32 - $13 | 0; label$14 : { if ($1 >>> 0 < $12 >>> 0) { $15 = 32 - $3 | 0; while (1) { $2 = $4; $7 = $5; label$17 : { if ($9) { $7 = Math_clz32($9); $8 = $7; break label$17; } while (1) { $2 = $2 + 1 | 0; if ($2 >>> 0 >= $10 >>> 0) { break label$14 } $9 = HEAP32[($2 << 2) + $11 >> 2]; $8 = Math_clz32($9); $7 = $8 + $7 | 0; if (!$9) { continue } break; }; } $4 = $9 << $8 << 1; $8 = $4 >>> $15 | 0; HEAP32[$6 + 8 >> 2] = $7; $5 = ($7 ^ -1) + $5 & 31; label$20 : { if ($5 >>> 0 >= $3 >>> 0) { $9 = $4 << $3; $5 = $5 - $3 | 0; $4 = $2; break label$20; } $4 = $2 + 1 | 0; if ($4 >>> 0 >= $10 >>> 0) { break label$12 } $2 = HEAP32[($4 << 2) + $11 >> 2]; $5 = $5 + $15 | 0; $9 = $2 << 32 - $5; $8 = $2 >>> $5 | $8; } HEAP32[$6 + 12 >> 2] = $8; $2 = $7 << $3 | $8; HEAP32[$1 >> 2] = $2 >>> 1 ^ 0 - ($2 & 1); $1 = $1 + 4 | 0; if ($1 >>> 0 < $12 >>> 0) { continue } break; }; } $1 = $4 >>> 0 < $10 >>> 0; HEAP32[$0 + 16 >> 2] = ($1 & !$5) + $4; HEAP32[$0 + 20 >> 2] = 32 - ($5 ? $5 : $1 << 5); $14 = 1; break label$1; } HEAP32[$0 + 20 >> 2] = 0; $2 = $4 + 1 | 0; HEAP32[$0 + 16 >> 2] = $10 >>> 0 > $2 >>> 0 ? $10 : $2; break label$10; } if (!FLAC__bitreader_read_unary_unsigned($0, $6 + 8 | 0)) { break label$1 } $7 = HEAP32[$6 + 8 >> 2] + $7 | 0; HEAP32[$6 + 8 >> 2] = $7; $8 = 0; $5 = 0; break label$11; } HEAP32[$0 + 16 >> 2] = $4; HEAP32[$0 + 20 >> 2] = 0; } if (!FLAC__bitreader_read_raw_uint32($0, $6 + 12 | 0, $3 - $5 | 0)) { break label$1 } $2 = $7 << $3; $4 = HEAP32[$6 + 12 >> 2] | $8; HEAP32[$6 + 12 >> 2] = $4; $7 = 0; $2 = $2 | $4; HEAP32[$1 >> 2] = $2 >>> 1 ^ 0 - ($2 & 1); $11 = HEAP32[$0 >> 2]; $4 = HEAP32[$0 + 16 >> 2]; $13 = HEAP32[$0 + 20 >> 2]; $9 = HEAP32[$11 + ($4 << 2) >> 2] << $13; $10 = HEAP32[$0 + 8 >> 2]; $1 = $1 + 4 | 0; if ($4 >>> 0 < $10 >>> 0 | $1 >>> 0 >= $12 >>> 0) { break label$9 } } $2 = 1; continue; } $2 = 0; continue; }; } global$0 = $6 + 16 | 0; return $14; } function FLAC__bitreader_read_utf8_uint32($0, $1, $2, $3) { var $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0; $7 = global$0 - 16 | 0; global$0 = $7; label$1 : { if (!FLAC__bitreader_read_raw_uint32($0, $7 + 12 | 0, 8)) { break label$1 } $4 = HEAP32[$7 + 12 >> 2]; if ($2) { $5 = HEAP32[$3 >> 2]; HEAP32[$3 >> 2] = $5 + 1; HEAP8[$2 + $5 | 0] = $4; } label$3 : { label$4 : { label$5 : { label$6 : { if (!($4 & 128)) { break label$6 } label$7 : { if (!(!($4 & 192) | $4 & 32)) { $6 = 31; $5 = 1; break label$7; } if (!(!($4 & 224) | $4 & 16)) { $6 = 15; $5 = 2; break label$7; } if (!(!($4 & 240) | $4 & 8)) { $6 = 7; $5 = 3; break label$7; } if ($4 & 248) { $6 = 3; $5 = 4; if (!($4 & 4)) { break label$7 } } if (!($4 & 252) | $4 & 2) { break label$5 } $6 = 1; $5 = 5; } $4 = $4 & $6; if (!$2) { while (1) { if (!FLAC__bitreader_read_raw_uint32($0, $7 + 12 | 0, 8)) { break label$1 } $2 = HEAP32[$7 + 12 >> 2]; if (($2 & 192) != 128) { break label$4 } $4 = $2 & 63 | $4 << 6; $5 = $5 + -1 | 0; if ($5) { continue } break label$6; } } while (1) { if (!FLAC__bitreader_read_raw_uint32($0, $7 + 12 | 0, 8)) { break label$1 } $6 = HEAP32[$7 + 12 >> 2]; $8 = HEAP32[$3 >> 2]; HEAP32[$3 >> 2] = $8 + 1; HEAP8[$2 + $8 | 0] = $6; if (($6 & 192) != 128) { break label$4 } $4 = $6 & 63 | $4 << 6; $5 = $5 + -1 | 0; if ($5) { continue } break; }; } HEAP32[$1 >> 2] = $4; break label$3; } HEAP32[$1 >> 2] = -1; break label$3; } HEAP32[$1 >> 2] = -1; } $9 = 1; } global$0 = $7 + 16 | 0; return $9; } function FLAC__bitreader_read_utf8_uint64($0, $1, $2, $3) { var $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0; $7 = global$0 - 16 | 0; global$0 = $7; label$1 : { if (!FLAC__bitreader_read_raw_uint32($0, $7 + 12 | 0, 8)) { break label$1 } $4 = HEAP32[$7 + 12 >> 2]; if ($2) { $6 = HEAP32[$3 >> 2]; HEAP32[$3 >> 2] = $6 + 1; HEAP8[$2 + $6 | 0] = $4; } label$4 : { label$5 : { label$6 : { label$7 : { if ($4 & 128) { if (!(!($4 & 192) | $4 & 32)) { $4 = $4 & 31; $5 = 1; break label$7; } if (!(!($4 & 224) | $4 & 16)) { $4 = $4 & 15; $5 = 2; break label$7; } if (!(!($4 & 240) | $4 & 8)) { $4 = $4 & 7; $5 = 3; break label$7; } if (!(!($4 & 248) | $4 & 4)) { $4 = $4 & 3; $5 = 4; break label$7; } if (!(!($4 & 252) | $4 & 2)) { $4 = $4 & 1; $5 = 5; break label$7; } $5 = 1; if (!(!($4 & 254) | $4 & 1)) { $5 = 6; $4 = 0; break label$7; } HEAP32[$1 >> 2] = -1; HEAP32[$1 + 4 >> 2] = -1; break label$1; } $6 = 0; break label$6; } $6 = 0; if (!$2) { while (1) { if (!FLAC__bitreader_read_raw_uint32($0, $7 + 12 | 0, 8)) { $5 = 0; break label$1; } $2 = HEAP32[$7 + 12 >> 2]; if (($2 & 192) != 128) { break label$5 } $2 = $2 & 63; $6 = $6 << 6 | $4 >>> 26; $4 = $2 | $4 << 6; $5 = $5 + -1 | 0; if ($5) { continue } break label$6; } } while (1) { if (!FLAC__bitreader_read_raw_uint32($0, $7 + 12 | 0, 8)) { $5 = 0; break label$1; } $8 = HEAP32[$7 + 12 >> 2]; $9 = HEAP32[$3 >> 2]; HEAP32[$3 >> 2] = $9 + 1; HEAP8[$2 + $9 | 0] = $8; if (($8 & 192) != 128) { break label$5 } $6 = $6 << 6 | $4 >>> 26; $4 = $8 & 63 | $4 << 6; $5 = $5 + -1 | 0; if ($5) { continue } break; }; } HEAP32[$1 >> 2] = $4; HEAP32[$1 + 4 >> 2] = $6; break label$4; } HEAP32[$1 >> 2] = -1; HEAP32[$1 + 4 >> 2] = -1; } $5 = 1; } global$0 = $7 + 16 | 0; return $5; } function qsort($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0; $2 = global$0 - 208 | 0; global$0 = $2; HEAP32[$2 + 8 >> 2] = 1; HEAP32[$2 + 12 >> 2] = 0; label$1 : { $5 = Math_imul($1, 24); if (!$5) { break label$1 } HEAP32[$2 + 16 >> 2] = 24; HEAP32[$2 + 20 >> 2] = 24; $1 = 24; $4 = $1; $3 = 2; while (1) { $6 = $4 + 24 | 0; $4 = $1; $1 = $1 + $6 | 0; HEAP32[($2 + 16 | 0) + ($3 << 2) >> 2] = $1; $3 = $3 + 1 | 0; if ($1 >>> 0 < $5 >>> 0) { continue } break; }; $4 = ($0 + $5 | 0) + -24 | 0; label$3 : { if ($4 >>> 0 <= $0 >>> 0) { $3 = 1; $1 = 1; break label$3; } $3 = 1; $1 = 1; while (1) { label$6 : { if (($3 & 3) == 3) { sift($0, $1, $2 + 16 | 0); shr($2 + 8 | 0, 2); $1 = $1 + 2 | 0; break label$6; } $3 = $1 + -1 | 0; label$8 : { if (HEAPU32[($2 + 16 | 0) + ($3 << 2) >> 2] >= $4 - $0 >>> 0) { trinkle($0, $2 + 8 | 0, $1, 0, $2 + 16 | 0); break label$8; } sift($0, $1, $2 + 16 | 0); } if (($1 | 0) == 1) { shl($2 + 8 | 0, 1); $1 = 0; break label$6; } shl($2 + 8 | 0, $3); $1 = 1; } $3 = HEAP32[$2 + 8 >> 2] | 1; HEAP32[$2 + 8 >> 2] = $3; $0 = $0 + 24 | 0; if ($0 >>> 0 < $4 >>> 0) { continue } break; }; } trinkle($0, $2 + 8 | 0, $1, 0, $2 + 16 | 0); while (1) { label$12 : { label$13 : { label$14 : { if (!(($1 | 0) != 1 | ($3 | 0) != 1)) { if (HEAP32[$2 + 12 >> 2]) { break label$14 } break label$1; } if (($1 | 0) > 1) { break label$13 } } $4 = pntz($2 + 8 | 0); shr($2 + 8 | 0, $4); $3 = HEAP32[$2 + 8 >> 2]; $1 = $1 + $4 | 0; break label$12; } shl($2 + 8 | 0, 2); HEAP32[$2 + 8 >> 2] = HEAP32[$2 + 8 >> 2] ^ 7; shr($2 + 8 | 0, 1); $5 = $0 + -24 | 0; $4 = $1 + -2 | 0; trinkle($5 - HEAP32[($2 + 16 | 0) + ($4 << 2) >> 2] | 0, $2 + 8 | 0, $1 + -1 | 0, 1, $2 + 16 | 0); shl($2 + 8 | 0, 1); $3 = HEAP32[$2 + 8 >> 2] | 1; HEAP32[$2 + 8 >> 2] = $3; trinkle($5, $2 + 8 | 0, $4, 1, $2 + 16 | 0); $1 = $4; } $0 = $0 + -24 | 0; continue; }; } global$0 = $2 + 208 | 0; } function sift($0, $1, $2) { var $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0; $3 = global$0 - 240 | 0; global$0 = $3; HEAP32[$3 >> 2] = $0; $6 = 1; label$1 : { if (($1 | 0) < 2) { break label$1 } $4 = $0; while (1) { $5 = $4 + -24 | 0; $7 = $1 + -2 | 0; $4 = $5 - HEAP32[($7 << 2) + $2 >> 2] | 0; if ((FUNCTION_TABLE[1]($0, $4) | 0) >= 0) { if ((FUNCTION_TABLE[1]($0, $5) | 0) > -1) { break label$1 } } $0 = ($6 << 2) + $3 | 0; label$4 : { if ((FUNCTION_TABLE[1]($4, $5) | 0) >= 0) { HEAP32[$0 >> 2] = $4; $7 = $1 + -1 | 0; break label$4; } HEAP32[$0 >> 2] = $5; $4 = $5; } $6 = $6 + 1 | 0; if (($7 | 0) < 2) { break label$1 } $0 = HEAP32[$3 >> 2]; $1 = $7; continue; }; } cycle($3, $6); global$0 = $3 + 240 | 0; } function shr($0, $1) { var $2 = 0, $3 = 0, $4 = 0; $4 = $0; label$1 : { if ($1 >>> 0 <= 31) { $2 = HEAP32[$0 >> 2]; $3 = HEAP32[$0 + 4 >> 2]; break label$1; } $2 = HEAP32[$0 + 4 >> 2]; HEAP32[$0 + 4 >> 2] = 0; HEAP32[$0 >> 2] = $2; $1 = $1 + -32 | 0; $3 = 0; } HEAP32[$4 + 4 >> 2] = $3 >>> $1; HEAP32[$0 >> 2] = $3 << 32 - $1 | $2 >>> $1; } function trinkle($0, $1, $2, $3, $4) { var $5 = 0, $6 = 0, $7 = 0, $8 = 0; $5 = global$0 - 240 | 0; global$0 = $5; $6 = HEAP32[$1 >> 2]; HEAP32[$5 + 232 >> 2] = $6; $1 = HEAP32[$1 + 4 >> 2]; HEAP32[$5 >> 2] = $0; HEAP32[$5 + 236 >> 2] = $1; $7 = 1; label$1 : { label$2 : { label$3 : { label$4 : { if ($1 ? 0 : ($6 | 0) == 1) { break label$4 } $6 = $0 - HEAP32[($2 << 2) + $4 >> 2] | 0; if ((FUNCTION_TABLE[1]($6, $0) | 0) < 1) { break label$4 } $8 = !$3; while (1) { label$6 : { $1 = $6; if (!(!$8 | ($2 | 0) < 2)) { $3 = HEAP32[(($2 << 2) + $4 | 0) + -8 >> 2]; $6 = $0 + -24 | 0; if ((FUNCTION_TABLE[1]($6, $1) | 0) > -1) { break label$6 } if ((FUNCTION_TABLE[1]($6 - $3 | 0, $1) | 0) > -1) { break label$6 } } HEAP32[($7 << 2) + $5 >> 2] = $1; $0 = pntz($5 + 232 | 0); shr($5 + 232 | 0, $0); $7 = $7 + 1 | 0; $2 = $0 + $2 | 0; if (HEAP32[$5 + 236 >> 2] ? 0 : HEAP32[$5 + 232 >> 2] == 1) { break label$2 } $3 = 0; $8 = 1; $0 = $1; $6 = $1 - HEAP32[($2 << 2) + $4 >> 2] | 0; if ((FUNCTION_TABLE[1]($6, HEAP32[$5 >> 2]) | 0) > 0) { continue } break label$3; } break; }; $1 = $0; break label$2; } $1 = $0; } if ($3) { break label$1 } } cycle($5, $7); sift($1, $2, $4); } global$0 = $5 + 240 | 0; } function shl($0, $1) { var $2 = 0, $3 = 0, $4 = 0; $4 = $0; label$1 : { if ($1 >>> 0 <= 31) { $2 = HEAP32[$0 + 4 >> 2]; $3 = HEAP32[$0 >> 2]; break label$1; } $2 = HEAP32[$0 >> 2]; HEAP32[$0 + 4 >> 2] = $2; HEAP32[$0 >> 2] = 0; $1 = $1 + -32 | 0; $3 = 0; } HEAP32[$4 >> 2] = $3 << $1; HEAP32[$0 + 4 >> 2] = $2 << $1 | $3 >>> 32 - $1; } function pntz($0) { var $1 = 0; $1 = __wasm_ctz_i32(HEAP32[$0 >> 2] + -1 | 0); if (!$1) { $0 = __wasm_ctz_i32(HEAP32[$0 + 4 >> 2]); return $0 ? $0 + 32 | 0 : 0; } return $1; } function cycle($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0; $3 = 24; $4 = global$0 - 256 | 0; global$0 = $4; label$1 : { if (($1 | 0) < 2) { break label$1 } $7 = ($1 << 2) + $0 | 0; HEAP32[$7 >> 2] = $4; $2 = $4; while (1) { $5 = $3 >>> 0 < 256 ? $3 : 256; memcpy($2, HEAP32[$0 >> 2], $5); $2 = 0; while (1) { $6 = ($2 << 2) + $0 | 0; $2 = $2 + 1 | 0; memcpy(HEAP32[$6 >> 2], HEAP32[($2 << 2) + $0 >> 2], $5); HEAP32[$6 >> 2] = HEAP32[$6 >> 2] + $5; if (($1 | 0) != ($2 | 0)) { continue } break; }; $3 = $3 - $5 | 0; if (!$3) { break label$1 } $2 = HEAP32[$7 >> 2]; continue; }; } global$0 = $4 + 256 | 0; } function FLAC__format_sample_rate_is_subset($0) { if ($0 + -1 >>> 0 <= 655349) { return !(($0 >>> 0) % 10) | (!(($0 >>> 0) % 1e3) | $0 >>> 0 < 65536) } return 0; } function FLAC__format_seektable_is_legal($0) { var $1 = 0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0; $3 = HEAP32[$0 >> 2]; if (!$3) { return 1 } $6 = HEAP32[$0 + 4 >> 2]; $0 = 0; $4 = 1; while (1) { $7 = $2; $5 = $1; $1 = Math_imul($0, 24) + $6 | 0; $2 = HEAP32[$1 >> 2]; $1 = HEAP32[$1 + 4 >> 2]; if (!(($2 | 0) == -1 & ($1 | 0) == -1 | $4 | (($1 | 0) == ($5 | 0) & $2 >>> 0 > $7 >>> 0 | $1 >>> 0 > $5 >>> 0))) { return 0 } $4 = 0; $0 = $0 + 1 | 0; if ($0 >>> 0 < $3 >>> 0) { continue } break; }; return 1; } function FLAC__format_seektable_sort($0) { var $1 = 0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0; label$1 : { $2 = HEAP32[$0 >> 2]; if (!$2) { break label$1 } qsort(HEAP32[$0 + 4 >> 2], $2); if (!HEAP32[$0 >> 2]) { break label$1 } $2 = 1; $1 = HEAP32[$0 >> 2]; if ($1 >>> 0 > 1) { $6 = 1; while (1) { $4 = HEAP32[$0 + 4 >> 2]; $3 = $4 + Math_imul($6, 24) | 0; $5 = HEAP32[$3 >> 2]; $7 = HEAP32[$3 + 4 >> 2]; $8 = $7; label$4 : { if (($5 | 0) != -1 | ($7 | 0) != -1) { $7 = $5; $5 = ($4 + Math_imul($2, 24) | 0) + -24 | 0; if (($7 | 0) == HEAP32[$5 >> 2] & HEAP32[$5 + 4 >> 2] == ($8 | 0)) { break label$4 } } $5 = HEAP32[$3 + 4 >> 2]; $1 = $4 + Math_imul($2, 24) | 0; HEAP32[$1 >> 2] = HEAP32[$3 >> 2]; HEAP32[$1 + 4 >> 2] = $5; $4 = HEAP32[$3 + 20 >> 2]; HEAP32[$1 + 16 >> 2] = HEAP32[$3 + 16 >> 2]; HEAP32[$1 + 20 >> 2] = $4; $4 = HEAP32[$3 + 12 >> 2]; HEAP32[$1 + 8 >> 2] = HEAP32[$3 + 8 >> 2]; HEAP32[$1 + 12 >> 2] = $4; $2 = $2 + 1 | 0; $1 = HEAP32[$0 >> 2]; } $6 = $6 + 1 | 0; if ($6 >>> 0 < $1 >>> 0) { continue } break; }; } if ($2 >>> 0 >= $1 >>> 0) { break label$1 } $3 = HEAP32[$0 + 4 >> 2]; while (1) { $0 = $3 + Math_imul($2, 24) | 0; HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 + 8 >> 2] = 0; HEAP32[$0 + 12 >> 2] = 0; HEAP32[$0 >> 2] = -1; HEAP32[$0 + 4 >> 2] = -1; $2 = $2 + 1 | 0; if (($1 | 0) != ($2 | 0)) { continue } break; }; } } function seekpoint_compare_($0, $1) { $0 = $0 | 0; $1 = $1 | 0; var $2 = 0, $3 = 0; $2 = HEAP32[$0 + 4 >> 2]; $3 = HEAP32[$1 + 4 >> 2]; $0 = HEAP32[$0 >> 2]; $1 = HEAP32[$1 >> 2]; return (($0 | 0) == ($1 | 0) & ($2 | 0) == ($3 | 0) ? 0 : ($2 | 0) == ($3 | 0) & $0 >>> 0 < $1 >>> 0 | $2 >>> 0 < $3 >>> 0 ? -1 : 1) | 0; } function utf8len_($0) { var $1 = 0, $2 = 0, $3 = 0, $4 = 0; $2 = 1; label$1 : { $1 = HEAPU8[$0 | 0]; label$2 : { if (!($1 & 128)) { break label$2 } if (!(($1 & 224) != 192 | (HEAPU8[$0 + 1 | 0] & 192) != 128)) { return (($1 & 254) != 192) << 1 } label$4 : { if (($1 & 240) != 224) { break label$4 } $3 = HEAPU8[$0 + 1 | 0]; if (($3 & 192) != 128) { break label$4 } $4 = HEAPU8[$0 + 2 | 0]; if (($4 & 192) != 128) { break label$4 } $2 = 0; if (($3 & 224) == 128 ? ($1 | 0) == 224 : 0) { break label$2 } label$5 : { label$6 : { switch ($1 + -237 | 0) { case 0: if (($3 & 224) != 160) { break label$5 } break label$2; case 2: break label$6; default: break label$5; }; } if (($3 | 0) != 191) { break label$5 } if (($4 & 254) == 190) { break label$2 } } return 3; } label$8 : { if (($1 & 248) != 240) { break label$8 } $2 = HEAPU8[$0 + 1 | 0]; if (($2 & 192) != 128 | (HEAPU8[$0 + 2 | 0] & 192) != 128) { break label$8 } if ((HEAPU8[$0 + 3 | 0] & 192) == 128) { break label$1 } } label$9 : { if (($1 & 252) != 248) { break label$9 } $2 = HEAPU8[$0 + 1 | 0]; if (($2 & 192) != 128 | (HEAPU8[$0 + 2 | 0] & 192) != 128 | ((HEAPU8[$0 + 3 | 0] & 192) != 128 | (HEAPU8[$0 + 4 | 0] & 192) != 128)) { break label$9 } return ($1 | 0) == 248 ? (($2 & 248) == 128 ? 0 : 5) : 5; } $2 = 0; if (($1 & 254) != 252) { break label$2 } $3 = HEAPU8[$0 + 1 | 0]; if (($3 & 192) != 128 | (HEAPU8[$0 + 2 | 0] & 192) != 128 | ((HEAPU8[$0 + 3 | 0] & 192) != 128 | (HEAPU8[$0 + 4 | 0] & 192) != 128)) { break label$2 } if ((HEAPU8[$0 + 5 | 0] & 192) != 128) { break label$2 } $2 = ($1 | 0) == 252 ? (($3 & 252) == 128 ? 0 : 6) : 6; } return $2; } return ($1 | 0) == 240 ? (($2 & 240) != 128) << 2 : 4; } function FLAC__format_cuesheet_is_legal($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0; label$1 : { label$2 : { label$3 : { label$4 : { label$5 : { label$6 : { label$7 : { if ($1) { $1 = HEAP32[$0 + 140 >> 2]; $3 = $1; $2 = HEAP32[$0 + 136 >> 2]; if (!$1 & $2 >>> 0 <= 88199 | $1 >>> 0 < 0) { $0 = 0; break label$1; } if (__wasm_i64_urem($2, $3) | i64toi32_i32$HIGH_BITS) { $0 = 0; break label$1; } $3 = HEAP32[$0 + 148 >> 2]; if (!$3) { break label$2 } if (HEAPU8[(HEAP32[$0 + 152 >> 2] + ($3 << 5) | 0) + -24 | 0] == 170) { break label$7 } $0 = 0; break label$1; } $2 = HEAP32[$0 + 148 >> 2]; if (!$2) { break label$2 } $4 = $2 + -1 | 0; $6 = HEAP32[$0 + 152 >> 2]; $1 = 0; while (1) { $0 = $6 + ($1 << 5) | 0; if (!HEAPU8[$0 + 8 | 0]) { break label$3 } $3 = HEAPU8[$0 + 23 | 0]; label$12 : { label$13 : { if ($1 >>> 0 < $4 >>> 0) { if (!$3) { break label$4 } if (HEAPU8[HEAP32[$0 + 24 >> 2] + 8 | 0] > 1) { break label$5 } break label$13; } if (!$3) { break label$12 } } $7 = $0 + 24 | 0; $0 = 0; while (1) { if ($0) { $5 = HEAP32[$7 >> 2] + ($0 << 4) | 0; if ((HEAPU8[$5 + -8 | 0] + 1 | 0) != HEAPU8[$5 + 8 | 0]) { break label$6 } } $0 = $0 + 1 | 0; if ($0 >>> 0 < $3 >>> 0) { continue } break; }; } $0 = 1; $1 = $1 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } $6 = $3 + -1 | 0; $7 = HEAP32[$0 + 152 >> 2]; $1 = 0; while (1) { $0 = $7 + ($1 << 5) | 0; $2 = HEAPU8[$0 + 8 | 0]; if (!$2) { break label$3 } if (!(($2 | 0) == 170 | $2 >>> 0 < 100)) { $0 = 0; break label$1; } if (__wasm_i64_urem(HEAP32[$0 >> 2], HEAP32[$0 + 4 >> 2]) | i64toi32_i32$HIGH_BITS) { $0 = 0; break label$1; } $2 = HEAPU8[$0 + 23 | 0]; label$21 : { label$22 : { if ($1 >>> 0 < $6 >>> 0) { if (!$2) { break label$4 } if (HEAPU8[HEAP32[$0 + 24 >> 2] + 8 | 0] < 2) { break label$22 } break label$5; } if (!$2) { break label$21 } } $5 = HEAP32[$0 + 24 >> 2]; $0 = 0; while (1) { $4 = $5 + ($0 << 4) | 0; if (__wasm_i64_urem(HEAP32[$4 >> 2], HEAP32[$4 + 4 >> 2]) | i64toi32_i32$HIGH_BITS) { $0 = 0; break label$1; } if (HEAPU8[$4 + 8 | 0] != (HEAPU8[$4 + -8 | 0] + 1 | 0) ? $0 : 0) { break label$6 } $0 = $0 + 1 | 0; if ($0 >>> 0 < $2 >>> 0) { continue } break; }; } $0 = 1; $1 = $1 + 1 | 0; if (($3 | 0) != ($1 | 0)) { continue } break; }; break label$1; } $0 = 0; break label$1; } $0 = 0; break label$1; } $0 = 0; break label$1; } $0 = 0; break label$1; } $0 = 0; } return $0; } function FLAC__format_picture_is_legal($0) { var $1 = 0, $2 = 0; label$1 : { label$2 : { $2 = HEAP32[$0 + 4 >> 2]; $1 = HEAPU8[$2 | 0]; if (!$1) { break label$2 } while (1) { if (($1 + -32 & 255) >>> 0 < 95) { $2 = $2 + 1 | 0; $1 = HEAPU8[$2 | 0]; if ($1) { continue } break label$2; } break; }; $2 = 0; break label$1; } $2 = 1; $1 = HEAP32[$0 + 8 >> 2]; if (!HEAPU8[$1 | 0]) { break label$1 } while (1) { $0 = utf8len_($1); if (!$0) { $2 = 0; break label$1; } $1 = $0 + $1 | 0; if (HEAPU8[$1 | 0]) { continue } break; }; } return $2; } function FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order($0, $1, $2) { var $3 = 0; while (1) { $3 = $0; if ($3) { $0 = $3 + -1 | 0; if ($1 >>> $3 >>> 0 <= $2 >>> 0) { continue } } break; }; return $3; } function FLAC__format_get_max_rice_partition_order_from_blocksize($0) { var $1 = 0, $2 = 0; label$1 : { if (!($0 & 1)) { while (1) { $1 = $1 + 1 | 0; $2 = $0 & 2; $0 = $0 >>> 1 | 0; if (!$2) { continue } break; }; $0 = 15; if ($1 >>> 0 > 14) { break label$1 } } $0 = $1; } return $0; } function FLAC__format_entropy_coding_method_partitioned_rice_contents_init($0) { HEAP32[$0 + 8 >> 2] = 0; HEAP32[$0 >> 2] = 0; HEAP32[$0 + 4 >> 2] = 0; } function FLAC__format_entropy_coding_method_partitioned_rice_contents_clear($0) { var $1 = 0; $1 = HEAP32[$0 >> 2]; if ($1) { dlfree($1) } $1 = HEAP32[$0 + 4 >> 2]; if ($1) { dlfree($1) } HEAP32[$0 + 8 >> 2] = 0; HEAP32[$0 >> 2] = 0; HEAP32[$0 + 4 >> 2] = 0; } function FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0; $3 = 1; label$1 : { if (HEAPU32[$0 + 8 >> 2] >= $1 >>> 0) { break label$1 } $3 = HEAP32[$0 >> 2]; $4 = 4 << $1; $2 = dlrealloc($3, $4); if (!($2 | $1 >>> 0 > 29)) { dlfree($3) } HEAP32[$0 >> 2] = $2; $3 = 0; if (!$2) { break label$1 } $5 = HEAP32[$0 + 4 >> 2]; $2 = dlrealloc($5, $4); if (!($2 | $1 >>> 0 > 29)) { dlfree($5) } HEAP32[$0 + 4 >> 2] = $2; if (!$2) { break label$1 } memset($2, $4); HEAP32[$0 + 8 >> 2] = $1; $3 = 1; } return $3; } function ogg_page_serialno($0) { $0 = HEAP32[$0 >> 2]; return HEAPU8[$0 + 14 | 0] | HEAPU8[$0 + 15 | 0] << 8 | (HEAPU8[$0 + 16 | 0] << 16 | HEAPU8[$0 + 17 | 0] << 24); } function ogg_stream_init($0, $1) { var $2 = 0, $3 = 0, $4 = 0; if ($0) { memset($0 + 8 | 0, 352); HEAP32[$0 + 24 >> 2] = 1024; HEAP32[$0 + 4 >> 2] = 16384; $3 = dlmalloc(16384); HEAP32[$0 >> 2] = $3; $2 = dlmalloc(4096); HEAP32[$0 + 16 >> 2] = $2; $4 = dlmalloc(8192); HEAP32[$0 + 20 >> 2] = $4; label$2 : { if ($3) { if ($2 ? $4 : 0) { break label$2 } dlfree($3); $2 = HEAP32[$0 + 16 >> 2]; } if ($2) { dlfree($2) } $1 = HEAP32[$0 + 20 >> 2]; if ($1) { dlfree($1) } memset($0, 360); return -1; } HEAP32[$0 + 336 >> 2] = $1; $0 = 0; } else { $0 = -1 } return $0; } function ogg_stream_clear($0) { var $1 = 0; if ($0) { $1 = HEAP32[$0 >> 2]; if ($1) { dlfree($1) } $1 = HEAP32[$0 + 16 >> 2]; if ($1) { dlfree($1) } $1 = HEAP32[$0 + 20 >> 2]; if ($1) { dlfree($1) } memset($0, 360); } } function ogg_page_checksum_set($0) { var $1 = 0, $2 = 0, $3 = 0, $4 = 0; if ($0) { HEAP8[HEAP32[$0 >> 2] + 22 | 0] = 0; HEAP8[HEAP32[$0 >> 2] + 23 | 0] = 0; HEAP8[HEAP32[$0 >> 2] + 24 | 0] = 0; HEAP8[HEAP32[$0 >> 2] + 25 | 0] = 0; $3 = HEAP32[$0 + 4 >> 2]; if (($3 | 0) >= 1) { $4 = HEAP32[$0 >> 2]; while (1) { $1 = HEAP32[((HEAPU8[$2 + $4 | 0] ^ $1 >>> 24) << 2) + 6512 >> 2] ^ $1 << 8; $2 = $2 + 1 | 0; if (($3 | 0) != ($2 | 0)) { continue } break; }; } $3 = HEAP32[$0 + 12 >> 2]; if (($3 | 0) >= 1) { $4 = HEAP32[$0 + 8 >> 2]; $2 = 0; while (1) { $1 = HEAP32[((HEAPU8[$2 + $4 | 0] ^ $1 >>> 24) << 2) + 6512 >> 2] ^ $1 << 8; $2 = $2 + 1 | 0; if (($3 | 0) != ($2 | 0)) { continue } break; }; } HEAP8[HEAP32[$0 >> 2] + 22 | 0] = $1; HEAP8[HEAP32[$0 >> 2] + 23 | 0] = $1 >>> 8; HEAP8[HEAP32[$0 >> 2] + 24 | 0] = $1 >>> 16; HEAP8[HEAP32[$0 >> 2] + 25 | 0] = $1 >>> 24; } } function ogg_stream_iovecin($0, $1, $2, $3, $4) { var $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0; $6 = -1; folding_inner0 : { label$1 : { if (!$0) { break label$1 } $8 = HEAP32[$0 >> 2]; if (!$8) { break label$1 } if (!$1) { return 0 } while (1) { $7 = HEAP32[(($5 << 3) + $1 | 0) + 4 >> 2]; if (($7 | 0) < 0 | ($9 | 0) > (2147483647 - $7 | 0)) { break label$1 } $9 = $7 + $9 | 0; $5 = $5 + 1 | 0; if (($5 | 0) != 1) { continue } break; }; $5 = HEAP32[$0 + 12 >> 2]; if ($5) { $7 = HEAP32[$0 + 8 >> 2] - $5 | 0; HEAP32[$0 + 8 >> 2] = $7; if ($7) { memmove($8, $5 + $8 | 0, $7) } HEAP32[$0 + 12 >> 2] = 0; } $5 = HEAP32[$0 + 4 >> 2]; if (($5 - $9 | 0) <= HEAP32[$0 + 8 >> 2]) { if (($5 | 0) > (2147483647 - $9 | 0)) { break folding_inner0 } $5 = $5 + $9 | 0; $5 = ($5 | 0) < 2147482623 ? $5 + 1024 | 0 : $5; $8 = dlrealloc(HEAP32[$0 >> 2], $5); if (!$8) { break folding_inner0 } HEAP32[$0 >> 2] = $8; HEAP32[$0 + 4 >> 2] = $5; } $8 = ($9 | 0) / 255 | 0; $11 = $8 + 1 | 0; if (_os_lacing_expand($0, $11)) { break label$1 } $6 = HEAP32[$0 + 8 >> 2]; $5 = 0; while (1) { $7 = HEAP32[$0 >> 2] + $6 | 0; $6 = ($5 << 3) + $1 | 0; memcpy($7, HEAP32[$6 >> 2], HEAP32[$6 + 4 >> 2]); $6 = HEAP32[$0 + 8 >> 2] + HEAP32[$6 + 4 >> 2] | 0; HEAP32[$0 + 8 >> 2] = $6; $5 = $5 + 1 | 0; if (($5 | 0) != 1) { continue } break; }; $7 = HEAP32[$0 + 16 >> 2]; $12 = $7; $1 = HEAP32[$0 + 28 >> 2]; $13 = $1; label$19 : { if (($9 | 0) <= 254) { $6 = HEAP32[$0 + 20 >> 2]; $5 = 0; break label$19; } $6 = HEAP32[$0 + 20 >> 2]; $5 = 0; while (1) { $10 = $1 + $5 | 0; HEAP32[$7 + ($10 << 2) >> 2] = 255; $14 = HEAP32[$0 + 356 >> 2]; $10 = ($10 << 3) + $6 | 0; HEAP32[$10 >> 2] = HEAP32[$0 + 352 >> 2]; HEAP32[$10 + 4 >> 2] = $14; $5 = $5 + 1 | 0; if (($8 | 0) != ($5 | 0)) { continue } break; }; $5 = $8; } $5 = $13 + $5 | 0; HEAP32[$12 + ($5 << 2) >> 2] = $9 - Math_imul($8, 255); $5 = ($5 << 3) + $6 | 0; HEAP32[$5 >> 2] = $3; HEAP32[$5 + 4 >> 2] = $4; HEAP32[$0 + 352 >> 2] = $3; HEAP32[$0 + 356 >> 2] = $4; $3 = $7 + ($1 << 2) | 0; HEAP32[$3 >> 2] = HEAP32[$3 >> 2] | 256; HEAP32[$0 + 28 >> 2] = $1 + $11; $1 = HEAP32[$0 + 348 >> 2]; $3 = HEAP32[$0 + 344 >> 2] + 1 | 0; if ($3 >>> 0 < 1) { $1 = $1 + 1 | 0 } HEAP32[$0 + 344 >> 2] = $3; HEAP32[$0 + 348 >> 2] = $1; $6 = 0; if (!$2) { break label$1 } HEAP32[$0 + 328 >> 2] = 1; } return $6; } $1 = HEAP32[$0 >> 2]; if ($1) { dlfree($1) } $1 = HEAP32[$0 + 16 >> 2]; if ($1) { dlfree($1) } $1 = HEAP32[$0 + 20 >> 2]; if ($1) { dlfree($1) } memset($0, 360); return -1; } function _os_lacing_expand($0, $1) { var $2 = 0; folding_inner0 : { $2 = HEAP32[$0 + 24 >> 2]; if (($2 - $1 | 0) <= HEAP32[$0 + 28 >> 2]) { if (($2 | 0) > (2147483647 - $1 | 0)) { break folding_inner0 } $1 = $1 + $2 | 0; $1 = ($1 | 0) < 2147483615 ? $1 + 32 | 0 : $1; $2 = dlrealloc(HEAP32[$0 + 16 >> 2], $1 << 2); if (!$2) { break folding_inner0 } HEAP32[$0 + 16 >> 2] = $2; $2 = dlrealloc(HEAP32[$0 + 20 >> 2], $1 << 3); if (!$2) { break folding_inner0 } HEAP32[$0 + 24 >> 2] = $1; HEAP32[$0 + 20 >> 2] = $2; } return 0; } $1 = HEAP32[$0 >> 2]; if ($1) { dlfree($1) } $1 = HEAP32[$0 + 16 >> 2]; if ($1) { dlfree($1) } $1 = HEAP32[$0 + 20 >> 2]; if ($1) { dlfree($1) } memset($0, 360); return -1; } function ogg_stream_packetin($0, $1) { var $2 = 0; $2 = global$0 - 16 | 0; global$0 = $2; HEAP32[$2 + 8 >> 2] = HEAP32[$1 >> 2]; HEAP32[$2 + 12 >> 2] = HEAP32[$1 + 4 >> 2]; $0 = ogg_stream_iovecin($0, $2 + 8 | 0, HEAP32[$1 + 12 >> 2], HEAP32[$1 + 16 >> 2], HEAP32[$1 + 20 >> 2]); global$0 = $2 + 16 | 0; return $0; } function ogg_stream_flush_i($0, $1, $2) { var $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0; label$1 : { if (!$0) { break label$1 } $8 = HEAP32[$0 + 28 >> 2]; $4 = ($8 | 0) < 255 ? $8 : 255; if (!$4) { break label$1 } $10 = HEAP32[$0 >> 2]; if (!$10) { break label$1 } label$2 : { label$3 : { label$4 : { $11 = HEAP32[$0 + 332 >> 2]; if ($11) { if (($8 | 0) >= 1) { break label$4 } $7 = -1; $5 = -1; break label$3; } $3 = ($4 | 0) > 0 ? $4 : 0; while (1) { if (($3 | 0) == ($6 | 0)) { break label$3 } $9 = $6 << 2; $4 = $6 + 1 | 0; $6 = $4; if (HEAPU8[$9 + HEAP32[$0 + 16 >> 2] | 0] == 255) { continue } break; }; $3 = $4; break label$3; } $4 = ($4 | 0) > 1 ? $4 : 1; $7 = -1; $5 = -1; label$7 : { while (1) { if (!(($6 | 0) <= 4096 | ($9 | 0) <= 3)) { $2 = 1; break label$7; } $9 = 0; $12 = HEAPU8[HEAP32[$0 + 16 >> 2] + ($3 << 2) | 0]; if (($12 | 0) != 255) { $13 = $13 + 1 | 0; $9 = $13; $5 = HEAP32[$0 + 20 >> 2] + ($3 << 3) | 0; $7 = HEAP32[$5 >> 2]; $5 = HEAP32[$5 + 4 >> 2]; } $6 = $6 + $12 | 0; $3 = $3 + 1 | 0; if (($4 | 0) != ($3 | 0)) { continue } break; }; $3 = $4; } $4 = 255; if (($3 | 0) == 255) { break label$2 } } $4 = $3; if (!$2) { break label$1 } } HEAP32[$0 + 40 >> 2] = 1399285583; HEAP16[$0 + 44 >> 1] = 0; $2 = HEAP32[$0 + 16 >> 2]; $3 = (HEAPU8[$2 + 1 | 0] ^ -1) & 1; $3 = $11 ? $3 : $3 | 2; HEAP8[$0 + 45 | 0] = $3; if (!(!HEAP32[$0 + 328 >> 2] | ($4 | 0) != ($8 | 0))) { HEAP8[$0 + 45 | 0] = $3 | 4 } HEAP32[$0 + 332 >> 2] = 1; HEAP8[$0 + 53 | 0] = $5 >>> 24; HEAP8[$0 + 52 | 0] = $5 >>> 16; HEAP8[$0 + 51 | 0] = $5 >>> 8; HEAP8[$0 + 50 | 0] = $5; HEAP8[$0 + 49 | 0] = ($5 & 16777215) << 8 | $7 >>> 24; HEAP8[$0 + 48 | 0] = ($5 & 65535) << 16 | $7 >>> 16; HEAP8[$0 + 47 | 0] = ($5 & 255) << 24 | $7 >>> 8; HEAP8[$0 + 46 | 0] = $7; $3 = HEAP32[$0 + 336 >> 2]; HEAP8[$0 + 54 | 0] = $3; HEAP8[$0 + 55 | 0] = $3 >>> 8; HEAP8[$0 + 56 | 0] = $3 >>> 16; HEAP8[$0 + 57 | 0] = $3 >>> 24; $3 = HEAP32[$0 + 340 >> 2]; if (($3 | 0) == -1) { HEAP32[$0 + 340 >> 2] = 0; $3 = 0; } HEAP8[$0 + 66 | 0] = $4; $6 = 0; HEAP16[$0 + 62 >> 1] = 0; HEAP16[$0 + 64 >> 1] = 0; HEAP8[$0 + 61 | 0] = $3 >>> 24; HEAP8[$0 + 60 | 0] = $3 >>> 16; HEAP8[$0 + 59 | 0] = $3 >>> 8; HEAP8[$0 + 58 | 0] = $3; $14 = 1; HEAP32[$0 + 340 >> 2] = $3 + 1; if (($4 | 0) >= 1) { $3 = 0; while (1) { $5 = HEAP32[$2 + ($3 << 2) >> 2]; HEAP8[($0 + $3 | 0) + 67 | 0] = $5; $6 = ($5 & 255) + $6 | 0; $3 = $3 + 1 | 0; if (($4 | 0) != ($3 | 0)) { continue } break; }; } HEAP32[$1 >> 2] = $0 + 40; $3 = $4 + 27 | 0; HEAP32[$0 + 324 >> 2] = $3; HEAP32[$1 + 4 >> 2] = $3; $3 = HEAP32[$0 + 12 >> 2]; HEAP32[$1 + 12 >> 2] = $6; HEAP32[$1 + 8 >> 2] = $3 + $10; $3 = $8 - $4 | 0; HEAP32[$0 + 28 >> 2] = $3; memmove($2, $2 + ($4 << 2) | 0, $3 << 2); $2 = HEAP32[$0 + 20 >> 2]; memmove($2, $2 + ($4 << 3) | 0, HEAP32[$0 + 28 >> 2] << 3); HEAP32[$0 + 12 >> 2] = HEAP32[$0 + 12 >> 2] + $6; if (!$1) { break label$1 } $0 = 0; HEAP8[HEAP32[$1 >> 2] + 22 | 0] = 0; HEAP8[HEAP32[$1 >> 2] + 23 | 0] = 0; HEAP8[HEAP32[$1 >> 2] + 24 | 0] = 0; HEAP8[HEAP32[$1 >> 2] + 25 | 0] = 0; $2 = HEAP32[$1 + 4 >> 2]; if (($2 | 0) >= 1) { $4 = HEAP32[$1 >> 2]; $3 = 0; while (1) { $0 = HEAP32[((HEAPU8[$3 + $4 | 0] ^ $0 >>> 24) << 2) + 6512 >> 2] ^ $0 << 8; $3 = $3 + 1 | 0; if (($2 | 0) != ($3 | 0)) { continue } break; }; } $2 = HEAP32[$1 + 12 >> 2]; if (($2 | 0) >= 1) { $4 = HEAP32[$1 + 8 >> 2]; $3 = 0; while (1) { $0 = HEAP32[((HEAPU8[$3 + $4 | 0] ^ $0 >>> 24) << 2) + 6512 >> 2] ^ $0 << 8; $3 = $3 + 1 | 0; if (($2 | 0) != ($3 | 0)) { continue } break; }; } HEAP8[HEAP32[$1 >> 2] + 22 | 0] = $0; HEAP8[HEAP32[$1 >> 2] + 23 | 0] = $0 >>> 8; HEAP8[HEAP32[$1 >> 2] + 24 | 0] = $0 >>> 16; HEAP8[HEAP32[$1 >> 2] + 25 | 0] = $0 >>> 24; } return $14; } function ogg_stream_pageout($0, $1) { var $2 = 0, $3 = 0, $4 = 0; if (!(!$0 | !HEAP32[$0 >> 2])) { $2 = HEAP32[$0 + 28 >> 2]; $4 = $0; label$2 : { label$3 : { if (HEAP32[$0 + 328 >> 2]) { if ($2) { break label$3 } $3 = 0; break label$2; } $3 = 0; if (HEAP32[$0 + 332 >> 2] | !$2) { break label$2 } } $3 = 1; } $2 = ogg_stream_flush_i($4, $1, $3); } return $2; } function ogg_sync_init($0) { if ($0) { HEAP32[$0 >> 2] = 0; HEAP32[$0 + 4 >> 2] = 0; HEAP32[$0 + 24 >> 2] = 0; HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 + 20 >> 2] = 0; HEAP32[$0 + 8 >> 2] = 0; HEAP32[$0 + 12 >> 2] = 0; } return 0; } function ogg_sync_clear($0) { var $1 = 0; if ($0) { $1 = HEAP32[$0 >> 2]; if ($1) { dlfree($1) } HEAP32[$0 >> 2] = 0; HEAP32[$0 + 4 >> 2] = 0; HEAP32[$0 + 24 >> 2] = 0; HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 + 20 >> 2] = 0; HEAP32[$0 + 8 >> 2] = 0; HEAP32[$0 + 12 >> 2] = 0; } } function ogg_sync_buffer($0, $1) { var $2 = 0, $3 = 0, $4 = 0; $2 = HEAP32[$0 + 4 >> 2]; if (($2 | 0) >= 0) { $4 = HEAP32[$0 + 12 >> 2]; if ($4) { $3 = HEAP32[$0 + 8 >> 2] - $4 | 0; HEAP32[$0 + 8 >> 2] = $3; if (($3 | 0) >= 1) { $2 = HEAP32[$0 >> 2]; memmove($2, $2 + $4 | 0, $3); $2 = HEAP32[$0 + 4 >> 2]; } HEAP32[$0 + 12 >> 2] = 0; } $3 = $2; $2 = HEAP32[$0 + 8 >> 2]; label$4 : { if (($3 - $2 | 0) >= ($1 | 0)) { $1 = HEAP32[$0 >> 2]; break label$4; } $2 = ($1 + $2 | 0) + 4096 | 0; $1 = HEAP32[$0 >> 2]; label$6 : { if ($1) { $1 = dlrealloc($1, $2); break label$6; } $1 = dlmalloc($2); } if (!$1) { $1 = HEAP32[$0 >> 2]; if ($1) { dlfree($1) } HEAP32[$0 >> 2] = 0; HEAP32[$0 + 4 >> 2] = 0; HEAP32[$0 + 24 >> 2] = 0; HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 + 20 >> 2] = 0; HEAP32[$0 + 8 >> 2] = 0; HEAP32[$0 + 12 >> 2] = 0; return 0; } HEAP32[$0 + 4 >> 2] = $2; HEAP32[$0 >> 2] = $1; $2 = HEAP32[$0 + 8 >> 2]; } $0 = $1 + $2 | 0; } else { $0 = 0 } return $0; } function ogg_sync_wrote($0, $1) { var $2 = 0, $3 = 0; $2 = -1; $3 = HEAP32[$0 + 4 >> 2]; label$1 : { if (($3 | 0) < 0) { break label$1 } $1 = HEAP32[$0 + 8 >> 2] + $1 | 0; if (($1 | 0) > ($3 | 0)) { break label$1 } HEAP32[$0 + 8 >> 2] = $1; $2 = 0; } return $2; } function ogg_sync_pageseek($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0; $9 = global$0 - 16 | 0; global$0 = $9; label$1 : { if (HEAP32[$0 + 4 >> 2] < 0) { break label$1 } $4 = HEAP32[$0 + 12 >> 2]; $10 = HEAP32[$0 + 8 >> 2] - $4 | 0; $2 = $4 + HEAP32[$0 >> 2] | 0; label$2 : { label$3 : { label$4 : { $5 = HEAP32[$0 + 20 >> 2]; label$5 : { if (!$5) { if (($10 | 0) < 27) { break label$1 } if ((HEAPU8[$2 | 0] | HEAPU8[$2 + 1 | 0] << 8 | (HEAPU8[$2 + 2 | 0] << 16 | HEAPU8[$2 + 3 | 0] << 24)) != 1399285583) { break label$5 } $4 = HEAPU8[$2 + 26 | 0]; $5 = $4 + 27 | 0; if (($10 | 0) < ($5 | 0)) { break label$1 } if ($4) { $4 = HEAP32[$0 + 24 >> 2]; while (1) { $4 = HEAPU8[($2 + $6 | 0) + 27 | 0] + $4 | 0; HEAP32[$0 + 24 >> 2] = $4; $6 = $6 + 1 | 0; if ($6 >>> 0 < HEAPU8[$2 + 26 | 0]) { continue } break; }; } HEAP32[$0 + 20 >> 2] = $5; } if ((HEAP32[$0 + 24 >> 2] + $5 | 0) > ($10 | 0)) { break label$1 } $7 = HEAPU8[$2 + 22 | 0] | HEAPU8[$2 + 23 | 0] << 8 | (HEAPU8[$2 + 24 | 0] << 16 | HEAPU8[$2 + 25 | 0] << 24); HEAP32[$9 + 12 >> 2] = $7; $6 = 0; HEAP8[$2 + 22 | 0] = 0; HEAP8[$2 + 23 | 0] = 0; HEAP8[$2 + 24 | 0] = 0; HEAP8[$2 + 25 | 0] = 0; $11 = HEAP32[$0 + 24 >> 2]; $8 = HEAP32[$0 + 20 >> 2]; HEAP8[$2 + 22 | 0] = 0; HEAP8[$2 + 23 | 0] = 0; HEAP8[$2 + 24 | 0] = 0; HEAP8[$2 + 25 | 0] = 0; if (($8 | 0) > 0) { $5 = 0; while (1) { $3 = HEAP32[((HEAPU8[$2 + $5 | 0] ^ $3 >>> 24) << 2) + 6512 >> 2] ^ $3 << 8; $5 = $5 + 1 | 0; if (($8 | 0) != ($5 | 0)) { continue } break; }; } $4 = $2 + 22 | 0; if (($11 | 0) > 0) { $8 = $2 + $8 | 0; while (1) { $3 = HEAP32[((HEAPU8[$6 + $8 | 0] ^ $3 >>> 24) << 2) + 6512 >> 2] ^ $3 << 8; $6 = $6 + 1 | 0; if (($11 | 0) != ($6 | 0)) { continue } break; }; } HEAP8[$2 + 22 | 0] = $3; HEAP8[$2 + 23 | 0] = $3 >>> 8; HEAP8[$2 + 24 | 0] = $3 >>> 16; HEAP8[$2 + 25 | 0] = $3 >>> 24; if (HEAP32[$9 + 12 >> 2] == (HEAPU8[$4 | 0] | HEAPU8[$4 + 1 | 0] << 8 | (HEAPU8[$4 + 2 | 0] << 16 | HEAPU8[$4 + 3 | 0] << 24))) { break label$4 } HEAP8[$4 | 0] = $7; HEAP8[$4 + 1 | 0] = $7 >>> 8; HEAP8[$4 + 2 | 0] = $7 >>> 16; HEAP8[$4 + 3 | 0] = $7 >>> 24; } HEAP32[$0 + 20 >> 2] = 0; HEAP32[$0 + 24 >> 2] = 0; $3 = memchr($2 + 1 | 0, $10 + -1 | 0); if (!$3) { break label$3 } $6 = HEAP32[$0 >> 2]; break label$2; } $7 = HEAP32[$0 + 12 >> 2]; label$13 : { if (!$1) { $5 = HEAP32[$0 + 24 >> 2]; $3 = HEAP32[$0 + 20 >> 2]; break label$13; } $4 = $7 + HEAP32[$0 >> 2] | 0; HEAP32[$1 >> 2] = $4; $3 = HEAP32[$0 + 20 >> 2]; HEAP32[$1 + 4 >> 2] = $3; HEAP32[$1 + 8 >> 2] = $3 + $4; $5 = HEAP32[$0 + 24 >> 2]; HEAP32[$1 + 12 >> 2] = $5; } HEAP32[$0 + 24 >> 2] = 0; HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 + 20 >> 2] = 0; $3 = $3 + $5 | 0; HEAP32[$0 + 12 >> 2] = $7 + $3; break label$1; } $6 = HEAP32[$0 >> 2]; $3 = $6 + HEAP32[$0 + 8 >> 2] | 0; } HEAP32[$0 + 12 >> 2] = $3 - $6; $3 = $2 - $3 | 0; } global$0 = $9 + 16 | 0; return $3; } function ogg_sync_pageout($0, $1) { var $2 = 0; if (HEAP32[$0 + 4 >> 2] >= 0) { while (1) { $2 = ogg_sync_pageseek($0, $1); if (($2 | 0) > 0) { return 1 } if (!$2) { return 0 } if (HEAP32[$0 + 16 >> 2]) { continue } break; }; HEAP32[$0 + 16 >> 2] = 1; $0 = -1; } else { $0 = 0 } return $0; } function ogg_stream_pagein($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0; $4 = -1; folding_inner0 : { label$1 : { if (!$0) { break label$1 } $6 = HEAP32[$0 >> 2]; if (!$6) { break label$1 } $3 = HEAP32[$1 >> 2]; $10 = HEAPU8[$3 + 5 | 0]; $5 = HEAP32[$1 + 12 >> 2]; $11 = HEAP32[$1 + 8 >> 2]; $8 = HEAPU8[$3 + 26 | 0]; $13 = HEAPU8[$3 + 18 | 0] | HEAPU8[$3 + 19 | 0] << 8 | (HEAPU8[$3 + 20 | 0] << 16 | HEAPU8[$3 + 21 | 0] << 24); $9 = HEAPU8[$3 + 14 | 0] | HEAPU8[$3 + 15 | 0] << 8 | (HEAPU8[$3 + 16 | 0] << 16 | HEAPU8[$3 + 17 | 0] << 24); $14 = HEAPU8[$3 + 6 | 0] | HEAPU8[$3 + 7 | 0] << 8 | (HEAPU8[$3 + 8 | 0] << 16 | HEAPU8[$3 + 9 | 0] << 24); $15 = HEAPU8[$3 + 10 | 0] | HEAPU8[$3 + 11 | 0] << 8 | (HEAPU8[$3 + 12 | 0] << 16 | HEAPU8[$3 + 13 | 0] << 24); $12 = HEAPU8[$3 + 4 | 0]; $2 = HEAP32[$0 + 36 >> 2]; $1 = HEAP32[$0 + 12 >> 2]; if ($1) { $7 = HEAP32[$0 + 8 >> 2] - $1 | 0; HEAP32[$0 + 8 >> 2] = $7; if ($7) { memmove($6, $1 + $6 | 0, $7) } HEAP32[$0 + 12 >> 2] = 0; } if ($2) { $1 = $0; $6 = HEAP32[$0 + 28 >> 2] - $2 | 0; if ($6) { $7 = HEAP32[$0 + 16 >> 2]; memmove($7, $7 + ($2 << 2) | 0, $6 << 2); $6 = HEAP32[$0 + 20 >> 2]; memmove($6, $6 + ($2 << 3) | 0, HEAP32[$0 + 28 >> 2] - $2 << 3); $7 = HEAP32[$0 + 28 >> 2] - $2 | 0; } else { $7 = 0 } HEAP32[$1 + 28 >> 2] = $7; HEAP32[$0 + 36 >> 2] = 0; HEAP32[$0 + 32 >> 2] = HEAP32[$0 + 32 >> 2] - $2; } if (($9 | 0) != HEAP32[$0 + 336 >> 2] | $12) { break label$1 } if (_os_lacing_expand($0, $8 + 1 | 0)) { break label$1 } $7 = $10 & 1; $6 = HEAP32[$0 + 340 >> 2]; label$7 : { if (($6 | 0) == ($13 | 0)) { break label$7 } $2 = HEAP32[$0 + 32 >> 2]; $9 = HEAP32[$0 + 28 >> 2]; if (($2 | 0) < ($9 | 0)) { $4 = HEAP32[$0 + 8 >> 2]; $12 = HEAP32[$0 + 16 >> 2]; $1 = $2; while (1) { $4 = $4 - HEAPU8[$12 + ($1 << 2) | 0] | 0; $1 = $1 + 1 | 0; if (($1 | 0) < ($9 | 0)) { continue } break; }; HEAP32[$0 + 8 >> 2] = $4; } HEAP32[$0 + 28 >> 2] = $2; if (($6 | 0) == -1) { break label$7 } $1 = $2 + 1 | 0; HEAP32[$0 + 28 >> 2] = $1; HEAP32[HEAP32[$0 + 16 >> 2] + ($2 << 2) >> 2] = 1024; HEAP32[$0 + 32 >> 2] = $1; } $6 = $10 & 2; $4 = 0; label$10 : { if (!$7) { break label$10 } $1 = HEAP32[$0 + 28 >> 2]; if (HEAP32[(HEAP32[$0 + 16 >> 2] + ($1 << 2) | 0) + -4 >> 2] != 1024 ? ($1 | 0) >= 1 : 0) { break label$10 } $6 = 0; if (!$8) { break label$10 } $1 = 0; while (1) { $4 = $1 + 1 | 0; $1 = HEAPU8[($1 + $3 | 0) + 27 | 0]; $5 = $5 - $1 | 0; $11 = $1 + $11 | 0; if (($1 | 0) != 255) { break label$10 } $1 = $4; if (($8 | 0) != ($1 | 0)) { continue } break; }; $4 = $8; } if ($5) { $2 = HEAP32[$0 + 4 >> 2]; $1 = HEAP32[$0 + 8 >> 2]; label$15 : { if (($2 - $5 | 0) > ($1 | 0)) { $2 = HEAP32[$0 >> 2]; break label$15; } if (($2 | 0) > (2147483647 - $5 | 0)) { break folding_inner0 } $1 = $2 + $5 | 0; $1 = ($1 | 0) < 2147482623 ? $1 + 1024 | 0 : $1; $2 = dlrealloc(HEAP32[$0 >> 2], $1); if (!$2) { break folding_inner0 } HEAP32[$0 >> 2] = $2; HEAP32[$0 + 4 >> 2] = $1; $1 = HEAP32[$0 + 8 >> 2]; } memcpy($1 + $2 | 0, $11, $5); HEAP32[$0 + 8 >> 2] = HEAP32[$0 + 8 >> 2] + $5; } $11 = $10 & 4; label$25 : { if (($4 | 0) >= ($8 | 0)) { break label$25 } $10 = HEAP32[$0 + 20 >> 2]; $7 = HEAP32[$0 + 16 >> 2]; $2 = HEAP32[$0 + 28 >> 2]; $1 = $7 + ($2 << 2) | 0; $5 = HEAPU8[($3 + $4 | 0) + 27 | 0]; HEAP32[$1 >> 2] = $5; $9 = $10 + ($2 << 3) | 0; HEAP32[$9 >> 2] = -1; HEAP32[$9 + 4 >> 2] = -1; if ($6) { HEAP32[$1 >> 2] = $5 | 256 } $1 = $2 + 1 | 0; HEAP32[$0 + 28 >> 2] = $1; $4 = $4 + 1 | 0; label$27 : { if (($5 | 0) == 255) { $2 = -1; break label$27; } HEAP32[$0 + 32 >> 2] = $1; } if (($4 | 0) != ($8 | 0)) { while (1) { $6 = HEAPU8[($3 + $4 | 0) + 27 | 0]; HEAP32[$7 + ($1 << 2) >> 2] = $6; $5 = $10 + ($1 << 3) | 0; HEAP32[$5 >> 2] = -1; HEAP32[$5 + 4 >> 2] = -1; $5 = $1 + 1 | 0; HEAP32[$0 + 28 >> 2] = $5; $4 = $4 + 1 | 0; if (($6 | 0) != 255) { HEAP32[$0 + 32 >> 2] = $5; $2 = $1; } $1 = $5; if (($4 | 0) != ($8 | 0)) { continue } break; } } if (($2 | 0) == -1) { break label$25 } $1 = HEAP32[$0 + 20 >> 2] + ($2 << 3) | 0; HEAP32[$1 >> 2] = $14; HEAP32[$1 + 4 >> 2] = $15; } label$32 : { if (!$11) { break label$32 } HEAP32[$0 + 328 >> 2] = 1; $1 = HEAP32[$0 + 28 >> 2]; if (($1 | 0) < 1) { break label$32 } $1 = (HEAP32[$0 + 16 >> 2] + ($1 << 2) | 0) + -4 | 0; HEAP32[$1 >> 2] = HEAP32[$1 >> 2] | 512; } HEAP32[$0 + 340 >> 2] = $13 + 1; $4 = 0; } return $4; } $1 = HEAP32[$0 >> 2]; if ($1) { dlfree($1) } $1 = HEAP32[$0 + 16 >> 2]; if ($1) { dlfree($1) } $1 = HEAP32[$0 + 20 >> 2]; if ($1) { dlfree($1) } memset($0, 360); return -1; } function ogg_sync_reset($0) { if (HEAP32[$0 + 4 >> 2] < 0) { return } HEAP32[$0 + 8 >> 2] = 0; HEAP32[$0 + 12 >> 2] = 0; HEAP32[$0 + 24 >> 2] = 0; HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 + 20 >> 2] = 0; } function ogg_stream_reset($0) { if (!$0 | !HEAP32[$0 >> 2]) { $0 = -1 } else { HEAP32[$0 + 344 >> 2] = 0; HEAP32[$0 + 348 >> 2] = 0; HEAP32[$0 + 340 >> 2] = -1; HEAP32[$0 + 332 >> 2] = 0; HEAP32[$0 + 324 >> 2] = 0; HEAP32[$0 + 328 >> 2] = 0; HEAP32[$0 + 36 >> 2] = 0; HEAP32[$0 + 28 >> 2] = 0; HEAP32[$0 + 32 >> 2] = 0; HEAP32[$0 + 8 >> 2] = 0; HEAP32[$0 + 12 >> 2] = 0; HEAP32[$0 + 352 >> 2] = 0; HEAP32[$0 + 356 >> 2] = 0; $0 = 0; } } function ogg_stream_packetout($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0; label$1 : { if (!$0) { break label$1 } $8 = HEAP32[$0 >> 2]; if (!$8) { break label$1 } $5 = HEAP32[$0 + 36 >> 2]; if (HEAP32[$0 + 32 >> 2] <= ($5 | 0)) { break label$1 } $3 = HEAP32[$0 + 16 >> 2]; $6 = HEAP32[$3 + ($5 << 2) >> 2]; if ($6 & 1024) { HEAP32[$0 + 36 >> 2] = $5 + 1; $1 = $0; $3 = $0; $2 = HEAP32[$0 + 348 >> 2]; $0 = HEAP32[$0 + 344 >> 2] + 1 | 0; if ($0 >>> 0 < 1) { $2 = $2 + 1 | 0 } HEAP32[$3 + 344 >> 2] = $0; HEAP32[$1 + 348 >> 2] = $2; return -1; } $4 = $6 & 512; $7 = 255; $2 = $6 & 255; label$3 : { if (($2 | 0) != 255) { $7 = $2; break label$3; } while (1) { $5 = $5 + 1 | 0; $2 = HEAP32[($5 << 2) + $3 >> 2]; $4 = $2 & 512 ? 512 : $4; $2 = $2 & 255; $7 = $2 + $7 | 0; if (($2 | 0) == 255) { continue } break; }; } label$6 : { if (!$1) { $4 = HEAP32[$0 + 344 >> 2]; $2 = HEAP32[$0 + 348 >> 2]; $6 = HEAP32[$0 + 12 >> 2]; break label$6; } HEAP32[$1 + 8 >> 2] = $6 & 256; HEAP32[$1 + 12 >> 2] = $4; $6 = HEAP32[$0 + 12 >> 2]; HEAP32[$1 >> 2] = $8 + $6; $3 = HEAP32[$0 + 348 >> 2]; $2 = $3; $4 = HEAP32[$0 + 344 >> 2]; HEAP32[$1 + 24 >> 2] = $4; HEAP32[$1 + 28 >> 2] = $2; $3 = HEAP32[$0 + 20 >> 2] + ($5 << 3) | 0; $8 = HEAP32[$3 + 4 >> 2]; $3 = HEAP32[$3 >> 2]; HEAP32[$1 + 4 >> 2] = $7; HEAP32[$1 + 16 >> 2] = $3; HEAP32[$1 + 20 >> 2] = $8; } $3 = $4 + 1 | 0; if ($3 >>> 0 < 1) { $2 = $2 + 1 | 0 } HEAP32[$0 + 344 >> 2] = $3; HEAP32[$0 + 348 >> 2] = $2; $4 = 1; HEAP32[$0 + 36 >> 2] = $5 + 1; HEAP32[$0 + 12 >> 2] = $6 + $7; } return $4; } function FLAC__ogg_decoder_aspect_init($0) { var $1 = 0; label$1 : { if (ogg_stream_init($0 + 8 | 0, HEAP32[$0 + 4 >> 2])) { break label$1 } if (ogg_sync_init($0 + 368 | 0)) { break label$1 } HEAP32[$0 + 396 >> 2] = -1; HEAP32[$0 + 400 >> 2] = -1; HEAP32[$0 + 408 >> 2] = 0; HEAP32[$0 + 412 >> 2] = 0; HEAP32[$0 + 404 >> 2] = HEAP32[$0 >> 2]; $1 = 1; } return $1; } function FLAC__ogg_decoder_aspect_set_defaults($0) { HEAP32[$0 >> 2] = 1; } function FLAC__ogg_decoder_aspect_reset($0) { ogg_stream_reset($0 + 8 | 0); ogg_sync_reset($0 + 368 | 0); HEAP32[$0 + 408 >> 2] = 0; HEAP32[$0 + 412 >> 2] = 0; if (HEAP32[$0 >> 2]) { HEAP32[$0 + 404 >> 2] = 1 } } function FLAC__ogg_decoder_aspect_read_callback_wrapper($0, $1, $2, $3, $4) { var $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0; $8 = global$0 - 16 | 0; global$0 = $8; $9 = HEAP32[$2 >> 2]; HEAP32[$2 >> 2] = 0; label$1 : { label$2 : { label$3 : { if (!$9) { break label$3 } $10 = $0 + 416 | 0; $11 = $0 + 368 | 0; $13 = $0 + 440 | 0; $14 = $0 + 8 | 0; $15 = HEAP32[2721]; $16 = HEAPU8[7536]; while (1) { if (HEAP32[$0 + 408 >> 2]) { break label$3 } label$5 : { label$6 : { if (HEAP32[$0 + 412 >> 2]) { if (HEAP32[$0 + 432 >> 2]) { $7 = HEAP32[$0 + 440 >> 2]; $6 = HEAP32[$0 + 444 >> 2]; $5 = $9 - $5 | 0; if ($6 >>> 0 > $5 >>> 0) { break label$6 } $1 = memcpy($1, $7, $6); HEAP32[$2 >> 2] = $6 + HEAP32[$2 >> 2]; HEAP32[$0 + 432 >> 2] = 0; $1 = $1 + $6 | 0; break label$5; } $5 = ogg_stream_packetout($14, $13); if (($5 | 0) >= 1) { HEAP32[$0 + 432 >> 2] = 1; $12 = HEAP32[$0 + 444 >> 2]; if (($12 | 0) < 1) { break label$5 } $6 = HEAP32[$13 >> 2]; if (HEAPU8[$6 | 0] != ($16 | 0)) { break label$5 } $7 = 3; if (($12 | 0) < 9) { break label$1 } $5 = $15; if ((HEAPU8[$6 + 1 | 0] | HEAPU8[$6 + 2 | 0] << 8 | (HEAPU8[$6 + 3 | 0] << 16 | HEAPU8[$6 + 4 | 0] << 24)) != (HEAPU8[$5 | 0] | HEAPU8[$5 + 1 | 0] << 8 | (HEAPU8[$5 + 2 | 0] << 16 | HEAPU8[$5 + 3 | 0] << 24))) { break label$1 } $5 = HEAPU8[$6 + 5 | 0]; HEAP32[$0 + 396 >> 2] = $5; HEAP32[$0 + 400 >> 2] = HEAPU8[$6 + 6 | 0]; if (($5 | 0) != 1) { $7 = 4; break label$1; } HEAP32[$0 + 444 >> 2] = $12 + -9; HEAP32[$0 + 440 >> 2] = $6 + 9; break label$5; } if ($5) { $7 = 2; break label$1; } HEAP32[$0 + 412 >> 2] = 0; break label$5; } $5 = ogg_sync_pageout($11, $10); if (($5 | 0) >= 1) { if (HEAP32[$0 + 404 >> 2]) { $5 = ogg_page_serialno($10); HEAP32[$0 + 404 >> 2] = 0; HEAP32[$0 + 344 >> 2] = $5; HEAP32[$0 + 4 >> 2] = $5; } if (ogg_stream_pagein($14, $10)) { break label$5 } HEAP32[$0 + 432 >> 2] = 0; HEAP32[$0 + 412 >> 2] = 1; break label$5; } if ($5) { $7 = 2; break label$1; } $5 = $9 - HEAP32[$2 >> 2] | 0; $5 = $5 >>> 0 > 8192 ? $5 : 8192; $6 = ogg_sync_buffer($11, $5); if (!$6) { $7 = 7; break label$1; } HEAP32[$8 + 12 >> 2] = $5; label$16 : { switch ((FUNCTION_TABLE[8]($3, $6, $8 + 12 | 0, $4) | 0) + -1 | 0) { case 0: HEAP32[$0 + 408 >> 2] = 1; break; case 4: break label$2; default: break label$16; }; } if ((ogg_sync_wrote($11, HEAP32[$8 + 12 >> 2]) | 0) >= 0) { break label$5 } $7 = 6; break label$1; } $1 = memcpy($1, $7, $5); HEAP32[$2 >> 2] = $5 + HEAP32[$2 >> 2]; HEAP32[$0 + 440 >> 2] = $5 + HEAP32[$0 + 440 >> 2]; HEAP32[$0 + 444 >> 2] = HEAP32[$0 + 444 >> 2] - $5; $1 = $1 + $5 | 0; } $5 = HEAP32[$2 >> 2]; if ($9 >>> 0 > $5 >>> 0) { continue } break; }; } global$0 = $8 + 16 | 0; return !$5 & HEAP32[$0 + 408 >> 2] != 0; } $7 = 5; } global$0 = $8 + 16 | 0; return $7; } function FLAC__MD5Init($0) { HEAP32[$0 + 80 >> 2] = 0; HEAP32[$0 + 84 >> 2] = 0; HEAP32[$0 + 64 >> 2] = 1732584193; HEAP32[$0 + 68 >> 2] = -271733879; HEAP32[$0 + 72 >> 2] = -1732584194; HEAP32[$0 + 76 >> 2] = 271733878; HEAP32[$0 + 88 >> 2] = 0; HEAP32[$0 + 92 >> 2] = 0; } function FLAC__MD5Final($0, $1) { var $2 = 0, $3 = 0, $4 = 0; $3 = HEAP32[$1 + 80 >> 2] & 63; $2 = $3 + $1 | 0; HEAP8[$2 | 0] = 128; $2 = $2 + 1 | 0; $4 = 56; label$1 : { if ($3 >>> 0 < 56) { $4 = 55 - $3 | 0; break label$1; } memset($2, $3 ^ 63); FLAC__MD5Transform($1 - -64 | 0, $1); $2 = $1; } memset($2, $4); $2 = HEAP32[$1 + 80 >> 2]; HEAP32[$1 + 56 >> 2] = $2 << 3; HEAP32[$1 + 60 >> 2] = HEAP32[$1 + 84 >> 2] << 3 | $2 >>> 29; FLAC__MD5Transform($1 - -64 | 0, $1); $2 = HEAPU8[$1 + 76 | 0] | HEAPU8[$1 + 77 | 0] << 8 | (HEAPU8[$1 + 78 | 0] << 16 | HEAPU8[$1 + 79 | 0] << 24); $3 = HEAPU8[$1 + 72 | 0] | HEAPU8[$1 + 73 | 0] << 8 | (HEAPU8[$1 + 74 | 0] << 16 | HEAPU8[$1 + 75 | 0] << 24); HEAP8[$0 + 8 | 0] = $3; HEAP8[$0 + 9 | 0] = $3 >>> 8; HEAP8[$0 + 10 | 0] = $3 >>> 16; HEAP8[$0 + 11 | 0] = $3 >>> 24; HEAP8[$0 + 12 | 0] = $2; HEAP8[$0 + 13 | 0] = $2 >>> 8; HEAP8[$0 + 14 | 0] = $2 >>> 16; HEAP8[$0 + 15 | 0] = $2 >>> 24; $2 = HEAPU8[$1 + 68 | 0] | HEAPU8[$1 + 69 | 0] << 8 | (HEAPU8[$1 + 70 | 0] << 16 | HEAPU8[$1 + 71 | 0] << 24); $3 = HEAPU8[$1 + 64 | 0] | HEAPU8[$1 + 65 | 0] << 8 | (HEAPU8[$1 + 66 | 0] << 16 | HEAPU8[$1 + 67 | 0] << 24); HEAP8[$0 | 0] = $3; HEAP8[$0 + 1 | 0] = $3 >>> 8; HEAP8[$0 + 2 | 0] = $3 >>> 16; HEAP8[$0 + 3 | 0] = $3 >>> 24; HEAP8[$0 + 4 | 0] = $2; HEAP8[$0 + 5 | 0] = $2 >>> 8; HEAP8[$0 + 6 | 0] = $2 >>> 16; HEAP8[$0 + 7 | 0] = $2 >>> 24; $0 = HEAP32[$1 + 88 >> 2]; if ($0) { dlfree($0); HEAP32[$1 + 88 >> 2] = 0; HEAP32[$1 + 92 >> 2] = 0; } memset($1, 96); } function FLAC__MD5Transform($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0, $22 = 0, $23 = 0, $24 = 0, $25 = 0, $26 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0; $11 = HEAP32[$1 + 16 >> 2]; $8 = HEAP32[$1 + 32 >> 2]; $12 = HEAP32[$1 + 48 >> 2]; $13 = HEAP32[$1 + 36 >> 2]; $14 = HEAP32[$1 + 52 >> 2]; $15 = HEAP32[$1 + 4 >> 2]; $6 = HEAP32[$1 + 20 >> 2]; $7 = HEAP32[$0 + 4 >> 2]; $9 = HEAP32[$1 >> 2]; $25 = HEAP32[$0 >> 2]; $16 = HEAP32[$0 + 12 >> 2]; $10 = HEAP32[$0 + 8 >> 2]; $3 = $7 + __wasm_rotl_i32((($9 + $25 | 0) + ($16 ^ ($16 ^ $10) & $7) | 0) + -680876936 | 0, 7) | 0; $17 = HEAP32[$1 + 12 >> 2]; $18 = HEAP32[$1 + 8 >> 2]; $4 = __wasm_rotl_i32((($15 + $16 | 0) + ($3 & ($7 ^ $10) ^ $10) | 0) + -389564586 | 0, 12) + $3 | 0; $2 = __wasm_rotl_i32((($18 + $10 | 0) + ($4 & ($3 ^ $7) ^ $7) | 0) + 606105819 | 0, 17) + $4 | 0; $5 = __wasm_rotl_i32((($7 + $17 | 0) + ($3 ^ $2 & ($3 ^ $4)) | 0) + -1044525330 | 0, 22) + $2 | 0; $3 = __wasm_rotl_i32((($3 + $11 | 0) + ($4 ^ $5 & ($2 ^ $4)) | 0) + -176418897 | 0, 7) + $5 | 0; $19 = HEAP32[$1 + 28 >> 2]; $20 = HEAP32[$1 + 24 >> 2]; $4 = __wasm_rotl_i32((($4 + $6 | 0) + ($2 ^ $3 & ($2 ^ $5)) | 0) + 1200080426 | 0, 12) + $3 | 0; $2 = __wasm_rotl_i32((($2 + $20 | 0) + ($5 ^ $4 & ($3 ^ $5)) | 0) + -1473231341 | 0, 17) + $4 | 0; $5 = __wasm_rotl_i32((($5 + $19 | 0) + ($3 ^ $2 & ($3 ^ $4)) | 0) + -45705983 | 0, 22) + $2 | 0; $3 = __wasm_rotl_i32((($3 + $8 | 0) + ($4 ^ $5 & ($2 ^ $4)) | 0) + 1770035416 | 0, 7) + $5 | 0; $21 = HEAP32[$1 + 44 >> 2]; $22 = HEAP32[$1 + 40 >> 2]; $4 = __wasm_rotl_i32((($4 + $13 | 0) + ($2 ^ $3 & ($2 ^ $5)) | 0) + -1958414417 | 0, 12) + $3 | 0; $2 = __wasm_rotl_i32((($2 + $22 | 0) + ($5 ^ $4 & ($3 ^ $5)) | 0) + -42063 | 0, 17) + $4 | 0; $5 = __wasm_rotl_i32((($5 + $21 | 0) + ($3 ^ $2 & ($3 ^ $4)) | 0) + -1990404162 | 0, 22) + $2 | 0; $3 = __wasm_rotl_i32((($3 + $12 | 0) + ($4 ^ $5 & ($2 ^ $4)) | 0) + 1804603682 | 0, 7) + $5 | 0; $23 = HEAP32[$1 + 56 >> 2]; $24 = HEAP32[$1 + 60 >> 2]; $4 = __wasm_rotl_i32((($4 + $14 | 0) + ($2 ^ $3 & ($2 ^ $5)) | 0) + -40341101 | 0, 12) + $3 | 0; $1 = $4 + __wasm_rotl_i32((($2 + $23 | 0) + ($5 ^ ($3 ^ $5) & $4) | 0) + -1502002290 | 0, 17) | 0; $26 = $1 + $21 | 0; $2 = $3 + $15 | 0; $3 = __wasm_rotl_i32((($5 + $24 | 0) + ($3 ^ $1 & ($3 ^ $4)) | 0) + 1236535329 | 0, 22) + $1 | 0; $2 = __wasm_rotl_i32(($2 + ($1 ^ ($3 ^ $1) & $4) | 0) + -165796510 | 0, 5) + $3 | 0; $1 = __wasm_rotl_i32((($4 + $20 | 0) + ($3 ^ $1 & ($3 ^ $2)) | 0) + -1069501632 | 0, 9) + $2 | 0; $4 = __wasm_rotl_i32(($26 + (($2 ^ $1) & $3 ^ $2) | 0) + 643717713 | 0, 14) + $1 | 0; $3 = __wasm_rotl_i32((($3 + $9 | 0) + ($1 ^ $2 & ($1 ^ $4)) | 0) + -373897302 | 0, 20) + $4 | 0; $2 = __wasm_rotl_i32((($2 + $6 | 0) + ($4 ^ $1 & ($3 ^ $4)) | 0) + -701558691 | 0, 5) + $3 | 0; $1 = __wasm_rotl_i32((($1 + $22 | 0) + ($3 ^ $4 & ($3 ^ $2)) | 0) + 38016083 | 0, 9) + $2 | 0; $4 = __wasm_rotl_i32((($24 + $4 | 0) + (($2 ^ $1) & $3 ^ $2) | 0) + -660478335 | 0, 14) + $1 | 0; $3 = __wasm_rotl_i32((($3 + $11 | 0) + ($1 ^ $2 & ($1 ^ $4)) | 0) + -405537848 | 0, 20) + $4 | 0; $2 = __wasm_rotl_i32((($2 + $13 | 0) + ($4 ^ $1 & ($3 ^ $4)) | 0) + 568446438 | 0, 5) + $3 | 0; $1 = __wasm_rotl_i32((($1 + $23 | 0) + ($3 ^ $4 & ($3 ^ $2)) | 0) + -1019803690 | 0, 9) + $2 | 0; $4 = __wasm_rotl_i32((($4 + $17 | 0) + (($2 ^ $1) & $3 ^ $2) | 0) + -187363961 | 0, 14) + $1 | 0; $3 = __wasm_rotl_i32((($3 + $8 | 0) + ($1 ^ $2 & ($1 ^ $4)) | 0) + 1163531501 | 0, 20) + $4 | 0; $2 = __wasm_rotl_i32((($2 + $14 | 0) + ($4 ^ $1 & ($3 ^ $4)) | 0) + -1444681467 | 0, 5) + $3 | 0; $1 = __wasm_rotl_i32((($1 + $18 | 0) + ($3 ^ $4 & ($3 ^ $2)) | 0) + -51403784 | 0, 9) + $2 | 0; $4 = __wasm_rotl_i32((($4 + $19 | 0) + (($2 ^ $1) & $3 ^ $2) | 0) + 1735328473 | 0, 14) + $1 | 0; $5 = $1 ^ $4; $3 = __wasm_rotl_i32((($3 + $12 | 0) + ($1 ^ $5 & $2) | 0) + -1926607734 | 0, 20) + $4 | 0; $2 = __wasm_rotl_i32((($2 + $6 | 0) + ($3 ^ $5) | 0) + -378558 | 0, 4) + $3 | 0; $1 = __wasm_rotl_i32((($1 + $8 | 0) + ($3 ^ $4 ^ $2) | 0) + -2022574463 | 0, 11) + $2 | 0; $4 = __wasm_rotl_i32((($4 + $21 | 0) + ($1 ^ ($3 ^ $2)) | 0) + 1839030562 | 0, 16) + $1 | 0; $3 = __wasm_rotl_i32((($3 + $23 | 0) + ($4 ^ ($1 ^ $2)) | 0) + -35309556 | 0, 23) + $4 | 0; $2 = __wasm_rotl_i32((($2 + $15 | 0) + ($3 ^ ($1 ^ $4)) | 0) + -1530992060 | 0, 4) + $3 | 0; $1 = __wasm_rotl_i32((($1 + $11 | 0) + ($2 ^ ($3 ^ $4)) | 0) + 1272893353 | 0, 11) + $2 | 0; $4 = __wasm_rotl_i32((($4 + $19 | 0) + ($1 ^ ($3 ^ $2)) | 0) + -155497632 | 0, 16) + $1 | 0; $3 = __wasm_rotl_i32((($3 + $22 | 0) + ($4 ^ ($1 ^ $2)) | 0) + -1094730640 | 0, 23) + $4 | 0; $2 = __wasm_rotl_i32((($2 + $14 | 0) + ($3 ^ ($1 ^ $4)) | 0) + 681279174 | 0, 4) + $3 | 0; $1 = __wasm_rotl_i32((($1 + $9 | 0) + ($2 ^ ($3 ^ $4)) | 0) + -358537222 | 0, 11) + $2 | 0; $4 = __wasm_rotl_i32((($4 + $17 | 0) + ($1 ^ ($3 ^ $2)) | 0) + -722521979 | 0, 16) + $1 | 0; $3 = __wasm_rotl_i32((($3 + $20 | 0) + ($4 ^ ($1 ^ $2)) | 0) + 76029189 | 0, 23) + $4 | 0; $2 = __wasm_rotl_i32((($2 + $13 | 0) + ($3 ^ ($1 ^ $4)) | 0) + -640364487 | 0, 4) + $3 | 0; $1 = __wasm_rotl_i32((($1 + $12 | 0) + ($2 ^ ($3 ^ $4)) | 0) + -421815835 | 0, 11) + $2 | 0; $5 = $2 + $9 | 0; $9 = $1 ^ $2; $2 = __wasm_rotl_i32((($4 + $24 | 0) + ($1 ^ ($3 ^ $2)) | 0) + 530742520 | 0, 16) + $1 | 0; $4 = __wasm_rotl_i32((($3 + $18 | 0) + ($9 ^ $2) | 0) + -995338651 | 0, 23) + $2 | 0; $3 = __wasm_rotl_i32(($5 + (($4 | $1 ^ -1) ^ $2) | 0) + -198630844 | 0, 6) + $4 | 0; $5 = $4 + $6 | 0; $6 = $2 + $23 | 0; $2 = __wasm_rotl_i32((($1 + $19 | 0) + ($4 ^ ($3 | $2 ^ -1)) | 0) + 1126891415 | 0, 10) + $3 | 0; $4 = __wasm_rotl_i32(($6 + ($3 ^ ($2 | $4 ^ -1)) | 0) + -1416354905 | 0, 15) + $2 | 0; $1 = __wasm_rotl_i32(($5 + (($4 | $3 ^ -1) ^ $2) | 0) + -57434055 | 0, 21) + $4 | 0; $5 = $4 + $22 | 0; $6 = $2 + $17 | 0; $2 = __wasm_rotl_i32((($3 + $12 | 0) + ($4 ^ ($1 | $2 ^ -1)) | 0) + 1700485571 | 0, 6) + $1 | 0; $4 = __wasm_rotl_i32(($6 + ($1 ^ ($2 | $4 ^ -1)) | 0) + -1894986606 | 0, 10) + $2 | 0; $3 = __wasm_rotl_i32(($5 + (($4 | $1 ^ -1) ^ $2) | 0) + -1051523 | 0, 15) + $4 | 0; $5 = $4 + $24 | 0; $8 = $2 + $8 | 0; $2 = __wasm_rotl_i32((($1 + $15 | 0) + ($4 ^ ($3 | $2 ^ -1)) | 0) + -2054922799 | 0, 21) + $3 | 0; $4 = __wasm_rotl_i32(($8 + ($3 ^ ($2 | $4 ^ -1)) | 0) + 1873313359 | 0, 6) + $2 | 0; $1 = __wasm_rotl_i32(($5 + (($4 | $3 ^ -1) ^ $2) | 0) + -30611744 | 0, 10) + $4 | 0; $3 = __wasm_rotl_i32((($3 + $20 | 0) + ($4 ^ ($1 | $2 ^ -1)) | 0) + -1560198380 | 0, 15) + $1 | 0; $2 = __wasm_rotl_i32((($2 + $14 | 0) + ($1 ^ ($3 | $4 ^ -1)) | 0) + 1309151649 | 0, 21) + $3 | 0; $4 = __wasm_rotl_i32((($4 + $11 | 0) + (($2 | $1 ^ -1) ^ $3) | 0) + -145523070 | 0, 6) + $2 | 0; HEAP32[$0 >> 2] = $4 + $25; $1 = __wasm_rotl_i32((($1 + $21 | 0) + ($2 ^ ($4 | $3 ^ -1)) | 0) + -1120210379 | 0, 10) + $4 | 0; HEAP32[$0 + 12 >> 2] = $1 + $16; $3 = __wasm_rotl_i32((($3 + $18 | 0) + ($4 ^ ($1 | $2 ^ -1)) | 0) + 718787259 | 0, 15) + $1 | 0; HEAP32[$0 + 8 >> 2] = $3 + $10; (wasm2js_i32$0 = $0, wasm2js_i32$1 = __wasm_rotl_i32((($2 + $13 | 0) + ($1 ^ ($3 | $4 ^ -1)) | 0) + -343485551 | 0, 21) + ($3 + $7 | 0) | 0), HEAP32[wasm2js_i32$0 + 4 >> 2] = wasm2js_i32$1; } function FLAC__MD5Accumulate($0, $1, $2, $3, $4) { var $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0; __wasm_i64_mul($4, 0, $2, 0); label$1 : { if (i64toi32_i32$HIGH_BITS) { break label$1 } $7 = Math_imul($2, $4); __wasm_i64_mul($3, 0, $7, 0); if (i64toi32_i32$HIGH_BITS) { break label$1 } $6 = HEAP32[$0 + 88 >> 2]; $11 = Math_imul($3, $7); label$2 : { if (HEAPU32[$0 + 92 >> 2] >= $11 >>> 0) { $5 = $6; break label$2; } $5 = dlrealloc($6, $11); label$4 : { if (!$5) { dlfree($6); $5 = dlmalloc($11); HEAP32[$0 + 88 >> 2] = $5; if ($5) { break label$4 } HEAP32[$0 + 92 >> 2] = 0; return 0; } HEAP32[$0 + 88 >> 2] = $5; } HEAP32[$0 + 92 >> 2] = $11; } label$6 : { label$7 : { label$8 : { label$9 : { label$10 : { label$11 : { label$12 : { label$13 : { label$14 : { label$15 : { label$16 : { label$17 : { $6 = Math_imul($4, 100) + $2 | 0; if (($6 | 0) <= 300) { label$19 : { switch ($6 + -101 | 0) { case 3: break label$10; case 5: break label$11; case 7: break label$12; case 2: case 4: case 6: break label$7; case 0: break label$8; case 1: break label$9; default: break label$19; }; } switch ($6 + -201 | 0) { case 0: break label$13; case 1: break label$14; case 3: break label$15; case 5: break label$16; case 7: break label$17; default: break label$7; }; } label$20 : { label$21 : { label$22 : { switch ($6 + -401 | 0) { default: switch ($6 + -301 | 0) { case 0: break label$20; case 1: break label$21; default: break label$7; }; case 7: if (!$3) { break label$6 } $13 = HEAP32[$1 + 28 >> 2]; $8 = HEAP32[$1 + 24 >> 2]; $12 = HEAP32[$1 + 20 >> 2]; $7 = HEAP32[$1 + 16 >> 2]; $10 = HEAP32[$1 + 12 >> 2]; $6 = HEAP32[$1 + 8 >> 2]; $4 = HEAP32[$1 + 4 >> 2]; $1 = HEAP32[$1 >> 2]; $2 = 0; while (1) { $9 = $2 << 2; HEAP32[$5 >> 2] = HEAP32[$9 + $1 >> 2]; HEAP32[$5 + 4 >> 2] = HEAP32[$4 + $9 >> 2]; HEAP32[$5 + 8 >> 2] = HEAP32[$6 + $9 >> 2]; HEAP32[$5 + 12 >> 2] = HEAP32[$10 + $9 >> 2]; HEAP32[$5 + 16 >> 2] = HEAP32[$7 + $9 >> 2]; HEAP32[$5 + 20 >> 2] = HEAP32[$9 + $12 >> 2]; HEAP32[$5 + 24 >> 2] = HEAP32[$8 + $9 >> 2]; HEAP32[$5 + 28 >> 2] = HEAP32[$9 + $13 >> 2]; $5 = $5 + 32 | 0; $2 = $2 + 1 | 0; if (($3 | 0) != ($2 | 0)) { continue } break; }; break label$6; case 5: if (!$3) { break label$6 } $12 = HEAP32[$1 + 20 >> 2]; $7 = HEAP32[$1 + 16 >> 2]; $10 = HEAP32[$1 + 12 >> 2]; $6 = HEAP32[$1 + 8 >> 2]; $4 = HEAP32[$1 + 4 >> 2]; $1 = HEAP32[$1 >> 2]; $2 = 0; while (1) { $8 = $2 << 2; HEAP32[$5 >> 2] = HEAP32[$8 + $1 >> 2]; HEAP32[$5 + 4 >> 2] = HEAP32[$4 + $8 >> 2]; HEAP32[$5 + 8 >> 2] = HEAP32[$6 + $8 >> 2]; HEAP32[$5 + 12 >> 2] = HEAP32[$8 + $10 >> 2]; HEAP32[$5 + 16 >> 2] = HEAP32[$7 + $8 >> 2]; HEAP32[$5 + 20 >> 2] = HEAP32[$8 + $12 >> 2]; $5 = $5 + 24 | 0; $2 = $2 + 1 | 0; if (($3 | 0) != ($2 | 0)) { continue } break; }; break label$6; case 3: if (!$3) { break label$6 } $10 = HEAP32[$1 + 12 >> 2]; $6 = HEAP32[$1 + 8 >> 2]; $4 = HEAP32[$1 + 4 >> 2]; $1 = HEAP32[$1 >> 2]; $2 = 0; while (1) { $7 = $2 << 2; HEAP32[$5 >> 2] = HEAP32[$7 + $1 >> 2]; HEAP32[$5 + 4 >> 2] = HEAP32[$4 + $7 >> 2]; HEAP32[$5 + 8 >> 2] = HEAP32[$6 + $7 >> 2]; HEAP32[$5 + 12 >> 2] = HEAP32[$7 + $10 >> 2]; $5 = $5 + 16 | 0; $2 = $2 + 1 | 0; if (($3 | 0) != ($2 | 0)) { continue } break; }; break label$6; case 1: if (!$3) { break label$6 } $6 = HEAP32[$1 + 4 >> 2]; $4 = HEAP32[$1 >> 2]; $1 = 0; while (1) { $2 = $1 << 2; HEAP32[$5 >> 2] = HEAP32[$2 + $4 >> 2]; HEAP32[$5 + 4 >> 2] = HEAP32[$2 + $6 >> 2]; $5 = $5 + 8 | 0; $1 = $1 + 1 | 0; if (($3 | 0) != ($1 | 0)) { continue } break; }; break label$6; case 0: break label$22; case 2: case 4: case 6: break label$7; }; } if (!$3) { break label$6 } $2 = HEAP32[$1 >> 2]; $1 = 0; while (1) { HEAP32[$5 >> 2] = HEAP32[$2 + ($1 << 2) >> 2]; $5 = $5 + 4 | 0; $1 = $1 + 1 | 0; if (($3 | 0) != ($1 | 0)) { continue } break; }; break label$6; } if (!$3) { break label$6 } $2 = 0; while (1) { $4 = $2 << 2; $6 = HEAP32[$4 + HEAP32[$1 >> 2] >> 2]; HEAP8[$5 | 0] = $6; HEAP8[$5 + 2 | 0] = $6 >>> 16; HEAP8[$5 + 1 | 0] = $6 >>> 8; $4 = HEAP32[$4 + HEAP32[$1 + 4 >> 2] >> 2]; HEAP8[$5 + 3 | 0] = $4; HEAP8[$5 + 5 | 0] = $4 >>> 16; HEAP8[$5 + 4 | 0] = $4 >>> 8; $5 = $5 + 6 | 0; $2 = $2 + 1 | 0; if (($3 | 0) != ($2 | 0)) { continue } break; }; break label$6; } if (!$3) { break label$6 } $2 = 0; while (1) { $4 = HEAP32[HEAP32[$1 >> 2] + ($2 << 2) >> 2]; HEAP8[$5 | 0] = $4; HEAP8[$5 + 2 | 0] = $4 >>> 16; HEAP8[$5 + 1 | 0] = $4 >>> 8; $5 = $5 + 3 | 0; $2 = $2 + 1 | 0; if (($3 | 0) != ($2 | 0)) { continue } break; }; break label$6; } if (!$3) { break label$6 } $13 = HEAP32[$1 + 28 >> 2]; $8 = HEAP32[$1 + 24 >> 2]; $12 = HEAP32[$1 + 20 >> 2]; $7 = HEAP32[$1 + 16 >> 2]; $10 = HEAP32[$1 + 12 >> 2]; $6 = HEAP32[$1 + 8 >> 2]; $4 = HEAP32[$1 + 4 >> 2]; $1 = HEAP32[$1 >> 2]; $2 = 0; while (1) { $9 = $2 << 2; HEAP16[$5 >> 1] = HEAP32[$9 + $1 >> 2]; HEAP16[$5 + 2 >> 1] = HEAP32[$4 + $9 >> 2]; HEAP16[$5 + 4 >> 1] = HEAP32[$6 + $9 >> 2]; HEAP16[$5 + 6 >> 1] = HEAP32[$10 + $9 >> 2]; HEAP16[$5 + 8 >> 1] = HEAP32[$7 + $9 >> 2]; HEAP16[$5 + 10 >> 1] = HEAP32[$9 + $12 >> 2]; HEAP16[$5 + 12 >> 1] = HEAP32[$8 + $9 >> 2]; HEAP16[$5 + 14 >> 1] = HEAP32[$9 + $13 >> 2]; $5 = $5 + 16 | 0; $2 = $2 + 1 | 0; if (($3 | 0) != ($2 | 0)) { continue } break; }; break label$6; } if (!$3) { break label$6 } $12 = HEAP32[$1 + 20 >> 2]; $7 = HEAP32[$1 + 16 >> 2]; $10 = HEAP32[$1 + 12 >> 2]; $6 = HEAP32[$1 + 8 >> 2]; $4 = HEAP32[$1 + 4 >> 2]; $1 = HEAP32[$1 >> 2]; $2 = 0; while (1) { $8 = $2 << 2; HEAP16[$5 >> 1] = HEAP32[$8 + $1 >> 2]; HEAP16[$5 + 2 >> 1] = HEAP32[$4 + $8 >> 2]; HEAP16[$5 + 4 >> 1] = HEAP32[$6 + $8 >> 2]; HEAP16[$5 + 6 >> 1] = HEAP32[$8 + $10 >> 2]; HEAP16[$5 + 8 >> 1] = HEAP32[$7 + $8 >> 2]; HEAP16[$5 + 10 >> 1] = HEAP32[$8 + $12 >> 2]; $5 = $5 + 12 | 0; $2 = $2 + 1 | 0; if (($3 | 0) != ($2 | 0)) { continue } break; }; break label$6; } if (!$3) { break label$6 } $10 = HEAP32[$1 + 12 >> 2]; $6 = HEAP32[$1 + 8 >> 2]; $4 = HEAP32[$1 + 4 >> 2]; $1 = HEAP32[$1 >> 2]; $2 = 0; while (1) { $7 = $2 << 2; HEAP16[$5 >> 1] = HEAP32[$7 + $1 >> 2]; HEAP16[$5 + 2 >> 1] = HEAP32[$4 + $7 >> 2]; HEAP16[$5 + 4 >> 1] = HEAP32[$6 + $7 >> 2]; HEAP16[$5 + 6 >> 1] = HEAP32[$7 + $10 >> 2]; $5 = $5 + 8 | 0; $2 = $2 + 1 | 0; if (($3 | 0) != ($2 | 0)) { continue } break; }; break label$6; } if (!$3) { break label$6 } $6 = HEAP32[$1 + 4 >> 2]; $4 = HEAP32[$1 >> 2]; $1 = 0; while (1) { $2 = $1 << 2; HEAP16[$5 >> 1] = HEAP32[$2 + $4 >> 2]; HEAP16[$5 + 2 >> 1] = HEAP32[$2 + $6 >> 2]; $5 = $5 + 4 | 0; $1 = $1 + 1 | 0; if (($3 | 0) != ($1 | 0)) { continue } break; }; break label$6; } if (!$3) { break label$6 } $2 = HEAP32[$1 >> 2]; $1 = 0; while (1) { HEAP16[$5 >> 1] = HEAP32[$2 + ($1 << 2) >> 2]; $5 = $5 + 2 | 0; $1 = $1 + 1 | 0; if (($3 | 0) != ($1 | 0)) { continue } break; }; break label$6; } if (!$3) { break label$6 } $4 = 0; while (1) { $2 = $4 << 2; HEAP8[$5 | 0] = HEAP32[$2 + HEAP32[$1 >> 2] >> 2]; HEAP8[$5 + 1 | 0] = HEAP32[$2 + HEAP32[$1 + 4 >> 2] >> 2]; HEAP8[$5 + 2 | 0] = HEAP32[$2 + HEAP32[$1 + 8 >> 2] >> 2]; HEAP8[$5 + 3 | 0] = HEAP32[$2 + HEAP32[$1 + 12 >> 2] >> 2]; HEAP8[$5 + 4 | 0] = HEAP32[$2 + HEAP32[$1 + 16 >> 2] >> 2]; HEAP8[$5 + 5 | 0] = HEAP32[$2 + HEAP32[$1 + 20 >> 2] >> 2]; HEAP8[$5 + 6 | 0] = HEAP32[$2 + HEAP32[$1 + 24 >> 2] >> 2]; HEAP8[$5 + 7 | 0] = HEAP32[$2 + HEAP32[$1 + 28 >> 2] >> 2]; $5 = $5 + 8 | 0; $4 = $4 + 1 | 0; if (($4 | 0) != ($3 | 0)) { continue } break; }; break label$6; } if (!$3) { break label$6 } $4 = 0; while (1) { $2 = $4 << 2; HEAP8[$5 | 0] = HEAP32[$2 + HEAP32[$1 >> 2] >> 2]; HEAP8[$5 + 1 | 0] = HEAP32[$2 + HEAP32[$1 + 4 >> 2] >> 2]; HEAP8[$5 + 2 | 0] = HEAP32[$2 + HEAP32[$1 + 8 >> 2] >> 2]; HEAP8[$5 + 3 | 0] = HEAP32[$2 + HEAP32[$1 + 12 >> 2] >> 2]; HEAP8[$5 + 4 | 0] = HEAP32[$2 + HEAP32[$1 + 16 >> 2] >> 2]; HEAP8[$5 + 5 | 0] = HEAP32[$2 + HEAP32[$1 + 20 >> 2] >> 2]; $5 = $5 + 6 | 0; $4 = $4 + 1 | 0; if (($4 | 0) != ($3 | 0)) { continue } break; }; break label$6; } if (!$3) { break label$6 } $4 = 0; while (1) { $2 = $4 << 2; HEAP8[$5 | 0] = HEAP32[$2 + HEAP32[$1 >> 2] >> 2]; HEAP8[$5 + 1 | 0] = HEAP32[$2 + HEAP32[$1 + 4 >> 2] >> 2]; HEAP8[$5 + 2 | 0] = HEAP32[$2 + HEAP32[$1 + 8 >> 2] >> 2]; HEAP8[$5 + 3 | 0] = HEAP32[$2 + HEAP32[$1 + 12 >> 2] >> 2]; $5 = $5 + 4 | 0; $4 = $4 + 1 | 0; if (($4 | 0) != ($3 | 0)) { continue } break; }; break label$6; } if (!$3) { break label$6 } $2 = 0; while (1) { $4 = $2 << 2; HEAP8[$5 | 0] = HEAP32[$4 + HEAP32[$1 >> 2] >> 2]; HEAP8[$5 + 1 | 0] = HEAP32[$4 + HEAP32[$1 + 4 >> 2] >> 2]; $5 = $5 + 2 | 0; $2 = $2 + 1 | 0; if (($3 | 0) != ($2 | 0)) { continue } break; }; break label$6; } if (!$3) { break label$6 } $2 = 0; while (1) { HEAP8[$5 | 0] = HEAP32[HEAP32[$1 >> 2] + ($2 << 2) >> 2]; $5 = $5 + 1 | 0; $2 = $2 + 1 | 0; if (($3 | 0) != ($2 | 0)) { continue } break; }; break label$6; } label$45 : { switch ($4 + -1 | 0) { case 3: if (!$2 | !$3) { break label$6 } $6 = 0; while (1) { $4 = 0; while (1) { HEAP32[$5 >> 2] = HEAP32[HEAP32[($4 << 2) + $1 >> 2] + ($6 << 2) >> 2]; $5 = $5 + 4 | 0; $4 = $4 + 1 | 0; if (($4 | 0) != ($2 | 0)) { continue } break; }; $6 = $6 + 1 | 0; if (($6 | 0) != ($3 | 0)) { continue } break; }; break label$6; case 2: if (!$2 | !$3) { break label$6 } while (1) { $4 = 0; while (1) { $6 = HEAP32[HEAP32[($4 << 2) + $1 >> 2] + ($10 << 2) >> 2]; HEAP8[$5 | 0] = $6; HEAP8[$5 + 2 | 0] = $6 >>> 16; HEAP8[$5 + 1 | 0] = $6 >>> 8; $5 = $5 + 3 | 0; $4 = $4 + 1 | 0; if (($4 | 0) != ($2 | 0)) { continue } break; }; $10 = $10 + 1 | 0; if (($10 | 0) != ($3 | 0)) { continue } break; }; break label$6; case 1: if (!$2 | !$3) { break label$6 } $6 = 0; while (1) { $4 = 0; while (1) { HEAP16[$5 >> 1] = HEAP32[HEAP32[($4 << 2) + $1 >> 2] + ($6 << 2) >> 2]; $5 = $5 + 2 | 0; $4 = $4 + 1 | 0; if (($4 | 0) != ($2 | 0)) { continue } break; }; $6 = $6 + 1 | 0; if (($6 | 0) != ($3 | 0)) { continue } break; }; break label$6; case 0: break label$45; default: break label$6; }; } if (!$2 | !$3) { break label$6 } $6 = 0; while (1) { $4 = 0; while (1) { HEAP8[$5 | 0] = HEAP32[HEAP32[($4 << 2) + $1 >> 2] + ($6 << 2) >> 2]; $5 = $5 + 1 | 0; $4 = $4 + 1 | 0; if (($4 | 0) != ($2 | 0)) { continue } break; }; $6 = $6 + 1 | 0; if (($6 | 0) != ($3 | 0)) { continue } break; }; } $2 = HEAP32[$0 + 80 >> 2]; $1 = $2 + $11 | 0; HEAP32[$0 + 80 >> 2] = $1; $3 = HEAP32[$0 + 88 >> 2]; if ($1 >>> 0 < $2 >>> 0) { $1 = $0 + 84 | 0; HEAP32[$1 >> 2] = HEAP32[$1 >> 2] + 1; } $4 = 64 - ($2 & 63) | 0; $1 = ($0 - $4 | 0) - -64 | 0; label$58 : { if ($11 >>> 0 < $4 >>> 0) { memcpy($1, $3, $11); break label$58; } memcpy($1, $3, $4); $2 = $0 - -64 | 0; FLAC__MD5Transform($2, $0); $5 = $3 + $4 | 0; $1 = $11 - $4 | 0; if ($1 >>> 0 >= 64) { while (1) { $4 = HEAPU8[$5 + 4 | 0] | HEAPU8[$5 + 5 | 0] << 8 | (HEAPU8[$5 + 6 | 0] << 16 | HEAPU8[$5 + 7 | 0] << 24); $3 = HEAPU8[$5 | 0] | HEAPU8[$5 + 1 | 0] << 8 | (HEAPU8[$5 + 2 | 0] << 16 | HEAPU8[$5 + 3 | 0] << 24); HEAP8[$0 | 0] = $3; HEAP8[$0 + 1 | 0] = $3 >>> 8; HEAP8[$0 + 2 | 0] = $3 >>> 16; HEAP8[$0 + 3 | 0] = $3 >>> 24; HEAP8[$0 + 4 | 0] = $4; HEAP8[$0 + 5 | 0] = $4 >>> 8; HEAP8[$0 + 6 | 0] = $4 >>> 16; HEAP8[$0 + 7 | 0] = $4 >>> 24; $4 = HEAPU8[$5 + 60 | 0] | HEAPU8[$5 + 61 | 0] << 8 | (HEAPU8[$5 + 62 | 0] << 16 | HEAPU8[$5 + 63 | 0] << 24); $3 = HEAPU8[$5 + 56 | 0] | HEAPU8[$5 + 57 | 0] << 8 | (HEAPU8[$5 + 58 | 0] << 16 | HEAPU8[$5 + 59 | 0] << 24); HEAP8[$0 + 56 | 0] = $3; HEAP8[$0 + 57 | 0] = $3 >>> 8; HEAP8[$0 + 58 | 0] = $3 >>> 16; HEAP8[$0 + 59 | 0] = $3 >>> 24; HEAP8[$0 + 60 | 0] = $4; HEAP8[$0 + 61 | 0] = $4 >>> 8; HEAP8[$0 + 62 | 0] = $4 >>> 16; HEAP8[$0 + 63 | 0] = $4 >>> 24; $4 = HEAPU8[$5 + 52 | 0] | HEAPU8[$5 + 53 | 0] << 8 | (HEAPU8[$5 + 54 | 0] << 16 | HEAPU8[$5 + 55 | 0] << 24); $3 = HEAPU8[$5 + 48 | 0] | HEAPU8[$5 + 49 | 0] << 8 | (HEAPU8[$5 + 50 | 0] << 16 | HEAPU8[$5 + 51 | 0] << 24); HEAP8[$0 + 48 | 0] = $3; HEAP8[$0 + 49 | 0] = $3 >>> 8; HEAP8[$0 + 50 | 0] = $3 >>> 16; HEAP8[$0 + 51 | 0] = $3 >>> 24; HEAP8[$0 + 52 | 0] = $4; HEAP8[$0 + 53 | 0] = $4 >>> 8; HEAP8[$0 + 54 | 0] = $4 >>> 16; HEAP8[$0 + 55 | 0] = $4 >>> 24; $4 = HEAPU8[$5 + 44 | 0] | HEAPU8[$5 + 45 | 0] << 8 | (HEAPU8[$5 + 46 | 0] << 16 | HEAPU8[$5 + 47 | 0] << 24); $3 = HEAPU8[$5 + 40 | 0] | HEAPU8[$5 + 41 | 0] << 8 | (HEAPU8[$5 + 42 | 0] << 16 | HEAPU8[$5 + 43 | 0] << 24); HEAP8[$0 + 40 | 0] = $3; HEAP8[$0 + 41 | 0] = $3 >>> 8; HEAP8[$0 + 42 | 0] = $3 >>> 16; HEAP8[$0 + 43 | 0] = $3 >>> 24; HEAP8[$0 + 44 | 0] = $4; HEAP8[$0 + 45 | 0] = $4 >>> 8; HEAP8[$0 + 46 | 0] = $4 >>> 16; HEAP8[$0 + 47 | 0] = $4 >>> 24; $4 = HEAPU8[$5 + 36 | 0] | HEAPU8[$5 + 37 | 0] << 8 | (HEAPU8[$5 + 38 | 0] << 16 | HEAPU8[$5 + 39 | 0] << 24); $3 = HEAPU8[$5 + 32 | 0] | HEAPU8[$5 + 33 | 0] << 8 | (HEAPU8[$5 + 34 | 0] << 16 | HEAPU8[$5 + 35 | 0] << 24); HEAP8[$0 + 32 | 0] = $3; HEAP8[$0 + 33 | 0] = $3 >>> 8; HEAP8[$0 + 34 | 0] = $3 >>> 16; HEAP8[$0 + 35 | 0] = $3 >>> 24; HEAP8[$0 + 36 | 0] = $4; HEAP8[$0 + 37 | 0] = $4 >>> 8; HEAP8[$0 + 38 | 0] = $4 >>> 16; HEAP8[$0 + 39 | 0] = $4 >>> 24; $4 = HEAPU8[$5 + 28 | 0] | HEAPU8[$5 + 29 | 0] << 8 | (HEAPU8[$5 + 30 | 0] << 16 | HEAPU8[$5 + 31 | 0] << 24); $3 = HEAPU8[$5 + 24 | 0] | HEAPU8[$5 + 25 | 0] << 8 | (HEAPU8[$5 + 26 | 0] << 16 | HEAPU8[$5 + 27 | 0] << 24); HEAP8[$0 + 24 | 0] = $3; HEAP8[$0 + 25 | 0] = $3 >>> 8; HEAP8[$0 + 26 | 0] = $3 >>> 16; HEAP8[$0 + 27 | 0] = $3 >>> 24; HEAP8[$0 + 28 | 0] = $4; HEAP8[$0 + 29 | 0] = $4 >>> 8; HEAP8[$0 + 30 | 0] = $4 >>> 16; HEAP8[$0 + 31 | 0] = $4 >>> 24; $4 = HEAPU8[$5 + 20 | 0] | HEAPU8[$5 + 21 | 0] << 8 | (HEAPU8[$5 + 22 | 0] << 16 | HEAPU8[$5 + 23 | 0] << 24); $3 = HEAPU8[$5 + 16 | 0] | HEAPU8[$5 + 17 | 0] << 8 | (HEAPU8[$5 + 18 | 0] << 16 | HEAPU8[$5 + 19 | 0] << 24); HEAP8[$0 + 16 | 0] = $3; HEAP8[$0 + 17 | 0] = $3 >>> 8; HEAP8[$0 + 18 | 0] = $3 >>> 16; HEAP8[$0 + 19 | 0] = $3 >>> 24; HEAP8[$0 + 20 | 0] = $4; HEAP8[$0 + 21 | 0] = $4 >>> 8; HEAP8[$0 + 22 | 0] = $4 >>> 16; HEAP8[$0 + 23 | 0] = $4 >>> 24; $4 = HEAPU8[$5 + 12 | 0] | HEAPU8[$5 + 13 | 0] << 8 | (HEAPU8[$5 + 14 | 0] << 16 | HEAPU8[$5 + 15 | 0] << 24); $3 = HEAPU8[$5 + 8 | 0] | HEAPU8[$5 + 9 | 0] << 8 | (HEAPU8[$5 + 10 | 0] << 16 | HEAPU8[$5 + 11 | 0] << 24); HEAP8[$0 + 8 | 0] = $3; HEAP8[$0 + 9 | 0] = $3 >>> 8; HEAP8[$0 + 10 | 0] = $3 >>> 16; HEAP8[$0 + 11 | 0] = $3 >>> 24; HEAP8[$0 + 12 | 0] = $4; HEAP8[$0 + 13 | 0] = $4 >>> 8; HEAP8[$0 + 14 | 0] = $4 >>> 16; HEAP8[$0 + 15 | 0] = $4 >>> 24; FLAC__MD5Transform($2, $0); $5 = $5 - -64 | 0; $1 = $1 + -64 | 0; if ($1 >>> 0 > 63) { continue } break; } } memcpy($0, $5, $1); } $5 = 1; } return $5; } function __stdio_close($0) { $0 = $0 | 0; return __wasi_fd_close(HEAP32[$0 + 60 >> 2]) | 0; } function __wasi_syscall_ret($0) { if (!$0) { return 0 } HEAP32[2896] = $0; return -1; } function __stdio_read($0, $1, $2) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; var $3 = 0, $4 = 0, $5 = 0, $6 = 0; $3 = global$0 - 32 | 0; global$0 = $3; HEAP32[$3 + 16 >> 2] = $1; $4 = HEAP32[$0 + 48 >> 2]; HEAP32[$3 + 20 >> 2] = $2 - (($4 | 0) != 0); $5 = HEAP32[$0 + 44 >> 2]; HEAP32[$3 + 28 >> 2] = $4; HEAP32[$3 + 24 >> 2] = $5; label$1 : { label$2 : { label$3 : { if (__wasi_syscall_ret(__wasi_fd_read(HEAP32[$0 + 60 >> 2], $3 + 16 | 0, 2, $3 + 12 | 0) | 0)) { HEAP32[$3 + 12 >> 2] = -1; $2 = -1; break label$3; } $4 = HEAP32[$3 + 12 >> 2]; if (($4 | 0) > 0) { break label$2 } $2 = $4; } HEAP32[$0 >> 2] = HEAP32[$0 >> 2] | $2 & 48 ^ 16; break label$1; } $6 = HEAP32[$3 + 20 >> 2]; if ($4 >>> 0 <= $6 >>> 0) { $2 = $4; break label$1; } $5 = HEAP32[$0 + 44 >> 2]; HEAP32[$0 + 4 >> 2] = $5; HEAP32[$0 + 8 >> 2] = $5 + ($4 - $6 | 0); if (!HEAP32[$0 + 48 >> 2]) { break label$1 } HEAP32[$0 + 4 >> 2] = $5 + 1; HEAP8[($1 + $2 | 0) + -1 | 0] = HEAPU8[$5 | 0]; } global$0 = $3 + 32 | 0; return $2 | 0; } function __stdio_seek($0, $1, $2, $3) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; var $4 = 0; $4 = global$0 - 16 | 0; global$0 = $4; label$1 : { if (!__wasi_syscall_ret(legalimport$__wasi_fd_seek(HEAP32[$0 + 60 >> 2], $1 | 0, $2 | 0, $3 & 255, $4 + 8 | 0) | 0)) { $1 = HEAP32[$4 + 12 >> 2]; $0 = HEAP32[$4 + 8 >> 2]; break label$1; } HEAP32[$4 + 8 >> 2] = -1; HEAP32[$4 + 12 >> 2] = -1; $1 = -1; $0 = -1; } global$0 = $4 + 16 | 0; i64toi32_i32$HIGH_BITS = $1; return $0 | 0; } function fflush($0) { var $1 = 0; if ($0) { if (HEAP32[$0 + 76 >> 2] <= -1) { return __fflush_unlocked($0) } return __fflush_unlocked($0); } if (HEAP32[2794]) { $1 = fflush(HEAP32[2794]) } $0 = HEAP32[3023]; if ($0) { while (1) { if (HEAPU32[$0 + 20 >> 2] > HEAPU32[$0 + 28 >> 2]) { $1 = __fflush_unlocked($0) | $1 } $0 = HEAP32[$0 + 56 >> 2]; if ($0) { continue } break; } } return $1; } function __fflush_unlocked($0) { var $1 = 0, $2 = 0; label$1 : { if (HEAPU32[$0 + 20 >> 2] <= HEAPU32[$0 + 28 >> 2]) { break label$1 } FUNCTION_TABLE[HEAP32[$0 + 36 >> 2]]($0, 0, 0) | 0; if (HEAP32[$0 + 20 >> 2]) { break label$1 } return -1; } $1 = HEAP32[$0 + 4 >> 2]; $2 = HEAP32[$0 + 8 >> 2]; if ($1 >>> 0 < $2 >>> 0) { $1 = $1 - $2 | 0; FUNCTION_TABLE[HEAP32[$0 + 40 >> 2]]($0, $1, $1 >> 31, 1) | 0; } HEAP32[$0 + 28 >> 2] = 0; HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 + 20 >> 2] = 0; HEAP32[$0 + 4 >> 2] = 0; HEAP32[$0 + 8 >> 2] = 0; return 0; } function fclose($0) { var $1 = 0, $2 = 0, $3 = 0, $4 = 0; $4 = HEAP32[$0 + 76 >> 2] >= 0 ? 1 : 0; $3 = HEAP32[$0 >> 2] & 1; if (!$3) { $1 = HEAP32[$0 + 52 >> 2]; if ($1) { HEAP32[$1 + 56 >> 2] = HEAP32[$0 + 56 >> 2] } $2 = HEAP32[$0 + 56 >> 2]; if ($2) { HEAP32[$2 + 52 >> 2] = $1 } if (HEAP32[3023] == ($0 | 0)) { HEAP32[3023] = $2 } } fflush($0); FUNCTION_TABLE[HEAP32[$0 + 12 >> 2]]($0) | 0; $1 = HEAP32[$0 + 96 >> 2]; if ($1) { dlfree($1) } label$7 : { if (!$3) { dlfree($0); break label$7; } if (!$4) { break label$7 } } } function memcmp($0, $1, $2) { var $3 = 0, $4 = 0, $5 = 0; label$1 : { if (!$2) { break label$1 } while (1) { $3 = HEAPU8[$0 | 0]; $4 = HEAPU8[$1 | 0]; if (($3 | 0) == ($4 | 0)) { $1 = $1 + 1 | 0; $0 = $0 + 1 | 0; $2 = $2 + -1 | 0; if ($2) { continue } break label$1; } break; }; $5 = $3 - $4 | 0; } return $5; } function FLAC__cpu_info($0) { HEAP32[$0 + 8 >> 2] = 0; HEAP32[$0 + 12 >> 2] = 0; HEAP32[$0 >> 2] = 0; HEAP32[$0 + 4 >> 2] = 3; HEAP32[$0 + 56 >> 2] = 0; HEAP32[$0 + 60 >> 2] = 0; HEAP32[$0 + 48 >> 2] = 0; HEAP32[$0 + 52 >> 2] = 0; HEAP32[$0 + 40 >> 2] = 0; HEAP32[$0 + 44 >> 2] = 0; HEAP32[$0 + 32 >> 2] = 0; HEAP32[$0 + 36 >> 2] = 0; HEAP32[$0 + 24 >> 2] = 0; HEAP32[$0 + 28 >> 2] = 0; HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 + 20 >> 2] = 0; } function lround($0) { $0 = +round(+$0); if (Math_abs($0) < 2147483648.0) { return ~~$0 } return -2147483648; } function log($0) { var $1 = 0, $2 = 0.0, $3 = 0, $4 = 0.0, $5 = 0, $6 = 0, $7 = 0.0, $8 = 0.0, $9 = 0.0, $10 = 0.0; label$1 : { label$2 : { label$3 : { label$4 : { wasm2js_scratch_store_f64(+$0); $1 = wasm2js_scratch_load_i32(1) | 0; $3 = wasm2js_scratch_load_i32(0) | 0; if (($1 | 0) > 0 ? 1 : ($1 | 0) >= 0 ? ($3 >>> 0 < 0 ? 0 : 1) : 0) { $5 = $1; if ($1 >>> 0 > 1048575) { break label$4 } } if (!($1 & 2147483647 | $3)) { return -1.0 / ($0 * $0) } if (($1 | 0) > -1 ? 1 : 0) { break label$3 } return ($0 - $0) / 0.0; } if ($5 >>> 0 > 2146435071) { break label$1 } $1 = 1072693248; $6 = -1023; if (($5 | 0) != 1072693248) { $1 = $5; break label$2; } if ($3) { break label$2 } return 0.0; } wasm2js_scratch_store_f64(+($0 * 18014398509481984.0)); $1 = wasm2js_scratch_load_i32(1) | 0; $3 = wasm2js_scratch_load_i32(0) | 0; $6 = -1077; } $1 = $1 + 614242 | 0; $4 = +(($1 >>> 20 | 0) + $6 | 0); wasm2js_scratch_store_i32(0, $3 | 0); wasm2js_scratch_store_i32(1, ($1 & 1048575) + 1072079006 | 0); $0 = +wasm2js_scratch_load_f64() + -1.0; $2 = $0 / ($0 + 2.0); $7 = $4 * .6931471803691238; $8 = $0; $9 = $4 * 1.9082149292705877e-10; $10 = $2; $4 = $0 * ($0 * .5); $2 = $2 * $2; $0 = $2 * $2; $0 = $7 + ($8 + ($9 + $10 * ($4 + ($0 * ($0 * ($0 * .15313837699209373 + .22222198432149784) + .3999999999940942) + $2 * ($0 * ($0 * ($0 * .14798198605116586 + .1818357216161805) + .2857142874366239) + .6666666666666735))) - $4)); } return $0; } function FLAC__lpc_window_data($0, $1, $2, $3) { var $4 = 0, $5 = 0; if ($3) { while (1) { $5 = $4 << 2; HEAPF32[$5 + $2 >> 2] = HEAPF32[$1 + $5 >> 2] * Math_fround(HEAP32[$0 + $5 >> 2]); $4 = $4 + 1 | 0; if (($4 | 0) != ($3 | 0)) { continue } break; } } } function FLAC__lpc_compute_autocorrelation($0, $1, $2, $3) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; var $4 = 0, $5 = 0, $6 = 0, $7 = Math_fround(0), $8 = 0, $9 = 0; $6 = $1 - $2 | 0; label$1 : { if (!$2) { while (1) { $4 = $4 + 1 | 0; if ($4 >>> 0 <= $6 >>> 0) { continue } break; }; break label$1; } $9 = memset($3, $2 << 2); while (1) { $7 = HEAPF32[($4 << 2) + $0 >> 2]; $5 = 0; while (1) { $8 = ($5 << 2) + $9 | 0; HEAPF32[$8 >> 2] = HEAPF32[$8 >> 2] + Math_fround($7 * HEAPF32[($4 + $5 << 2) + $0 >> 2]); $5 = $5 + 1 | 0; if (($5 | 0) != ($2 | 0)) { continue } break; }; $4 = $4 + 1 | 0; if ($4 >>> 0 <= $6 >>> 0) { continue } break; }; } if ($4 >>> 0 < $1 >>> 0) { while (1) { $2 = $1 - $4 | 0; if ($2) { $7 = HEAPF32[($4 << 2) + $0 >> 2]; $5 = 0; while (1) { $6 = ($5 << 2) + $3 | 0; HEAPF32[$6 >> 2] = HEAPF32[$6 >> 2] + Math_fround($7 * HEAPF32[($4 + $5 << 2) + $0 >> 2]); $5 = $5 + 1 | 0; if ($5 >>> 0 < $2 >>> 0) { continue } break; }; } $4 = $4 + 1 | 0; if (($4 | 0) != ($1 | 0)) { continue } break; } } } function FLAC__lpc_compute_lp_coefficients($0, $1, $2, $3) { var $4 = 0, $5 = 0, $6 = 0.0, $7 = 0, $8 = 0, $9 = 0.0, $10 = 0.0, $11 = 0, $12 = 0, $13 = 0, $14 = 0; $7 = global$0 - 256 | 0; global$0 = $7; $13 = HEAP32[$1 >> 2]; $10 = +HEAPF32[$0 >> 2]; label$1 : { while (1) { if (($5 | 0) == ($13 | 0)) { break label$1 } $11 = $5 + 1 | 0; $6 = +Math_fround(-HEAPF32[($11 << 2) + $0 >> 2]); label$3 : { if ($5) { $12 = $5 >>> 1 | 0; $4 = 0; while (1) { $6 = $6 - HEAPF64[($4 << 3) + $7 >> 3] * +HEAPF32[($5 - $4 << 2) + $0 >> 2]; $4 = $4 + 1 | 0; if (($5 | 0) != ($4 | 0)) { continue } break; }; $6 = $6 / $10; HEAPF64[($5 << 3) + $7 >> 3] = $6; $4 = 0; if ($12) { while (1) { $8 = ($4 << 3) + $7 | 0; $9 = HEAPF64[$8 >> 3]; $14 = $8; $8 = (($4 ^ -1) + $5 << 3) + $7 | 0; HEAPF64[$14 >> 3] = $9 + $6 * HEAPF64[$8 >> 3]; HEAPF64[$8 >> 3] = $6 * $9 + HEAPF64[$8 >> 3]; $4 = $4 + 1 | 0; if (($12 | 0) != ($4 | 0)) { continue } break; } } if (!($5 & 1)) { break label$3 } $8 = ($12 << 3) + $7 | 0; $9 = HEAPF64[$8 >> 3]; HEAPF64[$8 >> 3] = $9 + $6 * $9; break label$3; } $6 = $6 / $10; HEAPF64[($5 << 3) + $7 >> 3] = $6; } $9 = 1.0 - $6 * $6; $4 = 0; while (1) { HEAPF32[(($5 << 7) + $2 | 0) + ($4 << 2) >> 2] = -Math_fround(HEAPF64[($4 << 3) + $7 >> 3]); $4 = $4 + 1 | 0; if ($4 >>> 0 <= $5 >>> 0) { continue } break; }; $10 = $10 * $9; HEAPF64[($5 << 3) + $3 >> 3] = $10; $5 = $11; if ($10 != 0.0) { continue } break; }; HEAP32[$1 >> 2] = $11; } global$0 = $7 + 256 | 0; } function FLAC__lpc_quantize_coefficients($0, $1, $2, $3, $4) { var $5 = 0, $6 = 0.0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0.0, $12 = 0, $13 = 0, $14 = Math_fround(0); $8 = global$0 - 16 | 0; global$0 = $8; label$1 : { if (!$1) { $7 = 2; break label$1; } $5 = $2 + -1 | 0; $2 = 0; while (1) { $11 = +Math_fround(Math_abs(HEAPF32[($2 << 2) + $0 >> 2])); $6 = $6 < $11 ? $11 : $6; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; $7 = 2; if ($6 <= 0.0) { break label$1 } $9 = 1 << $5; $12 = $9 + -1 | 0; $10 = 0 - $9 | 0; frexp($6, $8 + 12 | 0); $2 = HEAP32[$8 + 12 >> 2]; HEAP32[$8 + 12 >> 2] = $2 + -1; $5 = $5 - $2 | 0; HEAP32[$4 >> 2] = $5; label$4 : { $7 = -1 << HEAP32[1413] + -1; $2 = $7 ^ -1; if (($5 | 0) > ($2 | 0)) { HEAP32[$4 >> 2] = $2; $5 = $2; break label$4; } if (($5 | 0) >= ($7 | 0)) { break label$4 } $7 = 1; break label$1; } $7 = 0; if (($5 | 0) >= 0) { if (!$1) { break label$1 } $6 = 0.0; $2 = 0; while (1) { $13 = $2 << 2; $6 = $6 + +Math_fround(HEAPF32[$13 + $0 >> 2] * Math_fround(1 << $5)); $5 = lround($6); $5 = ($5 | 0) < ($9 | 0) ? (($5 | 0) < ($10 | 0) ? $10 : $5) : $12; HEAP32[$3 + $13 >> 2] = $5; $2 = $2 + 1 | 0; if (($2 | 0) == ($1 | 0)) { break label$1 } $6 = $6 - +($5 | 0); $5 = HEAP32[$4 >> 2]; continue; }; } if ($1) { $2 = 0; $14 = Math_fround(1 << 0 - $5); $6 = 0.0; while (1) { $7 = $2 << 2; $6 = $6 + +Math_fround(HEAPF32[$7 + $0 >> 2] / $14); $5 = lround($6); $5 = ($5 | 0) < ($9 | 0) ? (($5 | 0) < ($10 | 0) ? $10 : $5) : $12; HEAP32[$3 + $7 >> 2] = $5; $6 = $6 - +($5 | 0); $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; } $7 = 0; HEAP32[$4 >> 2] = 0; } global$0 = $8 + 16 | 0; return $7; } function FLAC__lpc_compute_residual_from_qlp_coefficients($0, $1, $2, $3, $4, $5) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; $4 = $4 | 0; $5 = $5 | 0; var $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0, $22 = 0, $23 = 0, $24 = 0, $25 = 0, $26 = 0, $27 = 0, $28 = 0, $29 = 0, $30 = 0; label$1 : { if ($3 >>> 0 >= 13) { if (($1 | 0) < 1) { break label$1 } $25 = $3 + -13 | 0; while (1) { $17 = 0; $20 = 0; $19 = 0; $22 = 0; $21 = 0; $24 = 0; $23 = 0; $26 = 0; $18 = 0; $16 = 0; $15 = 0; $14 = 0; $13 = 0; $12 = 0; $11 = 0; $10 = 0; $9 = 0; $8 = 0; $7 = 0; $3 = 0; label$4 : { switch ($25 | 0) { case 19: $17 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -128 >> 2], HEAP32[$2 + 124 >> 2]); case 18: $20 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -124 >> 2], HEAP32[$2 + 120 >> 2]) + $17 | 0; case 17: $19 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -120 >> 2], HEAP32[$2 + 116 >> 2]) + $20 | 0; case 16: $22 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -116 >> 2], HEAP32[$2 + 112 >> 2]) + $19 | 0; case 15: $21 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -112 >> 2], HEAP32[$2 + 108 >> 2]) + $22 | 0; case 14: $24 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -108 >> 2], HEAP32[$2 + 104 >> 2]) + $21 | 0; case 13: $23 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -104 >> 2], HEAP32[$2 + 100 >> 2]) + $24 | 0; case 12: $26 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -100 >> 2], HEAP32[$2 + 96 >> 2]) + $23 | 0; case 11: $18 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -96 >> 2], HEAP32[$2 + 92 >> 2]) + $26 | 0; case 10: $16 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -92 >> 2], HEAP32[$2 + 88 >> 2]) + $18 | 0; case 9: $15 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -88 >> 2], HEAP32[$2 + 84 >> 2]) + $16 | 0; case 8: $14 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -84 >> 2], HEAP32[$2 + 80 >> 2]) + $15 | 0; case 7: $13 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -80 >> 2], HEAP32[$2 + 76 >> 2]) + $14 | 0; case 6: $12 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -76 >> 2], HEAP32[$2 + 72 >> 2]) + $13 | 0; case 5: $11 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -72 >> 2], HEAP32[$2 + 68 >> 2]) + $12 | 0; case 4: $10 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -68 >> 2], HEAP32[$2 + 64 >> 2]) + $11 | 0; case 3: $9 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -64 >> 2], HEAP32[$2 + 60 >> 2]) + $10 | 0; case 2: $8 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -60 >> 2], HEAP32[$2 + 56 >> 2]) + $9 | 0; case 1: $7 = Math_imul(HEAP32[(($6 << 2) + $0 | 0) + -56 >> 2], HEAP32[$2 + 52 >> 2]) + $8 | 0; case 0: $3 = ($6 << 2) + $0 | 0; $3 = ((((((((((((Math_imul(HEAP32[$3 + -52 >> 2], HEAP32[$2 + 48 >> 2]) + $7 | 0) + Math_imul(HEAP32[$3 + -48 >> 2], HEAP32[$2 + 44 >> 2]) | 0) + Math_imul(HEAP32[$3 + -44 >> 2], HEAP32[$2 + 40 >> 2]) | 0) + Math_imul(HEAP32[$3 + -40 >> 2], HEAP32[$2 + 36 >> 2]) | 0) + Math_imul(HEAP32[$3 + -36 >> 2], HEAP32[$2 + 32 >> 2]) | 0) + Math_imul(HEAP32[$3 + -32 >> 2], HEAP32[$2 + 28 >> 2]) | 0) + Math_imul(HEAP32[$3 + -28 >> 2], HEAP32[$2 + 24 >> 2]) | 0) + Math_imul(HEAP32[$3 + -24 >> 2], HEAP32[$2 + 20 >> 2]) | 0) + Math_imul(HEAP32[$3 + -20 >> 2], HEAP32[$2 + 16 >> 2]) | 0) + Math_imul(HEAP32[$3 + -16 >> 2], HEAP32[$2 + 12 >> 2]) | 0) + Math_imul(HEAP32[$3 + -12 >> 2], HEAP32[$2 + 8 >> 2]) | 0) + Math_imul(HEAP32[$3 + -8 >> 2], HEAP32[$2 + 4 >> 2]) | 0) + Math_imul(HEAP32[$3 + -4 >> 2], HEAP32[$2 >> 2]) | 0; break; default: break label$4; }; } $7 = $6 << 2; HEAP32[$7 + $5 >> 2] = HEAP32[$0 + $7 >> 2] - ($3 >> $4); $6 = $6 + 1 | 0; if (($6 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if ($3 >>> 0 >= 9) { if ($3 >>> 0 >= 11) { if (($3 | 0) != 12) { if (($1 | 0) < 1) { break label$1 } $15 = HEAP32[$0 + -4 >> 2]; $6 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $7 = HEAP32[$0 + -16 >> 2]; $8 = HEAP32[$0 + -20 >> 2]; $9 = HEAP32[$0 + -24 >> 2]; $10 = HEAP32[$0 + -28 >> 2]; $11 = HEAP32[$0 + -32 >> 2]; $12 = HEAP32[$0 + -36 >> 2]; $13 = HEAP32[$0 + -40 >> 2]; $16 = HEAP32[$0 + -44 >> 2]; $18 = HEAP32[$2 >> 2]; $17 = HEAP32[$2 + 4 >> 2]; $20 = HEAP32[$2 + 8 >> 2]; $19 = HEAP32[$2 + 12 >> 2]; $22 = HEAP32[$2 + 16 >> 2]; $21 = HEAP32[$2 + 20 >> 2]; $24 = HEAP32[$2 + 24 >> 2]; $23 = HEAP32[$2 + 28 >> 2]; $26 = HEAP32[$2 + 32 >> 2]; $25 = HEAP32[$2 + 36 >> 2]; $28 = HEAP32[$2 + 40 >> 2]; $2 = 0; while (1) { $14 = $13; $13 = $12; $12 = $11; $11 = $10; $10 = $9; $9 = $8; $8 = $7; $7 = $3; $3 = $6; $6 = $15; $27 = $2 << 2; $15 = HEAP32[$27 + $0 >> 2]; HEAP32[$5 + $27 >> 2] = $15 - ((((((((((Math_imul($14, $25) + Math_imul($16, $28) | 0) + Math_imul($13, $26) | 0) + Math_imul($12, $23) | 0) + Math_imul($11, $24) | 0) + Math_imul($10, $21) | 0) + Math_imul($9, $22) | 0) + Math_imul($8, $19) | 0) + Math_imul($7, $20) | 0) + Math_imul($3, $17) | 0) + Math_imul($6, $18) >> $4); $16 = $14; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $16 = HEAP32[$0 + -4 >> 2]; $6 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $7 = HEAP32[$0 + -16 >> 2]; $8 = HEAP32[$0 + -20 >> 2]; $9 = HEAP32[$0 + -24 >> 2]; $10 = HEAP32[$0 + -28 >> 2]; $11 = HEAP32[$0 + -32 >> 2]; $12 = HEAP32[$0 + -36 >> 2]; $13 = HEAP32[$0 + -40 >> 2]; $14 = HEAP32[$0 + -44 >> 2]; $18 = HEAP32[$0 + -48 >> 2]; $17 = HEAP32[$2 >> 2]; $20 = HEAP32[$2 + 4 >> 2]; $19 = HEAP32[$2 + 8 >> 2]; $22 = HEAP32[$2 + 12 >> 2]; $21 = HEAP32[$2 + 16 >> 2]; $24 = HEAP32[$2 + 20 >> 2]; $23 = HEAP32[$2 + 24 >> 2]; $26 = HEAP32[$2 + 28 >> 2]; $25 = HEAP32[$2 + 32 >> 2]; $28 = HEAP32[$2 + 36 >> 2]; $27 = HEAP32[$2 + 40 >> 2]; $30 = HEAP32[$2 + 44 >> 2]; $2 = 0; while (1) { $15 = $14; $14 = $13; $13 = $12; $12 = $11; $11 = $10; $10 = $9; $9 = $8; $8 = $7; $7 = $3; $3 = $6; $6 = $16; $29 = $2 << 2; $16 = HEAP32[$29 + $0 >> 2]; HEAP32[$5 + $29 >> 2] = $16 - (((((((((((Math_imul($15, $27) + Math_imul($18, $30) | 0) + Math_imul($14, $28) | 0) + Math_imul($13, $25) | 0) + Math_imul($12, $26) | 0) + Math_imul($11, $23) | 0) + Math_imul($10, $24) | 0) + Math_imul($9, $21) | 0) + Math_imul($8, $22) | 0) + Math_imul($7, $19) | 0) + Math_imul($3, $20) | 0) + Math_imul($6, $17) >> $4); $18 = $15; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($3 | 0) != 10) { if (($1 | 0) < 1) { break label$1 } $13 = HEAP32[$0 + -4 >> 2]; $6 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $7 = HEAP32[$0 + -16 >> 2]; $8 = HEAP32[$0 + -20 >> 2]; $9 = HEAP32[$0 + -24 >> 2]; $10 = HEAP32[$0 + -28 >> 2]; $11 = HEAP32[$0 + -32 >> 2]; $14 = HEAP32[$0 + -36 >> 2]; $16 = HEAP32[$2 >> 2]; $15 = HEAP32[$2 + 4 >> 2]; $18 = HEAP32[$2 + 8 >> 2]; $17 = HEAP32[$2 + 12 >> 2]; $20 = HEAP32[$2 + 16 >> 2]; $19 = HEAP32[$2 + 20 >> 2]; $22 = HEAP32[$2 + 24 >> 2]; $21 = HEAP32[$2 + 28 >> 2]; $24 = HEAP32[$2 + 32 >> 2]; $2 = 0; while (1) { $12 = $11; $11 = $10; $10 = $9; $9 = $8; $8 = $7; $7 = $3; $3 = $6; $6 = $13; $23 = $2 << 2; $13 = HEAP32[$23 + $0 >> 2]; HEAP32[$5 + $23 >> 2] = $13 - ((((((((Math_imul($12, $21) + Math_imul($14, $24) | 0) + Math_imul($11, $22) | 0) + Math_imul($10, $19) | 0) + Math_imul($9, $20) | 0) + Math_imul($8, $17) | 0) + Math_imul($7, $18) | 0) + Math_imul($3, $15) | 0) + Math_imul($6, $16) >> $4); $14 = $12; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $14 = HEAP32[$0 + -4 >> 2]; $6 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $7 = HEAP32[$0 + -16 >> 2]; $8 = HEAP32[$0 + -20 >> 2]; $9 = HEAP32[$0 + -24 >> 2]; $10 = HEAP32[$0 + -28 >> 2]; $11 = HEAP32[$0 + -32 >> 2]; $12 = HEAP32[$0 + -36 >> 2]; $15 = HEAP32[$0 + -40 >> 2]; $16 = HEAP32[$2 >> 2]; $18 = HEAP32[$2 + 4 >> 2]; $17 = HEAP32[$2 + 8 >> 2]; $20 = HEAP32[$2 + 12 >> 2]; $19 = HEAP32[$2 + 16 >> 2]; $22 = HEAP32[$2 + 20 >> 2]; $21 = HEAP32[$2 + 24 >> 2]; $24 = HEAP32[$2 + 28 >> 2]; $23 = HEAP32[$2 + 32 >> 2]; $26 = HEAP32[$2 + 36 >> 2]; $2 = 0; while (1) { $13 = $12; $12 = $11; $11 = $10; $10 = $9; $9 = $8; $8 = $7; $7 = $3; $3 = $6; $6 = $14; $25 = $2 << 2; $14 = HEAP32[$25 + $0 >> 2]; HEAP32[$5 + $25 >> 2] = $14 - (((((((((Math_imul($13, $23) + Math_imul($15, $26) | 0) + Math_imul($12, $24) | 0) + Math_imul($11, $21) | 0) + Math_imul($10, $22) | 0) + Math_imul($9, $19) | 0) + Math_imul($8, $20) | 0) + Math_imul($7, $17) | 0) + Math_imul($3, $18) | 0) + Math_imul($6, $16) >> $4); $15 = $13; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if ($3 >>> 0 >= 5) { if ($3 >>> 0 >= 7) { if (($3 | 0) != 8) { if (($1 | 0) < 1) { break label$1 } $11 = HEAP32[$0 + -4 >> 2]; $6 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $7 = HEAP32[$0 + -16 >> 2]; $8 = HEAP32[$0 + -20 >> 2]; $9 = HEAP32[$0 + -24 >> 2]; $12 = HEAP32[$0 + -28 >> 2]; $13 = HEAP32[$2 >> 2]; $14 = HEAP32[$2 + 4 >> 2]; $16 = HEAP32[$2 + 8 >> 2]; $15 = HEAP32[$2 + 12 >> 2]; $18 = HEAP32[$2 + 16 >> 2]; $17 = HEAP32[$2 + 20 >> 2]; $20 = HEAP32[$2 + 24 >> 2]; $2 = 0; while (1) { $10 = $9; $9 = $8; $8 = $7; $7 = $3; $3 = $6; $6 = $11; $19 = $2 << 2; $11 = HEAP32[$19 + $0 >> 2]; HEAP32[$5 + $19 >> 2] = $11 - ((((((Math_imul($10, $17) + Math_imul($12, $20) | 0) + Math_imul($9, $18) | 0) + Math_imul($8, $15) | 0) + Math_imul($7, $16) | 0) + Math_imul($3, $14) | 0) + Math_imul($6, $13) >> $4); $12 = $10; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $12 = HEAP32[$0 + -4 >> 2]; $6 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $7 = HEAP32[$0 + -16 >> 2]; $8 = HEAP32[$0 + -20 >> 2]; $9 = HEAP32[$0 + -24 >> 2]; $10 = HEAP32[$0 + -28 >> 2]; $13 = HEAP32[$0 + -32 >> 2]; $14 = HEAP32[$2 >> 2]; $16 = HEAP32[$2 + 4 >> 2]; $15 = HEAP32[$2 + 8 >> 2]; $18 = HEAP32[$2 + 12 >> 2]; $17 = HEAP32[$2 + 16 >> 2]; $20 = HEAP32[$2 + 20 >> 2]; $19 = HEAP32[$2 + 24 >> 2]; $22 = HEAP32[$2 + 28 >> 2]; $2 = 0; while (1) { $11 = $10; $10 = $9; $9 = $8; $8 = $7; $7 = $3; $3 = $6; $6 = $12; $21 = $2 << 2; $12 = HEAP32[$21 + $0 >> 2]; HEAP32[$5 + $21 >> 2] = $12 - (((((((Math_imul($11, $19) + Math_imul($13, $22) | 0) + Math_imul($10, $20) | 0) + Math_imul($9, $17) | 0) + Math_imul($8, $18) | 0) + Math_imul($7, $15) | 0) + Math_imul($3, $16) | 0) + Math_imul($6, $14) >> $4); $13 = $11; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($3 | 0) != 6) { if (($1 | 0) < 1) { break label$1 } $9 = HEAP32[$0 + -4 >> 2]; $6 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $7 = HEAP32[$0 + -16 >> 2]; $10 = HEAP32[$0 + -20 >> 2]; $11 = HEAP32[$2 >> 2]; $12 = HEAP32[$2 + 4 >> 2]; $13 = HEAP32[$2 + 8 >> 2]; $14 = HEAP32[$2 + 12 >> 2]; $16 = HEAP32[$2 + 16 >> 2]; $2 = 0; while (1) { $8 = $7; $7 = $3; $3 = $6; $6 = $9; $15 = $2 << 2; $9 = HEAP32[$15 + $0 >> 2]; HEAP32[$5 + $15 >> 2] = $9 - ((((Math_imul($8, $14) + Math_imul($10, $16) | 0) + Math_imul($7, $13) | 0) + Math_imul($3, $12) | 0) + Math_imul($6, $11) >> $4); $10 = $8; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $10 = HEAP32[$0 + -4 >> 2]; $6 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $7 = HEAP32[$0 + -16 >> 2]; $8 = HEAP32[$0 + -20 >> 2]; $11 = HEAP32[$0 + -24 >> 2]; $12 = HEAP32[$2 >> 2]; $13 = HEAP32[$2 + 4 >> 2]; $14 = HEAP32[$2 + 8 >> 2]; $16 = HEAP32[$2 + 12 >> 2]; $15 = HEAP32[$2 + 16 >> 2]; $18 = HEAP32[$2 + 20 >> 2]; $2 = 0; while (1) { $9 = $8; $8 = $7; $7 = $3; $3 = $6; $6 = $10; $17 = $2 << 2; $10 = HEAP32[$17 + $0 >> 2]; HEAP32[$5 + $17 >> 2] = $10 - (((((Math_imul($9, $15) + Math_imul($11, $18) | 0) + Math_imul($8, $16) | 0) + Math_imul($7, $14) | 0) + Math_imul($3, $13) | 0) + Math_imul($6, $12) >> $4); $11 = $9; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if ($3 >>> 0 >= 3) { if (($3 | 0) != 4) { if (($1 | 0) < 1) { break label$1 } $7 = HEAP32[$0 + -4 >> 2]; $6 = HEAP32[$0 + -8 >> 2]; $8 = HEAP32[$0 + -12 >> 2]; $9 = HEAP32[$2 >> 2]; $10 = HEAP32[$2 + 4 >> 2]; $11 = HEAP32[$2 + 8 >> 2]; $2 = 0; while (1) { $3 = $6; $6 = $7; $12 = $2 << 2; $7 = HEAP32[$12 + $0 >> 2]; HEAP32[$5 + $12 >> 2] = $7 - ((Math_imul($3, $10) + Math_imul($8, $11) | 0) + Math_imul($6, $9) >> $4); $8 = $3; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $8 = HEAP32[$0 + -4 >> 2]; $6 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $9 = HEAP32[$0 + -16 >> 2]; $10 = HEAP32[$2 >> 2]; $11 = HEAP32[$2 + 4 >> 2]; $12 = HEAP32[$2 + 8 >> 2]; $13 = HEAP32[$2 + 12 >> 2]; $2 = 0; while (1) { $7 = $3; $3 = $6; $6 = $8; $14 = $2 << 2; $8 = HEAP32[$14 + $0 >> 2]; HEAP32[$5 + $14 >> 2] = $8 - (((Math_imul($7, $12) + Math_imul($9, $13) | 0) + Math_imul($3, $11) | 0) + Math_imul($6, $10) >> $4); $9 = $7; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($3 | 0) != 2) { if (($1 | 0) < 1) { break label$1 } $6 = HEAP32[$0 + -4 >> 2]; $3 = HEAP32[$2 >> 2]; $2 = 0; while (1) { $7 = Math_imul($3, $6); $8 = $2 << 2; $6 = HEAP32[$8 + $0 >> 2]; HEAP32[$5 + $8 >> 2] = $6 - ($7 >> $4); $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $3 = HEAP32[$0 + -4 >> 2]; $7 = HEAP32[$0 + -8 >> 2]; $8 = HEAP32[$2 >> 2]; $9 = HEAP32[$2 + 4 >> 2]; $2 = 0; while (1) { $6 = $3; $10 = $2 << 2; $3 = HEAP32[$10 + $0 >> 2]; HEAP32[$5 + $10 >> 2] = $3 - (Math_imul($6, $8) + Math_imul($7, $9) >> $4); $7 = $6; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__lpc_compute_residual_from_qlp_coefficients_wide($0, $1, $2, $3, $4, $5) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; $4 = $4 | 0; $5 = $5 | 0; var $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0, $22 = 0, $23 = 0, $24 = 0, $25 = 0, $26 = 0, $27 = 0, $28 = 0, $29 = 0, $30 = 0, $31 = 0, $32 = 0, $33 = 0, $34 = 0, $35 = 0, $36 = 0, $37 = 0, $38 = 0, $39 = 0, $40 = 0, $41 = 0, $42 = 0, $43 = 0, $44 = 0, $45 = 0; label$1 : { if ($3 >>> 0 >= 13) { if (($1 | 0) < 1) { break label$1 } $18 = $4; $12 = $3 + -13 | 0; while (1) { $4 = 0; $3 = 0; label$4 : { switch ($12 | 0) { case 19: $3 = HEAP32[(($15 << 2) + $0 | 0) + -128 >> 2]; $4 = $3; $7 = $3 >> 31; $3 = HEAP32[$2 + 124 >> 2]; $4 = __wasm_i64_mul($4, $7, $3, $3 >> 31); $3 = i64toi32_i32$HIGH_BITS; case 18: $7 = HEAP32[(($15 << 2) + $0 | 0) + -124 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 120 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 17: $7 = HEAP32[(($15 << 2) + $0 | 0) + -120 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 116 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 16: $7 = HEAP32[(($15 << 2) + $0 | 0) + -116 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 112 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 15: $7 = HEAP32[(($15 << 2) + $0 | 0) + -112 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 108 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 14: $7 = HEAP32[(($15 << 2) + $0 | 0) + -108 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 104 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 13: $7 = HEAP32[(($15 << 2) + $0 | 0) + -104 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 100 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 12: $7 = HEAP32[(($15 << 2) + $0 | 0) + -100 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 96 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 11: $7 = HEAP32[(($15 << 2) + $0 | 0) + -96 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 92 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 10: $7 = HEAP32[(($15 << 2) + $0 | 0) + -92 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 88 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 9: $7 = HEAP32[(($15 << 2) + $0 | 0) + -88 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 84 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 8: $7 = HEAP32[(($15 << 2) + $0 | 0) + -84 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 80 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 7: $7 = HEAP32[(($15 << 2) + $0 | 0) + -80 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 76 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 6: $7 = HEAP32[(($15 << 2) + $0 | 0) + -76 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 72 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 5: $7 = HEAP32[(($15 << 2) + $0 | 0) + -72 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 68 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 4: $7 = HEAP32[(($15 << 2) + $0 | 0) + -68 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 64 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 3: $7 = HEAP32[(($15 << 2) + $0 | 0) + -64 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 60 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 2: $7 = HEAP32[(($15 << 2) + $0 | 0) + -60 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 56 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 1: $7 = HEAP32[(($15 << 2) + $0 | 0) + -56 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 52 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 0: $8 = ($15 << 2) + $0 | 0; $7 = HEAP32[$8 + -52 >> 2]; $6 = $7; $9 = $7 >> 31; $7 = HEAP32[$2 + 48 >> 2]; $7 = __wasm_i64_mul($6, $9, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $3 = HEAP32[$8 + -48 >> 2]; $4 = $3; $9 = $3 >> 31; $3 = HEAP32[$2 + 44 >> 2]; $3 = __wasm_i64_mul($4, $9, $3, $3 >> 31); $4 = $3 + $7 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $4 >>> 0 < $3 >>> 0 ? $6 + 1 | 0 : $6; $3 = HEAP32[$8 + -44 >> 2]; $7 = $3; $9 = $3 >> 31; $3 = HEAP32[$2 + 40 >> 2]; $3 = __wasm_i64_mul($7, $9, $3, $3 >> 31); $4 = $3 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $4 >>> 0 < $3 >>> 0 ? $6 + 1 | 0 : $6; $3 = HEAP32[$8 + -40 >> 2]; $7 = $3; $9 = $3 >> 31; $3 = HEAP32[$2 + 36 >> 2]; $3 = __wasm_i64_mul($7, $9, $3, $3 >> 31); $4 = $3 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $4 >>> 0 < $3 >>> 0 ? $6 + 1 | 0 : $6; $3 = HEAP32[$8 + -36 >> 2]; $7 = $3; $9 = $3 >> 31; $3 = HEAP32[$2 + 32 >> 2]; $3 = __wasm_i64_mul($7, $9, $3, $3 >> 31); $4 = $3 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $4 >>> 0 < $3 >>> 0 ? $6 + 1 | 0 : $6; $3 = HEAP32[$8 + -32 >> 2]; $7 = $3; $9 = $3 >> 31; $3 = HEAP32[$2 + 28 >> 2]; $3 = __wasm_i64_mul($7, $9, $3, $3 >> 31); $4 = $3 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $4 >>> 0 < $3 >>> 0 ? $6 + 1 | 0 : $6; $3 = HEAP32[$8 + -28 >> 2]; $7 = $3; $9 = $3 >> 31; $3 = HEAP32[$2 + 24 >> 2]; $3 = __wasm_i64_mul($7, $9, $3, $3 >> 31); $4 = $3 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $4 >>> 0 < $3 >>> 0 ? $6 + 1 | 0 : $6; $3 = HEAP32[$8 + -24 >> 2]; $7 = $3; $9 = $3 >> 31; $3 = HEAP32[$2 + 20 >> 2]; $3 = __wasm_i64_mul($7, $9, $3, $3 >> 31); $4 = $3 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $4 >>> 0 < $3 >>> 0 ? $6 + 1 | 0 : $6; $3 = HEAP32[$8 + -20 >> 2]; $7 = $3; $9 = $3 >> 31; $3 = HEAP32[$2 + 16 >> 2]; $3 = __wasm_i64_mul($7, $9, $3, $3 >> 31); $4 = $3 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $4 >>> 0 < $3 >>> 0 ? $6 + 1 | 0 : $6; $3 = HEAP32[$8 + -16 >> 2]; $7 = $3; $9 = $3 >> 31; $3 = HEAP32[$2 + 12 >> 2]; $3 = __wasm_i64_mul($7, $9, $3, $3 >> 31); $4 = $3 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $4 >>> 0 < $3 >>> 0 ? $6 + 1 | 0 : $6; $3 = HEAP32[$8 + -12 >> 2]; $7 = $3; $9 = $3 >> 31; $3 = HEAP32[$2 + 8 >> 2]; $3 = __wasm_i64_mul($7, $9, $3, $3 >> 31); $4 = $3 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $4 >>> 0 < $3 >>> 0 ? $6 + 1 | 0 : $6; $3 = HEAP32[$8 + -8 >> 2]; $7 = $3; $9 = $3 >> 31; $3 = HEAP32[$2 + 4 >> 2]; $3 = __wasm_i64_mul($7, $9, $3, $3 >> 31); $4 = $3 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $4 >>> 0 < $3 >>> 0 ? $6 + 1 | 0 : $6; $3 = HEAP32[$8 + -4 >> 2]; $7 = $3; $8 = $3 >> 31; $3 = HEAP32[$2 >> 2]; $3 = __wasm_i64_mul($7, $8, $3, $3 >> 31); $4 = $3 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $4 >>> 0 < $3 >>> 0 ? $6 + 1 | 0 : $6; $3 = $6; break; default: break label$4; }; } $7 = $15 << 2; $6 = $7 + $5 | 0; $9 = HEAP32[$0 + $7 >> 2]; $7 = $3; $3 = $18; $8 = $3 & 31; HEAP32[$6 >> 2] = $9 - (32 <= ($3 & 63) >>> 0 ? $7 >> $8 : ((1 << $8) - 1 & $7) << 32 - $8 | $4 >>> $8); $15 = $15 + 1 | 0; if (($15 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if ($3 >>> 0 >= 9) { if ($3 >>> 0 >= 11) { if (($3 | 0) != 12) { if (($1 | 0) < 1) { break label$1 } $10 = HEAP32[$0 + -4 >> 2]; $15 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $18 = HEAP32[$0 + -16 >> 2]; $7 = HEAP32[$0 + -20 >> 2]; $12 = HEAP32[$0 + -24 >> 2]; $8 = HEAP32[$0 + -28 >> 2]; $9 = HEAP32[$0 + -32 >> 2]; $11 = HEAP32[$0 + -36 >> 2]; $17 = HEAP32[$0 + -40 >> 2]; $13 = HEAP32[$0 + -44 >> 2]; $6 = HEAP32[$2 >> 2]; $40 = $6; $41 = $6 >> 31; $6 = HEAP32[$2 + 4 >> 2]; $42 = $6; $37 = $6 >> 31; $6 = HEAP32[$2 + 8 >> 2]; $38 = $6; $39 = $6 >> 31; $6 = HEAP32[$2 + 12 >> 2]; $34 = $6; $35 = $6 >> 31; $6 = HEAP32[$2 + 16 >> 2]; $36 = $6; $31 = $6 >> 31; $6 = HEAP32[$2 + 20 >> 2]; $32 = $6; $33 = $6 >> 31; $6 = HEAP32[$2 + 24 >> 2]; $29 = $6; $30 = $6 >> 31; $6 = HEAP32[$2 + 28 >> 2]; $26 = $6; $27 = $6 >> 31; $6 = HEAP32[$2 + 32 >> 2]; $28 = $6; $23 = $6 >> 31; $6 = HEAP32[$2 + 36 >> 2]; $24 = $6; $25 = $6 >> 31; $2 = HEAP32[$2 + 40 >> 2]; $21 = $2; $22 = $2 >> 31; $2 = 0; while (1) { $16 = $17; $17 = $11; $11 = $9; $9 = $8; $8 = $12; $12 = $7; $7 = $18; $18 = $3; $3 = $15; $15 = $10; $6 = $2 << 2; $20 = $6 + $5 | 0; $10 = HEAP32[$0 + $6 >> 2]; $14 = __wasm_i64_mul($16, $16 >> 31, $24, $25); $6 = i64toi32_i32$HIGH_BITS; $13 = __wasm_i64_mul($13, $13 >> 31, $21, $22); $14 = $13 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $14 >>> 0 < $13 >>> 0 ? $6 + 1 | 0 : $6; $13 = __wasm_i64_mul($17, $17 >> 31, $28, $23); $14 = $13 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $14 >>> 0 < $13 >>> 0 ? $6 + 1 | 0 : $6; $13 = __wasm_i64_mul($11, $11 >> 31, $26, $27); $14 = $13 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $14 >>> 0 < $13 >>> 0 ? $6 + 1 | 0 : $6; $13 = __wasm_i64_mul($9, $9 >> 31, $29, $30); $14 = $13 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $14 >>> 0 < $13 >>> 0 ? $6 + 1 | 0 : $6; $13 = __wasm_i64_mul($8, $8 >> 31, $32, $33); $14 = $13 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $14 >>> 0 < $13 >>> 0 ? $6 + 1 | 0 : $6; $13 = __wasm_i64_mul($12, $12 >> 31, $36, $31); $14 = $13 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $14 >>> 0 < $13 >>> 0 ? $6 + 1 | 0 : $6; $13 = __wasm_i64_mul($7, $7 >> 31, $34, $35); $14 = $13 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $14 >>> 0 < $13 >>> 0 ? $6 + 1 | 0 : $6; $13 = __wasm_i64_mul($18, $18 >> 31, $38, $39); $14 = $13 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $14 >>> 0 < $13 >>> 0 ? $6 + 1 | 0 : $6; $13 = __wasm_i64_mul($3, $3 >> 31, $42, $37); $14 = $13 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $14 >>> 0 < $13 >>> 0 ? $6 + 1 | 0 : $6; $13 = __wasm_i64_mul($15, $15 >> 31, $40, $41); $14 = $13 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $14 >>> 0 < $13 >>> 0 ? $6 + 1 | 0 : $6; $13 = $6; $6 = $4; $19 = $6 & 31; HEAP32[$20 >> 2] = $10 - (32 <= ($6 & 63) >>> 0 ? $13 >> $19 : ((1 << $19) - 1 & $13) << 32 - $19 | $14 >>> $19); $13 = $16; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $13 = HEAP32[$0 + -4 >> 2]; $15 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $18 = HEAP32[$0 + -16 >> 2]; $7 = HEAP32[$0 + -20 >> 2]; $12 = HEAP32[$0 + -24 >> 2]; $8 = HEAP32[$0 + -28 >> 2]; $9 = HEAP32[$0 + -32 >> 2]; $11 = HEAP32[$0 + -36 >> 2]; $17 = HEAP32[$0 + -40 >> 2]; $16 = HEAP32[$0 + -44 >> 2]; $6 = HEAP32[$0 + -48 >> 2]; $10 = HEAP32[$2 >> 2]; $43 = $10; $44 = $10 >> 31; $10 = HEAP32[$2 + 4 >> 2]; $45 = $10; $40 = $10 >> 31; $10 = HEAP32[$2 + 8 >> 2]; $41 = $10; $42 = $10 >> 31; $10 = HEAP32[$2 + 12 >> 2]; $37 = $10; $38 = $10 >> 31; $10 = HEAP32[$2 + 16 >> 2]; $39 = $10; $34 = $10 >> 31; $10 = HEAP32[$2 + 20 >> 2]; $35 = $10; $36 = $10 >> 31; $10 = HEAP32[$2 + 24 >> 2]; $31 = $10; $32 = $10 >> 31; $10 = HEAP32[$2 + 28 >> 2]; $33 = $10; $29 = $10 >> 31; $10 = HEAP32[$2 + 32 >> 2]; $30 = $10; $26 = $10 >> 31; $10 = HEAP32[$2 + 36 >> 2]; $27 = $10; $28 = $10 >> 31; $10 = HEAP32[$2 + 40 >> 2]; $23 = $10; $24 = $10 >> 31; $2 = HEAP32[$2 + 44 >> 2]; $25 = $2; $21 = $2 >> 31; $2 = 0; while (1) { $10 = $16; $16 = $17; $17 = $11; $11 = $9; $9 = $8; $8 = $12; $12 = $7; $7 = $18; $18 = $3; $3 = $15; $15 = $13; $13 = $2 << 2; $22 = $13 + $5 | 0; $13 = HEAP32[$0 + $13 >> 2]; $14 = __wasm_i64_mul($10, $10 >> 31, $23, $24); $19 = i64toi32_i32$HIGH_BITS; $20 = $14; $14 = __wasm_i64_mul($6, $6 >> 31, $25, $21); $20 = $20 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $19 | 0; $6 = $20 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $14 = __wasm_i64_mul($16, $16 >> 31, $27, $28); $19 = $14 + $20 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $19 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $14 = __wasm_i64_mul($17, $17 >> 31, $30, $26); $19 = $14 + $19 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $19 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $14 = __wasm_i64_mul($11, $11 >> 31, $33, $29); $19 = $14 + $19 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $19 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $14 = __wasm_i64_mul($9, $9 >> 31, $31, $32); $19 = $14 + $19 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $19 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $14 = __wasm_i64_mul($8, $8 >> 31, $35, $36); $19 = $14 + $19 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $19 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $14 = __wasm_i64_mul($12, $12 >> 31, $39, $34); $19 = $14 + $19 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $19 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $14 = __wasm_i64_mul($7, $7 >> 31, $37, $38); $19 = $14 + $19 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $19 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $14 = __wasm_i64_mul($18, $18 >> 31, $41, $42); $19 = $14 + $19 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $19 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $14 = __wasm_i64_mul($3, $3 >> 31, $45, $40); $19 = $14 + $19 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $19 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $14 = __wasm_i64_mul($15, $15 >> 31, $43, $44); $19 = $14 + $19 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $19 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $14 = $6; $6 = $4; $20 = $6 & 31; HEAP32[$22 >> 2] = $13 - (32 <= ($6 & 63) >>> 0 ? $14 >> $20 : ((1 << $20) - 1 & $14) << 32 - $20 | $19 >>> $20); $6 = $10; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($3 | 0) != 10) { if (($1 | 0) < 1) { break label$1 } $17 = HEAP32[$0 + -4 >> 2]; $15 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $18 = HEAP32[$0 + -16 >> 2]; $7 = HEAP32[$0 + -20 >> 2]; $12 = HEAP32[$0 + -24 >> 2]; $8 = HEAP32[$0 + -28 >> 2]; $9 = HEAP32[$0 + -32 >> 2]; $16 = HEAP32[$0 + -36 >> 2]; $11 = HEAP32[$2 >> 2]; $34 = $11; $35 = $11 >> 31; $11 = HEAP32[$2 + 4 >> 2]; $36 = $11; $31 = $11 >> 31; $11 = HEAP32[$2 + 8 >> 2]; $32 = $11; $33 = $11 >> 31; $11 = HEAP32[$2 + 12 >> 2]; $29 = $11; $30 = $11 >> 31; $11 = HEAP32[$2 + 16 >> 2]; $26 = $11; $27 = $11 >> 31; $11 = HEAP32[$2 + 20 >> 2]; $28 = $11; $23 = $11 >> 31; $11 = HEAP32[$2 + 24 >> 2]; $24 = $11; $25 = $11 >> 31; $11 = HEAP32[$2 + 28 >> 2]; $21 = $11; $22 = $11 >> 31; $2 = HEAP32[$2 + 32 >> 2]; $20 = $2; $19 = $2 >> 31; $2 = 0; while (1) { $11 = $9; $9 = $8; $8 = $12; $12 = $7; $7 = $18; $18 = $3; $3 = $15; $15 = $17; $6 = $2 << 2; $14 = $6 + $5 | 0; $17 = HEAP32[$0 + $6 >> 2]; $10 = __wasm_i64_mul($11, $11 >> 31, $21, $22); $6 = i64toi32_i32$HIGH_BITS; $16 = __wasm_i64_mul($16, $16 >> 31, $20, $19); $10 = $16 + $10 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $10 >>> 0 < $16 >>> 0 ? $6 + 1 | 0 : $6; $16 = __wasm_i64_mul($9, $9 >> 31, $24, $25); $10 = $16 + $10 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $10 >>> 0 < $16 >>> 0 ? $6 + 1 | 0 : $6; $16 = __wasm_i64_mul($8, $8 >> 31, $28, $23); $10 = $16 + $10 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $10 >>> 0 < $16 >>> 0 ? $6 + 1 | 0 : $6; $16 = __wasm_i64_mul($12, $12 >> 31, $26, $27); $10 = $16 + $10 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $10 >>> 0 < $16 >>> 0 ? $6 + 1 | 0 : $6; $16 = __wasm_i64_mul($7, $7 >> 31, $29, $30); $10 = $16 + $10 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $10 >>> 0 < $16 >>> 0 ? $6 + 1 | 0 : $6; $16 = __wasm_i64_mul($18, $18 >> 31, $32, $33); $10 = $16 + $10 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $10 >>> 0 < $16 >>> 0 ? $6 + 1 | 0 : $6; $16 = __wasm_i64_mul($3, $3 >> 31, $36, $31); $10 = $16 + $10 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $10 >>> 0 < $16 >>> 0 ? $6 + 1 | 0 : $6; $16 = __wasm_i64_mul($15, $15 >> 31, $34, $35); $10 = $16 + $10 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $10 >>> 0 < $16 >>> 0 ? $6 + 1 | 0 : $6; $16 = $6; $6 = $4; $13 = $6 & 31; HEAP32[$14 >> 2] = $17 - (32 <= ($6 & 63) >>> 0 ? $16 >> $13 : ((1 << $13) - 1 & $16) << 32 - $13 | $10 >>> $13); $16 = $11; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $16 = HEAP32[$0 + -4 >> 2]; $15 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $18 = HEAP32[$0 + -16 >> 2]; $7 = HEAP32[$0 + -20 >> 2]; $12 = HEAP32[$0 + -24 >> 2]; $8 = HEAP32[$0 + -28 >> 2]; $9 = HEAP32[$0 + -32 >> 2]; $11 = HEAP32[$0 + -36 >> 2]; $10 = HEAP32[$0 + -40 >> 2]; $6 = HEAP32[$2 >> 2]; $37 = $6; $38 = $6 >> 31; $6 = HEAP32[$2 + 4 >> 2]; $39 = $6; $34 = $6 >> 31; $6 = HEAP32[$2 + 8 >> 2]; $35 = $6; $36 = $6 >> 31; $6 = HEAP32[$2 + 12 >> 2]; $31 = $6; $32 = $6 >> 31; $6 = HEAP32[$2 + 16 >> 2]; $33 = $6; $29 = $6 >> 31; $6 = HEAP32[$2 + 20 >> 2]; $30 = $6; $26 = $6 >> 31; $6 = HEAP32[$2 + 24 >> 2]; $27 = $6; $28 = $6 >> 31; $6 = HEAP32[$2 + 28 >> 2]; $23 = $6; $24 = $6 >> 31; $6 = HEAP32[$2 + 32 >> 2]; $25 = $6; $21 = $6 >> 31; $2 = HEAP32[$2 + 36 >> 2]; $22 = $2; $20 = $2 >> 31; $2 = 0; while (1) { $17 = $11; $11 = $9; $9 = $8; $8 = $12; $12 = $7; $7 = $18; $18 = $3; $3 = $15; $15 = $16; $6 = $2 << 2; $19 = $6 + $5 | 0; $16 = HEAP32[$0 + $6 >> 2]; $13 = __wasm_i64_mul($17, $17 >> 31, $25, $21); $6 = i64toi32_i32$HIGH_BITS; $10 = __wasm_i64_mul($10, $10 >> 31, $22, $20); $13 = $10 + $13 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $10 >>> 0 ? $6 + 1 | 0 : $6; $10 = __wasm_i64_mul($11, $11 >> 31, $23, $24); $13 = $10 + $13 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $10 >>> 0 ? $6 + 1 | 0 : $6; $10 = __wasm_i64_mul($9, $9 >> 31, $27, $28); $13 = $10 + $13 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $10 >>> 0 ? $6 + 1 | 0 : $6; $10 = __wasm_i64_mul($8, $8 >> 31, $30, $26); $13 = $10 + $13 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $10 >>> 0 ? $6 + 1 | 0 : $6; $10 = __wasm_i64_mul($12, $12 >> 31, $33, $29); $13 = $10 + $13 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $10 >>> 0 ? $6 + 1 | 0 : $6; $10 = __wasm_i64_mul($7, $7 >> 31, $31, $32); $13 = $10 + $13 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $10 >>> 0 ? $6 + 1 | 0 : $6; $10 = __wasm_i64_mul($18, $18 >> 31, $35, $36); $13 = $10 + $13 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $10 >>> 0 ? $6 + 1 | 0 : $6; $10 = __wasm_i64_mul($3, $3 >> 31, $39, $34); $13 = $10 + $13 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $10 >>> 0 ? $6 + 1 | 0 : $6; $10 = __wasm_i64_mul($15, $15 >> 31, $37, $38); $13 = $10 + $13 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $10 >>> 0 ? $6 + 1 | 0 : $6; $10 = $6; $6 = $4; $14 = $6 & 31; HEAP32[$19 >> 2] = $16 - (32 <= ($6 & 63) >>> 0 ? $10 >> $14 : ((1 << $14) - 1 & $10) << 32 - $14 | $13 >>> $14); $10 = $17; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if ($3 >>> 0 >= 5) { if ($3 >>> 0 >= 7) { if (($3 | 0) != 8) { if (($1 | 0) < 1) { break label$1 } $9 = HEAP32[$0 + -4 >> 2]; $15 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $18 = HEAP32[$0 + -16 >> 2]; $7 = HEAP32[$0 + -20 >> 2]; $12 = HEAP32[$0 + -24 >> 2]; $11 = HEAP32[$0 + -28 >> 2]; $8 = HEAP32[$2 >> 2]; $29 = $8; $30 = $8 >> 31; $8 = HEAP32[$2 + 4 >> 2]; $26 = $8; $27 = $8 >> 31; $8 = HEAP32[$2 + 8 >> 2]; $28 = $8; $23 = $8 >> 31; $8 = HEAP32[$2 + 12 >> 2]; $24 = $8; $25 = $8 >> 31; $8 = HEAP32[$2 + 16 >> 2]; $21 = $8; $22 = $8 >> 31; $8 = HEAP32[$2 + 20 >> 2]; $20 = $8; $19 = $8 >> 31; $2 = HEAP32[$2 + 24 >> 2]; $14 = $2; $13 = $2 >> 31; $2 = 0; while (1) { $8 = $12; $12 = $7; $7 = $18; $18 = $3; $3 = $15; $15 = $9; $9 = $2 << 2; $10 = $9 + $5 | 0; $9 = HEAP32[$0 + $9 >> 2]; $17 = __wasm_i64_mul($8, $8 >> 31, $20, $19); $6 = i64toi32_i32$HIGH_BITS; $11 = __wasm_i64_mul($11, $11 >> 31, $14, $13); $17 = $11 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $17 >>> 0 < $11 >>> 0 ? $6 + 1 | 0 : $6; $11 = __wasm_i64_mul($12, $12 >> 31, $21, $22); $17 = $11 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $17 >>> 0 < $11 >>> 0 ? $6 + 1 | 0 : $6; $11 = __wasm_i64_mul($7, $7 >> 31, $24, $25); $17 = $11 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $17 >>> 0 < $11 >>> 0 ? $6 + 1 | 0 : $6; $11 = __wasm_i64_mul($18, $18 >> 31, $28, $23); $17 = $11 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $17 >>> 0 < $11 >>> 0 ? $6 + 1 | 0 : $6; $11 = __wasm_i64_mul($3, $3 >> 31, $26, $27); $17 = $11 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $17 >>> 0 < $11 >>> 0 ? $6 + 1 | 0 : $6; $11 = __wasm_i64_mul($15, $15 >> 31, $29, $30); $17 = $11 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $17 >>> 0 < $11 >>> 0 ? $6 + 1 | 0 : $6; $16 = $4 & 31; HEAP32[$10 >> 2] = $9 - (32 <= ($4 & 63) >>> 0 ? $6 >> $16 : ((1 << $16) - 1 & $6) << 32 - $16 | $17 >>> $16); $11 = $8; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $11 = HEAP32[$0 + -4 >> 2]; $15 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $18 = HEAP32[$0 + -16 >> 2]; $7 = HEAP32[$0 + -20 >> 2]; $12 = HEAP32[$0 + -24 >> 2]; $8 = HEAP32[$0 + -28 >> 2]; $17 = HEAP32[$0 + -32 >> 2]; $9 = HEAP32[$2 >> 2]; $31 = $9; $32 = $9 >> 31; $9 = HEAP32[$2 + 4 >> 2]; $33 = $9; $29 = $9 >> 31; $9 = HEAP32[$2 + 8 >> 2]; $30 = $9; $26 = $9 >> 31; $9 = HEAP32[$2 + 12 >> 2]; $27 = $9; $28 = $9 >> 31; $9 = HEAP32[$2 + 16 >> 2]; $23 = $9; $24 = $9 >> 31; $9 = HEAP32[$2 + 20 >> 2]; $25 = $9; $21 = $9 >> 31; $9 = HEAP32[$2 + 24 >> 2]; $22 = $9; $20 = $9 >> 31; $2 = HEAP32[$2 + 28 >> 2]; $19 = $2; $14 = $2 >> 31; $2 = 0; while (1) { $9 = $8; $8 = $12; $12 = $7; $7 = $18; $18 = $3; $3 = $15; $15 = $11; $11 = $2 << 2; $13 = $11 + $5 | 0; $11 = HEAP32[$0 + $11 >> 2]; $16 = __wasm_i64_mul($9, $9 >> 31, $22, $20); $6 = i64toi32_i32$HIGH_BITS; $17 = __wasm_i64_mul($17, $17 >> 31, $19, $14); $16 = $17 + $16 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $16 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $17 = __wasm_i64_mul($8, $8 >> 31, $25, $21); $16 = $17 + $16 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $16 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $17 = __wasm_i64_mul($12, $12 >> 31, $23, $24); $16 = $17 + $16 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $16 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $17 = __wasm_i64_mul($7, $7 >> 31, $27, $28); $16 = $17 + $16 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $16 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $17 = __wasm_i64_mul($18, $18 >> 31, $30, $26); $16 = $17 + $16 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $16 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $17 = __wasm_i64_mul($3, $3 >> 31, $33, $29); $16 = $17 + $16 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $16 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $17 = __wasm_i64_mul($15, $15 >> 31, $31, $32); $16 = $17 + $16 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $16 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $17 = $6; $6 = $4; $10 = $6 & 31; HEAP32[$13 >> 2] = $11 - (32 <= ($6 & 63) >>> 0 ? $17 >> $10 : ((1 << $10) - 1 & $17) << 32 - $10 | $16 >>> $10); $17 = $9; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($3 | 0) != 6) { if (($1 | 0) < 1) { break label$1 } $12 = HEAP32[$0 + -4 >> 2]; $15 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $18 = HEAP32[$0 + -16 >> 2]; $8 = HEAP32[$0 + -20 >> 2]; $7 = HEAP32[$2 >> 2]; $23 = $7; $24 = $7 >> 31; $7 = HEAP32[$2 + 4 >> 2]; $25 = $7; $21 = $7 >> 31; $7 = HEAP32[$2 + 8 >> 2]; $22 = $7; $20 = $7 >> 31; $7 = HEAP32[$2 + 12 >> 2]; $19 = $7; $14 = $7 >> 31; $2 = HEAP32[$2 + 16 >> 2]; $13 = $2; $10 = $2 >> 31; $2 = 0; while (1) { $7 = $18; $18 = $3; $3 = $15; $15 = $12; $12 = $2 << 2; $16 = $12 + $5 | 0; $12 = HEAP32[$0 + $12 >> 2]; $11 = __wasm_i64_mul($7, $7 >> 31, $19, $14); $9 = i64toi32_i32$HIGH_BITS; $8 = __wasm_i64_mul($8, $8 >> 31, $13, $10); $11 = $8 + $11 | 0; $6 = i64toi32_i32$HIGH_BITS + $9 | 0; $6 = $11 >>> 0 < $8 >>> 0 ? $6 + 1 | 0 : $6; $8 = __wasm_i64_mul($18, $18 >> 31, $22, $20); $9 = $8 + $11 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $9 >>> 0 < $8 >>> 0 ? $6 + 1 | 0 : $6; $8 = __wasm_i64_mul($3, $3 >> 31, $25, $21); $9 = $8 + $9 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $9 >>> 0 < $8 >>> 0 ? $6 + 1 | 0 : $6; $8 = __wasm_i64_mul($15, $15 >> 31, $23, $24); $9 = $8 + $9 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $9 >>> 0 < $8 >>> 0 ? $6 + 1 | 0 : $6; $11 = $4 & 31; HEAP32[$16 >> 2] = $12 - (32 <= ($4 & 63) >>> 0 ? $6 >> $11 : ((1 << $11) - 1 & $6) << 32 - $11 | $9 >>> $11); $8 = $7; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $8 = HEAP32[$0 + -4 >> 2]; $15 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $18 = HEAP32[$0 + -16 >> 2]; $7 = HEAP32[$0 + -20 >> 2]; $9 = HEAP32[$0 + -24 >> 2]; $12 = HEAP32[$2 >> 2]; $27 = $12; $28 = $12 >> 31; $12 = HEAP32[$2 + 4 >> 2]; $23 = $12; $24 = $12 >> 31; $12 = HEAP32[$2 + 8 >> 2]; $25 = $12; $21 = $12 >> 31; $12 = HEAP32[$2 + 12 >> 2]; $22 = $12; $20 = $12 >> 31; $12 = HEAP32[$2 + 16 >> 2]; $19 = $12; $14 = $12 >> 31; $2 = HEAP32[$2 + 20 >> 2]; $13 = $2; $10 = $2 >> 31; $2 = 0; while (1) { $12 = $7; $7 = $18; $18 = $3; $3 = $15; $15 = $8; $8 = $2 << 2; $16 = $8 + $5 | 0; $8 = HEAP32[$0 + $8 >> 2]; $6 = __wasm_i64_mul($12, $12 >> 31, $19, $14); $11 = i64toi32_i32$HIGH_BITS; $9 = __wasm_i64_mul($9, $9 >> 31, $13, $10); $26 = $9 + $6 | 0; $6 = i64toi32_i32$HIGH_BITS + $11 | 0; $6 = $26 >>> 0 < $9 >>> 0 ? $6 + 1 | 0 : $6; $9 = __wasm_i64_mul($7, $7 >> 31, $22, $20); $11 = $9 + $26 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $11 >>> 0 < $9 >>> 0 ? $6 + 1 | 0 : $6; $9 = __wasm_i64_mul($18, $18 >> 31, $25, $21); $11 = $9 + $11 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $11 >>> 0 < $9 >>> 0 ? $6 + 1 | 0 : $6; $9 = __wasm_i64_mul($3, $3 >> 31, $23, $24); $11 = $9 + $11 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $11 >>> 0 < $9 >>> 0 ? $6 + 1 | 0 : $6; $9 = __wasm_i64_mul($15, $15 >> 31, $27, $28); $11 = $9 + $11 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $11 >>> 0 < $9 >>> 0 ? $6 + 1 | 0 : $6; $17 = $4 & 31; HEAP32[$16 >> 2] = $8 - (32 <= ($4 & 63) >>> 0 ? $6 >> $17 : ((1 << $17) - 1 & $6) << 32 - $17 | $11 >>> $17); $9 = $12; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if ($3 >>> 0 >= 3) { if (($3 | 0) != 4) { if (($1 | 0) < 1) { break label$1 } $18 = HEAP32[$0 + -4 >> 2]; $15 = HEAP32[$0 + -8 >> 2]; $7 = HEAP32[$0 + -12 >> 2]; $3 = HEAP32[$2 >> 2]; $19 = $3; $14 = $3 >> 31; $3 = HEAP32[$2 + 4 >> 2]; $13 = $3; $10 = $3 >> 31; $2 = HEAP32[$2 + 8 >> 2]; $16 = $2; $17 = $2 >> 31; $2 = 0; while (1) { $3 = $15; $15 = $18; $18 = $2 << 2; $11 = $18 + $5 | 0; $18 = HEAP32[$0 + $18 >> 2]; $9 = $18; $8 = __wasm_i64_mul($3, $3 >> 31, $13, $10); $12 = i64toi32_i32$HIGH_BITS; $7 = __wasm_i64_mul($7, $7 >> 31, $16, $17); $8 = $7 + $8 | 0; $6 = i64toi32_i32$HIGH_BITS + $12 | 0; $6 = $8 >>> 0 < $7 >>> 0 ? $6 + 1 | 0 : $6; $7 = __wasm_i64_mul($15, $15 >> 31, $19, $14); $12 = $7 + $8 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $12 >>> 0 < $7 >>> 0 ? $6 + 1 | 0 : $6; $7 = $4; $8 = $7 & 31; HEAP32[$11 >> 2] = $9 - (32 <= ($7 & 63) >>> 0 ? $6 >> $8 : ((1 << $8) - 1 & $6) << 32 - $8 | $12 >>> $8); $7 = $3; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $7 = HEAP32[$0 + -4 >> 2]; $15 = HEAP32[$0 + -8 >> 2]; $3 = HEAP32[$0 + -12 >> 2]; $12 = HEAP32[$0 + -16 >> 2]; $18 = HEAP32[$2 >> 2]; $21 = $18; $22 = $18 >> 31; $18 = HEAP32[$2 + 4 >> 2]; $20 = $18; $19 = $18 >> 31; $18 = HEAP32[$2 + 8 >> 2]; $14 = $18; $13 = $14 >> 31; $2 = HEAP32[$2 + 12 >> 2]; $10 = $2; $16 = $2 >> 31; $2 = 0; while (1) { $18 = $3; $3 = $15; $15 = $7; $7 = $2 << 2; $17 = $7 + $5 | 0; $7 = HEAP32[$0 + $7 >> 2]; $9 = __wasm_i64_mul($18, $18 >> 31, $14, $13); $8 = i64toi32_i32$HIGH_BITS; $12 = __wasm_i64_mul($12, $12 >> 31, $10, $16); $9 = $12 + $9 | 0; $6 = i64toi32_i32$HIGH_BITS + $8 | 0; $6 = $9 >>> 0 < $12 >>> 0 ? $6 + 1 | 0 : $6; $12 = __wasm_i64_mul($3, $3 >> 31, $20, $19); $8 = $12 + $9 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $8 >>> 0 < $12 >>> 0 ? $6 + 1 | 0 : $6; $12 = __wasm_i64_mul($15, $15 >> 31, $21, $22); $8 = $12 + $8 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $8 >>> 0 < $12 >>> 0 ? $6 + 1 | 0 : $6; $9 = $4 & 31; HEAP32[$17 >> 2] = $7 - (32 <= ($4 & 63) >>> 0 ? $6 >> $9 : ((1 << $9) - 1 & $6) << 32 - $9 | $8 >>> $9); $12 = $18; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($3 | 0) != 2) { if (($1 | 0) < 1) { break label$1 } $15 = HEAP32[$0 + -4 >> 2]; $2 = HEAP32[$2 >> 2]; $9 = $2; $8 = $2 >> 31; $2 = 0; while (1) { $3 = $2 << 2; $6 = $3 + $5 | 0; $18 = HEAP32[$0 + $3 >> 2]; $15 = __wasm_i64_mul($15, $15 >> 31, $9, $8); $7 = i64toi32_i32$HIGH_BITS; $3 = $4; $12 = $3 & 31; HEAP32[$6 >> 2] = $18 - (32 <= ($3 & 63) >>> 0 ? $7 >> $12 : ((1 << $12) - 1 & $7) << 32 - $12 | $15 >>> $12); $15 = $18; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $3 = HEAP32[$0 + -4 >> 2]; $18 = HEAP32[$0 + -8 >> 2]; $15 = HEAP32[$2 >> 2]; $10 = $15; $16 = $10 >> 31; $2 = HEAP32[$2 + 4 >> 2]; $17 = $2; $11 = $2 >> 31; $2 = 0; while (1) { $15 = $3; $3 = $2 << 2; $9 = $3 + $5 | 0; $3 = HEAP32[$0 + $3 >> 2]; $12 = __wasm_i64_mul($15, $15 >> 31, $10, $16); $7 = i64toi32_i32$HIGH_BITS; $18 = __wasm_i64_mul($18, $18 >> 31, $17, $11); $12 = $18 + $12 | 0; $6 = i64toi32_i32$HIGH_BITS + $7 | 0; $6 = $12 >>> 0 < $18 >>> 0 ? $6 + 1 | 0 : $6; $7 = $12; $12 = $4 & 31; HEAP32[$9 >> 2] = $3 - (32 <= ($4 & 63) >>> 0 ? $6 >> $12 : ((1 << $12) - 1 & $6) << 32 - $12 | $7 >>> $12); $18 = $15; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__lpc_restore_signal($0, $1, $2, $3, $4, $5) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; $4 = $4 | 0; $5 = $5 | 0; var $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0, $22 = 0, $23 = 0, $24 = 0, $25 = 0, $26 = 0, $27 = 0, $28 = 0, $29 = 0, $30 = 0; label$1 : { if ($3 >>> 0 >= 13) { if (($1 | 0) < 1) { break label$1 } $17 = $3 + -13 | 0; while (1) { $25 = 0; $26 = 0; $23 = 0; $24 = 0; $21 = 0; $22 = 0; $19 = 0; $20 = 0; $18 = 0; $15 = 0; $12 = 0; $10 = 0; $14 = 0; $9 = 0; $13 = 0; $7 = 0; $16 = 0; $11 = 0; $8 = 0; $3 = 0; label$4 : { switch ($17 | 0) { case 19: $25 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -128 >> 2], HEAP32[$2 + 124 >> 2]); case 18: $26 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -124 >> 2], HEAP32[$2 + 120 >> 2]) + $25 | 0; case 17: $23 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -120 >> 2], HEAP32[$2 + 116 >> 2]) + $26 | 0; case 16: $24 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -116 >> 2], HEAP32[$2 + 112 >> 2]) + $23 | 0; case 15: $21 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -112 >> 2], HEAP32[$2 + 108 >> 2]) + $24 | 0; case 14: $22 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -108 >> 2], HEAP32[$2 + 104 >> 2]) + $21 | 0; case 13: $19 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -104 >> 2], HEAP32[$2 + 100 >> 2]) + $22 | 0; case 12: $20 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -100 >> 2], HEAP32[$2 + 96 >> 2]) + $19 | 0; case 11: $18 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -96 >> 2], HEAP32[$2 + 92 >> 2]) + $20 | 0; case 10: $15 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -92 >> 2], HEAP32[$2 + 88 >> 2]) + $18 | 0; case 9: $12 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -88 >> 2], HEAP32[$2 + 84 >> 2]) + $15 | 0; case 8: $10 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -84 >> 2], HEAP32[$2 + 80 >> 2]) + $12 | 0; case 7: $14 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -80 >> 2], HEAP32[$2 + 76 >> 2]) + $10 | 0; case 6: $9 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -76 >> 2], HEAP32[$2 + 72 >> 2]) + $14 | 0; case 5: $13 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -72 >> 2], HEAP32[$2 + 68 >> 2]) + $9 | 0; case 4: $7 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -68 >> 2], HEAP32[$2 + 64 >> 2]) + $13 | 0; case 3: $16 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -64 >> 2], HEAP32[$2 + 60 >> 2]) + $7 | 0; case 2: $11 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -60 >> 2], HEAP32[$2 + 56 >> 2]) + $16 | 0; case 1: $8 = Math_imul(HEAP32[(($6 << 2) + $5 | 0) + -56 >> 2], HEAP32[$2 + 52 >> 2]) + $11 | 0; case 0: $3 = ($6 << 2) + $5 | 0; $3 = ((((((((((((Math_imul(HEAP32[$3 + -52 >> 2], HEAP32[$2 + 48 >> 2]) + $8 | 0) + Math_imul(HEAP32[$3 + -48 >> 2], HEAP32[$2 + 44 >> 2]) | 0) + Math_imul(HEAP32[$3 + -44 >> 2], HEAP32[$2 + 40 >> 2]) | 0) + Math_imul(HEAP32[$3 + -40 >> 2], HEAP32[$2 + 36 >> 2]) | 0) + Math_imul(HEAP32[$3 + -36 >> 2], HEAP32[$2 + 32 >> 2]) | 0) + Math_imul(HEAP32[$3 + -32 >> 2], HEAP32[$2 + 28 >> 2]) | 0) + Math_imul(HEAP32[$3 + -28 >> 2], HEAP32[$2 + 24 >> 2]) | 0) + Math_imul(HEAP32[$3 + -24 >> 2], HEAP32[$2 + 20 >> 2]) | 0) + Math_imul(HEAP32[$3 + -20 >> 2], HEAP32[$2 + 16 >> 2]) | 0) + Math_imul(HEAP32[$3 + -16 >> 2], HEAP32[$2 + 12 >> 2]) | 0) + Math_imul(HEAP32[$3 + -12 >> 2], HEAP32[$2 + 8 >> 2]) | 0) + Math_imul(HEAP32[$3 + -8 >> 2], HEAP32[$2 + 4 >> 2]) | 0) + Math_imul(HEAP32[$3 + -4 >> 2], HEAP32[$2 >> 2]) | 0; break; default: break label$4; }; } $8 = $6 << 2; HEAP32[$8 + $5 >> 2] = HEAP32[$0 + $8 >> 2] + ($3 >> $4); $6 = $6 + 1 | 0; if (($6 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if ($3 >>> 0 >= 9) { if ($3 >>> 0 >= 11) { if (($3 | 0) != 12) { if (($1 | 0) < 1) { break label$1 } $6 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $8 = HEAP32[$5 + -12 >> 2]; $11 = HEAP32[$5 + -16 >> 2]; $16 = HEAP32[$5 + -20 >> 2]; $7 = HEAP32[$5 + -24 >> 2]; $13 = HEAP32[$5 + -28 >> 2]; $9 = HEAP32[$5 + -32 >> 2]; $14 = HEAP32[$5 + -36 >> 2]; $10 = HEAP32[$5 + -40 >> 2]; $12 = HEAP32[$5 + -44 >> 2]; $27 = HEAP32[$2 >> 2]; $28 = HEAP32[$2 + 4 >> 2]; $25 = HEAP32[$2 + 8 >> 2]; $26 = HEAP32[$2 + 12 >> 2]; $23 = HEAP32[$2 + 16 >> 2]; $24 = HEAP32[$2 + 20 >> 2]; $21 = HEAP32[$2 + 24 >> 2]; $22 = HEAP32[$2 + 28 >> 2]; $19 = HEAP32[$2 + 32 >> 2]; $20 = HEAP32[$2 + 36 >> 2]; $18 = HEAP32[$2 + 40 >> 2]; $2 = 0; while (1) { $17 = $10; $12 = Math_imul($10, $20) + Math_imul($12, $18) | 0; $10 = $14; $12 = $12 + Math_imul($19, $10) | 0; $14 = $9; $12 = Math_imul($9, $22) + $12 | 0; $9 = $13; $12 = $12 + Math_imul($21, $9) | 0; $13 = $7; $12 = Math_imul($7, $24) + $12 | 0; $7 = $16; $12 = $12 + Math_imul($23, $7) | 0; $16 = $11; $12 = Math_imul($11, $26) + $12 | 0; $11 = $8; $15 = Math_imul($8, $25) + $12 | 0; $8 = $3; $12 = $2 << 2; $15 = Math_imul($3, $28) + $15 | 0; $3 = $6; $6 = HEAP32[$12 + $0 >> 2] + ($15 + Math_imul($27, $3) >> $4) | 0; HEAP32[$5 + $12 >> 2] = $6; $12 = $17; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $6 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $8 = HEAP32[$5 + -12 >> 2]; $11 = HEAP32[$5 + -16 >> 2]; $16 = HEAP32[$5 + -20 >> 2]; $7 = HEAP32[$5 + -24 >> 2]; $13 = HEAP32[$5 + -28 >> 2]; $9 = HEAP32[$5 + -32 >> 2]; $14 = HEAP32[$5 + -36 >> 2]; $10 = HEAP32[$5 + -40 >> 2]; $12 = HEAP32[$5 + -44 >> 2]; $15 = HEAP32[$5 + -48 >> 2]; $29 = HEAP32[$2 >> 2]; $30 = HEAP32[$2 + 4 >> 2]; $27 = HEAP32[$2 + 8 >> 2]; $28 = HEAP32[$2 + 12 >> 2]; $25 = HEAP32[$2 + 16 >> 2]; $26 = HEAP32[$2 + 20 >> 2]; $23 = HEAP32[$2 + 24 >> 2]; $24 = HEAP32[$2 + 28 >> 2]; $21 = HEAP32[$2 + 32 >> 2]; $22 = HEAP32[$2 + 36 >> 2]; $19 = HEAP32[$2 + 40 >> 2]; $20 = HEAP32[$2 + 44 >> 2]; $2 = 0; while (1) { $17 = $12; $15 = Math_imul($12, $19) + Math_imul($15, $20) | 0; $12 = $10; $15 = Math_imul($10, $22) + $15 | 0; $10 = $14; $15 = $15 + Math_imul($21, $10) | 0; $14 = $9; $15 = Math_imul($9, $24) + $15 | 0; $9 = $13; $15 = $15 + Math_imul($23, $9) | 0; $13 = $7; $15 = Math_imul($7, $26) + $15 | 0; $7 = $16; $15 = $15 + Math_imul($25, $7) | 0; $16 = $11; $15 = Math_imul($11, $28) + $15 | 0; $11 = $8; $18 = Math_imul($8, $27) + $15 | 0; $8 = $3; $15 = $2 << 2; $18 = Math_imul($3, $30) + $18 | 0; $3 = $6; $6 = HEAP32[$15 + $0 >> 2] + ($18 + Math_imul($29, $3) >> $4) | 0; HEAP32[$5 + $15 >> 2] = $6; $15 = $17; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($3 | 0) != 10) { if (($1 | 0) < 1) { break label$1 } $6 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $8 = HEAP32[$5 + -12 >> 2]; $11 = HEAP32[$5 + -16 >> 2]; $16 = HEAP32[$5 + -20 >> 2]; $7 = HEAP32[$5 + -24 >> 2]; $13 = HEAP32[$5 + -28 >> 2]; $9 = HEAP32[$5 + -32 >> 2]; $14 = HEAP32[$5 + -36 >> 2]; $23 = HEAP32[$2 >> 2]; $24 = HEAP32[$2 + 4 >> 2]; $21 = HEAP32[$2 + 8 >> 2]; $22 = HEAP32[$2 + 12 >> 2]; $19 = HEAP32[$2 + 16 >> 2]; $20 = HEAP32[$2 + 20 >> 2]; $18 = HEAP32[$2 + 24 >> 2]; $15 = HEAP32[$2 + 28 >> 2]; $17 = HEAP32[$2 + 32 >> 2]; $2 = 0; while (1) { $10 = $9; $14 = Math_imul($9, $15) + Math_imul($14, $17) | 0; $9 = $13; $14 = $14 + Math_imul($18, $9) | 0; $13 = $7; $14 = Math_imul($7, $20) + $14 | 0; $7 = $16; $14 = $14 + Math_imul($19, $7) | 0; $16 = $11; $14 = Math_imul($11, $22) + $14 | 0; $11 = $8; $12 = Math_imul($8, $21) + $14 | 0; $8 = $3; $14 = $2 << 2; $12 = Math_imul($3, $24) + $12 | 0; $3 = $6; $6 = HEAP32[$14 + $0 >> 2] + ($12 + Math_imul($23, $3) >> $4) | 0; HEAP32[$5 + $14 >> 2] = $6; $14 = $10; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $6 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $8 = HEAP32[$5 + -12 >> 2]; $11 = HEAP32[$5 + -16 >> 2]; $16 = HEAP32[$5 + -20 >> 2]; $7 = HEAP32[$5 + -24 >> 2]; $13 = HEAP32[$5 + -28 >> 2]; $9 = HEAP32[$5 + -32 >> 2]; $14 = HEAP32[$5 + -36 >> 2]; $10 = HEAP32[$5 + -40 >> 2]; $25 = HEAP32[$2 >> 2]; $26 = HEAP32[$2 + 4 >> 2]; $23 = HEAP32[$2 + 8 >> 2]; $24 = HEAP32[$2 + 12 >> 2]; $21 = HEAP32[$2 + 16 >> 2]; $22 = HEAP32[$2 + 20 >> 2]; $19 = HEAP32[$2 + 24 >> 2]; $20 = HEAP32[$2 + 28 >> 2]; $18 = HEAP32[$2 + 32 >> 2]; $15 = HEAP32[$2 + 36 >> 2]; $2 = 0; while (1) { $12 = $14; $10 = Math_imul($18, $12) + Math_imul($10, $15) | 0; $14 = $9; $10 = Math_imul($9, $20) + $10 | 0; $9 = $13; $10 = $10 + Math_imul($19, $9) | 0; $13 = $7; $10 = Math_imul($7, $22) + $10 | 0; $7 = $16; $10 = $10 + Math_imul($21, $7) | 0; $16 = $11; $10 = Math_imul($11, $24) + $10 | 0; $11 = $8; $17 = Math_imul($8, $23) + $10 | 0; $8 = $3; $10 = $2 << 2; $17 = Math_imul($3, $26) + $17 | 0; $3 = $6; $6 = HEAP32[$10 + $0 >> 2] + ($17 + Math_imul($25, $3) >> $4) | 0; HEAP32[$5 + $10 >> 2] = $6; $10 = $12; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if ($3 >>> 0 >= 5) { if ($3 >>> 0 >= 7) { if (($3 | 0) != 8) { if (($1 | 0) < 1) { break label$1 } $6 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $8 = HEAP32[$5 + -12 >> 2]; $11 = HEAP32[$5 + -16 >> 2]; $16 = HEAP32[$5 + -20 >> 2]; $7 = HEAP32[$5 + -24 >> 2]; $13 = HEAP32[$5 + -28 >> 2]; $19 = HEAP32[$2 >> 2]; $20 = HEAP32[$2 + 4 >> 2]; $18 = HEAP32[$2 + 8 >> 2]; $15 = HEAP32[$2 + 12 >> 2]; $17 = HEAP32[$2 + 16 >> 2]; $12 = HEAP32[$2 + 20 >> 2]; $10 = HEAP32[$2 + 24 >> 2]; $2 = 0; while (1) { $9 = $7; $13 = Math_imul($7, $12) + Math_imul($10, $13) | 0; $7 = $16; $13 = $13 + Math_imul($17, $7) | 0; $16 = $11; $13 = Math_imul($11, $15) + $13 | 0; $11 = $8; $14 = Math_imul($8, $18) + $13 | 0; $8 = $3; $13 = $2 << 2; $14 = Math_imul($3, $20) + $14 | 0; $3 = $6; $6 = HEAP32[$13 + $0 >> 2] + ($14 + Math_imul($19, $3) >> $4) | 0; HEAP32[$5 + $13 >> 2] = $6; $13 = $9; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $6 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $8 = HEAP32[$5 + -12 >> 2]; $11 = HEAP32[$5 + -16 >> 2]; $16 = HEAP32[$5 + -20 >> 2]; $7 = HEAP32[$5 + -24 >> 2]; $13 = HEAP32[$5 + -28 >> 2]; $9 = HEAP32[$5 + -32 >> 2]; $21 = HEAP32[$2 >> 2]; $22 = HEAP32[$2 + 4 >> 2]; $19 = HEAP32[$2 + 8 >> 2]; $20 = HEAP32[$2 + 12 >> 2]; $18 = HEAP32[$2 + 16 >> 2]; $15 = HEAP32[$2 + 20 >> 2]; $17 = HEAP32[$2 + 24 >> 2]; $12 = HEAP32[$2 + 28 >> 2]; $2 = 0; while (1) { $14 = $13; $9 = Math_imul($17, $13) + Math_imul($9, $12) | 0; $13 = $7; $9 = Math_imul($7, $15) + $9 | 0; $7 = $16; $9 = $9 + Math_imul($18, $7) | 0; $16 = $11; $9 = Math_imul($11, $20) + $9 | 0; $11 = $8; $10 = Math_imul($8, $19) + $9 | 0; $8 = $3; $9 = $2 << 2; $10 = Math_imul($3, $22) + $10 | 0; $3 = $6; $6 = HEAP32[$9 + $0 >> 2] + ($10 + Math_imul($21, $3) >> $4) | 0; HEAP32[$5 + $9 >> 2] = $6; $9 = $14; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($3 | 0) != 6) { if (($1 | 0) < 1) { break label$1 } $6 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $8 = HEAP32[$5 + -12 >> 2]; $11 = HEAP32[$5 + -16 >> 2]; $16 = HEAP32[$5 + -20 >> 2]; $17 = HEAP32[$2 >> 2]; $12 = HEAP32[$2 + 4 >> 2]; $10 = HEAP32[$2 + 8 >> 2]; $14 = HEAP32[$2 + 12 >> 2]; $9 = HEAP32[$2 + 16 >> 2]; $2 = 0; while (1) { $7 = $11; $16 = Math_imul($14, $7) + Math_imul($9, $16) | 0; $11 = $8; $13 = Math_imul($8, $10) + $16 | 0; $8 = $3; $16 = $2 << 2; $13 = Math_imul($3, $12) + $13 | 0; $3 = $6; $6 = HEAP32[$16 + $0 >> 2] + ($13 + Math_imul($17, $3) >> $4) | 0; HEAP32[$5 + $16 >> 2] = $6; $16 = $7; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $6 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $8 = HEAP32[$5 + -12 >> 2]; $11 = HEAP32[$5 + -16 >> 2]; $16 = HEAP32[$5 + -20 >> 2]; $7 = HEAP32[$5 + -24 >> 2]; $18 = HEAP32[$2 >> 2]; $15 = HEAP32[$2 + 4 >> 2]; $17 = HEAP32[$2 + 8 >> 2]; $12 = HEAP32[$2 + 12 >> 2]; $10 = HEAP32[$2 + 16 >> 2]; $14 = HEAP32[$2 + 20 >> 2]; $2 = 0; while (1) { $13 = $16; $7 = Math_imul($10, $13) + Math_imul($7, $14) | 0; $16 = $11; $7 = Math_imul($11, $12) + $7 | 0; $11 = $8; $9 = Math_imul($8, $17) + $7 | 0; $8 = $3; $7 = $2 << 2; $9 = Math_imul($3, $15) + $9 | 0; $3 = $6; $6 = HEAP32[$7 + $0 >> 2] + ($9 + Math_imul($18, $3) >> $4) | 0; HEAP32[$5 + $7 >> 2] = $6; $7 = $13; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if ($3 >>> 0 >= 3) { if (($3 | 0) != 4) { if (($1 | 0) < 1) { break label$1 } $6 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $8 = HEAP32[$5 + -12 >> 2]; $9 = HEAP32[$2 >> 2]; $13 = HEAP32[$2 + 4 >> 2]; $7 = HEAP32[$2 + 8 >> 2]; $2 = 0; while (1) { $11 = $3; $16 = $2 << 2; $8 = Math_imul($3, $13) + Math_imul($8, $7) | 0; $3 = $6; $6 = HEAP32[$16 + $0 >> 2] + ($8 + Math_imul($9, $3) >> $4) | 0; HEAP32[$5 + $16 >> 2] = $6; $8 = $11; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $6 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $8 = HEAP32[$5 + -12 >> 2]; $11 = HEAP32[$5 + -16 >> 2]; $10 = HEAP32[$2 >> 2]; $14 = HEAP32[$2 + 4 >> 2]; $9 = HEAP32[$2 + 8 >> 2]; $13 = HEAP32[$2 + 12 >> 2]; $2 = 0; while (1) { $16 = $8; $7 = Math_imul($8, $9) + Math_imul($11, $13) | 0; $8 = $3; $11 = $2 << 2; $7 = Math_imul($3, $14) + $7 | 0; $3 = $6; $6 = HEAP32[$11 + $0 >> 2] + ($7 + Math_imul($10, $3) >> $4) | 0; HEAP32[$5 + $11 >> 2] = $6; $11 = $16; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($3 | 0) != 2) { if (($1 | 0) < 1) { break label$1 } $6 = HEAP32[$5 + -4 >> 2]; $8 = HEAP32[$2 >> 2]; $2 = 0; while (1) { $3 = $2 << 2; $6 = HEAP32[$3 + $0 >> 2] + (Math_imul($6, $8) >> $4) | 0; HEAP32[$3 + $5 >> 2] = $6; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $6 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $7 = HEAP32[$2 >> 2]; $16 = HEAP32[$2 + 4 >> 2]; $2 = 0; while (1) { $8 = $6; $11 = $2 << 2; $6 = HEAP32[$11 + $0 >> 2] + (Math_imul($6, $7) + Math_imul($3, $16) >> $4) | 0; HEAP32[$5 + $11 >> 2] = $6; $3 = $8; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__lpc_restore_signal_wide($0, $1, $2, $3, $4, $5) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; $4 = $4 | 0; $5 = $5 | 0; var $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0, $22 = 0, $23 = 0, $24 = 0, $25 = 0, $26 = 0, $27 = 0, $28 = 0, $29 = 0, $30 = 0, $31 = 0, $32 = 0, $33 = 0, $34 = 0, $35 = 0, $36 = 0, $37 = 0, $38 = 0, $39 = 0, $40 = 0, $41 = 0, $42 = 0, $43 = 0, $44 = 0, $45 = 0, $46 = 0; label$1 : { if ($3 >>> 0 >= 13) { if (($1 | 0) < 1) { break label$1 } $13 = $4; $12 = $3 + -13 | 0; while (1) { $4 = 0; $3 = 0; label$4 : { switch ($12 | 0) { case 19: $3 = HEAP32[(($9 << 2) + $5 | 0) + -128 >> 2]; $4 = $3; $7 = $3 >> 31; $3 = HEAP32[$2 + 124 >> 2]; $4 = __wasm_i64_mul($4, $7, $3, $3 >> 31); $3 = i64toi32_i32$HIGH_BITS; case 18: $7 = HEAP32[(($9 << 2) + $5 | 0) + -124 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 120 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 17: $7 = HEAP32[(($9 << 2) + $5 | 0) + -120 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 116 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 16: $7 = HEAP32[(($9 << 2) + $5 | 0) + -116 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 112 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 15: $7 = HEAP32[(($9 << 2) + $5 | 0) + -112 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 108 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 14: $7 = HEAP32[(($9 << 2) + $5 | 0) + -108 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 104 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 13: $7 = HEAP32[(($9 << 2) + $5 | 0) + -104 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 100 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 12: $7 = HEAP32[(($9 << 2) + $5 | 0) + -100 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 96 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 11: $7 = HEAP32[(($9 << 2) + $5 | 0) + -96 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 92 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 10: $7 = HEAP32[(($9 << 2) + $5 | 0) + -92 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 88 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 9: $7 = HEAP32[(($9 << 2) + $5 | 0) + -88 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 84 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 8: $7 = HEAP32[(($9 << 2) + $5 | 0) + -84 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 80 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 7: $7 = HEAP32[(($9 << 2) + $5 | 0) + -80 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 76 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 6: $7 = HEAP32[(($9 << 2) + $5 | 0) + -76 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 72 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 5: $7 = HEAP32[(($9 << 2) + $5 | 0) + -72 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 68 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 4: $7 = HEAP32[(($9 << 2) + $5 | 0) + -68 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 64 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 3: $7 = HEAP32[(($9 << 2) + $5 | 0) + -64 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 60 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 2: $7 = HEAP32[(($9 << 2) + $5 | 0) + -60 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 56 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 1: $7 = HEAP32[(($9 << 2) + $5 | 0) + -56 >> 2]; $6 = $7; $8 = $7 >> 31; $7 = HEAP32[$2 + 52 >> 2]; $7 = __wasm_i64_mul($6, $8, $7, $7 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $7 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $7; $3 = $6; case 0: $7 = ($9 << 2) + $5 | 0; $8 = HEAP32[$7 + -52 >> 2]; $6 = $8; $10 = $8 >> 31; $8 = HEAP32[$2 + 48 >> 2]; $8 = __wasm_i64_mul($6, $10, $8, $8 >> 31) + $4 | 0; $6 = $3 + i64toi32_i32$HIGH_BITS | 0; $6 = $8 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $3 = HEAP32[$7 + -48 >> 2]; $4 = $3; $10 = $3 >> 31; $3 = HEAP32[$2 + 44 >> 2]; $4 = __wasm_i64_mul($4, $10, $3, $3 >> 31); $3 = $4 + $8 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $8 = $3; $3 = HEAP32[$7 + -44 >> 2]; $4 = $3; $10 = $3 >> 31; $3 = HEAP32[$2 + 40 >> 2]; $4 = __wasm_i64_mul($4, $10, $3, $3 >> 31); $3 = $8 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $8 = $3; $3 = HEAP32[$7 + -40 >> 2]; $4 = $3; $10 = $3 >> 31; $3 = HEAP32[$2 + 36 >> 2]; $4 = __wasm_i64_mul($4, $10, $3, $3 >> 31); $3 = $8 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $8 = $3; $3 = HEAP32[$7 + -36 >> 2]; $4 = $3; $10 = $3 >> 31; $3 = HEAP32[$2 + 32 >> 2]; $4 = __wasm_i64_mul($4, $10, $3, $3 >> 31); $3 = $8 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $8 = $3; $3 = HEAP32[$7 + -32 >> 2]; $4 = $3; $10 = $3 >> 31; $3 = HEAP32[$2 + 28 >> 2]; $4 = __wasm_i64_mul($4, $10, $3, $3 >> 31); $3 = $8 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $8 = $3; $3 = HEAP32[$7 + -28 >> 2]; $4 = $3; $10 = $3 >> 31; $3 = HEAP32[$2 + 24 >> 2]; $4 = __wasm_i64_mul($4, $10, $3, $3 >> 31); $3 = $8 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $8 = $3; $3 = HEAP32[$7 + -24 >> 2]; $4 = $3; $10 = $3 >> 31; $3 = HEAP32[$2 + 20 >> 2]; $4 = __wasm_i64_mul($4, $10, $3, $3 >> 31); $3 = $8 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $8 = $3; $3 = HEAP32[$7 + -20 >> 2]; $4 = $3; $10 = $3 >> 31; $3 = HEAP32[$2 + 16 >> 2]; $4 = __wasm_i64_mul($4, $10, $3, $3 >> 31); $3 = $8 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $8 = $3; $3 = HEAP32[$7 + -16 >> 2]; $4 = $3; $10 = $3 >> 31; $3 = HEAP32[$2 + 12 >> 2]; $4 = __wasm_i64_mul($4, $10, $3, $3 >> 31); $3 = $8 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $8 = $3; $3 = HEAP32[$7 + -12 >> 2]; $4 = $3; $10 = $3 >> 31; $3 = HEAP32[$2 + 8 >> 2]; $4 = __wasm_i64_mul($4, $10, $3, $3 >> 31); $3 = $8 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $8 = $3; $3 = HEAP32[$7 + -8 >> 2]; $4 = $3; $10 = $3 >> 31; $3 = HEAP32[$2 + 4 >> 2]; $4 = __wasm_i64_mul($4, $10, $3, $3 >> 31); $3 = $8 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $8 = $3; $3 = HEAP32[$7 + -4 >> 2]; $4 = $3; $7 = $3 >> 31; $3 = HEAP32[$2 >> 2]; $4 = __wasm_i64_mul($4, $7, $3, $3 >> 31); $3 = $8 + $4 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $4 >>> 0 ? $6 + 1 | 0 : $6; $4 = $3; $3 = $6; break; default: break label$4; }; } $7 = $9 << 2; $10 = $7 + $5 | 0; $6 = HEAP32[$0 + $7 >> 2]; $8 = $4; $4 = $13; $7 = $4 & 31; HEAP32[$10 >> 2] = $6 + (32 <= ($4 & 63) >>> 0 ? $3 >> $7 : ((1 << $7) - 1 & $3) << 32 - $7 | $8 >>> $7); $9 = $9 + 1 | 0; if (($9 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if ($3 >>> 0 >= 9) { if ($3 >>> 0 >= 11) { if (($3 | 0) != 12) { if (($1 | 0) < 1) { break label$1 } $9 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $13 = HEAP32[$5 + -12 >> 2]; $7 = HEAP32[$5 + -16 >> 2]; $8 = HEAP32[$5 + -20 >> 2]; $12 = HEAP32[$5 + -24 >> 2]; $10 = HEAP32[$5 + -28 >> 2]; $11 = HEAP32[$5 + -32 >> 2]; $14 = HEAP32[$5 + -36 >> 2]; $16 = HEAP32[$5 + -40 >> 2]; $15 = HEAP32[$5 + -44 >> 2]; $6 = HEAP32[$2 >> 2]; $17 = $6; $25 = $6 >> 31; $6 = HEAP32[$2 + 4 >> 2]; $26 = $6; $27 = $6 >> 31; $6 = HEAP32[$2 + 8 >> 2]; $24 = $6; $29 = $6 >> 31; $6 = HEAP32[$2 + 12 >> 2]; $30 = $6; $22 = $6 >> 31; $6 = HEAP32[$2 + 16 >> 2]; $31 = $6; $32 = $6 >> 31; $6 = HEAP32[$2 + 20 >> 2]; $28 = $6; $34 = $6 >> 31; $6 = HEAP32[$2 + 24 >> 2]; $35 = $6; $21 = $6 >> 31; $6 = HEAP32[$2 + 28 >> 2]; $36 = $6; $37 = $6 >> 31; $6 = HEAP32[$2 + 32 >> 2]; $33 = $6; $39 = $6 >> 31; $6 = HEAP32[$2 + 36 >> 2]; $40 = $6; $20 = $6 >> 31; $2 = HEAP32[$2 + 40 >> 2]; $41 = $2; $42 = $2 >> 31; $2 = 0; while (1) { $6 = $2 << 2; $38 = $6 + $5 | 0; $43 = HEAP32[$0 + $6 >> 2]; $18 = $16; $6 = __wasm_i64_mul($16, $16 >> 31, $40, $20); $44 = i64toi32_i32$HIGH_BITS; $16 = $14; $19 = __wasm_i64_mul($15, $15 >> 31, $41, $42); $15 = $19 + $6 | 0; $6 = i64toi32_i32$HIGH_BITS + $44 | 0; $6 = $15 >>> 0 < $19 >>> 0 ? $6 + 1 | 0 : $6; $19 = $15; $15 = __wasm_i64_mul($14, $14 >> 31, $33, $39); $14 = $19 + $15 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $14 >>> 0 < $15 >>> 0 ? $6 + 1 | 0 : $6; $15 = $14; $14 = $11; $19 = $15; $15 = __wasm_i64_mul($11, $11 >> 31, $36, $37); $11 = $19 + $15 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $11 >>> 0 < $15 >>> 0 ? $6 + 1 | 0 : $6; $15 = $11; $11 = $10; $10 = $15; $15 = __wasm_i64_mul($11, $11 >> 31, $35, $21); $10 = $10 + $15 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $10 >>> 0 < $15 >>> 0 ? $6 + 1 | 0 : $6; $15 = $10; $10 = $12; $19 = $15; $15 = __wasm_i64_mul($12, $12 >> 31, $28, $34); $12 = $19 + $15 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $12 >>> 0 < $15 >>> 0 ? $6 + 1 | 0 : $6; $15 = $12; $12 = $8; $19 = $15; $15 = __wasm_i64_mul($8, $8 >> 31, $31, $32); $8 = $19 + $15 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $8 >>> 0 < $15 >>> 0 ? $6 + 1 | 0 : $6; $15 = $8; $8 = $7; $19 = $15; $15 = __wasm_i64_mul($7, $7 >> 31, $30, $22); $7 = $19 + $15 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $7 >>> 0 < $15 >>> 0 ? $6 + 1 | 0 : $6; $19 = $7; $7 = $13; $15 = __wasm_i64_mul($7, $7 >> 31, $24, $29); $13 = $19 + $15 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $15 >>> 0 ? $6 + 1 | 0 : $6; $15 = $13; $13 = $3; $23 = $38; $19 = $15; $15 = __wasm_i64_mul($3, $3 >> 31, $26, $27); $3 = $19 + $15 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $15 >>> 0 ? $6 + 1 | 0 : $6; $19 = $3; $3 = $9; $15 = __wasm_i64_mul($3, $3 >> 31, $17, $25); $9 = $19 + $15 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $9 >>> 0 < $15 >>> 0 ? $6 + 1 | 0 : $6; $38 = $9; $9 = $4; $15 = $9 & 31; $9 = (32 <= ($9 & 63) >>> 0 ? $6 >> $15 : ((1 << $15) - 1 & $6) << 32 - $15 | $38 >>> $15) + $43 | 0; HEAP32[$23 >> 2] = $9; $15 = $18; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $9 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $13 = HEAP32[$5 + -12 >> 2]; $7 = HEAP32[$5 + -16 >> 2]; $8 = HEAP32[$5 + -20 >> 2]; $12 = HEAP32[$5 + -24 >> 2]; $10 = HEAP32[$5 + -28 >> 2]; $11 = HEAP32[$5 + -32 >> 2]; $14 = HEAP32[$5 + -36 >> 2]; $16 = HEAP32[$5 + -40 >> 2]; $15 = HEAP32[$5 + -44 >> 2]; $6 = HEAP32[$5 + -48 >> 2]; $18 = HEAP32[$2 >> 2]; $25 = $18; $26 = $18 >> 31; $18 = HEAP32[$2 + 4 >> 2]; $27 = $18; $24 = $18 >> 31; $18 = HEAP32[$2 + 8 >> 2]; $29 = $18; $30 = $18 >> 31; $18 = HEAP32[$2 + 12 >> 2]; $22 = $18; $31 = $18 >> 31; $18 = HEAP32[$2 + 16 >> 2]; $32 = $18; $28 = $18 >> 31; $18 = HEAP32[$2 + 20 >> 2]; $34 = $18; $35 = $18 >> 31; $18 = HEAP32[$2 + 24 >> 2]; $21 = $18; $36 = $18 >> 31; $18 = HEAP32[$2 + 28 >> 2]; $37 = $18; $33 = $18 >> 31; $18 = HEAP32[$2 + 32 >> 2]; $39 = $18; $40 = $18 >> 31; $18 = HEAP32[$2 + 36 >> 2]; $20 = $18; $41 = $18 >> 31; $18 = HEAP32[$2 + 40 >> 2]; $42 = $18; $38 = $18 >> 31; $2 = HEAP32[$2 + 44 >> 2]; $43 = $2; $44 = $2 >> 31; $2 = 0; while (1) { $18 = $2 << 2; $19 = $18 + $5 | 0; $46 = HEAP32[$0 + $18 >> 2]; $18 = $15; $17 = __wasm_i64_mul($15, $15 >> 31, $42, $38); $23 = i64toi32_i32$HIGH_BITS; $15 = $16; $45 = __wasm_i64_mul($6, $6 >> 31, $43, $44); $17 = $45 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $23 | 0; $6 = $17 >>> 0 < $45 >>> 0 ? $6 + 1 | 0 : $6; $23 = $17; $17 = __wasm_i64_mul($16, $16 >> 31, $20, $41); $16 = $23 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $16 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $17 = $16; $16 = $14; $23 = $17; $17 = __wasm_i64_mul($14, $14 >> 31, $39, $40); $14 = $23 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $14 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $17 = $14; $14 = $11; $23 = $17; $17 = __wasm_i64_mul($11, $11 >> 31, $37, $33); $11 = $23 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $11 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $17 = $11; $11 = $10; $10 = $17; $17 = __wasm_i64_mul($11, $11 >> 31, $21, $36); $10 = $10 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $10 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $17 = $10; $10 = $12; $23 = $17; $17 = __wasm_i64_mul($12, $12 >> 31, $34, $35); $12 = $23 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $12 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $17 = $12; $12 = $8; $23 = $17; $17 = __wasm_i64_mul($8, $8 >> 31, $32, $28); $8 = $23 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $8 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $17 = $8; $8 = $7; $23 = $17; $17 = __wasm_i64_mul($7, $7 >> 31, $22, $31); $7 = $23 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $7 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $23 = $7; $7 = $13; $17 = __wasm_i64_mul($7, $7 >> 31, $29, $30); $13 = $23 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $17 = $13; $13 = $3; $23 = $19; $19 = $17; $17 = __wasm_i64_mul($3, $3 >> 31, $27, $24); $3 = $19 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $19 = $3; $3 = $9; $17 = __wasm_i64_mul($3, $3 >> 31, $25, $26); $9 = $19 + $17 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $9 >>> 0 < $17 >>> 0 ? $6 + 1 | 0 : $6; $19 = $9; $9 = $4; $17 = $9 & 31; $9 = (32 <= ($9 & 63) >>> 0 ? $6 >> $17 : ((1 << $17) - 1 & $6) << 32 - $17 | $19 >>> $17) + $46 | 0; HEAP32[$23 >> 2] = $9; $6 = $18; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($3 | 0) != 10) { if (($1 | 0) < 1) { break label$1 } $9 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $13 = HEAP32[$5 + -12 >> 2]; $7 = HEAP32[$5 + -16 >> 2]; $8 = HEAP32[$5 + -20 >> 2]; $12 = HEAP32[$5 + -24 >> 2]; $10 = HEAP32[$5 + -28 >> 2]; $11 = HEAP32[$5 + -32 >> 2]; $14 = HEAP32[$5 + -36 >> 2]; $6 = HEAP32[$2 >> 2]; $15 = $6; $18 = $6 >> 31; $6 = HEAP32[$2 + 4 >> 2]; $17 = $6; $25 = $6 >> 31; $6 = HEAP32[$2 + 8 >> 2]; $26 = $6; $27 = $6 >> 31; $6 = HEAP32[$2 + 12 >> 2]; $24 = $6; $29 = $6 >> 31; $6 = HEAP32[$2 + 16 >> 2]; $30 = $6; $22 = $6 >> 31; $6 = HEAP32[$2 + 20 >> 2]; $31 = $6; $32 = $6 >> 31; $6 = HEAP32[$2 + 24 >> 2]; $28 = $6; $34 = $6 >> 31; $6 = HEAP32[$2 + 28 >> 2]; $35 = $6; $21 = $6 >> 31; $2 = HEAP32[$2 + 32 >> 2]; $36 = $2; $37 = $2 >> 31; $2 = 0; while (1) { $6 = $2 << 2; $33 = $6 + $5 | 0; $39 = HEAP32[$0 + $6 >> 2]; $16 = $11; $6 = __wasm_i64_mul($11, $11 >> 31, $35, $21); $40 = i64toi32_i32$HIGH_BITS; $11 = $10; $20 = __wasm_i64_mul($14, $14 >> 31, $36, $37); $14 = $20 + $6 | 0; $6 = i64toi32_i32$HIGH_BITS + $40 | 0; $6 = $14 >>> 0 < $20 >>> 0 ? $6 + 1 | 0 : $6; $10 = $14; $14 = __wasm_i64_mul($11, $11 >> 31, $28, $34); $10 = $10 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $10 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $14 = $10; $10 = $12; $20 = $14; $14 = __wasm_i64_mul($12, $12 >> 31, $31, $32); $12 = $20 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $12 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $14 = $12; $12 = $8; $20 = $14; $14 = __wasm_i64_mul($8, $8 >> 31, $30, $22); $8 = $20 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $8 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $14 = $8; $8 = $7; $20 = $14; $14 = __wasm_i64_mul($7, $7 >> 31, $24, $29); $7 = $20 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $7 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $20 = $7; $7 = $13; $14 = __wasm_i64_mul($7, $7 >> 31, $26, $27); $13 = $20 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $14 = $13; $13 = $3; $19 = $33; $20 = $14; $14 = __wasm_i64_mul($3, $3 >> 31, $17, $25); $3 = $20 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $20 = $3; $3 = $9; $14 = __wasm_i64_mul($3, $3 >> 31, $15, $18); $9 = $20 + $14 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $9 >>> 0 < $14 >>> 0 ? $6 + 1 | 0 : $6; $33 = $9; $9 = $4; $14 = $9 & 31; $9 = (32 <= ($9 & 63) >>> 0 ? $6 >> $14 : ((1 << $14) - 1 & $6) << 32 - $14 | $33 >>> $14) + $39 | 0; HEAP32[$19 >> 2] = $9; $14 = $16; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $9 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $13 = HEAP32[$5 + -12 >> 2]; $7 = HEAP32[$5 + -16 >> 2]; $8 = HEAP32[$5 + -20 >> 2]; $12 = HEAP32[$5 + -24 >> 2]; $10 = HEAP32[$5 + -28 >> 2]; $11 = HEAP32[$5 + -32 >> 2]; $14 = HEAP32[$5 + -36 >> 2]; $16 = HEAP32[$5 + -40 >> 2]; $6 = HEAP32[$2 >> 2]; $18 = $6; $17 = $6 >> 31; $6 = HEAP32[$2 + 4 >> 2]; $25 = $6; $26 = $6 >> 31; $6 = HEAP32[$2 + 8 >> 2]; $27 = $6; $24 = $6 >> 31; $6 = HEAP32[$2 + 12 >> 2]; $29 = $6; $30 = $6 >> 31; $6 = HEAP32[$2 + 16 >> 2]; $22 = $6; $31 = $6 >> 31; $6 = HEAP32[$2 + 20 >> 2]; $32 = $6; $28 = $6 >> 31; $6 = HEAP32[$2 + 24 >> 2]; $34 = $6; $35 = $6 >> 31; $6 = HEAP32[$2 + 28 >> 2]; $21 = $6; $36 = $6 >> 31; $6 = HEAP32[$2 + 32 >> 2]; $37 = $6; $33 = $6 >> 31; $2 = HEAP32[$2 + 36 >> 2]; $39 = $2; $40 = $2 >> 31; $2 = 0; while (1) { $6 = $2 << 2; $20 = $6 + $5 | 0; $41 = HEAP32[$0 + $6 >> 2]; $15 = $14; $6 = __wasm_i64_mul($14, $14 >> 31, $37, $33); $42 = i64toi32_i32$HIGH_BITS; $14 = $11; $38 = __wasm_i64_mul($16, $16 >> 31, $39, $40); $16 = $38 + $6 | 0; $6 = i64toi32_i32$HIGH_BITS + $42 | 0; $6 = $16 >>> 0 < $38 >>> 0 ? $6 + 1 | 0 : $6; $19 = $16; $16 = __wasm_i64_mul($11, $11 >> 31, $21, $36); $11 = $19 + $16 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $11 >>> 0 < $16 >>> 0 ? $6 + 1 | 0 : $6; $16 = $11; $11 = $10; $10 = $16; $16 = __wasm_i64_mul($11, $11 >> 31, $34, $35); $10 = $10 + $16 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $10 >>> 0 < $16 >>> 0 ? $6 + 1 | 0 : $6; $16 = $10; $10 = $12; $19 = $16; $16 = __wasm_i64_mul($12, $12 >> 31, $32, $28); $12 = $19 + $16 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $12 >>> 0 < $16 >>> 0 ? $6 + 1 | 0 : $6; $16 = $12; $12 = $8; $19 = $16; $16 = __wasm_i64_mul($8, $8 >> 31, $22, $31); $8 = $19 + $16 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $8 >>> 0 < $16 >>> 0 ? $6 + 1 | 0 : $6; $16 = $8; $8 = $7; $19 = $16; $16 = __wasm_i64_mul($7, $7 >> 31, $29, $30); $7 = $19 + $16 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $7 >>> 0 < $16 >>> 0 ? $6 + 1 | 0 : $6; $19 = $7; $7 = $13; $16 = __wasm_i64_mul($7, $7 >> 31, $27, $24); $13 = $19 + $16 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $16 >>> 0 ? $6 + 1 | 0 : $6; $16 = $13; $13 = $3; $19 = $20; $20 = $16; $16 = __wasm_i64_mul($3, $3 >> 31, $25, $26); $3 = $20 + $16 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $16 >>> 0 ? $6 + 1 | 0 : $6; $20 = $3; $3 = $9; $16 = __wasm_i64_mul($3, $3 >> 31, $18, $17); $9 = $20 + $16 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $9 >>> 0 < $16 >>> 0 ? $6 + 1 | 0 : $6; $20 = $9; $9 = $4; $16 = $9 & 31; $9 = (32 <= ($9 & 63) >>> 0 ? $6 >> $16 : ((1 << $16) - 1 & $6) << 32 - $16 | $20 >>> $16) + $41 | 0; HEAP32[$19 >> 2] = $9; $16 = $15; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if ($3 >>> 0 >= 5) { if ($3 >>> 0 >= 7) { if (($3 | 0) != 8) { if (($1 | 0) < 1) { break label$1 } $9 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $13 = HEAP32[$5 + -12 >> 2]; $7 = HEAP32[$5 + -16 >> 2]; $8 = HEAP32[$5 + -20 >> 2]; $12 = HEAP32[$5 + -24 >> 2]; $10 = HEAP32[$5 + -28 >> 2]; $11 = HEAP32[$2 >> 2]; $14 = $11; $16 = $11 >> 31; $11 = HEAP32[$2 + 4 >> 2]; $15 = $11; $18 = $11 >> 31; $11 = HEAP32[$2 + 8 >> 2]; $17 = $11; $25 = $11 >> 31; $11 = HEAP32[$2 + 12 >> 2]; $26 = $11; $27 = $11 >> 31; $11 = HEAP32[$2 + 16 >> 2]; $24 = $11; $29 = $11 >> 31; $11 = HEAP32[$2 + 20 >> 2]; $30 = $11; $22 = $11 >> 31; $2 = HEAP32[$2 + 24 >> 2]; $31 = $2; $32 = $2 >> 31; $2 = 0; while (1) { $11 = $2 << 2; $28 = $11 + $5 | 0; $34 = HEAP32[$0 + $11 >> 2]; $11 = $12; $6 = __wasm_i64_mul($11, $11 >> 31, $30, $22); $35 = i64toi32_i32$HIGH_BITS; $12 = $8; $21 = __wasm_i64_mul($10, $10 >> 31, $31, $32); $10 = $21 + $6 | 0; $6 = i64toi32_i32$HIGH_BITS + $35 | 0; $6 = $10 >>> 0 < $21 >>> 0 ? $6 + 1 | 0 : $6; $21 = $10; $10 = __wasm_i64_mul($8, $8 >> 31, $24, $29); $8 = $21 + $10 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $8 >>> 0 < $10 >>> 0 ? $6 + 1 | 0 : $6; $10 = $8; $8 = $7; $21 = $10; $10 = __wasm_i64_mul($7, $7 >> 31, $26, $27); $7 = $21 + $10 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $7 >>> 0 < $10 >>> 0 ? $6 + 1 | 0 : $6; $21 = $7; $7 = $13; $10 = __wasm_i64_mul($7, $7 >> 31, $17, $25); $13 = $21 + $10 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $10 >>> 0 ? $6 + 1 | 0 : $6; $10 = $13; $13 = $3; $20 = $28; $21 = $10; $10 = __wasm_i64_mul($3, $3 >> 31, $15, $18); $3 = $21 + $10 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $10 >>> 0 ? $6 + 1 | 0 : $6; $21 = $3; $3 = $9; $10 = __wasm_i64_mul($3, $3 >> 31, $14, $16); $9 = $21 + $10 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $9 >>> 0 < $10 >>> 0 ? $6 + 1 | 0 : $6; $28 = $9; $9 = $4; $10 = $9 & 31; $9 = (32 <= ($9 & 63) >>> 0 ? $6 >> $10 : ((1 << $10) - 1 & $6) << 32 - $10 | $28 >>> $10) + $34 | 0; HEAP32[$20 >> 2] = $9; $10 = $11; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $9 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $13 = HEAP32[$5 + -12 >> 2]; $7 = HEAP32[$5 + -16 >> 2]; $8 = HEAP32[$5 + -20 >> 2]; $12 = HEAP32[$5 + -24 >> 2]; $10 = HEAP32[$5 + -28 >> 2]; $11 = HEAP32[$5 + -32 >> 2]; $6 = HEAP32[$2 >> 2]; $16 = $6; $15 = $6 >> 31; $6 = HEAP32[$2 + 4 >> 2]; $18 = $6; $17 = $6 >> 31; $6 = HEAP32[$2 + 8 >> 2]; $25 = $6; $26 = $6 >> 31; $6 = HEAP32[$2 + 12 >> 2]; $27 = $6; $24 = $6 >> 31; $6 = HEAP32[$2 + 16 >> 2]; $29 = $6; $30 = $6 >> 31; $6 = HEAP32[$2 + 20 >> 2]; $22 = $6; $31 = $6 >> 31; $6 = HEAP32[$2 + 24 >> 2]; $32 = $6; $28 = $6 >> 31; $2 = HEAP32[$2 + 28 >> 2]; $34 = $2; $35 = $2 >> 31; $2 = 0; while (1) { $6 = $2 << 2; $21 = $6 + $5 | 0; $36 = HEAP32[$0 + $6 >> 2]; $14 = $10; $6 = __wasm_i64_mul($10, $10 >> 31, $32, $28); $37 = i64toi32_i32$HIGH_BITS; $10 = $12; $33 = __wasm_i64_mul($11, $11 >> 31, $34, $35); $11 = $33 + $6 | 0; $6 = i64toi32_i32$HIGH_BITS + $37 | 0; $6 = $11 >>> 0 < $33 >>> 0 ? $6 + 1 | 0 : $6; $20 = $11; $11 = __wasm_i64_mul($12, $12 >> 31, $22, $31); $12 = $20 + $11 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $12 >>> 0 < $11 >>> 0 ? $6 + 1 | 0 : $6; $11 = $12; $12 = $8; $20 = $11; $11 = __wasm_i64_mul($8, $8 >> 31, $29, $30); $8 = $20 + $11 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $8 >>> 0 < $11 >>> 0 ? $6 + 1 | 0 : $6; $11 = $8; $8 = $7; $20 = $11; $11 = __wasm_i64_mul($7, $7 >> 31, $27, $24); $7 = $20 + $11 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $7 >>> 0 < $11 >>> 0 ? $6 + 1 | 0 : $6; $20 = $7; $7 = $13; $11 = __wasm_i64_mul($7, $7 >> 31, $25, $26); $13 = $20 + $11 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $11 >>> 0 ? $6 + 1 | 0 : $6; $11 = $13; $13 = $3; $20 = $21; $21 = $11; $11 = __wasm_i64_mul($3, $3 >> 31, $18, $17); $3 = $21 + $11 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $11 >>> 0 ? $6 + 1 | 0 : $6; $21 = $3; $3 = $9; $11 = __wasm_i64_mul($3, $3 >> 31, $16, $15); $9 = $21 + $11 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $9 >>> 0 < $11 >>> 0 ? $6 + 1 | 0 : $6; $21 = $9; $9 = $4; $11 = $9 & 31; $9 = (32 <= ($9 & 63) >>> 0 ? $6 >> $11 : ((1 << $11) - 1 & $6) << 32 - $11 | $21 >>> $11) + $36 | 0; HEAP32[$20 >> 2] = $9; $11 = $14; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($3 | 0) != 6) { if (($1 | 0) < 1) { break label$1 } $9 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $13 = HEAP32[$5 + -12 >> 2]; $7 = HEAP32[$5 + -16 >> 2]; $8 = HEAP32[$5 + -20 >> 2]; $12 = HEAP32[$2 >> 2]; $10 = $12; $11 = $12 >> 31; $12 = HEAP32[$2 + 4 >> 2]; $14 = $12; $16 = $12 >> 31; $12 = HEAP32[$2 + 8 >> 2]; $15 = $12; $18 = $12 >> 31; $12 = HEAP32[$2 + 12 >> 2]; $17 = $12; $25 = $12 >> 31; $2 = HEAP32[$2 + 16 >> 2]; $26 = $2; $27 = $2 >> 31; $2 = 0; while (1) { $12 = $2 << 2; $24 = $12 + $5 | 0; $29 = HEAP32[$0 + $12 >> 2]; $12 = $7; $6 = __wasm_i64_mul($7, $7 >> 31, $17, $25); $30 = i64toi32_i32$HIGH_BITS; $7 = $13; $22 = __wasm_i64_mul($8, $8 >> 31, $26, $27); $8 = $22 + $6 | 0; $6 = i64toi32_i32$HIGH_BITS + $30 | 0; $6 = $8 >>> 0 < $22 >>> 0 ? $6 + 1 | 0 : $6; $13 = $8; $8 = __wasm_i64_mul($7, $7 >> 31, $15, $18); $13 = $13 + $8 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $8 >>> 0 ? $6 + 1 | 0 : $6; $8 = $13; $13 = $3; $22 = $8; $8 = __wasm_i64_mul($3, $3 >> 31, $14, $16); $3 = $22 + $8 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $8 >>> 0 ? $6 + 1 | 0 : $6; $8 = $3; $3 = $9; $9 = __wasm_i64_mul($3, $3 >> 31, $10, $11); $8 = $8 + $9 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $8 >>> 0 < $9 >>> 0 ? $6 + 1 | 0 : $6; $9 = $4 & 31; $9 = (32 <= ($4 & 63) >>> 0 ? $6 >> $9 : ((1 << $9) - 1 & $6) << 32 - $9 | $8 >>> $9) + $29 | 0; HEAP32[$24 >> 2] = $9; $8 = $12; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $9 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $13 = HEAP32[$5 + -12 >> 2]; $7 = HEAP32[$5 + -16 >> 2]; $8 = HEAP32[$5 + -20 >> 2]; $12 = HEAP32[$5 + -24 >> 2]; $10 = HEAP32[$2 >> 2]; $11 = $10; $14 = $11 >> 31; $10 = HEAP32[$2 + 4 >> 2]; $16 = $10; $15 = $10 >> 31; $10 = HEAP32[$2 + 8 >> 2]; $18 = $10; $17 = $10 >> 31; $10 = HEAP32[$2 + 12 >> 2]; $25 = $10; $26 = $10 >> 31; $10 = HEAP32[$2 + 16 >> 2]; $27 = $10; $24 = $10 >> 31; $2 = HEAP32[$2 + 20 >> 2]; $29 = $2; $30 = $2 >> 31; $2 = 0; while (1) { $10 = $2 << 2; $22 = $10 + $5 | 0; $31 = HEAP32[$0 + $10 >> 2]; $10 = $8; $6 = __wasm_i64_mul($8, $8 >> 31, $27, $24); $32 = i64toi32_i32$HIGH_BITS; $8 = $7; $28 = __wasm_i64_mul($12, $12 >> 31, $29, $30); $12 = $28 + $6 | 0; $6 = i64toi32_i32$HIGH_BITS + $32 | 0; $6 = $12 >>> 0 < $28 >>> 0 ? $6 + 1 | 0 : $6; $21 = $12; $12 = __wasm_i64_mul($7, $7 >> 31, $25, $26); $7 = $21 + $12 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $7 >>> 0 < $12 >>> 0 ? $6 + 1 | 0 : $6; $21 = $7; $7 = $13; $12 = __wasm_i64_mul($7, $7 >> 31, $18, $17); $13 = $21 + $12 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $12 >>> 0 ? $6 + 1 | 0 : $6; $12 = $13; $13 = $3; $21 = $22; $22 = $12; $12 = __wasm_i64_mul($3, $3 >> 31, $16, $15); $3 = $22 + $12 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $12 >>> 0 ? $6 + 1 | 0 : $6; $12 = $3; $3 = $9; $9 = __wasm_i64_mul($3, $3 >> 31, $11, $14); $12 = $12 + $9 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $12 >>> 0 < $9 >>> 0 ? $6 + 1 | 0 : $6; $9 = $4 & 31; $9 = (32 <= ($4 & 63) >>> 0 ? $6 >> $9 : ((1 << $9) - 1 & $6) << 32 - $9 | $12 >>> $9) + $31 | 0; HEAP32[$21 >> 2] = $9; $12 = $10; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if ($3 >>> 0 >= 3) { if (($3 | 0) != 4) { if (($1 | 0) < 1) { break label$1 } $9 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $13 = HEAP32[$5 + -12 >> 2]; $7 = HEAP32[$2 >> 2]; $12 = $7; $10 = $7 >> 31; $7 = HEAP32[$2 + 4 >> 2]; $11 = $7; $14 = $7 >> 31; $2 = HEAP32[$2 + 8 >> 2]; $16 = $2; $15 = $2 >> 31; $2 = 0; while (1) { $7 = $2 << 2; $8 = $7 + $5 | 0; $18 = HEAP32[$0 + $7 >> 2]; $7 = $3; $3 = __wasm_i64_mul($7, $7 >> 31, $11, $14); $6 = i64toi32_i32$HIGH_BITS; $17 = $8; $13 = __wasm_i64_mul($13, $13 >> 31, $16, $15); $3 = $13 + $3 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $13 >>> 0 ? $6 + 1 | 0 : $6; $8 = $3; $3 = $9; $9 = __wasm_i64_mul($3, $3 >> 31, $12, $10); $13 = $8 + $9 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $13 >>> 0 < $9 >>> 0 ? $6 + 1 | 0 : $6; $9 = $13; $8 = $4 & 31; $9 = (32 <= ($4 & 63) >>> 0 ? $6 >> $8 : ((1 << $8) - 1 & $6) << 32 - $8 | $9 >>> $8) + $18 | 0; HEAP32[$17 >> 2] = $9; $13 = $7; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $9 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $13 = HEAP32[$5 + -12 >> 2]; $7 = HEAP32[$5 + -16 >> 2]; $8 = HEAP32[$2 >> 2]; $10 = $8; $11 = $8 >> 31; $8 = HEAP32[$2 + 4 >> 2]; $14 = $8; $16 = $8 >> 31; $8 = HEAP32[$2 + 8 >> 2]; $15 = $8; $18 = $8 >> 31; $2 = HEAP32[$2 + 12 >> 2]; $17 = $2; $25 = $2 >> 31; $2 = 0; while (1) { $8 = $2 << 2; $12 = $8 + $5 | 0; $26 = HEAP32[$0 + $8 >> 2]; $8 = $13; $6 = __wasm_i64_mul($8, $8 >> 31, $15, $18); $27 = i64toi32_i32$HIGH_BITS; $13 = $3; $22 = $12; $24 = __wasm_i64_mul($7, $7 >> 31, $17, $25); $7 = $24 + $6 | 0; $6 = i64toi32_i32$HIGH_BITS + $27 | 0; $6 = $7 >>> 0 < $24 >>> 0 ? $6 + 1 | 0 : $6; $12 = $7; $7 = __wasm_i64_mul($3, $3 >> 31, $14, $16); $3 = $12 + $7 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $7 >>> 0 ? $6 + 1 | 0 : $6; $7 = $3; $3 = $9; $9 = __wasm_i64_mul($3, $3 >> 31, $10, $11); $7 = $7 + $9 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $7 >>> 0 < $9 >>> 0 ? $6 + 1 | 0 : $6; $9 = $7; $7 = $4; $12 = $7 & 31; $9 = (32 <= ($7 & 63) >>> 0 ? $6 >> $12 : ((1 << $12) - 1 & $6) << 32 - $12 | $9 >>> $12) + $26 | 0; HEAP32[$22 >> 2] = $9; $7 = $8; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($3 | 0) != 2) { if (($1 | 0) < 1) { break label$1 } $9 = HEAP32[$5 + -4 >> 2]; $2 = HEAP32[$2 >> 2]; $8 = $2; $12 = $2 >> 31; $2 = 0; while (1) { $3 = $2 << 2; $10 = $3 + $5 | 0; $6 = HEAP32[$0 + $3 >> 2]; $9 = __wasm_i64_mul($9, $9 >> 31, $8, $12); $7 = i64toi32_i32$HIGH_BITS; $3 = $4; $13 = $3 & 31; $9 = $6 + (32 <= ($3 & 63) >>> 0 ? $7 >> $13 : ((1 << $13) - 1 & $7) << 32 - $13 | $9 >>> $13) | 0; HEAP32[$10 >> 2] = $9; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (($1 | 0) < 1) { break label$1 } $9 = HEAP32[$5 + -4 >> 2]; $3 = HEAP32[$5 + -8 >> 2]; $13 = HEAP32[$2 >> 2]; $8 = $13; $12 = $8 >> 31; $2 = HEAP32[$2 + 4 >> 2]; $10 = $2; $11 = $2 >> 31; $2 = 0; while (1) { $13 = $2 << 2; $7 = $13 + $5 | 0; $14 = HEAP32[$0 + $13 >> 2]; $13 = $9; $9 = __wasm_i64_mul($9, $9 >> 31, $8, $12); $6 = i64toi32_i32$HIGH_BITS; $15 = $7; $7 = $9; $9 = __wasm_i64_mul($3, $3 >> 31, $10, $11); $3 = $7 + $9 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $6 = $3 >>> 0 < $9 >>> 0 ? $6 + 1 | 0 : $6; $9 = $3; $3 = $4; $7 = $3 & 31; $9 = (32 <= ($3 & 63) >>> 0 ? $6 >> $7 : ((1 << $7) - 1 & $6) << 32 - $7 | $9 >>> $7) + $14 | 0; HEAP32[$15 >> 2] = $9; $3 = $13; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__lpc_compute_expected_bits_per_residual_sample($0, $1) { if (!!($0 > 0.0)) { $0 = log(.5 / +($1 >>> 0) * $0) * .5 / .6931471805599453; return $0 >= 0.0 ? $0 : 0.0; } return $0 < 0.0 ? 1.e+32 : 0.0; } function FLAC__lpc_compute_best_order($0, $1, $2, $3) { var $4 = 0.0, $5 = 0, $6 = 0, $7 = 0.0, $8 = 0, $9 = 0, $10 = 0.0; $5 = 1; if ($1) { $10 = .5 / +($2 >>> 0); $7 = 4294967295.0; while (1) { $4 = HEAPF64[($6 << 3) + $0 >> 3]; label$3 : { if (!!($4 > 0.0)) { $4 = log($10 * $4) * .5 / .6931471805599453; $4 = $4 >= 0.0 ? $4 : 0.0; break label$3; } $4 = $4 < 0.0 ? 1.e+32 : 0.0; } $4 = $4 * +($2 - $5 >>> 0) + +(Math_imul($3, $5) >>> 0); $8 = $4 < $7; $7 = $8 ? $4 : $7; $9 = $8 ? $6 : $9; $5 = $5 + 1 | 0; $6 = $6 + 1 | 0; if (($6 | 0) != ($1 | 0)) { continue } break; }; $0 = $9 + 1 | 0; } else { $0 = 1 } return $0; } function strlen($0) { var $1 = 0, $2 = 0, $3 = 0; label$1 : { label$2 : { $1 = $0; if (!($1 & 3)) { break label$2 } if (!HEAPU8[$0 | 0]) { return 0 } while (1) { $1 = $1 + 1 | 0; if (!($1 & 3)) { break label$2 } if (HEAPU8[$1 | 0]) { continue } break; }; break label$1; } while (1) { $2 = $1; $1 = $1 + 4 | 0; $3 = HEAP32[$2 >> 2]; if (!(($3 ^ -1) & $3 + -16843009 & -2139062144)) { continue } break; }; if (!($3 & 255)) { return $2 - $0 | 0 } while (1) { $3 = HEAPU8[$2 + 1 | 0]; $1 = $2 + 1 | 0; $2 = $1; if ($3) { continue } break; }; } return $1 - $0 | 0; } function __strchrnul($0, $1) { var $2 = 0, $3 = 0; label$1 : { $3 = $1 & 255; if ($3) { if ($0 & 3) { while (1) { $2 = HEAPU8[$0 | 0]; if (!$2 | ($2 | 0) == ($1 & 255)) { break label$1 } $0 = $0 + 1 | 0; if ($0 & 3) { continue } break; } } $2 = HEAP32[$0 >> 2]; label$5 : { if (($2 ^ -1) & $2 + -16843009 & -2139062144) { break label$5 } $3 = Math_imul($3, 16843009); while (1) { $2 = $2 ^ $3; if (($2 ^ -1) & $2 + -16843009 & -2139062144) { break label$5 } $2 = HEAP32[$0 + 4 >> 2]; $0 = $0 + 4 | 0; if (!($2 + -16843009 & ($2 ^ -1) & -2139062144)) { continue } break; }; } while (1) { $2 = $0; $3 = HEAPU8[$2 | 0]; if ($3) { $0 = $2 + 1 | 0; if (($3 | 0) != ($1 & 255)) { continue } } break; }; return $2; } return strlen($0) + $0 | 0; } return $0; } function strchr($0, $1) { $0 = __strchrnul($0, $1); return HEAPU8[$0 | 0] == ($1 & 255) ? $0 : 0; } function __stdio_write($0, $1, $2) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; var $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0; $3 = global$0 - 32 | 0; global$0 = $3; $4 = HEAP32[$0 + 28 >> 2]; HEAP32[$3 + 16 >> 2] = $4; $5 = HEAP32[$0 + 20 >> 2]; HEAP32[$3 + 28 >> 2] = $2; HEAP32[$3 + 24 >> 2] = $1; $1 = $5 - $4 | 0; HEAP32[$3 + 20 >> 2] = $1; $4 = $1 + $2 | 0; $9 = 2; $1 = $3 + 16 | 0; label$1 : { label$2 : { label$3 : { if (!__wasi_syscall_ret(__wasi_fd_write(HEAP32[$0 + 60 >> 2], $3 + 16 | 0, 2, $3 + 12 | 0) | 0)) { while (1) { $5 = HEAP32[$3 + 12 >> 2]; if (($5 | 0) == ($4 | 0)) { break label$3 } if (($5 | 0) <= -1) { break label$2 } $6 = HEAP32[$1 + 4 >> 2]; $7 = $5 >>> 0 > $6 >>> 0; $8 = ($7 << 3) + $1 | 0; $6 = $5 - ($7 ? $6 : 0) | 0; HEAP32[$8 >> 2] = $6 + HEAP32[$8 >> 2]; $8 = ($7 ? 12 : 4) + $1 | 0; HEAP32[$8 >> 2] = HEAP32[$8 >> 2] - $6; $4 = $4 - $5 | 0; $1 = $7 ? $1 + 8 | 0 : $1; $9 = $9 - $7 | 0; if (!__wasi_syscall_ret(__wasi_fd_write(HEAP32[$0 + 60 >> 2], $1 | 0, $9 | 0, $3 + 12 | 0) | 0)) { continue } break; } } HEAP32[$3 + 12 >> 2] = -1; if (($4 | 0) != -1) { break label$2 } } $1 = HEAP32[$0 + 44 >> 2]; HEAP32[$0 + 28 >> 2] = $1; HEAP32[$0 + 20 >> 2] = $1; HEAP32[$0 + 16 >> 2] = $1 + HEAP32[$0 + 48 >> 2]; $0 = $2; break label$1; } HEAP32[$0 + 28 >> 2] = 0; HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 + 20 >> 2] = 0; HEAP32[$0 >> 2] = HEAP32[$0 >> 2] | 32; $0 = 0; if (($9 | 0) == 2) { break label$1 } $0 = $2 - HEAP32[$1 + 4 >> 2] | 0; } global$0 = $3 + 32 | 0; return $0 | 0; } function FLAC__memory_alloc_aligned_int32_array($0, $1, $2) { var $3 = 0; label$1 : { if ($0 >>> 0 > 1073741823) { break label$1 } $0 = dlmalloc($0 ? $0 << 2 : 1); if (!$0) { break label$1 } $3 = HEAP32[$1 >> 2]; if ($3) { dlfree($3) } HEAP32[$1 >> 2] = $0; HEAP32[$2 >> 2] = $0; $3 = 1; } return $3; } function FLAC__memory_alloc_aligned_uint64_array($0, $1, $2) { var $3 = 0; label$1 : { if ($0 >>> 0 > 536870911) { break label$1 } $0 = dlmalloc($0 ? $0 << 3 : 1); if (!$0) { break label$1 } $3 = HEAP32[$1 >> 2]; if ($3) { dlfree($3) } HEAP32[$1 >> 2] = $0; HEAP32[$2 >> 2] = $0; $3 = 1; } return $3; } function safe_malloc_mul_2op_p($0, $1) { if (!($1 ? $0 : 0)) { return dlmalloc(1) } __wasm_i64_mul($1, 0, $0, 0); if (i64toi32_i32$HIGH_BITS) { $0 = 0 } else { $0 = dlmalloc(Math_imul($0, $1)) } return $0; } function FLAC__fixed_compute_best_predictor($0, $1, $2) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; var $3 = 0, $4 = Math_fround(0), $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, wasm2js_i32$0 = 0, wasm2js_f32$0 = Math_fround(0); if ($1) { $3 = HEAP32[$0 + -4 >> 2]; $8 = HEAP32[$0 + -8 >> 2]; $12 = $3 - $8 | 0; $5 = HEAP32[$0 + -12 >> 2]; $9 = $12 + ($5 - $8 | 0) | 0; $17 = $9 + ((($5 << 1) - $8 | 0) - HEAP32[$0 + -16 >> 2] | 0) | 0; while (1) { $8 = HEAP32[($15 << 2) + $0 >> 2]; $5 = $8 >> 31; $14 = ($5 ^ $5 + $8) + $14 | 0; $5 = $8 - $3 | 0; $11 = $5 >> 31; $13 = ($11 ^ $5 + $11) + $13 | 0; $11 = $5 - $12 | 0; $3 = $11 >> 31; $10 = ($3 ^ $3 + $11) + $10 | 0; $9 = $11 - $9 | 0; $3 = $9 >> 31; $6 = ($3 ^ $3 + $9) + $6 | 0; $12 = $9 - $17 | 0; $3 = $12 >> 31; $7 = ($3 ^ $3 + $12) + $7 | 0; $3 = $8; $12 = $5; $17 = $9; $9 = $11; $15 = $15 + 1 | 0; if (($15 | 0) != ($1 | 0)) { continue } break; }; } $0 = $13 >>> 0 < $10 >>> 0 ? $13 : $10; $0 = $0 >>> 0 < $6 >>> 0 ? $0 : $6; label$3 : { if ($14 >>> 0 < ($0 >>> 0 < $7 >>> 0 ? $0 : $7) >>> 0) { break label$3 } $16 = 1; $0 = $10 >>> 0 < $6 >>> 0 ? $10 : $6; if ($13 >>> 0 < ($0 >>> 0 < $7 >>> 0 ? $0 : $7) >>> 0) { break label$3 } $0 = $6 >>> 0 < $7 >>> 0; $16 = $10 >>> 0 < ($0 ? $6 : $7) >>> 0 ? 2 : $0 ? 3 : 4; } $0 = $2; if ($14) { $4 = Math_fround(log(+($14 >>> 0) * .6931471805599453 / +($1 >>> 0)) / .6931471805599453) } else { $4 = Math_fround(0.0) } HEAPF32[$0 >> 2] = $4; $0 = $2; if ($13) { $4 = Math_fround(log(+($13 >>> 0) * .6931471805599453 / +($1 >>> 0)) / .6931471805599453) } else { $4 = Math_fround(0.0) } HEAPF32[$0 + 4 >> 2] = $4; $0 = $2; if ($10) { $4 = Math_fround(log(+($10 >>> 0) * .6931471805599453 / +($1 >>> 0)) / .6931471805599453) } else { $4 = Math_fround(0.0) } HEAPF32[$0 + 8 >> 2] = $4; $0 = $2; if ($6) { $4 = Math_fround(log(+($6 >>> 0) * .6931471805599453 / +($1 >>> 0)) / .6931471805599453) } else { $4 = Math_fround(0.0) } HEAPF32[$0 + 12 >> 2] = $4; if (!$7) { HEAPF32[$2 + 16 >> 2] = 0; return $16 | 0; } (wasm2js_i32$0 = $2, wasm2js_f32$0 = Math_fround(log(+($7 >>> 0) * .6931471805599453 / +($1 >>> 0)) / .6931471805599453)), HEAPF32[wasm2js_i32$0 + 16 >> 2] = wasm2js_f32$0; return $16 | 0; } function FLAC__fixed_compute_best_predictor_wide($0, $1, $2) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; var $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = Math_fround(0), $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0, wasm2js_i32$0 = 0, wasm2js_f32$0 = Math_fround(0); label$1 : { if (!$1) { break label$1 } $5 = HEAP32[$0 + -4 >> 2]; $8 = HEAP32[$0 + -8 >> 2]; $6 = $5 - $8 | 0; $9 = HEAP32[$0 + -12 >> 2]; $14 = $6 + ($9 - $8 | 0) | 0; $21 = $14 + ((($9 << 1) - $8 | 0) - HEAP32[$0 + -16 >> 2] | 0) | 0; $9 = 0; $8 = 0; while (1) { $3 = HEAP32[($20 << 2) + $0 >> 2]; $4 = $3 >> 31; $4 = $4 ^ $3 + $4; $7 = $4 + $19 | 0; if ($7 >>> 0 < $4 >>> 0) { $18 = $18 + 1 | 0 } $19 = $7; $4 = $3 - $5 | 0; $7 = $4 >> 31; $7 = $7 ^ $4 + $7; $5 = $7 + $17 | 0; if ($5 >>> 0 < $7 >>> 0) { $15 = $15 + 1 | 0 } $17 = $5; $7 = $4 - $6 | 0; $5 = $7 >> 31; $5 = $5 ^ $5 + $7; $6 = $5 + $16 | 0; if ($6 >>> 0 < $5 >>> 0) { $10 = $10 + 1 | 0 } $16 = $6; $14 = $7 - $14 | 0; $5 = $14 >> 31; $5 = $5 ^ $5 + $14; $6 = $5 + $12 | 0; if ($6 >>> 0 < $5 >>> 0) { $8 = $8 + 1 | 0 } $12 = $6; $6 = $14 - $21 | 0; $5 = $6 >> 31; $5 = $5 ^ $5 + $6; $6 = $5 + $13 | 0; if ($6 >>> 0 < $5 >>> 0) { $9 = $9 + 1 | 0 } $13 = $6; $5 = $3; $6 = $4; $21 = $14; $14 = $7; $20 = $20 + 1 | 0; if (($20 | 0) != ($1 | 0)) { continue } break; }; } $3 = ($10 | 0) == ($15 | 0) & $17 >>> 0 < $16 >>> 0 | $15 >>> 0 < $10 >>> 0; $4 = $3 ? $17 : $16; $0 = $4; $3 = $3 ? $15 : $10; $4 = ($8 | 0) == ($3 | 0) & $4 >>> 0 < $12 >>> 0 | $3 >>> 0 < $8 >>> 0; $7 = $4 ? $0 : $12; $3 = $4 ? $3 : $8; $4 = ($9 | 0) == ($3 | 0) & $7 >>> 0 < $13 >>> 0 | $3 >>> 0 < $9 >>> 0; $7 = $4 ? $7 : $13; $3 = $4 ? $3 : $9; $0 = 0; label$4 : { if (($3 | 0) == ($18 | 0) & $19 >>> 0 < $7 >>> 0 | $18 >>> 0 < $3 >>> 0) { break label$4 } $3 = ($8 | 0) == ($10 | 0) & $16 >>> 0 < $12 >>> 0 | $10 >>> 0 < $8 >>> 0; $4 = $3 ? $16 : $12; $0 = $4; $3 = $3 ? $10 : $8; $4 = ($9 | 0) == ($3 | 0) & $4 >>> 0 < $13 >>> 0 | $3 >>> 0 < $9 >>> 0; $7 = $4 ? $0 : $13; $3 = $4 ? $3 : $9; $0 = 1; if (($3 | 0) == ($15 | 0) & $17 >>> 0 < $7 >>> 0 | $15 >>> 0 < $3 >>> 0) { break label$4 } $0 = ($8 | 0) == ($9 | 0) & $12 >>> 0 < $13 >>> 0 | $8 >>> 0 < $9 >>> 0; $3 = $0; $4 = $3 ? $12 : $13; $0 = $3 ? $8 : $9; $0 = ($0 | 0) == ($10 | 0) & $16 >>> 0 < $4 >>> 0 | $10 >>> 0 < $0 >>> 0 ? 2 : $3 ? 3 : 4; } $6 = $2; if ($18 | $19) { $11 = Math_fround(log((+($19 >>> 0) + 4294967296.0 * +($18 >>> 0)) * .6931471805599453 / +($1 >>> 0)) / .6931471805599453) } else { $11 = Math_fround(0.0) } HEAPF32[$6 >> 2] = $11; $6 = $2; if ($15 | $17) { $11 = Math_fround(log((+($17 >>> 0) + 4294967296.0 * +($15 >>> 0)) * .6931471805599453 / +($1 >>> 0)) / .6931471805599453) } else { $11 = Math_fround(0.0) } HEAPF32[$6 + 4 >> 2] = $11; $6 = $2; if ($10 | $16) { $11 = Math_fround(log((+($16 >>> 0) + 4294967296.0 * +($10 >>> 0)) * .6931471805599453 / +($1 >>> 0)) / .6931471805599453) } else { $11 = Math_fround(0.0) } HEAPF32[$6 + 8 >> 2] = $11; $6 = $2; if ($8 | $12) { $11 = Math_fround(log((+($12 >>> 0) + 4294967296.0 * +($8 >>> 0)) * .6931471805599453 / +($1 >>> 0)) / .6931471805599453) } else { $11 = Math_fround(0.0) } HEAPF32[$6 + 12 >> 2] = $11; if (!($9 | $13)) { HEAPF32[$2 + 16 >> 2] = 0; return $0 | 0; } (wasm2js_i32$0 = $2, wasm2js_f32$0 = Math_fround(log((+($13 >>> 0) + 4294967296.0 * +($9 >>> 0)) * .6931471805599453 / +($1 >>> 0)) / .6931471805599453)), HEAPF32[wasm2js_i32$0 + 16 >> 2] = wasm2js_f32$0; return $0 | 0; } function FLAC__fixed_compute_residual($0, $1, $2, $3) { var $4 = 0, $5 = 0; label$1 : { label$2 : { label$3 : { switch ($2 | 0) { case 4: $2 = 0; if (($1 | 0) <= 0) { break label$2 } while (1) { $5 = $2 << 2; $4 = $5 + $0 | 0; HEAP32[$3 + $5 >> 2] = (HEAP32[$4 + -16 >> 2] + (HEAP32[$4 >> 2] + Math_imul(HEAP32[$4 + -8 >> 2], 6) | 0) | 0) - (HEAP32[$4 + -12 >> 2] + HEAP32[$4 + -4 >> 2] << 2); $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$2; case 3: $2 = 0; if (($1 | 0) <= 0) { break label$2 } while (1) { $5 = $2 << 2; $4 = $5 + $0 | 0; HEAP32[$3 + $5 >> 2] = (HEAP32[$4 >> 2] - HEAP32[$4 + -12 >> 2] | 0) + Math_imul(HEAP32[$4 + -8 >> 2] - HEAP32[$4 + -4 >> 2] | 0, 3); $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$2; case 2: $2 = 0; if (($1 | 0) <= 0) { break label$2 } while (1) { $5 = $2 << 2; $4 = $5 + $0 | 0; HEAP32[$3 + $5 >> 2] = HEAP32[$4 + -8 >> 2] + (HEAP32[$4 >> 2] - (HEAP32[$4 + -4 >> 2] << 1) | 0); $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$2; case 0: break label$1; case 1: break label$3; default: break label$2; }; } $2 = 0; if (($1 | 0) <= 0) { break label$2 } while (1) { $5 = $2 << 2; $4 = $5 + $0 | 0; HEAP32[$3 + $5 >> 2] = HEAP32[$4 >> 2] - HEAP32[$4 + -4 >> 2]; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; } return; } memcpy($3, $0, $1 << 2); } function FLAC__fixed_restore_signal($0, $1, $2, $3) { var $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0; label$1 : { label$2 : { label$3 : { switch ($2 | 0) { case 4: if (($1 | 0) < 1) { break label$2 } $5 = HEAP32[$3 + -12 >> 2]; $6 = HEAP32[$3 + -4 >> 2]; $2 = 0; while (1) { $8 = $2 << 2; $7 = $8 + $3 | 0; $4 = HEAP32[$7 + -8 >> 2]; $6 = ((HEAP32[$0 + $8 >> 2] + Math_imul($4, -6) | 0) - HEAP32[$7 + -16 >> 2] | 0) + ($5 + $6 << 2) | 0; HEAP32[$7 >> 2] = $6; $5 = $4; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$2; case 3: if (($1 | 0) < 1) { break label$2 } $4 = HEAP32[$3 + -12 >> 2]; $5 = HEAP32[$3 + -4 >> 2]; $2 = 0; while (1) { $6 = $2 << 2; $7 = $6 + $3 | 0; $8 = HEAP32[$0 + $6 >> 2] + $4 | 0; $4 = HEAP32[$7 + -8 >> 2]; $5 = $8 + Math_imul($5 - $4 | 0, 3) | 0; HEAP32[$7 >> 2] = $5; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$2; case 2: if (($1 | 0) < 1) { break label$2 } $4 = HEAP32[$3 + -4 >> 2]; $2 = 0; while (1) { $5 = $2 << 2; $6 = $5 + $3 | 0; $4 = (HEAP32[$0 + $5 >> 2] + ($4 << 1) | 0) - HEAP32[$6 + -8 >> 2] | 0; HEAP32[$6 >> 2] = $4; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; break label$2; case 0: break label$1; case 1: break label$3; default: break label$2; }; } if (($1 | 0) < 1) { break label$2 } $4 = HEAP32[$3 + -4 >> 2]; $2 = 0; while (1) { $5 = $2 << 2; $4 = HEAP32[$5 + $0 >> 2] + $4 | 0; HEAP32[$3 + $5 >> 2] = $4; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; } return; } memcpy($3, $0, $1 << 2); } function __toread($0) { var $1 = 0, $2 = 0; $1 = HEAPU8[$0 + 74 | 0]; HEAP8[$0 + 74 | 0] = $1 + -1 | $1; if (HEAPU32[$0 + 20 >> 2] > HEAPU32[$0 + 28 >> 2]) { FUNCTION_TABLE[HEAP32[$0 + 36 >> 2]]($0, 0, 0) | 0 } HEAP32[$0 + 28 >> 2] = 0; HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 + 20 >> 2] = 0; $1 = HEAP32[$0 >> 2]; if ($1 & 4) { HEAP32[$0 >> 2] = $1 | 32; return -1; } $2 = HEAP32[$0 + 44 >> 2] + HEAP32[$0 + 48 >> 2] | 0; HEAP32[$0 + 8 >> 2] = $2; HEAP32[$0 + 4 >> 2] = $2; return $1 << 27 >> 31; } function FLAC__stream_decoder_new() { var $0 = 0, $1 = 0, $2 = 0, $3 = 0, $4 = 0; $3 = dlcalloc(1, 8); if ($3) { $2 = dlcalloc(1, 504); HEAP32[$3 >> 2] = $2; if ($2) { $0 = dlcalloc(1, 6160); HEAP32[$3 + 4 >> 2] = $0; if ($0) { $1 = dlcalloc(1, 44); HEAP32[$0 + 56 >> 2] = $1; if ($1) { HEAP32[$0 + 1128 >> 2] = 16; $4 = dlmalloc(HEAP32[1364] << 1 & -16); HEAP32[$0 + 1120 >> 2] = $4; if ($4) { HEAP32[$0 + 252 >> 2] = 0; HEAP32[$0 + 220 >> 2] = 0; HEAP32[$0 + 224 >> 2] = 0; $1 = $0 + 3616 | 0; HEAP32[$1 >> 2] = 0; HEAP32[$1 + 4 >> 2] = 0; $1 = $0 + 3608 | 0; HEAP32[$1 >> 2] = 0; HEAP32[$1 + 4 >> 2] = 0; $1 = $0 + 3600 | 0; HEAP32[$1 >> 2] = 0; HEAP32[$1 + 4 >> 2] = 0; $1 = $0 + 3592 | 0; HEAP32[$1 >> 2] = 0; HEAP32[$1 + 4 >> 2] = 0; HEAP32[$0 + 60 >> 2] = 0; HEAP32[$0 + 64 >> 2] = 0; HEAP32[$0 + 68 >> 2] = 0; HEAP32[$0 + 72 >> 2] = 0; HEAP32[$0 + 76 >> 2] = 0; HEAP32[$0 + 80 >> 2] = 0; HEAP32[$0 + 84 >> 2] = 0; HEAP32[$0 + 88 >> 2] = 0; HEAP32[$0 + 92 >> 2] = 0; HEAP32[$0 + 96 >> 2] = 0; HEAP32[$0 + 100 >> 2] = 0; HEAP32[$0 + 104 >> 2] = 0; HEAP32[$0 + 108 >> 2] = 0; HEAP32[$0 + 112 >> 2] = 0; HEAP32[$0 + 116 >> 2] = 0; HEAP32[$0 + 120 >> 2] = 0; FLAC__format_entropy_coding_method_partitioned_rice_contents_init($0 + 124 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init($0 + 136 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init($0 + 148 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init($0 + 160 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init($0 + 172 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init($0 + 184 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init($0 + 196 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init($0 + 208 | 0); HEAP32[$0 + 48 >> 2] = 0; HEAP32[$0 + 52 >> 2] = 0; memset($0 + 608 | 0, 512); HEAP32[$0 + 1124 >> 2] = 0; HEAP32[$0 + 608 >> 2] = 1; HEAP32[$0 + 32 >> 2] = 0; HEAP32[$0 + 24 >> 2] = 0; HEAP32[$0 + 28 >> 2] = 0; HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 + 20 >> 2] = 0; HEAP32[$0 + 8 >> 2] = 0; HEAP32[$0 + 12 >> 2] = 0; HEAP32[$0 >> 2] = 0; HEAP32[$0 + 4 >> 2] = 0; HEAP32[$2 + 28 >> 2] = 0; FLAC__ogg_decoder_aspect_set_defaults($2 + 32 | 0); HEAP32[$2 >> 2] = 9; return $3 | 0; } FLAC__bitreader_delete($1); } dlfree($0); } dlfree($2); } dlfree($3); } return 0; } function FLAC__stream_decoder_delete($0) { $0 = $0 | 0; var $1 = 0, $2 = 0; if ($0) { FLAC__stream_decoder_finish($0); $1 = HEAP32[$0 + 4 >> 2]; $2 = HEAP32[$1 + 1120 >> 2]; if ($2) { dlfree($2); $1 = HEAP32[$0 + 4 >> 2]; } FLAC__bitreader_delete(HEAP32[$1 + 56 >> 2]); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 124 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 136 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 148 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 160 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 172 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 184 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 196 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 208 | 0); dlfree(HEAP32[$0 + 4 >> 2]); dlfree(HEAP32[$0 >> 2]); dlfree($0); } } function FLAC__stream_decoder_finish($0) { $0 = $0 | 0; var $1 = 0, $2 = 0, $3 = 0; $3 = 1; if (HEAP32[HEAP32[$0 >> 2] >> 2] != 9) { $1 = HEAP32[$0 + 4 >> 2]; FLAC__MD5Final($1 + 3732 | 0, $1 + 3636 | 0); dlfree(HEAP32[HEAP32[$0 + 4 >> 2] + 452 >> 2]); HEAP32[HEAP32[$0 + 4 >> 2] + 452 >> 2] = 0; $1 = HEAP32[$0 + 4 >> 2]; HEAP32[$1 + 252 >> 2] = 0; FLAC__bitreader_free(HEAP32[$1 + 56 >> 2]); $3 = $0 + 4 | 0; $1 = HEAP32[$0 + 4 >> 2]; $2 = HEAP32[$1 + 60 >> 2]; if ($2) { dlfree($2 + -16 | 0); HEAP32[HEAP32[$3 >> 2] + 60 >> 2] = 0; $1 = HEAP32[$3 >> 2]; } $2 = HEAP32[$1 + 3592 >> 2]; if ($2) { dlfree($2); HEAP32[HEAP32[$3 >> 2] + 92 >> 2] = 0; HEAP32[HEAP32[$3 >> 2] + 3592 >> 2] = 0; $1 = HEAP32[$3 >> 2]; } $2 = HEAP32[$1 - -64 >> 2]; if ($2) { dlfree($2 + -16 | 0); HEAP32[HEAP32[$3 >> 2] - -64 >> 2] = 0; $1 = HEAP32[$3 >> 2]; } $2 = HEAP32[$1 + 3596 >> 2]; if ($2) { dlfree($2); HEAP32[HEAP32[$3 >> 2] + 96 >> 2] = 0; HEAP32[HEAP32[$3 >> 2] + 3596 >> 2] = 0; $1 = HEAP32[$3 >> 2]; } $2 = HEAP32[$1 + 68 >> 2]; if ($2) { dlfree($2 + -16 | 0); HEAP32[HEAP32[$3 >> 2] + 68 >> 2] = 0; $1 = HEAP32[$3 >> 2]; } $2 = HEAP32[$1 + 3600 >> 2]; if ($2) { dlfree($2); HEAP32[HEAP32[$3 >> 2] + 100 >> 2] = 0; HEAP32[HEAP32[$3 >> 2] + 3600 >> 2] = 0; $1 = HEAP32[$3 >> 2]; } $2 = HEAP32[$1 + 72 >> 2]; if ($2) { dlfree($2 + -16 | 0); HEAP32[HEAP32[$3 >> 2] + 72 >> 2] = 0; $1 = HEAP32[$3 >> 2]; } $2 = HEAP32[$1 + 3604 >> 2]; if ($2) { dlfree($2); HEAP32[HEAP32[$3 >> 2] + 104 >> 2] = 0; HEAP32[HEAP32[$3 >> 2] + 3604 >> 2] = 0; $1 = HEAP32[$3 >> 2]; } $2 = HEAP32[$1 + 76 >> 2]; if ($2) { dlfree($2 + -16 | 0); HEAP32[HEAP32[$3 >> 2] + 76 >> 2] = 0; $1 = HEAP32[$3 >> 2]; } $2 = HEAP32[$1 + 3608 >> 2]; if ($2) { dlfree($2); HEAP32[HEAP32[$3 >> 2] + 108 >> 2] = 0; HEAP32[HEAP32[$3 >> 2] + 3608 >> 2] = 0; $1 = HEAP32[$3 >> 2]; } $2 = HEAP32[$1 + 80 >> 2]; if ($2) { dlfree($2 + -16 | 0); HEAP32[HEAP32[$3 >> 2] + 80 >> 2] = 0; $1 = HEAP32[$3 >> 2]; } $2 = HEAP32[$1 + 3612 >> 2]; if ($2) { dlfree($2); HEAP32[HEAP32[$3 >> 2] + 112 >> 2] = 0; HEAP32[HEAP32[$3 >> 2] + 3612 >> 2] = 0; $1 = HEAP32[$3 >> 2]; } $2 = HEAP32[$1 + 84 >> 2]; if ($2) { dlfree($2 + -16 | 0); HEAP32[HEAP32[$3 >> 2] + 84 >> 2] = 0; $1 = HEAP32[$3 >> 2]; } $2 = HEAP32[$1 + 3616 >> 2]; if ($2) { dlfree($2); HEAP32[HEAP32[$3 >> 2] + 116 >> 2] = 0; HEAP32[HEAP32[$3 >> 2] + 3616 >> 2] = 0; $1 = HEAP32[$3 >> 2]; } $2 = HEAP32[$1 + 88 >> 2]; if ($2) { dlfree($2 + -16 | 0); HEAP32[HEAP32[$3 >> 2] + 88 >> 2] = 0; $1 = HEAP32[$3 >> 2]; } $2 = HEAP32[$1 + 3620 >> 2]; if ($2) { dlfree($2); HEAP32[HEAP32[$3 >> 2] + 120 >> 2] = 0; HEAP32[HEAP32[$3 >> 2] + 3620 >> 2] = 0; $1 = HEAP32[$3 >> 2]; } HEAP32[$1 + 220 >> 2] = 0; HEAP32[$1 + 224 >> 2] = 0; if (HEAP32[$1 >> 2]) { $1 = HEAP32[$0 >> 2] + 32 | 0; ogg_sync_clear($1 + 368 | 0); ogg_stream_clear($1 + 8 | 0); $1 = HEAP32[$0 + 4 >> 2]; } $2 = HEAP32[$1 + 52 >> 2]; if ($2) { if (($2 | 0) != HEAP32[1887]) { fclose($2); $1 = HEAP32[$3 >> 2]; } HEAP32[$1 + 52 >> 2] = 0; } $3 = 1; if (HEAP32[$1 + 3624 >> 2]) { $3 = !memcmp($1 + 312 | 0, $1 + 3732 | 0, 16) } HEAP32[$1 + 48 >> 2] = 0; HEAP32[$1 + 3632 >> 2] = 0; memset($1 + 608 | 0, 512); HEAP32[$1 + 32 >> 2] = 0; HEAP32[$1 + 24 >> 2] = 0; HEAP32[$1 + 28 >> 2] = 0; HEAP32[$1 + 16 >> 2] = 0; HEAP32[$1 + 20 >> 2] = 0; HEAP32[$1 + 8 >> 2] = 0; HEAP32[$1 + 12 >> 2] = 0; HEAP32[$1 >> 2] = 0; HEAP32[$1 + 4 >> 2] = 0; $1 = HEAP32[$0 + 4 >> 2]; HEAP32[$1 + 1124 >> 2] = 0; HEAP32[$1 + 608 >> 2] = 1; $1 = HEAP32[$0 >> 2]; HEAP32[$1 + 28 >> 2] = 0; FLAC__ogg_decoder_aspect_set_defaults($1 + 32 | 0); HEAP32[HEAP32[$0 >> 2] >> 2] = 9; } return $3 | 0; } function FLAC__stream_decoder_init_stream($0, $1, $2, $3, $4, $5, $6, $7, $8, $9) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; $4 = $4 | 0; $5 = $5 | 0; $6 = $6 | 0; $7 = $7 | 0; $8 = $8 | 0; $9 = $9 | 0; return init_stream_internal_($0, $1, $2, $3, $4, $5, $6, $7, $8, $9, 0) | 0; } function init_stream_internal_($0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10) { var $11 = 0, $12 = 0; $11 = 5; label$1 : { $12 = HEAP32[$0 >> 2]; label$2 : { if (HEAP32[$12 >> 2] != 9) { break label$2 } $11 = 2; if (!$8 | (!$1 | !$6)) { break label$2 } if ($2) { if (!$5 | (!$3 | !$4)) { break label$2 } } $11 = HEAP32[$0 + 4 >> 2]; HEAP32[$11 >> 2] = $10; if ($10) { if (!FLAC__ogg_decoder_aspect_init($12 + 32 | 0)) { break label$1 } $11 = HEAP32[$0 + 4 >> 2]; } FLAC__cpu_info($11 + 3524 | 0); $10 = HEAP32[$0 + 4 >> 2]; HEAP32[$10 + 44 >> 2] = 5; HEAP32[$10 + 40 >> 2] = 6; HEAP32[$10 + 36 >> 2] = 5; if (!FLAC__bitreader_init(HEAP32[$10 + 56 >> 2], $0)) { HEAP32[HEAP32[$0 >> 2] >> 2] = 8; return 3; } $10 = HEAP32[$0 + 4 >> 2]; HEAP32[$10 + 48 >> 2] = $9; HEAP32[$10 + 32 >> 2] = $8; HEAP32[$10 + 28 >> 2] = $7; HEAP32[$10 + 24 >> 2] = $6; HEAP32[$10 + 20 >> 2] = $5; HEAP32[$10 + 16 >> 2] = $4; HEAP32[$10 + 12 >> 2] = $3; HEAP32[$10 + 8 >> 2] = $2; HEAP32[$10 + 4 >> 2] = $1; HEAP32[$10 + 3520 >> 2] = 0; HEAP32[$10 + 248 >> 2] = 0; HEAP32[$10 + 240 >> 2] = 0; HEAP32[$10 + 244 >> 2] = 0; HEAP32[$10 + 228 >> 2] = 0; HEAP32[$10 + 232 >> 2] = 0; HEAP32[$10 + 3624 >> 2] = HEAP32[HEAP32[$0 >> 2] + 28 >> 2]; HEAP32[$10 + 3628 >> 2] = 1; HEAP32[$10 + 3632 >> 2] = 0; $11 = FLAC__stream_decoder_reset($0) ? 0 : 3; } return $11; } HEAP32[HEAP32[$0 >> 2] + 4 >> 2] = 4; return 4; } function read_callback_($0, $1, $2) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; var $3 = 0, $4 = 0; label$1 : { $3 = HEAP32[$2 + 4 >> 2]; if (HEAP32[$3 >> 2]) { break label$1 } $4 = HEAP32[$3 + 20 >> 2]; if (!$4) { break label$1 } if (!FUNCTION_TABLE[$4]($2, HEAP32[$3 + 48 >> 2])) { break label$1 } HEAP32[$1 >> 2] = 0; HEAP32[HEAP32[$2 >> 2] >> 2] = 4; return 0; } label$2 : { label$3 : { if (HEAP32[$1 >> 2]) { $3 = HEAP32[$2 + 4 >> 2]; if (!(!HEAP32[$3 + 3632 >> 2] | HEAPU32[$3 + 6152 >> 2] < 21)) { HEAP32[HEAP32[$2 >> 2] >> 2] = 7; break label$3; } label$6 : { label$7 : { label$8 : { label$9 : { if (HEAP32[$3 >> 2]) { $4 = 0; switch (FLAC__ogg_decoder_aspect_read_callback_wrapper(HEAP32[$2 >> 2] + 32 | 0, $0, $1, $2, HEAP32[$3 + 48 >> 2]) | 0) { case 0: case 2: break label$7; case 1: break label$8; default: break label$9; }; } $4 = FUNCTION_TABLE[HEAP32[$3 + 4 >> 2]]($2, $0, $1, HEAP32[$3 + 48 >> 2]) | 0; if (($4 | 0) != 2) { break label$7 } } HEAP32[HEAP32[$2 >> 2] >> 2] = 7; break label$3; } $0 = 1; if (!HEAP32[$1 >> 2]) { break label$6 } break label$2; } $0 = 1; if (HEAP32[$1 >> 2]) { break label$2 } if (($4 | 0) == 1) { break label$6 } $1 = HEAP32[$2 + 4 >> 2]; if (HEAP32[$1 >> 2]) { break label$2 } $3 = HEAP32[$1 + 20 >> 2]; if (!$3) { break label$2 } if (!FUNCTION_TABLE[$3]($2, HEAP32[$1 + 48 >> 2])) { break label$2 } } HEAP32[HEAP32[$2 >> 2] >> 2] = 4; break label$3; } HEAP32[HEAP32[$2 >> 2] >> 2] = 7; } $0 = 0; } return $0 | 0; } function FLAC__stream_decoder_reset($0) { $0 = $0 | 0; var $1 = 0, $2 = 0, $3 = 0; $1 = HEAP32[$0 + 4 >> 2]; label$1 : { if (HEAP32[HEAP32[$0 >> 2] >> 2] == 9 ? !HEAP32[$1 + 3628 >> 2] : 0) { break label$1 } HEAP32[$1 + 3624 >> 2] = 0; HEAP32[$1 + 240 >> 2] = 0; HEAP32[$1 + 244 >> 2] = 0; if (HEAP32[$1 >> 2]) { $1 = HEAP32[$0 >> 2] + 32 | 0; ogg_stream_reset($1 + 8 | 0); ogg_sync_reset($1 + 368 | 0); HEAP32[$1 + 408 >> 2] = 0; HEAP32[$1 + 412 >> 2] = 0; $1 = HEAP32[$0 + 4 >> 2]; } $1 = HEAP32[$1 + 56 >> 2]; HEAP32[$1 + 8 >> 2] = 0; HEAP32[$1 + 12 >> 2] = 0; HEAP32[$1 + 16 >> 2] = 0; HEAP32[$1 + 20 >> 2] = 0; $1 = 1; $2 = HEAP32[$0 >> 2]; if (!$1) { HEAP32[$2 >> 2] = 8; return 0; } HEAP32[$2 >> 2] = 2; $1 = HEAP32[$0 + 4 >> 2]; if (HEAP32[$1 >> 2]) { FLAC__ogg_decoder_aspect_reset($2 + 32 | 0); $1 = HEAP32[$0 + 4 >> 2]; } label$6 : { if (!HEAP32[$1 + 3628 >> 2]) { $2 = 0; if (HEAP32[$1 + 52 >> 2] == HEAP32[1887]) { break label$1 } $3 = HEAP32[$1 + 8 >> 2]; if (!$3) { break label$6 } if ((FUNCTION_TABLE[$3]($0, 0, 0, HEAP32[$1 + 48 >> 2]) | 0) == 1) { break label$1 } $1 = HEAP32[$0 + 4 >> 2]; break label$6; } HEAP32[$1 + 3628 >> 2] = 0; } HEAP32[HEAP32[$0 >> 2] >> 2] = 0; HEAP32[$1 + 248 >> 2] = 0; dlfree(HEAP32[$1 + 452 >> 2]); HEAP32[HEAP32[$0 + 4 >> 2] + 452 >> 2] = 0; $1 = HEAP32[$0 + 4 >> 2]; HEAP32[$1 + 252 >> 2] = 0; HEAP32[$1 + 3624 >> 2] = HEAP32[HEAP32[$0 >> 2] + 28 >> 2]; HEAP32[$1 + 228 >> 2] = 0; HEAP32[$1 + 232 >> 2] = 0; FLAC__MD5Init($1 + 3636 | 0); $0 = HEAP32[$0 + 4 >> 2]; HEAP32[$0 + 6152 >> 2] = 0; HEAP32[$0 + 6136 >> 2] = 0; HEAP32[$0 + 6140 >> 2] = 0; $2 = 1; } return $2 | 0; } function FLAC__stream_decoder_init_ogg_stream($0, $1, $2, $3, $4, $5, $6, $7, $8, $9) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; $4 = $4 | 0; $5 = $5 | 0; $6 = $6 | 0; $7 = $7 | 0; $8 = $8 | 0; $9 = $9 | 0; return init_stream_internal_($0, $1, $2, $3, $4, $5, $6, $7, $8, $9, 1) | 0; } function FLAC__stream_decoder_set_ogg_serial_number($0, $1) { $0 = $0 | 0; $1 = $1 | 0; $0 = HEAP32[$0 >> 2]; if (HEAP32[$0 >> 2] == 9) { $0 = $0 + 32 | 0; HEAP32[$0 + 4 >> 2] = $1; HEAP32[$0 >> 2] = 0; $0 = 1; } else { $0 = 0 } return $0 | 0; } function FLAC__stream_decoder_set_md5_checking($0, $1) { $0 = $0 | 0; $1 = $1 | 0; $0 = HEAP32[$0 >> 2]; if (HEAP32[$0 >> 2] == 9) { HEAP32[$0 + 28 >> 2] = $1; $0 = 1; } else { $0 = 0 } return $0 | 0; } function FLAC__stream_decoder_set_metadata_respond($0, $1) { $0 = $0 | 0; $1 = $1 | 0; var $2 = 0; label$1 : { if (HEAP32[HEAP32[$0 >> 2] >> 2] != 9 | $1 >>> 0 > 126) { break label$1 } $2 = 1; $0 = HEAP32[$0 + 4 >> 2]; HEAP32[($0 + ($1 << 2) | 0) + 608 >> 2] = 1; if (($1 | 0) != 2) { break label$1 } HEAP32[$0 + 1124 >> 2] = 0; } return $2 | 0; } function FLAC__stream_decoder_set_metadata_respond_application($0, $1) { $0 = $0 | 0; $1 = $1 | 0; var $2 = 0, $3 = 0, $4 = 0; $2 = 0; label$1 : { if (HEAP32[HEAP32[$0 >> 2] >> 2] != 9) { break label$1 } $3 = HEAP32[$0 + 4 >> 2]; $2 = 1; if (HEAP32[$3 + 616 >> 2]) { break label$1 } $2 = HEAP32[$3 + 1120 >> 2]; label$2 : { $4 = HEAP32[$3 + 1124 >> 2]; label$3 : { if (($4 | 0) != HEAP32[$3 + 1128 >> 2]) { $3 = $2; break label$3; } label$5 : { if (!$4) { $3 = dlrealloc($2, 0); break label$5; } if ($4 + $4 >>> 0 >= $4 >>> 0) { $3 = dlrealloc($2, $4 << 1); if ($3) { break label$5 } dlfree($2); $3 = HEAP32[$0 + 4 >> 2]; } HEAP32[$3 + 1120 >> 2] = 0; break label$2; } $2 = HEAP32[$0 + 4 >> 2]; HEAP32[$2 + 1120 >> 2] = $3; if (!$3) { break label$2 } HEAP32[$2 + 1128 >> 2] = HEAP32[$2 + 1128 >> 2] << 1; $4 = HEAP32[$2 + 1124 >> 2]; } $2 = $3; $3 = HEAP32[1364] >>> 3 | 0; memcpy($2 + Math_imul($3, $4) | 0, $1, $3); $0 = HEAP32[$0 + 4 >> 2]; HEAP32[$0 + 1124 >> 2] = HEAP32[$0 + 1124 >> 2] + 1; return 1; } HEAP32[HEAP32[$0 >> 2] >> 2] = 8; $2 = 0; } return $2 | 0; } function FLAC__stream_decoder_set_metadata_respond_all($0) { $0 = $0 | 0; var $1 = 0; if (HEAP32[HEAP32[$0 >> 2] >> 2] == 9) { $1 = HEAP32[$0 + 4 >> 2]; $0 = 0; while (1) { HEAP32[($1 + ($0 << 2) | 0) + 608 >> 2] = 1; $0 = $0 + 1 | 0; if (($0 | 0) != 128) { continue } break; }; HEAP32[$1 + 1124 >> 2] = 0; $0 = 1; } else { $0 = 0 } return $0 | 0; } function FLAC__stream_decoder_set_metadata_ignore($0, $1) { $0 = $0 | 0; $1 = $1 | 0; var $2 = 0; label$1 : { if (HEAP32[HEAP32[$0 >> 2] >> 2] != 9 | $1 >>> 0 > 126) { break label$1 } $0 = HEAP32[$0 + 4 >> 2]; HEAP32[($0 + ($1 << 2) | 0) + 608 >> 2] = 0; $2 = 1; if (($1 | 0) != 2) { break label$1 } HEAP32[$0 + 1124 >> 2] = 0; } return $2 | 0; } function FLAC__stream_decoder_set_metadata_ignore_application($0, $1) { $0 = $0 | 0; $1 = $1 | 0; var $2 = 0, $3 = 0, $4 = 0; if (HEAP32[HEAP32[$0 >> 2] >> 2] == 9) { $2 = HEAP32[$0 + 4 >> 2]; if (!HEAP32[$2 + 616 >> 2]) { return 1 } $3 = HEAP32[$2 + 1120 >> 2]; label$3 : { $4 = HEAP32[$2 + 1124 >> 2]; label$4 : { if (($4 | 0) != HEAP32[$2 + 1128 >> 2]) { $2 = $3; break label$4; } label$6 : { if (!$4) { $2 = dlrealloc($3, 0); break label$6; } if ($4 + $4 >>> 0 >= $4 >>> 0) { $2 = dlrealloc($3, $4 << 1); if ($2) { break label$6 } dlfree($3); $2 = HEAP32[$0 + 4 >> 2]; } HEAP32[$2 + 1120 >> 2] = 0; break label$3; } $3 = HEAP32[$0 + 4 >> 2]; HEAP32[$3 + 1120 >> 2] = $2; if (!$2) { break label$3 } HEAP32[$3 + 1128 >> 2] = HEAP32[$3 + 1128 >> 2] << 1; $4 = HEAP32[$3 + 1124 >> 2]; } $3 = $2; $2 = HEAP32[1364] >>> 3 | 0; memcpy($3 + Math_imul($2, $4) | 0, $1, $2); $0 = HEAP32[$0 + 4 >> 2]; HEAP32[$0 + 1124 >> 2] = HEAP32[$0 + 1124 >> 2] + 1; return 1; } HEAP32[HEAP32[$0 >> 2] >> 2] = 8; } return 0; } function FLAC__stream_decoder_set_metadata_ignore_all($0) { $0 = $0 | 0; if (HEAP32[HEAP32[$0 >> 2] >> 2] == 9) { memset(HEAP32[$0 + 4 >> 2] + 608 | 0, 512); HEAP32[HEAP32[$0 + 4 >> 2] + 1124 >> 2] = 0; $0 = 1; } else { $0 = 0 } return $0 | 0; } function FLAC__stream_decoder_get_state($0) { $0 = $0 | 0; return HEAP32[HEAP32[$0 >> 2] >> 2]; } function FLAC__stream_decoder_get_md5_checking($0) { $0 = $0 | 0; return HEAP32[HEAP32[$0 >> 2] + 28 >> 2]; } function FLAC__stream_decoder_process_single($0) { $0 = $0 | 0; var $1 = 0, $2 = 0, $3 = 0; $1 = global$0 - 16 | 0; global$0 = $1; $2 = 1; label$1 : { while (1) { label$3 : { label$4 : { switch (HEAP32[HEAP32[$0 >> 2] >> 2]) { case 0: if (find_metadata_($0)) { continue } $2 = 0; break label$3; case 1: $3 = (read_metadata_($0) | 0) != 0; break label$1; case 2: if (frame_sync_($0)) { continue } break label$3; case 4: case 7: break label$3; case 3: break label$4; default: break label$1; }; } if (!read_frame_($0, $1 + 12 | 0)) { $2 = 0; break label$3; } if (!HEAP32[$1 + 12 >> 2]) { continue } } break; }; $3 = $2; } global$0 = $1 + 16 | 0; return $3 | 0; } function find_metadata_($0) { var $1 = 0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0; $2 = global$0 - 16 | 0; global$0 = $2; $5 = 1; label$1 : { while (1) { $1 = 0; label$3 : { while (1) { $6 = HEAP32[$0 + 4 >> 2]; label$5 : { if (HEAP32[$6 + 3520 >> 2]) { $4 = HEAPU8[$6 + 3590 | 0]; HEAP32[$2 + 8 >> 2] = $4; HEAP32[$6 + 3520 >> 2] = 0; break label$5; } if (!FLAC__bitreader_read_raw_uint32(HEAP32[$6 + 56 >> 2], $2 + 8 | 0, 8)) { $3 = 0; break label$1; } $4 = HEAP32[$2 + 8 >> 2]; } if (HEAPU8[$3 + 5409 | 0] == ($4 | 0)) { $3 = $3 + 1 | 0; $1 = 1; break label$3; } $3 = 0; if (($1 | 0) == 3) { break label$1 } if (HEAPU8[$1 + 7552 | 0] == ($4 | 0)) { $1 = $1 + 1 | 0; if (($1 | 0) != 3) { continue } label$10 : { label$11 : { if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], $2 + 12 | 0, 24)) { break label$11 } if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], $2 + 12 | 0, 8)) { break label$11 } $4 = HEAP32[$2 + 12 >> 2]; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], $2 + 12 | 0, 8)) { break label$11 } $6 = HEAP32[$2 + 12 >> 2]; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], $2 + 12 | 0, 8)) { break label$11 } $7 = HEAP32[$2 + 12 >> 2]; if (FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], $2 + 12 | 0, 8)) { break label$10 } } break label$1; } if (FLAC__bitreader_skip_byte_block_aligned_no_crc(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], HEAP32[$2 + 12 >> 2] & 127 | ($7 << 7 & 16256 | ($6 & 127 | $4 << 7 & 16256) << 14))) { continue } break label$1; } break; }; label$12 : { if (($4 | 0) != 255) { break label$12 } HEAP8[HEAP32[$0 + 4 >> 2] + 3588 | 0] = 255; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], $2 + 8 | 0, 8)) { break label$1 } $1 = HEAP32[$2 + 8 >> 2]; if (($1 | 0) == 255) { $1 = HEAP32[$0 + 4 >> 2]; HEAP32[$1 + 3520 >> 2] = 1; HEAP8[$1 + 3590 | 0] = 255; break label$12; } if (($1 & -2) != 248) { break label$12 } HEAP8[HEAP32[$0 + 4 >> 2] + 3589 | 0] = $1; HEAP32[HEAP32[$0 >> 2] >> 2] = 3; $3 = 1; break label$1; } $1 = 0; if (!$5) { break label$3 } $5 = HEAP32[$0 + 4 >> 2]; $1 = 0; if (HEAP32[$5 + 3632 >> 2]) { break label$3 } FUNCTION_TABLE[HEAP32[$5 + 32 >> 2]]($0, 0, HEAP32[$5 + 48 >> 2]); $1 = 0; } $5 = $1; if ($3 >>> 0 < 4) { continue } break; }; $3 = 1; HEAP32[HEAP32[$0 >> 2] >> 2] = 1; } global$0 = $2 + 16 | 0; return $3; } function read_metadata_($0) { var $1 = 0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $20 = 0; $7 = global$0 - 192 | 0; global$0 = $7; label$1 : { label$2 : { if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], $7 + 184 | 0, HEAP32[1391])) { break label$2 } $15 = HEAP32[$7 + 184 >> 2]; $4 = $0 + 4 | 0; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $7 + 180 | 0, HEAP32[1392])) { break label$1 } if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $7 + 176 | 0, HEAP32[1393])) { break label$1 } $6 = ($15 | 0) != 0; label$3 : { label$4 : { label$5 : { label$6 : { label$7 : { $2 = HEAP32[$7 + 180 >> 2]; switch ($2 | 0) { case 3: break label$6; case 0: break label$7; default: break label$5; }; } $3 = HEAP32[$7 + 176 >> 2]; $2 = 0; $1 = HEAP32[$4 >> 2]; HEAP32[$1 + 256 >> 2] = 0; HEAP32[$1 + 264 >> 2] = $3; HEAP32[$1 + 260 >> 2] = $6; $5 = HEAP32[$1 + 56 >> 2]; $1 = HEAP32[1356]; if (!FLAC__bitreader_read_raw_uint32($5, $7, $1)) { break label$1 } HEAP32[HEAP32[$4 >> 2] + 272 >> 2] = HEAP32[$7 >> 2]; $5 = HEAP32[1357]; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $7, $5)) { break label$1 } HEAP32[HEAP32[$4 >> 2] + 276 >> 2] = HEAP32[$7 >> 2]; $6 = HEAP32[1358]; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $7, $6)) { break label$1 } HEAP32[HEAP32[$4 >> 2] + 280 >> 2] = HEAP32[$7 >> 2]; $8 = HEAP32[1359]; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $7, $8)) { break label$1 } HEAP32[HEAP32[$4 >> 2] + 284 >> 2] = HEAP32[$7 >> 2]; $9 = HEAP32[1360]; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $7, $9)) { break label$1 } HEAP32[HEAP32[$4 >> 2] + 288 >> 2] = HEAP32[$7 >> 2]; $10 = HEAP32[1361]; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $7, $10)) { break label$1 } HEAP32[HEAP32[$4 >> 2] + 292 >> 2] = HEAP32[$7 >> 2] + 1; $11 = HEAP32[1362]; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $7, $11)) { break label$1 } HEAP32[HEAP32[$4 >> 2] + 296 >> 2] = HEAP32[$7 >> 2] + 1; $12 = HEAP32[$4 >> 2]; $13 = HEAP32[$12 + 56 >> 2]; $14 = $12 + 304 | 0; $12 = HEAP32[1363]; if (!FLAC__bitreader_read_raw_uint64($13, $14, $12)) { break label$1 } $13 = HEAP32[$4 >> 2]; if (!FLAC__bitreader_read_byte_block_aligned_no_crc(HEAP32[$13 + 56 >> 2], $13 + 312 | 0, 16)) { break label$1 } if (!FLAC__bitreader_skip_byte_block_aligned_no_crc(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $3 - (($12 + ($11 + ($10 + ($9 + ($8 + ($6 + ($1 + $5 | 0) | 0) | 0) | 0) | 0) | 0) | 0) + 128 >>> 3 | 0) | 0)) { break label$2 } $1 = HEAP32[$4 >> 2]; HEAP32[$1 + 248 >> 2] = 1; if (!memcmp($1 + 312 | 0, 7555, 16)) { HEAP32[$1 + 3624 >> 2] = 0 } if (HEAP32[$1 + 3632 >> 2] | !HEAP32[$1 + 608 >> 2]) { break label$4 } $2 = HEAP32[$1 + 28 >> 2]; if (!$2) { break label$4 } FUNCTION_TABLE[$2]($0, $1 + 256 | 0, HEAP32[$1 + 48 >> 2]); break label$4; } $1 = HEAP32[$4 >> 2]; HEAP32[$1 + 252 >> 2] = 0; $5 = HEAP32[$7 + 176 >> 2]; HEAP32[$1 + 448 >> 2] = ($5 >>> 0) / 18; HEAP32[$1 + 440 >> 2] = $5; HEAP32[$1 + 436 >> 2] = $6; HEAP32[$1 + 432 >> 2] = 3; $1 = HEAP32[$4 >> 2]; $2 = HEAP32[$1 + 452 >> 2]; $3 = HEAP32[$1 + 448 >> 2]; label$9 : { if ($3) { __wasm_i64_mul($3, 0, 24, 0); if (!i64toi32_i32$HIGH_BITS) { $1 = dlrealloc($2, Math_imul($3, 24)); if ($1) { HEAP32[HEAP32[$4 >> 2] + 452 >> 2] = $1; break label$9; } dlfree($2); $1 = HEAP32[$4 >> 2]; } HEAP32[$1 + 452 >> 2] = 0; break label$3; } $1 = dlrealloc($2, 0); HEAP32[HEAP32[$4 >> 2] + 452 >> 2] = $1; if (!$1) { break label$3 } } $2 = HEAP32[$4 >> 2]; $1 = 0; label$14 : { if (!HEAP32[$2 + 448 >> 2]) { break label$14 } $6 = HEAP32[1367]; $8 = HEAP32[1366]; $9 = HEAP32[1365]; $3 = 0; while (1) { if (!FLAC__bitreader_read_raw_uint64(HEAP32[$2 + 56 >> 2], $7, $9)) { break label$2 } $2 = HEAP32[$7 + 4 >> 2]; $1 = Math_imul($3, 24); $10 = HEAP32[$4 >> 2]; $11 = $1 + HEAP32[$10 + 452 >> 2] | 0; HEAP32[$11 >> 2] = HEAP32[$7 >> 2]; HEAP32[$11 + 4 >> 2] = $2; if (!FLAC__bitreader_read_raw_uint64(HEAP32[$10 + 56 >> 2], $7, $8)) { break label$2 } $2 = HEAP32[$7 + 4 >> 2]; $10 = HEAP32[$4 >> 2]; $11 = $1 + HEAP32[$10 + 452 >> 2] | 0; HEAP32[$11 + 8 >> 2] = HEAP32[$7 >> 2]; HEAP32[$11 + 12 >> 2] = $2; if (!FLAC__bitreader_read_raw_uint32(HEAP32[$10 + 56 >> 2], $7 + 188 | 0, $6)) { break label$2 } $2 = HEAP32[$4 >> 2]; HEAP32[($1 + HEAP32[$2 + 452 >> 2] | 0) + 16 >> 2] = HEAP32[$7 + 188 >> 2]; $3 = $3 + 1 | 0; $1 = HEAP32[$2 + 448 >> 2]; if ($3 >>> 0 < $1 >>> 0) { continue } break; }; $1 = Math_imul($1, -18); } $1 = $1 + $5 | 0; if ($1) { if (!FLAC__bitreader_skip_byte_block_aligned_no_crc(HEAP32[$2 + 56 >> 2], $1)) { break label$2 } $2 = HEAP32[$4 >> 2]; } HEAP32[$2 + 252 >> 2] = 1; if (HEAP32[$2 + 3632 >> 2] | !HEAP32[$2 + 620 >> 2]) { break label$4 } $1 = HEAP32[$2 + 28 >> 2]; if (!$1) { break label$4 } FUNCTION_TABLE[$1]($0, $2 + 432 | 0, HEAP32[$2 + 48 >> 2]); break label$4; } $3 = HEAP32[$4 >> 2]; $8 = HEAP32[($3 + ($2 << 2) | 0) + 608 >> 2]; $5 = HEAP32[$7 + 176 >> 2]; $1 = memset($7, 176); HEAP32[$1 + 8 >> 2] = $5; HEAP32[$1 >> 2] = $2; HEAP32[$1 + 4 >> 2] = $6; $9 = !$8; label$17 : { if (($2 | 0) != 2) { break label$17 } $10 = $1 + 16 | 0; $6 = HEAP32[1364] >>> 3 | 0; if (!FLAC__bitreader_read_byte_block_aligned_no_crc(HEAP32[$3 + 56 >> 2], $10, $6)) { break label$2 } if ($5 >>> 0 < $6 >>> 0) { HEAP32[HEAP32[$0 >> 2] >> 2] = 8; $2 = 0; break label$1; } $5 = $5 - $6 | 0; $3 = HEAP32[$4 >> 2]; $11 = HEAP32[$3 + 1124 >> 2]; if (!$11) { break label$17 } $12 = HEAP32[$3 + 1120 >> 2]; $2 = 0; while (1) { if (memcmp($12 + Math_imul($2, $6) | 0, $10, $6)) { $2 = $2 + 1 | 0; if (($11 | 0) != ($2 | 0)) { continue } break label$17; } break; }; $9 = ($8 | 0) != 0; } if ($9) { if (!FLAC__bitreader_skip_byte_block_aligned_no_crc(HEAP32[$3 + 56 >> 2], $5)) { break label$2 } break label$4; } label$22 : { label$23 : { label$24 : { label$25 : { label$26 : { label$27 : { label$28 : { switch (HEAP32[$1 + 180 >> 2]) { case 1: if (FLAC__bitreader_skip_byte_block_aligned_no_crc(HEAP32[$3 + 56 >> 2], $5)) { break label$26 } $6 = 0; break label$22; case 2: if (!$5) { break label$27 } $2 = dlmalloc($5); HEAP32[$1 + 20 >> 2] = $2; if (!$2) { HEAP32[HEAP32[$0 >> 2] >> 2] = 8; $6 = 0; break label$22; } if (FLAC__bitreader_read_byte_block_aligned_no_crc(HEAP32[$3 + 56 >> 2], $2, $5)) { break label$26 } $6 = 0; break label$22; case 4: label$35 : { if ($5 >>> 0 < 8) { break label$35 } $6 = 0; if (!FLAC__bitreader_read_uint32_little_endian(HEAP32[$3 + 56 >> 2], $1 + 16 | 0)) { break label$22 } $5 = $5 + -8 | 0; $2 = HEAP32[$1 + 16 >> 2]; label$36 : { if ($2) { if ($5 >>> 0 < $2 >>> 0) { HEAP32[$1 + 16 >> 2] = 0; HEAP32[$1 + 20 >> 2] = 0; break label$35; } label$39 : { label$40 : { if (($2 | 0) == -1) { HEAP32[$1 + 20 >> 2] = 0; break label$40; } $3 = dlmalloc($2 + 1 | 0); HEAP32[$1 + 20 >> 2] = $3; if ($3) { break label$39 } } HEAP32[HEAP32[$0 >> 2] >> 2] = 8; break label$22; } if (!FLAC__bitreader_read_byte_block_aligned_no_crc(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $3, $2)) { break label$22 } $5 = $5 - $2 | 0; HEAP8[HEAP32[$1 + 20 >> 2] + HEAP32[$1 + 16 >> 2] | 0] = 0; break label$36; } HEAP32[$1 + 20 >> 2] = 0; } if (!FLAC__bitreader_read_uint32_little_endian(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $1 + 24 | 0)) { break label$22 } $2 = HEAP32[$1 + 24 >> 2]; if ($2 >>> 0 >= 100001) { HEAP32[$1 + 24 >> 2] = 0; break label$22; } if (!$2) { break label$35 } $3 = safe_malloc_mul_2op_p($2, 8); HEAP32[$1 + 28 >> 2] = $3; if (!$3) { break label$24 } if (!HEAP32[$1 + 24 >> 2]) { break label$35 } HEAP32[$3 >> 2] = 0; HEAP32[$3 + 4 >> 2] = 0; $2 = 0; label$43 : { if ($5 >>> 0 < 4) { break label$43 } while (1) { if (!FLAC__bitreader_read_uint32_little_endian(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $3)) { break label$23 } $5 = $5 + -4 | 0; $8 = HEAP32[$1 + 28 >> 2]; $9 = $2 << 3; $3 = $8 + $9 | 0; $6 = HEAP32[$3 >> 2]; label$45 : { if ($6) { if ($5 >>> 0 < $6 >>> 0) { break label$43 } label$47 : { label$48 : { if (($6 | 0) == -1) { HEAP32[($8 + ($2 << 3) | 0) + 4 >> 2] = 0; break label$48; } $8 = dlmalloc($6 + 1 | 0); HEAP32[$3 + 4 >> 2] = $8; if ($8) { break label$47 } } HEAP32[HEAP32[$0 >> 2] >> 2] = 8; break label$23; } $5 = $5 - $6 | 0; memset($8, HEAP32[$3 >> 2]); $6 = FLAC__bitreader_read_byte_block_aligned_no_crc(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], HEAP32[$3 + 4 >> 2], HEAP32[$3 >> 2]); $8 = $9 + HEAP32[$1 + 28 >> 2] | 0; $3 = HEAP32[$8 + 4 >> 2]; if (!$6) { dlfree($3); HEAP32[(HEAP32[$1 + 28 >> 2] + ($2 << 3) | 0) + 4 >> 2] = 0; break label$43; } HEAP8[$3 + HEAP32[$8 >> 2] | 0] = 0; break label$45; } HEAP32[$3 + 4 >> 2] = 0; } $2 = $2 + 1 | 0; if ($2 >>> 0 >= HEAPU32[$1 + 24 >> 2]) { break label$35 } $3 = HEAP32[$1 + 28 >> 2] + ($2 << 3) | 0; HEAP32[$3 >> 2] = 0; HEAP32[$3 + 4 >> 2] = 0; if ($5 >>> 0 >= 4) { continue } break; }; } HEAP32[$1 + 24 >> 2] = $2; } if (!$5) { break label$26 } if (!HEAP32[$1 + 24 >> 2]) { $2 = $1 + 28 | 0; dlfree(HEAP32[$2 >> 2]); HEAP32[$2 >> 2] = 0; } if (FLAC__bitreader_skip_byte_block_aligned_no_crc(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $5)) { break label$26 } $6 = 0; break label$22; case 5: $6 = 0; $2 = memset($1 + 16 | 0, 160); if (!FLAC__bitreader_read_byte_block_aligned_no_crc(HEAP32[$3 + 56 >> 2], $2, HEAP32[1378] >>> 3 | 0)) { break label$22 } if (!FLAC__bitreader_read_raw_uint64(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $1 + 152 | 0, HEAP32[1379])) { break label$22 } if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $1 + 188 | 0, HEAP32[1380])) { break label$22 } HEAP32[$1 + 160 >> 2] = HEAP32[$1 + 188 >> 2] != 0; if (!FLAC__bitreader_skip_bits_no_crc(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], HEAP32[1381])) { break label$22 } if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $1 + 188 | 0, HEAP32[1382])) { break label$22 } $2 = HEAP32[$1 + 188 >> 2]; HEAP32[$1 + 164 >> 2] = $2; if (!$2) { break label$26 } $2 = dlcalloc($2, 32); HEAP32[$1 + 168 >> 2] = $2; if (!$2) { break label$25 } $9 = HEAP32[1371]; if (!FLAC__bitreader_read_raw_uint64(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $2, $9)) { break label$22 } $10 = HEAP32[1373] >>> 3 | 0; $11 = HEAP32[1370]; $12 = HEAP32[1369]; $8 = HEAP32[1368]; $13 = HEAP32[1377]; $16 = HEAP32[1376]; $17 = HEAP32[1375]; $18 = HEAP32[1374]; $19 = HEAP32[1372]; $5 = 0; while (1) { if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $1 + 188 | 0, $19)) { break label$22 } $2 = ($5 << 5) + $2 | 0; HEAP8[$2 + 8 | 0] = HEAP32[$1 + 188 >> 2]; if (!FLAC__bitreader_read_byte_block_aligned_no_crc(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $2 + 9 | 0, $10)) { break label$22 } if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $1 + 188 | 0, $18)) { break label$22 } HEAP8[$2 + 22 | 0] = HEAPU8[$2 + 22 | 0] & 254 | HEAP8[$1 + 188 | 0] & 1; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $1 + 188 | 0, $17)) { break label$22 } $3 = $2 + 22 | 0; HEAP8[$3 | 0] = HEAPU8[$1 + 188 | 0] << 1 & 2 | HEAPU8[$3 | 0] & 253; if (!FLAC__bitreader_skip_bits_no_crc(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $16)) { break label$22 } if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $1 + 188 | 0, $13)) { break label$22 } $3 = HEAP32[$1 + 188 >> 2]; HEAP8[$2 + 23 | 0] = $3; label$53 : { $3 = $3 & 255; if (!$3) { break label$53 } $3 = dlcalloc($3, 16); HEAP32[$2 + 24 >> 2] = $3; label$54 : { if ($3) { $14 = $2 + 23 | 0; if (!HEAPU8[$14 | 0]) { break label$53 } if (!FLAC__bitreader_read_raw_uint64(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $3, $8)) { break label$22 } $20 = $2 + 24 | 0; $2 = 0; break label$54; } HEAP32[HEAP32[$0 >> 2] >> 2] = 8; break label$22; } while (1) { if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $1 + 188 | 0, $12)) { break label$22 } HEAP8[(($2 << 4) + $3 | 0) + 8 | 0] = HEAP32[$1 + 188 >> 2]; if (!FLAC__bitreader_skip_bits_no_crc(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $11)) { break label$22 } $2 = $2 + 1 | 0; if ($2 >>> 0 >= HEAPU8[$14 | 0]) { break label$53 } $3 = HEAP32[$20 >> 2]; if (FLAC__bitreader_read_raw_uint64(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $3 + ($2 << 4) | 0, $8)) { continue } break; }; break label$22; } $5 = $5 + 1 | 0; if ($5 >>> 0 >= HEAPU32[$1 + 164 >> 2]) { break label$26 } $2 = HEAP32[$1 + 168 >> 2]; if (FLAC__bitreader_read_raw_uint64(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $2 + ($5 << 5) | 0, $9)) { continue } break; }; break label$22; case 6: label$57 : { if (!FLAC__bitreader_read_raw_uint32(HEAP32[$3 + 56 >> 2], $1 + 188 | 0, HEAP32[1383])) { break label$57 } HEAP32[$1 + 16 >> 2] = HEAP32[$1 + 188 >> 2]; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $1 + 188 | 0, HEAP32[1384])) { break label$57 } label$58 : { $2 = HEAP32[$1 + 188 >> 2]; label$59 : { if (($2 | 0) == -1) { HEAP32[$1 + 20 >> 2] = 0; break label$59; } $3 = dlmalloc($2 + 1 | 0); HEAP32[$1 + 20 >> 2] = $3; if ($3) { break label$58 } } HEAP32[HEAP32[$0 >> 2] >> 2] = 8; $6 = 0; break label$22; } if ($2) { if (!FLAC__bitreader_read_byte_block_aligned_no_crc(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $3, $2)) { break label$57 } $3 = HEAP32[$1 + 20 >> 2]; $2 = HEAP32[$1 + 188 >> 2]; } else { $2 = 0 } HEAP8[$2 + $3 | 0] = 0; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $1 + 188 | 0, HEAP32[1385])) { break label$57 } label$63 : { $2 = HEAP32[$1 + 188 >> 2]; label$64 : { if (($2 | 0) == -1) { HEAP32[$1 + 24 >> 2] = 0; break label$64; } $3 = dlmalloc($2 + 1 | 0); HEAP32[$1 + 24 >> 2] = $3; if ($3) { break label$63 } } HEAP32[HEAP32[$0 >> 2] >> 2] = 8; $6 = 0; break label$22; } if ($2) { if (!FLAC__bitreader_read_byte_block_aligned_no_crc(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $3, $2)) { break label$57 } $3 = HEAP32[$1 + 24 >> 2]; $2 = HEAP32[$1 + 188 >> 2]; } else { $2 = 0 } HEAP8[$2 + $3 | 0] = 0; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $1 + 28 | 0, HEAP32[1386])) { break label$57 } if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $1 + 32 | 0, HEAP32[1387])) { break label$57 } if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $1 + 36 | 0, HEAP32[1388])) { break label$57 } if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $1 + 40 | 0, HEAP32[1389])) { break label$57 } if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $1 + 44 | 0, HEAP32[1390])) { break label$57 } $2 = HEAP32[$1 + 44 >> 2]; $3 = dlmalloc($2 ? $2 : 1); HEAP32[$1 + 48 >> 2] = $3; if (!$3) { HEAP32[HEAP32[$0 >> 2] >> 2] = 8; $6 = 0; break label$22; } if (!$2) { break label$26 } if (FLAC__bitreader_read_byte_block_aligned_no_crc(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $3, $2)) { break label$26 } } $6 = 0; break label$22; case 0: case 3: break label$26; default: break label$28; }; } label$69 : { if ($5) { $2 = dlmalloc($5); HEAP32[$1 + 16 >> 2] = $2; if ($2) { break label$69 } HEAP32[HEAP32[$0 >> 2] >> 2] = 8; $6 = 0; break label$22; } HEAP32[$1 + 16 >> 2] = 0; break label$26; } if (FLAC__bitreader_read_byte_block_aligned_no_crc(HEAP32[$3 + 56 >> 2], $2, $5)) { break label$26 } $6 = 0; break label$22; } HEAP32[$1 + 20 >> 2] = 0; } $6 = 1; $2 = HEAP32[$4 >> 2]; if (HEAP32[$2 + 3632 >> 2]) { break label$22 } $3 = HEAP32[$2 + 28 >> 2]; if (!$3) { break label$22 } FUNCTION_TABLE[$3]($0, $1, HEAP32[$2 + 48 >> 2]); break label$22; } HEAP32[HEAP32[$0 >> 2] >> 2] = 8; break label$22; } HEAP32[$1 + 24 >> 2] = 0; HEAP32[HEAP32[$0 >> 2] >> 2] = 8; break label$22; } HEAP32[$1 + 24 >> 2] = $2; $6 = 0; } label$71 : { label$72 : { switch (HEAP32[$1 + 180 >> 2] + -1 | 0) { case 1: $1 = HEAP32[$1 + 20 >> 2]; if (!$1) { break label$71 } dlfree($1); break label$71; case 3: $2 = HEAP32[$1 + 20 >> 2]; if ($2) { dlfree($2) } $3 = HEAP32[$1 + 24 >> 2]; if ($3) { $2 = 0; while (1) { $5 = HEAP32[(HEAP32[$1 + 28 >> 2] + ($2 << 3) | 0) + 4 >> 2]; if ($5) { dlfree($5); $3 = HEAP32[$1 + 24 >> 2]; } $2 = $2 + 1 | 0; if ($2 >>> 0 < $3 >>> 0) { continue } break; }; } $1 = HEAP32[$1 + 28 >> 2]; if (!$1) { break label$71 } dlfree($1); break label$71; case 4: $3 = HEAP32[$1 + 164 >> 2]; if ($3) { $2 = 0; while (1) { $5 = HEAP32[(HEAP32[$1 + 168 >> 2] + ($2 << 5) | 0) + 24 >> 2]; if ($5) { dlfree($5); $3 = HEAP32[$1 + 164 >> 2]; } $2 = $2 + 1 | 0; if ($2 >>> 0 < $3 >>> 0) { continue } break; }; } $1 = HEAP32[$1 + 168 >> 2]; if (!$1) { break label$71 } dlfree($1); break label$71; case 5: $2 = HEAP32[$1 + 20 >> 2]; if ($2) { dlfree($2) } $2 = HEAP32[$1 + 24 >> 2]; if ($2) { dlfree($2) } $1 = HEAP32[$1 + 48 >> 2]; if (!$1) { break label$71 } dlfree($1); break label$71; case 0: break label$71; default: break label$72; }; } $1 = HEAP32[$1 + 16 >> 2]; if (!$1) { break label$71 } dlfree($1); } if (!$6) { break label$2 } } $2 = 1; if (!$15) { break label$1 } label$86 : { label$87 : { $3 = HEAP32[$4 >> 2]; if (HEAP32[$3 >> 2]) { break label$87 } $5 = HEAP32[$3 + 12 >> 2]; if (!$5) { break label$87 } $1 = $3 + 6136 | 0; if (FUNCTION_TABLE[$5]($0, $1, HEAP32[$3 + 48 >> 2])) { break label$87 } if (!FLAC__bitreader_is_consumed_byte_aligned(HEAP32[HEAP32[$4 >> 2] + 56 >> 2])) { break label$87 } $3 = HEAP32[$1 >> 2]; $4 = HEAP32[HEAP32[$4 >> 2] + 56 >> 2]; $4 = ((HEAP32[$4 + 8 >> 2] - HEAP32[$4 + 16 >> 2] << 5) + (HEAP32[$4 + 12 >> 2] << 3) | 0) - HEAP32[$4 + 20 >> 2] >>> 3 | 0; $5 = HEAP32[$1 + 4 >> 2] - ($3 >>> 0 < $4 >>> 0) | 0; HEAP32[$1 >> 2] = $3 - $4; HEAP32[$1 + 4 >> 2] = $5; break label$86; } $1 = HEAP32[$4 >> 2]; HEAP32[$1 + 6136 >> 2] = 0; HEAP32[$1 + 6140 >> 2] = 0; } HEAP32[HEAP32[$0 >> 2] >> 2] = 2; break label$1; } HEAP32[HEAP32[$0 >> 2] >> 2] = 8; } $2 = 0; } global$0 = $7 + 192 | 0; return $2; } function frame_sync_($0) { var $1 = 0, $2 = 0, $3 = 0, $4 = 0, $5 = 0; $4 = global$0 - 16 | 0; global$0 = $4; label$1 : { label$2 : { label$3 : { $2 = HEAP32[$0 + 4 >> 2]; if (!HEAP32[$2 + 248 >> 2]) { break label$3 } $3 = HEAP32[$2 + 308 >> 2]; $1 = $3; $5 = HEAP32[$2 + 304 >> 2]; if (!($1 | $5)) { break label$3 } $3 = HEAP32[$2 + 244 >> 2]; if (($1 | 0) == ($3 | 0) & HEAPU32[$2 + 240 >> 2] < $5 >>> 0 | $3 >>> 0 < $1 >>> 0) { break label$3 } HEAP32[HEAP32[$0 >> 2] >> 2] = 4; break label$2; } label$4 : { if (FLAC__bitreader_is_consumed_byte_aligned(HEAP32[$2 + 56 >> 2])) { break label$4 } $2 = HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2]; if (FLAC__bitreader_read_raw_uint32($2, $4 + 12 | 0, FLAC__bitreader_bits_left_for_byte_alignment($2))) { break label$4 } $1 = 0; break label$1; } $2 = 0; while (1) { $3 = HEAP32[$0 + 4 >> 2]; label$6 : { if (HEAP32[$3 + 3520 >> 2]) { $1 = HEAPU8[$3 + 3590 | 0]; HEAP32[$4 + 12 >> 2] = $1; HEAP32[$3 + 3520 >> 2] = 0; break label$6; } $1 = 0; if (!FLAC__bitreader_read_raw_uint32(HEAP32[$3 + 56 >> 2], $4 + 12 | 0, 8)) { break label$1 } $1 = HEAP32[$4 + 12 >> 2]; } label$8 : { if (($1 | 0) != 255) { break label$8 } HEAP8[HEAP32[$0 + 4 >> 2] + 3588 | 0] = 255; $1 = 0; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], $4 + 12 | 0, 8)) { break label$1 } $1 = HEAP32[$4 + 12 >> 2]; if (($1 | 0) == 255) { $1 = HEAP32[$0 + 4 >> 2]; HEAP32[$1 + 3520 >> 2] = 1; HEAP8[$1 + 3590 | 0] = 255; break label$8; } if (($1 & -2) != 248) { break label$8 } HEAP8[HEAP32[$0 + 4 >> 2] + 3589 | 0] = $1; HEAP32[HEAP32[$0 >> 2] >> 2] = 3; break label$2; } $1 = $2; $2 = 1; if ($1) { continue } $1 = HEAP32[$0 + 4 >> 2]; if (HEAP32[$1 + 3632 >> 2]) { continue } FUNCTION_TABLE[HEAP32[$1 + 32 >> 2]]($0, 0, HEAP32[$1 + 48 >> 2]); continue; }; } $1 = 1; } global$0 = $4 + 16 | 0; return $1; } function read_frame_($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0; $7 = global$0 + -64 | 0; global$0 = $7; HEAP32[$1 >> 2] = 0; $2 = HEAP32[$0 + 4 >> 2]; $4 = HEAPU16[(HEAPU8[$2 + 3588 | 0] << 1) + 1280 >> 1]; $5 = HEAP32[$2 + 56 >> 2]; HEAP32[$5 + 24 >> 2] = HEAPU16[((HEAPU8[$2 + 3589 | 0] ^ $4 >>> 8) << 1) + 1280 >> 1] ^ $4 << 8 & 65280; $2 = HEAP32[$5 + 20 >> 2]; HEAP32[$5 + 28 >> 2] = HEAP32[$5 + 16 >> 2]; HEAP32[$5 + 32 >> 2] = $2; $5 = HEAP32[$0 + 4 >> 2]; HEAP8[$7 + 32 | 0] = HEAPU8[$5 + 3588 | 0]; $2 = HEAPU8[$5 + 3589 | 0]; HEAP32[$7 + 12 >> 2] = 2; HEAP8[$7 + 33 | 0] = $2; label$1 : { if (!FLAC__bitreader_read_raw_uint32(HEAP32[$5 + 56 >> 2], $7 + 28 | 0, 8)) { break label$1 } $4 = $0 + 4 | 0; label$2 : { label$3 : { label$4 : { label$5 : { $5 = HEAP32[$7 + 28 >> 2]; if (($5 | 0) == 255) { break label$5 } HEAP8[$7 + 34 | 0] = $5; HEAP32[$7 + 12 >> 2] = 3; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $7 + 28 | 0, 8)) { break label$3 } $5 = HEAP32[$7 + 28 >> 2]; if (($5 | 0) == 255) { break label$5 } $8 = $2 >>> 1 & 1; $2 = HEAP32[$7 + 12 >> 2]; HEAP8[$2 + ($7 + 32 | 0) | 0] = $5; $5 = 1; HEAP32[$7 + 12 >> 2] = $2 + 1; $2 = HEAPU8[$7 + 34 | 0]; $3 = $2 >>> 4 | 0; HEAP32[$7 + 28 >> 2] = $3; label$6 : { label$7 : { label$8 : { label$9 : { switch ($3 - 1 | 0) { case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: HEAP32[HEAP32[$4 >> 2] + 1136 >> 2] = 256 << $3 + -8; break label$8; case 1: case 2: case 3: case 4: HEAP32[HEAP32[$4 >> 2] + 1136 >> 2] = 576 << $3 + -2; break label$8; case 5: case 6: break label$7; case 0: break label$9; default: break label$6; }; } HEAP32[HEAP32[$4 >> 2] + 1136 >> 2] = 192; } $3 = 0; } $5 = $8; } $6 = $2 & 15; HEAP32[$7 + 28 >> 2] = $6; label$12 : { label$13 : { label$14 : { switch ($6 - 1 | 0) { default: $6 = 0; $8 = HEAP32[$4 >> 2]; if (HEAP32[$8 + 248 >> 2]) { break label$13 } $5 = 1; break label$12; case 0: HEAP32[HEAP32[$4 >> 2] + 1140 >> 2] = 88200; $6 = 0; break label$12; case 1: HEAP32[HEAP32[$4 >> 2] + 1140 >> 2] = 176400; $6 = 0; break label$12; case 2: HEAP32[HEAP32[$4 >> 2] + 1140 >> 2] = 192e3; $6 = 0; break label$12; case 3: HEAP32[HEAP32[$4 >> 2] + 1140 >> 2] = 8e3; $6 = 0; break label$12; case 4: HEAP32[HEAP32[$4 >> 2] + 1140 >> 2] = 16e3; $6 = 0; break label$12; case 5: HEAP32[HEAP32[$4 >> 2] + 1140 >> 2] = 22050; $6 = 0; break label$12; case 6: HEAP32[HEAP32[$4 >> 2] + 1140 >> 2] = 24e3; $6 = 0; break label$12; case 7: HEAP32[HEAP32[$4 >> 2] + 1140 >> 2] = 32e3; $6 = 0; break label$12; case 8: HEAP32[HEAP32[$4 >> 2] + 1140 >> 2] = 44100; $6 = 0; break label$12; case 9: HEAP32[HEAP32[$4 >> 2] + 1140 >> 2] = 48e3; $6 = 0; break label$12; case 10: HEAP32[HEAP32[$4 >> 2] + 1140 >> 2] = 96e3; $6 = 0; break label$12; case 11: case 12: case 13: break label$12; case 14: break label$14; }; } $5 = HEAP32[$4 >> 2]; if (!HEAP32[$5 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$5 + 32 >> 2]]($0, 1, HEAP32[$5 + 48 >> 2]) } $2 = HEAP32[$0 >> 2]; HEAP32[$2 >> 2] = 2; break label$4; } HEAP32[$8 + 1140 >> 2] = HEAP32[$8 + 288 >> 2]; } $10 = HEAPU8[$7 + 35 | 0]; $9 = $10 >>> 4 | 0; HEAP32[$7 + 28 >> 2] = $9; label$28 : { label$29 : { if ($9 & 8) { $2 = HEAP32[$4 >> 2]; HEAP32[$2 + 1144 >> 2] = 2; $8 = 1; label$31 : { switch ($9 & 7) { case 1: $8 = 2; break label$29; case 0: break label$29; case 2: break label$31; default: break label$28; }; } $8 = 3; break label$29; } $2 = HEAP32[$4 >> 2]; HEAP32[$2 + 1144 >> 2] = $9 + 1; $8 = 0; } HEAP32[$2 + 1148 >> 2] = $8; $8 = $5; } $9 = $10 >>> 1 & 7; HEAP32[$7 + 28 >> 2] = $9; $5 = 1; label$33 : { label$34 : { label$35 : { switch ($9 - 1 | 0) { default: if (!HEAP32[$2 + 248 >> 2]) { break label$33 } HEAP32[$2 + 1152 >> 2] = HEAP32[$2 + 296 >> 2]; break label$34; case 0: HEAP32[$2 + 1152 >> 2] = 8; break label$34; case 1: HEAP32[$2 + 1152 >> 2] = 12; break label$34; case 3: HEAP32[$2 + 1152 >> 2] = 16; break label$34; case 4: HEAP32[$2 + 1152 >> 2] = 20; break label$34; case 2: case 6: break label$33; case 5: break label$35; }; } HEAP32[$2 + 1152 >> 2] = 24; } $5 = $8; } label$41 : { if (!(!HEAP32[$2 + 248 >> 2] | HEAP32[$2 + 272 >> 2] == HEAP32[$2 + 276 >> 2] ? !(HEAP8[$7 + 33 | 0] & 1) : 0)) { if (!FLAC__bitreader_read_utf8_uint64(HEAP32[$2 + 56 >> 2], $7 + 16 | 0, $7 + 32 | 0, $7 + 12 | 0)) { break label$3 } $8 = HEAP32[$7 + 20 >> 2]; $2 = $8; $9 = HEAP32[$7 + 16 >> 2]; if (($9 | 0) == -1 & ($2 | 0) == -1) { $8 = HEAPU8[(HEAP32[$7 + 12 >> 2] + $7 | 0) + 31 | 0]; $5 = HEAP32[$4 >> 2]; HEAP32[$5 + 3520 >> 2] = 1; HEAP8[$5 + 3590 | 0] = $8; if (!HEAP32[$5 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$5 + 32 >> 2]]($0, 1, HEAP32[$5 + 48 >> 2]) } $2 = HEAP32[$0 >> 2]; HEAP32[$2 >> 2] = 2; break label$4; } $8 = HEAP32[$4 >> 2]; $11 = $8 + 1160 | 0; HEAP32[$11 >> 2] = $9; HEAP32[$11 + 4 >> 2] = $2; HEAP32[$8 + 1156 >> 2] = 1; break label$41; } if (!FLAC__bitreader_read_utf8_uint32(HEAP32[$2 + 56 >> 2], $7 + 28 | 0, $7 + 32 | 0, $7 + 12 | 0)) { break label$3 } $8 = HEAP32[$7 + 28 >> 2]; if (($8 | 0) == -1) { $8 = HEAPU8[(HEAP32[$7 + 12 >> 2] + $7 | 0) + 31 | 0]; $5 = HEAP32[$4 >> 2]; HEAP32[$5 + 3520 >> 2] = 1; HEAP8[$5 + 3590 | 0] = $8; if (!HEAP32[$5 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$5 + 32 >> 2]]($0, 1, HEAP32[$5 + 48 >> 2]) } $2 = HEAP32[$0 >> 2]; HEAP32[$2 >> 2] = 2; break label$4; } $2 = HEAP32[$4 >> 2]; HEAP32[$2 + 1160 >> 2] = $8; HEAP32[$2 + 1156 >> 2] = 0; } $2 = HEAP32[$4 >> 2]; if ($3) { if (!FLAC__bitreader_read_raw_uint32(HEAP32[$2 + 56 >> 2], $7 + 28 | 0, 8)) { break label$3 } $2 = HEAP32[$7 + 12 >> 2]; $8 = HEAP32[$7 + 28 >> 2]; HEAP8[$2 + ($7 + 32 | 0) | 0] = $8; HEAP32[$7 + 12 >> 2] = $2 + 1; if (($3 | 0) == 7) { if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $7 + 8 | 0, 8)) { break label$3 } $8 = HEAP32[$7 + 12 >> 2]; $2 = HEAP32[$7 + 8 >> 2]; HEAP8[$8 + ($7 + 32 | 0) | 0] = $2; HEAP32[$7 + 12 >> 2] = $8 + 1; $8 = $2 | HEAP32[$7 + 28 >> 2] << 8; HEAP32[$7 + 28 >> 2] = $8; } $2 = HEAP32[$4 >> 2]; HEAP32[$2 + 1136 >> 2] = $8 + 1; } if ($6) { if (!FLAC__bitreader_read_raw_uint32(HEAP32[$2 + 56 >> 2], $7 + 28 | 0, 8)) { break label$3 } $8 = HEAP32[$7 + 12 >> 2]; $2 = HEAP32[$7 + 28 >> 2]; HEAP8[$8 + ($7 + 32 | 0) | 0] = $2; HEAP32[$7 + 12 >> 2] = $8 + 1; label$51 : { if (($6 | 0) != 12) { if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $7 + 8 | 0, 8)) { break label$3 } $8 = HEAP32[$7 + 12 >> 2]; $2 = HEAP32[$7 + 8 >> 2]; HEAP8[$8 + ($7 + 32 | 0) | 0] = $2; HEAP32[$7 + 12 >> 2] = $8 + 1; $3 = $2 | HEAP32[$7 + 28 >> 2] << 8; HEAP32[$7 + 28 >> 2] = $3; if (($6 | 0) == 13) { break label$51 } $3 = Math_imul($3, 10); break label$51; } $3 = Math_imul($2, 1e3); } $2 = HEAP32[$4 >> 2]; HEAP32[$2 + 1140 >> 2] = $3; } if (!FLAC__bitreader_read_raw_uint32(HEAP32[$2 + 56 >> 2], $7 + 28 | 0, 8)) { break label$3 } $8 = HEAPU8[$7 + 28 | 0]; $3 = FLAC__crc8($7 + 32 | 0, HEAP32[$7 + 12 >> 2]); $2 = HEAP32[$4 >> 2]; if (($3 | 0) != ($8 | 0)) { if (!HEAP32[$2 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$2 + 32 >> 2]]($0, 1, HEAP32[$2 + 48 >> 2]) } $2 = HEAP32[$0 >> 2]; HEAP32[$2 >> 2] = 2; break label$4; } HEAP32[$2 + 232 >> 2] = 0; label$55 : { label$56 : { if (HEAP32[$2 + 1156 >> 2]) { break label$56 } $3 = $2 + 1160 | 0; $8 = HEAP32[$3 >> 2]; HEAP32[$7 + 28 >> 2] = $8; HEAP32[$2 + 1156 >> 2] = 1; $6 = HEAP32[$2 + 228 >> 2]; if ($6) { (wasm2js_i32$0 = $3, wasm2js_i32$1 = __wasm_i64_mul($6, 0, $8, 0)), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; HEAP32[$3 + 4 >> 2] = i64toi32_i32$HIGH_BITS; break label$56; } if (HEAP32[$2 + 248 >> 2]) { $3 = HEAP32[$2 + 272 >> 2]; if (($3 | 0) != HEAP32[$2 + 276 >> 2]) { break label$55 } $2 = $2 + 1160 | 0; (wasm2js_i32$0 = $2, wasm2js_i32$1 = __wasm_i64_mul($3, 0, $8, 0)), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; HEAP32[$2 + 4 >> 2] = i64toi32_i32$HIGH_BITS; $8 = HEAP32[$4 >> 2]; HEAP32[$8 + 232 >> 2] = HEAP32[$8 + 276 >> 2]; break label$56; } if (!$8) { $8 = $2 + 1160 | 0; HEAP32[$8 >> 2] = 0; HEAP32[$8 + 4 >> 2] = 0; $8 = HEAP32[$4 >> 2]; HEAP32[$8 + 232 >> 2] = HEAP32[$8 + 1136 >> 2]; break label$56; } $3 = $2 + 1160 | 0; (wasm2js_i32$0 = $3, wasm2js_i32$1 = __wasm_i64_mul(HEAP32[$2 + 1136 >> 2], 0, $8, 0)), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; HEAP32[$3 + 4 >> 2] = i64toi32_i32$HIGH_BITS; } if (!($5 | $10 & 1)) { $2 = HEAP32[$0 >> 2]; break label$4; } $2 = HEAP32[$4 >> 2]; } label$61 : { if (!HEAP32[$2 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$2 + 32 >> 2]]($0, 3, HEAP32[$2 + 48 >> 2]); break label$61; } HEAP32[$2 + 6152 >> 2] = HEAP32[$2 + 6152 >> 2] + 1; } $2 = HEAP32[$0 >> 2]; HEAP32[$2 >> 2] = 2; break label$4; } $5 = HEAP32[$4 >> 2]; HEAP32[$5 + 3520 >> 2] = 1; HEAP8[$5 + 3590 | 0] = 255; if (!HEAP32[$5 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$5 + 32 >> 2]]($0, 1, HEAP32[$5 + 48 >> 2]) } $2 = HEAP32[$0 >> 2]; HEAP32[$2 >> 2] = 2; } $8 = 1; if (HEAP32[$2 >> 2] == 2) { break label$1 } $2 = HEAP32[$4 >> 2]; $5 = HEAP32[$2 + 1144 >> 2]; $6 = HEAP32[$2 + 1136 >> 2]; if (!(HEAPU32[$2 + 224 >> 2] >= $5 >>> 0 ? HEAPU32[$2 + 220 >> 2] >= $6 >>> 0 : 0)) { $3 = HEAP32[$2 + 60 >> 2]; if ($3) { dlfree($3 + -16 | 0); HEAP32[HEAP32[$4 >> 2] + 60 >> 2] = 0; $2 = HEAP32[$4 >> 2]; } $3 = HEAP32[$2 + 3592 >> 2]; if ($3) { dlfree($3); HEAP32[HEAP32[$4 >> 2] + 92 >> 2] = 0; HEAP32[HEAP32[$4 >> 2] + 3592 >> 2] = 0; $2 = HEAP32[$4 >> 2]; } $3 = HEAP32[$2 - -64 >> 2]; if ($3) { dlfree($3 + -16 | 0); HEAP32[HEAP32[$4 >> 2] - -64 >> 2] = 0; $2 = HEAP32[$4 >> 2]; } $3 = HEAP32[$2 + 3596 >> 2]; if ($3) { dlfree($3); HEAP32[HEAP32[$4 >> 2] + 96 >> 2] = 0; HEAP32[HEAP32[$4 >> 2] + 3596 >> 2] = 0; $2 = HEAP32[$4 >> 2]; } $3 = HEAP32[$2 + 68 >> 2]; if ($3) { dlfree($3 + -16 | 0); HEAP32[HEAP32[$4 >> 2] + 68 >> 2] = 0; $2 = HEAP32[$4 >> 2]; } $3 = HEAP32[$2 + 3600 >> 2]; if ($3) { dlfree($3); HEAP32[HEAP32[$4 >> 2] + 100 >> 2] = 0; HEAP32[HEAP32[$4 >> 2] + 3600 >> 2] = 0; $2 = HEAP32[$4 >> 2]; } $3 = HEAP32[$2 + 72 >> 2]; if ($3) { dlfree($3 + -16 | 0); HEAP32[HEAP32[$4 >> 2] + 72 >> 2] = 0; $2 = HEAP32[$4 >> 2]; } $3 = HEAP32[$2 + 3604 >> 2]; if ($3) { dlfree($3); HEAP32[HEAP32[$4 >> 2] + 104 >> 2] = 0; HEAP32[HEAP32[$4 >> 2] + 3604 >> 2] = 0; $2 = HEAP32[$4 >> 2]; } $3 = HEAP32[$2 + 76 >> 2]; if ($3) { dlfree($3 + -16 | 0); HEAP32[HEAP32[$4 >> 2] + 76 >> 2] = 0; $2 = HEAP32[$4 >> 2]; } $3 = HEAP32[$2 + 3608 >> 2]; if ($3) { dlfree($3); HEAP32[HEAP32[$4 >> 2] + 108 >> 2] = 0; HEAP32[HEAP32[$4 >> 2] + 3608 >> 2] = 0; $2 = HEAP32[$4 >> 2]; } $3 = HEAP32[$2 + 80 >> 2]; if ($3) { dlfree($3 + -16 | 0); HEAP32[HEAP32[$4 >> 2] + 80 >> 2] = 0; $2 = HEAP32[$4 >> 2]; } $3 = HEAP32[$2 + 3612 >> 2]; if ($3) { dlfree($3); HEAP32[HEAP32[$4 >> 2] + 112 >> 2] = 0; HEAP32[HEAP32[$4 >> 2] + 3612 >> 2] = 0; $2 = HEAP32[$4 >> 2]; } $3 = HEAP32[$2 + 84 >> 2]; if ($3) { dlfree($3 + -16 | 0); HEAP32[HEAP32[$4 >> 2] + 84 >> 2] = 0; $2 = HEAP32[$4 >> 2]; } $3 = HEAP32[$2 + 3616 >> 2]; if ($3) { dlfree($3); HEAP32[HEAP32[$4 >> 2] + 116 >> 2] = 0; HEAP32[HEAP32[$4 >> 2] + 3616 >> 2] = 0; $2 = HEAP32[$4 >> 2]; } $3 = HEAP32[$2 + 88 >> 2]; if ($3) { dlfree($3 + -16 | 0); HEAP32[HEAP32[$4 >> 2] + 88 >> 2] = 0; $2 = HEAP32[$4 >> 2]; } $2 = HEAP32[$2 + 3620 >> 2]; if ($2) { dlfree($2); HEAP32[HEAP32[$4 >> 2] + 120 >> 2] = 0; HEAP32[HEAP32[$4 >> 2] + 3620 >> 2] = 0; } label$97 : { if (!$5) { break label$97 } if ($6 >>> 0 > 4294967291) { break label$2 } $2 = $6 + 4 | 0; if (($2 & 1073741823) != ($2 | 0)) { break label$2 } $9 = $2 << 2; $3 = 0; while (1) { $2 = dlmalloc($9); if (!$2) { break label$2 } HEAP32[$2 >> 2] = 0; HEAP32[$2 + 4 >> 2] = 0; HEAP32[$2 + 8 >> 2] = 0; HEAP32[$2 + 12 >> 2] = 0; $10 = $3 << 2; HEAP32[($10 + HEAP32[$4 >> 2] | 0) + 60 >> 2] = $2 + 16; $2 = $10 + HEAP32[$4 >> 2] | 0; if (FLAC__memory_alloc_aligned_int32_array($6, $2 + 3592 | 0, $2 + 92 | 0)) { $3 = $3 + 1 | 0; if (($5 | 0) == ($3 | 0)) { break label$97 } continue; } break; }; HEAP32[HEAP32[$0 >> 2] >> 2] = 8; break label$3; } $2 = HEAP32[$4 >> 2]; HEAP32[$2 + 224 >> 2] = $5; HEAP32[$2 + 220 >> 2] = $6; $5 = HEAP32[$2 + 1144 >> 2]; } label$100 : { if ($5) { $17 = HEAP32[1412]; $20 = -1 << $17 ^ -1; $18 = HEAP32[1406]; $19 = HEAP32[1405]; $21 = HEAP32[1413]; $5 = 0; while (1) { $3 = HEAP32[$2 + 1152 >> 2]; label$103 : { label$104 : { switch (HEAP32[$2 + 1148 >> 2] + -1 | 0) { case 0: $3 = (($5 | 0) == 1) + $3 | 0; break label$103; case 1: $3 = !$5 + $3 | 0; break label$103; case 2: break label$104; default: break label$103; }; } $3 = (($5 | 0) == 1) + $3 | 0; } if (!FLAC__bitreader_read_raw_uint32(HEAP32[$2 + 56 >> 2], $7 + 28 | 0, 8)) { break label$3 } $2 = HEAP32[$7 + 28 >> 2]; HEAP32[$7 + 28 >> 2] = $2 & 254; $13 = $2 & 1; label$107 : { if ($13) { if (!FLAC__bitreader_read_unary_unsigned(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $7 + 32 | 0)) { break label$3 } $2 = HEAP32[$4 >> 2]; $6 = HEAP32[$7 + 32 >> 2] + 1 | 0; HEAP32[($2 + Math_imul($5, 292) | 0) + 1464 >> 2] = $6; if ($3 >>> 0 <= $6 >>> 0) { break label$3 } $3 = $3 - $6 | 0; break label$107; } $2 = HEAP32[$4 >> 2]; HEAP32[($2 + Math_imul($5, 292) | 0) + 1464 >> 2] = 0; } $6 = HEAP32[$7 + 28 >> 2]; label$109 : { if ($6 & 128) { if (!HEAP32[$2 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$2 + 32 >> 2]]($0, 0, HEAP32[$2 + 48 >> 2]) } HEAP32[HEAP32[$0 >> 2] >> 2] = 2; break label$109; } label$112 : { label$113 : { label$114 : { switch ($6 | 0) { case 0: $6 = HEAP32[(($5 << 2) + $2 | 0) + 60 >> 2]; $9 = Math_imul($5, 292) + $2 | 0; HEAP32[$9 + 1176 >> 2] = 0; if (!FLAC__bitreader_read_raw_int32(HEAP32[$2 + 56 >> 2], $7 + 32 | 0, $3)) { break label$3 } HEAP32[$9 + 1180 >> 2] = HEAP32[$7 + 32 >> 2]; $2 = 0; $3 = HEAP32[$4 >> 2]; if (!HEAP32[$3 + 1136 >> 2]) { break label$113 } while (1) { HEAP32[$6 + ($2 << 2) >> 2] = HEAP32[$7 + 32 >> 2]; $2 = $2 + 1 | 0; if ($2 >>> 0 < HEAPU32[$3 + 1136 >> 2]) { continue } break; }; break label$113; case 2: $6 = ($2 + 1136 | 0) + Math_imul($5, 292) | 0; $9 = $6 + 44 | 0; $10 = $5 << 2; $11 = HEAP32[($10 + $2 | 0) + 92 >> 2]; HEAP32[$9 >> 2] = $11; HEAP32[$6 + 40 >> 2] = 1; $6 = 0; if (HEAP32[$2 + 1136 >> 2]) { while (1) { if (!FLAC__bitreader_read_raw_int32(HEAP32[$2 + 56 >> 2], $7 + 32 | 0, $3)) { break label$3 } HEAP32[$11 + ($6 << 2) >> 2] = HEAP32[$7 + 32 >> 2]; $6 = $6 + 1 | 0; $2 = HEAP32[$4 >> 2]; $12 = HEAP32[$2 + 1136 >> 2]; if ($6 >>> 0 < $12 >>> 0) { continue } break; }; $6 = $12 << 2; } memcpy(HEAP32[($2 + $10 | 0) + 60 >> 2], HEAP32[$9 >> 2], $6); break label$113; default: break label$114; }; } if ($6 >>> 0 <= 15) { label$121 : { if (!HEAP32[$2 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$2 + 32 >> 2]]($0, 3, HEAP32[$2 + 48 >> 2]); break label$121; } HEAP32[$2 + 6152 >> 2] = HEAP32[$2 + 6152 >> 2] + 1; } HEAP32[HEAP32[$0 >> 2] >> 2] = 2; break label$109; } if ($6 >>> 0 <= 24) { $9 = Math_imul($5, 292) + $2 | 0; HEAP32[$9 + 1176 >> 2] = 2; $11 = $5 << 2; $12 = HEAP32[($11 + $2 | 0) + 92 >> 2]; $10 = $6 >>> 1 & 7; HEAP32[$9 + 1192 >> 2] = $10; HEAP32[$9 + 1212 >> 2] = $12; $6 = HEAP32[$2 + 56 >> 2]; if ($10) { $12 = $9 + 1196 | 0; $2 = 0; while (1) { if (!FLAC__bitreader_read_raw_int32($6, $7 + 32 | 0, $3)) { break label$3 } HEAP32[$12 + ($2 << 2) >> 2] = HEAP32[$7 + 32 >> 2]; $6 = HEAP32[HEAP32[$4 >> 2] + 56 >> 2]; $2 = $2 + 1 | 0; if (($10 | 0) != ($2 | 0)) { continue } break; }; } if (!FLAC__bitreader_read_raw_uint32($6, $7 + 16 | 0, $19)) { break label$3 } $6 = $9 + 1180 | 0; $3 = HEAP32[$7 + 16 >> 2]; HEAP32[$6 >> 2] = $3; $2 = HEAP32[$4 >> 2]; label$126 : { label$127 : { if ($3 >>> 0 <= 1) { if (!FLAC__bitreader_read_raw_uint32(HEAP32[$2 + 56 >> 2], $7 + 16 | 0, $18)) { break label$3 } $2 = HEAP32[$4 >> 2]; $3 = HEAP32[$7 + 16 >> 2]; if (HEAP32[$2 + 1136 >> 2] >>> $3 >>> 0 >= $10 >>> 0) { break label$127 } if (!HEAP32[$2 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$2 + 32 >> 2]]($0, 0, HEAP32[$2 + 48 >> 2]) } HEAP32[HEAP32[$0 >> 2] >> 2] = 2; break label$126; } label$130 : { if (!HEAP32[$2 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$2 + 32 >> 2]]($0, 3, HEAP32[$2 + 48 >> 2]); break label$130; } HEAP32[$2 + 6152 >> 2] = HEAP32[$2 + 6152 >> 2] + 1; } HEAP32[HEAP32[$0 >> 2] >> 2] = 2; break label$126; } HEAP32[$9 + 1184 >> 2] = $3; $2 = Math_imul($5, 12); HEAP32[$9 + 1188 >> 2] = ($2 + HEAP32[$4 >> 2] | 0) + 124; $6 = HEAP32[$6 >> 2]; if ($6 >>> 0 < 2) { $14 = $3; $3 = HEAP32[$0 + 4 >> 2]; if (!read_residual_partitioned_rice_($0, $10, $14, ($2 + $3 | 0) + 124 | 0, HEAP32[($3 + $11 | 0) + 92 >> 2], ($6 | 0) == 1)) { break label$3 } } $2 = $10 << 2; memcpy(HEAP32[($11 + HEAP32[$4 >> 2] | 0) + 60 >> 2], $9 + 1196 | 0, $2); $3 = HEAP32[$4 >> 2]; $6 = $3 + $11 | 0; FLAC__fixed_restore_signal(HEAP32[$6 + 92 >> 2], HEAP32[$3 + 1136 >> 2] - $10 | 0, $10, $2 + HEAP32[$6 + 60 >> 2] | 0); } if (HEAP32[HEAP32[$0 >> 2] >> 2] == 2) { break label$109 } if ($13) { break label$112 } break label$109; } if ($6 >>> 0 <= 63) { label$134 : { if (!HEAP32[$2 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$2 + 32 >> 2]]($0, 3, HEAP32[$2 + 48 >> 2]); break label$134; } HEAP32[$2 + 6152 >> 2] = HEAP32[$2 + 6152 >> 2] + 1; } HEAP32[HEAP32[$0 >> 2] >> 2] = 2; break label$109; } $9 = Math_imul($5, 292) + $2 | 0; HEAP32[$9 + 1176 >> 2] = 3; $11 = $5 << 2; $15 = HEAP32[($11 + $2 | 0) + 92 >> 2]; $12 = $6 >>> 1 & 31; $10 = $12 + 1 | 0; HEAP32[$9 + 1192 >> 2] = $10; HEAP32[$9 + 1460 >> 2] = $15; $6 = HEAP32[$2 + 56 >> 2]; $2 = 0; while (1) { if (!FLAC__bitreader_read_raw_int32($6, $7 + 32 | 0, $3)) { break label$3 } HEAP32[($9 + ($2 << 2) | 0) + 1332 >> 2] = HEAP32[$7 + 32 >> 2]; $15 = ($2 | 0) != ($12 | 0); $6 = HEAP32[HEAP32[$4 >> 2] + 56 >> 2]; $2 = $2 + 1 | 0; if ($15) { continue } break; }; if (!FLAC__bitreader_read_raw_uint32($6, $7 + 16 | 0, $17)) { break label$3 } $2 = HEAP32[$7 + 16 >> 2]; label$137 : { if (($2 | 0) == ($20 | 0)) { $2 = HEAP32[$4 >> 2]; if (!HEAP32[$2 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$2 + 32 >> 2]]($0, 0, HEAP32[$2 + 48 >> 2]) } HEAP32[HEAP32[$0 >> 2] >> 2] = 2; break label$137; } $16 = $9 + 1196 | 0; HEAP32[$16 >> 2] = $2 + 1; if (!FLAC__bitreader_read_raw_int32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $7 + 32 | 0, $21)) { break label$3 } $2 = HEAP32[$7 + 32 >> 2]; if (($2 | 0) <= -1) { $2 = HEAP32[$4 >> 2]; if (!HEAP32[$2 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$2 + 32 >> 2]]($0, 0, HEAP32[$2 + 48 >> 2]) } HEAP32[HEAP32[$0 >> 2] >> 2] = 2; break label$137; } $15 = $9 + 1200 | 0; HEAP32[$15 >> 2] = $2; $6 = HEAP32[HEAP32[$4 >> 2] + 56 >> 2]; $2 = 0; while (1) { if (!FLAC__bitreader_read_raw_int32($6, $7 + 32 | 0, HEAP32[$16 >> 2])) { break label$3 } HEAP32[($9 + ($2 << 2) | 0) + 1204 >> 2] = HEAP32[$7 + 32 >> 2]; $14 = ($2 | 0) != ($12 | 0); $6 = HEAP32[HEAP32[$4 >> 2] + 56 >> 2]; $2 = $2 + 1 | 0; if ($14) { continue } break; }; if (!FLAC__bitreader_read_raw_uint32($6, $7 + 16 | 0, $19)) { break label$3 } $14 = $9 + 1180 | 0; $6 = HEAP32[$7 + 16 >> 2]; HEAP32[$14 >> 2] = $6; $2 = HEAP32[$4 >> 2]; label$143 : { if ($6 >>> 0 <= 1) { if (!FLAC__bitreader_read_raw_uint32(HEAP32[$2 + 56 >> 2], $7 + 16 | 0, $18)) { break label$3 } $2 = HEAP32[$4 >> 2]; $6 = HEAP32[$7 + 16 >> 2]; if (HEAP32[$2 + 1136 >> 2] >>> $6 >>> 0 > $12 >>> 0) { break label$143 } if (!HEAP32[$2 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$2 + 32 >> 2]]($0, 0, HEAP32[$2 + 48 >> 2]) } HEAP32[HEAP32[$0 >> 2] >> 2] = 2; break label$137; } label$146 : { if (!HEAP32[$2 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$2 + 32 >> 2]]($0, 3, HEAP32[$2 + 48 >> 2]); break label$146; } HEAP32[$2 + 6152 >> 2] = HEAP32[$2 + 6152 >> 2] + 1; } HEAP32[HEAP32[$0 >> 2] >> 2] = 2; break label$137; } HEAP32[$9 + 1184 >> 2] = $6; $2 = Math_imul($5, 12); HEAP32[$9 + 1188 >> 2] = ($2 + HEAP32[$4 >> 2] | 0) + 124; $12 = HEAP32[$14 >> 2]; if ($12 >>> 0 < 2) { $14 = $6; $6 = HEAP32[$0 + 4 >> 2]; if (!read_residual_partitioned_rice_($0, $10, $14, ($2 + $6 | 0) + 124 | 0, HEAP32[($6 + $11 | 0) + 92 >> 2], ($12 | 0) == 1)) { break label$3 } } $6 = $10 << 2; memcpy(HEAP32[(HEAP32[$4 >> 2] + $11 | 0) + 60 >> 2], $9 + 1332 | 0, $6); label$149 : { $12 = HEAP32[$16 >> 2]; if ($12 + ((Math_clz32($10) ^ 31) + $3 | 0) >>> 0 <= 32) { $2 = HEAP32[$4 >> 2]; if ($3 >>> 0 > 16 | $12 >>> 0 > 16) { break label$149 } $3 = $2 + $11 | 0; FUNCTION_TABLE[HEAP32[$2 + 44 >> 2]](HEAP32[$3 + 92 >> 2], HEAP32[$2 + 1136 >> 2] - $10 | 0, $9 + 1204 | 0, $10, HEAP32[$15 >> 2], $6 + HEAP32[$3 + 60 >> 2] | 0); break label$137; } $2 = HEAP32[$4 >> 2]; $3 = $2 + $11 | 0; FUNCTION_TABLE[HEAP32[$2 + 40 >> 2]](HEAP32[$3 + 92 >> 2], HEAP32[$2 + 1136 >> 2] - $10 | 0, $9 + 1204 | 0, $10, HEAP32[$15 >> 2], $6 + HEAP32[$3 + 60 >> 2] | 0); break label$137; } $3 = $2 + $11 | 0; FUNCTION_TABLE[HEAP32[$2 + 36 >> 2]](HEAP32[$3 + 92 >> 2], HEAP32[$2 + 1136 >> 2] - $10 | 0, $9 + 1204 | 0, $10, HEAP32[$15 >> 2], $6 + HEAP32[$3 + 60 >> 2] | 0); } if (!$13 | HEAP32[HEAP32[$0 >> 2] >> 2] == 2) { break label$109 } break label$112; } if (!$13) { break label$109 } } $3 = HEAP32[$4 >> 2]; $2 = HEAP32[($3 + Math_imul($5, 292) | 0) + 1464 >> 2]; HEAP32[$7 + 28 >> 2] = $2; if (!HEAP32[$3 + 1136 >> 2]) { break label$109 } $6 = HEAP32[($3 + ($5 << 2) | 0) + 60 >> 2]; HEAP32[$6 >> 2] = HEAP32[$6 >> 2] << $2; $2 = 1; if (HEAPU32[$3 + 1136 >> 2] < 2) { break label$109 } while (1) { $9 = $6 + ($2 << 2) | 0; HEAP32[$9 >> 2] = HEAP32[$9 >> 2] << HEAP32[$7 + 28 >> 2]; $2 = $2 + 1 | 0; if ($2 >>> 0 < HEAPU32[$3 + 1136 >> 2]) { continue } break; }; } if (HEAP32[HEAP32[$0 >> 2] >> 2] == 2) { break label$100 } $5 = $5 + 1 | 0; $2 = HEAP32[$4 >> 2]; if ($5 >>> 0 < HEAPU32[$2 + 1144 >> 2]) { continue } break; }; } label$152 : { if (FLAC__bitreader_is_consumed_byte_aligned(HEAP32[$2 + 56 >> 2])) { break label$152 } HEAP32[$7 + 32 >> 2] = 0; $5 = HEAP32[HEAP32[$4 >> 2] + 56 >> 2]; if (!FLAC__bitreader_read_raw_uint32($5, $7 + 32 | 0, FLAC__bitreader_bits_left_for_byte_alignment($5))) { break label$3 } if (!HEAP32[$7 + 32 >> 2]) { break label$152 } $5 = HEAP32[$4 >> 2]; if (!HEAP32[$5 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$5 + 32 >> 2]]($0, 0, HEAP32[$5 + 48 >> 2]) } HEAP32[HEAP32[$0 >> 2] >> 2] = 2; } if (HEAP32[HEAP32[$0 >> 2] >> 2] == 2) { break label$1 } $5 = FLAC__bitreader_get_read_crc16(HEAP32[HEAP32[$4 >> 2] + 56 >> 2]); $8 = 0; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$4 >> 2] + 56 >> 2], $7 + 16 | 0, HEAP32[1404])) { break label$1 } label$154 : { if (($5 | 0) == HEAP32[$7 + 16 >> 2]) { label$156 : { label$157 : { label$158 : { $5 = HEAP32[$4 >> 2]; switch (HEAP32[$5 + 1148 >> 2] + -1 | 0) { case 2: break label$156; case 0: break label$157; case 1: break label$158; default: break label$154; }; } if (!HEAP32[$5 + 1136 >> 2]) { break label$154 } $2 = HEAP32[$5 - -64 >> 2]; $6 = HEAP32[$5 + 60 >> 2]; $3 = 0; while (1) { $9 = $3 << 2; $10 = $9 + $6 | 0; HEAP32[$10 >> 2] = HEAP32[$10 >> 2] + HEAP32[$2 + $9 >> 2]; $3 = $3 + 1 | 0; if ($3 >>> 0 < HEAPU32[$5 + 1136 >> 2]) { continue } break; }; break label$154; } if (!HEAP32[$5 + 1136 >> 2]) { break label$154 } $2 = HEAP32[$5 - -64 >> 2]; $6 = HEAP32[$5 + 60 >> 2]; $3 = 0; while (1) { $9 = $3 << 2; $10 = $9 + $2 | 0; HEAP32[$10 >> 2] = HEAP32[$6 + $9 >> 2] - HEAP32[$10 >> 2]; $3 = $3 + 1 | 0; if ($3 >>> 0 < HEAPU32[$5 + 1136 >> 2]) { continue } break; }; break label$154; } if (!HEAP32[$5 + 1136 >> 2]) { break label$154 } $10 = HEAP32[$5 - -64 >> 2]; $11 = HEAP32[$5 + 60 >> 2]; $3 = 0; while (1) { $6 = $3 << 2; $2 = $6 + $11 | 0; $13 = $6 + $10 | 0; $6 = HEAP32[$13 >> 2]; $9 = $6 & 1 | HEAP32[$2 >> 2] << 1; HEAP32[$2 >> 2] = $6 + $9 >> 1; HEAP32[$13 >> 2] = $9 - $6 >> 1; $3 = $3 + 1 | 0; if ($3 >>> 0 < HEAPU32[$5 + 1136 >> 2]) { continue } break; }; break label$154; } $5 = HEAP32[$4 >> 2]; if (!HEAP32[$5 + 3632 >> 2]) { FUNCTION_TABLE[HEAP32[$5 + 32 >> 2]]($0, 2, HEAP32[$5 + 48 >> 2]) } $2 = HEAP32[$4 >> 2]; if (!HEAP32[$2 + 1144 >> 2]) { break label$154 } $3 = 0; while (1) { memset(HEAP32[(($3 << 2) + $2 | 0) + 60 >> 2], HEAP32[$2 + 1136 >> 2] << 2); $3 = $3 + 1 | 0; $2 = HEAP32[$4 >> 2]; if ($3 >>> 0 < HEAPU32[$2 + 1144 >> 2]) { continue } break; }; } HEAP32[$1 >> 2] = 1; $2 = HEAP32[$4 >> 2]; $1 = HEAP32[$2 + 232 >> 2]; if ($1) { HEAP32[$2 + 228 >> 2] = $1 } $1 = HEAP32[$0 >> 2]; $6 = HEAP32[$2 + 1144 >> 2]; HEAP32[$1 + 8 >> 2] = $6; HEAP32[$1 + 12 >> 2] = HEAP32[$2 + 1148 >> 2]; $13 = HEAP32[$2 + 1152 >> 2]; HEAP32[$1 + 16 >> 2] = $13; HEAP32[$1 + 20 >> 2] = HEAP32[$2 + 1140 >> 2]; $5 = HEAP32[$2 + 1136 >> 2]; HEAP32[$1 + 24 >> 2] = $5; $1 = $2 + 1160 | 0; $9 = HEAP32[$1 >> 2]; $3 = HEAP32[$1 + 4 >> 2]; $1 = $3; $12 = $5 + $9 | 0; if ($12 >>> 0 < $5 >>> 0) { $1 = $1 + 1 | 0 } HEAP32[$2 + 240 >> 2] = $12; HEAP32[$2 + 244 >> 2] = $1; $10 = $2 + 60 | 0; $11 = $2 + 1136 | 0; label$165 : { label$166 : { label$167 : { if (HEAP32[$2 + 3632 >> 2]) { HEAP32[$2 + 6156 >> 2] = 1; $13 = HEAP32[$2 + 6144 >> 2]; $5 = HEAP32[$2 + 6148 >> 2]; memcpy($2 + 3752 | 0, $11, 2384); if (($3 | 0) == ($5 | 0) & $13 >>> 0 < $9 >>> 0 | $5 >>> 0 < $3 >>> 0 | (($1 | 0) == ($5 | 0) & $13 >>> 0 >= $12 >>> 0 | $5 >>> 0 > $1 >>> 0)) { break label$165 } $3 = 0; $1 = HEAP32[$4 >> 2]; HEAP32[$1 + 3632 >> 2] = 0; $5 = $13 - $9 | 0; $4 = $5; if ($4) { if ($6) { while (1) { $9 = $3 << 2; HEAP32[$9 + ($7 + 32 | 0) >> 2] = HEAP32[($2 + $9 | 0) + 60 >> 2] + ($4 << 2); $3 = $3 + 1 | 0; if (($6 | 0) != ($3 | 0)) { continue } break; } } HEAP32[$1 + 3752 >> 2] = HEAP32[$1 + 3752 >> 2] - $4; $2 = $1 + 3776 | 0; $4 = $2; $3 = $2; $1 = HEAP32[$2 + 4 >> 2]; $2 = $5 + HEAP32[$2 >> 2] | 0; if ($2 >>> 0 < $5 >>> 0) { $1 = $1 + 1 | 0 } HEAP32[$3 >> 2] = $2; HEAP32[$4 + 4 >> 2] = $1; $1 = HEAP32[$0 + 4 >> 2]; $1 = FUNCTION_TABLE[HEAP32[$1 + 24 >> 2]]($0, $1 + 3752 | 0, $7 + 32 | 0, HEAP32[$1 + 48 >> 2]) | 0; break label$167; } $1 = FUNCTION_TABLE[HEAP32[$1 + 24 >> 2]]($0, $11, $10, HEAP32[$1 + 48 >> 2]) | 0; break label$167; } label$172 : { if (!HEAP32[$2 + 248 >> 2]) { HEAP32[$2 + 3624 >> 2] = 0; break label$172; } if (!HEAP32[$2 + 3624 >> 2]) { break label$172 } if (!FLAC__MD5Accumulate($2 + 3636 | 0, $10, $6, $5, $13 + 7 >>> 3 | 0)) { break label$166 } $2 = HEAP32[$4 >> 2]; } $1 = FUNCTION_TABLE[HEAP32[$2 + 24 >> 2]]($0, $11, $10, HEAP32[$2 + 48 >> 2]) | 0; } if (!$1) { break label$165 } } HEAP32[HEAP32[$0 >> 2] >> 2] = 7; break label$1; } HEAP32[HEAP32[$0 >> 2] >> 2] = 2; } $8 = 1; break label$1; } $8 = 0; break label$1; } HEAP32[HEAP32[$0 >> 2] >> 2] = 8; $8 = 0; } global$0 = $7 - -64 | 0; return $8; } function read_residual_partitioned_rice_($0, $1, $2, $3, $4, $5) { var $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0; $6 = global$0 - 16 | 0; global$0 = $6; $7 = HEAP32[HEAP32[$0 + 4 >> 2] + 1136 >> 2]; $11 = HEAP32[($5 ? 5644 : 5640) >> 2]; $12 = HEAP32[($5 ? 5632 : 5628) >> 2]; label$1 : { label$2 : { if (FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size($3, $2 >>> 0 > 6 ? $2 : 6)) { $8 = $2 ? $7 >>> $2 | 0 : $7 - $1 | 0; $13 = HEAP32[1409]; if (!$2) { break label$2 } $5 = 0; while (1) { if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], $6 + 12 | 0, $12)) { $7 = 0; break label$1; } $9 = $10 << 2; HEAP32[$9 + HEAP32[$3 >> 2] >> 2] = HEAP32[$6 + 12 >> 2]; label$6 : { if (HEAPU32[$6 + 12 >> 2] < $11 >>> 0) { $7 = 0; HEAP32[$9 + HEAP32[$3 + 4 >> 2] >> 2] = 0; $9 = $8 - ($10 ? 0 : $1) | 0; if (!FLAC__bitreader_read_rice_signed_block(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], ($5 << 2) + $4 | 0, $9, HEAP32[$6 + 12 >> 2])) { break label$1 } $5 = $5 + $9 | 0; break label$6; } if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], $6 + 12 | 0, $13)) { $7 = 0; break label$1; } HEAP32[$9 + HEAP32[$3 + 4 >> 2] >> 2] = HEAP32[$6 + 12 >> 2]; $7 = $10 ? 0 : $1; if ($7 >>> 0 >= $8 >>> 0) { break label$6 } while (1) { if (!FLAC__bitreader_read_raw_int32(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], $6 + 8 | 0, HEAP32[$6 + 12 >> 2])) { $7 = 0; break label$1; } HEAP32[($5 << 2) + $4 >> 2] = HEAP32[$6 + 8 >> 2]; $5 = $5 + 1 | 0; $7 = $7 + 1 | 0; if (($8 | 0) != ($7 | 0)) { continue } break; }; } $7 = 1; $10 = $10 + 1 | 0; if (!($10 >>> $2)) { continue } break; }; break label$1; } HEAP32[HEAP32[$0 >> 2] >> 2] = 8; $7 = 0; break label$1; } $7 = 0; if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], $6 + 12 | 0, $12)) { break label$1 } HEAP32[HEAP32[$3 >> 2] >> 2] = HEAP32[$6 + 12 >> 2]; label$11 : { if (HEAPU32[$6 + 12 >> 2] >= $11 >>> 0) { if (!FLAC__bitreader_read_raw_uint32(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], $6 + 12 | 0, $13)) { break label$1 } HEAP32[HEAP32[$3 + 4 >> 2] >> 2] = HEAP32[$6 + 12 >> 2]; if (!$8) { break label$11 } $5 = 0; while (1) { if (!FLAC__bitreader_read_raw_int32(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], $6 + 8 | 0, HEAP32[$6 + 12 >> 2])) { $7 = 0; break label$1; } HEAP32[($5 << 2) + $4 >> 2] = HEAP32[$6 + 8 >> 2]; $5 = $5 + 1 | 0; $7 = $7 + 1 | 0; if (($8 | 0) != ($7 | 0)) { continue } break; }; break label$11; } HEAP32[HEAP32[$3 + 4 >> 2] >> 2] = 0; if (!FLAC__bitreader_read_rice_signed_block(HEAP32[HEAP32[$0 + 4 >> 2] + 56 >> 2], $4, $8, HEAP32[$6 + 12 >> 2])) { break label$1 } } $7 = 1; } global$0 = $6 + 16 | 0; return $7; } function FLAC__stream_decoder_process_until_end_of_metadata($0) { $0 = $0 | 0; var $1 = 0, $2 = 0; label$1 : { label$2 : { while (1) { label$4 : { $1 = 1; label$5 : { switch (HEAP32[HEAP32[$0 >> 2] >> 2]) { case 0: if (find_metadata_($0)) { continue } break label$4; case 2: case 3: case 4: case 7: break label$2; case 1: break label$5; default: break label$1; }; } if (read_metadata_($0)) { continue } } break; }; $1 = 0; } $2 = $1; } return $2 | 0; } function FLAC__stream_decoder_process_until_end_of_stream($0) { $0 = $0 | 0; var $1 = 0, $2 = 0, $3 = 0; $1 = global$0 - 16 | 0; global$0 = $1; $2 = 1; label$1 : { label$2 : { while (1) { label$4 : { label$5 : { switch (HEAP32[HEAP32[$0 >> 2] >> 2]) { case 0: if (find_metadata_($0)) { continue } break label$4; case 1: if (read_metadata_($0)) { continue } break label$4; case 2: if (frame_sync_($0)) { continue } break label$2; case 4: case 7: break label$2; case 3: break label$5; default: break label$1; }; } if (read_frame_($0, $1 + 12 | 0)) { continue } } break; }; $2 = 0; } $3 = $2; } global$0 = $1 + 16 | 0; return $3 | 0; } function read_callback_proxy_($0, $1, $2, $3) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; $0 = FUNCTION_TABLE[HEAP32[HEAP32[$0 + 4 >> 2] + 4 >> 2]]($0, $1, $2, $3) | 0; if ($0 >>> 0 <= 2) { return HEAP32[($0 << 2) + 7572 >> 2] } return 5; } function FLAC__bitwriter_free($0) { var $1 = 0; $1 = HEAP32[$0 >> 2]; if ($1) { dlfree($1) } HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 >> 2] = 0; HEAP32[$0 + 8 >> 2] = 0; HEAP32[$0 + 12 >> 2] = 0; } function FLAC__bitwriter_init($0) { var $1 = 0; HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 + 8 >> 2] = 8192; HEAP32[$0 + 12 >> 2] = 0; $1 = $0; $0 = dlmalloc(32768); HEAP32[$1 >> 2] = $0; return ($0 | 0) != 0; } function FLAC__bitwriter_clear($0) { HEAP32[$0 + 12 >> 2] = 0; HEAP32[$0 + 16 >> 2] = 0; } function FLAC__bitwriter_get_write_crc16($0, $1) { var $2 = 0, $3 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0; $2 = global$0 - 16 | 0; global$0 = $2; $3 = 0; label$1 : { if (!FLAC__bitwriter_get_buffer($0, $2 + 12 | 0, $2 + 8 | 0)) { break label$1 } (wasm2js_i32$0 = $1, wasm2js_i32$1 = FLAC__crc16(HEAP32[$2 + 12 >> 2], HEAP32[$2 + 8 >> 2])), HEAP16[wasm2js_i32$0 >> 1] = wasm2js_i32$1; $3 = 1; } global$0 = $2 + 16 | 0; return $3; } function FLAC__bitwriter_get_buffer($0, $1, $2) { var $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0; $5 = HEAP32[$0 + 16 >> 2]; label$1 : { if ($5 & 7) { break label$1 } label$2 : { if (!$5) { $4 = HEAP32[$0 >> 2]; $3 = 0; break label$2; } $6 = HEAP32[$0 + 12 >> 2]; label$4 : { if (($6 | 0) != HEAP32[$0 + 8 >> 2]) { break label$4 } $4 = $5 + 63 >>> 5 | 0; $3 = $4 + $6 | 0; if ($3 >>> 0 <= $6 >>> 0) { break label$4 } $6 = 0; $5 = HEAP32[$0 >> 2]; $7 = $3; $3 = $4 & 1023; $3 = $7 + ($3 ? 1024 - $3 | 0 : 0) | 0; label$5 : { if ($3) { if (($3 | 0) != ($3 & 1073741823)) { break label$1 } $4 = dlrealloc($5, $3 << 2); if ($4) { break label$5 } dlfree($5); return 0; } $4 = dlrealloc($5, 0); if (!$4) { break label$1 } } HEAP32[$0 + 8 >> 2] = $3; HEAP32[$0 >> 2] = $4; $6 = HEAP32[$0 + 12 >> 2]; $5 = HEAP32[$0 + 16 >> 2]; } $4 = HEAP32[$0 >> 2]; $3 = HEAP32[$0 + 4 >> 2] << 32 - $5; HEAP32[$4 + ($6 << 2) >> 2] = $3 << 24 | $3 << 8 & 16711680 | ($3 >>> 8 & 65280 | $3 >>> 24); $3 = HEAP32[$0 + 16 >> 2] >>> 3 | 0; } HEAP32[$1 >> 2] = $4; HEAP32[$2 >> 2] = $3 + (HEAP32[$0 + 12 >> 2] << 2); $6 = 1; } return $6; } function FLAC__bitwriter_get_write_crc8($0, $1) { var $2 = 0, $3 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0; $2 = global$0 - 16 | 0; global$0 = $2; $3 = 0; label$1 : { if (!FLAC__bitwriter_get_buffer($0, $2 + 12 | 0, $2 + 8 | 0)) { break label$1 } (wasm2js_i32$0 = $1, wasm2js_i32$1 = FLAC__crc8(HEAP32[$2 + 12 >> 2], HEAP32[$2 + 8 >> 2])), HEAP8[wasm2js_i32$0 | 0] = wasm2js_i32$1; $3 = 1; } global$0 = $2 + 16 | 0; return $3; } function FLAC__bitwriter_write_zeroes($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0; label$1 : { label$2 : { if (!$1) { break label$2 } $2 = HEAP32[$0 + 8 >> 2]; $3 = HEAP32[$0 + 12 >> 2]; label$3 : { if ($2 >>> 0 > $3 + $1 >>> 0) { break label$3 } $4 = $3 + ((HEAP32[$0 + 16 >> 2] + $1 | 0) + 31 >>> 5 | 0) | 0; if ($4 >>> 0 <= $2 >>> 0) { break label$3 } $3 = 0; $5 = HEAP32[$0 >> 2]; $2 = $4 - $2 & 1023; $2 = $4 + ($2 ? 1024 - $2 | 0 : 0) | 0; label$4 : { if ($2) { if (($2 | 0) != ($2 & 1073741823)) { break label$1 } $4 = dlrealloc($5, $2 << 2); if ($4) { break label$4 } dlfree($5); return 0; } $4 = dlrealloc($5, 0); if (!$4) { break label$1 } } HEAP32[$0 + 8 >> 2] = $2; HEAP32[$0 >> 2] = $4; } $2 = HEAP32[$0 + 16 >> 2]; if ($2) { $4 = $2; $2 = 32 - $2 | 0; $3 = $2 >>> 0 < $1 >>> 0 ? $2 : $1; $5 = $4 + $3 | 0; HEAP32[$0 + 16 >> 2] = $5; $2 = HEAP32[$0 + 4 >> 2] << $3; HEAP32[$0 + 4 >> 2] = $2; if (($5 | 0) != 32) { break label$2 } $5 = HEAP32[$0 + 12 >> 2]; HEAP32[$0 + 12 >> 2] = $5 + 1; HEAP32[HEAP32[$0 >> 2] + ($5 << 2) >> 2] = $2 << 8 & 16711680 | $2 << 24 | ($2 >>> 8 & 65280 | $2 >>> 24); HEAP32[$0 + 16 >> 2] = 0; $1 = $1 - $3 | 0; } if ($1 >>> 0 >= 32) { $2 = HEAP32[$0 >> 2]; while (1) { $3 = HEAP32[$0 + 12 >> 2]; HEAP32[$0 + 12 >> 2] = $3 + 1; HEAP32[$2 + ($3 << 2) >> 2] = 0; $1 = $1 + -32 | 0; if ($1 >>> 0 > 31) { continue } break; }; } if (!$1) { break label$2 } HEAP32[$0 + 16 >> 2] = $1; HEAP32[$0 + 4 >> 2] = 0; } $3 = 1; } return $3; } function FLAC__bitwriter_write_raw_uint32($0, $1, $2) { var $3 = 0; label$1 : { if ($2 >>> 0 <= 31) { $3 = 0; if ($1 >>> $2) { break label$1 } } $3 = FLAC__bitwriter_write_raw_uint32_nocheck($0, $1, $2); } return $3; } function FLAC__bitwriter_write_raw_uint32_nocheck($0, $1, $2) { var $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0; label$1 : { if (!$0 | $2 >>> 0 > 32) { break label$1 } $4 = HEAP32[$0 >> 2]; if (!$4) { break label$1 } $6 = 1; if (!$2) { break label$1 } $7 = HEAP32[$0 + 8 >> 2]; $3 = HEAP32[$0 + 12 >> 2]; label$2 : { if ($7 >>> 0 > $3 + $2 >>> 0) { $3 = $4; break label$2; } $5 = $3 + ((HEAP32[$0 + 16 >> 2] + $2 | 0) + 31 >>> 5 | 0) | 0; if ($5 >>> 0 <= $7 >>> 0) { $3 = $4; break label$2; } $6 = 0; $3 = $5 - $7 & 1023; $5 = $5 + ($3 ? 1024 - $3 | 0 : 0) | 0; label$5 : { if ($5) { if (($5 | 0) != ($5 & 1073741823)) { break label$1 } $3 = dlrealloc($4, $5 << 2); if ($3) { break label$5 } dlfree($4); return 0; } $3 = dlrealloc($4, 0); if (!$3) { break label$1 } } HEAP32[$0 + 8 >> 2] = $5; HEAP32[$0 >> 2] = $3; } $4 = HEAP32[$0 + 16 >> 2]; $5 = 32 - $4 | 0; if ($5 >>> 0 > $2 >>> 0) { HEAP32[$0 + 16 >> 2] = $2 + $4; HEAP32[$0 + 4 >> 2] = HEAP32[$0 + 4 >> 2] << $2 | $1; return 1; } if ($4) { $4 = $2 - $5 | 0; HEAP32[$0 + 16 >> 2] = $4; $2 = HEAP32[$0 + 12 >> 2]; HEAP32[$0 + 12 >> 2] = $2 + 1; $3 = ($2 << 2) + $3 | 0; $2 = HEAP32[$0 + 4 >> 2] << $5 | $1 >>> $4; HEAP32[$3 >> 2] = $2 << 24 | $2 << 8 & 16711680 | ($2 >>> 8 & 65280 | $2 >>> 24); HEAP32[$0 + 4 >> 2] = $1; return 1; } $6 = 1; $2 = $0; $0 = HEAP32[$0 + 12 >> 2]; HEAP32[$2 + 12 >> 2] = $0 + 1; HEAP32[($0 << 2) + $3 >> 2] = $1 << 8 & 16711680 | $1 << 24 | ($1 >>> 8 & 65280 | $1 >>> 24); } return $6; } function FLAC__bitwriter_write_raw_int32($0, $1, $2) { return FLAC__bitwriter_write_raw_uint32_nocheck($0, ($2 >>> 0 < 32 ? -1 << $2 ^ -1 : -1) & $1, $2); } function FLAC__bitwriter_write_raw_uint64($0, $1, $2, $3) { var $4 = 0; label$1 : { if ($3 >>> 0 >= 33) { $3 = $3 + -32 | 0; if ($2 >>> $3 | 0 ? $3 >>> 0 <= 31 : 0) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32_nocheck($0, $2, $3)) { break label$1 } return (FLAC__bitwriter_write_raw_uint32_nocheck($0, $1, 32) | 0) != 0; } if (($3 | 0) != 32) { if ($1 >>> $3) { break label$1 } } $4 = FLAC__bitwriter_write_raw_uint32_nocheck($0, $1, $3); } return $4; } function FLAC__bitwriter_write_raw_uint32_little_endian($0, $1) { var $2 = 0; label$1 : { if (!FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 & 255, 8)) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 8 & 255, 8)) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 16 & 255, 8)) { break label$1 } $2 = (FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 24 | 0, 8) | 0) != 0; } return $2; } function FLAC__bitwriter_write_byte_block($0, $1, $2) { var $3 = 0, $4 = 0, $5 = 0, $6 = 0; $3 = HEAP32[$0 + 8 >> 2]; $4 = HEAP32[$0 + 12 >> 2]; label$1 : { label$2 : { if ($3 >>> 0 > ($4 + ($2 >>> 2 | 0) | 0) + 1 >>> 0) { break label$2 } $5 = $4 + ((HEAP32[$0 + 16 >> 2] + ($2 << 3) | 0) + 31 >>> 5 | 0) | 0; if ($5 >>> 0 <= $3 >>> 0) { break label$2 } $4 = 0; $6 = HEAP32[$0 >> 2]; $3 = $5 - $3 & 1023; $3 = $5 + ($3 ? 1024 - $3 | 0 : 0) | 0; label$3 : { if ($3) { if (($3 | 0) != ($3 & 1073741823)) { break label$1 } $5 = dlrealloc($6, $3 << 2); if ($5) { break label$3 } dlfree($6); return 0; } $5 = dlrealloc($6, 0); if (!$5) { break label$1 } } HEAP32[$0 + 8 >> 2] = $3; HEAP32[$0 >> 2] = $5; } $4 = 1; if (!$2) { break label$1 } $4 = 0; label$5 : { while (1) { if (!FLAC__bitwriter_write_raw_uint32_nocheck($0, HEAPU8[$1 + $4 | 0], 8)) { break label$5 } $4 = $4 + 1 | 0; if (($4 | 0) != ($2 | 0)) { continue } break; }; return 1; } $4 = 0; } return $4; } function FLAC__bitwriter_write_unary_unsigned($0, $1) { if ($1 >>> 0 <= 31) { return FLAC__bitwriter_write_raw_uint32_nocheck($0, 1, $1 + 1 | 0) } if (!FLAC__bitwriter_write_zeroes($0, $1)) { return 0 } return (FLAC__bitwriter_write_raw_uint32_nocheck($0, 1, 1) | 0) != 0; } function FLAC__bitwriter_write_rice_signed_block($0, $1, $2, $3) { var $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0; $4 = 1; label$1 : { if (!$2) { break label$1 } $10 = $3 + 1 | 0; $11 = -1 << $3; $12 = -1 >>> 31 - $3 | 0; while (1) { $6 = HEAP32[$1 >> 2]; $9 = $6 << 1 ^ $6 >> 31; $6 = $9 >>> $3 | 0; $4 = $10 + $6 | 0; label$3 : { label$4 : { $5 = HEAP32[$0 + 16 >> 2]; if (!$5) { break label$4 } $7 = $4 + $5 | 0; if ($7 >>> 0 > 31) { break label$4 } HEAP32[$0 + 16 >> 2] = $7; HEAP32[$0 + 4 >> 2] = ($9 | $11) & $12 | HEAP32[$0 + 4 >> 2] << $4; break label$3; } $8 = HEAP32[$0 + 8 >> 2]; $7 = HEAP32[$0 + 12 >> 2]; label$5 : { if ($8 >>> 0 > ($7 + ($5 + $6 | 0) | 0) + 1 >>> 0) { break label$5 } $4 = $7 + (($4 + $5 | 0) + 31 >>> 5 | 0) | 0; if ($4 >>> 0 <= $8 >>> 0) { break label$5 } $7 = HEAP32[$0 >> 2]; $5 = $4 - $8 & 1023; $5 = $4 + ($5 ? 1024 - $5 | 0 : 0) | 0; label$6 : { if ($5) { $4 = 0; if (($5 | 0) != ($5 & 1073741823)) { break label$1 } $8 = dlrealloc($7, $5 << 2); if ($8) { break label$6 } dlfree($7); return 0; } $8 = dlrealloc($7, 0); $4 = 0; if (!$8) { break label$1 } } HEAP32[$0 + 8 >> 2] = $5; HEAP32[$0 >> 2] = $8; } label$8 : { if (!$6) { break label$8 } $4 = HEAP32[$0 + 16 >> 2]; if ($4) { $5 = HEAP32[$0 + 4 >> 2]; $7 = 32 - $4 | 0; if ($6 >>> 0 < $7 >>> 0) { HEAP32[$0 + 16 >> 2] = $4 + $6; HEAP32[$0 + 4 >> 2] = $5 << $6; break label$8; } $4 = $5 << $7; HEAP32[$0 + 4 >> 2] = $4; $5 = HEAP32[$0 + 12 >> 2]; HEAP32[$0 + 12 >> 2] = $5 + 1; HEAP32[HEAP32[$0 >> 2] + ($5 << 2) >> 2] = $4 << 8 & 16711680 | $4 << 24 | ($4 >>> 8 & 65280 | $4 >>> 24); HEAP32[$0 + 16 >> 2] = 0; $6 = $6 - $7 | 0; } if ($6 >>> 0 >= 32) { $4 = HEAP32[$0 >> 2]; while (1) { $5 = HEAP32[$0 + 12 >> 2]; HEAP32[$0 + 12 >> 2] = $5 + 1; HEAP32[$4 + ($5 << 2) >> 2] = 0; $6 = $6 + -32 | 0; if ($6 >>> 0 > 31) { continue } break; }; } if (!$6) { break label$8 } HEAP32[$0 + 16 >> 2] = $6; HEAP32[$0 + 4 >> 2] = 0; } $6 = ($9 | $11) & $12; $4 = HEAP32[$0 + 4 >> 2]; $7 = HEAP32[$0 + 16 >> 2]; $5 = 32 - $7 | 0; if ($10 >>> 0 < $5 >>> 0) { HEAP32[$0 + 16 >> 2] = $7 + $10; HEAP32[$0 + 4 >> 2] = $6 | $4 << $10; break label$3; } $7 = $10 - $5 | 0; HEAP32[$0 + 16 >> 2] = $7; $9 = HEAP32[$0 + 12 >> 2]; HEAP32[$0 + 12 >> 2] = $9 + 1; $4 = $4 << $5 | $6 >>> $7; HEAP32[HEAP32[$0 >> 2] + ($9 << 2) >> 2] = $4 << 24 | $4 << 8 & 16711680 | ($4 >>> 8 & 65280 | $4 >>> 24); HEAP32[$0 + 4 >> 2] = $6; } $1 = $1 + 4 | 0; $2 = $2 + -1 | 0; if ($2) { continue } break; }; $4 = 1; } return $4; } function FLAC__bitwriter_write_utf8_uint32($0, $1) { if (($1 | 0) >= 0) { if ($1 >>> 0 <= 127) { return FLAC__bitwriter_write_raw_uint32_nocheck($0, $1, 8) } if ($1 >>> 0 <= 2047) { return FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 6 | 192, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 & 63 | 128, 8) & 1 } if ($1 >>> 0 <= 65535) { return FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 12 | 224, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 6 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 & 63 | 128, 8) & 1 } if ($1 >>> 0 <= 2097151) { return FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 18 | 240, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 12 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 6 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 & 63 | 128, 8) & 1 } if ($1 >>> 0 <= 67108863) { return FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 24 | 248, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 18 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 12 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 6 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 & 63 | 128, 8) & 1 } $0 = FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 30 | 252, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 24 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 18 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 12 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 6 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 & 63 | 128, 8) & 1; } else { $0 = 0 } return $0; } function FLAC__bitwriter_write_utf8_uint64($0, $1, $2) { if (($2 | 0) == 15 | $2 >>> 0 < 15) { if (!$2 & $1 >>> 0 <= 127 | $2 >>> 0 < 0) { return FLAC__bitwriter_write_raw_uint32_nocheck($0, $1, 8) } if (!$2 & $1 >>> 0 <= 2047 | $2 >>> 0 < 0) { return FLAC__bitwriter_write_raw_uint32_nocheck($0, ($2 & 63) << 26 | $1 >>> 6 | 192, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 & 63 | 128, 8) & 1 } if (!$2 & $1 >>> 0 <= 65535 | $2 >>> 0 < 0) { return FLAC__bitwriter_write_raw_uint32_nocheck($0, ($2 & 4095) << 20 | $1 >>> 12 | 224, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 6 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 & 63 | 128, 8) & 1 } if (!$2 & $1 >>> 0 <= 2097151 | $2 >>> 0 < 0) { return FLAC__bitwriter_write_raw_uint32_nocheck($0, ($2 & 262143) << 14 | $1 >>> 18 | 240, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 12 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 6 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 & 63 | 128, 8) & 1 } if (!$2 & $1 >>> 0 <= 67108863 | $2 >>> 0 < 0) { return FLAC__bitwriter_write_raw_uint32_nocheck($0, ($2 & 16777215) << 8 | $1 >>> 24 | 248, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 18 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 12 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 6 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 & 63 | 128, 8) & 1 } if (!$2 & $1 >>> 0 <= 2147483647 | $2 >>> 0 < 0) { return FLAC__bitwriter_write_raw_uint32_nocheck($0, ($2 & 1073741823) << 2 | $1 >>> 30 | 252, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 24 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 18 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 12 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 6 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 & 63 | 128, 8) & 1 } $0 = FLAC__bitwriter_write_raw_uint32_nocheck($0, 254, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, ($2 & 1073741823) << 2 | $1 >>> 30 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 24 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 18 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 12 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 >>> 6 & 63 | 128, 8) & FLAC__bitwriter_write_raw_uint32_nocheck($0, $1 & 63 | 128, 8) & 1; } else { $0 = 0 } return $0; } function FLAC__ogg_encoder_aspect_init($0) { if (ogg_stream_init($0 + 8 | 0, HEAP32[$0 >> 2])) { $0 = 0 } else { HEAP32[$0 + 392 >> 2] = 0; HEAP32[$0 + 396 >> 2] = 0; HEAP32[$0 + 384 >> 2] = 0; HEAP32[$0 + 388 >> 2] = 1; $0 = 1; } return $0; } function FLAC__ogg_encoder_aspect_set_defaults($0) { HEAP32[$0 >> 2] = 0; HEAP32[$0 + 4 >> 2] = 0; } function FLAC__ogg_encoder_aspect_write_callback_wrapper($0, $1, $2, $3, $4, $5, $6, $7, $8) { var $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0; $9 = global$0 - 96 | 0; global$0 = $9; label$1 : { label$2 : { if (HEAP32[$0 + 384 >> 2]) { HEAP32[$9 + 72 >> 2] = 0; HEAP32[$9 + 76 >> 2] = 0; $12 = $9 + 80 | 0; $11 = $12; HEAP32[$11 >> 2] = 0; HEAP32[$11 + 4 >> 2] = 0; HEAP32[$9 + 88 >> 2] = 0; HEAP32[$9 + 92 >> 2] = 0; HEAP32[$9 + 64 >> 2] = 0; HEAP32[$9 + 68 >> 2] = 0; $10 = HEAP32[$0 + 396 >> 2]; $11 = $3; $13 = HEAP32[$0 + 392 >> 2]; $14 = $11 + $13 | 0; if ($14 >>> 0 < $13 >>> 0) { $10 = $10 + 1 | 0 } HEAP32[$12 >> 2] = $14; HEAP32[$12 + 4 >> 2] = $10; label$4 : { label$5 : { if (HEAP32[$0 + 388 >> 2]) { if (($2 | 0) != 38) { break label$4 } HEAP8[$9 | 0] = HEAPU8[7536]; $2 = HEAP32[2721]; $2 = HEAPU8[$2 | 0] | HEAPU8[$2 + 1 | 0] << 8 | (HEAPU8[$2 + 2 | 0] << 16 | HEAPU8[$2 + 3 | 0] << 24); HEAP8[$9 + 5 | 0] = 1; HEAP8[$9 + 6 | 0] = 0; HEAP8[$9 + 1 | 0] = $2; HEAP8[$9 + 2 | 0] = $2 >>> 8; HEAP8[$9 + 3 | 0] = $2 >>> 16; HEAP8[$9 + 4 | 0] = $2 >>> 24; $10 = HEAP32[$0 + 4 >> 2]; $2 = HEAPU8[5409] | HEAPU8[5410] << 8 | (HEAPU8[5411] << 16 | HEAPU8[5412] << 24); HEAP8[$9 + 9 | 0] = $2; HEAP8[$9 + 10 | 0] = $2 >>> 8; HEAP8[$9 + 11 | 0] = $2 >>> 16; HEAP8[$9 + 12 | 0] = $2 >>> 24; HEAP8[$9 + 8 | 0] = $10; HEAP8[$9 + 7 | 0] = $10 >>> 8; $2 = HEAPU8[$1 + 34 | 0] | HEAPU8[$1 + 35 | 0] << 8 | (HEAPU8[$1 + 36 | 0] << 16 | HEAPU8[$1 + 37 | 0] << 24); $10 = HEAPU8[$1 + 30 | 0] | HEAPU8[$1 + 31 | 0] << 8 | (HEAPU8[$1 + 32 | 0] << 16 | HEAPU8[$1 + 33 | 0] << 24); HEAP8[$9 + 43 | 0] = $10; HEAP8[$9 + 44 | 0] = $10 >>> 8; HEAP8[$9 + 45 | 0] = $10 >>> 16; HEAP8[$9 + 46 | 0] = $10 >>> 24; HEAP8[$9 + 47 | 0] = $2; HEAP8[$9 + 48 | 0] = $2 >>> 8; HEAP8[$9 + 49 | 0] = $2 >>> 16; HEAP8[$9 + 50 | 0] = $2 >>> 24; $2 = HEAPU8[$1 + 28 | 0] | HEAPU8[$1 + 29 | 0] << 8 | (HEAPU8[$1 + 30 | 0] << 16 | HEAPU8[$1 + 31 | 0] << 24); $10 = HEAPU8[$1 + 24 | 0] | HEAPU8[$1 + 25 | 0] << 8 | (HEAPU8[$1 + 26 | 0] << 16 | HEAPU8[$1 + 27 | 0] << 24); HEAP8[$9 + 37 | 0] = $10; HEAP8[$9 + 38 | 0] = $10 >>> 8; HEAP8[$9 + 39 | 0] = $10 >>> 16; HEAP8[$9 + 40 | 0] = $10 >>> 24; HEAP8[$9 + 41 | 0] = $2; HEAP8[$9 + 42 | 0] = $2 >>> 8; HEAP8[$9 + 43 | 0] = $2 >>> 16; HEAP8[$9 + 44 | 0] = $2 >>> 24; $2 = HEAPU8[$1 + 20 | 0] | HEAPU8[$1 + 21 | 0] << 8 | (HEAPU8[$1 + 22 | 0] << 16 | HEAPU8[$1 + 23 | 0] << 24); $10 = HEAPU8[$1 + 16 | 0] | HEAPU8[$1 + 17 | 0] << 8 | (HEAPU8[$1 + 18 | 0] << 16 | HEAPU8[$1 + 19 | 0] << 24); HEAP8[$9 + 29 | 0] = $10; HEAP8[$9 + 30 | 0] = $10 >>> 8; HEAP8[$9 + 31 | 0] = $10 >>> 16; HEAP8[$9 + 32 | 0] = $10 >>> 24; HEAP8[$9 + 33 | 0] = $2; HEAP8[$9 + 34 | 0] = $2 >>> 8; HEAP8[$9 + 35 | 0] = $2 >>> 16; HEAP8[$9 + 36 | 0] = $2 >>> 24; $2 = HEAPU8[$1 + 12 | 0] | HEAPU8[$1 + 13 | 0] << 8 | (HEAPU8[$1 + 14 | 0] << 16 | HEAPU8[$1 + 15 | 0] << 24); $10 = HEAPU8[$1 + 8 | 0] | HEAPU8[$1 + 9 | 0] << 8 | (HEAPU8[$1 + 10 | 0] << 16 | HEAPU8[$1 + 11 | 0] << 24); HEAP8[$9 + 21 | 0] = $10; HEAP8[$9 + 22 | 0] = $10 >>> 8; HEAP8[$9 + 23 | 0] = $10 >>> 16; HEAP8[$9 + 24 | 0] = $10 >>> 24; HEAP8[$9 + 25 | 0] = $2; HEAP8[$9 + 26 | 0] = $2 >>> 8; HEAP8[$9 + 27 | 0] = $2 >>> 16; HEAP8[$9 + 28 | 0] = $2 >>> 24; $2 = HEAPU8[$1 + 4 | 0] | HEAPU8[$1 + 5 | 0] << 8 | (HEAPU8[$1 + 6 | 0] << 16 | HEAPU8[$1 + 7 | 0] << 24); $1 = HEAPU8[$1 | 0] | HEAPU8[$1 + 1 | 0] << 8 | (HEAPU8[$1 + 2 | 0] << 16 | HEAPU8[$1 + 3 | 0] << 24); HEAP8[$9 + 13 | 0] = $1; HEAP8[$9 + 14 | 0] = $1 >>> 8; HEAP8[$9 + 15 | 0] = $1 >>> 16; HEAP8[$9 + 16 | 0] = $1 >>> 24; HEAP8[$9 + 17 | 0] = $2; HEAP8[$9 + 18 | 0] = $2 >>> 8; HEAP8[$9 + 19 | 0] = $2 >>> 16; HEAP8[$9 + 20 | 0] = $2 >>> 24; HEAP32[$9 + 68 >> 2] = 51; HEAP32[$9 + 72 >> 2] = 1; HEAP32[$9 + 64 >> 2] = $9; HEAP32[$0 + 388 >> 2] = 0; break label$5; } HEAP32[$9 + 68 >> 2] = $2; HEAP32[$9 + 64 >> 2] = $1; } if ($5) { HEAP32[$9 + 76 >> 2] = 1 } $1 = $0 + 8 | 0; if (ogg_stream_packetin($1, $9 - -64 | 0)) { break label$4 } $2 = $0 + 368 | 0; if (!$3) { while (1) { if (!ogg_stream_flush_i($1, $2, 1)) { break label$2 } if (FUNCTION_TABLE[$6]($7, HEAP32[$0 + 368 >> 2], HEAP32[$0 + 372 >> 2], 0, $4, $8)) { break label$4 } if (!FUNCTION_TABLE[$6]($7, HEAP32[$0 + 376 >> 2], HEAP32[$0 + 380 >> 2], 0, $4, $8)) { continue } break label$4; } } while (1) { if (!ogg_stream_pageout($1, $2)) { break label$2 } if (FUNCTION_TABLE[$6]($7, HEAP32[$0 + 368 >> 2], HEAP32[$0 + 372 >> 2], 0, $4, $8)) { break label$4 } if (!FUNCTION_TABLE[$6]($7, HEAP32[$0 + 376 >> 2], HEAP32[$0 + 380 >> 2], 0, $4, $8)) { continue } break; }; } $6 = 1; break label$1; } $6 = 1; if ($3 | $4 | ($2 | 0) != 4 | (HEAPU8[$1 | 0] | HEAPU8[$1 + 1 | 0] << 8 | (HEAPU8[$1 + 2 | 0] << 16 | HEAPU8[$1 + 3 | 0] << 24)) != (HEAPU8[5409] | HEAPU8[5410] << 8 | (HEAPU8[5411] << 16 | HEAPU8[5412] << 24))) { break label$1 } HEAP32[$0 + 384 >> 2] = 1; $11 = $3; } $1 = $0; $3 = $1; $2 = HEAP32[$1 + 396 >> 2]; $0 = $11 + HEAP32[$1 + 392 >> 2] | 0; if ($0 >>> 0 < $11 >>> 0) { $2 = $2 + 1 | 0 } HEAP32[$3 + 392 >> 2] = $0; HEAP32[$1 + 396 >> 2] = $2; $6 = 0; } global$0 = $9 + 96 | 0; return $6; } function simple_ogg_page__init($0) { HEAP32[$0 >> 2] = 0; HEAP32[$0 + 4 >> 2] = 0; HEAP32[$0 + 8 >> 2] = 0; HEAP32[$0 + 12 >> 2] = 0; } function simple_ogg_page__clear($0) { var $1 = 0; $1 = HEAP32[$0 >> 2]; if ($1) { dlfree($1) } $1 = HEAP32[$0 + 8 >> 2]; if ($1) { dlfree($1) } HEAP32[$0 >> 2] = 0; HEAP32[$0 + 4 >> 2] = 0; HEAP32[$0 + 8 >> 2] = 0; HEAP32[$0 + 12 >> 2] = 0; } function simple_ogg_page__get_at($0, $1, $2, $3, $4, $5, $6) { var $7 = 0, $8 = 0, $9 = 0; $7 = global$0 - 16 | 0; global$0 = $7; label$1 : { if (!$4) { break label$1 } label$2 : { switch (FUNCTION_TABLE[$4]($0, $1, $2, $6) | 0) { case 1: HEAP32[HEAP32[$0 >> 2] >> 2] = 5; break label$1; case 0: break label$2; default: break label$1; }; } $4 = dlmalloc(282); HEAP32[$3 >> 2] = $4; if (!$4) { HEAP32[HEAP32[$0 >> 2] >> 2] = 8; break label$1; } $8 = 27; while (1) { HEAP32[$7 + 12 >> 2] = $8; $1 = 5; label$6 : { label$7 : { switch (FUNCTION_TABLE[$5]($0, $4, $7 + 12 | 0, $6) | 0) { case 1: $1 = HEAP32[$7 + 12 >> 2]; if ($1) { break label$6 } $1 = 2; default: HEAP32[HEAP32[$0 >> 2] >> 2] = $1; break label$1; case 3: break label$1; case 0: break label$7; }; } $1 = HEAP32[$7 + 12 >> 2]; } $4 = $1 + $4 | 0; $8 = $8 - $1 | 0; if ($8) { continue } break; }; $1 = HEAP32[$3 >> 2]; HEAP32[$3 + 4 >> 2] = HEAPU8[$1 + 26 | 0] + 27; label$10 : { if (!(HEAP8[$1 + 5 | 0] & 1 | (HEAPU8[$1 | 0] | HEAPU8[$1 + 1 | 0] << 8 | (HEAPU8[$1 + 2 | 0] << 16 | HEAPU8[$1 + 3 | 0] << 24)) != 1399285583 | ((HEAPU8[$1 + 6 | 0] | HEAPU8[$1 + 7 | 0] << 8 | (HEAPU8[$1 + 8 | 0] << 16 | HEAPU8[$1 + 9 | 0] << 24)) != 0 | (HEAPU8[$1 + 10 | 0] | HEAPU8[$1 + 11 | 0] << 8 | (HEAPU8[$1 + 12 | 0] << 16 | HEAPU8[$1 + 13 | 0] << 24)) != 0))) { $8 = HEAPU8[$1 + 26 | 0]; if ($8) { break label$10 } } HEAP32[HEAP32[$0 >> 2] >> 2] = 2; break label$1; } $4 = $1 + 27 | 0; while (1) { HEAP32[$7 + 12 >> 2] = $8; $1 = 5; label$13 : { label$14 : { switch (FUNCTION_TABLE[$5]($0, $4, $7 + 12 | 0, $6) | 0) { case 1: $1 = HEAP32[$7 + 12 >> 2]; if ($1) { break label$13 } $1 = 2; default: HEAP32[HEAP32[$0 >> 2] >> 2] = $1; break label$1; case 3: break label$1; case 0: break label$14; }; } $1 = HEAP32[$7 + 12 >> 2]; } $4 = $1 + $4 | 0; $8 = $8 - $1 | 0; if ($8) { continue } break; }; $4 = 0; $1 = HEAP32[$3 >> 2]; $2 = HEAPU8[$1 + 26 | 0]; label$17 : { if (($2 | 0) != 1) { $2 = $2 + -1 | 0; while (1) { if (HEAPU8[($1 + $4 | 0) + 27 | 0] != 255) { HEAP32[HEAP32[$0 >> 2] >> 2] = 2; break label$17; } $4 = $4 + 1 | 0; if ($4 >>> 0 < $2 >>> 0) { continue } break; }; } $4 = HEAPU8[($1 + $4 | 0) + 27 | 0] + Math_imul($4, 255) | 0; HEAP32[$3 + 12 >> 2] = $4; $8 = dlmalloc($4 ? $4 : 1); HEAP32[$3 + 8 >> 2] = $8; if (!$8) { HEAP32[HEAP32[$0 >> 2] >> 2] = 8; break label$17; } $2 = $7; if ($4) { while (1) { HEAP32[$7 + 12 >> 2] = $4; $1 = 5; label$24 : { label$25 : { switch (FUNCTION_TABLE[$5]($0, $8, $7 + 12 | 0, $6) | 0) { case 1: $1 = HEAP32[$7 + 12 >> 2]; if ($1) { break label$24 } $1 = 2; default: HEAP32[HEAP32[$0 >> 2] >> 2] = $1; break label$17; case 3: break label$17; case 0: break label$25; }; } $1 = HEAP32[$7 + 12 >> 2]; } $8 = $1 + $8 | 0; $4 = $4 - $1 | 0; if ($4) { continue } break; }; $1 = HEAP32[$3 >> 2]; } HEAP32[$2 + 12 >> 2] = HEAPU8[$1 + 22 | 0] | HEAPU8[$1 + 23 | 0] << 8 | (HEAPU8[$1 + 24 | 0] << 16 | HEAPU8[$1 + 25 | 0] << 24); ogg_page_checksum_set($3); $1 = HEAP32[$3 >> 2]; if (HEAP32[$7 + 12 >> 2] == (HEAPU8[$1 + 22 | 0] | HEAPU8[$1 + 23 | 0] << 8 | (HEAPU8[$1 + 24 | 0] << 16 | HEAPU8[$1 + 25 | 0] << 24))) { $9 = 1; break label$1; } HEAP32[HEAP32[$0 >> 2] >> 2] = 2; } } global$0 = $7 + 16 | 0; return $9; } function simple_ogg_page__set_at($0, $1, $2, $3, $4, $5, $6) { folding_inner0 : { label$1 : { if (!$4) { break label$1 } label$2 : { switch (FUNCTION_TABLE[$4]($0, $1, $2, $6) | 0) { case 1: break folding_inner0; case 0: break label$2; default: break label$1; }; } ogg_page_checksum_set($3); if (FUNCTION_TABLE[$5]($0, HEAP32[$3 >> 2], HEAP32[$3 + 4 >> 2], 0, 0, $6)) { break folding_inner0 } if (!FUNCTION_TABLE[$5]($0, HEAP32[$3 + 8 >> 2], HEAP32[$3 + 12 >> 2], 0, 0, $6)) { return 1 } HEAP32[HEAP32[$0 >> 2] >> 2] = 5; } return 0; } HEAP32[HEAP32[$0 >> 2] >> 2] = 5; return 0; } function __emscripten_stdout_close($0) { $0 = $0 | 0; return 0; } function __emscripten_stdout_seek($0, $1, $2, $3) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; i64toi32_i32$HIGH_BITS = 0; return 0; } function strcmp($0, $1) { var $2 = 0, $3 = 0; $2 = HEAPU8[$0 | 0]; $3 = HEAPU8[$1 | 0]; label$1 : { if (!$2 | ($2 | 0) != ($3 | 0)) { break label$1 } while (1) { $3 = HEAPU8[$1 + 1 | 0]; $2 = HEAPU8[$0 + 1 | 0]; if (!$2) { break label$1 } $1 = $1 + 1 | 0; $0 = $0 + 1 | 0; if (($2 | 0) == ($3 | 0)) { continue } break; }; } return $2 - $3 | 0; } function __cos($0, $1) { var $2 = 0.0, $3 = 0.0, $4 = 0.0, $5 = 0.0; $2 = $0 * $0; $3 = $2 * .5; $4 = 1.0 - $3; $5 = 1.0 - $4 - $3; $3 = $2 * $2; return $4 + ($5 + ($2 * ($2 * ($2 * ($2 * 2.480158728947673e-05 + -.001388888888887411) + .0416666666666666) + $3 * $3 * ($2 * ($2 * -1.1359647557788195e-11 + 2.087572321298175e-09) + -2.7557314351390663e-07)) - $0 * $1)); } function scalbn($0, $1) { label$1 : { if (($1 | 0) >= 1024) { $0 = $0 * 8988465674311579538646525.0e283; if (($1 | 0) < 2047) { $1 = $1 + -1023 | 0; break label$1; } $0 = $0 * 8988465674311579538646525.0e283; $1 = (($1 | 0) < 3069 ? $1 : 3069) + -2046 | 0; break label$1; } if (($1 | 0) > -1023) { break label$1 } $0 = $0 * 2.2250738585072014e-308; if (($1 | 0) > -2045) { $1 = $1 + 1022 | 0; break label$1; } $0 = $0 * 2.2250738585072014e-308; $1 = (($1 | 0) > -3066 ? $1 : -3066) + 2044 | 0; } wasm2js_scratch_store_i32(0, 0); wasm2js_scratch_store_i32(1, $1 + 1023 << 20); return $0 * +wasm2js_scratch_load_f64(); } function __rem_pio2_large($0, $1, $2, $3) { var $4 = 0.0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0.0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0; $7 = global$0 - 560 | 0; global$0 = $7; $5 = ($2 + -3 | 0) / 24 | 0; $16 = ($5 | 0) > 0 ? $5 : 0; $10 = $2 + Math_imul($16, -24) | 0; $12 = HEAP32[1901]; $9 = $3 + -1 | 0; if (($12 + $9 | 0) >= 0) { $5 = $3 + $12 | 0; $2 = $16 - $9 | 0; while (1) { HEAPF64[($7 + 320 | 0) + ($6 << 3) >> 3] = ($2 | 0) < 0 ? 0.0 : +HEAP32[($2 << 2) + 7616 >> 2]; $2 = $2 + 1 | 0; $6 = $6 + 1 | 0; if (($5 | 0) != ($6 | 0)) { continue } break; }; } $13 = $10 + -24 | 0; $5 = 0; $6 = ($12 | 0) > 0 ? $12 : 0; $11 = ($3 | 0) < 1; while (1) { label$6 : { if ($11) { $4 = 0.0; break label$6; } $8 = $5 + $9 | 0; $2 = 0; $4 = 0.0; while (1) { $4 = $4 + HEAPF64[($2 << 3) + $0 >> 3] * HEAPF64[($7 + 320 | 0) + ($8 - $2 << 3) >> 3]; $2 = $2 + 1 | 0; if (($3 | 0) != ($2 | 0)) { continue } break; }; } HEAPF64[($5 << 3) + $7 >> 3] = $4; $2 = ($5 | 0) == ($6 | 0); $5 = $5 + 1 | 0; if (!$2) { continue } break; }; $20 = 47 - $10 | 0; $17 = 48 - $10 | 0; $21 = $10 + -25 | 0; $5 = $12; label$9 : { while (1) { $4 = HEAPF64[($5 << 3) + $7 >> 3]; $2 = 0; $6 = $5; $9 = ($5 | 0) < 1; if (!$9) { while (1) { $11 = ($7 + 480 | 0) + ($2 << 2) | 0; $14 = $4; $4 = $4 * 5.9604644775390625e-08; label$14 : { if (Math_abs($4) < 2147483648.0) { $8 = ~~$4; break label$14; } $8 = -2147483648; } $4 = +($8 | 0); $14 = $14 + $4 * -16777216.0; label$13 : { if (Math_abs($14) < 2147483648.0) { $8 = ~~$14; break label$13; } $8 = -2147483648; } HEAP32[$11 >> 2] = $8; $6 = $6 + -1 | 0; $4 = HEAPF64[($6 << 3) + $7 >> 3] + $4; $2 = $2 + 1 | 0; if (($5 | 0) != ($2 | 0)) { continue } break; } } $4 = scalbn($4, $13); $4 = $4 + Math_floor($4 * .125) * -8.0; label$17 : { if (Math_abs($4) < 2147483648.0) { $11 = ~~$4; break label$17; } $11 = -2147483648; } $4 = $4 - +($11 | 0); label$19 : { label$20 : { label$21 : { $18 = ($13 | 0) < 1; label$22 : { if (!$18) { $6 = (($5 << 2) + $7 | 0) + 476 | 0; $8 = HEAP32[$6 >> 2]; $2 = $8 >> $17; $15 = $6; $6 = $8 - ($2 << $17) | 0; HEAP32[$15 >> 2] = $6; $11 = $2 + $11 | 0; $8 = $6 >> $20; break label$22; } if ($13) { break label$21 } $8 = HEAP32[(($5 << 2) + $7 | 0) + 476 >> 2] >> 23; } if (($8 | 0) < 1) { break label$19 } break label$20; } $8 = 2; if (!!($4 >= .5)) { break label$20 } $8 = 0; break label$19; } $2 = 0; $6 = 0; if (!$9) { while (1) { $15 = ($7 + 480 | 0) + ($2 << 2) | 0; $19 = HEAP32[$15 >> 2]; $9 = 16777215; label$26 : { label$27 : { if ($6) { break label$27 } $9 = 16777216; if ($19) { break label$27 } $6 = 0; break label$26; } HEAP32[$15 >> 2] = $9 - $19; $6 = 1; } $2 = $2 + 1 | 0; if (($5 | 0) != ($2 | 0)) { continue } break; } } label$28 : { if ($18) { break label$28 } label$29 : { switch ($21 | 0) { case 0: $2 = (($5 << 2) + $7 | 0) + 476 | 0; HEAP32[$2 >> 2] = HEAP32[$2 >> 2] & 8388607; break label$28; case 1: break label$29; default: break label$28; }; } $2 = (($5 << 2) + $7 | 0) + 476 | 0; HEAP32[$2 >> 2] = HEAP32[$2 >> 2] & 4194303; } $11 = $11 + 1 | 0; if (($8 | 0) != 2) { break label$19 } $4 = 1.0 - $4; $8 = 2; if (!$6) { break label$19 } $4 = $4 - scalbn(1.0, $13); } if ($4 == 0.0) { $6 = 0; label$32 : { $2 = $5; if (($2 | 0) <= ($12 | 0)) { break label$32 } while (1) { $2 = $2 + -1 | 0; $6 = HEAP32[($7 + 480 | 0) + ($2 << 2) >> 2] | $6; if (($2 | 0) > ($12 | 0)) { continue } break; }; if (!$6) { break label$32 } $10 = $13; while (1) { $10 = $10 + -24 | 0; $5 = $5 + -1 | 0; if (!HEAP32[($7 + 480 | 0) + ($5 << 2) >> 2]) { continue } break; }; break label$9; } $2 = 1; while (1) { $6 = $2; $2 = $2 + 1 | 0; if (!HEAP32[($7 + 480 | 0) + ($12 - $6 << 2) >> 2]) { continue } break; }; $6 = $5 + $6 | 0; while (1) { $9 = $3 + $5 | 0; $5 = $5 + 1 | 0; HEAPF64[($7 + 320 | 0) + ($9 << 3) >> 3] = HEAP32[($16 + $5 << 2) + 7616 >> 2]; $2 = 0; $4 = 0.0; if (($3 | 0) >= 1) { while (1) { $4 = $4 + HEAPF64[($2 << 3) + $0 >> 3] * HEAPF64[($7 + 320 | 0) + ($9 - $2 << 3) >> 3]; $2 = $2 + 1 | 0; if (($3 | 0) != ($2 | 0)) { continue } break; } } HEAPF64[($5 << 3) + $7 >> 3] = $4; if (($5 | 0) < ($6 | 0)) { continue } break; }; $5 = $6; continue; } break; }; $4 = scalbn($4, 0 - $13 | 0); label$39 : { if (!!($4 >= 16777216.0)) { $3 = ($7 + 480 | 0) + ($5 << 2) | 0; $14 = $4; $4 = $4 * 5.9604644775390625e-08; label$42 : { if (Math_abs($4) < 2147483648.0) { $2 = ~~$4; break label$42; } $2 = -2147483648; } $4 = $14 + +($2 | 0) * -16777216.0; label$41 : { if (Math_abs($4) < 2147483648.0) { $0 = ~~$4; break label$41; } $0 = -2147483648; } HEAP32[$3 >> 2] = $0; $5 = $5 + 1 | 0; break label$39; } $2 = Math_abs($4) < 2147483648.0 ? ~~$4 : -2147483648; $10 = $13; } HEAP32[($7 + 480 | 0) + ($5 << 2) >> 2] = $2; } $4 = scalbn(1.0, $10); label$47 : { if (($5 | 0) <= -1) { break label$47 } $2 = $5; while (1) { HEAPF64[($2 << 3) + $7 >> 3] = $4 * +HEAP32[($7 + 480 | 0) + ($2 << 2) >> 2]; $4 = $4 * 5.9604644775390625e-08; $0 = ($2 | 0) > 0; $2 = $2 + -1 | 0; if ($0) { continue } break; }; $9 = 0; if (($5 | 0) < 0) { break label$47 } $0 = ($12 | 0) > 0 ? $12 : 0; $6 = $5; while (1) { $3 = $0 >>> 0 < $9 >>> 0 ? $0 : $9; $10 = $5 - $6 | 0; $2 = 0; $4 = 0.0; while (1) { $4 = $4 + HEAPF64[($2 << 3) + 10384 >> 3] * HEAPF64[($2 + $6 << 3) + $7 >> 3]; $13 = ($2 | 0) != ($3 | 0); $2 = $2 + 1 | 0; if ($13) { continue } break; }; HEAPF64[($7 + 160 | 0) + ($10 << 3) >> 3] = $4; $6 = $6 + -1 | 0; $2 = ($5 | 0) != ($9 | 0); $9 = $9 + 1 | 0; if ($2) { continue } break; }; } $4 = 0.0; if (($5 | 0) >= 0) { $2 = $5; while (1) { $4 = $4 + HEAPF64[($7 + 160 | 0) + ($2 << 3) >> 3]; $0 = ($2 | 0) > 0; $2 = $2 + -1 | 0; if ($0) { continue } break; }; } HEAPF64[$1 >> 3] = $8 ? -$4 : $4; $4 = HEAPF64[$7 + 160 >> 3] - $4; $2 = 1; if (($5 | 0) >= 1) { while (1) { $4 = $4 + HEAPF64[($7 + 160 | 0) + ($2 << 3) >> 3]; $0 = ($2 | 0) != ($5 | 0); $2 = $2 + 1 | 0; if ($0) { continue } break; } } HEAPF64[$1 + 8 >> 3] = $8 ? -$4 : $4; global$0 = $7 + 560 | 0; return $11 & 7; } function __rem_pio2($0, $1) { var $2 = 0.0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0.0, $9 = 0.0, $10 = 0; $6 = global$0 - 48 | 0; global$0 = $6; wasm2js_scratch_store_f64(+$0); $5 = wasm2js_scratch_load_i32(1) | 0; $3 = wasm2js_scratch_load_i32(0) | 0; label$1 : { label$2 : { $4 = $5; $5 = $4; $7 = $4 & 2147483647; label$3 : { if ($7 >>> 0 <= 1074752122) { if (($5 & 1048575) == 598523) { break label$3 } if ($7 >>> 0 <= 1073928572) { if (($4 | 0) > 0 ? 1 : ($4 | 0) >= 0 ? ($3 >>> 0 < 0 ? 0 : 1) : 0) { $0 = $0 + -1.5707963267341256; $2 = $0 + -6.077100506506192e-11; HEAPF64[$1 >> 3] = $2; HEAPF64[$1 + 8 >> 3] = $0 - $2 + -6.077100506506192e-11; $3 = 1; break label$1; } $0 = $0 + 1.5707963267341256; $2 = $0 + 6.077100506506192e-11; HEAPF64[$1 >> 3] = $2; HEAPF64[$1 + 8 >> 3] = $0 - $2 + 6.077100506506192e-11; $3 = -1; break label$1; } if (($4 | 0) > 0 ? 1 : ($4 | 0) >= 0 ? ($3 >>> 0 < 0 ? 0 : 1) : 0) { $0 = $0 + -3.1415926534682512; $2 = $0 + -1.2154201013012384e-10; HEAPF64[$1 >> 3] = $2; HEAPF64[$1 + 8 >> 3] = $0 - $2 + -1.2154201013012384e-10; $3 = 2; break label$1; } $0 = $0 + 3.1415926534682512; $2 = $0 + 1.2154201013012384e-10; HEAPF64[$1 >> 3] = $2; HEAPF64[$1 + 8 >> 3] = $0 - $2 + 1.2154201013012384e-10; $3 = -2; break label$1; } if ($7 >>> 0 <= 1075594811) { if ($7 >>> 0 <= 1075183036) { if (($7 | 0) == 1074977148) { break label$3 } if (($4 | 0) > 0 ? 1 : ($4 | 0) >= 0 ? ($3 >>> 0 < 0 ? 0 : 1) : 0) { $0 = $0 + -4.712388980202377; $2 = $0 + -1.8231301519518578e-10; HEAPF64[$1 >> 3] = $2; HEAPF64[$1 + 8 >> 3] = $0 - $2 + -1.8231301519518578e-10; $3 = 3; break label$1; } $0 = $0 + 4.712388980202377; $2 = $0 + 1.8231301519518578e-10; HEAPF64[$1 >> 3] = $2; HEAPF64[$1 + 8 >> 3] = $0 - $2 + 1.8231301519518578e-10; $3 = -3; break label$1; } if (($7 | 0) == 1075388923) { break label$3 } if (($4 | 0) > 0 ? 1 : ($4 | 0) >= 0 ? ($3 >>> 0 < 0 ? 0 : 1) : 0) { $0 = $0 + -6.2831853069365025; $2 = $0 + -2.430840202602477e-10; HEAPF64[$1 >> 3] = $2; HEAPF64[$1 + 8 >> 3] = $0 - $2 + -2.430840202602477e-10; $3 = 4; break label$1; } $0 = $0 + 6.2831853069365025; $2 = $0 + 2.430840202602477e-10; HEAPF64[$1 >> 3] = $2; HEAPF64[$1 + 8 >> 3] = $0 - $2 + 2.430840202602477e-10; $3 = -4; break label$1; } if ($7 >>> 0 > 1094263290) { break label$2 } } $9 = $0 * .6366197723675814 + 6755399441055744.0 + -6755399441055744.0; $2 = $0 + $9 * -1.5707963267341256; $8 = $9 * 6.077100506506192e-11; $0 = $2 - $8; HEAPF64[$1 >> 3] = $0; wasm2js_scratch_store_f64(+$0); $3 = wasm2js_scratch_load_i32(1) | 0; wasm2js_scratch_load_i32(0) | 0; $4 = $7 >>> 20 | 0; $5 = ($4 - ($3 >>> 20 & 2047) | 0) < 17; if (Math_abs($9) < 2147483648.0) { $3 = ~~$9 } else { $3 = -2147483648 } label$14 : { if ($5) { break label$14 } $8 = $2; $0 = $9 * 6.077100506303966e-11; $2 = $2 - $0; $8 = $9 * 2.0222662487959506e-21 - ($8 - $2 - $0); $0 = $2 - $8; HEAPF64[$1 >> 3] = $0; $5 = $4; wasm2js_scratch_store_f64(+$0); $4 = wasm2js_scratch_load_i32(1) | 0; wasm2js_scratch_load_i32(0) | 0; if (($5 - ($4 >>> 20 & 2047) | 0) < 50) { break label$14 } $8 = $2; $0 = $9 * 2.0222662487111665e-21; $2 = $2 - $0; $8 = $9 * 8.4784276603689e-32 - ($8 - $2 - $0); $0 = $2 - $8; HEAPF64[$1 >> 3] = $0; } HEAPF64[$1 + 8 >> 3] = $2 - $0 - $8; break label$1; } if ($7 >>> 0 >= 2146435072) { $0 = $0 - $0; HEAPF64[$1 >> 3] = $0; HEAPF64[$1 + 8 >> 3] = $0; $3 = 0; break label$1; } wasm2js_scratch_store_i32(0, $3 | 0); wasm2js_scratch_store_i32(1, $4 & 1048575 | 1096810496); $0 = +wasm2js_scratch_load_f64(); $3 = 0; $5 = 1; while (1) { $10 = ($6 + 16 | 0) + ($3 << 3) | 0; if (Math_abs($0) < 2147483648.0) { $3 = ~~$0 } else { $3 = -2147483648 } $2 = +($3 | 0); HEAPF64[$10 >> 3] = $2; $0 = ($0 - $2) * 16777216.0; $3 = 1; $10 = $5 & 1; $5 = 0; if ($10) { continue } break; }; HEAPF64[$6 + 32 >> 3] = $0; label$20 : { if ($0 != 0.0) { $3 = 2; break label$20; } $5 = 1; while (1) { $3 = $5; $5 = $3 + -1 | 0; if (HEAPF64[($6 + 16 | 0) + ($3 << 3) >> 3] == 0.0) { continue } break; }; } $3 = __rem_pio2_large($6 + 16 | 0, $6, ($7 >>> 20 | 0) + -1046 | 0, $3 + 1 | 0); $0 = HEAPF64[$6 >> 3]; if (($4 | 0) < -1 ? 1 : ($4 | 0) <= -1 ? 1 : 0) { HEAPF64[$1 >> 3] = -$0; HEAPF64[$1 + 8 >> 3] = -HEAPF64[$6 + 8 >> 3]; $3 = 0 - $3 | 0; break label$1; } HEAPF64[$1 >> 3] = $0; $4 = HEAP32[$6 + 12 >> 2]; HEAP32[$1 + 8 >> 2] = HEAP32[$6 + 8 >> 2]; HEAP32[$1 + 12 >> 2] = $4; } global$0 = $6 + 48 | 0; return $3; } function __sin($0, $1) { var $2 = 0.0, $3 = 0.0; $2 = $0 * $0; $3 = $0; $0 = $2 * $0; return $3 - ($2 * ($1 * .5 - $0 * ($2 * ($2 * $2) * ($2 * 1.58969099521155e-10 + -2.5050760253406863e-08) + ($2 * ($2 * 2.7557313707070068e-06 + -1.984126982985795e-04) + .00833333333332249))) - $1 + $0 * .16666666666666632); } function cos($0) { var $1 = 0, $2 = 0.0, $3 = 0; $1 = global$0 - 16 | 0; global$0 = $1; wasm2js_scratch_store_f64(+$0); $3 = wasm2js_scratch_load_i32(1) | 0; wasm2js_scratch_load_i32(0) | 0; $3 = $3 & 2147483647; label$1 : { if ($3 >>> 0 <= 1072243195) { $2 = 1.0; if ($3 >>> 0 < 1044816030) { break label$1 } $2 = __cos($0, 0.0); break label$1; } $2 = $0 - $0; if ($3 >>> 0 >= 2146435072) { break label$1 } label$3 : { switch (__rem_pio2($0, $1) & 3) { case 0: $2 = __cos(HEAPF64[$1 >> 3], HEAPF64[$1 + 8 >> 3]); break label$1; case 1: $2 = -__sin(HEAPF64[$1 >> 3], HEAPF64[$1 + 8 >> 3]); break label$1; case 2: $2 = -__cos(HEAPF64[$1 >> 3], HEAPF64[$1 + 8 >> 3]); break label$1; default: break label$3; }; } $2 = __sin(HEAPF64[$1 >> 3], HEAPF64[$1 + 8 >> 3]); } $0 = $2; global$0 = $1 + 16 | 0; return $0; } function exp($0) { var $1 = 0, $2 = 0.0, $3 = 0, $4 = 0.0, $5 = 0, $6 = 0.0, $7 = 0; wasm2js_scratch_store_f64(+$0); $3 = wasm2js_scratch_load_i32(1) | 0; $7 = wasm2js_scratch_load_i32(0) | 0; $5 = $3 >>> 31 | 0; label$1 : { label$2 : { label$3 : { label$4 : { $6 = $0; label$5 : { label$6 : { $1 = $3; $3 = $1 & 2147483647; label$7 : { if ($3 >>> 0 >= 1082532651) { $1 = $1 & 2147483647; if (($1 | 0) == 2146435072 & $7 >>> 0 > 0 | $1 >>> 0 > 2146435072) { return $0 } if (!!($0 > 709.782712893384)) { return $0 * 8988465674311579538646525.0e283 } if (!($0 < -708.3964185322641)) { break label$7 } if (!($0 < -745.1332191019411)) { break label$7 } break label$2; } if ($3 >>> 0 < 1071001155) { break label$4 } if ($3 >>> 0 < 1072734898) { break label$6 } } $0 = $0 * 1.4426950408889634 + HEAPF64[($5 << 3) + 10448 >> 3]; if (Math_abs($0) < 2147483648.0) { $1 = ~~$0; break label$5; } $1 = -2147483648; break label$5; } $1 = ($5 ^ 1) - $5 | 0; } $2 = +($1 | 0); $0 = $6 + $2 * -.6931471803691238; $4 = $2 * 1.9082149292705877e-10; $2 = $0 - $4; break label$3; } if ($3 >>> 0 <= 1043333120) { break label$1 } $1 = 0; $2 = $0; } $6 = $0; $0 = $2 * $2; $0 = $2 - $0 * ($0 * ($0 * ($0 * ($0 * 4.1381367970572385e-08 + -1.6533902205465252e-06) + 6.613756321437934e-05) + -2.7777777777015593e-03) + .16666666666666602); $4 = $6 + ($2 * $0 / (2.0 - $0) - $4) + 1.0; if (!$1) { break label$2 } $4 = scalbn($4, $1); } return $4; } return $0 + 1.0; } function FLAC__window_bartlett($0, $1) { var $2 = 0, $3 = Math_fround(0), $4 = 0, $5 = Math_fround(0), $6 = 0, $7 = 0, $8 = 0; $7 = $1 + -1 | 0; label$1 : { if ($1 & 1) { $4 = ($7 | 0) / 2 | 0; if (($1 | 0) >= 0) { $8 = ($4 | 0) > 0 ? $4 : 0; $6 = $8 + 1 | 0; $5 = Math_fround($7 | 0); while (1) { $3 = Math_fround($2 | 0); HEAPF32[($2 << 2) + $0 >> 2] = Math_fround($3 + $3) / $5; $4 = ($2 | 0) == ($8 | 0); $2 = $2 + 1 | 0; if (!$4) { continue } break; }; } if (($6 | 0) >= ($1 | 0)) { break label$1 } $5 = Math_fround($7 | 0); while (1) { $3 = Math_fround($6 | 0); HEAPF32[($6 << 2) + $0 >> 2] = Math_fround(2.0) - Math_fround(Math_fround($3 + $3) / $5); $6 = $6 + 1 | 0; if (($6 | 0) != ($1 | 0)) { continue } break; }; break label$1; } $4 = ($1 | 0) / 2 | 0; if (($1 | 0) >= 2) { $5 = Math_fround($7 | 0); while (1) { $3 = Math_fround($2 | 0); HEAPF32[($2 << 2) + $0 >> 2] = Math_fround($3 + $3) / $5; $2 = $2 + 1 | 0; if (($4 | 0) != ($2 | 0)) { continue } break; }; $2 = $4; } if (($2 | 0) >= ($1 | 0)) { break label$1 } $5 = Math_fround($7 | 0); while (1) { $3 = Math_fround($2 | 0); HEAPF32[($2 << 2) + $0 >> 2] = Math_fround(2.0) - Math_fround(Math_fround($3 + $3) / $5); $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__window_bartlett_hann($0, $1) { var $2 = 0, $3 = Math_fround(0), $4 = Math_fround(0), wasm2js_i32$0 = 0, wasm2js_f32$0 = Math_fround(0); if (($1 | 0) >= 1) { $4 = Math_fround($1 + -1 | 0); while (1) { $3 = Math_fround(Math_fround($2 | 0) / $4); (wasm2js_i32$0 = ($2 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(+Math_fround(Math_abs(Math_fround($3 + Math_fround(-.5)))) * -.47999998927116394 + .6200000047683716 + cos(+$3 * 6.283185307179586) * -.3799999952316284)), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__window_blackman($0, $1) { var $2 = 0, $3 = 0.0, $4 = 0.0, wasm2js_i32$0 = 0, wasm2js_f32$0 = Math_fround(0); if (($1 | 0) >= 1) { $3 = +($1 + -1 | 0); while (1) { $4 = +($2 | 0); (wasm2js_i32$0 = ($2 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(cos($4 * 12.566370614359172 / $3) * .07999999821186066 + (cos($4 * 6.283185307179586 / $3) * -.5 + .41999998688697815))), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__window_blackman_harris_4term_92db_sidelobe($0, $1) { var $2 = 0, $3 = 0.0, $4 = 0.0, wasm2js_i32$0 = 0, wasm2js_f32$0 = Math_fround(0); if (($1 | 0) >= 1) { $3 = +($1 + -1 | 0); while (1) { $4 = +($2 | 0); (wasm2js_i32$0 = ($2 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(cos($4 * 12.566370614359172 / $3) * .14127999544143677 + (cos($4 * 6.283185307179586 / $3) * -.488290011882782 + .35874998569488525) + cos($4 * 18.84955592153876 / $3) * -.011680000461637974)), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__window_connes($0, $1) { var $2 = 0.0, $3 = 0, $4 = 0.0; if (($1 | 0) >= 1) { $4 = +($1 + -1 | 0) * .5; while (1) { $2 = (+($3 | 0) - $4) / $4; $2 = 1.0 - $2 * $2; HEAPF32[($3 << 2) + $0 >> 2] = $2 * $2; $3 = $3 + 1 | 0; if (($3 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__window_flattop($0, $1) { var $2 = 0.0, $3 = 0, $4 = 0.0, $5 = 0.0, $6 = 0.0, $7 = 0.0, wasm2js_i32$0 = 0, wasm2js_f32$0 = Math_fround(0); if (($1 | 0) >= 1) { $2 = +($1 + -1 | 0); while (1) { $4 = +($3 | 0); $5 = cos($4 * 12.566370614359172 / $2); $6 = cos($4 * 6.283185307179586 / $2); $7 = cos($4 * 18.84955592153876 / $2); (wasm2js_i32$0 = ($3 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(cos($4 * 25.132741228718345 / $2) * 6.9473679177463055e-03 + ($5 * .27726316452026367 + ($6 * -.4166315793991089 + .21557894349098206) + $7 * -.08357894420623779))), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $3 = $3 + 1 | 0; if (($3 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__window_gauss($0, $1, $2) { var $3 = 0, $4 = 0.0, $5 = 0.0, $6 = 0.0, wasm2js_i32$0 = 0, wasm2js_f32$0 = Math_fround(0); if (($1 | 0) >= 1) { $4 = +($1 + -1 | 0) * .5; $6 = $4 * +$2; while (1) { $5 = (+($3 | 0) - $4) / $6; (wasm2js_i32$0 = ($3 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(exp($5 * ($5 * -.5)))), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $3 = $3 + 1 | 0; if (($3 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__window_hamming($0, $1) { var $2 = 0, $3 = 0.0, wasm2js_i32$0 = 0, wasm2js_f32$0 = Math_fround(0); if (($1 | 0) >= 1) { $3 = +($1 + -1 | 0); while (1) { (wasm2js_i32$0 = ($2 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(cos(+($2 | 0) * 6.283185307179586 / $3) * -.46000000834465027 + .5400000214576721)), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__window_hann($0, $1) { var $2 = 0, $3 = 0.0, wasm2js_i32$0 = 0, wasm2js_f32$0 = Math_fround(0); if (($1 | 0) >= 1) { $3 = +($1 + -1 | 0); while (1) { (wasm2js_i32$0 = ($2 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(.5 - cos(+($2 | 0) * 6.283185307179586 / $3) * .5)), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__window_kaiser_bessel($0, $1) { var $2 = 0, $3 = 0.0, $4 = 0.0, wasm2js_i32$0 = 0, wasm2js_f32$0 = Math_fround(0); if (($1 | 0) >= 1) { $3 = +($1 + -1 | 0); while (1) { $4 = +($2 | 0); (wasm2js_i32$0 = ($2 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(cos($4 * 12.566370614359172 / $3) * .09799999743700027 + (cos($4 * 6.283185307179586 / $3) * -.49799999594688416 + .4020000100135803) + cos($4 * 18.84955592153876 / $3) * -1.0000000474974513e-03)), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__window_nuttall($0, $1) { var $2 = 0, $3 = 0.0, $4 = 0.0, wasm2js_i32$0 = 0, wasm2js_f32$0 = Math_fround(0); if (($1 | 0) >= 1) { $3 = +($1 + -1 | 0); while (1) { $4 = +($2 | 0); (wasm2js_i32$0 = ($2 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(cos($4 * 12.566370614359172 / $3) * .13659949600696564 + (cos($4 * 6.283185307179586 / $3) * -.48917749524116516 + .36358189582824707) + cos($4 * 18.84955592153876 / $3) * -.010641099885106087)), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__window_rectangle($0, $1) { var $2 = 0; if (($1 | 0) >= 1) { while (1) { HEAP32[($2 << 2) + $0 >> 2] = 1065353216; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; } } } function FLAC__window_triangle($0, $1) { var $2 = 0, $3 = 0, $4 = Math_fround(0), $5 = 0, $6 = Math_fround(0), $7 = 0; $3 = 1; label$1 : { if ($1 & 1) { $2 = ($1 + 1 | 0) / 2 | 0; if (($1 | 0) >= 1) { $4 = Math_fround(Math_fround($1 | 0) + Math_fround(1.0)); $5 = ($2 | 0) > 1 ? $2 : 1; $3 = $5 + 1 | 0; $2 = 1; while (1) { $6 = Math_fround($2 | 0); HEAPF32[(($2 << 2) + $0 | 0) + -4 >> 2] = Math_fround($6 + $6) / $4; $7 = ($2 | 0) == ($5 | 0); $2 = $2 + 1 | 0; if (!$7) { continue } break; }; } if (($3 | 0) > ($1 | 0)) { break label$1 } $4 = Math_fround(Math_fround($1 | 0) + Math_fround(1.0)); while (1) { HEAPF32[(($3 << 2) + $0 | 0) + -4 >> 2] = Math_fround(($1 - $3 << 1) + 2 | 0) / $4; $2 = ($1 | 0) == ($3 | 0); $3 = $3 + 1 | 0; if (!$2) { continue } break; }; break label$1; } $2 = 1; if (($1 | 0) >= 2) { $5 = $1 >>> 1 | 0; $2 = $5 + 1 | 0; $4 = Math_fround(Math_fround($1 | 0) + Math_fround(1.0)); while (1) { $6 = Math_fround($3 | 0); HEAPF32[(($3 << 2) + $0 | 0) + -4 >> 2] = Math_fround($6 + $6) / $4; $7 = ($3 | 0) == ($5 | 0); $3 = $3 + 1 | 0; if (!$7) { continue } break; }; } if (($2 | 0) > ($1 | 0)) { break label$1 } $4 = Math_fround(Math_fround($1 | 0) + Math_fround(1.0)); while (1) { HEAPF32[(($2 << 2) + $0 | 0) + -4 >> 2] = Math_fround(($1 - $2 << 1) + 2 | 0) / $4; $3 = ($1 | 0) != ($2 | 0); $2 = $2 + 1 | 0; if ($3) { continue } break; }; } } function FLAC__window_tukey($0, $1, $2) { var $3 = 0, $4 = 0, $5 = 0.0, $6 = 0, wasm2js_i32$0 = 0, wasm2js_f32$0 = Math_fround(0); label$1 : { if (!!($2 <= Math_fround(0.0))) { if (($1 | 0) < 1) { break label$1 } while (1) { HEAP32[($3 << 2) + $0 >> 2] = 1065353216; $3 = $3 + 1 | 0; if (($3 | 0) != ($1 | 0)) { continue } break; }; break label$1; } if (!!($2 >= Math_fround(1.0))) { if (($1 | 0) < 1) { break label$1 } $5 = +($1 + -1 | 0); while (1) { (wasm2js_i32$0 = ($3 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(.5 - cos(+($3 | 0) * 6.283185307179586 / $5) * .5)), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $3 = $3 + 1 | 0; if (($3 | 0) != ($1 | 0)) { continue } break; }; break label$1; } $2 = Math_fround(Math_fround($2 * Math_fround(.5)) * Math_fround($1 | 0)); label$6 : { if (Math_fround(Math_abs($2)) < Math_fround(2147483648.0)) { $4 = ~~$2; break label$6; } $4 = -2147483648; } if (($1 | 0) >= 1) { while (1) { HEAP32[($3 << 2) + $0 >> 2] = 1065353216; $3 = $3 + 1 | 0; if (($3 | 0) != ($1 | 0)) { continue } break; } } if (($4 | 0) < 2) { break label$1 } $1 = $1 - $4 | 0; $6 = $4 + -1 | 0; $5 = +($6 | 0); $3 = 0; while (1) { (wasm2js_i32$0 = ($3 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(.5 - cos(+($3 | 0) * 3.141592653589793 / $5) * .5)), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; (wasm2js_i32$0 = ($1 + $3 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(.5 - cos(+($3 + $6 | 0) * 3.141592653589793 / $5) * .5)), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $3 = $3 + 1 | 0; if (($4 | 0) != ($3 | 0)) { continue } break; }; } } function FLAC__window_partial_tukey($0, $1, $2, $3, $4) { var $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = Math_fround(0), $12 = 0.0, $13 = 0, wasm2js_i32$0 = 0, wasm2js_f32$0 = Math_fround(0); while (1) { $11 = $2; $2 = Math_fround(.05000000074505806); if ($11 <= Math_fround(0.0)) { continue } $2 = Math_fround(.949999988079071); if ($11 >= Math_fround(1.0)) { continue } break; }; $2 = Math_fround($1 | 0); $3 = Math_fround($2 * $3); label$2 : { if (Math_fround(Math_abs($3)) < Math_fround(2147483648.0)) { $6 = ~~$3; break label$2; } $6 = -2147483648; } $3 = Math_fround($11 * Math_fround(.5)); $2 = Math_fround($2 * $4); label$5 : { if (Math_fround(Math_abs($2)) < Math_fround(2147483648.0)) { $10 = ~~$2; break label$5; } $10 = -2147483648; } $2 = Math_fround($3 * Math_fround($10 - $6 | 0)); label$4 : { if (Math_fround(Math_abs($2)) < Math_fround(2147483648.0)) { $7 = ~~$2; break label$4; } $7 = -2147483648; } if (!(($6 | 0) < 1 | ($1 | 0) < 1)) { $5 = $6 + -1 | 0; $8 = $1 + -1 | 0; $8 = $5 >>> 0 < $8 >>> 0 ? $5 : $8; memset($0, ($8 << 2) + 4 | 0); $5 = $8 + 1 | 0; while (1) { $13 = ($9 | 0) == ($8 | 0); $9 = $9 + 1 | 0; if (!$13) { continue } break; }; } $6 = $6 + $7 | 0; label$10 : { if (($5 | 0) >= ($6 | 0) | ($5 | 0) >= ($1 | 0)) { break label$10 } $12 = +($7 | 0); $9 = 1; while (1) { (wasm2js_i32$0 = ($5 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(.5 - cos(+($9 | 0) * 3.141592653589793 / $12) * .5)), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $5 = $5 + 1 | 0; if (($5 | 0) >= ($6 | 0)) { break label$10 } $9 = $9 + 1 | 0; if (($5 | 0) < ($1 | 0)) { continue } break; }; } $6 = $10 - $7 | 0; label$12 : { if (($5 | 0) >= ($6 | 0) | ($5 | 0) >= ($1 | 0)) { break label$12 } while (1) { HEAP32[($5 << 2) + $0 >> 2] = 1065353216; $5 = $5 + 1 | 0; if (($5 | 0) >= ($6 | 0)) { break label$12 } if (($5 | 0) < ($1 | 0)) { continue } break; }; } label$14 : { if (($5 | 0) >= ($10 | 0) | ($5 | 0) >= ($1 | 0)) { break label$14 } $12 = +($7 | 0); while (1) { (wasm2js_i32$0 = ($5 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(.5 - cos(+($7 | 0) * 3.141592653589793 / $12) * .5)), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $5 = $5 + 1 | 0; if (($5 | 0) >= ($10 | 0)) { break label$14 } $7 = $7 + -1 | 0; if (($5 | 0) < ($1 | 0)) { continue } break; }; } if (($5 | 0) < ($1 | 0)) { memset(($5 << 2) + $0 | 0, $1 - $5 << 2) } } function FLAC__window_punchout_tukey($0, $1, $2, $3, $4) { var $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0.0, $12 = Math_fround(0), $13 = 0, $14 = Math_fround(0), wasm2js_i32$0 = 0, wasm2js_f32$0 = Math_fround(0); while (1) { $12 = $2; $2 = Math_fround(.05000000074505806); if ($12 <= Math_fround(0.0)) { continue } $2 = Math_fround(.949999988079071); if ($12 >= Math_fround(1.0)) { continue } break; }; $2 = Math_fround($12 * Math_fround(.5)); $14 = $2; $12 = Math_fround($1 | 0); $3 = Math_fround($12 * $3); label$3 : { if (Math_fround(Math_abs($3)) < Math_fround(2147483648.0)) { $10 = ~~$3; break label$3; } $10 = -2147483648; } $3 = Math_fround($14 * Math_fround($10 | 0)); label$2 : { if (Math_fround(Math_abs($3)) < Math_fround(2147483648.0)) { $6 = ~~$3; break label$2; } $6 = -2147483648; } $8 = ($6 | 0) < 1; $7 = $1; $3 = Math_fround($12 * $4); label$7 : { if (Math_fround(Math_abs($3)) < Math_fround(2147483648.0)) { $9 = ~~$3; break label$7; } $9 = -2147483648; } $2 = Math_fround($2 * Math_fround($7 - $9 | 0)); label$6 : { if (Math_fround(Math_abs($2)) < Math_fround(2147483648.0)) { $7 = ~~$2; break label$6; } $7 = -2147483648; } if (!(($1 | 0) < 1 | $8)) { $5 = $6 + -1 >>> 0 < $1 + -1 >>> 0 ? $6 : $1; $11 = +($6 | 0); $8 = 0; $13 = 1; while (1) { (wasm2js_i32$0 = ($8 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(.5 - cos(+($13 | 0) * 3.141592653589793 / $11) * .5)), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $13 = $13 + 1 | 0; $8 = $8 + 1 | 0; if (($8 | 0) != ($5 | 0)) { continue } break; }; } $8 = $10 - $6 | 0; label$12 : { if (($5 | 0) >= ($8 | 0) | ($5 | 0) >= ($1 | 0)) { break label$12 } while (1) { HEAP32[($5 << 2) + $0 >> 2] = 1065353216; $5 = $5 + 1 | 0; if (($5 | 0) >= ($8 | 0)) { break label$12 } if (($5 | 0) < ($1 | 0)) { continue } break; }; } label$14 : { if (($5 | 0) >= ($10 | 0) | ($5 | 0) >= ($1 | 0)) { break label$14 } $11 = +($6 | 0); while (1) { (wasm2js_i32$0 = ($5 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(.5 - cos(+($6 | 0) * 3.141592653589793 / $11) * .5)), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $5 = $5 + 1 | 0; if (($5 | 0) >= ($10 | 0)) { break label$14 } $6 = $6 + -1 | 0; if (($5 | 0) < ($1 | 0)) { continue } break; }; } label$16 : { if (($5 | 0) >= ($9 | 0) | ($5 | 0) >= ($1 | 0)) { break label$16 } $6 = $5 ^ -1; $10 = $6 + $9 | 0; $6 = $1 + $6 | 0; memset(($5 << 2) + $0 | 0, (($10 >>> 0 < $6 >>> 0 ? $10 : $6) << 2) + 4 | 0); while (1) { $5 = $5 + 1 | 0; if (($5 | 0) >= ($9 | 0)) { break label$16 } if (($5 | 0) < ($1 | 0)) { continue } break; }; } $9 = $7 + $9 | 0; label$18 : { if (($5 | 0) >= ($9 | 0) | ($5 | 0) >= ($1 | 0)) { break label$18 } $11 = +($7 | 0); $6 = 1; while (1) { (wasm2js_i32$0 = ($5 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(.5 - cos(+($6 | 0) * 3.141592653589793 / $11) * .5)), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $5 = $5 + 1 | 0; if (($5 | 0) >= ($9 | 0)) { break label$18 } $6 = $6 + 1 | 0; if (($5 | 0) < ($1 | 0)) { continue } break; }; } $6 = $1 - $7 | 0; label$20 : { if (($5 | 0) >= ($6 | 0) | ($5 | 0) >= ($1 | 0)) { break label$20 } while (1) { HEAP32[($5 << 2) + $0 >> 2] = 1065353216; $5 = $5 + 1 | 0; if (($5 | 0) >= ($6 | 0)) { break label$20 } if (($5 | 0) < ($1 | 0)) { continue } break; }; } if (($5 | 0) < ($1 | 0)) { $11 = +($7 | 0); while (1) { (wasm2js_i32$0 = ($5 << 2) + $0 | 0, wasm2js_f32$0 = Math_fround(.5 - cos(+($7 | 0) * 3.141592653589793 / $11) * .5)), HEAPF32[wasm2js_i32$0 >> 2] = wasm2js_f32$0; $7 = $7 + -1 | 0; $5 = $5 + 1 | 0; if (($5 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__window_welch($0, $1) { var $2 = 0, $3 = 0.0, $4 = 0.0; if (($1 | 0) >= 1) { $3 = +($1 + -1 | 0) * .5; while (1) { $4 = (+($2 | 0) - $3) / $3; HEAPF32[($2 << 2) + $0 >> 2] = 1.0 - $4 * $4; $2 = $2 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; } } function FLAC__add_metadata_block($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0; $3 = strlen(HEAP32[2720]); label$1 : { if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 4 >> 2], HEAP32[1391])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 >> 2], HEAP32[1392])) { break label$1 } $2 = HEAP32[$0 + 8 >> 2]; $2 = HEAP32[$0 >> 2] == 4 ? ($2 + $3 | 0) - HEAP32[$0 + 16 >> 2] | 0 : $2; $4 = HEAP32[1393]; if ($2 >>> $4) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, $2, $4)) { break label$1 } label$3 : { label$4 : { label$5 : { label$6 : { label$7 : { label$8 : { label$9 : { switch (HEAP32[$0 >> 2]) { case 3: if (!HEAP32[$0 + 16 >> 2]) { break label$3 } $4 = HEAP32[1367]; $6 = HEAP32[1366]; $7 = HEAP32[1365]; $2 = 0; break label$8; case 0: if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 16 >> 2], HEAP32[1356])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 20 >> 2], HEAP32[1357])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 24 >> 2], HEAP32[1358])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 28 >> 2], HEAP32[1359])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 32 >> 2], HEAP32[1360])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 36 >> 2] + -1 | 0, HEAP32[1361])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 40 >> 2] + -1 | 0, HEAP32[1362])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint64($1, HEAP32[$0 + 48 >> 2], HEAP32[$0 + 52 >> 2], HEAP32[1363])) { break label$1 } if (FLAC__bitwriter_write_byte_block($1, $0 + 56 | 0, 16)) { break label$3 } break label$1; case 1: if (FLAC__bitwriter_write_zeroes($1, HEAP32[$0 + 8 >> 2] << 3)) { break label$3 } break label$1; case 6: break label$5; case 5: break label$6; case 4: break label$7; case 2: break label$9; default: break label$4; }; } $2 = HEAP32[1364] >>> 3 | 0; if (!FLAC__bitwriter_write_byte_block($1, $0 + 16 | 0, $2)) { break label$1 } if (FLAC__bitwriter_write_byte_block($1, HEAP32[$0 + 20 >> 2], HEAP32[$0 + 8 >> 2] - $2 | 0)) { break label$3 } break label$1; } while (1) { $3 = Math_imul($2, 24); $5 = $3 + HEAP32[$0 + 20 >> 2] | 0; if (!FLAC__bitwriter_write_raw_uint64($1, HEAP32[$5 >> 2], HEAP32[$5 + 4 >> 2], $7)) { break label$1 } $5 = $3 + HEAP32[$0 + 20 >> 2] | 0; if (!FLAC__bitwriter_write_raw_uint64($1, HEAP32[$5 + 8 >> 2], HEAP32[$5 + 12 >> 2], $6)) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[($3 + HEAP32[$0 + 20 >> 2] | 0) + 16 >> 2], $4)) { break label$1 } $2 = $2 + 1 | 0; if ($2 >>> 0 < HEAPU32[$0 + 16 >> 2]) { continue } break; }; break label$3; } if (!FLAC__bitwriter_write_raw_uint32_little_endian($1, $3)) { break label$1 } if (!FLAC__bitwriter_write_byte_block($1, HEAP32[2720], $3)) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32_little_endian($1, HEAP32[$0 + 24 >> 2])) { break label$1 } if (!HEAP32[$0 + 24 >> 2]) { break label$3 } $2 = 0; while (1) { $3 = $2 << 3; if (!FLAC__bitwriter_write_raw_uint32_little_endian($1, HEAP32[$3 + HEAP32[$0 + 28 >> 2] >> 2])) { break label$1 } $3 = $3 + HEAP32[$0 + 28 >> 2] | 0; if (!FLAC__bitwriter_write_byte_block($1, HEAP32[$3 + 4 >> 2], HEAP32[$3 >> 2])) { break label$1 } $2 = $2 + 1 | 0; if ($2 >>> 0 < HEAPU32[$0 + 24 >> 2]) { continue } break; }; break label$3; } if (!FLAC__bitwriter_write_byte_block($1, $0 + 16 | 0, HEAP32[1378] >>> 3 | 0)) { break label$1 } if (!FLAC__bitwriter_write_raw_uint64($1, HEAP32[$0 + 152 >> 2], HEAP32[$0 + 156 >> 2], HEAP32[1379])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 160 >> 2] != 0, HEAP32[1380])) { break label$1 } if (!FLAC__bitwriter_write_zeroes($1, HEAP32[1381])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 164 >> 2], HEAP32[1382])) { break label$1 } if (!HEAP32[$0 + 164 >> 2]) { break label$3 } $6 = HEAP32[1373] >>> 3 | 0; $7 = HEAP32[1370]; $5 = HEAP32[1369]; $9 = HEAP32[1368]; $10 = HEAP32[1377]; $11 = HEAP32[1376]; $12 = HEAP32[1375]; $13 = HEAP32[1374]; $14 = HEAP32[1372]; $15 = HEAP32[1371]; $3 = 0; while (1) { $2 = HEAP32[$0 + 168 >> 2] + ($3 << 5) | 0; if (!FLAC__bitwriter_write_raw_uint64($1, HEAP32[$2 >> 2], HEAP32[$2 + 4 >> 2], $15)) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAPU8[$2 + 8 | 0], $14)) { break label$1 } if (!FLAC__bitwriter_write_byte_block($1, $2 + 9 | 0, $6)) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP8[$2 + 22 | 0] & 1, $13)) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAPU8[$2 + 22 | 0] >>> 1 & 1, $12)) { break label$1 } if (!FLAC__bitwriter_write_zeroes($1, $11)) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAPU8[$2 + 23 | 0], $10)) { break label$1 } label$16 : { $8 = $2 + 23 | 0; if (!HEAPU8[$8 | 0]) { break label$16 } $16 = $2 + 24 | 0; $2 = 0; while (1) { $4 = HEAP32[$16 >> 2] + ($2 << 4) | 0; if (!FLAC__bitwriter_write_raw_uint64($1, HEAP32[$4 >> 2], HEAP32[$4 + 4 >> 2], $9)) { return 0 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAPU8[$4 + 8 | 0], $5)) { return 0 } if (FLAC__bitwriter_write_zeroes($1, $7)) { $2 = $2 + 1 | 0; if ($2 >>> 0 >= HEAPU8[$8 | 0]) { break label$16 } continue; } break; }; return 0; } $3 = $3 + 1 | 0; if ($3 >>> 0 < HEAPU32[$0 + 164 >> 2]) { continue } break; }; break label$3; } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 16 >> 2], HEAP32[1383])) { break label$1 } $2 = strlen(HEAP32[$0 + 20 >> 2]); if (!FLAC__bitwriter_write_raw_uint32($1, $2, HEAP32[1384])) { break label$1 } if (!FLAC__bitwriter_write_byte_block($1, HEAP32[$0 + 20 >> 2], $2)) { break label$1 } $2 = strlen(HEAP32[$0 + 24 >> 2]); if (!FLAC__bitwriter_write_raw_uint32($1, $2, HEAP32[1385])) { break label$1 } if (!FLAC__bitwriter_write_byte_block($1, HEAP32[$0 + 24 >> 2], $2)) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 28 >> 2], HEAP32[1386])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 32 >> 2], HEAP32[1387])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 36 >> 2], HEAP32[1388])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 40 >> 2], HEAP32[1389])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 44 >> 2], HEAP32[1390])) { break label$1 } if (FLAC__bitwriter_write_byte_block($1, HEAP32[$0 + 48 >> 2], HEAP32[$0 + 44 >> 2])) { break label$3 } break label$1; } if (!FLAC__bitwriter_write_byte_block($1, HEAP32[$0 + 16 >> 2], HEAP32[$0 + 8 >> 2])) { break label$1 } } $17 = 1; } return $17; } function FLAC__frame_add_header($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0; $5 = global$0 - 16 | 0; global$0 = $5; label$1 : { if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[1394], HEAP32[1395])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, 0, HEAP32[1396])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 20 >> 2] != 0, HEAP32[1397])) { break label$1 } $8 = 16; $9 = 1; $3 = $1; label$3 : { label$4 : { label$5 : { label$6 : { label$7 : { label$8 : { label$9 : { label$10 : { label$11 : { $2 = HEAP32[$0 >> 2]; if (($2 | 0) <= 2047) { if (($2 | 0) <= 575) { $4 = 1; if (($2 | 0) == 192) { break label$3 } if (($2 | 0) == 256) { break label$8 } if (($2 | 0) != 512) { break label$4 } $4 = 9; break label$3; } if (($2 | 0) == 576) { break label$11 } if (($2 | 0) == 1024) { break label$7 } if (($2 | 0) != 1152) { break label$4 } $4 = 3; break label$3; } if (($2 | 0) <= 4607) { if (($2 | 0) == 2048) { break label$6 } if (($2 | 0) == 2304) { break label$10 } if (($2 | 0) != 4096) { break label$4 } $4 = 12; break label$3; } if (($2 | 0) <= 16383) { if (($2 | 0) == 4608) { break label$9 } if (($2 | 0) != 8192) { break label$4 } $4 = 13; break label$3; } if (($2 | 0) == 16384) { break label$5 } if (($2 | 0) != 32768) { break label$4 } $4 = 15; break label$3; } $4 = 2; break label$3; } $4 = 4; break label$3; } $4 = 5; break label$3; } $4 = 8; break label$3; } $4 = 10; break label$3; } $4 = 11; break label$3; } $4 = 14; break label$3; } $2 = $2 >>> 0 < 257; $8 = $2 ? 8 : 16; $9 = 0; $4 = $2 ? 6 : 7; } if (!FLAC__bitwriter_write_raw_uint32($3, $4, HEAP32[1398])) { break label$1 } label$16 : { label$17 : { label$18 : { label$19 : { label$20 : { label$21 : { label$22 : { label$23 : { $2 = HEAP32[$0 + 4 >> 2]; if (($2 | 0) <= 44099) { if (($2 | 0) <= 22049) { if (($2 | 0) == 8e3) { break label$23 } if (($2 | 0) != 16e3) { break label$17 } $3 = 5; break label$16; } if (($2 | 0) == 22050) { break label$22 } if (($2 | 0) == 24e3) { break label$21 } if (($2 | 0) != 32e3) { break label$17 } $3 = 8; break label$16; } if (($2 | 0) <= 95999) { if (($2 | 0) == 44100) { break label$20 } if (($2 | 0) == 48e3) { break label$19 } $3 = 1; if (($2 | 0) == 88200) { break label$16 } break label$17; } if (($2 | 0) == 96e3) { break label$18 } if (($2 | 0) != 192e3) { if (($2 | 0) != 176400) { break label$17 } $3 = 2; break label$16; } $3 = 3; break label$16; } $3 = 4; break label$16; } $3 = 6; break label$16; } $3 = 7; break label$16; } $3 = 9; break label$16; } $3 = 10; break label$16; } $3 = 11; break label$16; } $6 = ($2 >>> 0) % 1e3 | 0; if ($2 >>> 0 <= 255e3) { $3 = 12; $7 = 12; if (!$6) { break label$16 } } if (!(($2 >>> 0) % 10)) { $3 = 14; $7 = 14; break label$16; } $3 = $2 >>> 0 < 65536 ? 13 : 0; $7 = $3; } $6 = 0; if (!FLAC__bitwriter_write_raw_uint32($1, $3, HEAP32[1399])) { break label$1 } label$30 : { label$31 : { switch (HEAP32[$0 + 12 >> 2]) { case 0: $3 = HEAP32[$0 + 8 >> 2] + -1 | 0; break label$30; case 1: $3 = 8; break label$30; case 2: $3 = 9; break label$30; case 3: break label$31; default: break label$30; }; } $3 = 10; } if (!FLAC__bitwriter_write_raw_uint32($1, $3, HEAP32[1400])) { break label$1 } $3 = $1; $2 = __wasm_rotl_i32(HEAP32[$0 + 16 >> 2] + -8 | 0, 30); if ($2 >>> 0 <= 4) { $2 = HEAP32[($2 << 2) + 10464 >> 2] } else { $2 = 0 } if (!FLAC__bitwriter_write_raw_uint32($3, $2, HEAP32[1401])) { break label$1 } if (!FLAC__bitwriter_write_raw_uint32($1, 0, HEAP32[1402])) { break label$1 } label$37 : { if (!HEAP32[$0 + 20 >> 2]) { if (FLAC__bitwriter_write_utf8_uint32($1, HEAP32[$0 + 24 >> 2])) { break label$37 } break label$1; } if (!FLAC__bitwriter_write_utf8_uint64($1, HEAP32[$0 + 24 >> 2], HEAP32[$0 + 28 >> 2])) { break label$1 } } if (!$9) { if (!FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 >> 2] + -1 | 0, $8)) { break label$1 } } label$40 : { label$41 : { switch ($7 + -12 | 0) { case 0: if (FLAC__bitwriter_write_raw_uint32($1, HEAPU32[$0 + 4 >> 2] / 1e3 | 0, 8)) { break label$40 } break label$1; case 1: if (FLAC__bitwriter_write_raw_uint32($1, HEAP32[$0 + 4 >> 2], 16)) { break label$40 } break label$1; case 2: break label$41; default: break label$40; }; } if (!FLAC__bitwriter_write_raw_uint32($1, HEAPU32[$0 + 4 >> 2] / 10 | 0, 16)) { break label$1 } } if (!FLAC__bitwriter_get_write_crc8($1, $5 + 15 | 0)) { break label$1 } $6 = (FLAC__bitwriter_write_raw_uint32($1, HEAPU8[$5 + 15 | 0], HEAP32[1403]) | 0) != 0; } global$0 = $5 + 16 | 0; return $6; } function FLAC__subframe_add_constant($0, $1, $2, $3) { var $4 = 0; label$1 : { if (!FLAC__bitwriter_write_raw_uint32($3, HEAP32[1417] | ($2 | 0) != 0, HEAP32[1416] + (HEAP32[1415] + HEAP32[1414] | 0) | 0)) { break label$1 } if ($2) { if (!FLAC__bitwriter_write_unary_unsigned($3, $2 + -1 | 0)) { break label$1 } } $4 = (FLAC__bitwriter_write_raw_int32($3, HEAP32[$0 >> 2], $1) | 0) != 0; } return $4; } function FLAC__subframe_add_fixed($0, $1, $2, $3, $4) { var $5 = 0; label$1 : { if (!FLAC__bitwriter_write_raw_uint32($4, HEAP32[1419] | ($3 | 0) != 0 | HEAP32[$0 + 12 >> 2] << 1, HEAP32[1416] + (HEAP32[1415] + HEAP32[1414] | 0) | 0)) { break label$1 } if ($3) { if (!FLAC__bitwriter_write_unary_unsigned($4, $3 + -1 | 0)) { break label$1 } } label$3 : { if (!HEAP32[$0 + 12 >> 2]) { break label$3 } $3 = 0; while (1) { if (FLAC__bitwriter_write_raw_int32($4, HEAP32[(($3 << 2) + $0 | 0) + 16 >> 2], $2)) { $3 = $3 + 1 | 0; if ($3 >>> 0 < HEAPU32[$0 + 12 >> 2]) { continue } break label$3; } break; }; return 0; } if (!FLAC__bitwriter_write_raw_uint32($4, HEAP32[$0 >> 2], HEAP32[1405])) { break label$1 } label$6 : { if (HEAPU32[$0 >> 2] > 1) { break label$6 } if (!FLAC__bitwriter_write_raw_uint32($4, HEAP32[$0 + 4 >> 2], HEAP32[1406])) { break label$1 } $2 = HEAP32[$0 >> 2]; if ($2 >>> 0 > 1) { break label$6 } $3 = $1; $1 = HEAP32[$0 + 8 >> 2]; if (!add_residual_partitioned_rice_($4, HEAP32[$0 + 32 >> 2], $3, HEAP32[$0 + 12 >> 2], HEAP32[$1 >> 2], HEAP32[$1 + 4 >> 2], HEAP32[$0 + 4 >> 2], ($2 | 0) == 1)) { break label$1 } } $5 = 1; } return $5; } function add_residual_partitioned_rice_($0, $1, $2, $3, $4, $5, $6, $7) { var $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0; $12 = HEAP32[($7 ? 5644 : 5640) >> 2]; $9 = HEAP32[($7 ? 5632 : 5628) >> 2]; label$1 : { label$2 : { if (!$6) { if (!HEAP32[$5 >> 2]) { if (!FLAC__bitwriter_write_raw_uint32($0, HEAP32[$4 >> 2], $9)) { break label$2 } if (!FLAC__bitwriter_write_rice_signed_block($0, $1, $2, HEAP32[$4 >> 2])) { break label$2 } break label$1; } if (!FLAC__bitwriter_write_raw_uint32($0, $12, $9)) { break label$2 } if (!FLAC__bitwriter_write_raw_uint32($0, HEAP32[$5 >> 2], HEAP32[1409])) { break label$2 } if (!$2) { break label$1 } $7 = 0; while (1) { if (FLAC__bitwriter_write_raw_int32($0, HEAP32[($7 << 2) + $1 >> 2], HEAP32[$5 >> 2])) { $7 = $7 + 1 | 0; if (($7 | 0) != ($2 | 0)) { continue } break label$1; } break; }; return 0; } $15 = $2 + $3 >>> $6 | 0; $16 = HEAP32[1409]; $2 = 0; while (1) { $7 = $2; $13 = $15 - ($10 ? 0 : $3) | 0; $2 = $7 + $13 | 0; $14 = $10 << 2; $8 = $14 + $5 | 0; label$8 : { if (!HEAP32[$8 >> 2]) { $11 = 0; $8 = $4 + $14 | 0; if (!FLAC__bitwriter_write_raw_uint32($0, HEAP32[$8 >> 2], $9)) { break label$2 } if (FLAC__bitwriter_write_rice_signed_block($0, ($7 << 2) + $1 | 0, $13, HEAP32[$8 >> 2])) { break label$8 } break label$2; } $11 = 0; if (!FLAC__bitwriter_write_raw_uint32($0, $12, $9)) { break label$2 } if (!FLAC__bitwriter_write_raw_uint32($0, HEAP32[$8 >> 2], $16)) { break label$2 } if ($7 >>> 0 >= $2 >>> 0) { break label$8 } while (1) { if (!FLAC__bitwriter_write_raw_int32($0, HEAP32[($7 << 2) + $1 >> 2], HEAP32[$8 >> 2])) { break label$2 } $7 = $7 + 1 | 0; if (($7 | 0) != ($2 | 0)) { continue } break; }; } $11 = 1; $10 = $10 + 1 | 0; if (!($10 >>> $6)) { continue } break; }; } return $11; } return 1; } function FLAC__subframe_add_lpc($0, $1, $2, $3, $4) { var $5 = 0; label$1 : { if (!FLAC__bitwriter_write_raw_uint32($4, (HEAP32[$0 + 12 >> 2] << 1) + -2 | (HEAP32[1420] | ($3 | 0) != 0), HEAP32[1416] + (HEAP32[1415] + HEAP32[1414] | 0) | 0)) { break label$1 } if ($3) { if (!FLAC__bitwriter_write_unary_unsigned($4, $3 + -1 | 0)) { break label$1 } } label$3 : { if (!HEAP32[$0 + 12 >> 2]) { break label$3 } $3 = 0; while (1) { if (FLAC__bitwriter_write_raw_int32($4, HEAP32[(($3 << 2) + $0 | 0) + 152 >> 2], $2)) { $3 = $3 + 1 | 0; if ($3 >>> 0 < HEAPU32[$0 + 12 >> 2]) { continue } break label$3; } break; }; return 0; } if (!FLAC__bitwriter_write_raw_uint32($4, HEAP32[$0 + 16 >> 2] + -1 | 0, HEAP32[1412])) { break label$1 } if (!FLAC__bitwriter_write_raw_int32($4, HEAP32[$0 + 20 >> 2], HEAP32[1413])) { break label$1 } label$6 : { if (!HEAP32[$0 + 12 >> 2]) { break label$6 } $3 = 0; while (1) { if (FLAC__bitwriter_write_raw_int32($4, HEAP32[(($3 << 2) + $0 | 0) + 24 >> 2], HEAP32[$0 + 16 >> 2])) { $3 = $3 + 1 | 0; if ($3 >>> 0 < HEAPU32[$0 + 12 >> 2]) { continue } break label$6; } break; }; return 0; } if (!FLAC__bitwriter_write_raw_uint32($4, HEAP32[$0 >> 2], HEAP32[1405])) { break label$1 } label$9 : { if (HEAPU32[$0 >> 2] > 1) { break label$9 } if (!FLAC__bitwriter_write_raw_uint32($4, HEAP32[$0 + 4 >> 2], HEAP32[1406])) { break label$1 } $2 = HEAP32[$0 >> 2]; if ($2 >>> 0 > 1) { break label$9 } $3 = $1; $1 = HEAP32[$0 + 8 >> 2]; if (!add_residual_partitioned_rice_($4, HEAP32[$0 + 280 >> 2], $3, HEAP32[$0 + 12 >> 2], HEAP32[$1 >> 2], HEAP32[$1 + 4 >> 2], HEAP32[$0 + 4 >> 2], ($2 | 0) == 1)) { break label$1 } } $5 = 1; } return $5; } function FLAC__subframe_add_verbatim($0, $1, $2, $3, $4) { $0 = HEAP32[$0 >> 2]; label$1 : { if (!FLAC__bitwriter_write_raw_uint32($4, HEAP32[1418] | ($3 | 0) != 0, HEAP32[1416] + (HEAP32[1415] + HEAP32[1414] | 0) | 0)) { break label$1 } if ($3) { if (!FLAC__bitwriter_write_unary_unsigned($4, $3 + -1 | 0)) { break label$1 } } if (!$1) { return 1 } $3 = 0; label$4 : { while (1) { if (!FLAC__bitwriter_write_raw_int32($4, HEAP32[$0 + ($3 << 2) >> 2], $2)) { break label$4 } $3 = $3 + 1 | 0; if (($3 | 0) != ($1 | 0)) { continue } break; }; return 1; } } return 0; } function strncmp($0, $1, $2) { var $3 = 0, $4 = 0, $5 = 0; if (!$2) { return 0 } $3 = HEAPU8[$0 | 0]; label$2 : { if (!$3) { break label$2 } while (1) { label$4 : { $4 = HEAPU8[$1 | 0]; if (($4 | 0) != ($3 | 0)) { break label$4 } $2 = $2 + -1 | 0; if (!$2 | !$4) { break label$4 } $1 = $1 + 1 | 0; $3 = HEAPU8[$0 + 1 | 0]; $0 = $0 + 1 | 0; if ($3) { continue } break label$2; } break; }; $5 = $3; } return ($5 & 255) - HEAPU8[$1 | 0] | 0; } function __uflow($0) { var $1 = 0, $2 = 0; $1 = global$0 - 16 | 0; global$0 = $1; $2 = -1; label$1 : { if (__toread($0)) { break label$1 } if ((FUNCTION_TABLE[HEAP32[$0 + 32 >> 2]]($0, $1 + 15 | 0, 1) | 0) != 1) { break label$1 } $2 = HEAPU8[$1 + 15 | 0]; } global$0 = $1 + 16 | 0; return $2; } function __shlim($0) { var $1 = 0, $2 = 0, $3 = 0, $4 = 0; HEAP32[$0 + 112 >> 2] = 0; HEAP32[$0 + 116 >> 2] = 0; $3 = HEAP32[$0 + 8 >> 2]; $4 = HEAP32[$0 + 4 >> 2]; $1 = $3 - $4 | 0; $2 = $1 >> 31; HEAP32[$0 + 120 >> 2] = $1; HEAP32[$0 + 124 >> 2] = $2; if (!((($2 | 0) < 0 ? 1 : ($2 | 0) <= 0 ? ($1 >>> 0 > 0 ? 0 : 1) : 0) | 1)) { HEAP32[$0 + 104 >> 2] = $4; return; } HEAP32[$0 + 104 >> 2] = $3; } function __shgetc($0) { var $1 = 0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0; $2 = HEAP32[$0 + 116 >> 2]; $3 = $2; label$1 : { $5 = HEAP32[$0 + 112 >> 2]; label$2 : { if ($2 | $5) { $2 = HEAP32[$0 + 124 >> 2]; if (($2 | 0) > ($3 | 0) ? 1 : ($2 | 0) >= ($3 | 0) ? (HEAPU32[$0 + 120 >> 2] < $5 >>> 0 ? 0 : 1) : 0) { break label$2 } } $5 = __uflow($0); if (($5 | 0) > -1) { break label$1 } } HEAP32[$0 + 104 >> 2] = 0; return -1; } $2 = HEAP32[$0 + 8 >> 2]; $3 = HEAP32[$0 + 116 >> 2]; $4 = $3; label$4 : { label$5 : { $1 = HEAP32[$0 + 112 >> 2]; if (!($3 | $1)) { break label$5 } $3 = (HEAP32[$0 + 124 >> 2] ^ -1) + $4 | 0; $4 = HEAP32[$0 + 120 >> 2] ^ -1; $1 = $4 + $1 | 0; if ($1 >>> 0 < $4 >>> 0) { $3 = $3 + 1 | 0 } $4 = $1; $1 = HEAP32[$0 + 4 >> 2]; $6 = $2 - $1 | 0; $7 = $4 >>> 0 < $6 >>> 0 ? 0 : 1; $6 = $6 >> 31; if (($3 | 0) > ($6 | 0) ? 1 : ($3 | 0) >= ($6 | 0) ? $7 : 0) { break label$5 } HEAP32[$0 + 104 >> 2] = $4 + $1; break label$4; } HEAP32[$0 + 104 >> 2] = $2; } label$6 : { if (!$2) { $2 = HEAP32[$0 + 4 >> 2]; break label$6; } $3 = $0; $1 = $2; $2 = HEAP32[$0 + 4 >> 2]; $1 = ($1 - $2 | 0) + 1 | 0; $4 = $1 + HEAP32[$0 + 120 >> 2] | 0; $0 = HEAP32[$0 + 124 >> 2] + ($1 >> 31) | 0; HEAP32[$3 + 120 >> 2] = $4; HEAP32[$3 + 124 >> 2] = $4 >>> 0 < $1 >>> 0 ? $0 + 1 | 0 : $0; } $0 = $2 + -1 | 0; if (HEAPU8[$0 | 0] != ($5 | 0)) { HEAP8[$0 | 0] = $5 } return $5; } function __extendsftf2($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0; $4 = global$0 - 16 | 0; global$0 = $4; $5 = (wasm2js_scratch_store_f32($1), wasm2js_scratch_load_i32(0)); $2 = $5 & 2147483647; label$1 : { if ($2 + -8388608 >>> 0 <= 2130706431) { $3 = $2; $2 = $2 >>> 7 | 0; $3 = $3 << 25; $2 = $2 + 1065353216 | 0; $6 = $3; $2 = $3 >>> 0 < 0 ? $2 + 1 | 0 : $2; break label$1; } if ($2 >>> 0 >= 2139095040) { $2 = $5; $3 = $2 >>> 7 | 0; $6 = $2 << 25; $2 = $3 | 2147418112; break label$1; } if (!$2) { $2 = 0; break label$1; } $3 = $2; $2 = Math_clz32($2); __ashlti3($4, $3, 0, 0, 0, $2 + 81 | 0); $7 = HEAP32[$4 >> 2]; $8 = HEAP32[$4 + 4 >> 2]; $6 = HEAP32[$4 + 8 >> 2]; $2 = HEAP32[$4 + 12 >> 2] ^ 65536 | 16265 - $2 << 16; } HEAP32[$0 >> 2] = $7; HEAP32[$0 + 4 >> 2] = $8; HEAP32[$0 + 8 >> 2] = $6; HEAP32[$0 + 12 >> 2] = $5 & -2147483648 | $2; global$0 = $4 + 16 | 0; } function __floatsitf($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0; $3 = global$0 - 16 | 0; global$0 = $3; $6 = $0; $7 = $0; label$1 : { if (!$1) { $1 = 0; $5 = 0; break label$1; } $2 = $1 >> 31; $4 = $2 + $1 ^ $2; $2 = Math_clz32($4); __ashlti3($3, $4, 0, 0, 0, $2 + 81 | 0); $2 = (HEAP32[$3 + 12 >> 2] ^ 65536) + (16414 - $2 << 16) | 0; $4 = 0 + HEAP32[$3 + 8 >> 2] | 0; if ($4 >>> 0 < $5 >>> 0) { $2 = $2 + 1 | 0 } $1 = $1 & -2147483648 | $2; $2 = HEAP32[$3 + 4 >> 2]; $5 = HEAP32[$3 >> 2]; } HEAP32[$7 >> 2] = $5; HEAP32[$6 + 4 >> 2] = $2; HEAP32[$0 + 8 >> 2] = $4; HEAP32[$0 + 12 >> 2] = $1; global$0 = $3 + 16 | 0; } function __multf3($0, $1, $2, $3, $4, $5, $6, $7, $8) { var $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0, $22 = 0, $23 = 0, $24 = 0, $25 = 0, $26 = 0, $27 = 0, $28 = 0, $29 = 0, $30 = 0, $31 = 0, $32 = 0, $33 = 0, $34 = 0, $35 = 0, $36 = 0, $37 = 0, $38 = 0, $39 = 0, $40 = 0, $41 = 0, $42 = 0, $43 = 0, $44 = 0, $45 = 0, $46 = 0, $47 = 0; $13 = global$0 - 96 | 0; global$0 = $13; $15 = $2; $10 = $6; $19 = ($10 & 131071) << 15 | $5 >>> 17; $9 = $8 & 65535; $21 = $9; $17 = $7; $10 = $7; $24 = $10 << 15 | $6 >>> 17; $14 = ($4 ^ $8) & -2147483648; $10 = $4 & 65535; $12 = $10; $16 = $3; $27 = $10; $10 = $9; $25 = ($10 & 131071) << 15 | $7 >>> 17; $37 = $8 >>> 16 & 32767; $38 = $4 >>> 16 & 32767; label$1 : { label$2 : { if ($38 + -1 >>> 0 <= 32765) { $20 = 0; if ($37 + -1 >>> 0 < 32766) { break label$2 } } $11 = $4 & 2147483647; $9 = $11; $10 = $3; if (!(!$3 & ($9 | 0) == 2147418112 ? !($1 | $2) : ($9 | 0) == 2147418112 & $3 >>> 0 < 0 | $9 >>> 0 < 2147418112)) { $22 = $3; $14 = $4 | 32768; break label$1; } $11 = $8 & 2147483647; $4 = $11; $3 = $7; if (!(!$3 & ($4 | 0) == 2147418112 ? !($5 | $6) : ($4 | 0) == 2147418112 & $3 >>> 0 < 0 | $4 >>> 0 < 2147418112)) { $22 = $7; $14 = $8 | 32768; $1 = $5; $2 = $6; break label$1; } if (!($1 | $10 | ($9 ^ 2147418112 | $2))) { if (!($3 | $5 | ($4 | $6))) { $14 = 2147450880; $1 = 0; $2 = 0; break label$1; } $14 = $14 | 2147418112; $1 = 0; $2 = 0; break label$1; } if (!($3 | $5 | ($4 ^ 2147418112 | $6))) { $3 = $1 | $10; $4 = $2 | $9; $1 = 0; $2 = 0; if (!($3 | $4)) { $14 = 2147450880; break label$1; } $14 = $14 | 2147418112; break label$1; } if (!($1 | $10 | ($2 | $9))) { $1 = 0; $2 = 0; break label$1; } if (!($3 | $5 | ($4 | $6))) { $1 = 0; $2 = 0; break label$1; } $3 = 0; if (($9 | 0) == 65535 | $9 >>> 0 < 65535) { $9 = $1; $8 = $2; $3 = !($12 | $16); $7 = $3 << 6; $10 = Math_clz32($3 ? $1 : $16) + 32 | 0; $1 = Math_clz32($3 ? $2 : $12); $1 = $7 + (($1 | 0) == 32 ? $10 : $1) | 0; __ashlti3($13 + 80 | 0, $9, $8, $16, $12, $1 + -15 | 0); $16 = HEAP32[$13 + 88 >> 2]; $15 = HEAP32[$13 + 84 >> 2]; $27 = HEAP32[$13 + 92 >> 2]; $3 = 16 - $1 | 0; $1 = HEAP32[$13 + 80 >> 2]; } $20 = $3; if ($4 >>> 0 > 65535) { break label$2 } $2 = !($17 | $21); $4 = $2 << 6; $7 = Math_clz32($2 ? $5 : $17) + 32 | 0; $2 = Math_clz32($2 ? $6 : $21); $2 = $4 + (($2 | 0) == 32 ? $7 : $2) | 0; $8 = $2; __ashlti3($13 - -64 | 0, $5, $6, $17, $21, $2 + -15 | 0); $5 = HEAP32[$13 + 76 >> 2]; $2 = $5; $7 = HEAP32[$13 + 72 >> 2]; $4 = $7; $4 = $4 << 15; $10 = HEAP32[$13 + 68 >> 2]; $24 = $10 >>> 17 | $4; $4 = $10; $5 = HEAP32[$13 + 64 >> 2]; $19 = ($4 & 131071) << 15 | $5 >>> 17; $25 = ($2 & 131071) << 15 | $7 >>> 17; $20 = ($3 - $8 | 0) + 16 | 0; } $3 = $19; $17 = 0; $8 = __wasm_i64_mul($3, 0, $1, $17); $2 = i64toi32_i32$HIGH_BITS; $26 = $2; $23 = $5 << 15 & -32768; $5 = __wasm_i64_mul($23, 0, $15, 0); $4 = $5 + $8 | 0; $11 = i64toi32_i32$HIGH_BITS + $2 | 0; $11 = $4 >>> 0 < $5 >>> 0 ? $11 + 1 | 0 : $11; $2 = $4; $5 = 0; $6 = __wasm_i64_mul($23, $28, $1, $17); $4 = $5 + $6 | 0; $9 = i64toi32_i32$HIGH_BITS + $2 | 0; $9 = $4 >>> 0 < $6 >>> 0 ? $9 + 1 | 0 : $9; $19 = $4; $6 = $9; $32 = ($2 | 0) == ($9 | 0) & $4 >>> 0 < $5 >>> 0 | $9 >>> 0 < $2 >>> 0; $41 = __wasm_i64_mul($3, $39, $15, $40); $33 = i64toi32_i32$HIGH_BITS; $29 = $16; $5 = __wasm_i64_mul($23, $28, $16, 0); $4 = $5 + $41 | 0; $12 = i64toi32_i32$HIGH_BITS + $33 | 0; $12 = $4 >>> 0 < $5 >>> 0 ? $12 + 1 | 0 : $12; $42 = $4; $7 = __wasm_i64_mul($24, 0, $1, $17); $4 = $4 + $7 | 0; $5 = i64toi32_i32$HIGH_BITS + $12 | 0; $34 = $4; $5 = $4 >>> 0 < $7 >>> 0 ? $5 + 1 | 0 : $5; $21 = $5; $7 = $5; $5 = ($11 | 0) == ($26 | 0) & $2 >>> 0 < $8 >>> 0 | $11 >>> 0 < $26 >>> 0; $4 = $11; $2 = $4 + $34 | 0; $9 = $5 + $7 | 0; $26 = $2; $9 = $2 >>> 0 < $4 >>> 0 ? $9 + 1 | 0 : $9; $4 = $9; $7 = $2; $44 = __wasm_i64_mul($3, $39, $16, $43); $35 = i64toi32_i32$HIGH_BITS; $2 = $23; $30 = $27 | 65536; $23 = $18; $5 = __wasm_i64_mul($2, $28, $30, $18); $2 = $5 + $44 | 0; $9 = i64toi32_i32$HIGH_BITS + $35 | 0; $9 = $2 >>> 0 < $5 >>> 0 ? $9 + 1 | 0 : $9; $45 = $2; $10 = __wasm_i64_mul($15, $40, $24, $46); $2 = $2 + $10 | 0; $18 = $9; $5 = $9 + i64toi32_i32$HIGH_BITS | 0; $5 = $2 >>> 0 < $10 >>> 0 ? $5 + 1 | 0 : $5; $36 = $2; $31 = $25 & 2147483647 | -2147483648; $2 = __wasm_i64_mul($31, 0, $1, $17); $1 = $36 + $2 | 0; $17 = $5; $10 = $5 + i64toi32_i32$HIGH_BITS | 0; $28 = $1; $2 = $1 >>> 0 < $2 >>> 0 ? $10 + 1 | 0 : $10; $9 = $4 + $1 | 0; $5 = 0; $1 = $5 + $7 | 0; if ($1 >>> 0 < $5 >>> 0) { $9 = $9 + 1 | 0 } $27 = $1; $25 = $9; $5 = $9; $7 = $1 + $32 | 0; if ($7 >>> 0 < $1 >>> 0) { $5 = $5 + 1 | 0 } $8 = $5; $16 = ($20 + ($37 + $38 | 0) | 0) + -16383 | 0; $5 = __wasm_i64_mul($29, $43, $24, $46); $1 = i64toi32_i32$HIGH_BITS; $11 = 0; $10 = __wasm_i64_mul($3, $39, $30, $23); $3 = $10 + $5 | 0; $9 = i64toi32_i32$HIGH_BITS + $1 | 0; $9 = $3 >>> 0 < $10 >>> 0 ? $9 + 1 | 0 : $9; $20 = $3; $10 = $3; $3 = $9; $9 = ($1 | 0) == ($3 | 0) & $10 >>> 0 < $5 >>> 0 | $3 >>> 0 < $1 >>> 0; $5 = __wasm_i64_mul($31, $47, $15, $40); $1 = $5 + $10 | 0; $10 = i64toi32_i32$HIGH_BITS + $3 | 0; $10 = $1 >>> 0 < $5 >>> 0 ? $10 + 1 | 0 : $10; $15 = $1; $5 = $1; $1 = $10; $3 = ($3 | 0) == ($1 | 0) & $5 >>> 0 < $20 >>> 0 | $1 >>> 0 < $3 >>> 0; $5 = $9 + $3 | 0; if ($5 >>> 0 < $3 >>> 0) { $11 = 1 } $10 = $5; $3 = $1; $5 = $11; $32 = $10; $9 = 0; $10 = ($12 | 0) == ($21 | 0) & $34 >>> 0 < $42 >>> 0 | $21 >>> 0 < $12 >>> 0; $12 = $10 + (($12 | 0) == ($33 | 0) & $42 >>> 0 < $41 >>> 0 | $12 >>> 0 < $33 >>> 0) | 0; if ($12 >>> 0 < $10 >>> 0) { $9 = 1 } $11 = $12; $12 = $12 + $15 | 0; $10 = $3 + $9 | 0; $20 = $12; $9 = $12; $10 = $9 >>> 0 < $11 >>> 0 ? $10 + 1 | 0 : $10; $3 = $10; $1 = ($1 | 0) == ($3 | 0) & $9 >>> 0 < $15 >>> 0 | $3 >>> 0 < $1 >>> 0; $10 = $32 + $1 | 0; if ($10 >>> 0 < $1 >>> 0) { $5 = $5 + 1 | 0 } $1 = $10; $10 = __wasm_i64_mul($31, $47, $30, $23); $1 = $1 + $10 | 0; $9 = i64toi32_i32$HIGH_BITS + $5 | 0; $9 = $1 >>> 0 < $10 >>> 0 ? $9 + 1 | 0 : $9; $11 = $1; $12 = __wasm_i64_mul($31, $47, $29, $43); $5 = i64toi32_i32$HIGH_BITS; $15 = __wasm_i64_mul($24, $46, $30, $23); $1 = $15 + $12 | 0; $10 = i64toi32_i32$HIGH_BITS + $5 | 0; $10 = $1 >>> 0 < $15 >>> 0 ? $10 + 1 | 0 : $10; $15 = $1; $1 = $10; $10 = ($5 | 0) == ($1 | 0) & $15 >>> 0 < $12 >>> 0 | $1 >>> 0 < $5 >>> 0; $5 = $1 + $11 | 0; $11 = $9 + $10 | 0; $10 = $5 >>> 0 < $1 >>> 0 ? $11 + 1 | 0 : $11; $29 = $5; $9 = $3 + $15 | 0; $11 = 0; $1 = $11 + $20 | 0; if ($1 >>> 0 < $11 >>> 0) { $9 = $9 + 1 | 0 } $12 = $1; $5 = $1; $1 = $9; $3 = ($3 | 0) == ($1 | 0) & $5 >>> 0 < $20 >>> 0 | $1 >>> 0 < $3 >>> 0; $5 = $29 + $3 | 0; if ($5 >>> 0 < $3 >>> 0) { $10 = $10 + 1 | 0 } $15 = $5; $11 = $1; $9 = 0; $5 = ($18 | 0) == ($17 | 0) & $36 >>> 0 < $45 >>> 0 | $17 >>> 0 < $18 >>> 0; $18 = $5 + (($18 | 0) == ($35 | 0) & $45 >>> 0 < $44 >>> 0 | $18 >>> 0 < $35 >>> 0) | 0; if ($18 >>> 0 < $5 >>> 0) { $9 = 1 } $5 = $18 + (($2 | 0) == ($17 | 0) & $28 >>> 0 < $36 >>> 0 | $2 >>> 0 < $17 >>> 0) | 0; $3 = $2; $2 = $3 + $12 | 0; $11 = $5 + $11 | 0; $11 = $2 >>> 0 < $3 >>> 0 ? $11 + 1 | 0 : $11; $18 = $2; $3 = $2; $2 = $11; $1 = ($1 | 0) == ($2 | 0) & $3 >>> 0 < $12 >>> 0 | $2 >>> 0 < $1 >>> 0; $3 = $1 + $15 | 0; if ($3 >>> 0 < $1 >>> 0) { $10 = $10 + 1 | 0 } $1 = $2; $9 = $10; $10 = $3; $5 = 0; $3 = ($4 | 0) == ($25 | 0) & $27 >>> 0 < $26 >>> 0 | $25 >>> 0 < $4 >>> 0; $4 = $3 + (($4 | 0) == ($21 | 0) & $26 >>> 0 < $34 >>> 0 | $4 >>> 0 < $21 >>> 0) | 0; if ($4 >>> 0 < $3 >>> 0) { $5 = 1 } $3 = $4 + $18 | 0; $11 = $1 + $5 | 0; $11 = $3 >>> 0 < $4 >>> 0 ? $11 + 1 | 0 : $11; $1 = $3; $4 = $11; $1 = ($2 | 0) == ($4 | 0) & $1 >>> 0 < $18 >>> 0 | $4 >>> 0 < $2 >>> 0; $2 = $10 + $1 | 0; if ($2 >>> 0 < $1 >>> 0) { $9 = $9 + 1 | 0 } $1 = $2; $2 = $9; label$13 : { if ($2 & 65536) { $16 = $16 + 1 | 0; break label$13; } $12 = $6 >>> 31 | 0; $9 = $2 << 1 | $1 >>> 31; $1 = $1 << 1 | $4 >>> 31; $2 = $9; $9 = $4 << 1 | $3 >>> 31; $3 = $3 << 1 | $8 >>> 31; $4 = $9; $10 = $19; $9 = $6 << 1 | $10 >>> 31; $19 = $10 << 1; $6 = $9; $10 = $8 << 1 | $7 >>> 31; $7 = $7 << 1 | $12; $8 = $10; } if (($16 | 0) >= 32767) { $14 = $14 | 2147418112; $1 = 0; $2 = 0; break label$1; } label$16 : { if (($16 | 0) <= 0) { $5 = 1 - $16 | 0; if ($5 >>> 0 <= 127) { $10 = $16 + 127 | 0; __ashlti3($13 + 48 | 0, $19, $6, $7, $8, $10); __ashlti3($13 + 32 | 0, $3, $4, $1, $2, $10); __lshrti3($13 + 16 | 0, $19, $6, $7, $8, $5); __lshrti3($13, $3, $4, $1, $2, $5); $19 = (HEAP32[$13 + 48 >> 2] | HEAP32[$13 + 56 >> 2]) != 0 | (HEAP32[$13 + 52 >> 2] | HEAP32[$13 + 60 >> 2]) != 0 | (HEAP32[$13 + 32 >> 2] | HEAP32[$13 + 16 >> 2]); $6 = HEAP32[$13 + 36 >> 2] | HEAP32[$13 + 20 >> 2]; $7 = HEAP32[$13 + 40 >> 2] | HEAP32[$13 + 24 >> 2]; $8 = HEAP32[$13 + 44 >> 2] | HEAP32[$13 + 28 >> 2]; $3 = HEAP32[$13 >> 2]; $4 = HEAP32[$13 + 4 >> 2]; $2 = HEAP32[$13 + 12 >> 2]; $1 = HEAP32[$13 + 8 >> 2]; break label$16; } $1 = 0; $2 = 0; break label$1; } $2 = $2 & 65535 | $16 << 16; } $22 = $1 | $22; $14 = $2 | $14; if (!(!$7 & ($8 | 0) == -2147483648 ? !($6 | $19) : ($8 | 0) > -1 ? 1 : 0)) { $11 = $14; $12 = $4; $1 = $3 + 1 | 0; if ($1 >>> 0 < 1) { $12 = $12 + 1 | 0 } $2 = $12; $3 = ($4 | 0) == ($2 | 0) & $1 >>> 0 < $3 >>> 0 | $2 >>> 0 < $4 >>> 0; $4 = $3 + $22 | 0; if ($4 >>> 0 < $3 >>> 0) { $11 = $11 + 1 | 0 } $22 = $4; $14 = $11; break label$1; } if ($7 | $19 | ($8 ^ -2147483648 | $6)) { $1 = $3; $2 = $4; break label$1; } $12 = $14; $9 = $4; $1 = $3 & 1; $2 = $1 + $3 | 0; if ($2 >>> 0 < $1 >>> 0) { $9 = $9 + 1 | 0 } $1 = $2; $2 = $9; $3 = ($4 | 0) == ($2 | 0) & $1 >>> 0 < $3 >>> 0 | $2 >>> 0 < $4 >>> 0; $4 = $3 + $22 | 0; if ($4 >>> 0 < $3 >>> 0) { $12 = $12 + 1 | 0 } $22 = $4; $14 = $12; } HEAP32[$0 >> 2] = $1; HEAP32[$0 + 4 >> 2] = $2; HEAP32[$0 + 8 >> 2] = $22; HEAP32[$0 + 12 >> 2] = $14; global$0 = $13 + 96 | 0; } function __addtf3($0, $1, $2, $3, $4, $5, $6, $7, $8) { var $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0; $11 = global$0 - 112 | 0; global$0 = $11; $12 = $7; $14 = $8 & 2147483647; $10 = $2 + -1 | 0; $9 = $1 + -1 | 0; if (($9 | 0) != -1) { $10 = $10 + 1 | 0 } $13 = $9; $17 = ($9 | 0) == -1 & ($10 | 0) == -1; $15 = $4 & 2147483647; $9 = $15; $16 = $3; $10 = ($2 | 0) == ($10 | 0) & $13 >>> 0 < $1 >>> 0 | $10 >>> 0 < $2 >>> 0; $13 = $3 + $10 | 0; if ($13 >>> 0 < $10 >>> 0) { $9 = $9 + 1 | 0 } $13 = $13 + -1 | 0; $10 = $9 + -1 | 0; $9 = $13; label$1 : { label$2 : { $10 = ($9 | 0) != -1 ? $10 + 1 | 0 : $10; if (!(($9 | 0) == -1 & ($10 | 0) == 2147418111 ? $17 : $10 >>> 0 > 2147418111)) { $10 = $6 + -1 | 0; $9 = $5 + -1 | 0; if (($9 | 0) != -1) { $10 = $10 + 1 | 0 } $13 = $9; $17 = ($9 | 0) != -1 | ($10 | 0) != -1; $9 = $14; $10 = ($6 | 0) == ($10 | 0) & $13 >>> 0 < $5 >>> 0 | $10 >>> 0 < $6 >>> 0; $13 = $10 + $12 | 0; if ($13 >>> 0 < $10 >>> 0) { $9 = $9 + 1 | 0 } $10 = $13 + -1 | 0; $9 = $9 + -1 | 0; $9 = ($10 | 0) != -1 ? $9 + 1 | 0 : $9; if (($10 | 0) == -1 & ($9 | 0) == 2147418111 ? $17 : ($9 | 0) == 2147418111 & ($10 | 0) != -1 | $9 >>> 0 < 2147418111) { break label$2 } } if (!(!$16 & ($15 | 0) == 2147418112 ? !($1 | $2) : ($15 | 0) == 2147418112 & $16 >>> 0 < 0 | $15 >>> 0 < 2147418112)) { $7 = $3; $8 = $4 | 32768; $5 = $1; $6 = $2; break label$1; } if (!(!$12 & ($14 | 0) == 2147418112 ? !($5 | $6) : ($14 | 0) == 2147418112 & $12 >>> 0 < 0 | $14 >>> 0 < 2147418112)) { $8 = $8 | 32768; break label$1; } if (!($1 | $16 | ($15 ^ 2147418112 | $2))) { $9 = $3; $3 = !($1 ^ $5 | $3 ^ $7 | ($2 ^ $6 | $4 ^ $8 ^ -2147483648)); $7 = $3 ? 0 : $9; $8 = $3 ? 2147450880 : $4; $5 = $3 ? 0 : $1; $6 = $3 ? 0 : $2; break label$1; } if (!($5 | $12 | ($14 ^ 2147418112 | $6))) { break label$1 } if (!($1 | $16 | ($2 | $15))) { if ($5 | $12 | ($6 | $14)) { break label$1 } $5 = $1 & $5; $6 = $2 & $6; $7 = $3 & $7; $8 = $4 & $8; break label$1; } if ($5 | $12 | ($6 | $14)) { break label$2 } $5 = $1; $6 = $2; $7 = $3; $8 = $4; break label$1; } $10 = ($12 | 0) == ($16 | 0) & ($14 | 0) == ($15 | 0) ? ($2 | 0) == ($6 | 0) & $5 >>> 0 > $1 >>> 0 | $6 >>> 0 > $2 >>> 0 : ($14 | 0) == ($15 | 0) & $12 >>> 0 > $16 >>> 0 | $14 >>> 0 > $15 >>> 0; $9 = $10; $15 = $9 ? $5 : $1; $14 = $9 ? $6 : $2; $12 = $9 ? $8 : $4; $16 = $12; $13 = $9 ? $7 : $3; $9 = $12 & 65535; $4 = $10 ? $4 : $8; $18 = $4; $3 = $10 ? $3 : $7; $17 = $4 >>> 16 & 32767; $12 = $12 >>> 16 & 32767; if (!$12) { $4 = !($9 | $13); $7 = $4 << 6; $8 = Math_clz32($4 ? $15 : $13) + 32 | 0; $4 = Math_clz32($4 ? $14 : $9); $4 = $7 + (($4 | 0) == 32 ? $8 : $4) | 0; __ashlti3($11 + 96 | 0, $15, $14, $13, $9, $4 + -15 | 0); $13 = HEAP32[$11 + 104 >> 2]; $15 = HEAP32[$11 + 96 >> 2]; $14 = HEAP32[$11 + 100 >> 2]; $12 = 16 - $4 | 0; $9 = HEAP32[$11 + 108 >> 2]; } $5 = $10 ? $1 : $5; $6 = $10 ? $2 : $6; $1 = $3; $2 = $18 & 65535; if ($17) { $1 = $2 } else { $7 = $1; $3 = !($1 | $2); $4 = $3 << 6; $8 = Math_clz32($3 ? $5 : $1) + 32 | 0; $1 = Math_clz32($3 ? $6 : $2); $1 = $4 + (($1 | 0) == 32 ? $8 : $1) | 0; __ashlti3($11 + 80 | 0, $5, $6, $7, $2, $1 + -15 | 0); $17 = 16 - $1 | 0; $5 = HEAP32[$11 + 80 >> 2]; $6 = HEAP32[$11 + 84 >> 2]; $3 = HEAP32[$11 + 88 >> 2]; $1 = HEAP32[$11 + 92 >> 2]; } $2 = $3; $10 = $1 << 3 | $2 >>> 29; $7 = $2 << 3 | $6 >>> 29; $8 = $10 | 524288; $1 = $13; $3 = $9 << 3 | $1 >>> 29; $4 = $1 << 3 | $14 >>> 29; $13 = $3; $10 = $16 ^ $18; $1 = $5; $9 = $6 << 3 | $1 >>> 29; $1 = $1 << 3; $2 = $9; $5 = $12 - $17 | 0; $3 = $1; label$11 : { if (!$5) { break label$11 } if ($5 >>> 0 > 127) { $7 = 0; $8 = 0; $9 = 0; $3 = 1; break label$11; } __ashlti3($11 - -64 | 0, $1, $2, $7, $8, 128 - $5 | 0); __lshrti3($11 + 48 | 0, $1, $2, $7, $8, $5); $7 = HEAP32[$11 + 56 >> 2]; $8 = HEAP32[$11 + 60 >> 2]; $9 = HEAP32[$11 + 52 >> 2]; $3 = HEAP32[$11 + 48 >> 2] | ((HEAP32[$11 + 64 >> 2] | HEAP32[$11 + 72 >> 2]) != 0 | (HEAP32[$11 + 68 >> 2] | HEAP32[$11 + 76 >> 2]) != 0); } $6 = $9; $13 = $13 | 524288; $1 = $15; $9 = $14 << 3 | $1 >>> 29; $2 = $1 << 3; label$13 : { if (($10 | 0) < -1 ? 1 : ($10 | 0) <= -1 ? 1 : 0) { $14 = $3; $1 = $2 - $3 | 0; $15 = $4 - $7 | 0; $3 = ($6 | 0) == ($9 | 0) & $2 >>> 0 < $3 >>> 0 | $9 >>> 0 < $6 >>> 0; $5 = $15 - $3 | 0; $2 = $9 - (($2 >>> 0 < $14 >>> 0) + $6 | 0) | 0; $6 = ($13 - (($4 >>> 0 < $7 >>> 0) + $8 | 0) | 0) - ($15 >>> 0 < $3 >>> 0) | 0; if (!($1 | $5 | ($2 | $6))) { $5 = 0; $6 = 0; $7 = 0; $8 = 0; break label$1; } if ($6 >>> 0 > 524287) { break label$13 } $7 = $1; $3 = !($5 | $6); $4 = $3 << 6; $8 = Math_clz32($3 ? $1 : $5) + 32 | 0; $1 = Math_clz32($3 ? $2 : $6); $1 = $4 + (($1 | 0) == 32 ? $8 : $1) | 0; $1 = $1 + -12 | 0; __ashlti3($11 + 32 | 0, $7, $2, $5, $6, $1); $12 = $12 - $1 | 0; $5 = HEAP32[$11 + 40 >> 2]; $6 = HEAP32[$11 + 44 >> 2]; $1 = HEAP32[$11 + 32 >> 2]; $2 = HEAP32[$11 + 36 >> 2]; break label$13; } $10 = $6 + $9 | 0; $1 = $3; $2 = $1 + $2 | 0; if ($2 >>> 0 < $1 >>> 0) { $10 = $10 + 1 | 0 } $1 = $2; $2 = $10; $6 = ($6 | 0) == ($2 | 0) & $1 >>> 0 < $3 >>> 0 | $2 >>> 0 < $6 >>> 0; $10 = $8 + $13 | 0; $3 = $4 + $7 | 0; if ($3 >>> 0 < $4 >>> 0) { $10 = $10 + 1 | 0 } $5 = $3; $4 = $6 + $3 | 0; $3 = $10; $3 = $4 >>> 0 < $5 >>> 0 ? $3 + 1 | 0 : $3; $5 = $4; $6 = $3; if (!($3 & 1048576)) { break label$13 } $1 = $1 & 1 | (($2 & 1) << 31 | $1 >>> 1); $2 = $5 << 31 | $2 >>> 1; $12 = $12 + 1 | 0; $5 = ($6 & 1) << 31 | $5 >>> 1; $6 = $6 >>> 1 | 0; } $7 = 0; $9 = $16 & -2147483648; if (($12 | 0) >= 32767) { $8 = $9 | 2147418112; $5 = 0; $6 = 0; break label$1; } $4 = 0; label$17 : { if (($12 | 0) > 0) { $4 = $12; break label$17; } __ashlti3($11 + 16 | 0, $1, $2, $5, $6, $12 + 127 | 0); __lshrti3($11, $1, $2, $5, $6, 1 - $12 | 0); $1 = HEAP32[$11 >> 2] | ((HEAP32[$11 + 16 >> 2] | HEAP32[$11 + 24 >> 2]) != 0 | (HEAP32[$11 + 20 >> 2] | HEAP32[$11 + 28 >> 2]) != 0); $2 = HEAP32[$11 + 4 >> 2]; $5 = HEAP32[$11 + 8 >> 2]; $6 = HEAP32[$11 + 12 >> 2]; } $7 = $7 | (($6 & 7) << 29 | $5 >>> 3); $4 = $9 | $6 >>> 3 & 65535 | $4 << 16; $9 = $5 << 29; $3 = 0; $5 = $9; $6 = ($2 & 7) << 29 | $1 >>> 3 | $3; $9 = $4; $3 = $2 >>> 3 | $5; $10 = $3; $4 = $1 & 7; $1 = $4 >>> 0 > 4; $2 = $1 + $6 | 0; if ($2 >>> 0 < $1 >>> 0) { $10 = $10 + 1 | 0 } $1 = $2; $2 = $10; $3 = ($3 | 0) == ($2 | 0) & $1 >>> 0 < $6 >>> 0 | $2 >>> 0 < $3 >>> 0; $5 = $3 + $7 | 0; if ($5 >>> 0 < $3 >>> 0) { $9 = $9 + 1 | 0 } $4 = ($4 | 0) == 4; $3 = $4 ? $1 & 1 : 0; $8 = $9; $7 = $5; $4 = 0; $9 = $2 + $4 | 0; $2 = $1 + $3 | 0; if ($2 >>> 0 < $1 >>> 0) { $9 = $9 + 1 | 0 } $5 = $2; $1 = $2; $6 = $9; $1 = ($4 | 0) == ($9 | 0) & $1 >>> 0 < $3 >>> 0 | $9 >>> 0 < $4 >>> 0; $2 = $7 + $1 | 0; if ($2 >>> 0 < $1 >>> 0) { $8 = $8 + 1 | 0 } $7 = $2; } HEAP32[$0 >> 2] = $5; HEAP32[$0 + 4 >> 2] = $6; HEAP32[$0 + 8 >> 2] = $7; HEAP32[$0 + 12 >> 2] = $8; global$0 = $11 + 112 | 0; } function __extenddftf2($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0; $5 = global$0 - 16 | 0; global$0 = $5; wasm2js_scratch_store_f64(+$1); $8 = wasm2js_scratch_load_i32(1) | 0; $6 = wasm2js_scratch_load_i32(0) | 0; $7 = $8 & 2147483647; $2 = $7; $4 = $2 + -1048576 | 0; $3 = $6; if ($3 >>> 0 < 0) { $4 = $4 + 1 | 0 } label$1 : { if (($4 | 0) == 2145386495 | $4 >>> 0 < 2145386495) { $7 = $3 << 28; $4 = ($2 & 15) << 28 | $3 >>> 4; $2 = ($2 >>> 4 | 0) + 1006632960 | 0; $3 = $4; $2 = $3 >>> 0 < 0 ? $2 + 1 | 0 : $2; break label$1; } if (($2 | 0) == 2146435072 & $3 >>> 0 >= 0 | $2 >>> 0 > 2146435072) { $7 = $6 << 28; $4 = $6; $2 = $8; $6 = $2 >>> 4 | 0; $3 = ($2 & 15) << 28 | $4 >>> 4; $2 = $6 | 2147418112; break label$1; } if (!($2 | $3)) { $7 = 0; $3 = 0; $2 = 0; break label$1; } $4 = $2; $2 = ($2 | 0) == 1 & $3 >>> 0 < 0 | $2 >>> 0 < 1 ? Math_clz32($6) + 32 | 0 : Math_clz32($2); __ashlti3($5, $3, $4, 0, 0, $2 + 49 | 0); $9 = HEAP32[$5 >> 2]; $7 = HEAP32[$5 + 4 >> 2]; $3 = HEAP32[$5 + 8 >> 2]; $2 = HEAP32[$5 + 12 >> 2] ^ 65536 | 15372 - $2 << 16; } HEAP32[$0 >> 2] = $9; HEAP32[$0 + 4 >> 2] = $7; HEAP32[$0 + 8 >> 2] = $3; HEAP32[$0 + 12 >> 2] = $8 & -2147483648 | $2; global$0 = $5 + 16 | 0; } function __letf2($0, $1, $2, $3, $4, $5, $6, $7) { var $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0; $9 = 1; $8 = $3 & 2147483647; $12 = $8; $10 = $2; label$1 : { if (!$2 & ($8 | 0) == 2147418112 ? $0 | $1 : ($8 | 0) == 2147418112 & $2 >>> 0 > 0 | $8 >>> 0 > 2147418112) { break label$1 } $11 = $7 & 2147483647; $13 = $11; $8 = $6; if (!$6 & ($11 | 0) == 2147418112 ? $4 | $5 : ($11 | 0) == 2147418112 & $6 >>> 0 > 0 | $11 >>> 0 > 2147418112) { break label$1 } if (!($0 | $4 | ($8 | $10) | ($1 | $5 | ($12 | $13)))) { return 0 } $10 = $3 & $7; if (($10 | 0) > 0 ? 1 : ($10 | 0) >= 0 ? (($2 & $6) >>> 0 < 0 ? 0 : 1) : 0) { $9 = -1; if (($2 | 0) == ($6 | 0) & ($3 | 0) == ($7 | 0) ? ($1 | 0) == ($5 | 0) & $0 >>> 0 < $4 >>> 0 | $1 >>> 0 < $5 >>> 0 : ($3 | 0) < ($7 | 0) ? 1 : ($3 | 0) <= ($7 | 0) ? ($2 >>> 0 >= $6 >>> 0 ? 0 : 1) : 0) { break label$1 } return ($0 ^ $4 | $2 ^ $6) != 0 | ($1 ^ $5 | $3 ^ $7) != 0; } $9 = -1; if (($2 | 0) == ($6 | 0) & ($3 | 0) == ($7 | 0) ? ($1 | 0) == ($5 | 0) & $0 >>> 0 > $4 >>> 0 | $1 >>> 0 > $5 >>> 0 : ($3 | 0) > ($7 | 0) ? 1 : ($3 | 0) >= ($7 | 0) ? ($2 >>> 0 <= $6 >>> 0 ? 0 : 1) : 0) { break label$1 } $9 = ($0 ^ $4 | $2 ^ $6) != 0 | ($1 ^ $5 | $3 ^ $7) != 0; } return $9; } function __getf2($0, $1, $2, $3, $4) { var $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0; $7 = -1; $5 = $3 & 2147483647; $8 = $5; $6 = $2; label$1 : { if (!$2 & ($5 | 0) == 2147418112 ? $0 | $1 : ($5 | 0) == 2147418112 & $2 >>> 0 > 0 | $5 >>> 0 > 2147418112) { break label$1 } $5 = $4 & 2147483647; $9 = $5; if (($5 | 0) == 2147418112 ? 0 : $5 >>> 0 > 2147418112) { break label$1 } if (!($0 | $6 | ($1 | ($8 | $9)))) { return 0 } $6 = $3 & $4; if (($6 | 0) > 0 ? 1 : ($6 | 0) >= 0 ? 1 : 0) { if (!$2 & ($3 | 0) == ($4 | 0) ? !$1 & $0 >>> 0 < 0 | $1 >>> 0 < 0 : ($3 | 0) < ($4 | 0) ? 1 : ($3 | 0) <= ($4 | 0) ? ($2 >>> 0 >= 0 ? 0 : 1) : 0) { break label$1 } return ($0 | $2) != 0 | ($1 | $3 ^ $4) != 0; } if (!$2 & ($3 | 0) == ($4 | 0) ? !$1 & $0 >>> 0 > 0 | $1 >>> 0 > 0 : ($3 | 0) > ($4 | 0) ? 1 : ($3 | 0) >= ($4 | 0) ? ($2 >>> 0 <= 0 ? 0 : 1) : 0) { break label$1 } $7 = ($0 | $2) != 0 | ($1 | $3 ^ $4) != 0; } return $7; } function copysignl($0, $1, $2, $3, $4, $5, $6, $7, $8) { HEAP32[$0 >> 2] = $1; HEAP32[$0 + 4 >> 2] = $2; HEAP32[$0 + 8 >> 2] = $3; HEAP32[$0 + 12 >> 2] = $4 & 65535 | ($8 >>> 16 & 32768 | $4 >>> 16 & 32767) << 16; } function __floatunsitf($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0; $2 = global$0 - 16 | 0; global$0 = $2; $6 = $0; $7 = $0; label$1 : { if (!$1) { $1 = 0; $3 = 0; break label$1; } $3 = $1; $1 = Math_clz32($1) ^ 31; __ashlti3($2, $3, 0, 0, 0, 112 - $1 | 0); $1 = (HEAP32[$2 + 12 >> 2] ^ 65536) + ($1 + 16383 << 16) | 0; $4 = 0 + HEAP32[$2 + 8 >> 2] | 0; if ($4 >>> 0 < $5 >>> 0) { $1 = $1 + 1 | 0 } $5 = HEAP32[$2 + 4 >> 2]; $3 = HEAP32[$2 >> 2]; } HEAP32[$7 >> 2] = $3; HEAP32[$6 + 4 >> 2] = $5; HEAP32[$0 + 8 >> 2] = $4; HEAP32[$0 + 12 >> 2] = $1; global$0 = $2 + 16 | 0; } function __subtf3($0, $1, $2, $3, $4, $5, $6, $7, $8) { var $9 = 0; $9 = global$0 - 16 | 0; global$0 = $9; __addtf3($9, $1, $2, $3, $4, $5, $6, $7, $8 ^ -2147483648); $1 = HEAP32[$9 + 4 >> 2]; HEAP32[$0 >> 2] = HEAP32[$9 >> 2]; HEAP32[$0 + 4 >> 2] = $1; $1 = HEAP32[$9 + 12 >> 2]; HEAP32[$0 + 8 >> 2] = HEAP32[$9 + 8 >> 2]; HEAP32[$0 + 12 >> 2] = $1; global$0 = $9 + 16 | 0; } function scalbnl($0, $1, $2, $3, $4, $5) { var $6 = 0; $6 = global$0 - 80 | 0; global$0 = $6; label$1 : { if (($5 | 0) >= 16384) { __multf3($6 + 32 | 0, $1, $2, $3, $4, 0, 0, 0, 2147352576); $3 = HEAP32[$6 + 40 >> 2]; $4 = HEAP32[$6 + 44 >> 2]; $1 = HEAP32[$6 + 32 >> 2]; $2 = HEAP32[$6 + 36 >> 2]; if (($5 | 0) < 32767) { $5 = $5 + -16383 | 0; break label$1; } __multf3($6 + 16 | 0, $1, $2, $3, $4, 0, 0, 0, 2147352576); $5 = (($5 | 0) < 49149 ? $5 : 49149) + -32766 | 0; $3 = HEAP32[$6 + 24 >> 2]; $4 = HEAP32[$6 + 28 >> 2]; $1 = HEAP32[$6 + 16 >> 2]; $2 = HEAP32[$6 + 20 >> 2]; break label$1; } if (($5 | 0) > -16383) { break label$1 } __multf3($6 - -64 | 0, $1, $2, $3, $4, 0, 0, 0, 65536); $3 = HEAP32[$6 + 72 >> 2]; $4 = HEAP32[$6 + 76 >> 2]; $1 = HEAP32[$6 + 64 >> 2]; $2 = HEAP32[$6 + 68 >> 2]; if (($5 | 0) > -32765) { $5 = $5 + 16382 | 0; break label$1; } __multf3($6 + 48 | 0, $1, $2, $3, $4, 0, 0, 0, 65536); $5 = (($5 | 0) > -49146 ? $5 : -49146) + 32764 | 0; $3 = HEAP32[$6 + 56 >> 2]; $4 = HEAP32[$6 + 60 >> 2]; $1 = HEAP32[$6 + 48 >> 2]; $2 = HEAP32[$6 + 52 >> 2]; } __multf3($6, $1, $2, $3, $4, 0, 0, 0, $5 + 16383 << 16); $1 = HEAP32[$6 + 12 >> 2]; HEAP32[$0 + 8 >> 2] = HEAP32[$6 + 8 >> 2]; HEAP32[$0 + 12 >> 2] = $1; $1 = HEAP32[$6 + 4 >> 2]; HEAP32[$0 >> 2] = HEAP32[$6 >> 2]; HEAP32[$0 + 4 >> 2] = $1; global$0 = $6 + 80 | 0; } function __multi3($0, $1, $2, $3, $4) { var $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0; $5 = __wasm_i64_mul($1, $2, 0, 0); $6 = i64toi32_i32$HIGH_BITS; $7 = __wasm_i64_mul(0, 0, $3, $4); $5 = $5 + $7 | 0; $6 = i64toi32_i32$HIGH_BITS + $6 | 0; $9 = __wasm_i64_mul($4, 0, $2, 0); $8 = $5 + $9 | 0; $5 = i64toi32_i32$HIGH_BITS + ($5 >>> 0 < $7 >>> 0 ? $6 + 1 | 0 : $6) | 0; $6 = __wasm_i64_mul($3, 0, $1, 0); $10 = i64toi32_i32$HIGH_BITS; $7 = __wasm_i64_mul($2, 0, $3, 0); $3 = $10 + $7 | 0; $2 = $8 >>> 0 < $9 >>> 0 ? $5 + 1 | 0 : $5; $5 = i64toi32_i32$HIGH_BITS; $5 = $3 >>> 0 < $7 >>> 0 ? $5 + 1 | 0 : $5; $8 = $5 + $8 | 0; if ($8 >>> 0 < $5 >>> 0) { $2 = $2 + 1 | 0 } $1 = __wasm_i64_mul($1, 0, $4, 0) + $3 | 0; $4 = i64toi32_i32$HIGH_BITS; $3 = $1 >>> 0 < $3 >>> 0 ? $4 + 1 | 0 : $4; $4 = $8 + $3 | 0; if ($4 >>> 0 < $3 >>> 0) { $2 = $2 + 1 | 0 } HEAP32[$0 + 8 >> 2] = $4; HEAP32[$0 + 12 >> 2] = $2; HEAP32[$0 >> 2] = $6; HEAP32[$0 + 4 >> 2] = $1; } function __divtf3($0, $1, $2, $3, $4, $5, $6, $7, $8) { var $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0, $22 = 0, $23 = 0, $24 = 0, $25 = 0, $26 = 0, $27 = 0, $28 = 0, $29 = 0, $30 = 0, $31 = 0, $32 = 0, $33 = 0, $34 = 0, $35 = 0, $36 = 0, $37 = 0, $38 = 0, $39 = 0, $40 = 0, $41 = 0; $13 = global$0 - 192 | 0; global$0 = $13; $29 = $7; $32 = $8 & 65535; $16 = $3; $14 = $4 & 65535; $28 = ($4 ^ $8) & -2147483648; $17 = $8 >>> 16 & 32767; label$1 : { $19 = $4 >>> 16 & 32767; label$2 : { label$3 : { if ($19 + -1 >>> 0 <= 32765) { if ($17 + -1 >>> 0 < 32766) { break label$3 } } $10 = $4 & 2147483647; $11 = $10; $9 = $3; if (!(!$9 & ($10 | 0) == 2147418112 ? !($1 | $2) : ($10 | 0) == 2147418112 & $9 >>> 0 < 0 | $10 >>> 0 < 2147418112)) { $33 = $3; $28 = $4 | 32768; break label$2; } $10 = $8 & 2147483647; $4 = $10; $3 = $7; if (!(!$3 & ($10 | 0) == 2147418112 ? !($5 | $6) : ($10 | 0) == 2147418112 & $3 >>> 0 < 0 | $10 >>> 0 < 2147418112)) { $33 = $7; $28 = $8 | 32768; $1 = $5; $2 = $6; break label$2; } if (!($1 | $9 | ($11 ^ 2147418112 | $2))) { if (!($3 | $5 | ($4 ^ 2147418112 | $6))) { $1 = 0; $2 = 0; $28 = 2147450880; break label$2; } $28 = $28 | 2147418112; $1 = 0; $2 = 0; break label$2; } if (!($3 | $5 | ($4 ^ 2147418112 | $6))) { $1 = 0; $2 = 0; break label$2; } if (!($1 | $9 | ($2 | $11))) { break label$1 } if (!($3 | $5 | ($4 | $6))) { $28 = $28 | 2147418112; $1 = 0; $2 = 0; break label$2; } $10 = 0; if (($11 | 0) == 65535 | $11 >>> 0 < 65535) { $8 = $1; $3 = !($14 | $16); $7 = $3 << 6; $9 = Math_clz32($3 ? $1 : $16) + 32 | 0; $1 = Math_clz32($3 ? $2 : $14); $1 = $7 + (($1 | 0) == 32 ? $9 : $1) | 0; __ashlti3($13 + 176 | 0, $8, $2, $16, $14, $1 + -15 | 0); $10 = 16 - $1 | 0; $16 = HEAP32[$13 + 184 >> 2]; $14 = HEAP32[$13 + 188 >> 2]; $2 = HEAP32[$13 + 180 >> 2]; $1 = HEAP32[$13 + 176 >> 2]; } if ($4 >>> 0 > 65535) { break label$3 } $3 = !($29 | $32); $4 = $3 << 6; $7 = Math_clz32($3 ? $5 : $29) + 32 | 0; $3 = Math_clz32($3 ? $6 : $32); $3 = $4 + (($3 | 0) == 32 ? $7 : $3) | 0; __ashlti3($13 + 160 | 0, $5, $6, $29, $32, $3 + -15 | 0); $10 = ($3 + $10 | 0) + -16 | 0; $29 = HEAP32[$13 + 168 >> 2]; $32 = HEAP32[$13 + 172 >> 2]; $5 = HEAP32[$13 + 160 >> 2]; $6 = HEAP32[$13 + 164 >> 2]; } $4 = $32 | 65536; $31 = $4; $38 = $29; $3 = $29; $12 = $4 << 15 | $3 >>> 17; $3 = $3 << 15 | $6 >>> 17; $7 = -102865788 - $3 | 0; $4 = $12; $9 = $4; $8 = 1963258675 - ($9 + (4192101508 < $3 >>> 0) | 0) | 0; __multi3($13 + 144 | 0, $3, $9, $7, $8); $9 = HEAP32[$13 + 152 >> 2]; __multi3($13 + 128 | 0, 0 - $9 | 0, 0 - (HEAP32[$13 + 156 >> 2] + (0 < $9 >>> 0) | 0) | 0, $7, $8); $7 = HEAP32[$13 + 136 >> 2]; $8 = $7 << 1 | HEAP32[$13 + 132 >> 2] >>> 31; $7 = HEAP32[$13 + 140 >> 2] << 1 | $7 >>> 31; __multi3($13 + 112 | 0, $8, $7, $3, $4); $9 = $7; $7 = HEAP32[$13 + 120 >> 2]; __multi3($13 + 96 | 0, $8, $9, 0 - $7 | 0, 0 - (HEAP32[$13 + 124 >> 2] + (0 < $7 >>> 0) | 0) | 0); $7 = HEAP32[$13 + 104 >> 2]; $11 = HEAP32[$13 + 108 >> 2] << 1 | $7 >>> 31; $8 = $7 << 1 | HEAP32[$13 + 100 >> 2] >>> 31; __multi3($13 + 80 | 0, $8, $11, $3, $4); $7 = HEAP32[$13 + 88 >> 2]; __multi3($13 - -64 | 0, $8, $11, 0 - $7 | 0, 0 - (HEAP32[$13 + 92 >> 2] + (0 < $7 >>> 0) | 0) | 0); $7 = HEAP32[$13 + 72 >> 2]; $8 = $7 << 1 | HEAP32[$13 + 68 >> 2] >>> 31; $7 = HEAP32[$13 + 76 >> 2] << 1 | $7 >>> 31; __multi3($13 + 48 | 0, $8, $7, $3, $4); $9 = $7; $7 = HEAP32[$13 + 56 >> 2]; __multi3($13 + 32 | 0, $8, $9, 0 - $7 | 0, 0 - (HEAP32[$13 + 60 >> 2] + (0 < $7 >>> 0) | 0) | 0); $7 = HEAP32[$13 + 40 >> 2]; $11 = HEAP32[$13 + 44 >> 2] << 1 | $7 >>> 31; $8 = $7 << 1 | HEAP32[$13 + 36 >> 2] >>> 31; __multi3($13 + 16 | 0, $8, $11, $3, $4); $7 = HEAP32[$13 + 24 >> 2]; __multi3($13, $8, $11, 0 - $7 | 0, 0 - (HEAP32[$13 + 28 >> 2] + (0 < $7 >>> 0) | 0) | 0); $34 = ($19 - $17 | 0) + $10 | 0; $7 = HEAP32[$13 + 8 >> 2]; $9 = HEAP32[$13 + 12 >> 2] << 1 | $7 >>> 31; $8 = $7 << 1; $10 = $9 + -1 | 0; $8 = (HEAP32[$13 + 4 >> 2] >>> 31 | $8) + -1 | 0; if (($8 | 0) != -1) { $10 = $10 + 1 | 0 } $7 = $8; $9 = 0; $21 = $9; $20 = $4; $11 = 0; $12 = __wasm_i64_mul($7, $9, $4, $11); $4 = i64toi32_i32$HIGH_BITS; $19 = $4; $22 = $10; $17 = 0; $9 = $3; $7 = __wasm_i64_mul($10, $17, $9, 0); $3 = $7 + $12 | 0; $10 = i64toi32_i32$HIGH_BITS + $4 | 0; $10 = $3 >>> 0 < $7 >>> 0 ? $10 + 1 | 0 : $10; $7 = $3; $3 = $10; $15 = __wasm_i64_mul($8, $21, $9, $15); $4 = 0 + $15 | 0; $10 = $7; $9 = $10 + i64toi32_i32$HIGH_BITS | 0; $9 = $4 >>> 0 < $15 >>> 0 ? $9 + 1 | 0 : $9; $15 = $4; $4 = $9; $9 = ($10 | 0) == ($9 | 0) & $15 >>> 0 < $23 >>> 0 | $9 >>> 0 < $10 >>> 0; $10 = ($3 | 0) == ($19 | 0) & $10 >>> 0 < $12 >>> 0 | $3 >>> 0 < $19 >>> 0; $7 = $3; $3 = __wasm_i64_mul($22, $17, $20, $11) + $3 | 0; $11 = $10 + i64toi32_i32$HIGH_BITS | 0; $11 = $3 >>> 0 < $7 >>> 0 ? $11 + 1 | 0 : $11; $7 = $3; $3 = $9 + $3 | 0; $9 = $11; $26 = $3; $7 = $3 >>> 0 < $7 >>> 0 ? $9 + 1 | 0 : $9; $3 = $6; $24 = ($3 & 131071) << 15 | $5 >>> 17; $20 = __wasm_i64_mul($8, $21, $24, 0); $3 = i64toi32_i32$HIGH_BITS; $23 = $3; $10 = $5; $18 = $10 << 15 & -32768; $11 = __wasm_i64_mul($22, $17, $18, 0); $9 = $11 + $20 | 0; $10 = i64toi32_i32$HIGH_BITS + $3 | 0; $10 = $9 >>> 0 < $11 >>> 0 ? $10 + 1 | 0 : $10; $3 = $10; $25 = __wasm_i64_mul($8, $21, $18, $25); $18 = 0 + $25 | 0; $10 = $9 + i64toi32_i32$HIGH_BITS | 0; $10 = $18 >>> 0 < $25 >>> 0 ? $10 + 1 | 0 : $10; $10 = ($9 | 0) == ($10 | 0) & $18 >>> 0 < $30 >>> 0 | $10 >>> 0 < $9 >>> 0; $9 = ($3 | 0) == ($23 | 0) & $9 >>> 0 < $20 >>> 0 | $3 >>> 0 < $23 >>> 0; $12 = $3; $3 = __wasm_i64_mul($22, $17, $24, $27) + $3 | 0; $11 = $9 + i64toi32_i32$HIGH_BITS | 0; $11 = $3 >>> 0 < $12 >>> 0 ? $11 + 1 | 0 : $11; $9 = $3; $3 = $10 + $9 | 0; $12 = $3 >>> 0 < $9 >>> 0 ? $11 + 1 | 0 : $11; $10 = $3; $3 = $15 + $3 | 0; $9 = $12 + $4 | 0; $9 = $3 >>> 0 < $10 >>> 0 ? $9 + 1 | 0 : $9; $19 = $3; $10 = $7; $20 = $9; $3 = ($4 | 0) == ($9 | 0) & $3 >>> 0 < $15 >>> 0 | $9 >>> 0 < $4 >>> 0; $4 = $3 + $26 | 0; if ($4 >>> 0 < $3 >>> 0) { $10 = $10 + 1 | 0 } $9 = $10; $3 = ($19 | 0) != 0 | ($20 | 0) != 0; $4 = $4 + $3 | 0; if ($4 >>> 0 < $3 >>> 0) { $9 = $9 + 1 | 0 } $10 = $4; $4 = 0 - $10 | 0; $15 = 0; $7 = __wasm_i64_mul($4, $15, $8, $21); $3 = i64toi32_i32$HIGH_BITS; $23 = $3; $18 = __wasm_i64_mul($22, $17, $4, $15); $4 = i64toi32_i32$HIGH_BITS; $26 = $4; $24 = 0 - ((0 < $10 >>> 0) + $9 | 0) | 0; $9 = 0; $15 = __wasm_i64_mul($8, $21, $24, $9); $12 = $15 + $18 | 0; $10 = i64toi32_i32$HIGH_BITS + $4 | 0; $10 = $12 >>> 0 < $15 >>> 0 ? $10 + 1 | 0 : $10; $4 = $12; $15 = 0 + $7 | 0; $11 = $3 + $4 | 0; $11 = $15 >>> 0 < $27 >>> 0 ? $11 + 1 | 0 : $11; $12 = $15; $3 = $11; $11 = ($23 | 0) == ($3 | 0) & $12 >>> 0 < $7 >>> 0 | $3 >>> 0 < $23 >>> 0; $12 = ($10 | 0) == ($26 | 0) & $4 >>> 0 < $18 >>> 0 | $10 >>> 0 < $26 >>> 0; $4 = __wasm_i64_mul($22, $17, $24, $9) + $10 | 0; $9 = $12 + i64toi32_i32$HIGH_BITS | 0; $9 = $4 >>> 0 < $10 >>> 0 ? $9 + 1 | 0 : $9; $7 = $4; $4 = $11 + $4 | 0; if ($4 >>> 0 < $7 >>> 0) { $9 = $9 + 1 | 0 } $24 = $4; $7 = $9; $4 = 0 - $19 | 0; $27 = 0 - ((0 < $19 >>> 0) + $20 | 0) | 0; $19 = 0; $26 = __wasm_i64_mul($27, $19, $8, $21); $18 = i64toi32_i32$HIGH_BITS; $20 = $4; $25 = 0; $9 = __wasm_i64_mul($4, $25, $22, $17); $4 = $9 + $26 | 0; $10 = i64toi32_i32$HIGH_BITS + $18 | 0; $11 = $4; $4 = $4 >>> 0 < $9 >>> 0 ? $10 + 1 | 0 : $10; $20 = __wasm_i64_mul($8, $21, $20, $25); $8 = 0 + $20 | 0; $9 = $11; $10 = $9 + i64toi32_i32$HIGH_BITS | 0; $10 = $8 >>> 0 < $20 >>> 0 ? $10 + 1 | 0 : $10; $10 = ($9 | 0) == ($10 | 0) & $8 >>> 0 < $30 >>> 0 | $10 >>> 0 < $9 >>> 0; $9 = ($4 | 0) == ($18 | 0) & $9 >>> 0 < $26 >>> 0 | $4 >>> 0 < $18 >>> 0; $8 = $4; $4 = __wasm_i64_mul($27, $19, $22, $17) + $4 | 0; $12 = $9 + i64toi32_i32$HIGH_BITS | 0; $12 = $4 >>> 0 < $8 >>> 0 ? $12 + 1 | 0 : $12; $8 = $4; $4 = $10 + $4 | 0; $9 = $12; $9 = $4 >>> 0 < $8 >>> 0 ? $9 + 1 | 0 : $9; $8 = $4; $4 = $15 + $4 | 0; $9 = $9 + $3 | 0; $9 = $4 >>> 0 < $8 >>> 0 ? $9 + 1 | 0 : $9; $8 = $4; $10 = $7; $4 = $9; $3 = ($3 | 0) == ($9 | 0) & $8 >>> 0 < $15 >>> 0 | $9 >>> 0 < $3 >>> 0; $7 = $3 + $24 | 0; if ($7 >>> 0 < $3 >>> 0) { $10 = $10 + 1 | 0 } $3 = $7; $9 = $10; $12 = $3; $11 = $4 + -1 | 0; $3 = $8 + -2 | 0; if ($3 >>> 0 < 4294967294) { $11 = $11 + 1 | 0 } $7 = $3; $10 = $3; $3 = $11; $4 = ($4 | 0) == ($3 | 0) & $10 >>> 0 < $8 >>> 0 | $3 >>> 0 < $4 >>> 0; $8 = $12 + $4 | 0; if ($8 >>> 0 < $4 >>> 0) { $9 = $9 + 1 | 0 } $4 = $8 + -1 | 0; $10 = $9 + -1 | 0; $10 = ($4 | 0) != -1 ? $10 + 1 | 0 : $10; $8 = 0; $22 = $8; $17 = $4; $9 = $16; $18 = $9 << 2 | $2 >>> 30; $24 = 0; $12 = __wasm_i64_mul($4, $8, $18, $24); $8 = i64toi32_i32$HIGH_BITS; $15 = $8; $11 = $8; $8 = $2; $27 = ($8 & 1073741823) << 2 | $1 >>> 30; $25 = $10; $8 = 0; $9 = __wasm_i64_mul($27, 0, $10, $8); $4 = $9 + $12 | 0; $11 = i64toi32_i32$HIGH_BITS + $11 | 0; $11 = $4 >>> 0 < $9 >>> 0 ? $11 + 1 | 0 : $11; $9 = $4; $20 = $11; $23 = ($15 | 0) == ($11 | 0) & $9 >>> 0 < $12 >>> 0 | $11 >>> 0 < $15 >>> 0; $12 = $11; $11 = 0; $15 = $11; $10 = 0; $26 = $3; $30 = (($14 & 1073741823) << 2 | $16 >>> 30) & -262145 | 262144; $4 = __wasm_i64_mul($3, $11, $30, 0); $3 = $4 + $9 | 0; $12 = i64toi32_i32$HIGH_BITS + $12 | 0; $12 = $3 >>> 0 < $4 >>> 0 ? $12 + 1 | 0 : $12; $16 = $3; $4 = $12; $3 = ($20 | 0) == ($4 | 0) & $3 >>> 0 < $9 >>> 0 | $4 >>> 0 < $20 >>> 0; $9 = $3 + $23 | 0; if ($9 >>> 0 < $3 >>> 0) { $10 = 1 } $11 = __wasm_i64_mul($25, $8, $30, $35); $3 = $11 + $9 | 0; $9 = i64toi32_i32$HIGH_BITS + $10 | 0; $10 = $3 >>> 0 < $11 >>> 0 ? $9 + 1 | 0 : $9; $11 = __wasm_i64_mul($17, $22, $30, $35); $9 = i64toi32_i32$HIGH_BITS; $2 = $3; $14 = __wasm_i64_mul($18, $24, $25, $8); $3 = $14 + $11 | 0; $12 = i64toi32_i32$HIGH_BITS + $9 | 0; $12 = $3 >>> 0 < $14 >>> 0 ? $12 + 1 | 0 : $12; $14 = $3; $3 = $12; $12 = ($9 | 0) == ($3 | 0) & $14 >>> 0 < $11 >>> 0 | $3 >>> 0 < $9 >>> 0; $11 = $2 + $3 | 0; $10 = $10 + $12 | 0; $9 = $11; $12 = $9 >>> 0 < $3 >>> 0 ? $10 + 1 | 0 : $10; $2 = $9; $11 = $4 + $14 | 0; $10 = 0; $3 = $10 + $16 | 0; if ($3 >>> 0 < $10 >>> 0) { $11 = $11 + 1 | 0 } $14 = $3; $9 = $3; $3 = $11; $4 = ($4 | 0) == ($3 | 0) & $9 >>> 0 < $16 >>> 0 | $3 >>> 0 < $4 >>> 0; $9 = $2 + $4 | 0; if ($9 >>> 0 < $4 >>> 0) { $12 = $12 + 1 | 0 } $39 = $9; $4 = $14; $10 = $3; $16 = __wasm_i64_mul($27, $19, $26, $15); $11 = i64toi32_i32$HIGH_BITS; $20 = $7; $23 = __wasm_i64_mul($7, 0, $18, $24); $7 = $23 + $16 | 0; $9 = i64toi32_i32$HIGH_BITS + $11 | 0; $9 = $7 >>> 0 < $23 >>> 0 ? $9 + 1 | 0 : $9; $21 = $7; $7 = $9; $16 = ($11 | 0) == ($9 | 0) & $21 >>> 0 < $16 >>> 0 | $9 >>> 0 < $11 >>> 0; $11 = $9; $40 = $4; $9 = 0; $41 = $16; $36 = $1 << 2 & -4; $2 = 0; $16 = __wasm_i64_mul($17, $22, $36, $2); $4 = $16 + $21 | 0; $11 = i64toi32_i32$HIGH_BITS + $11 | 0; $11 = $4 >>> 0 < $16 >>> 0 ? $11 + 1 | 0 : $11; $23 = $4; $16 = $4; $4 = $11; $7 = ($7 | 0) == ($4 | 0) & $16 >>> 0 < $21 >>> 0 | $4 >>> 0 < $7 >>> 0; $11 = $41 + $7 | 0; if ($11 >>> 0 < $7 >>> 0) { $9 = 1 } $7 = $40 + $11 | 0; $10 = $9 + $10 | 0; $10 = $7 >>> 0 < $11 >>> 0 ? $10 + 1 | 0 : $10; $16 = $7; $11 = $12; $7 = $10; $3 = ($3 | 0) == ($10 | 0) & $16 >>> 0 < $14 >>> 0 | $10 >>> 0 < $3 >>> 0; $9 = $3 + $39 | 0; if ($9 >>> 0 < $3 >>> 0) { $11 = $11 + 1 | 0 } $40 = $9; $14 = $16; $21 = $7; $39 = __wasm_i64_mul($25, $8, $36, $2); $25 = i64toi32_i32$HIGH_BITS; $8 = __wasm_i64_mul($30, $35, $20, $37); $3 = $8 + $39 | 0; $12 = i64toi32_i32$HIGH_BITS + $25 | 0; $12 = $3 >>> 0 < $8 >>> 0 ? $12 + 1 | 0 : $12; $30 = $3; $9 = __wasm_i64_mul($18, $24, $26, $15); $3 = $3 + $9 | 0; $8 = $12; $10 = $8 + i64toi32_i32$HIGH_BITS | 0; $10 = $3 >>> 0 < $9 >>> 0 ? $10 + 1 | 0 : $10; $18 = $3; $12 = __wasm_i64_mul($17, $22, $27, $19); $3 = $3 + $12 | 0; $9 = i64toi32_i32$HIGH_BITS + $10 | 0; $17 = $3; $9 = $3 >>> 0 < $12 >>> 0 ? $9 + 1 | 0 : $9; $22 = 0; $12 = $11; $3 = $9; $9 = ($9 | 0) == ($10 | 0) & $17 >>> 0 < $18 >>> 0 | $9 >>> 0 < $10 >>> 0; $11 = ($8 | 0) == ($25 | 0) & $30 >>> 0 < $39 >>> 0 | $8 >>> 0 < $25 >>> 0; $8 = ($8 | 0) == ($10 | 0) & $18 >>> 0 < $30 >>> 0 | $10 >>> 0 < $8 >>> 0; $10 = $11 + $8 | 0; $10 >>> 0 < $8 >>> 0; $8 = $9 + $10 | 0; $10 = $8; $9 = $3 | 0; $8 = $9 + $14 | 0; $10 = ($10 | $22) + $21 | 0; $10 = $8 >>> 0 < $9 >>> 0 ? $10 + 1 | 0 : $10; $21 = $8; $14 = $10; $7 = ($7 | 0) == ($10 | 0) & $8 >>> 0 < $16 >>> 0 | $10 >>> 0 < $7 >>> 0; $8 = $7 + $40 | 0; if ($8 >>> 0 < $7 >>> 0) { $12 = $12 + 1 | 0 } $24 = $8; $8 = $12; $12 = $21; $16 = $14; $22 = $23; $26 = __wasm_i64_mul($26, $15, $36, $2); $15 = i64toi32_i32$HIGH_BITS; $9 = __wasm_i64_mul($27, $19, $20, $37); $7 = $9 + $26 | 0; $11 = i64toi32_i32$HIGH_BITS + $15 | 0; $11 = $7 >>> 0 < $9 >>> 0 ? $11 + 1 | 0 : $11; $10 = $11; $19 = $10; $11 = 0; $9 = ($10 | 0) == ($15 | 0) & $7 >>> 0 < $26 >>> 0 | $10 >>> 0 < $15 >>> 0; $7 = $10 + $22 | 0; $10 = ($9 | $11) + $4 | 0; $10 = $7 >>> 0 < $19 >>> 0 ? $10 + 1 | 0 : $10; $19 = $7; $9 = $7; $7 = $10; $9 = ($4 | 0) == ($10 | 0) & $9 >>> 0 < $22 >>> 0 | $10 >>> 0 < $4 >>> 0; $23 = $12; $4 = $9; $9 = $10 + $17 | 0; $12 = 0; $3 = $12 + $19 | 0; if ($3 >>> 0 < $12 >>> 0) { $9 = $9 + 1 | 0 } $3 = ($7 | 0) == ($9 | 0) & $3 >>> 0 < $19 >>> 0 | $9 >>> 0 < $7 >>> 0; $4 = $4 + $3 | 0; if ($4 >>> 0 < $3 >>> 0) { $11 = 1 } $3 = $23 + $4 | 0; $12 = $11 + $16 | 0; $7 = $3; $9 = $8; $12 = $3 >>> 0 < $4 >>> 0 ? $12 + 1 | 0 : $12; $8 = $12; $3 = ($14 | 0) == ($8 | 0) & $3 >>> 0 < $21 >>> 0 | $8 >>> 0 < $14 >>> 0; $4 = $3 + $24 | 0; if ($4 >>> 0 < $3 >>> 0) { $9 = $9 + 1 | 0 } $3 = $4; $4 = $9; label$12 : { if (($9 | 0) == 131071 | $9 >>> 0 < 131071) { $22 = 0; $14 = $5; $18 = 0; $10 = __wasm_i64_mul($7, $22, $14, $18); $11 = i64toi32_i32$HIGH_BITS; $9 = $1 << 17; $1 = 0; $2 = ($10 | 0) != 0 | ($11 | 0) != 0; $16 = $1 - $2 | 0; $30 = $9 - ($1 >>> 0 < $2 >>> 0) | 0; $19 = 0 - $10 | 0; $15 = 0 - ((0 < $10 >>> 0) + $11 | 0) | 0; $2 = 0; $24 = __wasm_i64_mul($8, $2, $14, $18); $1 = i64toi32_i32$HIGH_BITS; $27 = $1; $17 = 0; $10 = __wasm_i64_mul($7, $22, $6, $17); $9 = $10 + $24 | 0; $11 = i64toi32_i32$HIGH_BITS + $1 | 0; $11 = $9 >>> 0 < $10 >>> 0 ? $11 + 1 | 0 : $11; $1 = $9; $10 = $9; $20 = 0; $9 = $20; $23 = $10; $9 = ($10 | 0) == ($15 | 0) & $19 >>> 0 < $9 >>> 0 | $15 >>> 0 < $10 >>> 0; $21 = $16 - $9 | 0; $30 = $30 - ($16 >>> 0 < $9 >>> 0) | 0; $9 = __wasm_i64_mul($3, 0, $14, $18); $10 = i64toi32_i32$HIGH_BITS; $14 = __wasm_i64_mul($7, $22, $29, 0); $9 = $14 + $9 | 0; $12 = i64toi32_i32$HIGH_BITS + $10 | 0; $12 = $9 >>> 0 < $14 >>> 0 ? $12 + 1 | 0 : $12; $14 = __wasm_i64_mul($8, $2, $6, $17); $9 = $14 + $9 | 0; $10 = i64toi32_i32$HIGH_BITS + $12 | 0; $10 = $9 >>> 0 < $14 >>> 0 ? $10 + 1 | 0 : $10; $12 = $10; $10 = ($11 | 0) == ($27 | 0) & $1 >>> 0 < $24 >>> 0 | $11 >>> 0 < $27 >>> 0; $1 = $11 + $9 | 0; $10 = $10 + $12 | 0; $10 = $1 >>> 0 < $11 >>> 0 ? $10 + 1 | 0 : $10; $11 = $1; $1 = $10; $9 = __wasm_i64_mul($7, $8, $31, 0); $14 = i64toi32_i32$HIGH_BITS; $16 = $11; $11 = __wasm_i64_mul($5, $6, $4, 0); $10 = $11 + $9 | 0; $9 = i64toi32_i32$HIGH_BITS + $14 | 0; $9 = $10 >>> 0 < $11 >>> 0 ? $9 + 1 | 0 : $9; $12 = __wasm_i64_mul($3, $4, $6, $17); $11 = $12 + $10 | 0; $9 = __wasm_i64_mul($8, $2, $29, $32); $2 = $9 + $11 | 0; $9 = $2; $10 = 0; $2 = $16 + $10 | 0; $9 = $1 + $9 | 0; $1 = $2; $16 = $21 - $1 | 0; $2 = $30 - (($21 >>> 0 < $1 >>> 0) + ($1 >>> 0 < $10 >>> 0 ? $9 + 1 | 0 : $9) | 0) | 0; $34 = $34 + -1 | 0; $29 = $19 - $20 | 0; $1 = $15 - (($19 >>> 0 < $20 >>> 0) + $23 | 0) | 0; break label$12; } $17 = $8 >>> 1 | 0; $11 = 0; $12 = $1 << 16; $10 = $3 << 31; $7 = ($8 & 1) << 31 | $7 >>> 1; $8 = $8 >>> 1 | $10; $27 = 0; $25 = 0; $1 = __wasm_i64_mul($7, $27, $5, $25); $9 = i64toi32_i32$HIGH_BITS; $10 = $9; $9 = ($1 | 0) != 0 | ($9 | 0) != 0; $14 = $2 - $9 | 0; $37 = $12 - ($2 >>> 0 < $9 >>> 0) | 0; $21 = 0 - $1 | 0; $22 = 0 - ((0 < $1 >>> 0) + $10 | 0) | 0; $12 = $22; $15 = 0; $20 = __wasm_i64_mul($7, $27, $6, $15); $1 = i64toi32_i32$HIGH_BITS; $35 = $1; $23 = $17 | $3 << 31; $36 = $4 << 31 | $3 >>> 1 | $11; $10 = $23; $17 = __wasm_i64_mul($10, 0, $5, $25); $2 = $17 + $20 | 0; $9 = i64toi32_i32$HIGH_BITS + $1 | 0; $9 = $2 >>> 0 < $17 >>> 0 ? $9 + 1 | 0 : $9; $1 = $9; $9 = $2; $26 = $9; $18 = 0; $9 = ($9 | 0) == ($12 | 0) & $21 >>> 0 < $18 >>> 0 | $12 >>> 0 < $9 >>> 0; $24 = $14 - $9 | 0; $37 = $37 - ($14 >>> 0 < $9 >>> 0) | 0; $10 = __wasm_i64_mul($6, $15, $10, $11); $11 = i64toi32_i32$HIGH_BITS; $9 = $4; $12 = $9 >>> 1 | 0; $17 = ($9 & 1) << 31 | $3 >>> 1; $14 = $12; $12 = __wasm_i64_mul($17, 0, $5, $25); $9 = $12 + $10 | 0; $10 = i64toi32_i32$HIGH_BITS + $11 | 0; $10 = $9 >>> 0 < $12 >>> 0 ? $10 + 1 | 0 : $10; $12 = __wasm_i64_mul($7, $27, $29, 0); $11 = $12 + $9 | 0; $9 = i64toi32_i32$HIGH_BITS + $10 | 0; $10 = $11; $11 = $10 >>> 0 < $12 >>> 0 ? $9 + 1 | 0 : $9; $9 = ($1 | 0) == ($35 | 0) & $2 >>> 0 < $20 >>> 0 | $1 >>> 0 < $35 >>> 0; $2 = $1; $1 = $1 + $10 | 0; $11 = $9 + $11 | 0; $9 = $1; $1 = $9 >>> 0 < $2 >>> 0 ? $11 + 1 | 0 : $11; $2 = __wasm_i64_mul($7, $8, $31, 0); $10 = i64toi32_i32$HIGH_BITS; $11 = $9; $3 = __wasm_i64_mul($5, $6, $4 >>> 1 | 0, 0); $2 = $3 + $2 | 0; $9 = i64toi32_i32$HIGH_BITS + $10 | 0; $9 = $2 >>> 0 < $3 >>> 0 ? $9 + 1 | 0 : $9; $3 = __wasm_i64_mul($6, $15, $17, $14); $2 = $3 + $2 | 0; $9 = i64toi32_i32$HIGH_BITS + $9 | 0; $3 = __wasm_i64_mul($23, $36, $29, $32); $2 = $3 + $2 | 0; $9 = $2; $3 = 0; $2 = $11 + $3 | 0; $10 = $1 + $9 | 0; $1 = $2; $16 = $24 - $1 | 0; $2 = $37 - (($24 >>> 0 < $1 >>> 0) + ($1 >>> 0 < $3 >>> 0 ? $10 + 1 | 0 : $10) | 0) | 0; $3 = $17; $4 = $14; $29 = $21 - $18 | 0; $1 = $22 - (($21 >>> 0 < $18 >>> 0) + $26 | 0) | 0; } if (($34 | 0) >= 16384) { $28 = $28 | 2147418112; $1 = 0; $2 = 0; break label$2; } $11 = $34 + 16383 | 0; if (($34 | 0) <= -16383) { label$16 : { if ($11) { break label$16 } $11 = $8; $14 = $29; $12 = $1 << 1 | $14 >>> 31; $9 = $14 << 1; $6 = ($6 | 0) == ($12 | 0) & $9 >>> 0 > $5 >>> 0 | $12 >>> 0 > $6 >>> 0; $9 = $4 & 65535; $5 = $16; $12 = $2 << 1 | $5 >>> 31; $2 = $5 << 1 | $1 >>> 31; $4 = $2; $1 = $12; $1 = ($4 | 0) == ($38 | 0) & ($1 | 0) == ($31 | 0) ? $6 : ($31 | 0) == ($1 | 0) & $4 >>> 0 > $38 >>> 0 | $1 >>> 0 > $31 >>> 0; $2 = $1 + $7 | 0; if ($2 >>> 0 < $1 >>> 0) { $11 = $11 + 1 | 0 } $1 = $2; $4 = $1; $2 = $11; $4 = $3 + (($8 | 0) == ($11 | 0) & $4 >>> 0 < $7 >>> 0 | $11 >>> 0 < $8 >>> 0) | 0; if ($4 >>> 0 < $3 >>> 0) { $9 = $9 + 1 | 0 } $3 = $9; if (!($9 & 65536)) { break label$16 } $33 = $4 | $33; $28 = $3 | $28; break label$2; } $1 = 0; $2 = 0; break label$2; } $10 = $8; $4 = $4 & 65535; $14 = $29; $9 = $1 << 1 | $14 >>> 31; $14 = $14 << 1; $6 = ($6 | 0) == ($9 | 0) & $14 >>> 0 >= $5 >>> 0 | $9 >>> 0 > $6 >>> 0; $5 = $16; $9 = $2 << 1 | $5 >>> 31; $2 = $5 << 1 | $1 >>> 31; $1 = ($2 | 0) == ($38 | 0) & ($9 | 0) == ($31 | 0) ? $6 : ($31 | 0) == ($9 | 0) & $2 >>> 0 >= $38 >>> 0 | $9 >>> 0 > $31 >>> 0; $2 = $1 + $7 | 0; if ($2 >>> 0 < $1 >>> 0) { $10 = $10 + 1 | 0 } $1 = $2; $2 = $10; $5 = $3; $3 = (($8 | 0) == ($10 | 0) & $1 >>> 0 < $7 >>> 0 | $10 >>> 0 < $8 >>> 0) + $3 | 0; $10 = $11 << 16 | $4; $33 = $3 | $33; $28 = $28 | ($3 >>> 0 < $5 >>> 0 ? $10 + 1 | 0 : $10); } HEAP32[$0 >> 2] = $1; HEAP32[$0 + 4 >> 2] = $2; HEAP32[$0 + 8 >> 2] = $33; HEAP32[$0 + 12 >> 2] = $28; global$0 = $13 + 192 | 0; return; } HEAP32[$0 >> 2] = 0; HEAP32[$0 + 4 >> 2] = 0; $1 = !($3 | $5 | ($4 | $6)); HEAP32[$0 + 8 >> 2] = $1 ? 0 : $33; HEAP32[$0 + 12 >> 2] = $1 ? 2147450880 : $28; global$0 = $13 + 192 | 0; } function __fpclassifyl($0, $1, $2, $3) { var $4 = 0, $5 = 0; $5 = $3 & 65535; $3 = $3 >>> 16 & 32767; label$1 : { if (($3 | 0) != 32767) { $4 = 4; if ($3) { break label$1 } return $0 | $2 | ($1 | $5) ? 3 : 2; } $4 = !($0 | $2 | ($1 | $5)); } return $4; } function fmodl($0, $1, $2, $3, $4, $5, $6, $7, $8) { var $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0; $9 = global$0 - 128 | 0; global$0 = $9; label$1 : { label$2 : { label$3 : { if (!__letf2($5, $6, $7, $8, 0, 0, 0, 0)) { break label$3 } $10 = __fpclassifyl($5, $6, $7, $8); $19 = $4 >>> 16 | 0; $14 = $19 & 32767; if (($14 | 0) == 32767) { break label$3 } if ($10) { break label$2 } } __multf3($9 + 16 | 0, $1, $2, $3, $4, $5, $6, $7, $8); $4 = HEAP32[$9 + 16 >> 2]; $3 = HEAP32[$9 + 20 >> 2]; $2 = HEAP32[$9 + 24 >> 2]; $1 = HEAP32[$9 + 28 >> 2]; __divtf3($9, $4, $3, $2, $1, $4, $3, $2, $1); $3 = HEAP32[$9 + 8 >> 2]; $4 = HEAP32[$9 + 12 >> 2]; $7 = HEAP32[$9 >> 2]; $8 = HEAP32[$9 + 4 >> 2]; break label$1; } $11 = $4 & 65535 | $14 << 16; $12 = $11; $13 = $3; $15 = $7; $18 = $8 >>> 16 & 32767; $10 = $8 & 65535 | $18 << 16; if ((__letf2($1, $2, $13, $12, $5, $6, $7, $10) | 0) <= 0) { if (__letf2($1, $2, $13, $12, $5, $6, $15, $10)) { $7 = $1; $8 = $2; break label$1; } __multf3($9 + 112 | 0, $1, $2, $3, $4, 0, 0, 0, 0); $3 = HEAP32[$9 + 120 >> 2]; $4 = HEAP32[$9 + 124 >> 2]; $7 = HEAP32[$9 + 112 >> 2]; $8 = HEAP32[$9 + 116 >> 2]; break label$1; } if ($14) { $8 = $2; $7 = $1; } else { __multf3($9 + 96 | 0, $1, $2, $13, $12, 0, 0, 0, 1081540608); $7 = HEAP32[$9 + 108 >> 2]; $12 = $7; $13 = HEAP32[$9 + 104 >> 2]; $14 = ($7 >>> 16 | 0) + -120 | 0; $8 = HEAP32[$9 + 100 >> 2]; $7 = HEAP32[$9 + 96 >> 2]; } if (!$18) { __multf3($9 + 80 | 0, $5, $6, $15, $10, 0, 0, 0, 1081540608); $5 = HEAP32[$9 + 92 >> 2]; $10 = $5; $15 = HEAP32[$9 + 88 >> 2]; $18 = ($10 >>> 16 | 0) + -120 | 0; $6 = HEAP32[$9 + 84 >> 2]; $5 = HEAP32[$9 + 80 >> 2]; } $21 = $15; $11 = $15; $15 = $13 - $11 | 0; $12 = $12 & 65535 | 65536; $20 = $10 & 65535 | 65536; $10 = ($6 | 0) == ($8 | 0) & $7 >>> 0 < $5 >>> 0 | $8 >>> 0 < $6 >>> 0; $11 = ($12 - ($20 + ($13 >>> 0 < $11 >>> 0) | 0) | 0) - ($15 >>> 0 < $10 >>> 0) | 0; $17 = $15 - $10 | 0; $16 = ($11 | 0) > -1 ? 1 : 0; $15 = $7 - $5 | 0; $10 = $8 - (($7 >>> 0 < $5 >>> 0) + $6 | 0) | 0; if (($14 | 0) > ($18 | 0)) { while (1) { label$11 : { if ($16 & 1) { if (!($15 | $17 | ($10 | $11))) { __multf3($9 + 32 | 0, $1, $2, $3, $4, 0, 0, 0, 0); $3 = HEAP32[$9 + 40 >> 2]; $4 = HEAP32[$9 + 44 >> 2]; $7 = HEAP32[$9 + 32 >> 2]; $8 = HEAP32[$9 + 36 >> 2]; break label$1; } $7 = $17; $16 = $11 << 1 | $7 >>> 31; $17 = $7 << 1; $11 = $16; $16 = 0; $7 = $10 >>> 31 | 0; break label$11; } $11 = 0; $10 = $8; $17 = $8 >>> 31 | 0; $15 = $7; $7 = $13; $16 = $12 << 1 | $7 >>> 31; $7 = $7 << 1; } $13 = $7 | $17; $8 = $13; $7 = $21; $17 = $8 - $7 | 0; $12 = $11 | $16; $11 = $12 - (($8 >>> 0 < $7 >>> 0) + $20 | 0) | 0; $7 = $15; $16 = $10 << 1 | $7 >>> 31; $7 = $7 << 1; $8 = $16; $10 = ($6 | 0) == ($8 | 0) & $7 >>> 0 < $5 >>> 0 | $8 >>> 0 < $6 >>> 0; $11 = $11 - ($17 >>> 0 < $10 >>> 0) | 0; $17 = $17 - $10 | 0; $16 = ($11 | 0) > -1 ? 1 : 0; $15 = $7 - $5 | 0; $10 = $8 - (($7 >>> 0 < $5 >>> 0) + $6 | 0) | 0; $14 = $14 + -1 | 0; if (($14 | 0) > ($18 | 0)) { continue } break; }; $14 = $18; } label$14 : { if (!$16) { break label$14 } $7 = $15; $13 = $17; $8 = $10; $12 = $11; if ($7 | $13 | ($8 | $12)) { break label$14 } __multf3($9 + 48 | 0, $1, $2, $3, $4, 0, 0, 0, 0); $3 = HEAP32[$9 + 56 >> 2]; $4 = HEAP32[$9 + 60 >> 2]; $7 = HEAP32[$9 + 48 >> 2]; $8 = HEAP32[$9 + 52 >> 2]; break label$1; } if (($12 | 0) == 65535 | $12 >>> 0 < 65535) { while (1) { $3 = $8 >>> 31 | 0; $1 = 0; $14 = $14 + -1 | 0; $11 = $8 << 1 | $7 >>> 31; $7 = $7 << 1; $8 = $11; $2 = $13; $16 = $12 << 1 | $2 >>> 31; $13 = $2 << 1 | $3; $1 = $1 | $16; $12 = $1; if (($1 | 0) == 65536 & $13 >>> 0 < 0 | $1 >>> 0 < 65536) { continue } break; } } $1 = $19 & 32768; if (($14 | 0) <= 0) { __multf3($9 - -64 | 0, $7, $8, $13, $12 & 65535 | ($1 | $14 + 120) << 16, 0, 0, 0, 1065811968); $3 = HEAP32[$9 + 72 >> 2]; $4 = HEAP32[$9 + 76 >> 2]; $7 = HEAP32[$9 + 64 >> 2]; $8 = HEAP32[$9 + 68 >> 2]; break label$1; } $3 = $13; $4 = $12 & 65535 | ($1 | $14) << 16; } HEAP32[$0 >> 2] = $7; HEAP32[$0 + 4 >> 2] = $8; HEAP32[$0 + 8 >> 2] = $3; HEAP32[$0 + 12 >> 2] = $4; global$0 = $9 + 128 | 0; } function __floatscan($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0; $5 = global$0 - 48 | 0; global$0 = $5; $4 = $1 + 4 | 0; $7 = HEAP32[2644]; $10 = HEAP32[2641]; while (1) { $2 = HEAP32[$1 + 4 >> 2]; label$4 : { if ($2 >>> 0 < HEAPU32[$1 + 104 >> 2]) { HEAP32[$4 >> 2] = $2 + 1; $2 = HEAPU8[$2 | 0]; break label$4; } $2 = __shgetc($1); } if (($2 | 0) == 32 | $2 + -9 >>> 0 < 5) { continue } break; }; $6 = 1; label$6 : { label$7 : { switch ($2 + -43 | 0) { case 0: case 2: break label$7; default: break label$6; }; } $6 = ($2 | 0) == 45 ? -1 : 1; $2 = HEAP32[$1 + 4 >> 2]; if ($2 >>> 0 < HEAPU32[$1 + 104 >> 2]) { HEAP32[$4 >> 2] = $2 + 1; $2 = HEAPU8[$2 | 0]; break label$6; } $2 = __shgetc($1); } label$1 : { label$9 : { label$10 : { while (1) { if (HEAP8[$3 + 10484 | 0] == ($2 | 32)) { label$13 : { if ($3 >>> 0 > 6) { break label$13 } $2 = HEAP32[$1 + 4 >> 2]; if ($2 >>> 0 < HEAPU32[$1 + 104 >> 2]) { HEAP32[$4 >> 2] = $2 + 1; $2 = HEAPU8[$2 | 0]; break label$13; } $2 = __shgetc($1); } $3 = $3 + 1 | 0; if (($3 | 0) != 8) { continue } break label$10; } break; }; if (($3 | 0) != 3) { if (($3 | 0) == 8) { break label$10 } if ($3 >>> 0 < 4) { break label$9 } if (($3 | 0) == 8) { break label$10 } } $1 = HEAP32[$1 + 104 >> 2]; if ($1) { HEAP32[$4 >> 2] = HEAP32[$4 >> 2] + -1 } if ($3 >>> 0 < 4) { break label$10 } while (1) { if ($1) { HEAP32[$4 >> 2] = HEAP32[$4 >> 2] + -1 } $3 = $3 + -1 | 0; if ($3 >>> 0 > 3) { continue } break; }; } __extendsftf2($5, Math_fround(Math_fround($6 | 0) * Math_fround(infinity))); $6 = HEAP32[$5 + 8 >> 2]; $2 = HEAP32[$5 + 12 >> 2]; $8 = HEAP32[$5 >> 2]; $9 = HEAP32[$5 + 4 >> 2]; break label$1; } label$19 : { label$20 : { label$21 : { if ($3) { break label$21 } $3 = 0; while (1) { if (HEAP8[$3 + 10493 | 0] != ($2 | 32)) { break label$21 } label$23 : { if ($3 >>> 0 > 1) { break label$23 } $2 = HEAP32[$1 + 4 >> 2]; if ($2 >>> 0 < HEAPU32[$1 + 104 >> 2]) { HEAP32[$4 >> 2] = $2 + 1; $2 = HEAPU8[$2 | 0]; break label$23; } $2 = __shgetc($1); } $3 = $3 + 1 | 0; if (($3 | 0) != 3) { continue } break; }; break label$20; } label$25 : { switch ($3 | 0) { case 0: label$27 : { if (($2 | 0) != 48) { break label$27 } $3 = HEAP32[$1 + 4 >> 2]; label$28 : { if ($3 >>> 0 < HEAPU32[$1 + 104 >> 2]) { HEAP32[$4 >> 2] = $3 + 1; $3 = HEAPU8[$3 | 0]; break label$28; } $3 = __shgetc($1); } if (($3 & -33) == 88) { hexfloat($5 + 16 | 0, $1, $10, $7, $6); $6 = HEAP32[$5 + 24 >> 2]; $2 = HEAP32[$5 + 28 >> 2]; $8 = HEAP32[$5 + 16 >> 2]; $9 = HEAP32[$5 + 20 >> 2]; break label$1; } if (!HEAP32[$1 + 104 >> 2]) { break label$27 } HEAP32[$4 >> 2] = HEAP32[$4 >> 2] + -1; } decfloat($5 + 32 | 0, $1, $2, $10, $7, $6); $6 = HEAP32[$5 + 40 >> 2]; $2 = HEAP32[$5 + 44 >> 2]; $8 = HEAP32[$5 + 32 >> 2]; $9 = HEAP32[$5 + 36 >> 2]; break label$1; case 3: break label$20; default: break label$25; }; } if (HEAP32[$1 + 104 >> 2]) { HEAP32[$4 >> 2] = HEAP32[$4 >> 2] + -1 } break label$19; } label$32 : { $3 = HEAP32[$1 + 4 >> 2]; label$33 : { if ($3 >>> 0 < HEAPU32[$1 + 104 >> 2]) { HEAP32[$4 >> 2] = $3 + 1; $2 = HEAPU8[$3 | 0]; break label$33; } $2 = __shgetc($1); } if (($2 | 0) == 40) { $3 = 1; break label$32; } $6 = 0; $2 = 2147450880; if (!HEAP32[$1 + 104 >> 2]) { break label$1 } HEAP32[$4 >> 2] = HEAP32[$4 >> 2] + -1; break label$1; } while (1) { $2 = HEAP32[$1 + 4 >> 2]; label$37 : { if ($2 >>> 0 < HEAPU32[$1 + 104 >> 2]) { HEAP32[$4 >> 2] = $2 + 1; $7 = HEAPU8[$2 | 0]; break label$37; } $7 = __shgetc($1); } if (!($7 + -97 >>> 0 >= 26 ? !($7 + -48 >>> 0 < 10 | $7 + -65 >>> 0 < 26 | ($7 | 0) == 95) : 0)) { $3 = $3 + 1 | 0; continue; } break; }; $6 = 0; $2 = 2147450880; if (($7 | 0) == 41) { break label$1 } $1 = HEAP32[$1 + 104 >> 2]; if ($1) { HEAP32[$4 >> 2] = HEAP32[$4 >> 2] + -1 } if (!$3) { break label$1 } while (1) { $3 = $3 + -1 | 0; if ($1) { HEAP32[$4 >> 2] = HEAP32[$4 >> 2] + -1 } if ($3) { continue } break; }; break label$1; } HEAP32[2896] = 28; __shlim($1); $6 = 0; $2 = 0; } HEAP32[$0 >> 2] = $8; HEAP32[$0 + 4 >> 2] = $9; HEAP32[$0 + 8 >> 2] = $6; HEAP32[$0 + 12 >> 2] = $2; global$0 = $5 + 48 | 0; } function hexfloat($0, $1, $2, $3, $4) { var $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0, $22 = 0, $23 = 0, $24 = 0; $5 = global$0 - 432 | 0; global$0 = $5; $6 = HEAP32[$1 + 4 >> 2]; label$1 : { if ($6 >>> 0 < HEAPU32[$1 + 104 >> 2]) { HEAP32[$1 + 4 >> 2] = $6 + 1; $7 = HEAPU8[$6 | 0]; break label$1; } $7 = __shgetc($1); } label$3 : { label$4 : { while (1) { if (($7 | 0) != 48) { label$6 : { if (($7 | 0) != 46) { break label$3 } $6 = HEAP32[$1 + 4 >> 2]; if ($6 >>> 0 >= HEAPU32[$1 + 104 >> 2]) { break label$6 } HEAP32[$1 + 4 >> 2] = $6 + 1; $7 = HEAPU8[$6 | 0]; break label$4; } } else { $6 = HEAP32[$1 + 4 >> 2]; if ($6 >>> 0 < HEAPU32[$1 + 104 >> 2]) { HEAP32[$1 + 4 >> 2] = $6 + 1; $7 = HEAPU8[$6 | 0]; } else { $7 = __shgetc($1) } $21 = 1; continue; } break; }; $7 = __shgetc($1); } $20 = 1; if (($7 | 0) != 48) { break label$3 } while (1) { $6 = HEAP32[$1 + 4 >> 2]; label$10 : { if ($6 >>> 0 < HEAPU32[$1 + 104 >> 2]) { HEAP32[$1 + 4 >> 2] = $6 + 1; $7 = HEAPU8[$6 | 0]; break label$10; } $7 = __shgetc($1); } $13 = $13 + -1 | 0; $17 = $17 + -1 | 0; if (($17 | 0) != -1) { $13 = $13 + 1 | 0 } if (($7 | 0) == 48) { continue } break; }; $21 = 1; } $12 = 1073676288; $6 = 0; while (1) { label$13 : { $22 = $7 | 32; label$14 : { label$15 : { $23 = $7 + -48 | 0; if ($23 >>> 0 < 10) { break label$15 } if ($22 + -97 >>> 0 > 5 ? ($7 | 0) != 46 : 0) { break label$13 } if (($7 | 0) != 46) { break label$15 } if ($20) { break label$13 } $20 = 1; $17 = $9; $13 = $6; break label$14; } $7 = ($7 | 0) > 57 ? $22 + -87 | 0 : $23; label$16 : { if (($6 | 0) < 0 ? 1 : ($6 | 0) <= 0 ? ($9 >>> 0 > 7 ? 0 : 1) : 0) { $14 = $7 + ($14 << 4) | 0; break label$16; } if (($6 | 0) < 0 ? 1 : ($6 | 0) <= 0 ? ($9 >>> 0 > 28 ? 0 : 1) : 0) { __floatsitf($5 + 48 | 0, $7); __multf3($5 + 32 | 0, $18, $19, $8, $12, 0, 0, 0, 1073414144); $18 = HEAP32[$5 + 32 >> 2]; $19 = HEAP32[$5 + 36 >> 2]; $8 = HEAP32[$5 + 40 >> 2]; $12 = HEAP32[$5 + 44 >> 2]; __multf3($5 + 16 | 0, $18, $19, $8, $12, HEAP32[$5 + 48 >> 2], HEAP32[$5 + 52 >> 2], HEAP32[$5 + 56 >> 2], HEAP32[$5 + 60 >> 2]); __addtf3($5, $10, $11, $15, $16, HEAP32[$5 + 16 >> 2], HEAP32[$5 + 20 >> 2], HEAP32[$5 + 24 >> 2], HEAP32[$5 + 28 >> 2]); $15 = HEAP32[$5 + 8 >> 2]; $16 = HEAP32[$5 + 12 >> 2]; $10 = HEAP32[$5 >> 2]; $11 = HEAP32[$5 + 4 >> 2]; break label$16; } if (!$7 | $24) { break label$16 } __multf3($5 + 80 | 0, $18, $19, $8, $12, 0, 0, 0, 1073610752); __addtf3($5 - -64 | 0, $10, $11, $15, $16, HEAP32[$5 + 80 >> 2], HEAP32[$5 + 84 >> 2], HEAP32[$5 + 88 >> 2], HEAP32[$5 + 92 >> 2]); $15 = HEAP32[$5 + 72 >> 2]; $16 = HEAP32[$5 + 76 >> 2]; $24 = 1; $10 = HEAP32[$5 + 64 >> 2]; $11 = HEAP32[$5 + 68 >> 2]; } $9 = $9 + 1 | 0; if ($9 >>> 0 < 1) { $6 = $6 + 1 | 0 } $21 = 1; } $7 = HEAP32[$1 + 4 >> 2]; if ($7 >>> 0 < HEAPU32[$1 + 104 >> 2]) { HEAP32[$1 + 4 >> 2] = $7 + 1; $7 = HEAPU8[$7 | 0]; } else { $7 = __shgetc($1) } continue; } break; }; label$20 : { label$21 : { if (!$21) { if (!HEAP32[$1 + 104 >> 2]) { break label$21 } $2 = HEAP32[$1 + 4 >> 2]; HEAP32[$1 + 4 >> 2] = $2 + -1; HEAP32[$1 + 4 >> 2] = $2 + -2; if (!$20) { break label$21 } HEAP32[$1 + 4 >> 2] = $2 + -3; break label$21; } if (($6 | 0) < 0 ? 1 : ($6 | 0) <= 0 ? ($9 >>> 0 > 7 ? 0 : 1) : 0) { $8 = $9; $12 = $6; while (1) { $14 = $14 << 4; $8 = $8 + 1 | 0; if ($8 >>> 0 < 1) { $12 = $12 + 1 | 0 } if (($8 | 0) != 8 | $12) { continue } break; }; } label$27 : { if (($7 & -33) == 80) { $8 = scanexp($1); $7 = i64toi32_i32$HIGH_BITS; $12 = $7; if ($8 | ($7 | 0) != -2147483648) { break label$27 } $8 = 0; $12 = 0; if (!HEAP32[$1 + 104 >> 2]) { break label$27 } HEAP32[$1 + 4 >> 2] = HEAP32[$1 + 4 >> 2] + -1; break label$27; } $8 = 0; $12 = 0; if (!HEAP32[$1 + 104 >> 2]) { break label$27 } HEAP32[$1 + 4 >> 2] = HEAP32[$1 + 4 >> 2] + -1; } if (!$14) { __extenddftf2($5 + 112 | 0, +($4 | 0) * 0.0); $10 = HEAP32[$5 + 112 >> 2]; $11 = HEAP32[$5 + 116 >> 2]; $2 = HEAP32[$5 + 120 >> 2]; $1 = HEAP32[$5 + 124 >> 2]; break label$20; } $1 = $20 ? $17 : $9; $6 = ($20 ? $13 : $6) << 2 | $1 >>> 30; $1 = $8 + ($1 << 2) | 0; $13 = $1 + -32 | 0; $9 = $13; $6 = $6 + $12 | 0; $1 = ($1 >>> 0 < $8 >>> 0 ? $6 + 1 | 0 : $6) + -1 | 0; $6 = $9 >>> 0 < 4294967264 ? $1 + 1 | 0 : $1; if (($6 | 0) > 0 ? 1 : ($6 | 0) >= 0 ? ($9 >>> 0 <= 0 - $3 >>> 0 ? 0 : 1) : 0) { HEAP32[2896] = 68; __floatsitf($5 + 160 | 0, $4); __multf3($5 + 144 | 0, HEAP32[$5 + 160 >> 2], HEAP32[$5 + 164 >> 2], HEAP32[$5 + 168 >> 2], HEAP32[$5 + 172 >> 2], -1, -1, -1, 2147418111); __multf3($5 + 128 | 0, HEAP32[$5 + 144 >> 2], HEAP32[$5 + 148 >> 2], HEAP32[$5 + 152 >> 2], HEAP32[$5 + 156 >> 2], -1, -1, -1, 2147418111); $10 = HEAP32[$5 + 128 >> 2]; $11 = HEAP32[$5 + 132 >> 2]; $2 = HEAP32[$5 + 136 >> 2]; $1 = HEAP32[$5 + 140 >> 2]; break label$20; } $1 = $3 + -226 | 0; $7 = $9 >>> 0 < $1 >>> 0 ? 0 : 1; $1 = $1 >> 31; if (($6 | 0) > ($1 | 0) ? 1 : ($6 | 0) >= ($1 | 0) ? $7 : 0) { if (($14 | 0) > -1) { while (1) { __addtf3($5 + 416 | 0, $10, $11, $15, $16, 0, 0, 0, -1073807360); $1 = __getf2($10, $11, $15, $16, 1073610752); $8 = ($1 | 0) < 0; __addtf3($5 + 400 | 0, $10, $11, $15, $16, $8 ? $10 : HEAP32[$5 + 416 >> 2], $8 ? $11 : HEAP32[$5 + 420 >> 2], $8 ? $15 : HEAP32[$5 + 424 >> 2], $8 ? $16 : HEAP32[$5 + 428 >> 2]); $6 = $6 + -1 | 0; $9 = $9 + -1 | 0; if (($9 | 0) != -1) { $6 = $6 + 1 | 0 } $15 = HEAP32[$5 + 408 >> 2]; $16 = HEAP32[$5 + 412 >> 2]; $10 = HEAP32[$5 + 400 >> 2]; $11 = HEAP32[$5 + 404 >> 2]; $14 = $14 << 1 | ($1 | 0) > -1; if (($14 | 0) > -1) { continue } break; } } $1 = ($9 - $3 | 0) + 32 | 0; $8 = $1; $7 = $2; $12 = $1 >>> 0 >= $2 >>> 0 ? 0 : 1; $2 = $6 - (($3 >> 31) + ($9 >>> 0 < $3 >>> 0) | 0) | 0; $1 = $1 >>> 0 < 32 ? $2 + 1 | 0 : $2; $1 = (($1 | 0) < 0 ? 1 : ($1 | 0) <= 0 ? $12 : 0) ? (($8 | 0) > 0 ? $8 : 0) : $7; label$35 : { if (($1 | 0) >= 113) { __floatsitf($5 + 384 | 0, $4); $17 = HEAP32[$5 + 392 >> 2]; $13 = HEAP32[$5 + 396 >> 2]; $18 = HEAP32[$5 + 384 >> 2]; $19 = HEAP32[$5 + 388 >> 2]; $6 = 0; $4 = 0; $3 = 0; $2 = 0; break label$35; } __extenddftf2($5 + 352 | 0, scalbn(1.0, 144 - $1 | 0)); __floatsitf($5 + 336 | 0, $4); $18 = HEAP32[$5 + 336 >> 2]; $19 = HEAP32[$5 + 340 >> 2]; $17 = HEAP32[$5 + 344 >> 2]; $13 = HEAP32[$5 + 348 >> 2]; copysignl($5 + 368 | 0, HEAP32[$5 + 352 >> 2], HEAP32[$5 + 356 >> 2], HEAP32[$5 + 360 >> 2], HEAP32[$5 + 364 >> 2], $18, $19, $17, $13); $6 = HEAP32[$5 + 376 >> 2]; $4 = HEAP32[$5 + 380 >> 2]; $3 = HEAP32[$5 + 372 >> 2]; $2 = HEAP32[$5 + 368 >> 2]; } $1 = !($14 & 1) & ((__letf2($10, $11, $15, $16, 0, 0, 0, 0) | 0) != 0 & ($1 | 0) < 32); __floatunsitf($5 + 320 | 0, $1 + $14 | 0); __multf3($5 + 304 | 0, $18, $19, $17, $13, HEAP32[$5 + 320 >> 2], HEAP32[$5 + 324 >> 2], HEAP32[$5 + 328 >> 2], HEAP32[$5 + 332 >> 2]); __addtf3($5 + 272 | 0, HEAP32[$5 + 304 >> 2], HEAP32[$5 + 308 >> 2], HEAP32[$5 + 312 >> 2], HEAP32[$5 + 316 >> 2], $2, $3, $6, $4); __multf3($5 + 288 | 0, $1 ? 0 : $10, $1 ? 0 : $11, $1 ? 0 : $15, $1 ? 0 : $16, $18, $19, $17, $13); __addtf3($5 + 256 | 0, HEAP32[$5 + 288 >> 2], HEAP32[$5 + 292 >> 2], HEAP32[$5 + 296 >> 2], HEAP32[$5 + 300 >> 2], HEAP32[$5 + 272 >> 2], HEAP32[$5 + 276 >> 2], HEAP32[$5 + 280 >> 2], HEAP32[$5 + 284 >> 2]); __subtf3($5 + 240 | 0, HEAP32[$5 + 256 >> 2], HEAP32[$5 + 260 >> 2], HEAP32[$5 + 264 >> 2], HEAP32[$5 + 268 >> 2], $2, $3, $6, $4); $1 = HEAP32[$5 + 240 >> 2]; $2 = HEAP32[$5 + 244 >> 2]; $3 = HEAP32[$5 + 248 >> 2]; $4 = HEAP32[$5 + 252 >> 2]; if (!__letf2($1, $2, $3, $4, 0, 0, 0, 0)) { HEAP32[2896] = 68 } scalbnl($5 + 224 | 0, $1, $2, $3, $4, $9); $10 = HEAP32[$5 + 224 >> 2]; $11 = HEAP32[$5 + 228 >> 2]; $2 = HEAP32[$5 + 232 >> 2]; $1 = HEAP32[$5 + 236 >> 2]; break label$20; } HEAP32[2896] = 68; __floatsitf($5 + 208 | 0, $4); __multf3($5 + 192 | 0, HEAP32[$5 + 208 >> 2], HEAP32[$5 + 212 >> 2], HEAP32[$5 + 216 >> 2], HEAP32[$5 + 220 >> 2], 0, 0, 0, 65536); __multf3($5 + 176 | 0, HEAP32[$5 + 192 >> 2], HEAP32[$5 + 196 >> 2], HEAP32[$5 + 200 >> 2], HEAP32[$5 + 204 >> 2], 0, 0, 0, 65536); $10 = HEAP32[$5 + 176 >> 2]; $11 = HEAP32[$5 + 180 >> 2]; $2 = HEAP32[$5 + 184 >> 2]; $1 = HEAP32[$5 + 188 >> 2]; break label$20; } __extenddftf2($5 + 96 | 0, +($4 | 0) * 0.0); $10 = HEAP32[$5 + 96 >> 2]; $11 = HEAP32[$5 + 100 >> 2]; $2 = HEAP32[$5 + 104 >> 2]; $1 = HEAP32[$5 + 108 >> 2]; } HEAP32[$0 >> 2] = $10; HEAP32[$0 + 4 >> 2] = $11; HEAP32[$0 + 8 >> 2] = $2; HEAP32[$0 + 12 >> 2] = $1; global$0 = $5 + 432 | 0; } function decfloat($0, $1, $2, $3, $4, $5) { var $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0, $22 = 0, $23 = 0, $24 = 0.0, $25 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0; $6 = global$0 - 8976 | 0; global$0 = $6; $22 = $3 + $4 | 0; $25 = 0 - $22 | 0; label$1 : { label$2 : { while (1) { if (($2 | 0) != 48) { label$4 : { if (($2 | 0) != 46) { break label$1 } $2 = HEAP32[$1 + 4 >> 2]; if ($2 >>> 0 >= HEAPU32[$1 + 104 >> 2]) { break label$4 } HEAP32[$1 + 4 >> 2] = $2 + 1; $2 = HEAPU8[$2 | 0]; break label$2; } } else { $2 = HEAP32[$1 + 4 >> 2]; if ($2 >>> 0 < HEAPU32[$1 + 104 >> 2]) { $9 = 1; HEAP32[$1 + 4 >> 2] = $2 + 1; $2 = HEAPU8[$2 | 0]; } else { $9 = 1; $2 = __shgetc($1); } continue; } break; }; $2 = __shgetc($1); } $14 = 1; if (($2 | 0) != 48) { break label$1 } while (1) { $2 = HEAP32[$1 + 4 >> 2]; label$8 : { if ($2 >>> 0 < HEAPU32[$1 + 104 >> 2]) { HEAP32[$1 + 4 >> 2] = $2 + 1; $2 = HEAPU8[$2 | 0]; break label$8; } $2 = __shgetc($1); } $7 = $7 + -1 | 0; $8 = $8 + -1 | 0; if (($8 | 0) != -1) { $7 = $7 + 1 | 0 } if (($2 | 0) == 48) { continue } break; }; $9 = 1; } HEAP32[$6 + 784 >> 2] = 0; label$10 : { label$11 : { $12 = ($2 | 0) == 46; $13 = $2 + -48 | 0; label$13 : { label$14 : { label$15 : { if ($12 | $13 >>> 0 <= 9) { while (1) { label$19 : { if ($12 & 1) { if (!$14) { $8 = $10; $7 = $11; $14 = 1; break label$19; } $9 = !$9; break label$15; } $10 = $10 + 1 | 0; if ($10 >>> 0 < 1) { $11 = $11 + 1 | 0 } if (($15 | 0) <= 2044) { $20 = ($2 | 0) == 48 ? $20 : $10; $9 = ($6 + 784 | 0) + ($15 << 2) | 0; HEAP32[$9 >> 2] = $17 ? (Math_imul(HEAP32[$9 >> 2], 10) + $2 | 0) + -48 | 0 : $13; $9 = 1; $13 = $17 + 1 | 0; $2 = ($13 | 0) == 9; $17 = $2 ? 0 : $13; $15 = $2 + $15 | 0; break label$19; } if (($2 | 0) == 48) { break label$19 } HEAP32[$6 + 8960 >> 2] = HEAP32[$6 + 8960 >> 2] | 1; $20 = 18396; } $2 = HEAP32[$1 + 4 >> 2]; label$25 : { if ($2 >>> 0 < HEAPU32[$1 + 104 >> 2]) { HEAP32[$1 + 4 >> 2] = $2 + 1; $2 = HEAPU8[$2 | 0]; break label$25; } $2 = __shgetc($1); } $12 = ($2 | 0) == 46; $13 = $2 + -48 | 0; if ($12 | $13 >>> 0 < 10) { continue } break; } } $8 = $14 ? $8 : $10; $7 = $14 ? $7 : $11; if (!(!$9 | ($2 & -33) != 69)) { $12 = scanexp($1); $2 = i64toi32_i32$HIGH_BITS; $16 = $2; label$28 : { if ($12 | ($2 | 0) != -2147483648) { break label$28 } $12 = 0; $16 = 0; if (!HEAP32[$1 + 104 >> 2]) { break label$28 } HEAP32[$1 + 4 >> 2] = HEAP32[$1 + 4 >> 2] + -1; } if (!$9) { break label$13 } $7 = $7 + $16 | 0; $8 = $8 + $12 | 0; if ($8 >>> 0 < $12 >>> 0) { $7 = $7 + 1 | 0 } break label$11; } $9 = !$9; if (($2 | 0) < 0) { break label$14 } } if (!HEAP32[$1 + 104 >> 2]) { break label$14 } HEAP32[$1 + 4 >> 2] = HEAP32[$1 + 4 >> 2] + -1; } if (!$9) { break label$11 } } HEAP32[2896] = 28; $10 = 0; $11 = 0; __shlim($1); $2 = 0; $1 = 0; break label$10; } $1 = HEAP32[$6 + 784 >> 2]; if (!$1) { __extenddftf2($6, +($5 | 0) * 0.0); $10 = HEAP32[$6 >> 2]; $11 = HEAP32[$6 + 4 >> 2]; $2 = HEAP32[$6 + 8 >> 2]; $1 = HEAP32[$6 + 12 >> 2]; break label$10; } if (!(($8 | 0) != ($10 | 0) | ($7 | 0) != ($11 | 0) | (($11 | 0) > 0 ? 1 : ($11 | 0) >= 0 ? ($10 >>> 0 <= 9 ? 0 : 1) : 0) | ($1 >>> $3 | 0 ? ($3 | 0) <= 30 : 0))) { __floatsitf($6 + 48 | 0, $5); __floatunsitf($6 + 32 | 0, $1); __multf3($6 + 16 | 0, HEAP32[$6 + 48 >> 2], HEAP32[$6 + 52 >> 2], HEAP32[$6 + 56 >> 2], HEAP32[$6 + 60 >> 2], HEAP32[$6 + 32 >> 2], HEAP32[$6 + 36 >> 2], HEAP32[$6 + 40 >> 2], HEAP32[$6 + 44 >> 2]); $10 = HEAP32[$6 + 16 >> 2]; $11 = HEAP32[$6 + 20 >> 2]; $2 = HEAP32[$6 + 24 >> 2]; $1 = HEAP32[$6 + 28 >> 2]; break label$10; } if (($7 | 0) > 0 ? 1 : ($7 | 0) >= 0 ? ($8 >>> 0 <= ($4 | 0) / -2 >>> 0 ? 0 : 1) : 0) { HEAP32[2896] = 68; __floatsitf($6 + 96 | 0, $5); __multf3($6 + 80 | 0, HEAP32[$6 + 96 >> 2], HEAP32[$6 + 100 >> 2], HEAP32[$6 + 104 >> 2], HEAP32[$6 + 108 >> 2], -1, -1, -1, 2147418111); __multf3($6 - -64 | 0, HEAP32[$6 + 80 >> 2], HEAP32[$6 + 84 >> 2], HEAP32[$6 + 88 >> 2], HEAP32[$6 + 92 >> 2], -1, -1, -1, 2147418111); $10 = HEAP32[$6 + 64 >> 2]; $11 = HEAP32[$6 + 68 >> 2]; $2 = HEAP32[$6 + 72 >> 2]; $1 = HEAP32[$6 + 76 >> 2]; break label$10; } $1 = $4 + -226 | 0; $2 = $8 >>> 0 >= $1 >>> 0 ? 0 : 1; $1 = $1 >> 31; if (($7 | 0) < ($1 | 0) ? 1 : ($7 | 0) <= ($1 | 0) ? $2 : 0) { HEAP32[2896] = 68; __floatsitf($6 + 144 | 0, $5); __multf3($6 + 128 | 0, HEAP32[$6 + 144 >> 2], HEAP32[$6 + 148 >> 2], HEAP32[$6 + 152 >> 2], HEAP32[$6 + 156 >> 2], 0, 0, 0, 65536); __multf3($6 + 112 | 0, HEAP32[$6 + 128 >> 2], HEAP32[$6 + 132 >> 2], HEAP32[$6 + 136 >> 2], HEAP32[$6 + 140 >> 2], 0, 0, 0, 65536); $10 = HEAP32[$6 + 112 >> 2]; $11 = HEAP32[$6 + 116 >> 2]; $2 = HEAP32[$6 + 120 >> 2]; $1 = HEAP32[$6 + 124 >> 2]; break label$10; } if ($17) { if (($17 | 0) <= 8) { $2 = ($6 + 784 | 0) + ($15 << 2) | 0; $1 = HEAP32[$2 >> 2]; while (1) { $1 = Math_imul($1, 10); $17 = $17 + 1 | 0; if (($17 | 0) != 9) { continue } break; }; HEAP32[$2 >> 2] = $1; } $15 = $15 + 1 | 0; } label$36 : { $14 = $8; if (($20 | 0) > ($8 | 0) | ($20 | 0) >= 9 | ($8 | 0) > 17) { break label$36 } if (($14 | 0) == 9) { __floatsitf($6 + 192 | 0, $5); __floatunsitf($6 + 176 | 0, HEAP32[$6 + 784 >> 2]); __multf3($6 + 160 | 0, HEAP32[$6 + 192 >> 2], HEAP32[$6 + 196 >> 2], HEAP32[$6 + 200 >> 2], HEAP32[$6 + 204 >> 2], HEAP32[$6 + 176 >> 2], HEAP32[$6 + 180 >> 2], HEAP32[$6 + 184 >> 2], HEAP32[$6 + 188 >> 2]); $10 = HEAP32[$6 + 160 >> 2]; $11 = HEAP32[$6 + 164 >> 2]; $2 = HEAP32[$6 + 168 >> 2]; $1 = HEAP32[$6 + 172 >> 2]; break label$10; } if (($14 | 0) <= 8) { __floatsitf($6 + 272 | 0, $5); __floatunsitf($6 + 256 | 0, HEAP32[$6 + 784 >> 2]); __multf3($6 + 240 | 0, HEAP32[$6 + 272 >> 2], HEAP32[$6 + 276 >> 2], HEAP32[$6 + 280 >> 2], HEAP32[$6 + 284 >> 2], HEAP32[$6 + 256 >> 2], HEAP32[$6 + 260 >> 2], HEAP32[$6 + 264 >> 2], HEAP32[$6 + 268 >> 2]); __floatsitf($6 + 224 | 0, HEAP32[(0 - $14 << 2) + 10560 >> 2]); __divtf3($6 + 208 | 0, HEAP32[$6 + 240 >> 2], HEAP32[$6 + 244 >> 2], HEAP32[$6 + 248 >> 2], HEAP32[$6 + 252 >> 2], HEAP32[$6 + 224 >> 2], HEAP32[$6 + 228 >> 2], HEAP32[$6 + 232 >> 2], HEAP32[$6 + 236 >> 2]); $10 = HEAP32[$6 + 208 >> 2]; $11 = HEAP32[$6 + 212 >> 2]; $2 = HEAP32[$6 + 216 >> 2]; $1 = HEAP32[$6 + 220 >> 2]; break label$10; } $1 = (Math_imul($14, -3) + $3 | 0) + 27 | 0; $2 = HEAP32[$6 + 784 >> 2]; if ($2 >>> $1 | 0 ? ($1 | 0) <= 30 : 0) { break label$36 } __floatsitf($6 + 352 | 0, $5); __floatunsitf($6 + 336 | 0, $2); __multf3($6 + 320 | 0, HEAP32[$6 + 352 >> 2], HEAP32[$6 + 356 >> 2], HEAP32[$6 + 360 >> 2], HEAP32[$6 + 364 >> 2], HEAP32[$6 + 336 >> 2], HEAP32[$6 + 340 >> 2], HEAP32[$6 + 344 >> 2], HEAP32[$6 + 348 >> 2]); __floatsitf($6 + 304 | 0, HEAP32[($14 << 2) + 10488 >> 2]); __multf3($6 + 288 | 0, HEAP32[$6 + 320 >> 2], HEAP32[$6 + 324 >> 2], HEAP32[$6 + 328 >> 2], HEAP32[$6 + 332 >> 2], HEAP32[$6 + 304 >> 2], HEAP32[$6 + 308 >> 2], HEAP32[$6 + 312 >> 2], HEAP32[$6 + 316 >> 2]); $10 = HEAP32[$6 + 288 >> 2]; $11 = HEAP32[$6 + 292 >> 2]; $2 = HEAP32[$6 + 296 >> 2]; $1 = HEAP32[$6 + 300 >> 2]; break label$10; } while (1) { $2 = $15; $15 = $2 + -1 | 0; if (!HEAP32[($6 + 784 | 0) + ($15 << 2) >> 2]) { continue } break; }; $17 = 0; $1 = ($14 | 0) % 9 | 0; label$40 : { if (!$1) { $9 = 0; break label$40; } $13 = ($14 | 0) > -1 ? $1 : $1 + 9 | 0; label$42 : { if (!$2) { $9 = 0; $2 = 0; break label$42; } $8 = HEAP32[(0 - $13 << 2) + 10560 >> 2]; $10 = 1e9 / ($8 | 0) | 0; $12 = 0; $1 = 0; $9 = 0; while (1) { $11 = ($6 + 784 | 0) + ($1 << 2) | 0; $15 = HEAP32[$11 >> 2]; $16 = ($15 >>> 0) / ($8 >>> 0) | 0; $7 = $12 + $16 | 0; HEAP32[$11 >> 2] = $7; $7 = !$7 & ($1 | 0) == ($9 | 0); $9 = $7 ? $9 + 1 & 2047 : $9; $14 = $7 ? $14 + -9 | 0 : $14; $12 = Math_imul($10, $15 - Math_imul($8, $16) | 0); $1 = $1 + 1 | 0; if (($2 | 0) != ($1 | 0)) { continue } break; }; if (!$12) { break label$42 } HEAP32[($6 + 784 | 0) + ($2 << 2) >> 2] = $12; $2 = $2 + 1 | 0; } $14 = ($14 - $13 | 0) + 9 | 0; } while (1) { $11 = ($6 + 784 | 0) + ($9 << 2) | 0; label$46 : { while (1) { if (($14 | 0) != 36 | HEAPU32[$11 >> 2] >= 10384593 ? ($14 | 0) >= 36 : 0) { break label$46 } $15 = $2 + 2047 | 0; $12 = 0; $13 = $2; while (1) { $2 = $13; $10 = $15 & 2047; $13 = ($6 + 784 | 0) + ($10 << 2) | 0; $1 = HEAP32[$13 >> 2]; $7 = $1 >>> 3 | 0; $1 = $1 << 29; $8 = $1 + $12 | 0; if ($8 >>> 0 < $1 >>> 0) { $7 = $7 + 1 | 0 } $1 = 0; if (!(!$7 & $8 >>> 0 < 1000000001 | $7 >>> 0 < 0)) { $1 = __wasm_i64_udiv($8, $7, 1e9); $8 = $8 - __wasm_i64_mul($1, i64toi32_i32$HIGH_BITS, 1e9, 0) | 0; } $12 = $1; HEAP32[$13 >> 2] = $8; $13 = ($10 | 0) != ($2 + -1 & 2047) ? $2 : ($9 | 0) == ($10 | 0) ? $2 : $8 ? $2 : $10; $15 = $10 + -1 | 0; if (($9 | 0) != ($10 | 0)) { continue } break; }; $17 = $17 + -29 | 0; if (!$12) { continue } break; }; $9 = $9 + -1 & 2047; if (($13 | 0) == ($9 | 0)) { $1 = ($6 + 784 | 0) + (($13 + 2046 & 2047) << 2) | 0; $2 = $13 + -1 & 2047; HEAP32[$1 >> 2] = HEAP32[$1 >> 2] | HEAP32[($6 + 784 | 0) + ($2 << 2) >> 2]; } $14 = $14 + 9 | 0; HEAP32[($6 + 784 | 0) + ($9 << 2) >> 2] = $12; continue; } break; }; label$52 : { label$53 : while (1) { $8 = $2 + 1 & 2047; $10 = ($6 + 784 | 0) + (($2 + -1 & 2047) << 2) | 0; while (1) { $7 = ($14 | 0) > 45 ? 9 : 1; label$55 : { while (1) { $13 = $9; $1 = 0; label$57 : { while (1) { label$59 : { $9 = $1 + $13 & 2047; if (($9 | 0) == ($2 | 0)) { break label$59 } $9 = HEAP32[($6 + 784 | 0) + ($9 << 2) >> 2]; $11 = HEAP32[($1 << 2) + 10512 >> 2]; if ($9 >>> 0 < $11 >>> 0) { break label$59 } if ($9 >>> 0 > $11 >>> 0) { break label$57 } $1 = $1 + 1 | 0; if (($1 | 0) != 4) { continue } } break; }; if (($14 | 0) != 36) { break label$57 } $8 = 0; $7 = 0; $1 = 0; $10 = 0; $11 = 0; while (1) { $9 = $1 + $13 & 2047; if (($9 | 0) == ($2 | 0)) { $2 = $2 + 1 & 2047; HEAP32[(($2 << 2) + $6 | 0) + 780 >> 2] = 0; } __multf3($6 + 768 | 0, $8, $7, $10, $11, 0, 0, 1342177280, 1075633366); __floatunsitf($6 + 752 | 0, HEAP32[($6 + 784 | 0) + ($9 << 2) >> 2]); __addtf3($6 + 736 | 0, HEAP32[$6 + 768 >> 2], HEAP32[$6 + 772 >> 2], HEAP32[$6 + 776 >> 2], HEAP32[$6 + 780 >> 2], HEAP32[$6 + 752 >> 2], HEAP32[$6 + 756 >> 2], HEAP32[$6 + 760 >> 2], HEAP32[$6 + 764 >> 2]); $10 = HEAP32[$6 + 744 >> 2]; $11 = HEAP32[$6 + 748 >> 2]; $8 = HEAP32[$6 + 736 >> 2]; $7 = HEAP32[$6 + 740 >> 2]; $1 = $1 + 1 | 0; if (($1 | 0) != 4) { continue } break; }; __floatsitf($6 + 720 | 0, $5); __multf3($6 + 704 | 0, $8, $7, $10, $11, HEAP32[$6 + 720 >> 2], HEAP32[$6 + 724 >> 2], HEAP32[$6 + 728 >> 2], HEAP32[$6 + 732 >> 2]); $10 = HEAP32[$6 + 712 >> 2]; $11 = HEAP32[$6 + 716 >> 2]; $8 = 0; $7 = 0; $12 = HEAP32[$6 + 704 >> 2]; $16 = HEAP32[$6 + 708 >> 2]; $23 = $17 + 113 | 0; $4 = $23 - $4 | 0; $20 = ($4 | 0) < ($3 | 0); $1 = $20 ? (($4 | 0) > 0 ? $4 : 0) : $3; if (($1 | 0) <= 112) { break label$55 } $14 = 0; $15 = 0; $9 = 0; $3 = 0; break label$52; } $17 = $7 + $17 | 0; $9 = $2; if (($2 | 0) == ($13 | 0)) { continue } break; }; $11 = 1e9 >>> $7 | 0; $12 = -1 << $7 ^ -1; $1 = 0; $9 = $13; while (1) { $15 = ($6 + 784 | 0) + ($13 << 2) | 0; $16 = HEAP32[$15 >> 2]; $1 = $1 + ($16 >>> $7 | 0) | 0; HEAP32[$15 >> 2] = $1; $1 = !$1 & ($9 | 0) == ($13 | 0); $9 = $1 ? $9 + 1 & 2047 : $9; $14 = $1 ? $14 + -9 | 0 : $14; $1 = Math_imul($11, $12 & $16); $13 = $13 + 1 & 2047; if (($13 | 0) != ($2 | 0)) { continue } break; }; if (!$1) { continue } if (($8 | 0) != ($9 | 0)) { HEAP32[($6 + 784 | 0) + ($2 << 2) >> 2] = $1; $2 = $8; continue label$53; } HEAP32[$10 >> 2] = HEAP32[$10 >> 2] | 1; $9 = $8; continue; } break; }; break; }; __extenddftf2($6 + 656 | 0, scalbn(1.0, 225 - $1 | 0)); copysignl($6 + 688 | 0, HEAP32[$6 + 656 >> 2], HEAP32[$6 + 660 >> 2], HEAP32[$6 + 664 >> 2], HEAP32[$6 + 668 >> 2], $12, $16, $10, $11); $9 = HEAP32[$6 + 696 >> 2]; $3 = HEAP32[$6 + 700 >> 2]; $14 = HEAP32[$6 + 688 >> 2]; $15 = HEAP32[$6 + 692 >> 2]; __extenddftf2($6 + 640 | 0, scalbn(1.0, 113 - $1 | 0)); fmodl($6 + 672 | 0, $12, $16, $10, $11, HEAP32[$6 + 640 >> 2], HEAP32[$6 + 644 >> 2], HEAP32[$6 + 648 >> 2], HEAP32[$6 + 652 >> 2]); $8 = HEAP32[$6 + 672 >> 2]; $7 = HEAP32[$6 + 676 >> 2]; $18 = HEAP32[$6 + 680 >> 2]; $19 = HEAP32[$6 + 684 >> 2]; __subtf3($6 + 624 | 0, $12, $16, $10, $11, $8, $7, $18, $19); __addtf3($6 + 608 | 0, $14, $15, $9, $3, HEAP32[$6 + 624 >> 2], HEAP32[$6 + 628 >> 2], HEAP32[$6 + 632 >> 2], HEAP32[$6 + 636 >> 2]); $10 = HEAP32[$6 + 616 >> 2]; $11 = HEAP32[$6 + 620 >> 2]; $12 = HEAP32[$6 + 608 >> 2]; $16 = HEAP32[$6 + 612 >> 2]; } $21 = $13 + 4 & 2047; label$64 : { if (($21 | 0) == ($2 | 0)) { break label$64 } $21 = HEAP32[($6 + 784 | 0) + ($21 << 2) >> 2]; label$65 : { if ($21 >>> 0 <= 499999999) { if (($13 + 5 & 2047) == ($2 | 0) ? !$21 : 0) { break label$65 } __extenddftf2($6 + 496 | 0, +($5 | 0) * .25); __addtf3($6 + 480 | 0, $8, $7, $18, $19, HEAP32[$6 + 496 >> 2], HEAP32[$6 + 500 >> 2], HEAP32[$6 + 504 >> 2], HEAP32[$6 + 508 >> 2]); $18 = HEAP32[$6 + 488 >> 2]; $19 = HEAP32[$6 + 492 >> 2]; $8 = HEAP32[$6 + 480 >> 2]; $7 = HEAP32[$6 + 484 >> 2]; break label$65; } if (($21 | 0) != 5e8) { __extenddftf2($6 + 592 | 0, +($5 | 0) * .75); __addtf3($6 + 576 | 0, $8, $7, $18, $19, HEAP32[$6 + 592 >> 2], HEAP32[$6 + 596 >> 2], HEAP32[$6 + 600 >> 2], HEAP32[$6 + 604 >> 2]); $18 = HEAP32[$6 + 584 >> 2]; $19 = HEAP32[$6 + 588 >> 2]; $8 = HEAP32[$6 + 576 >> 2]; $7 = HEAP32[$6 + 580 >> 2]; break label$65; } $24 = +($5 | 0); if (($13 + 5 & 2047) == ($2 | 0)) { __extenddftf2($6 + 528 | 0, $24 * .5); __addtf3($6 + 512 | 0, $8, $7, $18, $19, HEAP32[$6 + 528 >> 2], HEAP32[$6 + 532 >> 2], HEAP32[$6 + 536 >> 2], HEAP32[$6 + 540 >> 2]); $18 = HEAP32[$6 + 520 >> 2]; $19 = HEAP32[$6 + 524 >> 2]; $8 = HEAP32[$6 + 512 >> 2]; $7 = HEAP32[$6 + 516 >> 2]; break label$65; } __extenddftf2($6 + 560 | 0, $24 * .75); __addtf3($6 + 544 | 0, $8, $7, $18, $19, HEAP32[$6 + 560 >> 2], HEAP32[$6 + 564 >> 2], HEAP32[$6 + 568 >> 2], HEAP32[$6 + 572 >> 2]); $18 = HEAP32[$6 + 552 >> 2]; $19 = HEAP32[$6 + 556 >> 2]; $8 = HEAP32[$6 + 544 >> 2]; $7 = HEAP32[$6 + 548 >> 2]; } if (($1 | 0) > 111) { break label$64 } fmodl($6 + 464 | 0, $8, $7, $18, $19, 0, 0, 0, 1073676288); if (__letf2(HEAP32[$6 + 464 >> 2], HEAP32[$6 + 468 >> 2], HEAP32[$6 + 472 >> 2], HEAP32[$6 + 476 >> 2], 0, 0, 0, 0)) { break label$64 } __addtf3($6 + 448 | 0, $8, $7, $18, $19, 0, 0, 0, 1073676288); $18 = HEAP32[$6 + 456 >> 2]; $19 = HEAP32[$6 + 460 >> 2]; $8 = HEAP32[$6 + 448 >> 2]; $7 = HEAP32[$6 + 452 >> 2]; } __addtf3($6 + 432 | 0, $12, $16, $10, $11, $8, $7, $18, $19); __subtf3($6 + 416 | 0, HEAP32[$6 + 432 >> 2], HEAP32[$6 + 436 >> 2], HEAP32[$6 + 440 >> 2], HEAP32[$6 + 444 >> 2], $14, $15, $9, $3); $10 = HEAP32[$6 + 424 >> 2]; $11 = HEAP32[$6 + 428 >> 2]; $12 = HEAP32[$6 + 416 >> 2]; $16 = HEAP32[$6 + 420 >> 2]; label$69 : { if (($23 & 2147483647) <= (-2 - $22 | 0)) { break label$69 } $2 = $6 + 400 | 0; HEAP32[$2 + 8 >> 2] = $10; HEAP32[$2 + 12 >> 2] = $11 & 2147483647; HEAP32[$2 >> 2] = $12; HEAP32[$2 + 4 >> 2] = $16; __multf3($6 + 384 | 0, $12, $16, $10, $11, 0, 0, 0, 1073610752); $3 = __getf2(HEAP32[$6 + 400 >> 2], HEAP32[$6 + 404 >> 2], HEAP32[$6 + 408 >> 2], HEAP32[$6 + 412 >> 2], 1081081856); $2 = ($3 | 0) < 0; $10 = $2 ? $10 : HEAP32[$6 + 392 >> 2]; $11 = $2 ? $11 : HEAP32[$6 + 396 >> 2]; $12 = $2 ? $12 : HEAP32[$6 + 384 >> 2]; $16 = $2 ? $16 : HEAP32[$6 + 388 >> 2]; $17 = (($3 | 0) > -1) + $17 | 0; if (wasm2js_i32$0 = !($20 & ($2 | ($1 | 0) != ($4 | 0)) & (__letf2($8, $7, $18, $19, 0, 0, 0, 0) | 0) != 0), wasm2js_i32$1 = 0, wasm2js_i32$2 = ($17 + 110 | 0) <= ($25 | 0), wasm2js_i32$2 ? wasm2js_i32$0 : wasm2js_i32$1) { break label$69 } HEAP32[2896] = 68; } scalbnl($6 + 368 | 0, $12, $16, $10, $11, $17); $10 = HEAP32[$6 + 368 >> 2]; $11 = HEAP32[$6 + 372 >> 2]; $2 = HEAP32[$6 + 376 >> 2]; $1 = HEAP32[$6 + 380 >> 2]; } HEAP32[$0 >> 2] = $10; HEAP32[$0 + 4 >> 2] = $11; HEAP32[$0 + 8 >> 2] = $2; HEAP32[$0 + 12 >> 2] = $1; global$0 = $6 + 8976 | 0; } function scanexp($0) { var $1 = 0, $2 = 0, $3 = 0, $4 = 0, $5 = 0; label$1 : { label$2 : { label$3 : { $3 = HEAP32[$0 + 4 >> 2]; label$4 : { if ($3 >>> 0 < HEAPU32[$0 + 104 >> 2]) { HEAP32[$0 + 4 >> 2] = $3 + 1; $2 = HEAPU8[$3 | 0]; break label$4; } $2 = __shgetc($0); } switch ($2 + -43 | 0) { case 0: case 2: break label$2; default: break label$3; }; } $1 = $2 + -48 | 0; break label$1; } $5 = ($2 | 0) == 45; $3 = HEAP32[$0 + 4 >> 2]; label$6 : { if ($3 >>> 0 < HEAPU32[$0 + 104 >> 2]) { HEAP32[$0 + 4 >> 2] = $3 + 1; $2 = HEAPU8[$3 | 0]; break label$6; } $2 = __shgetc($0); } $1 = $2 + -48 | 0; if (!($1 >>> 0 < 10 | !HEAP32[$0 + 104 >> 2])) { HEAP32[$0 + 4 >> 2] = HEAP32[$0 + 4 >> 2] + -1 } } label$9 : { if ($1 >>> 0 < 10) { $1 = 0; while (1) { $1 = Math_imul($1, 10) + $2 | 0; $3 = HEAP32[$0 + 4 >> 2]; label$12 : { if ($3 >>> 0 < HEAPU32[$0 + 104 >> 2]) { HEAP32[$0 + 4 >> 2] = $3 + 1; $2 = HEAPU8[$3 | 0]; break label$12; } $2 = __shgetc($0); } $4 = $2 + -48 | 0; $1 = $1 + -48 | 0; if (($1 | 0) < 214748364 ? $4 >>> 0 <= 9 : 0) { continue } break; }; $3 = $1; $1 = $1 >> 31; label$14 : { if ($4 >>> 0 >= 10) { break label$14 } while (1) { $1 = __wasm_i64_mul($3, $1, 10, 0); $3 = $1 + $2 | 0; $2 = i64toi32_i32$HIGH_BITS; $4 = $3 >>> 0 < $1 >>> 0 ? $2 + 1 | 0 : $2; $1 = HEAP32[$0 + 4 >> 2]; label$16 : { if ($1 >>> 0 < HEAPU32[$0 + 104 >> 2]) { HEAP32[$0 + 4 >> 2] = $1 + 1; $2 = HEAPU8[$1 | 0]; break label$16; } $2 = __shgetc($0); } $1 = $4 + -1 | 0; $3 = $3 + -48 | 0; if ($3 >>> 0 < 4294967248) { $1 = $1 + 1 | 0 } $4 = $2 + -48 | 0; if ($4 >>> 0 > 9) { break label$14 } if (($1 | 0) < 21474836 ? 1 : ($1 | 0) <= 21474836 ? ($3 >>> 0 >= 2061584302 ? 0 : 1) : 0) { continue } break; }; } if ($4 >>> 0 < 10) { while (1) { $2 = HEAP32[$0 + 4 >> 2]; label$20 : { if ($2 >>> 0 < HEAPU32[$0 + 104 >> 2]) { HEAP32[$0 + 4 >> 2] = $2 + 1; $2 = HEAPU8[$2 | 0]; break label$20; } $2 = __shgetc($0); } if ($2 + -48 >>> 0 < 10) { continue } break; } } if (HEAP32[$0 + 104 >> 2]) { HEAP32[$0 + 4 >> 2] = HEAP32[$0 + 4 >> 2] + -1 } $0 = $3; $3 = $5 ? 0 - $0 | 0 : $0; $1 = $5 ? 0 - ($1 + (0 < $0 >>> 0) | 0) | 0 : $1; break label$9; } $3 = 0; $1 = -2147483648; if (!HEAP32[$0 + 104 >> 2]) { break label$9 } HEAP32[$0 + 4 >> 2] = HEAP32[$0 + 4 >> 2] + -1; i64toi32_i32$HIGH_BITS = -2147483648; return 0; } i64toi32_i32$HIGH_BITS = $1; return $3; } function strtox($0, $1) { var $2 = 0, $3 = 0, $4 = 0; $2 = global$0 - 160 | 0; global$0 = $2; memset($2 + 16 | 0, 144); HEAP32[$2 + 92 >> 2] = -1; HEAP32[$2 + 60 >> 2] = $1; HEAP32[$2 + 24 >> 2] = -1; HEAP32[$2 + 20 >> 2] = $1; __shlim($2 + 16 | 0); __floatscan($2, $2 + 16 | 0); $1 = HEAP32[$2 + 8 >> 2]; $3 = HEAP32[$2 + 12 >> 2]; $4 = HEAP32[$2 + 4 >> 2]; HEAP32[$0 >> 2] = HEAP32[$2 >> 2]; HEAP32[$0 + 4 >> 2] = $4; HEAP32[$0 + 8 >> 2] = $1; HEAP32[$0 + 12 >> 2] = $3; global$0 = $2 + 160 | 0; } function strtod($0) { var $1 = 0, $2 = 0.0; $1 = global$0 - 16 | 0; global$0 = $1; strtox($1, $0); $2 = __trunctfdf2(HEAP32[$1 >> 2], HEAP32[$1 + 4 >> 2], HEAP32[$1 + 8 >> 2], HEAP32[$1 + 12 >> 2]); global$0 = $1 + 16 | 0; return $2; } function FLAC__stream_encoder_new() { var $0 = 0, $1 = 0, $2 = 0, $3 = 0; $1 = dlcalloc(1, 8); if (!$1) { return 0 } $0 = dlcalloc(1, 1032); HEAP32[$1 >> 2] = $0; label$2 : { if (!$0) { break label$2 } $3 = dlcalloc(1, 11856); HEAP32[$1 + 4 >> 2] = $3; if (!$3) { dlfree($0); break label$2; } $0 = dlcalloc(1, 20); $3 = HEAP32[$1 + 4 >> 2]; HEAP32[$3 + 6856 >> 2] = $0; if (!$0) { dlfree($3); dlfree(HEAP32[$1 >> 2]); break label$2; } HEAP32[$3 + 7296 >> 2] = 0; $0 = HEAP32[$1 >> 2]; HEAP32[$0 + 44 >> 2] = 13; HEAP32[$0 + 48 >> 2] = 1056964608; HEAP32[$0 + 36 >> 2] = 0; HEAP32[$0 + 40 >> 2] = 1; HEAP32[$0 + 28 >> 2] = 16; HEAP32[$0 + 32 >> 2] = 44100; HEAP32[$0 + 20 >> 2] = 0; HEAP32[$0 + 24 >> 2] = 2; HEAP32[$0 + 12 >> 2] = 1; HEAP32[$0 + 16 >> 2] = 0; HEAP32[$0 + 4 >> 2] = 0; HEAP32[$0 + 8 >> 2] = 1; $0 = HEAP32[$1 >> 2]; HEAP32[$0 + 592 >> 2] = 0; HEAP32[$0 + 596 >> 2] = 0; HEAP32[$0 + 556 >> 2] = 0; HEAP32[$0 + 560 >> 2] = 0; HEAP32[$0 + 564 >> 2] = 0; HEAP32[$0 + 568 >> 2] = 0; HEAP32[$0 + 572 >> 2] = 0; HEAP32[$0 + 576 >> 2] = 0; HEAP32[$0 + 580 >> 2] = 0; HEAP32[$0 + 584 >> 2] = 0; HEAP32[$0 + 600 >> 2] = 0; HEAP32[$0 + 604 >> 2] = 0; $3 = HEAP32[$1 + 4 >> 2]; $2 = $3; HEAP32[$2 + 7248 >> 2] = 0; HEAP32[$2 + 7252 >> 2] = 0; HEAP32[$2 + 7048 >> 2] = 0; $2 = $2 + 7256 | 0; HEAP32[$2 >> 2] = 0; HEAP32[$2 + 4 >> 2] = 0; $2 = $3 + 7264 | 0; HEAP32[$2 >> 2] = 0; HEAP32[$2 + 4 >> 2] = 0; $2 = $3 + 7272 | 0; HEAP32[$2 >> 2] = 0; HEAP32[$2 + 4 >> 2] = 0; $2 = $3 + 7280 | 0; HEAP32[$2 >> 2] = 0; HEAP32[$2 + 4 >> 2] = 0; HEAP32[$3 + 7288 >> 2] = 0; FLAC__ogg_encoder_aspect_set_defaults($0 + 632 | 0); $0 = HEAP32[$1 >> 2]; label$5 : { if (HEAP32[$0 >> 2] != 1) { break label$5 } HEAP32[$0 + 16 >> 2] = 1; HEAP32[$0 + 20 >> 2] = 0; FLAC__stream_encoder_set_apodization($1, 10777); $0 = HEAP32[$1 >> 2]; if (HEAP32[$0 >> 2] != 1) { break label$5 } HEAP32[$0 + 576 >> 2] = 0; HEAP32[$0 + 580 >> 2] = 5; HEAP32[$0 + 564 >> 2] = 0; HEAP32[$0 + 568 >> 2] = 0; HEAP32[$0 + 556 >> 2] = 8; HEAP32[$0 + 560 >> 2] = 0; } $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 11848 >> 2] = 0; HEAP32[$0 + 6176 >> 2] = $0 + 336; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6180 >> 2] = $0 + 628; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6184 >> 2] = $0 + 920; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6188 >> 2] = $0 + 1212; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6192 >> 2] = $0 + 1504; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6196 >> 2] = $0 + 1796; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6200 >> 2] = $0 + 2088; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6204 >> 2] = $0 + 2380; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6208 >> 2] = $0 + 2672; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6212 >> 2] = $0 + 2964; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6216 >> 2] = $0 + 3256; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6220 >> 2] = $0 + 3548; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6224 >> 2] = $0 + 3840; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6228 >> 2] = $0 + 4132; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6232 >> 2] = $0 + 4424; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6236 >> 2] = $0 + 4716; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6240 >> 2] = $0 + 5008; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6244 >> 2] = $0 + 5300; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6248 >> 2] = $0 + 5592; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6252 >> 2] = $0 + 5884; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6640 >> 2] = $0 + 6256; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6644 >> 2] = $0 + 6268; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6648 >> 2] = $0 + 6280; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6652 >> 2] = $0 + 6292; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6656 >> 2] = $0 + 6304; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6660 >> 2] = $0 + 6316; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6664 >> 2] = $0 + 6328; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6668 >> 2] = $0 + 6340; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6672 >> 2] = $0 + 6352; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6676 >> 2] = $0 + 6364; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6680 >> 2] = $0 + 6376; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6684 >> 2] = $0 + 6388; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6688 >> 2] = $0 + 6400; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6692 >> 2] = $0 + 6412; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6696 >> 2] = $0 + 6424; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6700 >> 2] = $0 + 6436; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6704 >> 2] = $0 + 6448; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6708 >> 2] = $0 + 6460; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6712 >> 2] = $0 + 6472; $0 = HEAP32[$1 + 4 >> 2]; HEAP32[$0 + 6716 >> 2] = $0 + 6484; FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6256 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6268 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6280 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6292 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6304 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6316 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6328 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6340 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6352 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6364 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6376 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6388 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6400 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6412 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6424 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6436 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6448 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6460 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6472 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 6484 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 11724 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(HEAP32[$1 + 4 >> 2] + 11736 | 0); HEAP32[HEAP32[$1 >> 2] >> 2] = 1; return $1 | 0; } dlfree($1); return 0; } function FLAC__stream_encoder_set_apodization($0, $1) { var $2 = 0, $3 = 0, $4 = 0, $5 = Math_fround(0), $6 = Math_fround(0), $7 = 0, $8 = 0.0, $9 = Math_fround(0), $10 = 0, $11 = 0; $2 = HEAP32[$0 >> 2]; label$1 : { if (HEAP32[$2 >> 2] != 1) { break label$1 } HEAP32[$2 + 40 >> 2] = 0; while (1) { label$3 : { label$4 : { label$5 : { label$6 : { label$7 : { label$8 : { label$9 : { label$10 : { label$11 : { label$12 : { label$13 : { label$14 : { label$15 : { label$16 : { $10 = strchr($1, 59); label$17 : { if ($10) { $4 = $10 - $1 | 0; break label$17; } $4 = strlen($1); } $11 = ($4 | 0) != 8; if (!$11) { if (strncmp(10584, $1, 8)) { break label$16 } HEAP32[$2 + 40 >> 2] = $3 + 1; HEAP32[(($3 << 4) + $2 | 0) + 44 >> 2] = 0; break label$3; } label$20 : { switch ($4 + -6 | 0) { case 1: break label$13; case 0: break label$14; case 20: break label$15; case 7: break label$20; default: break label$12; }; } $7 = 1; if (strncmp(10593, $1, 13)) { break label$11 } HEAP32[$2 + 40 >> 2] = $3 + 1; HEAP32[(($3 << 4) + $2 | 0) + 44 >> 2] = 1; break label$3; } $7 = 0; if (strncmp(10607, $1, 8)) { break label$11 } HEAP32[$2 + 40 >> 2] = $3 + 1; HEAP32[(($3 << 4) + $2 | 0) + 44 >> 2] = 2; break label$3; } $7 = 0; if (strncmp(10616, $1, 26)) { break label$11 } HEAP32[$2 + 40 >> 2] = $3 + 1; HEAP32[(($3 << 4) + $2 | 0) + 44 >> 2] = 3; break label$3; } if (strncmp(10643, $1, 6)) { break label$3 } HEAP32[$2 + 40 >> 2] = $3 + 1; HEAP32[(($3 << 4) + $2 | 0) + 44 >> 2] = 4; break label$3; } if (strncmp(10650, $1, 7)) { break label$10 } HEAP32[$2 + 40 >> 2] = $3 + 1; HEAP32[(($3 << 4) + $2 | 0) + 44 >> 2] = 5; break label$3; } $7 = 0; if ($4 >>> 0 < 8) { break label$9 } } if (strncmp(10658, $1, 6)) { break label$8 } $6 = Math_fround(strtod($1 + 6 | 0)); if ($6 > Math_fround(0.0) ^ 1 | $6 <= Math_fround(.5) ^ 1) { break label$3 } $1 = HEAP32[$0 >> 2]; HEAPF32[((HEAP32[$1 + 40 >> 2] << 4) + $1 | 0) + 48 >> 2] = $6; $1 = HEAP32[$0 >> 2]; $4 = HEAP32[$1 + 40 >> 2]; HEAP32[$1 + 40 >> 2] = $4 + 1; HEAP32[($1 + ($4 << 4) | 0) + 44 >> 2] = 6; break label$3; } if (strncmp(10665, $1, 7)) { break label$7 } HEAP32[$2 + 40 >> 2] = $3 + 1; HEAP32[(($3 << 4) + $2 | 0) + 44 >> 2] = 7; break label$3; } label$21 : { switch ($4 + -4 | 0) { case 0: break label$21; case 1: break label$5; default: break label$3; }; } if (strncmp(10673, $1, 4)) { break label$3 } HEAP32[$2 + 40 >> 2] = $3 + 1; HEAP32[(($3 << 4) + $2 | 0) + 44 >> 2] = 8; break label$3; } if (!$7) { break label$6 } if (strncmp(10678, $1, 13)) { break label$6 } HEAP32[$2 + 40 >> 2] = $3 + 1; HEAP32[(($3 << 4) + $2 | 0) + 44 >> 2] = 9; break label$3; } if (strncmp(10692, $1, 7)) { break label$3 } HEAP32[$2 + 40 >> 2] = $3 + 1; HEAP32[(($3 << 4) + $2 | 0) + 44 >> 2] = 10; break label$3; } label$22 : { if (($4 | 0) != 9) { break label$22 } if (strncmp(10700, $1, 9)) { break label$22 } HEAP32[$2 + 40 >> 2] = $3 + 1; HEAP32[(($3 << 4) + $2 | 0) + 44 >> 2] = 11; break label$3; } if (!$11) { if (!strncmp(10710, $1, 8)) { HEAP32[$2 + 40 >> 2] = $3 + 1; HEAP32[(($3 << 4) + $2 | 0) + 44 >> 2] = 12; break label$3; } if (strncmp(10719, $1, 6)) { break label$3 } break label$4; } if (!strncmp(10719, $1, 6)) { break label$4 } if ($4 >>> 0 < 16) { break label$3 } if (!strncmp(10726, $1, 14)) { $8 = strtod($1 + 14 | 0); label$26 : { if (Math_abs($8) < 2147483648.0) { $4 = ~~$8; break label$26; } $4 = -2147483648; } $3 = strchr($1, 47); $5 = Math_fround(.10000000149011612); label$28 : { if (!$3) { break label$28 } $2 = $3 + 1 | 0; $5 = Math_fround(.9900000095367432); if (!(Math_fround(strtod($2)) < Math_fround(.9900000095367432))) { break label$28 } $5 = Math_fround(strtod($2)); } $1 = strchr($3 ? $3 + 1 | 0 : $1, 47); $6 = Math_fround(.20000000298023224); label$30 : { if (!$1) { break label$30 } $6 = Math_fround(strtod($1 + 1 | 0)); } $1 = HEAP32[$0 >> 2]; $2 = HEAP32[$1 + 40 >> 2]; if (($4 | 0) <= 1) { HEAPF32[(($2 << 4) + $1 | 0) + 48 >> 2] = $6; $1 = HEAP32[$0 >> 2]; $4 = HEAP32[$1 + 40 >> 2]; HEAP32[$1 + 40 >> 2] = $4 + 1; HEAP32[($1 + ($4 << 4) | 0) + 44 >> 2] = 13; break label$3; } if ($2 + $4 >>> 0 > 31) { break label$3 } $9 = Math_fround(Math_fround(Math_fround(1.0) / Math_fround(Math_fround(1.0) - $5)) + Math_fround(-1.0)); $5 = Math_fround($9 + Math_fround($4 | 0)); $3 = 0; while (1) { HEAPF32[(($2 << 4) + $1 | 0) + 48 >> 2] = $6; $1 = HEAP32[$0 >> 2]; HEAPF32[((HEAP32[$1 + 40 >> 2] << 4) + $1 | 0) + 52 >> 2] = Math_fround($3 | 0) / $5; $1 = HEAP32[$0 >> 2]; $3 = $3 + 1 | 0; HEAPF32[((HEAP32[$1 + 40 >> 2] << 4) + $1 | 0) + 56 >> 2] = Math_fround($9 + Math_fround($3 | 0)) / $5; $1 = HEAP32[$0 >> 2]; $7 = HEAP32[$1 + 40 >> 2]; $2 = $7 + 1 | 0; HEAP32[$1 + 40 >> 2] = $2; HEAP32[(($7 << 4) + $1 | 0) + 44 >> 2] = 14; if (($3 | 0) != ($4 | 0)) { continue } break; }; break label$3; } if ($4 >>> 0 < 17) { break label$3 } if (strncmp(10741, $1, 15)) { break label$3 } $8 = strtod($1 + 15 | 0); label$33 : { if (Math_abs($8) < 2147483648.0) { $4 = ~~$8; break label$33; } $4 = -2147483648; } $6 = Math_fround(.20000000298023224); $3 = strchr($1, 47); $5 = Math_fround(.20000000298023224); label$35 : { if (!$3) { break label$35 } $2 = $3 + 1 | 0; $5 = Math_fround(.9900000095367432); if (!(Math_fround(strtod($2)) < Math_fround(.9900000095367432))) { break label$35 } $5 = Math_fround(strtod($2)); } $1 = strchr($3 ? $3 + 1 | 0 : $1, 47); if ($1) { $6 = Math_fround(strtod($1 + 1 | 0)) } $1 = HEAP32[$0 >> 2]; $2 = HEAP32[$1 + 40 >> 2]; if (($4 | 0) <= 1) { HEAPF32[(($2 << 4) + $1 | 0) + 48 >> 2] = $6; $1 = HEAP32[$0 >> 2]; $4 = HEAP32[$1 + 40 >> 2]; HEAP32[$1 + 40 >> 2] = $4 + 1; HEAP32[($1 + ($4 << 4) | 0) + 44 >> 2] = 13; break label$3; } if ($2 + $4 >>> 0 > 31) { break label$3 } $9 = Math_fround(Math_fround(Math_fround(1.0) / Math_fround(Math_fround(1.0) - $5)) + Math_fround(-1.0)); $5 = Math_fround($9 + Math_fround($4 | 0)); $3 = 0; while (1) { HEAPF32[(($2 << 4) + $1 | 0) + 48 >> 2] = $6; $1 = HEAP32[$0 >> 2]; HEAPF32[((HEAP32[$1 + 40 >> 2] << 4) + $1 | 0) + 52 >> 2] = Math_fround($3 | 0) / $5; $1 = HEAP32[$0 >> 2]; $3 = $3 + 1 | 0; HEAPF32[((HEAP32[$1 + 40 >> 2] << 4) + $1 | 0) + 56 >> 2] = Math_fround($9 + Math_fround($3 | 0)) / $5; $1 = HEAP32[$0 >> 2]; $7 = HEAP32[$1 + 40 >> 2]; $2 = $7 + 1 | 0; HEAP32[$1 + 40 >> 2] = $2; HEAP32[(($7 << 4) + $1 | 0) + 44 >> 2] = 15; if (($3 | 0) != ($4 | 0)) { continue } break; }; break label$3; } if (strncmp(10757, $1, 5)) { break label$3 } HEAP32[$2 + 40 >> 2] = $3 + 1; HEAP32[(($3 << 4) + $2 | 0) + 44 >> 2] = 16; break label$3; } $6 = Math_fround(strtod($1 + 6 | 0)); if ($6 >= Math_fround(0.0) ^ 1 | $6 <= Math_fround(1.0) ^ 1) { break label$3 } $1 = HEAP32[$0 >> 2]; HEAPF32[((HEAP32[$1 + 40 >> 2] << 4) + $1 | 0) + 48 >> 2] = $6; $1 = HEAP32[$0 >> 2]; $4 = HEAP32[$1 + 40 >> 2]; HEAP32[$1 + 40 >> 2] = $4 + 1; HEAP32[($1 + ($4 << 4) | 0) + 44 >> 2] = 13; } $2 = HEAP32[$0 >> 2]; $3 = HEAP32[$2 + 40 >> 2]; if ($10) { $1 = $10 + 1 | 0; if (($3 | 0) != 32) { continue } } break; }; $4 = 1; if ($3) { break label$1 } HEAP32[$2 + 40 >> 2] = 1; HEAP32[$2 + 44 >> 2] = 13; HEAP32[$2 + 48 >> 2] = 1056964608; } return $4; } function FLAC__stream_encoder_delete($0) { $0 = $0 | 0; var $1 = 0, $2 = 0; if ($0) { HEAP32[HEAP32[$0 + 4 >> 2] + 11848 >> 2] = 1; FLAC__stream_encoder_finish($0); $1 = HEAP32[$0 + 4 >> 2]; $2 = HEAP32[$1 + 11752 >> 2]; if ($2) { FLAC__stream_decoder_delete($2); $1 = HEAP32[$0 + 4 >> 2]; } FLAC__format_entropy_coding_method_partitioned_rice_contents_clear($1 + 6256 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6268 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6280 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6292 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6304 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6316 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6328 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6340 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6352 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6364 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6376 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6388 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6400 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6412 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6424 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6436 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6448 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6460 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6472 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 6484 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 11724 | 0); FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(HEAP32[$0 + 4 >> 2] + 11736 | 0); FLAC__bitreader_delete(HEAP32[HEAP32[$0 + 4 >> 2] + 6856 >> 2]); dlfree(HEAP32[$0 + 4 >> 2]); dlfree(HEAP32[$0 >> 2]); dlfree($0); } } function FLAC__stream_encoder_finish($0) { $0 = $0 | 0; var $1 = 0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0; $7 = global$0 - 32 | 0; global$0 = $7; label$1 : { if (!$0) { break label$1 } label$3 : { label$4 : { $5 = HEAP32[$0 >> 2]; $1 = HEAP32[$5 >> 2]; switch ($1 | 0) { case 1: break label$1; case 0: break label$4; default: break label$3; }; } $2 = HEAP32[$0 + 4 >> 2]; if (HEAP32[$2 + 11848 >> 2]) { break label$3 } $2 = HEAP32[$2 + 7052 >> 2]; if (!$2) { break label$3 } $3 = HEAP32[$5 + 36 >> 2]; HEAP32[$5 + 36 >> 2] = $2; $3 = !process_frame_($0, ($2 | 0) != ($3 | 0), 1); $5 = HEAP32[$0 >> 2]; } if (HEAP32[$5 + 12 >> 2]) { $2 = HEAP32[$0 + 4 >> 2]; FLAC__MD5Final($2 + 6928 | 0, $2 + 7060 | 0); } $5 = $0 + 4 | 0; $1 = HEAP32[$0 + 4 >> 2]; label$6 : { if (HEAP32[$1 + 11848 >> 2]) { $2 = $3; break label$6; } $4 = HEAP32[$0 >> 2]; label$8 : { if (HEAP32[$4 >> 2]) { break label$8 } $11 = HEAP32[$1 + 7268 >> 2]; if ($11) { label$10 : { if (HEAP32[$1 + 7260 >> 2]) { $13 = HEAP32[$1 + 6900 >> 2]; $12 = HEAP32[$1 + 6896 >> 2]; $2 = $1 + 6920 | 0; $8 = HEAP32[$2 >> 2]; $9 = HEAP32[$2 + 4 >> 2]; if ((FUNCTION_TABLE[$11]($0, 0, 0, HEAP32[$1 + 7288 >> 2]) | 0) == 2) { break label$10 } simple_ogg_page__init($7); $2 = HEAP32[$0 >> 2]; $4 = HEAP32[$2 + 608 >> 2]; $6 = HEAP32[$2 + 612 >> 2]; $2 = HEAP32[$0 + 4 >> 2]; label$12 : { if (!simple_ogg_page__get_at($0, $4, $6, $7, HEAP32[$2 + 7268 >> 2], HEAP32[$2 + 7264 >> 2], HEAP32[$2 + 7288 >> 2])) { break label$12 } $11 = HEAP32[1357] + HEAP32[1356] | 0; $14 = HEAP32[1362] + (HEAP32[1361] + (HEAP32[1360] + (HEAP32[1359] + ($11 + HEAP32[1358] | 0) | 0) | 0) | 0) | 0; $2 = $14 + HEAP32[1363] >>> 3 | 0; if ($2 + 33 >>> 0 > HEAPU32[$7 + 12 >> 2]) { HEAP32[HEAP32[$0 >> 2] >> 2] = 2; simple_ogg_page__clear($7); break label$10; } $4 = $1 + 6936 | 0; $10 = HEAPU8[$4 + 4 | 0] | HEAPU8[$4 + 5 | 0] << 8 | (HEAPU8[$4 + 6 | 0] << 16 | HEAPU8[$4 + 7 | 0] << 24); $2 = $2 + HEAP32[$7 + 8 >> 2] | 0; $4 = HEAPU8[$4 | 0] | HEAPU8[$4 + 1 | 0] << 8 | (HEAPU8[$4 + 2 | 0] << 16 | HEAPU8[$4 + 3 | 0] << 24); HEAP8[$2 + 25 | 0] = $4; HEAP8[$2 + 26 | 0] = $4 >>> 8; HEAP8[$2 + 27 | 0] = $4 >>> 16; HEAP8[$2 + 28 | 0] = $4 >>> 24; HEAP8[$2 + 29 | 0] = $10; HEAP8[$2 + 30 | 0] = $10 >>> 8; HEAP8[$2 + 31 | 0] = $10 >>> 16; HEAP8[$2 + 32 | 0] = $10 >>> 24; $1 = $1 + 6928 | 0; $4 = HEAPU8[$1 + 4 | 0] | HEAPU8[$1 + 5 | 0] << 8 | (HEAPU8[$1 + 6 | 0] << 16 | HEAPU8[$1 + 7 | 0] << 24); $1 = HEAPU8[$1 | 0] | HEAPU8[$1 + 1 | 0] << 8 | (HEAPU8[$1 + 2 | 0] << 16 | HEAPU8[$1 + 3 | 0] << 24); HEAP8[$2 + 17 | 0] = $1; HEAP8[$2 + 18 | 0] = $1 >>> 8; HEAP8[$2 + 19 | 0] = $1 >>> 16; HEAP8[$2 + 20 | 0] = $1 >>> 24; HEAP8[$2 + 21 | 0] = $4; HEAP8[$2 + 22 | 0] = $4 >>> 8; HEAP8[$2 + 23 | 0] = $4 >>> 16; HEAP8[$2 + 24 | 0] = $4 >>> 24; $2 = $14 + -4 >>> 3 | 0; if ($2 + 22 >>> 0 > HEAPU32[$7 + 12 >> 2]) { HEAP32[HEAP32[$0 >> 2] >> 2] = 2; simple_ogg_page__clear($7); break label$10; } $2 = $2 + HEAP32[$7 + 8 >> 2] | 0; HEAP8[$2 + 21 | 0] = $8; HEAP8[$2 + 20 | 0] = ($9 & 255) << 24 | $8 >>> 8; HEAP8[$2 + 19 | 0] = ($9 & 65535) << 16 | $8 >>> 16; HEAP8[$2 + 18 | 0] = ($9 & 16777215) << 8 | $8 >>> 24; $2 = $2 + 17 | 0; HEAP8[$2 | 0] = HEAPU8[$2 | 0] & 240 | $9 & 15; $2 = $11 >>> 3 | 0; if ($2 + 23 >>> 0 > HEAPU32[$7 + 12 >> 2]) { HEAP32[HEAP32[$0 >> 2] >> 2] = 2; simple_ogg_page__clear($7); break label$10; } $2 = $2 + HEAP32[$7 + 8 >> 2] | 0; HEAP8[$2 + 22 | 0] = $13; HEAP8[$2 + 21 | 0] = $13 >>> 8; HEAP8[$2 + 20 | 0] = $13 >>> 16; HEAP8[$2 + 19 | 0] = $12; HEAP8[$2 + 18 | 0] = $12 >>> 8; HEAP8[$2 + 17 | 0] = $12 >>> 16; $2 = HEAP32[$0 >> 2]; $4 = HEAP32[$2 + 608 >> 2]; $1 = HEAP32[$2 + 612 >> 2]; $2 = HEAP32[$0 + 4 >> 2]; $2 = simple_ogg_page__set_at($0, $4, $1, $7, HEAP32[$2 + 7268 >> 2], HEAP32[$2 + 7276 >> 2], HEAP32[$2 + 7288 >> 2]); simple_ogg_page__clear($7); if (!$2) { break label$10 } $2 = HEAP32[HEAP32[$5 >> 2] + 7048 >> 2]; if (!$2 | !HEAP32[$2 >> 2]) { break label$10 } $1 = HEAP32[$0 >> 2]; if (!(HEAP32[$1 + 616 >> 2] | HEAP32[$1 + 620 >> 2])) { break label$10 } FLAC__format_seektable_sort($2); simple_ogg_page__init($7); $2 = HEAP32[$0 >> 2]; $4 = HEAP32[$2 + 616 >> 2]; $1 = HEAP32[$2 + 620 >> 2]; $2 = HEAP32[$0 + 4 >> 2]; if (!simple_ogg_page__get_at($0, $4, $1, $7, HEAP32[$2 + 7268 >> 2], HEAP32[$2 + 7264 >> 2], HEAP32[$2 + 7288 >> 2])) { break label$12 } $6 = HEAP32[$5 >> 2]; $2 = HEAP32[$6 + 7048 >> 2]; $1 = HEAP32[$2 >> 2]; if (HEAP32[$7 + 12 >> 2] != (Math_imul($1, 18) + 4 | 0)) { HEAP32[HEAP32[$0 >> 2] >> 2] = 2; simple_ogg_page__clear($7); break label$10; } if ($1) { $1 = HEAP32[$7 + 8 >> 2] + 4 | 0; $4 = 0; while (1) { $8 = HEAP32[$2 + 4 >> 2] + Math_imul($4, 24) | 0; $9 = HEAP32[$8 >> 2]; $2 = HEAP32[$8 + 4 >> 2]; $10 = HEAP32[$8 + 8 >> 2]; $6 = HEAP32[$8 + 12 >> 2]; $8 = HEAP32[$8 + 16 >> 2]; HEAP8[$1 + 17 | 0] = $8; HEAP8[$1 + 15 | 0] = $10; HEAP8[$1 + 7 | 0] = $9; HEAP8[$1 + 16 | 0] = $8 >>> 8; HEAP8[$1 + 14 | 0] = ($6 & 255) << 24 | $10 >>> 8; HEAP8[$1 + 13 | 0] = ($6 & 65535) << 16 | $10 >>> 16; HEAP8[$1 + 12 | 0] = ($6 & 16777215) << 8 | $10 >>> 24; HEAP8[$1 + 11 | 0] = $6; HEAP8[$1 + 10 | 0] = $6 >>> 8; HEAP8[$1 + 9 | 0] = $6 >>> 16; HEAP8[$1 + 8 | 0] = $6 >>> 24; HEAP8[$1 + 6 | 0] = ($2 & 255) << 24 | $9 >>> 8; HEAP8[$1 + 5 | 0] = ($2 & 65535) << 16 | $9 >>> 16; HEAP8[$1 + 4 | 0] = ($2 & 16777215) << 8 | $9 >>> 24; HEAP8[$1 + 3 | 0] = $2; HEAP8[$1 + 2 | 0] = $2 >>> 8; HEAP8[$1 + 1 | 0] = $2 >>> 16; HEAP8[$1 | 0] = $2 >>> 24; $1 = $1 + 18 | 0; $4 = $4 + 1 | 0; $6 = HEAP32[$5 >> 2]; $2 = HEAP32[$6 + 7048 >> 2]; if ($4 >>> 0 < HEAPU32[$2 >> 2]) { continue } break; }; } $2 = HEAP32[$0 >> 2]; simple_ogg_page__set_at($0, HEAP32[$2 + 616 >> 2], HEAP32[$2 + 620 >> 2], $7, HEAP32[$6 + 7268 >> 2], HEAP32[$6 + 7276 >> 2], HEAP32[$6 + 7288 >> 2]); } simple_ogg_page__clear($7); break label$10; } $13 = HEAP32[$1 + 6912 >> 2]; $8 = HEAP32[$1 + 6900 >> 2]; $9 = HEAP32[$1 + 6896 >> 2]; $6 = $1 + 6920 | 0; $2 = HEAP32[$6 >> 2]; $6 = HEAP32[$6 + 4 >> 2]; label$19 : { label$20 : { $16 = $0; $10 = HEAP32[$4 + 612 >> 2]; $12 = HEAP32[1357] + HEAP32[1356] | 0; $14 = HEAP32[1362] + (HEAP32[1361] + (HEAP32[1360] + (HEAP32[1359] + ($12 + HEAP32[1358] | 0) | 0) | 0) | 0) | 0; $15 = ($14 + HEAP32[1363] >>> 3 | 0) + 4 | 0; $4 = $15 + HEAP32[$4 + 608 >> 2] | 0; if ($4 >>> 0 < $15 >>> 0) { $10 = $10 + 1 | 0 } switch (FUNCTION_TABLE[$11]($16, $4, $10, HEAP32[$1 + 7288 >> 2]) | 0) { case 0: break label$19; case 1: break label$20; default: break label$10; }; } HEAP32[HEAP32[$0 >> 2] >> 2] = 5; break label$10; } $4 = $1 + 6928 | 0; $1 = HEAP32[$0 + 4 >> 2]; if (FUNCTION_TABLE[HEAP32[$1 + 7276 >> 2]]($0, $4, 16, 0, 0, HEAP32[$1 + 7288 >> 2])) { HEAP32[HEAP32[$0 >> 2] >> 2] = 5; break label$10; } HEAP8[$7 + 4 | 0] = $2; HEAP8[$7 + 3 | 0] = ($6 & 255) << 24 | $2 >>> 8; HEAP8[$7 + 2 | 0] = ($6 & 65535) << 16 | $2 >>> 16; HEAP8[$7 + 1 | 0] = ($6 & 16777215) << 8 | $2 >>> 24; HEAP8[$7 | 0] = ($6 & 15 | $13 << 4) + 240; label$22 : { label$23 : { $2 = ($14 + -4 >>> 3 | 0) + 4 | 0; $1 = HEAP32[$0 >> 2]; $4 = $2 + HEAP32[$1 + 608 >> 2] | 0; $1 = HEAP32[$1 + 612 >> 2]; $1 = $4 >>> 0 < $2 >>> 0 ? $1 + 1 | 0 : $1; $2 = HEAP32[$0 + 4 >> 2]; switch (FUNCTION_TABLE[HEAP32[$2 + 7268 >> 2]]($0, $4, $1, HEAP32[$2 + 7288 >> 2]) | 0) { case 0: break label$22; case 1: break label$23; default: break label$10; }; } HEAP32[HEAP32[$0 >> 2] >> 2] = 5; break label$10; } $2 = HEAP32[$0 + 4 >> 2]; if (FUNCTION_TABLE[HEAP32[$2 + 7276 >> 2]]($0, $7, 5, 0, 0, HEAP32[$2 + 7288 >> 2])) { HEAP32[HEAP32[$0 >> 2] >> 2] = 5; break label$10; } HEAP8[$7 + 5 | 0] = $8; HEAP8[$7 + 4 | 0] = $8 >>> 8; HEAP8[$7 + 3 | 0] = $8 >>> 16; HEAP8[$7 + 2 | 0] = $9; HEAP8[$7 + 1 | 0] = $9 >>> 8; HEAP8[$7 | 0] = $9 >>> 16; label$25 : { label$26 : { $2 = ($12 >>> 3 | 0) + 4 | 0; $1 = HEAP32[$0 >> 2]; $4 = $2 + HEAP32[$1 + 608 >> 2] | 0; $1 = HEAP32[$1 + 612 >> 2]; $1 = $4 >>> 0 < $2 >>> 0 ? $1 + 1 | 0 : $1; $2 = HEAP32[$0 + 4 >> 2]; switch (FUNCTION_TABLE[HEAP32[$2 + 7268 >> 2]]($0, $4, $1, HEAP32[$2 + 7288 >> 2]) | 0) { case 0: break label$25; case 1: break label$26; default: break label$10; }; } HEAP32[HEAP32[$0 >> 2] >> 2] = 5; break label$10; } $2 = HEAP32[$0 + 4 >> 2]; if (FUNCTION_TABLE[HEAP32[$2 + 7276 >> 2]]($0, $7, 6, 0, 0, HEAP32[$2 + 7288 >> 2])) { HEAP32[HEAP32[$0 >> 2] >> 2] = 5; break label$10; } $2 = HEAP32[HEAP32[$5 >> 2] + 7048 >> 2]; if (!$2 | !HEAP32[$2 >> 2]) { break label$10 } $1 = HEAP32[$0 >> 2]; if (!(HEAP32[$1 + 616 >> 2] | HEAP32[$1 + 620 >> 2])) { break label$10 } FLAC__format_seektable_sort($2); label$28 : { label$29 : { label$30 : { $2 = HEAP32[$0 >> 2]; $1 = HEAP32[$2 + 616 >> 2] + 4 | 0; $2 = HEAP32[$2 + 620 >> 2]; $4 = $1 >>> 0 < 4 ? $2 + 1 | 0 : $2; $2 = HEAP32[$0 + 4 >> 2]; switch (FUNCTION_TABLE[HEAP32[$2 + 7268 >> 2]]($0, $1, $4, HEAP32[$2 + 7288 >> 2]) | 0) { case 1: break label$29; case 0: break label$30; default: break label$10; }; } $4 = HEAP32[$5 >> 2]; $1 = HEAP32[$4 + 7048 >> 2]; if (!HEAP32[$1 >> 2]) { break label$10 } $6 = 0; break label$28; } HEAP32[HEAP32[$0 >> 2] >> 2] = 5; break label$10; } while (1) { label$32 : { $9 = Math_imul($6, 24); $8 = $9 + HEAP32[$1 + 4 >> 2] | 0; $2 = HEAP32[$8 + 4 >> 2]; $8 = HEAP32[$8 >> 2]; $10 = $8 << 24 | $8 << 8 & 16711680; HEAP32[$7 >> 2] = (($2 & 255) << 24 | $8 >>> 8) & -16777216 | (($2 & 16777215) << 8 | $8 >>> 24) & 16711680 | ($2 >>> 8 & 65280 | $2 >>> 24); HEAP32[$7 + 4 >> 2] = ($2 << 24 | $8 >>> 8) & 65280 | ($2 << 8 | $8 >>> 24) & 255 | $10; $8 = $9 + HEAP32[$1 + 4 >> 2] | 0; $2 = HEAP32[$8 + 12 >> 2]; $8 = HEAP32[$8 + 8 >> 2]; $10 = $8 << 24 | $8 << 8 & 16711680; HEAP32[$7 + 8 >> 2] = (($2 & 255) << 24 | $8 >>> 8) & -16777216 | (($2 & 16777215) << 8 | $8 >>> 24) & 16711680 | ($2 >>> 8 & 65280 | $2 >>> 24); HEAP32[$7 + 12 >> 2] = ($2 << 24 | $8 >>> 8) & 65280 | ($2 << 8 | $8 >>> 24) & 255 | $10; $2 = HEAPU16[($9 + HEAP32[$1 + 4 >> 2] | 0) + 16 >> 1]; HEAP16[$7 + 16 >> 1] = ($2 << 24 | $2 << 8 & 16711680) >>> 16; if (FUNCTION_TABLE[HEAP32[$4 + 7276 >> 2]]($0, $7, 18, 0, 0, HEAP32[$4 + 7288 >> 2])) { break label$32 } $6 = $6 + 1 | 0; $4 = HEAP32[$5 >> 2]; $1 = HEAP32[$4 + 7048 >> 2]; if ($6 >>> 0 < HEAPU32[$1 >> 2]) { continue } break label$10; } break; }; HEAP32[HEAP32[$0 >> 2] >> 2] = 5; } $1 = HEAP32[$0 + 4 >> 2]; $4 = HEAP32[$0 >> 2]; $3 = HEAP32[$4 >> 2] ? 1 : $3; } $2 = HEAP32[$1 + 7280 >> 2]; if (!$2) { break label$8 } FUNCTION_TABLE[$2]($0, $1 + 6872 | 0, HEAP32[$1 + 7288 >> 2]); $4 = HEAP32[$0 >> 2]; } if (!HEAP32[$4 + 4 >> 2]) { $2 = $3; break label$6; } $2 = HEAP32[HEAP32[$5 >> 2] + 11752 >> 2]; if (!$2) { $2 = $3; break label$6; } if (FLAC__stream_decoder_finish($2)) { $2 = $3; break label$6; } $2 = 1; if ($3) { break label$6 } HEAP32[HEAP32[$0 >> 2] >> 2] = 4; } $1 = HEAP32[$5 >> 2]; $3 = HEAP32[$1 + 7296 >> 2]; if ($3) { if (($3 | 0) != HEAP32[1896]) { fclose($3); $1 = HEAP32[$5 >> 2]; } HEAP32[$1 + 7296 >> 2] = 0; } if (HEAP32[$1 + 7260 >> 2]) { ogg_stream_clear(HEAP32[$0 >> 2] + 640 | 0) } $1 = HEAP32[$0 >> 2]; $3 = HEAP32[$1 + 600 >> 2]; if ($3) { dlfree($3); $1 = HEAP32[$0 >> 2]; HEAP32[$1 + 600 >> 2] = 0; HEAP32[$1 + 604 >> 2] = 0; } if (HEAP32[$1 + 24 >> 2]) { $3 = 0; while (1) { $4 = HEAP32[$5 >> 2]; $1 = $3 << 2; $6 = HEAP32[($4 + $1 | 0) + 7328 >> 2]; if ($6) { dlfree($6); HEAP32[($1 + HEAP32[$5 >> 2] | 0) + 7328 >> 2] = 0; $4 = HEAP32[$5 >> 2]; } $4 = HEAP32[($4 + $1 | 0) + 7368 >> 2]; if ($4) { dlfree($4); HEAP32[($1 + HEAP32[$5 >> 2] | 0) + 7368 >> 2] = 0; } $3 = $3 + 1 | 0; if ($3 >>> 0 < HEAPU32[HEAP32[$0 >> 2] + 24 >> 2]) { continue } break; }; } $1 = HEAP32[$5 >> 2]; $3 = HEAP32[$1 + 7360 >> 2]; if ($3) { dlfree($3); HEAP32[HEAP32[$5 >> 2] + 7360 >> 2] = 0; $1 = HEAP32[$5 >> 2]; } $3 = HEAP32[$1 + 7400 >> 2]; if ($3) { dlfree($3); HEAP32[HEAP32[$5 >> 2] + 7400 >> 2] = 0; $1 = HEAP32[$5 >> 2]; } $3 = HEAP32[$1 + 7364 >> 2]; if ($3) { dlfree($3); HEAP32[HEAP32[$5 >> 2] + 7364 >> 2] = 0; $1 = HEAP32[$5 >> 2]; } $3 = HEAP32[$1 + 7404 >> 2]; if ($3) { dlfree($3); HEAP32[HEAP32[$5 >> 2] + 7404 >> 2] = 0; $1 = HEAP32[$5 >> 2]; } $4 = HEAP32[$0 >> 2]; if (HEAP32[$4 + 40 >> 2]) { $3 = 0; while (1) { $6 = $3 << 2; $8 = HEAP32[($6 + $1 | 0) + 7408 >> 2]; if ($8) { dlfree($8); HEAP32[($6 + HEAP32[$0 + 4 >> 2] | 0) + 7408 >> 2] = 0; $4 = HEAP32[$0 >> 2]; $1 = HEAP32[$0 + 4 >> 2]; } $3 = $3 + 1 | 0; if ($3 >>> 0 < HEAPU32[$4 + 40 >> 2]) { continue } break; }; } $3 = HEAP32[$1 + 7536 >> 2]; if ($3) { dlfree($3); $1 = HEAP32[$0 + 4 >> 2]; HEAP32[$1 + 7536 >> 2] = 0; $4 = HEAP32[$0 >> 2]; } if (HEAP32[$4 + 24 >> 2]) { $4 = 0; while (1) { $3 = $4 << 3; $6 = HEAP32[($3 + $1 | 0) + 7540 >> 2]; if ($6) { dlfree($6); HEAP32[($3 + HEAP32[$5 >> 2] | 0) + 7540 >> 2] = 0; $1 = HEAP32[$5 >> 2]; } $6 = HEAP32[($1 + $3 | 0) + 7544 >> 2]; if ($6) { dlfree($6); HEAP32[($3 + HEAP32[$5 >> 2] | 0) + 7544 >> 2] = 0; $1 = HEAP32[$5 >> 2]; } $4 = $4 + 1 | 0; if ($4 >>> 0 < HEAPU32[HEAP32[$0 >> 2] + 24 >> 2]) { continue } break; }; } $3 = HEAP32[$1 + 7604 >> 2]; if ($3) { dlfree($3); HEAP32[HEAP32[$5 >> 2] + 7604 >> 2] = 0; $1 = HEAP32[$5 >> 2]; } $3 = HEAP32[$1 + 7608 >> 2]; if ($3) { dlfree($3); HEAP32[HEAP32[$5 >> 2] + 7608 >> 2] = 0; $1 = HEAP32[$5 >> 2]; } $3 = HEAP32[$1 + 7612 >> 2]; if ($3) { dlfree($3); HEAP32[HEAP32[$5 >> 2] + 7612 >> 2] = 0; $1 = HEAP32[$5 >> 2]; } $3 = HEAP32[$1 + 7616 >> 2]; if ($3) { dlfree($3); HEAP32[HEAP32[$5 >> 2] + 7616 >> 2] = 0; $1 = HEAP32[$5 >> 2]; } $3 = HEAP32[$1 + 7620 >> 2]; if ($3) { dlfree($3); $1 = HEAP32[$5 >> 2]; HEAP32[$1 + 7620 >> 2] = 0; } $3 = HEAP32[$1 + 7624 >> 2]; if ($3) { dlfree($3); $1 = HEAP32[$5 >> 2]; HEAP32[$1 + 7624 >> 2] = 0; } $3 = HEAP32[$0 >> 2]; if (!(!HEAP32[$3 + 4 >> 2] | !HEAP32[$3 + 24 >> 2])) { $5 = 0; while (1) { $4 = $5 << 2; $6 = HEAP32[($4 + $1 | 0) + 11764 >> 2]; if ($6) { dlfree($6); HEAP32[($4 + HEAP32[$0 + 4 >> 2] | 0) + 11764 >> 2] = 0; $1 = HEAP32[$0 + 4 >> 2]; $3 = HEAP32[$0 >> 2]; } $5 = $5 + 1 | 0; if ($5 >>> 0 < HEAPU32[$3 + 24 >> 2]) { continue } break; }; } FLAC__bitwriter_free(HEAP32[$1 + 6856 >> 2]); $3 = HEAP32[$0 >> 2]; HEAP32[$3 + 44 >> 2] = 13; HEAP32[$3 + 48 >> 2] = 1056964608; HEAP32[$3 + 36 >> 2] = 0; HEAP32[$3 + 40 >> 2] = 1; HEAP32[$3 + 28 >> 2] = 16; HEAP32[$3 + 32 >> 2] = 44100; HEAP32[$3 + 20 >> 2] = 0; HEAP32[$3 + 24 >> 2] = 2; HEAP32[$3 + 12 >> 2] = 1; HEAP32[$3 + 16 >> 2] = 0; HEAP32[$3 + 4 >> 2] = 0; HEAP32[$3 + 8 >> 2] = 1; $3 = HEAP32[$0 >> 2]; HEAP32[$3 + 592 >> 2] = 0; HEAP32[$3 + 596 >> 2] = 0; HEAP32[$3 + 556 >> 2] = 0; HEAP32[$3 + 560 >> 2] = 0; HEAP32[$3 + 564 >> 2] = 0; HEAP32[$3 + 568 >> 2] = 0; HEAP32[$3 + 572 >> 2] = 0; HEAP32[$3 + 576 >> 2] = 0; HEAP32[$3 + 580 >> 2] = 0; HEAP32[$3 + 584 >> 2] = 0; HEAP32[$3 + 600 >> 2] = 0; HEAP32[$3 + 604 >> 2] = 0; $1 = HEAP32[$0 + 4 >> 2]; HEAP32[$1 + 7248 >> 2] = 0; HEAP32[$1 + 7252 >> 2] = 0; HEAP32[$1 + 7048 >> 2] = 0; $5 = $1 + 7256 | 0; HEAP32[$5 >> 2] = 0; HEAP32[$5 + 4 >> 2] = 0; $5 = $1 + 7264 | 0; HEAP32[$5 >> 2] = 0; HEAP32[$5 + 4 >> 2] = 0; $5 = $1 + 7272 | 0; HEAP32[$5 >> 2] = 0; HEAP32[$5 + 4 >> 2] = 0; $5 = $1 + 7280 | 0; HEAP32[$5 >> 2] = 0; HEAP32[$5 + 4 >> 2] = 0; HEAP32[$1 + 7288 >> 2] = 0; FLAC__ogg_encoder_aspect_set_defaults($3 + 632 | 0); $1 = HEAP32[$0 >> 2]; label$74 : { if (HEAP32[$1 >> 2] != 1) { break label$74 } HEAP32[$1 + 16 >> 2] = 1; HEAP32[$1 + 20 >> 2] = 0; FLAC__stream_encoder_set_apodization($0, 10777); $1 = HEAP32[$0 >> 2]; if (HEAP32[$1 >> 2] != 1) { break label$74 } HEAP32[$1 + 576 >> 2] = 0; HEAP32[$1 + 580 >> 2] = 5; HEAP32[$1 + 564 >> 2] = 0; HEAP32[$1 + 568 >> 2] = 0; HEAP32[$1 + 556 >> 2] = 8; HEAP32[$1 + 560 >> 2] = 0; } if (!$2) { HEAP32[$1 >> 2] = 1 } $1 = !$2; } global$0 = $7 + 32 | 0; return $1 | 0; } function process_frame_($0, $1, $2) { var $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0; $8 = global$0 - 48 | 0; global$0 = $8; label$1 : { label$2 : { $4 = HEAP32[$0 >> 2]; if (!HEAP32[$4 + 12 >> 2]) { break label$2 } $3 = HEAP32[$0 + 4 >> 2]; $3 = FLAC__MD5Accumulate($3 + 7060 | 0, $3 + 4 | 0, HEAP32[$4 + 24 >> 2], HEAP32[$4 + 36 >> 2], HEAP32[$4 + 28 >> 2] + 7 >>> 3 | 0); $4 = HEAP32[$0 >> 2]; if ($3) { break label$2 } HEAP32[$4 >> 2] = 8; $1 = 0; break label$1; } $3 = HEAP32[$4 + 576 >> 2]; if ($1) { $12 = 0 } else { $1 = FLAC__format_get_max_rice_partition_order_from_blocksize(HEAP32[$4 + 36 >> 2]); $4 = HEAP32[$0 >> 2]; $5 = HEAP32[$4 + 580 >> 2]; $12 = $1 >>> 0 < $5 >>> 0 ? $1 : $5; } $7 = HEAP32[$4 + 36 >> 2]; HEAP32[$8 + 8 >> 2] = $7; HEAP32[$8 + 12 >> 2] = HEAP32[$4 + 32 >> 2]; $1 = HEAP32[$4 + 24 >> 2]; HEAP32[$8 + 20 >> 2] = 0; HEAP32[$8 + 16 >> 2] = $1; $1 = HEAP32[$4 + 28 >> 2]; HEAP32[$8 + 28 >> 2] = 0; HEAP32[$8 + 24 >> 2] = $1; $5 = HEAP32[$0 + 4 >> 2]; HEAP32[$8 + 32 >> 2] = HEAP32[$5 + 7056 >> 2]; $14 = $3 >>> 0 < $12 >>> 0 ? $3 : $12; label$5 : { label$6 : { label$7 : { label$8 : { label$9 : { label$10 : { label$11 : { if (!HEAP32[$4 + 16 >> 2]) { $10 = 1; break label$11; } if (!HEAP32[$4 + 20 >> 2] | !HEAP32[$5 + 6864 >> 2]) { break label$11 } $10 = 1; $13 = 1; if (HEAP32[$5 + 6868 >> 2]) { break label$10 } } label$13 : { if (!HEAP32[$4 + 24 >> 2]) { $3 = 0; break label$13; } while (1) { $13 = ($6 << 2) + $5 | 0; $3 = 0; $11 = 0; label$16 : { if (!$7) { break label$16 } $15 = HEAP32[$13 + 4 >> 2]; $1 = 0; while (1) { label$18 : { $3 = HEAP32[$15 + ($1 << 2) >> 2] | $3; $9 = $3 & 1; $1 = $1 + 1 | 0; if ($1 >>> 0 >= $7 >>> 0) { break label$18 } if (!$9) { continue } } break; }; $1 = 0; $11 = 0; if (!$3) { break label$16 } $11 = 0; if ($9) { break label$16 } while (1) { $1 = $1 + 1 | 0; $9 = $3 & 2; $3 = $3 >> 1; if (!$9) { continue } break; }; $9 = 0; $11 = 0; if (!$1) { break label$16 } while (1) { $3 = $15 + ($9 << 2) | 0; HEAP32[$3 >> 2] = HEAP32[$3 >> 2] >> $1; $9 = $9 + 1 | 0; if (($9 | 0) != ($7 | 0)) { continue } break; }; $11 = $1; } $1 = $11; $7 = Math_imul($6, 584) + $5 | 0; $3 = HEAP32[$4 + 28 >> 2]; $1 = $1 >>> 0 > $3 >>> 0 ? $3 : $1; HEAP32[$7 + 624 >> 2] = $1; HEAP32[$7 + 916 >> 2] = $1; HEAP32[$13 + 216 >> 2] = $3 - $1; $6 = $6 + 1 | 0; $3 = HEAP32[$4 + 24 >> 2]; if ($6 >>> 0 >= $3 >>> 0) { break label$13 } $7 = HEAP32[$4 + 36 >> 2]; continue; }; } $1 = 1; if ($10) { break label$9 } $7 = HEAP32[$4 + 36 >> 2]; $13 = 0; } $9 = HEAP32[$5 + 36 >> 2]; $3 = 0; $6 = 0; label$21 : { if (!$7) { break label$21 } $1 = 0; while (1) { label$23 : { $1 = HEAP32[($6 << 2) + $9 >> 2] | $1; $10 = $1 & 1; $6 = $6 + 1 | 0; if ($6 >>> 0 >= $7 >>> 0) { break label$23 } if (!$10) { continue } } break; }; $6 = 0; if ($10 | !$1) { break label$21 } while (1) { $6 = $6 + 1 | 0; $10 = $1 & 2; $1 = $1 >> 1; if (!$10) { continue } break; }; $1 = 0; if (!$6) { $6 = 0; break label$21; } while (1) { $10 = ($1 << 2) + $9 | 0; HEAP32[$10 >> 2] = HEAP32[$10 >> 2] >> $6; $1 = $1 + 1 | 0; if (($7 | 0) != ($1 | 0)) { continue } break; }; } $1 = HEAP32[$4 + 28 >> 2]; $6 = $6 >>> 0 > $1 >>> 0 ? $1 : $6; HEAP32[$5 + 5296 >> 2] = $6; HEAP32[$5 + 5588 >> 2] = $6; HEAP32[$5 + 248 >> 2] = $1 - $6; $6 = HEAP32[$4 + 36 >> 2]; label$27 : { if (!$6) { break label$27 } $7 = HEAP32[$5 + 40 >> 2]; $1 = 0; while (1) { label$29 : { $3 = HEAP32[$7 + ($1 << 2) >> 2] | $3; $10 = $3 & 1; $1 = $1 + 1 | 0; if ($1 >>> 0 >= $6 >>> 0) { break label$29 } if (!$10) { continue } } break; }; $1 = 0; if (!$3) { $3 = 0; break label$27; } if ($10) { $3 = 0; break label$27; } while (1) { $1 = $1 + 1 | 0; $10 = $3 & 2; $3 = $3 >> 1; if (!$10) { continue } break; }; $3 = 0; if (!$1) { break label$27 } while (1) { $10 = $7 + ($3 << 2) | 0; HEAP32[$10 >> 2] = HEAP32[$10 >> 2] >> $1; $3 = $3 + 1 | 0; if (($6 | 0) != ($3 | 0)) { continue } break; }; $3 = $1; } $1 = HEAP32[$4 + 28 >> 2]; $3 = $3 >>> 0 > $1 >>> 0 ? $1 : $3; HEAP32[$5 + 5880 >> 2] = $3; HEAP32[$5 + 6172 >> 2] = $3; HEAP32[$5 + 252 >> 2] = ($1 - $3 | 0) + 1; if ($13) { break label$8 } $3 = HEAP32[$4 + 24 >> 2]; $1 = 0; } $4 = $1; if ($3) { $3 = 0; while (1) { $1 = ($3 << 2) + $5 | 0; $5 = ($3 << 3) + $5 | 0; process_subframe_($0, $14, $12, $8 + 8 | 0, HEAP32[$1 + 216 >> 2], HEAP32[$1 + 4 >> 2], $5 + 6176 | 0, $5 + 6640 | 0, $5 + 256 | 0, $1 + 6768 | 0, $1 + 6808 | 0); $5 = HEAP32[$0 + 4 >> 2]; $3 = $3 + 1 | 0; if ($3 >>> 0 < HEAPU32[HEAP32[$0 >> 2] + 24 >> 2]) { continue } break; }; } if ($4) { break label$7 } $9 = HEAP32[$5 + 36 >> 2]; } process_subframe_($0, $14, $12, $8 + 8 | 0, HEAP32[$5 + 248 >> 2], $9, $5 + 6240 | 0, $5 + 6704 | 0, $5 + 320 | 0, $5 + 6800 | 0, $5 + 6840 | 0); $1 = HEAP32[$0 + 4 >> 2]; process_subframe_($0, $14, $12, $8 + 8 | 0, HEAP32[$1 + 252 >> 2], HEAP32[$1 + 40 >> 2], $1 + 6248 | 0, $1 + 6712 | 0, $1 + 328 | 0, $1 + 6804 | 0, $1 + 6844 | 0); $11 = $8; $1 = HEAP32[$0 + 4 >> 2]; label$36 : { if (!(!HEAP32[HEAP32[$0 >> 2] + 20 >> 2] | !HEAP32[$1 + 6864 >> 2])) { $3 = HEAP32[$1 + 6868 >> 2] ? 3 : 0; break label$36; } $3 = HEAP32[$1 + 6844 >> 2]; $5 = HEAP32[$1 + 6808 >> 2]; $4 = $3 + $5 | 0; $6 = HEAP32[$1 + 6812 >> 2]; $5 = $5 + $6 | 0; $7 = $4 >>> 0 < $5 >>> 0; $6 = $3 + $6 | 0; $5 = $7 ? $4 : $5; $4 = $6 >>> 0 < $5 >>> 0; $3 = $3 + HEAP32[$1 + 6840 >> 2] >>> 0 < ($4 ? $6 : $5) >>> 0 ? 3 : $4 ? 2 : $7; } HEAP32[$11 + 20 >> 2] = $3; if (!FLAC__frame_add_header($8 + 8 | 0, HEAP32[$1 + 6856 >> 2])) { HEAP32[HEAP32[$0 >> 2] >> 2] = 7; $1 = 0; break label$1; } $5 = $0; $6 = HEAP32[$8 + 8 >> 2]; label$39 : { label$40 : { switch ($3 | 0) { default: $3 = HEAP32[$0 + 4 >> 2]; $7 = 0; $1 = 0; $4 = 0; $9 = 0; break label$39; case 0: $3 = HEAP32[$0 + 4 >> 2]; $4 = $3 + 336 | 0; $1 = $4 + Math_imul(HEAP32[$3 + 6768 >> 2], 292) | 0; $7 = ($4 + Math_imul(HEAP32[$3 + 6772 >> 2], 292) | 0) + 584 | 0; $4 = HEAP32[$3 + 216 >> 2]; $9 = HEAP32[$3 + 220 >> 2]; break label$39; case 1: $3 = HEAP32[$0 + 4 >> 2]; $1 = ($3 + Math_imul(HEAP32[$3 + 6768 >> 2], 292) | 0) + 336 | 0; $7 = (Math_imul(HEAP32[$3 + 6804 >> 2], 292) + $3 | 0) + 5592 | 0; $4 = HEAP32[$3 + 216 >> 2]; $9 = HEAP32[$3 + 252 >> 2]; break label$39; case 2: $3 = HEAP32[$0 + 4 >> 2]; $7 = ($3 + Math_imul(HEAP32[$3 + 6772 >> 2], 292) | 0) + 920 | 0; $1 = (Math_imul(HEAP32[$3 + 6804 >> 2], 292) + $3 | 0) + 5592 | 0; $4 = HEAP32[$3 + 252 >> 2]; $9 = HEAP32[$3 + 220 >> 2]; break label$39; case 3: break label$40; }; } $3 = HEAP32[$0 + 4 >> 2]; $4 = $3 + 5008 | 0; $1 = $4 + Math_imul(HEAP32[$3 + 6800 >> 2], 292) | 0; $7 = ($4 + Math_imul(HEAP32[$3 + 6804 >> 2], 292) | 0) + 584 | 0; $4 = HEAP32[$3 + 248 >> 2]; $9 = HEAP32[$3 + 252 >> 2]; } if (!add_subframe_($5, $6, $4, $1, HEAP32[$3 + 6856 >> 2])) { break label$6 } if (!add_subframe_($0, HEAP32[$8 + 8 >> 2], $9, $7, HEAP32[HEAP32[$0 + 4 >> 2] + 6856 >> 2])) { break label$6 } $1 = HEAP32[$0 >> 2]; break label$5; } $3 = FLAC__frame_add_header($8 + 8 | 0, HEAP32[$5 + 6856 >> 2]); $1 = HEAP32[$0 >> 2]; if ($3) { if (!HEAP32[$1 + 24 >> 2]) { break label$5 } $3 = 0; while (1) { $1 = HEAP32[$0 + 4 >> 2]; $5 = $1 + ($3 << 2) | 0; if (!add_subframe_($0, HEAP32[$8 + 8 >> 2], HEAP32[$5 + 216 >> 2], (($1 + Math_imul($3, 584) | 0) + Math_imul(HEAP32[$5 + 6768 >> 2], 292) | 0) + 336 | 0, HEAP32[$1 + 6856 >> 2])) { break label$6 } $3 = $3 + 1 | 0; $1 = HEAP32[$0 >> 2]; if ($3 >>> 0 < HEAPU32[$1 + 24 >> 2]) { continue } break; }; break label$5; } HEAP32[$1 >> 2] = 7; } $1 = 0; break label$1; } if (HEAP32[$1 + 20 >> 2]) { $1 = HEAP32[$0 + 4 >> 2]; $3 = HEAP32[$1 + 6864 >> 2] + 1 | 0; HEAP32[$1 + 6864 >> 2] = $3 >>> 0 < HEAPU32[$1 + 6860 >> 2] ? $3 : 0; } $1 = HEAP32[$0 + 4 >> 2]; HEAP32[$1 + 6868 >> 2] = HEAP32[$8 + 20 >> 2]; $1 = HEAP32[$1 + 6856 >> 2]; $3 = HEAP32[$1 + 16 >> 2] & 7; $11 = 1; __inlined_func$FLAC__bitwriter_zero_pad_to_byte_boundary : { if (!$3) { break __inlined_func$FLAC__bitwriter_zero_pad_to_byte_boundary } $11 = FLAC__bitwriter_write_zeroes($1, 8 - $3 | 0); } if (!$11) { HEAP32[HEAP32[$0 >> 2] >> 2] = 8; $1 = 0; break label$1; } label$49 : { if (FLAC__bitwriter_get_write_crc16(HEAP32[HEAP32[$0 + 4 >> 2] + 6856 >> 2], $8 + 8 | 0)) { if (FLAC__bitwriter_write_raw_uint32(HEAP32[HEAP32[$0 + 4 >> 2] + 6856 >> 2], HEAPU16[$8 + 8 >> 1], HEAP32[1404])) { break label$49 } } HEAP32[HEAP32[$0 >> 2] >> 2] = 8; $1 = 0; break label$1; } $1 = 0; if (!write_bitbuffer_($0, HEAP32[HEAP32[$0 >> 2] + 36 >> 2], $2)) { break label$1 } $1 = HEAP32[$0 + 4 >> 2]; HEAP32[$1 + 7052 >> 2] = 0; HEAP32[$1 + 7056 >> 2] = HEAP32[$1 + 7056 >> 2] + 1; $2 = $1 + 6920 | 0; $3 = $2; $11 = $3; $1 = HEAP32[$3 + 4 >> 2]; $0 = HEAP32[HEAP32[$0 >> 2] + 36 >> 2]; $2 = $0 + HEAP32[$3 >> 2] | 0; if ($2 >>> 0 < $0 >>> 0) { $1 = $1 + 1 | 0 } HEAP32[$11 >> 2] = $2; HEAP32[$3 + 4 >> 2] = $1; $1 = 1; } $0 = $1; global$0 = $8 + 48 | 0; return $0; } function FLAC__stream_encoder_init_stream($0, $1, $2, $3, $4, $5) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; $4 = $4 | 0; $5 = $5 | 0; return init_stream_internal__1($0, 0, $1, $2, $3, $4, $5, 0) | 0; } function init_stream_internal__1($0, $1, $2, $3, $4, $5, $6, $7) { var $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0.0, $17 = 0, $18 = 0, $19 = 0; $15 = global$0 - 176 | 0; global$0 = $15; $9 = 13; $8 = HEAP32[$0 >> 2]; label$1 : { if (HEAP32[$8 >> 2] != 1) { break label$1 } $9 = 3; if (!$2 | ($4 ? 0 : $3)) { break label$1 } $9 = 4; $11 = HEAP32[$8 + 24 >> 2]; if ($11 + -1 >>> 0 > 7) { break label$1 } label$2 : { label$3 : { if (($11 | 0) != 2) { HEAP32[$8 + 16 >> 2] = 0; break label$3; } if (HEAP32[$8 + 16 >> 2]) { break label$2 } } HEAP32[$8 + 20 >> 2] = 0; } $11 = HEAP32[$8 + 28 >> 2]; if ($11 >>> 0 >= 32) { HEAP32[$8 + 16 >> 2] = 0; $9 = 5; break label$1; } $9 = 5; if ($11 + -4 >>> 0 > 20) { break label$1 } if (HEAP32[$8 + 32 >> 2] + -1 >>> 0 >= 655350) { $9 = 6; break label$1; } $8 = HEAP32[$0 >> 2]; $10 = HEAP32[$8 + 36 >> 2]; label$7 : { if (!$10) { $10 = HEAP32[$8 + 556 >> 2] ? 4096 : 1152; HEAP32[$8 + 36 >> 2] = $10; break label$7; } $9 = 7; if ($10 + -16 >>> 0 > 65519) { break label$1 } } $9 = 8; $11 = HEAP32[$8 + 556 >> 2]; if ($11 >>> 0 > 32) { break label$1 } $9 = 10; if ($10 >>> 0 < $11 >>> 0) { break label$1 } $11 = HEAP32[$8 + 560 >> 2]; label$9 : { if (!$11) { $13 = $8; $11 = HEAP32[$8 + 28 >> 2]; label$11 : { if ($11 >>> 0 <= 15) { $11 = $11 >>> 0 > 5 ? ($11 >>> 1 | 0) + 2 | 0 : 5; break label$11; } if (($11 | 0) == 16) { $11 = 7; if ($10 >>> 0 < 193) { break label$11 } $11 = 8; if ($10 >>> 0 < 385) { break label$11 } $11 = 9; if ($10 >>> 0 < 577) { break label$11 } $11 = 10; if ($10 >>> 0 < 1153) { break label$11 } $11 = 11; if ($10 >>> 0 < 2305) { break label$11 } $11 = $10 >>> 0 < 4609 ? 12 : 13; break label$11; } $11 = 13; if ($10 >>> 0 < 385) { break label$11 } $11 = $10 >>> 0 < 1153 ? 14 : 15; } HEAP32[$13 + 560 >> 2] = $11; break label$9; } $9 = 9; if ($11 + -5 >>> 0 > 10) { break label$1 } } label$14 : { if (!HEAP32[$8 + 8 >> 2]) { $10 = HEAP32[$8 + 580 >> 2]; break label$14; } $9 = 11; if (!(($10 >>> 0 < 4609 | HEAPU32[$8 + 32 >> 2] > 48e3) & $10 >>> 0 < 16385)) { break label$1 } if (!FLAC__format_sample_rate_is_subset(HEAP32[HEAP32[$0 >> 2] + 32 >> 2])) { break label$1 } $8 = HEAP32[$0 >> 2]; if (__wasm_rotl_i32(HEAP32[$8 + 28 >> 2] + -8 | 0, 30) >>> 0 > 4) { break label$1 } $10 = HEAP32[$8 + 580 >> 2]; if ($10 >>> 0 > 8) { break label$1 } if (HEAPU32[$8 + 32 >> 2] > 48e3) { break label$14 } if (HEAPU32[$8 + 36 >> 2] > 4608 | HEAPU32[$8 + 556 >> 2] > 12) { break label$1 } } $11 = 1 << HEAP32[1406]; if ($10 >>> 0 >= $11 >>> 0) { $10 = $11 + -1 | 0; HEAP32[$8 + 580 >> 2] = $10; } if (HEAPU32[$8 + 576 >> 2] >= $10 >>> 0) { HEAP32[$8 + 576 >> 2] = $10 } label$18 : { if (!$7) { break label$18 } $10 = HEAP32[$8 + 600 >> 2]; if (!$10) { break label$18 } $13 = HEAP32[$8 + 604 >> 2]; if ($13 >>> 0 < 2) { break label$18 } $9 = 1; while (1) { $11 = HEAP32[($9 << 2) + $10 >> 2]; if (!(!$11 | HEAP32[$11 >> 2] != 4)) { while (1) { $8 = ($9 << 2) + $10 | 0; $9 = $9 + -1 | 0; HEAP32[$8 >> 2] = HEAP32[($9 << 2) + $10 >> 2]; $10 = HEAP32[HEAP32[$0 >> 2] + 600 >> 2]; if ($9) { continue } break; }; HEAP32[$10 >> 2] = $11; $8 = HEAP32[$0 >> 2]; break label$18; } $9 = $9 + 1 | 0; if (($13 | 0) != ($9 | 0)) { continue } break; }; } $13 = HEAP32[$8 + 604 >> 2]; label$22 : { label$23 : { $10 = HEAP32[$8 + 600 >> 2]; if ($10) { $11 = 0; if (!$13) { break label$22 } while (1) { $8 = HEAP32[($11 << 2) + $10 >> 2]; if (!(!$8 | HEAP32[$8 >> 2] != 3)) { HEAP32[HEAP32[$0 + 4 >> 2] + 7048 >> 2] = $8 + 16; break label$23; } $11 = $11 + 1 | 0; if (($13 | 0) != ($11 | 0)) { continue } break; }; break label$23; } $9 = 12; if ($13) { break label$1 } $11 = 0; break label$22; } $8 = 0; $13 = 0; $11 = 0; while (1) { $9 = 12; label$28 : { label$29 : { label$30 : { label$31 : { label$32 : { $10 = HEAP32[($14 << 2) + $10 >> 2]; switch (HEAP32[$10 >> 2]) { case 0: break label$1; case 6: break label$29; case 5: break label$30; case 4: break label$31; case 3: break label$32; default: break label$28; }; } if ($18) { break label$1 } $18 = 1; $11 = $13; $12 = $8; if (FLAC__format_seektable_is_legal($10 + 16 | 0)) { break label$28 } break label$1; } $11 = 1; $12 = $8; if (!$13) { break label$28 } break label$1; } $11 = $13; $12 = $8; if (FLAC__format_cuesheet_is_legal($10 + 16 | 0, HEAP32[$10 + 160 >> 2])) { break label$28 } break label$1; } $17 = $10 + 16 | 0; if (!FLAC__format_picture_is_legal($17)) { break label$1 } $11 = $13; $12 = $8; label$33 : { switch (HEAP32[$17 >> 2] + -1 | 0) { case 0: if ($19) { break label$1 } $12 = HEAP32[$10 + 20 >> 2]; if (strcmp($12, 10763)) { if (strcmp($12, 10773)) { break label$1 } } if (HEAP32[$10 + 28 >> 2] != 32) { break label$1 } $19 = 1; $11 = $13; $12 = $8; if (HEAP32[$10 + 32 >> 2] == 32) { break label$28 } break label$1; case 1: break label$33; default: break label$28; }; } $12 = 1; if ($8) { break label$1 } } $14 = $14 + 1 | 0; $8 = HEAP32[$0 >> 2]; if ($14 >>> 0 >= HEAPU32[$8 + 604 >> 2]) { break label$22 } $10 = HEAP32[$8 + 600 >> 2]; $8 = $12; $13 = $11; continue; }; } $10 = 0; $14 = HEAP32[$0 + 4 >> 2]; HEAP32[$14 >> 2] = 0; if (HEAP32[$8 + 24 >> 2]) { while (1) { $8 = $10 << 2; HEAP32[($8 + $14 | 0) + 4 >> 2] = 0; HEAP32[($8 + HEAP32[$0 + 4 >> 2] | 0) + 7328 >> 2] = 0; HEAP32[($8 + HEAP32[$0 + 4 >> 2] | 0) + 44 >> 2] = 0; HEAP32[($8 + HEAP32[$0 + 4 >> 2] | 0) + 7368 >> 2] = 0; $14 = HEAP32[$0 + 4 >> 2]; $10 = $10 + 1 | 0; if ($10 >>> 0 < HEAPU32[HEAP32[$0 >> 2] + 24 >> 2]) { continue } break; } } $8 = 0; HEAP32[$14 + 36 >> 2] = 0; HEAP32[HEAP32[$0 + 4 >> 2] + 7360 >> 2] = 0; HEAP32[HEAP32[$0 + 4 >> 2] + 76 >> 2] = 0; HEAP32[HEAP32[$0 + 4 >> 2] + 7400 >> 2] = 0; HEAP32[HEAP32[$0 + 4 >> 2] + 40 >> 2] = 0; HEAP32[HEAP32[$0 + 4 >> 2] + 7364 >> 2] = 0; HEAP32[HEAP32[$0 + 4 >> 2] + 80 >> 2] = 0; HEAP32[HEAP32[$0 + 4 >> 2] + 7404 >> 2] = 0; $9 = HEAP32[$0 + 4 >> 2]; $10 = HEAP32[$0 >> 2]; if (HEAP32[$10 + 40 >> 2]) { while (1) { $12 = $8 << 2; HEAP32[($12 + $9 | 0) + 84 >> 2] = 0; HEAP32[($12 + HEAP32[$0 + 4 >> 2] | 0) + 7408 >> 2] = 0; $9 = HEAP32[$0 + 4 >> 2]; $8 = $8 + 1 | 0; $10 = HEAP32[$0 >> 2]; if ($8 >>> 0 < HEAPU32[$10 + 40 >> 2]) { continue } break; } } $8 = 0; HEAP32[$9 + 7536 >> 2] = 0; HEAP32[$9 + 212 >> 2] = 0; if (HEAP32[$10 + 24 >> 2]) { while (1) { $12 = $8 << 3; HEAP32[($12 + $9 | 0) + 256 >> 2] = 0; HEAP32[($12 + HEAP32[$0 + 4 >> 2] | 0) + 7540 >> 2] = 0; HEAP32[($12 + HEAP32[$0 + 4 >> 2] | 0) + 260 >> 2] = 0; HEAP32[($12 + HEAP32[$0 + 4 >> 2] | 0) + 7544 >> 2] = 0; $9 = HEAP32[$0 + 4 >> 2]; HEAP32[($9 + ($8 << 2) | 0) + 6768 >> 2] = 0; $8 = $8 + 1 | 0; if ($8 >>> 0 < HEAPU32[HEAP32[$0 >> 2] + 24 >> 2]) { continue } break; } } HEAP32[$9 + 320 >> 2] = 0; HEAP32[HEAP32[$0 + 4 >> 2] + 7604 >> 2] = 0; HEAP32[HEAP32[$0 + 4 >> 2] + 324 >> 2] = 0; HEAP32[HEAP32[$0 + 4 >> 2] + 7608 >> 2] = 0; $8 = HEAP32[$0 + 4 >> 2]; HEAP32[$8 + 6800 >> 2] = 0; HEAP32[$8 + 328 >> 2] = 0; HEAP32[HEAP32[$0 + 4 >> 2] + 7612 >> 2] = 0; HEAP32[HEAP32[$0 + 4 >> 2] + 332 >> 2] = 0; HEAP32[HEAP32[$0 + 4 >> 2] + 7616 >> 2] = 0; $8 = HEAP32[$0 + 4 >> 2]; HEAP32[$8 + 7620 >> 2] = 0; HEAP32[$8 + 7624 >> 2] = 0; HEAP32[$8 + 6848 >> 2] = 0; HEAP32[$8 + 6852 >> 2] = 0; HEAP32[$8 + 6804 >> 2] = 0; $12 = HEAP32[$0 >> 2]; $13 = HEAP32[$12 + 36 >> 2]; $12 = HEAP32[$12 + 32 >> 2]; HEAP32[$8 + 7052 >> 2] = 0; HEAP32[$8 + 7056 >> 2] = 0; HEAP32[$8 + 6864 >> 2] = 0; $9 = $8; $16 = +($12 >>> 0) * .4 / +($13 >>> 0) + .5; label$42 : { if ($16 < 4294967296.0 & $16 >= 0.0) { $12 = ~~$16 >>> 0; break label$42; } $12 = 0; } HEAP32[$9 + 6860 >> 2] = $12 ? $12 : 1; FLAC__cpu_info($8 + 7156 | 0); $9 = HEAP32[$0 + 4 >> 2]; HEAP32[$9 + 7244 >> 2] = 12; HEAP32[$9 + 7240 >> 2] = 13; HEAP32[$9 + 7236 >> 2] = 12; HEAP32[$9 + 7228 >> 2] = 14; HEAP32[$9 + 7224 >> 2] = 15; HEAP32[$9 + 7220 >> 2] = 16; HEAP32[$9 + 7232 >> 2] = 17; $10 = HEAP32[$0 >> 2]; HEAP32[$10 >> 2] = 0; HEAP32[$9 + 7260 >> 2] = $7; label$44 : { label$45 : { label$46 : { if ($7) { if (!FLAC__ogg_encoder_aspect_init($10 + 632 | 0)) { break label$46 } $10 = HEAP32[$0 >> 2]; $9 = HEAP32[$0 + 4 >> 2]; } $8 = $0 + 4 | 0; HEAP32[$9 + 7276 >> 2] = $2; HEAP32[$9 + 7264 >> 2] = $1; HEAP32[$9 + 7288 >> 2] = $6; HEAP32[$9 + 7280 >> 2] = $5; HEAP32[$9 + 7272 >> 2] = $4; HEAP32[$9 + 7268 >> 2] = $3; $1 = HEAP32[$10 + 36 >> 2]; if (HEAPU32[$9 >> 2] < $1 >>> 0) { $3 = $1 + 5 | 0; label$49 : { label$50 : { label$51 : { if (HEAP32[$10 + 24 >> 2]) { $2 = 0; while (1) { $5 = $2 << 2; $4 = $5 + HEAP32[$8 >> 2] | 0; $6 = FLAC__memory_alloc_aligned_int32_array($3, $4 + 7328 | 0, $4 + 4 | 0); $4 = HEAP32[($5 + HEAP32[$8 >> 2] | 0) + 4 >> 2]; HEAP32[$4 >> 2] = 0; HEAP32[$4 + 4 >> 2] = 0; HEAP32[$4 + 8 >> 2] = 0; HEAP32[$4 + 12 >> 2] = 0; $4 = ($5 + HEAP32[$8 >> 2] | 0) + 4 | 0; HEAP32[$4 >> 2] = HEAP32[$4 >> 2] + 16; if (!$6) { break label$51 } $2 = $2 + 1 | 0; if ($2 >>> 0 < HEAPU32[HEAP32[$0 >> 2] + 24 >> 2]) { continue } break; }; } $2 = HEAP32[$8 >> 2]; $4 = FLAC__memory_alloc_aligned_int32_array($3, $2 + 7360 | 0, $2 + 36 | 0); $2 = HEAP32[HEAP32[$8 >> 2] + 36 >> 2]; HEAP32[$2 >> 2] = 0; HEAP32[$2 + 4 >> 2] = 0; HEAP32[$2 + 8 >> 2] = 0; HEAP32[$2 + 12 >> 2] = 0; $2 = HEAP32[$8 >> 2]; HEAP32[$2 + 36 >> 2] = HEAP32[$2 + 36 >> 2] + 16; if ($4) { $2 = HEAP32[$8 >> 2]; $3 = FLAC__memory_alloc_aligned_int32_array($3, $2 + 7364 | 0, $2 + 40 | 0); $2 = HEAP32[HEAP32[$8 >> 2] + 40 >> 2]; HEAP32[$2 >> 2] = 0; HEAP32[$2 + 4 >> 2] = 0; HEAP32[$2 + 8 >> 2] = 0; HEAP32[$2 + 12 >> 2] = 0; $2 = HEAP32[$8 >> 2] + 40 | 0; HEAP32[$2 >> 2] = HEAP32[$2 >> 2] + 16; $2 = ($3 | 0) != 0; } else { $2 = ($4 | 0) != 0 } if (!$2) { break label$51 } $3 = HEAP32[$0 >> 2]; if (HEAP32[$3 + 556 >> 2]) { $2 = HEAP32[$8 >> 2]; if (HEAP32[$3 + 40 >> 2]) { $9 = 0; while (1) { $2 = ($9 << 2) + $2 | 0; if (!FLAC__memory_alloc_aligned_int32_array($1, $2 + 7408 | 0, $2 + 84 | 0)) { break label$51 } $2 = HEAP32[$0 + 4 >> 2]; $9 = $9 + 1 | 0; if ($9 >>> 0 < HEAPU32[HEAP32[$0 >> 2] + 40 >> 2]) { continue } break; }; } if (!FLAC__memory_alloc_aligned_int32_array($1, $2 + 7536 | 0, $2 + 212 | 0)) { break label$51 } } $6 = 0; $10 = 1; $5 = 0; while (1) { if ($5 >>> 0 < HEAPU32[HEAP32[$0 >> 2] + 24 >> 2]) { $9 = 0; $2 = 1; $3 = 0; while (1) { if ($9 & 1) { break label$51 } $3 = (HEAP32[$8 >> 2] + ($5 << 3) | 0) + ($3 << 2) | 0; $4 = FLAC__memory_alloc_aligned_int32_array($1, $3 + 7540 | 0, $3 + 256 | 0); $7 = $2 & ($4 | 0) != 0; $9 = !$4; $3 = 1; $2 = 0; if ($7) { continue } break; }; $5 = $5 + 1 | 0; if ($4) { continue } break label$51; } break; }; $7 = 1; while (1) { $9 = 0; $2 = 1; $3 = 0; if (!$7) { break label$51 } while (1) { if ($9 & 1) { break label$51 } $3 = (HEAP32[$8 >> 2] + ($6 << 3) | 0) + ($3 << 2) | 0; $4 = FLAC__memory_alloc_aligned_int32_array($1, $3 + 7604 | 0, $3 + 320 | 0); $5 = $2 & ($4 | 0) != 0; $9 = !$4; $3 = 1; $2 = 0; if ($5) { continue } break; }; $7 = ($4 | 0) != 0; $2 = $10 & $7; $6 = 1; $10 = 0; if ($2) { continue } break; }; if (!$4) { break label$51 } $3 = $1 << 1; $2 = HEAP32[$0 + 4 >> 2]; $2 = FLAC__memory_alloc_aligned_uint64_array($3, $2 + 7620 | 0, $2 + 6848 | 0); $9 = HEAP32[$0 >> 2]; $4 = HEAP32[$9 + 572 >> 2]; if (!$4 | !$2) { break label$50 } $2 = HEAP32[$8 >> 2]; if (FLAC__memory_alloc_aligned_int32_array($3, $2 + 7624 | 0, $2 + 6852 | 0)) { break label$49 } } $9 = HEAP32[$0 >> 2]; break label$44; } if ($4 | !$2) { break label$44 } } $9 = HEAP32[$8 >> 2]; label$64 : { if (($1 | 0) == HEAP32[$9 >> 2]) { break label$64 } $2 = HEAP32[$0 >> 2]; if (!HEAP32[$2 + 556 >> 2] | !HEAP32[$2 + 40 >> 2]) { break label$64 } $9 = 0; while (1) { label$66 : { label$67 : { label$68 : { label$69 : { label$70 : { label$71 : { label$72 : { label$73 : { label$74 : { label$75 : { label$76 : { label$77 : { label$78 : { label$79 : { label$80 : { label$81 : { label$82 : { label$83 : { label$84 : { $2 = ($9 << 4) + $2 | 0; switch (HEAP32[$2 + 44 >> 2]) { case 16: break label$68; case 15: break label$69; case 14: break label$70; case 13: break label$71; case 12: break label$72; case 11: break label$73; case 10: break label$74; case 9: break label$75; case 8: break label$76; case 7: break label$77; case 6: break label$78; case 5: break label$79; case 4: break label$80; case 3: break label$81; case 2: break label$82; case 1: break label$83; case 0: break label$84; default: break label$67; }; } FLAC__window_bartlett(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1); break label$66; } FLAC__window_bartlett_hann(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1); break label$66; } FLAC__window_blackman(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1); break label$66; } FLAC__window_blackman_harris_4term_92db_sidelobe(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1); break label$66; } FLAC__window_connes(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1); break label$66; } FLAC__window_flattop(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1); break label$66; } FLAC__window_gauss(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1, HEAPF32[$2 + 48 >> 2]); break label$66; } FLAC__window_hamming(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1); break label$66; } FLAC__window_hann(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1); break label$66; } FLAC__window_kaiser_bessel(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1); break label$66; } FLAC__window_nuttall(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1); break label$66; } FLAC__window_rectangle(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1); break label$66; } FLAC__window_triangle(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1); break label$66; } FLAC__window_tukey(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1, HEAPF32[$2 + 48 >> 2]); break label$66; } FLAC__window_partial_tukey(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1, HEAPF32[$2 + 48 >> 2], HEAPF32[$2 + 52 >> 2], HEAPF32[$2 + 56 >> 2]); break label$66; } FLAC__window_punchout_tukey(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1, HEAPF32[$2 + 48 >> 2], HEAPF32[$2 + 52 >> 2], HEAPF32[$2 + 56 >> 2]); break label$66; } FLAC__window_welch(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1); break label$66; } FLAC__window_hann(HEAP32[(HEAP32[$8 >> 2] + ($9 << 2) | 0) + 84 >> 2], $1); } $9 = $9 + 1 | 0; $2 = HEAP32[$0 >> 2]; if ($9 >>> 0 < HEAPU32[$2 + 40 >> 2]) { continue } break; }; $9 = HEAP32[$8 >> 2]; } HEAP32[$9 >> 2] = $1; } $1 = FLAC__bitwriter_init(HEAP32[$9 + 6856 >> 2]); $3 = HEAP32[$0 >> 2]; if (!$1) { HEAP32[$3 >> 2] = 8; $9 = 1; break label$1; } if (HEAP32[$3 + 4 >> 2]) { $9 = 1; $2 = HEAP32[$8 >> 2]; $1 = HEAP32[$3 + 36 >> 2] + 1 | 0; HEAP32[$2 + 11796 >> 2] = $1; label$87 : { if (!HEAP32[$3 + 24 >> 2]) { break label$87 } $1 = safe_malloc_mul_2op_p(4, $1); HEAP32[HEAP32[$0 + 4 >> 2] + 11764 >> 2] = $1; $3 = HEAP32[$0 >> 2]; if ($1) { while (1) { $2 = HEAP32[$8 >> 2]; if ($9 >>> 0 >= HEAPU32[$3 + 24 >> 2]) { break label$87 } $1 = safe_malloc_mul_2op_p(4, HEAP32[$2 + 11796 >> 2]); HEAP32[(HEAP32[$0 + 4 >> 2] + ($9 << 2) | 0) + 11764 >> 2] = $1; $9 = $9 + 1 | 0; $3 = HEAP32[$0 >> 2]; if ($1) { continue } break; } } HEAP32[$3 >> 2] = 8; $9 = 1; break label$1; } HEAP32[$2 + 11800 >> 2] = 0; label$90 : { $2 = HEAP32[$2 + 11752 >> 2]; if ($2) { break label$90 } $2 = FLAC__stream_decoder_new(); HEAP32[HEAP32[$8 >> 2] + 11752 >> 2] = $2; if ($2) { break label$90 } HEAP32[HEAP32[$0 >> 2] >> 2] = 3; $9 = 1; break label$1; } $1 = FLAC__stream_decoder_init_stream($2, 18, 0, 0, 0, 0, 19, 20, 21, $0); $3 = HEAP32[$0 >> 2]; if ($1) { break label$45 } $2 = !HEAP32[$3 + 4 >> 2]; } else { $2 = 1 } $1 = HEAP32[$8 >> 2]; HEAP32[$1 + 7312 >> 2] = 0; HEAP32[$1 + 7316 >> 2] = 0; HEAP32[$1 + 7292 >> 2] = 0; $4 = $1 + 11816 | 0; HEAP32[$4 >> 2] = 0; HEAP32[$4 + 4 >> 2] = 0; $4 = $1 + 11824 | 0; HEAP32[$4 >> 2] = 0; HEAP32[$4 + 4 >> 2] = 0; $4 = $1 + 11832 | 0; HEAP32[$4 >> 2] = 0; HEAP32[$4 + 4 >> 2] = 0; HEAP32[$1 + 11840 >> 2] = 0; HEAP32[$3 + 624 >> 2] = 0; HEAP32[$3 + 628 >> 2] = 0; HEAP32[$3 + 616 >> 2] = 0; HEAP32[$3 + 620 >> 2] = 0; HEAP32[$3 + 608 >> 2] = 0; HEAP32[$3 + 612 >> 2] = 0; if (!$2) { HEAP32[$1 + 11756 >> 2] = 0 } if (!FLAC__bitwriter_write_raw_uint32(HEAP32[$1 + 6856 >> 2], HEAP32[1354], HEAP32[1355])) { HEAP32[HEAP32[$0 >> 2] >> 2] = 7; $9 = 1; break label$1; } $9 = 1; if (!write_bitbuffer_($0, 0, 0)) { break label$1 } $1 = HEAP32[$0 + 4 >> 2]; $2 = HEAP32[$0 >> 2]; if (HEAP32[$2 + 4 >> 2]) { HEAP32[$1 + 11756 >> 2] = 1 } HEAP32[$1 + 6872 >> 2] = 0; HEAP32[$1 + 6876 >> 2] = 0; HEAP32[$1 + 6880 >> 2] = 34; HEAP32[$1 + 6888 >> 2] = HEAP32[$2 + 36 >> 2]; HEAP32[HEAP32[$0 + 4 >> 2] + 6892 >> 2] = HEAP32[HEAP32[$0 >> 2] + 36 >> 2]; HEAP32[HEAP32[$0 + 4 >> 2] + 6896 >> 2] = 0; HEAP32[HEAP32[$0 + 4 >> 2] + 6900 >> 2] = 0; HEAP32[HEAP32[$0 + 4 >> 2] + 6904 >> 2] = HEAP32[HEAP32[$0 >> 2] + 32 >> 2]; HEAP32[HEAP32[$0 + 4 >> 2] + 6908 >> 2] = HEAP32[HEAP32[$0 >> 2] + 24 >> 2]; HEAP32[HEAP32[$0 + 4 >> 2] + 6912 >> 2] = HEAP32[HEAP32[$0 >> 2] + 28 >> 2]; $1 = HEAP32[$0 >> 2]; $2 = HEAP32[$1 + 596 >> 2]; $3 = HEAP32[$0 + 4 >> 2] + 6920 | 0; HEAP32[$3 >> 2] = HEAP32[$1 + 592 >> 2]; HEAP32[$3 + 4 >> 2] = $2; $1 = HEAP32[$0 + 4 >> 2]; $2 = $1 + 6936 | 0; HEAP32[$2 >> 2] = 0; HEAP32[$2 + 4 >> 2] = 0; $1 = $1 + 6928 | 0; HEAP32[$1 >> 2] = 0; HEAP32[$1 + 4 >> 2] = 0; if (HEAP32[HEAP32[$0 >> 2] + 12 >> 2]) { FLAC__MD5Init(HEAP32[$8 >> 2] + 7060 | 0) } $1 = HEAP32[$8 >> 2]; if (!FLAC__add_metadata_block($1 + 6872 | 0, HEAP32[$1 + 6856 >> 2])) { HEAP32[HEAP32[$0 >> 2] >> 2] = 7; break label$1; } if (!write_bitbuffer_($0, 0, 0)) { break label$1 } HEAP32[HEAP32[$8 >> 2] + 6896 >> 2] = -1 << HEAP32[1358] ^ -1; $1 = HEAP32[$8 >> 2] + 6920 | 0; HEAP32[$1 >> 2] = 0; HEAP32[$1 + 4 >> 2] = 0; if (!$11) { HEAP32[$15 >> 2] = 4; $2 = HEAP32[HEAP32[$0 >> 2] + 604 >> 2]; $1 = $15; HEAP32[$1 + 24 >> 2] = 0; HEAP32[$1 + 28 >> 2] = 0; HEAP32[$1 + 16 >> 2] = 0; HEAP32[$1 + 20 >> 2] = 0; HEAP32[$1 + 8 >> 2] = 8; HEAP32[$1 + 4 >> 2] = !$2; if (!FLAC__add_metadata_block($1, HEAP32[HEAP32[$0 + 4 >> 2] + 6856 >> 2])) { HEAP32[HEAP32[$0 >> 2] >> 2] = 7; break label$1; } if (!write_bitbuffer_($0, 0, 0)) { break label$1 } } label$98 : { $3 = HEAP32[$0 >> 2]; $4 = HEAP32[$3 + 604 >> 2]; if (!$4) { break label$98 } $2 = 0; while (1) { $1 = HEAP32[HEAP32[$3 + 600 >> 2] + ($2 << 2) >> 2]; HEAP32[$1 + 4 >> 2] = ($4 + -1 | 0) == ($2 | 0); if (!FLAC__add_metadata_block($1, HEAP32[HEAP32[$8 >> 2] + 6856 >> 2])) { HEAP32[HEAP32[$0 >> 2] >> 2] = 7; break label$1; } if (write_bitbuffer_($0, 0, 0)) { $2 = $2 + 1 | 0; $3 = HEAP32[$0 >> 2]; $4 = HEAP32[$3 + 604 >> 2]; if ($2 >>> 0 >= $4 >>> 0) { break label$98 } continue; } break; }; break label$1; } label$102 : { $1 = HEAP32[$8 >> 2]; $2 = HEAP32[$1 + 7272 >> 2]; if (!$2) { break label$102 } $1 = FUNCTION_TABLE[$2]($0, $3 + 624 | 0, HEAP32[$1 + 7288 >> 2]) | 0; $3 = HEAP32[$0 >> 2]; if (($1 | 0) != 1) { break label$102 } HEAP32[$3 >> 2] = 5; break label$1; } $9 = 0; if (!HEAP32[$3 + 4 >> 2]) { break label$1 } HEAP32[HEAP32[$8 >> 2] + 11756 >> 2] = 2; break label$1; } HEAP32[HEAP32[$0 >> 2] >> 2] = 2; $9 = 1; break label$1; } HEAP32[$3 >> 2] = 3; $9 = 1; break label$1; } HEAP32[$9 >> 2] = 8; $9 = 1; } global$0 = $15 + 176 | 0; return $9; } function precompute_partition_info_sums_($0, $1, $2, $3, $4, $5, $6) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; $4 = $4 | 0; $5 = $5 | 0; $6 = $6 | 0; var $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0; $11 = 1 << $5; $14 = $11 >>> 0 > 1 ? $11 : 1; $8 = 0 - $3 | 0; $12 = $2 + $3 >>> $5 | 0; $9 = $12 - $3 | 0; label$1 : { if ($6 + 4 >>> 0 < (Math_clz32($12) ^ -32) + 33 >>> 0) { $6 = 0; while (1) { $3 = 0; $8 = $8 + $12 | 0; if ($7 >>> 0 < $8 >>> 0) { while (1) { $2 = HEAP32[($7 << 2) + $0 >> 2]; $10 = $2 >> 31; $3 = ($10 ^ $2 + $10) + $3 | 0; $7 = $7 + 1 | 0; if ($7 >>> 0 < $8 >>> 0) { continue } break; }; $7 = $9; } $2 = ($6 << 3) + $1 | 0; HEAP32[$2 >> 2] = $3; HEAP32[$2 + 4 >> 2] = 0; $9 = $9 + $12 | 0; $6 = $6 + 1 | 0; if (($14 | 0) != ($6 | 0)) { continue } break; }; break label$1; } $2 = 0; while (1) { $13 = 0; $3 = 0; $8 = $8 + $12 | 0; if ($7 >>> 0 < $8 >>> 0) { while (1) { $6 = HEAP32[($7 << 2) + $0 >> 2]; $10 = $6 >> 31; $10 = $10 ^ $6 + $10; $6 = $10 + $13 | 0; if ($6 >>> 0 < $10 >>> 0) { $3 = $3 + 1 | 0 } $13 = $6; $7 = $7 + 1 | 0; if ($7 >>> 0 < $8 >>> 0) { continue } break; }; $7 = $9; } $6 = ($2 << 3) + $1 | 0; HEAP32[$6 >> 2] = $13; HEAP32[$6 + 4 >> 2] = $3; $9 = $9 + $12 | 0; $2 = $2 + 1 | 0; if (($14 | 0) != ($2 | 0)) { continue } break; }; } if (($5 | 0) > ($4 | 0)) { $7 = 0; $0 = $11; while (1) { $5 = $5 + -1 | 0; $8 = 0; $0 = $0 >>> 1 | 0; if ($0) { while (1) { $3 = ($7 << 3) + $1 | 0; $2 = HEAP32[$3 + 8 >> 2]; $9 = HEAP32[$3 + 12 >> 2] + HEAP32[$3 + 4 >> 2] | 0; $3 = HEAP32[$3 >> 2]; $2 = $3 + $2 | 0; if ($2 >>> 0 < $3 >>> 0) { $9 = $9 + 1 | 0 } $6 = ($11 << 3) + $1 | 0; HEAP32[$6 >> 2] = $2; HEAP32[$6 + 4 >> 2] = $9; $7 = $7 + 2 | 0; $11 = $11 + 1 | 0; $8 = $8 + 1 | 0; if (($8 | 0) != ($0 | 0)) { continue } break; } } if (($5 | 0) > ($4 | 0)) { continue } break; }; } } function verify_read_callback_($0, $1, $2, $3) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; var $4 = 0, $5 = 0; $5 = HEAP32[$3 + 4 >> 2]; if (HEAP32[$5 + 11760 >> 2]) { HEAP32[$2 >> 2] = 4; $0 = HEAPU8[5409] | HEAPU8[5410] << 8 | (HEAPU8[5411] << 16 | HEAPU8[5412] << 24); HEAP8[$1 | 0] = $0; HEAP8[$1 + 1 | 0] = $0 >>> 8; HEAP8[$1 + 2 | 0] = $0 >>> 16; HEAP8[$1 + 3 | 0] = $0 >>> 24; HEAP32[HEAP32[$3 + 4 >> 2] + 11760 >> 2] = 0; return 0; } $0 = HEAP32[$5 + 11812 >> 2]; if (!$0) { return 2 } $4 = HEAP32[$2 >> 2]; if ($0 >>> 0 < $4 >>> 0) { HEAP32[$2 >> 2] = $0; $4 = $0; } memcpy($1, HEAP32[$5 + 11804 >> 2], $4); $0 = HEAP32[$3 + 4 >> 2]; $1 = $0 + 11804 | 0; $3 = $1; $4 = HEAP32[$1 >> 2]; $1 = HEAP32[$2 >> 2]; HEAP32[$3 >> 2] = $4 + $1; $0 = $0 + 11812 | 0; HEAP32[$0 >> 2] = HEAP32[$0 >> 2] - $1; return 0; } function verify_write_callback_($0, $1, $2, $3) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; var $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0; $7 = HEAP32[$1 >> 2]; $5 = HEAP32[$3 + 4 >> 2]; $0 = HEAP32[$1 + 8 >> 2]; if ($0) { $4 = $7 << 2; while (1) { $8 = $6 << 2; $9 = HEAP32[$8 + $2 >> 2]; $10 = HEAP32[($5 + $8 | 0) + 11764 >> 2]; if (memcmp($9, $10, $4)) { $4 = 0; label$4 : { if ($7) { $0 = 0; while (1) { $2 = $0 << 2; $8 = HEAP32[$2 + $9 >> 2]; $2 = HEAP32[$2 + $10 >> 2]; if (($8 | 0) != ($2 | 0)) { $4 = $0; break label$4; } $0 = $0 + 1 | 0; if (($7 | 0) != ($0 | 0)) { continue } break; }; } $2 = 0; $8 = 0; } $9 = HEAP32[$1 + 28 >> 2]; $0 = $4; $11 = $0 + HEAP32[$1 + 24 >> 2] | 0; if ($11 >>> 0 < $0 >>> 0) { $9 = $9 + 1 | 0 } $10 = $5 + 11816 | 0; HEAP32[$10 >> 2] = $11; HEAP32[$10 + 4 >> 2] = $9; $0 = HEAP32[$1 + 28 >> 2]; $1 = HEAP32[$1 + 24 >> 2]; HEAP32[$5 + 11840 >> 2] = $8; HEAP32[$5 + 11836 >> 2] = $2; HEAP32[$5 + 11832 >> 2] = $4; HEAP32[$5 + 11828 >> 2] = $6; (wasm2js_i32$0 = $5 + 11824 | 0, wasm2js_i32$1 = __wasm_i64_udiv($1, $0, $7)), HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1; HEAP32[HEAP32[$3 >> 2] >> 2] = 4; return 1; } $6 = $6 + 1 | 0; if (($0 | 0) != ($6 | 0)) { continue } break; }; $2 = $5 + 11800 | 0; $1 = HEAP32[$2 >> 2] - $7 | 0; HEAP32[$2 >> 2] = $1; label$8 : { if (!$0) { break label$8 } $2 = HEAP32[$5 + 11764 >> 2]; $4 = $2; $2 = $7 << 2; memmove($4, $4 + $2 | 0, $1 << 2); $6 = 1; if (($0 | 0) == 1) { break label$8 } while (1) { $1 = HEAP32[$3 + 4 >> 2]; $4 = HEAP32[($1 + ($6 << 2) | 0) + 11764 >> 2]; memmove($4, $2 + $4 | 0, HEAP32[$1 + 11800 >> 2] << 2); $6 = $6 + 1 | 0; if (($0 | 0) != ($6 | 0)) { continue } break; }; } return 0; } $0 = $5 + 11800 | 0; HEAP32[$0 >> 2] = HEAP32[$0 >> 2] - $7; return 0; } function verify_metadata_callback_($0, $1, $2) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; } function verify_error_callback_($0, $1, $2) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; HEAP32[HEAP32[$2 >> 2] >> 2] = 3; } function write_bitbuffer_($0, $1, $2) { var $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0; $5 = global$0 - 16 | 0; global$0 = $5; $4 = FLAC__bitwriter_get_buffer(HEAP32[HEAP32[$0 + 4 >> 2] + 6856 >> 2], $5 + 4 | 0, $5); $3 = HEAP32[$0 >> 2]; label$1 : { label$2 : { if (!$4) { HEAP32[$3 >> 2] = 8; break label$2; } label$4 : { if (!HEAP32[$3 + 4 >> 2]) { break label$4 } $3 = HEAP32[$0 + 4 >> 2]; HEAP32[$3 + 11804 >> 2] = HEAP32[$5 + 4 >> 2]; HEAP32[$3 + 11812 >> 2] = HEAP32[$5 >> 2]; if (!HEAP32[$3 + 11756 >> 2]) { HEAP32[$3 + 11760 >> 2] = 1; break label$4; } if (FLAC__stream_decoder_process_single(HEAP32[$3 + 11752 >> 2])) { break label$4 } FLAC__bitwriter_clear(HEAP32[HEAP32[$0 + 4 >> 2] + 6856 >> 2]); $0 = HEAP32[$0 >> 2]; if (HEAP32[$0 >> 2] == 4) { break label$1 } HEAP32[$0 >> 2] = 3; break label$1; } $12 = HEAP32[$5 >> 2]; $14 = HEAP32[$5 + 4 >> 2]; HEAP32[$5 + 8 >> 2] = 0; HEAP32[$5 + 12 >> 2] = 0; label$6 : { label$7 : { $3 = HEAP32[$0 + 4 >> 2]; $4 = HEAP32[$3 + 7272 >> 2]; if (!$4) { break label$7 } if ((FUNCTION_TABLE[$4]($0, $5 + 8 | 0, HEAP32[$3 + 7288 >> 2]) | 0) != 1) { break label$7 } break label$6; } label$8 : { if ($1) { break label$8 } label$9 : { switch (HEAPU8[$14 | 0] & 127) { case 0: $3 = HEAP32[$5 + 12 >> 2]; $4 = HEAP32[$0 >> 2]; HEAP32[$4 + 608 >> 2] = HEAP32[$5 + 8 >> 2]; HEAP32[$4 + 612 >> 2] = $3; break label$8; case 3: break label$9; default: break label$8; }; } $3 = HEAP32[$0 >> 2]; if (HEAP32[$3 + 616 >> 2] | HEAP32[$3 + 620 >> 2]) { break label$8 } $4 = HEAP32[$5 + 12 >> 2]; HEAP32[$3 + 616 >> 2] = HEAP32[$5 + 8 >> 2]; HEAP32[$3 + 620 >> 2] = $4; } $6 = HEAP32[$0 + 4 >> 2]; $7 = HEAP32[$6 + 7048 >> 2]; label$11 : { if (!$7) { break label$11 } $8 = HEAP32[$0 >> 2]; $4 = $8; $3 = HEAP32[$4 + 628 >> 2]; $15 = HEAP32[$4 + 624 >> 2]; if (!($3 | $15)) { break label$11 } $16 = HEAP32[$7 >> 2]; if (!$16) { break label$11 } $10 = HEAP32[$6 + 7292 >> 2]; if ($10 >>> 0 >= $16 >>> 0) { break label$11 } $13 = HEAP32[$6 + 7316 >> 2]; $4 = $13; $17 = HEAP32[$6 + 7312 >> 2]; $18 = HEAP32[$8 + 36 >> 2]; $8 = $18; $9 = $17 + $8 | 0; if ($9 >>> 0 < $8 >>> 0) { $4 = $4 + 1 | 0 } $4 = $4 + -1 | 0; $11 = $4 + 1 | 0; $8 = $4; $4 = $9 + -1 | 0; $8 = ($4 | 0) != -1 ? $11 : $8; $19 = HEAP32[$7 + 4 >> 2]; while (1) { $7 = $19 + Math_imul($10, 24) | 0; $11 = HEAP32[$7 >> 2]; $9 = HEAP32[$7 + 4 >> 2]; if (($8 | 0) == ($9 | 0) & $11 >>> 0 > $4 >>> 0 | $9 >>> 0 > $8 >>> 0) { break label$11 } if (($9 | 0) == ($13 | 0) & $11 >>> 0 >= $17 >>> 0 | $9 >>> 0 > $13 >>> 0) { HEAP32[$7 >> 2] = $17; HEAP32[$7 + 4 >> 2] = $13; $9 = HEAP32[$5 + 8 >> 2]; $11 = HEAP32[$5 + 12 >> 2]; HEAP32[$7 + 16 >> 2] = $18; HEAP32[$7 + 8 >> 2] = $9 - $15; HEAP32[$7 + 12 >> 2] = $11 - ($3 + ($9 >>> 0 < $15 >>> 0) | 0); } $10 = $10 + 1 | 0; HEAP32[$6 + 7292 >> 2] = $10; if (($10 | 0) != ($16 | 0)) { continue } break; }; } label$14 : { if (HEAP32[$6 + 7260 >> 2]) { $2 = FLAC__ogg_encoder_aspect_write_callback_wrapper(HEAP32[$0 >> 2] + 632 | 0, $14, $12, $1, HEAP32[$6 + 7056 >> 2], $2, HEAP32[$6 + 7276 >> 2], $0, HEAP32[$6 + 7288 >> 2]); break label$14; } $2 = FUNCTION_TABLE[HEAP32[$6 + 7276 >> 2]]($0, $14, $12, $1, HEAP32[$6 + 7056 >> 2], HEAP32[$6 + 7288 >> 2]) | 0; } if (!$2) { $2 = HEAP32[$0 + 4 >> 2]; $3 = $2; $8 = $3; $4 = HEAP32[$3 + 7308 >> 2]; $6 = $12 + HEAP32[$3 + 7304 >> 2] | 0; if ($6 >>> 0 < $12 >>> 0) { $4 = $4 + 1 | 0 } HEAP32[$8 + 7304 >> 2] = $6; HEAP32[$3 + 7308 >> 2] = $4; $3 = HEAP32[$2 + 7316 >> 2]; $4 = HEAP32[$2 + 7312 >> 2] + $1 | 0; if ($4 >>> 0 < $1 >>> 0) { $3 = $3 + 1 | 0 } HEAP32[$2 + 7312 >> 2] = $4; HEAP32[$2 + 7316 >> 2] = $3; $10 = 1; $4 = $2; $3 = HEAP32[$2 + 7320 >> 2]; $2 = HEAP32[$2 + 7056 >> 2] + 1 | 0; HEAP32[$4 + 7320 >> 2] = $3 >>> 0 > $2 >>> 0 ? $3 : $2; FLAC__bitwriter_clear(HEAP32[HEAP32[$0 + 4 >> 2] + 6856 >> 2]); if (!$1) { break label$1 } $1 = HEAP32[$0 + 4 >> 2] + 6896 | 0; $2 = HEAP32[$1 >> 2]; $4 = $1; $1 = HEAP32[$5 >> 2]; HEAP32[$4 >> 2] = $1 >>> 0 < $2 >>> 0 ? $1 : $2; $2 = HEAP32[$0 + 4 >> 2] + 6900 | 0; $0 = HEAP32[$2 >> 2]; HEAP32[$2 >> 2] = $1 >>> 0 > $0 >>> 0 ? $1 : $0; break label$1; } } HEAP32[HEAP32[$0 >> 2] >> 2] = 5; FLAC__bitwriter_clear(HEAP32[HEAP32[$0 + 4 >> 2] + 6856 >> 2]); HEAP32[HEAP32[$0 >> 2] >> 2] = 5; } $10 = 0; } global$0 = $5 + 16 | 0; return $10; } function FLAC__stream_encoder_init_ogg_stream($0, $1, $2, $3, $4, $5, $6) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; $4 = $4 | 0; $5 = $5 | 0; $6 = $6 | 0; return init_stream_internal__1($0, $1, $2, $3, $4, $5, $6, 1) | 0; } function process_subframe_($0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10) { var $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0, $22 = 0, $23 = 0, $24 = 0.0, $25 = 0, $26 = 0, $27 = 0.0, $28 = 0, $29 = 0, $30 = 0, $31 = 0, $32 = 0, $33 = 0, $34 = 0, $35 = Math_fround(0), $36 = 0, $37 = 0, $38 = 0, $39 = 0, $40 = 0, $41 = 0, $42 = Math_fround(0), $43 = 0, $44 = 0, $45 = 0, $46 = 0, $47 = 0, $48 = 0; $14 = global$0 - 576 | 0; global$0 = $14; $25 = HEAP32[(HEAPU32[HEAP32[$0 >> 2] + 28 >> 2] > 16 ? 5644 : 5640) >> 2]; $12 = HEAP32[$3 >> 2]; label$1 : { label$2 : { if (HEAP32[HEAP32[$0 + 4 >> 2] + 7256 >> 2]) { $11 = -1; if ($12 >>> 0 > 3) { break label$2 } } $16 = HEAP32[$6 >> 2]; HEAP32[$16 + 4 >> 2] = $5; HEAP32[$16 >> 2] = 1; $11 = HEAP32[$16 + 288 >> 2] + (HEAP32[1416] + (HEAP32[1415] + (HEAP32[1414] + Math_imul($4, $12) | 0) | 0) | 0) | 0; $12 = HEAP32[$3 >> 2]; if ($12 >>> 0 < 4) { break label$1 } } $13 = HEAP32[$0 + 4 >> 2]; $16 = $12 + -4 | 0; label$4 : { if (((Math_clz32($16 | 1) ^ 31) + $4 | 0) + 4 >>> 0 <= 32) { $13 = FUNCTION_TABLE[HEAP32[$13 + 7224 >> 2]]($5 + 16 | 0, $16, $14 + 416 | 0) | 0; break label$4; } $13 = FUNCTION_TABLE[HEAP32[$13 + 7228 >> 2]]($5 + 16 | 0, $16, $14 + 416 | 0) | 0; } label$6 : { label$7 : { label$8 : { label$9 : { $15 = HEAP32[$0 + 4 >> 2]; if (HEAP32[$15 + 7248 >> 2] | HEAPF32[$14 + 420 >> 2] != Math_fround(0.0)) { break label$9 } $12 = 1; $17 = HEAP32[$5 >> 2]; $16 = HEAP32[$3 >> 2]; if ($16 >>> 0 <= 1) { break label$8 } while (1) { if (($17 | 0) != HEAP32[($12 << 2) + $5 >> 2]) { break label$9 } $12 = $12 + 1 | 0; if ($12 >>> 0 < $16 >>> 0) { continue } break; }; break label$8; } $12 = HEAP32[$0 >> 2]; if (!HEAP32[$15 + 7252 >> 2]) { $16 = $11; break label$7; } $16 = -1; if (($11 | 0) != -1) { $16 = $11; break label$6; } if (!HEAP32[$12 + 556 >> 2]) { break label$7 } $16 = $11; break label$6; } $0 = HEAP32[$6 + 4 >> 2]; HEAP32[$0 + 4 >> 2] = $17; HEAP32[$0 >> 2] = 0; $0 = HEAP32[$0 + 288 >> 2] + (HEAP32[1416] + (HEAP32[1415] + (HEAP32[1414] + $4 | 0) | 0) | 0) | 0; $19 = $0 >>> 0 < $11 >>> 0; $11 = $19 ? $0 : $11; break label$1; } $11 = HEAP32[$12 + 568 >> 2]; $18 = $11 ? 0 : $13; $13 = $11 ? 4 : $13; $11 = HEAP32[$3 >> 2]; $29 = $13 >>> 0 < $11 >>> 0 ? $13 : $11 + -1 | 0; if ($18 >>> 0 > $29 >>> 0) { break label$6 } $32 = $25 + -1 | 0; $33 = HEAP32[1416]; $30 = HEAP32[1415]; $34 = HEAP32[1414]; $42 = Math_fround($4 >>> 0); while (1) { $12 = $18 << 2; $35 = HEAPF32[$12 + ($14 + 416 | 0) >> 2]; if (!($35 >= $42)) { $31 = !$19; $17 = $31 << 2; $36 = HEAP32[$17 + $7 >> 2]; $21 = HEAP32[$6 + $17 >> 2]; $23 = HEAP32[HEAP32[$0 >> 2] + 572 >> 2]; $11 = HEAP32[$0 + 4 >> 2]; $13 = HEAP32[$11 + 6852 >> 2]; $15 = HEAP32[$11 + 6848 >> 2]; $11 = $5 + $12 | 0; $12 = HEAP32[$3 >> 2] - $18 | 0; $17 = HEAP32[$8 + $17 >> 2]; FLAC__fixed_compute_residual($11, $12, $18, $17); HEAP32[$21 + 36 >> 2] = $17; HEAP32[$21 + 12 >> 2] = $36; HEAP32[$21 >> 2] = 2; HEAP32[$21 + 4 >> 2] = 0; $37 = $35 > Math_fround(0.0); $26 = HEAP32[$0 + 4 >> 2]; $22 = $18; $27 = +$35 + .5; label$15 : { if ($27 < 4294967296.0 & $27 >= 0.0) { $11 = ~~$27 >>> 0; break label$15; } $11 = 0; } $11 = $37 ? $11 + 1 | 0 : 1; $15 = find_best_partition_order_($26, $17, $15, $13, $12, $22, $11 >>> 0 < $25 >>> 0 ? $11 : $32, $25, $1, $2, $4, $23, $21 + 4 | 0); HEAP32[$21 + 16 >> 2] = $18; if ($18) { $13 = $21 + 20 | 0; $11 = 0; while (1) { $12 = $11 << 2; HEAP32[$12 + $13 >> 2] = HEAP32[$5 + $12 >> 2]; $11 = $11 + 1 | 0; if (($18 | 0) != ($11 | 0)) { continue } break; }; } $11 = HEAP32[$21 + 288 >> 2] + ($33 + ($30 + ($34 + ($15 + Math_imul($4, $18) | 0) | 0) | 0) | 0) | 0; $12 = $11 >>> 0 < $16 >>> 0; $19 = $12 ? $31 : $19; $16 = $12 ? $11 : $16; } $18 = $18 + 1 | 0; if ($18 >>> 0 <= $29 >>> 0) { continue } break; }; $12 = HEAP32[$0 >> 2]; } $13 = HEAP32[$12 + 556 >> 2]; if (!$13) { $11 = $16; break label$1; } $11 = HEAP32[$3 >> 2]; $13 = $13 >>> 0 < $11 >>> 0 ? $13 : $11 + -1 | 0; HEAP32[$14 + 12 >> 2] = $13; if (!$13) { $11 = $16; break label$1; } if (!HEAP32[$12 + 40 >> 2]) { $11 = $16; break label$1; } $40 = 33 - $4 | 0; $43 = $25 + -1 | 0; $44 = HEAP32[1413]; $45 = HEAP32[1412]; $46 = HEAP32[1416]; $21 = HEAP32[1415]; $47 = HEAP32[1414]; $27 = +($4 >>> 0); $29 = $4 >>> 0 < 18; $32 = $4 >>> 0 > 16; $33 = $4 >>> 0 > 17; while (1) { $12 = HEAP32[$0 + 4 >> 2]; FLAC__lpc_window_data($5, HEAP32[($12 + ($38 << 2) | 0) + 84 >> 2], HEAP32[$12 + 212 >> 2], $11); $11 = HEAP32[$0 + 4 >> 2]; FUNCTION_TABLE[HEAP32[$11 + 7232 >> 2]](HEAP32[$11 + 212 >> 2], HEAP32[$3 >> 2], HEAP32[$14 + 12 >> 2] + 1 | 0, $14 + 272 | 0); label$23 : { if (HEAPF32[$14 + 272 >> 2] == Math_fround(0.0)) { break label$23 } FLAC__lpc_compute_lp_coefficients($14 + 272 | 0, $14 + 12 | 0, HEAP32[$0 + 4 >> 2] + 7628 | 0, $14 + 16 | 0); $15 = 1; $12 = HEAP32[$14 + 12 >> 2]; $17 = HEAP32[$0 >> 2]; if (!HEAP32[$17 + 568 >> 2]) { $11 = $14; $12 = FLAC__lpc_compute_best_order($11 + 16 | 0, $12, HEAP32[$3 >> 2], (HEAP32[$17 + 564 >> 2] ? 5 : HEAP32[$17 + 560 >> 2]) + $4 | 0); HEAP32[$11 + 12 >> 2] = $12; $15 = $12; } $11 = HEAP32[$3 >> 2]; if ($12 >>> 0 >= $11 >>> 0) { $12 = $11 + -1 | 0; HEAP32[$14 + 12 >> 2] = $12; } if ($15 >>> 0 > $12 >>> 0) { break label$23 } while (1) { label$29 : { $30 = $15 + -1 | 0; $24 = FLAC__lpc_compute_expected_bits_per_residual_sample(HEAPF64[($14 + 16 | 0) + ($30 << 3) >> 3], $11 - $15 | 0); if ($24 >= $27) { break label$29 } $11 = $24 > 0.0; $24 = $24 + .5; label$30 : { if ($24 < 4294967296.0 & $24 >= 0.0) { $13 = ~~$24 >>> 0; break label$30; } $13 = 0; } $13 = $11 ? $13 + 1 | 0 : 1; $11 = $13 >>> 0 < $25 >>> 0; $12 = HEAP32[$0 >> 2]; label$32 : { if (HEAP32[$12 + 564 >> 2]) { $22 = 5; $26 = 15; if ($33) { break label$32 } $17 = (Math_clz32($15) ^ -32) + $40 | 0; if ($17 >>> 0 > 14) { break label$32 } $26 = $17 >>> 0 > 5 ? $17 : 5; break label$32; } $26 = HEAP32[$12 + 560 >> 2]; $22 = $26; } $34 = $11 ? $13 : $43; $39 = ($15 << 2) + $5 | 0; $11 = Math_clz32($15); $31 = $11 ^ 31; $41 = ($11 ^ -32) + $40 | 0; while (1) { $23 = HEAP32[$3 >> 2]; $13 = !$19; $11 = $13 << 2; $37 = HEAP32[$11 + $7 >> 2]; $20 = HEAP32[$6 + $11 >> 2]; $28 = HEAP32[$8 + $11 >> 2]; $36 = HEAP32[$12 + 572 >> 2]; $12 = HEAP32[$0 + 4 >> 2]; $18 = HEAP32[$12 + 6852 >> 2]; $17 = HEAP32[$12 + 6848 >> 2]; $11 = 0; $48 = $19; $19 = ($12 + ($30 << 7) | 0) + 7628 | 0; $12 = $29 ? ($41 >>> 0 > $22 >>> 0 ? $22 : $41) : $22; if (!FLAC__lpc_quantize_coefficients($19, $15, $12, $14 + 448 | 0, $14 + 444 | 0)) { $23 = $23 - $15 | 0; $19 = $4 + $12 | 0; label$37 : { if ($19 + $31 >>> 0 <= 32) { $11 = HEAP32[$0 + 4 >> 2]; if (!($12 >>> 0 > 16 | $32)) { FUNCTION_TABLE[HEAP32[$11 + 7244 >> 2]]($39, $23, $14 + 448 | 0, $15, HEAP32[$14 + 444 >> 2], $28); break label$37; } FUNCTION_TABLE[HEAP32[$11 + 7236 >> 2]]($39, $23, $14 + 448 | 0, $15, HEAP32[$14 + 444 >> 2], $28); break label$37; } FUNCTION_TABLE[HEAP32[HEAP32[$0 + 4 >> 2] + 7240 >> 2]]($39, $23, $14 + 448 | 0, $15, HEAP32[$14 + 444 >> 2], $28); } HEAP32[$20 >> 2] = 3; HEAP32[$20 + 4 >> 2] = 0; HEAP32[$20 + 284 >> 2] = $28; HEAP32[$20 + 12 >> 2] = $37; $18 = find_best_partition_order_(HEAP32[$0 + 4 >> 2], $28, $17, $18, $23, $15, $34, $25, $1, $2, $4, $36, $20 + 4 | 0); HEAP32[$20 + 20 >> 2] = $12; HEAP32[$20 + 16 >> 2] = $15; HEAP32[$20 + 24 >> 2] = HEAP32[$14 + 444 >> 2]; memcpy($20 + 28 | 0, $14 + 448 | 0, 128); $11 = 0; if ($15) { while (1) { $17 = $11 << 2; HEAP32[($17 + $20 | 0) + 156 >> 2] = HEAP32[$5 + $17 >> 2]; $11 = $11 + 1 | 0; if (($15 | 0) != ($11 | 0)) { continue } break; } } $11 = ((HEAP32[$20 + 288 >> 2] + (((($18 + Math_imul($15, $19) | 0) + $47 | 0) + $21 | 0) + $46 | 0) | 0) + $45 | 0) + $44 | 0; } $12 = ($11 | 0) != 0 & $11 >>> 0 < $16 >>> 0; $19 = $12 ? $13 : $48; $16 = $12 ? $11 : $16; $22 = $22 + 1 | 0; if ($22 >>> 0 > $26 >>> 0) { break label$29 } $12 = HEAP32[$0 >> 2]; continue; }; } $15 = $15 + 1 | 0; if ($15 >>> 0 > HEAPU32[$14 + 12 >> 2]) { break label$23 } $11 = HEAP32[$3 >> 2]; continue; }; } $38 = $38 + 1 | 0; if ($38 >>> 0 < HEAPU32[HEAP32[$0 >> 2] + 40 >> 2]) { $11 = HEAP32[$3 >> 2]; continue; } break; }; $11 = $16; } if (($11 | 0) == -1) { $0 = HEAP32[$3 >> 2]; $1 = HEAP32[($19 << 2) + $6 >> 2]; HEAP32[$1 + 4 >> 2] = $5; HEAP32[$1 >> 2] = 1; $11 = HEAP32[$1 + 288 >> 2] + (HEAP32[1416] + (HEAP32[1415] + (HEAP32[1414] + Math_imul($0, $4) | 0) | 0) | 0) | 0; } HEAP32[$9 >> 2] = $19; HEAP32[$10 >> 2] = $11; global$0 = $14 + 576 | 0; } function add_subframe_($0, $1, $2, $3, $4) { var $5 = 0; $5 = 1; label$1 : { label$2 : { label$3 : { switch (HEAP32[$3 >> 2]) { case 0: if (FLAC__subframe_add_constant($3 + 4 | 0, $2, HEAP32[$3 + 288 >> 2], $4)) { break label$1 } break label$2; case 2: if (FLAC__subframe_add_fixed($3 + 4 | 0, $1 - HEAP32[$3 + 16 >> 2] | 0, $2, HEAP32[$3 + 288 >> 2], $4)) { break label$1 } break label$2; case 3: if (FLAC__subframe_add_lpc($3 + 4 | 0, $1 - HEAP32[$3 + 16 >> 2] | 0, $2, HEAP32[$3 + 288 >> 2], $4)) { break label$1 } break label$2; case 1: break label$3; default: break label$1; }; } if (FLAC__subframe_add_verbatim($3 + 4 | 0, $1, $2, HEAP32[$3 + 288 >> 2], $4)) { break label$1 } } HEAP32[HEAP32[$0 >> 2] >> 2] = 7; $5 = 0; } return $5; } function FLAC__stream_encoder_set_ogg_serial_number($0, $1) { $0 = $0 | 0; $1 = $1 | 0; $0 = HEAP32[$0 >> 2]; if (HEAP32[$0 >> 2] == 1) { HEAP32[$0 + 632 >> 2] = $1; $0 = 1; } else { $0 = 0 } return $0 | 0; } function FLAC__stream_encoder_set_verify($0, $1) { $0 = $0 | 0; $1 = $1 | 0; $0 = HEAP32[$0 >> 2]; if (HEAP32[$0 >> 2] == 1) { HEAP32[$0 + 4 >> 2] = $1; $0 = 1; } else { $0 = 0 } return $0 | 0; } function FLAC__stream_encoder_set_channels($0, $1) { $0 = $0 | 0; $1 = $1 | 0; $0 = HEAP32[$0 >> 2]; if (HEAP32[$0 >> 2] == 1) { HEAP32[$0 + 24 >> 2] = $1; $0 = 1; } else { $0 = 0 } return $0 | 0; } function FLAC__stream_encoder_set_bits_per_sample($0, $1) { $0 = $0 | 0; $1 = $1 | 0; $0 = HEAP32[$0 >> 2]; if (HEAP32[$0 >> 2] == 1) { HEAP32[$0 + 28 >> 2] = $1; $0 = 1; } else { $0 = 0 } return $0 | 0; } function FLAC__stream_encoder_set_sample_rate($0, $1) { $0 = $0 | 0; $1 = $1 | 0; $0 = HEAP32[$0 >> 2]; if (HEAP32[$0 >> 2] == 1) { HEAP32[$0 + 32 >> 2] = $1; $0 = 1; } else { $0 = 0 } return $0 | 0; } function FLAC__stream_encoder_set_compression_level($0, $1) { $0 = $0 | 0; $1 = $1 | 0; var $2 = 0, $3 = 0, $4 = 0; $3 = HEAP32[$0 >> 2]; if (HEAP32[$3 >> 2] == 1) { $2 = Math_imul($1 >>> 0 < 8 ? $1 : 8, 44); $1 = $2 + 11184 | 0; $4 = HEAP32[$1 + 4 >> 2]; HEAP32[$3 + 16 >> 2] = HEAP32[$1 >> 2]; HEAP32[$3 + 20 >> 2] = $4; $3 = FLAC__stream_encoder_set_apodization($0, HEAP32[$1 + 40 >> 2]); $1 = 0; $0 = HEAP32[$0 >> 2]; if (HEAP32[$0 >> 2] == 1) { $1 = $2 + 11184 | 0; $2 = HEAP32[$1 + 32 >> 2]; HEAP32[$0 + 576 >> 2] = HEAP32[$1 + 28 >> 2]; HEAP32[$0 + 580 >> 2] = $2; HEAP32[$0 + 568 >> 2] = HEAP32[$1 + 24 >> 2]; HEAP32[$0 + 564 >> 2] = HEAP32[$1 + 16 >> 2]; $2 = HEAP32[$1 + 12 >> 2]; HEAP32[$0 + 556 >> 2] = HEAP32[$1 + 8 >> 2]; HEAP32[$0 + 560 >> 2] = $2; $1 = $3 & 1; $0 = 1; } else { $0 = 0 } $0 = $0 & $1; } else { $0 = 0 } return $0 | 0; } function FLAC__stream_encoder_set_blocksize($0, $1) { $0 = $0 | 0; $1 = $1 | 0; $0 = HEAP32[$0 >> 2]; if (HEAP32[$0 >> 2] == 1) { HEAP32[$0 + 36 >> 2] = $1; $0 = 1; } else { $0 = 0 } return $0 | 0; } function FLAC__stream_encoder_set_total_samples_estimate($0, $1, $2) { var $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0; $0 = HEAP32[$0 >> 2]; if (HEAP32[$0 >> 2] == 1) { $6 = $2; $7 = $0; $8 = $1; $4 = HEAP32[1363]; $3 = $4 & 31; if (32 <= ($4 & 63) >>> 0) { $4 = -1 << $3; $3 = 0; } else { $4 = (1 << $3) - 1 & -1 >>> 32 - $3 | -1 << $3; $3 = -1 << $3; } $5 = $3 ^ -1; $3 = $4 ^ -1; $1 = ($2 | 0) == ($3 | 0) & $5 >>> 0 > $1 >>> 0 | $3 >>> 0 > $2 >>> 0; HEAP32[$7 + 592 >> 2] = $1 ? $8 : $5; HEAP32[$0 + 596 >> 2] = $1 ? $6 : $3; $0 = 1; } else { $0 = 0 } return $0; } function FLAC__stream_encoder_set_metadata($0, $1, $2) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; var $3 = 0, $4 = 0; $3 = HEAP32[$0 >> 2]; if (HEAP32[$3 >> 2] == 1) { $4 = HEAP32[$3 + 600 >> 2]; if ($4) { dlfree($4); $3 = HEAP32[$0 >> 2]; HEAP32[$3 + 600 >> 2] = 0; HEAP32[$3 + 604 >> 2] = 0; } $2 = $1 ? $2 : 0; if ($2) { $3 = safe_malloc_mul_2op_p(4, $2); if (!$3) { return 0 } $1 = memcpy($3, $1, $2 << 2); $3 = HEAP32[$0 >> 2]; HEAP32[$3 + 604 >> 2] = $2; HEAP32[$3 + 600 >> 2] = $1; } $0 = $3 + 632 | 0; if ($2 >>> HEAP32[1886]) { $0 = 0 } else { HEAP32[$0 + 4 >> 2] = $2; $0 = 1; } $0 = ($0 | 0) != 0; } else { $0 = 0 } return $0 | 0; } function FLAC__stream_encoder_get_verify_decoder_state($0) { $0 = $0 | 0; if (!HEAP32[HEAP32[$0 >> 2] + 4 >> 2]) { return 9 } return FLAC__stream_decoder_get_state(HEAP32[HEAP32[$0 + 4 >> 2] + 11752 >> 2]) | 0; } function FLAC__stream_encoder_get_verify($0) { $0 = $0 | 0; return HEAP32[HEAP32[$0 >> 2] + 4 >> 2]; } function FLAC__stream_encoder_process($0, $1, $2) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; var $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0; $5 = HEAP32[$0 >> 2]; $11 = HEAP32[$5 + 36 >> 2]; $16 = $11 + 1 | 0; $4 = HEAP32[$0 + 4 >> 2]; $10 = HEAP32[$5 + 24 >> 2]; $13 = $11 << 2; label$1 : { while (1) { $3 = $16 - HEAP32[$4 + 7052 >> 2] | 0; $6 = $2 - $7 | 0; $6 = $3 >>> 0 < $6 >>> 0 ? $3 : $6; if (HEAP32[$5 + 4 >> 2]) { if ($10) { $5 = $6 << 2; $3 = 0; while (1) { $8 = $3 << 2; memcpy(HEAP32[($8 + $4 | 0) + 11764 >> 2] + (HEAP32[$4 + 11800 >> 2] << 2) | 0, HEAP32[$1 + $8 >> 2] + ($7 << 2) | 0, $5); $3 = $3 + 1 | 0; if (($10 | 0) != ($3 | 0)) { continue } break; }; } $4 = $4 + 11800 | 0; HEAP32[$4 >> 2] = HEAP32[$4 >> 2] + $6; } if ($10) { $5 = $6 << 2; $4 = 0; $3 = 0; while (1) { $8 = $3 << 2; $12 = HEAP32[$8 + $1 >> 2]; if (!$12) { break label$1 } $9 = $8; $8 = HEAP32[$0 + 4 >> 2]; memcpy(HEAP32[($9 + $8 | 0) + 4 >> 2] + (HEAP32[$8 + 7052 >> 2] << 2) | 0, $12 + ($7 << 2) | 0, $5); $3 = $3 + 1 | 0; if (($10 | 0) != ($3 | 0)) { continue } break; }; } $5 = HEAP32[$0 >> 2]; label$8 : { if (HEAP32[$5 + 16 >> 2]) { $4 = HEAP32[$0 + 4 >> 2]; if ($7 >>> 0 >= $2 >>> 0) { break label$8 } $3 = HEAP32[$4 + 7052 >> 2]; if ($3 >>> 0 > $11 >>> 0) { break label$8 } $8 = HEAP32[$4 + 40 >> 2]; $12 = HEAP32[$4 + 36 >> 2]; $17 = HEAP32[$1 + 4 >> 2]; $18 = HEAP32[$1 >> 2]; while (1) { $14 = $3 << 2; $9 = $7 << 2; $15 = $9 + $18 | 0; $9 = $9 + $17 | 0; HEAP32[$14 + $8 >> 2] = HEAP32[$15 >> 2] - HEAP32[$9 >> 2]; HEAP32[$12 + $14 >> 2] = HEAP32[$9 >> 2] + HEAP32[$15 >> 2] >> 1; $7 = $7 + 1 | 0; if ($7 >>> 0 >= $2 >>> 0) { break label$8 } $3 = $3 + 1 | 0; if ($3 >>> 0 <= $11 >>> 0) { continue } break; }; break label$8; } $7 = $7 + $6 | 0; $4 = HEAP32[$0 + 4 >> 2]; } $3 = HEAP32[$4 + 7052 >> 2] + $6 | 0; HEAP32[$4 + 7052 >> 2] = $3; if ($3 >>> 0 > $11 >>> 0) { $4 = 0; if (!process_frame_($0, 0, 0)) { break label$1 } if ($10) { $4 = HEAP32[$0 + 4 >> 2]; $3 = 0; while (1) { $6 = HEAP32[($4 + ($3 << 2) | 0) + 4 >> 2]; HEAP32[$6 >> 2] = HEAP32[$6 + $13 >> 2]; $3 = $3 + 1 | 0; if (($10 | 0) != ($3 | 0)) { continue } break; }; } $4 = HEAP32[$0 + 4 >> 2]; $5 = HEAP32[$0 >> 2]; if (HEAP32[$5 + 16 >> 2]) { $3 = HEAP32[$4 + 36 >> 2]; HEAP32[$3 >> 2] = HEAP32[$3 + $13 >> 2]; $3 = HEAP32[$4 + 40 >> 2]; HEAP32[$3 >> 2] = HEAP32[$3 + $13 >> 2]; } HEAP32[$4 + 7052 >> 2] = 1; } if ($7 >>> 0 < $2 >>> 0) { continue } break; }; $4 = 1; } return $4 | 0; } function FLAC__stream_encoder_process_interleaved($0, $1, $2) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; var $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0; $3 = HEAP32[$0 >> 2]; $9 = HEAP32[$3 + 36 >> 2]; $16 = $9 + 1 | 0; label$1 : { label$2 : { $10 = HEAP32[$3 + 24 >> 2]; if (!(!HEAP32[$3 + 16 >> 2] | ($10 | 0) != 2)) { while (1) { $4 = HEAP32[$0 + 4 >> 2]; if (HEAP32[$3 + 4 >> 2]) { $3 = HEAP32[$4 + 11800 >> 2]; $5 = $16 - HEAP32[$4 + 7052 >> 2] | 0; $6 = $2 - $7 | 0; $8 = $5 >>> 0 < $6 >>> 0 ? $5 : $6; label$6 : { if (!$8) { break label$6 } if (!$10) { $3 = $3 + $8 | 0; break label$6; } $5 = $7 << 1; $11 = HEAP32[$4 + 11768 >> 2]; $15 = HEAP32[$4 + 11764 >> 2]; $6 = 0; while (1) { $13 = $3 << 2; $14 = $5 << 2; HEAP32[$13 + $15 >> 2] = HEAP32[$14 + $1 >> 2]; HEAP32[$11 + $13 >> 2] = HEAP32[($14 | 4) + $1 >> 2]; $3 = $3 + 1 | 0; $5 = $5 + 2 | 0; $6 = $6 + 1 | 0; if (($8 | 0) != ($6 | 0)) { continue } break; }; } HEAP32[$4 + 11800 >> 2] = $3; } $5 = $7 >>> 0 < $2 >>> 0; $3 = HEAP32[$4 + 7052 >> 2]; label$9 : { if ($3 >>> 0 > $9 >>> 0 | $7 >>> 0 >= $2 >>> 0) { break label$9 } $11 = HEAP32[$4 + 40 >> 2]; $15 = HEAP32[$4 + 8 >> 2]; $13 = HEAP32[$4 + 36 >> 2]; $14 = HEAP32[$4 + 4 >> 2]; while (1) { $5 = $3 << 2; $8 = ($12 << 2) + $1 | 0; $6 = HEAP32[$8 >> 2]; HEAP32[$5 + $14 >> 2] = $6; $8 = HEAP32[$8 + 4 >> 2]; HEAP32[$5 + $15 >> 2] = $8; HEAP32[$5 + $11 >> 2] = $6 - $8; HEAP32[$5 + $13 >> 2] = $6 + $8 >> 1; $3 = $3 + 1 | 0; $12 = $12 + 2 | 0; $7 = $7 + 1 | 0; $5 = $7 >>> 0 < $2 >>> 0; if ($7 >>> 0 >= $2 >>> 0) { break label$9 } if ($3 >>> 0 <= $9 >>> 0) { continue } break; }; } HEAP32[$4 + 7052 >> 2] = $3; if ($3 >>> 0 > $9 >>> 0) { $3 = 0; if (!process_frame_($0, 0, 0)) { break label$1 } $3 = HEAP32[$0 + 4 >> 2]; $6 = HEAP32[$3 + 4 >> 2]; $4 = $6; $6 = $9 << 2; HEAP32[$4 >> 2] = HEAP32[$4 + $6 >> 2]; $4 = HEAP32[$3 + 8 >> 2]; HEAP32[$4 >> 2] = HEAP32[$4 + $6 >> 2]; $4 = HEAP32[$3 + 36 >> 2]; HEAP32[$4 >> 2] = HEAP32[$4 + $6 >> 2]; $4 = HEAP32[$3 + 40 >> 2]; HEAP32[$4 >> 2] = HEAP32[$4 + $6 >> 2]; HEAP32[$3 + 7052 >> 2] = 1; } if (!$5) { break label$2 } $3 = HEAP32[$0 >> 2]; continue; } } while (1) { $7 = HEAP32[$0 + 4 >> 2]; if (HEAP32[$3 + 4 >> 2]) { $6 = HEAP32[$7 + 11800 >> 2]; $3 = $16 - HEAP32[$7 + 7052 >> 2] | 0; $5 = $2 - $4 | 0; $8 = $3 >>> 0 < $5 >>> 0 ? $3 : $5; label$14 : { if (!$8) { break label$14 } if (!$10) { $6 = $6 + $8 | 0; break label$14; } $5 = Math_imul($4, $10); $11 = 0; while (1) { $3 = 0; while (1) { HEAP32[HEAP32[($7 + ($3 << 2) | 0) + 11764 >> 2] + ($6 << 2) >> 2] = HEAP32[($5 << 2) + $1 >> 2]; $5 = $5 + 1 | 0; $3 = $3 + 1 | 0; if (($10 | 0) != ($3 | 0)) { continue } break; }; $6 = $6 + 1 | 0; $11 = $11 + 1 | 0; if (($8 | 0) != ($11 | 0)) { continue } break; }; } HEAP32[$7 + 11800 >> 2] = $6; } $6 = $4 >>> 0 < $2 >>> 0; $5 = HEAP32[$7 + 7052 >> 2]; label$18 : { if ($5 >>> 0 > $9 >>> 0 | $4 >>> 0 >= $2 >>> 0) { break label$18 } if ($10) { while (1) { $3 = 0; while (1) { HEAP32[HEAP32[($7 + ($3 << 2) | 0) + 4 >> 2] + ($5 << 2) >> 2] = HEAP32[($12 << 2) + $1 >> 2]; $12 = $12 + 1 | 0; $3 = $3 + 1 | 0; if (($10 | 0) != ($3 | 0)) { continue } break; }; $5 = $5 + 1 | 0; $4 = $4 + 1 | 0; $6 = $4 >>> 0 < $2 >>> 0; if ($4 >>> 0 >= $2 >>> 0) { break label$18 } if ($5 >>> 0 <= $9 >>> 0) { continue } break label$18; } } while (1) { $5 = $5 + 1 | 0; $4 = $4 + 1 | 0; $6 = $4 >>> 0 < $2 >>> 0; if ($4 >>> 0 >= $2 >>> 0) { break label$18 } if ($5 >>> 0 <= $9 >>> 0) { continue } break; }; } HEAP32[$7 + 7052 >> 2] = $5; if ($5 >>> 0 > $9 >>> 0) { $3 = 0; if (!process_frame_($0, 0, 0)) { break label$1 } $5 = HEAP32[$0 + 4 >> 2]; if ($10) { $3 = 0; while (1) { $7 = HEAP32[($5 + ($3 << 2) | 0) + 4 >> 2]; HEAP32[$7 >> 2] = HEAP32[$7 + ($9 << 2) >> 2]; $3 = $3 + 1 | 0; if (($10 | 0) != ($3 | 0)) { continue } break; }; } HEAP32[$5 + 7052 >> 2] = 1; } if (!$6) { break label$2 } $3 = HEAP32[$0 >> 2]; continue; }; } $3 = 1; } return $3 | 0; } function find_best_partition_order_($0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) { var $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0, $22 = 0, $23 = 0, $24 = 0, $25 = 0, $26 = 0, $27 = 0, $28 = 0, $29 = 0, $30 = 0, $31 = 0, $32 = 0, $33 = 0, $34 = 0, $35 = 0, $36 = 0, $37 = 0, $38 = 0, $39 = 0, $40 = 0; $26 = $4 + $5 | 0; $14 = FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order($9, $26, $5); $22 = $14 >>> 0 > $8 >>> 0 ? $8 : $14; FUNCTION_TABLE[HEAP32[$0 + 7220 >> 2]]($1, $2, $4, $5, $22, $14, $10); label$1 : { if (!$11) { break label$1 } $10 = 0; $8 = 0; if (($14 | 0) >= 0) { $8 = 1 << $14; $20 = $8 >>> 0 > 1 ? $8 : 1; $16 = $26 >>> $14 | 0; while (1) { $17 = 0; $9 = $13; $18 = 0; $27 = ($15 << 2) + $3 | 0; label$4 : { label$5 : { $23 = $15 ? 0 : $5; $19 = $16 - $23 | 0; if (!$19) { break label$5 } while (1) { $21 = $17; $17 = HEAP32[($9 << 2) + $1 >> 2]; $17 = $21 | $17 >> 31 ^ $17; $9 = $9 + 1 | 0; $18 = $18 + 1 | 0; if (($19 | 0) != ($18 | 0)) { continue } break; }; $13 = ($13 + $16 | 0) - $23 | 0; if (!$17) { break label$5 } $9 = (Math_clz32($17) ^ 31) + 2 | 0; break label$4; } $9 = 1; } HEAP32[$27 >> 2] = $9; $15 = $15 + 1 | 0; if (($20 | 0) != ($15 | 0)) { continue } break; }; } if (($14 | 0) <= ($22 | 0)) { break label$1 } $1 = $14; while (1) { $1 = $1 + -1 | 0; $9 = 0; while (1) { $13 = ($10 << 2) + $3 | 0; $15 = HEAP32[$13 >> 2]; $13 = HEAP32[$13 + 4 >> 2]; HEAP32[($8 << 2) + $3 >> 2] = $15 >>> 0 > $13 >>> 0 ? $15 : $13; $8 = $8 + 1 | 0; $10 = $10 + 2 | 0; $9 = $9 + 1 | 0; if (!($9 >>> $1)) { continue } break; }; if (($1 | 0) > ($22 | 0)) { continue } break; }; } label$9 : { if (($14 | 0) < ($22 | 0)) { HEAP32[$12 + 4 >> 2] = 0; $2 = 6; break label$9; } $28 = HEAP32[1407]; $40 = $28 + (Math_imul($6 + 1 | 0, $4) - ($4 >>> 1 | 0) | 0) | 0; $35 = $7 + -1 | 0; $36 = HEAP32[1409] + HEAP32[1408] | 0; $23 = HEAP32[1406] + HEAP32[1405] | 0; $27 = $6 + -1 | 0; while (1) { label$12 : { $20 = $14; $37 = !$29; $1 = Math_imul($37, 12) + $0 | 0; $8 = $1 + 11724 | 0; FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size($8, $14 >>> 0 > 6 ? $14 : 6); $38 = ($30 << 2) + $3 | 0; $25 = ($30 << 3) + $2 | 0; $39 = HEAP32[$1 + 11728 >> 2]; $31 = HEAP32[$8 >> 2]; label$13 : { if ($14) { $32 = $26 >>> $20 | 0; if ($32 >>> 0 <= $5 >>> 0) { break label$12 } $18 = 0; $33 = 0; $21 = $23; if (!$11) { while (1) { $17 = $32 - ($18 ? 0 : $5) | 0; $1 = $25 + ($18 << 3) | 0; $13 = HEAP32[$1 + 4 >> 2]; $16 = HEAP32[$1 >> 2]; label$17 : { if (!$13 & $16 >>> 0 >= 268435457 | $13 >>> 0 > 0) { $1 = $17; $10 = 0; $8 = 0; label$19 : { if (($13 | 0) == 16777216 & $16 >>> 0 > 0 | $13 >>> 0 > 16777216) { $14 = $1; $9 = 0; break label$19; } $14 = $1; $9 = 0; $15 = $1 >>> 25 | 0; $19 = $1 << 7; if (($13 | 0) == ($15 | 0) & $19 >>> 0 >= $16 >>> 0 | $15 >>> 0 > $13 >>> 0) { break label$19 } while (1) { $8 = $8 + 8 | 0; $15 = $10 << 15 | $1 >>> 17; $19 = $1 << 15; $9 = $10 << 8 | $1 >>> 24; $14 = $1 << 8; $1 = $14; $10 = $9; if (($13 | 0) == ($15 | 0) & $19 >>> 0 < $16 >>> 0 | $15 >>> 0 < $13 >>> 0) { continue } break; }; } if (($9 | 0) == ($13 | 0) & $14 >>> 0 >= $16 >>> 0 | $9 >>> 0 > $13 >>> 0) { break label$17 } while (1) { $8 = $8 + 1 | 0; $1 = $14; $15 = $9 << 1 | $1 >>> 31; $14 = $1 << 1; $1 = $14; $9 = $15; if (($13 | 0) == ($9 | 0) & $1 >>> 0 < $16 >>> 0 | $9 >>> 0 < $13 >>> 0) { continue } break; }; break label$17; } $8 = 0; $10 = $17; $1 = $16; if ($10 << 3 >>> 0 < $1 >>> 0) { while (1) { $8 = $8 + 4 | 0; $9 = $10 << 7; $10 = $10 << 4; if ($9 >>> 0 < $1 >>> 0) { continue } break; } } if ($10 >>> 0 >= $1 >>> 0) { break label$17 } while (1) { $8 = $8 + 1 | 0; $10 = $10 << 1; if ($10 >>> 0 < $1 >>> 0) { continue } break; }; } $8 = $8 >>> 0 < $7 >>> 0 ? $8 : $35; $10 = $8 + -1 | 0; $1 = $10 & 31; $1 = (($28 - ($17 >>> 1 | 0) | 0) + Math_imul($17, $8 + 1 | 0) | 0) + ($8 ? (32 <= ($10 & 63) >>> 0 ? $13 >>> $1 | 0 : ((1 << $1) - 1 & $13) << 32 - $1 | $16 >>> $1) : $16 << 1) | 0; $33 = ($1 | 0) == -1 ? $33 : $8; HEAP32[$31 + ($18 << 2) >> 2] = $33; $21 = $1 + $21 | 0; $18 = $18 + 1 | 0; if (!($18 >>> $20)) { continue } break label$13; } } while (1) { $17 = $32 - ($18 ? 0 : $5) | 0; $1 = $25 + ($18 << 3) | 0; $13 = HEAP32[$1 + 4 >> 2]; $16 = HEAP32[$1 >> 2]; label$27 : { label$28 : { if (!$13 & $16 >>> 0 >= 268435457 | $13 >>> 0 > 0) { $1 = $17; $10 = 0; $8 = 0; if (($13 | 0) == 16777216 & $16 >>> 0 > 0 | $13 >>> 0 > 16777216) { break label$28 } $14 = $1; $9 = 0; $15 = $1 >>> 25 | 0; $19 = $1 << 7; if (($13 | 0) == ($15 | 0) & $19 >>> 0 >= $16 >>> 0 | $15 >>> 0 > $13 >>> 0) { break label$28 } while (1) { $8 = $8 + 8 | 0; $1 = $9; $10 = $14; $15 = $1 << 15 | $10 >>> 17; $19 = $10 << 15; $9 = $1 << 8; $1 = $10; $9 = $9 | $1 >>> 24; $1 = $1 << 8; $14 = $1; $10 = $9; if (($13 | 0) == ($15 | 0) & $19 >>> 0 < $16 >>> 0 | $15 >>> 0 < $13 >>> 0) { continue } break; }; break label$28; } $8 = 0; $10 = $17; $1 = $16; if ($10 << 3 >>> 0 < $1 >>> 0) { while (1) { $8 = $8 + 4 | 0; $9 = $10 << 7; $10 = $10 << 4; if ($9 >>> 0 < $1 >>> 0) { continue } break; } } if ($10 >>> 0 >= $1 >>> 0) { break label$27 } while (1) { $8 = $8 + 1 | 0; $10 = $10 << 1; if ($10 >>> 0 < $1 >>> 0) { continue } break; }; break label$27; } if (($10 | 0) == ($13 | 0) & $1 >>> 0 >= $16 >>> 0 | $10 >>> 0 > $13 >>> 0) { break label$27 } while (1) { $8 = $8 + 1 | 0; $15 = $10 << 1 | $1 >>> 31; $1 = $1 << 1; $10 = $15; if (($13 | 0) == ($10 | 0) & $1 >>> 0 < $16 >>> 0 | $10 >>> 0 < $13 >>> 0) { continue } break; }; } $9 = $18 << 2; $1 = HEAP32[$9 + $38 >> 2]; $19 = $1; $10 = Math_imul($1, $17) + $36 | 0; $8 = $8 >>> 0 < $7 >>> 0 ? $8 : $35; $15 = $8 + -1 | 0; $1 = $15 & 31; $14 = (($28 - ($17 >>> 1 | 0) | 0) + Math_imul($17, $8 + 1 | 0) | 0) + ($8 ? (32 <= ($15 & 63) >>> 0 ? $13 >>> $1 | 0 : ((1 << $1) - 1 & $13) << 32 - $1 | $16 >>> $1) : $16 << 1) | 0; $1 = $10 >>> 0 > $14 >>> 0; HEAP32[$9 + $39 >> 2] = $1 ? 0 : $19; HEAP32[$9 + $31 >> 2] = $1 ? $8 : 0; $21 = ($1 ? $14 : $10) + $21 | 0; $18 = $18 + 1 | 0; if (!($18 >>> $20)) { continue } break; }; break label$13; } $9 = HEAP32[$25 + 4 >> 2]; $1 = $27; $8 = $1 & 31; $10 = HEAP32[$25 >> 2]; $8 = ($6 ? (32 <= ($1 & 63) >>> 0 ? $9 >>> $8 | 0 : ((1 << $8) - 1 & $9) << 32 - $8 | $10 >>> $8) : $10 << 1) + $40 | 0; $10 = ($8 | 0) == -1 ? 0 : $6; if ($11) { $9 = HEAP32[$38 >> 2]; $14 = Math_imul($9, $4) + $36 | 0; $1 = $14 >>> 0 > $8 >>> 0; HEAP32[$39 >> 2] = $1 ? 0 : $9; $10 = $1 ? $10 : 0; $8 = $1 ? $8 : $14; } HEAP32[$31 >> 2] = $10; $21 = $8 + $23 | 0; } $1 = $34 + -1 >>> 0 < $21 >>> 0; $24 = $1 ? $24 : $20; $29 = $1 ? $29 : $37; $34 = $1 ? $34 : $21; $14 = $20 + -1 | 0; $30 = (1 << $20) + $30 | 0; if (($20 | 0) > ($22 | 0)) { continue } } break; }; HEAP32[$12 + 4 >> 2] = $24; $2 = $24 >>> 0 > 6 ? $24 : 6; } $1 = HEAP32[$12 + 8 >> 2]; FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size($1, $2); $2 = Math_imul($29, 12) + $0 | 0; $0 = 1 << $24; $3 = $0 << 2; memcpy(HEAP32[$1 >> 2], HEAP32[$2 + 11724 >> 2], $3); if ($11) { memcpy(HEAP32[$1 + 4 >> 2], HEAP32[$2 + 11728 >> 2], $3) } $0 = $0 >>> 0 > 1 ? $0 : 1; $2 = HEAP32[1410]; $1 = HEAP32[$1 >> 2]; $8 = 0; label$37 : { while (1) { if (HEAPU32[$1 + ($8 << 2) >> 2] < $2 >>> 0) { $8 = $8 + 1 | 0; if (($0 | 0) != ($8 | 0)) { continue } break label$37; } break; }; HEAP32[$12 >> 2] = 1; } return $34; } function stackSave() { return global$0 | 0; } function stackRestore($0) { $0 = $0 | 0; global$0 = $0; } function stackAlloc($0) { $0 = $0 | 0; $0 = global$0 - $0 & -16; global$0 = $0; return $0 | 0; } function __growWasmMemory($0) { $0 = $0 | 0; return __wasm_memory_grow($0 | 0) | 0; } function dynCall_iii($0, $1, $2) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; return FUNCTION_TABLE[$0]($1, $2) | 0; } function dynCall_ii($0, $1) { $0 = $0 | 0; $1 = $1 | 0; return FUNCTION_TABLE[$0]($1) | 0; } function dynCall_iiii($0, $1, $2, $3) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; return FUNCTION_TABLE[$0]($1, $2, $3) | 0; } function dynCall_viiiiii($0, $1, $2, $3, $4, $5, $6) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; $4 = $4 | 0; $5 = $5 | 0; $6 = $6 | 0; FUNCTION_TABLE[$0]($1, $2, $3, $4, $5, $6); } function dynCall_iiiii($0, $1, $2, $3, $4) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; $4 = $4 | 0; return FUNCTION_TABLE[$0]($1, $2, $3, $4) | 0; } function dynCall_viiiiiii($0, $1, $2, $3, $4, $5, $6, $7) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; $4 = $4 | 0; $5 = $5 | 0; $6 = $6 | 0; $7 = $7 | 0; FUNCTION_TABLE[$0]($1, $2, $3, $4, $5, $6, $7); } function dynCall_viiii($0, $1, $2, $3, $4) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; $4 = $4 | 0; FUNCTION_TABLE[$0]($1, $2, $3, $4); } function dynCall_viii($0, $1, $2, $3) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; FUNCTION_TABLE[$0]($1, $2, $3); } function legalstub$FLAC__stream_encoder_set_total_samples_estimate($0, $1, $2) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; return FLAC__stream_encoder_set_total_samples_estimate($0, $1, $2) | 0; } function legalstub$dynCall_jiji($0, $1, $2, $3, $4) { $0 = $0 | 0; $1 = $1 | 0; $2 = $2 | 0; $3 = $3 | 0; $4 = $4 | 0; $0 = FUNCTION_TABLE[$0]($1, $2, $3, $4) | 0; setTempRet0(i64toi32_i32$HIGH_BITS | 0); return $0 | 0; } function _ZN17compiler_builtins3int3mul3Mul3mul17h070e9a1c69faec5bE($0, $1, $2, $3) { var $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0; $4 = $2 >>> 16 | 0; $5 = $0 >>> 16 | 0; $9 = Math_imul($4, $5); $6 = $2 & 65535; $7 = $0 & 65535; $8 = Math_imul($6, $7); $5 = ($8 >>> 16 | 0) + Math_imul($5, $6) | 0; $4 = ($5 & 65535) + Math_imul($4, $7) | 0; $0 = (Math_imul($1, $2) + $9 | 0) + Math_imul($0, $3) + ($5 >>> 16) + ($4 >>> 16) | 0; $1 = $8 & 65535 | $4 << 16; i64toi32_i32$HIGH_BITS = $0; return $1; } function _ZN17compiler_builtins3int4udiv10divmod_u6417h6026910b5ed08e40E($0, $1, $2) { var $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $10 = 0, $11 = 0; label$1 : { label$2 : { label$3 : { label$4 : { label$5 : { label$6 : { label$7 : { label$9 : { label$11 : { $3 = $1; if ($3) { $4 = $2; if (!$4) { break label$11 } break label$9; } $1 = $0; $0 = ($0 >>> 0) / ($2 >>> 0) | 0; __wasm_intrinsics_temp_i64 = $1 - Math_imul($0, $2) | 0; __wasm_intrinsics_temp_i64$hi = 0; i64toi32_i32$HIGH_BITS = 0; return $0; } if (!$0) { break label$7 } break label$6; } $6 = $4 + -1 | 0; if (!($6 & $4)) { break label$5 } $6 = (Math_clz32($4) + 33 | 0) - Math_clz32($3) | 0; $7 = 0 - $6 | 0; break label$3; } __wasm_intrinsics_temp_i64 = 0; $0 = ($3 >>> 0) / 0 | 0; __wasm_intrinsics_temp_i64$hi = $3 - Math_imul($0, 0) | 0; i64toi32_i32$HIGH_BITS = 0; return $0; } $3 = 32 - Math_clz32($3) | 0; if ($3 >>> 0 < 31) { break label$4 } break label$2; } __wasm_intrinsics_temp_i64 = $0 & $6; __wasm_intrinsics_temp_i64$hi = 0; if (($4 | 0) == 1) { break label$1 } $3 = __wasm_ctz_i32($4); $2 = $3 & 31; if (32 <= ($3 & 63) >>> 0) { $4 = 0; $0 = $1 >>> $2 | 0; } else { $4 = $1 >>> $2 | 0; $0 = ((1 << $2) - 1 & $1) << 32 - $2 | $0 >>> $2; } i64toi32_i32$HIGH_BITS = $4; return $0; } $6 = $3 + 1 | 0; $7 = 63 - $3 | 0; } $3 = $1; $4 = $6 & 63; $5 = $4 & 31; if (32 <= $4 >>> 0) { $4 = 0; $5 = $3 >>> $5 | 0; } else { $4 = $3 >>> $5 | 0; $5 = ((1 << $5) - 1 & $3) << 32 - $5 | $0 >>> $5; } $7 = $7 & 63; $3 = $7 & 31; if (32 <= $7 >>> 0) { $1 = $0 << $3; $0 = 0; } else { $1 = (1 << $3) - 1 & $0 >>> 32 - $3 | $1 << $3; $0 = $0 << $3; } if ($6) { $7 = -1; $3 = $2 + -1 | 0; if (($3 | 0) != -1) { $7 = 0 } while (1) { $8 = $5 << 1 | $1 >>> 31; $9 = $8; $4 = $4 << 1 | $5 >>> 31; $8 = $7 - ($4 + ($3 >>> 0 < $8 >>> 0) | 0) >> 31; $10 = $2 & $8; $5 = $9 - $10 | 0; $4 = $4 - ($9 >>> 0 < $10 >>> 0) | 0; $1 = $1 << 1 | $0 >>> 31; $0 = $11 | $0 << 1; $8 = $8 & 1; $11 = $8; $6 = $6 + -1 | 0; if ($6) { continue } break; }; } __wasm_intrinsics_temp_i64 = $5; __wasm_intrinsics_temp_i64$hi = $4; i64toi32_i32$HIGH_BITS = $1 << 1 | $0 >>> 31; return $8 | $0 << 1; } __wasm_intrinsics_temp_i64 = $0; __wasm_intrinsics_temp_i64$hi = $1; $0 = 0; $1 = 0; } i64toi32_i32$HIGH_BITS = $1; return $0; } function __wasm_ctz_i32($0) { if ($0) { return 31 - Math_clz32($0 + -1 ^ $0) | 0 } return 32; } function __wasm_i64_mul($0, $1, $2, $3) { $0 = _ZN17compiler_builtins3int3mul3Mul3mul17h070e9a1c69faec5bE($0, $1, $2, $3); return $0; } function __wasm_i64_udiv($0, $1, $2) { return _ZN17compiler_builtins3int4udiv10divmod_u6417h6026910b5ed08e40E($0, $1, $2); } function __wasm_i64_urem($0, $1) { _ZN17compiler_builtins3int4udiv10divmod_u6417h6026910b5ed08e40E($0, $1, 588); i64toi32_i32$HIGH_BITS = __wasm_intrinsics_temp_i64$hi; return __wasm_intrinsics_temp_i64; } function __wasm_rotl_i32($0, $1) { var $2 = 0, $3 = 0; $2 = $1 & 31; $3 = (-1 >>> $2 & $0) << $2; $2 = $0; $0 = 0 - $1 & 31; return $3 | ($2 & -1 << $0) >>> $0; } // EMSCRIPTEN_END_FUNCS ; FUNCTION_TABLE[1] = seekpoint_compare_; FUNCTION_TABLE[2] = __stdio_close; FUNCTION_TABLE[3] = __stdio_read; FUNCTION_TABLE[4] = __stdio_seek; FUNCTION_TABLE[5] = FLAC__lpc_restore_signal; FUNCTION_TABLE[6] = FLAC__lpc_restore_signal_wide; FUNCTION_TABLE[7] = read_callback_; FUNCTION_TABLE[8] = read_callback_proxy_; FUNCTION_TABLE[9] = __emscripten_stdout_close; FUNCTION_TABLE[10] = __stdio_write; FUNCTION_TABLE[11] = __emscripten_stdout_seek; FUNCTION_TABLE[12] = FLAC__lpc_compute_residual_from_qlp_coefficients; FUNCTION_TABLE[13] = FLAC__lpc_compute_residual_from_qlp_coefficients_wide; FUNCTION_TABLE[14] = FLAC__fixed_compute_best_predictor_wide; FUNCTION_TABLE[15] = FLAC__fixed_compute_best_predictor; FUNCTION_TABLE[16] = precompute_partition_info_sums_; FUNCTION_TABLE[17] = FLAC__lpc_compute_autocorrelation; FUNCTION_TABLE[18] = verify_read_callback_; FUNCTION_TABLE[19] = verify_write_callback_; FUNCTION_TABLE[20] = verify_metadata_callback_; FUNCTION_TABLE[21] = verify_error_callback_; function __wasm_memory_size() { return buffer.byteLength / 65536 | 0; } function __wasm_memory_grow(pagesToAdd) { pagesToAdd = pagesToAdd | 0; var oldPages = __wasm_memory_size() | 0; var newPages = oldPages + pagesToAdd | 0; if ((oldPages < newPages) && (newPages < 65536)) { var newBuffer = new ArrayBuffer(Math_imul(newPages, 65536)); var newHEAP8 = new global.Int8Array(newBuffer); newHEAP8.set(HEAP8); HEAP8 = newHEAP8; HEAP8 = new global.Int8Array(newBuffer); HEAP16 = new global.Int16Array(newBuffer); HEAP32 = new global.Int32Array(newBuffer); HEAPU8 = new global.Uint8Array(newBuffer); HEAPU16 = new global.Uint16Array(newBuffer); HEAPU32 = new global.Uint32Array(newBuffer); HEAPF32 = new global.Float32Array(newBuffer); HEAPF64 = new global.Float64Array(newBuffer); buffer = newBuffer; memory.buffer = newBuffer; } return oldPages; } return { "__wasm_call_ctors": __wasm_call_ctors, "FLAC__stream_decoder_new": FLAC__stream_decoder_new, "FLAC__stream_decoder_delete": FLAC__stream_decoder_delete, "FLAC__stream_decoder_finish": FLAC__stream_decoder_finish, "FLAC__stream_decoder_init_stream": FLAC__stream_decoder_init_stream, "FLAC__stream_decoder_reset": FLAC__stream_decoder_reset, "FLAC__stream_decoder_init_ogg_stream": FLAC__stream_decoder_init_ogg_stream, "FLAC__stream_decoder_set_ogg_serial_number": FLAC__stream_decoder_set_ogg_serial_number, "FLAC__stream_decoder_set_md5_checking": FLAC__stream_decoder_set_md5_checking, "FLAC__stream_decoder_set_metadata_respond": FLAC__stream_decoder_set_metadata_respond, "FLAC__stream_decoder_set_metadata_respond_application": FLAC__stream_decoder_set_metadata_respond_application, "FLAC__stream_decoder_set_metadata_respond_all": FLAC__stream_decoder_set_metadata_respond_all, "FLAC__stream_decoder_set_metadata_ignore": FLAC__stream_decoder_set_metadata_ignore, "FLAC__stream_decoder_set_metadata_ignore_application": FLAC__stream_decoder_set_metadata_ignore_application, "FLAC__stream_decoder_set_metadata_ignore_all": FLAC__stream_decoder_set_metadata_ignore_all, "FLAC__stream_decoder_get_state": FLAC__stream_decoder_get_state, "FLAC__stream_decoder_get_md5_checking": FLAC__stream_decoder_get_md5_checking, "FLAC__stream_decoder_process_single": FLAC__stream_decoder_process_single, "FLAC__stream_decoder_process_until_end_of_metadata": FLAC__stream_decoder_process_until_end_of_metadata, "FLAC__stream_decoder_process_until_end_of_stream": FLAC__stream_decoder_process_until_end_of_stream, "FLAC__stream_encoder_new": FLAC__stream_encoder_new, "FLAC__stream_encoder_delete": FLAC__stream_encoder_delete, "FLAC__stream_encoder_finish": FLAC__stream_encoder_finish, "FLAC__stream_encoder_init_stream": FLAC__stream_encoder_init_stream, "FLAC__stream_encoder_init_ogg_stream": FLAC__stream_encoder_init_ogg_stream, "FLAC__stream_encoder_set_ogg_serial_number": FLAC__stream_encoder_set_ogg_serial_number, "FLAC__stream_encoder_set_verify": FLAC__stream_encoder_set_verify, "FLAC__stream_encoder_set_channels": FLAC__stream_encoder_set_channels, "FLAC__stream_encoder_set_bits_per_sample": FLAC__stream_encoder_set_bits_per_sample, "FLAC__stream_encoder_set_sample_rate": FLAC__stream_encoder_set_sample_rate, "FLAC__stream_encoder_set_compression_level": FLAC__stream_encoder_set_compression_level, "FLAC__stream_encoder_set_blocksize": FLAC__stream_encoder_set_blocksize, "FLAC__stream_encoder_set_total_samples_estimate": legalstub$FLAC__stream_encoder_set_total_samples_estimate, "FLAC__stream_encoder_set_metadata": FLAC__stream_encoder_set_metadata, "FLAC__stream_encoder_get_state": FLAC__stream_decoder_get_state, "FLAC__stream_encoder_get_verify_decoder_state": FLAC__stream_encoder_get_verify_decoder_state, "FLAC__stream_encoder_get_verify": FLAC__stream_encoder_get_verify, "FLAC__stream_encoder_process": FLAC__stream_encoder_process, "FLAC__stream_encoder_process_interleaved": FLAC__stream_encoder_process_interleaved, "__errno_location": __errno_location, "stackSave": stackSave, "stackRestore": stackRestore, "stackAlloc": stackAlloc, "malloc": dlmalloc, "free": dlfree, "__growWasmMemory": __growWasmMemory, "dynCall_iii": dynCall_iii, "dynCall_ii": dynCall_ii, "dynCall_iiii": dynCall_iiii, "dynCall_jiji": legalstub$dynCall_jiji, "dynCall_viiiiii": dynCall_viiiiii, "dynCall_iiiii": dynCall_iiiii, "dynCall_viiiiiii": dynCall_viiiiiii, "dynCall_viiii": dynCall_viiii, "dynCall_viii": dynCall_viii }; } var bufferView = new Uint8Array(wasmMemory.buffer); for (var base64ReverseLookup = new Uint8Array(123/*'z'+1*/), i = 25; i >= 0; --i) { base64ReverseLookup[48+i] = 52+i; // '0-9' base64ReverseLookup[65+i] = i; // 'A-Z' base64ReverseLookup[97+i] = 26+i; // 'a-z' } base64ReverseLookup[43] = 62; // '+' base64ReverseLookup[47] = 63; // '/' /** @noinline Inlining this function would mean expanding the base64 string 4x times in the source code, which Closure seems to be happy to do. */ function base64DecodeToExistingUint8Array(uint8Array, offset, b64) { var b1, b2, i = 0, j = offset, bLength = b64.length, end = offset + (bLength*3>>2) - (b64[bLength-2] == '=') - (b64[bLength-1] == '='); for (; i < bLength; i += 4) { b1 = base64ReverseLookup[b64.charCodeAt(i+1)]; b2 = base64ReverseLookup[b64.charCodeAt(i+2)]; uint8Array[j++] = base64ReverseLookup[b64.charCodeAt(i)] << 2 | b1 >> 4; if (j < end) uint8Array[j++] = b1 << 4 | b2 >> 2; if (j < end) uint8Array[j++] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i+3)]; } } base64DecodeToExistingUint8Array(bufferView, 1025, "Bw4JHBsSFTg/NjEkIyotcHd+eWxrYmVIT0ZBVFNaXeDn7un8+/L12N/W0cTDys2Ql56ZjIuChaivpqG0s7q9x8DJztvc1dL/+PH24+Tt6rewub6rrKWij4iBhpOUnZonICkuOzw1Mh8YERYDBA0KV1BZXktMRUJvaGFmc3R9eomOh4CVkpucsba/uK2qo6T5/vfw5eLr7MHGz8jd2tPUaW5nYHVye3xRVl9YTUpDRBkeFxAFAgsMISYvKD06MzROSUBHUlVcW3ZxeH9qbWRjPjkwNyIlLCsGAQgPGh0UE66poKeytby7lpGYn4qNhIPe2dDXwsXMy+bh6O/6/fTzAAAFgA+ACgAbgB4AFAARgDOANgA8ADmAKAAtgCeAIgBjgGYAbABpgHgAfYB3gHIAUABVgF+AWgBLgE4ARABBgMOAxgDMAMmA2ADdgNeA0gDwAPWA/4D6AOuA7gDkAOGAoAClgK+AqgC7gL4AtACxgJOAlgCcAJmAiACNgIeAggCDgYYBjAGJgZgBnYGXgZIBsAG1gb+BugGrga4BpAGhgeAB5YHvgeoB+4H+AfQB8YHTgdYB3AHZgcgBzYHHgcIBQAFFgU+BSgFbgV4BVAFRgXOBdgF8AXmBaAFtgWeBYgEjgSYBLAEpgTgBPYE3gTIBEAEVgR+BGgELgQ4BBAEBgQODBgMMAwmDGAMdgxeDEgMwAzWDP4M6AyuDLgMkAyGDYANlg2+DagN7g34DdANxg1ODVgNcA1mDSANNg0eDQgPAA8WDz4PKA9uD3gPUA9GD84P2A/wD+YPoA+2D54PiA6ODpgOsA6mDuAO9g7eDsgOQA5WDn4OaA4uDjgOEA4GDgAKFgo+CigKbgp4ClAKRgrOCtgK8ArmCqAKtgqeCogLjguYC7ALpgvgC/YL3gvIC0ALVgt+C2gLLgs4CxALBgkOCRgJMAkmCWAJdgleCUgJwAnWCf4J6AmuCbgJkAmGCIAIlgi+CKgI7gj4CNAIxghOCFgIcAhmCCAINggeCAgIAAAOGA4wACgOYAB4AFAOSA7AANgA8A7oAKAOuA6QAIgPgAGYAbAPqAHgD/gP0AHIAUAPWA9wAWgPIAE4ARAPCA0AAxgDMA0oA2ANeA1QA0gDwA3YDfAD6A2gA7gDkA2IAoAMmAywAqgM4AL4AtAMyAxAAlgCcAxoAiAMOAwQAggaABQYFDAaKBRgGngaUBRIFMAa2BrwFOgaoBS4FJAaiBWAG5gbsBWoG+AV+BXQG8gbQBVYFXAbaBUgGzgbEBUIFwAZGBkwFygZYBd4F1AZSBnAF9gX8BnoF6AZuBmQF4gYgBaYFrAYqBbgGPgY0BbIFkAYWBhwFmgYIBY4FhAYCCYAKBgoMCYoKGAmeCZQKEgowCbYJvAo6CagKLgokCaIKYAnmCewKagn4Cn4KdAnyCdAKVgpcCdoKSAnOCcQKQgrACUYJTArKCVgK3grUCVIJcAr2CvwJegroCW4JZAriCSAKpgqsCSoKuAk+CTQKsgqQCRYJHAqaCQgKjgqECQIPAAyGDIwPCgyYDx4PFAySDLAPNg88DLoPKAyuDKQPIgzgD2YPbAzqD3gM/gz0D3IPUAzWDNwPWgzID04PRAzCDEAPxg/MDEoP2AxeDFQP0g/wDHYMfA/6DGgP7g/kDGIPoAwmDCwPqgw4D74PtAwyDBAPlg+cDBoPiAwODAQPggAAF4ArgDwAU4BEAHgAb4CjgLQAiACfgPAA54DbgMwAQ4FUAWgBf4EQAQeBO4EsAeAB94HLgdwBs4GkAZgBj4GDgpQCqAK/gtACx4L7guwCIAI3gguCHAJzgmQCWAJPgsAD14Prg/wDk4OEA7gDr4Njg3QDSANfgzADJ4MbgwwDA4UUBSgFP4VQBUeFe4VsBaAFt4WLhZwF84XkBdgFz4VABFeEa4R8BBOEBAQ4BC+E44T0BMgE34SwBKeEm4SMBIAHl4erh7wH04fEB/gH74cjhzQHCAcfh3AHZ4dbh0wHw4bUBugG/4aQBoeGu4asBmAGd4ZLhlwGM4YkBhgGD4YDihQKKAo/ilAKR4p7imwKoAq3iouKnArziuQK2ArPikALV4tri3wLE4sECzgLL4vji/QLyAvfi7ALp4ubi4wLgAiXiKuIvAjTiMQI+AjviCOINAgICB+IcAhniFuITAjDidQJ6An/iZAJh4m7iawJYAl3iUuJXAkziSQJGAkPiQAPF48rjzwPU49ED3gPb4+jj7QPiA+fj/AP54/bj8wPQ45UDmgOf44QDgeOO44sDuAO947LjtwOs46kDpgOj46DjZQNqA2/jdANx437jewNIA03jQuNHA1zjWQNWA1PjcAM14zrjPwMk4yEDLgMr4xjjHQMSAxfjDAMJ4wbjAwMAAADlAOoADwD0ABEAHgD7AMgALQAiAMcAPADZANYAMwGQAXUBegGfAWQBgQGOAWsBWAG9AbIBVwGsAUkBRgGjAyADxQPKAy8D1AMxAz4D2wPoAw0DAgPnAxwD+QP2AxMCsAJVAloCvwJEAqECrgJLAngCnQKSAncCjAJpAmYCgwdgB4UHigdvB5QHcQd+B5sHqAdNB0IHpwdcB7kHtgdTBvAGFQYaBv8GBAbhBu4GCwY4Bt0G0gY3BswGKQYmBsMEQASlBKoETwS0BFEEXgS7BIgEbQRiBIcEfASZBJYEcwXQBTUFOgXfBSQFwQXOBSsFGAX9BfIFFwXsBQkFBgXjD+APBQ8KD+8PFA/xD/4PGw8oD80Pwg8nD9wPOQ82D9MOcA6VDpoOfw6EDmEObg6LDrgOXQ5SDrcOTA6pDqYOQwzADCUMKgzPDDQM0QzeDDsMCAztDOIMBwz8DBkMFgzzDVANtQ26DV8NpA1BDU4Nqw2YDX0Ncg2XDWwNiQ2GDWMIgAhlCGoIjwh0CJEIngh7CEgIrQiiCEcIvAhZCFYIswkQCfUJ+gkfCeQJAQkOCesJ2Ak9CTIJ1wksCckJxgkjC6ALRQtKC68LVAuxC74LWwtoC40LggtnC5wLeQt2C5MKMArVCtoKPwrECiEKLgrLCvgKHQoSCvcKDArpCuYKAwAAHuA84CIAOOBmAEQAWuBw4O4AzADS4MgAluC04KoAoOH+AdwBwuHYAYbhpOG6AZABDuEs4TIBKOF2AVQBSuFA494D/APi4/gDpuOE45oDsAMu4wzjEgMI41YDdANq42ACPuIc4gICGOJGAmQCeuJQ4s4C7ALy4ugCtuKU4ooCgOeeB7wHoue4B+bnxOfaB/AHbudM51IHSOcWBzQHKucgBn7mXOZCBljmBgYkBjrmEOaOBqwGsuaoBvbm1ObKBsAEXuR85GIEeOQmBAQEGuQw5K4EjASS5IgE1uT05OoE4OW+BZwFguWYBcbl5OX6BdAFTuVs5XIFaOU2BRQFCuUA7x4PPA8i7zgPZu9E71oPcA/u78zv0g/I75YPtA+q76AO/u7c7sIO2O6GDqQOuu6Q7g4OLA4y7igOdu5U7koOQAze7Pzs4gz47KYMhAya7LDsLgwMDBLsCAxW7HTsagxg7T4NHA0C7RgNRu1k7XoNUA3O7ezt8g3o7bYNlA2K7YAInui86KIIuOjmCMQI2ujw6G4ITAhS6EgIFug06CoIIOl+CVwJQulYCQbpJOk6CRAJjums6bIJqOn2CdQJyunA614LfAti63gLJusE6xoLMAuu64zrkguI69YL9Avq6+AKvuqc6oIKmOrGCuQK+urQ6k4KbApy6mgKNuoU6goKAAAA/gDcACIBuAFGAWQBmgJQAq4CjAJyA+gDFgM0A8oEoAReBHwEggUYBeYFxAU6BvAGDgYsBtIHSAe2B5QHaghgCJ4IvAhCCdgJJgkECfoKMArOCuwKEguIC3YLVAuqDMAMPgwcDOINeA2GDaQNWg6QDm4OTA6yDygP1g/0DwoR4BEeETwRwhBYEKYQhBB6E7ATThNsE5ISCBL2EtQSKhVAFb4VnBViFPgUBhQkFNoXEBfuF8wXMhaoFlYWdBaKGYAZfhlcGaIYOBjGGOQYGhvQGy4bDBvyGmgalhq0GkodIB3eHfwdAhyYHGYcRBy6H3Afjh+sH1IeyB42HhQe6iLgIh4iPCLCI1gjpiOEI3ogsCBOIGwgkiEIIfYh1CEqJkAmviacJmIn+CcGJyQn2iQQJO4kzCQyJaglViV0JYoqgCp+Klwqois4K8Yr5CsaKNAoLigMKPIpaCmWKbQpSi4gLt4u/C4CL5gvZi9EL7oscCyOLKwsUi3ILTYtFC3qMwAz/jPcMyIyuDJGMmQymjFQMa4xjDFyMOgwFjA0MMo3oDdeN3w3gjYYNuY2xDY6NfA1DjUsNdI0SDS2NJQ0ajtgO547vDtCOtg6JjoEOvo5MDnOOew5EjiIOHY4VDiqP8A/Pj8cP+I+eD6GPqQ+Wj2QPW49TD2yPCg81jz0PAoAAATgSOCMANDhFAFYAZzh4OIkAmgCrOLwAzTjeOO8A8DkRAQIBMzkkAVU5Rjl3AWgBmTmKObsBrDndAc4B/zngOiECMgIDOhQCZTp2OkcCWAKpOro6iwKcOu0C/gLPOtADMTsiOxMDBDt1A2YDVztIO7kDqgObO4wD/TvuO98DwDxBBFIEYzx0BAU8FjwnBDgEyTzaPOsE/DyNBJ4ErzywBVE9Qj1zBWQ9FQUGBTc9KD3ZBcoF+z3sBZ09jj2/BaAGYT5yPkMGVD4lBjYGBz4YPukG+gbLPtwGrT6+Po8GkD9xB2IHUz9EBzU/Jj8XBwgH+T/qP9sHzD+9B64Hnz+AMIEIkgijMLQIxTDWMOcI+AgJMBowKwg8ME0IXghvMHAJkTGCMbMJpDHVCcYJ9zHoMRkJCgk7MSwJXTFOMX8JYAqhMrIygwqUMuUK9grHMtgyKQo6CgsyHAptMn4yTwpQM7ELoguTM4QL9TPmM9cLyAs5MyozGwsMM30LbgtfM0AMwTTSNOMM9DSFDJYMpzS4NEkMWgxrNHwMDTQeNC8MMDXRDcIN8zXkDZU1hjW3DagNWTVKNXsNbDUdDQ4NPzUgNuEO8g7DNtQOpTa2NocOmA5pNno2Sw5cNi0OPg4PNhAP8TfiN9MPxDe1D6YPlzeIN3kPag9bN0wPPTcuNx8PAAAAYQDCAKMBhAHlAUYBJwMIA2kDygOrAowC7QJOAi8GWAY5BpoG+wfcB70HHgd/BVAFMQWSBfME1AS1BBYEdwz4DJkMOgxbDXwNHQ2+Dd8P8A+RDzIPUw50DhUOtg7XCqAKwQpiCgMLJAtFC+YLhwmoCckJagkLCCwITQjuCI8JuBnZGXoZGxg8GF0Y/hifGrAa0RpyGhMbNBtVG/Yblx/gH4EfIh9DHmQeBR6mHscc6ByJHCocSx1sHQ0drh3PFUAVIRWCFeMUxBSlFAYUZxZIFikWihbrF8wXrRcOF28TGBN5E9oTuxKcEv0SXhI/EBAQcRDSELMRlBH1EVYRNxM4M1kz+jObMrwy3TJ+Mh8wMDBRMPIwkzG0MdUxdjEXNWA1ATWiNcM05DSFNCY0RzZoNgk2qjbLN+w3jTcuN08/wD+hPwI/Yz5EPiU+hj7nPMg8qTwKPGs9TD0tPY497zmYOfk5Wjk7OBw4fTjeOL86kDrxOlI6MzsUO3U71ju3OoAq4SpCKiMrBCtlK8YrpymIKekpSikrKAwobSjOKK8s2Cy5LBosey1cLT0tni3/L9AvsS8SL3MuVC41LpYu9yZ4JhkmuibbJ/wnnSc+J18lcCURJbIl0yT0JJUkNiRXICAgQSDiIIMhpCHFIWYhByMoI0kj6iOLIqwizSJuIg8nJlZmVyZW5jZSBsaWJGTEFDIDEuMy4zIDIwMTkwODA0AGZMYUMAAABDYUxmIAAAABAAAAAQAAAAGAAAABgAAAAUAAAAAwAAAAUAAAAkAAAAIAAAAEAAAABAAAAAEAAAAEAAAAAIAAAAGAAAAEAAAAAIAAAAYAAAAAEAAAABAAAAbgAAAAgAAAAABAAAQAAAAAEAAAAXCAAACAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAQAAAAcAAAAYAAAA/j8AAA4AAAABAAAAAQAAAAQAAAAEAAAABAAAAAMAAAABAAAACAAAABAAAAACAAAABAAAAAQAAAAFAAAABQAAAA8AAAAfAAAABAAAAAUAAAABAAAABgAAAAEAAAAAAAAAAgAAABAAAABAAAAAQ0QtREEgY3VlIHNoZWV0IG11c3QgaGF2ZSBhIGxlYWQtaW4gbGVuZ3RoIG9mIGF0IGxlYXN0IDIgc2Vjb25kcwBDRC1EQSBjdWUgc2hlZXQgbGVhZC1pbiBsZW5ndGggbXVzdCBiZSBldmVubHkgZGl2aXNpYmxlIGJ5IDU4OCBzYW1wbGVzAGN1ZSBzaGVldCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHRyYWNrICh0aGUgbGVhZC1vdXQpAENELURBIGN1ZSBzaGVldCBtdXN0IGhhdmUgYSBsZWFkLW91dCB0cmFjayBudW1iZXIgMTcwICgweEFBKQBjdWUgc2hlZXQgbWF5IG5vdCBoYXZlIGEgdHJhY2sgbnVtYmVyIDAAQ0QtREEgY3VlIHNoZWV0IHRyYWNrIG51bWJlciBtdXN0IGJlIDEtOTkgb3IgMTcwAENELURBIGN1ZSBzaGVldCBsZWFkLW91dCBvZmZzZXQgbXVzdCBiZSBldmVubHkgZGl2aXNpYmxlIGJ5IDU4OCBzYW1wbGVzAENELURBIGN1ZSBzaGVldCB0cmFjayBvZmZzZXQgbXVzdCBiZSBldmVubHkgZGl2aXNpYmxlIGJ5IDU4OCBzYW1wbGVzAGN1ZSBzaGVldCB0cmFjayBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGluZGV4IHBvaW50AGN1ZSBzaGVldCB0cmFjaydzIGZpcnN0IGluZGV4IG51bWJlciBtdXN0IGJlIDAgb3IgMQBDRC1EQSBjdWUgc2hlZXQgdHJhY2sgaW5kZXggb2Zmc2V0IG11c3QgYmUgZXZlbmx5IGRpdmlzaWJsZSBieSA1ODggc2FtcGxlcwBjdWUgc2hlZXQgdHJhY2sgaW5kZXggbnVtYmVycyBtdXN0IGluY3JlYXNlIGJ5IDEATUlNRSB0eXBlIHN0cmluZyBtdXN0IGNvbnRhaW4gb25seSBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVycyAoMHgyMC0weDdlKQBkZXNjcmlwdGlvbiBzdHJpbmcgbXVzdCBiZSB2YWxpZCBVVEYtOA=="); base64DecodeToExistingUint8Array(bufferView, 6516, "tx3BBG47ggnZJkMN3HYEE2trxReyTYYaBVBHHrjtCCYP8Mki1taKL2HLSytkmww104bNMQqgjjy9vU84cNsRTMfG0Ege4JNFqf1SQaytFV8bsNRbwpaXVnWLVlLINhlqfyvYbqYNm2MREFpnFEAdeaNd3H16e59wzWZedOC2I5hXq+Kcjo2hkTmQYJU8wCeLi93mj1L7pYLl5mSGWFsrvu9G6ro2YKm3gX1os4QtL60zMO6p6hatpF0LbKCQbTLUJ3Dz0P5WsN1JS3HZTBs2x/sG98MiILTOlT11yiiAOvKfnfv2Rru4+/Gmef/09j7hQ+v/5ZrNvOgt0H3sd3CGNMBtRzAZSwQ9rlbFOasGgiccG0MjxT0ALnIgwSrPnY4SeIBPFqGmDBsWu80fE+uKAaT2SwV90AgIys3JDAerl3iwtlZ8aZAVcd6N1HXb3ZNrbMBSb7XmEWIC+9Bmv0afXghbXlrRfR1XZmDcU2Mwm03ULVpJDQsZRLoW2ECXxqWsINtkqPn9J6VO4OahS7Chv/ytYLsliyO2kpbisi8rrYqYNmyOQRAvg/YN7ofzXamZREBonZ1mK5Aqe+qU5x204FAAdeSJJjbpPjv37TtrsPOMdnH3VVAy+uJN8/5f8LzG6O19wjHLPs+G1v/Lg4a41TSbedHtvTrcWqD72O7gDGlZ/c1tgNuOYDfGT2Qylgh6hYvJflytinPrsEt3Vg0ET+EQxUs4NoZGjytHQop7AFw9ZsFY5ECCVVNdQ1GeOx0lKSbcIfAAnyxHHV4oQk0ZNvVQ2DIsdps/m2taOybWFQORy9QHSO2XCv/wVg76oBEQTb3QFJSbkxkjhlIdDlYv8blL7vVgba3413Bs/NIgK+JlPermvBup6wsGaO+2uyfXAabm09iApd5vnWTaas0jxN3Q4sAE9qHNs+tgyX6NPr3JkP+5ELa8tKerfbCi+zquFeb7qszAuKd73XmjxmA2m3F995+oW7SSH0Z1lhoWMoitC/OMdC2wgcMwcYWZkIpdLo1LWferCFRAtslQReaOTvL7T0or3QxHnMDNQyF9gnuWYEN/T0YAcvhbwXb9C4ZoShZHbJMwBGEkLcVl6UubEV5WWhWHcBkYMG3YHDU9nwKCIF4GWwYdC+wb3A9RppM35rtSMz+dET6IgNA6jdCXJDrNViDj6xUtVPbUKXkmqcXOO2jBFx0rzKAA6silUK3WEk1s0strL998du7bwcuh43bWYOev8CPqGO3i7h29pfCqoGT0c4Yn+cSb5v0J/biJvuB5jWfGOoDQ2/uE1Yu8mmKWfZ67sD6TDK3/l7EQsK8GDXGr3ysypmg286JtZrS82nt1uANdNrW0QPexf0ZMQUMAAAAQAAAAiCoAAElEMw=="); base64DecodeToExistingUint8Array(bufferView, 7576, "AQAAAAUAAAAYKw=="); base64DecodeToExistingUint8Array(bufferView, 7600, "AwAAAAQAAAAEAAAABgAAAIP5ogBETm4A/CkVANFXJwDdNPUAYtvAADyZlQBBkEMAY1H+ALveqwC3YcUAOm4kANJNQgBJBuAACeouAByS0QDrHf4AKbEcAOg+pwD1NYIARLsuAJzphAC0JnAAQX5fANaROQBTgzkAnPQ5AItfhAAo+b0A+B87AN7/lwAPmAUAES/vAApaiwBtH20Az342AAnLJwBGT7cAnmY/AC3qXwC6J3UA5evHAD178QD3OQcAklKKAPtr6gAfsV8ACF2NADADVgB7/EYA8KtrACC8zwA29JoA46kdAF5hkQAIG+YAhZllAKAUXwCNQGgAgNj/ACdzTQAGBjEAylYVAMmocwB74mAAa4zAABnERwDNZ8MACejcAFmDKgCLdsQAphyWAESv3QAZV9EApT4FAAUH/wAzfj8AwjLoAJhP3gC7fTIAJj3DAB5r7wCf+F4ANR86AH/yygDxhx0AfJAhAGokfADVbvoAMC13ABU7QwC1FMYAwxmdAK3EwgAsTUEADABdAIZ9RgDjcS0Am8aaADNiAAC00nwAtKeXADdV1QDXPvYAoxAYAE12/ABknSoAcNerAGN8+AB6sFcAFxXnAMBJVgA71tkAp4Q4ACQjywDWincAWlQjAAAfuQDxChsAGc7fAJ8x/wBmHmoAmVdhAKz7RwB+f9gAImW3ADLoiQDmv2AA78TNAGw2CQBdP9QAFt7XAFg73gDem5IA0iIoACiG6ADiWE0AxsoyAAjjFgDgfcsAF8BQAPMdpwAY4FsALhM0AIMSYgCDSAEA9Y5bAK2wfwAe6fIASEpDABBn0wCq3dgArl9CAGphzgAKKKQA05m0AAam8gBcd38Ao8KDAGE8iACKc3gAr4xaAG/XvQAtpmMA9L/LAI2B7wAmwWcAVcpFAMrZNgAoqNIAwmGNABLJdwAEJhQAEkabAMRZxADIxUQATbKRAAAX8wDUQ60AKUnlAP3VEAAAvvwAHpTMAHDO7gATPvUA7PGAALPnwwDH+CgAkwWUAMFxPgAuCbMAC0XzAIgSnACrIHsALrWfAEeSwgB7Mi8ADFVtAHKnkABr5x8AMcuWAHkWSgBBeeIA9N+JAOiUlwDi5oQAmTGXAIjtawBfXzYAu/0OAEiatABnpGwAcXJCAI1dMgCfFbgAvOUJAI0xJQD3dDkAMAUcAA0MAQBLCGgALO5YAEeqkAB05wIAvdYkAPd9pgBuSHIAnxbvAI6UpgC0kfYA0VNRAM8K8gAgmDMA9Ut+ALJjaADdPl8AQF0DAIWJfwBVUikAN2TAAG3YEAAySDIAW0x1AE5x1ABFVG4ACwnBACr1aQAUZtUAJwedAF0EUAC0O9sA6nbFAIf5FwBJa30AHSe6AJZpKQDGzKwArRRUAJDiagCI2YkALHJQAASkvgB3B5QA8zBwAAD8JwDqcagAZsJJAGTgPQCX3YMAoz+XAEOU/QANhowAMUHeAJI5nQDdcIwAF7fnAAjfOwAVNysAXICgAFqAkwAQEZIAD+jYAGyArwDb/0sAOJAPAFkYdgBipRUAYcu7AMeJuQAQQL0A0vIEAEl1JwDrtvYA2yK7AAoUqgCJJi8AZIN2AAk7MwAOlBoAUTqqAB2jwgCv7a4AXCYSAG3CTQAtepwAwFaXAAM/gwAJ8PYAK0CMAG0xmQA5tAcADCAVANjDWwD1ksQAxq1LAE7KpQCnN80A5qk2AKuSlADdQmgAGWPeAHaM7wBoi1IA/Ns3AK6hqwDfFTEAAK6hAAz72gBkTWYA7QW3ACllMABXVr8AR/86AGr5uQB1vvMAKJPfAKuAMABmjPYABMsVAPoiBgDZ5B0APbOkAFcbjwA2zQkATkLpABO+pAAzI7UA8KoaAE9lqADSwaUACz8PAFt4zQAj+XYAe4sEAIkXcgDGplMAb27iAO/rAACbSlgAxNq3AKpmugB2z88A0QIdALHxLQCMmcEAw613AIZI2gD3XaAAxoD0AKzwLwDd7JoAP1y8ANDebQCQxx8AKtu2AKMlOgAAr5oArVOTALZXBAApLbQAS4B+ANoHpwB2qg4Ae1mhABYSKgDcty0A+uX9AInb/gCJvv0A5HZsAAap/AA+gHAAhW4VAP2H/wAoPgcAYWczACoYhgBNveoAs+evAI9tbgCVZzkAMb9bAITXSAAw3xYAxy1DACVhNQDJcM4AMMu4AL9s/QCkAKIABWzkAFrdoAAhb0cAYhLSALlchABwYUkAa1bgAJlSAQBQVTcAHtW3ADPxxAATbl8AXTDkAIUuqQAdssMAoTI2AAi3pADqsdQAFvchAI9p5AAn/3cADAOAAI1ALQBPzaAAIKWZALOi0wAvXQoAtPlCABHaywB9vtAAm9vBAKsXvQDKooEACGpcAC5VFwAnAFUAfxTwAOEHhgAUC2QAlkGNAIe+3gDa/SoAayW2AHuJNAAF8/4Aub+eAGhqTwBKKqgAT8RaAC34vADXWpgA9MeVAA1NjQAgOqYApFdfABQ/sQCAOJUAzCABAHHdhgDJ3rYAv2D1AE1lEQABB2sAjLCsALLA0ABRVUgAHvsOAJVywwCjBjsAwEA1AAbcewDgRcwATin6ANbKyADo80EAfGTeAJtk2ADZvjEApJfDAHdY1ABp48UA8NoTALo6PABGGEYAVXVfANK99QBuksYArC5dAA5E7QAcPkIAYcSHACn96QDn1vMAInzKAG+RNQAI4MUA/9eNAG5q4gCw/cYAkwjBAHxddABrrbIAzW6dAD5yewDGEWoA98+pAClz3wC1yboAtwBRAOKyDQB0uiQA5X1gAHTYigANFSwAgRgMAH5mlAABKRYAn3p2AP39vgBWRe8A2X42AOzZEwCLurkAxJf8ADGoJwDxbsMAlMU2ANioVgC0qLUAz8wOABKJLQBvVzQALFaJAJnO4wDWILkAa16qAD4qnAARX8wA/QtKAOH0+wCOO20A4oYsAOnUhAD8tKkA7+7RAC41yQAvOWEAOCFEABvZyACB/AoA+0pqAC8c2ABTtIQATpmMAFQizAAqVdwAwMbWAAsZlgAacLgAaZVkACZaYAA/Uu4AfxEPAPS1EQD8y/UANLwtADS87gDoXcwA3V5gAGeOmwCSM+8AyRe4AGFYmwDhV7wAUYPGANg+EADdcUgALRzdAK8YoQAhLEYAWfPXANl6mACeVMAAT4b6AFYG/ADlea4AiSI2ADitIgBnk9wAVeiqAIImOADK55sAUQ2kAJkzsQCp1w4AaQVIAGWy8AB/iKcAiEyXAPnRNgAhkrMAe4JKAJjPIQBAn9wA3EdVAOF0OgBn60IA/p3fAF7UXwB7Z6QAuqx6AFX2ogAriCMAQbpVAFluCAAhKoYAOUeDAInj5gDlntQASftAAP9W6QAcD8oAxVmKAJT6KwDTwcUAD8XPANtargBHxYYAhUNiACGGOwAseZQAEGGHACpMewCALBoAQ78SAIgmkAB4PIkAqMTkAOXbewDEOsIAJvTqAPdnigANkr8AZaMrAD2TsQC9fAsApFHcACfdYwBp4d0AmpQZAKgplQBozigACe20AESfIABOmMoAcIJjAH58IwAPuTIAp/WOABRW5wAh8QgAtZ0qAG9+TQClGVEAtfmrAILf1gCW3WEAFjYCAMQ6nwCDoqEAcu1tADmNegCCuKkAazJcAEYnWwAANO0A0gB3APz0VQABWU0A4HGA"); base64DecodeToExistingUint8Array(bufferView, 10387, "QPsh+T8AAAAALUR0PgAAAICYRvg8AAAAYFHMeDsAAACAgxvwOQAAAEAgJXo4AAAAgCKC4zYAAAAAHfNpNQAAAAAAAOA/AAAAAAAA4L8BAAAAAgAAAAQAAAAFAAAABgAAAGluZmluaXR5AG5hbg=="); base64DecodeToExistingUint8Array(bufferView, 10512, "0XSeAFedvSqAcFIP//8+JwoAAABkAAAA6AMAABAnAACghgEAQEIPAICWmAAA4fUFGAAAADUAAABxAAAAa////877//+Sv///YmFydGxldHQAYmFydGxldHRfaGFubgBibGFja21hbgBibGFja21hbl9oYXJyaXNfNHRlcm1fOTJkYgBjb25uZXMAZmxhdHRvcABnYXVzcygAaGFtbWluZwBoYW5uAGthaXNlcl9iZXNzZWwAbnV0dGFsbAByZWN0YW5nbGUAdHJpYW5nbGUAdHVrZXkoAHBhcnRpYWxfdHVrZXkoAHB1bmNob3V0X3R1a2V5KAB3ZWxjaABpbWFnZS9wbmcALS0+AHR1a2V5KDVlLTEpAHR1a2V5KDVlLTEpO3BhcnRpYWxfdHVrZXkoMikAdHVrZXkoNWUtMSk7cGFydGlhbF90dWtleSgyKTtwdW5jaG91dF90dWtleSgzKQ=="); base64DecodeToExistingUint8Array(bufferView, 10881, "FQAAcR0AAAk="); base64DecodeToExistingUint8Array(bufferView, 10900, "Ag=="); base64DecodeToExistingUint8Array(bufferView, 10920, "AwAAAAAAAAAEAAAASC8AAAAE"); base64DecodeToExistingUint8Array(bufferView, 10964, "/////w=="); base64DecodeToExistingUint8Array(bufferView, 11032, "BQ=="); base64DecodeToExistingUint8Array(bufferView, 11044, "CQ=="); base64DecodeToExistingUint8Array(bufferView, 11068, "CgAAAAsAAABYMwAAAAQ="); base64DecodeToExistingUint8Array(bufferView, 11092, "AQ=="); base64DecodeToExistingUint8Array(bufferView, 11107, "Cv////8="); base64DecodeToExistingUint8Array(bufferView, 11176, "GCs="); base64DecodeToExistingUint8Array(bufferView, 11216, "AwAAAAAAAAAZKgAAAQAAAAE="); base64DecodeToExistingUint8Array(bufferView, 11260, "AwAAAAAAAAAZKgAAAQ=="); base64DecodeToExistingUint8Array(bufferView, 11304, "AwAAAAAAAAAZKg=="); base64DecodeToExistingUint8Array(bufferView, 11324, "Bg=="); base64DecodeToExistingUint8Array(bufferView, 11348, "BAAAAAAAAAAZKgAAAQAAAAEAAAAI"); base64DecodeToExistingUint8Array(bufferView, 11392, "BAAAAAAAAAAZKgAAAQAAAAAAAAAI"); base64DecodeToExistingUint8Array(bufferView, 11436, "BQAAAAAAAAAZKgAAAQAAAAAAAAAI"); base64DecodeToExistingUint8Array(bufferView, 11480, "BgAAAAAAAAAlKgAAAQAAAAAAAAAM"); base64DecodeToExistingUint8Array(bufferView, 11524, "BgAAAAAAAAAlKgAAAQAAAAAAAAAM"); base64DecodeToExistingUint8Array(bufferView, 11568, "BgAAAAAAAABCKg=="); return asmFunc({ 'Int8Array': Int8Array, 'Int16Array': Int16Array, 'Int32Array': Int32Array, 'Uint8Array': Uint8Array, 'Uint16Array': Uint16Array, 'Uint32Array': Uint32Array, 'Float32Array': Float32Array, 'Float64Array': Float64Array, 'NaN': NaN, 'Infinity': Infinity, 'Math': Math }, asmLibraryArg, wasmMemory.buffer ) } )(asmLibraryArg, wasmMemory, wasmTable); }, instantiate: /** @suppress{checkTypes} */ function(binary, info) { return { then: function(ok) { ok({ 'instance': new WebAssembly.Instance(new WebAssembly.Module(binary)) }); } }; }, RuntimeError: Error }; // We don't need to actually download a wasm binary, mark it as present but empty. wasmBinary = []; if (typeof WebAssembly !== 'object') { abort('no native wasm support detected'); } // In MINIMAL_RUNTIME, setValue() and getValue() are only available when building with safe heap enabled, for heap safety checking. // In traditional runtime, setValue() and getValue() are always available (although their use is highly discouraged due to perf penalties) /** @param {number} ptr @param {number} value @param {string} type @param {number|boolean=} noSafe */ function setValue(ptr, value, type, noSafe) { type = type || 'i8'; if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit switch(type) { case 'i1': HEAP8[((ptr)>>0)]=value; break; case 'i8': HEAP8[((ptr)>>0)]=value; break; case 'i16': HEAP16[((ptr)>>1)]=value; break; case 'i32': HEAP32[((ptr)>>2)]=value; break; case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break; case 'float': HEAPF32[((ptr)>>2)]=value; break; case 'double': HEAPF64[((ptr)>>3)]=value; break; default: abort('invalid type for setValue: ' + type); } } /** @param {number} ptr @param {string} type @param {number|boolean=} noSafe */ function getValue(ptr, type, noSafe) { type = type || 'i8'; if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit switch(type) { case 'i1': return HEAP8[((ptr)>>0)]; case 'i8': return HEAP8[((ptr)>>0)]; case 'i16': return HEAP16[((ptr)>>1)]; case 'i32': return HEAP32[((ptr)>>2)]; case 'i64': return HEAP32[((ptr)>>2)]; case 'float': return HEAPF32[((ptr)>>2)]; case 'double': return HEAPF64[((ptr)>>3)]; default: abort('invalid type for getValue: ' + type); } return null; } // Wasm globals var wasmMemory; // In fastcomp asm.js, we don't need a wasm Table at all. // In the wasm backend, we polyfill the WebAssembly object, // so this creates a (non-native-wasm) table for us. var wasmTable = new WebAssembly.Table({ 'initial': 22, 'maximum': 22 + 5, 'element': 'anyfunc' }); //======================================== // Runtime essentials //======================================== // whether we are quitting the application. no code should run after this. // set in exit() and abort() var ABORT = false; // set by exit() and abort(). Passed to 'onExit' handler. // NOTE: This is also used as the process return code code in shell environments // but only when noExitRuntime is false. var EXITSTATUS = 0; /** @type {function(*, string=)} */ function assert(condition, text) { if (!condition) { abort('Assertion failed: ' + text); } } // Returns the C function with a specified identifier (for C++, you need to do manual name mangling) function getCFunc(ident) { var func = Module['_' + ident]; // closure exported function assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); return func; } // C calling interface. /** @param {string|null=} returnType @param {Array=} argTypes @param {Arguments|Array=} args @param {Object=} opts */ function ccall(ident, returnType, argTypes, args, opts) { // For fast lookup of conversion functions var toC = { 'string': function(str) { var ret = 0; if (str !== null && str !== undefined && str !== 0) { // null string // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' var len = (str.length << 2) + 1; ret = stackAlloc(len); stringToUTF8(str, ret, len); } return ret; }, 'array': function(arr) { var ret = stackAlloc(arr.length); writeArrayToMemory(arr, ret); return ret; } }; function convertReturnValue(ret) { if (returnType === 'string') return UTF8ToString(ret); if (returnType === 'boolean') return Boolean(ret); return ret; } var func = getCFunc(ident); var cArgs = []; var stack = 0; if (args) { for (var i = 0; i < args.length; i++) { var converter = toC[argTypes[i]]; if (converter) { if (stack === 0) stack = stackSave(); cArgs[i] = converter(args[i]); } else { cArgs[i] = args[i]; } } } var ret = func.apply(null, cArgs); ret = convertReturnValue(ret); if (stack !== 0) stackRestore(stack); return ret; } /** @param {string=} returnType @param {Array=} argTypes @param {Object=} opts */ function cwrap(ident, returnType, argTypes, opts) { argTypes = argTypes || []; // When the function takes numbers and returns a number, we can just return // the original function var numericArgs = argTypes.every(function(type){ return type === 'number'}); var numericRet = returnType !== 'string'; if (numericRet && numericArgs && !opts) { return getCFunc(ident); } return function() { return ccall(ident, returnType, argTypes, arguments, opts); } } var ALLOC_NORMAL = 0; // Tries to use _malloc() var ALLOC_STACK = 1; // Lives for the duration of the current function call var ALLOC_DYNAMIC = 2; // Cannot be freed except through sbrk var ALLOC_NONE = 3; // Do not allocate // allocate(): This is for internal use. You can use it yourself as well, but the interface // is a little tricky (see docs right below). The reason is that it is optimized // for multiple syntaxes to save space in generated code. So you should // normally not use allocate(), and instead allocate memory using _malloc(), // initialize it with setValue(), and so forth. // @slab: An array of data, or a number. If a number, then the size of the block to allocate, // in *bytes* (note that this is sometimes confusing: the next parameter does not // affect this!) // @types: Either an array of types, one for each byte (or 0 if no type at that position), // or a single type which is used for the entire block. This only matters if there // is initial data - if @slab is a number, then this does not matter at all and is // ignored. // @allocator: How to allocate memory, see ALLOC_* /** @type {function((TypedArray|Array|number), string, number, number=)} */ function allocate(slab, types, allocator, ptr) { var zeroinit, size; if (typeof slab === 'number') { zeroinit = true; size = slab; } else { zeroinit = false; size = slab.length; } var singleType = typeof types === 'string' ? types : null; var ret; if (allocator == ALLOC_NONE) { ret = ptr; } else { ret = [_malloc, stackAlloc, dynamicAlloc][allocator](Math.max(size, singleType ? 1 : types.length)); } if (zeroinit) { var stop; ptr = ret; assert((ret & 3) == 0); stop = ret + (size & ~3); for (; ptr < stop; ptr += 4) { HEAP32[((ptr)>>2)]=0; } stop = ret + size; while (ptr < stop) { HEAP8[((ptr++)>>0)]=0; } return ret; } if (singleType === 'i8') { if (slab.subarray || slab.slice) { HEAPU8.set(/** @type {!Uint8Array} */ (slab), ret); } else { HEAPU8.set(new Uint8Array(slab), ret); } return ret; } var i = 0, type, typeSize, previousType; while (i < size) { var curr = slab[i]; type = singleType || types[i]; if (type === 0) { i++; continue; } if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later setValue(ret+i, curr, type); // no need to look up size unless type changes, so cache it if (previousType !== type) { typeSize = getNativeTypeSize(type); previousType = type; } i += typeSize; } return ret; } // Allocate memory during any stage of startup - static memory early on, dynamic memory later, malloc when ready function getMemory(size) { if (!runtimeInitialized) return dynamicAlloc(size); return _malloc(size); } // runtime_strings.js: Strings related runtime functions that are part of both MINIMAL_RUNTIME and regular runtime. // Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns // a copy of that string as a Javascript String object. var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined; /** * @param {number} idx * @param {number=} maxBytesToRead * @return {string} */ function UTF8ArrayToString(heap, idx, maxBytesToRead) { var endIdx = idx + maxBytesToRead; var endPtr = idx; // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity) while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr; if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { return UTF8Decoder.decode(heap.subarray(idx, endPtr)); } else { var str = ''; // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that while (idx < endPtr) { // For UTF8 byte structure, see: // http://en.wikipedia.org/wiki/UTF-8#Description // https://www.ietf.org/rfc/rfc2279.txt // https://tools.ietf.org/html/rfc3629 var u0 = heap[idx++]; if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } var u1 = heap[idx++] & 63; if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } var u2 = heap[idx++] & 63; if ((u0 & 0xF0) == 0xE0) { u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; } else { u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63); } if (u0 < 0x10000) { str += String.fromCharCode(u0); } else { var ch = u0 - 0x10000; str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); } } } return str; } // Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a // copy of that string as a Javascript String object. // maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit // this parameter to scan the string until the first \0 byte. If maxBytesToRead is // passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the // middle, then the string will cut short at that byte index (i.e. maxBytesToRead will // not produce a string of exact length [ptr, ptr+maxBytesToRead[) // N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may // throw JS JIT optimizations off, so it is worth to consider consistently using one // style or the other. /** * @param {number} ptr * @param {number=} maxBytesToRead * @return {string} */ function UTF8ToString(ptr, maxBytesToRead) { return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; } // Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', // encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. // Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. // Parameters: // str: the Javascript string to copy. // heap: the array to copy to. Each index in this array is assumed to be one 8-byte element. // outIdx: The starting offset in the array to begin the copying. // maxBytesToWrite: The maximum number of bytes this function can write to the array. // This count should include the null terminator, // i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. // maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. // Returns the number of bytes written, EXCLUDING the null terminator. function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. return 0; var startIdx = outIdx; var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. for (var i = 0; i < str.length; ++i) { // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. // See http://unicode.org/faq/utf_bom.html#utf16-3 // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 var u = str.charCodeAt(i); // possibly a lead surrogate if (u >= 0xD800 && u <= 0xDFFF) { var u1 = str.charCodeAt(++i); u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); } if (u <= 0x7F) { if (outIdx >= endIdx) break; heap[outIdx++] = u; } else if (u <= 0x7FF) { if (outIdx + 1 >= endIdx) break; heap[outIdx++] = 0xC0 | (u >> 6); heap[outIdx++] = 0x80 | (u & 63); } else if (u <= 0xFFFF) { if (outIdx + 2 >= endIdx) break; heap[outIdx++] = 0xE0 | (u >> 12); heap[outIdx++] = 0x80 | ((u >> 6) & 63); heap[outIdx++] = 0x80 | (u & 63); } else { if (outIdx + 3 >= endIdx) break; heap[outIdx++] = 0xF0 | (u >> 18); heap[outIdx++] = 0x80 | ((u >> 12) & 63); heap[outIdx++] = 0x80 | ((u >> 6) & 63); heap[outIdx++] = 0x80 | (u & 63); } } // Null-terminate the pointer to the buffer. heap[outIdx] = 0; return outIdx - startIdx; } // Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', // null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. // Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. // Returns the number of bytes written, EXCLUDING the null terminator. function stringToUTF8(str, outPtr, maxBytesToWrite) { return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); } // Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. function lengthBytesUTF8(str) { var len = 0; for (var i = 0; i < str.length; ++i) { // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. // See http://unicode.org/faq/utf_bom.html#utf16-3 var u = str.charCodeAt(i); // possibly a lead surrogate if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); if (u <= 0x7F) ++len; else if (u <= 0x7FF) len += 2; else if (u <= 0xFFFF) len += 3; else len += 4; } return len; } // runtime_strings_extra.js: Strings related runtime functions that are available only in regular runtime. // Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns // a copy of that string as a Javascript String object. function AsciiToString(ptr) { var str = ''; while (1) { var ch = HEAPU8[((ptr++)>>0)]; if (!ch) return str; str += String.fromCharCode(ch); } } // Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', // null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. function stringToAscii(str, outPtr) { return writeAsciiToMemory(str, outPtr, false); } // Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns // a copy of that string as a Javascript String object. var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined; function UTF16ToString(ptr, maxBytesToRead) { var endPtr = ptr; // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. var idx = endPtr >> 1; var maxIdx = idx + maxBytesToRead / 2; // If maxBytesToRead is not passed explicitly, it will be undefined, and this // will always evaluate to true. This saves on code size. while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx; endPtr = idx << 1; if (endPtr - ptr > 32 && UTF16Decoder) { return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); } else { var i = 0; var str = ''; while (1) { var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; if (codeUnit == 0 || i == maxBytesToRead / 2) return str; ++i; // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. str += String.fromCharCode(codeUnit); } } } // Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', // null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. // Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. // Parameters: // str: the Javascript string to copy. // outPtr: Byte address in Emscripten HEAP where to write the string to. // maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null // terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. // maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. // Returns the number of bytes written, EXCLUDING the null terminator. function stringToUTF16(str, outPtr, maxBytesToWrite) { // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. if (maxBytesToWrite === undefined) { maxBytesToWrite = 0x7FFFFFFF; } if (maxBytesToWrite < 2) return 0; maxBytesToWrite -= 2; // Null terminator. var startPtr = outPtr; var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; for (var i = 0; i < numCharsToWrite; ++i) { // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. var codeUnit = str.charCodeAt(i); // possibly a lead surrogate HEAP16[((outPtr)>>1)]=codeUnit; outPtr += 2; } // Null-terminate the pointer to the HEAP. HEAP16[((outPtr)>>1)]=0; return outPtr - startPtr; } // Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. function lengthBytesUTF16(str) { return str.length*2; } function UTF32ToString(ptr, maxBytesToRead) { var i = 0; var str = ''; // If maxBytesToRead is not passed explicitly, it will be undefined, and this // will always evaluate to true. This saves on code size. while (!(i >= maxBytesToRead / 4)) { var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; if (utf32 == 0) break; ++i; // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. // See http://unicode.org/faq/utf_bom.html#utf16-3 if (utf32 >= 0x10000) { var ch = utf32 - 0x10000; str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); } else { str += String.fromCharCode(utf32); } } return str; } // Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', // null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. // Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. // Parameters: // str: the Javascript string to copy. // outPtr: Byte address in Emscripten HEAP where to write the string to. // maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null // terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. // maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. // Returns the number of bytes written, EXCLUDING the null terminator. function stringToUTF32(str, outPtr, maxBytesToWrite) { // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. if (maxBytesToWrite === undefined) { maxBytesToWrite = 0x7FFFFFFF; } if (maxBytesToWrite < 4) return 0; var startPtr = outPtr; var endPtr = startPtr + maxBytesToWrite - 4; for (var i = 0; i < str.length; ++i) { // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. // See http://unicode.org/faq/utf_bom.html#utf16-3 var codeUnit = str.charCodeAt(i); // possibly a lead surrogate if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { var trailSurrogate = str.charCodeAt(++i); codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); } HEAP32[((outPtr)>>2)]=codeUnit; outPtr += 4; if (outPtr + 4 > endPtr) break; } // Null-terminate the pointer to the HEAP. HEAP32[((outPtr)>>2)]=0; return outPtr - startPtr; } // Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. function lengthBytesUTF32(str) { var len = 0; for (var i = 0; i < str.length; ++i) { // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. // See http://unicode.org/faq/utf_bom.html#utf16-3 var codeUnit = str.charCodeAt(i); if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. len += 4; } return len; } // Allocate heap space for a JS string, and write it there. // It is the responsibility of the caller to free() that memory. function allocateUTF8(str) { var size = lengthBytesUTF8(str) + 1; var ret = _malloc(size); if (ret) stringToUTF8Array(str, HEAP8, ret, size); return ret; } // Allocate stack space for a JS string, and write it there. function allocateUTF8OnStack(str) { var size = lengthBytesUTF8(str) + 1; var ret = stackAlloc(size); stringToUTF8Array(str, HEAP8, ret, size); return ret; } // Deprecated: This function should not be called because it is unsafe and does not provide // a maximum length limit of how many bytes it is allowed to write. Prefer calling the // function stringToUTF8Array() instead, which takes in a maximum length that can be used // to be secure from out of bounds writes. /** @deprecated @param {boolean=} dontAddNull */ function writeStringToMemory(string, buffer, dontAddNull) { warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); var /** @type {number} */ lastChar, /** @type {number} */ end; if (dontAddNull) { // stringToUTF8Array always appends null. If we don't want to do that, remember the // character that existed at the location where the null will be placed, and restore // that after the write (below). end = buffer + lengthBytesUTF8(string); lastChar = HEAP8[end]; } stringToUTF8(string, buffer, Infinity); if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. } function writeArrayToMemory(array, buffer) { HEAP8.set(array, buffer); } /** @param {boolean=} dontAddNull */ function writeAsciiToMemory(str, buffer, dontAddNull) { for (var i = 0; i < str.length; ++i) { HEAP8[((buffer++)>>0)]=str.charCodeAt(i); } // Null-terminate the pointer to the HEAP. if (!dontAddNull) HEAP8[((buffer)>>0)]=0; } // Memory management var PAGE_SIZE = 16384; var WASM_PAGE_SIZE = 65536; var ASMJS_PAGE_SIZE = 16777216; function alignUp(x, multiple) { if (x % multiple > 0) { x += multiple - (x % multiple); } return x; } var HEAP, /** @type {ArrayBuffer} */ buffer, /** @type {Int8Array} */ HEAP8, /** @type {Uint8Array} */ HEAPU8, /** @type {Int16Array} */ HEAP16, /** @type {Uint16Array} */ HEAPU16, /** @type {Int32Array} */ HEAP32, /** @type {Uint32Array} */ HEAPU32, /** @type {Float32Array} */ HEAPF32, /** @type {Float64Array} */ HEAPF64; function updateGlobalBufferAndViews(buf) { buffer = buf; Module['HEAP8'] = HEAP8 = new Int8Array(buf); Module['HEAP16'] = HEAP16 = new Int16Array(buf); Module['HEAP32'] = HEAP32 = new Int32Array(buf); Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf); Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf); Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf); Module['HEAPF32'] = HEAPF32 = new Float32Array(buf); Module['HEAPF64'] = HEAPF64 = new Float64Array(buf); } var STATIC_BASE = 1024, STACK_BASE = 5257216, STACKTOP = STACK_BASE, STACK_MAX = 14336, DYNAMIC_BASE = 5257216, DYNAMICTOP_PTR = 14176; var TOTAL_STACK = 5242880; var INITIAL_INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216; // In non-standalone/normal mode, we create the memory here. // Create the main memory. (Note: this isn't used in STANDALONE_WASM mode since the wasm // memory is created in the wasm, not in JS.) if (Module['wasmMemory']) { wasmMemory = Module['wasmMemory']; } else { wasmMemory = new WebAssembly.Memory({ 'initial': INITIAL_INITIAL_MEMORY / WASM_PAGE_SIZE , 'maximum': 2147483648 / WASM_PAGE_SIZE }); } if (wasmMemory) { buffer = wasmMemory.buffer; } // If the user provides an incorrect length, just use that length instead rather than providing the user to // specifically provide the memory length with Module['INITIAL_MEMORY']. INITIAL_INITIAL_MEMORY = buffer.byteLength; updateGlobalBufferAndViews(buffer); HEAP32[DYNAMICTOP_PTR>>2] = DYNAMIC_BASE; function callRuntimeCallbacks(callbacks) { while(callbacks.length > 0) { var callback = callbacks.shift(); if (typeof callback == 'function') { callback(Module); // Pass the module as the first argument. continue; } var func = callback.func; if (typeof func === 'number') { if (callback.arg === undefined) { Module['dynCall_v'](func); } else { Module['dynCall_vi'](func, callback.arg); } } else { func(callback.arg === undefined ? null : callback.arg); } } } var __ATPRERUN__ = []; // functions called before the runtime is initialized var __ATINIT__ = []; // functions called during startup var __ATMAIN__ = []; // functions called when main() is to be run var __ATEXIT__ = []; // functions called during shutdown var __ATPOSTRUN__ = []; // functions called after the main() is called var runtimeInitialized = false; var runtimeExited = false; function preRun() { if (Module['preRun']) { if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; while (Module['preRun'].length) { addOnPreRun(Module['preRun'].shift()); } } callRuntimeCallbacks(__ATPRERUN__); } function initRuntime() { runtimeInitialized = true; if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); TTY.init(); callRuntimeCallbacks(__ATINIT__); } function preMain() { FS.ignorePermissions = false; callRuntimeCallbacks(__ATMAIN__); } function exitRuntime() { runtimeExited = true; } function postRun() { if (Module['postRun']) { if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; while (Module['postRun'].length) { addOnPostRun(Module['postRun'].shift()); } } callRuntimeCallbacks(__ATPOSTRUN__); } function addOnPreRun(cb) { __ATPRERUN__.unshift(cb); } function addOnInit(cb) { __ATINIT__.unshift(cb); } function addOnPreMain(cb) { __ATMAIN__.unshift(cb); } function addOnExit(cb) { } function addOnPostRun(cb) { __ATPOSTRUN__.unshift(cb); } /** @param {number|boolean=} ignore */ function unSign(value, bits, ignore) { if (value >= 0) { return value; } return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts : Math.pow(2, bits) + value; } /** @param {number|boolean=} ignore */ function reSign(value, bits, ignore) { if (value <= 0) { return value; } var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32 : Math.pow(2, bits-1); if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors // TODO: In i64 mode 1, resign the two parts separately and safely value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts } return value; } // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc var Math_abs = Math.abs; var Math_cos = Math.cos; var Math_sin = Math.sin; var Math_tan = Math.tan; var Math_acos = Math.acos; var Math_asin = Math.asin; var Math_atan = Math.atan; var Math_atan2 = Math.atan2; var Math_exp = Math.exp; var Math_log = Math.log; var Math_sqrt = Math.sqrt; var Math_ceil = Math.ceil; var Math_floor = Math.floor; var Math_pow = Math.pow; var Math_imul = Math.imul; var Math_fround = Math.fround; var Math_round = Math.round; var Math_min = Math.min; var Math_max = Math.max; var Math_clz32 = Math.clz32; var Math_trunc = Math.trunc; // A counter of dependencies for calling run(). If we need to // do asynchronous work before running, increment this and // decrement it. Incrementing must happen in a place like // Module.preRun (used by emcc to add file preloading). // Note that you can add dependencies in preRun, even though // it happens right before run - run will be postponed until // the dependencies are met. var runDependencies = 0; var runDependencyWatcher = null; var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled function getUniqueRunDependency(id) { return id; } function addRunDependency(id) { runDependencies++; if (Module['monitorRunDependencies']) { Module['monitorRunDependencies'](runDependencies); } } function removeRunDependency(id) { runDependencies--; if (Module['monitorRunDependencies']) { Module['monitorRunDependencies'](runDependencies); } if (runDependencies == 0) { if (runDependencyWatcher !== null) { clearInterval(runDependencyWatcher); runDependencyWatcher = null; } if (dependenciesFulfilled) { var callback = dependenciesFulfilled; dependenciesFulfilled = null; callback(); // can add another dependenciesFulfilled } } } Module["preloadedImages"] = {}; // maps url to image data Module["preloadedAudios"] = {}; // maps url to audio data /** @param {string|number=} what */ function abort(what) { if (Module['onAbort']) { Module['onAbort'](what); } what += ''; out(what); err(what); ABORT = true; EXITSTATUS = 1; what = 'abort(' + what + '). Build with -s ASSERTIONS=1 for more info.'; // Throw a wasm runtime error, because a JS error might be seen as a foreign // exception, which means we'd run destructors on it. We need the error to // simply make the program stop. throw new WebAssembly.RuntimeError(what); } var memoryInitializer = null; function hasPrefix(str, prefix) { return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; } // Prefix of data URIs emitted by SINGLE_FILE and related options. var dataURIPrefix = 'data:application/octet-stream;base64,'; // Indicates whether filename is a base64 data URI. function isDataURI(filename) { return hasPrefix(filename, dataURIPrefix); } var fileURIPrefix = "file://"; // Indicates whether filename is delivered via file protocol (as opposed to http/https) function isFileURI(filename) { return hasPrefix(filename, fileURIPrefix); } var wasmBinaryFile = 'libflac.wasm'; if (!isDataURI(wasmBinaryFile)) { wasmBinaryFile = locateFile(wasmBinaryFile); } function getBinary() { try { if (wasmBinary) { return new Uint8Array(wasmBinary); } var binary = tryParseAsDataURI(wasmBinaryFile); if (binary) { return binary; } if (readBinary) { return readBinary(wasmBinaryFile); } else { throw "both async and sync fetching of the wasm failed"; } } catch (err) { abort(err); } } function getBinaryPromise() { // If we don't have the binary yet, and have the Fetch api, use that; // in some environments, like Electron's render process, Fetch api may be present, but have a different context than expected, let's only use it on the Web if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && typeof fetch === 'function' // Let's not use fetch to get objects over file:// as it's most likely Cordova which doesn't support fetch for file:// && !isFileURI(wasmBinaryFile) ) { return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { if (!response['ok']) { throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; } return response['arrayBuffer'](); }).catch(function () { return getBinary(); }); } // Otherwise, getBinary should be able to get it synchronously return new Promise(function(resolve, reject) { resolve(getBinary()); }); } // Create the wasm instance. // Receives the wasm imports, returns the exports. function createWasm() { // prepare imports var info = { 'env': asmLibraryArg, 'wasi_snapshot_preview1': asmLibraryArg }; // Load the wasm module and create an instance of using native support in the JS engine. // handle a generated wasm instance, receiving its exports and // performing other necessary setup /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { var exports = instance.exports; Module['asm'] = exports; removeRunDependency('wasm-instantiate'); } // we can't run yet (except in a pthread, where we have a custom sync instantiator) addRunDependency('wasm-instantiate'); function receiveInstantiatedSource(output) { // 'output' is a WebAssemblyInstantiatedSource object which has both the module and instance. // receiveInstance() will swap in the exports (to Module.asm) so they can be called // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. // When the regression is fixed, can restore the above USE_PTHREADS-enabled path. receiveInstance(output['instance']); } function instantiateArrayBuffer(receiver) { return getBinaryPromise().then(function(binary) { return WebAssembly.instantiate(binary, info); }).then(receiver, function(reason) { err('failed to asynchronously prepare wasm: ' + reason); abort(reason); }); } // Prefer streaming instantiation if available. function instantiateAsync() { if (!wasmBinary && typeof WebAssembly.instantiateStreaming === 'function' && !isDataURI(wasmBinaryFile) && // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. !isFileURI(wasmBinaryFile) && typeof fetch === 'function') { fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) { var result = WebAssembly.instantiateStreaming(response, info); return result.then(receiveInstantiatedSource, function(reason) { // We expect the most common failure cause to be a bad MIME type for the binary, // in which case falling back to ArrayBuffer instantiation should work. err('wasm streaming compile failed: ' + reason); err('falling back to ArrayBuffer instantiation'); return instantiateArrayBuffer(receiveInstantiatedSource); }); }); } else { return instantiateArrayBuffer(receiveInstantiatedSource); } } // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel // to any other async startup actions they are performing. if (Module['instantiateWasm']) { try { var exports = Module['instantiateWasm'](info, receiveInstance); return exports; } catch(e) { err('Module.instantiateWasm callback failed with error: ' + e); return false; } } instantiateAsync(); return {}; // no exports yet; we'll fill them in later } // Globals used by JS i64 conversions var tempDouble; var tempI64; // === Body === var ASM_CONSTS = { }; // STATICTOP = STATIC_BASE + 13312; /* global initializers */ __ATINIT__.push({ func: function() { ___wasm_call_ctors() } }); /* no memory initializer */ // {{PRE_LIBRARY}} function demangle(func) { return func; } function demangleAll(text) { var regex = /\b_Z[\w\d_]+/g; return text.replace(regex, function(x) { var y = demangle(x); return x === y ? x : (y + ' [' + x + ']'); }); } function jsStackTrace() { var err = new Error(); if (!err.stack) { // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown, // so try that as a special-case. try { throw new Error(); } catch(e) { err = e; } if (!err.stack) { return '(no stack trace available)'; } } return err.stack.toString(); } function stackTrace() { var js = jsStackTrace(); if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace'](); return demangleAll(js); } function _emscripten_get_sbrk_ptr() { return 14176; } function _emscripten_memcpy_big(dest, src, num) { HEAPU8.copyWithin(dest, src, src + num); } function _emscripten_get_heap_size() { return HEAPU8.length; } function emscripten_realloc_buffer(size) { try { // round size grow request up to wasm page size (fixed 64KB per spec) wasmMemory.grow((size - buffer.byteLength + 65535) >>> 16); // .grow() takes a delta compared to the previous size updateGlobalBufferAndViews(wasmMemory.buffer); return 1 /*success*/; } catch(e) { } }function _emscripten_resize_heap(requestedSize) { requestedSize = requestedSize >>> 0; var oldSize = _emscripten_get_heap_size(); // With pthreads, races can happen (another thread might increase the size in between), so return a failure, and let the caller retry. var PAGE_MULTIPLE = 65536; // Memory resize rules: // 1. When resizing, always produce a resized heap that is at least 16MB (to avoid tiny heap sizes receiving lots of repeated resizes at startup) // 2. Always increase heap size to at least the requested size, rounded up to next page multiple. // 3a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap geometrically: increase the heap size according to // MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), // At most overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB). // 3b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap linearly: increase the heap size by at least MEMORY_GROWTH_LINEAR_STEP bytes. // 4. Max size for the heap is capped at 2048MB-PAGE_MULTIPLE, or by MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest // 5. If we were unable to allocate as much memory, it may be due to over-eager decision to excessively reserve due to (3) above. // Hence if an allocation fails, cut down on the amount of excess growth, in an attempt to succeed to perform a smaller allocation. // A limit was set for how much we can grow. We should not exceed that // (the wasm binary specifies it, so if we tried, we'd fail anyhow). var maxHeapSize = 2147483648; if (requestedSize > maxHeapSize) { return false; } var minHeapSize = 16777216; // Loop through potential heap size increases. If we attempt a too eager reservation that fails, cut down on the // attempted size and reserve a smaller bump instead. (max 3 times, chosen somewhat arbitrarily) for(var cutDown = 1; cutDown <= 4; cutDown *= 2) { var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth // but limit overreserving (default to capping at +96MB overgrowth at most) overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 ); var newSize = Math.min(maxHeapSize, alignUp(Math.max(minHeapSize, requestedSize, overGrownHeapSize), PAGE_MULTIPLE)); var replacement = emscripten_realloc_buffer(newSize); if (replacement) { return true; } } return false; } var PATH={splitPath:function(filename) { var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; return splitPathRe.exec(filename).slice(1); },normalizeArray:function(parts, allowAboveRoot) { // if the path tries to go above the root, `up` ends up > 0 var up = 0; for (var i = parts.length - 1; i >= 0; i--) { var last = parts[i]; if (last === '.') { parts.splice(i, 1); } else if (last === '..') { parts.splice(i, 1); up++; } else if (up) { parts.splice(i, 1); up--; } } // if the path is allowed to go above the root, restore leading ..s if (allowAboveRoot) { for (; up; up--) { parts.unshift('..'); } } return parts; },normalize:function(path) { var isAbsolute = path.charAt(0) === '/', trailingSlash = path.substr(-1) === '/'; // Normalize the path path = PATH.normalizeArray(path.split('/').filter(function(p) { return !!p; }), !isAbsolute).join('/'); if (!path && !isAbsolute) { path = '.'; } if (path && trailingSlash) { path += '/'; } return (isAbsolute ? '/' : '') + path; },dirname:function(path) { var result = PATH.splitPath(path), root = result[0], dir = result[1]; if (!root && !dir) { // No dirname whatsoever return '.'; } if (dir) { // It has a dirname, strip trailing slash dir = dir.substr(0, dir.length - 1); } return root + dir; },basename:function(path) { // EMSCRIPTEN return '/'' for '/', not an empty string if (path === '/') return '/'; var lastSlash = path.lastIndexOf('/'); if (lastSlash === -1) return path; return path.substr(lastSlash+1); },extname:function(path) { return PATH.splitPath(path)[3]; },join:function() { var paths = Array.prototype.slice.call(arguments, 0); return PATH.normalize(paths.join('/')); },join2:function(l, r) { return PATH.normalize(l + '/' + r); }}; function setErrNo(value) { HEAP32[((___errno_location())>>2)]=value; return value; } var PATH_FS={resolve:function() { var resolvedPath = '', resolvedAbsolute = false; for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { var path = (i >= 0) ? arguments[i] : FS.cwd(); // Skip empty and invalid entries if (typeof path !== 'string') { throw new TypeError('Arguments to path.resolve must be strings'); } else if (!path) { return ''; // an invalid portion invalidates the whole thing } resolvedPath = path + '/' + resolvedPath; resolvedAbsolute = path.charAt(0) === '/'; } // At this point the path should be resolved to a full absolute path, but // handle relative paths to be safe (might happen when process.cwd() fails) resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) { return !!p; }), !resolvedAbsolute).join('/'); return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; },relative:function(from, to) { from = PATH_FS.resolve(from).substr(1); to = PATH_FS.resolve(to).substr(1); function trim(arr) { var start = 0; for (; start < arr.length; start++) { if (arr[start] !== '') break; } var end = arr.length - 1; for (; end >= 0; end--) { if (arr[end] !== '') break; } if (start > end) return []; return arr.slice(start, end - start + 1); } var fromParts = trim(from.split('/')); var toParts = trim(to.split('/')); var length = Math.min(fromParts.length, toParts.length); var samePartsLength = length; for (var i = 0; i < length; i++) { if (fromParts[i] !== toParts[i]) { samePartsLength = i; break; } } var outputParts = []; for (var i = samePartsLength; i < fromParts.length; i++) { outputParts.push('..'); } outputParts = outputParts.concat(toParts.slice(samePartsLength)); return outputParts.join('/'); }}; var TTY={ttys:[],init:function () { // https://github.com/emscripten-core/emscripten/pull/1555 // if (ENVIRONMENT_IS_NODE) { // // currently, FS.init does not distinguish if process.stdin is a file or TTY // // device, it always assumes it's a TTY device. because of this, we're forcing // // process.stdin to UTF8 encoding to at least make stdin reading compatible // // with text files until FS.init can be refactored. // process['stdin']['setEncoding']('utf8'); // } },shutdown:function() { // https://github.com/emscripten-core/emscripten/pull/1555 // if (ENVIRONMENT_IS_NODE) { // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call // process['stdin']['pause'](); // } },register:function(dev, ops) { TTY.ttys[dev] = { input: [], output: [], ops: ops }; FS.registerDevice(dev, TTY.stream_ops); },stream_ops:{open:function(stream) { var tty = TTY.ttys[stream.node.rdev]; if (!tty) { throw new FS.ErrnoError(43); } stream.tty = tty; stream.seekable = false; },close:function(stream) { // flush any pending line data stream.tty.ops.flush(stream.tty); },flush:function(stream) { stream.tty.ops.flush(stream.tty); },read:function(stream, buffer, offset, length, pos /* ignored */) { if (!stream.tty || !stream.tty.ops.get_char) { throw new FS.ErrnoError(60); } var bytesRead = 0; for (var i = 0; i < length; i++) { var result; try { result = stream.tty.ops.get_char(stream.tty); } catch (e) { throw new FS.ErrnoError(29); } if (result === undefined && bytesRead === 0) { throw new FS.ErrnoError(6); } if (result === null || result === undefined) break; bytesRead++; buffer[offset+i] = result; } if (bytesRead) { stream.node.timestamp = Date.now(); } return bytesRead; },write:function(stream, buffer, offset, length, pos) { if (!stream.tty || !stream.tty.ops.put_char) { throw new FS.ErrnoError(60); } try { for (var i = 0; i < length; i++) { stream.tty.ops.put_char(stream.tty, buffer[offset+i]); } } catch (e) { throw new FS.ErrnoError(29); } if (length) { stream.node.timestamp = Date.now(); } return i; }},default_tty_ops:{get_char:function(tty) { if (!tty.input.length) { var result = null; if (ENVIRONMENT_IS_NODE) { // we will read data by chunks of BUFSIZE var BUFSIZE = 256; var buf = Buffer.alloc ? Buffer.alloc(BUFSIZE) : new Buffer(BUFSIZE); var bytesRead = 0; try { bytesRead = nodeFS.readSync(process.stdin.fd, buf, 0, BUFSIZE, null); } catch(e) { // Cross-platform differences: on Windows, reading EOF throws an exception, but on other OSes, // reading EOF returns 0. Uniformize behavior by treating the EOF exception to return 0. if (e.toString().indexOf('EOF') != -1) bytesRead = 0; else throw e; } if (bytesRead > 0) { result = buf.slice(0, bytesRead).toString('utf-8'); } else { result = null; } } else if (typeof window != 'undefined' && typeof window.prompt == 'function') { // Browser. result = window.prompt('Input: '); // returns null on cancel if (result !== null) { result += '\n'; } } else if (typeof readline == 'function') { // Command line. result = readline(); if (result !== null) { result += '\n'; } } if (!result) { return null; } tty.input = intArrayFromString(result, true); } return tty.input.shift(); },put_char:function(tty, val) { if (val === null || val === 10) { out(UTF8ArrayToString(tty.output, 0)); tty.output = []; } else { if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. } },flush:function(tty) { if (tty.output && tty.output.length > 0) { out(UTF8ArrayToString(tty.output, 0)); tty.output = []; } }},default_tty1_ops:{put_char:function(tty, val) { if (val === null || val === 10) { err(UTF8ArrayToString(tty.output, 0)); tty.output = []; } else { if (val != 0) tty.output.push(val); } },flush:function(tty) { if (tty.output && tty.output.length > 0) { err(UTF8ArrayToString(tty.output, 0)); tty.output = []; } }}}; var MEMFS={ops_table:null,mount:function(mount) { return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); },createNode:function(parent, name, mode, dev) { if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { // no supported throw new FS.ErrnoError(63); } if (!MEMFS.ops_table) { MEMFS.ops_table = { dir: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, lookup: MEMFS.node_ops.lookup, mknod: MEMFS.node_ops.mknod, rename: MEMFS.node_ops.rename, unlink: MEMFS.node_ops.unlink, rmdir: MEMFS.node_ops.rmdir, readdir: MEMFS.node_ops.readdir, symlink: MEMFS.node_ops.symlink }, stream: { llseek: MEMFS.stream_ops.llseek } }, file: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr }, stream: { llseek: MEMFS.stream_ops.llseek, read: MEMFS.stream_ops.read, write: MEMFS.stream_ops.write, allocate: MEMFS.stream_ops.allocate, mmap: MEMFS.stream_ops.mmap, msync: MEMFS.stream_ops.msync } }, link: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, readlink: MEMFS.node_ops.readlink }, stream: {} }, chrdev: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr }, stream: FS.chrdev_stream_ops } }; } var node = FS.createNode(parent, name, mode, dev); if (FS.isDir(node.mode)) { node.node_ops = MEMFS.ops_table.dir.node; node.stream_ops = MEMFS.ops_table.dir.stream; node.contents = {}; } else if (FS.isFile(node.mode)) { node.node_ops = MEMFS.ops_table.file.node; node.stream_ops = MEMFS.ops_table.file.stream; node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. node.contents = null; } else if (FS.isLink(node.mode)) { node.node_ops = MEMFS.ops_table.link.node; node.stream_ops = MEMFS.ops_table.link.stream; } else if (FS.isChrdev(node.mode)) { node.node_ops = MEMFS.ops_table.chrdev.node; node.stream_ops = MEMFS.ops_table.chrdev.stream; } node.timestamp = Date.now(); // add the new node to the parent if (parent) { parent.contents[name] = node; } return node; },getFileDataAsRegularArray:function(node) { if (node.contents && node.contents.subarray) { var arr = []; for (var i = 0; i < node.usedBytes; ++i) arr.push(node.contents[i]); return arr; // Returns a copy of the original data. } return node.contents; // No-op, the file contents are already in a JS array. Return as-is. },getFileDataAsTypedArray:function(node) { if (!node.contents) return new Uint8Array(0); if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. return new Uint8Array(node.contents); },expandFileStorage:function(node, newCapacity) { var prevCapacity = node.contents ? node.contents.length : 0; if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to // avoid overshooting the allocation cap by a very large margin. var CAPACITY_DOUBLING_MAX = 1024 * 1024; newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) >>> 0); if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. var oldContents = node.contents; node.contents = new Uint8Array(newCapacity); // Allocate new storage. if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. return; },resizeFileStorage:function(node, newSize) { if (node.usedBytes == newSize) return; if (newSize == 0) { node.contents = null; // Fully decommit when requesting a resize to zero. node.usedBytes = 0; return; } if (!node.contents || node.contents.subarray) { // Resize a typed array if that is being used as the backing store. var oldContents = node.contents; node.contents = new Uint8Array(newSize); // Allocate new storage. if (oldContents) { node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. } node.usedBytes = newSize; return; } // Backing with a JS array. if (!node.contents) node.contents = []; if (node.contents.length > newSize) node.contents.length = newSize; else while (node.contents.length < newSize) node.contents.push(0); node.usedBytes = newSize; },node_ops:{getattr:function(node) { var attr = {}; // device numbers reuse inode numbers. attr.dev = FS.isChrdev(node.mode) ? node.id : 1; attr.ino = node.id; attr.mode = node.mode; attr.nlink = 1; attr.uid = 0; attr.gid = 0; attr.rdev = node.rdev; if (FS.isDir(node.mode)) { attr.size = 4096; } else if (FS.isFile(node.mode)) { attr.size = node.usedBytes; } else if (FS.isLink(node.mode)) { attr.size = node.link.length; } else { attr.size = 0; } attr.atime = new Date(node.timestamp); attr.mtime = new Date(node.timestamp); attr.ctime = new Date(node.timestamp); // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), // but this is not required by the standard. attr.blksize = 4096; attr.blocks = Math.ceil(attr.size / attr.blksize); return attr; },setattr:function(node, attr) { if (attr.mode !== undefined) { node.mode = attr.mode; } if (attr.timestamp !== undefined) { node.timestamp = attr.timestamp; } if (attr.size !== undefined) { MEMFS.resizeFileStorage(node, attr.size); } },lookup:function(parent, name) { throw FS.genericErrors[44]; },mknod:function(parent, name, mode, dev) { return MEMFS.createNode(parent, name, mode, dev); },rename:function(old_node, new_dir, new_name) { // if we're overwriting a directory at new_name, make sure it's empty. if (FS.isDir(old_node.mode)) { var new_node; try { new_node = FS.lookupNode(new_dir, new_name); } catch (e) { } if (new_node) { for (var i in new_node.contents) { throw new FS.ErrnoError(55); } } } // do the internal rewiring delete old_node.parent.contents[old_node.name]; old_node.name = new_name; new_dir.contents[new_name] = old_node; old_node.parent = new_dir; },unlink:function(parent, name) { delete parent.contents[name]; },rmdir:function(parent, name) { var node = FS.lookupNode(parent, name); for (var i in node.contents) { throw new FS.ErrnoError(55); } delete parent.contents[name]; },readdir:function(node) { var entries = ['.', '..']; for (var key in node.contents) { if (!node.contents.hasOwnProperty(key)) { continue; } entries.push(key); } return entries; },symlink:function(parent, newname, oldpath) { var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); node.link = oldpath; return node; },readlink:function(node) { if (!FS.isLink(node.mode)) { throw new FS.ErrnoError(28); } return node.link; }},stream_ops:{read:function(stream, buffer, offset, length, position) { var contents = stream.node.contents; if (position >= stream.node.usedBytes) return 0; var size = Math.min(stream.node.usedBytes - position, length); if (size > 8 && contents.subarray) { // non-trivial, and typed array buffer.set(contents.subarray(position, position + size), offset); } else { for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; } return size; },write:function(stream, buffer, offset, length, position, canOwn) { // If the buffer is located in main memory (HEAP), and if // memory can grow, we can't hold on to references of the // memory buffer, as they may get invalidated. That means we // need to do copy its contents. if (buffer.buffer === HEAP8.buffer) { canOwn = false; } if (!length) return 0; var node = stream.node; node.timestamp = Date.now(); if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? if (canOwn) { node.contents = buffer.subarray(offset, offset + length); node.usedBytes = length; return length; } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. node.contents = buffer.slice(offset, offset + length); node.usedBytes = length; return length; } else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file? node.contents.set(buffer.subarray(offset, offset + length), position); return length; } } // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. MEMFS.expandFileStorage(node, position+length); if (node.contents.subarray && buffer.subarray) node.contents.set(buffer.subarray(offset, offset + length), position); // Use typed array write if available. else { for (var i = 0; i < length; i++) { node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. } } node.usedBytes = Math.max(node.usedBytes, position + length); return length; },llseek:function(stream, offset, whence) { var position = offset; if (whence === 1) { position += stream.position; } else if (whence === 2) { if (FS.isFile(stream.node.mode)) { position += stream.node.usedBytes; } } if (position < 0) { throw new FS.ErrnoError(28); } return position; },allocate:function(stream, offset, length) { MEMFS.expandFileStorage(stream.node, offset + length); stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); },mmap:function(stream, address, length, position, prot, flags) { // We don't currently support location hints for the address of the mapping assert(address === 0); if (!FS.isFile(stream.node.mode)) { throw new FS.ErrnoError(43); } var ptr; var allocated; var contents = stream.node.contents; // Only make a new copy when MAP_PRIVATE is specified. if (!(flags & 2) && contents.buffer === buffer) { // We can't emulate MAP_SHARED when the file is not backed by the buffer // we're mapping to (e.g. the HEAP buffer). allocated = false; ptr = contents.byteOffset; } else { // Try to avoid unnecessary slices. if (position > 0 || position + length < contents.length) { if (contents.subarray) { contents = contents.subarray(position, position + length); } else { contents = Array.prototype.slice.call(contents, position, position + length); } } allocated = true; ptr = _malloc(length); if (!ptr) { throw new FS.ErrnoError(48); } HEAP8.set(contents, ptr); } return { ptr: ptr, allocated: allocated }; },msync:function(stream, buffer, offset, length, mmapFlags) { if (!FS.isFile(stream.node.mode)) { throw new FS.ErrnoError(43); } if (mmapFlags & 2) { // MAP_PRIVATE calls need not to be synced back to underlying fs return 0; } var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); // should we check if bytesWritten and length are the same? return 0; }}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:function(e) { if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace(); return setErrNo(e.errno); },lookupPath:function(path, opts) { path = PATH_FS.resolve(FS.cwd(), path); opts = opts || {}; if (!path) return { path: '', node: null }; var defaults = { follow_mount: true, recurse_count: 0 }; for (var key in defaults) { if (opts[key] === undefined) { opts[key] = defaults[key]; } } if (opts.recurse_count > 8) { // max recursive lookup of 8 throw new FS.ErrnoError(32); } // split the path var parts = PATH.normalizeArray(path.split('/').filter(function(p) { return !!p; }), false); // start at the root var current = FS.root; var current_path = '/'; for (var i = 0; i < parts.length; i++) { var islast = (i === parts.length-1); if (islast && opts.parent) { // stop resolving break; } current = FS.lookupNode(current, parts[i]); current_path = PATH.join2(current_path, parts[i]); // jump to the mount's root node if this is a mountpoint if (FS.isMountpoint(current)) { if (!islast || (islast && opts.follow_mount)) { current = current.mounted.root; } } // by default, lookupPath will not follow a symlink if it is the final path component. // setting opts.follow = true will override this behavior. if (!islast || opts.follow) { var count = 0; while (FS.isLink(current.mode)) { var link = FS.readlink(current_path); current_path = PATH_FS.resolve(PATH.dirname(current_path), link); var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); current = lookup.node; if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). throw new FS.ErrnoError(32); } } } } return { path: current_path, node: current }; },getPath:function(node) { var path; while (true) { if (FS.isRoot(node)) { var mount = node.mount.mountpoint; if (!path) return mount; return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path; } path = path ? node.name + '/' + path : node.name; node = node.parent; } },hashName:function(parentid, name) { var hash = 0; for (var i = 0; i < name.length; i++) { hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; } return ((parentid + hash) >>> 0) % FS.nameTable.length; },hashAddNode:function(node) { var hash = FS.hashName(node.parent.id, node.name); node.name_next = FS.nameTable[hash]; FS.nameTable[hash] = node; },hashRemoveNode:function(node) { var hash = FS.hashName(node.parent.id, node.name); if (FS.nameTable[hash] === node) { FS.nameTable[hash] = node.name_next; } else { var current = FS.nameTable[hash]; while (current) { if (current.name_next === node) { current.name_next = node.name_next; break; } current = current.name_next; } } },lookupNode:function(parent, name) { var errCode = FS.mayLookup(parent); if (errCode) { throw new FS.ErrnoError(errCode, parent); } var hash = FS.hashName(parent.id, name); for (var node = FS.nameTable[hash]; node; node = node.name_next) { var nodeName = node.name; if (node.parent.id === parent.id && nodeName === name) { return node; } } // if we failed to find it in the cache, call into the VFS return FS.lookup(parent, name); },createNode:function(parent, name, mode, rdev) { var node = new FS.FSNode(parent, name, mode, rdev); FS.hashAddNode(node); return node; },destroyNode:function(node) { FS.hashRemoveNode(node); },isRoot:function(node) { return node === node.parent; },isMountpoint:function(node) { return !!node.mounted; },isFile:function(mode) { return (mode & 61440) === 32768; },isDir:function(mode) { return (mode & 61440) === 16384; },isLink:function(mode) { return (mode & 61440) === 40960; },isChrdev:function(mode) { return (mode & 61440) === 8192; },isBlkdev:function(mode) { return (mode & 61440) === 24576; },isFIFO:function(mode) { return (mode & 61440) === 4096; },isSocket:function(mode) { return (mode & 49152) === 49152; },flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function(str) { var flags = FS.flagModes[str]; if (typeof flags === 'undefined') { throw new Error('Unknown file open mode: ' + str); } return flags; },flagsToPermissionString:function(flag) { var perms = ['r', 'w', 'rw'][flag & 3]; if ((flag & 512)) { perms += 'w'; } return perms; },nodePermissions:function(node, perms) { if (FS.ignorePermissions) { return 0; } // return 0 if any user, group or owner bits are set. if (perms.indexOf('r') !== -1 && !(node.mode & 292)) { return 2; } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) { return 2; } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) { return 2; } return 0; },mayLookup:function(dir) { var errCode = FS.nodePermissions(dir, 'x'); if (errCode) return errCode; if (!dir.node_ops.lookup) return 2; return 0; },mayCreate:function(dir, name) { try { var node = FS.lookupNode(dir, name); return 20; } catch (e) { } return FS.nodePermissions(dir, 'wx'); },mayDelete:function(dir, name, isdir) { var node; try { node = FS.lookupNode(dir, name); } catch (e) { return e.errno; } var errCode = FS.nodePermissions(dir, 'wx'); if (errCode) { return errCode; } if (isdir) { if (!FS.isDir(node.mode)) { return 54; } if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { return 10; } } else { if (FS.isDir(node.mode)) { return 31; } } return 0; },mayOpen:function(node, flags) { if (!node) { return 44; } if (FS.isLink(node.mode)) { return 32; } else if (FS.isDir(node.mode)) { if (FS.flagsToPermissionString(flags) !== 'r' || // opening for write (flags & 512)) { // TODO: check for O_SEARCH? (== search for dir only) return 31; } } return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); },MAX_OPEN_FDS:4096,nextfd:function(fd_start, fd_end) { fd_start = fd_start || 0; fd_end = fd_end || FS.MAX_OPEN_FDS; for (var fd = fd_start; fd <= fd_end; fd++) { if (!FS.streams[fd]) { return fd; } } throw new FS.ErrnoError(33); },getStream:function(fd) { return FS.streams[fd]; },createStream:function(stream, fd_start, fd_end) { if (!FS.FSStream) { FS.FSStream = /** @constructor */ function(){}; FS.FSStream.prototype = { object: { get: function() { return this.node; }, set: function(val) { this.node = val; } }, isRead: { get: function() { return (this.flags & 2097155) !== 1; } }, isWrite: { get: function() { return (this.flags & 2097155) !== 0; } }, isAppend: { get: function() { return (this.flags & 1024); } } }; } // clone it, so we can return an instance of FSStream var newStream = new FS.FSStream(); for (var p in stream) { newStream[p] = stream[p]; } stream = newStream; var fd = FS.nextfd(fd_start, fd_end); stream.fd = fd; FS.streams[fd] = stream; return stream; },closeStream:function(fd) { FS.streams[fd] = null; },chrdev_stream_ops:{open:function(stream) { var device = FS.getDevice(stream.node.rdev); // override node's stream ops with the device's stream.stream_ops = device.stream_ops; // forward the open call if (stream.stream_ops.open) { stream.stream_ops.open(stream); } },llseek:function() { throw new FS.ErrnoError(70); }},major:function(dev) { return ((dev) >> 8); },minor:function(dev) { return ((dev) & 0xff); },makedev:function(ma, mi) { return ((ma) << 8 | (mi)); },registerDevice:function(dev, ops) { FS.devices[dev] = { stream_ops: ops }; },getDevice:function(dev) { return FS.devices[dev]; },getMounts:function(mount) { var mounts = []; var check = [mount]; while (check.length) { var m = check.pop(); mounts.push(m); check.push.apply(check, m.mounts); } return mounts; },syncfs:function(populate, callback) { if (typeof(populate) === 'function') { callback = populate; populate = false; } FS.syncFSRequests++; if (FS.syncFSRequests > 1) { err('warning: ' + FS.syncFSRequests + ' FS.syncfs operations in flight at once, probably just doing extra work'); } var mounts = FS.getMounts(FS.root.mount); var completed = 0; function doCallback(errCode) { FS.syncFSRequests--; return callback(errCode); } function done(errCode) { if (errCode) { if (!done.errored) { done.errored = true; return doCallback(errCode); } return; } if (++completed >= mounts.length) { doCallback(null); } }; // sync all mounts mounts.forEach(function (mount) { if (!mount.type.syncfs) { return done(null); } mount.type.syncfs(mount, populate, done); }); },mount:function(type, opts, mountpoint) { var root = mountpoint === '/'; var pseudo = !mountpoint; var node; if (root && FS.root) { throw new FS.ErrnoError(10); } else if (!root && !pseudo) { var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); mountpoint = lookup.path; // use the absolute path node = lookup.node; if (FS.isMountpoint(node)) { throw new FS.ErrnoError(10); } if (!FS.isDir(node.mode)) { throw new FS.ErrnoError(54); } } var mount = { type: type, opts: opts, mountpoint: mountpoint, mounts: [] }; // create a root node for the fs var mountRoot = type.mount(mount); mountRoot.mount = mount; mount.root = mountRoot; if (root) { FS.root = mountRoot; } else if (node) { // set as a mountpoint node.mounted = mount; // add the new mount to the current mount's children if (node.mount) { node.mount.mounts.push(mount); } } return mountRoot; },unmount:function (mountpoint) { var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); if (!FS.isMountpoint(lookup.node)) { throw new FS.ErrnoError(28); } // destroy the nodes for this mount, and all its child mounts var node = lookup.node; var mount = node.mounted; var mounts = FS.getMounts(mount); Object.keys(FS.nameTable).forEach(function (hash) { var current = FS.nameTable[hash]; while (current) { var next = current.name_next; if (mounts.indexOf(current.mount) !== -1) { FS.destroyNode(current); } current = next; } }); // no longer a mountpoint node.mounted = null; // remove this mount from the child mounts var idx = node.mount.mounts.indexOf(mount); node.mount.mounts.splice(idx, 1); },lookup:function(parent, name) { return parent.node_ops.lookup(parent, name); },mknod:function(path, mode, dev) { var lookup = FS.lookupPath(path, { parent: true }); var parent = lookup.node; var name = PATH.basename(path); if (!name || name === '.' || name === '..') { throw new FS.ErrnoError(28); } var errCode = FS.mayCreate(parent, name); if (errCode) { throw new FS.ErrnoError(errCode); } if (!parent.node_ops.mknod) { throw new FS.ErrnoError(63); } return parent.node_ops.mknod(parent, name, mode, dev); },create:function(path, mode) { mode = mode !== undefined ? mode : 438 /* 0666 */; mode &= 4095; mode |= 32768; return FS.mknod(path, mode, 0); },mkdir:function(path, mode) { mode = mode !== undefined ? mode : 511 /* 0777 */; mode &= 511 | 512; mode |= 16384; return FS.mknod(path, mode, 0); },mkdirTree:function(path, mode) { var dirs = path.split('/'); var d = ''; for (var i = 0; i < dirs.length; ++i) { if (!dirs[i]) continue; d += '/' + dirs[i]; try { FS.mkdir(d, mode); } catch(e) { if (e.errno != 20) throw e; } } },mkdev:function(path, mode, dev) { if (typeof(dev) === 'undefined') { dev = mode; mode = 438 /* 0666 */; } mode |= 8192; return FS.mknod(path, mode, dev); },symlink:function(oldpath, newpath) { if (!PATH_FS.resolve(oldpath)) { throw new FS.ErrnoError(44); } var lookup = FS.lookupPath(newpath, { parent: true }); var parent = lookup.node; if (!parent) { throw new FS.ErrnoError(44); } var newname = PATH.basename(newpath); var errCode = FS.mayCreate(parent, newname); if (errCode) { throw new FS.ErrnoError(errCode); } if (!parent.node_ops.symlink) { throw new FS.ErrnoError(63); } return parent.node_ops.symlink(parent, newname, oldpath); },rename:function(old_path, new_path) { var old_dirname = PATH.dirname(old_path); var new_dirname = PATH.dirname(new_path); var old_name = PATH.basename(old_path); var new_name = PATH.basename(new_path); // parents must exist var lookup, old_dir, new_dir; try { lookup = FS.lookupPath(old_path, { parent: true }); old_dir = lookup.node; lookup = FS.lookupPath(new_path, { parent: true }); new_dir = lookup.node; } catch (e) { throw new FS.ErrnoError(10); } if (!old_dir || !new_dir) throw new FS.ErrnoError(44); // need to be part of the same mount if (old_dir.mount !== new_dir.mount) { throw new FS.ErrnoError(75); } // source must exist var old_node = FS.lookupNode(old_dir, old_name); // old path should not be an ancestor of the new path var relative = PATH_FS.relative(old_path, new_dirname); if (relative.charAt(0) !== '.') { throw new FS.ErrnoError(28); } // new path should not be an ancestor of the old path relative = PATH_FS.relative(new_path, old_dirname); if (relative.charAt(0) !== '.') { throw new FS.ErrnoError(55); } // see if the new path already exists var new_node; try { new_node = FS.lookupNode(new_dir, new_name); } catch (e) { // not fatal } // early out if nothing needs to change if (old_node === new_node) { return; } // we'll need to delete the old entry var isdir = FS.isDir(old_node.mode); var errCode = FS.mayDelete(old_dir, old_name, isdir); if (errCode) { throw new FS.ErrnoError(errCode); } // need delete permissions if we'll be overwriting. // need create permissions if new doesn't already exist. errCode = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name); if (errCode) { throw new FS.ErrnoError(errCode); } if (!old_dir.node_ops.rename) { throw new FS.ErrnoError(63); } if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { throw new FS.ErrnoError(10); } // if we are going to change the parent, check write permissions if (new_dir !== old_dir) { errCode = FS.nodePermissions(old_dir, 'w'); if (errCode) { throw new FS.ErrnoError(errCode); } } try { if (FS.trackingDelegate['willMovePath']) { FS.trackingDelegate['willMovePath'](old_path, new_path); } } catch(e) { err("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message); } // remove the node from the lookup hash FS.hashRemoveNode(old_node); // do the underlying fs rename try { old_dir.node_ops.rename(old_node, new_dir, new_name); } catch (e) { throw e; } finally { // add the node back to the hash (in case node_ops.rename // changed its name) FS.hashAddNode(old_node); } try { if (FS.trackingDelegate['onMovePath']) FS.trackingDelegate['onMovePath'](old_path, new_path); } catch(e) { err("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message); } },rmdir:function(path) { var lookup = FS.lookupPath(path, { parent: true }); var parent = lookup.node; var name = PATH.basename(path); var node = FS.lookupNode(parent, name); var errCode = FS.mayDelete(parent, name, true); if (errCode) { throw new FS.ErrnoError(errCode); } if (!parent.node_ops.rmdir) { throw new FS.ErrnoError(63); } if (FS.isMountpoint(node)) { throw new FS.ErrnoError(10); } try { if (FS.trackingDelegate['willDeletePath']) { FS.trackingDelegate['willDeletePath'](path); } } catch(e) { err("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message); } parent.node_ops.rmdir(parent, name); FS.destroyNode(node); try { if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path); } catch(e) { err("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message); } },readdir:function(path) { var lookup = FS.lookupPath(path, { follow: true }); var node = lookup.node; if (!node.node_ops.readdir) { throw new FS.ErrnoError(54); } return node.node_ops.readdir(node); },unlink:function(path) { var lookup = FS.lookupPath(path, { parent: true }); var parent = lookup.node; var name = PATH.basename(path); var node = FS.lookupNode(parent, name); var errCode = FS.mayDelete(parent, name, false); if (errCode) { // According to POSIX, we should map EISDIR to EPERM, but // we instead do what Linux does (and we must, as we use // the musl linux libc). throw new FS.ErrnoError(errCode); } if (!parent.node_ops.unlink) { throw new FS.ErrnoError(63); } if (FS.isMountpoint(node)) { throw new FS.ErrnoError(10); } try { if (FS.trackingDelegate['willDeletePath']) { FS.trackingDelegate['willDeletePath'](path); } } catch(e) { err("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message); } parent.node_ops.unlink(parent, name); FS.destroyNode(node); try { if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path); } catch(e) { err("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message); } },readlink:function(path) { var lookup = FS.lookupPath(path); var link = lookup.node; if (!link) { throw new FS.ErrnoError(44); } if (!link.node_ops.readlink) { throw new FS.ErrnoError(28); } return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); },stat:function(path, dontFollow) { var lookup = FS.lookupPath(path, { follow: !dontFollow }); var node = lookup.node; if (!node) { throw new FS.ErrnoError(44); } if (!node.node_ops.getattr) { throw new FS.ErrnoError(63); } return node.node_ops.getattr(node); },lstat:function(path) { return FS.stat(path, true); },chmod:function(path, mode, dontFollow) { var node; if (typeof path === 'string') { var lookup = FS.lookupPath(path, { follow: !dontFollow }); node = lookup.node; } else { node = path; } if (!node.node_ops.setattr) { throw new FS.ErrnoError(63); } node.node_ops.setattr(node, { mode: (mode & 4095) | (node.mode & ~4095), timestamp: Date.now() }); },lchmod:function(path, mode) { FS.chmod(path, mode, true); },fchmod:function(fd, mode) { var stream = FS.getStream(fd); if (!stream) { throw new FS.ErrnoError(8); } FS.chmod(stream.node, mode); },chown:function(path, uid, gid, dontFollow) { var node; if (typeof path === 'string') { var lookup = FS.lookupPath(path, { follow: !dontFollow }); node = lookup.node; } else { node = path; } if (!node.node_ops.setattr) { throw new FS.ErrnoError(63); } node.node_ops.setattr(node, { timestamp: Date.now() // we ignore the uid / gid for now }); },lchown:function(path, uid, gid) { FS.chown(path, uid, gid, true); },fchown:function(fd, uid, gid) { var stream = FS.getStream(fd); if (!stream) { throw new FS.ErrnoError(8); } FS.chown(stream.node, uid, gid); },truncate:function(path, len) { if (len < 0) { throw new FS.ErrnoError(28); } var node; if (typeof path === 'string') { var lookup = FS.lookupPath(path, { follow: true }); node = lookup.node; } else { node = path; } if (!node.node_ops.setattr) { throw new FS.ErrnoError(63); } if (FS.isDir(node.mode)) { throw new FS.ErrnoError(31); } if (!FS.isFile(node.mode)) { throw new FS.ErrnoError(28); } var errCode = FS.nodePermissions(node, 'w'); if (errCode) { throw new FS.ErrnoError(errCode); } node.node_ops.setattr(node, { size: len, timestamp: Date.now() }); },ftruncate:function(fd, len) { var stream = FS.getStream(fd); if (!stream) { throw new FS.ErrnoError(8); } if ((stream.flags & 2097155) === 0) { throw new FS.ErrnoError(28); } FS.truncate(stream.node, len); },utime:function(path, atime, mtime) { var lookup = FS.lookupPath(path, { follow: true }); var node = lookup.node; node.node_ops.setattr(node, { timestamp: Math.max(atime, mtime) }); },open:function(path, flags, mode, fd_start, fd_end) { if (path === "") { throw new FS.ErrnoError(44); } flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags; mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode; if ((flags & 64)) { mode = (mode & 4095) | 32768; } else { mode = 0; } var node; if (typeof path === 'object') { node = path; } else { path = PATH.normalize(path); try { var lookup = FS.lookupPath(path, { follow: !(flags & 131072) }); node = lookup.node; } catch (e) { // ignore } } // perhaps we need to create the node var created = false; if ((flags & 64)) { if (node) { // if O_CREAT and O_EXCL are set, error out if the node already exists if ((flags & 128)) { throw new FS.ErrnoError(20); } } else { // node doesn't exist, try to create it node = FS.mknod(path, mode, 0); created = true; } } if (!node) { throw new FS.ErrnoError(44); } // can't truncate a device if (FS.isChrdev(node.mode)) { flags &= ~512; } // if asked only for a directory, then this must be one if ((flags & 65536) && !FS.isDir(node.mode)) { throw new FS.ErrnoError(54); } // check permissions, if this is not a file we just created now (it is ok to // create and write to a file with read-only permissions; it is read-only // for later use) if (!created) { var errCode = FS.mayOpen(node, flags); if (errCode) { throw new FS.ErrnoError(errCode); } } // do truncation if necessary if ((flags & 512)) { FS.truncate(node, 0); } // we've already handled these, don't pass down to the underlying vfs flags &= ~(128 | 512 | 131072); // register the stream with the filesystem var stream = FS.createStream({ node: node, path: FS.getPath(node), // we want the absolute path to the node flags: flags, seekable: true, position: 0, stream_ops: node.stream_ops, // used by the file family libc calls (fopen, fwrite, ferror, etc.) ungotten: [], error: false }, fd_start, fd_end); // call the new stream's open function if (stream.stream_ops.open) { stream.stream_ops.open(stream); } if (Module['logReadFiles'] && !(flags & 1)) { if (!FS.readFiles) FS.readFiles = {}; if (!(path in FS.readFiles)) { FS.readFiles[path] = 1; err("FS.trackingDelegate error on read file: " + path); } } try { if (FS.trackingDelegate['onOpenFile']) { var trackingFlags = 0; if ((flags & 2097155) !== 1) { trackingFlags |= FS.tracking.openFlags.READ; } if ((flags & 2097155) !== 0) { trackingFlags |= FS.tracking.openFlags.WRITE; } FS.trackingDelegate['onOpenFile'](path, trackingFlags); } } catch(e) { err("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: " + e.message); } return stream; },close:function(stream) { if (FS.isClosed(stream)) { throw new FS.ErrnoError(8); } if (stream.getdents) stream.getdents = null; // free readdir state try { if (stream.stream_ops.close) { stream.stream_ops.close(stream); } } catch (e) { throw e; } finally { FS.closeStream(stream.fd); } stream.fd = null; },isClosed:function(stream) { return stream.fd === null; },llseek:function(stream, offset, whence) { if (FS.isClosed(stream)) { throw new FS.ErrnoError(8); } if (!stream.seekable || !stream.stream_ops.llseek) { throw new FS.ErrnoError(70); } if (whence != 0 && whence != 1 && whence != 2) { throw new FS.ErrnoError(28); } stream.position = stream.stream_ops.llseek(stream, offset, whence); stream.ungotten = []; return stream.position; },read:function(stream, buffer, offset, length, position) { if (length < 0 || position < 0) { throw new FS.ErrnoError(28); } if (FS.isClosed(stream)) { throw new FS.ErrnoError(8); } if ((stream.flags & 2097155) === 1) { throw new FS.ErrnoError(8); } if (FS.isDir(stream.node.mode)) { throw new FS.ErrnoError(31); } if (!stream.stream_ops.read) { throw new FS.ErrnoError(28); } var seeking = typeof position !== 'undefined'; if (!seeking) { position = stream.position; } else if (!stream.seekable) { throw new FS.ErrnoError(70); } var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); if (!seeking) stream.position += bytesRead; return bytesRead; },write:function(stream, buffer, offset, length, position, canOwn) { if (length < 0 || position < 0) { throw new FS.ErrnoError(28); } if (FS.isClosed(stream)) { throw new FS.ErrnoError(8); } if ((stream.flags & 2097155) === 0) { throw new FS.ErrnoError(8); } if (FS.isDir(stream.node.mode)) { throw new FS.ErrnoError(31); } if (!stream.stream_ops.write) { throw new FS.ErrnoError(28); } if (stream.seekable && stream.flags & 1024) { // seek to the end before writing in append mode FS.llseek(stream, 0, 2); } var seeking = typeof position !== 'undefined'; if (!seeking) { position = stream.position; } else if (!stream.seekable) { throw new FS.ErrnoError(70); } var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); if (!seeking) stream.position += bytesWritten; try { if (stream.path && FS.trackingDelegate['onWriteToFile']) FS.trackingDelegate['onWriteToFile'](stream.path); } catch(e) { err("FS.trackingDelegate['onWriteToFile']('"+stream.path+"') threw an exception: " + e.message); } return bytesWritten; },allocate:function(stream, offset, length) { if (FS.isClosed(stream)) { throw new FS.ErrnoError(8); } if (offset < 0 || length <= 0) { throw new FS.ErrnoError(28); } if ((stream.flags & 2097155) === 0) { throw new FS.ErrnoError(8); } if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { throw new FS.ErrnoError(43); } if (!stream.stream_ops.allocate) { throw new FS.ErrnoError(138); } stream.stream_ops.allocate(stream, offset, length); },mmap:function(stream, address, length, position, prot, flags) { // User requests writing to file (prot & PROT_WRITE != 0). // Checking if we have permissions to write to the file unless // MAP_PRIVATE flag is set. According to POSIX spec it is possible // to write to file opened in read-only mode with MAP_PRIVATE flag, // as all modifications will be visible only in the memory of // the current process. if ((prot & 2) !== 0 && (flags & 2) === 0 && (stream.flags & 2097155) !== 2) { throw new FS.ErrnoError(2); } if ((stream.flags & 2097155) === 1) { throw new FS.ErrnoError(2); } if (!stream.stream_ops.mmap) { throw new FS.ErrnoError(43); } return stream.stream_ops.mmap(stream, address, length, position, prot, flags); },msync:function(stream, buffer, offset, length, mmapFlags) { if (!stream || !stream.stream_ops.msync) { return 0; } return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); },munmap:function(stream) { return 0; },ioctl:function(stream, cmd, arg) { if (!stream.stream_ops.ioctl) { throw new FS.ErrnoError(59); } return stream.stream_ops.ioctl(stream, cmd, arg); },readFile:function(path, opts) { opts = opts || {}; opts.flags = opts.flags || 'r'; opts.encoding = opts.encoding || 'binary'; if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { throw new Error('Invalid encoding type "' + opts.encoding + '"'); } var ret; var stream = FS.open(path, opts.flags); var stat = FS.stat(path); var length = stat.size; var buf = new Uint8Array(length); FS.read(stream, buf, 0, length, 0); if (opts.encoding === 'utf8') { ret = UTF8ArrayToString(buf, 0); } else if (opts.encoding === 'binary') { ret = buf; } FS.close(stream); return ret; },writeFile:function(path, data, opts) { opts = opts || {}; opts.flags = opts.flags || 'w'; var stream = FS.open(path, opts.flags, opts.mode); if (typeof data === 'string') { var buf = new Uint8Array(lengthBytesUTF8(data)+1); var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); } else if (ArrayBuffer.isView(data)) { FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); } else { throw new Error('Unsupported data type'); } FS.close(stream); },cwd:function() { return FS.currentPath; },chdir:function(path) { var lookup = FS.lookupPath(path, { follow: true }); if (lookup.node === null) { throw new FS.ErrnoError(44); } if (!FS.isDir(lookup.node.mode)) { throw new FS.ErrnoError(54); } var errCode = FS.nodePermissions(lookup.node, 'x'); if (errCode) { throw new FS.ErrnoError(errCode); } FS.currentPath = lookup.path; },createDefaultDirectories:function() { FS.mkdir('/tmp'); FS.mkdir('/home'); FS.mkdir('/home/web_user'); },createDefaultDevices:function() { // create /dev FS.mkdir('/dev'); // setup /dev/null FS.registerDevice(FS.makedev(1, 3), { read: function() { return 0; }, write: function(stream, buffer, offset, length, pos) { return length; } }); FS.mkdev('/dev/null', FS.makedev(1, 3)); // setup /dev/tty and /dev/tty1 // stderr needs to print output using Module['printErr'] // so we register a second tty just for it. TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); FS.mkdev('/dev/tty', FS.makedev(5, 0)); FS.mkdev('/dev/tty1', FS.makedev(6, 0)); // setup /dev/[u]random var random_device; if (typeof crypto === 'object' && typeof crypto['getRandomValues'] === 'function') { // for modern web browsers var randomBuffer = new Uint8Array(1); random_device = function() { crypto.getRandomValues(randomBuffer); return randomBuffer[0]; }; } else if (ENVIRONMENT_IS_NODE) { // for nodejs with or without crypto support included try { var crypto_module = require('crypto'); // nodejs has crypto support random_device = function() { return crypto_module['randomBytes'](1)[0]; }; } catch (e) { // nodejs doesn't have crypto support } } else {} if (!random_device) { // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096 random_device = function() { abort("random_device"); }; } FS.createDevice('/dev', 'random', random_device); FS.createDevice('/dev', 'urandom', random_device); // we're not going to emulate the actual shm device, // just create the tmp dirs that reside in it commonly FS.mkdir('/dev/shm'); FS.mkdir('/dev/shm/tmp'); },createSpecialDirectories:function() { // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the name of the stream for fd 6 (see test_unistd_ttyname) FS.mkdir('/proc'); FS.mkdir('/proc/self'); FS.mkdir('/proc/self/fd'); FS.mount({ mount: function() { var node = FS.createNode('/proc/self', 'fd', 16384 | 511 /* 0777 */, 73); node.node_ops = { lookup: function(parent, name) { var fd = +name; var stream = FS.getStream(fd); if (!stream) throw new FS.ErrnoError(8); var ret = { parent: null, mount: { mountpoint: 'fake' }, node_ops: { readlink: function() { return stream.path } } }; ret.parent = ret; // make it look like a simple root node return ret; } }; return node; } }, {}, '/proc/self/fd'); },createStandardStreams:function() { // TODO deprecate the old functionality of a single // input / output callback and that utilizes FS.createDevice // and instead require a unique set of stream ops // by default, we symlink the standard streams to the // default tty devices. however, if the standard streams // have been overwritten we create a unique device for // them instead. if (Module['stdin']) { FS.createDevice('/dev', 'stdin', Module['stdin']); } else { FS.symlink('/dev/tty', '/dev/stdin'); } if (Module['stdout']) { FS.createDevice('/dev', 'stdout', null, Module['stdout']); } else { FS.symlink('/dev/tty', '/dev/stdout'); } if (Module['stderr']) { FS.createDevice('/dev', 'stderr', null, Module['stderr']); } else { FS.symlink('/dev/tty1', '/dev/stderr'); } // open default streams for the stdin, stdout and stderr devices var stdin = FS.open('/dev/stdin', 'r'); var stdout = FS.open('/dev/stdout', 'w'); var stderr = FS.open('/dev/stderr', 'w'); },ensureErrnoError:function() { if (FS.ErrnoError) return; FS.ErrnoError = /** @this{Object} */ function ErrnoError(errno, node) { this.node = node; this.setErrno = /** @this{Object} */ function(errno) { this.errno = errno; }; this.setErrno(errno); this.message = 'FS error'; }; FS.ErrnoError.prototype = new Error(); FS.ErrnoError.prototype.constructor = FS.ErrnoError; // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) [44].forEach(function(code) { FS.genericErrors[code] = new FS.ErrnoError(code); FS.genericErrors[code].stack = ''; }); },staticInit:function() { FS.ensureErrnoError(); FS.nameTable = new Array(4096); FS.mount(MEMFS, {}, '/'); FS.createDefaultDirectories(); FS.createDefaultDevices(); FS.createSpecialDirectories(); FS.filesystems = { 'MEMFS': MEMFS, }; },init:function(input, output, error) { FS.init.initialized = true; FS.ensureErrnoError(); // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here Module['stdin'] = input || Module['stdin']; Module['stdout'] = output || Module['stdout']; Module['stderr'] = error || Module['stderr']; FS.createStandardStreams(); },quit:function() { FS.init.initialized = false; // force-flush all streams, so we get musl std streams printed out var fflush = Module['_fflush']; if (fflush) fflush(0); // close all of our streams for (var i = 0; i < FS.streams.length; i++) { var stream = FS.streams[i]; if (!stream) { continue; } FS.close(stream); } },getMode:function(canRead, canWrite) { var mode = 0; if (canRead) mode |= 292 | 73; if (canWrite) mode |= 146; return mode; },joinPath:function(parts, forceRelative) { var path = PATH.join.apply(null, parts); if (forceRelative && path[0] == '/') path = path.substr(1); return path; },absolutePath:function(relative, base) { return PATH_FS.resolve(base, relative); },standardizePath:function(path) { return PATH.normalize(path); },findObject:function(path, dontResolveLastLink) { var ret = FS.analyzePath(path, dontResolveLastLink); if (ret.exists) { return ret.object; } else { setErrNo(ret.error); return null; } },analyzePath:function(path, dontResolveLastLink) { // operate from within the context of the symlink's target try { var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); path = lookup.path; } catch (e) { } var ret = { isRoot: false, exists: false, error: 0, name: null, path: null, object: null, parentExists: false, parentPath: null, parentObject: null }; try { var lookup = FS.lookupPath(path, { parent: true }); ret.parentExists = true; ret.parentPath = lookup.path; ret.parentObject = lookup.node; ret.name = PATH.basename(path); lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); ret.exists = true; ret.path = lookup.path; ret.object = lookup.node; ret.name = lookup.node.name; ret.isRoot = lookup.path === '/'; } catch (e) { ret.error = e.errno; }; return ret; },createFolder:function(parent, name, canRead, canWrite) { var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); var mode = FS.getMode(canRead, canWrite); return FS.mkdir(path, mode); },createPath:function(parent, path, canRead, canWrite) { parent = typeof parent === 'string' ? parent : FS.getPath(parent); var parts = path.split('/').reverse(); while (parts.length) { var part = parts.pop(); if (!part) continue; var current = PATH.join2(parent, part); try { FS.mkdir(current); } catch (e) { // ignore EEXIST } parent = current; } return current; },createFile:function(parent, name, properties, canRead, canWrite) { var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); var mode = FS.getMode(canRead, canWrite); return FS.create(path, mode); },createDataFile:function(parent, name, data, canRead, canWrite, canOwn) { var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent; var mode = FS.getMode(canRead, canWrite); var node = FS.create(path, mode); if (data) { if (typeof data === 'string') { var arr = new Array(data.length); for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); data = arr; } // make sure we can write to the file FS.chmod(node, mode | 146); var stream = FS.open(node, 'w'); FS.write(stream, data, 0, data.length, 0, canOwn); FS.close(stream); FS.chmod(node, mode); } return node; },createDevice:function(parent, name, input, output) { var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); var mode = FS.getMode(!!input, !!output); if (!FS.createDevice.major) FS.createDevice.major = 64; var dev = FS.makedev(FS.createDevice.major++, 0); // Create a fake device that a set of stream ops to emulate // the old behavior. FS.registerDevice(dev, { open: function(stream) { stream.seekable = false; }, close: function(stream) { // flush any pending line data if (output && output.buffer && output.buffer.length) { output(10); } }, read: function(stream, buffer, offset, length, pos /* ignored */) { var bytesRead = 0; for (var i = 0; i < length; i++) { var result; try { result = input(); } catch (e) { throw new FS.ErrnoError(29); } if (result === undefined && bytesRead === 0) { throw new FS.ErrnoError(6); } if (result === null || result === undefined) break; bytesRead++; buffer[offset+i] = result; } if (bytesRead) { stream.node.timestamp = Date.now(); } return bytesRead; }, write: function(stream, buffer, offset, length, pos) { for (var i = 0; i < length; i++) { try { output(buffer[offset+i]); } catch (e) { throw new FS.ErrnoError(29); } } if (length) { stream.node.timestamp = Date.now(); } return i; } }); return FS.mkdev(path, mode, dev); },createLink:function(parent, name, target, canRead, canWrite) { var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); return FS.symlink(target, path); },forceLoadFile:function(obj) { if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; var success = true; if (typeof XMLHttpRequest !== 'undefined') { throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); } else if (read_) { // Command-line. try { // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as // read() will try to parse UTF8. obj.contents = intArrayFromString(read_(obj.url), true); obj.usedBytes = obj.contents.length; } catch (e) { success = false; } } else { throw new Error('Cannot load without read() or XMLHttpRequest.'); } if (!success) setErrNo(29); return success; },createLazyFile:function(parent, name, url, canRead, canWrite) { // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. /** @constructor */ function LazyUint8Array() { this.lengthKnown = false; this.chunks = []; // Loaded chunks. Index is the chunk number } LazyUint8Array.prototype.get = /** @this{Object} */ function LazyUint8Array_get(idx) { if (idx > this.length-1 || idx < 0) { return undefined; } var chunkOffset = idx % this.chunkSize; var chunkNum = (idx / this.chunkSize)|0; return this.getter(chunkNum)[chunkOffset]; }; LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { this.getter = getter; }; LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { // Find length var xhr = new XMLHttpRequest(); xhr.open('HEAD', url, false); xhr.send(null); if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); var datalength = Number(xhr.getResponseHeader("Content-length")); var header; var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; var chunkSize = 1024*1024; // Chunk size in bytes if (!hasByteServing) chunkSize = datalength; // Function to get a range from the remote URL. var doXHR = (function(from, to) { if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); // Some hints to the browser that we want binary data. if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer'; if (xhr.overrideMimeType) { xhr.overrideMimeType('text/plain; charset=x-user-defined'); } xhr.send(null); if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); if (xhr.response !== undefined) { return new Uint8Array(/** @type{Array} */(xhr.response || [])); } else { return intArrayFromString(xhr.responseText || '', true); } }); var lazyArray = this; lazyArray.setDataGetter(function(chunkNum) { var start = chunkNum * chunkSize; var end = (chunkNum+1) * chunkSize - 1; // including this byte end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block if (typeof(lazyArray.chunks[chunkNum]) === "undefined") { lazyArray.chunks[chunkNum] = doXHR(start, end); } if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!"); return lazyArray.chunks[chunkNum]; }); if (usesGzip || !datalength) { // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file datalength = this.getter(0).length; chunkSize = datalength; out("LazyFiles on gzip forces download of the whole file when length is accessed"); } this._length = datalength; this._chunkSize = chunkSize; this.lengthKnown = true; }; if (typeof XMLHttpRequest !== 'undefined') { if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; var lazyArray = new LazyUint8Array(); Object.defineProperties(lazyArray, { length: { get: /** @this{Object} */ function() { if(!this.lengthKnown) { this.cacheLength(); } return this._length; } }, chunkSize: { get: /** @this{Object} */ function() { if(!this.lengthKnown) { this.cacheLength(); } return this._chunkSize; } } }); var properties = { isDevice: false, contents: lazyArray }; } else { var properties = { isDevice: false, url: url }; } var node = FS.createFile(parent, name, properties, canRead, canWrite); // This is a total hack, but I want to get this lazy file code out of the // core of MEMFS. If we want to keep this lazy file concept I feel it should // be its own thin LAZYFS proxying calls to MEMFS. if (properties.contents) { node.contents = properties.contents; } else if (properties.url) { node.contents = null; node.url = properties.url; } // Add a function that defers querying the file size until it is asked the first time. Object.defineProperties(node, { usedBytes: { get: /** @this {FSNode} */ function() { return this.contents.length; } } }); // override each stream op with one that tries to force load the lazy file first var stream_ops = {}; var keys = Object.keys(node.stream_ops); keys.forEach(function(key) { var fn = node.stream_ops[key]; stream_ops[key] = function forceLoadLazyFile() { if (!FS.forceLoadFile(node)) { throw new FS.ErrnoError(29); } return fn.apply(null, arguments); }; }); // use a custom read function stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) { if (!FS.forceLoadFile(node)) { throw new FS.ErrnoError(29); } var contents = stream.node.contents; if (position >= contents.length) return 0; var size = Math.min(contents.length - position, length); if (contents.slice) { // normal array for (var i = 0; i < size; i++) { buffer[offset + i] = contents[position + i]; } } else { for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR buffer[offset + i] = contents.get(position + i); } } return size; }; node.stream_ops = stream_ops; return node; },createPreloadedFile:function(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { Browser.init(); // XXX perhaps this method should move onto Browser? // TODO we should allow people to just pass in a complete filename instead // of parent and name being that we just join them anyways var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; var dep = getUniqueRunDependency('cp ' + fullname); // might have several active requests for the same fullname function processData(byteArray) { function finish(byteArray) { if (preFinish) preFinish(); if (!dontCreateFile) { FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); } if (onload) onload(); removeRunDependency(dep); } var handled = false; Module['preloadPlugins'].forEach(function(plugin) { if (handled) return; if (plugin['canHandle'](fullname)) { plugin['handle'](byteArray, fullname, finish, function() { if (onerror) onerror(); removeRunDependency(dep); }); handled = true; } }); if (!handled) finish(byteArray); } addRunDependency(dep); if (typeof url == 'string') { Browser.asyncLoad(url, function(byteArray) { processData(byteArray); }, onerror); } else { processData(url); } },indexedDB:function() { return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; },DB_NAME:function() { return 'EM_FS_' + window.location.pathname; },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function(paths, onload, onerror) { onload = onload || function(){}; onerror = onerror || function(){}; var indexedDB = FS.indexedDB(); try { var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); } catch (e) { return onerror(e); } openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { out('creating db'); var db = openRequest.result; db.createObjectStore(FS.DB_STORE_NAME); }; openRequest.onsuccess = function openRequest_onsuccess() { var db = openRequest.result; var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite'); var files = transaction.objectStore(FS.DB_STORE_NAME); var ok = 0, fail = 0, total = paths.length; function finish() { if (fail == 0) onload(); else onerror(); } paths.forEach(function(path) { var putRequest = files.put(FS.analyzePath(path).object.contents, path); putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() }; putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() }; }); transaction.onerror = onerror; }; openRequest.onerror = onerror; },loadFilesFromDB:function(paths, onload, onerror) { onload = onload || function(){}; onerror = onerror || function(){}; var indexedDB = FS.indexedDB(); try { var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); } catch (e) { return onerror(e); } openRequest.onupgradeneeded = onerror; // no database to load from openRequest.onsuccess = function openRequest_onsuccess() { var db = openRequest.result; try { var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly'); } catch(e) { onerror(e); return; } var files = transaction.objectStore(FS.DB_STORE_NAME); var ok = 0, fail = 0, total = paths.length; function finish() { if (fail == 0) onload(); else onerror(); } paths.forEach(function(path) { var getRequest = files.get(path); getRequest.onsuccess = function getRequest_onsuccess() { if (FS.analyzePath(path).exists) { FS.unlink(path); } FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); ok++; if (ok + fail == total) finish(); }; getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() }; }); transaction.onerror = onerror; }; openRequest.onerror = onerror; }};var SYSCALLS={mappings:{},DEFAULT_POLLMASK:5,umask:511,calculateAt:function(dirfd, path) { if (path[0] !== '/') { // relative path var dir; if (dirfd === -100) { dir = FS.cwd(); } else { var dirstream = FS.getStream(dirfd); if (!dirstream) throw new FS.ErrnoError(8); dir = dirstream.path; } path = PATH.join2(dir, path); } return path; },doStat:function(func, path, buf) { try { var stat = func(path); } catch (e) { if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { // an error occurred while trying to look up the path; we should just report ENOTDIR return -54; } throw e; } HEAP32[((buf)>>2)]=stat.dev; HEAP32[(((buf)+(4))>>2)]=0; HEAP32[(((buf)+(8))>>2)]=stat.ino; HEAP32[(((buf)+(12))>>2)]=stat.mode; HEAP32[(((buf)+(16))>>2)]=stat.nlink; HEAP32[(((buf)+(20))>>2)]=stat.uid; HEAP32[(((buf)+(24))>>2)]=stat.gid; HEAP32[(((buf)+(28))>>2)]=stat.rdev; HEAP32[(((buf)+(32))>>2)]=0; (tempI64 = [stat.size>>>0,(tempDouble=stat.size,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(40))>>2)]=tempI64[0],HEAP32[(((buf)+(44))>>2)]=tempI64[1]); HEAP32[(((buf)+(48))>>2)]=4096; HEAP32[(((buf)+(52))>>2)]=stat.blocks; HEAP32[(((buf)+(56))>>2)]=(stat.atime.getTime() / 1000)|0; HEAP32[(((buf)+(60))>>2)]=0; HEAP32[(((buf)+(64))>>2)]=(stat.mtime.getTime() / 1000)|0; HEAP32[(((buf)+(68))>>2)]=0; HEAP32[(((buf)+(72))>>2)]=(stat.ctime.getTime() / 1000)|0; HEAP32[(((buf)+(76))>>2)]=0; (tempI64 = [stat.ino>>>0,(tempDouble=stat.ino,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(80))>>2)]=tempI64[0],HEAP32[(((buf)+(84))>>2)]=tempI64[1]); return 0; },doMsync:function(addr, stream, len, flags, offset) { var buffer = HEAPU8.slice(addr, addr + len); FS.msync(stream, buffer, offset, len, flags); },doMkdir:function(path, mode) { // remove a trailing slash, if one - /a/b/ has basename of '', but // we want to create b in the context of this function path = PATH.normalize(path); if (path[path.length-1] === '/') path = path.substr(0, path.length-1); FS.mkdir(path, mode, 0); return 0; },doMknod:function(path, mode, dev) { // we don't want this in the JS API as it uses mknod to create all nodes. switch (mode & 61440) { case 32768: case 8192: case 24576: case 4096: case 49152: break; default: return -28; } FS.mknod(path, mode, dev); return 0; },doReadlink:function(path, buf, bufsize) { if (bufsize <= 0) return -28; var ret = FS.readlink(path); var len = Math.min(bufsize, lengthBytesUTF8(ret)); var endChar = HEAP8[buf+len]; stringToUTF8(ret, buf, bufsize+1); // readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!) // stringToUTF8() always appends a null byte, so restore the character under the null byte after the write. HEAP8[buf+len] = endChar; return len; },doAccess:function(path, amode) { if (amode & ~7) { // need a valid mode return -28; } var node; var lookup = FS.lookupPath(path, { follow: true }); node = lookup.node; if (!node) { return -44; } var perms = ''; if (amode & 4) perms += 'r'; if (amode & 2) perms += 'w'; if (amode & 1) perms += 'x'; if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) { return -2; } return 0; },doDup:function(path, flags, suggestFD) { var suggest = FS.getStream(suggestFD); if (suggest) FS.close(suggest); return FS.open(path, flags, 0, suggestFD, suggestFD).fd; },doReadv:function(stream, iov, iovcnt, offset) { var ret = 0; for (var i = 0; i < iovcnt; i++) { var ptr = HEAP32[(((iov)+(i*8))>>2)]; var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; var curr = FS.read(stream, HEAP8,ptr, len, offset); if (curr < 0) return -1; ret += curr; if (curr < len) break; // nothing more to read } return ret; },doWritev:function(stream, iov, iovcnt, offset) { var ret = 0; for (var i = 0; i < iovcnt; i++) { var ptr = HEAP32[(((iov)+(i*8))>>2)]; var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; var curr = FS.write(stream, HEAP8,ptr, len, offset); if (curr < 0) return -1; ret += curr; } return ret; },varargs:undefined,get:function() { SYSCALLS.varargs += 4; var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)]; return ret; },getStr:function(ptr) { var ret = UTF8ToString(ptr); return ret; },getStreamFromFD:function(fd) { var stream = FS.getStream(fd); if (!stream) throw new FS.ErrnoError(8); return stream; },get64:function(low, high) { return low; }};function _fd_close(fd) {try { var stream = SYSCALLS.getStreamFromFD(fd); FS.close(stream); return 0; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return e.errno; } } function _fd_read(fd, iov, iovcnt, pnum) {try { var stream = SYSCALLS.getStreamFromFD(fd); var num = SYSCALLS.doReadv(stream, iov, iovcnt); HEAP32[((pnum)>>2)]=num return 0; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return e.errno; } } function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {try { var stream = SYSCALLS.getStreamFromFD(fd); var HIGH_OFFSET = 0x100000000; // 2^32 // use an unsigned operator on low and shift high by 32-bits var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0); var DOUBLE_LIMIT = 0x20000000000000; // 2^53 // we also check for equality since DOUBLE_LIMIT + 1 == DOUBLE_LIMIT if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) { return -61; } FS.llseek(stream, offset, whence); (tempI64 = [stream.position>>>0,(tempDouble=stream.position,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((newOffset)>>2)]=tempI64[0],HEAP32[(((newOffset)+(4))>>2)]=tempI64[1]); if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state return 0; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return e.errno; } } function _fd_write(fd, iov, iovcnt, pnum) {try { var stream = SYSCALLS.getStreamFromFD(fd); var num = SYSCALLS.doWritev(stream, iov, iovcnt); HEAP32[((pnum)>>2)]=num return 0; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return e.errno; } } function _round(d) { d = +d; return d >= +0 ? +Math_floor(d + +0.5) : +Math_ceil(d - +0.5); } function _setTempRet0($i) { setTempRet0(($i) | 0); } var FSNode = /** @constructor */ function(parent, name, mode, rdev) { if (!parent) { parent = this; // root node sets parent to itself } this.parent = parent; this.mount = parent.mount; this.mounted = null; this.id = FS.nextInode++; this.name = name; this.mode = mode; this.node_ops = {}; this.stream_ops = {}; this.rdev = rdev; }; var readMode = 292/*292*/ | 73/*73*/; var writeMode = 146/*146*/; Object.defineProperties(FSNode.prototype, { read: { get: /** @this{FSNode} */function() { return (this.mode & readMode) === readMode; }, set: /** @this{FSNode} */function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; } }, write: { get: /** @this{FSNode} */function() { return (this.mode & writeMode) === writeMode; }, set: /** @this{FSNode} */function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; } }, isFolder: { get: /** @this{FSNode} */function() { return FS.isDir(this.mode); } }, isDevice: { get: /** @this{FSNode} */function() { return FS.isChrdev(this.mode); } } }); FS.FSNode = FSNode; FS.staticInit();; var ASSERTIONS = false; /** @type {function(string, boolean=, number=)} */ function intArrayFromString(stringy, dontAddNull, length) { var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; var u8array = new Array(len); var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); if (dontAddNull) u8array.length = numBytesWritten; return u8array; } function intArrayToString(array) { var ret = []; for (var i = 0; i < array.length; i++) { var chr = array[i]; if (chr > 0xFF) { if (ASSERTIONS) { assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); } chr &= 0xFF; } ret.push(String.fromCharCode(chr)); } return ret.join(''); } // Copied from https://github.com/strophe/strophejs/blob/e06d027/src/polyfills.js#L149 // This code was written by Tyler Akins and has been placed in the // public domain. It would be nice if you left this header intact. // Base64 code from Tyler Akins -- http://rumkin.com /** * Decodes a base64 string. * @param {string} input The string to decode. */ var decodeBase64 = typeof atob === 'function' ? atob : function (input) { var keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; var output = ''; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; // remove all characters that are not A-Z, a-z, 0-9, +, /, or = input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); do { enc1 = keyStr.indexOf(input.charAt(i++)); enc2 = keyStr.indexOf(input.charAt(i++)); enc3 = keyStr.indexOf(input.charAt(i++)); enc4 = keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 !== 64) { output = output + String.fromCharCode(chr2); } if (enc4 !== 64) { output = output + String.fromCharCode(chr3); } } while (i < input.length); return output; }; // Converts a string of base64 into a byte array. // Throws error on invalid input. function intArrayFromBase64(s) { if (typeof ENVIRONMENT_IS_NODE === 'boolean' && ENVIRONMENT_IS_NODE) { var buf; try { // TODO: Update Node.js externs, Closure does not recognize the following Buffer.from() /**@suppress{checkTypes}*/ buf = Buffer.from(s, 'base64'); } catch (_) { buf = new Buffer(s, 'base64'); } return new Uint8Array(buf['buffer'], buf['byteOffset'], buf['byteLength']); } try { var decoded = decodeBase64(s); var bytes = new Uint8Array(decoded.length); for (var i = 0 ; i < decoded.length ; ++i) { bytes[i] = decoded.charCodeAt(i); } return bytes; } catch (_) { throw new Error('Converting base64 string to bytes failed.'); } } // If filename is a base64 data URI, parses and returns data (Buffer on node, // Uint8Array otherwise). If filename is not a base64 data URI, returns undefined. function tryParseAsDataURI(filename) { if (!isDataURI(filename)) { return; } return intArrayFromBase64(filename.slice(dataURIPrefix.length)); } // ASM_LIBRARY EXTERN PRIMITIVES: Math_floor,Math_ceil var asmGlobalArg = {}; var asmLibraryArg = { "emscripten_get_sbrk_ptr": _emscripten_get_sbrk_ptr, "emscripten_memcpy_big": _emscripten_memcpy_big, "emscripten_resize_heap": _emscripten_resize_heap, "fd_close": _fd_close, "fd_read": _fd_read, "fd_seek": _fd_seek, "fd_write": _fd_write, "getTempRet0": getTempRet0, "memory": wasmMemory, "round": _round, "setTempRet0": setTempRet0, "table": wasmTable }; var asm = createWasm(); /** @type {function(...*):?} */ var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["__wasm_call_ctors"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_new = Module["_FLAC__stream_decoder_new"] = function() { return (_FLAC__stream_decoder_new = Module["_FLAC__stream_decoder_new"] = Module["asm"]["FLAC__stream_decoder_new"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_delete = Module["_FLAC__stream_decoder_delete"] = function() { return (_FLAC__stream_decoder_delete = Module["_FLAC__stream_decoder_delete"] = Module["asm"]["FLAC__stream_decoder_delete"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_finish = Module["_FLAC__stream_decoder_finish"] = function() { return (_FLAC__stream_decoder_finish = Module["_FLAC__stream_decoder_finish"] = Module["asm"]["FLAC__stream_decoder_finish"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_init_stream = Module["_FLAC__stream_decoder_init_stream"] = function() { return (_FLAC__stream_decoder_init_stream = Module["_FLAC__stream_decoder_init_stream"] = Module["asm"]["FLAC__stream_decoder_init_stream"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_reset = Module["_FLAC__stream_decoder_reset"] = function() { return (_FLAC__stream_decoder_reset = Module["_FLAC__stream_decoder_reset"] = Module["asm"]["FLAC__stream_decoder_reset"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_init_ogg_stream = Module["_FLAC__stream_decoder_init_ogg_stream"] = function() { return (_FLAC__stream_decoder_init_ogg_stream = Module["_FLAC__stream_decoder_init_ogg_stream"] = Module["asm"]["FLAC__stream_decoder_init_ogg_stream"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_set_ogg_serial_number = Module["_FLAC__stream_decoder_set_ogg_serial_number"] = function() { return (_FLAC__stream_decoder_set_ogg_serial_number = Module["_FLAC__stream_decoder_set_ogg_serial_number"] = Module["asm"]["FLAC__stream_decoder_set_ogg_serial_number"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_set_md5_checking = Module["_FLAC__stream_decoder_set_md5_checking"] = function() { return (_FLAC__stream_decoder_set_md5_checking = Module["_FLAC__stream_decoder_set_md5_checking"] = Module["asm"]["FLAC__stream_decoder_set_md5_checking"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_set_metadata_respond = Module["_FLAC__stream_decoder_set_metadata_respond"] = function() { return (_FLAC__stream_decoder_set_metadata_respond = Module["_FLAC__stream_decoder_set_metadata_respond"] = Module["asm"]["FLAC__stream_decoder_set_metadata_respond"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_set_metadata_respond_application = Module["_FLAC__stream_decoder_set_metadata_respond_application"] = function() { return (_FLAC__stream_decoder_set_metadata_respond_application = Module["_FLAC__stream_decoder_set_metadata_respond_application"] = Module["asm"]["FLAC__stream_decoder_set_metadata_respond_application"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_set_metadata_respond_all = Module["_FLAC__stream_decoder_set_metadata_respond_all"] = function() { return (_FLAC__stream_decoder_set_metadata_respond_all = Module["_FLAC__stream_decoder_set_metadata_respond_all"] = Module["asm"]["FLAC__stream_decoder_set_metadata_respond_all"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_set_metadata_ignore = Module["_FLAC__stream_decoder_set_metadata_ignore"] = function() { return (_FLAC__stream_decoder_set_metadata_ignore = Module["_FLAC__stream_decoder_set_metadata_ignore"] = Module["asm"]["FLAC__stream_decoder_set_metadata_ignore"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_set_metadata_ignore_application = Module["_FLAC__stream_decoder_set_metadata_ignore_application"] = function() { return (_FLAC__stream_decoder_set_metadata_ignore_application = Module["_FLAC__stream_decoder_set_metadata_ignore_application"] = Module["asm"]["FLAC__stream_decoder_set_metadata_ignore_application"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_set_metadata_ignore_all = Module["_FLAC__stream_decoder_set_metadata_ignore_all"] = function() { return (_FLAC__stream_decoder_set_metadata_ignore_all = Module["_FLAC__stream_decoder_set_metadata_ignore_all"] = Module["asm"]["FLAC__stream_decoder_set_metadata_ignore_all"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_get_state = Module["_FLAC__stream_decoder_get_state"] = function() { return (_FLAC__stream_decoder_get_state = Module["_FLAC__stream_decoder_get_state"] = Module["asm"]["FLAC__stream_decoder_get_state"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_get_md5_checking = Module["_FLAC__stream_decoder_get_md5_checking"] = function() { return (_FLAC__stream_decoder_get_md5_checking = Module["_FLAC__stream_decoder_get_md5_checking"] = Module["asm"]["FLAC__stream_decoder_get_md5_checking"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_process_single = Module["_FLAC__stream_decoder_process_single"] = function() { return (_FLAC__stream_decoder_process_single = Module["_FLAC__stream_decoder_process_single"] = Module["asm"]["FLAC__stream_decoder_process_single"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_process_until_end_of_metadata = Module["_FLAC__stream_decoder_process_until_end_of_metadata"] = function() { return (_FLAC__stream_decoder_process_until_end_of_metadata = Module["_FLAC__stream_decoder_process_until_end_of_metadata"] = Module["asm"]["FLAC__stream_decoder_process_until_end_of_metadata"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_decoder_process_until_end_of_stream = Module["_FLAC__stream_decoder_process_until_end_of_stream"] = function() { return (_FLAC__stream_decoder_process_until_end_of_stream = Module["_FLAC__stream_decoder_process_until_end_of_stream"] = Module["asm"]["FLAC__stream_decoder_process_until_end_of_stream"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_new = Module["_FLAC__stream_encoder_new"] = function() { return (_FLAC__stream_encoder_new = Module["_FLAC__stream_encoder_new"] = Module["asm"]["FLAC__stream_encoder_new"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_delete = Module["_FLAC__stream_encoder_delete"] = function() { return (_FLAC__stream_encoder_delete = Module["_FLAC__stream_encoder_delete"] = Module["asm"]["FLAC__stream_encoder_delete"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_finish = Module["_FLAC__stream_encoder_finish"] = function() { return (_FLAC__stream_encoder_finish = Module["_FLAC__stream_encoder_finish"] = Module["asm"]["FLAC__stream_encoder_finish"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_init_stream = Module["_FLAC__stream_encoder_init_stream"] = function() { return (_FLAC__stream_encoder_init_stream = Module["_FLAC__stream_encoder_init_stream"] = Module["asm"]["FLAC__stream_encoder_init_stream"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_init_ogg_stream = Module["_FLAC__stream_encoder_init_ogg_stream"] = function() { return (_FLAC__stream_encoder_init_ogg_stream = Module["_FLAC__stream_encoder_init_ogg_stream"] = Module["asm"]["FLAC__stream_encoder_init_ogg_stream"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_set_ogg_serial_number = Module["_FLAC__stream_encoder_set_ogg_serial_number"] = function() { return (_FLAC__stream_encoder_set_ogg_serial_number = Module["_FLAC__stream_encoder_set_ogg_serial_number"] = Module["asm"]["FLAC__stream_encoder_set_ogg_serial_number"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_set_verify = Module["_FLAC__stream_encoder_set_verify"] = function() { return (_FLAC__stream_encoder_set_verify = Module["_FLAC__stream_encoder_set_verify"] = Module["asm"]["FLAC__stream_encoder_set_verify"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_set_channels = Module["_FLAC__stream_encoder_set_channels"] = function() { return (_FLAC__stream_encoder_set_channels = Module["_FLAC__stream_encoder_set_channels"] = Module["asm"]["FLAC__stream_encoder_set_channels"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_set_bits_per_sample = Module["_FLAC__stream_encoder_set_bits_per_sample"] = function() { return (_FLAC__stream_encoder_set_bits_per_sample = Module["_FLAC__stream_encoder_set_bits_per_sample"] = Module["asm"]["FLAC__stream_encoder_set_bits_per_sample"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_set_sample_rate = Module["_FLAC__stream_encoder_set_sample_rate"] = function() { return (_FLAC__stream_encoder_set_sample_rate = Module["_FLAC__stream_encoder_set_sample_rate"] = Module["asm"]["FLAC__stream_encoder_set_sample_rate"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_set_compression_level = Module["_FLAC__stream_encoder_set_compression_level"] = function() { return (_FLAC__stream_encoder_set_compression_level = Module["_FLAC__stream_encoder_set_compression_level"] = Module["asm"]["FLAC__stream_encoder_set_compression_level"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_set_blocksize = Module["_FLAC__stream_encoder_set_blocksize"] = function() { return (_FLAC__stream_encoder_set_blocksize = Module["_FLAC__stream_encoder_set_blocksize"] = Module["asm"]["FLAC__stream_encoder_set_blocksize"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_set_total_samples_estimate = Module["_FLAC__stream_encoder_set_total_samples_estimate"] = function() { return (_FLAC__stream_encoder_set_total_samples_estimate = Module["_FLAC__stream_encoder_set_total_samples_estimate"] = Module["asm"]["FLAC__stream_encoder_set_total_samples_estimate"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_set_metadata = Module["_FLAC__stream_encoder_set_metadata"] = function() { return (_FLAC__stream_encoder_set_metadata = Module["_FLAC__stream_encoder_set_metadata"] = Module["asm"]["FLAC__stream_encoder_set_metadata"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_get_state = Module["_FLAC__stream_encoder_get_state"] = function() { return (_FLAC__stream_encoder_get_state = Module["_FLAC__stream_encoder_get_state"] = Module["asm"]["FLAC__stream_encoder_get_state"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_get_verify_decoder_state = Module["_FLAC__stream_encoder_get_verify_decoder_state"] = function() { return (_FLAC__stream_encoder_get_verify_decoder_state = Module["_FLAC__stream_encoder_get_verify_decoder_state"] = Module["asm"]["FLAC__stream_encoder_get_verify_decoder_state"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_get_verify = Module["_FLAC__stream_encoder_get_verify"] = function() { return (_FLAC__stream_encoder_get_verify = Module["_FLAC__stream_encoder_get_verify"] = Module["asm"]["FLAC__stream_encoder_get_verify"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_process = Module["_FLAC__stream_encoder_process"] = function() { return (_FLAC__stream_encoder_process = Module["_FLAC__stream_encoder_process"] = Module["asm"]["FLAC__stream_encoder_process"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _FLAC__stream_encoder_process_interleaved = Module["_FLAC__stream_encoder_process_interleaved"] = function() { return (_FLAC__stream_encoder_process_interleaved = Module["_FLAC__stream_encoder_process_interleaved"] = Module["asm"]["FLAC__stream_encoder_process_interleaved"]).apply(null, arguments); }; /** @type {function(...*):?} */ var ___errno_location = Module["___errno_location"] = function() { return (___errno_location = Module["___errno_location"] = Module["asm"]["__errno_location"]).apply(null, arguments); }; /** @type {function(...*):?} */ var stackSave = Module["stackSave"] = function() { return (stackSave = Module["stackSave"] = Module["asm"]["stackSave"]).apply(null, arguments); }; /** @type {function(...*):?} */ var stackRestore = Module["stackRestore"] = function() { return (stackRestore = Module["stackRestore"] = Module["asm"]["stackRestore"]).apply(null, arguments); }; /** @type {function(...*):?} */ var stackAlloc = Module["stackAlloc"] = function() { return (stackAlloc = Module["stackAlloc"] = Module["asm"]["stackAlloc"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _malloc = Module["_malloc"] = function() { return (_malloc = Module["_malloc"] = Module["asm"]["malloc"]).apply(null, arguments); }; /** @type {function(...*):?} */ var _free = Module["_free"] = function() { return (_free = Module["_free"] = Module["asm"]["free"]).apply(null, arguments); }; /** @type {function(...*):?} */ var __growWasmMemory = Module["__growWasmMemory"] = function() { return (__growWasmMemory = Module["__growWasmMemory"] = Module["asm"]["__growWasmMemory"]).apply(null, arguments); }; /** @type {function(...*):?} */ var dynCall_iii = Module["dynCall_iii"] = function() { return (dynCall_iii = Module["dynCall_iii"] = Module["asm"]["dynCall_iii"]).apply(null, arguments); }; /** @type {function(...*):?} */ var dynCall_ii = Module["dynCall_ii"] = function() { return (dynCall_ii = Module["dynCall_ii"] = Module["asm"]["dynCall_ii"]).apply(null, arguments); }; /** @type {function(...*):?} */ var dynCall_iiii = Module["dynCall_iiii"] = function() { return (dynCall_iiii = Module["dynCall_iiii"] = Module["asm"]["dynCall_iiii"]).apply(null, arguments); }; /** @type {function(...*):?} */ var dynCall_jiji = Module["dynCall_jiji"] = function() { return (dynCall_jiji = Module["dynCall_jiji"] = Module["asm"]["dynCall_jiji"]).apply(null, arguments); }; /** @type {function(...*):?} */ var dynCall_viiiiii = Module["dynCall_viiiiii"] = function() { return (dynCall_viiiiii = Module["dynCall_viiiiii"] = Module["asm"]["dynCall_viiiiii"]).apply(null, arguments); }; /** @type {function(...*):?} */ var dynCall_iiiii = Module["dynCall_iiiii"] = function() { return (dynCall_iiiii = Module["dynCall_iiiii"] = Module["asm"]["dynCall_iiiii"]).apply(null, arguments); }; /** @type {function(...*):?} */ var dynCall_viiiiiii = Module["dynCall_viiiiiii"] = function() { return (dynCall_viiiiiii = Module["dynCall_viiiiiii"] = Module["asm"]["dynCall_viiiiiii"]).apply(null, arguments); }; /** @type {function(...*):?} */ var dynCall_viiii = Module["dynCall_viiii"] = function() { return (dynCall_viiii = Module["dynCall_viiii"] = Module["asm"]["dynCall_viiii"]).apply(null, arguments); }; /** @type {function(...*):?} */ var dynCall_viii = Module["dynCall_viii"] = function() { return (dynCall_viii = Module["dynCall_viii"] = Module["asm"]["dynCall_viii"]).apply(null, arguments); }; // === Auto-generated postamble setup entry stuff === Module["ccall"] = ccall; Module["cwrap"] = cwrap; Module["setValue"] = setValue; Module["getValue"] = getValue; var calledRun; /** * @constructor * @this {ExitStatus} */ function ExitStatus(status) { this.name = "ExitStatus"; this.message = "Program terminated with exit(" + status + ")"; this.status = status; } var calledMain = false; dependenciesFulfilled = function runCaller() { // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) if (!calledRun) run(); if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled }; /** @type {function(Array=)} */ function run(args) { args = args || arguments_; if (runDependencies > 0) { return; } preRun(); if (runDependencies > 0) return; // a preRun added a dependency, run will be called later function doRun() { // run may have just been called through dependencies being fulfilled just in this very frame, // or while the async setStatus time below was happening if (calledRun) return; calledRun = true; Module['calledRun'] = true; if (ABORT) return; initRuntime(); preMain(); if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); postRun(); } if (Module['setStatus']) { Module['setStatus']('Running...'); setTimeout(function() { setTimeout(function() { Module['setStatus'](''); }, 1); doRun(); }, 1); } else { doRun(); } } Module['run'] = run; /** @param {boolean|number=} implicit */ function exit(status, implicit) { // if this is just main exit-ing implicitly, and the status is 0, then we // don't need to do anything here and can just leave. if the status is // non-zero, though, then we need to report it. // (we may have warned about this earlier, if a situation justifies doing so) if (implicit && noExitRuntime && status === 0) { return; } if (noExitRuntime) { } else { ABORT = true; EXITSTATUS = status; exitRuntime(); if (Module['onExit']) Module['onExit'](status); } quit_(status, new ExitStatus(status)); } if (Module['preInit']) { if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; while (Module['preInit'].length > 0) { Module['preInit'].pop()(); } } noExitRuntime = true; run(); // {{MODULE_ADDITIONS}} //libflac function wrappers /** * HELPER read/extract stream info meta-data from frame header / meta-data * @param {POINTER} p_streaminfo * @returns StreamInfo */ function _readStreamInfo(p_streaminfo){//-> FLAC__StreamMetadata.type (FLAC__MetadataType) === FLAC__METADATA_TYPE_STREAMINFO (0) /* typedef struct { unsigned min_blocksize, max_blocksize; unsigned min_framesize, max_framesize; unsigned sample_rate; unsigned channels; unsigned bits_per_sample; FLAC__uint64 total_samples; FLAC__byte md5sum[16]; } FLAC__StreamMetadata_StreamInfo; */ var min_blocksize = Module.getValue(p_streaminfo,'i32');//4 bytes var max_blocksize = Module.getValue(p_streaminfo+4,'i32');//4 bytes var min_framesize = Module.getValue(p_streaminfo+8,'i32');//4 bytes var max_framesize = Module.getValue(p_streaminfo+12,'i32');//4 bytes var sample_rate = Module.getValue(p_streaminfo+16,'i32');//4 bytes var channels = Module.getValue(p_streaminfo+20,'i32');//4 bytes var bits_per_sample = Module.getValue(p_streaminfo+24,'i32');//4 bytes //FIXME should be at p_streaminfo+28, but seems to be at p_streaminfo+32 var total_samples = Module.getValue(p_streaminfo+32,'i64');//8 bytes var md5sum = _readMd5(p_streaminfo+40);//16 bytes return { min_blocksize: min_blocksize, max_blocksize: max_blocksize, min_framesize: min_framesize, max_framesize: max_framesize, sampleRate: sample_rate, channels: channels, bitsPerSample: bits_per_sample, total_samples: total_samples, md5sum: md5sum }; } /** * read MD5 checksum * @param {POINTER} p_md5 * @returns {String} as HEX string representation */ function _readMd5(p_md5){ var sb = [], v, str; for(var i=0, len = 16; i < len; ++i){ v = Module.getValue(p_md5+i,'i8');//1 byte if(v < 0) v = 256 + v;//<- "convert" to uint8, if necessary str = v.toString(16); if(str.length < 2) str = '0' + str;//<- add padding, if necessary sb.push(str); } return sb.join(''); } /** * HELPER: read frame data * * @param {POINTER} p_frame * @param {CodingOptions} [enc_opt] * @returns FrameHeader */ function _readFrameHdr(p_frame, enc_opt){ /* typedef struct { unsigned blocksize; unsigned sample_rate; unsigned channels; FLAC__ChannelAssignment channel_assignment; unsigned bits_per_sample; FLAC__FrameNumberType number_type; union { FLAC__uint32 frame_number; FLAC__uint64 sample_number; } number; FLAC__uint8 crc; } FLAC__FrameHeader; */ var blocksize = Module.getValue(p_frame,'i32');//4 bytes var sample_rate = Module.getValue(p_frame+4,'i32');//4 bytes var channels = Module.getValue(p_frame+8,'i32');//4 bytes // 0: FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT independent channels // 1: FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE left+side stereo // 2: FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE right+side stereo // 3: FLAC__CHANNEL_ASSIGNMENT_MID_SIDE mid+side stereo var channel_assignment = Module.getValue(p_frame+12,'i32');//4 bytes var bits_per_sample = Module.getValue(p_frame+16,'i32'); // 0: FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER number contains the frame number // 1: FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER number contains the sample number of first sample in frame var number_type = Module.getValue(p_frame+20,'i32'); // union {} number: The frame number or sample number of first sample in frame; use the number_type value to determine which to use. var frame_number = Module.getValue(p_frame+24,'i32'); var sample_number = Module.getValue(p_frame+24,'i64'); var number = number_type === 0? frame_number : sample_number; var numberType = number_type === 0? 'frames' : 'samples'; var crc = Module.getValue(p_frame+36,'i8'); var subframes; if(enc_opt && enc_opt.analyseSubframes){ var subOffset = {offset: 40}; subframes = []; for(var i=0; i < channels; ++i){ subframes.push(_readSubFrameHdr(p_frame, subOffset, blocksize, enc_opt)); } //TODO read footer // console.log(' footer crc ', Module.getValue(p_frame + subOffset.offset,'i16')); } return { blocksize: blocksize, sampleRate: sample_rate, channels: channels, channelAssignment: channel_assignment, bitsPerSample: bits_per_sample, number: number, numberType: numberType, crc: crc, subframes: subframes }; } function _readSubFrameHdr(p_subframe, subOffset, block_size, enc_opt){ /* FLAC__SubframeType type union { FLAC__Subframe_Constant constant FLAC__Subframe_Fixed fixed FLAC__Subframe_LPC lpc FLAC__Subframe_Verbatim verbatim } data unsigned wasted_bits */ var type = Module.getValue(p_subframe + subOffset.offset, 'i32'); subOffset.offset += 4; var data; switch(type){ case 0: //FLAC__SUBFRAME_TYPE_CONSTANT data = {value: Module.getValue(p_subframe + subOffset.offset, 'i32')}; subOffset.offset += 284;//4; break; case 1: //FLAC__SUBFRAME_TYPE_VERBATIM data = Module.getValue(p_subframe + subOffset.offset, 'i32'); subOffset.offset += 284;//4; break; case 2: //FLAC__SUBFRAME_TYPE_FIXED data = _readSubFrameHdrFixedData(p_subframe, subOffset, block_size, false, enc_opt); break; case 3: //FLAC__SUBFRAME_TYPE_LPC data = _readSubFrameHdrFixedData(p_subframe, subOffset, block_size, true, enc_opt); break; } var offset = subOffset.offset; var wasted_bits = Module.getValue(p_subframe + offset, 'i32'); subOffset.offset += 4; return { type: type,//['CONSTANT', 'VERBATIM', 'FIXED', 'LPC'][type], data: data, wastedBits: wasted_bits } } function _readSubFrameHdrFixedData(p_subframe_data, subOffset, block_size, is_lpc, enc_opt){ var offset = subOffset.offset; var data = {order: -1, contents: {parameters: [], rawBits: []}}; //FLAC__Subframe_Fixed: // FLAC__EntropyCodingMethod entropy_coding_method // unsigned order // FLAC__int32 warmup [FLAC__MAX_FIXED_ORDER] // const FLAC__int32 * residual //FLAC__EntropyCodingMethod: // FLAC__EntropyCodingMethodType type // union { // FLAC__EntropyCodingMethod_PartitionedRice partitioned_rice // } data //FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE 0 Residual is coded by partitioning into contexts, each with it's own 4-bit Rice parameter. //FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 1 Residual is coded by partitioning into contexts, each with it's own 5-bit Rice parameter. var entropyType = Module.getValue(p_subframe_data, 'i32'); offset += 4; //FLAC__EntropyCodingMethod_PartitionedRice: // unsigned order var entropyOrder = Module.getValue(p_subframe_data + offset, 'i32'); data.order = entropyOrder; offset += 4; //FLAC__EntropyCodingMethod_PartitionedRice: // FLAC__EntropyCodingMethod_PartitionedRiceContents * contents var partitions = 1 << entropyOrder, params = data.contents.parameters, raws = data.contents.rawBits; //FLAC__EntropyCodingMethod_PartitionedRiceContents // unsigned * parameters // unsigned * raw_bits // unsigned capacity_by_order var ppart = Module.getValue(p_subframe_data + offset, 'i32'); var pparams = Module.getValue(ppart, 'i32'); var praw = Module.getValue(ppart + 4, 'i32'); data.contents.capacityByOrder = Module.getValue(ppart + 8, 'i32'); for(var i=0; i < partitions; ++i){ params.push(Module.getValue(pparams + (i*4), 'i32')); raws.push(Module.getValue(praw + (i*4), 'i32')); } offset += 4; //FLAC__Subframe_Fixed: // unsigned order var order = Module.getValue(p_subframe_data + offset, 'i32'); offset += 4; var warmup = [], res; if(is_lpc){ //FLAC__Subframe_LPC // unsigned qlp_coeff_precision var qlp_coeff_precision = Module.getValue(p_subframe_data + offset, 'i32'); offset += 4; // int quantization_level var quantization_level = Module.getValue(p_subframe_data + offset, 'i32'); offset += 4; //FLAC__Subframe_LPC : // FLAC__int32 qlp_coeff [FLAC__MAX_LPC_ORDER] var qlp_coeff = []; for(var i=0; i < order; ++i){ qlp_coeff.push(Module.getValue(p_subframe_data + offset, 'i32')); offset += 4; } data.qlp_coeff = qlp_coeff; data.qlp_coeff_precision = qlp_coeff_precision; data.quantization_level = quantization_level; //FLAC__Subframe_LPC: // FLAC__int32 warmup [FLAC__MAX_LPC_ORDER] offset = subOffset.offset + 152; offset = _readSubFrameHdrWarmup(p_subframe_data, offset, warmup, order); //FLAC__Subframe_LPC: // const FLAC__int32 * residual if(enc_opt && enc_opt.analyseResiduals){ offset = subOffset.offset + 280; res = _readSubFrameHdrResidual(p_subframe_data + offset, block_size, order); } } else { //FLAC__Subframe_Fixed: // FLAC__int32 warmup [FLAC__MAX_FIXED_ORDER] offset = _readSubFrameHdrWarmup(p_subframe_data, offset, warmup, order); //FLAC__Subframe_Fixed: // const FLAC__int32 * residual offset = subOffset.offset + 32; if(enc_opt && enc_opt.analyseResiduals){ res = _readSubFrameHdrResidual(p_subframe_data + offset, block_size, order); } } subOffset.offset += 284; return { partition: { type: entropyType, data: data }, order: order, warmup: warmup, residual: res } } function _readSubFrameHdrWarmup(p_subframe_data, offset, warmup, order){ // FLAC__int32 warmup [FLAC__MAX_FIXED_ORDER | FLAC__MAX_LPC_ORDER] for(var i=0; i < order; ++i){ warmup.push(Module.getValue(p_subframe_data + offset, 'i32')); offset += 4; } return offset; } function _readSubFrameHdrResidual(p_subframe_data_res, block_size, order){ // const FLAC__int32 * residual var pres = Module.getValue(p_subframe_data_res, 'i32'); var res = [];//Module.getValue(pres, 'i32'); //TODO read residual all values(?) // -> "The residual signal, length == (blocksize minus order) samples. for(var i=0, size = block_size - order; i < size; ++i){ res.push(Module.getValue(pres + (i*4), 'i32')); } return res; } function _readConstChar(ptr, length, sb){ sb.splice(0); var ch; for(var i=0; i < length; ++i){ ch = Module.getValue(ptr + i,'i8'); if(ch === 0){ break; } sb.push(String.fromCodePoint(ch)); } return sb.join(''); } function _readNullTerminatedChar(ptr, sb){ sb.splice(0); var ch = 1, i = 0; while(ch > 0){ ch = Module.getValue(ptr + i++, 'i8'); if(ch === 0){ break; } sb.push(String.fromCodePoint(ch)); } return sb.join(''); } /** * HELPER read/extract padding metadata meta-data from meta-data block * @param {POINTER} p_padding_metadata * @returns PaddingMetadata */ function _readPaddingMetadata(p_padding_metadata){//-> FLAC__StreamMetadata.type (FLAC__MetadataType) === FLAC__METADATA_TYPE_PADDING (1) //FLAC__StreamMetadata_Padding: // int dummy return { dummy: Module.getValue(p_padding_metadata,'i32') } } /** * HELPER read/extract application metadata meta-data from meta-data block * @param {POINTER} p_application_metadata * @returns ApplicationMetadata */ function _readApplicationMetadata(p_application_metadata){//-> FLAC__StreamMetadata.type (FLAC__MetadataType) === FLAC__METADATA_TYPE_APPLICATION (2) //FLAC__StreamMetadata_Application: // FLAC__byte id [4] // FLAC__byte * data return { id : Module.getValue(p_application_metadata,'i32'), data: Module.getValue(p_application_metadata + 4,'i32')//TODO should read (binary) data? } } /** * HELPER read/extract seek table metadata meta-data from meta-data block * @param {POINTER} p_seek_table_metadata * @returns SeekTableMetadata */ function _readSeekTableMetadata(p_seek_table_metadata){//-> FLAC__StreamMetadata.type (FLAC__MetadataType) === FLAC__METADATA_TYPE_SEEKTABLE (3) //FLAC__StreamMetadata_SeekTable: // unsigned num_points // FLAC__StreamMetadata_SeekPoint * points var num_points = Module.getValue(p_seek_table_metadata,'i32'); var ptrPoints = Module.getValue(p_seek_table_metadata + 4,'i32'); var points = []; for(var i=0; i < num_points; ++i){ //FLAC__StreamMetadata_SeekPoint: // FLAC__uint64 sample_number // FLAC__uint64 stream_offset // unsigned frame_samples points.push({ sample_number: Module.getValue(ptrPoints + (i * 24),'i64'), stream_offset: Module.getValue(ptrPoints + (i * 24) + 8,'i64'), frame_samples: Module.getValue(ptrPoints + (i * 24) + 16,'i32') }); } return { num_points: num_points, points: points } } /** * HELPER read/extract vorbis comment meta-data from meta-data block * @param {POINTER} p_vorbiscomment * @returns VorbisComment */ function _readVorbisComment(p_vorbiscomment){//-> FLAC__StreamMetadata.type (FLAC__MetadataType) === FLAC__METADATA_TYPE_VORBIS_COMMENT (4) // FLAC__StreamMetadata_VorbisComment // FLAC__StreamMetadata_VorbisComment_Entry vendor_string: // FLAC__uint32 length // FLAC__byte * entry var length = Module.getValue(p_vorbiscomment,'i32'); var entry = Module.getValue(p_vorbiscomment + 4,'i32'); var sb = []; var strEntry = _readConstChar(entry, length, sb); // FLAC__uint32 num_comments var num_comments = Module.getValue(p_vorbiscomment + 8,'i32'); // FLAC__StreamMetadata_VorbisComment_Entry * comments var comments = [], clen, centry; var pc = Module.getValue(p_vorbiscomment + 12, 'i32') for(var i=0; i < num_comments; ++i){ // FLAC__StreamMetadata_VorbisComment_Entry // FLAC__uint32 length // FLAC__byte * entry clen = Module.getValue(pc + (i*8), 'i32'); if(clen === 0){ continue; } centry = Module.getValue(pc + (i*8) + 4, 'i32'); comments.push(_readConstChar(centry, clen, sb)); } return { vendor_string: strEntry, num_comments: num_comments, comments: comments } } /** * HELPER read/extract cue sheet meta-data from meta-data block * @param {POINTER} p_cue_sheet * @returns CueSheetMetadata */ function _readCueSheetMetadata(p_cue_sheet){//-> FLAC__StreamMetadata.type (FLAC__MetadataType) === FLAC__METADATA_TYPE_CUESHEET (5) // char media_catalog_number [129] // FLAC__uint64 lead_in // FLAC__bool is_cd // unsigned num_tracks // FLAC__StreamMetadata_CueSheet_Track * tracks var sb = []; var media_catalog_number = _readConstChar(p_cue_sheet, 129, sb); var lead_in = Module.getValue(p_cue_sheet + 136,'i64'); var is_cd = Module.getValue(p_cue_sheet + 144,'i8'); var num_tracks = Module.getValue(p_cue_sheet + 148,'i32'); var ptrTrack = Module.getValue(p_cue_sheet + 152,'i32'); var tracks = [], trackOffset = ptrTrack; if(ptrTrack !== 0){ for(var i=0; i < num_tracks; ++i){ var tr = _readCueSheetMetadata_track(trackOffset, sb); tracks.push(tr); trackOffset += 32; } } return { media_catalog_number: media_catalog_number, lead_in: lead_in, is_cd: is_cd, num_tracks: num_tracks, tracks: tracks } } /** * helper read track data for cue-sheet metadata * @param {POINTER} p_cue_sheet_track pointer to the track data * @param {string[]} sb "string buffer" temporary buffer for reading string (may be reset) * @return {CueSheetTrack} */ function _readCueSheetMetadata_track(p_cue_sheet_track, sb){ // FLAC__StreamMetadata_CueSheet_Track: // FLAC__uint64 offset // FLAC__byte number // char isrc [13] // unsigned type:1 // unsigned pre_emphasis:1 // FLAC__byte num_indices // FLAC__StreamMetadata_CueSheet_Index * indices var typePremph = Module.getValue(p_cue_sheet_track + 22,'i8'); var num_indices = Module.getValue(p_cue_sheet_track + 23,'i8'); var indices = []; var track = { offset: Module.getValue(p_cue_sheet_track,'i64'), number: Module.getValue(p_cue_sheet_track + 8,'i8') &255, isrc: _readConstChar(p_cue_sheet_track + 9, 13, sb), type: typePremph & 1? 'NON_AUDIO' : 'AUDIO', pre_emphasis: !!(typePremph & 2), num_indices: num_indices, indices: indices } var idx; if(num_indices > 0){ idx = Module.getValue(p_cue_sheet_track + 24,'i32'); //FLAC__StreamMetadata_CueSheet_Index: // FLAC__uint64 offset // FLAC__byte number for(var i=0; i < num_indices; ++i){ indices.push({ offset: Module.getValue(idx + (i*16),'i64'), number: Module.getValue(idx + (i*16) + 8,'i8') }); } } return track; } /** * HELPER read/extract picture meta-data from meta-data block * @param {POINTER} p_picture_metadata * @returns PictureMetadata */ function _readPictureMetadata(p_picture_metadata){//-> FLAC__StreamMetadata.type (FLAC__MetadataType) === FLAC__METADATA_TYPE_PICTURE (6) // FLAC__StreamMetadata_Picture_Type type // char * mime_type // FLAC__byte * description // FLAC__uint32 width // FLAC__uint32 height // FLAC__uint32 depth // FLAC__uint32 colors // FLAC__uint32 data_length // FLAC__byte * data var type = Module.getValue(p_picture_metadata,'i32'); var mime = Module.getValue(p_picture_metadata + 4,'i32'); var sb = []; var mime_type = _readNullTerminatedChar(mime, sb); var desc = Module.getValue(p_picture_metadata + 8,'i32'); var description = _readNullTerminatedChar(desc, sb); var width = Module.getValue(p_picture_metadata + 12,'i32'); var height = Module.getValue(p_picture_metadata + 16,'i32'); var depth = Module.getValue(p_picture_metadata + 20,'i32'); var colors = Module.getValue(p_picture_metadata + 24,'i32'); var data_length = Module.getValue(p_picture_metadata + 28,'i32'); var data = Module.getValue(p_picture_metadata + 32,'i32'); var buffer = Uint8Array.from(Module.HEAPU8.subarray(data, data + data_length)); return { type: type, mime_type: mime_type, description: description, width: width, height: height, depth: depth, colors: colors, data_length: data_length, data: buffer } } /** * HELPER workaround / fix for returned write-buffer when decoding FLAC * * @param {number} heapOffset * the offset for the data on HEAPU8 * @param {Uint8Array} newBuffer * the target buffer into which the data should be written -- with the correct (block) size * @param {boolean} applyFix * whether or not to apply the data repair heuristics * (handling duplicated/triplicated values in raw data) */ function __fix_write_buffer(heapOffset, newBuffer, applyFix){ var dv = new DataView(newBuffer.buffer); var targetSize = newBuffer.length; var increase = !applyFix? 1 : 2;//<- for FIX/workaround, NOTE: e.g. if 24-bit padding occurres, there is no fix/increase needed (more details comment below) var buffer = HEAPU8.subarray(heapOffset, heapOffset + targetSize * increase); // FIXME for some reason, the bytes values 0 (min) and 255 (max) get "triplicated", // or inserted "doubled" which should be ignored, i.e. // x x x -> x // x x -> // where x is 0 or 255 // -> HACK for now: remove/"over-read" 2 of the values, for each of these triplets/doublications var jump, isPrint; for(var i=0, j=0, size = buffer.length; i < size && j < targetSize; ++i, ++j){ if(i === size-1 && j < targetSize - 1){ //increase heap-view, in order to read more (valid) data into the target buffer buffer = HEAPU8.subarray(heapOffset, size + targetSize); size = buffer.length; } // NOTE if e.g. 24-bit padding occurres, there does not seem to be no duplication/triplication of 255 or 0, so must not try to fix! if(applyFix && (buffer[i] === 0 || buffer[i] === 255)){ jump = 0; isPrint = true; if(i + 1 < size && buffer[i] === buffer[i+1]){ ++jump; if(i + 2 < size){ if(buffer[i] === buffer[i+2]){ ++jump; } else { //if only 2 occurrences: ignore value isPrint = false; } } }//else: if single value: do print (an do not jump) if(isPrint){ dv.setUint8(j, buffer[i]); if(jump === 2 && i + 3 < size && buffer[i] === buffer[i+3]){ //special case for reducing triples in case the following value is also the same // (ie. something like: x x x |+ x) // -> then: do write the value one more time, and jump one further ahead // i.e. if value occurs 4 times in a row, write 2 values ++jump; dv.setUint8(++j, buffer[i]); } } else { --j; } i += jump;//<- apply jump, if there were value duplications } else { dv.setUint8(j, buffer[i]); } } } // FLAC__STREAM_DECODER_READ_STATUS_CONTINUE The read was OK and decoding can continue. // FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM The read was attempted while at the end of the stream. Note that the client must only return this value when the read callback was called when already at the end of the stream. Otherwise, if the read itself moves to the end of the stream, the client should still return the data and FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, and then on the next read callback it should return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM with a byte count of 0. // FLAC__STREAM_DECODER_READ_STATUS_ABORT An unrecoverable error occurred. The decoder will return from the process call. var FLAC__STREAM_DECODER_READ_STATUS_CONTINUE = 0; var FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM = 1; var FLAC__STREAM_DECODER_READ_STATUS_ABORT = 2; // FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE The write was OK and decoding can continue. // FLAC__STREAM_DECODER_WRITE_STATUS_ABORT An unrecoverable error occurred. The decoder will return from the process call. var FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE = 0; var FLAC__STREAM_DECODER_WRITE_STATUS_ABORT = 1; /** * @interface FLAC__StreamDecoderInitStatus * @memberOf Flac * * @property {"FLAC__STREAM_DECODER_INIT_STATUS_OK"} 0 Initialization was successful. * @property {"FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER"} 1 The library was not compiled with support for the given container format. * @property {"FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS"} 2 A required callback was not supplied. * @property {"FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR"} 3 An error occurred allocating memory. * @property {"FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE"} 4 fopen() failed in FLAC__stream_decoder_init_file() or FLAC__stream_decoder_init_ogg_file(). * @property {"FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED"} 5 FLAC__stream_decoder_init_*() was called when the decoder was already initialized, usually because FLAC__stream_decoder_finish() was not called. */ var FLAC__STREAM_DECODER_INIT_STATUS_OK = 0; var FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER = 1; var FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS = 2; var FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR = 3; var FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE = 4; var FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED = 5; /** * @interface FLAC__StreamEncoderInitStatus * @memberOf Flac * * @property {"FLAC__STREAM_ENCODER_INIT_STATUS_OK"} 0 Initialization was successful. * @property {"FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR"} 1 General failure to set up encoder; call FLAC__stream_encoder_get_state() for cause. * @property {"FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER"} 2 The library was not compiled with support for the given container format. * @property {"FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS"} 3 A required callback was not supplied. * @property {"FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS"} 4 The encoder has an invalid setting for number of channels. * @property {"FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE"} 5 The encoder has an invalid setting for bits-per-sample. FLAC supports 4-32 bps but the reference encoder currently supports only up to 24 bps. * @property {"FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE"} 6 The encoder has an invalid setting for the input sample rate. * @property {"FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE"} 7 The encoder has an invalid setting for the block size. * @property {"FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER"} 8 The encoder has an invalid setting for the maximum LPC order. * @property {"FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION"} 9 The encoder has an invalid setting for the precision of the quantized linear predictor coefficients. * @property {"FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER"} 10 The specified block size is less than the maximum LPC order. * @property {"FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE"} 11 The encoder is bound to the Subset but other settings violate it. * @property {"FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA"} 12 The metadata input to the encoder is invalid, in one of the following ways: * FLAC__stream_encoder_set_metadata() was called with a null pointer but a block count > 0 * One of the metadata blocks contains an undefined type * It contains an illegal CUESHEET as checked by FLAC__format_cuesheet_is_legal() * It contains an illegal SEEKTABLE as checked by FLAC__format_seektable_is_legal() * It contains more than one SEEKTABLE block or more than one VORBIS_COMMENT block * @property {"FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED"} 13 FLAC__stream_encoder_init_*() was called when the encoder was already initialized, usually because FLAC__stream_encoder_finish() was not called. */ var FLAC__STREAM_ENCODER_INIT_STATUS_OK = 0; var FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR = 1; var FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER = 2; var FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS = 3; var FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS = 4; var FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE = 5; var FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE = 6; var FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE = 7; var FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER = 8; var FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION = 9; var FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER = 10; var FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE = 11; var FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA = 12; var FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED = 13; //FLAC__STREAM_ENCODER_WRITE_STATUS_OK The write was OK and encoding can continue. //FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR An unrecoverable error occurred. The encoder will return from the process call var FLAC__STREAM_ENCODER_WRITE_STATUS_OK = 0; var FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR = 1; /** * Map for encoder/decoder callback functions * *
[ID] -> {function_type: FUNCTION}
* * type: {[id: number]: {[callback_type: string]: function}} * @private */ var coders = {}; /** * Get a registered callback for the encoder / decoder instance * * @param {Number} p_coder * the encoder/decoder pointer (ID) * @param {String} func_type * the callback type, one of * "write" | "read" | "error" | "metadata" * @returns {Function} the callback (or VOID if there is no callback registered) * @private */ function getCallback(p_coder, func_type){ if(coders[p_coder]){ return coders[p_coder][func_type]; } } /** * Register a callback for an encoder / decoder instance (will / should be deleted, when finish()/delete()) * * @param {Number} p_coder * the encoder/decoder pointer (ID) * @param {String} func_type * the callback type, one of * "write" | "read" | "error" | "metadata" * @param {Function} callback * the callback function * @private */ function setCallback(p_coder, func_type, callback){ if(!coders[p_coder]){ coders[p_coder] = {}; } coders[p_coder][func_type] = callback; } /** * Get coding options for the encoder / decoder instance: * returns FALSY when not set. * * @param {Number} p_coder * the encoder/decoder pointer (ID) * @returns {CodingOptions} the coding options * @private * @memberOf Flac */ function _getOptions(p_coder){ if(coders[p_coder]){ return coders[p_coder]["options"]; } } /** * Set coding options for an encoder / decoder instance (will / should be deleted, when finish()/delete()) * * @param {Number} p_coder * the encoder/decoder pointer (ID) * @param {CodingOptions} options * the coding options * @private * @memberOf Flac */ function _setOptions(p_coder, options){ if(!coders[p_coder]){ coders[p_coder] = {}; } coders[p_coder]["options"] = options; } //(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data) // -> FLAC__StreamEncoderWriteStatus var enc_write_fn_ptr = addFunction(function(p_encoder, buffer, bytes, samples, current_frame, p_client_data){ var retdata = new Uint8Array(bytes); retdata.set(HEAPU8.subarray(buffer, buffer + bytes)); var write_callback_fn = getCallback(p_encoder, 'write'); try{ write_callback_fn(retdata, bytes, samples, current_frame, p_client_data); } catch(err) { console.error(err); return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; } return FLAC__STREAM_ENCODER_WRITE_STATUS_OK; }, 'iiiiiii'); //(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) // -> FLAC__StreamDecoderReadStatus var dec_read_fn_ptr = addFunction(function(p_decoder, buffer, bytes, p_client_data){ //FLAC__StreamDecoderReadCallback, see https://xiph.org/flac/api/group__flac__stream__decoder.html#ga7a5f593b9bc2d163884348b48c4285fd var len = Module.getValue(bytes, 'i32'); if(len === 0){ return FLAC__STREAM_DECODER_READ_STATUS_ABORT; } var read_callback_fn = getCallback(p_decoder, 'read'); //callback must return object with: {buffer: TypedArray, readDataLength: number, error: boolean} var readResult = read_callback_fn(len, p_client_data); //in case of END_OF_STREAM or an error, readResult.readDataLength must be returned with 0 var readLen = readResult.readDataLength; Module.setValue(bytes, readLen, 'i32'); if(readResult.error){ return FLAC__STREAM_DECODER_READ_STATUS_ABORT; } if(readLen === 0){ return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; } var readBuf = readResult.buffer; var dataHeap = new Uint8Array(Module.HEAPU8.buffer, buffer, readLen); dataHeap.set(new Uint8Array(readBuf)); return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; }, 'iiiii'); //(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 *const buffer[], void *client_data) // -> FLAC__StreamDecoderWriteStatus var dec_write_fn_ptr = addFunction(function(p_decoder, p_frame, p_buffer, p_client_data){ // var dec = Module.getValue(p_decoder,'i32'); // var clientData = Module.getValue(p_client_data,'i32'); var dec_opts = _getOptions(p_decoder); var frameInfo = _readFrameHdr(p_frame, dec_opts); // console.log(frameInfo);//DEBUG var channels = frameInfo.channels; var block_size = frameInfo.blocksize * (frameInfo.bitsPerSample / 8); //whether or not to apply data fixing heuristics (e.g. not needed for 24-bit samples) var isFix = frameInfo.bitsPerSample !== 24; //take padding bits into account for calculating buffer size // -> seems to be done for uneven byte sizes, i.e. 1 (8 bits) and 3 (24 bits) var padding = (frameInfo.bitsPerSample / 8)%2; if(padding > 0){ block_size += frameInfo.blocksize * padding; } var data = [];//<- array for the data of each channel var bufferOffset, _buffer; for(var i=0; i < channels; ++i){ bufferOffset = Module.getValue(p_buffer + (i*4),'i32'); _buffer = new Uint8Array(block_size); //FIXME HACK for "strange" data (see helper function __fix_write_buffer) __fix_write_buffer(bufferOffset, _buffer, isFix); data.push(_buffer.subarray(0, block_size)); } var write_callback_fn = getCallback(p_decoder, 'write'); var res = write_callback_fn(data, frameInfo);//, clientData); // FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE The write was OK and decoding can continue. // FLAC__STREAM_DECODER_WRITE_STATUS_ABORT An unrecoverable error occurred. The decoder will return from the process call. return res !== false? FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE : FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; }, 'iiiii'); /** * Decoding error codes. * *
* If the error code is not known, value FLAC__STREAM_DECODER_ERROR__UNKNOWN__ is used. * * @property {"FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC"} 0 An error in the stream caused the decoder to lose synchronization. * @property {"FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER"} 1 The decoder encountered a corrupted frame header. * @property {"FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH"} 2 The frame's data did not match the CRC in the footer. * @property {"FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM"} 3 The decoder encountered reserved fields in use in the stream. * * * @interface FLAC__StreamDecoderErrorStatus * @memberOf Flac */ var DecoderErrorCode = { 0: 'FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC', 1: 'FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER', 2: 'FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH', 3: 'FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM' } //(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) // -> void var dec_error_fn_ptr = addFunction(function(p_decoder, err, p_client_data){ //err: var msg = DecoderErrorCode[err] || 'FLAC__STREAM_DECODER_ERROR__UNKNOWN__';//<- this should never happen; var error_callback_fn = getCallback(p_decoder, 'error'); error_callback_fn(err, msg, p_client_data); }, 'viii'); //(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) -> void //(const FLAC__StreamEncoder *encoder, const FLAC__StreamMetadata *metadata, void *client_data) -> void var metadata_fn_ptr = addFunction(function(p_coder, p_metadata, p_client_data){ /* typedef struct { FLAC__MetadataType type; FLAC__bool is_last; unsigned length; union { FLAC__StreamMetadata_StreamInfo stream_info; FLAC__StreamMetadata_Padding padding; FLAC__StreamMetadata_Application application; FLAC__StreamMetadata_SeekTable seek_table; FLAC__StreamMetadata_VorbisComment vorbis_comment; FLAC__StreamMetadata_CueSheet cue_sheet; FLAC__StreamMetadata_Picture picture; FLAC__StreamMetadata_Unknown unknown; } data; } FLAC__StreamMetadata; */ /* FLAC__METADATA_TYPE_STREAMINFO STREAMINFO block FLAC__METADATA_TYPE_PADDING PADDING block FLAC__METADATA_TYPE_APPLICATION APPLICATION block FLAC__METADATA_TYPE_SEEKTABLE SEEKTABLE block FLAC__METADATA_TYPE_VORBIS_COMMENT VORBISCOMMENT block (a.k.a. FLAC tags) FLAC__METADATA_TYPE_CUESHEET CUESHEET block FLAC__METADATA_TYPE_PICTURE PICTURE block FLAC__METADATA_TYPE_UNDEFINED marker to denote beginning of undefined type range; this number will increase as new metadata types are added FLAC__MAX_METADATA_TYPE No type will ever be greater than this. There is not enough room in the protocol block. */ var type = Module.getValue(p_metadata,'i32');//4 bytes var is_last = Module.getValue(p_metadata+4,'i32');//4 bytes var length = Module.getValue(p_metadata+8,'i64');//8 bytes var meta_data = { type: type, isLast: is_last, length: length, data: void(0) }; var metadata_callback_fn = getCallback(p_coder, 'metadata'); if(type === 0){// === FLAC__METADATA_TYPE_STREAMINFO meta_data.data = _readStreamInfo(p_metadata+16); metadata_callback_fn(meta_data.data, meta_data); } else { var data; switch(type){ case 1: //FLAC__METADATA_TYPE_PADDING data = _readPaddingMetadata(p_metadata+16); break; case 2: //FLAC__METADATA_TYPE_APPLICATION data = readApplicationMetadata(p_metadata+16); break; case 3: //FLAC__METADATA_TYPE_SEEKTABLE data = _readSeekTableMetadata(p_metadata+16); break; case 4: //FLAC__METADATA_TYPE_VORBIS_COMMENT data = _readVorbisComment(p_metadata+16); break; case 5: //FLAC__METADATA_TYPE_CUESHEET data = _readCueSheetMetadata(p_metadata+16); break; case 6: //FLAC__METADATA_TYPE_PICTURE data = _readPictureMetadata(p_metadata+16); break; default: { //NOTE this should not happen, and the raw data is very likely not correct! var cod_opts = _getOptions(p_coder); if(cod_opts && cod_opts.enableRawMetadata){ var buffer = Uint8Array.from(HEAPU8.subarray(p_metadata+16, p_metadata+16+length)); meta_data.raw = buffer; } } } meta_data.data = data; metadata_callback_fn(void(0), meta_data); } }, 'viii'); ////////////// helper fields and functions for event handling // see exported on()/off() functions var listeners = {}; var persistedEvents = []; var add_event_listener = function (eventName, listener){ var list = listeners[eventName]; if(!list){ list = [listener]; listeners[eventName] = list; } else { list.push(listener); } check_and_trigger_persisted_event(eventName, listener); }; var check_and_trigger_persisted_event = function(eventName, listener){ var activated; for(var i=persistedEvents.length-1; i >= 0; --i){ activated = persistedEvents[i]; if(activated && activated.event === eventName){ listener.apply(null, activated.args); break; } } }; var remove_event_listener = function (eventName, listener){ var list = listeners[eventName]; if(list){ for(var i=list.length-1; i >= 0; --i){ if(list[i] === listener){ list.splice(i, 1); } } } }; /** * HELPER: fire an event * @param {string} eventName * the event name * @param {any[]} [args] OPITIONAL * the arguments when triggering the listeners * @param {boolean} [isPersist] OPTIONAL (positinal argument!) * if TRUE, handlers for this event that will be registered after this will get triggered immediately * (i.e. event is "persistent": once triggered it stays "active") * */ var do_fire_event = function (eventName, args, isPersist){ if(_exported['on'+eventName]){ _exported['on'+eventName].apply(null, args); } var list = listeners[eventName]; if(list){ for(var i=0, size=list.length; i < size; ++i){ list[i].apply(null, args) } } if(isPersist){ persistedEvents.push({event: eventName, args: args}); } } ///////////////////////////////////// export / public: ///////////////////////////////////////////// /** * The Flac module that provides functionality * for encoding WAV/PCM audio to Flac and decoding Flac to PCM. * *

*

* NOTE most functions are named analogous to the original C library functions, * so that its documentation may be used for further reading. *

* * @see https://xiph.org/flac/api/group__flac__stream__encoder.html * @see https://xiph.org/flac/api/group__flac__stream__decoder.html * * @class Flac * @namespace Flac */ var _exported = { _module: Module,//internal: reference to Flac module _clear_enc_cb: function(enc_ptr){//internal function: remove reference to encoder instance and its callbacks delete coders[enc_ptr]; }, _clear_dec_cb: function(dec_ptr){//internal function: remove reference to decoder instance and its callbacks delete coders[dec_ptr]; }, /** * Additional options for encoding or decoding * @interface CodingOptions * @memberOf Flac * @property {boolean} [analyseSubframes] for decoding: include subframes metadata in write-callback metadata, DEFAULT: false * @property {boolean} [analyseResiduals] for decoding: include residual data in subframes metadata in write-callback metadata, NOTE {@link #analyseSubframes} muste also be enabled, DEFAULT: false * @property {boolean} [enableRawMetadata] DEBUG option for decoding: enable receiving raw metadata for unknown metadata types in second argument in the metadata-callback, DEFAULT: false * * @see Flac#setOptions * @see Flac~metadata_callback_fn * @see Flac#FLAC__stream_decoder_set_metadata_respond_all */ /** * FLAC raw metadata * * @interface MetadataBlock * @memberOf Flac * @property {Flac.FLAC__MetadataType} type the type of the metadata * @property {boolean} isLast if it is the last block of metadata * @property {number} length the length of the metadata block (bytes) * @property {Flac.StreamMetadata | Flac.PaddingMetadata | Flac.ApplicationMetadata | Flac.SeekTableMetadata | Flac.CueSheetMetadata | Flac.PictureMetadata} [data] the metadata (omitted for unknown metadata types) * @property {Uint8Array} [raw] raw metadata (for debugging: enable via {@link Flac#setOptions}) */ /** * FLAC padding metadata block * * @interface PaddingMetadata * @memberOf Flac * @property {number} dummy Conceptually this is an empty struct since we don't store the padding bytes. Empty structs are not allowed by some C compilers, hence the dummy. * * @see Flac.FLAC__MetadataType#FLAC__METADATA_TYPE_PADDING */ /** * FLAC application metadata block * * NOTE the application meta data type is not really supported, i.e. the * (binary) data is only a pointer to the memory heap. * * @interface ApplicationMetadata * @memberOf Flac * @property {number} id the application ID * @property {number} data (pointer) * * @see Flac.FLAC__MetadataType#FLAC__METADATA_TYPE_APPLICATION * @see application block format specification */ /** * FLAC seek table metadata block * *

* From the format specification: * * The seek points must be sorted by ascending sample number. * * Each seek point's sample number must be the first sample of the target frame. * * Each seek point's sample number must be unique within the table * * Existence of a SEEKTABLE block implies a correct setting of total_samples in the stream_info block. * * Behavior is undefined when more than one SEEKTABLE block is present in a stream. * * @interface SeekTableMetadata * @memberOf Flac * @property {number} num_points the number of seek points * @property {Flac.SeekPoint[]} points the seek points * * @see Flac.FLAC__MetadataType#FLAC__METADATA_TYPE_SEEKTABLE */ /** * FLAC seek point data * * @interface SeekPoint * @memberOf Flac * @property {number} sample_number The sample number of the target frame. NOTE -1 for a placeholder point. * @property {number} stream_offset The offset, in bytes, of the target frame with respect to beginning of the first frame. * @property {number} frame_samples The number of samples in the target frame. * * @see Flac.SeekTableMetadata */ /** * FLAC vorbis comment metadata block * * @interface VorbisCommentMetadata * @memberOf Flac * @property {string} vendor_string the vendor string * @property {number} num_comments the number of comments * @property {string[]} comments the comments * * @see Flac.FLAC__MetadataType#FLAC__METADATA_TYPE_VORBIS_COMMENT */ /** * FLAC cue sheet metadata block * * @interface CueSheetMetadata * @memberOf Flac * @property {string} media_catalog_number Media catalog number, in ASCII printable characters 0x20-0x7e. In general, the media catalog number may be 0 to 128 bytes long. * @property {number} lead_in The number of lead-in samples. * @property {boolean} is_cd true if CUESHEET corresponds to a Compact Disc, else false. * @property {number} num_tracks The number of tracks. * @property {Flac.CueSheetTrack[]} tracks the tracks * * @see Flac.FLAC__MetadataType#FLAC__METADATA_TYPE_CUESHEET */ /** * FLAC cue sheet track data * * @interface CueSheetTrack * @memberOf Flac * @property {number} offset Track offset in samples, relative to the beginning of the FLAC audio stream. * @property {number} number The track number. * @property {string} isrc Track ISRC. This is a 12-digit alphanumeric code. * @property {"AUDIO" | "NON_AUDIO"} type The track type: audio or non-audio. * @property {boolean} pre_emphasis The pre-emphasis flag * @property {number} num_indices The number of track index points. * @property {Flac.CueSheetTracIndex} indices The track index points. * * @see Flac.CueSheetMetadata */ /** * FLAC track index data for cue sheet metadata * * @interface CueSheetTracIndex * @memberOf Flac * @property {number} offset Offset in samples, relative to the track offset, of the index point. * @property {number} number The index point number. * * @see Flac.CueSheetTrack */ /** * FLAC picture metadata block * * @interface PictureMetadata * @memberOf Flac * @property {Flac.FLAC__StreamMetadata_Picture_Type} type The kind of picture stored. * @property {string} mime_type Picture data's MIME type, in ASCII printable characters 0x20-0x7e, NUL terminated. For best compatibility with players, use picture data of MIME type image/jpeg or image/png. A MIME type of '–>' is also allowed, in which case the picture data should be a complete URL. * @property {string} description Picture's description. * @property {number} width Picture's width in pixels. * @property {number} height Picture's height in pixels. * @property {number} depth Picture's color depth in bits-per-pixel. * @property {number} colors For indexed palettes (like GIF), picture's number of colors (the number of palette entries), or 0 for non-indexed (i.e. 2^depth). * @property {number} data_length Length of binary picture data in bytes. * @property {Uint8Array} data Binary picture data. */ /** * An enumeration of the PICTURE types (see FLAC__StreamMetadataPicture and id3 v2.4 APIC tag). * * @interface FLAC__StreamMetadata_Picture_Type * @memberOf Flac * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER"} 0 Other * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD"} 1 32x32 pixels 'file icon' (PNG only) * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON"} 2 Other file icon * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER"} 3 Cover (front) * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_BACK_COVER"} 4 Cover (back) * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_LEAFLET_PAGE"} 5 Leaflet page * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_MEDIA"} 6 Media (e.g. label side of CD) * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_LEAD_ARTIST"} 7 Lead artist/lead performer/soloist * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_ARTIST"} 8 Artist/performer * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_CONDUCTOR"} 9 Conductor * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_BAND"} 10 Band/Orchestra * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_COMPOSER"} 11 Composer * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_LYRICIST"} 12 Lyricist/text writer * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_RECORDING_LOCATION"} 13 Recording Location * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_RECORDING"} 14 During recording * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_PERFORMANCE"} 15 During performance * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_VIDEO_SCREEN_CAPTURE"} 16 Movie/video screen capture * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_FISH"} 17 A bright coloured fish * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_ILLUSTRATION"} 18 Illustration * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_BAND_LOGOTYPE"} 19 Band/artist logotype * @property {"FLAC__STREAM_METADATA_PICTURE_TYPE_PUBLISHER_LOGOTYPE"} 20 Publisher/Studio logotype * * @see Flac.PictureMetadata */ /** * An enumeration of the available metadata block types. * * @interface FLAC__MetadataType * @memberOf Flac * * @property {"FLAC__METADATA_TYPE_STREAMINFO"}  0 STREAMINFO block * @property {"FLAC__METADATA_TYPE_PADDING"}  1 PADDING block * @property {"FLAC__METADATA_TYPE_APPLICATION"}  2 APPLICATION block * @property {"FLAC__METADATA_TYPE_SEEKTABLE"}  3 SEEKTABLE block * @property {"FLAC__METADATA_TYPE_VORBIS_COMMENT"}  4 VORBISCOMMENT block (a.k.a. FLAC tags) * @property {"FLAC__METADATA_TYPE_CUESHEET"}  5 CUESHEET block * @property {"FLAC__METADATA_TYPE_PICTURE"}  6 PICTURE block * @property {"FLAC__METADATA_TYPE_UNDEFINED"}  7 marker to denote beginning of undefined type range; this number will increase as new metadata types are added * @property {"FLAC__MAX_METADATA_TYPE"}  126 No type will ever be greater than this. There is not enough room in the protocol block. * * @see Flac.MetadataBlock * @see FLAC format documentation */ /** * @function * @public * @memberOf Flac# * @copydoc Flac._setOptions */ setOptions: _setOptions, /** * @function * @public * @memberOf Flac# * @copydoc Flac._getOptions */ getOptions: _getOptions, /** * Returns if Flac has been initialized / is ready to be used. * * @returns {boolean} true, if Flac is ready to be used * * @memberOf Flac# * @function * @see #onready * @see #on */ isReady: function() { return _flac_ready; }, /** * Hook for handler function that gets called, when asynchronous initialization has finished. * * NOTE that if the execution environment does not support Object#defineProperty, then * this function is not called, after {@link #isReady} is true. * In this case, {@link #isReady} should be checked, before setting onready * and if it is true, handler should be executed immediately instead of setting onready. * * @memberOf Flac# * @function * @param {Flac.event:ReadyEvent} event the ready-event object * @see #isReady * @see #on * @default undefined * @example * // [1] if Object.defineProperty() IS supported: * Flac.onready = function(event){ * //gets executed when library becomes ready, or immediately, if it already is ready... * doSomethingWithFlac(); * }; * * // [2] if Object.defineProperty() is NOT supported: * // do check Flac.isReady(), and only set handler, if not ready yet * // (otherwise immediately excute handler code) * if(!Flac.isReady()){ * Flac.onready = function(event){ * //gets executed when library becomes ready... * doSomethingWithFlac(); * }; * } else { * // Flac is already ready: immediately start processing * doSomethingWithFlac(); * } */ onready: void(0), /** * Ready event: is fired when the library has been initialized and is ready to be used * (e.g. asynchronous loading of binary / WASM modules has been completed). * * Before this event is fired, use of functions related to encoding and decoding may * cause errors. * * @event ReadyEvent * @memberOf Flac * @type {object} * @property {"ready"} type the type of the event "ready" * @property {Flac} target the initalized FLAC library instance * * @see #isReady * @see #on */ /** * Created event: is fired when an encoder or decoder was created. * * @event CreatedEvent * @memberOf Flac * @type {object} * @property {"created"} type the type of the event "created" * @property {Flac.CoderChangedEventData} target the information for the created encoder or decoder * * @see #on */ /** * Destroyed event: is fired when an encoder or decoder was destroyed. * * @event DestroyedEvent * @memberOf Flac * @type {object} * @property {"destroyed"} type the type of the event "destroyed" * @property {Flac.CoderChangedEventData} target the information for the destroyed encoder or decoder * * @see #on */ /** * Life cycle event data for signaling life cycle changes of encoder or decoder instances * @interface CoderChangedEventData * @memberOf Flac * @property {number} id the ID for the encoder or decoder instance * @property {"encoder" | "decoder"} type signifies whether the event is for an encoder or decoder instance * @property {any} [data] specific data for the life cycle change * * @see Flac.event:CreatedEvent * @see Flac.event:DestroyedEvent */ /** * Add an event listener for module-events. * Supported events: *

    *
  • "ready" → {@link Flac.event:ReadyEvent}: emitted when module is ready for usage (i.e. {@link #isReady} is true)
    * NOTE listener will get immediately triggered if module is already "ready" *
  • *
  • "created" → {@link Flac.event:CreatedEvent}: emitted when an encoder or decoder instance was created
    *
  • *
  • "destroyed" → {@link Flac.event:DestroyedEvent}: emitted when an encoder or decoder instance was destroyed
    *
  • *
* * @param {string} eventName * @param {Function} listener * * @memberOf Flac# * @function * @see #off * @see #onready * @see Flac.event:ReadyEvent * @see Flac.event:CreatedEvent * @see Flac.event:DestroyedEvent * @example * Flac.on('ready', function(event){ * //gets executed when library is ready, or becomes ready... * }); */ on: add_event_listener, /** * Remove an event listener for module-events. * @param {string} eventName * @param {Function} listener * * @memberOf Flac# * @function * @see #on */ off: remove_event_listener, /** * Set the "verify" flag. If true, the encoder will verify it's own encoded output by feeding it through an internal decoder and comparing the original signal against the decoded signal. If a mismatch occurs, the process call will return false. Note that this will slow the encoding process by the extra time required for decoding and comparison. * *

* NOTE: only use on un-initilized encoder instances! * * @param {number} encoder * the ID of the encoder instance * * @param {boolean} is_verify enable/disable checksum verification during encoding * * @returns {boolean} false if the encoder is already initialized, else true * * @see #create_libflac_encoder * @see #FLAC__stream_encoder_get_verify * * @memberOf Flac# * @function */ FLAC__stream_encoder_set_verify: function(encoder, is_verify){ is_verify = is_verify? 1 : 0; Module.ccall('FLAC__stream_encoder_set_verify', 'number', ['number', 'number'], [ encoder, is_verify ]); }, /** * Set the compression level * * The compression level is roughly proportional to the amount of effort the encoder expends to compress the file. A higher level usually means more computation but higher compression. The default level is suitable for most applications. * * Currently the levels range from 0 (fastest, least compression) to 8 (slowest, most compression). A value larger than 8 will be treated as 8. * * *

* NOTE: only use on un-initilized encoder instances! * * @param {number} encoder * the ID of the encoder instance * * @param {Flac.CompressionLevel} compression_level the desired Flac compression level: [0, 8] * * @returns {boolean} false if the encoder is already initialized, else true * * @see #create_libflac_encoder * @see Flac.CompressionLevel * @see FLAC API for FLAC__stream_encoder_set_compression_level() * * @memberOf Flac# * @function */ FLAC__stream_encoder_set_compression_level: Module.cwrap('FLAC__stream_encoder_set_compression_level', 'number', [ 'number', 'number' ]), /** * Set the blocksize to use while encoding. * The number of samples to use per frame. Use 0 to let the encoder estimate a blocksize; this is usually best. * *

* NOTE: only use on un-initilized encoder instances! * * @param {number} encoder * the ID of the encoder instance * * @param {number} block_size the number of samples to use per frame * * @returns {boolean} false if the encoder is already initialized, else true * * @see #create_libflac_encoder * * @memberOf Flac# * @function */ FLAC__stream_encoder_set_blocksize: Module.cwrap('FLAC__stream_encoder_set_blocksize', 'number', [ 'number', 'number']), /** * Get the state of the verify stream decoder. Useful when the stream encoder state is FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR. * * @param {number} encoder * the ID of the encoder instance * * @returns {Flac.FLAC__StreamDecoderState} the verify stream decoder state * * @memberOf Flac# * @function */ FLAC__stream_encoder_get_verify_decoder_state: Module.cwrap('FLAC__stream_encoder_get_verify_decoder_state', 'number', ['number']), /** * Get the "verify" flag for the encoder. * * @param {number} encoder * the ID of the encoder instance * * @returns {boolean} the verify flag for the encoder * * * @memberOf Flac# * @function * * @see #FLAC__stream_encoder_set_verify */ FLAC__stream_encoder_get_verify: Module.cwrap('FLAC__stream_encoder_get_verify', 'number', ['number']), /* TODO export other encoder API functions?: FLAC__bool FLAC__stream_encoder_set_channels (FLAC__StreamEncoder *encoder, unsigned value) FLAC__bool FLAC__stream_encoder_set_bits_per_sample (FLAC__StreamEncoder *encoder, unsigned value) FLAC__bool FLAC__stream_encoder_set_sample_rate (FLAC__StreamEncoder *encoder, unsigned value) FLAC__bool FLAC__stream_encoder_set_do_mid_side_stereo (FLAC__StreamEncoder *encoder, FLAC__bool value) FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo (FLAC__StreamEncoder *encoder, FLAC__bool value) FLAC__bool FLAC__stream_encoder_set_apodization (FLAC__StreamEncoder *encoder, const char *specification) FLAC__bool FLAC__stream_encoder_set_max_lpc_order (FLAC__StreamEncoder *encoder, unsigned value) FLAC__bool FLAC__stream_encoder_set_qlp_coeff_precision (FLAC__StreamEncoder *encoder, unsigned value) FLAC__bool FLAC__stream_encoder_set_do_qlp_coeff_prec_search (FLAC__StreamEncoder *encoder, FLAC__bool value) FLAC__bool FLAC__stream_encoder_set_do_escape_coding (FLAC__StreamEncoder *encoder, FLAC__bool value) FLAC__bool FLAC__stream_encoder_set_do_exhaustive_model_search (FLAC__StreamEncoder *encoder, FLAC__bool value) FLAC__bool FLAC__stream_encoder_set_min_residual_partition_order (FLAC__StreamEncoder *encoder, unsigned value) FLAC__bool FLAC__stream_encoder_set_max_residual_partition_order (FLAC__StreamEncoder *encoder, unsigned value) FLAC__bool FLAC__stream_encoder_set_rice_parameter_search_dist (FLAC__StreamEncoder *encoder, unsigned value) FLAC__bool FLAC__stream_encoder_get_streamable_subset (const FLAC__StreamEncoder *encoder) unsigned FLAC__stream_encoder_get_channels (const FLAC__StreamEncoder *encoder) unsigned FLAC__stream_encoder_get_bits_per_sample (const FLAC__StreamEncoder *encoder) unsigned FLAC__stream_encoder_get_sample_rate (const FLAC__StreamEncoder *encoder) unsigned FLAC__stream_encoder_get_blocksize (const FLAC__StreamEncoder *encoder) FLAC__bool FLAC__stream_encoder_get_do_mid_side_stereo (const FLAC__StreamEncoder *encoder) FLAC__bool FLAC__stream_encoder_get_loose_mid_side_stereo (const FLAC__StreamEncoder *encoder) unsigned FLAC__stream_encoder_get_max_lpc_order (const FLAC__StreamEncoder *encoder) unsigned FLAC__stream_encoder_get_qlp_coeff_precision (const FLAC__StreamEncoder *encoder) FLAC__bool FLAC__stream_encoder_get_do_qlp_coeff_prec_search (const FLAC__StreamEncoder *encoder) FLAC__bool FLAC__stream_encoder_get_do_escape_coding (const FLAC__StreamEncoder *encoder) FLAC__bool FLAC__stream_encoder_get_do_exhaustive_model_search (const FLAC__StreamEncoder *encoder) unsigned FLAC__stream_encoder_get_min_residual_partition_order (const FLAC__StreamEncoder *encoder) unsigned FLAC__stream_encoder_get_max_residual_partition_order (const FLAC__StreamEncoder *encoder) unsigned FLAC__stream_encoder_get_rice_parameter_search_dist (const FLAC__StreamEncoder *encoder) FLAC__uint64 FLAC__stream_encoder_get_total_samples_estimate (const FLAC__StreamEncoder *encoder) TODO export other decoder API functions?: const char * FLAC__stream_decoder_get_resolved_state_string (const FLAC__StreamDecoder *decoder) FLAC__uint64 FLAC__stream_decoder_get_total_samples (const FLAC__StreamDecoder *decoder) unsigned FLAC__stream_decoder_get_channels (const FLAC__StreamDecoder *decoder) unsigned FLAC__stream_decoder_get_bits_per_sample (const FLAC__StreamDecoder *decoder) unsigned FLAC__stream_decoder_get_sample_rate (const FLAC__StreamDecoder *decoder) unsigned FLAC__stream_decoder_get_blocksize (const FLAC__StreamDecoder *decoder) FLAC__bool FLAC__stream_decoder_flush (FLAC__StreamDecoder *decoder) FLAC__bool FLAC__stream_decoder_skip_single_frame (FLAC__StreamDecoder *decoder) */ /** * Set the compression level * * The compression level is roughly proportional to the amount of effort the encoder expends to compress the file. A higher level usually means more computation but higher compression. The default level is suitable for most applications. * * Currently the levels range from 0 (fastest, least compression) to 8 (slowest, most compression). A value larger than 8 will be treated as 8. * * This function automatically calls the following other set functions with appropriate values, so the client does not need to unless it specifically wants to override them: *

	 *     FLAC__stream_encoder_set_do_mid_side_stereo()
	 *     FLAC__stream_encoder_set_loose_mid_side_stereo()
	 *     FLAC__stream_encoder_set_apodization()
	 *     FLAC__stream_encoder_set_max_lpc_order()
	 *     FLAC__stream_encoder_set_qlp_coeff_precision()
	 *     FLAC__stream_encoder_set_do_qlp_coeff_prec_search()
	 *     FLAC__stream_encoder_set_do_escape_coding()
	 *     FLAC__stream_encoder_set_do_exhaustive_model_search()
	 *     FLAC__stream_encoder_set_min_residual_partition_order()
	 *     FLAC__stream_encoder_set_max_residual_partition_order()
	 *     FLAC__stream_encoder_set_rice_parameter_search_dist()
	 * 
* The actual values set for each level are: * | level | do mid-side stereo | loose mid-side stereo | apodization | max lpc order | qlp coeff precision | qlp coeff prec search | escape coding | exhaustive model search | min residual partition order | max residual partition order | rice parameter search dist | * |--------|---------------------|------------------------|------------------------------------------------|----------------|----------------------|------------------------|----------------|--------------------------|-------------------------------|-------------------------------|------------------------------| * | 0 | false | false | tukey(0.5) | 0 | 0 | false | false | false | 0 | 3 | 0 | * | 1 | true | true | tukey(0.5) | 0 | 0 | false | false | false | 0 | 3 | 0 | * | 2 | true | false | tukey(0.5) | 0 | 0 | false | false | false | 0 | 3 | 0 | * | 3 | false | false | tukey(0.5) | 6 | 0 | false | false | false | 0 | 4 | 0 | * | 4 | true | true | tukey(0.5) | 8 | 0 | false | false | false | 0 | 4 | 0 | * | 5 | true | false | tukey(0.5) | 8 | 0 | false | false | false | 0 | 5 | 0 | * | 6 | true | false | tukey(0.5);partial_tukey(2) | 8 | 0 | false | false | false | 0 | 6 | 0 | * | 7 | true | false | tukey(0.5);partial_tukey(2) | 12 | 0 | false | false | false | 0 | 6 | 0 | * | 8 | true | false | tukey(0.5);partial_tukey(2);punchout_tukey(3) | 12 | 0 | false | false | false | 0 | 6 | 0 | * * @interface CompressionLevel * @memberOf Flac * * @property {"FLAC__COMPRESSION_LEVEL_0"} 0 compression level 0 * @property {"FLAC__COMPRESSION_LEVEL_1"} 1 compression level 1 * @property {"FLAC__COMPRESSION_LEVEL_2"} 2 compression level 2 * @property {"FLAC__COMPRESSION_LEVEL_3"} 3 compression level 3 * @property {"FLAC__COMPRESSION_LEVEL_4"} 4 compression level 4 * @property {"FLAC__COMPRESSION_LEVEL_5"} 5 compression level 5 * @property {"FLAC__COMPRESSION_LEVEL_6"} 6 compression level 6 * @property {"FLAC__COMPRESSION_LEVEL_7"} 7 compression level 7 * @property {"FLAC__COMPRESSION_LEVEL_8"} 8 compression level 8 */ /** * Create an encoder. * * @param {number} sample_rate * the sample rate of the input PCM data * @param {number} channels * the number of channels of the input PCM data * @param {number} bps * bits per sample of the input PCM data * @param {Flac.CompressionLevel} compression_level * the desired Flac compression level: [0, 8] * @param {number} [total_samples] OPTIONAL * the number of total samples of the input PCM data:
* Sets an estimate of the total samples that will be encoded. * This is merely an estimate and may be set to 0 if unknown. * This value will be written to the STREAMINFO block before encoding, * and can remove the need for the caller to rewrite the value later if * the value is known before encoding.
* If specified, the it will be written into metadata of the FLAC header.
* DEFAULT: 0 (i.e. unknown number of samples) * @param {boolean} [is_verify] OPTIONAL * enable/disable checksum verification during encoding
* DEFAULT: true
* NOTE: this argument is positional (i.e. total_samples must also be given) * @param {number} [block_size] OPTIONAL * the number of samples to use per frame.
* DEFAULT: 0 (i.e. encoder sets block size automatically) * NOTE: this argument is positional (i.e. total_samples and is_verify must also be given) * * * @returns {number} the ID of the created encoder instance (or 0, if there was an error) * * @memberOf Flac# * @function */ create_libflac_encoder: function(sample_rate, channels, bps, compression_level, total_samples, is_verify, block_size){ is_verify = typeof is_verify === 'undefined'? 1 : is_verify + 0; total_samples = typeof total_samples === 'number'? total_samples : 0; block_size = typeof block_size === 'number'? block_size : 0; var ok = true; var encoder = Module.ccall('FLAC__stream_encoder_new', 'number', [ ], [ ]); ok &= Module.ccall('FLAC__stream_encoder_set_verify', 'number', ['number', 'number'], [ encoder, is_verify ]); ok &= Module.ccall('FLAC__stream_encoder_set_compression_level', 'number', ['number', 'number'], [ encoder, compression_level ]); ok &= Module.ccall('FLAC__stream_encoder_set_channels', 'number', ['number', 'number'], [ encoder, channels ]); ok &= Module.ccall('FLAC__stream_encoder_set_bits_per_sample', 'number', ['number', 'number'], [ encoder, bps ]); ok &= Module.ccall('FLAC__stream_encoder_set_sample_rate', 'number', ['number', 'number'], [ encoder, sample_rate ]); ok &= Module.ccall('FLAC__stream_encoder_set_blocksize', 'number', [ 'number', 'number'], [ encoder, block_size ]); ok &= Module.ccall('FLAC__stream_encoder_set_total_samples_estimate', 'number', ['number', 'number'], [ encoder, total_samples ]); if (ok){ do_fire_event('created', [{type: 'created', target: {id: encoder, type: 'encoder'}}], false); return encoder; } return 0; }, /** * @deprecated use {@link #create_libflac_encoder} instead * @memberOf Flac# * @function */ init_libflac_encoder: function(){ console.warn('Flac.init_libflac_encoder() is deprecated, use Flac.create_libflac_encoder() instead!'); return this.create_libflac_encoder.apply(this, arguments); }, /** * Create a decoder. * * @param {boolean} [is_verify] * enable/disable checksum verification during decoding
* DEFAULT: true * * @returns {number} the ID of the created decoder instance (or 0, if there was an error) * * @memberOf Flac# * @function */ create_libflac_decoder: function(is_verify){ is_verify = typeof is_verify === 'undefined'? 1 : is_verify + 0; var ok = true; var decoder = Module.ccall('FLAC__stream_decoder_new', 'number', [ ], [ ]); ok &= Module.ccall('FLAC__stream_decoder_set_md5_checking', 'number', ['number', 'number'], [ decoder, is_verify ]); if (ok){ do_fire_event('created', [{type: 'created', target: {id: decoder, type: 'decoder'}}], false); return decoder; } return 0; }, /** * @deprecated use {@link #create_libflac_decoder} instead * @memberOf Flac# * @function */ init_libflac_decoder: function(){ console.warn('Flac.init_libflac_decoder() is deprecated, use Flac.create_libflac_decoder() instead!'); return this.create_libflac_decoder.apply(this, arguments); }, /** * The callback for writing the encoded FLAC data. * * @callback Flac~encoder_write_callback_fn * @param {Uint8Array} data the encoded FLAC data * @param {number} numberOfBytes the number of bytes in data * @param {number} samples the number of samples encoded in data * @param {number} currentFrame the number of the (current) encoded frame in data * @returns {void | false} returning false indicates that an * unrecoverable error occurred and decoding should be aborted */ /** * The callback for the metadata of the encoded/decoded Flac data. * * By default, only the STREAMINFO metadata is enabled. * * For other metadata types {@link Flac.FLAC__MetadataType} they need to be enabled, * see e.g. {@link Flac#FLAC__stream_decoder_set_metadata_respond} * * @callback Flac~metadata_callback_fn * @param {Flac.StreamMetadata | undefined} metadata the FLAC meta data, NOTE only STREAMINFO is returned in first argument, for other types use 2nd argument's metadataBlock.data * @param {Flac.MetadataBlock} metadataBlock the detailed meta data block * * @see Flac#init_decoder_stream * @see Flac#init_encoder_stream * @see Flac.CodingOptions * @see Flac#FLAC__stream_decoder_set_metadata_respond_all */ /** * FLAC meta data * @interface Metadata * @memberOf Flac * @property {number} sampleRate the sample rate (Hz) * @property {number} channels the number of channels * @property {number} bitsPerSample bits per sample */ /** * FLAC stream meta data * @interface StreamMetadata * @memberOf Flac * @augments Flac.Metadata * @property {number} min_blocksize the minimal block size (bytes) * @property {number} max_blocksize the maximal block size (bytes) * @property {number} min_framesize the minimal frame size (bytes) * @property {number} max_framesize the maximal frame size (bytes) * @property {number} total_samples the total number of (encoded/decoded) samples * @property {string} md5sum the MD5 checksum for the decoded data (if validation is active) */ /** * Initialize the encoder. * * @param {number} encoder * the ID of the encoder instance that has not been initialized (or has been reset) * * @param {Flac~encoder_write_callback_fn} write_callback_fn * the callback for writing the encoded Flac data: *
write_callback_fn(data: Uint8Array, numberOfBytes: Number, samples: Number, currentFrame: Number)
* * @param {Flac~metadata_callback_fn} [metadata_callback_fn] OPTIONAL * the callback for the metadata of the encoded Flac data: *
metadata_callback_fn(metadata: StreamMetadata)
* * @param {number|boolean} [ogg_serial_number] OPTIONAL * if number or true is specified, the encoder will be initialized to * write to an OGG container, see {@link Flac.init_encoder_ogg_stream}: * true will set a default serial number (1), * if specified as number, it will be used as the stream's serial number within the ogg container. * * @returns {Flac.FLAC__StreamEncoderInitStatus} the encoder status (0 for FLAC__STREAM_ENCODER_INIT_STATUS_OK) * * @memberOf Flac# * @function */ init_encoder_stream: function(encoder, write_callback_fn, metadata_callback_fn, ogg_serial_number, client_data){ var is_ogg = (ogg_serial_number === true); client_data = client_data|0; if(typeof write_callback_fn !== 'function'){ return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS; } setCallback(encoder, 'write', write_callback_fn); var __metadata_callback_fn_ptr = 0; if(typeof metadata_callback_fn === 'function'){ setCallback(encoder, 'metadata', metadata_callback_fn); __metadata_callback_fn_ptr = metadata_fn_ptr; } //NOTE the following comments are used for auto-detecting exported functions (only change if ccall function name(s) change!): // Module.ccall('FLAC__stream_encoder_init_stream' var func_name = 'FLAC__stream_encoder_init_stream'; var args_types = ['number', 'number', 'number', 'number', 'number', 'number']; var args = [ encoder, enc_write_fn_ptr, 0,// FLAC__StreamEncoderSeekCallback 0,// FLAC__StreamEncoderTellCallback __metadata_callback_fn_ptr, client_data ]; if(typeof ogg_serial_number === 'number'){ is_ogg = true; } else if(is_ogg){//else: set default serial number for stream in OGG container //NOTE from FLAC docs: "It is recommended to set a serial number explicitly as the default of '0' may collide with other streams." ogg_serial_number = 1; } if(is_ogg){ //NOTE the following comments are used for auto-detecting exported functions (only change if ccall function name(s) change!): // Module.ccall('FLAC__stream_encoder_init_ogg_stream' func_name = 'FLAC__stream_encoder_init_ogg_stream'; //2nd arg: FLAC__StreamEncoderReadCallback ptr -> duplicate first entry & insert at [1] args.unshift(args[0]); args[1] = 0;// FLAC__StreamEncoderReadCallback args_types.unshift(args_types[0]); args_types[1] = 'number'; //NOTE ignore BOOL return value when setting serial number, since init-call's returned // status will also indicate, if encoder already has been initialized Module.ccall( 'FLAC__stream_encoder_set_ogg_serial_number', 'number', ['number', 'number'], [ encoder, ogg_serial_number ] ); } var init_status = Module.ccall(func_name, 'number', args_types, args); return init_status; }, /** * Initialize the encoder for writing to an OGG container. * * @param {number} [ogg_serial_number] OPTIONAL * the serial number for the stream in the OGG container * DEFAULT: 1 * * @memberOf Flac# * @function * @copydoc #init_encoder_stream */ init_encoder_ogg_stream: function(encoder, write_callback_fn, metadata_callback_fn, ogg_serial_number, client_data){ if(typeof ogg_serial_number !== 'number'){ ogg_serial_number = true; } return this.init_encoder_stream(encoder, write_callback_fn, metadata_callback_fn, ogg_serial_number, client_data); }, /** * Result / return value for {@link Flac~decoder_read_callback_fn} callback function * * @interface ReadResult * @memberOf Flac * @property {TypedArray} buffer a TypedArray (e.g. Uint8Array) with the read data * @property {number} readDataLength the number of read data bytes. A number of 0 (zero) indicates that the end-of-stream is reached. * @property {boolean} [error] OPTIONAL value of true indicates that an error occured (decoding will be aborted) */ /** * Result / return value for {@link Flac~decoder_read_callback_fn} callback function for signifying that there is no more data to read * * @interface CompletedReadResult * @memberOf Flac * @augments Flac.ReadResult * @property {TypedArray | undefined} buffer a TypedArray (e.g. Uint8Array) with the read data (will be ignored in case readDataLength is 0) * @property {0} readDataLength the number of read data bytes: The number of 0 (zero) indicates that the end-of-stream is reached. */ /** * The callback for reading the FLAC data that will be decoded. * * @callback Flac~decoder_read_callback_fn * @param {number} numberOfBytes the maximal number of bytes that the read callback can return * @returns {Flac.ReadResult | Flac.CompletedReadResult} the result of the reading action/request */ /** * The callback for writing the decoded FLAC data. * * @callback Flac~decoder_write_callback_fn * @param {Uint8Array[]} data array of the channels with the decoded PCM data as Uint8Arrays * @param {Flac.BlockMetadata} frameInfo the metadata information for the decoded data */ /** * The callback for reporting decoding errors. * * @callback Flac~decoder_error_callback_fn * @param {number} errorCode the error code * @param {Flac.FLAC__StreamDecoderErrorStatus} errorDescription the string representation / description of the error */ /** * FLAC block meta data * @interface BlockMetadata * @augments Flac.Metadata * @memberOf Flac * * @property {number} blocksize the block size (bytes) * @property {number} number the number of the decoded samples or frames * @property {string} numberType the type to which number refers to: either "frames" or "samples" * @property {Flac.FLAC__ChannelAssignment} channelAssignment the channel assignment * @property {string} crc the MD5 checksum for the decoded data, if validation is enabled * @property {Flac.SubFrameMetadata[]} [subframes] the metadata of the subframes. The array length corresponds to the number of channels. NOTE will only be included if {@link Flac.CodingOptions CodingOptions.analyseSubframes} is enabled for the decoder. * * @see Flac.CodingOptions * @see Flac#setOptions */ /** * FLAC subframe metadata * @interface SubFrameMetadata * @memberOf Flac * * @property {Flac.FLAC__SubframeType} type the type of the subframe * @property {number|Flac.FixedSubFrameData|Flac.LPCSubFrameData} data the type specific metadata for subframe * @property {number} wastedBits the wasted bits-per-sample */ /** * metadata for FIXED subframe type * @interface FixedSubFrameData * @memberOf Flac * * @property {number} order The polynomial order. * @property {number[]} warmup Warmup samples to prime the predictor, length == order. * @property {Flac.SubFramePartition} partition The residual coding method. * @property {number[]} [residual] The residual signal, length == (blocksize minus order) samples. * NOTE will only be included if {@link Flac.CodingOptions CodingOptions.analyseSubframes} is enabled for the decoder. */ /** * metadata for LPC subframe type * @interface LPCSubFrameData * @augments Flac.FixedSubFrameData * @memberOf Flac * * @property {number} order The FIR order. * @property {number[]} qlp_coeff FIR filter coefficients. * @property {number} qlp_coeff_precision Quantized FIR filter coefficient precision in bits. * @property {number} quantization_level The qlp coeff shift needed. */ /** * metadata for FIXED or LPC subframe partitions * @interface SubFramePartition * @memberOf Flac * * @property {Flac.FLAC__EntropyCodingMethodType} type the entropy coding method * @property {Flac.SubFramePartitionData} data metadata for a Rice partitioned residual */ /** * metadata for FIXED or LPC subframe partition data * @interface SubFramePartitionData * @memberOf Flac * * @property {number} order The partition order, i.e. # of contexts = 2 ^ order. * @property {Flac.SubFramePartitionContent} contents The context's Rice parameters and/or raw bits. */ /** * metadata for FIXED or LPC subframe partition data content * @interface SubFramePartitionContent * @memberOf Flac * * @property {number[]} parameters The Rice parameters for each context. * @property {number[]} rawBits Widths for escape-coded partitions. Will be non-zero for escaped partitions and zero for unescaped partitions. * @property {number} capacityByOrder The capacity of the parameters and raw_bits arrays specified as an order, i.e. the number of array elements allocated is 2 ^ capacity_by_order. */ /** * The types for FLAC subframes * * @interface FLAC__SubframeType * @memberOf Flac * * @property {"FLAC__SUBFRAME_TYPE_CONSTANT"}  0 constant signal * @property {"FLAC__SUBFRAME_TYPE_VERBATIM"}  1 uncompressed signal * @property {"FLAC__SUBFRAME_TYPE_FIXED"}  2 fixed polynomial prediction * @property {"FLAC__SUBFRAME_TYPE_LPC"}  3 linear prediction */ /** * The channel assignment for the (decoded) frame. * * @interface FLAC__ChannelAssignment * @memberOf Flac * * @property {"FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT"} 0 independent channels * @property {"FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE"} 1 left+side stereo * @property {"FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE"} 2 right+side stereo * @property {"FLAC__CHANNEL_ASSIGNMENT_MID_SIDE"} 3 mid+side stereo */ /** * entropy coding methods * * @interface FLAC__EntropyCodingMethodType * @memberOf Flac * * @property {"FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE"}  0 Residual is coded by partitioning into contexts, each with it's own 4-bit Rice parameter. * @property {"FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2"}  1 Residual is coded by partitioning into contexts, each with it's own 5-bit Rice parameter. */ /** * Initialize the decoder. * * @param {number} decoder * the ID of the decoder instance that has not been initialized (or has been reset) * * @param {Flac~decoder_read_callback_fn} read_callback_fn * the callback for reading the Flac data that should get decoded: *
read_callback_fn(numberOfBytes: Number) : {buffer: ArrayBuffer, readDataLength: number, error: boolean}
* * @param {Flac~decoder_write_callback_fn} write_callback_fn * the callback for writing the decoded data: *
write_callback_fn(data: Uint8Array[], frameInfo: Metadata)
* * @param {Flac~decoder_error_callback_fn} error_callback_fn * the error callback: *
error_callback_fn(errorCode: Number, errorDescription: String)
* * @param {Flac~metadata_callback_fn} [metadata_callback_fn] OPTIONAL * callback for receiving the metadata of FLAC data that will be decoded: *
metadata_callback_fn(metadata: StreamMetadata)
* * @param {number|boolean} [ogg_serial_number] OPTIONAL * if number or true is specified, the decoder will be initilized to * read from an OGG container, see {@link Flac.init_decoder_ogg_stream}:
* true will use the default serial number, if specified as number the * corresponding stream with the serial number from the ogg container will be used. * * @returns {Flac.FLAC__StreamDecoderInitStatus} the decoder status(0 for FLAC__STREAM_DECODER_INIT_STATUS_OK) * * @memberOf Flac# * @function */ init_decoder_stream: function(decoder, read_callback_fn, write_callback_fn, error_callback_fn, metadata_callback_fn, ogg_serial_number, client_data){ client_data = client_data|0; if(typeof read_callback_fn !== 'function'){ return FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; } setCallback(decoder, 'read', read_callback_fn); if(typeof write_callback_fn !== 'function'){ return FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; } setCallback(decoder, 'write', write_callback_fn); var __error_callback_fn_ptr = 0; if(typeof error_callback_fn === 'function'){ setCallback(decoder, 'error', error_callback_fn); __error_callback_fn_ptr = dec_error_fn_ptr; } var __metadata_callback_fn_ptr = 0; if(typeof metadata_callback_fn === 'function'){ setCallback(decoder, 'metadata', metadata_callback_fn); __metadata_callback_fn_ptr = metadata_fn_ptr; } var is_ogg = (ogg_serial_number === true); if(typeof ogg_serial_number === 'number'){ is_ogg = true; //NOTE ignore BOOL return value when setting serial number, since init-call's returned // status will also indicate, if decoder already has been initialized Module.ccall( 'FLAC__stream_decoder_set_ogg_serial_number', 'number', ['number', 'number'], [ decoder, ogg_serial_number ] ); } //NOTE the following comments are used for auto-detecting exported functions (only change if ccall function name(s) change!): // Module.ccall('FLAC__stream_decoder_init_stream' // Module.ccall('FLAC__stream_decoder_init_ogg_stream' var init_func_name = !is_ogg? 'FLAC__stream_decoder_init_stream' : 'FLAC__stream_decoder_init_ogg_stream'; var init_status = Module.ccall( init_func_name, 'number', [ 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number'], [ decoder, dec_read_fn_ptr, 0,// FLAC__StreamDecoderSeekCallback 0,// FLAC__StreamDecoderTellCallback 0,// FLAC__StreamDecoderLengthCallback 0,// FLAC__StreamDecoderEofCallback dec_write_fn_ptr, __metadata_callback_fn_ptr, __error_callback_fn_ptr, client_data ] ); return init_status; }, /** * Initialize the decoder for writing to an OGG container. * * @param {number} [ogg_serial_number] OPTIONAL * the serial number for the stream in the OGG container that should be decoded.
* The default behavior is to use the serial number of the first Ogg page. Setting a serial number here will explicitly specify which stream is to be decoded. * * @memberOf Flac# * @function * @copydoc #init_decoder_stream */ init_decoder_ogg_stream: function(decoder, read_callback_fn, write_callback_fn, error_callback_fn, metadata_callback_fn, ogg_serial_number, client_data){ if(typeof ogg_serial_number !== 'number'){ ogg_serial_number = true; } return this.init_decoder_stream(decoder, read_callback_fn, write_callback_fn, error_callback_fn, metadata_callback_fn, ogg_serial_number, client_data); }, /** * Encode / submit data for encoding. * * This version allows you to supply the input data where the channels are interleaved into a * single array (i.e. channel0_sample0, channel1_sample0, ... , channelN_sample0, channel0_sample1, ...). * * The samples need not be block-aligned but they must be sample-aligned, i.e. the first value should be * channel0_sample0 and the last value channelN_sampleM. * * Each sample should be a signed integer, right-justified to the resolution set by bits-per-sample. * * For example, if the resolution is 16 bits per sample, the samples should all be in the range [-32768,32767]. * * * For applications where channel order is important, channels must follow the order as described in the frame header. * * @param {number} encoder * the ID of the encoder instance * * @param {TypedArray} buffer * the audio data in a typed array with signed integers (and size according to the set bits-per-sample setting) * * @param {number} num_of_samples * the number of samples in buffer * * @returns {boolean} true if successful, else false; in this case, check the encoder state with FLAC__stream_encoder_get_state() to see what went wrong. * * @memberOf Flac# * @function */ FLAC__stream_encoder_process_interleaved: function(encoder, buffer, num_of_samples){ // get the length of the data in bytes var numBytes = buffer.length * buffer.BYTES_PER_ELEMENT; // malloc enough space for the data var ptr = Module._malloc(numBytes); // get a bytes-wise view on the newly allocated buffer var heapBytes= new Uint8Array(Module.HEAPU8.buffer, ptr, numBytes); // copy data into heapBytes heapBytes.set(new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength));// issue #11 (2): do use byteOffset and byteLength for copying the data in case the underlying buffer/ArrayBuffer of the TypedArray view is larger than the TypedArray var status = Module.ccall('FLAC__stream_encoder_process_interleaved', 'number', ['number', 'number', 'number'], [encoder, heapBytes.byteOffset, num_of_samples] ); Module._free(ptr); return status; }, /** * Encode / submit data for encoding. * * Submit data for encoding. This version allows you to supply the input data via an array of pointers, * each pointer pointing to an array of samples samples representing one channel. * The samples need not be block-aligned, but each channel should have the same number of samples. * * Each sample should be a signed integer, right-justified to the resolution set by FLAC__stream_encoder_set_bits_per_sample(). * For example, if the resolution is 16 bits per sample, the samples should all be in the range [-32768,32767]. * * * For applications where channel order is important, channels must follow the order as described in the frame header. * * @param {number} encoder * the ID of the encoder instance * * @param {TypedArray[]} channelBuffers * an array for the audio data channels as typed arrays with signed integers (and size according to the set bits-per-sample setting) * * @param {number} num_of_samples * the number of samples in one channel (i.e. one of the buffers) * * @returns {boolean} true if successful, else false; in this case, check the encoder state with FLAC__stream_encoder_get_state() to see what went wrong. * * @memberOf Flac# * @function */ FLAC__stream_encoder_process: function(encoder, channelBuffers, num_of_samples){ var ptrInfo = this._create_pointer_array(channelBuffers); var pointerPtr = ptrInfo.pointerPointer; var status = Module.ccall('FLAC__stream_encoder_process', 'number', ['number', 'number', 'number'], [encoder, pointerPtr, num_of_samples] ); this._destroy_pointer_array(ptrInfo); return status; }, /** * Decodes a single frame. * * To check decoding progress, use {@link #FLAC__stream_decoder_get_state}. * * @param {number} decoder * the ID of the decoder instance * * @returns {boolean} FALSE if an error occurred * * @memberOf Flac# * @function */ FLAC__stream_decoder_process_single: Module.cwrap('FLAC__stream_decoder_process_single', 'number', ['number']), /** * Decodes data until end of stream. * * @param {number} decoder * the ID of the decoder instance * * @returns {boolean} FALSE if an error occurred * * @memberOf Flac# * @function */ FLAC__stream_decoder_process_until_end_of_stream: Module.cwrap('FLAC__stream_decoder_process_until_end_of_stream', 'number', ['number']), /** * Decodes data until end of metadata. * * @param {number} decoder * the ID of the decoder instance * * @returns {boolean} false if any fatal read, write, or memory allocation error occurred (meaning decoding must stop), else true. * * @memberOf Flac# * @function */ FLAC__stream_decoder_process_until_end_of_metadata: Module.cwrap('FLAC__stream_decoder_process_until_end_of_metadata', 'number', ['number']), /** * Decoder state code. * * @interface FLAC__StreamDecoderState * @memberOf Flac * * @property {"FLAC__STREAM_DECODER_SEARCH_FOR_METADATA"} 0 The decoder is ready to search for metadata * @property {"FLAC__STREAM_DECODER_READ_METADATA"} 1 The decoder is ready to or is in the process of reading metadata * @property {"FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC"} 2 The decoder is ready to or is in the process of searching for the frame sync code * @property {"FLAC__STREAM_DECODER_READ_FRAME"} 3 The decoder is ready to or is in the process of reading a frame * @property {"FLAC__STREAM_DECODER_END_OF_STREAM"} 4 The decoder has reached the end of the stream * @property {"FLAC__STREAM_DECODER_OGG_ERROR"} 5 An error occurred in the underlying Ogg layer * @property {"FLAC__STREAM_DECODER_SEEK_ERROR"} 6 An error occurred while seeking. The decoder must be flushed with FLAC__stream_decoder_flush() or reset with FLAC__stream_decoder_reset() before decoding can continue * @property {"FLAC__STREAM_DECODER_ABORTED"} 7 The decoder was aborted by the read callback * @property {"FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR"} 8 An error occurred allocating memory. The decoder is in an invalid state and can no longer be used * @property {"FLAC__STREAM_DECODER_UNINITIALIZED"} 9 The decoder is in the uninitialized state; one of the FLAC__stream_decoder_init_*() functions must be called before samples can be processed. * */ /** * * @param {number} decoder * the ID of the decoder instance * * @returns {Flac.FLAC__StreamDecoderState} the decoder state * * @memberOf Flac# * @function */ FLAC__stream_decoder_get_state: Module.cwrap('FLAC__stream_decoder_get_state', 'number', ['number']), /** * Encoder state code. * * @interface FLAC__StreamEncoderState * @memberOf Flac * * @property {"FLAC__STREAM_ENCODER_OK"} 0 The encoder is in the normal OK state and samples can be processed. * @property {"FLAC__STREAM_ENCODER_UNINITIALIZED"} 1 The encoder is in the uninitialized state; one of the FLAC__stream_encoder_init_*() functions must be called before samples can be processed. * @property {"FLAC__STREAM_ENCODER_OGG_ERROR"} 2 An error occurred in the underlying Ogg layer. * @property {"FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR"} 3 An error occurred in the underlying verify stream decoder; check FLAC__stream_encoder_get_verify_decoder_state(). * @property {"FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA"} 4 The verify decoder detected a mismatch between the original audio signal and the decoded audio signal. * @property {"FLAC__STREAM_ENCODER_CLIENT_ERROR"} 5 One of the callbacks returned a fatal error. * @property {"FLAC__STREAM_ENCODER_IO_ERROR"} 6 An I/O error occurred while opening/reading/writing a file. Check errno. * @property {"FLAC__STREAM_ENCODER_FRAMING_ERROR"} 7 An error occurred while writing the stream; usually, the write_callback returned an error. * @property {"FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR"} 8 Memory allocation failed. * */ /** * * @param {number} encoder * the ID of the encoder instance * * @returns {Flac.FLAC__StreamEncoderState} the encoder state * * @memberOf Flac# * @function */ FLAC__stream_encoder_get_state: Module.cwrap('FLAC__stream_encoder_get_state', 'number', ['number']), /** * Direct the decoder to pass on all metadata blocks of type type. * * By default, only the STREAMINFO block is returned via the metadata callback. * *

* NOTE: only use on un-initilized decoder instances! * * @param {number} decoder * the ID of the decoder instance * * @param {Flac.FLAC__MetadataType} type the metadata type to be enabled * * @returns {boolean} false if the decoder is already initialized, else true * * @memberOf Flac# * @function * * @see Flac#FLAC__stream_decoder_set_metadata_respond_all */ FLAC__stream_decoder_set_metadata_respond: Module.cwrap('FLAC__stream_decoder_set_metadata_respond', 'number', ['number', 'number']), /** * Direct the decoder to pass on all APPLICATION metadata blocks of the given id. * * By default, only the STREAMINFO block is returned via the metadata callback. * *

* NOTE: only use on un-initilized decoder instances! * * @param {number} decoder * the ID of the decoder instance * * @param {number} id the ID of application metadata * * @returns {boolean} false if the decoder is already initialized, else true * * @memberOf Flac# * @function * * @see Flac#FLAC__stream_decoder_set_metadata_respond_all */ FLAC__stream_decoder_set_metadata_respond_application: Module.cwrap('FLAC__stream_decoder_set_metadata_respond_application', 'number', ['number', 'number']),// (FLAC__StreamDecoder *decoder, const FLAC__byte id[4]) /** * Direct the decoder to pass on all metadata blocks of any type. * * By default, only the STREAMINFO block is returned via the metadata callback. * *

* NOTE: only use on un-initilized decoder instances! * * @param {number} decoder * the ID of the decoder instance * * @returns {boolean} false if the decoder is already initialized, else true * * @memberOf Flac# * @function * * @see Flac#FLAC__stream_decoder_set_metadata_ignore_all * @see Flac#FLAC__stream_decoder_set_metadata_respond_application * @see Flac#FLAC__stream_decoder_set_metadata_respond */ FLAC__stream_decoder_set_metadata_respond_all: Module.cwrap('FLAC__stream_decoder_set_metadata_respond_all', 'number', ['number']),// (FLAC__StreamDecoder *decoder) /** * Direct the decoder to filter out all metadata blocks of type type. * * By default, only the STREAMINFO block is returned via the metadata callback. * *

* NOTE: only use on un-initilized decoder instances! * * @param {number} decoder * the ID of the decoder instance * * @param {Flac.FLAC__MetadataType} type the metadata type to be ignored * * @returns {boolean} false if the decoder is already initialized, else true * * @memberOf Flac# * @function * * @see Flac#FLAC__stream_decoder_set_metadata_ignore_all */ FLAC__stream_decoder_set_metadata_ignore: Module.cwrap('FLAC__stream_decoder_set_metadata_ignore', 'number', ['number', 'number']),// (FLAC__StreamDecoder *decoder, FLAC__MetadataType type) /** * Direct the decoder to filter out all APPLICATION metadata blocks of the given id. * * By default, only the STREAMINFO block is returned via the metadata callback. * *

* NOTE: only use on un-initilized decoder instances! * * @param {number} decoder * the ID of the decoder instance * * @param {number} id the ID of application metadata * * @returns {boolean} false if the decoder is already initialized, else true * * @memberOf Flac# * @function * * @see Flac#FLAC__stream_decoder_set_metadata_ignore_all */ FLAC__stream_decoder_set_metadata_ignore_application: Module.cwrap('FLAC__stream_decoder_set_metadata_ignore_application', 'number', ['number', 'number']),// (FLAC__StreamDecoder *decoder, const FLAC__byte id[4]) /** * Direct the decoder to filter out all metadata blocks of any type. * * By default, only the STREAMINFO block is returned via the metadata callback. * *

* NOTE: only use on un-initilized decoder instances! * * @param {number} decoder * the ID of the decoder instance * * @returns {boolean} false if the decoder is already initialized, else true * * @memberOf Flac# * @function * * @see Flac#FLAC__stream_decoder_set_metadata_respond_all * @see Flac#FLAC__stream_decoder_set_metadata_ignore * @see Flac#FLAC__stream_decoder_set_metadata_ignore_application */ FLAC__stream_decoder_set_metadata_ignore_all: Module.cwrap('FLAC__stream_decoder_set_metadata_ignore_all', 'number', ['number']),// (FLAC__StreamDecoder *decoder) /** * Set the metadata blocks to be emitted to the stream before encoding. A value of NULL, 0 implies no metadata; otherwise, supply an array of pointers to metadata blocks. * The array is non-const since the encoder may need to change the is_last flag inside them, and in some cases update seek point offsets. Otherwise, the encoder * will not modify or free the blocks. It is up to the caller to free the metadata blocks after encoding finishes. * *

* The encoder stores only copies of the pointers in the metadata array; the metadata blocks themselves must survive at least until after FLAC__stream_encoder_finish() returns. * Do not free the blocks until then. * * The STREAMINFO block is always written and no STREAMINFO block may occur in the supplied array. * * By default the encoder does not create a SEEKTABLE. If one is supplied in the metadata array, but the client has specified that it does not support seeking, * then the SEEKTABLE will be written verbatim. However by itself this is not very useful as the client will not know the stream offsets for the seekpoints ahead of time. * In order to get a proper seektable the client must support seeking. See next note. * * SEEKTABLE blocks are handled specially. Since you will not know the values for the seek point stream offsets, you should pass in a SEEKTABLE 'template', that is, * a SEEKTABLE object with the required sample numbers (or placeholder points), with 0 for the frame_samples and stream_offset fields for each point. * If the client has specified that it supports seeking by providing a seek callback to FLAC__stream_encoder_init_stream() or both seek AND read callback to * FLAC__stream_encoder_init_ogg_stream() (or by using FLAC__stream_encoder_init*_file() or FLAC__stream_encoder_init*_FILE()), then while it is encoding the encoder will * fill the stream offsets in for you and when encoding is finished, it will seek back and write the real values into the SEEKTABLE block in the stream. There are helper * routines for manipulating seektable template blocks; see metadata.h: FLAC__metadata_object_seektable_template_*(). If the client does not support seeking, * the SEEKTABLE will have inaccurate offsets which will slow down or remove the ability to seek in the FLAC stream. * * The encoder instance will modify the first SEEKTABLE block as it transforms the template to a valid seektable while encoding, but it is still up to the caller to free * all metadata blocks after encoding. * * A VORBIS_COMMENT block may be supplied. The vendor string in it will be ignored. libFLAC will use it's own vendor string. libFLAC will not modify the passed-in * VORBIS_COMMENT's vendor string, it will simply write it's own into the stream. If no VORBIS_COMMENT block is present in the metadata array, libFLAC will write an * empty one, containing only the vendor string. * * The Ogg FLAC mapping requires that the VORBIS_COMMENT block be the second metadata block of the stream. The encoder already supplies the STREAMINFO block automatically. * * If metadata does not contain a VORBIS_COMMENT block, the encoder will supply that too. Otherwise, if metadata does contain a VORBIS_COMMENT block and it is not the first, * the init function will reorder metadata by moving the VORBIS_COMMENT block to the front; the relative ordering of the other blocks will remain as they were. * * The Ogg FLAC mapping limits the number of metadata blocks per stream to 65535. If num_blocks exceeds this the function will return false. * * @param {number} encoder * the ID of the encoder instance * * @param {Flac.PointerInfo} metadataBuffersPointer * * @param {number} num_blocks * * @returns {boolean} false if the encoder is already initialized, else true. false if the encoder is already initialized, or if num_blocks > 65535 if encoding to Ogg FLAC, else true. * * @memberOf Flac# * @function * * @see Flac.FLAC__MetadataType * @see Flac#_create_pointer_array * @see Flac#_destroy_pointer_array */ FLAC__stream_encoder_set_metadata: function(encoder, metadataBuffersPointer, num_blocks){// ( FLAC__StreamEncoder * encoder, FLAC__StreamMetadata ** metadata, unsigned num_blocks) var status = Module.ccall('FLAC__stream_encoder_set_metadata', 'number', ['number', 'number', 'number'], [encoder, metadataBuffersPointer.pointerPointer, num_blocks] ); return status; }, /** * Helper object for allocating an array of buffers on the (memory) heap. * * @interface PointerInfo * @memberOf Flac * @property {number} pointerPointer pointer to the array of (pointer) buffers * @property {number[]} dataPointer array of pointers to the allocated data arrays (i.e. buffers) * * @see Flac#_create_pointer_array * @see Flac#_destroy_pointer_array */ /** * Helper function for creating pointer (and allocating the data) to an array of buffers on the (memory) heap. * * Use the returned PointerInfo.dataPointer as argument, where the array-pointer is required. * * NOTE: afer use, the allocated buffers on the heap need be freed, see {@link #_destroy_pointer_array}. * * @param {Uint8Array[]} bufferArray * the buffer for which to create * * @returns {Flac.PointerInfo} false if the decoder is already initialized, else true * * @memberOf Flac# * @function * * @see Flac#_destroy_pointer_array */ _create_pointer_array: function(bufferArray){ var size=bufferArray.length; var ptrs = [], ptrData = new Uint32Array(size); var ptrOffsets = new DataView(ptrData.buffer); var buffer, numBytes, heapBytes, ptr; for(var i=0, size; i < size; ++i){ buffer = bufferArray[i]; // get the length of the data in bytes numBytes = buffer.length * buffer.BYTES_PER_ELEMENT; // malloc enough space for the data ptr = Module._malloc(numBytes); ptrs.push(ptr); // get a bytes-wise view on the newly allocated buffer heapBytes = new Uint8Array(Module.HEAPU8.buffer, ptr, numBytes); // copy data into heapBytes heapBytes.set(new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength));// use FIX for issue #11 (2) ptrOffsets.setUint32(i*4, ptr, true); } var nPointerBytes = ptrData.length * ptrData.BYTES_PER_ELEMENT var pointerPtr = Module._malloc(nPointerBytes); var pointerHeap = new Uint8Array(Module.HEAPU8.buffer, pointerPtr, nPointerBytes); pointerHeap.set( new Uint8Array(ptrData.buffer) ); return { dataPointer: ptrs, pointerPointer: pointerPtr }; }, /** * Helper function for destroying/freeing a previously created pointer (and allocating the data) of an array of buffers on the (memory) heap. * * @param {Flac.PointerInfo} pointerInfo * the pointer / allocation information that should be destroyed/freed * * * @memberOf Flac# * @function * * @see Flac#_create_pointer_array */ _destroy_pointer_array: function(pointerInfo){ var pointerArray = pointerInfo.dataPointer; for(var i=0, size=pointerArray.length; i < size; ++i){ Module._free(pointerArray[i]); } Module._free(pointerInfo.pointerPointer); }, /** * Get if MD5 verification is enabled for the decoder * * @param {number} decoder * the ID of the decoder instance * * @returns {boolean} true if MD5 verification is enabled * * @memberOf Flac# * @function * * @see #FLAC__stream_decoder_set_md5_checking */ FLAC__stream_decoder_get_md5_checking: Module.cwrap('FLAC__stream_decoder_get_md5_checking', 'number', ['number']), /** * Set the "MD5 signature checking" flag. If true, the decoder will compute the MD5 signature of the unencoded audio data while decoding and compare it to the signature from the STREAMINFO block, * if it exists, during {@link Flac.FLAC__stream_decoder_finish FLAC__stream_decoder_finish()}. * * MD5 signature checking will be turned off (until the next {@link Flac.FLAC__stream_decoder_reset FLAC__stream_decoder_reset()}) if there is no signature in the STREAMINFO block or when a seek is attempted. * * Clients that do not use the MD5 check should leave this off to speed up decoding. * * @param {number} decoder * the ID of the decoder instance * @param {boolean} is_verify * enable/disable checksum verification during decoding * @returns {boolean} FALSE if the decoder is already initialized, else TRUE. * * @memberOf Flac# * @function * * @see #FLAC__stream_decoder_get_md5_checking */ FLAC__stream_decoder_set_md5_checking: function(decoder, is_verify){ is_verify = is_verify? 1 : 0; return Module.ccall('FLAC__stream_decoder_set_md5_checking', 'number', ['number', 'number'], [ decoder, is_verify ]); }, /** * Finish the encoding process. * * @param {number} encoder * the ID of the encoder instance * * @returns {boolean} false if an error occurred processing the last frame; * or if verify mode is set, there was a verify mismatch; else true. * If false, caller should check the state with {@link Flac#FLAC__stream_encoder_get_state} * for more information about the error. * * @memberOf Flac# * @function */ FLAC__stream_encoder_finish: Module.cwrap('FLAC__stream_encoder_finish', 'number', [ 'number' ]), /** * Finish the decoding process. * * The decoder can be reused, after initializing it again. * * @param {number} decoder * the ID of the decoder instance * * @returns {boolean} false if MD5 checking is on AND a STREAMINFO block was available AND the MD5 signature in * the STREAMINFO block was non-zero AND the signature does not match the one computed by the decoder; * else true. * * @memberOf Flac# * @function */ FLAC__stream_decoder_finish: Module.cwrap('FLAC__stream_decoder_finish', 'number', [ 'number' ]), /** * Reset the decoder for reuse. * *

* NOTE: Needs to be re-initialized, before it can be used again * * @param {number} decoder * the ID of the decoder instance * * @returns {boolean} true if successful * * @see #init_decoder_stream * @see #init_decoder_ogg_stream * * @memberOf Flac# * @function */ FLAC__stream_decoder_reset: Module.cwrap('FLAC__stream_decoder_reset', 'number', [ 'number' ]), /** * Delete the encoder instance, and free up its resources. * * @param {number} encoder * the ID of the encoder instance * * @memberOf Flac# * @function */ FLAC__stream_encoder_delete: function(encoder){ this._clear_enc_cb(encoder);//<- remove callback references Module.ccall('FLAC__stream_encoder_delete', 'number', [ 'number' ], [encoder]); do_fire_event('destroyed', [{type: 'destroyed', target: {id: encoder, type: 'encoder'}}], false); }, /** * Delete the decoder instance, and free up its resources. * * @param {number} decoder * the ID of the decoder instance * * @memberOf Flac# * @function */ FLAC__stream_decoder_delete: function(decoder){ this._clear_dec_cb(decoder);//<- remove callback references Module.ccall('FLAC__stream_decoder_delete', 'number', [ 'number' ], [decoder]); do_fire_event('destroyed', [{type: 'destroyed', target: {id: decoder, type: 'decoder'}}], false); } };//END: var _exported = { //if Properties are supported by JS execution environment: // support "immediate triggering" onready function, if library is already initialized when setting onready callback if(typeof Object.defineProperty === 'function'){ //add internal field for storing onready callback: _exported._onready = void(0); //define getter & define setter with "immediate trigger" functionality: Object.defineProperty(_exported, 'onready', { get() { return this._onready; }, set(newValue) { this._onready = newValue; if(newValue && this.isReady()){ check_and_trigger_persisted_event('ready', newValue); } } }); } else { //if Properties are NOTE supported by JS execution environment: // pring usage warning for onready hook instead console.warn('WARN: note that setting Flac.onready handler after Flac.isReady() is already true, will have no effect, that is, the handler function will not be triggered!'); } if(expLib && expLib.exports){ expLib.exports = _exported; } return _exported; }));//END: UMD wrapper ================================================ FILE: packages/addons/service/snapserver/snapweb/config.js ================================================ "use strict"; let config = { baseUrl: (window.location.protocol === 'https:' ? 'wss://' : 'ws://') + window.location.host }; //# sourceMappingURL=config.js.map ================================================ FILE: packages/addons/service/snapserver/snapweb/index.html ================================================ Snapweb

================================================ FILE: packages/addons/service/snapserver/snapweb/manifest.json ================================================ { "short_name": "Snapweb", "name": "Snapcast WebApp", "icons": [ { "src": "launcher-icon.png", "sizes": "192x192", "type": "image/png" } ], "start_url": "/index.html", "display": "standalone", "categories": ["music"], "description": "Snapcast web client", "theme_color": "#455A64" } ================================================ FILE: packages/addons/service/snapserver/snapweb/snapcontrol.js ================================================ "use strict"; class Host { constructor(json) { this.arch = ""; this.ip = ""; this.mac = ""; this.name = ""; this.os = ""; this.fromJson(json); } fromJson(json) { this.arch = json.arch; this.ip = json.ip; this.mac = json.mac; this.name = json.name; this.os = json.os; } } class Client { constructor(json) { this.id = ""; this.connected = false; this.fromJson(json); } fromJson(json) { this.id = json.id; this.host = new Host(json.host); let jsnapclient = json.snapclient; this.snapclient = { name: jsnapclient.name, protocolVersion: jsnapclient.protocolVersion, version: jsnapclient.version }; let jconfig = json.config; this.config = { instance: jconfig.instance, latency: jconfig.latency, name: jconfig.name, volume: { muted: jconfig.volume.muted, percent: jconfig.volume.percent } }; this.lastSeen = { sec: json.lastSeen.sec, usec: json.lastSeen.usec }; this.connected = Boolean(json.connected); } } class Group { constructor(json) { this.name = ""; this.id = ""; this.stream_id = ""; this.muted = false; this.clients = []; this.fromJson(json); } fromJson(json) { this.name = json.name; this.id = json.id; this.stream_id = json.stream_id; this.muted = Boolean(json.muted); for (let client of json.clients) this.clients.push(new Client(client)); } getClient(id) { for (let client of this.clients) { if (client.id == id) return client; } return null; } } class Stream { constructor(json) { this.id = ""; this.status = ""; this.fromJson(json); } fromJson(json) { this.id = json.id; this.status = json.status; let juri = json.uri; this.uri = { raw: juri.raw, scheme: juri.scheme, host: juri.host, path: juri.path, fragment: juri.fragment, query: juri.query }; } } class Server { constructor(json) { this.groups = []; this.streams = []; if (json) this.fromJson(json); } fromJson(json) { this.groups = []; for (let jgroup of json.groups) this.groups.push(new Group(jgroup)); let jsnapserver = json.server.snapserver; this.server = { host: new Host(json.server.host), snapserver: { controlProtocolVersion: jsnapserver.controlProtocolVersion, name: jsnapserver.name, protocolVersion: jsnapserver.protocolVersion, version: jsnapserver.version } }; this.streams = []; for (let jstream of json.streams) { this.streams.push(new Stream(jstream)); } } getClient(id) { for (let group of this.groups) { let client = group.getClient(id); if (client) return client; } return null; } getGroup(id) { for (let group of this.groups) { if (group.id == id) return group; } return null; } getStream(id) { for (let stream of this.streams) { if (stream.id == id) return stream; } return null; } } class SnapControl { constructor(baseUrl) { this.server = new Server(); this.baseUrl = baseUrl; this.msg_id = 0; this.status_req_id = -1; this.connect(); } connect() { this.connection = new WebSocket(this.baseUrl + '/jsonrpc'); this.connection.onmessage = (msg) => this.onMessage(msg.data); this.connection.onopen = () => { this.status_req_id = this.sendRequest('Server.GetStatus'); }; this.connection.onerror = (ev) => { console.error('error:', ev); }; this.connection.onclose = () => { console.info('connection lost, reconnecting in 1s'); setTimeout(() => this.connect(), 1000); }; } action(answer) { switch (answer.method) { case 'Client.OnVolumeChanged': let client = this.getClient(answer.params.id); client.config.volume = answer.params.volume; updateGroupVolume(this.getGroupFromClient(client.id)); break; case 'Client.OnLatencyChanged': this.getClient(answer.params.id).config.latency = answer.params.latency; break; case 'Client.OnNameChanged': this.getClient(answer.params.id).config.name = answer.params.name; break; case 'Client.OnConnect': case 'Client.OnDisconnect': this.getClient(answer.params.client.id).fromJson(answer.params.client); break; case 'Group.OnMute': this.getGroup(answer.params.id).muted = Boolean(answer.params.mute); break; case 'Group.OnStreamChanged': this.getGroup(answer.params.id).stream_id = answer.params.stream_id; break; case 'Stream.OnUpdate': this.getStream(answer.params.id).fromJson(answer.params.stream); break; case 'Server.OnUpdate': this.server.fromJson(answer.params.server); break; default: break; } } getClient(client_id) { let client = this.server.getClient(client_id); if (client == null) { throw new Error(`client ${client_id} was null`); } return client; } getGroup(group_id) { let group = this.server.getGroup(group_id); if (group == null) { throw new Error(`group ${group_id} was null`); } return group; } getGroupVolume(group, online) { if (group.clients.length == 0) return 0; let group_vol = 0; let client_count = 0; for (let client of group.clients) { if (online && !client.connected) continue; group_vol += client.config.volume.percent; ++client_count; } if (client_count == 0) return 0; return group_vol / client_count; } getGroupFromClient(client_id) { for (let group of this.server.groups) for (let client of group.clients) if (client.id == client_id) return group; throw new Error(`group for client ${client_id} was null`); } getStream(stream_id) { let stream = this.server.getStream(stream_id); if (stream == null) { throw new Error(`stream ${stream_id} was null`); } return stream; } setVolume(client_id, percent, mute) { percent = Math.max(0, Math.min(100, percent)); let client = this.getClient(client_id); client.config.volume.percent = percent; if (mute != undefined) client.config.volume.muted = mute; this.sendRequest('Client.SetVolume', { id: client_id, volume: { muted: client.config.volume.muted, percent: client.config.volume.percent } }); } setClientName(client_id, name) { let client = this.getClient(client_id); let current_name = (client.config.name != "") ? client.config.name : client.host.name; if (name != current_name) { this.sendRequest('Client.SetName', { id: client_id, name: name }); client.config.name = name; } } setClientLatency(client_id, latency) { let client = this.getClient(client_id); let current_latency = client.config.latency; if (latency != current_latency) { this.sendRequest('Client.SetLatency', { id: client_id, latency: latency }); client.config.latency = latency; } } deleteClient(client_id) { this.sendRequest('Server.DeleteClient', { id: client_id }); this.server.groups.forEach((g, gi) => { g.clients.forEach((c, ci) => { if (c.id == client_id) { this.server.groups[gi].clients.splice(ci, 1); } }); }); this.server.groups.forEach((g, gi) => { if (g.clients.length == 0) { this.server.groups.splice(gi, 1); } }); show(); } setStream(group_id, stream_id) { this.getGroup(group_id).stream_id = stream_id; this.sendRequest('Group.SetStream', { id: group_id, stream_id: stream_id }); } setClients(group_id, clients) { this.status_req_id = this.sendRequest('Group.SetClients', { id: group_id, clients: clients }); } muteGroup(group_id, mute) { this.getGroup(group_id).muted = mute; this.sendRequest('Group.SetMute', { id: group_id, mute: mute }); } sendRequest(method, params) { let msg = { id: ++this.msg_id, jsonrpc: '2.0', method: method }; if (params) msg.params = params; let msgJson = JSON.stringify(msg); console.log("Sending: " + msgJson); this.connection.send(msgJson); return this.msg_id; } onMessage(msg) { let answer = JSON.parse(msg); let is_response = (answer.id != undefined); console.log("Received " + (is_response ? "response" : "notification") + ", json: " + JSON.stringify(answer)); if (is_response) { if (answer.id == this.status_req_id) { this.server = new Server(answer.result.server); show(); } } else { if (Array.isArray(answer)) { for (let a of answer) { this.action(a); } } else { this.action(answer); } // TODO: don't update everything, but only the changed, // e.g. update the values for the volume sliders show(); } } } let snapcontrol; let snapstream = null; let hide_offline = true; let autoplay_done = false; function autoplayRequested() { return document.location.hash.match(/autoplay/) !== null; } function show() { // Render the page const versionElem = document.getElementsByTagName("meta").namedItem("version"); console.log("Snapweb version " + (versionElem ? versionElem.content : "null")); let play_img; if (snapstream) { play_img = 'stop.png'; } else { play_img = 'play.png'; } let content = ""; content += ""; content += "
"; let server = snapcontrol.server; for (let group of server.groups) { if (hide_offline) { let groupActive = false; for (let client of group.clients) { if (client.connected) { groupActive = true; break; } } if (!groupActive) continue; } // Set mute variables let classgroup; let muted; let mute_img; if (group.muted == true) { classgroup = 'group muted'; muted = true; mute_img = 'mute_icon.png'; } else { classgroup = 'group'; muted = false; mute_img = 'speaker_icon.png'; } // Start group div content += "
"; // Create stream selection dropdown let streamselect = ""; // Group mute and refresh button content += "
"; content += streamselect; let clientCount = 0; for (let client of group.clients) if (!hide_offline || client.connected) clientCount++; if (clientCount > 1) { let volume = snapcontrol.getGroupVolume(group, hide_offline); content += ""; content += "
"; content += " "; // content += " "; content += "
"; } // transparent placeholder edit icon content += "
"; content += "
"; content += "
"; // Create clients in group for (let client of group.clients) { if (!client.connected && hide_offline) continue; // Set name and connection state vars, start client div let name; let clas = 'client'; if (client.config.name != "") { name = client.config.name; } else { name = client.host.name; } if (client.connected == false) { clas = 'client disconnected'; } content += "
"; // Client mute status vars let muted; let mute_img; let sliderclass; if (client.config.volume.muted == true) { muted = true; sliderclass = 'slider muted'; mute_img = 'mute_icon.png'; } else { sliderclass = 'slider'; muted = false; mute_img = 'speaker_icon.png'; } // Populate client div content += ""; content += "
"; content += " "; content += "
"; content += " "; content += " "; if (client.connected == false) { content += " 🗑"; content += " "; } else { content += ""; } content += "
" + name + "
"; content += "
"; } content += "
"; } content += "
"; // content content += "
"; content += "
"; content += "
"; content += " "; content += " "; content += " "; content += " "; content += " "; content += " "; content += " "; content += "
"; content += "
"; content += "
"; // Pad then update page content = content + "

"; document.getElementById('show').innerHTML = content; let playElem = document.getElementById('play-button'); playElem.onclick = () => { play(); }; for (let group of snapcontrol.server.groups) { if (group.clients.length > 1) { let slider = document.getElementById("vol_" + group.id); if (slider == null) continue; slider.addEventListener('pointerdown', function () { groupVolumeEnter(group.id); }); slider.addEventListener('touchstart', function () { groupVolumeEnter(group.id); }); } } } function updateGroupVolume(group) { let group_vol = snapcontrol.getGroupVolume(group, hide_offline); let slider = document.getElementById("vol_" + group.id); if (slider == null) return; console.log("updateGroupVolume group: " + group.id + ", volume: " + group_vol + ", slider: " + (slider != null)); slider.value = String(group_vol); } let client_volumes; let group_volume; function setGroupVolume(group_id) { let group = snapcontrol.getGroup(group_id); let percent = document.getElementById('vol_' + group.id).valueAsNumber; console.log("setGroupVolume id: " + group.id + ", volume: " + percent); // show() let delta = percent - group_volume; let ratio; if (delta < 0) ratio = (group_volume - percent) / group_volume; else ratio = (percent - group_volume) / (100 - group_volume); for (let i = 0; i < group.clients.length; ++i) { let new_volume = client_volumes[i]; if (delta < 0) new_volume -= ratio * client_volumes[i]; else new_volume += ratio * (100 - client_volumes[i]); let client_id = group.clients[i].id; // TODO: use batch request to update all client volumes at once snapcontrol.setVolume(client_id, new_volume); let slider = document.getElementById('vol_' + client_id); if (slider) slider.value = String(new_volume); } } function groupVolumeEnter(group_id) { let group = snapcontrol.getGroup(group_id); let percent = document.getElementById('vol_' + group.id).valueAsNumber; console.log("groupVolumeEnter id: " + group.id + ", volume: " + percent); group_volume = percent; client_volumes = []; for (let i = 0; i < group.clients.length; ++i) { client_volumes.push(group.clients[i].config.volume.percent); } // show() } function setVolume(id, mute) { console.log("setVolume id: " + id + ", mute: " + mute); let percent = document.getElementById('vol_' + id).valueAsNumber; let client = snapcontrol.getClient(id); let needs_update = (mute != client.config.volume.muted); snapcontrol.setVolume(id, percent, mute); let group = snapcontrol.getGroupFromClient(id); updateGroupVolume(group); if (needs_update) show(); } function play() { if (snapstream) { snapstream.stop(); snapstream = null; } else { snapstream = new SnapStream(config.baseUrl); } show(); } function setMuteGroup(id, mute) { snapcontrol.muteGroup(id, mute); show(); } function setStream(id) { snapcontrol.setStream(id, document.getElementById('stream_' + id).value); show(); } function setGroup(client_id, group_id) { console.log("setGroup id: " + client_id + ", group: " + group_id); let server = snapcontrol.server; // Get client group id let current_group = snapcontrol.getGroupFromClient(client_id); // Get // List of target group's clients // OR // List of current group's other clients let send_clients = []; for (let i_group = 0; i_group < server.groups.length; i_group++) { if (server.groups[i_group].id == group_id || (group_id == "new" && server.groups[i_group].id == current_group.id)) { for (let i_client = 0; i_client < server.groups[i_group].clients.length; i_client++) { if (group_id == "new" && server.groups[i_group].clients[i_client].id == client_id) { } else { send_clients[send_clients.length] = server.groups[i_group].clients[i_client].id; } } } } if (group_id == "new") group_id = current_group.id; else send_clients[send_clients.length] = client_id; snapcontrol.setClients(group_id, send_clients); } function setName(id) { // Get current name and lacency let client = snapcontrol.getClient(id); let current_name = (client.config.name != "") ? client.config.name : client.host.name; let current_latency = client.config.latency; let new_name = window.prompt("New Name", current_name); let new_latency = Number(window.prompt("New Latency", String(current_latency))); if (new_name != null) snapcontrol.setClientName(id, new_name); if (new_latency != null) snapcontrol.setClientLatency(id, new_latency); show(); } function openClientSettings(id) { let modal = document.getElementById("client-settings"); let client = snapcontrol.getClient(id); let current_name = (client.config.name != "") ? client.config.name : client.host.name; let name = document.getElementById("client-name"); name.name = id; name.value = current_name; let latency = document.getElementById("client-latency"); latency.valueAsNumber = client.config.latency; let group = snapcontrol.getGroupFromClient(id); let group_input = document.getElementById("client-group"); while (group_input.length > 0) group_input.remove(0); let group_num = 0; for (let ogroup of snapcontrol.server.groups) { let option = document.createElement('option'); option.value = ogroup.id; option.text = "Group " + (group_num + 1) + " (" + ogroup.clients.length + " Clients)"; group_input.add(option); if (ogroup == group) { console.log("Selected: " + group_num); group_input.selectedIndex = group_num; } ++group_num; } let option = document.createElement('option'); option.value = option.text = "new"; group_input.add(option); modal.style.display = "block"; } function closeClientSettings() { let name = document.getElementById("client-name"); let id = name.name; console.log("onclose " + id + ", value: " + name.value); snapcontrol.setClientName(id, name.value); let latency = document.getElementById("client-latency"); snapcontrol.setClientLatency(id, latency.valueAsNumber); let group_input = document.getElementById("client-group"); let option = group_input.options[group_input.selectedIndex]; setGroup(id, option.value); let modal = document.getElementById("client-settings"); modal.style.display = "none"; show(); } function deleteClient(id) { if (confirm('Are you sure?')) { snapcontrol.deleteClient(id); } } window.onload = function () { snapcontrol = new SnapControl(config.baseUrl); }; // When the user clicks anywhere outside of the modal, close it window.onclick = function (event) { let modal = document.getElementById("client-settings"); if (event.target == modal) { modal.style.display = "none"; } }; //# sourceMappingURL=snapcontrol.js.map ================================================ FILE: packages/addons/service/snapserver/snapweb/snapstream.js ================================================ "use strict"; function setCookie(key, value, exdays = -1) { let d = new Date(); if (exdays < 0) exdays = 10 * 365; d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); let expires = "expires=" + d.toUTCString(); document.cookie = key + "=" + value + ";" + expires + ";sameSite=Strict;path=/"; } function getPersistentValue(key, defaultValue = "") { if (!!window.localStorage) { const value = window.localStorage.getItem(key); if (value !== null) { return value; } window.localStorage.setItem(key, defaultValue); return defaultValue; } // Fallback to cookies if localStorage is not available. let name = key + "="; let decodedCookie = decodeURIComponent(document.cookie); let ca = decodedCookie.split(';'); for (let c of ca) { c = c.trimLeft(); if (c.indexOf(name) == 0) { return c.substring(name.length, c.length); } } setCookie(key, defaultValue); return defaultValue; } function getChromeVersion() { const raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); return raw ? parseInt(raw[2]) : null; } function uuidv4() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } class Tv { constructor(sec, usec) { this.sec = 0; this.usec = 0; this.sec = sec; this.usec = usec; } setMilliseconds(ms) { this.sec = Math.floor(ms / 1000); this.usec = Math.floor(ms * 1000) % 1000000; } getMilliseconds() { return this.sec * 1000 + this.usec / 1000; } } class BaseMessage { constructor(_buffer) { this.type = 0; this.id = 0; this.refersTo = 0; this.received = new Tv(0, 0); this.sent = new Tv(0, 0); this.size = 0; } deserialize(buffer) { let view = new DataView(buffer); this.type = view.getUint16(0, true); this.id = view.getUint16(2, true); this.refersTo = view.getUint16(4, true); this.received = new Tv(view.getInt32(6, true), view.getInt32(10, true)); this.sent = new Tv(view.getInt32(14, true), view.getInt32(18, true)); this.size = view.getUint32(22, true); } serialize() { this.size = 26 + this.getSize(); let buffer = new ArrayBuffer(this.size); let view = new DataView(buffer); view.setUint16(0, this.type, true); view.setUint16(2, this.id, true); view.setUint16(4, this.refersTo, true); view.setInt32(6, this.sent.sec, true); view.setInt32(10, this.sent.usec, true); view.setInt32(14, this.received.sec, true); view.setInt32(18, this.received.usec, true); view.setUint32(22, this.size, true); return buffer; } getSize() { return 0; } } class CodecMessage extends BaseMessage { constructor(buffer) { super(buffer); this.codec = ""; this.payload = new ArrayBuffer(0); if (buffer) { this.deserialize(buffer); } this.type = 1; } deserialize(buffer) { super.deserialize(buffer); let view = new DataView(buffer); let codecSize = view.getInt32(26, true); let decoder = new TextDecoder("utf-8"); this.codec = decoder.decode(buffer.slice(30, 30 + codecSize)); let payloadSize = view.getInt32(30 + codecSize, true); console.log("payload size: " + payloadSize); this.payload = buffer.slice(34 + codecSize, 34 + codecSize + payloadSize); console.log("payload: " + this.payload); } } class TimeMessage extends BaseMessage { constructor(buffer) { super(buffer); this.latency = new Tv(0, 0); if (buffer) { this.deserialize(buffer); } this.type = 4; } deserialize(buffer) { super.deserialize(buffer); let view = new DataView(buffer); this.latency = new Tv(view.getInt32(26, true), view.getInt32(30, true)); } serialize() { let buffer = super.serialize(); let view = new DataView(buffer); view.setInt32(26, this.latency.sec, true); view.setInt32(30, this.latency.usec, true); return buffer; } getSize() { return 8; } } class JsonMessage extends BaseMessage { constructor(buffer) { super(buffer); if (buffer) { this.deserialize(buffer); } } deserialize(buffer) { super.deserialize(buffer); let view = new DataView(buffer); let size = view.getUint32(26, true); let decoder = new TextDecoder(); this.json = JSON.parse(decoder.decode(buffer.slice(30, 30 + size))); } serialize() { let buffer = super.serialize(); let view = new DataView(buffer); let jsonStr = JSON.stringify(this.json); view.setUint32(26, jsonStr.length, true); let encoder = new TextEncoder(); let encoded = encoder.encode(jsonStr); for (let i = 0; i < encoded.length; ++i) view.setUint8(30 + i, encoded[i]); return buffer; } getSize() { let encoder = new TextEncoder(); let encoded = encoder.encode(JSON.stringify(this.json)); return encoded.length + 4; // return JSON.stringify(this.json).length; } } class HelloMessage extends JsonMessage { constructor(buffer) { super(buffer); this.mac = ""; this.hostname = ""; this.version = "0.1.0"; this.clientName = "Snapweb"; this.os = ""; this.arch = "web"; this.instance = 1; this.uniqueId = ""; this.snapStreamProtocolVersion = 2; if (buffer) { this.deserialize(buffer); } this.type = 5; } deserialize(buffer) { super.deserialize(buffer); this.mac = this.json["MAC"]; this.hostname = this.json["HostName"]; this.version = this.json["Version"]; this.clientName = this.json["ClientName"]; this.os = this.json["OS"]; this.arch = this.json["Arch"]; this.instance = this.json["Instance"]; this.uniqueId = this.json["ID"]; this.snapStreamProtocolVersion = this.json["SnapStreamProtocolVersion"]; } serialize() { this.json = { "MAC": this.mac, "HostName": this.hostname, "Version": this.version, "ClientName": this.clientName, "OS": this.os, "Arch": this.arch, "Instance": this.instance, "ID": this.uniqueId, "SnapStreamProtocolVersion": this.snapStreamProtocolVersion }; return super.serialize(); } } class ServerSettingsMessage extends JsonMessage { constructor(buffer) { super(buffer); this.bufferMs = 0; this.latency = 0; this.volumePercent = 0; this.muted = false; if (buffer) { this.deserialize(buffer); } this.type = 3; } deserialize(buffer) { super.deserialize(buffer); this.bufferMs = this.json["bufferMs"]; this.latency = this.json["latency"]; this.volumePercent = this.json["volume"]; this.muted = this.json["muted"]; } serialize() { this.json = { "bufferMs": this.bufferMs, "latency": this.latency, "volume": this.volumePercent, "muted": this.muted }; return super.serialize(); } } class PcmChunkMessage extends BaseMessage { constructor(buffer, sampleFormat) { super(buffer); this.timestamp = new Tv(0, 0); // payloadSize: number = 0; this.payload = new ArrayBuffer(0); this.idx = 0; this.deserialize(buffer); this.sampleFormat = sampleFormat; this.type = 2; } deserialize(buffer) { super.deserialize(buffer); let view = new DataView(buffer); this.timestamp = new Tv(view.getInt32(26, true), view.getInt32(30, true)); // this.payloadSize = view.getUint32(34, true); this.payload = buffer.slice(38); //, this.payloadSize + 38));// , this.payloadSize); // console.log("ts: " + this.timestamp.sec + " " + this.timestamp.usec + ", payload: " + this.payloadSize + ", len: " + this.payload.byteLength); } readFrames(frames) { let frameCnt = frames; let frameSize = this.sampleFormat.frameSize(); if (this.idx + frames > this.payloadSize() / frameSize) frameCnt = (this.payloadSize() / frameSize) - this.idx; let begin = this.idx * frameSize; this.idx += frameCnt; let end = begin + frameCnt * frameSize; // console.log("readFrames: " + frames + ", result: " + frameCnt + ", begin: " + begin + ", end: " + end + ", payload: " + this.payload.byteLength); return this.payload.slice(begin, end); } getFrameCount() { return (this.payloadSize() / this.sampleFormat.frameSize()); } isEndOfChunk() { return this.idx >= this.getFrameCount(); } startMs() { return this.timestamp.getMilliseconds() + 1000 * (this.idx / this.sampleFormat.rate); } duration() { return 1000 * ((this.getFrameCount() - this.idx) / this.sampleFormat.rate); } payloadSize() { return this.payload.byteLength; } clearPayload() { this.payload = new ArrayBuffer(0); } addPayload(buffer) { let payload = new ArrayBuffer(this.payload.byteLength + buffer.byteLength); let view = new DataView(payload); let viewOld = new DataView(this.payload); let viewNew = new DataView(buffer); for (let i = 0; i < viewOld.byteLength; ++i) { view.setInt8(i, viewOld.getInt8(i)); } for (let i = 0; i < viewNew.byteLength; ++i) { view.setInt8(i + viewOld.byteLength, viewNew.getInt8(i)); } this.payload = payload; } } class AudioStream { constructor(timeProvider, sampleFormat, bufferMs) { this.timeProvider = timeProvider; this.sampleFormat = sampleFormat; this.bufferMs = bufferMs; this.chunks = new Array(); // setRealSampleRate(sampleRate: number) { // if (sampleRate == this.sampleFormat.rate) { // this.correctAfterXFrames = 0; // } // else { // this.correctAfterXFrames = Math.ceil((this.sampleFormat.rate / sampleRate) / (this.sampleFormat.rate / sampleRate - 1.)); // console.debug("setRealSampleRate: " + sampleRate + ", correct after X: " + this.correctAfterXFrames); // } // } this.chunk = undefined; this.volume = 1; this.muted = false; this.lastLog = 0; } setVolume(percent, muted) { // let base = 10; this.volume = percent / 100; // (Math.pow(base, percent / 100) - 1) / (base - 1); console.log("setVolume: " + percent + " => " + this.volume + ", muted: " + this.muted); this.muted = muted; } addChunk(chunk) { this.chunks.push(chunk); // let oldest = this.timeProvider.serverNow() - this.chunks[0].timestamp.getMilliseconds(); // let newest = this.timeProvider.serverNow() - this.chunks[this.chunks.length - 1].timestamp.getMilliseconds(); // console.debug("chunks: " + this.chunks.length + ", oldest: " + oldest.toFixed(2) + ", newest: " + newest.toFixed(2)); while (this.chunks.length > 0) { let age = this.timeProvider.serverNow() - this.chunks[0].timestamp.getMilliseconds(); // todo: consider buffer ms if (age > 5000 + this.bufferMs) { this.chunks.shift(); console.log("Dropping old chunk: " + age.toFixed(2) + ", left: " + this.chunks.length); } else break; } } getNextBuffer(buffer, playTimeMs) { if (!this.chunk) { this.chunk = this.chunks.shift(); } // let age = this.timeProvider.serverTime(this.playTime * 1000) - startMs; let frames = buffer.length; // console.debug("getNextBuffer: " + frames + ", play time: " + playTimeMs.toFixed(2)); let left = new Float32Array(frames); let right = new Float32Array(frames); let read = 0; let pos = 0; // let volume = this.muted ? 0 : this.volume; let serverPlayTimeMs = this.timeProvider.serverTime(playTimeMs); if (this.chunk) { let age = serverPlayTimeMs - this.chunk.startMs(); // - 500; let reqChunkDuration = frames / this.sampleFormat.msRate(); let secs = Math.floor(Date.now() / 1000); if (this.lastLog != secs) { this.lastLog = secs; console.log("age: " + age.toFixed(2) + ", req: " + reqChunkDuration); } if (age < -reqChunkDuration) { console.log("age: " + age.toFixed(2) + " < req: " + reqChunkDuration * -1 + ", chunk.startMs: " + this.chunk.startMs().toFixed(2) + ", timestamp: " + this.chunk.timestamp.getMilliseconds().toFixed(2)); console.log("Chunk too young, returning silence"); } else { if (Math.abs(age) > 5) { // We are 5ms apart, do a hard sync, i.e. don't play faster/slower, // but seek to the desired position instead while (this.chunk && age > this.chunk.duration()) { console.log("Chunk too old, dropping (age: " + age.toFixed(2) + " > " + this.chunk.duration().toFixed(2) + ")"); this.chunk = this.chunks.shift(); if (!this.chunk) break; age = serverPlayTimeMs - this.chunk.startMs(); } if (this.chunk) { if (age > 0) { console.log("Fast forwarding " + age.toFixed(2) + "ms"); this.chunk.readFrames(Math.floor(age * this.chunk.sampleFormat.msRate())); } else if (age < 0) { console.log("Playing silence " + -age.toFixed(2) + "ms"); let silentFrames = Math.floor(-age * this.chunk.sampleFormat.msRate()); left.fill(0, 0, silentFrames); right.fill(0, 0, silentFrames); read = silentFrames; pos = silentFrames; } age = 0; } } // else if (age > 0.1) { // let rate = age * 0.0005; // rate = 1.0 - Math.min(rate, 0.0005); // console.debug("Age > 0, rate: " + rate); // // we are late (age > 0), this means we are not playing fast enough // // => the real sample rate seems to be lower, we have to drop some frames // this.setRealSampleRate(this.sampleFormat.rate * rate); // 0.9999); // } // else if (age < -0.1) { // let rate = -age * 0.0005; // rate = 1.0 + Math.min(rate, 0.0005); // console.debug("Age < 0, rate: " + rate); // // we are early (age > 0), this means we are playing too fast // // => the real sample rate seems to be higher, we have to insert some frames // this.setRealSampleRate(this.sampleFormat.rate * rate); // 0.9999); // } // else { // this.setRealSampleRate(this.sampleFormat.rate); // } let addFrames = 0; let everyN = 0; if (age > 0.1) { addFrames = Math.ceil(age); // / 5); } else if (age < -0.1) { addFrames = Math.floor(age); // / 5); } // addFrames = -2; let readFrames = frames + addFrames - read; if (addFrames != 0) everyN = Math.ceil((frames + addFrames - read) / (Math.abs(addFrames) + 1)); // addFrames = 0; // console.debug("frames: " + frames + ", readFrames: " + readFrames + ", addFrames: " + addFrames + ", everyN: " + everyN); while ((read < readFrames) && this.chunk) { let pcmChunk = this.chunk; let pcmBuffer = pcmChunk.readFrames(readFrames - read); let payload = new Int16Array(pcmBuffer); // console.debug("readFrames: " + (frames - read) + ", read: " + pcmBuffer.byteLength + ", payload: " + payload.length); // read += (pcmBuffer.byteLength / this.sampleFormat.frameSize()); for (let i = 0; i < payload.length; i += 2) { read++; left[pos] = (payload[i] / 32768); // * volume; right[pos] = (payload[i + 1] / 32768); // * volume; if ((everyN != 0) && (read % everyN == 0)) { if (addFrames > 0) { pos--; } else { left[pos + 1] = left[pos]; right[pos + 1] = right[pos]; pos++; // console.log("Add: " + pos); } } pos++; } if (pcmChunk.isEndOfChunk()) { this.chunk = this.chunks.shift(); } } if (addFrames != 0) console.debug("Pos: " + pos + ", frames: " + frames + ", add: " + addFrames + ", everyN: " + everyN); if (read == readFrames) read = frames; } } if (read < frames) { console.log("Failed to get chunk, read: " + read + "/" + frames + ", chunks left: " + this.chunks.length); left.fill(0, pos); right.fill(0, pos); } // copyToChannel is not supported by Safari buffer.getChannelData(0).set(left); buffer.getChannelData(1).set(right); } } class TimeProvider { constructor(ctx = undefined) { this.diffBuffer = new Array(); this.diff = 0; if (ctx) { this.setAudioContext(ctx); } } setAudioContext(ctx) { this.ctx = ctx; this.reset(); } reset() { this.diffBuffer.length = 0; this.diff = 0; } setDiff(c2s, s2c) { if (this.now() == 0) { this.reset(); } else { if (this.diffBuffer.push((c2s - s2c) / 2) > 100) this.diffBuffer.shift(); let sorted = [...this.diffBuffer]; sorted.sort(); this.diff = sorted[Math.floor(sorted.length / 2)]; } // console.debug("c2s: " + c2s.toFixed(2) + ", s2c: " + s2c.toFixed(2) + ", diff: " + this.diff.toFixed(2) + ", now: " + this.now().toFixed(2) + ", server.now: " + this.serverNow().toFixed(2) + ", win.now: " + window.performance.now().toFixed(2)); // console.log("now: " + this.now() + "\t" + this.now() + "\t" + this.now()); } now() { if (!this.ctx) { return window.performance.now(); } else { // Use the more accurate getOutputTimestamp if available, fallback to ctx.currentTime otherwise. const contextTime = !!this.ctx.getOutputTimestamp ? this.ctx.getOutputTimestamp().contextTime : undefined; return (contextTime !== undefined ? contextTime : this.ctx.currentTime) * 1000; } } nowSec() { return this.now() / 1000; } serverNow() { return this.serverTime(this.now()); } serverTime(localTimeMs) { return localTimeMs + this.diff; } } class SampleFormat { constructor() { this.rate = 48000; this.channels = 2; this.bits = 16; } msRate() { return this.rate / 1000; } toString() { return this.rate + ":" + this.bits + ":" + this.channels; } sampleSize() { if (this.bits == 24) { return 4; } return this.bits / 8; } frameSize() { return this.channels * this.sampleSize(); } durationMs(bytes) { return (bytes / this.frameSize()) * this.msRate(); } } class Decoder { setHeader(_buffer) { return new SampleFormat(); } decode(_chunk) { return null; } } class OpusDecoder extends Decoder { setHeader(buffer) { let view = new DataView(buffer); let ID_OPUS = 0x4F505553; if (buffer.byteLength < 12) { console.error("Opus header too small: " + buffer.byteLength); return null; } else if (view.getUint32(0, true) != ID_OPUS) { console.error("Opus header too small: " + buffer.byteLength); return null; } let format = new SampleFormat(); format.rate = view.getUint32(4, true); format.bits = view.getUint16(8, true); format.channels = view.getUint16(10, true); console.log("Opus samplerate: " + format.toString()); return format; } decode(_chunk) { return null; } } class FlacDecoder extends Decoder { constructor() { super(); this.header = null; this.cacheInfo = { isCachedChunk: false, cachedBlocks: 0 }; this.decoder = Flac.create_libflac_decoder(true); if (this.decoder) { let init_status = Flac.init_decoder_stream(this.decoder, this.read_callback_fn.bind(this), this.write_callback_fn.bind(this), this.error_callback_fn.bind(this), this.metadata_callback_fn.bind(this), false); console.log("Flac init: " + init_status); Flac.setOptions(this.decoder, { analyseSubframes: true, analyseResiduals: true }); } this.sampleFormat = new SampleFormat(); this.flacChunk = new ArrayBuffer(0); // this.pcmChunk = new PcmChunkMessage(); // Flac.setOptions(this.decoder, {analyseSubframes: analyse_frames, analyseResiduals: analyse_residuals}); // flac_ok &= init_status == 0; // console.log("flac init : " + flac_ok);//DEBUG } decode(chunk) { // console.log("Flac decode: " + chunk.payload.byteLength); this.flacChunk = chunk.payload.slice(0); this.pcmChunk = chunk; this.pcmChunk.clearPayload(); this.cacheInfo = { cachedBlocks: 0, isCachedChunk: true }; // console.log("Flac len: " + this.flacChunk.byteLength); while (this.flacChunk.byteLength && Flac.FLAC__stream_decoder_process_single(this.decoder)) { Flac.FLAC__stream_decoder_get_state(this.decoder); // let state = Flac.FLAC__stream_decoder_get_state(this.decoder); // console.log("State: " + state); } // console.log("Pcm payload: " + this.pcmChunk!.payloadSize()); if (this.cacheInfo.cachedBlocks > 0) { let diffMs = this.cacheInfo.cachedBlocks / this.sampleFormat.msRate(); // console.log("Cached: " + this.cacheInfo.cachedBlocks + ", " + diffMs + "ms"); this.pcmChunk.timestamp.setMilliseconds(this.pcmChunk.timestamp.getMilliseconds() - diffMs); } return this.pcmChunk; } read_callback_fn(bufferSize) { // console.log(' decode read callback, buffer bytes max=', bufferSize); if (this.header) { console.log(" header: " + this.header.byteLength); let data = new Uint8Array(this.header); this.header = null; return { buffer: data, readDataLength: data.byteLength, error: false }; } else if (this.flacChunk) { // console.log(" flacChunk: " + this.flacChunk.byteLength); // a fresh read => next call to write will not be from cached data this.cacheInfo.isCachedChunk = false; let data = new Uint8Array(this.flacChunk.slice(0, Math.min(bufferSize, this.flacChunk.byteLength))); this.flacChunk = this.flacChunk.slice(data.byteLength); return { buffer: data, readDataLength: data.byteLength, error: false }; } return { buffer: new Uint8Array(0), readDataLength: 0, error: false }; } write_callback_fn(data, frameInfo) { // console.log(" write frame metadata: " + frameInfo + ", len: " + data.length); if (this.cacheInfo.isCachedChunk) { // there was no call to read, so it's some cached data this.cacheInfo.cachedBlocks += frameInfo.blocksize; } let payload = new ArrayBuffer((frameInfo.bitsPerSample / 8) * frameInfo.channels * frameInfo.blocksize); let view = new DataView(payload); for (let channel = 0; channel < frameInfo.channels; ++channel) { let channelData = new DataView(data[channel].buffer, 0, data[channel].buffer.byteLength); // console.log("channelData: " + channelData.byteLength + ", blocksize: " + frameInfo.blocksize); for (let i = 0; i < frameInfo.blocksize; ++i) { view.setInt16(2 * (frameInfo.channels * i + channel), channelData.getInt16(2 * i, true), true); } } this.pcmChunk.addPayload(payload); // console.log("write: " + payload.byteLength + ", len: " + this.pcmChunk!.payloadSize()); } /** @memberOf decode */ metadata_callback_fn(data) { console.info('meta data: ', data); // let view = new DataView(data); this.sampleFormat.rate = data.sampleRate; this.sampleFormat.channels = data.channels; this.sampleFormat.bits = data.bitsPerSample; console.log("metadata_callback_fn, sampleformat: " + this.sampleFormat.toString()); } /** @memberOf decode */ error_callback_fn(err, errMsg) { console.error('decode error callback', err, errMsg); } setHeader(buffer) { this.header = buffer.slice(0); Flac.FLAC__stream_decoder_process_until_end_of_metadata(this.decoder); return this.sampleFormat; } } class PlayBuffer { constructor(buffer, playTime, source, destination) { this.num = 0; this.buffer = buffer; this.playTime = playTime; this.source = source; this.source.buffer = this.buffer; this.source.connect(destination); this.onended = (_playBuffer) => { }; } start() { this.source.onended = () => { this.onended(this); }; this.source.start(this.playTime); } } class PcmDecoder extends Decoder { setHeader(buffer) { let sampleFormat = new SampleFormat(); let view = new DataView(buffer); sampleFormat.channels = view.getUint16(22, true); sampleFormat.rate = view.getUint32(24, true); sampleFormat.bits = view.getUint16(34, true); return sampleFormat; } decode(chunk) { return chunk; } } class SnapStream { constructor(baseUrl) { this.playTime = 0; this.msgId = 0; this.bufferDurationMs = 80; // 0; this.bufferFrameCount = 3844; // 9600; // 2400;//8192; this.syncHandle = -1; // ageBuffer: Array; this.audioBuffers = new Array(); this.freeBuffers = new Array(); // median: number = 0; this.audioBufferCount = 3; this.bufferMs = 1000; this.bufferNum = 0; this.latency = 0; this.baseUrl = baseUrl; this.timeProvider = new TimeProvider(); if (this.setupAudioContext()) { this.connect(); } else { alert("Sorry, but the Web Audio API is not supported by your browser"); } } setupAudioContext() { let AudioContext = window.AudioContext // Default || window.webkitAudioContext // Safari and old versions of Chrome || false; if (AudioContext) { let options; options = { latencyHint: "playback", sampleRate: this.sampleFormat ? this.sampleFormat.rate : undefined }; const chromeVersion = getChromeVersion(); if ((chromeVersion !== null && chromeVersion < 55) || !window.AudioContext) { // Some older browsers won't decode the stream if options are provided. options = undefined; } this.ctx = new AudioContext(options); this.gainNode = this.ctx.createGain(); this.gainNode.connect(this.ctx.destination); } else { // Web Audio API is not supported return false; } return true; } connect() { this.streamsocket = new WebSocket(this.baseUrl + '/stream'); this.streamsocket.binaryType = "arraybuffer"; this.streamsocket.onmessage = (ev) => this.onMessage(ev); this.streamsocket.onopen = () => { console.log("on open"); let hello = new HelloMessage(); hello.mac = "00:00:00:00:00:00"; hello.arch = "web"; hello.os = navigator.platform; hello.hostname = "Snapweb client"; hello.uniqueId = getPersistentValue("uniqueId", uuidv4()); this.sendMessage(hello); this.syncTime(); this.syncHandle = window.setInterval(() => this.syncTime(), 1000); }; this.streamsocket.onerror = (ev) => { console.error('error:', ev); }; this.streamsocket.onclose = () => { window.clearInterval(this.syncHandle); console.info('connection lost, reconnecting in 1s'); setTimeout(() => this.connect(), 1000); }; } onMessage(msg) { let view = new DataView(msg.data); let type = view.getUint16(0, true); if (type == 1) { let codec = new CodecMessage(msg.data); console.log("Codec: " + codec.codec); if (codec.codec == "flac") { this.decoder = new FlacDecoder(); } else if (codec.codec == "pcm") { this.decoder = new PcmDecoder(); } else if (codec.codec == "opus") { this.decoder = new OpusDecoder(); alert("Codec not supported: " + codec.codec); } else { alert("Codec not supported: " + codec.codec); } if (this.decoder) { this.sampleFormat = this.decoder.setHeader(codec.payload); console.log("Sampleformat: " + this.sampleFormat.toString()); if ((this.sampleFormat.channels != 2) || (this.sampleFormat.bits != 16)) { alert("Stream must be stereo with 16 bit depth, actual format: " + this.sampleFormat.toString()); } else { if (this.bufferDurationMs != 0) { this.bufferFrameCount = Math.floor(this.bufferDurationMs * this.sampleFormat.msRate()); } if (window.AudioContext) { // we are not using webkitAudioContext, so it's safe to setup a new AudioContext with the new samplerate // since this code is not triggered by direct user input, we cannt create a webkitAudioContext here this.stopAudio(); this.setupAudioContext(); } this.ctx.resume(); this.timeProvider.setAudioContext(this.ctx); this.gainNode.gain.value = this.serverSettings.muted ? 0 : this.serverSettings.volumePercent / 100; // this.timeProvider = new TimeProvider(this.ctx); this.stream = new AudioStream(this.timeProvider, this.sampleFormat, this.bufferMs); this.latency = (this.ctx.baseLatency !== undefined ? this.ctx.baseLatency : 0) + (this.ctx.outputLatency !== undefined ? this.ctx.outputLatency : 0); console.log("Base latency: " + this.ctx.baseLatency + ", output latency: " + this.ctx.outputLatency + ", latency: " + this.latency); this.play(); } } } else if (type == 2) { let pcmChunk = new PcmChunkMessage(msg.data, this.sampleFormat); if (this.decoder) { let decoded = this.decoder.decode(pcmChunk); if (decoded) { this.stream.addChunk(decoded); } } } else if (type == 3) { this.serverSettings = new ServerSettingsMessage(msg.data); this.gainNode.gain.value = this.serverSettings.muted ? 0 : this.serverSettings.volumePercent / 100; this.bufferMs = this.serverSettings.bufferMs - this.serverSettings.latency; console.log("ServerSettings bufferMs: " + this.serverSettings.bufferMs + ", latency: " + this.serverSettings.latency + ", volume: " + this.serverSettings.volumePercent + ", muted: " + this.serverSettings.muted); } else if (type == 4) { if (this.timeProvider) { let time = new TimeMessage(msg.data); this.timeProvider.setDiff(time.latency.getMilliseconds(), this.timeProvider.now() - time.sent.getMilliseconds()); } // console.log("Time sec: " + time.latency.sec + ", usec: " + time.latency.usec + ", diff: " + this.timeProvider.diff); } else { console.info("Message not handled, type: " + type); } } sendMessage(msg) { msg.sent = new Tv(0, 0); msg.sent.setMilliseconds(this.timeProvider.now()); msg.id = ++this.msgId; if (this.streamsocket.readyState == this.streamsocket.OPEN) { this.streamsocket.send(msg.serialize()); } } syncTime() { let t = new TimeMessage(); t.latency.setMilliseconds(this.timeProvider.now()); this.sendMessage(t); // console.log("prepareSource median: " + Math.round(this.median * 10) / 10); } stopAudio() { // if (this.ctx) { // this.ctx.close(); // } this.ctx.suspend(); while (this.audioBuffers.length > 0) { let buffer = this.audioBuffers.pop(); buffer.onended = () => { }; buffer.source.stop(); } while (this.freeBuffers.length > 0) { this.freeBuffers.pop(); } } stop() { window.clearInterval(this.syncHandle); this.stopAudio(); if ([WebSocket.OPEN, WebSocket.CONNECTING].includes(this.streamsocket.readyState)) { this.streamsocket.onclose = () => { }; this.streamsocket.close(); } } play() { this.playTime = this.timeProvider.nowSec() + 0.1; for (let i = 1; i <= this.audioBufferCount; ++i) { this.playNext(); } } playNext() { let buffer = this.freeBuffers.pop() || this.ctx.createBuffer(this.sampleFormat.channels, this.bufferFrameCount, this.sampleFormat.rate); let playTimeMs = (this.playTime + this.latency) * 1000 - this.bufferMs; this.stream.getNextBuffer(buffer, playTimeMs); let source = this.ctx.createBufferSource(); let playBuffer = new PlayBuffer(buffer, this.playTime, source, this.gainNode); this.audioBuffers.push(playBuffer); playBuffer.num = ++this.bufferNum; playBuffer.onended = (buffer) => { // let diff = this.timeProvider.nowSec() - buffer.playTime; this.freeBuffers.push(this.audioBuffers.splice(this.audioBuffers.indexOf(buffer), 1)[0].buffer); // console.debug("PlayBuffer " + playBuffer.num + " ended after: " + (diff * 1000) + ", in flight: " + this.audioBuffers.length); this.playNext(); }; playBuffer.start(); this.playTime += this.bufferFrameCount / this.sampleFormat.rate; } } //# sourceMappingURL=snapstream.js.map ================================================ FILE: packages/addons/service/snapserver/snapweb/styles.css ================================================ body { background-color: rgb(246, 246, 246); color: rgb(255, 255, 255); font-family: 'Arial', sans-serif; width: 100%; margin: 0; font-size: 20px; overscroll-behavior: contain; } /* width */ ::-webkit-scrollbar { width: 10px; } /* Track */ ::-webkit-scrollbar-track { background: #1f1f1f; } /* Handle */ ::-webkit-scrollbar-thumb { background: #333; } /* Handle on hover */ ::-webkit-scrollbar-thumb:hover { background: #555; } .navbar { overflow: hidden; background-color: #607d8b; z-index: 1; /* Sit on top */ padding: 13px; color: white; position: fixed; /* Set the navbar to fixed position */ top: 0; /* Position the navbar at the top of the page */ width: 100%; /* Full width */ font-size: 21px; font-weight: 500; user-select: none; } .play-button { display: block; position: absolute; right: 34px; top: 5px; height: 40px; width: 40px; } .content { margin-top: 62px } .group { float: none; background-color: white; box-shadow: 0px 3px 5px 0px rgba(0,0,0,0.2); clear: both; padding: 8px; margin: 10px 15px 10px 15px; overflow: auto; width: auto; border-radius: 3px; user-select: none; } .group.muted { opacity: 0.27; } .groupheader { /* margin: 10px; */ width: auto; height: fit-content; /* padding: 10px; */ padding-bottom: 0px; display: grid; grid-template-columns: min-content auto min-content; grid-template-rows: min-content min-content; grid-gap: 0px; } .groupheader-separator { height: 1px; margin: 8px 0px; border-width: 0px; color: lightgray; background-color: lightgray; } .stream { color: #686868; grid-row: 1; grid-column: 1/3; width: fit-content; } select { background-color: transparent; border: 0px; width: 150px; font-size: 20px; color: #e3e3e3; -moz-appearance: none; -webkit-appearance: none; appearance: none; } .slidergroupdiv { /* background: greenyellow; */ display: flex; justify-content: center; align-items: center; grid-row: 2; grid-column: 2; } .client { /* text-align: left; */ /* margin: 10px; */ width: auto; height: fit-content; /* padding: 10px; */ display: grid; grid-template-columns: min-content auto min-content; grid-template-rows: min-content min-content; grid-gap: 0px; } /* .client:hover { box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2); } */ .client.disconnected { opacity: 0.27; } .name { color: #686868; user-select: none; /* background: red; */ padding-top: 5px; grid-row: 1; grid-column: 1/3; text-decoration: none; } .editdiv { background: violet; grid-row: 0/4; grid-column: 3; } .edit-icon { color: #686868; text-decoration: none; } .delete-icon { color: #ff4081; text-decoration: none; } .edit-icons { align-items: center; display: flex; grid-row: 1/3; grid-column: 3; } .edit-group-icon { display: flex; color: transparent; align-items: center; grid-row: 1/3; grid-column: 3; text-decoration: none; } .mute-button { color: #686868; grid-row: 2; grid-column: 1; height: 25px; width: 25px; padding-left: 10px; padding-right: 10px; text-decoration: none; } .sliderdiv { display: flex; justify-content: center; align-items: center; grid-row: 2; grid-column: 2; /* padding-left: 40px; */ /* display: inline-block; text-align: left; width: 250px; */ } .slider { writing-mode: bt-lr; -webkit-appearance: none; background: #dbdbdb; outline: none; -webkit-transition: .2s; transition: opacity .2s; height: 2px; width: 90%; } .slider::-moz-range-track { padding: 6px; background-color: transparent; border: none; } .slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; height: 12px; width: 12px; border-radius: 50%; background: #ff4081; cursor: pointer; } .slider::-moz-range-thumb { height: 12px; width: 12px; border-radius: 50%; background: #ff4081; cursor: pointer; } .slider.muted { opacity: 0.27; } .client-settings { display: none; /* Hidden by default */ position: fixed; /* Stay in place */ z-index: 1; /* Sit on top */ left: 0; top: 0; width: 100%; /* Full width */ height: 100%; /* Full height */ overflow: auto; /* Enable scroll if needed */ background-color: rgb(0,0,0); /* Fallback color */ background-color: rgba(0,0,0,0.4); /* Black w/ opacity */ } .client-setting-content { background-color: #fefefe; color: #686868; margin: 15% auto; /* 15% from the top and centered */ padding: 20px; border: 1px solid #888; width: 80%; /* Could be more or less, depending on screen size */ } .client-input { color: #686868; width: 100%; padding: 12px 20px; margin: 8px 0; display: block; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; } input[type=submit] { width: 100%; background-color: #4CAF50; color: white; padding: 14px 20px; margin: 8px 0; border: none; border-radius: 4px; cursor: pointer; } input[type=submit]:hover { background-color: #45a049; } div.container { border-radius: 5px; background-color: #f2f2f2; padding: 20px; } ================================================ FILE: packages/addons/service/snapserver/source/bin/snapserver.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.snapserver config="pulseaudio.conf" link="/storage/.config/pulse-daemon.conf.d/50-snapserver.conf" mkdir -p "$(dirname $link)" ln -sf "$ADDON_HOME/$config" "$link" if [ ! -e "$ADDON_HOME/$config" ]; then cp "$ADDON_DIR/config/$config" "$ADDON_HOME" fi file="/tmp/snapkodi" sink_name="Snapserver" if [ -z "$(pactl list short | grep $sink_name)" ]; then pactl load-module module-pipe-sink \ file="$file" \ rate=48000 \ sink_name="$sink_name" \ sink_properties=device.description="$sink_name" fi case "$ss_st" in Default) stream="pipe:///tmp/snapfifo?name=Default" ;; Kodi) stream="pipe://$file?name=Kodi" ;; Spotify) stream="spotify:///librespot?name=Spotify&devicename=$ss_ln" if [ "$ss_lp" != 0 ]; then stream="$stream¶ms=--zeroconf-port%3D$ss_lp" fi ;; *) stream="airplay:///shairport-sync?name=AirPlay" ;; esac if [ "$ss_eh" = "true" ] ; then enable_http=1 else enable_http=0 fi nqptp & HOME="$ADDON_HOME" \ nice -n "$ss_ni" \ snapserver \ --controlPort "$ss_cp" \ --port "$ss_sp" \ --http.enabled "$enable_http" \ --http.port "$ss_hp" \ --http.bind_to_address "$ss_ha" \ --http.doc_root="$ADDON_DIR/snapweb" \ --stream.stream "$stream" \ > /dev/null ================================================ FILE: packages/addons/service/snapserver/source/config/pulseaudio.conf ================================================ ### Pulseaudio reads this file when it starts-up ### Uncomment or add options if you know what you are doing #resample-method = soxr-vhq #default-sample-format = s16le #default-sample-rate = 48000 ================================================ FILE: packages/addons/service/snapserver/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon def systemctl(command): subprocess.call( ['systemctl', command, xbmcaddon.Addon().getAddonInfo('id')]) class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) def onSettingsChanged(self): systemctl('restart') if __name__ == '__main__': Monitor().waitForAbort() ================================================ FILE: packages/addons/service/snapserver/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: snapserver # Addon id: service.snapclient # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "Configuration" msgstr "" msgctxt "#30001" msgid "Server port" msgstr "" msgctxt "#30002" msgid "Control port" msgstr "" msgctxt "#30003" msgid "Priority" msgstr "" msgctxt "#30004" msgid "Stream" msgstr "" msgctxt "#30005" msgid "Enable HTTP server" msgstr "" msgctxt "#30006" msgid "HTTP server port" msgstr "" msgctxt "#30007" msgid "HTTP server bind address" msgstr "" msgctxt "#30008" msgid "Librespot devicename" msgstr "" msgctxt "#30009" msgid "Librespot zeroconf-port" msgstr "" ================================================ FILE: packages/addons/service/snapserver/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/snapserver/source/settings-default.xml ================================================ 1705 0 1704 AirPlay Snapcast 0 false 1780 0.0.0.0 ================================================ FILE: packages/addons/service/snapserver/source/system.d/service.snapserver.service ================================================ [Unit] Description=Snapserver After=kodi.service network-online.target sound.target Requires=kodi.service network-online.target sound.target [Service] ExecStart=/bin/sh /storage/.kodi/addons/service.snapserver/bin/snapserver.start Restart=always [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/syncthing/changelog.txt ================================================ 1 - not released for LE11 2 - syncthing: update to 1.23.4 ================================================ FILE: packages/addons/service/syncthing/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="syncthing" PKG_VERSION="1.23.4" PKG_SHA256="06a2882f8ac49e15faf96025b01d0edcd4cc190a419d5de98fbe8271695329fa" PKG_REV="2" PKG_ARCH="any" PKG_LICENSE="MPLv2" PKG_SITE="https://syncthing.net/" PKG_URL="https://github.com/syncthing/syncthing/releases/download/v${PKG_VERSION}/syncthing-source-v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain go:host" PKG_SECTION="service/system" PKG_SHORTDESC="Syncthing: open source continuous file synchronization" PKG_LONGDESC="Syncthing (${PKG_VERSION}) replaces proprietary sync and cloud services with something open, trustworthy and decentralized. Your data is your data alone and you deserve to choose where it is stored, if it is shared with some third party and how it's transmitted over the Internet." PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Syncthing" PKG_ADDON_TYPE="xbmc.service" PKG_MAINTAINER="Anton Voyl (awiouy)" configure_target() { go_configure export LDFLAGS="-w -linkmode external -extldflags -Wl,--unresolved-symbols=ignore-in-shared-libs -extld ${CC} \ -X github.com/syncthing/syncthing/lib/build.Version=v${PKG_VERSION}" } make_target() { ${GOLANG} build -a -ldflags "${LDFLAGS}" -o bin/syncthing -v ./cmd/syncthing } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P ${PKG_BUILD}/bin/syncthing \ ${ADDON_BUILD}/${PKG_ADDON_ID}/bin } ================================================ FILE: packages/addons/service/syncthing/source/bin/syncthing-service ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.system.syncthing STNODEFAULTFOLDER="1" syncthing -home=$ADDON_HOME \ -gui-address="$gui_address" \ -logflags=0 \ -no-browser \ -no-restart \ & ================================================ FILE: packages/addons/service/syncthing/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == '__main__': Monitor().waitForAbort() ================================================ FILE: packages/addons/service/syncthing/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: syncthing # Addon id: service.system.syncthing # Addon Provider: awiouy at gmail dot com msgid "" msgstr "" msgctxt "#30000" msgid "GUI Address" msgstr "" msgctxt "#30001" msgid "GUI Address" msgstr "" ================================================ FILE: packages/addons/service/syncthing/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/syncthing/source/settings-default.xml ================================================ 0.0.0.0:8384 ================================================ FILE: packages/addons/service/syncthing/source/system.d/service.system.syncthing.service ================================================ [Unit] Description=Syncthing - Open Source Continuous File Synchronization Documentation=http://docs.syncthing.net/ After=network.target Requires=network.target [Service] Type=forking ExecStart=/bin/sh /storage/.kodi/addons/service.system.syncthing/bin/syncthing-service Restart=on-failure SuccessExitStatus=3 4 RestartForceExitStatus=3 4 [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/tigervnc/changelog.txt ================================================ 1 - fix not working TigerVNC ================================================ FILE: packages/addons/service/tigervnc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tigervnc" PKG_VERSION="1.10.1" PKG_SHA256="19fcc80d7d35dd58115262e53cac87d8903180261d94c2a6b0c19224f50b58c4" PKG_REV="1" PKG_ARCH="x86_64" PKG_LICENSE="GPLv2" PKG_SITE="http://www.tigervnc.org" PKG_URL="https://github.com/TigerVNC/tigervnc/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain cmake:host libX11 libXdamage libXext libXtst zlib libjpeg-turbo" PKG_SECTION="service" PKG_SHORTDESC="${PKG_ADDON_NAME} server" PKG_LONGDESC="${PKG_ADDON_NAME} (${PKG_VERSION}) is a high-performance, platform-neutral implementation of Virtual Network Computing, a client/server application that allows users to launch and interact with graphical applications on remote machines" PKG_IS_ADDON="yes" PKG_ADDON_NAME="TigerVNC" PKG_ADDON_TYPE="xbmc.service" PKG_CMAKE_OPTS_TARGET="-DBUILD_VIEWER=off -Wno-dev" makeinstall_target() { : # nothing to do } # find ${1}.so.[0-9]* in ${2} and copy it to dest _pkg_copy_lib() { find "${2}/usr/lib" -regextype sed -regex ".*/${1}\.so\.[0-9]*" \ -exec cp {} "${ADDON_BUILD}/${PKG_ADDON_ID}/lib" \; } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/{bin,lib} cp ${PKG_BUILD}/.${TARGET_NAME}/unix/vncconfig/vncconfig \ ${PKG_BUILD}/.${TARGET_NAME}/unix/vncpasswd/vncpasswd \ ${PKG_BUILD}/.${TARGET_NAME}/unix/x0vncserver/x0vncserver \ ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ # copy required libraries for tigervnc _pkg_copy_lib libXtst $(get_install_dir libXtst) } ================================================ FILE: packages/addons/service/tigervnc/patches/tigervnc-system-notests.patch ================================================ --- a/CMakeLists.txt 2017-06-12 12:08:55.347685243 +0000 +++ b/CMakeLists.txt 2017-06-12 12:09:01.337595834 +0000 @@ -300,7 +300,6 @@ add_subdirectory(media) endif() -add_subdirectory(tests) include(cmake/BuildPackages.cmake) ================================================ FILE: packages/addons/service/tigervnc/source/bin/tigervnc.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.tigervnc if [ ! -f "$ADDON_HOME/passwd" ] then cp "$ADDON_DIR/config/passwd" "$ADDON_HOME/passwd" fi x0vncserver -PasswordFile="$ADDON_HOME/passwd" -rfbport="$vnc_port" ================================================ FILE: packages/addons/service/tigervnc/source/config/passwd ================================================ u@(8 ================================================ FILE: packages/addons/service/tigervnc/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == "__main__": Monitor().waitForAbort() ================================================ FILE: packages/addons/service/tigervnc/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: tigervnc # Addon id: service.tigervnc msgid "" msgstr "" msgctxt "#30000" msgid "Configuration" msgstr "" msgctxt "#30001" msgid "port" msgstr "" ================================================ FILE: packages/addons/service/tigervnc/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/tigervnc/source/settings-default.xml ================================================ ================================================ FILE: packages/addons/service/tigervnc/source/system.d/service.tigervnc.service ================================================ [Unit] Description=TigerVNC After=graphical.target [Service] Environment=DISPLAY=:0.0 ExecStart=/bin/sh /storage/.kodi/addons/service.tigervnc/bin/tigervnc.start TimeoutStopSec=1 Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/tinc/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/tinc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tinc" PKG_VERSION="1.1pre18" PKG_SHA256="bd2d010a1bdeb1dd767f6fbc769fce2a2169119fb3d177df928c27d1f20b5775" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="http://www.tinc-vpn.org/" PKG_URL="https://github.com/gsliepen/tinc/archive/release-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain lzo miniupnpc ncurses openssl readline zlib" PKG_SECTION="service/system" PKG_SHORTDESC="tinc: a Virtual Private Network daemon" PKG_LONGDESC="tinc (${PKG_VERSION}) is a Virtual Private Network (VPN) daemon that uses tunnelling and encryption to create a secure private network between hosts on the Internet. Because the VPN appears to the IP level network code as a normal network device, there is no need to adapt any existing software. This allows VPN sites to share information with each other over the Internet without exposing any information to others." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic" PKG_IS_ADDON="yes" PKG_ADDON_NAME="tinc" PKG_ADDON_TYPE="xbmc.service" PKG_MAINTAINER="Anton Voyl (awiouy)" PKG_CONFIGURE_OPTS_TARGET="--enable-miniupnpc \ --sysconfdir=/run" PKG_MAKE_OPTS_TARGET="SUBDIRS=src" PKG_MAKEINSTALL_OPTS_TARGET="SUBDIRS=src" make_target() { : } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp ${PKG_INSTALL}/usr/sbin/* \ ${ADDON_BUILD}/${PKG_ADDON_ID}/bin } ================================================ FILE: packages/addons/service/tinc/patches/tinc-0001-fix-autoconf-archive.patch ================================================ From 9f1151cd9813477dafb939f3b0234a654e80a3b0 Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Tue, 28 Jan 2020 03:22:15 +0000 Subject: [PATCH] fix API change since autoconf-archive-2019.01.06 --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index e69542e..19d1e31 100644 --- a/Makefile.am +++ b/Makefile.am @@ -8,7 +8,7 @@ ACLOCAL_AMFLAGS = -I m4 EXTRA_DIST = COPYING.README README.android -@CODE_COVERAGE_RULES@ +include $(top_srcdir)/aminclude_static.am # If git describe works, force autoconf to run in order to make sure we have the # current version number from git in the resulting configure script. -- 2.7.4 ================================================ FILE: packages/addons/service/tinc/source/bin/tinc.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.system.tinc DIR_LEGACY="$ADDON_HOME/.config" if [ -d "$DIR_LEGACY" ]; then echo "Warning: using legacy configuration $DIR_LEGACY, ignoring Kodi settings" tincd --config "$DIR_LEGACY" --no-detach exit $? fi [ -z "$tinc_loglevel" ] && tinc_loglevel="3" NET="vmnet_le" NAME="${tinc_subnet//./_}" CONF_KEYS="/storage/.cache/tinc.$NET" CONF_TINC="/run/tinc/$NET" DATA_LOCAL="$ADDON_HOME/Local" DATA_REMOTES="$ADDON_HOME/Remotes" rm -fr "$CONF_TINC" "$DATA_LOCAL" &> /dev/null if [ ! -d "$CONF_KEYS" ]; then rm -fr "$CONF_KEYS" &> /dev/null mkdir -p "$CONF_KEYS" tinc --batch --config "$CONF_KEYS" generate-ed25519-keys fi if [ ! -d "$DATA_REMOTES" ]; then rm -fr "$DATA_REMOTES" &> /dev/null mkdir -p "$DATA_REMOTES" fi if [ "$tinc_subnet" == "0.0.0.0" ]; then echo "Warning: default subnet $tinc_subnet, aborting" exit fi if [ -e "$DATA_REMOTES/$NAME" ]; then echo "Error: $NAME in $DATA_REMOTES, aborting" exit fi mkdir -p "$CONF_TINC" cp -RT "$ADDON_DIR/config" "$CONF_TINC" chmod +x "$CONF_TINC"/*-* ln -sf "$DATA_REMOTES" "$CONF_TINC/hosts" tee >> "$CONF_TINC/tinc.conf" << EOF Ed25519PrivateKeyFile = $CONF_KEYS/ed25519_key.priv LogLevel = $tinc_loglevel Name = $NAME EOF mkdir -p "$DATA_LOCAL" if [ -n "$tinc_address" ]; then echo "Address = $tinc_address" >> "$DATA_LOCAL/$NAME" fi cat "$CONF_KEYS/ed25519_key.pub" >> "$DATA_LOCAL/$NAME" tee -a "$CONF_TINC/tinc.conf" >> "$DATA_LOCAL/$NAME" << EOF Port = $tinc_port Subnet = $tinc_subnet EOF tincd --net "$NET" --no-detach ================================================ FILE: packages/addons/service/tinc/source/config/subnet-down ================================================ #!/bin/sh if [ "$NAME" != "$NODE" ]; then ip route del "$SUBNET" dev "$INTERFACE" fi ================================================ FILE: packages/addons/service/tinc/source/config/subnet-up ================================================ #!/bin/sh if [ "$NAME" == "$NODE" ]; then ip addr replace "$SUBNET" dev "$INTERFACE" else ip route replace "$SUBNET" dev "$INTERFACE" fi ================================================ FILE: packages/addons/service/tinc/source/config/tinc-up ================================================ #!/bin/sh ip link set up dev "$INTERFACE" ================================================ FILE: packages/addons/service/tinc/source/config/tinc.conf ================================================ AutoConnect = yes ExperimentalProtocol = yes LocalDiscovery = yes Mode = Router TunnelServer = yes UPnP = yes ================================================ FILE: packages/addons/service/tinc/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == '__main__': Monitor().waitForAbort() ================================================ FILE: packages/addons/service/tinc/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: tinc # Addon id: service.system.tinc # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "Host" msgstr "" msgctxt "#30001" msgid "Subnet (private IP address)" msgstr "" msgctxt "#30002" msgid "Port" msgstr "" msgctxt "#30003" msgid "Address (public DNS name)" msgstr "" msgctxt "#30004" msgid "Debug" msgstr "" msgctxt "#30005" msgid "LogLevel" msgstr "" ================================================ FILE: packages/addons/service/tinc/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/tinc/source/settings-default.xml ================================================ 3 6550 0.0.0.0 ================================================ FILE: packages/addons/service/tinc/source/system.d/service.system.tinc.service ================================================ [Unit] Description=tinc for LibreELEC Documentation=http://tinc-vpn.org/docs/ After=network-online.target Requires=network-online.target [Service] ExecStart=/bin/sh /storage/.kodi/addons/service.system.tinc/bin/tinc.start Restart=on-failure [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/touchscreen/addon.xml ================================================ @REQUIRES@ executable @PKG_SHORTDESC@ @PKG_LONGDESC@ @PKG_DISCLAIMER@ all @PKG_ADDON_NEWS@ resources/icon.png resources/fanart.png @PKG_ADDON_SCREENSHOT@ ================================================ FILE: packages/addons/service/touchscreen/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/touchscreen/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="touchscreen" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="any" PKG_ADDON_PROJECTS="Generic RPi ARM" PKG_LICENSE="GPL" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain tslib evtest" PKG_SECTION="service" PKG_SHORTDESC="Touchscreen: support addon for Touchscreens" PKG_LONGDESC="Touchscreen: addon creates new virtual input device and \ converts data from touchscreen to Kodi. Short tap sends button press event \ and long tap sends only xy coordinates. Also includes calibration program." PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Touchscreen" PKG_ADDON_TYPE="xbmc.service" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp ${PKG_DIR}/addon.xml ${ADDON_BUILD}/${PKG_ADDON_ID} # set only version (revision will be added by buildsystem) sed -e "s|@ADDON_VERSION@|${ADDON_VERSION}|g" \ -i ${ADDON_BUILD}/${PKG_ADDON_ID}/addon.xml cp $(get_install_dir tslib)/usr/bin/* ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp $(get_install_dir evtest)/usr/bin/evtest ${ADDON_BUILD}/${PKG_ADDON_ID}/bin } ================================================ FILE: packages/addons/service/touchscreen/source/bin/ts_calibrate.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.touchscreen if [ -d /usr/share/kodi/addons/service.touchscreen ]; then # addon included in image ADDON_DIR="/usr/share/kodi/addons/service.touchscreen" fi . $ADDON_DIR/bin/ts_env.sh echo "touchscreen device: $TSLIB_TSDEVICE" if [ "$1" = "service" ]; then # recalibrate from service if required SETTINGS_XML="$ADDON_HOME/settings.xml" if [ -f "$SETTINGS_XML" ]; then mkdir -p /var/config # check settings version XML_SETTINGS_VER="$(xmlstarlet sel -t -m settings -v @version $SETTINGS_XML)" if [ "$XML_SETTINGS_VER" = "2" ]; then xmlstarlet sel -t -m settings/setting -v @id -o "=\"" -v . -o "\"" -n "$SETTINGS_XML" > /var/config/ts_calibration_addon.conf else xmlstarlet sel -t -m settings -m setting -v @id -o "=\"" -v @value -o "\"" -n "$SETTINGS_XML" > /var/config/ts_calibration_addon.conf fi . /var/config/ts_calibration_addon.conf if [ "$TS_RECALIBRATE" = "true" ]; then sed -i 's|id="TS_RECALIBRATE"[ ]*value="true"|id="TS_RECALIBRATE" value="false"|g' "$SETTINGS_XML" touch $ADDON_HOME/recalibrate fi fi if [ -f $ADDON_HOME/recalibrate ]; then echo "recalibrating..." rm -f $ADDON_HOME/recalibrate ts_calibrate fi else echo "Stopping Kodi and touchscreen daemon..." systemctl stop kodi systemctl stop ts_uinput_touch while pidof kodi.bin &>/dev/null; do sleep 0.5 done killall ts_uinput_touch &>/dev/null ts_calibrate # restart both if argument was set if [ "$1" = "run" ]; then echo "Starting touchscreen daemon and Kodi..." systemctl start ts_uinput_touch systemctl start kodi fi fi ================================================ FILE: packages/addons/service/touchscreen/source/bin/ts_env.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.touchscreen if [ -d /usr/share/kodi/addons/service.touchscreen ]; then # addon included in image ADDON_DIR=/usr/share/kodi/addons/service.touchscreen fi if [ ! -f $ADDON_HOME/ts.conf-generic ]; then cp $ADDON_DIR/config/* $ADDON_HOME fi if [ -f $ADDON_HOME/ts_env.sh ]; then # use user supplied script if [ ! -x $ADDON_HOME/ts_env.sh ]; then chmod +x $ADDON_HOME/ts_env.sh fi dos2unix $ADDON_HOME/ts_env.sh dos2unix $ADDON_HOME/ts.conf . $ADDON_HOME/ts_env.sh else # automatic start only on Udoo dual/quad for ldb screen LDB="" if grep -iq ":dev=ldb" /proc/cmdline; then LDB="yes" # maybe 7" LVDS display modprobe st1232 >/dev/null 2>&1 fi if [ -n "$LDB" ]; then # find event# with command # ls -l /dev/input/by-id # or using evtest program # st1232 module is always loaded so check for 3M first TS_DEVICE_1="3M 3M USB Touchscreen - EX II" TS_DEVICE_2="st1232-touchscreen" TS_DEVICE_CONF_1="ts.conf-udoo_15_6" TS_DEVICE_CONF_2="ts.conf-udoo_7" TS_DEVICE_CONF_GENERIC="ts.conf-generic" #TS_DEVICE="$TS_DEVICE_1" # use specified one, should exist ts.conf for it TS_DEVICE="" # find one automatically #echo "device: $TS_DEVICE" TS_DEVICE_CONF="" if [ -n "$TS_DEVICE" ]; then TSLIB_TSDEVICE=$(echo 999 | evtest 2>&1 >/dev/null | awk -F':' -v TS_DEVICE="$TS_DEVICE" '$0 ~ TS_DEVICE {print $1}') TS_DEVICE_CONF="$TS_DEVICE_CONF_GENERIC" else TSLIB_TSDEVICE=$(echo 999 | evtest 2>&1 >/dev/null | awk -F':' -v TS_DEVICE="$TS_DEVICE_1" '$0 ~ TS_DEVICE {print $1}') if [ -n "$TSLIB_TSDEVICE" ]; then TS_DEVICE_CONF="$TS_DEVICE_CONF_1" rmmod st1232 >/dev/null 2>&1 # it's not else TSLIB_TSDEVICE=$(echo 999 | evtest 2>&1 >/dev/null | awk -F':' -v TS_DEVICE="$TS_DEVICE_2" '$0 ~ TS_DEVICE {print $1}') if [ -n "$TSLIB_TSDEVICE" ]; then TS_DEVICE_CONF="$TS_DEVICE_CONF_2" fi fi fi if [ ! -f $ADDON_HOME/ts.conf -a -n "$TS_DEVICE_CONF" ]; then cp "$ADDON_HOME/$TS_DEVICE_CONF" $ADDON_HOME/ts.conf fi export TSLIB_TSDEVICE="$TSLIB_TSDEVICE" export TSLIB_PLUGINDIR=$ADDON_DIR/lib export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export TSLIB_CALIBFILE=$ADDON_HOME/pointercal export TSLIB_CONFFILE=$ADDON_HOME/ts.conf #export TSLIB_RES_X=800 #export TSLIB_RES_Y=480 fi fi ================================================ FILE: packages/addons/service/touchscreen/source/bin/ts_uinput_touch.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.touchscreen if [ -d /usr/share/kodi/addons/service.touchscreen ]; then # addon included in image ADDON_DIR="/usr/share/kodi/addons/service.touchscreen" fi . $ADDON_DIR/bin/ts_env.sh params=$* if [ "$1" = "service" ]; then # skip service parameter and daemonize params="-d" else # started from command line systemctl stop ts_uinput_touch >/dev/null 2>&1 killall ts_uinput_touch >/dev/null 2>&1 fi echo " touchscreen device: '$TSLIB_TSDEVICE'" if [ -n "$TSLIB_RES_X" -a -n "$TSLIB_RES_Y" ]; then echo "touchscreen resolution: '${TSLIB_RES_X}x${TSLIB_RES_Y}'" params="-x $TSLIB_RES_X -y $TSLIB_RES_Y $params" fi echo "params: .$params." if [ ! -x $ADDON_HOME/ts_uinput_touch ]; then ts_uinput_touch $params else echo "Using $ADDON_HOME/ts_uinput_touch" $ADDON_HOME/ts_uinput_touch $params fi ================================================ FILE: packages/addons/service/touchscreen/source/calibrate.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import os import socket import sys from threading import Thread import xbmc import xbmcgui import xbmcaddon TEXT_ALIGN_LEFT = 0 TEXT_ALIGN_RIGHT = 1 TEXT_ALIGN_CENTER_X = 2 TEXT_ALIGN_CENTER_Y = 4 TEXT_ALIGN_RIGHT_CENTER_Y = 5 TEXT_ALIGN_LEFT_CENTER_X_CENTER_Y = 6 ACTION_PREVIOUS_MENU = 10 ACTION_BACKSPACE = 92 SOCK_PATH = "/tmp/ts_calibrate.socket" TSLIB_EDGE_OFFEST = 50 CROSSHAIR_IMAGE_SIZE = 23 CROSSHAIR_IMAGE_OFFSET = 11 SKIN_WIDTH = 1280 # we are using 720p skin SKIN_HEIGHT = 720 class coordinates: var_x = 0 var_y = 0 def server_thread(conn, self): while True: data = conn.recv(128) if not data: break self.currentTarget = self.currentTarget + 1 if self.currentTarget > 0: self.removeControl(self.targetImage) if self.currentTarget == 5: xbmcgui.Dialog().ok("Calibration", "Calibration done.") break self.info.setLabel("Touch '" + data + "' crosshair") self.targetImage = xbmcgui.ControlImage( self.touch_points[self.currentTarget].var_x - CROSSHAIR_IMAGE_OFFSET, self.touch_points[self.currentTarget].var_y - CROSSHAIR_IMAGE_OFFSET, CROSSHAIR_IMAGE_SIZE, CROSSHAIR_IMAGE_SIZE, self.crosshair_path, colorDiffuse='0x00000000') self.addControl(self.targetImage) # out of loop, close connection conn.close() os.remove(SOCK_PATH) self.retval = 0 self.close() class ts_calibrate(xbmcgui.WindowDialog): def __init__(self): self.retval = 0 self.media_path=os.path.join(addon.getAddonInfo('path'), 'resources','media') + '/' self.crosshair_path = self.media_path + 'crosshair.png' self.currentTarget = -1 self.edge_offset_x = TSLIB_EDGE_OFFEST * SKIN_WIDTH / self.getWidth() self.edge_offset_y = TSLIB_EDGE_OFFEST * SKIN_HEIGHT / self.getHeight() self.touch_points = [coordinates() for i in range(5)] self.touch_points[0].var_x = self.edge_offset_x self.touch_points[0].var_y = self.edge_offset_y self.touch_points[1].var_x = SKIN_WIDTH - self.edge_offset_x self.touch_points[1].var_y = self.edge_offset_y self.touch_points[2].var_x = SKIN_WIDTH - self.edge_offset_x self.touch_points[2].var_y = SKIN_HEIGHT - self.edge_offset_y self.touch_points[3].var_x = self.edge_offset_x self.touch_points[3].var_y = SKIN_HEIGHT - self.edge_offset_y self.touch_points[4].var_x = SKIN_WIDTH / 2 self.touch_points[4].var_y = SKIN_HEIGHT / 2 self.background = xbmcgui.ControlImage(0, 0, SKIN_WIDTH, SKIN_HEIGHT, self.media_path + 'background.jpg', colorDiffuse = '0xffffffff') self.addControl(self.background) tmp_str = "Tslib/Kodi calibration utility\n\nTouch crosshair to calibrate" tmp_str += "\n\nresolution: " + str(self.getWidth()) + "x" + str(self.getHeight()) tmp_str += "\nskin: " + str(SKIN_WIDTH) + "x" + str(SKIN_HEIGHT) self.about = xbmcgui.ControlLabel( 10, 80, SKIN_WIDTH, 400, "", textColor = '0xffffffff', font = 'font25', alignment = TEXT_ALIGN_CENTER_X) self.addControl(self.about) self.about.setLabel(tmp_str) self.info = xbmcgui.ControlLabel( 20, SKIN_HEIGHT/2 - 40, 1000, 400, "", textColor = '0xffffffff', font = 'font30', alignment = TEXT_ALIGN_LEFT) self.addControl(self.info) self.info.setLabel("") if os.path.exists(SOCK_PATH): os.remove(SOCK_PATH) sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sock.bind(SOCK_PATH) sock.listen(1) # enter calibration mode os.system("killall -SIGUSR1 ts_uinput_touch") print 'Waiting for calibration connection' conn, addr = sock.accept() print 'Calibration connection accepted' self.t = Thread(target=server_thread, args=(conn, self,)) self.t.start() def onAction(self, action): if action == ACTION_PREVIOUS_MENU or action == ACTION_BACKSPACE: self.retval = 0 self.close() addon = xbmcaddon.Addon(id = 'service.touchscreen') finished = False while finished == False: dialog = ts_calibrate() dialog.doModal() if dialog.retval == 0: finished = True del dialog del addon # exit calibration mode os.system("killall -SIGUSR2 ts_uinput_touch") if os.path.exists(SOCK_PATH): os.remove(SOCK_PATH) ================================================ FILE: packages/addons/service/touchscreen/source/config/ts.conf-generic ================================================ module_raw input grab_events=1 module pthres pmin=1 module variance delta=30 module dejitter delta=100 module linear # or use swap_xy parameter to swap axes #module linear swap_xy=1 ================================================ FILE: packages/addons/service/touchscreen/source/config/ts.conf-udoo_15_6 ================================================ # Udoo with 15.6" 1366x768 display with 3M USB Touchscreen - EX II module_raw input grab_events=1 module pthres pmin=1 module variance delta=30 module dejitter delta=100 module linear ================================================ FILE: packages/addons/service/touchscreen/source/config/ts.conf-udoo_7 ================================================ # Udoo with 7" 800x480 display with ST1232 touch controler # only st1232 raw input module is used module_raw st1232 grab_events=1 invert_y=480 ================================================ FILE: packages/addons/service/touchscreen/source/config/ts.conf-waveshare ================================================ # len is hidraw data size module_raw waveshare len=22 module pthres pmin=1 module variance delta=30 module dejitter delta=100 module linear ================================================ FILE: packages/addons/service/touchscreen/source/config/ts_env.sh-sample ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) # find touchscreen device by name (substring) using evtest program # $ evtest # No device specified, trying to scan all of /dev/input/event* # Available devices: # /dev/input/event0: Video Bus # /dev/input/event1: Goodix Capacitive TouchScreen # Select the device event number [0-1]: TOUCHSCREEN_NAME="Goodix Capacitive TouchScreen" TSLIB_TSDEVICE=$(echo 999 | evtest 2>&1 >/dev/null | awk -F':' -v TS_NAME="$TOUCHSCREEN_NAME" '$0 ~ TS_NAME {print $1; exit}') export TSLIB_TSDEVICE export TSLIB_PLUGINDIR=$ADDON_DIR/lib export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export TSLIB_CALIBFILE=/storage/.kodi/userdata/addon_data/service.touchscreen/pointercal export TSLIB_CONFFILE=/storage/.kodi/userdata/addon_data/service.touchscreen/ts.conf # sometimes needed #export TSLIB_RES_X=800 #export TSLIB_RES_Y=480 ================================================ FILE: packages/addons/service/touchscreen/source/config/ts_env.sh-waveshare ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) # change vid/pid for waveshare touchscreen device PRODUCT_VID=0EEF PRODUCT_PID=0005 # device set directly or find automaticaly at the end of this script export TSLIB_TSDEVICE="" #export TSLIB_TSDEVICE="/dev/hidrawN" export TSLIB_PLUGINDIR=$ADDON_DIR/lib export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export TSLIB_CALIBFILE=/storage/.kodi/userdata/addon_data/service.touchscreen/pointercal export TSLIB_CONFFILE=/storage/.kodi/userdata/addon_data/service.touchscreen/ts.conf export TSLIB_RES_X=800 export TSLIB_RES_Y=480 # find touchscreen device if [ "$TSLIB_TSDEVICE" = "" ]; then PRODUCT_VID_PID="0000${PRODUCT_VID}:0000${PRODUCT_PID}" echo "PRODUCT_VID_PID: $PRODUCT_VID_PID" hidrawN="" for dev in /sys/class/hidraw/hidraw*/device/uevent; do echo echo "device: $dev" HID_ID=$(cat $dev | grep HID_ID | grep "$PRODUCT_VID_PID") if [ -n "$HID_ID" ]; then hidrawN=$(echo $dev | awk -F "/" '{print $5}') hidrawN="/dev/$hidrawN" echo "OK HID_ID: $HID_ID" echo "OK hidrawN: $hidrawN" break fi done if [ -n "$hidrawN" ]; then echo "found hidrawN: $hidrawN" export TSLIB_TSDEVICE=$hidrawN fi fi ================================================ FILE: packages/addons/service/touchscreen/source/lock-screen.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import xbmc import xbmcgui import xbmcaddon __scriptid__ = 'service.touchscreen' __addon__ = xbmcaddon.Addon(id=__scriptid__) _ = __addon__.getLocalizedString # http://forum.kodi.tv/showthread.php?tid=230766 def handle_wait(time_to_wait, title, text): dialog = xbmcgui.DialogProgress() ret = dialog.create(' ' + title) secs = 0 percent = 0 increment = int(100 / time_to_wait) while secs < time_to_wait: secs += 1 percent = increment*secs secs_left = time_to_wait - secs remaining_display = (_(2030).encode('utf-8')) % secs_left dialog.update(percent, text, "", remaining_display) xbmc.sleep(1000) dialog.close() return False # how long to lock the screen lock_secs = 30 handle_wait(lock_secs, _(2010).encode('utf-8'), _(2020).encode('utf-8')) ================================================ FILE: packages/addons/service/touchscreen/source/resources/language/English/strings.xml ================================================ General Recalibrate after reboot Clean screen Touchscreen Now you can safely clean the screen. Still %d seconds left. ================================================ FILE: packages/addons/service/touchscreen/source/resources/language/German/strings.xml ================================================ Allgemein Nach einem Neustart neu kalibrieren Touchscreen reinigen Touchscreen Sie können jetzt den Touchscreen sicher reinigen. Noch %d Sekunden übrig. ================================================ FILE: packages/addons/service/touchscreen/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/touchscreen/source/service.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) ================================================ FILE: packages/addons/service/touchscreen/source/system.d/service.touchscreen.service ================================================ [Unit] Description=Touchscreen support daemon After=graphical.target Before=kodi.target [Service] Type=oneshot Environment=HOME=/storage ExecStartPre=-/bin/sh -c "exec /bin/sh /storage/.kodi/addons/service.touchscreen/bin/ts_calibrate.sh service" ExecStart=-/bin/sh -c "exec /bin/sh /storage/.kodi/addons/service.touchscreen/bin/ts_uinput_touch.sh service" RemainAfterExit=yes [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/ttyd/changelog.txt ================================================ 1 - ttyd: update to 1.7.3 ================================================ FILE: packages/addons/service/ttyd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ttyd" PKG_VERSION="1.7.3" PKG_SHA256="c9cf5eece52d27c5d728000f11315d36cb400c6948d1964a34a7eae74b454099" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/tsl0922/ttyd" PKG_URL="https://github.com/tsl0922/ttyd/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libwebsockets" PKG_SECTION="service" PKG_SHORTDESC="ttyd: a tool for accessing the terminal over a browser" PKG_LONGDESC="ttyd (${PKG_VERSION}): is a simple command-line tool for sharing terminal over the web" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Web SSH Terminal" PKG_ADDON_TYPE="xbmc.service" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P ${PKG_INSTALL}/usr/bin/ttyd ${ADDON_BUILD}/${PKG_ADDON_ID}/bin mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/lib cp -p $(get_install_dir json-c)/usr/lib/libjson-c.so.5 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib cp -p $(get_install_dir libwebsockets)/usr/lib/libwebsockets.so.19 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib cp -p $(get_install_dir libwebsockets)/usr/lib/libwebsockets-evlib_uv.so ${ADDON_BUILD}/${PKG_ADDON_ID}/lib cp -p $(get_install_dir libuv)/usr/lib/libuv.so.1 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib } ================================================ FILE: packages/addons/service/ttyd/source/bin/ttyd.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.ttyd chmod a+x $ADDON_DIR/bin/* if [ "$TTYD_NOLOGIN" = "true" ]; then TTYD_NOLOGIN="bash" elif [ "$TTYD_NOLOGIN" = "false" ]; then TTYD_NOLOGIN="login root" fi exec $ADDON_DIR/bin/ttyd -O -T xterm -p ${TTYD_WEBPORT} ${TTYD_NOLOGIN} &>$ADDON_HOME/service.log ================================================ FILE: packages/addons/service/ttyd/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == "__main__": Monitor().waitForAbort() ================================================ FILE: packages/addons/service/ttyd/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: ttyd # Addon id: service.ttyd # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "Settings" msgstr "" msgctxt "#30001" msgid "Webui Port" msgstr "" msgctxt "#30002" msgid "[COLOR FFFF0000][SECURITY RISK][/COLOR] Allow usage without password" msgstr "" ================================================ FILE: packages/addons/service/ttyd/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/ttyd/source/settings-default.xml ================================================ false 11111 ================================================ FILE: packages/addons/service/ttyd/source/system.d/service.ttyd.service ================================================ [Unit] Description=ttyd After=graphical.target [Service] ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.ttyd/bin/ttyd.start" TimeoutStopSec=1 Restart=always RestartSec=2 StartLimitInterval=0 Type=exec [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/tvheadend/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tvheadend" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="service.multimedia" PKG_SHORTDESC="Add-on removed" PKG_LONGDESC="Add-on removed" PKG_TOOLCHAIN="manual" PKG_ADDON_BROKEN="Tvheadend 4.0 is no longer maintained and has been superseded by Tvheadend 4.2." PKG_IS_ADDON="yes" PKG_ADDON_NAME="Tvheadend Server 4.0" PKG_ADDON_TYPE="xbmc.broken" addon() { : } ================================================ FILE: packages/addons/service/tvheadend42/addon.xml ================================================ @REQUIRES@ @PKG_ADDON_PROVIDES@ @PKG_ADDON_PROVIDES@ @PKG_SHORTDESC@ @PKG_LONGDESC@ @PKG_DISCLAIMER@ all @PKG_ADDON_NEWS@ resources/icon.png resources/fanart.png @PKG_ADDON_SCREENSHOT@ ================================================ FILE: packages/addons/service/tvheadend42/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/tvheadend42/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tvheadend42" PKG_VERSION="5bdcfd8ac97b3337e1c7911ae24127df76fa693a" PKG_SHA256="b562a26248cdc02dc94cc62038deea172668fa4c079b2ea4e1b4220f3b1d34f5" PKG_VERSION_NUMBER="4.2.8-36" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.tvheadend.org" PKG_URL="https://github.com/tvheadend/tvheadend/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain avahi comskip curl dvb-apps ffmpegx libdvbcsa libhdhomerun \ libiconv openssl pngquant:host Python3:host tvh-dtv-scan-tables" PKG_DEPENDS_CONFIG="ffmpegx" PKG_SECTION="service" PKG_SHORTDESC="Tvheadend: a TV streaming server for Linux" PKG_LONGDESC="Tvheadend (${PKG_VERSION_NUMBER}): is a TV streaming server for Linux supporting DVB-S/S2, DVB-C, DVB-T/T2, IPTV, SAT>IP, ATSC and ISDB-T" PKG_BUILD_FLAGS="-sysroot" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Tvheadend Server 4.2" PKG_ADDON_TYPE="xbmc.service" # basic transcoding options PKG_TVH_TRANSCODING="\ --disable-ffmpeg_static \ --disable-libfdkaac_static \ --disable-libopus_static \ --disable-libtheora \ --disable-libtheora_static \ --disable-libvorbis_static \ --disable-libvpx_static \ --disable-libx264_static \ --disable-libx265_static \ --enable-libav \ --enable-libfdkaac \ --enable-libopus \ --enable-libvorbis \ --enable-libx264" # hw specific transcoding options if [ "${TARGET_ARCH}" = "x86_64" ]; then PKG_DEPENDS_TARGET+=" libva" # specific transcoding options PKG_TVH_TRANSCODING="${PKG_TVH_TRANSCODING} \ --enable-vaapi \ --enable-libvpx \ --enable-libx265" else # for != "x86_64" targets # specific transcoding options PKG_TVH_TRANSCODING="${PKG_TVH_TRANSCODING} \ --disable-libvpx \ --disable-libx265" fi post_unpack() { sed -e 's/VER="0.0.0~unknown"/VER="'${PKG_VERSION_NUMBER}' ~ LibreELEC Tvh-addon v'${ADDON_VERSION}'.'${PKG_REV}'"/g' -i ${PKG_BUILD}/support/version sed -e 's|'/usr/bin/pngquant'|'${TOOLCHAIN}/bin/pngquant'|g' -i ${PKG_BUILD}/support/mkbundle } pre_configure_target() { PKG_CONFIGURE_OPTS_TARGET="--prefix=/usr \ --arch=${TARGET_ARCH} \ --cpu=${TARGET_CPU} \ --cc=${CC} \ ${PKG_TVH_TRANSCODING} \ --enable-avahi \ --enable-bundle \ --disable-dbus_1 \ --enable-dvbcsa \ --disable-dvben50221 \ --disable-dvbscan \ --enable-hdhomerun_client \ --disable-hdhomerun_static \ --enable-epoll \ --enable-inotify \ --enable-pngquant \ --disable-libmfx_static \ --disable-nvenc \ --disable-uriparser \ --enable-tvhcsa \ --enable-trace \ --nowerror \ --disable-bintray_cache \ --python=${TOOLCHAIN}/bin/python" # fails to build in subdirs cd ${PKG_BUILD} rm -rf .${TARGET_NAME} # pass ffmpegx to build CFLAGS+=" -I$(get_install_dir ffmpegx)/usr/local/include" LDFLAGS+=" -L$(get_install_dir ffmpegx)/usr/local/lib" # pass libhdhomerun to build CFLAGS+=" -I${SYSROOT_PREFIX}/usr/include/hdhomerun" export CROSS_COMPILE="${TARGET_PREFIX}" export CFLAGS+=" -I${SYSROOT_PREFIX}/usr/include/iconv -L${SYSROOT_PREFIX}/usr/lib/iconv" } post_make_target() { ${CC} -O -fbuiltin -fomit-frame-pointer -fPIC -shared -o capmt_ca.so src/extra/capmt_ca.c -ldl } post_makeinstall_target() { mkdir -p ${INSTALL}/usr/lib cp -p capmt_ca.so ${INSTALL}/usr/lib } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/{bin,lib} cp ${PKG_DIR}/addon.xml ${ADDON_BUILD}/${PKG_ADDON_ID} # set only version (revision will be added by buildsystem) sed -e "s|@ADDON_VERSION@|${ADDON_VERSION}|g" \ -i ${ADDON_BUILD}/${PKG_ADDON_ID}/addon.xml cp -P ${PKG_INSTALL}/usr/bin/tvheadend ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P ${PKG_INSTALL}/usr/lib/capmt_ca.so ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir comskip)/usr/bin/comskip ${ADDON_BUILD}/${PKG_ADDON_ID}/bin if [ "${TARGET_ARCH}" = "x86_64" ]; then cp -P $(get_install_dir x265)/usr/lib/libx265.so.199 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib fi # dvb-scan files mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/dvb-scan cp -r $(get_install_dir tvh-dtv-scan-tables)/usr/share/dvbv5/* \ ${ADDON_BUILD}/${PKG_ADDON_ID}/dvb-scan } ================================================ FILE: packages/addons/service/tvheadend42/patches/tvheadend42-01-dvb-scan-path.patch ================================================ --- a/src/input/mpegts/scanfile.c +++ b/src/input/mpegts/scanfile.c @@ -903,7 +903,7 @@ scanfile_init ( const char *muxconf_path, int lock ) #elif defined(PLATFORM_FREEBSD) path = "/usr/local/share/dtv-scan-tables"; #else - path = "/usr/share/dvb"; + path = "/storage/.kodi/addons/service.tvheadend42/dvb-scan"; #endif if (!initialized) { ================================================ FILE: packages/addons/service/tvheadend42/patches/tvheadend42-02-hdhomerun-includes.patch ================================================ fix libhdhomerun includes --- a/configure +++ b/configure @@ -362,7 +362,7 @@ if enabled hdhomerun_static; then else if enabled_or_auto hdhomerun_client; then - if check_cc_header 'libhdhomerun/hdhomerun' libhdhomerun; then + if check_cc_header 'hdhomerun' libhdhomerun; then enable hdhomerun_client LDFLAGS="$LDFLAGS -lhdhomerun" fi --- a/src/input/mpegts/tvhdhomerun/tvhdhomerun_private.h +++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun_private.h @@ -24,7 +24,7 @@ #include "htsbuf.h" #include "tvhdhomerun.h" -#include "libhdhomerun/hdhomerun.h" +#include "hdhomerun.h" typedef struct tvhdhomerun_device_info tvhdhomerun_device_info_t; typedef struct tvhdhomerun_device tvhdhomerun_device_t; ================================================ FILE: packages/addons/service/tvheadend42/patches/tvheadend42-03-hdhomerun-fix.patch ================================================ https://github.com/tvheadend/tvheadend/commit/13cd23c371e3377973502f8dc65654b6a0ff372b From: Michael Marley Date: Wed, 26 Jun 2019 19:35:50 -0400 Subject: [PATCH] Fix compilation with libhdhomerun 20190621 They renamed the symbol that was used to determine whether the "hdhomerun_discover_find_devices_custom" needed to be aliased, causing an FTBFS. Instead, recognize both the old and new symbols. --- src/input/mpegts/tvhdhomerun/tvhdhomerun.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/input/mpegts/tvhdhomerun/tvhdhomerun.c b/src/input/mpegts/tvhdhomerun/tvhdhomerun.c index 58dec51ab3..18068faf5d 100644 --- a/src/input/mpegts/tvhdhomerun/tvhdhomerun.c +++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun.c @@ -32,7 +32,8 @@ #include "config.h" -#ifdef HDHOMERUN_TAG_DEVICE_AUTH_BIN +#if defined(HDHOMERUN_TAG_DEVICE_AUTH_BIN) \ + || defined(HDHOMERUN_TAG_DEVICE_AUTH_BIN_DEPRECATED) #define hdhomerun_discover_find_devices_custom \ hdhomerun_discover_find_devices_custom_v2 #endif ================================================ FILE: packages/addons/service/tvheadend42/patches/tvheadend42-04-Fix-building-with-fno-common.patch ================================================ From 8a2942a361e95ccdbd30c1edc7627df3862cdbbe Mon Sep 17 00:00:00 2001 From: James Le Cuirot Date: Fri, 15 May 2020 17:45:30 +0100 Subject: [PATCH] Fix building with -fno-common (default from GCC 10) --- src/input.h | 4 ++-- src/input/mpegts.c | 2 ++ src/input/mpegts.h | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/input.h b/src/input.h index a9c96df048..3dce355c6a 100644 --- a/src/input.h +++ b/src/input.h @@ -133,8 +133,8 @@ void tvh_hardware_delete ( tvh_hardware_t *th ); extern const idclass_t tvh_input_class; extern const idclass_t tvh_input_instance_class; -tvh_input_list_t tvh_inputs; -tvh_hardware_list_t tvh_hardware; +extern tvh_input_list_t tvh_inputs; +extern tvh_hardware_list_t tvh_hardware; #define TVH_INPUT_FOREACH(x) LIST_FOREACH(x, &tvh_inputs, ti_link) #define TVH_HARDWARE_FOREACH(x) LIST_FOREACH(x, &tvh_hardware, th_link) diff --git a/src/input/mpegts.c b/src/input/mpegts.c index e02d491f19..fca4f34296 100644 --- a/src/input/mpegts.c +++ b/src/input/mpegts.c @@ -20,6 +20,8 @@ #include "mpegts/fastscan.h" #include "memoryinfo.h" +struct mpegts_listeners mpegts_listeners; + extern memoryinfo_t mpegts_input_queue_memoryinfo; extern memoryinfo_t mpegts_input_table_memoryinfo; diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 9dda3bacaa..9c4c57b73b 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -1149,7 +1149,7 @@ typedef struct mpegts_listener void (*ml_mux_delete) (mpegts_mux_t *mm, void *p); } mpegts_listener_t; -LIST_HEAD(,mpegts_listener) mpegts_listeners; +extern LIST_HEAD(mpegts_listeners, mpegts_listener) mpegts_listeners; #define mpegts_add_listener(ml)\ LIST_INSERT_HEAD(&mpegts_listeners, ml, ml_link) ================================================ FILE: packages/addons/service/tvheadend42/patches/tvheadend42-05-webui-query-url-fix.patch ================================================ Fix query urls for imdb.com and thetvdb.com Based on tvheadend master branch https://github.com/tvheadend/tvheadend/commit/d8a31e57a492be6628b685488fcc7f1d9d262679 https://github.com/tvheadend/tvheadend/commit/ce09077056f9c6558c188d135cec3be85cc9c200 --- a/src/webui/static/app/epg.js +++ b/src/webui/static/app/epg.js @@ -287,13 +287,11 @@ tvheadend.epgDetails = function(event) { win.show(); function searchIMDB() { - window.open('http://akas.imdb.com/find?q=' + - encodeURIComponent(event.title), '_blank'); + window.open('https://www.imdb.com/find?q=' + encodeURIComponent(event.title), '_blank'); } function searchTheTVDB(){ - window.open('http://thetvdb.com/?string='+ - encodeURIComponent(event.title)+'&searchseriesid=&tab=listseries&function=Search','_blank'); + window.open('https://www.thetvdb.com/search?query=' + encodeURIComponent(event.title), '_blank'); } function playProgram() { --- a/src/webui/static/app/dvr.js +++ b/src/webui/static/app/dvr.js @@ -87,13 +87,11 @@ tvheadend.dvrDetails = function(uuid) { })); function searchIMDB() { - window.open('http://akas.imdb.com/find?q=' + - encodeURIComponent(title), '_blank'); + window.open('https://www.imdb.com/find?q=' + encodeURIComponent(title), '_blank'); } function searchTheTVDB(){ - window.open('http://thetvdb.com/?string='+ - encodeURIComponent(title)+'&searchseriesid=&tab=listseries&function=Search','_blank'); + window.open('https://www.thetvdb.com/search?query=' + encodeURIComponent(title),'_blank'); } var win = new Ext.Window({ ================================================ FILE: packages/addons/service/tvheadend42/patches/tvheadend42-06-satip-upnp-fix.patch ================================================ From 1ebf9bf548540f935ff4ce1d380f5ce7849572f3 Mon Sep 17 00:00:00 2001 From: Matthieu Poullet Date: Tue, 15 Mar 2022 10:40:44 +0100 Subject: [PATCH] SAT>IP client: UPnP header field names are case insensitive - SAT>IP Protocol Specification 1.2.2: 3.3.2 Server Advertisements --- src/input/mpegts/satip/satip.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/input/mpegts/satip/satip.c b/src/input/mpegts/satip/satip.c index 4d522e19c4..58e91d30bb 100644 --- a/src/input/mpegts/satip/satip.c +++ b/src/input/mpegts/satip/satip.c @@ -1175,19 +1175,19 @@ satip_discovery_service_received if (ptr == NULL) break; if (http_tokenize(ptr, argv, 2, ':') == 2) { - if (strcmp(argv[0], "ST") == 0) + if (strcasecmp(argv[0], "ST") == 0) st = argv[1]; - else if (strcmp(argv[0], "LOCATION") == 0) + else if (strcasecmp(argv[0], "LOCATION") == 0) location = argv[1]; - else if (strcmp(argv[0], "SERVER") == 0) + else if (strcasecmp(argv[0], "SERVER") == 0) server = argv[1]; - else if (strcmp(argv[0], "BOOTID.UPNP.ORG") == 0) + else if (strcasecmp(argv[0], "BOOTID.UPNP.ORG") == 0) bootid = argv[1]; - else if (strcmp(argv[0], "CONFIGID.UPNP.ORG") == 0) + else if (strcasecmp(argv[0], "CONFIGID.UPNP.ORG") == 0) configid = argv[1]; - else if (strcmp(argv[0], "DEVICEID.SES.COM") == 0) + else if (strcasecmp(argv[0], "DEVICEID.SES.COM") == 0) deviceid = argv[1]; - else if (strcmp(argv[0], "USN") == 0) { + else if (strcasecmp(argv[0], "USN") == 0) { n = http_tokenize(argv[1], argv, ARRAY_SIZE(argv), ':'); for (i = 0; i < n-1; i++) if (argv[i] && strcmp(argv[i], "uuid") == 0) { ================================================ FILE: packages/addons/service/tvheadend42/source/bin/tv_grab_file ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) if [ $# -lt 1 ] then . /etc/profile ADDON_HOME="$HOME/.kodi/userdata/addon_data/service.tvheadend42" ADDON_SETTINGS="$ADDON_HOME/settings.xml" XML_SETTINGS_VER="$(xmlstarlet sel -t -m settings -v @version $ADDON_SETTINGS)" if [ "$XML_SETTINGS_VER" = "2" ]; then XMLTV_TYPE="$(xmlstarlet sel -t -v '/settings/setting[@id="XMLTV_TYPE"]' $ADDON_SETTINGS)" XMLTV_LOCATION_FILE="$(xmlstarlet sel -t -v '/settings/setting[@id="XMLTV_LOCATION_FILE"]' $ADDON_SETTINGS)" XMLTV_LOCATION_WEB="$(xmlstarlet sel -t -v '/settings/setting[@id="XMLTV_LOCATION_WEB"]' $ADDON_SETTINGS | xmlstarlet unesc)" XMLTV_LOCATION_SCRIPT="$(xmlstarlet sel -t -v '/settings/setting[@id="XMLTV_LOCATION_SCRIPT"]' $ADDON_SETTINGS)" else XMLTV_TYPE="$(xmlstarlet sel -t -m '/settings/setting[@id="XMLTV_TYPE"]' -v @value $ADDON_SETTINGS)" XMLTV_LOCATION_FILE="$(xmlstarlet sel -t -m '/settings/setting[@id="XMLTV_LOCATION_FILE"]' -v @value $ADDON_SETTINGS)" XMLTV_LOCATION_WEB="$(xmlstarlet sel -t -m '/settings/setting[@id="XMLTV_LOCATION_WEB"]' -v @value $ADDON_SETTINGS | xmlstarlet unesc)" XMLTV_LOCATION_SCRIPT="$(xmlstarlet sel -t -m '/settings/setting[@id="XMLTV_LOCATION_SCRIPT"]' -v @value $ADDON_SETTINGS)" fi if [ "$XMLTV_TYPE" = "FILE" ]; then case "$XMLTV_LOCATION_FILE" in *.gz | *.bz2 | *.xz) zcat "$XMLTV_LOCATION_FILE" ;; *) cat "$XMLTV_LOCATION_FILE" ;; esac exit 0 elif [ "$XMLTV_TYPE" = "SCRIPT" ]; then if [ -e "$XMLTV_LOCATION_SCRIPT" ] ; then exec "$XMLTV_LOCATION_SCRIPT" fi elif [ "$XMLTV_TYPE" = "WEB" ]; then case "$XMLTV_LOCATION_WEB" in *.gz | *.bz2 | *.xz) wget -qO - "$XMLTV_LOCATION_WEB" | zcat ;; *) wget -qO - "$XMLTV_LOCATION_WEB" ;; esac exit 0 fi fi dflag= vflag= cflag= for a in "$@" do [ "$a" = "-d" -o "$a" = "--description" ] && dflag=1 [ "$a" = "-v" -o "$a" = "--version" ] && vflag=1 [ "$a" = "-c" -o "$a" = "--capabilities" ] && cflag=1 done if [ -n "$dflag" ] then echo "tv_grab_file is a simple grabber that can be configured through the addon settings from Kodi" fi if [ -n "$vflag" ] then echo "1.0" fi if [ -n "$cflag" ] then echo "baseline" fi ================================================ FILE: packages/addons/service/tvheadend42/source/bin/tvheadend42.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.tvheadend42 ADDON_SETTINGS="$ADDON_HOME/settings.xml" COMSKIP_DIR="$ADDON_HOME/comskip" COMSKIP_SETTINGS_FILE="$COMSKIP_DIR/comskip.ini" DVR_SETTINGS_DIR="$ADDON_HOME/dvr/config" DVR_SETTINGS_FILE="$DVR_SETTINGS_DIR/8d0f5b7ae354d956d7fe5db25f5d0d24" EPGGRAB_SETTINGS_DIR="$ADDON_HOME/epggrab" EPGGRAB_SETTINGS_FILE="$EPGGRAB_SETTINGS_DIR/config" TIMESHIFT_SETTINGS_DIR="$ADDON_HOME/timeshift" TIMESHIFT_SETTINGS_FILE="$TIMESHIFT_SETTINGS_DIR/config" TVH_SETTINGS_DIR="$ADDON_HOME" TVH_SETTINGS_FILE="$TVH_SETTINGS_DIR/config" XMLTV_SETTINGS_DIR="$ADDON_HOME/xmltv" XMLTV_SETTINGS_FILE="$XMLTV_SETTINGS_DIR/config" TIMESHIFT_DIR="$ADDON_HOME/cache/timeshift" XMLTV_FILE="$ADDON_DIR/bin/tv_grab_file" chmod a+x $ADDON_DIR/bin/* # workaround to support old 4.1.x version upgrade for Tvh after 4.1.2369 if [ -f "$ADDON_HOME/dvr/config/dvr-config" ]; then rm $ADDON_HOME/dvr/config/dvr-config fi # workaround to create default Tvh directories without entering samba share if [ ! -d "/storage/recordings" ]; then mkdir -p /storage/recordings /storage/picons/tvh /storage/picons/vdr fi if [ -f "$ADDON_HOME/channel/config/config.tmp" ]; then rm $ADDON_HOME/channel/config/config.tmp fi if [ -f "$ADDON_HOME/channel/config/tag.tmp" ]; then rm $ADDON_HOME/channel/config/tag.tmp fi # copy config files to userdata if [ ! -f "$COMSKIP_SETTINGS_FILE" ]; then mkdir -p $COMSKIP_DIR cp $ADDON_DIR/defaults/comskip/comskip.ini $COMSKIP_SETTINGS_FILE fi if [ ! -f "$DVR_SETTINGS_FILE" ]; then mkdir -p $DVR_SETTINGS_DIR cp $ADDON_DIR/defaults/dvr/config/8d0f5b7ae354d956d7fe5db25f5d0d24 $DVR_SETTINGS_FILE fi if [ ! -f "$EPGGRAB_SETTINGS_FILE" ]; then mkdir -p $EPGGRAB_SETTINGS_DIR cp $ADDON_DIR/defaults/epggrab/config $EPGGRAB_SETTINGS_FILE fi if [ ! -f "$TIMESHIFT_SETTINGS_FILE" ]; then mkdir -p $TIMESHIFT_DIR mkdir -p $TIMESHIFT_SETTINGS_DIR cp $ADDON_DIR/defaults/timeshift/config $TIMESHIFT_SETTINGS_FILE fi if [ ! -f "$TVH_SETTINGS_FILE" ]; then mkdir -p $TVH_SETTINGS_DIR cp $ADDON_DIR/defaults/config $TVH_SETTINGS_FILE fi if [ ! -f "$XMLTV_SETTINGS_FILE" ]; then mkdir -p $XMLTV_SETTINGS_DIR cp $ADDON_DIR/defaults/xmltv/config $XMLTV_SETTINGS_FILE fi # delayed Tvh startup if [ "$WORKAROUND_SLEEP" == "true" ]; then sleep $WORKAROUND_SLEEP_TIME fi # support FritzBox Sat>IP Server detection workaround for AVM-Repeater and AVM-6490 if [ "$AVM_SATIP_SERVER" == "true" ]; then if [ "$AVM_DEVICE" == "AVM_Repeater" ]; then AVM_SATIP="--satip_xml http://${AVM_ROUTER_IP}:49000/satipdesc.xml" fi if [ "$AVM_DEVICE" == "AVM_6490" ]; then AVM_SATIP="--satip_xml http://${AVM_ROUTER_FAKE_IP}:49000/satipdesc.xml" AVM_NUM="4" fi # add virtual ip as workaround for AVM limitation of one stream per ip # AVM-Repeater (2 tuners) ip address add ${AVM_IP1}/24 dev $AVM_ETH ip address add ${AVM_IP2}/24 dev $AVM_ETH # AVM-6490 (4 tuners) if [ "$AVM_NUM" = "4" ]; then ip address add ${AVM_IP3}/24 dev $AVM_ETH ip address add ${AVM_IP4}/24 dev $AVM_ETH fi fi # custom startup parameters if [ "$CUSTOM_START" != "true" ]; then CUSTOM_ARGS="" fi # debug value generation if [ "$DEBUG_LOG_TRACE_1" != "NONE" ]; then DEBUG_LOG_ARG="$DEBUG_LOG_TRACE_1" fi if [ "$DEBUG_LOG_TRACE_2" != "NONE" ]; then DEBUG_LOG_ARG="$DEBUG_LOG_ARG,$DEBUG_LOG_TRACE_2" fi if [ "$DEBUG_LOG_TRACE_3" != "NONE" ]; then DEBUG_LOG_ARG="$DEBUG_LOG_ARG,$DEBUG_LOG_TRACE_3" fi if [ "$DEBUG_LOG_TRACE_4" != "NONE" ]; then DEBUG_LOG_ARG="$DEBUG_LOG_ARG,$DEBUG_LOG_TRACE_4" fi if [ "$DEBUG_LOG_TRACE_5" != "NONE" ]; then DEBUG_LOG_ARG="$DEBUG_LOG_ARG,$DEBUG_LOG_TRACE_5" fi # if debuglog is activated and nothing selected to trace if [ -z "$DEBUG_LOG_ARG" ];then DEBUG_LOG_ARG="all" fi # rename debuglog if already exist to prevent overwriting after crash if [ -f "${DEBUG_LOG_PATH}" ]; then cp ${DEBUG_LOG_PATH} ${DEBUG_LOG_PATH}_$(date '+%Y-%m-%d_%H.%M.%S').txt fi # debug commandline if [ "$DEBUG_LOG" = "true" ]; then TVHEADEND_ARG="-B -C -u root -g video -c $ADDON_HOME $AVM_SATIP $CUSTOM_ARGS -l ${DEBUG_LOG_PATH} --trace $DEBUG_LOG_ARG" else TVHEADEND_ARG="-B -C -u root -g video -c $ADDON_HOME $AVM_SATIP $CUSTOM_ARGS" fi # start userspace DVB driver/addon for driver_dvb in $(find /storage/.kodi/addons/driver.dvb.*/bin/userspace-driver.sh -type f 2>/dev/null); do driver_dvb_name=$(echo $driver_dvb | awk 'BEGIN {FS="/"} {printf("%s", $5)}') logger -t Tvheadend "### Loading userspace DVB driver: $driver_dvb_name ###" # use ". " because of variable export . $driver_dvb done if [ "$WAIT_FOR_FEINIT" == "true" ] ; then while [ true ] ; do if [ -e /dev/dvb/adapter$((NUM_ADAPTERS-1))/frontend0 ] ; then break fi sleep 1 done fi if [ "$PRELOAD_CAPMT_CA" == "true" ] ; then logger -t Tvheadend "### Preloading capmt_ca.so library ###" LD_PRELOAD="$ADDON_DIR/bin/capmt_ca.so $LD_PRELOAD" exec $ADDON_DIR/bin/tvheadend $TVHEADEND_ARG &>$ADDON_LOG_FILE else exec $ADDON_DIR/bin/tvheadend $TVHEADEND_ARG &>$ADDON_LOG_FILE fi ================================================ FILE: packages/addons/service/tvheadend42/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == "__main__": Monitor().waitForAbort() ================================================ FILE: packages/addons/service/tvheadend42/source/defaults/comskip/comskip.ini ================================================ ; See comskip.txt in the distribution zip file for many settable parameters, read manual.html, tuning.html and debugwindow.html for how to tune and debug comskip edl_mode=3 ; the mode specified in the generated edl file, 0=cut, 3=commercial break mkv_time_offset=30.0 ; offset in seconds, to work around what appears to be an Kodi or ffmpeg bug always_keep_first_seconds=2 ; Kodi has a bug that causes a segfault if we don't keep the start of the stream, I'll fix that when I get a chance detect_method=43 ; 1=black frame, 2=logo, 4=scene change, 8=fuzzy logic, 16=closed captions, 32=aspect ration, 64=silence, 128=cutscenes, 255=all validate_silence=1 ; Default, set to 0 to force using this clues if selected above. validate_uniform=1 ; Default, set to 0 to force using this clues (like pure white frames) if blackframe is selected above. validate_scenechange=1 ; Default, set to 0 to force using this clues if selected above. verbose=10 ; show a lot of extra info, level 5 is also OK, set to 0 to disable max_brightness=60 ; frame not black if any pixels checked are greater than this (scale 0 to 255) test_brightness=40 ; frame not pure black if any pixels checked are greater than this, will check average brightness (scale 0 to 255) max_avg_brightness=25 ; maximum average brightness for a dim frame to be considered black (scale 0 to 255) 0 means autosetting max_commercialbreak=600 ; maximum length in seconds to consider a segment a commercial break min_commercialbreak=25 ; minimum length in seconds to consider a segment a commercial break max_commercial_size=125 ; maximum time in seconds for a single commercial or multiple commercials if no breaks in between min_commercial_size=4 ; mimimum time in seconds for a single commercial min_show_segment_length=250 ; any segment longer than this will be scored towards show. non_uniformity=500 ; Set to 0 to disable cutpoints based on uniform frames max_volume=500 ; any frame with sound volume larger than this will not be regarded as black frame min_silence=12 ; Any deep silence longer than this amount of frames is a possible cutpoint ticker_tape=0 ; Amount of pixels from bottom to ignore in all processing logo_at_bottom=0 ; Set to 1 to search only for logo at the lower half of the video, do not combine with subtitle setting punish=0 ; Compare to average for sum of 1=brightness, 2=uniform 4=volume, 8=silence, 16=schange, set to 0 to disable punish_threshold=1.3 ; Multiply when amount is above average * punish_threshold punish_modifier=2 ; When above average * threshold multiply score by this value intelligent_brightness=0 ; Set to 1 to use a USA specific algorithm to tune some of the settings, not adviced outside the USA logo_percentile=0.92 ; if more then this amount of logo is found then logo detection will be disabled logo_threshold=0.75 punish_no_logo=1 ; Default, set to 0 to avoid show segments without logo to be scored towards commercial aggressive_logo_rejection=0 connect_blocks_with_logo=1 ; set to 1 if you want successive blocks with logo on the transition to be regarded as connected, set to 0 to disable logo_filter=0 ; set the size of the filter to apply to bad logo detection, 4 seems to be a good value. cut_on_ar_change=1 ; set to 1 if you want to cut also on aspect ratio changes when logo is present, set to 2 to force cuts on aspect ratio changes. set to 0 to disable delete_show_after_last_commercial=0 ; set to 1 if you want to delete the last block if its a show and after a commercial delete_show_before_or_after_current=0 ; set to 1 if you want to delete the previous and the next show in the recording, this can lead to the deletion of trailers of next show delete_block_after_commercial=0 ; set to max size of block in seconds to be discarded, set to 0 to disable remove_before=0 ; amount of seconds of show to be removed before ALL commercials remove_after=0 ; amount of seconds of show to be removed after ALL commercials shrink_logo=5 ; Reduce the duration of the logo with this amount of seconds after_logo=0 ; set to number of seconds after logo disappears comskip should start to search for silence to insert an additional cutpoint padding=0 ms_audio_delay=5 volume_slip=40 skip_b_frames=0 ; Set to 1 to force Comskip to skip frames for higher processing speed. hardware_decode=0 ; Set to 1 to enable hardware accelerated video decoding, only available in donator version max_repair_size=200 ; Will repair maximum 200 missing MPEG frames in the timeline, set to 0 to disable repairing for players that don't use PTS. disable_heuristics=4 ; bit pattern for disabling heuristics, adding 1 disables heristics 1, adding 2 disables heristics 2, adding 4 disables heristics 3, 255 disables all heuristics delete_logo_file=0 ; set to 1 if you want comskip to tidy up after finishing output_framearray=0 ; create a big excel file for detailed analysis, set to 0 to disable output_data=0 ; create a dump of the user data channel, used for CC and XDS (such as V-Chip info). Can be use together with output_framearray to remote debug CC decoding output_videoredo=0 ; The old videoredo format output_videoredo3=0 ; The new videoredo v3 format. output_womble=0 output_mls=0 ; set to 1 if you want MPeg Video Wizard bookmark file output output_cuttermaran=0 output_mpeg2schnitt=0 output_mpgtx=0 output_dvrcut=0 output_zoomplayer_chapter=0 output_zoomplayer_cutlist=0 output_edl=1 output_dvrmstb=0 ; Set to 1 if you're running DVRMS-Toolbox output_edlx=0 output_vcf=0 output_bsplayer=0 output_btv=0 ; set to 1 if you want Beyond TV chapter cutlist output output_projectx=0 ; set to 1 if you want ProjectX cutlist output (Xcl) output_avisynth=0 output_vdr=1 ; set to 1 if you want Kodi to skipping commercials output_demux=0 ; set to 1 if you want comskip to demux the mpeg file while scanning sage_framenumber_bug=0 sage_minute_bug=0 live_tv=0 ; set to 1 if you use parallelprocessing and need the output while recording live_tv_retries=4 ; change to 16 when using live_tv in BTV, used for mpeg PS and TS dvrms_live_tv_retries=300 ; only used for dvr_ms standoff=0 ; change to 8000000 when using live_tv in BTV cuttermaran_options="cut=\"true\" unattended=\"true\" muxResult=\"false\" snapToCutPoints=\"true\" closeApp=\"true\"" mpeg2schnitt_options="mpeg2schnitt.exe /S /E /R25 /Z %2 %1" avisynth_options="LoadPlugin(\"MPEG2Dec3.dll\") \nMPEG2Source(\"%s\")\n" dvrcut_options="dvrcut \"%s.dvr-ms\" \"%s_clean.dvr-ms\" " windowtitle="Comskip - %s" ================================================ FILE: packages/addons/service/tvheadend42/source/defaults/config ================================================ { "wizard": "hello", "uilevel": 1, "uilevel_nochange": true, "ui_quicktips": true, "cookie_expires": 14, "caclient_ui": true, "epg_compress": true, "prefer_picon": true, "chiconpath": "file:///storage/picons/tvh/%C.png", "chiconscheme": 2, "piconpath": "file:///storage/picons/vdr/", "piconscheme": 1 } ================================================ FILE: packages/addons/service/tvheadend42/source/defaults/dvr/config/8d0f5b7ae354d956d7fe5db25f5d0d24 ================================================ { "storage": "/storage/recordings", "retention-days": 2147483646, "removal-days": 2147483647, "pre-extra-time": 0, "post-extra-time": 0, "day-dir": false, "channel-dir": false, "channel-in-title": true, "date-in-title": true, "time-in-title": true, "whitespace-in-title": false, "title-dir": true, "episode-in-title": true, "tag-files": true, "windows-compatible-filenames": true, "charset": "UTF-8" } ================================================ FILE: packages/addons/service/tvheadend42/source/defaults/epggrab/config ================================================ { "channel_rename": true, "channel_renumber": false, "channel_reicon": false, "epgdb_periodicsave": 2, "ota_initial": true, "modules": { "opentv-skyit": { "class": "epggrab_mod_ota", "name": "OpenTV: Sky Italia", "type": "Over-the-air", "enabled": true, "priority": 2 }, "opentv-skynz": { "class": "epggrab_mod_ota", "name": "OpenTV: Sky NZ", "type": "Over-the-air", "enabled": true, "priority": 2 }, "opentv-skyuk": { "class": "epggrab_mod_ota", "name": "OpenTV: Sky UK", "type": "Over-the-air", "enabled": true, "priority": 2 }, "opentv-ausat": { "class": "epggrab_mod_ota", "name": "OpenTV: Ausat", "type": "Over-the-air", "enabled": true, "priority": 2 }, "psip": { "class": "epggrab_mod_ota", "name": "PSIP: ATSC Grabber", "type": "Over-the-air", "enabled": true, "priority": 1 }, "Bulsatcom_39E": { "class": "epggrab_mod_ota", "name": "Bulsatcom: Bula 39E", "type": "Over-the-air", "enabled": true, "priority": 5 }, "viasat_baltic": { "class": "epggrab_mod_ota", "name": "VIASAT: Baltic", "type": "Over-the-air", "enabled": true, "priority": 5 }, "uk_freeview": { "class": "epggrab_mod_ota", "name": "UK: Freeview", "type": "Over-the-air", "enabled": true, "priority": 5 }, "uk_freesat": { "class": "epggrab_mod_ota", "name": "UK: Freesat", "type": "Over-the-air", "enabled": true, "priority": 5 }, "eit": { "class": "epggrab_mod_ota", "name": "EIT: DVB Grabber", "type": "Over-the-air", "enabled": true, "priority": 1 } } } ================================================ FILE: packages/addons/service/tvheadend42/source/defaults/timeshift/config ================================================ { "enabled": 0, "ondemand": 0, "path": "/storage/.kodi/userdata/addon_data/service.tvheadend42/cache/timeshift", "unlimited_period": 0, "max_period": 3600, "unlimited_size": 0, "max_size": 3072 } ================================================ FILE: packages/addons/service/tvheadend42/source/defaults/xmltv/config ================================================ { "grabbers": [ { "path": "/storage/.kodi/addons/service.tvheadend42/bin/tv_grab_file", "description": "tv_grag_file is a simple grabber that just read the ~/.xmltv/tv_grab_file.xmltv file", "version": "0.1\n", "mtime": 1318774706, "capabilities": 1 } ], "grab-interval": 12, "grab-enabled": 1, "current-grabber": "/storage/.kodi/addons/service.tvheadend42/bin/tv_grab_file" } ================================================ FILE: packages/addons/service/tvheadend42/source/download.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) import urllib.request, urllib.parse, urllib.error, os, zipfile from urllib.error import URLError import xbmc, xbmcvfs, xbmcgui, xbmcaddon import shutil import sys url = 'https://github.com/tvheadend/dtv-scan-tables/archive/tvheadend.zip' temp = xbmcvfs.translatePath('special://temp') temp_folder = os.path.join(temp, 'dtv-scan-tables-tvheadend') dest_folder = os.path.join(xbmcvfs.translatePath(xbmcaddon.Addon().getAddonInfo('path')), 'dvb-scan') archive = os.path.join(temp, 'dtv_scantables.zip') ADDON_NAME = xbmcaddon.Addon().getAddonInfo('name') LS = xbmcaddon.Addon().getLocalizedString SCANTABLES = ['atsc', 'channels-conf', 'dvb-c', 'dvb-s', 'dvb-t', 'isdb-t'] class DownLoader(): def __init__(self): self.dp = xbmcgui.DialogProgressBG() def download(self, url, dest): try: self.dp.create(ADDON_NAME, LS(30042)) urllib.request.urlretrieve(url, dest, reporthook=self._pbhook) self.dp.close() zip = zipfile.ZipFile(archive) if zip.testzip() is not None: raise zipfile.BadZipfile if os.path.exists(temp_folder): shutil.rmtree(temp_folder) if os.path.exists(dest_folder): shutil.rmtree(dest_folder) self.dp.create(ADDON_NAME, LS(30043)) for idx, folder in enumerate(SCANTABLES): self._pbhook(idx, 1, len(SCANTABLES) - 1) for z in zip.filelist: if folder in z.filename: zip.extract(z.filename, temp) self.dp.close() for folder in SCANTABLES: shutil.copytree(os.path.join(temp_folder, folder), os.path.join(dest_folder, folder)) xbmcgui.Dialog().notification(ADDON_NAME, LS(30039), xbmcgui.NOTIFICATION_INFO) except URLError as e: xbmc.log('Could not download file: %s' % e.reason, xbmc.LOGERROR) self.dp.close() xbmcgui.Dialog().notification(ADDON_NAME, LS(30040), xbmcgui.NOTIFICATION_ERROR) except zipfile.BadZipfile: xbmc.log('Could not extract files from zip, bad zipfile', xbmc.LOGERROR) xbmcgui.Dialog().notification(ADDON_NAME, LS(30041), xbmcgui.NOTIFICATION_ERROR) def _pbhook(self, numblocks, blocksize, filesize): percent = int((numblocks * blocksize * 100) / filesize) self.dp.update(percent) if __name__ == '__main__': try: if sys.argv[1] == 'getscantables': dl = DownLoader() dl.download(url, archive) except IndexError: pass ================================================ FILE: packages/addons/service/tvheadend42/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: tvheadend42 # Addon id: service.tvheadend42 # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "XMLTV" msgstr "" msgctxt "#30001" msgid "DVB" msgstr "" msgctxt "#30002" msgid "DEBUG" msgstr "" msgctxt "#30003" msgid "FRITZ!Box Sat>IP" msgstr "" msgctxt "#30004" msgid "XMLTV Configuration" msgstr "" msgctxt "#30005" msgid "XMLTV source type" msgstr "" msgctxt "#30006" msgid "XMLTV File location" msgstr "" msgctxt "#30007" msgid "XMLTV Web location" msgstr "" msgctxt "#30008" msgid "XMLTV Script location" msgstr "" msgctxt "#30009" msgid "DVB Configuration" msgstr "" msgctxt "#30010" msgid "Unload DVB modules before suspend" msgstr "" msgctxt "#30011" msgid "Wait for frontend initialization" msgstr "" msgctxt "#30012" msgid "Number of adapters to wait for" msgstr "" msgctxt "#30013" msgid "Preload capmt_ca.so library" msgstr "" msgctxt "#30014" msgid "Delay the start of Tvheadend" msgstr "" msgctxt "#30015" msgid "Seconds delay" msgstr "" msgctxt "#30016" msgid "Custom start parameter" msgstr "" msgctxt "#30017" msgid "Parameter" msgstr "" msgctxt "#30018" msgid "FRITZ!Box Sat>IP server" msgstr "" msgctxt "#30019" msgid "AVM device" msgstr "" msgctxt "#30020" msgid "IP of the AVM Repeater" msgstr "" msgctxt "#30021" msgid "Router IP range (last digits are always .254)" msgstr "" msgctxt "#30022" msgid "Used network" msgstr "" msgctxt "#30023" msgid "Virtual IP #1" msgstr "" msgctxt "#30024" msgid "Virtual IP #2" msgstr "" msgctxt "#30025" msgid "Virtual IP #3" msgstr "" msgctxt "#30026" msgid "Virtual IP #4" msgstr "" msgctxt "#30027" msgid "TRACE Configuration" msgstr "" msgctxt "#30028" msgid "Path" msgstr "" msgctxt "#30029" msgid "Activate TRACE Debug" msgstr "" msgctxt "#30030" msgid "Debug Value #1" msgstr "" msgctxt "#30031" msgid "Debug Value #2" msgstr "" msgctxt "#30032" msgid "Debug Value #3" msgstr "" msgctxt "#30033" msgid "Debug Value #4" msgstr "" msgctxt "#30034" msgid "Debug Value #5" msgstr "" msgctxt "#30035" msgid "FRITZ!Box Configuration for FRITZ!OS 6.x (do not use for 7.x)" msgstr "" msgctxt "#30036" msgid "Scan Tables" msgstr "" msgctxt "#30037" msgid "Manage Scan-Tables" msgstr "" msgctxt "#30038" msgid "Download and install Scan-Tables" msgstr "" msgctxt "#30039" msgid "Download completed, tables installed" msgstr "" msgctxt "#30040" msgid "Could not download Scan-Tables" msgstr "" msgctxt "#30041" msgid "Could not extract zip files" msgstr "" msgctxt "#30042" msgid "Download Scan-Tables" msgstr "" msgctxt "#30043" msgid "Extract Scan-Tables" msgstr "" ================================================ FILE: packages/addons/service/tvheadend42/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/tvheadend42/source/settings-default.xml ================================================ eth0 192.168.178.201 192.168.178.202 192.168.178.203 192.168.178.204 192.168.178.254 192.168.178.2 false false false /storage/.kodi/userdata/addon_data/service.tvheadend42/debug.txt NONE NONE NONE NONE NONE 1 false false false 1 http:// NONE ================================================ FILE: packages/addons/service/tvheadend42/source/sleep.d/tvheadend.power ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.tvheadend42 SERVICE="service.tvheadend42" case "$1" in pre) if systemctl is-active "$SERVICE" &>/dev/null ; then systemctl stop "$SERVICE" for module in $REMOVE_MODULES ; do rmmod $module done fi ;; post) if systemctl is-enabled "$SERVICE" &>/dev/null ; then for module in $REMOVE_MODULES ; do modprobe $module done systemctl start "$SERVICE" fi ;; esac ================================================ FILE: packages/addons/service/tvheadend42/source/system.d/service.tvheadend42.service ================================================ [Unit] Description=TVHeadend42 Service After=network-online.service [Service] ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.tvheadend42/bin/tvheadend42.start" TimeoutStopSec=2 Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/tvheadend43/addon.xml ================================================ @REQUIRES@ @PKG_ADDON_PROVIDES@ @PKG_ADDON_PROVIDES@ @PKG_SHORTDESC@ @PKG_LONGDESC@ @PKG_DISCLAIMER@ all @PKG_ADDON_NEWS@ resources/icon.png resources/fanart.png @PKG_ADDON_SCREENSHOT@ ================================================ FILE: packages/addons/service/tvheadend43/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/tvheadend43/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tvheadend43" PKG_VERSION="905b4f0d0387818cbbf7012bf4dffb25e9893748" PKG_SHA256="3decc29681e7eefac7a734116078b6f36fa125d81c8b9c9998b96070fcbe53a0" PKG_VERSION_NUMBER="4.3-2091" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.tvheadend.org" PKG_URL="https://github.com/tvheadend/tvheadend/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain avahi comskip curl dvb-apps ffmpegx libdvbcsa libhdhomerun \ libiconv openssl pcre2 pngquant:host Python3:host tvh-dtv-scan-tables" PKG_DEPENDS_CONFIG="ffmpegx" PKG_SECTION="service" PKG_SHORTDESC="Tvheadend: a TV streaming server for Linux" PKG_LONGDESC="Tvheadend (${PKG_VERSION_NUMBER}): is a TV streaming server for Linux supporting DVB-S/S2, DVB-C, DVB-T/T2, IPTV, SAT>IP, ATSC and ISDB-T" PKG_BUILD_FLAGS="-sysroot" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Tvheadend Server 4.3 (Alpha)" PKG_ADDON_TYPE="xbmc.service" # basic transcoding options PKG_TVH_TRANSCODING="\ --disable-ffmpeg_static \ --disable-libfdkaac_static \ --disable-libopus_static \ --disable-libtheora \ --disable-libtheora_static \ --disable-libvorbis_static \ --disable-libvpx_static \ --disable-libx264_static \ --disable-libx265_static \ --enable-libav \ --enable-libfdkaac \ --enable-libopus \ --enable-libvorbis \ --enable-libx264" # hw specific transcoding options if [ "${TARGET_ARCH}" = "x86_64" ]; then PKG_DEPENDS_TARGET+=" libva" # specific transcoding options PKG_TVH_TRANSCODING="${PKG_TVH_TRANSCODING} \ --enable-vaapi \ --enable-libvpx \ --enable-libx265" else # for != "x86_64" targets # specific transcoding options PKG_TVH_TRANSCODING="${PKG_TVH_TRANSCODING} \ --disable-libvpx \ --disable-libx265" fi post_unpack() { sed -e 's/VER="0.0.0~unknown"/VER="'${PKG_VERSION_NUMBER}' ~ LibreELEC Tvh-addon v'${ADDON_VERSION}'.'${PKG_REV}'"/g' -i ${PKG_BUILD}/support/version sed -e 's|'/usr/bin/pngquant'|'${TOOLCHAIN}/bin/pngquant'|g' -i ${PKG_BUILD}/support/mkbundle } pre_configure_target() { PKG_CONFIGURE_OPTS_TARGET="--prefix=/usr \ --arch=${TARGET_ARCH} \ --cpu=${TARGET_CPU} \ --cc=${CC} \ ${PKG_TVH_TRANSCODING} \ --enable-avahi \ --enable-bundle \ --disable-dbus_1 \ --enable-dvbcsa \ --disable-dvben50221 \ --disable-dvbscan \ --enable-hdhomerun_client \ --disable-hdhomerun_static \ --enable-epoll \ --enable-inotify \ --enable-pngquant \ --disable-libmfx_static \ --disable-nvenc \ --disable-uriparser \ --enable-tvhcsa \ --enable-trace \ --nowerror \ --disable-bintray_cache \ --python=${TOOLCHAIN}/bin/python" # fails to build in subdirs cd ${PKG_BUILD} rm -rf .${TARGET_NAME} # pass ffmpegx to build CFLAGS+=" -I$(get_install_dir ffmpegx)/usr/local/include" LDFLAGS+=" -L$(get_install_dir ffmpegx)/usr/local/lib" # pass libhdhomerun to build CFLAGS+=" -I${SYSROOT_PREFIX}/usr/include/hdhomerun" export CROSS_COMPILE="${TARGET_PREFIX}" export CFLAGS+=" -I${SYSROOT_PREFIX}/usr/include/iconv -L${SYSROOT_PREFIX}/usr/lib/iconv" } post_make_target() { ${CC} -O -fbuiltin -fomit-frame-pointer -fPIC -shared -o capmt_ca.so src/extra/capmt_ca.c -ldl } post_makeinstall_target() { mkdir -p ${INSTALL}/usr/lib cp -p capmt_ca.so ${INSTALL}/usr/lib } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/{bin,lib} cp ${PKG_DIR}/addon.xml ${ADDON_BUILD}/${PKG_ADDON_ID} # set only version (revision will be added by buildsystem) sed -e "s|@ADDON_VERSION@|${ADDON_VERSION}|g" \ -i ${ADDON_BUILD}/${PKG_ADDON_ID}/addon.xml cp -P ${PKG_INSTALL}/usr/bin/tvheadend ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P ${PKG_INSTALL}/usr/lib/capmt_ca.so ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir comskip)/usr/bin/comskip ${ADDON_BUILD}/${PKG_ADDON_ID}/bin if [ "${TARGET_ARCH}" = "x86_64" ]; then cp -P $(get_install_dir x265)/usr/lib/libx265.so.199 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib fi # dvb-scan files mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/dvb-scan cp -r $(get_install_dir tvh-dtv-scan-tables)/usr/share/dvbv5/* \ ${ADDON_BUILD}/${PKG_ADDON_ID}/dvb-scan } ================================================ FILE: packages/addons/service/tvheadend43/patches/tvheadend43-01-dvb-scan-path.patch ================================================ --- a/src/input/mpegts/scanfile.c +++ b/src/input/mpegts/scanfile.c @@ -921,7 +921,7 @@ scanfile_init ( const char *muxconf_path #elif defined(PLATFORM_FREEBSD) path = "/usr/local/share/dtv-scan-tables"; #else - path = "/usr/share/dvb"; + path = "/storage/.kodi/addons/service.tvheadend43/dvb-scan"; #endif if (!initialized) { ================================================ FILE: packages/addons/service/tvheadend43/patches/tvheadend43-02-hdhomerun-includes.patch ================================================ fix libhdhomerun includes --- a/configure +++ b/configure @@ -419,7 +419,7 @@ if enabled hdhomerun_static; then else if enabled_or_auto hdhomerun_client; then - if check_cc_header 'libhdhomerun/hdhomerun' libhdhomerun; then + if check_cc_header 'hdhomerun' libhdhomerun; then enable hdhomerun_client LDFLAGS="$LDFLAGS -lhdhomerun" fi --- a/src/input/mpegts/tvhdhomerun/tvhdhomerun.c +++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun.c @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -#include "libhdhomerun/hdhomerun.h" +#include "hdhomerun.h" #include "tvheadend.h" #include "input.h" --- a/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c +++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -#include "libhdhomerun/hdhomerun.h" +#include "hdhomerun.h" #include #include "tvheadend.h" ================================================ FILE: packages/addons/service/tvheadend43/source/bin/tv_grab_file ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) if [ $# -lt 1 ] then . /etc/profile ADDON_HOME="$HOME/.kodi/userdata/addon_data/service.tvheadend43" ADDON_SETTINGS="$ADDON_HOME/settings.xml" XML_SETTINGS_VER="$(xmlstarlet sel -t -m settings -v @version $ADDON_SETTINGS)" if [ "$XML_SETTINGS_VER" = "2" ]; then XMLTV_TYPE="$(xmlstarlet sel -t -v '/settings/setting[@id="XMLTV_TYPE"]' $ADDON_SETTINGS)" XMLTV_LOCATION_FILE="$(xmlstarlet sel -t -v '/settings/setting[@id="XMLTV_LOCATION_FILE"]' $ADDON_SETTINGS)" XMLTV_LOCATION_WEB="$(xmlstarlet sel -t -v '/settings/setting[@id="XMLTV_LOCATION_WEB"]' $ADDON_SETTINGS | xmlstarlet unesc)" XMLTV_LOCATION_SCRIPT="$(xmlstarlet sel -t -v '/settings/setting[@id="XMLTV_LOCATION_SCRIPT"]' $ADDON_SETTINGS)" else XMLTV_TYPE="$(xmlstarlet sel -t -m '/settings/setting[@id="XMLTV_TYPE"]' -v @value $ADDON_SETTINGS)" XMLTV_LOCATION_FILE="$(xmlstarlet sel -t -m '/settings/setting[@id="XMLTV_LOCATION_FILE"]' -v @value $ADDON_SETTINGS)" XMLTV_LOCATION_WEB="$(xmlstarlet sel -t -m '/settings/setting[@id="XMLTV_LOCATION_WEB"]' -v @value $ADDON_SETTINGS | xmlstarlet unesc)" XMLTV_LOCATION_SCRIPT="$(xmlstarlet sel -t -m '/settings/setting[@id="XMLTV_LOCATION_SCRIPT"]' -v @value $ADDON_SETTINGS)" fi if [ "$XMLTV_TYPE" = "FILE" ]; then case "$XMLTV_LOCATION_FILE" in *.gz | *.bz2 | *.xz) zcat "$XMLTV_LOCATION_FILE" ;; *) cat "$XMLTV_LOCATION_FILE" ;; esac exit 0 elif [ "$XMLTV_TYPE" = "SCRIPT" ]; then if [ -e "$XMLTV_LOCATION_SCRIPT" ] ; then exec "$XMLTV_LOCATION_SCRIPT" fi elif [ "$XMLTV_TYPE" = "WEB" ]; then case "$XMLTV_LOCATION_WEB" in *.gz | *.bz2 | *.xz) wget -qO - "$XMLTV_LOCATION_WEB" | zcat ;; *) wget -qO - "$XMLTV_LOCATION_WEB" ;; esac exit 0 fi fi dflag= vflag= cflag= for a in "$@" do [ "$a" = "-d" -o "$a" = "--description" ] && dflag=1 [ "$a" = "-v" -o "$a" = "--version" ] && vflag=1 [ "$a" = "-c" -o "$a" = "--capabilities" ] && cflag=1 done if [ -n "$dflag" ] then echo "tv_grab_file is a simple grabber that can be configured through the addon settings from Kodi" fi if [ -n "$vflag" ] then echo "1.0" fi if [ -n "$cflag" ] then echo "baseline" fi ================================================ FILE: packages/addons/service/tvheadend43/source/bin/tvheadend43.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.tvheadend43 ADDON_SETTINGS="$ADDON_HOME/settings.xml" COMSKIP_DIR="$ADDON_HOME/comskip" COMSKIP_SETTINGS_FILE="$COMSKIP_DIR/comskip.ini" DVR_SETTINGS_DIR="$ADDON_HOME/dvr/config" DVR_SETTINGS_FILE="$DVR_SETTINGS_DIR/8d0f5b7ae354d956d7fe5db25f5d0d24" EPGGRAB_SETTINGS_DIR="$ADDON_HOME/epggrab" EPGGRAB_SETTINGS_FILE="$EPGGRAB_SETTINGS_DIR/config" TIMESHIFT_SETTINGS_DIR="$ADDON_HOME/timeshift" TIMESHIFT_SETTINGS_FILE="$TIMESHIFT_SETTINGS_DIR/config" TVH_SETTINGS_DIR="$ADDON_HOME" TVH_SETTINGS_FILE="$TVH_SETTINGS_DIR/config" XMLTV_SETTINGS_DIR="$ADDON_HOME/xmltv" XMLTV_SETTINGS_FILE="$XMLTV_SETTINGS_DIR/config" TIMESHIFT_DIR="$ADDON_HOME/cache/timeshift" XMLTV_FILE="$ADDON_DIR/bin/tv_grab_file" chmod a+x $ADDON_DIR/bin/* # workaround to support old 4.1.x version upgrade for Tvh after 4.1.2369 if [ -f "$ADDON_HOME/dvr/config/dvr-config" ]; then rm $ADDON_HOME/dvr/config/dvr-config fi # workaround to create default Tvh directories without entering samba share if [ ! -d "/storage/recordings" ]; then mkdir -p /storage/recordings /storage/picons/tvh /storage/picons/vdr fi if [ -f "$ADDON_HOME/channel/config/config.tmp" ]; then rm $ADDON_HOME/channel/config/config.tmp fi if [ -f "$ADDON_HOME/channel/config/tag.tmp" ]; then rm $ADDON_HOME/channel/config/tag.tmp fi # copy config files to userdata if [ ! -f "$COMSKIP_SETTINGS_FILE" ]; then mkdir -p $COMSKIP_DIR cp $ADDON_DIR/defaults/comskip/comskip.ini $COMSKIP_SETTINGS_FILE fi if [ ! -f "$DVR_SETTINGS_FILE" ]; then mkdir -p $DVR_SETTINGS_DIR cp $ADDON_DIR/defaults/dvr/config/8d0f5b7ae354d956d7fe5db25f5d0d24 $DVR_SETTINGS_FILE fi if [ ! -f "$EPGGRAB_SETTINGS_FILE" ]; then mkdir -p $EPGGRAB_SETTINGS_DIR cp $ADDON_DIR/defaults/epggrab/config $EPGGRAB_SETTINGS_FILE fi if [ ! -f "$TIMESHIFT_SETTINGS_FILE" ]; then mkdir -p $TIMESHIFT_DIR mkdir -p $TIMESHIFT_SETTINGS_DIR cp $ADDON_DIR/defaults/timeshift/config $TIMESHIFT_SETTINGS_FILE fi if [ ! -f "$TVH_SETTINGS_FILE" ]; then mkdir -p $TVH_SETTINGS_DIR cp $ADDON_DIR/defaults/config $TVH_SETTINGS_FILE fi if [ ! -f "$XMLTV_SETTINGS_FILE" ]; then mkdir -p $XMLTV_SETTINGS_DIR cp $ADDON_DIR/defaults/xmltv/config $XMLTV_SETTINGS_FILE fi # delayed Tvh startup if [ "$WORKAROUND_SLEEP" == "true" ]; then sleep $WORKAROUND_SLEEP_TIME fi # support FritzBox Sat>IP Server detection workaround for AVM-Repeater and AVM-6490 if [ "$AVM_SATIP_SERVER" == "true" ]; then if [ "$AVM_DEVICE" == "AVM_Repeater" ]; then AVM_SATIP="--satip_xml http://${AVM_ROUTER_IP}:49000/satipdesc.xml" fi if [ "$AVM_DEVICE" == "AVM_6490" ]; then AVM_SATIP="--satip_xml http://${AVM_ROUTER_FAKE_IP}:49000/satipdesc.xml" AVM_NUM="4" fi # add virtual ip as workaround for AVM limitation of one stream per ip # AVM-Repeater (2 tuners) ip address add ${AVM_IP1}/24 dev $AVM_ETH ip address add ${AVM_IP2}/24 dev $AVM_ETH # AVM-6490 (4 tuners) if [ "$AVM_NUM" = "4" ]; then ip address add ${AVM_IP3}/24 dev $AVM_ETH ip address add ${AVM_IP4}/24 dev $AVM_ETH fi fi # custom startup parameters if [ "$CUSTOM_START" != "true" ]; then CUSTOM_ARGS="" fi # debug value generation if [ "$DEBUG_LOG_TRACE_1" != "NONE" ]; then DEBUG_LOG_ARG="$DEBUG_LOG_TRACE_1" fi if [ "$DEBUG_LOG_TRACE_2" != "NONE" ]; then DEBUG_LOG_ARG="$DEBUG_LOG_ARG,$DEBUG_LOG_TRACE_2" fi if [ "$DEBUG_LOG_TRACE_3" != "NONE" ]; then DEBUG_LOG_ARG="$DEBUG_LOG_ARG,$DEBUG_LOG_TRACE_3" fi if [ "$DEBUG_LOG_TRACE_4" != "NONE" ]; then DEBUG_LOG_ARG="$DEBUG_LOG_ARG,$DEBUG_LOG_TRACE_4" fi if [ "$DEBUG_LOG_TRACE_5" != "NONE" ]; then DEBUG_LOG_ARG="$DEBUG_LOG_ARG,$DEBUG_LOG_TRACE_5" fi # if debuglog is activated and nothing selected to trace if [ -z "$DEBUG_LOG_ARG" ];then DEBUG_LOG_ARG="all" fi # rename debuglog if already exist to prevent overwriting after crash if [ -f "${DEBUG_LOG_PATH}" ]; then cp ${DEBUG_LOG_PATH} ${DEBUG_LOG_PATH}_$(date '+%Y-%m-%d_%H.%M.%S').txt fi # debug commandline if [ "$DEBUG_LOG" = "true" ]; then TVHEADEND_ARG="-B -C -u root -g video -c $ADDON_HOME $AVM_SATIP $CUSTOM_ARGS -l ${DEBUG_LOG_PATH} --trace $DEBUG_LOG_ARG" else TVHEADEND_ARG="-B -C -u root -g video -c $ADDON_HOME $AVM_SATIP $CUSTOM_ARGS" fi # start userspace DVB driver/addon for driver_dvb in $(find /storage/.kodi/addons/driver.dvb.*/bin/userspace-driver.sh -type f 2>/dev/null); do driver_dvb_name=$(echo $driver_dvb | awk 'BEGIN {FS="/"} {printf("%s", $5)}') logger -t Tvheadend "### Loading userspace DVB driver: $driver_dvb_name ###" # use ". " because of variable export . $driver_dvb done if [ "$WAIT_FOR_FEINIT" == "true" ] ; then while [ true ] ; do if [ -e /dev/dvb/adapter$((NUM_ADAPTERS-1))/frontend0 ] ; then break fi sleep 1 done fi if [ "$PRELOAD_CAPMT_CA" == "true" ] ; then logger -t Tvheadend "### Preloading capmt_ca.so library ###" LD_PRELOAD="$ADDON_DIR/bin/capmt_ca.so $LD_PRELOAD" exec $ADDON_DIR/bin/tvheadend $TVHEADEND_ARG &>$ADDON_LOG_FILE else exec $ADDON_DIR/bin/tvheadend $TVHEADEND_ARG &>$ADDON_LOG_FILE fi ================================================ FILE: packages/addons/service/tvheadend43/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == "__main__": Monitor().waitForAbort() ================================================ FILE: packages/addons/service/tvheadend43/source/defaults/comskip/comskip.ini ================================================ ; See comskip.txt in the distribution zip file for many settable parameters, read manual.html, tuning.html and debugwindow.html for how to tune and debug comskip edl_mode=3 ; the mode specified in the generated edl file, 0=cut, 3=commercial break mkv_time_offset=30.0 ; offset in seconds, to work around what appears to be an Kodi or ffmpeg bug always_keep_first_seconds=2 ; Kodi has a bug that causes a segfault if we don't keep the start of the stream, I'll fix that when I get a chance detect_method=43 ; 1=black frame, 2=logo, 4=scene change, 8=fuzzy logic, 16=closed captions, 32=aspect ration, 64=silence, 128=cutscenes, 255=all validate_silence=1 ; Default, set to 0 to force using this clues if selected above. validate_uniform=1 ; Default, set to 0 to force using this clues (like pure white frames) if blackframe is selected above. validate_scenechange=1 ; Default, set to 0 to force using this clues if selected above. verbose=10 ; show a lot of extra info, level 5 is also OK, set to 0 to disable max_brightness=60 ; frame not black if any pixels checked are greater than this (scale 0 to 255) test_brightness=40 ; frame not pure black if any pixels checked are greater than this, will check average brightness (scale 0 to 255) max_avg_brightness=25 ; maximum average brightness for a dim frame to be considered black (scale 0 to 255) 0 means autosetting max_commercialbreak=600 ; maximum length in seconds to consider a segment a commercial break min_commercialbreak=25 ; minimum length in seconds to consider a segment a commercial break max_commercial_size=125 ; maximum time in seconds for a single commercial or multiple commercials if no breaks in between min_commercial_size=4 ; mimimum time in seconds for a single commercial min_show_segment_length=250 ; any segment longer than this will be scored towards show. non_uniformity=500 ; Set to 0 to disable cutpoints based on uniform frames max_volume=500 ; any frame with sound volume larger than this will not be regarded as black frame min_silence=12 ; Any deep silence longer than this amount of frames is a possible cutpoint ticker_tape=0 ; Amount of pixels from bottom to ignore in all processing logo_at_bottom=0 ; Set to 1 to search only for logo at the lower half of the video, do not combine with subtitle setting punish=0 ; Compare to average for sum of 1=brightness, 2=uniform 4=volume, 8=silence, 16=schange, set to 0 to disable punish_threshold=1.3 ; Multiply when amount is above average * punish_threshold punish_modifier=2 ; When above average * threshold multiply score by this value intelligent_brightness=0 ; Set to 1 to use a USA specific algorithm to tune some of the settings, not adviced outside the USA logo_percentile=0.92 ; if more then this amount of logo is found then logo detection will be disabled logo_threshold=0.75 punish_no_logo=1 ; Default, set to 0 to avoid show segments without logo to be scored towards commercial aggressive_logo_rejection=0 connect_blocks_with_logo=1 ; set to 1 if you want successive blocks with logo on the transition to be regarded as connected, set to 0 to disable logo_filter=0 ; set the size of the filter to apply to bad logo detection, 4 seems to be a good value. cut_on_ar_change=1 ; set to 1 if you want to cut also on aspect ratio changes when logo is present, set to 2 to force cuts on aspect ratio changes. set to 0 to disable delete_show_after_last_commercial=0 ; set to 1 if you want to delete the last block if its a show and after a commercial delete_show_before_or_after_current=0 ; set to 1 if you want to delete the previous and the next show in the recording, this can lead to the deletion of trailers of next show delete_block_after_commercial=0 ; set to max size of block in seconds to be discarded, set to 0 to disable remove_before=0 ; amount of seconds of show to be removed before ALL commercials remove_after=0 ; amount of seconds of show to be removed after ALL commercials shrink_logo=5 ; Reduce the duration of the logo with this amount of seconds after_logo=0 ; set to number of seconds after logo disappears comskip should start to search for silence to insert an additional cutpoint padding=0 ms_audio_delay=5 volume_slip=40 skip_b_frames=0 ; Set to 1 to force Comskip to skip frames for higher processing speed. hardware_decode=0 ; Set to 1 to enable hardware accelerated video decoding, only available in donator version max_repair_size=200 ; Will repair maximum 200 missing MPEG frames in the timeline, set to 0 to disable repairing for players that don't use PTS. disable_heuristics=4 ; bit pattern for disabling heuristics, adding 1 disables heristics 1, adding 2 disables heristics 2, adding 4 disables heristics 3, 255 disables all heuristics delete_logo_file=0 ; set to 1 if you want comskip to tidy up after finishing output_framearray=0 ; create a big excel file for detailed analysis, set to 0 to disable output_data=0 ; create a dump of the user data channel, used for CC and XDS (such as V-Chip info). Can be use together with output_framearray to remote debug CC decoding output_videoredo=0 ; The old videoredo format output_videoredo3=0 ; The new videoredo v3 format. output_womble=0 output_mls=0 ; set to 1 if you want MPeg Video Wizard bookmark file output output_cuttermaran=0 output_mpeg2schnitt=0 output_mpgtx=0 output_dvrcut=0 output_zoomplayer_chapter=0 output_zoomplayer_cutlist=0 output_edl=1 output_dvrmstb=0 ; Set to 1 if you're running DVRMS-Toolbox output_edlx=0 output_vcf=0 output_bsplayer=0 output_btv=0 ; set to 1 if you want Beyond TV chapter cutlist output output_projectx=0 ; set to 1 if you want ProjectX cutlist output (Xcl) output_avisynth=0 output_vdr=1 ; set to 1 if you want Kodi to skipping commercials output_demux=0 ; set to 1 if you want comskip to demux the mpeg file while scanning sage_framenumber_bug=0 sage_minute_bug=0 live_tv=0 ; set to 1 if you use parallelprocessing and need the output while recording live_tv_retries=4 ; change to 16 when using live_tv in BTV, used for mpeg PS and TS dvrms_live_tv_retries=300 ; only used for dvr_ms standoff=0 ; change to 8000000 when using live_tv in BTV cuttermaran_options="cut=\"true\" unattended=\"true\" muxResult=\"false\" snapToCutPoints=\"true\" closeApp=\"true\"" mpeg2schnitt_options="mpeg2schnitt.exe /S /E /R25 /Z %2 %1" avisynth_options="LoadPlugin(\"MPEG2Dec3.dll\") \nMPEG2Source(\"%s\")\n" dvrcut_options="dvrcut \"%s.dvr-ms\" \"%s_clean.dvr-ms\" " windowtitle="Comskip - %s" ================================================ FILE: packages/addons/service/tvheadend43/source/defaults/config ================================================ { "wizard": "hello", "uilevel": 1, "uilevel_nochange": true, "ui_quicktips": true, "cookie_expires": 14, "caclient_ui": true, "epg_compress": true, "prefer_picon": true, "chiconpath": "file:///storage/picons/tvh/%C.png", "chiconscheme": 2, "piconpath": "file:///storage/picons/vdr/", "piconscheme": 1 } ================================================ FILE: packages/addons/service/tvheadend43/source/defaults/dvr/config/8d0f5b7ae354d956d7fe5db25f5d0d24 ================================================ { "storage": "/storage/recordings", "retention-days": 2147483646, "removal-days": 2147483647, "pre-extra-time": 0, "post-extra-time": 0, "day-dir": false, "channel-dir": false, "channel-in-title": true, "date-in-title": true, "time-in-title": true, "whitespace-in-title": false, "title-dir": true, "episode-in-title": true, "tag-files": true, "windows-compatible-filenames": true, "charset": "UTF-8" } ================================================ FILE: packages/addons/service/tvheadend43/source/defaults/epggrab/config ================================================ { "channel_rename": true, "channel_renumber": false, "channel_reicon": false, "epgdb_periodicsave": 2, "ota_initial": true, "modules": { "opentv-skyit": { "class": "epggrab_mod_ota", "name": "OpenTV: Sky Italia", "type": "Over-the-air", "enabled": true, "priority": 2 }, "opentv-skynz": { "class": "epggrab_mod_ota", "name": "OpenTV: Sky NZ", "type": "Over-the-air", "enabled": true, "priority": 2 }, "opentv-skyuk": { "class": "epggrab_mod_ota", "name": "OpenTV: Sky UK", "type": "Over-the-air", "enabled": true, "priority": 2 }, "opentv-ausat": { "class": "epggrab_mod_ota", "name": "OpenTV: Ausat", "type": "Over-the-air", "enabled": true, "priority": 2 }, "psip": { "class": "epggrab_mod_ota", "name": "PSIP: ATSC Grabber", "type": "Over-the-air", "enabled": true, "priority": 1 }, "Bulsatcom_39E": { "class": "epggrab_mod_ota", "name": "Bulsatcom: Bula 39E", "type": "Over-the-air", "enabled": true, "priority": 5 }, "viasat_baltic": { "class": "epggrab_mod_ota", "name": "VIASAT: Baltic", "type": "Over-the-air", "enabled": true, "priority": 5 }, "uk_freeview": { "class": "epggrab_mod_ota", "name": "UK: Freeview", "type": "Over-the-air", "enabled": true, "priority": 5 }, "uk_freesat": { "class": "epggrab_mod_ota", "name": "UK: Freesat", "type": "Over-the-air", "enabled": true, "priority": 5 }, "eit": { "class": "epggrab_mod_ota", "name": "EIT: DVB Grabber", "type": "Over-the-air", "enabled": true, "priority": 1 } } } ================================================ FILE: packages/addons/service/tvheadend43/source/defaults/timeshift/config ================================================ { "enabled": 0, "ondemand": 0, "path": "/storage/.kodi/userdata/addon_data/service.tvheadend43/cache/timeshift", "unlimited_period": 0, "max_period": 3600, "unlimited_size": 0, "max_size": 3072 } ================================================ FILE: packages/addons/service/tvheadend43/source/defaults/xmltv/config ================================================ { "grabbers": [ { "path": "/storage/.kodi/addons/service.tvheadend43/bin/tv_grab_file", "description": "tv_grag_file is a simple grabber that just read the ~/.xmltv/tv_grab_file.xmltv file", "version": "0.1\n", "mtime": 1318774706, "capabilities": 1 } ], "grab-interval": 12, "grab-enabled": 1, "current-grabber": "/storage/.kodi/addons/service.tvheadend43/bin/tv_grab_file" } ================================================ FILE: packages/addons/service/tvheadend43/source/download.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) import urllib.request, urllib.parse, urllib.error, os, zipfile from urllib.error import URLError import xbmc, xbmcvfs, xbmcgui, xbmcaddon import shutil import sys url = 'https://github.com/tvheadend/dtv-scan-tables/archive/tvheadend.zip' temp = xbmcvfs.translatePath('special://temp') temp_folder = os.path.join(temp, 'dtv-scan-tables-tvheadend') dest_folder = os.path.join(xbmcvfs.translatePath(xbmcaddon.Addon().getAddonInfo('path')), 'dvb-scan') archive = os.path.join(temp, 'dtv_scantables.zip') ADDON_NAME = xbmcaddon.Addon().getAddonInfo('name') LS = xbmcaddon.Addon().getLocalizedString SCANTABLES = ['atsc', 'channels-conf', 'dvb-c', 'dvb-s', 'dvb-t', 'isdb-t'] class DownLoader(): def __init__(self): self.dp = xbmcgui.DialogProgressBG() def download(self, url, dest): try: self.dp.create(ADDON_NAME, LS(30042)) urllib.request.urlretrieve(url, dest, reporthook=self._pbhook) self.dp.close() zip = zipfile.ZipFile(archive) if zip.testzip() is not None: raise zipfile.BadZipfile if os.path.exists(temp_folder): shutil.rmtree(temp_folder) if os.path.exists(dest_folder): shutil.rmtree(dest_folder) self.dp.create(ADDON_NAME, LS(30043)) for idx, folder in enumerate(SCANTABLES): self._pbhook(idx, 1, len(SCANTABLES) - 1) for z in zip.filelist: if folder in z.filename: zip.extract(z.filename, temp) self.dp.close() for folder in SCANTABLES: shutil.copytree(os.path.join(temp_folder, folder), os.path.join(dest_folder, folder)) xbmcgui.Dialog().notification(ADDON_NAME, LS(30039), xbmcgui.NOTIFICATION_INFO) except URLError as e: xbmc.log('Could not download file: %s' % e.reason, xbmc.LOGERROR) self.dp.close() xbmcgui.Dialog().notification(ADDON_NAME, LS(30040), xbmcgui.NOTIFICATION_ERROR) except zipfile.BadZipfile: xbmc.log('Could not extract files from zip, bad zipfile', xbmc.LOGERROR) xbmcgui.Dialog().notification(ADDON_NAME, LS(30041), xbmcgui.NOTIFICATION_ERROR) def _pbhook(self, numblocks, blocksize, filesize): percent = int((numblocks * blocksize * 100) / filesize) self.dp.update(percent) if __name__ == '__main__': try: if sys.argv[1] == 'getscantables': dl = DownLoader() dl.download(url, archive) except IndexError: pass ================================================ FILE: packages/addons/service/tvheadend43/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: tvheadend43 # Addon id: service.tvheadend43 # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "XMLTV" msgstr "" msgctxt "#30001" msgid "DVB" msgstr "" msgctxt "#30002" msgid "DEBUG" msgstr "" msgctxt "#30003" msgid "FRITZ!Box Sat>IP" msgstr "" msgctxt "#30004" msgid "XMLTV Configuration" msgstr "" msgctxt "#30005" msgid "XMLTV source type" msgstr "" msgctxt "#30006" msgid "XMLTV File location" msgstr "" msgctxt "#30007" msgid "XMLTV Web location" msgstr "" msgctxt "#30008" msgid "XMLTV Script location" msgstr "" msgctxt "#30009" msgid "DVB Configuration" msgstr "" msgctxt "#30010" msgid "Unload DVB modules before suspend" msgstr "" msgctxt "#30011" msgid "Wait for frontend initialization" msgstr "" msgctxt "#30012" msgid "Number of adapters to wait for" msgstr "" msgctxt "#30013" msgid "Preload capmt_ca.so library" msgstr "" msgctxt "#30014" msgid "Delay the start of Tvheadend" msgstr "" msgctxt "#30015" msgid "Seconds delay" msgstr "" msgctxt "#30016" msgid "Custom start parameter" msgstr "" msgctxt "#30017" msgid "Parameter" msgstr "" msgctxt "#30018" msgid "FRITZ!Box Sat>IP server" msgstr "" msgctxt "#30019" msgid "AVM device" msgstr "" msgctxt "#30020" msgid "IP of the AVM Repeater" msgstr "" msgctxt "#30021" msgid "Router IP range (last digits are always .254)" msgstr "" msgctxt "#30022" msgid "Used network" msgstr "" msgctxt "#30023" msgid "Virtual IP #1" msgstr "" msgctxt "#30024" msgid "Virtual IP #2" msgstr "" msgctxt "#30025" msgid "Virtual IP #3" msgstr "" msgctxt "#30026" msgid "Virtual IP #4" msgstr "" msgctxt "#30027" msgid "TRACE Configuration" msgstr "" msgctxt "#30028" msgid "Path" msgstr "" msgctxt "#30029" msgid "Activate TRACE Debug" msgstr "" msgctxt "#30030" msgid "Debug Value #1" msgstr "" msgctxt "#30031" msgid "Debug Value #2" msgstr "" msgctxt "#30032" msgid "Debug Value #3" msgstr "" msgctxt "#30033" msgid "Debug Value #4" msgstr "" msgctxt "#30034" msgid "Debug Value #5" msgstr "" msgctxt "#30035" msgid "FRITZ!Box Configuration for FRITZ!OS 6.x (do not use for 7.x)" msgstr "" msgctxt "#30036" msgid "Scan Tables" msgstr "" msgctxt "#30037" msgid "Manage Scan-Tables" msgstr "" msgctxt "#30038" msgid "Download and install Scan-Tables" msgstr "" msgctxt "#30039" msgid "Download completed, tables installed" msgstr "" msgctxt "#30040" msgid "Could not download Scan-Tables" msgstr "" msgctxt "#30041" msgid "Could not extract zip files" msgstr "" msgctxt "#30042" msgid "Download Scan-Tables" msgstr "" msgctxt "#30043" msgid "Extract Scan-Tables" msgstr "" ================================================ FILE: packages/addons/service/tvheadend43/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/tvheadend43/source/settings-default.xml ================================================ eth0 192.168.178.201 192.168.178.202 192.168.178.203 192.168.178.204 192.168.178.254 192.168.178.2 false false false /storage/.kodi/userdata/addon_data/service.tvheadend43/debug.txt NONE NONE NONE NONE NONE 1 false false false 1 http:// NONE ================================================ FILE: packages/addons/service/tvheadend43/source/sleep.d/tvheadend.power ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.tvheadend43 SERVICE="service.tvheadend43" case "$1" in pre) if systemctl is-active "$SERVICE" &>/dev/null ; then systemctl stop "$SERVICE" for module in $REMOVE_MODULES ; do rmmod $module done fi ;; post) if systemctl is-enabled "$SERVICE" &>/dev/null ; then for module in $REMOVE_MODULES ; do modprobe $module done systemctl start "$SERVICE" fi ;; esac ================================================ FILE: packages/addons/service/tvheadend43/source/system.d/service.tvheadend43.service ================================================ [Unit] Description=TVHeadend43 Service After=network-online.service [Service] ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.tvheadend43/bin/tvheadend43.start" TimeoutStopSec=2 Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/tvmosaic/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tvmosaic" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="arm" PKG_LICENSE="GPL" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="service" PKG_SHORTDESC="Add-on removed" PKG_LONGDESC="Add-on removed" PKG_TOOLCHAIN="manual" PKG_ADDON_BROKEN="TV Mosaic is no longer maintained and has been removed." PKG_IS_ADDON="yes" PKG_ADDON_NAME="TV Mosaic" PKG_ADDON_TYPE="xbmc.broken" addon() { : } ================================================ FILE: packages/addons/service/usbmuxd/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/usbmuxd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="usbmuxd" PKG_VERSION="1.1.1" PKG_SHA256="c0ec9700172bf635ccb5bed98daae607d2925c2bc3597f25706ecd9dfbfd2d9e" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.libimobiledevice.org" PKG_URL="https://github.com/libimobiledevice/usbmuxd/releases/download/${PKG_VERSION}/usbmuxd-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libusb libimobiledevice" PKG_SECTION="service" PKG_SHORTDESC="USB Multiplex Daemon" PKG_LONGDESC="USB Multiplex Daemon" PKG_IS_ADDON="yes" PKG_ADDON_NAME="iPhone Tether" PKG_ADDON_TYPE="xbmc.service" PKG_DISCLAIMER="Additional data charges may occur. The LibreELEC team doesn't take any resposibility for extra data charges." PKG_CONFIGURE_OPTS_TARGET="ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes" makeinstall_target() { : } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P ${PKG_BUILD}/.${TARGET_NAME}/src/usbmuxd ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ } ================================================ FILE: packages/addons/service/usbmuxd/patches/usbmuxd-0001-remove-duplicate-functions.patch ================================================ diff --git a/src/utils.c b/src/utils.c index 206c684..2ce59ff 100644 --- a/src/utils.c +++ b/src/utils.c @@ -160,170 +160,6 @@ char *stpcpy(char * s1, const char * s2) } #endif -/** - * Concatenate strings into a newly allocated string - * - * @note: Specify NULL for the last string in the varargs list - * - * @str: The first string in the list - * @...: Subsequent strings. Use NULL for the last item. - * - * @return a newly allocated string, or NULL if @str is NULL. This will also - * return NULL and set errno to ENOMEM if memory is exhausted. - */ -char *string_concat(const char *str, ...) -{ - size_t len; - va_list args; - char *s; - char *result; - char *dest; - - if (!str) - return NULL; - - /* Compute final length */ - - len = strlen(str) + 1; /* plus 1 for the null terminator */ - - va_start(args, str); - s = va_arg(args, char *); - while (s) { - len += strlen(s); - s = va_arg(args, char*); - } - va_end(args); - - /* Concat each string */ - - result = malloc(len); - if (!result) - return NULL; /* errno remains set */ - - dest = result; - - dest = stpcpy(dest, str); - - va_start(args, str); - s = va_arg(args, char *); - while (s) { - dest = stpcpy(dest, s); - s = va_arg(args, char *); - } - va_end(args); - - return result; -} - -int buffer_read_from_filename(const char *filename, char **buffer, uint64_t *length) -{ - FILE *f; - uint64_t size; - - *length = 0; - - f = fopen(filename, "rb"); - if (!f) { - return 0; - } - - fseek(f, 0, SEEK_END); - size = ftell(f); - rewind(f); - - if (size == 0) { - fclose(f); - return 0; - } - - *buffer = (char*)malloc(sizeof(char)*(size+1)); - - if (!buffer) { - return 0; - } - - int ret = 1; - if (fread(*buffer, sizeof(char), size, f) != size) { - usbmuxd_log(LL_ERROR, "%s: ERROR: couldn't read %d bytes from %s", __func__, (int)size, filename); - free(*buffer); - ret = 0; - errno = EIO; - } - fclose(f); - - *length = size; - return ret; -} - -int buffer_write_to_filename(const char *filename, const char *buffer, uint64_t length) -{ - FILE *f; - - f = fopen(filename, "wb"); - if (f) { - size_t written = fwrite(buffer, sizeof(char), length, f); - fclose(f); - - if (written == length) { - return 1; - } - else { - // Not all data could be written. - errno = EIO; - return 0; - } - } - else { - // Failed to open the file, let the caller know. - return 0; - } -} - -int plist_read_from_filename(plist_t *plist, const char *filename) -{ - char *buffer = NULL; - uint64_t length; - - if (!filename) - return 0; - - if (!buffer_read_from_filename(filename, &buffer, &length)) { - return 0; - } - - if ((length > 8) && (memcmp(buffer, "bplist00", 8) == 0)) { - plist_from_bin(buffer, length, plist); - } else { - plist_from_xml(buffer, length, plist); - } - - free(buffer); - - return 1; -} - -int plist_write_to_filename(plist_t plist, const char *filename, enum plist_format_t format) -{ - char *buffer = NULL; - uint32_t length; - - if (!plist || !filename) - return 0; - - if (format == PLIST_FORMAT_XML) - plist_to_xml(plist, &buffer, &length); - else if (format == PLIST_FORMAT_BINARY) - plist_to_bin(plist, &buffer, &length); - else - return 0; - - int res = buffer_write_to_filename(filename, buffer, length); - - free(buffer); - - return res; -} - #ifndef HAVE_CLOCK_GETTIME typedef int clockid_t; #define CLOCK_MONOTONIC 1 diff --git a/src/utils.h b/src/utils.h index b5cab3f..f862271 100644 --- a/src/utils.h +++ b/src/utils.h @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include + #ifndef UTILS_H #define UTILS_H @@ -73,18 +75,6 @@ void collection_copy(struct collection *dest, struct collection *src); #ifndef HAVE_STPCPY char *stpcpy(char * s1, const char * s2); #endif -char *string_concat(const char *str, ...); - -int buffer_read_from_filename(const char *filename, char **buffer, uint64_t *length); -int buffer_write_to_filename(const char *filename, const char *buffer, uint64_t length); - -enum plist_format_t { - PLIST_FORMAT_XML, - PLIST_FORMAT_BINARY -}; - -int plist_read_from_filename(plist_t *plist, const char *filename); -int plist_write_to_filename(plist_t plist, const char *filename, enum plist_format_t format); uint64_t mstime64(void); void get_tick_count(struct timeval * tv); ================================================ FILE: packages/addons/service/usbmuxd/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) ================================================ FILE: packages/addons/service/usbmuxd/source/system.d/service.usbmuxd.service ================================================ [Unit] Description=Socket daemon for the usbmux protocol used by Apple devices [Service] Type=simple ExecStartPre=/sbin/modprobe ipheth ExecStart=/storage/.kodi/addons/service.usbmuxd/bin/usbmuxd --systemd PIDFile=/var/run/usbmuxd.pid [Install] WantedBy=multi-user.target ================================================ FILE: packages/addons/service/vdr-addon/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/service/vdr-addon/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2011 Anthony Nash (nash.ant@gmail.com) # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vdr-addon" PKG_VERSION="2.6.3" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain vdr vdr-plugin-ddci2 vdr-plugin-dummydevice vdr-plugin-dvbapi vdr-plugin-eepg vdr-plugin-epgfixer \ vdr-plugin-epgsearch vdr-plugin-iptv vdr-plugin-live vdr-plugin-restfulapi vdr-plugin-robotv vdr-plugin-satip \ vdr-plugin-streamdev vdr-plugin-vnsiserver vdr-plugin-wirbelscan vdr-plugin-wirbelscancontrol vdr-plugin-xmltv2vdr" PKG_SECTION="service.multimedia" PKG_SHORTDESC="VDR: a TV streaming server for Linux" PKG_LONGDESC="VDR (2.6.x) is a TV streaming server for Linux supporting DVB-S/S2, DVB-C, DVB-T/T2, IPTV and SAT>IP" PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="VDR PVR Backend" PKG_ADDON_TYPE="xbmc.service" PKG_ADDON_REQUIRES="pvr.vdr.vnsi:0.0.0 script.config.vdr:0.0.0" addon() { # create dirs mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/{bin,lib,plugin,locale} mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/config/epgsources mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/config/plugins/{eepg,epgfixer,epgsearch,streamdev-server,vnsiserver} mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/res/plugins/{live,restfulapi} # configs cp -P $(get_build_dir vdr)/{diseqc.conf,keymacros.conf,scr.conf,sources.conf,svdrphosts.conf} ${ADDON_BUILD}/${PKG_ADDON_ID}/config cp -P $(get_build_dir vdr-plugin-epgfixer)/epgfixer/*.conf ${ADDON_BUILD}/${PKG_ADDON_ID}/config/plugins/epgfixer cp -P $(get_build_dir vdr-plugin-streamdev)/streamdev-server/streamdevhosts.conf ${ADDON_BUILD}/${PKG_ADDON_ID}/config/plugins/streamdev-server cp -P $(get_build_dir vdr-plugin-vnsiserver)/vnsiserver/allowed_hosts.conf ${ADDON_BUILD}/${PKG_ADDON_ID}/config/plugins/vnsiserver touch ${ADDON_BUILD}/${PKG_ADDON_ID}/config/channels.conf echo '0.0.0.0/0' >> ${ADDON_BUILD}/${PKG_ADDON_ID}/config/svdrphosts.conf # copy static files cp -PR $(get_build_dir vdr-plugin-restfulapi)/web/* \ $(get_build_dir vdr-plugin-restfulapi)/API.html \ ${ADDON_BUILD}/${PKG_ADDON_ID}/res/plugins/restfulapi cp -PR $(get_build_dir vdr-plugin-live)/live/* ${ADDON_BUILD}/${PKG_ADDON_ID}/res/plugins/live cp -P $(get_build_dir vdr-plugin-xmltv2vdr)/dist/epgdata2xmltv/epgdata2xmltv.dist ${ADDON_BUILD}/${PKG_ADDON_ID}/config/epgsources/epgdata2xmltv # copy binaries for pkg in ddci2 dummydevice dvbapi eepg epgfixer epgsearch iptv live restfulapi robotv satip vnsiserver wirbelscan wirbelscancontrol xmltv2vdr; do cp -PR $(get_build_dir vdr-plugin-${pkg})/libvdr*.so.* ${ADDON_BUILD}/${PKG_ADDON_ID}/plugin done # copy locale (omit ddci, dummydevice, robotv) for pkg in dvbapi eepg epgfixer epgsearch iptv live restfulapi satip vnsiserver wirbelscan wirbelscancontrol xmltv2vdr; do cp -PR $(get_build_dir vdr-plugin-${pkg})/locale/* ${ADDON_BUILD}/${PKG_ADDON_ID}/locale done cp -P $(get_build_dir vdr-plugin-streamdev)/client/libvdr*.so.* \ $(get_build_dir vdr-plugin-streamdev)/server/libvdr*.so.* \ ${ADDON_BUILD}/${PKG_ADDON_ID}/plugin cp -PR $(get_build_dir vdr-plugin-streamdev)/client/locale/* \ $(get_build_dir vdr-plugin-streamdev)/server/locale/* \ ${ADDON_BUILD}/${PKG_ADDON_ID}/locale cp -PL $(get_install_dir tntnet)/usr/lib/libtntnet.so.13 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib cp -P $(get_build_dir vdr)/vdr ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/vdr.bin cp -PR $(get_build_dir vdr)/locale/* ${ADDON_BUILD}/${PKG_ADDON_ID}/locale cp -P $(get_build_dir vdr-plugin-xmltv2vdr)/dist/epgdata2xmltv/epgdata2xmltv ${ADDON_BUILD}/${PKG_ADDON_ID}/bin } ================================================ FILE: packages/addons/service/vdr-addon/source/bin/vdr.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) . /etc/profile oe_setup_addon service.multimedia.vdr-addon fix_config() { if [ -f "$ADDON_CONFIG_DIR/setup.conf" ]; then sed -i -e '/^$/d' $ADDON_CONFIG_DIR/setup.conf sed -i -e '/^AlwaysSortFoldersFirst.*$/d' $ADDON_CONFIG_DIR/setup.conf sed -i -e '/^SetSystemTime.*$/d' $ADDON_CONFIG_DIR/setup.conf sed -i -e '/^epgsearch.SVDRPPort.*$/d' $ADDON_CONFIG_DIR/setup.conf sed -i -e '/^OSD.*$/d' $ADDON_CONFIG_DIR/setup.conf sed -i -e '/^Font.*$/d' $ADDON_CONFIG_DIR/setup.conf fi cat >>$ADDON_CONFIG_DIR/setup.conf << MYDATA AlwaysSortFoldersFirst = 1 SetSystemTime = 0 epgsearch.SVDRPPort = 6419 OSDSkin = sttng MYDATA } ADDON_CONFIG_DIR="$ADDON_HOME/config" ADDON_PLUGIN_DIR="$ADDON_DIR/plugin" chmod a+x $ADDON_DIR/bin/* ADDON_CACHE_DIR="$ADDON_HOME/cache" mkdir -p $ADDON_CACHE_DIR VDR_ARG="-g /tmp --no-kbd" if [ "$DEBUG" = "yes" -o "$ENABLE_VDR_DEBUG" == "true" ]; then VDR_ARG="$VDR_ARG --log=3" else VDR_ARG="$VDR_ARG --log=1" fi SVDRP_PORT=0 # epgsearch needs svdrp if [ "$ENABLE_EPGSEARCH" == "true" ] ; then SVDRP_PORT=6419 fi VDR_ARG="$VDR_ARG --port=$SVDRP_PORT" VDR_ARG="$VDR_ARG --dirnames=,,1" VDR_ARG="$VDR_ARG --config=$ADDON_CONFIG_DIR" VDR_ARG="$VDR_ARG --resdir=$ADDON_DIR/res" VDR_ARG="$VDR_ARG --cachedir=$ADDON_CACHE_DIR" VDR_ARG="$VDR_ARG --lib=$ADDON_PLUGIN_DIR" VDR_ARG="$VDR_ARG --video=\"$VDR_VIDEO_DIR\"" VDR_ARG="$VDR_ARG --localedir=$ADDON_DIR/locale" if [ "$ENABLE_EXTERNAL_RECCMD" == "true" ] ; then if [ ! -z "$EXTERNAL_RECCMD_PATH" -a -x "$EXTERNAL_RECCMD_PATH" ] ; then VDR_ARG="$VDR_ARG -r \"$EXTERNAL_RECCMD_PATH\"" fi fi if [ "$ENABLE_CHARSET_OVERRIDE" == "true" ] ; then if [ ! -z "$CHARSET_OVERRIDE_STR" ] ; then VDR_ARG="$VDR_ARG --chartab=$CHARSET_OVERRIDE_STR" fi fi # keep softcam first if [ "$ENABLE_SOFTCAM" == "true" ] ; then VDR_ARG="$VDR_ARG -P dvbapi" fi VDR_ARG="$VDR_ARG -P wirbelscan -P wirbelscancontrol" if [ "$ENABLE_IPTV" == "true" ] ; then VDR_ARG="$VDR_ARG -P 'iptv -d $IPTV_NUM_DEVICES'" fi if [ "$ENABLE_STREAMDEV_SERVER" == "true" ] ; then VDR_ARG="$VDR_ARG -P streamdev-server" fi if [ "$ENABLE_STREAMDEV_CLIENT" == "true" ] ; then VDR_ARG="$VDR_ARG -P streamdev-client" fi if [ "$ENABLE_LIVE" == "true" ] ; then VDR_ARG="$VDR_ARG -P 'live -i $LIVE_IP -p $LIVE_PORT'" fi if [ "$ENABLE_EEPG" == "true" ] ; then VDR_ARG="$VDR_ARG -P eepg" fi if [ "$ENABLE_EPGFIXER" == "true" ] ; then VDR_ARG="$VDR_ARG -P epgfixer" fi if [ "$ENABLE_EPGSEARCH" == "true" ] ; then VDR_ARG="$VDR_ARG -P epgsearch" fi if [ "$ENABLE_DUMMYDEVICE" == "true" \ -o ! \( -d /dev/dvb/adapter0 -o "$WAIT_FOR_FEINIT" == "true" \ -o "$ENABLE_SATIP" == "true" \ -o "$ENABLE_STREAMDEV_CLIENT" == "true" \) ] ; then VDR_ARG="$VDR_ARG -P dummydevice" else VNSI_ARG=" -d" fi if [ "$ENABLE_SATIP" == "true" ] ; then VDR_ARG="$VDR_ARG -P 'satip -d $SATIP_NUM_DEVICES'" fi if [ "$ENABLE_XMLTV2VDR" == "true" ] ; then VDR_ARG="$VDR_ARG -P 'xmltv2vdr --epgfile=$ADDON_CACHE_DIR/epg.db'" # xmltv2vdr needs /var/run/vdr grep -q " /var/run/vdr " /proc/mounts || ( mkdir -p /var/run/vdr && mount -t tmpfs -o size=10% tmpfs /var/run/vdr ) #handle epgsources mkdir -p /var/lib/epgsources mkdir -p $ADDON_HOME/config/epgsources for source in `find $ADDON_DIR/config/epgsources -type f`; do if [ ! -e $ADDON_HOME/config/epgsources/`basename $source` ] ; then cp $source $ADDON_HOME/config/epgsources/ fi done for source in `find $ADDON_HOME/config/epgsources -type f`; do cp $source /var/lib/epgsources done fi if [ "$ENABLE_ROBOTV" == "true" ] ; then VDR_ARG="$VDR_ARG -P robotv" fi if [ "$ENABLE_DDCI2" == "true" ] ; then VDR_ARG="$VDR_ARG -P ddci2" fi if [ ! -d "$ADDON_HOME/epgimages" ]; then mkdir -p "$ADDON_HOME/epgimages" fi if [ ! -z "$ADDON_HOME/channellogos" ]; then mkdir -p "$ADDON_HOME/channellogos" fi RESTFULAPI_ARGS="--ip $RESTFULAPI_IP --port $RESTFULAPI_PORT" RESTFULAPI_ARGS="$RESTFULAPI_ARGS --epgimages=\"$ADDON_HOME/epgimages\"" RESTFULAPI_ARGS="$RESTFULAPI_ARGS --channellogos=\"$ADDON_HOME/channellogos\"" VDR_ARG="$VDR_ARG -P 'restfulapi $RESTFULAPI_ARGS'" # vnsi last VDR_ARG="$VDR_ARG -P 'vnsiserver$VNSI_ARG'" cd $ADDON_DIR/config mkdir -p $ADDON_CONFIG_DIR mkdir -p "$VDR_VIDEO_DIR" for dir in `find . -type d`; do mkdir -p $ADDON_CONFIG_DIR/$dir done for config in `find . -type f`; do if [ ! -f $ADDON_CONFIG_DIR/$config ]; then cp $config $ADDON_CONFIG_DIR/$config fi done # start userspace DVB driver/addon for driver_dvb in $(find /storage/.kodi/addons/driver.dvb.*/bin/userspace-driver.sh -type f 2>/dev/null); do driver_dvb_name=$(echo $driver_dvb | awk 'BEGIN {FS="/"} {printf("%s", $5)}') logger -t VDR "### Loading userspace DVB driver: $driver_dvb_name ###" # use ". " because of variable export . $driver_dvb done if [ "$WAIT_FOR_FEINIT" == "true" ] ; then while [ true ] ; do if [ -e /dev/dvb/adapter$((NUM_ADAPTERS-1))/frontend0 ] ; then break fi sleep 1 done fi fix_config if [ "$ENABLE_VDR_DEBUG" == "true" ] ; then /usr/bin/journalctl -b -0 -f -u service.multimedia.vdr-addon > $ADDON_LOG_FILE & sleep 1 fi [ -z "$LANG" ] && export LANG=en_US.UTF-8 eval exec vdr.bin $VDR_ARG ================================================ FILE: packages/addons/service/vdr-addon/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == "__main__": Monitor().waitForAbort() ================================================ FILE: packages/addons/service/vdr-addon/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: vdr-addon # Addon id: service.multimedia.vdr-addon # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "DVB" msgstr "" msgctxt "#30001" msgid "PLUGINS" msgstr "" msgctxt "#30002" msgid "VDR" msgstr "" msgctxt "#30003" msgid "DVB Configuration" msgstr "" msgctxt "#30004" msgid "Unload DVB modules before suspend" msgstr "" msgctxt "#30005" msgid "Wait for frontend initialization" msgstr "" msgctxt "#30006" msgid "Number of adapters to wait for" msgstr "" msgctxt "#30007" msgid "Enable charset override" msgstr "" msgctxt "#30008" msgid "- charset" msgstr "" msgctxt "#30009" msgid "Plugin Configuration" msgstr "" msgctxt "#30010" msgid "Enable plugin: iptv" msgstr "" msgctxt "#30011" msgid "Enable plugin: streamdev-client" msgstr "" msgctxt "#30012" msgid "Enable plugin: streamdev-server" msgstr "" msgctxt "#30013" msgid "Enable plugin: dvbapi (softcam)" msgstr "" msgctxt "#30014" msgid "Enable plugin: live" msgstr "" msgctxt "#30015" msgid "- listen on ip" msgstr "" msgctxt "#30016" msgid "- listen on port" msgstr "" msgctxt "#30017" msgid "Enable plugin: epgsearch" msgstr "" msgctxt "#30018" msgid "Enable plugin: xmltv2vdr" msgstr "" msgctxt "#30019" msgid "Enable plugin: extended EPG" msgstr "" msgctxt "#30020" msgid "Enable plugin: dummydevice" msgstr "" msgctxt "#30021" msgid "Enable plugin: satip" msgstr "" msgctxt "#30022" msgid "Enable plugin: epgfixer" msgstr "" msgctxt "#30023" msgid "VDR Configuration" msgstr "" msgctxt "#30024" msgid "VDR Video Dir" msgstr "" msgctxt "#30025" msgid "Enable external recdmd" msgstr "" msgctxt "#30026" msgid "External recdmd path" msgstr "" msgctxt "#30027" msgid "- number of devices" msgstr "" msgctxt "#30028" msgid "restfulapi plugin options" msgstr "" msgctxt "#30029" msgid "- listen on ip" msgstr "" msgctxt "#30030" msgid "- listen on port" msgstr "" msgctxt "#30031" msgid "Enable plugin: roboTV" msgstr "" msgctxt "#30032" msgid "Enable plugin: DDCI2" msgstr "" msgctxt "#30033" msgid "DEBUG" msgstr "" msgctxt "#30034" msgid "VDR Debugging" msgstr "" msgctxt "#30035" msgid "Enable Debug Log" msgstr "" ================================================ FILE: packages/addons/service/vdr-addon/source/resources/settings.xml ================================================ ================================================ FILE: packages/addons/service/vdr-addon/source/settings-default.xml ================================================ false false false false false false false false false false false true false false false false 1 0.0.0.0 8008 1 127.0.0.1 8002 1 /storage/videos false ================================================ FILE: packages/addons/service/vdr-addon/source/sleep.d/vdr.power ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /etc/profile oe_setup_addon service.multimedia.vdr-addon SERVICE="service.multimedia.vdr-addon.service" case "$1" in pre) if systemctl is-active "$SERVICE" &>/dev/null ; then systemctl stop "$SERVICE" for module in $REMOVE_MODULES ; do rmmod $module done fi ;; post) if systemctl is-enabled "$SERVICE" &>/dev/null ; then for module in $REMOVE_MODULES ; do modprobe $module done systemctl start "$SERVICE" fi ;; esac ================================================ FILE: packages/addons/service/vdr-addon/source/system.d/service.multimedia.vdr-addon.service ================================================ [Unit] Description=vdr After=graphical.target Before=kodi.service [Service] ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.multimedia.vdr-addon/bin/vdr.start" TimeoutStopSec=5 Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=kodi.target ================================================ FILE: packages/addons/service/webgrabplus/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="webgrabplus" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="service" PKG_SHORTDESC="Add-on removed" PKG_LONGDESC="Add-on removed" PKG_TOOLCHAIN="manual" PKG_ADDON_BROKEN="Webgrab++ is no longer maintained and has been removed." PKG_IS_ADDON="yes" PKG_ADDON_NAME="WebGrab+Plus" PKG_ADDON_TYPE="xbmc.broken" addon() { : } ================================================ FILE: packages/addons/skin/estouchy/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="estouchy" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.kodi.tv" PKG_URL="" PKG_DEPENDS_TARGET="TexturePacker:host" PKG_DEPENDS_UNPACK="kodi" PKG_SECTION="skin" PKG_SHORTDESC="Kodi skin Estouchy" PKG_LONGDESC="Kodi skin Estouchy" PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Estouchy" PKG_ADDON_TYPE="xbmc.gui.skin" make_target() { TexturePacker -dupecheck -input $(get_build_dir kodi)/addons/skin.estouchy/media/ -output Textures.xbt } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID} cp -a $(get_build_dir kodi)/addons/skin.estouchy/* ${ADDON_BUILD}/${PKG_ADDON_ID} rm -rf ${ADDON_BUILD}/${PKG_ADDON_ID}/media/* cp ${PKG_BUILD}/Textures.xbt ${ADDON_BUILD}/${PKG_ADDON_ID}/media } ================================================ FILE: packages/addons/tools/btrfs-progs/changelog.txt ================================================ 2 - btrfs-progs: update to 6.3.3 1 - btrfs-progs: update to 6.2.2 ================================================ FILE: packages/addons/tools/btrfs-progs/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="btrfs-progs" PKG_VERSION="6.3.3" PKG_SHA256="0e55374e448ad4d8876db9c676669bedc16cb763e2493b14c245df8c5d00064b" PKG_REV="2" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://btrfs.wiki.kernel.org/index.php/Main_Page" PKG_URL="https://github.com/kdave/btrfs-progs/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain util-linux zlib systemd lzo" PKG_SECTION="tools" PKG_SHORTDESC="tools for the btrfs filesystem" PKG_LONGDESC="tools for the btrfs filesystem" PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="-sysroot" PKG_IS_ADDON="yes" PKG_ADDON_NAME="BTRFS Tools" PKG_ADDON_TYPE="xbmc.python.script" PKG_CONFIGURE_OPTS_TARGET="--disable-backtrace \ --disable-convert \ --disable-documentation \ --disable-python \ --disable-zstd" pre_configure_target() { ./autogen.sh } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ cp -P ${PKG_INSTALL}/usr/bin/{btrfs,btrfsck,btrfstune,fsck.btrfs,mkfs.btrfs} ${ADDON_BUILD}/${PKG_ADDON_ID}/bin } ================================================ FILE: packages/addons/tools/btrfs-progs/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import xbmcgui dialog = xbmcgui.Dialog() dialog.ok('', 'This is a console-only addon') ================================================ FILE: packages/addons/tools/dotnet-runtime/changelog.txt ================================================ 7 - aspnet6-runtime: update to 6.0.24 6 - aspnet6-runtime: update to 6.0.21 5 - aspnet6-runtime: update to 6.0.20 4 - aspnet6-runtime: update to 6.0.19 3 - aspnet6-runtime: update to 6.0.18 2 - aspnet6-runtime: update to 6.0.16 1 - aspnet6-runtime: update to 6.0.15 ================================================ FILE: packages/addons/tools/dotnet-runtime/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="dotnet-runtime" PKG_REV="7" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://dotnet.microsoft.com/" PKG_DEPENDS_TARGET="toolchain icu aspnet6-runtime" PKG_SECTION="tools" PKG_SHORTDESC="ASP.NET Core Runtime" PKG_LONGDESC="ASP.NET Core Runtime ($(get_pkg_version aspnet6-runtime)) enables you to run existing console/web/server applications." PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="ASP.Net Core Runtimes" PKG_ADDON_PROJECTS="any !RPi1" PKG_ADDON_TYPE="xbmc.python.script" PKG_MAINTAINER="Anton Voyl (awiouy)" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -r $(get_build_dir aspnet6-runtime)/* \ ${ADDON_BUILD}/${PKG_ADDON_ID}/bin mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/lib cp -L $(get_install_dir icu)/usr/lib/lib*.so.?? \ ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ } ================================================ FILE: packages/addons/tools/dvb-tools/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/tools/dvb-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="dvb-tools" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="virtual" PKG_SHORTDESC="DVB-Tools: is a bundle of dvb tools and programs" PKG_LONGDESC="This bundle currently includes blindscan-s2, dvb-apps, dvblast, dvbsnoop, mumudvb, szap-s2, tune-s2, t2scan and w_scan." PKG_IS_ADDON="yes" PKG_ADDON_NAME="DVB Tools" PKG_ADDON_TYPE="xbmc.python.script" PKG_DEPENDS_TARGET="toolchain \ blindscan-s2 \ dvb-apps \ dvblast \ dvbsnoop \ mumudvb \ szap-s2 \ tune-s2 \ t2scan \ w_scan" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ # blindscan-s2 cp -P $(get_install_dir blindscan-s2)/usr/bin/blindscan-s2 ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # dvb-apps cp -P $(get_install_dir dvb-apps)/usr/bin/dvbdate ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir dvb-apps)/usr/bin/dvbnet ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir dvb-apps)/usr/bin/dvbscan ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir dvb-apps)/usr/bin/dvbtraffic ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir dvb-apps)/usr/bin/femon ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir dvb-apps)/usr/bin/scan ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir dvb-apps)/usr/bin/azap ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir dvb-apps)/usr/bin/czap ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir dvb-apps)/usr/bin/szap ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir dvb-apps)/usr/bin/tzap ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir dvb-apps)/usr/bin/zap ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # dvblast cp -P $(get_install_dir dvblast)/usr/bin/dvblast ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # dvbsnoop cp -P $(get_install_dir dvbsnoop)/usr/bin/dvbsnoop ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # mumudvb cp -P $(get_install_dir mumudvb)/usr/bin/mumudvb ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # szap-s2 cp -P $(get_install_dir szap-s2)/usr/bin/szap-s2 ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # tune-s2 cp -P $(get_install_dir tune-s2)/usr/bin/tune-s2 ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # t2scan cp -P $(get_install_dir t2scan)/usr/bin/t2scan ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # w_scan cp -P $(get_install_dir w_scan)/usr/bin/w_scan ${ADDON_BUILD}/${PKG_ADDON_ID}/bin } ================================================ FILE: packages/addons/tools/dvb-tools/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import xbmcgui dialog = xbmcgui.Dialog() dialog.ok('', 'This is a console-only addon') ================================================ FILE: packages/addons/tools/ffmpeg-tools/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/tools/ffmpeg-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ffmpeg-tools" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain ffmpegx" PKG_SECTION="tools" PKG_SHORTDESC="FFmpeg binary for transcoding and audio/video manipulating." PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="FFmpeg Tools" PKG_ADDON_TYPE="xbmc.python.script" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/{bin,lib} cp -L $(get_install_dir ffmpegx)/usr/local/bin/* ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # libs if [ "${TARGET_ARCH}" = "x86_64" ]; then cp -PL $(get_install_dir x265)/usr/lib/libx265.so.199 \ ${ADDON_BUILD}/${PKG_ADDON_ID}/lib fi if [ "${DISPLAYSERVER}" = "x11" ]; then cp -PL $(get_install_dir libxcb)/usr/lib/{libxcb.so.1,libxcb-shm.so.0,libxcb-shape.so.0,libxcb-xfixes.so.0} \ ${ADDON_BUILD}/${PKG_ADDON_ID}/lib fi } ================================================ FILE: packages/addons/tools/ffmpeg-tools/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) import xbmcaddon import xbmcgui dialog = xbmcgui.Dialog() strings = xbmcaddon.Addon().getLocalizedString dialog.ok(strings(30000), strings(30001)) ================================================ FILE: packages/addons/tools/ffmpeg-tools/source/resources/language/English/strings.po ================================================ # Kodi Media Center language file # Addon Name: ffmpeg-tools # Addon id: tools.ffmpeg-tools # Addon Provider: Team LibreELEC msgid "" msgstr "" msgctxt "#30000" msgid "FFmpeg Tools Help" msgstr "" msgctxt "#30001" msgid "Please have a look at our Wiki (https://libreelec.wiki) for instructions how the FFmpeg binary could be used." msgstr "" ================================================ FILE: packages/addons/tools/flirc_util/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/tools/flirc_util/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2023-present Team LibreELEC (https://libreelec.tv) PKG_NAME="flirc_util" PKG_VERSION="8d3c86e8bb419ad44297c1b186f0cdc7dfcac915" # 30/10/2023 PKG_SHA256="fc460e6ce5477cb6b83c90a5f8b2ebb9876ed23cdd813a6a4a0fdc3730052a2b" PKG_LICENSE="FLIRC" PKG_SITE="http://www.flirc.tv" PKG_URL="https://github.com/flirc/sdk/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain hidapi libusb" PKG_SECTION="tools" PKG_SHORTDESC="CLI utility for flirc IR receivers" PKG_LONGDESC="Command-Line utility for configuring flirc IR receivers" PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="flirc_util" PKG_ADDON_TYPE="xbmc.python.script" make_target() { cd cli make VERBOSE="1" \ CONFIG="release" \ HOSTOS="LIBREELEC" \ MACHINE="Linux_${TARGET_ARCH}" \ BUILDDIR_ROOT="${PKG_BUILD}/build" \ BUILDDIR="${PKG_BUILD}/build" \ LSEARCH+=" -L../libs/Linux_${TARGET_ARCH}" \ flirc_util } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/{bin,lib} cp -P ${PKG_BUILD}/build/flirc_util ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ cp -P $(get_install_dir hidapi)/usr/lib/libhidapi-hidraw.so* ${ADDON_BUILD}/${PKG_ADDON_ID}/lib } ================================================ FILE: packages/addons/tools/flirc_util/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import xbmcgui import subprocess xbmcgui.Dialog().ok('', 'This is a console-only addon') ================================================ FILE: packages/addons/tools/game-tools/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/tools/game-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game-tools" PKG_VERSION="" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="virtual" PKG_SHORTDESC="A bundle of game tools and programs" PKG_LONGDESC="This bundle currently includes bchunk, ecm-tools, iat, and linuxconsoletools" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Game Tools" PKG_ADDON_TYPE="xbmc.python.script" PKG_DEPENDS_TARGET="toolchain \ bchunk \ ecm-tools \ iat \ linuxconsoletools" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ # bchunk cp -P $(get_install_dir bchunk)/usr/bin/bchunk ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # ecm-tools cp -P $(get_install_dir ecm-tools)/usr/bin/bin2ecm ${ADDON_BUILD}/${PKG_ADDON_ID}/bin ln -s bin2ecm ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ecm2bin # iat cp -P $(get_install_dir iat)/usr/bin/iat ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # linuxconsoletools cp -P $(get_install_dir linuxconsoletools)/usr/bin/fftest ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir linuxconsoletools)/usr/bin/jscal ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir linuxconsoletools)/usr/bin/jstest ${ADDON_BUILD}/${PKG_ADDON_ID}/bin } ================================================ FILE: packages/addons/tools/game-tools/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import xbmcgui import subprocess xbmcgui.Dialog().ok('', 'This is a console-only addon') ================================================ FILE: packages/addons/tools/jre.zulu/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/tools/jre.zulu/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Peter Vicman (peter.vicman@gmail.com) PKG_NAME="jre.zulu" PKG_VERSION="1.0" PKG_REV="0" PKG_LICENSE="GPL2" PKG_DEPENDS_TARGET="jre-libbluray libXext libXi libXrender chrome-libXtst jre-libXinerama" PKG_DEPENDS_UNPACK="jdk-${TARGET_ARCH}-zulu" PKG_SECTION="tools" PKG_SHORTDESC="Java Runtime Environment 8 for Blu-ray Disc Java menus from Azul Systems." PKG_LONGDESC="${PKG_SHORTDESC}" PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="JRE for BD-J menus" PKG_ADDON_TYPE="xbmc.python.script" # find ${1}.so.[0-9]* in ${2} and copy it to dest _pkg_copy_lib() { find "${2}/usr/lib" -regextype sed -regex ".*/${1}\.so\.[0-9]*" \ -exec cp {} "${ADDON_BUILD}/${PKG_ADDON_ID}/lib" \; } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/lib cp -a $(get_build_dir jdk-${TARGET_ARCH}-zulu)/jre \ $(get_install_dir jre-libbluray)/usr/share/java/*.jar \ ${PKG_DIR}/profile.d \ ${ADDON_BUILD}/${PKG_ADDON_ID} # copy required libraries for JRE _pkg_copy_lib libXtst $(get_install_dir chrome-libXtst) _pkg_copy_lib libXinerama $(get_install_dir jre-libXinerama) if [ "${DISPLAYSERVER}" != "X11" ]; then _pkg_copy_lib libXi $(get_install_dir libXi) _pkg_copy_lib libXrender $(get_install_dir libXrender) _pkg_copy_lib libX11 $(get_install_dir libX11) _pkg_copy_lib libXext $(get_install_dir libXext) _pkg_copy_lib libxcb $(get_install_dir libxcb) fi } ================================================ FILE: packages/addons/tools/jre.zulu/profile.d/jre.profile ================================================ # point to folder with jre export JAVA_HOME="/storage/.kodi/addons/tools.jre.zulu" # libbluray-*.jar in this folder (need / at the end) export LIBBLURAY_CP="/storage/.kodi/addons/tools.jre.zulu/" # or set file directly # export LIBBLURAY_CP="/storage/.kodi/addons/tools.jre.zulu/libbluray-j2se-1.0.2.jar" ================================================ FILE: packages/addons/tools/jre.zulu/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) ================================================ FILE: packages/addons/tools/mono/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mono" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="tools" PKG_SHORTDESC="Add-on removed" PKG_LONGDESC="Add-on removed" PKG_TOOLCHAIN="manual" PKG_ADDON_BROKEN="Mono is no longer maintained and has been removed." PKG_IS_ADDON="yes" PKG_ADDON_NAME="Mono" PKG_ADDON_TYPE="xbmc.broken" addon() { : } ================================================ FILE: packages/addons/tools/multimedia-tools/changelog.txt ================================================ 2 - libmediainfo: update to 23.07 - libzen: update to 0.4.41 - mediainfo: update to 23.07 - mpv-drmprime: update to 0.36.0 1 - mpg123: update to 1.31.3 - mpv-drmprime: update to 0.35.1 ================================================ FILE: packages/addons/tools/multimedia-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="multimedia-tools" PKG_VERSION="1.0" PKG_REV="2" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="virtual" PKG_SHORTDESC="A bundle of multimedia tools and programs" PKG_LONGDESC="This bundle currently includes alsamixer, mediainfo, mpg123, opencaster, squeezelite, tsdecrypt and tstools." PKG_IS_ADDON="yes" PKG_ADDON_NAME="Multimedia Tools" PKG_ADDON_TYPE="xbmc.python.script" PKG_DEPENDS_TARGET="toolchain \ alsa-utils \ mediainfo \ mpg123 \ opencaster \ squeezelite \ tsdecrypt \ tstools" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ # alsamixer cp -P $(get_install_dir alsa-utils)/.noinstall/alsamixer ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ # mediainfo cp -P $(get_install_dir mediainfo)/usr/bin/mediainfo ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # mpg123 cp -P $(get_install_dir mpg123)/usr/bin/* ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ # opencaster cp -P $(get_install_dir opencaster)/usr/bin/* ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ # squeezelite cp -P $(get_install_dir squeezelite)/usr/bin/squeezelite ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ # tsdecrypt cp -P $(get_install_dir tsdecrypt)/usr/bin/tsdecrypt ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # tstools cp -P $(get_install_dir tstools)/usr/bin/* ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ } ================================================ FILE: packages/addons/tools/multimedia-tools/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import xbmcgui dialog = xbmcgui.Dialog() dialog.ok('', 'This is a console-only addon') ================================================ FILE: packages/addons/tools/network-tools/changelog.txt ================================================ 1 - iperf: update to 3.13 - libpcap: update to 1.10.3 - rar2fs: update to 1.29.6 - tcpdump: update to 4.99.3 ================================================ FILE: packages/addons/tools/network-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="network-tools" PKG_VERSION="1.0" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="virtual" PKG_SHORTDESC="A bundle of network tools and programs" PKG_LONGDESC="This bundle currently includes bwm-ng, iftop, iperf, irssi, lftp, ncftp, ngrep, nmap, rar2fs, rsync, sshfs, sshpass, tcpdump, udpxy and wireless_tools." PKG_IS_ADDON="yes" PKG_ADDON_NAME="Network Tools" PKG_ADDON_TYPE="xbmc.python.script" PKG_DEPENDS_TARGET="toolchain \ bwm-ng \ iftop \ iperf \ irssi \ lftp \ ncftp \ ngrep \ nmap \ rar2fs \ rsync \ sshfs \ sshpass \ tcpdump \ udpxy \ wireless_tools" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/{bin,lib} # bwm-ng cp -P $(get_install_dir bwm-ng)/usr/bin/bwm-ng ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # fuse cp -P $(get_install_dir fuse)/usr/bin/{fusermount,ulockmgr_server} ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir fuse)/usr/sbin/mount.fuse ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir fuse)/usr/lib/{libfuse.so*,libulockmgr.so*} ${ADDON_BUILD}/${PKG_ADDON_ID}/lib # fuse3 cp -P $(get_install_dir fuse3)/usr/bin/fusermount3 ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir fuse3)/usr/sbin/mount.fuse3 ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir fuse3)/usr/lib/libfuse3.so* ${ADDON_BUILD}/${PKG_ADDON_ID}/lib # iftop cp -P $(get_install_dir iftop)/usr/sbin/iftop ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # iperf cp -P $(get_install_dir iperf)/usr/bin/iperf3 ${ADDON_BUILD}/${PKG_ADDON_ID}/bin ln -s iperf3 ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/iperf # irssi cp -P $(get_install_dir irssi)/usr/bin/irssi ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # lftp cp -P $(get_install_dir lftp)/usr/bin/lftp ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # ncftp cp -P $(get_install_dir ncftp)/usr/bin/ncftp ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir ncftp)/usr/bin/ncftpbatch ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir ncftp)/usr/bin/ncftpget ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir ncftp)/usr/bin/ncftpls ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir ncftp)/usr/bin/ncftpput ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # ngrep cp -P $(get_install_dir ngrep)/usr/bin/ngrep ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # nmap cp -P $(get_install_dir nmap)/usr/bin/nmap ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # rar2fs cp -P $(get_install_dir rar2fs)/usr/bin/mkr2i ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir rar2fs)/usr/bin/rar2fs ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # rsync cp -P $(get_install_dir rsync)/usr/bin/rsync ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # sshfs cp -P $(get_install_dir sshfs)/usr/bin/sshfs ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # sshpass cp -P $(get_install_dir sshpass)/usr/bin/sshpass ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # tcpdump cp -P $(get_install_dir tcpdump)/usr/bin/tcpdump ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # udpxy cp -P $(get_install_dir udpxy)/usr/bin/udpxy ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # wireless_tools cp -P $(get_install_dir wireless_tools)/usr/sbin/iwconfig ${ADDON_BUILD}/${PKG_ADDON_ID}/bin ln -s iwconfig ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/iwgetid ln -s iwconfig ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/iwlist ln -s iwconfig ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/iwspy ln -s iwconfig ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/iwpriv } ================================================ FILE: packages/addons/tools/network-tools/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import xbmcgui dialog = xbmcgui.Dialog() dialog.ok('', 'This is a console-only addon') ================================================ FILE: packages/addons/tools/rpi-tools/changelog.txt ================================================ initial release ================================================ FILE: packages/addons/tools/rpi-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rpi-tools" PKG_VERSION="1.0" PKG_REV="0" PKG_ARCH="arm" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain RPi.GPIO gpiozero colorzero lan951x-led-ctl" PKG_SECTION="virtual" PKG_SHORTDESC="A bundle of tools and programs for use on the Raspberry Pi" PKG_LONGDESC="This bundle currently includes RPi.GPIO, gpiozero and lan951x-led-ctl" PKG_DISCAIMER="Raspberry Pi is a trademark of the Raspberry Pi Foundation http://www.raspberrypi.org" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Raspberry Pi Tools" PKG_ADDON_TYPE="xbmc.python.module" PKG_ADDON_PROJECTS="RPi ARM" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/RPi/ cp -PR $(get_build_dir RPi.GPIO)/build/lib.linux-*/RPi/* ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/RPi cp -PR $(get_build_dir gpiozero)/gpiozero ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ cp -PR $(get_build_dir colorzero)/colorzero ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/ mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ cp -P $(get_build_dir lan951x-led-ctl)/lan951x-led-ctl ${ADDON_BUILD}/${PKG_ADDON_ID}/bin } ================================================ FILE: packages/addons/tools/rpi-tools/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import xbmcgui dialog = xbmcgui.Dialog() dialog.ok('', 'This is a console-only addon') ================================================ FILE: packages/addons/tools/system-tools/changelog.txt ================================================ 4 - bottom: update to 0.9.4 - libmtp: update to 1.1.21 - mc: update to 4.8.30 - screen: update to 4.9.1 - smartmontools: update to 7.4 - stress-ng: update to 0.16.04 3 - file: update to 5.45 - libssh2: dont build shared library - fix build of mc - pv: update to 1.7.24 - unrar: update to 6.2.10 2 - replace dstat with dool - bottom: update to 0.9.3 - diffutils: update to 3.10 - libssh2: update to 1.11.0 - stress-ng: update to 0.16.02 - unrar: update to 6.2.8 1 - bottom: update to 0.8.0 - diffutils: update to 3.9 - htop: update to 3.2.2 - lshw: fix lshw -version display - mc: update to 4.8.29 - stress-ng: update to 0.15.06 - unrar: update to 6.2.6 - vim: update to 9.0.1417 ================================================ FILE: packages/addons/tools/system-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="system-tools" PKG_VERSION="1.0" PKG_REV="4" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="virtual" PKG_SHORTDESC="A bundle of system tools and programs" PKG_LONGDESC="This bundle currently includes 7-zip, autossh, bottom, diffutils, dool, dtach, efibootmgr, encfs, evtest, fdupes, file, getscancodes, hddtemp, hd-idle, hid_mapper, htop, i2c-tools, inotify-tools, jq, libgpiod, lm_sensors, lshw, mc, mmc-utils, mtpfs, nmon, patch, pv, screen, smartmontools, stress-ng, unrar, usb-modeswitch and vim." PKG_IS_ADDON="yes" PKG_ADDON_NAME="System Tools" PKG_ADDON_TYPE="xbmc.python.script" PKG_DEPENDS_TARGET="toolchain \ 7-zip \ autossh \ bottom \ diffutils \ dool \ dtach \ encfs \ evtest \ fdupes \ file \ getscancodes \ hddtemp \ hd-idle \ hid_mapper \ htop \ i2c-tools \ inotify-tools \ jq \ libgpiod \ lm_sensors \ lshw \ mc \ mmc-utils \ mtpfs \ nmon \ patch \ pv \ screen \ sdparm \ smartmontools \ stress-ng \ unrar \ usb-modeswitch \ vim" if [ "${TARGET_ARCH}" = "x86_64" ]; then PKG_DEPENDS_TARGET+=" efibootmgr st" fi addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/{bin,data,lib} # 7-zip cp -P $(get_install_dir 7-zip)/usr/bin/7zz ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # autossh cp -P $(get_install_dir autossh)/usr/bin/autossh ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # bottom cp -P $(get_install_dir bottom)/btm ${ADDON_BUILD}/${PKG_ADDON_ID}/bin 2>/dev/null || : # diffutils cp -P $(get_install_dir diffutils)/usr/bin/{cmp,diff,diff3,sdiff} ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # dool cp -Pa $(get_install_dir dool)/usr/bin/* ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # dtach cp -P $(get_install_dir dtach)/usr/bin/dtach ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # efibootmgr cp -P $(get_install_dir efibootmgr)/usr/bin/efibootmgr ${ADDON_BUILD}/${PKG_ADDON_ID}/bin 2>/dev/null || : # encfs cp -P $(get_install_dir encfs)/usr/bin/{encfs,encfsctl} ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # evtest cp -P $(get_install_dir evtest)/usr/bin/evtest ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # fdupes cp -P $(get_install_dir fdupes)/usr/bin/fdupes ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # file cp -P $(get_install_dir file)/usr/bin/file ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir file)/usr/share/misc/magic.mgc ${ADDON_BUILD}/${PKG_ADDON_ID}/data # fuse cp -P $(get_install_dir fuse)/usr/bin/{fusermount,ulockmgr_server} ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir fuse)/usr/sbin/mount.fuse ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir fuse)/usr/lib/{libfuse.so*,libulockmgr.so*} ${ADDON_BUILD}/${PKG_ADDON_ID}/lib # getscancodes cp -P $(get_install_dir getscancodes)/usr/bin/getscancodes ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # hddtemp cp -P $(get_install_dir hddtemp)/usr/sbin/hddtemp ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir hddtemp)/usr/share/misc/hddtemp.db ${ADDON_BUILD}/${PKG_ADDON_ID}/data # hd-idle cp -P $(get_install_dir hd-idle)/usr/sbin/hd-idle ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # hid_mapper cp -P $(get_install_dir hid_mapper)/usr/bin/hid_mapper ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # htop cp -P $(get_install_dir htop)/usr/bin/htop ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # i2c-tools cp -P $(get_install_dir i2c-tools)/usr/sbin/{i2cdetect,i2cdump,i2cget,i2cset} ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir i2c-tools)/usr/lib/${PKG_PYTHON_VERSION}/site-packages/smbus.so ${ADDON_BUILD}/${PKG_ADDON_ID}/lib cp -P $(get_install_dir i2c-tools)/usr/lib/libi2c.so.0.1.1 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/libi2c.so cp -P $(get_install_dir i2c-tools)/usr/lib/libi2c.so.0.1.1 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/libi2c.so.0 cp -P $(get_install_dir i2c-tools)/usr/lib/libi2c.so.0.1.1 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib/libi2c.so.0.1.1 # inotify-tools cp -P $(get_install_dir inotify-tools)/usr/bin/{inotifywait,inotifywatch} ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # jq cp -P $(get_install_dir jq)/usr/bin/jq ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -P $(get_install_dir oniguruma)/usr/lib/{libonig.so,libonig.so.5,libonig.so.5.*.*} ${ADDON_BUILD}/${PKG_ADDON_ID}/lib # libgpiod cp -P $(get_install_dir libgpiod)/usr/bin/{gpiodetect,gpiofind,gpioget,gpioinfo,gpiomon,gpioset} ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # lm_sensors cp -P $(get_install_dir lm_sensors)/usr/bin/sensors ${ADDON_BUILD}/${PKG_ADDON_ID}/bin 2>/dev/null || : # lshw cp -P $(get_install_dir lshw)/usr/sbin/lshw ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # mc cp -Pa $(get_install_dir mc)/usr/bin/* ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ cp -Pa $(get_install_dir mc)/storage/.kodi/addons/virtual.system-tools/* ${ADDON_BUILD}/${PKG_ADDON_ID} # mmc-utils cp -P $(get_install_dir mmc-utils)/usr/local/bin/mmc ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # mtpfs cp -P $(get_install_dir mtpfs)/usr/bin/mtpfs ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ # nmon cp -P $(get_install_dir nmon)/usr/bin/nmon ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ # patch cp -P $(get_install_dir patch)/usr/bin/patch ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # pv cp -P $(get_install_dir pv)/usr/bin/pv ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # screen cp -L $(get_install_dir screen)/usr/bin/screen ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # sdparm cp -P $(get_install_dir sdparm)/usr/bin/sdparm ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # smartmontools cp -P $(get_install_dir smartmontools)/usr/sbin/smartctl ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # st cp -P $(get_build_dir st)/st ${ADDON_BUILD}/${PKG_ADDON_ID}/bin 2>/dev/null || : # stress-ng cp -P $(get_install_dir stress-ng)/usr/bin/stress-ng ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # unrar cp -P $(get_install_dir unrar)/usr/bin/unrar ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # usb-modeswitch cp -P $(get_install_dir usb-modeswitch)/usr/sbin/usb_modeswitch ${ADDON_BUILD}/${PKG_ADDON_ID}/bin # vim cp -P $(get_install_dir vim)/usr/bin/vim ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp -Pa $(get_install_dir vim)/storage/.kodi/addons/virtual.system-tools/data/vim/ ${ADDON_BUILD}/${PKG_ADDON_ID}/data } ================================================ FILE: packages/addons/tools/system-tools/source/bin/7z ================================================ #!/bin/sh file=/storage/.kodi/addons/virtual.system-tools/bin/7zz exec ${file} "$@" ================================================ FILE: packages/addons/tools/system-tools/source/bin/7za ================================================ #!/bin/sh file=/storage/.kodi/addons/virtual.system-tools/bin/7zz exec ${file} "$@" ================================================ FILE: packages/addons/tools/system-tools/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import xbmcaddon import xbmcgui import subprocess import re import csv with open('/etc/os-release') as stream: contents = stream.read().strip() vars = re.findall(r"^[a-zA-Z0-9_]+=.*$", contents, flags=re.MULTILINE) reader = csv.reader(vars, delimiter="=") osrelease = dict(reader) if osrelease['LIBREELEC_ARCH'] == 'x11.x86_64' or osrelease['LIBREELEC_ARCH'] == 'Generic-legacy.x86_64': yes = xbmcgui.Dialog().yesno('System Tools', 'This is a console-only addon.[CR][CR]Open a terminal window?',nolabel='No',yeslabel='Yes') if yes: subprocess.Popen(["systemd-run","sh","-c",". /etc/profile;cd;exec st -e sh -l"], shell=False, close_fds=True) else: xbmcgui.Dialog().ok('System Tools', 'This is a console-only addon') ================================================ FILE: packages/audio/alsa-lib/config/modprobe.d/disable-spdif-for-hd-audio.conf ================================================ # INTEL HBR WORKAROUND FOR DTS-MA & Dolby TrueHD PLAYBACK # Uncomment the following lines to disable any S/PDIF out to deliver # bitstreamed audio on Intel builds. This is a rough workaround for # users that have both S/PDIF and HDMI audio outputs on their motherboard # or motherboard+discrete graphics combo. # EVEN IF YOU ARE NOT USING THE S/PDIF OUTPUT # but still have one, you will need to uncomment the lines below ! # after uncommenting these lines, you must reboot for these settings to take effect # blacklist snd_hda_codec_realtek # blacklist snd_hda_codec_sigmatel # blacklist snd_hda_codec_cirrus ================================================ FILE: packages/audio/alsa-lib/modprobe.d/alsa-base.conf ================================================ ############################# # ALSA drivers load options # ############################# # Prevent abnormal drivers from grabbing index 0 options snd-bt87x index=-2 options cx88-alsa index=-2 options saa7134-alsa index=-2 options snd-atiixp-modem index=-2 options snd-intel8x0m index=-2 options snd-via82xx-modem index=-2 options snd-usb-audio index=-2 options snd-usb-usx2y index=-2 options snd-usb-caiaq index=-2 options snd-cmipci mpu_port=0x330 fm_port=0x388 # Some Toshiba laptops might require this # options snd-hda-intel model=toshiba options snd-hda-intel model=auto # fix some Audio Problems with HDMI on ION based Hardware # see: http://xbmc.org/forum/showthread.php?t=69479 alias snd-card-0 snd-hda-codec-nvhdmi ================================================ FILE: packages/audio/alsa-lib/modprobe.d/intel-audio.conf ================================================ # use legacy hda-intel driver even if a DSP is present options snd_intel_dspcfg dsp_driver=1 ================================================ FILE: packages/audio/alsa-lib/package.mk ================================================ # 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) PKG_NAME="alsa-lib" PKG_VERSION="1.2.8" PKG_SHA256="1ab01b74e33425ca99c2e36c0844fd6888273193bd898240fe8f93accbcbf347" PKG_LICENSE="GPL" PKG_SITE="https://www.alsa-project.org/" PKG_URL="https://www.alsa-project.org/files/pub/lib/alsa-lib-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="ALSA (Advanced Linux Sound Architecture) is the next generation Linux Sound API." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic" if build_with_debug; then PKG_ALSA_DEBUG=--with-debug else PKG_ALSA_DEBUG=--without-debug fi PKG_CONFIGURE_OPTS_TARGET="${PKG_ALSA_DEBUG} \ --disable-dependency-tracking \ --with-plugindir=/usr/lib/alsa \ --disable-python" post_configure_target() { sed -i 's/.*PKGLIBDIR.*/#define PKGLIBDIR ""/' include/config.h } post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config cp -PR ${PKG_DIR}/config/modprobe.d ${INSTALL}/usr/config } ================================================ FILE: packages/audio/alsa-lib/patches/alsa-lib-asound.conf_configdir.patch ================================================ diff --git a/src/conf/alsa.conf b/src/conf/alsa.conf index a04173a0..1f13fd84 100644 --- a/src/conf/alsa.conf +++ b/src/conf/alsa.conf @@ -11,7 +11,8 @@ "/usr/etc/alsa/conf.d" "/etc/alsa/conf.d" "/etc/asound.conf|||/usr/etc/asound.conf" - "~/.asoundrc" + "/run/asound.conf" + "/storage/.config/asound.conf" { @func concat strings [ ================================================ FILE: packages/audio/alsa-topology-conf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="alsa-topology-conf" PKG_VERSION="1.2.5.1" PKG_SHA256="f7c5bae1545abcd73824bc97f4e72c340e11abea188ba0f1c06f5e0ad776b179" PKG_LICENSE="BSD-3c" PKG_SITE="https://www.alsa-project.org/" PKG_URL="https://www.alsa-project.org/files/pub/lib/alsa-topology-conf-${PKG_VERSION}.tar.bz2" PKG_LONGDESC="ALSA topology configuration files" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/share/alsa/ cp -PR ${PKG_BUILD}/topology ${INSTALL}/usr/share/alsa/ } ================================================ FILE: packages/audio/alsa-ucm-conf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="alsa-ucm-conf" PKG_VERSION="1.2.8" PKG_SHA256="fee4a737830fd25f969d83da46a2b231beb086efd966fcc07d225e7823260ae8" PKG_LICENSE="BSD-3c" PKG_SITE="https://www.alsa-project.org/" PKG_URL="https://www.alsa-project.org/files/pub/lib/alsa-ucm-conf-${PKG_VERSION}.tar.bz2" PKG_LONGDESC="ALSA Use Case Manager configuration (and topologies)" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/share/alsa/ cp -PR ${PKG_BUILD}/ucm2 ${INSTALL}/usr/share/alsa/ # work around scripts/build removing empty directories, this leads to errors in ucm touch ${INSTALL}/usr/share/alsa/ucm2/conf.virt.d/.dont_remove_this_dir } ================================================ FILE: packages/audio/alsa-utils/package.mk ================================================ # 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) PKG_NAME="alsa-utils" PKG_VERSION="1.2.8" PKG_SHA256="e140fa604c351f36bd72167c8860c69d81b964ae6ab53992d6434dde38e9333c" PKG_LICENSE="GPL" PKG_SITE="https://www.alsa-project.org/" PKG_URL="https://www.alsa-project.org/files/pub/utils/alsa-utils-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain alsa-lib ncurses systemd" PKG_LONGDESC="This package includes the utilities for ALSA, like alsamixer, aplay, arecord, alsactl, iecset and speaker-test." PKG_CONFIGURE_OPTS_TARGET="--disable-alsaconf \ --disable-alsaloop \ --enable-alsatest \ --disable-bat \ --disable-dependency-tracking \ --disable-nls \ --disable-rst2man \ --disable-xmlto" post_makeinstall_target() { rm -rf ${INSTALL}/lib ${INSTALL}/var rm -rf ${INSTALL}/usr/share/alsa/speaker-test rm -rf ${INSTALL}/usr/share/sounds rm -rf ${INSTALL}/usr/lib/systemd/system # remove default udev rule to restore mixer configs, we install our own. # so we avoid resetting our soundconfig rm -rf ${INSTALL}/usr/lib/udev/rules.d/90-alsa-restore.rules mkdir -p ${INSTALL}/.noinstall for i in aconnect alsamixer amidi aplaymidi arecord arecordmidi aseqdump aseqnet iecset; do mv ${INSTALL}/usr/bin/${i} ${INSTALL}/.noinstall done mkdir -p ${INSTALL}/usr/lib/udev cp ${PKG_DIR}/scripts/soundconfig ${INSTALL}/usr/lib/udev } ================================================ FILE: packages/audio/alsa-utils/scripts/soundconfig ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) # setup alsa (especially the mixer config) mixer() { parm=${4:-on} amixer -c "$1" sset "$2" "$3" $parm >/dev/null 2>&1 amixer -c "$1" sset "$2" $parm >/dev/null 2>&1 } ( . /etc/profile progress "Setting up sound card" if [ -f $HOME/.config/sound.conf ]; then alsactl restore -f $HOME/.config/sound.conf else # get card num card=`echo $1 | sed 's/[^0-9]*//g'` # set common mixer params mixer "$card" Master 0db mixer "$card" Front 100% mixer "$card" PCM 0db mixer "$card" Synth 100% # mute CD, since using digital audio instead mixer "$card" CD 0% mute # Only unmute Line and Aux if they are possibly used. # mixer "$card" Line 100% # mixer "$card" Aux 100% # mute mic mixer "$card" Mic 0% mute # ESS 1969 chipset has 2 PCM channels mixer "$card" PCM,1 100% # Trident/YMFPCI/emu10k1 mixer "$card" Wave 100% mixer "$card" Music 100% mixer "$card" AC97 100% mixer "$card" Surround 90% mixer "$card" 'Surround Digital' 90% mixer "$card" 'Wave Surround' 90% mixer "$card" 'Duplicate Front' 90% mixer "$card" 'Sigmatel 4-Speaker Stereo' 90% # CS4237B chipset: mixer "$card" 'Master Digital' 100% # DRC mixer "$card" 'Dynamic Range Compression' 90% # Envy24 chips with analog outs mixer "$card" DAC 100% mixer "$card" DAC,0 100% mixer "$card" DAC,1 100% # some notebooks use headphone instead of master mixer "$card" Headphone 100% mixer "$card" Speaker 100% mixer "$card" 'Internal Speaker' 0% mute mixer "$card" Playback 100% mixer "$card" Headphone 100% mixer "$card" Speaker 100% mixer "$card" Center 100% mixer "$card" LFE 100% mixer "$card" Center/LFE 100% # Intel P4P800-MX (Ubuntu bug #5813) mixer "$card" 'Master Playback Switch' on # set digital output mixer params mixer "$card" 'IEC958' 100% on mixer "$card" 'IEC958 Output' 100% mixer "$card" 'IEC958 Coaxial' 100% mixer "$card" 'IEC958 LiveDrive' 100% mixer "$card" 'IEC958 Optical Raw' 100% mixer "$card" 'SPDIF Out' 100% mixer "$card" 'SPDIF Front' 100% mixer "$card" 'SPDIF Rear' 100% mixer "$card" 'SPDIF Center/LFE' 100% mixer "$card" 'Master Digital' 100% mixer "$card" 'Analog Front' 100% mixer "$card" 'Analog Rear' 100% mixer "$card" 'Analog Center/LFE' 100% # ASRock ION 330 (and perhaps others) has 2 IEC958 channels mixer "$card" IEC958,0 on mixer "$card" IEC958,1 on # some ION2 has much more IEC958 channels ... mixer "$card" IEC958,2 on mixer "$card" IEC958,3 on # ASRock ION 330 has Master Front set to 0 mixer "$card" 'Master Front' 100% # Shuttle XS35GT needs this too mixer "$card" 'Master',0 100% on # and this for various Fusion devices like Zotac ZBOX mixer "$card" 'Front',0 100% on # NVidia CK804 sound devices mixer "$card" 'IEC958 Playback AC97-SPSA' 100% # Allwinner H3 Analog mixer "$card" 'Line Out' 0db on # Allwinner A20 Analog mixer "$card" 'Power Amplifier' 0db mixer "$card" 'Power Amplifier DAC' on mixer "$card" 'Power Amplifier Mute' on # Allwinner A64 Analog mixer "$card" Headphone 0db on mixer "$card" 'AIF1 Slot 0 Digital DAC' on # Amlogic audio devices case $(dtsoc) in amlogic,g12*|amlogic,sm1) # AXG HDMI // Logic assumes TDMOUT_A is not present in device-tree when TDMOUT_B is used TDMOUT=$(awk '/TDMOUT/ && $2=="OUT" {print substr($1,length($1),1)}' /sys/firmware/devicetree/base/sound/audio-routing | sort | head -n 1) if [ "${TDMOUT}" = "A" ]; then mixer "$card" 'FRDDR_A SINK 1 SEL' 'OUT 0' mixer "$card" 'FRDDR_A SRC 1 EN' on mixer "$card" 'TDMOUT_A SRC SEL' 'IN 0' mixer "$card" 'TOHDMITX' on mixer "$card" 'TOHDMITX I2S SRC' 'I2S A' elif [ "${TDMOUT}" = "B" ]; then mixer "$card" 'FRDDR_A SINK 1 SEL' 'OUT 1' mixer "$card" 'FRDDR_A SRC 1 EN' on mixer "$card" 'TDMOUT_B SRC SEL' 'IN 0' mixer "$card" 'TOHDMITX' on mixer "$card" 'TOHDMITX I2S SRC' 'I2S B' fi # AXG S/PDIF SPDIFOUT=$(awk '/SPDIF/' /sys/firmware/devicetree/base/sound/audio-routing | sort | head -n 1) if [ -n "${SPDIFOUT}" ]; then mixer "$card" 'FRDDR_B SINK 1 SEL' 'OUT 3' mixer "$card" 'FRDDR_B SRC 1 EN' on mixer "$card" 'SPDIFOUT SRC SEL' 'IN 1' mixer "$card" 'SPDIFOUT Playback' on fi # AXG Headphone Jack ACODEC=$(awk '/ACODEC/' /sys/firmware/devicetree/base/sound/audio-routing | sort | head -n 1) if [ -n "${ACODEC}" ]; then mixer "$card" 'TOACODEC OUT EN' on mixer "$card" 'TOACODEC SRC' 'I2S ${TDMOUT}' mixer "$card" 'ACODEC Playback Switch' on mixer "$card" 'ACODEC Playback Channel Mode' Stereo fi ;; amlogic,meson-gx*) # AIU HDMI and S/PDIF mixer "$card" 'AIU HDMI CTRL SRC' 'I2S' mixer "$card" 'AIU SPDIF SRC SEL' 'SPDIF' # AIU ACODEC headphone jack mixer "$card" 'ACODEC' 80% on mixer "$card" 'AIU ACODEC SRC' 'I2S' mixer "$card" 'AIU ACODEC OUT EN' on ;; esac # ES8316 headphone jack mixer "$card" 'Right Headphone Mixer Right DAC' on mixer "$card" 'Left Headphone Mixer Left DAC' on fi exit 0 )& ================================================ FILE: packages/audio/alsa-utils/udev.d/90-alsa-restore.rules ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # When a sound device is detected, restore the volume settings KERNEL=="controlC[0-9]*", NAME="snd/%k", ACTION=="add", RUN+="soundconfig %k" ================================================ FILE: packages/audio/espeak-ng/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="espeak-ng" PKG_VERSION="1.51.1" PKG_SHA256="0823df5648659dcb67915baaf99118dcc8853639f47cadaa029c174bdd768d20" PKG_LICENSE="GPL" PKG_SITE="https://github.com/espeak-ng/espeak-ng" PKG_URL="https://github.com/espeak-ng/espeak-ng/archive/refs/tags/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="gcc:host" PKG_DEPENDS_TARGET="toolchain pcaudiolib espeak-ng:host" PKG_LONGDESC="eSpeak NG is an open source speech synthesizer that supports more than a hundred languages and accents" PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+sysroot +debug" make_host() { mkdir phsource dictsource (cd dictsource; ln -s ../../dictsource/* .) (cd phsource; ln -s ../../phsource/* .) cp -aP ../espeak-ng-data . make DESTDIR=`pwd` -j1 } makeinstall_host() { mkdir -p ${TOOLCHAIN}/share/espeak-ng-data cp -prf ${PKG_BUILD}/.x86_64-linux-gnu/espeak-ng-data/* ${TOOLCHAIN}/share/espeak-ng-data/ } make_target() { make src/espeak-ng src/speak-ng } makeinstall_target() { make src/espeak-ng src/speak-ng make install-exec DESTDIR=${INSTALL} mkdir -p ${INSTALL}/usr/share/espeak-ng-data cp -prf ${TOOLCHAIN}/share/espeak-ng-data ${INSTALL}/usr/share cp -prf ${INSTALL}/usr/lib/* ${SYSROOT_PREFIX}/usr/lib/ cp -prf ${PKG_BUILD}/src/include/espea* ${SYSROOT_PREFIX}/usr/include } ================================================ FILE: packages/audio/espeak-ng/patches/PR1858-fix-compiling-in-build-directory.patch ================================================ From 9e6083c12a41334b2817b443d430637f01ee5fb9 Mon Sep 17 00:00:00 2001 From: Rudi Heitbaum Date: Sun, 14 Jan 2024 11:33:08 +1100 Subject: [PATCH] fix compiling in build directory $(srcdir) was missing on includes for src/include/espeak-ng/espeak-ng.h --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 595546899..d8671efa3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -16,7 +16,7 @@ SHARED_VERSION=2:51:1 # = *.so.1.1.51 MKDIR=mkdir -p AM_CFLAGS = \ - -Isrc/include -Isrc/include/compat -I$(srcdir)/src/speechPlayer/include -I$(srcdir)/src/ucd-tools/src/include \ + -I$(srcdir)/src/include -Isrc/include/compat -I$(srcdir)/src/speechPlayer/include -I$(srcdir)/src/ucd-tools/src/include \ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112L AM_CXXFLAGS = ================================================ FILE: packages/audio/espeak-ng/pcaudiolib/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2024-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="pcaudiolib" PKG_VERSION="c651ccb767abede0228570968293219e429899d5" PKG_SHA256="6cfd54c227fadecadf6e2e175ab4928395fe736846e0f6c0a30f7a20fff988d5" PKG_LICENSE="GPL" PKG_SITE="https://github.com/espeak-ng/pcaudiolib" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="eSpeak NG is an open source speech synthesizer that supports more than a hundred languages and accents" PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+sysroot" pre_configure() { PKG_CONFIGURE_OPTS_TARGET="--with-pulseaudio=no" cd .. ./autogen.sh } #post_makeinstall_target(){ #mkdir -p ${SYSROOT_PREFIX}/usr #cp -rf ${INSTALL}/usr/* ${SYSROOT_PREFIX}/usr/ #} ================================================ FILE: packages/audio/flac/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="flac" PKG_VERSION="1.4.3" PKG_SHA256="6c58e69cd22348f441b861092b825e591d0b822e106de6eb0ee4d05d27205b70" PKG_LICENSE="GPLv2" PKG_SITE="https://xiph.org/flac/" PKG_URL="https://downloads.xiph.org/releases/flac/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libogg" PKG_LONGDESC="An Free Lossless Audio Codec." PKG_TOOLCHAIN="autotools" # flac-1.3.1 dont build with LTO support PKG_BUILD_FLAGS="+pic" # package specific configure options PKG_CONFIGURE_OPTS_TARGET="--enable-shared \ --disable-static \ --disable-rpath \ --disable-altivec \ --disable-doxygen-docs \ --disable-thorough-tests \ --disable-cpplibs \ --disable-xmms-plugin \ --disable-oggtest \ --with-ogg=${SYSROOT_PREFIX}/usr \ --with-gnu-ld" if target_has_feature sse; then PKG_CONFIGURE_OPTS_TARGET+=" --enable-sse" else PKG_CONFIGURE_OPTS_TARGET+=" --disable-sse" fi post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/audio/fluidsynth/package.mk ================================================ # 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="fluidsynth" PKG_VERSION="2.3.2" PKG_SHA256="cd610810f30566e28fb98c36501f00446a06fa6bae3dc562c8cd3868fe1c0fc7" PKG_LICENSE="GPL" PKG_SITE="http://fluidsynth.org/" PKG_URL="https://github.com/FluidSynth/fluidsynth/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain glib libsndfile" PKG_LONGDESC="FluidSynth renders midi music files as raw audio data, for playing or conversion." PKG_BUILD_FLAGS="+pic" PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=0 \ -DLIB_SUFFIX= \ -Denable-libsndfile=1 \ -Denable-pkgconfig=1 \ -Denable-pulseaudio=0 \ -Denable-readline=0" ================================================ FILE: packages/audio/fluidsynth/patches/libsndfile-use-static-libraries.patch ================================================ --- a/CMakeLists.txt 2021-09-12 13:53:14.192948082 +1000 +++ b/CMakeLists.txt 2021-09-12 13:54:27.389413149 +1000 @@ -535,6 +535,7 @@ LIBSNDFILE_STATIC_LDFLAGS MATCHES "vorbis" OR LIBSNDFILE_STATIC_LDFLAGS_OTHER MATCHES "vorbis" ) set ( LIBSNDFILE_HASVORBIS 1 ) + set ( LIBSNDFILE_LIBRARIES ${LIBSNDFILE_STATIC_LIBRARIES} ) else () message ( NOTICE "Seems like libsndfile was compiled without OGG/Vorbis support." ) endif () ================================================ FILE: packages/audio/lame/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="lame" PKG_VERSION="3.100" PKG_SHA256="ddfe36cab873794038ae2c1210557ad34857a4b6bdc515785d1da9e175b1da1e" PKG_LICENSE="LGPL" PKG_SITE="http://lame.sourceforge.net/" PKG_URL="${SOURCEFORGE_SRC}/lame/lame/3.100/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A high quality MPEG Audio Layer III (MP3) encoder." PKG_BUILD_FLAGS="-parallel +pic" # package specific configure options PKG_CONFIGURE_OPTS_TARGET="--disable-static \ --enable-shared \ --disable-nasm \ --disable-rpath \ --disable-cpml \ --disable-gtktest \ --disable-efence \ --disable-analyzer-hooks \ --enable-decoder \ --disable-frontend \ --disable-mp3x \ --disable-mp3rtp \ --disable-dynamic-frontends \ --enable-expopt=no \ --enable-debug=no \ --with-gnu-ld \ --with-fileio=lame \ GTK_CONFIG=no" ================================================ FILE: packages/audio/ldacBT/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ldacBT" PKG_VERSION="2.0.2.3" PKG_SHA256="c02998718f9c4620437d7594b4d121b3ab4c5cfeba8d41fa31dd5c71db09edca" PKG_LICENSE="Apache" PKG_SITE="https://github.com/EHfive/ldacBT" PKG_URL="https://github.com/EHfive/ldacBT/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_DEPENDS_UNPACK="libldac" PKG_LONGDESC="LDAC Bluetooth encoder library (build tools)" PKG_CMAKE_OPTS_TARGET="-DLDAC_SOFT_FLOAT=OFF" post_unpack() { rm -rf ${PKG_BUILD}/libldac ln -sf $(get_build_dir libldac) ${PKG_BUILD}/libldac } ================================================ FILE: packages/audio/libcdio/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libcdio" PKG_VERSION="2.1.0" PKG_SHA256="8550e9589dbd594bfac93b81ecf129b1dc9d0d51e90f9696f1b2f9b2af32712b" PKG_LICENSE="GPLv3" PKG_SITE="https://www.gnu.org/software/libcdio/" PKG_URL="http://ftpmirror.gnu.org/libcdio/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A CD-ROM reading and control library." PKG_BUILD_FLAGS="+pic" # package specific configure options PKG_CONFIGURE_OPTS_TARGET="--enable-cxx \ --disable-cpp-progs \ --disable-shared \ --enable-static \ --enable-joliet \ --disable-rpath \ --enable-rock \ --disable-cddb \ --disable-vcd-info \ --without-cd-drive \ --without-cd-info \ --without-cdda-player \ --without-cd-read \ --without-iso-info \ --without-iso-read \ --without-libiconv-prefix \ --with-gnu-ld" post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/audio/libcdio/patches/0001-Use-getmntent-setmntent-for-reading-mounts.patch ================================================ From 0d550dc9307901edd817333a5b530241d08ad889 Mon Sep 17 00:00:00 2001 From: Miguel Borges de Freitas Date: Wed, 2 Feb 2022 20:47:02 +0000 Subject: [PATCH] Use getmntent/setmntent for reading mounts Since fields in the mtab and fstab files are separated by whitespace, octal escapes are used to represent the characters space (\040), tab (\011), newline (\012), and backslash (\\) in those files when they occur in one of the four strings in a mntent structure. The routines addmntent() and getmntent() will convert from string representation to escaped representation and back. When converting from escaped representation, the sequence \134 is also converted to a backslash. --- lib/driver/gnu_linux.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/driver/gnu_linux.c b/lib/driver/gnu_linux.c index 6a6aa4dd..dddf333c 100644 --- a/lib/driver/gnu_linux.c +++ b/lib/driver/gnu_linux.c @@ -672,13 +672,13 @@ static int is_mounted (const char * device, char * target) { char real_device_1[PATH_MAX]; char real_device_2[PATH_MAX]; - char file_device[PATH_MAX]; - char file_target[PATH_MAX]; + struct mntent *fs; + + fp = setmntent("/proc/mounts", "r"); - fp = fopen ( "/proc/mounts", "r"); /* Older systems just have /etc/mtab */ if(!fp) - fp = fopen ( "/etc/mtab", "r"); + fp = setmntent("/etc/mtab", "r"); /* Neither /proc/mounts nor /etc/mtab could be opened, give up here */ if(!fp) return 0; @@ -691,19 +691,19 @@ static int is_mounted (const char * device, char * target) { /* Read entries */ - while ( fscanf(fp, "%s %s %*s %*s %*d %*d\n", file_device, file_target) != EOF ) { - if (NULL == cdio_realpath(file_device, real_device_2)) { + while ((fs = getmntent(fp)) != NULL) { + if (NULL == cdio_realpath(fs->mnt_fsname, real_device_2)) { cdio_debug("Problems resolving device %s: %s\n", - file_device, strerror(errno)); + fs->mnt_fsname, strerror(errno)); } if(!strcmp(real_device_1, real_device_2)) { - strcpy(target, file_target); - fclose(fp); + strcpy(target, fs->mnt_dir); + endmntent(fp); return 1; } } - fclose(fp); + endmntent(fp); return 0; } -- 2.30.2 ================================================ FILE: packages/audio/libfreeaptx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libfreeaptx" PKG_VERSION="0.1.1" PKG_SHA256="7acf514446cae59585d9bc21e4f98f4a3856f4741c3a7a09d06e8ac5bf2f7315" PKG_LICENSE="LGPL" PKG_SITE="https://github.com/iamthehorker/libfreeaptx" PKG_URL="https://github.com/iamthehorker/libfreeaptx/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Open Source aptX codec library" PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="+pic" make_target() { ${CC} ${CFLAGS} -I${PKG_BUILD} -c -o ${PKG_NAME##*lib}.o ${PKG_NAME##*lib}.c ${AR} -rcs ${PKG_NAME}.a ${PKG_NAME##*lib}.o } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib cp -a ${PKG_NAME}.a ${SYSROOT_PREFIX}/usr/lib/ mkdir -p ${SYSROOT_PREFIX}/usr/include cp -a ${PKG_NAME##*lib}.h ${SYSROOT_PREFIX}/usr/include/ mkdir -p ${SYSROOT_PREFIX}/usr/lib/pkgconfig cat > ${SYSROOT_PREFIX}/usr/lib/pkgconfig/${PKG_NAME}.pc << EOF prefix=/usr exec_prefix=\${prefix} libdir=\${exec_prefix}/lib includedir=\${prefix}/include Name: ${PKG_NAME} Description: Open Source aptX codec library Version: ${PKG_VERSION} Libs: -Wl,-rpath=\${libdir} -L\${libdir} -l${PKG_NAME##*lib} Cflags: -I\${includedir} EOF } ================================================ FILE: packages/audio/libldac/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libldac" PKG_VERSION="82b6a1abee84787b8fa167efe20290073f60db2d" PKG_SHA256="d61edcd3bfc4b71123136895fe71e7ba974f4a91f16a158f0ec8d5eb1913c51a" PKG_LICENSE="Apache" PKG_SITE="https://android.googlesource.com/platform/external/libldac" PKG_URL="https://github.com/brucehw/libldac/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="LDAC Bluetooth encoder library" PKG_TOOLCHAIN="manual" ================================================ FILE: packages/audio/libmodplug/package.mk ================================================ # 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="libmodplug" PKG_VERSION="0.8.9.0" PKG_SHA256="457ca5a6c179656d66c01505c0d95fafaead4329b9dbaa0f997d00a3508ad9de" PKG_LICENSE="GPL" PKG_SITE="http://modplug-xmms.sourceforge.net/" PKG_URL="${SOURCEFORGE_SRC}/modplug-xmms/libmodplug/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="libmodplug renders mod music files as raw audio data, for playing or conversion." PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-static --disable-shared" ================================================ FILE: packages/audio/libogg/package.mk ================================================ # 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) PKG_NAME="libogg" PKG_VERSION="1.3.5" PKG_SHA256="c4d91be36fc8e54deae7575241e03f4211eb102afb3fc0775fbbc1b740016705" PKG_LICENSE="BSD" PKG_SITE="https://www.xiph.org/ogg/" PKG_URL="https://downloads.xiph.org/releases/ogg/libogg-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Libogg contains necessary functionality to create, decode, and work with Ogg bitstreams." PKG_BUILD_FLAGS="+pic" PKG_CMAKE_OPTS_TARGET="-DINSTALL_DOCS=OFF" ================================================ FILE: packages/audio/libopenmpt/package.mk ================================================ # 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="libopenmpt" PKG_VERSION="0.6.6" PKG_SHA256="6ddb9e26a430620944891796fefb1bbb38bd9148f6cfc558810c0d3f269876c7" PKG_LICENSE="BSD" PKG_SITE="https://lib.openmpt.org/libopenmpt/" PKG_URL="https://lib.openmpt.org/files/libopenmpt/src/${PKG_NAME}-${PKG_VERSION}+release.autotools.tar.gz" PKG_DEPENDS_TARGET="toolchain libogg libvorbis zlib" PKG_LONGDESC="libopenmpt renders mod music files as raw audio data, for playing or conversion." PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared \ --without-mpg123 \ --with-vorbis \ --with-vorbisfile \ --without-pulseaudio \ --without-portaudio \ --without-portaudiocpp \ --without-sdl \ --without-sdl2 \ --without-sndfile \ --without-flac" ================================================ FILE: packages/audio/libopenmpt/patches/libopenmpt-add-libvorbisfile-to-pkgconfig.patch ================================================ --- a/libopenmpt/libopenmpt.pc.in 2016-07-09 18:17:00.000000000 +0000 +++ b/libopenmpt/libopenmpt.pc.in 2021-12-25 00:53:54.189008995 +0000 @@ -8,7 +8,7 @@ Description: Tracker module player based on OpenMPT Version: @VERSION@ Requires.private: @LIBOPENMPT_REQUIRES_PRIVATE@ -Libs: -L${libdir} -lopenmpt +Libs: -L${libdir} -lopenmpt -lvorbisfile Libs.private: @LIBOPENMPT_LIBS_PRIVATE@ Cflags: -I${includedir} ================================================ FILE: packages/audio/libsamplerate/package.mk ================================================ # 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="libsamplerate" PKG_VERSION="0.2.2" PKG_SHA256="3258da280511d24b49d6b08615bbe824d0cacc9842b0e4caf11c52cf2b043893" PKG_LICENSE="GPL" PKG_SITE="http://libsndfile.github.io/libsamplerate/" PKG_URL="https://github.com/libsndfile/libsamplerate/releases/download/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A Sample Rate Converter for audio." PKG_TOOLCHAIN="autotools" # package specific configure options PKG_CONFIGURE_OPTS_TARGET="--disable-shared \ --enable-static \ --datadir=/usr/share \ --disable-fftw \ --disable-sndfile" post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/audio/libsndfile/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libsndfile" PKG_VERSION="1.1.0" PKG_SHA256="642a876bd61b63f9346628dba5f8a0356a3ad750c7f6f42019d26ce60ba6a15b" PKG_LICENSE="LGPL-2.1-or-later" PKG_SITE="https://libsndfile.github.io/libsndfile/" PKG_URL="https://github.com/libsndfile/libsndfile/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain alsa-lib flac libogg libvorbis opus" PKG_LONGDESC="A C library for reading and writing sound files containing sampled audio data." PKG_BUILD_FLAGS="+pic" # As per notes in configure.ac: # One or more of the external libraries (ie libflac, libogg, libvorbis and libopus) # is either missing ... Unfortunately, for ease of maintenance, the external libs # are an all or nothing affair. # So all of flac, libogg, libvorbis, opus are required. PKG_CMAKE_OPTS_TARGET="-DBUILD_PROGRAMS=OFF \ -DBUILD_EXAMPLES=OFF \ -DBUILD_REGTEST=OFF \ -DBUILD_TESTING=OFF \ -DBUILD_SHARED_LIBS=ON \ -DENABLE_EXTERNAL_LIBS=ON \ -DINSTALL_MANPAGES=OFF \ -DINSTALL_PKGCONFIG_MODULE=ON" ================================================ FILE: packages/audio/libsndfile/patches/libsndfile-add-required-static-libaries-to-pkg-config.patch ================================================ --- a/sndfile.pc.in 2021-01-24 23:22:23.000000000 +1100 +++ b/sndfile.pc.in 2021-09-12 14:30:47.763655089 +1000 @@ -8,6 +8,6 @@ Requires: Requires.private: @EXTERNAL_XIPH_REQUIRE@ @EXTERNAL_MPEG_REQUIRE@ Version: @VERSION@ -Libs: -L${libdir} -lsndfile +Libs: -L${libdir} -lsndfile -lFLAC -lvorbis -logg -lvorbisenc -lopus Libs.private: @EXTERNAL_MPEG_LIBS@ Cflags: -I${includedir} ================================================ FILE: packages/audio/libvorbis/package.mk ================================================ # 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) PKG_NAME="libvorbis" PKG_VERSION="1.3.7" PKG_SHA256="b33cc4934322bcbf6efcbacf49e3ca01aadbea4114ec9589d1b1e9d20f72954b" PKG_LICENSE="BSD" PKG_SITE="http://www.vorbis.com/" PKG_URL="http://downloads.xiph.org/releases/vorbis/libvorbis-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libogg" PKG_LONGDESC="Lossless audio compression tools using the ogg-vorbis algorithms." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-shared \ --disable-static \ --with-ogg=${SYSROOT_PREFIX}/usr \ --disable-docs \ --disable-examples \ --disable-oggtest" ================================================ FILE: packages/audio/openal-soft/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="openal-soft" PKG_VERSION="1.22.2" PKG_SHA256="3e58f3d4458f5ee850039b1a6b4dac2343b3a5985a6a2e7ae2d143369c5b8135" PKG_LICENSE="GPL" PKG_SITE="http://www.openal.org/" PKG_URL="https://github.com/kcat/openal-soft/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain alsa-lib" PKG_LONGDESC="OpenAL Soft is a software implementation of the OpenAL 3D audio API." PKG_CMAKE_OPTS_TARGET="-DALSOFT_BACKEND_OSS=off \ -DALSOFT_BACKEND_PULSEAUDIO=off \ -DALSOFT_BACKEND_WAVE=off \ -DALSOFT_EXAMPLES=off \ -DALSOFT_UTILS=off" ================================================ FILE: packages/audio/pipewire/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pipewire" PKG_VERSION="0.3.66" PKG_SHA256="36b6028434c16aacfc6695073b7ca4996c5476eb92833340566d27538b635508" PKG_LICENSE="LGPL" PKG_SITE="https://pipewire.org" PKG_URL="https://github.com/PipeWire/pipewire/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libpthread-stubs dbus ncurses alsa-lib systemd libsndfile libusb" PKG_LONGDESC="PipeWire is a server and user space API to deal with multimedia pipeline" if [ "${BLUETOOTH_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" bluez sbc ldacBT libfreeaptx" PKG_PIPEWIRE_BLUETOOTH="-Dbluez5=enabled \ -Dbluez5-backend-hsp-native=disabled \ -Dbluez5-backend-hfp-native=disabled \ -Dbluez5-backend-ofono=disabled \ -Dbluez5-backend-hsphfpd=disabled \ -Dbluez5-codec-aptx=enabled \ -Dbluez5-codec-ldac=enabled \ -Dbluez5-codec-aac=disabled" else PKG_PIPEWIRE_BLUETOOTH="-Dbluez5=disabled" fi PKG_MESON_OPTS_TARGET="-Ddocs=disabled \ -Dexamples=disabled \ -Dman=disabled \ -Dtests=disabled \ -Dinstalled_tests=disabled \ -Dgstreamer=disabled \ -Dgstreamer-device-provider=disabled \ -Dsystemd=enabled \ -Dsystemd-system-service=enabled \ -Dsystemd-user-service=disabled \ -Dpipewire-alsa=enabled \ -Dpipewire-jack=disabled \ -Dpipewire-v4l2=disabled \ -Djack-devel=false -Dspa-plugins=enabled \ -Dalsa=enabled \ -Daudiomixer=enabled \ -Daudioconvert=enabled \ ${PKG_PIPEWIRE_BLUETOOTH} \ -Dcontrol=enabled \ -Daudiotestsrc=disabled \ -Dffmpeg=disabled \ -Djack=disabled \ -Dsupport=enabled \ -Devl=disabled \ -Dtest=disabled \ -Dv4l2=disabled \ -Ddbus=enabled \ -Dlibcamera=disabled \ -Dvideoconvert=disabled \ -Dvideotestsrc=disabled \ -Dvolume=enabled \ -Dvulkan=disabled \ -Dpw-cat=enabled \ -Dudev=enabled \ -Dudevrulesdir=/usr/lib/udev/rules.d \ -Dsdl2=disabled \ -Dsndfile=enabled \ -Dlibpulse=disabled \ -Droc=disabled \ -Davahi=disabled \ -Decho-cancel-webrtc=disabled \ -Dlibusb=enabled \ -Dsession-managers=[] \ -Draop=disabled \ -Dlv2=disabled \ -Dx11=disabled \ -Dx11-xfixes=disabled \ -Dlibcanberra=disabled \ -Dlegacy-rtkit=false" post_makeinstall_target() { # connect to the system bus sed '/^\[Service\]/a Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket' -i ${INSTALL}/usr/lib/systemd/system/pipewire.service } post_install() { add_user pipewire x 982 980 "pipewire-daemon" "/var/run/pipewire" "/bin/sh" add_group pipewire 980 # note that the pipewire user is added to the audio and video groups in systemd/package.mk # todo: maybe there is a better way to add users to groups in the future? enable_service pipewire.socket enable_service pipewire.service } ================================================ FILE: packages/audio/pulseaudio/config/pulse-daemon.conf.d/README ================================================ Files have to have the .conf file name extension, but otherwise the file names can be chosen freely. The files under pulse-daemon.conf.d are processed in alphabetical order. In case the same option is set in multiple files, the last file to set an option overrides earlier files. The main daemon.conf file is processed first, so options set in files under pulse-daemon.conf.d override the main file. ================================================ FILE: packages/audio/pulseaudio/config/system.pa ================================================ #!/usr/bin/pulseaudio -nF # # This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . # This startup script is used only if PulseAudio is started in system # mode. ### Load several protocols load-module module-native-protocol-unix ### Automatically restore the volume of streams and devices load-module module-stream-restore load-module module-device-restore load-module module-card-restore ### Automatically restore the default sink/source when changed by the user ### during runtime ### NOTE: This should be loaded as early as possible so that subsequent modules ### that look up the default sink/source get the right value load-module module-default-device-restore ### Make sure we always have a sink around, even if it is a null sink. load-module module-always-sink ### Automatically suspend sinks/sources that become idle for too long load-module module-suspend-on-idle ### Automatically load modules for dbus .ifexists module-dbus-protocol.so load-module module-dbus-protocol .endif ### Automatically load modules for bluetooth .ifexists module-bluetooth-policy.so load-module module-bluetooth-policy .endif .ifexists module-bluetooth-discover.so load-module module-bluetooth-discover .endif .ifexists module-zeroconf-publish.so load-module module-zeroconf-publish .endif load-module module-switch-on-connect ================================================ FILE: packages/audio/pulseaudio/package.mk ================================================ # 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) PKG_NAME="pulseaudio" PKG_VERSION="16.1" PKG_SHA256="8eef32ce91d47979f95fd9a935e738cd7eb7463430dabc72863251751e504ae4" PKG_LICENSE="GPL" PKG_SITE="http://pulseaudio.org/" PKG_URL="http://www.freedesktop.org/software/pulseaudio/releases/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain alsa-lib dbus libcap libsndfile libtool openssl soxr speexdsp systemd glib:host glib" PKG_LONGDESC="PulseAudio is a sound system for POSIX OSes, meaning that it is a proxy for your sound applications." if [ "${BLUETOOTH_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" sbc bluez" PKG_PULSEAUDIO_BLUETOOTH="-Dbluez5=enabled" else PKG_PULSEAUDIO_BLUETOOTH="-Dbluez5=disabled" fi if [ "${AVAHI_DAEMON}" = "yes" ]; then PKG_DEPENDS_TARGET+=" avahi" PKG_PULSEAUDIO_AVAHI="-Davahi=enabled" else PKG_PULSEAUDIO_AVAHI="-Davahi=disabled" fi PKG_MESON_OPTS_TARGET="-Ddaemon=true \ -Ddoxygen=false \ -Dgcov=false \ -Dman=false \ -Dtests=false \ -Dsystem_user=root \ -Dsystem_group=root \ -Daccess_group=root \ -Ddatabase=simple \ -Dlegacy-database-entry-format=false \ -Dstream-restore-clear-old-devices=false \ -Drunning-from-build-tree=false \ -Datomic-arm-linux-helpers=true \ -Datomic-arm-memory-barrier=false \ -Dmodlibexecdir=/usr/lib/pulse \ -Dudevrulesdir=/usr/lib/udev/rules.d \ -Dalsa=enabled \ -Dasyncns=disabled \ ${PKG_PULSEAUDIO_AVAHI} \ ${PKG_PULSEAUDIO_BLUETOOTH} \ -Dbluez5-gstreamer=disabled \ -Dbluez5-native-headset=false \ -Dbluez5-ofono-headset=false \ -Ddbus=enabled \ -Delogind=disabled \ -Dfftw=disabled \ -Dglib=enabled \ -Dgsettings=disabled \ -Dgstreamer=disabled \ -Dgtk=disabled \ -Dhal-compat=false \ -Dipv6=true \ -Djack=disabled \ -Dlirc=disabled \ -Dopenssl=enabled \ -Dorc=disabled \ -Doss-output=disabled \ -Dsamplerate=disabled \ -Dsoxr=enabled \ -Dspeex=enabled \ -Dsystemd=enabled \ -Dtcpwrap=disabled \ -Dudev=enabled \ -Dvalgrind=disabled \ -Dx11=disabled \ -Dadrian-aec=true \ -Dwebrtc-aec=disabled" pre_configure_target() { sed -e 's|; remixing-use-all-sink-channels = yes|; remixing-use-all-sink-channels = no|' \ -i ${PKG_BUILD}/src/daemon/daemon.conf.in # for some reason I have to add this when rebuilding or the compilation will fail, this is not a proper fix but a workaround rm -rf ${SYSROOT_PREFIX}/usr/share/bash-completion/completions/pulseaudio rm -rf ${SYSROOT_PREFIX}/usr/share/bash-completion/completions/pa* } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include safe_remove ${INSTALL}/usr/lib/cmake safe_remove ${INSTALL}/usr/lib/pkgconfig safe_remove ${INSTALL}/usr/lib/systemd safe_remove ${INSTALL}/usr/share/vala safe_remove ${INSTALL}/usr/share/zsh safe_remove ${INSTALL}/usr/share/bash-completion cp ${PKG_DIR}/config/system.pa ${INSTALL}/etc/pulse/ sed 's/user="pulse"/user="root"/' -i ${INSTALL}/etc/dbus-1/system.d/pulseaudio-system.conf mkdir -p ${INSTALL}/usr/config cp -PR ${PKG_DIR}/config/pulse-daemon.conf.d ${INSTALL}/usr/config ln -sf /storage/.config/pulse-daemon.conf.d ${INSTALL}/etc/pulse/daemon.conf.d } post_install() { enable_service pulseaudio.service } ================================================ FILE: packages/audio/pulseaudio/patches/pulseaudio-100.01-never-append-dirty-to-server-module-version.patch ================================================ From c9d7dcaa87f9ada49d75483a7c604dba27a0d71a Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 7 Jan 2014 13:22:48 +0200 Subject: [PATCH] never append -dirty to server/module version --- git-version-gen | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/git-version-gen b/git-version-gen index 9d65b80..fcf11fd 100755 --- a/git-version-gen +++ b/git-version-gen @@ -152,6 +152,7 @@ v=`echo "$v" |sed 's/^v//'` git status > /dev/null 2>&1 dirty=`sh -c 'git diff-index --name-only HEAD' 2>/dev/null` || dirty= +dirty= case "$dirty" in '') ;; *) # Append the suffix only if there isn't one already. -- 1.7.2.5 ================================================ FILE: packages/audio/pulseaudio/patches/pulseaudio-100.02-check_uid.patch ================================================ --- pulseaudio-4.0.orig/src/pulsecore/core-util.c 2014-01-12 23:31:26.281525000 -0800 +++ pulseaudio-4.0/src/pulsecore/core-util.c 2014-01-12 23:32:32.977118803 -0800 @@ -1447,10 +1447,6 @@ if (stat(p, &st) < 0) return -errno; -#ifdef HAVE_GETUID - if (st.st_uid != getuid() && st.st_uid != 0) - return -EACCES; -#endif return 0; } ================================================ FILE: packages/audio/pulseaudio/profile.d/99-pulseaudio.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/lib/pulseaudio" ================================================ FILE: packages/audio/pulseaudio/system.d/pulseaudio.service ================================================ [Unit] Description=PulseAudio Sound Service After=syslog.target local-fs.target [Service] Type=dbus BusName=org.pulseaudio.Server ExecStart=/usr/bin/pulseaudio --system --disallow-exit --exit-idle-time=-1 --disable-shm --enable-memfd --realtime Restart=on-failure Environment=PULSE_STATE_PATH=/storage/.config/pulse Environment=PULSE_CONFIG_PATH=/storage/.config/pulse [Install] WantedBy=multi-user.target ================================================ FILE: packages/audio/rpi-cirrus-config/config/rpi-cirrus-config.sh.sample ================================================ #!/bin/sh # # Sample user config script to setup Cirrus Logic Audio Card # load helper functions and definitions . /usr/lib/alsa/rpi-cirrus-functions.sh # enable output to S/PDIF, line out and headset out playback_to_spdif playback_to_lineout playback_to_headset # disable noise gate - this can cut off the first few ms of playback mixer 'Noise Gate Switch' off # Uncomment this line to enable output to speakers # playback_to_speakers # example: mix line in and headset in into line out using a high-pass filter # - line in gain is set to +8dB # - headset in gain is set to +20dB # - line in and headset in are mixed together in the filter, each using # a gain of -3dB (volume 29). line in uses input 1, headset in input 2 # - first input of line out is connected to audio signal from RPi/Kodi, # using a -3dB gain # - second input of line out is connected to output of the filter # # mixer "${line_out} Digital Switch" off # mute output # setup_line_in 8 # setup_headset_in 20 # setup_filter "High-Pass" "240,3" # set_mixer $filter_signals $line_in_signals 29 1 # set_mixer $filter_signals $headset_in_signals 29 2 # set_mixer $line_out_signals $rpi_out_signals 29 1 # set_mixer $line_out_signals $filter_signals 29 2 # mixer "${line_out} Digital Switch" on # unmute output ================================================ FILE: packages/audio/rpi-cirrus-config/modprobe.d/rpi-cirrus.conf ================================================ softdep arizona-spi pre: arizona-ldo1 ================================================ FILE: packages/audio/rpi-cirrus-config/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rpi-cirrus-config" PKG_VERSION="0.0.2" PKG_SHA256="cc11c47f1f2b6d5e72dcdea828ba57e0dcaf74161f675a4a9f395054f5d82d31" PKG_LICENSE="GPL" PKG_SITE="https://github.com/HiassofT/rpi-cirrus-config" PKG_URL="https://github.com/HiassofT/rpi-cirrus-config/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="alsa-utils" PKG_LONGDESC="Config scripts for the Wolfson/Cirrus Logic audio card" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/udev install -m 0755 ${PKG_DIR}/scripts/rpi-cirrus-config ${INSTALL}/usr/lib/udev/rpi-cirrus-config mkdir -p ${INSTALL}/usr/share/alsa/cards cp alsa/RPiCirrus.conf ${INSTALL}/usr/share/alsa/cards mkdir -p ${INSTALL}/usr/lib/alsa cp mixer-scripts/rpi-cirrus-functions.sh ${INSTALL}/usr/lib/alsa mkdir -p ${INSTALL}/usr/config cp -PR ${PKG_DIR}/config/* ${INSTALL}/usr/config } ================================================ FILE: packages/audio/rpi-cirrus-config/scripts/rpi-cirrus-config ================================================ #!/bin/sh # setup default mixer settings for Cirrus Logic Audio Card . /etc/profile if [ -f $HOME/.config/sound.conf ] ; then alsactl restore -f $HOME/.config/sound.conf else if [ -r $HOME/.config/rpi-cirrus-config.sh ] ; then progress "Setting up Cirrus Logic Audio Card with user config" sh $HOME/.config/rpi-cirrus-config.sh else progress "Setting up Cirrus Logic Audio Card" # load helper functions and definitions . /usr/lib/alsa/rpi-cirrus-functions.sh playback_to_spdif playback_to_lineout playback_to_headset mixer 'Noise Gate Switch' off fi fi ================================================ FILE: packages/audio/rpi-cirrus-config/udev.d/90-alsa-restore.rules ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) # When a sound device is detected, restore the volume settings SUBSYSTEM=="sound", KERNEL=="controlC*", NAME="snd/%k", ACTION=="add", GOTO="alsa_restore_go" GOTO="alsa_restore_end" LABEL="alsa_restore_go" # Separate config-script for RPi-Cirrus card DRIVERS=="snd-rpi-cirrus", RUN+="rpi-cirrus-config", GOTO="alsa_restore_end" # Default config-script for all other cards RUN+="soundconfig %k" LABEL="alsa_restore_end" ================================================ FILE: packages/audio/sbc/package.mk ================================================ # 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="sbc" PKG_VERSION="2.0" PKG_SHA256="8f12368e1dbbf55e14536520473cfb338c84b392939cc9b64298360fd4a07992" PKG_LICENSE="GPL" PKG_SITE="http://www.bluez.org/" PKG_URL="https://www.kernel.org/pub/linux/bluetooth/sbc-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="standalone SBC library" PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared \ --disable-tools \ --disable-tester" post_makeinstall_target() { # fix static library sed -i 's/-lsbc/-lsbc -lbluetooth/' ${SYSROOT_PREFIX}/usr/lib/pkgconfig/sbc.pc } ================================================ FILE: packages/audio/sidplay-libs/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="sidplay-libs" PKG_VERSION="2.1.1" PKG_SHA256="e9a24ada48215a46d2c232a70c5601bc9505e997f120e8f2ba3713e09e28d1f9" PKG_LICENSE="GPL" PKG_SITE="http://sidplay2.sourceforge.net/" PKG_URL="http://mirrors.xbmc.org/build-deps/sources/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="sidplay-libs" PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--disable-shared --enable-static" pre_configure_target() { # fails to build in subdirs cd ${PKG_BUILD} rm -rf .${TARGET_NAME} export CXXFLAGS="${CXXFLAGS} -Wno-narrowing" } ================================================ FILE: packages/audio/sidplay-libs/patches/sidplay-libs-01-m4-tests.patch ================================================ --- sidplay-libs-2.1.1/libsidplay/unix/my_macros.m4.orig 2004-06-14 22:08:04.000000000 +0200 +++ sidplay-libs-2.1.1/libsidplay/unix/my_macros.m4 2013-11-18 01:23:32.195297135 +0100 @@ -80,8 +80,8 @@ AC_CACHE_VAL(test_cv_have_ios_binary, [ AC_TRY_COMPILE( - [#include ], - [ifstream myTest(ios::in|ios::binary);], + [#include ], + [std::ifstream myTest(std::ios::in|std::ios::binary);], [test_cv_have_ios_binary=yes], [test_cv_have_ios_binary=no] ) @@ -105,9 +105,9 @@ AC_CACHE_VAL(test_cv_have_ios_openmode, [ AC_TRY_COMPILE( - [#include - #include ], - [ios::openmode myTest = ios::in;], + [#include + #include ], + [std::ios_base::openmode myTest = std::ios::in;], [test_cv_have_ios_openmode=yes], [test_cv_have_ios_openmode=no] ) ================================================ FILE: packages/audio/sidplay-libs/patches/sidplay-libs-02-inherited.patch ================================================ --- sidplay-libs-2.1.1/libsidplay/include/sidplay/SmartPtr.h.old 2013-11-18 00:40:16.679173012 +0100 +++ sidplay-libs-2.1.1/libsidplay/include/sidplay/SmartPtr.h 2013-11-18 00:41:22.451176157 +0100 @@ -211,16 +211,16 @@ { if ( bufferLen >= 1 ) { - pBufCurrent = ( bufBegin = buffer ); - bufEnd = bufBegin + bufferLen; - bufLen = bufferLen; - status = true; + this->pBufCurrent = ( this->bufBegin = buffer ); + this->bufEnd = this->bufBegin + bufferLen; + this->bufLen = bufferLen; + this->status = true; } else { - pBufCurrent = bufBegin = bufEnd = 0; - bufLen = 0; - status = false; + this->pBufCurrent = this->bufBegin = this->bufEnd = 0; + this->bufLen = 0; + this->status = false; } } }; ================================================ FILE: packages/audio/sidplay-libs/patches/sidplay-libs-03-operator.patch ================================================ --- sidplay-libs-2.1.1/libsidutils/include/sidplay/utils/SidUsage.h.orig 2013-11-18 00:58:06.111224154 +0100 +++ sidplay-libs-2.1.1/libsidutils/include/sidplay/utils/SidUsage.h 2013-11-18 00:58:28.219225212 +0100 @@ -33,7 +33,7 @@ uint_least16_t length; // usage scan length // Copy common parts of basic usage to extended usage. - sid2_usage_t &sid2_usage_t::operator= (const sid_usage_t &usage) + sid2_usage_t &operator= (const sid_usage_t &usage) { *((sid_usage_t *) this) = usage; return *this; ================================================ FILE: packages/audio/sidplay-libs/patches/sidplay-libs-04-includes.patch ================================================ --- sidplay-libs-2.1.1/builders/hardsid-builder/src/hardsid-builder.cpp.orig 2004-06-14 22:07:57.000000000 +0200 +++ sidplay-libs-2.1.1/builders/hardsid-builder/src/hardsid-builder.cpp 2013-11-18 01:01:50.399234880 +0100 @@ -55,6 +55,7 @@ #include "hardsid.h" #include "hardsid-emu.h" +#include #ifdef HAVE_MSWINDOWS --- sidplay-libs-2.1.1/builders/resid-builder/src/resid.cpp.orig 2013-11-18 01:00:07.827229975 +0100 +++ sidplay-libs-2.1.1/builders/resid-builder/src/resid.cpp 2013-11-18 01:00:21.563230632 +0100 @@ -24,6 +24,7 @@ #include "resid.h" #include "resid-emu.h" +#include char ReSID::m_credit[]; --- sidplay-libs-2.1.1/builders/resid-builder/src/resid-builder.cpp.orig 2013-11-18 01:00:39.727231501 +0100 +++ sidplay-libs-2.1.1/builders/resid-builder/src/resid-builder.cpp 2013-11-18 01:00:57.415232346 +0100 @@ -45,6 +45,7 @@ #include "resid.h" #include "resid-emu.h" +#include // Error String(s) const char *ReSIDBuilder::ERR_FILTER_DEFINITION = "RESID ERROR: Filter definition is not valid (see docs)."; ================================================ FILE: packages/audio/soxr/package.mk ================================================ # 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) PKG_NAME="soxr" PKG_VERSION="0.1.3" PKG_SHA256="b111c15fdc8c029989330ff559184198c161100a59312f5dc19ddeb9b5a15889" PKG_LICENSE="LGPL" PKG_SITE="https://sourceforge.net/projects/soxr/" PKG_URL="${SOURCEFORGE_SRC}/soxr/soxr-${PKG_VERSION}-Source.tar.xz" PKG_DEPENDS_TARGET="toolchain cmake:host" PKG_LONGDESC="The SoX Resampler library performs one-dimensional sample-rate conversion. It may be used to resample PCM-encoded audio." PKG_BUILD_FLAGS="+pic" PKG_CMAKE_OPTS_TARGET="-DBUILD_EXAMPLES=OFF \ -DWITH_OPENMP=OFF \ -DBUILD_SHARED_LIBS=OFF \ -DBUILD_TESTS=OFF \ -DWITH_AVFFT=OFF" if [ "${TARGET_ARCH}" = "arm" ]; then if target_has_feature neon; then PKG_CMAKE_OPTS_TARGET+=" -DWITH_CR32=OFF" else PKG_CMAKE_OPTS_TARGET+=" -DWITH_CR32S=OFF" fi fi ================================================ FILE: packages/audio/speex/package.mk ================================================ # 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) PKG_NAME="speex" PKG_VERSION="1.2.1" PKG_SHA256="cc55cce69d8753940d56936f7a1fe6db4b302df144aec93a92de1c65b1a87681" PKG_LICENSE="BSD" PKG_SITE="https://speex.org" PKG_URL="https://gitlab.xiph.org/xiph/speex/-/archive/Speex-${PKG_VERSION}/speex-Speex-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="An Open Source Software patent-free audio compression format designed for speech." PKG_TOOLCHAIN="autotools" ================================================ FILE: packages/audio/speexdsp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="speexdsp" PKG_VERSION="1.2.1" PKG_SHA256="b36d4f16e42b7103b7fc3e4a8f98b6bf889dd1f70f65c2365af07be82844db29" PKG_LICENSE="BSD" PKG_SITE="https://speex.org" PKG_URL="https://gitlab.xiph.org/xiph/speexdsp/-/archive/SpeexDSP-${PKG_VERSION}/speexdsp-SpeexDSP-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Speex audio processing library" PKG_TOOLCHAIN="autotools" ================================================ FILE: packages/audio/taglib/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="taglib" PKG_VERSION="1.13" PKG_SHA256="58f08b4db3dc31ed152c04896ee9172d22052bc7ef12888028c01d8b1d60ade0" PKG_LICENSE="LGPL" PKG_SITE="https://taglib.org" PKG_URL="https://taglib.org/releases/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain cmake:host zlib" PKG_LONGDESC="TagLib is a library for reading and editing the meta-data of several popular audio formats." PKG_CMAKE_OPTS_TARGET="-DBUILD_EXAMPLES=OFF \ -DBUILD_SHARED_LIBS=OFF \ -DBUILD_TESTING=OFF \ -DENABLE_CCACHE=ON \ -DWITH_ZLIB=ON" post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin # pkgconf hack sed -e "s:\(['=\" ]\)/usr:\\1${SYSROOT_PREFIX}/usr:g" -i ${SYSROOT_PREFIX}/usr/bin/taglib-config sed -e "s:\([':\" ]\)-I/usr:\\1-I${SYSROOT_PREFIX}/usr:g" -i ${SYSROOT_PREFIX}/usr/lib/pkgconfig/taglib.pc sed -e "s:\([':\" ]\)-L/usr:\\1-L${SYSROOT_PREFIX}/usr:g" -i ${SYSROOT_PREFIX}/usr/lib/pkgconfig/taglib.pc sed -e "s:\([':\" ]\)-I/usr:\\1-I${SYSROOT_PREFIX}/usr:g" -i ${SYSROOT_PREFIX}/usr/lib/pkgconfig/taglib_c.pc sed -e "s:\([':\" ]\)-L/usr:\\1-L${SYSROOT_PREFIX}/usr:g" -i ${SYSROOT_PREFIX}/usr/lib/pkgconfig/taglib_c.pc } ================================================ FILE: packages/audio/wavpack/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="wavpack" PKG_VERSION="5.6.0" PKG_SHA256="af8035f457509c3d338b895875228a9b81de276c88c79bb2d3e31d9b605da9a9" PKG_LICENSE="BSD" PKG_SITE="https://www.wavpack.com" PKG_URL="https://www.wavpack.com/wavpack-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libiconv" PKG_LONGDESC="Audio compression format providing lossless, high-quality lossy and hybrid compression mode." PKG_CMAKE_OPTS_TARGET="-DBUILD_TESTING=OFF \ -DCMAKE_INSTALL_INCLUDEDIR=include/wavpack \ -DWAVPACK_BUILD_PROGRAMS=OFF \ -DWAVPACK_BUILD_DOCS=OFF \ -DWAVPACK_ENABLE_ASM=OFF \ -DWAVPACK_INSTALL_DOCS=OFF" ================================================ FILE: packages/audio/wireplumber/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="wireplumber" PKG_VERSION="0.4.13" PKG_SHA256="2c3cd85a743249d418a64b137adaea475e9d36a3bb31e4230da83458c4d99e48" PKG_LICENSE="MIT" PKG_SITE="https://gitlab.freedesktop.org/pipewire/wireplumber" PKG_URL="https://gitlab.freedesktop.org/pipewire/wireplumber/-/archive/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="pipewire glib lua54 glib:host" PKG_LONGDESC="Session / policy manager implementation for PipeWire" PKG_MESON_OPTS_TARGET="-Dintrospection=disabled \ -Ddoc=disabled \ -Dsystem-lua=true \ -Delogind=disabled \ -Dsystemd=enabled \ -Dsystemd-system-service=true \ -Dsystemd-user-service=false \ -Dsystemd-system-unit-dir=/usr/lib/systemd/system \ -Dtests=false" post_makeinstall_target() { # connect to the system bus sed '/^\[Service\]/a Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket' -i ${INSTALL}/usr/lib/systemd/system/wireplumber.service # ref https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/0da29f38181e391160fa8702623050b8544ec775 cat > ${INSTALL}/usr/share/wireplumber/main.lua.d/89-disable-session-dbus-dependent-features.lua << EOF alsa_monitor.properties["alsa.reserve"] = false default_access.properties["enable-flatpak-portal"] = false EOF cat > ${INSTALL}/usr/share/wireplumber/main.lua.d/89-disable-v4l2.lua << EOF v4l2_monitor.enabled = false EOF cat > ${INSTALL}/usr/share/wireplumber/bluetooth.lua.d/89-disable-session-dbus-dependent-features.lua << EOF bluez_monitor.properties["with-logind"] = false EOF cat > ${INSTALL}/usr/share/wireplumber/bluetooth.lua.d/89-disable-bluez-hfphsp-backend.lua << EOF bluez_monitor.properties["bluez5.hfphsp-backend"] = "none" EOF } post_install() { enable_service wireplumber.service } ================================================ FILE: packages/compress/7-zip/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2023-present Team LibreELEC (https://libreelec.tv) PKG_NAME="7-zip" PKG_VERSION="23.01" PKG_SHA256="356071007360e5a1824d9904993e8b2480b51b570e8c9faf7c0f58ebe4bf9f74" PKG_LICENSE="7-Zip" PKG_SITE="https://www.7-zip.org" PKG_URL="https://www.7-zip.org/a/7z${PKG_VERSION/./}-src.tar.xz" PKG_DEPENDS_HOST="ccache:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="7-Zip is a file archiver with a high compression ratio" PKG_TAR_STRIP_COMPONENTS="--strip-components=0" PKG_TOOLCHAIN="manual" pre_build_host() { rm -fr ${PKG_BUILD}/.${HOST_NAME} mkdir -p ${PKG_BUILD}/.${HOST_NAME} cp -RP ${PKG_BUILD}/* ${PKG_BUILD}/.${HOST_NAME} } make_host() { # compile without 7-Zip's assembler code (not required in toolchain) make CXX=${CXX} CC=${CC} -f makefile.gcc -C ${PKG_BUILD}/.${HOST_NAME}/CPP/7zip/Bundles/Alone } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp ${PKG_BUILD}/.${HOST_NAME}/CPP/7zip/Bundles/Alone/_o/7za ${TOOLCHAIN}/bin } pre_build_target() { rm -fr ${PKG_BUILD}/.${TARGET_NAME} mkdir -p ${PKG_BUILD}/.${TARGET_NAME} cp -RP ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME} } make_target() { # arm (arm32) does not have an assembler code option for 7-Zip # dont use x86_64 ../../cmpl_gcc_x64.mak file to build 7-Zip's assembler code (as asmc is not available) if [ "${TARGET_ARCH}" = "aarch64" ]; then make CXX=${CXX} CC=${CC} -f ../../cmpl_gcc_arm64.mak -C ${PKG_BUILD}/.${TARGET_NAME}/CPP/7zip/Bundles/Alone2 else make CXX=${CXX} CC=${CC} -f makefile.gcc -C ${PKG_BUILD}/.${TARGET_NAME}/CPP/7zip/Bundles/Alone2 fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin if [ "${TARGET_ARCH}" = "aarch64" ]; then cp -p ${PKG_BUILD}/.${TARGET_NAME}/CPP/7zip/Bundles/Alone2/b/g_arm64/7zz ${INSTALL}/usr/bin else cp -p ${PKG_BUILD}/.${TARGET_NAME}/CPP/7zip/Bundles/Alone2/_o/7zz ${INSTALL}/usr/bin fi } ================================================ FILE: packages/compress/bzip2/package.mk ================================================ # 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) PKG_NAME="bzip2" PKG_VERSION="1.0.8" PKG_SHA256="ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269" PKG_LICENSE="GPL" PKG_SITE="https://sourceware.org/bzip2/" PKG_URL="https://sourceware.org/pub/bzip2/bzip2-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="ccache:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A high-quality bzip2 data compressor." PKG_BUILD_FLAGS="+pic +pic:host" pre_build_host() { mkdir -p ${PKG_BUILD}/.${HOST_NAME} cp -r ${PKG_BUILD}/* ${PKG_BUILD}/.${HOST_NAME} } make_host() { cd ${PKG_BUILD}/.${HOST_NAME} make -f Makefile-libbz2_so CC=${HOST_CC} CFLAGS="${CFLAGS}" } makeinstall_host() { make install PREFIX=${TOOLCHAIN} } pre_build_target() { mkdir -p ${PKG_BUILD}/.${TARGET_NAME} cp -r ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME} } pre_make_target() { cd ${PKG_BUILD}/.${TARGET_NAME} sed -e "s,ln -s (lib.*),ln -snf \$${1}; ln -snf libbz2.so.${PKG_VERSION} libbz2.so,g" -i Makefile-libbz2_so } make_target() { make -f Makefile-libbz2_so CC=${CC} CFLAGS="${CFLAGS}" } post_make_target() { ln -snf libbz2.so.1.0 libbz2.so } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/include cp bzlib.h ${SYSROOT_PREFIX}/usr/include mkdir -p ${SYSROOT_PREFIX}/usr/lib cp -P libbz2.so* ${SYSROOT_PREFIX}/usr/lib mkdir -p ${INSTALL}/usr/lib cp -P libbz2.so* ${INSTALL}/usr/lib } ================================================ FILE: packages/compress/bzip2/patches/bzip2-1.0.8-cflags.patch ================================================ --- bzip2-1.0.8/Makefile-libbz2_so.orig 2019-07-28 09:43:16.597589341 +0200 +++ bzip2-1.0.8/Makefile-libbz2_so 2019-07-28 09:53:41.142160730 +0200 @@ -35,7 +35,7 @@ bzlib.o all: $(OBJS) - $(CC) -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.8 $(OBJS) + $(CC) $(CFLAGS) -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.8 $(OBJS) $(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.so.1.0.8 rm -f libbz2.so.1.0 ln -s libbz2.so.1.0.8 libbz2.so.1.0 ================================================ FILE: packages/compress/libarchive/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libarchive" PKG_VERSION="3.6.2" PKG_SHA256="9e2c1b80d5fbe59b61308fdfab6c79b5021d7ff4ff2489fb12daf0a96a83551d" PKG_LICENSE="GPL" PKG_SITE="https://www.libarchive.org" PKG_URL="https://www.libarchive.org/downloads/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_SHORTDESC="A multi-format archive and compression library." PKG_CMAKE_OPTS_TARGET="-DCMAKE_POSITION_INDEPENDENT_CODE=1 \ -DENABLE_EXPAT=0 \ -DENABLE_ICONV=0 \ -DENABLE_LIBXML2=0 \ -DENABLE_LZO=1 \ -DENABLE_TEST=0 \ -DENABLE_COVERAGE=0 \ -DENABLE_WERROR=0" post_makeinstall_target() { rm -rf ${INSTALL} # delete the shared library as we only want static rm ${SYSROOT_PREFIX}/usr/lib/libarchive.so* } ================================================ FILE: packages/compress/lz4/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="lz4" PKG_VERSION="1.9.4" PKG_SHA256="0b0e3aa07c8c063ddf40b082bdf7e37a1562bda40a0ff5272957f3e987e0e54b" PKG_LICENSE="GPL" PKG_SITE="https://github.com/lz4/lz4" PKG_URL="https://github.com/lz4/lz4/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="lz4 data compressor/decompressor" configure_package() { PKG_CMAKE_SCRIPT="${PKG_BUILD}/build/cmake/CMakeLists.txt" PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=0 -DCMAKE_POSITION_INDEPENDENT_CODE=0" } post_makeinstall_target() { rm -rf ${INSTALL} } ================================================ FILE: packages/compress/lzo/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="lzo" PKG_VERSION="2.10" PKG_SHA256="c0f892943208266f9b6543b3ae308fab6284c5c90e627931446fb49b4221a072" PKG_LICENSE="GPL" PKG_SITE="http://www.oberhumer.com/opensource/lzo" PKG_URL="http://www.oberhumer.com/opensource/lzo/download/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A data compression library which is suitable for data de-/compression." PKG_BUILD_FLAGS="+pic" PKG_CMAKE_OPTS_HOST="-DENABLE_SHARED=OFF -DENABLE_STATIC=ON" PKG_CMAKE_OPTS_TARGET="-DENABLE_SHARED=OFF -DENABLE_STATIC=ON" post_makeinstall_target() { rm -rf ${INSTALL}/usr/libexec } ================================================ FILE: packages/compress/p7zip/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="p7zip" PKG_VERSION="16.02" PKG_SHA256="5eb20ac0e2944f6cb9c2d51dd6c4518941c185347d4089ea89087ffdd6e2341f" PKG_LICENSE="GPL" PKG_SITE="http://p7zip.sourceforge.net/" PKG_URL="http://downloads.sourceforge.net/project/p7zip/p7zip/${PKG_VERSION}/p7zip_${PKG_VERSION}_src_all.tar.bz2" PKG_DEPENDS_HOST="ccache:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="p7zip is a port of 7za.exe for POSIX systems like Unix." PKG_TOOLCHAIN="manual" pre_build_host() { rm -fr ${PKG_BUILD}/.${HOST_NAME} mkdir -p ${PKG_BUILD}/.${HOST_NAME} cp -RP ${PKG_BUILD}/* ${PKG_BUILD}/.${HOST_NAME} } make_host() { make CXX=${CXX} CC=${CC} -C ${PKG_BUILD}/.${HOST_NAME} 7za } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp ${PKG_BUILD}/.${HOST_NAME}/bin/7za ${TOOLCHAIN}/bin } pre_build_target() { rm -fr ${PKG_BUILD}/.${TARGET_NAME} mkdir -p ${PKG_BUILD}/.${TARGET_NAME} cp -RP ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME} } make_target() { make CXX=${CXX} CC=${CC} -C ${PKG_BUILD}/.${TARGET_NAME} 7z 7za 7zr } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -p ${PKG_BUILD}/.${TARGET_NAME}/bin/7z.so ${INSTALL}/usr/bin cp -pr ${PKG_BUILD}/.${TARGET_NAME}/bin/Codecs ${INSTALL}/usr/bin cp -p ${PKG_BUILD}/.${TARGET_NAME}/bin/7z ${INSTALL}/usr/bin cp -p ${PKG_BUILD}/.${TARGET_NAME}/bin/7za ${INSTALL}/usr/bin cp -p ${PKG_BUILD}/.${TARGET_NAME}/bin/7zr ${INSTALL}/usr/bin } ================================================ FILE: packages/compress/p7zip/patches/p7zip-0100-CVE-2016-9296.patch ================================================ --- ./CPP/7zip/Archive/7z/7zIn.cpp.orig 2016-11-21 01:42:29.460901230 +0000 +++ ./CPP/7zip/Archive/7z/7zIn.cpp 2016-11-21 01:42:57.481197725 +0000 @@ -1097,7 +1097,8 @@ HRESULT CInArchive::ReadAndDecodePackedS if (CrcCalc(data, unpackSize) != folders.FolderCRCs.Vals[i]) ThrowIncorrect(); } - HeadersSize += folders.PackPositions[folders.NumPackStreams]; + if (folders.PackPositions) + HeadersSize += folders.PackPositions[folders.NumPackStreams]; return S_OK; } ================================================ FILE: packages/compress/p7zip/patches/p7zip-0200-CVE-2017-17969.patch ================================================ From 79bca880ce7bcf07216c45f93afea545e0344418 Mon Sep 17 00:00:00 2001 From: aone Date: Mon, 5 Feb 2018 13:01:09 +0100 Subject: [PATCH] Security fix CVE-2017-17969 --- CPP/7zip/Compress/ShrinkDecoder.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CPP/7zip/Compress/ShrinkDecoder.cpp b/CPP/7zip/Compress/ShrinkDecoder.cpp index 80b7e67..5bb0559 100644 --- a/CPP/7zip/Compress/ShrinkDecoder.cpp +++ b/CPP/7zip/Compress/ShrinkDecoder.cpp @@ -121,7 +121,12 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream * { _stack[i++] = _suffixes[cur]; cur = _parents[cur]; + if (cur >= kNumItems || i >= kNumItems) + break; } + + if (cur >= kNumItems || i >= kNumItems) + break; _stack[i++] = (Byte)cur; lastChar2 = (Byte)cur; ================================================ FILE: packages/compress/p7zip/patches/p7zip-0300-CVE-2018-5996.patch ================================================ From: Robert Luberda Date: Sun, 28 Jan 2018 23:47:40 +0100 Subject: CVE-2018-5996 Hopefully fix Memory Corruptions via RAR PPMd (CVE-2018-5996) by applying a few changes from 7Zip 18.00-beta. Bug-Debian: https://bugs.debian.org/#888314 --- CPP/7zip/Compress/Rar1Decoder.cpp | 13 +++++++++---- CPP/7zip/Compress/Rar1Decoder.h | 1 + CPP/7zip/Compress/Rar2Decoder.cpp | 10 +++++++++- CPP/7zip/Compress/Rar2Decoder.h | 1 + CPP/7zip/Compress/Rar3Decoder.cpp | 23 ++++++++++++++++++++--- CPP/7zip/Compress/Rar3Decoder.h | 2 ++ 6 files changed, 42 insertions(+), 8 deletions(-) diff --git a/CPP/7zip/Compress/Rar1Decoder.cpp b/CPP/7zip/Compress/Rar1Decoder.cpp index 1aaedcc..68030c7 100644 --- a/CPP/7zip/Compress/Rar1Decoder.cpp +++ b/CPP/7zip/Compress/Rar1Decoder.cpp @@ -29,7 +29,7 @@ public: }; */ -CDecoder::CDecoder(): m_IsSolid(false) { } +CDecoder::CDecoder(): m_IsSolid(false), _errorMode(false) { } void CDecoder::InitStructures() { @@ -406,9 +406,14 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream * InitData(); if (!m_IsSolid) { + _errorMode = false; InitStructures(); InitHuff(); } + + if (_errorMode) + return S_FALSE; + if (m_UnpackSize > 0) { GetFlagsBuf(); @@ -477,9 +482,9 @@ STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) { try { return CodeReal(inStream, outStream, inSize, outSize, progress); } - catch(const CInBufferException &e) { return e.ErrorCode; } - catch(const CLzOutWindowException &e) { return e.ErrorCode; } - catch(...) { return S_FALSE; } + catch(const CInBufferException &e) { _errorMode = true; return e.ErrorCode; } + catch(const CLzOutWindowException &e) { _errorMode = true; return e.ErrorCode; } + catch(...) { _errorMode = true; return S_FALSE; } } STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size) diff --git a/CPP/7zip/Compress/Rar1Decoder.h b/CPP/7zip/Compress/Rar1Decoder.h index 630f089..01b606b 100644 --- a/CPP/7zip/Compress/Rar1Decoder.h +++ b/CPP/7zip/Compress/Rar1Decoder.h @@ -39,6 +39,7 @@ public: Int64 m_UnpackSize; bool m_IsSolid; + bool _errorMode; UInt32 ReadBits(int numBits); HRESULT CopyBlock(UInt32 distance, UInt32 len); diff --git a/CPP/7zip/Compress/Rar2Decoder.cpp b/CPP/7zip/Compress/Rar2Decoder.cpp index b3f2b4b..0580c8d 100644 --- a/CPP/7zip/Compress/Rar2Decoder.cpp +++ b/CPP/7zip/Compress/Rar2Decoder.cpp @@ -80,7 +80,8 @@ static const UInt32 kHistorySize = 1 << 20; static const UInt32 kWindowReservSize = (1 << 22) + 256; CDecoder::CDecoder(): - m_IsSolid(false) + m_IsSolid(false), + m_TablesOK(false) { } @@ -100,6 +101,8 @@ UInt32 CDecoder::ReadBits(unsigned numBits) { return m_InBitStream.ReadBits(numB bool CDecoder::ReadTables(void) { + m_TablesOK = false; + Byte levelLevels[kLevelTableSize]; Byte newLevels[kMaxTableSize]; m_AudioMode = (ReadBits(1) == 1); @@ -170,6 +173,8 @@ bool CDecoder::ReadTables(void) } memcpy(m_LastLevels, newLevels, kMaxTableSize); + m_TablesOK = true; + return true; } @@ -344,6 +349,9 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream * return S_FALSE; } + if (!m_TablesOK) + return S_FALSE; + UInt64 startPos = m_OutWindowStream.GetProcessedSize(); while (pos < unPackSize) { diff --git a/CPP/7zip/Compress/Rar2Decoder.h b/CPP/7zip/Compress/Rar2Decoder.h index 3a0535c..0e9005f 100644 --- a/CPP/7zip/Compress/Rar2Decoder.h +++ b/CPP/7zip/Compress/Rar2Decoder.h @@ -139,6 +139,7 @@ class CDecoder : UInt64 m_PackSize; bool m_IsSolid; + bool m_TablesOK; void InitStructures(); UInt32 ReadBits(unsigned numBits); diff --git a/CPP/7zip/Compress/Rar3Decoder.cpp b/CPP/7zip/Compress/Rar3Decoder.cpp index 3bf2513..6cb8a6a 100644 --- a/CPP/7zip/Compress/Rar3Decoder.cpp +++ b/CPP/7zip/Compress/Rar3Decoder.cpp @@ -92,7 +92,8 @@ CDecoder::CDecoder(): _writtenFileSize(0), _vmData(0), _vmCode(0), - m_IsSolid(false) + m_IsSolid(false), + _errorMode(false) { Ppmd7_Construct(&_ppmd); } @@ -545,6 +546,9 @@ HRESULT CDecoder::ReadTables(bool &keepDecompressing) return InitPPM(); } + TablesRead = false; + TablesOK = false; + _lzMode = true; PrevAlignBits = 0; PrevAlignCount = 0; @@ -606,6 +610,9 @@ HRESULT CDecoder::ReadTables(bool &keepDecompressing) } } } + if (InputEofError()) + return S_FALSE; + TablesRead = true; // original code has check here: @@ -623,6 +630,9 @@ HRESULT CDecoder::ReadTables(bool &keepDecompressing) RIF(m_LenDecoder.Build(&newLevels[kMainTableSize + kDistTableSize + kAlignTableSize])); memcpy(m_LastLevels, newLevels, kTablesSizesSum); + + TablesOK = true; + return S_OK; } @@ -824,7 +834,12 @@ HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress) PpmEscChar = 2; PpmError = true; InitFilters(); + _errorMode = false; } + + if (_errorMode) + return S_FALSE; + if (!m_IsSolid || !TablesRead) { bool keepDecompressing; @@ -838,6 +853,8 @@ HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress) bool keepDecompressing; if (_lzMode) { + if (!TablesOK) + return S_FALSE; RINOK(DecodeLZ(keepDecompressing)) } else @@ -901,8 +918,8 @@ STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream _unpackSize = outSize ? *outSize : (UInt64)(Int64)-1; return CodeReal(progress); } - catch(const CInBufferException &e) { return e.ErrorCode; } - catch(...) { return S_FALSE; } + catch(const CInBufferException &e) { _errorMode = true; return e.ErrorCode; } + catch(...) { _errorMode = true; return S_FALSE; } // CNewException is possible here. But probably CNewException is caused // by error in data stream. } diff --git a/CPP/7zip/Compress/Rar3Decoder.h b/CPP/7zip/Compress/Rar3Decoder.h index c130cec..2f72d7d 100644 --- a/CPP/7zip/Compress/Rar3Decoder.h +++ b/CPP/7zip/Compress/Rar3Decoder.h @@ -192,6 +192,7 @@ class CDecoder: UInt32 _lastFilter; bool m_IsSolid; + bool _errorMode; bool _lzMode; bool _unsupportedFilter; @@ -200,6 +201,7 @@ class CDecoder: UInt32 PrevAlignCount; bool TablesRead; + bool TablesOK; CPpmd7 _ppmd; int PpmEscChar; ================================================ FILE: packages/compress/p7zip/patches/p7zip-0400-CVE-2018-10115.patch ================================================ From: Robert Luberda Date: Tue, 29 May 2018 23:59:09 +0200 Subject: Fix CVE-2018-10115 Apply "patch" taken from https://landave.io/files/patch_7zip_CVE-2018-10115.txt Bugs-Debian: https://bugs.debian.org/897674 --- CPP/7zip/Compress/Rar1Decoder.cpp | 16 +++++++++++----- CPP/7zip/Compress/Rar1Decoder.h | 3 ++- CPP/7zip/Compress/Rar2Decoder.cpp | 17 +++++++++++++---- CPP/7zip/Compress/Rar2Decoder.h | 3 ++- CPP/7zip/Compress/Rar3Decoder.cpp | 19 +++++++++++++++---- CPP/7zip/Compress/Rar3Decoder.h | 3 ++- CPP/7zip/Compress/Rar5Decoder.cpp | 8 ++++++++ CPP/7zip/Compress/Rar5Decoder.h | 1 + 8 files changed, 54 insertions(+), 16 deletions(-) diff --git a/CPP/7zip/Compress/Rar1Decoder.cpp b/CPP/7zip/Compress/Rar1Decoder.cpp index 68030c7..8c890c8 100644 --- a/CPP/7zip/Compress/Rar1Decoder.cpp +++ b/CPP/7zip/Compress/Rar1Decoder.cpp @@ -29,7 +29,7 @@ public: }; */ -CDecoder::CDecoder(): m_IsSolid(false), _errorMode(false) { } +CDecoder::CDecoder(): _isSolid(false), _solidAllowed(false), _errorMode(false) { } void CDecoder::InitStructures() { @@ -345,7 +345,7 @@ void CDecoder::GetFlagsBuf() void CDecoder::InitData() { - if (!m_IsSolid) + if (!_isSolid) { AvrPlcB = AvrLn1 = AvrLn2 = AvrLn3 = NumHuf = Buf60 = 0; AvrPlc = 0x3500; @@ -391,6 +391,11 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream * if (inSize == NULL || outSize == NULL) return E_INVALIDARG; + if (_isSolid && !_solidAllowed) + return S_FALSE; + + _solidAllowed = false; + if (!m_OutWindowStream.Create(kHistorySize)) return E_OUTOFMEMORY; if (!m_InBitStream.Create(1 << 20)) @@ -398,13 +403,13 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream * m_UnpackSize = (Int64)*outSize; m_OutWindowStream.SetStream(outStream); - m_OutWindowStream.Init(m_IsSolid); + m_OutWindowStream.Init(_isSolid); m_InBitStream.SetStream(inStream); m_InBitStream.Init(); // CCoderReleaser coderReleaser(this); InitData(); - if (!m_IsSolid) + if (!_isSolid) { _errorMode = false; InitStructures(); @@ -475,6 +480,7 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream * } if (m_UnpackSize < 0) return S_FALSE; + _solidAllowed = true; return m_OutWindowStream.Flush(); } @@ -491,7 +497,7 @@ STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size) { if (size < 1) return E_INVALIDARG; - m_IsSolid = ((data[0] & 1) != 0); + _isSolid = ((data[0] & 1) != 0); return S_OK; } diff --git a/CPP/7zip/Compress/Rar1Decoder.h b/CPP/7zip/Compress/Rar1Decoder.h index 01b606b..8abb3a3 100644 --- a/CPP/7zip/Compress/Rar1Decoder.h +++ b/CPP/7zip/Compress/Rar1Decoder.h @@ -38,7 +38,8 @@ public: UInt32 LastLength; Int64 m_UnpackSize; - bool m_IsSolid; + bool _isSolid; + bool _solidAllowed; bool _errorMode; UInt32 ReadBits(int numBits); diff --git a/CPP/7zip/Compress/Rar2Decoder.cpp b/CPP/7zip/Compress/Rar2Decoder.cpp index 0580c8d..be8d842 100644 --- a/CPP/7zip/Compress/Rar2Decoder.cpp +++ b/CPP/7zip/Compress/Rar2Decoder.cpp @@ -80,7 +80,8 @@ static const UInt32 kHistorySize = 1 << 20; static const UInt32 kWindowReservSize = (1 << 22) + 256; CDecoder::CDecoder(): - m_IsSolid(false), + _isSolid(false), + _solidAllowed(false), m_TablesOK(false) { } @@ -320,6 +321,10 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream * if (inSize == NULL || outSize == NULL) return E_INVALIDARG; + if (_isSolid && !_solidAllowed) + return S_FALSE; + _solidAllowed = false; + if (!m_OutWindowStream.Create(kHistorySize)) return E_OUTOFMEMORY; if (!m_InBitStream.Create(1 << 20)) @@ -330,12 +335,12 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream * UInt64 pos = 0, unPackSize = *outSize; m_OutWindowStream.SetStream(outStream); - m_OutWindowStream.Init(m_IsSolid); + m_OutWindowStream.Init(_isSolid); m_InBitStream.SetStream(inStream); m_InBitStream.Init(); // CCoderReleaser coderReleaser(this); - if (!m_IsSolid) + if (!_isSolid) { InitStructures(); if (unPackSize == 0) @@ -343,6 +348,7 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream * if (m_InBitStream.GetProcessedSize() + 2 <= m_PackSize) // test it: probably incorrect; if (!ReadTables()) return S_FALSE; + _solidAllowed = true; return S_OK; } if (!ReadTables()) @@ -386,6 +392,9 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream * if (!ReadLastTables()) return S_FALSE; + + _solidAllowed = true; + return m_OutWindowStream.Flush(); } @@ -402,7 +411,7 @@ STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size) { if (size < 1) return E_INVALIDARG; - m_IsSolid = ((data[0] & 1) != 0); + _isSolid = ((data[0] & 1) != 0); return S_OK; } diff --git a/CPP/7zip/Compress/Rar2Decoder.h b/CPP/7zip/Compress/Rar2Decoder.h index 0e9005f..370bce2 100644 --- a/CPP/7zip/Compress/Rar2Decoder.h +++ b/CPP/7zip/Compress/Rar2Decoder.h @@ -138,7 +138,8 @@ class CDecoder : Byte m_LastLevels[kMaxTableSize]; UInt64 m_PackSize; - bool m_IsSolid; + bool _isSolid; + bool _solidAllowed; bool m_TablesOK; void InitStructures(); diff --git a/CPP/7zip/Compress/Rar3Decoder.cpp b/CPP/7zip/Compress/Rar3Decoder.cpp index 6cb8a6a..7b85833 100644 --- a/CPP/7zip/Compress/Rar3Decoder.cpp +++ b/CPP/7zip/Compress/Rar3Decoder.cpp @@ -92,7 +92,8 @@ CDecoder::CDecoder(): _writtenFileSize(0), _vmData(0), _vmCode(0), - m_IsSolid(false), + _isSolid(false), + _solidAllowed(false), _errorMode(false) { Ppmd7_Construct(&_ppmd); @@ -821,7 +822,7 @@ HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress) { _writtenFileSize = 0; _unsupportedFilter = false; - if (!m_IsSolid) + if (!_isSolid) { _lzSize = 0; _winPos = 0; @@ -840,12 +841,15 @@ HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress) if (_errorMode) return S_FALSE; - if (!m_IsSolid || !TablesRead) + if (!_isSolid || !TablesRead) { bool keepDecompressing; RINOK(ReadTables(keepDecompressing)); if (!keepDecompressing) + { + _solidAllowed = true; return S_OK; + } } for (;;) @@ -870,6 +874,9 @@ HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress) if (!keepDecompressing) break; } + + _solidAllowed = true; + RINOK(WriteBuf()); UInt64 packSize = m_InBitStream.BitDecoder.GetProcessedSize(); RINOK(progress->SetRatioInfo(&packSize, &_writtenFileSize)); @@ -890,6 +897,10 @@ STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream if (!inSize) return E_INVALIDARG; + if (_isSolid && !_solidAllowed) + return S_FALSE; + _solidAllowed = false; + if (!_vmData) { _vmData = (Byte *)::MidAlloc(kVmDataSizeMax + kVmCodeSizeMax); @@ -928,7 +939,7 @@ STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size) { if (size < 1) return E_INVALIDARG; - m_IsSolid = ((data[0] & 1) != 0); + _isSolid = ((data[0] & 1) != 0); return S_OK; } diff --git a/CPP/7zip/Compress/Rar3Decoder.h b/CPP/7zip/Compress/Rar3Decoder.h index 2f72d7d..32c8943 100644 --- a/CPP/7zip/Compress/Rar3Decoder.h +++ b/CPP/7zip/Compress/Rar3Decoder.h @@ -191,7 +191,8 @@ class CDecoder: CRecordVector _tempFilters; UInt32 _lastFilter; - bool m_IsSolid; + bool _isSolid; + bool _solidAllowed; bool _errorMode; bool _lzMode; diff --git a/CPP/7zip/Compress/Rar5Decoder.cpp b/CPP/7zip/Compress/Rar5Decoder.cpp index dc8830f..a826d5a 100644 --- a/CPP/7zip/Compress/Rar5Decoder.cpp +++ b/CPP/7zip/Compress/Rar5Decoder.cpp @@ -72,6 +72,7 @@ CDecoder::CDecoder(): _writtenFileSize(0), _dictSizeLog(0), _isSolid(false), + _solidAllowed(false), _wasInit(false), _inputBuf(NULL) { @@ -801,7 +802,10 @@ HRESULT CDecoder::CodeReal() */ if (res == S_OK) + { + _solidAllowed = true; res = res2; + } if (res == S_OK && _unpackSize_Defined && _writtenFileSize != _unpackSize) return S_FALSE; @@ -821,6 +825,10 @@ STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream { try { + if (_isSolid && !_solidAllowed) + return S_FALSE; + _solidAllowed = false; + if (_dictSizeLog >= sizeof(size_t) * 8) return E_NOTIMPL; diff --git a/CPP/7zip/Compress/Rar5Decoder.h b/CPP/7zip/Compress/Rar5Decoder.h index b0a4dd1..3db5018 100644 --- a/CPP/7zip/Compress/Rar5Decoder.h +++ b/CPP/7zip/Compress/Rar5Decoder.h @@ -271,6 +271,7 @@ class CDecoder: Byte _dictSizeLog; bool _tableWasFilled; bool _isSolid; + bool _solidAllowed; bool _wasInit; UInt32 _reps[kNumReps]; ================================================ FILE: packages/compress/p7zip/patches/p7zip-0500-gcc10-build-fix.patch ================================================ diff -Nrup a/CPP/Windows/ErrorMsg.cpp b/CPP/Windows/ErrorMsg.cpp --- a/CPP/Windows/ErrorMsg.cpp 2015-01-18 11:20:28.000000000 -0700 +++ b/CPP/Windows/ErrorMsg.cpp 2019-09-24 13:01:18.887289152 -0600 @@ -14,14 +14,14 @@ UString MyFormatMessage(DWORD errorCode) AString msg; switch(errorCode) { - case ERROR_NO_MORE_FILES : txt = "No more files"; break ; - case E_NOTIMPL : txt = "E_NOTIMPL"; break ; - case E_NOINTERFACE : txt = "E_NOINTERFACE"; break ; - case E_ABORT : txt = "E_ABORT"; break ; - case E_FAIL : txt = "E_FAIL"; break ; - case STG_E_INVALIDFUNCTION : txt = "STG_E_INVALIDFUNCTION"; break ; - case E_OUTOFMEMORY : txt = "E_OUTOFMEMORY"; break ; - case E_INVALIDARG : txt = "E_INVALIDARG"; break ; + case unsigned (ERROR_NO_MORE_FILES) : txt = "No more files"; break ; + case unsigned (E_NOTIMPL) : txt = "E_NOTIMPL"; break ; + case unsigned (E_NOINTERFACE) : txt = "E_NOINTERFACE"; break ; + case unsigned (E_ABORT) : txt = "E_ABORT"; break ; + case unsigned (E_FAIL) : txt = "E_FAIL"; break ; + case unsigned (STG_E_INVALIDFUNCTION) : txt = "STG_E_INVALIDFUNCTION"; break ; + case unsigned (E_OUTOFMEMORY) : txt = "E_OUTOFMEMORY"; break ; + case unsigned (E_INVALIDARG) : txt = "E_INVALIDARG"; break ; case ERROR_DIRECTORY : txt = "Error Directory"; break ; default: txt = strerror(errorCode); ================================================ FILE: packages/compress/p7zip/patches/p7zip-0501-change-numMethods-from-bool-to-unsigned.patch ================================================ From 0820ef4b9238c1e39ae5bda32cc08cce3fd3ce89 Mon Sep 17 00:00:00 2001 From: Nisha Parrakat Date: Wed, 26 May 2021 19:59:28 +0000 Subject: [PATCH] fixes the below error | ../../../../CPP/7zip/Archive/Wim/WimHandler.cpp: In member function 'virtual LONG NArchive::NWim::CHandler::GetArchiveProperty(PROPID, PROPVARIANT*)': | ../../../../CPP/7zip/Archive/Wim/WimHandler.cpp:308:11: error: use of an operand of type 'bool' in 'operator++' is forbidden in C++17 | 308 | numMethods++; | | ^~~~~~~~~~ | ../../../../CPP/7zip/Archive/Wim/WimHandler.cpp:318:9: error: use of an operand of type 'bool' in 'operator++' is forbidden in C++17 | 318 | numMethods++; use unsigned instead of bool Signed-off-by: Nisha Parrakat Upstream-Status: Pending --- CPP/7zip/Archive/Wim/WimHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CPP/7zip/Archive/Wim/WimHandler.cpp b/CPP/7zip/Archive/Wim/WimHandler.cpp index 27d3298..4ff5cfe 100644 --- a/CPP/7zip/Archive/Wim/WimHandler.cpp +++ b/CPP/7zip/Archive/Wim/WimHandler.cpp @@ -298,7 +298,7 @@ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) AString res; - bool numMethods = 0; + unsigned numMethods = 0; for (unsigned i = 0; i < ARRAY_SIZE(k_Methods); i++) { if (methodMask & ((UInt32)1 << i)) ================================================ FILE: packages/compress/pigz/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pigz" PKG_VERSION="2.7" PKG_SHA256="d2045087dae5e9482158f1f1c0f21c7d3de6f7cdc7cc5848bdabda544e69aa58" PKG_LICENSE="Other" PKG_SITE="https://zlib.net/pigz/" PKG_URL="https://github.com/madler/pigz/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="make:host zlib:host" PKG_LONGDESC="a parallel implementation of the gzip file compressor" PKG_TOOLCHAIN="manual" make_host() { make CPPFLAGS="${CPPFLAGS} -I${TOOLCHAIN}/include" \ LDFLAGS="${LDFLAGS}" \ CXX="${CXX}" \ CC="${CC}" \ pigz } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp pigz ${TOOLCHAIN}/bin } ================================================ FILE: packages/compress/xz/package.mk ================================================ # 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) PKG_NAME="xz" PKG_VERSION="5.4.1" PKG_SHA256="5d9827aa1875b21c288f78864bb26d2650b436ea8d2cad364e4921eb6266a5a5" PKG_LICENSE="GPL" PKG_SITE="https://tukaani.org/xz/" PKG_URL="https://tukaani.org/xz/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="ccache:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A free general-purpose data compression software with high compression ratio." PKG_BUILD_FLAGS="+pic +pic:host" PKG_TOOLCHAIN="configure" # never build shared or k0p happens when building # on fedora due to host selinux/liblzma PKG_CONFIGURE_OPTS_HOST="--disable-shared --enable-static \ --disable-lzmadec \ --disable-lzmainfo \ --enable-lzma-links \ --disable-nls \ --disable-scripts \ --enable-symbol-versions=no" PKG_CONFIGURE_OPTS_TARGET="--disable-shared --enable-static \ --enable-symbol-versions=no" post_makeinstall_target() { rm -rf ${INSTALL} } ================================================ FILE: packages/compress/xz/patches/xz-01-init-uninitialized-variables.patch ================================================ From 5cd389f1fe1fe095cdf555194df875ee3ab445cf Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Sun, 26 Nov 2017 22:21:15 +0000 Subject: [PATCH] uninitialized variables build error --- src/liblzma/lzma/lzma_encoder.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/liblzma/lzma/lzma_encoder.c b/src/liblzma/lzma/lzma_encoder.c index ba9ce69..08e8c87 100644 --- a/src/liblzma/lzma/lzma_encoder.c +++ b/src/liblzma/lzma/lzma_encoder.c @@ -359,8 +359,8 @@ lzma_lzma_encode(lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf, // - UINT32_MAX: not a match but a literal // Value ranges for len: // - [MATCH_LEN_MIN, MATCH_LEN_MAX] - uint32_t len; - uint32_t back; + uint32_t len = 0; + uint32_t back = 0; if (coder->fast_mode) lzma_lzma_optimum_fast(coder, mf, &back, &len); -- 2.14.1 ================================================ FILE: packages/compress/zip/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="zip" PKG_VERSION="3.0" PKG_SHA256="f0e8bb1f9b7eb0b01285495a2699df3a4b766784c1765a8f1aeedf63c0806369" PKG_LICENSE="Info-ZIP" PKG_SITE="http://www.info-zip.org/pub/infozip/" PKG_URL="${SOURCEFORGE_SRC}/infozip/Zip%203.x%20%28latest%29/3.0/${PKG_NAME}${PKG_VERSION/./}.tar.gz" PKG_DEPENDS_TARGET="toolchain bzip2" PKG_LONGDESC="A compression and file packaging utility." PKG_TOOLCHAIN="manual" make_target() { make CC=${CC} CPP=${CPP} RANLIB=${RANLIB} AR=${AR} STRIP=${STRIP} LOCAL_ZIP="${CFLAGS}" \ -f unix/Makefile generic } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp zip ${INSTALL}/usr/bin ${STRIP} ${INSTALL}/usr/bin/zip } ================================================ FILE: packages/compress/zlib/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="zlib" PKG_VERSION="1.2.13" PKG_SHA256="b3a24de97a8fdbc835b9833169501030b8977031bcb54b3b3ac13740f846ab30" PKG_LICENSE="OSS" PKG_SITE="http://www.zlib.net" PKG_URL="https://zlib.net/fossils/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="ccache:host cmake:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A general purpose (ZIP) data compression library." PKG_TOOLCHAIN="cmake-make" PKG_CMAKE_OPTS_HOST="-DINSTALL_PKGCONFIG_DIR=${TOOLCHAIN}/lib/pkgconfig" PKG_CMAKE_OPTS_TARGET="-DINSTALL_PKGCONFIG_DIR=/usr/lib/pkgconfig" ================================================ FILE: packages/compress/zstd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="zstd" PKG_VERSION="1.5.2" PKG_SHA256="3ea06164971edec7caa2045a1932d757c1815858e4c2b68c7ef812647535c23f" PKG_LICENSE="BSD/GPLv2" PKG_SITE="http://www.zstd.net" PKG_URL="https://github.com/facebook/zstd/releases/download/v${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.zst" PKG_DEPENDS_HOST="cmake:host make:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A fast real-time compression algorithm." # Override toolchain as meson and ninja are not built yet # and zstd is a dependency of ccache PKG_TOOLCHAIN="cmake-make" PKG_BUILD_FLAGS="+local-cc" configure_package() { PKG_CMAKE_SCRIPT="${PKG_BUILD}/build/cmake/CMakeLists.txt" } configure_host() { # custom cmake build to override the LOCAL_CC/CXX cp ${CMAKE_CONF} cmake-zstd.conf echo "SET(CMAKE_C_COMPILER $CC)" >> cmake-zstd.conf echo "SET(CMAKE_CXX_COMPILER $CXX)" >> cmake-zstd.conf cmake -DCMAKE_TOOLCHAIN_FILE=cmake-zstd.conf \ -DCMAKE_INSTALL_PREFIX=${TOOLCHAIN} \ -DZSTD_LEGACY_SUPPORT=0 \ -DZSTD_BUILD_PROGRAMS=OFF \ -DZSTD_BUILD_TESTS=OFF \ ${PKG_CMAKE_SCRIPT%/*} } ================================================ FILE: packages/databases/mariadb-connector-c/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mariadb-connector-c" PKG_VERSION="3.3.4" PKG_SHA256="ea6a23850d6a2f6f2e0d9e9fdb7d94fe905a4317f73842272cf121ed25903e1f" PKG_LICENSE="LGPL" PKG_SITE="https://mariadb.org/" PKG_URL="https://github.com/mariadb-corporation/mariadb-connector-c/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain zlib openssl" PKG_LONGDESC="mariadb-connector: library to conntect to mariadb/mysql database server" PKG_BUILD_FLAGS="-gold" PKG_CMAKE_OPTS_TARGET="-DWITH_EXTERNAL_ZLIB=ON -DCLIENT_PLUGIN_DIALOG=STATIC -DCLIENT_PLUGIN_MYSQL_CLEAR_PASSWORD=STATIC -DCLIENT_PLUGIN_MYSQL_OLD_PASSWORD=STATIC -DCLIENT_PLUGIN_REMOTE_IO=OFF " post_makeinstall_target() { # keep modern authentication plugins PLUGINP=${INSTALL}/usr/lib/mariadb/plugin mkdir -p ${INSTALL}/.tmp mv ${PLUGINP}/{caching_sha2_password,client_ed25519,sha256_password}.so ${INSTALL}/.tmp # drop all unneeded rm -rf ${INSTALL}/usr mkdir -p ${PLUGINP} mv ${INSTALL}/.tmp/* ${PLUGINP}/ rmdir ${INSTALL}/.tmp } ================================================ FILE: packages/databases/sqlite/package.mk ================================================ # 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) PKG_NAME="sqlite" PKG_VERSION="3.40.1" PKG_VERSION_SQLITE="${PKG_VERSION/./}00" PKG_SHA256="2c5dea207fa508d765af1ef620b637dcb06572afa6f01f0815bd5bbf864b33d9" PKG_LICENSE="PublicDomain" PKG_SITE="https://www.sqlite.org/" PKG_URL="https://www.sqlite.org/2022/${PKG_NAME}-autoconf-${PKG_VERSION_SQLITE/./0}.tar.gz" PKG_DEPENDS_HOST="ccache:host autoconf:host automake:host" PKG_DEPENDS_TARGET="toolchain ncurses" PKG_LONGDESC="An Embeddable SQL Database Engine." # libsqlite3.a(sqlite3.o): requires dynamic R_X86_64_PC32 reloc against 'sqlite3_stricmp' which may overflow at runtime PKG_BUILD_FLAGS="+pic +pic:host -parallel" PKG_CONFIGURE_OPTS_TARGET="--disable-static \ --enable-shared \ --disable-readline \ --enable-threadsafe \ --enable-dynamic-extensions \ --with-gnu-ld" pre_configure_target() { # sqlite fails to compile with fast-math link time optimization. CFLAGS=$(echo ${CFLAGS} | sed -e "s|-Ofast|-O3|g") CFLAGS=$(echo ${CFLAGS} | sed -e "s|-ffast-math||g") # This option adds additional logic to the ANALYZE command and to the query planner # that can help SQLite to chose a better query plan under certain situations. The # ANALYZE command is enhanced to collect histogram data from each index and store # that data in the sqlite_stat4 table. The query planner will then use the histogram # data to help it make better index choices. CFLAGS+=" -DSQLITE_ENABLE_STAT4" # When this C-preprocessor macro is defined, SQLite includes some additional APIs # that provide convenient access to meta-data about tables and queries. The APIs that # are enabled by this option are: # - sqlite3_column_database_name() # - sqlite3_column_database_name16() # - sqlite3_column_table_name() # - sqlite3_column_table_name16() # - sqlite3_column_origin_name() # - sqlite3_column_origin_name16() # - sqlite3_table_column_metadata() CFLAGS+=" -DSQLITE_ENABLE_COLUMN_METADATA=1" # This macro sets the default limit on the amount of memory that will be used for # memory-mapped I/O for each open database file. If the N is zero, then memory # mapped I/O is disabled by default. This compile-time limit and the # SQLITE_MAX_MMAP_SIZE can be modified at start-time using the # sqlite3_config(SQLITE_CONFIG_MMAP_SIZE) call, or at run-time using the # mmap_size pragma. CFLAGS+=" -DSQLITE_TEMP_STORE=3 -DSQLITE_DEFAULT_MMAP_SIZE=268435456" } ================================================ FILE: packages/databases/sqlite/patches/sqlite-01_map_populate.patch ================================================ diff --git a/sqlite3.c b/sqlite3.c index d0057a6..63b80c7 100644 --- a/sqlite3.c +++ b/sqlite3.c @@ -28278,7 +28278,7 @@ static void unixRemapfile( pNew = osMremap(pOrig, nReuse, nNew, MREMAP_MAYMOVE); zErr = "mremap"; #else - pNew = osMmap(pReq, nNew-nReuse, flags, MAP_SHARED, h, nReuse); + pNew = osMmap(pReq, nNew-nReuse, flags, MAP_SHARED | MAP_POPULATE, h, nReuse); if( pNew!=MAP_FAILED ){ if( pNew!=pReq ){ osMunmap(pNew, nNew - nReuse); @@ -28297,7 +28297,7 @@ static void unixRemapfile( /* If pNew is still NULL, try to create an entirely new mapping. */ if( pNew==0 ){ - pNew = osMmap(0, nNew, flags, MAP_SHARED, h, 0); + pNew = osMmap(0, nNew, flags, MAP_SHARED | MAP_POPULATE, h, 0); } if( pNew==MAP_FAILED ){ ================================================ FILE: packages/debug/edid-decode/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="edid-decode" PKG_VERSION="9ba4e90f3c0705351d32f526653e3e765fa2cf64" # 2022-09-23 PKG_SHA256="8b55a1c09a32c4c39ea0092e1f468f545a535323eb36016e042e0bf156833a1b" PKG_LICENSE="None" PKG_SITE="https://git.linuxtv.org/edid-decode.git/" PKG_URL="https://repo.or.cz/edid-decode.git/snapshot/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Decode EDID data in human-readable format" EDID_SOURCES="calc-gtf-cvt.cpp calc-ovt.cpp \ edid-decode.cpp parse-base-block.cpp parse-cta-block.cpp \ parse-displayid-block.cpp parse-ls-ext-block.cpp \ parse-di-ext-block.cpp parse-vtb-ext-block.cpp" make_target() { echo "${CXX} ${CPPFLAGS} -Wall ${LDFLAGS} -g -DSHA=${PKG_VERSION:0:12} -o edid-decode ${EDID_SOURCES} -lm" ${CXX} ${CPPFLAGS} -Wall ${LDFLAGS} -g -DSHA=${PKG_VERSION:0:12} -o edid-decode ${EDID_SOURCES} -lm } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp edid-decode ${INSTALL}/usr/bin } ================================================ FILE: packages/debug/gdb/package.mk ================================================ # 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) PKG_NAME="gdb" PKG_VERSION="12.1" PKG_SHA256="0e1793bf8f2b54d53f46dea84ccfd446f48f81b297b28c4f7fc017b818d69fed" PKG_LICENSE="GPL" PKG_SITE="http://www.gnu.org/software/gdb/" PKG_URL="https://ftp.gnu.org/gnu/gdb/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain zlib ncurses expat gmp" PKG_DEPENDS_HOST="toolchain:host zlib:host ncurses:host expat:host gmp:host" PKG_LONGDESC="GNU Project debugger, allows you to see what is going on inside another program while it executes." PKG_BUILD_FLAGS="+size" PKG_CONFIGURE_OPTS_COMMON="bash_cv_have_mbstate_t=set \ --disable-shared \ --enable-static \ --with-auto-load-safe-path=/ \ --with-python=no \ --with-guile=no \ --with-mpfr=no \ --with-intel-pt=no \ --with-babeltrace=no \ --with-expat=yes \ --disable-source-highlight \ --disable-nls \ --disable-rpath \ --disable-sim \ --without-x \ --disable-tui \ --disable-libada \ --without-lzma \ --disable-libquadmath \ --disable-libquadmath-support \ --enable-libada \ --enable-libssp \ --disable-werror" PKG_CONFIGURE_OPTS_TARGET="${PKG_CONFIGURE_OPTS_COMMON} \ --with-libexpat-prefix=${SYSROOT_PREFIX}/usr \ --with-libgmp-prefix=${SYSROOT_PREFIX}/usr" PKG_CONFIGURE_OPTS_HOST="${PKG_CONFIGURE_OPTS_COMMON} \ --target=${TARGET_NAME}" pre_configure_target() { CC_FOR_BUILD="${HOST_CC}" CFLAGS_FOR_BUILD="${HOST_CFLAGS}" } makeinstall_target() { make DESTDIR=${INSTALL} install } post_makeinstall_target() { rm -rf ${INSTALL}/usr/share/gdb/python } ================================================ FILE: packages/debug/gdb/patches/0001-gdbserver-ctrl-c-handling.patch ================================================ From 589e7f396af4c8e4a33dcd1b22be481f150b4fc0 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Thu, 29 Nov 2018 18:00:23 -0800 Subject: [PATCH] gdbserver ctrl-c handling This problem was created by the upstream commit 78708b7c8c After applying the commit, it will send SIGINT to the process group(-signal_pid). But if we use gdbserver send SIGINT, and the attached process is not a process group leader, then the "kill (-signal_pid, SIGINT)" returns error and fails to interrupt the attached process. Upstream-Status: Submitted [https://sourceware.org/bugzilla/show_bug.cgi?id=18945] Author: Josh Gao Signed-off-by: Zhixiong Chi Signed-off-by: Khem Raj --- gdbserver/linux-low.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc index 8b8614f6ed4..e71e6667c51 100644 --- a/gdbserver/linux-low.cc +++ b/gdbserver/linux-low.cc @@ -5465,7 +5465,7 @@ linux_process_target::request_interrupt () { /* Send a SIGINT to the process group. This acts just like the user typed a ^C on the controlling terminal. */ - ::kill (-signal_pid, SIGINT); + ::kill (signal_pid, SIGINT); } bool -- 2.25.1 ================================================ FILE: packages/debug/gdb/patches/gdb-001-notex.patch ================================================ --- gdb-7.11.1/missing.orig 2017-01-30 19:01:55.652407184 +0900 +++ gdb-7.11.1/missing 2017-01-30 19:02:53.703405905 +0900 @@ -83,6 +83,9 @@ # If it succeeded, we are done. test $st -eq 0 && exit 0 +# No need for tex monster +test $1 = makeinfo && exit 0 + # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. ================================================ FILE: packages/debug/libunwind/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libunwind" PKG_VERSION="1.6.2" PKG_SHA256="4a6aec666991fb45d0889c44aede8ad6eb108071c3554fcdff671f9c94794976" PKG_LICENSE="GPL" PKG_SITE="http://www.nongnu.org/libunwind/" PKG_URL="http://download.savannah.nongnu.org/releases/libunwind/libunwind-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain zlib" PKG_LONGDESC="library to determine the call-chain of a program" PKG_BUILD_FLAGS="+pic" PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared \ --disable-minidebuginfo \ --disable-documentation \ --disable-tests" makeinstall_target() { make DESTDIR=${SYSROOT_PREFIX} install } ================================================ FILE: packages/debug/libunwind/patches/libunwind-0001-fix-multiple-definition.patch ================================================ From f40db1e2562934fd21485ba7f62e4521945f17e4 Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Mon, 17 Feb 2020 05:52:10 +0000 Subject: [PATCH] fix multiple definition https://lists.nongnu.org/archive/html/libunwind-devel/2017-08/msg00039.html https://github.com/libunwind/libunwind/commit/0e74e583ae18d6852835f327921ee130a5fa3e6f --- include/tdep-arm/ex_tables.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/tdep-arm/ex_tables.h b/include/tdep-arm/ex_tables.h index 9df5e0a..0b5388a 100644 --- a/include/tdep-arm/ex_tables.h +++ b/include/tdep-arm/ex_tables.h @@ -47,6 +47,7 @@ struct arm_exbuf_data #define arm_exidx_extract UNW_OBJ(arm_exidx_extract) #define arm_exidx_decode UNW_OBJ(arm_exidx_decode) #define arm_exidx_apply_cmd UNW_OBJ(arm_exidx_apply_cmd) +#define arm_search_unwind_table UNW_OBJ(arm_search_unwind_table) int arm_exidx_extract (struct dwarf_cursor *c, uint8_t *buf); int arm_exidx_decode (const uint8_t *buf, uint8_t len, struct dwarf_cursor *c); -- 2.7.4 ================================================ FILE: packages/debug/libunwind/patches/libunwind-0002-add-dependant-static-libraries.patch ================================================ --- a/src/unwind/libunwind.pc.in 2020-11-10 16:14:18.000000000 +0000 +++ b/src/unwind/libunwind.pc.in 2021-12-05 08:16:04.467881118 +0000 @@ -6,6 +6,6 @@ Name: libunwind Description: libunwind base library Version: @VERSION@ -Libs: -L${libdir} -lunwind +Libs: -L${libdir} -lunwind @LIBLZMA@ @LIBZ@ Libs.private: @LIBLZMA@ @LIBZ@ Cflags: -I${includedir} ================================================ FILE: packages/debug/libva-utils/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libva-utils" PKG_VERSION="2.17.1" PKG_SHA256="6ea5993c3eba230a979fa9d35b4cad8df06d4474a773dc0918033bf50353f966" PKG_LICENSE="GPL" PKG_SITE="https://github.com/01org/libva-utils" PKG_URL="https://github.com/intel/libva-utils/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="Libva-utils is a collection of tests for VA-API (VIdeo Acceleration API)" if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET="toolchain libva libdrm libX11" DISPLAYSERVER_LIBVA="-Dx11=true" else PKG_DEPENDS_TARGET="toolchain libva libdrm" DISPLAYSERVER_LIBVA="-Dx11=false" fi PKG_MESON_OPTS_TARGET="-Ddrm=true \ ${DISPLAYSERVER_LIBVA} \ -Dwayland=false \ -Dtests=false" ================================================ FILE: packages/debug/memtester/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="memtester" PKG_VERSION="4.5.1" PKG_SHA256="1c5fc2382576c084b314cfd334d127a66c20bd63892cac9f445bc1d8b4ca5a47" PKG_LICENSE="GPL" PKG_SITE="http://pyropus.ca/software/memtester/" PKG_URL="http://pyropus.ca/software/memtester/old-versions/memtester-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A userspace utility for testing the memory subsystem for faults." PKG_TOOLCHAIN="manual" make_target() { make memtester } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp memtester ${INSTALL}/usr/bin } ================================================ FILE: packages/debug/memtester/patches/memtester-001-cross-compile.patch ================================================ Author: Helmut Grohne Description: make the build system honor $CC to facilitate cross builds Index: memtester-4.3.0/conf-cc =================================================================== --- memtester-4.3.0.orig/conf-cc 2012-06-09 23:45:22.000000000 +0200 +++ memtester-4.3.0/conf-cc 2015-09-12 20:36:27.000000000 +0200 @@ -1,3 +1,3 @@ -cc -O2 -DPOSIX -D_POSIX_C_SOURCE=200809L -D_FILE_OFFSET_BITS=64 -DTEST_NARROW_WRITES -c +$CC -O2 -DPOSIX -D_POSIX_C_SOURCE=200809L -D_FILE_OFFSET_BITS=64 -DTEST_NARROW_WRITES -c This will be used to compile .c files. Index: memtester-4.3.0/conf-ld =================================================================== --- memtester-4.3.0.orig/conf-ld 2012-06-09 23:45:22.000000000 +0200 +++ memtester-4.3.0/conf-ld 2015-09-12 20:36:33.000000000 +0200 @@ -1,3 +1,3 @@ -cc -s +$CC -s This will be used to link .o files into an executable. Index: memtester-4.3.0/Makefile =================================================================== --- memtester-4.3.0.orig/Makefile 2015-09-12 20:01:06.000000000 +0200 +++ memtester-4.3.0/Makefile 2015-09-12 20:50:40.000000000 +0200 @@ -10,8 +10,6 @@ # You don't need to edit these; change the contents of the conf-cc and conf-ld # files if you need to change the compile/link commands. See the README for # more information. -CC = $(shell head -n 1 conf-cc) -LD = $(shell head -n 1 conf-ld) SOURCES = memtester.c tests.c OBJECTS = $(SOURCES:.c=.o) ================================================ FILE: packages/debug/strace/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="strace" PKG_VERSION="6.1" PKG_SHA256="2579e9cec37dbb786f6ea0bebd15f40dd561ef2bde2a2a2ecdce5963b01859fd" PKG_LICENSE="BSD" PKG_SITE="https://strace.io/" PKG_URL="https://strace.io/files/${PKG_VERSION}/strace-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="strace is a diagnostic, debugging and instructional userspace utility" PKG_TOOLCHAIN="autotools" if [ "${TARGET_ARCH}" = x86_64 -o "${TARGET_ARCH}" = "aarch64" ]; then PKG_CONFIGURE_OPTS_TARGET="--enable-mpers=no" fi ================================================ FILE: packages/debug/strace/patches/strace-0001-autoreconf.patch ================================================ diff --git a/configure.ac b/configure.ac index 4e7bc2a89..3b762c94c 100644 --- a/configure.ac +++ b/configure.ac @@ -11,11 +11,7 @@ # SPDX-License-Identifier: LGPL-2.1-or-later AC_PREREQ(2.57) -AC_INIT([strace], - st_esyscmd_s([./build-aux/git-version-gen .tarball-version]), - [strace-devel@lists.strace.io], - [strace], - [https://strace.io]) +AC_INIT([strace],[5.11]) m4_define([copyright_year], st_esyscmd_s([./build-aux/copyright-year-gen .year])) m4_define([manpage_date], st_esyscmd_s([./build-aux/file-date-gen doc/strace.1.in])) AC_COPYRIGHT([Copyright (c) 1999-]copyright_year[ The strace developers.]) ================================================ FILE: packages/debug/strace/patches/strace-0002-fix-autoconf-archive.patch ================================================ From ba71a5f3778df1bb19ba593f6a5550c01f5349ad Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Tue, 28 Jan 2020 03:17:14 +0000 Subject: [PATCH] fix API change since autoconf-archive-2019.01.06 --- Makefile.am | 2 +- Makefile.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index 723460f2e..a6a0f5f9c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -408,7 +408,7 @@ strace_LDADD += $(libiberty_LIBS) endif endif -@CODE_COVERAGE_RULES@ +include $(top_srcdir)/aminclude_static.am CODE_COVERAGE_BRANCH_COVERAGE = 1 CODE_COVERAGE_GENHTML_OPTIONS = $(CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT) \ --prefix $(shell cd $(abs_top_srcdir)/.. && pwd || echo .) diff --git a/Makefile.in b/Makefile.in index b0ec9f686..9b4b93d8b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -10351,7 +10351,7 @@ $(top_srcdir)/xlat/xfs_dqblk_flags.h: $(top_srcdir)/xlat/xfs_dqblk_flags.in $(to $(top_srcdir)/xlat/xfs_quota_flags.h: $(top_srcdir)/xlat/xfs_quota_flags.in $(top_srcdir)/xlat/gen.sh $(AM_V_GEN)$(top_srcdir)/xlat/gen.sh $< $@ -@CODE_COVERAGE_RULES@ +include $(top_srcdir)/aminclude_static.am .PHONY: check-valgrind-local check-valgrind-local: -- 2.7.4 ================================================ FILE: packages/debug/vadumpcaps/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vadumpcaps" PKG_VERSION="38a446e33de5e65f0e5d263dd9a262a4e316a461" PKG_SHA256="04847fcae7ed5529371c3ff27518e6ef4623db65955ad6c7633a538c6b2aeae8" PKG_LICENSE="GPL" PKG_SITE="https://github.com/fhvwy/vadumpcaps" PKG_URL="https://github.com/fhvwy/vadumpcaps/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="This is a utility to show all capabilities of a VAAPI device/driver." PKG_DEPENDS_TARGET="toolchain libva" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp vadumpcaps ${INSTALL}/usr/bin } ================================================ FILE: packages/debug/valgrind/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="valgrind" PKG_VERSION="3.20.0" PKG_SHA256="8536c031dbe078d342f121fa881a9ecd205cb5a78e639005ad570011bdb9f3c6" PKG_LICENSE="GPL" PKG_SITE="https://valgrind.org/" PKG_URL="https://sourceware.org/pub/valgrind/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A tool to help find memory-management problems in programs" if [ "${TARGET_ARCH}" = "arm" ]; then PKG_CONFIGURE_OPTS_TARGET="--enable-only32bit" elif [ "${TARGET_ARCH}" = "aarch64" -o "${TARGET_ARCH}" = "x86_64" ]; then PKG_CONFIGURE_OPTS_TARGET="--enable-only64bit" fi ================================================ FILE: packages/debug/valgrind/patches/valgrind-0001-enable-armv8.patch ================================================ diff -Naur a/configure b/configure --- a/configure 2017-06-15 06:41:35.000000000 -0700 +++ b/configure 2018-06-26 14:51:02.264580174 -0700 @@ -5627,7 +5627,7 @@ ARCH_MAX="s390x" ;; - armv7*) + armv7*|armv8*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok (${host_cpu})" >&5 printf "%s\n" "ok (${host_cpu})" >&6; } ARCH_MAX="arm" ================================================ FILE: packages/debug/vdpauinfo/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="vdpauinfo" PKG_VERSION="1.0" PKG_SHA256="4054960b7ae618c351ff1ce3e7831b5cbda964ae1fbf9969b7146404d3044bc4" PKG_LICENSE="GPL" PKG_SITE="http://freedesktop.org/wiki/Software/VDPAU" PKG_URL="http://people.freedesktop.org/~aplattner/vdpau/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libvdpau" PKG_LONGDESC="A tool to show vdpau infos." ================================================ FILE: packages/debug/xorg-intel-gpu-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="xorg-intel-gpu-tools" PKG_VERSION="1.27.1" PKG_SHA256="93b9a4816ed22b5145bb61024314c8a65caeea991ce93027643f1d40723bf417" PKG_LICENSE="GPL" PKG_DEPENDS_TARGET="toolchain cairo procps-ng" PKG_SITE="https://gitlab.freedesktop.org/drm/igt-gpu-tools" PKG_URL="https://www.x.org/releases/individual/app/igt-gpu-tools-${PKG_VERSION}.tar.xz" PKG_LONGDESC="Test suite and tools for DRM/KMS drivers" PKG_MESON_OPTS_TARGET="-Dchamelium=disabled \ -Ddocs=disabled \ -Dlibdrm_drivers=auto \ -Dlibunwind=disabled \ -Dman=disabled \ -Doverlay=disabled \ -Drunner=disabled \ -Dtests=enabled \ -Dvalgrind=disabled" pre_configure_target() { # xorg-intel-gpu-tools does not build with NDEBUG (requires assert for tests) export TARGET_CFLAGS=$(echo ${TARGET_CFLAGS} | sed -e "s|-DNDEBUG||g") } ================================================ FILE: packages/devel/arm-mem/package.mk ================================================ # 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="arm-mem" PKG_VERSION="b48ea154fd74410022d8189003cd69fad8f3d02c" # Apr 30, 2019 PKG_SHA256="93240defef3abba7d42a7420e55ae4f8b90cc99ef16044fdfb8b5820a17e766d" PKG_ARCH="arm" PKG_LICENSE="GPL" PKG_SITE="https://github.com/bavison/arm-mem" PKG_URL="https://github.com/bavison/arm-mem/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_DEPENDS_INIT="toolchain arm-mem" PKG_LONGDESC="arm-mem is a ARM-accelerated versions of selected functions from string.h" PKG_BUILD_FLAGS="+pic" if target_has_feature neon; then PKG_LIB_ARM_MEM="libarmmem-v7l.so" else PKG_LIB_ARM_MEM="libarmmem-v6l.so" fi PKG_MAKE_OPTS_TARGET="${PKG_LIB_ARM_MEM}" pre_make_target() { export CROSS_COMPILE=${TARGET_PREFIX} } make_init() { : # reuse make_target() } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib cp -P ${PKG_LIB_ARM_MEM} ${INSTALL}/usr/lib mkdir -p ${INSTALL}/etc echo "/usr/lib/${PKG_LIB_ARM_MEM}" >> ${INSTALL}/etc/ld.so.preload } makeinstall_init() { mkdir -p ${INSTALL}/usr/lib cp -P ${PKG_LIB_ARM_MEM} ${INSTALL}/usr/lib mkdir -p ${INSTALL}/etc echo "/usr/lib/${PKG_LIB_ARM_MEM}" >> ${INSTALL}/etc/ld.so.preload } ================================================ FILE: packages/devel/asn1c/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="asn1c" PKG_VERSION="0.9.28" PKG_SHA256="8007440b647ef2dd9fb73d931c33ac11764e6afb2437dbe638bb4e5fc82386b9" PKG_LICENSE="BSD" PKG_SITE="http://lionet.info/asn1c/blog/" PKG_URL="https://github.com/vlm/asn1c/releases/download/v${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="ccache:host" PKG_LONGDESC="The ASN.1 Compiler" ================================================ FILE: packages/devel/attr/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2010-2011 Roman Weber (roman@openelec.tv) # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="attr" PKG_VERSION="2.5.1" PKG_SHA256="bae1c6949b258a0d68001367ce0c741cebdacdd3b62965d17e5eb23cd78adaf8" PKG_LICENSE="GPL" PKG_SITE="https://savannah.nongnu.org/projects/attr" PKG_URL="http://download.savannah.nongnu.org/releases/attr/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Extended Attributes Of Filesystem Objects." PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="OPTIMIZER= \ CONFIG_SHELL=/bin/bash \ INSTALL_USER=root INSTALL_GROUP=root \ --disable-shared --enable-static" if build_with_debug; then PKG_CONFIGURE_OPTS_TARGET+=" DEBUG=-DDEBUG" else PKG_CONFIGURE_OPTS_TARGET+=" DEBUG=-DNDEBUG" fi makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/ cp .libs/libattr.a ${SYSROOT_PREFIX}/usr/lib/ mkdir -p ${SYSROOT_PREFIX}/usr/include/attr cp include/*.h ${SYSROOT_PREFIX}/usr/include/attr } ================================================ FILE: packages/devel/autoconf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="autoconf" PKG_VERSION="2.71" PKG_SHA256="f14c83cfebcc9427f2c3cea7258bd90df972d92eb26752da4ddad81c87a0faa4" PKG_LICENSE="GPL" PKG_SITE="http://sources.redhat.com/autoconf/" PKG_URL="http://ftpmirror.gnu.org/autoconf/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="ccache:host m4:host gettext:host" PKG_LONGDESC="A GNU tool for automatically configuring source code." PKG_CONFIGURE_OPTS_HOST="EMACS=no \ ac_cv_path_M4=${TOOLCHAIN}/bin/m4 \ ac_cv_prog_gnu_m4_gnu=no \ --target=${TARGET_NAME}" post_makeinstall_host() { make prefix=${SYSROOT_PREFIX}/usr install } ================================================ FILE: packages/devel/autoconf/patches/autoconf-autoreconf-exclude.patch ================================================ Upstream-Status: Pending Index: autoconf-2.63/bin/autoreconf.in =================================================================== --- autoconf-2.63.orig/bin/autoreconf.in 2008-12-31 17:39:01.000000000 +0000 +++ autoconf-2.63/bin/autoreconf.in 2008-12-31 17:43:38.000000000 +0000 @@ -76,6 +76,7 @@ -i, --install copy missing auxiliary files --no-recursive don't rebuild sub-packages -s, --symlink with -i, install symbolic links instead of copies + -x, --exclude=STEPS steps we should not run -m, --make when applicable, re-run ./configure && make -W, --warnings=CATEGORY report the warnings falling in CATEGORY [syntax] @@ -136,6 +137,13 @@ # Recurse into subpackages my $recursive = 1; +# Steps to exclude +my @exclude; +my @ex; + +my $uses_gettext; +my $configure_ac; + ## ---------- ## ## Routines. ## ## ---------- ## @@ -153,6 +161,7 @@ 'B|prepend-include=s' => \@prepend_include, 'i|install' => \$install, 's|symlink' => \$symlink, + 'x|exclude=s' => \@exclude, 'm|make' => \$run_make, 'recursive!' => \$recursive); @@ -162,6 +171,8 @@ parse_WARNINGS; parse_warnings '--warnings', @warning; + @exclude = map { split /,/ } @exclude; + # Even if the user specified a configure.ac, trim to get the # directory, and look for configure.ac again. Because (i) the code # is simpler, and (ii) we are still able to diagnose simultaneous @@ -368,7 +384,10 @@ } else { - xsystem_hint ("autopoint is needed because this package uses Gettext", - $autopoint); + @ex = grep (/^autopoint$/, @exclude); + if ($#ex == -1) { + xsystem_hint ("autopoint is needed because this package uses Gettext", + $autopoint); + } } @@ -532,16 +551,19 @@ { $libtoolize .= " --ltdl"; } - xsystem_hint ("libtoolize is needed because this package uses Libtool", - $libtoolize); - $rerun_aclocal = 1; + @ex = grep (/^libtoolize$/, @exclude); + if ($#ex == -1) { + xsystem_hint ("libtoolize is needed because this package uses Libtool", + $libtoolize); + $rerun_aclocal = 1; + } } else { verb "$configure_ac: not running libtoolize: --install not given"; } # --------------------- # # Running intltoolize. # # --------------------- # @@ -748,8 +748,11 @@ } elsif ($install) { - xsystem_hint ("gtkdocize is needed because this package uses Gtkdoc", - $gtkdocize); + @ex = grep (/^autopoint$/, @exclude); + if ($#ex == -1) { + xsystem_hint ("gtkdocize is needed because this package uses Gtkdoc", + $gtkdocize); + } } else { @@ -572,7 +592,10 @@ # latter runs the former, and (ii) autoconf is stricter than # autoheader. So all in all, autoconf should give better error # messages. - xsystem ($autoconf); + @ex = grep (/^autoconf$/, @exclude); + if ($#ex == -1) { + xsystem ("$autoconf"); + } # -------------------- # @@ -593,7 +616,10 @@ } else { - xsystem ($autoheader); + @ex = grep (/^autoheader$/, @exclude); + if ($#ex == -1) { + xsystem ("$autoheader"); + } } @@ -610,7 +636,10 @@ # We should always run automake, and let it decide whether it shall # update the file or not. In fact, the effect of '$force' is already # included in '$automake' via '--no-force'. - xsystem ($automake); + @ex = grep (/^automake$/, @exclude); + if ($#ex == -1) { + xsystem ("$automake"); + } } # ---------------------------------------------------- # @@ -634,7 +663,10 @@ } else { - xsystem ("$make"); + @ex = grep (/^make$/, @exclude); + if ($#ex == -1) { + xsystem ("$make"); + } } } } ================================================ FILE: packages/devel/autoconf/patches/man-exclude.patch ================================================ --- a/Makefile.in 2021-02-28 12:25:11.000000000 +0000 +++ b/Makefile.in 2021-02-28 12:25:11.000000000 +0000 @@ -780,7 +780,6 @@ man/autoconf.1 \ man/autoheader.1 \ man/autom4te.1 \ - man/autoreconf.1 \ man/autoscan.1 \ man/autoupdate.1 \ man/ifnames.1 ================================================ FILE: packages/devel/autoconf-archive/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="autoconf-archive" PKG_VERSION="2022.09.03" PKG_SHA256="e07454f00d8cae7907bed42d0747798927809947684d94c37207a4d63a32f423" PKG_LICENSE="GPL" PKG_SITE="https://www.gnu.org/software/autoconf-archive/" PKG_URL="http://ftpmirror.gnu.org/autoconf-archive/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="ccache:host" PKG_LONGDESC="autoconf-archive is an package of m4 macros" PKG_CONFIGURE_OPTS_HOST="--target=${TARGET_NAME} --prefix=${TOOLCHAIN}" makeinstall_host() { # make install make prefix=${SYSROOT_PREFIX}/usr install # remove problematic m4 file rm -rf ${SYSROOT_PREFIX}/usr/share/aclocal/ax_prog_cc_for_build.m4 } ================================================ FILE: packages/devel/automake/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="automake" PKG_VERSION="1.16.5" PKG_SHA256="f01d58cd6d9d77fbdca9eb4bbd5ead1988228fdb73d6f7a201f5f8d6b118b469" PKG_LICENSE="GPL" PKG_SITE="http://sources.redhat.com/automake/" PKG_URL="http://ftpmirror.gnu.org/automake/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="ccache:host autoconf:host" PKG_LONGDESC="A GNU tool for automatically creating Makefiles." PKG_BUILD_FLAGS="-parallel" PKG_CONFIGURE_OPTS_HOST="--target=${TARGET_NAME} --disable-silent-rules" post_makeinstall_host() { make prefix=${SYSROOT_PREFIX}/usr install } ================================================ FILE: packages/devel/automake/patches/automake-01-fix-help2man.patch ================================================ From fc19cd1da6161ec5602e692488dfc8e670797afe Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Fri, 15 Aug 2014 22:10:03 +0300 Subject: [PATCH] meh help2man --- Makefile.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Makefile.in b/Makefile.in index 5a336df..2d2029b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -701,7 +701,7 @@ update_mans = \ update_mans = \ $(AM_V_GEN): \ && $(MKDIR_P) doc \ - && ./pre-inst-env $(PERL) $(srcdir)/doc/help2man --output=$@ + && ./pre-inst-env $(PERL) $(srcdir)/doc/help2man --output=$@ --no-discard-stderr checklinkx = $(top_srcdir)/contrib/checklinkx # that 4-second sleep seems to be what gnu.org likes. -- 1.7.2.5 ================================================ FILE: packages/devel/binutils/package.mk ================================================ # 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) PKG_NAME="binutils" PKG_VERSION="2.39" PKG_SHA256="645c25f563b8adc0a81dbd6a41cffbf4d37083a382e02d5d3df4f65c09516d00" PKG_LICENSE="GPL" PKG_SITE="https://www.gnu.org/software/binutils/" PKG_URL="https://ftp.gnu.org/gnu/binutils/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="ccache:host bison:host flex:host linux:host" PKG_DEPENDS_TARGET="toolchain zlib binutils:host" PKG_LONGDESC="A GNU collection of binary utilities." PKG_CONFIGURE_OPTS_HOST="--target=${TARGET_NAME} \ --with-sysroot=${SYSROOT_PREFIX} \ --with-lib-path=${SYSROOT_PREFIX}/lib:${SYSROOT_PREFIX}/usr/lib \ --without-ppl \ --enable-static \ --without-cloog \ --disable-werror \ --disable-multilib \ --disable-libada \ --disable-libssp \ --enable-version-specific-runtime-libs \ --enable-plugins \ --enable-gold \ --enable-ld=default \ --enable-lto \ --disable-nls" PKG_CONFIGURE_OPTS_TARGET="--target=${TARGET_NAME} \ --with-sysroot=${SYSROOT_PREFIX} \ --with-lib-path=${SYSROOT_PREFIX}/lib:${SYSROOT_PREFIX}/usr/lib \ --with-system-zlib \ --without-ppl \ --without-cloog \ --enable-static \ --disable-shared \ --disable-werror \ --disable-multilib \ --disable-libada \ --disable-libssp \ --disable-plugins \ --disable-gold \ --disable-ld \ --disable-lto \ --disable-nls" pre_configure_host() { unset CPPFLAGS unset CFLAGS unset CXXFLAGS unset LDFLAGS } make_host() { make configure-host # override the makeinfo binary with true - this does not build the documentation make MAKEINFO=true } makeinstall_host() { cp -v ../include/libiberty.h ${SYSROOT_PREFIX}/usr/include make -C bfd install # fix parallel build with libctf requiring bfd # override the makeinfo binary with true - this does not build the documentation make HELP2MAN=true MAKEINFO=true install } make_target() { make configure-host make -C libiberty make -C bfd make -C opcodes make -C binutils strings } 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 mkdir -p ${INSTALL}/usr/bin cp binutils/strings ${INSTALL}/usr/bin } ================================================ FILE: packages/devel/binutils/patches/binutils-01-warn-for-uses-of-system-directories-when-link.patch ================================================ simplified patch based on http://git.yoctoproject.org/cgit.cgi/poky/plain/meta/recipes-devtools/binutils/binutils/0009-warn-for-uses-of-system-directories-when-cross-linki.patch just detect and skip system directories if used by mistake linker output in case of using /usr/lib path: /data/LibreELEC.tv/build.LibreELEC-Generic.x86_64-8.0-devel/toolchain/lib/gcc/x86_64-libreelec-linux-gnu/6.2.0/../../../../x86_64-libreelec-linux-gnu/bin/ld: warning: library search path "/usr/lib" is unsafe for cross-compilation, ignore it From 7ab8e318659eb5d9adc758c78d084a95560b93fd Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Fri, 15 Jan 2016 06:31:09 +0000 Subject: [PATCH 09/13] warn for uses of system directories when cross linking --- a/ld/ldfile.c +++ b/ld/ldfile.c @@ -103,6 +103,17 @@ ldfile_add_library_path (const char *nam if (!cmdline && config.only_cmd_line_lib_dirs) return; + /* skip those directories when linking */ + if ((!strncmp (name, "/lib", 4)) || + (!strncmp (name, "/usr/lib", 8)) || + (!strncmp (name, "/usr/local/lib", 14)) || + (!strncmp (name, "/usr/X11R6/lib", 14))) + { + einfo (_("%P: warning: library search path \"%s\" is unsafe for " + "cross-compilation, ignore it\n"), name); + return; + } + new_dirs = (search_dirs_type *) xmalloc (sizeof (search_dirs_type)); new_dirs->next = NULL; new_dirs->cmdline = cmdline; ================================================ FILE: packages/devel/binutils/patches/binutils-02-binutils-2-39-dont-error-on-missing-makeinfo.patch ================================================ --- a/bfd/Makefile.in 2022-08-05 09:53:59.000000000 +0000 +++ b/bfd/Makefile.in 2022-08-07 11:22:25.397501975 +0000 @@ -264,7 +264,7 @@ am__v_texidevnull_0 = > /dev/null am__v_texidevnull_1 = am__dirstamp = $(am__leading_dot)dirstamp -INFO_DEPS = doc/bfd.info +INFO_DEPS = am__TEXINFO_TEX_DIR = $(srcdir) DVIS = doc/bfd.dvi PDFS = doc/bfd.pdf ================================================ FILE: packages/devel/binutils-aarch64/package.mk ================================================ # 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) PKG_NAME="binutils-aarch64" PKG_VERSION="$(get_pkg_version binutils)" PKG_LICENSE="GPL" PKG_URL="" PKG_DEPENDS_HOST="toolchain:host" PKG_LONGDESC="A GNU collection of binary utilities for 64-bit ARM." PKG_DEPENDS_UNPACK+=" binutils" PKG_PATCH_DIRS+=" $(get_pkg_directory binutils)/patches" PKG_CONFIGURE_OPTS_HOST="--target=aarch64-none-elf \ --with-sysroot=${SYSROOT_PREFIX} \ --with-lib-path=${SYSROOT_PREFIX}/lib:${SYSROOT_PREFIX}/usr/lib \ --without-ppl \ --enable-static \ --without-cloog \ --disable-werror \ --disable-multilib \ --disable-libada \ --disable-libssp \ --enable-version-specific-runtime-libs \ --enable-plugins \ --enable-gold \ --enable-ld=default \ --enable-lto \ --disable-nls" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/binutils/binutils-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } pre_configure_host() { unset CPPFLAGS unset CFLAGS unset CXXFLAGS unset LDFLAGS } make_host() { make configure-host # override the makeinfo binary with true - this does not build the documentation make MAKEINFO=true } makeinstall_host() { cp -v ../include/libiberty.h ${SYSROOT_PREFIX}/usr/include make -C bfd install # fix parallel build with libctf requiring bfd # override the makeinfo binary with true - this does not build the documentation make MAKEINFO=true install } ================================================ FILE: packages/devel/binutils-arm-none-eabi/package.mk ================================================ # 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) PKG_NAME="binutils-arm-none-eabi" PKG_VERSION="$(get_pkg_version binutils)" PKG_LICENSE="GPL" PKG_URL="" PKG_DEPENDS_HOST="toolchain:host" PKG_LONGDESC="A GNU collection of binary utilities for ARM Cortex-R/M processors." PKG_DEPENDS_UNPACK+=" binutils" PKG_PATCH_DIRS+=" $(get_pkg_directory binutils)/patches" PKG_CONFIGURE_OPTS_HOST="--target=arm-none-eabi \ --with-sysroot=${SYSROOT_PREFIX} \ --with-lib-path=${SYSROOT_PREFIX}/lib:${SYSROOT_PREFIX}/usr/lib \ --without-ppl \ --enable-static \ --without-cloog \ --disable-werror \ --disable-multilib \ --disable-libada \ --disable-libssp \ --enable-version-specific-runtime-libs \ --enable-plugins \ --enable-gold \ --enable-ld=default \ --enable-lto \ --disable-nls" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/binutils/binutils-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } pre_configure_host() { unset CPPFLAGS unset CFLAGS unset CXXFLAGS unset LDFLAGS } make_host() { make configure-host # override the makeinfo binary with true - this does not build the documentation make MAKEINFO=true } makeinstall_host() { cp -v ../include/libiberty.h ${SYSROOT_PREFIX}/usr/include make -C bfd install # fix parallel build with libctf requiring bfd # override the makeinfo binary with true - this does not build the documentation make MAKEINFO=true install } ================================================ FILE: packages/devel/binutils-bpf/package.mk ================================================ # 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) PKG_NAME="binutils-bpf" PKG_VERSION="$(get_pkg_version binutils)" PKG_LICENSE="GPL" PKG_URL="" PKG_DEPENDS_HOST="toolchain:host" PKG_LONGDESC="A GNU collection of binary utilities for 64-bit ARM." PKG_DEPENDS_UNPACK+=" binutils" PKG_PATCH_DIRS+=" $(get_pkg_directory binutils)/patches" PKG_CONFIGURE_OPTS_HOST="--target=bpf \ --with-sysroot=${SYSROOT_PREFIX} \ --with-lib-path=${SYSROOT_PREFIX}/lib:${SYSROOT_PREFIX}/usr/lib \ --without-ppl \ --enable-static \ --without-cloog \ --disable-werror \ --disable-multilib \ --disable-libada \ --disable-libssp \ --enable-version-specific-runtime-libs \ --enable-plugins \ --enable-gold \ --enable-ld=default \ --enable-lto \ --disable-nls" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/binutils/binutils-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } pre_configure_host() { unset CPPFLAGS unset CFLAGS unset CXXFLAGS unset LDFLAGS } make_host() { make configure-host # override the makeinfo binary with true - this does not build the documentation make MAKEINFO=true } makeinstall_host() { cp -v ../include/libiberty.h ${SYSROOT_PREFIX}/usr/include make -C bfd install # fix parallel build with libctf requiring bfd # override the makeinfo binary with true - this does not build the documentation make MAKEINFO=true install } ================================================ FILE: packages/devel/binutils-or1k/package.mk ================================================ # 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) PKG_NAME="binutils-or1k" PKG_VERSION="$(get_pkg_version binutils)" PKG_LICENSE="GPL" PKG_URL="" PKG_DEPENDS_HOST="toolchain:host" PKG_LONGDESC="A GNU collection of binary utilities for OpenRISC 1000." PKG_DEPENDS_UNPACK+=" binutils" PKG_PATCH_DIRS+=" $(get_pkg_directory binutils)/patches" PKG_CONFIGURE_OPTS_HOST="--target=or1k-none-elf \ --with-sysroot=${SYSROOT_PREFIX} \ --with-lib-path=${SYSROOT_PREFIX}/lib:${SYSROOT_PREFIX}/usr/lib \ --without-ppl \ --enable-static \ --without-cloog \ --disable-werror \ --disable-multilib \ --disable-libada \ --disable-libssp \ --enable-version-specific-runtime-libs \ --enable-plugins \ --enable-gold \ --enable-ld=default \ --enable-lto \ --disable-nls" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/binutils/binutils-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } pre_configure_host() { unset CPPFLAGS unset CFLAGS unset CXXFLAGS unset LDFLAGS } make_host() { make configure-host # override the makeinfo binary with true - this does not build the documentation make MAKEINFO=true } makeinstall_host() { cp -v ../include/libiberty.h ${SYSROOT_PREFIX}/usr/include make -C bfd install # fix parallel build with libctf requiring bfd # override the makeinfo binary with true - this does not build the documentation make MAKEINFO=true install } ================================================ FILE: packages/devel/bison/package.mk ================================================ # 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="bison" PKG_VERSION="3.8.2" PKG_SHA256="9bba0214ccf7f1079c5d59210045227bcf619519840ebfa80cd3849cff5a5bf2" PKG_LICENSE="GPL" PKG_SITE="http://www.gnu.org/software/bison/" PKG_URL="http://ftpmirror.gnu.org/bison/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="ccache:host m4:host" PKG_LONGDESC="A general-purpose parser generator." PKG_BUILD_FLAGS="-parallel" PKG_CONFIGURE_OPTS_HOST="--disable-rpath --with-gnu-ld" post_configure_host() { # The configure system causes Bison to be built without support for # internationalization of error messages if a bison program is not already in # ${PATH}. The following addition will correct this: echo '#define YYENABLE_NLS 1' >> lib/config.h } ================================================ FILE: packages/devel/boost/package.mk ================================================ # 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="boost" PKG_VERSION="1.83.0" #PKG_SHA256="af57be25cb4c4f4b413ed692fe378affb4352ea50fbe294a11ef548f4d527d89" PKG_LICENSE="OSS" PKG_SITE="https://www.boost.org/" PKG_URL="https://archives.boost.io/release/${PKG_VERSION}/source/${PKG_NAME}_${PKG_VERSION//./_}.tar.bz2" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain boost:host Python3 zlib bzip2" PKG_LONGDESC="boost: Peer-reviewed STL style libraries for C++" PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="+pic" make_host() { cd tools/build/src/engine sh build.sh } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp b2 ${TOOLCHAIN}/bin } pre_configure_target() { export CFLAGS="${CFLAGS} -I${SYSROOT_PREFIX}/usr/include/${PKG_PYTHON_VERSION}" export CXXFLAGS="${CXXFLAGS} -I${SYSROOT_PREFIX}/usr/include/${PKG_PYTHON_VERSION}" } configure_target() { sh bootstrap.sh --prefix=/usr \ --with-bjam=${TOOLCHAIN}/bin/b2 \ --with-python=${TOOLCHAIN}/bin/python \ --with-python-root=${SYSROOT_PREFIX}/usr echo "using gcc : $(${CC} -v 2>&1 | tail -n 1 |awk '{print $3}') : ${CC} : \"${CFLAGS}\" \"${LDFLAGS}\" ;" \ > tools/build/src/user-config.jam echo "using python : ${PKG_PYTHON_VERSION/#python} : ${TOOLCHAIN} : ${SYSROOT_PREFIX}/usr/include : ${SYSROOT_PREFIX}/usr/lib ;" \ >> tools/build/src/user-config.jam } makeinstall_target() { ${TOOLCHAIN}/bin/b2 -d2 --ignore-site-config \ --layout=system \ --prefix=${SYSROOT_PREFIX}/usr \ --toolset=gcc link=static \ --with-chrono \ --with-date_time \ --with-filesystem \ --with-iostreams \ --with-program_options \ --with-python \ --with-locale \ --with-random \ --with-regex -sICU_PATH="${SYSROOT_PREFIX}/usr" \ --with-serialization \ --with-system \ --with-thread \ install } ================================================ FILE: packages/devel/ccache/package.mk ================================================ # 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) PKG_NAME="ccache" PKG_VERSION="4.7.4" PKG_SHA256="df0c64d15d3efaf0b4f6837dd6b1467e40eeaaa807db25ce79c3a08a46a84e36" PKG_LICENSE="GPL" PKG_SITE="https://ccache.dev/download.html" PKG_URL="https://github.com/ccache/ccache/releases/download/v${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="cmake:host make:host zstd:host" PKG_LONGDESC="A compiler cache to speed up re-compilation of C/C++ code by caching." # Override toolchain as ninja is not built yet PKG_TOOLCHAIN="cmake-make" PKG_BUILD_FLAGS="+local-cc" configure_host() { # custom cmake build to override the LOCAL_CC/CXX cp ${CMAKE_CONF} cmake-ccache.conf echo "SET(CMAKE_C_COMPILER $CC)" >> cmake-ccache.conf echo "SET(CMAKE_CXX_COMPILER $CXX)" >> cmake-ccache.conf cmake -DCMAKE_TOOLCHAIN_FILE=cmake-ccache.conf \ -DCMAKE_INSTALL_PREFIX=${TOOLCHAIN} \ -DENABLE_DOCUMENTATION=OFF \ -DREDIS_STORAGE_BACKEND=OFF \ -DZSTD_FROM_INTERNET=OFF \ -DENABLE_TESTING=OFF \ .. } post_makeinstall_host() { # setup ccache if [ -z "${CCACHE_DISABLE}" ]; then CCACHE_DIR="${BUILD_CCACHE_DIR}" ${TOOLCHAIN}/bin/ccache --max-size=${CCACHE_CACHE_SIZE} CCACHE_DIR="${BUILD_CCACHE_DIR}" ${TOOLCHAIN}/bin/ccache --set-config compression_level=${CCACHE_COMPRESSLEVEL} fi cat > ${TOOLCHAIN}/bin/host-gcc < ${TOOLCHAIN}/bin/host-g++ <= 0x10100000L /* 1.1.0+ has no free compression methods */ +#undef HAVE_SSL_COMP_FREE_COMPRESSION_METHODS /* undef */ +#endif + #if (OPENSSL_VERSION_NUMBER < 0x0090808fL) /* not present in older OpenSSL */ #define OPENSSL_load_builtin_modules(x) ================================================ FILE: packages/devel/configtools/package.mk ================================================ # 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) PKG_NAME="configtools" PKG_VERSION="28ea239c53a2d5d8800c472bc2452eaa16e37af2" #PKG_SHA256="d89be2c5a06d45e4a8731404cd6eb52ddde393480a56754a68b44f36753e38d7" PKG_LICENSE="GPL" PKG_SITE="http://git.savannah.gnu.org/cgit/config.git" PKG_URL="http://git.savannah.gnu.org/cgit/config.git/snapshot/config-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="" PKG_LONGDESC="configtools" PKG_TOOLCHAIN="manual" makeinstall_host() { mkdir -p ${TOOLCHAIN}/configtools cp config.* ${TOOLCHAIN}/configtools } ================================================ FILE: packages/devel/crossguid/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="crossguid" PKG_VERSION="ca1bf4b810e2d188d04cb6286f957008ee1b7681" # 2019-05-30 PKG_SHA256="6be27e0b3a4907f0cd3cfadec255ee1b925569e1bd06e67a4d2f4267299b69c4" PKG_LICENSE="GPL" PKG_SITE="https://github.com/graeme-hill/crossguid" PKG_URL="https://github.com/graeme-hill/crossguid/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain util-linux" PKG_LONGDESC="minimal, cross platform, C++ GUID library" PKG_CMAKE_OPTS_TARGET="-DCROSSGUID_TESTS=OFF \ -Wno-dev" ================================================ FILE: packages/devel/dbus-glib/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="dbus-glib" PKG_VERSION="0.112" PKG_SHA256="7d550dccdfcd286e33895501829ed971eeb65c614e73aadb4a08aeef719b143a" PKG_LICENSE="GPL" PKG_SITE="https://freedesktop.org/wiki/Software/dbus" PKG_URL="https://dbus.freedesktop.org/releases/dbus-glib/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain dbus glib expat" PKG_LONGDESC="A message bus, used for sending messages between applications." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic +lto" PKG_CONFIGURE_OPTS_TARGET="ac_cv_have_abstract_sockets=yes \ ac_cv_func_posix_getpwnam_r=yes \ have_abstract_sockets=yes \ --enable-static \ --disable-shared \ --disable-tests \ --disable-bash-completion \ --enable-asserts=no" post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin/dbus-binding-tool } ================================================ FILE: packages/devel/dbus-glib/patches/dbus-glib-01-dont-build-tools-examples.patch ================================================ From a45f914870e923741f3123799bd9e126b5da4aa0 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Wed, 20 Aug 2014 22:43:28 +0300 Subject: [PATCH] dont build tools / examples --- Makefile.am | 4 ++-- dbus/Makefile.am | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile.am b/Makefile.am index dd76c7e..78cb56f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,8 +1,8 @@ ACLOCAL_AMFLAGS = -I m4 GLIB_PC=dbus-glib-1.pc -SUBDIRS = dbus-gmain dbus tools test doc -DIST_SUBDIRS = dbus-gmain dbus tools test doc m4 +SUBDIRS = dbus-gmain dbus test doc +DIST_SUBDIRS = dbus-gmain dbus test doc m4 pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = $(GLIB_PC) diff --git a/dbus/Makefile.am b/dbus/Makefile.am index 6d885f9..8bc102d 100644 --- a/dbus/Makefile.am +++ b/dbus/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = . examples +SUBDIRS = . INCLUDES = \ -I$(top_srcdir) \ -- 1.7.2.5 ================================================ FILE: packages/devel/elfutils/package.mk ================================================ # 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) PKG_NAME="elfutils" PKG_VERSION="0.188" PKG_SHA256="fb8b0e8d0802005b9a309c60c1d8de32dd2951b56f0c3a3cb56d21ce01595dff" PKG_LICENSE="GPL" PKG_SITE="https://sourceware.org/elfutils/" PKG_URL="https://sourceware.org/elfutils/ftp/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_HOST="autoconf:host automake:host m4:host make:host zlib:host" PKG_DEPENDS_TARGET="toolchain zlib elfutils:host" PKG_LONGDESC="A collection of utilities to handle ELF objects." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic" if [ "${LIBREELEC_VERSION}" = "devel" ]; then PKG_PROGRAMS="--enable-programs --program-prefix=" PKG_PROGRAMS_LIST="readelf" else PKG_PROGRAMS="--disable-programs" PKG_PROGRAMS_LIST= fi PKG_CONFIGURE_OPTS_HOST="utrace_cv_cc_biarch=false \ --disable-programs \ --disable-nls \ --disable-debuginfod \ --disable-libdebuginfod \ --with-zlib \ --without-bzlib \ --without-lzma" PKG_CONFIGURE_OPTS_TARGET="utrace_cv_cc_biarch=false \ ${PKG_PROGRAMS} \ --disable-nls \ --disable-debuginfod \ --disable-libdebuginfod \ --with-zlib \ --without-bzlib \ --without-lzma" post_makeinstall_target() { # don't install progs into sysroot rm -fr ${SYSROOT_PREFIX}/usr/bin if [ -n "${PKG_PROGRAMS_LIST}" ]; then for PKG_TEMP in $(find ${INSTALL}/usr/bin -type f); do listcontains "${PKG_PROGRAMS_LIST}" ${PKG_TEMP#${INSTALL}/usr/bin/} || rm ${PKG_TEMP} done fi } ================================================ FILE: packages/devel/elfutils/patches/elfutils-001-make-executables-optional.patch ================================================ From be854357189b6a3bd7e846b4e7914877f0deaf9f Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Sat, 25 Jan 2020 21:28:52 +0000 Subject: [PATCH] make executables optional --- Makefile.am | 6 +++++- configure.ac | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index bd8926b..1733937 100644 --- a/Makefile.am +++ b/Makefile.am @@ -27,7 +27,11 @@ pkginclude_HEADERS = version.h SUBDIRS = config lib libelf libcpu backends libebl libdwelf libdwfl libdw \ - libasm debuginfod src po doc tests + libasm debuginfod po doc tests + +if BUILD_PROGRAMS + SUBDIRS += src +endif EXTRA_DIST = elfutils.spec GPG-KEY NOTES CONTRIBUTING \ COPYING COPYING-GPLV2 COPYING-LGPLV3 diff --git a/configure.ac b/configure.ac index 5a2dc37..a1e856a 100644 --- a/configure.ac +++ b/configure.ac @@ -88,6 +88,11 @@ AS_IF([test "$use_locks" = yes], AH_TEMPLATE([USE_LOCKS], [Defined if libraries should be thread-safe.]) +AC_ARG_ENABLE([programs], +AS_HELP_STRING([--enable-programs], [Build and install programs when enabled (default: disabled)]), + [build_programs=$enableval], [build_programs=no]) +AM_CONDITIONAL(BUILD_PROGRAMS, test "$build_programs" = yes) + m4_version_prereq([2.70], [AC_PROG_CC], [AC_PROG_CC_C99]) AC_PROG_CXX AC_PROG_RANLIB -- 2.7.4 ================================================ FILE: packages/devel/fakeroot/package.mk ================================================ # 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="fakeroot" PKG_VERSION="1.30.1" PKG_SHA256="32ebb1f421aca0db7141c32a8c104eb95d2b45c393058b9435fbf903dd2b6a75" PKG_LICENSE="GPL3" PKG_SITE="https://tracker.debian.org/pkg/fakeroot" PKG_URL="http://ftp.debian.org/debian/pool/main/f/fakeroot/${PKG_NAME}_${PKG_VERSION}.orig.tar.gz" PKG_DEPENDS_HOST="ccache:host libcap:host autoconf:host libtool:host" PKG_LONGDESC="fakeroot provides a fake root environment by means of LD_PRELOAD and SYSV IPC (or TCP) trickery." PKG_TOOLCHAIN="configure" PKG_CONFIGURE_OPTS_HOST="--with-gnu-ld" pre_configure_host() { cd ${PKG_BUILD} ./bootstrap } ================================================ FILE: packages/devel/fakeroot/patches/fakeroot-001-disable-docs-tests.patch ================================================ --- fakeroot-1.25.3/configure.ac 2020-10-08 17:13:18.000000000 +0000 +++ fakeroot-1.25.3/configure.ac 2021-01-10 03:57:50.295218481 +0000 @@ -597,9 +597,7 @@ AC_CONFIG_FILES([ Makefile scripts/Makefile - doc/Makefile - doc/de/Makefile doc/es/Makefile doc/fr/Makefile doc/nl/Makefile doc/pt/Makefile doc/sv/Makefile - test/Makefile test/defs]) + ]) AC_OUTPUT dnl Local variables: --- fakeroot-1.25.3/Makefile.am 2020-10-08 17:13:18.000000000 +0000 +++ fakeroot-1.25.3/Makefile.am 2021-01-10 04:02:06.703081728 +0000 @@ -1,6 +1,6 @@ AUTOMAKE_OPTIONS=foreign ACLOCAL_AMFLAGS = -I build-aux -SUBDIRS=doc scripts test +SUBDIRS=scripts noinst_LTLIBRARIES = libcommunicate.la libmacosx.la libcommunicate_la_SOURCES = communicate.c ================================================ FILE: packages/devel/flatbuffers/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="flatbuffers" PKG_VERSION="22.12.06" PKG_SHA256="209823306f2cbedab6ff70997e0d236fcfd1864ca9ad082cbfdb196e7386daed" PKG_LICENSE="Apache-2.0" PKG_SITE="https://github.com/google/flatbuffers" PKG_URL="https://github.com/google/flatbuffers/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="An efficient cross platform serialization library for games and other memory constrained apps." PKG_CMAKE_OPTS_HOST="-DFLATBUFFERS_CODE_COVERAGE=OFF \ -DFLATBUFFERS_BUILD_TESTS=OFF \ -DFLATBUFFERS_INSTALL=ON \ -DFLATBUFFERS_BUILD_FLATLIB=OFF \ -DFLATBUFFERS_BUILD_FLATC=ON \ -DFLATBUFFERS_BUILD_FLATHASH=OFF \ -DFLATBUFFERS_BUILD_GRPCTEST=OFF \ -DFLATBUFFERS_BUILD_SHAREDLIB=OFF" PKG_CMAKE_OPTS_TARGET="-DFLATBUFFERS_CODE_COVERAGE=OFF \ -DFLATBUFFERS_BUILD_TESTS=OFF \ -DFLATBUFFERS_INSTALL=ON \ -DFLATBUFFERS_BUILD_FLATLIB=ON \ -DFLATBUFFERS_BUILD_FLATC=OFF \ -DFLATBUFFERS_BUILD_FLATHASH=OFF \ -DFLATBUFFERS_BUILD_GRPCTEST=OFF \ -DFLATBUFFERS_BUILD_SHAREDLIB=OFF" pre_configure_host() { export CXXFLAGS="${CXXFLAGS} -std=c++11" } post_makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp -PR ${PKG_BUILD}/.${HOST_NAME}/flatc ${TOOLCHAIN}/bin } ================================================ FILE: packages/devel/flex/package.mk ================================================ # 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="flex" PKG_VERSION="2.6.4" PKG_SHA256="e87aae032bf07c26f85ac0ed3250998c37621d95f8bd748b31f15b33c45ee995" PKG_LICENSE="GPL" PKG_SITE="https://github.com/westes/flex" PKG_URL="https://github.com/westes/flex/releases/download/v${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="ccache:host m4:host autotools:host bison:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A tool for generating programs that perform pattern-matching on text." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_HOST="--enable-static --disable-shared --disable-rpath --with-gnu-ld" PKG_CONFIGURE_OPTS_TARGET="ac_cv_func_realloc_0_nonnull=yes \ ac_cv_func_malloc_0_nonnull=yes" post_makeinstall_host() { cat > ${TOOLCHAIN}/bin/lex << "EOF" #!/bin/sh exec flex "$@" EOF chmod -v 755 ${TOOLCHAIN}/bin/lex } ================================================ FILE: packages/devel/flex/patches/c5a26b17a2b091c560f6c4e6703e55f496bf74fa.patch ================================================ From c5a26b17a2b091c560f6c4e6703e55f496bf74fa Mon Sep 17 00:00:00 2001 From: Explorer09 Date: Mon, 4 Sep 2017 10:47:33 +0800 Subject: [PATCH] AC_USE_SYSTEM_EXTENSIONS in configure.ac This would define _GNU_SOURCE in config.h, enabling the reallocarray() prototype in glibc 2.26+. Fixes #241. --- configure.ac | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configure.ac b/configure.ac index c6f12d64..3c977a4e 100644 --- a/configure.ac +++ b/configure.ac @@ -25,8 +25,10 @@ # autoconf requirements and initialization AC_INIT([the fast lexical analyser generator],[2.6.4],[flex-help@lists.sourceforge.net],[flex]) +AC_PREREQ([2.60]) AC_CONFIG_SRCDIR([src/scan.l]) AC_CONFIG_AUX_DIR([build-aux]) +AC_USE_SYSTEM_EXTENSIONS LT_INIT AM_INIT_AUTOMAKE([1.15 -Wno-portability foreign std-options dist-lzip parallel-tests subdir-objects]) AC_CONFIG_HEADER([src/config.h]) ================================================ FILE: packages/devel/flex/patches/flex-002-nocrap.patch ================================================ --- a/Makefile.am 2020-01-08 12:57:40.940081434 +0100 +++ b/Makefile.am 2020-01-08 12:57:59.603818146 +0100 @@ -50,10 +50,6 @@ SUBDIRS = \ lib \ src \ - doc \ - examples \ - po \ - tests \ tools # Create the ChangeLog, but only if we're inside a git working directory ================================================ FILE: packages/devel/fribidi/package.mk ================================================ # 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="fribidi" PKG_VERSION="1.0.12" PKG_SHA256="0cd233f97fc8c67bb3ac27ce8440def5d3ffacf516765b91c2cc654498293495" PKG_LICENSE="LGPL" PKG_SITE="http://fribidi.freedesktop.org/" PKG_URL="https://github.com/fribidi/fribidi/releases/download/v${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A bidirectional algorithm library." PKG_BUILD_FLAGS="+pic" PKG_MESON_OPTS_TARGET="-Ddeprecated=false \ -Ddocs=false \ -Ddefault_library=static" post_makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/bin cp -f ${PKG_DIR}/scripts/fribidi-config ${SYSROOT_PREFIX}/usr/bin chmod +x ${SYSROOT_PREFIX}/usr/bin/fribidi-config rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/devel/fribidi/scripts/fribidi-config ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) while test $# -gt 0; do case $1 in --libs) echo "-lfribidi" ;; esac shift done ================================================ FILE: packages/devel/gettext/package.mk ================================================ # 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) PKG_NAME="gettext" PKG_VERSION="0.21.1" PKG_SHA256="50dbc8f39797950aa2c98e939947c527e5ac9ebd2c1b99dd7b06ba33a6767ae6" PKG_LICENSE="GPL" PKG_SITE="https://www.gnu.org/s/gettext/" PKG_URL="https://ftp.gnu.org/pub/gnu/gettext/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="make:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A program internationalization library and tools." PKG_BUILD_FLAGS="+local-cc" PKG_CONFIGURE_OPTS_HOST="--disable-static --enable-shared \ --disable-rpath \ --with-gnu-ld \ --disable-java \ --disable-curses \ --with-included-libxml \ --disable-native-java \ --disable-csharp \ --without-emacs" PKG_CONFIGURE_OPTS_TARGET="--disable-rpath" post_configure_target() { libtool_remove_rpath gettext-runtime/libasprintf/libtool libtool_remove_rpath gettext-tools/libtool } ================================================ FILE: packages/devel/gettext/patches/gettext-0.18.2-non_interactive.patch ================================================ diff -Naur gettext-0.18.1.1-old/gettext-tools/misc/gettextize.in gettext-0.18.1.1-new/gettext-tools/misc/gettextize.in --- gettext-0.18.1.1-old/gettext-tools/misc/gettextize.in 2010-06-06 05:49:57.000000000 -0700 +++ gettext-0.18.1.1-new/gettext-tools/misc/gettextize.in 2010-08-18 06:52:51.000000000 -0700 @@ -1272,10 +1272,10 @@ 5) count="five paragraphs";; *) count="$count paragraphs";; esac - echo "Press Return to acknowledge the previous $count." - # Read from /dev/tty, not stdin, so that gettextize cannot be abused by - # non-interactive tools. - read dummy < /dev/tty +# echo "Press Return to acknowledge the previous $count." +# # Read from /dev/tty, not stdin, so that gettextize cannot be abused by +# # non-interactive tools. +# read dummy < /dev/tty fi exit 0 ================================================ FILE: packages/devel/gettext/patches/gettext-dont_build_docs_and_examples.patch ================================================ diff -Naur gettext-0.19.7/gettext-tools/Makefile.am gettext-0.19.7.patch/gettext-tools/Makefile.am --- gettext-0.19.7/gettext-tools/Makefile.am 2015-12-08 13:50:04.000000000 +0100 +++ gettext-0.19.7.patch/gettext-tools/Makefile.am 2016-01-01 20:49:07.476011819 +0100 @@ -19,7 +19,7 @@ AUTOMAKE_OPTIONS = 1.5 gnu no-dependencies ACLOCAL_AMFLAGS = -I m4 -I ../gettext-runtime/m4 -I ../m4 -I gnulib-m4 -I libgrep/gnulib-m4 -I libgettextpo/gnulib-m4 -SUBDIRS = intl gnulib-lib libgrep src libgettextpo po its projects styles emacs misc man m4 tests system-tests gnulib-tests examples doc +SUBDIRS = intl gnulib-lib libgrep src libgettextpo po its projects styles emacs misc man m4 tests system-tests gnulib-tests EXTRA_DIST = misc/DISCLAIM MOSTLYCLEANFILES = core *.stackdump diff -Naur gettext-0.19.7/gettext-tools/Makefile.in gettext-0.19.7.patch/gettext-tools/Makefile.in --- gettext-0.19.7/gettext-tools/Makefile.in 2015-12-28 00:09:39.000000000 +0100 +++ gettext-0.19.7.patch/gettext-tools/Makefile.in 2016-01-01 20:49:29.444038357 +0100 @@ -1865,7 +1865,7 @@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = 1.5 gnu no-dependencies ACLOCAL_AMFLAGS = -I m4 -I ../gettext-runtime/m4 -I ../m4 -I gnulib-m4 -I libgrep/gnulib-m4 -I libgettextpo/gnulib-m4 -SUBDIRS = intl gnulib-lib libgrep src libgettextpo po its projects styles emacs misc man m4 tests system-tests gnulib-tests examples doc +SUBDIRS = intl gnulib-lib libgrep src libgettextpo po its projects styles emacs misc man m4 tests system-tests gnulib-tests # Allow users to use "gnulib-tool --update". ================================================ FILE: packages/devel/glib/package.mk ================================================ # 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) PKG_NAME="glib" PKG_VERSION="2.75.2" PKG_SHA256="360d6fb75202c0eb0d07f0ab812b19b526f1c05ccc0a8ed7e5d2c988616d343a" PKG_LICENSE="LGPL" PKG_SITE="https://www.gtk.org/" PKG_URL="https://download.gnome.org/sources/glib/$(get_pkg_version_maj_min)/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="libffi:host pcre2:host Python3:host meson:host ninja:host" PKG_DEPENDS_TARGET="toolchain pcre2 zlib libffi Python3:host util-linux" PKG_LONGDESC="A library which includes support routines for C such as lists, trees, hashes, memory allocation." PKG_MESON_OPTS_HOST="-Ddefault_library=shared \ -Dinstalled_tests=false \ -Dlibmount=disabled \ -Dtests=false" PKG_MESON_OPTS_TARGET="-Ddefault_library=shared \ -Dinstalled_tests=false \ -Dselinux=disabled \ -Dxattr=true \ -Dgtk_doc=false \ -Dman=false \ -Ddtrace=false \ -Dsystemtap=false \ -Dbsymbolic_functions=true \ -Dforce_posix_threads=true \ -Dtests=false" post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin rm -rf ${INSTALL}/usr/lib/gdbus-2.0 rm -rf ${INSTALL}/usr/lib/glib-2.0 rm -rf ${INSTALL}/usr/lib/installed-tests rm -rf ${INSTALL}/usr/share } ================================================ FILE: packages/devel/glibc/config/gai.conf ================================================ # Configuration for getaddrinfo(3). # # So far only configuration for the destination address sorting is needed. # RFC 3484 governs the sorting. But the RFC also says that system # administrators should be able to overwrite the defaults. This can be # achieved here. # # All lines have an initial identifier specifying the option followed by # up to two values. Information specified in this file replaces the # default information. Complete absence of data of one kind causes the # appropriate default information to be used. The supported commands include: # # reload # If set to yes, each getaddrinfo(3) call will check whether this file # changed and if necessary reload. This option should not really be # used. There are possible runtime problems. The default is no. # # label # Add another rule to the RFC 3484 label table. See section 2.1 in # RFC 3484. The default is: # #label ::1/128 0 #label ::/0 1 #label 2002::/16 2 #label ::/96 3 #label ::ffff:0:0/96 4 #label fec0::/10 5 #label fc00::/7 6 #label 2001:0::/32 7 # # This default differs from the tables given in RFC 3484 by handling # (now obsolete) site-local IPv6 addresses and Unique Local Addresses. # The reason for this difference is that these addresses are never # NATed while IPv4 site-local addresses most probably are. Given # the precedence of IPv6 over IPv4 (see below) on machines having only # site-local IPv4 and IPv6 addresses a lookup for a global address would # see the IPv6 be preferred. The result is a long delay because the # site-local IPv6 addresses cannot be used while the IPv4 address is # (at least for the foreseeable future) NATed. We also treat Teredo # tunnels special. # # precedence # Add another rule to the RFC 3484 precedence table. See section 2.1 # and 10.3 in RFC 3484. The default is: # #precedence ::1/128 50 #precedence ::/0 40 #precedence 2002::/16 30 #precedence ::/96 20 #precedence ::ffff:0:0/96 10 # # For sites which prefer IPv4 connections change the last line to # #precedence ::ffff:0:0/96 100 # # scopev4 # Add another rule to the RFC 6724 scope table for IPv4 addresses. # By default the scope IDs described in section 3.2 in RFC 6724 are # used. Changing these defaults should hardly ever be necessary. # The defaults are equivalent to: # #scopev4 ::ffff:169.254.0.0/112 2 #scopev4 ::ffff:127.0.0.0/104 2 #scopev4 ::ffff:0.0.0.0/96 14 ================================================ FILE: packages/devel/glibc/config/host.conf ================================================ multi on ================================================ FILE: packages/devel/glibc/config/nsswitch-init.conf ================================================ # This is just enough to get DNS resolution working in the initramfs hosts: dns ================================================ FILE: packages/devel/glibc/config/nsswitch-target.conf ================================================ # /etc/nsswitch.conf # # Example configuration of GNU Name Service Switch functionality. # passwd: files group: files shadow: files gshadow: files hosts: files dns networks: files dns protocols: files services: files ethers: files rpc: files netgroup: files ================================================ FILE: packages/devel/glibc/package.mk ================================================ # 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) PKG_NAME="glibc" PKG_VERSION="2.36" PKG_SHA256="1c959fea240906226062cb4b1e7ebce71a9f0e3c0836c09e7e3423d434fcfe75" PKG_LICENSE="GPL" PKG_SITE="https://www.gnu.org/software/libc/" PKG_URL="https://ftp.gnu.org/pub/gnu/glibc/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="ccache:host autotools:host linux:host gcc:bootstrap pigz:host Python3:host" PKG_DEPENDS_INIT="glibc" PKG_LONGDESC="The Glibc package contains the main C library." PKG_BUILD_FLAGS="+bfd" case "${LINUX}" in amlogic-4.9|rk356x-4.19|OdroidM1-4.19) OPT_ENABLE_KERNEL=4.9.0 ;; gameforce-4.4|rockchip-4.4|odroid-go-a-4.4) OPT_ENABLE_KERNEL=4.4.0 ;; amlogic-5.15) OPT_ENABLE_KERNEL=5.15.0 ;; amlogic-5.4) OPT_ENABLE_KERNEL=5.4.0 ;; amlogic-3.14) OPT_ENABLE_KERNEL=3.0.0 ;; *) OPT_ENABLE_KERNEL=6.1.0 ;; esac if [ "${TARGET_ARCH}" = "arm" ] || [ "${TARGET_ARCH}" = "aarch64" ]; then PKG_PATCH_DIRS="widevine-arm" fi PKG_CONFIGURE_OPTS_TARGET="BASH_SHELL=/bin/sh \ ac_cv_path_PERL=no \ ac_cv_prog_MAKEINFO= \ --libexecdir=/usr/lib/glibc \ --cache-file=config.cache \ --disable-profile \ --disable-sanity-checks \ --enable-add-ons \ --enable-bind-now \ --with-elf \ --with-tls \ --with-__thread \ --with-binutils=${BUILD}/toolchain/bin \ --with-headers=${SYSROOT_PREFIX}/usr/include \ --enable-kernel=${OPT_ENABLE_KERNEL} \ --without-cvs \ --without-gd \ --disable-build-nscd \ --disable-nscd \ --disable-timezone-tools" if build_with_debug; then PKG_CONFIGURE_OPTS_TARGET+=" --enable-debug" else PKG_CONFIGURE_OPTS_TARGET+=" --disable-debug" fi post_unpack() { find "${PKG_BUILD}" -type f -name '*.py' -exec sed -e '1s,^#![[:space:]]*/usr/bin/python.*,#!/usr/bin/env python3,' -i {} \; } pre_configure_target() { # Filter out some problematic *FLAGS export CFLAGS=$(echo ${CFLAGS} | sed -e "s|-ffast-math||g") export CFLAGS=$(echo ${CFLAGS} | sed -e "s|-Ofast|-O2|g") export CFLAGS=$(echo ${CFLAGS} | sed -e "s|-O.|-O2|g") export CFLAGS=$(echo ${CFLAGS} | sed -e "s|-Wunused-but-set-variable||g") export CFLAGS="${CFLAGS} -Wno-unused-variable" if [ -n "${PROJECT_CFLAGS}" ]; then export CFLAGS=$(echo ${CFLAGS} | sed -e "s|${PROJECT_CFLAGS}||g") fi export LDFLAGS=$(echo ${LDFLAGS} | sed -e "s|-ffast-math||g") export LDFLAGS=$(echo ${LDFLAGS} | sed -e "s|-Ofast|-O2|g") export LDFLAGS=$(echo ${LDFLAGS} | sed -e "s|-O.|-O2|g") export LDFLAGS=$(echo ${LDFLAGS} | sed -e "s|-Wl,--as-needed||") unset LD_LIBRARY_PATH # set some CFLAGS we need export CFLAGS="${CFLAGS} -g -fno-stack-protector" export BUILD_CC=${HOST_CC} export OBJDUMP_FOR_HOST=objdump cat >config.cache <configparms < Date: Tue, 16 May 2023 10:20:38 +0200 Subject: [PATCH 1/3] Revert "Linux: statx syscall number is always available" This reverts commit 7255ccbec997312033c9fe48e0971a2e7cb19fbf. Revert as this is not true for older kernels. --- sysdeps/unix/sysv/linux/statx.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/sysdeps/unix/sysv/linux/statx.c b/sysdeps/unix/sysv/linux/statx.c index 8211ef4b68..9da6c0821c 100644 --- a/sysdeps/unix/sysv/linux/statx.c +++ b/sysdeps/unix/sysv/linux/statx.c @@ -25,14 +25,17 @@ int statx (int fd, const char *path, int flags, unsigned int mask, struct statx *buf) { +#ifdef __NR_statx int ret = INLINE_SYSCALL_CALL (statx, fd, path, flags, mask, buf); -#ifdef __ASSUME_STATX +# ifdef __ASSUME_STATX return ret; -#else +# else if (ret == 0 || errno != ENOSYS) /* Preserve non-error/non-ENOSYS return values. */ return ret; - else - return statx_generic (fd, path, flags, mask, buf); +# endif +#endif +#ifndef __ASSUME_STATX + return statx_generic (fd, path, flags, mask, buf); #endif } -- 2.41.0 ================================================ FILE: packages/devel/glibc/patches/arm/0002-Linux-arm-fixup-statx-syscall-number-missing.patch ================================================ From 6404339d284203199febb7e28dcc53a3d57858ed Mon Sep 17 00:00:00 2001 From: Portisch Date: Tue, 16 May 2023 10:47:18 +0200 Subject: [PATCH 2/3] Linux: arm: fixup statx syscall number missing --- sysdeps/unix/sysv/linux/fstatat64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sysdeps/unix/sysv/linux/fstatat64.c b/sysdeps/unix/sysv/linux/fstatat64.c index 8b1a1a290d..ca66485968 100644 --- a/sysdeps/unix/sysv/linux/fstatat64.c +++ b/sysdeps/unix/sysv/linux/fstatat64.c @@ -40,7 +40,7 @@ _Static_assert (sizeof (__blkcnt_t) == sizeof (__blkcnt64_t), "__blkcnt_t and __blkcnt64_t must match"); #endif -#if (__WORDSIZE == 32 \ +#if (__WORDSIZE == 32 && defined __NR_statx \ && (!defined __SYSCALL_WORDSIZE || __SYSCALL_WORDSIZE == 32)) \ || defined STAT_HAS_TIME32 \ || (!defined __NR_newfstatat && !defined __NR_fstatat64) -- 2.41.0 ================================================ FILE: packages/devel/glibc/patches/arm/0003-arm-disable-__NR_statx-as-it-s-not-available-in-4.9.patch ================================================ From d466d07f9bf8c3fd42d92b4f9412df50c0faff42 Mon Sep 17 00:00:00 2001 From: Portisch Date: Wed, 17 May 2023 15:36:51 +0200 Subject: [PATCH 3/3] arm: disable __NR_statx as it's not available in 4.9 --- sysdeps/unix/sysv/linux/arm/arch-syscall.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sysdeps/unix/sysv/linux/arm/arch-syscall.h b/sysdeps/unix/sysv/linux/arm/arch-syscall.h index e7ba04c106..7ad958d643 100644 --- a/sysdeps/unix/sysv/linux/arm/arch-syscall.h +++ b/sysdeps/unix/sysv/linux/arm/arch-syscall.h @@ -355,7 +355,7 @@ #define __NR_stat64 195 #define __NR_statfs 99 #define __NR_statfs64 266 -#define __NR_statx 397 +//#define __NR_statx 397 #define __NR_swapoff 115 #define __NR_swapon 87 #define __NR_symlink 83 -- 2.41.0 ================================================ FILE: packages/devel/glibc/patches/glibc-fix-dns-with-broken-routers.patch ================================================ commit 45918e237cd32bb3d9a5fde83f81f83b52584771 Author: Stefan Saraev Date: Tue Oct 1 12:09:07 2013 +0300 fix dns with broken routers ref: https://fedoraproject.org/wiki/Networking/NameResolution/ADDRCONFIG --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -730,6 +730,38 @@ gaih_inet (const char *name, const struc if (res_ctx == NULL) no_more = 1; + /* AI_ADDRCONFIG determines whether or not we should suppress any + * hostname lookups. If the local host has only IPv4 interfaces, + * then suppress lookups for IPv6 addresses, and vice versa; if + * the local host has only IPv6 interfaces, suppress any lookups + * for IPv4 addresses.. + * + * Link-local IPv6 addresses and loopback addresses of either + * family are ignored when determining whether or not the host has + * an interface of the given address family, cf. __check_pf(). + * + * This logic is only applied for AF_UNSPEC. If the caller + * explicitly requested an address family, give him what he asked + * for. + * + * If we didn't find any interfaces of either address family, + * we ignore AI_ADDRCONFIG and return all available resutlts. */ + int suppress_af = 0; + if (req->ai_family == AF_UNSPEC) + { + struct in6addrinfo *in6ai = NULL; + size_t in6ailen = 0; + bool seen_ipv4 = false; + bool seen_ipv6 = false; + __check_pf (&seen_ipv4, &seen_ipv6, &in6ai, &in6ailen); + __free_in6ai (in6ai); + + if(seen_ipv4 && !seen_ipv6) + suppress_af = AF_INET6; + else if(seen_ipv6 && !seen_ipv4) + suppress_af = AF_INET; + } + while (!no_more) { no_data = 0; @@ -737,7 +769,7 @@ gaih_inet (const char *name, const struc /* gethostbyname4_r sends out parallel A and AAAA queries and is thus only suitable for PF_UNSPEC. */ - if (req->ai_family == PF_UNSPEC) + if (req->ai_family == PF_UNSPEC && !suppress_af) fct4 = __nss_lookup_function (nip, "gethostbyname4_r"); if (fct4 != NULL) @@ -826,25 +858,27 @@ gaih_inet (const char *name, const struc if (fct != NULL) { - if (req->ai_family == AF_INET6 - || req->ai_family == AF_UNSPEC) + if ((req->ai_family == AF_INET6 + || req->ai_family == AF_UNSPEC) + && suppress_af != AF_INET6) { if ((result = gethosts (fct, AF_INET6, name, req, tmpbuf, res, &status, &no_data)) != 0) { __resolv_context_put (res_ctx); goto out; } no_inet6_data = no_data; inet6_status = status; } - if (req->ai_family == AF_INET - || req->ai_family == AF_UNSPEC - || (req->ai_family == AF_INET6 - && (req->ai_flags & AI_V4MAPPED) - /* Avoid generating the mapped addresses if we - know we are not going to need them. */ - && ((req->ai_flags & AI_ALL) || !res->got_ipv6))) + if ((req->ai_family == AF_INET + || req->ai_family == AF_UNSPEC + || (req->ai_family == AF_INET6 + && (req->ai_flags & AI_V4MAPPED) + /* Avoid generating the mapped addresses if we + know we are not going to need them. */ + && ((req->ai_flags & AI_ALL) || !res->got_ipv6))) + && suppress_af != AF_INET) { if ((result = gethosts (fct, AF_INET, name, req, tmpbuf, res, &status, &no_data)) != 0) --- a/sysdeps/unix/sysv/linux/check_pf.c +++ b/sysdeps/unix/sysv/linux/check_pf.c @@ -224,7 +224,8 @@ make_request (int fd, pid_t pid) } else { - if (!IN6_IS_ADDR_LOOPBACK (address)) + if (!IN6_IS_ADDR_LOOPBACK (address) && + !IN6_IS_ADDR_LINKLOCAL (address)) seen_ipv6 = true; } } ================================================ FILE: packages/devel/glibc/patches/glibc-ld.so.cache-to-writable-cache.patch ================================================ From bfdcab6e5f8352d5a1ee9724244d98cfd1d1d309 Mon Sep 17 00:00:00 2001 From: 7Ji Date: Fri, 15 Jul 2022 11:30:30 +0800 Subject: [PATCH] glibc: ld.so.cache to .cache --- sysdeps/generic/dl-cache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sysdeps/generic/dl-cache.h b/sysdeps/generic/dl-cache.h index 93d4bea930..34aa313cf0 100644 --- a/sysdeps/generic/dl-cache.h +++ b/sysdeps/generic/dl-cache.h @@ -35,7 +35,7 @@ #endif #ifndef LD_SO_CACHE -# define LD_SO_CACHE SYSCONFDIR "/ld.so.cache" +# define LD_SO_CACHE "/storage/.cache/ld.so.cache" #endif #ifndef add_system_dir -- 2.37.1 ================================================ FILE: packages/devel/glibc/patches/widevine-arm/glibc-HACK-Don-t-check-GLIBC_ABI_DT_RELR-support-for-Chrom.patch ================================================ From 85892fbc0d6f64f564f0d4c9514a7183ad8eb985 Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 17 Jul 2022 12:16:20 +0200 Subject: [PATCH] HACK: Don't check GLIBC_ABI_DT_RELR support for ChromeOS libwidevinecdm.so Required starting with glibc 2.36 --- elf/dl-version.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/elf/dl-version.c b/elf/dl-version.c index cda0889209..058394f148 100644 --- a/elf/dl-version.c +++ b/elf/dl-version.c @@ -373,7 +373,8 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode) if (d->d_tag == DT_NEEDED) { const char *name = strtab + d->d_un.d_val; - if (strncmp (name, "libc.so.", 8) == 0) + if (strncmp (name, "libc.so.", 8) == 0 && + strstr (map->l_name, "libwidevinecdm.so") == NULL) { _dl_exception_create (&exception, DSO_FILENAME (map->l_name), -- 2.37.1 ================================================ FILE: packages/devel/glibc/patches/widevine-arm/glibc-tls-libwidevinecdm.so-since-4.10.2252.0-has-TLS-with.patch ================================================ From 61b3b546450ae0a70cb4a57fbb0e0fc47b331370 Mon Sep 17 00:00:00 2001 From: Portisch Date: Sat, 5 Jun 2021 19:41:25 +0200 Subject: [PATCH] tls: libwidevinecdm.so: since 4.10.2252.0 has TLS with 64-byte alignment Change the max_align to 64U instead 16 to make it possible to use dlopen again. Tests by changing TLS_TCB_ALIGN directly showed up some random crashes. Reverence: https://lkml.org/lkml/2020/7/3/754 Without this patch, a SEGV is encountered when dlopen(libwidevinecdm.so), inside dl-init.c call_init() --- elf/dl-tls.c | 5 +++++ 1 file changed, 5 insertions(+) --- a/elf/dl-tls.c +++ b/elf/dl-tls.c @@ -220,6 +220,11 @@ void _dl_determine_tlsoffset (void) { size_t max_align = TCB_ALIGNMENT; + /* libwidevinecdm.so: since 4.10.2252.0 has TLS with 64-byte alignment. + Since TLS is initialized before audit modules are loaded and slotinfo + information is available, this is not taken into account below in + the audit case. */ + max_align = MAX (max_align, 64U); size_t freetop = 0; size_t freebottom = 0; ================================================ FILE: packages/devel/gmp/package.mk ================================================ # 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="gmp" PKG_VERSION="6.2.1" PKG_SHA256="fd4829912cddd12f84181c3451cc752be224643e87fac497b69edddadc49b4f2" PKG_LICENSE="LGPLv3+" PKG_SITE="http://gmplib.org/" PKG_URL="https://gmplib.org/download/gmp/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="ccache:host m4:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A library for arbitrary precision arithmetic, operating on signed integers, rational numbers, and floating point numbers." PKG_BUILD_FLAGS="+pic:host" PKG_CONFIGURE_OPTS_HOST="--enable-cxx --enable-static --disable-shared" pre_configure_host() { export CPPFLAGS="${CPPFLAGS} -fexceptions" } ================================================ FILE: packages/devel/gnulib/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="gnulib" # Match version with GNULIB_REVISION in grub bootstrap.conf PKG_VERSION="ebaa53c5f1253974c6f23bb1500d8de198e84ab8" PKG_SHA256="473ec80d80147ad45c38f8ea7bed2db973f266fddee853c646795e35ce928c39" PKG_LICENSE="GPL" PKG_SITE="https://savannah.gnu.org/git/?group=gnulib" PKG_URL="http://git.savannah.gnu.org/cgit/gnulib.git/snapshot/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_LONGDESC="GNU portability library" PKG_TOOLCHAIN="manual" ================================================ FILE: packages/devel/gobject-introspection/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) PKG_NAME="gobject-introspection" PKG_VERSION="1.75.4" PKG_SHA256="5356640b5941368fe8abfa7810fd8b5e07160038a177dcf4b683efb840932b5b" PKG_ARCH="any" PKG_LICENSE="LGPL" PKG_SITE="http://www.gtk.org/" PKG_URL="https://github.com/GNOME/$PKG_NAME/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain libffi glib Python3 qemu:host gobject-introspection:host" PKG_DEPENDS_HOST="libffi:host glib:host" PKG_SECTION="devel" PKG_SHORTDESC="glib: C support library" PKG_LONGDESC="GLib is a library which includes support routines for C such as lists, trees, hashes, memory allocation, and many other things." PKG_TOOLCHAIN="meson" pre_configure_host() { PKG_MESON_OPTS_HOST="-Ddoctool=disabled" # prevent g-ir-scanner from writing cache data to $HOME export GI_SCANNER_DISABLE_CACHE="1" } pre_configure_target() { GLIBC_DYNAMIC_LINKER="$(ls ${SYSROOT_PREFIX}/usr/lib/ld-linux-*.so.*)" QEMU_BINARY="${TOOLCHAIN}/bin/qemu-${TARGET_ARCH}" PKG_CONFIG_PATH="${SYSROOT_PREFIX}/usr/lib/pkgconfig" # for gi this variables must be defined for target and not for host # because they are used in # toolchain/lib/gobject-introspection/giscanner/ccompiler.py CC="${TARGET_CC}" CXX="${TARGET_CXX}" AR="${TARGET_AR}" CPP="${TARGET_PREFIX}cpp" CPPFLAGS="${TARGET_CPPFLAGS}" CFLAGS="${TARGET_CFLAGS}" LDFLAGS="${TARGET_LDFLAGS}" PKG_MESON_OPTS_TARGET=" \ -Ddoctool=disabled \ -Dpython=${TOOLCHAIN}/bin/${PKG_PYTHON_VERSION} \ -Dgi_cross_use_prebuilt_gi=true \ -Dgi_cross_binary_wrapper=${TOOLCHAIN}/bin/g-ir-scanner-binary-wrapper \ -Dgi_cross_ldd_wrapper=${TOOLCHAIN}/bin/g-ir-scanner-ldd-wrapper \ -Dbuild_introspection_data=true" # prevent g-ir-scanner from writing cache data to $HOME export GI_SCANNER_DISABLE_CACHE="1" # write out a qemu wrapper that will be given to gi-scanner # so that it can run target helper binaries through that cat > ${TOOLCHAIN}/bin/g-ir-scanner-binary-wrapper << EOF #!/bin/sh ${QEMU_BINARY} \ -E LD_LIBRARY_PATH="${SYSROOT_PREFIX}/usr/lib:${TOOLCHAIN}/${TARGET_NAME}/lib" \ -L ${SYSROOT_PREFIX}/usr \ "\$@" EOF # write out a wrapper to use instead of ldd, which does not # work when a binary is built for a different architecture cat > ${TOOLCHAIN}/bin/g-ir-scanner-ldd-wrapper << EOF #!/bin/sh ${QEMU_BINARY} \ -E LD_LIBRARY_PATH="${SYSROOT_PREFIX}/usr/lib:${TOOLCHAIN}/${TARGET_NAME}/lib" \ ${GLIBC_DYNAMIC_LINKER} --list "\$1" EOF chmod +x ${TOOLCHAIN}/bin/g-ir-scanner-*-wrapper } post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin rm -rf ${INSTALL}/usr/lib/gobject-introspection rm -rf ${INSTALL}/usr/share } ================================================ FILE: packages/devel/gobject-introspection/patches/gobject-introspection-0004-fix-7568.patch ================================================ diff --git a/girepository/girepository.c b/girepository/girepository.c index 7d03485..aef2320 100644 --- a/girepository/girepository.c +++ b/girepository/girepository.c @@ -824,6 +824,8 @@ g_irepository_find_by_gtype (GIRepository *repository, return NULL; data.gtype_name = g_type_name (gtype); + if (data.gtype_name == NULL) + return NULL; data.result_typelib = NULL; /* Inside each typelib, we include the "C prefix" which acts as ================================================ FILE: packages/devel/gperftools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Team CoreELEC (https://coreelec.org) PKG_NAME="gperftools" PKG_VERSION="2.9.1" PKG_SHA256="484a88279d2fa5753d7e9dea5f86954b64975f20e796a6ffaf2f3426a674a06a" PKG_LICENSE="BSD" PKG_SITE="https://github.com/gperftools/gperftools" PKG_URL="https://github.com/gperftools/gperftools/archive/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Google Performance Tools" PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--enable-minimal --disable-debugalloc --disable-static" ================================================ FILE: packages/devel/heimdal/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2017 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="heimdal" PKG_VERSION="f4faaeaba371fff3f8d1bc14389f5e6d70ca8e17" PKG_SHA256="2576c5e2d793db53c86e108fd117b278437bb02d6c6db2bec4d1b86958f1980a" PKG_LICENSE="BSD-3c" PKG_SITE="http://www.h5l.org/" PKG_URL="https://github.com/heimdal/heimdal/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host Python3:host ncurses:host asn1c:host" PKG_LONGDESC="Kerberos 5, PKIX, CMS, GSS-API, SPNEGO, NTLM, Digest-MD5 and, SASL implementation." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-parallel" PKG_CONFIGURE_OPTS_HOST="ac_cv_prog_COMPILE_ET=no \ --enable-static --disable-shared \ --without-openldap \ --without-capng \ --without-sqlite3 \ --without-libintl \ --without-openssl \ --without-berkeley-db \ --without-readline \ --without-libedit \ --without-hesiod \ --without-x \ --disable-otp \ --disable-heimdal-documentation" makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp -PR lib/asn1/asn1_compile ${TOOLCHAIN}/bin/heimdal_asn1_compile cp -PR lib/com_err/compile_et ${TOOLCHAIN}/bin/heimdal_compile_et } ================================================ FILE: packages/devel/intltool/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="intltool" PKG_VERSION="0.51.0" PKG_SHA256="67c74d94196b153b774ab9f89b2fa6c6ba79352407037c8c14d5aeb334e959cd" PKG_LICENSE="GPL" PKG_SITE="http://www.gnome.org" PKG_URL="http://launchpad.net/intltool/trunk/${PKG_VERSION}/+download/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="ccache:host" PKG_LONGDESC="Tools to translate strings from various source files (.xml.in, .glade, .desktop.in, .server.in, .oaf.in)." post_makeinstall_host() { mkdir -p ${SYSROOT_PREFIX}/usr/share/aclocal cp ../intltool.m4 ${SYSROOT_PREFIX}/usr/share/aclocal } ================================================ FILE: packages/devel/intltool/patches/intltool-0001-fix-regex-expressions.patch ================================================ === modified file 'intltool-update.in' --- a/intltool-update.in 2014-05-14 02:15:53 +0000 +++ b/intltool-update.in 2016-01-19 15:59:38 +0000 @@ -1062,7 +1062,7 @@ } } - if ($str =~ /^(.*)\${?([A-Z_]+)}?(.*)$/) + if ($str =~ /^(.*)\$\{?([A-Z_]+)}?(.*)$/) { my $rest = $3; my $untouched = $1; @@ -1190,10 +1190,10 @@ $name =~ s/\(+$//g; $version =~ s/\(+$//g; - $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\${?AC_PACKAGE_NAME}?/); - $varhash{"PACKAGE"} = $name if (not $name =~ /\${?PACKAGE}?/); - $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\${?AC_PACKAGE_VERSION}?/); - $varhash{"VERSION"} = $version if (not $name =~ /\${?VERSION}?/); + $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\$\{?AC_PACKAGE_NAME}?/); + $varhash{"PACKAGE"} = $name if (not $name =~ /\$\{?PACKAGE}?/); + $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\$\{?AC_PACKAGE_VERSION}?/); + $varhash{"VERSION"} = $version if (not $name =~ /\$\{?VERSION}?/); } if ($conf_source =~ /^AC_INIT\(([^,\)]+),([^,\)]+)[,]?([^,\)]+)?/m) @@ -1219,11 +1219,11 @@ $version =~ s/\(+$//g; $bugurl =~ s/\(+$//g if (defined $bugurl); - $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\${?AC_PACKAGE_NAME}?/); - $varhash{"PACKAGE"} = $name if (not $name =~ /\${?PACKAGE}?/); - $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\${?AC_PACKAGE_VERSION}?/); - $varhash{"VERSION"} = $version if (not $name =~ /\${?VERSION}?/); - $varhash{"PACKAGE_BUGREPORT"} = $bugurl if (defined $bugurl and not $bugurl =~ /\${?\w+}?/); + $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\$\{?AC_PACKAGE_NAME}?/); + $varhash{"PACKAGE"} = $name if (not $name =~ /\$\{?PACKAGE}?/); + $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\$\{?AC_PACKAGE_VERSION}?/); + $varhash{"VERSION"} = $version if (not $name =~ /\$\{?VERSION}?/); + $varhash{"PACKAGE_BUGREPORT"} = $bugurl if (defined $bugurl and not $bugurl =~ /\$\{?\w+}?/); } # \s makes this not work, why? ================================================ FILE: packages/devel/json-c/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2010-2011 Roman Weber (roman@openelec.tv) # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="json-c" PKG_VERSION="0.16" PKG_SHA256="c169436bd63a30fce4f9560befccb6bad3d375c8c7e9905ceb4e1f28f2cb24f7" PKG_LICENSE="MIT" PKG_SITE="https://github.com/json-c/json-c" PKG_URL="https://github.com/json-c/json-c/archive/json-c-${PKG_VERSION%-*}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Implements a reference counting object model that allows you to easily construct JSON objects in C." ================================================ FILE: packages/devel/json-glib/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="json-glib" PKG_VERSION="1.6.6" PKG_SHA256="bf4d1cd6c343ce13b9258e6703a0411a3b659887b65877e85a2aa488ae18b865" PKG_LICENSE="LGPL-2.1" PKG_SITE="https://github.com/GNOME/json-glib" PKG_URL="https://github.com/GNOME/json-glib/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain glib glib:host" PKG_LONGDESC="JSON-GLib implements a full suite of JSON-related tools using GLib and GObject." PKG_MESON_OPTS_TARGET="-Dintrospection=disabled \ -Dgtk_doc=disabled \ -Dman=false \ -Dtests=false" ================================================ FILE: packages/devel/libaio/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2017 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libaio" PKG_VERSION="0.3.113" PKG_SHA256="716c7059703247344eb066b54ecbc3ca2134f0103307192e6c2b7dab5f9528ab" PKG_LICENSE="GPL" PKG_SITE="https://pagure.io/libaio" PKG_URL="https://pagure.io/${PKG_NAME}/archive/${PKG_NAME}-${PKG_VERSION}/${PKG_NAME}-${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Kernel Asynchronous I/O (AIO) Support for Linux." make_target() { make -C src } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib cp -PR src/libaio.a ${SYSROOT_PREFIX}/usr/lib mkdir -p ${SYSROOT_PREFIX}/usr/include cp -PR src/libaio.h ${SYSROOT_PREFIX}/usr/include } ================================================ FILE: packages/devel/libbpf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libbpf" PKG_VERSION="1.1.0" PKG_SHA256="5da826c968fdb8a2f714701cfef7a4b7078be030cf58b56143b245816301cbb8" PKG_LICENSE="LGPL-2.1" PKG_SITE="https://github.com/libbpf/libbpf" PKG_URL="https://github.com/libbpf/libbpf/archive/refs/tags/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain elfutils" PKG_LONGDESC="libbpf supports building BPF CO-RE-enabled applications" PKG_TOOLCHAIN="make" make_target() { make BUILD_STATIC_ONLY=1 \ PREFIX=${SYSROOT_PREFIX}/usr \ -C src } makeinstall_target() { make BUILD_STATIC_ONLY=1 \ PREFIX=${SYSROOT_PREFIX}/usr \ -C src install } ================================================ FILE: packages/devel/libbpf/patches/libbpf-fix-crosscompile-and-sysroot.patch ================================================ diff --git a/src/Makefile b/src/Makefile index 81ea6b8..7ab5f13 100644 --- a/src/Makefile +++ b/src/Makefile @@ -67,15 +67,12 @@ INSTALL = install DESTDIR ?= HOSTARCH = $(firstword $(subst -, ,$(shell $(CC) -dumpmachine))) -ifeq ($(filter-out %64 %64be %64eb %64le %64el s390x, $(HOSTARCH)),) - LIBSUBDIR := lib64 -else - LIBSUBDIR := lib -endif +LIBSUBDIR := lib # By default let the pc file itself use ${prefix} in includedir/libdir so that # the prefix can be overridden at runtime (eg: --define-prefix) ifndef LIBDIR + PREFIX_PC := /usr LIBDIR_PC := $$\{prefix\}/$(LIBSUBDIR) else LIBDIR_PC := $(LIBDIR) @@ -106,7 +103,7 @@ $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION): $(SHARED_OBJS) $^ $(ALL_LDFLAGS) -o $@ $(OBJDIR)/libbpf.pc: force - $(Q)sed -e "s|@PREFIX@|$(PREFIX)|" \ + $(Q)sed -e "s|@PREFIX@|$(PREFIX_PC)|" \ -e "s|@LIBDIR@|$(LIBDIR_PC)|" \ -e "s|@VERSION@|$(LIBBPF_VERSION)|" \ < libbpf.pc.template > $@ diff --git a/src/libbpf.pc.template b/src/libbpf.pc.template index b45ed53..fe6ddde 100644 --- a/src/libbpf.pc.template +++ b/src/libbpf.pc.template @@ -7,6 +7,6 @@ includedir=${prefix}/include Name: libbpf Description: BPF library Version: @VERSION@ -Libs: -L${libdir} -lbpf +Libs: -L${libdir} -lbpf -lz Requires.private: libelf zlib Cflags: -I${includedir} ================================================ FILE: packages/devel/libcap/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2010-2011 Roman Weber (roman@openelec.tv) # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libcap" PKG_VERSION="2.66" PKG_SHA256="15c40ededb3003d70a283fe587a36b7d19c8b3b554e33f86129c059a4bb466b2" PKG_LICENSE="GPL" PKG_SITE="https://git.kernel.org/pub/scm/libs/libcap/libcap.git/log/" PKG_URL="https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="ccache:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A library for getting and setting POSIX.1e capabilities." PKG_BUILD_FLAGS="+pic" post_unpack() { mkdir -p ${PKG_BUILD}/.${HOST_NAME} cp -r ${PKG_BUILD}/* ${PKG_BUILD}/.${HOST_NAME} mkdir -p ${PKG_BUILD}/.${TARGET_NAME} cp -r ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME} } make_host() { cd ${PKG_BUILD}/.${HOST_NAME} make CC=${CC} \ AR=${AR} \ RANLIB=${RANLIB} \ CFLAGS="${HOST_CFLAGS}" \ BUILD_CFLAGS="${HOST_CFLAGS} -I${PKG_BUILD}/libcap/include" \ PAM_CAP=no \ lib=/lib \ USE_GPERF=no \ -C libcap libcap.pc libcap.a } make_target() { cd ${PKG_BUILD}/.${TARGET_NAME} make CC=${CC} \ AR=${AR} \ RANLIB=${RANLIB} \ CFLAGS="${TARGET_CFLAGS}" \ BUILD_CC=${HOST_CC} \ BUILD_CFLAGS="${HOST_CFLAGS} -I${PKG_BUILD}/libcap/include" \ PAM_CAP=no \ lib=/lib \ USE_GPERF=no \ -C libcap libcap.pc libcap.a } makeinstall_host() { mkdir -p ${TOOLCHAIN}/lib cp libcap/libcap.a ${TOOLCHAIN}/lib mkdir -p ${TOOLCHAIN}/lib/pkgconfig cp libcap/libcap.pc ${TOOLCHAIN}/lib/pkgconfig mkdir -p ${TOOLCHAIN}/include/sys cp libcap/include/sys/capability.h ${TOOLCHAIN}/include/sys } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib cp libcap/libcap.a ${SYSROOT_PREFIX}/usr/lib mkdir -p ${SYSROOT_PREFIX}/usr/lib/pkgconfig cp libcap/libcap.pc ${SYSROOT_PREFIX}/usr/lib/pkgconfig mkdir -p ${SYSROOT_PREFIX}/usr/include/sys cp libcap/include/sys/capability.h ${SYSROOT_PREFIX}/usr/include/sys } ================================================ FILE: packages/devel/libcec/package.mk ================================================ # 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) PKG_NAME="libcec" PKG_VERSION="6.0.2" PKG_SHA256="090696d7a4fb772d7acebbb06f91ab92e025531c7c91824046b9e4e71ecb3377" PKG_LICENSE="GPL" PKG_SITE="http://libcec.pulse-eight.com/" PKG_URL="https://github.com/Pulse-Eight/libcec/archive/libcec-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain systemd p8-platform swig:host" PKG_LONGDESC="libCEC is an open-source dual licensed library designed for communicating with the Pulse-Eight USB - CEC Adaptor." PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=1 \ -DCMAKE_INSTALL_LIBDIR:STRING=lib \ -DCMAKE_INSTALL_LIBDIR_NOARCH:STRING=lib \ -DSKIP_PYTHON_WRAPPER=1 \ -DHAVE_IMX_API=0 \ -DHAVE_GIT_BIN=0 \ -DHAVE_RPI_LIB=0" if [ "${KODIPLAYER_DRIVER}" = "libamcodec" ]; then PKG_CMAKE_OPTS_TARGET="${PKG_CMAKE_OPTS_TARGET} -DHAVE_AOCEC_API=1" else PKG_CMAKE_OPTS_TARGET="${PKG_CMAKE_OPTS_TARGET} -DHAVE_AOCEC_API=0 -DHAVE_AMLOGIC_API=0" fi # libX11 and xrandr to read the sink's EDID, used to determine the PC's HDMI physical address if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" libX11 libXrandr" fi if [ "${CEC_FRAMEWORK_SUPPORT}" = "yes" ]; then PKG_CMAKE_OPTS_TARGET+=" -DHAVE_LINUX_API=1" else PKG_CMAKE_OPTS_TARGET+=" -DHAVE_LINUX_API=0" fi post_makeinstall_target() { # Remove the Python3 demo - useless for us rm -f ${INSTALL}/usr/bin/pyCecClient # Remove the sysmlink and redirect to /var/lib so that we can change libcec versions at run time rm -f ${INSTALL}/usr/lib/libcec.so.6 ln -sf /var/lib/libcec.so.6 ${INSTALL}/usr/lib/libcec.so.6 PYTHON_DIR=${INSTALL}/usr/lib/${PKG_PYTHON_VERSION} if [ -d ${PYTHON_DIR}/dist-packages ]; then mv ${PYTHON_DIR}/dist-packages ${PYTHON_DIR}/site-packages fi } ================================================ FILE: packages/devel/libdaemon/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="libdaemon" PKG_VERSION="0.14" PKG_SHA256="fd23eb5f6f986dcc7e708307355ba3289abe03cc381fc47a80bca4a50aa6b834" PKG_LICENSE="GPL" PKG_SITE="http://0pointer.de/lennart/projects/libdaemon/" PKG_URL="http://0pointer.de/lennart/projects/libdaemon/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A lightweight C library which eases the writing of UNIX daemons." PKG_CONFIGURE_OPTS_TARGET="ac_cv_func_setpgrp_void=no \ --enable-static \ --disable-shared \ --disable-lynx" ================================================ FILE: packages/devel/libevent/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="libevent" PKG_VERSION="2.1.11-stable" PKG_SHA256="a65bac6202ea8c5609fd5c7e480e6d25de467ea1917c08290c521752f147283d" PKG_LICENSE="BSD" PKG_SITE="https://libevent.org" PKG_URL="https://github.com/libevent/libevent/releases/download/release-$PKG_VERSION/$PKG_NAME-$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain openssl" PKG_LONGDESC="The libevent API provides a mechanism to execute a callback function when a specific event occurs." PKG_TOOLCHAIN="configure" PKG_CONFIGURE_OPTS_TARGET="--disable-static \ --disable-libevent-regress \ --disable-samples \ --enable-openssl" post_unpack() { # https://github.com/libevent/libevent/issues/863 # Uninstall.cmake.in is missing from 2.1.11 release touch $PKG_BUILD/cmake/Uninstall.cmake.in } post_makeinstall_target() { rm -f $INSTALL/usr/bin/event_rpcgen.py } ================================================ FILE: packages/devel/libffi/package.mk ================================================ # 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="libffi" PKG_VERSION="3.4.4" PKG_SHA256="d66c56ad259a82cf2a9dfc408b32bf5da52371500b84745f7fb8b645712df676" PKG_LICENSE="GPL" PKG_SITE="http://sourceware.org/${PKG_NAME}/" PKG_URL="https://github.com/libffi/libffi/releases/download/v${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="ccache:host autoconf:host automake:host libtool:host pkg-config:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Foreign Function Interface Library." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--disable-debug \ --enable-static --disable-shared \ --with-pic \ --enable-structs \ --enable-raw-api \ --disable-purify-safety \ --with-gnu-ld" ================================================ FILE: packages/devel/libffi/patches/libffi-Fix-installation-location-of-libffi.patch ================================================ From 102c02de867bfe831b5366c89d66bcf170db962e Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Thu, 7 Feb 2013 22:26:56 +0100 Subject: [PATCH] Fix installation location of libffi The libffi is currently declared as toolexeclib_LTLIBRARIES. In many cases, toolexeclib libraries will be installed in /usr/lib, so it doesn't make any difference. However, with multilib toolchains, they get installed in a subdirectory of /usr/lib/. For example, with a Sourcery CodeBench PowerPC toolchain, if the e500mc multilib variant is used, the libffi library gets installed in /usr/lib/te500mc/. This is due to the following code in the configure script: multi_os_directory=`$CC -print-multi-os-directory` case $multi_os_directory in .) ;; # Avoid trailing /. *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;; esac Once the library is installed in /usr/lib/te500mc/, nothing works because this installation location is inconsistent with the installation location declared in libffi.pc. So, instead of using this bizarre toolexeclib_LTLIBRARIES, simply use the more standard lib_LTLIBRARIES, which ensures that the libffi library is always installed in /usr/lib. Signed-off-by: Thomas Petazzoni --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 6f669ca..b60bcc1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -93,7 +93,7 @@ FLAGS_TO_PASS = $(AM_MAKEFLAGS) MAKEOVERRIDES= -toolexeclib_LTLIBRARIES = libffi.la +lib_LTLIBRARIES = libffi.la noinst_LTLIBRARIES = libffi_convenience.la libffi_la_SOURCES = src/prep_cif.c src/types.c \ -- 1.7.9.5 ================================================ FILE: packages/devel/libffi/patches/libffi-fix-pkgconf.patch ================================================ From a2d10693e352db0cdfc22550f23f8294564ce939 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Sat, 16 Aug 2014 12:26:53 +0300 Subject: [PATCH] fix pkgconf --- libffi.pc.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/libffi.pc.in b/libffi.pc.in index 1477a66..1dd4ebd 100644 --- a/libffi.pc.in +++ b/libffi.pc.in @@ -7,5 +7,5 @@ includedir=@includedir@/@PACKAGE_NAME@ Name: @PACKAGE_NAME@ Description: Library supporting Foreign Function Interfaces Version: @PACKAGE_VERSION@ -Libs: -L${toolexeclibdir} -lffi +Libs: -L${libdir} -lffi Cflags: -I${includedir} -- 1.7.2.5 ================================================ FILE: packages/devel/libfmt/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libfmt" PKG_VERSION="9.1.0" PKG_SHA256="5dea48d1fcddc3ec571ce2058e13910a0d4a6bab4cc09a809d8b1dd1c88ae6f2" PKG_LICENSE="BSD" PKG_SITE="https://github.com/fmtlib/fmt" PKG_URL="https://github.com/fmtlib/fmt/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="fmt is an open-source formatting library for C++. It can be used as a safe alternative to printf or as a fast alternative to IOStreams." PKG_CMAKE_OPTS_TARGET="-DCMAKE_CXX_STANDARD=14 \ -DCMAKE_CXX_EXTENSIONS:BOOL=OFF \ -DFMT_DOC=OFF \ -DFMT_INSTALL=ON \ -DFMT_TEST=OFF \ -DBUILD_SHARED_LIBS=ON" ================================================ FILE: packages/devel/libfstrcmp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libfstrcmp" PKG_VERSION="0.7.D001" PKG_SHA256="e4018e850f80700acee8da296e56e15b1eef711ab15157e542e7d7e1237c3476" PKG_LICENSE="GPL" PKG_SITE="http://fstrcmp.sourceforge.net/" PKG_URL="https://downloads.sourceforge.net/project/fstrcmp/fstrcmp/$(get_pkg_version_maj_min)/fstrcmp-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="The fstrcmp project provides a library that is used to make fuzzy comparisons of strings and byte arrays, including multi-byte character strings." pre_configure_target() { cd "${PKG_BUILD}" } make_target() { make all-bin } makeinstall_target() { make DESTDIR="${SYSROOT_PREFIX}" install-include install-libdir } ================================================ FILE: packages/devel/libftdi1/package.mk ================================================ # 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="libftdi1" PKG_VERSION="1.5" PKG_SHA256="7c7091e9c86196148bd41177b4590dccb1510bfe6cea5bf7407ff194482eb049" PKG_LICENSE="LGPL" PKG_SITE="http://www.intra2net.com/en/developer/libftdi/" PKG_URL="http://www.intra2net.com/en/developer/libftdi/download/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libusb libconfuse" PKG_LONGDESC="libFTDI is an open source library to talk to FTDI chips" PKG_BUILD_FLAGS="+pic" PKG_CMAKE_OPTS_TARGET="-DSTATICLIBS=ON \ -DDOCUMENTATION=FALSE \ -DEXAMPLES=FALSE \ -DFTDIPP=FALSE \ -DPYTHON_BINDINGS=FALSE" makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/include/libftdi1 cp ../src/ftdi.h ${SYSROOT_PREFIX}/usr/include/libftdi1 mkdir -p ${SYSROOT_PREFIX}/usr/lib cp src/libftdi1.a ${SYSROOT_PREFIX}/usr/lib mkdir -p ${SYSROOT_PREFIX}/usr/lib/pkgconfig cp libftdi1.pc ${SYSROOT_PREFIX}/usr/lib/pkgconfig } ================================================ FILE: packages/devel/libirman/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libirman" PKG_VERSION="0.5.2" PKG_SHA256="43e58d7cd22b3a4c4dc8dcf8542a269ebcb4d8f6ceea0577b9fc882898f09a47" PKG_LICENSE="GPL" PKG_SITE="https://sourceforge.net/projects/libirman" PKG_URL="http://downloads.sourceforge.net/project/libirman/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain systemd lirc" PKG_NEED_UNPACK="$(get_pkg_directory lirc)" PKG_LONGDESC="libirman library for lircd" PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic -parallel" PKG_CONFIGURE_OPTS_TARGET="--disable-swtest" post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/devel/libirman/patches/libirman-0001-fix-poll-include.patch ================================================ diff -Naur a/config.h.in b/config.h.in --- a/config.h.in 2016-05-18 18:19:56.000000000 +0200 +++ b/config.h.in 2016-12-26 22:49:43.514203152 +0100 @@ -21,6 +21,9 @@ /* Define to 1 if you have the `mkfifo' function. */ #undef HAVE_MKFIFO +/* defined if poll.h is available */ +#undef HAVE_POLL_H + /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT @@ -48,6 +51,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILE_H +/* defined if sys/poll.h is available */ +#undef HAVE_SYS_POLL_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H diff -Naur a/configure.ac b/configure.ac --- a/configure.ac 2016-05-18 18:19:41.000000000 +0200 +++ b/configure.ac 2016-12-26 22:48:40.190031280 +0100 @@ -20,7 +20,7 @@ dnl Checks for header files. AC_HEADER_STDC -AC_CHECK_HEADERS(fcntl.h sys/time.h unistd.h termios.h memory.hi sys/file.h) +AC_CHECK_HEADERS(fcntl.h sys/time.h unistd.h termios.h memory.hi sys/file.h poll.h sys/poll.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_TYPE_PID_T ================================================ FILE: packages/devel/libplist/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="libplist" PKG_VERSION="2.2.0" PKG_SHA256="4a5517e5377ec421df84c586ba85bb4e1d26f11ad203d7d450a907c0156fbd9a" PKG_LICENSE="GPL" PKG_SITE="http://www.libimobiledevice.org/" PKG_URL="https://github.com/libimobiledevice/libplist/releases/download/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain glib" PKG_LONGDESC="libplist is a library for manipulating Apple Binary and XML Property Lists" PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--without-cython" pre_configure_target() { # work around bashism in configure script export CONFIG_SHELL="/bin/bash" } post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/devel/libpthread-stubs/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="libpthread-stubs" PKG_VERSION="0.4" PKG_SHA256="50d5686b79019ccea08bcbd7b02fe5a40634abcfd4146b6e75c6420cc170e9d9" PKG_LICENSE="OSS" PKG_SITE="http://xcb.freedesktop.org/" PKG_URL="http://xcb.freedesktop.org/dist/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A library providing weak aliases for pthread functions." ================================================ FILE: packages/devel/libtool/package.mk ================================================ # 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="libtool" PKG_VERSION="2.4.6" PKG_SHA256="e3bd4d5d3d025a36c21dd6af7ea818a2afcd4dfc1ea5a17b39d7854bcd0c06e3" PKG_LICENSE="GPL" PKG_SITE="http://www.gnu.org/software/libtool/" PKG_URL="http://ftpmirror.gnu.org/libtool/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="ccache:host autoconf:host automake:host intltool:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A generic library support script." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_HOST="--enable-static --disable-shared" post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin rm -rf ${INSTALL}/usr/share } ================================================ FILE: packages/devel/libtool/patches/libtool-01_dont_relink_against_host.patch ================================================ diff --git a/build-aux/ltmain.sh b/build-aux/ltmain.sh index 5eca4ae..23901ff 100644 --- a/build-aux/ltmain.sh +++ b/build-aux/ltmain.sh @@ -8333,7 +8333,7 @@ func_mode_link () fi else # We cannot seem to hardcode it, guess we'll fake it. - add_dir=-L$libdir + #add_dir=-L$libdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in ================================================ FILE: packages/devel/libtool/patches/libtool-02-use_ld.patch ================================================ diff --git a/build-aux/ltmain.sh b/build-aux/ltmain.sh index 23901ff..df26ab5 100644 --- a/build-aux/ltmain.sh +++ b/build-aux/ltmain.sh @@ -7250,7 +7250,7 @@ func_mode_link () # -stdlib=* select c++ std lib with clang -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ - -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*|-fuse-ld=*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result func_append compile_command " $arg" ================================================ FILE: packages/devel/libtool/patches/libtool-03-remove-help2man-dependency.patch ================================================ diff -Naur a/Makefile.am b/Makefile.am --- a/Makefile.am 2015-01-20 07:34:33.000000000 -0800 +++ b/Makefile.am 2015-10-27 11:16:49.027497480 -0700 @@ -406,22 +406,6 @@ $(AM_V_GEN)$(MAKEINFO) -P '$(srcdir)/doc' --no-headers \ $(MAKEINFOFLAGS) -o '$@' '$(notes_texi)' -dist_man1_MANS = $(libtool_1) $(libtoolize_1) -MAINTAINERCLEANFILES += $(dist_man1_MANS) -update_mans = \ - PATH=".$(PATH_SEPARATOR)$$PATH"; export PATH; \ - $(HELP2MAN) --output='$@' - -# It's wrong to make distributed files (e.g. $(libtool_1)) rely on -# files created in the build tree, so instead we regenerate the -# manual pages if the sources for the build-tree files we want to -# run have changed. -$(libtool_1): $(ltmain_sh) - $(AM_V_GEN)$(update_mans) --help-option=--help-all libtool -$(libtoolize_1): $(libtoolize_in) - $(AM_V_GEN)$(update_mans) libtoolize - - ## ------------- ## ## Installation. ## ## ------------- ## ================================================ FILE: packages/devel/m4/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="m4" PKG_VERSION="1.4.19" PKG_SHA256="b306a91c0fd93bc4280cfc2e98cb7ab3981ff75a187bea3293811f452c89a8c8" PKG_LICENSE="GPL" PKG_SITE="http://www.gnu.org/software/m4/" PKG_URL="http://ftpmirror.gnu.org/m4/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_HOST="ccache:host" PKG_LONGDESC="The m4 macro processor." PKG_CONFIGURE_OPTS_HOST="gl_cv_func_gettimeofday_clobber=no --target=${TARGET_NAME}" post_makeinstall_host() { make prefix=${SYSROOT_PREFIX}/usr install } ================================================ FILE: packages/devel/make/package.mk ================================================ # 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) PKG_NAME="make" PKG_VERSION="4.4.1" PKG_SHA256="dd16fb1d67bfab79a72f5e8390735c49e3e8e70b4945a15ab1f81ddb78658fb3" PKG_LICENSE="GPLv3" PKG_SITE="https://www.gnu.org/software/make/" PKG_URL="http://ftpmirror.gnu.org/make/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="" PKG_LONGDESC="Utility to maintain groups of programs." PKG_BUILD_FLAGS="+local-cc" post_makeinstall_host() { ln -sf make ${TOOLCHAIN}/bin/gmake } ================================================ FILE: packages/devel/make/patches/make-02-fix-large-command-line-on-POSIX-systems.patch ================================================ From e249c43741779ae7dd6834f6840384257d4c3dd8 Mon Sep 17 00:00:00 2001 From: Mike Crowe Date: Fri, 6 Nov 2020 15:22:37 +0000 Subject: [PATCH] [SV 45763] Fix large command line on POSIX systems When presented with a very long command line (as is common when linking a large number of files with absolute paths in a deep subdirectory), make fails to execute the command as it doesn't split the command line to fit within the limits. This is based on a fix for Debian bug 688601[1] by Adam Conrad applied by Manoj Srivastava originally applied for Debian make-dfsg 4.0-5 in 2014 but dropped in 2018 (it seems under the incorrect assumption that it had been accepted upstream.) I've tweaked Adam's original patch so that it compiles successfully with -Werror on top of current master. This required: * moving the eval_line declaration to the top of the block, so I moved the macros too * using a const variable when iterating over the shell * adding a cast to avoid a signed/unsigned mismatch. As suggested in the Savannah bug report[2], I've added a test case that fails without the rest of the patch. I'm not sure what the consequences of running the test on non-POSIX targets would be and whether it needs marking as an expected failure. * src/job.c (construct_command_argv_internal): support running commands longer than MAX_ARG_STRLEN * tests/scripts/features/long_command_line: add test for such a command * configure.ac: check for now-required sys/user.h and linux/binfmts.h headers [1] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=688601 [2] https://savannah.gnu.org/bugs/?45763#comment2 --- src/job.c | 52 +++++++++++++++++++++++- tests/scripts/features/long_command_line | 30 ++++++++++++++ 2 files changed, 81 insertions(+), 1 deletions(-) create mode 100644 tests/scripts/features/long_command_line diff --git a/src/job.c b/src/job.c index 3bcec38..734c591 100644 --- a/src/job.c +++ b/src/job.c @@ -26,6 +26,12 @@ this program. If not, see . */ #include "variable.h" #include "os.h" +#include +#include +#ifndef PAGE_SIZE +# define PAGE_SIZE (sysconf(_SC_PAGESIZE)) +#endif + /* Default shell to use. */ #ifdef WINDOWS32 # ifdef HAVE_STRINGS_H @@ -3228,6 +3236,15 @@ construct_command_argv_internal (char *line, char **restp, const char *shell, size_t sflags_len = shellflags ? strlen (shellflags) : 0; #ifdef WINDOWS32 char *command_ptr = NULL; /* used for batch_mode_shell mode */ +#endif + char *args_ptr; +#ifdef MAX_ARG_STRLEN + static char eval_line[] = "eval\\ \\\"set\\ x\\;\\ shift\\;\\ "; +#define ARG_NUMBER_DIGITS 5 +#define EVAL_LEN (sizeof(eval_line)-1 + shell_len + 4 \ + + (7 + ARG_NUMBER_DIGITS) * 2 * line_len / (MAX_ARG_STRLEN - 2)) +#else +#define EVAL_LEN 0 #endif # ifdef __EMX__ /* is this necessary? */ @@ -3395,7 +3412,7 @@ construct_command_argv_internal (char *line, char **restp, const char *shell, } new_line = xmalloc ((shell_len*2) + 1 + sflags_len + 1 - + (line_len*2) + 1); + + (line_len*2) + 1 + EVAL_LEN); ap = new_line; /* Copy SHELL, escaping any characters special to the shell. If we don't escape them, construct_command_argv_internal will @@ -3415,6 +3432,31 @@ construct_command_argv_internal (char *line, char **restp, const char *shell, #ifdef WINDOWS32 command_ptr = ap; #endif + +#if !defined (WINDOWS32) && defined (MAX_ARG_STRLEN) + if (unixy_shell && line_len > MAX_ARG_STRLEN) + { + const char *q; + unsigned j; + memcpy (ap, eval_line, sizeof (eval_line) - 1); + ap += sizeof (eval_line) - 1; + for (j = 1; j <= 2 * line_len / (MAX_ARG_STRLEN - 2); j++) + ap += sprintf (ap, "\\$\\{%u\\}", j); + *ap++ = '\\'; + *ap++ = '"'; + *ap++ = ' '; + /* Copy only the first word of SHELL to $0. */ + for (q = shell; *q != '\0'; ++q) + { + if (isspace ((unsigned char)*q)) + break; + *ap++ = *q; + } + *ap++ = ' '; + } +#endif + args_ptr = ap; + for (p = line; *p != '\0'; ++p) { if (restp != NULL && *p == '\n') @@ -3462,6 +3504,14 @@ construct_command_argv_internal (char *line, char **restp, const char *shell, } #endif *ap++ = *p; +#if !defined (WINDOWS32) && defined (MAX_ARG_STRLEN) + if (unixy_shell && line_len > MAX_ARG_STRLEN + && (ap - args_ptr > (long)(MAX_ARG_STRLEN - 2))) + { + *ap++ = ' '; + args_ptr = ap; + } +#endif } if (ap == new_line + shell_len + sflags_len + 2) { diff --git a/tests/scripts/features/long_command_line b/tests/scripts/features/long_command_line new file mode 100644 index 0000000..3899ac8 --- /dev/null +++ b/tests/scripts/features/long_command_line @@ -0,0 +1,30 @@ +# -*-perl-*- +$description = "Test long command line."; + +$details = ""; + +# Variable names containing UTF8 characters +run_make_test(q! +# 49 characters +ARGS:=one two three four five six seven eight niner ten +# 49*4+3 = 199 characters +ARGS:=$(ARGS) $(ARGS) $(ARGS) $(ARGS) +# 199*4+3 = 799 characters +ARGS:=$(ARGS) $(ARGS) $(ARGS) $(ARGS) +# 799*4+3 = 3199 characters +ARGS:=$(ARGS) $(ARGS) $(ARGS) $(ARGS) +# 3199*4+3 = 12799 characters +ARGS:=$(ARGS) $(ARGS) $(ARGS) $(ARGS) +# 12799*4+3 = 51199 characters +ARGS:=$(ARGS) $(ARGS) $(ARGS) $(ARGS) +# 51199*4+3 = 204799 characters +ARGS:=$(ARGS) $(ARGS) $(ARGS) $(ARGS) +# 24799*2+1 = 409599 characters +#ARGS:=$(ARGS) $(ARGS) + +test: + @: $(ARGS) +!, + '', ""); + +1; -- 2.20.1 ================================================ FILE: packages/devel/mimalloc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mimalloc" PKG_VERSION="2.0.9" PKG_SHA256="4a29edae32a914a706715e2ac8e7e4109e25353212edeed0888f4e3e15db5850" PKG_LICENSE="MIT" PKG_SITE="https://github.com/microsoft/mimalloc" PKG_URL="https://github.com/microsoft/mimalloc/archive/refs/tags/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="cmake:host ninja:host" PKG_LONGDESC="mimalloc (pronounced "me-malloc") is a general purpose allocator with excellent performance characteristics" PKG_CMAKE_OPTS_HOST="-DMI_SECURE=OFF \ -DMI_DEBUG_FULL=OFF \ -DMI_OVERRIDE=ON \ -DMI_XMALLOC=OFF \ -DMI_SHOW_ERRORS=OFF \ -DMI_USE_CXX=OFF \ -DMI_SEE_ASM=OFF \ -DMI_LOCAL_DYNAMIC_TLS=OFF \ -DMI_BUILD_SHARED=ON \ -DMI_BUILD_STATIC=OFF \ -DMI_BUILD_OBJECT=OFF \ -DMI_BUILD_TESTS=OFF \ -DMI_DEBUG_TSAN=OFF \ -DMI_DEBUG_UBSAN=OFF \ -DMI_SKIP_COLLECT_ON_EXIT=OFF" ================================================ FILE: packages/devel/mold/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mold" PKG_VERSION="1.10.1" PKG_SHA256="19e4aa16b249b7e6d2e0897aa1843a048a0780f5c76d8d7e643ab3a4be1e4787" PKG_LICENSE="AGPL-3.0-or-later" PKG_SITE="https://github.com/rui314/mold" PKG_URL="https://github.com/rui314/mold/archive/refs/tags/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="cmake:host zlib:host zstd:host openssl:host tbb:host mimalloc:host" PKG_LONGDESC="mold is a faster drop-in replacement for existing Unix linkers" PKG_CMAKE_OPTS_HOST="-DCMAKE_INSTALL_LIBDIR="${TOOLCHAIN}/${TARGET_NAME}/lib" -DCMAKE_INSTALL_BINDIR="${TARGET_NAME}/bin" \ -DCMAKE_INSTALL_LIBEXECDIR="${TARGET_NAME}" \ -DMOLD_LTO=ON \ -DMOLD_MOSTLY_STATIC=ON \ -DMOLD_USE_SYSTEM_MIMALLOC=ON \ -DMOLD_USE_SYSTEM_TBB=ON" post_makeinstall_host() { ln -sf ${TOOLCHAIN}/${TARGET_NAME}/bin/mold ${TARGET_PREFIX}ld.mold } ================================================ FILE: packages/devel/mold/patches/mold-999.01-PR740-allow-custom-mold-binary-install-path.patch ================================================ From f7f2ef6182d058f7c58401d9278aa3136cb996f5 Mon Sep 17 00:00:00 2001 From: SupervisedThinking Date: Thu, 29 Sep 2022 11:49:57 +0200 Subject: [PATCH] CMakeLists: allow custom mold binary install path - https://cmake.org/cmake/help/latest/command/install.html - ${CMAKE_INSTALL_BINDIR} defaults to bin if not set --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7136cf2b..4542f915 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -287,7 +287,7 @@ if(BUILD_TESTING) endif() if(NOT CMAKE_SKIP_INSTALL_RULES) - install(TARGETS mold RUNTIME DESTINATION bin) + install(TARGETS mold RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) install(FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR}) install(FILES docs/mold.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/) install(CODE " ================================================ FILE: packages/devel/mpc/package.mk ================================================ # 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="mpc" PKG_VERSION="1.3.1" PKG_SHA256="ab642492f5cf882b74aa0cb730cd410a81edcdbec895183ce930e706c1c759b8" PKG_LICENSE="LGPL" PKG_SITE="https://www.multiprecision.org" PKG_URL="http://ftpmirror.gnu.org/mpc/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="ccache:host gmp:host mpfr:host" PKG_LONGDESC="A C library for the arithmetic of complex numbers with arbitrarily high precision and correct rounding of the result." PKG_CONFIGURE_OPTS_HOST="--target=${TARGET_NAME} \ --enable-static --disable-shared \ --with-gmp=${TOOLCHAIN} \ --with-mpfr=${TOOLCHAIN}" ================================================ FILE: packages/devel/mpfr/package.mk ================================================ # 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="mpfr" PKG_VERSION="4.1.1" PKG_SHA256="ffd195bd567dbaffc3b98b23fd00aad0537680c9896171e44fe3ff79e28ac33d" PKG_LICENSE="LGPL" PKG_SITE="http://www.mpfr.org/" PKG_URL="http://ftpmirror.gnu.org/mpfr/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="ccache:host gmp:host" PKG_LONGDESC="A C library for multiple-precision floating-point computations with exact rounding." PKG_CONFIGURE_OPTS_HOST="--target=${TARGET_NAME} \ --enable-static --disable-shared \ --prefix=${TOOLCHAIN} \ --with-gmp-lib=${TOOLCHAIN}/lib \ --with-gmp-include=${TOOLCHAIN}/include" ================================================ FILE: packages/devel/ncurses/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ncurses" PKG_VERSION="6.3" PKG_SHA256="97fc51ac2b085d4cde31ef4d2c3122c21abc217e9090a43a30fc5ec21684e059" PKG_LICENSE="MIT" PKG_SITE="http://www.gnu.org/software/ncurses/" PKG_URL="http://invisible-mirror.net/archives/ncurses/ncurses-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="ccache:host" PKG_DEPENDS_TARGET="toolchain zlib ncurses:host" PKG_LONGDESC="A library is a free software emulation of curses in System V Release 4.0, and more." PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--without-ada \ --without-cxx \ --without-cxx-binding \ --disable-db-install \ --without-manpages \ --without-progs \ --without-tests \ --without-shared \ --with-normal \ --without-debug \ --without-profile \ --without-ticlib \ --without-gpm \ --without-dbmalloc \ --without-dmalloc \ --disable-rpath \ --disable-database \ --with-fallbacks=linux,screen,xterm,xterm-color,dumb,st-256color \ --with-termpath=/storage/.config/termcap \ --disable-big-core \ --enable-termcap \ --enable-getcap \ --disable-getcap-cache \ --enable-symlinks \ --disable-bsdpad \ --without-rcs-ids \ --enable-ext-funcs \ --disable-const \ --enable-no-padding \ --disable-sigwinch \ --enable-pc-files \ --with-pkg-config-libdir=/usr/lib/pkgconfig \ --disable-tcap-names \ --without-develop \ --disable-hard-tabs \ --disable-xmc-glitch \ --disable-hashmap \ --disable-safe-sprintf \ --disable-scroll-hints \ --enable-widec \ --disable-echo \ --disable-warnings \ --disable-home-terminfo \ --disable-assertions \ --enable-leaks" PKG_CONFIGURE_OPTS_HOST="--enable-termcap \ --with-shared \ --enable-pc-files \ --without-manpages \ --without-tests" post_makeinstall_target() { local f cp misc/ncurses-config ${TOOLCHAIN}/bin chmod +x ${TOOLCHAIN}/bin/ncurses-config sed -e "s:\(['=\" ]\)/usr:\\1${PKG_ORIG_SYSROOT_PREFIX}/usr:g" -i ${TOOLCHAIN}/bin/ncurses-config rm -f ${TOOLCHAIN}/bin/ncurses6-config rm -rf ${INSTALL}/usr/bin # create links to be compatible with any ncurses include path and lib names ln -sf . ${SYSROOT_PREFIX}/usr/include/ncursesw ln -sf . ${SYSROOT_PREFIX}/usr/include/ncurses for f in form menu ncurses panel; do ln -sf lib${f}w.a ${SYSROOT_PREFIX}/usr/lib/lib${f}.a ln -sf ${f}w.pc ${SYSROOT_PREFIX}/usr/lib/pkgconfig/${f}.pc done } ================================================ FILE: packages/devel/ncurses/patches/ncurses-001-terminfo-xterm.patch ================================================ Remove recent xterm terminfo features to be compatible with other emulations --- a/misc/terminfo.src 2021-03-20 22:45:39.000000000 +0100 +++ b/misc/terminfo.src 2021-06-01 23:53:10.335516419 +0200 @@ -4808,8 +4808,8 @@ xterm-xfree86|xterm terminal emulator (X xterm+nofkeys|building block for xterm fkey-variants, npc, kcbt=\E[Z, kent=\EOM, nel=\EE, use=ecma+index, - use=ansi+rep, use=ecma+strikeout, use=vt420+lrmm, - use=xterm+sm+1006, use=xterm+tmux, use=ecma+italics, + use=ecma+strikeout, use=vt420+lrmm, + use=xterm+sm+1005, use=xterm+tmux, use=ecma+italics, use=xterm+keypad, use=xterm-basic, # This version reflects the current xterm features. ================================================ FILE: packages/devel/ncurses/patches/ncurses-002-alloc-fallbacks.patch ================================================ Fix freeing not allocated fallback entries by allocating a copy. --- a/ncurses/tinfo/tinfo_driver.c 2018-11-24 23:17:03.000000000 +0100 +++ b/ncurses/tinfo/tinfo_driver.c 2018-12-29 10:27:19.000000000 +0100 @@ -180,6 +180,8 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * T if (status != TGETENT_YES) { const TERMTYPE2 *fallback = _nc_fallback2(tname); + if (fallback) + fallback = _nc_copy_entry(fallback); if (fallback) { T(("found fallback entry")); TerminalType(termp) = *fallback; ================================================ FILE: packages/devel/ncurses/patches/ncurses-003-fix_hints.patch ================================================ Fix USE_SCROLL_HINTS/USE_HASHMAP logic --- a/ncurses/curses.priv.h 2018-12-16 02:16:58.000000000 +0100 +++ a/ncurses/curses.priv.h 2021-05-30 00:12:14.086528124 +0200 @@ -258,10 +258,9 @@ extern NCURSES_EXPORT(void *) _nc_memmov /* * Scroll hints are useless when hashmap is used */ -#if !USE_SCROLL_HINTS -#if !USE_HASHMAP -#define USE_SCROLL_HINTS 1 -#else +#if USE_SCROLL_HINTS +#if USE_HASHMAP +#undef USE_SCROLL_HINTS #define USE_SCROLL_HINTS 0 #endif #endif ================================================ FILE: packages/devel/ncurses/patches/ncurses-004-fix_configure_pkgconfig.patch ================================================ Fix configure option --with-pkg-config-libdir is broken for cross compilation --- a/configure 2021-10-17 17:12:23.000000000 +0200 +++ b/configure 2021-11-26 00:27:00.224815736 +0100 @@ -4229,7 +4229,7 @@ echo $ECHO_N "checking for first directo cf_pkg_config_path=none for cf_config in $cf_search_path do - if test -d "$cf_config" + if test -n "$cf_config" then cf_pkg_config_path=$cf_config break ================================================ FILE: packages/devel/pcre/package.mk ================================================ # 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) PKG_NAME="pcre" PKG_VERSION="8.45" PKG_SHA256="4dae6fdcd2bb0bb6c37b5f97c33c2be954da743985369cddac3546e3218bffb8" PKG_LICENSE="OSS" PKG_SITE="http://www.pcre.org/" PKG_URL="${SOURCEFORGE_SRC}/pcre/${PKG_NAME}/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain pcre:host" PKG_LONGDESC="A set of functions that implement regular expression pattern matching." PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_HOST="--prefix=${TOOLCHAIN} \ --enable-static \ --enable-utf8 \ --enable-unicode-properties \ --with-gnu-ld" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --enable-utf8 \ --enable-pcre16 \ --enable-unicode-properties \ --with-gnu-ld" post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin cp ${PKG_NAME}-config ${TOOLCHAIN}/bin sed -e "s:\(['= ]\)/usr:\\1${PKG_ORIG_SYSROOT_PREFIX}/usr:g" -i ${TOOLCHAIN}/bin/${PKG_NAME}-config chmod +x ${TOOLCHAIN}/bin/${PKG_NAME}-config } ================================================ FILE: packages/devel/pcre2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pcre2" PKG_VERSION="10.42" PKG_SHA256="8d36cd8cb6ea2a4c2bb358ff6411b0c788633a2a45dabbf1aeb4b701d1b5e840" PKG_LICENSE="BSD" PKG_SITE="http://www.pcre.org/" PKG_URL="https://github.com/PCRE2Project/pcre2/releases/download/pcre2-${PKG_VERSION}/pcre2-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A set of functions that implement regular expression pattern matching using the same syntax." PKG_BUILD_FLAGS="+pic" PKG_CMAKE_OPTS_HOST="-DBUILD_SHARED_LIBS=OFF \ -DBUILD_STATIC_LIBS=ON \ -DPCRE2_STATIC_PIC=ON \ -DPCRE2_BUILD_PCRE2_8=ON \ -DPCRE2_BUILD_PCRE2_16=ON \ -DPCRE2_BUILD_PCRE2_32=ON \ -DPCRE2_SUPPORT_JIT=ON \ -DPCRE2_BUILD_TESTS=OFF \ -DPCRE2_SUPPORT_LIBEDIT=OFF \ -DPCRE2_SUPPORT_LIBREADLINE=OFF" PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=OFF \ -DPCRE2_BUILD_PCRE2_16=ON \ -DPCRE2_SUPPORT_LIBREADLINE=OFF \ -DPCRE2_STATIC_PIC=ON" PKG_CMAKE_OPTS_HOST="-DBUILD_SHARED_LIBS=OFF \ -DPCRE2_BUILD_PCRE2_16=ON \ -DPCRE2_SUPPORT_LIBREADLINE=OFF \ -DPCRE2_STATIC_PIC=ON" post_unpack() { sed -e 's|^INSTALL(FILES ${man1} DESTINATION man/man1)||' \ -e 's|^INSTALL(FILES ${man3} DESTINATION man/man3)||' \ -e 's|^INSTALL(FILES ${html} DESTINATION share/doc/pcre2/html)||' \ -i ${PKG_BUILD}/CMakeLists.txt } post_makeinstall_target() { safe_remove ${INSTALL}/usr/bin } ================================================ FILE: packages/devel/pkg-config/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="pkg-config" PKG_VERSION="0.29.2" PKG_SHA256="6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591" PKG_LICENSE="GPL" PKG_SITE="http://www.freedesktop.org/software/pkgconfig/" PKG_URL="http://pkg-config.freedesktop.org/releases/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="gettext:host" PKG_LONGDESC="A system for managing library compile/link flags that works with automake and autoconf." PKG_BUILD_FLAGS="+local-cc" PKG_CONFIGURE_OPTS_HOST="--disable-silent-rules \ --with-internal-glib --disable-dtrace \ --with-gnu-ld" post_makeinstall_host() { mkdir -p ${SYSROOT_PREFIX}/usr/share/aclocal cp pkg.m4 ${SYSROOT_PREFIX}/usr/share/aclocal } ================================================ FILE: packages/devel/pkg-config/patches/0001-Add-support-for-multiple-sysroots.patch ================================================ From 64a39cd046040552729d32caef2a753b7f3dfc9c Mon Sep 17 00:00:00 2001 From: Andre Heider Date: Thu, 19 Dec 2019 17:42:01 +0100 Subject: [PATCH] Add support for multiple sysroots Introduce PKG_CONFIG_SYSROOT_BASE, which can be set to a base directory under which multiple install prefixes exist. Now it's possible to: * configure and install libfoo with --prefix=/base/foo/usr * configure and install libbar with --prefix=/base/bar/usr * export PKG_CONFIG_SYSROOT_BASE=/base and pkg-config attempts to detect the sysroot directory for each .pc file located under the base directory, and sets its sysroot accordingly. Example with libfoo.pc and libbar.pc both contain includedir=/usr/include $ PKG_CONFIG_PATH=/base/foo/usr/lib/pkg-config:/base/bar/usr/lib/pkgconfig \ PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 \ pkg-config --cflags libfoo libbar Will print "-I/base/foo/usr/include -I/base/bar/usr/include" --- main.c | 5 ++++ parse.c | 2 ++ pkg.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- pkg.h | 2 ++ 4 files changed, 84 insertions(+), 3 deletions(-) diff --git a/main.c b/main.c index 9b27d9a..409d474 100644 --- a/main.c +++ b/main.c @@ -35,6 +35,7 @@ #undef STRICT #endif +GString *pcsysrootbase = NULL; char *pcsysrootdir = NULL; char *pkg_config_pc_path = NULL; @@ -531,6 +532,8 @@ main (int argc, char **argv) add_search_dirs(pkg_config_pc_path, G_SEARCHPATH_SEPARATOR_S); } + pcsysrootbase = g_string_new(getenv("PKG_CONFIG_SYSROOT_BASE")); + pcsysrootdir = getenv ("PKG_CONFIG_SYSROOT_DIR"); if (pcsysrootdir) { @@ -834,5 +837,7 @@ main (int argc, char **argv) if (need_newline) printf ("\n"); + g_string_free(pcsysrootbase, FALSE); + return 0; } diff --git a/parse.c b/parse.c index 6e9907c..bea87f3 100644 --- a/parse.c +++ b/parse.c @@ -634,6 +634,7 @@ static void _do_parse_libs (Package *pkg, int argc, char **argv) while (i < argc) { Flag *flag = g_new (Flag, 1); + flag->pkg = pkg; char *tmp = trim_string (argv[i]); char *arg = strdup_escape_shell(tmp); char *p; @@ -837,6 +838,7 @@ parse_cflags (Package *pkg, const char *str, const char *path) while (i < argc) { Flag *flag = g_new (Flag, 1); + flag->pkg = pkg; char *tmp = trim_string (argv[i]); char *arg = strdup_escape_shell(tmp); char *p = arg; diff --git a/pkg.c b/pkg.c index f29ecc7..ecae401 100644 --- a/pkg.c +++ b/pkg.c @@ -408,6 +408,9 @@ flag_list_strip_duplicates (GList *list) if (cur->type == prev->type && g_strcmp0 (cur->arg, prev->arg) == 0) { + if (cur->type & (CFLAGS_I | LIBS_L) && cur->pkg != prev->pkg) + continue; + /* Remove the duplicate flag from the list and move to the last * element to prepare for the next iteration. */ GList *dup = tmp; @@ -421,19 +424,75 @@ flag_list_strip_duplicates (GList *list) return list; } +static const struct _suffix { + const char * const suffix; + const size_t len; +} suffixes[] = { + { + "/usr/local/lib/pkgconfig", + 24, + }, + { + "/usr/local/share/pkgconfig", + 26, + }, + { + "/usr/lib/pkgconfig", + 18, + }, + { + "/usr/share/pkgconfig", + 20, + }, + { + "/lib/pkgconfig", + 14, + }, + { + "/share/pkgconfig", + 16, + }, +}; + +static void +get_sysroot(const Package *pkg, GString *dst) +{ + if (pcsysrootbase->len && !strncmp(pkg->pcfiledir, pcsysrootbase->str, pcsysrootbase->len)) + { + size_t len = strlen(pkg->pcfiledir); + + for (int i = 0; i < sizeof(suffixes) / sizeof(*suffixes); i++) + { + const struct _suffix *x = &suffixes[i]; + + if (len > x->len && !strcmp(pkg->pcfiledir + len - x->len, x->suffix)) + { + g_string_assign(dst, pkg->pcfiledir); + g_string_truncate(dst, dst->len - x->len); + return; + } + } + } + + g_string_assign(dst, pcsysrootdir ? pcsysrootdir : ""); +} + static char * flag_list_to_string (GList *list) { GList *tmp; GString *str = g_string_new (""); + GString *sysroot = g_string_new (""); + GString *cmp = g_string_new(pcsysrootbase->len ? pcsysrootbase->str : pcsysrootdir); char *retval; tmp = list; while (tmp != NULL) { Flag *flag = tmp->data; + get_sysroot(flag->pkg, sysroot); char *tmpstr = flag->arg; - if (pcsysrootdir != NULL && flag->type & (CFLAGS_I | LIBS_L)) { + if (sysroot->len && flag->type & (CFLAGS_I | LIBS_L) && strncmp(tmpstr + 2, cmp->str, cmp->len)) { /* Handle non-I Cflags like -isystem */ if (flag->type & CFLAGS_I && strncmp (tmpstr, "-I", 2) != 0) { char *space = strchr (tmpstr, ' '); @@ -441,14 +500,17 @@ flag_list_to_string (GList *list) /* Ensure this has a separate arg */ g_assert (space != NULL && space[1] != '\0'); g_string_append_len (str, tmpstr, space - tmpstr + 1); - g_string_append (str, pcsysrootdir); + g_string_append (str, sysroot->str); g_string_append (str, space + 1); } else { g_string_append_c (str, '-'); g_string_append_c (str, tmpstr[1]); - g_string_append (str, pcsysrootdir); + g_string_append (str, sysroot->str); g_string_append (str, tmpstr+2); } + } else if (sysroot->len && !strncmp(tmpstr, "/usr", 4) && strncmp(tmpstr, cmp->str, cmp->len)) { + g_string_append (str, sysroot->str); + g_string_append (str, tmpstr); } else { g_string_append (str, tmpstr); } @@ -458,6 +520,8 @@ flag_list_to_string (GList *list) retval = str->str; g_string_free (str, FALSE); + g_string_free (cmp, FALSE); + g_string_free (sysroot, TRUE); return retval; } @@ -1046,6 +1110,8 @@ packages_get_var (GList *pkgs, { GList *tmp; GString *str; + GString *sysroot = g_string_new (""); + GString *cmp = g_string_new(pcsysrootbase->len ? pcsysrootbase->str : pcsysrootdir); str = g_string_new (NULL); @@ -1055,11 +1121,14 @@ packages_get_var (GList *pkgs, Package *pkg = tmp->data; char *var; + get_sysroot(pkg, sysroot); var = parse_package_variable (pkg, varname); if (var) { if (str->len > 0) g_string_append_c (str, ' '); + if (sysroot->len && (!strcmp(varname, "includedir") || !strcmp(varname, "libdir")) && strncmp(var, sysroot->str, sysroot->len)) + g_string_append(str, sysroot->str); g_string_append (str, var); g_free (var); } @@ -1067,6 +1136,9 @@ packages_get_var (GList *pkgs, tmp = g_list_next (tmp); } + g_string_free(cmp, FALSE); + g_string_free(sysroot, TRUE); + return g_string_free (str, FALSE); } diff --git a/pkg.h b/pkg.h index c6732bd..58edf38 100644 --- a/pkg.h +++ b/pkg.h @@ -53,6 +53,7 @@ struct Flag_ { FlagType type; char *arg; + Package *pkg; }; struct RequiredVersion_ @@ -126,6 +127,7 @@ void disable_requires_private(void); /* If TRUE, do not automatically prefer uninstalled versions */ extern gboolean disable_uninstalled; +extern GString *pcsysrootbase; extern char *pcsysrootdir; /* pkg-config default search path. On Windows the current pkg-config install -- 2.24.0 ================================================ FILE: packages/devel/popt/package.mk ================================================ # 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) PKG_NAME="popt" PKG_VERSION="1.19" PKG_SHA256="c25a4838fc8e4c1c8aacb8bd620edb3084a3d63bf8987fdad3ca2758c63240f9" PKG_LICENSE="GPL" PKG_SITE="https://github.com/rpm-software-management/popt" PKG_URL="http://ftp.rpm.org/popt/releases/popt-1.x/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="The popt library exists essentially for parsing command-line options." pre_configure_target() { cd ${PKG_BUILD} rm -rf .${TARGET_NAME} } pre_configure_host() { cd ${PKG_BUILD} rm -rf .${HOST_NAME} } ================================================ FILE: packages/devel/rapidjson/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rapidjson" PKG_VERSION="1.1.0" PKG_SHA256="bf7ced29704a1e696fbccf2a2b4ea068e7774fa37f6d7dd4039d0787f8bed98e" PKG_LICENSE="MIT" PKG_SITE="https://github.com/miloyip/rapidjson" PKG_URL="https://github.com/miloyip/rapidjson/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A fast JSON parser/generator for C++ with both SAX/DOM style API" PKG_CMAKE_OPTS_TARGET="-DRAPIDJSON_BUILD_DOC=OFF \ -DRAPIDJSON_BUILD_EXAMPLES=OFF \ -DRAPIDJSON_BUILD_TESTS=OFF \ -DRAPIDJSON_BUILD_THIRDPARTY_GTEST=OFF \ -DRAPIDJSON_BUILD_ASAN=OFF \ -DRAPIDJSON_BUILD_UBSAN=OFF \ -DRAPIDJSON_HAS_STDSTRING=ON" ================================================ FILE: packages/devel/rapidjson/patches/rapidjson-0001-remove_custom_cxx_flags.patch ================================================ diff --git a/CMakeLists.txt b/CMakeLists.txt index ceda71b..efb259e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,7 +50,6 @@ if(CCACHE_FOUND) endif(CCACHE_FOUND) if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -Wall -Wextra -Werror") if (RAPIDJSON_BUILD_CXX11) if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7.0") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") @@ -73,7 +72,6 @@ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") endif() endif() elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -Wall -Wextra -Werror -Wno-missing-field-initializers") if (RAPIDJSON_BUILD_CXX11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") endif() @@ -88,7 +86,6 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") endif() endif() elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") - add_definitions(-D_CRT_SECURE_NO_WARNINGS=1) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc") endif() ================================================ FILE: packages/devel/readline/package.mk ================================================ # 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="readline" PKG_VERSION="8.2" PKG_SHA256="3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" PKG_LICENSE="MIT" PKG_SITE="http://www.gnu.org/software/readline/" PKG_URL="http://ftpmirror.gnu.org/readline/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ncurses" PKG_LONGDESC="The GNU Readline library provides a set of functions for use by applications that allow users to edit command lines as they are typed in." PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="bash_cv_wcwidth_broken=no \ --disable-shared \ --enable-static \ --with-curses" post_makeinstall_target() { # fix static library sed -i 's/-lreadline/-lreadline -lncursesw/' ${SYSROOT_PREFIX}/usr/lib/pkgconfig/readline.pc rm -rf ${INSTALL}/usr/share/readline } ================================================ FILE: packages/devel/shared-mime-info/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="shared-mime-info" PKG_VERSION="2.2" PKG_SHA256="418c480019d9865f67f922dfb88de00e9f38bf971205d55cdffab50432919e61" PKG_LICENSE="GPL-2.0-only" PKG_SITE="https://freedesktop.org/wiki/Software/shared-mime-info/" PKG_URL="https://gitlab.freedesktop.org/xdg/${PKG_NAME}/-/archive/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_HOST="toolchain:host glib:host libxml2:host gettext:host itstool:host" PKG_DEPENDS_TARGET="toolchain glib libxml2 gettext shared-mime-info:host" PKG_LONGDESC="The shared-mime-info package contains the core database of common types." PKG_BUILD_FLAGS="-parallel" configure_package() { # Sway Support if [ ! "${WINDOWMANAGER}" = "sway" ]; then PKG_BUILD_FLAGS+=" -sysroot" fi } PKG_MESON_OPTS_HOST="-Dupdate-mimedb=false" PKG_MESON_OPTS_TARGET="-Dupdate-mimedb=false" post_makeinstall_target() { # Create /usr/share/mime/mime.cache if [ "${WINDOWMANAGER}" = "sway" ]; then ${TOOLCHAIN}/bin/update-mime-database ${INSTALL}/usr/share/mime fi } ================================================ FILE: packages/devel/slang/package.mk ================================================ # 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) PKG_NAME="slang" PKG_VERSION="2.3.3" PKG_SHA256="f9145054ae131973c61208ea82486d5dd10e3c5cdad23b7c4a0617743c8f5a18" PKG_LICENSE="GPL" PKG_SITE="http://www.jedsoft.org/slang/" PKG_URL="https://www.jedsoft.org/releases/slang/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain pcre" PKG_LONGDESC="A library designed to allow a developer to create robust multi-platform software." PKG_BUILD_FLAGS="-parallel" PKG_CONFIGURE_OPTS_TARGET="--without-onig" pre_configure_target() { # slang fails to build in subdirs cd ${PKG_BUILD} sed -i 's|RPATH=".*"|RPATH=""|' configure rm -rf .${TARGET_NAME} } pre_configure_host() { # slang fails to build in subdirs cd ${PKG_BUILD} rm -rf .${HOST_NAME} } ================================================ FILE: packages/devel/spdlog/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="spdlog" PKG_VERSION="1.11.0" PKG_SHA256="ca5cae8d6cac15dae0ec63b21d6ad3530070650f68076f3a4a862ca293a858bb" PKG_LICENSE="MIT" PKG_SITE="https://github.com/gabime/spdlog" PKG_URL="https://github.com/gabime/spdlog/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libfmt" PKG_LONGDESC="Very fast, header only, C++ logging library." PKG_CMAKE_OPTS_TARGET="-DCMAKE_CXX_STANDARD=14 \ -DCMAKE_CXX_EXTENSIONS:BOOL=OFF \ -DSPDLOG_BUILD_SHARED=ON \ -DSPDLOG_FMT_EXTERNAL=ON \ -DSPDLOG_BUILD_EXAMPLE=OFF \ -DSPDLOG_BUILD_TESTS=OFF" ================================================ FILE: packages/devel/swig/package.mk ================================================ # 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="swig" PKG_VERSION="4.1.1" PKG_SHA256="2af08aced8fcd65cdb5cc62426768914bedc735b1c250325203716f78e39ac9b" PKG_LICENSE="GPL" PKG_SITE="http://www.swig.org" PKG_URL="${SOURCEFORGE_SRC}/swig/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="ccache:host" PKG_LONGDESC="SWIG is a software development tool that connects programs written in C and C++ with a variety of high-level programming languages." PKG_TOOLCHAIN="configure" PKG_CONFIGURE_OPTS_HOST="--program-suffix=4.0 \ --with-pcre-prefix=${TOOLCHAIN} \ --with-boost=no \ --without-pcre \ --without-x \ --without-tcl \ --without-python \ --without-python3 \ --without-perl5 \ --without-octave \ --without-java \ --without-gcj \ --without-android \ --without-guile \ --without-mzscheme \ --without-ruby \ --without-php \ --without-ocaml \ --without-pike \ --without-chicken \ --without-csharp \ --without-lua \ --without-allegrocl \ --without-clisp \ --without-r \ --without-go \ --without-d" post_makeinstall_host() { ln -sf swig4.0 ${TOOLCHAIN}/bin/swig } ================================================ FILE: packages/devel/tbb/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tbb" PKG_VERSION="2021.8.0" PKG_SHA256="eee380323bb7ce864355ed9431f85c43955faaae9e9bce35c62b372d7ffd9f8b" PKG_LICENSE="Apache-2.0" PKG_SITE="https://github.com/oneapi-src/oneTBB" PKG_URL="https://github.com/oneapi-src/oneTBB/archive/refs/tags/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="cmake:host ninja:host" PKG_LONGDESC="oneTBB is a flexible C++ library that simplifies the work of adding parallelism to complex applications" PKG_CMAKE_OPTS_HOST="-DTBB_TEST=OFF \ -DTBB_EXAMPLES=OFF \ -DTBB_STRICT=OFF \ -DTBB4PY_BUILD=OFF \ -DTBB_BUILD=ON \ -DTBBMALLOC_BUILD=ON \ -DTBBMALLOC_PROXY_BUILD=ON \ -DTBB_CPF=OFF \ -DTBB_FIND_PACKAGE=OFF \ -DTBB_DISABLE_HWLOC_AUTOMATIC_SEARCH=OFF \ -DTBB_ENABLE_IPO=ON" pre_configure_host() { export CXXFLAGS+=" -D__TBB_DYNAMIC_LOAD_ENABLED=0" } ================================================ FILE: packages/devel/tbb/patches/tbb-999.01-PR824-retry-if-pthread_create-fails-with-EAGAIN.patch ================================================ From 3a8bc6478654afcbd219f45e7ea01353c2d57eb6 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Sat, 7 May 2022 19:55:24 +0800 Subject: [PATCH] Retry if pthread_create fails with EAGAIN On many Unix-like systems, pthread_create can fail spuriously even if the running machine has enough resources to spawn a new thread. Therefore, if EAGAIN is returned from pthread_create, we actually have to try again. I observed this issue when running the mold linker (https://github.com/rui314/mold) under a heavy load. mold uses OneTBB for parallelization. As another data point, Go has the same logic to retry on EAGAIN: https://go-review.googlesource.com/c/go/+/33894/ nanosleep is defined in POSIX 2001, so I believe that all Unix-like systems support it. Signed-off-by: Rui Ueyama --- src/tbb/rml_thread_monitor.h | 30 +++++++++++++++- test/CMakeLists.txt | 3 ++ test/tbb/test_pthread_create.cpp | 59 ++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 test/tbb/test_pthread_create.cpp diff --git a/src/tbb/rml_thread_monitor.h b/src/tbb/rml_thread_monitor.h index 13b556380..dc046ba00 100644 src/tbb/rml_thread_monitor.h | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/tbb/rml_thread_monitor.h b/src/tbb/rml_thread_monitor.h index 13b556380..5b844b232 100644 --- a/src/tbb/rml_thread_monitor.h +++ b/src/tbb/rml_thread_monitor.h @@ -31,6 +31,7 @@ #include #include #include +#include #else #error Unsupported platform #endif @@ -183,6 +184,32 @@ inline void thread_monitor::check( int error_code, const char* routine ) { } } +// pthread_create(2) can spuriously fail on Linux. This is a function +// to wrap pthread_create(2) to retry if it fails with EAGAIN. +inline void do_pthread_create(pthread_t *handle, pthread_attr_t *s, void* (*thread_routine)(void*), void* arg) { +#ifdef __linux__ + int tries = 0; + const int max_num_tries = 20; + + for (;;) { + int error_code = pthread_create(handle, s, thread_routine, arg); + if (!error_code) + break; + if (error_code != EAGAIN || tries++ > max_num_tries) { + handle_perror(error_code, "pthread_create has failed"); + break; + } + + // Retry after tries * 1 millisecond. + struct timespec ts = {0, tries * 1000 * 1000}; + nanosleep(&ts, NULL); + } +#else + if (int error_code = pthread_create(handle, s, thread_routine, arg)) + handle_perror(error_code, "pthread_create has failed"); +#endif +} + inline thread_monitor::handle_type thread_monitor::launch( void* (*thread_routine)(void*), void* arg, std::size_t stack_size ) { // FIXME - consider more graceful recovery than just exiting if a thread cannot be launched. // Note that there are some tricky situations to deal with, such that the thread is already @@ -191,8 +218,9 @@ inline thread_monitor::handle_type thread_monitor::launch( void* (*thread_routin check(pthread_attr_init( &s ), "pthread_attr_init has failed"); if( stack_size>0 ) check(pthread_attr_setstacksize( &s, stack_size ), "pthread_attr_setstack_size has failed" ); + pthread_t handle; - check( pthread_create( &handle, &s, thread_routine, arg ), "pthread_create has failed" ); + do_pthread_create(&handle, &s, thread_routine, arg); check( pthread_attr_destroy( &s ), "pthread_attr_destroy has failed" ); return handle; } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index f15679e83..92802b015 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -373,6 +373,9 @@ if (TARGET TBB::tbb) if (APPLE OR ANDROID_PLATFORM) target_link_libraries(test_dynamic_link PRIVATE -rdynamic) # for the test_dynamic_link endif() + if (UNIX AND NOT APPLE) + tbb_add_test(SUBDIR tbb NAME test_pthread_create DEPENDENCIES TBB::tbb) + endif() tbb_add_test(SUBDIR tbb NAME test_collaborative_call_once DEPENDENCIES TBB::tbb) tbb_add_test(SUBDIR tbb NAME test_concurrent_lru_cache DEPENDENCIES TBB::tbb) tbb_add_test(SUBDIR tbb NAME test_concurrent_unordered_map DEPENDENCIES TBB::tbb) diff --git a/test/tbb/test_pthread_create.cpp b/test/tbb/test_pthread_create.cpp new file mode 100644 index 000000000..4cb1f4ea5 --- /dev/null +++ b/test/tbb/test_pthread_create.cpp @@ -0,0 +1,59 @@ +/* + Copyright (c) 2005-2022 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include "common/test.h" +#include "common/utils.h" + +#include +#include +#include +#include +#include +#include +#include + +//! Test that thread pool creation won't be affected with a spurious failure of pthread_create(). +//! \brief \ref error_guessing +TEST_CASE("pthread_create is not affected by fork") { + std::atomic_bool done; + + std::thread thr([&]() { + while (!done) { + pid_t pid = fork(); + CHECK(pid != -1); + + if (pid == 0) { + // child + _exit(0); + } else { + int wstatus; + do { + pid_t pid2 = waitpid(pid, &wstatus, 0); + CHECK(pid2 != -1); + } while (!WIFEXITED(wstatus) && !WIFSIGNALED(wstatus)); + } + } + }); + + for (int i = 0; i < 50; i++) { + tbb::task_scheduler_handle handle{tbb::attach{}}; + tbb::parallel_for(0, 10000, [](int) {}); + tbb::finalize(handle); + } + + done = true; + thr.join(); +} ================================================ FILE: packages/devel/xxd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="xxd" PKG_VERSION="$(get_pkg_version vim)" PKG_LICENSE="VIM" PKG_URL="" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_UNPACK+=" vim" PKG_LONGDESC="make a hexdump or do the reverse" PKG_BUILD_FLAGS="-sysroot" PKG_TOOLCHAIN="manual" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/vim/vim-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } make_host() { ${HOST_CXX} -x c -std=c11 -O3 -Wall -Wextra -Wpedantic -Wconversion -Wsign-conversion ../src/xxd/xxd.c -o xxd } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp -p xxd ${TOOLCHAIN}/bin } ================================================ FILE: packages/devel/yajl/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="yajl" PKG_VERSION="2.1.0" PKG_SHA256="020f55a2dfc979ad63dc99b629b3fea7e7e4b9f20d8b10b856cfcb8850f03c61" PKG_LICENSE="ISC" PKG_SITE="http://lloyd.github.com/yajl/" PKG_URL="${DISTRO_SRC}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A small event-driven (SAX-style) JSON parser." post_makeinstall_target() { mv ${SYSROOT_PREFIX}/usr/lib/libyajl_s.a ${SYSROOT_PREFIX}/usr/lib/libyajl.a rm ${SYSROOT_PREFIX}/usr/lib/libyajl.so* rm -rf ${INSTALL}/usr/bin rm -rf ${INSTALL}/usr/lib } ================================================ FILE: packages/emulation/cyclone68000/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="cyclone68000" PKG_VERSION="66dda842eae01f47f5389b931ec9567fb0bbb6a1" PKG_SHA256="c59900531e35e7303e1172d9bd5d161491b4554983930ad855614252156ea0e0" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/notaz/cyclone68000" PKG_URL="https://github.com/notaz/cyclone68000/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Motorola 68000 emulator written in ARM assembly" PKG_TOOLCHAIN="manual" ================================================ FILE: packages/emulation/libretro-2048/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-2048" PKG_VERSION="331c1de588ed8f8c370dcbc488e5434a3c09f0f2" PKG_SHA256="9b30278e61b8dfe067d8f7cc9cb0d467e16a3d2de995e950b712570d7e4aa195" PKG_LICENSE="Public domain" PKG_SITE="https://github.com/libretro/libretro-2048" PKG_URL="https://github.com/libretro/libretro-2048/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.2048: 2048 for Kodi" PKG_LIBNAME="2048_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="2048_LIB" make_target() { make -f Makefile.libretro } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-atari800/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-atari800" PKG_VERSION="94033288b026fe699bc50703609807aa8075f4dd" PKG_SHA256="4e33976c2de88fdfb1ceaecda99a205419cb19b5125b55835fb3414cef58abf6" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/libretro-atari800" PKG_URL="https://github.com/libretro/libretro-atari800/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="Atari 8-bit computer and 5200 console emulator" PKG_TOOLCHAIN="make" PKG_MAKE_OPTS_TARGET="platform=unix" PKG_LIBNAME="atari800_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="ATARI800_LIB" makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-beetle-bsnes/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-beetle-bsnes" PKG_VERSION="d770563fc3c4bd9abb522952cefb4aa923ba0b91" PKG_SHA256="838693257f9c8924c62ec6d88891fbeca310ac2fd7b8efa3d96775c3b34d4040" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-bsnes-libretro" PKG_URL="https://github.com/libretro/beetle-bsnes-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.beetle-bsnes: Beetle bSNES for Kodi" PKG_LIBNAME="mednafen_snes_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="BEETLE-BSNES_LIB" make_target() { LDFLAGS+=" -ldl" make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-beetle-gba/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-beetle-gba" PKG_VERSION="38182572571a48cb58057cde64b915237c4e2d58" PKG_SHA256="e4eaf64e9160b501cadf983a46b8a2a98c8b590a13ca9082793d9a11e17fdcaf" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-gba-libretro" PKG_URL="https://github.com/libretro/beetle-gba-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.beetle-gba: Beetle GBA for Kodi" PKG_LIBNAME="mednafen_gba_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="BEETLE-GBA_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-beetle-lynx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-beetle-lynx" PKG_VERSION="d718564b468590f6ed8abf5de6d2e9dfab64cb53" PKG_SHA256="b40158ba62f271ac5f9fb3034aa41fa1977b8375583763abd22231ddf0d88ca5" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-lynx-libretro" PKG_URL="https://github.com/libretro/beetle-lynx-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="Standalone port of Mednafen Lynx to libretro, itself a fork of Handy" PKG_LIBNAME="mednafen_lynx_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="BEETLE-LYNX_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-beetle-ngp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-beetle-ngp" PKG_VERSION="65460e3a9ad529f6901caf669abbda11f437ab55" PKG_SHA256="2d866f6be840b5cbcf6c4159b860d8cb0dffd00c540d230c98de48941d12c38e" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-ngp-libretro" PKG_URL="https://github.com/libretro/beetle-ngp-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="Standalone port of Mednafen NGP to the libretro API, itself a fork of Neopop" PKG_LIBNAME="mednafen_ngp_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="BEETLE-NGP_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-beetle-pce-fast/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-beetle-pce-fast" PKG_VERSION="703d0566858bf693996213af7b2a438636d8d991" PKG_SHA256="2a1c7e4251e56e60fd3c7c91ead660055bb97e7417621ec1b04ede688edc3818" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-pce-fast-libretro" PKG_URL="https://github.com/libretro/beetle-pce-fast-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.beetle-pce-fast: Beetle PCE Fast for Kodi" PKG_LIBNAME="mednafen_pce_fast_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="BEETLE-PCE-FAST_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-beetle-pcfx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-beetle-pcfx" PKG_VERSION="06f7ff996051feaf9e0d928bd2bce3c4c35af45a" PKG_SHA256="12545b05a6ec0374de91b3467ee5ec0afae82a3ebccdd6dce0fa66f4f7496db6" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-pcfx-libretro" PKG_URL="https://github.com/libretro/beetle-pcfx-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="Standalone port of Mednafen PCFX to libretro" PKG_LIBNAME="mednafen_pcfx_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="BEETLE-PCFX_LIB" make_target() { case ${TARGET_CPU} in arm1176jzf-s) make platform=armv6-hardfloat ;; cortex-a7|cortex-a8) make platform=armv7-neon-hardfloat ;; cortex-a9|*cortex-a53|cortex-a17) if [ "${TARGET_ARCH}" = "aarch64" ]; then make platform=armv else make platform=armv7-cortexa9-neon-hardfloat fi ;; x86-64) make ;; esac } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-beetle-psx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-beetle-psx" PKG_VERSION="17df2b9b93ba20c520c4592deed4531afc37bc7a" PKG_SHA256="505c0db4bab3ff81bae5230ea52618a48e2ee84e24f1c3783c1ea4d91d9bc6e4" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-psx-libretro" PKG_URL="https://github.com/libretro/beetle-psx-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="Fork of Mednafen PSX" PKG_LIBNAME="mednafen_psx_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="BEETLE-PSX_LIB" PKG_MAKE_OPTS_TARGET="GIT_VERSION=${PKG_VERSION:0:7} LINK_STATIC_LIBCPLUSPLUS=0" makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-beetle-supergrafx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-beetle-supergrafx" PKG_VERSION="bd50eae63ef38f4ff6d61e8f3a782fdac6a3eeb3" PKG_SHA256="e194b968e853b9787bc71eb2a7010be9f2a248d8990fee6a59c855c1be531b0f" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-supergrafx-libretro" PKG_URL="https://github.com/libretro/beetle-supergrafx-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="Standalone port of Mednafen PCE Fast to libretro. This one only emulates a SuperGrafx TG-16" PKG_LIBNAME="mednafen_supergrafx_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="BEETLE-SUPERGRAFX_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-beetle-vb/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-beetle-vb" PKG_VERSION="34996eb1aa7d84ef9bf768628ab0235f85662406" PKG_SHA256="6c9aa6cc8565d77ec3d037f2634fa33b0b21baa52d599c488395ca2c3ab71d98" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-vb-libretro" PKG_URL="https://github.com/libretro/beetle-vb-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="Standalone port of Mednafen VB to libretro" PKG_LIBNAME="mednafen_vb_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="BEETLE-VB_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-beetle-wswan/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-beetle-wswan" PKG_VERSION="4b1bf823fca4c489e13d826913a875b544432828" PKG_SHA256="f4fac412969d0b846552dcf69c29b77d6e4e3eb61f4a0ddd2f08b9fcf1347002" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-wswan-libretro" PKG_URL="https://github.com/libretro/beetle-wswan-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="Standalone port of Mednafen WonderSwan to libretro, itself a fork of Cygne" PKG_LIBNAME="mednafen_wswan_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="BEETLE-WSWAN_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-bluemsx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-bluemsx" PKG_VERSION="acf358be18644a9df0ed9602d63c2f73d4fe605a" PKG_SHA256="2e4a7b5cc6b1eb90436d230591a23d775a3aec8fa26ce36d4443fce26bc05f40" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/blueMSX-libretro" PKG_URL="https://github.com/libretro/blueMSX-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.bluemsx: BlueMSX for Kodi" PKG_LIBNAME="bluemsx_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="BLUEMSX_LIB" make_target() { make -f Makefile.libretro } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-bnes/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-bnes" PKG_VERSION="8e26e89a93bef8eb8992d1921b539dce1792660a" PKG_SHA256="c151e1296b8f6c035014dc62919692097feeebb19ae73294f1b9781edf1921b1" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/bnes-libretro" PKG_URL="https://github.com/libretro/bnes-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.bnes: bNES for Kodi" PKG_LIBNAME="bnes_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="BNES_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-bsnes-mercury-accuracy/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-bsnes-mercury-accuracy" PKG_VERSION="fb9a41fe9bc230a07c4506cad3cbf21d3fa635b4" PKG_SHA256="5217be2136f120f2ed2aa3bd5225c039c6e45d618b88ceed1f607d8e3b3d79b6" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/bsnes-mercury" PKG_URL="https://github.com/libretro/bsnes-mercury/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.beetle-bsnes-accuracy: Beetle bSNES for Kodi" PKG_LIBNAME="bsnes_mercury_accuracy_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="BSNES-MERCURY-ACCURACY_LIB" make_target() { make PROFILE=accuracy } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-bsnes-mercury-accuracy/patches/libretro-bsnes-mercury-accuracy-0001_fix-cross-compile.patch ================================================ From da71b9ec79482c31c37496019792da316626f1f2 Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Sun, 5 Feb 2017 20:40:42 -0800 Subject: [PATCH 2/2] no -O3 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 948f5fb..04e585d 100644 --- a/Makefile +++ b/Makefile @@ -459,7 +459,7 @@ OBJECTS := $(SOURCES_CXX:.cpp=.o) $(SOURCES_C:.c=.o) all: $(TARGET) ifeq ($(DEBUG),0) - FLAGS += -O3 $(EXTRA_GCC_FLAGS) + FLAGS += $(EXTRA_GCC_FLAGS) else FLAGS += -O0 -g endif -- 2.9.3 ================================================ FILE: packages/emulation/libretro-bsnes-mercury-balanced/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-bsnes-mercury-balanced" PKG_VERSION="fb9a41fe9bc230a07c4506cad3cbf21d3fa635b4" PKG_SHA256="5217be2136f120f2ed2aa3bd5225c039c6e45d618b88ceed1f607d8e3b3d79b6" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/bsnes-mercury" PKG_URL="https://github.com/libretro/bsnes-mercury/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.beetle-bsnes-balanced: Beetle bSNES for Kodi" PKG_LIBNAME="bsnes_mercury_balanced_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="BSNES-MERCURY-BALANCED_LIB" make_target() { make PROFILE=balanced } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-bsnes-mercury-balanced/patches/libretro-bsnes-mercury-balanced-0001_fix-cross-compile.patch ================================================ From da71b9ec79482c31c37496019792da316626f1f2 Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Sun, 5 Feb 2017 20:40:42 -0800 Subject: [PATCH 2/2] no -O3 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 948f5fb..04e585d 100644 --- a/Makefile +++ b/Makefile @@ -459,7 +459,7 @@ OBJECTS := $(SOURCES_CXX:.cpp=.o) $(SOURCES_C:.c=.o) all: $(TARGET) ifeq ($(DEBUG),0) - FLAGS += -O3 $(EXTRA_GCC_FLAGS) + FLAGS += $(EXTRA_GCC_FLAGS) else FLAGS += -O0 -g endif -- 2.9.3 ================================================ FILE: packages/emulation/libretro-bsnes-mercury-performance/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-bsnes-mercury-performance" PKG_VERSION="fb9a41fe9bc230a07c4506cad3cbf21d3fa635b4" PKG_SHA256="5217be2136f120f2ed2aa3bd5225c039c6e45d618b88ceed1f607d8e3b3d79b6" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/bsnes-mercury" PKG_URL="https://github.com/libretro/bsnes-mercury/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.beetle-bsnes-performance: Beetle bSNES for Kodi" PKG_LIBNAME="bsnes_mercury_performance_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="BSNES-MERCURY-PERFORMANCE_LIB" make_target() { make PROFILE=performance } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-bsnes-mercury-performance/patches/libretro-bsnes-mercury-performance-0001_fix-cross-compile.patch ================================================ From da71b9ec79482c31c37496019792da316626f1f2 Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Sun, 5 Feb 2017 20:40:42 -0800 Subject: [PATCH 2/2] no -O3 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 948f5fb..04e585d 100644 --- a/Makefile +++ b/Makefile @@ -459,7 +459,7 @@ OBJECTS := $(SOURCES_CXX:.cpp=.o) $(SOURCES_C:.c=.o) all: $(TARGET) ifeq ($(DEBUG),0) - FLAGS += -O3 $(EXTRA_GCC_FLAGS) + FLAGS += $(EXTRA_GCC_FLAGS) else FLAGS += -O0 -g endif -- 2.9.3 ================================================ FILE: packages/emulation/libretro-cap32/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-cap32" PKG_VERSION="22d0475be7f6249669358d02b6cba4bc98abe936" PKG_SHA256="8c564b645035cc475ce308297161c84a4241d710e641542704d58f8c8341f4de" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/libretro-cap32" PKG_URL="https://github.com/libretro/libretro-cap32/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.cap32: cap32 for Kodi" PKG_LIBNAME="cap32_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="CAP32_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-common/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-common" PKG_VERSION="e9a4ccc4a6b05f136ef5358218a5a94ebeccb7cb" PKG_SHA256="553eb4855300a72ac00b79a69749bafa4bc35e9108f012a799901c6cfcaf17cc" PKG_LICENSE="Public domain" PKG_SITE="https://github.com/libretro/libretro-common" PKG_URL="https://github.com/libretro/libretro-common/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="Reusable coding blocks useful for libretro core and frontend development" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p "${SYSROOT_PREFIX}/usr/include/${PKG_NAME}" cp -pR ${PKG_BUILD}/include/* "${SYSROOT_PREFIX}/usr/include/${PKG_NAME}/" } ================================================ FILE: packages/emulation/libretro-dinothawr/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-dinothawr" PKG_VERSION="33fb82a8df4e440f96d19bba38668beaa1b414fc" PKG_SHA256="092c5c97b73605747baa4cfb3156c7ff80ba2128618ee1cc4d8f12900a0d374b" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/Dinothawr" PKG_URL="https://github.com/libretro/Dinothawr/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.dinothawr: dinothawr for Kodi" PKG_LIBNAME="dinothawr_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="DINOTHAWR_LIB" pre_make_target() { if target_has_feature neon; then export HAVE_NEON=1 fi } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-dosbox/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-dosbox" PKG_VERSION="b7b24262c282c0caef2368c87323ff8c381b3102" PKG_SHA256="83d8b06eebc67f85ff7505271330b1f1c8ef6c4233ef85d070b0789eab83c33d" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/dosbox-libretro" PKG_URL="https://github.com/libretro/dosbox-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.dosbox: DOSBox for Kodi" PKG_BUILD_FLAGS="+pic" PKG_LIBNAME="dosbox_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="DOSBOX_LIB" pre_make_target() { export CXXFLAGS="${CXXFLAGS} -std=gnu++11" } make_target() { make -f Makefile.libretro } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-dosbox-pure/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-dosbox-pure" PKG_VERSION="4fdb557e415698aae5bd90b076f76437f5e9b0b4" PKG_SHA256="a523019fd18123eda4dfd04d5ea458d24ce670c0c30c9ce01b2b9be94870968e" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/dosbox-pure" PKG_URL="https://github.com/libretro/dosbox-pure/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.dosbox-pure: DOSBox-Pure for Kodi" PKG_BUILD_FLAGS="+pic" PKG_LIBNAME="dosbox_pure_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="DOSBOX-PURE_LIB" makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-dosbox-pure/patches/libretro-dosbox-pure-001-cross-compile-fix.patch ================================================ --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ SOURCES := \ src/*/*/*.cpp CPUFLAGS := $(MAKE_CPUFLAGS) -STRIPCMD := strip --strip-all +STRIPCMD := ${STRIP} ifneq ($(ISWIN),) OUTNAME := dosbox_pure_libretro.dll CXX ?= g++ @@ -152,6 +152,9 @@ else CXX ?= g++ LDFLAGS := -Wl,--gc-sections -fno-ident COMMONFLAGS += -pthread +ifeq (1,1) # always + CPUFLAGS := +else ifeq ($(CPUFLAGS),) # ARM optimizations PROCCPU := $(shell cat /proc/cpuinfo)) @@ -180,6 +183,7 @@ else CXX := g++-9 endif endif +endif ifeq ($(BUILD),DEBUG) BUILDDIR := debug ================================================ FILE: packages/emulation/libretro-fbneo/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-fbneo" PKG_VERSION="afcd7234fc93b2824f6b8fe1aa80c142a61ad528" PKG_SHA256="94d5f9215a3231ee040a2841e3512e32cc21416e7eec5f6c3b42f1d6eca2a4ea" PKG_LICENSE="OSS" PKG_SITE="https://github.com/libretro/FBNeo" PKG_URL="https://github.com/libretro/FBNeo/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.fbneo: FinalBurn Neo GameClient for Kodi" PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="-gold +lto" PKG_LIBNAME="fbneo_libretro.so" PKG_LIBPATH="src/burner/libretro/${PKG_LIBNAME}" PKG_LIBVAR="FBNEO_LIB" PKG_MAKE_OPTS_TARGET="-C src/burner/libretro/ GIT_VERSION=${PKG_VERSION:0:7}" pre_configure_target() { if [ "${ARCH}" = "arm" ]; then PKG_MAKE_OPTS_TARGET+=" platform=armv" # NEON Support if target_has_feature neon; then PKG_MAKE_OPTS_TARGET+="-neon" fi fi } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-fceumm/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-fceumm" PKG_VERSION="c795a25647614ee68cc3c8c187566fae3acfde60" PKG_SHA256="74be2198a61d561bf513b42d235abd78401a287b3f9ed88eb0acd6b831ea6ee5" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/libretro-fceumm" PKG_URL="https://github.com/libretro/libretro-fceumm/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.fceumm: FCEUmm emulator for Kodi" PKG_LIBNAME="fceumm_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="FCEUMM_LIB" make_target() { make -f Makefile.libretro } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-fmsx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-fmsx" PKG_VERSION="1360c9ff32b390383567774d01fbe5d6dfcadaa3" PKG_SHA256="32f235b88629ac3566f845d721e44e4bc334814c0372f034ce4b8153729bcf2d" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/fmsx-libretro" PKG_URL="https://github.com/libretro/fmsx-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.fmsx: fmsx for Kodi" PKG_LIBNAME="fmsx_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="FMSX_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-fsuae/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-fsuae" PKG_VERSION="db00e95fc7dcbe29f16926ec749e4693136a5c22" PKG_SHA256="3fb34add880330c0d1431fb016b1e7385342f7af91051f0f716f149baab07d6b" PKG_ARCH="x86_64" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/libretro-fsuae" PKG_URL="https://github.com/kodi-game/libretro-fsuae/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host libmpeg2:host glib:host libpng:host" PKG_DEPENDS_TARGET="toolchain glib libmpeg2 openal-soft libpng libretro-fsuae:host" PKG_LONGDESC="FS-UAE amiga emulator." PKG_BUILD_FLAGS="-lto" PKG_TOOLCHAIN="autotools" PKG_LIBNAME="fsuae_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="FSUAE_LIB" if [ "${TARGET_ARCH}" = "arm" ] && target_has_feature neon; then PKG_CONFIGURE_OPTS_TARGET="--disable-jit --enable-neon" fi pre_configure_host() { cd ${PKG_BUILD} rm -rf .${HOST_NAME} # check if this flag is still needed when this package is updated export CFLAGS="${CFLAGS} -fcommon" export ac_cv_func_realloc_0_nonnull=yes } make_host() { make -j1 CC="${CC}" gen } makeinstall_host() { : } pre_configure_target() { cd ${PKG_BUILD} rm -rf .${TARGET_NAME} # check if this flag is still needed when this package is updated export CFLAGS="${CFLAGS} -fcommon" export ac_cv_func_realloc_0_nonnull=yes } make_target() { make CC="${CC}" } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-fuse/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-fuse" PKG_VERSION="3f9344ddf88dfd251d95cffdea615692479e8cc6" PKG_SHA256="5b4f1b5d2eaacca013a46ed9a7105162500d15ed9d25da3f88b212226cd999e2" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/fuse-libretro" PKG_URL="https://github.com/libretro/fuse-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.fuse: fuse for Kodi" PKG_LIBNAME="fuse_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="FUSE_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-gambatte/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-gambatte" PKG_VERSION="5ae3727f51798b1da437429f7559ffb36c575127" PKG_SHA256="81465ee673c8f64ad07a18603aeaf9161a425f84dff245fa95bc78b71ea71749" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/gambatte-libretro" PKG_URL="https://github.com/libretro/gambatte-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.gambatte: Gambatte for Kodi" PKG_LIBNAME="gambatte_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="GAMBATTE_LIB" makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-genplus/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-genplus" PKG_VERSION="118e2b83873beba1a2f154a8bad8a02bdd8ea98d" PKG_SHA256="b6599120b736b2579cf56725b7eff8454f469c42d5039eaf6524dbb6d138eff0" PKG_LICENSE="Modified BSD / LGPLv2.1" PKG_SITE="https://github.com/libretro/Genesis-Plus-GX" PKG_URL="https://github.com/libretro/Genesis-Plus-GX/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.genplus: Genesis Plus GX for Kodi" PKG_TOOLCHAIN="manual" PKG_LIBNAME="genesis_plus_gx_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="GENPLUS_LIB" make_target() { if [ "${ARCH}" = "arm" ]; then CFLAGS+=" -DALIGN_LONG" fi make -f Makefile.libretro GIT_VERSION=${PKG_VERSION} } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-gw/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-gw" PKG_VERSION="19a1cb3105ca4a82139fb4994e7995fd956f6f8d" PKG_SHA256="26ec953669e2fc817c448797d43b0434340c3a9ee43ea02569a5a83eb39ffccb" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/gw-libretro" PKG_URL="https://github.com/libretro/gw-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.gw: gw for Kodi" PKG_LIBNAME="gw_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="GW_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-handy/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-handy" PKG_VERSION="7c2dbcb46a26cdb2355ccb4e982460095a55ba44" PKG_SHA256="4f15dcfa77cd94995fc72c205acaf242c2a45cf6ea18d244563994bfc54c9a0b" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/libretro-handy" PKG_URL="https://github.com/libretro/libretro-handy/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.handy: handy for Kodi" PKG_LIBNAME="handy_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="HANDY_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-hatari/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-hatari" PKG_VERSION="1ebf0a0488580ef95c0b28f02223b31813c867c5" PKG_SHA256="520b3666a8cf795a89f8bf322dc77749cf8b1994a1f613f098cd6d4ed5382011" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/hatari" PKG_URL="https://github.com/libretro/hatari/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.hatari: hatari for Kodi" PKG_TOOLCHAIN="manual" PKG_LIBNAME="hatari_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="HATARI_LIB" make_target() { cd ${PKG_BUILD} make -f Makefile.libretro } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-mame2000/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-mame2000" PKG_VERSION="0208517404e841fce0c094f1a2776a0e1c6c101d" PKG_SHA256="7981c04b3efb9a3c4d31cb05c56745b729da0aea01f0b2543ee9e25a2c53aced" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/mame2000-libretro" PKG_URL="https://github.com/libretro/mame2000-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="2000 version of MAME (0.37b5) for libretro" PKG_LIBNAME="mame2000_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="MAME2000_LIB" make_target() { if [ "${TARGET_ARCH}" = "arm" ]; then make ARM=1 else sed -i "s|IS_X86 = 1|IS_X86 = 0|g" Makefile make fi } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-mame2003/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-mame2003" PKG_VERSION="b1cc49cf1d8bbef88b890e1c2a315a39d009171b" PKG_SHA256="c6c262d8997abadd09447be9a428b442c82898abad71cda48a8af36cb16493ae" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/mame2003-libretro" PKG_URL="https://github.com/libretro/mame2003-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Late 2003 version of MAME (0.78) for libretro" PKG_LIBNAME="mame2003_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="MAME2003_LIB" configure_target() { export LD="${CC}" } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-mame2003_plus/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-mame2003_plus" PKG_VERSION="0b9309d9d86aea2457df74709e997bea37899475" PKG_SHA256="c2909c4149f3cb329ebac1555c637eabfa38a2a75cf55c1287274c0563deda71" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/mame2003-plus-libretro" PKG_URL="https://github.com/libretro/mame2003-plus-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Updated 2018 version of MAME (0.78) with added game support plus many fixes and improvements" PKG_LIBNAME="mame2003_plus_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="MAME2003_PLUS_LIB" configure_target() { export LD="${CC}" } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-mame2010/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-mame2010" PKG_VERSION="5f524dd5fca63ec1dcf5cca63885286109937587" PKG_SHA256="deb2a5126fcf9791ebaaba604143b6fb1bf4fa48fdc7a2ef919c900a3f9e4d69" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/mame2010-libretro" PKG_URL="https://github.com/libretro/mame2010-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain zlib" PKG_LONGDESC="Late 2010 version of MAME (0.139) for libretro" PKG_LIBNAME="mame2010_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="MAME2010_LIB" pre_configure_target() { export CFLAGS="${CFLAGS} -fpermissive" export CXXFLAGS="${CXXFLAGS} -fpermissive" export LD="${CXX}" case ${TARGET_CPU} in arm1176jzf-s) PKG_MAKE_OPTS_TARGET="platform=armv6-hardfloat-${TARGET_CPU}" ;; cortex-a7|cortex-a8|cortex-a9) PKG_MAKE_OPTS_TARGET="platform=armv7-neon-hardfloat-${TARGET_CPU}" ;; *cortex-a53|cortex-a17) if [ "${TARGET_ARCH}" = "aarch64" ]; then PKG_MAKE_OPTS_TARGET="platform=unix PTR64=1 ARM_ENABLED=1 LCPU=arm64" else PKG_MAKE_OPTS_TARGET="platform=armv7-neon-hardfloat-cortex-a9" fi ;; esac } pre_make_target() { # precreate the build directories because they may be created too late make ${PKG_MAKE_OPTS_TARGET} maketree } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-mame2010/patches/libretro-mame2010-0001_fix-cross-build.patch ================================================ diff --git a/Makefile b/Makefile index 65ece36..bd7d670 100644 --- a/Makefile +++ b/Makefile @@ -61,7 +61,7 @@ COBJFLAGS = CPPONLYFLAGS = # LDFLAGS are used generally; LDFLAGSEMULATOR are additional # flags only used when linking the core emulator -LDFLAGS = +LDFLAGS ?= LDFLAGSEMULATOR = GIT_VERSION ?= " $(shell git rev-parse --short HEAD || echo unknown)" @@ -104,27 +104,25 @@ ifeq ($(VRENDER),opengl) CCOMFLAGS += -DHAVE_OPENGL endif -UNAME=$(shell uname -m) - -ifeq ($(firstword $(filter x86_64,$(UNAME))),x86_64) +ifeq ($(firstword $(filter x86_64,$(ARCH))),x86_64) PTR64 ?= 1 endif -ifeq ($(firstword $(filter amd64,$(UNAME))),amd64) +ifeq ($(firstword $(filter amd64,$(ARCH))),amd64) PTR64 ?= 1 endif -ifeq ($(firstword $(filter ppc64,$(UNAME))),ppc64) +ifeq ($(firstword $(filter ppc64,$(ARCH))),ppc64) PTR64 ?= 1 endif ifneq (,$(findstring mingw64-w64,$(PATH))) PTR64 ?= 1 endif -ifeq ($(firstword $(filter arm64,$(UNAME))),arm64) +ifeq ($(firstword $(filter arm64,$(ARCH))),arm64) PTR64 ?= 1 endif -ifneq (,$(findstring Power,$(UNAME))) +ifneq (,$(findstring Power,$(ARCH))) BIGENDIAN=1 endif -ifneq (,$(findstring ppc,$(UNAME))) +ifneq (,$(findstring ppc,$(ARCH))) BIGENDIAN=1 endif @@ -146,14 +144,10 @@ ifeq ($(VRENDER),opengl) LIBS += -lGL endif LDFLAGS += $(SHARED) - NATIVELD = g++ - NATIVELDFLAGS = -Wl,--warn-common -lstdc++ - NATIVECC = g++ - NATIVECFLAGS = -std=gnu99 - CC_AS = gcc - CC = g++ - AR = @ar - LD = g++ + CC_AS ?= $(CC) + CC ?= g++ + AR ?= @ar + LD ?= g++ CCOMFLAGS += $(PLATCFLAGS) -ffast-math LIBS += -lstdc++ -lpthread @@ -462,10 +456,13 @@ else ifneq (,$(findstring rpi,$(platform))) # ARM else ifneq (,$(findstring armv,$(platform))) + ARM_ENABLED = 1 + EXTRA_RULES = 1 TARGETLIB := $(TARGET_NAME)_libretro.so - SHARED := -shared -Wl,--no-undefined + SHARED := -shared -Wl,--version-script=src/osd/retro/link.T + LDFLAGS += $(SHARED) fpic = -fPIC - CC = g++ + CC ?= g++ LDFLAGS += $(SHARED) ARM_ENABLED = 1 X86_SH2DRC = 0 @@ -683,7 +680,7 @@ DEFS += -DFLAC__NO_DLL # CFLAGS is defined based on C or C++ targets # (remember, expansion only happens when used, so doing it here is ok) -CFLAGS = $(CCOMFLAGS) $(CPPONLYFLAGS) +CFLAGS += $(CCOMFLAGS) $(CPPONLYFLAGS) # we compile C-only to C89 standard with GNU extensions # we compile C++ code to C++98 standard with GNU extensions ================================================ FILE: packages/emulation/libretro-mame2015/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-mame2015" PKG_VERSION="2599c8aeaf84f62fe16ea00daa460a19298c121c" PKG_SHA256="8f9a295f5d280130101c473e9754ec68ccbf45a1c1fe72d3405183ee6270b50d" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/mame2015-libretro" PKG_URL="https://github.com/libretro/mame2015-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Late 2014/Early 2015 version of MAME (0.160-ish) for libretro. Compatible with MAME 0.160 romsets." PKG_TOOLCHAIN="make" PKG_LIBNAME="mame2015_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="MAME2015_LIB" PKG_MAKE_OPTS_TARGET="GIT_VERSION=${PKG_VERSION:0:7}" pre_configure_target() { if [ "${ARCH}" = "arm" ]; then PKG_MAKE_OPTS_TARGET+=" platform=armv" # ARM NEON support if target_has_feature neon; then PKG_MAKE_OPTS_TARGET+="-neon" fi PKG_MAKE_OPTS_TARGET+="-${TARGET_FLOAT}float-${TARGET_CPU}" fi # Fix build export REALCC=${CC} export CC=${CXX} export LD=${CXX} } pre_make_target() { # precreate the build directories because they may be created too late make ${PKG_MAKE_OPTS_TARGET} maketree } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-mame2015/patches/libretro-mame2015-100.01-cross-compile.patch ================================================ --- a/Makefile +++ b/Makefile @@ -146,23 +146,23 @@ AR ?= @ar LD := $(CXX) LIBS += -lstdc++ -lpthread -ldl - ifeq ($(firstword $(filter x86_64,$(UNAME))),x86_64) + ifeq ($(firstword $(filter x86_64,$(ARCH))),x86_64) PTR64 = 1 endif - ifeq ($(firstword $(filter amd64,$(UNAME))),amd64) + ifeq ($(firstword $(filter amd64,$(ARCH))),amd64) PTR64 = 1 endif - ifeq ($(firstword $(filter aarch64,$(UNAME))),aarch64) + ifeq ($(firstword $(filter aarch64,$(ARCH))),aarch64) PTR64 = 1 PLATCFLAGS += -DSDLMAME_NO64BITIO -DSDLMAME_ARM -DFORCE_DRC_C_BACKEND endif - ifeq ($(firstword $(filter ppc64,$(UNAME))),ppc64) + ifeq ($(firstword $(filter ppc64,$(ARCH))),ppc64) PTR64 = 1 endif - ifneq (,$(findstring ppc,$(UNAME))) + ifneq (,$(findstring ppc,$(ARCH))) BIGENDIAN=1 endif - ifneq (,$(findstring armv,$(UNAME) $(platform))) + ifneq (,$(findstring armv,$(ARCH) $(platform))) CCOMFLAGS += -mstructure-size-boundary=32 PLATCFLAGS += -DSDLMAME_NO64BITIO -DSDLMAME_ARM -DRETRO_SETJMP_HACK -DARM LDFLAGS += -Wl,--fix-cortex-a8 -Wl,--no-as-needed ================================================ FILE: packages/emulation/libretro-mame2015/patches/libretro-mame2015-100.02-python-3.patch ================================================ diff -ru a/src/emu/cpu/m6502/m6502make.py b/src/emu/cpu/m6502/m6502make.py --- a/src/emu/cpu/m6502/m6502make.py 2022-06-14 23:05:06.000000000 +0200 +++ b/src/emu/cpu/m6502/m6502make.py 2022-11-11 20:52:38.708407499 +0100 @@ -16,7 +16,7 @@ opcodes = [] logging.info("load_opcodes: %s", fname) try: - f = open(fname, "rU") + f = open(fname, "r") except Exception: err = sys.exc_info()[1] logging.error("cannot read opcodes file %s [%s]", fname, err) @@ -39,7 +39,7 @@ logging.info("load_disp: %s", fname) states = [] try: - f = open(fname, "rU") + f = open(fname, "r") except Exception: err = sys.exc_info()[1] logging.error("cannot read display file %s [%s]", fname, err) diff -ru a/src/emu/cpu/m6809/m6809make.py b/src/emu/cpu/m6809/m6809make.py --- a/src/emu/cpu/m6809/m6809make.py 2022-06-14 23:05:06.000000000 +0200 +++ b/src/emu/cpu/m6809/m6809make.py 2022-11-11 20:51:33.652739538 +0100 @@ -14,7 +14,7 @@ if path != "": path += '/' try: - f = open(fname, "rU") + f = open(fname, "r") except Exception: err = sys.exc_info()[1] sys.stderr.write("Cannot read opcodes file %s [%s]\n" % (fname, err)) diff -ru a/src/emu/cpu/mcs96/mcs96make.py b/src/emu/cpu/mcs96/mcs96make.py --- a/src/emu/cpu/mcs96/mcs96make.py 2022-06-14 23:05:06.000000000 +0200 +++ b/src/emu/cpu/mcs96/mcs96make.py 2022-11-11 20:51:06.048897688 +0100 @@ -71,7 +71,7 @@ self.ea = {} self.macros = {} try: - f = open(fname, "rU") + f = open(fname, "r") except Exception: err = sys.exc_info()[1] sys.stderr.write("Cannot read opcodes file %s [%s]\n" % (fname, err)) diff -ru a/src/emu/cpu/tms57002/tmsmake.py b/src/emu/cpu/tms57002/tmsmake.py --- a/src/emu/cpu/tms57002/tmsmake.py 2022-06-14 23:05:06.000000000 +0200 +++ b/src/emu/cpu/tms57002/tmsmake.py 2022-11-11 20:51:48.124660879 +0100 @@ -326,7 +326,7 @@ def LoadLst(filename): instructions = [] ins = None - for n, line in enumerate(open(filename, "rU")): + for n, line in enumerate(open(filename, "r")): line = line.rstrip() if not line and ins: # new lines separate intructions ================================================ FILE: packages/emulation/libretro-mame2016/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-mame2016" PKG_VERSION="01058613a0109424c4e7211e49ed83ac950d3993" PKG_SHA256="3faaf226279d0c08d2a945a208c43d3851d4b86981b5224231de80098a97ea27" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/mame2016-libretro" PKG_URL="https://github.com/libretro/mame2016-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux:host alsa-lib" PKG_LONGDESC="Late 2016 version of MAME (0.174) for libretro. Compatible with MAME 0.174 romsets." PKG_TOOLCHAIN="make" PKG_LIBNAME="mame2016_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="MAME2016_LIB" pre_make_target() { PKG_MAKE_OPTS_TARGET=" \ REGENIE=1 VERBOSE=1 NOWERROR=1 PYTHON_EXECUTABLE=python3 CONFIG=libretro \ LIBRETRO_OS="unix" ARCH="" PROJECT="" LIBRETRO_CPU="${ARCH}" DISTRO="debian-stable" \ CROSS_BUILD="1" OVERRIDE_CC="${CC}" OVERRIDE_CXX="${CXX}" \ TARGET="mame" SUBTARGET="arcade" PLATFORM="${ARCH}" RETRO=1 OSD="retro" \ GIT_VERSION=${PKG_VERSION:0:7}" if [ "${ARCH}" = "arm" ]; then PKG_MAKE_OPTS_TARGET+=" NOASM="1" ARCHITECTURE=""" elif [ "${ARCH}" = "x86_64" ]; then PKG_MAKE_OPTS_TARGET+=" NOASM="0" PTR64="1"" fi } post_make_target() { mv ${PKG_BUILD}/mamearcade2016_libretro.so ${PKG_BUILD}/mame2016_libretro.so } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-mame2016/patches/bgfx.patch ================================================ --- a/3rdparty/bgfx/src/config.h 2020-01-14 08:42:35.023108564 +0100 +++ b/3rdparty/bgfx/src/config.h 2020-01-14 08:42:39.527041246 +0100 @@ -12,7 +12,7 @@ # define BGFX_CONFIG_DEBUG 0 #endif // BGFX_CONFIG_DEBUG -#if !defined(BGFX_CONFIG_RENDERER_DIRECT3D9) \ +#if 0 && !defined(BGFX_CONFIG_RENDERER_DIRECT3D9) \ && !defined(BGFX_CONFIG_RENDERER_DIRECT3D11) \ && !defined(BGFX_CONFIG_RENDERER_DIRECT3D12) \ && !defined(BGFX_CONFIG_RENDERER_METAL) \ ================================================ FILE: packages/emulation/libretro-mame2016/patches/build.patch ================================================ --- a/makefile 2020-01-08 21:26:00.559307012 +0100 +++ b/makefile 2020-01-08 21:26:17.743082994 +0100 @@ -1499,7 +1499,7 @@ @echo Compressing $<... $(SILENT)$(PYTHON) scripts/build/complay.py $< $@ layout_$(basename $(notdir $<)) -$(GENDIR)/mame/drivers/ymmu100.hxx: $(SRC)/mame/drivers/ymmu100.ppm scripts/build/file2str.py +$(GENDIR)/mame/drivers/ymmu100.hxx: $(SRC)/mame/drivers/ymmu100.ppm scripts/build/file2str.py | $(GEN_FOLDERS) @echo Converting $<... $(SILENT)$(PYTHON) scripts/build/file2str.py $< $@ ymmu100_bkg UINT8 --- a/3rdparty/genie/src/actions/make/make_cpp.lua 2020-01-09 10:47:07.915711959 +0100 +++ b/3rdparty/genie/src/actions/make/make_cpp.lua 2020-01-09 10:47:10.627673879 +0100 @@ -474,7 +474,7 @@ function cpp.fileRules(prj) for _, file in ipairs(prj.files or {}) do if path.isSourceFile(file) then - _p('$(OBJDIR)/%s.o: %s $(GCH)' + _p('$(OBJDIR)/%s.o: %s $(GCH) | $(OBJDIRS)' , _MAKE.esc(path.trimdots(path.removeext(file))) , _MAKE.esc(file) ) @@ -497,7 +497,7 @@ _p('') elseif (path.getextension(file) == ".rc") then - _p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file)) + _p('$(OBJDIR)/%s.res: %s | $(OBJDIRS)', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file)) if prj.msgresource then _p('\t@echo ' .. prj.msgresource) else --- a/3rdparty/genie/src/host/scripts.c 2020-01-10 15:55:33.330479398 +0100 +++ b/3rdparty/genie/src/host/scripts.c 2020-01-10 15:56:01.313900664 +0100 @@ -222,7 +222,7 @@ "E.esc(path.trimdots(path.removeext(file)))\n)\nend\nend\nend\n_p('')\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\nmake.settings(cfg, cc)\n_p('endif')\n_p('')\nend\nfunction cpp.platformtools(cfg, cc)\nlocal platform = cc.platforms[cfg.platform]\nif platform.cc then\n_p(' CC = %s', platform.cc)\nend\nif platform.cxx then\n_p(' CXX = %s', platform.cxx)\nend\nif platform.ar then\n_p(' AR = %s', platform.ar)\nend\nend\nfunction cpp.flags(cf" "g, cc)\nif cfg.pchheader and not cfg.flags.NoPCH then\n_p(' FORCE_INCLUDE += -include $(OBJDIR)/$(notdir $(PCH))')\nend\nif #cfg.forcedincludes > 0 then\n_p(' FORCE_INCLUDE += -include %s'\n,_MAKE.esc(table.concat(cfg.forcedincludes, \";\")))\nend\n_p(' ALL_CPPFLAGS += $(CPPFLAGS) %s $(DEFINES) $(INCLUDES)', table.concat(cc.getcppflags(cfg), \" \"))\n_p(' ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)))\n_p(' ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)))\n_p(' ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)))\n_p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s',\n make.list(table.join(cc.getdefines(cfg.resdefines),\n cc.getincludedi" "rs(cfg.resincludedirs), cfg.resoptions)))\nend\nfunction cpp.linker(prj, cfg, cc)\n_p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions)))\n_p(' LDDEPS +=%s', make.list(_MAKE.esc(premake.getlinks(cfg, \"siblings\", \"fullpath\"))))\n_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))\n_p(' EXTERNAL_LIBS +=%s', make.list(cc.getlibfiles(cfg)))\nif cfg.kind == \"StaticLib\" then\nif (not prj.options.ArchiveSplit) then\n_p(' LINKCMD = $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, false)))\nelse\n_p(' LINKCMD = $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, false)))\n_p(' LINKCMD_NDX= $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, true)))\nend\nelse\nlocal tool = iif(cfg.language == \"C\", \"CC\", \"CXX\")\n_p(' LINKCMD = $(%s) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)', tool)\nend\nend\nfunction cpp.pchconfig(cfg)\nif not cfg.pchheader or cfg.flags.NoPC" - "H then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH) | $(OBJDIR)')\nif prj.msgprecompile then\n_p('\\t@echo ' .. prj.msgprecompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nlocal cmd = iif(prj.language == \"C\", \"$(CC) $(ALL_CFLAGS) -x c-header\", \"$(CXX) $(ALL_CXXFLAGS) -x c++-header\")\n_p('\\t$(SILENT) %s $(DEFINES) $(INCLUDES) -o \"$@\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj)\nfor _, file in ipairs(prj.files or {}) do\nif path.isSourceFile(file) then\n_p('$(OBJDIR)/%s.o: %s $(GCH)'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n)\nif (pat" + "H then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH) | $(OBJDIR)')\nif prj.msgprecompile then\n_p('\\t@echo ' .. prj.msgprecompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nlocal cmd = iif(prj.language == \"C\", \"$(CC) $(ALL_CFLAGS) -x c-header\", \"$(CXX) $(ALL_CXXFLAGS) -x c++-header\")\n_p('\\t$(SILENT) %s $(DEFINES) $(INCLUDES) -o \"$@\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj)\nfor _, file in ipairs(prj.files or {}) do\nif path.isSourceFile(file) then\n_p('$(OBJDIR)/%s.o: %s $(GCH) | $(OBJDIRS)'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n)\nif (pat" "h.isobjcfile(file) and prj.msgcompile_objc) then\n_p('\\t@echo ' .. prj.msgcompile_objc)\nelseif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nif (path.isobjcfile(file)) then\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE) -o \"$@\" -c \"$<\"')\nelse\ncpp.buildcommand(path.iscfile(file) and not prj.options.ForceCPP, \"o\")\nend\nfor _, task in ipairs(prj.postcompiletasks or {}) do\n_p('\\t$(SILENT) %s', task)\n_p('')\nend\n_p('')\nelseif (path.getextension(file) == \".rc\") then\n_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))\nif prj.msgresource then\n_p('\\t@echo ' .. prj.msgresource)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) $(RESCOMP) $< -O coff -o \"$@\" $(ALL_RESFLAGS)')\n_p('')\nend\nend\nend\nfunction cpp.dependencyRules(prj)\nfor _, dependency in ipairs(prj.dependency or {}) do\nfor _, dep in ipairs(dependency or {}) do\nif (dep[3]==nil or dep[3]==false) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.es" "c(path.trimdots(path.removeext(path.getrelative(prj.location, dep[1]))))\n, _MAKE.esc(path.getrelative(prj.location, dep[2]))\n)\nelse\n_p('%s: %s'\n, _MAKE.esc(dep[1])\n, _MAKE.esc(path.getrelative(prj.location, dep[2]))\n)\nend\n_p('')\nend\nend\nend\nfunction cpp.buildcommand(iscfile, objext)\nlocal flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')\n_p('\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$@\" -c \"$<\"', flags, objext)\nend\n", ================================================ FILE: packages/emulation/libretro-mame2016/patches/genie.patch ================================================ --- a/3rdparty/genie/build/gmake.linux/genie.make 2020-01-14 06:27:22.077161784 +0100 +++ b/3rdparty/genie/build/gmake.linux/genie.make 2020-01-14 06:27:49.856857764 +0100 @@ -28,8 +28,12 @@ RM = $(SILENT) del /F "$(subst /,\\,$(1))" 2> nul || exit 0 endif -CC = gcc -CXX = g++ +CC = $(HOST_CC) +CXX = $(HOST_CXX) +CPPFLAGS = $(HOST_CPPFLAGS) +CFLAGS = $(HOST_CFLAGS) +CXXFLAGS = $(HOST_CXXFLAGS) +LDFLAGS = $(HOST_LDFLAGS) AR = ar ifndef RESCOMP @@ -247,211 +243,211 @@ $(SILENT) $(CC) $(ALL_CFLAGS) -x c-header $(DEFINES) $(INCLUDES) -o "$@" -c "$<" endif -$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c $(GCH) +$(OBJDIR)/src/host/scripts.o: ../../src/host/scripts.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_stat.o: ../../src/host/os_stat.c $(GCH) +$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_chdir.o: ../../src/host/os_chdir.c $(GCH) +$(OBJDIR)/src/host/string_endswith.o: ../../src/host/string_endswith.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c $(GCH) +$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c $(GCH) +$(OBJDIR)/src/host/premake.o: ../../src/host/premake.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c $(GCH) +$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_ticks.o: ../../src/host/os_ticks.c $(GCH) +$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c $(GCH) +$(OBJDIR)/src/host/os_ticks.o: ../../src/host/os_ticks.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/scripts.o: ../../src/host/scripts.c $(GCH) +$(OBJDIR)/src/host/os_stat.o: ../../src/host/os_stat.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/string_endswith.o: ../../src/host/string_endswith.c $(GCH) +$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c $(GCH) +$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c $(GCH) +$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c $(GCH) +$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c $(GCH) +$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/premake.o: ../../src/host/premake.c $(GCH) +$(OBJDIR)/src/host/os_isdir.o: ../../src/host/os_isdir.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_isdir.o: ../../src/host/os_isdir.c $(GCH) +$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c $(GCH) +$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c $(GCH) +$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c $(GCH) +$(OBJDIR)/src/host/os_chdir.o: ../../src/host/os_chdir.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/ldump.o: ../../src/host/lua-5.3.0/src/ldump.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lzio.o: ../../src/host/lua-5.3.0/src/lzio.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lvm.o: ../../src/host/lua-5.3.0/src/lvm.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lvm.o: ../../src/host/lua-5.3.0/src/lvm.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/ltable.o: ../../src/host/lua-5.3.0/src/ltable.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lutf8lib.o: ../../src/host/lua-5.3.0/src/lutf8lib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lstrlib.o: ../../src/host/lua-5.3.0/src/lstrlib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lundump.o: ../../src/host/lua-5.3.0/src/lundump.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/liolib.o: ../../src/host/lua-5.3.0/src/liolib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/ltm.o: ../../src/host/lua-5.3.0/src/ltm.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lcode.o: ../../src/host/lua-5.3.0/src/lcode.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/ltablib.o: ../../src/host/lua-5.3.0/src/ltablib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lparser.o: ../../src/host/lua-5.3.0/src/lparser.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/ltable.o: ../../src/host/lua-5.3.0/src/ltable.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/loadlib.o: ../../src/host/lua-5.3.0/src/loadlib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lstrlib.o: ../../src/host/lua-5.3.0/src/lstrlib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lbitlib.o: ../../src/host/lua-5.3.0/src/lbitlib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lstring.o: ../../src/host/lua-5.3.0/src/lstring.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lzio.o: ../../src/host/lua-5.3.0/src/lzio.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lstate.o: ../../src/host/lua-5.3.0/src/lstate.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/ldblib.o: ../../src/host/lua-5.3.0/src/ldblib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lparser.o: ../../src/host/lua-5.3.0/src/lparser.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lmathlib.o: ../../src/host/lua-5.3.0/src/lmathlib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/loslib.o: ../../src/host/lua-5.3.0/src/loslib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lfunc.o: ../../src/host/lua-5.3.0/src/lfunc.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lopcodes.o: ../../src/host/lua-5.3.0/src/lopcodes.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lmem.o: ../../src/host/lua-5.3.0/src/lmem.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lobject.o: ../../src/host/lua-5.3.0/src/lobject.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lgc.o: ../../src/host/lua-5.3.0/src/lgc.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/loadlib.o: ../../src/host/lua-5.3.0/src/loadlib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lstring.o: ../../src/host/lua-5.3.0/src/lstring.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lmem.o: ../../src/host/lua-5.3.0/src/lmem.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/linit.o: ../../src/host/lua-5.3.0/src/linit.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lmathlib.o: ../../src/host/lua-5.3.0/src/lmathlib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/ltm.o: ../../src/host/lua-5.3.0/src/ltm.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/llex.o: ../../src/host/lua-5.3.0/src/llex.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lapi.o: ../../src/host/lua-5.3.0/src/lapi.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/liolib.o: ../../src/host/lua-5.3.0/src/liolib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lctype.o: ../../src/host/lua-5.3.0/src/lctype.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/linit.o: ../../src/host/lua-5.3.0/src/linit.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lstate.o: ../../src/host/lua-5.3.0/src/lstate.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lgc.o: ../../src/host/lua-5.3.0/src/lgc.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lbaselib.o: ../../src/host/lua-5.3.0/src/lbaselib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lfunc.o: ../../src/host/lua-5.3.0/src/lfunc.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/ltablib.o: ../../src/host/lua-5.3.0/src/ltablib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/ldump.o: ../../src/host/lua-5.3.0/src/ldump.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o: ../../src/host/lua-5.3.0/src/lauxlib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/ldo.o: ../../src/host/lua-5.3.0/src/ldo.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lcorolib.o: ../../src/host/lua-5.3.0/src/lcorolib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/ldebug.o: ../../src/host/lua-5.3.0/src/ldebug.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/llex.o: ../../src/host/lua-5.3.0/src/llex.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/ldblib.o: ../../src/host/lua-5.3.0/src/ldblib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/ldo.o: ../../src/host/lua-5.3.0/src/ldo.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lctype.o: ../../src/host/lua-5.3.0/src/lctype.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lundump.o: ../../src/host/lua-5.3.0/src/lundump.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lcorolib.o: ../../src/host/lua-5.3.0/src/lcorolib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lopcodes.o: ../../src/host/lua-5.3.0/src/lopcodes.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lcode.o: ../../src/host/lua-5.3.0/src/lcode.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lutf8lib.o: ../../src/host/lua-5.3.0/src/lutf8lib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lbitlib.o: ../../src/host/lua-5.3.0/src/lbitlib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/loslib.o: ../../src/host/lua-5.3.0/src/loslib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lbaselib.o: ../../src/host/lua-5.3.0/src/lbaselib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lobject.o: ../../src/host/lua-5.3.0/src/lobject.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o: ../../src/host/lua-5.3.0/src/lauxlib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/ldebug.o: ../../src/host/lua-5.3.0/src/ldebug.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lapi.o: ../../src/host/lua-5.3.0/src/lapi.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" ================================================ FILE: packages/emulation/libretro-mame2016/patches/pregenerate.patch ================================================ --- a/makefile 2020-01-15 17:56:35.780589637 +0100 +++ b/makefile 2020-01-15 17:56:15.020900841 +0100 @@ -1201,16 +1201,19 @@ .PHONY: linux_x64 linux_x64: generate $(PROJECTDIR)/gmake-linux/Makefile $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)64 precompile + $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)64 dasm $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)64 .PHONY: linux_x86 linux_x86: generate $(PROJECTDIR)/gmake-linux/Makefile $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)32 precompile + $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)32 dasm $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)32 .PHONY: linux linux: generate $(PROJECTDIR)/gmake-linux/Makefile $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG) precompile + $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG) dasm $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG) #------------------------------------------------- ================================================ FILE: packages/emulation/libretro-mame2016/patches/python3.patch ================================================ diff -ru a/scripts/build/verinfo.py b/scripts/build/verinfo.py --- a/scripts/build/verinfo.py 2022-04-06 22:13:09.000000000 +0200 +++ b/scripts/build/verinfo.py 2022-11-12 01:58:14.560895085 +0100 @@ -63,7 +63,7 @@ build, outfmt, srcfile, dstfile = parse_args() try: - fp = open(srcfile, 'rU') + fp = open(srcfile, 'r') except IOError: sys.stderr.write("Unable to open source file '%s'\n" % srcfile) sys.exit(1) diff -ru a/src/devices/cpu/m6502/m6502make.py b/src/devices/cpu/m6502/m6502make.py --- a/src/devices/cpu/m6502/m6502make.py 2022-04-06 22:13:09.000000000 +0200 +++ b/src/devices/cpu/m6502/m6502make.py 2022-11-12 01:58:41.276911837 +0100 @@ -18,7 +18,7 @@ opcodes = [] logging.info("load_opcodes: %s", fname) try: - f = open(fname, "rU") + f = open(fname, "r") except Exception: err = sys.exc_info()[1] logging.error("cannot read opcodes file %s [%s]", fname, err) @@ -41,7 +41,7 @@ logging.info("load_disp: %s", fname) states = [] try: - f = open(fname, "rU") + f = open(fname, "r") except Exception: err = sys.exc_info()[1] logging.error("cannot read display file %s [%s]", fname, err) diff -ru a/src/devices/cpu/m6809/m6809make.py b/src/devices/cpu/m6809/m6809make.py --- a/src/devices/cpu/m6809/m6809make.py 2022-04-06 22:13:09.000000000 +0200 +++ b/src/devices/cpu/m6809/m6809make.py 2022-11-12 01:58:23.972900989 +0100 @@ -16,7 +16,7 @@ if path != "": path += '/' try: - f = open(fname, "rU") + f = open(fname, "r") except Exception: err = sys.exc_info()[1] sys.stderr.write("Cannot read opcodes file %s [%s]\n" % (fname, err)) diff -ru a/src/devices/cpu/mcs96/mcs96make.py b/src/devices/cpu/mcs96/mcs96make.py --- a/src/devices/cpu/mcs96/mcs96make.py 2022-04-06 22:13:09.000000000 +0200 +++ b/src/devices/cpu/mcs96/mcs96make.py 2022-11-12 01:59:08.144928680 +0100 @@ -73,7 +73,7 @@ self.ea = {} self.macros = {} try: - f = open(fname, "rU") + f = open(fname, "r") except Exception: err = sys.exc_info()[1] sys.stderr.write("Cannot read opcodes file %s [%s]\n" % (fname, err)) diff -ru a/src/devices/cpu/tms57002/tmsmake.py b/src/devices/cpu/tms57002/tmsmake.py --- a/src/devices/cpu/tms57002/tmsmake.py 2022-04-06 22:13:09.000000000 +0200 +++ b/src/devices/cpu/tms57002/tmsmake.py 2022-11-12 01:58:58.908922895 +0100 @@ -323,7 +323,7 @@ def LoadLst(filename): instructions = [] ins = None - for n, line in enumerate(open(filename, "rU")): + for n, line in enumerate(open(filename, "r")): line = line.rstrip() if not line and ins: # new lines separate intructions ================================================ FILE: packages/emulation/libretro-mesen/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-mesen" PKG_VERSION="c89474c9d87df967d21b7b7d5971dc9475fec028" PKG_SHA256="f389c3f7670d8df115a9603cca4ebff19bf3a9e722149820d2db7cfa31445755" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/SourMesen/Mesen/" PKG_URL="https://github.com/libretro/Mesen/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.mesen: mesen for Kodi" PKG_TOOLCHAIN="make" PKG_LIBNAME="mesen_libretro.so" PKG_LIBPATH="Libretro/${PKG_LIBNAME}" PKG_LIBVAR="MESEN_LIB" make_target() { make -C Libretro/ } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-meteor/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-meteor" PKG_VERSION="e533d300d0561564451bde55a2b73119c768453c" PKG_SHA256="09df1661aa8d5c830e9ef3b62f01d7e2ae108bce2572e199b181e0c13d87e084" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/meteor-libretro" PKG_URL="https://github.com/libretro/meteor-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.meteor: Meteor GBA for Kodi" PKG_TOOLCHAIN="make" PKG_LIBNAME="meteor_libretro.so" PKG_LIBPATH="libretro/${PKG_LIBNAME}" PKG_LIBVAR="METEOR_LIB" pre_configure_target() { # fails to build in subdirs cd ${PKG_BUILD} rm -rf .${TARGET_NAME} } make_target() { make -C libretro/ } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-mgba/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-mgba" PKG_VERSION="a69c3434afe8b26cb8f9463077794edfa7d5efad" PKG_SHA256="e166ad04c46b631f9001fff6155dbde956b57983fdcb4e50d8bbb57980b99840" PKG_LICENSE="MPL 2.0" PKG_SITE="https://github.com/libretro/mgba" PKG_URL="https://github.com/libretro/mgba/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform zlib" PKG_LONGDESC="game.libretro.mgba: mGBA for Kodi" PKG_TOOLCHAIN="make" PKG_LIBNAME="mgba_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="MGBA_LIB" pre_configure_target() { # fails to build in subdirs cd ${PKG_BUILD} rm -rf .${TARGET_NAME} } make_target() { make -f Makefile.libretro } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-mrboom/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-mrboom" PKG_VERSION="787f7a09dad0e2fd3fea71517261ae34445e5c63" PKG_SHA256="4a9e8bad643ae43f327920686d872c56c2c812ab4dbd0abecf02a6315cd3a42c" PKG_LICENSE="MIT" PKG_SITE="https://github.com/Javanaise/mrboom-libretro" PKG_URL="https://github.com/kodi-game/mrboom-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.mrboom: mrboom for Kodi" PKG_LIBNAME="mrboom_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="MRBOOM_LIB" pre_make_target() { # Disable NEON otherwise build fails if target_has_feature neon; then CFLAGS+=" -DDONT_WANT_ARM_OPTIMIZATIONS" fi } make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-nestopia/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-nestopia" PKG_VERSION="0867e83383661055ead5ecdab99150bb90922d93" PKG_SHA256="b82c0ba7cc41463c9ce69149019032819e0db74f46df2ff3caed382e9fddc6c6" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/nestopia" PKG_URL="https://github.com/libretro/nestopia/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.nestopia: Nestopia for Kodi" PKG_TOOLCHAIN="manual" PKG_LIBNAME="nestopia_libretro.so" PKG_LIBPATH="libretro/${PKG_LIBNAME}" PKG_LIBVAR="NESTOPIA_LIB" make_target() { make -C libretro } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-nx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-nx" PKG_VERSION="1f371e51c7a19049e00f4364cbe9c68ca08b303a" PKG_SHA256="f85987a9497339f292df6a34af1c2b1020992465d0dd2c4a9acc9734ea857877" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/nxengine-libretro" PKG_URL="https://github.com/libretro/nxengine-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.nx: nx for Kodi" PKG_LIBNAME="nxengine_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="NX_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-o2em/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-o2em" PKG_VERSION="a2a12472fde910b6089ac3ca6de805bd58a9c999" PKG_SHA256="19cff8eff5227a955158e10a5a37790300ad89312033f9f1df542dad5b3caf4e" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/libretro-o2em" PKG_URL="https://github.com/libretro/libretro-o2em/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.o2em: o2em for Kodi" PKG_LIBNAME="o2em_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="O2EM_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-opera/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-opera" PKG_VERSION="8a49bb8877611037438aeb857cb182f41ee0e3a1" PKG_SHA256="48f94380633808ea01f4608f03ceb6b4b10709ba18abf1df6665f06ae839e7a7" PKG_LICENSE="GPL-2.0-or-later" PKG_SITE="https://github.com/libretro/opera-libretro" PKG_URL="https://github.com/libretro/opera-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.opera: Port of 4DO/libfreedo for Kodi." PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="+lto" PKG_LIBNAME="opera_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="OPERA_LIB" PKG_MAKE_OPTS_TARGET="GIT_VERSION=${PKG_VERSION:0:7}" makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-opera/patches/libretro-opera-995.01-crosscompile.patch ================================================ diff --git a/Makefile b/Makefile index c62fee2..49b0e98 100644 --- a/Makefile +++ b/Makefile @@ -49,8 +49,8 @@ unixpath = $(subst \,/,$1) unixcygpath = /$(subst :,,$(call unixpath,$1)) ifneq (,$(findstring unix,$(platform))) - AR = ${CC_PREFIX}ar - CC = ${CC_PREFIX}gcc + AR ?= ${CC_PREFIX}ar + CC ?= ${CC_PREFIX}gcc TARGET := $(TARGET_NAME)_libretro.so fpic := -fPIC @@ -138,8 +138,8 @@ else ifeq ($(platform), classic_armv7_a7) # ARM else ifneq (,$(findstring armv,$(platform))) - AR = ${CC_PREFIX}ar - CC = ${CC_PREFIX}gcc + AR ?= ${CC_PREFIX}ar + CC ?= ${CC_PREFIX}gcc TARGET := $(TARGET_NAME)_libretro.so fpic := -fPIC @@ -181,9 +181,9 @@ ifeq ($(IOSSDK),) IOSSDK := $(shell xcodebuild -version -sdk iphoneos Path) endif ifeq ($(platform),ios-arm64) - CC = cc -arch arm64 -isysroot $(IOSSDK) -stdlib=libc++ + CC ?= cc -arch arm64 -isysroot $(IOSSDK) -stdlib=libc++ else - CC = cc -arch armv7 -isysroot $(IOSSDK) + CC ?= cc -arch armv7 -isysroot $(IOSSDK) endif ifeq ($(platform),$(filter $(platform),ios9 ios-arm64)) MINVERSION = -miphoneos-version-min=8.0 @@ -216,18 +216,18 @@ else ifeq ($(platform), qnx) TARGET := $(TARGET_NAME)_libretro_$(platform).so fpic := -fPIC SHARED := -shared -Wl,--no-undefined -Wl,--version-script=link.T - CC = qcc -Vgcc_ntoarmv7le + CC ?= qcc -Vgcc_ntoarmv7le else ifeq ($(platform), ps3) TARGET := $(TARGET_NAME)_libretro_$(platform).a - CC = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-gcc.exe - AR = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ar.exe + CC ?= $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-gcc.exe + AR ?= $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ar.exe STATIC_LINKING = 1 FLAGS += -DMSB_FIRST -D__CELLOS_LV2__ OLD_GCC = 1 else ifeq ($(platform), sncps3) TARGET := $(TARGET_NAME)_libretro_ps3.a - CC = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe - AR = $(CELL_SDK)/host-win32/sn/bin/ps3snarl.exe + CC ?= $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe + AR ?= $(CELL_SDK)/host-win32/sn/bin/ps3snarl.exe STATIC_LINKING = 1 FLAGS += -DMSB_FIRST NO_GCC = 1 @@ -235,25 +235,25 @@ else ifeq ($(platform), sncps3) # PSP1 else ifeq ($(platform), psp1) TARGET := $(TARGET_NAME)_libretro_$(platform).a - CC = psp-gcc$(EXE_EXT) - AR = psp-ar$(EXE_EXT) + CC ?= psp-gcc$(EXE_EXT) + AR ?= psp-ar$(EXE_EXT) STATIC_LINKING = 1 FLAGS += -G0 # Vita else ifeq ($(platform), vita) TARGET := $(TARGET_NAME)_libretro_$(platform).a - CC = arm-vita-eabi-gcc$(EXE_EXT) - AR = arm-vita-eabi-ar$(EXE_EXT) + CC ?= arm-vita-eabi-gcc$(EXE_EXT) + AR ?= arm-vita-eabi-ar$(EXE_EXT) STATIC_LINKING = 1 FLAGS += -DVITA # CTR (3DS) else ifeq ($(platform), ctr) TARGET := $(TARGET_NAME)_libretro_$(platform).a - CC = $(DEVKITARM)/bin/arm-none-eabi-gcc$(EXE_EXT) - CXX = $(DEVKITARM)/bin/arm-none-eabi-g++$(EXE_EXT) - AR = $(DEVKITARM)/bin/arm-none-eabi-ar$(EXE_EXT) + CC ?= $(DEVKITARM)/bin/arm-none-eabi-gcc$(EXE_EXT) + CXX ?=$(DEVKITARM)/bin/arm-none-eabi-g++$(EXE_EXT) + AR ?= $(DEVKITARM)/bin/arm-none-eabi-ar$(EXE_EXT) FLAGS += -march=armv6k -mtune=mpcore -mfloat-abi=hard FLAGS += -Wall -mword-relocations FLAGS += -fomit-frame-pointer -ffast-math @@ -311,8 +311,8 @@ else ifeq ($(platform), emscripten) # Windows MSVC 2003 Xbox 1 else ifeq ($(platform), xbox1_msvc2003) TARGET := $(TARGET_NAME)_libretro_xdk1.lib -CC = CL.exe -LD = lib.exe +CC ?= CL.exe +LD ?= lib.exe export INCLUDE := $(XDK)/xbox/include export LIB := $(XDK)/xbox/lib @@ -325,8 +325,8 @@ HAS_GCC := 0 else ifeq ($(platform), xbox360_msvc2010) TARGET := $(TARGET_NAME)_libretro_xdk360.lib MSVCBINDIRPREFIX = $(XEDK)/bin/win32 -CC = "$(MSVCBINDIRPREFIX)/cl.exe" -LD = "$(MSVCBINDIRPREFIX)/lib.exe" +CC ?= "$(MSVCBINDIRPREFIX)/cl.exe" +LD ?= "$(MSVCBINDIRPREFIX)/lib.exe" export INCLUDE := $(XEDK)/include/xbox export LIB := $(XEDK)/lib/xbox @@ -461,9 +461,9 @@ else ifneq (,$(findstring windows_msvc2017,$(platform))) TargetArchMoniker = $(subst $(WinPartition)_,,$(PlatformSuffix)) - CC = cl.exe - CXX = cl.exe - LD = link.exe + CC ?= cl.exe + CXX ?= cl.exe + LD ?= link.exe reg_query = $(call filter_out2,$(subst $2,,$(shell reg query "$2" -v "$1" 2>nul))) fix_path = $(subst $(SPACE),\ ,$(subst \,/,$1)) @@ -617,7 +617,7 @@ ifeq ($(STATIC_LINKING),1) LD ?= lib.exe STATIC_LINKING=0 else - LD = link.exe + LD ?= link.exe endif else LD = $(CC) ================================================ FILE: packages/emulation/libretro-pcsx-rearmed/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-pcsx-rearmed" PKG_VERSION="4373e29de72c917dbcd04ec2a5fb685e69d9def3" PKG_SHA256="85560938cdad30be5994e935d35b0b4b8a12f6d2ca39c0034bfaa3d98cbcb11a" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/pcsx_rearmed" PKG_URL="https://github.com/libretro/pcsx_rearmed/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.pcsx-rearmed: PCSX Rearmed for Kodi" PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="-gold" PKG_LIBNAME="pcsx_rearmed_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="PCSX-REARMED_LIB" PKG_MAKE_OPTS_TARGET="-f Makefile.libretro GIT_VERSION=${PKG_VERSION:0:7}" pre_configure_target() { cd ${PKG_BUILD} if [ "${ARCH}" = "arm" ]; then if target_has_feature neon; then PKG_MAKE_OPTS_TARGET+=" HAVE_NEON=1 HAVE_NEON_ASM=1 BUILTIN_GPU=neon" else PKG_MAKE_OPTS_TARGET+=" HAVE_NEON=0" fi PKG_MAKE_OPTS_TARGET+=" DYNAREC=ari64" elif [ "${ARCH}" = "aarch64" ]; then PKG_MAKE_OPTS_TARGET+=" platform=unix DYNAREC=ari64" else PKG_MAKE_OPTS_TARGET+=" platform=unix DYNAREC=lightrec" fi } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-picodrive/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-picodrive" PKG_VERSION="c567d74ce42078f58168debe7e5e414bda441b6c" PKG_SHA256="a4a737c6a550454969ae81f3c525c66eaf9253500430e9e1184fc620b0d5e2db" PKG_LICENSE="MAME" PKG_SITE="https://github.com/kodi-game/picodrive" PKG_URL="https://github.com/kodi-game/picodrive/releases/download/picodrive-${PKG_VERSION}/picodrive-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain kodi-platform ${PKG_NAME}:host" PKG_DEPENDS_UNPACK="cyclone68000" PKG_LONGDESC="Fast MegaDrive/MegaCD/32X emulator" PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="-gold" PKG_LIBNAME="picodrive_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="PICODRIVE_LIB" pre_build_host() { cp -a $(get_build_dir cyclone68000)/* ${PKG_BUILD}/cpu/cyclone/ } pre_configure_host() { # fails to build in subdirs cd ${PKG_BUILD} rm -rf .${HOST_NAME} } make_host() { if [ "${ARCH}" = "arm" ]; then make -C cpu/cyclone CONFIG_FILE=../cyclone_config.h fi } pre_configure_target() { # fails to build in subdirs cd ${PKG_BUILD} rm -rf .${TARGET_NAME} } post_configure_target() { sed -e "s|^GIT_VERSION :=.*$|GIT_VERSION := \" ${PKG_VERSION:0:7}\"|" -i Makefile.libretro } make_target() { if target_has_feature neon; then export HAVE_NEON=1 export BUILTIN_GPU=neon else export HAVE_NEON=0 fi case ${TARGET_ARCH} in aarch64) R= make -f Makefile.libretro platform=aarch64 ;; arm) R= make -f Makefile.libretro platform=armv ;; x86_64) R= make -f Makefile.libretro ;; esac } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-pokemini/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-pokemini" PKG_VERSION="9ba2c2d98bef98794095f3ef50e22f1a3cbc6166" PKG_SHA256="7dd450e5e26c9b66ce0811ec4eac125e71b6752951bdbf3851d0312d268c09c2" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/pokemini" PKG_URL="https://github.com/libretro/PokeMini/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="libretro wrapper for PokeMini emulator." PKG_TOOLCHAIN="make" PKG_LIBNAME="pokemini_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="POKEMINI_LIB" configure_target() { cd ${PKG_BUILD} } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-prboom/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-prboom" PKG_VERSION="d9c3975669b4aab5a1397e0174838bcbbc3c1582" PKG_SHA256="bce89eac47d612b5745ecb65f7b69d13efb5efa29a6bd64d21d529ca2792d199" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/libretro-prboom" PKG_URL="https://github.com/libretro/libretro-prboom/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.prboom: prboom for Kodi" PKG_LIBNAME="prboom_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="PRBOOM_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-prosystem/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-prosystem" PKG_VERSION="763ad22c7de51c8f06d6be0d49c554ce6a94a29b" PKG_SHA256="289ed69df4503cd7772b6ec621aabc4a12eaedeb7dcf287a7ba01cf38aeb6c75" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/prosystem-libretro" PKG_URL="https://github.com/libretro/prosystem-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="Port of ProSystem to libretro" PKG_LIBNAME="prosystem_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="PROSYSTEM_LIB" makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-quicknes/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-quicknes" PKG_VERSION="75d501a87ec2074e8d2f7256fb0359513c263c29" PKG_SHA256="751feab59dad87c708c21eaaf55017ec8e1cc088a53230bb910b0b92854eb0ca" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/QuickNES_Core" PKG_URL="https://github.com/libretro/QuickNES_Core/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.quicknes: QuickNES for Kodi" PKG_LIBNAME="quicknes_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="QUICKNES_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-sameboy/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-sameboy" PKG_VERSION="09138330990da32362246c7034cf4de2ea0a2a2b" PKG_SHA256="9ef470c7c6bee83bbeb1e861a1c76b722d78de5e5a3849e7132d03d40fa8828d" PKG_LICENSE="MIT" PKG_SITE="https://github.com/libretro/sameboy" PKG_URL="https://github.com/libretro/SameBoy/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform util-linux:host" PKG_LONGDESC="libretro wrapper for SameBoy emulator." PKG_LIBNAME="sameboy_libretro.so" PKG_LIBPATH="libretro/${PKG_LIBNAME}" PKG_LIBVAR="SAMEBOY_LIB" make_target() { make -C libretro } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-scummvm/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-scummvm" PKG_VERSION="0b219a46770776e10c954c6242870928113cacc0" PKG_SHA256="aff5f337ec9b6d5baa951610eec5f405c20f8840b53cac9a4fcaf061de9ac2cc" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/scummvm-wrapper" PKG_URL="https://github.com/libretro/scummvm-wrapper/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.scummvm: scummvm for Kodi" PKG_TOOLCHAIN="make" PKG_LIBNAME="scummvm_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="SCUMMVM_LIB" PKG_MAKE_OPTS_TARGET="platform=unix GIT_VERSION=${PKG_VERSION:0:7}" pre_configure_target() { cd ${PKG_BUILD} if [ "${TARGET_ARCH}" = "arm" ]; then PKG_MAKE_OPTS_TARGET+=" TARGET_64BIT=0" else PKG_MAKE_OPTS_TARGET+=" TARGET_64BIT=1" fi if target_has_feature neon; then PKG_MAKE_OPTS_TARGET+=" HAVE_NEON=1" fi if [ "${BUILD_WITH_DEBUG}" = "yes" ]; then PKG_MAKE_OPTS_TARGET+=" DEBUG=1" fi } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-scummvm/patches/0001-libretro-Move-scummvm.ini-to-writable-save-directory.patch ================================================ From a7c2f414b2e5db27e896072cbb45abedcbfb61e1 Mon Sep 17 00:00:00 2001 From: Garrett Brown Date: Thu, 28 Oct 2021 16:00:20 -0700 Subject: [PATCH] libretro: Move scummvm.ini to writable save directory --- src/libretro_os.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libretro_os.cpp b/src/libretro_os.cpp index eeb29baf5e..0630f1c565 100644 --- a/src/libretro_os.cpp +++ b/src/libretro_os.cpp @@ -681,7 +681,7 @@ public: virtual Audio::Mixer *getMixer() { return _mixer; } - virtual Common::String getDefaultConfigFileName() { return s_systemDir + "/scummvm.ini"; } + virtual Common::String getDefaultConfigFileName() { return s_saveDir + "/scummvm.ini"; } virtual void logMessage(LogMessageType::Type type, const char *message) { if (log_cb) -- 2.34.1 ================================================ FILE: packages/emulation/libretro-snes9x/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-snes9x" PKG_VERSION="bc3bbb28c1723742d102c867e264574915d7c8ef" PKG_SHA256="59e43b695021f2444103a345bb95f44870bd4792af7580d71b95f61bb9ad35f9" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/snes9x" PKG_URL="https://github.com/libretro/snes9x/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.snes9x: snes9x for Kodi" PKG_TOOLCHAIN="manual" PKG_LIBNAME="snes9x_libretro.so" PKG_LIBPATH="libretro/${PKG_LIBNAME}" PKG_LIBVAR="SNES9X_LIB" make_target() { make -C libretro/ } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-snes9x2002/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-snes9x2002" PKG_VERSION="540baad622d9833bba7e0696193cb06f5f02f564" PKG_SHA256="07f0e54c61b2608480157a2259dfa7aba2ff3e746935b3b51068b0f69d67d289" PKG_ARCH="arm" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libretro/snes9x2002" PKG_URL="https://github.com/libretro/snes9x2002/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="Port of SNES9x 1.39 for libretro. Heavily optimized for ARM." PKG_LIBNAME="snes9x2002_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="SNES9X2002_LIB" pre_make_target() { export CFLAGS="${CFLAGS} -std=gnu11" } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-snes9x2010/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-snes9x2010" PKG_VERSION="d8b10c4cd7606ed58f9c562864c986bc960faaaf" PKG_SHA256="7faf4243226cfed3a2926ef78d7db74905947ecda8770575a81b1792b2345302" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/snes9x2010" PKG_URL="https://github.com/libretro/snes9x2010/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="snes9x2010 for Kodi" PKG_LIBNAME="snes9x2010_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="SNES9X2010_LIB" makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-stella/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-stella" PKG_VERSION="8ab051edd4816f33a5631d230d54059eeed52c5f" PKG_SHA256="08976546ed707e7d83a1e4b1204bba8e854f41c0a0a9d8d5d8447c4489fb1fe0" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/stella-libretro" PKG_URL="https://github.com/libretro/stella2014-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.stella: Stella for Kodi" PKG_LIBNAME="stella2014_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="STELLA_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-tgbdual/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-tgbdual" PKG_VERSION="a6f3018e6a23030afc1873845ee54d4b2d8ec9d3" PKG_SHA256="5df48cf8a8091cb68b5f21e90671cf27afaf2d0fcf35431093cccff0e4e95c7f" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/tgbdual-libretro" PKG_URL="https://github.com/libretro/tgbdual-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.tgbdual: tgbdual for Kodi" PKG_LIBNAME="tgbdual_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="TGBDUAL_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-tyrquake/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-tyrquake" PKG_VERSION="fdd8d2746d527722dffe2ac9a208a753bef62f7b" PKG_SHA256="f2c4a88974230ad7b517dc1de4e24a9cfb2f5b4c0f38b1b0a4c9e5c7721f7fad" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/tyrquake" PKG_URL="https://github.com/libretro/tyrquake/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.tyrquake: tyrquake for Kodi" PKG_LIBNAME="tyrquake_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="TYRQUAKE_LIB" make_target() { make } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-uae/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-uae" PKG_VERSION="9f0f10d92cc83afa66d35d398b7af959bd4b90c5" PKG_SHA256="6e9afa5c7711587f64e91cee456d1aa0a13ce22068999598b508f2bc6e0bd9ad" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libretro/libretro-uae" PKG_URL="https://github.com/libretro/libretro-uae/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="libretro wrapper for UAE emulator." PKG_BUILD_FLAGS="-lto" PKG_LIBNAME="puae_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="UAE_LIB" pre_configure_target() { CFLAGS+=" -fcommon" if [ "${TARGET_ARCH}" = "arm" ]; then CFLAGS+=" -DARM -marm" fi } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-uae4arm/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-uae4arm" PKG_VERSION="5cbf44464507ff9262c2403c9f8d5bc5957afd1a" PKG_SHA256="4d97fb681f6de97569ad9e653bd4178aea37803d6370c23a1d3d5d4a06f5e2dd" PKG_ARCH="arm" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libretro/uae4arm-libretro" PKG_URL="https://github.com/libretro/uae4arm-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain zlib" PKG_LONGDESC="UAE4ARM amiga emulator." PKG_LIBNAME="uae4arm_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="UAE4ARM_LIB" pre_configure_target() { if target_has_feature neon; then CFLAGS+=" -D__NEON_OPT" fi } make_target() { if target_has_feature neon; then PKG_HAVE_NEON=1 else PKG_HAVE_NEON=0 fi make HAVE_NEON=${PKG_HAVE_NEON} USE_PICASSO96=1 } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-vba-next/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-vba-next" PKG_VERSION="5f497a9e70c94cbaaf6deb3c8299bd6b02002a5d" PKG_SHA256="2c8553acefc84131b518e9c2ae6683533cc1c183ea4d6610bdadc10fa9c265b4" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/vba-next" PKG_URL="https://github.com/libretro/vba-next/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.vba-next: VBA-Next for Kodi" PKG_LIBNAME="vba_next_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="VBA-NEXT_LIB" make_target() { make -f Makefile.libretro } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-vbam/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-vbam" PKG_VERSION="7e30b038893de63e674944f75581d57c7685ea3a" PKG_SHA256="589d4c4ff0764ea0f3b4829291bff773ef228926531fb35a1705f8770ea130a2" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/vbam-libretro" PKG_URL="https://github.com/libretro/vbam-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.vbam: VBA-M for Kodi" PKG_TOOLCHAIN="make" PKG_LIBNAME="vbam_libretro.so" PKG_LIBPATH="src/libretro/${PKG_LIBNAME}" PKG_LIBVAR="VBAM_LIB" pre_configure_target() { # fails to build in subdirs cd ${PKG_BUILD} rm -rf .${TARGET_NAME} } make_target() { make -C src/libretro } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-vecx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-vecx" PKG_VERSION="8e932c1d585ae9e467186dea9e73ce38fe1490f7" PKG_SHA256="19eaa6d1ad035c01e979550787319f7d0b2398288f7c657eefea6c6d9b4cf49f" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/libretro-vecx" PKG_URL="https://github.com/libretro/libretro-vecx/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.vecx: vecx for Kodi" PKG_LIBNAME="vecx_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="VECX_LIB" if [ "${OPENGLES_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi if [ "${OPENGL_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGL}" fi make_target() { if [ "${OPENGL_SUPPORT}" = no ]; then HAS_GLES=1 make else make fi } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-vice/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-vice" PKG_VERSION="3934cf8b507a14376d99971ef364fc6c7386ba5e" PKG_SHA256="377914aa2e0a78b1da5dd33513cc038733b331d33cbfb974e068d36c4cba640f" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/vice-libretro" PKG_URL="https://github.com/libretro/vice-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="VICE C64 libretro" PKG_LIBNAME="vice_x64_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="VICE_LIB" pre_build_target() { export GIT_VERSION=${PKG_VERSION} } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-vircon32/package.mk ================================================ PKG_NAME="libretro-vircon32" PKG_VERSION="d8a92430e887286b4e5351916ef0bd35d8cb40e8" PKG_SHA512="8746ba64b721954adab761dad17071d6c92a48bb35944d6cc1360c25046774ec9cc2f6c144036a3376deb9723e9d106ffc2bf520e4a4595130e8ef864bb5bd2d" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/vircon32/vircon32-libretro" PKG_URL="${PKG_SITE}.git" GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="cmake" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="opengl-meson" PKG_LONGDESC="Vircon32 32-bit Virtual Console" pre_configure_target() { PKG_CMAKE_OPTS_TARGET+=" \ -DENABLE_OPENGLES2=1 \ -DPLATFORM=EMUELEC \ -DOPENGL_INCLUDE_DIR=${SYSROOT_PREFIX}/usr/include \ -DCMAKE_BUILD_TYPE=Release" } PKG_LIBNAME="vircon32_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="VIRCON32_LIB" makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-virtualjaguar/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-virtualjaguar" PKG_VERSION="2cc06899b839639397b8b30384a191424b6f529d" PKG_SHA256="08d0f3403b41a2606e66aa78e35e3cd8fff8bf14050b260ce6f0395f51d48f7b" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/virtualjaguar-libretro" PKG_URL="https://github.com/libretro/virtualjaguar-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="Port of Virtual Jaguar to Libretro" PKG_LIBNAME="virtualjaguar_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="VIRTUALJAGUAR_LIB" makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/libretro-yabause/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libretro-yabause" PKG_VERSION="4c96b96f7fbe07223627c469ff33376b2a634748" PKG_SHA256="76f50b21d81507ac29e80bbcfbfc8dbf71d6bf051f1267973eabed99a6681654" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/yabause" PKG_URL="https://github.com/libretro/yabause/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_LONGDESC="game.libretro.yabause: Yabause for Kodi" PKG_TOOLCHAIN="make" PKG_LIBNAME="yabause_libretro.so" PKG_LIBPATH="yabause/src/libretro/${PKG_LIBNAME}" PKG_MAKE_OPTS_TARGET="-C yabause/src/libretro GIT_VERSION=${PKG_VERSION:0:7}" pre_configure_target() { if [ "${ARCH}" = "arm" ]; then PKG_MAKE_OPTS_TARGET+=" platform=armv" # ARM NEON support if target_has_feature neon; then PKG_MAKE_OPTS_TARGET+="-neon" fi PKG_MAKE_OPTS_TARGET+="-${TARGET_FLOAT}float-${TARGET_CPU}" elif [ "${TARGET_ARCH}" = "aarch64" ]; then sed -i "s|FLAGS += -marm||" ${PKG_BUILD}/yabause/src/libretro/Makefile PKG_MAKE_OPTS_TARGET+=" platform=armv" fi } pre_make_target() { make CC=${HOST_CC} -C yabause/src/libretro generate-files } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME} cp ${PKG_LIBPATH} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME} echo "set(${PKG_LIBVAR} ${SYSROOT_PREFIX}/usr/lib/${PKG_LIBNAME})" > ${SYSROOT_PREFIX}/usr/lib/cmake/${PKG_NAME}/${PKG_NAME}-config.cmake } ================================================ FILE: packages/emulation/rcheevos/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rcheevos" PKG_VERSION="9.2.0" PKG_SHA256="c8ed6ca74f905ea0c256250e46cced579922880001337e7c3d3d68179ad89d4e" PKG_LICENSE="MIT" PKG_SITE="https://github.com/RetroAchievements/rcheevos" PKG_URL="https://github.com/RetroAchievements/rcheevos/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Library to parse and evaluate achievements and leaderboards for RetroAchievements" PKG_BUILD_FLAGS="+pic" post_unpack() { # rcheevos doesn't come with any build files, use a copy of the cmake file in # game.libretro (depends/common/rcheevos/CMakeLists.txt) cp "${PKG_DIR}/source/CMakeLists.txt" "${PKG_BUILD}" } ================================================ FILE: packages/emulation/rcheevos/source/CMakeLists.txt ================================================ project(rcheevos) cmake_minimum_required(VERSION 3.0) # Disable Lua for now add_definitions(-DRC_DISABLE_LUA) include_directories( include ) add_library(${PROJECT_NAME}lib src/rcheevos/alloc.c src/rcheevos/compat.c src/rcheevos/condition.c src/rcheevos/condset.c src/rcheevos/consoleinfo.c src/rcheevos/format.c src/rcheevos/lboard.c src/rcheevos/memref.c src/rcheevos/operand.c src/rcheevos/richpresence.c src/rcheevos/runtime.c src/rcheevos/runtime_progress.c src/rcheevos/trigger.c src/rcheevos/value.c src/rhash/cdreader.c src/rhash/hash.c src/rhash/md5.c src/rurl/url.c ) #add_dependencies(rcheevos # lua # TODO #) #target_link_libraries(rcheevos # lua #) install(TARGETS ${PROJECT_NAME}lib ARCHIVE DESTINATION lib DESTINATION lib ) install( FILES include/rcheevos.h include/rconsoles.h include/rhash.h include/rurl.h DESTINATION include/${PROJECT_NAME} ) #install( # DIRECTORY # include # DESTINATION # include #) ================================================ FILE: packages/graphics/assimp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="assimp" PKG_VERSION="5.2.5" PKG_SHA256="b5219e63ae31d895d60d98001ee5bb809fb2c7b2de1e7f78ceeb600063641e1a" PKG_LICENSE="BSD" PKG_SITE="https://github.com/assimp/assimp" PKG_URL="https://github.com/assimp/assimp/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain zlib" PKG_LONGDESC="A library to import and export various 3d-model-formats including scene-post-processing to generate missing render data." PKG_CMAKE_OPTS_TARGET="-DASSIMP_BUILD_ASSIMP_TOOLS=OFF \ -DASSIMP_BUILD_TESTS=OFF \ -DASSIMP_WARNINGS_AS_ERRORS=OFF" ================================================ FILE: packages/graphics/bcm2835-driver/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="bcm2835-driver" PKG_VERSION="fdb9eafae4b83e553593937eae8e77b0193903c3" PKG_SHA256="ae590baa29a507fa50b5beae46643519a2d2e012945668cfc7393f9275793c78" PKG_LICENSE="nonfree" PKG_SITE="http://www.broadcom.com" PKG_URL="${DISTRO_SRC}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain dtc" PKG_LONGDESC="OpenMAX-bcm2835: OpenGL-ES and OpenMAX driver for BCM2835" PKG_TOOLCHAIN="manual" # Set SoftFP ABI or HardFP ABI if [ "${TARGET_FLOAT}" = "soft" ]; then PKG_FLOAT="softfp" else PKG_FLOAT="hardfp" fi makeinstall_target() { # Install vendor header files except proprietary GL headers mkdir -p ${SYSROOT_PREFIX}/usr/include for f in $(cd ${PKG_FLOAT}/opt/vc/include; ls | grep -v "GL"); do cp -PRv ${PKG_FLOAT}/opt/vc/include/${f} ${SYSROOT_PREFIX}/usr/include done # Install vendor libs & pkgconfigs except proprietary GL libs mkdir -p ${SYSROOT_PREFIX}/usr/lib for f in $(cd ${PKG_FLOAT}/opt/vc/lib; ls *.so *.a | grep -Ev "^lib(EGL|GL)"); do cp -PRv ${PKG_FLOAT}/opt/vc/lib/${f} ${SYSROOT_PREFIX}/usr/lib done mkdir -p ${SYSROOT_PREFIX}/usr/lib/pkgconfig for f in $(cd ${PKG_FLOAT}/opt/vc/lib/pkgconfig; ls | grep -v "gl"); do cp -PRv ${PKG_FLOAT}/opt/vc/lib/pkgconfig/${f} ${SYSROOT_PREFIX}/usr/lib/pkgconfig done # Update prefix in vendor pkgconfig files for PKG_CONFIGS in $(find "${SYSROOT_PREFIX}/usr/lib" -type f -name "*.pc" 2>/dev/null); do sed -e "s#prefix=/opt/vc#prefix=/usr#g" -i "${PKG_CONFIGS}" done # Create symlinks to /opt/vc to satisfy hardcoded include & lib paths mkdir -p ${SYSROOT_PREFIX}/opt/vc ln -sf ${SYSROOT_PREFIX}/usr/lib ${SYSROOT_PREFIX}/opt/vc/lib ln -sf ${SYSROOT_PREFIX}/usr/include ${SYSROOT_PREFIX}/opt/vc/include # Install vendor libs except proprietary GL mkdir -p ${INSTALL}/usr/lib for f in $(cd ${PKG_FLOAT}/opt/vc/lib; ls *.so | grep -Ev "^lib(EGL|GL)"); do cp -PRv ${PKG_FLOAT}/opt/vc/lib/${f} ${INSTALL}/usr/lib done # Install useful tools mkdir -p ${INSTALL}/usr/bin cp -PRv ${PKG_FLOAT}/opt/vc/bin/dtoverlay ${INSTALL}/usr/bin ln -s dtoverlay ${INSTALL}/usr/bin/dtparam cp -PRv ${PKG_FLOAT}/opt/vc/bin/vcdbg ${INSTALL}/usr/bin cp -PRv ${PKG_FLOAT}/opt/vc/bin/vcgencmd ${INSTALL}/usr/bin cp -PRv ${PKG_FLOAT}/opt/vc/bin/vcmailbox ${INSTALL}/usr/bin cp -PRv ${PKG_FLOAT}/opt/vc/bin/tvservice ${INSTALL}/usr/bin cp -PRv ${PKG_FLOAT}/opt/vc/bin/edidparser ${INSTALL}/usr/bin # Create symlinks to /opt/vc to satisfy hardcoded lib paths mkdir -p ${INSTALL}/opt/vc ln -sf /usr/bin ${INSTALL}/opt/vc/bin ln -sf /usr/lib ${INSTALL}/opt/vc/lib } ================================================ FILE: packages/graphics/cairo/package.mk ================================================ # 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="cairo" PKG_VERSION="1.17.6" PKG_SHA256="4eebc4c2bad0402bc3f501db184417094657d111fb6c06f076a82ea191fe1faf" PKG_LICENSE="LGPL" PKG_SITE="https://cairographics.org/" PKG_URL="https://download.gnome.org/sources/cairo/$(get_pkg_version_maj_min)/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain zlib freetype fontconfig glib libpng pixman" PKG_LONGDESC="Cairo is a vector graphics library with cross-device output support." PKG_TOOLCHAIN="configure" configure_package() { if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" libXrender libX11 mesa" fi if [ "${OPENGL_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGL}" elif [ "${OPENGLES_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi } pre_configure_target() { PKG_CONFIGURE_OPTS_TARGET="--disable-silent-rules \ --enable-shared \ --disable-static \ --disable-gtk-doc \ --enable-largefile \ --enable-atomic \ --disable-gcov \ --disable-valgrind \ --disable-xcb \ --disable-xlib-xcb \ --disable-xcb-shm \ --disable-qt \ --disable-quartz \ --disable-quartz-font \ --disable-quartz-image \ --disable-win32 \ --disable-win32-font \ --disable-os2 \ --disable-beos \ --disable-cogl \ --disable-drm \ --disable-gallium \ --enable-png \ --disable-directfb \ --disable-vg \ --disable-wgl \ --disable-script \ --enable-ft \ --enable-fc \ --enable-ps \ --enable-pdf \ --enable-svg \ --disable-test-surfaces \ --disable-tee \ --disable-xml \ --enable-pthread \ --enable-gobject=yes \ --disable-full-testing \ --disable-rpath \ --disable-trace \ --enable-interpreter \ --disable-symbol-lookup \ --enable-some-floating-point \ --with-gnu-ld" if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_CONFIGURE_OPTS_TARGET+=" --x-includes="${SYSROOT_PREFIX}/usr/include" \ --x-libraries="${SYSROOT_PREFIX}/usr/lib" \ --enable-xlib \ --enable-xlib-xrender \ --with-x" else PKG_CONFIGURE_OPTS_TARGET+=" --disable-xlib \ --disable-xlib-xrender \ --without-x" fi if [ "${OPENGL_SUPPORT}" = "yes" ]; then PKG_CONFIGURE_OPTS_TARGET+=" --enable-gl \ --enable-glx \ --disable-glesv2 \ --disable-egl" elif [ "${OPENGLES_SUPPORT}" = "yes" ]; then PKG_CONFIGURE_OPTS_TARGET+=" --disable-gl \ --disable-glx \ --enable-glesv2 \ --enable-egl" else PKG_CONFIGURE_OPTS_TARGET+=" --disable-gl \ --disable-glx \ --disable-glesv2 \ --disable-egl" fi } post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/graphics/ftgl/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="ftgl" PKG_VERSION="2.1.2" PKG_SHA256="0f61d978c28cd5d78daded591f5b03f71248c0a51c7965733e8729c874265f50" PKG_LICENSE="GPL" PKG_SITE="http://sourceforge.net/projects/ftgl/" PKG_URL="${DISTRO_SRC}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain freetype" PKG_LONGDESC="a free cross-platform Open Source C++ library that uses Freetype2 to simplify rendering fonts in OpenGL applications" PKG_CMAKE_OPTS_TARGET="-DOUTPUT_DIR=${SYSROOT_PREFIX}/usr" ================================================ FILE: packages/graphics/ftgl/patches/ftgl-01-cmake.patch ================================================ From c6dea8249d50f1f463db6ca89bc582259c54b86a Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Sat, 4 Jul 2015 12:42:40 +0300 Subject: [PATCH] cmake --- CMakeLists.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..18791c4 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,16 @@ +project(ftgl) + +cmake_minimum_required(VERSION 2.6) +enable_language(CXX) + +include(ExternalProject) + +externalproject_add(ftgl + SOURCE_DIR ${CMAKE_SOURCE_DIR} + UPDATE_COMMAND cd unix && autoreconf -vif + CONFIGURE_COMMAND cd unix && CXXFLAGS=-fpermissive ./configure --prefix=${OUTPUT_DIR} --with-freetype-prefix=${OUTPUT_DIR} --with-pic + BUILD_COMMAND cd unix && make + INSTALL_COMMAND "" + BUILD_IN_SOURCE 1) + +install(CODE "execute_process(COMMAND make install WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/unix)") -- 1.7.10.4 ================================================ FILE: packages/graphics/ftgl/patches/ftgl-01-ftgl-disable-docs.patch ================================================ --- ftgl.orig/unix/Makefile 2014-08-04 17:21:22.210742862 +0200 +++ ftgl/unix/Makefile 2003-01-12 22:27:04.000000000 +0100 @@ -1,7 +1,7 @@ top_builddir=. -include $(top_builddir)/Make.conf -SUBDIRS = src demo docs +SUBDIRS = src demo AUTOGEN = Make.conf config.log config.status libtool autom4te.cache ftgl.pc AUTOGEN_MAINT = aclocal.m4 acinclude.m4 config.guess config.sub configure ltmain.sh install-sh ================================================ FILE: packages/graphics/gdk-pixbuf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="gdk-pixbuf" PKG_VERSION="2.42.10" PKG_SHA256="ee9b6c75d13ba096907a2e3c6b27b61bcd17f5c7ebeab5a5b439d2f2e39fe44b" PKG_LICENSE="OSS" PKG_SITE="http://www.gtk.org/" PKG_URL="https://ftp.gnome.org/pub/gnome/sources/gdk-pixbuf/${PKG_VERSION:0:4}/gdk-pixbuf-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain glib libjpeg-turbo libpng jasper shared-mime-info tiff" PKG_DEPENDS_CONFIG="shared-mime-info" PKG_LONGDESC="GdkPixbuf is a a GNOME library for image loading and manipulation." configure_package() { if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" libX11" fi } pre_configure_target() { PKG_MESON_OPTS_TARGET="--wrap-mode=nodownload \ -Dgtk_doc=false \ -Ddocs=false \ -Dintrospection=disabled \ -Dman=false \ -Drelocatable=false \ -Dinstalled_tests=false \ -Dtests=false" if [ "${DISPLAYSERVER}" != "x11" ]; then PKG_MESON_OPTS_TARGET+=" -Dbuiltin_loaders=all" fi } ================================================ FILE: packages/graphics/giflib/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="giflib" PKG_VERSION="5.2.1" PKG_SHA256="31da5562f44c5f15d63340a09a4fd62b48c45620cd302f77a6d9acf0077879bd" PKG_LICENSE="OSS" PKG_SITE="http://giflib.sourceforge.net/" PKG_URL="${SOURCEFORGE_SRC}/giflib/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="zlib:host" PKG_DEPENDS_TARGET="toolchain zlib" PKG_LONGDESC="giflib: giflib service library" PKG_TOOLCHAIN="manual" make_host() { make libgif.a CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" } makeinstall_host() { make install-include PREFIX="${TOOLCHAIN}" make install-lib PREFIX="${TOOLCHAIN}" } ================================================ FILE: packages/graphics/giflib/patches/giflib-01-static-lib.patch ================================================ --- a/Makefile +++ b/Makefile @@ -99,9 +99,6 @@ install-lib: $(INSTALL) -d "$(DESTDIR)$(LIBDIR)" $(INSTALL) -m 644 libgif.a "$(DESTDIR)$(LIBDIR)/libgif.a" - $(INSTALL) -m 755 libgif.so "$(DESTDIR)$(LIBDIR)/libgif.so.$(LIBVER)" - ln -sf libgif.so.$(LIBVER) "$(DESTDIR)$(LIBDIR)/libgif.so.$(LIBMAJOR)" - ln -sf libgif.so.$(LIBMAJOR) "$(DESTDIR)$(LIBDIR)/libgif.so" install-man: $(INSTALL) -d "$(DESTDIR)$(MANDIR)/man1" $(INSTALL) -m 644 doc/*.1 "$(DESTDIR)$(MANDIR)/man1" ================================================ FILE: packages/graphics/glew/package.mk ================================================ # 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="glew" PKG_VERSION="2.2.0" PKG_SHA256="d4fc82893cfb00109578d0a1a2337fb8ca335b3ceccf97b97e5cc7f08e4353e1" PKG_LICENSE="BSD" PKG_SITE="http://glew.sourceforge.net/" PKG_URL="${SOURCEFORGE_SRC}/glew/glew/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tgz" PKG_DEPENDS_TARGET="toolchain libX11" PKG_LONGDESC="A cross-platform C/C++ extension loading library." make_target() { make CC="${CC}" LD="${CC}" AR="${AR}" \ POPT="${CFLAGS}" LDFLAGS.EXTRA="${LDFLAGS}" \ GLEW_DEST="/usr" LIBDIR="/usr/lib" lib/libGLEW.a glew.pc } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib cp -PR lib/libGLEW.a ${SYSROOT_PREFIX}/usr/lib mkdir -p ${SYSROOT_PREFIX}/usr/lib/pkgconfig cp -PR glew.pc ${SYSROOT_PREFIX}/usr/lib/pkgconfig mkdir -p ${SYSROOT_PREFIX}/usr/include cp -PR include/GL ${SYSROOT_PREFIX}/usr/include } ================================================ FILE: packages/graphics/glew/patches/glew-01-fix-pkgconf.patch ================================================ diff -Naur glew-1.13.0/glew.pc.in glew-1.13.0.patch/glew.pc.in --- glew-1.13.0/glew.pc.in 2015-08-10 13:47:22.000000000 +0200 +++ glew-1.13.0.patch/glew.pc.in 2015-11-19 10:01:42.694904497 +0100 @@ -1,6 +1,6 @@ prefix=@prefix@ exec_prefix=${prefix} -libdir=@libdir@ +libdir=${exec_prefix}/lib includedir=${prefix}/include Name: glew ================================================ FILE: packages/graphics/glm/config/glm.pc ================================================ prefix=/usr includedir=${prefix}/include Name: GLM Description: OpenGL Mathematics Version: @@VERSION@@ Cflags: -I${includedir} ================================================ FILE: packages/graphics/glm/config/glmConfig.cmake ================================================ set(GLM_VERSION "@@VERSION@@") ####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() ####### get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE) macro(set_and_check _var _file) set(${_var} "${_file}") if(NOT EXISTS "${_file}") message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !") endif() endmacro() #################################################################################### set_and_check(GLM_INCLUDE_DIRS "${PACKAGE_PREFIX_DIR}/include") if (NOT CMAKE_VERSION VERSION_LESS "3.0") include("${CMAKE_CURRENT_LIST_DIR}/glmTargets.cmake") endif() ================================================ FILE: packages/graphics/glm/config/glmConfigVersion.cmake ================================================ # This is a basic version file for the Config-mode of find_package(). # It is used by write_basic_package_version_file() as input file for configure_file() # to create a version-file which can be installed along a config.cmake file. # # The created file sets PACKAGE_VERSION_EXACT if the current version string and # the requested version string are exactly the same and it sets # PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version. # The variable CVF_VERSION must be set before calling configure_file(). set(PACKAGE_VERSION "@@VERSION@@") if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) set(PACKAGE_VERSION_COMPATIBLE FALSE) else() set(PACKAGE_VERSION_COMPATIBLE TRUE) if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) set(PACKAGE_VERSION_EXACT TRUE) endif() endif() # if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "@@VOID_SIZE@@" STREQUAL "") return() endif() # check that the installed version has the same 32/64bit-ness as the one which is currently searching: if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "@@VOID_SIZE@@") math(EXPR installedBits "@@VOID_SIZE@@ * 8") set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") set(PACKAGE_VERSION_UNSUITABLE FALSE) endif() ================================================ FILE: packages/graphics/glm/config/glmTargets.cmake ================================================ # Generated by CMake if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.5) message(FATAL_ERROR "CMake >= 2.6.0 required") endif() cmake_policy(PUSH) cmake_policy(VERSION 2.6) #---------------------------------------------------------------- # Generated CMake target import file. #---------------------------------------------------------------- # Commands may need to know the format version. set(CMAKE_IMPORT_FILE_VERSION 1) # Protect against multiple inclusion, which would fail when already imported targets are added once more. set(_targetsDefined) set(_targetsNotDefined) set(_expectedTargets) foreach(_expectedTarget glm) list(APPEND _expectedTargets ${_expectedTarget}) if(NOT TARGET ${_expectedTarget}) list(APPEND _targetsNotDefined ${_expectedTarget}) endif() if(TARGET ${_expectedTarget}) list(APPEND _targetsDefined ${_expectedTarget}) endif() endforeach() if("${_targetsDefined}" STREQUAL "${_expectedTargets}") unset(_targetsDefined) unset(_targetsNotDefined) unset(_expectedTargets) set(CMAKE_IMPORT_FILE_VERSION) cmake_policy(POP) return() endif() if(NOT "${_targetsDefined}" STREQUAL "") message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_targetsDefined}\nTargets not yet defined: ${_targetsNotDefined}\n") endif() unset(_targetsDefined) unset(_targetsNotDefined) unset(_expectedTargets) # Compute the installation prefix relative to this file. get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) # Use original install prefix when loaded through a # cross-prefix symbolic link such as /lib -> /usr/lib. get_filename_component(_realCurr "${_IMPORT_PREFIX}" REALPATH) get_filename_component(_realOrig "/usr/lib/cmake/glm" REALPATH) if(_realCurr STREQUAL _realOrig) set(_IMPORT_PREFIX "/usr/lib/cmake/glm") endif() unset(_realOrig) unset(_realCurr) get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) if(_IMPORT_PREFIX STREQUAL "/") set(_IMPORT_PREFIX "") endif() # Create imported target glm add_library(glm INTERFACE IMPORTED) set_target_properties(glm PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include" ) if(CMAKE_VERSION VERSION_LESS 3.0.0) message(FATAL_ERROR "This file relies on consumers using CMake 3.0.0 or greater.") endif() # Load information for each installed configuration. get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) file(GLOB CONFIG_FILES "${_DIR}/glmTargets-*.cmake") foreach(f ${CONFIG_FILES}) include(${f}) endforeach() # Cleanup temporary variables. set(_IMPORT_PREFIX) # Loop over all imported files and verify that they actually exist foreach(target ${_IMPORT_CHECK_TARGETS} ) foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} ) if(NOT EXISTS "${file}" ) message(FATAL_ERROR "The imported target \"${target}\" references the file \"${file}\" but this file does not exist. Possible reasons include: * The file was deleted, renamed, or moved to another location. * An install or uninstall procedure did not complete successfully. * The installation package was faulty and contained \"${CMAKE_CURRENT_LIST_FILE}\" but not all the files it references. ") endif() endforeach() unset(_IMPORT_CHECK_FILES_FOR_${target}) endforeach() unset(_IMPORT_CHECK_TARGETS) # This file does not depend on other imported targets which have # been exported from the same project but in a separate export set. # Commands beyond this point should not need to know the version. set(CMAKE_IMPORT_FILE_VERSION) cmake_policy(POP) ================================================ FILE: packages/graphics/glm/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="glm" PKG_VERSION="0.9.9.8" PKG_SHA256="37e2a3d62ea3322e43593c34bae29f57e3e251ea89f4067506c94043769ade4c" PKG_LICENSE="MIT" PKG_SITE="https://glm.g-truc.net/" PKG_URL="https://github.com/g-truc/glm/releases/download/${PKG_VERSION}/glm-${PKG_VERSION}.zip" PKG_SOURCE_DIR="glm" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="OpenGL Mathematics (GLM)" # Not needed by GLM itself, but users will need it. So instead of adding this # to every user, put it here once. if [ "${OPENGLES_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi if [ "${OPENGL_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGL}" fi # Hack install solution until cmake install restored in upstream package makeinstall_target() { target_has_feature 32bit && PKG_VOID_SIZE=4 || PKG_VOID_SIZE=8 for _dir in ${SYSROOT_PREFIX} ${INSTALL}; do mkdir -p ${_dir}/usr/include ${_dir}/usr/lib/pkgconfig ${_dir}/usr/lib/cmake/glm cp -r ${PKG_BUILD}/glm ${_dir}/usr/include cp ${PKG_DIR}/config/glm.pc ${_dir}/usr/lib/pkgconfig cp ${PKG_DIR}/config/*.cmake ${_dir}/usr/lib/cmake/glm sed -e "s/@@VERSION@@/${PKG_VERSION}/g" \ -e "s/@@VOID_SIZE@@/${PKG_VOID_SIZE}/g" \ -i ${_dir}/usr/lib/pkgconfig/glm.pc ${_dir}/usr/lib/cmake/glm/*.cmake done } ================================================ FILE: packages/graphics/glmark2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="glmark2" PKG_VERSION="2023.01" PKG_SHA256="8fece3fc323b643644a525be163dc4931a4189971eda1de8ad4c1712c5db3d67" PKG_LICENSE="GPL-3.0-or-later" PKG_SITE="https://github.com/glmark2/glmark2" PKG_URL="https://github.com/glmark2/glmark2/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libjpeg-turbo libpng" PKG_LONGDESC="glmark2 is an OpenGL 2.0 and ES 2.0 benchmark" if [ "${OPENGL_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGL}" elif [ "${OPENGLES_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi case ${DISPLAYSERVER} in wl) PKG_DEPENDS_TARGET+=" wayland wayland-protocols" PKG_MESON_OPTS_TARGET="-Dflavors=wayland-glesv2" ;; x11) PKG_DEPENDS_TARGET+=" libX11" PKG_MESON_OPTS_TARGET="-Dflavors=x11-gl" ;; *) PKG_DEPENDS_TARGET+=" systemd libdrm" PKG_MESON_OPTS_TARGET="-Dflavors=drm-glesv2" ;; esac ================================================ FILE: packages/graphics/glu/package.mk ================================================ # 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="glu" PKG_VERSION="9.0.2" PKG_SHA256="6e7280ff585c6a1d9dfcdf2fca489251634b3377bfc33c29e4002466a38d02d4" PKG_LICENSE="OSS" PKG_SITE="https://gitlab.freedesktop.org/mesa/glu/" PKG_URL="https://mesa.freedesktop.org/archive/glu/glu-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libglvnd mesa" PKG_NEED_UNPACK="$(get_pkg_directory mesa)" PKG_LONGDESC="libglu is the The OpenGL utility library" PKG_MESON_OPTS_TARGET="-Dgl_provider=gl" ================================================ FILE: packages/graphics/harfbuzz/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="harfbuzz" PKG_VERSION="6.0.0" PKG_SHA256="1d1010a1751d076d5291e433c138502a794d679a7498d1268ee21e2d4a140eb4" PKG_LICENSE="GPL" PKG_SITE="http://www.freedesktop.org/wiki/Software/HarfBuzz" PKG_URL="https://github.com/harfbuzz/harfbuzz/releases/download/${PKG_VERSION}/harfbuzz-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain cairo freetype glib" PKG_LONGDESC="HarfBuzz is an OpenType text shaping engine." PKG_MESON_OPTS_TARGET="-Dbenchmark=disabled \ -Dcairo=enabled \ -Ddocs=disabled \ -Dfreetype=enabled \ -Dglib=enabled \ -Dgobject=disabled \ -Dgraphite=disabled \ -Dicu=disabled \ -Dtests=disabled" ================================================ FILE: packages/graphics/jasper/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="jasper" PKG_VERSION="4.0.0" PKG_SHA256="977c4c2e4210f4e37313cd2232d99e73d57ab561917b3c060bcdd5e83a0a13f1" PKG_LICENSE="OpenSource" PKG_SITE="http://www.ece.uvic.ca/~mdadams/jasper/" PKG_URL="https://github.com/jasper-software/jasper/archive/refs/tags/version-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libjpeg-turbo" PKG_LONGDESC="A implementation of the ISO/IEC 15444-1 also known as JPEG-2000 standard for image compression." PKG_BUILD_FLAGS="+pic" PKG_CMAKE_OPTS_TARGET="-DJAS_ENABLE_DOC=false \ -DJAS_ENABLE_PROGRAMS=false \ -DJAS_ENABLE_SHARED=false \ -DJAS_STDC_VERSION=201710L" pre_configure_target() { export CFLAGS="${CFLAGS} -std=gnu17" } ================================================ FILE: packages/graphics/kmscube/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="kmscube" PKG_VERSION="9f63f359fab1b5d8e862508e4e51c9dfe339ccb0" PKG_SHA256="896ac76671a9b89836a7014b16cc85b45b041e03fe34a8f529f4718aa2b15cef" PKG_LICENSE="GPL" PKG_SITE="https://gitlab.freedesktop.org/mesa/kmscube" PKG_URL="https://gitlab.freedesktop.org/mesa/kmscube/-/archive/master/kmscube-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Example KMS/GBM/EGL application" if [ "${OPENGLES_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGLES}" elif [ "${OPENGL_SUPPORT}" = "yes" ]; then echo "kmscube only supports OpenGLESv2" exit 0 fi ================================================ FILE: packages/graphics/kmsxx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="kmsxx" PKG_VERSION="2bd85abc108e0688384f42b0ec83dcd5a622d50d" PKG_SHA256="b8746018d076f1474b48211ff5c1895dc668d93d206d0b2dbd03da1a3d5bb12b" PKG_LICENSE="MPL-2.0" PKG_SITE="https://github.com/tomba/kmsxx" PKG_URL="https://github.com/tomba/kmsxx/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libdrm libfmt" PKG_LONGDESC="Library and utilities for kernel mode setting" PKG_BUILD_FLAGS="-sysroot" PKG_MESON_OPTS_TARGET="-Ddefault_library=shared \ -Dkmscube=false \ -Domap=disabled \ -Dpykms=disabled" ================================================ FILE: packages/graphics/lcms2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="lcms2" PKG_VERSION="2.14" PKG_SHA256="28474ea6f6591c4d4cee972123587001a4e6e353412a41b3e9e82219818d5740" PKG_LICENSE="MIT/GPLv3" PKG_SITE="http://www.littlecms.com" PKG_URL="https://github.com/mm2/Little-CMS/releases/download/lcms${PKG_VERSION}/lcms2-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain tiff" PKG_LONGDESC="An small-footprint color management engine, with special focus on accuracy and performance." PKG_BUILD_FLAGS="+pic" PKG_MESON_OPTS_TARGET="--default-library static" ================================================ FILE: packages/graphics/libde265/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libde265" PKG_VERSION="1.0.9" PKG_SHA256="29bc6b64bf658d81a4446a3f98e0e4636fd4fd3d971b072d440cef987d5439de" PKG_LICENSE="LGPLv3" PKG_SITE="http://www.libde265.org" PKG_URL="https://github.com/strukturag/libde265/releases/download/v${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Open h.265 video codec implementation." PKG_BUILD_FLAGS="+pic" PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=OFF \ -DENABLE_SDL=OFF \ -DENABLE_DECODER=OFF \ -DENABLE_ENCODER=OFF" ================================================ FILE: packages/graphics/libde265/patches/libde265-0002-Add-CMake-option-ENABLE-ENCODER.patch ================================================ commit 657a6ea9161d1afe780bb46c4df0e95473353e6b Author: Rudi Heitbaum Date: Sun Sep 4 00:45:25 2022 +0000 Add CMake options ENABLE_DECODER and ENABLE_ENCODER diff --git a/CMakeLists.txt b/CMakeLists.txt index ff93c52..160dbb1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,6 +68,13 @@ if(MSVC) add_definitions(-DHAVE_STDBOOL_H) endif() +option(ENABLE_DECODER "Enable Decoder" ON) +option(ENABLE_ENCODER "Enable Encoder" ON) + add_subdirectory (libde265) -add_subdirectory (dec265) -add_subdirectory (enc265) +if (ENABLE_DECODER) + add_subdirectory (dec265) +endif() +if (ENABLE_ENCODER) + add_subdirectory (enc265) +endif() ================================================ FILE: packages/graphics/libdrm/package.mk ================================================ # 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) PKG_NAME="libdrm" PKG_VERSION="2.4.115" PKG_SHA256="554cfbfe0542bddb391b4e3e05bfbbfc3e282b955bd56218d21c0616481f65eb" PKG_LICENSE="GPL" PKG_SITE="https://dri.freedesktop.org" PKG_URL="https://dri.freedesktop.org/libdrm/libdrm-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libpciaccess" PKG_LONGDESC="The userspace interface library to kernel DRM services." get_graphicdrivers PKG_MESON_OPTS_TARGET="-Dnouveau=disabled \ -Domap=disabled \ -Dexynos=disabled \ -Dtegra=disabled \ -Dcairo-tests=disabled \ -Dman-pages=disabled \ -Dvalgrind=disabled \ -Dfreedreno-kgsl=false \ -Dinstall-test-programs=true \ -Dudev=false" listcontains "${GRAPHIC_DRIVERS}" "(crocus|i915|iris)" && PKG_MESON_OPTS_TARGET+=" -Dintel=enabled" || PKG_MESON_OPTS_TARGET+=" -Dintel=disabled" listcontains "${GRAPHIC_DRIVERS}" "(r300|r600|radeonsi)" && PKG_MESON_OPTS_TARGET+=" -Dradeon=enabled" || PKG_MESON_OPTS_TARGET+=" -Dradeon=disabled" listcontains "${GRAPHIC_DRIVERS}" "radeonsi" && PKG_MESON_OPTS_TARGET+=" -Damdgpu=enabled" || PKG_MESON_OPTS_TARGET+=" -Damdgpu=disabled" listcontains "${GRAPHIC_DRIVERS}" "vmware" && PKG_MESON_OPTS_TARGET+=" -Dvmwgfx=enabled" || PKG_MESON_OPTS_TARGET+=" -Dvmwgfx=disabled" listcontains "${GRAPHIC_DRIVERS}" "vc4" && PKG_MESON_OPTS_TARGET+=" -Dvc4=enabled" || PKG_MESON_OPTS_TARGET+=" -Dvc4=disabled" listcontains "${GRAPHIC_DRIVERS}" "freedreno" && PKG_MESON_OPTS_TARGET+=" -Dfreedreno=enabled" || PKG_MESON_OPTS_TARGET+=" -Dfreedreno=disabled" listcontains "${GRAPHIC_DRIVERS}" "etnaviv" && PKG_MESON_OPTS_TARGET+=" -Detnaviv=enabled" || PKG_MESON_OPTS_TARGET+=" -Detnaviv=disabled" post_makeinstall_target() { # Remove all test programs installed by install-test-programs=true except modetest for PKG_LIBDRM_TEST in \ drmdevice modeprint proptest vbltest do safe_remove ${INSTALL}/usr/bin/${PKG_LIBDRM_TEST} done if listcontains "${GRAPHIC_DRIVERS}" "radeonsi"; then safe_remove ${INSTALL}/usr/bin/amdgpu_stress fi } ================================================ FILE: packages/graphics/libepoxy/package.mk ================================================ # 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) # libepoxy (actually) needs to be built shared, to avoid # (EE) Failed to load /usr/lib/xorg/modules/libglamoregl.so: # /usr/lib/xorg/modules/libglamoregl.so: undefined symbol: epoxy_eglCreateImageKHR # in Xorg.log PKG_NAME="libepoxy" PKG_VERSION="1.5.10" PKG_SHA256="a7ced37f4102b745ac86d6a70a9da399cc139ff168ba6b8002b4d8d43c900c15" PKG_LICENSE="GPL" PKG_SITE="https://github.com/anholt/libepoxy" PKG_URL="https://github.com/anholt/libepoxy/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Epoxy is a library for handling OpenGL function pointer management for you." if [ "${OPENGL_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGL}" fi if [ "${OPENGLES_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi if [ "${DISPLAYSERVER}" != "x11" ]; then PKG_MESON_OPTS_TARGET="-Dglx=no" fi ================================================ FILE: packages/graphics/libglvnd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libglvnd" PKG_VERSION="1.6.0" PKG_SHA256="e31dd71441604cf7467397e740af8070caa84133b5ed71241d3d5ca84c950baf" PKG_LICENSE="GPL" PKG_SITE="https://github.com/NVIDIA/libglvnd" PKG_URL="https://github.com/NVIDIA/libglvnd/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="libglvnd is a vendor-neutral dispatch layer for arbitrating OpenGL API calls between multiple vendors." configure_package() { if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" libX11 libXext xorgproto" fi } pre_configure_target(){ PKG_MESON_OPTS_TARGET="-Dgles1=false" if [ "${OPENGLES_SUPPORT}" = "no" ]; then PKG_MESON_OPTS_TARGET+=" -Dgles2=false" fi } post_makeinstall_target() { if [ "${DISPLAYSERVER}" = "x11" ]; then # Remove old symlinks to libGL.so.1.7.0 (GLVND) safe_remove ${INSTALL}/usr/lib/libGL.so safe_remove ${INSTALL}/usr/lib/libGL.so.1 # Create new symlinks to /var/lib/libGL.so ln -sf libGL.so.1 ${INSTALL}/usr/lib/libGL.so ln -sf /var/lib/libGL.so ${INSTALL}/usr/lib/libGL.so.1 # Create new symlink to libGL.so.1.7.0 ln -sf libGL.so.1.7.0 ${INSTALL}/usr/lib/libGL_glvnd.so.1 # Remove old symlinks to libGLX.so.0.0.0 (GLVND) safe_remove ${INSTALL}/usr/lib/libGLX.so safe_remove ${INSTALL}/usr/lib/libGLX.so.0 # Create new symlinks to /var/lib/libGLX.so ln -sf libGLX.so.0 ${INSTALL}/usr/lib/libGLX.so ln -sf /var/lib/libGLX.so ${INSTALL}/usr/lib/libGLX.so.0 # Create new symlink to libGLX.so.0.0.0 ln -sf libGLX.so.0.0.0 ${INSTALL}/usr/lib/libGLX_glvnd.so.0 # indirect rendering ln -sf /var/lib/libGLX_indirect.so.0 ${INSTALL}/usr/lib/libGLX_indirect.so.0 fi } ================================================ FILE: packages/graphics/libheif/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libheif" PKG_VERSION="1.14.2" PKG_SHA256="d016905e247d6952cd7ee4f9b90957350b6a6caa466bc76fdfe6eb302b6d088c" PKG_LICENSE="LGPLv3" PKG_SITE="https://www.libde265.org" PKG_URL="https://github.com/strukturag/libheif/releases/download/v${PKG_VERSION}/libheif-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libde265 libjpeg-turbo libpng" PKG_LONGDESC="A HEIF file format decoder and encoder." PKG_BUILD_FLAGS="+pic" PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=OFF \ -DWITH_EXAMPLES=OFF \ -DWITH_AOM_DECODER=OFF \ -DWITH_AOM_ENCODER=OFF" pre_configure_target() { export CXXFLAGS="${CXXFLAGS} -Wno-unused-variable" } ================================================ FILE: packages/graphics/libjpeg-turbo/package.mk ================================================ # 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) PKG_NAME="libjpeg-turbo" PKG_VERSION="2.1.4" PKG_SHA256="a78b05c0d8427a90eb5b4eb08af25309770c8379592bb0b8a863373128e6143f" PKG_LICENSE="GPL" PKG_SITE="https://libjpeg-turbo.org/" PKG_URL="https://github.com/libjpeg-turbo/libjpeg-turbo/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A high-speed version of libjpeg for x86 and x86-64 processors which uses SIMD." PKG_BUILD_FLAGS="+pic +pic:host" PKG_CMAKE_OPTS_HOST="-DENABLE_STATIC=ON \ -DENABLE_SHARED=OFF \ -DWITH_JPEG8=ON \ -DWITH_SIMD=OFF" PKG_CMAKE_OPTS_TARGET="-DENABLE_STATIC=OFF \ -DENABLE_SHARED=ON \ -DWITH_JPEG8=ON" if target_has_feature "(neon|sse)"; then PKG_CMAKE_OPTS_TARGET+=" -DWITH_SIMD=ON" else PKG_CMAKE_OPTS_TARGET+=" -DWITH_SIMD=OFF" fi if [ ${TARGET_ARCH} = "x86_64" ]; then PKG_DEPENDS_HOST+=" nasm:host" PKG_DEPENDS_TARGET+=" nasm:host" fi post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/graphics/libmali/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libmali" PKG_VERSION="d4000def121b818ae0f583d8372d57643f723fdc" PKG_SHA256="4f2103fc927cc006ee5c9b647e899f50b0dcaeee127fec713387d06a333eb404" 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 listcontains "${MALI_FAMILY}" "(t620|t720)"; then PKG_DEPENDS_TARGET+=" wayland" fi 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" 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 } ================================================ FILE: packages/graphics/libmali/scripts/libmali-setup ================================================ #!/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 ================================================ FILE: packages/graphics/libmali/system.d/libmali-setup.service ================================================ [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 ================================================ FILE: packages/graphics/libpng/package.mk ================================================ # 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) PKG_NAME="libpng" PKG_VERSION="1.6.40" PKG_SHA256="535b479b2467ff231a3ec6d92a525906fb8ef27978be4f66dbe05d3f3a01b3a1" PKG_LICENSE="LibPNG2" PKG_SITE="http://www.libpng.org/" PKG_URL="${SOURCEFORGE_SRC}/libpng/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="zlib:host" PKG_DEPENDS_TARGET="toolchain zlib" PKG_LONGDESC="An extensible file format for the lossless, portable, well-compressed storage of raster images." PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="+pic +pic:host" PKG_CONFIGURE_OPTS_TARGET="ac_cv_lib_z_zlibVersion=yes \ --enable-static \ --enable-shared" PKG_CONFIGURE_OPTS_HOST="--enable-static --disable-shared" pre_configure_host() { export CPPFLAGS="${CPPFLAGS} -I${TOOLCHAIN}/include" } pre_configure_target() { export CPPFLAGS="${CPPFLAGS} -I${SYSROOT_PREFIX}/usr/include" } post_makeinstall_target() { sed -e "s:\([\"'= ]\)/usr:\\1${SYSROOT_PREFIX}/usr:g" \ -e "s:libs=\"-lpng16\":libs=\"-lpng16 -lz\":g" \ -i ${SYSROOT_PREFIX}/usr/bin/libpng*-config sed -e 's|^Libs: -L${libdir} -lpng16|Libs: -L${libdir} -lpng16 -lz|g' \ -i ${SYSROOT_PREFIX}/usr/lib/pkgconfig/libpng*.pc rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/graphics/libprojectM/package.mk ================================================ # 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) PKG_NAME="libprojectM" PKG_VERSION="3.1.12" PKG_SHA256="62b5b1b543b25cb8ad392d879378cfdc5c129165cf4d4f33fb159e364d42f135" PKG_LICENSE="GPL" PKG_SITE="https://github.com/projectM-visualizer/projectm" PKG_URL="https://github.com/projectM-visualizer/projectm/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain freetype glm ${OPENGL}" PKG_LONGDESC="A MilkDrop compatible opensource music visualizer." PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--disable-shared \ --enable-static \ --disable-qt \ --disable-pulseaudio \ --disable-jack \ --enable-preset-subdirs" # workaround due broken release files, remove at next bump pre_configure_target() { ./autogen.sh } ================================================ FILE: packages/graphics/libraw/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libraw" PKG_VERSION="0.21.1" PKG_SHA256="630a6bcf5e65d1b1b40cdb8608bdb922316759bfb981c65091fec8682d1543cd" PKG_LICENSE="LGPL" PKG_SITE="https://www.libraw.org/" PKG_URL="https://www.libraw.org/data/LibRaw-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libjpeg-turbo lcms2" PKG_LONGDESC="A library for reading RAW files obtained from digital photo cameras (CRW/CR2, NEF, RAF, DNG, and others)" PKG_BUILD_FLAGS="+pic" PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared \ --disable-openmp \ --enable-jpeg \ --disable-jasper \ --enable-lcms \ --disable-examples" ================================================ FILE: packages/graphics/libspng/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) PKG_NAME="libspng" PKG_VERSION="0.6.1" PKG_SHA256="336856bea0216fe0ddc6cc584be5823cfd3a142e9d90d8e1635d2d2a5241f584" PKG_LICENSE="BSD 2-clause 'Simplified'" PKG_SITE="https://libspng.org/" PKG_URL="https://github.com/randy408/libspng/archive/v$PKG_VERSION.tar.gz" PKG_DEPENDS_HOST="zlib:host" PKG_DEPENDS_TARGET="toolchain zlib" PKG_LONGDESC="libspng is a C library for reading and writing Portable Network Graphics (PNG) format files with a focus on security and ease of use." PKG_TOOLCHAIN="cmake" PKG_CMAKE_OPTS_HOST="-DSPNG_STATIC=ON \ -DSPNG_SHARED=OFF" ================================================ FILE: packages/graphics/libspng/patches/libspng-0001-implement-BGRA8-for-framebuffer.patch ================================================ From 394469b37c98a213b7ae2e2cdd257e98b6c40124 Mon Sep 17 00:00:00 2001 From: Portisch Date: Tue, 1 Dec 2020 07:51:01 +0100 Subject: [PATCH] implement BGRA8 for framebuffer --- spng/spng.c | 53 +++++++++++++++++++++++++++++++++++++++++++---------- spng/spng.h | 1 + 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/spng/spng.c b/spng/spng.c index 6b24763..00feaca 100644 --- a/spng/spng.c +++ b/spng/spng.c @@ -458,6 +458,18 @@ static void rgb8_row_to_rgba8(const unsigned char *row, unsigned char *out, uint } } +static void rgb8_row_to_bgra8(const unsigned char *row, unsigned char *out, uint32_t n) +{ + uint32_t i; + for(i=0; i < n; i++) + { + *(unsigned char *)(out + i * 4 + 0) = *(unsigned char *)(row + i * 3 + 2); + *(unsigned char *)(out + i * 4 + 1) = *(unsigned char *)(row + i * 3 + 1); + *(unsigned char *)(out + i * 4 + 2) = *(unsigned char *)(row + i * 3 + 0); + out[i*4+3] = 255; + } +} + /* Calculate scanline width in bits, round up to the nearest byte */ static int calculate_scanline_width(struct spng_ctx *ctx, uint32_t width, size_t *scanline_width) { @@ -1085,7 +1097,7 @@ static inline void gamma_correct_row(unsigned char *row, uint32_t pixels, int fm { uint32_t i; - if(fmt == SPNG_FMT_RGBA8) + if(fmt == SPNG_FMT_RGBA8 || fmt == SPNG_FMT_BGRA8) { unsigned char *px; for(i=0; i < pixels; i++) @@ -1138,7 +1150,7 @@ static inline void trns_row(unsigned char *row, unsigned row_stride; unsigned depth = ihdr->bit_depth; - if(fmt == SPNG_FMT_RGBA8) + if(fmt == SPNG_FMT_RGBA8 || fmt == SPNG_FMT_BGRA8) { if(ihdr->color_type == SPNG_COLOR_TYPE_GRAYSCALE) return; /* already applied in the decoding loop */ @@ -1207,7 +1219,7 @@ static inline void scale_row(unsigned char *row, uint32_t pixels, int fmt, unsig { uint32_t i; - if(fmt == SPNG_FMT_RGBA8) + if(fmt == SPNG_FMT_RGBA8 || fmt == SPNG_FMT_BGRA8) { unsigned char px[4]; for(i=0; i < pixels; i++) @@ -1273,7 +1285,7 @@ void expand_row(unsigned char *row, unsigned char *scanline, struct spng_plte_en uint32_t i; unsigned char *px; unsigned char entry; - if(fmt == SPNG_FMT_RGBA8) + if(fmt == SPNG_FMT_RGBA8 || fmt == SPNG_FMT_BGRA8) { for(i=0; i < width; i++) { @@ -2510,6 +2522,11 @@ int spng_decode_scanline(spng_ctx *ctx, void *out, size_t len) rgb8_row_to_rgba8(scanline, out, width); break; } + else if(fmt == SPNG_FMT_BGRA8) + { + rgb8_row_to_bgra8(scanline, out, width); + break; + } memcpy(&r_8, scanline + (k * 3), 1); memcpy(&g_8, scanline + (k * 3) + 1, 1); @@ -2524,7 +2541,7 @@ int spng_decode_scanline(spng_ctx *ctx, void *out, size_t len) if(ctx->ihdr.bit_depth == 8) { - if(fmt & (SPNG_FMT_RGBA8 | SPNG_FMT_RGB8)) + if(fmt & (SPNG_FMT_RGBA8 | SPNG_FMT_RGB8 | SPNG_FMT_BGRA8)) { expand_row(out, scanline, plte, width, fmt); break; @@ -2543,7 +2560,7 @@ int spng_decode_scanline(spng_ctx *ctx, void *out, size_t len) shift_amount -= ctx->ihdr.bit_depth; } - if(fmt & (SPNG_FMT_RGBA8 | SPNG_FMT_RGB8)) + if(fmt & (SPNG_FMT_RGBA8 | SPNG_FMT_RGB8 | SPNG_FMT_BGRA8)) { pixel[0] = plte[entry].red; pixel[1] = plte[entry].green; @@ -2552,6 +2569,15 @@ int spng_decode_scanline(spng_ctx *ctx, void *out, size_t len) continue; } + else if(fmt & SPNG_FMT_BGRA8) + { + pixel[0] = plte[entry].blue; + pixel[1] = plte[entry].green; + pixel[2] = plte[entry].red; + pixel[3] = plte[entry].alpha; + + continue; + } else /* RGBA16 */ { r_16 = plte[entry].red; @@ -2652,6 +2678,13 @@ int spng_decode_scanline(spng_ctx *ctx, void *out, size_t len) if(fmt == SPNG_FMT_RGBA8) memcpy(pixel + 3, &a_8, 1); } + else if(fmt & SPNG_FMT_BGRA8) + { + memcpy(pixel, &b_8, 1); + memcpy(pixel + 1, &g_8, 1); + memcpy(pixel + 2, &r_8, 1); + memcpy(pixel + 3, &a_8, 1); + } else if(fmt == SPNG_FMT_RGBA16) { if(ctx->ihdr.bit_depth != 16) @@ -2901,7 +2934,7 @@ int spng_decode_image(spng_ctx *ctx, void *out, size_t len, int fmt, int flags) unsigned lut_entries; - if(fmt & (SPNG_FMT_RGBA8 | SPNG_FMT_RGB8)) + if(fmt & (SPNG_FMT_RGBA8 | SPNG_FMT_RGB8 | SPNG_FMT_BGRA8)) { lut_entries = 256; max = 255.0f; @@ -2974,7 +3007,7 @@ int spng_decode_image(spng_ctx *ctx, void *out, size_t len, int fmt, int flags) } } - if(ihdr->bit_depth == 16 && fmt & (SPNG_FMT_RGBA8 | SPNG_FMT_RGB8)) + if(ihdr->bit_depth == 16 && fmt & (SPNG_FMT_RGBA8 | SPNG_FMT_RGB8 | SPNG_FMT_BGRA8)) {/* samples are scaled down by 8 bits in the decode loop */ sb->red_bits -= 8; sb->green_bits -= 8; @@ -3037,7 +3070,7 @@ int spng_decode_image(spng_ctx *ctx, void *out, size_t len, int fmt, int flags) if(f.apply_trns) { - if(fmt & (SPNG_FMT_RGBA8 | SPNG_FMT_RGBA16)) + if(fmt & (SPNG_FMT_RGBA8 | SPNG_FMT_RGBA16 | SPNG_FMT_BGRA8)) { if(ihdr->color_type == SPNG_COLOR_TYPE_TRUECOLOR) { @@ -3366,7 +3399,7 @@ int spng_decoded_image_size(spng_ctx *ctx, int fmt, size_t *len) /* Currently all enums are single-bit values */ if(fmt & ((unsigned)fmt - 1)) return SPNG_EFMT; /* More than one bit is set */ - if(fmt == SPNG_FMT_RGBA8) + if(fmt == SPNG_FMT_RGBA8 || fmt == SPNG_FMT_BGRA8) { bytes_per_pixel = 4; } diff --git a/spng/spng.h b/spng/spng.h index 70ea494..048ee9e 100644 --- a/spng/spng.h +++ b/spng/spng.h @@ -144,6 +144,7 @@ enum spng_format SPNG_FMT_RGBA8 = 1, SPNG_FMT_RGBA16 = 2, SPNG_FMT_RGB8 = 4, + SPNG_FMT_BGRA8 = 8, /* Partially implemented, see documentation */ SPNG_FMT_GA8 = 16, -- 2.29.2 ================================================ FILE: packages/graphics/libwebp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present EmuELEC (https://github.com/EmuELEC) PKG_NAME="libwebp" PKG_VERSION="1.4.0" PKG_SHA256="12af50c45530f0a292d39a88d952637e43fb2d4ab1883c44ae729840f7273381" PKG_LICENSE="BSD" PKG_SITE="https://chromium.googlesource.com/webm/libwebp" PKG_URL="https://github.com/webmproject/libwebp/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain tiff" PKG_LONGDESC="WebP codec is a library to encode and decode images in WebP format." PKG_TOOLCHAIN="cmake-make" PKG_BUILD_FLAGS="+lto-parallel" PKG_CMAKE_OPTS_TARGET=" -DBUILD_SHARED_LIBS=ON -DWEBP_BUILD_ANIM_UTILS=OFF -DWEBP_BUILD_WEBPINFO=OFF -DWEBP_BUILD_VWEBP=OFF -DWEBP_BUILD_CWEBP=OFF -DWEBP_BUILD_WEBPMUX=OFF -DWEBP_BUILD_IMG2WEBP=OFF -DWEBP_BUILD_EXTRAS=OFF -DWEBP_BUILD_DWEBP=OFF" ================================================ FILE: packages/graphics/mesa/package.mk ================================================ # 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) PKG_NAME="mesa" if [ "${DEVICE}" = "RPi5" ]; then PKG_VERSION="23.2.1" PKG_SHA256="64de0616fc2d801f929ab1ac2a4f16b3e2783c4309a724c8a259b20df8bbc1cc" else PKG_VERSION="22.3.7" PKG_SHA256="894ce2f4a1c2e76177cdd2284620192d0da3066b243eec2fbb1d7cf37f13042c" fi PKG_LICENSE="OSS" PKG_SITE="http://www.mesa3d.org/" PKG_URL="https://mesa.freedesktop.org/archive/mesa-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain expat libdrm Mako:host" PKG_LONGDESC="Mesa is a 3-D graphics library with an API." get_graphicdrivers PKG_MESON_OPTS_TARGET="-Dgallium-drivers=${GALLIUM_DRIVERS// /,} \ -Dgallium-extra-hud=false \ -Dgallium-omx=disabled \ -Dgallium-nine=false \ -Dgallium-opencl=disabled \ -Dshader-cache=enabled \ -Dshared-glapi=enabled \ -Dopengl=true \ -Dgbm=enabled \ -Degl=enabled \ -Dvalgrind=disabled \ -Dlibunwind=disabled \ -Dlmsensors=disabled \ -Dbuild-tests=false \ -Dselinux=false \ -Dosmesa=false" if [ "${DEVICE}" = "RPi5" ]; then PKG_MESON_OPTS_TARGET+=" -Ddraw-use-llvm=false" else PKG_MESON_OPTS_TARGET+=" -Ddri-drivers=" fi if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" xorgproto libXext libXdamage libXfixes libXxf86vm libxcb libX11 libxshmfence libXrandr" export X11_INCLUDES= PKG_MESON_OPTS_TARGET+=" -Dplatforms=x11 \ -Ddri3=enabled \ -Dglx=dri" elif [ "${DISPLAYSERVER}" = "wl" ]; then PKG_DEPENDS_TARGET+=" wayland wayland-protocols" PKG_MESON_OPTS_TARGET+=" -Dplatforms=wayland \ -Ddri3=disabled \ -Dglx=disabled" else PKG_MESON_OPTS_TARGET+=" -Dplatforms="" \ -Ddri3=disabled \ -Dglx=disabled" fi if listcontains "${GRAPHIC_DRIVERS}" "(nvidia|nvidia-ng)"; then PKG_DEPENDS_TARGET+=" libglvnd" PKG_MESON_OPTS_TARGET+=" -Dglvnd=true" else PKG_MESON_OPTS_TARGET+=" -Dglvnd=false" fi if [ "${LLVM_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" elfutils llvm" PKG_MESON_OPTS_TARGET+=" -Dllvm=enabled" else PKG_MESON_OPTS_TARGET+=" -Dllvm=disabled" fi if [ "${VDPAU_SUPPORT}" = "yes" -a "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" libvdpau" PKG_MESON_OPTS_TARGET+=" -Dgallium-vdpau=enabled" else PKG_MESON_OPTS_TARGET+=" -Dgallium-vdpau=disabled" fi if [ "${VAAPI_SUPPORT}" = "yes" ] && listcontains "${GRAPHIC_DRIVERS}" "(r600|radeonsi)"; then PKG_DEPENDS_TARGET+=" libva" PKG_MESON_OPTS_TARGET+=" -Dgallium-va=enabled \ -Dvideo-codecs=vc1dec,h264dec,h264enc,h265dec,h265enc" else PKG_MESON_OPTS_TARGET+=" -Dgallium-va=disabled" fi if listcontains "${GRAPHIC_DRIVERS}" "vmware"; then PKG_MESON_OPTS_TARGET+=" -Dgallium-xa=enabled" else PKG_MESON_OPTS_TARGET+=" -Dgallium-xa=disabled" fi if [ "${OPENGLES_SUPPORT}" = "yes" ]; then PKG_MESON_OPTS_TARGET+=" -Dgles1=disabled -Dgles2=enabled" else PKG_MESON_OPTS_TARGET+=" -Dgles1=disabled -Dgles2=disabled" fi if [ "${VULKAN_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${VULKAN} vulkan-tools" PKG_MESON_OPTS_TARGET+=" -Dvulkan-drivers=${VULKAN_DRIVERS_MESA// /,}" else PKG_MESON_OPTS_TARGET+=" -Dvulkan-drivers=" fi ================================================ FILE: packages/graphics/nvidia/modprobe.d/nvidia-modesetting.conf ================================================ options nvidia-drm modeset=1 ================================================ FILE: packages/graphics/nvidia/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nvidia" PKG_VERSION="520.56.06" PKG_SHA256="e46ae5f497bd75370c8dea19cf3766d1bf4ae62e6343bc3c31b9a6d523f21eb3" PKG_ARCH="x86_64" PKG_LICENSE="nonfree" PKG_SITE="https://www.nvidia.com/en-us/drivers/unix/" PKG_URL="http://us.download.nvidia.com/XFree86/Linux-x86_64/${PKG_VERSION}/NVIDIA-Linux-x86_64-${PKG_VERSION}-no-compat32.run" PKG_DEPENDS_TARGET="toolchain util-macros libglvnd" PKG_LONGDESC="The GBM/Wayland graphic driver for NVIDIA GPUs supporting the GeForce 700 Series & above." PKG_TOOLCHAIN="manual" PKG_IS_KERNEL_PKG="yes" if [ "${VULKAN_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${VULKAN} vulkan-tools" fi unpack() { [ -d ${PKG_BUILD} ] && rm -rf ${PKG_BUILD} sh ${SOURCES}/${PKG_NAME}/${PKG_SOURCE_NAME} --extract-only --target ${PKG_BUILD} } make_target() { unset LDFLAGS cd kernel make module CC=${CC} LD=${LD} SYSSRC=$(kernel_path) SYSOUT=$(kernel_path) ${STRIP} --strip-debug nvidia.ko cd .. } makeinstall_target() { # Linux kernel modules mkdir -p ${INSTALL}/$(get_full_module_dir)/nvidia cp -P kernel/nvidia.ko ${INSTALL}/$(get_full_module_dir)/nvidia cp -P kernel/nvidia-drm.ko ${INSTALL}/$(get_full_module_dir)/nvidia cp -P kernel/nvidia-uvm.ko ${INSTALL}/$(get_full_module_dir)/nvidia cp -P kernel/nvidia-modeset.ko ${INSTALL}/$(get_full_module_dir)/nvidia # GBM mkdir -p ${INSTALL}/usr/lib/gbm cp -p libnvidia-allocator.so.${PKG_VERSION} ${INSTALL}/usr/lib ln -sf libnvidia-allocator.so.${PKG_VERSION} ${INSTALL}/usr/lib/liballocator.so.0 ln -sf ../libnvidia-allocator.so.${PKG_VERSION} ${INSTALL}/usr/lib/gbm/nvidia-drm_gbm.so mkdir -p ${INSTALL}/usr/share/egl/egl_external_platform.d cp -p 15_nvidia_gbm.json ${INSTALL}/usr/share/egl/egl_external_platform.d cp -p libnvidia-egl-gbm.so.1.1.0 ${INSTALL}/usr/lib ln -sf libnvidia-egl-gbm.so.1.1.0 ${INSTALL}/usr/lib/libnvidia-egl-gbm.so.1 ln -sf libnvidia-egl-gbm.so.1 ${INSTALL}/usr/lib/libnvidia-egl-gbm.so # GLVND mkdir -p ${INSTALL}/usr/share/glvnd/egl_vendor.d cp -p 10_nvidia.json ${INSTALL}/usr/share/glvnd/egl_vendor.d # Wayland mkdir -p ${INSTALL}/usr/lib cp -p libnvidia-egl-wayland.so.1.1.9 ${INSTALL}/usr/lib/ ln -sf libnvidia-egl-wayland.so.1.1.9 ${INSTALL}/usr/lib/libnvidia-egl-wayland.so.1 ln -sf libnvidia-egl-wayland.so.1 ${INSTALL}/usr/lib/libnvidia-egl-wayland.so mkdir -p ${INSTALL}/usr/share/egl/egl_external_platform.d cp -p 10_nvidia_wayland.json ${INSTALL}/usr/share/egl/egl_external_platform.d # OpenGL / EGL mkdir -p ${INSTALL}/usr/lib cp -p libEGL_nvidia.so.${PKG_VERSION} ${INSTALL}/usr/lib/ ln -sf libEGL_nvidia.so.${PKG_VERSION} ${INSTALL}/usr/lib/libEGL_nvidia.so.0 ln -sf libEGL_nvidia.so.0 ${INSTALL}/usr/lib/libEGL_nvidia.so # OpenGL core mkdir -p ${INSTALL}/usr/lib cp -p libnvidia-eglcore.so.${PKG_VERSION} ${INSTALL}/usr/lib/ ln -sf libnvidia-eglcore.so.${PKG_VERSION} ${INSTALL}/usr/lib/libnvidia-eglcore.so cp -p libnvidia-glsi.so.${PKG_VERSION} ${INSTALL}/usr/lib ln -sf libnvidia-glsi.so.${PKG_VERSION} ${INSTALL}/usr/lib/libnvidia-glsi.so # OpenGL ES mkdir -p ${INSTALL}/usr/lib cp -p libGLESv2_nvidia.so.${PKG_VERSION} ${INSTALL}/usr/lib ln -sf libGLESv2_nvidia.so.${PKG_VERSION} ${INSTALL}/usr/lib/libGLESv2_nvidia.so.2 ln -sf libGLESv2_nvidia.so.2 ${INSTALL}/usr/lib/libGLESv2_nvidia.so # Vulkan if [ "${VULKAN_SUPPORT}" = "yes" ]; then mkdir -p ${INSTALL}/usr/lib cp -P libnvidia-glvkspirv.so.${PKG_VERSION} ${INSTALL}/usr/lib ln -sf libnvidia-glvkspirv.so.${PKG_VERSION} ${INSTALL}/usr/lib/libnvidia-glvkspirv.so cp -p libnvidia-vulkan-producer.so.${PKG_VERSION} ${INSTALL}/usr/lib ln -sf libnvidia-vulkan-producer.so.${PKG_VERSION} ${INSTALL}/usr/lib/libnvidia-vulkan-producer.so.1 ln -sf libnvidia-vulkan-producer.so.1 ${INSTALL}/usr/lib/libnvidia-vulkan-producer.so mkdir -p ${INSTALL}/usr/share/vulkan/implicit_layer.d sed "s#libGLX_nvidia.so.0#libEGL_nvidia.so.0#" nvidia_layers.json > ${INSTALL}/usr/share/vulkan/implicit_layer.d/nvidia_layers.json mkdir -p ${INSTALL}/usr/share/vulkan/icd.d sed "s#libGLX_nvidia.so.0#libEGL_nvidia.so.0#" nvidia_icd.json > ${INSTALL}/usr/share/vulkan/icd.d/nvidia_icd.json fi # CUDA mkdir -p ${INSTALL}/usr/lib cp -p libcuda.so.${PKG_VERSION} ${INSTALL}/usr/lib ln -sf libcuda.so.${PKG_VERSION} ${INSTALL}/usr/lib/libcuda.so.1 ln -sf libcuda.so.1 ${INSTALL}/usr/lib/libcuda.so # NVDEC mkdir -p ${INSTALL}/usr/lib cp -p libnvcuvid.so.${PKG_VERSION} ${INSTALL}/usr/lib ln -sf libnvcuvid.so.${PKG_VERSION} ${INSTALL}/usr/lib/libnvcuvid.so.1 ln -sf libnvcuvid.so.1 ${INSTALL}/usr/lib/libnvcuvid.so # nvidia-tls mkdir -p ${INSTALL}/usr/lib cp -P libnvidia-tls.so.${PKG_VERSION} ${INSTALL}/usr/lib ln -sf libnvidia-tls.so.${PKG_VERSION} ${INSTALL}/usr/lib/libnvidia-tls.so # NVIDIA Management Library (NVML) / System Management Interface mkdir -p ${INSTALL}/usr/bin cp -P nvidia-smi ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/lib cp -P libnvidia-ml.so.${PKG_VERSION} ${INSTALL}/usr/lib ln -sf libnvidia-ml.so.${PKG_VERSION} ${INSTALL}/usr/lib/libnvidia-ml.so.1 ln -sf libnvidia-ml.so.1 ${INSTALL}/usr/lib/libnvidia-ml.so # App profiles mkdir -p ${INSTALL}/usr/share/nvidia cp -P nvidia-application-profiles-${PKG_VERSION}-rc ${INSTALL}/usr/share/nvidia } ================================================ FILE: packages/graphics/pango/config/pango.modules ================================================ # Pango Modules file # Automatically generated file, do not edit # # ModulesPath = /usr/lib/pango/1.8.0/modules # /usr/lib/pango/1.8.0/modules/pango-arabic-lang.so ArabicScriptEngineLang PangoEngineLang PangoRenderNone arabic:* /usr/lib/pango/1.8.0/modules/pango-basic-fc.so BasicScriptEngineFc PangoEngineShape PangoRenderFc common: /usr/lib/pango/1.8.0/modules/pango-indic-lang.so devaIndicScriptEngineLang PangoEngineLang PangoRenderNone devanagari:* /usr/lib/pango/1.8.0/modules/pango-indic-lang.so bengIndicScriptEngineLang PangoEngineLang PangoRenderNone bengali:* /usr/lib/pango/1.8.0/modules/pango-indic-lang.so guruIndicScriptEngineLang PangoEngineLang PangoRenderNone gurmukhi:* /usr/lib/pango/1.8.0/modules/pango-indic-lang.so gujrIndicScriptEngineLang PangoEngineLang PangoRenderNone gujarati:* /usr/lib/pango/1.8.0/modules/pango-indic-lang.so oryaIndicScriptEngineLang PangoEngineLang PangoRenderNone oriya:* /usr/lib/pango/1.8.0/modules/pango-indic-lang.so tamlIndicScriptEngineLang PangoEngineLang PangoRenderNone tamil:* /usr/lib/pango/1.8.0/modules/pango-indic-lang.so teluIndicScriptEngineLang PangoEngineLang PangoRenderNone telugu:* /usr/lib/pango/1.8.0/modules/pango-indic-lang.so kndaIndicScriptEngineLang PangoEngineLang PangoRenderNone kannada:* /usr/lib/pango/1.8.0/modules/pango-indic-lang.so mlymIndicScriptEngineLang PangoEngineLang PangoRenderNone malayalam:* /usr/lib/pango/1.8.0/modules/pango-indic-lang.so sinhIndicScriptEngineLang PangoEngineLang PangoRenderNone sinhala:* ================================================ FILE: packages/graphics/pango/config/pangorc ================================================ [Pango] ModuleFiles = /etc/pango/pango.modules ModulesPath = /usr/lib/pango/1.8.0/modules [PangoX] AliasFiles = /etc/pango/pangox.aliases ================================================ FILE: packages/graphics/pango/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pango" PKG_VERSION="1.50.12" PKG_SHA256="caef96d27bbe792a6be92727c73468d832b13da57c8071ef79b9df69ee058fe3" PKG_LICENSE="GPL" PKG_SITE="http://www.pango.org/" PKG_URL="https://download.gnome.org/sources/pango/${PKG_VERSION:0:4}/pango-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain cairo freetype fontconfig fribidi glib json-glib harfbuzz" PKG_DEPENDS_CONFIG="cairo" PKG_LONGDESC="The Pango library for layout and rendering of internationalized text." configure_package() { # Build with X11 support if [ ${DISPLAYSERVER} = "x11" ]; then PKG_DEPENDS_TARGET+=" libX11 libXft" PKG_DEPENDS_CONFIG+=" libXft" PKG_BUILD_FLAGS="-sysroot" fi } pre_configure_target() { PKG_MESON_OPTS_TARGET="-Dgtk_doc=false \ -Dintrospection=disabled" } ================================================ FILE: packages/graphics/tiff/package.mk ================================================ # 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) PKG_NAME="tiff" PKG_VERSION="4.5.0" PKG_SHA256="c7a1d9296649233979fa3eacffef3fa024d73d05d589cb622727b5b08c423464" PKG_LICENSE="OSS" PKG_SITE="http://www.remotesensing.org/libtiff/" PKG_URL="http://download.osgeo.org/libtiff/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libjpeg-turbo zlib" PKG_LONGDESC="libtiff is a library for reading and writing TIFF files." PKG_BUILD_FLAGS="+pic -gold" PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=OFF \ -Dtiff-tools=OFF \ -Dtiff-tests=OFF \ -Dtiff-contrib=OFF \ -Dtiff-docs=OFF \ -Dmdi=OFF \ -Djbig=OFF \ -Dlzma=OFF \ -Dzstd=OFF \ -Dwebp=ON \ -Dcxx=ON \ -Djpeg=ON" ================================================ FILE: packages/graphics/vulkan/glslang/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Frank Hartung (supervisedthinking (@) gmail.com) # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="glslang" # The SPIRV-Tools & SPIRV-Headers pkg_version/s need to match the compatible (known_good) glslang pkg_version. # https://raw.githubusercontent.com/KhronosGroup/glslang/${PKG_VERSION}/known_good.json # When updating glslang pkg_version please update to the known_good spirv-tools & spirv-headers pkg_version/s. PKG_VERSION="12.0.0" PKG_SHA256="7cb45842ec1d4b6ea775d624c3d2d8ba9450aa416b0482b0cc7e4fdd399c3d75" PKG_LICENSE="Apache-2.0" PKG_SITE="https://github.com/KhronosGroup/glslang" PKG_URL="https://github.com/KhronosGroup/glslang/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host Python3:host" PKG_DEPENDS_TARGET="toolchain Python3" PKG_LONGDESC="Khronos-reference front end for GLSL/ESSL, partial front end for HLSL, and a SPIR-V generator." PKG_DEPENDS_UNPACK="spirv-headers spirv-tools" PKG_CMAKE_OPTS_COMMON="-DBUILD_EXTERNAL=ON \ -DENABLE_SPVREMAPPER=OFF \ -DENABLE_GLSLANG_JS=OFF \ -DENABLE_RTTI=OFF \ -DENABLE_EXCEPTIONS=OFF \ -DENABLE_OPT=ON \ -DENABLE_PCH=ON \ -DENABLE_CTEST=OFF \ -DUSE_CCACHE=ON \ -Wno-dev" post_unpack() { # Enables SPIR-V optimzer capability needed for ENABLE_OPT CMake build option mkdir -p ${PKG_BUILD}/External/spirv-tools/external/spirv-headers cp -R $(get_build_dir spirv-tools)/* ${PKG_BUILD}/External/spirv-tools cp -R $(get_build_dir spirv-headers)/* ${PKG_BUILD}/External/spirv-tools/external/spirv-headers } pre_configure_host() { PKG_CMAKE_OPTS_HOST+="${PKG_CMAKE_OPTS_COMMON} \ -DBUILD_SHARED_LIBS=OFF" } pre_configure_target() { PKG_CMAKE_OPTS_TARGET+="${PKG_CMAKE_OPTS_COMMON} \ -DBUILD_SHARED_LIBS=ON \ -DENABLE_GLSLANG_BINARIES=OFF" } ================================================ FILE: packages/graphics/vulkan/glslang/patches/glslang-100.01-build-static-spirv-tools.patch ================================================ --- a/External/CMakeLists.txt +++ b/External/CMakeLists.txt @@ -71,7 +71,8 @@ endif() if(ENABLE_OPT AND NOT TARGET SPIRV-Tools-opt) if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/spirv-tools) set(SPIRV_SKIP_TESTS ON CACHE BOOL "Skip building SPIRV-Tools tests") - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/spirv-tools spirv-tools) + set(BUILD_SHARED_LIBS OFF CACHE BOOL "Disable build shared libs" FORCE) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/spirv-tools EXCLUDE_FROM_ALL) endif() endif() --- a/SPIRV/CMakeLists.txt +++ b/SPIRV/CMakeLists.txt @@ -100,7 +100,7 @@ if(ENABLE_OPT) target_link_libraries(SPIRV PRIVATE MachineIndependent SPIRV-Tools-opt) target_include_directories(SPIRV PUBLIC $ - $) + $) else() target_link_libraries(SPIRV PRIVATE MachineIndependent) endif() --- a/StandAlone/CMakeLists.txt +++ b/StandAlone/CMakeLists.txt @@ -83,7 +83,7 @@ endif() target_link_libraries(glslangValidator ${LIBRARIES}) target_include_directories(glslangValidator PUBLIC $ - $) + $) if(ENABLE_OPT) target_include_directories(glslangValidator ================================================ FILE: packages/graphics/vulkan/spirv-headers/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Frank Hartung (supervisedthinking (@) gmail.com) # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="spirv-headers" # The SPIRV-Headers pkg_version needs to match the compatible (known_good) glslang pkg_version. # https://raw.githubusercontent.com/KhronosGroup/glslang/${PKG_VERSION}/known_good.json # When updating glslang pkg_version please update to the known_good spirv-headers pkg_version. PKG_VERSION="d13b52222c39a7e9a401b44646f0ca3a640fbd47" PKG_SHA256="9dd5ae25bcec65db633990477e5b9a9b84cdbc0aa87eaaea159813a5d707fb31" PKG_LICENSE="Apache-2.0" PKG_SITE="https://github.com/KhronosGroup/SPIRV-headers" PKG_URL="https://github.com/KhronosGroup/SPIRV-headers/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="" PKG_LONGDESC="SPIRV-Headers" PKG_TOOLCHAIN="manual" ================================================ FILE: packages/graphics/vulkan/spirv-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Frank Hartung (supervisedthinking (@) gmail.com) # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="spirv-tools" # The SPIRV-Tools pkg_version needs to match the compatible (known_good) glslang pkg_version. # https://raw.githubusercontent.com/KhronosGroup/glslang/${PKG_VERSION}/known_good.json # When updating glslang pkg_version please update to the known_good spirv-tools pkg_version. PKG_VERSION="63de608daeb7e91fbea6d7477a50debe7cac57ce" PKG_SHA256="f223272718ffa622feff49f3f1b4caf754c57634be70ef6eadfa3f74f2938e53" PKG_LICENSE="Apache-2.0" PKG_SITE="https://github.com/KhronosGroup/SPIRV-Tools" PKG_URL="https://github.com/KhronosGroup/SPIRV-Tools/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="" PKG_LONGDESC="The SPIR-V Tools project provides an API and commands for processing SPIR-V modules." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/graphics/vulkan/vkmark/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vkmark" PKG_VERSION="30d2cd37f0566589d90914501fc7c51a4e51f559" PKG_SHA256="6a2ab6a9c58b4bd11eb0235a8e31b10b3d0cbcd5c64b799d342572936a717745" PKG_LICENSE="LGPL-2.1-or-later" PKG_SITE="https://github.com/vkmark/vkmark" PKG_URL="https://github.com/vkmark/vkmark/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain glm assimp vulkan-loader" PKG_LONGDESC="Vulkan benchmark" PKG_BUILD_FLAGS="-parallel +speed" case ${DISPLAYSERVER} in wl) PKG_DEPENDS_TARGET+=" wayland wayland-protocols" PKG_MESON_OPTS_TARGET="-Dwayland=true" ;; x11) PKG_DEPENDS_TARGET+=" libxcb xcb-util-wm" PKG_MESON_OPTS_TARGET="-Dxcb=true" ;; *) PKG_DEPENDS_TARGET+=" systemd libdrm mesa" PKG_MESON_OPTS_TARGET="-Dkms=true" ;; esac ================================================ FILE: packages/graphics/vulkan/vkmark/patches/vkmark-999.01-PR47-drop-the-vkCreateDmaBufImageINTEL-extension.patch ================================================ From 51c7eb0c8c1cd4872eec176775276cca3565a0a6 Mon Sep 17 00:00:00 2001 From: Alexandros Frantzis Date: Fri, 9 Sep 2022 18:32:03 +0300 Subject: [PATCH 1/4] github: Build with both ubuntu-20.04 and ubuntu-22.04 in CI --- .github/workflows/build.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fbb5682..b60ad80 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,7 +10,10 @@ on: jobs: build: - runs-on: ubuntu-latest + strategy: + matrix: + os: [ubuntu-20.04, ubuntu-22.04] + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v1 - name: Install dependencies From 7bbe275e49045237f2cdbc2f441a394b562b0aa5 Mon Sep 17 00:00:00 2001 From: Alexandros Frantzis Date: Fri, 9 Sep 2022 18:08:12 +0300 Subject: [PATCH 2/4] core: Improve log message consistency --- src/vulkan_state.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vulkan_state.cpp b/src/vulkan_state.cpp index 6f50673..fbd789c 100644 --- a/src/vulkan_state.cpp +++ b/src/vulkan_state.cpp @@ -44,7 +44,7 @@ std::vector VulkanState::available_devices(VulkanWSI& vulkan { if (!vulkan_wsi.is_physical_device_supported(*it_device)) { - Log::debug("device with uuid %s is not supported by window system integration layer", + Log::debug("Device with uuid %s is not supported by window system integration layer\n", static_cast(it_device->getProperties().pipelineCacheUUID).representation().data()); it_device = available_devices.erase(it_device); } @@ -193,17 +193,17 @@ void VulkanState::create_command_pool() vk::PhysicalDevice ChooseFirstSupportedStrategy::operator()(const std::vector& available_devices) { - Log::debug("Trying to use first supported device.\n"); + Log::debug("Trying to use first supported device\n"); for (auto const& physical_device : available_devices) { if (find_queue_family_index(physical_device, vk::QueueFlagBits::eGraphics).second) { - Log::debug("First supported device choosen!\n"); + Log::debug("First supported device chosen\n"); return physical_device; } - Log::debug("device with uuid %s skipped!\n", + Log::debug("Device with uuid %s skipped\n", static_cast(physical_device.getProperties().pipelineCacheUUID).representation().data() ); } @@ -213,7 +213,7 @@ vk::PhysicalDevice ChooseFirstSupportedStrategy::operator()(const std::vector& available_devices) { - Log::debug("Trying to use device with specified UUID %s.\n", + Log::debug("Trying to use device with specified UUID %s\n", m_selected_device_uuid.representation().data()); for (auto const& physical_device: available_devices) @@ -227,5 +227,5 @@ vk::PhysicalDevice ChooseByUUIDStrategy::operator()(const std::vector Date: Fri, 9 Sep 2022 17:48:44 +0300 Subject: [PATCH 3/4] core,ws: Allow WSI backends to request device extensions The backends were able to request instance extensions, support requesting device extensions, too. --- src/vulkan_state.cpp | 5 ++--- src/vulkan_wsi.h | 8 +++++++- src/ws/kms_window_system.cpp | 2 +- src/ws/kms_window_system.h | 2 +- src/ws/native_system.h | 2 +- src/ws/swapchain_window_system.cpp | 4 ++-- src/ws/swapchain_window_system.h | 2 +- src/ws/wayland_native_system.cpp | 2 +- src/ws/wayland_native_system.h | 2 +- src/ws/xcb_native_system.cpp | 2 +- src/ws/xcb_native_system.h | 2 +- tests/null_window_system.h | 2 +- tests/test_window_system_plugin.cpp | 2 +- tests/window_system_loader_test.cpp | 2 +- 14 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/vulkan_state.cpp b/src/vulkan_state.cpp index fbd789c..b1973ed 100644 --- a/src/vulkan_state.cpp +++ b/src/vulkan_state.cpp @@ -87,7 +87,7 @@ void VulkanState::create_instance(VulkanWSI& vulkan_wsi) auto const app_info = vk::ApplicationInfo{} .setPApplicationName("vkmark"); - std::vector enabled_extensions{vulkan_wsi.vulkan_extensions()}; + std::vector enabled_extensions{vulkan_wsi.required_extensions().instance}; enabled_extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); auto const create_info = vk::InstanceCreateInfo{} @@ -159,8 +159,7 @@ void VulkanState::create_logical_device(VulkanWSI& vulkan_wsi) Log::debug("VulkanState: Using queue family index %d for rendering\n", graphics_queue_family_index()); - std::array enabled_extensions{ - {VK_KHR_SWAPCHAIN_EXTENSION_NAME}}; + std::vector enabled_extensions{vulkan_wsi.required_extensions().device}; auto const device_features = vk::PhysicalDeviceFeatures{} .setSamplerAnisotropy(true); diff --git a/src/vulkan_wsi.h b/src/vulkan_wsi.h index f8c50eb..22e87f1 100644 --- a/src/vulkan_wsi.h +++ b/src/vulkan_wsi.h @@ -32,7 +32,13 @@ class VulkanWSI public: virtual ~VulkanWSI() = default; - virtual std::vector vulkan_extensions() = 0; + struct Extensions + { + std::vector instance; + std::vector device; + }; + + virtual Extensions required_extensions() = 0; virtual bool is_physical_device_supported(vk::PhysicalDevice const& pd) = 0; virtual std::vector physical_device_queue_family_indices( vk::PhysicalDevice const& pd) = 0; diff --git a/src/ws/kms_window_system.cpp b/src/ws/kms_window_system.cpp index ca8220f..6132e64 100644 --- a/src/ws/kms_window_system.cpp +++ b/src/ws/kms_window_system.cpp @@ -533,7 +533,7 @@ void KMSWindowSystem::wait_for_drm_page_flip_event() } } -std::vector KMSWindowSystem::vulkan_extensions() +VulkanWSI::Extensions KMSWindowSystem::required_extensions() { return {}; } diff --git a/src/ws/kms_window_system.h b/src/ws/kms_window_system.h index 4389ef7..20a067f 100644 --- a/src/ws/kms_window_system.h +++ b/src/ws/kms_window_system.h @@ -61,7 +61,7 @@ class KMSWindowSystem : public WindowSystem, public VulkanWSI bool should_quit() override; // VulkanWSI - std::vector vulkan_extensions() override; + Extensions required_extensions() override; bool is_physical_device_supported(vk::PhysicalDevice const& pd) override; std::vector physical_device_queue_family_indices( vk::PhysicalDevice const& pd) override; diff --git a/src/ws/native_system.h b/src/ws/native_system.h index 076948e..cbe073a 100644 --- a/src/ws/native_system.h +++ b/src/ws/native_system.h @@ -34,7 +34,7 @@ class NativeSystem public: virtual ~NativeSystem() = default; - virtual std::vector vulkan_extensions() = 0; + virtual std::vector instance_extensions() = 0; virtual uint32_t get_presentation_queue_family_index(vk::PhysicalDevice const& pd) = 0; virtual bool should_quit() = 0; virtual vk::Extent2D get_vk_extent() = 0; diff --git a/src/ws/swapchain_window_system.cpp b/src/ws/swapchain_window_system.cpp index d38fa6b..9f9fba3 100644 --- a/src/ws/swapchain_window_system.cpp +++ b/src/ws/swapchain_window_system.cpp @@ -251,9 +251,9 @@ ManagedResource SwapchainWindowSystem::create_vk_swapchain() [this] (auto& s) { vulkan->device().destroySwapchainKHR(s); }}; } -std::vector SwapchainWindowSystem::vulkan_extensions() +VulkanWSI::Extensions SwapchainWindowSystem::required_extensions() { - return native->vulkan_extensions(); + return {native->instance_extensions(), {VK_KHR_SWAPCHAIN_EXTENSION_NAME}}; } bool SwapchainWindowSystem::is_physical_device_supported(vk::PhysicalDevice const& pd) diff --git a/src/ws/swapchain_window_system.h b/src/ws/swapchain_window_system.h index c3b2780..412b924 100644 --- a/src/ws/swapchain_window_system.h +++ b/src/ws/swapchain_window_system.h @@ -51,7 +51,7 @@ class SwapchainWindowSystem : public WindowSystem, public VulkanWSI bool should_quit() override; // VulkanWSI - std::vector vulkan_extensions() override; + Extensions required_extensions() override; bool is_physical_device_supported(vk::PhysicalDevice const& pd) override; std::vector physical_device_queue_family_indices( vk::PhysicalDevice const& pd) override; diff --git a/src/ws/wayland_native_system.cpp b/src/ws/wayland_native_system.cpp index 642d8fe..816a7b9 100644 --- a/src/ws/wayland_native_system.cpp +++ b/src/ws/wayland_native_system.cpp @@ -145,7 +145,7 @@ WaylandNativeSystem::WaylandNativeSystem(int width, int height) create_native_window(); } -std::vector WaylandNativeSystem::vulkan_extensions() +std::vector WaylandNativeSystem::instance_extensions() { return {VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME}; } diff --git a/src/ws/wayland_native_system.h b/src/ws/wayland_native_system.h index 400c358..01cdbaa 100644 --- a/src/ws/wayland_native_system.h +++ b/src/ws/wayland_native_system.h @@ -35,7 +35,7 @@ class WaylandNativeSystem : public NativeSystem public: WaylandNativeSystem(int width, int height); - std::vector vulkan_extensions() override; + std::vector instance_extensions() override; uint32_t get_presentation_queue_family_index(vk::PhysicalDevice const& pd) override; bool should_quit() override; vk::Extent2D get_vk_extent() override; diff --git a/src/ws/xcb_native_system.cpp b/src/ws/xcb_native_system.cpp index 59c84f0..b683772 100644 --- a/src/ws/xcb_native_system.cpp +++ b/src/ws/xcb_native_system.cpp @@ -47,7 +47,7 @@ XcbNativeSystem::~XcbNativeSystem() xcb_disconnect(connection); } -std::vector XcbNativeSystem::vulkan_extensions() +std::vector XcbNativeSystem::instance_extensions() { return {VK_KHR_XCB_SURFACE_EXTENSION_NAME}; } diff --git a/src/ws/xcb_native_system.h b/src/ws/xcb_native_system.h index 7fcc44a..dadc32f 100644 --- a/src/ws/xcb_native_system.h +++ b/src/ws/xcb_native_system.h @@ -35,7 +35,7 @@ class XcbNativeSystem : public NativeSystem XcbNativeSystem(int width, int height, xcb_visualid_t visual_id); ~XcbNativeSystem(); - std::vector vulkan_extensions() override; + std::vector instance_extensions() override; uint32_t get_presentation_queue_family_index(vk::PhysicalDevice const& pd) override; bool should_quit() override; vk::Extent2D get_vk_extent() override; diff --git a/tests/null_window_system.h b/tests/null_window_system.h index bc01276..b7cc9ba 100644 --- a/tests/null_window_system.h +++ b/tests/null_window_system.h @@ -39,7 +39,7 @@ class NullWindowSystem : public WindowSystem, public VulkanWSI bool should_quit() override { return false; } - std::vector vulkan_extensions() override { return {}; } + Extensions required_extensions() override { return {}; } bool is_physical_device_supported(vk::PhysicalDevice const&) override { return true; } std::vector physical_device_queue_family_indices( vk::PhysicalDevice const&) override diff --git a/tests/test_window_system_plugin.cpp b/tests/test_window_system_plugin.cpp index 7877c8e..a562958 100644 --- a/tests/test_window_system_plugin.cpp +++ b/tests/test_window_system_plugin.cpp @@ -32,7 +32,7 @@ class TestWindowSystem : public NullWindowSystem { public: TestWindowSystem(std::string const& id) : id{id} {} - std::vector vulkan_extensions() override { return {id.c_str()}; } + Extensions required_extensions() override { return {{id.c_str()}, {}}; } private: std::string const id; diff --git a/tests/window_system_loader_test.cpp b/tests/window_system_loader_test.cpp index 8aed335..c458e61 100644 --- a/tests/window_system_loader_test.cpp +++ b/tests/window_system_loader_test.cpp @@ -84,7 +84,7 @@ class TestWindowSystems int window_system_id(WindowSystem& ws) { - return std::stoi(ws.vulkan_wsi().vulkan_extensions()[0]); + return std::stoi(ws.vulkan_wsi().required_extensions().instance[0]); } } From dd75130a7ddf747eb7fd755946e84baf98a6e05f Mon Sep 17 00:00:00 2001 From: Alexandros Frantzis Date: Fri, 9 Sep 2022 16:23:40 +0300 Subject: [PATCH 4/4] kms: Use VK_EXT_external_memory_dmabuf to create dmabuf-backed Vulkan images Drop the vkCreateDmaBufImageINTEL extension function and use the functionality provided by the official VK_EXT_external_memory_dmabuf extension to create dmabuf-backed Vulkan images. Fixes #33 Co-authored-by: Jeffy Chen --- meson.build | 7 +- src/ws/kms_window_system.cpp | 132 +++++++++++++++++++++++------------ 2 files changed, 89 insertions(+), 50 deletions(-) diff --git a/meson.build b/meson.build index 7d305dc..0d83918 100644 --- a/meson.build +++ b/meson.build @@ -32,16 +32,11 @@ wayland_protocols_dep = dependency('wayland-protocols', version : '>= 1.12', wayland_scanner_dep = dependency('wayland-scanner', required : get_option('wayland') == 'true') libdrm_dep = dependency('libdrm', required : get_option('kms') == 'true') gbm_dep = dependency('gbm', required : get_option('kms') == 'true') -has_vulkan_intel_header = cpp.has_header('vulkan/vulkan_intel.h', dependencies: vulkan_dep) - -if get_option('kms') == 'true' and not has_vulkan_intel_header - error('KMS plugin needs the vulkan_intel.h header, but it couldn\'t be found') -endif build_xcb_ws = xcb_dep.found() and xcb_icccm_dep.found() and get_option('xcb') != 'false' build_wayland_ws = (wayland_client_dep.found() and wayland_protocols_dep.found() and wayland_scanner_dep.found() and get_option('wayland') != 'false') -build_kms_ws = libdrm_dep.found() and gbm_dep.found() and has_vulkan_intel_header and get_option('kms') != 'false' +build_kms_ws = libdrm_dep.found() and gbm_dep.found() and get_option('kms') != 'false' if not build_xcb_ws and not build_wayland_ws and not build_kms_ws error('vkmark needs at least one winsys to work - xcb, wayland or kms') diff --git a/src/ws/kms_window_system.cpp b/src/ws/kms_window_system.cpp index 6132e64..fc02eae 100644 --- a/src/ws/kms_window_system.cpp +++ b/src/ws/kms_window_system.cpp @@ -29,8 +29,8 @@ #include #include -#include +#include #include #include #include @@ -270,6 +270,24 @@ void restore_vt(int) global_vt_state->restore(); } +uint32_t find_memory_type_index(vk::PhysicalDevice const& physical_device, + vk::MemoryRequirements const& requirements, + vk::MemoryPropertyFlags flags) +{ + auto const properties = physical_device.getMemoryProperties(); + + for (uint32_t i = 0; i < properties.memoryTypeCount; i++) + { + if ((requirements.memoryTypeBits & (1 << i)) && + (properties.memoryTypes[i].propertyFlags & flags) == flags) + { + return i; + } + } + + throw std::runtime_error{"Coudn't find matching memory type"}; +} + } VTState::VTState() @@ -433,14 +451,20 @@ void KMSWindowSystem::create_drm_fbs() for (auto const& gbm_bo : gbm_bos) { uint32_t fb = 0; + uint32_t handles[4] = {0}; + uint32_t strides[4] = {0}; + uint32_t offsets[4] = {0}; - uint32_t handles[4] = {gbm_bo_get_handle(gbm_bo).u32, 0, 0, 0}; - uint32_t strides[4] = {gbm_bo_get_stride(gbm_bo), 0, 0, 0}; - uint32_t offsets[4] = {0, 0, 0, 0}; + for (auto i = 0; i < gbm_bo_get_plane_count(gbm_bo); i++) + { + handles[i] = gbm_bo_get_handle_for_plane(gbm_bo, i).u32; + offsets[i] = gbm_bo_get_offset(gbm_bo, i); + strides[i] = gbm_bo_get_stride_for_plane(gbm_bo, i); + } auto const ret = drmModeAddFB2( drm_fd, vk_extent.width, vk_extent.height, - DRM_FORMAT_XRGB8888, + gbm_bo_get_format(gbm_bo), handles, strides, offsets, &fb, 0); if (ret < 0) @@ -453,52 +477,65 @@ void KMSWindowSystem::create_drm_fbs() } } -// TODO: Use an official extension to create the VkImages when it becomes -// available (e.g. VK_MESAX_external_image_dma_buf) void KMSWindowSystem::create_vk_images() { - auto const create_dma_buf_image = - reinterpret_cast( - vulkan->device().getProcAddr("vkCreateDmaBufImageINTEL")); - - if (!create_dma_buf_image) - throw std::runtime_error{"Failed to get vkCreateDmaBufImageINTEL function pointer"}; - for (auto const& gbm_bo : gbm_bos) { auto const fd = ManagedResource{gbm_bo_get_fd(gbm_bo), close}; - auto const stride = gbm_bo_get_stride(gbm_bo); - - VkDmaBufImageCreateInfo create_info{}; - create_info.sType = static_cast(VK_STRUCTURE_TYPE_DMA_BUF_IMAGE_CREATE_INFO_INTEL); - create_info.fd = fd; - create_info.format = static_cast(vk_image_format); - create_info.extent = {vk_extent.width, vk_extent.height, 1}; - create_info.strideInBytes = stride; - - VkImage image; - VkDeviceMemory device_memory; - - VkResult result = create_dma_buf_image( - vulkan->device(), - &create_info, - nullptr, - &device_memory, - &image); - - if (result != VK_SUCCESS) - { - vk::throwResultException(static_cast(result), - "vkCreateDmbBufImageINTEL"); - } + uint64_t modifier = gbm_bo_get_modifier(gbm_bo); + + auto const modifier_info = vk::ImageDrmFormatModifierListCreateInfoEXT{} + .setDrmFormatModifierCount(1) + .setPDrmFormatModifiers(&modifier); + auto const external_memory_create_info = vk::ExternalMemoryImageCreateInfoKHR{} + .setHandleTypes(vk::ExternalMemoryHandleTypeFlagBitsKHR::eDmaBufEXT) + .setPNext(&modifier_info); + auto const image_create_info = vk::ImageCreateInfo{} + .setPNext(&external_memory_create_info) + .setImageType(vk::ImageType::e2D) + .setFormat(vk_image_format) + .setExtent({vk_extent.width, vk_extent.height, 1}) + .setMipLevels(1) + .setArrayLayers(1) + .setSamples(vk::SampleCountFlagBits::e1) + .setTiling(vk::ImageTiling::eDrmFormatModifierEXT) + .setUsage(vk::ImageUsageFlagBits::eColorAttachment) + .setSharingMode(vk::SharingMode::eExclusive) + .setInitialLayout(vk::ImageLayout::eUndefined); + + auto vk_image = ManagedResource{ + vulkan->device().createImage(image_create_info), + [vptr=vulkan] (auto const& i) { vptr->device().destroyImage(i); }}; + + auto const requirements = vulkan->device().getImageMemoryRequirements(vk_image); + uint32_t index = find_memory_type_index(vulkan->physical_device(), + requirements, + vk::MemoryPropertyFlagBits::eDeviceLocal); + + auto const import_memory_fd_info = vk::ImportMemoryFdInfoKHR{} + .setHandleType(vk::ExternalMemoryHandleTypeFlagBitsKHR::eDmaBufEXT) + .setFd(fd); + auto const dedicated_allocate_info = vk::MemoryDedicatedAllocateInfoKHR{} + .setPNext(&import_memory_fd_info) + .setImage(vk_image); + auto const memory_allocate_info = vk::MemoryAllocateInfo{} + .setPNext(&dedicated_allocate_info) + .setAllocationSize(requirements.size) + .setMemoryTypeIndex((uint32_t)index); + + auto device_memory = ManagedResource{ + vulkan->device().allocateMemory(memory_allocate_info), + [vptr=vulkan] (auto const& m) { vptr->device().freeMemory(m); }}; + + vulkan->device().bindImageMemory(vk_image, device_memory, 0); vk_images.push_back( ManagedResource{ - vk::Image{image}, - [vptr=vulkan, device_memory] (auto& image) + vk_image.steal(), + [vptr=vulkan, mem=device_memory.steal()] (auto const& image) { vptr->device().destroyImage(image); - vptr->device().freeMemory(device_memory); + vptr->device().freeMemory(mem); }}); } } @@ -535,12 +572,19 @@ void KMSWindowSystem::wait_for_drm_page_flip_event() VulkanWSI::Extensions KMSWindowSystem::required_extensions() { - return {}; + return {{}, {VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME}}; } -bool KMSWindowSystem::is_physical_device_supported(vk::PhysicalDevice const&) +bool KMSWindowSystem::is_physical_device_supported(vk::PhysicalDevice const& physdev) { - return true; + auto const props = physdev.enumerateDeviceExtensionProperties(); + auto const iter = std::find_if( + props.begin(), props.end(), + [](vk::ExtensionProperties prop) + { + return std::string{VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME} == prop.extensionName; + }); + return iter != props.end(); } std::vector KMSWindowSystem::physical_device_queue_family_indices( ================================================ FILE: packages/graphics/vulkan/vulkan-headers/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Frank Hartung (supervisedthinking (@) gmail.com) # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vulkan-headers" PKG_VERSION="1.3.241" PKG_SHA256="4322fd17d456c0687ed947b1b75d7b10b121ec20ed43d1cfa76e721f7e803bec" PKG_LICENSE="Apache-2.0" PKG_SITE="https://github.com/KhronosGroup/Vulkan-Headers" PKG_URL="https://github.com/KhronosGroup/Vulkan-Headers/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Vulkan Header files and API registry" ================================================ FILE: packages/graphics/vulkan/vulkan-loader/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Frank Hartung (supervisedthinking (@) gmail.com) # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vulkan-loader" PKG_VERSION="1.3.241" PKG_SHA256="c107034a5ee958f912d5a234fd11f7e6b28bf227b51c8f12f3eee633351c1d70" PKG_LICENSE="Apache-2.0" PKG_SITE="https://github.com/KhronosGroup/Vulkan-Loader" PKG_URL="https://github.com/KhronosGroup/Vulkan-Loader/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3:host vulkan-headers" PKG_LONGDESC="Vulkan Installable Client Driver (ICD) Loader." configure_package() { # Displayserver Support if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" libxcb libX11 libXrandr" elif [ "${DISPLAYSERVER}" = "wl" ]; then PKG_DEPENDS_TARGET+=" wayland" fi } pre_configure_target() { PKG_CMAKE_OPTS_TARGET="-DBUILD_TESTS=OFF" # GAS / GNU Assembler is only supported by aarch64 & x86_64 if [ "${ARCH}" = "arm" ]; then PKG_CMAKE_OPTS_TARGET+=" -DUSE_GAS=OFF" fi if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_CMAKE_OPTS_TARGET+=" -DBUILD_WSI_XCB_SUPPORT=ON \ -DBUILD_WSI_XLIB_SUPPORT=ON \ -DBUILD_WSI_WAYLAND_SUPPORT=OFF" elif [ "${DISPLAYSERVER}" = "wl" ]; then PKG_CMAKE_OPTS_TARGET+=" -DBUILD_WSI_XCB_SUPPORT=OFF \ -DBUILD_WSI_XLIB_SUPPORT=OFF \ -DBUILD_WSI_WAYLAND_SUPPORT=ON" else PKG_CMAKE_OPTS_TARGET+=" -DBUILD_WSI_XCB_SUPPORT=OFF \ -DBUILD_WSI_XLIB_SUPPORT=OFF \ -DBUILD_WSI_WAYLAND_SUPPORT=OFF" fi } ================================================ FILE: packages/graphics/vulkan/vulkan-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Frank Hartung (supervisedthinking (@) gmail.com) # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vulkan-tools" PKG_VERSION="1.3.241" PKG_SHA256="e8bb61e6c4514cb60b85d74cd27204001a19492310e3055659778b1d33bb0078" PKG_LICENSE="Apache-2.0" PKG_SITE="https://github.com/KhronosGroup/Vulkan-Tools" PKG_URL="https://github.com/KhronosGroup/Vulkan-tools/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain vulkan-loader glslang:host" PKG_LONGDESC="This project provides Khronos official Vulkan Tools and Utilities." configure_package() { # Displayserver Support if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" libxcb libX11" elif [ "${DISPLAYSERVER}" = "wl" ]; then PKG_DEPENDS_TARGET+=" wayland" fi } pre_configure_target() { PKG_CMAKE_OPTS_TARGET="-DVULKAN_HEADERS_INSTALL_DIR=${SYSROOT_PREFIX}/usr \ -DBUILD_VULKANINFO=ON \ -DBUILD_ICD=OFF \ -DINSTALL_ICD=OFF \ -DBUILD_WSI_DIRECTFB_SUPPORT=OFF \ -Wno-dev" if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_CMAKE_OPTS_TARGET+=" -DBUILD_CUBE=ON \ -DBUILD_WSI_XCB_SUPPORT=ON \ -DBUILD_WSI_XLIB_SUPPORT=ON \ -DBUILD_WSI_WAYLAND_SUPPORT=OFF \ -DCUBE_WSI_SELECTION=XCB" elif [ "${DISPLAYSERVER}" = "wl" ]; then PKG_CMAKE_OPTS_TARGET+=" -DBUILD_CUBE=ON \ -DBUILD_WSI_XCB_SUPPORT=OFF \ -DBUILD_WSI_XLIB_SUPPORT=OFF \ -DBUILD_WSI_WAYLAND_SUPPORT=ON -DCUBE_WSI_SELECTION=WAYLAND" else PKG_CMAKE_OPTS_TARGET+=" -DBUILD_CUBE=ON \ -DBUILD_WSI_XCB_SUPPORT=OFF \ -DBUILD_WSI_XLIB_SUPPORT=OFF \ -DBUILD_WSI_WAYLAND_SUPPORT=OFF \ -DCUBE_WSI_SELECTION=DISPLAY" fi } pre_make_target() { # Fix cross compiling find ${PKG_BUILD} -name flags.make -exec sed -i "s:isystem :I:g" \{} \; find ${PKG_BUILD} -name build.ninja -exec sed -i "s:isystem :I:g" \{} \; } post_makeinstall_target() { # Clean up - two graphic test tools are superflous safe_remove ${INSTALL}/usr/bin/vkcubepp } ================================================ FILE: packages/graphics/vulkan/vulkan-tools/patches/vulkan-tools-995.01-cmakelists-opts.patch ================================================ From c9c7423f2d0ecfc7ab354d2a3d9ea9c2e4998416 Mon Sep 17 00:00:00 2001 From: SupervisedThinking Date: Thu, 18 Nov 2021 15:02:55 +0100 Subject: [PATCH] CMakeLists: add CMake options for cube & vulkaninfo --- CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 422b7d2cc..d123c9dc5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,12 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") option(BUILD_CUBE "Build cube" ON) option(BUILD_VULKANINFO "Build vulkaninfo" ON) option(BUILD_ICD "Build icd" ON) +option(BUILD_WSI_XCB_SUPPORT "Build XCB WSI support" ON) +option(BUILD_WSI_XLIB_SUPPORT "Build Xlib WSI support" ON) +option(BUILD_WSI_WAYLAND_SUPPORT "Build Wayland WSI support" ON) +option(BUILD_WSI_DIRECTFB_SUPPORT "Build DirectFB WSI support" OFF) +set(CUBE_WSI_SELECTION "XCB" CACHE STRING "Select WSI target for vkcube (XCB, XLIB, WAYLAND, DIRECTFB, DISPLAY)") + # Installing the Mock ICD to system directories is probably not desired since this ICD is not a very complete implementation. # Require the user to ask that it be installed if they really want it. option(INSTALL_ICD "Install icd" OFF) ================================================ FILE: packages/graphics/vulkan/vulkan-tools/patches/vulkan-tools-995.04-fix-glslangValidator-logik.patch ================================================ From a1894dc9f650ab94fb7e348e1b06ee75a1e9728b Mon Sep 17 00:00:00 2001 From: SupervisedThinking Date: Sat, 20 Nov 2021 18:39:04 +0100 Subject: [PATCH] CMakeLists: updated glslangValidator logik --- cube/CMakeLists.txt | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/cube/CMakeLists.txt b/cube/CMakeLists.txt index d59eb4366..a684fc4f0 100644 --- a/cube/CMakeLists.txt +++ b/cube/CMakeLists.txt @@ -26,26 +26,37 @@ endif() if(GLSLANG_INSTALL_DIR) message(STATUS "Using GLSLANG_INSTALL_DIR to look for glslangValidator") find_program(GLSLANG_VALIDATOR names glslangValidator HINTS "${GLSLANG_INSTALL_DIR}/bin") + else() set(GLSLANG_VALIDATOR_NAME "glslangValidator") - message(STATUS "Using cmake find_program to look for glslangValidator") - if(WIN32) - execute_process( - COMMAND ${PYTHON_EXECUTABLE} ${SCRIPTS_DIR}/fetch_glslangvalidator.py glslang-master-windows-x64-Release.zip) - set(GLSLANG_VALIDATOR_NAME "glslangValidator.exe") - elseif(APPLE) - execute_process(COMMAND ${PYTHON_EXECUTABLE} ${SCRIPTS_DIR}/fetch_glslangvalidator.py glslang-master-osx-Release.zip) - elseif(UNIX AND NOT APPLE) # i.e. Linux - execute_process(COMMAND ${PYTHON_EXECUTABLE} ${SCRIPTS_DIR}/fetch_glslangvalidator.py glslang-master-linux-Release.zip) - endif() - if (WIN32) - set(PLATFORM_DIR "${PROJECT_SOURCE_DIR}/glslang/windows/bin") - elseif(APPLE) - set(PLATFORM_DIR "${PROJECT_SOURCE_DIR}/glslang/darwin/bin") + message(CHECK_START "Looking for glslangValidator") + find_program(GLSLANG_VALIDATOR NAMES ${GLSLANG_VALIDATOR_NAME} HINTS ${PLATFORM_DIR}) + if(GLSLANG_VALIDATOR) + message(CHECK_PASS ${GLSLANG_VALIDATOR}) else() - set(PLATFORM_DIR "${PROJECT_SOURCE_DIR}/glslang/linux/bin") + if(WIN32) + execute_process( + COMMAND ${PYTHON_EXECUTABLE} ${SCRIPTS_DIR}/fetch_glslangvalidator.py glslang-master-windows-x64-Release.zip) + set(GLSLANG_VALIDATOR_NAME "glslangValidator.exe") + elseif(APPLE) + execute_process(COMMAND ${PYTHON_EXECUTABLE} ${SCRIPTS_DIR}/fetch_glslangvalidator.py glslang-master-osx-Release.zip) + elseif(UNIX AND NOT APPLE) # i.e. Linux + execute_process(COMMAND ${PYTHON_EXECUTABLE} ${SCRIPTS_DIR}/fetch_glslangvalidator.py glslang-master-linux-Release.zip) + endif() + if (WIN32) + set(PLATFORM_DIR "${PROJECT_SOURCE_DIR}/glslang/windows/bin") + elseif(APPLE) + set(PLATFORM_DIR "${PROJECT_SOURCE_DIR}/glslang/darwin/bin") + else() + set(PLATFORM_DIR "${PROJECT_SOURCE_DIR}/glslang/linux/bin") + endif() + find_program(GLSLANG_VALIDATOR NAMES ${GLSLANG_VALIDATOR_NAME} HINTS ${PLATFORM_DIR}) + if(GLSLANG_VALIDATOR) + message(CHECK_PASS ${GLSLANG_VALIDATOR}) + else() + message(FATAL_ERROR "no glslangValidator binary found") + endif() endif() - find_program(GLSLANG_VALIDATOR NAMES ${GLSLANG_VALIDATOR_NAME} HINTS ${PLATFORM_DIR}) endif() if(UNIX AND NOT APPLE) # i.e. Linux ================================================ FILE: packages/lang/Python3/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Python3" # When changing PKG_VERSION remember to sync PKG_PYTHON_VERSION! PKG_VERSION="3.11.2" PKG_SHA256="29e4b8f5f1658542a8c13e2dd277358c9c48f2b2f7318652ef1675e402b9d2af" PKG_LICENSE="OSS" PKG_SITE="https://www.python.org/" PKG_URL="https://www.python.org/ftp/python/${PKG_VERSION}/${PKG_NAME::-1}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="zlib:host bzip2:host libffi:host util-linux:host xz:host autoconf-archive:host" PKG_DEPENDS_TARGET="toolchain Python3:host sqlite expat zlib bzip2 xz openssl libffi readline ncurses util-linux" PKG_LONGDESC="Python3 is an interpreted object-oriented programming language." PKG_TOOLCHAIN="autotools" PKG_PYTHON_VERSION="python3.11" PKG_PY_DISABLED_MODULES="_tkinter nis gdbm bsddb ossaudiodev" PKG_CONFIGURE_OPTS_HOST="ac_cv_prog_HAS_HG=/bin/false ac_cv_prog_SVNVERSION=/bin/false --disable-pyc-build --disable-ossaudiodev --disable-sqlite3 --disable-codecs-cjk --disable-nis --enable-unicodedata --enable-openssl --disable-readline --disable-bzip2 --enable-zlib --enable-xz --disable-tk --disable-curses --disable-pydoc --disable-test-modules --disable-lib2to3 --disable-idle3 --without-cxx-main --with-expat=builtin --with-libmpdec=none --with-doc-strings --with-system-ffi --without-pymalloc --without-ensurepip " PKG_CONFIGURE_OPTS_TARGET="ac_cv_prog_HAS_HG=/bin/false ac_cv_prog_SVNVERSION=/bin/false ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no ac_cv_have_long_long_format=yes ac_cv_working_tzset=yes ac_cv_func_lchflags_works=no ac_cv_func_chflags_works=no ac_cv_func_printf_zd=yes ac_cv_buggy_getaddrinfo=no ac_cv_header_bluetooth_bluetooth_h=no ac_cv_header_bluetooth_h=no --disable-pyc-build --disable-ossaudiodev --enable-sqlite3 --disable-codecs-cjk --disable-nis --enable-unicodedata --enable-openssl --enable-readline --enable-bzip2 --enable-zlib --enable-xz --disable-tk --enable-curses --disable-pydoc --disable-test-modules --disable-lib2to3 --disable-idle3 --without-cxx-main --with-expat=system --with-libmpdec=none --with-doc-strings --with-system-ffi --without-pymalloc --without-ensurepip --enable-ipv6 --with-build-python=${TOOLCHAIN}/bin/python " pre_configure_host() { export PYTHON_MODULES_INCLUDE="${HOST_INCDIR}" export PYTHON_MODULES_LIB="${HOST_LIBDIR}" export DISABLED_EXTENSIONS="readline _curses _curses_panel ${PKG_PY_DISABLED_MODULES}" } post_make_host() { # python distutils per default adds -L${LIBDIR} when linking binary extensions sed -e "s|^ 'LIBDIR':.*| 'LIBDIR': '/usr/lib',|g" -i $(find ${PKG_BUILD}/.${HOST_NAME} -not -path '*/__pycache__/*' -name '_sysconfigdata__*.py') } post_makeinstall_host() { ln -sf ${PKG_PYTHON_VERSION} ${TOOLCHAIN}/bin/python rm -f ${TOOLCHAIN}/bin/smtpd.py* rm -f ${TOOLCHAIN}/bin/pyvenv rm -f ${TOOLCHAIN}/bin/pydoc* rm -fr ${PKG_BUILD}/.${HOST_NAME}/build/temp.* cp ${PKG_BUILD}/Tools/scripts/reindent.py ${TOOLCHAIN}/lib/${PKG_PYTHON_VERSION} } pre_configure_target() { export PYTHON_MODULES_INCLUDE="${TARGET_INCDIR}" export PYTHON_MODULES_LIB="${TARGET_LIBDIR}" export DISABLED_EXTENSIONS="${PKG_PY_DISABLED_MODULES}" } post_makeinstall_target() { ln -sf ${PKG_PYTHON_VERSION} ${INSTALL}/usr/bin/python rm -fr ${PKG_BUILD}/.${TARGET_NAME}/build/temp.* PKG_INSTALL_PATH_LIB=${INSTALL}/usr/lib/${PKG_PYTHON_VERSION} for dir in config compiler sysconfigdata lib-dynload/sysconfigdata lib2to3/tests test; do rm -rf ${PKG_INSTALL_PATH_LIB}/${dir} done rm -rf ${PKG_INSTALL_PATH_LIB}/distutils/command/*.exe rm -rf ${INSTALL}/usr/bin/pyvenv rm -rf ${INSTALL}/usr/bin/python*-config rm -rf ${INSTALL}/usr/bin/smtpd.py ${INSTALL}/usr/bin/smtpd.py.* find ${INSTALL} -name '*.o' -delete python_compile ${PKG_INSTALL_PATH_LIB} # strip chmod u+w ${INSTALL}/usr/lib/libpython*.so.* debug_strip ${INSTALL}/usr } ================================================ FILE: packages/lang/Python3/patches/0001-Make-the-build-of-pyc-files-conditional.patch ================================================ From 51ed7f93cc0333efa8fccd9b88db713c48993df9 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 22 Feb 2017 16:21:31 -0800 Subject: [PATCH] Make the build of pyc files conditional This commit adds a new configure option --disable-pyc-build to disable the compilation of pyc. Signed-off-by: Thomas Petazzoni [ Andrey Smrinov: ported to Python 3.6 ] Signed-off-by: Andrey Smirnov --- Makefile.pre.in | 2 ++ configure.ac | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/Makefile.pre.in b/Makefile.pre.in index 8fbcd7ac17..2957c8e5a1 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -2078,6 +2078,7 @@ libinstall: all $(srcdir)/Modules/xxmodule.c $(INSTALL_DATA) $(srcdir)/Modules/xxmodule.c \ $(DESTDIR)$(LIBDEST)/distutils/tests ; \ fi +ifeq (@PYC_BUILD@,yes) -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \ -j0 -d $(LIBDEST) -f \ @@ -2105,6 +2106,7 @@ libinstall: all $(srcdir)/Modules/xxmodule.c $(PYTHON_FOR_BUILD) -Wi -OO $(DESTDIR)$(LIBDEST)/compileall.py \ -j0 -d $(LIBDEST)/site-packages -f \ -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages +endif -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ diff --git a/configure.ac b/configure.ac index ab5e1de6fa..0cf89ed641 100644 --- a/configure.ac +++ b/configure.ac @@ -1441,6 +1441,12 @@ fi AC_MSG_CHECKING(LDLIBRARY) +AC_SUBST(PYC_BUILD) + +AC_ARG_ENABLE(pyc-build, + AS_HELP_STRING([--disable-pyc-build], [disable build of pyc files]), + [ PYC_BUILD="${enableval}" ], [ PYC_BUILD=yes ]) + # MacOSX framework builds need more magic. LDLIBRARY is the dynamic # library that we build, but we do not want to link against it (we # will find it with a -framework option). For this reason there is an -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0002-Disable-buggy_getaddrinfo-configure-test-when-cross-.patch ================================================ From b180ab302e2a82be239af334382436628b81381e Mon Sep 17 00:00:00 2001 From: Vanya Sergeev Date: Wed, 23 Dec 2015 11:30:33 +0100 Subject: [PATCH] Disable buggy_getaddrinfo configure test when cross-compiling with IPv6 support Signed-off-by: Vanya Sergeev --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 0cf89ed641..830885fcb3 100644 --- a/configure.ac +++ b/configure.ac @@ -5086,7 +5086,7 @@ fi])) dnl if ac_cv_func_getaddrinfo ]) -if test "$ac_cv_func_getaddrinfo" = no -o "$ac_cv_buggy_getaddrinfo" = yes +if test "$ac_cv_func_getaddrinfo" = no || test "$cross_compiling" != "yes" -a "$ac_cv_buggy_getaddrinfo" = yes then AS_VAR_IF([ipv6], [yes], [ AC_MSG_ERROR([m4_normalize([ -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0003-Add-infrastructure-to-disable-the-build-of-certain-e.patch ================================================ From 8e02cebdac536dfb6748da2c50656a26f70d9da7 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 22 Feb 2017 16:33:22 -0800 Subject: [PATCH] Add infrastructure to disable the build of certain extensions Some of the extensions part of the Python core have dependencies on external libraries (sqlite, tk, etc.) or are relatively big and not necessarly always useful (CJK codecs for example). By extensions, we mean part of Python modules that are written in C and therefore compiled to binary code. Therefore, we introduce a small infrastructure that allows to disable some of those extensions. This can be done inside the configure.ac by adding values to the DISABLED_EXTENSIONS variable (which is a word-separated list of extensions). The implementation works as follow : * configure.ac defines a DISABLED_EXTENSIONS variable, which is substituted (so that when Makefile.pre is generated from Makefile.pre.in, the value of the variable is substituted). For now, this DISABLED_EXTENSIONS variable is empty, later patches will use it. * Makefile.pre.in passes the DISABLED_EXTENSIONS value down to the variables passed in the environment when calling the setup.py script that actually builds and installs those extensions. * setup.py is modified so that the existing "disabled_module_list" is filled with those pre-disabled extensions listed in DISABLED_EXTENSIONS. Patch ported to python2.7 by Maxime Ripard , and then extended by Thomas Petazzoni . Signed-off-by: Thomas Petazzoni [ Andrey Smirnov: ported to Python 3.6 ] Signed-off-by: Andrey Smirnov --- Makefile.pre.in | 6 +++++- configure.ac | 2 ++ setup.py | 5 ++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 2957c8e5a1..c1cfb96767 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -239,6 +239,8 @@ FILEMODE= 644 # configure script arguments CONFIG_ARGS= @CONFIG_ARGS@ +# disabled extensions +DISABLED_EXTENSIONS= @DISABLED_EXTENSIONS@ # Subdirectories with code SRCDIRS= @SRCDIRS@ @@ -739,6 +741,7 @@ sharedmods: $(PYTHON_FOR_BUILD_DEPS) pybuilddir.txt @LIBMPDEC_INTERNAL@ @LIBEXPA *) quiet="";; \ esac; \ echo "$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \ + DISABLED_EXTENSIONS="$(DISABLED_EXTENSIONS)" \ $(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build"; \ $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \ $(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build @@ -2228,7 +2231,8 @@ libainstall: all python-config # Install the dynamically loadable modules # This goes into $(exec_prefix) sharedinstall: all - $(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/setup.py install \ + $(RUNSHARED) DISABLED_EXTENSIONS="$(DISABLED_EXTENSIONS)" \ + $(PYTHON_FOR_BUILD) $(srcdir)/setup.py install \ --prefix=$(prefix) \ --install-scripts=$(BINDIR) \ --install-platlib=$(DESTSHARED) \ diff --git a/configure.ac b/configure.ac index 830885fcb3..5a6a1fe608 100644 --- a/configure.ac +++ b/configure.ac @@ -3562,6 +3562,8 @@ LIBS="$withval $LIBS" ], [AC_MSG_RESULT(no)]) +AC_SUBST(DISABLED_EXTENSIONS) + # Check for use of the system expat library AC_MSG_CHECKING(for --with-system-expat) AC_ARG_WITH(system_expat, diff --git a/setup.py b/setup.py index 15d0d4576a..e496ee34c2 100644 --- a/setup.py +++ b/setup.py @@ -56,7 +56,10 @@ # This global variable is used to hold the list of modules to be disabled. -DISABLED_MODULE_LIST = [] +try: + DISABLED_MODULE_LIST = sysconfig.get_config_var("DISABLED_EXTENSIONS").split(" ") +except KeyError: + DISABLED_MODULE_LIST = list() # --list-module-names option used by Tools/scripts/generate_module_names.py LIST_MODULE_NAMES = False -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0004-Adjust-library-header-paths-for-cross-compilation.patch ================================================ From 132b9dca3bb4d4682f7e318648ce11e1abb31b62 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 23 Dec 2015 11:33:14 +0100 Subject: [PATCH] Adjust library/header paths for cross-compilation When cross-compiling third-party extensions, the get_python_inc() or get_python_lib() can be called, to return the path to headers or libraries. However, they use the sys.prefix of the host Python, which returns incorrect paths when cross-compiling (paths pointing to host headers and libraries). In order to fix this, we introduce the _python_sysroot, _python_prefix and _python_exec_prefix variables, that allow to override these values, and get correct header/library paths when cross-compiling third-party Python modules. Signed-off-by: Thomas Petazzoni Signed-off-by: Adam Duskett Refresh for 3.10.0 --- Lib/distutils/command/build_ext.py | 5 ++++- Lib/sysconfig.py | 15 +++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py index f287b34998..298234d6a1 100644 --- a/Lib/distutils/command/build_ext.py +++ b/Lib/distutils/command/build_ext.py @@ -234,7 +234,10 @@ def finalize_options(self): if (sysconfig.get_config_var('Py_ENABLE_SHARED')): if not sysconfig.python_build: # building third party extensions - self.library_dirs.append(sysconfig.get_config_var('LIBDIR')) + libdir = sysconfig.get_config_var('LIBDIR') + if "_python_sysroot" in os.environ: + libdir = os.environ.get("_python_sysroot") + libdir + self.library_dirs.append(libdir) else: # building python standard extensions self.library_dirs.append('.') diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index ebe3711827..6328ec41af 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -168,10 +168,17 @@ def joinuser(*args): _PY_VERSION = sys.version.split()[0] _PY_VERSION_SHORT = f'{sys.version_info[0]}.{sys.version_info[1]}' _PY_VERSION_SHORT_NO_DOT = f'{sys.version_info[0]}{sys.version_info[1]}' -_PREFIX = os.path.normpath(sys.prefix) -_BASE_PREFIX = os.path.normpath(sys.base_prefix) -_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) -_BASE_EXEC_PREFIX = os.path.normpath(sys.base_exec_prefix) +if "_python_sysroot" in os.environ: + _sysroot=os.environ.get('_python_sysroot') + _PREFIX = os.path.normpath(_sysroot + os.environ.get('_python_prefix')) + _EXEC_PREFIX = os.path.normpath(_sysroot + os.environ.get('_python_exec_prefix')) + _BASE_PREFIX = _PREFIX + _BASE_EXEC_PREFIX = _EXEC_PREFIX +else: + _PREFIX = os.path.normpath(sys.prefix) + _EXEC_PREFIX = os.path.normpath(sys.exec_prefix) + _BASE_PREFIX = os.path.normpath(sys.base_prefix) + _BASE_EXEC_PREFIX = os.path.normpath(sys.base_exec_prefix) _CONFIG_VARS = None _USER_BASE = None -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0005-Don-t-look-in-usr-lib-termcap-for-libraries.patch ================================================ From 5d13e384b30a2c0b1c7b65718590b7fb0c3ba55e Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 23 Dec 2015 11:36:00 +0100 Subject: [PATCH] Don't look in /usr/lib/termcap for libraries Signed-off-by: Thomas Petazzoni --- setup.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/setup.py b/setup.py index e496ee34c2..1904898165 100644 --- a/setup.py +++ b/setup.py @@ -1107,12 +1107,9 @@ def detect_readline_curses(self): pass # Issue 7384: Already linked against curses or tinfo. elif curses_library: readline_libs.append(curses_library) - elif self.compiler.find_library_file(self.lib_dirs + - ['/usr/lib/termcap'], - 'termcap'): + elif self.compiler.find_library_file(self.lib_dirs, 'termcap'): readline_libs.append('termcap') self.add(Extension('readline', ['readline.c'], - library_dirs=['/usr/lib/termcap'], libraries=readline_libs)) else: self.missing.append('readline') -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0006-Don-t-add-multiarch-paths.patch ================================================ From ad463b5d58ae79f69b011fb048861bd874d34369 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 23 Dec 2015 11:36:27 +0100 Subject: [PATCH] Don't add multiarch paths The add_multiarch_paths() function leads, in certain build environments, to the addition of host header paths to the CFLAGS, which is not appropriate for cross-compilation. This patch fixes that by simply removing the call to add_multiarch_paths() when we're cross-compiling. Investigation done by David . Signed-off-by: Thomas Petazzoni --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 1904898165..32294546b6 100644 --- a/setup.py +++ b/setup.py @@ -852,10 +852,10 @@ def configure_compiler(self): if not CROSS_COMPILING: add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # only change this for cross builds for 3.3, issues on Mageia if CROSS_COMPILING: self.add_cross_compiling_paths() - self.add_multiarch_paths() self.add_ldflags_cppflags() def init_inc_lib_dirs(self): -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0007-Abort-on-failed-module-build.patch ================================================ From 60b1664a7acebadb1a3d6df871145147f33b5afe Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 23 Dec 2015 11:43:24 +0100 Subject: [PATCH] Abort on failed module build When building a Python module fails, the setup.py script currently doesn't exit with an error, and simply continues. This is not a really nice behavior, so this patch changes setup.py to abort with an error, so that the build issue is clearly noticeable. Signed-off-by: Thomas Petazzoni --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 32294546b6..0e04944ce0 100644 --- a/setup.py +++ b/setup.py @@ -579,6 +579,7 @@ def print_three_column(lst): print("Failed to build these modules:") print_three_column(failed) print() + sys.exit(1) if self.failed_on_import: failed = self.failed_on_import[:] -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0008-Serial-ioctl-workaround.patch ================================================ From 90f3075b629d90d942da1d22ef7563f7149f4f6c Mon Sep 17 00:00:00 2001 From: Baruch Siach Date: Wed, 23 Dec 2015 11:44:02 +0100 Subject: [PATCH] Serial ioctl() workaround The ioctls.h of some architectures (notably xtensa) references structs from linux/serial.h. Make sure to include this header as well. Also, undef TIOCTTYGSTRUCT that require reference to internal kernel tty_struct, but isn't actually referenced in modern kernels. Signed-off-by: Baruch Siach --- Modules/termios.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Modules/termios.c b/Modules/termios.c index 354e5ca18d..c08957c500 100644 --- a/Modules/termios.c +++ b/Modules/termios.c @@ -15,7 +15,9 @@ #endif #include +#include #include +#undef TIOCTTYGSTRUCT /* HP-UX requires that this be included to pick up MDCD, MCTS, MDSR, * MDTR, MRI, and MRTS (apparently used internally by some things -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0009-Do-not-adjust-the-shebang-of-Python-scripts-for-cros.patch ================================================ From 2439bd2ed5dbdd7e5fda15adefd0f6f1b047ec1b Mon Sep 17 00:00:00 2001 From: Christophe Vu-Brugier Date: Wed, 23 Dec 2015 11:44:30 +0100 Subject: [PATCH] Do not adjust the shebang of Python scripts for cross-compilation The copy_scripts() method in distutils copies the scripts listed in the setup file and adjusts the first line to refer to the current Python interpreter. When cross-compiling, this means that the adjusted shebang refers to the host Python interpreter. This patch modifies copy_scripts() to preserve the shebang when cross-compilation is detected. Signed-off-by: Christophe Vu-Brugier --- Lib/distutils/command/build_scripts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/distutils/command/build_scripts.py b/Lib/distutils/command/build_scripts.py index ccc70e6465..d6d54195c1 100644 --- a/Lib/distutils/command/build_scripts.py +++ b/Lib/distutils/command/build_scripts.py @@ -91,7 +91,7 @@ def copy_scripts(self): adjust = True post_interp = match.group(1) or b'' - if adjust: + if adjust and not '_python_sysroot' in os.environ: log.info("copying and adjusting %s -> %s", script, self.build_dir) updated_files.append(outfile) -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0010-Misc-python-config.sh.in-ensure-sed-invocations-only.patch ================================================ From 55ef5552e4ee60266e3299f253bec3b13785e585 Mon Sep 17 00:00:00 2001 From: Peter Korsgaard Date: Thu, 20 Nov 2014 13:24:59 +0100 Subject: [PATCH] Misc/python-config.sh.in: ensure sed invocations only match beginning of strings The build/real prefix handling using sed breaks if build != real and the standard include / lib directories are used ($prefix/include and $prefix/lib). E.G. prefix_build="/usr", libdir="$prefix/lib", includedir="$prefix/include". If this gets installed with make DESTDIR="/foo" install, then we end up with prefix_real = prefix = "/foo/usr" as expected, but includedir="/foo/foo/usr/include" and libdir="/foo/foo/usr/lib" because of the double sed invocation (prefix is already expanded). Work around it by ensuring we only match the beginning of the string. Submitted upstream: http://bugs.python.org/issue22907 Signed-off-by: Peter Korsgaard --- Misc/python-config.sh.in | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Misc/python-config.sh.in b/Misc/python-config.sh.in index 2602fe24c0..a1bc3cd5f7 100644 --- a/Misc/python-config.sh.in +++ b/Misc/python-config.sh.in @@ -24,18 +24,19 @@ installed_prefix () echo $RESULT } +prefix_build="@prefix@" prefix_real=$(installed_prefix "$0") # Use sed to fix paths from their built-to locations to their installed-to # locations. Keep prefix & exec_prefix using their original values in case # they are referenced in other configure variables, to prevent double # substitution, issue #22140. -prefix="@prefix@" -exec_prefix="@exec_prefix@" +prefix=$(echo "$prefix_build" | sed "s#^$prefix_build#$prefix_real#") +exec_prefix=$(echo "$exec_prefix_build" | sed "s#^$exec_prefix_build#$prefix_real#") exec_prefix_real=${prefix_real} -includedir=$(echo "@includedir@" | sed "s#$prefix#$prefix_real#") -libdir=$(echo "@libdir@" | sed "s#$prefix#$prefix_real#") -CFLAGS=$(echo "@CFLAGS@" | sed "s#$prefix#$prefix_real#") +includedir=$(echo "@includedir@" | sed "s#^$prefix_build#$prefix_real#") +libdir=$(echo "@libdir@" | sed "s#^$prefix_build#$prefix_real#") +CFLAGS=$(echo "@CFLAGS@" | sed "s#^$prefix_build#$prefix_real#") VERSION="@VERSION@" LIBM="@LIBM@" LIBC="@LIBC@" @@ -49,7 +50,7 @@ OPT="@OPT@" PY_ENABLE_SHARED="@PY_ENABLE_SHARED@" LDVERSION="@LDVERSION@" LIBDEST=${prefix_real}/lib/python${VERSION} -LIBPL=$(echo "@LIBPL@" | sed "s#$prefix#$prefix_real#") +LIBPL=$(echo "@LIBPL@" | sed "s#^$prefix_build#$prefix_real#") SO="@EXT_SUFFIX@" PYTHONFRAMEWORK="@PYTHONFRAMEWORK@" INCDIR="-I$includedir/python${VERSION}${ABIFLAGS}" -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0011-Add-an-option-to-disable-pydoc.patch ================================================ From 38b7f7949258aeadf8bc45525be91340bb732a2a Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 22 Feb 2017 17:07:56 -0800 Subject: [PATCH] Add an option to disable pydoc It removes 0.5 MB of data from the target plus the pydoc script itself. Signed-off-by: Thomas Petazzoni Signed-off-by: Samuel Martin [ Andrey Smirnov: ported to Python 3.6 ] Signed-off-by: Andrey Smirnov [ Adam Duskett: ported to Python 3.10.0 ] Signed-off-by: Adam Duskett --- Makefile.pre.in | 7 ++++++- configure.ac | 6 ++++++ setup.py | 9 +++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index c1cfb96767..403380e181 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1864,7 +1864,9 @@ bininstall: altbininstall -rm -f $(DESTDIR)$(BINDIR)/idle3 (cd $(DESTDIR)$(BINDIR); $(LN) -s idle$(VERSION) idle3) -rm -f $(DESTDIR)$(BINDIR)/pydoc3 +ifeq (@PYDOC@,yes) (cd $(DESTDIR)$(BINDIR); $(LN) -s pydoc$(VERSION) pydoc3) +endif -rm -f $(DESTDIR)$(BINDIR)/2to3 (cd $(DESTDIR)$(BINDIR); $(LN) -s 2to3-$(VERSION) 2to3) if test "x$(LIPO_32BIT_FLAGS)" != "x" ; then \ @@ -1915,7 +1917,6 @@ LIBSUBDIRS= asyncio \ lib2to3 lib2to3/fixes lib2to3/pgen2 \ logging \ multiprocessing multiprocessing/dummy \ - pydoc_data \ re \ site-packages \ sqlite3 \ @@ -2008,6 +2009,10 @@ TESTSUBDIRS= ctypes/test \ tkinter/test/test_ttk \ unittest/test unittest/test/testmock +ifeq (@PYDOC@,yes) +LIBSUBDIRS += pydoc_data +endif + TEST_MODULES=@TEST_MODULES@ libinstall: all $(srcdir)/Modules/xxmodule.c @for i in $(SCRIPTDIR) $(LIBDEST); \ diff --git a/configure.ac b/configure.ac index 5a6a1fe608..f68ea72321 100644 --- a/configure.ac +++ b/configure.ac @@ -4171,6 +4171,12 @@ AS_VAR_IF([posix_threads], [stub], [ AC_DEFINE([HAVE_PTHREAD_STUBS], [1], [Define if platform requires stubbed pthreads support]) ]) +AC_SUBST(PYDOC) + +AC_ARG_ENABLE(pydoc, + AS_HELP_STRING([--disable-pydoc], [disable pydoc]), + [ PYDOC="${enableval}" ], [ PYDOC=yes ]) + # Check for enable-ipv6 AH_TEMPLATE(ENABLE_IPV6, [Define if --enable-ipv6 is specified]) AC_MSG_CHECKING([if --enable-ipv6 is specified]) diff --git a/setup.py b/setup.py index 0e04944ce0..3e55f5b2e0 100644 --- a/setup.py +++ b/setup.py @@ -1593,6 +1593,12 @@ class DummyProcess: # turn off warnings when deprecated modules are imported import warnings warnings.filterwarnings("ignore",category=DeprecationWarning) + + scripts = ['Tools/scripts/idle3', 'Tools/scripts/2to3', + 'Lib/smtpd.py'] + if not '--disable-pydoc' in sysconfig.get_config_var("CONFIG_ARGS"): + scripts += [ 'Tools/scripts/pydoc3' ] + setup(# PyPI Metadata (PEP 301) name = "Python", version = sys.version.split()[0], @@ -1617,8 +1623,7 @@ class DummyProcess: # If you change the scripts installed here, you also need to # check the PyBuildScripts command above, and change the links # created by the bininstall target in Makefile.pre.in - scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3", - "Tools/scripts/2to3"] + scripts = scripts ) # --install-platlib -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0012-Add-an-option-to-disable-lib2to3.patch ================================================ From 0e4f0a525ea0a68f6d4c5349c301da2e9b0c8ac9 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 22 Feb 2017 17:15:31 -0800 Subject: [PATCH] Add an option to disable lib2to3 lib2to3 is a library to convert Python 2.x code to Python 3.x. As such, it is probably not very useful on embedded system targets. Signed-off-by: Thomas Petazzoni Signed-off-by: Samuel Martin [ Andrey Smirnov: ported to Python 3.6 ] Signed-off-by: Andrey Smirnov [ Adam Duskett: ported to Python 3.10.0 ] Signed-off-by: Adam Duskett --- Makefile.pre.in | 17 ++++++++++++----- configure.ac | 6 ++++++ setup.py | 6 +++--- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 403380e181..f5d0573067 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1868,7 +1868,9 @@ ifeq (@PYDOC@,yes) (cd $(DESTDIR)$(BINDIR); $(LN) -s pydoc$(VERSION) pydoc3) endif -rm -f $(DESTDIR)$(BINDIR)/2to3 +ifeq (@LIB2TO3@,yes) (cd $(DESTDIR)$(BINDIR); $(LN) -s 2to3-$(VERSION) 2to3) +endif if test "x$(LIPO_32BIT_FLAGS)" != "x" ; then \ rm -f $(DESTDIR)$(BINDIR)/python3-32$(EXE); \ (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-32$(EXE) python3-32$(EXE)) \ @@ -1914,7 +1916,6 @@ LIBSUBDIRS= asyncio \ idlelib idlelib/Icons \ importlib importlib/resources importlib/metadata \ json \ - lib2to3 lib2to3/fixes lib2to3/pgen2 \ logging \ multiprocessing multiprocessing/dummy \ re \ @@ -1934,10 +1935,6 @@ LIBSUBDIRS= asyncio \ TESTSUBDIRS= ctypes/test \ distutils/tests \ idlelib/idle_test \ - lib2to3/tests \ - lib2to3/tests/data \ - lib2to3/tests/data/fixers \ - lib2to3/tests/data/fixers/myfixes \ test test/audiodata \ test/capath test/cjkencodings \ test/data test/decimaltestdata \ @@ -2013,6 +2010,14 @@ ifeq (@PYDOC@,yes) LIBSUBDIRS += pydoc_data endif +ifeq (@LIB2TO3@,yes) +LIBSUBDIRS += lib2to3 lib2to3/fixes lib2to3/pgen2 +TESTSUBDIRS += lib2to3/tests \ + lib2to3/tests/data \ + lib2to3/tests/data/fixers \ + lib2to3/tests/data/fixers/myfixes +endif + TEST_MODULES=@TEST_MODULES@ libinstall: all $(srcdir)/Modules/xxmodule.c @for i in $(SCRIPTDIR) $(LIBDEST); \ @@ -2115,10 +2120,12 @@ ifeq (@PYC_BUILD@,yes) -j0 -d $(LIBDEST)/site-packages -f \ -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages endif +ifeq (@LIB2TO3@,yes) -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt +endif # bpo-21536: Misc/python-config.sh is generated in the build directory # from $(srcdir)Misc/python-config.sh.in. diff --git a/configure.ac b/configure.ac index f68ea72321..d8e10cf2b2 100644 --- a/configure.ac +++ b/configure.ac @@ -7078,6 +7078,12 @@ PY_STDLIB_MOD([xxlimited_35], [test "$with_trace_refs" = "no"], [test "$ac_cv_fu # substitute multiline block, must come after last PY_STDLIB_MOD() AC_SUBST([MODULE_BLOCK]) +AC_SUBST(LIB2TO3) + +AC_ARG_ENABLE(lib2to3, + AS_HELP_STRING([--disable-lib2to3], [disable lib2to3]), + [ LIB2TO3="${enableval}" ], [ LIB2TO3=yes ]) + # generate output files AC_CONFIG_FILES(Makefile.pre Misc/python.pc Misc/python-embed.pc Misc/python-config.sh) AC_CONFIG_FILES([Modules/Setup.bootstrap Modules/Setup.stdlib]) diff --git a/setup.py b/setup.py index 3e55f5b2e0..c490b0b08f 100644 --- a/setup.py +++ b/setup.py @@ -1594,11 +1594,11 @@ class DummyProcess: import warnings warnings.filterwarnings("ignore",category=DeprecationWarning) - scripts = ['Tools/scripts/idle3', 'Tools/scripts/2to3', - 'Lib/smtpd.py'] + scripts = ['Tools/scripts/idle3', 'Lib/smtpd.py'] if not '--disable-pydoc' in sysconfig.get_config_var("CONFIG_ARGS"): scripts += [ 'Tools/scripts/pydoc3' ] - + if not '--disable-lib2to3' in sysconfig.get_config_var("CONFIG_ARGS"): + scripts += [ 'Tools/scripts/2to3' ] setup(# PyPI Metadata (PEP 301) name = "Python", version = sys.version.split()[0], -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0013-Add-option-to-disable-the-sqlite3-module.patch ================================================ From ef8c030e01b1be8be582e90c31298a5863094858 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 22 Feb 2017 17:20:45 -0800 Subject: [PATCH] Add option to disable the sqlite3 module Signed-off-by: Thomas Petazzoni Signed-off-by: Samuel Martin [ Andrey Smirnov: ported to Python 3.6 ] Signed-off-by: Andrey Smirnov [ Adam Duskett: ported to Python 3.10.0 ] Signed-off-by: Adam Duskett --- Makefile.pre.in | 5 ++++- configure.ac | 9 +++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index f5d0573067..9f4cdf14cf 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1920,7 +1920,6 @@ LIBSUBDIRS= asyncio \ multiprocessing multiprocessing/dummy \ re \ site-packages \ - sqlite3 \ tkinter \ tomllib \ turtledemo \ @@ -2018,6 +2017,10 @@ TESTSUBDIRS += lib2to3/tests \ lib2to3/tests/data/fixers/myfixes endif +ifeq (@SQLITE3@,yes) +LIBSUBDIRS += sqlite3 +endif + TEST_MODULES=@TEST_MODULES@ libinstall: all $(srcdir)/Modules/xxmodule.c @for i in $(SCRIPTDIR) $(LIBDEST); \ diff --git a/configure.ac b/configure.ac index d8e10cf2b2..4cc0951ab9 100644 --- a/configure.ac +++ b/configure.ac @@ -4171,6 +4171,15 @@ AS_VAR_IF([posix_threads], [stub], [ AC_DEFINE([HAVE_PTHREAD_STUBS], [1], [Define if platform requires stubbed pthreads support]) ]) +AC_SUBST(SQLITE3) +AC_ARG_ENABLE(sqlite3, + AS_HELP_STRING([--disable-sqlite3], [disable sqlite3]), + [ SQLITE3="${enableval}" ], [ SQLITE3=yes ]) + +if test "$SQLITE3" = "no" ; then + DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} _sqlite3" +fi + AC_SUBST(PYDOC) AC_ARG_ENABLE(pydoc, -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0014-Add-an-option-to-disable-the-tk-module.patch ================================================ From bbbfe699d648a5cb191203b16e1786e8cf4ea908 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 22 Feb 2017 17:23:42 -0800 Subject: [PATCH] Add an option to disable the tk module Signed-off-by: Thomas Petazzoni Signed-off-by: Samuel Martin [ Andrey Smirnov: ported to Python 3.6 ] Signed-off-by: Andrey Smirnov [ Adam Duskett: ported to Python 3.10.0 ] Signed-off-by: Adam Duskett --- Makefile.pre.in | 10 +++++++--- configure.ac | 9 +++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 9f4cdf14cf..4f83911200 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1920,7 +1920,6 @@ LIBSUBDIRS= asyncio \ multiprocessing multiprocessing/dummy \ re \ site-packages \ - tkinter \ tomllib \ turtledemo \ unittest \ @@ -2001,8 +2000,6 @@ TESTSUBDIRS= ctypes/test \ test/tracedmodules \ test/xmltestdata test/xmltestdata/c14n-20 \ test/ziptestdata \ - tkinter/test tkinter/test/test_tkinter \ - tkinter/test/test_ttk \ unittest/test unittest/test/testmock ifeq (@PYDOC@,yes) @@ -2021,6 +2018,13 @@ ifeq (@SQLITE3@,yes) LIBSUBDIRS += sqlite3 endif +ifeq (@TK@,yes) +LIBSUBDIRS += tkinter +TESTSUBDIRS += tkinter/test tkinter/test/test_tkinter \ + tkinter/test/test_ttk +endif + + TEST_MODULES=@TEST_MODULES@ libinstall: all $(srcdir)/Modules/xxmodule.c @for i in $(SCRIPTDIR) $(LIBDEST); \ diff --git a/configure.ac b/configure.ac index 4cc0951ab9..f4ce506801 100644 --- a/configure.ac +++ b/configure.ac @@ -4180,6 +4180,15 @@ if test "$SQLITE3" = "no" ; then DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} _sqlite3" fi +AC_SUBST(TK) +AC_ARG_ENABLE(tk, + AS_HELP_STRING([--disable-tk], [disable tk]), + [ TK="${enableval}" ], [ TK=yes ]) + +if test "$TK" = "no"; then + DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} _tkinter" +fi + AC_SUBST(PYDOC) AC_ARG_ENABLE(pydoc, -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0015-Add-an-option-to-disable-the-curses-module.patch ================================================ From 03e28cdd46dac1b7e4e9c8bbd2ea44b09e514205 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 22 Feb 2017 17:31:51 -0800 Subject: [PATCH] Add an option to disable the curses module Signed-off-by: Thomas Petazzoni Signed-off-by: Samuel Martin [ Andrey Smirnov: ported to Python 3.6 ] Signed-off-by: Andrey Smirnov [ Adam Duskett: ported to Python 3.10.0 ] Signed-off-by: Adam Duskett --- Makefile.pre.in | 4 +++- configure.ac | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 4f83911200..8e879b35c6 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1905,7 +1905,6 @@ LIBSUBDIRS= asyncio \ concurrent concurrent/futures \ csv \ ctypes ctypes/macholib \ - curses \ dbm \ distutils distutils/command \ email email/mime \ @@ -2024,6 +2023,9 @@ TESTSUBDIRS += tkinter/test tkinter/test/test_tkinter \ tkinter/test/test_ttk endif +ifeq (@CURSES@,yes) +LIBSUBDIRS += curses +endif TEST_MODULES=@TEST_MODULES@ libinstall: all $(srcdir)/Modules/xxmodule.c diff --git a/configure.ac b/configure.ac index f4ce506801..0ae9863cd6 100644 --- a/configure.ac +++ b/configure.ac @@ -4189,6 +4189,15 @@ if test "$TK" = "no"; then DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} _tkinter" fi +AC_SUBST(CURSES) +AC_ARG_ENABLE(curses, + AS_HELP_STRING([--disable-curses], [disable curses]), + [ CURSES="${enableval}" ], [ CURSES=yes ]) + +if test "$CURSES" = "no"; then + DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} _curses _curses_panel" +fi + AC_SUBST(PYDOC) AC_ARG_ENABLE(pydoc, -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0016-Add-an-option-to-disable-expat.patch ================================================ From c9a2ea3edacf57746517600ccc11c254a9fd6c48 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 22 Feb 2017 17:40:45 -0800 Subject: [PATCH] Add an option to disable expat This patch replaces the existing --with-system-expat option with a --with-expat={system,builtin,none} option, which allows to tell Python whether we want to use the system expat (already installed), the expat builtin the Python sources, or no expat at all (which disables the installation of XML modules). Signed-off-by: Thomas Petazzoni Signed-off-by: Samuel Martin [ Andrey Smirnov: ported to Python 3.6 ] Signed-off-by: Andrey Smirnov [ Adam Duskett: ported to Python 3.10.0 ] Signed-off-by: Adam Duskett --- Makefile.pre.in | 5 ++++- configure.ac | 20 ++++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 8e879b35c6..80d617cf7f 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1925,7 +1925,6 @@ LIBSUBDIRS= asyncio \ urllib \ venv venv/scripts venv/scripts/common venv/scripts/posix \ wsgiref \ - $(XMLLIBSUBDIRS) \ xmlrpc \ zoneinfo \ __phello__ @@ -2027,6 +2026,10 @@ ifeq (@CURSES@,yes) LIBSUBDIRS += curses endif +ifeq (@EXPAT@,yes) +LIBSUBDIRS += $(XMLLIBSUBDIRS) +endif + TEST_MODULES=@TEST_MODULES@ libinstall: all $(srcdir)/Modules/xxmodule.c @for i in $(SCRIPTDIR) $(LIBDEST); \ diff --git a/configure.ac b/configure.ac index 0ae9863cd6..201cad0bfc 100644 --- a/configure.ac +++ b/configure.ac @@ -3565,15 +3565,23 @@ LIBS="$withval $LIBS" AC_SUBST(DISABLED_EXTENSIONS) # Check for use of the system expat library -AC_MSG_CHECKING(for --with-system-expat) -AC_ARG_WITH(system_expat, - AS_HELP_STRING([--with-system-expat], [build pyexpat module using an installed expat library, see Doc/library/pyexpat.rst (default is no)]), +AC_MSG_CHECKING(for --with-expat) +AC_ARG_WITH(expat, + AS_HELP_STRING([--with-expat], [select which expat version to use: system, builtin, none]), [], - [with_system_expat="no"]) + [with_expat="builtin"]) -AC_MSG_RESULT($with_system_expat) +AC_MSG_RESULT($with_expat) -AS_VAR_IF([with_system_expat], [yes], [ +if test "$with_expat" != "none"; then + EXPAT=yes +else + DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} pyexpat" + EXPAT=no +fi +AC_SUBST(EXPAT) + +AS_VAR_IF([with_expat], [system], [ LIBEXPAT_CFLAGS=${LIBEXPAT_CFLAGS-""} LIBEXPAT_LDFLAGS=${LIBEXPAT_LDFLAGS-"-lexpat"} LIBEXPAT_INTERNAL= -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0017-Add-an-option-to-disable-CJK-codecs.patch ================================================ From d8ef6a7a9f2b954cf1c1e37fc3c35055b42af0f5 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 23 Dec 2015 11:49:55 +0100 Subject: [PATCH] Add an option to disable CJK codecs Signed-off-by: Thomas Petazzoni --- configure.ac | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configure.ac b/configure.ac index 201cad0bfc..ecdd7dbc07 100644 --- a/configure.ac +++ b/configure.ac @@ -4188,6 +4188,12 @@ if test "$SQLITE3" = "no" ; then DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} _sqlite3" fi +AC_ARG_ENABLE(codecs-cjk, + AS_HELP_STRING([--disable-codecs-cjk], [disable CJK codecs]), + [ if test "$enableval" = "no"; then + DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} _codecs_kr _codecs_jp _codecs_cn _codecs_tw _codecs_hk _codecs_iso2022" + fi]) + AC_SUBST(TK) AC_ARG_ENABLE(tk, AS_HELP_STRING([--disable-tk], [disable tk]), -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0018-Add-an-option-to-disable-NIS.patch ================================================ From 09fc9f72ebe60bb65e80732a6bd4f12a84159f6d Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 23 Dec 2015 11:50:11 +0100 Subject: [PATCH] Add an option to disable NIS NIS is not necessarily available in uClibc, so we need an option to not compile support for it. Signed-off-by: Thomas Petazzoni --- configure.ac | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configure.ac b/configure.ac index ecdd7dbc07..1bdde7f69d 100644 --- a/configure.ac +++ b/configure.ac @@ -4194,6 +4194,12 @@ AC_ARG_ENABLE(codecs-cjk, DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} _codecs_kr _codecs_jp _codecs_cn _codecs_tw _codecs_hk _codecs_iso2022" fi]) +AC_ARG_ENABLE(nis, + AS_HELP_STRING([--disable-nis], [disable NIS]), + [ if test "$enableval" = "no"; then + DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} nis" + fi]) + AC_SUBST(TK) AC_ARG_ENABLE(tk, AS_HELP_STRING([--disable-tk], [disable tk]), -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0019-Add-an-option-to-disable-unicodedata.patch ================================================ From 4fe7f375a3d171d294caebdd7b7ce49bbc9ad9f3 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 23 Dec 2015 11:50:27 +0100 Subject: [PATCH] Add an option to disable unicodedata Signed-off-by: Thomas Petazzoni --- configure.ac | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configure.ac b/configure.ac index 1bdde7f69d..ba4b0e0c1c 100644 --- a/configure.ac +++ b/configure.ac @@ -4200,6 +4200,12 @@ AC_ARG_ENABLE(nis, DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} nis" fi]) +AC_ARG_ENABLE(unicodedata, + AS_HELP_STRING([--disable-unicodedata], [disable unicodedata]), + [ if test "$enableval" = "no"; then + DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} unicodedata" + fi]) + AC_SUBST(TK) AC_ARG_ENABLE(tk, AS_HELP_STRING([--disable-tk], [disable tk]), -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0020-Add-an-option-to-disable-IDLE.patch ================================================ From 2c9dbd6d49744aa8da8ebf8d0187d6b06f93c2b5 Mon Sep 17 00:00:00 2001 From: Maxime Ripard Date: Wed, 22 Feb 2017 17:45:14 -0800 Subject: [PATCH] Add an option to disable IDLE IDLE is an IDE embedded into python, written using Tk, so it doesn't make much sense to have it into our build. Signed-off-by: Maxime Ripard [ Andrey Smirnov: ported to Python 3.6 ] Signed-off-by: Andrey Smirnov [ Adam Duskett: ported to Python 3.10.0 ] Signed-off-by: Adam Duskett --- Makefile.pre.in | 7 ++++++- configure.ac | 6 ++++++ setup.py | 5 ++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 80d617cf7f..8d1ba1356c 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1862,7 +1862,9 @@ bininstall: altbininstall -rm -f $(DESTDIR)$(LIBPC)/python3-embed.pc (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION)-embed.pc python3-embed.pc) -rm -f $(DESTDIR)$(BINDIR)/idle3 +ifeq (@IDLE@,yes) (cd $(DESTDIR)$(BINDIR); $(LN) -s idle$(VERSION) idle3) +endif -rm -f $(DESTDIR)$(BINDIR)/pydoc3 ifeq (@PYDOC@,yes) (cd $(DESTDIR)$(BINDIR); $(LN) -s pydoc$(VERSION) pydoc3) @@ -1912,7 +1914,6 @@ LIBSUBDIRS= asyncio \ ensurepip ensurepip/_bundled \ html \ http \ - idlelib idlelib/Icons \ importlib importlib/resources importlib/metadata \ json \ logging \ @@ -2030,6 +2031,10 @@ ifeq (@EXPAT@,yes) LIBSUBDIRS += $(XMLLIBSUBDIRS) endif +ifeq (@IDLE@,yes) +LIBSUBDIRS += idlelib idlelib/Icons +endif + TEST_MODULES=@TEST_MODULES@ libinstall: all $(srcdir)/Modules/xxmodule.c @for i in $(SCRIPTDIR) $(LIBDEST); \ diff --git a/configure.ac b/configure.ac index ba4b0e0c1c..5e6d72f7db 100644 --- a/configure.ac +++ b/configure.ac @@ -7137,6 +7137,12 @@ AC_ARG_ENABLE(lib2to3, AS_HELP_STRING([--disable-lib2to3], [disable lib2to3]), [ LIB2TO3="${enableval}" ], [ LIB2TO3=yes ]) +AC_SUBST(IDLE) + +AC_ARG_ENABLE(idle3, + AS_HELP_STRING([--disable-idle3], [disable idle3 IDE]), + [ IDLE="${enableval}" ], [ IDLE=yes ]) + # generate output files AC_CONFIG_FILES(Makefile.pre Misc/python.pc Misc/python-embed.pc Misc/python-config.sh) AC_CONFIG_FILES([Modules/Setup.bootstrap Modules/Setup.stdlib]) diff --git a/setup.py b/setup.py index c490b0b08f..4d49a792f7 100644 --- a/setup.py +++ b/setup.py @@ -1594,11 +1594,14 @@ class DummyProcess: import warnings warnings.filterwarnings("ignore",category=DeprecationWarning) - scripts = ['Tools/scripts/idle3', 'Lib/smtpd.py'] + scripts = [ 'Lib/smtpd.py'] if not '--disable-pydoc' in sysconfig.get_config_var("CONFIG_ARGS"): scripts += [ 'Tools/scripts/pydoc3' ] if not '--disable-lib2to3' in sysconfig.get_config_var("CONFIG_ARGS"): scripts += [ 'Tools/scripts/2to3' ] + if not '--disable-idle3' in sysconfig.get_config_var("CONFIG_ARGS"): + scripts += [ 'Tools/scripts/idle3' ] + setup(# PyPI Metadata (PEP 301) name = "Python", version = sys.version.split()[0], -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0021-Add-an-option-to-disable-decimal.patch ================================================ From 7091fdf77f612425c178a75148560f9c3514e8b8 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 23 Dec 2015 11:51:31 +0100 Subject: [PATCH] Add an option to disable decimal This patch replaces the existing --with-system-libmpdec option with a --with-libmpdec={system,builtin,none} option, which allows to tell Python whether we want to use the system libmpdec (already installed), the libmpdec builtin the Python sources, or no libmpdec at all. Signed-off-by: Thomas Petazzoni [aduskett@gmail.com: Update for python 3.7.0] Signed-off-by: Adam Duskett [james.hilliard1@gmail.com: adapt to python 3.9] Signed-off-by: James Hilliard --- configure.ac | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index 5e6d72f7db..e6b1f1e9de 100644 --- a/configure.ac +++ b/configure.ac @@ -3630,14 +3630,21 @@ fi AC_SUBST(LIBFFI_INCLUDEDIR) # Check for use of the system libmpdec library -AC_MSG_CHECKING(for --with-system-libmpdec) -AC_ARG_WITH(system_libmpdec, - AS_HELP_STRING([--with-system-libmpdec], [build _decimal module using an installed libmpdec library, see Doc/library/decimal.rst (default is no)]), +AC_MSG_CHECKING(for --with-libmpdec) +AC_ARG_WITH(libmpdec, + AS_HELP_STRING([--with-libmpdec], [select which libmpdec version to use: system, builtin, none]), [], - [with_system_libmpdec="no"]) -AC_MSG_RESULT($with_system_libmpdec) + [with_libmpdec="builtin"]) +AC_MSG_RESULT($with_libmpdec) +if test "$with_libmpdec" != "none"; then + MPDEC=yes +else + DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} _decimal" + MPDEC=no +fi +AC_SUBST(MPDEC) -AS_VAR_IF([with_system_libmpdec], [yes], [ +AS_VAR_IF([with_libmpdec], [system], [ LIBMPDEC_CFLAGS=${LIBMPDEC_CFLAGS-""} LIBMPDEC_LDFLAGS=${LIBMPDEC_LDFLAGS-"-lmpdec"} LIBMPDEC_INTERNAL= -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0022-Add-an-option-to-disable-the-ossaudiodev-module.patch ================================================ From d48d9da534cec7891ae444b4ab94a76ac67f5daa Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Wed, 23 Dec 2015 11:51:58 +0100 Subject: [PATCH] Add an option to disable the ossaudiodev module Signed-off-by: Thomas Petazzoni --- configure.ac | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configure.ac b/configure.ac index e6b1f1e9de..db33d567ad 100644 --- a/configure.ac +++ b/configure.ac @@ -3678,6 +3678,12 @@ fi AC_MSG_RESULT($with_decimal_contextvar) +AC_ARG_ENABLE(ossaudiodev, + AS_HELP_STRING([--disable-ossaudiodev], [disable OSSAUDIODEV]), + [ if test "$enableval" = "no"; then + DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} ossaudiodev" + fi]) + # Check for libmpdec machine flavor AC_MSG_CHECKING(for decimal libmpdec machine) AS_CASE([$ac_sys_system], -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0023-Add-an-option-to-disable-openssl-support.patch ================================================ From 25c900e81a2fc0bbe35e7c94e2e5028cfbf6582a Mon Sep 17 00:00:00 2001 From: Nicolas Cavallari Date: Wed, 22 Feb 2017 17:55:59 -0800 Subject: [PATCH] Add an option to disable openssl support. Signed-off-by: Nicolas Cavallari --- configure.ac | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configure.ac b/configure.ac index db33d567ad..42fe6c8f5a 100644 --- a/configure.ac +++ b/configure.ac @@ -4219,6 +4219,12 @@ AC_ARG_ENABLE(unicodedata, DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} unicodedata" fi]) +AC_ARG_ENABLE(openssl, + AS_HELP_STRING([--disable-openssl], [disable openssl support]), + [ if test "$enableval" = "no"; then + DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} ssl _ssl _hashlib" + fi]) + AC_SUBST(TK) AC_ARG_ENABLE(tk, AS_HELP_STRING([--disable-tk], [disable tk]), -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0024-Add-an-option-to-disable-the-readline-module.patch ================================================ From 9082468ca620db77b670ccf568a96bbabb865f80 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Tue, 7 Mar 2017 23:29:05 +0100 Subject: [PATCH] Add an option to disable the readline module Signed-off-by: Thomas Petazzoni --- configure.ac | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configure.ac b/configure.ac index 42fe6c8f5a..19875d7d30 100644 --- a/configure.ac +++ b/configure.ac @@ -4225,6 +4225,12 @@ AC_ARG_ENABLE(openssl, DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} ssl _ssl _hashlib" fi]) +AC_ARG_ENABLE(readline, + AS_HELP_STRING([--disable-readline], [disable readline]), + [ if test "$enableval" = "no"; then + DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} readline" + fi]) + AC_SUBST(TK) AC_ARG_ENABLE(tk, AS_HELP_STRING([--disable-tk], [disable tk]), -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0025-Add-options-to-disable-zlib-bzip2-and-xz-modules.patch ================================================ From 988a335cb34b5fc25ea345ba04ff5ddffe2e946c Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Tue, 7 Mar 2017 23:31:11 +0100 Subject: [PATCH] Add options to disable zlib, bzip2 and xz modules Signed-off-by: Thomas Petazzoni --- configure.ac | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/configure.ac b/configure.ac index 19875d7d30..ca6c16491a 100644 --- a/configure.ac +++ b/configure.ac @@ -4231,6 +4231,24 @@ AC_ARG_ENABLE(readline, DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} readline" fi]) +AC_ARG_ENABLE(bzip2, + AS_HELP_STRING([--disable-bzip2], [disable bzip2]), + [ if test "$enableval" = "no"; then + DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} _bz2" + fi]) + +AC_ARG_ENABLE(zlib, + AS_HELP_STRING([--disable-zlib], [disable zlib]), + [ if test "$enableval" = "no"; then + DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} zlib" + fi]) + +AC_ARG_ENABLE(xz, + AS_HELP_STRING([--disable-xz], [disable xz]), + [ if test "$enableval" = "no"; then + DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} _lzma" + fi]) + AC_SUBST(TK) AC_ARG_ENABLE(tk, AS_HELP_STRING([--disable-tk], [disable tk]), -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0026-python-config.sh-don-t-reassign-prefix.patch ================================================ From 755fb526a62df2a73560f42184db8aadb6899bb0 Mon Sep 17 00:00:00 2001 From: Matt Weber Date: Fri, 6 Oct 2017 09:54:15 -0500 Subject: [PATCH] python-config.sh: don't reassign ${prefix} When prefix is set to a path like /usr during crossbuild the sed operations end up executing twice, once for the prefix reassignment and another for includedir if it is set as a string including the ${prefix} variable. This results in an issue when the build directory is under /usr. This patch updates the remaining location which uses the prefix variable to also sed and update to use the real path. Upstream bug report: https://bugs.python.org/issue31713 Buildroot bug: https://bugs.busybox.net/show_bug.cgi?id=10361 Fixes failures like the following: dbus-python-1.2.4 | NOK | http://autobuild.buildroot.net/results/758858efa97b6273c1b470513f5492258a6d8853 Signed-off-by: Matthew Weber --- Misc/python-config.sh.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Misc/python-config.sh.in b/Misc/python-config.sh.in index a1bc3cd5f7..164d2d3603 100644 --- a/Misc/python-config.sh.in +++ b/Misc/python-config.sh.in @@ -31,7 +31,7 @@ prefix_real=$(installed_prefix "$0") # locations. Keep prefix & exec_prefix using their original values in case # they are referenced in other configure variables, to prevent double # substitution, issue #22140. -prefix=$(echo "$prefix_build" | sed "s#^$prefix_build#$prefix_real#") +prefix=$prefix_build exec_prefix=$(echo "$exec_prefix_build" | sed "s#^$exec_prefix_build#$prefix_real#") exec_prefix_real=${prefix_real} includedir=$(echo "@includedir@" | sed "s#^$prefix_build#$prefix_real#") @@ -49,7 +49,7 @@ LDLIBRARY="@LDLIBRARY@" OPT="@OPT@" PY_ENABLE_SHARED="@PY_ENABLE_SHARED@" LDVERSION="@LDVERSION@" -LIBDEST=${prefix_real}/lib/python${VERSION} +LIBDEST=$( echo "${prefix}/lib/python${VERSION}" | sed "s#^$prefix_build#$prefix_real#") LIBPL=$(echo "@LIBPL@" | sed "s#^$prefix_build#$prefix_real#") SO="@EXT_SUFFIX@" PYTHONFRAMEWORK="@PYTHONFRAMEWORK@" -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0027-Add-an-option-to-disable-uuid-module.patch ================================================ From 58027d25c3cabcf654cb0b31a61d7cbd53dc68c0 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Sat, 18 Aug 2018 10:54:56 +0200 Subject: [PATCH] Add an option to disable uuid module Signed-off-by: Thomas Petazzoni --- configure.ac | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/configure.ac b/configure.ac index ca6c16491a..ed03b27fb1 100644 --- a/configure.ac +++ b/configure.ac @@ -4267,6 +4267,15 @@ if test "$CURSES" = "no"; then DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} _curses _curses_panel" fi +AC_SUBST(UUID) +AC_ARG_ENABLE(uuid, + AS_HELP_STRING([--disable-uuid], [disable uuid]), + [ UUID="${enableval}" ], [ UUID=yes ]) + +if test "$UUID" = "no"; then + DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} _uuid" +fi + AC_SUBST(PYDOC) AC_ARG_ENABLE(pydoc, -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0029-configure.ac-fixup-CC-print-multiarch-output-for-mus.patch ================================================ From 07b950aadd570b9f96a1f128505a959b32f40962 Mon Sep 17 00:00:00 2001 From: Peter Korsgaard Date: Fri, 2 Aug 2019 15:53:16 +0200 Subject: [PATCH] configure.ac: fixup $CC --print-multiarch output for musl/uclibc GCC 8+ toolchains GCC commit 6834b83784dcf0364eb820e8 (multiarch support for non-glibc linux systems), which is part of GCC 8+, changed the multiarch logic to use $arch-linux-musl / $arch-linux-uclibc rather than $arch-linux-gnu. This then causes the python3 configure script to error out: checking for the platform triplet based on compiler characteristics... powerpc-linux-gnu configure: error: internal configure error for the platform triplet, please file a bug report http://autobuild.buildroot.net/results/cb4/cb49c539501342e45cbe5ade82e588fcdf51f05b As it requires that the --print-multiarch output (if not empty) matches the deduced triplet (which always uses -linux-gnu). It isn't quite clear why --print-multiarch returns something for a non-multiarch toolchain on some architectures (E.G. PowerPC), but as a workaround, rewrite the --print-multiarch output to match older GCC versions to keep the configure script happy. Signed-off-by: Peter Korsgaard [Peter: updated for 3.10.2] --- configure.ac | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index ed03b27fb1..841fd6732c 100644 --- a/configure.ac +++ b/configure.ac @@ -1086,7 +1086,11 @@ AC_MSG_CHECKING([for multiarch]) AS_CASE([$ac_sys_system], [Darwin*], [MULTIARCH=""], [FreeBSD*], [MULTIARCH=""], - [MULTIARCH=$($CC --print-multiarch 2>/dev/null)] + [ + # GCC 8+ returns $arch-linux-{musl,uclibc} for musl/uClibc based + # toolchains confusing python. Fix that up + MULTIARCH=$($CC --print-multiarch 2>/dev/null | sed -E 's/-linux-(musl|uclibc)*$/-linux-gnu/') + ] ) AC_SUBST([MULTIARCH]) AC_MSG_RESULT([$MULTIARCH]) -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0030-Add-an-option-to-disable-the-berkeleydb-module.patch ================================================ From 67e9793d070ac5c8e83abbe95b9208533ffeadd0 Mon Sep 17 00:00:00 2001 From: Bernd Kuhls Date: Sat, 11 Apr 2020 22:01:40 +0200 Subject: [PATCH] Add an option to disable the berkeleydb module Signed-off-by: Bernd Kuhls --- configure.ac | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configure.ac b/configure.ac index 841fd6732c..06c9a81f95 100644 --- a/configure.ac +++ b/configure.ac @@ -4280,6 +4280,12 @@ if test "$UUID" = "no"; then DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} _uuid" fi +AC_ARG_ENABLE(berkeleydb, + AS_HELP_STRING([--disable-berkeleydb], [disable berkeleydb]), + [ if test "$enableval" = "no"; then + DISABLED_EXTENSIONS="${DISABLED_EXTENSIONS} _dbm" + fi]) + AC_SUBST(PYDOC) AC_ARG_ENABLE(pydoc, -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/0031-lib-crypt-uClibc-ng-doesn-t-set-errno-when-encryptio.patch ================================================ From 3edeed879871a10acbe802f4a68cff3d4869dbde Mon Sep 17 00:00:00 2001 From: Romain Naour Date: Thu, 12 Nov 2020 00:16:18 +0100 Subject: [PATCH] lib/crypt: uClibc-ng doesn't set errno when encryption method is not available Since commit [1] in cpython, an exception is raised when an encryption method is not available. This eception is handled only if errno is set to EINVAL by crypt() but uClibc-ng doesn't set errno in crypt() [2]. Fixes: https://gitlab.com/buildroot.org/buildroot/-/jobs/830981961 https://gitlab.com/buildroot.org/buildroot/-/jobs/830981979 [1] https://github.com/python/cpython/commit/0d3fe8ae4961bf551e7d5e42559e2ede1a08fd7c [2] https://cgit.uclibc-ng.org/cgi/cgit/uclibc-ng.git/tree/libcrypt/crypt.c?h=v1.0.36#n29 Signed-off-by: Romain Naour [Daniel: updated for 3.10.7] Signed-off-by: Daniel Lang --- Lib/crypt.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lib/crypt.py b/Lib/crypt.py index de4a14a388..ba482487a7 100644 --- a/Lib/crypt.py +++ b/Lib/crypt.py @@ -98,7 +98,9 @@ def _add_method(name, *args, rounds=None): result = crypt('', salt) except OSError as e: # Not all libc libraries support all encryption methods. - if e.errno in {errno.EINVAL, errno.EPERM, errno.ENOSYS}: + # Not all libc libraries set errno when encryption method is not + # available. + if e.errno in {errno.EINVAL, errno.EPERM, errno.ENOSYS} or e.errno == 0: return False raise if result and len(result) == method.total_size: -- 2.34.1 ================================================ FILE: packages/lang/Python3/patches/Python3-0000-default-is-optimized.patch ================================================ Refreshed MilhouseVH patch from Python3.7. Original message: Do *not* enable Py_OptimizeFlag=2 (or higher) as this will stop __doc__ output from being generated which will prevent the qemu package for Generic from building. --- diff -aur a/Python/initconfig.c b/Python/initconfig.c --- a/Python/initconfig.c 2020-07-20 09:01:32.000000000 -0400 +++ b/Python/initconfig.c 2020-08-08 03:24:02.796189739 -0400 @@ -153,7 +153,7 @@ int Py_QuietFlag = 0; /* Needed by sysmodule.c */ int Py_InteractiveFlag = 0; /* Needed by Py_FdIsInteractive() below */ int Py_InspectFlag = 0; /* Needed to determine whether to exit at SystemExit */ -int Py_OptimizeFlag = 0; /* Needed by compile.c */ +int Py_OptimizeFlag = 1; /* Needed by compile.c */ int Py_NoSiteFlag = 0; /* Suppress 'import site' */ int Py_BytesWarningFlag = 0; /* Warn on str(bytes) and str(buffer) */ int Py_FrozenFlag = 0; /* Needed by getpath.c */ ================================================ FILE: packages/lang/Python3/patches/Python3-0201-xcompile.patch ================================================ --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -633,9 +633,11 @@ sharedmods: $(BUILDPYTHON) pybuilddir.tx *) quiet="";; \ esac; \ echo "$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \ + PYTHONXCPREFIX='$(DESTDIR)$(prefix)' \ DISABLED_EXTENSIONS="$(DISABLED_EXTENSIONS)" \ $(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build"; \ $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \ + PYTHONXCPREFIX='$(DESTDIR)$(prefix)' \ $(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build @@ -1750,8 +1752,10 @@ libainstall: @DEF_MAKE_RULE@ python-conf # Install the dynamically loadable modules # This goes into $(exec_prefix) sharedinstall: all + CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \ $(RUNSHARED) DISABLED_EXTENSIONS="$(DISABLED_EXTENSIONS)" \ $(PYTHON_FOR_BUILD) $(srcdir)/setup.py install \ + --skip-build \ --prefix=$(prefix) \ --install-scripts=$(BINDIR) \ --install-platlib=$(DESTSHARED) \ --- a/setup.py +++ b/setup.py @@ -61,7 +61,7 @@ def get_platform(): return sys.platform -CROSS_COMPILING = ("_PYTHON_HOST_PLATFORM" in os.environ) +CROSS_COMPILING = ("_PYTHON_HOST_PLATFORM" in os.environ) or ('PYTHONXCPREFIX' in os.environ) HOST_PLATFORM = get_platform() MS_WINDOWS = (HOST_PLATFORM == 'win32') CYGWIN = (HOST_PLATFORM == 'cygwin') @@ -575,6 +575,13 @@ class PyBuildExt(build_ext): ext.name, level=1) return + # Import check will not work when cross-compiling. + if 'PYTHONXCPREFIX' in os.environ: + self.announce( + 'WARNING: skipping import check for cross-compiled: "%s"' % + ext.name) + return + # Workaround for Mac OS X: The Carbon-based modules cannot be # reliably imported into a command-line Python if 'Carbon' in ext.extra_link_args: ================================================ FILE: packages/lang/Python3/patches/Python3-0202-xcompile.patch ================================================ --- a/setup.py +++ b/setup.py @@ -742,31 +742,23 @@ class PyBuildExt(build_ext): add_dir_to_list(dir_list, directory) def configure_compiler(self): - # Ensure that /usr/local is always used, but the local build - # directories (i.e. '.' and 'Include') must be first. See issue - # 10520. - if not CROSS_COMPILING: - add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') - add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + try: + modules_include_dirs = os.environ["PYTHON_MODULES_INCLUDE"].split() + except KeyError: + modules_include_dirs = ['/usr/include'] + try: + modules_lib_dirs = os.environ["PYTHON_MODULES_LIB"].split() + except KeyError: + modules_lib_dirs = ['/usr/lib'] self.add_multiarch_paths() - # only change this for cross builds for 3.3, issues on Mageia - if CROSS_COMPILING: - self.add_cross_compiling_paths() + for dir in modules_include_dirs: + add_dir_to_list(self.compiler.include_dirs, dir) + for dir in modules_lib_dirs: + add_dir_to_list(self.compiler.library_dirs, dir) + self.add_ldflags_cppflags() def init_inc_lib_dirs(self): - if (not CROSS_COMPILING and - os.path.normpath(sys.base_prefix) != '/usr' and - not sysconfig.get_config_var('PYTHONFRAMEWORK')): - # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework - # (PYTHONFRAMEWORK is set) to avoid # linking problems when - # building a framework with different architectures than - # the one that is currently installed (issue #7473) - add_dir_to_list(self.compiler.library_dirs, - sysconfig.get_config_var("LIBDIR")) - add_dir_to_list(self.compiler.include_dirs, - sysconfig.get_config_var("INCLUDEDIR")) - system_lib_dirs = ['/lib64', '/usr/lib64', '/lib', '/usr/lib'] system_include_dirs = ['/usr/include'] # lib_dirs and inc_dirs are used to search for files; ================================================ FILE: packages/lang/Python3/patches/Python3-0300-generate-legacy-pyc-bytecode.patch ================================================ From dc39d0d93427a92c387e3c1944368d7f08299c06 Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Sun, 20 Oct 2019 02:32:03 +0100 Subject: [PATCH] Always generate legacy bytecode (allows removal of py source code) We want to create compiled bytecode for modules in the read-only squashfs, and we also want to avoid distributing the py source code which is a waste of space. Unfortunately, after PEP3147, it's no longer possible to distribute pyc bytecode without the corresponding py source code unless the bytecode is generated using the "legacy" layout (ie. not using __pycache__). Since all packages process their Python source code in different ways, but ultimately all compile it via a call to py_compile.compile(), the easiest solution is to patch py_compile.compile() so that it only generates legacy bytecode. https://www.python.org/dev/peps/pep-3147/#case-4-legacy-pyc-files-and-source-less-imports --- Lib/py_compile.py | 4 ++++ 1 file changed, 4 insertions(+) --- a/Lib/py_compile.py +++ b/Lib/py_compile.py @@ -121,6 +121,10 @@ def compile(file, cfile=None, dfile=None the resulting file would be regular and thus not the same type of file as it was previously. """ + + if cfile: + cfile = file + 'c' + if invalidation_mode is None: invalidation_mode = _get_default_invalidation_mode() if cfile is None: ================================================ FILE: packages/lang/Python3/patches/Python3-0400-fix-bpo5537.patch ================================================ From 7c35472bc734876f940fdc71090ad3d526e95a82 Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Fri, 14 Feb 2020 01:33:34 +0000 Subject: [PATCH] Fix issue 5537 - regression on 32-bit https://bugs.python.org/issue5537 https://forum.kodi.tv/showthread.php?tid=343068&pid=2923934#pid2923934 --- Lib/http/cookiejar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -99,7 +99,7 @@ def time2isoz(t=None): if t is None: dt = datetime.datetime.utcnow() else: - dt = datetime.datetime.utcfromtimestamp(t) + dt = datetime.datetime(1970, 1, 1) + datetime.timedelta(seconds=t) return "%04d-%02d-%02d %02d:%02d:%02dZ" % ( dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second) ================================================ FILE: packages/lang/Python3/patches/arm/Python3-0001-fix_platform_machine_func_for_32bit_userspace.patch ================================================ From 6689a2fe3dc4ba422078c79c480aff30dc8c3bfd Mon Sep 17 00:00:00 2001 From: Raybuntu <57228613+Raybuntu@users.noreply.github.com> Date: Sat, 19 Dec 2020 11:05:04 +0100 Subject: [PATCH] platform.py: Set correct machine value when kernel is aarch64 but userspace is aarch32. --- Lib/platform.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Lib/platform.py b/Lib/platform.py index 994d892c5e..b8150a6070 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -875,6 +875,10 @@ def uname(): system = 'Windows' release = 'Vista' + + if machine == 'aarch64' and sys.maxsize <= 2**32: + machine = 'armv7l' + vals = system, node, release, version, machine # Replace 'unknown' values with the more portable '' _uname_cache = uname_result(*map(_unknown_as_blank, vals)) -- 2.20.1 ================================================ FILE: packages/lang/gcc/package.mk ================================================ # 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) PKG_NAME="gcc" PKG_VERSION="12.2.0" PKG_SHA256="e549cf9cf3594a00e27b6589d4322d70e0720cdd213f39beb4181e06926230ff" PKG_LICENSE="GPL-2.0-or-later" PKG_SITE="https://gcc.gnu.org/" PKG_URL="https://ftpmirror.gnu.org/gcc/${PKG_NAME}-${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_BOOTSTRAP="ccache:host autoconf:host binutils:host gmp:host mpfr:host mpc:host zstd:host" PKG_DEPENDS_TARGET="toolchain" PKG_DEPENDS_HOST="ccache:host autoconf:host binutils:host gmp:host mpfr:host mpc:host zstd:host glibc" PKG_DEPENDS_INIT="toolchain" PKG_LONGDESC="This package contains the GNU Compiler Collection." if [ "${MOLD_SUPPORT}" = "yes" ]; then PKG_DEPENDS_HOST+=" mold:host" fi case ${TARGET_ARCH} in arm|riscv64) OPTS_LIBATOMIC="--enable-libatomic" ;; *) OPTS_LIBATOMIC="--disable-libatomic" ;; esac GCC_COMMON_CONFIGURE_OPTS="--target=${TARGET_NAME} \ --with-sysroot=${SYSROOT_PREFIX} \ --with-gmp=${TOOLCHAIN} \ --with-mpfr=${TOOLCHAIN} \ --with-mpc=${TOOLCHAIN} \ --with-zstd=${TOOLCHAIN} \ --with-gnu-as \ --with-gnu-ld \ --enable-plugin \ --enable-lto \ --enable-gold \ --enable-ld=default \ --with-linker-hash-style=gnu \ --disable-multilib \ --disable-nls \ --enable-checking=release \ --without-ppl \ --without-cloog \ --disable-libada \ --disable-libmudflap \ --disable-libitm \ --disable-libquadmath \ --disable-libmpx \ --disable-libssp \ --enable-__cxa_atexit" PKG_CONFIGURE_OPTS_BOOTSTRAP="${GCC_COMMON_CONFIGURE_OPTS} \ --enable-cloog-backend=isl \ --disable-decimal-float \ --disable-gcov \ --enable-languages=c \ --disable-libatomic \ --disable-libgomp \ --disable-libsanitizer \ --disable-shared \ --disable-libgomp \ --disable-threads \ --without-headers \ --with-newlib \ ${TARGET_ARCH_GCC_OPTS}" PKG_CONFIGURE_OPTS_HOST="${GCC_COMMON_CONFIGURE_OPTS} \ --enable-languages=c,c++ \ ${OPTS_LIBATOMIC} \ --enable-decimal-float \ --enable-tls \ --enable-shared \ --disable-static \ --enable-long-long \ --enable-threads=posix \ --disable-libstdcxx-pch \ --enable-libstdcxx-time \ --enable-clocale=gnu \ ${TARGET_ARCH_GCC_OPTS}" post_makeinstall_bootstrap() { GCC_VERSION=$(${TOOLCHAIN}/bin/${TARGET_NAME}-gcc -dumpversion) DATE="0401$(echo ${GCC_VERSION} | sed 's/\./0/g')" CROSS_CC=${TARGET_PREFIX}gcc-${GCC_VERSION} rm -f ${TARGET_PREFIX}gcc cat > ${TARGET_PREFIX}gcc < ${TARGET_PREFIX}gcc < ${TARGET_PREFIX}g++ < Date: Thu, 24 Apr 2014 22:33:27 +0300 Subject: [PATCH] allow newer autoconf --- config/override.m4 | 9 --------- 1 files changed, 0 insertions(+), 9 deletions(-) diff --git a/config/override.m4 b/config/override.m4 index 52bd1c3..6c39656 100644 --- a/config/override.m4 +++ b/config/override.m4 @@ -38,15 +38,6 @@ dnl m4_define([_GCC_AUTOCONF_VERSION], [X.Y]) dnl in configure.ac before AC_INIT, dnl without rewriting this file. dnl Or for updating the whole tree at once with the definition above. -AC_DEFUN([_GCC_AUTOCONF_VERSION_CHECK], -[m4_if(m4_defn([_GCC_AUTOCONF_VERSION]), - m4_defn([m4_PACKAGE_VERSION]), [], - [m4_fatal([Please use exactly Autoconf ]_GCC_AUTOCONF_VERSION[ instead of ]m4_defn([m4_PACKAGE_VERSION])[.])]) -]) -m4_define([AC_INIT], m4_defn([AC_INIT])[ -_GCC_AUTOCONF_VERSION_CHECK -]) - dnl Ensure we do not use a buggy M4. m4_if(m4_index([..wi.d.], [.d.]), [-1], -- 1.7.2.5 ================================================ FILE: packages/lang/gcc/patches/gcc-crosscompile-badness.patch ================================================ Index: gcc-4.4+svnr145550/gcc/incpath.cc =================================================================== --- gcc-4.4+svnr145550.orig/gcc/incpath.cc 2009-04-04 13:48:31.000000000 -0700 +++ gcc-4.4+svnr145550/gcc/incpath.cc 2009-04-04 14:49:29.000000000 -0700 @@ -417,6 +417,26 @@ p->construct = 0; p->user_supplied_p = user_supplied_p; + /* A common error when cross compiling is including + host headers. This code below will try to fail fast + for cross compiling. Currently we consider /usr/include, + /opt/include and /sw/include as harmful. */ + + { + /* printf("Adding Path: %s\n", p->name ); */ + if( strstr(p->name, "/usr/include" ) == p->name ) { + fprintf(stderr, _("CROSS COMPILE Badness: /usr/include in INCLUDEPATH: %s\n"), p->name); + abort(); + } else if( strstr(p->name, "/sw/include") == p->name ) { + fprintf(stderr, _("CROSS COMPILE Badness: /sw/include in INCLUDEPATH: %s\n"), p->name); + abort(); + } else if( strstr(p->name, "/opt/include") == p->name ) { + fprintf(stderr, _("CROSS COMPILE Badness: /opt/include in INCLUDEPATH: %s\n"), p->name); + abort(); + } + } + + add_cpp_dir_path (p, chain); } ================================================ FILE: packages/lang/gcc-aarch64/package.mk ================================================ # 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) PKG_NAME="gcc-aarch64" PKG_VERSION="$(get_pkg_version gcc)" PKG_LICENSE="GPL-2.0-or-later" PKG_URL="" PKG_DEPENDS_HOST="toolchain:host ccache:host autoconf:host binutils-aarch64:host gmp:host mpfr:host mpc:host zstd:host" PKG_LONGDESC="This package contains the GNU Compiler Collection for 64-bit ARM." PKG_DEPENDS_UNPACK+=" gcc" PKG_PATCH_DIRS+=" $(get_pkg_directory gcc)/patches" if [ "${MOLD_SUPPORT}" = "yes" ]; then PKG_DEPENDS_HOST+=" mold:host" fi PKG_CONFIGURE_OPTS_HOST="--target=aarch64-none-elf \ --with-sysroot=${SYSROOT_PREFIX} \ --with-gmp=${TOOLCHAIN} \ --with-mpfr=${TOOLCHAIN} \ --with-mpc=${TOOLCHAIN} \ --with-zstd=${TOOLCHAIN} \ --with-gnu-as \ --with-gnu-ld \ --with-newlib \ --without-ppl \ --without-headers \ --without-cloog \ --enable-__cxa_atexit \ --enable-checking=release \ --enable-gold \ --enable-languages=c \ --enable-ld=default \ --enable-lto \ --enable-plugin \ --enable-static \ --disable-decimal-float \ --disable-gcov \ --disable-libada \ --disable-libatomic \ --disable-libgomp \ --disable-libitm \ --disable-libmpx \ --disable-libmudflap \ --disable-libquadmath \ --disable-libquadmath-support \ --disable-libsanitizer \ --disable-libssp \ --disable-multilib \ --disable-nls \ --disable-shared \ --disable-threads" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/gcc/gcc-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_makeinstall_host() { PKG_GCC_PREFIX="${TOOLCHAIN}/bin/aarch64-none-elf-" GCC_VERSION=$(${PKG_GCC_PREFIX}gcc -dumpversion) DATE="0501$(echo ${GCC_VERSION} | sed 's/\./0/g')" CROSS_CC=${PKG_GCC_PREFIX}gcc-${GCC_VERSION} rm -f ${PKG_GCC_PREFIX}gcc cat > ${PKG_GCC_PREFIX}gcc < ${PKG_GCC_PREFIX}gcc < ${PKG_GCC_PREFIX}gcc < ${INSTALL}/etc/ld.so.conf.d/pulseaudio.conf echo /usr/lib/pulseaudio >> ${INSTALL}/etc/ld.so.conf.d/pulseaudio.conf } ================================================ FILE: packages/lib32/audio/lib32-libsndfile/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-libsndfile" PKG_VERSION="$(get_pkg_version libsndfile)" PKG_NEED_UNPACK="$(get_pkg_directory libsndfile)" PKG_ARCH="aarch64" PKG_LICENSE="LGPL-2.1-or-later" PKG_SITE="https://libsndfile.github.io/libsndfile/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-alsa-lib lib32-flac lib32-libogg lib32-libvorbis lib32-opus" PKG_PATCH_DIRS+=" $(get_pkg_directory libsndfile)/patches" PKG_LONGDESC="A C library for reading and writing sound files containing sampled audio data." PKG_BUILD_FLAGS="lib32 +pic" # As per notes in configure.ac: # One or more of the external libraries (ie libflac, libogg, libvorbis and libopus) # is either missing ... Unfortunately, for ease of maintenance, the external libs # are an all or nothing affair. # So all of flac, libogg, libvorbis, opus are required. PKG_CMAKE_OPTS_TARGET="-DBUILD_PROGRAMS=OFF \ -DBUILD_EXAMPLES=OFF \ -DBUILD_REGTEST=OFF \ -DBUILD_TESTING=OFF \ -DBUILD_SHARED_LIBS=ON \ -DENABLE_EXTERNAL_LIBS=ON \ -DINSTALL_MANPAGES=OFF \ -DINSTALL_PKGCONFIG_MODULE=ON" unpack() { ${SCRIPTS}/get libsndfile mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libsndfile/libsndfile-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/audio/lib32-libvorbis/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-libvorbis" PKG_VERSION="$(get_pkg_version libvorbis)" PKG_NEED_UNPACK="$(get_pkg_directory libvorbis)" PKG_ARCH="aarch64" PKG_LICENSE="BSD" PKG_SITE="http://www.vorbis.com/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-libogg" PKG_PATCH_DIRS+=" $(get_pkg_directory libvorbis)/patches" PKG_LONGDESC="Lossless audio compression tools using the ogg-vorbis algorithms." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="lib32 +pic" PKG_CONFIGURE_OPTS_TARGET="--enable-shared \ --disable-static \ --with-ogg=${LIB32_SYSROOT_PREFIX}/usr \ --disable-docs \ --disable-examples \ --disable-oggtest" unpack() { ${SCRIPTS}/get libvorbis mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libvorbis/libvorbis-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include safe_remove ${INSTALL}/usr/share mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/audio/lib32-libvorbisidec/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-libvorbisidec" PKG_VERSION="$(get_pkg_version libvorbisidec)" PKG_NEED_UNPACK="$(get_pkg_directory libvorbisidec)" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/sezero/tremor" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-libogg lib32-freetype" PKG_PATCH_DIRS+=" $(get_pkg_directory libvorbisidec)/patches" PKG_LONGDESC="libvorbisidec" PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="lib32" unpack() { ${SCRIPTS}/get libvorbisidec mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libvorbisidec/libvorbisidec-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } configure_target() { cd ${PKG_BUILD} ./autogen.sh HAVE_OGG=no --disable-mmx --prefix=/usr --datadir=/usr/share --datarootdir=/usr/share --host=${TARGET_NAME} --enable-fb --enable-freetype --with-freetype-prefix=${SYSROOT_PREFIX}/usr --enable-slang } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/audio/lib32-mpg123-compat/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-2022 5schatten (https://github.com/5schatten) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-mpg123-compat" PKG_VERSION="$(get_pkg_version mpg123-compat)" PKG_NEED_UNPACK="$(get_pkg_directory mpg123-compat)" PKG_ARCH="aarch64" PKG_LICENSE="LGPLv2" PKG_SITE="http://www.mpg123.org/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-alsa-lib lib32-SDL2" PKG_PATCH_DIRS+=" $(get_pkg_directory mpg123-compat)/patches" PKG_LONGDESC="A console based real time MPEG Audio Player for Layer 1, 2 and 3." PKG_BUILD_FLAGS="lib32 -fpic" if [ "${PULSEAUDIO_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" lib32-libpulse" PKG_CONFIGURE_OPTS_TARGET="--with-default-audio=pulse --with-audio=alsa,pulse" else PKG_CONFIGURE_OPTS_TARGET="--with-default-audio=alsa --with-audio=alsa" fi unpack() { ${SCRIPTS}/get mpg123-compat mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/mpg123-compat/mpg123-compat-${PKG_VERSION}.tar.bz2 -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/audio/lib32-openal-soft/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-openal-soft" PKG_VERSION="$(get_pkg_version openal-soft)" PKG_NEED_UNPACK="$(get_pkg_directory openal-soft)" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="http://www.openal.org/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-alsa-lib" PKG_PATCH_DIRS+=" $(get_pkg_directory openal-soft)/patches" PKG_LONGDESC="OpenAL Soft is a software implementation of the OpenAL 3D audio API." PKG_BUILD_FLAGS="lib32" PKG_CMAKE_OPTS_TARGET="-DALSOFT_BACKEND_OSS=off \ -DALSOFT_BACKEND_PULSEAUDIO=off \ -DALSOFT_BACKEND_WAVE=off \ -DALSOFT_EXAMPLES=off \ -DALSOFT_UTILS=off" unpack() { ${SCRIPTS}/get openal-soft mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/openal-soft/openal-soft-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include safe_remove ${INSTALL}/usr/share mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/audio/lib32-opus/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji PKG_NAME="lib32-opus" PKG_VERSION="$(get_pkg_version opus)" PKG_NEED_UNPACK="$(get_pkg_directory opus)" PKG_ARCH="aarch64" PKG_LICENSE="BSD" PKG_SITE="http://www.opus-codec.org" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_PATCH_DIRS+=" $(get_pkg_directory opus)/patches" PKG_LONGDESC="Codec designed for interactive speech and audio transmission over the Internet." PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="lib32 +pic" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared \ --enable-fixed-point" unpack() { ${SCRIPTS}/get opus mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/opus/opus-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include safe_remove ${INSTALL}/usr/share mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/audio/lib32-opusfile/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-opusfile" PKG_VERSION="$(get_pkg_version opusfile)" PKG_NEED_UNPACK="$(get_pkg_directory opusfile)" PKG_ARCH="aarch64" PKG_SITE="https://github.com/xiph/opusfile" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-openssl lib32-opus lib32-libogg" PKG_PATCH_DIRS+=" $(get_pkg_directory opusfile)/patches" PKG_SHORTDESC="Stand-alone decoder library for .opus streams" PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="lib32" unpack() { ${SCRIPTS}/get opusfile mkdir -p ${PKG_BUILD} tar cf - -C ${SOURCES}/opusfile/opusfile-${PKG_VERSION} ${PKG_TAR_COPY_OPTS} . | tar xf - -C ${PKG_BUILD} } pre_configure_target() { ${PKG_BUILD}/autogen.sh } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/compress/lib32-bzip2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-bzip2" PKG_VERSION="$(get_pkg_version bzip2)" PKG_NEED_UNPACK="$(get_pkg_directory bzip2)" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="https://sourceware.org/bzip2/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_PATCH_DIRS+=" $(get_pkg_directory bzip2)/patches" PKG_LONGDESC="A high-quality bzip2 data compressor." PKG_BUILD_FLAGS="lib32 +pic +pic:host" unpack() { ${SCRIPTS}/get bzip2 mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/bzip2/bzip2-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } pre_build_target() { mkdir -p ${PKG_BUILD}/.${TARGET_NAME} cp -r ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME} } pre_make_target() { cd ${PKG_BUILD}/.${TARGET_NAME} sed -e "s,ln -s (lib.*),ln -snf \$${1}; ln -snf libbz2.so.${PKG_VERSION} libbz2.so,g" -i Makefile-libbz2_so } make_target() { make -f Makefile-libbz2_so CC=${CC} CFLAGS="${CFLAGS}" } post_make_target() { ln -snf libbz2.so.1.0 libbz2.so } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/include cp bzlib.h ${SYSROOT_PREFIX}/usr/include mkdir -p ${SYSROOT_PREFIX}/usr/lib cp -P libbz2.so* ${SYSROOT_PREFIX}/usr/lib mkdir -p ${INSTALL}/usr/lib32 cp -P libbz2.so* ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/compress/lib32-libzip/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-2022 Team CoreELEC (https://coreelec.org) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-libzip" PKG_VERSION="$(get_pkg_version libzip)" PKG_NEED_UNPACK="$(get_pkg_directory libzip)" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="http://www.nih.at/libzip/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-zlib lib32-zstd" PKG_PATCH_DIRS+=" $(get_pkg_directory libzip)/patches" PKG_LONGDESC="A C library for reading, creating, and modifying zip archives." PKG_BUILD_FLAGS="lib32" unpack() { ${SCRIPTS}/get libzip mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libzip/libzip-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/compress/lib32-zlib/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-zlib" PKG_VERSION="$(get_pkg_version zlib)" PKG_NEED_UNPACK="$(get_pkg_directory zlib)" PKG_ARCH="aarch64" PKG_LICENSE="OSS" PKG_SITE="http://www.zlib.net" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain zlib" PKG_LONGDESC="A general purpose (ZIP) data compression library." PKG_TOOLCHAIN="cmake-make" PKG_PATCH_DIRS+=" $(get_pkg_directory zlib)/patches" PKG_BUILD_FLAGS="lib32" PKG_CMAKE_OPTS_TARGET="-DINSTALL_PKGCONFIG_DIR=/usr/lib/pkgconfig" unpack() { ${SCRIPTS}/get zlib mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/zlib/zlib-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/compress/lib32-zstd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-2022 Team CoreELEC (https://coreelec.org) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-zstd" PKG_VERSION="$(get_pkg_version zstd)" PKG_NEED_UNPACK="$(get_pkg_directory zstd)" PKG_ARCH="aarch64" PKG_LICENSE="BSD/GPLv2" PKG_SITE="http://www.zstd.net" PKG_URL="" PKG_PATCH_DIRS+=" $(get_pkg_directory zstd)/patches" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_LONGDESC="A fast real-time compression algorithm." PKG_TOOLCHAIN="meson" PKG_BUILD_FLAGS="lib32" configure_package() { PKG_MESON_SCRIPT="${PKG_BUILD}/build/meson/meson.build" } unpack() { ${SCRIPTS}/get zstd mkdir -p ${PKG_BUILD} tar -I zstd --strip-components=1 -xf ${SOURCES}/zstd/zstd-${PKG_VERSION}.tar.zst -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/devel/lib32-binutils/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-binutils" PKG_VERSION="$(get_pkg_version binutils)" PKG_NEED_UNPACK="$(get_pkg_directory binutils)" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_URL="" PKG_DEPENDS_HOST="ccache:host bison:host flex:host lib32-linux-headers" PKG_DEPENDS_TARGET="lib32-toolchain binutils" PKG_LONGDESC="A GNU collection of binary utilities for multilib ARM." PKG_PATCH_DIRS+=" $(get_pkg_directory binutils)/patches" PKG_CONFIGURE_OPTS_HOST="--target=${LIB32_TARGET_NAME} \ --with-sysroot=${LIB32_SYSROOT_PREFIX} \ --with-lib-path=${LIB32_SYSROOT_PREFIX}/lib:${LIB32_SYSROOT_PREFIX}/usr/lib \ --without-ppl \ --enable-static \ --without-cloog \ --disable-werror \ --disable-multilib \ --disable-libada \ --disable-libssp \ --enable-version-specific-runtime-libs \ --enable-plugins \ --enable-gold \ --enable-ld=default \ --enable-lto \ --disable-nls" unpack() { ${SCRIPTS}/get binutils mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/binutils/binutils-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } pre_configure_host() { unset CPPFLAGS unset CFLAGS unset CXXFLAGS unset LDFLAGS } make_host() { make configure-host make MAKEINFO=true } makeinstall_host() { cp -v ../include/libiberty.h ${LIB32_SYSROOT_PREFIX}/usr/include make -C bfd install # fix parallel build with libctf requiring bfd make MAKEINFO=true install } configure_target() { : } make_target() { : } makeinstall_target() { mkdir -p ${INSTALL}/etc # ln -sf /storage/.cache/ld.so.cache ${INSTALL}/etc/ld.so.cache # ln -sf /storage/.cache/ld.so.cache~ ${INSTALL}/etc/ld.so.cache~ echo "include /etc/ld.so.conf.d/*.conf" > ${INSTALL}/etc/ld.so.conf # mkdir -p ${INSTALL}/usr/cache # touch ${INSTALL}/usr/cache/ld.so.cache # touch ${INSTALL}/usr/cache/ld.so.cache~ mkdir -p ${INSTALL}/usr/lib ln -sf ../lib32/ld-linux-armhf.so.3 ${INSTALL}/usr/lib } ================================================ FILE: packages/lib32/devel/lib32-fribidi/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-fribidi" PKG_VERSION="$(get_pkg_version fribidi)" PKG_NEED_UNPACK="$(get_pkg_directory fribidi)" PKG_ARCH="aarch64" PKG_LICENSE="LGPL" PKG_SITE="http://fribidi.freedesktop.org/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_PATCH_DIRS+=" $(get_pkg_directory fribidi)/patches" PKG_LONGDESC="A bidirectional algorithm library." PKG_TOOLCHAIN="meson" PKG_BUILD_FLAGS="lib32 +pic" PKG_MESON_OPTS_TARGET="-Ddeprecated=false \ -Ddocs=false \ -Ddefault_library=static" unpack() { ${SCRIPTS}/get fribidi mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/fribidi/fribidi-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/bin cp -f $(get_pkg_directory fribidi)/scripts/fribidi-config ${SYSROOT_PREFIX}/usr/bin chmod +x ${SYSROOT_PREFIX}/usr/bin/fribidi-config safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/devel/lib32-glib/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-glib" PKG_VERSION="$(get_pkg_version glib)" PKG_NEED_UNPACK="$(get_pkg_directory glib)" PKG_ARCH="aarch64" PKG_LICENSE="LGPL" PKG_SITE="https://www.gtk.org/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-pcre2 lib32-zlib lib32-libffi Python3:host lib32-util-linux" PKG_PATCH_DIRS+=" $(get_pkg_directory glib)/patches" PKG_LONGDESC="A library which includes support routines for C such as lists, trees, hashes, memory allocation." PKG_TOOLCHAIN="meson" PKG_BUILD_FLAGS="lib32" PKG_MESON_OPTS_TARGET="-Ddefault_library=shared \ -Dinstalled_tests=false \ -Dselinux=disabled \ -Dxattr=true \ -Dgtk_doc=false \ -Dman=false \ -Ddtrace=false \ -Dsystemtap=false \ -Dbsymbolic_functions=true \ -Dforce_posix_threads=true \ -Dtests=false" unpack() { ${SCRIPTS}/get glib mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/glib/glib-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include safe_remove ${INSTALL}/usr/share mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/devel/lib32-glibc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-glibc" PKG_VERSION="$(get_pkg_version glibc)" PKG_NEED_UNPACK="$(get_pkg_directory glibc)" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="https://www.gnu.org/software/libc/" PKG_URL="" PKG_DEPENDS_TARGET="ccache:host autotools:host lib32-linux-headers lib32-gcc:bootstrap pigz:host glibc Python3:host" # Make sure both 64 and 32 are built PKG_LONGDESC="The Glibc package contains the main C library, for multilib ARM." GLIBC_DIRECTORY="$(get_pkg_directory glibc)" PKG_NEED_UNPACK+=" ${GLIBC_DIRECTORY}" PKG_PATCH_DIRS+=" ${GLIBC_DIRECTORY}/patches ${GLIBC_DIRECTORY}/patches/arm" PKG_BUILD_FLAGS="-gold lib32" case "${LINUX}" in amlogic-4.9|rk356x-4.19|OdroidM1-4.19) OPT_ENABLE_KERNEL=4.9.0 ;; gameforce-4.4|rockchip-4.4|odroid-go-a-4.4) OPT_ENABLE_KERNEL=4.4.0 ;; amlogic-5.15) OPT_ENABLE_KERNEL=5.15.0 ;; amlogic-5.4) OPT_ENABLE_KERNEL=5.4.0 ;; amlogic-3.14) OPT_ENABLE_KERNEL=3.0.0 ;; *) OPT_ENABLE_KERNEL=6.1.0 ;; esac PKG_CONFIGURE_OPTS_TARGET="BASH_SHELL=/bin/sh \ ac_cv_path_PERL=no \ ac_cv_prog_MAKEINFO= \ --libexecdir=/usr/lib/glibc \ --cache-file=config.cache \ --disable-profile \ --disable-sanity-checks \ --enable-add-ons \ --enable-bind-now \ --with-elf \ --with-tls \ --with-__thread \ --with-binutils=${BUILD}/toolchain/bin \ --with-headers=${LIB32_SYSROOT_PREFIX}/usr/include \ --enable-kernel=${OPT_ENABLE_KERNEL} \ --without-cvs \ --without-gd \ --disable-build-nscd \ --disable-nscd \ --disable-timezone-tools" if build_with_debug; then PKG_CONFIGURE_OPTS_TARGET+=" --enable-debug" else PKG_CONFIGURE_OPTS_TARGET+=" --disable-debug" fi unpack() { ${SCRIPTS}/get glibc mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/glibc/glibc-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_unpack() { find "${PKG_BUILD}" -type f -name '*.py' -exec sed -e '1s,^#![[:space:]]*/usr/bin/python.*,#!/usr/bin/env python3,' -i {} \; } pre_configure_target() { # Filter out some problematic *FLAGS export CFLAGS=$(echo ${CFLAGS} | sed -e "s|-ffast-math||g") export CFLAGS=$(echo ${CFLAGS} | sed -e "s|-Ofast|-O2|g") export CFLAGS=$(echo ${CFLAGS} | sed -e "s|-O.|-O2|g") export CFLAGS=$(echo ${CFLAGS} | sed -e "s|-Wunused-but-set-variable||g") export CFLAGS="${CFLAGS} -Wno-unused-variable" if [ -n "${PROJECT_CFLAGS}" ]; then export CFLAGS=$(echo ${CFLAGS} | sed -e "s|${PROJECT_CFLAGS}||g") fi export LDFLAGS=$(echo ${LDFLAGS} | sed -e "s|-ffast-math||g") export LDFLAGS=$(echo ${LDFLAGS} | sed -e "s|-Ofast|-O2|g") export LDFLAGS=$(echo ${LDFLAGS} | sed -e "s|-O.|-O2|g") export LDFLAGS=$(echo ${LDFLAGS} | sed -e "s|-Wl,--as-needed||") unset LD_LIBRARY_PATH # set some CFLAGS we need export CFLAGS="${CFLAGS} -g -fno-stack-protector" export BUILD_CC=${HOST_CC} export OBJDUMP_FOR_HOST=objdump cat >config.cache <configparms < "${INSTALL}/etc/ld.so.conf.d/lib32-glibc.conf" # printf "/emuelec/lib32\n/emuelec/lib\n" > "${INSTALL}/etc/ld.so.conf.d/emuelec.conf" mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/devel/lib32-gmp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-gmp" PKG_VERSION="$(get_pkg_version gmp)" PKG_NEED_UNPACK="$(get_pkg_directory gmp)" PKG_ARCH="aarch64" PKG_LICENSE="LGPLv3+" PKG_SITE="http://gmplib.org/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_PATCH_DIRS+=" $(get_pkg_directory gmp)/patches" PKG_LONGDESC="A library for arbitrary precision arithmetic, operating on signed integers, rational numbers, and floating point numbers." PKG_BUILD_FLAGS="lib32 +pic:host" PKG_CONFIGURE_OPTS_HOST="--enable-cxx --enable-static --disable-shared" unpack() { ${SCRIPTS}/get gmp mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/gmp/gmp-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } pre_configure_host() { export CPPFLAGS="${CPPFLAGS} -fexceptions" } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/devel/lib32-libcap/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2010-2011 Roman Weber (roman@openelec.tv) # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-libcap" PKG_VERSION="$(get_pkg_version libcap)" PKG_NEED_UNPACK="$(get_pkg_directory libcap)" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="https://git.kernel.org/pub/scm/libs/libcap/libcap.git/log/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_PATCH_DIRS+=" $(get_pkg_directory libcap)/patches" PKG_LONGDESC="A library for getting and setting POSIX.1e capabilities." PKG_BUILD_FLAGS="+pic lib32" unpack() { ${SCRIPTS}/get libcap mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libcap/libcap-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_unpack() { mkdir -p ${PKG_BUILD}/.${LIB32_TARGET_NAME} cp -r ${PKG_BUILD}/* ${PKG_BUILD}/.${LIB32_TARGET_NAME} } make_target() { cd ${PKG_BUILD}/.${TARGET_NAME} make CC=${CC} \ AR=${AR} \ RANLIB=${RANLIB} \ CFLAGS="${TARGET_CFLAGS}" \ BUILD_CC=${HOST_CC} \ BUILD_CFLAGS="${HOST_CFLAGS} -I${PKG_BUILD}/libcap/include" \ PAM_CAP=no \ lib=/lib \ USE_GPERF=no \ -C libcap libcap.pc libcap.a } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib cp libcap/libcap.a ${SYSROOT_PREFIX}/usr/lib mkdir -p ${SYSROOT_PREFIX}/usr/lib/pkgconfig cp libcap/libcap.pc ${SYSROOT_PREFIX}/usr/lib/pkgconfig mkdir -p ${SYSROOT_PREFIX}/usr/include/sys cp libcap/include/sys/capability.h ${SYSROOT_PREFIX}/usr/include/sys } ================================================ FILE: packages/lib32/devel/lib32-libffi/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-libffi" PKG_VERSION="$(get_pkg_version libffi)" PKG_NEED_UNPACK="$(get_pkg_directory libffi)" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="http://sourceware.org/${PKG_NAME}/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_PATCH_DIRS+=" $(get_pkg_directory libffi)/patches" PKG_LONGDESC="Foreign Function Interface Library." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="lib32" PKG_CONFIGURE_OPTS_TARGET="--disable-debug \ --enable-static --disable-shared \ --with-pic \ --enable-structs \ --enable-raw-api \ --disable-purify-safety \ --with-gnu-ld" unpack() { ${SCRIPTS}/get libffi mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libffi/libffi-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/devel/lib32-libpcap/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2025-present EmuELEC (https://github.com/EmuELEC) PKG_NAME="lib32-libpcap" PKG_VERSION="$(get_pkg_version libpcap)" PKG_NEED_UNPACK="$(get_pkg_directory libpcap)" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="https://git.kernel.org/pub/scm/libs/libpcap/libpcap.git/log/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_PATCH_DIRS+=" $(get_pkg_directory libpcap)/patches" PKG_LONGDESC="A library for getting and setting POSIX.1e capabilities." PKG_BUILD_FLAGS="+pic lib32" PKG_TOOLCHAIN="configure" unpack() { ${SCRIPTS}/get libpcap mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libpcap/libpcap-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } post_unpack() { mkdir -p ${PKG_BUILD}/.${LIB32_TARGET_NAME} cp -r ${PKG_BUILD}/* ${PKG_BUILD}/.${LIB32_TARGET_NAME} } PKG_CONFIGURE_OPTS_TARGET="LIBS=-lpthread \ ac_cv_header_libusb_1_0_libusb_h=no \ --disable-shared \ --with-pcap=linux \ --disable-bluetooth \ --disable-can \ --without-libnl \ --disable-dbus \ --disable-canusb" pre_configure_target() { # When cross-compiling, configure can't set linux version # forcing it sed -i -e 's/ac_cv_linux_vers=unknown/ac_cv_linux_vers=2/' ../configure } post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/lib32/devel/lib32-libtool/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-libtool" PKG_VERSION="$(get_pkg_version libtool)" PKG_NEED_UNPACK="$(get_pkg_directory libtool)" PKG_SHA256="e3bd4d5d3d025a36c21dd6af7ea818a2afcd4dfc1ea5a17b39d7854bcd0c06e3" PKG_LICENSE="GPL" PKG_SITE="http://www.gnu.org/software/libtool/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_PATCH_DIRS+=" $(get_pkg_directory libtool)/patches" PKG_LONGDESC="A generic library support script." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="lib32" unpack() { ${SCRIPTS}/get libtool mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libtool/libtool-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } make_target() { : # Does not work! } makeinstall_target() { : # Does not work! } post_makeinstall_target() { : # rm -rf ${INSTALL}/usr/bin # rm -rf ${INSTALL}/usr/share } ================================================ FILE: packages/lib32/devel/lib32-linux-headers/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-linux-headers" PKG_VERSION="$(get_pkg_version linux)" PKG_NEED_UNPACK="$(get_pkg_directory linux)" PKG_ARCH="aarch64" PKG_URL="" PKG_LICENSE="GPL" PKG_SITE="http://www.kernel.org" PKG_DEPENDS_TARGET="ccache:host rsync:host openssl:host linux:host" PKG_DEPENDS_UNPACK="linux" PKG_LONGDESC="This package contains Linux headers." # PKG_BUILD_FLAGS="lib32" PKG_TOOLCHAIN="manual" # unpack() { # ${SCRIPTS}/get linux # mkdir -p ${PKG_BUILD} # if [ "${LINUX}" = "default" ]; then # tar --strip-components=1 -xf ${SOURCES}/linux/linux-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} # else # tar --strip-components=1 -xf ${SOURCES}/linux/linux-${LINUX}-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} # fi # } # make_target() { # : # } makeinstall_target() { pushd "$(get_build_dir linux)" &>/dev/null # local TARGET_KERNEL_PATCH_ARCH=aarch64 make \ ARCH=arm \ HOSTCC="${TOOLCHAIN}/bin/host-gcc" \ HOSTCXX="${TOOLCHAIN}/bin/host-g++" \ HOSTCFLAGS="${HOST_CFLAGS}" \ HOSTCXXFLAGS="${HOST_CXXFLAGS}" \ HOSTLDFLAGS="${HOST_LDFLAGS}" \ INSTALL_HDR_PATH=${PKG_BUILD} \ headers_install mkdir -p ${LIB32_SYSROOT_PREFIX}/usr/include cp -R ${PKG_BUILD}/include/* ${LIB32_SYSROOT_PREFIX}/usr/include popd &>/dev/null } ================================================ FILE: packages/lib32/devel/lib32-pcre/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-pcre" PKG_VERSION="$(get_pkg_version pcre)" PKG_NEED_UNPACK="$(get_pkg_directory pcre)" PKG_ARCH="aarch64" PKG_LICENSE="OSS" PKG_SITE="http://www.pcre.org/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain pcre:host" PKG_PATCH_DIRS+=" $(get_pkg_directory pcre)/patches" PKG_LONGDESC="A set of functions that implement regular expression pattern matching." PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="lib32 +pic" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --enable-utf8 \ --enable-pcre16 \ --enable-unicode-properties \ --with-gnu-ld" unpack() { ${SCRIPTS}/get pcre mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/pcre/pcre-${PKG_VERSION}.tar.bz2 -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 # rm -rf ${INSTALL}/usr/bin # cp ${PKG_NAME}-config ${TOOLCHAIN}/bin # sed -e "s:\(['= ]\)/usr:\\1${PKG_ORIG_SYSROOT_PREFIX}/usr:g" -i ${TOOLCHAIN}/bin/${PKG_NAME}-config # chmod +x ${TOOLCHAIN}/bin/${PKG_NAME}-config } ================================================ FILE: packages/lib32/devel/lib32-pcre2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-pcre2" PKG_VERSION="$(get_pkg_version pcre2)" PKG_NEED_UNPACK="$(get_pkg_directory pcre2)" PKG_ARCH="aarch64" PKG_LICENSE="OSS" PKG_SITE="http://www.pcre.org/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain pcre2:host" PKG_PATCH_DIRS+=" $(get_pkg_directory pcre2)/patches" PKG_LONGDESC="A set of functions that implement regular expression pattern matching." PKG_TOOLCHAIN="cmake" PKG_BUILD_FLAGS="lib32 +pic" PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=OFF \ -DPCRE2_BUILD_PCRE2_16=ON \ -DPCRE2_SUPPORT_LIBREADLINE=OFF \ -DPCRE2_STATIC_PIC=ON" unpack() { ${SCRIPTS}/get pcre2 mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/pcre2/pcre2-${PKG_VERSION}.tar.bz2 -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 # rm -rf ${INSTALL}/usr/bin # cp ${PKG_NAME}-config ${TOOLCHAIN}/bin # sed -e "s:\(['= ]\)/usr:\\1${PKG_ORIG_SYSROOT_PREFIX}/usr:g" -i ${TOOLCHAIN}/bin/${PKG_NAME}-config # chmod +x ${TOOLCHAIN}/bin/${PKG_NAME}-config } ================================================ FILE: packages/lib32/emuelec/emulators/lib32-box86/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-box86" PKG_VERSION="$(get_pkg_version box86)" PKG_NEED_UNPACK="$(get_pkg_directory box86)" PKG_ARCH="aarch64" PKG_REV="1" PKG_LICENSE="MIT" PKG_SITE="https://github.com/ptitSeb/box86" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-gl4es" PKG_PATCH_DIRS+=" $(get_pkg_directory box86)/patches" PKG_LONGDESC="Box86 - Linux Userspace x86 Emulator with a twist, targeted at ARM Linux devices" PKG_TOOLCHAIN="cmake" PKG_BUILD_FLAGS="lib32" if [ "${PROJECT}" = "Amlogic-ce" ]; then if [ "${DEVICE}" = "Amlogic-old" ]; then PKG_PATCH_DIRS+=" ${PROJECT_DIR}/Amlogic-ce/devices/Amlogic-old/patches/box86" fi PKG_CMAKE_OPTS_TARGET=" -DRK3399=ON -DCMAKE_BUILD_TYPE=Release" else PKG_CMAKE_OPTS_TARGET=" -DGOA_CLONE=ON -DCMAKE_BUILD_TYPE=Release" fi unpack() { ${SCRIPTS}/get box86 mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/box86/box86-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } makeinstall_target() { mkdir -p ${INSTALL}/usr/config/emuelec/bin/box86/lib cp ${PKG_BUILD}/x86lib/* ${INSTALL}/usr/config/emuelec/bin/box86/lib cp ${PKG_BUILD}/.${TARGET_NAME}/box86 ${INSTALL}/usr/config/emuelec/bin/box86/ mkdir -p ${INSTALL}/etc/binfmt.d ln -sf /emuelec/configs/box86.conf ${INSTALL}/etc/binfmt.d/box86.conf } ================================================ FILE: packages/lib32/emuelec/emulators/lib32-droidports/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-droidports" PKG_VERSION="$(get_pkg_version droidports)" PKG_NEED_UNPACK="$(get_pkg_directory droidports)" PKG_ARCH="aarch64" PKG_SITE="https://github.com/JohnnyonFlame/droidports" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-SDL2 lib32-SDL2_image lib32-openal-soft lib32-bzip2 lib32-libzip lib32-libpng" PKG_PATCH_DIRS+=" $(get_pkg_directory droidports)/patches" PKG_LONGDESC="A repository for experimenting with elf loading and in-place patching of android native libraries on non-android operating systems." PKG_TOOLCHAIN="cmake" PKG_BUILD_FLAGS="lib32" PKG_CMAKE_OPTS_TARGET=" -DCMAKE_BUILD_TYPE=Release -DPLATFORM=linux -DPORT=gmloader -DUSE_BUILTIN_FREETYPE=ON" unpack() { ${SCRIPTS}/get droidports mkdir -p ${PKG_BUILD} tar cf - -C ${SOURCES}/droidports/droidports-${PKG_VERSION} ${PKG_TAR_COPY_OPTS} . | tar xf - -C ${PKG_BUILD} } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/.${TARGET_NAME}/gmloader ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/gmloader cp $(get_pkg_directory droidports)/config/* ${INSTALL}/usr/config/emuelec/configs/gmloader cp $(get_pkg_directory droidports)/scripts/* ${INSTALL}/usr/bin } ================================================ FILE: packages/lib32/emuelec/libretro/lib32-desmume/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-desmume" PKG_VERSION="$(get_pkg_version desmume)" PKG_NEED_UNPACK="$(get_pkg_directory desmume)" PKG_ARCH="aarch64" PKG_REV="1" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/desmume" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-alsa-lib lib32-libpcap" PKG_PATCH_DIRS+=" $(get_pkg_directory desmume)/patches" PKG_SHORTDESC="ARM optimized PCSX fork" PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="lib32 +speed -gold" unpack() { ${SCRIPTS}/get desmume mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/desmume/desmume-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } make_target() { cd ${PKG_BUILD}/desmume/src/frontend/libretro make CC=${CC} platform=classic_armv7_a7 } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/desmume/src/frontend/libretro/desmume_libretro.so ${INSTALL}/usr/lib/libretro/desmume_32b_libretro.so } ================================================ FILE: packages/lib32/emuelec/libretro/lib32-flycast/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-flycast" PKG_VERSION="$(get_pkg_version flycast)" PKG_NEED_UNPACK="$(get_pkg_directory flycast)" PKG_ARCH="aarch64" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/flyinghead/flycast" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-${OPENGLES}" PKG_PATCH_DIRS+=" $(get_pkg_directory flycast)/patches" PKG_SHORTDESC="Flycast is a multiplatform Sega Dreamcast emulator" PKG_BUILD_FLAGS="lib32 -lto" PKG_TOOLCHAIN="cmake" PKG_CMAKE_OPTS_TARGET="-DLIBRETRO=ON \ -DUSE_OPENMP=OFF \ -DCMAKE_BUILD_TYPE=Release \ -DUSE_GLES2=OFF \ -DUSE_GLES=ON \ -DUSE_VULKAN=OFF" unpack() { ${SCRIPTS}/get flycast mkdir -p ${PKG_BUILD} tar cf - -C ${SOURCES}/flycast/flycast-${PKG_VERSION} ${PKG_TAR_COPY_OPTS} . | tar xf - -C ${PKG_BUILD} } pre_make_target() { find ${PKG_BUILD} -name flags.make -exec sed -i "s:isystem :I:g" \{} \; find ${PKG_BUILD} -name build.ninja -exec sed -i "s:isystem :I:g" \{} \; } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp -va flycast_libretro.so ${INSTALL}/usr/lib/libretro/flycast_32b_libretro.so } ================================================ FILE: packages/lib32/emuelec/libretro/lib32-mupen64plus/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-mupen64plus" PKG_VERSION="$(get_pkg_version mupen64plus)" PKG_NEED_UNPACK="$(get_pkg_directory mupen64plus)" PKG_ARCH="aarch64" PKG_REV="1" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/mupen64plus-libretro" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain nasm:host lib32-${OPENGLES}" PKG_PATCH_DIRS+=" $(get_pkg_directory mupen64plus)/patches" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="mupen64plus + RSP-HLE + GLideN64 + libretro" PKG_LONGDESC="mupen64plus + RSP-HLE + GLideN64 + libretro" PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="lib32 -lto" if [ "${PROJECT}" = "Amlogic-ce" ]; then PKG_MAKE_OPTS_TARGET="platform=odroid BOARD=c2" elif [[ "${DEVICE}" =~ ^(OdroidGoAdvance|GameForce|RK356x|OdroidM1)$ ]]; then PKG_MAKE_OPTS_TARGET="platform=unix GLES=1 FORCE_GLES=1 HAVE_NEON=1 WITH_DYNAREC=arm" fi unpack() { ${SCRIPTS}/get mupen64plus mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/mupen64plus/mupen64plus-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } pre_configure_target() { CFLAGS+="-DLINUX -DEGL_API_FB -fcommon" CPPFLAGS+="-DLINUX -DEGL_API_FB" sed -i "s|BOARD :=.*|BOARD = N2|g" Makefile sed -i "s|odroid64|emuelec64|g" Makefile } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mupen64plus_libretro.so ${INSTALL}/usr/lib/libretro/mupen64plus_32b_libretro.so } ================================================ FILE: packages/lib32/emuelec/libretro/lib32-parallel-n64/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-parallel-n64" PKG_VERSION="$(get_pkg_version parallel-n64)" PKG_NEED_UNPACK="$(get_pkg_directory parallel-n64)" PKG_ARCH="aarch64" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/parallel-n64" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-${OPENGLES}" P64_DIRECTORY="$(get_pkg_directory parallel-n64)" PKG_PATCH_DIRS+=" ${P64_DIRECTORY}/patches ${P64_DIRECTORY}/patches/arm ${P64_DIRECTORY}/patches/emuelec-arm32" PKG_LONGDESC="Optimized/rewritten Nintendo 64 emulator made specifically for Libretro. Originally based on Mupen64 Plus." PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="lib32 -lto" case ${DEVICE} in OdroidGoAdvance|GameForce) PKG_MAKE_OPTS_TARGET="platform=Odroidgoa" ;; RK356x|OdroidM1) PKG_MAKE_OPTS_TARGET="platform=Odroidgoa-RK356x" ;; *) PKG_MAKE_OPTS_TARGET="platform=${DEVICE}" ;; esac unpack() { ${SCRIPTS}/get parallel-n64 mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/parallel-n64/parallel-n64-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp parallel_n64_libretro.so ${INSTALL}/usr/lib/libretro/parallel_n64_32b_libretro.so } ================================================ FILE: packages/lib32/emuelec/libretro/lib32-pcsx_rearmed/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-pcsx_rearmed" PKG_VERSION="$(get_pkg_version pcsx_rearmed)" PKG_NEED_UNPACK="$(get_pkg_directory pcsx_rearmed)" PKG_ARCH="aarch64" PKG_REV="1" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/pcsx_rearmed" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-alsa-lib" PKG_PATCH_DIRS+=" $(get_pkg_directory pcsx_rearmed)/patches" PKG_SHORTDESC="ARM optimized PCSX fork" PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="lib32 +speed -gold" unpack() { ${SCRIPTS}/get pcsx_rearmed mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/pcsx_rearmed/pcsx_rearmed-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } make_target() { cd ${PKG_BUILD} export ALLOW_LIGHTREC_ON_ARM=1 if [ "${DEVICE}" = "Amlogic-old" ]; then make -f Makefile.libretro GIT_VERSION=${PKG_VERSION} platform=rpi3 else make -f Makefile.libretro GIT_VERSION=${PKG_VERSION} platform=rpi4 fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp pcsx_rearmed_libretro.so ${INSTALL}/usr/lib/libretro/pcsx_rearmed_32b_libretro.so } ================================================ FILE: packages/lib32/emuelec/libretro/lib32-retroarch/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-retroarch" PKG_VERSION="$(get_pkg_version retroarch)" PKG_NEED_UNPACK="$(get_pkg_directory retroarch)" PKG_ARCH="aarch64" PKG_SITE="https://github.com/libretro/RetroArch" PKG_URL="" PKG_LICENSE="GPLv3" #PKG_DEPENDS_TARGET="retroarch lib32-zlib lib32-${OPENGLES}" PKG_DEPENDS_TARGET="retroarch lib32-toolchain lib32-SDL2 lib32-alsa-lib lib32-openssl lib32-freetype lib32-zlib lib32-ffmpeg lib32-libass lib32-${OPENGLES}" # samba avahi nss-mdns openal-soft PKG_LONGDESC="Reference frontend for the libretro API." PKG_BUILD_FLAGS="lib32" RA_DIRECTORY="$(get_pkg_directory retroarch)" PKG_PATCH_DIRS+=" ${RA_DIRECTORY}/patches" PKG_CONFIGURE_OPTS_TARGET="--disable-qt \ --enable-alsa \ --enable-udev \ --disable-opengl1 \ --disable-opengl \ --enable-egl \ --enable-opengles \ --disable-wayland \ --disable-x11 \ --enable-zlib \ --enable-freetype \ --disable-discord \ --disable-vg \ --disable-sdl \ --enable-sdl2 \ --enable-ffmpeg \ --enable-neon" if [ "${PROJECT}" = "Amlogic-ce" ]; then PKG_PATCH_DIRS+=" ${RA_DIRECTORY}/patches/Amlogic" PKG_CONFIGURE_OPTS_TARGET+=" --disable-kms \ --enable-mali_fbdev" elif [[ "${DEVICE}" =~ ^(OdroidGoAdvance|GameForce|RK356x|OdroidM1)$ ]]; then PKG_RKMISC="yes" PKG_DEPENDS_TARGET+=" lib32-libdrm lib32-librga" PKG_CONFIGURE_OPTS_TARGET+=" --enable-opengles3 \ --enable-opengles3_2 \ --enable-kms \ --disable-mali_fbdev" if [ "${DEVICE}" = "OdroidGoAdvance" ]; then PKG_PATCH_DIRS+=" ${RA_DIRECTORY}/patches/OdroidGoAdvance" PKG_CONFIGURE_OPTS_TARGET+=" --enable-odroidgo2" elif [ "${DEVICE}" = "GameForce" ]; then PKG_PATCH_DIRS+=" ${RA_DIRECTORY}/patches/OdroidGoAdvance" fi else echo "${PKG_NAME}: Unsupported devices ${DEVICE} when only AmlNG, AmlOld, OGA, GF, RK356X, M1 is supported" 1>&2 false fi if [ "${PULSEAUDIO_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" lib32-libpulse" fi unpack() { ${SCRIPTS}/get retroarch mkdir -p ${PKG_BUILD} tar cf - -C ${SOURCES}/retroarch/retroarch-${PKG_VERSION} ${PKG_TAR_COPY_OPTS} . | tar xf - -C ${PKG_BUILD} } pre_configure_target() { # Retroarch does not like -O3 for CHD loading with cheevos export CFLAGS="${CFLAGS} -O3 -fno-tree-vectorize" TARGET_CONFIGURE_OPTS="" cd ${PKG_BUILD} } make_target() { make HAVE_UPDATE_ASSETS=1 HAVE_LIBRETRODB=1 HAVE_BLUETOOTH=1 HAVE_NETWORKING=1 HAVE_LAKKA=1 HAVE_ZARCH=1 HAVE_QT=0 HAVE_LANGEXTRA=1 HAVE_LAKKA_PROJECT=0 HAVE_LAKKA_SERVER=0 [ $? -eq 0 ] && echo "(retroarch ok)" || { echo "(retroarch failed)" ; exit 1 ; } } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin #patchelf --set-interpreter /usr/lib32/ld-linux-armhf.so.3 ${PKG_BUILD}/retroarch cp ${PKG_BUILD}/retroarch ${INSTALL}/usr/bin/retroarch32 } ================================================ FILE: packages/lib32/emuelec/libretro/lib32-retrorun/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-retrorun" PKG_VERSION="$(get_pkg_version retrorun)" PKG_NEED_UNPACK="$(get_pkg_directory retrorun)" PKG_ARCH="aarch64" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/navy1978/retrorun-go2" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-libgo2 lib32-libdrm linux:host" PKG_DEPENDS_UNPACK="linux" PKG_PATCH_DIRS+=" $(get_pkg_directory retrorun)/patches" PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="lib32" PKG_MAKE_OPTS_TARGET="config=release ARCH=" unpack() { ${SCRIPTS}/get retrorun mkdir -p ${PKG_BUILD} tar cf - -C ${SOURCES}/retrorun/retrorun-${PKG_VERSION} ${PKG_TAR_COPY_OPTS} . | tar xf - -C ${PKG_BUILD} } pre_configure_target() { local TARGET_KERNEL_PATCH_ARCH=aarch64 CFLAGS+=" -I$(get_build_dir lib32-libdrm)/include/drm" CFLAGS+=" -I$(get_build_dir linux)/include/uapi" CFLAGS+=" -I$(get_build_dir linux)/tools/include" sed -i "s|/storage/.config/distribution/|/emuelec/|g" ${PKG_BUILD}/src/main.cpp safe_remove ${PKG_BUILD}/retrorun } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -va retrorun ${INSTALL}/usr/bin/retrorun32 } ================================================ FILE: packages/lib32/emuelec/libretro/lib32-uae4arm/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-uae4arm" PKG_VERSION="$(get_pkg_version uae4arm)" PKG_NEED_UNPACK="$(get_pkg_directory uae4arm)" PKG_ARCH="aarch64" PKG_REV="1" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libretro/uae4arm-libretro" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_PATCH_DIRS+=" $(get_pkg_directory uae4arm)/patches" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of uae4arm for libretro (rpi/android)" PKG_LONGDESC="Port of uae4arm for libretro (rpi/android) " PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" PKG_BUILD_FLAGS="lib32 -lto" unpack() { ${SCRIPTS}/get uae4arm mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/uae4arm/uae4arm-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } make_target() { CFLAGS="${CFLAGS} -DARM -marm" if [[ "${LIB32_TARGET_FPU}" =~ "neon" ]]; then CFLAGS="-D__NEON_OPT" fi make HAVE_NEON=1 USE_PICASSO96=1 } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp uae4arm_libretro.so ${INSTALL}/usr/lib/libretro/uae4arm_32b_libretro.so } ================================================ FILE: packages/lib32/emuelec/ports/lib32-bennugd-monolithic/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-bennugd-monolithic" PKG_VERSION="$(get_pkg_version bennugd-monolithic)" PKG_NEED_UNPACK="$(get_pkg_directory bennugd-monolithic)" PKG_ARCH="aarch64" PKG_SITE="https://github.com/christianhaitian/bennugd-monolithic" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-libvorbisidec lib32-SDL2 lib32-SDL2_mixer lib32-libpng lib32-tre" PKG_PATCH_DIRS+=" $(get_pkg_directory bennugd-monolithic)/patches" PKG_SHORTDESC="Use for executing bennugd games like Streets of Rage Remake " PKG_TOOLCHAIN="cmake-make" PKG_BUILD_FLAGS="lib32" unpack() { ${SCRIPTS}/get bennugd-monolithic mkdir -p ${PKG_BUILD} tar cf - -C ${SOURCES}/bennugd-monolithic/bennugd-monolithic-${PKG_VERSION} ${PKG_TAR_COPY_OPTS} . | tar xf - -C ${PKG_BUILD} } pre_configure_target() { chainfile="cmake-${TARGET_NAME}.conf" PKG_CMAKE_SCRIPT="${PKG_BUILD}/projects/cmake/bgdc/CMakeLists.txt" cd ${PKG_BUILD}/projects/cmake/bgdc/ cmake -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN}/etc/${chainfile} -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=MinSizeRel ${PKG_CMAKE_SCRIPT} make PKG_CMAKE_SCRIPT="${PKG_BUILD}/projects/cmake/bgdi/CMakeLists.txt" cd ${PKG_BUILD}/projects/cmake/bgdi/ cmake -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN}/etc/${chainfile} -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=MinSizeRel ${PKG_CMAKE_SCRIPT} make } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/projects/cmake/bgdi/bgdi ${INSTALL}/usr/bin cp ${PKG_BUILD}/projects/cmake/bgdc/bgdc ${INSTALL}/usr/bin } ================================================ FILE: packages/lib32/graphics/lib32-SDL2_image/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 0riginally created by Escalade (https://github.com/escalade) # Copyright (C) 2018-2022 5schatten (https://github.com/5schatten) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-SDL2_image" PKG_VERSION="$(get_pkg_version SDL2_image)" PKG_NEED_UNPACK="$(get_pkg_directory SDL2_image)" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="http://www.libsdl.org/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-SDL2" PKG_PATCH_DIRS+=" $(get_pkg_directory SDL2_image)/patches" PKG_LONGDESC="SDL_image is an image file loading library. " PKG_BUILD_FLAGS="lib32" unpack() { ${SCRIPTS}/get SDL2_image mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/SDL2_image/SDL2_image-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/graphics/lib32-cairo/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-cairo" PKG_VERSION="$(get_pkg_version cairo)" PKG_NEED_UNPACK="$(get_pkg_directory cairo)" PKG_ARCH="aarch64" PKG_LICENSE="LGPL" PKG_SITE="http://cairographics.org/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-zlib lib32-freetype lib32-fontconfig lib32-glib lib32-libpng lib32-pixman lib32-${OPENGLES}" PKG_PATCH_DIRS+=" $(get_pkg_directory cairo)/patches" PKG_LONGDESC="Cairo is a vector graphics library with cross-device output support." PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="lib32" PKG_CONFIGURE_OPTS_TARGET="--disable-silent-rules \ --enable-shared \ --disable-static \ --disable-gtk-doc \ --enable-largefile \ --enable-atomic \ --disable-gcov \ --disable-valgrind \ --disable-xcb \ --disable-xlib-xcb \ --disable-xcb-shm \ --disable-qt \ --disable-quartz \ --disable-quartz-font \ --disable-quartz-image \ --disable-win32 \ --disable-win32-font \ --disable-os2 \ --disable-beos \ --disable-cogl \ --disable-drm \ --disable-gallium \ --enable-png \ --disable-directfb \ --disable-vg \ --disable-wgl \ --disable-script \ --enable-ft \ --enable-fc \ --enable-ps \ --enable-pdf \ --enable-svg \ --disable-test-surfaces \ --disable-tee \ --disable-xml \ --enable-pthread \ --enable-gobject=yes \ --disable-full-testing \ --disable-rpath \ --disable-trace \ --enable-interpreter \ --disable-symbol-lookup \ --enable-some-floating-point \ --with-gnu-ld \ --disable-xlib \ --disable-xlib-xrender \ --without-x \ --disable-gl \ --disable-glx \ --enable-glesv2 \ --enable-egl" unpack() { ${SCRIPTS}/get cairo mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/cairo/cairo-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/graphics/lib32-gl4es/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-gl4es" PKG_VERSION="$(get_pkg_version gl4es)" PKG_NEED_UNPACK="$(get_pkg_directory gl4es)" PKG_ARCH="aarch64" PKG_SITE="https://github.com/JohnnyonFlame/gl4es" PKG_LICENSE="GPL" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-${OPENGLES}" PKG_PATCH_DIRS+=" $(get_pkg_directory gl4es)/patches" PKG_LONGDESC=" GL4ES is a OpenGL 2.1/1.5 to GL ES 2.0/1.1 translation library, with support for Pandora, ODroid, OrangePI, CHIP, Raspberry PI, Android, Emscripten and AmigaOS4. " PKG_TOOLCHAIN="cmake-make" PKG_BUILD_FLAGS="lib32" if [ "${PROJECT}" = "Amlogic-ce" ]; then PKG_CMAKE_OPTS_TARGET="-DNOX11=1 -DODROID=1 -DGBM=OFF -DCMAKE_BUILD_TYPE=Release" else PKG_CMAKE_OPTS_TARGET="-DNOX11=1 -DODROID=1 -DGBM=ON -DCMAKE_BUILD_TYPE=Release" fi unpack() { ${SCRIPTS}/get gl4es mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/gl4es/gl4es-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } makeinstall_target(){ mkdir -p ${INSTALL}/usr/lib32 cp ${PKG_BUILD}/lib/libGL.so.1 ${INSTALL}/usr/lib32/ ln -sf libGL.so.1 ${INSTALL}/usr/lib32/libGL.so } ================================================ FILE: packages/lib32/graphics/lib32-harfbuzz/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-harfbuzz" PKG_VERSION="$(get_pkg_version harfbuzz)" PKG_NEED_UNPACK="$(get_pkg_directory harfbuzz)" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="http://www.freedesktop.org/wiki/Software/HarfBuzz" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-cairo lib32-freetype lib32-glib" PKG_PATCH_DIRS+=" $(get_pkg_directory harfbuzz)/patches" PKG_LONGDESC="HarfBuzz is an OpenType text shaping engine." PKG_TOOLCHAIN="meson" PKG_BUILD_FLAGS="lib32" PKG_MESON_OPTS_TARGET="-Dbenchmark=disabled \ -Dcairo=enabled \ -Ddocs=disabled \ -Dfreetype=enabled \ -Dglib=enabled \ -Dgobject=disabled \ -Dgraphite=disabled \ -Dicu=disabled \ -Dtests=disabled" unpack() { ${SCRIPTS}/get harfbuzz mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/harfbuzz/harfbuzz-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/graphics/lib32-libdrm/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-libdrm" PKG_VERSION="$(get_pkg_version libdrm)" PKG_NEED_UNPACK="$(get_pkg_directory libdrm)" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="http://dri.freedesktop.org" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-libpciaccess" PKG_PATCH_DIRS+=" $(get_pkg_directory libdrm)/patches" PKG_LONGDESC="The userspace interface library to kernel DRM services." PKG_TOOLCHAIN="meson" PKG_BUILD_FLAGS="lib32" get_graphicdrivers PKG_MESON_OPTS_TARGET="-Dnouveau=disabled \ -Domap=disabled \ -Dexynos=disabled \ -Dtegra=disabled \ -Dcairo-tests=disabled \ -Dman-pages=disabled \ -Dvalgrind=disabled \ -Dfreedreno-kgsl=false \ -Dinstall-test-programs=true \ -Dudev=false" unpack() { ${SCRIPTS}/get libdrm mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libdrm/libdrm-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_makeinstall_target() { # We don't need any binary, since we only want lib32 safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include safe_remove ${INSTALL}/usr/share mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/graphics/lib32-libpng/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-libpng" PKG_VERSION="$(get_pkg_version libpng)" PKG_NEED_UNPACK="$(get_pkg_directory libpng)" PKG_ARCH="aarch64" PKG_LICENSE="LibPNG2" PKG_SITE="http://www.libpng.org/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-zlib" PKG_PATCH_DIRS+=" $(get_pkg_directory libpng)/patches" PKG_LONGDESC="An extensible file format for the lossless, portable, well-compressed storage of raster images." PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="lib32 +pic +pic:host" PKG_CONFIGURE_OPTS_TARGET="ac_cv_lib_z_zlibVersion=yes \ --enable-static \ --enable-shared" unpack() { ${SCRIPTS}/get libpng mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libpng/libpng-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } pre_configure_target() { export CPPFLAGS="${CPPFLAGS} -I${SYSROOT_PREFIX}/usr/include" } post_makeinstall_target() { sed -e "s:\([\"'= ]\)/usr:\\1${SYSROOT_PREFIX}/usr:g" \ -e "s:libs=\"-lpng16\":libs=\"-lpng16 -lz\":g" \ -i ${SYSROOT_PREFIX}/usr/bin/libpng*-config safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/graphics/lib32-librga/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-librga" PKG_VERSION="$(get_pkg_version librga)" PKG_NEED_UNPACK="$(get_pkg_directory librga)" PKG_ARCH="aarch64" PKG_LICENSE="GNU" PKG_SITE="https://github.com/shantigilbert/linux-rga" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-libdrm" PKG_PATCH_DIRS+=" $(get_pkg_directory librga)/patches" PKG_LONGDESC="The RGA driver userspace" PKG_TOOLCHAIN="auto" PKG_BUILD_FLAGS="lib32" unpack() { ${SCRIPTS}/get librga mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/librga/librga-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/graphics/lib32-mali-bifrost/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-mali-bifrost" PKG_VERSION="$(get_pkg_version mali-bifrost)" PKG_NEED_UNPACK="$(get_pkg_directory mali-bifrost)" PKG_ARCH="aarch64" PKG_LICENSE="nonfree" PKG_SITE="https://github.com/emuelec/libmali" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-libdrm" PKG_LONGDESC="The Mali GPU library used in Rockchip Platform for Odroidgo Advance" PKG_PATCH_DIRS+=" $(get_pkg_directory mali-bifrost)/patches" PKG_BUILD_FLAGS="lib32" if [[ "${DEVICE}" =~ ^(OdroidGoAdvance|GameForce)$ ]]; then PKG_RK3326="yes" fi unpack() { ${SCRIPTS}/get mali-bifrost mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/mali-bifrost/mali-bifrost-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} if [ "${PKG_RK3326}" = "yes" ]; then unzip -o "${SOURCES}/mali-bifrost/rk3326_r13p0_gbm_with_vulkan_and_cl.zip" -d ${PKG_BUILD} fi safe_remove ${PKG_BUILD}/lib/aarch64-linux-gnu } makeinstall_target() { if [ "${PKG_RK3326}" = "yes" ]; then local BLOB="libmali.so_rk3326_gbm_arm32_r13p0_with_vulkan_and_cl" local LIBDIR=${INSTALL}/usr/lib32 else local BLOB="lib/arm-linux-gnueabihf/libmali-bifrost-g52-g2p0-gbm.so" local LIBDIR=${INSTALL}/usr/lib32/libmali mkdir -p ${INSTALL}/etc/profile.d # Add it after the existing LD_LIBRARY_PATH, to make sure /emuelec/libs are read before it echo 'export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/usr/lib32/libmali"' > ${INSTALL}/etc/profile.d/99-rk-mali-workaround.conf fi mkdir -p ${LIBDIR} \ ${SYSROOT_PREFIX}/usr/lib/pkgconfig \ ${SYSROOT_PREFIX}/usr/lib/include/KHR BLOB=${PKG_BUILD}/${BLOB} cp ${BLOB} ${LIBDIR}/libmali.so cp ${BLOB} ${SYSROOT_PREFIX}/usr/lib/libmali.so local LINK_LIST="libEGL.so \ libEGL.so.1 \ libgbm.so \ libgbm.so.1 \ libGLESv2.so \ libGLESv2.so.2 \ libGLESv3.so \ libGLESv3.so.3 \ libGLESv1_CM.so.1 \ libGLES_CM.so.1 \ libmali.so.1" local LINK_NAME for LINK_NAME in ${LINK_LIST}; do ln -sf libmali.so ${LIBDIR}/${LINK_NAME} ln -sf libmali.so ${SYSROOT_PREFIX}/usr/lib/${LINK_NAME} done cp -va ${PKG_BUILD}/.${TARGET_NAME}/meson-private/*.pc ${SYSROOT_PREFIX}/usr/lib/pkgconfig/ cp -rva ${PKG_BUILD}/include/* \ ${PKG_BUILD}/include/GBM/gbm.h \ ${SYSROOT_PREFIX}/usr/include/ cp -va ${PKG_BUILD}/include/KHR/mali_khrplatform.h ${SYSROOT_PREFIX}/usr/include/KHR/khrplatform.h } ================================================ FILE: packages/lib32/graphics/lib32-opengl-meson/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-opengl-meson" PKG_VERSION="$(get_pkg_version opengl-meson)" PKG_NEED_UNPACK="$(get_pkg_directory opengl-meson)" PKG_ARCH="aarch64" PKG_LICENSE="nonfree" PKG_SITE="http://openlinux.amlogic.com:8000/download/ARM/filesystem/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain opengl-meson" PKG_LONGDESC="OpenGL ES pre-compiled libraries for Mali GPUs found in Amlogic Meson SoCs." PKG_PATCH_DIRS+=" $(get_pkg_directory opengl-meson)/patches" PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="lib32" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib32 mkdir -p ${SYSROOT_PREFIX}/usr/lib local DIR_MESON="$(get_build_dir opengl-meson)" local DIR_ARM=${DIR_MESON}/lib/eabihf local SINGLE_LIBMALI='no' case "${DEVICE}" in Amlogic-ng) cp -p ${DIR_ARM}/gondul/r12p0/fbdev/libMali.so ${INSTALL}/usr/lib32/libMali.gondul.so cp -p ${DIR_ARM}/dvalin/r12p0/fbdev/libMali.so ${INSTALL}/usr/lib32/libMali.dvalin.so cp -p ${DIR_ARM}/m450/r7p0/fbdev/libMali.so ${INSTALL}/usr/lib32/libMali.m450.so cp -p ${DIR_ARM}/gondul/r12p0/fbdev/libMali.so ${SYSROOT_PREFIX}/usr/lib/ ;; Amlogic-old) cp -p ${DIR_ARM}/m450/r7p0/fbdev/libMali.so ${INSTALL}/usr/lib32/ cp -p ${DIR_ARM}/m450/r7p0/fbdev/libMali.so ${SYSROOT_PREFIX}/usr/lib/ SINGLE_LIBMALI='yes' ;; Amlogic-ne) cp -p ${DIR_ARM}/gondul/r25p0/fbdev/libMali.so ${INSTALL}/usr/lib32/libMali.gondul.so cp -p ${DIR_ARM}/dvalin/r25p0/fbdev/libMali.so ${INSTALL}/usr/lib32/libMali.dvalin.so cp -p ${DIR_ARM}/gondul/r25p0/fbdev/libMali.so ${SYSROOT_PREFIX}/usr/lib/ ;; Amlogic-no) cp -p "${DIR_ARM}/gondul/r25p0/fbdev/libMali-r1p0.so" "${INSTALL}/usr/lib32/libMali.gondul.so" cp -p ${DIR_ARM}/dvalin/r25p0/fbdev/libMali.so ${INSTALL}/usr/lib32/libMali.dvalin.so cp -p ${DIR_ARM}/valhall/r41p0/fbdev/libMali.so ${INSTALL}/usr/lib32/libMali.valhall.so cp -p ${DIR_ARM}/gondul/r25p0/fbdev/libMali.so ${SYSROOT_PREFIX}/usr/lib/ ;; *) echo "${PKG_NAME}: Trying to install for device ${DEVICE} when only Amlogic-ng, Amlogic-no, Amlogic-old and Amlogic-ne are supported" 1>&2 return 1 ;; esac if [[ "${SINGLE_LIBMALI}" == 'no' ]]; then ln -sf /var/lib32/libMali.so ${INSTALL}/usr/lib32/libMali.so fi local LINK_LIST="libmali.so \ libmali.so.0 \ libEGL.so \ libEGL.so.1 \ libEGL.so.1.0.0 \ libGLES_CM.so.1 \ libGLESv1_CM.so \ libGLESv1_CM.so.1 \ libGLESv1_CM.so.1.0.1 \ libGLESv1_CM.so.1.1 \ libGLESv2.so \ libGLESv2.so.2 \ libGLESv2.so.2.0 \ libGLESv2.so.2.0.0 \ libGLESv3.so \ libGLESv3.so.3 \ libGLESv3.so.3.0 \ libGLESv3.so.3.0.0" local LINK_NAME for LINK_NAME in ${LINK_LIST}; do ln -sf libMali.so ${INSTALL}/usr/lib32/${LINK_NAME} ln -sf libMali.so ${SYSROOT_PREFIX}/usr/lib/${LINK_NAME} done # install headers and libraries to TOOLCHAIN cp -rf ${DIR_MESON}/include/* ${SYSROOT_PREFIX}/usr/include cp -rf "$(get_build_dir opengl-meson)/lib/pkgconfig/"* ${SYSROOT_PREFIX}/usr/lib/pkgconfig cp ${SYSROOT_PREFIX}/usr/include/EGL_platform/platform_fbdev/* ${SYSROOT_PREFIX}/usr/include/EGL rm -rf ${SYSROOT_PREFIX}/usr/include/EGL_platform } ================================================ FILE: packages/lib32/lang/lib32-gcc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-gcc" PKG_VERSION="$(get_pkg_version gcc)" PKG_NEED_UNPACK="$(get_pkg_directory gcc)" PKG_ARCH="aarch64" PKG_LICENSE="GPL-2.0-or-later" PKG_URL="" PKG_DEPENDS_BOOTSTRAP="ccache:host autoconf:host lib32-binutils:host gmp:host mpfr:host mpc:host zstd:host" PKG_DEPENDS_HOST="ccache:host autoconf:host lib32-binutils:host gmp:host mpfr:host mpc:host zstd:host lib32-glibc" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_LONGDESC="This package contains the GNU Compiler Collection for multilib ARM." PKG_PATCH_DIRS+=" $(get_pkg_directory gcc)/patches" GCC_COMMON_CONFIGURE_OPTS="--target=${LIB32_TARGET_NAME} \ --with-sysroot=${LIB32_SYSROOT_PREFIX} \ --with-gmp=${TOOLCHAIN} \ --with-mpfr=${TOOLCHAIN} \ --with-mpc=${TOOLCHAIN} \ --with-zstd=${TOOLCHAIN} \ --with-gnu-as \ --with-gnu-ld \ --enable-plugin \ --enable-lto \ --enable-gold \ --enable-ld=default \ --with-linker-hash-style=gnu \ --disable-multilib \ --disable-nls \ --enable-checking=release \ --without-ppl \ --without-cloog \ --disable-libada \ --disable-libmudflap \ --disable-libitm \ --disable-libquadmath \ --disable-libmpx \ --disable-libssp \ --enable-__cxa_atexit" PKG_CONFIGURE_OPTS_BOOTSTRAP="${GCC_COMMON_CONFIGURE_OPTS} \ --enable-cloog-backend=isl \ --disable-decimal-float \ --disable-gcov \ --enable-languages=c \ --disable-libatomic \ --disable-libgomp \ --disable-libsanitizer \ --disable-shared \ --disable-threads \ --without-headers \ --with-newlib \ ${LIB32_TARGET_ARCH_GCC_OPTS}" PKG_CONFIGURE_OPTS_HOST="${GCC_COMMON_CONFIGURE_OPTS} \ --enable-languages=c,c++ \ --enable-libatomic \ --enable-decimal-float \ --enable-tls \ --enable-shared \ --disable-static \ --enable-long-long \ --enable-threads=posix \ --disable-libstdcxx-pch \ --enable-libstdcxx-time \ --enable-clocale=gnu \ ${LIB32_TARGET_ARCH_GCC_OPTS}" unpack() { ${SCRIPTS}/get gcc mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/gcc/gcc-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_makeinstall_bootstrap() { GCC_VERSION=$(${TOOLCHAIN}/bin/${LIB32_TARGET_NAME}-gcc -dumpversion) DATE="0401$(echo ${GCC_VERSION} | sed 's/\./0/g')" CROSS_CC=${LIB32_TARGET_PREFIX}gcc-${GCC_VERSION} rm -f ${LIB32_TARGET_PREFIX}gcc cat > ${LIB32_TARGET_PREFIX}gcc < ${LIB32_TARGET_PREFIX}gcc < ${LIB32_TARGET_PREFIX}g++ < ``/storage/.config/emuelec/lib32``, writable - ``/emuelec/lib`` => ``/storage/.config/emuelec/lib``, writable - 99-rk-mali-workaround.conf (only on OdroidM1 and RK356x) - ``/usr/lib32/libmali``, read-only - Any path defined in ``ld.so.conf`` and ``ld.so.conf.d/*.conf``, *.conf files indexed in alphabetical order. Indexed in ``ld.so.cache`` (fast) - gcc-lib32.conf - ``/usr/lib32``, read-only - pulseaudio.conf - ``/usr/lib32/pulseaudio``, read-only - ``/usr/lib/pulseaudio``, read-only - Built-in path. Indexed in ``ld.so.cache`` (fast) - ``/usr/lib``, read-only If user wants to overwrite a certain library or provide additional libraries, they can achieve this in one of the following way: - Place it under ``/emuelec/lib32`` or ``/emuelec/lib``. **The libraries will be applied system-wide, not only for your user session(SSH/service)** - Place it anywhere else, and add the path to ``LD_LIBRARY_PATH``, this is suggested if the path is not indexed by ``ld.so.cache``, and you only want to use these libraries for a specific program/user session. Do note this is slow to lookup so don't add too many libraries. - **Do not add the paths that's already indexed by ``ld.so.cache`` to ``LD_LIBRARY_PATH``, unless you want to re-write the lookup order, as this will significantly slows down the lookup speed** - Bad practice: (most paths in the following ``LD_LIBRARY_PATH`` is already indexed by ``ld.so.cache`` and this just adds meaningless search time) ``LD_LIBRARY_PATH=/emuelec/lib32:/emuelec/lib:/usr/lib32/pulseaudio:/usr/lib/pulseaudio:/usr/lib32:/usr/lib`` ## Daemons The systemd unit ``ldconfig.service`` is what made it possible to drop ``LD_LIBRARY_PATH`` for the system-wide "static" libraries stored under ``/usr/lib`` and ``/usr/lib32`` (note it is still supported for out-of-tree paths like when you load ports, and the LD_LIBRARY_PATH is still used for ``/emuelec/libs``). The ``ldconfig.service`` will refresh ``ld.so.cache`` every time EmuELEC boots, you can also manually run it with ``systemctl restart ldconfig`` or ``ldconfig -vX`` to refresh the cache. ## Image layout The following part is different from non-multilib images, if ``lib32-essential`` is installed - ``/etc/`` - ``ld.so.conf`` ```` include /etc/ld.so.conf.d/*.conf ```` - ``ld.so.conf.d/`` - ``lib32-glibc.conf`` ```` /usr/lib32 ```` - ``pulseaudio.conf`` ```` /usr/lib32/pulseaudio /usr/lib/pulseaudio ```` - ``/usr/`` - ``bin/`` - ``ldconfig`` The binary to create ld cache - ``lib/systemd/system`` - ``ldconfig.service`` The systemd unit to rebuild ld cache on boot - ``/storage/.cache/ld.so.cache`` Actual ld cache The ``ld.so.conf`` and ``ld.so.conf.d`` are very similar to those you will find on standard Linux distros like ArchLinux, Debian, Ubuntu, etc, even they will have some differences. A Big difference is that we keep ``ld.so.cache`` at ``/storage/.cache/`` instead of ``/etc/`` since on EmuELEC ``/etc/`` is read-only. ## Package requirement To add packages here, the following requirement must be met: ### Variables ***Variable scope*** - Since the **lib32** flag is checked before setup_toolchian() and any package-specific functions are called, and after the package is read, outside of functions the variables ``TARGET_NAME``, ``SYSROOT_PREFIX``, etc will still be the same as generic 64, since ``use_32_options()`` is not called yet. - Outside of functions, LIB32_ prefixed variables should be used to get 32bit target infos, and no prefix variables should be used to get 64bit target infos - Inside of functions, LIB64_ prefixed variables hould be used to get 64bit target infos, and no prefix/Lib32_ prefixed variables should be used to get 32bit target infos **PKG_NAME** - Packages should use a **lib32-** prefixed name, even it will still work without, this will help to distinguish the package from other generic pacakges **PKG_VERSION** - If the package has a corresponding generic version, the lib32 one must have the same version as the generic one, this can be set with ``PKG_VERSION=$(get_pkg_version generic-pkg)`` - Otherwise, use the actual one. **PKG_NEED_UNPACK** - If the package relies on another package (e.g. it uses ``PKG_VERSION=$(get_pkg_version generic-pkg)``) then PKG_NEED_UNPACK must be set as well in order for it to update when doing dirty builds, this can be set with ``PKG_NEED_UNPACK="$(get_pkg_directory generic-pkg)`` **PKG_ARCH** - The arch **must** be **aarch64**, to avoid building it in singlelib 32-bit builds. **PKG_URL** - If a corresponding generic package exists, then the package should **not** have its own source and URL should be **empty** (explicitly set it empty with ``PKG_URL=""``) - If so, it should use the **same source** as the generic version and a custom ``unpack()`` function should extract it from the corresponding generic package's source. This saves time and disk space. **PKG_DEPENDS** - ``lib32-toolchain`` must be depended on for target packages, other libraries, if lib32, should also be adapted, be careful of these special packages: - systemd -> lib32-systemd-libs (since we only build ``libudev.so`` and ``libsystemd.so``) - pulseaudio -> lib32-libpulse (since we only build libraries) - linux:host -> lib32-linux-headers (no host) (since we only install headers to toolchain) The corresponding generic package should be depended on if the lib32 version does not provide configs/binaries where the generic version would. E.g. lib32-retroarch depends on retroarch, as lib32-retroarch only provides binary ``/usr/bin/retroarch32`` and expects configs/libraries installed by retroarch. **PKG_PATCH_DIRS** - At least ``$(get_pkg_directory generic-pkg)/patches`` should be added so the lib32 version can also be patched if the generic version is patched **PKG_BUILD_FLAGS** - Unless it's a bootstrap package, the ``lib32`` or ``lib32:[target]`` flag must be set in ``PKG_BUILD_FLAGS``. Usually install-only packages don't need this flag, such as ``lib32-nold``, ``lib32-ldconfig``, etc ### Functions **unpack()** - Unless there's no corresponding generic version, the lib32-pkg should extract source from the generic version with a custom function like this: Archive ```` unpack() { ${SCRIPTS}/get generic-pkg mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/generic-pkg/generic-pkg-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } ```` Git ```` unpack() { ${SCRIPTS}/get generic-pkg mkdir -p ${PKG_BUILD} tar cf - -C ${SOURCES}/generic-pkg/generic-pkg-${PKG_VERSION} ${PKG_TAR_COPY_OPTS} . | tar xf - -C ${PKG_BUILD} } ```` The reason we don't use ``{SCRIPTS}/unpack generic-pkg ${PKG_BUILD}`` is that it will also apply patches from generic-pkg, which is not always what we want, and this may introduce recursive patches. And I want to keep the changes made to the build system as minumum as possible. **makeinstall_target()** - Since we use ``/usr/lib32`` as actual multilib path, manual tweaks are needed when installing the package - For SYSROOT installation, libraries still go to ``/usr/lib``, this is for the ease of toolchain lookup - For target image installation, libraries should go to ``/usr/lib32``. If this is not possible, then it can still go to ``/usr/lib``, and you can mv it to ``/usr/lib32`` in ``post_makeinstall_target()``. The exception is 32bit libretro cores, they should go to ``/usr/lib/libretro``, with **32b** in their name **post_makeinstall_target()** - For most packages, since we only need the libraries, everything outside of ``/usr/lib``(if makeinstall_target() can't be manipulated) or ``/usr/lib32`` (if makeinstall_target() can be manipulated) should be removed, these remove should be done with ``safe_remove``, and then ``/usr/lib`` should be moved to ``/usr/lib32`` if needed ## Structure All pacakges under this folder should have the similiar parent folders as the outer packages folder, especially the same as their corresponding universal pacakge, these are the examples: - toolchain (virual/toolchain) => lib32-toolchain (lib32/virtual/toolchain) - gcc (lang) => lib32-gcc (lib32/lang/lib32-gcc) - box86 (sx05re/emulators/box86) => lib32-box86 (lib32/sx05re/emulators/lib32-box86) But there's still exceptions that're allowed here: - If its corresponding generic version is placed deeply in ``sx05re``, it can be moved to to ``emuelec``, or other corresponding greater types. For the ease of looking up. E.g. - ``sx05re/tools/SDL2/SDL2_mixer`` => ``lib32/audio/lib32-SDL2_mixer`` - ``sx05re/libretro/mupen64plus`` => ``lib32/emuelec/libretro/lib32-mupen64plus`` - If it's a project/device-specific package, it can be moved to meaningful greater types. E.g. - ``projects/Amlogic-ce/devices/Amlogic-ng/packages/opengl-meson`` => ``lib32/graphics/lib32-opengl-meson``. Note this package also combines the ``opengl-meson`` from ``Amlogic-old`` device - ``projects/Rockchip/packages/libgo2`` => ``lib32/sysutils/lib32-libgo2`` ## Contribution When copying/moving existing packages under this package, you should use either of the following command to keep the commit history: - ``git mv parent/package lib32/parent/lib32-package`` - ``git cp parent/package lib32/parent/lib32-package`` (provided by git-extras, although it seems broken for me) In the header, please keep the older contributors and then add your name like the others # Port to other projects ## Dependency If you just copy/paste these packages to other projects blindly, **they won't build!!!** They'll most likely corrupt your build folder and toolchain which can only be rescued by ``make clean`` These packages will only work with a build system that recognizes the PKG_BUILD_FLAGS ``lib32`` and/or ``lib32:[target]``, if you come from other distros and want to port these packages, the following part in the build system must also be ported, i.e. these are also what made it possible to build them in EmuELEC itself: - ``config/options32`` adds a series of ``LIB32_`` and ``LIB64_`` prefixed variables - ``config/options`` adds a check to invoke ``config/options32`` for ``aarch64`` build - ``config/functions`` adds a function ``use_32_options()`` to replace key variables to 32-bit versions - ``scripts/build`` adds a check before ``setup_toolchain()`` that'll call ``use_32_options()`` if a flag ``lib32`` or ``lib32:[target]`` is detected - ``scripts/install`` adds two more folders to exclude when installing packages (not essential) - ``glibc`` should be patched to use ``/storage/.cache/ld.so.cache`` instead of ``/etc/ld.so.cache`` for ``LD_SO_CACHE`` Additionally, these changes expect a build system that has the changes introduced in [the PR](https://github.com/LibreELEC/LibreELEC.tv/pull/4042) that's merged in upstream LibreELEC in 2019, and EmuELEC's build system didn't have these changes until Oct, 2021. I haven't tested if this will work with an older build system, so you should pay attention if you want to make these changes work in your project's build system. ================================================ FILE: packages/lib32/security/lib32-gnutls/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-gnutls" PKG_VERSION="$(get_pkg_version gnutls)" PKG_NEED_UNPACK="$(get_pkg_directory gnutls)" PKG_ARCH="aarch64" PKG_LICENSE="LGPL2.1" PKG_SITE="https://gnutls.org" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-libidn2 lib32-nettle lib32-zlib" PKG_PATCH_DIRS+=" $(get_pkg_directory gnutls)/patches" PKG_LONGDESC="A library which provides a secure layer over a reliable transport layer." PKG_BUILD_FLAGS="lib32" PKG_CONFIGURE_OPTS_TARGET="--disable-doc \ --disable-full-test-suite \ --disable-guile \ --disable-libdane \ --disable-padlock \ --disable-rpath \ --disable-tests \ --disable-tools \ --disable-valgrind-tests \ --with-idn \ --with-included-libtasn1 \ --with-included-unistring \ --without-p11-kit \ --without-tpm" unpack() { ${SCRIPTS}/get gnutls mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/gnutls/gnutls-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/security/lib32-nettle/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-nettle" PKG_VERSION="$(get_pkg_version nettle)" PKG_NEED_UNPACK="$(get_pkg_directory nettle)" PKG_ARCH="aarch64" PKG_LICENSE="GPL2" PKG_SITE="http://www.lysator.liu.se/~nisse/nettle" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-gmp" PKG_PATCH_DIRS+=" $(get_pkg_directory nettle)/patches" PKG_LONGDESC="A low-level cryptographic library." PKG_BUILD_FLAGS="lib32" PKG_CONFIGURE_OPTS_TARGET="--disable-documentation \ --disable-openssl" if target_has_feature neon; then PKG_CONFIGURE_OPTS_TARGET+=" --enable-arm-neon" fi unpack() { ${SCRIPTS}/get nettle mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/nettle/nettle-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/security/lib32-openssl/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-openssl" PKG_VERSION="$(get_pkg_version openssl)" PKG_NEED_UNPACK="$(get_pkg_directory openssl)" PKG_ARCH="aarch64" PKG_LICENSE="Apache-2.0" PKG_SITE="https://www.openssl.org" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_PATCH_DIRS+=" $(get_pkg_directory openssl)/patches" PKG_LONGDESC="The Open Source toolkit for Secure Sockets Layer and Transport Layer Security" PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="lib32" PKG_CONFIGURE_OPTS_TARGET="--prefix=/usr \ --openssldir=/etc/ssl --libdir=lib \ shared \ threads \ no-ec2m \ no-md2 \ no-rc5 \ no-rfc3779 \ no-sctp \ no-ssl-trace \ no-ssl3 \ no-unit-test \ no-weak-ssl-ciphers \ no-zlib \ no-zlib-dynamic \ no-static-engine \ linux-armv4" unpack() { ${SCRIPTS}/get openssl mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/openssl/openssl-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } post_unpack() { find ${PKG_BUILD}/apps -type f | xargs -n 1 -t sed 's|./demoCA|/etc/ssl|' -i } pre_configure_target() { mkdir -p ${PKG_BUILD}/.${TARGET_NAME} cp -a ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME}/ } configure_target() { cd ${PKG_BUILD}/.${TARGET_NAME} ./Configure ${PKG_CONFIGURE_OPTS_TARGET} ${CFLAGS} ${LDFLAGS} } makeinstall_target() { make DESTDIR=${INSTALL} install_sw make DESTDIR=${SYSROOT_PREFIX} install_sw } post_makeinstall_target() { safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/sysutils/lib32-dbus/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-dbus" PKG_VERSION="$(get_pkg_version dbus)" PKG_NEED_UNPACK="$(get_pkg_directory dbus)" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="https://dbus.freedesktop.org" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-expat lib32-systemd-libs" PKG_PATCH_DIRS+=" $(get_pkg_directory dbus)/patches" PKG_LONGDESC="D-Bus is a message bus, used for sending messages between applications." PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="lib32" PKG_CONFIGURE_OPTS_TARGET="export ac_cv_have_abstract_sockets=yes \ --with-sysroot=${LIB32_SYSROOT_PREFIX} \ --libexecdir=/usr/lib/dbus \ --disable-verbose-mode \ --disable-asserts \ --enable-checks \ --disable-tests \ --disable-ansi \ --disable-xml-docs \ --disable-doxygen-docs \ --disable-x11-autolaunch \ --disable-selinux \ --disable-libaudit \ --enable-systemd \ --enable-inotify \ --without-valgrind \ --without-x \ --with-dbus-user=dbus \ --runstatedir=/run \ --with-system-socket=/run/dbus/system_bus_socket" unpack() { ${SCRIPTS}/get dbus mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/dbus/dbus-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/etc safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include safe_remove ${INSTALL}/usr/share mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/sysutils/lib32-libevdev/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-libevdev" PKG_VERSION="$(get_pkg_version libevdev)" PKG_NEED_UNPACK="$(get_pkg_directory libevdev)" PKG_ARCH="aarch64" PKG_LICENSE="MIT" PKG_SITE="http://www.freedesktop.org/wiki/Software/libevdev/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_PATCH_DIRS+=" $(get_pkg_directory libevdev)/patches" PKG_LONGDESC="libevdev is a wrapper library for evdev devices." PKG_BUILD_FLAGS="lib32 +pic" PKG_TOOLCHAIN="meson" PKG_MESON_OPTS_TARGET=" \ -Ddefault_library=shared \ -Ddocumentation=disabled \ -Dtests=disabled" unpack() { ${SCRIPTS}/get libevdev mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libevdev/libevdev-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/sysutils/lib32-libgo2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-libgo2" PKG_VERSION="$(get_pkg_version libgo2)" PKG_NEED_UNPACK="$(get_pkg_directory libgo2)" PKG_ARCH="aarch64" PKG_LICENSE="LGPL" PKG_SITE="https://github.com/OtherCrashOverride/libgo2" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-libevdev lib32-librga lib32-libpng lib32-openal-soft lib32-${OPENGLES}" PKG_PATCH_DIRS+=" $(get_pkg_directory libgo2)/patches" PKG_LONGDESC="Support library for the ODROID-GO Advance " PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="lib32" if [ "${DEVICE}" = "GameForce" ]; then PKG_PATCH_DIRS+=" ${PROJECT_DIR}/Rockchip/devices/GameForce/patches/libgo2" fi PKG_MAKE_OPTS_TARGET="config=release ARCH= INCLUDES=-I${LIB32_SYSROOT_PREFIX}/usr/include/libdrm -I${LIB32_SYSROOT_PREFIX}/usr/include" unpack() { ${SCRIPTS}/get libgo2 mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libgo2/libgo2-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib32 \ ${SYSROOT_PREFIX}/usr/include/go2 \ ${SYSROOT_PREFIX}/usr/lib cp libgo2.so ${INSTALL}/usr/lib32/ cp src/*.h ${SYSROOT_PREFIX}/usr/include/go2/ cp libgo2.so ${SYSROOT_PREFIX}/usr/lib/ } ================================================ FILE: packages/lib32/sysutils/lib32-libusb/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-libusb" PKG_VERSION="$(get_pkg_version libusb)" PKG_NEED_UNPACK="$(get_pkg_directory libusb)" PKG_ARCH="aarch64" PKG_LICENSE="LGPLv2.1" PKG_SITE="http://libusb.info/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-systemd-libs" PKG_PATCH_DIRS+=" $(get_pkg_directory libusb)/patches" PKG_LONGDESC="The libusb project's aim is to create a Library for use by user level applications to USB devices." PKG_BUILD_FLAGS="lib32" PKG_CONFIGURE_OPTS_TARGET="--enable-shared \ --enable-static \ --disable-log \ --disable-debug-log \ --enable-udev \ --disable-examples-build" unpack() { ${SCRIPTS}/get libusb mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libusb/libusb-${PKG_VERSION}.tar.bz2 -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/sysutils/lib32-systemd-libs/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-systemd-libs" PKG_VERSION="$(get_pkg_version systemd)" PKG_NEED_UNPACK="$(get_pkg_directory systemd)" PKG_ARCH="aarch64" PKG_LICENSE="LGPL2.1+" PKG_SITE="http://www.freedesktop.org/wiki/Software/systemd" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain Jinja2:host lib32-libcap lib32-util-linux" SD_DIRECTORY="$(get_pkg_directory systemd)" PKG_PATCH_DIRS+=" ${SD_DIRECTORY}/patches" PKG_LONGDESC="A system and session manager for Linux, compatible with SysV and LSB init scripts." PKG_BUILD_FLAGS="lib32" if [ "${DEVICE}" = "Amlogic-old" ]; then PKG_PATCH_DIRS+=" ${SD_DIRECTORY}/patches/amlogic" fi PKG_MESON_OPTS_TARGET="--libdir=/usr/lib \ -Drootprefix=/usr \ -Dsplit-usr=false \ -Dsplit-bin=true \ -Ddefault-hierarchy=unified \ -Dtty-gid=5 \ -Dtests=false \ -Dseccomp=false \ -Dselinux=false \ -Dapparmor=false \ -Dpolkit=false \ -Dacl=false \ -Daudit=false \ -Dblkid=true \ -Dkmod=false \ -Dpam=false \ -Dmicrohttpd=false \ -Dlibcryptsetup=false \ -Dlibcurl=false \ -Dlibidn=false \ -Dlibidn2=false \ -Dlibiptc=false \ -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 \ -Dimportd=false \ -Dremote=false \ -Dutmp=true \ -Dhibernate=false \ -Denvironment-d=false \ -Dbinfmt=false \ -Dcoredump=false \ -Dresolve=false \ -Dlogind=true \ -Dhostnamed=true \ -Dlocaled=false \ -Dmachined=false \ -Dportabled=false \ -Dnetworkd=false \ -Dtimedated=false \ -Dtimesyncd=true \ -Dfirstboot=false \ -Drandomseed=false \ -Dbacklight=false \ -Dvconsole=false \ -Dquotacheck=false \ -Dsysusers=false \ -Dtmpfiles=true \ -Dhwdb=true \ -Drfkill=false \ -Dldconfig=false \ -Defi=false \ -Dtpm=false \ -Dima=false \ -Dsmack=false \ -Dgshadow=false \ -Didn=false \ -Dnss-myhostname=false \ -Dnss-mymachines=false \ -Dnss-resolve=false \ -Dnss-systemd=false \ -Dman=false \ -Dhtml=false \ -Dlink-udev-shared=true \ -Dlink-systemctl-shared=true \ -Dbashcompletiondir=no \ -Dzshcompletiondir=no \ -Dkmod-path=/usr/bin/kmod \ -Dmount-path=/usr/bin/mount \ -Dumount-path=/usr/bin/umount \ -Ddebug-tty=${DEBUG_TTY} \ -Dpkgconfigdatadir=/usr/lib/pkgconfig \ -Dversion-tag=${PKG_VERSION}" if [ "${DEVICE}" != "Amlogic-old" ]; then PKG_MESON_OPTS_TARGET+=" -Dfdisk=false \ -Dhomed=false \ -Dlink-networkd-shared=false \ -Dp11kit=false \ -Dpwquality=false \ -Drepart=false \ -Duserdb=false" fi unpack() { ${SCRIPTS}/get systemd mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/systemd/systemd-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } pre_configure_target() { export TARGET_CFLAGS="${TARGET_CFLAGS} -fno-schedule-insns -fno-schedule-insns2 -Wno-format-truncation" export LC_ALL=en_US.UTF-8 } make_target() { local LIBSYSTEMD_VERSION=$(grep "^libsystemd_version = '[0-9]\+\.[0-9]\+\.[0-9]\+'" "${PKG_BUILD}/meson.build" | awk -F "'" '{print $2}') local LIBUDEV_VERSION=$(grep "^libudev_version = '[0-9]\+\.[0-9]\+\.[0-9]\+'" "${PKG_BUILD}/meson.build" | awk -F "'" '{print $2}') if [ "${DEVICE}" = "Amlogic-old" ]; then LIBUDEV_TARGET=src/udev/libudev.so.${LIBUDEV_VERSION} local PC_TARGETS="" else LIBUDEV_TARGET=libudev.so.${LIBUDEV_VERSION} local PC_TARGETS="src/libudev/libudev.pc \ src/libsystemd/libsystemd.pc" fi LIBSYSTEMD_TARGET=libsystemd.so.${LIBSYSTEMD_VERSION} ninja ${NINJA_OPTS} ${LIBUDEV_TARGET} \ ${LIBSYSTEMD_TARGET} \ ${PC_TARGETS} ${TARGET_PREFIX}strip ${LIBUDEV_TARGET} \ ${LIBSYSTEMD_TARGET} } makeinstall_target() { mkdir -p "${INSTALL}/usr/lib32" mkdir -p "${SYSROOT_PREFIX}/usr/lib" local i for i in ${LIBUDEV_TARGET%%.so*}.so* ${LIBSYSTEMD_TARGET%%.so*}.so*; do if [ "${i: -1}" = 'p' ]; then continue fi cp -va "${i}" "${INSTALL}/usr/lib32/" cp -va "${i}" "${SYSROOT_PREFIX}/usr/lib/" done mkdir -p "${SYSROOT_PREFIX}/usr/include/systemd" cp -va "../src/libudev/libudev.h" "${SYSROOT_PREFIX}/usr/include/" cp -va "../src/systemd/_sd-common.h" "${SYSROOT_PREFIX}/usr/include/systemd/" for i in bus-protocol \ bus-vtable \ bus \ daemon \ device \ event \ hwdb \ id128 \ journal \ login \ messages \ path; do cp -va "../src/systemd/sd-${i}.h" "${SYSROOT_PREFIX}/usr/include/systemd/" done mkdir -p "${SYSROOT_PREFIX}/usr/lib/pkgconfig" cp -va "src/libudev/libudev.pc" "src/libsystemd/libsystemd.pc" "${SYSROOT_PREFIX}/usr/lib/pkgconfig/" } ================================================ FILE: packages/lib32/sysutils/lib32-util-linux/package.mk ================================================ # 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) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-util-linux" PKG_VERSION="$(get_pkg_version util-linux)" PKG_NEED_UNPACK="$(get_pkg_directory util-linux)" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_PATCH_DIRS+=" $(get_pkg_directory util-linux)/patches" PKG_LONGDESC="A large variety of low-level system utilities that are necessary for a Linux system to function." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic:host lib32" PKG_CONFIGURE_OPTS_TARGET="--disable-gtk-doc \ --disable-nls \ --disable-rpath \ --enable-tls \ --enable-chsh-only-listed \ --disable-bash-completion \ --disable-colors-default \ --disable-pylibmount \ --disable-pg-bell \ --disable-use-tty-group \ --disable-makeinstall-chown \ --disable-makeinstall-setuid \ --with-gnu-ld \ --without-selinux \ --without-audit \ --without-udev \ --without-ncurses \ --without-ncursesw \ --without-readline \ --without-slang \ --without-tinfo \ --without-utempter \ --without-util \ --without-libz \ --without-user \ --without-systemd \ --without-smack \ --without-python \ --without-systemdsystemunitdir \ --disable-all-programs \ --enable-libblkid \ --enable-libmount" unpack() { ${SCRIPTS}/get util-linux mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/util-linux/util-linux-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/textproc/lib32-expat/package.mk ================================================ # 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) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-expat" PKG_VERSION="$(get_pkg_version expat)" PKG_NEED_UNPACK="$(get_pkg_directory expat)" PKG_LICENSE="OSS" PKG_SITE="http://expat.sourceforge.net/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_PATCH_DIRS+=" $(get_pkg_directory expat)/patches" PKG_LONGDESC="Expat is an XML parser library written in C." PKG_BUILD_FLAGS="lib32" PKG_CMAKE_OPTS_TARGET="-DEXPAT_BUILD_DOCS=OFF \ -DEXPAT_BUILD_TOOLS=OFF \ -DEXPAT_BUILD_EXAMPLES=OFF \ -DEXPAT_BUILD_TESTS=OFF \ -DEXPAT_SHARED_LIBS=ON" unpack() { ${SCRIPTS}/get expat mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/expat/expat-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/textproc/lib32-libidn2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-libidn2" PKG_VERSION="$(get_pkg_version libidn2)" PKG_NEED_UNPACK="$(get_pkg_directory libidn2)" PKG_ARCH="aarch64" PKG_LICENSE="LGPL3" PKG_SITE="https://www.gnu.org/software/libidn/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_PATCH_DIRS+=" $(get_pkg_directory libidn2)/patches" PKG_LONGDESC="Free software implementation of IDNA2008, Punycode and TR46." PKG_BUILD_FLAGS="lib32" PKG_CONFIGURE_OPTS_TARGET="--disable-doc \ --enable-shared \ --disable-static" unpack() { ${SCRIPTS}/get libidn2 mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libidn2/libidn2-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } post_makeinstall_target() { safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/textproc/lib32-libxml2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-libxml2" PKG_VERSION="$(get_pkg_version libxml2)" PKG_NEED_UNPACK="$(get_pkg_directory libxml2)" PKG_ARCH="aarch64" PKG_LICENSE="MIT" PKG_SITE="http://xmlsoft.org" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-zlib" PKG_PATCH_DIRS+=" $(get_pkg_directory libxml2)/patches" PKG_LONGDESC="The libxml package contains an XML library, which allows you to manipulate XML files." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="lib32" PKG_CONFIGURE_OPTS_TARGET="ac_cv_header_ansidecl_h=no \ --enable-static \ --enable-shared \ --disable-silent-rules \ --enable-ipv6 \ --without-lzma \ --with-zlib=${LIB32_SYSROOT_PREFIX}/usr \ --without-python \ --with-sysroot=${LIB32_SYSROOT_PREFIX}" unpack() { ${SCRIPTS}/get libxml2 mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libxml2/libxml2-${PKG_VERSION}.tar.bz2 -C ${PKG_BUILD} } post_makeinstall_target() { sed -e "s:\(['= ]\)/usr:\\1${SYSROOT_PREFIX}/usr:g" -i ${SYSROOT_PREFIX}/usr/bin/xml2-config safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include safe_remove ${INSTALL}/usr/share mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/textproc/lib32-tre/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-tre" PKG_VERSION="$(get_pkg_version tre)" PKG_NEED_UNPACK="$(get_pkg_directory tre)" PKG_ARCH="aarch64" PKG_SITE="https://github.com/laurikari/tre" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_PATCH_DIRS+=" $(get_pkg_directory tre)/patches" PKG_SHORTDESC="The approximate regex matching library and agrep command line tool." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="lib32" unpack() { ${SCRIPTS}/get tre mkdir -p ${PKG_BUILD} tar cf - -C ${SOURCES}/tre/tre-${PKG_VERSION} ${PKG_TAR_COPY_OPTS} . | tar xf - -C ${PKG_BUILD} } pre_configure_target() { sed -i "s|AM_GNU_GETTEXT_VERSION(0.17)|AM_GNU_GETTEXT_REQUIRE_VERSION(0.17)|" ${PKG_BUILD}/configure.ac } post_makeinstall_target() { safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/tools/lib32-ldconfig/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-ldconfig" PKG_VERSION="1" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="https://www.gnu.org/software/libc/" PKG_URL="" PKG_DEPENDS_TARGET="glibc" PKG_LONGDESC="ldconfig binary and service" PKG_NEED_UNPACK+=" $(get_pkg_directory glibc)" PKG_TOOLCHAIN="manual" make_target() { # Nah, we don't build it, just steal it from glibc cp "$(get_build_dir glibc)/.${TARGET_NAME}/elf/ldconfig" ${PKG_BUILD}/ldconfig ${TARGET_PREFIX}strip ${PKG_BUILD}/ldconfig } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -ra ${PKG_BUILD}/ldconfig ${INSTALL}/usr/bin/ } post_install() { enable_service ldconfig.service } ================================================ FILE: packages/lib32/tools/lib32-ldconfig/system.d/ldconfig.service ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) [Unit] Description=Rebuild Dynamic Linker Cache On Bootup After=local-fs.target libmali.service Before=ldconfig.path [Service] Type=oneshot ExecStart=/usr/bin/ldconfig -X [Install] WantedBy=multi-user.target ================================================ FILE: packages/lib32/tools/lib32-nold/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-nold" PKG_ARCH="aarch64" PKG_VERSION="1" PKG_URL="" PKG_DEPENDS_TARGET="busybox pulseaudio" PKG_LONGDESC="Remove LD_LIBRARY_PATH since we don't need them" PKG_TOOLCHAIN="manual" post_install() { DIR_PROFILE=${BUILD}/image/system/etc/profile.d safe_remove ${DIR_PROFILE}/99-pulseaudio.conf sed -i "/^export LD_LIBRARY_PATH/d" ${DIR_PROFILE}/98-busybox.conf } ================================================ FILE: packages/lib32/virtual/lib32-essential/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-essential" PKG_VERSION="" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="https://emuelec.org" PKG_DEPENDS_TARGET="lib32-toolchain lib32-binutils lib32-gcc lib32-ldconfig lib32-nold" # lib32-binutils adds multilib support (/etc/ld.so.conf, and a link under /usr/lib to point to the ld-linux-armhf.so.3 under /usr/lib32) # lib32-gcc adds stdc++ library, and lib32 config (/etc/ld.so.conf.d/lib32-gcc.conf, so /usr/lib32 will be searched by ld) # lib32-ldconfig adds ldconfig binary, and ldconfig systemd units # lib32-nold removes the LD_LIBRARY_PATH set by busybox and pulseaudio PKG_SECTION="virtual" PKG_LONGDESC="Root package used to build and create complete image" ================================================ FILE: packages/lib32/virtual/lib32-toolchain/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present 7Ji (https://github/com/7Ji) PKG_NAME="lib32-toolchain" PKG_VERSION="" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="https://emuelec.org" PKG_URL="" PKG_DEPENDS_TARGET="toolchain lib32-gcc:host" PKG_SECTION="virtual" PKG_LONGDESC="EmuELEC toolchain to compile lib32 packages" ================================================ FILE: packages/lib32/x11/lib/lib32-libpciaccess/package.mk ================================================ # 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) # Copyright (C) 2022-present 7Ji () PKG_NAME="lib32-libpciaccess" PKG_VERSION="$(get_pkg_version libpciaccess)" PKG_NEED_UNPACK="$(get_pkg_directory libpciaccess)" PKG_LICENSE="OSS" PKG_SITE="http://freedesktop.org" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-util-macros lib32-zlib" PKG_LONGDESC="X.org libpciaccess library." PKG_PATCH_DIRS+=" $(get_pkg_directory libpciaccess)/patches" PKG_BUILD_FLAGS="lib32" PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="ac_cv_header_asm_mtrr_h=set \ --with-pciids-path=/usr/share \ --with-zlib " unpack() { ${SCRIPTS}/get libpciaccess mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libpciaccess/libpciaccess-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } pre_configure_target() { CFLAGS+=" -D_LARGEFILE64_SOURCE" } post_makeinstall_target() { safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/x11/lib/lib32-pixman/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-pixman" PKG_VERSION="$(get_pkg_version pixman)" PKG_NEED_UNPACK="$(get_pkg_directory pixman)" PKG_ARCH="aarch64" PKG_LICENSE="OSS" PKG_SITE="http://www.x.org/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-util-macros" PKG_PATCH_DIRS+=" $(get_pkg_directory pixman)/patches" PKG_LONGDESC="Pixman is a generic library for manipulating pixel regions, contains low-level pixel manipulation routines." PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="lib32" PKG_CONFIGURE_OPTS_TARGET="--disable-openmp \ --disable-loongson-mmi \ --disable-mmx \ --disable-sse2 \ --disable-vmx \ --enable-arm-simd \ --enable-arm-neon \ --disable-arm-iwmmxt \ --disable-mips-dspr2 \ --enable-gcc-inline-asm \ --disable-timers \ --disable-gtk \ --disable-libpng \ --with-gnu-ld" unpack() { ${SCRIPTS}/get pixman mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/pixman/pixman-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_makeinstall_target() { cp -f ${SYSROOT_PREFIX}/usr/lib/pkgconfig/pixman-1.pc \ ${SYSROOT_PREFIX}/usr/lib/pkgconfig/pixman.pc cp -rf ${SYSROOT_PREFIX}/usr/include/pixman-1 \ ${SYSROOT_PREFIX}/usr/include/pixman safe_remove ${INSTALL}/usr/include mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/x11/other/lib32-fontconfig/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-fontconfig" PKG_VERSION="$(get_pkg_version fontconfig)" PKG_NEED_UNPACK="$(get_pkg_directory fontconfig)" PKG_ARCH="aarch64" PKG_LICENSE="OSS" PKG_SITE="http://www.fontconfig.org" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-util-linux lib32-util-macros lib32-freetype lib32-libxml2 lib32-zlib lib32-expat" PKG_PATCH_DIRS+=" $(get_pkg_directory fontconfig)/patches" PKG_LONGDESC="Fontconfig is a library for font customization and configuration." PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="lib32" PKG_CONFIGURE_OPTS_TARGET="--with-arch=${LIB32_TARGET_ARCH} \ --with-cache-dir=/storage/.cache/fontconfig \ --with-default-fonts=/usr/share/fonts \ --without-add-fonts \ --disable-dependency-tracking \ --disable-docs \ --disable-rpath" unpack() { ${SCRIPTS}/get fontconfig mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/fontconfig/fontconfig-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } pre_configure_target() { # ensure we dont use '-O3' optimization. CFLAGS=$(echo ${CFLAGS} | sed -e "s|-O3|-O2|") CXXFLAGS=$(echo ${CXXFLAGS} | sed -e "s|-O3|-O2|") CFLAGS+=" -I${PKG_BUILD}" CXXFLAGS+=" -I${PKG_BUILD}" } post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { safe_remove ${INSTALL}/etc safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include safe_remove ${INSTALL}/usr/share mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: packages/lib32/x11/util/lib32-util-macros/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-util-macros" PKG_VERSION="$(get_pkg_version util-macros)" PKG_NEED_UNPACK="$(get_pkg_directory util-macros)" PKG_ARCH="aarch64" PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain" PKG_LONGDESC="X.org autoconf utilities such as M4 macros." PKG_PATCH_DIRS+=" $(get_pkg_directory util-macros)/patches" PKG_BUILD_FLAGS="lib32" unpack() { ${SCRIPTS}/get util-macros mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/util-macros/util-macros-${PKG_VERSION}.tar.bz2 -C ${PKG_BUILD} } pre_configure_target() { sed -i 's|^pkgconfigdir = .*|pkgconfigdir = /usr/lib/pkgconfig|' ${PKG_BUILD}/Makefile.am sed -i 's|^pkgconfigdir = .*|pkgconfigdir = /usr/lib/pkgconfig|' ${PKG_BUILD}/Makefile.in } post_makeinstall_target() { safe_remove ${INSTALL}/usr } ================================================ FILE: packages/linux/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="linux" PKG_LICENSE="GPL" PKG_SITE="http://www.kernel.org" PKG_DEPENDS_HOST="ccache:host rsync:host" PKG_DEPENDS_TARGET="linux:host kmod:host xz:host keyutils openssl:host ${KERNEL_EXTRA_DEPENDS_TARGET}" PKG_NEED_UNPACK="${LINUX_DEPENDS} $(get_pkg_directory initramfs) $(get_pkg_variable initramfs PKG_NEED_UNPACK)" PKG_LONGDESC="This package contains a precompiled kernel image and the modules." PKG_IS_KERNEL_PKG="yes" PKG_STAMP="${KERNEL_TARGET} ${KERNEL_MAKE_EXTRACMD}" PKG_PATCH_DIRS="${LINUX}" case "${LINUX}" in amlogic) PKG_VERSION="16f603617dbbc30cafbacaf78ef6468a081fa482" # 6.1.38 PKG_SHA256="aab5563a0ff2f7581b8f40d28950d4e9a30e51ea72397e3bf26efd85719af28c" PKG_URL="https://github.com/torvalds/linux/archive/${PKG_VERSION}.tar.gz" PKG_SOURCE_NAME="linux-${LINUX}-${PKG_VERSION}.tar.gz" PKG_PATCH_DIRS="default" ;; raspberrypi) PKG_VERSION="db53b52e7a54b6eed59dbbfb6f4b19ac6ed4edb3" # 6.1.72 PKG_SHA256="7211cd729ac63e005b1c81a20aac0c1b0cc4ba3a483b799705ad691f6074e720" PKG_URL="https://github.com/raspberrypi/linux/archive/${PKG_VERSION}.tar.gz" PKG_SOURCE_NAME="linux-${LINUX}-${PKG_VERSION}.tar.gz" ;; *) PKG_VERSION="6.1.73" PKG_SHA256="6cad48706bf1cde342613dca2a2cd6dd4f79f88f9e4d356263564e4b2a5d7e87" PKG_URL="https://www.kernel.org/pub/linux/kernel/v${PKG_VERSION/.*/}.x/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_PATCH_DIRS="default" ;; esac PKG_KERNEL_CFG_FILE=$(kernel_config_path) || die if [ -n "${KERNEL_TOOLCHAIN}" ]; then PKG_DEPENDS_TARGET+=" gcc-${KERNEL_TOOLCHAIN}:host" HEADERS_ARCH=${TARGET_ARCH} else PKG_DEPENDS_TARGET+=" toolchain" fi if [ "${PKG_BUILD_PERF}" != "no" ] && grep -q ^CONFIG_PERF_EVENTS= ${PKG_KERNEL_CFG_FILE}; then PKG_BUILD_PERF="yes" PKG_DEPENDS_TARGET+=" binutils elfutils libunwind zlib openssl" fi if [ "${TARGET_ARCH}" = "x86_64" ]; then PKG_DEPENDS_TARGET+=" elfutils:host pciutils" PKG_DEPENDS_UNPACK+=" intel-ucode kernel-firmware" elif [ "${TARGET_ARCH}" = "arm" -a "${DEVICE}" = "iMX6" ]; then PKG_DEPENDS_UNPACK+=" firmware-imx" fi if [[ "${KERNEL_TARGET}" = uImage* ]]; then PKG_DEPENDS_TARGET+=" u-boot-tools:host" fi # Ensure that the dependencies of initramfs:target are built correctly, but # we don't want to add initramfs:target as a direct dependency as we install # this "manually" from within linux:target for pkg in $(get_pkg_variable initramfs PKG_DEPENDS_TARGET); do ! listcontains "${PKG_DEPENDS_TARGET}" "${pkg}" && PKG_DEPENDS_TARGET+=" ${pkg}" || true done post_patch() { # linux was already built and its build dir autoremoved - prepare it again for kernel packages if [ -d ${PKG_INSTALL}/.image ]; then cp -p ${PKG_INSTALL}/.image/.config ${PKG_BUILD} kernel_make -C ${PKG_BUILD} prepare # restore the required Module.symvers from an earlier build cp -p ${PKG_INSTALL}/.image/Module.symvers ${PKG_BUILD} fi } make_host() { : } makeinstall_host() { make \ ARCH=${HEADERS_ARCH:-${TARGET_KERNEL_ARCH}} \ HOSTCC="${TOOLCHAIN}/bin/host-gcc" \ HOSTCXX="${TOOLCHAIN}/bin/host-g++" \ HOSTCFLAGS="${HOST_CFLAGS}" \ HOSTCXXFLAGS="${HOST_CXXFLAGS}" \ HOSTLDFLAGS="${HOST_LDFLAGS}" \ INSTALL_HDR_PATH=dest \ headers_install mkdir -p ${SYSROOT_PREFIX}/usr/include cp -R dest/include/* ${SYSROOT_PREFIX}/usr/include } pre_make_target() { ( cd ${ROOT} rm -rf ${BUILD}/initramfs rm -f ${STAMPS_INSTALL}/initramfs/install_target ${STAMPS_INSTALL}/*/install_init ${SCRIPTS}/install initramfs ) pkg_lock_status "ACTIVE" "linux:target" "build" cp ${PKG_KERNEL_CFG_FILE} ${PKG_BUILD}/.config # set initramfs source ${PKG_BUILD}/scripts/config --set-str CONFIG_INITRAMFS_SOURCE "$(kernel_initramfs_confs) ${BUILD}/initramfs" # set default hostname based on ${DISTRONAME} ${PKG_BUILD}/scripts/config --set-str CONFIG_DEFAULT_HOSTNAME "${DISTRONAME}" # disable swap support if not enabled if [ ! "${SWAP_SUPPORT}" = yes ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_SWAP fi # disable nfs support if not enabled if [ ! "${NFS_SUPPORT}" = yes ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_NFS_FS fi # disable cifs support if not enabled if [ ! "${SAMBA_SUPPORT}" = yes ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_CIFS fi # disable iscsi support if not enabled if [ ! "${ISCSI_SUPPORT}" = yes ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_SCSI_ISCSI_ATTRS ${PKG_BUILD}/scripts/config --disable CONFIG_ISCSI_TCP ${PKG_BUILD}/scripts/config --disable CONFIG_ISCSI_BOOT_SYSFS ${PKG_BUILD}/scripts/config --disable CONFIG_ISCSI_IBFT_FIND ${PKG_BUILD}/scripts/config --disable CONFIG_ISCSI_IBFT fi # disable lima/panfrost if libmali is configured if [ "${OPENGLES}" = "libmali" ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_DRM_LIMA ${PKG_BUILD}/scripts/config --disable CONFIG_DRM_PANFROST fi # disable wireguard support if not enabled if [ ! "${WIREGUARD_SUPPORT}" = yes ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_WIREGUARD fi if [ "${TARGET_ARCH}" = "x86_64" ]; then # copy some extra firmware to linux tree mkdir -p ${PKG_BUILD}/external-firmware cp -a $(get_build_dir kernel-firmware)/.copied-firmware/{amdgpu,amd-ucode,i915,radeon,e100,rtl_nic} ${PKG_BUILD}/external-firmware cp -a $(get_build_dir intel-ucode)/intel-ucode ${PKG_BUILD}/external-firmware FW_LIST="$(find ${PKG_BUILD}/external-firmware \( -type f -o -type l \) \( -iname '*.bin' -o -iname '*.fw' -o -path '*/intel-ucode/*' \) | sed 's|.*external-firmware/||' | sort | xargs)" ${PKG_BUILD}/scripts/config --set-str CONFIG_EXTRA_FIRMWARE "${FW_LIST}" ${PKG_BUILD}/scripts/config --set-str CONFIG_EXTRA_FIRMWARE_DIR "external-firmware" elif [ "${TARGET_ARCH}" = "arm" -a "${DEVICE}" = "iMX6" ]; then mkdir -p ${PKG_BUILD}/external-firmware/imx/sdma cp -a $(get_build_dir firmware-imx)/firmware/sdma/*imx6*.bin ${PKG_BUILD}/external-firmware/imx/sdma cp -a $(get_build_dir firmware-imx)/firmware/vpu/*imx6*.bin ${PKG_BUILD}/external-firmware FW_LIST="$(find ${PKG_BUILD}/external-firmware -type f | sed 's|.*external-firmware/||' | sort | xargs)" ${PKG_BUILD}/scripts/config --set-str CONFIG_EXTRA_FIRMWARE "${FW_LIST}" ${PKG_BUILD}/scripts/config --set-str CONFIG_EXTRA_FIRMWARE_DIR "external-firmware" fi kernel_make oldconfig if [ -f "${DISTRO_DIR}/${DISTRO}/kernel_options" ]; then while read OPTION; do [ -z "${OPTION}" -o -n "$(echo "${OPTION}" | grep '^#')" ] && continue if [ "${OPTION##*=}" == "n" -a "$(${PKG_BUILD}/scripts/config --state ${OPTION%%=*})" == "undef" ]; then continue fi if [ "$(${PKG_BUILD}/scripts/config --state ${OPTION%%=*})" != "$(echo ${OPTION##*=} | tr -d '"')" ]; then MISSING_KERNEL_OPTIONS+="\t${OPTION}\n" fi done < ${DISTRO_DIR}/${DISTRO}/kernel_options if [ -n "${MISSING_KERNEL_OPTIONS}" ]; then print_color CLR_WARNING "LINUX: kernel options not correct: \n${MISSING_KERNEL_OPTIONS%%}\nPlease run ./tools/check_kernel_config\n" fi fi } make_target() { # 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 if [ -z "${KERNEL_UIMAGE_LOADADDR}" -o -z "${KERNEL_UIMAGE_ENTRYADDR}" ]; then die "ERROR: KERNEL_UIMAGE_LOADADDR and KERNEL_UIMAGE_ENTRYADDR have to be set to build uImage - aborting" fi KERNEL_UIMAGE_TARGET="${KERNEL_TARGET}" KERNEL_TARGET="${KERNEL_TARGET/uImage/Image}" fi DTC_FLAGS=-@ kernel_make ${KERNEL_TARGET} ${KERNEL_MAKE_EXTRACMD} modules if [ "${PKG_BUILD_PERF}" = "yes" ]; then ( cd tools/perf # arch specific perf build args case "${TARGET_ARCH}" in x86_64) PERF_BUILD_ARGS="ARCH=x86" ;; aarch64) PERF_BUILD_ARGS="ARCH=arm64" ;; *) PERF_BUILD_ARGS="ARCH=${TARGET_ARCH}" ;; esac WERROR=0 \ NO_LIBPERL=1 \ NO_LIBPYTHON=1 \ NO_SLANG=1 \ NO_GTK2=1 \ NO_LIBNUMA=1 \ NO_LIBAUDIT=1 \ NO_LZMA=1 \ NO_SDT=1 \ CROSS_COMPILE="${TARGET_PREFIX}" \ JOBS="${CONCURRENCY_MAKE_LEVEL}" \ make ${PERF_BUILD_ARGS} mkdir -p ${INSTALL}/usr/bin cp perf ${INSTALL}/usr/bin ) fi if [ -n "${KERNEL_UIMAGE_TARGET}" ]; then # determine compression used for kernel image KERNEL_UIMAGE_COMP=${KERNEL_UIMAGE_TARGET:7} KERNEL_UIMAGE_COMP=$(echo ${KERNEL_UIMAGE_COMP:-none} | sed 's/gz/gzip/; s/bz2/bzip2/') # calculate new load address to make kernel Image unpack to memory area after compressed image if [ "${KERNEL_UIMAGE_COMP}" != "none" ]; then COMPRESSED_SIZE=$(stat -t "arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET}" | awk '{print $2}') # align to 1 MiB COMPRESSED_SIZE=$(( ((${COMPRESSED_SIZE} - 1 >> 20) + 1) << 20 )) PKG_KERNEL_UIMAGE_LOADADDR=$(printf '%X' "$(( ${KERNEL_UIMAGE_LOADADDR} + ${COMPRESSED_SIZE} ))") PKG_KERNEL_UIMAGE_ENTRYADDR=$(printf '%X' "$(( ${KERNEL_UIMAGE_ENTRYADDR} + ${COMPRESSED_SIZE} ))") else PKG_KERNEL_UIMAGE_LOADADDR=${KERNEL_UIMAGE_LOADADDR} PKG_KERNEL_UIMAGE_ENTRYADDR=${KERNEL_UIMAGE_ENTRYADDR} fi mkimage -A ${TARGET_KERNEL_ARCH} \ -O linux \ -T kernel \ -C ${KERNEL_UIMAGE_COMP} \ -a ${PKG_KERNEL_UIMAGE_LOADADDR} \ -e ${PKG_KERNEL_UIMAGE_ENTRYADDR} \ -d arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET} \ arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_UIMAGE_TARGET} KERNEL_TARGET="${KERNEL_UIMAGE_TARGET}" fi } makeinstall_target() { mkdir -p ${INSTALL}/.image cp -p arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET} System.map .config Module.symvers ${INSTALL}/.image/ kernel_make INSTALL_MOD_PATH=${INSTALL}/$(get_kernel_overlay_dir) modules_install rm -f ${INSTALL}/$(get_kernel_overlay_dir)/lib/modules/*/build rm -f ${INSTALL}/$(get_kernel_overlay_dir)/lib/modules/*/source if [ "${BOOTLOADER}" = "u-boot" ]; then mkdir -p ${INSTALL}/usr/share/bootloader for dtb in arch/${TARGET_KERNEL_ARCH}/boot/dts/*.dtb arch/${TARGET_KERNEL_ARCH}/boot/dts/*/*.dtb; do if [ -f ${dtb} ]; then cp -v ${dtb} ${INSTALL}/usr/share/bootloader fi done elif [ "${BOOTLOADER}" = "bcm2835-bootloader" ]; then # RPi firmware will decompress gzipped kernels prior to booting if [ "${TARGET_KERNEL_ARCH}" = "arm64" ]; then pigz --best --force ${INSTALL}/.image/${KERNEL_TARGET} mv ${INSTALL}/.image/${KERNEL_TARGET}.gz ${INSTALL}/.image/${KERNEL_TARGET} fi mkdir -p ${INSTALL}/usr/share/bootloader/overlays # install platform dtbs, but remove upstream kernel dtbs (i.e. without downstream # drivers and decent USB support) as these are not required by LibreELEC for dtb in arch/${TARGET_KERNEL_ARCH}/boot/dts/*.dtb arch/${TARGET_KERNEL_ARCH}/boot/dts/*/*.dtb; do if [ -f ${dtb} ]; then cp -v ${dtb} ${INSTALL}/usr/share/bootloader fi done rm -f ${INSTALL}/usr/share/bootloader/bcm283*.dtb # duplicated in overlays below safe_remove ${INSTALL}/usr/share/bootloader/overlay_map.dtb # install overlay dtbs for dtb in arch/arm/boot/dts/overlays/*.dtb \ arch/arm/boot/dts/overlays/*.dtbo; do cp ${dtb} ${INSTALL}/usr/share/bootloader/overlays 2>/dev/null || : done cp -p arch/${TARGET_KERNEL_ARCH}/boot/dts/overlays/README ${INSTALL}/usr/share/bootloader/overlays fi } ================================================ FILE: packages/linux/patches/default/linux-020-ALSA-pcm-fix-ELD-constraints-for-E-AC3-DTS-HD-and-ML.patch ================================================ From 94d0a9815c99385e57a17fb20448e47a1f229bcf Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Sat, 3 Jun 2023 12:00:28 +0200 Subject: [PATCH 1/2] ALSA: pcm: fix ELD constraints for (E)AC3, DTS(-HD) and MLP formats The SADs of compressed formats contain the channel and sample rate info of the audio data inside the compressed stream, but when building constraints we must use the rates and channels used to transport the compressed streams. eg 48kHz 6ch EAC3 needs to be transmitted as a 2ch 192kHz stream. This patch fixes the constraints for the common AC3 and DTS formats, the constraints for the less common MPEG, DSD etc formats are copied directly from the info in the SADs as before as I don't have the specs and equipment to test those. Signed-off-by: Matthias Reichl --- sound/core/pcm_drm_eld.c | 73 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 3 deletions(-) diff --git a/sound/core/pcm_drm_eld.c b/sound/core/pcm_drm_eld.c index 4b5faae5d16e5..07075071972dd 100644 --- a/sound/core/pcm_drm_eld.c +++ b/sound/core/pcm_drm_eld.c @@ -2,11 +2,25 @@ /* * PCM DRM helpers */ +#include #include +#include #include #include #include +#define SAD0_CHANNELS_MASK GENMASK(2, 0) /* max number of channels - 1 */ +#define SAD0_FORMAT_MASK GENMASK(6, 3) /* audio format */ + +#define SAD1_RATE_MASK GENMASK(6, 0) /* bitfield of supported rates */ +#define SAD1_RATE_32000_MASK BIT(0) +#define SAD1_RATE_44100_MASK BIT(1) +#define SAD1_RATE_48000_MASK BIT(2) +#define SAD1_RATE_88200_MASK BIT(3) +#define SAD1_RATE_96000_MASK BIT(4) +#define SAD1_RATE_176400_MASK BIT(5) +#define SAD1_RATE_192000_MASK BIT(6) + static const unsigned int eld_rates[] = { 32000, 44100, @@ -17,9 +31,62 @@ static const unsigned int eld_rates[] = { 192000, }; +static unsigned int map_rate_families(const u8 *sad, + unsigned int mask_32000, + unsigned int mask_44100, + unsigned int mask_48000) +{ + unsigned int rate_mask = 0; + + if (sad[1] & SAD1_RATE_32000_MASK) + rate_mask |= mask_32000; + if (sad[1] & (SAD1_RATE_44100_MASK | SAD1_RATE_88200_MASK | SAD1_RATE_176400_MASK)) + rate_mask |= mask_44100; + if (sad[1] & (SAD1_RATE_48000_MASK | SAD1_RATE_96000_MASK | SAD1_RATE_192000_MASK)) + rate_mask |= mask_48000; + return rate_mask; +} + +static unsigned int sad_rate_mask(const u8 *sad) +{ + switch (FIELD_GET(SAD0_FORMAT_MASK, sad[0])) { + case HDMI_AUDIO_CODING_TYPE_PCM: + return sad[1] & SAD1_RATE_MASK; + case HDMI_AUDIO_CODING_TYPE_AC3: + case HDMI_AUDIO_CODING_TYPE_DTS: + return map_rate_families(sad, + SAD1_RATE_32000_MASK, + SAD1_RATE_44100_MASK, + SAD1_RATE_48000_MASK); + case HDMI_AUDIO_CODING_TYPE_EAC3: + case HDMI_AUDIO_CODING_TYPE_DTS_HD: + case HDMI_AUDIO_CODING_TYPE_MLP: + return map_rate_families(sad, + 0, + SAD1_RATE_176400_MASK, + SAD1_RATE_192000_MASK); + default: + /* TODO adjust for other compressed formats as well */ + return sad[1] & SAD1_RATE_MASK; + } +} + static unsigned int sad_max_channels(const u8 *sad) { - return 1 + (sad[0] & 7); + switch (FIELD_GET(SAD0_FORMAT_MASK, sad[0])) { + case HDMI_AUDIO_CODING_TYPE_PCM: + return 1 + FIELD_GET(SAD0_CHANNELS_MASK, sad[0]); + case HDMI_AUDIO_CODING_TYPE_AC3: + case HDMI_AUDIO_CODING_TYPE_DTS: + case HDMI_AUDIO_CODING_TYPE_EAC3: + return 2; + case HDMI_AUDIO_CODING_TYPE_DTS_HD: + case HDMI_AUDIO_CODING_TYPE_MLP: + return 8; + default: + /* TODO adjust for other compressed formats as well */ + return 1 + FIELD_GET(SAD0_CHANNELS_MASK, sad[0]); + } } static int eld_limit_rates(struct snd_pcm_hw_params *params, @@ -42,7 +109,7 @@ static int eld_limit_rates(struct snd_pcm_hw_params *params, * requested number of channels. */ if (c->min <= max_channels) - rate_mask |= sad[1]; + rate_mask |= sad_rate_mask(sad); } } @@ -70,7 +137,7 @@ static int eld_limit_channels(struct snd_pcm_hw_params *params, rate_mask |= BIT(i); for (i = drm_eld_sad_count(eld); i > 0; i--, sad += 3) - if (rate_mask & sad[1]) + if (rate_mask & sad_rate_mask(sad)) t.max = max(t.max, sad_max_channels(sad)); } -- 2.39.2 ================================================ FILE: packages/linux/patches/default/linux-021-ASoC-hdmi-codec-don-t-set-channel-and-speaker-info-f.patch ================================================ From 99586e3f502fcc4fdd21b621f3c87ae7a8f7c170 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Sat, 3 Jun 2023 12:12:28 +0200 Subject: [PATCH 2/2] ASoC: hdmi-codec: don't set channel and speaker info for compressed formats CTA 861 only mandates that the speaker allocation in the audio info frame is set for multichannel PCM formats. Likewise the number of channels in the audio infoframe is only relevant for PCM. Some TVs won't decode compressed formats if the number of channels isn't set to 0 (refer to stream header) and the speaker allocation is set to the default 0 (FL and FR). So fill in this info only for PCM audio and set it to 0 for compressed audio formats. This also prevents hdmi_codec_prepare failing with an error when trying to play back DTS-HD or MLP (which is passed through as 8ch) if the sink only supports 2ch PCM and announces only FL/FR speaker support in the EDID. Signed-off-by: Matthias Reichl --- sound/soc/codecs/hdmi-codec.c | 36 +++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c index 0b1cdb2d60498..a192d985c5f18 100644 --- a/sound/soc/codecs/hdmi-codec.c +++ b/sound/soc/codecs/hdmi-codec.c @@ -484,31 +484,43 @@ static int hdmi_codec_fill_codec_params(struct snd_soc_dai *dai, struct hdmi_codec_params *hp) { struct hdmi_codec_priv *hcp = snd_soc_dai_get_drvdata(dai); - int idx; - - /* Select a channel allocation that matches with ELD and pcm channels */ - idx = hdmi_codec_get_ch_alloc_table_idx(hcp, channels); - if (idx < 0) { - dev_err(dai->dev, "Not able to map channels to speakers (%d)\n", - idx); - hcp->chmap_idx = HDMI_CODEC_CHMAP_IDX_UNKNOWN; - return idx; + int idx = HDMI_CODEC_CHMAP_IDX_UNKNOWN; + u8 ca_id = 0; + bool pcm_audio = !(hcp->iec_status[0] & IEC958_AES0_NONAUDIO); + + if (pcm_audio) { + /* Select a channel allocation that matches with ELD and pcm channels */ + idx = hdmi_codec_get_ch_alloc_table_idx(hcp, channels); + + if (idx < 0) { + dev_err(dai->dev, "Not able to map channels to speakers (%d)\n", + idx); + hcp->chmap_idx = HDMI_CODEC_CHMAP_IDX_UNKNOWN; + return idx; + } + + ca_id = hdmi_codec_channel_alloc[idx].ca_id; } memset(hp, 0, sizeof(*hp)); hdmi_audio_infoframe_init(&hp->cea); - hp->cea.channels = channels; + + if (pcm_audio) + hp->cea.channels = channels; + else + hp->cea.channels = 0; + hp->cea.coding_type = HDMI_AUDIO_CODING_TYPE_STREAM; hp->cea.sample_size = HDMI_AUDIO_SAMPLE_SIZE_STREAM; hp->cea.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM; - hp->cea.channel_allocation = hdmi_codec_channel_alloc[idx].ca_id; + hp->cea.channel_allocation = ca_id; hp->sample_width = sample_width; hp->sample_rate = sample_rate; hp->channels = channels; - hcp->chmap_idx = hdmi_codec_channel_alloc[idx].ca_id; + hcp->chmap_idx = idx; return 0; } -- 2.39.2 ================================================ FILE: packages/linux/patches/default/linux-022-ASoC-hdmi-codec-Fix-broken-channel-map-reporting.patch ================================================ From 5e4400b24fc1f8ad41bccb6a6bdb54b961526556 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Thu, 7 Sep 2023 20:33:25 +0200 Subject: [PATCH] ASoC: hdmi-codec: Fix broken channel map reporting Commit 4e0871333661 ("ASoC: hdmi-codec: fix channel info for compressed formats") accidentally changed hcp->chmap_idx from ca_id, the CEA channel allocation ID, to idx, the index to the table of channel mappings ordered by preference. This resulted in wrong channel maps being reported to userspace, eg for 5.1 "FL,FR,LFE,FC" was reported instead of the expected "FL,FR,LFE,FC,RL,RR": ~ # speaker-test -c 6 -t sine ... 0 - Front Left 3 - Front Center 1 - Front Right 2 - LFE 4 - Unknown 5 - Unknown ~ # amixer cget iface=PCM,name='Playback Channel Map' | grep ': values' : values=3,4,8,7,0,0,0,0 Switch this back to ca_id in case of PCM audio so the correct channel map is reported again and set it to HDMI_CODEC_CHMAP_IDX_UNKNOWN in case of non-PCM audio so the PCM channel map control returns "Unknown" channels (value 0). Fixes: 4e0871333661 ("ASoC: hdmi-codec: fix channel info for compressed formats") Cc: stable@vger.kernel.org Signed-off-by: Matthias Reichl --- sound/soc/codecs/hdmi-codec.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c index 13689e718d36f..09eef6042aad6 100644 --- a/sound/soc/codecs/hdmi-codec.c +++ b/sound/soc/codecs/hdmi-codec.c @@ -531,7 +531,10 @@ static int hdmi_codec_fill_codec_params(struct snd_soc_dai *dai, hp->sample_rate = sample_rate; hp->channels = channels; - hcp->chmap_idx = idx; + if (pcm_audio) + hcp->chmap_idx = ca_id; + else + hcp->chmap_idx = HDMI_CODEC_CHMAP_IDX_UNKNOWN; return 0; } -- 2.39.2 ================================================ FILE: packages/linux/patches/default/linux-051-ouya_controller_support.patch ================================================ commit 5a596921a4636e62843a59b7eab7b87b70a6d296 Author: Lukas Rusak Date: Sun May 6 22:03:11 2018 -0700 HID: add ouya HID driver This driver is a simple implementation to get the controller working and mapped properly. This driver does not include functionality for the touchpad (yet). The original driver was taken from from the ouya linux tree and has been simplified. It seems there may have been other versions of the controller present that had a broken report descriptor. I have removed that for now. diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 60252fd796f6..6be2c454e72e 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig @@ -659,6 +659,12 @@ config HID_ORTEK - Ortek WKB-2000 - Skycable wireless presenter +config HID_OUYA + tristate "OUYA Game Controller" + depends on USB_HID + help + Support for OUYA Game Controller. + config HID_PANTHERLORD tristate "Pantherlord/GreenAsia game controller" depends on HID diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile index 17a8bd97da9d..4425890934e4 100644 --- a/drivers/hid/Makefile +++ b/drivers/hid/Makefile @@ -71,6 +71,7 @@ obj-$(CONFIG_HID_MULTITOUCH) += hid-multitouch.o obj-$(CONFIG_HID_NTI) += hid-nti.o obj-$(CONFIG_HID_NTRIG) += hid-ntrig.o obj-$(CONFIG_HID_ORTEK) += hid-ortek.o +obj-$(CONFIG_HID_OUYA) += hid-ouya.o obj-$(CONFIG_HID_PRODIKEYS) += hid-prodikeys.o obj-$(CONFIG_HID_PANTHERLORD) += hid-pl.o obj-$(CONFIG_HID_PENMOUNT) += hid-penmount.o diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 0b5cc910f62e..0528efb825fa 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -859,6 +859,9 @@ #define USB_DEVICE_ID_ORTEK_WKB2000 0x2000 #define USB_DEVICE_ID_ORTEK_IHOME_IMAC_A210S 0x8003 +#define USB_VENDOR_ID_OUYA 0x2836 +#define USB_DEVICE_ID_OUYA_CONTROLLER 0x0001 + #define USB_VENDOR_ID_PLANTRONICS 0x047f #define USB_VENDOR_ID_PANASONIC 0x04da diff --git a/drivers/hid/hid-ouya.c b/drivers/hid/hid-ouya.c new file mode 100644 index 000000000000..4344a47b40af --- /dev/null +++ b/drivers/hid/hid-ouya.c @@ -0,0 +1,131 @@ +/* + * HID driver for OUYA Game Controller(s) + * + * Copyright (c) 2013 OUYA + * Copyright (c) 2013 Gregorios Leach + * Copyright (c) 2018 Lukas Rusak + */ + +#include +#include +#include +#include + +#include "hid-ids.h" + +static const unsigned int ouya_absmap[] = { + [0x30] = ABS_X, /* left stick X */ + [0x31] = ABS_Y, /* left stick Y */ + [0x32] = ABS_Z, /* L2 */ + [0x33] = ABS_RX, /* right stick X */ + [0x34] = ABS_RY, /* right stick Y */ + [0x35] = ABS_RZ, /* R2 */ +}; + +static const unsigned int ouya_keymap[] = { + [0x1] = BTN_SOUTH, /* O */ + [0x2] = BTN_WEST, /* U */ + [0x3] = BTN_NORTH, /* Y */ + [0x4] = BTN_EAST, /* A */ + [0x5] = BTN_TL, /* L1 */ + [0x6] = BTN_TR, /* R1 */ + [0x7] = BTN_THUMBL, /* L3 */ + [0x8] = BTN_THUMBR, /* R3 */ + [0x9] = BTN_DPAD_UP, /* Up */ + [0xa] = BTN_DPAD_DOWN, /* Down */ + [0xb] = BTN_DPAD_LEFT, /* Left */ + [0xc] = BTN_DPAD_RIGHT, /* Right */ + [0xd] = BTN_TL2, /* L2 */ + [0xe] = BTN_TR2, /* R2 */ + [0xf] = BTN_MODE, /* Power */ +}; + +static int ouya_input_mapping(struct hid_device *hdev, struct hid_input *hi, + struct hid_field *field, struct hid_usage *usage, + unsigned long **bit, int *max) +{ + if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) { + unsigned int key = usage->hid & HID_USAGE; + + if (key >= ARRAY_SIZE(ouya_keymap)) + return -1; + + key = ouya_keymap[key]; + hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key); + + return 1; + + } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) { + unsigned int abs = usage->hid & HID_USAGE; + + if (abs >= ARRAY_SIZE(ouya_absmap)) + return -1; + + abs = ouya_absmap[abs]; + hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs); + + return 1; + } + + return 0; +} + +static int ouya_probe(struct hid_device *hdev, const struct hid_device_id *id) +{ + int ret; + + ret = hid_parse(hdev); + if (ret) { + hid_err(hdev, "parse failed\n"); + goto err_free; + } + + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT | HID_CONNECT_HIDDEV_FORCE); + if (ret) { + hid_err(hdev, "hw start failed\n"); + goto err_free; + } + + return 0; + +err_free: + return ret; +} + +static void ouya_remove(struct hid_device *hdev) +{ + hid_hw_stop(hdev); + kfree(hid_get_drvdata(hdev)); +} + +static const struct hid_device_id ouya_devices[] = { + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_OUYA, USB_DEVICE_ID_OUYA_CONTROLLER) }, + { } +}; +MODULE_DEVICE_TABLE(hid, ouya_devices); + +static struct hid_driver ouya_driver = { + .name = "ouya", + .id_table = ouya_devices, + .input_mapping = ouya_input_mapping, + .probe = ouya_probe, + .remove = ouya_remove, +}; + +static int __init ouya_init(void) +{ + return hid_register_driver(&ouya_driver); +} + +static void __exit ouya_exit(void) +{ + hid_unregister_driver(&ouya_driver); +} + +module_init(ouya_init); +module_exit(ouya_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Lukas Rusak "); +MODULE_AUTHOR("Gregorios Leach "); +MODULE_DESCRIPTION("Ouya Controller Driver"); diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c index 587e2681a53f..b5adc13e0df1 100644 --- a/drivers/hid/hid-quirks.c +++ b/drivers/hid/hid-quirks.c @@ -538,6 +538,9 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_IHOME_IMAC_A210S) }, { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, #endif +#if IS_ENABLED(CONFIG_HID_OUYA) + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_OUYA, USB_DEVICE_ID_OUYA_CONTROLLER) }, +#endif #if IS_ENABLED(CONFIG_HID_PANTHERLORD) { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) }, { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) }, ================================================ FILE: packages/linux/patches/default/linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch ================================================ From 7051422474e4c4e302ede3d07ffd8ef2682e07a2 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 22 Apr 2014 16:05:14 +0300 Subject: [PATCH] [RFC] hid/sony: add autorepeat for PS3 remotes adapted to 4.6 Betreff: [RFC] hid/sony: add autorepeat for PS3 remotes Von: David Dillow Datum: 28.06.2013 04:28 An: linux-input@vger.kernel.org Kopie (CC): Stephan Raue Some applications using the PS3 remote would like to have autorepeat from the device. Use the input subsystem's software emulation to provide this capability, and enable those that don't need it to turn it off. --- I'm not sure this is the correct approach, or if it is even appropriate for a remote to do autorepeat. However, the media/rc subsystem does do it by default, and it's been requested by users, so there is at least some demand. This compiled against the hid-sony driver with the PS3 remote changes merged, but I have done no testing of it. If the approach seems reasonable, I'll try to test it when the MythTV is idle. Signed-off-by: Matt DeVillier --- drivers/hid/hid-sony.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index 310436a..84f7f41 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c @@ -1120,6 +1120,25 @@ static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi, return 1; } +static int ps3remote_setup_repeat(struct hid_device *hdev) +{ + struct hid_input *hidinput = list_first_entry(&hdev->inputs, + struct hid_input, list); + struct input_dev *input = hidinput->input; + + /* + * Set up autorepeat defaults per the remote control subsystem; + * this must be done after hid_hw_start(), as having these non-zero + * at the time of input_register_device() tells the input system that + * the hardware does the autorepeat, and the PS3 remote does not. + */ + set_bit(EV_REP, input->evbit); + input->rep[REP_DELAY] = 500; + input->rep[REP_PERIOD] = 125; + + return 0; +} + static u8 *sony_report_fixup(struct hid_device *hdev, u8 *rdesc, unsigned int *rsize) { @@ -2372,6 +2391,8 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) sony_init_output_report(sc, dualshock4_send_output_report); } else if (sc->quirks & MOTION_CONTROLLER) { sony_init_output_report(sc, motion_send_output_report); + } else if (sc->quirks & PS3REMOTE) { + ret = ps3remote_setup_repeat(hdev); } else { ret = 0; } -- 2.5.0 ================================================ FILE: packages/linux/patches/default/linux-062-imon_pad_ignore_diagonal.patch ================================================ diff -Naur linux-3.16.1/drivers/media/rc/imon.c linux-3.16.1.patch/drivers/media/rc/imon.c --- linux-3.16.1/drivers/media/rc/imon.c 2014-08-14 04:36:35.000000000 +0200 +++ linux-3.16.1.patch/drivers/media/rc/imon.c 2014-08-15 13:57:16.587620642 +0200 @@ -1344,6 +1344,17 @@ } } else { /* + * For users without stabilized, just ignore any value getting + * to close to the diagonal. + */ + if ((abs(rel_y) < 2 && abs(rel_x) < 2) || + abs(abs(rel_y) - abs(rel_x)) < 2 ) { + spin_lock_irqsave(&ictx->kc_lock, flags); + ictx->kc = KEY_UNKNOWN; + spin_unlock_irqrestore(&ictx->kc_lock, flags); + return; + } + /* * Hack alert: instead of using keycodes, we have * to use hard-coded scancodes here... */ ================================================ FILE: packages/linux/patches/default/linux-121-rtw88-linux-next-6-2.patch ================================================ From 823092a53556ebf8656623d0e857626d30fe1e18 Mon Sep 17 00:00:00 2001 From: Ji-Pin Jou Date: Thu, 24 Nov 2022 14:44:42 +0800 Subject: wifi: rtw88: fix race condition when doing H2C command For SDIO/USB interface, since the tranferring speed is slower than that in PCIE, it may have race condition when the driver sets down H2C command to the FW. In the function rtw_fw_send_h2c_command, before the patch, box_reg is written first, then box_ex_reg is written. FW starts to work and fetch the value of box_ex_reg, when the most significant byte of box_reg(4 bytes) is written. Meanwhile, for SDIO/USB interface, since the transferring speed is slow, the driver is still in writing the new value of box_ex_reg through the bus, and FW may get the wrong value of box_ex_reg at the moment. To prevent the above driver/FW racing situation, box_ex_reg is written first then box_reg. Furthermore, it is written in 4 bytes at a time, instead of written in one byte one by one. It can increase the speed for SDIO/USB interface. Signed-off-by: Ji-Pin Jou Signed-off-by: Ping-Ke Shih Tested-by: Sascha Hauer Signed-off-by: Kalle Valo Link: https://lore.kernel.org/r/20221124064442.28042-1-pkshih@realtek.com --- drivers/net/wireless/realtek/rtw88/fw.c | 8 +++----- drivers/net/wireless/realtek/rtw88/fw.h | 5 +++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c index 0b5f903c0f366..b290811d75e1c 100644 --- a/drivers/net/wireless/realtek/rtw88/fw.c +++ b/drivers/net/wireless/realtek/rtw88/fw.c @@ -311,10 +311,10 @@ EXPORT_SYMBOL(rtw_fw_c2h_cmd_isr); static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev, u8 *h2c) { + struct rtw_h2c_cmd *h2c_cmd = (struct rtw_h2c_cmd *)h2c; u8 box; u8 box_state; u32 box_reg, box_ex_reg; - int idx; int ret; rtw_dbg(rtwdev, RTW_DBG_FW, @@ -356,10 +356,8 @@ static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev, goto out; } - for (idx = 0; idx < 4; idx++) - rtw_write8(rtwdev, box_reg + idx, h2c[idx]); - for (idx = 0; idx < 4; idx++) - rtw_write8(rtwdev, box_ex_reg + idx, h2c[idx + 4]); + rtw_write32(rtwdev, box_ex_reg, le32_to_cpu(h2c_cmd->msg_ext)); + rtw_write32(rtwdev, box_reg, le32_to_cpu(h2c_cmd->msg)); if (++rtwdev->h2c.last_box_num >= 4) rtwdev->h2c.last_box_num = 0; diff --git a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/realtek/rtw88/fw.h index a5a965803a3cc..bca610dc99ab7 100644 --- a/drivers/net/wireless/realtek/rtw88/fw.h +++ b/drivers/net/wireless/realtek/rtw88/fw.h @@ -81,6 +81,11 @@ struct rtw_c2h_adaptivity { u8 option; } __packed; +struct rtw_h2c_cmd { + __le32 msg; + __le32 msg_ext; +} __packed; + enum rtw_rsvd_packet_type { RSVD_BEACON, RSVD_DUMMY, -- cgit From 1d89660494402168565e0637268486ae28bad642 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 2 Dec 2022 09:12:14 +0100 Subject: wifi: rtw88: print firmware type in info message It's confusing to read two different firmware versions in the syslog for the same device: rtw_8822cu 2-1:1.2: Firmware version 9.9.4, H2C version 15 rtw_8822cu 2-1:1.2: Firmware version 9.9.11, H2C version 15 Print the firmware type in this message to make clear these are really two different firmwares for different purposes: rtw_8822cu 1-1.4:1.2: WOW Firmware version 9.9.4, H2C version 15 rtw_8822cu 1-1.4:1.2: Firmware version 9.9.11, H2C version 15 Signed-off-by: Sascha Hauer Reviewed-by: Ping-Ke Shih Signed-off-by: Kalle Valo Link: https://lore.kernel.org/r/20221202081224.2779981-2-s.hauer@pengutronix.de --- drivers/net/wireless/realtek/rtw88/main.c | 4 +++- drivers/net/wireless/realtek/rtw88/main.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c index 67151dbf83842..a7331872e8530 100644 --- a/drivers/net/wireless/realtek/rtw88/main.c +++ b/drivers/net/wireless/realtek/rtw88/main.c @@ -1731,7 +1731,8 @@ static void rtw_load_firmware_cb(const struct firmware *firmware, void *context) update_firmware_info(rtwdev, fw); complete_all(&fw->completion); - rtw_info(rtwdev, "Firmware version %u.%u.%u, H2C version %u\n", + rtw_info(rtwdev, "%sFirmware version %u.%u.%u, H2C version %u\n", + fw->type == RTW_WOWLAN_FW ? "WOW " : "", fw->version, fw->sub_version, fw->sub_index, fw->h2c_version); } @@ -1757,6 +1758,7 @@ static int rtw_load_firmware(struct rtw_dev *rtwdev, enum rtw_fw_type type) return -ENOENT; } + fw->type = type; fw->rtwdev = rtwdev; init_completion(&fw->completion); diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h index bccd7b28f60c7..6e5875f6d07f4 100644 --- a/drivers/net/wireless/realtek/rtw88/main.h +++ b/drivers/net/wireless/realtek/rtw88/main.h @@ -1851,6 +1851,7 @@ struct rtw_fw_state { u16 h2c_version; u32 feature; u32 feature_ext; + enum rtw_fw_type type; }; enum rtw_sar_sources { -- cgit From 69020957bcb783184af1a86c8483139557cec751 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 2 Dec 2022 09:12:15 +0100 Subject: wifi: rtw88: Call rtw_fw_beacon_filter_config() with rtwdev->mutex held rtw_fw_beacon_filter_config() is called once with rtwdev->mutex held and once without the mutex held. Call it consistently with rtwdev->mutex held. Signed-off-by: Sascha Hauer Reviewed-by: Ping-Ke Shih Signed-off-by: Kalle Valo Link: https://lore.kernel.org/r/20221202081224.2779981-3-s.hauer@pengutronix.de --- drivers/net/wireless/realtek/rtw88/mac80211.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c index 07578ccc4bab3..776a9a9884b5d 100644 --- a/drivers/net/wireless/realtek/rtw88/mac80211.c +++ b/drivers/net/wireless/realtek/rtw88/mac80211.c @@ -487,8 +487,8 @@ static int rtw_ops_sta_remove(struct ieee80211_hw *hw, { struct rtw_dev *rtwdev = hw->priv; - rtw_fw_beacon_filter_config(rtwdev, false, vif); mutex_lock(&rtwdev->mutex); + rtw_fw_beacon_filter_config(rtwdev, false, vif); rtw_sta_remove(rtwdev, sta, true); mutex_unlock(&rtwdev->mutex); -- cgit From d57ca103e54e2b3eea7e2603548c58bcc4155541 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 2 Dec 2022 09:12:16 +0100 Subject: wifi: rtw88: Drop rf_lock The rtwdev->rf_lock spinlock protects the rf register accesses in rtw_read_rf() and rtw_write_rf(). Most callers of these functions hold rtwdev->mutex already with the exception of the callsites in the debugfs code. The debugfs code doesn't justify an extra lock, so acquire the mutex there as well before calling rf register accessors and drop the now unnecessary spinlock. Signed-off-by: Sascha Hauer Reviewed-by: Ping-Ke Shih Signed-off-by: Kalle Valo Link: https://lore.kernel.org/r/20221202081224.2779981-4-s.hauer@pengutronix.de --- drivers/net/wireless/realtek/rtw88/debug.c | 11 +++++++++++ drivers/net/wireless/realtek/rtw88/hci.h | 9 +++------ drivers/net/wireless/realtek/rtw88/main.c | 1 - drivers/net/wireless/realtek/rtw88/main.h | 3 --- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c index 9ebe544e51d0d..70e19f2a1a355 100644 --- a/drivers/net/wireless/realtek/rtw88/debug.c +++ b/drivers/net/wireless/realtek/rtw88/debug.c @@ -144,7 +144,9 @@ static int rtw_debugfs_get_rf_read(struct seq_file *m, void *v) addr = debugfs_priv->rf_addr; mask = debugfs_priv->rf_mask; + mutex_lock(&rtwdev->mutex); val = rtw_read_rf(rtwdev, path, addr, mask); + mutex_unlock(&rtwdev->mutex); seq_printf(m, "rf_read path:%d addr:0x%08x mask:0x%08x val=0x%08x\n", path, addr, mask, val); @@ -414,7 +416,9 @@ static ssize_t rtw_debugfs_set_rf_write(struct file *filp, return count; } + mutex_lock(&rtwdev->mutex); rtw_write_rf(rtwdev, path, addr, mask, val); + mutex_unlock(&rtwdev->mutex); rtw_dbg(rtwdev, RTW_DBG_DEBUGFS, "write_rf path:%d addr:0x%08x mask:0x%08x, val:0x%08x\n", path, addr, mask, val); @@ -519,6 +523,8 @@ static int rtw_debug_get_rf_dump(struct seq_file *m, void *v) u32 addr, offset, data; u8 path; + mutex_lock(&rtwdev->mutex); + for (path = 0; path < rtwdev->hal.rf_path_num; path++) { seq_printf(m, "RF path:%d\n", path); for (addr = 0; addr < 0x100; addr += 4) { @@ -533,6 +539,8 @@ static int rtw_debug_get_rf_dump(struct seq_file *m, void *v) seq_puts(m, "\n"); } + mutex_unlock(&rtwdev->mutex); + return 0; } @@ -1026,6 +1034,8 @@ static void dump_gapk_status(struct rtw_dev *rtwdev, struct seq_file *m) dm_info->dm_flags & BIT(RTW_DM_CAP_TXGAPK) ? '-' : '+', rtw_dm_cap_strs[RTW_DM_CAP_TXGAPK]); + mutex_lock(&rtwdev->mutex); + for (path = 0; path < rtwdev->hal.rf_path_num; path++) { val = rtw_read_rf(rtwdev, path, RF_GAINTX, RFREG_MASK); seq_printf(m, "path %d:\n0x%x = 0x%x\n", path, RF_GAINTX, val); @@ -1035,6 +1045,7 @@ static void dump_gapk_status(struct rtw_dev *rtwdev, struct seq_file *m) txgapk->rf3f_fs[path][i], i); seq_puts(m, "\n"); } + mutex_unlock(&rtwdev->mutex); } static int rtw_debugfs_get_dm_cap(struct seq_file *m, void *v) diff --git a/drivers/net/wireless/realtek/rtw88/hci.h b/drivers/net/wireless/realtek/rtw88/hci.h index 4c6fc6fb3f83b..830d7532f2a35 100644 --- a/drivers/net/wireless/realtek/rtw88/hci.h +++ b/drivers/net/wireless/realtek/rtw88/hci.h @@ -166,12 +166,11 @@ static inline u32 rtw_read_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path, u32 addr, u32 mask) { - unsigned long flags; u32 val; - spin_lock_irqsave(&rtwdev->rf_lock, flags); + lockdep_assert_held(&rtwdev->mutex); + val = rtwdev->chip->ops->read_rf(rtwdev, rf_path, addr, mask); - spin_unlock_irqrestore(&rtwdev->rf_lock, flags); return val; } @@ -180,11 +179,9 @@ static inline void rtw_write_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path, u32 addr, u32 mask, u32 data) { - unsigned long flags; + lockdep_assert_held(&rtwdev->mutex); - spin_lock_irqsave(&rtwdev->rf_lock, flags); rtwdev->chip->ops->write_rf(rtwdev, rf_path, addr, mask, data); - spin_unlock_irqrestore(&rtwdev->rf_lock, flags); } static inline u32 diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c index a7331872e8530..710ddb0283c82 100644 --- a/drivers/net/wireless/realtek/rtw88/main.c +++ b/drivers/net/wireless/realtek/rtw88/main.c @@ -2067,7 +2067,6 @@ int rtw_core_init(struct rtw_dev *rtwdev) skb_queue_head_init(&rtwdev->coex.queue); skb_queue_head_init(&rtwdev->tx_report.queue); - spin_lock_init(&rtwdev->rf_lock); spin_lock_init(&rtwdev->h2c.lock); spin_lock_init(&rtwdev->txq_lock); spin_lock_init(&rtwdev->tx_report.q_lock); diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h index 6e5875f6d07f4..f24d17f482aaa 100644 --- a/drivers/net/wireless/realtek/rtw88/main.h +++ b/drivers/net/wireless/realtek/rtw88/main.h @@ -1995,9 +1995,6 @@ struct rtw_dev { /* ensures exclusive access from mac80211 callbacks */ struct mutex mutex; - /* read/write rf register */ - spinlock_t rf_lock; - /* watch dog every 2 sec */ struct delayed_work watch_dog_work; u32 watch_dog_cnt; -- cgit From 1e2701f4079a7906ff3fb43a315925d303e289d8 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 2 Dec 2022 09:12:17 +0100 Subject: wifi: rtw88: Drop h2c.lock The h2c.lock spinlock is used in rtw_fw_send_h2c_command() and rtw_fw_send_h2c_packet(). Most callers call this with rtwdev->mutex held, except from one callsite in the debugfs code. The debugfs code alone doesn't justify the extra lock, so acquire rtwdev->mutex in debugfs and drop the now unnecessary spinlock. Signed-off-by: Sascha Hauer Signed-off-by: Kalle Valo Link: https://lore.kernel.org/r/20221202081224.2779981-5-s.hauer@pengutronix.de --- drivers/net/wireless/realtek/rtw88/debug.c | 2 ++ drivers/net/wireless/realtek/rtw88/fw.c | 13 ++++--------- drivers/net/wireless/realtek/rtw88/main.c | 1 - drivers/net/wireless/realtek/rtw88/main.h | 2 -- 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c index 70e19f2a1a355..f5b8a77ebc67b 100644 --- a/drivers/net/wireless/realtek/rtw88/debug.c +++ b/drivers/net/wireless/realtek/rtw88/debug.c @@ -392,7 +392,9 @@ static ssize_t rtw_debugfs_set_h2c(struct file *filp, return -EINVAL; } + mutex_lock(&rtwdev->mutex); rtw_fw_h2c_cmd_dbg(rtwdev, param); + mutex_unlock(&rtwdev->mutex); return count; } diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c index 5e760c884f89d..82295ac6402ee 100644 --- a/drivers/net/wireless/realtek/rtw88/fw.c +++ b/drivers/net/wireless/realtek/rtw88/fw.c @@ -322,7 +322,7 @@ static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev, h2c[3], h2c[2], h2c[1], h2c[0], h2c[7], h2c[6], h2c[5], h2c[4]); - spin_lock(&rtwdev->h2c.lock); + lockdep_assert_held(&rtwdev->mutex); box = rtwdev->h2c.last_box_num; switch (box) { @@ -344,7 +344,7 @@ static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev, break; default: WARN(1, "invalid h2c mail box number\n"); - goto out; + return; } ret = read_poll_timeout_atomic(rtw_read8, box_state, @@ -353,7 +353,7 @@ static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev, if (ret) { rtw_err(rtwdev, "failed to send h2c command\n"); - goto out; + return; } rtw_write32(rtwdev, box_ex_reg, le32_to_cpu(h2c_cmd->msg_ext)); @@ -361,9 +361,6 @@ static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev, if (++rtwdev->h2c.last_box_num >= 4) rtwdev->h2c.last_box_num = 0; - -out: - spin_unlock(&rtwdev->h2c.lock); } void rtw_fw_h2c_cmd_dbg(struct rtw_dev *rtwdev, u8 *h2c) @@ -375,15 +372,13 @@ static void rtw_fw_send_h2c_packet(struct rtw_dev *rtwdev, u8 *h2c_pkt) { int ret; - spin_lock(&rtwdev->h2c.lock); + lockdep_assert_held(&rtwdev->mutex); FW_OFFLOAD_H2C_SET_SEQ_NUM(h2c_pkt, rtwdev->h2c.seq); ret = rtw_hci_write_data_h2c(rtwdev, h2c_pkt, H2C_PKT_SIZE); if (ret) rtw_err(rtwdev, "failed to send h2c packet\n"); rtwdev->h2c.seq++; - - spin_unlock(&rtwdev->h2c.lock); } void diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c index 710ddb0283c82..c98e56890401c 100644 --- a/drivers/net/wireless/realtek/rtw88/main.c +++ b/drivers/net/wireless/realtek/rtw88/main.c @@ -2067,7 +2067,6 @@ int rtw_core_init(struct rtw_dev *rtwdev) skb_queue_head_init(&rtwdev->coex.queue); skb_queue_head_init(&rtwdev->tx_report.queue); - spin_lock_init(&rtwdev->h2c.lock); spin_lock_init(&rtwdev->txq_lock); spin_lock_init(&rtwdev->tx_report.q_lock); diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h index f24d17f482aaa..4b57542bef1e9 100644 --- a/drivers/net/wireless/realtek/rtw88/main.h +++ b/drivers/net/wireless/realtek/rtw88/main.h @@ -2020,8 +2020,6 @@ struct rtw_dev { struct { /* incicate the mail box to use with fw */ u8 last_box_num; - /* protect to send h2c to fw */ - spinlock_t lock; u32 seq; } h2c; -- cgit From 8647f7f0b9080bc2d2f6e02524782f2f02f159bc Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 2 Dec 2022 09:12:18 +0100 Subject: wifi: rtw88: Drop coex mutex coex->mutex is used in rtw_coex_info_request() only. Most callers of this function hold rtwdev->mutex already, except for one callsite in the debugfs code. The debugfs code alone doesn't justify the extra lock, so acquire rtwdev->mutex there as well and drop the now unnecessary spinlock. Signed-off-by: Sascha Hauer Signed-off-by: Kalle Valo Link: https://lore.kernel.org/r/20221202081224.2779981-6-s.hauer@pengutronix.de --- drivers/net/wireless/realtek/rtw88/coex.c | 3 +-- drivers/net/wireless/realtek/rtw88/debug.c | 2 ++ drivers/net/wireless/realtek/rtw88/main.c | 2 -- drivers/net/wireless/realtek/rtw88/main.h | 2 -- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/realtek/rtw88/coex.c index 6276ad6242991..38697237ee5f0 100644 --- a/drivers/net/wireless/realtek/rtw88/coex.c +++ b/drivers/net/wireless/realtek/rtw88/coex.c @@ -633,7 +633,7 @@ static struct sk_buff *rtw_coex_info_request(struct rtw_dev *rtwdev, struct rtw_coex *coex = &rtwdev->coex; struct sk_buff *skb_resp = NULL; - mutex_lock(&coex->mutex); + lockdep_assert_held(&rtwdev->mutex); rtw_fw_query_bt_mp_info(rtwdev, req); @@ -650,7 +650,6 @@ static struct sk_buff *rtw_coex_info_request(struct rtw_dev *rtwdev, } out: - mutex_unlock(&coex->mutex); return skb_resp; } diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c index f5b8a77ebc67b..fa3d73b333ba0 100644 --- a/drivers/net/wireless/realtek/rtw88/debug.c +++ b/drivers/net/wireless/realtek/rtw88/debug.c @@ -841,7 +841,9 @@ static int rtw_debugfs_get_coex_info(struct seq_file *m, void *v) struct rtw_debugfs_priv *debugfs_priv = m->private; struct rtw_dev *rtwdev = debugfs_priv->rtwdev; + mutex_lock(&rtwdev->mutex); rtw_coex_display_coex_info(rtwdev, m); + mutex_unlock(&rtwdev->mutex); return 0; } diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c index c98e56890401c..0a2ce7f50f412 100644 --- a/drivers/net/wireless/realtek/rtw88/main.c +++ b/drivers/net/wireless/realtek/rtw88/main.c @@ -2071,7 +2071,6 @@ int rtw_core_init(struct rtw_dev *rtwdev) spin_lock_init(&rtwdev->tx_report.q_lock); mutex_init(&rtwdev->mutex); - mutex_init(&rtwdev->coex.mutex); mutex_init(&rtwdev->hal.tx_power_mutex); init_waitqueue_head(&rtwdev->coex.wait); @@ -2143,7 +2142,6 @@ void rtw_core_deinit(struct rtw_dev *rtwdev) } mutex_destroy(&rtwdev->mutex); - mutex_destroy(&rtwdev->coex.mutex); mutex_destroy(&rtwdev->hal.tx_power_mutex); } EXPORT_SYMBOL(rtw_core_deinit); diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h index 4b57542bef1e9..77fd48b6cc453 100644 --- a/drivers/net/wireless/realtek/rtw88/main.h +++ b/drivers/net/wireless/realtek/rtw88/main.h @@ -1501,8 +1501,6 @@ struct rtw_coex_stat { }; struct rtw_coex { - /* protects coex info request section */ - struct mutex mutex; struct sk_buff_head queue; wait_queue_head_t wait; -- cgit From 78d5bf925f30bf9f79a69ce77386902672defe68 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 2 Dec 2022 09:12:19 +0100 Subject: wifi: rtw88: iterate over vif/sta list non-atomically The driver uses ieee80211_iterate_active_interfaces_atomic() and ieee80211_iterate_stations_atomic() in several places and does register accesses in the iterators. This doesn't cope with upcoming USB support as registers can only be accessed non-atomically. Split these into a two stage process: First use the atomic iterator functions to collect all active interfaces or stations on a list, then iterate over the list non-atomically and call the iterator on each entry. Signed-off-by: Sascha Hauer Suggested-by: Ping-Ke shih Reviewed-by: Ping-Ke Shih Signed-off-by: Kalle Valo Link: https://lore.kernel.org/r/20221202081224.2779981-7-s.hauer@pengutronix.de --- drivers/net/wireless/realtek/rtw88/phy.c | 6 +- drivers/net/wireless/realtek/rtw88/ps.c | 2 +- drivers/net/wireless/realtek/rtw88/util.c | 103 ++++++++++++++++++++++++++++++ drivers/net/wireless/realtek/rtw88/util.h | 12 +++- 4 files changed, 116 insertions(+), 7 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/realtek/rtw88/phy.c index bd7d05e080848..128e75a81bf3c 100644 --- a/drivers/net/wireless/realtek/rtw88/phy.c +++ b/drivers/net/wireless/realtek/rtw88/phy.c @@ -300,7 +300,7 @@ static void rtw_phy_stat_rssi(struct rtw_dev *rtwdev) data.rtwdev = rtwdev; data.min_rssi = U8_MAX; - rtw_iterate_stas_atomic(rtwdev, rtw_phy_stat_rssi_iter, &data); + rtw_iterate_stas(rtwdev, rtw_phy_stat_rssi_iter, &data); dm_info->pre_min_rssi = dm_info->min_rssi; dm_info->min_rssi = data.min_rssi; @@ -544,7 +544,7 @@ static void rtw_phy_ra_info_update(struct rtw_dev *rtwdev) if (rtwdev->watch_dog_cnt & 0x3) return; - rtw_iterate_stas_atomic(rtwdev, rtw_phy_ra_info_update_iter, rtwdev); + rtw_iterate_stas(rtwdev, rtw_phy_ra_info_update_iter, rtwdev); } static u32 rtw_phy_get_rrsr_mask(struct rtw_dev *rtwdev, u8 rate_idx) @@ -597,7 +597,7 @@ static void rtw_phy_rrsr_update(struct rtw_dev *rtwdev) struct rtw_dm_info *dm_info = &rtwdev->dm_info; dm_info->rrsr_mask_min = RRSR_RATE_ORDER_MAX; - rtw_iterate_stas_atomic(rtwdev, rtw_phy_rrsr_mask_min_iter, rtwdev); + rtw_iterate_stas(rtwdev, rtw_phy_rrsr_mask_min_iter, rtwdev); rtw_write32(rtwdev, REG_RRSR, dm_info->rrsr_val_init & dm_info->rrsr_mask_min); } diff --git a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/realtek/rtw88/ps.c index c93da743681fc..11594940d6b00 100644 --- a/drivers/net/wireless/realtek/rtw88/ps.c +++ b/drivers/net/wireless/realtek/rtw88/ps.c @@ -61,7 +61,7 @@ int rtw_leave_ips(struct rtw_dev *rtwdev) return ret; } - rtw_iterate_vifs_atomic(rtwdev, rtw_restore_port_cfg_iter, rtwdev); + rtw_iterate_vifs(rtwdev, rtw_restore_port_cfg_iter, rtwdev); rtw_coex_ips_notify(rtwdev, COEX_IPS_LEAVE); diff --git a/drivers/net/wireless/realtek/rtw88/util.c b/drivers/net/wireless/realtek/rtw88/util.c index cdfd66a85075a..ff3c269fb1a72 100644 --- a/drivers/net/wireless/realtek/rtw88/util.c +++ b/drivers/net/wireless/realtek/rtw88/util.c @@ -105,3 +105,106 @@ void rtw_desc_to_mcsrate(u16 rate, u8 *mcs, u8 *nss) *mcs = rate - DESC_RATEMCS0; } } + +struct rtw_stas_entry { + struct list_head list; + struct ieee80211_sta *sta; +}; + +struct rtw_iter_stas_data { + struct rtw_dev *rtwdev; + struct list_head list; +}; + +static void rtw_collect_sta_iter(void *data, struct ieee80211_sta *sta) +{ + struct rtw_iter_stas_data *iter_stas = data; + struct rtw_stas_entry *stas_entry; + + stas_entry = kmalloc(sizeof(*stas_entry), GFP_ATOMIC); + if (!stas_entry) + return; + + stas_entry->sta = sta; + list_add_tail(&stas_entry->list, &iter_stas->list); +} + +void rtw_iterate_stas(struct rtw_dev *rtwdev, + void (*iterator)(void *data, + struct ieee80211_sta *sta), + void *data) +{ + struct rtw_iter_stas_data iter_data; + struct rtw_stas_entry *sta_entry, *tmp; + + /* &rtwdev->mutex makes sure no stations can be removed between + * collecting the stations and iterating over them. + */ + lockdep_assert_held(&rtwdev->mutex); + + iter_data.rtwdev = rtwdev; + INIT_LIST_HEAD(&iter_data.list); + + ieee80211_iterate_stations_atomic(rtwdev->hw, rtw_collect_sta_iter, + &iter_data); + + list_for_each_entry_safe(sta_entry, tmp, &iter_data.list, + list) { + list_del_init(&sta_entry->list); + iterator(data, sta_entry->sta); + kfree(sta_entry); + } +} + +struct rtw_vifs_entry { + struct list_head list; + struct ieee80211_vif *vif; + u8 mac[ETH_ALEN]; +}; + +struct rtw_iter_vifs_data { + struct rtw_dev *rtwdev; + struct list_head list; +}; + +static void rtw_collect_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif) +{ + struct rtw_iter_vifs_data *iter_stas = data; + struct rtw_vifs_entry *vifs_entry; + + vifs_entry = kmalloc(sizeof(*vifs_entry), GFP_ATOMIC); + if (!vifs_entry) + return; + + vifs_entry->vif = vif; + ether_addr_copy(vifs_entry->mac, mac); + list_add_tail(&vifs_entry->list, &iter_stas->list); +} + +void rtw_iterate_vifs(struct rtw_dev *rtwdev, + void (*iterator)(void *data, u8 *mac, + struct ieee80211_vif *vif), + void *data) +{ + struct rtw_iter_vifs_data iter_data; + struct rtw_vifs_entry *vif_entry, *tmp; + + /* &rtwdev->mutex makes sure no interfaces can be removed between + * collecting the interfaces and iterating over them. + */ + lockdep_assert_held(&rtwdev->mutex); + + iter_data.rtwdev = rtwdev; + INIT_LIST_HEAD(&iter_data.list); + + ieee80211_iterate_active_interfaces_atomic(rtwdev->hw, + IEEE80211_IFACE_ITER_NORMAL, + rtw_collect_vif_iter, &iter_data); + + list_for_each_entry_safe(vif_entry, tmp, &iter_data.list, + list) { + list_del_init(&vif_entry->list); + iterator(data, vif_entry->mac, vif_entry->vif); + kfree(vif_entry); + } +} diff --git a/drivers/net/wireless/realtek/rtw88/util.h b/drivers/net/wireless/realtek/rtw88/util.h index 0c23b5069be0b..dc89655254002 100644 --- a/drivers/net/wireless/realtek/rtw88/util.h +++ b/drivers/net/wireless/realtek/rtw88/util.h @@ -7,9 +7,6 @@ struct rtw_dev; -#define rtw_iterate_vifs(rtwdev, iterator, data) \ - ieee80211_iterate_active_interfaces(rtwdev->hw, \ - IEEE80211_IFACE_ITER_NORMAL, iterator, data) #define rtw_iterate_vifs_atomic(rtwdev, iterator, data) \ ieee80211_iterate_active_interfaces_atomic(rtwdev->hw, \ IEEE80211_IFACE_ITER_NORMAL, iterator, data) @@ -20,6 +17,15 @@ struct rtw_dev; #define rtw_iterate_keys_rcu(rtwdev, vif, iterator, data) \ ieee80211_iter_keys_rcu((rtwdev)->hw, vif, iterator, data) +void rtw_iterate_vifs(struct rtw_dev *rtwdev, + void (*iterator)(void *data, u8 *mac, + struct ieee80211_vif *vif), + void *data); +void rtw_iterate_stas(struct rtw_dev *rtwdev, + void (*iterator)(void *data, + struct ieee80211_sta *sta), + void *data); + static inline u8 *get_hdr_bssid(struct ieee80211_hdr *hdr) { __le16 fc = hdr->frame_control; -- cgit From a82dfd33d1237f6c0fb8a7077022189d1fc7ec98 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 2 Dec 2022 09:12:20 +0100 Subject: wifi: rtw88: Add common USB chip support Add the common bits and pieces to add USB support to the RTW88 driver. This is based on https://github.com/ulli-kroll/rtw88-usb.git which itself is first written by Neo Jou. Signed-off-by: neo_jou Signed-off-by: Hans Ulli Kroll Signed-off-by: Sascha Hauer Signed-off-by: Kalle Valo Link: https://lore.kernel.org/r/20221202081224.2779981-8-s.hauer@pengutronix.de --- drivers/net/wireless/realtek/rtw88/Kconfig | 3 + drivers/net/wireless/realtek/rtw88/Makefile | 3 + drivers/net/wireless/realtek/rtw88/mac.c | 3 + drivers/net/wireless/realtek/rtw88/main.c | 4 + drivers/net/wireless/realtek/rtw88/main.h | 4 + drivers/net/wireless/realtek/rtw88/reg.h | 1 + drivers/net/wireless/realtek/rtw88/tx.h | 31 + drivers/net/wireless/realtek/rtw88/usb.c | 911 ++++++++++++++++++++++++++++ drivers/net/wireless/realtek/rtw88/usb.h | 107 ++++ 9 files changed, 1067 insertions(+) create mode 100644 drivers/net/wireless/realtek/rtw88/usb.c create mode 100644 drivers/net/wireless/realtek/rtw88/usb.h diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig index e3d7cb6c12902..1624c5db69bac 100644 --- a/drivers/net/wireless/realtek/rtw88/Kconfig +++ b/drivers/net/wireless/realtek/rtw88/Kconfig @@ -16,6 +16,9 @@ config RTW88_CORE config RTW88_PCI tristate +config RTW88_USB + tristate + config RTW88_8822B tristate diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile index 834c66ec0af9e..2c2b0e5133cdf 100644 --- a/drivers/net/wireless/realtek/rtw88/Makefile +++ b/drivers/net/wireless/realtek/rtw88/Makefile @@ -46,3 +46,6 @@ rtw88_8821ce-objs := rtw8821ce.o obj-$(CONFIG_RTW88_PCI) += rtw88_pci.o rtw88_pci-objs := pci.o + +obj-$(CONFIG_RTW88_USB) += rtw88_usb.o +rtw88_usb-objs := usb.o diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c index c7e64f7036ac2..98777f294945f 100644 --- a/drivers/net/wireless/realtek/rtw88/mac.c +++ b/drivers/net/wireless/realtek/rtw88/mac.c @@ -1048,6 +1048,9 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev) if (rtw_chip_wcpu_11ac(rtwdev)) rtw_write32(rtwdev, REG_H2CQ_CSR, BIT_H2CQ_FULL); + if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) + rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_ARBBW_EN); + return 0; } diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c index 0a2ce7f50f412..888427cf3bdf9 100644 --- a/drivers/net/wireless/realtek/rtw88/main.c +++ b/drivers/net/wireless/realtek/rtw88/main.c @@ -1783,6 +1783,10 @@ static int rtw_chip_parameter_setup(struct rtw_dev *rtwdev) rtwdev->hci.rpwm_addr = 0x03d9; rtwdev->hci.cpwm_addr = 0x03da; break; + case RTW_HCI_TYPE_USB: + rtwdev->hci.rpwm_addr = 0xfe58; + rtwdev->hci.cpwm_addr = 0xfe57; + break; default: rtw_err(rtwdev, "unsupported hci type\n"); return -EINVAL; diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h index 77fd48b6cc453..165f299e8e1f9 100644 --- a/drivers/net/wireless/realtek/rtw88/main.h +++ b/drivers/net/wireless/realtek/rtw88/main.h @@ -871,6 +871,10 @@ struct rtw_chip_ops { bool is_tx2_path); void (*config_txrx_mode)(struct rtw_dev *rtwdev, u8 tx_path, u8 rx_path, bool is_tx2_path); + /* for USB/SDIO only */ + void (*fill_txdesc_checksum)(struct rtw_dev *rtwdev, + struct rtw_tx_pkt_info *pkt_info, + u8 *txdesc); /* for coex */ void (*coex_set_init)(struct rtw_dev *rtwdev); diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h index 03bd8dc53f72a..8852b24d6c2ac 100644 --- a/drivers/net/wireless/realtek/rtw88/reg.h +++ b/drivers/net/wireless/realtek/rtw88/reg.h @@ -184,6 +184,7 @@ #define BIT_TXDMA_VIQ_MAP(x) \ (((x) & BIT_MASK_TXDMA_VIQ_MAP) << BIT_SHIFT_TXDMA_VIQ_MAP) #define REG_TXDMA_PQ_MAP 0x010C +#define BIT_RXDMA_ARBBW_EN BIT(0) #define BIT_SHIFT_TXDMA_BEQ_MAP 8 #define BIT_MASK_TXDMA_BEQ_MAP 0x3 #define BIT_TXDMA_BEQ_MAP(x) \ diff --git a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/realtek/rtw88/tx.h index 8419603adce4a..a2f3ac326041b 100644 --- a/drivers/net/wireless/realtek/rtw88/tx.h +++ b/drivers/net/wireless/realtek/rtw88/tx.h @@ -71,6 +71,14 @@ le32p_replace_bits((__le32 *)(txdesc) + 0x03, value, BIT(15)) #define SET_TX_DESC_BT_NULL(txdesc, value) \ le32p_replace_bits((__le32 *)(txdesc) + 0x02, value, BIT(23)) +#define SET_TX_DESC_TXDESC_CHECKSUM(txdesc, value) \ + le32p_replace_bits((__le32 *)(txdesc) + 0x07, value, GENMASK(15, 0)) +#define SET_TX_DESC_DMA_TXAGG_NUM(txdesc, value) \ + le32p_replace_bits((__le32 *)(txdesc) + 0x07, value, GENMASK(31, 24)) +#define GET_TX_DESC_PKT_OFFSET(txdesc) \ + le32_get_bits(*((__le32 *)(txdesc) + 0x01), GENMASK(28, 24)) +#define GET_TX_DESC_QSEL(txdesc) \ + le32_get_bits(*((__le32 *)(txdesc) + 0x01), GENMASK(12, 8)) enum rtw_tx_desc_queue_select { TX_DESC_QSEL_TID0 = 0, @@ -123,4 +131,27 @@ rtw_tx_write_data_h2c_get(struct rtw_dev *rtwdev, struct rtw_tx_pkt_info *pkt_info, u8 *buf, u32 size); +static inline +void fill_txdesc_checksum_common(u8 *txdesc, size_t words) +{ + __le16 chksum = 0; + __le16 *data = (__le16 *)(txdesc); + + SET_TX_DESC_TXDESC_CHECKSUM(txdesc, 0x0000); + + while (words--) + chksum ^= *data++; + + SET_TX_DESC_TXDESC_CHECKSUM(txdesc, __le16_to_cpu(chksum)); +} + +static inline void rtw_tx_fill_txdesc_checksum(struct rtw_dev *rtwdev, + struct rtw_tx_pkt_info *pkt_info, + u8 *txdesc) +{ + const struct rtw_chip_info *chip = rtwdev->chip; + + chip->ops->fill_txdesc_checksum(rtwdev, pkt_info, txdesc); +} + #endif diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c new file mode 100644 index 0000000000000..4ef38279b64c9 --- /dev/null +++ b/drivers/net/wireless/realtek/rtw88/usb.c @@ -0,0 +1,911 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) 2018-2019 Realtek Corporation + */ + +#include +#include +#include +#include "main.h" +#include "debug.h" +#include "reg.h" +#include "tx.h" +#include "rx.h" +#include "fw.h" +#include "ps.h" +#include "usb.h" + +#define RTW_USB_MAX_RXQ_LEN 512 + +struct rtw_usb_txcb { + struct rtw_dev *rtwdev; + struct sk_buff_head tx_ack_queue; +}; + +static void rtw_usb_fill_tx_checksum(struct rtw_usb *rtwusb, + struct sk_buff *skb, int agg_num) +{ + struct rtw_dev *rtwdev = rtwusb->rtwdev; + struct rtw_tx_pkt_info pkt_info; + + SET_TX_DESC_DMA_TXAGG_NUM(skb->data, agg_num); + pkt_info.pkt_offset = GET_TX_DESC_PKT_OFFSET(skb->data); + rtw_tx_fill_txdesc_checksum(rtwdev, &pkt_info, skb->data); +} + +static u32 rtw_usb_read(struct rtw_dev *rtwdev, u32 addr, u16 len) +{ + struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); + struct usb_device *udev = rtwusb->udev; + __le32 *data; + unsigned long flags; + int idx, ret; + static int count; + + spin_lock_irqsave(&rtwusb->usb_lock, flags); + + idx = rtwusb->usb_data_index; + rtwusb->usb_data_index = (idx + 1) & (RTW_USB_MAX_RXTX_COUNT - 1); + + spin_unlock_irqrestore(&rtwusb->usb_lock, flags); + + data = &rtwusb->usb_data[idx]; + + ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), + RTW_USB_CMD_REQ, RTW_USB_CMD_READ, addr, + RTW_USB_VENQT_CMD_IDX, data, len, 1000); + if (ret < 0 && ret != -ENODEV && count++ < 4) + rtw_err(rtwdev, "read register 0x%x failed with %d\n", + addr, ret); + + return le32_to_cpu(*data); +} + +static u8 rtw_usb_read8(struct rtw_dev *rtwdev, u32 addr) +{ + return (u8)rtw_usb_read(rtwdev, addr, 1); +} + +static u16 rtw_usb_read16(struct rtw_dev *rtwdev, u32 addr) +{ + return (u16)rtw_usb_read(rtwdev, addr, 2); +} + +static u32 rtw_usb_read32(struct rtw_dev *rtwdev, u32 addr) +{ + return (u32)rtw_usb_read(rtwdev, addr, 4); +} + +static void rtw_usb_write(struct rtw_dev *rtwdev, u32 addr, u32 val, int len) +{ + struct rtw_usb *rtwusb = (struct rtw_usb *)rtwdev->priv; + struct usb_device *udev = rtwusb->udev; + unsigned long flags; + __le32 *data; + int idx, ret; + static int count; + + spin_lock_irqsave(&rtwusb->usb_lock, flags); + + idx = rtwusb->usb_data_index; + rtwusb->usb_data_index = (idx + 1) & (RTW_USB_MAX_RXTX_COUNT - 1); + + spin_unlock_irqrestore(&rtwusb->usb_lock, flags); + + data = &rtwusb->usb_data[idx]; + + *data = cpu_to_le32(val); + + ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), + RTW_USB_CMD_REQ, RTW_USB_CMD_WRITE, + addr, 0, data, len, 30000); + if (ret < 0 && ret != -ENODEV && count++ < 4) + rtw_err(rtwdev, "write register 0x%x failed with %d\n", + addr, ret); +} + +static void rtw_usb_write8(struct rtw_dev *rtwdev, u32 addr, u8 val) +{ + rtw_usb_write(rtwdev, addr, val, 1); +} + +static void rtw_usb_write16(struct rtw_dev *rtwdev, u32 addr, u16 val) +{ + rtw_usb_write(rtwdev, addr, val, 2); +} + +static void rtw_usb_write32(struct rtw_dev *rtwdev, u32 addr, u32 val) +{ + rtw_usb_write(rtwdev, addr, val, 4); +} + +static int rtw_usb_parse(struct rtw_dev *rtwdev, + struct usb_interface *interface) +{ + struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); + struct usb_host_interface *host_interface = &interface->altsetting[0]; + struct usb_interface_descriptor *interface_desc = &host_interface->desc; + struct usb_endpoint_descriptor *endpoint; + struct usb_device *usbd = interface_to_usbdev(interface); + int num_out_pipes = 0; + int i; + u8 num; + + for (i = 0; i < interface_desc->bNumEndpoints; i++) { + endpoint = &host_interface->endpoint[i].desc; + num = usb_endpoint_num(endpoint); + + if (usb_endpoint_dir_in(endpoint) && + usb_endpoint_xfer_bulk(endpoint)) { + if (rtwusb->pipe_in) { + rtw_err(rtwdev, "IN pipes overflow\n"); + return -EINVAL; + } + + rtwusb->pipe_in = num; + } + + if (usb_endpoint_dir_in(endpoint) && + usb_endpoint_xfer_int(endpoint)) { + if (rtwusb->pipe_interrupt) { + rtw_err(rtwdev, "INT pipes overflow\n"); + return -EINVAL; + } + + rtwusb->pipe_interrupt = num; + } + + if (usb_endpoint_dir_out(endpoint) && + usb_endpoint_xfer_bulk(endpoint)) { + if (num_out_pipes >= ARRAY_SIZE(rtwusb->out_ep)) { + rtw_err(rtwdev, "OUT pipes overflow\n"); + return -EINVAL; + } + + rtwusb->out_ep[num_out_pipes++] = num; + } + } + + switch (usbd->speed) { + case USB_SPEED_LOW: + case USB_SPEED_FULL: + rtwusb->bulkout_size = RTW_USB_FULL_SPEED_BULK_SIZE; + break; + case USB_SPEED_HIGH: + rtwusb->bulkout_size = RTW_USB_HIGH_SPEED_BULK_SIZE; + break; + case USB_SPEED_SUPER: + rtwusb->bulkout_size = RTW_USB_SUPER_SPEED_BULK_SIZE; + break; + default: + rtw_err(rtwdev, "failed to detect usb speed\n"); + return -EINVAL; + } + + rtwdev->hci.bulkout_num = num_out_pipes; + + switch (num_out_pipes) { + case 4: + case 3: + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID0] = 2; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID1] = 2; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID2] = 2; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID3] = 2; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID4] = 1; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID5] = 1; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID6] = 0; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID7] = 0; + break; + case 2: + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID0] = 1; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID1] = 1; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID2] = 1; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID3] = 1; + break; + case 1: + break; + default: + rtw_err(rtwdev, "failed to get out_pipes(%d)\n", num_out_pipes); + return -EINVAL; + } + + return 0; +} + +static void rtw_usb_write_port_tx_complete(struct urb *urb) +{ + struct rtw_usb_txcb *txcb = urb->context; + struct rtw_dev *rtwdev = txcb->rtwdev; + struct ieee80211_hw *hw = rtwdev->hw; + + while (true) { + struct sk_buff *skb = skb_dequeue(&txcb->tx_ack_queue); + struct ieee80211_tx_info *info; + struct rtw_usb_tx_data *tx_data; + + if (!skb) + break; + + info = IEEE80211_SKB_CB(skb); + tx_data = rtw_usb_get_tx_data(skb); + + /* enqueue to wait for tx report */ + if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) { + rtw_tx_report_enqueue(rtwdev, skb, tx_data->sn); + continue; + } + + /* always ACK for others, then they won't be marked as drop */ + ieee80211_tx_info_clear_status(info); + if (info->flags & IEEE80211_TX_CTL_NO_ACK) + info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED; + else + info->flags |= IEEE80211_TX_STAT_ACK; + + ieee80211_tx_status_irqsafe(hw, skb); + } + + kfree(txcb); +} + +static int qsel_to_ep(struct rtw_usb *rtwusb, unsigned int qsel) +{ + if (qsel >= ARRAY_SIZE(rtwusb->qsel_to_ep)) + return 0; + + return rtwusb->qsel_to_ep[qsel]; +} + +static int rtw_usb_write_port(struct rtw_dev *rtwdev, u8 qsel, struct sk_buff *skb, + usb_complete_t cb, void *context) +{ + struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); + struct usb_device *usbd = rtwusb->udev; + struct urb *urb; + unsigned int pipe; + int ret; + int ep = qsel_to_ep(rtwusb, qsel); + + pipe = usb_sndbulkpipe(usbd, rtwusb->out_ep[ep]); + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (!urb) + return -ENOMEM; + + usb_fill_bulk_urb(urb, usbd, pipe, skb->data, skb->len, cb, context); + ret = usb_submit_urb(urb, GFP_ATOMIC); + + usb_free_urb(urb); + + return ret; +} + +static bool rtw_usb_tx_agg_skb(struct rtw_usb *rtwusb, struct sk_buff_head *list) +{ + struct rtw_dev *rtwdev = rtwusb->rtwdev; + struct rtw_usb_txcb *txcb; + struct sk_buff *skb_head; + struct sk_buff *skb_iter; + int agg_num = 0; + unsigned int align_next = 0; + + if (skb_queue_empty(list)) + return false; + + txcb = kmalloc(sizeof(*txcb), GFP_ATOMIC); + if (!txcb) + return false; + + txcb->rtwdev = rtwdev; + skb_queue_head_init(&txcb->tx_ack_queue); + + skb_iter = skb_dequeue(list); + + if (skb_queue_empty(list)) { + skb_head = skb_iter; + goto queue; + } + + skb_head = dev_alloc_skb(RTW_USB_MAX_XMITBUF_SZ); + if (!skb_head) { + skb_head = skb_iter; + goto queue; + } + + while (skb_iter) { + unsigned long flags; + + skb_put(skb_head, align_next); + skb_put_data(skb_head, skb_iter->data, skb_iter->len); + + align_next = ALIGN(skb_iter->len, 8) - skb_iter->len; + + agg_num++; + + skb_queue_tail(&txcb->tx_ack_queue, skb_iter); + + spin_lock_irqsave(&list->lock, flags); + + skb_iter = skb_peek(list); + + if (skb_iter && skb_iter->len + skb_head->len <= RTW_USB_MAX_XMITBUF_SZ) + __skb_unlink(skb_iter, list); + else + skb_iter = NULL; + spin_unlock_irqrestore(&list->lock, flags); + } + + if (agg_num > 1) + rtw_usb_fill_tx_checksum(rtwusb, skb_head, agg_num); + +queue: + skb_queue_tail(&txcb->tx_ack_queue, skb_head); + + rtw_usb_write_port(rtwdev, GET_TX_DESC_QSEL(skb_head->data), skb_head, + rtw_usb_write_port_tx_complete, txcb); + + return true; +} + +static void rtw_usb_tx_handler(struct work_struct *work) +{ + struct rtw_usb *rtwusb = container_of(work, struct rtw_usb, tx_work); + int i, limit; + + for (i = ARRAY_SIZE(rtwusb->tx_queue) - 1; i >= 0; i--) { + for (limit = 0; limit < 200; limit++) { + struct sk_buff_head *list = &rtwusb->tx_queue[i]; + + if (!rtw_usb_tx_agg_skb(rtwusb, list)) + break; + } + } +} + +static void rtw_usb_tx_queue_purge(struct rtw_usb *rtwusb) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(rtwusb->tx_queue); i++) + skb_queue_purge(&rtwusb->tx_queue[i]); +} + +static void rtw_usb_write_port_complete(struct urb *urb) +{ + struct sk_buff *skb = urb->context; + + dev_kfree_skb_any(skb); +} + +static int rtw_usb_write_data(struct rtw_dev *rtwdev, + struct rtw_tx_pkt_info *pkt_info, + u8 *buf) +{ + const struct rtw_chip_info *chip = rtwdev->chip; + struct sk_buff *skb; + unsigned int desclen, headsize, size; + u8 qsel; + int ret = 0; + + size = pkt_info->tx_pkt_size; + qsel = pkt_info->qsel; + desclen = chip->tx_pkt_desc_sz; + headsize = pkt_info->offset ? pkt_info->offset : desclen; + + skb = dev_alloc_skb(headsize + size); + if (unlikely(!skb)) + return -ENOMEM; + + skb_reserve(skb, headsize); + skb_put_data(skb, buf, size); + skb_push(skb, headsize); + memset(skb->data, 0, headsize); + rtw_tx_fill_tx_desc(pkt_info, skb); + rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data); + + ret = rtw_usb_write_port(rtwdev, qsel, skb, + rtw_usb_write_port_complete, skb); + if (unlikely(ret)) + rtw_err(rtwdev, "failed to do USB write, ret=%d\n", ret); + + return ret; +} + +static int rtw_usb_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, + u32 size) +{ + const struct rtw_chip_info *chip = rtwdev->chip; + struct rtw_usb *rtwusb; + struct rtw_tx_pkt_info pkt_info = {0}; + u32 len, desclen; + + rtwusb = rtw_get_usb_priv(rtwdev); + + pkt_info.tx_pkt_size = size; + pkt_info.qsel = TX_DESC_QSEL_BEACON; + + desclen = chip->tx_pkt_desc_sz; + len = desclen + size; + if (len % rtwusb->bulkout_size == 0) { + len += RTW_USB_PACKET_OFFSET_SZ; + pkt_info.offset = desclen + RTW_USB_PACKET_OFFSET_SZ; + pkt_info.pkt_offset = 1; + } else { + pkt_info.offset = desclen; + } + + return rtw_usb_write_data(rtwdev, &pkt_info, buf); +} + +static int rtw_usb_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size) +{ + struct rtw_tx_pkt_info pkt_info = {0}; + + pkt_info.tx_pkt_size = size; + pkt_info.qsel = TX_DESC_QSEL_H2C; + + return rtw_usb_write_data(rtwdev, &pkt_info, buf); +} + +static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb) +{ + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; + __le16 fc = hdr->frame_control; + u8 qsel; + + if (unlikely(ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc))) + qsel = TX_DESC_QSEL_MGMT; + else if (skb_get_queue_mapping(skb) <= IEEE80211_AC_BK) + qsel = skb->priority; + else + qsel = TX_DESC_QSEL_BEACON; + + return qsel; +} + +static int rtw_usb_tx_write(struct rtw_dev *rtwdev, + struct rtw_tx_pkt_info *pkt_info, + struct sk_buff *skb) +{ + struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); + const struct rtw_chip_info *chip = rtwdev->chip; + struct rtw_usb_tx_data *tx_data; + u8 *pkt_desc; + int ep; + + pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz); + memset(pkt_desc, 0, chip->tx_pkt_desc_sz); + pkt_info->qsel = rtw_usb_tx_queue_mapping_to_qsel(skb); + ep = qsel_to_ep(rtwusb, pkt_info->qsel); + rtw_tx_fill_tx_desc(pkt_info, skb); + rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data); + tx_data = rtw_usb_get_tx_data(skb); + tx_data->sn = pkt_info->sn; + + skb_queue_tail(&rtwusb->tx_queue[ep], skb); + + return 0; +} + +static void rtw_usb_tx_kick_off(struct rtw_dev *rtwdev) +{ + struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); + + queue_work(rtwusb->txwq, &rtwusb->tx_work); +} + +static void rtw_usb_rx_handler(struct work_struct *work) +{ + struct rtw_usb *rtwusb = container_of(work, struct rtw_usb, rx_work); + struct rtw_dev *rtwdev = rtwusb->rtwdev; + const struct rtw_chip_info *chip = rtwdev->chip; + struct rtw_rx_pkt_stat pkt_stat; + struct ieee80211_rx_status rx_status; + struct sk_buff *skb; + u32 pkt_desc_sz = chip->rx_pkt_desc_sz; + u32 pkt_offset; + u8 *rx_desc; + int limit; + + for (limit = 0; limit < 200; limit++) { + skb = skb_dequeue(&rtwusb->rx_queue); + if (!skb) + break; + + rx_desc = skb->data; + chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat, + &rx_status); + pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz + + pkt_stat.shift; + + if (pkt_stat.is_c2h) { + skb_put(skb, pkt_stat.pkt_len + pkt_offset); + rtw_fw_c2h_cmd_rx_irqsafe(rtwdev, pkt_offset, skb); + continue; + } + + if (skb_queue_len(&rtwusb->rx_queue) >= RTW_USB_MAX_RXQ_LEN) { + rtw_err(rtwdev, "failed to get rx_queue, overflow\n"); + dev_kfree_skb_any(skb); + continue; + } + + skb_put(skb, pkt_stat.pkt_len); + skb_reserve(skb, pkt_offset); + memcpy(skb->cb, &rx_status, sizeof(rx_status)); + ieee80211_rx_irqsafe(rtwdev->hw, skb); + } +} + +static void rtw_usb_read_port_complete(struct urb *urb); + +static void rtw_usb_rx_resubmit(struct rtw_usb *rtwusb, struct rx_usb_ctrl_block *rxcb) +{ + struct rtw_dev *rtwdev = rtwusb->rtwdev; + int error; + + rxcb->rx_skb = alloc_skb(RTW_USB_MAX_RECVBUF_SZ, GFP_ATOMIC); + if (!rxcb->rx_skb) + return; + + usb_fill_bulk_urb(rxcb->rx_urb, rtwusb->udev, + usb_rcvbulkpipe(rtwusb->udev, rtwusb->pipe_in), + rxcb->rx_skb->data, RTW_USB_MAX_RECVBUF_SZ, + rtw_usb_read_port_complete, rxcb); + + error = usb_submit_urb(rxcb->rx_urb, GFP_ATOMIC); + if (error) { + kfree_skb(rxcb->rx_skb); + if (error != -ENODEV) + rtw_err(rtwdev, "Err sending rx data urb %d\n", + error); + } +} + +static void rtw_usb_read_port_complete(struct urb *urb) +{ + struct rx_usb_ctrl_block *rxcb = urb->context; + struct rtw_dev *rtwdev = rxcb->rtwdev; + struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); + struct sk_buff *skb = rxcb->rx_skb; + + if (urb->status == 0) { + if (urb->actual_length >= RTW_USB_MAX_RECVBUF_SZ || + urb->actual_length < 24) { + rtw_err(rtwdev, "failed to get urb length:%d\n", + urb->actual_length); + if (skb) + dev_kfree_skb_any(skb); + } else { + skb_queue_tail(&rtwusb->rx_queue, skb); + queue_work(rtwusb->rxwq, &rtwusb->rx_work); + } + rtw_usb_rx_resubmit(rtwusb, rxcb); + } else { + switch (urb->status) { + case -EINVAL: + case -EPIPE: + case -ENODEV: + case -ESHUTDOWN: + case -ENOENT: + case -EPROTO: + case -EILSEQ: + case -ETIME: + case -ECOMM: + case -EOVERFLOW: + case -EINPROGRESS: + break; + default: + rtw_err(rtwdev, "status %d\n", urb->status); + break; + } + if (skb) + dev_kfree_skb_any(skb); + } +} + +static void rtw_usb_cancel_rx_bufs(struct rtw_usb *rtwusb) +{ + struct rx_usb_ctrl_block *rxcb; + int i; + + for (i = 0; i < RTW_USB_RXCB_NUM; i++) { + rxcb = &rtwusb->rx_cb[i]; + if (rxcb->rx_urb) + usb_kill_urb(rxcb->rx_urb); + } +} + +static void rtw_usb_free_rx_bufs(struct rtw_usb *rtwusb) +{ + struct rx_usb_ctrl_block *rxcb; + int i; + + for (i = 0; i < RTW_USB_RXCB_NUM; i++) { + rxcb = &rtwusb->rx_cb[i]; + if (rxcb->rx_urb) { + usb_kill_urb(rxcb->rx_urb); + usb_free_urb(rxcb->rx_urb); + } + } +} + +static int rtw_usb_alloc_rx_bufs(struct rtw_usb *rtwusb) +{ + int i; + + for (i = 0; i < RTW_USB_RXCB_NUM; i++) { + struct rx_usb_ctrl_block *rxcb = &rtwusb->rx_cb[i]; + + rxcb->n = i; + rxcb->rtwdev = rtwusb->rtwdev; + rxcb->rx_urb = usb_alloc_urb(0, GFP_KERNEL); + if (!rxcb->rx_urb) + goto err; + } + + return 0; +err: + rtw_usb_free_rx_bufs(rtwusb); + return -ENOMEM; +} + +static int rtw_usb_setup(struct rtw_dev *rtwdev) +{ + /* empty function for rtw_hci_ops */ + return 0; +} + +static int rtw_usb_start(struct rtw_dev *rtwdev) +{ + return 0; +} + +static void rtw_usb_stop(struct rtw_dev *rtwdev) +{ +} + +static void rtw_usb_deep_ps(struct rtw_dev *rtwdev, bool enter) +{ + /* empty function for rtw_hci_ops */ +} + +static void rtw_usb_link_ps(struct rtw_dev *rtwdev, bool enter) +{ + /* empty function for rtw_hci_ops */ +} + +static void rtw_usb_interface_cfg(struct rtw_dev *rtwdev) +{ + /* empty function for rtw_hci_ops */ +} + +static struct rtw_hci_ops rtw_usb_ops = { + .tx_write = rtw_usb_tx_write, + .tx_kick_off = rtw_usb_tx_kick_off, + .setup = rtw_usb_setup, + .start = rtw_usb_start, + .stop = rtw_usb_stop, + .deep_ps = rtw_usb_deep_ps, + .link_ps = rtw_usb_link_ps, + .interface_cfg = rtw_usb_interface_cfg, + + .write8 = rtw_usb_write8, + .write16 = rtw_usb_write16, + .write32 = rtw_usb_write32, + .read8 = rtw_usb_read8, + .read16 = rtw_usb_read16, + .read32 = rtw_usb_read32, + + .write_data_rsvd_page = rtw_usb_write_data_rsvd_page, + .write_data_h2c = rtw_usb_write_data_h2c, +}; + +static int rtw_usb_init_rx(struct rtw_dev *rtwdev) +{ + struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); + int i; + + rtwusb->rxwq = create_singlethread_workqueue("rtw88_usb: rx wq"); + if (!rtwusb->rxwq) { + rtw_err(rtwdev, "failed to create RX work queue\n"); + return -ENOMEM; + } + + skb_queue_head_init(&rtwusb->rx_queue); + + INIT_WORK(&rtwusb->rx_work, rtw_usb_rx_handler); + + for (i = 0; i < RTW_USB_RXCB_NUM; i++) { + struct rx_usb_ctrl_block *rxcb = &rtwusb->rx_cb[i]; + + rtw_usb_rx_resubmit(rtwusb, rxcb); + } + + return 0; +} + +static void rtw_usb_deinit_rx(struct rtw_dev *rtwdev) +{ + struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); + + skb_queue_purge(&rtwusb->rx_queue); + + flush_workqueue(rtwusb->rxwq); + destroy_workqueue(rtwusb->rxwq); +} + +static int rtw_usb_init_tx(struct rtw_dev *rtwdev) +{ + struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); + int i; + + rtwusb->txwq = create_singlethread_workqueue("rtw88_usb: tx wq"); + if (!rtwusb->txwq) { + rtw_err(rtwdev, "failed to create TX work queue\n"); + return -ENOMEM; + } + + for (i = 0; i < ARRAY_SIZE(rtwusb->tx_queue); i++) + skb_queue_head_init(&rtwusb->tx_queue[i]); + + INIT_WORK(&rtwusb->tx_work, rtw_usb_tx_handler); + + return 0; +} + +static void rtw_usb_deinit_tx(struct rtw_dev *rtwdev) +{ + struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); + + rtw_usb_tx_queue_purge(rtwusb); + flush_workqueue(rtwusb->txwq); + destroy_workqueue(rtwusb->txwq); +} + +static int rtw_usb_intf_init(struct rtw_dev *rtwdev, + struct usb_interface *intf) +{ + struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); + struct usb_device *udev = usb_get_dev(interface_to_usbdev(intf)); + int ret; + + rtwusb->udev = udev; + ret = rtw_usb_parse(rtwdev, intf); + if (ret) + return ret; + + rtwusb->usb_data = kcalloc(RTW_USB_MAX_RXTX_COUNT, sizeof(u32), + GFP_KERNEL); + if (!rtwusb->usb_data) + return -ENOMEM; + + usb_set_intfdata(intf, rtwdev->hw); + + SET_IEEE80211_DEV(rtwdev->hw, &intf->dev); + spin_lock_init(&rtwusb->usb_lock); + + return 0; +} + +static void rtw_usb_intf_deinit(struct rtw_dev *rtwdev, + struct usb_interface *intf) +{ + struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); + + usb_put_dev(rtwusb->udev); + usb_set_intfdata(intf, NULL); +} + +int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) +{ + struct rtw_dev *rtwdev; + struct ieee80211_hw *hw; + struct rtw_usb *rtwusb; + int drv_data_size; + int ret; + + drv_data_size = sizeof(struct rtw_dev) + sizeof(struct rtw_usb); + hw = ieee80211_alloc_hw(drv_data_size, &rtw_ops); + if (!hw) + return -ENOMEM; + + rtwdev = hw->priv; + rtwdev->hw = hw; + rtwdev->dev = &intf->dev; + rtwdev->chip = (struct rtw_chip_info *)id->driver_info; + rtwdev->hci.ops = &rtw_usb_ops; + rtwdev->hci.type = RTW_HCI_TYPE_USB; + + rtwusb = rtw_get_usb_priv(rtwdev); + rtwusb->rtwdev = rtwdev; + + ret = rtw_usb_alloc_rx_bufs(rtwusb); + if (ret) + return ret; + + ret = rtw_core_init(rtwdev); + if (ret) + goto err_release_hw; + + ret = rtw_usb_intf_init(rtwdev, intf); + if (ret) { + rtw_err(rtwdev, "failed to init USB interface\n"); + goto err_deinit_core; + } + + ret = rtw_usb_init_tx(rtwdev); + if (ret) { + rtw_err(rtwdev, "failed to init USB TX\n"); + goto err_destroy_usb; + } + + ret = rtw_usb_init_rx(rtwdev); + if (ret) { + rtw_err(rtwdev, "failed to init USB RX\n"); + goto err_destroy_txwq; + } + + ret = rtw_chip_info_setup(rtwdev); + if (ret) { + rtw_err(rtwdev, "failed to setup chip information\n"); + goto err_destroy_rxwq; + } + + ret = rtw_register_hw(rtwdev, rtwdev->hw); + if (ret) { + rtw_err(rtwdev, "failed to register hw\n"); + goto err_destroy_rxwq; + } + + return 0; + +err_destroy_rxwq: + rtw_usb_deinit_rx(rtwdev); + +err_destroy_txwq: + rtw_usb_deinit_tx(rtwdev); + +err_destroy_usb: + rtw_usb_intf_deinit(rtwdev, intf); + +err_deinit_core: + rtw_core_deinit(rtwdev); + +err_release_hw: + ieee80211_free_hw(hw); + + return ret; +} +EXPORT_SYMBOL(rtw_usb_probe); + +void rtw_usb_disconnect(struct usb_interface *intf) +{ + struct ieee80211_hw *hw = usb_get_intfdata(intf); + struct rtw_dev *rtwdev; + struct rtw_usb *rtwusb; + + if (!hw) + return; + + rtwdev = hw->priv; + rtwusb = rtw_get_usb_priv(rtwdev); + + rtw_usb_cancel_rx_bufs(rtwusb); + + rtw_unregister_hw(rtwdev, hw); + rtw_usb_deinit_tx(rtwdev); + rtw_usb_deinit_rx(rtwdev); + + if (rtwusb->udev->state != USB_STATE_NOTATTACHED) + usb_reset_device(rtwusb->udev); + + rtw_usb_free_rx_bufs(rtwusb); + + rtw_usb_intf_deinit(rtwdev, intf); + rtw_core_deinit(rtwdev); + ieee80211_free_hw(hw); +} +EXPORT_SYMBOL(rtw_usb_disconnect); + +MODULE_AUTHOR("Realtek Corporation"); +MODULE_DESCRIPTION("Realtek 802.11ac wireless USB driver"); +MODULE_LICENSE("Dual BSD/GPL"); diff --git a/drivers/net/wireless/realtek/rtw88/usb.h b/drivers/net/wireless/realtek/rtw88/usb.h new file mode 100644 index 0000000000000..30647f0dd61c6 --- /dev/null +++ b/drivers/net/wireless/realtek/rtw88/usb.h @@ -0,0 +1,107 @@ +/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ +/* Copyright(c) 2018-2019 Realtek Corporation + */ + +#ifndef __RTW_USB_H_ +#define __RTW_USB_H_ + +#define FW_8192C_START_ADDRESS 0x1000 +#define FW_8192C_END_ADDRESS 0x5fff + +#define RTW_USB_MAX_RXTX_COUNT 128 +#define RTW_USB_VENQT_MAX_BUF_SIZE 254 +#define MAX_USBCTRL_VENDORREQ_TIMES 10 + +#define RTW_USB_CMD_READ 0xc0 +#define RTW_USB_CMD_WRITE 0x40 +#define RTW_USB_CMD_REQ 0x05 + +#define RTW_USB_VENQT_CMD_IDX 0x00 + +#define RTW_USB_SUPER_SPEED_BULK_SIZE 1024 +#define RTW_USB_HIGH_SPEED_BULK_SIZE 512 +#define RTW_USB_FULL_SPEED_BULK_SIZE 64 + +#define RTW_USB_TX_SEL_HQ BIT(0) +#define RTW_USB_TX_SEL_LQ BIT(1) +#define RTW_USB_TX_SEL_NQ BIT(2) +#define RTW_USB_TX_SEL_EQ BIT(3) + +#define RTW_USB_BULK_IN_ADDR 0x80 +#define RTW_USB_INT_IN_ADDR 0x81 + +#define RTW_USB_HW_QUEUE_ENTRY 8 + +#define RTW_USB_PACKET_OFFSET_SZ 8 +#define RTW_USB_MAX_XMITBUF_SZ (1024 * 20) +#define RTW_USB_MAX_RECVBUF_SZ 32768 + +#define RTW_USB_RECVBUFF_ALIGN_SZ 8 + +#define RTW_USB_RXAGG_SIZE 6 +#define RTW_USB_RXAGG_TIMEOUT 10 + +#define RTW_USB_RXCB_NUM 4 + +#define RTW_USB_EP_MAX 4 + +#define TX_DESC_QSEL_MAX 20 + +#define RTW_USB_VENDOR_ID_REALTEK 0x0bda + +static inline struct rtw_usb *rtw_get_usb_priv(struct rtw_dev *rtwdev) +{ + return (struct rtw_usb *)rtwdev->priv; +} + +struct rx_usb_ctrl_block { + struct rtw_dev *rtwdev; + struct urb *rx_urb; + struct sk_buff *rx_skb; + int n; +}; + +struct rtw_usb_tx_data { + u8 sn; +}; + +struct rtw_usb { + struct rtw_dev *rtwdev; + struct usb_device *udev; + + /* protects usb_data_index */ + spinlock_t usb_lock; + __le32 *usb_data; + unsigned int usb_data_index; + + u32 bulkout_size; + u8 pipe_interrupt; + u8 pipe_in; + u8 out_ep[RTW_USB_EP_MAX]; + u8 qsel_to_ep[TX_DESC_QSEL_MAX]; + u8 usb_txagg_num; + + struct workqueue_struct *txwq, *rxwq; + + struct sk_buff_head tx_queue[RTW_USB_EP_MAX]; + struct work_struct tx_work; + + struct rx_usb_ctrl_block rx_cb[RTW_USB_RXCB_NUM]; + struct sk_buff_head rx_queue; + struct work_struct rx_work; +}; + +static inline struct rtw_usb_tx_data *rtw_usb_get_tx_data(struct sk_buff *skb) +{ + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); + + BUILD_BUG_ON(sizeof(struct rtw_usb_tx_data) > + sizeof(info->status.status_driver_data)); + + return (struct rtw_usb_tx_data *)info->status.status_driver_data; +} + +int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id); +void rtw_usb_disconnect(struct usb_interface *intf); + +#endif -- cgit From aff5ffd718de23cb8603f2e229204670e2644334 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 2 Dec 2022 09:12:21 +0100 Subject: wifi: rtw88: Add rtw8821cu chipset support Add support for the rtw8821cu chipset based on https://github.com/ulli-kroll/rtw88-usb.git Signed-off-by: Sascha Hauer Signed-off-by: Kalle Valo Link: https://lore.kernel.org/r/20221202081224.2779981-9-s.hauer@pengutronix.de --- drivers/net/wireless/realtek/rtw88/Kconfig | 11 ++++++ drivers/net/wireless/realtek/rtw88/Makefile | 3 ++ drivers/net/wireless/realtek/rtw88/rtw8821c.c | 18 ++++++++++ drivers/net/wireless/realtek/rtw88/rtw8821c.h | 21 +++++++++++ drivers/net/wireless/realtek/rtw88/rtw8821cu.c | 50 ++++++++++++++++++++++++++ 5 files changed, 103 insertions(+) create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8821cu.c diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig index 1624c5db69bac..2b500dbefbc2d 100644 --- a/drivers/net/wireless/realtek/rtw88/Kconfig +++ b/drivers/net/wireless/realtek/rtw88/Kconfig @@ -75,6 +75,17 @@ config RTW88_8821CE 802.11ac PCIe wireless network adapter +config RTW88_8821CU + tristate "Realtek 8821CU USB wireless network adapter" + depends on USB + select RTW88_CORE + select RTW88_USB + select RTW88_8821C + help + Select this option will enable support for 8821CU chipset + + 802.11ac USB wireless network adapter + config RTW88_DEBUG bool "Realtek rtw88 debug support" depends on RTW88_CORE diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile index 2c2b0e5133cdf..552661a638def 100644 --- a/drivers/net/wireless/realtek/rtw88/Makefile +++ b/drivers/net/wireless/realtek/rtw88/Makefile @@ -44,6 +44,9 @@ rtw88_8821c-objs := rtw8821c.o rtw8821c_table.o obj-$(CONFIG_RTW88_8821CE) += rtw88_8821ce.o rtw88_8821ce-objs := rtw8821ce.o +obj-$(CONFIG_RTW88_8821CU) += rtw88_8821cu.o +rtw88_8821cu-objs := rtw8821cu.o + obj-$(CONFIG_RTW88_PCI) += rtw88_pci.o rtw88_pci-objs := pci.o diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c index 9afdc5ce86b43..17f800f6efbd0 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c @@ -26,6 +26,12 @@ static void rtw8821ce_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->e.mac_addr); } +static void rtw8821cu_efuse_parsing(struct rtw_efuse *efuse, + struct rtw8821c_efuse *map) +{ + ether_addr_copy(efuse->addr, map->u.mac_addr); +} + enum rtw8821ce_rf_set { SWITCH_TO_BTG, SWITCH_TO_WLG, @@ -68,6 +74,9 @@ static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_PCIE: rtw8821ce_efuse_parsing(efuse, map); break; + case RTW_HCI_TYPE_USB: + rtw8821cu_efuse_parsing(efuse, map); + break; default: /* unsupported now */ return -ENOTSUPP; @@ -1148,6 +1157,13 @@ static void rtw8821c_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl) dm_info->cck_pd_default + new_lvl * 2); } +static void rtw8821c_fill_txdesc_checksum(struct rtw_dev *rtwdev, + struct rtw_tx_pkt_info *pkt_info, + u8 *txdesc) +{ + fill_txdesc_checksum_common(txdesc, 16); +} + static struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8821c[] = { {0x0086, RTW_PWR_CUT_ALL_MSK, @@ -1521,6 +1537,7 @@ static const struct rtw_rfe_def rtw8821c_rfe_defs[] = { [2] = RTW_DEF_RFE_EXT(8821c, 0, 0, 2), [4] = RTW_DEF_RFE_EXT(8821c, 0, 0, 2), [6] = RTW_DEF_RFE(8821c, 0, 0), + [34] = RTW_DEF_RFE(8821c, 0, 0), }; static struct rtw_hw_reg rtw8821c_dig[] = { @@ -1595,6 +1612,7 @@ static struct rtw_chip_ops rtw8821c_ops = { .config_bfee = rtw8821c_bf_config_bfee, .set_gid_table = rtw_bf_set_gid_table, .cfg_csi_rate = rtw_bf_cfg_csi_rate, + .fill_txdesc_checksum = rtw8821c_fill_txdesc_checksum, .coex_set_init = rtw8821c_coex_cfg_init, .coex_set_ant_switch = rtw8821c_coex_cfg_ant_switch, diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireless/realtek/rtw88/rtw8821c.h index 2698801fc35d5..1c81260f3a542 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8821c.h +++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.h @@ -9,6 +9,26 @@ #define RCR_VHT_ACK BIT(26) +struct rtw8821cu_efuse { + u8 res4[4]; /* 0xd0 */ + u8 usb_optional_function; + u8 res5[0x1e]; + u8 res6[2]; + u8 serial[0x0b]; /* 0xf5 */ + u8 vid; /* 0x100 */ + u8 res7; + u8 pid; + u8 res8[4]; + u8 mac_addr[ETH_ALEN]; /* 0x107 */ + u8 res9[2]; + u8 vendor_name[0x07]; + u8 res10[2]; + u8 device_name[0x14]; + u8 res11[0xcf]; + u8 package_type; /* 0x1fb */ + u8 res12[0x4]; +}; + struct rtw8821ce_efuse { u8 mac_addr[ETH_ALEN]; /* 0xd0 */ u8 vender_id[2]; @@ -73,6 +93,7 @@ struct rtw8821c_efuse { u8 res[3]; union { struct rtw8821ce_efuse e; + struct rtw8821cu_efuse u; }; }; diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821cu.c b/drivers/net/wireless/realtek/rtw88/rtw8821cu.c new file mode 100644 index 0000000000000..7a5cbdc31ef79 --- /dev/null +++ b/drivers/net/wireless/realtek/rtw88/rtw8821cu.c @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) 2018-2019 Realtek Corporation + */ + +#include +#include +#include "main.h" +#include "rtw8821c.h" +#include "usb.h" + +static const struct usb_device_id rtw_8821cu_id_table[] = { + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb82b, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */ + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb820, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */ + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc821, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */ + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc820, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */ + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82a, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */ + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82b, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */ + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc811, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8811CU */ + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x8811, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8811CU */ + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x2006, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* TOTOLINK A650UA v3 */ + {}, +}; +MODULE_DEVICE_TABLE(usb, rtw_8821cu_id_table); + +static int rtw_8821cu_probe(struct usb_interface *intf, + const struct usb_device_id *id) +{ + return rtw_usb_probe(intf, id); +} + +static struct usb_driver rtw_8821cu_driver = { + .name = "rtw_8821cu", + .id_table = rtw_8821cu_id_table, + .probe = rtw_8821cu_probe, + .disconnect = rtw_usb_disconnect, +}; +module_usb_driver(rtw_8821cu_driver); + +MODULE_AUTHOR("Hans Ulli Kroll "); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821cu driver"); +MODULE_LICENSE("Dual BSD/GPL"); -- cgit From 45794099f5e1d7abc5eb07e6eec7e1e5c6cb540d Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 2 Dec 2022 09:12:22 +0100 Subject: wifi: rtw88: Add rtw8822bu chipset support Add support for the rtw8822bu chipset based on https://github.com/ulli-kroll/rtw88-usb.git Signed-off-by: Sascha Hauer Signed-off-by: Kalle Valo Link: https://lore.kernel.org/r/20221202081224.2779981-10-s.hauer@pengutronix.de --- drivers/net/wireless/realtek/rtw88/Kconfig | 11 ++++ drivers/net/wireless/realtek/rtw88/Makefile | 3 + drivers/net/wireless/realtek/rtw88/rtw8822b.c | 19 ++++++ drivers/net/wireless/realtek/rtw88/rtw8822bu.c | 90 ++++++++++++++++++++++++++ 4 files changed, 123 insertions(+) create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822bu.c diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig index 2b500dbefbc2d..10f4e7f88b858 100644 --- a/drivers/net/wireless/realtek/rtw88/Kconfig +++ b/drivers/net/wireless/realtek/rtw88/Kconfig @@ -42,6 +42,17 @@ config RTW88_8822BE 802.11ac PCIe wireless network adapter +config RTW88_8822BU + tristate "Realtek 8822BU USB wireless network adapter" + depends on USB + select RTW88_CORE + select RTW88_USB + select RTW88_8822B + help + Select this option will enable support for 8822BU chipset + + 802.11ac USB wireless network adapter + config RTW88_8822CE tristate "Realtek 8822CE PCI wireless network adapter" depends on PCI diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile index 552661a638def..6984bfb7a3170 100644 --- a/drivers/net/wireless/realtek/rtw88/Makefile +++ b/drivers/net/wireless/realtek/rtw88/Makefile @@ -26,6 +26,9 @@ rtw88_8822b-objs := rtw8822b.o rtw8822b_table.o obj-$(CONFIG_RTW88_8822BE) += rtw88_8822be.o rtw88_8822be-objs := rtw8822be.o +obj-$(CONFIG_RTW88_8822BU) += rtw88_8822bu.o +rtw88_8822bu-objs := rtw8822bu.o + obj-$(CONFIG_RTW88_8822C) += rtw88_8822c.o rtw88_8822c-objs := rtw8822c.o rtw8822c_table.o diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c index 690e35c98f6e5..74dfb89b2c948 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c @@ -26,6 +26,12 @@ static void rtw8822be_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->e.mac_addr); } +static void rtw8822bu_efuse_parsing(struct rtw_efuse *efuse, + struct rtw8822b_efuse *map) +{ + ether_addr_copy(efuse->addr, map->u.mac_addr); +} + static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) { struct rtw_efuse *efuse = &rtwdev->efuse; @@ -56,6 +62,9 @@ static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_PCIE: rtw8822be_efuse_parsing(efuse, map); break; + case RTW_HCI_TYPE_USB: + rtw8822bu_efuse_parsing(efuse, map); + break; default: /* unsupported now */ return -ENOTSUPP; @@ -1588,6 +1597,15 @@ static void rtw8822b_adaptivity(struct rtw_dev *rtwdev) rtw_phy_set_edcca_th(rtwdev, l2h, h2l); } +static void rtw8822b_fill_txdesc_checksum(struct rtw_dev *rtwdev, + struct rtw_tx_pkt_info *pkt_info, + u8 *txdesc) +{ + size_t words = 32 / 2; /* calculate the first 32 bytes (16 words) */ + + fill_txdesc_checksum_common(txdesc, words); +} + static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8822b[] = { {0x0086, RTW_PWR_CUT_ALL_MSK, @@ -2163,6 +2181,7 @@ static struct rtw_chip_ops rtw8822b_ops = { .cfg_csi_rate = rtw_bf_cfg_csi_rate, .adaptivity_init = rtw8822b_adaptivity_init, .adaptivity = rtw8822b_adaptivity, + .fill_txdesc_checksum = rtw8822b_fill_txdesc_checksum, .coex_set_init = rtw8822b_coex_cfg_init, .coex_set_ant_switch = rtw8822b_coex_cfg_ant_switch, diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822bu.c b/drivers/net/wireless/realtek/rtw88/rtw8822bu.c new file mode 100644 index 0000000000000..ab620a0b1dfc6 --- /dev/null +++ b/drivers/net/wireless/realtek/rtw88/rtw8822bu.c @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) 2018-2019 Realtek Corporation + */ + +#include +#include +#include "main.h" +#include "rtw8822b.h" +#include "usb.h" + +static const struct usb_device_id rtw_8822bu_id_table[] = { + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb812, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb82c, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x2102, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* CCNC */ + { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xb822, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Edimax EW-7822ULC */ + { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xc822, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Edimax EW-7822UTC */ + { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xd822, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Edimax */ + { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xe822, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Edimax */ + { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xf822, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Edimax EW-7822UAD */ + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb81a, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Default ID */ + { USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x1841, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* ASUS AC1300 USB-AC55 B1 */ + { USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x184c, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* ASUS U2 */ + { USB_DEVICE_AND_INTERFACE_INFO(0x0B05, 0x19aa, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* ASUS - USB-AC58 rev A1 */ + { USB_DEVICE_AND_INTERFACE_INFO(0x0B05, 0x1870, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* ASUS */ + { USB_DEVICE_AND_INTERFACE_INFO(0x0B05, 0x1874, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* ASUS */ + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x331e, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Dlink - DWA-181 */ + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x331c, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Dlink - DWA-182 - D1 */ + {USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x331f, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec)}, /* Dlink - DWA-183 D Ver */ + { USB_DEVICE_AND_INTERFACE_INFO(0x13b1, 0x0043, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Linksys WUSB6400M */ + { USB_DEVICE_AND_INTERFACE_INFO(0x13b1, 0x0045, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Linksys WUSB3600 v2 */ + { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x012d, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* TP-Link Archer T3U v1 */ + { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0138, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* TP-Link Archer T3U Plus v1 */ + { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0115, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* TP-Link Archer T4U V3 */ + { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x012e, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* TP-LINK */ + { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0116, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* TP-LINK */ + { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0117, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* TP-LINK */ + { USB_DEVICE_AND_INTERFACE_INFO(0x0846, 0x9055, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Netgear A6150 */ + { USB_DEVICE_AND_INTERFACE_INFO(0x0e66, 0x0025, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Hawking HW12ACU */ + { USB_DEVICE_AND_INTERFACE_INFO(0x04ca, 0x8602, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* LiteOn */ + { USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x808a, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* TRENDnet TEW-808UBM */ + {}, +}; +MODULE_DEVICE_TABLE(usb, rtw_8822bu_id_table); + +static int rtw8822bu_probe(struct usb_interface *intf, + const struct usb_device_id *id) +{ + return rtw_usb_probe(intf, id); +} + +static struct usb_driver rtw_8822bu_driver = { + .name = "rtw_8822bu", + .id_table = rtw_8822bu_id_table, + .probe = rtw8822bu_probe, + .disconnect = rtw_usb_disconnect, +}; +module_usb_driver(rtw_8822bu_driver); + +MODULE_AUTHOR("Realtek Corporation"); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822bu driver"); +MODULE_LICENSE("Dual BSD/GPL"); -- cgit From 07cef03b8d44dee7488de3d1585387e603c78676 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 2 Dec 2022 09:12:23 +0100 Subject: wifi: rtw88: Add rtw8822cu chipset support Add support for the rtw8822cu chipset based on https://github.com/ulli-kroll/rtw88-usb.git Signed-off-by: Sascha Hauer Signed-off-by: Kalle Valo Link: https://lore.kernel.org/r/20221202081224.2779981-11-s.hauer@pengutronix.de --- drivers/net/wireless/realtek/rtw88/Kconfig | 11 +++++++ drivers/net/wireless/realtek/rtw88/Makefile | 3 ++ drivers/net/wireless/realtek/rtw88/rtw8822c.c | 24 ++++++++++++++ drivers/net/wireless/realtek/rtw88/rtw8822cu.c | 44 ++++++++++++++++++++++++++ 4 files changed, 82 insertions(+) create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822cu.c diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig index 10f4e7f88b858..138289bc5ad0c 100644 --- a/drivers/net/wireless/realtek/rtw88/Kconfig +++ b/drivers/net/wireless/realtek/rtw88/Kconfig @@ -64,6 +64,17 @@ config RTW88_8822CE 802.11ac PCIe wireless network adapter +config RTW88_8822CU + tristate "Realtek 8822CU USB wireless network adapter" + depends on USB + select RTW88_CORE + select RTW88_USB + select RTW88_8822C + help + Select this option will enable support for 8822CU chipset + + 802.11ac USB wireless network adapter + config RTW88_8723DE tristate "Realtek 8723DE PCI wireless network adapter" depends on PCI diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile index 6984bfb7a3170..fe2dd90204a78 100644 --- a/drivers/net/wireless/realtek/rtw88/Makefile +++ b/drivers/net/wireless/realtek/rtw88/Makefile @@ -35,6 +35,9 @@ rtw88_8822c-objs := rtw8822c.o rtw8822c_table.o obj-$(CONFIG_RTW88_8822CE) += rtw88_8822ce.o rtw88_8822ce-objs := rtw8822ce.o +obj-$(CONFIG_RTW88_8822CU) += rtw88_8822cu.o +rtw88_8822cu-objs := rtw8822cu.o + obj-$(CONFIG_RTW88_8723D) += rtw88_8723d.o rtw88_8723d-objs := rtw8723d.o rtw8723d_table.o diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c index fccb15dfb9595..964e27887fe2d 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c @@ -29,6 +29,12 @@ static void rtw8822ce_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->e.mac_addr); } +static void rtw8822cu_efuse_parsing(struct rtw_efuse *efuse, + struct rtw8822c_efuse *map) +{ + ether_addr_copy(efuse->addr, map->u.mac_addr); +} + static int rtw8822c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) { struct rtw_efuse *efuse = &rtwdev->efuse; @@ -58,6 +64,9 @@ static int rtw8822c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_PCIE: rtw8822ce_efuse_parsing(efuse, map); break; + case RTW_HCI_TYPE_USB: + rtw8822cu_efuse_parsing(efuse, map); + break; default: /* unsupported now */ return -ENOTSUPP; @@ -4557,6 +4566,18 @@ static void rtw8822c_adaptivity(struct rtw_dev *rtwdev) rtw_phy_set_edcca_th(rtwdev, l2h, h2l); } +static void rtw8822c_fill_txdesc_checksum(struct rtw_dev *rtwdev, + struct rtw_tx_pkt_info *pkt_info, + u8 *txdesc) +{ + const struct rtw_chip_info *chip = rtwdev->chip; + size_t words; + + words = (pkt_info->pkt_offset * 8 + chip->tx_pkt_desc_sz) / 2; + + fill_txdesc_checksum_common(txdesc, words); +} + static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8822c[] = { {0x0086, RTW_PWR_CUT_ALL_MSK, @@ -4895,6 +4916,8 @@ static const struct rtw_rfe_def rtw8822c_rfe_defs[] = { [0] = RTW_DEF_RFE(8822c, 0, 0), [1] = RTW_DEF_RFE(8822c, 0, 0), [2] = RTW_DEF_RFE(8822c, 0, 0), + [3] = RTW_DEF_RFE(8822c, 0, 0), + [4] = RTW_DEF_RFE(8822c, 0, 0), [5] = RTW_DEF_RFE(8822c, 0, 5), [6] = RTW_DEF_RFE(8822c, 0, 0), }; @@ -4978,6 +5001,7 @@ static struct rtw_chip_ops rtw8822c_ops = { .cfo_track = rtw8822c_cfo_track, .config_tx_path = rtw8822c_config_tx_path, .config_txrx_mode = rtw8822c_config_trx_mode, + .fill_txdesc_checksum = rtw8822c_fill_txdesc_checksum, .coex_set_init = rtw8822c_coex_cfg_init, .coex_set_ant_switch = NULL, diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822cu.c b/drivers/net/wireless/realtek/rtw88/rtw8822cu.c new file mode 100644 index 0000000000000..af28ca09d41fb --- /dev/null +++ b/drivers/net/wireless/realtek/rtw88/rtw8822cu.c @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) 2018-2019 Realtek Corporation + */ + +#include +#include +#include "main.h" +#include "rtw8822c.h" +#include "usb.h" + +static const struct usb_device_id rtw_8822cu_id_table[] = { + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82c, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822c_hw_spec) }, + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc812, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822c_hw_spec) }, + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82e, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822c_hw_spec) }, + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xd820, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822c_hw_spec) }, + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xd82b, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822c_hw_spec) }, + { USB_DEVICE_AND_INTERFACE_INFO(0x13b1, 0x0043, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8822c_hw_spec) }, /* Alpha - Alpha */ + {}, +}; +MODULE_DEVICE_TABLE(usb, rtw_8822cu_id_table); + +static int rtw8822bu_probe(struct usb_interface *intf, + const struct usb_device_id *id) +{ + return rtw_usb_probe(intf, id); +} + +static struct usb_driver rtw_8822cu_driver = { + .name = "rtw_8822cu", + .id_table = rtw_8822cu_id_table, + .probe = rtw8822bu_probe, + .disconnect = rtw_usb_disconnect, +}; +module_usb_driver(rtw_8822cu_driver); + +MODULE_AUTHOR("Realtek Corporation"); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822cu driver"); +MODULE_LICENSE("Dual BSD/GPL"); -- cgit From 87caeef032fc3921bc866ad7becb6ed51aa8b27b Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 2 Dec 2022 09:12:24 +0100 Subject: wifi: rtw88: Add rtw8723du chipset support Add support for the rtw8723du chipset based on https://github.com/ulli-kroll/rtw88-usb.git Signed-off-by: Sascha Hauer Signed-off-by: Kalle Valo Link: https://lore.kernel.org/r/20221202081224.2779981-12-s.hauer@pengutronix.de --- drivers/net/wireless/realtek/rtw88/Kconfig | 11 ++++++++ drivers/net/wireless/realtek/rtw88/Makefile | 3 +++ drivers/net/wireless/realtek/rtw88/rtw8723d.c | 28 ++++++++++++++++++++ drivers/net/wireless/realtek/rtw88/rtw8723d.h | 13 +++++++++- drivers/net/wireless/realtek/rtw88/rtw8723du.c | 36 ++++++++++++++++++++++++++ 5 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8723du.c diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig index 138289bc5ad0c..651ab56d9c6bd 100644 --- a/drivers/net/wireless/realtek/rtw88/Kconfig +++ b/drivers/net/wireless/realtek/rtw88/Kconfig @@ -86,6 +86,17 @@ config RTW88_8723DE 802.11n PCIe wireless network adapter +config RTW88_8723DU + tristate "Realtek 8723DU USB wireless network adapter" + depends on USB + select RTW88_CORE + select RTW88_USB + select RTW88_8723D + help + Select this option will enable support for 8723DU chipset + + 802.11n USB wireless network adapter + config RTW88_8821CE tristate "Realtek 8821CE PCI wireless network adapter" depends on PCI diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile index fe2dd90204a78..fe7293ee87b45 100644 --- a/drivers/net/wireless/realtek/rtw88/Makefile +++ b/drivers/net/wireless/realtek/rtw88/Makefile @@ -44,6 +44,9 @@ rtw88_8723d-objs := rtw8723d.o rtw8723d_table.o obj-$(CONFIG_RTW88_8723DE) += rtw88_8723de.o rtw88_8723de-objs := rtw8723de.o +obj-$(CONFIG_RTW88_8723DU) += rtw88_8723du.o +rtw88_8723du-objs := rtw8723du.o + obj-$(CONFIG_RTW88_8821C) += rtw88_8821c.o rtw88_8821c-objs := rtw8821c.o rtw8821c_table.o diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c index 0a4f770fcbb7e..2d2f768bae2ea 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c @@ -210,6 +210,12 @@ static void rtw8723de_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->e.mac_addr); } +static void rtw8723du_efuse_parsing(struct rtw_efuse *efuse, + struct rtw8723d_efuse *map) +{ + ether_addr_copy(efuse->addr, map->u.mac_addr); +} + static int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) { struct rtw_efuse *efuse = &rtwdev->efuse; @@ -239,6 +245,9 @@ static int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_PCIE: rtw8723de_efuse_parsing(efuse, map); break; + case RTW_HCI_TYPE_USB: + rtw8723du_efuse_parsing(efuse, map); + break; default: /* unsupported now */ return -ENOTSUPP; @@ -1945,6 +1954,24 @@ static void rtw8723d_pwr_track(struct rtw_dev *rtwdev) dm_info->pwr_trk_triggered = false; } +static void rtw8723d_fill_txdesc_checksum(struct rtw_dev *rtwdev, + struct rtw_tx_pkt_info *pkt_info, + u8 *txdesc) +{ + size_t words = 32 / 2; /* calculate the first 32 bytes (16 words) */ + __le16 chksum = 0; + __le16 *data = (__le16 *)(txdesc); + + SET_TX_DESC_TXDESC_CHECKSUM(txdesc, 0x0000); + + while (words--) + chksum ^= *data++; + + chksum = ~chksum; + + SET_TX_DESC_TXDESC_CHECKSUM(txdesc, __le16_to_cpu(chksum)); +} + static struct rtw_chip_ops rtw8723d_ops = { .phy_set_param = rtw8723d_phy_set_param, .read_efuse = rtw8723d_read_efuse, @@ -1965,6 +1992,7 @@ static struct rtw_chip_ops rtw8723d_ops = { .config_bfee = NULL, .set_gid_table = NULL, .cfg_csi_rate = NULL, + .fill_txdesc_checksum = rtw8723d_fill_txdesc_checksum, .coex_set_init = rtw8723d_coex_cfg_init, .coex_set_ant_switch = NULL, diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireless/realtek/rtw88/rtw8723d.h index 4641f6e047b41..a356318a5c15b 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8723d.h +++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.h @@ -41,6 +41,14 @@ struct rtw8723de_efuse { u8 sub_device_id[2]; }; +struct rtw8723du_efuse { + u8 res4[48]; /* 0xd0 */ + u8 vender_id[2]; /* 0x100 */ + u8 product_id[2]; /* 0x102 */ + u8 usb_option; /* 0x104 */ + u8 mac_addr[ETH_ALEN]; /* 0x107 */ +}; + struct rtw8723d_efuse { __le16 rtl_id; u8 rsvd[2]; @@ -69,7 +77,10 @@ struct rtw8723d_efuse { u8 rfe_option; u8 country_code[2]; u8 res[3]; - struct rtw8723de_efuse e; + union { + struct rtw8723de_efuse e; + struct rtw8723du_efuse u; + }; }; extern const struct rtw_chip_info rtw8723d_hw_spec; diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723du.c b/drivers/net/wireless/realtek/rtw88/rtw8723du.c new file mode 100644 index 0000000000000..322a805da76b0 --- /dev/null +++ b/drivers/net/wireless/realtek/rtw88/rtw8723du.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) 2018-2019 Realtek Corporation + */ + +#include +#include +#include "main.h" +#include "rtw8723d.h" +#include "usb.h" + +static const struct usb_device_id rtw_8723du_id_table[] = { + { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xd723, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8723d_hw_spec) }, /* 8723DU 1*1 */ + { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xd611, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&(rtw8723d_hw_spec) }, /* Edimax EW-7611ULB V2 */ + { }, +}; +MODULE_DEVICE_TABLE(usb, rtw_8723du_id_table); + +static int rtw8723du_probe(struct usb_interface *intf, + const struct usb_device_id *id) +{ + return rtw_usb_probe(intf, id); +} + +static struct usb_driver rtw_8723du_driver = { + .name = "rtw_8723du", + .id_table = rtw_8723du_id_table, + .probe = rtw8723du_probe, + .disconnect = rtw_usb_disconnect, +}; +module_usb_driver(rtw_8723du_driver); + +MODULE_AUTHOR("Hans Ulli Kroll "); +MODULE_DESCRIPTION("Realtek 802.11n wireless 8723du driver"); +MODULE_LICENSE("Dual BSD/GPL"); -- cgit ================================================ FILE: packages/linux/patches/default/linux-122-rtw88-USB-fixes.patch ================================================ From: Sascha Hauer To: linux-wireless@vger.kernel.org Cc: Neo Jou , Hans Ulli Kroll , Ping-Ke Shih , Yan-Hsuan Chuang , Kalle Valo , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Martin Blumenstingl , kernel@pengutronix.de, Alexander Hochbaum , Da Xue , Po-Hao Huang , Andreas Henriksson , Viktor Petrenko , Sascha Hauer Subject: [PATCH v2 0/3] wifi: rtw88: USB fixes Date: Fri, 10 Feb 2023 12:16:29 +0100 Message-Id: <20230210111632.1985205-1-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: sha@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-wireless@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org This series addresses issues for the recently added RTW88 USB support reported by Andreas Henriksson and also our customer. The hardware can't handle urbs that have a size of multiple of the bulkout_size (usually 512 bytes). The symptom is that the hardware stalls completely. The issue can be reproduced by sending a suitably sized ping packet from the device: ping -s 394 (It's 394 bytes here on a RTL8822CU and RTL8821CU, the actual size may differ on other chips, it was 402 bytes on a RTL8723DU) Other than that qsel was not set correctly. The sympton here is that only one of multiple bulk endpoints was used to send data. Changes since v1: - Use URB_ZERO_PACKET to let the USB host controller handle it automatically rather than working around the issue. Sascha Hauer (3): wifi: rtw88: usb: Set qsel correctly wifi: rtw88: usb: send Zero length packets if necessary wifi: rtw88: usb: drop now unnecessary URB size check drivers/net/wireless/realtek/rtw88/usb.c | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) Reported-by: Andreas Henriksson Tested-by: Andreas Henriksson From: Sascha Hauer To: linux-wireless@vger.kernel.org Cc: Neo Jou , Hans Ulli Kroll , Ping-Ke Shih , Yan-Hsuan Chuang , Kalle Valo , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Martin Blumenstingl , kernel@pengutronix.de, Alexander Hochbaum , Da Xue , Po-Hao Huang , Andreas Henriksson , Viktor Petrenko , Sascha Hauer Subject: [PATCH v2 1/3] wifi: rtw88: usb: Set qsel correctly Date: Fri, 10 Feb 2023 12:16:30 +0100 Message-Id: <20230210111632.1985205-2-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230210111632.1985205-1-s.hauer@pengutronix.de> References: <20230210111632.1985205-1-s.hauer@pengutronix.de> MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: sha@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-wireless@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org We have to extract qsel from the skb before doing skb_push() on it, otherwise qsel will always be 0. Fixes: a82dfd33d1237 ("wifi: rtw88: Add common USB chip support") Signed-off-by: Sascha Hauer --- drivers/net/wireless/realtek/rtw88/usb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c index 4ef38279b64c9..d9e995544e405 100644 --- a/drivers/net/wireless/realtek/rtw88/usb.c +++ b/drivers/net/wireless/realtek/rtw88/usb.c @@ -471,9 +471,9 @@ static int rtw_usb_tx_write(struct rtw_dev *rtwdev, u8 *pkt_desc; int ep; + pkt_info->qsel = rtw_usb_tx_queue_mapping_to_qsel(skb); pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz); memset(pkt_desc, 0, chip->tx_pkt_desc_sz); - pkt_info->qsel = rtw_usb_tx_queue_mapping_to_qsel(skb); ep = qsel_to_ep(rtwusb, pkt_info->qsel); rtw_tx_fill_tx_desc(pkt_info, skb); rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data); From: Sascha Hauer To: linux-wireless@vger.kernel.org Cc: Neo Jou , Hans Ulli Kroll , Ping-Ke Shih , Yan-Hsuan Chuang , Kalle Valo , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Martin Blumenstingl , kernel@pengutronix.de, Alexander Hochbaum , Da Xue , Po-Hao Huang , Andreas Henriksson , Viktor Petrenko , Sascha Hauer Subject: [PATCH v2 2/3] wifi: rtw88: usb: send Zero length packets if necessary Date: Fri, 10 Feb 2023 12:16:31 +0100 Message-Id: <20230210111632.1985205-3-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230210111632.1985205-1-s.hauer@pengutronix.de> References: <20230210111632.1985205-1-s.hauer@pengutronix.de> MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: sha@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-wireless@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Zero length packets are necessary when sending URBs with size multiple of bulkout_size, otherwise the hardware just stalls. Fixes: a82dfd33d1237 ("wifi: rtw88: Add common USB chip support") Signed-off-by: Sascha Hauer --- drivers/net/wireless/realtek/rtw88/usb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c index d9e995544e405..1a09c9288198a 100644 --- a/drivers/net/wireless/realtek/rtw88/usb.c +++ b/drivers/net/wireless/realtek/rtw88/usb.c @@ -271,6 +271,7 @@ static int rtw_usb_write_port(struct rtw_dev *rtwdev, u8 qsel, struct sk_buff *s return -ENOMEM; usb_fill_bulk_urb(urb, usbd, pipe, skb->data, skb->len, cb, context); + urb->transfer_flags |= URB_ZERO_PACKET; ret = usb_submit_urb(urb, GFP_ATOMIC); usb_free_urb(urb); From: Sascha Hauer To: linux-wireless@vger.kernel.org Cc: Neo Jou , Hans Ulli Kroll , Ping-Ke Shih , Yan-Hsuan Chuang , Kalle Valo , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Martin Blumenstingl , kernel@pengutronix.de, Alexander Hochbaum , Da Xue , Po-Hao Huang , Andreas Henriksson , Viktor Petrenko , Sascha Hauer Subject: [PATCH v2 3/3] wifi: rtw88: usb: drop now unnecessary URB size check Date: Fri, 10 Feb 2023 12:16:32 +0100 Message-Id: <20230210111632.1985205-4-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230210111632.1985205-1-s.hauer@pengutronix.de> References: <20230210111632.1985205-1-s.hauer@pengutronix.de> MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: sha@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-wireless@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Now that we send URBs with the URB_ZERO_PACKET flag set we no longer need to make sure that the URB sizes are not multiple of the bulkout_size. Drop the check. Signed-off-by: Sascha Hauer --- drivers/net/wireless/realtek/rtw88/usb.c | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c index 1a09c9288198a..2a8336b1847a5 100644 --- a/drivers/net/wireless/realtek/rtw88/usb.c +++ b/drivers/net/wireless/realtek/rtw88/usb.c @@ -414,24 +414,11 @@ static int rtw_usb_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, u32 size) { const struct rtw_chip_info *chip = rtwdev->chip; - struct rtw_usb *rtwusb; struct rtw_tx_pkt_info pkt_info = {0}; - u32 len, desclen; - - rtwusb = rtw_get_usb_priv(rtwdev); pkt_info.tx_pkt_size = size; pkt_info.qsel = TX_DESC_QSEL_BEACON; - - desclen = chip->tx_pkt_desc_sz; - len = desclen + size; - if (len % rtwusb->bulkout_size == 0) { - len += RTW_USB_PACKET_OFFSET_SZ; - pkt_info.offset = desclen + RTW_USB_PACKET_OFFSET_SZ; - pkt_info.pkt_offset = 1; - } else { - pkt_info.offset = desclen; - } + pkt_info.offset = chip->tx_pkt_desc_sz; return rtw_usb_write_data(rtwdev, &pkt_info, buf); } ================================================ FILE: packages/linux/patches/default/linux-122-rtw88-USB-fixes2.patch ================================================ From: Sascha Hauer To: linux-wireless Cc: Hans Ulli Kroll , Larry Finger , Pkshih , Tim K , "Alex G ." , Nick Morrow , Viktor Petrenko , Andreas Henriksson , ValdikSS , kernel@pengutronix.de, stable@vger.kernel.org, Sascha Hauer Subject: [PATCH 0/2] RTW88 USB bug fixes Date: Fri, 31 Mar 2023 14:10:52 +0200 Message-Id: <20230331121054.112758-1-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: sha@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-wireless@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org This series fixes two bugs in the RTW88 USB driver I was reported from several people and that I also encountered myself. The first one resulted in "timed out to flush queue 3" messages from the driver and sometimes a complete stall of the TX queues. The second one is specific to the RTW8821CU chipset. Here 2GHz networks were hardly seen and impossible to connect to. This goes down to misinterpreting the rfe_option field in the efuse. Sascha Hauer (2): wifi: rtw88: usb: fix priority queue to endpoint mapping wifi: rtw88: rtw8821c: Fix rfe_option field width drivers/net/wireless/realtek/rtw88/rtw8821c.c | 3 +- drivers/net/wireless/realtek/rtw88/usb.c | 70 +++++++++++++------ 2 files changed, 48 insertions(+), 25 deletions(-) -- 2.39.2 From: Sascha Hauer To: linux-wireless Cc: Hans Ulli Kroll , Larry Finger , Pkshih , Tim K , "Alex G ." , Nick Morrow , Viktor Petrenko , Andreas Henriksson , ValdikSS , kernel@pengutronix.de, stable@vger.kernel.org, Sascha Hauer Subject: [PATCH 1/2] wifi: rtw88: usb: fix priority queue to endpoint mapping Date: Fri, 31 Mar 2023 14:10:53 +0200 Message-Id: <20230331121054.112758-2-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230331121054.112758-1-s.hauer@pengutronix.de> References: <20230331121054.112758-1-s.hauer@pengutronix.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: sha@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-wireless@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org The RTW88 chipsets have four different priority queues in hardware. For the USB type chipsets the packets destined for a specific priority queue must be sent through the endpoint corresponding to the queue. This was not fully understood when porting from the RTW88 USB out of tree driver and thus violated. This patch implements the qsel to endpoint mapping as in get_usb_bulkout_id_88xx() in the downstream driver. Without this the driver often issues "timed out to flush queue 3" warnings and often TX stalls completely. Signed-off-by: Sascha Hauer --- drivers/net/wireless/realtek/rtw88/usb.c | 70 ++++++++++++++++-------- 1 file changed, 47 insertions(+), 23 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c index 2a8336b1847a5..a10d6fef4ffaf 100644 --- a/drivers/net/wireless/realtek/rtw88/usb.c +++ b/drivers/net/wireless/realtek/rtw88/usb.c @@ -118,6 +118,22 @@ static void rtw_usb_write32(struct rtw_dev *rtwdev, u32 addr, u32 val) rtw_usb_write(rtwdev, addr, val, 4); } +static int dma_mapping_to_ep(enum rtw_dma_mapping dma_mapping) +{ + switch (dma_mapping) { + case RTW_DMA_MAPPING_HIGH: + return 0; + case RTW_DMA_MAPPING_NORMAL: + return 1; + case RTW_DMA_MAPPING_LOW: + return 2; + case RTW_DMA_MAPPING_EXTRA: + return 3; + default: + return -EINVAL; + } +} + static int rtw_usb_parse(struct rtw_dev *rtwdev, struct usb_interface *interface) { @@ -129,6 +145,8 @@ static int rtw_usb_parse(struct rtw_dev *rtwdev, int num_out_pipes = 0; int i; u8 num; + const struct rtw_chip_info *chip = rtwdev->chip; + const struct rtw_rqpn *rqpn; for (i = 0; i < interface_desc->bNumEndpoints; i++) { endpoint = &host_interface->endpoint[i].desc; @@ -183,31 +201,34 @@ static int rtw_usb_parse(struct rtw_dev *rtwdev, rtwdev->hci.bulkout_num = num_out_pipes; - switch (num_out_pipes) { - case 4: - case 3: - rtwusb->qsel_to_ep[TX_DESC_QSEL_TID0] = 2; - rtwusb->qsel_to_ep[TX_DESC_QSEL_TID1] = 2; - rtwusb->qsel_to_ep[TX_DESC_QSEL_TID2] = 2; - rtwusb->qsel_to_ep[TX_DESC_QSEL_TID3] = 2; - rtwusb->qsel_to_ep[TX_DESC_QSEL_TID4] = 1; - rtwusb->qsel_to_ep[TX_DESC_QSEL_TID5] = 1; - rtwusb->qsel_to_ep[TX_DESC_QSEL_TID6] = 0; - rtwusb->qsel_to_ep[TX_DESC_QSEL_TID7] = 0; - break; - case 2: - rtwusb->qsel_to_ep[TX_DESC_QSEL_TID0] = 1; - rtwusb->qsel_to_ep[TX_DESC_QSEL_TID1] = 1; - rtwusb->qsel_to_ep[TX_DESC_QSEL_TID2] = 1; - rtwusb->qsel_to_ep[TX_DESC_QSEL_TID3] = 1; - break; - case 1: - break; - default: - rtw_err(rtwdev, "failed to get out_pipes(%d)\n", num_out_pipes); + if (num_out_pipes < 1 || num_out_pipes > 4) { + rtw_err(rtwdev, "invalid number of endpoints %d\n", num_out_pipes); return -EINVAL; } + rqpn = &chip->rqpn_table[num_out_pipes]; + + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID0] = dma_mapping_to_ep(rqpn->dma_map_be); + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID1] = dma_mapping_to_ep(rqpn->dma_map_bk); + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID2] = dma_mapping_to_ep(rqpn->dma_map_bk); + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID3] = dma_mapping_to_ep(rqpn->dma_map_be); + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID4] = dma_mapping_to_ep(rqpn->dma_map_vi); + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID5] = dma_mapping_to_ep(rqpn->dma_map_vi); + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID6] = dma_mapping_to_ep(rqpn->dma_map_vo); + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID7] = dma_mapping_to_ep(rqpn->dma_map_vo); + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID8] = -EINVAL; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID9] = -EINVAL; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID10] = -EINVAL; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID11] = -EINVAL; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID12] = -EINVAL; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID13] = -EINVAL; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID14] = -EINVAL; + rtwusb->qsel_to_ep[TX_DESC_QSEL_TID15] = -EINVAL; + rtwusb->qsel_to_ep[TX_DESC_QSEL_BEACON] = dma_mapping_to_ep(rqpn->dma_map_hi); + rtwusb->qsel_to_ep[TX_DESC_QSEL_HIGH] = dma_mapping_to_ep(rqpn->dma_map_hi); + rtwusb->qsel_to_ep[TX_DESC_QSEL_MGMT] = dma_mapping_to_ep(rqpn->dma_map_mg); + rtwusb->qsel_to_ep[TX_DESC_QSEL_H2C] = dma_mapping_to_ep(rqpn->dma_map_hi); + return 0; } @@ -250,7 +271,7 @@ static void rtw_usb_write_port_tx_complete(struct urb *urb) static int qsel_to_ep(struct rtw_usb *rtwusb, unsigned int qsel) { if (qsel >= ARRAY_SIZE(rtwusb->qsel_to_ep)) - return 0; + return -EINVAL; return rtwusb->qsel_to_ep[qsel]; } @@ -265,6 +286,9 @@ static int rtw_usb_write_port(struct rtw_dev *rtwdev, u8 qsel, struct sk_buff *s int ret; int ep = qsel_to_ep(rtwusb, qsel); + if (ep < 0) + return ep; + pipe = usb_sndbulkpipe(usbd, rtwusb->out_ep[ep]); urb = usb_alloc_urb(0, GFP_ATOMIC); if (!urb) -- 2.39.2 ================================================ FILE: packages/linux/patches/default/linux-122-rtw88-fix-rcu-lock.patch ================================================ From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: tony0620emma@gmail.com, kvalo@kernel.org, pkshih@realtek.com, s.hauer@pengutronix.de, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Martin Blumenstingl Subject: [PATCH v3 0/3] wifi: rtw88: Three locking fixes for existing code Date: Sun, 8 Jan 2023 22:13:21 +0100 Message-Id: <20230108211324.442823-1-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org This series consists of three patches which are fixing existing behavior (meaning: it either affects PCIe or USB or both) in the rtw88 driver. We previously had discussed patches for these locking issues while working on SDIO support, but the problem never ocurred while testing USB cards. It turns out that these are still needed and I think that they also fix the same problems for USB users (it's not clear how often it happens there though) - and possibly even PCIe card users. The issue fixed by the second and third patches have been spotted by a user who tested rtw88 SDIO support. Everything is working fine for him but there are warnings [1] and [2] in the kernel log stating "Voluntary context switch within RCU read-side critical section!". The solution in the third and fourth patch was actually suggested by Ping-Ke in [3]. Thanks again! These fixes are indepdent of my other series adding SDIO support to the rtw88 driver, meaning they can be added to the wireless driver tree on top of Linux 6.2-rc1 or linux-next. Changes since v1 at [4]: - Keep the u8 bitfields in patch 1 but split the res2 field into res2_1 and res2_2 as suggested by Ping-Ke - Added Ping-Ke's reviewed-by to patches 2-4 - thank you! - Added a paragraph in the cover-letter to avoid confusion whether these patches depend on the rtw88 SDIO support series Changes since v2 at [5]: - Added Ping-Ke's Reviewed-by and Sascha's Tested-by (thanks to both of you!) - Dropped patch 1/4 "rtw88: Add packed attribute to the eFuse structs" This requires more discussion. I'll send a separate patch for this. - Updated cover letter title so it's clear that this is independent of SDIO support code [0] https://lore.kernel.org/linux-wireless/695c976e02ed44a2b2345a3ceb226fc4@realtek.com/ [1] https://github.com/LibreELEC/LibreELEC.tv/pull/7301#issuecomment-1366421445 [2] https://github.com/LibreELEC/LibreELEC.tv/pull/7301#issuecomment-1366610249 [3] https://lore.kernel.org/lkml/e0aa1ba4336ab130712e1fcb425e6fd0adca4145.camel@realtek.com/ [4] https://lore.kernel.org/linux-wireless/20221228133547.633797-1-martin.blumenstingl@googlemail.com/ [5] https://lore.kernel.org/linux-wireless/20221229124845.1155429-1-martin.blumenstingl@googlemail.com/ Martin Blumenstingl (3): wifi: rtw88: Move register access from rtw_bf_assoc() outside the RCU wifi: rtw88: Use rtw_iterate_vifs() for rtw_vif_watch_dog_iter() wifi: rtw88: Use non-atomic sta iterator in rtw_ra_mask_info_update() drivers/net/wireless/realtek/rtw88/bf.c | 13 +++++++------ drivers/net/wireless/realtek/rtw88/mac80211.c | 4 +++- drivers/net/wireless/realtek/rtw88/main.c | 6 ++++-- 3 files changed, 14 insertions(+), 9 deletions(-) -- 2.39.0 From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: tony0620emma@gmail.com, kvalo@kernel.org, pkshih@realtek.com, s.hauer@pengutronix.de, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Martin Blumenstingl Subject: [PATCH v3 1/3] wifi: rtw88: Move register access from rtw_bf_assoc() outside the RCU Date: Sun, 8 Jan 2023 22:13:22 +0100 Message-Id: <20230108211324.442823-2-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230108211324.442823-1-martin.blumenstingl@googlemail.com> References: <20230108211324.442823-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org USB and (upcoming) SDIO support may sleep in the read/write handlers. Shrink the RCU critical section so it only cover the call to ieee80211_find_sta() and finding the ic_vht_cap/vht_cap based on the found station. This moves the chip's BFEE configuration outside the rcu_read_lock section and thus prevent "scheduling while atomic" or "Voluntary context switch within RCU read-side critical section!" warnings when accessing the registers using an SDIO card (which is where this issue has been spotted in the real world - but it also affects USB cards). Reviewed-by: Ping-Ke Shih Tested-by: Sascha Hauer Signed-off-by: Martin Blumenstingl --- v1 -> v2: - Added Ping-Ke's Reviewed-by (thank you!) v2 -> v3: - Added Sascha's Tested-by (thank you!) - added "wifi" prefix to the subject and reworded the title accordingly drivers/net/wireless/realtek/rtw88/bf.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/bf.c b/drivers/net/wireless/realtek/rtw88/bf.c index 038a30b170ef..c827c4a2814b 100644 --- a/drivers/net/wireless/realtek/rtw88/bf.c +++ b/drivers/net/wireless/realtek/rtw88/bf.c @@ -49,19 +49,23 @@ void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, sta = ieee80211_find_sta(vif, bssid); if (!sta) { + rcu_read_unlock(); + rtw_warn(rtwdev, "failed to find station entry for bss %pM\n", bssid); - goto out_unlock; + return; } ic_vht_cap = &hw->wiphy->bands[NL80211_BAND_5GHZ]->vht_cap; vht_cap = &sta->deflink.vht_cap; + rcu_read_unlock(); + if ((ic_vht_cap->cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) && (vht_cap->cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) { if (bfinfo->bfer_mu_cnt >= chip->bfer_mu_max_num) { rtw_dbg(rtwdev, RTW_DBG_BF, "mu bfer number over limit\n"); - goto out_unlock; + return; } ether_addr_copy(bfee->mac_addr, bssid); @@ -75,7 +79,7 @@ void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, (vht_cap->cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) { if (bfinfo->bfer_su_cnt >= chip->bfer_su_max_num) { rtw_dbg(rtwdev, RTW_DBG_BF, "su bfer number over limit\n"); - goto out_unlock; + return; } sound_dim = vht_cap->cap & @@ -98,9 +102,6 @@ void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, rtw_chip_config_bfee(rtwdev, rtwvif, bfee, true); } - -out_unlock: - rcu_read_unlock(); } void rtw_bf_init_bfer_entry_mu(struct rtw_dev *rtwdev, -- 2.39.0 From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: tony0620emma@gmail.com, kvalo@kernel.org, pkshih@realtek.com, s.hauer@pengutronix.de, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Martin Blumenstingl Subject: [PATCH v3 2/3] wifi: rtw88: Use rtw_iterate_vifs() for rtw_vif_watch_dog_iter() Date: Sun, 8 Jan 2023 22:13:23 +0100 Message-Id: <20230108211324.442823-3-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230108211324.442823-1-martin.blumenstingl@googlemail.com> References: <20230108211324.442823-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org USB and (upcoming) SDIO support may sleep in the read/write handlers. Make rtw_watch_dog_work() use rtw_iterate_vifs() to prevent "scheduling while atomic" or "Voluntary context switch within RCU read-side critical section!" warnings when accessing the registers using an SDIO card (which is where this issue has been spotted in the real world but it also affects USB cards). Fixes: 78d5bf925f30 ("wifi: rtw88: iterate over vif/sta list non-atomically") Suggested-by: Ping-Ke Shih Reviewed-by: Ping-Ke Shih Tested-by: Sascha Hauer Signed-off-by: Martin Blumenstingl --- v1 -> v2: - no change v2 -> v3: - Added Ping-Ke's Reviewed-by (thank you!) - Added Sascha's Tested-by (thank you!) - added "wifi" prefix to the subject and reworded the title accordingly drivers/net/wireless/realtek/rtw88/main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c index 888427cf3bdf..b2e78737bd5d 100644 --- a/drivers/net/wireless/realtek/rtw88/main.c +++ b/drivers/net/wireless/realtek/rtw88/main.c @@ -241,8 +241,10 @@ static void rtw_watch_dog_work(struct work_struct *work) rtw_phy_dynamic_mechanism(rtwdev); data.rtwdev = rtwdev; - /* use atomic version to avoid taking local->iflist_mtx mutex */ - rtw_iterate_vifs_atomic(rtwdev, rtw_vif_watch_dog_iter, &data); + /* rtw_iterate_vifs internally uses an atomic iterator which is needed + * to avoid taking local->iflist_mtx mutex + */ + rtw_iterate_vifs(rtwdev, rtw_vif_watch_dog_iter, &data); /* fw supports only one station associated to enter lps, if there are * more than two stations associated to the AP, then we can not enter -- 2.39.0 From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: tony0620emma@gmail.com, kvalo@kernel.org, pkshih@realtek.com, s.hauer@pengutronix.de, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Martin Blumenstingl Subject: [PATCH v3 3/3] wifi: rtw88: Use non-atomic sta iterator in rtw_ra_mask_info_update() Date: Sun, 8 Jan 2023 22:13:24 +0100 Message-Id: <20230108211324.442823-4-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230108211324.442823-1-martin.blumenstingl@googlemail.com> References: <20230108211324.442823-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org USB and (upcoming) SDIO support may sleep in the read/write handlers. Use non-atomic rtw_iterate_stas() in rtw_ra_mask_info_update() because the iterator function rtw_ra_mask_info_update_iter() needs to read and write registers from within rtw_update_sta_info(). Using the non-atomic iterator ensures that we can sleep during USB and SDIO register reads and writes. This fixes "scheduling while atomic" or "Voluntary context switch within RCU read-side critical section!" warnings as seen by SDIO card users (but it also affects USB cards). Fixes: 78d5bf925f30 ("wifi: rtw88: iterate over vif/sta list non-atomically") Suggested-by: Ping-Ke Shih Reviewed-by: Ping-Ke Shih Tested-by: Sascha Hauer Signed-off-by: Martin Blumenstingl --- v1 -> v2: - Added Ping-Ke's Reviewed-by (thank you!) v2 -> v3: - Added Sascha's Tested-by (thank you!) - added "wifi" prefix to the subject and reworded the title accordingly drivers/net/wireless/realtek/rtw88/mac80211.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c index 776a9a9884b5..3b92ac611d3f 100644 --- a/drivers/net/wireless/realtek/rtw88/mac80211.c +++ b/drivers/net/wireless/realtek/rtw88/mac80211.c @@ -737,7 +737,7 @@ static void rtw_ra_mask_info_update(struct rtw_dev *rtwdev, br_data.rtwdev = rtwdev; br_data.vif = vif; br_data.mask = mask; - rtw_iterate_stas_atomic(rtwdev, rtw_ra_mask_info_update_iter, &br_data); + rtw_iterate_stas(rtwdev, rtw_ra_mask_info_update_iter, &br_data); } static int rtw_ops_set_bitrate_mask(struct ieee80211_hw *hw, @@ -746,7 +746,9 @@ static int rtw_ops_set_bitrate_mask(struct ieee80211_hw *hw, { struct rtw_dev *rtwdev = hw->priv; + mutex_lock(&rtwdev->mutex); rtw_ra_mask_info_update(rtwdev, vif, mask); + mutex_unlock(&rtwdev->mutex); return 0; } -- 2.39.0 ================================================ FILE: packages/linux/patches/default/linux-122-rtw88-rfc-v1.patch ================================================ From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 00655C4708D for ; Tue, 27 Dec 2022 23:30:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231630AbiL0Xaj (ORCPT ); Tue, 27 Dec 2022 18:30:39 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56954 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229583AbiL0Xai (ORCPT ); Tue, 27 Dec 2022 18:30:38 -0500 Received: from mail-ed1-x533.google.com (mail-ed1-x533.google.com [IPv6:2a00:1450:4864:20::533]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C5A52B1D; Tue, 27 Dec 2022 15:30:36 -0800 (PST) Received: by mail-ed1-x533.google.com with SMTP id m21so20870944edc.3; Tue, 27 Dec 2022 15:30:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=gNI4glAP8RCHIX0Vc1rrjcz+Kvrw2hTC3GBQO91dTzE=; b=PgAZ5aZt60CG6sLLPDEVEddXtgBvZGHfbo1q7Kaoz+jVwewez6JV0OjWtiLxgYp3go ZB/sbiE+D/1GRwsm29iOS73d+TJblGHu+/6dMjl7e/jSdgsbZ/tGayRqj4SlrwUkN/FZ 20AzPMvBQCXMRBBOu0pmzBPTV+LKLIwmHCYIzCZ9Byq6xzVZc808I0LoDRtTCmanS219 exX6w96YxESVe38a7SieSwm7goZ0V3nfc3KZvT99EgrQY61Oj4Pn8V5Xk4wj0DchHoqf QTAZxF1fH6HQJ3toICNcXwmpSgvjPw8fM9I8ujGwxoGCvJsV8013XlMduN9sXK9gJDN9 Z4tA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=gNI4glAP8RCHIX0Vc1rrjcz+Kvrw2hTC3GBQO91dTzE=; b=VOrEV6O+1RjGwO4f3/HGUDBv0qC4KE3TjMviH2gG1xZGiEZCmSnchLvIhWt5ZwTfND IHdpgpN26/moSnH+rCHmt4agaoJGwgToAtyT2oUPypkDvq4olhr+47B0+jGEVAY3Dbz6 8H4bsFwv2VZdHwHANy9JYD2AzD7DKdGN9w/oFPIl42yJr7Usy//7ODNmTyHh2ZMKfm74 529x9FoIdFhSwwd/ltQvbT+EvcNxg6UPFyDKUMkUtKCcjdpI0rMjxuj1+NSmzuD8BO9y ERvux4ECYoFKuc3wE62owLURxv0CaE5yliHrDIH/k/LjIcNNvvKtJtGofXZ0LDfkyKE7 KnXA== X-Gm-Message-State: AFqh2kpjcIzhUbpNiXXevs7B73TYFp9mtSj6UueOZdTehN46SwzQ9EqQ wtIoxxp6N3frBG/ufdcyxHAng6jnWVA= X-Google-Smtp-Source: AMrXdXtHXTSThumsWgqSjQD28Ytz9upkuh0X8wck3S2bYI+sMZUeOkNp1Rj+Gpe9CHiPCzeYET7Dhg== X-Received: by 2002:a50:ec19:0:b0:46c:fabe:837b with SMTP id g25-20020a50ec19000000b0046cfabe837bmr19326490edr.41.1672183834861; Tue, 27 Dec 2022 15:30:34 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:34 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 00/19] rtw88: Add SDIO support Date: Wed, 28 Dec 2022 00:30:01 +0100 Message-Id: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Recently the rtw88 driver has gained locking support for the "slow" bus types (USB, SDIO) as part of USB support. Thanks to everyone who helped make this happen! Based on the USB work (especially the locking part and various bugfixes) this series adds support for SDIO based cards. It's the result of a collaboration between Jernej and myself. Neither of us has access to the rtw88 datasheets. All of our work is based on studying the RTL8822BS and RTL8822CS vendor drivers and trial and error. Jernej and myself have tested this with RTL8822BS and RTL8822CS cards. Other users have confirmed that RTL8821CS support is working as well. RTL8723DS may also work (we tried our best to handle rtw_chip_wcpu_11n where needed) but has not been tested at this point. Jernej's results with a RTL8822BS: - Main functionality works - Had a case where no traffic got across the link until he issued a scan My results with a RTL8822CS: - 2.4GHz and 5GHz bands are both working - TX throughput on a 5GHz network is between 50 Mbit/s and 90 Mbit/s - RX throughput on a 5GHz network is at 19 Mbit/s - Sometimes there are frequent reconnects (once every 1-5 minutes) after the link has been up for a long time (multiple hours). Today I was unable to reproduce this though (I only had reconnect in 8 hours). Why is this an RFC? - It needs a through review especially by the rtw88 maintainers - It's not clear to me how the "mmc: sdio" patch will be merged (will Ulf take this or can we merge it thorugh the rtw88/linux wireless driver tree?) - Any comments / debugging hints on the reconnect / no traffic issues (see above) are welcome - My understanding is that there's a discussion about the rtw88 Kconfig symbols. We're adding four new ones within this series. It's not clear to me what the conclusion is on this topic though. - As with most patches: testing is very welcome. If things are working fine then a Tested-by is appreciated (with some details about the card, throughput, ...). If something doesn't work for you: please still report back so we can investigate that problem! Jernej Skrabec (2): rtw88: ps: Increase LEAVE_LPS_TRY_CNT for SDIO based chipsets rtw88: Add support for the SDIO based RTL8822BS chipset Martin Blumenstingl (17): rtw88: mac: Use existing interface mask macros in rtw_pwr_seq_parser() rtw88: pci: Change type of rtw_hw_queue_mapping() and ac_to_hwq to enum rtw88: pci: Change queue datatype from u8 to enum rtw_tx_queue_type rtw88: Move enum rtw_tx_queue_type mapping code to tx.{c,h} mmc: sdio: add Realtek SDIO vendor ID and various wifi device IDs rtw88: rtw8821c: Add support for parsing the RTL8821CS (SDIO) efuse rtw88: rtw8822b: Add support for parsing the RTL8822BS (SDIO) efuse rtw88: rtw8822c: Add support for parsing the RTL8822CS (SDIO) efuse rtw88: hci: Add an optional power_switch() callback to rtw_hci_ops rtw88: mac: Add support for the SDIO HCI in rtw_pwr_seq_parser() rtw88: mac: Add support for the SDIO HCI in the TX/page table setup rtw88: sdio: Add HCI implementation for SDIO based chipsets rtw88: mac: Add support for SDIO specifics in the power on sequence rtw88: main: Add the rpwm_addr and cpwm_addr for SDIO based chipsets rtw88: main: Reserve 8 bytes of extra TX headroom for SDIO based cards rtw88: Add support for the SDIO based RTL8822CS chipset rtw88: Add support for the SDIO based RTL8821CS chipset drivers/net/wireless/realtek/rtw88/Kconfig | 36 + drivers/net/wireless/realtek/rtw88/Makefile | 12 + drivers/net/wireless/realtek/rtw88/debug.h | 1 + drivers/net/wireless/realtek/rtw88/hci.h | 8 + drivers/net/wireless/realtek/rtw88/mac.c | 62 +- drivers/net/wireless/realtek/rtw88/mac.h | 1 - drivers/net/wireless/realtek/rtw88/main.c | 9 +- drivers/net/wireless/realtek/rtw88/pci.c | 50 +- drivers/net/wireless/realtek/rtw88/ps.h | 2 +- drivers/net/wireless/realtek/rtw88/reg.h | 10 + drivers/net/wireless/realtek/rtw88/rtw8821c.c | 9 + drivers/net/wireless/realtek/rtw88/rtw8821c.h | 6 + .../net/wireless/realtek/rtw88/rtw8821cs.c | 34 + drivers/net/wireless/realtek/rtw88/rtw8822b.c | 10 + drivers/net/wireless/realtek/rtw88/rtw8822b.h | 6 + .../net/wireless/realtek/rtw88/rtw8822bs.c | 34 + drivers/net/wireless/realtek/rtw88/rtw8822c.c | 9 + drivers/net/wireless/realtek/rtw88/rtw8822c.h | 6 + .../net/wireless/realtek/rtw88/rtw8822cs.c | 34 + drivers/net/wireless/realtek/rtw88/sdio.c | 1242 +++++++++++++++++ drivers/net/wireless/realtek/rtw88/sdio.h | 175 +++ drivers/net/wireless/realtek/rtw88/tx.c | 41 + drivers/net/wireless/realtek/rtw88/tx.h | 3 + include/linux/mmc/sdio_ids.h | 9 + 24 files changed, 1763 insertions(+), 46 deletions(-) create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8821cs.c create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822bs.c create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822cs.c create mode 100644 drivers/net/wireless/realtek/rtw88/sdio.c create mode 100644 drivers/net/wireless/realtek/rtw88/sdio.h -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 558E6C4708D for ; Tue, 27 Dec 2022 23:30:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229583AbiL0Xam (ORCPT ); Tue, 27 Dec 2022 18:30:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56968 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231736AbiL0Xaj (ORCPT ); Tue, 27 Dec 2022 18:30:39 -0500 Received: from mail-ed1-x533.google.com (mail-ed1-x533.google.com [IPv6:2a00:1450:4864:20::533]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CF060B1D; Tue, 27 Dec 2022 15:30:38 -0800 (PST) Received: by mail-ed1-x533.google.com with SMTP id m21so20871091edc.3; Tue, 27 Dec 2022 15:30:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=QgYIIlUvjlkzoxTeBuZUOBlSUY/sYjLMbmvA+ggqjk4=; b=f8Q1fmpjOhzEzXHLPY1LdK57FaUha8exOzkLcZooLGGFKyh2mqirDEHC+lPYFj8jyo SKnx/gUtLtgjouRtJ+hoK5JiIrDhns3umKoqi9vMl46y9NHIPWMWTcxTmC0IAq6Xxe9+ AEZOtIsYqUPhA4+t1KuArfIY5wpJyjAqzd90dXmJAzmSfsbwYhcOGtMBs9ro+hgxYT8n QTkSawKFC8jApbFf50mY5WTKBGwhnmk5wweKAEJhL67FxeS/igD3pz0SQnxpR7BW2Xql EWVXA6jCutyT2rRrXCnw/foPbG5r2Y4gGw4eEGpkcPLBumD5JU+M+lpzuRQTDqpXIRR9 ngIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=QgYIIlUvjlkzoxTeBuZUOBlSUY/sYjLMbmvA+ggqjk4=; b=z+81AYuSuJ7vmZn71AEZ0wD03rwVlSmGI/Ip+1g+QjtrWxmC5Wm6ARONowlxgttll3 vT/Msad7/FO6QChqRrT+ys8Ut4EObVjGmt7qc9pXZrvqbD6LREhGZDxcHiR1KDC3jv26 ZcPd5J3htqLqGHsAVpf9A58KSeei+4nhw8glWNxnRcU0e/Br8Xx2pti1malSVqDbHbXm OD+YUwoVLFxLraedRepp9o/GHL/Ik1od6cs2c+wlloetGC6ywXIH9PuncOUk+l147aVO wk4s356CVEQX3c3Qizp6aIc3XEi2vSNYFeYIlQ7IsEvoGJMHJUd5Yo5gKQWftlOjRN9h u3KA== X-Gm-Message-State: AFqh2krWqyUE1w/J7eUaY4dFUBAHCdD35rY/dm3eJ/23SGdhUpFDKGnP xIO3r5XcIav26avEuk43FdE1TN4Ed7k= X-Google-Smtp-Source: AMrXdXtYznvIwhA5xcrLA4jT1xTMSU2g3QGo4kymjSxBSJ4mdDphNO4Ov1B2Tad9ek0tC3WBKJRpCA== X-Received: by 2002:a05:6402:550e:b0:45c:835b:ac64 with SMTP id fi14-20020a056402550e00b0045c835bac64mr19668822edb.31.1672183838243; Tue, 27 Dec 2022 15:30:38 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:37 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 03/19] rtw88: pci: Change queue datatype from u8 to enum rtw_tx_queue_type Date: Wed, 28 Dec 2022 00:30:04 +0100 Message-Id: <20221227233020.284266-4-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org This makes it easier to understand which values are allowed for the "queue" variable. Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/pci.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c index 45ce7e624c03..5492107fc85b 100644 --- a/drivers/net/wireless/realtek/rtw88/pci.c +++ b/drivers/net/wireless/realtek/rtw88/pci.c @@ -30,7 +30,8 @@ static u32 rtw_pci_tx_queue_idx_addr[] = { [RTW_TX_QUEUE_H2C] = RTK_PCI_TXBD_IDX_H2CQ, }; -static u8 rtw_pci_get_tx_qsel(struct sk_buff *skb, u8 queue) +static u8 rtw_pci_get_tx_qsel(struct sk_buff *skb, + enum rtw_tx_queue_type queue) { switch (queue) { case RTW_TX_QUEUE_BCN: @@ -542,7 +543,7 @@ static int rtw_pci_setup(struct rtw_dev *rtwdev) static void rtw_pci_dma_release(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci) { struct rtw_pci_tx_ring *tx_ring; - u8 queue; + enum rtw_tx_queue_type queue; rtw_pci_reset_trx_ring(rtwdev); for (queue = 0; queue < RTK_MAX_TX_QUEUE_NUM; queue++) { @@ -608,8 +609,8 @@ static void rtw_pci_deep_ps_enter(struct rtw_dev *rtwdev) { struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv; struct rtw_pci_tx_ring *tx_ring; + enum rtw_tx_queue_type queue; bool tx_empty = true; - u8 queue; if (rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_TX_WAKE)) goto enter_deep_ps; @@ -803,7 +804,8 @@ static void rtw_pci_flush_queues(struct rtw_dev *rtwdev, u32 queues, bool drop) __rtw_pci_flush_queues(rtwdev, pci_queues, drop); } -static void rtw_pci_tx_kick_off_queue(struct rtw_dev *rtwdev, u8 queue) +static void rtw_pci_tx_kick_off_queue(struct rtw_dev *rtwdev, + enum rtw_tx_queue_type queue) { struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv; struct rtw_pci_tx_ring *ring; @@ -822,7 +824,7 @@ static void rtw_pci_tx_kick_off_queue(struct rtw_dev *rtwdev, u8 queue) static void rtw_pci_tx_kick_off(struct rtw_dev *rtwdev) { struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv; - u8 queue; + enum rtw_tx_queue_type queue; for (queue = 0; queue < RTK_MAX_TX_QUEUE_NUM; queue++) if (test_and_clear_bit(queue, rtwpci->tx_queued)) @@ -831,7 +833,8 @@ static void rtw_pci_tx_kick_off(struct rtw_dev *rtwdev) static int rtw_pci_tx_write_data(struct rtw_dev *rtwdev, struct rtw_tx_pkt_info *pkt_info, - struct sk_buff *skb, u8 queue) + struct sk_buff *skb, + enum rtw_tx_queue_type queue) { struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv; const struct rtw_chip_info *chip = rtwdev->chip; @@ -949,9 +952,9 @@ static int rtw_pci_tx_write(struct rtw_dev *rtwdev, struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb) { + enum rtw_tx_queue_type queue = rtw_hw_queue_mapping(skb); struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv; struct rtw_pci_tx_ring *ring; - u8 queue = rtw_hw_queue_mapping(skb); int ret; ret = rtw_pci_tx_write_data(rtwdev, pkt_info, skb, queue); -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E9CD6C4332F for ; Tue, 27 Dec 2022 23:30:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232147AbiL0Xao (ORCPT ); Tue, 27 Dec 2022 18:30:44 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56970 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231771AbiL0Xal (ORCPT ); Tue, 27 Dec 2022 18:30:41 -0500 Received: from mail-ed1-x529.google.com (mail-ed1-x529.google.com [IPv6:2a00:1450:4864:20::529]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D661FB30; Tue, 27 Dec 2022 15:30:37 -0800 (PST) Received: by mail-ed1-x529.google.com with SMTP id i9so20869954edj.4; Tue, 27 Dec 2022 15:30:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=h1onIReQ5ODXVSyv0b1/9HLSWm0hUVA7Xk38y7M8c2U=; b=Df8qMwCuW8cm4WyFWmo2vn9IeBhUpQbbxzTpBts52ctPvyR66nbu95qWp0nuVkXbWT 8DyaeshDFmzvg48x2tAxGuhtJVxRNkOUGXewKplLtkyIqlTYqhF5uGRCHpSIrhBvAQYc RRpwYhZWwGMfUK1yiyUq3/x6iPJaIk/OX3e9hdbsdhgTGwOTgoCBJPvEzJvg8VPhVcPt 5AV6gzEeN4izFixPg2s6xkJFAkFrW0iEhFF6A9wHuADDb66qsSHKrCPuf38UX+u5ukH0 7LA7Vp7KcN/07WaXqq9rJnVs9jcJ2nkq8i7OOSgREVy3JxxCP/I1QNbiI7Y8/0dHsUo8 v+vw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=h1onIReQ5ODXVSyv0b1/9HLSWm0hUVA7Xk38y7M8c2U=; b=kSHgaspvNBV12/4toCVG0DQ3mgBqfhlGQAEXuyTD5OlgCf+evf7MiIer7SBNJE7ijJ 4fEp7Uvb6pbzCSCrT8dkROtykvYF49capmceMXWGNx8sYezu26fUrrAeGBGmGmT4V042 6rHnWlSE8MqjdT4C6OnBxW4PKk3AqzaIpKOY+qHUpgUnBRKF4LQKDctB7cle7IALqtiu 4+xWSG2kMSfTmx35pNIgcCqFihAwq+htzyDcPU+UdxsTBP4IW/YT4/aOeVCzqADnRtTA tCb1u1V9eVNWw+9fSaDIudbt4vOkcvyIkZE79wd+Oam4KNiaNEue/eMzJ8NkKg3QwnHN b0yg== X-Gm-Message-State: AFqh2kp2eoYCRpyfxL0Ip3d0y0PQ33ppwyAwgR3bTpN2MwkKDECNhRtz ObHug8L2k6/Yvsg/cYn/vsClevkl+1U= X-Google-Smtp-Source: AMrXdXuC3Lrm0vqhcWSxgt9v2Dlw0EC+6jU6Yug/OR3FfYch83uV5zHH3+QRNBOfBNMFCGHdpUGU0g== X-Received: by 2002:a05:6402:5145:b0:462:7b85:33aa with SMTP id n5-20020a056402514500b004627b8533aamr19561385edd.2.1672183835963; Tue, 27 Dec 2022 15:30:35 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:35 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 01/19] rtw88: mac: Use existing interface mask macros in rtw_pwr_seq_parser() Date: Wed, 28 Dec 2022 00:30:02 +0100 Message-Id: <20221227233020.284266-2-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Replace the magic numbers for the intf_mask with their existing RTW_PWR_INTF_PCI_MSK and RTW_PWR_INTF_USB_MSK macros to make the code easier to understand. Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/mac.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c index 98777f294945..4e5c194aac29 100644 --- a/drivers/net/wireless/realtek/rtw88/mac.c +++ b/drivers/net/wireless/realtek/rtw88/mac.c @@ -217,10 +217,10 @@ static int rtw_pwr_seq_parser(struct rtw_dev *rtwdev, cut_mask = cut_version_to_mask(cut); switch (rtw_hci_type(rtwdev)) { case RTW_HCI_TYPE_PCIE: - intf_mask = BIT(2); + intf_mask = RTW_PWR_INTF_PCI_MSK; break; case RTW_HCI_TYPE_USB: - intf_mask = BIT(1); + intf_mask = RTW_PWR_INTF_USB_MSK; break; default: return -EINVAL; -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DFE7FC4332F for ; Tue, 27 Dec 2022 23:30:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232384AbiL0Xar (ORCPT ); Tue, 27 Dec 2022 18:30:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56974 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231809AbiL0Xal (ORCPT ); Tue, 27 Dec 2022 18:30:41 -0500 Received: from mail-ed1-x529.google.com (mail-ed1-x529.google.com [IPv6:2a00:1450:4864:20::529]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 174F4640A; Tue, 27 Dec 2022 15:30:39 -0800 (PST) Received: by mail-ed1-x529.google.com with SMTP id i15so20927597edf.2; Tue, 27 Dec 2022 15:30:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=On9zqZfBSd6xwFAzv2KqvU5VwSXHqqET7/qhE6YwsIw=; b=SNTmAxZHbI4rGrDL7WSqhXiMSYLuok7XiLn5jsUBjNZsBWfLGdEDvkwzYn9kEt+ExM yM01zDvSzvFF7btI3VKgLCuKWyCjzSN+oxtbnnNtANe7++q877ohJS16q7qtb+peoLGT 379THwFkmXqEVK9LNWbZlaOwXWM9iWHwyXFNrN1L+LS62ez69W/wfVm9DP60TQxDcDMH Q0KGjBV8EPo9dceholSgOX+RCkfC+K6D8rq7TOSrGFZrR73jNZaxK+dgq8e2H3dtwDCX CRnRHBY8N6ymfOg0ZMvNjLoSF96sgPeplR8IkhyS5/ADf7al6pndKCfylPoELyjwhWSI iE5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=On9zqZfBSd6xwFAzv2KqvU5VwSXHqqET7/qhE6YwsIw=; b=K3W+chiaRArHiKSV1lOoCmnCOznquzW+yTX7DxyPfSIN97SIOQ1y2ON66NPUVvF6U+ +p+v1q9alH56ll9haMyhzLHslPLL0lQqfkAsBvXhXu4VPphbgPML8kRGF/Uf4/ESmlNo UK9fIMdKWPNrOG/PXJbSVmdC1KlsF0rgYr8tsfwM8a3aFtlbk8l1qMRy76e6CY+QjhVR xZvnFFYcIkSjC/q1Ie5tPQSSAF6KE484lmlxIAVJgiODnDbjWt5zMYQfynctbLZHrGpK KW1NAuIYfYK1e5Z0N3m6QP31F/CG+Az5H7/fgGvrf1rtyyfvMzhpDpJb9TuapU7hAmcq ojuw== X-Gm-Message-State: AFqh2kqpzSyCyb18SioF6HlD7/0GVialvYtc/ue5762f5olQy8mkLmab 3izNhsS8hHtpUW4UlzKqJyauiA8S13Y= X-Google-Smtp-Source: AMrXdXuwosdtKiTC3mmRWDVuPEeTdqyk/vj73kPIT20gET9jjxQKc5Hyp65eea/c0ByvQPRSemJWOA== X-Received: by 2002:a05:6402:754:b0:485:9d0f:6193 with SMTP id p20-20020a056402075400b004859d0f6193mr5697630edy.38.1672183837463; Tue, 27 Dec 2022 15:30:37 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:36 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 02/19] rtw88: pci: Change type of rtw_hw_queue_mapping() and ac_to_hwq to enum Date: Wed, 28 Dec 2022 00:30:03 +0100 Message-Id: <20221227233020.284266-3-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org rtw_hw_queue_mapping() and ac_to_hwq[] hold values of type enum rtw_tx_queue_type. Change their types to reflect this to make it easier to understand this part of the code. While here, also change the array to be static const as it is not supposed to be modified at runtime. Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/pci.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c index 0975d27240e4..45ce7e624c03 100644 --- a/drivers/net/wireless/realtek/rtw88/pci.c +++ b/drivers/net/wireless/realtek/rtw88/pci.c @@ -669,7 +669,7 @@ static void rtw_pci_deep_ps(struct rtw_dev *rtwdev, bool enter) spin_unlock_bh(&rtwpci->irq_lock); } -static u8 ac_to_hwq[] = { +static const enum rtw_tx_queue_type ac_to_hwq[] = { [IEEE80211_AC_VO] = RTW_TX_QUEUE_VO, [IEEE80211_AC_VI] = RTW_TX_QUEUE_VI, [IEEE80211_AC_BE] = RTW_TX_QUEUE_BE, @@ -678,12 +678,12 @@ static u8 ac_to_hwq[] = { static_assert(ARRAY_SIZE(ac_to_hwq) == IEEE80211_NUM_ACS); -static u8 rtw_hw_queue_mapping(struct sk_buff *skb) +static enum rtw_tx_queue_type rtw_hw_queue_mapping(struct sk_buff *skb) { struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; __le16 fc = hdr->frame_control; u8 q_mapping = skb_get_queue_mapping(skb); - u8 queue; + enum rtw_tx_queue_type queue; if (unlikely(ieee80211_is_beacon(fc))) queue = RTW_TX_QUEUE_BCN; -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 87981C53210 for ; Tue, 27 Dec 2022 23:30:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232417AbiL0Xau (ORCPT ); Tue, 27 Dec 2022 18:30:50 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57100 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232048AbiL0Xan (ORCPT ); Tue, 27 Dec 2022 18:30:43 -0500 Received: from mail-ed1-x52d.google.com (mail-ed1-x52d.google.com [IPv6:2a00:1450:4864:20::52d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A29AAB30; Tue, 27 Dec 2022 15:30:41 -0800 (PST) Received: by mail-ed1-x52d.google.com with SMTP id s5so20852904edc.12; Tue, 27 Dec 2022 15:30:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=btb9JCFbAduIuQyMWX4fEkp8lECM3tHdIlZQhT1+ifQ=; b=VR4staqyRagqWvg9HiMYvJRnLd/Z8E0ODa8AFk92I16qqZlovxWvgmxnSedR7gqRCr UZBJf8fwSL+duyK9wHOttFt7I4UUSsNEzLUymFxIO6hB2xfqBCngHLOSbkgneOX+sxts cvrNT/npALLXAQaqIuzzYWSEb50lVc3dUzOmdBrryFl7AGlFKiEynTGwi5NONJCLrjAr ZvQ/L1k6S2kCRlbTiNc93nc9m1iL07gDKiOAiUqvBGscesyxetRdSb9Y6I/8DIGURmX9 sFK0NxrzbevRS0fB13HyfPiAZThRJARi6nKRRYh1dXw/SM9JCuXDwW+F0lKmUvofaPYK 0MTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=btb9JCFbAduIuQyMWX4fEkp8lECM3tHdIlZQhT1+ifQ=; b=R5WqDZZFQilNwpS7iFCqzXfKNEZrhynA9y1A25rI/DB2P0S3nu7bp9MRU58VEQr6mw V5vYjBfUbyDd3FqEkXsMmUjPV40pSjg+yavlFB50GJeywp/q9lWz7lvxyS/DlrnsZwoA BW/JqBF/HKI4jVU075m8J/n4Kue2nhCfbwOjO9sTwm0/zB5EVMyQFJeiwZHnRf932etB saPCzk0Crbmnn1mjSbyqOFGzpVT7QyWIO5yFdUNWuFZLeJtJfKc3NcottLMJyK5+MxNM PhhkHh1OQmhyJaw8Y/xQhCNir0pUCtmPyZGBlRAlTcfASIUpv6tXg8giifZg9tfbISxp fVdw== X-Gm-Message-State: AFqh2ko1p9o6Tp5JPhfFU3YH4sBORiQgWos7XOneOxkIfG2ZpDi8DgX/ VkrleIauF83hplmXb0uIHsoSYKbXmJU= X-Google-Smtp-Source: AMrXdXs2lyI3DW7x++xTstNUDhNGbja194swr2CllpVhgdnt/hjiY4o8QguagNs8T4n4kVsk0lOzFQ== X-Received: by 2002:aa7:da4c:0:b0:46f:9a53:fdce with SMTP id w12-20020aa7da4c000000b0046f9a53fdcemr19915029eds.41.1672183840006; Tue, 27 Dec 2022 15:30:40 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:39 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 05/19] mmc: sdio: add Realtek SDIO vendor ID and various wifi device IDs Date: Wed, 28 Dec 2022 00:30:06 +0100 Message-Id: <20221227233020.284266-6-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Add the SDIO vendor ID for Realtek and some device IDs extracted from their GPL vendor driver. This will be useful in the future when the rtw88 driver gains support for these chips. Signed-off-by: Martin Blumenstingl --- include/linux/mmc/sdio_ids.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h index 74f9d9a6d330..bba39d4565da 100644 --- a/include/linux/mmc/sdio_ids.h +++ b/include/linux/mmc/sdio_ids.h @@ -115,6 +115,15 @@ #define SDIO_VENDOR_ID_MICROCHIP_WILC 0x0296 #define SDIO_DEVICE_ID_MICROCHIP_WILC1000 0x5347 +#define SDIO_VENDOR_ID_REALTEK 0x024c +#define SDIO_DEVICE_ID_REALTEK_RTW8723BS 0xb723 +#define SDIO_DEVICE_ID_REALTEK_RTW8723DS 0xd723 +#define SDIO_DEVICE_ID_REALTEK_RTW8821BS 0xb821 +#define SDIO_DEVICE_ID_REALTEK_RTW8821CS 0xc821 +#define SDIO_DEVICE_ID_REALTEK_RTW8821DS 0xd821 +#define SDIO_DEVICE_ID_REALTEK_RTW8822BS 0xb822 +#define SDIO_DEVICE_ID_REALTEK_RTW8822CS 0xc822 + #define SDIO_VENDOR_ID_SIANO 0x039a #define SDIO_DEVICE_ID_SIANO_NOVA_B0 0x0201 #define SDIO_DEVICE_ID_SIANO_NICE 0x0202 -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2C430C4708D for ; Tue, 27 Dec 2022 23:31:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231809AbiL0Xa5 (ORCPT ); Tue, 27 Dec 2022 18:30:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57126 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232081AbiL0Xan (ORCPT ); Tue, 27 Dec 2022 18:30:43 -0500 Received: from mail-ed1-x52a.google.com (mail-ed1-x52a.google.com [IPv6:2a00:1450:4864:20::52a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D6C4DDEBA; Tue, 27 Dec 2022 15:30:40 -0800 (PST) Received: by mail-ed1-x52a.google.com with SMTP id u18so19465924eda.9; Tue, 27 Dec 2022 15:30:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dm4pitK4ZNMJZL5DH9iTHJHi+FnWxGRFQtHIaCaoNGo=; b=YWwi7CzLyKrwEdFyuUxmvizsWkIpPn2Rka2qKD03A3ewM59kw2KvC5v6EpON1xlSSq UOaqKeBlhGa/2dVFREhtyFZmlTdOSWMO1pbXfH8y5NntpGghgcjPjDvN8RC0ny8CJtUE oRcmdiMR1EXhw5f3m69RFo89af3ku7UJalnnCn2j9AaUyzDoDNRkmj7sz9Qm0sbaRxxa 9Q4FSp2zIY2u6nwYxeV8CJuLjEjRaExTmMOd4hhCcfo6iBgouRLa6Rk4o1zSjDh3VLkA PvqMl7qUCM5cvszlAUsHnWBFyyvBjergKkMhdQ1kidb6MaVWZNdfjMw6lNcFGCDqjsVz PLeQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dm4pitK4ZNMJZL5DH9iTHJHi+FnWxGRFQtHIaCaoNGo=; b=Sboh7uBIxISXXw6Qr5GGuWT/hc4Se5cb0ygTkz6fb0lRu22OLh+kwktWEv16Kap8cW 7SQrpuPEQozdieKBmNN5vAlwtRWdba0fN9mNf2zrdMncYgOywN+BJHuK/zeA3GB8QpwL YUuvfY12buRTXWwa2Y+AXn6s4qglulcwSKsKi015xjsfgJvmP+Uh2NGr301HC/4iyke6 ge7BBUKsFQTiS+inqAeECr+hOQJKW2M2OxdZgWxq5jY18IPVZ7JM+n+pkADooXdqorPT oDz4UIlAxvpQNsFtQ4VOMXLFgAgoV2z7YVDvpfusxDwSY+YkriJXjudSH2xjZc+Rk8ux THQg== X-Gm-Message-State: AFqh2krTLZPec1BeaePGH+yIM/xE7h7osKZ03oi5Uiwu7MZpW7C0abFJ +dQ5oQLo4ccuSrHwaLUavao8oJNV+4Y= X-Google-Smtp-Source: AMrXdXsS9hX335Fkht6+2053XGKLxjVMk10eknNraAxGKhiL8aCk1KR+3rgtmHKYD77nKNtWUI+8iA== X-Received: by 2002:a05:6402:501f:b0:46c:a763:5889 with SMTP id p31-20020a056402501f00b0046ca7635889mr29038360eda.25.1672183839073; Tue, 27 Dec 2022 15:30:39 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:38 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 04/19] rtw88: Move enum rtw_tx_queue_type mapping code to tx.{c,h} Date: Wed, 28 Dec 2022 00:30:05 +0100 Message-Id: <20221227233020.284266-5-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org This code is not specific to the PCIe bus type but can be re-used by USB and SDIO bus types. Move it to tx.{c,h} to avoid code-duplication in the future. While here, add checking of the ac argument in rtw_tx_ac_to_hwq() so we're not accessing entries beyond the end of the array. Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/pci.c | 35 ++------------------ drivers/net/wireless/realtek/rtw88/tx.c | 41 ++++++++++++++++++++++++ drivers/net/wireless/realtek/rtw88/tx.h | 3 ++ 3 files changed, 46 insertions(+), 33 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c index 5492107fc85b..b4bd831c9845 100644 --- a/drivers/net/wireless/realtek/rtw88/pci.c +++ b/drivers/net/wireless/realtek/rtw88/pci.c @@ -670,37 +670,6 @@ static void rtw_pci_deep_ps(struct rtw_dev *rtwdev, bool enter) spin_unlock_bh(&rtwpci->irq_lock); } -static const enum rtw_tx_queue_type ac_to_hwq[] = { - [IEEE80211_AC_VO] = RTW_TX_QUEUE_VO, - [IEEE80211_AC_VI] = RTW_TX_QUEUE_VI, - [IEEE80211_AC_BE] = RTW_TX_QUEUE_BE, - [IEEE80211_AC_BK] = RTW_TX_QUEUE_BK, -}; - -static_assert(ARRAY_SIZE(ac_to_hwq) == IEEE80211_NUM_ACS); - -static enum rtw_tx_queue_type rtw_hw_queue_mapping(struct sk_buff *skb) -{ - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - __le16 fc = hdr->frame_control; - u8 q_mapping = skb_get_queue_mapping(skb); - enum rtw_tx_queue_type queue; - - if (unlikely(ieee80211_is_beacon(fc))) - queue = RTW_TX_QUEUE_BCN; - else if (unlikely(ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc))) - queue = RTW_TX_QUEUE_MGMT; - else if (is_broadcast_ether_addr(hdr->addr1) || - is_multicast_ether_addr(hdr->addr1)) - queue = RTW_TX_QUEUE_HI0; - else if (WARN_ON_ONCE(q_mapping >= ARRAY_SIZE(ac_to_hwq))) - queue = ac_to_hwq[IEEE80211_AC_BE]; - else - queue = ac_to_hwq[q_mapping]; - - return queue; -} - static void rtw_pci_release_rsvd_page(struct rtw_pci *rtwpci, struct rtw_pci_tx_ring *ring) { @@ -798,7 +767,7 @@ static void rtw_pci_flush_queues(struct rtw_dev *rtwdev, u32 queues, bool drop) } else { for (i = 0; i < rtwdev->hw->queues; i++) if (queues & BIT(i)) - pci_queues |= BIT(ac_to_hwq[i]); + pci_queues |= BIT(rtw_tx_ac_to_hwq(i)); } __rtw_pci_flush_queues(rtwdev, pci_queues, drop); @@ -952,7 +921,7 @@ static int rtw_pci_tx_write(struct rtw_dev *rtwdev, struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb) { - enum rtw_tx_queue_type queue = rtw_hw_queue_mapping(skb); + enum rtw_tx_queue_type queue = rtw_tx_queue_mapping(skb); struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv; struct rtw_pci_tx_ring *ring; int ret; diff --git a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c index ab39245e9c2f..bb5c7492c98b 100644 --- a/drivers/net/wireless/realtek/rtw88/tx.c +++ b/drivers/net/wireless/realtek/rtw88/tx.c @@ -682,3 +682,44 @@ void rtw_txq_cleanup(struct rtw_dev *rtwdev, struct ieee80211_txq *txq) list_del_init(&rtwtxq->list); spin_unlock_bh(&rtwdev->txq_lock); } + +static const enum rtw_tx_queue_type ac_to_hwq[] = { + [IEEE80211_AC_VO] = RTW_TX_QUEUE_VO, + [IEEE80211_AC_VI] = RTW_TX_QUEUE_VI, + [IEEE80211_AC_BE] = RTW_TX_QUEUE_BE, + [IEEE80211_AC_BK] = RTW_TX_QUEUE_BK, +}; + +static_assert(ARRAY_SIZE(ac_to_hwq) == IEEE80211_NUM_ACS); + +enum rtw_tx_queue_type rtw_tx_ac_to_hwq(enum ieee80211_ac_numbers ac) +{ + if (WARN_ON(unlikely(ac >= IEEE80211_NUM_ACS))) + return RTW_TX_QUEUE_BE; + + return ac_to_hwq[ac]; +} +EXPORT_SYMBOL(rtw_tx_ac_to_hwq); + +enum rtw_tx_queue_type rtw_tx_queue_mapping(struct sk_buff *skb) +{ + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; + __le16 fc = hdr->frame_control; + u8 q_mapping = skb_get_queue_mapping(skb); + enum rtw_tx_queue_type queue; + + if (unlikely(ieee80211_is_beacon(fc))) + queue = RTW_TX_QUEUE_BCN; + else if (unlikely(ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc))) + queue = RTW_TX_QUEUE_MGMT; + else if (is_broadcast_ether_addr(hdr->addr1) || + is_multicast_ether_addr(hdr->addr1)) + queue = RTW_TX_QUEUE_HI0; + else if (WARN_ON_ONCE(q_mapping >= ARRAY_SIZE(ac_to_hwq))) + queue = ac_to_hwq[IEEE80211_AC_BE]; + else + queue = ac_to_hwq[q_mapping]; + + return queue; +} +EXPORT_SYMBOL(rtw_tx_queue_mapping); diff --git a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/realtek/rtw88/tx.h index a2f3ac326041..197d5868c8ad 100644 --- a/drivers/net/wireless/realtek/rtw88/tx.h +++ b/drivers/net/wireless/realtek/rtw88/tx.h @@ -131,6 +131,9 @@ rtw_tx_write_data_h2c_get(struct rtw_dev *rtwdev, struct rtw_tx_pkt_info *pkt_info, u8 *buf, u32 size); +enum rtw_tx_queue_type rtw_tx_ac_to_hwq(enum ieee80211_ac_numbers ac); +enum rtw_tx_queue_type rtw_tx_queue_mapping(struct sk_buff *skb); + static inline void fill_txdesc_checksum_common(u8 *txdesc, size_t words) { -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 79991C46467 for ; Tue, 27 Dec 2022 23:31:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230141AbiL0XbB (ORCPT ); Tue, 27 Dec 2022 18:31:01 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57152 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232120AbiL0Xao (ORCPT ); Tue, 27 Dec 2022 18:30:44 -0500 Received: from mail-ed1-x532.google.com (mail-ed1-x532.google.com [IPv6:2a00:1450:4864:20::532]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8F6A6272; Tue, 27 Dec 2022 15:30:42 -0800 (PST) Received: by mail-ed1-x532.google.com with SMTP id b88so13594876edf.6; Tue, 27 Dec 2022 15:30:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=sNWvI++owPQOhkWmIVtBzTJGEAJPDCSXNhp2rWrEL5E=; b=nnK0OOhJzlEX0vbgyycR/6mSAdx38bY4ctjiPkAFM/et3F9o33fqvbfQknun6/zKL6 7wIzhdFmv9PkW14a/bmTB8upYCN3TOFiq9U8IBv9UT2Dkcu90IUNT1acTQSrvPjwz6/4 fu8Yelrnas5yHDWvzILmx7uBXlV6ZgCNCExNGCWpWohlgkkRZZhlvLAGde0O6m5/FHUo TjRpVM7FS60jdQPyie5iMQSf3yWjlJER6icUBy4uXM1t2dRnKuSavtjcDNVh2wWcj69b AxtPjJBQErC0gI1C+mB0C9OtMKjGFcfpydzMi+hlIvkH8WE8iqzk/kB75aM4stCnh9aa YndA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=sNWvI++owPQOhkWmIVtBzTJGEAJPDCSXNhp2rWrEL5E=; b=F698HlMHi1vCF+ockccMqJgKoJuSWe1LXvbsNmJtxSI2p16Llm7nWAyvV3/37YC4jN BZXieXg+vSBm3vE6aPm0OousIWPtIXomYoa4MHaynK0N/q5kvaAipfnmQh6KGDPwzely i2W97Zy4wZqE5p/pcxZawK/4qawqdUhHZn40m+FwI2J/mtc8R/DrijbvmQ6p6dijURXE u2PVgPacuI4I6Ql1H88qp1ZGH7367o0/x+xobATMv88egUWFXxoi8eu+mqWwhb73B2El VZ+TlAmFxZkfSryMGABKHR5qIxJ/l8AqXvQg2KJzMyZP3pHdWb+Mmak7sOyE8Scgj+SQ J1PQ== X-Gm-Message-State: AFqh2koCrM7MvTBP6zQmnXZtJLUsEb/oKhMqLfJfxX/rdx96EpXw/3Tr srxGnaSH+DOZwcOTHxjzKCEjdT/Ka/8= X-Google-Smtp-Source: AMrXdXsBqs+Vq4I04+NA9mmrJqZnpfOmTy9EWmu/hHEHZqKU0cVeCXeXtTioSKGs0UEMCFEUUIQ7Jw== X-Received: by 2002:a05:6402:a55:b0:475:9918:37ce with SMTP id bt21-20020a0564020a5500b00475991837cemr19976275edb.13.1672183840839; Tue, 27 Dec 2022 15:30:40 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:40 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 06/19] rtw88: rtw8821c: Add support for parsing the RTL8821CS (SDIO) efuse Date: Wed, 28 Dec 2022 00:30:07 +0100 Message-Id: <20221227233020.284266-7-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org The efuse of the SDIO RTL8821CS chip has only one known member: the mac address is at offset 0x11a. Add a struct rtw8821cs_efuse describing this and use it for copying the mac address when the SDIO bus is used. Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/rtw8821c.c | 9 +++++++++ drivers/net/wireless/realtek/rtw88/rtw8821c.h | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c index 17f800f6efbd..dd01b22f9770 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c @@ -26,6 +26,12 @@ static void rtw8821ce_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->e.mac_addr); } +static void rtw8821cs_efuse_parsing(struct rtw_efuse *efuse, + struct rtw8821c_efuse *map) +{ + ether_addr_copy(efuse->addr, map->s.mac_addr); +} + static void rtw8821cu_efuse_parsing(struct rtw_efuse *efuse, struct rtw8821c_efuse *map) { @@ -74,6 +80,9 @@ static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_PCIE: rtw8821ce_efuse_parsing(efuse, map); break; + case RTW_HCI_TYPE_SDIO: + rtw8821cs_efuse_parsing(efuse, map); + break; case RTW_HCI_TYPE_USB: rtw8821cu_efuse_parsing(efuse, map); break; diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireless/realtek/rtw88/rtw8821c.h index 1c81260f3a54..1deea54575b5 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8821c.h +++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.h @@ -65,6 +65,11 @@ struct rtw8821ce_efuse { u8 res7; }; +struct rtw8821cs_efuse { + u8 res4[0x4a]; /* 0xd0 */ + u8 mac_addr[ETH_ALEN]; /* 0x11a */ +}; + struct rtw8821c_efuse { __le16 rtl_id; u8 res0[0x0e]; @@ -93,6 +98,7 @@ struct rtw8821c_efuse { u8 res[3]; union { struct rtw8821ce_efuse e; + struct rtw8821cs_efuse s; struct rtw8821cu_efuse u; }; }; -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 29474C4332F for ; Tue, 27 Dec 2022 23:31:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232207AbiL0XbH (ORCPT ); Tue, 27 Dec 2022 18:31:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57236 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232272AbiL0Xar (ORCPT ); Tue, 27 Dec 2022 18:30:47 -0500 Received: from mail-ed1-x52a.google.com (mail-ed1-x52a.google.com [IPv6:2a00:1450:4864:20::52a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 85D5F3BB; Tue, 27 Dec 2022 15:30:43 -0800 (PST) Received: by mail-ed1-x52a.google.com with SMTP id r26so15660428edc.5; Tue, 27 Dec 2022 15:30:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=A522Jt6HhfnBCacJa8yLyhSRn9fiN5RDQFLQBl+szdU=; b=MJQ/XSgTkapv3EpIbAO8XLCrxJPt/iWc1zTsffUVfG6sA/ybEptpnXcuLak7XB3PIQ Ihdw5tH4+sscSaNDvtOvKul2WNmJrPasn5e6wzXj5Zuu0dy0ygDshPp7s0ID0F0veT+Y OiiKr1tzJB+kStlcwVFqJbgK1herJfnG0Q8d+wOBrPRXmYNzuSROK9gVhwdD32+2QFbj TgTYPhjgnFih9U7IrxdQttkH4vEvGLtK6Qb4NhvqEKx8r4QI80Ds1yNXTzBFdAG0GBIK 7FaP28dkjw0mNSp/E00hk0fTjqtiZKPTPeJfHqMAXnOG7adcQIRwtAlQEEaGGGoxOAxW vjCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=A522Jt6HhfnBCacJa8yLyhSRn9fiN5RDQFLQBl+szdU=; b=AsukRgtTPdznlbyyBZfa5HNwQ2SeRsEv7T5Y++hYWHazuj6CIp6RZ03w4Nw+NxAF23 9knLQDK3bvCHNcHAyiXeZvGuRUf5gu0LVuXhxmu5Hqhw2lXTTNovh/Q955JAX/nQm+wl 9IZILAlXkn+JK3XHIHss1CoYdbKr1XJZAuD81mqjom00qqiZtami9oAFyNdJnL3UA+lt aQNF0LfIH241/5crnLyvTmzQn6opVcCL6JgzGSKVbcCHtSaHBbb6AJ2L5/yiaiLs/7yN JNdqQH7iVWHRCqMpDHzRyniUn7i+mvPqrbT/elCwMpCCsFoA7SrLgR3B5uulruIOX8g6 ZGng== X-Gm-Message-State: AFqh2kouJA03nhjVEHVPi9iZEzgq+/Be1BG7i2EzgWyUKzEAGLIHIBGy i+TDvNOjjmkvFdC0TmBW2jsIXxJwbv0= X-Google-Smtp-Source: AMrXdXvaPCVvWtHhAnIq7AgnnY4Rij/5C/GKq7b6fzjPX++szIm4uKWvqh3zdPh1eXYWl1fb8NEN7A== X-Received: by 2002:a05:6402:48c:b0:483:d49f:e26c with SMTP id k12-20020a056402048c00b00483d49fe26cmr9760873edv.15.1672183841899; Tue, 27 Dec 2022 15:30:41 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:41 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 07/19] rtw88: rtw8822b: Add support for parsing the RTL8822BS (SDIO) efuse Date: Wed, 28 Dec 2022 00:30:08 +0100 Message-Id: <20221227233020.284266-8-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org The efuse of the SDIO RTL8822BS chip has only one known member: the mac address is at offset 0x11a. Add a struct rtw8822bs_efuse describing this and use it for copying the mac address when the SDIO bus is used. Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/rtw8822b.c | 10 ++++++++++ drivers/net/wireless/realtek/rtw88/rtw8822b.h | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c index 74dfb89b2c94..4ed5b98fab23 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c @@ -26,10 +26,17 @@ static void rtw8822be_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->e.mac_addr); } +static void rtw8822bs_efuse_parsing(struct rtw_efuse *efuse, + struct rtw8822b_efuse *map) +{ + ether_addr_copy(efuse->addr, map->s.mac_addr); +} + static void rtw8822bu_efuse_parsing(struct rtw_efuse *efuse, struct rtw8822b_efuse *map) { ether_addr_copy(efuse->addr, map->u.mac_addr); + } static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) @@ -62,6 +69,9 @@ static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_PCIE: rtw8822be_efuse_parsing(efuse, map); break; + case RTW_HCI_TYPE_SDIO: + rtw8822bs_efuse_parsing(efuse, map); + break; case RTW_HCI_TYPE_USB: rtw8822bu_efuse_parsing(efuse, map); break; diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.h b/drivers/net/wireless/realtek/rtw88/rtw8822b.h index 01d3644e0c94..f84bfb6b0df9 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8822b.h +++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.h @@ -65,6 +65,11 @@ struct rtw8822be_efuse { u8 res7; }; +struct rtw8822bs_efuse { + u8 res4[0x4a]; /* 0xd0 */ + u8 mac_addr[ETH_ALEN]; /* 0x11a */ +}; + struct rtw8822b_efuse { __le16 rtl_id; u8 res0[0x0e]; @@ -94,6 +99,7 @@ struct rtw8822b_efuse { union { struct rtw8822bu_efuse u; struct rtw8822be_efuse e; + struct rtw8822bs_efuse s; }; }; -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 39E79C4332F for ; Tue, 27 Dec 2022 23:31:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232597AbiL0XbJ (ORCPT ); Tue, 27 Dec 2022 18:31:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57584 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232483AbiL0Xay (ORCPT ); Tue, 27 Dec 2022 18:30:54 -0500 Received: from mail-ed1-x532.google.com (mail-ed1-x532.google.com [IPv6:2a00:1450:4864:20::532]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5CEB4DED5; Tue, 27 Dec 2022 15:30:45 -0800 (PST) Received: by mail-ed1-x532.google.com with SMTP id b88so13595040edf.6; Tue, 27 Dec 2022 15:30:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=YaL9++5/wfs1MVtqhD+aK5GRmljQ+ncXaK8G/SyoCYA=; b=V+1tmN6IeYc7cQVzpdQQEGr6cdYbtX1xkGlLY73RuW0o6HanAQyNubEMT6TEX03XIp wpll0fCMqyXAqhtoAQz4LqYvWPjGb25rlSRYWkXbnw8ZGeHNyvEXY5Ax3QH6JR9LQ4Fo iMynJ4OYJk6RjcP0D22XyQoX4riDWY6Zdaps8pB5GBhjsGR0DV8/tMqELR+PEYhjQJJZ AheI7mgNg2ttV2iSsYrVBqvZqkBuAUdiyPF9YuadS179fcYJZc2Yfvhahh+t/0Zh7Imw 18cagXdQsTDyqDpOAUsflOxdPaNgkPm8egzCuaCdjC23V6gjFBmL20J7tWacuombl4M8 1ypg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YaL9++5/wfs1MVtqhD+aK5GRmljQ+ncXaK8G/SyoCYA=; b=GVmvUQBjX0mFdlziMBUJECKXXTmrXUYyemdiPkRDU7kKtsZHb5HyDhAVGxK4rDM3Pt LfQFvMvJmf+Vn0NF/f2yoh0eqsN5KMpd4S55IAR+pBtLlEK8gc6TZ2DvMROsH3kWmpQI n4EY+KKBTS8+er4RzCUlr+DaYD6yJga+yDf3o/2852Y6s3tNrDqsEmaXivUwlykgStQk Smwo3aNrVdwk51sanOpByxKZv7FucbIxWQkAw7a20ct6e4GJmtgL78tmJi15mzMzTosi eBxt0IcDP7ZBAPW3sGqrpK378JGOw7f5fLqaoVLnK8bG6ezi/S3ezDlw0dO1VOXExXMq KsSg== X-Gm-Message-State: AFqh2kpnbeW1LGtD/HReZIxKcvdTs6vagJxveHg5Rb9bvheF8j0vz3GT 7BWmqENfMfFn7SUD8FMnLOlMtheU/i4= X-Google-Smtp-Source: AMrXdXtsMVFApahSdC8eXR6eymLJm2FGMn6nsnE1CscohpsNBKfCufIUPgYGrzD/qHH0f/lTICtouQ== X-Received: by 2002:aa7:c1c9:0:b0:468:fd17:aeb9 with SMTP id d9-20020aa7c1c9000000b00468fd17aeb9mr20546629edp.0.1672183844758; Tue, 27 Dec 2022 15:30:44 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:44 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 10/19] rtw88: mac: Add support for the SDIO HCI in rtw_pwr_seq_parser() Date: Wed, 28 Dec 2022 00:30:11 +0100 Message-Id: <20221227233020.284266-11-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org rtw_pwr_seq_parser() needs to know about the HCI bus interface mask for the SDIO bus so it can parse the chip state change sequences. Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/mac.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c index bf1291902661..c04938691add 100644 --- a/drivers/net/wireless/realtek/rtw88/mac.c +++ b/drivers/net/wireless/realtek/rtw88/mac.c @@ -222,6 +222,9 @@ static int rtw_pwr_seq_parser(struct rtw_dev *rtwdev, case RTW_HCI_TYPE_USB: intf_mask = RTW_PWR_INTF_USB_MSK; break; + case RTW_HCI_TYPE_SDIO: + intf_mask = RTW_PWR_INTF_SDIO_MSK; + break; default: return -EINVAL; } -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6C7F1C10F1B for ; Tue, 27 Dec 2022 23:31:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232376AbiL0XbM (ORCPT ); Tue, 27 Dec 2022 18:31:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57580 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232481AbiL0Xay (ORCPT ); Tue, 27 Dec 2022 18:30:54 -0500 Received: from mail-ed1-x52e.google.com (mail-ed1-x52e.google.com [IPv6:2a00:1450:4864:20::52e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 63F0CC67; Tue, 27 Dec 2022 15:30:44 -0800 (PST) Received: by mail-ed1-x52e.google.com with SMTP id c34so14286300edf.0; Tue, 27 Dec 2022 15:30:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=jtp+Q5wSGg2dbN7IB0CSpN39c6sHF9pt2C0cg9z9mH4=; b=XTfv8m/9UeiXT+Lnke3zrSb/yxTzSWi4OktNW0xgv112VbA2RKvgE/Qbf9plT1WrZY rTW28YU+AYw0fOXf56t/QpDbMx8UAjZe7uDhv/U0U/N9wGKHI9+6cS3y3bQi0T/QBBeq ejNPgiZKGY/tr3AAj1rf4yksSnWlLSPl0KwnsZ0pZo7xkPahOqLznG9qJw2NnWP6HpD5 XQKR15QAlIDEjUc35iF6VreZpjJHe7KGwruDWjWWATc7k1aNtAagwuRnbniLlnxWuJJX usWaj/HI6Gutb8QXWjTI4dQwENH48dW68+zDg6PEfwVpsIFw73zl+c2IRnXfcgmWPA4M anbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=jtp+Q5wSGg2dbN7IB0CSpN39c6sHF9pt2C0cg9z9mH4=; b=zm2Wrns3cc8/WQu3M+ghR27qTEBlyto1fUuMkIzVmOgNJGgp/PTW2N9SmOe/ZS9xrJ Bi0cTlcRi79g5J6AAGPUrZ9nGjITm/mYloILg4VgLMYqQ8TiCK4oRy3fNYSoKCBMkUEO arNjfgrJQMQp3xU9rqzmbBRyHqI2BgVVeiWOLeRRh2xzsDbiqqQRIPDQCql+8sOjzltK fnnKJIzHGdNarOkmjq60cY5mEtxzjpymZaTzKRH1O3SGw3zHJA6l49sCFcpN1p5hhnR5 La1MkTRCUQajfrs9GT/6DAdGoirkmzQTc8leo9IDydU9gBIup771Llw6NQF4RRT2A/tq LFsw== X-Gm-Message-State: AFqh2kpOnKRs/tQ24e/GeaDiJ+nG5r9hHdiUUkL4FPtsGBNOMECCbZyv oIoJhYsOb5PF48PHxfD2sCwutvgurBw= X-Google-Smtp-Source: AMrXdXsEsGarnDTsLe6s+u0UA/QgLaIg4VNmdykpjVmDg1XqR/mGtl3dgpS6yzDCqBFDV4im8Cz0Cw== X-Received: by 2002:a50:ec8b:0:b0:486:6d75:9a0c with SMTP id e11-20020a50ec8b000000b004866d759a0cmr4498140edr.12.1672183842746; Tue, 27 Dec 2022 15:30:42 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:42 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 08/19] rtw88: rtw8822c: Add support for parsing the RTL8822CS (SDIO) efuse Date: Wed, 28 Dec 2022 00:30:09 +0100 Message-Id: <20221227233020.284266-9-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org The efuse of the SDIO RTL8822CS chip has only one known member: the mac address is at offset 0x16a. Add a struct rtw8822cs_efuse describing this and use it for copying the mac address when the SDIO bus is used. Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/rtw8822c.c | 9 +++++++++ drivers/net/wireless/realtek/rtw88/rtw8822c.h | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c index 964e27887fe2..8ec779c7ab84 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c @@ -29,6 +29,12 @@ static void rtw8822ce_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->e.mac_addr); } +static void rtw8822cs_efuse_parsing(struct rtw_efuse *efuse, + struct rtw8822c_efuse *map) +{ + ether_addr_copy(efuse->addr, map->s.mac_addr); +} + static void rtw8822cu_efuse_parsing(struct rtw_efuse *efuse, struct rtw8822c_efuse *map) { @@ -64,6 +70,9 @@ static int rtw8822c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_PCIE: rtw8822ce_efuse_parsing(efuse, map); break; + case RTW_HCI_TYPE_SDIO: + rtw8822cs_efuse_parsing(efuse, map); + break; case RTW_HCI_TYPE_USB: rtw8822cu_efuse_parsing(efuse, map); break; diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireless/realtek/rtw88/rtw8822c.h index 479d5d769c52..eec2e3074087 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8822c.h +++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.h @@ -16,6 +16,11 @@ struct rtw8822cu_efuse { u8 res2[0x3d]; }; +struct rtw8822cs_efuse { + u8 res0[0x4a]; /* 0x120 */ + u8 mac_addr[ETH_ALEN]; /* 0x16a */ +}; + struct rtw8822ce_efuse { u8 mac_addr[ETH_ALEN]; /* 0x120 */ u8 vender_id[2]; @@ -92,6 +97,7 @@ struct rtw8822c_efuse { u8 res10[0x42]; union { struct rtw8822cu_efuse u; + struct rtw8822cs_efuse s; struct rtw8822ce_efuse e; }; }; -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 49372C4708D for ; Tue, 27 Dec 2022 23:31:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229744AbiL0XbQ (ORCPT ); Tue, 27 Dec 2022 18:31:16 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57616 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232050AbiL0Xaz (ORCPT ); Tue, 27 Dec 2022 18:30:55 -0500 Received: from mail-ed1-x52d.google.com (mail-ed1-x52d.google.com [IPv6:2a00:1450:4864:20::52d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8392BDED6; Tue, 27 Dec 2022 15:30:45 -0800 (PST) Received: by mail-ed1-x52d.google.com with SMTP id r26so15660520edc.5; Tue, 27 Dec 2022 15:30:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=P3w67rXYb4ve8I5B5m+YRlvZDv2zR1R4FBsmmtE/Ozc=; b=ij2yiiak3n1tbzP0a4ZRCOYWftMiGqXaFkS/INqNNpDGY65+9PvFg7KZShqKx9azIA QlDHFUs0ax10yOWKAXOiisG8EGBT1OKPDSleEgIYXuFA1ACblgIPv+pRl9WgjbTpw/z7 ZlPD/iBf41KZOHP7su1h5w5oeBmknkU+IuetVJiJgABN79qAF8r+5UwwE9aMnC5J2VEi spcgfQ1WgoIQGYlHDVihThvHe7kuMIlfdzAd6tt74k5UQ0WpgqGGdCjFmR9CjfAfY9yH SUwrDITzciL3rNiW8nTw12TUjjvCti8Au3jlUjm4SSHkCO7Aco+wOCe+i71l1Is1hKPP rbBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=P3w67rXYb4ve8I5B5m+YRlvZDv2zR1R4FBsmmtE/Ozc=; b=ITbvyGZLHVQlUoBRfS+oiX+RiQTrnJIm0T7hmfvtyDuzcBV2yfqr9HLbZF1AgJJlK0 yL9sFxmAkjCHU0xr03rbeNKaJ5VAGcrJLJKhv8XR+df1wV+eVLcqxCvxl2L04nKA774q LiLAg9/xeRrfZA8Jin/y9Mbalk4uX0ivtaji1Wqz5fSkFQ4ZvIug2IHLOisUKHEJT9fE Eo41RSbIT9CfzwkO0WdvqM6UZ1rRkj5qLhkZP5jP8G9/fJGhJRTLnSChprIpm1uq+Q6U 3lGkm63/k0oVhX5XG4SeqxOm8KX1kOxr1cTl+xKo3v7osJzjtExTbtIjFAbaxhHTR+fz WEvg== X-Gm-Message-State: AFqh2kqf2CrZEKx7FxMFNs0CDq1XDfFgZc9dA+aXSd+i+L+WkepoVVmc hG8wsnCV24unckpLD7vq63FtuS4d7CY= X-Google-Smtp-Source: AMrXdXuZuZZ7LwRM5nmqIXSaJ14M6sThRtWPouK1QxqOssAmKEQQESQFbRVXVZ7rsppPlDHbBG6ngw== X-Received: by 2002:aa7:d8da:0:b0:474:5de4:a5d1 with SMTP id k26-20020aa7d8da000000b004745de4a5d1mr24070817eds.39.1672183843624; Tue, 27 Dec 2022 15:30:43 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:43 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 09/19] rtw88: hci: Add an optional power_switch() callback to rtw_hci_ops Date: Wed, 28 Dec 2022 00:30:10 +0100 Message-Id: <20221227233020.284266-10-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org 32-bit SDIO bus reads/writes only work when the card is powered on. Add an optional power_switch() callback to struct rtw_hci_ops where we inform the HCI sub-driver that the chip is now powered on. Based on this information the upcoming SDIO HCI implementation can then use the appropriate 32-bit read/write accessors. Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/hci.h | 8 ++++++++ drivers/net/wireless/realtek/rtw88/mac.c | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/drivers/net/wireless/realtek/rtw88/hci.h b/drivers/net/wireless/realtek/rtw88/hci.h index 830d7532f2a3..602a6acc1ca1 100644 --- a/drivers/net/wireless/realtek/rtw88/hci.h +++ b/drivers/net/wireless/realtek/rtw88/hci.h @@ -22,6 +22,8 @@ struct rtw_hci_ops { int (*write_data_rsvd_page)(struct rtw_dev *rtwdev, u8 *buf, u32 size); int (*write_data_h2c)(struct rtw_dev *rtwdev, u8 *buf, u32 size); + void (*power_switch)(struct rtw_dev *rtwdev, bool on); + u8 (*read8)(struct rtw_dev *rtwdev, u32 addr); u16 (*read16)(struct rtw_dev *rtwdev, u32 addr); u32 (*read32)(struct rtw_dev *rtwdev, u32 addr); @@ -84,6 +86,12 @@ rtw_hci_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size) return rtwdev->hci.ops->write_data_h2c(rtwdev, buf, size); } +static inline void rtw_hci_power_switch(struct rtw_dev *rtwdev, bool on) +{ + if (rtwdev->hci.ops->power_switch) + rtwdev->hci.ops->power_switch(rtwdev, on); +} + static inline u8 rtw_read8(struct rtw_dev *rtwdev, u32 addr) { return rtwdev->hci.ops->read8(rtwdev, addr); diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c index 4e5c194aac29..bf1291902661 100644 --- a/drivers/net/wireless/realtek/rtw88/mac.c +++ b/drivers/net/wireless/realtek/rtw88/mac.c @@ -273,16 +273,24 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on) if (pwr_on == cur_pwr) return -EALREADY; + /* Always signal power off before power sequence. This way + * read/write functions will take path which works in both + * states. State will change in the middle of the sequence. + */ + rtw_hci_power_switch(rtwdev, false); + pwr_seq = pwr_on ? chip->pwr_on_seq : chip->pwr_off_seq; ret = rtw_pwr_seq_parser(rtwdev, pwr_seq); if (ret) return ret; if (pwr_on) set_bit(RTW_FLAG_POWERON, rtwdev->flags); else clear_bit(RTW_FLAG_POWERON, rtwdev->flags); + rtw_hci_power_switch(rtwdev, pwr_on); + return 0; } -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 05E17C4708E for ; Tue, 27 Dec 2022 23:31:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232679AbiL0Xbg (ORCPT ); Tue, 27 Dec 2022 18:31:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57812 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232572AbiL0XbB (ORCPT ); Tue, 27 Dec 2022 18:31:01 -0500 Received: from mail-ed1-x52d.google.com (mail-ed1-x52d.google.com [IPv6:2a00:1450:4864:20::52d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8756BDF21; Tue, 27 Dec 2022 15:30:46 -0800 (PST) Received: by mail-ed1-x52d.google.com with SMTP id s5so20853172edc.12; Tue, 27 Dec 2022 15:30:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=69RnArZw8pH7v6gYxnQGzkJOThGnroKfpqTaxkmeVcY=; b=VAG6baKX/Mbr2DiVvAd65r0OFECQlNI7HMyeV5xK5EFM/UA2S2OKtOulpjvKMcBtfl 5HrY4slBX+ZTCC8atGBqBz4TNbgCVtEYt256Ba86Qr5xa3cZBnBY7ewZZq0wPNzLx5+/ EdzV9LQ964qkyv3XzxNFudAa37qfu9eW2JlrrmSqIrqJI1SNB8szOKArWKknQcT2EfqK tjWtVUw5C3i6F3Y02mKz1ynaR+cATwqAkwAG8FIHrTQKyuCK3MvWReYEkidjBwHxieRY rt4+TzAwkZY2EnxqlHAkctd8d6QH6cWJZRCnPp1cXsZQZbv/e7Fi254KasR44zT4Hsxh kXBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=69RnArZw8pH7v6gYxnQGzkJOThGnroKfpqTaxkmeVcY=; b=jsZ67VLsCP1dNPvGLQ5VZlc4KhD3jBZmZ99BbHccDPwFDicerqKqgTYrWeUeZNvwZw uvyqMLVp3DL7d0ngjf35M6rjx+Vren0YiWVA+WxX8CNaBmvSImT3eib3sHLxrJp1RmFj dcaRMHc3zgqvV4nR0MsRqHlbe9N6P+hytnVM33mGjdp3z3UVMw/+Epi2vS42Ojzn/tlF ltdT8281OsleaPKkk1fXHsci8K5lpwZ3oKTSc2J0QH2p+LDbkGU18SHVCT7PIjR+veSL kfmQ7JYtqcYJlnO/p3S7SypEbDZmulZ9hxRCLhzo+o2qPCb7WbzUc9WDxOMP6c4lwk9b iQwA== X-Gm-Message-State: AFqh2kob/Wb1picBH8fwdi/jHG82un/MEMM8swhCTwsRUB0uycpFonMa zZCuhEw/NAIp4o5CMuz+SUveORk5t/k= X-Google-Smtp-Source: AMrXdXuFjWYhuXY54NqEai5crXRnZmHWyZmaV0No9HAtAyd8YZaEWgoMr1yvq0OCoKF2/JAOZP3PgA== X-Received: by 2002:a05:6402:1055:b0:467:c3cb:49aa with SMTP id e21-20020a056402105500b00467c3cb49aamr19724907edu.4.1672183845760; Tue, 27 Dec 2022 15:30:45 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:45 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 11/19] rtw88: mac: Add support for the SDIO HCI in the TX/page table setup Date: Wed, 28 Dec 2022 00:30:12 +0100 Message-Id: <20221227233020.284266-12-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org txdma_queue_mapping() and priority_queue_cfg() can use the first entry of each chip's rqpn_table and page_table. Add this mapping so data transmission is possible on SDIO based chipsets. Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/mac.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c index c04938691add..8e1fa824b32b 100644 --- a/drivers/net/wireless/realtek/rtw88/mac.c +++ b/drivers/net/wireless/realtek/rtw88/mac.c @@ -1053,6 +1053,9 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev) else return -EINVAL; break; + case RTW_HCI_TYPE_SDIO: + rqpn = &chip->rqpn_table[0]; + break; default: return -EINVAL; } @@ -1215,6 +1218,9 @@ static int priority_queue_cfg(struct rtw_dev *rtwdev) else return -EINVAL; break; + case RTW_HCI_TYPE_SDIO: + pg_tbl = &chip->page_table[0]; + break; default: return -EINVAL; } -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 98469C46467 for ; Tue, 27 Dec 2022 23:32:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232730AbiL0Xc2 (ORCPT ); Tue, 27 Dec 2022 18:32:28 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58402 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232645AbiL0Xb3 (ORCPT ); Tue, 27 Dec 2022 18:31:29 -0500 Received: from mail-ed1-x535.google.com (mail-ed1-x535.google.com [IPv6:2a00:1450:4864:20::535]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 027ABE02F; Tue, 27 Dec 2022 15:30:49 -0800 (PST) Received: by mail-ed1-x535.google.com with SMTP id c17so20833998edj.13; Tue, 27 Dec 2022 15:30:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Z1azAtpeEKYDc3NsUxyyhrkCkOfc9fkFfo7oykDXpuo=; b=XlGMCT0G2gcvou7A9Uz3FQJacwyUgb1Zz5lAyFoZzyZHCj1HKXqd+/VkL80XXWWrRJ SVsmc35bG4CZMUFjWlknxhSyXoMi0KWKe2VP0Zho3Y7CU6Xk7NliivisFCzVOOs8NlGQ Y0zNWolAgXyiIKDs26GR7w7hct40DjTv0GzA+YgZLLtglN0cWduBlAOziEajdQ44u8bC TeJuBAJQgs39nuwxrriA2O9KS5UQYldzGB5e3Qo9+CHpcajWmj/fcoUV46vc4nMBFN4t rtvMi1t1azNEkEGqD7iSN8wjhJdspfYH8PfehG1RwOox+e0+Lcu8ESu7ZDUTTa6ayi3v 61kQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Z1azAtpeEKYDc3NsUxyyhrkCkOfc9fkFfo7oykDXpuo=; b=6TSN+AtHBQvF2axE+sBzP/WZdXUWdQJ6OF0inkKj66AQNsfurIYglv2+6Z2pMLfD9d FEd62EBhWYabGms2LWfh2lLd03sgvTXfGVWa+LuFMPR84MBZqgVsyrcEQErxRft2/dp8 HytKwmX9XuOLaGbCsDpxY2ZuUvMaffqYZcl/lUY3WnxXibVDocFHquTpVhSluub1iI6o WxcL2T7VmkNSlgtC9RDl0QIXM1thUBCi6XhhW0gJBOz5BdPZZ1ykLq/h+CSOn3BqcWYv 99QyfiS6yjoZAqL3j0OX+D2SQbB3bl2FD1mbbXaz9EHfkFD00gO8m6DN/bkES0RUb23R vUtQ== X-Gm-Message-State: AFqh2kreKyCx11dR2mEx05XQBJhSAGI/nokM4q+fAaDBkiWF4LLuLKls aRzcZQVUtCxz0EHG+IPB8EUSan4ubqs= X-Google-Smtp-Source: AMrXdXviXpG2jnGIM6KWSd7+hKRFh7JMbeSihF1O6ETNZdqhS0oAdWefk7N0xooLLUxc3msgYlPS0w== X-Received: by 2002:a05:6402:282:b0:480:c06:2833 with SMTP id l2-20020a056402028200b004800c062833mr15317548edv.38.1672183847852; Tue, 27 Dec 2022 15:30:47 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:47 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 13/19] rtw88: mac: Add support for SDIO specifics in the power on sequence Date: Wed, 28 Dec 2022 00:30:14 +0100 Message-Id: <20221227233020.284266-14-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Add the code specific to SDIO HCI in the MAC power on sequence. This is based on the RTL8822BS and RTL8822CS vendor drivers. Co-developed-by: Jernej Skrabec Signed-off-by: Jernej Skrabec Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/mac.c | 41 ++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c index 8e1fa824b32b..ad71f9838d1d 100644 --- a/drivers/net/wireless/realtek/rtw88/mac.c +++ b/drivers/net/wireless/realtek/rtw88/mac.c @@ -7,6 +7,7 @@ #include "reg.h" #include "fw.h" #include "debug.h" +#include "sdio.h" void rtw_set_channel_mac(struct rtw_dev *rtwdev, u8 channel, u8 bw, u8 primary_ch_idx) @@ -60,6 +61,7 @@ EXPORT_SYMBOL(rtw_set_channel_mac); static int rtw_mac_pre_system_cfg(struct rtw_dev *rtwdev) { + unsigned int retry; u32 value32; u8 value8; @@ -77,6 +79,26 @@ static int rtw_mac_pre_system_cfg(struct rtw_dev *rtwdev) case RTW_HCI_TYPE_PCIE: rtw_write32_set(rtwdev, REG_HCI_OPT_CTRL, BIT_USB_SUS_DIS); break; + case RTW_HCI_TYPE_SDIO: + rtw_write8_clr(rtwdev, REG_SDIO_HSUS_CTRL, BIT(0)); + + for (retry = 0; retry < RTW_PWR_POLLING_CNT; retry++) { + if (rtw_read8(rtwdev, REG_SDIO_HSUS_CTRL) & BIT(1)) + break; + + usleep_range(10, 50); + } + + if (retry == RTW_PWR_POLLING_CNT) { + rtw_err(rtwdev, "failed to poll REG_SDIO_HSUS_CTRL[1]"); + return -ETIMEDOUT; + } + + if (rtw_sdio_is_sdio30_supported(rtwdev)) + rtw_write8_set(rtwdev, REG_HCI_OPT_CTRL + 2, BIT(2)); + else + rtw_write8_clr(rtwdev, REG_HCI_OPT_CTRL + 2, BIT(2)); + break; case RTW_HCI_TYPE_USB: break; default: @@ -248,6 +270,7 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on) { const struct rtw_chip_info *chip = rtwdev->chip; const struct rtw_pwr_seq_cmd **pwr_seq; + u32 imr; u8 rpwm; bool cur_pwr; int ret; @@ -279,18 +302,25 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on) */ rtw_hci_power_switch(rtwdev, false); + imr = rtw_read32(rtwdev, REG_SDIO_HIMR); + rtw_write32(rtwdev, REG_SDIO_HIMR, 0); + pwr_seq = pwr_on ? chip->pwr_on_seq : chip->pwr_off_seq; ret = rtw_pwr_seq_parser(rtwdev, pwr_seq); - if (ret) + if (ret) { + rtw_write32(rtwdev, REG_SDIO_HIMR, imr); return ret; + } if (pwr_on) set_bit(RTW_FLAG_POWERON, rtwdev->flags); else clear_bit(RTW_FLAG_POWERON, rtwdev->flags); rtw_hci_power_switch(rtwdev, pwr_on); + rtw_write32(rtwdev, REG_SDIO_HIMR, imr); + return 0; } @@ -462,6 +492,9 @@ static void download_firmware_reg_backup(struct rtw_dev *rtwdev, rtw_write16(rtwdev, REG_FIFOPAGE_INFO_1, 0x200); rtw_write32(rtwdev, REG_RQPN_CTRL_2, bckp[bckp_idx - 1].val); + if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) + rtw_read32(rtwdev, REG_SDIO_FREE_TXPG); + /* Disable beacon related functions */ tmp = rtw_read8(rtwdev, REG_BCN_CTRL); bckp[bckp_idx].len = 1; @@ -1074,8 +1107,12 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev) if (rtw_chip_wcpu_11ac(rtwdev)) rtw_write32(rtwdev, REG_H2CQ_CSR, BIT_H2CQ_FULL); - if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) + if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) { + rtw_read32(rtwdev, REG_SDIO_FREE_TXPG); + rtw_write32(rtwdev, REG_SDIO_TX_CTRL, 0); + } else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) { rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_ARBBW_EN); + } return 0; } -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 655F7C4332F for ; Tue, 27 Dec 2022 23:32:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229915AbiL0Xcb (ORCPT ); Tue, 27 Dec 2022 18:32:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58412 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232483AbiL0Xb3 (ORCPT ); Tue, 27 Dec 2022 18:31:29 -0500 Received: from mail-ed1-x534.google.com (mail-ed1-x534.google.com [IPv6:2a00:1450:4864:20::534]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0BC01E027; Tue, 27 Dec 2022 15:30:48 -0800 (PST) Received: by mail-ed1-x534.google.com with SMTP id c17so20833966edj.13; Tue, 27 Dec 2022 15:30:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=fD8uT7fYa3hod/z3QeBx+v6brl7qVd4PgX6NXRL4Rps=; b=SJzQoUQKDmrooPw/DApb/rVN0+I8IgHb0qq/0KlQku5R2RWlaE3YX1mn3E6vkEhTAk PFEJbad9I2ogfIkc4c5dk4oj1ovsidKXZPCcEMOpSopq8ttIkeurO96HeXLdA52Ss6Pp iGQnIUb8v8By4rQ8sx2bbX/803eOMjE+cOdWkC3T0MfdXII9LS3pJR4aY35DmSe9BEeu bMxt5XenqFpLMpyeUGOxVoLfo4Cc/qflGVCrbwJ4Rp+3xxgS4s9YfPfPLdLENvDWZlvV riEu/9F0O+YAx1HTNpCJ0J+kNjwGnXDLM8Ug+NKhj6AOvjVq55mORe1sqUacbX+AkSX5 KMfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=fD8uT7fYa3hod/z3QeBx+v6brl7qVd4PgX6NXRL4Rps=; b=zlgHjkI/7H1+WSDrPXbRO1q40YZ0C3fdpF2qDCGuyPb90gAobXYHpKjdVaz6BI+rL/ MqEAWkKion/uW3i8/VUBKKQDH65UIwNkvLaHupJGD9yNpKQUV/TAao3BSu5gatCePYhV LuGEG07GgtQCwm/K0Vw/nBQv9NMWuD99DdMMaW09260Vkirx8F8f4aNnKrgxtd4QamcJ TmfyorsEf/vuzb4cwevnuywzKvY/Kg2+5d+BtfKSjjGimS4Jx8IZQB9+Ja31u+pYKe4l LcyuFxtIL69jiVYSmSsvnZHLQNmrYoHT4dzTfmuJRhQRBeGZPXswjzfrMJUrIYUqxpHU TdYw== X-Gm-Message-State: AFqh2kopXzdYbozbHS1r0xSRo+egAwi41jNUYLAld7oqzPjEdi6RpV7e fp4PFCFXjFB48+JMi/8MbBH4FBcsiGY= X-Google-Smtp-Source: AMrXdXtBFpZOTTSeitCGHkMLUuDviJqkIgxAJ23rDWbLVnQFFXXGkrWkjIQUpRR20hnHPTUHCRQviw== X-Received: by 2002:a50:9f09:0:b0:46b:2b37:ffa6 with SMTP id b9-20020a509f09000000b0046b2b37ffa6mr21141670edf.13.1672183846738; Tue, 27 Dec 2022 15:30:46 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:46 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 12/19] rtw88: sdio: Add HCI implementation for SDIO based chipsets Date: Wed, 28 Dec 2022 00:30:13 +0100 Message-Id: <20221227233020.284266-13-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Add a sub-driver for SDIO based chipsets which implements the following functionality: - register accessors for 8, 16 and 32 bits for all states of the card (including usage of 4x 8 bit access for one 32 bit buffer if the card is not fully powered on yet - or if it's fully powered on then 1x 32 bit access is used) - checking whether there's space in the TX FIFO queue to transmit data - transfers from the host to the device for actual network traffic, reserved pages (for firmware download) and H2C (host-to-card) transfers - receiving data from the device - deep power saving state The transmit path is optimized so DMA-capable SDIO host controllers can directly use the buffers provided because the buffer's physical addresses are 8 byte aligned. The receive path is prepared to support RX aggregation where the chipset combines multiple MAC frames into one bigger buffer to reduce SDIO transfer overhead. Co-developed-by: Jernej Skrabec Signed-off-by: Jernej Skrabec Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/Kconfig | 3 + drivers/net/wireless/realtek/rtw88/Makefile | 3 + drivers/net/wireless/realtek/rtw88/debug.h | 1 + drivers/net/wireless/realtek/rtw88/mac.h | 1 - drivers/net/wireless/realtek/rtw88/reg.h | 10 + drivers/net/wireless/realtek/rtw88/sdio.c | 1242 +++++++++++++++++++ drivers/net/wireless/realtek/rtw88/sdio.h | 175 +++ 7 files changed, 1434 insertions(+), 1 deletion(-) create mode 100644 drivers/net/wireless/realtek/rtw88/sdio.c create mode 100644 drivers/net/wireless/realtek/rtw88/sdio.h diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig index 651ab56d9c6b..cdf9cb478ee2 100644 --- a/drivers/net/wireless/realtek/rtw88/Kconfig +++ b/drivers/net/wireless/realtek/rtw88/Kconfig @@ -16,6 +16,9 @@ config RTW88_CORE config RTW88_PCI tristate +config RTW88_SDIO + tristate + config RTW88_USB tristate diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile index fe7293ee87b4..892cad60ba31 100644 --- a/drivers/net/wireless/realtek/rtw88/Makefile +++ b/drivers/net/wireless/realtek/rtw88/Makefile @@ -59,5 +59,8 @@ rtw88_8821cu-objs := rtw8821cu.o obj-$(CONFIG_RTW88_PCI) += rtw88_pci.o rtw88_pci-objs := pci.o +obj-$(CONFIG_RTW88_SDIO) += rtw88_sdio.o +rtw88_sdio-objs := sdio.o + obj-$(CONFIG_RTW88_USB) += rtw88_usb.o rtw88_usb-objs := usb.o diff --git a/drivers/net/wireless/realtek/rtw88/debug.h b/drivers/net/wireless/realtek/rtw88/debug.h index 066792dd96af..a9149c6c2b48 100644 --- a/drivers/net/wireless/realtek/rtw88/debug.h +++ b/drivers/net/wireless/realtek/rtw88/debug.h @@ -24,6 +24,7 @@ enum rtw_debug_mask { RTW_DBG_ADAPTIVITY = 0x00008000, RTW_DBG_HW_SCAN = 0x00010000, RTW_DBG_STATE = 0x00020000, + RTW_DBG_SDIO = 0x00040000, RTW_DBG_ALL = 0xffffffff }; diff --git a/drivers/net/wireless/realtek/rtw88/mac.h b/drivers/net/wireless/realtek/rtw88/mac.h index 3172aa5ac4de..58c3dccc14bb 100644 --- a/drivers/net/wireless/realtek/rtw88/mac.h +++ b/drivers/net/wireless/realtek/rtw88/mac.h @@ -7,7 +7,6 @@ #define RTW_HW_PORT_NUM 5 #define cut_version_to_mask(cut) (0x1 << ((cut) + 1)) -#define SDIO_LOCAL_OFFSET 0x10250000 #define DDMA_POLLING_COUNT 1000 #define C2H_PKT_BUF 256 #define REPORT_BUF 128 diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h index 8852b24d6c2a..4ea2c6b491e9 100644 --- a/drivers/net/wireless/realtek/rtw88/reg.h +++ b/drivers/net/wireless/realtek/rtw88/reg.h @@ -185,6 +185,9 @@ (((x) & BIT_MASK_TXDMA_VIQ_MAP) << BIT_SHIFT_TXDMA_VIQ_MAP) #define REG_TXDMA_PQ_MAP 0x010C #define BIT_RXDMA_ARBBW_EN BIT(0) +#define BIT_RXSHFT_EN BIT(1) +#define BIT_RXDMA_AGG_EN BIT(2) +#define BIT_TXDMA_BW_EN BIT(3) #define BIT_SHIFT_TXDMA_BEQ_MAP 8 #define BIT_MASK_TXDMA_BEQ_MAP 0x3 #define BIT_TXDMA_BEQ_MAP(x) \ @@ -283,10 +286,17 @@ #define REG_H2C_TAIL 0x0248 #define REG_H2C_READ_ADDR 0x024C #define REG_H2C_INFO 0x0254 +#define REG_RXDMA_AGG_PG_TH 0x0280 +#define BIT_SHIFT_DMA_AGG_TO_V1 8 +#define BIT_EN_PRE_CALC BIT(29) #define REG_RXPKT_NUM 0x0284 #define BIT_RXDMA_REQ BIT(19) #define BIT_RW_RELEASE BIT(18) #define BIT_RXDMA_IDLE BIT(17) +#define REG_RXDMA_STATUS 0x0288 +#define REG_RXDMA_DPR 0x028C +#define REG_RXDMA_MODE 0x0290 +#define BIT_DMA_MODE BIT(1) #define REG_RXPKTNUM 0x02B0 #define REG_INT_MIG 0x0304 diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c new file mode 100644 index 000000000000..0e637ff2293f --- /dev/null +++ b/drivers/net/wireless/realtek/rtw88/sdio.c @@ -0,0 +1,1242 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright (C) 2021 Martin Blumenstingl + * Copyright (C) 2021 Jernej Skrabec + * + * Based on rtw88/pci.c: + * Copyright(c) 2018-2019 Realtek Corporation + */ + +#include +#include +#include +#include "sdio.h" +#include "reg.h" +#include "tx.h" +#include "rx.h" +#include "fw.h" +#include "ps.h" +#include "debug.h" + +#define RTW_SDIO_INDIRECT_RW_RETRIES 50 + +static bool rtw_sdio_is_bus_addr(u32 addr) +{ + return (addr & RTW_SDIO_BUS_MSK) != 0; +} + +static bool rtw_sdio_bus_claim_needed(struct rtw_sdio *rtwsdio) +{ + return !rtwsdio->irq_thread || + rtwsdio->irq_thread != current; +} + +static u32 rtw_sdio_to_bus_offset(struct rtw_dev *rtwdev, u32 addr) +{ + switch (addr & RTW_SDIO_BUS_MSK) { + case WLAN_IOREG_OFFSET: + addr &= WLAN_IOREG_REG_MSK; + addr |= FIELD_PREP(REG_SDIO_CMD_ADDR_MSK, + REG_SDIO_CMD_ADDR_MAC_REG); + break; + case SDIO_LOCAL_OFFSET: + addr &= SDIO_LOCAL_REG_MSK; + addr |= FIELD_PREP(REG_SDIO_CMD_ADDR_MSK, + REG_SDIO_CMD_ADDR_SDIO_REG); + break; + default: + rtw_warn(rtwdev, "Cannot convert addr 0x%08x to bus offset", + addr); + } + + return addr; +} + +static void rtw_sdio_writel(struct rtw_sdio *rtwsdio, u32 val, + u32 addr, int *ret) +{ + u8 buf[4]; + int i; + + if (!(addr & 3) && rtwsdio->is_powered_on) { + sdio_writel(rtwsdio->sdio_func, val, addr, ret); + return; + } + + *(__le32 *)buf = cpu_to_le32(val); + + for (i = 0; i < 4; i++) { + sdio_writeb(rtwsdio->sdio_func, buf[i], addr + i, ret); + if (*ret) + return; + } +} + +static u32 rtw_sdio_readl(struct rtw_sdio *rtwsdio, u32 addr, int *ret) +{ + u8 buf[4]; + int i; + + if (!(addr & 3) && rtwsdio->is_powered_on) + return sdio_readl(rtwsdio->sdio_func, addr, ret); + + for (i = 0; i < 4; i++) { + buf[i] = sdio_readb(rtwsdio->sdio_func, addr + i, ret); + if (*ret) + return 0; + } + + return le32_to_cpu(*(__le32 *)buf); +} + +static u8 rtw_sdio_read_indirect8(struct rtw_dev *rtwdev, u32 addr, int *ret) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + u32 reg_cfg, reg_data; + int retry; + u8 tmp; + + reg_cfg = rtw_sdio_to_bus_offset(rtwdev, REG_SDIO_INDIRECT_REG_CFG); + reg_data = rtw_sdio_to_bus_offset(rtwdev, REG_SDIO_INDIRECT_REG_DATA); + + rtw_sdio_writel(rtwsdio, BIT(19) | addr, reg_cfg, ret); + if (*ret) + return 0; + + for (retry = 0; retry < RTW_SDIO_INDIRECT_RW_RETRIES; retry++) { + tmp = sdio_readb(rtwsdio->sdio_func, reg_cfg + 2, ret); + if (!ret && tmp & BIT(4)) + break; + } + + if (*ret) + return 0; + + return sdio_readb(rtwsdio->sdio_func, reg_data, ret); +} + +static int rtw_sdio_read_indirect_bytes(struct rtw_dev *rtwdev, u32 addr, + u8 *buf, int count) +{ + int i, ret; + + for (i = 0; i < count; i++) { + buf[0] = rtw_sdio_read_indirect8(rtwdev, addr + i, &ret); + if (ret) + break; + } + + return ret; +} + +static u32 rtw_sdio_read_indirect32(struct rtw_dev *rtwdev, u32 addr, int *ret) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + u32 reg_cfg, reg_data, val; + int retry; + + reg_cfg = rtw_sdio_to_bus_offset(rtwdev, REG_SDIO_INDIRECT_REG_CFG); + reg_data = rtw_sdio_to_bus_offset(rtwdev, REG_SDIO_INDIRECT_REG_DATA); + + rtw_sdio_writel(rtwsdio, BIT(19) | BIT(17) | addr, reg_cfg, ret); + if (*ret) + return 0; + + for (retry = 0; retry < RTW_SDIO_INDIRECT_RW_RETRIES; retry++) { + val = sdio_readb(rtwsdio->sdio_func, reg_cfg + 2, ret); + if (!ret && (val & BIT(4))) + break; + } + + if (!*ret) + val = rtw_sdio_readl(rtwsdio, reg_data, ret); + + return val; +} + +static u8 rtw_sdio_read8(struct rtw_dev *rtwdev, u32 addr) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + bool direct, bus_claim; + int ret; + u8 val; + + bus_claim = rtw_sdio_bus_claim_needed(rtwsdio); + direct = rtw_sdio_is_bus_addr(addr); + + if (bus_claim) + sdio_claim_host(rtwsdio->sdio_func); + + if (direct) { + addr = rtw_sdio_to_bus_offset(rtwdev, addr); + val = sdio_readb(rtwsdio->sdio_func, addr, &ret); + } else { + val = rtw_sdio_read_indirect8(rtwdev, addr, &ret); + } + + if (bus_claim) + sdio_release_host(rtwsdio->sdio_func); + + if (ret) + rtw_warn(rtwdev, "sdio read8 failed (0x%x): %d", addr, ret); + + return val; +} + +static u16 rtw_sdio_read16(struct rtw_dev *rtwdev, u32 addr) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + bool direct, bus_claim; + u8 buf[2]; + int ret; + u16 val; + + bus_claim = rtw_sdio_bus_claim_needed(rtwsdio); + direct = rtw_sdio_is_bus_addr(addr); + + if (bus_claim) + sdio_claim_host(rtwsdio->sdio_func); + + if (direct) { + addr = rtw_sdio_to_bus_offset(rtwdev, addr); + buf[0] = sdio_readb(rtwsdio->sdio_func, addr, &ret); + if (!ret) + buf[1] = sdio_readb(rtwsdio->sdio_func, addr + 1, &ret); + val = le16_to_cpu(*(__le16 *)buf); + } else if (addr & 1) { + ret = rtw_sdio_read_indirect_bytes(rtwdev, addr, buf, 2); + val = le16_to_cpu(*(__le16 *)buf); + } else { + val = rtw_sdio_read_indirect32(rtwdev, addr, &ret); + } + + if (bus_claim) + sdio_release_host(rtwsdio->sdio_func); + + if (ret) + rtw_warn(rtwdev, "sdio read16 failed (0x%x): %d", addr, ret); + + return val; +} + +static u32 rtw_sdio_read32(struct rtw_dev *rtwdev, u32 addr) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + bool direct, bus_claim; + u8 buf[4]; + u32 val; + int ret; + + bus_claim = rtw_sdio_bus_claim_needed(rtwsdio); + direct = rtw_sdio_is_bus_addr(addr); + + if (bus_claim) + sdio_claim_host(rtwsdio->sdio_func); + + if (direct) { + addr = rtw_sdio_to_bus_offset(rtwdev, addr); + val = rtw_sdio_readl(rtwsdio, addr, &ret); + } else if (addr & 3) { + ret = rtw_sdio_read_indirect_bytes(rtwdev, addr, buf, 4); + val = le32_to_cpu(*(__le32 *)buf); + } else { + val = rtw_sdio_read_indirect32(rtwdev, addr, &ret); + } + + if (bus_claim) + sdio_release_host(rtwsdio->sdio_func); + + if (ret) + rtw_warn(rtwdev, "sdio read32 failed (0x%x): %d", addr, ret); + + return val; +} + +static u32 rtw_sdio_to_write_address(struct rtw_dev *rtwdev, u32 addr) +{ + if (!rtw_sdio_is_bus_addr(addr)) + addr |= WLAN_IOREG_OFFSET; + + return rtw_sdio_to_bus_offset(rtwdev, addr); +} + +static void rtw_sdio_write8(struct rtw_dev *rtwdev, u32 addr, u8 val) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + bool bus_claim; + int ret; + + addr = rtw_sdio_to_write_address(rtwdev, addr); + bus_claim = rtw_sdio_bus_claim_needed(rtwsdio); + + if (bus_claim) + sdio_claim_host(rtwsdio->sdio_func); + + sdio_writeb(rtwsdio->sdio_func, val, addr, &ret); + + if (bus_claim) + sdio_release_host(rtwsdio->sdio_func); + + if (ret) + rtw_warn(rtwdev, "sdio write8 failed (0x%x): %d", addr, ret); +} + +static void rtw_sdio_write16(struct rtw_dev *rtwdev, u32 addr, u16 val) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + bool bus_claim; + int ret; + + addr = rtw_sdio_to_write_address(rtwdev, addr); + bus_claim = rtw_sdio_bus_claim_needed(rtwsdio); + + if (bus_claim) + sdio_claim_host(rtwsdio->sdio_func); + + sdio_writeb(rtwsdio->sdio_func, val, addr, &ret); + if (!ret) + sdio_writeb(rtwsdio->sdio_func, val >> 8, addr + 1, &ret); + + if (bus_claim) + sdio_release_host(rtwsdio->sdio_func); + + if (ret) + rtw_warn(rtwdev, "sdio write16 failed (0x%x): %d", addr, ret); +} + +static void rtw_sdio_write32(struct rtw_dev *rtwdev, u32 addr, u32 val) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + bool bus_claim; + int ret; + + addr = rtw_sdio_to_write_address(rtwdev, addr); + bus_claim = rtw_sdio_bus_claim_needed(rtwsdio); + + if (bus_claim) + sdio_claim_host(rtwsdio->sdio_func); + + rtw_sdio_writel(rtwsdio, val, addr, &ret); + + if (bus_claim) + sdio_release_host(rtwsdio->sdio_func); + + if (ret) + rtw_warn(rtwdev, "sdio write32 failed (0x%x): %d", addr, ret); +} + +static u32 rtw_sdio_get_tx_addr(struct rtw_dev *rtwdev, size_t size, + enum rtw_tx_queue_type queue) +{ + u32 txaddr; + + switch (queue) { + case RTW_TX_QUEUE_BCN: + case RTW_TX_QUEUE_H2C: + case RTW_TX_QUEUE_HI0: + txaddr = FIELD_PREP(REG_SDIO_CMD_ADDR_MSK, + REG_SDIO_CMD_ADDR_TXFF_HIGH); + break; + case RTW_TX_QUEUE_VI: + case RTW_TX_QUEUE_VO: + txaddr = FIELD_PREP(REG_SDIO_CMD_ADDR_MSK, + REG_SDIO_CMD_ADDR_TXFF_NORMAL); + break; + case RTW_TX_QUEUE_BE: + case RTW_TX_QUEUE_BK: + txaddr = FIELD_PREP(REG_SDIO_CMD_ADDR_MSK, + REG_SDIO_CMD_ADDR_TXFF_LOW); + break; + case RTW_TX_QUEUE_MGMT: + txaddr = FIELD_PREP(REG_SDIO_CMD_ADDR_MSK, + REG_SDIO_CMD_ADDR_TXFF_EXTRA); + break; + default: + rtw_warn(rtwdev, "Unsupported queue for TX addr: 0x%02x\n", + queue); + return 0; + } + + txaddr += DIV_ROUND_UP(size, 4); + + return txaddr; +}; + +static int rtw_sdio_read_port(struct rtw_dev *rtwdev, u8 *buf, size_t count) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + u32 rxaddr = rtwsdio->rx_addr++; + int ret; + + ret = sdio_memcpy_fromio(rtwsdio->sdio_func, buf, + RTW_SDIO_ADDR_RX_RX0FF_GEN(rxaddr), count); + if (ret) + rtw_warn(rtwdev, + "Failed to read %lu byte(s) from SDIO port 0x%08x", + count, rxaddr); + + return ret; +} + +static int rtw_sdio_check_free_txpg(struct rtw_dev *rtwdev, u8 queue, + size_t count) +{ + unsigned int pages_free, pages_needed; + + if (rtw_chip_wcpu_11n(rtwdev)) { + u32 free_txpg; + + free_txpg = rtw_sdio_read32(rtwdev, REG_SDIO_FREE_TXPG); + + switch (queue) { + case RTW_TX_QUEUE_BCN: + case RTW_TX_QUEUE_H2C: + case RTW_TX_QUEUE_HI0: + case RTW_TX_QUEUE_MGMT: + /* high */ + pages_free = free_txpg & 0xff; + break; + case RTW_TX_QUEUE_VI: + case RTW_TX_QUEUE_VO: + /* normal */ + pages_free = (free_txpg >> 8) & 0xff; + break; + case RTW_TX_QUEUE_BE: + case RTW_TX_QUEUE_BK: + /* low */ + pages_free = (free_txpg >> 16) & 0xff; + break; + default: + rtw_warn(rtwdev, "Unknown mapping for queue %u\n", queue); + break; + } + + /* add the pages from the public queue */ + pages_free += (free_txpg >> 24) & 0xff; + } else { + u32 free_txpg[3]; + + free_txpg[0] = rtw_sdio_read32(rtwdev, REG_SDIO_FREE_TXPG); + free_txpg[1] = rtw_sdio_read32(rtwdev, REG_SDIO_FREE_TXPG + 4); + free_txpg[2] = rtw_sdio_read32(rtwdev, REG_SDIO_FREE_TXPG + 8); + + switch (queue) { + case RTW_TX_QUEUE_BCN: + case RTW_TX_QUEUE_H2C: + case RTW_TX_QUEUE_HI0: + /* high */ + pages_free = free_txpg[0] & 0xfff; + break; + case RTW_TX_QUEUE_VI: + case RTW_TX_QUEUE_VO: + /* normal */ + pages_free = (free_txpg[0] >> 16) & 0xfff; + break; + case RTW_TX_QUEUE_BE: + case RTW_TX_QUEUE_BK: + /* low */ + pages_free = free_txpg[1] & 0xfff; + break; + case RTW_TX_QUEUE_MGMT: + /* extra */ + pages_free = free_txpg[2] & 0xfff; + break; + default: + rtw_warn(rtwdev, "Unknown mapping for queue %u\n", queue); + return -EINVAL; + } + + /* add the pages from the public queue */ + pages_free += (free_txpg[1] >> 16) & 0xfff; + } + + pages_needed = DIV_ROUND_UP(count, rtwdev->chip->page_size); + + if (pages_needed > pages_free) { + rtw_dbg(rtwdev, RTW_DBG_SDIO, + "Not enough free pages (%u needed, %u free) in queue %u for %zu bytes\n", + pages_needed, pages_free, queue, count); + return -EBUSY; + } + + return 0; +} + +static int rtw_sdio_write_port(struct rtw_dev *rtwdev, struct sk_buff *skb, + enum rtw_tx_queue_type queue) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + bool bus_claim; + size_t txsize; + u32 txaddr; + int ret; + + txaddr = rtw_sdio_get_tx_addr(rtwdev, skb->len, queue); + if (!txaddr) + return -EINVAL; + + txsize = sdio_align_size(rtwsdio->sdio_func, skb->len); + + ret = rtw_sdio_check_free_txpg(rtwdev, queue, txsize); + if (ret) + return ret; + + if (!IS_ALIGNED((unsigned long)skb->data, RTW_SDIO_DATA_PTR_ALIGN)) + rtw_warn(rtwdev, "Got unaligned SKB in %s() for queue %u\n", + __func__, queue); + + bus_claim = rtw_sdio_bus_claim_needed(rtwsdio); + + if (bus_claim) + sdio_claim_host(rtwsdio->sdio_func); + + ret = sdio_memcpy_toio(rtwsdio->sdio_func, txaddr, skb->data, txsize); + + if (bus_claim) + sdio_release_host(rtwsdio->sdio_func); + + if (ret) + rtw_warn(rtwdev, + "Failed to write %lu byte(s) to SDIO port 0x%08x", + txsize, txaddr); + + return ret; +} + +static void rtw_sdio_init(struct rtw_dev *rtwdev) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + + rtwsdio->irq_mask = REG_SDIO_HIMR_RX_REQUEST | REG_SDIO_HIMR_CPWM1; +} + +static void rtw_sdio_rx_aggregation(struct rtw_dev *rtwdev, bool enable) +{ + u8 size, timeout; + + if (enable) { + if (rtwdev->chip->id == RTW_CHIP_TYPE_8822C) { + size = 0xff; + timeout = 0x20; + } else { + size = 0x6; + timeout = 0x6; + } + + /* Make the firmware honor the size limit configured below */ + rtw_write32_set(rtwdev, REG_RXDMA_AGG_PG_TH, BIT_EN_PRE_CALC); + + rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_AGG_EN); + + rtw_write16(rtwdev, REG_RXDMA_AGG_PG_TH, size | + (timeout << BIT_SHIFT_DMA_AGG_TO_V1)); + + rtw_write8_set(rtwdev, REG_RXDMA_MODE, BIT_DMA_MODE); + } else { + rtw_write32_clr(rtwdev, REG_RXDMA_AGG_PG_TH, BIT_EN_PRE_CALC); + rtw_write8_clr(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_AGG_EN); + rtw_write8_clr(rtwdev, REG_RXDMA_MODE, BIT_DMA_MODE); + } +} + +static void rtw_sdio_enable_interrupt(struct rtw_dev *rtwdev) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + + rtw_write32(rtwdev, REG_SDIO_HIMR, rtwsdio->irq_mask); +} + +static void rtw_sdio_disable_interrupt(struct rtw_dev *rtwdev) +{ + rtw_write32(rtwdev, REG_SDIO_HIMR, 0x0); +} + +static u8 rtw_sdio_get_tx_qsel(struct rtw_dev *rtwdev, struct sk_buff *skb, + u8 queue) +{ + switch (queue) { + case RTW_TX_QUEUE_BCN: + return TX_DESC_QSEL_BEACON; + case RTW_TX_QUEUE_H2C: + return TX_DESC_QSEL_H2C; + case RTW_TX_QUEUE_MGMT: + if (rtw_chip_wcpu_11n(rtwdev)) + return TX_DESC_QSEL_HIGH; + else + return TX_DESC_QSEL_MGMT; + case RTW_TX_QUEUE_HI0: + return TX_DESC_QSEL_HIGH; + default: + return skb->priority; + } +}; + +static int rtw_sdio_setup(struct rtw_dev *rtwdev) +{ + /* nothing to do */ + return 0; +} + +static int rtw_sdio_start(struct rtw_dev *rtwdev) +{ + rtw_sdio_rx_aggregation(rtwdev, false); + rtw_sdio_enable_interrupt(rtwdev); + + return 0; +} + +static void rtw_sdio_stop(struct rtw_dev *rtwdev) +{ + rtw_sdio_disable_interrupt(rtwdev); +} + +static void rtw_sdio_deep_ps_enter(struct rtw_dev *rtwdev) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + bool tx_empty = true; + u8 queue; + + if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_TX_WAKE)) { + /* Deep PS state is not allowed to TX-DMA */ + for (queue = 0; queue < RTK_MAX_TX_QUEUE_NUM; queue++) { + /* BCN queue is rsvd page, does not have DMA interrupt + * H2C queue is managed by firmware + */ + if (queue == RTW_TX_QUEUE_BCN || + queue == RTW_TX_QUEUE_H2C) + continue; + + /* check if there is any skb DMAing */ + if (skb_queue_len(&rtwsdio->tx_queue[queue])) { + tx_empty = false; + break; + } + } + } + + if (!tx_empty) { + rtw_dbg(rtwdev, RTW_DBG_PS, + "TX path not empty, cannot enter deep power save state\n"); + return; + } + + set_bit(RTW_FLAG_LEISURE_PS_DEEP, rtwdev->flags); + rtw_power_mode_change(rtwdev, true); +} + +static void rtw_sdio_deep_ps_leave(struct rtw_dev *rtwdev) +{ + if (test_and_clear_bit(RTW_FLAG_LEISURE_PS_DEEP, rtwdev->flags)) + rtw_power_mode_change(rtwdev, false); +} + +static void rtw_sdio_deep_ps(struct rtw_dev *rtwdev, bool enter) +{ + if (enter && !test_bit(RTW_FLAG_LEISURE_PS_DEEP, rtwdev->flags)) + rtw_sdio_deep_ps_enter(rtwdev); + + if (!enter && test_bit(RTW_FLAG_LEISURE_PS_DEEP, rtwdev->flags)) + rtw_sdio_deep_ps_leave(rtwdev); +} + +static void rtw_sdio_tx_kick_off(struct rtw_dev *rtwdev) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + + queue_work(rtwsdio->txwq, &rtwsdio->tx_handler_data->work); +} + +static void rtw_sdio_link_ps(struct rtw_dev *rtwdev, bool enter) +{ + /* nothing to do */ +} + +static void rtw_sdio_interface_cfg(struct rtw_dev *rtwdev) +{ + u32 val; + + rtw_read32(rtwdev, REG_SDIO_FREE_TXPG); + + val = rtw_read32(rtwdev, REG_SDIO_TX_CTRL); + val &= 0xfff8; + rtw_write32(rtwdev, REG_SDIO_TX_CTRL, val); +} + +static void rtw_sdio_power_switch(struct rtw_dev *rtwdev, bool on) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + + rtwsdio->is_powered_on = on; +} + +static struct rtw_sdio_tx_data *rtw_sdio_get_tx_data(struct sk_buff *skb) +{ + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); + + BUILD_BUG_ON(sizeof(struct rtw_sdio_tx_data) > + sizeof(info->status.status_driver_data)); + + return (struct rtw_sdio_tx_data *)info->status.status_driver_data; +} + +static void rtw_sdio_tx_skb_prepare(struct rtw_dev *rtwdev, + struct rtw_tx_pkt_info *pkt_info, + struct sk_buff *skb, + enum rtw_tx_queue_type queue) +{ + const struct rtw_chip_info *chip = rtwdev->chip; + unsigned long data_addr, aligned_addr; + size_t offset; + u8 *pkt_desc; + + pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz); + + data_addr = (unsigned long)pkt_desc; + aligned_addr = ALIGN(data_addr, RTW_SDIO_DATA_PTR_ALIGN); + + if (data_addr != aligned_addr) { + /* Ensure that the start of the pkt_desc is always aligned at + * RTW_SDIO_DATA_PTR_ALIGN. + */ + offset = RTW_SDIO_DATA_PTR_ALIGN - (aligned_addr - data_addr); + + pkt_desc = skb_push(skb, offset); + + /* By inserting padding to align the start of the pkt_desc we + * need to inform the firmware that the actual data starts at + * a different offset than normal. + */ + pkt_info->offset += offset; + } + + memset(pkt_desc, 0, chip->tx_pkt_desc_sz); + + pkt_info->qsel = rtw_sdio_get_tx_qsel(rtwdev, skb, queue); + + rtw_tx_fill_tx_desc(pkt_info, skb); + chip->ops->fill_txdesc_checksum(rtwdev, pkt_info, pkt_desc); +} + +static int rtw_sdio_write_data(struct rtw_dev *rtwdev, + struct rtw_tx_pkt_info *pkt_info, + struct sk_buff *skb, + enum rtw_tx_queue_type queue) +{ + int ret; + + rtw_sdio_tx_skb_prepare(rtwdev, pkt_info, skb, queue); + + ret = rtw_sdio_write_port(rtwdev, skb, queue); + dev_kfree_skb_any(skb); + + return ret; +} + +static int rtw_sdio_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, + u32 size) +{ + struct rtw_tx_pkt_info pkt_info = {}; + struct sk_buff *skb; + + skb = rtw_tx_write_data_rsvd_page_get(rtwdev, &pkt_info, buf, size); + if (!skb) + return -ENOMEM; + + return rtw_sdio_write_data(rtwdev, &pkt_info, skb, RTW_TX_QUEUE_BCN); +} + +static int rtw_sdio_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size) +{ + struct rtw_tx_pkt_info pkt_info = {}; + struct sk_buff *skb; + + skb = rtw_tx_write_data_h2c_get(rtwdev, &pkt_info, buf, size); + if (!skb) + return -ENOMEM; + + return rtw_sdio_write_data(rtwdev, &pkt_info, skb, RTW_TX_QUEUE_H2C); +} + +static int rtw_sdio_tx_write(struct rtw_dev *rtwdev, + struct rtw_tx_pkt_info *pkt_info, + struct sk_buff *skb) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + enum rtw_tx_queue_type queue = rtw_tx_queue_mapping(skb); + struct rtw_sdio_tx_data *tx_data; + + rtw_sdio_tx_skb_prepare(rtwdev, pkt_info, skb, queue); + + tx_data = rtw_sdio_get_tx_data(skb); + tx_data->sn = pkt_info->sn; + + skb_queue_tail(&rtwsdio->tx_queue[queue], skb); + + return 0; +} + +static void rtw_sdio_tx_err_isr(struct rtw_dev *rtwdev) +{ + u32 val = rtw_read32(rtwdev, REG_TXDMA_STATUS); + + rtw_write32(rtwdev, REG_TXDMA_STATUS, val); +} + +static void rtw_sdio_rx_skb(struct rtw_dev *rtwdev, struct sk_buff *skb, + u32 pkt_offset, struct rtw_rx_pkt_stat *pkt_stat, + struct ieee80211_rx_status *rx_status) +{ + memcpy(IEEE80211_SKB_RXCB(skb), rx_status, sizeof(*rx_status)); + + if (pkt_stat->is_c2h) { + skb_put(skb, pkt_stat->pkt_len + pkt_offset); + rtw_fw_c2h_cmd_rx_irqsafe(rtwdev, pkt_offset, skb); + return; + } + + skb_put(skb, pkt_stat->pkt_len); + skb_reserve(skb, pkt_offset); + + rtw_rx_stats(rtwdev, pkt_stat->vif, skb); + + ieee80211_rx_irqsafe(rtwdev->hw, skb); +} + +static void rtw_sdio_rxfifo_recv(struct rtw_dev *rtwdev, u32 rx_len) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + const struct rtw_chip_info *chip = rtwdev->chip; + u32 pkt_desc_sz = chip->rx_pkt_desc_sz; + struct ieee80211_rx_status rx_status; + struct rtw_rx_pkt_stat pkt_stat; + struct sk_buff *skb, *split_skb; + u32 pkt_offset, curr_pkt_len; + size_t bufsz; + u8 *rx_desc; + int ret; + + bufsz = sdio_align_size(rtwsdio->sdio_func, rx_len); + + skb = dev_alloc_skb(bufsz); + if (!skb) + return; + + ret = rtw_sdio_read_port(rtwdev, skb->data, bufsz); + if (ret) { + dev_kfree_skb_any(skb); + return; + } + + while (true) { + rx_desc = skb->data; + chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat, + &rx_status); + pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz + + pkt_stat.shift; + + curr_pkt_len = ALIGN(pkt_offset + pkt_stat.pkt_len, + RTW_SDIO_DATA_PTR_ALIGN); + + if ((curr_pkt_len + pkt_desc_sz) >= rx_len) { + /* Use the original skb (with it's adjusted offset) + * when processing the last (or even the only) entry to + * have it's memory freed automatically. + */ + rtw_sdio_rx_skb(rtwdev, skb, pkt_offset, &pkt_stat, + &rx_status); + break; + } + + split_skb = dev_alloc_skb(curr_pkt_len); + if (!split_skb) { + rtw_sdio_rx_skb(rtwdev, skb, pkt_offset, &pkt_stat, + &rx_status); + break; + } + + skb_copy_header(split_skb, skb); + memcpy(split_skb->data, skb->data, curr_pkt_len); + + rtw_sdio_rx_skb(rtwdev, split_skb, pkt_offset, &pkt_stat, + &rx_status); + + /* Move to the start of the next RX descriptor */ + skb_reserve(skb, curr_pkt_len); + rx_len -= curr_pkt_len; + } +} + +static void rtw_sdio_rx_isr(struct rtw_dev *rtwdev) +{ + u32 rx_len; + + while (true) { + if (rtw_chip_wcpu_11n(rtwdev)) + rx_len = rtw_read16(rtwdev, REG_SDIO_RX0_REQ_LEN); + else + rx_len = rtw_read32(rtwdev, REG_SDIO_RX0_REQ_LEN); + + if (!rx_len) + break; + + rtw_sdio_rxfifo_recv(rtwdev, rx_len); + } +} + +static void rtw_sdio_handle_interrupt(struct sdio_func *sdio_func) +{ + struct ieee80211_hw *hw = sdio_get_drvdata(sdio_func); + struct rtw_dev *rtwdev = hw->priv; + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + u32 hisr; + + rtwsdio->irq_thread = current; + + hisr = rtw_read32(rtwdev, REG_SDIO_HISR); + + if (hisr & REG_SDIO_HISR_TXERR) + rtw_sdio_tx_err_isr(rtwdev); + if (hisr & REG_SDIO_HISR_RX_REQUEST) { + hisr &= ~REG_SDIO_HISR_RX_REQUEST; + rtw_sdio_rx_isr(rtwdev); + } + + rtw_write32(rtwdev, REG_SDIO_HISR, hisr); + + rtwsdio->irq_thread = NULL; +} + +static int __maybe_unused rtw_sdio_suspend(struct device *dev) +{ + return 0; +} + +static int __maybe_unused rtw_sdio_resume(struct device *dev) +{ + return 0; +} + +SIMPLE_DEV_PM_OPS(rtw_sdio_pm_ops, rtw_sdio_suspend, rtw_sdio_resume); +EXPORT_SYMBOL(rtw_sdio_pm_ops); + +static int rtw_sdio_claim(struct rtw_dev *rtwdev, struct sdio_func *sdio_func) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + int ret; + + sdio_claim_host(sdio_func); + + ret = sdio_enable_func(sdio_func); + if (ret) { + rtw_err(rtwdev, "Failed to enable SDIO func"); + goto err_release_host; + } + + ret = sdio_set_block_size(sdio_func, RTW_SDIO_BLOCK_SIZE); + if (ret) { + rtw_err(rtwdev, "Failed to set SDIO block size to 512"); + goto err_disable_func; + } + + rtwsdio->sdio_func = sdio_func; + + rtwsdio->sdio3_bus_mode = mmc_card_uhs(sdio_func->card); + + sdio_set_drvdata(sdio_func, rtwdev->hw); + SET_IEEE80211_DEV(rtwdev->hw, &sdio_func->dev); + + sdio_release_host(sdio_func); + + return 0; + +err_disable_func: + sdio_disable_func(sdio_func); +err_release_host: + sdio_release_host(sdio_func); + return ret; +} + +static void rtw_sdio_declaim(struct rtw_dev *rtwdev, + struct sdio_func *sdio_func) +{ + sdio_claim_host(sdio_func); + sdio_disable_func(sdio_func); + sdio_release_host(sdio_func); +} + +static struct rtw_hci_ops rtw_sdio_ops = { + .tx_write = rtw_sdio_tx_write, + .tx_kick_off = rtw_sdio_tx_kick_off, + .setup = rtw_sdio_setup, + .start = rtw_sdio_start, + .stop = rtw_sdio_stop, + .deep_ps = rtw_sdio_deep_ps, + .link_ps = rtw_sdio_link_ps, + .interface_cfg = rtw_sdio_interface_cfg, + + .power_switch = rtw_sdio_power_switch, + + .read8 = rtw_sdio_read8, + .read16 = rtw_sdio_read16, + .read32 = rtw_sdio_read32, + .write8 = rtw_sdio_write8, + .write16 = rtw_sdio_write16, + .write32 = rtw_sdio_write32, + .write_data_rsvd_page = rtw_sdio_write_data_rsvd_page, + .write_data_h2c = rtw_sdio_write_data_h2c, +}; + +static int rtw_sdio_request_irq(struct rtw_dev *rtwdev, + struct sdio_func *sdio_func) +{ + int ret; + + sdio_claim_host(sdio_func); + ret = sdio_claim_irq(sdio_func, &rtw_sdio_handle_interrupt); + sdio_release_host(sdio_func); + + if (ret) { + rtw_err(rtwdev, "failed to claim SDIO IRQ"); + return ret; + } + + return 0; +} + +static void rtw_sdio_indicate_tx_status(struct rtw_dev *rtwdev, + struct sk_buff *skb) +{ + struct rtw_sdio_tx_data *tx_data = rtw_sdio_get_tx_data(skb); + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); + struct ieee80211_hw *hw = rtwdev->hw; + + /* enqueue to wait for tx report */ + if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) { + rtw_tx_report_enqueue(rtwdev, skb, tx_data->sn); + return; + } + + /* always ACK for others, then they won't be marked as drop */ + ieee80211_tx_info_clear_status(info); + if (info->flags & IEEE80211_TX_CTL_NO_ACK) + info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED; + else + info->flags |= IEEE80211_TX_STAT_ACK; + + ieee80211_tx_status_irqsafe(hw, skb); +} + +static void rtw_sdio_process_tx_queue(struct rtw_dev *rtwdev, + enum rtw_tx_queue_type queue) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + struct sk_buff *skb; + int ret; + + while (true) { + skb = skb_dequeue(&rtwsdio->tx_queue[queue]); + if (!skb) + break; + + ret = rtw_sdio_write_port(rtwdev, skb, queue); + if (ret) { + skb_queue_head(&rtwsdio->tx_queue[queue], skb); + break; + } + + if (queue <= RTW_TX_QUEUE_VO) + rtw_sdio_indicate_tx_status(rtwdev, skb); + else + dev_kfree_skb_any(skb); + } +} + +static void rtw_sdio_tx_handler(struct work_struct *work) +{ + struct rtw_sdio_work_data *work_data = + container_of(work, struct rtw_sdio_work_data, work); + struct rtw_dev *rtwdev = work_data->rtwdev; + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + bool has_more_tx_data; + int queue; + + if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_TX_WAKE)) + rtw_sdio_deep_ps_leave(rtwdev); + + do { + has_more_tx_data = false; + + for (queue = RTK_MAX_TX_QUEUE_NUM - 1; queue >= 0; queue--) { + rtw_sdio_process_tx_queue(rtwdev, queue); + + if (!skb_queue_empty(&rtwsdio->tx_queue[queue])) + has_more_tx_data = true; + } + } while (has_more_tx_data); +} + +static void rtw_sdio_free_irq(struct rtw_dev *rtwdev, + struct sdio_func *sdio_func) +{ + sdio_release_irq(sdio_func); +} + +static int rtw_sdio_init_tx(struct rtw_dev *rtwdev) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + int i; + + rtwsdio->txwq = create_singlethread_workqueue("rtw88_sdio: tx wq"); + if (!rtwsdio->txwq) { + rtw_err(rtwdev, "failed to create TX work queue\n"); + return -ENOMEM; + } + + for (i = 0; i < RTK_MAX_TX_QUEUE_NUM; i++) + skb_queue_head_init(&rtwsdio->tx_queue[i]); + rtwsdio->tx_handler_data = kmalloc(sizeof(*rtwsdio->tx_handler_data), + GFP_KERNEL); + if (!rtwsdio->tx_handler_data) + goto err_destroy_wq; + + rtwsdio->tx_handler_data->rtwdev = rtwdev; + INIT_WORK(&rtwsdio->tx_handler_data->work, rtw_sdio_tx_handler); + + return 0; + +err_destroy_wq: + destroy_workqueue(rtwsdio->txwq); + return -ENOMEM; +} + +static void rtw_sdio_deinit_tx(struct rtw_dev *rtwdev) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + int i; + + for (i = 0; i < RTK_MAX_TX_QUEUE_NUM; i++) + skb_queue_purge(&rtwsdio->tx_queue[i]); + + flush_workqueue(rtwsdio->txwq); + destroy_workqueue(rtwsdio->txwq); + kfree(rtwsdio->tx_handler_data); +} + +int rtw_sdio_probe(struct sdio_func *sdio_func, + const struct sdio_device_id *id) +{ + struct ieee80211_hw *hw; + struct rtw_dev *rtwdev; + int drv_data_size; + int ret; + + drv_data_size = sizeof(struct rtw_dev) + sizeof(struct rtw_sdio); + hw = ieee80211_alloc_hw(drv_data_size, &rtw_ops); + if (!hw) { + dev_err(&sdio_func->dev, "failed to allocate hw"); + return -ENOMEM; + } + + rtwdev = hw->priv; + rtwdev->hw = hw; + rtwdev->dev = &sdio_func->dev; + rtwdev->chip = (struct rtw_chip_info *)id->driver_data; + rtwdev->hci.ops = &rtw_sdio_ops; + rtwdev->hci.type = RTW_HCI_TYPE_SDIO; + + ret = rtw_core_init(rtwdev); + if (ret) + goto err_release_hw; + + rtw_dbg(rtwdev, RTW_DBG_SDIO, + "rtw88 SDIO probe: vendor=0x%04x device=%04x class=%02x", + id->vendor, id->device, id->class); + + ret = rtw_sdio_claim(rtwdev, sdio_func); + if (ret) { + rtw_err(rtwdev, "failed to claim SDIO device"); + goto err_deinit_core; + } + + rtw_sdio_init(rtwdev); + + ret = rtw_sdio_init_tx(rtwdev); + if (ret) { + rtw_err(rtwdev, "failed to init SDIO TX queue\n"); + goto err_sdio_declaim; + } + + ret = rtw_chip_info_setup(rtwdev); + if (ret) { + rtw_err(rtwdev, "failed to setup chip information"); + goto err_destroy_txwq; + } + + ret = rtw_register_hw(rtwdev, hw); + if (ret) { + rtw_err(rtwdev, "failed to register hw"); + goto err_destroy_txwq; + } + + ret = rtw_sdio_request_irq(rtwdev, sdio_func); + if (ret) + goto err_unregister_hw; + + return 0; + +err_unregister_hw: + rtw_unregister_hw(rtwdev, hw); +err_destroy_txwq: + rtw_sdio_deinit_tx(rtwdev); +err_sdio_declaim: + rtw_sdio_declaim(rtwdev, sdio_func); +err_deinit_core: + rtw_core_deinit(rtwdev); +err_release_hw: + ieee80211_free_hw(hw); + + return ret; +} +EXPORT_SYMBOL(rtw_sdio_probe); + +void rtw_sdio_remove(struct sdio_func *sdio_func) +{ + struct ieee80211_hw *hw = sdio_get_drvdata(sdio_func); + struct rtw_dev *rtwdev; + + if (!hw) + return; + + rtwdev = hw->priv; + + rtw_unregister_hw(rtwdev, hw); + rtw_sdio_disable_interrupt(rtwdev); + rtw_sdio_declaim(rtwdev, sdio_func); + rtw_sdio_free_irq(rtwdev, sdio_func); + rtw_sdio_deinit_tx(rtwdev); + rtw_core_deinit(rtwdev); + ieee80211_free_hw(hw); +} +EXPORT_SYMBOL(rtw_sdio_remove); + +void rtw_sdio_shutdown(struct device *dev) +{ + struct sdio_func *sdio_func = dev_to_sdio_func(dev); + struct ieee80211_hw *hw = sdio_get_drvdata(sdio_func); + const struct rtw_chip_info *chip; + struct rtw_dev *rtwdev; + + if (!hw) + return; + + rtwdev = hw->priv; + chip = rtwdev->chip; + + if (chip->ops->shutdown) + chip->ops->shutdown(rtwdev); +} +EXPORT_SYMBOL(rtw_sdio_shutdown); + +MODULE_AUTHOR("Martin Blumenstingl"); +MODULE_AUTHOR("Jernej Skrabec"); +MODULE_DESCRIPTION("Realtek 802.11ac wireless SDIO driver"); +MODULE_LICENSE("Dual BSD/GPL"); diff --git a/drivers/net/wireless/realtek/rtw88/sdio.h b/drivers/net/wireless/realtek/rtw88/sdio.h new file mode 100644 index 000000000000..7339e35f808a --- /dev/null +++ b/drivers/net/wireless/realtek/rtw88/sdio.h @@ -0,0 +1,175 @@ +/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ +/* Copyright (C) 2021 Martin Blumenstingl + * Copyright (C) 2021 Jernej Skrabec + */ + +#ifndef __REG_SDIO_H_ +#define __REG_SDIO_H_ + +#include "main.h" + +/* I/O bus domain address mapping */ +#define SDIO_LOCAL_OFFSET 0x10250000 +#define WLAN_IOREG_OFFSET 0x10260000 +#define FIRMWARE_FIFO_OFFSET 0x10270000 +#define TX_HIQ_OFFSET 0x10310000 +#define TX_MIQ_OFFSET 0x10320000 +#define TX_LOQ_OFFSET 0x10330000 +#define TX_EPQ_OFFSET 0x10350000 +#define RX_RX0FF_OFFSET 0x10340000 + +#define RTW_SDIO_BUS_MSK 0xffff0000 +#define SDIO_LOCAL_REG_MSK 0x00000fff +#define WLAN_IOREG_REG_MSK 0x0000ffff + +/* SDIO Tx Control */ +#define REG_SDIO_TX_CTRL (SDIO_LOCAL_OFFSET + 0x0000) + +/*SDIO status timeout*/ +#define REG_SDIO_TIMEOUT (SDIO_LOCAL_OFFSET + 0x0002) + +/* SDIO Host Interrupt Mask */ +#define REG_SDIO_HIMR (SDIO_LOCAL_OFFSET + 0x0014) +#define REG_SDIO_HIMR_RX_REQUEST BIT(0) +#define REG_SDIO_HIMR_AVAL BIT(1) +#define REG_SDIO_HIMR_TXERR BIT(2) +#define REG_SDIO_HIMR_RXERR BIT(3) +#define REG_SDIO_HIMR_TXFOVW BIT(4) +#define REG_SDIO_HIMR_RXFOVW BIT(5) +#define REG_SDIO_HIMR_TXBCNOK BIT(6) +#define REG_SDIO_HIMR_TXBCNERR BIT(7) +#define REG_SDIO_HIMR_BCNERLY_INT BIT(16) +#define REG_SDIO_HIMR_C2HCMD BIT(17) +#define REG_SDIO_HIMR_CPWM1 BIT(18) +#define REG_SDIO_HIMR_CPWM2 BIT(19) +#define REG_SDIO_HIMR_HSISR_IND BIT(20) +#define REG_SDIO_HIMR_GTINT3_IND BIT(21) +#define REG_SDIO_HIMR_GTINT4_IND BIT(22) +#define REG_SDIO_HIMR_PSTIMEOUT BIT(23) +#define REG_SDIO_HIMR_OCPINT BIT(24) +#define REG_SDIO_HIMR_ATIMEND BIT(25) +#define REG_SDIO_HIMR_ATIMEND_E BIT(26) +#define REG_SDIO_HIMR_CTWEND BIT(27) +/* the following two are RTL8188 SDIO Specific */ +#define REG_SDIO_HIMR_MCU_ERR BIT(28) +#define REG_SDIO_HIMR_TSF_BIT32_TOGGLE BIT(29) + +/* SDIO Host Interrupt Service Routine */ +#define REG_SDIO_HISR (SDIO_LOCAL_OFFSET + 0x0018) +#define REG_SDIO_HISR_RX_REQUEST BIT(0) +#define REG_SDIO_HISR_AVAL BIT(1) +#define REG_SDIO_HISR_TXERR BIT(2) +#define REG_SDIO_HISR_RXERR BIT(3) +#define REG_SDIO_HISR_TXFOVW BIT(4) +#define REG_SDIO_HISR_RXFOVW BIT(5) +#define REG_SDIO_HISR_TXBCNOK BIT(6) +#define REG_SDIO_HISR_TXBCNERR BIT(7) +#define REG_SDIO_HISR_BCNERLY_INT BIT(16) +#define REG_SDIO_HISR_C2HCMD BIT(17) +#define REG_SDIO_HISR_CPWM1 BIT(18) +#define REG_SDIO_HISR_CPWM2 BIT(19) +#define REG_SDIO_HISR_HSISR_IND BIT(20) +#define REG_SDIO_HISR_GTINT3_IND BIT(21) +#define REG_SDIO_HISR_GTINT4_IND BIT(22) +#define REG_SDIO_HISR_PSTIMEOUT BIT(23) +#define REG_SDIO_HISR_OCPINT BIT(24) +#define REG_SDIO_HISR_ATIMEND BIT(25) +#define REG_SDIO_HISR_ATIMEND_E BIT(26) +#define REG_SDIO_HISR_CTWEND BIT(27) +/* the following two are RTL8188 SDIO Specific */ +#define REG_SDIO_HISR_MCU_ERR BIT(28) +#define REG_SDIO_HISR_TSF_BIT32_TOGGLE BIT(29) + +/* HCI Current Power Mode */ +#define REG_SDIO_HCPWM (SDIO_LOCAL_OFFSET + 0x0019) +/* RXDMA Request Length */ +#define REG_SDIO_RX0_REQ_LEN (SDIO_LOCAL_OFFSET + 0x001C) +/* OQT Free Page */ +#define REG_SDIO_OQT_FREE_PG (SDIO_LOCAL_OFFSET + 0x001E) +/* Free Tx Buffer Page */ +#define REG_SDIO_FREE_TXPG (SDIO_LOCAL_OFFSET + 0x0020) +/* HCI Current Power Mode 1 */ +#define REG_SDIO_HCPWM1 (SDIO_LOCAL_OFFSET + 0x0024) +/* HCI Current Power Mode 2 */ +#define REG_SDIO_HCPWM2 (SDIO_LOCAL_OFFSET + 0x0026) +/* Free Tx Page Sequence */ +#define REG_SDIO_FREE_TXPG_SEQ (SDIO_LOCAL_OFFSET + 0x0028) +/* HTSF Informaion */ +#define REG_SDIO_HTSFR_INFO (SDIO_LOCAL_OFFSET + 0x0030) +#define REG_SDIO_HCPWM1_V2 (SDIO_LOCAL_OFFSET + 0x0038) +/* H2C */ +#define REG_SDIO_H2C (SDIO_LOCAL_OFFSET + 0x0060) +/* HCI Request Power Mode 1 */ +#define REG_SDIO_HRPWM1 (SDIO_LOCAL_OFFSET + 0x0080) +/* HCI Request Power Mode 2 */ +#define REG_SDIO_HRPWM2 (SDIO_LOCAL_OFFSET + 0x0082) +/* HCI Power Save Clock */ +#define REG_SDIO_HPS_CLKR (SDIO_LOCAL_OFFSET + 0x0084) +/* SDIO HCI Suspend Control */ +#define REG_SDIO_HSUS_CTRL (SDIO_LOCAL_OFFSET + 0x0086) +/* SDIO Host Extension Interrupt Mask Always */ +#define REG_SDIO_HIMR_ON (SDIO_LOCAL_OFFSET + 0x0090) +/* SDIO Host Extension Interrupt Status Always */ +#define REG_SDIO_HISR_ON (SDIO_LOCAL_OFFSET + 0x0091) + +#define REG_SDIO_INDIRECT_REG_CFG (SDIO_LOCAL_OFFSET + 0x0040) +#define REG_SDIO_INDIRECT_REG_DATA (SDIO_LOCAL_OFFSET + 0x0044) + +/* Sdio Address for SDIO Local Reg, TRX FIFO, MAC Reg */ +#define REG_SDIO_CMD_ADDR_MSK GENMASK(16, 13) +#define REG_SDIO_CMD_ADDR_SDIO_REG 0 +#define REG_SDIO_CMD_ADDR_MAC_REG 8 +#define REG_SDIO_CMD_ADDR_TXFF_HIGH 4 +#define REG_SDIO_CMD_ADDR_TXFF_LOW 6 +#define REG_SDIO_CMD_ADDR_TXFF_NORMAL 5 +#define REG_SDIO_CMD_ADDR_TXFF_EXTRA 7 +#define REG_SDIO_CMD_ADDR_RXFF 7 + +#define RTW_SDIO_BLOCK_SIZE 512 +#define RTW_SDIO_ADDR_RX_RX0FF_GEN(_id) (0x0e000 | ((_id) & 0x3)) + +#define RTW_SDIO_DATA_PTR_ALIGN 8 + +struct sdio_func; +struct sdio_device_id; + +struct rtw_sdio_tx_data { + u8 sn; +}; + +struct rtw_sdio_work_data { + struct work_struct work; + struct rtw_dev *rtwdev; +}; + +struct rtw_sdio { + struct sdio_func *sdio_func; + + u32 irq_mask; + u8 rx_addr; + bool sdio3_bus_mode; + bool is_powered_on; + + void *irq_thread; + + struct workqueue_struct *txwq; + + struct sk_buff_head tx_queue[RTK_MAX_TX_QUEUE_NUM]; + struct rtw_sdio_work_data *tx_handler_data; +}; + +extern const struct dev_pm_ops rtw_sdio_pm_ops; + +int rtw_sdio_probe(struct sdio_func *sdio_func, + const struct sdio_device_id *id); +void rtw_sdio_remove(struct sdio_func *sdio_func); +void rtw_sdio_shutdown(struct device *dev); + +static inline bool rtw_sdio_is_sdio30_supported(struct rtw_dev *rtwdev) +{ + struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; + + return rtwsdio->sdio3_bus_mode; +} + +#endif -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 094A2C4332F for ; Tue, 27 Dec 2022 23:32:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232775AbiL0Xcf (ORCPT ); Tue, 27 Dec 2022 18:32:35 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58534 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232656AbiL0Xbd (ORCPT ); Tue, 27 Dec 2022 18:31:33 -0500 Received: from mail-ej1-x62e.google.com (mail-ej1-x62e.google.com [IPv6:2a00:1450:4864:20::62e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B53F5E089; Tue, 27 Dec 2022 15:30:50 -0800 (PST) Received: by mail-ej1-x62e.google.com with SMTP id t17so34962909eju.1; Tue, 27 Dec 2022 15:30:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=8GWyz5jQ6a8YBmKbthsrt/fWSXYydYplp8Hp3+tK5/w=; b=lcCjFGVE8jmprid5xwPUJt/k8T5XVelgRoWY/4Sb/g9E6vwPhIpcx3hYj0YrMV8E2w qwHDsqvcSWFhe3kmVzqlJEwNAm9Fa+IPr6RGKFdpezTPgPn+Q/mTb7iyTWcunYNKxOai 5gcXdoIys+5k1lYY1iq77SD51W47gy52SeBndRnPBNzN4vkgIKu+D5MW4MFjeqTTQdl1 td1iDbeDr/Ib7EZoR+IGQ4Q0msQC5EnHMkm7Dt4sZV8n+xs6y8QHS2OYV4SUeoNiJEQk acYkBeu43EwJQ37ReDLjNC5IvILgTY70vUnJg+LaOCATfhwydU/+pJLQwNYD6rtV/NeA UxBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8GWyz5jQ6a8YBmKbthsrt/fWSXYydYplp8Hp3+tK5/w=; b=tBKo6yaHrLL44CdgGIjzH1JiiN9e0xz4ckAnNYimvHAo3r+McSIpsUobCvmRW7Qjis MigzeLFW29X4mbN3ZSyeK68El9DG33FWn3blvRjYEadI8UJO69HxNj0j2NAP4a3aXTVU Cqh79NVqf2aL74HDfOFtnaruD7cOVifJWgpYI1q0ylHM0ljDPLCQ/LtPcnss7VRYjSYg uw8Akv1nF0j/XWM1mm3dxp1IWXG361ye5TerRqTjRBXoTR5srSqyebvxo5QveP+DjJSj 1AHbL/EuBCEE2ma/cEJxZE8LrzayfS1U66eXnJxFiwgEoXLO83v9wgxGrjTmSQ35Aeu5 qtFw== X-Gm-Message-State: AFqh2kqgznQyZMaVecbqM7YWrWRtKz/l2krQ3YBS2CappCwYlNBV4hIW OcxapkhiWHWwvQ+JgS+7B80hlQvNHQI= X-Google-Smtp-Source: AMrXdXug7dD2x+hUREVGCOcXthn322kJQQUzoJL5jtSwDeisAdmc2xP+5VqEg0o4uKCfHh/iHiex/w== X-Received: by 2002:a17:906:12c7:b0:7c1:639:6b42 with SMTP id l7-20020a17090612c700b007c106396b42mr24917114ejb.62.1672183848843; Tue, 27 Dec 2022 15:30:48 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:48 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 14/19] rtw88: main: Add the rpwm_addr and cpwm_addr for SDIO based chipsets Date: Wed, 28 Dec 2022 00:30:15 +0100 Message-Id: <20221227233020.284266-15-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Initialize the rpwm_addr and cpwm_addr for power-saving support on SDIO based chipsets. Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/main.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c index 888427cf3bdf..9435cb43d1dc 100644 --- a/drivers/net/wireless/realtek/rtw88/main.c +++ b/drivers/net/wireless/realtek/rtw88/main.c @@ -18,6 +18,7 @@ #include "debug.h" #include "bf.h" #include "sar.h" +#include "sdio.h" bool rtw_disable_lps_deep_mode; EXPORT_SYMBOL(rtw_disable_lps_deep_mode); @@ -1785,6 +1786,10 @@ static int rtw_chip_parameter_setup(struct rtw_dev *rtwdev) rtwdev->hci.rpwm_addr = 0x03d9; rtwdev->hci.cpwm_addr = 0x03da; break; + case RTW_HCI_TYPE_SDIO: + rtwdev->hci.rpwm_addr = REG_SDIO_HRPWM1; + rtwdev->hci.cpwm_addr = REG_SDIO_HCPWM1_V2; + break; case RTW_HCI_TYPE_USB: rtwdev->hci.rpwm_addr = 0xfe58; rtwdev->hci.cpwm_addr = 0xfe57; -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4477AC46467 for ; Tue, 27 Dec 2022 23:33:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232809AbiL0XdB (ORCPT ); Tue, 27 Dec 2022 18:33:01 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59070 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231468AbiL0XcC (ORCPT ); Tue, 27 Dec 2022 18:32:02 -0500 Received: from mail-ed1-x52c.google.com (mail-ed1-x52c.google.com [IPv6:2a00:1450:4864:20::52c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 821D2E09F; Tue, 27 Dec 2022 15:30:51 -0800 (PST) Received: by mail-ed1-x52c.google.com with SMTP id l29so13818638edj.7; Tue, 27 Dec 2022 15:30:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=McF1AOS6QwVXZqqI+7NbwxhtVPi8mPQbEHxTHJxarjk=; b=FVm188ZTXuV2jmAwc9cBA5aHf7MS1964Wf+mL4JXLleaV3hEMyfyub4njJRtDt2GAW sm69wDymK8e9f4v+CFzRyxLjZhRwBvZlzMmLzgPNH8C/ze8FwseBKbuRU3EeHLxgxazf T6dgtkR7AUrMbjO4C6lEocpFOi3OBKIoBL/3Br6uhbCIpFPkYKx7m6mDipaPrr9+hD6E 10WvwO7HdK4FJPPAIQEgxKRoOQcGvLTK1kurODLlH7IdsI2vLSQ+/Rxc6o+WIYUKGUpX ISX1QwJmt7kSqymq2sC4fH74R/UAuPKUV0IvglBEW1MFbVQfdz+1E1eCgLv+1a8BB8EH hbHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=McF1AOS6QwVXZqqI+7NbwxhtVPi8mPQbEHxTHJxarjk=; b=PvkfwLpzJu0eAmCWe906wBGlqlNTLSHFaOLBBGlDujw6yZ2jAuLzIpJaIZki6Pkkv+ iVyTZRLJx6oLwPsFKB1btgza0SqqYq9gSNYgRrVCdPI+sMnwxc6NsRnCTRPqBRIUiYrU d1LgkXjRCghRdpDhsfPnKGHQovB+/Y+Jgjf5P9bdlLo+hTUkhaPKbotsdK9d4rud1YjF q0bFfNHI5AITOHFI99yxK9Jiy8a0RFj128XTtiDkCo29FGWkdkzFl1EJxwi4yfBhvN7A qrG/lYLBPOmKB/1mkrhVAk4uMCSdLKlY6UNLMLT+JUC5ecBs0ezhFzGTw0e9bbhO7+bj csPw== X-Gm-Message-State: AFqh2kq6yZEtlIAYy+vnbzVJcE8v+ltU3PWCpKyxKN2tt3BOrWoEEKcQ XYriQcU/xBBD+wFoBYJBpaa8bTFu9A0= X-Google-Smtp-Source: AMrXdXt418wFHFd2OaJxi+aMmLUL2V901glOQf0Al75txCCmR4Br+zSfiZKNF2o0LDfOOiKtsLMx7A== X-Received: by 2002:a05:6402:220e:b0:483:a6d8:7ad with SMTP id cq14-20020a056402220e00b00483a6d807admr9248193edb.24.1672183849761; Tue, 27 Dec 2022 15:30:49 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:49 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 15/19] rtw88: main: Reserve 8 bytes of extra TX headroom for SDIO based cards Date: Wed, 28 Dec 2022 00:30:16 +0100 Message-Id: <20221227233020.284266-16-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org For SDIO host controllers with DMA support the TX buffer physical memory address need to be aligned at an 8-byte boundary. Reserve 8 bytes of extra TX headroom so we can align the data without re-allocating the transmit buffer. While here, also remove the TODO comment regarding extra headroom for USB and SDIO. For SDIO the extra headroom is now handled and for USB it was not needed so far. Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c index 9435cb43d1dc..bcdf1f8c8450 100644 --- a/drivers/net/wireless/realtek/rtw88/main.c +++ b/drivers/net/wireless/realtek/rtw88/main.c @@ -2163,9 +2163,11 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw) int max_tx_headroom = 0; int ret; - /* TODO: USB & SDIO may need extra room? */ max_tx_headroom = rtwdev->chip->tx_pkt_desc_sz; + if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) + max_tx_headroom += RTW_SDIO_DATA_PTR_ALIGN; + hw->extra_tx_headroom = max_tx_headroom; hw->queues = IEEE80211_NUM_ACS; hw->txq_data_size = sizeof(struct rtw_txq); -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 25937C4332F for ; Tue, 27 Dec 2022 23:33:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232822AbiL0XdE (ORCPT ); Tue, 27 Dec 2022 18:33:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58242 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232616AbiL0XcD (ORCPT ); Tue, 27 Dec 2022 18:32:03 -0500 Received: from mail-ej1-x62f.google.com (mail-ej1-x62f.google.com [IPv6:2a00:1450:4864:20::62f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DDC5CE0AF; Tue, 27 Dec 2022 15:30:52 -0800 (PST) Received: by mail-ej1-x62f.google.com with SMTP id gh17so35004617ejb.6; Tue, 27 Dec 2022 15:30:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gsQ0bP6BbS+zASV2taW+Oh7StcznrMy09XYCXA0KW+c=; b=NvGtg2ABeuuiTlqb5FE0HvyVQ0jFplGTmISwJyB2VnsbuhiblM6W0RIICSKs7m74Cx SYl0hzKURLDfTg0yekw3VCxY8TbWw4E3KhfTgHeIBGORJzTbqgPe6aMSgMRAa/2EB0M3 jT4LJL3dINLOJeSQAWa+TBiJI9YrBJASmHxD3pkbFPFVzNQ6NgUM9MI6uO3pX0TOFnG0 T7QukZMuX4NL+HZxfJgqfeuC+1pGWiUqY/QP3s3hBeWlYIiqm6ttWad9ndPIL51AMuYl WxTVj5njQ4NFWyeuqwS1ZZvUpqk5CcTWuGkvTPCGkBQVHJH7bVh6yU0e9O34i9C/BOK8 CVYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gsQ0bP6BbS+zASV2taW+Oh7StcznrMy09XYCXA0KW+c=; b=0KbfEtg8SyxKDU3Q/3MDYViYHMEGdHXmShvE3KwZi9anuc6Je5k5T26o9vs52hkmgN iIh3EYs23WBzGu1NodYdak+HVFzdHJbmfPctm9bszMI3kOLPrl4L5qXFuOPWFxlMuLkq eBebU8IanMufT3hZbFODt9oJQQeJDdKK5Ce0D9eUe8r3K1t39Ti9loHGsRXo9T+QEhWT 10CUfNYqNTyHKyMu6wYIt2iNbEN3vmN6suKC9P5d+YqI8Znz2DWiLcCCyPv5CR8S2ubn gWs4r9jGVXlnoEeYGBfsxRJ+u2GghcbibDtzbHnBkBNHjh9IThCywKnjZyZouMcuZOAJ rUqA== X-Gm-Message-State: AFqh2kpBL/KfX3PPwNo1M6w1DnoZ/aqA5XRLneEORjMXwqAP5LD7YwC/ rr5RHr+OcLCqCJxub3cw7NpNkPBHFK8= X-Google-Smtp-Source: AMrXdXsMcWgwvN1YMuKb2k+2XZqBjjIy7sgzVZekfewiRxr8Kydi1JdIAinH342GnFDQZYHMPn/ntg== X-Received: by 2002:a17:907:93c5:b0:7c0:f118:624b with SMTP id cp5-20020a17090793c500b007c0f118624bmr17580205ejc.44.1672183850737; Tue, 27 Dec 2022 15:30:50 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:50 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 16/19] rtw88: ps: Increase LEAVE_LPS_TRY_CNT for SDIO based chipsets Date: Wed, 28 Dec 2022 00:30:17 +0100 Message-Id: <20221227233020.284266-17-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: Jernej Skrabec Increase LEAVE_LPS_TRY_CNT to give SDIO based chipsets more time to enter or leave deep sleep mode. SDIO communication is often slower than PCIe transfers so extra time is needed. Signed-off-by: Jernej Skrabec Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/ps.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw88/ps.h b/drivers/net/wireless/realtek/rtw88/ps.h index c194386f6db5..b79bef32b169 100644 --- a/drivers/net/wireless/realtek/rtw88/ps.h +++ b/drivers/net/wireless/realtek/rtw88/ps.h @@ -12,7 +12,7 @@ #define POWER_TX_WAKE BIT(1) #define POWER_MODE_LCLK BIT(0) -#define LEAVE_LPS_TRY_CNT 5 +#define LEAVE_LPS_TRY_CNT 10 #define LEAVE_LPS_TIMEOUT msecs_to_jiffies(100) int rtw_enter_ips(struct rtw_dev *rtwdev); -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 765A5C4708D for ; Tue, 27 Dec 2022 23:33:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232840AbiL0XdL (ORCPT ); Tue, 27 Dec 2022 18:33:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59170 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232621AbiL0XcI (ORCPT ); Tue, 27 Dec 2022 18:32:08 -0500 Received: from mail-ej1-x630.google.com (mail-ej1-x630.google.com [IPv6:2a00:1450:4864:20::630]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 04BB8E0BB; Tue, 27 Dec 2022 15:30:53 -0800 (PST) Received: by mail-ej1-x630.google.com with SMTP id tz12so34949170ejc.9; Tue, 27 Dec 2022 15:30:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rjqRO1hM2WmR8bA3fNj6YB7tA/88HOJsev0FI6+d5o4=; b=E5TP2oHD4qYQBRZ3fSmijhSgxo7LL4r39JXIVaSU46brUJtEIqhXAstiIc6OFIPzj0 TcKm2PjQM3b87w2YqT8KAWmSLjrQ6S0gPKC9u6WOFwoPcLWPlrDFu9EzZR+81dA1MfE3 Fq4bzgdheiOW3o91ebfYV/NTHoMcX5Pu1ldl8w+SJqIFzhXa50OZzeIB79STcHBEqDjv KRUyp4trCgjAEOyXVRhfkDDXn+Ks1AxKJrMK2QsoWBdQWQnCe7doaGiGH9GyGyoeTkOO CEV4quxrQE8FDF1UQF+eRZp26lV07Y5/QnNx7y6lQivJOkKLrwmHW7YmJeETQTnugMc+ xYJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rjqRO1hM2WmR8bA3fNj6YB7tA/88HOJsev0FI6+d5o4=; b=PAjOirfryuzxDkGHpzcvrNm+jY2MxgHihDO2SeIhR3RhSKS9VQyELZWsk+99RTcA59 2Cmr99gvyL5B2b9attLObyMZp94b2Zv+3C1x09lAMdl6SqI8evax1n6gC+Zx70RglebA GpwsX4wHi1VpiyraP+ozrq/eaEMWNXJCWt5DgueE/ugGQFygPsqSDlV+U5AVEassmrSW /ElASeffnvAYQ4ueOp7/nzfPsO/EZoopea2PmXapk+Y0vS7UoqYvY9RkQxil9AA036+O nWTXHrtTQ2PytpTRlE3sUH8rgftrMgYg1mRvo5hEGTXpP2Pw9uE/qhelXy2NeerCJe7o rbOg== X-Gm-Message-State: AFqh2kobiCLr5ll8b7aiOy8GoC27iI08S31tiBLL0143DyZL9o5FpB9H HS3jbGW+hKzj8ojuH7Jsel6xDWuf6fo= X-Google-Smtp-Source: AMrXdXsH0QZPD9s61Gke/d76O1N2kd/8pnWaqz1O+hj7ZO9+3bBQmojwGolERxfXNgb0f9/JAGbQ5w== X-Received: by 2002:a17:907:6d0c:b0:7c1:652:d109 with SMTP id sa12-20020a1709076d0c00b007c10652d109mr22218951ejc.35.1672183851755; Tue, 27 Dec 2022 15:30:51 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:51 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 17/19] rtw88: Add support for the SDIO based RTL8822BS chipset Date: Wed, 28 Dec 2022 00:30:18 +0100 Message-Id: <20221227233020.284266-18-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: Jernej Skrabec Wire up RTL8822BS chipset support using the new rtw88 SDIO HCI code as well as the existing RTL8822B chipset code. Signed-off-by: Jernej Skrabec Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/Kconfig | 11 ++++++ drivers/net/wireless/realtek/rtw88/Makefile | 3 ++ .../net/wireless/realtek/rtw88/rtw8822bs.c | 34 +++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822bs.c diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig index cdf9cb478ee2..0cfc68dcc416 100644 --- a/drivers/net/wireless/realtek/rtw88/Kconfig +++ b/drivers/net/wireless/realtek/rtw88/Kconfig @@ -45,6 +45,17 @@ config RTW88_8822BE 802.11ac PCIe wireless network adapter +config RTW88_8822BS + tristate "Realtek 8822BS SDIO wireless network adapter" + depends on MMC + select RTW88_CORE + select RTW88_SDIO + select RTW88_8822B + help + Select this option will enable support for 8822BS chipset + + 802.11ac SDIO wireless network adapter + config RTW88_8822BU tristate "Realtek 8822BU USB wireless network adapter" depends on USB diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile index 892cad60ba31..2b8f4dd9707f 100644 --- a/drivers/net/wireless/realtek/rtw88/Makefile +++ b/drivers/net/wireless/realtek/rtw88/Makefile @@ -26,6 +26,9 @@ rtw88_8822b-objs := rtw8822b.o rtw8822b_table.o obj-$(CONFIG_RTW88_8822BE) += rtw88_8822be.o rtw88_8822be-objs := rtw8822be.o +obj-$(CONFIG_RTW88_8822BS) += rtw88_8822bs.o +rtw88_8822bs-objs := rtw8822bs.o + obj-$(CONFIG_RTW88_8822BU) += rtw88_8822bu.o rtw88_8822bu-objs := rtw8822bu.o diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822bs.c b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c new file mode 100644 index 000000000000..4c74ad2d2e5e --- /dev/null +++ b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +// Copyright(c) Jernej Skrabec + +#include +#include +#include +#include "sdio.h" +#include "rtw8822b.h" + +static const struct sdio_device_id rtw_8822bs_id_table[] = { + { + SDIO_DEVICE(SDIO_VENDOR_ID_REALTEK, + SDIO_DEVICE_ID_REALTEK_RTW8822BS), + .driver_data = (kernel_ulong_t)&rtw8822b_hw_spec, + }, + {} +}; +MODULE_DEVICE_TABLE(sdio, rtw_8822bs_id_table); + +static struct sdio_driver rtw_8822bs_driver = { + .name = "rtw_8822bs", + .probe = rtw_sdio_probe, + .remove = rtw_sdio_remove, + .id_table = rtw_8822bs_id_table, + .drv = { + .pm = &rtw_sdio_pm_ops, + .shutdown = rtw_sdio_shutdown, + } +}; +module_sdio_driver(rtw_8822bs_driver); + +MODULE_AUTHOR("Jernej Skrabec "); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822bs driver"); +MODULE_LICENSE("Dual BSD/GPL"); -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4A3ADC4708D for ; Tue, 27 Dec 2022 23:33:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232850AbiL0Xdi (ORCPT ); Tue, 27 Dec 2022 18:33:38 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58488 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232720AbiL0Xc1 (ORCPT ); Tue, 27 Dec 2022 18:32:27 -0500 Received: from mail-ed1-x52a.google.com (mail-ed1-x52a.google.com [IPv6:2a00:1450:4864:20::52a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 61B85E0D7; Tue, 27 Dec 2022 15:30:54 -0800 (PST) Received: by mail-ed1-x52a.google.com with SMTP id m21so20871685edc.3; Tue, 27 Dec 2022 15:30:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=TkWht2yLW1tGoXrbVkq+ldlAYVXsEoXS4p1SnmxgLa8=; b=ZiriEed9I3WRaJMRtKe86e/jk6AAyzctAFRQypbcsjHumMGY5Hw2LAvRKPVWY6t8U8 lcYIU3JCxmtH3P9ejpISD/yiKKdCKrMGzm7MgvZNvACyQ/IOXCDCr8iHlEJIVGoFv++p yghQsza97xnHpd5Z/fC7ZMMko1/+rKe6GAnib/LZIj3Zc5p0/YYkVQYVg+XyYbT03p4c v0Rg6X7keFfBqc97wAOxp9RsN/OcUQ3XjTH6waKcWHIZYXba46BSyDyZTsIeFzzbJcZ0 Ua9l18g66CKIKG3Qds/fxEDgPqYBdlEK3UpO7nZb5degjTpr/n4dx3sJXbkTFQeJ5fC2 U/8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TkWht2yLW1tGoXrbVkq+ldlAYVXsEoXS4p1SnmxgLa8=; b=hDhASs7jtxIud9UPJgxJxpnwLiPiFw/DXFGUQ1LngGjzDxUkgb4jFiT2pirAVPe5RL nNbSGsgVxuT9Q9dsFz/T6SPodmtD2O5hyAHNRx1E2heeWr8yj+iHI7AICLAOTq6jmoxC hWmvH2q1V1neDAsZPNPqpBtcUh+RlRUP/UTSgYD/inPAC8qWC0Ds9kyi2a0Rx/3ezhAf SVsJC9BCWfPwoghCpIGRtaFfoO678tU8oiuhbCF/vkb1oyw/FyX7FNU/4Bhd93PgkY/0 tcw40CM+ZSGd3EQVlie4ZNHuYppywKPgNqd4HRzavzD1vKn4BEy6Z8vVIfVKJ2tRm01C DjeA== X-Gm-Message-State: AFqh2kqhiXgqvjv4BWUGitGBWDHc6O2+O+TzXEj7risWnAAR+i4HcZwm S6uGjqz7FRqckWeiyQcC7N2QsBaZNyo= X-Google-Smtp-Source: AMrXdXtqMomD1AYMVjv53V+sPRjBXDm52IoCAQVKs6DsvUau/rII4ajhWxNdNNJZTvB+9FONKtVr4A== X-Received: by 2002:a05:6402:12d4:b0:461:6219:4b16 with SMTP id k20-20020a05640212d400b0046162194b16mr19942317edx.33.1672183852522; Tue, 27 Dec 2022 15:30:52 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:52 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 18/19] rtw88: Add support for the SDIO based RTL8822CS chipset Date: Wed, 28 Dec 2022 00:30:19 +0100 Message-Id: <20221227233020.284266-19-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Wire up RTL8822CS chipset support using the new rtw88 SDIO HCI code as well as the existing RTL8822C chipset code. Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/Kconfig | 11 ++++++ drivers/net/wireless/realtek/rtw88/Makefile | 3 ++ .../net/wireless/realtek/rtw88/rtw8822cs.c | 34 +++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822cs.c diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig index 0cfc68dcc416..6b65da81127f 100644 --- a/drivers/net/wireless/realtek/rtw88/Kconfig +++ b/drivers/net/wireless/realtek/rtw88/Kconfig @@ -78,6 +78,17 @@ config RTW88_8822CE 802.11ac PCIe wireless network adapter +config RTW88_8822CS + tristate "Realtek 8822CS SDIO wireless network adapter" + depends on MMC + select RTW88_CORE + select RTW88_SDIO + select RTW88_8822C + help + Select this option will enable support for 8822CS chipset + + 802.11ac SDIO wireless network adapter + config RTW88_8822CU tristate "Realtek 8822CU USB wireless network adapter" depends on USB diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile index 2b8f4dd9707f..6105c2745bda 100644 --- a/drivers/net/wireless/realtek/rtw88/Makefile +++ b/drivers/net/wireless/realtek/rtw88/Makefile @@ -38,6 +38,9 @@ rtw88_8822c-objs := rtw8822c.o rtw8822c_table.o obj-$(CONFIG_RTW88_8822CE) += rtw88_8822ce.o rtw88_8822ce-objs := rtw8822ce.o +obj-$(CONFIG_RTW88_8822CS) += rtw88_8822cs.o +rtw88_8822cs-objs := rtw8822cs.o + obj-$(CONFIG_RTW88_8822CU) += rtw88_8822cu.o rtw88_8822cu-objs := rtw8822cu.o diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822cs.c b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c new file mode 100644 index 000000000000..3d7279d70aa9 --- /dev/null +++ b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +// Copyright(c) Martin Blumenstingl + +#include +#include +#include +#include "sdio.h" +#include "rtw8822c.h" + +static const struct sdio_device_id rtw_8822cs_id_table[] = { + { + SDIO_DEVICE(SDIO_VENDOR_ID_REALTEK, + SDIO_DEVICE_ID_REALTEK_RTW8822CS), + .driver_data = (kernel_ulong_t)&rtw8822c_hw_spec, + }, + {} +}; +MODULE_DEVICE_TABLE(sdio, rtw_8822cs_id_table); + +static struct sdio_driver rtw_8822cs_driver = { + .name = "rtw_8822cs", + .probe = rtw_sdio_probe, + .remove = rtw_sdio_remove, + .id_table = rtw_8822cs_id_table, + .drv = { + .pm = &rtw_sdio_pm_ops, + .shutdown = rtw_sdio_shutdown, + } +}; +module_sdio_driver(rtw_8822cs_driver); + +MODULE_AUTHOR("Martin Blumenstingl "); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822cs driver"); +MODULE_LICENSE("Dual BSD/GPL"); -- 2.39.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 724D4C46467 for ; Tue, 27 Dec 2022 23:33:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232871AbiL0Xdm (ORCPT ); Tue, 27 Dec 2022 18:33:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57786 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232738AbiL0Xc3 (ORCPT ); Tue, 27 Dec 2022 18:32:29 -0500 Received: from mail-ej1-x631.google.com (mail-ej1-x631.google.com [IPv6:2a00:1450:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C9750EE10; Tue, 27 Dec 2022 15:30:55 -0800 (PST) Received: by mail-ej1-x631.google.com with SMTP id vm8so28079904ejc.2; Tue, 27 Dec 2022 15:30:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5AaBWOz6R05ieMR55ZX/qfxc7kxYQIr83caCYQIdZus=; b=OT5WMy9MXt3DOYfq3J7NDT2QccCBOtwhk3EFywa2zk7PnToDkIVzcaKsO9l69DtElG +mkgSwIDU8YdwUMOge9xCu3thxgF3daUp1u9dKkNC4bCyl7nP1I6bMh+Dw4mYTN6g7t2 f9+311qoArRgwYOnmzh+4zOzH/x1SGjP/qrHylxHZ5S/+X/XElb56sc6kSvxKnKMc/L9 NfbQS5DRXbbHLpxLewXny1HpO3Xpt3bqvGd3gtqRirbJ9SLGIdL0nF3Azvo8wmXIHkif t9O1b7qnNLMLKu0cw43wgXhbiV72PVsC0IHD9L2jpE1SfPNiHeF1+k0UGRImNoGbFu/T J5ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=5AaBWOz6R05ieMR55ZX/qfxc7kxYQIr83caCYQIdZus=; b=tC94sjVPyPLBDEbDrJuj18IasmHZvvjJq9ZhdOop5YTqWuUu+loPcHj+g2NSUQNVwj Lxw1S/13LrW5zhYZHTXq8iJnW6qIJmFePFlyh0+t+N9ghvVefkA0v3Rp0Aw0R4lvl0+D aP0Io8A4MvZkDJJDBMcU1GWPZD+zKZbsdpdjKnqtr0joIHVvqutIxjNaQvNDSMZKYHYz C+JFyxnHhNuE4BuPe/bjoRmh8mtpdYqm9PhspRkN7qMVa98rgc7fJgvyXQiXCCQTV+Ei iwr+IBP4BRF8TsitWPtxQVPZTEogwmjrPBhvan2jl03UZ08NuTE7Qpt9NtpN5pfZoIeZ AxMg== X-Gm-Message-State: AFqh2krOdmXtpx4JJmMEPG48l9aoWY1sDOsm4zqszFKiDNXByhcj+Inw zXr12xKktxisyzocHVdLoJXuNuwrxTo= X-Google-Smtp-Source: AMrXdXvwz3GwTcCXjYIjOMdJ1PkM7hwikq8jAcu58QKAK9t2aunLIrzVkZObcJP4vQa1kLd9N3Nsyw== X-Received: by 2002:a17:907:b9d5:b0:7c1:f6c:dd4e with SMTP id xa21-20020a170907b9d500b007c10f6cdd4emr19583149ejc.40.1672183853344; Tue, 27 Dec 2022 15:30:53 -0800 (PST) Received: from localhost.localdomain (dynamic-2a01-0c23-c4cf-d900-0000-0000-0000-0e63.c23.pool.telefonica.de. [2a01:c23:c4cf:d900::e63]) by smtp.googlemail.com with ESMTPSA id r7-20020aa7c147000000b0046cbcc86bdesm6489978edp.7.2022.12.27.15.30.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Dec 2022 15:30:53 -0800 (PST) From: Martin Blumenstingl To: linux-wireless@vger.kernel.org Cc: Yan-Hsuan Chuang , Kalle Valo , Ulf Hansson , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-mmc@vger.kernel.org, Chris Morgan , Nitin Gupta , Neo Jou , Pkshih , Jernej Skrabec , Martin Blumenstingl Subject: [RFC PATCH v1 19/19] rtw88: Add support for the SDIO based RTL8821CS chipset Date: Wed, 28 Dec 2022 00:30:20 +0100 Message-Id: <20221227233020.284266-20-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> References: <20221227233020.284266-1-martin.blumenstingl@googlemail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Wire up RTL8821CS chipset support using the new rtw88 SDIO HCI code as well as the existing RTL8821C chipset code. Signed-off-by: Martin Blumenstingl --- drivers/net/wireless/realtek/rtw88/Kconfig | 11 ++++++ drivers/net/wireless/realtek/rtw88/Makefile | 3 ++ .../net/wireless/realtek/rtw88/rtw8821cs.c | 34 +++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8821cs.c diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig index 6b65da81127f..29eb2f8e0eb7 100644 --- a/drivers/net/wireless/realtek/rtw88/Kconfig +++ b/drivers/net/wireless/realtek/rtw88/Kconfig @@ -133,6 +133,17 @@ config RTW88_8821CE 802.11ac PCIe wireless network adapter +config RTW88_8821CS + tristate "Realtek 8821CS SDIO wireless network adapter" + depends on MMC + select RTW88_CORE + select RTW88_SDIO + select RTW88_8821C + help + Select this option will enable support for 8821CS chipset + + 802.11ac SDIO wireless network adapter + config RTW88_8821CU tristate "Realtek 8821CU USB wireless network adapter" depends on USB diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile index 6105c2745bda..82979b30ae8d 100644 --- a/drivers/net/wireless/realtek/rtw88/Makefile +++ b/drivers/net/wireless/realtek/rtw88/Makefile @@ -59,6 +59,9 @@ rtw88_8821c-objs := rtw8821c.o rtw8821c_table.o obj-$(CONFIG_RTW88_8821CE) += rtw88_8821ce.o rtw88_8821ce-objs := rtw8821ce.o +obj-$(CONFIG_RTW88_8821CS) += rtw88_8821cs.o +rtw88_8821cs-objs := rtw8821cs.o + obj-$(CONFIG_RTW88_8821CU) += rtw88_8821cu.o rtw88_8821cu-objs := rtw8821cu.o diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821cs.c b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c new file mode 100644 index 000000000000..61f82b38cda4 --- /dev/null +++ b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +// Copyright(c) Martin Blumenstingl + +#include +#include +#include +#include "sdio.h" +#include "rtw8821c.h" + +static const struct sdio_device_id rtw_8821cs_id_table[] = { + { + SDIO_DEVICE(SDIO_VENDOR_ID_REALTEK, + SDIO_DEVICE_ID_REALTEK_RTW8821CS), + .driver_data = (kernel_ulong_t)&rtw8821c_hw_spec, + }, + {} +}; +MODULE_DEVICE_TABLE(sdio, rtw_8821cs_id_table); + +static struct sdio_driver rtw_8821cs_driver = { + .name = "rtw_8821cs", + .probe = rtw_sdio_probe, + .remove = rtw_sdio_remove, + .id_table = rtw_8821cs_id_table, + .drv = { + .pm = &rtw_sdio_pm_ops, + .shutdown = rtw_sdio_shutdown, + } +}; +module_sdio_driver(rtw_8821cs_driver); + +MODULE_AUTHOR("Martin Blumenstingl "); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821cs driver"); +MODULE_LICENSE("Dual BSD/GPL"); -- 2.39.0 ================================================ FILE: packages/linux/patches/default/linux-150-dev_input_xpad_add_8bitdo_pro_2_wired_controller_support.patch ================================================ From git@z Thu Jan 1 00:00:00 1970 Subject: [PATCH] Input: xpad - add 8BitDo Pro 2 Wired Controller support From: John Butler Date: Tue, 24 Jan 2023 00:52:06 +0000 Message-Id: <20230124005206.80706-1-radon86dev@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Add VID and PID to the xpad_device table to allow driver to use the 8BitDo Pro 2 Wired Controller, which is XTYPE_XBOX360 compatible by default. Signed-off-by: John Butler Cc: linux-input@vger.kernel.org Reviewed-by: Mattijs Korpershoek --- drivers/input/joystick/xpad.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index 2959d80f7fdb..f642ec8e92dd 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c @@ -359,6 +359,7 @@ static const struct xpad_device { { 0x24c6, 0xfafe, "Rock Candy Gamepad for Xbox 360", 0, XTYPE_XBOX360 }, { 0x2563, 0x058d, "OneXPlayer Gamepad", 0, XTYPE_XBOX360 }, { 0x2dc8, 0x2000, "8BitDo Pro 2 Wired Controller fox Xbox", 0, XTYPE_XBOXONE }, + { 0x2dc8, 0x3106, "8BitDo Pro 2 Wired Controller", 0, XTYPE_XBOX360 }, { 0x31e3, 0x1100, "Wooting One", 0, XTYPE_XBOX360 }, { 0x31e3, 0x1200, "Wooting Two", 0, XTYPE_XBOX360 }, { 0x31e3, 0x1210, "Wooting Lekker", 0, XTYPE_XBOX360 }, @@ -492,6 +493,7 @@ static const struct usb_device_id xpad_table[] = { XPAD_XBOXONE_VENDOR(0x24c6), /* PowerA Controllers */ XPAD_XBOX360_VENDOR(0x2563), /* OneXPlayer Gamepad */ XPAD_XBOX360_VENDOR(0x260d), /* Dareu H101 */ + XPAD_XBOX360_VENDOR(0x2dc8), /* 8BitDo Pro 2 Wired Controller */ XPAD_XBOXONE_VENDOR(0x2dc8), /* 8BitDo Pro 2 Wired Controller for Xbox */ XPAD_XBOXONE_VENDOR(0x2e24), /* Hyperkin Duke X-Box One pad */ XPAD_XBOX360_VENDOR(0x2f24), /* GameSir Controllers */ -- 2.39.1 ================================================ FILE: packages/linux/patches/default/linux-999-no-lzma-in-x86-perf-build.patch ================================================ diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config index 0294bfb6c5f8..153036bbed7e 100644 --- a/tools/perf/Makefile.config +++ b/tools/perf/Makefile.config @@ -35,7 +35,7 @@ ifeq ($(SRCARCH),x86) ifeq (${IS_64_BIT}, 1) CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT -DHAVE_SYSCALL_TABLE -I$(OUTPUT)arch/x86/include/generated ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S - LIBUNWIND_LIBS = -lunwind-x86_64 -lunwind -llzma + LIBUNWIND_LIBS = -lunwind-x86_64 -lunwind $(call detected,CONFIG_X86_64) else LIBUNWIND_LIBS = -lunwind-x86 -llzma -lunwind ================================================ FILE: packages/linux/patches/default/linux-999.02-0001-pm-disable-async-suspend-resume-by-default.patch ================================================ From c314d9af9d774c052bea324e1a140ccdba0ca070 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 8 Apr 2014 14:02:53 +0300 Subject: [PATCH] pm: disable async suspend/resume by default --- kernel/power/main.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/kernel/power/main.c b/kernel/power/main.c index 1d1bf63..361db93 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c @@ -46,7 +46,7 @@ int pm_notifier_call_chain(unsigned long val) } /* If set, devices may be suspended and resumed asynchronously. */ -int pm_async_enabled = 1; +int pm_async_enabled = 0; static ssize_t pm_async_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) -- 1.7.2.5 ================================================ FILE: packages/linux/patches/raspberrypi/linux-051-ouya_controller_support.patch ================================================ commit 5a596921a4636e62843a59b7eab7b87b70a6d296 Author: Lukas Rusak Date: Sun May 6 22:03:11 2018 -0700 HID: add ouya HID driver This driver is a simple implementation to get the controller working and mapped properly. This driver does not include functionality for the touchpad (yet). The original driver was taken from from the ouya linux tree and has been simplified. It seems there may have been other versions of the controller present that had a broken report descriptor. I have removed that for now. diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 60252fd796f6..6be2c454e72e 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig @@ -659,6 +659,12 @@ config HID_ORTEK - Ortek WKB-2000 - Skycable wireless presenter +config HID_OUYA + tristate "OUYA Game Controller" + depends on USB_HID + help + Support for OUYA Game Controller. + config HID_PANTHERLORD tristate "Pantherlord/GreenAsia game controller" depends on HID diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile index 17a8bd97da9d..4425890934e4 100644 --- a/drivers/hid/Makefile +++ b/drivers/hid/Makefile @@ -71,6 +71,7 @@ obj-$(CONFIG_HID_MULTITOUCH) += hid-multitouch.o obj-$(CONFIG_HID_NTI) += hid-nti.o obj-$(CONFIG_HID_NTRIG) += hid-ntrig.o obj-$(CONFIG_HID_ORTEK) += hid-ortek.o +obj-$(CONFIG_HID_OUYA) += hid-ouya.o obj-$(CONFIG_HID_PRODIKEYS) += hid-prodikeys.o obj-$(CONFIG_HID_PANTHERLORD) += hid-pl.o obj-$(CONFIG_HID_PENMOUNT) += hid-penmount.o diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 0b5cc910f62e..0528efb825fa 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -859,6 +859,9 @@ #define USB_DEVICE_ID_ORTEK_WKB2000 0x2000 #define USB_DEVICE_ID_ORTEK_IHOME_IMAC_A210S 0x8003 +#define USB_VENDOR_ID_OUYA 0x2836 +#define USB_DEVICE_ID_OUYA_CONTROLLER 0x0001 + #define USB_VENDOR_ID_PLANTRONICS 0x047f #define USB_VENDOR_ID_PANASONIC 0x04da diff --git a/drivers/hid/hid-ouya.c b/drivers/hid/hid-ouya.c new file mode 100644 index 000000000000..4344a47b40af --- /dev/null +++ b/drivers/hid/hid-ouya.c @@ -0,0 +1,131 @@ +/* + * HID driver for OUYA Game Controller(s) + * + * Copyright (c) 2013 OUYA + * Copyright (c) 2013 Gregorios Leach + * Copyright (c) 2018 Lukas Rusak + */ + +#include +#include +#include +#include + +#include "hid-ids.h" + +static const unsigned int ouya_absmap[] = { + [0x30] = ABS_X, /* left stick X */ + [0x31] = ABS_Y, /* left stick Y */ + [0x32] = ABS_Z, /* L2 */ + [0x33] = ABS_RX, /* right stick X */ + [0x34] = ABS_RY, /* right stick Y */ + [0x35] = ABS_RZ, /* R2 */ +}; + +static const unsigned int ouya_keymap[] = { + [0x1] = BTN_SOUTH, /* O */ + [0x2] = BTN_WEST, /* U */ + [0x3] = BTN_NORTH, /* Y */ + [0x4] = BTN_EAST, /* A */ + [0x5] = BTN_TL, /* L1 */ + [0x6] = BTN_TR, /* R1 */ + [0x7] = BTN_THUMBL, /* L3 */ + [0x8] = BTN_THUMBR, /* R3 */ + [0x9] = BTN_DPAD_UP, /* Up */ + [0xa] = BTN_DPAD_DOWN, /* Down */ + [0xb] = BTN_DPAD_LEFT, /* Left */ + [0xc] = BTN_DPAD_RIGHT, /* Right */ + [0xd] = BTN_TL2, /* L2 */ + [0xe] = BTN_TR2, /* R2 */ + [0xf] = BTN_MODE, /* Power */ +}; + +static int ouya_input_mapping(struct hid_device *hdev, struct hid_input *hi, + struct hid_field *field, struct hid_usage *usage, + unsigned long **bit, int *max) +{ + if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) { + unsigned int key = usage->hid & HID_USAGE; + + if (key >= ARRAY_SIZE(ouya_keymap)) + return -1; + + key = ouya_keymap[key]; + hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key); + + return 1; + + } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) { + unsigned int abs = usage->hid & HID_USAGE; + + if (abs >= ARRAY_SIZE(ouya_absmap)) + return -1; + + abs = ouya_absmap[abs]; + hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs); + + return 1; + } + + return 0; +} + +static int ouya_probe(struct hid_device *hdev, const struct hid_device_id *id) +{ + int ret; + + ret = hid_parse(hdev); + if (ret) { + hid_err(hdev, "parse failed\n"); + goto err_free; + } + + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT | HID_CONNECT_HIDDEV_FORCE); + if (ret) { + hid_err(hdev, "hw start failed\n"); + goto err_free; + } + + return 0; + +err_free: + return ret; +} + +static void ouya_remove(struct hid_device *hdev) +{ + hid_hw_stop(hdev); + kfree(hid_get_drvdata(hdev)); +} + +static const struct hid_device_id ouya_devices[] = { + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_OUYA, USB_DEVICE_ID_OUYA_CONTROLLER) }, + { } +}; +MODULE_DEVICE_TABLE(hid, ouya_devices); + +static struct hid_driver ouya_driver = { + .name = "ouya", + .id_table = ouya_devices, + .input_mapping = ouya_input_mapping, + .probe = ouya_probe, + .remove = ouya_remove, +}; + +static int __init ouya_init(void) +{ + return hid_register_driver(&ouya_driver); +} + +static void __exit ouya_exit(void) +{ + hid_unregister_driver(&ouya_driver); +} + +module_init(ouya_init); +module_exit(ouya_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Lukas Rusak "); +MODULE_AUTHOR("Gregorios Leach "); +MODULE_DESCRIPTION("Ouya Controller Driver"); diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c index 587e2681a53f..b5adc13e0df1 100644 --- a/drivers/hid/hid-quirks.c +++ b/drivers/hid/hid-quirks.c @@ -538,6 +538,9 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_IHOME_IMAC_A210S) }, { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, #endif +#if IS_ENABLED(CONFIG_HID_OUYA) + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_OUYA, USB_DEVICE_ID_OUYA_CONTROLLER) }, +#endif #if IS_ENABLED(CONFIG_HID_PANTHERLORD) { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) }, { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) }, ================================================ FILE: packages/linux/patches/raspberrypi/linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch ================================================ From 7051422474e4c4e302ede3d07ffd8ef2682e07a2 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 22 Apr 2014 16:05:14 +0300 Subject: [PATCH] [RFC] hid/sony: add autorepeat for PS3 remotes adapted to 4.6 Betreff: [RFC] hid/sony: add autorepeat for PS3 remotes Von: David Dillow Datum: 28.06.2013 04:28 An: linux-input@vger.kernel.org Kopie (CC): Stephan Raue Some applications using the PS3 remote would like to have autorepeat from the device. Use the input subsystem's software emulation to provide this capability, and enable those that don't need it to turn it off. --- I'm not sure this is the correct approach, or if it is even appropriate for a remote to do autorepeat. However, the media/rc subsystem does do it by default, and it's been requested by users, so there is at least some demand. This compiled against the hid-sony driver with the PS3 remote changes merged, but I have done no testing of it. If the approach seems reasonable, I'll try to test it when the MythTV is idle. Signed-off-by: Matt DeVillier --- drivers/hid/hid-sony.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index 310436a..84f7f41 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c @@ -1120,6 +1120,25 @@ static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi, return 1; } +static int ps3remote_setup_repeat(struct hid_device *hdev) +{ + struct hid_input *hidinput = list_first_entry(&hdev->inputs, + struct hid_input, list); + struct input_dev *input = hidinput->input; + + /* + * Set up autorepeat defaults per the remote control subsystem; + * this must be done after hid_hw_start(), as having these non-zero + * at the time of input_register_device() tells the input system that + * the hardware does the autorepeat, and the PS3 remote does not. + */ + set_bit(EV_REP, input->evbit); + input->rep[REP_DELAY] = 500; + input->rep[REP_PERIOD] = 125; + + return 0; +} + static u8 *sony_report_fixup(struct hid_device *hdev, u8 *rdesc, unsigned int *rsize) { @@ -2372,6 +2391,8 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) sony_init_output_report(sc, dualshock4_send_output_report); } else if (sc->quirks & MOTION_CONTROLLER) { sony_init_output_report(sc, motion_send_output_report); + } else if (sc->quirks & PS3REMOTE) { + ret = ps3remote_setup_repeat(hdev); } else { ret = 0; } -- 2.5.0 ================================================ FILE: packages/linux/sysctl.d/network.conf ================================================ net.ipv4.tcp_no_metrics_save=1 # generate/use temporary IPv6 addresses net.ipv6.conf.all.use_tempaddr = 2 net.ipv6.conf.default.use_tempaddr = 2 ================================================ FILE: packages/linux/sysctl.d/qdisc.conf ================================================ net.core.default_qdisc = fq_codel ================================================ FILE: packages/linux/udev.d/30-disable-wakeup.rules ================================================ # 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) ACTION!="add|change", GOTO="end" DRIVER=="ehci-pci|xhci_hcd", RUN+="/usr/bin/sh -c 'echo disabled > /sys$devpath/power/wakeup'" LABEL="end" ================================================ FILE: packages/linux/udev.d/40-modeswitch.rules ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) ACTION!="add|change", GOTO="end_modeswitch" KERNEL!="sr[0-9]*", GOTO="end_modeswitch" SUBSYSTEM!="block", GOTO="end_modeswitch" # Atheros Wireless / Netgear WNDA3200 ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="20ff", RUN+="/usr/bin/eject '/dev/%k'" # Realtek RTL8821CU chipset 802.11ac NIC # initial cdrom mode 0bda:1a2b, wlan mode 0bda:c811 # Odroid WiFi Module 5B # initial cdrom mode 0bda:1a2b, wlan mode 0bda:c820 ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="1a2b", RUN+="/usr/bin/eject '/dev/%k'" LABEL="end_modeswitch" ================================================ FILE: packages/linux-driver-addons/dvb/crazycat/changelog.txt ================================================ 100 - Initial add-on ================================================ FILE: packages/linux-driver-addons/dvb/crazycat/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="crazycat" PKG_VERSION="10.0-cc" PKG_SHA256="66c298f178cac3bd5c2182cd42122c603bd9ae6e3abadc2ccc8be75112bd196e" PKG_LICENSE="GPL" PKG_SITE="https://github.com/crazycat69/media_build" PKG_URL="https://github.com/LibreELEC/media_build/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_UNPACK="media_tree_cc" PKG_SECTION="driver.dvb" PKG_LONGDESC="DVB driver for TBS cards with CrazyCats additions" PKG_IS_ADDON="embedded" PKG_IS_KERNEL_PKG="yes" PKG_ADDON_IS_STANDALONE="yes" PKG_ADDON_NAME="DVB drivers for TBS" PKG_ADDON_TYPE="xbmc.service" PKG_ADDON_VERSION="${ADDON_VERSION}.${PKG_REV}" if [ "${DEVICE}" = "Amlogic-ng" ]; then PKG_PATCH_DIRS="amlogic-4.9" PKG_DEPENDS_TARGET="${PKG_DEPENDS_TARGET} media_tree_aml" PKG_NEED_UNPACK="${PKG_NEED_UNPACK} $(get_pkg_directory media_tree_aml)" fi if [ "${DEVICE}" = "Amlogic-no" ]; then PKG_PATCH_DIRS="amlogic-5.15" PKG_DEPENDS_TARGET="${PKG_DEPENDS_TARGET} media_tree_aml" PKG_NEED_UNPACK="${PKG_NEED_UNPACK} $(get_pkg_directory media_tree_aml)" fi pre_make_target() { export KERNEL_VER=$(get_module_dir) export LDFLAGS="" } make_target() { cp -RP $(get_build_dir media_tree_cc)/* ${PKG_BUILD}/linux if [ "${PROJECT}" = "Amlogic-ce" ]; then cp -Lr $(get_build_dir media_tree_aml)/* ${PKG_BUILD}/linux echo "obj-y += video_dev/" >> "${PKG_BUILD}/linux/drivers/media/platform/meson/Makefile" echo "obj-y += dvb/" >> "${PKG_BUILD}/linux/drivers/media/platform/meson/Makefile" echo 'source "drivers/media/platform/meson/dvb/Kconfig"' >> "${PKG_BUILD}/linux/drivers/media/platform/Kconfig" sed -e 's/ && RC_CORE//g' -i ${PKG_BUILD}/linux/drivers/media/usb/dvb-usb/Kconfig fi # make config all kernel_make VER=${KERNEL_VER} SRCDIR=$(kernel_path) allyesconfig # hack to workaround media_build bug if [ "${PROJECT}" = Rockchip ]; then sed -e 's/CONFIG_DVB_CXD2820R=m/# CONFIG_DVB_CXD2820R is not set/g' -i v4l/.config sed -e 's/CONFIG_DVB_LGDT3306A=m/# CONFIG_DVB_LGDT3306A is not set/g' -i v4l/.config fi # add menuconfig to edit .config kernel_make VER=${KERNEL_VER} SRCDIR=$(kernel_path) } makeinstall_target() { install_driver_addon_files "${PKG_BUILD}/v4l/" } ================================================ FILE: packages/linux-driver-addons/dvb/crazycat/patches/disable-pci/crazycat-03-disable-partly-pci.patch ================================================ --- a/v4l/scripts/make_kconfig.pl +++ b/v4l/scripts/make_kconfig.pl @@ -626,6 +626,8 @@ ($$) close OUT; # These options should default to off +disable_config('VIDEO_SAA7146'); +disable_config('VIDEO_SAA7146_VV'); disable_config('DVB_AV7110_FIRMWARE'); disable_config('DVB_CINERGYT2_TUNING'); disable_config('VIDEO_HELPER_CHIPS_AUTO'); ================================================ FILE: packages/linux-driver-addons/dvb/crazycat/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) ================================================ FILE: packages/linux-driver-addons/dvb/depends/media_tree/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="media_tree" PKG_VERSION="2021-04-08-4f4e6644cd87" PKG_SHA256="894530c842092646631a1595c7dff04e7a0ec55f4c7f246b8f89aa56f41d486e" 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" PKG_DEPENDS_TARGET="toolchain" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="Source of Linux Kernel media_tree subsystem to build with media_build." PKG_TOOLCHAIN="manual" unpack() { mkdir -p ${PKG_BUILD}/ tar -xf ${SOURCES}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.bz2 -C ${PKG_BUILD}/ } post_unpack() { # hack/workaround for borked upstream kernel/media_build # without removing atomisp there a lot additional includes that # slowdown build process after modpost from 3min to 6min # even if atomisp is disabled via kernel.conf rm -rf ${PKG_BUILD}/drivers/staging/media/atomisp sed -i 's|^.*drivers/staging/media/atomisp.*$||' \ ${PKG_BUILD}/drivers/staging/media/Kconfig } ================================================ FILE: packages/linux-driver-addons/dvb/depends/media_tree_cc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="media_tree_cc" PKG_VERSION="2021-02-16" PKG_SHA256="a4bc981015d48fda009f5588c001dbce6f67e11055efc7e58d3abceef95188fd" PKG_LICENSE="GPL" PKG_SITE="https://github.com/crazycat69/linux_media" PKG_URL="${DISTRO_SRC}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="Source of Linux Kernel media_tree subsystem to build with media_build." PKG_TOOLCHAIN="manual" unpack() { mkdir -p ${PKG_BUILD}/ tar -xf ${SOURCES}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.bz2 -C ${PKG_BUILD}/ } post_unpack() { # hack/workaround for borked upstream kernel/media_build # without removing atomisp there a lot additional includes that # slowdown build process after modpost from 3min to 6min # even if atomisp is disabled via kernel.conf rm -rf ${PKG_BUILD}/drivers/staging/media/atomisp sed -i 's|^.*drivers/staging/media/atomisp.*$||' \ ${PKG_BUILD}/drivers/staging/media/Kconfig } ================================================ FILE: packages/linux-driver-addons/dvb/digital_devices/changelog.txt ================================================ 100 - Initial add-on ================================================ FILE: packages/linux-driver-addons/dvb/digital_devices/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="digital_devices" PKG_VERSION="7d8a151127848288b7582ff772145849b35ad98f" PKG_SHA256="b727f8b44f8df9c7732048f18dd5dda9269ce72aa7d3e96aeef6023f835f2acb" PKG_ARCH="x86_64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/DigitalDevices/dddvb/" PKG_URL="https://github.com/DigitalDevices/dddvb/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_BUILD_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_SECTION="driver.dvb" PKG_LONGDESC="DVB driver for Digital Devices cards" PKG_IS_ADDON="embedded" PKG_ADDON_IS_STANDALONE="yes" PKG_ADDON_NAME="DVB drivers for DigitalDevices" PKG_ADDON_TYPE="xbmc.service" PKG_ADDON_VERSION="${ADDON_VERSION}.${PKG_REV}" make_target() { KDIR=$(kernel_path) make } makeinstall_target() { install_driver_addon_files "${PKG_BUILD}/ddbridge ${PKG_BUILD}/dvb-core ${PKG_BUILD}/frontends" } ================================================ FILE: packages/linux-driver-addons/dvb/digital_devices/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) ================================================ FILE: packages/linux-driver-addons/dvb/dvb-latest/changelog.txt ================================================ 100 - Initial add-on ================================================ FILE: packages/linux-driver-addons/dvb/dvb-latest/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="dvb-latest" PKG_VERSION="10.0-latest" PKG_SHA256="50ed45ec6eeac0c8d537f8de3e7e82ef1f37b2f91552cdd99fbda05e5646f351" PKG_LICENSE="GPL" PKG_SITE="http://git.linuxtv.org/media_build.git" PKG_URL="https://github.com/LibreELEC/media_build/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_UNPACK="media_tree" PKG_SECTION="driver.dvb" PKG_LONGDESC="DVB drivers from the latest kernel (media_build)" PKG_IS_ADDON="embedded" PKG_IS_KERNEL_PKG="yes" PKG_ADDON_IS_STANDALONE="yes" PKG_ADDON_NAME="DVB drivers from the latest kernel" PKG_ADDON_TYPE="xbmc.service" PKG_ADDON_VERSION="${ADDON_VERSION}.${PKG_REV}" if [ "${PROJECT}" = "Amlogic-ce" ]; then PKG_PATCH_DIRS="amlogic-common" case "${LINUX}" in amlogic-3.14) PKG_PATCH_DIRS+=" amlogic-3.14" ;; amlogic-4.9) PKG_PATCH_DIRS+=" amlogic-4.9" ;; esac PKG_DEPENDS_TARGET="${PKG_DEPENDS_TARGET} media_tree_aml" PKG_NEED_UNPACK="${PKG_NEED_UNPACK} $(get_pkg_directory media_tree_aml)" fi pre_make_target() { export KERNEL_VER=$(get_module_dir) export LDFLAGS="" } make_target() { cp -RP $(get_build_dir media_tree)/* ${PKG_BUILD}/linux if [ "${PROJECT}" = "Amlogic-ce" ]; then cp -Lr $(get_build_dir media_tree_aml)/* ${PKG_BUILD}/linux # compile modules echo "obj-y += video_dev/" >> "${PKG_BUILD}/linux/drivers/media/platform/meson/Makefile" echo "obj-y += dvb/" >> "${PKG_BUILD}/linux/drivers/media/platform/meson/Makefile" echo 'source "drivers/media/platform/meson/dvb/Kconfig"' >> "${PKG_BUILD}/linux/drivers/media/platform/Kconfig" sed -e 's/ && RC_CORE//g' -i ${PKG_BUILD}/linux/drivers/media/usb/dvb-usb/Kconfig fi # make config all kernel_make VER=${KERNEL_VER} SRCDIR=$(kernel_path) allyesconfig kernel_make VER=${KERNEL_VER} SRCDIR=$(kernel_path) } makeinstall_target() { install_driver_addon_files "${PKG_BUILD}/v4l/" } ================================================ FILE: packages/linux-driver-addons/dvb/dvb-latest/patches/disable-pci/dvb-latest-03-disable-partly-pci.patch ================================================ --- a/v4l/scripts/make_kconfig.pl +++ b/v4l/scripts/make_kconfig.pl @@ -626,6 +626,8 @@ ($$) close OUT; # These options should default to off +disable_config('VIDEO_SAA7146'); +disable_config('VIDEO_SAA7146_VV'); disable_config('DVB_AV7110_FIRMWARE'); disable_config('DVB_CINERGYT2_TUNING'); disable_config('VIDEO_HELPER_CHIPS_AUTO'); ================================================ FILE: packages/linux-driver-addons/dvb/dvb-latest/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) ================================================ FILE: packages/linux-drivers/RTL8192DU/package.mk ================================================ # 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) PKG_NAME="RTL8192DU" PKG_VERSION="5e03c430b3a132ae461a8b27e17fac72680db3e2" PKG_SHA256="ae7282c60b9a327b64524ff885e535b169db0b32446cd9a0404694ad0dcbc59e" PKG_LICENSE="GPL" PKG_SITE="https://github.com/lwfinger/rtl8192du" PKG_URL="https://github.com/lwfinger/rtl8192du/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="Realtek RTL8192DU Linux driver" PKG_IS_KERNEL_PKG="yes" pre_make_target() { unset LDFLAGS } make_target() { make V=1 \ ARCH=${TARGET_KERNEL_ARCH} \ KSRC=$(kernel_path) \ CROSS_COMPILE=${TARGET_KERNEL_PREFIX} \ CONFIG_POWER_SAVING=n } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} cp *.ko ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} } ================================================ FILE: packages/linux-drivers/RTL8192DU/patches/RTL8192DU-0001-remove_overlapping_pids.patch ================================================ diff -Naur RTL8192DU-085e206/os_dep/usb_intf.c RTL8192DU-085e206.patch/os_dep/usb_intf.c --- RTL8192DU-085e206/os_dep/usb_intf.c 2014-03-25 15:48:57.000000000 +0100 +++ RTL8192DU-085e206.patch/os_dep/usb_intf.c 2014-04-11 09:23:12.097223906 +0200 @@ -137,7 +137,7 @@ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8194)},/* 8192DU-VS */ \ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8111)},/* Realtek 5G dongle for WiFi Display */ \ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0193)},/* 8192DE-VAU */ \ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8171)},/* 8192DU-VC */ \ +/* {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8171)}, 8192DU-VC overlaps with in-kernel rtl8192se */ \ /*=== Customer ID ===*/ \ /****** 8192DU-VC ********/ \ {USB_DEVICE(0x2019, 0xAB2C)},/* PCI - Abocm */ \ ================================================ FILE: packages/linux-drivers/RTL8192DU/patches/aarch64/RTL8192DU-0101-PR63.patch ================================================ From fb85a57a5cd6241cc8c066c5efc5b43781b0e42d Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Wed, 13 Jun 2018 06:43:10 +0100 Subject: [PATCH] aarch64/4.4.y: implicit declaration of function 'csum_ipv6_magic' --- core/rtw_br_ext.c | 1 + 1 file changed, 1 insertion(+) diff --git a/core/rtw_br_ext.c b/core/rtw_br_ext.c index da9c5e5..19af0fe 100644 --- a/core/rtw_br_ext.c +++ b/core/rtw_br_ext.c @@ -51,6 +51,7 @@ #include #include #include +#include #endif #endif -- 2.14.1 ================================================ FILE: packages/linux-drivers/RTL8812AU/package.mk ================================================ # 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) PKG_NAME="RTL8812AU" PKG_VERSION="eee82ac1401e211a58a42cd89ab788b4f55040af" PKG_SHA256="d45d1aec81f293e64dc3e45f4350cf51d628ee08d6a28a9a5eca7d1647c7656f" PKG_LICENSE="GPL" PKG_SITE="https://github.com/aircrack-ng/rtl8812au" PKG_URL="https://github.com/aircrack-ng/rtl8812au/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="Realtek RTL8812AU Linux driver" PKG_IS_KERNEL_PKG="yes" pre_make_target() { unset LDFLAGS } make_target() { export KCFLAGS+=" -Wno-array-bounds -Wno-stringop-overflow -Wno-restrict -Wno-address -Wno-stringop-overread" make V=1 \ ARCH=${TARGET_KERNEL_ARCH} \ KSRC=$(kernel_path) \ CROSS_COMPILE=${TARGET_KERNEL_PREFIX} \ CONFIG_POWER_SAVING=n } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} cp *.ko ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} } ================================================ FILE: packages/linux-drivers/bcm_sta/package.mk ================================================ # 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) # Downloadlocation: # http://www.broadcom.com/support/802.11/linux_sta.php PKG_NAME="bcm_sta" PKG_VERSION="6.30.223.271" PKG_SHA256="959bcd1e965d294304a4e290cb8e47b7c74b9763094eff4d0b8e6cfb68a6895b" PKG_ARCH="x86_64" PKG_LICENSE="nonfree" PKG_SITE="http://www.broadcom.com/" PKG_URL="${DISTRO_SRC}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_LONGDESC="Broadcom's BCM4311-, BCM4312-, BCM4313-, BCM4321-, BCM4322-, BCM43224-, and BCM43225-based WLAN driver." PKG_TOOLCHAIN="manual" PKG_IS_KERNEL_PKG="yes" make_target() { cd x86-64 KBUILD_NOPEDANTIC=1 kernel_make V=1 CC=${CC} -C $(kernel_path) M=$(pwd) BINARCH=${TARGET_KERNEL_ARCH} } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/bcm_sta cp *.ko ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} } ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0001-change-eth-to-wlan.patch ================================================ From c51168b8481e84743b50d3d5cba18a4a0a188448 Mon Sep 17 00:00:00 2001 From: Alberto Milone Date: Fri, 22 Nov 2013 10:07:33 +0100 Subject: [PATCH 1/1] Change the network interface name from eth to wlan Thanks to Shuduo Sang for the patch. --- src/wl/sys/wl_linux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x86-64/src/wl/sys/wl_linux.c b/x86-64/src/wl/sys/wl_linux.c index 3ead3c3..b662ff7 100644 --- a/x86-64/src/wl/sys/wl_linux.c +++ b/x86-64/src/wl/sys/wl_linux.c @@ -235,7 +235,7 @@ module_param(nompc, int, 0); #define to_str(s) #s #define quote_str(s) to_str(s) -#define BRCM_WLAN_IFNAME eth%d +#define BRCM_WLAN_IFNAME wlan%d static char intf_name[IFNAMSIZ] = quote_str(BRCM_WLAN_IFNAME); -- 1.7.9.5 ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0002-user_ioctl.patch ================================================ --- a/x86-64/src/wl/sys/wl_linux.c +++ b/x86-64/src/wl/sys/wl_linux.c @@ -1659,11 +1659,7 @@ } WL_LOCK(wl); - if (!capable(CAP_NET_ADMIN)) { - bcmerror = BCME_EPERM; - } else { - bcmerror = wlc_ioctl(wl->wlc, ioc.cmd, buf, ioc.len, wlif->wlcif); - } + bcmerror = wlc_ioctl(wl->wlc, ioc.cmd, buf, ioc.len, wlif->wlcif); WL_UNLOCK(wl); done1: ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0003-remove-date-time-macros.patch ================================================ --- a/x86-64/src/wl/sys/wl_linux.c +++ b/x86-64/src/wl/sys/wl_linux.c @@ -724,7 +724,7 @@ wl_attach(uint16 vendor, uint16 device, WL_ALL_PASSIVE_ENAB(wl) ? ", Passive Mode" : "", EPI_VERSION_STR); #ifdef BCMDBG - printf(" (Compiled in " SRCBASE " at " __TIME__ " on " __DATE__ ")"); + printf(" (Compiled in " SRCBASE ")"); #endif printf("\n"); @@ -2049,8 +2049,7 @@ wl_osl_pcie_rc(struct wl_info *wl, uint void wl_dump_ver(wl_info_t *wl, struct bcmstrbuf *b) { - bcm_bprintf(b, "wl%d: %s %s version %s\n", wl->pub->unit, - __DATE__, __TIME__, EPI_VERSION_STR); + bcm_bprintf(b, "wl%d: version %s\n", wl->pub->unit, EPI_VERSION_STR); } #if defined(BCMDBG) ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0004-null-pointer-crash.patch ================================================ --- a/x86-64/src/wl/sys/wl_linux.c +++ b/x86-64/src/wl/sys/wl_linux.c @@ -2160,8 +2160,8 @@ wl_start(struct sk_buff *skb, struct net wlif = WL_DEV_IF(dev); wl = WL_INFO(dev); + skb->prev = NULL; if (WL_ALL_PASSIVE_ENAB(wl) || (WL_RTR() && WL_CONFIG_SMP())) { - skb->prev = NULL; TXQ_LOCK(wl); ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0005-rdtscl.patch ================================================ --- a/x86-64/src/shared/linux_osl.c 2015-09-19 01:47:15.000000000 +0300 +++ b/x86-64/src/shared/linux_osl.c 2015-11-21 15:20:30.585902518 +0200 @@ -932,7 +932,11 @@ uint cycles; #if defined(__i386__) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0) + cycles = (u32)rdtsc(); +#else rdtscl(cycles); +#endif #else cycles = 0; #endif ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0006-kernel-4.7.patch ================================================ diff -Naur a/x86-32/src/wl/sys/wl_cfg80211_hybrid.c b/x86-32/src/wl/sys/wl_cfg80211_hybrid.c --- a/x86-32/src/wl/sys/wl_cfg80211_hybrid.c 2016-06-23 14:26:16.911221749 +0100 +++ b/x86-32/src/wl/sys/wl_cfg80211_hybrid.c 2016-06-23 14:26:49.071406220 +0100 @@ -236,7 +236,7 @@ #endif #define CHAN2G(_channel, _freq, _flags) { \ - .band = IEEE80211_BAND_2GHZ, \ + .band = NL80211_BAND_2GHZ, \ .center_freq = (_freq), \ .hw_value = (_channel), \ .flags = (_flags), \ @@ -245,7 +245,7 @@ } #define CHAN5G(_channel, _flags) { \ - .band = IEEE80211_BAND_5GHZ, \ + .band = NL80211_BAND_5GHZ, \ .center_freq = 5000 + (5 * (_channel)), \ .hw_value = (_channel), \ .flags = (_flags), \ @@ -379,7 +379,7 @@ }; static struct ieee80211_supported_band __wl_band_2ghz = { - .band = IEEE80211_BAND_2GHZ, + .band = NL80211_BAND_2GHZ, .channels = __wl_2ghz_channels, .n_channels = ARRAY_SIZE(__wl_2ghz_channels), .bitrates = wl_g_rates, @@ -387,7 +387,7 @@ }; static struct ieee80211_supported_band __wl_band_5ghz_a = { - .band = IEEE80211_BAND_5GHZ, + .band = NL80211_BAND_5GHZ, .channels = __wl_5ghz_a_channels, .n_channels = ARRAY_SIZE(__wl_5ghz_a_channels), .bitrates = wl_a_rates, @@ -395,7 +395,7 @@ }; static struct ieee80211_supported_band __wl_band_5ghz_n = { - .band = IEEE80211_BAND_5GHZ, + .band = NL80211_BAND_5GHZ, .channels = __wl_5ghz_n_channels, .n_channels = ARRAY_SIZE(__wl_5ghz_n_channels), .bitrates = wl_a_rates, @@ -1876,8 +1876,8 @@ wdev->wiphy->max_num_pmkids = WL_NUM_PMKIDS_MAX; #endif wdev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC); - wdev->wiphy->bands[IEEE80211_BAND_2GHZ] = &__wl_band_2ghz; - wdev->wiphy->bands[IEEE80211_BAND_5GHZ] = &__wl_band_5ghz_a; + wdev->wiphy->bands[NL80211_BAND_2GHZ] = &__wl_band_2ghz; + wdev->wiphy->bands[NL80211_BAND_5GHZ] = &__wl_band_5ghz_a; wdev->wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; wdev->wiphy->cipher_suites = __wl_cipher_suites; wdev->wiphy->n_cipher_suites = ARRAY_SIZE(__wl_cipher_suites); @@ -2000,7 +2000,7 @@ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) freq = ieee80211_channel_to_frequency(notif_bss_info->channel, (notif_bss_info->channel <= CH_MAX_2G_CHANNEL) ? - IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ); + NL80211_BAND_2GHZ : NL80211_BAND_5GHZ); #else freq = ieee80211_channel_to_frequency(notif_bss_info->channel); #endif @@ -2116,7 +2116,7 @@ return err; } chan = wf_chspec_ctlchan(chanspec); - band = (chan <= CH_MAX_2G_CHANNEL) ? IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ; + band = (chan <= CH_MAX_2G_CHANNEL) ? NL80211_BAND_2GHZ : NL80211_BAND_5GHZ; freq = ieee80211_channel_to_frequency(chan, band); channel = ieee80211_get_channel(wiphy, freq); cfg80211_ibss_joined(ndev, (u8 *)&wl->bssid, channel, GFP_KERNEL); @@ -2250,10 +2250,10 @@ join_params->params.chanspec_list[0] = ieee80211_frequency_to_channel(chan->center_freq); - if (chan->band == IEEE80211_BAND_2GHZ) { + if (chan->band == NL80211_BAND_2GHZ) { chanspec |= WL_CHANSPEC_BAND_2G; } - else if (chan->band == IEEE80211_BAND_5GHZ) { + else if (chan->band == NL80211_BAND_5GHZ) { chanspec |= WL_CHANSPEC_BAND_5G; } else { @@ -2885,7 +2885,7 @@ if (phy == 'n' || phy == 'a' || phy == 'v') { wiphy = wl_to_wiphy(wl); - wiphy->bands[IEEE80211_BAND_5GHZ] = &__wl_band_5ghz_n; + wiphy->bands[NL80211_BAND_5GHZ] = &__wl_band_5ghz_n; } return err; diff -Naur a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c --- a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c 2016-06-23 14:26:22.639254590 +0100 +++ b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c 2016-06-23 14:27:01.507477603 +0100 @@ -236,7 +236,7 @@ #endif #define CHAN2G(_channel, _freq, _flags) { \ - .band = IEEE80211_BAND_2GHZ, \ + .band = NL80211_BAND_2GHZ, \ .center_freq = (_freq), \ .hw_value = (_channel), \ .flags = (_flags), \ @@ -245,7 +245,7 @@ } #define CHAN5G(_channel, _flags) { \ - .band = IEEE80211_BAND_5GHZ, \ + .band = NL80211_BAND_5GHZ, \ .center_freq = 5000 + (5 * (_channel)), \ .hw_value = (_channel), \ .flags = (_flags), \ @@ -379,7 +379,7 @@ }; static struct ieee80211_supported_band __wl_band_2ghz = { - .band = IEEE80211_BAND_2GHZ, + .band = NL80211_BAND_2GHZ, .channels = __wl_2ghz_channels, .n_channels = ARRAY_SIZE(__wl_2ghz_channels), .bitrates = wl_g_rates, @@ -387,7 +387,7 @@ }; static struct ieee80211_supported_band __wl_band_5ghz_a = { - .band = IEEE80211_BAND_5GHZ, + .band = NL80211_BAND_5GHZ, .channels = __wl_5ghz_a_channels, .n_channels = ARRAY_SIZE(__wl_5ghz_a_channels), .bitrates = wl_a_rates, @@ -395,7 +395,7 @@ }; static struct ieee80211_supported_band __wl_band_5ghz_n = { - .band = IEEE80211_BAND_5GHZ, + .band = NL80211_BAND_5GHZ, .channels = __wl_5ghz_n_channels, .n_channels = ARRAY_SIZE(__wl_5ghz_n_channels), .bitrates = wl_a_rates, @@ -1876,8 +1876,8 @@ wdev->wiphy->max_num_pmkids = WL_NUM_PMKIDS_MAX; #endif wdev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC); - wdev->wiphy->bands[IEEE80211_BAND_2GHZ] = &__wl_band_2ghz; - wdev->wiphy->bands[IEEE80211_BAND_5GHZ] = &__wl_band_5ghz_a; + wdev->wiphy->bands[NL80211_BAND_2GHZ] = &__wl_band_2ghz; + wdev->wiphy->bands[NL80211_BAND_5GHZ] = &__wl_band_5ghz_a; wdev->wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; wdev->wiphy->cipher_suites = __wl_cipher_suites; wdev->wiphy->n_cipher_suites = ARRAY_SIZE(__wl_cipher_suites); @@ -2000,7 +2000,7 @@ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) freq = ieee80211_channel_to_frequency(notif_bss_info->channel, (notif_bss_info->channel <= CH_MAX_2G_CHANNEL) ? - IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ); + NL80211_BAND_2GHZ : NL80211_BAND_5GHZ); #else freq = ieee80211_channel_to_frequency(notif_bss_info->channel); #endif @@ -2116,7 +2116,7 @@ return err; } chan = wf_chspec_ctlchan(chanspec); - band = (chan <= CH_MAX_2G_CHANNEL) ? IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ; + band = (chan <= CH_MAX_2G_CHANNEL) ? NL80211_BAND_2GHZ : NL80211_BAND_5GHZ; freq = ieee80211_channel_to_frequency(chan, band); channel = ieee80211_get_channel(wiphy, freq); cfg80211_ibss_joined(ndev, (u8 *)&wl->bssid, channel, GFP_KERNEL); @@ -2250,10 +2250,10 @@ join_params->params.chanspec_list[0] = ieee80211_frequency_to_channel(chan->center_freq); - if (chan->band == IEEE80211_BAND_2GHZ) { + if (chan->band == NL80211_BAND_2GHZ) { chanspec |= WL_CHANSPEC_BAND_2G; } - else if (chan->band == IEEE80211_BAND_5GHZ) { + else if (chan->band == NL80211_BAND_5GHZ) { chanspec |= WL_CHANSPEC_BAND_5G; } else { @@ -2885,7 +2885,7 @@ if (phy == 'n' || phy == 'a' || phy == 'v') { wiphy = wl_to_wiphy(wl); - wiphy->bands[IEEE80211_BAND_5GHZ] = &__wl_band_5ghz_n; + wiphy->bands[NL80211_BAND_5GHZ] = &__wl_band_5ghz_n; } return err; ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0007-kernel-4.8.patch ================================================ diff -Naur a/x86-32/src/wl/sys/wl_cfg80211_hybrid.c b/x86-32/src/wl/sys/wl_cfg80211_hybrid.c --- a/x86-32/src/wl/sys/wl_cfg80211_hybrid.c 2016-09-11 01:59:36.987804240 +0100 +++ b/x86-32/src/wl/sys/wl_cfg80211_hybrid.c 2016-09-11 02:02:44.876069294 +0100 @@ -2387,7 +2387,14 @@ if (wl->scan_request) { WL_DBG(("%s: Aborting scan\n", __FUNCTION__)); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0) + struct cfg80211_scan_info info = { + .aborted = true + }; + cfg80211_scan_done(wl->scan_request, &info); +#else cfg80211_scan_done(wl->scan_request, true); +#endif wl->scan_request = NULL; } @@ -2488,7 +2495,14 @@ scan_done_out: if (wl->scan_request) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0) + struct cfg80211_scan_info info = { + .aborted = false + }; + cfg80211_scan_done(wl->scan_request, &info); +#else cfg80211_scan_done(wl->scan_request, false); +#endif wl->scan_request = NULL; } rtnl_unlock(); @@ -2913,7 +2927,14 @@ s32 err = 0; if (wl->scan_request) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0) + struct cfg80211_scan_info info = { + .aborted = true + }; + cfg80211_scan_done(wl->scan_request, &info); +#else cfg80211_scan_done(wl->scan_request, true); +#endif wl->scan_request = NULL; } diff -Naur a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c --- a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c 2016-09-11 01:59:50.796117742 +0100 +++ b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c 2016-09-11 02:04:12.290053058 +0100 @@ -2387,7 +2387,14 @@ if (wl->scan_request) { WL_DBG(("%s: Aborting scan\n", __FUNCTION__)); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0) + struct cfg80211_scan_info info = { + .aborted = true + }; + cfg80211_scan_done(wl->scan_request, &info); +#else cfg80211_scan_done(wl->scan_request, true); +#endif wl->scan_request = NULL; } @@ -2488,7 +2495,14 @@ scan_done_out: if (wl->scan_request) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0) + struct cfg80211_scan_info info = { + .aborted = false + }; + cfg80211_scan_done(wl->scan_request, &info); +#else cfg80211_scan_done(wl->scan_request, false); +#endif wl->scan_request = NULL; } rtnl_unlock(); @@ -2913,7 +2927,14 @@ s32 err = 0; if (wl->scan_request) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0) + struct cfg80211_scan_info info = { + .aborted = true + }; + cfg80211_scan_done(wl->scan_request, &info); +#else cfg80211_scan_done(wl->scan_request, true); +#endif wl->scan_request = NULL; } ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0008-kernel-4.11.patch ================================================ From 7e8dddb7a545bc5ba74336ef2aafed1c0b4ceee1 Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Mon, 13 Mar 2017 20:48:44 +0000 Subject: [PATCH 1/2] bcm_sta: Fix build for API changes in kernel 4.11 --- x86-64/src/wl/sys/wl_cfg80211_hybrid.c | 4 ++++ x86-64/src/wl/sys/wl_linux.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c index 7b606e0..76ef208 100644 --- a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c +++ b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c @@ -26,6 +26,10 @@ #include #include +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) +#include +#endif + #include #include #include diff --git a/x86-64/src/wl/sys/wl_linux.c b/x86-64/src/wl/sys/wl_linux.c index 0d05100..dca7c71 100644 --- a/x86-64/src/wl/sys/wl_linux.c +++ b/x86-64/src/wl/sys/wl_linux.c @@ -26,6 +26,10 @@ #include #include #include +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) +#include +#endif + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14) #include #endif -- 2.7.4 From 1d066a57a682af0ac42b8d1c65bf7bd1984a54ca Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Mon, 13 Mar 2017 20:49:01 +0000 Subject: [PATCH 2/2] bcm_sta: Remove usage of net_device last_rx member --- x86-64/src/wl/sys/wl_linux.c | 1 - 1 file changed, 1 deletion(-) diff --git a/x86-64/src/wl/sys/wl_linux.c b/x86-64/src/wl/sys/wl_linux.c index dca7c71..f3be019 100644 --- a/x86-64/src/wl/sys/wl_linux.c +++ b/x86-64/src/wl/sys/wl_linux.c @@ -2919,7 +2919,6 @@ wl_monitor(wl_info_t *wl, wl_rxsts_t *rxsts, void *p) if (skb == NULL) return; skb->dev = wl->monitor_dev; - skb->dev->last_rx = jiffies; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) skb_reset_mac_header(skb); #else -- 2.7.4 ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0009-kernel-4.12.patch ================================================ From 268500240a551436c5003f5843ff4d090bf3e202 Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Thu, 18 May 2017 12:52:55 +0100 Subject: [PATCH] Fix build with kernel 4.12-rc1 --- x86-64/src/wl/sys/wl_cfg80211_hybrid.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c index 7b606e0..cedf95c 100644 --- a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c +++ b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c @@ -49,8 +49,13 @@ u32 wl_dbg_level = WL_DBG_ERR | WL_DBG_INFO; u32 wl_dbg_level = WL_DBG_ERR; #endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) +static s32 wl_cfg80211_change_iface(struct wiphy *wiphy, struct net_device *ndev, + enum nl80211_iftype type, struct vif_params *params); +#else static s32 wl_cfg80211_change_iface(struct wiphy *wiphy, struct net_device *ndev, enum nl80211_iftype type, u32 *flags, struct vif_params *params); +#endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0) static s32 wl_cfg80211_scan(struct wiphy *wiphy, @@ -461,10 +466,16 @@ wl_dev_ioctl(struct net_device *dev, u32 cmd, void *arg, u32 len) return err; } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) +static s32 +wl_cfg80211_change_iface(struct wiphy *wiphy, struct net_device *ndev, + enum nl80211_iftype type, struct vif_params *params) +#else static s32 wl_cfg80211_change_iface(struct wiphy *wiphy, struct net_device *ndev, enum nl80211_iftype type, u32 *flags, struct vif_params *params) +#endif { struct wl_cfg80211_priv *wl = wiphy_to_wl(wiphy); struct wireless_dev *wdev; @@ -2364,6 +2375,19 @@ wl_bss_roaming_done(struct wl_cfg80211_priv *wl, struct net_device *ndev, memcpy(wl->profile->bssid, &e->addr, ETHER_ADDR_LEN); memcpy(&wl->bssid, &e->addr, ETHER_ADDR_LEN); wl_update_bss_info(wl); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) + { + struct cfg80211_roam_info roam_info = { + .channel = &wl->conf->channel, + .bssid = (u8 *)&wl->bssid, + .req_ie = conn_info->req_ie, + .req_ie_len = conn_info->req_ie_len, + .resp_ie = conn_info->resp_ie, + .resp_ie_len = conn_info->resp_ie_len, + }; + cfg80211_roamed(ndev, &roam_info, GFP_KERNEL); + } +#else cfg80211_roamed(ndev, #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) &wl->conf->channel, @@ -2371,6 +2395,7 @@ wl_bss_roaming_done(struct wl_cfg80211_priv *wl, struct net_device *ndev, (u8 *)&wl->bssid, conn_info->req_ie, conn_info->req_ie_len, conn_info->resp_ie, conn_info->resp_ie_len, GFP_KERNEL); +#endif WL_DBG(("Report roaming result\n")); set_bit(WL_STATUS_CONNECTED, &wl->status); -- 2.7.4 ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0010-kernel-4.15.patch ================================================ From a893fac9b9e883f39a545e8ce87926cecc26ba12 Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Sun, 10 Jun 2018 19:13:17 +0100 Subject: [PATCH] add 4.15.y support Credit: https://github.com/UnitedRPMs/broadcom-wl-dkms/blob/5147b5f1867273e2762f777fd724b6523c3ab8dd/008-linux415.patch --- x86-64/src/wl/sys/wl_linux.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/x86-64/src/wl/sys/wl_linux.c b/x86-64/src/wl/sys/wl_linux.c index f7149da..89a3831 100644 --- a/x86-64/src/wl/sys/wl_linux.c +++ b/x86-64/src/wl/sys/wl_linux.c @@ -97,7 +97,11 @@ struct iw_statistics *wl_get_wireless_stats(struct net_device *dev); #include +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0) +static void wl_timer(struct timer_list *tl); +#else static void wl_timer(ulong data); +#endif static void _wl_timer(wl_timer_t *t); static struct net_device *wl_alloc_linux_if(wl_if_t *wlif); @@ -2296,10 +2300,17 @@ wl_timer_task(wl_task_t *task) atomic_dec(&t->wl->callbacks); } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0) +static void +wl_timer(struct timer_list *tl) +{ + wl_timer_t *t = (wl_timer_t *)tl; +#else static void wl_timer(ulong data) { wl_timer_t *t = (wl_timer_t *)data; +#endif if (!WL_ALL_PASSIVE_ENAB(t->wl)) _wl_timer(t); @@ -2351,9 +2362,13 @@ wl_init_timer(wl_info_t *wl, void (*fn)(void *arg), void *arg, const char *tname bzero(t, sizeof(wl_timer_t)); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0) + timer_setup(&t->timer, wl_timer, 0); +#else init_timer(&t->timer); t->timer.data = (ulong) t; t->timer.function = wl_timer; +#endif t->wl = wl; t->fn = fn; t->arg = arg; -- 2.14.1 ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0011-fix-kernel-warnings.patch ================================================ From 6bc816ae3ef424bc52b2736aeb1eb08ab09f38a9 Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Sun, 10 Jun 2018 19:32:39 +0100 Subject: [PATCH] fix kernel warnings Credit: https://github.com/UnitedRPMs/broadcom-wl-dkms/blob/master/wl-kmod-008_fix_kernel_warnings.patch --- x86-64/src/wl/sys/wl_cfg80211_hybrid.c | 88 +++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 28 deletions(-) diff --git a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c index 2e8625d..4da9b38 100644 --- a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c +++ b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c @@ -1983,7 +1983,7 @@ static s32 wl_inform_single_bss(struct wl_cfg80211_priv *wl, struct wl_bss_info if (dtoh32(bi->length) > WL_BSS_INFO_MAX) { WL_DBG(("Beacon is larger than buffer. Discarding\n")); - return err; + return -E2BIG; } notif_bss_info = kzalloc(sizeof(*notif_bss_info) + sizeof(*mgmt) - sizeof(u8) + WL_BSS_INFO_MAX, GFP_KERNEL); @@ -2007,9 +2007,15 @@ static s32 wl_inform_single_bss(struct wl_cfg80211_priv *wl, struct wl_bss_info beacon_proberesp->capab_info = cpu_to_le16(bi->capability); wl_rst_ie(wl); - wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length); - wl_cp_ie(wl, beacon_proberesp->variable, WL_BSS_INFO_MAX - - offsetof(struct wl_cfg80211_bss_info, frame_buf)); + err = wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length); + if (err) + goto inform_single_bss_out; + + err = wl_cp_ie(wl, beacon_proberesp->variable, WL_BSS_INFO_MAX - + offsetof(struct wl_cfg80211_bss_info, frame_buf)); + if (err) + goto inform_single_bss_out; + notif_bss_info->frame_len = offsetof(struct ieee80211_mgmt, u.beacon.variable) + wl_get_ielen(wl); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) @@ -2021,14 +2027,14 @@ static s32 wl_inform_single_bss(struct wl_cfg80211_priv *wl, struct wl_bss_info #endif if (freq == 0) { WL_ERR(("Invalid channel, fail to chcnage channel to freq\n")); - kfree(notif_bss_info); - return -EINVAL; + err = -EINVAL; + goto inform_single_bss_out; } channel = ieee80211_get_channel(wiphy, freq); if (unlikely(!channel)) { WL_ERR(("ieee80211_get_channel error\n")); - kfree(notif_bss_info); - return -EINVAL; + err = -EINVAL; + goto inform_single_bss_out; } WL_DBG(("SSID : \"%s\", rssi %d, channel %d, capability : 0x04%x, bssid %pM\n", @@ -2036,28 +2042,35 @@ static s32 wl_inform_single_bss(struct wl_cfg80211_priv *wl, struct wl_bss_info mgmt->u.beacon.capab_info, &bi->BSSID)); signal = notif_bss_info->rssi * 100; - cbss = cfg80211_inform_bss_frame(wiphy, channel, mgmt, - le16_to_cpu(notif_bss_info->frame_len), signal, GFP_KERNEL); - if (unlikely(!cbss)) { - WL_ERR(("cfg80211_inform_bss_frame error\n")); - kfree(notif_bss_info); - return -EINVAL; + if (!wl->scan_request) { + cbss = cfg80211_inform_bss_frame(wiphy, channel, mgmt, + le16_to_cpu(notif_bss_info->frame_len), signal, GFP_KERNEL); + if (unlikely(!cbss)) { + WL_ERR(("cfg80211_inform_bss_frame error\n")); + err = -ENOMEM; + goto inform_single_bss_out; + } } - - notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset); - notify_ielen = le32_to_cpu(bi->ie_length); + else { + notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset); + notify_ielen = le32_to_cpu(bi->ie_length); #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 18, 0) - cbss = cfg80211_inform_bss(wiphy, channel, (const u8 *)(bi->BSSID.octet), - 0, beacon_proberesp->capab_info, beacon_proberesp->beacon_int, - (const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL); + cbss = cfg80211_inform_bss(wiphy, channel, (const u8 *)(bi->BSSID.octet), + 0, beacon_proberesp->capab_info, beacon_proberesp->beacon_int, + (const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL); #else - cbss = cfg80211_inform_bss(wiphy, channel, CFG80211_BSS_FTYPE_UNKNOWN, (const u8 *)(bi->BSSID.octet), - 0, beacon_proberesp->capab_info, beacon_proberesp->beacon_int, - (const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL); + cbss = cfg80211_inform_bss(wiphy, channel, + wl->active_scan ? CFG80211_BSS_FTYPE_PRESP : CFG80211_BSS_FTYPE_BEACON, + (const u8 *)(bi->BSSID.octet), + 0, beacon_proberesp->capab_info, beacon_proberesp->beacon_int, + (const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL); #endif - - if (unlikely(!cbss)) - return -ENOMEM; + if (unlikely(!cbss)) { + WL_ERR(("cfg80211_inform_bss error\n")); + err = -ENOMEM; + goto inform_single_bss_out; + } + } #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) cfg80211_put_bss(wiphy, cbss); @@ -2065,6 +2078,7 @@ static s32 wl_inform_single_bss(struct wl_cfg80211_priv *wl, struct wl_bss_info cfg80211_put_bss(cbss); #endif +inform_single_bss_out: kfree(notif_bss_info); return err; @@ -2331,6 +2345,9 @@ static s32 wl_update_bss_info(struct wl_cfg80211_priv *wl) if (err) goto update_bss_info_out; + bss = cfg80211_get_bss(wl_to_wiphy(wl), NULL, (s8 *)&wl->bssid, + ssid->SSID, ssid->SSID_len, WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS); + ie = ((u8 *)bi) + bi->ie_offset; ie_len = bi->ie_length; } else { @@ -2343,12 +2360,20 @@ static s32 wl_update_bss_info(struct wl_cfg80211_priv *wl) ie_len = bss->len_information_elements; #endif wl->conf->channel = *bss->channel; + } + + if (bss) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) cfg80211_put_bss(wiphy, bss); #else cfg80211_put_bss(bss); #endif } + else { + WL_DBG(("Could not update BSS\n")); + err = -EINVAL; + goto update_bss_info_out; + } tim = bcm_parse_tlvs(ie, ie_len, WLAN_EID_TIM); if (tim) { @@ -2375,10 +2400,17 @@ wl_bss_roaming_done(struct wl_cfg80211_priv *wl, struct net_device *ndev, struct wl_cfg80211_connect_info *conn_info = wl_to_conn(wl); s32 err = 0; - wl_get_assoc_ies(wl); + err = wl_get_assoc_ies(wl); + if (err) + return err; + memcpy(wl->profile->bssid, &e->addr, ETHER_ADDR_LEN); memcpy(&wl->bssid, &e->addr, ETHER_ADDR_LEN); - wl_update_bss_info(wl); + + err = wl_update_bss_info(wl); + if (err) + return err; + #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) { struct cfg80211_roam_info roam_info = { -- 2.14.1 ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0012-kernel-4.14.patch ================================================ From d1dfd471bfc5bb4e9513e8a26ecb11de934dc27e Mon Sep 17 00:00:00 2001 From: Marcelo Henrique Cerri Date: Fri, 15 Dec 2017 17:09:04 +0000 Subject: [PATCH 25/26] add support for Linux 4.14 Signed-off-by: Marcelo Henrique Cerri --- src/shared/linux_osl.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/shared/linux_osl.c b/src/shared/linux_osl.c index 6157d1832767..318874541d89 100644 --- a/x86-64/src/shared/linux_osl.c +++ b/x86-64/src/shared/linux_osl.c @@ -1076,7 +1076,11 @@ osl_os_get_image_block(char *buf, int len, void *image) if (!image) return 0; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) + rdlen = kernel_read(fp, buf, len, &fp->f_pos); +#else rdlen = kernel_read(fp, fp->f_pos, buf, len); +#endif if (rdlen > 0) fp->f_pos += rdlen; -- 2.14.1 ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0200-kernel-5.1-rc1-fix.patch ================================================ 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 ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0300-kernel-5.6-rc1-fix.patch ================================================ From 5224fb9bcb82733be5f7d4e41134578f48399a9b Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Mon, 10 Feb 2020 11:34:46 +0000 Subject: [PATCH 1/2] proc_create_data: fix 5.6-rc1 d56c0d45f0e27f814e87a1676b6bdccccbc252e9 --- x86-64/src/wl/sys/wl_linux.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/x86-64/src/wl/sys/wl_linux.c b/x86-64/src/wl/sys/wl_linux.c index 0d05100..cbca645 100644 --- a/x86-64/src/wl/sys/wl_linux.c +++ b/x86-64/src/wl/sys/wl_linux.c @@ -3334,7 +3334,12 @@ wl_proc_write(struct file *filp, const char __user *buff, size_t length, loff_t return length; } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) +static const struct proc_ops wl_pops = { + .proc_read = wl_proc_read, + .proc_write = wl_proc_write, +}; +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) static const struct file_operations wl_fops = { .owner = THIS_MODULE, .read = wl_proc_read, @@ -3347,12 +3352,15 @@ wl_reg_proc_entry(wl_info_t *wl) { char tmp[32]; sprintf(tmp, "%s%d", HYBRID_PROC, wl->pub->unit); -#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0) - if ((wl->proc_entry = create_proc_entry(tmp, 0644, NULL)) == NULL) { - WL_ERROR(("%s: create_proc_entry %s failed\n", __FUNCTION__, tmp)); -#else +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) + if ((wl->proc_entry = proc_create_data(tmp, 0644, NULL, &wl_pops, wl)) == NULL) { + WL_ERROR(("%s: proc_create_data %s failed\n", __FUNCTION__, tmp)); +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) if ((wl->proc_entry = proc_create_data(tmp, 0644, NULL, &wl_fops, wl)) == NULL) { WL_ERROR(("%s: proc_create_data %s failed\n", __FUNCTION__, tmp)); +#else + if ((wl->proc_entry = create_proc_entry(tmp, 0644, NULL)) == NULL) { + WL_ERROR(("%s: create_proc_entry %s failed\n", __FUNCTION__, tmp)); #endif ASSERT(0); return -1; -- 2.20.1 From 8d32f5792ec56b0088d5b5e3b21d4cbc97389728 Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Mon, 10 Feb 2020 11:46:35 +0000 Subject: [PATCH 2/2] ioremap_nocache: fix 5.6-rc1 6a1000bd27035bba17ede9dc915166276a811edb --- x86-64/src/shared/linux_osl.c | 2 +- x86-64/src/wl/sys/wl_linux.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x86-64/src/shared/linux_osl.c b/x86-64/src/shared/linux_osl.c index 6157d18..8237ec7 100644 --- a/x86-64/src/shared/linux_osl.c +++ b/x86-64/src/shared/linux_osl.c @@ -942,7 +942,7 @@ osl_getcycles(void) void * osl_reg_map(uint32 pa, uint size) { - return (ioremap_nocache((unsigned long)pa, (unsigned long)size)); + return (ioremap((unsigned long)pa, (unsigned long)size)); } void diff --git a/x86-64/src/wl/sys/wl_linux.c b/x86-64/src/wl/sys/wl_linux.c index cbca645..4bb0162 100644 --- a/x86-64/src/wl/sys/wl_linux.c +++ b/x86-64/src/wl/sys/wl_linux.c @@ -582,7 +582,7 @@ wl_attach(uint16 vendor, uint16 device, ulong regs, } wl->bcm_bustype = bustype; - if ((wl->regsva = ioremap_nocache(dev->base_addr, PCI_BAR0_WINSZ)) == NULL) { + if ((wl->regsva = ioremap(dev->base_addr, PCI_BAR0_WINSZ)) == NULL) { WL_ERROR(("wl%d: ioremap() failed\n", unit)); goto fail; } @@ -772,7 +772,7 @@ wl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) if ((val & 0x0000ff00) != 0) pci_write_config_dword(pdev, 0x40, val & 0xffff00ff); bar1_size = pci_resource_len(pdev, 2); - bar1_addr = (uchar *)ioremap_nocache(pci_resource_start(pdev, 2), + bar1_addr = (uchar *)ioremap(pci_resource_start(pdev, 2), bar1_size); wl = wl_attach(pdev->vendor, pdev->device, pci_resource_start(pdev, 0), PCI_BUS, pdev, pdev->irq, bar1_addr, bar1_size); -- 2.20.1 ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0400-kernel-5.9-fix.patch ================================================ --- a/x86-64/src/wl/sys/wl_linux.c 2020-10-12 21:19:15.256305165 +0000 +++ b/x86-64/src/wl/sys/wl_linux.c 2020-10-12 21:20:38.687530895 +0000 @@ -1643,7 +1643,7 @@ goto done2; } - if (segment_eq(get_fs(), KERNEL_DS)) + if (get_fs().seg == KERNEL_DS.seg) buf = ioc.buf; else if (ioc.buf) { ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0500-kernel-5.10-fix.patch ================================================ From: Joan Bruguera Date: Sun, 13 Sep 2020 07:33:32 +0200 Subject: Get rid of get_fs/set_fs calls in Broadcom WL driver. Origin: https://gist.github.com/joanbm/5c640ac074d27fd1d82c74a5b67a1290 Fixes linux-next where get_fs/set_fs is already removed for some architectures. NB: Some checks in wlc_ioctl_internal are likely superfluous, but I'm not familiar enough with the driver to remove them with confidence. See also: https://lwn.net/Articles/722267/ https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/arch/x86/include/asm/uaccess.h?h=next-20200911&id=47058bb54b57962b3958a936ddbc59355e4c5504 https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/include/linux/uaccess.h?h=next-20200911&id=5e6e9852d6f76e01b2e6803c74258afa5b432bc5 Signed-off-by: Joan Bruguera --- x86-64/src/wl/sys/wl_cfg80211_hybrid.c | 29 ++----------------------- x86-64/src/wl/sys/wl_iw.c | 25 ++-------------------- x86-64/src/wl/sys/wl_linux.c | 40 ++++++++++++++++++++++++++++++----- x86-64/src/wl/sys/wl_linux.h | 2 ++ x86-64/src/wl/sys/wlc_pub.h | 1 + 5 files changed, 42 insertions(+), 55 deletions(-) diff --git a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c index 8e01841..111ec5a 100644 --- a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c +++ b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c @@ -41,6 +41,7 @@ #include #include #include +#include #define EVENT_TYPE(e) dtoh32((e)->event_type) #define EVENT_FLAGS(e) dtoh16((e)->flags) @@ -445,30 +445,8 @@ static s32 wl_dev_ioctl(struct net_device *dev, u32 cmd, void *arg, u32 len) { - struct ifreq ifr; - struct wl_ioctl ioc; - mm_segment_t fs; - s32 err = 0; - BUG_ON(len < sizeof(int)); - - memset(&ioc, 0, sizeof(ioc)); - ioc.cmd = cmd; - ioc.buf = arg; - ioc.len = len; - strcpy(ifr.ifr_name, dev->name); - ifr.ifr_data = (caddr_t)&ioc; - - fs = get_fs(); - set_fs(KERNEL_DS); -#if defined(WL_USE_NETDEV_OPS) - err = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE); -#else - err = dev->do_ioctl(dev, &ifr, SIOCDEVPRIVATE); -#endif - set_fs(fs); - - return err; + return wlc_ioctl_internal(dev, cmd, arg, len); } #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) diff --git a/x86-64/src/wl/sys/wl_iw.c b/x86-64/src/wl/sys/wl_iw.c index c4c610b..e346b15 100644 --- a/x86-64/src/wl/sys/wl_iw.c +++ b/x86-64/src/wl/sys/wl_iw.c @@ -37,6 +37,7 @@ typedef const struct si_pub si_t; #include #include +#include extern bool wl_iw_conn_status_str(uint32 event_type, uint32 status, uint32 reason, char* stringBuf, uint buflen); @@ -104,29 +104,7 @@ int len ) { - struct ifreq ifr; - wl_ioctl_t ioc; - mm_segment_t fs; - int ret; - - memset(&ioc, 0, sizeof(ioc)); - ioc.cmd = cmd; - ioc.buf = arg; - ioc.len = len; - - strcpy(ifr.ifr_name, dev->name); - ifr.ifr_data = (caddr_t) &ioc; - - fs = get_fs(); - set_fs(KERNEL_DS); -#if defined(WL_USE_NETDEV_OPS) - ret = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE); -#else - ret = dev->do_ioctl(dev, &ifr, SIOCDEVPRIVATE); -#endif - set_fs(fs); - - return ret; + return wlc_ioctl_internal(dev, cmd, arg, len); } static int diff --git a/x86-64/src/wl/sys/wl_linux.c b/x86-64/src/wl/sys/wl_linux.c index 66069d4..cc01d2b 100644 --- a/x86-64/src/wl/sys/wl_linux.c +++ b/x86-64/src/wl/sys/wl_linux.c @@ -1651,10 +1651,7 @@ goto done2; } - if (get_fs().seg == KERNEL_DS.seg) - buf = ioc.buf; - - else if (ioc.buf) { + if (ioc.buf) { if (!(buf = (void *) MALLOC(wl->osh, MAX(ioc.len, WLC_IOCTL_MAXLEN)))) { bcmerror = BCME_NORESOURCE; goto done2; @@ -1681,7 +1678,7 @@ wl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) WL_UNLOCK(wl); done1: - if (ioc.buf && (ioc.buf != buf)) { + if (ioc.buf) { if (copy_to_user(ioc.buf, buf, ioc.len)) bcmerror = BCME_BADADDR; MFREE(wl->osh, buf, MAX(ioc.len, WLC_IOCTL_MAXLEN)); @@ -1694,6 +1691,39 @@ done2: return (OSL_ERROR(bcmerror)); } +int +wlc_ioctl_internal(struct net_device *dev, int cmd, void *buf, int len) +{ + wl_info_t *wl; + wl_if_t *wlif; + int bcmerror; + + if (!dev) + return -ENETDOWN; + + wl = WL_INFO(dev); + wlif = WL_DEV_IF(dev); + if (wlif == NULL || wl == NULL || wl->dev == NULL) + return -ENETDOWN; + + bcmerror = 0; + + WL_TRACE(("wl%d: wlc_ioctl_internal: cmd 0x%x\n", wl->pub->unit, cmd)); + + WL_LOCK(wl); + if (!capable(CAP_NET_ADMIN)) { + bcmerror = BCME_EPERM; + } else { + bcmerror = wlc_ioctl(wl->wlc, cmd, buf, len, wlif->wlcif); + } + WL_UNLOCK(wl); + + ASSERT(VALID_BCMERROR(bcmerror)); + if (bcmerror != 0) + wl->pub->bcmerror = bcmerror; + return (OSL_ERROR(bcmerror)); +} + static struct net_device_stats* wl_get_stats(struct net_device *dev) { diff --git a/x86-64/src/wl/sys/wl_linux.h b/x86-64/src/wl/sys/wl_linux.h index 5b1048e..c8c1f41 100644 --- a/x86-64/src/wl/sys/wl_linux.h +++ b/x86-64/src/wl/sys/wl_linux.h @@ -22,6 +22,7 @@ #define _wl_linux_h_ #include +#include typedef struct wl_timer { struct timer_list timer; @@ -187,6 +188,7 @@ extern irqreturn_t wl_isr(int irq, void *dev_id, struct pt_regs *ptregs); extern int __devinit wl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent); extern void wl_free(wl_info_t *wl); extern int wl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); +extern int wlc_ioctl_internal(struct net_device *dev, int cmd, void *buf, int len); extern struct net_device * wl_netdev_get(wl_info_t *wl); #endif diff --git a/x86-64/src/wl/sys/wlc_pub.h b/x86-64/src/wl/sys/wlc_pub.h index 53a98b8..2b5a029 100644 --- a/x86-64/src/wl/sys/wlc_pub.h +++ b/x86-64/src/wl/sys/wlc_pub.h @@ -24,6 +24,7 @@ #include #include +#include #include "proto/802.11.h" #include "proto/bcmevent.h" ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0600-kernel-5.17-fix.patch ================================================ From 31b7849092c43805c7fbaf7518b99874aa1b310c Mon Sep 17 00:00:00 2001 From: Joan Bruguera Date: Wed, 12 Jan 2022 20:49:20 +0100 Subject: [PATCH] Tentative fix for broadcom-wl 6.30.223.271 driver for Linux 5.17-rc1 Set netdev->dev_addr through dev_addr_mod + PDE_DATA fix Since Linux 5.17 netdev->dev_addr is const and must be changed through dev_addr_mod, otherwise a warning is logged in dmesg and bad things may happen. NB: The #if is not wrong, dev_addr_mod is defined since Linux 5.15-rc1 Plus a trivial fix for PDE_DATA. Applies on top of all the patches applied to broadcom-wl-dkms 6.30.223.271-28 on Arch Linux. See also: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=adeef3e32146a8d2a73c399dc6f5d76a449131b1 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=359745d78351c6f5442435f81549f0207ece28aa --- src/wl/sys/wl_linux.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/wl/sys/wl_linux.c b/src/wl/sys/wl_linux.c index e491df7..e4614fb 100644 --- a/x86-64/src/wl/sys/wl_linux.c +++ b/x86-64/src/wl/sys/wl_linux.c @@ -93,6 +93,10 @@ struct iw_statistics *wl_get_wireless_stats(struct net_device *dev); #include +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0)) +#define PDE_DATA pde_data +#endif + #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0) static void wl_timer(struct timer_list *tl); #else @@ -490,6 +494,12 @@ wl_if_setup(struct net_device *dev) #endif } +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0) +static inline void eth_hw_addr_set(struct net_device *dev, const void *addr) { + memcpy(dev->dev_addr, addr, ETHER_ADDR_LEN); +} +#endif + static wl_info_t * wl_attach(uint16 vendor, uint16 device, ulong regs, uint bustype, void *btparam, uint irq, uchar* bar1_addr, uint32 bar1_size) @@ -634,7 +644,7 @@ wl_attach(uint16 vendor, uint16 device, ulong regs, WL_ERROR(("wl%d: Error setting MAC ADDRESS\n", unit)); } #endif - bcopy(&wl->pub->cur_etheraddr, dev->dev_addr, ETHER_ADDR_LEN); + eth_hw_addr_set(dev, wl->pub->cur_etheraddr.octet); online_cpus = 1; @@ -1835,7 +1845,7 @@ wl_set_mac_address(struct net_device *dev, void *addr) WL_LOCK(wl); - bcopy(sa->sa_data, dev->dev_addr, ETHER_ADDR_LEN); + eth_hw_addr_set(dev, sa->sa_data); err = wlc_iovar_op(wl->wlc, "cur_etheraddr", NULL, 0, sa->sa_data, ETHER_ADDR_LEN, IOV_SET, (WL_DEV_IF(dev))->wlcif); WL_UNLOCK(wl); @@ -3010,7 +3020,7 @@ _wl_add_monitor_if(wl_task_t *task) else dev->type = ARPHRD_IEEE80211_RADIOTAP; - bcopy(wl->dev->dev_addr, dev->dev_addr, ETHER_ADDR_LEN); + eth_hw_addr_set(dev, wl->dev->dev_addr); #if defined(WL_USE_NETDEV_OPS) dev->netdev_ops = &wl_netdev_monitor_ops; -- 2.35.1 ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0600-kernel-5.18-fix.patch ================================================ diff -Nur a/x86-64/src/shared/linux_osl.c b/x86-64/src/shared/linux_osl.c --- a/x86-64/src/shared/linux_osl.c 2022-04-24 11:17:29.148114284 +0000 +++ b/x86-64/src/shared/linux_osl.c 2022-04-24 11:38:38.493710528 +0000 @@ -600,7 +600,11 @@ if (va) *pap = (ulong)__virt_to_phys(va); #else +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 18, 0) va = pci_alloc_consistent(osh->pdev, size, (dma_addr_t*)pap); +#else + va = dma_alloc_coherent(&((struct pci_dev *)osh->pdev)->dev, size, (dma_addr_t*)pap, GFP_ATOMIC); +#endif #endif return va; } @@ -613,7 +617,11 @@ #ifdef __ARM_ARCH_7A__ kfree(va); #else +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 18, 0) pci_free_consistent(osh->pdev, size, va, (dma_addr_t)pa); +#else + dma_free_coherent(&((struct pci_dev *)osh->pdev)->dev, size, va, (dma_addr_t)pa); +#endif #endif } @@ -623,7 +631,11 @@ int dir; ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 18, 0) dir = (direction == DMA_TX)? PCI_DMA_TODEVICE: PCI_DMA_FROMDEVICE; +#else + dir = (direction == DMA_TX)? DMA_TO_DEVICE: DMA_FROM_DEVICE; +#endif #if defined(__ARM_ARCH_7A__) && defined(BCMDMASGLISTOSL) if (dmah != NULL) { @@ -656,7 +668,12 @@ } #endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 18, 0) return (pci_map_single(osh->pdev, va, size, dir)); +#else + return (dma_map_single(&((struct pci_dev *)osh->pdev)->dev, va, size, dir)); +#endif + return 0; } void BCMFASTPATH @@ -665,8 +681,13 @@ int dir; ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 18, 0) dir = (direction == DMA_TX)? PCI_DMA_TODEVICE: PCI_DMA_FROMDEVICE; pci_unmap_single(osh->pdev, (uint32)pa, size, dir); +#else + dir = (direction == DMA_TX)? DMA_TO_DEVICE: DMA_FROM_DEVICE; + dma_unmap_single(&((struct pci_dev *)osh->pdev)->dev, (uint32)pa, size, dir); +#endif } #if defined(BCMDBG_ASSERT) ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0600-kernel-6.0-fix.patch ================================================ diff -Nur a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c --- a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c 2022-08-15 14:06:51.943852581 +0000 +++ b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c 2022-08-15 14:24:49.917982457 +0000 @@ -2393,8 +2393,13 @@ #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) { struct cfg80211_roam_info roam_info = { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + .links[0].channel = &wl->conf->channel, + .links[0].bssid = (u8 *)&wl->bssid, +#else .channel = &wl->conf->channel, .bssid = (u8 *)&wl->bssid, +#endif .req_ie = conn_info->req_ie, .req_ie_len = conn_info->req_ie_len, .resp_ie = conn_info->resp_ie, ================================================ FILE: packages/linux-drivers/bcm_sta/patches/bcm_sta-0600-kernel-6.1-fix.patch ================================================ --- a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c 2022-10-17 10:58:21.106425299 +0000 +++ b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c 2022-10-18 10:26:53.683025167 +0000 @@ -108,17 +108,30 @@ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38) static s32 wl_cfg80211_config_default_key(struct wiphy *wiphy, - struct net_device *dev, u8 key_idx, bool unicast, bool multicast); + struct net_device *dev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) + int link_id, +#endif + u8 key_idx, bool unicast, bool multicast); #else static s32 wl_cfg80211_config_default_key(struct wiphy *wiphy, struct net_device *dev, u8 key_idx); #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37) static s32 wl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *dev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) + int link_id, +#endif u8 key_idx, bool pairwise, const u8 *mac_addr, struct key_params *params); static s32 wl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *dev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) + int link_id, +#endif u8 key_idx, bool pairwise, const u8 *mac_addr); static s32 wl_cfg80211_get_key(struct wiphy *wiphy, struct net_device *dev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) + int link_id, +#endif u8 key_idx, bool pairwise, const u8 *mac_addr, void *cookie, void (*callback) (void *cookie, struct key_params *params)); #else @@ -1169,7 +1182,11 @@ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38) static s32 wl_cfg80211_config_default_key(struct wiphy *wiphy, - struct net_device *dev, u8 key_idx, bool unicast, bool multicast) + struct net_device *dev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) + int link_id, +#endif + u8 key_idx, bool unicast, bool multicast) #else static s32 wl_cfg80211_config_default_key(struct wiphy *wiphy, @@ -1194,6 +1211,9 @@ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37) static s32 wl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *dev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) + int link_id, +#endif u8 key_idx, bool pairwise, const u8 *mac_addr, struct key_params *params) #else static s32 @@ -1315,6 +1335,9 @@ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37) static s32 wl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *dev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) + int link_id, +#endif u8 key_idx, bool pairwise, const u8 *mac_addr) #else static s32 @@ -1358,6 +1381,9 @@ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37) static s32 wl_cfg80211_get_key(struct wiphy *wiphy, struct net_device *dev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) + int link_id, +#endif u8 key_idx, bool pairwise, const u8 *mac_addr, void *cookie, void (*callback) (void *cookie, struct key_params * params)) #else ================================================ FILE: packages/linux-drivers/mali-bifrost/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mali-bifrost" PKG_VERSION="af7c8d8bcdedd792a8d101d3a11876bb8bcbe3da" # BX301A01B-SW-99002-r16p0-01rel0 PKG_SHA256="712ba83f28bf687e2147f0f586678421b0d2cb5620423e93e7b7c9ddf35c1da5" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://developer.arm.com/products/software/mali-drivers/bifrost-kernel" PKG_URL="https://github.com/LibreELEC/mali-bifrost/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="mali-bifrost: the Linux kernel driver for ARM Mali Bifrost GPUs" PKG_TOOLCHAIN="manual" PKG_IS_KERNEL_PKG="yes" case ${PROJECT} in Amlogic) PKG_MALI_PLATFORM_CONFIG="config.meson-g12a" ;; esac make_target() { kernel_make KDIR=$(kernel_path) -C ${PKG_BUILD} \ CONFIG_NAME=${PKG_MALI_PLATFORM_CONFIG} } makeinstall_target() { DRIVER_DIR=${PKG_BUILD}/driver/product/kernel/drivers/gpu/arm/midgard/ mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} cp ${DRIVER_DIR}/mali_kbase.ko ${INSTALL}/$(get_full_module_dir)/${PKG_NAME}/ } ================================================ FILE: packages/linux-drivers/mali-midgard/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mali-midgard" PKG_VERSION="2c2accf67356463ee661627b8705429256011dcb" # TX011-SW-99002-r28p0-01rel0 PKG_SHA256="506ec1e388f491f53a9acf8ca2077bd135a6d31f688ed7139ed0cd77f5c44d72" 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_LONGDESC="mali-midgard: Linux drivers for Mali Midgard GPUs" PKG_TOOLCHAIN="manual" PKG_IS_KERNEL_PKG="yes" case ${PROJECT} in Allwinner) PKG_CONFIGS="CONFIG_MALI_PLATFORM_NAME=sunxi" ;; 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 } ================================================ FILE: packages/linux-drivers/mali-utgard/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mali-utgard" PKG_VERSION="e8419af528f62a7e44c966b6853b59a2e78c47bf" PKG_SHA256="18e034cf2b131fa54c5579534ee09e5a054906051130e5e425d6d49f8d8f9eca" 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_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 } ================================================ FILE: packages/linux-firmware/brcmfmac_sdio-firmware/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="brcmfmac_sdio-firmware" PKG_VERSION="c70355f9ec6d015b91a5c3199aa08b433e2f7caf" PKG_SHA256="1a17f203d77590a1492e8fb156091caafcdec1c66b3df9152f42414892fa6471" 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" PKG_LONGDESC="Broadcom SDIO firmware used with LibreELEC" PKG_TOOLCHAIN="manual" post_makeinstall_target() { FW_TARGET_DIR=${INSTALL}/$(get_full_firmware_dir) if find_file_path firmwares/${PKG_NAME}.dat; then FW_LISTS="${FOUND_PATH}" else FW_LISTS="${PKG_DIR}/firmwares/any.dat ${PKG_DIR}/firmwares/${TARGET_ARCH}.dat" fi for fwlist in ${FW_LISTS}; do [ -f ${fwlist} ] || continue while read -r fwline; do [ -z "${fwline}" ] && continue [[ ${fwline} =~ ^#.* ]] && continue [[ ${fwline} =~ ^[[:space:]] ]] && continue for fwfile in $(cd ${PKG_BUILD} && eval "find ${fwline}"); do [ -d ${PKG_BUILD}/${fwfile} ] && continue if [ -f ${PKG_BUILD}/${fwfile} ]; then mkdir -p $(dirname ${FW_TARGET_DIR}/brcm/${fwfile}) cp -Lv ${PKG_BUILD}/${fwfile} ${FW_TARGET_DIR}/brcm/${fwfile} else echo "ERROR: Firmware file ${fwfile} does not exist - aborting" exit 1 fi done done < ${fwlist} done mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/brcmfmac-firmware-setup ${INSTALL}/usr/bin } post_install() { enable_service brcmfmac-firmware.service } ================================================ FILE: packages/linux-firmware/brcmfmac_sdio-firmware/scripts/brcmfmac-firmware-setup ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) DTNAME=$(/usr/bin/dtname) if [ "$DTNAME" = "khadas,vim" -o \ "$DTNAME" = "xunlong,orangepi-win" -o \ "$DTNAME" = "sinovoip,bpi-m2-ultra" -o \ "$DTNAME" = "sinovoip,bpi-m2-zero" ]; then ln -sf /usr/lib/kernel-overlays/base/lib/firmware/brcm/BCM43430A1.vim /usr/lib/firmware/brcm/BCM43430A1.hcd else ln -sf /usr/lib/kernel-overlays/base/lib/firmware/brcm/BCM43430A1.def /usr/lib/firmware/brcm/BCM43430A1.hcd fi ================================================ FILE: packages/linux-firmware/brcmfmac_sdio-firmware/system.d/brcmfmac-firmware.service ================================================ [Unit] Description=Broadcom SDIO Firmware Symlink Service Before=kodi.service [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/sh -c "/usr/bin/brcmfmac-firmware-setup" [Install] WantedBy=local-fs.target ================================================ FILE: packages/linux-firmware/brcmfmac_sdio-firmware-imx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="brcmfmac_sdio-firmware-imx" PKG_VERSION="0.1" PKG_SHA256="4c8ed8ae39ecd05d7e3aeebc98cf230912cdcc887fa78d5112f981b6f9358b6e" PKG_LICENSE="GPL" PKG_SITE="https://github.com/LibreELEC/LibreELEC.tv" PKG_URL="${DISTRO_SRC}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Firmware for brcm bluetooth chips used in some Freescale iMX based devices." makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -av brcm_patchram_plus ${INSTALL}/usr/bin/ mkdir -p ${INSTALL}/$(get_kernel_overlay_dir)/lib/firmware/ cp -av firmware/brcm ${INSTALL}/$(get_kernel_overlay_dir)/lib/firmware/ } ================================================ FILE: packages/linux-firmware/brcmfmac_sdio-firmware-imx/system.d/brcmfmac_sdio-firmware@.service ================================================ [Unit] Description=Broadcom sdio firmware update for %I ConditionPathExists=/dev/ttymxc3 [Service] Type=simple RemainAfterExit=yes ExecStart=/usr/bin/brcm_patchram_plus --patchram /lib/firmware/brcm/%I.hcd --baudrate 3000000 --use_baudrate_for_download /dev/ttymxc3 --enable_hci --no2bytes --tosleep=50000 ================================================ FILE: packages/linux-firmware/brcmfmac_sdio-firmware-imx/udev.d/80-brcmfmac_sdio.rules ================================================ ################################################################################ # udev rules file for loading brcmfmac_sdio-firmware ################################################################################ ACTION!="add", GOTO="end" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x02d0", ATTRS{device}=="0x4329", GOTO="begin" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x02d0", ATTRS{device}=="0x4330", GOTO="begin" GOTO="end" LABEL="begin" ### Broadcom bcm4330 bluetooth device ATTRS{vendor}=="0x02d0", ATTRS{device}=="0x4330", \ ENV{brcm_device}="bcm4330" ### Broadcom bcm4329 bluetooth device ATTRS{vendor}=="0x02d0", ATTRS{device}=="0x4329", \ ENV{brcm_device}="bcm4329" ENV{brcm_device}=="bcm43*", ACTION=="add", \ TAG+="systemd", ENV{SYSTEMD_WANTS}+="brcmfmac_sdio-firmware@$env{brcm_device}.service" LABEL="end" ================================================ FILE: packages/linux-firmware/brcmfmac_sdio-firmware-rpi/package.mk ================================================ # 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) PKG_NAME="brcmfmac_sdio-firmware-rpi" PKG_VERSION="a25c7c3d04db0363409dfd17f265bab66f0eae5a" PKG_SHA256="1caa1be79a3050f02f7c4950caa8007220fcc486ebc181a54ae6e4b07af34795" PKG_LICENSE="GPL" PKG_SITE="https://github.com/LibreELEC/LibreELEC.tv" PKG_URL="https://github.com/LibreELEC/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Firmware for brcm bluetooth chips used on RaspberryPi devices." PKG_TOOLCHAIN="manual" makeinstall_target() { DESTDIR=${INSTALL}/$(get_kernel_overlay_dir) ./install } ================================================ FILE: packages/linux-firmware/dvb-firmware/package.mk ================================================ # 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) PKG_NAME="dvb-firmware" PKG_VERSION="a68fb22f4e7c1489751df2a65d0d690a449083b0" PKG_SHA256="a64dd4c200aa00142dc27796d1509b7ca25bd44c5b7aebe780ca293f97402706" PKG_LICENSE="Free-to-use" PKG_SITE="https://github.com/LibreELEC/dvb-firmware" PKG_URL="https://github.com/LibreELEC/dvb-firmware/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="dvb-firmware: firmwares for various DVB drivers" PKG_TOOLCHAIN="manual" makeinstall_target() { PKG_FW_DIR="${INSTALL}/$(get_kernel_overlay_dir)/lib/firmware" mkdir -p "${PKG_FW_DIR}" cp -a "${PKG_BUILD}/firmware/"* "${PKG_FW_DIR}" } ================================================ FILE: packages/linux-firmware/firmware-dragonboard/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="firmware-dragonboard" PKG_VERSION="1.4.0" PKG_SHA256="822d2f8506d9657dbce6aa2bfce81ccbf97dcfc40831b70703b14b3f296fa4c0" PKG_ARCH="aarch64 arm" PKG_LICENSE="proprietary" PKG_SITE="https://developer.qualcomm.com/" PKG_URL="https://developer.qualcomm.com/download/db410c/firmware-410c-${PKG_VERSION}.bin" PKG_DEPENDS_TARGET="toolchain dosfstools:host" PKG_LONGDESC="Additional firmware for Dragonboard 410c" PKG_TOOLCHAIN="manual" unpack() { mkdir -p ${PKG_BUILD} cd ${PKG_BUILD} sh ${SOURCES}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.bin --auto-accept } make_target() { : } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_firmware_dir)/qcom/venus-1.8/ cp -a linux-board-support-package-v${PKG_VERSION%.0}/proprietary-linux/* ${INSTALL}/$(get_full_firmware_dir) cp -a linux-board-support-package-v${PKG_VERSION%.0}/proprietary-linux/venus* ${INSTALL}/$(get_full_firmware_dir)/qcom/venus-1.8/ rm ${INSTALL}/$(get_full_firmware_dir)/firmware.tar MTOOLS_SKIP_CHECK=1 mcopy -n -i linux-board-support-package-v${PKG_VERSION%.0}/bootloaders-linux/NON-HLOS.bin \ ::image/modem.* \ ::image/mba.mbn \ ::image/wcnss.* \ ${INSTALL}/$(get_full_firmware_dir) } ================================================ FILE: packages/linux-firmware/firmware-imx/package.mk ================================================ # 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="firmware-imx" PKG_VERSION="8.17" PKG_SHA256="1ee3c49ad8749867487f09d6e4472536fb809b667c1bb3c56511175b8974e3c6" PKG_ARCH="arm" PKG_LICENSE="other" PKG_SITE="http://www.freescale.com" PKG_URL="https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/${PKG_NAME}-${PKG_VERSION}.bin" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="firmware-imx: Freescale IMX firmware such as for the VPU" PKG_TOOLCHAIN="manual" unpack() { cd $(dirname ${PKG_BUILD}) sh ${SOURCES}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.bin --auto-accept } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_firmware_dir)/imx/sdma cp -P firmware/sdma/sdma-imx6q.bin ${INSTALL}/$(get_full_firmware_dir)/imx/sdma cp -P firmware/sdma/sdma-imx7d.bin ${INSTALL}/$(get_full_firmware_dir)/imx/sdma mkdir -p ${INSTALL}/$(get_full_firmware_dir)/vpu cp -P firmware/vpu/vpu_fw_imx6d.bin ${INSTALL}/$(get_full_firmware_dir)/vpu cp -P firmware/vpu/vpu_fw_imx6q.bin ${INSTALL}/$(get_full_firmware_dir)/vpu cp -P firmware/vpu/vpu_fw_imx8_dec.bin ${INSTALL}/$(get_full_firmware_dir)/vpu } ================================================ FILE: packages/linux-firmware/intel-ucode/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="intel-ucode" PKG_VERSION="20230613" PKG_SHA256="894d822d2347222a2595d4fc47d358e01d35a54780123100c317dfc31b1b0cc9" PKG_ARCH="x86_64" PKG_LICENSE="other" PKG_SITE="https://downloadcenter.intel.com/search?keyword=linux+microcode" PKG_URL="https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/archive/microcode-${PKG_VERSION}.tar.gz" PKG_LONGDESC="intel-ucode: Intel CPU microcodes" PKG_TOOLCHAIN="manual" ================================================ FILE: packages/linux-firmware/intel-ucode/sources/intel-microcode2ucode.c ================================================ /* * Convert Intel microcode.dat into a single binary microcode.bin file * * Based on code by Kay Sievers * Changed to create a single file by Thomas Bächler */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #include #include #include #include #include #include #include #include #include #include #include struct microcode_header_intel { unsigned int hdrver; unsigned int rev; unsigned int date; unsigned int sig; unsigned int cksum; unsigned int ldrver; unsigned int pf; unsigned int datasize; unsigned int totalsize; unsigned int reserved[3]; }; union mcbuf { struct microcode_header_intel hdr; unsigned int i[0]; char c[0]; }; int main(int argc, char *argv[]) { const char *filename = "/lib/firmware/microcode.dat"; FILE *f; char line[LINE_MAX]; char buf[4000000]; union mcbuf *mc; size_t bufsize, count, start; int rc = EXIT_SUCCESS; if (argv[1] != NULL) filename = argv[1]; count = 0; mc = (union mcbuf *) buf; f = fopen(filename, "re"); if (f == NULL) { printf("open %s: %m\n", filename); rc = EXIT_FAILURE; goto out; } while (fgets(line, sizeof(line), f) != NULL) { if (sscanf(line, "%x, %x, %x, %x", &mc->i[count], &mc->i[count + 1], &mc->i[count + 2], &mc->i[count + 3]) != 4) continue; count += 4; } fclose(f); bufsize = count * sizeof(int); printf("%s: %lu(%luk) bytes, %zu integers\n", filename, bufsize, bufsize / 1024, count); if (bufsize < sizeof(struct microcode_header_intel)) goto out; f = fopen("microcode.bin", "we"); if (f == NULL) { printf("open microcode.bin: %m\n"); rc = EXIT_FAILURE; goto out; } start = 0; for (;;) { size_t size; unsigned int family, model, stepping; unsigned int year, month, day; mc = (union mcbuf *) &buf[start]; if (mc->hdr.totalsize) size = mc->hdr.totalsize; else size = 2000 + sizeof(struct microcode_header_intel); if (mc->hdr.ldrver != 1 || mc->hdr.hdrver != 1) { printf("unknown version/format:\n"); rc = EXIT_FAILURE; break; } /* * 0- 3 stepping * 4- 7 model * 8-11 family * 12-13 type * 16-19 extended model * 20-27 extended family */ family = (mc->hdr.sig >> 8) & 0xf; if (family == 0xf) family += (mc->hdr.sig >> 20) & 0xff; model = (mc->hdr.sig >> 4) & 0x0f; if (family == 0x06) model += ((mc->hdr.sig >> 16) & 0x0f) << 4; stepping = mc->hdr.sig & 0x0f; year = mc->hdr.date & 0xffff; month = mc->hdr.date >> 24; day = (mc->hdr.date >> 16) & 0xff; printf("\n"); printf("signature: 0x%02x\n", mc->hdr.sig); printf("flags: 0x%02x\n", mc->hdr.pf); printf("revision: 0x%02x\n", mc->hdr.rev); printf("date: %04x-%02x-%02x\n", year, month, day); printf("size: %zu\n", size); if (fwrite(mc, size, 1, f) != 1) { printf("write microcode.bin: %m\n"); rc = EXIT_FAILURE; goto out; } start += size; if (start >= bufsize) break; } fclose(f); printf("\n"); out: return rc; } ================================================ FILE: packages/linux-firmware/iwlwifi-firmware/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="iwlwifi-firmware" PKG_VERSION="2eb6baa08b3a3c9bf3f9f12ec6d9b94eca1d36e7" PKG_SHA256="2641d8587536f646e28468dad6cda962fbdee9c45571075546135c4ca8776162" 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" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="iwlwifi-firmware: firmwares for various Intel WLAN drivers" PKG_TOOLCHAIN="manual" makeinstall_target() { DESTDIR=${INSTALL}/$(get_kernel_overlay_dir) ./install } ================================================ FILE: packages/linux-firmware/kernel-firmware/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="kernel-firmware" PKG_VERSION="20250708" PKG_SHA256="6f3efee7f600c201f9b2d675889a4ccdb8cfe56e0d283641796ed10e64c72047" PKG_LICENSE="other" PKG_SITE="https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/" PKG_URL="https://cdn.kernel.org/pub/linux/kernel/firmware/linux-firmware-${PKG_VERSION}.tar.xz" PKG_NEED_UNPACK="${PROJECT_DIR}/${PROJECT}/packages/${PKG_NAME} ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/packages/${PKG_NAME}" PKG_LONGDESC="kernel-firmware: kernel related firmware" PKG_TOOLCHAIN="manual" configure_package() { PKG_FW_SOURCE=${PKG_BUILD}/.copied-firmware } post_patch() { ( cd ${PKG_BUILD} # Do not run check_whence.py against the copied firmware echo '#!/usr/bin/python3' > check_whence.py mkdir -p "${PKG_FW_SOURCE}" ./copy-firmware.sh --verbose "${PKG_FW_SOURCE}" # copy extra firmware files (or overwrite upstream ones) if [ -d ${PKG_DIR}/extra-firmware ]; then cp -r ${PKG_DIR}/extra-firmware/* "${PKG_FW_SOURCE}" fi ) } # Install additional miscellaneous drivers makeinstall_target() { FW_TARGET_DIR=${INSTALL}/$(get_full_firmware_dir) if find_file_path config/kernel-firmware.dat; then FW_LISTS="${FOUND_PATH}" else FW_LISTS="${PKG_DIR}/firmwares/any.dat ${PKG_DIR}/firmwares/${TARGET_ARCH}.dat" fi FW_LISTS+=" ${PROJECT_DIR}/${PROJECT}/config/kernel-firmware-any.dat ${PROJECT_DIR}/${PROJECT}/config/kernel-firmware-${TARGET_ARCH}.dat" FW_LISTS+=" ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/config/kernel-firmware-any.dat ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/config/kernel-firmware-${TARGET_ARCH}.dat" for fwlist in ${FW_LISTS}; do [ -f "${fwlist}" ] || continue while read -r fwline; do [ -z "${fwline}" ] && continue [[ ${fwline} =~ ^#.* ]] && continue [[ ${fwline} =~ ^[[:space:]] ]] && continue eval "(cd ${PKG_FW_SOURCE} && find "${fwline}" >/dev/null)" || die "ERROR: Firmware pattern does not exist: ${fwline}" while read -r fwfile; do [ -d "${PKG_FW_SOURCE}/${fwfile}" ] && continue if [ -f "${PKG_FW_SOURCE}/${fwfile}" ]; then mkdir -p "$(dirname "${FW_TARGET_DIR}/${fwfile}")" cp -Lv "${PKG_FW_SOURCE}/${fwfile}" "${FW_TARGET_DIR}/${fwfile}" else echo "ERROR: Firmware file ${fwfile} does not exist - aborting" exit 1 fi done <<<"$(cd ${PKG_FW_SOURCE} && eval "find "${fwline}"")" done <"${fwlist}" done PKG_KERNEL_CFG_FILE=$(kernel_config_path) || die # The following files are RPi specific and installed by brcmfmac_sdio-firmware-rpi instead. # They are also not required at all if the kernel is not suitably configured. if listcontains "${FIRMWARE}" "brcmfmac_sdio-firmware-rpi" || ! grep -q "^CONFIG_BRCMFMAC_SDIO=y" ${PKG_KERNEL_CFG_FILE}; then rm -fr ${FW_TARGET_DIR}/brcm/brcmfmac43430*-sdio.* rm -fr ${FW_TARGET_DIR}/brcm/brcmfmac43455*-sdio.* fi # brcm pcie firmware is only needed by x86_64 [ "${TARGET_ARCH}" != "x86_64" ] && rm -fr ${FW_TARGET_DIR}/brcm/*-pcie.* # Cleanup - which may be project or device specific find_file_path scripts/cleanup.sh && ${FOUND_PATH} ${FW_TARGET_DIR} || true } ================================================ FILE: packages/linux-firmware/misc-firmware/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="misc-firmware" PKG_VERSION="868fb584096c17ddcbc85e472e71f9b8d27da91f" PKG_SHA256="862a5a62b9794d7c6753ac0f7ae03fd34ee2564199afd61c42dc8f69d4c5b876" PKG_LICENSE="Free-to-use" PKG_SITE="https://github.com/LibreELEC/misc-firmware" PKG_URL="https://github.com/LibreELEC/misc-firmware/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kernel-firmware" PKG_LONGDESC="misc-firmware: firmwares for various drivers" PKG_TOOLCHAIN="manual" makeinstall_target() { DESTDIR=${INSTALL}/$(get_kernel_overlay_dir) ./install } ================================================ FILE: packages/linux-firmware/rtl8723bs_bt/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rtl8723bs_bt" PKG_VERSION="09eb91f52a639ec5e4c5c4c98dc2afede046cf20" PKG_SHA256="4bb8483c4a14a9e0dfc4a6ddca18486caab5f361be2441b91e9e2a399ca9f33e" PKG_LICENSE="GPL" PKG_SITE="https://github.com/lwfinger/rtl8723bs_bt" PKG_URL="https://github.com/lwfinger/rtl8723bs_bt/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="rtl8723bs_bt Linux firmware" ================================================ FILE: packages/linux-firmware/rtl8723bs_bt/patches/rtl8723bs_bt-001-Makefile.patch ================================================ diff --git a/Makefile b/Makefile index 52506b9..fd196f3 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,15 @@ rtk_hciattach:hciattach.c hciattach_rtk.o - cc -o rtk_hciattach hciattach.c hciattach_rtk.o + $(CC) $(CFLAGS) $(LDFLAGS) -o rtk_hciattach hciattach.c hciattach_rtk.o hciattach_rtk.o:hciattach_rtk.c - cc -c hciattach_rtk.c + $(CC) $(CFLAGS) $(LDFLAGS) -c hciattach_rtk.c -clean: - rm -f *.o rtk_hciattach +all: + rtk_hciattach install: - mkdir -p /lib/firmware/rtl_bt - cp -p rtlbt_* /lib/firmware/rtl_bt/. + mkdir -p $(DESTDIR)/usr/bin + cp -P rtk_hciattach $(DESTDIR)/usr/bin + +clean: + rm -f *.o rtk_hciattach ================================================ FILE: packages/linux-firmware/rtl8723bs_bt/patches/rtl8723bs_bt-002-firmware_path.patch ================================================ --- a/hciattach_rtk.c 2016-07-18 00:47:52.000000000 +0100 +++ b/hciattach_rtk.c 2017-12-15 04:27:39.481299996 +0000 @@ -1419,7 +1419,7 @@ int ret = 0; struct stat st; - ret = sprintf(firmware_file_name, FIRMWARE_DIRECTORY"rtlbt_fw"); + ret = sprintf(firmware_file_name, FIRMWARE_DIRECTORY"rtl8723b_fw"); return firmware_file_name; } @@ -1504,7 +1504,7 @@ int ret = 0; int i = 0; - ret = sprintf(bt_config_file_name, BT_CONFIG_DIRECTORY"rtlbt_config"); + ret = sprintf(bt_config_file_name, BT_CONFIG_DIRECTORY"rtl8723b_config"); if (stat(bt_config_file_name, &st) < 0) { RS_ERR("can't access bt config file:%s, errno:%d\n", bt_config_file_name, errno); return -1; ================================================ FILE: packages/linux-firmware/rtl8723bs_bt/system.d/rtl8723bs_bt-firmware.service ================================================ [Unit] Description=Realtek sdio firmware update [Service] Type=simple RemainAfterExit=yes EnvironmentFile=/usr/share/bttty.conf ExecStart=/usr/bin/rtk_hciattach -n -s 115200 ${BTTTY} rtk_h5 2000000 ================================================ FILE: packages/linux-firmware/rtl8723bs_bt/udev.d/80-rtl8723_bt.rules ================================================ ################################################################################ # udev rules file for loading rtl8723bs_bt-firmware ################################################################################ ACTION!="add", GOTO="end" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x024c", ATTRS{device}=="0xb723", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rtl8723bs_bt-firmware.service" GOTO="end" LABEL="end" ================================================ FILE: packages/linux-firmware/wlan-firmware/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="wlan-firmware" PKG_VERSION="c0ad2587a8037ca430fd887602bd739d769fdbc5" PKG_SHA256="cd019a209f1dd0c76caa9cf382231e86ef07e4448ff3c81b3d1d76b6bde6ca67" PKG_LICENSE="Free-to-use" PKG_SITE="https://github.com/LibreELEC/wlan-firmware" PKG_URL="https://github.com/LibreELEC/wlan-firmware/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="wlan-firmware: firmwares for various WLAN drivers" PKG_TOOLCHAIN="manual" makeinstall_target() { DESTDIR=${INSTALL}/$(get_kernel_overlay_dir) ./install } ================================================ FILE: packages/mediacenter/JsonSchemaBuilder/package.mk ================================================ # 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="JsonSchemaBuilder" PKG_VERSION="0" PKG_LICENSE="GPL" PKG_SITE="http://www.kodi.tv" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_UNPACK="${MEDIACENTER}" PKG_LONGDESC="kodi-platform:" PKG_CMAKE_SCRIPT="$(get_build_dir ${MEDIACENTER})/tools/depends/native/JsonSchemaBuilder/CMakeLists.txt" PKG_CMAKE_OPTS_HOST="-Wno-dev" makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp JsonSchemaBuilder ${TOOLCHAIN}/bin } ================================================ FILE: packages/mediacenter/LibreELEC-settings/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="LibreELEC-settings" PKG_VERSION="b920d5d83a8a7445d121d2f920169444111bf93c" PKG_SHA256="d8147068b6172250d98d41fafd7d6dbaa286074932b537214bf0dab95fe9e99a" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" PKG_URL="https://github.com/LibreELEC/service.libreelec.settings/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 connman dbussy" PKG_LONGDESC="LibreELEC-settings: is a settings dialog for LibreELEC" PKG_MAKE_OPTS_TARGET="ADDON_VERSION=${OS_VERSION} \ DISTRONAME=${DISTRONAME} \ ROOT_PASSWORD=${ROOT_PASSWORD}" if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" setxkbmap" else PKG_DEPENDS_TARGET+=" bkeymaps" fi post_makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libreelec cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/lib/libreelec sed -e "s/@DISTRONAME@/${DISTRONAME}/g" \ -i ${INSTALL}/usr/lib/libreelec/backup-restore sed -e "s/@DISTRONAME@/${DISTRONAME}/g" \ -i ${INSTALL}/usr/lib/libreelec/factory-reset ADDON_INSTALL_DIR=${INSTALL}/usr/share/kodi/addons/service.libreelec.settings python_compile ${ADDON_INSTALL_DIR}/resources/lib/ } post_install() { enable_service backup-restore.service enable_service factory-reset.service } ================================================ FILE: packages/mediacenter/LibreELEC-settings/scripts/backup-restore ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) . /usr/lib/libreelec/functions hidecursor BACKUP_EXTENSION_LIST=".tar .tar.gz .tar.bz2 .tar.xz" for EXTENSION in $BACKUP_EXTENSION_LIST; do BACKUP_FILE=$(find /storage/.restore/ -name "*${EXTENSION}" -print -quit 2>/dev/null) [ -n "${BACKUP_FILE}" ] && break done if [ -f "${BACKUP_FILE}" ]; then echo -e "RESTORE IN PROGRESS\n" echo -e "Please do not reboot or turn off your @DISTRONAME@ device!\n" StartProgress spinner "Checking backup file... " tar tf "${BACKUP_FILE}" &>/dev/null if [ $? -eq 0 ]; then StopProgress "OK" echo -e "\nThis may take some time to complete, please be patient.\n" StartProgress spinner "Restoring... " rm -rf /storage/.kodi \ /storage/.cache \ /storage/.config &>/dev/null tar xf "${BACKUP_FILE}" -C / &>/dev/null rm -f "${BACKUP_FILE}" &>/dev/null sync StopProgress "done!" echo StartProgress countdown "Rebooting in 5s... " 5 "NOW" else StopProgress "FAILED" echo -e "\nBackup file is not valid, or corrupt.\n" StartProgress spinner "Removing file to allow normal restart... " rm -f "${BACKUP_FILE}" &>/dev/null sync StopProgress "done" echo StartProgress countdown "Rebooting in 30s... " 30 "NOW" fi fi reboot -f ================================================ FILE: packages/mediacenter/LibreELEC-settings/scripts/factory-reset ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) . /usr/lib/libreelec/functions hidecursor label="" target="" uuid="" get_target() { for arg in $(cat /proc/cmdline); do case $arg in disk=*) disk="${arg#*=}" case $disk in LABEL=*) label="${disk#*=}" target="$(blkid -L ${label})" ;; UUID=*) uuid="${disk#*=}" target="$(blkid -U ${uuid})" ;; /*) target="$disk" ;; esac ;; esac done } show_reset_msg() { echo -e "RESET IN PROGRESS\n" echo -e "Please do not reboot or turn off your @DISTRONAME@ device!\n" } if [ -f /storage/.cache/reset_hard ]; then # hard reset rm -f /storage/.cache/reset_hard get_target if [ -n "${target}" ]; then show_reset_msg StartProgress spinner "Performing hard reset... " if [ -b "${target}" -a $(blkid -o value -s TYPE "${target}") = "ext4" ]; then umount /storage/ mke2fs -t ext4 -m 0 "${target}" &>/dev/null if [ -n "${label}" ]; then tune2fs -U random -L "${label}" "${target}" &>/dev/null fi if [ -n "${uuid}" ]; then tune2fs -U "${uuid}" "${target}" &>/dev/null fi else find /storage/ -mindepth 1 -delete fi StopProgress "done!" echo StartProgress countdown "Rebooting in 5s... " 5 "NOW" fi elif [ -f /storage/.cache/reset_soft ]; then # soft reset rm -f /storage/.cache/reset_soft get_target if [ -n "${target}" ]; then show_reset_msg StartProgress spinner "Performing soft reset... " find /storage/.cache/ /storage/.config/ /storage/.kodi/ -mindepth 1 -delete StopProgress "done!" echo StartProgress countdown "Rebooting in 5s... " 5 "NOW" fi fi sync reboot -f ================================================ FILE: packages/mediacenter/LibreELEC-settings/system.d/backup-restore.service ================================================ [Unit] Description=Restoring Backup DefaultDependencies=no [Service] Type=idle ExecStart=/usr/lib/libreelec/backup-restore StandardInput=tty-force StandardOutput=inherit StandardError=inherit ================================================ FILE: packages/mediacenter/LibreELEC-settings/system.d/backup-restore.target ================================================ [Unit] Description=Restoring Backup target Requires=backup-restore.service After=backup-restore.service AllowIsolate=yes ================================================ FILE: packages/mediacenter/LibreELEC-settings/system.d/factory-reset.service ================================================ [Unit] Description=Factory reset DefaultDependencies=no [Service] Type=idle ExecStart=/usr/lib/libreelec/factory-reset StandardInput=tty-force StandardOutput=inherit StandardError=inherit ================================================ FILE: packages/mediacenter/LibreELEC-settings/system.d/factory-reset.target ================================================ [Unit] Description=Factory reset target Requires=factory-reset.service After=factory-reset.service AllowIsolate=yes ================================================ FILE: packages/mediacenter/TexturePacker/package.mk ================================================ # 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="TexturePacker" PKG_VERSION="0" PKG_LICENSE="GPL" PKG_SITE="http://www.kodi.tv" PKG_DEPENDS_HOST="lzo:host libpng:host libjpeg-turbo:host giflib:host" PKG_DEPENDS_UNPACK="${MEDIACENTER}" PKG_LONGDESC="kodi-platform:" PKG_CMAKE_SCRIPT="$(get_build_dir ${MEDIACENTER})/tools/depends/native/TexturePacker/CMakeLists.txt" PKG_CMAKE_OPTS_HOST="-Wno-dev" pre_configure_host() { export CXXFLAGS="${CXXFLAGS} -std=c++11 -DTARGET_POSIX -DTARGET_LINUX -D_LINUX -I$(get_build_dir ${MEDIACENTER})/xbmc/platform/linux" } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp TexturePacker ${TOOLCHAIN}/bin } ================================================ FILE: packages/mediacenter/kodi/config/70-libinput-ignore-power-button.rules ================================================ # Ignore power button input devices in libinput so logind can handle them ACTION=="remove", GOTO="end" SUBSYSTEM!="input", GOTO="end" KERNEL!="event*", GOTO="end" IMPORT{parent}="KEY" # match devices that only generate KEY_POWER (code 116) events ENV{KEY}=="10000000000000 0", ENV{LIBINPUT_IGNORE_DEVICE}="1" # 32bit systems report the bitmap in 32bit chunks ENV{KEY}=="100000 0 0 0", ENV{LIBINPUT_IGNORE_DEVICE}="1" LABEL="end" ================================================ FILE: packages/mediacenter/kodi/config/advancedsettings.xml ================================================ /usr/bin/cputemp /usr/bin/gputemp false 1 ================================================ FILE: packages/mediacenter/kodi/config/appliance-gbm-generic.xml ================================================
true
================================================ FILE: packages/mediacenter/kodi/config/appliance-gbm.xml ================================================
true true 0 true
================================================ FILE: packages/mediacenter/kodi/config/appliance.xml ================================================
false
false 2 20 /storage/screenshots/
true 0
true true false /usr/bin/setwakeup.sh
================================================ FILE: packages/mediacenter/kodi/config/guisettings.xml ================================================ 2 ================================================ FILE: packages/mediacenter/kodi/config/kodi.conf.in ================================================ KODI_AE_SINK=@KODI_AE_SINK@ HOME=/storage KODI_TEMP=/storage/.kodi/temp KODI_HOME=/usr/share/kodi/ ================================================ FILE: packages/mediacenter/kodi/config/network_wait ================================================ WAIT_NETWORK="true" WAIT_NETWORK_TIME="10" WAIT_NETWORK_DEFAULT="true" ================================================ FILE: packages/mediacenter/kodi/config/repository.libreelec.tv/addon.xml ================================================  @ADDON_URL@/addons.xml.gz @ADDON_URL@/addons.xml.gz.sha256 @ADDON_URL@ false LibreELEC Add-ons The LibreELEC add-on repository contains Kodi PVR Clients and Servers, Screensavers, Visualisations, and more. Add-ons in this repository are maintained and supported by LibreELEC staff and YOU the community. If you find a broken or non-working add-on please report it via the forums, or help by submitting fixes via GitHub. all ================================================ FILE: packages/mediacenter/kodi/config/sources.xml ================================================ Music /storage/music/ true Pictures /storage/pictures/ true ================================================ FILE: packages/mediacenter/kodi/debug.d/kodi.conf ================================================ KODI_DEBUG="--debug" ================================================ FILE: packages/mediacenter/kodi/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="kodi" PKG_VERSION="20.3-Nexus" PKG_SHA256="1dbf1d9f4d5eeeb6aa2593813703343a8a377e88a00c68226354e4d67467f64d" PKG_LICENSE="GPL" PKG_SITE="http://www.kodi.tv" PKG_URL="https://github.com/xbmc/xbmc/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain JsonSchemaBuilder:host TexturePacker:host Python3 zlib systemd lzo pcre swig:host libass curl fontconfig fribidi tinyxml libjpeg-turbo freetype libcdio taglib libxml2 libxslt rapidjson sqlite ffmpeg crossguid libdvdnav libfmt lirc libfstrcmp flatbuffers:host flatbuffers libudfread spdlog" PKG_DEPENDS_HOST="toolchain" PKG_LONGDESC="A free and open source cross-platform media player." PKG_BUILD_FLAGS="+speed" configure_package() { # Single threaded LTO is very slow so rely on Kodi for parallel LTO support if [ "${LTO_SUPPORT}" = "yes" ] && ! build_with_debug; then PKG_KODI_USE_LTO="-DUSE_LTO=${CONCURRENCY_MAKE_LEVEL}" fi # Set linker options case $(get_target_linker) in gold) PKG_KODI_LINKER="-DENABLE_GOLD=ON \ -DENABLE_MOLD=OFF" ;; mold) PKG_KODI_LINKER="-DENABLE_GOLD=OFF \ -DENABLE_MOLD=ON \ -DMOLD_EXECUTABLE=${TOOLCHAIN}/${TARGET_NAME}/bin/mold" ;; *) PKG_KODI_LINKER="-DENABLE_GOLD=OFF \ -DENABLE_MOLD=OFF" ;; esac get_graphicdrivers if [ "${TARGET_ARCH}" = "x86_64" ]; then PKG_DEPENDS_TARGET+=" pciutils" fi PKG_DEPENDS_TARGET+=" dbus" if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" libX11 libXext libdrm libXrandr" KODI_PLATFORM="-DCORE_PLATFORM_NAME=x11 \ -DAPP_RENDER_SYSTEM=gl" elif [ "${DISPLAYSERVER}" = "wl" ]; then PKG_DEPENDS_TARGET+=" wayland waylandpp" PKG_PATCH_DIRS+=" wayland" CFLAGS+=" -DEGL_NO_X11" CXXFLAGS+=" -DEGL_NO_X11" KODI_PLATFORM="-DCORE_PLATFORM_NAME=wayland \ -DAPP_RENDER_SYSTEM=gles \ -DWAYLANDPP_SCANNER=${TOOLCHAIN}/bin/wayland-scanner++ \ -DWAYLANDPP_PROTOCOLS_DIR=${SYSROOT_PREFIX}/usr/share/waylandpp/protocols" fi if [ ! "${OPENGL}" = "no" ]; then PKG_DEPENDS_TARGET+=" ${OPENGL} glu" fi if [ "${OPENGLES_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi if [ "${KODI_ALSA_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" alsa-lib" KODI_ALSA="-DENABLE_ALSA=ON" else KODI_ALSA="-DENABLE_ALSA=OFF" fi if [ "${KODI_PULSEAUDIO_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" pulseaudio" KODI_PULSEAUDIO="-DENABLE_PULSEAUDIO=ON" else KODI_PULSEAUDIO="-DENABLE_PULSEAUDIO=OFF" fi if [ "${ESPEAK_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" espeak-ng" fi if [ "${KODI_PIPEWIRE_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" pipewire" KODI_PIPEWIRE="-DENABLE_PIPEWIRE=ON" if [ "${KODI_PULSEAUDIO_SUPPORT}" = "yes" -o "${KODI_ALSA_SUPPORT}" = "yes" ]; then die "KODI_PULSEAUDIO_SUPPORT and KODI_ALSA_SUPPORT cannot be used with KODI_PIPEWIRE_SUPPORT" fi else KODI_PIPEWIRE="-DENABLE_PIPEWIRE=OFF" fi if [ "${CEC_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libcec" KODI_CEC="-DENABLE_CEC=ON" else 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 KODI_OPTICAL="-DENABLE_OPTICAL=OFF" fi if [ "${KODI_DVDCSS_SUPPORT}" = yes ]; then KODI_DVDCSS="-DENABLE_DVDCSS=ON \ -DLIBDVDCSS_URL=${SOURCES}/libdvdcss/libdvdcss-$(get_pkg_version libdvdcss).tar.gz" else KODI_DVDCSS="-DENABLE_DVDCSS=OFF" fi if [ "${KODI_BLURAY_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libbluray" KODI_BLURAY="-DENABLE_BLURAY=ON" else KODI_BLURAY="-DENABLE_BLURAY=OFF" fi if [ "${AVAHI_DAEMON}" = yes ]; then PKG_DEPENDS_TARGET+=" avahi nss-mdns" KODI_AVAHI="-DENABLE_AVAHI=ON" else KODI_AVAHI="-DENABLE_AVAHI=OFF" fi case "${KODI_MYSQL_SUPPORT}" in mysql) PKG_DEPENDS_TARGET="${PKG_DEPENDS_TARGET} mysql" KODI_MYSQL="-DENABLE_MYSQLCLIENT=ON -DENABLE_MARIADBCLIENT=OFF" ;; mariadb) PKG_DEPENDS_TARGET="${PKG_DEPENDS_TARGET} mariadb-connector-c" KODI_MYSQL="-DENABLE_MARIADBCLIENT=ON -DENABLE_MYSQLCLIENT=OFF" ;; *) KODI_MYSQL="-DENABLE_MYSQLCLIENT=OFF -DENABLE_MARIADBCLIENT=OFF" esac if [ "${KODI_AIRPLAY_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libplist" KODI_AIRPLAY="-DENABLE_PLIST=ON" else KODI_AIRPLAY="-DENABLE_PLIST=OFF" fi if [ "${KODI_AIRTUNES_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libshairplay" KODI_AIRTUNES="-DENABLE_AIRTUNES=ON" else KODI_AIRTUNES="-DENABLE_AIRTUNES=OFF" fi if [ "${KODI_NFS_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libnfs" KODI_NFS="-DENABLE_NFS=ON" else KODI_NFS="-DENABLE_NFS=OFF" fi if [ "${KODI_SAMBA_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" samba" KODI_SAMBA="-DENABLE_SMBCLIENT=ON" else KODI_SAMBA="-DENABLE_SMBCLIENT=OFF" fi if [ "${KODI_WEBSERVER_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libmicrohttpd" fi if [ "${KODI_UPNP_SUPPORT}" = yes ]; then KODI_UPNP="-DENABLE_UPNP=ON" else KODI_UPNP="-DENABLE_UPNP=OFF" fi if [ "${TARGET_ARCH}" = "aarch64" -o "${TARGET_ARCH}" = "arm" ]; then if target_has_feature neon; then KODI_NEON="-DENABLE_NEON=ON" else KODI_NEON="-DENABLE_NEON=OFF" fi else KODI_NEON="" fi if [ "${VDPAU_SUPPORT}" = "yes" -a "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" libvdpau" KODI_VDPAU="-DENABLE_VDPAU=ON" else KODI_VDPAU="-DENABLE_VDPAU=OFF" fi if [ "${VAAPI_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libva" KODI_VAAPI="-DENABLE_VAAPI=ON" else KODI_VAAPI="-DENABLE_VAAPI=OFF" fi if [ "${TARGET_ARCH}" = "x86_64" ]; then KODI_ARCH="-DWITH_CPU=${TARGET_ARCH}" else KODI_ARCH="-DWITH_ARCH=${TARGET_ARCH}" fi if [ ! "${KODIPLAYER_DRIVER}" = "default" -a "${DISPLAYSERVER}" = "no" ]; then PKG_DEPENDS_TARGET+=" ${KODIPLAYER_DRIVER} libinput libxkbcommon" if [ "${OPENGLES_SUPPORT}" = yes -a "${KODIPLAYER_DRIVER}" = "${OPENGLES}" ]; then KODI_PLATFORM="-DCORE_PLATFORM_NAME=gbm -DAPP_RENDER_SYSTEM=gles" CFLAGS+=" -DEGL_NO_X11" CXXFLAGS+=" -DEGL_NO_X11" if [ "${PROJECT}" = "Generic" ]; then PKG_APPLIANCE_XML="${PKG_DIR}/config/appliance-gbm-generic.xml" else PKG_APPLIANCE_XML="${PKG_DIR}/config/appliance-gbm.xml" fi fi fi if [ "${PROJECT}" = "Allwinner" -o "${PROJECT}" = "Rockchip" -o "${PROJECT}" = "RPi" ]; then PKG_PATCH_DIRS+=" drmprime-filter" fi KODI_LIBDVD="${KODI_DVDCSS} \ -DLIBDVDNAV_URL=${SOURCES}/libdvdnav/libdvdnav-$(get_pkg_version libdvdnav).tar.gz \ -DLIBDVDREAD_URL=${SOURCES}/libdvdread/libdvdread-$(get_pkg_version libdvdread).tar.gz" PKG_CMAKE_OPTS_TARGET="-DNATIVEPREFIX=${TOOLCHAIN} \ -DWITH_TEXTUREPACKER=${TOOLCHAIN}/bin/TexturePacker \ -DWITH_JSONSCHEMABUILDER=${TOOLCHAIN}/bin/JsonSchemaBuilder \ -DDEPENDS_PATH=${PKG_BUILD}/depends \ -DSWIG_EXECUTABLE=${TOOLCHAIN}/bin/swig \ -DPYTHON_EXECUTABLE=${TOOLCHAIN}/bin/${PKG_PYTHON_VERSION} \ -DPYTHON_INCLUDE_DIRS=${SYSROOT_PREFIX}/usr/include/${PKG_PYTHON_VERSION} \ -DGIT_VERSION=${PKG_VERSION} \ -DFFMPEG_PATH=${SYSROOT_PREFIX}/usr \ -DENABLE_INTERNAL_FFMPEG=OFF \ -DENABLE_INTERNAL_CROSSGUID=OFF \ -DENABLE_INTERNAL_UDFREAD=OFF \ -DENABLE_INTERNAL_SPDLOG=OFF \ -DENABLE_INTERNAL_RapidJSON=OFF \ -DENABLE_UDEV=ON \ -DENABLE_DBUS=ON \ -DENABLE_XSLT=ON \ -DENABLE_CCACHE=OFF \ -DENABLE_LIRCCLIENT=ON \ -DENABLE_EVENTCLIENTS=ON \ -DENABLE_DEBUGFISSION=OFF \ -DENABLE_APP_AUTONAME=OFF \ -DENABLE_TESTING=OFF \ -DENABLE_INTERNAL_FLATBUFFERS=OFF \ -DENABLE_LCMS2=OFF \ -DADDONS_CONFIGURE_AT_STARTUP=OFF \ ${PKG_KODI_USE_LTO} \ ${PKG_KODI_LINKER} \ ${KODI_ARCH} \ ${KODI_NEON} \ ${KODI_VDPAU} \ ${KODI_VAAPI} \ ${KODI_CEC} \ ${KODI_PLATFORM} \ ${KODI_SAMBA} \ ${KODI_NFS} \ ${KODI_LIBDVD} \ ${KODI_AVAHI} \ ${KODI_UPNP} \ ${KODI_MYSQL} \ ${KODI_AIRPLAY} \ ${KODI_AIRTUNES} \ ${KODI_OPTICAL} \ ${KODI_BLURAY} \ ${KODI_ALSA} \ ${KODI_PULSEAUDIO} \ ${KODI_PIPEWIRE}" } configure_host() { setup_toolchain target:cmake cmake ${CMAKE_GENERATOR_NINJA} \ -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CONF} \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \ -DHEADERS_ONLY=ON \ ${KODI_ARCH} \ ${KODI_NEON} \ ${KODI_PLATFORM} .. } make_host() { : } makeinstall_host() { DESTDIR=${SYSROOT_PREFIX} cmake -DCMAKE_INSTALL_COMPONENT="kodi-addon-dev" -P cmake_install.cmake # more binaddons cross compile badness meh sed -e "s:INCLUDE_DIR /usr/include/kodi:INCLUDE_DIR ${SYSROOT_PREFIX}/usr/include/kodi:g" \ -e "s:CMAKE_MODULE_PATH /usr/lib/kodi /usr/share/kodi/cmake:CMAKE_MODULE_PATH ${SYSROOT_PREFIX}/usr/share/kodi/cmake:g" \ -i ${SYSROOT_PREFIX}/usr/lib/kodi/cmake/KodiConfig.cmake } pre_configure_target() { export LIBS="${LIBS} -lncurses" } post_makeinstall_target() { mkdir -p ${INSTALL}/.noinstall mv ${INSTALL}/usr/share/kodi/addons/skin.estouchy \ ${INSTALL}/usr/share/kodi/addons/skin.estuary \ ${INSTALL}/usr/share/kodi/addons/service.xbmc.versioncheck \ ${INSTALL}/.noinstall rm -rf ${INSTALL}/usr/bin/kodi rm -rf ${INSTALL}/usr/bin/kodi-standalone rm -rf ${INSTALL}/usr/bin/xbmc rm -rf ${INSTALL}/usr/bin/xbmc-standalone rm -rf ${INSTALL}/usr/share/kodi/cmake rm -rf ${INSTALL}/usr/share/applications rm -rf ${INSTALL}/usr/share/icons rm -rf ${INSTALL}/usr/share/pixmaps rm -rf ${INSTALL}/usr/share/xsessions mkdir -p ${INSTALL}/usr/lib/kodi cp ${PKG_DIR}/scripts/kodi-config ${INSTALL}/usr/lib/kodi cp ${PKG_DIR}/scripts/kodi-safe-mode ${INSTALL}/usr/lib/kodi cp ${PKG_DIR}/scripts/kodi.sh ${INSTALL}/usr/lib/kodi if [ "${PROJECT}" = "Amlogic-ce" ]; then cp ${PKG_DIR}/scripts/aml-wait-for-dispcap.sh ${INSTALL}/usr/lib/kodi fi # Configure safe mode triggers - default 5 restarts within 900 seconds/15 minutes sed -e "s|@KODI_MAX_RESTARTS@|${KODI_MAX_RESTARTS:-5}|g" \ -e "s|@KODI_MAX_SECONDS@|${KODI_MAX_SECONDS:-900}|g" \ -i ${INSTALL}/usr/lib/kodi/kodi.sh if [ "${KODI_PIPEWIRE_SUPPORT}" = "yes" ]; then KODI_AE_SINK="PIPEWIRE" elif [ "${KODI_PULSEAUDIO_SUPPORT}" = "yes" -a "${KODI_ALSA_SUPPORT}" = "yes" ]; then KODI_AE_SINK="ALSA+PULSE" elif [ "${KODI_PULSEAUDIO_SUPPORT}" = "yes" -a "${KODI_ALSA_SUPPORT}" != "yes" ]; then KODI_AE_SINK="PULSE" elif [ "${KODI_PULSEAUDIO_SUPPORT}" != "yes" -a "${KODI_ALSA_SUPPORT}" = "yes" ]; then KODI_AE_SINK="ALSA" fi # adjust audio output device to what was built sed "s/@KODI_AE_SINK@/${KODI_AE_SINK}/" ${PKG_DIR}/config/kodi.conf.in > ${INSTALL}/usr/lib/kodi/kodi.conf # set default display environment if [ "${DISPLAYSERVER}" = "x11" ]; then echo "DISPLAY=:0.0" >> ${INSTALL}/usr/lib/kodi/kodi.conf elif [ "${DISPLAYSERVER}" = "wl" ]; then echo "WAYLAND_DISPLAY=wayland-1" >> ${INSTALL}/usr/lib/kodi/kodi.conf fi # nvidia: Enable USLEEP to reduce CPU load while rendering if listcontains "${GRAPHIC_DRIVERS}" "nvidia" || listcontains "${GRAPHIC_DRIVERS}" "nvidia-legacy"; then echo "__GL_YIELD=USLEEP" >> ${INSTALL}/usr/lib/kodi/kodi.conf fi mkdir -p ${INSTALL}/usr/sbin cp ${PKG_DIR}/scripts/service-addon-wrapper ${INSTALL}/usr/sbin mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/kodi-remote ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/setwakeup.sh ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/pastekodi ${INSTALL}/usr/bin ln -sf /usr/bin/pastekodi ${INSTALL}/usr/bin/pastecrash mkdir -p ${INSTALL}/usr/share/kodi/addons cp -R ${PKG_DIR}/config/repository.libreelec.tv ${INSTALL}/usr/share/kodi/addons sed -e "s|@ADDON_URL@|${ADDON_URL}|g" -i ${INSTALL}/usr/share/kodi/addons/repository.libreelec.tv/addon.xml sed -e "s|@ADDON_VERSION@|${ADDON_VERSION}|g" -i ${INSTALL}/usr/share/kodi/addons/repository.libreelec.tv/addon.xml mkdir -p ${INSTALL}/usr/share/kodi/config ln -sf /run/libreelec/cacert.pem ${INSTALL}/usr/share/kodi/system/certs/cacert.pem mkdir -p ${INSTALL}/usr/share/kodi/system/settings ${PKG_DIR}/scripts/xml_merge.py ${PKG_DIR}/config/guisettings.xml \ ${PROJECT_DIR}/${PROJECT}/kodi/guisettings.xml \ ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/kodi/guisettings.xml \ > ${INSTALL}/usr/share/kodi/config/guisettings.xml ${PKG_DIR}/scripts/xml_merge.py ${PKG_DIR}/config/sources.xml \ ${PROJECT_DIR}/${PROJECT}/kodi/sources.xml \ ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/kodi/sources.xml \ > ${INSTALL}/usr/share/kodi/config/sources.xml ${PKG_DIR}/scripts/xml_merge.py ${PKG_DIR}/config/advancedsettings.xml \ ${PROJECT_DIR}/${PROJECT}/kodi/advancedsettings.xml \ ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/kodi/advancedsettings.xml \ > ${INSTALL}/usr/share/kodi/system/advancedsettings.xml ${PKG_DIR}/scripts/xml_merge.py ${PKG_DIR}/config/appliance.xml \ ${PKG_APPLIANCE_XML} \ ${PROJECT_DIR}/${PROJECT}/kodi/appliance.xml \ ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/kodi/appliance.xml \ > ${INSTALL}/usr/share/kodi/system/settings/appliance.xml mkdir -p ${INSTALL}/usr/cache/libreelec cp ${PKG_DIR}/config/network_wait ${INSTALL}/usr/cache/libreelec # GBM: install udev rule to ignore the power button in libinput/kodi so logind can handle it if [ "${DISPLAYSERVER}" = "no" ]; then mkdir -p ${INSTALL}/usr/lib/udev/rules.d/ cp ${PKG_DIR}/config/70-libinput-ignore-power-button.rules ${INSTALL}/usr/lib/udev/rules.d/ fi # update addon manifest ADDON_MANIFEST=${INSTALL}/usr/share/kodi/system/addon-manifest.xml xmlstarlet ed -L -d "/addons/addon[text()='service.xbmc.versioncheck']" ${ADDON_MANIFEST} xmlstarlet ed -L -d "/addons/addon[text()='skin.estouchy']" ${ADDON_MANIFEST} xmlstarlet ed -L --subnode "/addons" -t elem -n "addon" -v "repository.libreelec.tv" ${ADDON_MANIFEST} if [ -n "${DISTRO_PKG_SETTINGS}" ]; then xmlstarlet ed -L --subnode "/addons" -t elem -n "addon" -v "${DISTRO_PKG_SETTINGS_ID}" ${ADDON_MANIFEST} fi if [ "${DRIVER_ADDONS_SUPPORT}" = "yes" ]; then xmlstarlet ed -L --subnode "/addons" -t elem -n "addon" -v "script.program.driverselect" ${ADDON_MANIFEST} fi # more binaddons cross compile badness meh sed -e "s:INCLUDE_DIR /usr/include/kodi:INCLUDE_DIR ${SYSROOT_PREFIX}/usr/include/kodi:g" \ -e "s:CMAKE_MODULE_PATH /usr/lib/kodi /usr/share/kodi/cmake:CMAKE_MODULE_PATH ${SYSROOT_PREFIX}/usr/share/kodi/cmake:g" \ -i ${SYSROOT_PREFIX}/usr/lib/kodi/cmake/KodiConfig.cmake if [ "${KODI_EXTRA_FONTS}" = yes ]; then mkdir -p ${INSTALL}/usr/share/kodi/media/Fonts cp ${PKG_DIR}/fonts/*.ttf ${INSTALL}/usr/share/kodi/media/Fonts fi # Compile kodi Python site-packages to .pyc bytecode, and remove .py source code python_compile ${INSTALL}/usr/lib/${PKG_PYTHON_VERSION}/site-packages/kodi debug_strip ${INSTALL}/usr/lib/kodi/kodi.bin } post_install() { enable_service kodi.target enable_service kodi-autostart.service enable_service kodi-cleanlogs.service enable_service kodi-halt.service enable_service kodi-poweroff.service enable_service kodi-reboot.service enable_service kodi-waitonnetwork.service enable_service kodi.service enable_service kodi-lirc-suspend.service } ================================================ FILE: packages/mediacenter/kodi/patches/README.patches ================================================ 100.* - LibreELEC specific patches that wont go upstream 995.* - LibreELEC specific patches that should be send upstream 999.* - patches backported from upstream ================================================ FILE: packages/mediacenter/kodi/patches/cec-framework/kodi-100.17-tinker-s-cec-disable-polling.patch ================================================ --- a/xbmc/peripherals/bus/virtual/PeripheralBusCEC.cpp +++ b/xbmc/peripherals/bus/virtual/PeripheralBusCEC.cpp @@ -45,6 +45,10 @@ bool CPeripheralBusCEC::PerformDeviceSca case ADAPTERTYPE_P8_DAUGHTERBOARD: result.m_mappedBusType = PERIPHERAL_BUS_USB; break; + case ADAPTERTYPE_LINUX: + /** the Linux adapter cannot be removed, no need to rescan */ + m_bNeedsPolling = false; + break; default: break; } ================================================ FILE: packages/mediacenter/kodi/patches/drmprime-filter/0001-WIP-DVDVideoCodecDRMPRIME-add-support-for-filters.patch ================================================ From 24d09f0f92e3afc975f211591c147032f663ed01 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sun, 20 Oct 2019 17:10:07 +0000 Subject: [PATCH 1/7] WIP: DVDVideoCodecDRMPRIME: add support for filters --- .../DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp | 62 +++++++++++++++++-- .../DVDCodecs/Video/DVDVideoCodecDRMPRIME.h | 10 +++ 2 files changed, 66 insertions(+), 6 deletions(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp index 80ca60290c..40cde1ba6e 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp @@ -27,6 +27,8 @@ extern "C" { #include +#include +#include #include #include #include @@ -559,12 +561,30 @@ void CDVDVideoCodecDRMPRIME::SetPictureParams(VideoPicture* pVideoPicture) pVideoPicture->dts = DVD_NOPTS_VALUE; } -CDVDVideoCodec::VCReturn CDVDVideoCodecDRMPRIME::GetPicture(VideoPicture* pVideoPicture) +CDVDVideoCodec::VCReturn CDVDVideoCodecDRMPRIME::ProcessFilterIn() { - if (m_codecControlFlags & DVD_CODEC_CTRL_DRAIN) - Drain(); + if (!m_pFilterIn) + return VC_PICTURE; + + int ret = av_buffersrc_add_frame(m_pFilterIn, m_pFrame); + if (ret < 0) + { + char err[AV_ERROR_MAX_STRING_SIZE] = {}; + av_strerror(ret, err, AV_ERROR_MAX_STRING_SIZE); + CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::{} - buffersrc add frame failed: {} ({})", + __FUNCTION__, err, ret); + return VC_ERROR; + } - int ret = avcodec_receive_frame(m_pCodecContext, m_pFrame); + return ProcessFilterOut(); +} + +CDVDVideoCodec::VCReturn CDVDVideoCodecDRMPRIME::ProcessFilterOut() +{ + if (!m_pFilterOut) + return VC_EOF; + + int ret = av_buffersink_get_frame(m_pFilterOut, m_pFrame); if (ret == AVERROR(EAGAIN)) return VC_BUFFER; else if (ret == AVERROR_EOF) @@ -581,11 +601,41 @@ CDVDVideoCodec::VCReturn CDVDVideoCodecDRMPRIME::GetPicture(VideoPicture* pVideo { char err[AV_ERROR_MAX_STRING_SIZE] = {}; av_strerror(ret, err, AV_ERROR_MAX_STRING_SIZE); - CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::{} - receive frame failed: {} ({})", __FUNCTION__, - err, ret); + CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::{} - buffersink get frame failed: {} ({})", + __FUNCTION__, err, ret); return VC_ERROR; } + return VC_PICTURE; +} + +CDVDVideoCodec::VCReturn CDVDVideoCodecDRMPRIME::GetPicture(VideoPicture* pVideoPicture) +{ + if (m_codecControlFlags & DVD_CODEC_CTRL_DRAIN) + Drain(); + + auto result = ProcessFilterOut(); + if (result != VC_PICTURE) + { + int ret = avcodec_receive_frame(m_pCodecContext, m_pFrame); + if (ret == AVERROR(EAGAIN)) + return VC_BUFFER; + else if (ret == AVERROR_EOF) + return VC_EOF; + else if (ret) + { + char err[AV_ERROR_MAX_STRING_SIZE] = {}; + av_strerror(ret, err, AV_ERROR_MAX_STRING_SIZE); + CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::{} - receive frame failed: {} ({})", + __FUNCTION__, err, ret); + return VC_ERROR; + } + + result = ProcessFilterIn(); + if (result != VC_PICTURE) + return result; + } + SetPictureParams(pVideoPicture); if (pVideoPicture->videoBuffer) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.h b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.h index db49d165e7..b5cacf1a3c 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.h +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.h @@ -14,6 +14,11 @@ #include +extern "C" +{ +#include +} + class CDVDVideoCodecDRMPRIME : public CDVDVideoCodec { public: @@ -35,6 +40,8 @@ protected: void Drain(); void SetPictureParams(VideoPicture* pVideoPicture); void UpdateProcessInfo(struct AVCodecContext* avctx, const enum AVPixelFormat fmt); + CDVDVideoCodec::VCReturn ProcessFilterIn(); + CDVDVideoCodec::VCReturn ProcessFilterOut(); static enum AVPixelFormat GetFormat(struct AVCodecContext* avctx, const enum AVPixelFormat* fmt); static int GetBuffer(struct AVCodecContext* avctx, AVFrame* frame, int flags); @@ -44,5 +51,8 @@ protected: double m_DAR = 1.0; AVCodecContext* m_pCodecContext = nullptr; AVFrame* m_pFrame = nullptr; + AVFilterGraph* m_pFilterGraph = nullptr; + AVFilterContext* m_pFilterIn = nullptr; + AVFilterContext* m_pFilterOut = nullptr; std::shared_ptr m_videoBufferPool; }; -- 2.39.2 ================================================ FILE: packages/mediacenter/kodi/patches/drmprime-filter/0002-WIP-DRMPRIME-deinterlace-filter.patch ================================================ From da88bb2f1dfbb6745406fab1bbece5b71df39b91 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Thu, 26 Dec 2019 11:01:51 +0100 Subject: [PATCH 2/7] WIP: DRMPRIME deinterlace filter --- .../DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp | 379 +++++++++++++++--- .../DVDCodecs/Video/DVDVideoCodecDRMPRIME.h | 9 +- 2 files changed, 328 insertions(+), 60 deletions(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp index 40cde1ba6e..1843e72e55 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp @@ -19,6 +19,7 @@ #include "threads/SingleLock.h" #include "utils/CPUInfo.h" #include "utils/log.h" +#include "utils/StringUtils.h" #if defined(HAVE_GBM) #include "windowing/gbm/WinSystemGbm.h" @@ -79,12 +80,15 @@ CDVDVideoCodecDRMPRIME::CDVDVideoCodecDRMPRIME(CProcessInfo& processInfo) : CDVDVideoCodec(processInfo) { m_pFrame = av_frame_alloc(); + m_pFilterFrame = av_frame_alloc(); m_videoBufferPool = std::make_shared(); } CDVDVideoCodecDRMPRIME::~CDVDVideoCodecDRMPRIME() { av_frame_free(&m_pFrame); + av_frame_free(&m_pFilterFrame); + FilterClose(); avcodec_free_context(&m_pCodecContext); } @@ -341,8 +345,19 @@ bool CDVDVideoCodecDRMPRIME::Open(CDVDStreamInfo& hints, CDVDCodecOptions& optio } UpdateProcessInfo(m_pCodecContext, m_pCodecContext->pix_fmt); - m_processInfo.SetVideoDeintMethod("none"); + m_processInfo.SetVideoInterlaced(false); m_processInfo.SetVideoDAR(hints.aspect); + m_processInfo.SetVideoDeintMethod("none"); + + FilterTest(); + + if (!m_deintFilterName.empty()) + { + std::list methods; + methods.push_back(EINTERLACEMETHOD::VS_INTERLACEMETHOD_DEINTERLACE); + m_processInfo.UpdateDeinterlacingMethods(methods); + m_processInfo.SetDeinterlacingMethodDefault(EINTERLACEMETHOD::VS_INTERLACEMETHOD_DEINTERLACE); + } return true; } @@ -418,6 +433,8 @@ void CDVDVideoCodecDRMPRIME::Reset() return; Drain(); + m_filters.clear(); + FilterClose(); do { @@ -465,7 +482,7 @@ void CDVDVideoCodecDRMPRIME::Drain() av_packet_free(&avpkt); } -void CDVDVideoCodecDRMPRIME::SetPictureParams(VideoPicture* pVideoPicture) +bool CDVDVideoCodecDRMPRIME::SetPictureParams(VideoPicture* pVideoPicture) { pVideoPicture->iWidth = m_pFrame->width; pVideoPicture->iHeight = m_pFrame->height; @@ -559,13 +576,238 @@ void CDVDVideoCodecDRMPRIME::SetPictureParams(VideoPicture* pVideoPicture) ? DVD_NOPTS_VALUE : static_cast(pts) * DVD_TIME_BASE / AV_TIME_BASE; pVideoPicture->dts = DVD_NOPTS_VALUE; + + if (pVideoPicture->videoBuffer) + { + pVideoPicture->videoBuffer->Release(); + pVideoPicture->videoBuffer = nullptr; + } + + if (IsSupportedHwFormat(static_cast(m_pFrame->format))) + { + CVideoBufferDRMPRIMEFFmpeg* buffer = + dynamic_cast(m_videoBufferPool->Get()); + buffer->SetPictureParams(*pVideoPicture); + buffer->SetRef(m_pFrame); + pVideoPicture->videoBuffer = buffer; + } + else if (m_pFrame->opaque) + { + CVideoBufferDMA* buffer = static_cast(m_pFrame->opaque); + buffer->SetPictureParams(*pVideoPicture); + buffer->Acquire(); + buffer->SyncEnd(); + buffer->SetDimensions(m_pFrame->width, m_pFrame->height); + + pVideoPicture->videoBuffer = buffer; + av_frame_unref(m_pFrame); + } + + if (!pVideoPicture->videoBuffer) + { + CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::{} - videoBuffer:nullptr format:{}", __FUNCTION__, + av_get_pix_fmt_name(static_cast(m_pFrame->format))); + av_frame_unref(m_pFrame); + return false; + } + + return true; } -CDVDVideoCodec::VCReturn CDVDVideoCodecDRMPRIME::ProcessFilterIn() +void CDVDVideoCodecDRMPRIME::FilterTest() +{ + const AVFilter* filter; + void* opaque{}; + + m_deintFilterName.clear(); + + while ((filter = av_filter_iterate(&opaque)) != nullptr) + { + std::string name(filter->name); + + if (name.find("deinterlace") != std::string::npos) + { + if (FilterOpen(name, true)) + { + m_deintFilterName = name; + + CLog::Log(LOGDEBUG, "CDVDVideoCodecDRMPRIME::{} - found deinterlacing filter {}", + __FUNCTION__, name); + + return; + } + } + } + + CLog::Log(LOGDEBUG, "CDVDVideoCodecDRMPRIME::{} - no deinterlacing filter found", + __FUNCTION__); +} + +bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) +{ + int result; + + if (m_pFilterGraph) + FilterClose(); + + if (filters.empty()) + return true; + + if (!(m_pFilterGraph = avfilter_graph_alloc())) + { + CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - unable to alloc filter graph"); + return false; + } + + const AVFilter* srcFilter = avfilter_get_by_name("buffer"); + const AVFilter* outFilter = avfilter_get_by_name("buffersink"); + enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_DRM_PRIME, AV_PIX_FMT_NONE }; + + std::string args = StringUtils::Format("video_size={}x{}:pix_fmt={}:time_base={}/{}:" + "pixel_aspect={}/{}", + m_pCodecContext->width, + m_pCodecContext->height, + m_pCodecContext->pix_fmt, + m_pCodecContext->time_base.num ? + m_pCodecContext->time_base.num : 1, + m_pCodecContext->time_base.num ? + m_pCodecContext->time_base.den : 1, + m_pCodecContext->sample_aspect_ratio.num != 0 ? + m_pCodecContext->sample_aspect_ratio.num : 1, + m_pCodecContext->sample_aspect_ratio.num != 0 ? + m_pCodecContext->sample_aspect_ratio.den : 1); + + result = avfilter_graph_create_filter(&m_pFilterIn, srcFilter, "src", + args.c_str(), NULL, m_pFilterGraph); + if (result < 0) + { + char err[AV_ERROR_MAX_STRING_SIZE] = {}; + av_strerror(result, err, AV_ERROR_MAX_STRING_SIZE); + CLog::Log(LOGERROR, + "CDVDVideoCodecDRMPRIME::FilterOpen - avfilter_graph_create_filter: src: {} ({})", + err, result); + return false; + } + + AVBufferSrcParameters *par = av_buffersrc_parameters_alloc(); + if (!par) + { + CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - unable to alloc buffersrc"); + return false; + } + + memset(par, 0, sizeof(*par)); + par->format = AV_PIX_FMT_NONE; + par->hw_frames_ctx = m_pCodecContext->hw_device_ctx; + + result = av_buffersrc_parameters_set(m_pFilterIn, par); + if (result < 0) + { + char err[AV_ERROR_MAX_STRING_SIZE] = {}; + av_strerror(result, err, AV_ERROR_MAX_STRING_SIZE); + CLog::Log(LOGERROR, + "CDVDVideoCodecDRMPRIME::FilterOpen - av_buffersrc_parameters_set: {} ({})", + err, result); + return false; + } + av_freep(&par); + + result = avfilter_graph_create_filter(&m_pFilterOut, outFilter, "out", + NULL, NULL, m_pFilterGraph); + if (result < 0) + { + char err[AV_ERROR_MAX_STRING_SIZE] = {}; + av_strerror(result, err, AV_ERROR_MAX_STRING_SIZE); + CLog::Log(LOGERROR, + "CDVDVideoCodecDRMPRIME::FilterOpen - avfilter_graph_create_filter: out: {} ({})", + err, result); + return false; + } + + result = av_opt_set_int_list(m_pFilterOut, "pix_fmts", &pix_fmts[0], + AV_PIX_FMT_NONE, AV_OPT_SEARCH_CHILDREN); + if (result < 0) + { + CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - failed settings pix formats"); + return false; + } + + AVFilterInOut* outputs = avfilter_inout_alloc(); + AVFilterInOut* inputs = avfilter_inout_alloc(); + + outputs->name = av_strdup("in"); + outputs->filter_ctx = m_pFilterIn; + outputs->pad_idx = 0; + outputs->next = nullptr; + + inputs->name = av_strdup("out"); + inputs->filter_ctx = m_pFilterOut; + inputs->pad_idx = 0; + inputs->next = nullptr; + + result = avfilter_graph_parse_ptr(m_pFilterGraph, filters.c_str(), &inputs, &outputs, NULL); + avfilter_inout_free(&outputs); + avfilter_inout_free(&inputs); + + if (result < 0) + { + CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - avfilter_graph_parse"); + return false; + } + + if ((result = avfilter_graph_config(m_pFilterGraph, nullptr)) < 0) + { + char err[AV_ERROR_MAX_STRING_SIZE] = {}; + av_strerror(result, err, AV_ERROR_MAX_STRING_SIZE); + CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - avfilter_graph_config: {} ({})", + err, result); + return false; + } + + if (test) + { + FilterClose(); + return true; + } + + if (filters.find("deinterlace") != std::string::npos) + { + m_processInfo.SetVideoDeintMethod(filters); + } + else + { + m_processInfo.SetVideoDeintMethod("none"); + } + + if (CServiceBroker::GetLogging().CanLogComponent(LOGVIDEO)) + { + char* graphDump = avfilter_graph_dump(m_pFilterGraph, nullptr); + if (graphDump) + { + CLog::Log(LOGDEBUG, "CDVDVideoCodecDRMPRIME::FilterOpen - Final filter graph:\n{}", + graphDump); + av_freep(&graphDump); + } + } + + return true; +} + +void CDVDVideoCodecDRMPRIME::FilterClose() { - if (!m_pFilterIn) - return VC_PICTURE; + if (m_pFilterGraph) + { + CLog::Log(LOGDEBUG, LOGVIDEO, "CDVDVideoCodecDRMPRIME::FilterClose - Freeing filter graph"); + avfilter_graph_free(&m_pFilterGraph); + + // Disposed by above code + m_pFilterIn = nullptr; + m_pFilterOut = nullptr; + } +} +CDVDVideoCodec::VCReturn CDVDVideoCodecDRMPRIME::ProcessFilterIn() +{ int ret = av_buffersrc_add_frame(m_pFilterIn, m_pFrame); if (ret < 0) { @@ -581,21 +823,14 @@ CDVDVideoCodec::VCReturn CDVDVideoCodecDRMPRIME::ProcessFilterIn() CDVDVideoCodec::VCReturn CDVDVideoCodecDRMPRIME::ProcessFilterOut() { - if (!m_pFilterOut) - return VC_EOF; - - int ret = av_buffersink_get_frame(m_pFilterOut, m_pFrame); + int ret = av_buffersink_get_frame(m_pFilterOut, m_pFilterFrame); if (ret == AVERROR(EAGAIN)) return VC_BUFFER; else if (ret == AVERROR_EOF) { - if (m_codecControlFlags & DVD_CODEC_CTRL_DRAIN) - { - CLog::Log(LOGDEBUG, "CDVDVideoCodecDRMPRIME::{} - flush buffers", __FUNCTION__); - avcodec_flush_buffers(m_pCodecContext); - SetCodecControl(m_codecControlFlags & ~DVD_CODEC_CTRL_DRAIN); - } - return VC_EOF; + ret = av_buffersink_get_frame(m_pFilterOut, m_pFilterFrame); + if (ret < 0) + return VC_BUFFER; } else if (ret) { @@ -606,71 +841,97 @@ CDVDVideoCodec::VCReturn CDVDVideoCodecDRMPRIME::ProcessFilterOut() return VC_ERROR; } + av_frame_unref(m_pFrame); + av_frame_move_ref(m_pFrame, m_pFilterFrame); + return VC_PICTURE; } +std::string CDVDVideoCodecDRMPRIME::GetFilterChain(bool interlaced) +{ + // ask codec to do deinterlacing if possible + EINTERLACEMETHOD mInt = m_processInfo.GetVideoSettings().m_InterlaceMethod; + std::string filterChain; + + if (!m_processInfo.Supports(mInt)) + mInt = m_processInfo.GetFallbackDeintMethod(); + + if (mInt != VS_INTERLACEMETHOD_NONE && interlaced && !m_deintFilterName.empty()) + filterChain += m_deintFilterName; + + return filterChain; +} + CDVDVideoCodec::VCReturn CDVDVideoCodecDRMPRIME::GetPicture(VideoPicture* pVideoPicture) { if (m_codecControlFlags & DVD_CODEC_CTRL_DRAIN) Drain(); - auto result = ProcessFilterOut(); - if (result != VC_PICTURE) + if (m_pFilterGraph) { - int ret = avcodec_receive_frame(m_pCodecContext, m_pFrame); - if (ret == AVERROR(EAGAIN)) - return VC_BUFFER; - else if (ret == AVERROR_EOF) - return VC_EOF; - else if (ret) + auto ret = ProcessFilterOut(); + if (ret == VC_PICTURE) { - char err[AV_ERROR_MAX_STRING_SIZE] = {}; - av_strerror(ret, err, AV_ERROR_MAX_STRING_SIZE); - CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::{} - receive frame failed: {} ({})", - __FUNCTION__, err, ret); - return VC_ERROR; + if (!SetPictureParams(pVideoPicture)) + return VC_ERROR; + return VC_PICTURE; + } + else if (ret != VC_BUFFER) + { + return ret; } - - result = ProcessFilterIn(); - if (result != VC_PICTURE) - return result; } - SetPictureParams(pVideoPicture); - - if (pVideoPicture->videoBuffer) + int ret = avcodec_receive_frame(m_pCodecContext, m_pFrame); + if (ret == AVERROR(EAGAIN)) + return VC_BUFFER; + else if (ret == AVERROR_EOF) + return VC_EOF; + else if (ret) { - pVideoPicture->videoBuffer->Release(); - pVideoPicture->videoBuffer = nullptr; + char err[AV_ERROR_MAX_STRING_SIZE] = {}; + av_strerror(ret, err, AV_ERROR_MAX_STRING_SIZE); + CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::{} - receive frame failed: {} ({})", + __FUNCTION__, err, ret); + return VC_ERROR; } - if (IsSupportedHwFormat(static_cast(m_pFrame->format))) + if (!m_processInfo.GetVideoInterlaced() && m_pFrame->interlaced_frame) + m_processInfo.SetVideoInterlaced(true); + + std::string filterChain = GetFilterChain(m_pFrame->interlaced_frame); + if (!filterChain.empty()) { - CVideoBufferDRMPRIMEFFmpeg* buffer = - dynamic_cast(m_videoBufferPool->Get()); - buffer->SetPictureParams(*pVideoPicture); - buffer->SetRef(m_pFrame); - pVideoPicture->videoBuffer = buffer; + bool reopenFilter = false; + if (m_filters != filterChain) + reopenFilter = true; + + if (m_pFilterGraph && + (m_pFilterIn->outputs[0]->w != m_pCodecContext->width || + m_pFilterIn->outputs[0]->h != m_pCodecContext->height)) + reopenFilter = true; + + if (reopenFilter) + { + m_filters = filterChain; + if (!FilterOpen(filterChain, false)) + FilterClose(); + } + + if (m_pFilterGraph) + { + if (ProcessFilterIn() != VC_PICTURE) + return VC_NONE; + } } - else if (m_pFrame->opaque) + else { - CVideoBufferDMA* buffer = static_cast(m_pFrame->opaque); - buffer->SetPictureParams(*pVideoPicture); - buffer->Acquire(); - buffer->SyncEnd(); - buffer->SetDimensions(m_pFrame->width, m_pFrame->height); - - pVideoPicture->videoBuffer = buffer; - av_frame_unref(m_pFrame); + m_filters.clear(); + FilterClose(); } - if (!pVideoPicture->videoBuffer) - { - CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::{} - videoBuffer:nullptr format:{}", __FUNCTION__, - av_get_pix_fmt_name(static_cast(m_pFrame->format))); - av_frame_unref(m_pFrame); + if (!SetPictureParams(pVideoPicture)) return VC_ERROR; - } return VC_PICTURE; } diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.h b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.h index b5cacf1a3c..fab3431d40 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.h +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.h @@ -38,19 +38,26 @@ public: protected: void Drain(); - void SetPictureParams(VideoPicture* pVideoPicture); + bool SetPictureParams(VideoPicture* pVideoPicture); void UpdateProcessInfo(struct AVCodecContext* avctx, const enum AVPixelFormat fmt); CDVDVideoCodec::VCReturn ProcessFilterIn(); CDVDVideoCodec::VCReturn ProcessFilterOut(); static enum AVPixelFormat GetFormat(struct AVCodecContext* avctx, const enum AVPixelFormat* fmt); static int GetBuffer(struct AVCodecContext* avctx, AVFrame* frame, int flags); + bool FilterOpen(const std::string& filters, bool test); + void FilterClose(); + void FilterTest(); + std::string GetFilterChain(bool interlaced); std::string m_name; + std::string m_deintFilterName; + std::string m_filters; int m_codecControlFlags = 0; CDVDStreamInfo m_hints; double m_DAR = 1.0; AVCodecContext* m_pCodecContext = nullptr; AVFrame* m_pFrame = nullptr; + AVFrame* m_pFilterFrame = nullptr; AVFilterGraph* m_pFilterGraph = nullptr; AVFilterContext* m_pFilterIn = nullptr; AVFilterContext* m_pFilterOut = nullptr; -- 2.39.2 ================================================ FILE: packages/mediacenter/kodi/patches/drmprime-filter/0003-DVDVideoCodecDRMPRIME-Avoid-exception-with-AV_PIX_FM.patch ================================================ From cb187a5456d0e992b4875ad965a6b628726c557f Mon Sep 17 00:00:00 2001 From: popcornmix Date: Fri, 27 Aug 2021 20:29:50 +0100 Subject: [PATCH 3/7] DVDVideoCodecDRMPRIME: Avoid exception with AV_PIX_FMT_NONE --- .../cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp index 1843e72e55..709311e75f 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp @@ -606,7 +606,7 @@ bool CDVDVideoCodecDRMPRIME::SetPictureParams(VideoPicture* pVideoPicture) if (!pVideoPicture->videoBuffer) { CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::{} - videoBuffer:nullptr format:{}", __FUNCTION__, - av_get_pix_fmt_name(static_cast(m_pFrame->format))); + m_pFrame->format == AV_PIX_FMT_NONE ? "AV_PIX_FMT_NONE" : av_get_pix_fmt_name(static_cast(m_pFrame->format))); av_frame_unref(m_pFrame); return false; } -- 2.39.2 ================================================ FILE: packages/mediacenter/kodi/patches/drmprime-filter/0004-DVDVideoCodecDRMPRIME-Leave-deinterlace-filter-activ.patch ================================================ From 7b98c8968c7dd3b5a56f76695515cb59654f8691 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Fri, 17 Sep 2021 15:23:16 +0100 Subject: [PATCH 4/7] DVDVideoCodecDRMPRIME: Leave deinterlace filter active on a progressive frame Interlaced content often has strange mixtures of interlace and progressive frames (e.g. IIPPPPIIPPPP) and currently we can be creating and destroying the deinterlace filter graph almost every frame. If it's been created, then leave it active until end of file. The frames marked as progressive should be just copied by deinterlace filter --- .../VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp index 709311e75f..6ba0804904 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp @@ -856,6 +856,10 @@ std::string CDVDVideoCodecDRMPRIME::GetFilterChain(bool interlaced) if (!m_processInfo.Supports(mInt)) mInt = m_processInfo.GetFallbackDeintMethod(); + // avoid disabling deinterlace graph for occasional progressive frames - they will be copied by deinterlace + if (!m_filters.empty()) + interlaced = true; + if (mInt != VS_INTERLACEMETHOD_NONE && interlaced && !m_deintFilterName.empty()) filterChain += m_deintFilterName; -- 2.39.2 ================================================ FILE: packages/mediacenter/kodi/patches/drmprime-filter/0005-SetVideoInterlaced-Set-and-unset-deinterlace-method-.patch ================================================ From c17af60a355973986d9ea5b6baefb96577299b9f Mon Sep 17 00:00:00 2001 From: Dom Cobley Date: Tue, 30 Nov 2021 16:05:06 +0000 Subject: [PATCH 5/7] SetVideoInterlaced: Set and unset deinterlace method name reported --- .../DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp index 6ba0804904..9139233bc4 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp @@ -770,14 +770,7 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) return true; } - if (filters.find("deinterlace") != std::string::npos) - { - m_processInfo.SetVideoDeintMethod(filters); - } - else - { - m_processInfo.SetVideoDeintMethod("none"); - } + m_processInfo.SetVideoDeintMethod(filters); if (CServiceBroker::GetLogging().CanLogComponent(LOGVIDEO)) { @@ -795,6 +788,7 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) void CDVDVideoCodecDRMPRIME::FilterClose() { + m_processInfo.SetVideoDeintMethod("none"); if (m_pFilterGraph) { CLog::Log(LOGDEBUG, LOGVIDEO, "CDVDVideoCodecDRMPRIME::FilterClose - Freeing filter graph"); -- 2.39.2 ================================================ FILE: packages/mediacenter/kodi/patches/drmprime-filter/0006-DVDVideoCodecDRMPRIME-Close-deinterlace-filter-on-er.patch ================================================ From 37ee879ee3bdcf8320fe135acc6cae0a8cbdb991 Mon Sep 17 00:00:00 2001 From: Dom Cobley Date: Wed, 24 Nov 2021 20:21:28 +0000 Subject: [PATCH 6/7] DVDVideoCodecDRMPRIME: Close deinterlace filter on error Otherwise we crash later with an invalid m_pFilterGraph pointer --- .../VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp index 9139233bc4..0b44d90f13 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp @@ -686,6 +686,7 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - avfilter_graph_create_filter: src: {} ({})", err, result); + FilterClose(); return false; } @@ -693,6 +694,7 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) if (!par) { CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - unable to alloc buffersrc"); + FilterClose(); return false; } @@ -708,6 +710,7 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - av_buffersrc_parameters_set: {} ({})", err, result); + FilterClose(); return false; } av_freep(&par); @@ -721,6 +724,7 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - avfilter_graph_create_filter: out: {} ({})", err, result); + FilterClose(); return false; } @@ -729,6 +733,7 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) if (result < 0) { CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - failed settings pix formats"); + FilterClose(); return false; } @@ -752,6 +757,7 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) if (result < 0) { CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - avfilter_graph_parse"); + FilterClose(); return false; } @@ -761,6 +767,7 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) av_strerror(result, err, AV_ERROR_MAX_STRING_SIZE); CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - avfilter_graph_config: {} ({})", err, result); + FilterClose(); return false; } -- 2.39.2 ================================================ FILE: packages/mediacenter/kodi/patches/drmprime-filter/0007-DVDVideoCodecDRMPRIME-Fix-missing-flush-after-eof.patch ================================================ From 9996a0027ee8b0149b639fdc1bb7b524a8176bc0 Mon Sep 17 00:00:00 2001 From: Dom Cobley Date: Mon, 15 May 2023 12:50:16 +0100 Subject: [PATCH 7/7] DVDVideoCodecDRMPRIME: Fix missing flush after eof --- .../VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp index 0b44d90f13..a472a06792 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp @@ -891,7 +891,15 @@ CDVDVideoCodec::VCReturn CDVDVideoCodecDRMPRIME::GetPicture(VideoPicture* pVideo if (ret == AVERROR(EAGAIN)) return VC_BUFFER; else if (ret == AVERROR_EOF) + { + if (m_codecControlFlags & DVD_CODEC_CTRL_DRAIN) + { + CLog::Log(LOGDEBUG, "CDVDVideoCodecDRMPRIME::{} - flush buffers", __FUNCTION__); + avcodec_flush_buffers(m_pCodecContext); + SetCodecControl(m_codecControlFlags & ~DVD_CODEC_CTRL_DRAIN); + } return VC_EOF; + } else if (ret) { char err[AV_ERROR_MAX_STRING_SIZE] = {}; -- 2.39.2 ================================================ FILE: packages/mediacenter/kodi/patches/kodi-100.02-add-libreelec.tv-RSS-news.patch ================================================ --- a/userdata/RssFeeds.xml +++ b/userdata/RssFeeds.xml @@ -3,6 +3,7 @@ + https://libreelec.tv/feed http://feeds.kodi.tv/xbmc http://feeds.kodi.tv/latest_xbmc_addons http://feeds.kodi.tv/updated_xbmc_addons ================================================ FILE: packages/mediacenter/kodi/patches/kodi-100.03-disable-online-check.patch ================================================ Subject: disable online check --- --- a/xbmc/GUIInfoManager.cpp +++ b/xbmc/GUIInfoManager.cpp @@ -1921,7 +1921,6 @@ const infomap system_labels[] = { {"currentcontrol", SYSTEM_CURRENT_CONTROL}, {"currentcontrolid", SYSTEM_CURRENT_CONTROL_ID}, {"dvdlabel", SYSTEM_DVD_LABEL}, - {"internetstate", SYSTEM_INTERNET_STATE}, {"osversioninfo", SYSTEM_OS_VERSION_INFO}, {"kernelversion", SYSTEM_OS_VERSION_INFO}, // old, not correct name {"uptime", SYSTEM_UPTIME}, --- a/xbmc/utils/SystemInfo.cpp +++ b/xbmc/utils/SystemInfo.cpp @@ -275,7 +275,6 @@ bool CSysInfoJob::DoWork() { m_info.systemUptime = GetSystemUpTime(false); m_info.systemTotalUptime = GetSystemUpTime(true); - m_info.internetState = GetInternetState(); m_info.videoEncoder = GetVideoEncoder(); m_info.cpuFrequency = StringUtils::Format("{:4.0f} MHz", CServiceBroker::GetCPUInfo()->GetCPUFrequency()); @@ -1021,9 +1020,7 @@ int CSysInfo::GetXbmcBitness(void) bool CSysInfo::HasInternet() { - if (m_info.internetState != CSysData::UNKNOWN) - return m_info.internetState == CSysData::CONNECTED; - return (m_info.internetState = CSysInfoJob::GetInternetState()) == CSysData::CONNECTED; + return m_info.internetState == CSysData::UNKNOWN; } std::string CSysInfo::GetHddSpaceInfo(int drive, bool shortText) --- a/xbmc/windows/GUIWindowSystemInfo.cpp +++ b/xbmc/windows/GUIWindowSystemInfo.cpp @@ -126,7 +126,6 @@ void CGUIWindowSystemInfo::FrameMove() SetControlLabel(i++, "{}: {}", 13160, NETWORK_GATEWAY_ADDRESS); SetControlLabel(i++, "{}: {}", 13161, NETWORK_DNS1_ADDRESS); SetControlLabel(i++, "{}: {}", 20307, NETWORK_DNS2_ADDRESS); - SetControlLabel(i++, "{} {}", 13295, SYSTEM_INTERNET_STATE); } else if (m_section == CONTROL_BT_VIDEO) ================================================ FILE: packages/mediacenter/kodi/patches/kodi-100.04-use-udevil-to-umount.patch ================================================ From 385ee507b4188f14c8e2c9bc903d547331a7b710 Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Thu, 5 Apr 2018 11:42:13 +0100 Subject: [PATCH] use udevil to mount --- xbmc/platform/linux/storage/UDevProvider.cpp | 2 +- xbmc/platform/posix/PosixMountProvider.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) --- a/xbmc/platform/linux/storage/UDevProvider.cpp +++ b/xbmc/platform/linux/storage/UDevProvider.cpp @@ -202,7 +202,7 @@ bool CUDevProvider::Eject(const std::str { // just go ahead and try to umount the disk // if it does umount, life is good, if not, no loss. - std::string cmd = "umount \"" + mountpath + "\""; + std::string cmd = "udevil umount \"" + mountpath + "\""; int status = system(cmd.c_str()); if (status == 0) --- a/xbmc/platform/posix/PosixMountProvider.cpp +++ b/xbmc/platform/posix/PosixMountProvider.cpp @@ -124,7 +124,7 @@ bool CPosixMountProvider::Eject(const st #if !defined(TARGET_DARWIN_EMBEDDED) // just go ahead and try to umount the disk // if it does umount, life is good, if not, no loss. - std::string cmd = "umount \"" + mountpath + "\""; + std::string cmd = "udevil umount \"" + mountpath + "\""; int status = system(cmd.c_str()); if (status == 0) ================================================ FILE: packages/mediacenter/kodi/patches/kodi-100.05-make-binary-addons-executable.patch ================================================ From 7336d7da9e863be6fac9b5cab5ffe441e658f15f Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Wed, 5 Jul 2017 15:46:51 +0100 Subject: [PATCH] make binary addons executable add executable mode to all files in addon's bin folder credits to vpeter4 for the patch --- xbmc/addons/Addon.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) --- a/xbmc/addons/Addon.cpp +++ b/xbmc/addons/Addon.cpp @@ -29,6 +29,10 @@ #include #include +#include +#include +#include + #ifdef HAS_PYTHON #include "interfaces/python/XBPython.h" #endif @@ -663,6 +667,28 @@ void OnPreInstall(const AddonPtr& addon) void OnPostInstall(const AddonPtr& addon, bool update, bool modal) { + // OE: make binary addons executable, creddits to vpeter4 + std::string addonDirPath; + std::string chmodFilePath; + DIR *addonsDir; + struct dirent *fileDirent; + struct stat fileStat; + int statRet; + + addonDirPath = "/storage/.kodi/addons/" + addon->ID() + "/bin/"; + if ((addonsDir = opendir(addonDirPath.c_str())) != NULL) + { + while ((fileDirent = readdir(addonsDir)) != NULL) + { + chmodFilePath = addonDirPath + fileDirent->d_name; + statRet = stat(chmodFilePath.c_str(), &fileStat); + if (statRet == 0 && (fileStat.st_mode & S_IFMT) != S_IFDIR) + chmod(chmodFilePath.c_str(), fileStat.st_mode | S_IXUSR | S_IXGRP | S_IXOTH); + } + closedir(addonsDir); + } + // OE + addon->OnPostInstall(update, modal); } ================================================ FILE: packages/mediacenter/kodi/patches/kodi-100.07-disable-minimize.patch ================================================ From c32d80cbfd5eb6ae9b5a36b3e9a8ec6e9d825837 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Sat, 18 Apr 2015 14:59:29 +0300 Subject: [PATCH] disable minimize --- xbmc/application/Application.cpp | 1 - 1 file changed, 1 deletion(-) --- a/xbmc/application/Application.cpp +++ b/xbmc/application/Application.cpp @@ -1609,7 +1609,6 @@ void CApplication::OnApplicationMessage( break; case TMSG_MINIMIZE: - CServiceBroker::GetWinSystem()->Minimize(); break; case TMSG_EXECUTE_OS: ================================================ FILE: packages/mediacenter/kodi/patches/kodi-100.08-setup-timezone.patch ================================================ From 7afdfe63354967ea5123cb2b1746c3ae552d0977 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Mon, 18 Aug 2014 17:46:54 +0300 Subject: [PATCH] setup timezone on TZ country setting change, store the value in format TIMEZONE=Xx/Yyy to /storage/.cache/timezone to be used with tz-data.service --- xbmc/platform/posix/PosixTimezone.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) --- a/xbmc/platform/posix/PosixTimezone.cpp +++ b/xbmc/platform/posix/PosixTimezone.cpp @@ -25,6 +25,8 @@ #include +#include + CPosixTimezone::CPosixTimezone() { char* line = NULL; @@ -142,6 +144,16 @@ void CPosixTimezone::OnSettingChanged(co const std::string &settingId = setting->GetId(); if (settingId == CSettings::SETTING_LOCALE_TIMEZONE) { + std::ofstream out("/storage/.cache/timezone"); + if (out) + { + const std::string tz = std::string("TIMEZONE=") + (std::static_pointer_cast(setting)->GetValue().c_str()); + out << tz << std::endl; + out.flush(); + out.close(); + system("systemctl restart tz-data.service"); + } + SetTimezone(std::static_pointer_cast(setting)->GetValue()); CDateTime::ResetTimezoneBias(); ================================================ FILE: packages/mediacenter/kodi/patches/kodi-100.09-use-a-wrapper-to-setup-service-addons.patch ================================================ From 069f73ce808caaf57057304e261afc1b76b37ea3 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Thu, 20 Oct 2022 19:24:59 +0200 Subject: [PATCH] Use a wrapper to setup service addons --- xbmc/addons/Addon.cpp | 35 +++++++++++++++++++++++++++++++++++ xbmc/addons/Addon.h | 9 +++++++++ xbmc/addons/AddonManager.cpp | 3 +++ 3 files changed, 47 insertions(+) --- a/xbmc/addons/Addon.cpp +++ b/xbmc/addons/Addon.cpp @@ -658,6 +658,37 @@ CAddonVersion CAddon::GetDependencyVersi return m_addonInfo->DependencyVersion(dependencyID); } +void LEAddonHook(const AddonPtr& addon, const LE_ADDON_CONTEXT context) { + + if (addon->Type() == AddonType::SERVICE) { + std::string contextStr; + char cmd[255]; + + switch (context) { + case LE_ADDON_ENABLED: + contextStr = "enable"; + break; + case LE_ADDON_DISABLED: + contextStr = "disable"; + break; + case LE_ADDON_POST_INSTALL: + contextStr = "post-install"; + break; + case LE_ADDON_PRE_UNINSTALL: + contextStr = "pre-uninstall"; + break; + default: + contextStr = StringUtils::Format("unknown(%d)", context); + break; + } + + snprintf(cmd, sizeof(cmd), "/usr/sbin/service-addon-wrapper %s %s %s", + contextStr.c_str(), addon->ID().c_str(), addon->Path().c_str()); + + system(cmd); + } +} + void OnPreInstall(const AddonPtr& addon) { //Fallback to the pre-install callback in the addon. @@ -687,6 +718,8 @@ void OnPostInstall(const AddonPtr& addon } closedir(addonsDir); } + + LEAddonHook(addon, LE_ADDON_POST_INSTALL); // OE addon->OnPostInstall(update, modal); @@ -694,6 +727,8 @@ void OnPostInstall(const AddonPtr& addon void OnPreUnInstall(const AddonPtr& addon) { + LEAddonHook(addon, LE_ADDON_PRE_UNINSTALL); + addon->OnPreUnInstall(); } --- a/xbmc/addons/Addon.h +++ b/xbmc/addons/Addon.h @@ -31,6 +31,15 @@ void OnPostInstall(const AddonPtr& addon void OnPreUnInstall(const AddonPtr& addon); void OnPostUnInstall(const AddonPtr& addon); +typedef enum { + LE_ADDON_ENABLED, + LE_ADDON_DISABLED, + LE_ADDON_POST_INSTALL, + LE_ADDON_PRE_UNINSTALL, +} LE_ADDON_CONTEXT; + +void LEAddonHook(const AddonPtr& addon, const LE_ADDON_CONTEXT context); + class CAddon : public IAddon { public: --- a/xbmc/addons/AddonManager.cpp +++ b/xbmc/addons/AddonManager.cpp @@ -12,6 +12,7 @@ #include "FileItem.h" #include "LangInfo.h" #include "ServiceBroker.h" +#include "addons/Addon.h" #include "addons/AddonBuilder.h" #include "addons/AddonDatabase.h" #include "addons/AddonEvents.h" @@ -863,6 +864,7 @@ bool CAddonMgr::DisableAddon(const std:: AddonPtr addon; if (GetAddon(id, addon, AddonType::UNKNOWN, OnlyEnabled::CHOICE_NO) && addon != nullptr) { + ADDON::LEAddonHook(addon, ADDON::LE_ADDON_DISABLED); auto eventLog = CServiceBroker::GetEventLog(); if (eventLog) eventLog->Add(EventPtr(new CAddonManagementEvent(addon, 24141))); @@ -914,6 +916,7 @@ bool CAddonMgr::EnableSingle(const std:: if (!m_database->EnableAddon(id)) return false; m_disabled.erase(id); + ADDON::LEAddonHook(addon, ADDON::LE_ADDON_ENABLED); // If enabling a repo add-on without an origin, set its origin to its own id if (addon->HasType(AddonType::REPOSITORY) && addon->Origin().empty()) ================================================ FILE: packages/mediacenter/kodi/patches/kodi-100.10-handle-SIGTERM.patch ================================================ From de3a1d59836496b786ce31e9f2ce77c0c9db545b Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Sun, 3 Apr 2022 11:31:07 +0200 Subject: [PATCH] handle SIGTERM 0. CApplication::Stop cant be trusted. (deadlocks crashes and boo) so, when shutdown/reboot is requested: 1. save an exit code (for CEC...) 2. call CPowerManager::{Reboot,PowerDown} 3. ... then systemd sends TERM and waits xx seconds before sending KILL 4. CApplication::Stop has xx seconds to save guisettings.xml and boo 5. CEC thread has xx seconds to switch off after it received OnQuit 6. addons / pvrmanager / cec / everything else.. are free to deadlock / crash now, we dont care 7. KILL --- xbmc/application/Application.cpp | 24 ++++++++++++++----- xbmc/application/Application.h | 2 ++ .../powermanagement/LogindUPowerSyscall.cpp | 2 -- 3 files changed, 20 insertions(+), 8 deletions(-) --- a/xbmc/application/Application.cpp +++ b/xbmc/application/Application.cpp @@ -1481,12 +1481,12 @@ void CApplication::OnApplicationMessage( switch (msg) { case TMSG_POWERDOWN: - if (Stop(EXITCODE_POWERDOWN)) + if (SetExitCode(EXITCODE_POWERDOWN)) CServiceBroker::GetPowerManager().Powerdown(); break; case TMSG_QUIT: - Stop(EXITCODE_QUIT); + SetExitCode(EXITCODE_QUIT); break; case TMSG_SHUTDOWN: @@ -1507,12 +1507,13 @@ void CApplication::OnApplicationMessage( case TMSG_RESTART: case TMSG_RESET: - if (Stop(EXITCODE_REBOOT)) + if (SetExitCode(EXITCODE_REBOOT)) CServiceBroker::GetPowerManager().Reboot(); break; case TMSG_RESTARTAPP: #if defined(TARGET_WINDOWS) || defined(TARGET_LINUX) + SetExitCode(EXITCODE_RESTARTAPP); Stop(EXITCODE_RESTARTAPP); #endif break; @@ -2094,7 +2095,7 @@ bool CApplication::Stop(int exitCode) m_frameMoveGuard.unlock(); CVariant vExitCode(CVariant::VariantTypeObject); - vExitCode["exitcode"] = exitCode; + vExitCode["exitcode"] = m_ExitCode; CServiceBroker::GetAnnouncementManager()->Announce(ANNOUNCEMENT::System, "OnQuit", vExitCode); // Abort any active screensaver @@ -2126,7 +2127,6 @@ bool CApplication::Stop(int exitCode) // Needs cleaning up CServiceBroker::GetAppMessenger()->Stop(); m_AppFocused = false; - m_ExitCode = exitCode; CLog::Log(LOGINFO, "Stopping all"); // cancel any jobs from the jobmanager @@ -2669,6 +2669,18 @@ void CApplication::StopPlaying() } } +bool CApplication::SetExitCode(int exitCode) +{ + if (!m_ExitCodeSet) + { + CLog::Log(LOGINFO, "Saving exitCode {}", exitCode); + // save it for CEC + m_ExitCode = exitCode; + m_ExitCodeSet = true; + } + return true; +} + bool CApplication::OnMessage(CGUIMessage& message) { switch (message.GetMessage()) @@ -3189,7 +3201,7 @@ void CApplication::ProcessSlow() if (CPlatformPosix::TestQuitFlag()) { CLog::Log(LOGINFO, "Quitting due to POSIX signal"); - CServiceBroker::GetAppMessenger()->PostMsg(TMSG_QUIT); + CServiceBroker::GetAppMessenger()->PostMsg(TMSG_RESTARTAPP); } #endif --- a/xbmc/application/Application.h +++ b/xbmc/application/Application.h @@ -113,6 +113,7 @@ public: bool CreateGUI(); bool InitWindow(RESOLUTION res = RES_INVALID); + bool SetExitCode(int exitCode); bool Stop(int exitCode); const std::string& CurrentFile(); CFileItem& CurrentFileItem(); @@ -251,6 +252,7 @@ private: unsigned int m_ProcessedExternalCalls = 0; /*!< counts calls which are processed during one "door open" cycle in FrameMove */ unsigned int m_ProcessedExternalDecay = 0; /*!< counts to close door after a few frames of no python activity */ int m_ExitCode{EXITCODE_QUIT}; + bool m_ExitCodeSet = false; }; XBMC_GLOBAL_REF(CApplication,g_application); --- a/xbmc/platform/linux/powermanagement/LogindUPowerSyscall.cpp +++ b/xbmc/platform/linux/powermanagement/LogindUPowerSyscall.cpp @@ -79,8 +79,6 @@ CLogindUPowerSyscall::~CLogindUPowerSysc bool CLogindUPowerSyscall::Powerdown() { - // delay shutdown so that the app can close properly - InhibitDelayLockShutdown(); return LogindSetPowerState("PowerOff"); } ================================================ FILE: packages/mediacenter/kodi/patches/kodi-100.13-udevprovider-filter-out-OE-specific-mounts.patch ================================================ From ba4c814c7ff26ff821ea362632fd6bb47bf93066 Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Thu, 5 Apr 2018 11:42:48 +0100 Subject: [PATCH] udevprovider: filter out OE specific mounts --- xbmc/platform/linux/storage/UDevProvider.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) --- a/xbmc/platform/linux/storage/UDevProvider.cpp +++ b/xbmc/platform/linux/storage/UDevProvider.cpp @@ -147,6 +147,20 @@ void CUDevProvider::GetDisks(VECSOURCES& continue; } + // LE: filter out Libreelec specific mounts + if (strstr(mountpoint, "/flash")) + { + udev_device_unref(device); + continue; + } + + if (strstr(mountpoint, "/storage")) + { + udev_device_unref(device); + continue; + } + // OE + // look for devices on the usb bus, or mounted on */media/ (sdcards), or optical devices const char *bus = udev_device_get_property_value(device, "ID_BUS"); const char *optical = udev_device_get_property_value(device, "ID_CDROM"); // matches also DVD, Blu-ray ================================================ FILE: packages/mediacenter/kodi/patches/kodi-100.15-rename-default-pulse-device.patch ================================================ From cd60daafb0c6b1e1de94dbc944bb247a8f810b50 Mon Sep 17 00:00:00 2001 From: fritsch Date: Fri, 29 Jan 2016 16:32:06 +0100 Subject: [PATCH] [PATCH] change pulseaudio default device name to Bluetooth Audio --- xbmc/cores/AudioEngine/Sinks/AESinkPULSE.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) --- a/xbmc/cores/AudioEngine/Sinks/AESinkPULSE.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkPULSE.cpp @@ -491,7 +491,7 @@ static void SinkInfoRequestCallback(pa_c CAEDeviceInfo defaultDevice; defaultDevice.m_deviceName = std::string("Default"); defaultDevice.m_displayName = std::string("Default"); - defaultDevice.m_displayNameExtra = std::string("Default Output Device (PULSEAUDIO)"); + defaultDevice.m_displayNameExtra = std::string("Bluetooth Audio (PULSEAUDIO)"); defaultDevice.m_dataFormats.insert(defaultDevice.m_dataFormats.end(), defaultDataFormats.begin(), defaultDataFormats.end()); defaultDevice.m_channels = CAEChannelInfo(AE_CH_LAYOUT_2_0); @@ -499,6 +499,8 @@ static void SinkInfoRequestCallback(pa_c defaultDevice.m_deviceType = AE_DEVTYPE_PCM; defaultDevice.m_wantsIECPassthrough = true; sinkStruct->list->push_back(defaultDevice); + // LE only wants the default device - so we are done here + return; } if (i && i->name) { ================================================ FILE: packages/mediacenter/kodi/patches/kodi-100.16-remove-sysinfo-battery.patch ================================================ --- a/xbmc/windows/GUIWindowSystemInfo.cpp +++ b/xbmc/windows/GUIWindowSystemInfo.cpp @@ -100,7 +100,6 @@ void CGUIWindowSystemInfo::FrameMove() SetControlLabel(i++, "{} {}", 13283, SYSTEM_OS_VERSION_INFO); SetControlLabel(i++, "{}: {}", 12390, SYSTEM_UPTIME); SetControlLabel(i++, "{}: {}", 12394, SYSTEM_TOTALUPTIME); - SetControlLabel(i++, "{}: {}", 12395, SYSTEM_BATTERY_LEVEL); } else if (m_section == CONTROL_BT_STORAGE) ================================================ FILE: packages/mediacenter/kodi/patches/kodi-100.25-hack-fix-texture-packer-cmake-source-dir.patch ================================================ --- a/tools/depends/native/TexturePacker/CMakeLists.txt +++ b/tools/depends/native/TexturePacker/CMakeLists.txt @@ -1,3 +1,5 @@ +set(CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR}/../../../..) + list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules) if(APPLE) ================================================ FILE: packages/mediacenter/kodi/patches/kodi-100.26-disable-internal-texturepacker.patch ================================================ --- a/cmake/modules/buildtools/FindTexturePacker.cmake +++ b/cmake/modules/buildtools/FindTexturePacker.cmake @@ -52,15 +52,6 @@ if(NOT TARGET TexturePacker::TexturePack endif() endif() - # Ship TexturePacker only on Linux and FreeBSD - if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" OR CMAKE_SYSTEM_NAME STREQUAL "Linux") - # But skip shipping it if build architecture can be executed on host - # and TEXTUREPACKER_EXECUTABLE is found - if(NOT (HOST_CAN_EXECUTE_TARGET AND TEXTUREPACKER_EXECUTABLE)) - set(INTERNAL_TEXTUREPACKER_INSTALLABLE TRUE CACHE BOOL "" FORCE) - endif() - endif() - # Use it during build if build architecture can be executed on host # and TEXTUREPACKER_EXECUTABLE is not found if(HOST_CAN_EXECUTE_TARGET AND NOT TEXTUREPACKER_EXECUTABLE) ================================================ FILE: packages/mediacenter/kodi/patches/kodi-100.30-addons-refresh-etc-environment.patch ================================================ From 76575164088a259d73c66dacb7df585b6a6e577a Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Tue, 17 Dec 2019 15:51:23 +0000 Subject: [PATCH] refresh /etc/environment on install and uninstall --- xbmc/addons/Addon.cpp | 6 ++++++ 1 file changed, 6 insertions(+) --- a/xbmc/addons/Addon.cpp +++ b/xbmc/addons/Addon.cpp @@ -723,6 +723,9 @@ void OnPostInstall(const AddonPtr& addon // OE addon->OnPostInstall(update, modal); + + if (addon->Type() == AddonType::SERVICE || addon->Type() == AddonType::SCRIPT) + system("/usr/bin/environment-setup"); } void OnPreUnInstall(const AddonPtr& addon) @@ -735,6 +738,9 @@ void OnPreUnInstall(const AddonPtr& addo void OnPostUnInstall(const AddonPtr& addon) { addon->OnPostUnInstall(); + + if (addon->Type() == AddonType::SERVICE || addon->Type() == AddonType::SCRIPT) + system("/usr/bin/environment-setup"); } } // namespace ADDON ================================================ FILE: packages/mediacenter/kodi/patches/kodi-100.32.add-le-repository-to-officials.patch ================================================ --- a/version.txt +++ b/version.txt @@ -10 +10 @@ -ADDON_REPOS repository.xbmc.org|https://mirrors.kodi.tv +ADDON_REPOS repository.xbmc.org|https://mirrors.kodi.tv,repository.libreelec.tv|https://addons.libreelec.tv ================================================ FILE: packages/mediacenter/kodi/patches/kodi-100.40-estuary-settings-icon.patch ================================================ From 2adc7ac23db3b8c7dca857456477df886b7dbeaa Mon Sep 17 00:00:00 2001 From: chewitt Date: Sat, 19 Sep 2020 16:25:19 +0000 Subject: [PATCH] skin.estuary: make event log conditional and move LE settings Move the LE settings icon from the fourth row to the top replacing the event log viewer when service.libreelec.settings exists, so we keep the 3x3 grid layout. Signed-off-by: Christian Hewitt --- addons/skin.estuary/xml/Settings.xml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) --- a/addons/skin.estuary/xml/Settings.xml +++ b/addons/skin.estuary/xml/Settings.xml @@ -55,9 +55,16 @@ icons/settings/sysinfo.png + + RunAddon(service.libreelec.settings) + icons/settings/libreelec.png + System.AddonIsEnabled(service.libreelec.settings) + + ActivateWindow(eventlog) icons/settings/eventlog.png + !System.HasAddon(service.libreelec.settings) @@ -111,12 +118,6 @@ ActivateWindow(SystemSettings) icons/settings/system.png - - - RunAddon(service.libreelec.settings) - icons/settings/libreelec.png - System.AddonIsEnabled(service.libreelec.settings) - ================================================ FILE: packages/mediacenter/kodi/patches/kodi-995.10-devinputmappings.patch ================================================ --- a/system/Lircmap.xml +++ b/system/Lircmap.xml @@ -548,50 +548,85 @@ KEY_UP KEY_DOWN - KEY_ENTER + + + KEY_DELETE + KEY_ESC KEY_MEDIA + KEY_HOME KEY_EXIT + KEY_BACK + KEY_BACKSPACE + KEY_ESC + KEY_E KEY_RECORD KEY_PLAY + KEY_PLAYPAUSE KEY_PAUSE KEY_STOP + KEY_STOPCD KEY_FASTFORWARD + KEY_FORWARD KEY_REWIND KEY_VOLUMEUP KEY_VOLUMEDOWN KEY_CHANNELUP + KEY_PAGEUP KEY_CHANNELDOWN + KEY_PAGEDOWN KEY_NEXT + KEY_NEXTSONG KEY_PREVIOUS + KEY_PREVIOUSSONG KEY_EPG KEY_TITLE + KEY_TV2 + KEY_CONTEXT_MENU KEY_SUBTITLE KEY_LANGUAGE KEY_INFO + KEY_PROPS KEY_ZOOM + KEY_ANGLE KEY_MUTE KEY_POWER + KEY_SLEEP + KEY_WAKEUP KEY_EJECTCD KEY_EJECTCLOSECD KEY_DVD KEY_MENU KEY_VIDEO KEY_AUDIO + KEY_MP3 KEY_CAMERA + KEY_IMAGES KEY_TUNER KEY_TV + KEY_PVR KEY_TEXT + KEY_1 KEY_NUMERIC_1 + KEY_2 KEY_NUMERIC_2 + KEY_3 KEY_NUMERIC_3 + KEY_4 KEY_NUMERIC_4 + KEY_5 KEY_NUMERIC_5 + KEY_6 KEY_NUMERIC_6 + KEY_7 KEY_NUMERIC_7 + KEY_8 KEY_NUMERIC_8 + KEY_9 KEY_NUMERIC_9 + KEY_0 KEY_NUMERIC_0 + KEY_KPASTERISK KEY_NUMERIC_STAR KEY_NUMERIC_POUND KEY_RED ================================================ FILE: packages/mediacenter/kodi/patches/kodi-995.21-keymaps-change-remote-poweroff-action-to-show-shutdo.patch ================================================ From 5604be6a6701e0bd68cb36fadb05cecba57f7887 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Fri, 22 Sep 2023 23:41:51 +0200 Subject: [PATCH] keymaps: change remote poweroff action to show shutdown menu Signed-off-by: Matthias Reichl --- system/keymaps/remote.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) --- a/system/keymaps/remote.xml +++ b/system/keymaps/remote.xml @@ -50,7 +50,7 @@ VolumeUp VolumeDown Mute - ShutDown() + ActivateWindow(ShutdownMenu) ActivateWindow(Videos) ActivateWindow(Music) ActivateWindow(Pictures) ================================================ FILE: packages/mediacenter/kodi/patches/kodi-999.15-disable-using-tv-menu-language-by-default.patch ================================================ --- a/system/peripherals.xml +++ b/system/peripherals.xml @@ -18,7 +18,7 @@ - + ================================================ FILE: packages/mediacenter/kodi/patches/kodi-999.20-headers-only.patch ================================================ --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,6 +47,7 @@ include(CMakeDependentOption) include(cmake/scripts/common/DependencyOptions.cmake) # general +option(HEADERS_ONLY "Skip building" OFF) option(VERBOSE "Enable verbose output?" OFF) option(ENABLE_CLANGTIDY "Enable clang-tidy support?" OFF) option(ENABLE_CPPCHECK "Enable cppcheck support?" OFF) @@ -107,6 +108,7 @@ endif() core_find_git_rev(APP_SCMID FULL) +if(NOT HEADERS_ONLY) # Dynamically loaded libraries built with the project add_custom_target(${APP_NAME_LC}-libraries) set(LIBRARY_FILES "" CACHE STRING "" FORCE) @@ -478,6 +480,7 @@ endif() if(FFMPEG_CREATE_SHARED_LIBRARY) set(CMAKE_CXX_CREATE_SHARED_LIBRARY "${FFMPEG_CREATE_SHARED_LIBRARY}") endif() +endif() # Platform specific additional extra targets if(EXISTS ${CMAKE_SOURCE_DIR}/cmake/scripts/${CORE_SYSTEM_NAME}/ExtraTargets.cmake) --- a/cmake/scripts/linux/Install.cmake +++ b/cmake/scripts/linux/Install.cmake @@ -51,6 +51,7 @@ configure_file(${CMAKE_SOURCE_DIR}/tools configure_file(${CMAKE_SOURCE_DIR}/tools/Linux/kodi.metainfo.xml.in ${CORE_BUILD_DIR}/${APP_PACKAGE}.metainfo.xml @ONLY) +if(NOT HEADERS_ONLY) # Install app install(TARGETS ${APP_NAME_LC} DESTINATION ${libdir}/${APP_NAME_LC} @@ -160,6 +161,7 @@ if(INTERNAL_TEXTUREPACKER_INSTALLABLE) RENAME "${APP_NAME_LC}-TexturePacker" COMPONENT kodi-tools-texturepacker) endif() +endif() # Install kodi-addon-dev headers include(${CMAKE_SOURCE_DIR}/xbmc/addons/AddonBindings.cmake) ================================================ FILE: packages/mediacenter/kodi/patches/wayland/kodi-995.01-fix-missing-wayland-scanner-pkg-config.patch ================================================ From b91a76aea33b60be19d3b66f9a49438887576ce6 Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Sat, 13 Nov 2021 08:23:54 -0800 Subject: [PATCH] cmake: allow providing WAYLANDPP_SCANNER in a cross compile --- cmake/modules/FindWaylandpp.cmake | 2 ++ 1 file changed, 2 insertions(+) --- a/cmake/modules/FindWaylandpp.cmake +++ b/cmake/modules/FindWaylandpp.cmake @@ -22,6 +22,8 @@ pkg_check_modules(PC_WAYLANDPP_SCANNER w if(PC_WAYLANDPP_SCANNER_FOUND) pkg_get_variable(PC_WAYLANDPP_SCANNER wayland-scanner++ wayland_scannerpp) +elseif(WAYLANDPP_SCANNER) + message(STATUS "wayland-scanner++ already set to: ${WAYLANDPP_SCANNER}") else() message(SEND_ERROR "wayland-scanner++ not found via pkg-config") endif() ================================================ FILE: packages/mediacenter/kodi/patches/wayland/kodi-999.16-PR20632-base-m_bFullScreenRoot-setting-on-res-infos-bFullScreen.patch ================================================ From 81a2fb65100b88c31bb0168acc0c3b7bab09475a Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Sun, 5 Dec 2021 23:46:25 +0900 Subject: [PATCH] windowing: base m_bFullScreenRoot setting on res info's bFullScreen on wayland, the compositor can ignore fullscreen requests, so even if application's InitWindow created a window with res >= DESKTOP we have no guarantee that the actual window created is actually fullscreen. CreateNewWindow will fill GetResolutionInfo(res) so we can check that for bFullScreen and use this information... in theory. wayland was inconditionally setting it to the requested fullscreen state, so also make sure it's set based on the real state by keeping m_bFullScreen up to date and using that instead. Fixes: #20629 --- xbmc/windowing/GraphicContext.cpp | 2 +- xbmc/windowing/wayland/WinSystemWayland.cpp | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) --- a/xbmc/windowing/GraphicContext.cpp +++ b/xbmc/windowing/GraphicContext.cpp @@ -410,7 +410,7 @@ void CGraphicContext::SetVideoResolution return; } - if (res >= RES_DESKTOP) + if (CDisplaySettings::GetInstance().GetResolutionInfo(res).bFullScreen) { CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_fullScreen = true; m_bFullScreenRoot = true; --- a/xbmc/windowing/wayland/WinSystemWayland.cpp +++ b/xbmc/windowing/wayland/WinSystemWayland.cpp @@ -343,7 +343,7 @@ bool CWinSystemWayland::CreateNewWindow( // Update resolution with real size as it could have changed due to configure() UpdateDesktopResolution(res, res.strOutput, m_bufferSize.Width(), m_bufferSize.Height(), res.fRefreshRate, 0); - res.bFullScreen = fullScreen; + res.bFullScreen = m_bFullScreen; // Now start processing events // @@ -787,7 +787,7 @@ void CWinSystemWayland::OnConfigure(std: CLog::LogF(LOGDEBUG, "Initial configure serial {}: size {}x{} state {}", serial, size.Width(), size.Height(), IShellSurface::StateToString(state)); m_shellSurfaceState = state; - if (!size.IsZero()) + if (!size.IsZero() || state.test(IShellSurface::STATE_FULLSCREEN)) { UpdateSizeVariables(size, m_scale, m_shellSurfaceState, true); } @@ -1015,6 +1015,7 @@ CWinSystemWayland::SizeUpdateInformation m_surfaceSize = sizes.surfaceSize; m_bufferSize = sizes.bufferSize; m_configuredSize = sizes.configuredSize; + m_bFullScreen = state.test(IShellSurface::STATE_FULLSCREEN); SizeUpdateInformation changes{m_surfaceSize != oldSurfaceSize, m_bufferSize != oldBufferSize, m_configuredSize != oldConfiguredSize, m_scale != oldBufferScale}; ================================================ FILE: packages/mediacenter/kodi/profile.d/00-addons.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # addons profile.d/*.profile for config in /storage/.kodi/addons/*/profile.d/*.profile; do if [ -f "$config" ] ; then . $config fi done oe_setup_addon() { if [ ! -z $1 ] ; then DEF="/storage/.kodi/addons/$1/settings-default.xml" CUR="/storage/.kodi/userdata/addon_data/$1/settings.xml" # export some useful variables ADDON_DIR="$HOME/.kodi/addons/$1" ADDON_HOME="$HOME/.kodi/userdata/addon_data/$1" ADDON_LOG_FILE="$ADDON_HOME/service.log" [ ! -d $ADDON_HOME ] && mkdir -p $ADDON_HOME # copy defaults if [ -f "$DEF" -a ! -f "$CUR" ] ; then cp "$DEF" "$CUR" fi # parse config for xml_file in "$DEF" "$CUR"; do if [ -f "$xml_file" ]; then XML_SETTINGS_VER="$(xmlstarlet sel -t -m settings -v @version $xml_file)" if [ "$XML_SETTINGS_VER" = "2" ]; then eval $(xmlstarlet sel -t -m settings/setting -v @id -o "=" -v . -n "$xml_file" | sed -e "s/'/'\\\\''/g; s/=/='/; s/$/'/") else eval $(xmlstarlet sel -t -m settings -m setting -v @id -o "=" -v @value -n "$xml_file" | sed -e "s/'/'\\\\''/g; s/=/='/; s/$/'/") fi fi done fi } ================================================ FILE: packages/mediacenter/kodi/profile.d/99-kodi.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # PATH for addon in /storage/.kodi/addons/*/bin /usr/lib/kodi/addons/*/bin; do [ -d "$addon" ] && PATH="$PATH:$addon" done export PATH # LD_LIBRARY_PATH for addon in /storage/.kodi/addons/*/lib /usr/lib/kodi/addons/*/lib; do [ -d "$addon" ] && LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$addon" done export LD_LIBRARY_PATH ================================================ FILE: packages/mediacenter/kodi/scripts/kodi-config ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) KODI_ROOT=$HOME/.kodi BOOT_STATE="$(cat $HOME/.config/boot.status 2>/dev/null)" # May not exist if testing a clean /storage/.kodi without rebooting mkdir -p $KODI_ROOT/userdata # hack: make addon-bins executable # done in kodi on addon install. but just in case.. chmod +x $KODI_ROOT/addons/*/bin/* 2>/dev/null # setup Kodi sources if [ ! -f $KODI_ROOT/userdata/sources.xml ]; then if [ -f /usr/share/kodi/config/sources.xml ]; then cp /usr/share/kodi/config/sources.xml $KODI_ROOT/userdata fi fi # common setup guisettings if [ ! -f $KODI_ROOT/userdata/guisettings.xml ] ; then if [ -f /usr/share/kodi/config/guisettings.xml ]; then cp /usr/share/kodi/config/guisettings.xml $KODI_ROOT/userdata fi if [ "$BOOT_STATE" = "SAFE" ]; then [ ! -f $KODI_ROOT/userdata/guisettings.xml ] && echo '' > $KODI_ROOT/userdata/guisettings.xml xmlstarlet ed --omit-decl --inplace -s settings -t elem -n setting -v "maroon" -i settings/setting -t attr -n id -v lookandfeel.skincolors $KODI_ROOT/userdata/guisettings.xml fi fi KODI_ARGS="" echo "KODI_ARGS=\"$KODI_ARGS\"" > /run/libreelec/kodi.conf if [ "$(uname -m)" = "x86_64" ]; then echo "MALLOC_MMAP_THRESHOLD_=524288" >> /run/libreelec/kodi.conf else #arm echo "MALLOC_MMAP_THRESHOLD_=8192" >> /run/libreelec/kodi.conf fi if [ -f /storage/.config/kodi.conf ] ; then cat /storage/.config/kodi.conf >>/run/libreelec/kodi.conf fi ================================================ FILE: packages/mediacenter/kodi/scripts/kodi-remote ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) echo "Supported keys: ← ↑ ↓ → Left | Up | Down | Right Context Menu c Player Debug d Fullscreen f Info i Codec Info o Pause p Screenshot s Skin Debug t Stop x Mute m Volume Down - Volume Up + Back Backspace Select Enter Quit Remote q or ctrl+c " com() { kodi-send --action="$1" > /dev/null 2>&1 echo -ne "\r$1\e[K"; } while true; do read -r -sn1 k case "$k" in A) com "Up";; B) com "Down";; C) com "Right";; D) com "Left";; c) com "ContextMenu";; d) com "PlayerDebug";; f) com "FullScreen";; i) com "Info";; m) com "Mute";; o) com "CodecInfo";; p) com "Pause";; s) com "TakeScreenshot";; t) com "Skin.ToggleDebug";; x) com "Stop";; -) com "VolumeDown";; +) com "VolumeUp";; $'\177') com "Back";; "") com "Select";; q) exit esac done ================================================ FILE: packages/mediacenter/kodi/scripts/kodi-safe-mode ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) KODI_ROOT=$HOME/.kodi KODI_ROOT_FAILED=$KODI_ROOT.FAILED BOOT_STATUS=$HOME/.config/boot.status process_boot_status() { BOOT_STATE="$(cat $BOOT_STATUS 2>/dev/null)" if [ "${BOOT_STATE}" = "SAFE" ]; then if [ ! -d $KODI_ROOT_FAILED ]; then # entering safe mode - rename failed .kodi, and restart with clean .kodi mv $KODI_ROOT $KODI_ROOT_FAILED reboot else # exiting safe mode - restore failed .kodi rm -fr $KODI_ROOT mv $KODI_ROOT_FAILED $KODI_ROOT echo "OK" > $BOOT_STATUS fi else echo "OK" > $BOOT_STATUS fi return 0 } process_boot_status exit 0 ================================================ FILE: packages/mediacenter/kodi/scripts/kodi.sh ================================================ #!/bin/sh # Copyright (C) 2008-2013 Team XBMC # http://xbmc.org # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. . /etc/profile trap cleanup TERM KODI_ROOT=$HOME/.kodi SAVED_ARGS="$@" CRASHLOG_DIR=$KODI_ROOT/temp BOOT_STATUS=$HOME/.config/boot.status NOSAFE_MODE=$HOME/.config/safemode.disable CRASH_HIST=/run/libreelec/crashes.dat KODI_MAX_RESTARTS=@KODI_MAX_RESTARTS@ KODI_MAX_SECONDS=@KODI_MAX_SECONDS@ cleanup() { # make systemd happy by not exiting immediately but # wait for kodi to exit while killall -0 kodi.bin &>/dev/null; do sleep 0.5 done } command_exists() { command -v $1 &>/dev/null } single_stacktrace() { # core filename is "core.*kodi.bin.*" find "$1" -name 'core.*kodi.bin.*' | while read core; do echo "=====> Core file: "$core"" >> $FILE echo " =========================================" >> $FILE if [ -f /storage/.config/debug.enhanced ]; then gdb /usr/lib/kodi/kodi.bin --core="$core" --batch -ex "thread apply all bt full" -ex "info registers" -ex "set print asm-demangle on" -ex "disassemble" 2>/dev/null >> $FILE else gdb /usr/lib/kodi/kodi.bin --core="$core" --batch -ex "thread apply all bt" 2>/dev/null >> $FILE fi rm -f "$core" done } detect_crash_loop() { # use monotonic time (in case date/time changes after booting) NOW_TIME=$(awk '/^now/ {print int($3 / 1000000000)}' /proc/timer_list) echo "$NOW_TIME" >> $CRASH_HIST NUM_RESTARTS=$(wc -l $CRASH_HIST | cut -d' ' -f1) FIRST_RESTART_TIME=$(tail -n $KODI_MAX_RESTARTS $CRASH_HIST | head -n 1) # kodi restart loop detected? fail this kodi install if [ $NUM_RESTARTS -ge $KODI_MAX_RESTARTS -a $KODI_MAX_SECONDS -ge $((NOW_TIME - FIRST_RESTART_TIME)) ]; then return 0 else return 1 fi } activate_safe_mode() { [ -f $NOSAFE_MODE ] && return 0 BOOT_STATE="$(cat $BOOT_STATUS 2>/dev/null)" if [ "${BOOT_STATE:-OK}" = "OK" ]; then # generate logfiles zip for the failed kodi /usr/bin/createlog lastlog=$(ls -1 /storage/logfiles/*.zip | tail -n 1) mv $lastlog /storage/logfiles/log-$(date -u +%Y-%m-%d-%H.%M.%S)-FAILED.zip echo "SAFE" > $BOOT_STATUS fi return 0 } print_crash_report() { mkdir -p $CRASHLOG_DIR DATE=`date +%Y%m%d%H%M%S` FILE="$CRASHLOG_DIR/.kodi_crashlog.log" echo "############## kodi CRASH LOG ###############" > $FILE echo >> $FILE echo "################ SYSTEM INFO ################" >> $FILE echo -n " Date: " >> $FILE date >> $FILE echo " kodi Options: $SAVED_ARGS" >> $FILE echo -n " Arch: " >> $FILE uname -m >> $FILE echo -n " Kernel: " >> $FILE uname -rvs >> $FILE echo -n " Release: " >> $FILE . /etc/os-release echo $NAME $VERSION >> $FILE echo "############## END SYSTEM INFO ##############" >> $FILE echo >> $FILE echo "############### STACK TRACE #################" >> $FILE if command_exists gdb; then single_stacktrace /storage/.cache/cores else echo "gdb not installed, can't get stack trace." >> $FILE fi echo "############# END STACK TRACE ###############" >> $FILE echo >> $FILE echo "################# LOG FILE ##################" >> $FILE echo >> $FILE cat $KODI_ROOT/temp/kodi.log >> $FILE echo >> $FILE echo "############### END LOG FILE ################" >> $FILE echo >> $FILE echo "############ END kodi CRASH LOG #############" >> $FILE OFILE="$FILE" FILE="$CRASHLOG_DIR/kodi_crashlog_$DATE.log" mv "$OFILE" "$FILE" ln -sf "$(basename $FILE)" "$CRASHLOG_DIR/kodi_crash.log" echo "Crash report available at $FILE" } if command_exists gdb; then ulimit -c unlimited fi # clean up any stale cores. just in case find /storage/.cache/cores -type f -delete # clean zero-byte database files that prevent migration/startup for file in $KODI_ROOT/userdata/Database/*.db; do if [ -e "$file" ]; then [ -s $file ] || rm -f $file fi done /usr/lib/kodi/kodi.bin $SAVED_ARGS RET=$? if [ $(( ($RET >= 131 && $RET <= 136) || $RET == 139 )) = "1" ] ; then # Crashed with core dump print_crash_report # Cleanup. Keep only youngest 10 reports but current in any case rm -f $(ls -1t $CRASHLOG_DIR/kodi_crashlog_*.log | grep -v "$FILE" | tail -n +10) # Enable safe mode if a crash loop is detected detect_crash_loop && activate_safe_mode fi # Filter Kodi powerdown/restartapp/reboot codes to satisfy systemd [ "$RET" -ge 64 -a "$RET" -le 66 ] && RET=0 exit $RET ================================================ FILE: packages/mediacenter/kodi/scripts/pastekodi ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) cat_data() { echo "========== ${1} ==========" cat } cat_file() { if [ -f "${1}" ]; then cat "${1}" | cat_data "${2:-${1}}" fi } ls_dir() { if [ -d "${1}" ]; then ls -lA "${1}" | cat_data "${1}" fi } ls_dir_recursive() { if [ -d "${1}" ]; then ls -lAR "${1}" | cat_data "${1}" fi } usage() { [ -n "${1}" ] && echo "Unknown argument: ${1}" cat </dev/null)" = "SAFE" ]; then KODI_ROOT="/storage/.kodi.FAILED/temp" else KODI_ROOT="/storage/.kodi/temp" fi if [ "$(basename $0)" = "pastekodi" ]; then LOG_TYPE="System" LOG_FILE="${KODI_ROOT}/kodi.log" else LOG_TYPE="Crash" LOG_FILE="${KODI_ROOT}/kodi_crash.log" fi ( echo "${LOG_TYPE} log output for: $(lsb_release)" if [ "${SYSTEM_ARCH}" = "x86_64" ]; then if [ -d "/sys/firmware/efi" ]; then echo "Firmware Boot Mode: EFI" else echo "Firmware Boot Mode: BIOS" fi fi if [ "${LIBREELEC_PROJECT}" = "RPi" ]; then echo "RPi Hardware Revision: $(vcgencmd otp_dump | grep 30: | cut -d: -f2)" echo "RPi $(vcgencmd get_throttled)" fi cat_file "${LOG_FILE}" journalctl -a -b -0 -o short-precise | cat_data "journalctl -a -b -0" kmsprint | cat_data "kmsprint" if [ "${LIBREELEC_PROJECT}" = "RPi" ]; then vcgencmd bootloader_version | cat_data "Bootloader version" fi cat_file "/flash/config.txt" # RPi cat_file "/flash/distroconfig.txt" # RPi cat_file "/flash/cmdline.txt" # RPi cat_file "/flash/syslinux.cfg" # x86 BIOS cat_file "/flash/EFI/BOOT/syslinux.cfg" # x86 EFI cat_file "/flash/extlinux.conf" # x86 legacy cat_file "/flash/extlinux/extlinux.conf" # u-boot cat_file "${KODI_ROOT}/.smb/smb.conf" cat_file "${KODI_ROOT}/.smb/user.conf" cat_file "/run/samba/smb.conf" ls_dir /storage/.config ls_dir_recursive /storage/.config/system.d ls_dir /storage/.config/udev.rules.d pem_sys="$(sha256sum /etc/ssl/cacert.pem.system | cut -d' ' -f1)" pem_run="$(sha256sum /run/libreelec/cacert.pem | cut -d' ' -f1)" if [ "${pem_sys}" = "${pem_run}" ]; then cat_data "/run/libreelec/cacert.pem is default" /dev/null ================================================ FILE: packages/mediacenter/kodi/scripts/service-addon-wrapper ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) if [ $# -ne 3 ] ; then echo "$0 usage: context addon-id addon-path" exit 1 fi CONTEXT="$1" ADDON_ID="$2" ADDON_PATH="$3" if [ ! -d /storage/.config/system.d ] ; then mkdir -p /storage/.config/system.d fi SERVICE_FILE="${ADDON_PATH}/system.d/${ADDON_ID}.service" if [ -f "${SERVICE_FILE}" ] ; then case "${CONTEXT}" in enable) systemctl enable "${SERVICE_FILE}" chmod +x "${ADDON_PATH}/bin"/* systemctl start "${ADDON_ID}.service" ;; disable | pre-uninstall) systemctl stop "${ADDON_ID}.service" systemctl disable "${ADDON_ID}.service" ;; post-install) # post-install is triggered on update as well, # make sure to stop and re-install service systemctl stop "${ADDON_ID}.service" systemctl disable "${ADDON_ID}.service" systemctl enable "${SERVICE_FILE}" chmod +x "${ADDON_PATH}/bin"/* systemctl start "${ADDON_ID}.service" ;; restart) systemctl restart "${ADDON_ID}.service" ;; reload) systemctl reload "${ADDON_ID}.service" ;; *) echo "$0: unknown service context $CONTEXT" exit 1 ;; esac fi if [ ! -d /storage/.cache/kernel-overlays ] ; then mkdir -p /storage/.cache/kernel-overlays fi # kernel-overlay addons built into the image have their # files installed in the default /usr/lib/kernel-overlays # location, not inside the kodi addon dir case "${ADDON_PATH}" in /usr/share/kodi/addons/*) OVERLAY_PATH="/usr/lib/kernel-overlays/${ADDON_ID}" ;; *) OVERLAY_PATH="${ADDON_PATH}/kernel-overlay" ;; esac create_overlay_conf() { rm -f "${OVERLAY_CONF}" echo "${OVERLAY_PATH}" > "${OVERLAY_CONF}" } if [ -d "${OVERLAY_PATH}" ] ; then OVERLAY_CONF="/storage/.cache/kernel-overlays/50-${ADDON_ID}.conf" case "${CONTEXT}" in enable | post-install ) create_overlay_conf ;; disable | pre-uninstall ) rm -f "${OVERLAY_CONF}" ;; update ) if [ -e "${OVERLAY_CONF}" ] ; then create_overlay_conf fi ;; *) echo "$0: unknown overlay context $CONTEXT" exit 1 ;; esac fi ================================================ FILE: packages/mediacenter/kodi/scripts/setwakeup.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) if [ -f /sys/class/rtc/rtc0/wakealarm ]; then logger -t setwakeup.sh "### Setting system wakeup time ###" echo 0 > /sys/class/rtc/rtc0/wakealarm echo $1 > /sys/class/rtc/rtc0/wakealarm logger -t setwakeup.sh "### $(cat /proc/driver/rtc) ###" fi ================================================ FILE: packages/mediacenter/kodi/scripts/xml_merge.py ================================================ #!/usr/bin/env python3 # taken from http://stackoverflow.com/a/14879370 with minor modifications from __future__ import print_function import os import sys import xml.dom.minidom from xml.etree import ElementTree as et def printerr(*args, **kwargs): print(*args, file=sys.stderr, **kwargs) class hashabledict(dict): def __hash__(self): return hash(tuple(sorted(self.items()))) class XMLCombiner(object): def __init__(self, filenames): if len(filenames) == 0: raise Exception('No filenames!') try: self.roots = [] for f in filenames: self.roots.append(et.parse(f).getroot()) except xml.etree.ElementTree.ParseError: printerr("ERROR: Unable to parse XML file %s" % f) raise def prettyPrint(self, etree_xml): minidom = xml.dom.minidom.parseString(et.tostring(etree_xml)) return "\n".join([line for line in minidom.toprettyxml(indent=" ", encoding="utf-8").decode('utf-8').split('\n') if line.strip() != ""]) def combine(self): for r in self.roots[1:]: self.combine_element(self.roots[0], r) return self.prettyPrint(self.roots[0]) def combine_element(self, one, other): mapping = {(el.tag, hashabledict(el.attrib)): el for el in one} for el in other: if len(el) == 0: try: mapping[(el.tag, hashabledict(el.attrib))].text = el.text except KeyError: mapping[(el.tag, hashabledict(el.attrib))] = el one.append(el) else: try: self.combine_element(mapping[(el.tag, hashabledict(el.attrib))], el) except KeyError: mapping[(el.tag, hashabledict(el.attrib))] = el one.append(el) if __name__ == '__main__': xmlfiles = [file for file in sys.argv[1:] if os.path.exists(file)] r = XMLCombiner(xmlfiles).combine() print(r) ================================================ FILE: packages/mediacenter/kodi/sleep.d/openelec-sleep.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /etc/profile run_scripts() { list_scripts $1 for script in $SCRIPTS ; do progress "running sleep script $script ($1)..." sh /usr/lib/systemd/system-sleep.serial/$script $1 done } list_scripts() { case $1 in pre) SCRIPTS=$(ls /usr/lib/systemd/system-sleep.serial/ | sort) ;; post) SCRIPTS=$(ls /usr/lib/systemd/system-sleep.serial/ | sort -r) ;; esac } run_scripts $1 exit 0 ================================================ FILE: packages/mediacenter/kodi/sleep.d.serial/10-addon-sleep.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /etc/profile # see https://wiki.archlinux.org/index.php/Power_Management#Hooks_in_.2Fusr.2Flib.2Fsystemd.2Fsystem-sleep for script in $HOME/.kodi/addons/*/sleep.d/*.power; do if [ -f $script ]; then progress "running addon sleep script $script ($@)..." sh $script $@ fi done exit 0 ================================================ FILE: packages/mediacenter/kodi/sleep.d.serial/20-custom-sleep.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) . /etc/profile # see https://wiki.archlinux.org/index.php/Power_Management#Hooks_in_.2Fusr.2Flib.2Fsystemd.2Fsystem-sleep for script in $HOME/.config/sleep.d/*.power; do if [ -f $script ]; then progress "running custom sleep script $script ($@)..." sh $script $@ fi done exit 0 ================================================ FILE: packages/mediacenter/kodi/system.d/kodi-autostart.service ================================================ [Unit] Description=Kodi user autostart script Before=kodi.service After=network-online.target graphical.target [Service] Type=oneshot Environment=HOME=/storage ExecStart=-/bin/sh -c ". /etc/profile; test -f /storage/.config/autostart.sh && exec /bin/sh /storage/.config/autostart.sh" ExecStop=-/bin/sh -c ". /etc/profile; test -f /storage/.config/autostop.sh && exec /bin/sh /storage/.config/autostop.sh" RemainAfterExit=yes TimeoutStopSec=5min [Install] WantedBy=kodi.service ================================================ FILE: packages/mediacenter/kodi/system.d/kodi-cleanlogs.service ================================================ [Unit] Description=Kodi clean debug logs ConditionKernelCommandLine=!debugging ConditionPathExists=!/storage/.cache/debug.libreelec Before=kodi.service [Service] Type=oneshot ExecStart=-/bin/sh -c 'rm -rf /storage/.kodi/userdata/addon_data/*/*.log /storage/.kodi/userdata/addon_data/*/log/*' RemainAfterExit=yes [Install] WantedBy=kodi.service ================================================ FILE: packages/mediacenter/kodi/system.d/kodi-halt.service ================================================ [Unit] Description=Kodi halt script After=kodi.service Before=systemd-halt.service DefaultDependencies=no [Service] Type=oneshot Environment=HOME=/storage ExecStart=-/bin/sh -c ". /etc/profile; exec /bin/sh /storage/.config/shutdown.sh halt" RemainAfterExit=yes [Install] WantedBy=halt.target ================================================ FILE: packages/mediacenter/kodi/system.d/kodi-lirc-suspend.service ================================================ [Unit] Description=LIRC sleep hook Before=sleep.target StopWhenUnneeded=yes [Service] Type=oneshot RemainAfterExit=yes ExecStart=-/usr/bin/kodi-send --host=127.0.0.1 -a "LIRC.Stop" ExecStop=-/usr/bin/kodi-send --host=127.0.0.1 -a "LIRC.Start" [Install] WantedBy=sleep.target ================================================ FILE: packages/mediacenter/kodi/system.d/kodi-poweroff.service ================================================ [Unit] Description=Kodi poweroff script After=kodi.service Before=systemd-poweroff.service DefaultDependencies=no [Service] Type=oneshot Environment=HOME=/storage ExecStart=-/bin/sh -c ". /etc/profile; exec /bin/sh /storage/.config/shutdown.sh poweroff" RemainAfterExit=yes [Install] WantedBy=poweroff.target ================================================ FILE: packages/mediacenter/kodi/system.d/kodi-reboot.service ================================================ [Unit] Description=Kodi reboot script After=kodi.service Before=systemd-reboot.service DefaultDependencies=no [Service] Type=oneshot Environment=HOME=/storage ExecStart=-/bin/sh -c ". /etc/profile; exec /bin/sh /storage/.config/shutdown.sh reboot" RemainAfterExit=yes [Install] WantedBy=reboot.target ================================================ FILE: packages/mediacenter/kodi/system.d/kodi-waitonnetwork.service ================================================ [Unit] Description=Wait on network After=connman.service Before=network-online.target DefaultDependencies=no Conflicts=shutdown.target ConditionFileNotEmpty=/storage/.cache/libreelec/network_wait ConditionPathExists=!/dev/.kernel_ipconfig ConditionPathExists=/storage/.kodi/userdata/addon_data/service.libreelec.settings/oe_settings.xml [Service] Type=oneshot EnvironmentFile=/storage/.cache/libreelec/network_wait ExecStart=/usr/bin/wait-time-sync --timeout ${WAIT_NETWORK_TIME} StandardOutput=tty RemainAfterExit=yes SuccessExitStatus=1 [Install] WantedBy=network-online.target ================================================ FILE: packages/mediacenter/kodi/system.d/kodi.service ================================================ [Unit] Description=Kodi Media Center After=network-online.target graphical.target Requires=graphical.target Wants=network-online.target [Service] EnvironmentFile=/usr/lib/kodi/kodi.conf EnvironmentFile=-/run/libreelec/kodi.conf EnvironmentFile=-/run/libreelec/debug/kodi.conf ExecStartPre=-/usr/lib/kodi/kodi-config ExecStart=/usr/lib/kodi/kodi.sh --standalone -fs $KODI_ARGS $KODI_DEBUG ExecStop=/bin/kill -TERM $MAINPID ExecStopPost=-/usr/lib/kodi/kodi-safe-mode TimeoutStopSec=30 Restart=always RestartSec=2 StartLimitInterval=0 LimitNOFILE=16384 [Install] WantedBy=kodi.target ================================================ FILE: packages/mediacenter/kodi/system.d/kodi.target ================================================ [Unit] Description=Kodi Mediacenter Interface Requires=multi-user.target graphical.target network-online.target After=network-online.target graphical.target Wants=network-online.target Conflicts=rescue.target AllowIsolate=yes [Install] Alias=default.target ================================================ FILE: packages/mediacenter/kodi/tmpfiles.d/kodi-userdirs.conf ================================================ # 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) d /storage/music 0755 root root - - d /storage/pictures 0755 root root - - d /storage/tvshows 0755 root root - - d /storage/videos 0755 root root - - d /storage/screenshots 0755 root root - - ================================================ FILE: packages/mediacenter/kodi/tmpfiles.d/kodi.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) d /run/kodi 0755 root root - - ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.2sf/package.mk ================================================ # 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) PKG_NAME="audiodecoder.2sf" PKG_VERSION="20.2.1-Nexus" PKG_SHA256="247ad2d9e1df00304882b40d80bc8fd70a4efd2bf2613163c24177d36649247c" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.2sf" PKG_URL="https://github.com/xbmc/audiodecoder.2sf/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform zlib" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.2sf" PKG_LONGDESC="audiodecoder.2sf" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.asap/package.mk ================================================ # 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) PKG_NAME="audiodecoder.asap" PKG_VERSION="20.3.0-Nexus" PKG_SHA256="9f54285866766b80d0d0c5210561678579d396591ab16cf70c83c4968bfbc8ba" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.asap" PKG_URL="https://github.com/xbmc/audiodecoder.asap/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.asap" PKG_LONGDESC="audiodecoder.asap" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.dumb/package.mk ================================================ # 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) PKG_NAME="audiodecoder.dumb" PKG_VERSION="20.2.1-Nexus" PKG_SHA256="d2ef04e80645f0bd1c9d31c9633d2a27d1757198fbcd2d43d00c84889e6ae585" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.dumb" PKG_URL="https://github.com/xbmc/audiodecoder.dumb/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.dumb" PKG_LONGDESC="audiodecoder.dumb" PKG_BUILD_FLAGS="pic" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.fluidsynth/package.mk ================================================ # 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) PKG_NAME="audiodecoder.fluidsynth" PKG_VERSION="20.2.1-Nexus" PKG_SHA256="dd8ca6386a3beed360c1d2f989cd81553baf81652007fdfd478a28b44b68db10" PKG_REV="6" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.fluidsynth" PKG_URL="https://github.com/xbmc/audiodecoder.fluidsynth/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform fluidsynth" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.fluidsynth" PKG_LONGDESC="audiodecoder.fluidsynth" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.gme/package.mk ================================================ # 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) PKG_NAME="audiodecoder.gme" PKG_VERSION="20.2.1-Nexus" PKG_SHA256="5aaec959e92f4af2684aa0439576d7f576f28a0a43f50439a6f38d0738792bdc" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.gme" PKG_URL="https://github.com/xbmc/audiodecoder.gme/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.gme" PKG_LONGDESC="audiodecoder.gme" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.gsf/package.mk ================================================ # 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) PKG_NAME="audiodecoder.gsf" PKG_VERSION="20.2.1-Nexus" PKG_SHA256="b09dcb379bdc536117a956b10b37cf50c8afaa65337993c44a6847d382d7e2a5" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.gsf" PKG_URL="https://github.com/xbmc/audiodecoder.gsf/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.gsf" PKG_LONGDESC="audiodecoder.gsf" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.modplug/package.mk ================================================ # 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) PKG_NAME="audiodecoder.modplug" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="619ba20ea19dd9aea15e7d30aa12a146b412c7fcd9e709528f6758e82a3d85e7" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.modplug" PKG_URL="https://github.com/xbmc/audiodecoder.modplug/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libmodplug" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.modplug" PKG_LONGDESC="audiodecoder.modplug" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.ncsf/package.mk ================================================ # 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) PKG_NAME="audiodecoder.ncsf" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="31b25846a9b8213306456eb6f8ab8fdaeede5cad35627e77aff2c422f370b211" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.ncsf" PKG_URL="https://github.com/xbmc/audiodecoder.ncsf/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.ncsf" PKG_LONGDESC="audiodecoder.ncsf" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.ncsf/patches/audiodecoder.ncsf-0001-fix-build-with-gcc5.patch ================================================ diff -Naur audiodecoder.ncsf-6cbec60.orig/lib/SSEQPlayer/convert.h audiodecoder.ncsf-6cbec60/lib/SSEQPlayer/convert.h --- audiodecoder.ncsf-6cbec60.orig/lib/SSEQPlayer/convert.h 2015-05-09 09:55:22.000000000 -0700 +++ audiodecoder.ncsf-6cbec60/lib/SSEQPlayer/convert.h 2015-10-23 00:23:22.442374128 -0700 @@ -11,12 +11,7 @@ #include #include #include -#if (defined(__GNUC__) || defined(__clang__)) && !defined(_LIBCPP_VERSION) -# include "wstring_convert.h" -# include "codecvt.h" -#else -# include -#endif +#include #include #include ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.ncsf/patches/audiodecoder.ncsf-0002-fix-build-with-gcc-10.patch ================================================ From 2df5d26162b580a21489dd3e3157a9984c4c20e3 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Mon, 22 Jun 2020 19:06:04 +0200 Subject: [PATCH] fix build with gcc 10 --- lib/SSEQPlayer/common.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/SSEQPlayer/common.h b/lib/SSEQPlayer/common.h index 747000615dea..a447785668d0 100644 --- a/lib/SSEQPlayer/common.h +++ b/lib/SSEQPlayer/common.h @@ -14,6 +14,7 @@ #include #include #include +#include /* * Pseudo-file data structure -- 2.27.0 ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.nosefart/package.mk ================================================ # 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) PKG_NAME="audiodecoder.nosefart" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="2f7a92bfaddcd5aa63e2ea7348ae9eeefd07dee2aba46840ce5376677e2abc19" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.nosefart" PKG_URL="https://github.com/xbmc/audiodecoder.nosefart/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.nosefart" PKG_LONGDESC="audiodecoder.nosefart" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.openmpt/package.mk ================================================ # 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) PKG_NAME="audiodecoder.openmpt" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="388fb4c9fcb5bd9edc978e3db5f54fa531c7f397393f3e421757e4e0de2d9c54" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.openmpt" PKG_URL="https://github.com/xbmc/audiodecoder.openmpt/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libopenmpt" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.openmpt" PKG_LONGDESC="audiodecoder.openmpt" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.organya/package.mk ================================================ # 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) PKG_NAME="audiodecoder.organya" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="df5db2c94161c7c578d672a8cc36bdbde6c345142c9bb5212759ad0dc30fd59d" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.organya" PKG_URL="https://github.com/xbmc/audiodecoder.organya/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.organya" PKG_LONGDESC="audiodecoder.organya" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.qsf/package.mk ================================================ # 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) PKG_NAME="audiodecoder.qsf" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="3116bb31b3fe53b85675ba664a7a8d5885e157940a4bcf57b96050844b11a377" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.qsf" PKG_URL="https://github.com/xbmc/audiodecoder.qsf/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.qsf" PKG_LONGDESC="audiodecoder.qsf" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.sacd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="audiodecoder.sacd" PKG_VERSION="20.3.0-Nexus" PKG_SHA256="6d54f6cf81e13aadcec1b43689551feba6e9426453a758d955e96348ba996277" PKG_REV="3" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.sacd" PKG_URL="https://github.com/xbmc/audiodecoder.sacd/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform wavpack" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.sacd" PKG_LONGDESC="audiodecoder.sacd" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.sidplay/package.mk ================================================ # 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) PKG_NAME="audiodecoder.sidplay" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="ab1f89237c91bc7157557f42dadcff50a7191eb7285ee668543defce9f1efcf2" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.sidplay" PKG_URL="https://github.com/xbmc/audiodecoder.sidplay/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform sidplay-libs" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.sidplay" PKG_LONGDESC="audiodecoder.sidplay" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" PKG_CMAKE_OPTS_TARGET="-DSIDPLAY2_LIBRARIES=${SYSROOT_PREFIX}/usr/lib" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.snesapu/package.mk ================================================ # 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) PKG_NAME="audiodecoder.snesapu" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="f216a7d25c864986618118236c575687ab62d129a16cb1f73c15860948d9ac92" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.snesapu" PKG_URL="https://github.com/xbmc/audiodecoder.snesapu/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.snesapu" PKG_LONGDESC="audiodecoder.snesapu" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.ssf/package.mk ================================================ # 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) PKG_NAME="audiodecoder.ssf" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="c2d5fbba35d2d73ed5891567d507f77bc64fa447dfcb4474f5d58594e9a07b2d" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.ssf" PKG_URL="https://github.com/xbmc/audiodecoder.ssf/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.ssf" PKG_LONGDESC="audiodecoder.ssf" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.stsound/package.mk ================================================ # 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) PKG_NAME="audiodecoder.stsound" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="a8138fb075a480c59d7041a9408eca6e52dc88f188daed519cd9e684b430f333" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.stsound" PKG_URL="https://github.com/xbmc/audiodecoder.stsound/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.stsound" PKG_LONGDESC="audiodecoder.stsound" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.timidity/package.mk ================================================ # 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) PKG_NAME="audiodecoder.timidity" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="ef1b384090df3c2c78d00ed33de1d989ce802702b0a9aa13575946409a5cd0f1" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.timidity" PKG_URL="https://github.com/xbmc/audiodecoder.timidity/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.timidity" PKG_LONGDESC="audiodecoder.timidity" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" pre_configure_target() { CFLAGS+=" -fcommon" } addon() { install_binary_addon ${PKG_ADDON_ID} mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID} cp -P ${PKG_BUILD}/.${TARGET_NAME}/lib/timidity/libtimidity_*.so ${ADDON_BUILD}/${PKG_ADDON_ID}/ } ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.upse/package.mk ================================================ # 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) PKG_NAME="audiodecoder.upse" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="d9f75e5cbab3ba5fc391cb40e0585bf22fad0eebfaf002d1d58bc896b6f2a5d6" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.upse" PKG_URL="https://github.com/xbmc/audiodecoder.upse/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.upse" PKG_LONGDESC="audiodecoder.upse" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.usf/package.mk ================================================ # 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) PKG_NAME="audiodecoder.usf" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="3ce9ef8823c773d894fd0018455ea5000e9b5a64f3cd8d66ddb4cf8f6c9ea836" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.usf" PKG_URL="https://github.com/xbmc/audiodecoder.usf/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.usf" PKG_LONGDESC="audiodecoder.usf" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" PKG_ADDON_PROJECTS="any !RPi1 !Slice" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.vgmstream/package.mk ================================================ # 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) PKG_NAME="audiodecoder.vgmstream" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="72367d7196f8049ef1fae426d32d3de1eac56bd4cb5a8fc38a6ba0c3da1b23d8" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.vgmstream" PKG_URL="https://github.com/xbmc/audiodecoder.vgmstream/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.vgmstream" PKG_LONGDESC="audiodecoder.vgmstream" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audiodecoder.wsr/package.mk ================================================ # 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) PKG_NAME="audiodecoder.wsr" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="e8f8e06b61fbf612d59d689c38a6acade485aabae2382f3fbbedb0ce0c00048d" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audiodecoder.wsr" PKG_URL="https://github.com/xbmc/audiodecoder.wsr/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="audiodecoder.wsr" PKG_LONGDESC="audiodecoder.wsr" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.audiodecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audioencoder.flac/package.mk ================================================ # 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) PKG_NAME="audioencoder.flac" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="71daf8c35bbf644591600fef93412cd068a6bf6173d2258dc243ee04c8e5b091" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audioencoder.flac" PKG_URL="https://github.com/xbmc/audioencoder.flac/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform flac" PKG_SECTION="" PKG_SHORTDESC="audioencoder.flac: A audioencoder addon for Kodi" PKG_LONGDESC="audioencoder.flac is a audioencoder addon for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.audioencoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audioencoder.lame/package.mk ================================================ # 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) PKG_NAME="audioencoder.lame" PKG_VERSION="20.3.0-Nexus" PKG_SHA256="90f36ee0b4972669ed2876eae2502e58d86287aacdbf4bb25180aca01385e1c1" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audioencoder.lame" PKG_URL="https://github.com/xbmc/audioencoder.lame/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform lame" PKG_SECTION="" PKG_SHORTDESC="audioencoder.lame: A audioencoder addon for Kodi" PKG_LONGDESC="audioencoder.lame is a audioencoder addon for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.audioencoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/audioencoder.vorbis/package.mk ================================================ # 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) PKG_NAME="audioencoder.vorbis" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="359e972ddcc498727620ff224a82f970fa2ae22b71ea6ab30b96898dffe6f1f9" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/audioencoder.vorbis" PKG_URL="https://github.com/xbmc/audioencoder.vorbis/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libogg libvorbis" PKG_SECTION="" PKG_SHORTDESC="audioencoder.vorbis: A audioencoder addon for Kodi" PKG_LONGDESC="audioencoder.vorbis is a audioencoder addon for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.audioencoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro" PKG_VERSION="20.2.6-Nexus" PKG_SHA256="32b24c0d67046e41d703c70a432ba8209163bafc8ca88afc8181be4d6693efb4" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro" PKG_URL="https://github.com/kodi-game/game.libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain tinyxml kodi-platform libretro-common rcheevos" PKG_SECTION="" PKG_LONGDESC="game.libretro is a thin wrapper for libretro" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.2048/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.2048" PKG_VERSION="1.0.0.133-Nexus" PKG_SHA256="64263ff32d22ea0301b26137ce59b1e6e82026b4a6d130dc3fd9699624d36011" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.2048" PKG_URL="https://github.com/kodi-game/game.libretro.2048/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-2048" PKG_SECTION="" PKG_LONGDESC="game.libretro.2048: 2048 for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.atari800/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.atari800" PKG_VERSION="3.1.0.23-Nexus" PKG_SHA256="4839836a4bf8a461d9554ad4920c0e45e89a384149abc6e82d847f74208f28cc" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.atari800" PKG_URL="https://github.com/kodi-game/game.libretro.atari800/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-atari800" PKG_SECTION="" PKG_LONGDESC="game.libretro.atari800: atari800 for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.beetle-bsnes/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.beetle-bsnes" PKG_VERSION="0.9.26.23-Nexus" PKG_SHA256="8f7830c484f5da5726fae1210c5cfe03ac1493c99a27cb9086f5b019052c688d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.beetle-bsnes" PKG_URL="https://github.com/kodi-game/game.libretro.beetle-bsnes/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-beetle-bsnes" PKG_SECTION="" PKG_LONGDESC="game.libretro.beetle-bsnes: Beetle bSNES for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.beetle-gba/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.beetle-gba" PKG_VERSION="0.9.36.23-Nexus" PKG_SHA256="f16c4faf9e52c75a20239854d76b678b1b6ab1dad354b34043941e4b0f08bb39" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.beetle-gba" PKG_URL="https://github.com/kodi-game/game.libretro.beetle-gba/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-beetle-gba" PKG_SECTION="" PKG_LONGDESC="game.libretro.beetle-gba: Beetle GBA for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.beetle-lynx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.beetle-lynx" PKG_VERSION="1.24.0.43-Nexus" PKG_SHA256="63528c7ed0dabf79dc7e67228472d16da589ed49a9ab947966c1fee76c2936cb" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.beetle-lynx" PKG_URL="https://github.com/kodi-game/game.libretro.beetle-lynx/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-beetle-lynx" PKG_SECTION="" PKG_LONGDESC="game.libretro.beetle-lynx: Beetle lynx for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.beetle-ngp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.beetle-ngp" PKG_VERSION="1.29.0.31-Nexus" PKG_SHA256="df4b9a35adec5fb918f281502409e21b94d95761f11a68e4535ddb679589df4a" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.beetle-ngp" PKG_URL="https://github.com/kodi-game/game.libretro.beetle-ngp/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-beetle-ngp" PKG_SECTION="" PKG_LONGDESC="game.libretro.beetle-ngp: Beetle ngp for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.beetle-pce-fast/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.beetle-pce-fast" PKG_VERSION="1.31.0.35-Nexus" PKG_SHA256="a79f80f1fafecfc2ddefc43fe145d672280bae1bfe2564b78076b691bc51a93c" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.beetle-pce-fast" PKG_URL="https://github.com/kodi-game/game.libretro.beetle-pce-fast/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-beetle-pce-fast" PKG_SECTION="" PKG_LONGDESC="game.libretro.beetle-pce-fast: Beetle PCE Fast for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.beetle-pcfx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.beetle-pcfx" PKG_VERSION="0.9.36.30-Nexus" PKG_SHA256="dea4718dafd6675c2b5f72c562d943d1bc762529b67dc241fcc7bc014eab31bc" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.beetle-pcfx" PKG_URL="https://github.com/kodi-game/game.libretro.beetle-pcfx/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-beetle-pcfx" PKG_SECTION="" PKG_LONGDESC="game.libretro.beetle-pcfx: Beetle pcfx for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.beetle-psx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.beetle-psx" PKG_VERSION="0.9.44.44-Nexus" PKG_SHA256="b0353183fbc07f8b0997d9f8a61756a3fc784d1899208fed620adc33f796c6d2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.beetle-psx" PKG_URL="https://github.com/kodi-game/game.libretro.beetle-psx/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-beetle-psx" PKG_SECTION="" PKG_LONGDESC="game.libretro.beetle-psx: Beetle PSX for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.beetle-supergrafx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.beetle-supergrafx" PKG_VERSION="1.29.0.31-Nexus" PKG_SHA256="cb593971040983aa6b65cf556b84242dd9e97f311ad2243604e0d3b30342a36a" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.beetle-supergrafx" PKG_URL="https://github.com/kodi-game/game.libretro.beetle-supergrafx/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-beetle-supergrafx" PKG_SECTION="" PKG_LONGDESC="game.libretro.beetle-supergrafx: Beetle supergrafx for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.beetle-vb/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.beetle-vb" PKG_VERSION="1.31.0.29-Nexus" PKG_SHA256="f5d4382d3d15c45a78bbd983c35012ea2852d74683a4c2ddc3fd42b21f17647b" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.beetle-vb" PKG_URL="https://github.com/kodi-game/game.libretro.beetle-vb/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-beetle-vb" PKG_SECTION="" PKG_LONGDESC="game.libretro.beetle-vb: Beetle vb for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.beetle-wswan/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.beetle-wswan" PKG_VERSION="0.9.35.34-Nexus" PKG_SHA256="69587cfdb710278502bb67c6c5d411edccf8f7179006899dc5393698ced540cd" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.beetle-wswan" PKG_URL="https://github.com/kodi-game/game.libretro.beetle-wswan/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-beetle-wswan" PKG_SECTION="" PKG_LONGDESC="game.libretro.beetle-wswan: Beetle wswan for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.bluemsx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.bluemsx" PKG_VERSION="0.0.1.31-Nexus" PKG_SHA256="3988666b5cbff65de5a26c5ba789d22d38fb26f056e0cf7cf54735d3810fe0cc" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.bluemsx" PKG_URL="https://github.com/kodi-game/game.libretro.bluemsx/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-bluemsx" PKG_SECTION="" PKG_LONGDESC="game.libretro.bluemsx: BlueMSX for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.bnes/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.bnes" PKG_VERSION="0.83.0.22-Nexus" PKG_SHA256="aa3db4f2f3d72beccf2aae7bb69099b824b69e2e8918f8cad2e5832015820207" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.bnes" PKG_URL="https://github.com/kodi-game/game.libretro.bnes/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-bnes" PKG_SECTION="" PKG_LONGDESC="game.libretro.bnes: bNES for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.bsnes-mercury-accuracy/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.bsnes-mercury-accuracy" PKG_VERSION="0.94.0.24-Nexus" PKG_SHA256="c779acbc3563c1a7c403deee5f4f4c758fd3b4c25580e564ac139f247222ec86" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.bsnes-mercury-accuracy" PKG_URL="https://github.com/kodi-game/game.libretro.bsnes-mercury-accuracy/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-bsnes-mercury-accuracy" PKG_SECTION="" PKG_LONGDESC="game.libretro.bsnes-mercury-accuracy: bSNES Mercury for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.bsnes-mercury-balanced/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.bsnes-mercury-balanced" PKG_VERSION="0.94.0.26-Nexus" PKG_SHA256="27ce040f731fdfaa3a2f2e69a6762819f22bedc341a08956207ccc6e42db71eb" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.bsnes-mercury-balanced" PKG_URL="https://github.com/kodi-game/game.libretro.bsnes-mercury-balanced/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-bsnes-mercury-balanced" PKG_SECTION="" PKG_LONGDESC="game.libretro.bsnes-mercury-balanced: bSNES Mercury for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.bsnes-mercury-performance/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.bsnes-mercury-performance" PKG_VERSION="0.94.0.26-Nexus" PKG_SHA256="afa740018ac8cc1038b64cd7c9b4c812bb6de1f6b8af7fa8a08353adf5b1c984" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.bsnes-mercury-performance" PKG_URL="https://github.com/kodi-game/game.libretro.bsnes-mercury-performance/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-bsnes-mercury-performance" PKG_SECTION="" PKG_LONGDESC="game.libretro.bsnes-mercury-performance: bSNES Mercury for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.cap32/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.cap32" PKG_VERSION="4.5.3.31-Nexus" PKG_SHA256="895999eb17a923c75c48c110c9317ab39b6655883c0fd9033c831dce56dbaeb5" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.cap32" PKG_URL="https://github.com/kodi-game/game.libretro.cap32/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-cap32" PKG_SECTION="" PKG_LONGDESC="game.libretro.cap32: cap32 for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.dinothawr/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.dinothawr" PKG_VERSION="1.0.0.31-Nexus" PKG_SHA256="f01ca34beb23c7739d48c1d0b259282061457b10c7ec55e7717f6fee693af311" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.dinothawr" PKG_URL="https://github.com/kodi-game/game.libretro.dinothawr/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-dinothawr" PKG_SECTION="" PKG_LONGDESC="game.libretro.dinothawr: dinothawr for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.dosbox/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.dosbox" PKG_VERSION="0.74.0.21-Nexus" PKG_SHA256="1e5dc4b1b2024c63eb80d0742fe460eae6702e8b5b669fd4253d97ebcae70a0d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.dosbox" PKG_URL="https://github.com/kodi-game/game.libretro.dosbox/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-dosbox" PKG_SECTION="" PKG_LONGDESC="game.libretro.dosbox: DOSBox for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.dosbox-pure/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.dosbox-pure" PKG_VERSION="0.9.7.21-Nexus" PKG_SHA256="a02ec6cf85dccd70d159d4a56dbeb11604c4d6fe38239556d4684942235c6a78" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.dosbox-pure" PKG_URL="https://github.com/kodi-game/game.libretro.dosbox-pure/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-dosbox-pure" PKG_SECTION="" PKG_LONGDESC="game.libretro.dosbox-pure: DOSBox-Pure for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.fbneo/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.fbneo" PKG_VERSION="1.0.0.63-Nexus" PKG_SHA256="2304697dd784b6908574340500325552ee40c4ab4fc1241716ac79bee6b481cb" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.fbneo" PKG_URL="https://github.com/kodi-game/game.libretro.fbneo/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-fbneo" PKG_SECTION="" PKG_LONGDESC="game.libretro.fbneo: FinalBurn Neo GameClient for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.fceumm/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.fceumm" PKG_VERSION="0.0.1.45-Nexus" PKG_SHA256="a61aec49a41b9ce9a6bb9f39b738afeb34eb8450f10725d829006947d5968790" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.fceumm" PKG_URL="https://github.com/kodi-game/game.libretro.fceumm/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-fceumm" PKG_SECTION="" PKG_LONGDESC="game.libretro.fceumm: FCEUmm emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.fmsx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.fmsx" PKG_VERSION="6.0.0.33-Nexus" PKG_SHA256="964d2761d0bfe9baccfba7a678f03a9dc83bbfecb5f6d0dbc2db7dca8afb0e62" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.fmsx" PKG_URL="https://github.com/kodi-game/game.libretro.fmsx/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-fmsx" PKG_SECTION="" PKG_LONGDESC="game.libretro.fmsx: fmsx for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.fsuae/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.fsuae" PKG_VERSION="0.0.1.3-Matrix" PKG_SHA256="24421d10b45ab85bc6f1ff08e1322551111b239939ff8358b90027c336619200" PKG_REV="2" PKG_ARCH="x86_64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.fsuae" PKG_URL="https://github.com/kodi-game/game.libretro.fsuae/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-fsuae" PKG_LONGDESC="game.libretro.fsuae: fsuae emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.fuse/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.fuse" PKG_VERSION="1.6.0.31-Nexus" PKG_SHA256="181dc924f7de6e38c5c8a1cc88942a9986147d1bdf96a3b95a620d20407c00ed" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.fuse" PKG_URL="https://github.com/kodi-game/game.libretro.fuse/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-fuse" PKG_SECTION="" PKG_LONGDESC="game.libretro.fuse: fuse for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.gambatte/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.gambatte" PKG_VERSION="0.5.0.37-Nexus" PKG_SHA256="8ca704c015eeb09de69c144dac5eb2b7ad9d548d4933d712c2b52aec514e428c" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.gambatte" PKG_URL="https://github.com/kodi-game/game.libretro.gambatte/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-gambatte" PKG_SECTION="" PKG_LONGDESC="game.libretro.gambatte: Gambatte emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.genplus/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.genplus" PKG_VERSION="1.7.4.42-Nexus" PKG_SHA256="def4e7a226131bc9633485a0e3b5396ab8e13b5c802a9d00a51a3d1cf0fec4af" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.genplus" PKG_URL="https://github.com/kodi-game/game.libretro.genplus/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-genplus" PKG_SECTION="" PKG_LONGDESC="game.libretro.genplus: Genesis Plus GX emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.gw/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.gw" PKG_VERSION="1.6.3.25-Nexus" PKG_SHA256="4fb269094660a5f6bb43be8e81c9568f4093e4c9002e8437402a0e73e80ff653" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.gw" PKG_URL="https://github.com/kodi-game/game.libretro.gw/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-gw" PKG_SECTION="" PKG_LONGDESC="game.libretro.gw: gw for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.handy/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.handy" PKG_VERSION="0.97.0.32-Nexus" PKG_SHA256="b7cb32e82013838ac0f01bbf1402082135028748272d0cf3c9c0404a01b01047" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.handy" PKG_URL="https://github.com/kodi-game/game.libretro.handy/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-handy" PKG_SECTION="" PKG_LONGDESC="game.libretro.handy: handy for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.hatari/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.hatari" PKG_VERSION="1.8.0.31-Nexus" PKG_SHA256="3be7578c10caab15b47e6dacb47f6dcf8ab35e2224048376c730f5c456f92584" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.hatari" PKG_URL="https://github.com/kodi-game/game.libretro.hatari/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-hatari" PKG_SECTION="" PKG_LONGDESC="game.libretro.hatari: hatari for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.mame2000/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.mame2000" PKG_VERSION="0.37.0.28-Nexus" PKG_SHA256="03b7318f66dffffa51430ff3891b7176fb1f60ea14b3697f090ffc51eb026945" PKG_REV="1" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.mame2000" PKG_URL="https://github.com/kodi-game/game.libretro.mame2000/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-mame2000" PKG_SECTION="" PKG_LONGDESC="game.libretro.mame2000: MAME 2000 emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.mame2003/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.mame2003" PKG_VERSION="0.78.0.50-Nexus" PKG_SHA256="03a6d03a7af9ab2fde80c6a64bba7bd10164ad424f1210670982677535609ceb" PKG_REV="1" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.mame2003" PKG_URL="https://github.com/kodi-game/game.libretro.mame2003/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-mame2003" PKG_SECTION="" PKG_LONGDESC="game.libretro.mame2003: MAME 2003 emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.mame2003_plus/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.mame2003_plus" PKG_VERSION="0.0.1.71-Nexus" PKG_SHA256="5647a1b61a56b96446be92d7cfe665acfdef212f90696f9af7861d95cd9cf49b" PKG_REV="1" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.mame2003_plus" PKG_URL="https://github.com/kodi-game/game.libretro.mame2003_plus/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-mame2003_plus" PKG_SECTION="" PKG_LONGDESC="game.libretro.mame2003_plus: MAME 2003 Plus emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.mame2010/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.mame2010" PKG_VERSION="0.139.0.21-Nexus" PKG_SHA256="fa9d9b36c50f1a760db683be986b96df57fee1ab6d232f8cfae8a2c7d9585b80" PKG_REV="1" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.mame2010" PKG_URL="https://github.com/kodi-game/game.libretro.mame2010/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-mame2010" PKG_SECTION="" PKG_LONGDESC="game.libretro.mame2010: MAME emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.mame2015/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.mame2015" PKG_VERSION="0.160.0.20-Nexus" PKG_SHA256="9aa78c4e19acdc10d51658e11fd9d1adfa5ff77a5d3827a3c558f3eddb5d0c20" PKG_ARCH="arm x86_64" PKG_REV="1" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.mame2015" PKG_URL="https://github.com/kodi-game/game.libretro.mame2015/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-mame2015" PKG_SECTION="" PKG_LONGDESC="game.libretro.mame2015: MAME emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.mame2016/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.mame2016" PKG_VERSION="0.174.0.18-Nexus" PKG_SHA256="175ebe62956f5820c7992915e78b5a2dfd744002c09c2a3f308cd628ac914c83" PKG_REV="1" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.mame2016" PKG_URL="https://github.com/kodi-game/game.libretro.mame2016/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-mame2016" PKG_SECTION="" PKG_LONGDESC="game.libretro.mame2016: MAME2016 emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" PKG_ADDON_PROJECTS="AMLG12 Generic RK3399" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.mesen/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.mesen" PKG_VERSION="0.9.9.26-Nexus" PKG_SHA256="b7b36e5364e50d92c9bb9ea90b825a463f217701e16e11b5e16d625a0abef82c" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.mesen" PKG_URL="https://github.com/kodi-game/game.libretro.mesen/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-mesen" PKG_SECTION="" PKG_LONGDESC="game.libretro.mesen: mesen for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.meteor/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.meteor" PKG_VERSION="1.4.0.19-Nexus" PKG_SHA256="fd3ef5d378e1177b1fda3d92ee74523413c5d248125fbcf1e2f4b7a7cf861f77" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.meteor" PKG_URL="https://github.com/kodi-game/game.libretro.meteor/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-meteor" PKG_SECTION="" PKG_LONGDESC="game.libretro.meteor: Meteor GBA emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.mgba/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.mgba" PKG_VERSION="0.11.0.40-Nexus" PKG_SHA256="3f6f5b0c7e537b777dbabcd23076db97cc6c968398d407ac2d16459bba21ffc3" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.mgba" PKG_URL="https://github.com/kodi-game/game.libretro.mgba/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-mgba" PKG_SECTION="" PKG_LONGDESC="game.libretro.mgba: mGBA emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.mrboom/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.mrboom" PKG_VERSION="5.2.0.146-Nexus" PKG_SHA256="346491ca2266f952383edfbe31cfb901dca1f25920ca63a5e910c06bce4de641" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.mrboom" PKG_URL="https://github.com/kodi-game/game.libretro.mrboom/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-mrboom" PKG_SECTION="" PKG_LONGDESC="game.libretro.mrboom: mrboom for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.nestopia/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.nestopia" PKG_VERSION="1.52.0.34-Nexus" PKG_SHA256="9ae12a7f2f0043c80f426272161743b230acf6f051f344d08123b34e193409b1" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.nestopia" PKG_URL="https://github.com/kodi-game/game.libretro.nestopia/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-nestopia" PKG_SECTION="" PKG_LONGDESC="game.libretro.nestopia: Nestopia emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.nx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.nx" PKG_VERSION="1.0.0.33-Nexus" PKG_SHA256="2f71c6f162b6e8d197e8a17f6d0d7ba9eb9c093e3ff47913955b3594a672b180" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.nx" PKG_URL="https://github.com/kodi-game/game.libretro.nx/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-nx" PKG_SECTION="" PKG_LONGDESC="game.libretro.nx: nx for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.o2em/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.o2em" PKG_VERSION="1.18.0.36-Nexus" PKG_SHA256="c2fa67b2d504512bf6177091957c69a7b52fc848721ee1941301ab19b6d435b6" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.o2em" PKG_URL="https://github.com/kodi-game/game.libretro.o2em/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-o2em" PKG_SECTION="" PKG_LONGDESC="game.libretro.o2em: o2em for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.opera/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.opera" PKG_VERSION="1.0.0.33-Nexus" PKG_SHA256="915c9b8a969ac980880c38b4c2b23d3742221175de377130d1f995089d6292d8" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.opera" PKG_URL="https://github.com/kodi-game/game.libretro.opera/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-opera" PKG_SECTION="" PKG_LONGDESC="game.libretro.opera: Port of 4DO/libfreedo for Kodi." PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.pcsx-rearmed/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.pcsx-rearmed" PKG_VERSION="23.0.0.45-Nexus" PKG_SHA256="1e55d9486aeb51568594bec841b3c3fcb5c29bcd21a4b2dbb813b3460a878133" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.pcsx-rearmed" PKG_URL="https://github.com/kodi-game/game.libretro.pcsx-rearmed/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-pcsx-rearmed" PKG_SECTION="" PKG_LONGDESC="game.libretro.pcsx-rearmed: PCSX Rearmed for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.picodrive/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.picodrive" PKG_VERSION="1.98.0.26-Matrix" PKG_SHA256="d427d69ac7814613643d42a6e5d9790ce937479785abd45d980d5dedf1e9856f" PKG_REV="2" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.picodrive" PKG_URL="https://github.com/kodi-game/game.libretro.picodrive/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-picodrive" PKG_SECTION="" PKG_LONGDESC="game.libretro.picodrive: picodrive for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.pokemini/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.pokemini" PKG_VERSION="0.60.0.33-Nexus" PKG_SHA256="8312b1df299c8477be119a4035201ec3e9aefc96364e242e2a619233312e0af6" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.pokemini" PKG_URL="https://github.com/kodi-game/game.libretro.pokemini/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-pokemini" PKG_SECTION="" PKG_LONGDESC="game.libretro.pokemini: PokeMini emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.prboom/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.prboom" PKG_VERSION="2.5.0.37-Nexus" PKG_SHA256="ecd235f78184319f39843a1e1ac63dc3de2bb23d07663b00dfe78636cda54deb" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.prboom" PKG_URL="https://github.com/kodi-game/game.libretro.prboom/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-prboom" PKG_SECTION="" PKG_LONGDESC="game.libretro.prboom: prboom for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.prosystem/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.prosystem" PKG_VERSION="1.3.0.34-Nexus" PKG_SHA256="8f3e544e802fed37f5dc4e9a67ec0f64f870f05442c32a9055d453297e2c6b09" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.prosystem" PKG_URL="https://github.com/kodi-game/game.libretro.prosystem/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-prosystem" PKG_SECTION="" PKG_LONGDESC="game.libretro.prosystem: Prosystem for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.quicknes/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.quicknes" PKG_VERSION="1.0.0.35-Nexus" PKG_SHA256="c1de5817baf6bb4365922db4c3ac9cf651d42cdaf50ecdab6ae3d83bb75fcd87" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.quicknes" PKG_URL="https://github.com/kodi-game/game.libretro.quicknes/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-quicknes" PKG_SECTION="" PKG_LONGDESC="game.libretro.quicknes: QuickNES emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.sameboy/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.sameboy" PKG_VERSION="0.15.4.33-Nexus" PKG_SHA256="664694fe34c59f5f4384633ec61d194ca659ccd9f37a493e520c4ce7a18fc132" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.sameboy" PKG_URL="https://github.com/kodi-game/game.libretro.sameboy/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-sameboy" PKG_SECTION="" PKG_LONGDESC="game.libretro.sameboy: SameBoy emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.scummvm/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.scummvm" PKG_VERSION="2.6.1.31-Nexus" PKG_SHA256="4157b119c1a7aead19511fc75e23d2f70553b9cf82208812b225637c98f07eab" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.scummvm" PKG_URL="https://github.com/kodi-game/game.libretro.scummvm/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-scummvm" PKG_SECTION="" PKG_LONGDESC="game.libretro.scummvm: scummvm for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" pre_configure_target() { export LDFLAGS=$(echo ${LDFLAGS} | sed -e "s|-Wl,--as-needed||") } ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.snes9x/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.snes9x" PKG_VERSION="1.61.0.38-Nexus" PKG_SHA256="40b29c0ace0131712f2580901b59812b6679b6fdba0943f567c7c99e9773d64a" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.snes9x" PKG_URL="https://github.com/kodi-game/game.libretro.snes9x/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-snes9x" PKG_SECTION="" PKG_LONGDESC="game.libretro.snes9x: snes9x for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.snes9x2002/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.snes9x2002" PKG_VERSION="7.2.0.34-Nexus" PKG_SHA256="f153feb2c326b60dba91af87fd0ac0a1ac31d563e12fe98c4fe942f07ed1e89b" PKG_REV="1" # neon optimizations make it only useful for arm PKG_ARCH="arm" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.snes9x2002" PKG_URL="https://github.com/kodi-game/game.libretro.snes9x2002/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-snes9x2002" PKG_SECTION="" PKG_LONGDESC="game.libretro.snes9x2002: snes9x2002 for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.snes9x2010/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.snes9x2010" PKG_VERSION="1.52.4.35-Nexus" PKG_SHA256="afb6004edbf9ee2a4deebf6c453f732aaf918b2d8aa8fcb255ed3c4d54574fe1" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.snes9x2010" PKG_URL="https://github.com/kodi-game/game.libretro.snes9x2010/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-snes9x2010" PKG_SECTION="" PKG_LONGDESC="game.libretro.snes9x2010: snes9x2010 for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.stella/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.stella" PKG_VERSION="3.9.3.38-Nexus" PKG_SHA256="0918e2294b9f904fc4b34ed9d53a02bc58c18a023782f8c90c17145b221b4a97" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.stella" PKG_URL="https://github.com/kodi-game/game.libretro.stella/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-stella" PKG_SECTION="" PKG_LONGDESC="game.libretro.stella: Stella emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.tgbdual/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.tgbdual" PKG_VERSION="0.8.3.28-Nexus" PKG_SHA256="7e6eb3f14c7929c51e0ae326615a0a99ba47eee22c85351dee0a3c189ed670e9" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.tgbdual" PKG_URL="https://github.com/kodi-game/game.libretro.tgbdual/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-tgbdual" PKG_SECTION="" PKG_LONGDESC="game.libretro.tgbdual: tgbdual for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.tyrquake/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.tyrquake" PKG_VERSION="0.62.0.35-Nexus" PKG_SHA256="9b6a0fbdf4e59e4479be179c0dc915a805b06c14b0006da9d15879811b4afc9e" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.tyrquake" PKG_URL="https://github.com/kodi-game/game.libretro.tyrquake/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-tyrquake" PKG_SECTION="" PKG_LONGDESC="game.libretro.tyrquake: tyrquake for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.uae/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.uae" PKG_VERSION="4.9.1.49-Nexus" PKG_SHA256="531af6e134c2dac0487ad7eb956cb7fa833cdb52684b383b64587e3a292336ac" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.uae" PKG_URL="https://github.com/kodi-game/game.libretro.uae/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-uae" PKG_SECTION="" PKG_LONGDESC="game.libretro.uae: uae emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.uae4arm/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.uae4arm" PKG_VERSION="0.3.0.3-Nexus" PKG_SHA256="466059ef58adbf49e9c15fd42872e9167cec97245d42df5b54f4aec7d2f13ec0" PKG_REV="1" PKG_ARCH="arm" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.uae4arm" PKG_URL="https://github.com/kodi-game/game.libretro.uae4arm/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-uae4arm" PKG_SECTION="" PKG_LONGDESC="game.libretro.uae4arm: uae4arm emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.vba-next/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.vba-next" PKG_VERSION="1.0.2.27-Nexus" PKG_SHA256="6e8f6746b6ecd245895fcf34875b101939c60378a3f7ac4c78ac9a60443c6416" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.vba-next" PKG_URL="https://github.com/kodi-game/game.libretro.vba-next/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-vba-next" PKG_SECTION="" PKG_LONGDESC="game.libretro.vba-next: VBA-Next emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.vbam/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.vbam" PKG_VERSION="2.1.3.30-Nexus" PKG_SHA256="c10536a5658bfbd3b94bc4a2c85c28a40f053decea5f13fbdf5e9b97df710402" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.vbam" PKG_URL="https://github.com/kodi-game/game.libretro.vbam/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-vbam" PKG_SECTION="" PKG_LONGDESC="game.libretro.vbam: VBA-M emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.vecx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.vecx" PKG_VERSION="1.2.0.33-Nexus" PKG_SHA256="13f552b61d83062f45cee980ab0bc1a8362db3066b0421ba04eb7b507f5b2652" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.vecx" PKG_URL="https://github.com/kodi-game/game.libretro.vecx/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-vecx" PKG_SECTION="" PKG_LONGDESC="game.libretro.vecx: vecx for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.vice/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.vice" PKG_VERSION="3.5.0.37-Nexus" PKG_SHA256="4580ae6066d351e65752c506175a16bf8603db614a754a456a995637fbf70d37" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.vice" PKG_URL="https://github.com/kodi-game/game.libretro.vice/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-vice" PKG_SECTION="" PKG_LONGDESC="game.libretro.vice: vice emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.virtualjaguar/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.virtualjaguar" PKG_VERSION="2.1.0.33-Nexus" PKG_SHA256="04386e8ab5a30831545658670054295b117670dceeea771d9fa0fa82f6064908" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.virtualjaguar" PKG_URL="https://github.com/kodi-game/game.libretro.virtualjaguar/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-virtualjaguar" PKG_SECTION="" PKG_LONGDESC="game.libretro.virtualjaguar: VirtualJaguar for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/game.libretro.yabause/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="game.libretro.yabause" PKG_VERSION="0.9.15.43-Nexus" PKG_SHA256="c485c7ff558e16260c558aac6f6a074ba95fd51b7af34b4e52f09752c96f90a8" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/game.libretro.yabause" PKG_URL="https://github.com/kodi-game/game.libretro.yabause/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libretro-yabause" PKG_SECTION="" PKG_LONGDESC="game.libretro.yabause: Yabause emulator for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.gameclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/imagedecoder.heif/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="imagedecoder.heif" PKG_VERSION="20.1.0-Nexus" PKG_SHA256="17f50aada11528c02db2ff3871a355c89709ab7e2a5e6b5e33957b790cf207ff" PKG_REV="6" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/imagedecoder.heif" PKG_URL="https://github.com/xbmc/imagedecoder.heif/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libheif tinyxml2" PKG_SECTION="" PKG_SHORTDESC="imagedecoder.heif" PKG_LONGDESC="imagedecoder.heif" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.imagedecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/imagedecoder.mpo/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="imagedecoder.mpo" PKG_VERSION="20.1.0-Nexus" PKG_SHA256="a6f38f95e5e844f75365ae083ca0a78c012bb4dc670770b3dd5d99160a64187f" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/imagedecoder.mpo" PKG_URL="https://github.com/xbmc/imagedecoder.mpo/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libjpeg-turbo tinyxml2" PKG_SECTION="" PKG_SHORTDESC="imagedecoder.mpo" PKG_LONGDESC="imagedecoder.mpo" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.imagedecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/imagedecoder.raw/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="imagedecoder.raw" PKG_VERSION="20.1.0-Nexus" PKG_SHA256="6235c0be431bbb814b3e464753af9ad17febf6001f77cbf030e6c6e1cdc41a04" PKG_REV="6" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/imagedecoder.raw" PKG_URL="https://github.com/xbmc/imagedecoder.raw/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libraw" PKG_SECTION="" PKG_SHORTDESC="imagedecoder.raw" PKG_LONGDESC="imagedecoder.raw" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.imagedecoder" ================================================ FILE: packages/mediacenter/kodi-binary-addons/inputstream.adaptive/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="inputstream.adaptive" PKG_VERSION="20.3.16-Nexus" PKG_SHA256="4651c022395f92906be40e8c923c9f90c3e9190d9dafee9e229ca1846605c5c5" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/inputstream.adaptive" PKG_URL="https://github.com/xbmc/inputstream.adaptive/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform bento4 expat" PKG_SECTION="" PKG_SHORTDESC="inputstream.adaptive" PKG_LONGDESC="inputstream.adaptive" PKG_IS_ADDON="yes" if [ "${TARGET_ARCH}" = "x86_64" ] || [ "${TARGET_ARCH}" = "arm" ]; then PKG_DEPENDS_TARGET+=" nss" fi addon() { install_binary_addon ${PKG_ADDON_ID} mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID} cp -P ${PKG_BUILD}/.${TARGET_NAME}/wvdecrypter/libssd_wv.so ${ADDON_BUILD}/${PKG_ADDON_ID} } ================================================ FILE: packages/mediacenter/kodi-binary-addons/inputstream.ffmpegdirect/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="inputstream.ffmpegdirect" PKG_VERSION="20.5.0-Nexus" PKG_SHA256="a849b6b4d5ce740ec3552d244acc4c7a4d64792358428f5154236052473d5734" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL2+" PKG_SITE="https://github.com/xbmc/inputstream.ffmpegdirect" PKG_URL="https://github.com/xbmc/inputstream.ffmpegdirect/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform bzip2 ffmpeg gmp libpng libxml2 xz zlib zvbi" PKG_SECTION="" PKG_SHORTDESC="inputstream.ffmpegdirect" PKG_LONGDESC="InputStream Client for streams that can be opened by FFmpeg's libavformat such as plain TS, HLS and DASH (without DRM) streams." PKG_IS_ADDON="yes" ================================================ FILE: packages/mediacenter/kodi-binary-addons/inputstream.rtmp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="inputstream.rtmp" PKG_VERSION="20.3.0-Nexus" PKG_SHA256="6a6129dca822e1447c0945ddf9cc6dbff1203dab313395d27efb4669a0ef3370" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/inputstream.rtmp" PKG_URL="https://github.com/xbmc/inputstream.rtmp/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform rtmpdump" PKG_SECTION="" PKG_SHORTDESC="inputstream.rtmp" PKG_LONGDESC="inputstream.rtmp" PKG_IS_ADDON="yes" ================================================ FILE: packages/mediacenter/kodi-binary-addons/peripheral.joystick/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Lukas Rusak (lrusak@libreelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="peripheral.joystick" PKG_VERSION="20.1.14-Nexus" PKG_SHA256="8c3dde851e45549d13ca3fcead9c27c440dfe070d68fb473ae71c522bc54753a" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/peripheral.joystick" PKG_URL="https://github.com/xbmc/peripheral.joystick/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform p8-platform systemd" PKG_SECTION="" PKG_SHORTDESC="peripheral.joystick: Joystick support in Kodi" PKG_LONGDESC="peripheral.joystick provides joystick support and button mapping" PKG_BUILD_FLAGS="+lto" PKG_IS_ADDON="embedded" PKG_ADDON_TYPE="kodi.peripheral" ================================================ FILE: packages/mediacenter/kodi-binary-addons/peripheral.xarcade/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="peripheral.xarcade" PKG_VERSION="20.1.3-Nexus" PKG_SHA256="e6be386ebba44e214b91784ba6e1560020daac82024c18bea7be4719340b12bd" PKG_REV="3" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-game/peripheral.xarcade" PKG_URL="https://github.com/kodi-game/peripheral.xarcade/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="X-Arcade Tankstick support for Kodi" PKG_LONGDESC="X-Arcade Tankstick support for Kodi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.peripheral" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.argustv/package.mk ================================================ # 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) PKG_NAME="pvr.argustv" PKG_VERSION="20.5.0-Nexus" PKG_SHA256="c4b18a0abf4ba0a797509d79c4291c4e69589a6482c6ec85f5d9bdae63ea3f35" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.argustv" PKG_URL="https://github.com/kodi-pvr/pvr.argustv/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform jsoncpp" PKG_SECTION="" PKG_SHORTDESC="pvr.argustv" PKG_LONGDESC="pvr.argustv" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" pre_configure_target() { CXXFLAGS+=" -Wno-narrowing" } ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.demo/package.mk ================================================ # 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) PKG_NAME="pvr.demo" PKG_VERSION="20.5.0-Nexus" PKG_SHA256="8f4d8f06e7dbeefdf6148abb06347c4d92b9edd4a818c7efd1e204a65a9556d2" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.demo" PKG_URL="https://github.com/kodi-pvr/pvr.demo/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform tinyxml2" PKG_SECTION="" PKG_SHORTDESC="pvr.demo" PKG_LONGDESC="pvr.demo" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.dvblink/package.mk ================================================ # 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) PKG_NAME="pvr.dvblink" PKG_VERSION="20.3.0-Nexus" PKG_SHA256="71a9fa64bdf7d784afc28f8b686fcdc00d9fea536c2aad1464e76e3b7648ed41" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.dvblink" PKG_URL="https://github.com/kodi-pvr/pvr.dvblink/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform tinyxml2" PKG_SECTION="" PKG_SHORTDESC="pvr.dvblink" PKG_LONGDESC="pvr.dvblink" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.dvbviewer/package.mk ================================================ # 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) PKG_NAME="pvr.dvbviewer" PKG_VERSION="20.4.0-Nexus" PKG_SHA256="dc79db0486c7ef75b4b23c4dfe94115cb12e1903c3700ef4eef04fc517fcd039" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.dvbviewer" PKG_URL="https://github.com/kodi-pvr/pvr.dvbviewer/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="pvr.dvbviewer" PKG_LONGDESC="pvr.dvbviewer" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.filmon/package.mk ================================================ # 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) PKG_NAME="pvr.filmon" PKG_VERSION="20.3.0-Nexus" PKG_SHA256="dfd2a7b64d2b647ba3f7bfba05676a593c3284e2298becfed68b82e441a69b33" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.filmon" PKG_URL="https://github.com/kodi-pvr/pvr.filmon/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform jsoncpp" PKG_SECTION="" PKG_SHORTDESC="pvr.filmon" PKG_LONGDESC="pvr.filmon" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.freebox/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.freebox" PKG_VERSION="20.3.2-Nexus" PKG_SHA256="8d84012d055874e703627e90351cf9889e883d72db05c4bcacf6d8fef0ba4c80" PKG_REV="3" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/aassif/pvr.freebox" PKG_URL="https://github.com/aassif/pvr.freebox/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform nlohmann-json openssl zlib" PKG_SECTION="" PKG_SHORTDESC="pvr.freebox" PKG_LONGDESC="pvr.freebox" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.hdhomerun/package.mk ================================================ # 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) PKG_NAME="pvr.hdhomerun" PKG_VERSION="20.4.0-Nexus" PKG_SHA256="3872265e00fc748ba327aaa91beece747936f55d16356051cdd04b0b70a353c0" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.hdhomerun" PKG_URL="https://github.com/kodi-pvr/pvr.hdhomerun/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform jsoncpp libhdhomerun" PKG_SECTION="" PKG_SHORTDESC="pvr.hdhomerun" PKG_LONGDESC="pvr.hdhomerun" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.hts/package.mk ================================================ # 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) PKG_NAME="pvr.hts" PKG_VERSION="20.7.0-Nexus" PKG_SHA256="15d68d928e0794fb42fd0f3483403fb0290c5c94aa3d3b648a8a2f8e8316dfff" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.hts" PKG_URL="https://github.com/kodi-pvr/pvr.hts/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="pvr.hts" PKG_LONGDESC="pvr.hts" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.hts/patches/pvr.hts-0001-set-speed.patch ================================================ From 9a7501d5fa1daf702597c1f3c5dc506f72ade17e Mon Sep 17 00:00:00 2001 From: afl1 Date: Sun, 24 Jun 2018 23:45:37 +0200 Subject: [PATCH] pvr.hts: allow only positive speed to fix timeshift rewind --- src/tvheadend/Subscription.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tvheadend/Subscription.cpp b/src/tvheadend/Subscription.cpp index e6d898c..d6dfc59 100644 --- a/src/tvheadend/Subscription.cpp +++ b/src/tvheadend/Subscription.cpp @@ -179,7 +179,7 @@ bool Subscription::SendSeek(std::unique_lock& lock, double htsmsg_add_u32(m, "subscriptionId", GetId()); htsmsg_add_s64(m, "time", static_cast(time * 1000LL)); htsmsg_add_u32(m, "absolute", 1); - Logger::Log(LogLevel::LEVEL_DEBUG, "demux send seek %d", time); + Logger::Log(LogLevel::LEVEL_DEBUG, "demux send seek %0.3f", time / 1000.0); /* Send and Wait */ m = m_conn.SendAndWait(lock, "subscriptionSeek", m); @@ -196,7 +196,7 @@ void Subscription::SendSpeed(std::unique_lock& lock, { /* We don't want to change the speed when restarting a subscription */ if (!restart) - SetSpeed(speed); + SetSpeed(std::abs(speed)); /* Build message */ htsmsg_t* m = htsmsg_create_map(); -- 2.30.0 ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.iptvsimple/package.mk ================================================ # 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) PKG_NAME="pvr.iptvsimple" PKG_VERSION="20.13.0-Nexus" PKG_SHA256="9edf800d7d5e755c92e9e8f6d3771a74cf3fec23b3aaec5b8535f1a579941a5b" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.iptvsimple" PKG_URL="https://github.com/kodi-pvr/pvr.iptvsimple/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform pugixml zlib xz" PKG_SECTION="" PKG_SHORTDESC="pvr.iptvsimple" PKG_LONGDESC="pvr.iptvsimple" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.mediaportal.tvserver/package.mk ================================================ # 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) PKG_NAME="pvr.mediaportal.tvserver" PKG_VERSION="20.3.0-Nexus" PKG_SHA256="a61efdadb56c65e081f8b2e99f2d5b32b3c932ca1954243548710be57c8b70b8" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.mediaportal.tvserver" PKG_URL="https://github.com/kodi-pvr/pvr.mediaportal.tvserver/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="pvr.mediaportal.tvserver" PKG_LONGDESC="pvr.mediaportal.tvserver" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" pre_configure_target() { CXXFLAGS+=" -Wno-narrowing -DXLOCALE_NOT_USED" } ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.mythtv/package.mk ================================================ # 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) PKG_NAME="pvr.mythtv" PKG_VERSION="20.5.10-Nexus" PKG_SHA256="eb21e185d1333a8696565138bc58df3d37970c9a3615193396e9f296a56a24c4" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/janbar/pvr.mythtv" PKG_URL="https://github.com/janbar/pvr.mythtv/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform zlib" PKG_SECTION="" PKG_SHORTDESC="pvr.mythtv" PKG_LONGDESC="pvr.mythtv" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.nextpvr/package.mk ================================================ # 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) PKG_NAME="pvr.nextpvr" PKG_VERSION="20.4.3-Nexus" PKG_SHA256="752dff532a277797f3fefc1ced7fea6efb8d92982d9040c4080c1e6dbab203a0" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.nextpvr" PKG_URL="https://github.com/kodi-pvr/pvr.nextpvr/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform tinyxml2" PKG_SECTION="" PKG_SHORTDESC="pvr.nextpvr" PKG_LONGDESC="pvr.nextpvr" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" pre_configure_target() { CXXFLAGS+=" -Wno-narrowing" } ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.njoy/package.mk ================================================ # 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) PKG_NAME="pvr.njoy" PKG_VERSION="20.3.0-Nexus" PKG_SHA256="0e8dc8ddce7830878c816da0836bdf5558c0dd388c48019012735a518eeefb04" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.njoy" PKG_URL="https://github.com/kodi-pvr/pvr.njoy/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="pvr.njoy" PKG_LONGDESC="pvr.njoy" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.octonet/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.octonet" PKG_VERSION="20.3.0-Nexus" PKG_SHA256="cc83ada3b3d1dbf3d42fa41f2b221c640cdc9fd505a1c76e7b479f99fe1ec8c5" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/DigitalDevices/pvr.octonet" PKG_URL="https://github.com/DigitalDevices/pvr.octonet/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform jsoncpp" PKG_SECTION="" PKG_SHORTDESC="A pvr plugin for DigitalDevices Octonet Sat>IP servers" PKG_LONGDESC="A pvr plugin for DigitalDevices Octonet Sat>IP servers" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.pctv/package.mk ================================================ # 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) PKG_NAME="pvr.pctv" PKG_VERSION="20.4.0-Nexus" PKG_SHA256="c99d3ef085c4900e0c03e5e37047dc136efced78ed245d07bc286468a31e8a65" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.pctv" PKG_URL="https://github.com/kodi-pvr/pvr.pctv/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform jsoncpp" PKG_SECTION="" PKG_SHORTDESC="pvr.pctv" PKG_LONGDESC="pvr.pctv" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.plutotv/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.plutotv" PKG_VERSION="20.3.1a-Nexus" PKG_SHA256="11505556200029a48a293e97f94e0469a5f78580d0e56d5d0a1da05d61f0f5b5" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.plutotv" PKG_URL="https://github.com/kodi-pvr/pvr.plutotv/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform rapidjson" PKG_SECTION="" PKG_SHORTDESC="pvr.plutotv" PKG_LONGDESC="pvr.plutotv" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.sledovanitv.cz/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.sledovanitv.cz" PKG_VERSION="20.7.0-Nexus" PKG_SHA256="de582551019b6659909d1ba7dd623070d7290c4c8f90d30282e2ec4c39b9b0be" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/palinek/pvr.sledovanitv.cz" PKG_URL="https://github.com/palinek/pvr.sledovanitv.cz/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform jsoncpp" PKG_SECTION="" PKG_SHORTDESC="pvr.sledovanitv.cz" PKG_LONGDESC="pvr.sledovanitv.cz" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.stalker/package.mk ================================================ # 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) PKG_NAME="pvr.stalker" PKG_VERSION="20.3.1-Nexus" PKG_SHA256="8fdd4ab4cf28d7255550b4c351a397b7ce8eb1aa1f12e93bce7d61a951fbd6f3" PKG_REV="4" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.stalker" PKG_URL="https://github.com/kodi-pvr/pvr.stalker/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform jsoncpp tinyxml" PKG_SECTION="" PKG_SHORTDESC="pvr.stalker" PKG_LONGDESC="pvr.stalker" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.teleboy/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.teleboy" PKG_VERSION="20.3.4-Nexus" PKG_SHA256="199730d6023a39a9227b29b3ac100c06fc40fbb6c0adf65c3a35ea6449ffc5ba" PKG_REV="3" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/rbuehlma/pvr.teleboy" PKG_URL="https://github.com/rbuehlma/pvr.teleboy/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform rapidjson" PKG_SECTION="" PKG_SHORTDESC="pvr.teleboy" PKG_LONGDESC="pvr.teleboy" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.vbox/package.mk ================================================ # 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) PKG_NAME="pvr.vbox" PKG_VERSION="20.4.2-Nexus" PKG_SHA256="04c50eba71426f062339491e7567545ec8c910b17c7055b28285eab14f26ca6f" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.vbox" PKG_URL="https://github.com/kodi-pvr/pvr.vbox/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform tinyxml2" PKG_SECTION="" PKG_SHORTDESC="pvr.vbox" PKG_LONGDESC="pvr.vbox" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.vdr.vnsi/package.mk ================================================ # 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) PKG_NAME="pvr.vdr.vnsi" PKG_VERSION="20.4.1-Nexus" PKG_SHA256="f26e2a9f1e9d83c5b44a8875b1f9cd37a0dbe59faf08002f083a4db95c9f84e0" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.vdr.vnsi" PKG_URL="https://github.com/kodi-pvr/pvr.vdr.vnsi/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="pvr.vdr.vnsi" PKG_LONGDESC="pvr.vdr.vnsi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" if [ "${OPENGLES_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi if [ "${OPENGL_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGL}" fi ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.vuplus/package.mk ================================================ # 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) PKG_NAME="pvr.vuplus" PKG_VERSION="20.5.1-Nexus" PKG_SHA256="467363d7015d426f05fac3f514222d7ec03aa4b61a0935fd7f00e95e9c443514" PKG_REV="2" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.vuplus" PKG_URL="https://github.com/kodi-pvr/pvr.vuplus/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform nlohmann-json" PKG_SECTION="" PKG_SHORTDESC="pvr.vuplus" PKG_LONGDESC="pvr.vuplus" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.waipu/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.waipu" PKG_VERSION="20.11.0-Nexus" PKG_SHA256="f43a7ac762b2c8bb7c2a66dc7d2a577fad92119bb4418867ce22369b96b18f8c" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/flubshi/pvr.waipu" PKG_URL="https://github.com/flubshi/pvr.waipu/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform rapidjson" PKG_SECTION="" PKG_SHORTDESC="pvr.waipu" PKG_LONGDESC="pvr.waipu" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.wmc/package.mk ================================================ # 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) PKG_NAME="pvr.wmc" PKG_VERSION="20.3.0-Nexus" PKG_SHA256="f045d871789ef3d36e1a7c7361ea35be4e14a395e75446519e937be70d2433b4" PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.wmc" PKG_URL="https://github.com/kodi-pvr/pvr.wmc/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="pvr.wmc" PKG_LONGDESC="pvr.wmc" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/pvr.zattoo/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.zattoo" PKG_VERSION="20.3.14-Nexus" PKG_SHA256="b6f5205caede6aaf57c1eab8206c5a5b3aaa6b5d8bda862d983ca53150cdf14a" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/rbuehlma/pvr.zattoo" PKG_URL="https://github.com/rbuehlma/pvr.zattoo/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform rapidjson sqlite tinyxml2" PKG_SECTION="" PKG_SHORTDESC="pvr.zattoo" PKG_LONGDESC="pvr.zattoo" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" ================================================ FILE: packages/mediacenter/kodi-binary-addons/screensaver.asteroids/package.mk ================================================ # 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) PKG_NAME="screensaver.asteroids" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="492d826efa7a252ce62a1bebf075fe9b0c0cf452929f4cd6f228003f6e445b82" PKG_REV="3" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/screensaver.asteroids" PKG_URL="https://github.com/xbmc/screensaver.asteroids/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform glm" PKG_SECTION="" PKG_SHORTDESC="screensaver.asteroids" PKG_LONGDESC="screensaver.asteroids" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.ui.screensaver" ================================================ FILE: packages/mediacenter/kodi-binary-addons/screensaver.asterwave/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Lukas Rusak (lrusak@libreelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="screensaver.asterwave" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="2c07219218fad17ef285577ff8309f7b6503302e52048d12ee20459dbcedf89c" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/screensaver.asterwave" PKG_URL="https://github.com/xbmc/screensaver.asterwave/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform glm" PKG_SECTION="" PKG_SHORTDESC="screensaver.asterwave" PKG_LONGDESC="screensaver.asterwave" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.ui.screensaver" if [ "${OPENGL}" = "no" ]; then exit 0 fi ================================================ FILE: packages/mediacenter/kodi-binary-addons/screensaver.biogenesis/package.mk ================================================ # 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) PKG_NAME="screensaver.biogenesis" PKG_VERSION="20.1.0-Nexus" PKG_SHA256="dfc291fbafe16444f3a5a5f886ba562b5d7b16ed77f4302017fbbe5f5ef9a82d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/screensaver.biogenesis" PKG_URL="https://github.com/xbmc/screensaver.biogenesis/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="screensaver.biogenesis" PKG_LONGDESC="screensaver.biogenesis" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.ui.screensaver" if [ "${OPENGL}" = "no" ]; then exit 0 fi ================================================ FILE: packages/mediacenter/kodi-binary-addons/screensaver.greynetic/package.mk ================================================ # 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) PKG_NAME="screensaver.greynetic" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="e060f69a7c403a5d7bb59058dc38e8c6a6ea1aa7bc9b82f8ffa7c5e94ede0866" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/screensaver.greynetic" PKG_URL="https://github.com/xbmc/screensaver.greynetic/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform glm" PKG_SECTION="" PKG_SHORTDESC="screensaver.greynetic" PKG_LONGDESC="screensaver.greynetic" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.ui.screensaver" if [ "${OPENGL}" = "no" ]; then exit 0 fi ================================================ FILE: packages/mediacenter/kodi-binary-addons/screensaver.matrixtrails/package.mk ================================================ # 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) PKG_NAME="screensaver.matrixtrails" PKG_VERSION="20.1.0-Nexus" PKG_SHA256="929af1a5a08399449497a13c2eb9761b4770b41445a13ee61d78b82677978ea5" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/screensaver.matrixtrails" PKG_URL="https://github.com/xbmc/screensaver.matrixtrails/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="screensaver.matrixtrails" PKG_LONGDESC="screensaver.matrixtrails" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.ui.screensaver" if [ "${OPENGL}" = "no" ]; then exit 0 fi ================================================ FILE: packages/mediacenter/kodi-binary-addons/screensaver.pingpong/package.mk ================================================ # 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) PKG_NAME="screensaver.pingpong" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="72b3c9be5b65afe7fbc6d496eb7700786d88811bfafcd131a3219a646d30805d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/screensaver.pingpong" PKG_URL="https://github.com/xbmc/screensaver.pingpong/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform glm" PKG_SECTION="" PKG_SHORTDESC="screensaver.pingpong" PKG_LONGDESC="screensaver.pingpong" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.ui.screensaver" if [ "${OPENGL}" = "no" ]; then exit 0 fi ================================================ FILE: packages/mediacenter/kodi-binary-addons/screensaver.pyro/package.mk ================================================ # 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) PKG_NAME="screensaver.pyro" PKG_VERSION="20.1.0-Nexus" PKG_SHA256="ec981d070cccdfaa9116244e80a63d86c37f67dccd11aacfcc66dcfcbb608ce1" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/screensaver.pyro" PKG_URL="https://github.com/xbmc/screensaver.pyro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="screensaver.pyro" PKG_LONGDESC="screensaver.pyro" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.ui.screensaver" if [ "${OPENGL}" = "no" ]; then exit 0 fi ================================================ FILE: packages/mediacenter/kodi-binary-addons/screensaver.shadertoy/package.mk ================================================ # 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) PKG_NAME="screensaver.shadertoy" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="91500d2c4eb97390d77fbaf5700ee472c41afa30cb76c6ecbe7e2683a14795fc" PKG_REV="2" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/screensaver.shadertoy" PKG_URL="https://github.com/xbmc/screensaver.shadertoy/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform glm" PKG_SECTION="" PKG_SHORTDESC="screensaver.shadertoy" PKG_LONGDESC="screensaver.shadertoy" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.ui.screensaver" if [ ! "${OPENGL}" = "no" ]; then # for OpenGL (GLX) support PKG_DEPENDS_TARGET+=" ${OPENGL} glew" fi if [ "${OPENGLES_SUPPORT}" = yes ]; then # for OpenGL-ES support PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi ================================================ FILE: packages/mediacenter/kodi-binary-addons/screensaver.stars/package.mk ================================================ # 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) PKG_NAME="screensaver.stars" PKG_VERSION="20.1.0-Nexus" PKG_SHA256="5ea0d19c3ef94e9603a0e06c78ae01cd6f9227da7b505eaa7d4527ca6018ea03" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/screensaver.stars" PKG_URL="https://github.com/xbmc/screensaver.stars/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform" PKG_SECTION="" PKG_SHORTDESC="screensaver.stars" PKG_LONGDESC="screensaver.stars" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.ui.screensaver" if [ "${OPENGL}" = "no" ]; then exit 0 fi ================================================ FILE: packages/mediacenter/kodi-binary-addons/vfs.libarchive/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vfs.libarchive" PKG_VERSION="20.3.0-Nexus" PKG_SHA256="06be9bfcda3e676e0757ea9602351d67f2bf0aa9aa9e408b14d947772a615e4f" PKG_REV="3" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/vfs.libarchive" PKG_URL="https://github.com/xbmc/vfs.libarchive/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform bzip2 libarchive lz4 lzo xz zlib" PKG_SECTION="" PKG_SHORTDESC="vfs.libarchive" PKG_LONGDESC="vfs.libarchive" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.vfs" ================================================ FILE: packages/mediacenter/kodi-binary-addons/vfs.sftp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vfs.sftp" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="66f139d3d06c06d03ceccdcee12b79d3886bd0ea7aec662341736f1c9bdd63e2" PKG_REV="3" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/xbmc/vfs.sftp" PKG_URL="https://github.com/xbmc/vfs.sftp/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libssh" PKG_SECTION="" PKG_SHORTDESC="vfs.sftp" PKG_LONGDESC="vfs.sftp" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="kodi.vfs" ================================================ FILE: packages/mediacenter/kodi-binary-addons/visualization.fishbmc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="visualization.fishbmc" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="168788d7cd292edf9c13c0e0e0148f19b2ecd35edd8f65f24240dff99f01677a" PKG_REV="6" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/visualization.fishbmc" PKG_URL="https://github.com/xbmc/visualization.fishbmc/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform glm" PKG_SECTION="" PKG_SHORTDESC="visualization.fishbmc" PKG_LONGDESC="visualization.fishbmc" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.player.musicviz" ================================================ FILE: packages/mediacenter/kodi-binary-addons/visualization.goom/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="visualization.goom" PKG_VERSION="20.1.1-Nexus" PKG_SHA256="75102a8c3f066a889493b77fbe26070be78c6dff8e7d44ebda89295ddb2da3b0" PKG_REV="4" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/visualization.goom" PKG_URL="https://github.com/xbmc/visualization.goom/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform glm" PKG_SECTION="" PKG_SHORTDESC="visualization.goom" PKG_LONGDESC="visualization.goom" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.player.musicviz" ================================================ FILE: packages/mediacenter/kodi-binary-addons/visualization.matrix/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="visualization.matrix" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="f0b76edf45df7161d8525fa2ba623dee64ca66d515342e942100dc46c8220553" PKG_REV="4" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/visualization.matrix" PKG_URL="https://github.com/xbmc/visualization.matrix/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform glm" PKG_SECTION="" PKG_LONGDESC="visualization.matrix" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.player.musicviz" if [ ! "${OPENGL}" = "no" ]; then # for OpenGL (GLX) support PKG_DEPENDS_TARGET+=" ${OPENGL} glew" fi if [ "${OPENGLES_SUPPORT}" = yes ]; then # for OpenGL-ES support PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi ================================================ FILE: packages/mediacenter/kodi-binary-addons/visualization.pictureit/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Lukas Rusak (lrusak@libreelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="visualization.pictureit" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="9d211b5611db09c0e27707c2200d3d0cfa5d18d2fd7705509f7dcd6601ac1985" PKG_REV="6" PKG_ARCH="x86_64" PKG_LICENSE="GPL" PKG_SITE="http://www.kodi.tv" PKG_URL="https://github.com/linuxwhatelse/visualization.pictureit/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform glm" PKG_SECTION="" PKG_SHORTDESC="visualization.pictureit" PKG_LONGDESC="visualization.pictureit" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.player.musicviz" ================================================ FILE: packages/mediacenter/kodi-binary-addons/visualization.projectm/package.mk ================================================ # 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) PKG_NAME="visualization.projectm" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="42599b0093ebc6730c3190ce28036a87042814af830441f3cb28ef11676277ae" PKG_REV="1" PKG_ARCH="x86_64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/visualization.projectm" PKG_URL="https://github.com/xbmc/visualization.projectm/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform libprojectM" PKG_SECTION="" PKG_SHORTDESC="visualization.projectm" PKG_LONGDESC="visualization.projectm" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.player.musicviz" if [ "${OPENGL}" = "no" ]; then exit 0 fi pre_configure_target() { export LDFLAGS=$(echo ${LDFLAGS} | sed -e "s|-Wl,--as-needed||") } ================================================ FILE: packages/mediacenter/kodi-binary-addons/visualization.shadertoy/package.mk ================================================ # 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) PKG_NAME="visualization.shadertoy" PKG_VERSION="20.3.0-Nexus" PKG_SHA256="2f97a34f74ee3e3e1d9fe8cfd37796564f8f88eb4c07d60b27ff635d64a5a724" PKG_REV="4" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/visualization.shadertoy" PKG_URL="https://github.com/xbmc/visualization.shadertoy/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform glm" PKG_SECTION="" PKG_SHORTDESC="visualization.shadertoy" PKG_LONGDESC="visualization.shadertoy" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.player.musicviz" if [ ! "${OPENGL}" = "no" ]; then # for OpenGL (GLX) support PKG_DEPENDS_TARGET+=" ${OPENGL} glew" fi if [ "${OPENGLES_SUPPORT}" = yes ]; then # for OpenGL-ES support PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi ================================================ FILE: packages/mediacenter/kodi-binary-addons/visualization.spectrum/package.mk ================================================ # 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) PKG_NAME="visualization.spectrum" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="1c405ea9b6f43ba5f24df13ebce12cb428369279336deb97790917aa675c809f" PKG_REV="4" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/visualization.spectrum" PKG_URL="https://github.com/xbmc/visualization.spectrum/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform glm" PKG_SECTION="" PKG_SHORTDESC="visualization.spectrum" PKG_LONGDESC="visualization.spectrum" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.player.musicviz" ================================================ FILE: packages/mediacenter/kodi-binary-addons/visualization.starburst/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="visualization.starburst" PKG_VERSION="20.2.0-Nexus" PKG_SHA256="0d63b38ba8d5b3bac542546b1ecfb7d722b79652da485d75b22086e26ef4f825" PKG_REV="4" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/visualization.starburst" PKG_URL="https://github.com/xbmc/visualization.starburst/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform glm" PKG_SECTION="" PKG_SHORTDESC="visualization.starburst" PKG_LONGDESC="visualization.starburst" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.player.musicviz" ================================================ FILE: packages/mediacenter/kodi-binary-addons/visualization.waveform/package.mk ================================================ # 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) PKG_NAME="visualization.waveform" PKG_VERSION="20.2.1-Nexus" PKG_SHA256="865e72a5f2ed8fd53469518280cbe26f9516467d091009fe5e012ea0d85d5edd" PKG_REV="4" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/visualization.waveform" PKG_URL="https://github.com/xbmc/visualization.waveform/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain kodi-platform glm" PKG_SECTION="" PKG_SHORTDESC="visualization.waveform" PKG_LONGDESC="visualization.waveform" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.player.musicviz" ================================================ FILE: packages/mediacenter/kodi-platform/package.mk ================================================ # 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) PKG_NAME="kodi-platform" PKG_VERSION="809c5e9d711e378561440a896fcb7dbcd009eb3d" PKG_SHA256="159165ae641da5eb273885ce53b8a4b84e62a595c4974f9d12c1b5d1428ef25c" PKG_LICENSE="GPL" PKG_SITE="http://www.kodi.tv" PKG_URL="https://github.com/xbmc/kodi-platform/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain tinyxml ${MEDIACENTER}:host p8-platform" PKG_LONGDESC="kodi-platform:" PKG_CMAKE_OPTS_TARGET="-DCMAKE_INSTALL_LIBDIR:STRING=lib \ -DCMAKE_INSTALL_LIBDIR_NOARCH:STRING=lib \ -DCMAKE_INSTALL_PREFIX_TOOLCHAIN=${SYSROOT_PREFIX}/usr \ -DBUILD_SHARED_LIBS=0" post_makeinstall_target() { rm -rf ${INSTALL}/usr/lib/kodiplatform } ================================================ FILE: packages/mediacenter/kodi-platform/patches/kodi-platform-01_crosscompile-badness.patch ================================================ diff --git a/CMakeLists.txt b/CMakeLists.txt index 2765341..1bd4fc2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") endif() -set(kodiplatform_INCLUDE_DIRS ${TINYXML_INCLUDE_DIR} "${CMAKE_INSTALL_PREFIX}/include/kodi") +set(kodiplatform_INCLUDE_DIRS ${TINYXML_INCLUDE_DIR}) IF(WIN32) LIST(APPEND kodiplatform_INCLUDE_DIRS "${CMAKE_INSTALL_PREFIX}/include/kodi/windows") ENDIF(WIN32) diff --git a/kodiplatform-config.cmake.in b/kodiplatform-config.cmake.in index 3fc5273..60bdf1b 100644 --- a/kodiplatform-config.cmake.in +++ b/kodiplatform-config.cmake.in @@ -10,16 +10,16 @@ # # propagate these properties from one build system to the other set (kodiplatform_VERSION "@kodiplatform_VERSION_MAJOR@.@kodiplatform_VERSION_MINOR@") -set (kodiplatform_INCLUDE_DIRS @kodiplatform_INCLUDE_DIRS@ @CMAKE_INSTALL_PREFIX@/include) +set (kodiplatform_INCLUDE_DIRS @kodiplatform_INCLUDE_DIRS@ @CMAKE_INSTALL_PREFIX_TOOLCHAIN@/include/kodi) set (kodiplatform_LIBRARY_DIRS "@CMAKE_LIBRARY_OUTPUT_DIRECTORY@") set (kodiplatform_LINKER_FLAGS "@kodiplatform_LINKER_FLAGS@") set (kodiplatform_CONFIG_VARS "@kodiplatform_CONFIG_VARS@") # libraries come from the build tree where this file was generated if(WIN32) - set (kodiplatform_LIBRARY "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@/kodiplatform.lib") + set (kodiplatform_LIBRARY "@CMAKE_INSTALL_PREFIX_TOOLCHAIN@/@CMAKE_INSTALL_LIBDIR@/kodiplatform.lib") else(WIN32) - set (kodiplatform_LIBRARY "-L@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@ -lkodiplatform") + set (kodiplatform_LIBRARY "-L@CMAKE_INSTALL_PREFIX_TOOLCHAIN@/@CMAKE_INSTALL_LIBDIR@ -lkodiplatform") endif(WIN32) set (kodiplatform_LIBRARIES ${kodiplatform_LIBRARY} "@kodiplatform_LIBRARIES@") mark_as_advanced (kodiplatform_LIBRARY) ================================================ FILE: packages/mediacenter/kodi-theme-Estuary/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="kodi-theme-Estuary" PKG_VERSION="1.0" PKG_LICENSE="GPL" PKG_SITE="http://www.kodi.tv" PKG_URL="" PKG_DEPENDS_TARGET="kodi" PKG_DEPENDS_UNPACK="kodi" PKG_LONGDESC="Kodi Mediacenter default theme." PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/share/kodi/addons/ cp -a $(get_install_dir kodi)/.noinstall/skin.estuary ${INSTALL}/usr/share/kodi/addons/ } ================================================ FILE: packages/mediacenter/p8-platform/package.mk ================================================ # 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) PKG_NAME="p8-platform" PKG_VERSION="cee64e9dc0b69e8d286dc170a78effaabfa09c44" PKG_SHA256="8d2c3c2e2951a3f202aadd774ce52e2096468a6470ef4c926dbb13bb564ea378" PKG_LICENSE="GPL" PKG_SITE="http://www.kodi.tv" PKG_URL="https://github.com/xbmc/platform/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Platform support library used by libCEC and binary add-ons for Kodi" PKG_CMAKE_OPTS_TARGET="-DCMAKE_INSTALL_LIBDIR:STRING=lib \ -DCMAKE_INSTALL_LIBDIR_NOARCH:STRING=lib \ -DCMAKE_INSTALL_PREFIX_TOOLCHAIN=${SYSROOT_PREFIX}/usr \ -DBUILD_SHARED_LIBS=0" post_makeinstall_target() { rm -rf ${INSTALL}/usr } ================================================ FILE: packages/mediacenter/p8-platform/patches/p8-platform-01-revert-cc-badness.patch ================================================ From f91594676d1f75530addd87363ccbc6510efb84e Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Fri, 8 May 2015 11:19:42 +0300 Subject: [PATCH] revert cc badness this reverts upstream commit 68f8418 --- CMakeLists.txt | 6 ------ 1 file changed, 6 deletions(-) diff -Naur a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt 2016-01-05 23:58:40.000000000 +0100 +++ b/CMakeLists.txt 2016-01-06 01:26:52.004076744 +0100 @@ -22,12 +22,6 @@ src/windows/os-threads.cpp) endif() -set(p8-platform_INCLUDE_DIRS "${CMAKE_INSTALL_PREFIX}/include/p8-platform") -IF(WIN32) - LIST(APPEND p8-platform_INCLUDE_DIRS "${CMAKE_INSTALL_PREFIX}/include/p8-platform/windows") -ENDIF(WIN32) -set(p8-platform_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) - if(NOT ${CORE_SYSTEM_NAME} STREQUAL "") if(${CORE_SYSTEM_NAME} STREQUAL "osx" OR ${CORE_SYSTEM_NAME} STREQUAL "ios") list(APPEND p8-platform_LIBRARIES "-framework CoreVideo -framework IOKit") -- 1.7.10.4 ================================================ FILE: packages/mediacenter/p8-platform/patches/p8-platform-02-cmake_install_prefix_toolchain.patch ================================================ diff --git a/p8-platform-config.cmake.in b/p8-platform-config.cmake.in index 47f30f1..df7ed21 100644 --- a/p8-platform-config.cmake.in +++ b/p8-platform-config.cmake.in @@ -10,7 +10,7 @@ # # propagate these properties from one build system to the other set (p8-platform_VERSION "@p8-platform_VERSION_MAJOR@.@p8-platform_VERSION_MINOR@") -set (p8-platform_INCLUDE_DIRS @p8-platform_INCLUDE_DIRS@ @CMAKE_INSTALL_PREFIX@/include) +set (p8-platform_INCLUDE_DIRS @p8-platform_INCLUDE_DIRS@ @CMAKE_INSTALL_PREFIX_TOOLCHAIN@/include/p8-platform) set (p8-platform_LIBRARY_DIRS "@CMAKE_LIBRARY_OUTPUT_DIRECTORY@") set (p8-platform_LINKER_FLAGS "@p8-platform_LINKER_FLAGS@") set (p8-platform_CONFIG_VARS "@p8-platform_CONFIG_VARS@") @@ -19,7 +19,7 @@ set (p8-platform_CONFIG_VARS "@p8-platform_CONFIG_VARS@") if(WIN32) set (p8-platform_LIBRARY "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@/p8-platform.lib") else(WIN32) - set (p8-platform_LIBRARY "-L@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@ -lp8-platform") + set (p8-platform_LIBRARY "-L@CMAKE_INSTALL_PREFIX_TOOLCHAIN@/@CMAKE_INSTALL_LIBDIR@ -lp8-platform") endif(WIN32) set (p8-platform_LIBRARIES ${p8-platform_LIBRARY} "@p8-platform_LIBRARIES@") mark_as_advanced (p8-platform_LIBRARY) diff --git a/p8-platform.pc.in b/p8-platform.pc.in index f97a2d4..58cd057 100644 --- a/p8-platform.pc.in +++ b/p8-platform.pc.in @@ -7,4 +7,4 @@ Name: @p8-platform_NAME@ Description: @p8-platform_DESCRIPTION@ @p8-platform_VERSION_MAJOR@.@p8-platform_VERSION_MINOR@ Version: @p8-platform_VERSION_MAJOR@.@p8-platform_VERSION_MINOR@.@p8-platform_VERSION_PATCH@ Libs: -L${libdir} -lp8-platform -Cflags: -I${includedir} +Cflags: -I${includedir}/p8-platform ================================================ FILE: packages/multimedia/SDL2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="SDL2" PKG_VERSION="2.32.10" #PKG_SHA256="332cb37d0be20cb9541739c61f79bae5a477427d79ae85e352089afdaf6666e4" PKG_LICENSE="GPL" PKG_SITE="https://www.libsdl.org/" PKG_URL="https://www.libsdl.org/release/SDL2-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain alsa-lib systemd dbus ${OPENGLES} pulseaudio" PKG_LONGDESC="Simple DirectMedia Layer is a cross-platform development library designed to provide low level access to audio, keyboard, mouse, joystick, and graphics hardware." PKG_DEPENDS_HOST="toolchain:host distutilscross:host" PKG_CMAKE_OPTS_HOST="-DSDL_MALI=OFF -DSDL_KMSDRM=OFF -DSDL_X11=OFF" PKG_CMAKE_OPTS_TARGET="-DSDL_STATIC=OFF \ -DSDL_LIBC=ON \ -DSDL_GCC_ATOMICS=ON \ -DSDL_ALTIVEC=OFF \ -DSDL_OSS=OFF \ -DSDL_ALSA=ON \ -DSDL_ALSA_SHARED=ON \ -DSDL_JACK=OFF \ -DSDL_JACK_SHARED=OFF \ -DSDL_ESD=OFF \ -DSDL_ESD_SHARED=OFF \ -DSDL_ARTS=OFF \ -DSDL_ARTS_SHARED=OFF \ -DSDL_NAS=OFF \ -DSDL_NAS_SHARED=OFF \ -DSDL_LIBSAMPLERATE=OFF \ -DSDL_LIBSAMPLERATE_SHARED=OFF \ -DSDL_SNDIO=OFF \ -DSDL_DISKAUDIO=OFF \ -DSDL_DUMMYAUDIO=OFF \ -DSDL_DUMMYVIDEO=OFF \ -DSDL_WAYLAND=OFF \ -DSDL_WAYLAND_QT_TOUCH=ON \ -DSDL_WAYLAND_SHARED=OFF \ -DSDL_COCOA=OFF \ -DSDL_DIRECTFB=OFF \ -DSDL_VIVANTE=OFF \ -DSDL_DIRECTFB_SHARED=OFF \ -DSDL_FUSIONSOUND=OFF \ -DSDL_FUSIONSOUND_SHARED=OFF \ -DSDL_PTHREADS=ON \ -DSDL_PTHREADS_SEM=ON \ -DSDL_DIRECTX=OFF \ -DSDL_CLOCK_GETTIME=OFF \ -DSDL_RPATH=OFF \ -DSDL_RENDER_D3D=OFF \ -DSDL_X11=OFF \ -DSDL_OPENGLES=ON \ -DSDL_VULKAN=OFF \ -DSDL_PULSEAUDIO=ON \ -DSDL_HIDAPI_JOYSTICK=OFF" case "${DEVICE}" in 'Amlogic-ng'|'Amlogic-no'|'Amlogic-old') # We should've used PROJECT=Amlogic-ce logically, but using these two device names here saves a comparasion (only device needs to be compared) PKG_PATCH_DIRS="Amlogic" PKG_CMAKE_OPTS_TARGET+=" -DSDL_MALI=ON -DSDL_KMSDRM=OFF" ;; 'OdroidGoAdvance'|'GameForce'|'RK356x'|'OdroidM1') PKG_PATCH_DIRS="Rockchip" PKG_CMAKE_OPTS_TARGET+=" -DSDL_KMSDRM=ON" PKG_DEPENDS_TARGET+=" libdrm mali-bifrost" if [ "${DEVICE}" = "OdroidGoAdvance" ]; then PKG_PATCH_DIRS+=" OdroidGoAdvance" PKG_DEPENDS_TARGET+=" librga" # This is evil, but we save multiple comparasions pre_make_host() { sed -i "s| -lrga||g" ${PKG_BUILD}/CMakeLists.txt } pre_make_target() { if ! `grep -rnw "${PKG_BUILD}/CMakeLists.txt" -e '-lrga'`; then sed -i "s|--no-undefined|--no-undefined -lrga|" ${PKG_BUILD}/CMakeLists.txt fi } fi ;; esac post_makeinstall_target() { sed -e "s:\(['=LI]\)/usr:\\1${SYSROOT_PREFIX}/usr:g" -i ${SYSROOT_PREFIX}/usr/bin/sdl2-config safe_remove ${INSTALL}/usr/bin } ================================================ FILE: packages/multimedia/SDL2/patches/Amlogic/0001-mali-fbdev-add-driver.patch ================================================ diff --git a/CMakeLists.txt b/CMakeLists.txt index 7e135490a..79aff66c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -474,6 +474,7 @@ set_option(SDL_WASAPI "Use the Windows WASAPI audio driver" ${WINDO set_option(SDL_RENDER_D3D "Enable the Direct3D render driver" ${WINDOWS}) set_option(SDL_RENDER_METAL "Enable the Metal render driver" ${APPLE}) set_option(SDL_VIVANTE "Use Vivante EGL video driver" ${UNIX_SYS}) +set_option(SDL_MALI "Use Mali EGL video driver" ${UNIX_SYS}) dep_option(SDL_VULKAN "Enable Vulkan support" ON "ANDROID OR APPLE OR LINUX OR WINDOWS" OFF) set_option(SDL_METAL "Enable Metal support" ${APPLE}) set_option(SDL_KMSDRM "Use KMS DRM video driver" ${UNIX_SYS}) @@ -1501,6 +1502,7 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU) CheckOpenGLES() CheckWayland() CheckVivante() + CheckMali() # FIXME: implement CheckVulkan() if(SDL_VULKAN) set(SDL_VIDEO_VULKAN 1) diff --git a/cmake/sdlchecks.cmake b/cmake/sdlchecks.cmake index a23b2ef07..d3f714b7c 100644 --- a/cmake/sdlchecks.cmake +++ b/cmake/sdlchecks.cmake @@ -841,6 +841,28 @@ macro(CheckVivante) endif() endmacro() +# Requires: +# - n/a +macro(CheckMali) + if(SDL_MALI) + check_c_source_compiles(" + #define LINUX + #define EGL_API_FB + #include + int main(int argc, char** argv) {}" HAVE_VIDEO_MALI_EGL_FB) + if(HAVE_VIDEO_MALI_EGL_FB) + set(HAVE_MALI TRUE) + set(HAVE_SDL_VIDEO TRUE) + set(SDL_VIDEO_DRIVER_MALI 1) + + file(GLOB MALI_SOURCES ${SDL2_SOURCE_DIR}/src/video/mali-fbdev/*.c) + list(APPEND SOURCE_FILES ${MALI_SOURCES}) + list(APPEND SDL_CFLAGS -DLINUX -DEGL_API_FB) + list(APPEND EXTRA_LIBS EGL) + endif() + endif() +endmacro() + # Requires: # - nada macro(CheckGLX) diff --git a/configure b/configure index 6d39b056a..d771cbaaf 100755 --- a/configure +++ b/configure @@ -922,6 +922,7 @@ enable_video_x11_xrandr enable_video_x11_scrnsaver enable_video_x11_xshape enable_video_vivante +enable_video_mali enable_video_cocoa enable_video_metal enable_render_metal @@ -1737,6 +1738,7 @@ Optional Features: --enable-video-x11-xshape enable X11 XShape support [default=yes] --enable-video-vivante use Vivante EGL video driver [default=yes] + --enable-video-mali use Mali EGL video driver [default=yes] --enable-video-cocoa use Cocoa video driver [default=yes] --enable-video-metal include Metal support [default=yes] --enable-render-metal enable the Metal render driver [default=yes] @@ -25296,6 +25298,47 @@ printf "%s\n" "#define SDL_VIDEO_DRIVER_VIVANTE_VDK 1" >>confdefs.h fi } +CheckMaliVideo() +{ + # Check whether --enable-video-mali was given. +if test "${enable_video_mali+set}" = set; then : + enableval=$enable_video_mali; +else + enable_video_mali=yes +fi + if test x$enable_video = xyes -a x$enable_video_mali = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mali FB API" >&5 +$as_echo_n "checking for Mali FB API... " >&6; } + have_mali_egl=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #define LINUX + #define EGL_API_FB + #include +int +main () +{ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + have_mali_egl=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_mali_egl" >&5 +$as_echo "$have_mali_egl" >&6; } + if test x$have_mali_egl = xyes; then +$as_echo "#define SDL_VIDEO_DRIVER_MALI 1" >>confdefs.h + EXTRA_CFLAGS="$EXTRA_CFLAGS -DLINUX -DEGL_API_FB" + SOURCES="$SOURCES $srcdir/src/video/mali-fbdev/*.c" + SUMMARY_video="${SUMMARY_video} mali" + have_video=yes + fi + fi +} + + CheckHaikuVideo() { if test x$enable_video = xyes; then @@ -28596,6 +28639,7 @@ printf "%s\n" "#define SDL_VIDEO_DRIVER_ANDROID 1" >>confdefs.h CheckLinuxVersion CheckRPATH CheckVivanteVideo + CheckMaliVideo # Set up files for the misc library if test x$enable_misc = xyes; then diff --git a/configure.ac b/configure.ac index 7be3b5c3f..7584f79e5 100644 --- a/configure.ac +++ b/configure.ac @@ -2267,6 +2267,37 @@ CheckVivanteVideo() fi } + +dnl Set up the Mali video driver if enabled +CheckMaliVideo() +{ + AC_ARG_ENABLE(video-mali, +AC_HELP_STRING([--enable-video-mali], [use Mali EGL video driver [[default=yes]]]), + , enable_video_mali=yes) + if test x$enable_video = xyes -a x$enable_video_mali = xyes; then + AC_MSG_CHECKING(for Mali FB API) + have_mali_egl=no + AC_TRY_COMPILE([ + #define LINUX + #define EGL_API_FB + #include + ],[ + ],[ + have_mali_egl=yes + ]) + AC_MSG_RESULT($have_mali_egl) + + if test x$have_mali_egl = xyes; then + AC_DEFINE(SDL_VIDEO_DRIVER_MALI, 1, [ ]) + EXTRA_CFLAGS="$EXTRA_CFLAGS -DLINUX -DEGL_API_FB" + SOURCES="$SOURCES $srcdir/src/video/mali-fbdev/*.c" + SUMMARY_video="${SUMMARY_video} mali" + have_video=yes + fi + fi +} + + dnl Set up the Haiku video driver if enabled CheckHaikuVideo() { @@ -3843,6 +3874,7 @@ case "$host" in CheckLinuxVersion CheckRPATH CheckVivanteVideo + CheckMaliVideo # Set up files for the misc library if test x$enable_misc = xyes; then diff --git a/include/SDL_config.h.cmake b/include/SDL_config.h.cmake index ffcafd895..740fd15f1 100644 --- a/include/SDL_config.h.cmake +++ b/include/SDL_config.h.cmake @@ -418,6 +418,7 @@ #cmakedefine SDL_VIDEO_DRIVER_RPI @SDL_VIDEO_DRIVER_RPI@ #cmakedefine SDL_VIDEO_DRIVER_VIVANTE @SDL_VIDEO_DRIVER_VIVANTE@ #cmakedefine SDL_VIDEO_DRIVER_VIVANTE_VDK @SDL_VIDEO_DRIVER_VIVANTE_VDK@ +#cmakedefine SDL_VIDEO_DRIVER_MALI @SDL_VIDEO_DRIVER_MALI@ #cmakedefine SDL_VIDEO_DRIVER_OS2 @SDL_VIDEO_DRIVER_OS2@ #cmakedefine SDL_VIDEO_DRIVER_QNX @SDL_VIDEO_DRIVER_QNX@ #cmakedefine SDL_VIDEO_DRIVER_RISCOS @SDL_VIDEO_DRIVER_RISCOS@ diff --git a/include/SDL_config.h.in b/include/SDL_config.h.in index f5dd166ff..29e9c1b25 100644 --- a/include/SDL_config.h.in +++ b/include/SDL_config.h.in @@ -411,6 +411,7 @@ #undef SDL_VIDEO_DRIVER_NACL #undef SDL_VIDEO_DRIVER_VIVANTE #undef SDL_VIDEO_DRIVER_VIVANTE_VDK +#undef SDL_VIDEO_DRIVER_MALI #undef SDL_VIDEO_DRIVER_OS2 #undef SDL_VIDEO_DRIVER_QNX #undef SDL_VIDEO_DRIVER_RISCOS diff --git a/src/video/SDL_egl.c b/src/video/SDL_egl.c index a89c0e812..22b4abf48 100644 --- a/src/video/SDL_egl.c +++ b/src/video/SDL_egl.c @@ -66,8 +66,8 @@ #define DEFAULT_OGL_ES_PVR (vc4 ? "libGLES_CM.so.1" : "libbrcmGLESv2.so") #define DEFAULT_OGL_ES (vc4 ? "libGLESv1_CM.so.1" : "libbrcmGLESv2.so") -#elif defined(SDL_VIDEO_DRIVER_ANDROID) || defined(SDL_VIDEO_DRIVER_VIVANTE) -/* Android */ +#elif defined(SDL_VIDEO_DRIVER_ANDROID) || defined(SDL_VIDEO_DRIVER_VIVANTE) || defined(SDL_VIDEO_DRIVER_MALI) +/* Android, Vivante, and Mali fb */ #define DEFAULT_EGL "libEGL.so" #define DEFAULT_OGL_ES2 "libGLESv2.so" #define DEFAULT_OGL_ES_PVR "libGLES_CM.so" diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index 344efec48..966c3df24 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -478,6 +478,7 @@ extern VideoBootStrap DUMMY_evdev_bootstrap; extern VideoBootStrap Wayland_bootstrap; extern VideoBootStrap NACL_bootstrap; extern VideoBootStrap VIVANTE_bootstrap; +extern VideoBootStrap MALI_bootstrap; extern VideoBootStrap Emscripten_bootstrap; extern VideoBootStrap QNX_bootstrap; extern VideoBootStrap OFFSCREEN_bootstrap; diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 04a1fdf65..c3382ca5c 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -78,6 +78,9 @@ static VideoBootStrap *bootstrap[] = { #ifdef SDL_VIDEO_DRIVER_VIVANTE &VIVANTE_bootstrap, #endif +#ifdef SDL_VIDEO_DRIVER_MALI + &MALI_bootstrap, +#endif #ifdef SDL_VIDEO_DRIVER_DIRECTFB &DirectFB_bootstrap, #endif diff --git a/src/video/mali-fbdev/SDL_maliopengles.c b/src/video/mali-fbdev/SDL_maliopengles.c new file mode 100644 index 000000000..1d59cd6fe --- /dev/null +++ b/src/video/mali-fbdev/SDL_maliopengles.c @@ -0,0 +1,41 @@ +/* +Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "../../SDL_internal.h" + +#if SDL_VIDEO_DRIVER_MALI && SDL_VIDEO_OPENGL_EGL + +#include "SDL_maliopengles.h" +#include "SDL_malivideo.h" + +/* EGL implementation of SDL OpenGL support */ + +int MALI_GLES_LoadLibrary(_THIS, const char *path) +{ + return SDL_EGL_LoadLibrary(_this, path, EGL_DEFAULT_DISPLAY, 0); +} + +SDL_EGL_CreateContext_impl(MALI) +SDL_EGL_SwapWindow_impl(MALI) +SDL_EGL_MakeCurrent_impl(MALI) + +#endif /* SDL_VIDEO_DRIVER_MALI && SDL_VIDEO_OPENGL_EGL */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/mali-fbdev/SDL_maliopengles.h b/src/video/mali-fbdev/SDL_maliopengles.h new file mode 100644 index 000000000..52ccad25f --- /dev/null +++ b/src/video/mali-fbdev/SDL_maliopengles.h @@ -0,0 +1,48 @@ +/* +Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "../../SDL_internal.h" + +#ifndef _SDL_maliopengles_h +#define _SDL_maliopengles_h + +#if defined(SDL_VIDEO_DRIVER_MALI) && defined(SDL_VIDEO_OPENGL_EGL) + +#include "../SDL_sysvideo.h" +#include "../SDL_egl_c.h" + +/* OpenGLES functions */ +#define MALI_GLES_GetAttribute SDL_EGL_GetAttribute +#define MALI_GLES_GetProcAddress SDL_EGL_GetProcAddress +#define MALI_GLES_UnloadLibrary SDL_EGL_UnloadLibrary +#define MALI_GLES_SetSwapInterval SDL_EGL_SetSwapInterval +#define MALI_GLES_GetSwapInterval SDL_EGL_GetSwapInterval +#define MALI_GLES_DeleteContext SDL_EGL_DeleteContext + +extern int MALI_GLES_LoadLibrary(_THIS, const char *path); +extern SDL_GLContext MALI_GLES_CreateContext(_THIS, SDL_Window * window); +extern int MALI_GLES_SwapWindow(_THIS, SDL_Window * window); +extern int MALI_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context); + +#endif /* SDL_VIDEO_DRIVER_MALI && SDL_VIDEO_OPENGL_EGL */ + +#endif /* _SDL_maliopengles_h */ + +/* vi: set ts=4 sw=4 expandtab: */ \ No newline at end of file diff --git a/src/video/mali-fbdev/SDL_malivideo.c b/src/video/mali-fbdev/SDL_malivideo.c new file mode 100644 index 000000000..107c6d2f1 --- /dev/null +++ b/src/video/mali-fbdev/SDL_malivideo.c @@ -0,0 +1,300 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "../../SDL_internal.h" + +#if SDL_VIDEO_DRIVER_MALI + +/* SDL internals */ +#include "../SDL_sysvideo.h" +#include "SDL_version.h" +#include "SDL_syswm.h" +#include "SDL_loadso.h" +#include "SDL_events.h" +#include "../../events/SDL_events_c.h" + +#ifdef SDL_INPUT_LINUXEV +#include "../../core/linux/SDL_evdev.h" +#endif + +#include "SDL_malivideo.h" +#include "SDL_maliopengles.h" + +static void MALI_Destroy(SDL_VideoDevice *device) +{ + if (device->driverdata != NULL) { + SDL_free(device->driverdata); + device->driverdata = NULL; + } +} + +static SDL_VideoDevice *MALI_Create() +{ + SDL_VideoDevice *device; + + /* Initialize SDL_VideoDevice structure */ + device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); + if (device == NULL) { + SDL_OutOfMemory(); + return NULL; + } + + device->driverdata = NULL; + + /* Setup amount of available displays and current display */ + device->num_displays = 0; + + /* Set device free function */ + device->free = MALI_Destroy; + + /* Setup all functions which we can handle */ + device->VideoInit = MALI_VideoInit; + device->VideoQuit = MALI_VideoQuit; + device->GetDisplayModes = MALI_GetDisplayModes; + device->SetDisplayMode = MALI_SetDisplayMode; + device->CreateSDLWindow = MALI_CreateWindow; + device->SetWindowTitle = MALI_SetWindowTitle; + device->SetWindowPosition = MALI_SetWindowPosition; + device->SetWindowSize = MALI_SetWindowSize; + device->ShowWindow = MALI_ShowWindow; + device->HideWindow = MALI_HideWindow; + device->DestroyWindow = MALI_DestroyWindow; + device->GetWindowWMInfo = MALI_GetWindowWMInfo; + + device->GL_LoadLibrary = MALI_GLES_LoadLibrary; + device->GL_GetProcAddress = MALI_GLES_GetProcAddress; + device->GL_UnloadLibrary = MALI_GLES_UnloadLibrary; + device->GL_CreateContext = MALI_GLES_CreateContext; + device->GL_MakeCurrent = MALI_GLES_MakeCurrent; + device->GL_SetSwapInterval = MALI_GLES_SetSwapInterval; + device->GL_GetSwapInterval = MALI_GLES_GetSwapInterval; + device->GL_SwapWindow = MALI_GLES_SwapWindow; + device->GL_DeleteContext = MALI_GLES_DeleteContext; + + device->PumpEvents = MALI_PumpEvents; + + return device; +} + +VideoBootStrap MALI_bootstrap = { + "mali", + "Mali EGL Video Driver", + MALI_Create, + NULL /* no ShowMessageBox implementation */ +}; + +/*****************************************************************************/ +/* SDL Video and Display initialization/handling functions */ +/*****************************************************************************/ + +int MALI_VideoInit(_THIS) +{ + SDL_VideoDisplay display; + SDL_DisplayMode current_mode; + SDL_DisplayData *data; + int fd; + struct fb_var_screeninfo vinfo; + + data = (SDL_DisplayData *) SDL_calloc(1, sizeof(SDL_DisplayData)); + if (data == NULL) { + return SDL_OutOfMemory(); + } + + + fd = open("/dev/fb0", O_RDWR, 0); + if (fd < 0) { + return SDL_SetError("mali-fbdev: Could not open framebuffer device"); + } + + if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) < 0) { + MALI_VideoQuit(_this); + return SDL_SetError("mali-fbdev: Could not get framebuffer information"); + } + + vinfo.yres_virtual = vinfo.yres * 2; +// vinfo.activate = FB_ACTIVATE_NOW; + if (ioctl(fd, FBIOPUT_VSCREENINFO, vinfo) == -1) { + printf("*** ERROR SETTING VSCREEN\n"); +// MALI_VideoQuit(_this); +// return SDL_SetError("mali-fbdev: Could not get framebuffer information"); + } + close(fd); + data->native_display.width = vinfo.xres; + data->native_display.height = vinfo.yres; + + SDL_zero(current_mode); + current_mode.w = vinfo.xres; + current_mode.h = vinfo.yres; + /* FIXME: Is there a way to tell the actual refresh rate? */ + current_mode.refresh_rate = 60; + /* 32 bpp for default */ + //current_mode.format = SDL_PIXELFORMAT_ABGR8888; + current_mode.format = SDL_PIXELFORMAT_RGBX8888; + + current_mode.driverdata = NULL; + + SDL_zero(display); + display.desktop_mode = current_mode; + display.current_mode = current_mode; + display.driverdata = data; + + SDL_AddVideoDisplay(&display, SDL_FALSE); + +#ifdef SDL_INPUT_LINUXEV + if (SDL_EVDEV_Init() < 0) { + return -1; + } +#endif + + return 0; +} + +void MALI_VideoQuit(_THIS) +{ + int fd = open("/dev/tty", O_RDWR); + ioctl(fd, VT_ACTIVATE, 5); + ioctl(fd, VT_ACTIVATE, 1); + close(fd); + system("setterm -cursor on"); + +#ifdef SDL_INPUT_LINUXEV + SDL_EVDEV_Quit(); +#endif + +} + +void MALI_GetDisplayModes(_THIS, SDL_VideoDisplay * display) +{ + /* Only one display mode available, the current one */ + SDL_AddDisplayMode(display, &display->current_mode); +} + +int MALI_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) +{ + return 0; +} + +int MALI_CreateWindow(_THIS, SDL_Window * window) +{ + SDL_WindowData *windowdata; + SDL_DisplayData *displaydata; + + displaydata = SDL_GetDisplayDriverData(0); + + /* Allocate window internal data */ + windowdata = (SDL_WindowData *) SDL_calloc(1, sizeof(SDL_WindowData)); + if (windowdata == NULL) { + return SDL_OutOfMemory(); + } + + /* Windows have one size for now */ + window->w = displaydata->native_display.width; + window->h = displaydata->native_display.height; + + /* OpenGL ES is the law here */ + window->flags |= SDL_WINDOW_OPENGL; + + if (!_this->egl_data) { + if (SDL_GL_LoadLibrary(NULL) < 0) { + return -1; + } + } + windowdata->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) &displaydata->native_display); + + if (windowdata->egl_surface == EGL_NO_SURFACE) { + MALI_VideoQuit(_this); + return SDL_SetError("mali-fbdev: Can't create EGL window surface"); + } + + /* Setup driver data for this window */ + window->driverdata = windowdata; + + /* One window, it always has focus */ + SDL_SetMouseFocus(window); + SDL_SetKeyboardFocus(window); + + /* Window has been successfully created */ + return 0; +} + +void MALI_DestroyWindow(_THIS, SDL_Window * window) +{ + SDL_WindowData *data; + + data = window->driverdata; + if (data) { + if (data->egl_surface != EGL_NO_SURFACE) { + SDL_EGL_DestroySurface(_this, data->egl_surface); + data->egl_surface = EGL_NO_SURFACE; + } + SDL_free(data); + } + window->driverdata = NULL; +} + +void MALI_SetWindowTitle(_THIS, SDL_Window * window) +{ +} + +void MALI_SetWindowPosition(_THIS, SDL_Window * window) +{ +} + +void MALI_SetWindowSize(_THIS, SDL_Window * window) +{ +} + +void MALI_ShowWindow(_THIS, SDL_Window * window) +{ +} + +void MALI_HideWindow(_THIS, SDL_Window * window) +{ +} + +/*****************************************************************************/ +/* SDL Window Manager function */ +/*****************************************************************************/ +SDL_bool MALI_GetWindowWMInfo(_THIS, SDL_Window * window, struct SDL_SysWMinfo *info) +{ + if (info->version.major <= SDL_MAJOR_VERSION) { + return SDL_TRUE; + } else { + SDL_SetError("application not compiled with SDL %d.%d\n", + SDL_MAJOR_VERSION, SDL_MINOR_VERSION); + } + + /* Failed to get window manager information */ + return SDL_FALSE; +} + +/*****************************************************************************/ +/* SDL event functions */ +/*****************************************************************************/ +void MALI_PumpEvents(_THIS) +{ +#ifdef SDL_INPUT_LINUXEV + SDL_EVDEV_Poll(); +#endif +} + +#endif /* SDL_VIDEO_DRIVER_MALI */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/mali-fbdev/SDL_malivideo.h b/src/video/mali-fbdev/SDL_malivideo.h new file mode 100644 index 000000000..162eb9da9 --- /dev/null +++ b/src/video/mali-fbdev/SDL_malivideo.h @@ -0,0 +1,82 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_malivideo_h +#define _SDL_malivideo_h + +#include "../../SDL_internal.h" +#include "../SDL_sysvideo.h" + +#include "SDL_egl.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Shadow the definition of fbdev_window +struct shadow_fbdev_window { + unsigned short width; + unsigned short height; +}; + +typedef struct SDL_DisplayData +{ + struct shadow_fbdev_window native_display; +} SDL_DisplayData; + +typedef struct SDL_WindowData +{ + EGLSurface egl_surface; +} SDL_WindowData; + +/****************************************************************************/ +/* SDL_VideoDevice functions declaration */ +/****************************************************************************/ + +/* Display and window functions */ +int MALI_VideoInit(_THIS); +void MALI_VideoQuit(_THIS); +void MALI_GetDisplayModes(_THIS, SDL_VideoDisplay *display); +int MALI_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode); +int MALI_CreateWindow(_THIS, SDL_Window *window); +void MALI_SetWindowTitle(_THIS, SDL_Window *window); +void MALI_SetWindowPosition(_THIS, SDL_Window *window); +void MALI_SetWindowSize(_THIS, SDL_Window *window); +void MALI_ShowWindow(_THIS, SDL_Window *window); +void MALI_HideWindow(_THIS, SDL_Window *window); +void MALI_DestroyWindow(_THIS, SDL_Window *window); + +/* Window manager function */ +SDL_bool MALI_GetWindowWMInfo(_THIS, SDL_Window *window, + struct SDL_SysWMinfo *info); + +/* Event functions */ +void MALI_PumpEvents(_THIS); + +#endif /* _SDL_malivideo_h */ + +/* vi: set ts=4 sw=4 expandtab: */ ================================================ FILE: packages/multimedia/SDL2/patches/OdroidGoAdvance/0005-SDL2-2.28.1.odroidgoa-support.patch ================================================ diff --git a/CMakeLists.txt b/CMakeLists.txt index 26fe83205..32a339b05 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -672,7 +672,7 @@ check_c_compiler_flag("" HAVE_NO_UNDEFINED) set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS}) if(HAVE_NO_UNDEFINED AND NOT (USE_CLANG AND WINDOWS)) - list(APPEND EXTRA_LDFLAGS_BUILD "-Wl,--no-undefined") + list(APPEND EXTRA_LDFLAGS_BUILD "-Wl,--no-undefined -lrga") endif() endif() diff --git a/Makefile.in b/Makefile.in index 65ccc55..bf4e3aa 100644 --- a/Makefile.in +++ b/Makefile.in @@ -22,7 +22,7 @@ CC = @CC@ INCLUDE = @INCLUDE@ CFLAGS = @BUILD_CFLAGS@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ -LDFLAGS = @BUILD_LDFLAGS@ +LDFLAGS = @BUILD_LDFLAGS@ -lrga EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ LIBTOOL = @LIBTOOL@ INSTALL = @INSTALL@ diff --git a/src/video/kmsdrm/SDL_kmsdrmopengles.c b/src/video/kmsdrm/SDL_kmsdrmopengles.c index 017372c..cff1b25 100644 --- a/src/video/kmsdrm/SDL_kmsdrmopengles.c +++ b/src/video/kmsdrm/SDL_kmsdrmopengles.c @@ -30,10 +30,14 @@ #include "SDL_kmsdrmopengles.h" #include "SDL_kmsdrmdyn.h" #include +#include #ifndef EGL_PLATFORM_GBM_MESA #define EGL_PLATFORM_GBM_MESA 0x31D7 #endif + +extern rga_info_t src_info; +extern rga_info_t dst_info; /* EGL implementation of SDL OpenGL support */ @@ -93,6 +97,7 @@ SDL_VideoData *viddata = ((SDL_VideoData *)_this->driverdata); KMSDRM_FBInfo *fb_info; int ret = 0; + struct gbm_bo* rga_buffer = NULL; /* Always wait for the previous issued flip before issuing a new one, even if you do async flips. */ @@ -143,7 +148,29 @@ } /* Get an actual usable fb for the next front buffer. */ - fb_info = KMSDRM_FBFromBO(_this, windata->next_bo); + //fb_info = KMSDRM_FBFromBO(_this, windata->next_bo); + + if (src_info.fd) { + close(src_info.fd); + } + src_info.fd = KMSDRM_gbm_bo_get_fd(windata->next_bo); + dst_info.fd = viddata->rga_buffer_prime_fds[viddata->rga_buffer_index]; + if (c_RkRgaBlit(&src_info, &dst_info, NULL) < 0) { + SDL_LogError(SDL_LOG_CATEGORY_VIDEO, + "Failed to rga blit\n"); + } + + rga_buffer = viddata->rga_buffers[viddata->rga_buffer_index]; + fb_info = KMSDRM_FBFromBO(_this, rga_buffer); + + if (!fb_info) { + SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "Could not get a framebuffer"); + return 0; + } + + viddata->rga_buffer_index = (viddata->rga_buffer_index + 1) % RGA_BUFFERS_MAX; + + if (!fb_info) { SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "Could not get a framebuffer"); return 0; diff --git a/src/video/kmsdrm/SDL_kmsdrmsym.h b/src/video/kmsdrm/SDL_kmsdrmsym.h index 6956232..6d8b3fd 100644 --- a/src/video/kmsdrm/SDL_kmsdrmsym.h +++ b/src/video/kmsdrm/SDL_kmsdrmsym.h @@ -133,6 +133,8 @@ SDL_KMSDRM_SYM(struct gbm_bo *,gbm_surface_lock_front_buffer,(struct gbm_surface *surf)) SDL_KMSDRM_SYM(void,gbm_surface_release_buffer,(struct gbm_surface *surf, struct gbm_bo *bo)) +SDL_KMSDRM_SYM(int,gbm_bo_get_fd,(struct gbm_bo *bo)) + SDL_KMSDRM_SYM_OPT(uint64_t,gbm_bo_get_modifier,(struct gbm_bo *bo)) SDL_KMSDRM_SYM_OPT(int,gbm_bo_get_plane_count,(struct gbm_bo *bo)) SDL_KMSDRM_SYM_OPT(uint32_t,gbm_bo_get_offset,(struct gbm_bo *bo, int plane)) diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.c b/src/video/kmsdrm/SDL_kmsdrmvideo.c index f7e7648..144f8f9 100644 --- a/src/video/kmsdrm/SDL_kmsdrmvideo.c +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.c @@ -44,6 +44,7 @@ #include "SDL_kmsdrmopengles.h" #include "SDL_kmsdrmmouse.h" #include "SDL_kmsdrmdyn.h" +#include #include "SDL_kmsdrmvulkan.h" #include #include @@ -51,6 +52,7 @@ #include #include #include +#include #ifdef __OpenBSD__ static SDL_bool openbsd69orgreater = SDL_FALSE; @@ -70,6 +72,9 @@ #ifndef EGL_PLATFORM_GBM_MESA #define EGL_PLATFORM_GBM_MESA 0x31D7 #endif + +rga_info_t src_info = {0}; +rga_info_t dst_info = {0}; static int check_modestting(int devindex) @@ -330,5 +335,45 @@ SDL_free(fb_info); } +static void +KMSDRM_InitRotateBuffer(_THIS, int frameWidth, int frameHeight) +{ + int l_frameHeight; + SDL_VideoData *viddata = ((SDL_VideoData *)_this->driverdata); + + // initialize 2D raster graphic acceleration unit (RGA) + c_RkRgaInit(); + + l_frameHeight = frameHeight; + if(l_frameHeight % 32 != 0) { + l_frameHeight = (frameHeight + 32) & (~31); + } + + // create buffers for RGA with adjusted stride + for (int i = 0; i < RGA_BUFFERS_MAX; ++i) + { + viddata->rga_buffers[i] = KMSDRM_gbm_bo_create(viddata->gbm_dev, + frameWidth, l_frameHeight, + GBM_FORMAT_XRGB8888, GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING); + assert(viddata->rga_buffers[i]); + + viddata->rga_buffer_prime_fds[i] = KMSDRM_gbm_bo_get_fd(viddata->rga_buffers[i]); + } + viddata->rga_buffer_index = 0; + + // setup rotation + src_info.fd = -1; + src_info.mmuFlag = 1; + src_info.rotation = HAL_TRANSFORM_ROT_270; + + // swap width and height and adjust stride here because our source buffer is 480x854 + rga_set_rect(&src_info.rect, 0, 0, frameHeight, frameWidth, l_frameHeight, frameWidth, RK_FORMAT_BGRA_8888); + + dst_info.fd = -1; + dst_info.mmuFlag = 1; + + rga_set_rect(&dst_info.rect, 0, 0, frameWidth, frameHeight, frameWidth, frameHeight, RK_FORMAT_BGRA_8888); +} + KMSDRM_FBInfo *KMSDRM_FBFromBO(_THIS, struct gbm_bo *bo) { @@ -687,8 +732,8 @@ modedata->mode_index = mode_index; display.driverdata = dispdata; - display.desktop_mode.w = dispdata->mode.hdisplay; - display.desktop_mode.h = dispdata->mode.vdisplay; + display.desktop_mode.w = dispdata->mode.vdisplay; + display.desktop_mode.h = dispdata->mode.hdisplay; display.desktop_mode.refresh_rate = dispdata->mode.vrefresh; display.desktop_mode.format = SDL_PIXELFORMAT_ARGB8888; display.desktop_mode.driverdata = modedata; @@ -964,7 +1009,8 @@ or SetWindowFullscreen, send a fake event for now since the actual recreation is deferred */ KMSDRM_GetModeToSet(window, &mode); - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, mode.hdisplay, mode.vdisplay); + SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, mode.vdisplay, mode.hdisplay); + } /* This determines the size of the fb, which comes from the GBM surface @@ -1000,13 +1046,13 @@ mode that's set in sync with what SDL_video.c thinks is set */ KMSDRM_GetModeToSet(window, &dispdata->mode); - display->current_mode.w = dispdata->mode.hdisplay; - display->current_mode.h = dispdata->mode.vdisplay; + display->current_mode.w = dispdata->mode.vdisplay; + display->current_mode.h = dispdata->mode.hdisplay; display->current_mode.refresh_rate = dispdata->mode.vrefresh; display->current_mode.format = SDL_PIXELFORMAT_ARGB8888; windata->gs = KMSDRM_gbm_surface_create(viddata->gbm_dev, - dispdata->mode.hdisplay, dispdata->mode.vdisplay, + dispdata->mode.vdisplay, dispdata->mode.hdisplay, surface_fmt, surface_flags); if (!windata->gs) { @@ -1030,7 +1076,7 @@ ret = SDL_EGL_MakeCurrent(_this, windata->egl_surface, egl_context); SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, - dispdata->mode.hdisplay, dispdata->mode.vdisplay); + dispdata->mode.vdisplay, dispdata->mode.hdisplay); windata->egl_surface_dirty = SDL_FALSE; @@ -1116,8 +1162,8 @@ modedata->mode_index = i; } - mode.w = conn->modes[i].hdisplay; - mode.h = conn->modes[i].vdisplay; + mode.w = conn->modes[i].vdisplay; + mode.h = conn->modes[i].hdisplay; mode.refresh_rate = conn->modes[i].vrefresh; mode.format = SDL_PIXELFORMAT_ARGB8888; mode.driverdata = modedata; @@ -1229,6 +1275,13 @@ /*********************************************************************/ SDL_free(window->driverdata); window->driverdata = NULL; + for (int i = 0; i < RGA_BUFFERS_MAX; ++i) { + close(viddata->rga_buffer_prime_fds[i]); + } + if (src_info.fd) { + close(src_info.fd); + } + c_RkRgaDeInit(); } /**********************************************************************/ @@ -1248,6 +1301,7 @@ NativeDisplayType egl_display; drmModeModeInfo *mode; int ret = 0; + SDL_DisplayData *data; /* Allocate window internal data */ windata = (SDL_WindowData *)SDL_calloc(1, sizeof(SDL_WindowData)); @@ -1356,6 +1410,9 @@ SDL_SetMouseFocus(window); SDL_SetKeyboardFocus(window); + data = (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata; + KMSDRM_InitRotateBuffer(_this, data->mode.hdisplay, data->mode.vdisplay); + /* Tell the app that the window has moved to top-left. */ SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MOVED, 0, 0); diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.h b/src/video/kmsdrm/SDL_kmsdrmvideo.h index 566fc85..10519e9 100644 --- a/src/video/kmsdrm/SDL_kmsdrmvideo.h +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.h @@ -32,6 +32,10 @@ #include #include #include +#include +#include + +#define RGA_BUFFERS_MAX (3) typedef struct SDL_VideoData { @@ -53,6 +57,10 @@ typedef struct SDL_VideoData open 1 FD and create 1 gbm device. */ SDL_bool gbm_init; + struct gbm_bo* rga_buffers[RGA_BUFFERS_MAX]; + int rga_buffer_prime_fds[RGA_BUFFERS_MAX]; + int rga_buffer_index; + } SDL_VideoData; ================================================ FILE: packages/multimedia/SDL2/patches/OdroidGoAdvance/0006-KMSDRM-Also-rotate-the-cursor.patch ================================================ From e3faf45fbcf6d274243d5dd1edbd59cfdfa7636a Mon Sep 17 00:00:00 2001 From: Johnny on Flame Date: Tue, 15 Feb 2022 02:17:17 -0300 Subject: [PATCH] KMSDRM: Also rotate the cursor. --- src/video/kmsdrm/SDL_kmsdrmmouse.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/video/kmsdrm/SDL_kmsdrmmouse.c b/src/video/kmsdrm/SDL_kmsdrmmouse.c index b22fc8e..c9d7700 100644 --- a/src/video/kmsdrm/SDL_kmsdrmmouse.c +++ b/src/video/kmsdrm/SDL_kmsdrmmouse.c @@ -156,6 +156,7 @@ uint8_t *src_row; int i; + int j; int ret; if (!curdata || !dispdata->cursor_bo) { @@ -176,8 +177,10 @@ /* Copy from the cursor buffer to a buffer that we can dump to the GBM BO. */ for (i = 0; i < curdata->h; i++) { - src_row = &((uint8_t *)curdata->buffer)[i * curdata->w * 4]; - SDL_memcpy(ready_buffer + (i * bo_stride), src_row, (size_t)4 * curdata->w); + for (j = 0; j < curdata->w; j++) { + src_row = ((uint32_t*)curdata->buffer)[i * curdata->w + j]; + SDL_memcpy(ready_buffer + ((curdata->w - j + 1) * bo_stride) + i, &src_row, 4); + } } /* Dump the cursor buffer to our GBM BO. */ @@ -216,10 +216,10 @@ KMSDRM_DumpCursorToBO(SDL_VideoDisplay *display, SDL_Cursor *cursor) bo_handle = KMSDRM_gbm_bo_get_handle(dispdata->cursor_bo).u32; if (curdata->hot_x == 0 && curdata->hot_y == 0) { ret = KMSDRM_drmModeSetCursor(viddata->drm_fd, dispdata->crtc->crtc_id, - bo_handle, dispdata->cursor_w, dispdata->cursor_h); + bo_handle, dispdata->cursor_h, dispdata->cursor_w); } else { ret = KMSDRM_drmModeSetCursor2(viddata->drm_fd, dispdata->crtc->crtc_id, - bo_handle, dispdata->cursor_w, dispdata->cursor_h, curdata->hot_x, curdata->hot_y); + bo_handle, dispdata->cursor_h, dispdata->cursor_w, curdata->hot_y, (curdata->w - curdata->hot_x + 1)); } if (ret) { @@ -417,9 +417,9 @@ KMSDRM_WarpMouseGlobal(int x, int y) SDL_Mouse *mouse = SDL_GetMouse(); if (mouse && mouse->cur_cursor && mouse->focus) { - SDL_Window *window = mouse->focus; SDL_DisplayData *dispdata = (SDL_DisplayData *)SDL_GetDisplayForWindow(window)->driverdata; + KMSDRM_CursorData *curdata = mouse->cur_cursor->driverdata; /* Update internal mouse position. */ SDL_SendMouseMotion(mouse->focus, mouse->mouseID, 0, x, y); @@ -428,7 +428,7 @@ KMSDRM_WarpMouseGlobal(int x, int y) if (dispdata->cursor_bo) { int ret = 0; - ret = KMSDRM_drmModeMoveCursor(dispdata->cursor_bo_drm_fd, dispdata->crtc->crtc_id, x, y); + ret = KMSDRM_drmModeMoveCursor(dispdata->cursor_bo_drm_fd, dispdata->crtc->crtc_id, y, dispdata->mode.vdisplay + curdata->w - x); if (ret) { SDL_SetError("drmModeMoveCursor() failed."); @@ -484,16 +484,16 @@ KMSDRM_MoveCursor(SDL_Cursor * cursor) /* We must NOT call SDL_SendMouseMotion() here or we will enter recursivity! That's why we move the cursor graphic ONLY. */ if (mouse && mouse->cur_cursor && mouse->focus) { - SDL_Window *window = mouse->focus; SDL_DisplayData *dispdata = (SDL_DisplayData *)SDL_GetDisplayForWindow(window)->driverdata; + KMSDRM_CursorData *curdata = mouse->cur_cursor->driverdata; if (!dispdata->cursor_bo) { SDL_SetError("Cursor not initialized properly."); return; } - ret = KMSDRM_drmModeMoveCursor(dispdata->cursor_bo_drm_fd, dispdata->crtc->crtc_id, mouse->x, mouse->y); + ret = KMSDRM_drmModeMoveCursor(dispdata->cursor_bo_drm_fd, dispdata->crtc->crtc_id, mouse->y, dispdata->mode.vdisplay - curdata->w - mouse->x); if (ret) { SDL_SetError("drmModeMoveCursor() failed."); -- 2.30.2 ================================================ FILE: packages/multimedia/SDL2/patches/Rockchip/0001-kmsdrm-Workaround-missing-gbm_bo_get_offset-and-SDL_.patch ================================================ diff --git a/src/video/SDL_egl.c b/src/video/SDL_egl.c index 87d693e8d..891d588c4 100644 --- a/src/video/SDL_egl.c +++ b/src/video/SDL_egl.c @@ -1032,7 +1032,7 @@ SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface) return NULL; } - _this->egl_data->egl_swapinterval = 0; + _this->egl_data->egl_swapinterval = 1; if (SDL_EGL_MakeCurrent(_this, egl_surface, egl_context) < 0) { /* Save the SDL error set by SDL_EGL_MakeCurrent */ --- a/src/video/kmsdrm/SDL_kmsdrmopengles.c +++ b/src/video/kmsdrm/SDL_kmsdrmopengles.c @@ -41,11 +41,17 @@ { /* if SDL was _also_ built with the Raspberry Pi driver (so we're definitely a Pi device), default to GLES2. */ -#ifdef SDL_VIDEO_DRIVER_RPI - *mask = SDL_GL_CONTEXT_PROFILE_ES; - *major = 2; - *minor = 0; + /* JohnnyonFlame: We want to use GLESv2 as a default for compatibility + with SDL 2.0.10 builds, but offer the ability to use the OpenGL defaults + if ever needed. */ +#ifndef SDL_VIDEO_DRIVER_RPI + if (!SDL_getenv("SDL_DEFAULT_CONTEXT_PROFILE")) #endif + { + *mask = SDL_GL_CONTEXT_PROFILE_ES; + *major = 2; + *minor = 0; + } } int KMSDRM_GLES_LoadLibrary(_THIS, const char *path) @@ -73,6 +79,7 @@ int KMSDRM_GLES_SetSwapInterval(_THIS, int interval) { + interval = 1; if (!_this->egl_data) { return SDL_SetError("EGL not initialized"); } ================================================ FILE: packages/multimedia/aom/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="aom" PKG_VERSION="3.5.0" PKG_SHA256="d37dbee372e2430a7efde813984ae6d78bdf1fc4080ebe32457c9115408b0738" PKG_LICENSE="BSD" PKG_SITE="https://www.webmproject.org" PKG_URL="https://storage.googleapis.com/aom-releases/libaom-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="AV1 Codec Library" PKG_BUILD_FLAGS="+pic" PKG_CMAKE_OPTS_TARGET="-DENABLE_CCACHE=1 \ -DENABLE_DOCS=0 \ -DENABLE_EXAMPLES=0 \ -DENABLE_TESTS=0 \ -DENABLE_TOOLS=0" if [ "${TARGET_ARCH}" = "x86_64" ]; then PKG_DEPENDS_TARGET+=" nasm:host" elif ! target_has_feature neon; then PKG_CMAKE_OPTS_TARGET+=" -DENABLE_NEON=0 -DENABLE_NEON_ASM=0" fi ================================================ FILE: packages/multimedia/bento4/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="bento4" PKG_VERSION="1.6.0-639-7-Omega" PKG_SHA256="4464cd47b597e6dedbfc231bb6eb097c45cfe5ee0051082460d9ac53e9d74dc3" PKG_LICENSE="GPL" PKG_SITE="https://www.bento4.com" PKG_URL="https://github.com/xbmc/Bento4/archive/refs/tags/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_DEPENDS_UNPACK="inputstream.adaptive" PKG_LONGDESC="C++ class library and tools designed to read and write ISO-MP4 files" PKG_BUILD_FLAGS="+pic" PKG_CMAKE_OPTS_TARGET="-DBUILD_APPS=OFF" ================================================ FILE: packages/multimedia/dav1d/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="dav1d" PKG_VERSION="1.0.0" PKG_SHA256="4a4eb6cecbc8c26916ef58886d478243de8bcc46710b369c04d6891b0155ac0f" PKG_LICENSE="BSD" PKG_SITE="http://www.jbkempf.com/blog/post/2018/Introducing-dav1d" PKG_URL="https://code.videolan.org/videolan/dav1d/-/archive/${PKG_VERSION}/dav1d-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="dav1d is an AV1 decoder :)" if [ "${TARGET_ARCH}" = "x86_64" ]; then PKG_DEPENDS_TARGET+=" nasm:host" fi PKG_MESON_OPTS_TARGET="-Denable_docs=false \ -Denable_examples=false \ -Denable_tests=false \ -Denable_tools=false \ -Dtestdata_tests=false" ================================================ FILE: packages/multimedia/ffmpeg/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ffmpeg" PKG_VERSION="4.4.1" PKG_SHA256="eadbad9e9ab30b25f5520fbfde99fae4a92a1ae3c0257a8d68569a4651e30e02" PKG_LICENSE="GPL-3.0-only" PKG_SITE="https://ffmpeg.org" PKG_URL="http://ffmpeg.org/releases/ffmpeg-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain zlib bzip2 openssl speex SDL2 lame x264 libtheora" PKG_LONGDESC="FFmpeg is a complete, cross-platform solution to record, convert and stream audio and video." PKG_PATCH_DIRS="kodi libreelec" case "${PROJECT}" in Amlogic) PKG_VERSION="f9638b6331277e53ecd9276db5fe6dcd91d44c57" PKG_FFMPEG_BRANCH="dev/4.4/rpi_import_1" PKG_SHA256="3b42cbffd15d95d59e402475fcdb1aaac9ae6a8404a521b95d1fe79c6b2baad4" PKG_URL="https://github.com/jc-kynesim/rpi-ffmpeg/archive/${PKG_VERSION}.tar.gz" PKG_PATCH_DIRS="libreelec dav1d" ;; RPi) PKG_FFMPEG_RPI="--disable-mmal --disable-rpi --enable-sand" PKG_PATCH_DIRS+=" rpi" ;; *) PKG_PATCH_DIRS+=" v4l2-request v4l2-drmprime" ;; esac case "${DEVICE}" in Amlogic-ne|Amlogic-no|Amlogic-ng-dv) PKG_PATCH_DIRS+=" dv" ;; esac post_unpack() { # Fix FFmpeg version if [ "${PROJECT}" = "Amlogic" ]; then echo "${PKG_FFMPEG_BRANCH}-${PKG_VERSION:0:7}" > ${PKG_BUILD}/VERSION else echo "${PKG_VERSION}" > ${PKG_BUILD}/RELEASE fi } # Dependencies get_graphicdrivers PKG_FFMPEG_HWACCEL="--enable-hwaccels" if [ "${V4L2_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" libdrm" PKG_NEED_UNPACK+=" $(get_pkg_directory libdrm)" PKG_FFMPEG_V4L2="--enable-v4l2_m2m --enable-libdrm" if [ "${PROJECT}" = "Allwinner" -o "${PROJECT}" = "Rockchip" -o "${DEVICE}" = "iMX8" ]; then PKG_V4L2_REQUEST="yes" elif [ "${PROJECT}" = "RPi" ] && [ "${DEVICE}" = "RPi4" -o "${DEVICE}" = "RPi5" ]; then PKG_V4L2_REQUEST="yes" PKG_FFMPEG_HWACCEL="--disable-hwaccel=h264_v4l2request \ --disable-hwaccel=mpeg2_v4l2request \ --disable-hwaccel=vp8_v4l2request \ --disable-hwaccel=vp9_v4l2request" else PKG_V4L2_REQUEST="no" fi if [ "${PKG_V4L2_REQUEST}" = "yes" ]; then PKG_DEPENDS_TARGET+=" systemd" PKG_NEED_UNPACK+=" $(get_pkg_directory systemd)" PKG_FFMPEG_V4L2+=" --enable-libudev --enable-v4l2-request" else PKG_FFMPEG_V4L2+=" --disable-libudev --disable-v4l2-request" fi else PKG_FFMPEG_V4L2="--disable-v4l2_m2m --disable-libudev --disable-v4l2-request" fi if [ "${VAAPI_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" libva" PKG_NEED_UNPACK+=" $(get_pkg_directory libva)" PKG_FFMPEG_VAAPI="--enable-vaapi" else PKG_FFMPEG_VAAPI="--disable-vaapi" fi if [ "${DISPLAYSERVER}" != "x11" ] && [ ${PROJECT} != "Amlogic-ce" ]; then PKG_DEPENDS_TARGET+=" libdrm" PKG_NEED_UNPACK+=" $(get_pkg_directory libdrm)" PKG_FFMPEG_VAAPI=" --enable-libdrm" fi if [ "${VDPAU_SUPPORT}" = "yes" -a "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" libvdpau" PKG_NEED_UNPACK+=" $(get_pkg_directory libvdpau)" PKG_FFMPEG_VDPAU="--enable-vdpau" else PKG_FFMPEG_VDPAU="--disable-vdpau" fi if build_with_debug; then PKG_FFMPEG_DEBUG="--enable-debug --disable-stripping" else PKG_FFMPEG_DEBUG="--disable-debug --enable-stripping" fi if target_has_feature neon; then PKG_FFMPEG_FPU="--enable-neon" else PKG_FFMPEG_FPU="--disable-neon" fi if [ "${TARGET_ARCH}" = "x86_64" ]; then PKG_DEPENDS_TARGET+=" nasm:host" fi if target_has_feature "(neon|sse)"; then PKG_DEPENDS_TARGET+=" dav1d" PKG_NEED_UNPACK+=" $(get_pkg_directory dav1d)" PKG_FFMPEG_AV1="--enable-libdav1d" else PKG_FFMPEG_AV1="--disable-libdav1d" fi pre_configure_target() { cd ${PKG_BUILD} rm -rf .${TARGET_NAME} } if [ "${FFMPEG_TESTING}" = "yes" ]; then PKG_FFMPEG_TESTING="--enable-encoder=wrapped_avframe --enable-muxer=null" if [ "${PROJECT}" = "RPi" ]; then PKG_FFMPEG_TESTING+=" --enable-vout-drm --enable-outdev=vout_drm" fi else PKG_FFMPEG_TESTING="--enable-ffplay" #"--disable-programs" fi configure_target() { if [ ${DISTRO} == "EmuELEC" ]; then sed -i "s|int hide_banner = 0|int hide_banner = 1|" ${PKG_BUILD}/fftools/cmdutils.c sed -i "s|SDL2_CONFIG=\"\${cross_prefix}sdl2-config\"|SDL2_CONFIG=\"${SYSROOT_PREFIX}/usr/bin/sdl2-config\"|" ${PKG_BUILD}/configure fi ./configure --prefix="/usr" \ --cpu="${TARGET_CPU}" \ --arch="${TARGET_ARCH}" \ --enable-cross-compile \ --cross-prefix="${TARGET_PREFIX}" \ --sysroot="${SYSROOT_PREFIX}" \ --sysinclude="${SYSROOT_PREFIX}/usr/include" \ --target-os="linux" \ --nm="${NM}" \ --ar="${AR}" \ --as="${CC}" \ --cc="${CC}" \ --ld="${CC}" \ --host-cc="${HOST_CC}" \ --host-cflags="${HOST_CFLAGS}" \ --host-ldflags="${HOST_LDFLAGS}" \ --extra-cflags="${CFLAGS}" \ --extra-ldflags="${LDFLAGS}" \ --extra-libs="${PKG_FFMPEG_LIBS}" \ --disable-static \ --enable-shared \ --enable-gpl \ --enable-version3 \ --enable-logging \ --disable-doc \ ${PKG_FFMPEG_DEBUG} \ --enable-pic \ --pkg-config="${TOOLCHAIN}/bin/pkg-config" \ --enable-optimizations \ --disable-extra-warnings \ --enable-avdevice \ --enable-avcodec \ --enable-avformat \ --enable-swscale \ --enable-postproc \ --enable-avfilter \ --enable-pthreads \ --enable-network \ --disable-gnutls --enable-openssl \ --disable-gray \ --enable-swscale-alpha \ --disable-small \ --enable-dct \ --enable-fft \ --enable-mdct \ --enable-rdft \ --disable-crystalhd \ ${PKG_FFMPEG_V4L2} \ ${PKG_FFMPEG_VAAPI} \ ${PKG_FFMPEG_VDPAU} \ ${PKG_FFMPEG_RPI} \ --enable-runtime-cpudetect \ --disable-hardcoded-tables \ --enable-encoder=ac3 \ --enable-encoder=libmp3lame \ --enable-encoder=libtheora \ --enable-encoder=aac \ --enable-encoder=wmav2 \ --enable-encoder=mjpeg \ --enable-encoder=png \ --enable-encoder=mpeg4 \ --enable-encoder=libx264 \ ${PKG_FFMPEG_HWACCEL} \ --enable-muxer=spdif \ --enable-muxer=adts \ --enable-muxer=asf \ --enable-muxer=ipod \ --enable-muxer=mpegts \ --enable-demuxers \ --enable-parsers \ --enable-bsfs \ --enable-protocol=http \ --enable-filters \ --disable-avisynth \ --enable-bzlib \ --disable-lzma \ --disable-alsa \ --disable-frei0r \ --disable-libopencore-amrnb \ --disable-libopencore-amrwb \ --disable-libopencv \ --disable-libdc1394 \ --disable-libfreetype \ --disable-libgsm \ --enable-libmp3lame \ --disable-libopenjpeg \ --disable-librtmp \ ${PKG_FFMPEG_AV1} \ --enable-libspeex \ --enable-libtheora \ --disable-libvo-amrwbenc \ --disable-libvorbis \ --disable-libvpx \ --enable-libx264 \ --disable-libxavs \ --disable-libxvid \ --enable-zlib \ --enable-asm \ --disable-altivec \ ${PKG_FFMPEG_FPU} \ --disable-symver \ ${PKG_FFMPEG_TESTING} } post_makeinstall_target() { rm -rf ${INSTALL}/usr/share/ffmpeg/examples } ================================================ FILE: packages/multimedia/ffmpeg/patches/dav1d/ffmpeg-support-dav1d-1-0-0.patch ================================================ From 7ee17ec7e46afef0e0af20af196292ec75f50b62 Mon Sep 17 00:00:00 2001 From: James Almer Date: Sat, 26 Jun 2021 17:24:15 -0300 Subject: [PATCH] avcodec/libdav1d: don't repeatedly parse the same sequence header Look at the event flag that signals a new sequence header was found in the bitstream on supported libdav1d versions for this purpose. Signed-off-by: James Almer --- libavcodec/libdav1d.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c index 6370ae1fbf02..c39df418d515 100644 --- a/libavcodec/libdav1d.c +++ b/libavcodec/libdav1d.c @@ -33,6 +33,9 @@ #include "decode.h" #include "internal.h" +#define FF_DAV1D_VERSION_AT_LEAST(x,y) \ + (DAV1D_API_VERSION_MAJOR > (x) || DAV1D_API_VERSION_MAJOR == (x) && DAV1D_API_VERSION_MINOR >= (y)) + typedef struct Libdav1dContext { AVClass *class; Dav1dContext *c; From d873b5fffc8292242549c4c026023e370e15c05b Mon Sep 17 00:00:00 2001 From: James Almer Date: Mon, 20 Sep 2021 22:30:35 -0300 Subject: [PATCH] avcodec/libdav1d: pass auto threads value to libdav1d libdav1d 1.0.0 will be the first version supporting Dav1dSettings.n_threads == 0. Signed-off-by: James Almer --- libavcodec/libdav1d.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c index 4711337f39a7..e4fdaf722907 100644 --- a/libavcodec/libdav1d.c +++ b/libavcodec/libdav1d.c @@ -207,7 +207,11 @@ static av_cold int libdav1d_init(AVCodecContext *c) { Libdav1dContext *dav1d = c->priv_data; Dav1dSettings s; +#if FF_DAV1D_VERSION_AT_LEAST(6,0) + int threads = c->thread_count; +#else int threads = (c->thread_count ? c->thread_count : av_cpu_count()) * 3 / 2; +#endif int res; av_log(c, AV_LOG_INFO, "libdav1d %s\n", dav1d_version()); From e204846ec16c1ab34c7f3a681734cf5190433018 Mon Sep 17 00:00:00 2001 From: James Almer Date: Fri, 3 Sep 2021 13:50:32 -0300 Subject: [PATCH] avcodec/libdav1d: fix compilation after recent libdav1d API changes They were done in preparation for an upcoming 1.0 release. Keep supporting previous releases for the time being. Reviewed-by: BBB Signed-off-by: James Almer --- libavcodec/libdav1d.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c index 51e0980f6edb..4711337f39a7 100644 --- a/libavcodec/libdav1d.c +++ b/libavcodec/libdav1d.c @@ -228,6 +228,15 @@ static av_cold int libdav1d_init(AVCodecContext *c) if (dav1d->operating_point >= 0) s.operating_point = dav1d->operating_point; +#if FF_DAV1D_VERSION_AT_LEAST(6,0) + if (dav1d->frame_threads || dav1d->tile_threads) + s.n_threads = FFMAX(dav1d->frame_threads, dav1d->tile_threads); + else + s.n_threads = FFMIN(threads, DAV1D_MAX_THREADS); + s.max_frame_delay = (c->flags & AV_CODEC_FLAG_LOW_DELAY) ? 1 : s.n_threads; + av_log(c, AV_LOG_DEBUG, "Using %d threads, %d max_frame_delay\n", + s.n_threads, s.max_frame_delay); +#else s.n_tile_threads = dav1d->tile_threads ? dav1d->tile_threads : FFMIN(floor(sqrt(threads)), DAV1D_MAX_TILE_THREADS); @@ -236,6 +245,7 @@ static av_cold int libdav1d_init(AVCodecContext *c) : FFMIN(ceil(threads / s.n_tile_threads), DAV1D_MAX_FRAME_THREADS); av_log(c, AV_LOG_DEBUG, "Using %d frame threads, %d tile threads\n", s.n_frame_threads, s.n_tile_threads); +#endif res = libdav1d_parse_extradata(c); if (res < 0) @@ -519,11 +529,18 @@ static av_cold int libdav1d_close(AVCodecContext *c) return 0; } +#ifndef DAV1D_MAX_FRAME_THREADS +#define DAV1D_MAX_FRAME_THREADS DAV1D_MAX_THREADS +#endif +#ifndef DAV1D_MAX_TILE_THREADS +#define DAV1D_MAX_TILE_THREADS DAV1D_MAX_THREADS +#endif + #define OFFSET(x) offsetof(Libdav1dContext, x) #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM static const AVOption libdav1d_options[] = { - { "tilethreads", "Tile threads", OFFSET(tile_threads), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, DAV1D_MAX_TILE_THREADS, VD }, - { "framethreads", "Frame threads", OFFSET(frame_threads), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, DAV1D_MAX_FRAME_THREADS, VD }, + { "tilethreads", "Tile threads", OFFSET(tile_threads), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, DAV1D_MAX_TILE_THREADS, VD | AV_OPT_FLAG_DEPRECATED }, + { "framethreads", "Frame threads", OFFSET(frame_threads), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, DAV1D_MAX_FRAME_THREADS, VD | AV_OPT_FLAG_DEPRECATED }, { "filmgrain", "Apply Film Grain", OFFSET(apply_grain), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VD | AV_OPT_FLAG_DEPRECATED }, { "oppoint", "Select an operating point of the scalable bitstream", OFFSET(operating_point), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 31, VD }, { "alllayers", "Output all spatial layers", OFFSET(all_layers), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD }, ================================================ FILE: packages/multimedia/ffmpeg/patches/dv/ffmpeg-001-avformat-dovi_isom-Implement-Dolby-Vision-configurat.patch ================================================ From c0ce2d9ab67c2677160fc8f562ba646f84acf88f Mon Sep 17 00:00:00 2001 From: quietvoid Date: Sat, 1 Jan 2022 17:51:49 +0100 Subject: [PATCH 1/2] avformat/dovi_isom: Implement Dolby Vision configuration parsing/writing Both parse/write implementations are based on mov/movenc. This only adds support for the "Dolby Vision configuration box". Other configuration boxes, such as "Dolby Vision enhancement layer configuration box" are not supported. The new functions will be used to implement parsing/writing the DOVI config for Matroska, as well as to refactor both mov/movenc to use dovi_isom functions. Signed-off-by: quietvoid Signed-off-by: Andreas Rheinhardt --- libavformat/dovi_isom.c | 118 ++++++++++++++++++++++++++++++++++++++++ libavformat/dovi_isom.h | 35 ++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 libavformat/dovi_isom.c create mode 100644 libavformat/dovi_isom.h diff --git a/libavformat/dovi_isom.c b/libavformat/dovi_isom.c new file mode 100644 index 0000000000..76681b9451 --- /dev/null +++ b/libavformat/dovi_isom.c @@ -0,0 +1,118 @@ +/* + * DOVI ISO Media common code + * + * Copyright (c) 2020 Vacing Fang + * Copyright (c) 2021 quietvoid + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/dovi_meta.h" + +#include "libavcodec/put_bits.h" + +#include "avformat.h" +#include "dovi_isom.h" + +int ff_isom_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const uint8_t *buf_ptr, uint64_t size) +{ + uint32_t buf; + AVDOVIDecoderConfigurationRecord *dovi; + size_t dovi_size; + int ret; + + if (size > (1 << 30) || size < 4) + return AVERROR_INVALIDDATA; + + dovi = av_dovi_alloc(&dovi_size); + if (!dovi) + return AVERROR(ENOMEM); + + dovi->dv_version_major = *buf_ptr++; // 8 bits + dovi->dv_version_minor = *buf_ptr++; // 8 bits + + buf = *buf_ptr++ << 8; + buf |= *buf_ptr++; + + dovi->dv_profile = (buf >> 9) & 0x7f; // 7 bits + dovi->dv_level = (buf >> 3) & 0x3f; // 6 bits + dovi->rpu_present_flag = (buf >> 2) & 0x01; // 1 bit + dovi->el_present_flag = (buf >> 1) & 0x01; // 1 bit + dovi->bl_present_flag = buf & 0x01; // 1 bit + + // Has enough remaining data + if (size >= 5) { + dovi->dv_bl_signal_compatibility_id = ((*buf_ptr++) >> 4) & 0x0f; // 4 bits + } else { + // 0 stands for None + // Dolby Vision V1.2.93 profiles and levels + dovi->dv_bl_signal_compatibility_id = 0; + } + + ret = av_stream_add_side_data(st, AV_PKT_DATA_DOVI_CONF, + (uint8_t *)dovi, dovi_size); + if (ret < 0) { + av_free(dovi); + return ret; + } + + av_log(s, AV_LOG_TRACE, "DOVI in dvcC/dvvC/dvwC box, version: %d.%d, profile: %d, level: %d, " + "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n", + dovi->dv_version_major, dovi->dv_version_minor, + dovi->dv_profile, dovi->dv_level, + dovi->rpu_present_flag, + dovi->el_present_flag, + dovi->bl_present_flag, + dovi->dv_bl_signal_compatibility_id); + + return 0; +} + +void ff_isom_put_dvcc_dvvc(AVFormatContext *s, uint8_t out[ISOM_DVCC_DVVC_SIZE], + AVDOVIDecoderConfigurationRecord *dovi) +{ + PutBitContext pb; + + init_put_bits(&pb, out, ISOM_DVCC_DVVC_SIZE); + + put_bits(&pb, 8, dovi->dv_version_major); + put_bits(&pb, 8, dovi->dv_version_minor); + put_bits(&pb, 7, dovi->dv_profile & 0x7f); + put_bits(&pb, 6, dovi->dv_level & 0x3f); + put_bits(&pb, 1, !!dovi->rpu_present_flag); + put_bits(&pb, 1, !!dovi->el_present_flag); + put_bits(&pb, 1, !!dovi->bl_present_flag); + put_bits(&pb, 4, dovi->dv_bl_signal_compatibility_id & 0x0f); + + put_bits(&pb, 28, 0); /* reserved */ + put_bits32(&pb, 0); /* reserved */ + put_bits32(&pb, 0); /* reserved */ + put_bits32(&pb, 0); /* reserved */ + put_bits32(&pb, 0); /* reserved */ + + flush_put_bits(&pb); + + av_log(s, AV_LOG_DEBUG, "DOVI in %s box, version: %d.%d, profile: %d, level: %d, " + "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n", + dovi->dv_profile > 10 ? "dvwC" : (dovi->dv_profile > 7 ? "dvvC" : "dvcC"), + dovi->dv_version_major, dovi->dv_version_minor, + dovi->dv_profile, dovi->dv_level, + dovi->rpu_present_flag, + dovi->el_present_flag, + dovi->bl_present_flag, + dovi->dv_bl_signal_compatibility_id); +} diff --git a/libavformat/dovi_isom.h b/libavformat/dovi_isom.h new file mode 100644 index 0000000000..1526164319 --- /dev/null +++ b/libavformat/dovi_isom.h @@ -0,0 +1,35 @@ +/* + * DOVI ISO Media common code + * Copyright (c) 2021 quietvoid + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVFORMAT_DOVI_ISOM_H +#define AVFORMAT_DOVI_ISOM_H + +#include "libavutil/dovi_meta.h" + +#include "avformat.h" + +#define ISOM_DVCC_DVVC_SIZE 24 + +int ff_isom_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const uint8_t *buf_ptr, uint64_t size); +void ff_isom_put_dvcc_dvvc(AVFormatContext *s, uint8_t out[ISOM_DVCC_DVVC_SIZE], + AVDOVIDecoderConfigurationRecord *dovi); + +#endif /* AVFORMAT_DOVI_ISOM_H */ -- 2.40.1 ================================================ FILE: packages/multimedia/ffmpeg/patches/dv/ffmpeg-002-avformat-matroska-dec-enc-Parse-BlockAdditionMapping.patch ================================================ From 700f0c683013310d35d15db5c41fb17cd52138f7 Mon Sep 17 00:00:00 2001 From: quietvoid Date: Sat, 1 Jan 2022 17:51:50 +0100 Subject: [PATCH 2/2] avformat/matroska{dec, enc}: Parse BlockAdditionMapping elements Adds handling of dvcC/dvvC block addition mappings. The parsing creates AVDOVIDecoderConfigurationRecord side data. The configuration block is written when muxing into Matroska, if DOVI side data is present for the track. Most of the Matroska element parsing is based on Plex's FFmpeg source code. Signed-off-by: quietvoid Signed-off-by: Andreas Rheinhardt --- libavformat/Makefile | 4 +-- libavformat/matroska.h | 9 ++++++ libavformat/matroskadec.c | 58 +++++++++++++++++++++++++++++++++++++-- libavformat/matroskaenc.c | 37 +++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 4 deletions(-) diff --git a/libavformat/Makefile b/libavformat/Makefile index 0f340f74a0..e48f44766b 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -309,11 +309,11 @@ OBJS-$(CONFIG_M4V_MUXER) += rawenc.o OBJS-$(CONFIG_MATROSKA_DEMUXER) += matroskadec.o matroska.o \ flac_picture.o isom_tags.o rmsipr.o \ oggparsevorbis.o vorbiscomment.o \ - qtpalette.o replaygain.o + qtpalette.o replaygain.o dovi_isom.o OBJS-$(CONFIG_MATROSKA_MUXER) += matroskaenc.o matroska.o \ av1.o avc.o hevc.o isom_tags.o \ flacenc_header.o avlanguage.o \ - vorbiscomment.o wv.o + vorbiscomment.o wv.o dovi_isom.o OBJS-$(CONFIG_MCA_DEMUXER) += mca.o OBJS-$(CONFIG_MCC_DEMUXER) += mccdec.o subtitles.o OBJS-$(CONFIG_MD5_MUXER) += hashenc.o diff --git a/libavformat/matroska.h b/libavformat/matroska.h index 30cbe18a8b..01fdf5ae57 100644 --- a/libavformat/matroska.h +++ b/libavformat/matroska.h @@ -111,6 +111,7 @@ #define MATROSKA_ID_TRACKCONTENTENCODING 0x6240 #define MATROSKA_ID_TRACKTIMECODESCALE 0x23314F #define MATROSKA_ID_TRACKMAXBLKADDID 0x55EE +#define MATROSKA_ID_TRACKBLKADDMAPPING 0x41E4 /* IDs in the trackvideo master */ #define MATROSKA_ID_VIDEOFRAMERATE 0x2383E3 @@ -189,6 +190,12 @@ #define MATROSKA_ID_ENCODINGSIGKEYID 0x47E4 #define MATROSKA_ID_ENCODINGSIGNATURE 0x47E3 +/* IDs in the block addition mapping master */ +#define MATROSKA_ID_BLKADDIDVALUE 0x41F0 +#define MATROSKA_ID_BLKADDIDNAME 0x41A4 +#define MATROSKA_ID_BLKADDIDTYPE 0x41E7 +#define MATROSKA_ID_BLKADDIDEXTRADATA 0x41ED + /* ID in the cues master */ #define MATROSKA_ID_POINTENTRY 0xBB @@ -385,4 +392,6 @@ extern const char * const ff_matroska_video_stereo_plane[MATROSKA_VIDEO_STEREO_P int ff_mkv_stereo3d_conv(AVStream *st, MatroskaVideoStereoModeType stereo_mode); +#define DVCC_DVVC_BLOCK_TYPE_NAME "Dolby Vision configuration" + #endif /* AVFORMAT_MATROSKA_H */ diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index fb1849f9c3..8a0c82cbeb 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -52,6 +52,7 @@ #include "avformat.h" #include "avio_internal.h" +#include "dovi_isom.h" #include "internal.h" #include "isom.h" #include "matroska.h" @@ -238,6 +239,13 @@ typedef struct MatroskaTrackOperation { EbmlList combine_planes; } MatroskaTrackOperation; +typedef struct MatroskaBlockAdditionMapping { + uint64_t value; + char *name; + uint64_t type; + EbmlBin extradata; +} MatroskaBlockAdditionMapping; + typedef struct MatroskaTrack { uint64_t num; uint64_t uid; @@ -268,6 +276,7 @@ typedef struct MatroskaTrack { int ms_compat; int needs_decoding; uint64_t max_block_additional_id; + EbmlList block_addition_mappings; uint32_t palette[AVPALETTE_COUNT]; int has_palette; @@ -416,8 +425,8 @@ typedef struct MatroskaDemuxContext { // incomplete type (6.7.2 in C90, 6.9.2 in C99). // Removing the sizes breaks MSVC. static EbmlSyntax ebml_syntax[3], matroska_segment[9], matroska_track_video_color[15], matroska_track_video[19], - matroska_track[32], matroska_track_encoding[6], matroska_track_encodings[2], - matroska_track_combine_planes[2], matroska_track_operation[2], matroska_tracks[2], + matroska_track[33], matroska_track_encoding[6], matroska_track_encodings[2], + matroska_track_combine_planes[2], matroska_track_operation[2], matroska_block_addition_mapping[5], matroska_tracks[2], matroska_attachments[2], matroska_chapter_entry[9], matroska_chapter[6], matroska_chapters[2], matroska_index_entry[3], matroska_index[2], matroska_tag[3], matroska_tags[2], matroska_seekhead[2], matroska_blockadditions[2], matroska_blockgroup[8], matroska_cluster_parsing[8]; @@ -567,6 +576,14 @@ static EbmlSyntax matroska_track_operation[] = { CHILD_OF(matroska_track) }; +static EbmlSyntax matroska_block_addition_mapping[] = { + { MATROSKA_ID_BLKADDIDVALUE, EBML_UINT, 0, 0, offsetof(MatroskaBlockAdditionMapping, value) }, + { MATROSKA_ID_BLKADDIDNAME, EBML_STR, 0, 0, offsetof(MatroskaBlockAdditionMapping, name) }, + { MATROSKA_ID_BLKADDIDTYPE, EBML_UINT, 0, 0, offsetof(MatroskaBlockAdditionMapping, type) }, + { MATROSKA_ID_BLKADDIDEXTRADATA, EBML_BIN, 0, 0, offsetof(MatroskaBlockAdditionMapping, extradata) }, + CHILD_OF(matroska_track) +}; + static EbmlSyntax matroska_track[] = { { MATROSKA_ID_TRACKNUMBER, EBML_UINT, 0, 0, offsetof(MatroskaTrack, num) }, { MATROSKA_ID_TRACKNAME, EBML_UTF8, 0, 0, offsetof(MatroskaTrack, name) }, @@ -590,6 +607,7 @@ static EbmlSyntax matroska_track[] = { { MATROSKA_ID_TRACKOPERATION, EBML_NEST, 0, 0, offsetof(MatroskaTrack, operation), { .n = matroska_track_operation } }, { MATROSKA_ID_TRACKCONTENTENCODINGS, EBML_NEST, 0, 0, 0, { .n = matroska_track_encodings } }, { MATROSKA_ID_TRACKMAXBLKADDID, EBML_UINT, 0, 0, offsetof(MatroskaTrack, max_block_additional_id), { .u = 0 } }, + { MATROSKA_ID_TRACKBLKADDMAPPING, EBML_NEST, 0, sizeof(MatroskaBlockAdditionMapping), offsetof(MatroskaTrack, block_addition_mappings), { .n = matroska_block_addition_mapping } }, { MATROSKA_ID_SEEKPREROLL, EBML_UINT, 0, 0, offsetof(MatroskaTrack, seek_preroll), { .u = 0 } }, { MATROSKA_ID_TRACKFLAGENABLED, EBML_NONE }, { MATROSKA_ID_TRACKFLAGLACING, EBML_NONE }, @@ -2310,6 +2328,38 @@ static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track, return 0; } +static int mkv_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const MatroskaTrack *track, + EbmlBin *bin) +{ + return ff_isom_parse_dvcc_dvvc(s, st, bin->data, bin->size); +} + +static int mkv_parse_block_addition_mappings(AVFormatContext *s, AVStream *st, const MatroskaTrack *track) +{ + const EbmlList *mappings_list = &track->block_addition_mappings; + MatroskaBlockAdditionMapping *mappings = mappings_list->elem; + int ret; + + for (int i = 0; i < mappings_list->nb_elem; i++) { + MatroskaBlockAdditionMapping *mapping = &mappings[i]; + + switch (mapping->type) { + case MKBETAG('d','v','c','C'): + case MKBETAG('d','v','v','C'): + if ((ret = mkv_parse_dvcc_dvvc(s, st, track, &mapping->extradata)) < 0) + return ret; + + break; + default: + av_log(s, AV_LOG_DEBUG, + "Unknown block additional mapping type 0x%"PRIx64", value %"PRIu64", name \"%s\"\n", + mapping->type, mapping->value, mapping->name ? mapping->name : ""); + } + } + + return 0; +} + static int get_qt_codec(MatroskaTrack *track, uint32_t *fourcc, enum AVCodecID *codec_id) { const AVCodecTag *codec_tags; @@ -2898,6 +2948,10 @@ static int matroska_parse_tracks(AVFormatContext *s) if (track->flag_textdescriptions) st->disposition |= AV_DISPOSITION_DESCRIPTIONS; } + + ret = mkv_parse_block_addition_mappings(s, st, track); + if (ret < 0) + return ret; } return 0; diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index b4284a8778..eb3d7207d0 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -27,6 +27,7 @@ #include "avformat.h" #include "avio_internal.h" #include "avlanguage.h" +#include "dovi_isom.h" #include "flacenc.h" #include "internal.h" #include "isom.h" @@ -1112,6 +1113,37 @@ static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, return 0; } +static void mkv_write_dovi(AVFormatContext *s, AVIOContext *pb, AVStream *st) +{ + AVDOVIDecoderConfigurationRecord *dovi = (AVDOVIDecoderConfigurationRecord *) + av_stream_get_side_data(st, AV_PKT_DATA_DOVI_CONF, NULL); + + if (dovi && dovi->dv_profile <= 10) { + ebml_master mapping; + uint8_t buf[ISOM_DVCC_DVVC_SIZE]; + uint32_t type; + + uint64_t expected_size = (2 + 1 + (sizeof(DVCC_DVVC_BLOCK_TYPE_NAME) - 1)) + + (2 + 1 + 4) + (2 + 1 + ISOM_DVCC_DVVC_SIZE); + + if (dovi->dv_profile > 7) { + type = MKBETAG('d', 'v', 'v', 'C'); + } else { + type = MKBETAG('d', 'v', 'c', 'C'); + } + + ff_isom_put_dvcc_dvvc(s, buf, dovi); + + mapping = start_ebml_master(pb, MATROSKA_ID_TRACKBLKADDMAPPING, expected_size); + + put_ebml_string(pb, MATROSKA_ID_BLKADDIDNAME, DVCC_DVVC_BLOCK_TYPE_NAME); + put_ebml_uint(pb, MATROSKA_ID_BLKADDIDTYPE, type); + put_ebml_binary(pb, MATROSKA_ID_BLKADDIDEXTRADATA, buf, sizeof(buf)); + + end_ebml_master(pb, mapping); + } +} + static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, AVStream *st, mkv_track *track, AVIOContext *pb, int is_default) @@ -1311,6 +1343,11 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, mkv_write_video_projection(s, pb, st); end_ebml_master(pb, subinfo); + + if (mkv->mode != MODE_WEBM) { + mkv_write_dovi(s, pb, st); + } + break; case AVMEDIA_TYPE_AUDIO: -- 2.40.1 ================================================ FILE: packages/multimedia/ffmpeg/patches/ffmpeg-force_sdl2.patch ================================================ --- a/configure +++ b/configure @@ -6579,15 +6579,13 @@ if enabled sdl2; then SDL2_CONFIG="${cross_prefix}sdl2-config" - test_pkg_config sdl2 "sdl2 >= 2.0.1 sdl2 < 2.1.0" SDL_events.h SDL_PollEvent - if disabled sdl2 && "${SDL2_CONFIG}" --version > /dev/null 2>&1; then + test_pkg_config sdl2 "sdl2 >= 2.0.1" SDL_events.h SDL_PollEvent sdl2_cflags=$("${SDL2_CONFIG}" --cflags) sdl2_extralibs=$("${SDL2_CONFIG}" --libs) test_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x020001" $sdl2_cflags && test_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x020100" $sdl2_cflags && check_func_headers SDL_events.h SDL_PollEvent $sdl2_extralibs $sdl2_cflags && enable sdl2 - fi if test $target_os = "mingw32"; then sdl2_extralibs=$(filter_out '-mwindows' $sdl2_extralibs) fi ================================================ FILE: packages/multimedia/ffmpeg/patches/ffmpeg-openssl3.patch ================================================ From 1d23e125b6f76e74b754560c3b6931507cacddce Mon Sep 17 00:00:00 2001 From: Timo Rothenpieler Date: Tue, 7 Sep 2021 19:35:31 +0200 Subject: [PATCH] configure: account for openssl3 license change --- configure | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/configure b/configure index c87a010387..ed7345b2c1 100755 --- a/configure +++ b/configure @@ -1765,7 +1765,6 @@ EXTERNAL_LIBRARY_GPL_LIST=" EXTERNAL_LIBRARY_NONFREE_LIST=" decklink libfdk_aac - openssl libtls " @@ -1857,6 +1856,7 @@ EXTERNAL_LIBRARY_LIST=" mediacodec openal opengl + openssl pocketsphinx vapoursynth " @@ -6572,7 +6572,10 @@ enabled omx_rpi && { test_code cc OMX_Core.h OMX_IndexConfigBrcmVideoR die "ERROR: OpenMAX IL headers from raspberrypi/firmware not found"; } && enable omx enabled omx && require_headers OMX_Core.h -enabled openssl && { check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl || +enabled openssl && { { check_pkg_config openssl "openssl >= 3.0.0" openssl/ssl.h OPENSSL_init_ssl && + { enabled gplv3 || ! enabled gpl || enabled nonfree || die "ERROR: OpenSSL >=3.0.0 requires --enable-version3"; }; } || + { enabled gpl && ! enabled nonfree && die "ERROR: OpenSSL <3.0.0 is incompatible with the gpl"; } || + check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl || check_pkg_config openssl openssl openssl/ssl.h SSL_library_init || check_lib openssl openssl/ssl.h OPENSSL_init_ssl -lssl -lcrypto || check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto || -- 2.34.1 ================================================ FILE: packages/multimedia/ffmpeg/patches/kodi/ffmpeg-001-kodi.patch ================================================ From 5180cdc317139414eedcb49627d240519435b104 Mon Sep 17 00:00:00 2001 From: marc Date: Mon, 18 Feb 2013 17:18:18 +0000 Subject: [PATCH 01/15] dxva-h264: Fix an AMD driver issue with playback of streams that don't start with an I-Frame --- libavcodec/dxva2_h264.c | 8 ++++++++ libavcodec/h264_slice.c | 1 + libavcodec/h264dec.c | 1 + libavcodec/h264dec.h | 2 ++ 4 files changed, 12 insertions(+) diff --git a/libavcodec/dxva2_h264.c b/libavcodec/dxva2_h264.c index 5b23b28f12..c0a8d80f3b 100644 --- a/libavcodec/dxva2_h264.c +++ b/libavcodec/dxva2_h264.c @@ -504,6 +504,14 @@ static int dxva2_h264_end_frame(AVCodecContext *avctx) if (ctx_pic->slice_count <= 0 || ctx_pic->bitstream_size <= 0) return -1; + + // Wait for an I-frame before start decoding. Workaround for ATI UVD and UVD+ GPUs + if (!h->got_first_iframe) { + if (!(ctx_pic->pp.wBitFields & (1 << 15))) + return -1; + h->got_first_iframe = 1; + } + ret = ff_dxva2_common_end_frame(avctx, h->cur_pic_ptr->f, &ctx_pic->pp, sizeof(ctx_pic->pp), &ctx_pic->qm, sizeof(ctx_pic->qm), diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index 7c69016338..0b415ada6f 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -942,6 +942,7 @@ static int h264_slice_header_init(H264Context *h) h->first_field = 0; h->prev_interlaced_frame = 1; + h->got_first_iframe = 0; init_scan_tables(h); ret = ff_h264_alloc_tables(h); diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c index 485f47d36e..1705046e29 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -442,6 +442,7 @@ void ff_h264_flush_change(H264Context *h) h->next_outputed_poc = INT_MIN; h->prev_interlaced_frame = 1; + h->got_first_iframe = 0; idr(h); h->poc.prev_frame_num = -1; diff --git a/libavcodec/h264dec.h b/libavcodec/h264dec.h index b3677cdbb9..b7b19ba4f1 100644 --- a/libavcodec/h264dec.h +++ b/libavcodec/h264dec.h @@ -540,6 +540,8 @@ typedef struct H264Context { * slices) anymore */ int setup_finished; + int got_first_iframe; + int cur_chroma_format_idc; int cur_bit_depth_luma; int16_t slice_row[MAX_SLICES]; ///< to detect when MAX_SLICES is too low From 02731d93b4c725f13bf3b3217b48db3be18e0bce Mon Sep 17 00:00:00 2001 From: Rechi Date: Tue, 21 Nov 2017 08:16:53 +0100 Subject: [PATCH 02/15] use Kodi as extra version --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7e9d8b08c3..882a3cb31b 100644 --- a/Makefile +++ b/Makefile @@ -130,7 +130,7 @@ GIT_LOG = $(SRC_PATH)/.git/logs/HEAD .version: M=@ libavutil/ffversion.h .version: - $(M)$(VERSION_SH) $(SRC_PATH) libavutil/ffversion.h $(EXTRA_VERSION) + $(M)$(VERSION_SH) $(SRC_PATH) libavutil/ffversion.h Kodi $(Q)touch .version # force version.sh to run whenever version might have changed From 1ec811b6f330f60ec7a522cc60e98bd8ae30c766 Mon Sep 17 00:00:00 2001 From: Rechi Date: Tue, 21 Nov 2017 08:16:53 +0100 Subject: [PATCH 03/15] common.mak: never ignore an error if strip doesn't succeed --- ffbuild/common.mak | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ffbuild/common.mak b/ffbuild/common.mak index 164a43932d..2ab5dd0dfd 100644 --- a/ffbuild/common.mak +++ b/ffbuild/common.mak @@ -87,7 +87,7 @@ COMPILE_MSA = $(call COMPILE,CC,MSAFLAGS) %.o: %.asm $(COMPILE_X86ASM) - -$(if $(ASMSTRIPFLAGS), $(STRIP) $(ASMSTRIPFLAGS) $@) + $(if $(STRIP), $(if $(ASMSTRIPFLAGS), $(STRIP) $(ASMSTRIPFLAGS) $@)) %.o: %.rc $(WINDRES) $(IFLAGS) $(foreach ARG,$(CC_DEPFLAGS),--preprocessor-arg "$(ARG)") -o $@ $< From 29b9dec3de00f69339e6a5fed79b2d8ce2b3c105 Mon Sep 17 00:00:00 2001 From: wsnipex Date: Tue, 21 Nov 2017 08:16:53 +0100 Subject: [PATCH 04/15] only check for a git rev if the src tree is in a git repo fixes the version string when building from the kodi depends src tree --- ffbuild/version.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ffbuild/version.sh b/ffbuild/version.sh index edc4dd33c5..239a138ca7 100755 --- a/ffbuild/version.sh +++ b/ffbuild/version.sh @@ -2,6 +2,7 @@ # Usage: version.sh +if [ -d $1/.git ]; then # only check for a git rev, if the src tree is in a git repo # check for git short hash if ! test "$revision"; then if (cd "$1" && grep git RELEASE 2> /dev/null >/dev/null) ; then @@ -27,6 +28,7 @@ if [ -z "$revision" ]; then git_hash="${srcdir##*-}";; esac fi +fi # no revision number found test "$revision" || revision=$(cd "$1" && cat RELEASE 2> /dev/null) From d2e9030c8a0d55426e13d1007e163c48f2533819 Mon Sep 17 00:00:00 2001 From: Anton Fedchin Date: Fri, 11 Jan 2019 10:47:43 +0100 Subject: [PATCH 05/15] after 153b36f there is a possibility to crash when trying to get index of a surface which points to nirvana. it may occurs when a stream starts with non i-frame. --- libavcodec/dxva2.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c index b57ea21941..542bc2f18d 100644 --- a/libavcodec/dxva2.c +++ b/libavcodec/dxva2.c @@ -777,16 +777,18 @@ unsigned ff_dxva2_get_surface_index(const AVCodecContext *avctx, #if CONFIG_D3D11VA if (avctx->pix_fmt == AV_PIX_FMT_D3D11) return (intptr_t)frame->data[1]; - if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD) { + if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD && surface) { D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC viewDesc; ID3D11VideoDecoderOutputView_GetDesc((ID3D11VideoDecoderOutputView*) surface, &viewDesc); return viewDesc.Texture2D.ArraySlice; } #endif #if CONFIG_DXVA2 - for (i = 0; i < DXVA_CONTEXT_COUNT(avctx, ctx); i++) { - if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD && ctx->dxva2.surface[i] == surface) - return i; + if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD) { + for (i = 0; i < DXVA_CONTEXT_COUNT(avctx, ctx); i++) { + if (ctx->dxva2.surface[i] == surface) + return i; + } } #endif From 916223c0a47091272c9d0b6035f187310908ff37 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sat, 26 Jan 2019 19:48:35 +0100 Subject: [PATCH 06/15] avcodec/vaapi_h264: skip decode if pic has no slices This fixes / workarounds https://bugs.freedesktop.org/show_bug.cgi?id=105368. It was hit frequently when watching h264 channels received via DVB-X. Corresponding kodi bug: https://github.com/xbmc/xbmc/issues/15704 --- libavcodec/vaapi_h264.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libavcodec/vaapi_h264.c b/libavcodec/vaapi_h264.c index 9332aa6f31..d4494beebf 100644 --- a/libavcodec/vaapi_h264.c +++ b/libavcodec/vaapi_h264.c @@ -314,6 +314,11 @@ static int vaapi_h264_end_frame(AVCodecContext *avctx) H264SliceContext *sl = &h->slice_ctx[0]; int ret; + if (pic->nb_slices == 0) { + ret = AVERROR_INVALIDDATA; + goto finish; + } + ret = ff_vaapi_decode_issue(avctx, pic); if (ret < 0) goto finish; From b211c09d17ef86d7b38d1bfe9814a01e9040bf03 Mon Sep 17 00:00:00 2001 From: Fei Wang Date: Tue, 12 Oct 2021 16:23:56 +0800 Subject: [PATCH 07/15] cbs_av1: fix incorrect data type Since order_hint_bits_minus_1 range is 0~7, cur_frame_hint can be most 128. And similar return value for cbs_av1_get_relative_dist. So if plus them and use int8_t for the result may lose its precision. Signed-off-by: Fei Wang (cherry picked from commit e7ff5722b1abae4284e79da707e71ff82b409699) (cherry picked from commit 8aab15a91d6e8ca726580e969ff71828ad63baaa) --- libavcodec/cbs_av1_syntax_template.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/cbs_av1_syntax_template.c b/libavcodec/cbs_av1_syntax_template.c index 6fe6e9a4f3..d98d3d42de 100644 --- a/libavcodec/cbs_av1_syntax_template.c +++ b/libavcodec/cbs_av1_syntax_template.c @@ -355,7 +355,7 @@ static int FUNC(set_frame_refs)(CodedBitstreamContext *ctx, RWContext *rw, AV1_REF_FRAME_ALTREF2, AV1_REF_FRAME_ALTREF }; int8_t ref_frame_idx[AV1_REFS_PER_FRAME], used_frame[AV1_NUM_REF_FRAMES]; - int8_t shifted_order_hints[AV1_NUM_REF_FRAMES]; + int16_t shifted_order_hints[AV1_NUM_REF_FRAMES]; int cur_frame_hint, latest_order_hint, earliest_order_hint, ref; int i, j; From 2db5def80f1913a00410d6f16ae3730de567c3b8 Mon Sep 17 00:00:00 2001 From: Fei Wang Date: Tue, 12 Oct 2021 16:23:57 +0800 Subject: [PATCH 08/15] avcodec/av1: extend some definitions in spec section 3 Signed-off-by: Fei Wang (cherry picked from commit 75de7fe26218cb37fff9d5afa7b5b2b8bee4a9a8) (cherry picked from commit 2f459697445df67cc61c9a6c2930fdf3f830e629) --- libavcodec/av1.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libavcodec/av1.h b/libavcodec/av1.h index 0f99ae4829..951a18ecb2 100644 --- a/libavcodec/av1.h +++ b/libavcodec/av1.h @@ -114,6 +114,13 @@ enum { AV1_WARP_MODEL_TRANSLATION = 1, AV1_WARP_MODEL_ROTZOOM = 2, AV1_WARP_MODEL_AFFINE = 3, + AV1_WARP_PARAM_REDUCE_BITS = 6, + + AV1_DIV_LUT_BITS = 8, + AV1_DIV_LUT_PREC_BITS = 14, + AV1_DIV_LUT_NUM = 257, + + AV1_MAX_LOOP_FILTER = 63, }; From ddc3058a3e7b7c44a3911fb356f932853565b3d0 Mon Sep 17 00:00:00 2001 From: Fei Wang Date: Tue, 12 Oct 2021 16:23:58 +0800 Subject: [PATCH 09/15] avcodec/av1dec: support setup shear process Defined in spec 7.11.3.6/7.11.3.7. Signed-off-by: Fei Wang (cherry picked from commit de7475b111679120b3b089fe543224f50882287c) (cherry picked from commit 481d3930d90d52587ad76d277cbd2f9cb3109079) --- libavcodec/av1dec.c | 98 +++++++++++++++++++++++++++++++++++++++++++++ libavcodec/av1dec.h | 1 + 2 files changed, 99 insertions(+) diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c index a75d6744d3..a3301f454f 100644 --- a/libavcodec/av1dec.c +++ b/libavcodec/av1dec.c @@ -28,6 +28,34 @@ #include "internal.h" #include "profiles.h" +/**< same with Div_Lut defined in spec 7.11.3.7 */ +static const uint16_t div_lut[AV1_DIV_LUT_NUM] = { + 16384, 16320, 16257, 16194, 16132, 16070, 16009, 15948, 15888, 15828, 15768, + 15709, 15650, 15592, 15534, 15477, 15420, 15364, 15308, 15252, 15197, 15142, + 15087, 15033, 14980, 14926, 14873, 14821, 14769, 14717, 14665, 14614, 14564, + 14513, 14463, 14413, 14364, 14315, 14266, 14218, 14170, 14122, 14075, 14028, + 13981, 13935, 13888, 13843, 13797, 13752, 13707, 13662, 13618, 13574, 13530, + 13487, 13443, 13400, 13358, 13315, 13273, 13231, 13190, 13148, 13107, 13066, + 13026, 12985, 12945, 12906, 12866, 12827, 12788, 12749, 12710, 12672, 12633, + 12596, 12558, 12520, 12483, 12446, 12409, 12373, 12336, 12300, 12264, 12228, + 12193, 12157, 12122, 12087, 12053, 12018, 11984, 11950, 11916, 11882, 11848, + 11815, 11782, 11749, 11716, 11683, 11651, 11619, 11586, 11555, 11523, 11491, + 11460, 11429, 11398, 11367, 11336, 11305, 11275, 11245, 11215, 11185, 11155, + 11125, 11096, 11067, 11038, 11009, 10980, 10951, 10923, 10894, 10866, 10838, + 10810, 10782, 10755, 10727, 10700, 10673, 10645, 10618, 10592, 10565, 10538, + 10512, 10486, 10460, 10434, 10408, 10382, 10356, 10331, 10305, 10280, 10255, + 10230, 10205, 10180, 10156, 10131, 10107, 10082, 10058, 10034, 10010, 9986, + 9963, 9939, 9916, 9892, 9869, 9846, 9823, 9800, 9777, 9754, 9732, + 9709, 9687, 9664, 9642, 9620, 9598, 9576, 9554, 9533, 9511, 9489, + 9468, 9447, 9425, 9404, 9383, 9362, 9341, 9321, 9300, 9279, 9259, + 9239, 9218, 9198, 9178, 9158, 9138, 9118, 9098, 9079, 9059, 9039, + 9020, 9001, 8981, 8962, 8943, 8924, 8905, 8886, 8867, 8849, 8830, + 8812, 8793, 8775, 8756, 8738, 8720, 8702, 8684, 8666, 8648, 8630, + 8613, 8595, 8577, 8560, 8542, 8525, 8508, 8490, 8473, 8456, 8439, + 8422, 8405, 8389, 8372, 8355, 8339, 8322, 8306, 8289, 8273, 8257, + 8240, 8224, 8208, 8192 +}; + static uint32_t inverse_recenter(int r, uint32_t v) { if (v > 2 * r) @@ -97,6 +125,70 @@ static void read_global_param(AV1DecContext *s, int type, int ref, int idx) -mx, mx + 1, r) << prec_diff) + round; } +static uint64_t round_two(uint64_t x, uint16_t n) +{ + if (n == 0) + return x; + return ((x + ((uint64_t)1 << (n - 1))) >> n); +} + +static int64_t round_two_signed(int64_t x, uint16_t n) +{ + return ((x<0) ? -((int64_t)round_two(-x, n)) : (int64_t)round_two(x, n)); +} + +/** + * Resolve divisor process. + * see spec 7.11.3.7 + */ +static int16_t resolve_divisor(uint32_t d, uint16_t *shift) +{ + int32_t e, f; + + *shift = av_log2(d); + e = d - (1 << (*shift)); + if (*shift > AV1_DIV_LUT_BITS) + f = round_two(e, *shift - AV1_DIV_LUT_BITS); + else + f = e << (AV1_DIV_LUT_BITS - (*shift)); + + *shift += AV1_DIV_LUT_PREC_BITS; + + return div_lut[f]; +} + +/** + * check if global motion params is valid. + * see spec 7.11.3.6 + */ +static uint8_t get_shear_params_valid(AV1DecContext *s, int idx) +{ + int16_t alpha, beta, gamma, delta, divf, divs; + int64_t v, w; + int32_t *param = &s->cur_frame.gm_params[idx][0]; + if (param[2] < 0) + return 0; + + alpha = av_clip_int16(param[2] - (1 << AV1_WARPEDMODEL_PREC_BITS)); + beta = av_clip_int16(param[3]); + divf = resolve_divisor(abs(param[2]), &divs); + v = (int64_t)param[4] * (1 << AV1_WARPEDMODEL_PREC_BITS); + w = (int64_t)param[3] * param[4]; + gamma = av_clip_int16((int)round_two_signed((v * divf), divs)); + delta = av_clip_int16(param[5] - (int)round_two_signed((w * divf), divs) - (1 << AV1_WARPEDMODEL_PREC_BITS)); + + alpha = round_two_signed(alpha, AV1_WARP_PARAM_REDUCE_BITS) << AV1_WARP_PARAM_REDUCE_BITS; + beta = round_two_signed(beta, AV1_WARP_PARAM_REDUCE_BITS) << AV1_WARP_PARAM_REDUCE_BITS; + gamma = round_two_signed(gamma, AV1_WARP_PARAM_REDUCE_BITS) << AV1_WARP_PARAM_REDUCE_BITS; + delta = round_two_signed(delta, AV1_WARP_PARAM_REDUCE_BITS) << AV1_WARP_PARAM_REDUCE_BITS; + + if ((4 * abs(alpha) + 7 * abs(beta)) >= (1 << AV1_WARPEDMODEL_PREC_BITS) || + (4 * abs(gamma) + 4 * abs(delta)) >= (1 << AV1_WARPEDMODEL_PREC_BITS)) + return 0; + + return 1; +} + /** * update gm type/params, since cbs already implemented part of this funcation, * so we don't need to full implement spec. @@ -144,6 +236,9 @@ static void global_motion_params(AV1DecContext *s) read_global_param(s, type, ref, 0); read_global_param(s, type, ref, 1); } + if (type <= AV1_WARP_MODEL_AFFINE) { + s->cur_frame.gm_invalid[ref] = !get_shear_params_valid(s, ref); + } } } @@ -509,6 +604,9 @@ static int av1_frame_ref(AVCodecContext *avctx, AV1Frame *dst, const AV1Frame *s dst->spatial_id = src->spatial_id; dst->temporal_id = src->temporal_id; + memcpy(dst->gm_invalid, + src->gm_invalid, + AV1_NUM_REF_FRAMES * sizeof(uint8_t)); memcpy(dst->gm_type, src->gm_type, AV1_NUM_REF_FRAMES * sizeof(uint8_t)); diff --git a/libavcodec/av1dec.h b/libavcodec/av1dec.h index 248a68750f..4e140588b9 100644 --- a/libavcodec/av1dec.h +++ b/libavcodec/av1dec.h @@ -42,6 +42,7 @@ typedef struct AV1Frame { int temporal_id; int spatial_id; + uint8_t gm_invalid[AV1_NUM_REF_FRAMES]; uint8_t gm_type[AV1_NUM_REF_FRAMES]; int32_t gm_params[AV1_NUM_REF_FRAMES][6]; From ad58733c84c131216e04ceb39d0dff64bfac5a2c Mon Sep 17 00:00:00 2001 From: Fei Wang Date: Tue, 12 Oct 2021 16:23:59 +0800 Subject: [PATCH 10/15] avcodec/av1_vaapi: add gm params valid check Signed-off-by: Fei Wang (cherry picked from commit 0d0ea70e7bdd85def85d526480d728740a371744) (cherry picked from commit 8b9a48b7aa3c14103f975035bb18601b13ed1707) --- libavcodec/vaapi_av1.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libavcodec/vaapi_av1.c b/libavcodec/vaapi_av1.c index 16b7e35747..f577447be4 100644 --- a/libavcodec/vaapi_av1.c +++ b/libavcodec/vaapi_av1.c @@ -213,7 +213,8 @@ static int vaapi_av1_start_frame(AVCodecContext *avctx, frame_header->height_in_sbs_minus_1[i]; } for (int i = AV1_REF_FRAME_LAST; i <= AV1_REF_FRAME_ALTREF; i++) { - pic_param.wm[i - 1].wmtype = s->cur_frame.gm_type[i]; + pic_param.wm[i - 1].invalid = s->cur_frame.gm_invalid[i]; + pic_param.wm[i - 1].wmtype = s->cur_frame.gm_type[i]; for (int j = 0; j < 6; j++) pic_param.wm[i - 1].wmmat[j] = s->cur_frame.gm_params[i][j]; } From fd1acddbee3686c97c2c38cc4befea38794eb44d Mon Sep 17 00:00:00 2001 From: Tong Wu Date: Tue, 12 Oct 2021 16:24:00 +0800 Subject: [PATCH 11/15] avcodec/dxva2_av1: fix global motion params Defined in spec 5.9.24/5.9.25. Since function void global_motion_params(AV1DecContext *s) already updates gm type/params, the wminvalid parameter only need to get the value from cur_frame.gm_invalid. Signed-off-by: Tong Wu (cherry picked from commit 4e7a7d75e3c21a6af03c4cd52ffc50270664e58a) (cherry picked from commit 03f5a57b9364d7ce789589594450fdf714a23e70) --- libavcodec/dxva2_av1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/dxva2_av1.c b/libavcodec/dxva2_av1.c index c30b57799c..8a912bf6c1 100644 --- a/libavcodec/dxva2_av1.c +++ b/libavcodec/dxva2_av1.c @@ -139,7 +139,7 @@ static int fill_picture_parameters(const AVCodecContext *avctx, AVDXVAContext *c pp->frame_refs[i].Index = ref_frame->buf[0] ? ref_idx : 0xFF; /* Global Motion */ - pp->frame_refs[i].wminvalid = (h->cur_frame.gm_type[AV1_REF_FRAME_LAST + i] == AV1_WARP_MODEL_IDENTITY); + pp->frame_refs[i].wminvalid = h->cur_frame.gm_invalid[AV1_REF_FRAME_LAST + i]; pp->frame_refs[i].wmtype = h->cur_frame.gm_type[AV1_REF_FRAME_LAST + i]; for (j = 0; j < 6; ++j) { pp->frame_refs[i].wmmat[j] = h->cur_frame.gm_params[AV1_REF_FRAME_LAST + i][j]; From 06181d3fd98d040ad2e1cb297896b3ba9235a9b4 Mon Sep 17 00:00:00 2001 From: Fei Wang Date: Tue, 12 Oct 2021 16:24:01 +0800 Subject: [PATCH 12/15] avcodec/vaapi: increase av1 decode pool size For film grain clip, vaapi_av1 decoder will cache additional 8 surfaces that will be used to store frames which apply film grain. So increase the pool size by plus 8 to avoid leak of surface. Signed-off-by: Fei Wang (cherry picked from commit 53403158cc19b9e5baeff6af9317f14d1a20d0cb) (cherry picked from commit 5774a0524c0851293a36acf3f3586e7c39a64b4a) --- libavcodec/vaapi_decode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/vaapi_decode.c b/libavcodec/vaapi_decode.c index 57a0eb4e6e..032e8531f2 100644 --- a/libavcodec/vaapi_decode.c +++ b/libavcodec/vaapi_decode.c @@ -577,10 +577,10 @@ static int vaapi_decode_make_config(AVCodecContext *avctx, switch (avctx->codec_id) { case AV_CODEC_ID_H264: case AV_CODEC_ID_HEVC: + case AV_CODEC_ID_AV1: frames->initial_pool_size += 16; break; case AV_CODEC_ID_VP9: - case AV_CODEC_ID_AV1: frames->initial_pool_size += 8; break; case AV_CODEC_ID_VP8: From 1d82fef4ddc4e5512219c8c0e2e93fe351d1f65a Mon Sep 17 00:00:00 2001 From: Fei Wang Date: Tue, 12 Oct 2021 16:24:02 +0800 Subject: [PATCH 13/15] avcodec/av1_vaapi: setting 2 output surface for film grain VAAPI needs 2 output surface for film grain frame. One used for reference and the other used for applying film grain and pushing to downstream. Signed-off-by: Fei Wang (cherry picked from commit 7871144cf801bc8b9e3b00319dd7c3c3d91dd3fa) (cherry picked from commit 5962698d25f148d6b89dc4e526fffc5db2295f1e) --- libavcodec/vaapi_av1.c | 115 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 108 insertions(+), 7 deletions(-) diff --git a/libavcodec/vaapi_av1.c b/libavcodec/vaapi_av1.c index f577447be4..26476c7738 100644 --- a/libavcodec/vaapi_av1.c +++ b/libavcodec/vaapi_av1.c @@ -21,8 +21,28 @@ #include "libavutil/pixdesc.h" #include "hwconfig.h" #include "vaapi_decode.h" +#include "internal.h" #include "av1dec.h" +typedef struct VAAPIAV1FrameRef { + ThreadFrame frame; + int valid; +} VAAPIAV1FrameRef; + +typedef struct VAAPIAV1DecContext { + VAAPIDecodeContext base; + + /** + * For film grain case, VAAPI generate 2 output for each frame, + * current_frame will not apply film grain, and will be used for + * references for next frames. Maintain the reference list without + * applying film grain here. And current_display_picture will be + * used to apply film grain and push to downstream. + */ + VAAPIAV1FrameRef ref_tab[AV1_NUM_REF_FRAMES]; + ThreadFrame tmp_frame; +} VAAPIAV1DecContext; + static VASurfaceID vaapi_av1_surface_id(AV1Frame *vf) { if (vf) @@ -49,6 +69,48 @@ static int8_t vaapi_av1_get_bit_depth_idx(AVCodecContext *avctx) return bit_depth == 8 ? 0 : bit_depth == 10 ? 1 : 2; } +static int vaapi_av1_decode_init(AVCodecContext *avctx) +{ + VAAPIAV1DecContext *ctx = avctx->internal->hwaccel_priv_data; + + ctx->tmp_frame.f = av_frame_alloc(); + if (!ctx->tmp_frame.f) { + av_log(avctx, AV_LOG_ERROR, + "Failed to allocate frame.\n"); + return AVERROR(ENOMEM); + } + + for (int i = 0; i < FF_ARRAY_ELEMS(ctx->ref_tab); i++) { + ctx->ref_tab[i].frame.f = av_frame_alloc(); + if (!ctx->ref_tab[i].frame.f) { + av_log(avctx, AV_LOG_ERROR, + "Failed to allocate reference table frame %d.\n", i); + return AVERROR(ENOMEM); + } + ctx->ref_tab[i].valid = 0; + } + + return ff_vaapi_decode_init(avctx); +} + +static int vaapi_av1_decode_uninit(AVCodecContext *avctx) +{ + VAAPIAV1DecContext *ctx = avctx->internal->hwaccel_priv_data; + + if (ctx->tmp_frame.f->buf[0]) + ff_thread_release_buffer(avctx, &ctx->tmp_frame); + av_frame_free(&ctx->tmp_frame.f); + + for (int i = 0; i < FF_ARRAY_ELEMS(ctx->ref_tab); i++) { + if (ctx->ref_tab[i].frame.f->buf[0]) + ff_thread_release_buffer(avctx, &ctx->ref_tab[i].frame); + av_frame_free(&ctx->ref_tab[i].frame.f); + } + + return ff_vaapi_decode_uninit(avctx); +} + + static int vaapi_av1_start_frame(AVCodecContext *avctx, av_unused const uint8_t *buffer, av_unused uint32_t size) @@ -58,18 +120,28 @@ static int vaapi_av1_start_frame(AVCodecContext *avctx, const AV1RawFrameHeader *frame_header = s->raw_frame_header; const AV1RawFilmGrainParams *film_grain = &s->cur_frame.film_grain; VAAPIDecodePicture *pic = s->cur_frame.hwaccel_picture_private; + VAAPIAV1DecContext *ctx = avctx->internal->hwaccel_priv_data; VADecPictureParameterBufferAV1 pic_param; int8_t bit_depth_idx; int err = 0; int apply_grain = !(avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) && film_grain->apply_grain; uint8_t remap_lr_type[4] = {AV1_RESTORE_NONE, AV1_RESTORE_SWITCHABLE, AV1_RESTORE_WIENER, AV1_RESTORE_SGRPROJ}; - pic->output_surface = vaapi_av1_surface_id(&s->cur_frame); - bit_depth_idx = vaapi_av1_get_bit_depth_idx(avctx); if (bit_depth_idx < 0) goto fail; + if (apply_grain) { + if (ctx->tmp_frame.f->buf[0]) + ff_thread_release_buffer(avctx, &ctx->tmp_frame); + err = ff_thread_get_buffer(avctx, &ctx->tmp_frame, AV_GET_BUFFER_FLAG_REF); + if (err < 0) + goto fail; + pic->output_surface = ff_vaapi_get_surface_id(ctx->tmp_frame.f); + } else { + pic->output_surface = vaapi_av1_surface_id(&s->cur_frame); + } + memset(&pic_param, 0, sizeof(VADecPictureParameterBufferAV1)); pic_param = (VADecPictureParameterBufferAV1) { .profile = seq->seq_profile, @@ -77,6 +149,7 @@ static int vaapi_av1_start_frame(AVCodecContext *avctx, .bit_depth_idx = bit_depth_idx, .current_frame = pic->output_surface, .current_display_picture = pic->output_surface, + .current_display_picture = vaapi_av1_surface_id(&s->cur_frame), .frame_width_minus1 = frame_header->frame_width_minus_1, .frame_height_minus1 = frame_header->frame_height_minus_1, .primary_ref_frame = frame_header->primary_ref_frame, @@ -185,7 +258,9 @@ static int vaapi_av1_start_frame(AVCodecContext *avctx, if (pic_param.pic_info_fields.bits.frame_type == AV1_FRAME_KEY) pic_param.ref_frame_map[i] = VA_INVALID_ID; else - pic_param.ref_frame_map[i] = vaapi_av1_surface_id(&s->ref[i]); + pic_param.ref_frame_map[i] = ctx->ref_tab[i].valid ? + ff_vaapi_get_surface_id(ctx->ref_tab[i].frame.f) : + vaapi_av1_surface_id(&s->ref[i]); } for (int i = 0; i < AV1_REFS_PER_FRAME; i++) { pic_param.ref_frame_idx[i] = frame_header->ref_frame_idx[i]; @@ -264,8 +339,34 @@ fail: static int vaapi_av1_end_frame(AVCodecContext *avctx) { const AV1DecContext *s = avctx->priv_data; + const AV1RawFrameHeader *header = s->raw_frame_header; + const AV1RawFilmGrainParams *film_grain = &s->cur_frame.film_grain; VAAPIDecodePicture *pic = s->cur_frame.hwaccel_picture_private; - return ff_vaapi_decode_issue(avctx, pic); + VAAPIAV1DecContext *ctx = avctx->internal->hwaccel_priv_data; + + int apply_grain = !(avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) && film_grain->apply_grain; + int ret; + ret = ff_vaapi_decode_issue(avctx, pic); + if (ret < 0) + return ret; + + for (int i = 0; i < AV1_NUM_REF_FRAMES; i++) { + if (header->refresh_frame_flags & (1 << i)) { + if (ctx->ref_tab[i].frame.f->buf[0]) + ff_thread_release_buffer(avctx, &ctx->ref_tab[i].frame); + + if (apply_grain) { + ret = ff_thread_ref_frame(&ctx->ref_tab[i].frame, &ctx->tmp_frame); + if (ret < 0) + return ret; + ctx->ref_tab[i].valid = 1; + } else { + ctx->ref_tab[i].valid = 0; + } + } + } + + return 0; } static int vaapi_av1_decode_slice(AVCodecContext *avctx, @@ -312,9 +413,9 @@ const AVHWAccel ff_av1_vaapi_hwaccel = { .end_frame = vaapi_av1_end_frame, .decode_slice = vaapi_av1_decode_slice, .frame_priv_data_size = sizeof(VAAPIDecodePicture), - .init = ff_vaapi_decode_init, - .uninit = ff_vaapi_decode_uninit, + .init = vaapi_av1_decode_init, + .uninit = vaapi_av1_decode_uninit, .frame_params = ff_vaapi_common_frame_params, - .priv_data_size = sizeof(VAAPIDecodeContext), + .priv_data_size = sizeof(VAAPIAV1DecContext), .caps_internal = HWACCEL_CAP_ASYNC_SAFE, }; From be18092cec1867b5e30525e023f49c5e7547931b Mon Sep 17 00:00:00 2001 From: Fei Wang Date: Tue, 12 Oct 2021 16:24:03 +0800 Subject: [PATCH 14/15] avcodec/av1_vaapi: enable segmentation features Signed-off-by: Fei Wang (cherry picked from commit dc94f2eaaf0ae623d7dc02e1273c829015c025a3) (cherry picked from commit 582fb329a483774f0345cbfebc3a12f0ad8f5bba) --- libavcodec/vaapi_av1.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/libavcodec/vaapi_av1.c b/libavcodec/vaapi_av1.c index 26476c7738..c57d1b898a 100644 --- a/libavcodec/vaapi_av1.c +++ b/libavcodec/vaapi_av1.c @@ -126,6 +126,9 @@ static int vaapi_av1_start_frame(AVCodecContext *avctx, int err = 0; int apply_grain = !(avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) && film_grain->apply_grain; uint8_t remap_lr_type[4] = {AV1_RESTORE_NONE, AV1_RESTORE_SWITCHABLE, AV1_RESTORE_WIENER, AV1_RESTORE_SGRPROJ}; + uint8_t segmentation_feature_signed[AV1_SEG_LVL_MAX] = {1, 1, 1, 1, 1, 0, 0, 0}; + uint8_t segmentation_feature_max[AV1_SEG_LVL_MAX] = {255, AV1_MAX_LOOP_FILTER, + AV1_MAX_LOOP_FILTER, AV1_MAX_LOOP_FILTER, AV1_MAX_LOOP_FILTER, 7 , 0 , 0 }; bit_depth_idx = vaapi_av1_get_bit_depth_idx(avctx); if (bit_depth_idx < 0) @@ -293,6 +296,17 @@ static int vaapi_av1_start_frame(AVCodecContext *avctx, for (int j = 0; j < 6; j++) pic_param.wm[i - 1].wmmat[j] = s->cur_frame.gm_params[i][j]; } + for (int i = 0; i < AV1_MAX_SEGMENTS; i++) { + for (int j = 0; j < AV1_SEG_LVL_MAX; j++) { + pic_param.seg_info.feature_mask[i] |= (frame_header->feature_enabled[i][j] << j); + if (segmentation_feature_signed[j]) + pic_param.seg_info.feature_data[i][j] = av_clip(frame_header->feature_value[i][j], + -segmentation_feature_max[j], segmentation_feature_max[j]); + else + pic_param.seg_info.feature_data[i][j] = av_clip(frame_header->feature_value[i][j], + 0, segmentation_feature_max[j]); + } + } if (apply_grain) { for (int i = 0; i < film_grain->num_y_points; i++) { pic_param.film_grain_info.point_y_value[i] = From 293e067b0c0f592628ee0de71769ed2e9c3d07f2 Mon Sep 17 00:00:00 2001 From: Fei Wang Date: Tue, 12 Oct 2021 16:24:04 +0800 Subject: [PATCH 15/15] avcodec/av1_vaapi: improve decode quality - quantizer delta and matrix level specific. - support loop filter delta. - support use superres. Signed-off-by: Fei Wang (cherry picked from commit 84c73102d933c9b7f64f504196c91edddad99618) (cherry picked from commit 2c887141b8318b7d4b198461bbb8d94ac662a96c) --- libavcodec/vaapi_av1.c | 68 +++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/libavcodec/vaapi_av1.c b/libavcodec/vaapi_av1.c index c57d1b898a..5985493b8d 100644 --- a/libavcodec/vaapi_av1.c +++ b/libavcodec/vaapi_av1.c @@ -147,27 +147,35 @@ static int vaapi_av1_start_frame(AVCodecContext *avctx, memset(&pic_param, 0, sizeof(VADecPictureParameterBufferAV1)); pic_param = (VADecPictureParameterBufferAV1) { - .profile = seq->seq_profile, - .order_hint_bits_minus_1 = seq->order_hint_bits_minus_1, - .bit_depth_idx = bit_depth_idx, - .current_frame = pic->output_surface, - .current_display_picture = pic->output_surface, - .current_display_picture = vaapi_av1_surface_id(&s->cur_frame), - .frame_width_minus1 = frame_header->frame_width_minus_1, - .frame_height_minus1 = frame_header->frame_height_minus_1, - .primary_ref_frame = frame_header->primary_ref_frame, - .order_hint = frame_header->order_hint, - .tile_cols = frame_header->tile_cols, - .tile_rows = frame_header->tile_rows, - .context_update_tile_id = frame_header->context_update_tile_id, - .interp_filter = frame_header->interpolation_filter, - .filter_level[0] = frame_header->loop_filter_level[0], - .filter_level[1] = frame_header->loop_filter_level[1], - .filter_level_u = frame_header->loop_filter_level[2], - .filter_level_v = frame_header->loop_filter_level[3], - .base_qindex = frame_header->base_q_idx, - .cdef_damping_minus_3 = frame_header->cdef_damping_minus_3, - .cdef_bits = frame_header->cdef_bits, + .profile = seq->seq_profile, + .order_hint_bits_minus_1 = seq->order_hint_bits_minus_1, + .bit_depth_idx = bit_depth_idx, + .matrix_coefficients = seq->color_config.matrix_coefficients, + .current_frame = pic->output_surface, + .current_display_picture = vaapi_av1_surface_id(&s->cur_frame), + .frame_width_minus1 = frame_header->frame_width_minus_1, + .frame_height_minus1 = frame_header->frame_height_minus_1, + .primary_ref_frame = frame_header->primary_ref_frame, + .order_hint = frame_header->order_hint, + .tile_cols = frame_header->tile_cols, + .tile_rows = frame_header->tile_rows, + .context_update_tile_id = frame_header->context_update_tile_id, + .superres_scale_denominator = frame_header->use_superres ? + frame_header->coded_denom + AV1_SUPERRES_DENOM_MIN : + AV1_SUPERRES_NUM, + .interp_filter = frame_header->interpolation_filter, + .filter_level[0] = frame_header->loop_filter_level[0], + .filter_level[1] = frame_header->loop_filter_level[1], + .filter_level_u = frame_header->loop_filter_level[2], + .filter_level_v = frame_header->loop_filter_level[3], + .base_qindex = frame_header->base_q_idx, + .y_dc_delta_q = frame_header->delta_q_y_dc, + .u_dc_delta_q = frame_header->delta_q_u_dc, + .u_ac_delta_q = frame_header->delta_q_u_ac, + .v_dc_delta_q = frame_header->delta_q_v_dc, + .v_ac_delta_q = frame_header->delta_q_v_ac, + .cdef_damping_minus_3 = frame_header->cdef_damping_minus_3, + .cdef_bits = frame_header->cdef_bits, .seq_info_fields.fields = { .still_picture = seq->still_picture, .use_128x128_superblock = seq->use_128x128_superblock, @@ -238,12 +246,15 @@ static int vaapi_av1_start_frame(AVCodecContext *avctx, .mode_ref_delta_update = frame_header->loop_filter_delta_update, }, .mode_control_fields.bits = { - .delta_q_present_flag = frame_header->delta_q_present, - .log2_delta_q_res = frame_header->delta_q_res, - .tx_mode = frame_header->tx_mode, - .reference_select = frame_header->reference_select, - .reduced_tx_set_used = frame_header->reduced_tx_set, - .skip_mode_present = frame_header->skip_mode_present, + .delta_q_present_flag = frame_header->delta_q_present, + .log2_delta_q_res = frame_header->delta_q_res, + .delta_lf_present_flag = frame_header->delta_lf_present, + .log2_delta_lf_res = frame_header->delta_lf_res, + .delta_lf_multi = frame_header->delta_lf_multi, + .tx_mode = frame_header->tx_mode, + .reference_select = frame_header->reference_select, + .reduced_tx_set_used = frame_header->reduced_tx_set, + .skip_mode_present = frame_header->skip_mode_present, }, .loop_restoration_fields.bits = { .yframe_restoration_type = remap_lr_type[frame_header->lr_type[0]], @@ -254,6 +265,9 @@ static int vaapi_av1_start_frame(AVCodecContext *avctx, }, .qmatrix_fields.bits = { .using_qmatrix = frame_header->using_qmatrix, + .qm_y = frame_header->qm_y, + .qm_u = frame_header->qm_u, + .qm_v = frame_header->qm_v, } }; ================================================ FILE: packages/multimedia/ffmpeg/patches/libreelec/ffmpeg-001-libreelec.patch ================================================ From 8f7c8a0f9e28641880d72996b9452e0a9da1288c Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Wed, 10 Apr 2019 13:39:21 -0700 Subject: [PATCH 1/2] libavcodec/libdav1d: add libdav1d_get_format method to call ff_get_format This will allow applications to properly init the decoder in cases where a hardware decoder is tried first and and software decoder is tried after by calling the get_format callback. Even though there is no hardware pixel formats available we still need to return the software pixel format. Tested with Kodi by checking if multithreaded software decoding is properly activated. --- libavcodec/libdav1d.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c index 3c2a68b7e0..68996426cc 100644 --- a/libavcodec/libdav1d.c +++ b/libavcodec/libdav1d.c @@ -58,6 +58,16 @@ static const enum AVPixelFormat pix_fmt_rgb[3] = { AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12, }; +static enum AVPixelFormat libdav1d_get_format(AVCodecContext *avctx, const Dav1dPicture *p) +{ + enum AVPixelFormat pix_fmts[2], *fmt = pix_fmts; + + *fmt++ = pix_fmt[p->p.layout][p->seq_hdr->hbd]; + *fmt = AV_PIX_FMT_NONE; + + return ff_get_format(avctx, pix_fmts); +} + static void libdav1d_log_callback(void *opaque, const char *fmt, va_list vl) { AVCodecContext *c = opaque; @@ -264,6 +274,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) c->profile = p->seq_hdr->profile; c->level = ((p->seq_hdr->operating_points[0].major_level - 2) << 2) | p->seq_hdr->operating_points[0].minor_level; + frame->format = c->pix_fmt = libdav1d_get_format(c, p); frame->width = p->p.w; frame->height = p->p.h; if (c->width != p->p.w || c->height != p->p.h) { From 635cf67be3d37159c96e75f00399b3e232372251 Mon Sep 17 00:00:00 2001 From: chewitt Date: Sun, 11 Aug 2019 07:08:19 +0000 Subject: [PATCH 2/2] add long-term yuv2rgb logging patch --- libswscale/yuv2rgb.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libswscale/yuv2rgb.c b/libswscale/yuv2rgb.c index 6a3956e8e2..d6f9aea166 100644 --- a/libswscale/yuv2rgb.c +++ b/libswscale/yuv2rgb.c @@ -688,10 +688,6 @@ SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c) if (t) return t; - av_log(c, AV_LOG_WARNING, - "No accelerated colorspace conversion found from %s to %s.\n", - av_get_pix_fmt_name(c->srcFormat), av_get_pix_fmt_name(c->dstFormat)); - switch (c->dstFormat) { case AV_PIX_FMT_BGR48BE: case AV_PIX_FMT_BGR48LE: ================================================ FILE: packages/multimedia/ffmpeg/patches/rpi/ffmpeg-001-rpi.patch ================================================ diff --git a/configure b/configure index 4ba72bf84b..f2fc33e89b 100755 --- a/configure +++ b/configure @@ -207,6 +207,7 @@ External library support: --disable-bzlib disable bzlib [autodetect] --disable-coreimage disable Apple CoreImage framework [autodetect] --enable-chromaprint enable audio fingerprinting with chromaprint [no] + --disable-epoxy disable epoxy [autodetect] --enable-frei0r enable frei0r video filtering [no] --enable-gcrypt enable gcrypt, needed for rtmp(t)e support if openssl, librtmp or gmp is not used [no] @@ -279,6 +280,7 @@ External library support: if openssl, gnutls or mbedtls is not used [no] --enable-libtwolame enable MP2 encoding via libtwolame [no] --enable-libuavs3d enable AVS3 decoding via libuavs3d [no] + --disable-libudev disable libudev [autodetect] --enable-libv4l2 enable libv4l2/v4l-utils [no] --enable-libvidstab enable video stabilization using vid.stab [no] --enable-libvmaf enable vmaf filter via libvmaf [no] @@ -340,12 +342,17 @@ External library support: --enable-libmfx enable Intel MediaSDK (AKA Quick Sync Video) code via libmfx [no] --enable-libnpp enable Nvidia Performance Primitives-based code [no] --enable-mmal enable Broadcom Multi-Media Abstraction Layer (Raspberry Pi) via MMAL [no] + --enable-rpi enable other rpi specific stuff [no] + --enable-sand enable sand video formats [rpi] + --enable-vout-drm enable the vout_drm module - for internal testing only [no] + --enable-vout-egl enable the vout_egl module - for internal testing only [no] --disable-nvdec disable Nvidia video decoding acceleration (via hwaccel) [autodetect] --disable-nvenc disable Nvidia video encoding code [autodetect] --enable-omx enable OpenMAX IL code [no] --enable-omx-rpi enable OpenMAX IL code for Raspberry Pi [no] --enable-rkmpp enable Rockchip Media Process Platform code [no] --disable-v4l2-m2m disable V4L2 mem2mem code [autodetect] + --enable-v4l2-request enable V4L2 request API code [no] --disable-vaapi disable Video Acceleration API (mainly Unix/Intel) code [autodetect] --disable-vdpau disable Nvidia Video Decode and Presentation API for Unix code [autodetect] --disable-videotoolbox disable VideoToolbox code [autodetect] @@ -1703,7 +1710,9 @@ EXTERNAL_AUTODETECT_LIBRARY_LIST=" avfoundation bzlib coreimage + epoxy iconv + libudev libxcb libxcb_shm libxcb_shape @@ -1868,7 +1877,10 @@ HWACCEL_LIBRARY_LIST=" mmal omx opencl + v4l2_request vulkan + rpi4_8 + rpi4_10 " DOCUMENT_LIST=" @@ -1884,12 +1896,17 @@ FEATURE_LIST=" gray hardcoded_tables omx_rpi + rpi runtime_cpudetect safe_bitstream_reader + sand shared small static swscale_alpha + vout_drm + vout_egl + v4l2_req_hevc_vx " # this list should be kept in linking order @@ -1930,6 +1947,7 @@ SUBSYSTEM_LIST=" pixelutils network rdft + rpi " # COMPONENT_LIST needs to come last to ensure correct dependency checking @@ -2416,9 +2434,11 @@ CONFIG_EXTRA=" rangecoder riffdec riffenc + rpi rtpdec rtpenc_chain rv34dsp + sand scene_sad sinewin snappy @@ -2750,6 +2770,8 @@ hap_decoder_select="snappy texturedsp" hap_encoder_deps="libsnappy" hap_encoder_select="texturedspenc" hevc_decoder_select="atsc_a53 bswapdsp cabac golomb hevcparse videodsp" +hevc_rpi_decoder_deps="rpi" +hevc_rpi_decoder_select="hevc_decoder sand" huffyuv_decoder_select="bswapdsp huffyuvdsp llviddsp" huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp llvidencdsp" hymt_decoder_select="huffyuv_decoder" @@ -2920,6 +2942,7 @@ d3d11va_deps="dxva_h ID3D11VideoDecoder ID3D11VideoContext" dxva2_deps="dxva2api_h DXVA2_ConfigPictureDecode ole32 user32" ffnvcodec_deps_any="libdl LoadLibrary" nvdec_deps="ffnvcodec" +v4l2_request_deps="linux_videodev2_h linux_media_h v4l2_timeval_to_ns libdrm libudev" vaapi_x11_deps="xlib" videotoolbox_hwaccel_deps="videotoolbox pthreads" videotoolbox_hwaccel_extralibs="-framework QuartzCore" @@ -2961,6 +2984,12 @@ 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_v4l2request_hwaccel_select="hevc_decoder" +hevc_rpi4_10_hwaccel_deps="rpi" +hevc_rpi4_10_hwaccel_select="hevc_decoder" +hevc_rpi4_8_hwaccel_deps="rpi" +hevc_rpi4_8_hwaccel_select="hevc_decoder" hevc_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferHEVC" hevc_vaapi_hwaccel_select="hevc_decoder" hevc_vdpau_hwaccel_deps="vdpau VdpPictureInfoHEVC" @@ -3438,8 +3467,13 @@ sndio_indev_deps="sndio" sndio_outdev_deps="sndio" v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h" v4l2_indev_suggest="libv4l2" +v4l2_outdev_deps="libdrm" v4l2_outdev_deps_any="linux_videodev2_h sys_videoio_h" v4l2_outdev_suggest="libv4l2" +vout_drm_outdev_deps="libdrm" +vout_egl_outdev_deps="xlib epoxy" +vout_rpi_outdev_deps="rpi" +vout_rpi_outdev_select="sand" vfwcap_indev_deps="vfw32 vfwcap_defines" xcbgrab_indev_deps="libxcb" xcbgrab_indev_suggest="libxcb_shm libxcb_shape libxcb_xfixes" @@ -3658,6 +3692,7 @@ tonemap_vaapi_filter_deps="vaapi VAProcFilterParameterBufferHDRToneMapping" tonemap_opencl_filter_deps="opencl const_nan" transpose_opencl_filter_deps="opencl" transpose_vaapi_filter_deps="vaapi VAProcPipelineCaps_rotation_flags" +unsand_filter_select="sand" unsharp_opencl_filter_deps="opencl" uspp_filter_deps="gpl avcodec" vaguedenoiser_filter_deps="gpl" @@ -6155,6 +6190,12 @@ check_func_headers glob.h glob enabled xlib && check_lib xlib "X11/Xlib.h X11/extensions/Xvlib.h" XvGetPortAttribute -lXv -lX11 -lXext +enabled libudev && + check_pkg_config libudev libudev libudev.h udev_new + +enabled epoxy && + check_pkg_config epoxy epoxy epoxy/egl.h epoxy_egl_version + check_headers direct.h check_headers dirent.h check_headers dxgidebug.h @@ -6492,11 +6533,12 @@ enabled mbedtls && { check_pkg_config mbedtls mbedtls mbedtls/x509_crt check_lib mbedtls mbedtls/ssl.h mbedtls_ssl_init -lmbedtls -lmbedx509 -lmbedcrypto || die "ERROR: mbedTLS not found"; } enabled mediacodec && { enabled jni || die "ERROR: mediacodec requires --enable-jni"; } -enabled mmal && { check_lib mmal interface/mmal/mmal.h mmal_port_connect -lmmal_core -lmmal_util -lmmal_vc_client -lbcm_host || +( enabled rpi || + enabled mmal ) && { check_lib mmal interface/mmal/mmal.h mmal_port_connect -lmmal_core -lmmal_util -lmmal_vc_client -lbcm_host || { ! enabled cross_compile && add_cflags -isystem/opt/vc/include/ -isystem/opt/vc/include/interface/vmcs_host/linux -isystem/opt/vc/include/interface/vcos/pthreads -fgnu89-inline && add_ldflags -L/opt/vc/lib/ && - check_lib mmal interface/mmal/mmal.h mmal_port_connect -lmmal_core -lmmal_util -lmmal_vc_client -lbcm_host; } || + check_lib mmal interface/mmal/mmal.h mmal_port_connect -lmmal_core -lmmal_util -lmmal_vc_client -lbcm_host -lvcos -lvcsm -lvchostif -lvchiq_arm; } || die "ERROR: mmal not found" && check_func_headers interface/mmal/mmal.h "MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS"; } enabled openal && { { for al_extralibs in "${OPENAL_LIBS}" "-lopenal" "-lOpenAL32"; do @@ -6537,8 +6579,16 @@ 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 libudev"; } enabled vapoursynth && require_pkg_config vapoursynth "vapoursynth-script >= 42" VSScript.h vsscript_init +enabled vout_drm && { enabled libdrm || die "ERROR: vout_drm requires --enable-libdrm"; } + +enabled vout_egl && { enabled epoxy || die "ERROR: vout_egl requires epoxy"; } && + { enabled xlib || die "ERROR: vout_egl requires xlib"; } if enabled gcrypt; then GCRYPT_CONFIG="${cross_prefix}libgcrypt-config" @@ -6618,6 +6668,10 @@ if enabled v4l2_m2m; then check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;" fi +check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns +check_cc hevc_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_HEVC_SLICE;" +disable v4l2_req_hevc_vx + check_headers sys/videoio.h test_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete @@ -7105,6 +7159,9 @@ check_deps $CONFIG_LIST \ enabled threads && ! enabled pthreads && ! enabled atomics_native && die "non pthread threading without atomics not supported, try adding --enable-pthreads or --cpu=i486 or higher if you are on x86" enabled avresample && warn "Building with deprecated library libavresample" +# Sub-feature of hevc_v4l2request_hwaccel - can only be set once deps are done +enabled hevc_v4l2request_hwaccel && disabled hevc_v4l2_request && enable v4l2_req_hevc_vx + case $target_os in haiku) disable memalign diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index dec012a299..8aa13007f9 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -2189,8 +2189,8 @@ static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame) ifilter->channel_layout != frame->channel_layout; break; case AVMEDIA_TYPE_VIDEO: - need_reinit |= ifilter->width != frame->width || - ifilter->height != frame->height; + need_reinit |= ifilter->width != av_frame_cropped_width(frame) || + ifilter->height != av_frame_cropped_height(frame); break; } @@ -2201,6 +2201,9 @@ static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame) (ifilter->hw_frames_ctx && ifilter->hw_frames_ctx->data != frame->hw_frames_ctx->data)) need_reinit = 1; + if (no_cvt_hw && fg->graph) + need_reinit = 0; + if (need_reinit) { ret = ifilter_parameters_from_frame(ifilter, frame); if (ret < 0) @@ -2469,8 +2472,7 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_ decoded_frame->top_field_first = ist->top_field_first; ist->frames_decoded++; - - if (ist->hwaccel_retrieve_data && decoded_frame->format == ist->hwaccel_pix_fmt) { + if (!no_cvt_hw && ist->hwaccel_retrieve_data && decoded_frame->format == ist->hwaccel_pix_fmt) { err = ist->hwaccel_retrieve_data(ist->dec_ctx, decoded_frame); if (err < 0) goto fail; @@ -2674,7 +2676,12 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo case AVMEDIA_TYPE_VIDEO: ret = decode_video (ist, repeating ? NULL : avpkt, &got_output, &duration_pts, !pkt, &decode_failed); - if (!repeating || !pkt || got_output) { + // Pi: Do not inc dts if no_cvt_hw set + // V4L2 H264 decode has long latency and sometimes spits out a long + // stream of output without input. In this case incrementing DTS is wrong. + // There may be cases where the condition as written is correct so only + // "fix" in the cases which cause problems + if (!repeating || !pkt || (got_output && !no_cvt_hw)) { if (pkt && pkt->duration) { duration_dts = av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q); } else if(ist->dec_ctx->framerate.num != 0 && ist->dec_ctx->framerate.den != 0) { @@ -2898,6 +2905,16 @@ static enum AVPixelFormat get_format(AVCodecContext *s, const enum AVPixelFormat } else { const HWAccel *hwaccel = NULL; int i; + + if (no_cvt_hw) { + config = avcodec_get_hw_config(s->codec, 0); + if (config->methods == AV_CODEC_HW_CONFIG_METHOD_INTERNAL) { + av_log(s, AV_LOG_DEBUG, "no_cvt_hw so accepting pix_fmt %d with codec internal hwaccel\n", *p); + ist->hwaccel_pix_fmt = *p; + break; + } + } + for (i = 0; hwaccels[i].name; i++) { if (hwaccels[i].pix_fmt == *p) { hwaccel = &hwaccels[i]; @@ -2993,6 +3010,15 @@ static int init_input_stream(int ist_index, char *error, int error_len) return ret; } +#if CONFIG_HEVC_RPI_DECODER + ret = -1; + if (strcmp(codec->name, "hevc_rpi") == 0 && + (ret = avcodec_open2(ist->dec_ctx, codec, &ist->decoder_opts)) < 0) { + ist->dec = codec = avcodec_find_decoder_by_name("hevc"); + av_log(NULL, AV_LOG_INFO, "Failed to open hevc_rpi - trying hevc\n"); + } + if (ret < 0) +#endif if ((ret = avcodec_open2(ist->dec_ctx, codec, &ist->decoder_opts)) < 0) { if (ret == AVERROR_EXPERIMENTAL) abort_codec_experimental(codec, 0); diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 606f2afe0c..448cd2e009 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -61,6 +61,7 @@ enum HWAccelID { HWACCEL_GENERIC, HWACCEL_VIDEOTOOLBOX, HWACCEL_QSV, + HWACCEL_RPI, }; typedef struct HWAccel { @@ -611,6 +612,7 @@ extern int video_sync_method; extern float frame_drop_threshold; extern int do_benchmark; extern int do_benchmark_all; +extern int no_cvt_hw; extern int do_deinterlace; extern int do_hex_dump; extern int do_pkt_dump; diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c index 4ab769c07b..5cdc3a7b6c 100644 --- a/fftools/ffmpeg_filter.c +++ b/fftools/ffmpeg_filter.c @@ -1160,8 +1160,8 @@ int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame) ifilter->format = frame->format; - ifilter->width = frame->width; - ifilter->height = frame->height; + ifilter->width = av_frame_cropped_width(frame); + ifilter->height = av_frame_cropped_height(frame); ifilter->sample_aspect_ratio = frame->sample_aspect_ratio; ifilter->sample_rate = frame->sample_rate; diff --git a/fftools/ffmpeg_hw.c b/fftools/ffmpeg_hw.c index fc4a5d31d6..cc69dce40e 100644 --- a/fftools/ffmpeg_hw.c +++ b/fftools/ffmpeg_hw.c @@ -75,6 +75,8 @@ static char *hw_device_default_name(enum AVHWDeviceType type) char *name; size_t index_pos; int index, index_limit = 1000; + if (!type_name) + return NULL; index_pos = strlen(type_name); name = av_malloc(index_pos + 4); if (!name) diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index 807e783422..456d4f349b 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -133,12 +133,22 @@ static const char *const opt_name_enc_time_bases[] = {"enc_time_base" }\ } +#if CONFIG_RPI +static int rpi_init(AVCodecContext *avctx) { + return 0; +} +#endif + const HWAccel hwaccels[] = { #if CONFIG_VIDEOTOOLBOX { "videotoolbox", videotoolbox_init, HWACCEL_VIDEOTOOLBOX, AV_PIX_FMT_VIDEOTOOLBOX }, #endif #if CONFIG_LIBMFX { "qsv", qsv_init, HWACCEL_QSV, AV_PIX_FMT_QSV }, +#endif +#if CONFIG_RPI + { "rpi", rpi_init, HWACCEL_RPI, AV_PIX_FMT_RPI4_8 }, + { "rpi", rpi_init, HWACCEL_RPI, AV_PIX_FMT_RPI4_10 }, #endif { 0 }, }; @@ -158,6 +168,7 @@ float frame_drop_threshold = 0; int do_deinterlace = 0; int do_benchmark = 0; int do_benchmark_all = 0; +int no_cvt_hw = 0; int do_hex_dump = 0; int do_pkt_dump = 0; int copy_ts = 0; @@ -3499,6 +3510,8 @@ const OptionDef options[] = { "add timings for benchmarking" }, { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all }, "add timings for each task" }, + { "no_cvt_hw", OPT_BOOL | OPT_EXPERT, { &no_cvt_hw }, + "do not auto-convert hw frames to sw" }, { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress }, "write program-readable progress information", "url" }, { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction }, diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 33a280cf69..e93c842047 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -19,6 +19,7 @@ HEADERS = ac3_parser.h \ mediacodec.h \ packet.h \ qsv.h \ + rpi_zc.h \ vaapi.h \ vdpau.h \ version.h \ @@ -140,6 +141,7 @@ OBJS-$(CONFIG_QSVDEC) += qsvdec.o OBJS-$(CONFIG_QSVENC) += qsvenc.o OBJS-$(CONFIG_RANGECODER) += rangecoder.o OBJS-$(CONFIG_RDFT) += rdft.o +OBJS-$(CONFIG_RPI) += rpi_qpu.o rpi_mailbox.o rpi_zc.o OBJS-$(CONFIG_RV34DSP) += rv34dsp.o OBJS-$(CONFIG_SHARED) += log2_tab.o reverse.o OBJS-$(CONFIG_SINEWIN) += sinewin.o @@ -154,7 +156,10 @@ OBJS-$(CONFIG_VIDEODSP) += videodsp.o OBJS-$(CONFIG_VP3DSP) += vp3dsp.o OBJS-$(CONFIG_VP56DSP) += vp56dsp.o OBJS-$(CONFIG_VP8DSP) += vp8dsp.o -OBJS-$(CONFIG_V4L2_M2M) += v4l2_m2m.o v4l2_context.o v4l2_buffers.o v4l2_fmt.o +OBJS-$(CONFIG_V4L2_M2M) += v4l2_m2m.o v4l2_context.o v4l2_buffers.o v4l2_fmt.o\ + weak_link.o v4l2_req_dmabufs.o +OBJS-$(CONFIG_V4L2_REQUEST) += v4l2_req_media.o v4l2_req_pollqueue.o v4l2_req_dmabufs.o\ + v4l2_req_devscan.o weak_link.o OBJS-$(CONFIG_WMA_FREQS) += wma_freqs.o OBJS-$(CONFIG_WMV2DSP) += wmv2dsp.o @@ -403,6 +408,14 @@ OBJS-$(CONFIG_HEVC_QSV_DECODER) += qsvdec.o OBJS-$(CONFIG_HEVC_QSV_ENCODER) += qsvenc_hevc.o hevc_ps_enc.o \ hevc_data.o OBJS-$(CONFIG_HEVC_RKMPP_DECODER) += rkmppdec.o +OBJS-$(CONFIG_RPI) += rpi_mem.o \ + rpi_mailbox.o rpi_zc.o +OBJS-$(CONFIG_HEVC_RPI_DECODER) += rpi_hevcdec.o rpi_hevc_mvs.o \ + rpi_hevc_cabac.o rpi_hevc_refs.o rpi_hevcpred.o \ + rpi_hevcdsp.o rpi_hevc_filter.o rpi_hevc_data.o \ + rpi_hevc_shader.o rpi_hevc_shader_template.o \ + rpi_hevc_parse.o h2645_parse.o rpi_hevc_ps.o \ + rpi_hevc_sei.o rpi_hevc_data.o rpi_qpu.o rpi_mem.o OBJS-$(CONFIG_HEVC_VAAPI_ENCODER) += vaapi_encode_h265.o h265_profile_level.o OBJS-$(CONFIG_HEVC_V4L2M2M_DECODER) += v4l2_m2m_dec.o OBJS-$(CONFIG_HEVC_V4L2M2M_ENCODER) += v4l2_m2m_enc.o @@ -941,6 +954,10 @@ OBJS-$(CONFIG_HEVC_D3D11VA_HWACCEL) += dxva2_hevc.o OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL) += dxva2_hevc.o OBJS-$(CONFIG_HEVC_NVDEC_HWACCEL) += nvdec_hevc.o OBJS-$(CONFIG_HEVC_QSV_HWACCEL) += qsvdec.o +OBJS-$(CONFIG_HEVC_RPI4_8_HWACCEL) += rpivid_hevc.o +OBJS-$(CONFIG_HEVC_RPI4_10_HWACCEL) += rpivid_hevc.o +OBJS-$(CONFIG_HEVC_V4L2REQUEST_HWACCEL) += v4l2_request_hevc.o v4l2_req_decode_q.o v4l2_req_hevc_v4.o +OBJS-$(CONFIG_V4L2_REQ_HEVC_VX) += v4l2_req_hevc_v1.o v4l2_req_hevc_v2.o v4l2_req_hevc_v3.o OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL) += vaapi_hevc.o h265_profile_level.o OBJS-$(CONFIG_HEVC_VDPAU_HWACCEL) += vdpau_hevc.o h265_profile_level.o OBJS-$(CONFIG_MJPEG_NVDEC_HWACCEL) += nvdec_mjpeg.o @@ -1297,3 +1314,31 @@ $(SUBDIR)pcm.o: $(SUBDIR)pcm_tables.h $(SUBDIR)qdm2.o: $(SUBDIR)qdm2_tables.h $(SUBDIR)sinewin.o: $(SUBDIR)sinewin_tables.h endif + +ifdef CONFIG_HEVC_RPI_DECODER +QASM_PY := ../local/bin/qasm.py +VASMVIDCORE := ../local/bin/vasmvidcore_std + +ifneq ("$(wildcard $(QASM_PY))","") +$(SUBDIR)rpi_hevc_shader.c: $(SUBDIR)rpi_hevc_shader.qasm + $(QASM_PY) -mc_c:rpi_hevc_shader,rpi_hevc_shader,ff_hevc_rpi_shader $< > $@ + +$(SUBDIR)rpi_hevc_shader.h: $(SUBDIR)rpi_hevc_shader.qasm + $(QASM_PY) -mc_h:rpi_hevc_shader,rpi_hevc_shader,ff_hevc_rpi_shader $< > $@ +endif + +ifneq ("$(wildcard $(VASMVIDCORE))","") +$(SUBDIR)rpi_hevc_transform8.bin: $(SUBDIR)rpi_hevc_transform.s + $(VASMVIDCORE) -Fbin -DBIT_DEPTH=8 $< -o $@ +$(SUBDIR)rpi_hevc_transform10.bin: $(SUBDIR)rpi_hevc_transform.s + $(VASMVIDCORE) -Fbin -DBIT_DEPTH=10 $< -o $@ + +$(SUBDIR)rpi_hevc_transform8.h: $(SUBDIR)rpi_hevc_transform8.bin + python pi-util/make_array.py $< +$(SUBDIR)rpi_hevc_transform10.h: $(SUBDIR)rpi_hevc_transform10.bin + python pi-util/make_array.py $< +endif + +$(SUBDIR)rpi_qpu.o: $(SUBDIR)rpi_hevc_transform8.h $(SUBDIR)rpi_hevc_transform10.h +$(SUBDIR)rpi_hevcdec.o $(SUBDIR)rpi_shader_template.o $(SUBDIR)rpi_qpu.o: $(SUBDIR)rpi_hevc_shader.h +endif diff --git a/libavcodec/aarch64/Makefile b/libavcodec/aarch64/Makefile index 954461f81d..c8935f205e 100644 --- a/libavcodec/aarch64/Makefile +++ b/libavcodec/aarch64/Makefile @@ -44,10 +44,12 @@ NEON-OBJS-$(CONFIG_H264PRED) += aarch64/h264pred_neon.o NEON-OBJS-$(CONFIG_H264QPEL) += aarch64/h264qpel_neon.o \ aarch64/hpeldsp_neon.o NEON-OBJS-$(CONFIG_HPELDSP) += aarch64/hpeldsp_neon.o -NEON-OBJS-$(CONFIG_IDCTDSP) += aarch64/simple_idct_neon.o +NEON-OBJS-$(CONFIG_IDCTDSP) += aarch64/idctdsp_neon.o \ + aarch64/simple_idct_neon.o NEON-OBJS-$(CONFIG_MDCT) += aarch64/mdct_neon.o NEON-OBJS-$(CONFIG_MPEGAUDIODSP) += aarch64/mpegaudiodsp_neon.o NEON-OBJS-$(CONFIG_PIXBLOCKDSP) += aarch64/pixblockdsp_neon.o +NEON-OBJS-$(CONFIG_VC1DSP) += aarch64/vc1dsp_neon.o NEON-OBJS-$(CONFIG_VP8DSP) += aarch64/vp8dsp_neon.o # decoders/encoders diff --git a/libavcodec/aarch64/idctdsp_init_aarch64.c b/libavcodec/aarch64/idctdsp_init_aarch64.c index 742a3372e3..eec21aa5a2 100644 --- a/libavcodec/aarch64/idctdsp_init_aarch64.c +++ b/libavcodec/aarch64/idctdsp_init_aarch64.c @@ -27,19 +27,29 @@ #include "libavcodec/idctdsp.h" #include "idct.h" +void ff_put_pixels_clamped_neon(const int16_t *, uint8_t *, ptrdiff_t); +void ff_put_signed_pixels_clamped_neon(const int16_t *, uint8_t *, ptrdiff_t); +void ff_add_pixels_clamped_neon(const int16_t *, uint8_t *, ptrdiff_t); + av_cold void ff_idctdsp_init_aarch64(IDCTDSPContext *c, AVCodecContext *avctx, unsigned high_bit_depth) { int cpu_flags = av_get_cpu_flags(); - if (have_neon(cpu_flags) && !avctx->lowres && !high_bit_depth) { - if (avctx->idct_algo == FF_IDCT_AUTO || - avctx->idct_algo == FF_IDCT_SIMPLEAUTO || - avctx->idct_algo == FF_IDCT_SIMPLENEON) { - c->idct_put = ff_simple_idct_put_neon; - c->idct_add = ff_simple_idct_add_neon; - c->idct = ff_simple_idct_neon; - c->perm_type = FF_IDCT_PERM_PARTTRANS; + if (have_neon(cpu_flags)) { + if (!avctx->lowres && !high_bit_depth) { + if (avctx->idct_algo == FF_IDCT_AUTO || + avctx->idct_algo == FF_IDCT_SIMPLEAUTO || + avctx->idct_algo == FF_IDCT_SIMPLENEON) { + c->idct_put = ff_simple_idct_put_neon; + c->idct_add = ff_simple_idct_add_neon; + c->idct = ff_simple_idct_neon; + c->perm_type = FF_IDCT_PERM_PARTTRANS; + } } + + c->add_pixels_clamped = ff_add_pixels_clamped_neon; + c->put_pixels_clamped = ff_put_pixels_clamped_neon; + c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_neon; } } diff --git a/libavcodec/aarch64/idctdsp_neon.S b/libavcodec/aarch64/idctdsp_neon.S new file mode 100644 index 0000000000..7f47611206 --- /dev/null +++ b/libavcodec/aarch64/idctdsp_neon.S @@ -0,0 +1,130 @@ +/* + * IDCT AArch64 NEON optimisations + * + * Copyright (c) 2022 Ben Avison + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/aarch64/asm.S" + +// Clamp 16-bit signed block coefficients to unsigned 8-bit +// On entry: +// x0 -> array of 64x 16-bit coefficients +// x1 -> 8-bit results +// x2 = row stride for results, bytes +function ff_put_pixels_clamped_neon, export=1 + ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #64 + ld1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x0] + sqxtun v0.8b, v0.8h + sqxtun v1.8b, v1.8h + sqxtun v2.8b, v2.8h + sqxtun v3.8b, v3.8h + sqxtun v4.8b, v4.8h + st1 {v0.8b}, [x1], x2 + sqxtun v0.8b, v5.8h + st1 {v1.8b}, [x1], x2 + sqxtun v1.8b, v6.8h + st1 {v2.8b}, [x1], x2 + sqxtun v2.8b, v7.8h + st1 {v3.8b}, [x1], x2 + st1 {v4.8b}, [x1], x2 + st1 {v0.8b}, [x1], x2 + st1 {v1.8b}, [x1], x2 + st1 {v2.8b}, [x1] + ret +endfunc + +// Clamp 16-bit signed block coefficients to signed 8-bit (biased by 128) +// On entry: +// x0 -> array of 64x 16-bit coefficients +// x1 -> 8-bit results +// x2 = row stride for results, bytes +function ff_put_signed_pixels_clamped_neon, export=1 + ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #64 + movi v4.8b, #128 + ld1 {v16.16b, v17.16b, v18.16b, v19.16b}, [x0] + sqxtn v0.8b, v0.8h + sqxtn v1.8b, v1.8h + sqxtn v2.8b, v2.8h + sqxtn v3.8b, v3.8h + sqxtn v5.8b, v16.8h + add v0.8b, v0.8b, v4.8b + sqxtn v6.8b, v17.8h + add v1.8b, v1.8b, v4.8b + sqxtn v7.8b, v18.8h + add v2.8b, v2.8b, v4.8b + sqxtn v16.8b, v19.8h + add v3.8b, v3.8b, v4.8b + st1 {v0.8b}, [x1], x2 + add v0.8b, v5.8b, v4.8b + st1 {v1.8b}, [x1], x2 + add v1.8b, v6.8b, v4.8b + st1 {v2.8b}, [x1], x2 + add v2.8b, v7.8b, v4.8b + st1 {v3.8b}, [x1], x2 + add v3.8b, v16.8b, v4.8b + st1 {v0.8b}, [x1], x2 + st1 {v1.8b}, [x1], x2 + st1 {v2.8b}, [x1], x2 + st1 {v3.8b}, [x1] + ret +endfunc + +// Add 16-bit signed block coefficients to unsigned 8-bit +// On entry: +// x0 -> array of 64x 16-bit coefficients +// x1 -> 8-bit input and results +// x2 = row stride for 8-bit input and results, bytes +function ff_add_pixels_clamped_neon, export=1 + ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #64 + mov x3, x1 + ld1 {v4.8b}, [x1], x2 + ld1 {v5.8b}, [x1], x2 + ld1 {v6.8b}, [x1], x2 + ld1 {v7.8b}, [x1], x2 + ld1 {v16.16b, v17.16b, v18.16b, v19.16b}, [x0] + uaddw v0.8h, v0.8h, v4.8b + uaddw v1.8h, v1.8h, v5.8b + uaddw v2.8h, v2.8h, v6.8b + ld1 {v4.8b}, [x1], x2 + uaddw v3.8h, v3.8h, v7.8b + ld1 {v5.8b}, [x1], x2 + sqxtun v0.8b, v0.8h + ld1 {v6.8b}, [x1], x2 + sqxtun v1.8b, v1.8h + ld1 {v7.8b}, [x1] + sqxtun v2.8b, v2.8h + sqxtun v3.8b, v3.8h + uaddw v4.8h, v16.8h, v4.8b + st1 {v0.8b}, [x3], x2 + uaddw v0.8h, v17.8h, v5.8b + st1 {v1.8b}, [x3], x2 + uaddw v1.8h, v18.8h, v6.8b + st1 {v2.8b}, [x3], x2 + uaddw v2.8h, v19.8h, v7.8b + sqxtun v4.8b, v4.8h + sqxtun v0.8b, v0.8h + st1 {v3.8b}, [x3], x2 + sqxtun v1.8b, v1.8h + sqxtun v2.8b, v2.8h + st1 {v4.8b}, [x3], x2 + st1 {v0.8b}, [x3], x2 + st1 {v1.8b}, [x3], x2 + st1 {v2.8b}, [x3] + ret +endfunc diff --git a/libavcodec/aarch64/vc1dsp_init_aarch64.c b/libavcodec/aarch64/vc1dsp_init_aarch64.c index 13dfd74940..a7976fd596 100644 --- a/libavcodec/aarch64/vc1dsp_init_aarch64.c +++ b/libavcodec/aarch64/vc1dsp_init_aarch64.c @@ -21,10 +21,28 @@ #include "libavutil/attributes.h" #include "libavutil/cpu.h" #include "libavutil/aarch64/cpu.h" +#include "libavutil/intreadwrite.h" #include "libavcodec/vc1dsp.h" #include "config.h" +void ff_vc1_inv_trans_8x8_neon(int16_t *block); +void ff_vc1_inv_trans_8x4_neon(uint8_t *dest, ptrdiff_t stride, int16_t *block); +void ff_vc1_inv_trans_4x8_neon(uint8_t *dest, ptrdiff_t stride, int16_t *block); +void ff_vc1_inv_trans_4x4_neon(uint8_t *dest, ptrdiff_t stride, int16_t *block); + +void ff_vc1_inv_trans_8x8_dc_neon(uint8_t *dest, ptrdiff_t stride, int16_t *block); +void ff_vc1_inv_trans_8x4_dc_neon(uint8_t *dest, ptrdiff_t stride, int16_t *block); +void ff_vc1_inv_trans_4x8_dc_neon(uint8_t *dest, ptrdiff_t stride, int16_t *block); +void ff_vc1_inv_trans_4x4_dc_neon(uint8_t *dest, ptrdiff_t stride, int16_t *block); + +void ff_vc1_v_loop_filter4_neon(uint8_t *src, ptrdiff_t stride, int pq); +void ff_vc1_h_loop_filter4_neon(uint8_t *src, ptrdiff_t stride, int pq); +void ff_vc1_v_loop_filter8_neon(uint8_t *src, ptrdiff_t stride, int pq); +void ff_vc1_h_loop_filter8_neon(uint8_t *src, ptrdiff_t stride, int pq); +void ff_vc1_v_loop_filter16_neon(uint8_t *src, ptrdiff_t stride, int pq); +void ff_vc1_h_loop_filter16_neon(uint8_t *src, ptrdiff_t stride, int pq); + void ff_put_vc1_chroma_mc8_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride, int h, int x, int y); void ff_avg_vc1_chroma_mc8_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride, @@ -34,14 +52,90 @@ void ff_put_vc1_chroma_mc4_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride, void ff_avg_vc1_chroma_mc4_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride, int h, int x, int y); +int ff_vc1_unescape_buffer_helper_neon(const uint8_t *src, int size, uint8_t *dst); + +static int vc1_unescape_buffer_neon(const uint8_t *src, int size, uint8_t *dst) +{ + /* Dealing with starting and stopping, and removing escape bytes, are + * comparatively less time-sensitive, so are more clearly expressed using + * a C wrapper around the assembly inner loop. Note that we assume a + * little-endian machine that supports unaligned loads. */ + int dsize = 0; + while (size >= 4) + { + int found = 0; + while (!found && (((uintptr_t) dst) & 7) && size >= 4) + { + found = (AV_RL32(src) &~ 0x03000000) == 0x00030000; + if (!found) + { + *dst++ = *src++; + --size; + ++dsize; + } + } + if (!found) + { + int skip = size - ff_vc1_unescape_buffer_helper_neon(src, size, dst); + dst += skip; + src += skip; + size -= skip; + dsize += skip; + while (!found && size >= 4) + { + found = (AV_RL32(src) &~ 0x03000000) == 0x00030000; + if (!found) + { + *dst++ = *src++; + --size; + ++dsize; + } + } + } + if (found) + { + *dst++ = *src++; + *dst++ = *src++; + ++src; + size -= 3; + dsize += 2; + } + } + while (size > 0) + { + *dst++ = *src++; + --size; + ++dsize; + } + return dsize; +} + av_cold void ff_vc1dsp_init_aarch64(VC1DSPContext *dsp) { int cpu_flags = av_get_cpu_flags(); if (have_neon(cpu_flags)) { + dsp->vc1_inv_trans_8x8 = ff_vc1_inv_trans_8x8_neon; + dsp->vc1_inv_trans_8x4 = ff_vc1_inv_trans_8x4_neon; + dsp->vc1_inv_trans_4x8 = ff_vc1_inv_trans_4x8_neon; + dsp->vc1_inv_trans_4x4 = ff_vc1_inv_trans_4x4_neon; + dsp->vc1_inv_trans_8x8_dc = ff_vc1_inv_trans_8x8_dc_neon; + dsp->vc1_inv_trans_8x4_dc = ff_vc1_inv_trans_8x4_dc_neon; + dsp->vc1_inv_trans_4x8_dc = ff_vc1_inv_trans_4x8_dc_neon; + dsp->vc1_inv_trans_4x4_dc = ff_vc1_inv_trans_4x4_dc_neon; + + dsp->vc1_v_loop_filter4 = ff_vc1_v_loop_filter4_neon; + dsp->vc1_h_loop_filter4 = ff_vc1_h_loop_filter4_neon; + dsp->vc1_v_loop_filter8 = ff_vc1_v_loop_filter8_neon; + dsp->vc1_h_loop_filter8 = ff_vc1_h_loop_filter8_neon; + dsp->vc1_v_loop_filter16 = ff_vc1_v_loop_filter16_neon; + dsp->vc1_h_loop_filter16 = ff_vc1_h_loop_filter16_neon; + dsp->put_no_rnd_vc1_chroma_pixels_tab[0] = ff_put_vc1_chroma_mc8_neon; dsp->avg_no_rnd_vc1_chroma_pixels_tab[0] = ff_avg_vc1_chroma_mc8_neon; dsp->put_no_rnd_vc1_chroma_pixels_tab[1] = ff_put_vc1_chroma_mc4_neon; dsp->avg_no_rnd_vc1_chroma_pixels_tab[1] = ff_avg_vc1_chroma_mc4_neon; + + dsp->vc1_unescape_buffer = vc1_unescape_buffer_neon; } } diff --git a/libavcodec/aarch64/vc1dsp_neon.S b/libavcodec/aarch64/vc1dsp_neon.S new file mode 100644 index 0000000000..9a96c2523c --- /dev/null +++ b/libavcodec/aarch64/vc1dsp_neon.S @@ -0,0 +1,1546 @@ +/* + * VC1 AArch64 NEON optimisations + * + * Copyright (c) 2022 Ben Avison + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/aarch64/asm.S" + +// VC-1 8x8 inverse transform +// On entry: +// x0 -> array of 16-bit inverse transform coefficients, in column-major order +// On exit: +// array at x0 updated to hold transformed block; also now held in row-major order +function ff_vc1_inv_trans_8x8_neon, export=1 + ld1 {v1.16b, v2.16b}, [x0], #32 + ld1 {v3.16b, v4.16b}, [x0], #32 + ld1 {v5.16b, v6.16b}, [x0], #32 + shl v1.8h, v1.8h, #2 // 8/2 * src[0] + sub x1, x0, #3*32 + ld1 {v16.16b, v17.16b}, [x0] + shl v7.8h, v2.8h, #4 // 16 * src[8] + shl v18.8h, v2.8h, #2 // 4 * src[8] + shl v19.8h, v4.8h, #4 // 16 * src[24] + ldr d0, .Lcoeffs_it8 + shl v5.8h, v5.8h, #2 // 8/2 * src[32] + shl v20.8h, v6.8h, #4 // 16 * src[40] + shl v21.8h, v6.8h, #2 // 4 * src[40] + shl v22.8h, v17.8h, #4 // 16 * src[56] + ssra v20.8h, v19.8h, #2 // 4 * src[24] + 16 * src[40] + mul v23.8h, v3.8h, v0.h[0] // 6/2 * src[16] + sub v19.8h, v19.8h, v21.8h // 16 * src[24] - 4 * src[40] + ssra v7.8h, v22.8h, #2 // 16 * src[8] + 4 * src[56] + sub v18.8h, v22.8h, v18.8h // - 4 * src[8] + 16 * src[56] + shl v3.8h, v3.8h, #3 // 16/2 * src[16] + mls v20.8h, v2.8h, v0.h[2] // - 15 * src[8] + 4 * src[24] + 16 * src[40] + ssra v1.8h, v1.8h, #1 // 12/2 * src[0] + ssra v5.8h, v5.8h, #1 // 12/2 * src[32] + mla v7.8h, v4.8h, v0.h[2] // 16 * src[8] + 15 * src[24] + 4 * src[56] + shl v21.8h, v16.8h, #3 // 16/2 * src[48] + mls v19.8h, v2.8h, v0.h[1] // - 9 * src[8] + 16 * src[24] - 4 * src[40] + sub v2.8h, v23.8h, v21.8h // t4/2 = 6/2 * src[16] - 16/2 * src[48] + mla v18.8h, v4.8h, v0.h[1] // - 4 * src[8] + 9 * src[24] + 16 * src[56] + add v4.8h, v1.8h, v5.8h // t1/2 = 12/2 * src[0] + 12/2 * src[32] + sub v1.8h, v1.8h, v5.8h // t2/2 = 12/2 * src[0] - 12/2 * src[32] + mla v3.8h, v16.8h, v0.h[0] // t3/2 = 16/2 * src[16] + 6/2 * src[48] + mla v7.8h, v6.8h, v0.h[1] // t1 = 16 * src[8] + 15 * src[24] + 9 * src[40] + 4 * src[56] + add v5.8h, v1.8h, v2.8h // t6/2 = t2/2 + t4/2 + sub v16.8h, v1.8h, v2.8h // t7/2 = t2/2 - t4/2 + mla v20.8h, v17.8h, v0.h[1] // -t2 = - 15 * src[8] + 4 * src[24] + 16 * src[40] + 9 * src[56] + add v21.8h, v1.8h, v2.8h // t6/2 = t2/2 + t4/2 + add v22.8h, v4.8h, v3.8h // t5/2 = t1/2 + t3/2 + mls v19.8h, v17.8h, v0.h[2] // -t3 = - 9 * src[8] + 16 * src[24] - 4 * src[40] - 15 * src[56] + sub v17.8h, v4.8h, v3.8h // t8/2 = t1/2 - t3/2 + add v23.8h, v4.8h, v3.8h // t5/2 = t1/2 + t3/2 + mls v18.8h, v6.8h, v0.h[2] // -t4 = - 4 * src[8] + 9 * src[24] - 15 * src[40] + 16 * src[56] + sub v1.8h, v1.8h, v2.8h // t7/2 = t2/2 - t4/2 + sub v2.8h, v4.8h, v3.8h // t8/2 = t1/2 - t3/2 + neg v3.8h, v7.8h // -t1 + neg v4.8h, v20.8h // +t2 + neg v6.8h, v19.8h // +t3 + ssra v22.8h, v7.8h, #1 // (t5 + t1) >> 1 + ssra v1.8h, v19.8h, #1 // (t7 - t3) >> 1 + neg v7.8h, v18.8h // +t4 + ssra v5.8h, v4.8h, #1 // (t6 + t2) >> 1 + ssra v16.8h, v6.8h, #1 // (t7 + t3) >> 1 + ssra v2.8h, v18.8h, #1 // (t8 - t4) >> 1 + ssra v17.8h, v7.8h, #1 // (t8 + t4) >> 1 + ssra v21.8h, v20.8h, #1 // (t6 - t2) >> 1 + ssra v23.8h, v3.8h, #1 // (t5 - t1) >> 1 + srshr v3.8h, v22.8h, #2 // (t5 + t1 + 4) >> 3 + srshr v4.8h, v5.8h, #2 // (t6 + t2 + 4) >> 3 + srshr v5.8h, v16.8h, #2 // (t7 + t3 + 4) >> 3 + srshr v6.8h, v17.8h, #2 // (t8 + t4 + 4) >> 3 + srshr v2.8h, v2.8h, #2 // (t8 - t4 + 4) >> 3 + srshr v1.8h, v1.8h, #2 // (t7 - t3 + 4) >> 3 + srshr v7.8h, v21.8h, #2 // (t6 - t2 + 4) >> 3 + srshr v16.8h, v23.8h, #2 // (t5 - t1 + 4) >> 3 + trn2 v17.8h, v3.8h, v4.8h + trn2 v18.8h, v5.8h, v6.8h + trn2 v19.8h, v2.8h, v1.8h + trn2 v20.8h, v7.8h, v16.8h + trn1 v21.4s, v17.4s, v18.4s + trn2 v17.4s, v17.4s, v18.4s + trn1 v18.4s, v19.4s, v20.4s + trn2 v19.4s, v19.4s, v20.4s + trn1 v3.8h, v3.8h, v4.8h + trn2 v4.2d, v21.2d, v18.2d + trn1 v20.2d, v17.2d, v19.2d + trn1 v5.8h, v5.8h, v6.8h + trn1 v1.8h, v2.8h, v1.8h + trn1 v2.8h, v7.8h, v16.8h + trn1 v6.2d, v21.2d, v18.2d + trn2 v7.2d, v17.2d, v19.2d + shl v16.8h, v20.8h, #4 // 16 * src[24] + shl v17.8h, v4.8h, #4 // 16 * src[40] + trn1 v18.4s, v3.4s, v5.4s + trn1 v19.4s, v1.4s, v2.4s + shl v21.8h, v7.8h, #4 // 16 * src[56] + shl v22.8h, v6.8h, #2 // 4 * src[8] + shl v23.8h, v4.8h, #2 // 4 * src[40] + trn2 v3.4s, v3.4s, v5.4s + trn2 v1.4s, v1.4s, v2.4s + shl v2.8h, v6.8h, #4 // 16 * src[8] + sub v5.8h, v16.8h, v23.8h // 16 * src[24] - 4 * src[40] + ssra v17.8h, v16.8h, #2 // 4 * src[24] + 16 * src[40] + sub v16.8h, v21.8h, v22.8h // - 4 * src[8] + 16 * src[56] + trn1 v22.2d, v18.2d, v19.2d + trn2 v18.2d, v18.2d, v19.2d + trn1 v19.2d, v3.2d, v1.2d + ssra v2.8h, v21.8h, #2 // 16 * src[8] + 4 * src[56] + mls v17.8h, v6.8h, v0.h[2] // - 15 * src[8] + 4 * src[24] + 16 * src[40] + shl v21.8h, v22.8h, #2 // 8/2 * src[0] + shl v18.8h, v18.8h, #2 // 8/2 * src[32] + mls v5.8h, v6.8h, v0.h[1] // - 9 * src[8] + 16 * src[24] - 4 * src[40] + shl v6.8h, v19.8h, #3 // 16/2 * src[16] + trn2 v1.2d, v3.2d, v1.2d + mla v16.8h, v20.8h, v0.h[1] // - 4 * src[8] + 9 * src[24] + 16 * src[56] + ssra v21.8h, v21.8h, #1 // 12/2 * src[0] + ssra v18.8h, v18.8h, #1 // 12/2 * src[32] + mul v3.8h, v19.8h, v0.h[0] // 6/2 * src[16] + shl v19.8h, v1.8h, #3 // 16/2 * src[48] + mla v2.8h, v20.8h, v0.h[2] // 16 * src[8] + 15 * src[24] + 4 * src[56] + add v20.8h, v21.8h, v18.8h // t1/2 = 12/2 * src[0] + 12/2 * src[32] + mla v6.8h, v1.8h, v0.h[0] // t3/2 = 16/2 * src[16] + 6/2 * src[48] + sub v1.8h, v21.8h, v18.8h // t2/2 = 12/2 * src[0] - 12/2 * src[32] + sub v3.8h, v3.8h, v19.8h // t4/2 = 6/2 * src[16] - 16/2 * src[48] + mla v17.8h, v7.8h, v0.h[1] // -t2 = - 15 * src[8] + 4 * src[24] + 16 * src[40] + 9 * src[56] + mls v5.8h, v7.8h, v0.h[2] // -t3 = - 9 * src[8] + 16 * src[24] - 4 * src[40] - 15 * src[56] + add v7.8h, v1.8h, v3.8h // t6/2 = t2/2 + t4/2 + add v18.8h, v20.8h, v6.8h // t5/2 = t1/2 + t3/2 + mls v16.8h, v4.8h, v0.h[2] // -t4 = - 4 * src[8] + 9 * src[24] - 15 * src[40] + 16 * src[56] + sub v19.8h, v1.8h, v3.8h // t7/2 = t2/2 - t4/2 + neg v21.8h, v17.8h // +t2 + mla v2.8h, v4.8h, v0.h[1] // t1 = 16 * src[8] + 15 * src[24] + 9 * src[40] + 4 * src[56] + sub v0.8h, v20.8h, v6.8h // t8/2 = t1/2 - t3/2 + neg v4.8h, v5.8h // +t3 + sub v22.8h, v1.8h, v3.8h // t7/2 = t2/2 - t4/2 + sub v23.8h, v20.8h, v6.8h // t8/2 = t1/2 - t3/2 + neg v24.8h, v16.8h // +t4 + add v6.8h, v20.8h, v6.8h // t5/2 = t1/2 + t3/2 + add v1.8h, v1.8h, v3.8h // t6/2 = t2/2 + t4/2 + ssra v7.8h, v21.8h, #1 // (t6 + t2) >> 1 + neg v3.8h, v2.8h // -t1 + ssra v18.8h, v2.8h, #1 // (t5 + t1) >> 1 + ssra v19.8h, v4.8h, #1 // (t7 + t3) >> 1 + ssra v0.8h, v24.8h, #1 // (t8 + t4) >> 1 + srsra v23.8h, v16.8h, #1 // (t8 - t4 + 1) >> 1 + srsra v22.8h, v5.8h, #1 // (t7 - t3 + 1) >> 1 + srsra v1.8h, v17.8h, #1 // (t6 - t2 + 1) >> 1 + srsra v6.8h, v3.8h, #1 // (t5 - t1 + 1) >> 1 + srshr v2.8h, v18.8h, #6 // (t5 + t1 + 64) >> 7 + srshr v3.8h, v7.8h, #6 // (t6 + t2 + 64) >> 7 + srshr v4.8h, v19.8h, #6 // (t7 + t3 + 64) >> 7 + srshr v5.8h, v0.8h, #6 // (t8 + t4 + 64) >> 7 + srshr v16.8h, v23.8h, #6 // (t8 - t4 + 65) >> 7 + srshr v17.8h, v22.8h, #6 // (t7 - t3 + 65) >> 7 + st1 {v2.16b, v3.16b}, [x1], #32 + srshr v0.8h, v1.8h, #6 // (t6 - t2 + 65) >> 7 + srshr v1.8h, v6.8h, #6 // (t5 - t1 + 65) >> 7 + st1 {v4.16b, v5.16b}, [x1], #32 + st1 {v16.16b, v17.16b}, [x1], #32 + st1 {v0.16b, v1.16b}, [x1] + ret +endfunc + +// VC-1 8x4 inverse transform +// On entry: +// x0 -> array of 8-bit samples, in row-major order +// x1 = row stride for 8-bit sample array +// x2 -> array of 16-bit inverse transform coefficients, in row-major order +// On exit: +// array at x0 updated by saturated addition of (narrowed) transformed block +function ff_vc1_inv_trans_8x4_neon, export=1 + ld1 {v1.8b, v2.8b, v3.8b, v4.8b}, [x2], #32 + mov x3, x0 + ld1 {v16.8b, v17.8b, v18.8b, v19.8b}, [x2] + ldr q0, .Lcoeffs_it8 // includes 4-point coefficients in upper half of vector + ld1 {v5.8b}, [x0], x1 + trn2 v6.4h, v1.4h, v3.4h + trn2 v7.4h, v2.4h, v4.4h + trn1 v1.4h, v1.4h, v3.4h + trn1 v2.4h, v2.4h, v4.4h + trn2 v3.4h, v16.4h, v18.4h + trn2 v4.4h, v17.4h, v19.4h + trn1 v16.4h, v16.4h, v18.4h + trn1 v17.4h, v17.4h, v19.4h + ld1 {v18.8b}, [x0], x1 + trn1 v19.2s, v6.2s, v3.2s + trn2 v3.2s, v6.2s, v3.2s + trn1 v6.2s, v7.2s, v4.2s + trn2 v4.2s, v7.2s, v4.2s + trn1 v7.2s, v1.2s, v16.2s + trn1 v20.2s, v2.2s, v17.2s + shl v21.4h, v19.4h, #4 // 16 * src[1] + trn2 v1.2s, v1.2s, v16.2s + shl v16.4h, v3.4h, #4 // 16 * src[3] + trn2 v2.2s, v2.2s, v17.2s + shl v17.4h, v6.4h, #4 // 16 * src[5] + ld1 {v22.8b}, [x0], x1 + shl v23.4h, v4.4h, #4 // 16 * src[7] + mul v24.4h, v1.4h, v0.h[0] // 6/2 * src[2] + ld1 {v25.8b}, [x0] + shl v26.4h, v19.4h, #2 // 4 * src[1] + shl v27.4h, v6.4h, #2 // 4 * src[5] + ssra v21.4h, v23.4h, #2 // 16 * src[1] + 4 * src[7] + ssra v17.4h, v16.4h, #2 // 4 * src[3] + 16 * src[5] + sub v23.4h, v23.4h, v26.4h // - 4 * src[1] + 16 * src[7] + sub v16.4h, v16.4h, v27.4h // 16 * src[3] - 4 * src[5] + shl v7.4h, v7.4h, #2 // 8/2 * src[0] + shl v20.4h, v20.4h, #2 // 8/2 * src[4] + mla v21.4h, v3.4h, v0.h[2] // 16 * src[1] + 15 * src[3] + 4 * src[7] + shl v1.4h, v1.4h, #3 // 16/2 * src[2] + mls v17.4h, v19.4h, v0.h[2] // - 15 * src[1] + 4 * src[3] + 16 * src[5] + ssra v7.4h, v7.4h, #1 // 12/2 * src[0] + mls v16.4h, v19.4h, v0.h[1] // - 9 * src[1] + 16 * src[3] - 4 * src[5] + ssra v20.4h, v20.4h, #1 // 12/2 * src[4] + mla v23.4h, v3.4h, v0.h[1] // - 4 * src[1] + 9 * src[3] + 16 * src[7] + shl v3.4h, v2.4h, #3 // 16/2 * src[6] + mla v1.4h, v2.4h, v0.h[0] // t3/2 = 16/2 * src[2] + 6/2 * src[6] + mla v21.4h, v6.4h, v0.h[1] // t1 = 16 * src[1] + 15 * src[3] + 9 * src[5] + 4 * src[7] + mla v17.4h, v4.4h, v0.h[1] // -t2 = - 15 * src[1] + 4 * src[3] + 16 * src[5] + 9 * src[7] + sub v2.4h, v24.4h, v3.4h // t4/2 = 6/2 * src[2] - 16/2 * src[6] + mls v16.4h, v4.4h, v0.h[2] // -t3 = - 9 * src[1] + 16 * src[3] - 4 * src[5] - 15 * src[7] + add v3.4h, v7.4h, v20.4h // t1/2 = 12/2 * src[0] + 12/2 * src[4] + mls v23.4h, v6.4h, v0.h[2] // -t4 = - 4 * src[1] + 9 * src[3] - 15 * src[5] + 16 * src[7] + sub v4.4h, v7.4h, v20.4h // t2/2 = 12/2 * src[0] - 12/2 * src[4] + neg v6.4h, v21.4h // -t1 + add v7.4h, v3.4h, v1.4h // t5/2 = t1/2 + t3/2 + sub v19.4h, v3.4h, v1.4h // t8/2 = t1/2 - t3/2 + add v20.4h, v4.4h, v2.4h // t6/2 = t2/2 + t4/2 + sub v24.4h, v4.4h, v2.4h // t7/2 = t2/2 - t4/2 + add v26.4h, v3.4h, v1.4h // t5/2 = t1/2 + t3/2 + add v27.4h, v4.4h, v2.4h // t6/2 = t2/2 + t4/2 + sub v2.4h, v4.4h, v2.4h // t7/2 = t2/2 - t4/2 + sub v1.4h, v3.4h, v1.4h // t8/2 = t1/2 - t3/2 + neg v3.4h, v17.4h // +t2 + neg v4.4h, v16.4h // +t3 + neg v28.4h, v23.4h // +t4 + ssra v7.4h, v21.4h, #1 // (t5 + t1) >> 1 + ssra v1.4h, v23.4h, #1 // (t8 - t4) >> 1 + ssra v20.4h, v3.4h, #1 // (t6 + t2) >> 1 + ssra v24.4h, v4.4h, #1 // (t7 + t3) >> 1 + ssra v19.4h, v28.4h, #1 // (t8 + t4) >> 1 + ssra v2.4h, v16.4h, #1 // (t7 - t3) >> 1 + ssra v27.4h, v17.4h, #1 // (t6 - t2) >> 1 + ssra v26.4h, v6.4h, #1 // (t5 - t1) >> 1 + trn1 v1.2d, v7.2d, v1.2d + trn1 v2.2d, v20.2d, v2.2d + trn1 v3.2d, v24.2d, v27.2d + trn1 v4.2d, v19.2d, v26.2d + srshr v1.8h, v1.8h, #2 // (t5 + t1 + 4) >> 3, (t8 - t4 + 4) >> 3 + srshr v2.8h, v2.8h, #2 // (t6 + t2 + 4) >> 3, (t7 - t3 + 4) >> 3 + srshr v3.8h, v3.8h, #2 // (t7 + t3 + 4) >> 3, (t6 - t2 + 4) >> 3 + srshr v4.8h, v4.8h, #2 // (t8 + t4 + 4) >> 3, (t5 - t1 + 4) >> 3 + trn2 v6.8h, v1.8h, v2.8h + trn1 v1.8h, v1.8h, v2.8h + trn2 v2.8h, v3.8h, v4.8h + trn1 v3.8h, v3.8h, v4.8h + trn2 v4.4s, v6.4s, v2.4s + trn1 v7.4s, v1.4s, v3.4s + trn2 v1.4s, v1.4s, v3.4s + mul v3.8h, v4.8h, v0.h[5] // 22/2 * src[24] + trn1 v2.4s, v6.4s, v2.4s + mul v4.8h, v4.8h, v0.h[4] // 10/2 * src[24] + mul v6.8h, v7.8h, v0.h[6] // 17 * src[0] + mul v1.8h, v1.8h, v0.h[6] // 17 * src[16] + mls v3.8h, v2.8h, v0.h[4] // t4/2 = - 10/2 * src[8] + 22/2 * src[24] + mla v4.8h, v2.8h, v0.h[5] // t3/2 = 22/2 * src[8] + 10/2 * src[24] + add v0.8h, v6.8h, v1.8h // t1 = 17 * src[0] + 17 * src[16] + sub v1.8h, v6.8h, v1.8h // t2 = 17 * src[0] - 17 * src[16] + neg v2.8h, v3.8h // -t4/2 + neg v6.8h, v4.8h // -t3/2 + ssra v4.8h, v0.8h, #1 // (t1 + t3) >> 1 + ssra v2.8h, v1.8h, #1 // (t2 - t4) >> 1 + ssra v3.8h, v1.8h, #1 // (t2 + t4) >> 1 + ssra v6.8h, v0.8h, #1 // (t1 - t3) >> 1 + srshr v0.8h, v4.8h, #6 // (t1 + t3 + 64) >> 7 + srshr v1.8h, v2.8h, #6 // (t2 - t4 + 64) >> 7 + srshr v2.8h, v3.8h, #6 // (t2 + t4 + 64) >> 7 + srshr v3.8h, v6.8h, #6 // (t1 - t3 + 64) >> 7 + uaddw v0.8h, v0.8h, v5.8b + uaddw v1.8h, v1.8h, v18.8b + uaddw v2.8h, v2.8h, v22.8b + uaddw v3.8h, v3.8h, v25.8b + sqxtun v0.8b, v0.8h + sqxtun v1.8b, v1.8h + sqxtun v2.8b, v2.8h + sqxtun v3.8b, v3.8h + st1 {v0.8b}, [x3], x1 + st1 {v1.8b}, [x3], x1 + st1 {v2.8b}, [x3], x1 + st1 {v3.8b}, [x3] + ret +endfunc + +// VC-1 4x8 inverse transform +// On entry: +// x0 -> array of 8-bit samples, in row-major order +// x1 = row stride for 8-bit sample array +// x2 -> array of 16-bit inverse transform coefficients, in row-major order (row stride is 8 coefficients) +// On exit: +// array at x0 updated by saturated addition of (narrowed) transformed block +function ff_vc1_inv_trans_4x8_neon, export=1 + mov x3, #16 + ldr q0, .Lcoeffs_it8 // includes 4-point coefficients in upper half of vector + mov x4, x0 + ld1 {v1.d}[0], [x2], x3 // 00 01 02 03 + ld1 {v2.d}[0], [x2], x3 // 10 11 12 13 + ld1 {v3.d}[0], [x2], x3 // 20 21 22 23 + ld1 {v4.d}[0], [x2], x3 // 30 31 32 33 + ld1 {v1.d}[1], [x2], x3 // 40 41 42 43 + ld1 {v2.d}[1], [x2], x3 // 50 51 52 53 + ld1 {v3.d}[1], [x2], x3 // 60 61 62 63 + ld1 {v4.d}[1], [x2] // 70 71 72 73 + ld1 {v5.s}[0], [x0], x1 + ld1 {v6.s}[0], [x0], x1 + ld1 {v7.s}[0], [x0], x1 + trn2 v16.8h, v1.8h, v2.8h // 01 11 03 13 41 51 43 53 + trn1 v1.8h, v1.8h, v2.8h // 00 10 02 12 40 50 42 52 + trn2 v2.8h, v3.8h, v4.8h // 21 31 23 33 61 71 63 73 + trn1 v3.8h, v3.8h, v4.8h // 20 30 22 32 60 70 62 72 + ld1 {v4.s}[0], [x0], x1 + trn2 v17.4s, v16.4s, v2.4s // 03 13 23 33 43 53 63 73 + trn1 v18.4s, v1.4s, v3.4s // 00 10 20 30 40 50 60 70 + trn1 v2.4s, v16.4s, v2.4s // 01 11 21 31 41 51 61 71 + mul v16.8h, v17.8h, v0.h[4] // 10/2 * src[3] + ld1 {v5.s}[1], [x0], x1 + mul v17.8h, v17.8h, v0.h[5] // 22/2 * src[3] + ld1 {v6.s}[1], [x0], x1 + trn2 v1.4s, v1.4s, v3.4s // 02 12 22 32 42 52 62 72 + mul v3.8h, v18.8h, v0.h[6] // 17 * src[0] + ld1 {v7.s}[1], [x0], x1 + mul v1.8h, v1.8h, v0.h[6] // 17 * src[2] + ld1 {v4.s}[1], [x0] + mla v16.8h, v2.8h, v0.h[5] // t3/2 = 22/2 * src[1] + 10/2 * src[3] + mls v17.8h, v2.8h, v0.h[4] // t4/2 = - 10/2 * src[1] + 22/2 * src[3] + add v2.8h, v3.8h, v1.8h // t1 = 17 * src[0] + 17 * src[2] + sub v1.8h, v3.8h, v1.8h // t2 = 17 * src[0] - 17 * src[2] + neg v3.8h, v16.8h // -t3/2 + ssra v16.8h, v2.8h, #1 // (t1 + t3) >> 1 + neg v18.8h, v17.8h // -t4/2 + ssra v17.8h, v1.8h, #1 // (t2 + t4) >> 1 + ssra v3.8h, v2.8h, #1 // (t1 - t3) >> 1 + ssra v18.8h, v1.8h, #1 // (t2 - t4) >> 1 + srshr v1.8h, v16.8h, #2 // (t1 + t3 + 64) >> 3 + srshr v2.8h, v17.8h, #2 // (t2 + t4 + 64) >> 3 + srshr v3.8h, v3.8h, #2 // (t1 - t3 + 64) >> 3 + srshr v16.8h, v18.8h, #2 // (t2 - t4 + 64) >> 3 + trn2 v17.8h, v2.8h, v3.8h // 12 13 32 33 52 53 72 73 + trn2 v18.8h, v1.8h, v16.8h // 10 11 30 31 50 51 70 71 + trn1 v1.8h, v1.8h, v16.8h // 00 01 20 21 40 41 60 61 + trn1 v2.8h, v2.8h, v3.8h // 02 03 22 23 42 43 62 63 + trn1 v3.4s, v18.4s, v17.4s // 10 11 12 13 50 51 52 53 + trn2 v16.4s, v18.4s, v17.4s // 30 31 32 33 70 71 72 73 + trn1 v17.4s, v1.4s, v2.4s // 00 01 02 03 40 41 42 43 + mov d18, v3.d[1] // 50 51 52 53 + shl v19.4h, v3.4h, #4 // 16 * src[8] + mov d20, v16.d[1] // 70 71 72 73 + shl v21.4h, v16.4h, #4 // 16 * src[24] + mov d22, v17.d[1] // 40 41 42 43 + shl v23.4h, v3.4h, #2 // 4 * src[8] + shl v24.4h, v18.4h, #4 // 16 * src[40] + shl v25.4h, v20.4h, #4 // 16 * src[56] + shl v26.4h, v18.4h, #2 // 4 * src[40] + trn2 v1.4s, v1.4s, v2.4s // 20 21 22 23 60 61 62 63 + ssra v24.4h, v21.4h, #2 // 4 * src[24] + 16 * src[40] + sub v2.4h, v25.4h, v23.4h // - 4 * src[8] + 16 * src[56] + shl v17.4h, v17.4h, #2 // 8/2 * src[0] + sub v21.4h, v21.4h, v26.4h // 16 * src[24] - 4 * src[40] + shl v22.4h, v22.4h, #2 // 8/2 * src[32] + mov d23, v1.d[1] // 60 61 62 63 + ssra v19.4h, v25.4h, #2 // 16 * src[8] + 4 * src[56] + mul v25.4h, v1.4h, v0.h[0] // 6/2 * src[16] + shl v1.4h, v1.4h, #3 // 16/2 * src[16] + mls v24.4h, v3.4h, v0.h[2] // - 15 * src[8] + 4 * src[24] + 16 * src[40] + ssra v17.4h, v17.4h, #1 // 12/2 * src[0] + mls v21.4h, v3.4h, v0.h[1] // - 9 * src[8] + 16 * src[24] - 4 * src[40] + ssra v22.4h, v22.4h, #1 // 12/2 * src[32] + mla v2.4h, v16.4h, v0.h[1] // - 4 * src[8] + 9 * src[24] + 16 * src[56] + shl v3.4h, v23.4h, #3 // 16/2 * src[48] + mla v19.4h, v16.4h, v0.h[2] // 16 * src[8] + 15 * src[24] + 4 * src[56] + mla v1.4h, v23.4h, v0.h[0] // t3/2 = 16/2 * src[16] + 6/2 * src[48] + mla v24.4h, v20.4h, v0.h[1] // -t2 = - 15 * src[8] + 4 * src[24] + 16 * src[40] + 9 * src[56] + add v16.4h, v17.4h, v22.4h // t1/2 = 12/2 * src[0] + 12/2 * src[32] + sub v3.4h, v25.4h, v3.4h // t4/2 = 6/2 * src[16] - 16/2 * src[48] + sub v17.4h, v17.4h, v22.4h // t2/2 = 12/2 * src[0] - 12/2 * src[32] + mls v21.4h, v20.4h, v0.h[2] // -t3 = - 9 * src[8] + 16 * src[24] - 4 * src[40] - 15 * src[56] + mla v19.4h, v18.4h, v0.h[1] // t1 = 16 * src[8] + 15 * src[24] + 9 * src[40] + 4 * src[56] + add v20.4h, v16.4h, v1.4h // t5/2 = t1/2 + t3/2 + mls v2.4h, v18.4h, v0.h[2] // -t4 = - 4 * src[8] + 9 * src[24] - 15 * src[40] + 16 * src[56] + sub v0.4h, v16.4h, v1.4h // t8/2 = t1/2 - t3/2 + add v18.4h, v17.4h, v3.4h // t6/2 = t2/2 + t4/2 + sub v22.4h, v17.4h, v3.4h // t7/2 = t2/2 - t4/2 + neg v23.4h, v24.4h // +t2 + sub v25.4h, v17.4h, v3.4h // t7/2 = t2/2 - t4/2 + add v3.4h, v17.4h, v3.4h // t6/2 = t2/2 + t4/2 + neg v17.4h, v21.4h // +t3 + sub v26.4h, v16.4h, v1.4h // t8/2 = t1/2 - t3/2 + add v1.4h, v16.4h, v1.4h // t5/2 = t1/2 + t3/2 + neg v16.4h, v19.4h // -t1 + neg v27.4h, v2.4h // +t4 + ssra v20.4h, v19.4h, #1 // (t5 + t1) >> 1 + srsra v0.4h, v2.4h, #1 // (t8 - t4 + 1) >> 1 + ssra v18.4h, v23.4h, #1 // (t6 + t2) >> 1 + srsra v22.4h, v21.4h, #1 // (t7 - t3 + 1) >> 1 + ssra v25.4h, v17.4h, #1 // (t7 + t3) >> 1 + srsra v3.4h, v24.4h, #1 // (t6 - t2 + 1) >> 1 + ssra v26.4h, v27.4h, #1 // (t8 + t4) >> 1 + srsra v1.4h, v16.4h, #1 // (t5 - t1 + 1) >> 1 + trn1 v0.2d, v20.2d, v0.2d + trn1 v2.2d, v18.2d, v22.2d + trn1 v3.2d, v25.2d, v3.2d + trn1 v1.2d, v26.2d, v1.2d + srshr v0.8h, v0.8h, #6 // (t5 + t1 + 64) >> 7, (t8 - t4 + 65) >> 7 + srshr v2.8h, v2.8h, #6 // (t6 + t2 + 64) >> 7, (t7 - t3 + 65) >> 7 + srshr v3.8h, v3.8h, #6 // (t7 + t3 + 64) >> 7, (t6 - t2 + 65) >> 7 + srshr v1.8h, v1.8h, #6 // (t8 + t4 + 64) >> 7, (t5 - t1 + 65) >> 7 + uaddw v0.8h, v0.8h, v5.8b + uaddw v2.8h, v2.8h, v6.8b + uaddw v3.8h, v3.8h, v7.8b + uaddw v1.8h, v1.8h, v4.8b + sqxtun v0.8b, v0.8h + sqxtun v2.8b, v2.8h + sqxtun v3.8b, v3.8h + sqxtun v1.8b, v1.8h + st1 {v0.s}[0], [x4], x1 + st1 {v2.s}[0], [x4], x1 + st1 {v3.s}[0], [x4], x1 + st1 {v1.s}[0], [x4], x1 + st1 {v0.s}[1], [x4], x1 + st1 {v2.s}[1], [x4], x1 + st1 {v3.s}[1], [x4], x1 + st1 {v1.s}[1], [x4] + ret +endfunc + +// VC-1 4x4 inverse transform +// On entry: +// x0 -> array of 8-bit samples, in row-major order +// x1 = row stride for 8-bit sample array +// x2 -> array of 16-bit inverse transform coefficients, in row-major order (row stride is 8 coefficients) +// On exit: +// array at x0 updated by saturated addition of (narrowed) transformed block +function ff_vc1_inv_trans_4x4_neon, export=1 + mov x3, #16 + ldr d0, .Lcoeffs_it4 + mov x4, x0 + ld1 {v1.d}[0], [x2], x3 // 00 01 02 03 + ld1 {v2.d}[0], [x2], x3 // 10 11 12 13 + ld1 {v3.d}[0], [x2], x3 // 20 21 22 23 + ld1 {v4.d}[0], [x2] // 30 31 32 33 + ld1 {v5.s}[0], [x0], x1 + ld1 {v5.s}[1], [x0], x1 + ld1 {v6.s}[0], [x0], x1 + trn2 v7.4h, v1.4h, v2.4h // 01 11 03 13 + trn1 v1.4h, v1.4h, v2.4h // 00 10 02 12 + ld1 {v6.s}[1], [x0] + trn2 v2.4h, v3.4h, v4.4h // 21 31 23 33 + trn1 v3.4h, v3.4h, v4.4h // 20 30 22 32 + trn2 v4.2s, v7.2s, v2.2s // 03 13 23 33 + trn1 v16.2s, v1.2s, v3.2s // 00 10 20 30 + trn1 v2.2s, v7.2s, v2.2s // 01 11 21 31 + trn2 v1.2s, v1.2s, v3.2s // 02 12 22 32 + mul v3.4h, v4.4h, v0.h[0] // 10/2 * src[3] + mul v4.4h, v4.4h, v0.h[1] // 22/2 * src[3] + mul v7.4h, v16.4h, v0.h[2] // 17 * src[0] + mul v1.4h, v1.4h, v0.h[2] // 17 * src[2] + mla v3.4h, v2.4h, v0.h[1] // t3/2 = 22/2 * src[1] + 10/2 * src[3] + mls v4.4h, v2.4h, v0.h[0] // t4/2 = - 10/2 * src[1] + 22/2 * src[3] + add v2.4h, v7.4h, v1.4h // t1 = 17 * src[0] + 17 * src[2] + sub v1.4h, v7.4h, v1.4h // t2 = 17 * src[0] - 17 * src[2] + neg v7.4h, v3.4h // -t3/2 + neg v16.4h, v4.4h // -t4/2 + ssra v3.4h, v2.4h, #1 // (t1 + t3) >> 1 + ssra v4.4h, v1.4h, #1 // (t2 + t4) >> 1 + ssra v16.4h, v1.4h, #1 // (t2 - t4) >> 1 + ssra v7.4h, v2.4h, #1 // (t1 - t3) >> 1 + srshr v1.4h, v3.4h, #2 // (t1 + t3 + 64) >> 3 + srshr v2.4h, v4.4h, #2 // (t2 + t4 + 64) >> 3 + srshr v3.4h, v16.4h, #2 // (t2 - t4 + 64) >> 3 + srshr v4.4h, v7.4h, #2 // (t1 - t3 + 64) >> 3 + trn2 v7.4h, v1.4h, v3.4h // 10 11 30 31 + trn1 v1.4h, v1.4h, v3.4h // 00 01 20 21 + trn2 v3.4h, v2.4h, v4.4h // 12 13 32 33 + trn1 v2.4h, v2.4h, v4.4h // 02 03 22 23 + trn2 v4.2s, v7.2s, v3.2s // 30 31 32 33 + trn1 v16.2s, v1.2s, v2.2s // 00 01 02 03 + trn1 v3.2s, v7.2s, v3.2s // 10 11 12 13 + trn2 v1.2s, v1.2s, v2.2s // 20 21 22 23 + mul v2.4h, v4.4h, v0.h[1] // 22/2 * src[24] + mul v4.4h, v4.4h, v0.h[0] // 10/2 * src[24] + mul v7.4h, v16.4h, v0.h[2] // 17 * src[0] + mul v1.4h, v1.4h, v0.h[2] // 17 * src[16] + mls v2.4h, v3.4h, v0.h[0] // t4/2 = - 10/2 * src[8] + 22/2 * src[24] + mla v4.4h, v3.4h, v0.h[1] // t3/2 = 22/2 * src[8] + 10/2 * src[24] + add v0.4h, v7.4h, v1.4h // t1 = 17 * src[0] + 17 * src[16] + sub v1.4h, v7.4h, v1.4h // t2 = 17 * src[0] - 17 * src[16] + neg v3.4h, v2.4h // -t4/2 + neg v7.4h, v4.4h // -t3/2 + ssra v4.4h, v0.4h, #1 // (t1 + t3) >> 1 + ssra v3.4h, v1.4h, #1 // (t2 - t4) >> 1 + ssra v2.4h, v1.4h, #1 // (t2 + t4) >> 1 + ssra v7.4h, v0.4h, #1 // (t1 - t3) >> 1 + trn1 v0.2d, v4.2d, v3.2d + trn1 v1.2d, v2.2d, v7.2d + srshr v0.8h, v0.8h, #6 // (t1 + t3 + 64) >> 7, (t2 - t4 + 64) >> 7 + srshr v1.8h, v1.8h, #6 // (t2 + t4 + 64) >> 7, (t1 - t3 + 64) >> 7 + uaddw v0.8h, v0.8h, v5.8b + uaddw v1.8h, v1.8h, v6.8b + sqxtun v0.8b, v0.8h + sqxtun v1.8b, v1.8h + st1 {v0.s}[0], [x4], x1 + st1 {v0.s}[1], [x4], x1 + st1 {v1.s}[0], [x4], x1 + st1 {v1.s}[1], [x4] + ret +endfunc + +// VC-1 8x8 inverse transform, DC case +// On entry: +// x0 -> array of 8-bit samples, in row-major order +// x1 = row stride for 8-bit sample array +// x2 -> 16-bit inverse transform DC coefficient +// On exit: +// array at x0 updated by saturated addition of (narrowed) transformed block +function ff_vc1_inv_trans_8x8_dc_neon, export=1 + ldrsh w2, [x2] + mov x3, x0 + ld1 {v0.8b}, [x0], x1 + ld1 {v1.8b}, [x0], x1 + ld1 {v2.8b}, [x0], x1 + add w2, w2, w2, lsl #1 + ld1 {v3.8b}, [x0], x1 + ld1 {v4.8b}, [x0], x1 + add w2, w2, #1 + ld1 {v5.8b}, [x0], x1 + asr w2, w2, #1 + ld1 {v6.8b}, [x0], x1 + add w2, w2, w2, lsl #1 + ld1 {v7.8b}, [x0] + add w0, w2, #16 + asr w0, w0, #5 + dup v16.8h, w0 + uaddw v0.8h, v16.8h, v0.8b + uaddw v1.8h, v16.8h, v1.8b + uaddw v2.8h, v16.8h, v2.8b + uaddw v3.8h, v16.8h, v3.8b + uaddw v4.8h, v16.8h, v4.8b + uaddw v5.8h, v16.8h, v5.8b + sqxtun v0.8b, v0.8h + uaddw v6.8h, v16.8h, v6.8b + sqxtun v1.8b, v1.8h + uaddw v7.8h, v16.8h, v7.8b + sqxtun v2.8b, v2.8h + sqxtun v3.8b, v3.8h + sqxtun v4.8b, v4.8h + st1 {v0.8b}, [x3], x1 + sqxtun v0.8b, v5.8h + st1 {v1.8b}, [x3], x1 + sqxtun v1.8b, v6.8h + st1 {v2.8b}, [x3], x1 + sqxtun v2.8b, v7.8h + st1 {v3.8b}, [x3], x1 + st1 {v4.8b}, [x3], x1 + st1 {v0.8b}, [x3], x1 + st1 {v1.8b}, [x3], x1 + st1 {v2.8b}, [x3] + ret +endfunc + +// VC-1 8x4 inverse transform, DC case +// On entry: +// x0 -> array of 8-bit samples, in row-major order +// x1 = row stride for 8-bit sample array +// x2 -> 16-bit inverse transform DC coefficient +// On exit: +// array at x0 updated by saturated addition of (narrowed) transformed block +function ff_vc1_inv_trans_8x4_dc_neon, export=1 + ldrsh w2, [x2] + mov x3, x0 + ld1 {v0.8b}, [x0], x1 + ld1 {v1.8b}, [x0], x1 + ld1 {v2.8b}, [x0], x1 + add w2, w2, w2, lsl #1 + ld1 {v3.8b}, [x0] + add w0, w2, #1 + asr w0, w0, #1 + add w0, w0, w0, lsl #4 + add w0, w0, #64 + asr w0, w0, #7 + dup v4.8h, w0 + uaddw v0.8h, v4.8h, v0.8b + uaddw v1.8h, v4.8h, v1.8b + uaddw v2.8h, v4.8h, v2.8b + uaddw v3.8h, v4.8h, v3.8b + sqxtun v0.8b, v0.8h + sqxtun v1.8b, v1.8h + sqxtun v2.8b, v2.8h + sqxtun v3.8b, v3.8h + st1 {v0.8b}, [x3], x1 + st1 {v1.8b}, [x3], x1 + st1 {v2.8b}, [x3], x1 + st1 {v3.8b}, [x3] + ret +endfunc + +// VC-1 4x8 inverse transform, DC case +// On entry: +// x0 -> array of 8-bit samples, in row-major order +// x1 = row stride for 8-bit sample array +// x2 -> 16-bit inverse transform DC coefficient +// On exit: +// array at x0 updated by saturated addition of (narrowed) transformed block +function ff_vc1_inv_trans_4x8_dc_neon, export=1 + ldrsh w2, [x2] + mov x3, x0 + ld1 {v0.s}[0], [x0], x1 + ld1 {v1.s}[0], [x0], x1 + ld1 {v2.s}[0], [x0], x1 + add w2, w2, w2, lsl #4 + ld1 {v3.s}[0], [x0], x1 + add w2, w2, #4 + asr w2, w2, #3 + add w2, w2, w2, lsl #1 + ld1 {v0.s}[1], [x0], x1 + add w2, w2, #16 + asr w2, w2, #5 + dup v4.8h, w2 + ld1 {v1.s}[1], [x0], x1 + ld1 {v2.s}[1], [x0], x1 + ld1 {v3.s}[1], [x0] + uaddw v0.8h, v4.8h, v0.8b + uaddw v1.8h, v4.8h, v1.8b + uaddw v2.8h, v4.8h, v2.8b + uaddw v3.8h, v4.8h, v3.8b + sqxtun v0.8b, v0.8h + sqxtun v1.8b, v1.8h + sqxtun v2.8b, v2.8h + sqxtun v3.8b, v3.8h + st1 {v0.s}[0], [x3], x1 + st1 {v1.s}[0], [x3], x1 + st1 {v2.s}[0], [x3], x1 + st1 {v3.s}[0], [x3], x1 + st1 {v0.s}[1], [x3], x1 + st1 {v1.s}[1], [x3], x1 + st1 {v2.s}[1], [x3], x1 + st1 {v3.s}[1], [x3] + ret +endfunc + +// VC-1 4x4 inverse transform, DC case +// On entry: +// x0 -> array of 8-bit samples, in row-major order +// x1 = row stride for 8-bit sample array +// x2 -> 16-bit inverse transform DC coefficient +// On exit: +// array at x0 updated by saturated addition of (narrowed) transformed block +function ff_vc1_inv_trans_4x4_dc_neon, export=1 + ldrsh w2, [x2] + mov x3, x0 + ld1 {v0.s}[0], [x0], x1 + ld1 {v1.s}[0], [x0], x1 + ld1 {v0.s}[1], [x0], x1 + add w2, w2, w2, lsl #4 + ld1 {v1.s}[1], [x0] + add w0, w2, #4 + asr w0, w0, #3 + add w0, w0, w0, lsl #4 + add w0, w0, #64 + asr w0, w0, #7 + dup v2.8h, w0 + uaddw v0.8h, v2.8h, v0.8b + uaddw v1.8h, v2.8h, v1.8b + sqxtun v0.8b, v0.8h + sqxtun v1.8b, v1.8h + st1 {v0.s}[0], [x3], x1 + st1 {v1.s}[0], [x3], x1 + st1 {v0.s}[1], [x3], x1 + st1 {v1.s}[1], [x3] + ret +endfunc + +.align 5 +.Lcoeffs_it8: +.quad 0x000F00090003 +.Lcoeffs_it4: +.quad 0x0011000B0005 +.Lcoeffs: +.quad 0x00050002 + +// VC-1 in-loop deblocking filter for 4 pixel pairs at boundary of vertically-neighbouring blocks +// On entry: +// x0 -> top-left pel of lower block +// x1 = row stride, bytes +// w2 = PQUANT bitstream parameter +function ff_vc1_v_loop_filter4_neon, export=1 + sub x3, x0, w1, sxtw #2 + ldr d0, .Lcoeffs + ld1 {v1.s}[0], [x0], x1 // P5 + ld1 {v2.s}[0], [x3], x1 // P1 + ld1 {v3.s}[0], [x3], x1 // P2 + ld1 {v4.s}[0], [x0], x1 // P6 + ld1 {v5.s}[0], [x3], x1 // P3 + ld1 {v6.s}[0], [x0], x1 // P7 + ld1 {v7.s}[0], [x3] // P4 + ld1 {v16.s}[0], [x0] // P8 + ushll v17.8h, v1.8b, #1 // 2*P5 + dup v18.8h, w2 // pq + ushll v2.8h, v2.8b, #1 // 2*P1 + uxtl v3.8h, v3.8b // P2 + uxtl v4.8h, v4.8b // P6 + uxtl v19.8h, v5.8b // P3 + mls v2.4h, v3.4h, v0.h[1] // 2*P1-5*P2 + uxtl v3.8h, v6.8b // P7 + mls v17.4h, v4.4h, v0.h[1] // 2*P5-5*P6 + ushll v5.8h, v5.8b, #1 // 2*P3 + uxtl v6.8h, v7.8b // P4 + mla v17.4h, v3.4h, v0.h[1] // 2*P5-5*P6+5*P7 + uxtl v3.8h, v16.8b // P8 + mla v2.4h, v19.4h, v0.h[1] // 2*P1-5*P2+5*P3 + uxtl v1.8h, v1.8b // P5 + mls v5.4h, v6.4h, v0.h[1] // 2*P3-5*P4 + mls v17.4h, v3.4h, v0.h[0] // 2*P5-5*P6+5*P7-2*P8 + sub v3.4h, v6.4h, v1.4h // P4-P5 + mls v2.4h, v6.4h, v0.h[0] // 2*P1-5*P2+5*P3-2*P4 + mla v5.4h, v1.4h, v0.h[1] // 2*P3-5*P4+5*P5 + mls v5.4h, v4.4h, v0.h[0] // 2*P3-5*P4+5*P5-2*P6 + abs v4.4h, v3.4h + srshr v7.4h, v17.4h, #3 + srshr v2.4h, v2.4h, #3 + sshr v4.4h, v4.4h, #1 // clip + srshr v5.4h, v5.4h, #3 + abs v7.4h, v7.4h // a2 + sshr v3.4h, v3.4h, #8 // clip_sign + abs v2.4h, v2.4h // a1 + cmeq v16.4h, v4.4h, #0 // test clip == 0 + abs v17.4h, v5.4h // a0 + sshr v5.4h, v5.4h, #8 // a0_sign + cmhs v19.4h, v2.4h, v7.4h // test a1 >= a2 + cmhs v18.4h, v17.4h, v18.4h // test a0 >= pq + sub v3.4h, v3.4h, v5.4h // clip_sign - a0_sign + bsl v19.8b, v7.8b, v2.8b // a3 + orr v2.8b, v16.8b, v18.8b // test clip == 0 || a0 >= pq + uqsub v5.4h, v17.4h, v19.4h // a0 >= a3 ? a0-a3 : 0 (a0 > a3 in all cases where filtering is enabled, so makes more sense to subtract this way round than the opposite and then taking the abs) + cmhs v7.4h, v19.4h, v17.4h // test a3 >= a0 + mul v0.4h, v5.4h, v0.h[1] // a0 >= a3 ? 5*(a0-a3) : 0 + orr v5.8b, v2.8b, v7.8b // test clip == 0 || a0 >= pq || a3 >= a0 + mov w0, v5.s[1] // move to gp reg + ushr v0.4h, v0.4h, #3 // a0 >= a3 ? (5*(a0-a3))>>3 : 0 + cmhs v5.4h, v0.4h, v4.4h + tbnz w0, #0, 1f // none of the 4 pixel pairs should be updated if this one is not filtered + bsl v5.8b, v4.8b, v0.8b // FFMIN(d, clip) + bic v0.8b, v5.8b, v2.8b // set each d to zero if it should not be filtered because clip == 0 || a0 >= pq (a3 > a0 case already zeroed by saturating sub) + mls v6.4h, v0.4h, v3.4h // invert d depending on clip_sign & a0_sign, or zero it if they match, and accumulate into P4 + mla v1.4h, v0.4h, v3.4h // invert d depending on clip_sign & a0_sign, or zero it if they match, and accumulate into P5 + sqxtun v0.8b, v6.8h + sqxtun v1.8b, v1.8h + st1 {v0.s}[0], [x3], x1 + st1 {v1.s}[0], [x3] +1: ret +endfunc + +// VC-1 in-loop deblocking filter for 4 pixel pairs at boundary of horizontally-neighbouring blocks +// On entry: +// x0 -> top-left pel of right block +// x1 = row stride, bytes +// w2 = PQUANT bitstream parameter +function ff_vc1_h_loop_filter4_neon, export=1 + sub x3, x0, #4 // where to start reading + ldr d0, .Lcoeffs + ld1 {v1.8b}, [x3], x1 + sub x0, x0, #1 // where to start writing + ld1 {v2.8b}, [x3], x1 + ld1 {v3.8b}, [x3], x1 + ld1 {v4.8b}, [x3] + dup v5.8h, w2 // pq + trn1 v6.8b, v1.8b, v2.8b + trn2 v1.8b, v1.8b, v2.8b + trn1 v2.8b, v3.8b, v4.8b + trn2 v3.8b, v3.8b, v4.8b + trn1 v4.4h, v6.4h, v2.4h // P1, P5 + trn1 v7.4h, v1.4h, v3.4h // P2, P6 + trn2 v2.4h, v6.4h, v2.4h // P3, P7 + trn2 v1.4h, v1.4h, v3.4h // P4, P8 + ushll v3.8h, v4.8b, #1 // 2*P1, 2*P5 + uxtl v6.8h, v7.8b // P2, P6 + uxtl v7.8h, v2.8b // P3, P7 + uxtl v1.8h, v1.8b // P4, P8 + mls v3.8h, v6.8h, v0.h[1] // 2*P1-5*P2, 2*P5-5*P6 + ushll v2.8h, v2.8b, #1 // 2*P3, 2*P7 + uxtl v4.8h, v4.8b // P1, P5 + mla v3.8h, v7.8h, v0.h[1] // 2*P1-5*P2+5*P3, 2*P5-5*P6+5*P7 + mov d6, v6.d[1] // P6 + mls v3.8h, v1.8h, v0.h[0] // 2*P1-5*P2+5*P3-2*P4, 2*P5-5*P6+5*P7-2*P8 + mov d4, v4.d[1] // P5 + mls v2.4h, v1.4h, v0.h[1] // 2*P3-5*P4 + mla v2.4h, v4.4h, v0.h[1] // 2*P3-5*P4+5*P5 + sub v7.4h, v1.4h, v4.4h // P4-P5 + mls v2.4h, v6.4h, v0.h[0] // 2*P3-5*P4+5*P5-2*P6 + srshr v3.8h, v3.8h, #3 + abs v6.4h, v7.4h + sshr v7.4h, v7.4h, #8 // clip_sign + srshr v2.4h, v2.4h, #3 + abs v3.8h, v3.8h // a1, a2 + sshr v6.4h, v6.4h, #1 // clip + mov d16, v3.d[1] // a2 + abs v17.4h, v2.4h // a0 + cmeq v18.4h, v6.4h, #0 // test clip == 0 + sshr v2.4h, v2.4h, #8 // a0_sign + cmhs v19.4h, v3.4h, v16.4h // test a1 >= a2 + cmhs v5.4h, v17.4h, v5.4h // test a0 >= pq + sub v2.4h, v7.4h, v2.4h // clip_sign - a0_sign + bsl v19.8b, v16.8b, v3.8b // a3 + orr v3.8b, v18.8b, v5.8b // test clip == 0 || a0 >= pq + uqsub v5.4h, v17.4h, v19.4h // a0 >= a3 ? a0-a3 : 0 (a0 > a3 in all cases where filtering is enabled, so makes more sense to subtract this way round than the opposite and then taking the abs) + cmhs v7.4h, v19.4h, v17.4h // test a3 >= a0 + mul v0.4h, v5.4h, v0.h[1] // a0 >= a3 ? 5*(a0-a3) : 0 + orr v5.8b, v3.8b, v7.8b // test clip == 0 || a0 >= pq || a3 >= a0 + mov w2, v5.s[1] // move to gp reg + ushr v0.4h, v0.4h, #3 // a0 >= a3 ? (5*(a0-a3))>>3 : 0 + cmhs v5.4h, v0.4h, v6.4h + tbnz w2, #0, 1f // none of the 4 pixel pairs should be updated if this one is not filtered + bsl v5.8b, v6.8b, v0.8b // FFMIN(d, clip) + bic v0.8b, v5.8b, v3.8b // set each d to zero if it should not be filtered because clip == 0 || a0 >= pq (a3 > a0 case already zeroed by saturating sub) + mla v4.4h, v0.4h, v2.4h // invert d depending on clip_sign & a0_sign, or zero it if they match, and accumulate into P5 + mls v1.4h, v0.4h, v2.4h // invert d depending on clip_sign & a0_sign, or zero it if they match, and accumulate into P4 + sqxtun v3.8b, v4.8h + sqxtun v2.8b, v1.8h + st2 {v2.b, v3.b}[0], [x0], x1 + st2 {v2.b, v3.b}[1], [x0], x1 + st2 {v2.b, v3.b}[2], [x0], x1 + st2 {v2.b, v3.b}[3], [x0] +1: ret +endfunc + +// VC-1 in-loop deblocking filter for 8 pixel pairs at boundary of vertically-neighbouring blocks +// On entry: +// x0 -> top-left pel of lower block +// x1 = row stride, bytes +// w2 = PQUANT bitstream parameter +function ff_vc1_v_loop_filter8_neon, export=1 + sub x3, x0, w1, sxtw #2 + ldr d0, .Lcoeffs + ld1 {v1.8b}, [x0], x1 // P5 + movi v2.2d, #0x0000ffff00000000 + ld1 {v3.8b}, [x3], x1 // P1 + ld1 {v4.8b}, [x3], x1 // P2 + ld1 {v5.8b}, [x0], x1 // P6 + ld1 {v6.8b}, [x3], x1 // P3 + ld1 {v7.8b}, [x0], x1 // P7 + ushll v16.8h, v1.8b, #1 // 2*P5 + ushll v3.8h, v3.8b, #1 // 2*P1 + ld1 {v17.8b}, [x3] // P4 + uxtl v4.8h, v4.8b // P2 + ld1 {v18.8b}, [x0] // P8 + uxtl v5.8h, v5.8b // P6 + dup v19.8h, w2 // pq + uxtl v20.8h, v6.8b // P3 + mls v3.8h, v4.8h, v0.h[1] // 2*P1-5*P2 + uxtl v4.8h, v7.8b // P7 + ushll v6.8h, v6.8b, #1 // 2*P3 + mls v16.8h, v5.8h, v0.h[1] // 2*P5-5*P6 + uxtl v7.8h, v17.8b // P4 + uxtl v17.8h, v18.8b // P8 + mla v16.8h, v4.8h, v0.h[1] // 2*P5-5*P6+5*P7 + uxtl v1.8h, v1.8b // P5 + mla v3.8h, v20.8h, v0.h[1] // 2*P1-5*P2+5*P3 + sub v4.8h, v7.8h, v1.8h // P4-P5 + mls v6.8h, v7.8h, v0.h[1] // 2*P3-5*P4 + mls v16.8h, v17.8h, v0.h[0] // 2*P5-5*P6+5*P7-2*P8 + abs v17.8h, v4.8h + sshr v4.8h, v4.8h, #8 // clip_sign + mls v3.8h, v7.8h, v0.h[0] // 2*P1-5*P2+5*P3-2*P4 + sshr v17.8h, v17.8h, #1 // clip + mla v6.8h, v1.8h, v0.h[1] // 2*P3-5*P4+5*P5 + srshr v16.8h, v16.8h, #3 + mls v6.8h, v5.8h, v0.h[0] // 2*P3-5*P4+5*P5-2*P6 + cmeq v5.8h, v17.8h, #0 // test clip == 0 + srshr v3.8h, v3.8h, #3 + abs v16.8h, v16.8h // a2 + abs v3.8h, v3.8h // a1 + srshr v6.8h, v6.8h, #3 + cmhs v18.8h, v3.8h, v16.8h // test a1 >= a2 + abs v20.8h, v6.8h // a0 + sshr v6.8h, v6.8h, #8 // a0_sign + bsl v18.16b, v16.16b, v3.16b // a3 + cmhs v3.8h, v20.8h, v19.8h // test a0 >= pq + sub v4.8h, v4.8h, v6.8h // clip_sign - a0_sign + uqsub v6.8h, v20.8h, v18.8h // a0 >= a3 ? a0-a3 : 0 (a0 > a3 in all cases where filtering is enabled, so makes more sense to subtract this way round than the opposite and then taking the abs) + cmhs v16.8h, v18.8h, v20.8h // test a3 >= a0 + orr v3.16b, v5.16b, v3.16b // test clip == 0 || a0 >= pq + mul v0.8h, v6.8h, v0.h[1] // a0 >= a3 ? 5*(a0-a3) : 0 + orr v5.16b, v3.16b, v16.16b // test clip == 0 || a0 >= pq || a3 >= a0 + cmtst v2.2d, v5.2d, v2.2d // if 2nd of each group of is not filtered, then none of the others in the group should be either + mov w0, v5.s[1] // move to gp reg + ushr v0.8h, v0.8h, #3 // a0 >= a3 ? (5*(a0-a3))>>3 : 0 + mov w2, v5.s[3] + orr v2.16b, v3.16b, v2.16b + cmhs v3.8h, v0.8h, v17.8h + and w0, w0, w2 + bsl v3.16b, v17.16b, v0.16b // FFMIN(d, clip) + tbnz w0, #0, 1f // none of the 8 pixel pairs should be updated in this case + bic v0.16b, v3.16b, v2.16b // set each d to zero if it should not be filtered + mls v7.8h, v0.8h, v4.8h // invert d depending on clip_sign & a0_sign, or zero it if they match, and accumulate into P4 + mla v1.8h, v0.8h, v4.8h // invert d depending on clip_sign & a0_sign, or zero it if they match, and accumulate into P5 + sqxtun v0.8b, v7.8h + sqxtun v1.8b, v1.8h + st1 {v0.8b}, [x3], x1 + st1 {v1.8b}, [x3] +1: ret +endfunc + +// VC-1 in-loop deblocking filter for 8 pixel pairs at boundary of horizontally-neighbouring blocks +// On entry: +// x0 -> top-left pel of right block +// x1 = row stride, bytes +// w2 = PQUANT bitstream parameter +function ff_vc1_h_loop_filter8_neon, export=1 + sub x3, x0, #4 // where to start reading + ldr d0, .Lcoeffs + ld1 {v1.8b}, [x3], x1 // P1[0], P2[0]... + sub x0, x0, #1 // where to start writing + ld1 {v2.8b}, [x3], x1 + add x4, x0, x1, lsl #2 + ld1 {v3.8b}, [x3], x1 + ld1 {v4.8b}, [x3], x1 + ld1 {v5.8b}, [x3], x1 + ld1 {v6.8b}, [x3], x1 + ld1 {v7.8b}, [x3], x1 + trn1 v16.8b, v1.8b, v2.8b // P1[0], P1[1], P3[0]... + ld1 {v17.8b}, [x3] + trn2 v1.8b, v1.8b, v2.8b // P2[0], P2[1], P4[0]... + trn1 v2.8b, v3.8b, v4.8b // P1[2], P1[3], P3[2]... + trn2 v3.8b, v3.8b, v4.8b // P2[2], P2[3], P4[2]... + dup v4.8h, w2 // pq + trn1 v18.8b, v5.8b, v6.8b // P1[4], P1[5], P3[4]... + trn2 v5.8b, v5.8b, v6.8b // P2[4], P2[5], P4[4]... + trn1 v6.4h, v16.4h, v2.4h // P1[0], P1[1], P1[2], P1[3], P5[0]... + trn1 v19.4h, v1.4h, v3.4h // P2[0], P2[1], P2[2], P2[3], P6[0]... + trn1 v20.8b, v7.8b, v17.8b // P1[6], P1[7], P3[6]... + trn2 v7.8b, v7.8b, v17.8b // P2[6], P2[7], P4[6]... + trn2 v2.4h, v16.4h, v2.4h // P3[0], P3[1], P3[2], P3[3], P7[0]... + trn2 v1.4h, v1.4h, v3.4h // P4[0], P4[1], P4[2], P4[3], P8[0]... + trn1 v3.4h, v18.4h, v20.4h // P1[4], P1[5], P1[6], P1[7], P5[4]... + trn1 v16.4h, v5.4h, v7.4h // P2[4], P2[5], P2[6], P2[7], P6[4]... + trn2 v17.4h, v18.4h, v20.4h // P3[4], P3[5], P3[6], P3[7], P7[4]... + trn2 v5.4h, v5.4h, v7.4h // P4[4], P4[5], P4[6], P4[7], P8[4]... + trn1 v7.2s, v6.2s, v3.2s // P1 + trn1 v18.2s, v19.2s, v16.2s // P2 + trn2 v3.2s, v6.2s, v3.2s // P5 + trn2 v6.2s, v19.2s, v16.2s // P6 + trn1 v16.2s, v2.2s, v17.2s // P3 + trn2 v2.2s, v2.2s, v17.2s // P7 + ushll v7.8h, v7.8b, #1 // 2*P1 + trn1 v17.2s, v1.2s, v5.2s // P4 + ushll v19.8h, v3.8b, #1 // 2*P5 + trn2 v1.2s, v1.2s, v5.2s // P8 + uxtl v5.8h, v18.8b // P2 + uxtl v6.8h, v6.8b // P6 + uxtl v18.8h, v16.8b // P3 + mls v7.8h, v5.8h, v0.h[1] // 2*P1-5*P2 + uxtl v2.8h, v2.8b // P7 + ushll v5.8h, v16.8b, #1 // 2*P3 + mls v19.8h, v6.8h, v0.h[1] // 2*P5-5*P6 + uxtl v16.8h, v17.8b // P4 + uxtl v1.8h, v1.8b // P8 + mla v19.8h, v2.8h, v0.h[1] // 2*P5-5*P6+5*P7 + uxtl v2.8h, v3.8b // P5 + mla v7.8h, v18.8h, v0.h[1] // 2*P1-5*P2+5*P3 + sub v3.8h, v16.8h, v2.8h // P4-P5 + mls v5.8h, v16.8h, v0.h[1] // 2*P3-5*P4 + mls v19.8h, v1.8h, v0.h[0] // 2*P5-5*P6+5*P7-2*P8 + abs v1.8h, v3.8h + sshr v3.8h, v3.8h, #8 // clip_sign + mls v7.8h, v16.8h, v0.h[0] // 2*P1-5*P2+5*P3-2*P4 + sshr v1.8h, v1.8h, #1 // clip + mla v5.8h, v2.8h, v0.h[1] // 2*P3-5*P4+5*P5 + srshr v17.8h, v19.8h, #3 + mls v5.8h, v6.8h, v0.h[0] // 2*P3-5*P4+5*P5-2*P6 + cmeq v6.8h, v1.8h, #0 // test clip == 0 + srshr v7.8h, v7.8h, #3 + abs v17.8h, v17.8h // a2 + abs v7.8h, v7.8h // a1 + srshr v5.8h, v5.8h, #3 + cmhs v18.8h, v7.8h, v17.8h // test a1 >= a2 + abs v19.8h, v5.8h // a0 + sshr v5.8h, v5.8h, #8 // a0_sign + bsl v18.16b, v17.16b, v7.16b // a3 + cmhs v4.8h, v19.8h, v4.8h // test a0 >= pq + sub v3.8h, v3.8h, v5.8h // clip_sign - a0_sign + uqsub v5.8h, v19.8h, v18.8h // a0 >= a3 ? a0-a3 : 0 (a0 > a3 in all cases where filtering is enabled, so makes more sense to subtract this way round than the opposite and then taking the abs) + cmhs v7.8h, v18.8h, v19.8h // test a3 >= a0 + orr v4.16b, v6.16b, v4.16b // test clip == 0 || a0 >= pq + mul v0.8h, v5.8h, v0.h[1] // a0 >= a3 ? 5*(a0-a3) : 0 + orr v5.16b, v4.16b, v7.16b // test clip == 0 || a0 >= pq || a3 >= a0 + mov w2, v5.s[1] // move to gp reg + ushr v0.8h, v0.8h, #3 // a0 >= a3 ? (5*(a0-a3))>>3 : 0 + mov w3, v5.s[3] + cmhs v5.8h, v0.8h, v1.8h + and w5, w2, w3 + bsl v5.16b, v1.16b, v0.16b // FFMIN(d, clip) + tbnz w5, #0, 2f // none of the 8 pixel pairs should be updated in this case + bic v0.16b, v5.16b, v4.16b // set each d to zero if it should not be filtered because clip == 0 || a0 >= pq (a3 > a0 case already zeroed by saturating sub) + mla v2.8h, v0.8h, v3.8h // invert d depending on clip_sign & a0_sign, or zero it if they match, and accumulate into P5 + mls v16.8h, v0.8h, v3.8h // invert d depending on clip_sign & a0_sign, or zero it if they match, and accumulate into P4 + sqxtun v1.8b, v2.8h + sqxtun v0.8b, v16.8h + tbnz w2, #0, 1f // none of the first 4 pixel pairs should be updated if so + st2 {v0.b, v1.b}[0], [x0], x1 + st2 {v0.b, v1.b}[1], [x0], x1 + st2 {v0.b, v1.b}[2], [x0], x1 + st2 {v0.b, v1.b}[3], [x0] +1: tbnz w3, #0, 2f // none of the second 4 pixel pairs should be updated if so + st2 {v0.b, v1.b}[4], [x4], x1 + st2 {v0.b, v1.b}[5], [x4], x1 + st2 {v0.b, v1.b}[6], [x4], x1 + st2 {v0.b, v1.b}[7], [x4] +2: ret +endfunc + +// VC-1 in-loop deblocking filter for 16 pixel pairs at boundary of vertically-neighbouring blocks +// On entry: +// x0 -> top-left pel of lower block +// x1 = row stride, bytes +// w2 = PQUANT bitstream parameter +function ff_vc1_v_loop_filter16_neon, export=1 + sub x3, x0, w1, sxtw #2 + ldr d0, .Lcoeffs + ld1 {v1.16b}, [x0], x1 // P5 + movi v2.2d, #0x0000ffff00000000 + ld1 {v3.16b}, [x3], x1 // P1 + ld1 {v4.16b}, [x3], x1 // P2 + ld1 {v5.16b}, [x0], x1 // P6 + ld1 {v6.16b}, [x3], x1 // P3 + ld1 {v7.16b}, [x0], x1 // P7 + ushll v16.8h, v1.8b, #1 // 2*P5[0..7] + ushll v17.8h, v3.8b, #1 // 2*P1[0..7] + ld1 {v18.16b}, [x3] // P4 + uxtl v19.8h, v4.8b // P2[0..7] + ld1 {v20.16b}, [x0] // P8 + uxtl v21.8h, v5.8b // P6[0..7] + dup v22.8h, w2 // pq + ushll2 v3.8h, v3.16b, #1 // 2*P1[8..15] + mls v17.8h, v19.8h, v0.h[1] // 2*P1[0..7]-5*P2[0..7] + ushll2 v19.8h, v1.16b, #1 // 2*P5[8..15] + uxtl2 v4.8h, v4.16b // P2[8..15] + mls v16.8h, v21.8h, v0.h[1] // 2*P5[0..7]-5*P6[0..7] + uxtl2 v5.8h, v5.16b // P6[8..15] + uxtl v23.8h, v6.8b // P3[0..7] + uxtl v24.8h, v7.8b // P7[0..7] + mls v3.8h, v4.8h, v0.h[1] // 2*P1[8..15]-5*P2[8..15] + ushll v4.8h, v6.8b, #1 // 2*P3[0..7] + uxtl v25.8h, v18.8b // P4[0..7] + mls v19.8h, v5.8h, v0.h[1] // 2*P5[8..15]-5*P6[8..15] + uxtl2 v26.8h, v6.16b // P3[8..15] + mla v17.8h, v23.8h, v0.h[1] // 2*P1[0..7]-5*P2[0..7]+5*P3[0..7] + uxtl2 v7.8h, v7.16b // P7[8..15] + ushll2 v6.8h, v6.16b, #1 // 2*P3[8..15] + mla v16.8h, v24.8h, v0.h[1] // 2*P5[0..7]-5*P6[0..7]+5*P7[0..7] + uxtl2 v18.8h, v18.16b // P4[8..15] + uxtl v23.8h, v20.8b // P8[0..7] + mls v4.8h, v25.8h, v0.h[1] // 2*P3[0..7]-5*P4[0..7] + uxtl v24.8h, v1.8b // P5[0..7] + uxtl2 v20.8h, v20.16b // P8[8..15] + mla v3.8h, v26.8h, v0.h[1] // 2*P1[8..15]-5*P2[8..15]+5*P3[8..15] + uxtl2 v1.8h, v1.16b // P5[8..15] + sub v26.8h, v25.8h, v24.8h // P4[0..7]-P5[0..7] + mla v19.8h, v7.8h, v0.h[1] // 2*P5[8..15]-5*P6[8..15]+5*P7[8..15] + sub v7.8h, v18.8h, v1.8h // P4[8..15]-P5[8..15] + mls v6.8h, v18.8h, v0.h[1] // 2*P3[8..15]-5*P4[8..15] + abs v27.8h, v26.8h + sshr v26.8h, v26.8h, #8 // clip_sign[0..7] + mls v17.8h, v25.8h, v0.h[0] // 2*P1[0..7]-5*P2[0..7]+5*P3[0..7]-2*P4[0..7] + abs v28.8h, v7.8h + sshr v27.8h, v27.8h, #1 // clip[0..7] + mls v16.8h, v23.8h, v0.h[0] // 2*P5[0..7]-5*P6[0..7]+5*P7[0..7]-2*P8[0..7] + sshr v7.8h, v7.8h, #8 // clip_sign[8..15] + sshr v23.8h, v28.8h, #1 // clip[8..15] + mla v4.8h, v24.8h, v0.h[1] // 2*P3[0..7]-5*P4[0..7]+5*P5[0..7] + cmeq v28.8h, v27.8h, #0 // test clip[0..7] == 0 + srshr v17.8h, v17.8h, #3 + mls v3.8h, v18.8h, v0.h[0] // 2*P1[8..15]-5*P2[8..15]+5*P3[8..15]-2*P4[8..15] + cmeq v29.8h, v23.8h, #0 // test clip[8..15] == 0 + srshr v16.8h, v16.8h, #3 + mls v19.8h, v20.8h, v0.h[0] // 2*P5[8..15]-5*P6[8..15]+5*P7[8..15]-2*P8[8..15] + abs v17.8h, v17.8h // a1[0..7] + mla v6.8h, v1.8h, v0.h[1] // 2*P3[8..15]-5*P4[8..15]+5*P5[8..15] + srshr v3.8h, v3.8h, #3 + mls v4.8h, v21.8h, v0.h[0] // 2*P3[0..7]-5*P4[0..7]+5*P5[0..7]-2*P6[0..7] + abs v16.8h, v16.8h // a2[0..7] + srshr v19.8h, v19.8h, #3 + mls v6.8h, v5.8h, v0.h[0] // 2*P3[8..15]-5*P4[8..15]+5*P5[8..15]-2*P6[8..15] + cmhs v5.8h, v17.8h, v16.8h // test a1[0..7] >= a2[0..7] + abs v3.8h, v3.8h // a1[8..15] + srshr v4.8h, v4.8h, #3 + abs v19.8h, v19.8h // a2[8..15] + bsl v5.16b, v16.16b, v17.16b // a3[0..7] + srshr v6.8h, v6.8h, #3 + cmhs v16.8h, v3.8h, v19.8h // test a1[8..15] >= a2[8.15] + abs v17.8h, v4.8h // a0[0..7] + sshr v4.8h, v4.8h, #8 // a0_sign[0..7] + bsl v16.16b, v19.16b, v3.16b // a3[8..15] + uqsub v3.8h, v17.8h, v5.8h // a0[0..7] >= a3[0..7] ? a0[0..7]-a3[0..7] : 0 (a0 > a3 in all cases where filtering is enabled, so makes more sense to subtract this way round than the opposite and then taking the abs) + abs v19.8h, v6.8h // a0[8..15] + cmhs v20.8h, v17.8h, v22.8h // test a0[0..7] >= pq + cmhs v5.8h, v5.8h, v17.8h // test a3[0..7] >= a0[0..7] + sub v4.8h, v26.8h, v4.8h // clip_sign[0..7] - a0_sign[0..7] + sshr v6.8h, v6.8h, #8 // a0_sign[8..15] + mul v3.8h, v3.8h, v0.h[1] // a0[0..7] >= a3[0..7] ? 5*(a0[0..7]-a3[0..7]) : 0 + uqsub v17.8h, v19.8h, v16.8h // a0[8..15] >= a3[8..15] ? a0[8..15]-a3[8..15] : 0 (a0 > a3 in all cases where filtering is enabled, so makes more sense to subtract this way round than the opposite and then taking the abs) + orr v20.16b, v28.16b, v20.16b // test clip[0..7] == 0 || a0[0..7] >= pq + cmhs v21.8h, v19.8h, v22.8h // test a0[8..15] >= pq + cmhs v16.8h, v16.8h, v19.8h // test a3[8..15] >= a0[8..15] + mul v0.8h, v17.8h, v0.h[1] // a0[8..15] >= a3[8..15] ? 5*(a0[8..15]-a3[8..15]) : 0 + sub v6.8h, v7.8h, v6.8h // clip_sign[8..15] - a0_sign[8..15] + orr v5.16b, v20.16b, v5.16b // test clip[0..7] == 0 || a0[0..7] >= pq || a3[0..7] >= a0[0..7] + ushr v3.8h, v3.8h, #3 // a0[0..7] >= a3[0..7] ? (5*(a0[0..7]-a3[0..7]))>>3 : 0 + orr v7.16b, v29.16b, v21.16b // test clip[8..15] == 0 || a0[8..15] >= pq + cmtst v17.2d, v5.2d, v2.2d // if 2nd of each group of is not filtered, then none of the others in the group should be either + mov w0, v5.s[1] // move to gp reg + cmhs v19.8h, v3.8h, v27.8h + ushr v0.8h, v0.8h, #3 // a0[8..15] >= a3[8..15] ? (5*(a0[8..15]-a3[8..15]))>>3 : 0 + mov w2, v5.s[3] + orr v5.16b, v7.16b, v16.16b // test clip[8..15] == 0 || a0[8..15] >= pq || a3[8..15] >= a0[8..15] + orr v16.16b, v20.16b, v17.16b + bsl v19.16b, v27.16b, v3.16b // FFMIN(d[0..7], clip[0..7]) + cmtst v2.2d, v5.2d, v2.2d + cmhs v3.8h, v0.8h, v23.8h + mov w4, v5.s[1] + mov w5, v5.s[3] + and w0, w0, w2 + bic v5.16b, v19.16b, v16.16b // set each d[0..7] to zero if it should not be filtered because clip[0..7] == 0 || a0[0..7] >= pq (a3 > a0 case already zeroed by saturating sub) + orr v2.16b, v7.16b, v2.16b + bsl v3.16b, v23.16b, v0.16b // FFMIN(d[8..15], clip[8..15]) + mls v25.8h, v5.8h, v4.8h // invert d[0..7] depending on clip_sign[0..7] & a0_sign[0..7], or zero it if they match, and accumulate into P4[0..7] + and w2, w4, w5 + bic v0.16b, v3.16b, v2.16b // set each d[8..15] to zero if it should not be filtered because clip[8..15] == 0 || a0[8..15] >= pq (a3 > a0 case already zeroed by saturating sub) + mla v24.8h, v5.8h, v4.8h // invert d[0..7] depending on clip_sign[0..7] & a0_sign[0..7], or zero it if they match, and accumulate into P5[0..7] + and w0, w0, w2 + mls v18.8h, v0.8h, v6.8h // invert d[8..15] depending on clip_sign[8..15] & a0_sign[8..15], or zero it if they match, and accumulate into P4[8..15] + sqxtun v2.8b, v25.8h + tbnz w0, #0, 1f // none of the 16 pixel pairs should be updated in this case + mla v1.8h, v0.8h, v6.8h // invert d[8..15] depending on clip_sign[8..15] & a0_sign[8..15], or zero it if they match, and accumulate into P5[8..15] + sqxtun v0.8b, v24.8h + sqxtun2 v2.16b, v18.8h + sqxtun2 v0.16b, v1.8h + st1 {v2.16b}, [x3], x1 + st1 {v0.16b}, [x3] +1: ret +endfunc + +// VC-1 in-loop deblocking filter for 16 pixel pairs at boundary of horizontally-neighbouring blocks +// On entry: +// x0 -> top-left pel of right block +// x1 = row stride, bytes +// w2 = PQUANT bitstream parameter +function ff_vc1_h_loop_filter16_neon, export=1 + sub x3, x0, #4 // where to start reading + ldr d0, .Lcoeffs + ld1 {v1.8b}, [x3], x1 // P1[0], P2[0]... + sub x0, x0, #1 // where to start writing + ld1 {v2.8b}, [x3], x1 + add x4, x0, x1, lsl #3 + ld1 {v3.8b}, [x3], x1 + add x5, x0, x1, lsl #2 + ld1 {v4.8b}, [x3], x1 + add x6, x4, x1, lsl #2 + ld1 {v5.8b}, [x3], x1 + ld1 {v6.8b}, [x3], x1 + ld1 {v7.8b}, [x3], x1 + trn1 v16.8b, v1.8b, v2.8b // P1[0], P1[1], P3[0]... + ld1 {v17.8b}, [x3], x1 + trn2 v1.8b, v1.8b, v2.8b // P2[0], P2[1], P4[0]... + ld1 {v2.8b}, [x3], x1 + trn1 v18.8b, v3.8b, v4.8b // P1[2], P1[3], P3[2]... + ld1 {v19.8b}, [x3], x1 + trn2 v3.8b, v3.8b, v4.8b // P2[2], P2[3], P4[2]... + ld1 {v4.8b}, [x3], x1 + trn1 v20.8b, v5.8b, v6.8b // P1[4], P1[5], P3[4]... + ld1 {v21.8b}, [x3], x1 + trn2 v5.8b, v5.8b, v6.8b // P2[4], P2[5], P4[4]... + ld1 {v6.8b}, [x3], x1 + trn1 v22.8b, v7.8b, v17.8b // P1[6], P1[7], P3[6]... + ld1 {v23.8b}, [x3], x1 + trn2 v7.8b, v7.8b, v17.8b // P2[6], P2[7], P4[6]... + ld1 {v17.8b}, [x3], x1 + trn1 v24.8b, v2.8b, v19.8b // P1[8], P1[9], P3[8]... + ld1 {v25.8b}, [x3] + trn2 v2.8b, v2.8b, v19.8b // P2[8], P2[9], P4[8]... + trn1 v19.4h, v16.4h, v18.4h // P1[0], P1[1], P1[2], P1[3], P5[0]... + trn1 v26.8b, v4.8b, v21.8b // P1[10], P1[11], P3[10]... + trn2 v4.8b, v4.8b, v21.8b // P2[10], P2[11], P4[10]... + trn1 v21.4h, v1.4h, v3.4h // P2[0], P2[1], P2[2], P2[3], P6[0]... + trn1 v27.4h, v20.4h, v22.4h // P1[4], P1[5], P1[6], P1[7], P5[4]... + trn1 v28.8b, v6.8b, v23.8b // P1[12], P1[13], P3[12]... + trn2 v6.8b, v6.8b, v23.8b // P2[12], P2[13], P4[12]... + trn1 v23.4h, v5.4h, v7.4h // P2[4], P2[5], P2[6], P2[7], P6[4]... + trn1 v29.4h, v24.4h, v26.4h // P1[8], P1[9], P1[10], P1[11], P5[8]... + trn1 v30.8b, v17.8b, v25.8b // P1[14], P1[15], P3[14]... + trn2 v17.8b, v17.8b, v25.8b // P2[14], P2[15], P4[14]... + trn1 v25.4h, v2.4h, v4.4h // P2[8], P2[9], P2[10], P2[11], P6[8]... + trn1 v31.2s, v19.2s, v27.2s // P1[0..7] + trn2 v19.2s, v19.2s, v27.2s // P5[0..7] + trn1 v27.2s, v21.2s, v23.2s // P2[0..7] + trn2 v21.2s, v21.2s, v23.2s // P6[0..7] + trn1 v23.4h, v28.4h, v30.4h // P1[12], P1[13], P1[14], P1[15], P5[12]... + trn2 v16.4h, v16.4h, v18.4h // P3[0], P3[1], P3[2], P3[3], P7[0]... + trn1 v18.4h, v6.4h, v17.4h // P2[12], P2[13], P2[14], P2[15], P6[12]... + trn2 v20.4h, v20.4h, v22.4h // P3[4], P3[5], P3[6], P3[7], P7[4]... + trn2 v22.4h, v24.4h, v26.4h // P3[8], P3[9], P3[10], P3[11], P7[8]... + trn1 v24.2s, v29.2s, v23.2s // P1[8..15] + trn2 v23.2s, v29.2s, v23.2s // P5[8..15] + trn1 v26.2s, v25.2s, v18.2s // P2[8..15] + trn2 v18.2s, v25.2s, v18.2s // P6[8..15] + trn2 v25.4h, v28.4h, v30.4h // P3[12], P3[13], P3[14], P3[15], P7[12]... + trn2 v1.4h, v1.4h, v3.4h // P4[0], P4[1], P4[2], P4[3], P8[0]... + trn2 v3.4h, v5.4h, v7.4h // P4[4], P4[5], P4[6], P4[7], P8[4]... + trn2 v2.4h, v2.4h, v4.4h // P4[8], P4[9], P4[10], P4[11], P8[8]... + trn2 v4.4h, v6.4h, v17.4h // P4[12], P4[13], P4[14], P4[15], P8[12]... + ushll v5.8h, v31.8b, #1 // 2*P1[0..7] + ushll v6.8h, v19.8b, #1 // 2*P5[0..7] + trn1 v7.2s, v16.2s, v20.2s // P3[0..7] + uxtl v17.8h, v27.8b // P2[0..7] + trn2 v16.2s, v16.2s, v20.2s // P7[0..7] + uxtl v20.8h, v21.8b // P6[0..7] + trn1 v21.2s, v22.2s, v25.2s // P3[8..15] + ushll v24.8h, v24.8b, #1 // 2*P1[8..15] + trn2 v22.2s, v22.2s, v25.2s // P7[8..15] + ushll v25.8h, v23.8b, #1 // 2*P5[8..15] + trn1 v27.2s, v1.2s, v3.2s // P4[0..7] + uxtl v26.8h, v26.8b // P2[8..15] + mls v5.8h, v17.8h, v0.h[1] // 2*P1[0..7]-5*P2[0..7] + uxtl v17.8h, v18.8b // P6[8..15] + mls v6.8h, v20.8h, v0.h[1] // 2*P5[0..7]-5*P6[0..7] + trn1 v18.2s, v2.2s, v4.2s // P4[8..15] + uxtl v28.8h, v7.8b // P3[0..7] + mls v24.8h, v26.8h, v0.h[1] // 2*P1[8..15]-5*P2[8..15] + uxtl v16.8h, v16.8b // P7[0..7] + uxtl v26.8h, v21.8b // P3[8..15] + mls v25.8h, v17.8h, v0.h[1] // 2*P5[8..15]-5*P6[8..15] + uxtl v22.8h, v22.8b // P7[8..15] + ushll v7.8h, v7.8b, #1 // 2*P3[0..7] + uxtl v27.8h, v27.8b // P4[0..7] + trn2 v1.2s, v1.2s, v3.2s // P8[0..7] + ushll v3.8h, v21.8b, #1 // 2*P3[8..15] + trn2 v2.2s, v2.2s, v4.2s // P8[8..15] + uxtl v4.8h, v18.8b // P4[8..15] + mla v5.8h, v28.8h, v0.h[1] // 2*P1[0..7]-5*P2[0..7]+5*P3[0..7] + uxtl v1.8h, v1.8b // P8[0..7] + mla v6.8h, v16.8h, v0.h[1] // 2*P5[0..7]-5*P6[0..7]+5*P7[0..7] + uxtl v2.8h, v2.8b // P8[8..15] + uxtl v16.8h, v19.8b // P5[0..7] + mla v24.8h, v26.8h, v0.h[1] // 2*P1[8..15]-5*P2[8..15]+5*P3[8..15] + uxtl v18.8h, v23.8b // P5[8..15] + dup v19.8h, w2 // pq + mla v25.8h, v22.8h, v0.h[1] // 2*P5[8..15]-5*P6[8..15]+5*P7[8..15] + sub v21.8h, v27.8h, v16.8h // P4[0..7]-P5[0..7] + sub v22.8h, v4.8h, v18.8h // P4[8..15]-P5[8..15] + mls v7.8h, v27.8h, v0.h[1] // 2*P3[0..7]-5*P4[0..7] + abs v23.8h, v21.8h + mls v3.8h, v4.8h, v0.h[1] // 2*P3[8..15]-5*P4[8..15] + abs v26.8h, v22.8h + sshr v21.8h, v21.8h, #8 // clip_sign[0..7] + mls v5.8h, v27.8h, v0.h[0] // 2*P1[0..7]-5*P2[0..7]+5*P3[0..7]-2*P4[0..7] + sshr v23.8h, v23.8h, #1 // clip[0..7] + sshr v26.8h, v26.8h, #1 // clip[8..15] + mls v6.8h, v1.8h, v0.h[0] // 2*P5[0..7]-5*P6[0..7]+5*P7[0..7]-2*P8[0..7] + sshr v1.8h, v22.8h, #8 // clip_sign[8..15] + cmeq v22.8h, v23.8h, #0 // test clip[0..7] == 0 + mls v24.8h, v4.8h, v0.h[0] // 2*P1[8..15]-5*P2[8..15]+5*P3[8..15]-2*P4[8..15] + cmeq v28.8h, v26.8h, #0 // test clip[8..15] == 0 + srshr v5.8h, v5.8h, #3 + mls v25.8h, v2.8h, v0.h[0] // 2*P5[8..15]-5*P6[8..15]+5*P7[8..15]-2*P8[8..15] + srshr v2.8h, v6.8h, #3 + mla v7.8h, v16.8h, v0.h[1] // 2*P3[0..7]-5*P4[0..7]+5*P5[0..7] + srshr v6.8h, v24.8h, #3 + mla v3.8h, v18.8h, v0.h[1] // 2*P3[8..15]-5*P4[8..15]+5*P5[8..15] + abs v5.8h, v5.8h // a1[0..7] + srshr v24.8h, v25.8h, #3 + mls v3.8h, v17.8h, v0.h[0] // 2*P3[8..15]-5*P4[8..15]+5*P5[8..15]-2*P6[8..15] + abs v2.8h, v2.8h // a2[0..7] + abs v6.8h, v6.8h // a1[8..15] + mls v7.8h, v20.8h, v0.h[0] // 2*P3[0..7]-5*P4[0..7]+5*P5[0..7]-2*P6[0..7] + abs v17.8h, v24.8h // a2[8..15] + cmhs v20.8h, v5.8h, v2.8h // test a1[0..7] >= a2[0..7] + srshr v3.8h, v3.8h, #3 + cmhs v24.8h, v6.8h, v17.8h // test a1[8..15] >= a2[8.15] + srshr v7.8h, v7.8h, #3 + bsl v20.16b, v2.16b, v5.16b // a3[0..7] + abs v2.8h, v3.8h // a0[8..15] + sshr v3.8h, v3.8h, #8 // a0_sign[8..15] + bsl v24.16b, v17.16b, v6.16b // a3[8..15] + abs v5.8h, v7.8h // a0[0..7] + sshr v6.8h, v7.8h, #8 // a0_sign[0..7] + cmhs v7.8h, v2.8h, v19.8h // test a0[8..15] >= pq + sub v1.8h, v1.8h, v3.8h // clip_sign[8..15] - a0_sign[8..15] + uqsub v3.8h, v2.8h, v24.8h // a0[8..15] >= a3[8..15] ? a0[8..15]-a3[8..15] : 0 (a0 > a3 in all cases where filtering is enabled, so makes more sense to subtract this way round than the opposite and then taking the abs) + cmhs v2.8h, v24.8h, v2.8h // test a3[8..15] >= a0[8..15] + uqsub v17.8h, v5.8h, v20.8h // a0[0..7] >= a3[0..7] ? a0[0..7]-a3[0..7] : 0 (a0 > a3 in all cases where filtering is enabled, so makes more sense to subtract this way round than the opposite and then taking the abs) + cmhs v19.8h, v5.8h, v19.8h // test a0[0..7] >= pq + orr v7.16b, v28.16b, v7.16b // test clip[8..15] == 0 || a0[8..15] >= pq + sub v6.8h, v21.8h, v6.8h // clip_sign[0..7] - a0_sign[0..7] + mul v3.8h, v3.8h, v0.h[1] // a0[8..15] >= a3[8..15] ? 5*(a0[8..15]-a3[8..15]) : 0 + cmhs v5.8h, v20.8h, v5.8h // test a3[0..7] >= a0[0..7] + orr v19.16b, v22.16b, v19.16b // test clip[0..7] == 0 || a0[0..7] >= pq + mul v0.8h, v17.8h, v0.h[1] // a0[0..7] >= a3[0..7] ? 5*(a0[0..7]-a3[0..7]) : 0 + orr v2.16b, v7.16b, v2.16b // test clip[8..15] == 0 || a0[8..15] >= pq || a3[8..15] >= a0[8..15] + orr v5.16b, v19.16b, v5.16b // test clip[0..7] == 0 || a0[0..7] >= pq || a3[0..7] >= a0[0..7] + ushr v3.8h, v3.8h, #3 // a0[8..15] >= a3[8..15] ? (5*(a0[8..15]-a3[8..15]))>>3 : 0 + mov w7, v2.s[1] + mov w8, v2.s[3] + ushr v0.8h, v0.8h, #3 // a0[0..7] >= a3[0..7] ? (5*(a0[0..7]-a3[0..7]))>>3 : 0 + mov w2, v5.s[1] // move to gp reg + cmhs v2.8h, v3.8h, v26.8h + mov w3, v5.s[3] + cmhs v5.8h, v0.8h, v23.8h + bsl v2.16b, v26.16b, v3.16b // FFMIN(d[8..15], clip[8..15]) + and w9, w7, w8 + bsl v5.16b, v23.16b, v0.16b // FFMIN(d[0..7], clip[0..7]) + and w10, w2, w3 + bic v0.16b, v2.16b, v7.16b // set each d[8..15] to zero if it should not be filtered because clip[8..15] == 0 || a0[8..15] >= pq (a3 > a0 case already zeroed by saturating sub) + and w9, w10, w9 + bic v2.16b, v5.16b, v19.16b // set each d[0..7] to zero if it should not be filtered because clip[0..7] == 0 || a0[0..7] >= pq (a3 > a0 case already zeroed by saturating sub) + mls v4.8h, v0.8h, v1.8h // invert d[8..15] depending on clip_sign[8..15] & a0_sign[8..15], or zero it if they match, and accumulate into P4 + tbnz w9, #0, 4f // none of the 16 pixel pairs should be updated in this case + mls v27.8h, v2.8h, v6.8h // invert d[0..7] depending on clip_sign[0..7] & a0_sign[0..7], or zero it if they match, and accumulate into P4 + mla v16.8h, v2.8h, v6.8h // invert d[0..7] depending on clip_sign[0..7] & a0_sign[0..7], or zero it if they match, and accumulate into P5 + sqxtun v2.8b, v4.8h + mla v18.8h, v0.8h, v1.8h // invert d[8..15] depending on clip_sign[8..15] & a0_sign[8..15], or zero it if they match, and accumulate into P5 + sqxtun v0.8b, v27.8h + sqxtun v1.8b, v16.8h + sqxtun v3.8b, v18.8h + tbnz w2, #0, 1f + st2 {v0.b, v1.b}[0], [x0], x1 + st2 {v0.b, v1.b}[1], [x0], x1 + st2 {v0.b, v1.b}[2], [x0], x1 + st2 {v0.b, v1.b}[3], [x0] +1: tbnz w3, #0, 2f + st2 {v0.b, v1.b}[4], [x5], x1 + st2 {v0.b, v1.b}[5], [x5], x1 + st2 {v0.b, v1.b}[6], [x5], x1 + st2 {v0.b, v1.b}[7], [x5] +2: tbnz w7, #0, 3f + st2 {v2.b, v3.b}[0], [x4], x1 + st2 {v2.b, v3.b}[1], [x4], x1 + st2 {v2.b, v3.b}[2], [x4], x1 + st2 {v2.b, v3.b}[3], [x4] +3: tbnz w8, #0, 4f + st2 {v2.b, v3.b}[4], [x6], x1 + st2 {v2.b, v3.b}[5], [x6], x1 + st2 {v2.b, v3.b}[6], [x6], x1 + st2 {v2.b, v3.b}[7], [x6] +4: ret +endfunc + +// Copy at most the specified number of bytes from source to destination buffer, +// stopping at a multiple of 32 bytes, none of which are the start of an escape sequence +// On entry: +// x0 -> source buffer +// w1 = max number of bytes to copy +// x2 -> destination buffer, optimally 8-byte aligned +// On exit: +// w0 = number of bytes not copied +function ff_vc1_unescape_buffer_helper_neon, export=1 + // Offset by 80 to screen out cases that are too short for us to handle, + // and also make it easy to test for loop termination, or to determine + // whether we need an odd number of half-iterations of the loop. + subs w1, w1, #80 + b.mi 90f + + // Set up useful constants + movi v20.4s, #3, lsl #24 + movi v21.4s, #3, lsl #16 + + tst w1, #32 + b.ne 1f + + ld1 {v0.16b, v1.16b, v2.16b}, [x0], #48 + ext v25.16b, v0.16b, v1.16b, #1 + ext v26.16b, v0.16b, v1.16b, #2 + ext v27.16b, v0.16b, v1.16b, #3 + ext v29.16b, v1.16b, v2.16b, #1 + ext v30.16b, v1.16b, v2.16b, #2 + ext v31.16b, v1.16b, v2.16b, #3 + bic v24.16b, v0.16b, v20.16b + bic v25.16b, v25.16b, v20.16b + bic v26.16b, v26.16b, v20.16b + bic v27.16b, v27.16b, v20.16b + bic v28.16b, v1.16b, v20.16b + bic v29.16b, v29.16b, v20.16b + bic v30.16b, v30.16b, v20.16b + bic v31.16b, v31.16b, v20.16b + eor v24.16b, v24.16b, v21.16b + eor v25.16b, v25.16b, v21.16b + eor v26.16b, v26.16b, v21.16b + eor v27.16b, v27.16b, v21.16b + eor v28.16b, v28.16b, v21.16b + eor v29.16b, v29.16b, v21.16b + eor v30.16b, v30.16b, v21.16b + eor v31.16b, v31.16b, v21.16b + cmeq v24.4s, v24.4s, #0 + cmeq v25.4s, v25.4s, #0 + cmeq v26.4s, v26.4s, #0 + cmeq v27.4s, v27.4s, #0 + add w1, w1, #32 + b 3f + +1: ld1 {v3.16b, v4.16b, v5.16b}, [x0], #48 + ext v25.16b, v3.16b, v4.16b, #1 + ext v26.16b, v3.16b, v4.16b, #2 + ext v27.16b, v3.16b, v4.16b, #3 + ext v29.16b, v4.16b, v5.16b, #1 + ext v30.16b, v4.16b, v5.16b, #2 + ext v31.16b, v4.16b, v5.16b, #3 + bic v24.16b, v3.16b, v20.16b + bic v25.16b, v25.16b, v20.16b + bic v26.16b, v26.16b, v20.16b + bic v27.16b, v27.16b, v20.16b + bic v28.16b, v4.16b, v20.16b + bic v29.16b, v29.16b, v20.16b + bic v30.16b, v30.16b, v20.16b + bic v31.16b, v31.16b, v20.16b + eor v24.16b, v24.16b, v21.16b + eor v25.16b, v25.16b, v21.16b + eor v26.16b, v26.16b, v21.16b + eor v27.16b, v27.16b, v21.16b + eor v28.16b, v28.16b, v21.16b + eor v29.16b, v29.16b, v21.16b + eor v30.16b, v30.16b, v21.16b + eor v31.16b, v31.16b, v21.16b + cmeq v24.4s, v24.4s, #0 + cmeq v25.4s, v25.4s, #0 + cmeq v26.4s, v26.4s, #0 + cmeq v27.4s, v27.4s, #0 + // Drop through... +2: mov v0.16b, v5.16b + ld1 {v1.16b, v2.16b}, [x0], #32 + cmeq v28.4s, v28.4s, #0 + cmeq v29.4s, v29.4s, #0 + cmeq v30.4s, v30.4s, #0 + cmeq v31.4s, v31.4s, #0 + orr v24.16b, v24.16b, v25.16b + orr v26.16b, v26.16b, v27.16b + orr v28.16b, v28.16b, v29.16b + orr v30.16b, v30.16b, v31.16b + ext v25.16b, v0.16b, v1.16b, #1 + orr v22.16b, v24.16b, v26.16b + ext v26.16b, v0.16b, v1.16b, #2 + ext v27.16b, v0.16b, v1.16b, #3 + ext v29.16b, v1.16b, v2.16b, #1 + orr v23.16b, v28.16b, v30.16b + ext v30.16b, v1.16b, v2.16b, #2 + ext v31.16b, v1.16b, v2.16b, #3 + bic v24.16b, v0.16b, v20.16b + bic v25.16b, v25.16b, v20.16b + bic v26.16b, v26.16b, v20.16b + orr v22.16b, v22.16b, v23.16b + bic v27.16b, v27.16b, v20.16b + bic v28.16b, v1.16b, v20.16b + bic v29.16b, v29.16b, v20.16b + bic v30.16b, v30.16b, v20.16b + bic v31.16b, v31.16b, v20.16b + addv s22, v22.4s + eor v24.16b, v24.16b, v21.16b + eor v25.16b, v25.16b, v21.16b + eor v26.16b, v26.16b, v21.16b + eor v27.16b, v27.16b, v21.16b + eor v28.16b, v28.16b, v21.16b + mov w3, v22.s[0] + eor v29.16b, v29.16b, v21.16b + eor v30.16b, v30.16b, v21.16b + eor v31.16b, v31.16b, v21.16b + cmeq v24.4s, v24.4s, #0 + cmeq v25.4s, v25.4s, #0 + cmeq v26.4s, v26.4s, #0 + cmeq v27.4s, v27.4s, #0 + cbnz w3, 90f + st1 {v3.16b, v4.16b}, [x2], #32 +3: mov v3.16b, v2.16b + ld1 {v4.16b, v5.16b}, [x0], #32 + cmeq v28.4s, v28.4s, #0 + cmeq v29.4s, v29.4s, #0 + cmeq v30.4s, v30.4s, #0 + cmeq v31.4s, v31.4s, #0 + orr v24.16b, v24.16b, v25.16b + orr v26.16b, v26.16b, v27.16b + orr v28.16b, v28.16b, v29.16b + orr v30.16b, v30.16b, v31.16b + ext v25.16b, v3.16b, v4.16b, #1 + orr v22.16b, v24.16b, v26.16b + ext v26.16b, v3.16b, v4.16b, #2 + ext v27.16b, v3.16b, v4.16b, #3 + ext v29.16b, v4.16b, v5.16b, #1 + orr v23.16b, v28.16b, v30.16b + ext v30.16b, v4.16b, v5.16b, #2 + ext v31.16b, v4.16b, v5.16b, #3 + bic v24.16b, v3.16b, v20.16b + bic v25.16b, v25.16b, v20.16b + bic v26.16b, v26.16b, v20.16b + orr v22.16b, v22.16b, v23.16b + bic v27.16b, v27.16b, v20.16b + bic v28.16b, v4.16b, v20.16b + bic v29.16b, v29.16b, v20.16b + bic v30.16b, v30.16b, v20.16b + bic v31.16b, v31.16b, v20.16b + addv s22, v22.4s + eor v24.16b, v24.16b, v21.16b + eor v25.16b, v25.16b, v21.16b + eor v26.16b, v26.16b, v21.16b + eor v27.16b, v27.16b, v21.16b + eor v28.16b, v28.16b, v21.16b + mov w3, v22.s[0] + eor v29.16b, v29.16b, v21.16b + eor v30.16b, v30.16b, v21.16b + eor v31.16b, v31.16b, v21.16b + cmeq v24.4s, v24.4s, #0 + cmeq v25.4s, v25.4s, #0 + cmeq v26.4s, v26.4s, #0 + cmeq v27.4s, v27.4s, #0 + cbnz w3, 91f + st1 {v0.16b, v1.16b}, [x2], #32 + subs w1, w1, #64 + b.pl 2b + +90: add w0, w1, #80 + ret + +91: sub w1, w1, #32 + b 90b +endfunc diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 2e9a3581de..d9571b437f 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -153,6 +153,7 @@ extern AVCodec ff_hap_decoder; extern AVCodec ff_hevc_decoder; extern AVCodec ff_hevc_qsv_decoder; extern AVCodec ff_hevc_rkmpp_decoder; +extern AVCodec ff_hevc_rpi_decoder; extern AVCodec ff_hevc_v4l2m2m_decoder; extern AVCodec ff_hnm4_video_decoder; extern AVCodec ff_hq_hqa_decoder; @@ -917,6 +918,41 @@ static enum AVCodecID remap_deprecated_codec_id(enum AVCodecID id) } } +static int codec_supports_format(const AVCodec * const p, const enum AVPixelFormat fmt) +{ + const enum AVPixelFormat *pf = p->pix_fmts; + + // Assume good if we lack info + if (pf == NULL) + return 1; + if (fmt == AV_PIX_FMT_NONE) + return 0; + + for (; *pf != AV_PIX_FMT_NONE; ++pf) { + if (*pf == fmt) + return 1; + } + return 0; +} + +AVCodec *avcodec_find_decoder_by_id_and_fmt(enum AVCodecID id, enum AVPixelFormat fmt) +{ + const AVCodec *p, *experimental = NULL; + void *i = 0; + + id= remap_deprecated_codec_id(id); + while ((p = av_codec_iterate(&i))) { + if (av_codec_is_decoder(p) && p->id == id && codec_supports_format(p, fmt)) { + if (p->capabilities & AV_CODEC_CAP_EXPERIMENTAL && !experimental) { + experimental = p; + } else + return (AVCodec *)p; + } + p = p->next; + } + return (AVCodec *)experimental; +} + static AVCodec *find_codec(enum AVCodecID id, int (*x)(const AVCodec *)) { const AVCodec *p, *experimental = NULL; diff --git a/libavcodec/arm/Makefile b/libavcodec/arm/Makefile index c4ab93aeeb..cd926f7b33 100644 --- a/libavcodec/arm/Makefile +++ b/libavcodec/arm/Makefile @@ -39,6 +39,8 @@ OBJS-$(CONFIG_AAC_DECODER) += arm/aacpsdsp_init_arm.o \ arm/sbrdsp_init_arm.o OBJS-$(CONFIG_DCA_DECODER) += arm/synth_filter_init_arm.o OBJS-$(CONFIG_HEVC_DECODER) += arm/hevcdsp_init_arm.o +OBJS-$(CONFIG_HEVC_RPI_DECODER) += arm/rpi_hevcdsp_init_arm.o \ + arm/rpi_hevcpred_init_arm.o OBJS-$(CONFIG_MLP_DECODER) += arm/mlpdsp_init_arm.o OBJS-$(CONFIG_RV40_DECODER) += arm/rv40dsp_init_arm.o OBJS-$(CONFIG_SBC_ENCODER) += arm/sbcdsp_init_arm.o @@ -137,10 +139,24 @@ NEON-OBJS-$(CONFIG_AAC_DECODER) += arm/aacpsdsp_neon.o \ NEON-OBJS-$(CONFIG_LLAUDDSP) += arm/lossless_audiodsp_neon.o NEON-OBJS-$(CONFIG_DCA_DECODER) += arm/synth_filter_neon.o NEON-OBJS-$(CONFIG_HEVC_DECODER) += arm/hevcdsp_init_neon.o \ + arm/hevcdsp_idct_neon.o \ arm/hevcdsp_deblock_neon.o \ arm/hevcdsp_idct_neon.o \ arm/hevcdsp_qpel_neon.o \ arm/hevcdsp_sao_neon.o +NEON-OBJS-$(CONFIG_HEVC_RPI_DECODER) += arm/rpi_hevcdsp_init_neon.o \ + arm/rpi_hevc_misc_neon.o \ + arm/rpi_hevcdsp_deblock_neon.o \ + arm/rpi_hevcdsp_idct_neon.o \ + arm/rpi_hevcdsp_res8_neon.o \ + arm/rpi_hevcdsp_res16_neon.o \ + arm/rpi_hevcdsp_sao_neon.o \ + arm/rpi_hevcpred_init_neon.o \ + arm/rpi_hevcpred_intra_angular_neon.o \ + arm/rpi_hevcpred_intra_dc_neon.o \ + arm/rpi_hevcpred_intra_filter_neon.o \ + arm/rpi_hevcpred_intra_hv_neon.o \ + arm/rpi_hevcpred_intra_planar_neon.o NEON-OBJS-$(CONFIG_RV30_DECODER) += arm/rv34dsp_neon.o NEON-OBJS-$(CONFIG_RV40_DECODER) += arm/rv34dsp_neon.o \ arm/rv40dsp_neon.o diff --git a/libavcodec/arm/cabac.h b/libavcodec/arm/cabac.h index fdbf86b45e..4755f20e2e 100644 --- a/libavcodec/arm/cabac.h +++ b/libavcodec/arm/cabac.h @@ -26,83 +26,209 @@ #include "libavutil/internal.h" #include "libavcodec/cabac.h" + #define get_cabac_inline get_cabac_inline_arm static av_always_inline int get_cabac_inline_arm(CABACContext *c, - uint8_t *const state) + uint8_t *state) { - int bit; - void *reg_b, *reg_c, *tmp; + const uint8_t *mlps_tables = ff_h264_cabac_tables + H264_MLPS_STATE_OFFSET + 128; + int bit, ptr, low, tmp1, tmp2; + __asm__ volatile ( + "ldr %[bit], [%[c], %[range_off]] \n\t" + "ldrb %[ptr], [%[state]] \n\t" + "sub %[tmp1], %[mlps_tables], %[lps_off] \n\t" + "and %[tmp2], %[bit], #0xc0 \n\t" + "add %[tmp1], %[tmp1], %[ptr] \n\t" + "ldr %[low], [%[c], %[low_off]] \n\t" + "ldrb %[tmp2], [%[tmp1], %[tmp2], lsl #1] \n\t" + "sub %[bit], %[bit], %[tmp2] \n\t" + "mov %[tmp1], %[bit] \n\t" + "cmp %[low], %[bit], lsl #17 \n\t" + "itt ge \n\t" + "movge %[tmp1], %[tmp2] \n\t" + "mvnge %[ptr], %[ptr] \n\t" + "clz %[tmp2], %[tmp1] \n\t" + "it ge \n\t" + "subge %[low], %[low], %[bit], lsl #17 \n\t" + "sub %[tmp2], %[tmp2], #23 \n\t" + "and %[bit], %[ptr], #1 \n\t" + "ldrb %[mlps_tables], [%[mlps_tables], %[ptr]] \n\t" + "lsl %[low], %[low], %[tmp2] \n\t" + "lsls %[ptr], %[low], #16 \n\t" + "bne 1f \n\t" + "ldr %[ptr], [%[c], %[ptr_off]] \n\t" + "lsl %[tmp2], %[tmp1], %[tmp2] \n\t" +#if UNCHECKED_BITSTREAM_READER + "strb %[mlps_tables], [%[state]] \n\t" + "rbit %[state], %[low] \n\t" + "ldrh %[tmp1], [%[ptr]], #2 \n\t" +#else + "ldr %[tmp1], [%[c], %[end_off]] \n\t" + "strb %[mlps_tables], [%[state]] \n\t" + "rbit %[state], %[low] \n\t" + "cmp %[tmp1], %[ptr] \n\t" +#if CONFIG_THUMB + "it cs \n\t" + "ldrhcs %[tmp1], [%[ptr]], #2 \n\t" +#else + "ldrcsh %[tmp1], [%[ptr]], #2 \n\t" +#endif +#endif + "clz %[state], %[state] \n\t" + "movw %[mlps_tables], #0xffff \n\t" + "sub %[state], %[state], #16 \n\t" + "str %[tmp2], [%[c], %[range_off]] \n\t" + "rev %[tmp1], %[tmp1] \n\t" + "str %[ptr], [%[c], %[ptr_off]] \n\t" + "lsr %[tmp1], %[tmp1], #15 \n\t" + "sub %[tmp1], %[tmp1], %[mlps_tables] \n\t" +#if CONFIG_THUMB + "lsl %[tmp1], %[tmp1], %[state] \n\t" + "add %[low], %[low], %[tmp1] \n\t" +#else + "add %[low], %[low], %[tmp1], lsl %[state] \n\t" +#endif + "str %[low], [%[c], %[low_off]] \n\t" + "b 2f \n\t" + "1: \n\t" + "strb %[mlps_tables], [%[state]] \n\t" + "lsl %[tmp1], %[tmp1], %[tmp2] \n\t" + "str %[low], [%[c], %[low_off]] \n\t" + "str %[tmp1], [%[c], %[range_off]] \n\t" + "2: \n\t" + : // Outputs + [state]"+r"(state), + [mlps_tables]"+r"(mlps_tables), + [bit]"=&r"(bit), + [ptr]"=&r"(ptr), + [low]"=&r"(low), + [tmp1]"=&r"(tmp1), + [tmp2]"=&r"(tmp2) + : // Inputs + [c]"r"(c), + [low_off]"J"(offsetof(CABACContext, low)), + [range_off]"J"(offsetof(CABACContext, range)), + [ptr_off]"J"(offsetof(CABACContext, bytestream)), + [end_off]"J"(offsetof(CABACContext, bytestream_end)), + [lps_off]"I"((H264_MLPS_STATE_OFFSET + 128) - H264_LPS_RANGE_OFFSET) + : // Clobbers + "cc", "memory" + ); + return bit; +} - __asm__ volatile( - "ldrb %[bit] , [%[state]] \n\t" - "add %[r_b] , %[tables] , %[lps_off] \n\t" - "mov %[tmp] , %[range] \n\t" - "and %[range] , %[range] , #0xC0 \n\t" - "add %[r_b] , %[r_b] , %[bit] \n\t" - "ldrb %[range] , [%[r_b], %[range], lsl #1] \n\t" - "add %[r_b] , %[tables] , %[norm_off] \n\t" - "sub %[r_c] , %[tmp] , %[range] \n\t" - "lsl %[tmp] , %[r_c] , #17 \n\t" - "cmp %[tmp] , %[low] \n\t" - "it gt \n\t" - "movgt %[range] , %[r_c] \n\t" - "itt cc \n\t" - "mvncc %[bit] , %[bit] \n\t" - "subcc %[low] , %[low] , %[tmp] \n\t" - "add %[r_c] , %[tables] , %[mlps_off] \n\t" - "ldrb %[tmp] , [%[r_b], %[range]] \n\t" - "ldrb %[r_b] , [%[r_c], %[bit]] \n\t" - "lsl %[low] , %[low] , %[tmp] \n\t" - "lsl %[range] , %[range] , %[tmp] \n\t" - "uxth %[r_c] , %[low] \n\t" - "strb %[r_b] , [%[state]] \n\t" - "tst %[r_c] , %[r_c] \n\t" - "bne 2f \n\t" - "ldr %[r_c] , [%[c], %[byte]] \n\t" +#define get_cabac_bypass get_cabac_bypass_arm +static inline int get_cabac_bypass_arm(CABACContext * const c) +{ + uint32_t low = c->low, range, ptr, tmp; + int rv; + __asm volatile ( + "ldr %[range] , [%[c], %[range_off]] \n\t" + "mov %[rv] , #0 \n\t" + "ldr %[ptr] , [%[c], %[ptr_off]] \n\t" + "lsl %[low] , #1 \n\t" +#if !UNCHECKED_BITSTREAM_READER + "ldr %[tmp] , [%[c], %[end_off]] \n\t" +#endif + "cmp %[low] , %[range], lsl #17 \n\t" + "itt cs \n\t" + "subcs %[low] , %[low], %[range], lsl #17 \n\t" + "movcs %[rv] , #1 \n\t" #if UNCHECKED_BITSTREAM_READER - "ldrh %[tmp] , [%[r_c]] \n\t" - "add %[r_c] , %[r_c] , #2 \n\t" - "str %[r_c] , [%[c], %[byte]] \n\t" + "ldrh %[tmp] , [%[ptr]], #2 \n\t" +#else + "cmp %[tmp] , %[ptr] \n\t" +#if CONFIG_THUMB + "it cs \n\t" + "ldrhcs %[tmp] , [%[ptr]], #2 \n\t" #else - "ldr %[r_b] , [%[c], %[end]] \n\t" - "ldrh %[tmp] , [%[r_c]] \n\t" - "cmp %[r_c] , %[r_b] \n\t" - "itt lt \n\t" - "addlt %[r_c] , %[r_c] , #2 \n\t" - "strlt %[r_c] , [%[c], %[byte]] \n\t" + "ldrcsh %[tmp] , [%[ptr]], #2 \n\t" +#endif #endif - "sub %[r_c] , %[low] , #1 \n\t" - "add %[r_b] , %[tables] , %[norm_off] \n\t" - "eor %[r_c] , %[low] , %[r_c] \n\t" - "rev %[tmp] , %[tmp] \n\t" - "lsr %[r_c] , %[r_c] , #15 \n\t" - "lsr %[tmp] , %[tmp] , #15 \n\t" - "ldrb %[r_c] , [%[r_b], %[r_c]] \n\t" - "movw %[r_b] , #0xFFFF \n\t" - "sub %[tmp] , %[tmp] , %[r_b] \n\t" - "rsb %[r_c] , %[r_c] , #7 \n\t" - "lsl %[tmp] , %[tmp] , %[r_c] \n\t" - "add %[low] , %[low] , %[tmp] \n\t" - "2: \n\t" - : [bit]"=&r"(bit), - [low]"+&r"(c->low), - [range]"+&r"(c->range), - [r_b]"=&r"(reg_b), - [r_c]"=&r"(reg_c), - [tmp]"=&r"(tmp) - : [c]"r"(c), - [state]"r"(state), - [tables]"r"(ff_h264_cabac_tables), - [byte]"M"(offsetof(CABACContext, bytestream)), - [end]"M"(offsetof(CABACContext, bytestream_end)), - [norm_off]"I"(H264_NORM_SHIFT_OFFSET), - [lps_off]"I"(H264_LPS_RANGE_OFFSET), - [mlps_off]"I"(H264_MLPS_STATE_OFFSET + 128) - : "memory", "cc" - ); + "lsls %[range] , %[low], #16 \n\t" + "bne 1f \n\t" - return bit & 1; + "str %[ptr] , [%[c], %[ptr_off]] \n\t" + "rev %[tmp] , %[tmp] \n\t" + "add %[low] , %[low], %[tmp], lsr #15 \n\t" + "movw %[tmp] , 0xFFFF \n\t" + "sub %[low] , %[tmp] \n\t" + "1: \n\t" + "str %[low] , [%[c], %[low_off]] \n\t" + : // Outputs + [rv]"=&r"(rv), + [low]"+r"(low), + [range]"=&r"(range), + [ptr]"=&r"(ptr), + [tmp]"=&r"(tmp) + : // Inputs + [c]"r"(c), + [low_off]"J"(offsetof(CABACContext, low)), + [range_off]"J"(offsetof(CABACContext, range)), + [ptr_off]"J"(offsetof(CABACContext, bytestream)), + [end_off]"J"(offsetof(CABACContext, bytestream_end)) + : // Clobbers + "memory", "cc" + ); + return rv; } + + +#define get_cabac_bypass_sign get_cabac_bypass_sign_arm +static inline int get_cabac_bypass_sign_arm(CABACContext * const c, int rv) +{ + uint32_t low = c->low, range, ptr, tmp; + __asm volatile ( + "ldr %[range] , [%[c], %[range_off]] \n\t" + "ldr %[ptr] , [%[c], %[ptr_off]] \n\t" + "lsl %[low] , #1 \n\t" +#if !UNCHECKED_BITSTREAM_READER + "ldr %[tmp] , [%[c], %[end_off]] \n\t" +#endif + "cmp %[low] , %[range], lsl #17 \n\t" + "it cs \n\t" + "subcs %[low] , %[low], %[range], lsl #17 \n\t" + "it cc \n\t" + "rsbcc %[rv] , %[rv], #0 \n\t" +#if UNCHECKED_BITSTREAM_READER + "ldrh %[tmp] , [%[ptr]], #2 \n\t" +#else + "cmp %[tmp] , %[ptr] \n\t" +#if CONFIG_THUMB + "it cs \n\t" + "ldrhcs %[tmp] , [%[ptr]], #2 \n\t" +#else + "ldrcsh %[tmp] , [%[ptr]], #2 \n\t" +#endif +#endif + "lsls %[range] , %[low], #16 \n\t" + "bne 1f \n\t" + + "str %[ptr] , [%[c], %[ptr_off]] \n\t" + "rev %[tmp] , %[tmp] \n\t" + "add %[low] , %[low], %[tmp], lsr #15 \n\t" + "movw %[tmp] , 0xFFFF \n\t" + "sub %[low] , %[tmp] \n\t" + "1: \n\t" + "str %[low] , [%[c], %[low_off]] \n\t" + : // Outputs + [rv]"+r"(rv), + [low]"+r"(low), + [range]"=&r"(range), + [ptr]"=&r"(ptr), + [tmp]"=&r"(tmp) + : // Inputs + [c]"r"(c), + [low_off]"J"(offsetof(CABACContext, low)), + [range_off]"J"(offsetof(CABACContext, range)), + [ptr_off]"J"(offsetof(CABACContext, bytestream)), + [end_off]"J"(offsetof(CABACContext, bytestream_end)) + : // Clobbers + "memory", "cc" + ); + return rv; +} + #endif /* HAVE_ARMV6T2_INLINE */ #endif /* AVCODEC_ARM_CABAC_H */ diff --git a/libavcodec/arm/rpi_hevc_cabac.h b/libavcodec/arm/rpi_hevc_cabac.h new file mode 100644 index 0000000000..c88dec6eff --- /dev/null +++ b/libavcodec/arm/rpi_hevc_cabac.h @@ -0,0 +1,607 @@ +/* + * This file is part of FFmpeg. + * + * Copyright (C) 2018 John Cox, Ben Avison for Raspberry Pi (Trading) + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_ARM_HEVC_CABAC_H +#define AVCODEC_ARM_HEVC_CABAC_H + +#include "config.h" +#if HAVE_ARMV6T2_INLINE + +#define hevc_mem_bits32 hevc_mem_bits32_arm +static inline uint32_t hevc_mem_bits32_arm(const void * p, const unsigned int bits) +{ + unsigned int n; + __asm__ ( + "rev %[n], %[x] \n\t" + : [n]"=r"(n) + : [x]"r"(*(const uint32_t *)((const uint8_t *)p + (bits >> 3))) + : + ); + return n << (bits & 7); +} + + +// --------------------------------------------------------------------------- +// +// Helper fns - little bits of code where ARM has an instraction that the +// compiler doesn't know about / use + +#define trans_scale_sat trans_scale_sat_arm +static inline int trans_scale_sat_arm(const int level, const unsigned int scale, const unsigned int scale_m, const unsigned int shift) +{ + int rv; + int t = ((level * (int)(scale * scale_m)) >> shift) + 1; + + __asm__ ( + "ssat %[rv], #16, %[t], ASR #1 \n\t" + : [rv]"=r"(rv) + : [t]"r"(t) + : + ); + return rv; +} + +#define update_rice update_rice_arm +static inline void update_rice_arm(uint8_t * const stat_coeff, + const unsigned int last_coeff_abs_level_remaining, + const unsigned int c_rice_param) +{ + int t = last_coeff_abs_level_remaining << 1; + __asm__ ( + "lsrs %[t], %[t], %[shift] \n\t" + + "it eq \n\t" + "subeq %[stat], %[stat], #1 \n\t" + "cmp %[t], #6 \n\t" + "adc %[stat], %[stat], #0 \n\t" + "usat %[stat], #8, %[stat] \n\t" + : [stat]"+r"(*stat_coeff), + [t]"+r"(t) + : [shift]"r"(c_rice_param) + : "cc" + ); +} + +// --------------------------------------------------------------------------- +// +// CABAC get loops +// +// Where the loop is simple enough we can normally do 10-30% better than the +// compiler + +// Get the residual greater than 1 bits + +#define get_cabac_greater1_bits get_cabac_greater1_bits_arm +static inline unsigned int get_cabac_greater1_bits_arm(CABACContext * const c, const unsigned int n, + uint8_t * const state0) +{ + unsigned int i, reg_b, st, tmp, bit, rv; + __asm__ ( + "mov %[i] , #0 \n\t" + "mov %[rv] , #0 \n\t" + "1: \n\t" + "add %[i] , %[i] , #1 \n\t" + "cmp %[rv] , #0 \n\t" + "ite eq \n\t" + "usateq %[st] , #2 , %[i] \n\t" + "movne %[st] , #0 \n\t" + "sub %[r_b] , %[mlps_tables], %[lps_off] \n\t" + "and %[tmp] , %[range] , #0xC0 \n\t" + + "ldrb %[bit] , [%[state0], %[st]] \n\t" + "add %[r_b] , %[r_b] , %[bit] \n\t" + "ldrb %[tmp] , [%[r_b], %[tmp], lsl #1] \n\t" + "sub %[range] , %[range] , %[tmp] \n\t" + + "cmp %[low] , %[range], lsl #17 \n\t" + "ittt ge \n\t" + "subge %[low] , %[low] , %[range], lsl #17 \n\t" + "movge %[range] , %[tmp] \n\t" + "mvnge %[bit] , %[bit] \n\t" + + "clz %[tmp] , %[range] \n\t" + "sub %[tmp] , #23 \n\t" + "ldrb %[r_b] , [%[mlps_tables], %[bit]] \n\t" + "and %[bit] , %[bit] , #1 \n\t" + "strb %[r_b] , [%[state0], %[st]] \n\t" + "lsl %[low] , %[low] , %[tmp] \n\t" + "orr %[rv] , %[bit] , %[rv], lsl #1 \n\t" + "lsl %[range] , %[range] , %[tmp] \n\t" + +// There is a small speed gain from combining both conditions, using a single +// branch and then working out what that meant later + "lsls %[tmp] , %[low] , #16 \n\t" + "it ne \n\t" + "cmpne %[n] , %[i] \n\t" + "bne 1b \n\t" + +// If reload is not required then we must have run out of flags to decode + "tst %[tmp] , %[tmp] \n\t" + "bne 2f \n\t" + +// Do reload + "ldrh %[tmp] , [%[bptr]] , #2 \n\t" + "rbit %[bit] , %[low] \n\t" + "movw %[r_b] , #0xFFFF \n\t" + "clz %[bit] , %[bit] \n\t" + "rev %[tmp] , %[tmp] \n\t" + "sub %[bit] , %[bit] , #16 \n\t" + "cmp %[n] , %[i] \n\t" + "rsb %[tmp] , %[r_b] , %[tmp], lsr #15 \n\t" + +#if CONFIG_THUMB + "lsl %[tmp] , %[tmp] , %[bit] \n\t" + "add %[low] , %[low] , %[tmp] \n\t" +#else + "add %[low] , %[low] , %[tmp], lsl %[bit] \n\t" +#endif + + "bne 1b \n\t" + "2: \n\t" + : [bit]"=&r"(bit), + [low]"+r"(c->low), + [range]"+r"(c->range), + [r_b]"=&r"(reg_b), + [bptr]"+r"(c->bytestream), + [i]"=&r"(i), + [tmp]"=&r"(tmp), + [st]"=&r"(st), + [rv]"=&r"(rv) + : [state0]"r"(state0), + [n]"r"(n), + [mlps_tables]"r"(ff_h264_cabac_tables + H264_MLPS_STATE_OFFSET + 128), + [lps_off]"I"((H264_MLPS_STATE_OFFSET + 128) - H264_LPS_RANGE_OFFSET) + : "memory", "cc" + ); + return rv; +} + + +// n must be > 0 on entry +#define get_cabac_sig_coeff_flag_idxs get_cabac_sig_coeff_flag_idxs_arm +static inline uint8_t * get_cabac_sig_coeff_flag_idxs_arm(CABACContext * const c, uint8_t * const state0, + unsigned int n, + const uint8_t * ctx_map, + uint8_t * p) +{ + unsigned int reg_b, tmp, st, bit; + __asm__ ( +// Get bin from map +#if CONFIG_THUMB + "add %[ctx_map] , %[n] \n\t" + "ldrb %[st] , [%[ctx_map]] \n\t" +#else + "ldrb %[st] , [%[ctx_map], %[n]]! \n\t" +#endif + "1: \n\t" + +// Load state & ranges + "ldrb %[bit] , [%[state0], %[st]] \n\t" + "and %[tmp] , %[range] , #0xC0 \n\t" + "sub %[r_b] , %[mlps_tables], %[lps_off] \n\t" + "add %[r_b] , %[r_b] , %[tmp], lsl #1 \n\t" + "ldrb %[tmp] , [%[r_b], %[bit]] \n\t" + "sub %[range] , %[range] , %[tmp] \n\t" + + "cmp %[low] , %[range], lsl #17 \n\t" + "ittt ge \n\t" + "mvnge %[bit] , %[bit] \n\t" + "subge %[low] , %[low] , %[range], lsl #17 \n\t" + "movge %[range] , %[tmp] \n\t" + +// Renorm + "clz %[tmp] , %[range] \n\t" + "ldrb %[r_b] , [%[mlps_tables], %[bit]] \n\t" + "sub %[tmp] , #23 \n\t" + "strb %[r_b] , [%[state0], %[st]] \n\t" + "tst %[bit] , #1 \n\t" + "ldrb %[st] , [%[ctx_map], #-1]! \n\t" + "lsl %[low] , %[low] , %[tmp] \n\t" +// GCC asm seems to need strbne written differently for thumb and arm +#if CONFIG_THUMB + "it ne \n\t" + "strbne %[n] , [%[idx]] , #1 \n\t" +#else + "strneb %[n] , [%[idx]] , #1 \n\t" +#endif + +// There is a small speed gain from combining both conditions, using a single +// branch and then working out what that meant later + "subs %[n] , %[n] , #1 \n\t" + "lsl %[range] , %[range] , %[tmp] \n\t" +#if CONFIG_THUMB + "itt ne \n\t" + "lslsne %[tmp] , %[low] , #16 \n\t" +#else + "lslnes %[tmp] , %[low] , #16 \n\t" +#endif + "bne 1b \n\t" + +// If we have bits left then n must be 0 so give up now + "lsls %[tmp] , %[low] , #16 \n\t" + "bne 2f \n\t" + +// Do reload + "ldrh %[tmp] , [%[bptr]] , #2 \n\t" + "rbit %[bit] , %[low] \n\t" + "movw %[r_b] , #0xFFFF \n\t" + "clz %[bit] , %[bit] \n\t" + "cmp %[n] , #0 \n\t" + "rev %[tmp] , %[tmp] \n\t" + "sub %[bit] , %[bit] , #16 \n\t" + "rsb %[tmp] , %[r_b] , %[tmp], lsr #15 \n\t" + +#if CONFIG_THUMB + "lsl %[tmp] , %[tmp] , %[bit] \n\t" + "add %[low] , %[low] , %[tmp] \n\t" +#else + "add %[low] , %[low] , %[tmp], lsl %[bit] \n\t" +#endif + +// Check to see if we still have more to do + "bne 1b \n\t" + "2: \n\t" + : [bit]"=&r"(bit), + [low]"+r"(c->low), + [range]"+r"(c->range), + [r_b]"=&r"(reg_b), + [bptr]"+r"(c->bytestream), + [idx]"+r"(p), + [n]"+r"(n), + [tmp]"=&r"(tmp), + [st]"=&r"(st), + [ctx_map]"+r"(ctx_map) + : [state0]"r"(state0), + [mlps_tables]"r"(ff_h264_cabac_tables + H264_MLPS_STATE_OFFSET + 128), + [lps_off]"I"((H264_MLPS_STATE_OFFSET + 128) - H264_LPS_RANGE_OFFSET) + : "memory", "cc" + ); + + return p; +} + +// --------------------------------------------------------------------------- +// +// CABAC_BY22 functions + + +#define get_cabac_by22_start get_cabac_by22_start_arm +static inline void get_cabac_by22_start_arm(CABACContext * const c) +{ + const uint8_t *ptr = c->bytestream; + register uint32_t low __asm__("r1"), range __asm__("r2"); + uint32_t m, range8, bits; +#if !USE_BY22_DIV + uintptr_t inv; +#endif + + av_assert2(offsetof (CABACContext, low) == 0); + av_assert2(offsetof (CABACContext, range) == 4); + av_assert2(offsetof (CABACContext, by22.range) == offsetof (CABACContext, by22.bits) + 2); + __asm__ volatile ( + "ldmia %[c], {%[low], %[range]} \n\t" + : // Outputs + [low]"=r"(low), + [range]"=r"(range) + : // Inputs + [c]"r"(c) + : // Clobbers + ); +#if !USE_BY22_DIV + inv = (uintptr_t)cabac_by22_inv_range; +#endif + __asm__ volatile ( + "ldr %[m], [%[ptr]], #-("AV_STRINGIFY(CABAC_BITS)"/8) \n\t" +#if !USE_BY22_DIV + "uxtb %[range8], %[range] \n\t" +#endif + "rbit %[bits], %[low] \n\t" + "lsl %[low], %[low], #22 - "AV_STRINGIFY(CABAC_BITS)" \n\t" + "clz %[bits], %[bits] \n\t" + "str %[ptr], [%[c], %[ptr_off]] \n\t" + "rev %[m], %[m] \n\t" + "rsb %[ptr], %[bits], #9 + "AV_STRINGIFY(CABAC_BITS)" \n\t" + "eor %[m], %[m], #0x80000000 \n\t" +#if !USE_BY22_DIV + "ldr %[inv], [%[inv], %[range8], lsl #2] \n\t" + "pkhbt %[range], %[bits], %[range], lsl #16 \n\t" + "str %[range], [%[c], %[bits_off]] \n\t" +#else + "strh %[bits], [%[c], %[bits_off]] \n\t" +#endif +#if CONFIG_THUMB + "lsr %[m], %[ptr] \n\t" + "eor %[range], %[low], %[m] \n\t" +#else + "eor %[range], %[low], %[m], lsr %[ptr] \n\t" +#endif + : // Outputs + [ptr]"+&r"(ptr), + [low]"+&r"(low), + [range]"+&r"(range), +#if !USE_BY22_DIV + [inv]"+&r"(inv), +#endif + [m]"=&r"(m), + [range8]"=&r"(range8), + [bits]"=&r"(bits) + : // Inputs + [c]"r"(c), + [bits_off]"J"(offsetof (CABACContext, by22.bits)), + [ptr_off]"J"(offsetof (CABACContext, bytestream)) + : // Clobbers + "memory" + ); + c->low = range; +#if !USE_BY22_DIV + c->range = inv; +#endif +} + +#define get_cabac_by22_peek get_cabac_by22_peek_arm +static inline uint32_t get_cabac_by22_peek_arm(const CABACContext *const c) +{ + uint32_t rv = c->low &~ 1, tmp; + __asm__ ( + "cmp %[inv] , #0 \n\t" + "it ne \n\t" + "umullne %[tmp] , %[rv] , %[inv], %[rv] \n\t" + : // Outputs + [rv]"+r"(rv), + [tmp]"=r"(tmp) + : // Inputs + [inv]"r"(c->range) + : // Clobbers + "cc" + ); + return rv << 1; +} + +#define get_cabac_by22_flush get_cabac_by22_flush_arm +static inline void get_cabac_by22_flush_arm(CABACContext *const c, const unsigned int n, uint32_t val) +{ + uint32_t bits, ptr, tmp1, tmp2; + __asm__ volatile ( + "ldrh %[bits], [%[cc], %[bits_off]] \n\t" + "ldr %[ptr], [%[cc], %[ptr_off]] \n\t" + "rsb %[tmp1], %[n], #32 \n\t" + "add %[bits], %[bits], %[n] \n\t" + "ldrh %[tmp2], [%[cc], %[range_off]] \n\t" + "lsr %[tmp1], %[val], %[tmp1] \n\t" + "ldr %[val], [%[cc], %[low_off]] \n\t" +#if CONFIG_THUMB + "add %[ptr], %[ptr], %[bits], lsr #3 \n\t" + "ldr %[ptr], [%[ptr]] \n\t" +#else + "ldr %[ptr], [%[ptr], %[bits], lsr #3] \n\t" +#endif + "mul %[tmp1], %[tmp2], %[tmp1] \n\t" + "and %[tmp2], %[bits], #7 \n\t" + "strh %[bits], [%[cc], %[bits_off]] \n\t" + "rev %[ptr], %[ptr] \n\t" + "lsl %[tmp1], %[tmp1], #23 \n\t" +#if CONFIG_THUMB + "lsl %[val], %[n] \n\t" + "sub %[val], %[tmp1] \n\t" +#else + "rsb %[val], %[tmp1], %[val], lsl %[n] \n\t" +#endif + "lsl %[ptr], %[ptr], %[tmp2] \n\t" + "orr %[val], %[val], %[ptr], lsr #9 \n\t" + "str %[val], [%[cc], %[low_off]] \n\t" + : // Outputs + [val]"+r"(val), + [bits]"=&r"(bits), + [ptr]"=&r"(ptr), + [tmp1]"=&r"(tmp1), + [tmp2]"=&r"(tmp2) + : // Inputs + [cc]"r"(c), + [n]"r"(n), + [bits_off]"J"(offsetof(CABACContext, by22.bits)), + [ptr_off]"J"(offsetof(CABACContext, bytestream)), + [range_off]"J"(offsetof(CABACContext, by22.range)), + [low_off]"J"(offsetof(CABACContext, low)) + : // Clobbers + "memory" + ); +} + +#define coeff_abs_level_remaining_decode_bypass coeff_abs_level_remaining_decode_bypass_arm +static inline int coeff_abs_level_remaining_decode_bypass_arm(CABACContext *const c, unsigned int rice_param) +{ + uint32_t last_coeff_abs_level_remaining; + uint32_t prefix, n1, range, n2, ptr, tmp1, tmp2; + __asm__ volatile ( + "ldr %[remain], [%[cc], %[low_off]] \n\t" + "ldr %[prefix], [%[cc], %[range_off]] \n\t" + "bic %[remain], %[remain], #1 \n\t" + "ldrh %[tmp2], [%[cc], %[by22_bits_off]] \n\t" + "ldr %[ptr], [%[cc], %[ptr_off]] \n\t" + "cmp %[prefix], #0 \n\t" + "it ne \n\t" + "umullne %[prefix], %[remain], %[prefix], %[remain] \n\t" + "ldrh %[range], [%[cc], %[by22_range_off]] \n\t" + "lsl %[remain], %[remain], #1 \n\t" + "mvn %[prefix], %[remain] \n\t" + "clz %[prefix], %[prefix] \n\t" + "rsbs %[n1], %[prefix], #2 \n\t" + "bcc 1f \n\t" + "adc %[n1], %[rice], %[prefix] \n\t" + "add %[tmp2], %[tmp2], %[n1] \n\t" + "rsb %[n2], %[n1], #32 \n\t" + "and %[tmp1], %[tmp2], #7 \n\t" + "strh %[tmp2], [%[cc], %[by22_bits_off]] \n\t" + "lsr %[tmp2], %[tmp2], #3 \n\t" + "lsr %[n2], %[remain], %[n2] \n\t" + "mul %[n2], %[range], %[n2] \n\t" + "ldr %[range], [%[cc], %[low_off]] \n\t" + "ldr %[ptr], [%[ptr], %[tmp2]] \n\t" + "rsb %[tmp2], %[rice], #31 \n\t" + "lsl %[remain], %[remain], %[prefix] \n\t" + "lsl %[n2], %[n2], #23 \n\t" +#if CONFIG_THUMB + "lsl %[range], %[n1] \n\t" + "sub %[range], %[n2] \n\t" +#else + "rsb %[range], %[n2], %[range], lsl %[n1] \n\t" +#endif + "rev %[ptr], %[ptr] \n\t" + "lsl %[n2], %[prefix], %[rice] \n\t" +#if CONFIG_THUMB + "lsr %[remain], %[tmp2] \n\t" + "add %[remain], %[n2] \n\t" +#else + "add %[remain], %[n2], %[remain], lsr %[tmp2] \n\t" +#endif + "b 3f \n\t" + "1: \n\t" + "add %[n2], %[rice], %[prefix], lsl #1 \n\t" + "cmp %[n2], %[peek_bits_plus_2] \n\t" + "bhi 2f \n\t" + "sub %[n1], %[n2], #2 \n\t" + "add %[tmp2], %[tmp2], %[n1] \n\t" + "rsb %[n2], %[n1], #32 \n\t" + "strh %[tmp2], [%[cc], %[by22_bits_off]] \n\t" + "lsr %[tmp1], %[tmp2], #3 \n\t" + "lsr %[n2], %[remain], %[n2] \n\t" + "mul %[n2], %[range], %[n2] \n\t" + "rsb %[range], %[rice], #34 \n\t" + "ldr %[ptr], [%[ptr], %[tmp1]] \n\t" + "and %[tmp1], %[tmp2], #7 \n\t" + "lsl %[remain], %[remain], %[prefix] \n\t" + "ldr %[tmp2], [%[cc], %[low_off]] \n\t" + "rsb %[prefix], %[prefix], %[range] \n\t" + "orr %[remain], %[remain], #0x80000000 \n\t" + "rev %[ptr], %[ptr] \n\t" + "lsl %[n2], %[n2], #23 \n\t" + "mov %[range], #2 \n\t" +#if CONFIG_THUMB + "lsl %[tmp2], %[n1] \n\t" + "sub %[tmp2], %[n2] \n\t" +#else + "rsb %[tmp2], %[n2], %[tmp2], lsl %[n1] \n\t" +#endif + "lsl %[ptr], %[ptr], %[tmp1] \n\t" + "lsl %[rice], %[range], %[rice] \n\t" + "orr %[range], %[tmp2], %[ptr], lsr #9 \n\t" +#if CONFIG_THUMB + "lsr %[remain], %[prefix] \n\t" + "add %[remain], %[rice] \n\t" +#else + "add %[remain], %[rice], %[remain], lsr %[prefix] \n\t" +#endif + "b 4f \n\t" + "2: \n\t" + "add %[n1], %[tmp2], %[prefix] \n\t" +#if CONFIG_THUMB + "add %[tmp2], %[ptr], %[n1], lsr #3 \n\t" + "ldr %[tmp2], [%[tmp2]] \n\t" +#else + "ldr %[tmp2], [%[ptr], %[n1], lsr #3] \n\t" +#endif + "rsb %[tmp1], %[prefix], #32 \n\t" + "push {%[rice]} \n\t" + "and %[rice], %[n1], #7 \n\t" + "lsr %[tmp1], %[remain], %[tmp1] \n\t" + "ldr %[ptr], [%[cc], %[low_off]] \n\t" + "mul %[remain], %[range], %[tmp1] \n\t" + "rev %[tmp2], %[tmp2] \n\t" + "rsb %[n2], %[prefix], %[n2] \n\t" + "ldr %[tmp1], [%[cc], %[range_off]] \n\t" + "lsl %[rice], %[tmp2], %[rice] \n\t" + "sub %[tmp2], %[n2], #2 \n\t" + "lsl %[remain], %[remain], #23 \n\t" +#if CONFIG_THUMB + "lsl %[ptr], %[prefix] \n\t" + "rsb %[remain], %[ptr] \n\t" +#else + "rsb %[remain], %[remain], %[ptr], lsl %[prefix] \n\t" +#endif + "orr %[remain], %[remain], %[rice], lsr #9 \n\t" + "add %[prefix], %[n1], %[tmp2] \n\t" + "bic %[n1], %[remain], #1 \n\t" + "ldr %[ptr], [%[cc], %[ptr_off]] \n\t" + "cmp %[tmp1], #0 \n\t" + "rsb %[rice], %[tmp2], #32 \n\t" + "it ne \n\t" + "umullne %[tmp1], %[n1], %[tmp1], %[n1] \n\t" + "and %[tmp1], %[prefix], #7 \n\t" +#if CONFIG_THUMB + "add %[ptr], %[ptr], %[prefix], lsr #3 \n\t" + "ldr %[ptr], [%[ptr]] \n\t" +#else + "ldr %[ptr], [%[ptr], %[prefix], lsr #3] \n\t" +#endif + "lsl %[n1], %[n1], #1 \n\t" + "lsr %[rice], %[n1], %[rice] \n\t" + "rsb %[n2], %[n2], #34 \n\t" + "mul %[range], %[range], %[rice] \n\t" + "pop {%[rice]} \n\t" + "rev %[ptr], %[ptr] \n\t" + "orr %[n1], %[n1], #0x80000000 \n\t" + "strh %[prefix], [%[cc], %[by22_bits_off]] \n\t" + "mov %[prefix], #2 \n\t" + "lsl %[range], %[range], #23 \n\t" +#if CONFIG_THUMB + "lsl %[remain], %[tmp2] \n\t" + "rsb %[range], %[remain] \n\t" +#else + "rsb %[range], %[range], %[remain], lsl %[tmp2] \n\t" +#endif + "lsl %[remain], %[prefix], %[rice] \n\t" +#if CONFIG_THUMB + "lsr %[n1], %[n2] \n\t" + "add %[remain], %[n1] \n\t" +#else + "add %[remain], %[remain], %[n1], lsr %[n2] \n\t" +#endif + "3: \n\t" + "lsl %[ptr], %[ptr], %[tmp1] \n\t" + "orr %[range], %[range], %[ptr], lsr #9 \n\t" + "4: \n\t" + "str %[range], [%[cc], %[low_off]] \n\t" + : // Outputs + [remain]"=&r"(last_coeff_abs_level_remaining), + [rice]"+r"(rice_param), + [prefix]"=&r"(prefix), + [n1]"=&r"(n1), + [range]"=&r"(range), + [n2]"=&r"(n2), + [ptr]"=&r"(ptr), + [tmp1]"=&r"(tmp1), + [tmp2]"=&r"(tmp2) + : // Inputs + [cc]"r"(c), + [peek_bits_plus_2]"I"(CABAC_BY22_PEEK_BITS + 2), + [low_off]"J"(offsetof(CABACContext, low)), + [range_off]"J"(offsetof(CABACContext, range)), + [by22_bits_off]"J"(offsetof(CABACContext, by22.bits)), + [by22_range_off]"J"(offsetof(CABACContext, by22.range)), + [ptr_off]"J"(offsetof(CABACContext, bytestream)) + : // Clobbers + "cc", "memory" + ); + return last_coeff_abs_level_remaining; +} + +#endif /* HAVE_ARMV6T2_INLINE */ + +#endif /* AVCODEC_ARM_HEVC_CABAC_H */ diff --git a/libavcodec/arm/rpi_hevc_idct_fn_neon.S b/libavcodec/arm/rpi_hevc_idct_fn_neon.S new file mode 100644 index 0000000000..978b7b6947 --- /dev/null +++ b/libavcodec/arm/rpi_hevc_idct_fn_neon.S @@ -0,0 +1,183 @@ +/* + * ARM NEON optimised IDCT functions for HEVC decoding + * Copyright (c) 2014 Seppo Tomperi + * Copyright (C) 2018 John Cox, ben Avison for Raspberry Pi (Trading) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@ Included multiple times from hevc_idct_neon.S +@ Macros defined there + +#define DC_SHIFT (15 - BIT_DEPTH) +#define DC_ADD (1 | (1 << (14 - BIT_DEPTH))) +#define TRN_SHIFT (20 - BIT_DEPTH) + +function JOIN(ff_hevc_rpi_idct_4x4_dc_neon_, BIT_DEPTH), export=1 + ldrsh r1, [r0] + add r1, #DC_ADD + asr r1, #DC_SHIFT + vdup.16 q0, r1 + vdup.16 q1, r1 + vst1.16 {q0, q1}, [r0] + bx lr +endfunc + +function JOIN(ff_hevc_rpi_idct_8x8_dc_neon_, BIT_DEPTH), export=1 + ldrsh r1, [r0] + add r2, r0, #32 + mov r3, #64 + add r1, #DC_ADD + asr r1, #DC_SHIFT + vdup.16 q8, r1 + vdup.16 q9, r1 + vst1.16 {q8, q9}, [r0], r3 + vst1.16 {q8, q9}, [r2], r3 + vst1.16 {q8, q9}, [r0] + vst1.16 {q8, q9}, [r2] + bx lr +endfunc + +function JOIN(ff_hevc_rpi_idct_16x16_dc_neon_, BIT_DEPTH), export=1 + ldrsh r1, [r0] + add r2, r0, #32 + mov r3, #64 + add r1, #DC_ADD + mov ip, #16*16 + asr r1, #DC_SHIFT + vdup.16 q8, r1 + vdup.16 q9, r1 +1: vst1.16 {q8, q9}, [r0], r3 + subs ip, ip, #32 + vst1.16 {q8, q9}, [r2], r3 + bhi 1b + bx lr +endfunc + +function JOIN(ff_hevc_rpi_idct_32x32_dc_neon_, BIT_DEPTH), export=1 + ldrsh r1, [r0] + add r2, r0, #32 + mov r3, #64 + add r1, #DC_ADD + mov ip, #32*32 + asr r1, #DC_SHIFT + vdup.16 q8, r1 + vdup.16 q9, r1 +1: vst1.16 {q8, q9}, [r0], r3 + subs ip, ip, #32 + vst1.16 {q8, q9}, [r2], r3 + bhi 1b + bx lr +endfunc + + +function JOIN(ff_hevc_rpi_transform_4x4_neon_, BIT_DEPTH), export=1 + vldr.i32 s0, =0x00240053 // 36 and 83 + vld1.16 {q14, q15}, [r0 :256] // coeffs + + tr4_shift #7 + + vzip.16 d28, d29 + vzip.16 d30, d31 + vzip.32 q14, q15 + + tr4_shift #TRN_SHIFT + + vst4.16 {q14, q15}, [r0 :256] + bx lr + + .ltorg +endfunc + + + +function JOIN(ff_hevc_rpi_transform_luma_4x4_neon_, BIT_DEPTH), export=1 + vmov.i32 d0, #0x4a // 74 + vld1.16 {q14, q15}, [r0 :256] // coeffs + vmov.i32 d1, #0x1d // 29 + vmov.i32 d2, #0x37 // 55 + + tr4_luma_shift #7 + + vzip.16 d28, d29 + vzip.16 d30, d31 + vzip.32 q14, q15 + + tr4_luma_shift #TRN_SHIFT + + vst4.16 {q14, q15}, [r0 :256] + bx lr +endfunc + +function JOIN(ff_hevc_rpi_transform_8x8_neon_, BIT_DEPTH), export=1 + add r2, r0, #16 + adr r3, tr4f + vpush {d8-d15} + vld1.16 {d0, d1}, [r3] + mov r3, #32 + + tr8_vert d16, d17, d18, d19, d24, d25, d26, d27, q8, q9, \ + "sub r0, r0, #128-8", \ + "sub r2, r2, #128-8", \ + "cmp r1, #4" + ble 2f + + tr8_vert d20, d21, d22, d23, d28, d29, d30, d31, q10, q11, \ + "sub r0, r0, #128+8", \ + "sub r2, r2, #128+8+16-32", \ + "mov r3, #64" + + vzip.16 d16, d17 + vzip.16 d18, d19 + + vzip.16 d20, d21 + vzip.16 d22, d23 + vzip.16 d28, d29 + vzip.16 d30, d31 + vzip.32 q10, q11 + vzip.32 q14, q15 +1: + vzip.16 d24, d25 + vzip.16 d26, d27 + vzip.32 q8, q9 + vzip.32 q12, q13 + + tr8_horiz d16, d17, d18, d19, d20, d21, d22, d23, q8, q9, TRN_SHIFT + tr8_horiz d24, d25, d26, d27, d28, d29, d30, d31, q12, q13, TRN_SHIFT + + vpop {d8-d15} + bx lr + +2: vmov.i64 q10, #0 + sub r0, r0, #8 + vmov.i64 q11, #0 + sub r2, r2, #8+16-32 + vmov.i64 q14, #0 + mov r3, #64 + vmov.i64 q15, #0 + + vzip.16 d16, d17 + vzip.16 d18, d19 + + b 1b + +endfunc + +#undef DC_SHIFT +#undef DC_ADD +#undef TRN_SHIFT + diff --git a/libavcodec/arm/rpi_hevc_misc_neon.S b/libavcodec/arm/rpi_hevc_misc_neon.S new file mode 100644 index 0000000000..161bb0d7c9 --- /dev/null +++ b/libavcodec/arm/rpi_hevc_misc_neon.S @@ -0,0 +1,267 @@ +/* +Copyright (c) 2017 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Written by John Cox, Ben Avison +*/ + +#include "libavutil/arm/asm.S" +#include "neon.S" + +@ rpi_zap_coeff_vals_neon( +@ uint16_t * buf, [r0] +@ unsigned int log_n_m2) [r1] + +function rpi_zap_coeff_vals_neon, export=1 + mov ip, #1 + vmov.i64 q0, #0 + teq r1, #0 + vmov.i64 q1, #0 + beq 2f + + lsl ip, r1 @ 2, 4 or 8 + add r2, r0, #32 + lsl ip, r1 @ 4, 16 or 64 = number of 32-byte blocks to zero + mov r3, #64 +1: vst1.8 {q0,q1}, [r0:256], r3 + subs ip, #2 + vst1.8 {q0,q1}, [r2:256], r3 + bne 1b + bx lr + +2: vst1.8 {q0,q1}, [r0:256] + bx lr +endfunc + +@ PIC jump tables are more expensive than absolute for A32 code +.set jent_pic, CONFIG_PIC || CONFIG_THUMB + +@ Jump table entry - if in neon mode the bottom bit must be set +@ ? There is probably a real asm instruction to do this but I haven't found it +.macro jent lab +.if jent_pic +T .short ((0 + \lab) - (0 + 98b)) / 2 +A .short (0 + \lab) - (4 + 98b) +.else +T .word 1 + \lab +A .word \lab +.endif +.endm + +.set expected_next, 0 + +.macro cpy_compound val, p1, p2, drop_thru=0 +.if \p1 + \p2 != \val +.error "Bad addition! \p1 + \p2 != \val" +.endif +.if expected_next != 0 && expected_next != \val +.error "Drop thru failure" +.endif +\val\(): + push {r0-r3} + bl 100\p1\()b + pop {r0-r3} + add r0, #\p1 + add r2, #\p1 +.if \drop_thru == 0 + b \p2\()b +.set expected_next, 0 +.else +.set expected_next, \p2 +.endif +.endm + +@ ff_hevc_cpy_blks8x4_neon( +@ dst [r0] +@ dst_stride [r1] +@ src [r2] +@ src_stride [r3] +@ width [sp, #0] (bytes) +@ height) [sp, #4] +@ +@ Power of 2 widths are directly coded, all others are done in stripes +@ We expect the vast majority of calls to be power of 2 +@ +@ Currently has min width of 8, but we could make that 4 without issue +@ Min height is 4 + +function ff_hevc_rpi_cpy_blks8x4_neon, export=1 + ldr r12, [sp, #0] + push {r11, lr} +.if jent_pic +A adr lr, 98f - 2 +.else +A adr lr, 98f - 4 +.endif + lsr r12, #3 + ldr r11, [sp, #(8 + 4)] +.if jent_pic +A lsl r12, #1 +A ldrsh lr, [lr, r12] +A add pc, lr +T tbh [pc, r12, lsl #1] +.else + @ A32 only, Thumb is always PIC + ldr pc, [lr, r12, lsl #2] +.endif + +98: +T .short 0 @ unused + jent 8f + jent 16f + jent 24f + jent 32f + jent 40f + jent 48f + jent 56f + jent 64f + jent 72f + jent 80f + jent 88f + jent 96f + jent 104f + jent 112f + jent 120f + jent 128f + +1008: + push {r11, lr} +8: + add lr, r2, r3 + lsl r3, #1 + add r12, r0, r1 + lsl r1, #1 +1: + vld1.32 {d0 }, [r2], r3 + vld1.32 {d1 }, [lr], r3 + vld1.32 {d2 }, [r2], r3 + vld1.32 {d3 }, [lr], r3 + subs r11, #4 + vst1.32 {d0 }, [r0], r1 + vst1.32 {d1 }, [r12], r1 + vst1.32 {d2 }, [r0], r1 + vst1.32 {d3 }, [r12], r1 + bgt 1b + pop {r11, pc} + +10016: + push {r11, lr} +16: + add lr, r2, r3 + lsl r3, #1 + add r12, r0, r1 + lsl r1, #1 +1: + vld1.32 {q0 }, [r2], r3 + vld1.32 {q1 }, [lr], r3 + vld1.32 {q2 }, [r2], r3 + vld1.32 {q3 }, [lr], r3 + subs r11, #4 + vst1.32 {q0 }, [r0], r1 + vst1.32 {q1 }, [r12], r1 + vst1.32 {q2 }, [r0], r1 + vst1.32 {q3 }, [r12], r1 + bgt 1b + pop {r11, pc} + +10032: + push {r11, lr} +32: + add lr, r2, r3 + lsl r3, #1 + add r12, r0, r1 + lsl r1, #1 +1: + vld1.32 {q8, q9 }, [r2], r3 + vld1.32 {q10, q11}, [lr], r3 + vld1.32 {q12, q13}, [r2], r3 + vld1.32 {q14, q15}, [lr], r3 + subs r11, #4 + vst1.32 {q8, q9 }, [r0], r1 + vst1.32 {q10, q11}, [r12], r1 + vst1.32 {q12, q13}, [r0], r1 + vst1.32 {q14, q15}, [r12], r1 + bgt 1b + pop {r11, pc} + +10064: + push {r11, lr} +64: + add lr, r2, #32 + add r12, r0, #32 +1: + vld1.32 {q8, q9 }, [r2], r3 + vld1.32 {q10, q11}, [lr], r3 + vld1.32 {q12, q13}, [r2], r3 + vld1.32 {q14, q15}, [lr], r3 + subs r11, #2 + vst1.32 {q8, q9 }, [r0], r1 + vst1.32 {q10, q11}, [r12], r1 + vst1.32 {q12, q13}, [r0], r1 + vst1.32 {q14, q15}, [r12], r1 + bgt 1b + pop {r11, pc} + +128: + push {r4, r5} + @ We could do this with fewer registers if we jump around but I + @ have a primative urge to load sequentially + mov r4, #64 + add lr, r2, #32 + add r12, r0, #32 + sub r3, r4 + sub r1, r4 +1: + vld1.32 {q8, q9 }, [r2], r4 + vld1.32 {q10, q11}, [lr], r4 + vld1.32 {q12, q13}, [r2], r3 + vld1.32 {q14, q15}, [lr], r3 + subs r11, #1 + vst1.32 {q8, q9 }, [r0], r4 + vst1.32 {q10, q11}, [r12], r4 + vst1.32 {q12, q13}, [r0], r1 + vst1.32 {q14, q15}, [r12], r1 + bgt 1b + pop {r4, r5, r11, pc} + +@ Use drop_thru where we can +cpy_compound 104, 64, 40, 1 +cpy_compound 40, 32, 8 + +cpy_compound 112, 64, 48, 1 +cpy_compound 48, 32, 16 + +cpy_compound 120, 64, 56, 1 +cpy_compound 56, 32, 24, 1 +cpy_compound 24, 16, 8 + +cpy_compound 72, 64, 8 +cpy_compound 80, 64, 16 +cpy_compound 88, 64, 24 +cpy_compound 96, 64, 32 + + +endfunc + diff --git a/libavcodec/arm/rpi_hevc_misc_neon.h b/libavcodec/arm/rpi_hevc_misc_neon.h new file mode 100644 index 0000000000..9d21f6a882 --- /dev/null +++ b/libavcodec/arm/rpi_hevc_misc_neon.h @@ -0,0 +1,438 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_ARM_RPI_HEVC_MISC_H +#define AVCODEC_ARM_RPI_HEVC_MISC_H + +#include "config.h" +#if HAVE_NEON_INLINE && !CONFIG_THUMB + +static av_noinline void ff_hevc_rpi_copy_vert_v2h_neon(uint8_t *dst, const uint8_t *src, + int pixel_shift, int height, + ptrdiff_t stride_src) +{ + const uint8_t *src2 = src + stride_src; + stride_src <<= 1; + switch (pixel_shift) + { + case 2: + __asm__ volatile ( + "vld1.32 {d0[0]}, [%[src]], %[stride_src] \n\t" + "vld1.32 {d0[1]}, [%[src2]], %[stride_src] \n\t" + "vld1.32 {d1[0]}, [%[src]], %[stride_src] \n\t" + "subs %[height], #4 \n\t" + "vld1.32 {d1[1]}, [%[src2]], %[stride_src] \n\t" + "beq 2f \n\t" + "1: \n\t" + "vld1.32 {d2[0]}, [%[src]], %[stride_src] \n\t" + "vld1.32 {d2[1]}, [%[src2]], %[stride_src] \n\t" + "vld1.32 {d3[0]}, [%[src]], %[stride_src] \n\t" + "vld1.32 {d3[1]}, [%[src2]], %[stride_src] \n\t" + "subs %[height], #4 \n\t" + "vst1.32 {q0}, [%[dst]]! \n\t" + "beq 3f \n\t" + "vld1.32 {d0[0]}, [%[src]], %[stride_src] \n\t" + "vld1.32 {d0[1]}, [%[src2]], %[stride_src] \n\t" + "vld1.32 {d1[0]}, [%[src]], %[stride_src] \n\t" + "vld1.32 {d1[1]}, [%[src2]], %[stride_src] \n\t" + "subs %[height], #4 \n\t" + "vst1.32 {q1}, [%[dst]]! \n\t" + "bne 1b \n\t" + "2: \n\t" + "vst1.32 {q0}, [%[dst]] \n\t" + "b 4f \n\t" + "3: \n\t" + "vst1.32 {q1}, [%[dst]] \n\t" + "4: \n\t" + : // Outputs + [src]"+r"(src), + [src2]"+r"(src2), + [dst]"+r"(dst), + [height]"+r"(height) + : // Inputs + [stride_src]"r"(stride_src) + : // Clobbers + "cc", "memory" + ); + break; + case 1: + __asm__ volatile ( + "vld1.16 {d0[0]}, [%[src]], %[stride_src] \n\t" + "vld1.16 {d1[0]}, [%[src2]], %[stride_src] \n\t" + "vld1.16 {d0[1]}, [%[src]], %[stride_src] \n\t" + "subs %[height], #4 \n\t" + "vld1.16 {d1[1]}, [%[src2]], %[stride_src] \n\t" + "beq 2f \n\t" + "1: \n\t" + "vld1.16 {d2[0]}, [%[src]], %[stride_src] \n\t" + "vld1.16 {d3[0]}, [%[src2]], %[stride_src] \n\t" + "vld1.16 {d2[1]}, [%[src]], %[stride_src] \n\t" + "vld1.16 {d3[1]}, [%[src2]], %[stride_src] \n\t" + "vzip.16 d0, d1 \n\t" + "subs %[height], #4 \n\t" + "vst1.16 {d0}, [%[dst]]! \n\t" + "beq 3f \n\t" + "vld1.16 {d0[0]}, [%[src]], %[stride_src] \n\t" + "vld1.16 {d1[0]}, [%[src2]], %[stride_src] \n\t" + "vld1.16 {d0[1]}, [%[src]], %[stride_src] \n\t" + "vld1.16 {d1[1]}, [%[src2]], %[stride_src] \n\t" + "vzip.16 d2, d3 \n\t" + "subs %[height], #4 \n\t" + "vst1.16 {d2}, [%[dst]]! \n\t" + "bne 1b \n\t" + "2: \n\t" + "vzip.16 d0, d1 \n\t" + "vst1.16 {d0}, [%[dst]] \n\t" + "b 4f \n\t" + "3: \n\t" + "vzip.16 d2, d3 \n\t" + "vst1.16 {d2}, [%[dst]] \n\t" + "4: \n\t" + : // Outputs + [src]"+r"(src), + [src2]"+r"(src2), + [dst]"+r"(dst), + [height]"+r"(height) + : // Inputs + [stride_src]"r"(stride_src) + : // Clobbers + "cc", "memory" + ); + break; + default: + __asm__ volatile ( + "vld1.8 {d0[0]}, [%[src]], %[stride_src] \n\t" + "vld1.8 {d1[0]}, [%[src2]], %[stride_src] \n\t" + "vld1.8 {d0[1]}, [%[src]], %[stride_src] \n\t" + "vld1.8 {d1[1]}, [%[src2]], %[stride_src] \n\t" + "vld1.8 {d0[2]}, [%[src]], %[stride_src] \n\t" + "vld1.8 {d1[2]}, [%[src2]], %[stride_src] \n\t" + "vld1.8 {d0[3]}, [%[src]], %[stride_src] \n\t" + "subs %[height], #8 \n\t" + "vld1.8 {d1[3]}, [%[src2]], %[stride_src] \n\t" + "beq 2f \n\t" + "1: \n\t" + "vld1.8 {d2[0]}, [%[src]], %[stride_src] \n\t" + "vld1.8 {d3[0]}, [%[src2]], %[stride_src] \n\t" + "vld1.8 {d2[1]}, [%[src]], %[stride_src] \n\t" + "vld1.8 {d3[1]}, [%[src2]], %[stride_src] \n\t" + "vld1.8 {d2[2]}, [%[src]], %[stride_src] \n\t" + "vld1.8 {d3[2]}, [%[src2]], %[stride_src] \n\t" + "vld1.8 {d2[3]}, [%[src]], %[stride_src] \n\t" + "vld1.8 {d3[3]}, [%[src2]], %[stride_src] \n\t" + "vzip.8 d0, d1 \n\t" + "subs %[height], #8 \n\t" + "vst1.8 {d0}, [%[dst]]! \n\t" + "beq 3f \n\t" + "vld1.8 {d0[0]}, [%[src]], %[stride_src] \n\t" + "vld1.8 {d1[0]}, [%[src2]], %[stride_src] \n\t" + "vld1.8 {d0[1]}, [%[src]], %[stride_src] \n\t" + "vld1.8 {d1[1]}, [%[src2]], %[stride_src] \n\t" + "vld1.8 {d0[2]}, [%[src]], %[stride_src] \n\t" + "vld1.8 {d1[2]}, [%[src2]], %[stride_src] \n\t" + "vld1.8 {d0[3]}, [%[src]], %[stride_src] \n\t" + "vld1.8 {d1[3]}, [%[src2]], %[stride_src] \n\t" + "vzip.8 d2, d3 \n\t" + "subs %[height], #8 \n\t" + "vst1.8 {d2}, [%[dst]]! \n\t" + "bne 1b \n\t" + "2: \n\t" + "vzip.8 d0, d1 \n\t" + "vst1.8 {d0}, [%[dst]] \n\t" + "b 4f \n\t" + "3: \n\t" + "vzip.8 d2, d3 \n\t" + "vst1.8 {d2}, [%[dst]] \n\t" + "4: \n\t" + : // Outputs + [src]"+r"(src), + [src2]"+r"(src2), + [dst]"+r"(dst), + [height]"+r"(height) + : // Inputs + [stride_src]"r"(stride_src) + : // Clobbers + "cc", "memory" + ); + break; + } +} + +static av_noinline void ff_hevc_rpi_copy_vert_h2v_neon(uint8_t *dst, const uint8_t *src, + int pixel_shift, int height, + ptrdiff_t stride_dst) +{ + uint8_t *dst2 = dst + stride_dst; + stride_dst <<= 1; + switch (pixel_shift) + { + case 2: + __asm__ volatile ( + "subs %[height], #4 \n\t" + "vld1.32 {q0}, [%[src]]! \n\t" + "beq 2f \n\t" + "1: \n\t" + "vld1.32 {q1}, [%[src]]! \n\t" + "vst1.32 {d0[0]}, [%[dst]], %[stride_dst] \n\t" + "vst1.32 {d0[1]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.32 {d1[0]}, [%[dst]], %[stride_dst] \n\t" + "subs %[height], #4 \n\t" + "vst1.32 {d1[1]}, [%[dst2]], %[stride_dst] \n\t" + "beq 3f \n\t" + "vld1.32 {q0}, [%[src]]! \n\t" + "vst1.32 {d2[0]}, [%[dst]], %[stride_dst] \n\t" + "vst1.32 {d2[1]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.32 {d3[0]}, [%[dst]], %[stride_dst] \n\t" + "subs %[height], #4 \n\t" + "vst1.32 {d3[1]}, [%[dst2]], %[stride_dst] \n\t" + "bne 1b \n\t" + "2: \n\t" + "vst1.32 {d0[0]}, [%[dst]], %[stride_dst] \n\t" + "vst1.32 {d0[1]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.32 {d1[0]}, [%[dst]] \n\t" + "vst1.32 {d1[1]}, [%[dst2]] \n\t" + "b 4f \n\t" + "3: \n\t" + "vst1.32 {d2[0]}, [%[dst]], %[stride_dst] \n\t" + "vst1.32 {d2[1]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.32 {d3[0]}, [%[dst]] \n\t" + "vst1.32 {d3[1]}, [%[dst2]] \n\t" + "4: \n\t" + : // Outputs + [dst]"+r"(dst), + [dst2]"+r"(dst2), + [src]"+r"(src), + [height]"+r"(height) + : // Inputs + [stride_dst]"r"(stride_dst) + : // Clobbers + "cc", "memory" + ); + break; + case 1: + __asm__ volatile ( + "subs %[height], #4 \n\t" + "vld1.16 {d0}, [%[src]]! \n\t" + "beq 2f \n\t" + "1: \n\t" + "vld1.16 {d2}, [%[src]]! \n\t" + "vst1.16 {d0[0]}, [%[dst]], %[stride_dst] \n\t" + "vst1.16 {d0[1]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.16 {d0[2]}, [%[dst]], %[stride_dst] \n\t" + "subs %[height], #4 \n\t" + "vst1.16 {d0[3]}, [%[dst2]], %[stride_dst] \n\t" + "beq 3f \n\t" + "vld1.16 {d0}, [%[src]]! \n\t" + "vst1.16 {d2[0]}, [%[dst]], %[stride_dst] \n\t" + "vst1.16 {d2[1]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.16 {d2[2]}, [%[dst]], %[stride_dst] \n\t" + "subs %[height], #4 \n\t" + "vst1.16 {d2[3]}, [%[dst2]], %[stride_dst] \n\t" + "bne 1b \n\t" + "2: \n\t" + "vst1.16 {d0[0]}, [%[dst]], %[stride_dst] \n\t" + "vst1.16 {d0[1]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.16 {d0[2]}, [%[dst]] \n\t" + "vst1.16 {d0[3]}, [%[dst2]] \n\t" + "b 4f \n\t" + "3: \n\t" + "vst1.16 {d2[0]}, [%[dst]], %[stride_dst] \n\t" + "vst1.16 {d2[1]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.16 {d2[2]}, [%[dst]] \n\t" + "vst1.16 {d2[3]}, [%[dst2]] \n\t" + "4: \n\t" + : // Outputs + [dst]"+r"(dst), + [dst2]"+r"(dst2), + [src]"+r"(src), + [height]"+r"(height) + : // Inputs + [stride_dst]"r"(stride_dst) + : // Clobbers + "cc", "memory" + ); + break; + default: + __asm__ volatile ( + "subs %[height], #8 \n\t" + "vld1.8 {d0}, [%[src]]! \n\t" + "beq 2f \n\t" + "1: \n\t" + "vld1.8 {d2}, [%[src]]! \n\t" + "vst1.8 {d0[0]}, [%[dst]], %[stride_dst] \n\t" + "vst1.8 {d0[1]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.8 {d0[2]}, [%[dst]], %[stride_dst] \n\t" + "vst1.8 {d0[3]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.8 {d0[4]}, [%[dst]], %[stride_dst] \n\t" + "vst1.8 {d0[5]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.8 {d0[6]}, [%[dst]], %[stride_dst] \n\t" + "subs %[height], #8 \n\t" + "vst1.8 {d0[7]}, [%[dst2]], %[stride_dst] \n\t" + "beq 3f \n\t" + "vld1.8 {d0}, [%[src]]! \n\t" + "vst1.8 {d2[0]}, [%[dst]], %[stride_dst] \n\t" + "vst1.8 {d2[1]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.8 {d2[2]}, [%[dst]], %[stride_dst] \n\t" + "vst1.8 {d2[3]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.8 {d2[4]}, [%[dst]], %[stride_dst] \n\t" + "vst1.8 {d2[5]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.8 {d2[6]}, [%[dst]], %[stride_dst] \n\t" + "subs %[height], #8 \n\t" + "vst1.8 {d2[7]}, [%[dst2]], %[stride_dst] \n\t" + "bne 1b \n\t" + "2: \n\t" + "vst1.8 {d0[0]}, [%[dst]], %[stride_dst] \n\t" + "vst1.8 {d0[1]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.8 {d0[2]}, [%[dst]], %[stride_dst] \n\t" + "vst1.8 {d0[3]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.8 {d0[4]}, [%[dst]], %[stride_dst] \n\t" + "vst1.8 {d0[5]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.8 {d0[6]}, [%[dst]] \n\t" + "vst1.8 {d0[7]}, [%[dst2]] \n\t" + "b 4f \n\t" + "3: \n\t" + "vst1.8 {d2[0]}, [%[dst]], %[stride_dst] \n\t" + "vst1.8 {d2[1]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.8 {d2[2]}, [%[dst]], %[stride_dst] \n\t" + "vst1.8 {d2[3]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.8 {d2[4]}, [%[dst]], %[stride_dst] \n\t" + "vst1.8 {d2[5]}, [%[dst2]], %[stride_dst] \n\t" + "vst1.8 {d2[6]}, [%[dst]] \n\t" + "vst1.8 {d2[7]}, [%[dst2]] \n\t" + "4: \n\t" + : // Outputs + [dst]"+r"(dst), + [dst2]"+r"(dst2), + [src]"+r"(src), + [height]"+r"(height) + : // Inputs + [stride_dst]"r"(stride_dst) + : // Clobbers + "cc", "memory" + ); + break; + } +} + +static av_noinline void ff_hevc_rpi_copy_vert_v2v_neon(uint8_t *dst, const uint8_t *src, + int pixel_shift, int height, + ptrdiff_t stride_dst, ptrdiff_t stride_src) +{ + int x, y; + switch (pixel_shift) + { + case 2: + __asm__ volatile ( + "ldr %[x], [%[src]], %[stride_src] \n\t" + "ldr %[y], [%[src]], %[stride_src] \n\t" + "str %[x], [%[dst]], %[stride_dst] \n\t" + "sub %[height], #2 \n\t" + "1: \n\t" + "ldr %[x], [%[src]], %[stride_src] \n\t" + "str %[y], [%[dst]], %[stride_dst] \n\t" + "ldr %[y], [%[src]], %[stride_src] \n\t" + "subs %[height], #2 \n\t" + "str %[x], [%[dst]], %[stride_dst] \n\t" + "bne 1b \n\t" + "str %[y], [%[dst]] \n\t" + : // Outputs + [x]"=&r"(x), + [y]"=&r"(y), + [src]"+r"(src), + [dst]"+r"(dst), + [height]"+r"(height) + : // Inputs + [stride_src]"r"(stride_src), + [stride_dst]"r"(stride_dst) + : // Clobbers + "cc", "memory" + ); + break; + case 1: + __asm__ volatile ( + "ldrh %[x], [%[src]], %[stride_src] \n\t" + "ldrh %[y], [%[src]], %[stride_src] \n\t" + "strh %[x], [%[dst]], %[stride_dst] \n\t" + "sub %[height], #2 \n\t" + "1: \n\t" + "ldrh %[x], [%[src]], %[stride_src] \n\t" + "strh %[y], [%[dst]], %[stride_dst] \n\t" + "ldrh %[y], [%[src]], %[stride_src] \n\t" + "subs %[height], #2 \n\t" + "strh %[x], [%[dst]], %[stride_dst] \n\t" + "bne 1b \n\t" + "strh %[y], [%[dst]] \n\t" + : // Outputs + [x]"=&r"(x), + [y]"=&r"(y), + [src]"+r"(src), + [dst]"+r"(dst), + [height]"+r"(height) + : // Inputs + [stride_src]"r"(stride_src), + [stride_dst]"r"(stride_dst) + : // Clobbers + "cc", "memory" + ); + break; + default: + __asm__ volatile ( + "ldrb %[x], [%[src]], %[stride_src] \n\t" + "ldrb %[y], [%[src]], %[stride_src] \n\t" + "strb %[x], [%[dst]], %[stride_dst] \n\t" + "sub %[height], #2 \n\t" + "1: \n\t" + "ldrb %[x], [%[src]], %[stride_src] \n\t" + "strb %[y], [%[dst]], %[stride_dst] \n\t" + "ldrb %[y], [%[src]], %[stride_src] \n\t" + "subs %[height], #2 \n\t" + "strb %[x], [%[dst]], %[stride_dst] \n\t" + "bne 1b \n\t" + "strb %[y], [%[dst]] \n\t" + : // Outputs + [x]"=&r"(x), + [y]"=&r"(y), + [src]"+r"(src), + [dst]"+r"(dst), + [height]"+r"(height) + : // Inputs + [stride_src]"r"(stride_src), + [stride_dst]"r"(stride_dst) + : // Clobbers + "cc", "memory" + ); + break; + } +} + +#define ff_hevc_rpi_copy_vert ff_hevc_rpi_copy_vert_neon +static inline void ff_hevc_rpi_copy_vert_neon(uint8_t *dst, const uint8_t *src, + int pixel_shift, int height, + ptrdiff_t stride_dst, ptrdiff_t stride_src) +{ + if (stride_dst == 1 << pixel_shift) + ff_hevc_rpi_copy_vert_v2h_neon(dst, src, pixel_shift, height, stride_src); + else if (stride_src == 1 << pixel_shift) + ff_hevc_rpi_copy_vert_h2v_neon(dst, src, pixel_shift, height, stride_dst); + else + ff_hevc_rpi_copy_vert_v2v_neon(dst, src, pixel_shift, height, stride_dst, stride_src); +} + +#endif /* HAVE_NEON_INLINE */ + +#endif /* AVCODEC_ARM_RPI_HEVC_MISC_H */ diff --git a/libavcodec/arm/rpi_hevc_mv_arm.h b/libavcodec/arm/rpi_hevc_mv_arm.h new file mode 100644 index 0000000000..325c26a49b --- /dev/null +++ b/libavcodec/arm/rpi_hevc_mv_arm.h @@ -0,0 +1,93 @@ +/* +Copyright (c) 2017 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Written by John Cox, Ben Avison +*/ + +#ifndef AVCODEC_ARM_RPI_HEVC_MV_H +#define AVCODEC_ARM_RPI_HEVC_MV_H + +#if HAVE_ARMV6T2_INLINE +static inline MvXY mvxy_add_arm(const MvXY a, const MvXY b) +{ + MvXY r; + __asm__ ( + "sadd16 %[r], %[a], %[b] \n\t" + : [r]"=r"(r) + : [a]"r"(a), + [b]"r"(b) + : + ); + return r; +} +#define mvxy_add mvxy_add_arm +#endif + +#if HAVE_ARMV6T2_INLINE +#if (defined(__ARM_ARCH_EXT_IDIV__) || defined (__ARM_FEATURE_IDIV)) +static inline int32_t mv_scale_xy_arm(int32_t xy, int td, int tb) +{ + int t; + __asm__ ( + "ssat %[td], #8, %[td] \n\t" + "ssat %[tb], #8, %[tb] \n\t" + "eor %[t], %[td], %[td], asr #31 \n\t" + "adds %[t], %[t], %[td], lsr #31 \n\t" + "asr %[t], #1 \n\t" + "add %[t], #0x4000 \n\t" + "it ne \n\t" + "sdivne %[t], %[t], %[td] \n\t" + "mov %[td], #32 \n\t" + "smlabb %[td], %[t], %[tb], %[td] \n\t" + "ssat %[td], #13, %[td], asr #6 \n\t" + "mov %[tb], #127 \n\t" + "smlatb %[t], %[xy], %[td], %[tb] \n\t" + "smlabb %[tb], %[xy], %[td], %[tb] \n\t" +// This takes the sign of x & y for rounding at the "wrong" point +// (i.e. after adding 127) but for the range of values (-1,-127) +// where it does the wrong thing you get the right answer (0) anyway + "add %[t], %[t], %[t], lsr #31 \n\t" + "add %[xy], %[tb], %[tb], lsr #31 \n\t" + "ssat %[t], #16, %[t], asr #8 \n\t" + "ssat %[xy], #16, %[xy], asr #8 \n\t" + "pkhbt %[xy], %[xy], %[t], lsl #16 \n\t" + : + [t]"=&r"(t), + [xy]"+r"(xy), + [td]"+r"(td), + [tb]"+r"(tb) + : + : + "cc" + ); + return xy; +} +#define mv_scale_xy mv_scale_xy_arm +#endif +#endif + +#endif // AVCODEC_ARM_RPI_HEVC_MV_H + diff --git a/libavcodec/arm/rpi_hevcdsp_arm.h b/libavcodec/arm/rpi_hevcdsp_arm.h new file mode 100644 index 0000000000..62b9326532 --- /dev/null +++ b/libavcodec/arm/rpi_hevcdsp_arm.h @@ -0,0 +1,26 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_ARM_HEVCDSP_ARM_H +#define AVCODEC_ARM_HEVCDSP_ARM_H + +#include "libavcodec/rpi_hevcdsp.h" + +void ff_hevcdsp_rpi_init_neon(HEVCDSPContext *c, const int bit_depth); + +#endif /* AVCODEC_ARM_HEVCDSP_ARM_H */ diff --git a/libavcodec/arm/rpi_hevcdsp_deblock_neon.S b/libavcodec/arm/rpi_hevcdsp_deblock_neon.S new file mode 100644 index 0000000000..88a3b4e5e7 --- /dev/null +++ b/libavcodec/arm/rpi_hevcdsp_deblock_neon.S @@ -0,0 +1,1634 @@ +/* + * Copyright (c) 2014 Seppo Tomperi + * Copyright (C) 2018 John Cox, Ben Avison for Raspberry Pi (Trading) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1 + */ + + +#include "libavutil/arm/asm.S" +#include "neon.S" + +.macro hevc_loop_filter_uv_body1 P1a, P0a, Q0a, Q1a, I1, I2, I3, I4, I5, I6, I7, I8 + vsubl.u8 q0, \Q0a, \P0a + vsubl.u8 q1, \P1a, \Q1a + vdup.16 d4, r2 + \I1 + vshl.i16 q0, #2 + \I2 + vadd.i16 q0, q1 + \I3 + vmovl.u8 q2, d4 + \I4 + vneg.s16 q1, q2 + \I5 + vrshr.s16 q0, #3 + \I6 + \I7 + \I8 + vmin.s16 q0, q2 + vmovl.u8 q2, \Q0a + vmax.s16 q0, q1 + vaddw.u8 q1, q0, \P0a + vsub.i16 q0, q2, q0 + vqmovun.s16 \P0a, q1 + vqmovun.s16 \Q0a, q0 +.endm + + +.macro hevc_loop_filter_uv_body2 P1a, P1b, P0a, P0b, Q0a, Q0b, Q1a, Q1b, I1, I2, I3, I4, I5, I6, I7 + vsubl.u8 q0, \Q0a, \P0a @ q0a - p0a + lsr r12, r2, #16 + vsubl.u8 q1, \Q0b, \P0b @ q0b - p0b + vsubl.u8 q2, \P1a, \Q1a @ p1a - q1a + vsubl.u8 q3, \P1b, \Q1b @ p1b - q1b + vshl.i16 q0, #2 @ (q0a - p0a) * 4 + vshl.i16 q1, #2 @ (q0b - p0b) * 4 + vadd.i16 q0, q2 @ ((q0a - p0a) * 4) + p1a - q1a + vadd.i16 q1, q3 @ ((q0b - p0b) * 4) + p1b - q1b + vdup.16 d4, r2 @ tc0a, tc0b + vdup.16 d6, r12 @ tc1a, tc1b + vrshr.s16 q0, #3 @ (((q0a - p0a) * 4) + p1a - q1a + 4) >> 3 + \I1 + vrshr.s16 q1, #3 @ (((q0b - p0b) * 4) + p1b - q1b + 4) >> 3 + \I2 + vmovl.u8 q2, d4 @ tc0a, tc0b + \I3 + vmovl.u8 q3, d6 @ tc1a, tc1b + \I4 + vmin.s16 q0, q2 + \I5 + vneg.s16 q2, q2 @ -tc0a, -tc0b + \I6 + vmin.s16 q1, q3 + \I7 + vneg.s16 q3, q3 @ -tc1a, -tc1b + vmax.s16 q0, q2 @ delta0a + vmovl.u8 q2, \Q0a + vmax.s16 q1, q3 @ delta0b + vaddw.u8 q3, q0, \P0a @ p0a + delta0a + vsub.i16 q0, q2, q0 @ q0a - delta0a + vmovl.u8 q2, \Q0b + vsub.i16 q2, q1 @ q0b - delta0b + vaddw.u8 q1, \P0b @ p0b + delta0b + vqmovun.s16 \Q0a, q0 + vqmovun.s16 \P0a, q3 + vqmovun.s16 \Q0b, q2 + vqmovun.s16 \P0b, q1 +.endm + + +@ Preserves r12 +@ Clobbers r2 +@ P0a et al all contain UVUVUVUV +@ r2 (tc4) contains +@ [0..7] tc U a +@ [8..15] tc V a + +.macro hevc_loop_filter_uv_body1_16 P1a, P0a, Q0a, Q1a, bit_depth, I1, I2, I3, I4, I5, I6, I7, I8 + vsub.i16 q0, \Q0a, \P0a + vsub.i16 q1, \P1a, \Q1a + vdup.16 d4, r2 + \I1 + vshl.i16 q0, #2 + \I2 + vadd.i16 q0, q1 + \I3 + vshll.u8 q2, d4, #\bit_depth - 8 + \I4 + vneg.s16 q1, q2 + \I5 + vrshr.s16 q0, #3 + \I6 + \I7 + \I8 + vmin.s16 q0, q2 + vmov.i16 q2, #0 + vmax.s16 q0, q1 + vadd.i16 \P0a, q0 + vsub.i16 \Q0a, q0 + vmov.i16 q1, #(1 << \bit_depth) - 1 + vmax.s16 \P0a, q2 + vmax.s16 \Q0a, q2 + vmin.s16 \P0a, q1 + vmin.s16 \Q0a, q1 +.endm + +@ Clobbers r2, r12 +@ P0a et al all contain UVUVUVUV +@ r2 (tc4) contains +@ [0..7] tc U a +@ [8..15] tc V a +@ [16..23] tc U b +@ [24..31] tc V b + +.macro hevc_loop_filter_uv_body2_16 P1a, P1b, P0a, P0b, Q0a, Q0b, Q1a, Q1b, bit_depth, I1, I2, I3, I4, I5, I6, I7 + vsub.i16 q0, \Q0a, \P0a @ q0a - p0a + lsr r12, r2, #16 + vsub.i16 q1, \Q0b, \P0b @ q0b - p0b + vsub.i16 q2, \P1a, \Q1a @ p1a - q1a + vsub.i16 q3, \P1b, \Q1b @ p1b - q1b + vshl.i16 q0, #2 @ (q0a - p0a) * 4 + vshl.i16 q1, #2 @ (q0b - p0b) * 4 + vadd.i16 q0, q2 @ ((q0a - p0a) * 4) + p1a - q1a + vadd.i16 q1, q3 @ ((q0b - p0b) * 4) + p1b - q1b + vdup.16 d4, r2 @ tc0a, tc0b + vdup.16 d6, r12 @ tc1a, tc1b + vrshr.s16 q0, #3 @ (((q0a - p0a) * 4) + p1a - q1a + 4) >> 3 + \I1 + vrshr.s16 q1, #3 @ (((q0b - p0b) * 4) + p1b - q1b + 4) >> 3 + \I2 + vshll.u8 q2, d4, #\bit_depth - 8 @ tc0a, tc0b + \I3 + vshll.u8 q3, d6, #\bit_depth - 8 @ tc1a, tc1b + \I4 + vmin.s16 q0, q2 + \I5 + vneg.s16 q2, q2 @ -tc0a, -tc0b + \I6 + vmin.s16 q1, q3 + \I7 + vneg.s16 q3, q3 @ -tc1a, -tc1b + vmax.s16 q0, q2 @ delta0a + vadd.i16 \P0a, q0 @ p0a + delta0a + vsub.i16 \Q0a, q0 @ q0a - delta0a + vmax.s16 q1, q3 @ delta0b + vadd.i16 \P0b, q1 @ p0b + delta0b + vsub.i16 \Q0b, q1 @ q0b - delta0b + vmov.i16 q2, #0 + vmov.i16 q3, #(1 << \bit_depth) - 1 + vmax.s16 \P0a, q2 + vmax.s16 \Q0a, q2 + vmax.s16 \P0b, q2 + vmax.s16 \Q0b, q2 + vmin.s16 \P0a, q3 + vmin.s16 \Q0a, q3 + vmin.s16 \P0b, q3 + vmin.s16 \Q0b, q3 +.endm + + + +@ uint8_t *_no_p, [sp+0] +@ uint8_t *_no_q) [sp+4] + +.macro hevc_loop_filter_luma_start + ldr r12, [r3] + ldr r3, [r3, #4] + orrs r3, r12, r3, lsl #16 + it eq + bxeq lr + push {r4-r10,lr} @ 32 bytes + ldrd r4, r5, [sp, #32] @ &_no_p + ldrb r4, [r4] + ldrb r5, [r5] + movs r10, r4 + it ne + movne r10, #1 + cmp r5, #0 + it ne + orrne r10, #2 +.endm + +@ Input: +@ r2 beta (raw: needs shift for bitdepth > 8) +@ r3[ 0:15] tc[0] (raw: needs shift for bitdepth > 8) +@ r3[16:31] tc[1] (raw: needs shift for bitdepth > 8) +@ +@ Input & output +@ 8-bit: d16-d23 (Q3,Q2,Q1,Q0,P0,P1,P2,P3) +@ 16-bit: q8-q15 +@ +@ r1 -r1 +@ r10 b1->C, b0->N (r10 junk) +@ +@ Junks: +@ r5, r6, r7, r8, r9 + +.macro m_filter_luma bit_depth, Q11, Q15 +.if \bit_depth == 8 + vmovl.u8 q14, d22 @ q2,7 q2,6 ... q2,0 = TQ2' ... Q2' TQ2 ... Q2 + vmovl.u8 q13, d21 @ q1,7 q1,6 ... q1,0 = TQ1' ... Q1' TQ1 ... Q1 + vmovl.u8 q12, d20 @ q0,7 q0,6 ... q0,0 = TQ0' ... Q0' TQ0 ... Q0 + vmovl.u8 \Q11, d19 @ p0,7 p0,6 ... p0,0 = TP0' ... P0' TP0 ... P0 + vmovl.u8 q10, d18 @ p1,7 p1,6 ... p1,0 = TP1' ... P1' TP1 ... P1 + vmovl.u8 q9, d17 @ p2,7 p2,6 ... p2,0 = TP2' ... P2' TP2 ... P2 +.endif + vadd.i16 q0, q9, \Q11 @ P2 + P0 +.if \bit_depth > 8 + lsl r3, r3, #(\bit_depth - 8) +.endif + vadd.i16 q1, q14, q12 @ Q2 + Q0 +.if \bit_depth > 8 + lsl r2, r2, #(\bit_depth - 8) +.endif + vsub.i16 q0, q10 @ P2 - P1 + P0 + lsr r5, r3, #16 + vsub.i16 q1, q13 @ Q2 - Q1 + Q0 +.if \bit_depth == 8 + vmovl.u8 q8, d16 @ p3,7 p3,6 ... p3,0 = TP3' ... P3' TP3 ... P3 + vmovl.u8 \Q15, d23 @ q3,7 q3,6 ... q3,0 = TQ3' ... Q3' TQ3 ... Q3 +.endif + vabd.s16 q0, q10 @ dp0 = abs(P2 - 2 * P1 + P0) + vabd.s16 q1, q13 @ dq0 = abs(Q2 - 2 * Q1 + Q0) + vmov.i64 q2, #0xffffffff0000 + vbic q0, q2 @ only dp0(') and dp3(') + vbic q1, q2 @ only dq0(') and dq3(') + vsra.u64 q0, #16 + vsra.u64 q1, #16 + vdup.16 q3, r2 @ beta + vdup.16 d14, r3 @ tC[0] + vdup.16 d15, r5 @ tC[1] + vabd.s16 q4, q8, \Q11 @ abs(TP3'-TP0' ... P3'-P0' TP3-TP0 ... P3-P0) + vmovn.i32 d0, q0 @ dp3' dp0' dp3 dp0 + vmovn.i32 d1, q1 @ dq3' dq0' dq3 dq0 + vadd.i16 d5, d0, d1 @ d3'=dp3'+dq3' d0'=dp0'+dq0' d3=dp3+dq3 d0=dp0+dq0 + vabd.s16 q5, \Q11, q12 @ abs(TP0'-TQ0' ... P0'-Q0' TP0-TQ0 ... P0-Q0) + vaba.s16 q4, \Q15, q12 @ +abs(TQ3'-TQ0' ... Q3'-Q0' TQ3-TQ0 ... Q3-Q0) + vpadd.i16 d2, d5, d5 @ dontcare dontcare d0'+d3' d0+d3 + vshl.s16 q6, q7, #2 @ tC[] * 4 + vrhadd.s16 q6, q7 @ tc25 = (tc[] * 5 + 1) >> 1 + vcgt.s16 d2, d6, d2 @ if (d0 + d3 < beta) + vmov r7, s4 @ (d2) r7 = mask of blocks to apply filtering (16b/block) + vshr.s16 q1, q3, #3 @ beta_3 = beta >> 3 + cmp r7, #0 + beq .Lbypasswrite + + vcgt.s16 q5, q6, q5 @ if < tc25 + vcgt.s16 q4, q1, q4 @ if (abs({T}P[0-3]{'}-{T}P[0-3]{'})+abs({T}Q[0-3]{'}-{T}Q[0-3]{'}) < beta_3) + vand q4, q5 + vbic d8, d4 + vbic d9, d4 + vshr.s16 q3, #2 @ beta_2 = beta >> 2 + vsra.u64 q4, #16 + vshl.s16 d5, #1 @ d3'<<1 d0'<<1 d3<<1 d0<<1 + vshl.i16 q7, #1 @ tc2 = tC[] << 1 + vcgt.s16 d6, d5 @ if (d3'<<1 < beta_2) etc + vmovn.i32 d8, q4 @ beta_3 && tc25 tests, prime block in ms half + vand d6, d8 @ && beta_2 tests, prime in ms half + vpadd.i16 d0, d1 @ dq0'+dq3' dq0+dq3 dp0'+dp3' dp0+dp3 + vneg.s16 q6, q7 @ -tc2 + vmovn.i32 d8, q3 + vshrn.i32 d6, q3, #16 + vand d6, d8 + vmov r5, r6, d0 @ r5 = dp0'+dp3' dp0+dp3 r6 = dq0'+dq3' dq0+dq3 + vmov r8, s12 @ (d6) r8 = mask of strong filtering blocks (16b/block) + vadd.i16 q0, \Q11, q12 @ p0 + q0 + ands r9, r7, r8 + beq 1f + + vadd.i16 q2, q0, q10 @ p1 + p0 + q0 + vadd.i16 q3, q0, q13 @ p0 + q0 + q1 + lsr r3, r9, #16 + vadd.i16 q1, q2, q9 @ p2 + p1 + p0 + q0 (new P1 before clipping) + vadd.i16 q4, q3, q14 @ p0 + q0 + q1 + q2 (new Q1 before clipping) + vadd.i16 q0, q8, q9 @ p3 + p2 + vadd.i16 q5, \Q15, q14 @ q2 + q3 + vadd.i16 q2, q1 @ p2 + 2 * p1 + 2 * p0 + 2 * q0 + vadd.i16 q3, q4 @ 2 * p0 + 2 * q0 + 2 * q1 + q2 + vshl.i16 q0, #1 @ 2 * p3 + 2 * p2 + vshl.i16 q5, #1 @ 2 * q2 + 2 * q3 + vadd.i16 q0, q1 @ 2 * p3 + 3 * p2 + p1 + p0 + q0 (new P2 before clipping) + vadd.i16 q5, q4 @ p0 + q0 + q1 + 3 * q2 + 2 * q3 (new Q2 before clipping) + vadd.i16 q2, q13 @ p2 + 2 * p1 + 2 * p0 + 2 * q0 + q1 (new P0 before clipping) + vadd.i16 q3, q10 @ p1 + 2 * p0 + 2 * q0 + 2 * q1 + q2 (new Q0 before clipping) + vrshr.s16 q0, #3 @ scale, with rounding + vrshr.s16 q5, #3 + vrshr.s16 q1, #2 + vrshr.s16 q4, #2 + vrshr.s16 q2, #3 + vrshr.s16 q3, #3 + vsub.i16 q0, q9 @ find difference + vsub.i16 q5, q14 + vsub.i16 q1, q10 + vsub.i16 q4, q13 + vsub.i16 q2, \Q11 + vsub.i16 q3, q12 + vmax.s16 q0, q6 @ clip difference to -tc2 .. tc2 + vmax.s16 q5, q6 + vmax.s16 q1, q6 + vmax.s16 q4, q6 + vmax.s16 q2, q6 + vmax.s16 q3, q6 + vdup.16 d12, r9 @ expand mask, reuse q6 due to register pressure + vdup.16 d13, r3 + vmin.s16 q0, q7 + vmin.s16 q5, q7 + vmin.s16 q1, q7 + vmin.s16 q4, q7 + vmin.s16 q2, q7 + vmin.s16 q3, q7 + vadd.i16 q0, q9 @ apply difference + vadd.i16 q5, q14 + vadd.i16 q1, q10 + vadd.i16 q4, q13 + vadd.i16 q2, \Q11 + vadd.i16 q3, q12 + vbit q9, q0, q6 @ apply filtered values according to mask + vbit q14, q5, q6 + vbit q10, q1, q6 + vbit q13, q4, q6 + vbit \Q11, q2, q6 + vbit q12, q3, q6 + vneg.s16 q6, q7 @ restore -tc2 + +1: + bics r9, r7, r8 + beq 2f + + vsub.i16 q0, q12, \Q11 @ q0 - p0 + vsub.i16 q1, q13, q10 @ q1 - p1 + lsr r3, r9, #16 + vshl.i16 q2, q0, #3 + lsr r7, r5, #16 + vadd.i16 q3, q0, q2 @ 9 * (q0 - p0) + lsr r8, r6, #16 + vshl.i16 q2, q1, #1 + vadd.i16 q4, q1, q2 @ 3 * (q1 - p1) + vshr.s16 q6, #1 @ -tc = -tc2 >> 1 + vsub.i16 q5, q3, q4 + vrhadd.s16 q1, q9, \Q11 @ (p2 + p0 + 1) >> 1 + vrhadd.s16 q3, q14, q12 @ (q2 + q0 + 1) >> 1 + vrshr.s16 q5, #4 @ delta0 = (9 * (q0 - p0) - 3 * (q1 - p1) + 8) >> 4 + vsub.i16 q1, q10 @ ((p2 + p0 + 1) >> 1) - p1 + vsub.i16 q3, q13 @ ((q2 + q0 + 1) >> 1) - q1 + vmax.s16 q6, q5 @ + vshr.s16 q4, q7, #1 @ tc = tc2 >> 1 + vdup.16 q0, r2 @ beta + vmin.s16 q6, q4 @ delta0 clamped to [-tc, tc] + vshr.s16 q4, #1 @ tc_2 = tc >> 1 + vhadd.s16 q1, q6 @ (((p2 + p0 + 1) >> 1) - p1 + delta0) >> 1 + vhsub.s16 q3, q6 @ (((q2 + q0 + 1) >> 1) - q1 - delta0) >> 1 + vshr.s16 q2, q0, #1 @ beta >> 1 + vadd.i16 q2, q0 @ beta + (beta >> 1) + vneg.s16 q0, q4 @ -tc_2 + vabs.s16 q5, q5 @ abs(original delta0) + vshr.s16 q2, #3 @ (beta + (beta >> 1)) >> 3 + vmax.s16 q1, q0 + vmax.s16 q3, q0 + vshl.s16 q0, q7, #2 @ 8 * tc + vadd.i16 q7, q0 @ 10 * tc + vdup.16 d0, r9 + vdup.16 d1, r3 @ q0 = mask of blocks to apply filtering + vmin.s16 q1, q4 @ deltap1 = av_clip((((p2 + p0 + 1) >> 1) - p1 + delta0) >> 1, -tc_2, tc_2) + vmin.s16 q3, q4 @ deltaq1 = av_clip((((q2 + q0 + 1) >> 1) - q1 + delta0) >> 1, -tc_2, tc_2) + vdup.16 d8, r5 @ dp0 + dp3 + vdup.16 d9, r7 @ dp0' + dp3' + vcgt.s16 q7, q5 @ if ((10 * tc) > abs(delta0)) + vdup.16 d10, r6 @ dq0 + dq3 + vdup.16 d11, r8 @ dq0' + dq3' + vand q7, q0 @ AND block and line masks + vcgt.s16 q4, q2, q4 @ if (((beta + (beta >> 1)) >> 3) > dp0 + dp3), i.e. if (nd_p > 1) + vadd.i16 q0, q1, q10 @ p1 + deltap1 + vcgt.s16 q5, q2, q5 @ if (((beta + (beta >> 1)) >> 3) > dq0 + dq3), i.e. if (nd_q > 1) + vadd.i16 q3, q3, q13 @ q1 + deltaq1 + vadd.i16 q1, \Q11, q6 @ p0 + delta0 + vsub.i16 q2, q12, q6 @ q0 - delta0 + vand q4, q7 @ AND nd_p test with block/line masks + vand q5, q7 @ AND nd_q test with block/line masks + vbit q10, q0, q4 + vbit \Q11, q1, q7 + vbit q12, q2, q7 + vbit q13, q3, q5 + +2: +.if \bit_depth == 8 + vmovn.i16 d16, q8 + vmovn.i16 d23, \Q15 + neg r1, r1 + vqmovun.s16 d17, q9 + vqmovun.s16 d18, q10 + vqmovun.s16 d19, \Q11 + lsls r10, #31 + vqmovun.s16 d20, q12 + vqmovun.s16 d21, q13 + vqmovun.s16 d22, q14 +.else + vmov.i16 q0, #0 + vmov.i16 q1, #(1 << \bit_depth - 1) + @ q8 & q15 should be unaltered and so don't require clipping + neg r1, r1 + vmax.s16 q9, q0 + vmax.s16 q10, q0 + vmax.s16 q11, q0 + vmax.s16 q12, q0 + vmax.s16 q13, q0 + vmax.s16 q14, q0 + lsls r10, #31 + vmin.s16 q9, q1 + vmin.s16 q10, q1 + vmin.s16 q11, q1 + vmin.s16 q12, q1 + vmin.s16 q13, q1 + vmin.s16 q14, q1 +.endif + bx lr +.endm + +function hevc_loop_filter_luma_body + m_filter_luma 8, q15, q11 +endfunc + +@ void ff_hevc_rpi_v_loop_filter_luma_neon_8( +@ uint8_t *_pix, [r0] +@ ptrdiff_t _stride, [r1] +@ int _beta, [r2] +@ int *_tc, [r3] +@ uint8_t *_no_p, [sp+0] +@ uint8_t *_no_q) [sp+4] + +function ff_hevc_rpi_v_loop_filter_luma_neon_8, export=1 + hevc_loop_filter_luma_start + + sub r4, r0, #4 + b .Lv_loop_luma_common +endfunc + +@ void ff_hevc_rpi_v_loop_filter2_luma_neon( +@ uint8_t * pix_r, [r0] +@ ptrdiff_t _stride, [r1] +@ int _beta, [r2] +@ int tc2, [r3] +@ int no_f, [sp+0] +@ uint8_t * pix_l) [sp+4] + +function ff_hevc_rpi_v_loop_filter_luma2_neon_8, export=1 + cmp r3, #0 + it eq + bxeq lr + push {r4-r10,lr} @ 32 bytes + ldr r4, [sp, #36] + ldr r10, [sp, #32] + +.Lv_loop_luma_common: + vpush {d8-d15} + + @ It's slightly faster to do unlaned loads and transpose in the + @ 8-bit case, even though it needs more instructions, because + @ VLD4.8 is a really slow way to read from memory. + vld1.32 {d16[0]}, [r4:32], r1 + vld1.32 {d20[0]}, [r0:32], r1 + vld1.32 {d16[1]}, [r4:32], r1 + vld1.32 {d20[1]}, [r0:32], r1 + vld1.32 {d17[0]}, [r4:32], r1 + vld1.32 {d21[0]}, [r0:32], r1 + vld1.32 {d17[1]}, [r4:32], r1 + vld1.32 {d21[1]}, [r0:32], r1 + vld1.32 {d18[0]}, [r4:32], r1 + vld1.32 {d22[0]}, [r0:32], r1 + vld1.32 {d18[1]}, [r4:32], r1 + vld1.32 {d22[1]}, [r0:32], r1 + vld1.32 {d19[0]}, [r4:32], r1 + vld1.32 {d23[0]}, [r0:32], r1 + vld1.32 {d19[1]}, [r4:32] + vld1.32 {d23[1]}, [r0:32] + vuzp.16 q8, q9 + vuzp.16 q10, q11 + vuzp.8 q8, q9 + vuzp.8 q10, q11 + vswp d17, d18 + vswp d21, d22 + + bl hevc_loop_filter_luma_body + + add r6, r4, r1 + add r2, r0, r1 + lsl r1, #1 + + vpop {d8-d15} + + @ no_p[1] + bmi 1f + vst4.8 {d16[7],d17[7],d18[7],d19[7]}, [r4:32], r1 + vst4.8 {d16[6],d17[6],d18[6],d19[6]}, [r6:32], r1 + vst4.8 {d16[5],d17[5],d18[5],d19[5]}, [r4:32], r1 + vst4.8 {d16[4],d17[4],d18[4],d19[4]}, [r6:32], r1 + + vst4.8 {d16[3],d17[3],d18[3],d19[3]}, [r4:32], r1 + vst4.8 {d16[2],d17[2],d18[2],d19[2]}, [r6:32], r1 + vst4.8 {d16[1],d17[1],d18[1],d19[1]}, [r4:32], r1 + vst4.8 {d16[0],d17[0],d18[0],d19[0]}, [r6:32] +1: + @ no_q[1] + bcs 1f + vst4.8 {d20[7],d21[7],d22[7],d23[7]}, [r0:32], r1 + vst4.8 {d20[6],d21[6],d22[6],d23[6]}, [r2:32], r1 + vst4.8 {d20[5],d21[5],d22[5],d23[5]}, [r0:32], r1 + vst4.8 {d20[4],d21[4],d22[4],d23[4]}, [r2:32], r1 + + vst4.8 {d20[3],d21[3],d22[3],d23[3]}, [r0:32], r1 + vst4.8 {d20[2],d21[2],d22[2],d23[2]}, [r2:32], r1 + vst4.8 {d20[1],d21[1],d22[1],d23[1]}, [r0:32], r1 + vst4.8 {d20[0],d21[0],d22[0],d23[0]}, [r2:32] +1: + pop {r4-r10,pc} + +.Lbypasswrite: + vpop {d8-d15} + pop {r4-r10,pc} +endfunc + +.macro m_filter_v_luma_16 bit_depth + vpush {d8-d15} + + @ Uses slightly fewer instructions to do laned loads than unlaned + @ and transpose. This also means that we can use the same code for + @ both split & unsplit deblock + vld4.16 {d16[0], d18[0], d20[0], d22[0]}, [r4], r1 + vld4.16 {d24[0], d26[0], d28[0], d30[0]}, [r0], r1 + + vld4.16 {d16[1], d18[1], d20[1], d22[1]}, [r4], r1 + vld4.16 {d24[1], d26[1], d28[1], d30[1]}, [r0], r1 + + vld4.16 {d16[2], d18[2], d20[2], d22[2]}, [r4], r1 + vld4.16 {d24[2], d26[2], d28[2], d30[2]}, [r0], r1 + + vld4.16 {d16[3], d18[3], d20[3], d22[3]}, [r4], r1 + vld4.16 {d24[3], d26[3], d28[3], d30[3]}, [r0], r1 + + vld4.16 {d17[0], d19[0], d21[0], d23[0]}, [r4], r1 + vld4.16 {d25[0], d27[0], d29[0], d31[0]}, [r0], r1 + + vld4.16 {d17[1], d19[1], d21[1], d23[1]}, [r4], r1 + vld4.16 {d25[1], d27[1], d29[1], d31[1]}, [r0], r1 + + vld4.16 {d17[2], d19[2], d21[2], d23[2]}, [r4], r1 + vld4.16 {d25[2], d27[2], d29[2], d31[2]}, [r0], r1 + + vld4.16 {d17[3], d19[3], d21[3], d23[3]}, [r4] + vld4.16 {d25[3], d27[3], d29[3], d31[3]}, [r0] + + bl hevc_loop_filter_luma_body_\bit_depth + + add r6, r4, r1 + add r2, r0, r1 + lsl r1, #1 + + vpop {d8-d15} + + @ p[1] + bmi 1f + vst4.16 {d17[3], d19[3], d21[3], d23[3]}, [r4], r1 + vst4.16 {d17[2], d19[2], d21[2], d23[2]}, [r6], r1 + vst4.16 {d17[1], d19[1], d21[1], d23[1]}, [r4], r1 + vst4.16 {d17[0], d19[0], d21[0], d23[0]}, [r6], r1 + vst4.16 {d16[3], d18[3], d20[3], d22[3]}, [r4], r1 + vst4.16 {d16[2], d18[2], d20[2], d22[2]}, [r6], r1 + vst4.16 {d16[1], d18[1], d20[1], d22[1]}, [r4], r1 + vst4.16 {d16[0], d18[0], d20[0], d22[0]}, [r6] +1: + @ q[1] + bcs 1f + vst4.16 {d25[3], d27[3], d29[3], d31[3]}, [r0], r1 + vst4.16 {d25[2], d27[2], d29[2], d31[2]}, [r2], r1 + vst4.16 {d25[1], d27[1], d29[1], d31[1]}, [r0], r1 + vst4.16 {d25[0], d27[0], d29[0], d31[0]}, [r2], r1 + vst4.16 {d24[3], d26[3], d28[3], d30[3]}, [r0], r1 + vst4.16 {d24[2], d26[2], d28[2], d30[2]}, [r2], r1 + vst4.16 {d24[1], d26[1], d28[1], d30[1]}, [r0], r1 + vst4.16 {d24[0], d26[0], d28[0], d30[0]}, [r2] +1: + pop {r4-r10,pc} +.endm + + + + +@ void (*hevc_h_loop_filter_luma)(uint8_t *pix, [r0] +@ ptrdiff_t stride, [r1] +@ int beta, [r2] +@ int32_t *tc, [r3] +@ uint8_t *no_p, sp[0] +@ uint8_t *no_q); sp[4] +@ +@ Src should always be on 8 byte boundry & all in the same slice + +function ff_hevc_rpi_h_loop_filter_luma_neon_8, export=1 + hevc_loop_filter_luma_start + b .Lh_loop_filter_luma_common_8 +endfunc + +function ff_hevc_rpi_h_loop_filter_luma2_neon_8, export=1 + cmp r3, #0 + it eq + bxeq lr + push {r4-r10,lr} @ 32 bytes + ldr r10, [sp, #32] + +.Lh_loop_filter_luma_common_8: + sub r4, r0, r1, lsl #2 + add r0, r4, r1 + lsl r1, #1 + vpush {d8-d15} + + vld1.8 {d16}, [r4], r1 + vld1.8 {d17}, [r0], r1 + vld1.8 {d18}, [r4], r1 + vld1.8 {d19}, [r0], r1 + vld1.8 {d20}, [r4], r1 + vld1.8 {d21}, [r0], r1 + vld1.8 {d22}, [r4] + vld1.8 {d23}, [r0] + + bl hevc_loop_filter_luma_body + + add r0, r0, r1, lsl #1 + add r2, r4, r1, lsl #1 + add r6, r4, r1, asr #1 + vpop {d8-d15} + + @ P2-P0 + bcs 1f + vst1.8 {d22}, [r4], r1 + vst1.8 {d21}, [r6] + vst1.8 {d20}, [r4] +1: + @ Q0-Q2 + bmi 1f + vst1.8 {d19}, [r0], r1 + vst1.8 {d18}, [r2] + vst1.8 {d17}, [r0] +1: + pop {r4-r10,pc} +endfunc + + +.macro m_filter_h_luma_16 bit_depth + sub r4, r0, r1, lsl #2 + add r0, r4, r1 + lsl r1, #1 + vpush {d8-d15} + + vld1.16 { q8}, [r4], r1 + vld1.16 { q9}, [r0], r1 + vld1.16 {q10}, [r4], r1 + vld1.16 {q11}, [r0], r1 + vld1.16 {q12}, [r4], r1 + vld1.16 {q13}, [r0], r1 + vld1.16 {q14}, [r4] + vld1.16 {q15}, [r0] + + bl hevc_loop_filter_luma_body_\bit_depth + + add r0, r0, r1, lsl #1 + add r2, r4, r1, lsl #1 + add r6, r4, r1, asr #1 + vpop {d8-d15} + + @ P2-P0 + bcs 1f + vst1.16 {q14}, [r4], r1 + vst1.16 {q13}, [r6] + vst1.16 {q12}, [r4] +1: + bmi 1f + vst1.16 {q11}, [r0], r1 + vst1.16 {q10}, [r2] + vst1.16 { q9}, [r0] +1: + pop {r4-r10,pc} +.endm + + +@ void ff_hevc_rpi_h_loop_filter_uv_neon(uint8_t * src_r, // r0 +@ unsigned int stride, // r1 +@ uint32_t tc4, // r2 +@ unsigned int no_f); // r3 +@ +@ no_f +@ 0 tl P0 +@ 1 tr P1 +@ 2 bl Q0 +@ 3 br Q1 +@ +@ Probably not worth having the P/Qa only special case in this direction +@ Given layout we won't save any memory reads or avoid any cache dirtying +@ We would save a bit of computation but I expect the partials to be less +@ common in the H direction than V due to how we arrange deblock. + +function ff_hevc_rpi_h_loop_filter_uv_neon_8, export=1 + sub r12, r0, r1 + cmp r2, #0 + it eq + bxeq lr + vld1.8 {d26,d27}, [r0] + lsl r1, #1 + sub r0, r1 + vld1.8 {d18,d19}, [r12], r1 + vld1.8 {d16,d17}, [r0], r1 + vld1.8 {d28,d29}, [r12] + + hevc_loop_filter_uv_body2 d16, d17, d18, d19, d26, d27, d28, d29, \ + "sub r12, r0, r1, asr #1" + + lsls r3, #29 @ b2 -> N, b3 -> C + it pl + vstrpl d26, [r0, #0] + it cc + vstrcc d27, [r0, #8] + lsls r3, #2 @ b0 -> N, b1 -> C + it pl + vstrpl d18, [r12, #0] + it cc + vstrcc d19, [r12, #8] + bx lr + +endfunc + + +@ void ff_hevc_rpi_h_loop_filter_uv_neon_10(uint8_t * src_r, // r0 +@ unsigned int stride, // r1 +@ uint32_t tc4, // r2 +@ unsigned int no_f); // r3 +@ +@ no-F = b0:no_p[0], b1:no_p[1], b2:no_q[0], b3:no_q[1] +@ +@ Macro here actual function near bottom + +.macro m_filter_h_uv_16 bit_depth + sub r12, r0, r1 + cmp r2, #0 + it eq + bxeq lr + vld1.16 {q12, q13}, [r0] + lsl r1, #1 + sub r0, r1 + vld1.16 {q10, q11}, [r12], r1 + vld1.16 {q8, q9 }, [r0], r1 + vld1.16 {q14, q15}, [r12] + + hevc_loop_filter_uv_body2_16 q8, q9, q10, q11, q12, q13, q14, q15, \bit_depth, \ + "sub r12, r0, r1, asr #1", \ + "cmp r3, #0" + + bne 1f + vst1.16 {q10, q11}, [r12] + vst1.16 {q12, q13}, [r0] + bx lr + + @ At least one no_f bit is set + @ Which means we need to break this apart in an ugly fashion +1: + lsls r3, #29 @ b2 -> N, b3 -> C + itt pl + vstrpl d24, [r0, #0] + vstrpl d25, [r0, #8] + itt cc + vstrcc d26, [r0, #16] + vstrcc d27, [r0, #24] + lsls r3, #2 @ b0 -> N, b1 -> C + itt pl + vstrpl d20, [r12, #0] + vstrpl d21, [r12, #8] + itt cc + vstrcc d22, [r12, #16] + vstrcc d23, [r12, #24] + bx lr +.endm + + +@ void ff_hevc_rpi_v_loop_filter_uv2_neon(uint8_t * src_r, // r0 +@ unsigned int stride, // r1 +@ uint32_t tc4, // r2 +@ uint8_t * src_l, // r3 +@ unsigned int no_f); // sp[0] +@ +@ no_f: +@ 0 tl P0 +@ 1 tr Q0 +@ 2 bl P1 +@ 3 br Q1 + +function ff_hevc_rpi_v_loop_filter_uv2_neon_8, export=1 + cmp r2, #0 + it eq + bxeq lr + push {lr} + vld2.16 {d16[0], d18[0]}, [r3], r1 + vld2.16 {d20[0], d22[0]}, [r0], r1 + + cmp r2, #0x10000 + vld2.16 {d16[1], d18[1]}, [r3], r1 + vld2.16 {d20[1], d22[1]}, [r0], r1 + + vld2.16 {d16[2], d18[2]}, [r3], r1 + vld2.16 {d20[2], d22[2]}, [r0], r1 + + vld2.16 {d16[3], d18[3]}, [r3], r1 + vld2.16 {d20[3], d22[3]}, [r0], r1 + blo 10f + + vld2.16 {d17[0], d19[0]}, [r3], r1 + vld2.16 {d21[0], d23[0]}, [r0], r1 + + sub ip, r0, r3 + vld2.16 {d17[1], d19[1]}, [r3], r1 + vld2.16 {d21[1], d23[1]}, [r0], r1 + + cmp ip, #4 + vld2.16 {d17[2], d19[2]}, [r3], r1 + vld2.16 {d21[2], d23[2]}, [r0], r1 + + vld2.16 {d17[3], d19[3]}, [r3] + vld2.16 {d21[3], d23[3]}, [r0] + + hevc_loop_filter_uv_body2 d16, d17, d18, d19, d20, d21, d22, d23 \ + "ldr lr, [sp, #4]", \ + "neg r1, r1", \ + "it eq; cmpeq lr, #0", \ + "add r3, #2", \ + "add ip, r3, r1", \ + "add r2, r0, r1", \ + "lsl r1, #1" + + bne 1f + +@ Much/most of the time r0 == r3 + 4 and no_f == 0 +@ so it is worth having this special case + vst2.16 {d19[3], d21[3]}, [r3], r1 @ P0b, Q0b + vst2.16 {d19[2], d21[2]}, [ip], r1 + vst2.16 {d19[1], d21[1]}, [r3], r1 + vst2.16 {d19[0], d21[0]}, [ip], r1 + vst2.16 {d18[3], d20[3]}, [r3], r1 @ P0a, Q0a + vst2.16 {d18[2], d20[2]}, [ip], r1 + vst2.16 {d18[1], d20[1]}, [r3] + vst2.16 {d18[0], d20[0]}, [ip] + pop {pc} + +@ Either split or partial +1: + lsls lr, #29 @ b3 (Q0b) -> C, b2 (P0b) -> N & b31, b1 (Q0a) -> b30, b0 (P0a) -> b29 + ittt cs + addcs r0, r0, r1, lsl #1 + addcs r2, r2, r1, lsl #1 + bcs 1f + @ Q0b + vst1.16 {d21[3]}, [r0], r1 + vst1.16 {d21[2]}, [r2], r1 + vst1.16 {d21[1]}, [r0], r1 + vst1.16 {d21[0]}, [r2], r1 +1: + ittt mi + addmi r3, r3, r1, lsl #1 + addmi ip, ip, r1, lsl #1 + bmi 1f + @ P0b + vst1.16 {d19[3]}, [r3], r1 + vst1.16 {d19[2]}, [ip], r1 + vst1.16 {d19[1]}, [r3], r1 + vst1.16 {d19[0]}, [ip], r1 +1: + lsls lr, #2 @ b30 (Q0a) -> C, b29 (P0a) -> N & b31 + bcs 1f + @ Q0a + vst1.16 {d20[3]}, [r0], r1 + vst1.16 {d20[2]}, [r2], r1 + vst1.16 {d20[1]}, [r0] + vst1.16 {d20[0]}, [r2] +1: + it mi + popmi {pc} + @ P0a + vst1.16 {d18[3]}, [r3], r1 + vst1.16 {d18[2]}, [ip], r1 + vst1.16 {d18[1]}, [r3] + vst1.16 {d18[0]}, [ip] + pop {pc} + +@ Single lump (rather than double) +10: + @ As we have post inced r0/r3 in the load the easiest thing to do is + @ to subtract and write forwards, rather than backwards (as above) + @ b0 (P0a) -> N, b1 (Q0a) -> C + + hevc_loop_filter_uv_body1 d16, d18, d20, d22 \ + "ldr lr, [sp, #4]", \ + "add r3, #2", \ + "sub r0, r0, r1, lsl #2", \ + "sub r3, r3, r1, lsl #2", \ + "lsls lr, #31", \ + "add r2, r0, r1", \ + "add ip, r3, r1", \ + "lsl r1, #1" + + bcs 3f + @ Q0a + vst1.16 {d20[0]}, [r0], r1 + vst1.16 {d20[1]}, [r2], r1 + vst1.16 {d20[2]}, [r0] + vst1.16 {d20[3]}, [r2] +3: + it mi + popmi {pc} + @ P0a + vst1.16 {d18[0]}, [r3], r1 + vst1.16 {d18[1]}, [ip], r1 + vst1.16 {d18[2]}, [r3] + vst1.16 {d18[3]}, [ip] + pop {pc} + +endfunc + + +@ void ff_hevc_rpi_v_loop_filter_uv2_neon(uint8_t * src_r, // r0 +@ unsigned int stride, // r1 +@ uint32_t tc4, // r2 +@ uint8_t * src_l, // r3 +@ unsigned int no_f); // sp[0] +@ + +@ no_f +@ 0 tl P0a +@ 1 tr Q0a +@ 2 bl P0b +@ 3 br Q0b + +@ P1: q8, q12 +@ P0: q9, q13 +@ Q0: q10, q14 +@ Q1: q11, q15 + +.macro m_filter_v_uv2_16 bit_depth + cmp r2, #0 + it eq + bxeq lr + push {lr} + vld2.32 {d16[0], d18[0]}, [r3], r1 + vld2.32 {d20[0], d22[0]}, [r0], r1 + + cmp r2, #0x10000 + vld2.32 {d16[1], d18[1]}, [r3], r1 + vld2.32 {d20[1], d22[1]}, [r0], r1 + + vld2.32 {d17[0], d19[0]}, [r3], r1 + vld2.32 {d21[0], d23[0]}, [r0], r1 + + vld2.32 {d17[1], d19[1]}, [r3], r1 + vld2.32 {d21[1], d23[1]}, [r0], r1 + blo 10f + + vld2.32 {d24[0], d26[0]}, [r3], r1 + vld2.32 {d28[0], d30[0]}, [r0], r1 + + sub ip, r0, r3 + vld2.32 {d24[1], d26[1]}, [r3], r1 + vld2.32 {d28[1], d30[1]}, [r0], r1 + + cmp ip, #8 + vld2.32 {d25[0], d27[0]}, [r3], r1 + vld2.32 {d29[0], d31[0]}, [r0], r1 + + vld2.32 {d25[1], d27[1]}, [r3] + vld2.32 {d29[1], d31[1]}, [r0] + + hevc_loop_filter_uv_body2_16 q8, q12, q9, q13, q10, q14, q11, q15, \bit_depth, \ + "ldr lr, [sp, #4]", \ + "neg r1, r1", \ + "it eq; cmpeq lr, #0", \ + "add r3, #4", \ + "add ip, r3, r1", \ + "add r2, r0, r1", \ + "lsl r1, #1" + + bne 1f + +@ Much/most of the time r0 == r3 + 8 and no_f == 0 +@ so it is worth having this special case + vst2.32 {d27[1], d29[1]}, [r3], r1 @ P0b, Q0b + vst2.32 {d27[0], d29[0]}, [ip], r1 + vst2.32 {d26[1], d28[1]}, [r3], r1 + vst2.32 {d26[0], d28[0]}, [ip], r1 + vst2.32 {d19[1], d21[1]}, [r3], r1 @ P0a, Q0a + vst2.32 {d19[0], d21[0]}, [ip], r1 + vst2.32 {d18[1], d20[1]}, [r3] + vst2.32 {d18[0], d20[0]}, [ip] + pop {pc} + +@ Either split or partial +1: + lsls lr, #29 @ b3 (Q0b) -> C, b2 (P0b) -> N & b31, b1 (Q0a) -> b30, b0 (P0a) -> b29 + ittt cs + addcs r0, r0, r1, lsl #1 + addcs r2, r2, r1, lsl #1 + bcs 1f + @ Q0b + vst1.32 {d29[1]}, [r0], r1 + vst1.32 {d29[0]}, [r2], r1 + vst1.32 {d28[1]}, [r0], r1 + vst1.32 {d28[0]}, [r2], r1 +1: + ittt mi + addmi r3, r3, r1, lsl #1 + addmi ip, ip, r1, lsl #1 + bmi 1f + @ P0b + vst1.32 {d27[1]}, [r3], r1 + vst1.32 {d27[0]}, [ip], r1 + vst1.32 {d26[1]}, [r3], r1 + vst1.32 {d26[0]}, [ip], r1 +1: + lsls lr, #2 @ b30 (Q0a) -> C, b29 (P0a) -> N & b31 + bcs 1f + @ Q0a + vst1.32 {d21[1]}, [r0], r1 + vst1.32 {d21[0]}, [r2], r1 + vst1.32 {d20[1]}, [r0] + vst1.32 {d20[0]}, [r2] +1: + it mi + popmi {pc} + @ P0a + vst1.32 {d19[1]}, [r3], r1 + vst1.32 {d19[0]}, [ip], r1 + vst1.32 {d18[1]}, [r3] + vst1.32 {d18[0]}, [ip] + pop {pc} + +@ Single lump (rather than double) +10: + @ As we have post inced r0/r3 in the load the easiest thing to do is + @ to subtract and write forwards, rather than backwards (as above) + @ b0 (P0a) -> N, b1 (Q0a) -> C + + hevc_loop_filter_uv_body1_16 q8, q9, q10, q11, \bit_depth, \ + "ldr lr, [sp, #4]", \ + "add r3, #4", \ + "sub r0, r0, r1, lsl #2", \ + "sub r3, r3, r1, lsl #2", \ + "lsls lr, #31", \ + "add r2, r0, r1", \ + "add ip, r3, r1", \ + "lsl r1, #1" + + bcs 3f + @ Q0a + vst1.32 {d20[0]}, [r0], r1 + vst1.32 {d20[1]}, [r2], r1 + vst1.32 {d21[0]}, [r0] + vst1.32 {d21[1]}, [r2] +3: + it mi + popmi {pc} + @ P0a + vst1.32 {d18[0]}, [r3], r1 + vst1.32 {d18[1]}, [ip], r1 + vst1.32 {d19[0]}, [r3] + vst1.32 {d19[1]}, [ip] + pop {pc} +.endm + + +@ The NEON version is faster under ideal circumstances (i.e. everything in L1) +@ But in real world testing it is ~20% slower, presumably due to code size + +#if 0 // NEON version + +/* uint32_t ff_hevc_rpi_deblocking_boundary_strengths_neon(int pus, int dup, const HEVCRpiMvField *curr, const HEVCRpiMvField *neigh, + * const int *curr_rpl0, const int *curr_rpl1, const int *neigh_rpl0, const int *neigh_rpl1, + * int in_inc0, int in_inc1) + */ +function ff_hevc_rpi_deblocking_boundary_strengths_neon, export=1 + mov ip, sp + push {a1-a3,v1-v8,lr} + ldm ip, {v1-v6} + cmp a1, #2 + bls 2f + vpush {d8-d13} + sub v5, v5, #10 + sub v6, v6, #10 +1: + vld2.32 {d0[0], d2[0]}, [a3]! + vld2.32 {d4[0], d6[0]}, [a4]! + vmov.u8 q12, #0 + ldrb a2, [a3], #1 + ldrb ip, [a4], #1 + ldrb v8, [a3], #1 + ldrb lr, [a4], #1 + add a2, v1, a2, lsl #2 + vld1.8 {d24[0]}, [a3], v5 + add ip, v3, ip, lsl #2 + vld1.8 {d25[0]}, [a4], v6 + add v8, v2, v8, lsl #2 + vld1.32 {d16[0]}, [a2] + add lr, v4, lr, lsl #2 + vld1.32 {d20[0]}, [ip] + vld1.32 {d18[0]}, [v8] + vld1.32 {d22[0]}, [lr] + + vld2.32 {d0[1], d2[1]}, [a3]! + vld2.32 {d4[1], d6[1]}, [a4]! + ldrb a2, [a3], #1 + vmov.u16 d12, #1 + ldrb ip, [a4], #1 + vmov.u16 d13, #2 + ldrb v8, [a3], #1 + vmov.u16 d27, #4 + ldrb lr, [a4], #1 + add a2, v1, a2, lsl #2 + vld1.8 {d24[2]}, [a3], v5 + add ip, v3, ip, lsl #2 + vld1.8 {d25[2]}, [a4], v6 + add v8, v2, v8, lsl #2 + vld1.32 {d16[1]}, [a2] + add lr, v4, lr, lsl #2 + vld1.32 {d20[1]}, [ip] + vld1.32 {d18[1]}, [v8] + vld1.32 {d22[1]}, [lr] + + vld2.32 {d1[0], d3[0]}, [a3]! + vld2.32 {d5[0], d7[0]}, [a4]! + ldrb a2, [a3], #1 + ldrb ip, [a4], #1 + ldrb lr, [a4], #1 + ldrb v8, [a3], #1 + add a2, v1, a2, lsl #2 + vld1.8 {d24[4]}, [a3], v5 + add ip, v3, ip, lsl #2 + vld1.8 {d25[4]}, [a4], v6 + add v8, v2, v8, lsl #2 + vld1.32 {d17[0]}, [a2] + add lr, v4, lr, lsl #2 + vld1.32 {d21[0]}, [ip] + vld1.32 {d19[0]}, [v8] + vld1.32 {d23[0]}, [lr] + + vld2.32 {d1[1], d3[1]}, [a3]! + vld2.32 {d5[1], d7[1]}, [a4]! + ldrb a2, [a3], #1 + ldrb ip, [a4], #1 + ldrb v8, [a3], #1 + ldrb lr, [a4], #1 + add a2, v1, a2, lsl #2 + vld1.8 {d24[6]}, [a3], v5 + add ip, v3, ip, lsl #2 + vld1.8 {d25[6]}, [a4], v6 + add v8, v2, v8, lsl #2 + vld1.32 {d17[1]}, [a2] + add lr, v4, lr, lsl #2 + vld1.32 {d21[1]}, [ip] + vld1.32 {d19[1]}, [v8] + vld1.32 {d23[1]}, [lr] + + @ So now we have: + @ q0.32[i] = curr[i].mv[0] + @ q1.32[i] = curr[i].mv[1] + @ q2.32[i] = neigh[i].mv[0] + @ q3.32[i] = neigh[i].mv[1] + @ q8.32[i] = curr_rpl0[curr[i].ref_idx[0]] + @ q9.32[i] = curr_rpl1[curr[i].ref_idx[1]] + @ q10.32[i] = neigh_rpl0[neigh[i].ref_idx[0]] + @ q11.32[i] = neigh_rpl1[neigh[i].ref_idx[1]] + @ d24.16[i] = curr[i].pred_flag + @ d25.16[i] = neigh[i].pred_flag + + vtst.16 d28, d24, d12 + vtst.16 d29, d24, d13 + vadd.i16 d8, d24, d12 + vadd.i16 d9, d25, d12 + vtst.16 d30, d25, d12 + vtst.16 d31, d25, d13 + veor d26, d8, d9 + ldr lr, [sp, 6*8 + 1*4] + vmovl.s16 q4, d28 + vmovl.s16 q5, d29 + teq lr, #1 + vmovl.s16 q14, d30 + it ne + lslne v1, lr, #1 + vmovl.s16 q15, d31 + it ne + rsbne v2, v1, #32 + vbif q0, q1, q4 + vbif q2, q3, q14 + vbif q1, q0, q5 + vbif q3, q2, q15 + vabd.s16 q12, q0, q2 + vabd.s16 q2, q1 + vabd.s16 q0, q3 + vabd.s16 q1, q3 + vbif q8, q9, q4 + vbif q10, q11, q14 + vbif q9, q8, q5 + vbif q11, q10, q15 + vclt.u16 d6, d24, d27 + vclt.u16 d8, d2, d27 + vclt.u16 d7, d25, d27 + vclt.u16 d9, d3, d27 + vclt.u16 d2, d0, d27 + vclt.u16 d0, d4, d27 + vclt.u16 d3, d1, d27 + vclt.u16 d1, d5, d27 + vceq.i32 q12, q10, q8 + vceq.i32 q10, q9 + vceq.i32 q8, q11 + vceq.i32 q9, q11 + vshrn.i32 d6, q3, #8 + vshrn.i32 d7, q4, #8 + vshrn.i32 d8, q1, #8 + vshrn.i32 d9, q0, #8 + vmovn.i32 d4, q12 + vmovn.i32 d2, q10 + vmovn.i32 d3, q8 + vmovn.i32 d5, q9 + vand q2, q3 + vrev16.8 q3, q3 + vand q2, q3 + vand q1, q4 + vrev16.8 q4, q4 + vand q1, q4 + vand d4, d5 + vand d2, d3 + vbic d0, d12, d4 + vshr.u16 d26, #2 + vbic d0, d2 + vmov.i16 d1, #0x5555 + vorr d0, d26 + bne 10f + + @ Merge results into result word, no duplicates + vmov a2, s0 + vmov v8, s1 + vmov.u16 ip, d0[1] + vmov.u16 lr, d0[3] + lsl a2, #30 + lsl v8, #30 + lsl ip, #30 + lsl lr, #30 + orr a2, ip, a2, lsr #2 + orr v8, lr, v8, lsr #2 + orr a2, v8, a2, lsr #4 + subs a1, #4 + orr v7, a2, v7, lsr #8 + bhi 1b + + mov a1, #32 + ldr a3, [sp, #6*8] + vpop {d8-d13} + sub a1, a1, a3, lsl #1 + mov a1, v7, lsr a1 + pop {a2-a4,v1-v8,pc} +10: + @ Merge results into result word, with duplicates + vmul.i16 d0, d1 + vmov a2, s0 + vmov v8, s1 + vmov.u16 ip, d0[1] + vmov.u16 lr, d0[3] + lsl a2, v2 + subs a1, #4 + lsl v8, v2 + lsl ip, v2 + lsl lr, v2 + ldr v2, [sp, #6*8 + 12*4 + 1*4] +T lsr a2, v1 +T orr a2, ip, a2 +A orr a2, ip, a2, lsr v1 + lsl ip, v1, #1 +T lsr v8, v1 +T orr v8, lr, v8 +A orr v8, lr, v8, lsr v1 + lsl lr, v1, #2 +T lsr a2, ip +T orr a2, v8, a2 +A orr a2, v8, a2, lsr ip + ldr v1, [sp, #6*8 + 12*4] +T lsr v7, lr +T orr v7, a2, v7 +A orr v7, a2, v7, lsr lr + bhi 1b + + mov a1, #32 + ldrd a3, a4, [sp, #6*8] + vpop {d8-d13} + mls a1, a3, a4, a1 + mls a1, a3, a4, a1 + mov a1, v7, lsr a1 + pop {a2-a4,v1-v8,pc} + + +2: + sub v5, v5, #10 + sub v6, v6, #10 + vmov.u8 d16, #0 + blo 3f + vld2.32 {d0[0], d1[0]}, [a3]! + vld2.32 {d2[0], d3[0]}, [a4]! + ldrb a2, [a3], #1 + ldrb ip, [a4], #1 + ldrb lr, [a4], #1 + ldrb v8, [a3], #1 + add a2, v1, a2, lsl #2 + vld1.8 {d16[0]}, [a3], v5 + add ip, v3, ip, lsl #2 + vld1.8 {d16[4]}, [a4], v6 + add v8, v2, v8, lsl #2 + vld1.32 {d4[0]}, [a2] + add lr, v4, lr, lsl #2 + vld1.32 {d5[0]}, [ip] + vld1.32 {d6[0]}, [v8] + vld1.32 {d7[0]}, [lr] + +3: + vld2.32 {d0[1], d1[1]}, [a3]! + vld2.32 {d2[1], d3[1]}, [a4]! + ldrb a2, [a3], #1 + vmov.u16 d17, #1 + ldrb ip, [a4], #1 + vmov.u16 d18, #2 + ldrb v8, [a3], #1 + vmov.u16 d19, #4 + ldrb lr, [a4], #1 + add a2, v1, a2, lsl #2 + vld1.8 {d16[2]}, [a3], v5 + add ip, v3, ip, lsl #2 + vld1.8 {d16[6]}, [a4], v6 + add v8, v2, v8, lsl #2 + vld1.32 {d4[1]}, [a2] + add lr, v4, lr, lsl #2 + vld1.32 {d5[1]}, [ip] + vld1.32 {d6[1]}, [v8] + vld1.32 {d7[1]}, [lr] + + @ So now we have: + @ d0.32[i] = curr[i].mv[0] + @ d1.32[i] = curr[i].mv[1] + @ d2.32[i] = neigh[i].mv[0] + @ d3.32[i] = neigh[i].mv[1] + @ d4.32[i] = curr_rpl0[curr[i].ref_idx[0]] + @ d5.32[i] = neigh_rpl0[neigh[i].ref_idx[0]] + @ d6.32[i] = curr_rpl1[curr[i].ref_idx[1]] + @ d7.32[i] = neigh_rpl1[neigh[i].ref_idx[1]] + @ d16.16[i] = curr[i].pred_flag + @ d16.16[2+i] = neigh[i].pred_flag + + vtst.16 d20, d16, d17 + vtst.16 d22, d16, d18 + vadd.i16 d30, d16, d17 + vswp d2, d3 + ldr lr, [sp, #1*4] + vmovl.s16 q10, d20 + teq lr, #1 + vmovl.s16 q11, d22 + it ne + lslne v1, lr, #1 + vbif d0, d1, d20 + vbif d4, d6, d20 + vbif d3, d2, d21 + vbif d5, d7, d21 + vbif d1, d0, d22 + vbif d6, d4, d22 + vbif d2, d3, d23 + vbif d7, d5, d23 + vshr.u16 d30, #2 + vabd.s16 d24, d0, d3 + vabd.s16 d25, d1, d2 + vabd.s16 q0, q0, q1 + vceq.i32 d2, d4, d5 + vceq.i32 d20, d5, d6 + vceq.i32 d21, d4, d7 + vceq.i32 d3, d6, d7 + vclt.u16 d6, d24, d19 + vclt.u16 d7, d25, d19 + vclt.u16 d22, d1, d19 + vclt.u16 d23, d0, d19 + vshrn.i32 d6, q3, #8 + vmovn.i32 d2, q1 + vshrn.i32 d7, q11, #8 + vmovn.i32 d3, q10 + vand q0, q3, q1 + it ne + rsbne v2, v1, #32 + vrev16.8 q3, q3 + vand q0, q3 + vsra.u64 d30, #32 + vshr.u64 q1, q0, #32 + vand q0, q1 + vbic d0, d17, d0 + vand d30, d30, d17 + vbic d0, d1 + vmov.i16 d1, #0x5555 + vorr d0, d30 + bne 10f + + @ Construct result word, no duplicates + cmp a1, #2 + vmov.u16 a1, d0[1] + vmov.u16 a2, d0[0] + it eq + orreq a1, a2, a1, lsl #2 + pop {a2-a4,v1-v8,pc} +10: + @ Construct result word, with duplicates + cmp a1, #2 + vmul.i16 d0, d1 + vmov a2, s0 + vmov.u16 a1, d0[1] + lsl a2, #16 + pkhbt a1, a1, a1, lsl #16 + lsr a2, v2 + lsr a1, v2 +T itt eq +T lsleq a1, v1 +T orreq a1, a2, a1 +A orreq a1, a2, a1, lsl v1 + pop {a2-a4,v1-v8,pc} +endfunc + + + +#else // non-NEON version + + +/* uint32_t ff_hevc_rpi_deblocking_boundary_strengths_neon(int pus, int dup, const HEVCRpiMvField *curr, const HEVCRpiMvField *neigh, + * const int *curr_rpl0, const int *curr_rpl1, const int *neigh_rpl0, const int *neigh_rpl1, + * int in_inc0, in_inc1) + */ +function ff_hevc_rpi_deblocking_boundary_strengths_neon, export=1 + add ip, sp, #4*4 + push {a2-a4,v1-v8,lr} + mov v6, #32 +1: ldmdb ip, {v1-v4} + ldrsb v5, [a3, #8] @ curr->ref_idx + ldrsb v8, [a3, #9] + ldrsb ip, [a4, #8] @ neigh->ref_idx + ldrsb lr, [a4, #9] + ldr v1, [v1, v5, lsl #2] + ldrb v5, [a3, #10] @ curr->pred_flag + ldr v2, [v2, v8, lsl #2] + ldrb v8, [a4, #10] @ neigh->pred_flag + ldr v3, [v3, ip, lsl #2] + ldr v4, [v4, lr, lsl #2] + teq v5, #3 + beq 20f + teq v8, #3 + beq 90f + + tst v5, #1 + itee ne + ldrne v5, [a3, #0] @ curr->mv[0] + moveq v1, v2 + ldreq v5, [a3, #4] @ curr->mv[1] + tst v8, #1 + itee ne + ldrne v8, [a4, #0] @ neigh->mv[0] + moveq v3, v4 + ldreq v8, [a4, #4] @ neigh->mv[1] + teq v1, v3 + bne 10f + ldr lr, =0xFFFCFFFC + ssub16 ip, v8, v5 + ssub16 v5, v5, v8 + sel v5, v5, ip + ands v5, v5, lr + @ drop through +10: it ne + movne v5, #1<<30 +11: + sub v6, v6, #2 +T mov v7, v7, lsr #2 + subs a2, a2, #1 +A orr v7, v5, v7, lsr #2 +T orr v7, v5, v7 + bhi 11b + + ldrd v3, v4, [sp, #16*4] + ldr a2, [sp] + add ip, sp, #16*4 + subs a1, a1, #1 + add a3, a3, v3 + add a4, a4, v4 + bhi 1b + mov a1, v7, lsr v6 + pop {a2-a4,v1-v8,pc} + +20: teq v8, #3 + bne 10b + + teq v1, v3 + it eq + teqeq v2, v4 + bne 40f + teq v1, v2 + bne 30f + + ldrd v1, v2, [a3] @ curr->mv + ldrd v3, v4, [a4] @ neigh->mv + ldr lr, =0xFFFCFFFC + ssub16 ip, v3, v1 + ssub16 v5, v1, v3 + sel v5, v5, ip + ands v5, v5, lr + bne 25f + ssub16 ip, v4, v2 + ssub16 v5, v2, v4 + sel v5, v5, ip + ands v5, v5, lr + beq 11b + @ drop through +25: ssub16 ip, v4, v1 + ssub16 v5, v1, v4 + sel v5, v5, ip + ands v5, v5, lr + bne 10b + ssub16 ip, v3, v2 + ssub16 v5, v2, v3 + sel v5, v5, ip + ands v5, v5, lr + b 10b + +30: ldrd v1, v2, [a3] @ curr->mv + ldrd v3, v4, [a4] @ neigh->mv + ldr lr, =0xFFFCFFFC + ssub16 ip, v3, v1 + ssub16 v5, v1, v3 + sel v5, v5, ip + ands v5, v5, lr + bne 10b + ssub16 ip, v4, v2 + ssub16 v5, v2, v4 + sel v5, v5, ip + ands v5, v5, lr + b 10b + +40: teq v1, v4 + ite eq + teqeq v2, v3 + bne 10b + + ldrd v1, v2, [a3] @ curr->mv + ldrd v3, v4, [a4] @ neigh->mv + ldr lr, =0xFFFCFFFC + b 25b + +90: + mov v5, #1<<30 + b 11b +endfunc + + +#endif + + +@ ============================================================================= +@ +@ 10 bit + +function hevc_loop_filter_luma_body_10 + m_filter_luma 10, q11, q15 +endfunc + +function ff_hevc_rpi_h_loop_filter_luma_neon_10, export=1 + hevc_loop_filter_luma_start + b .Lh_loop_luma_common_10 +endfunc + +function ff_hevc_rpi_h_loop_filter_luma2_neon_10, export=1 + cmp r3, #0 + it eq + bxeq lr + push {r4-r10,lr} @ 32 bytes + ldr r10, [sp, #32] +.Lh_loop_luma_common_10: + m_filter_h_luma_16 10 +endfunc + +function ff_hevc_rpi_v_loop_filter_luma_neon_10, export=1 + hevc_loop_filter_luma_start + sub r4, r0, #8 + b .Lv_loop_luma_common_10 +endfunc + +function ff_hevc_rpi_v_loop_filter_luma2_neon_10, export=1 + cmp r3, #0 + it eq + bxeq lr + push {r4-r10,lr} @ 32 bytes + ldr r4, [sp, #36] + ldr r10, [sp, #32] + +.Lv_loop_luma_common_10: + m_filter_v_luma_16 10 +endfunc + +function ff_hevc_rpi_h_loop_filter_uv_neon_10, export=1 + m_filter_h_uv_16 10 +endfunc + +function ff_hevc_rpi_v_loop_filter_uv2_neon_10, export=1 + m_filter_v_uv2_16 10 +endfunc + diff --git a/libavcodec/arm/rpi_hevcdsp_idct_neon.S b/libavcodec/arm/rpi_hevcdsp_idct_neon.S new file mode 100644 index 0000000000..7ed5c7dc52 --- /dev/null +++ b/libavcodec/arm/rpi_hevcdsp_idct_neon.S @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2014 Seppo Tomperi + * Copyright (C) 2018 John Cox, Ben Avison for Raspberry Pi (Trading) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/arm/asm.S" +#include "neon.S" + +/* uses registers q8 - q13 for temp values */ +.macro tr4_luma_shift shift + vaddl.s16 q8, d28, d30 // c0 = src0 + src2 + vaddl.s16 q9, d30, d31 // c1 = src2 + src3 + vsubl.s16 q10, d28, d31 // c2 = src0 - src3 + vaddl.s16 q11, d28, d31 // src0 + src3 + + vmul.i32 q12, q8, d1[0] // 29 * c0 + vmul.i32 q13, q10, d2[0] // 55 * c2 + vmul.i32 q8, q8, d2[0] // 55 * c0 + vmull.s16 q14, d29, d0[0] // c3 = 74 * src1 + + vsubw.s16 q11, q11, d30 // src0 - src2 + src3 + vmla.i32 q12, q9, d2[0] // 29 * c0 + 55 * c1 + vmls.i32 q13, q9, d1[0] // 55 * c2 - 29 * c1 + vmla.i32 q8, q10, d1[0] // 55 * c0 + 29 * c2 + + vmul.i32 q11, q11, d0[0] // dst2 = 74 * (src0 - src2 + src3) + vadd.i32 q12, q12, q14 // dst0 = 29 * c0 + 55 * c1 + c3 + vadd.i32 q13, q13, q14 // dst1 = 55 * c2 - 29 * c1 + c3 + vsub.i32 q8, q8, q14 // dst3 = 55 * c0 + 29 * c2 - c3 + + vqrshrn.s32 d28, q12, \shift + vqrshrn.s32 d29, q13, \shift + vqrshrn.s32 d30, q11, \shift + vqrshrn.s32 d31, q8, \shift +.endm + +/* uses registers q8 - q11 for temp values */ +.macro tr4_shift shift + vmull.s16 q9, d29, d0[0] // 83 * src1 + vmull.s16 q8, d29, d0[1] // 36 * src1 + vshll.s16 q14, d28, #6 // 64 * src0 + vshll.s16 q10, d30, #6 // 64 * src2 + vmlal.s16 q9, d31, d0[1] // 83 * src1 + 36 * src3 o0 + vmlsl.s16 q8, d31, d0[0] // 36 * src1 - 83 * src3 o1 + vadd.s32 q11, q14, q10 // 64 * (src0 + src2) e0 + vsub.s32 q10, q14, q10 // 64 * (src0 - src2) e1 + vadd.s32 q14, q11, q9 // e0 + o0 + vadd.s32 q15, q10, q8 // e1 + o1 + vsub.s32 q8, q10, q8 // e1 - o1 + vsub.s32 q9, q11, q9 // e0 - o0 + + vqrshrn.s32 d28, q14, \shift + vqrshrn.s32 d29, q15, \shift + vqrshrn.s32 d30, q8, \shift + vqrshrn.s32 d31, q9, \shift +.endm + +.macro tr8_process d0, d1, d2, d3, d4, d5, d6, d7, \ + tmp0, /* Q reg which doesn't alias with d4, d6 or d7 */ \ + tmp1, /* Q reg which doesn't alias with d7 or d0 */ \ + shift, I1, I2, I3 + + vmull.s16 q4, \d1, d1[1] // 89 * src1 + \I1 + vmull.s16 q5, \d1, d1[0] // 75 * src1 + \I2 + vmull.s16 q6, \d1, d1[3] // 50 * src1 + \I3 + vmull.s16 q7, \d1, d1[2] // 18 * src1 + vmlal.s16 q4, \d3, d1[0] // 75 * src3 + vmlsl.s16 q5, \d3, d1[2] //-18 * src3 + vmlsl.s16 q6, \d3, d1[1] //-89 * src3 + vmlsl.s16 q7, \d3, d1[3] //-50 * src3 + + // tr4 + vmull.s16 q1, \d2, d0[0] // 83 * src(1*2) + vmull.s16 q2, \d2, d0[1] // 36 * src(1*2) + + vmlal.s16 q4, \d5, d1[3] // 50 * src5 + vmlsl.s16 q5, \d5, d1[1] //-89 * src5 + vmlal.s16 q6, \d5, d1[2] // 18 * src5 + vmlal.s16 q7, \d5, d1[0] // 75 * src5 + + vshll.s16 q3, \d0, #6 // 64 * src(0*2) + vshll.s16 \tmp0, \d4, #6 // 64 * src(2*2) + vmlal.s16 q1, \d6, d0[1] // 83 * src(1*2) + 36 * src(3*2) o0 + vmlsl.s16 q2, \d6, d0[0] // 36 * src(1*2) - 83 * src(3*2) o1 + vadd.i32 \tmp1, q3, \tmp0 // 64 * (src(0*2) + src(2*2)) e0 + vsub.i32 \tmp0, q3, \tmp0 // 64 * (src(0*2) - src(2*2)) e1 + + vmlal.s16 q4, \d7, d1[2] // 18 * src7 + vmlsl.s16 q5, \d7, d1[3] //-50 * src7 + vmlal.s16 q6, \d7, d1[0] // 75 * src7 + vmlsl.s16 q7, \d7, d1[1] //-89 * src7 + + vsub.i32 q3, \tmp1, q1 // e0 - o0 + vadd.i32 \tmp1, \tmp1, q1 // e0 + o0 + vadd.i32 q1, \tmp0, q2 // e1 + o1 + vsub.i32 q2, \tmp0, q2 // e1 - o1 + + vadd.i32 \tmp0, \tmp1, q4 // e_8[0] + o_8[0], dst[0] + vsub.i32 q4, \tmp1, q4 // e_8[0] - o_8[0], dst[7] + vsub.i32 \tmp1, q3, q7 // e_8[3] - o_8[3], dst[4] + vadd.i32 q7, q3, q7 // e_8[3] + o_8[3], dst[3] + vadd.i32 q3, q1, q5 // e_8[1] + o_8[1], dst[1] + vsub.i32 q5, q1, q5 // e_8[1] - o_8[1], dst[6] + vsub.i32 q1, q2, q6 // e_8[2] - o_8[2], dst[5] + vadd.i32 q6, q2, q6 // e_8[2] + o_8[2], dst[2] + vqrshrn.s32 \d0, \tmp0, #\shift + vqrshrn.s32 \d4, \tmp1, #\shift + vqrshrn.s32 \d1, q3, #\shift + vqrshrn.s32 \d5, q1, #\shift + vqrshrn.s32 \d2, q6, #\shift + vqrshrn.s32 \d6, q5, #\shift + vqrshrn.s32 \d3, q7, #\shift + vqrshrn.s32 \d7, q4, #\shift +.endm + +.macro tr8_vert d0, d1, d2, d3, d4, d5, d6, d7, q01, q23, I1, I2, I3 + vld1.16 {\d0}, [r0 :64], r3 + vld1.16 {\d1}, [r2 :64], r3 + vld1.16 {\d2}, [r0 :64], r3 + vld1.16 {\d3}, [r2 :64], r3 + vld1.16 {\d4}, [r0 :64], r3 + vld1.16 {\d5}, [r2 :64], r3 + vld1.16 {\d6}, [r0 :64], r3 + vld1.16 {\d7}, [r2 :64], r3 + + tr8_process \ + \d0, \d1, \d2, \d3, \d4, \d5, \d6, \d7, \ + \q01, \q23, 7, "\I1", "\I2", "\I3" +.endm + +.macro tr8_horiz d0, d1, d2, d3, d4, d5, d6, d7, q01, q23, shift + tr8_process \ + \d0, \d1, \d2, \d3, \d4, \d5, \d6, \d7, \ + \q01, \q23, \shift + + vzip.16 \d0, \d4 + vzip.16 \d1, \d5 + vzip.16 \d2, \d6 + vzip.16 \d3, \d7 + vst4.16 {\d0-\d3}, [r0 :128], r3 + vst4.16 {\d4-\d7}, [r2 :128], r3 +.endm + +#define BIT_DEPTH 8 +#include "rpi_hevc_idct_fn_neon.S" + +.text + +.align 4 +tr4f: +.word 0x00240053 // 36 and d1[0] = 83 +.word 0x00000000 +tr8f: +.word 0x0059004b // 89, d0[0] = 75 +.word 0x00320012 // 50, d0[2] = 18 +tr16: +.word 0x005a0057 // 90, d2[0] = 87 +.word 0x00500046 // 80, d2[2] = 70 +.word 0x0039002b // 57, d2[0] = 43 +.word 0x00190009 // 25, d2[2] = 9 + +#undef BIT_DEPTH +#define BIT_DEPTH 10 +#include "rpi_hevc_idct_fn_neon.S" + diff --git a/libavcodec/arm/rpi_hevcdsp_init_arm.c b/libavcodec/arm/rpi_hevcdsp_init_arm.c new file mode 100644 index 0000000000..109fa98c29 --- /dev/null +++ b/libavcodec/arm/rpi_hevcdsp_init_arm.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2014 Seppo Tomperi + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/attributes.h" +#include "libavutil/arm/cpu.h" +#include "libavcodec/rpi_hevcdsp.h" +#include "rpi_hevcdsp_arm.h" + +av_cold void ff_hevcdsp_rpi_init_arm(HEVCDSPContext *c, const int bit_depth) +{ + int cpu_flags = av_get_cpu_flags(); + + if (have_neon(cpu_flags)) + ff_hevcdsp_rpi_init_neon(c, bit_depth); +} diff --git a/libavcodec/arm/rpi_hevcdsp_init_neon.c b/libavcodec/arm/rpi_hevcdsp_init_neon.c new file mode 100644 index 0000000000..9294ab8010 --- /dev/null +++ b/libavcodec/arm/rpi_hevcdsp_init_neon.c @@ -0,0 +1,467 @@ +/* + * Copyright (c) 2014 Seppo Tomperi + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" +#include "libavutil/attributes.h" +#include "libavutil/arm/cpu.h" +#include "libavcodec/rpi_hevcdsp.h" +#include "rpi_hevcdsp_arm.h" +#include "libavcodec/avcodec.h" +#include "libavcodec/bit_depth_template.c" + +// NEON inter pred fns for qpel & epel (non-sand) exist in the git repo but +// have been removed from head as we never use them. + +void ff_hevc_rpi_v_loop_filter_luma_neon_8(uint8_t *_pix, ptrdiff_t _stride, int _beta, int *_tc, uint8_t *_no_p, uint8_t *_no_q); +void ff_hevc_rpi_h_loop_filter_luma_neon_8(uint8_t *_pix, ptrdiff_t _stride, int _beta, int *_tc, uint8_t *_no_p, uint8_t *_no_q); + +void ff_hevc_rpi_v_loop_filter_luma_neon_10(uint8_t *_pix, ptrdiff_t _stride, int _beta, int *_tc, uint8_t *_no_p, uint8_t *_no_q); +void ff_hevc_rpi_h_loop_filter_luma_neon_10(uint8_t *_pix, ptrdiff_t _stride, int _beta, int *_tc, uint8_t *_no_p, uint8_t *_no_q); + +void ff_hevc_rpi_h_loop_filter_luma2_neon_8(uint8_t * _pix_r, + unsigned int _stride, unsigned int beta, unsigned int tc2, unsigned int no_f); +void ff_hevc_rpi_v_loop_filter_luma2_neon_8(uint8_t * _pix_r, + unsigned int _stride, unsigned int beta, unsigned int tc2, unsigned int no_f, + uint8_t * _pix_l); +void ff_hevc_rpi_h_loop_filter_uv_neon_8(uint8_t * src, unsigned int stride, uint32_t tc4, + unsigned int no_f); +void ff_hevc_rpi_v_loop_filter_uv2_neon_8(uint8_t * src_r, unsigned int stride, uint32_t tc4, + uint8_t * src_l, + unsigned int no_f); + +void ff_hevc_rpi_h_loop_filter_luma2_neon_10(uint8_t * _pix_r, + unsigned int _stride, unsigned int beta, unsigned int tc2, unsigned int no_f); +void ff_hevc_rpi_v_loop_filter_luma2_neon_10(uint8_t * _pix_r, + unsigned int _stride, unsigned int beta, unsigned int tc2, unsigned int no_f, + uint8_t * _pix_l); +void ff_hevc_rpi_h_loop_filter_uv_neon_10(uint8_t * src, unsigned int stride, uint32_t tc4, + unsigned int no_f); +void ff_hevc_rpi_v_loop_filter_uv2_neon_10(uint8_t * src_r, unsigned int stride, uint32_t tc4, + uint8_t * src_l, + unsigned int no_f); + +void ff_hevc_rpi_transform_4x4_neon_8(int16_t *coeffs, int col_limit); +void ff_hevc_rpi_transform_8x8_neon_8(int16_t *coeffs, int col_limit); +void ff_hevc_rpi_idct_4x4_dc_neon_8(int16_t *coeffs); +void ff_hevc_rpi_idct_8x8_dc_neon_8(int16_t *coeffs); +void ff_hevc_rpi_idct_16x16_dc_neon_8(int16_t *coeffs); +void ff_hevc_rpi_idct_32x32_dc_neon_8(int16_t *coeffs); +void ff_hevc_rpi_transform_luma_4x4_neon_8(int16_t *coeffs); + +void ff_hevc_rpi_transform_4x4_neon_10(int16_t *coeffs, int col_limit); +void ff_hevc_rpi_transform_8x8_neon_10(int16_t *coeffs, int col_limit); +void ff_hevc_rpi_idct_4x4_dc_neon_10(int16_t *coeffs); +void ff_hevc_rpi_idct_8x8_dc_neon_10(int16_t *coeffs); +void ff_hevc_rpi_idct_16x16_dc_neon_10(int16_t *coeffs); +void ff_hevc_rpi_idct_32x32_dc_neon_10(int16_t *coeffs); +void ff_hevc_rpi_transform_luma_4x4_neon_10(int16_t *coeffs); + +void ff_hevc_rpi_add_residual_4x4_neon_8(uint8_t *_dst, int16_t *coeffs, + ptrdiff_t stride); +void ff_hevc_rpi_add_residual_8x8_neon_8(uint8_t *_dst, int16_t *coeffs, + ptrdiff_t stride); +void ff_hevc_rpi_add_residual_16x16_neon_8(uint8_t *_dst, int16_t *coeffs, + ptrdiff_t stride); +void ff_hevc_rpi_add_residual_32x32_neon_8(uint8_t *_dst, int16_t *coeffs, + ptrdiff_t stride); + +void ff_hevc_rpi_add_residual_4x4_dc_neon_8(uint8_t *_dst, ptrdiff_t stride, int dc); +void ff_hevc_rpi_add_residual_8x8_dc_neon_8(uint8_t *_dst, ptrdiff_t stride, int dc); +void ff_hevc_rpi_add_residual_16x16_dc_neon_8(uint8_t *_dst, ptrdiff_t stride, int dc); +void ff_hevc_rpi_add_residual_32x32_dc_neon_8(uint8_t *_dst, ptrdiff_t stride, int dc); + + +void ff_hevc_rpi_add_residual_4x4_neon_10(uint8_t *_dst, int16_t *coeffs, + ptrdiff_t stride); +void ff_hevc_rpi_add_residual_8x8_neon_10(uint8_t *_dst, int16_t *coeffs, + ptrdiff_t stride); +void ff_hevc_rpi_add_residual_16x16_neon_10(uint8_t *_dst, int16_t *coeffs, + ptrdiff_t stride); +void ff_hevc_rpi_add_residual_32x32_neon_10(uint8_t *_dst, int16_t *coeffs, + ptrdiff_t stride); + +void ff_hevc_rpi_add_residual_4x4_dc_neon_10(uint8_t *_dst, ptrdiff_t stride, int dc); +void ff_hevc_rpi_add_residual_8x8_dc_neon_10(uint8_t *_dst, ptrdiff_t stride, int dc); +void ff_hevc_rpi_add_residual_16x16_dc_neon_10(uint8_t *_dst, ptrdiff_t stride, int dc); +void ff_hevc_rpi_add_residual_32x32_dc_neon_10(uint8_t *_dst, ptrdiff_t stride, int dc); + + +void ff_hevc_rpi_add_residual_4x4_u_neon_8(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride, int dc_v); +void ff_hevc_rpi_add_residual_8x8_u_neon_8(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride, int dc_v); +void ff_hevc_rpi_add_residual_16x16_u_neon_8(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride, int dc_v); +void ff_hevc_rpi_add_residual_4x4_v_neon_8(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride, int dc_u); +void ff_hevc_rpi_add_residual_8x8_v_neon_8(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride, int dc_u); +void ff_hevc_rpi_add_residual_16x16_v_neon_8(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride, int dc_u); +void ff_hevc_rpi_add_residual_4x4_c_neon_8(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride); +void ff_hevc_rpi_add_residual_8x8_c_neon_8(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride); +void ff_hevc_rpi_add_residual_16x16_c_neon_8(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride); +void ff_hevc_rpi_add_residual_4x4_dc_c_neon_8(uint8_t *_dst, ptrdiff_t stride, int32_t dc); +void ff_hevc_rpi_add_residual_8x8_dc_c_neon_8(uint8_t *_dst, ptrdiff_t stride, int32_t dc); +void ff_hevc_rpi_add_residual_16x16_dc_c_neon_8(uint8_t *_dst, ptrdiff_t stride, int32_t dc); + + +void ff_hevc_rpi_add_residual_4x4_u_neon_10(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride, int dc_v); +void ff_hevc_rpi_add_residual_8x8_u_neon_10(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride, int dc_v); +void ff_hevc_rpi_add_residual_16x16_u_neon_10(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride, int dc_v); +void ff_hevc_rpi_add_residual_4x4_v_neon_10(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride, int dc_u); +void ff_hevc_rpi_add_residual_8x8_v_neon_10(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride, int dc_u); +void ff_hevc_rpi_add_residual_16x16_v_neon_10(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride, int dc_u); +void ff_hevc_rpi_add_residual_4x4_c_neon_10(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride); +void ff_hevc_rpi_add_residual_8x8_c_neon_10(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride); +void ff_hevc_rpi_add_residual_16x16_c_neon_10(uint8_t *_dst, const int16_t * residual, + ptrdiff_t stride); +void ff_hevc_rpi_add_residual_4x4_dc_c_neon_10(uint8_t *_dst, ptrdiff_t stride, int32_t dc); +void ff_hevc_rpi_add_residual_8x8_dc_c_neon_10(uint8_t *_dst, ptrdiff_t stride, int32_t dc); +void ff_hevc_rpi_add_residual_16x16_dc_c_neon_10(uint8_t *_dst, ptrdiff_t stride, int32_t dc); + +void ff_hevc_rpi_sao_edge_8_neon_8(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *_sao_offset_val, int eo, int width, int height); +void ff_hevc_rpi_sao_edge_16_neon_8(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *_sao_offset_val, int eo, int width, int height); +void ff_hevc_rpi_sao_edge_32_neon_8(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *_sao_offset_val, int eo, int width, int height); +void ff_hevc_rpi_sao_edge_64_neon_8(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *_sao_offset_val, int eo, int width, int height); + +void ff_hevc_rpi_sao_edge_8_neon_10(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *_sao_offset_val, int eo, int width, int height); +void ff_hevc_rpi_sao_edge_16_neon_10(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *_sao_offset_val, int eo, int width, int height); +void ff_hevc_rpi_sao_edge_32_neon_10(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *_sao_offset_val, int eo, int width, int height); +void ff_hevc_rpi_sao_edge_64_neon_10(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *_sao_offset_val, int eo, int width, int height); + +void ff_hevc_rpi_sao_edge_c_8_neon_8(uint8_t *_dst, const uint8_t *_src, ptrdiff_t stride_dst, + const int16_t *_sao_offset_val_u, const int16_t *_sao_offset_val_v, + int eo, int width, int height); +void ff_hevc_rpi_sao_edge_c_16_neon_8(uint8_t *_dst, const uint8_t *_src, ptrdiff_t stride_dst, + const int16_t *_sao_offset_val_u, const int16_t *_sao_offset_val_v, + int eo, int width, int height); +void ff_hevc_rpi_sao_edge_c_32_neon_8(uint8_t *_dst, const uint8_t *_src, ptrdiff_t stride_dst, + const int16_t *_sao_offset_val_u, const int16_t *_sao_offset_val_v, + int eo, int width, int height); + +void ff_hevc_rpi_sao_edge_c_8_neon_10(uint8_t *_dst, const uint8_t *_src, ptrdiff_t stride_dst, + const int16_t *_sao_offset_val_u, const int16_t *_sao_offset_val_v, + int eo, int width, int height); +void ff_hevc_rpi_sao_edge_c_16_neon_10(uint8_t *_dst, const uint8_t *_src, ptrdiff_t stride_dst, + const int16_t *_sao_offset_val_u, const int16_t *_sao_offset_val_v, + int eo, int width, int height); +void ff_hevc_rpi_sao_edge_c_32_neon_10(uint8_t *_dst, const uint8_t *_src, ptrdiff_t stride_dst, + const int16_t *_sao_offset_val_u, const int16_t *_sao_offset_val_v, + int eo, int width, int height); + +void ff_hevc_rpi_sao_band_c_8_neon_8(uint8_t *_dst, const uint8_t *_src, + ptrdiff_t stride_dst, ptrdiff_t stride_src, + const int16_t *sao_offset_val_u, int sao_left_class_u, + const int16_t *sao_offset_val_v, int sao_left_class_v, + int width, int height); +void ff_hevc_rpi_sao_band_c_16_neon_8(uint8_t *_dst, const uint8_t *_src, + ptrdiff_t stride_dst, ptrdiff_t stride_src, + const int16_t *sao_offset_val_u, int sao_left_class_u, + const int16_t *sao_offset_val_v, int sao_left_class_v, + int width, int height); +void ff_hevc_rpi_sao_band_c_32_neon_8(uint8_t *_dst, const uint8_t *_src, + ptrdiff_t stride_dst, ptrdiff_t stride_src, + const int16_t *sao_offset_val_u, int sao_left_class_u, + const int16_t *sao_offset_val_v, int sao_left_class_v, + int width, int height); + +void ff_hevc_rpi_sao_band_c_8_neon_10(uint8_t *_dst, const uint8_t *_src, + ptrdiff_t stride_dst, ptrdiff_t stride_src, + const int16_t *sao_offset_val_u, int sao_left_class_u, + const int16_t *sao_offset_val_v, int sao_left_class_v, + int width, int height); +void ff_hevc_rpi_sao_band_c_16_neon_10(uint8_t *_dst, const uint8_t *_src, + ptrdiff_t stride_dst, ptrdiff_t stride_src, + const int16_t *sao_offset_val_u, int sao_left_class_u, + const int16_t *sao_offset_val_v, int sao_left_class_v, + int width, int height); +void ff_hevc_rpi_sao_band_c_32_neon_10(uint8_t *_dst, const uint8_t *_src, + ptrdiff_t stride_dst, ptrdiff_t stride_src, + const int16_t *sao_offset_val_u, int sao_left_class_u, + const int16_t *sao_offset_val_v, int sao_left_class_v, + int width, int height); + +void ff_hevc_rpi_sao_band_8_neon_8(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, ptrdiff_t stride_src, + int16_t *sao_offset_val, int sao_left_class, int width, int height); +void ff_hevc_rpi_sao_band_16_neon_8(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, ptrdiff_t stride_src, + int16_t *sao_offset_val, int sao_left_class, int width, int height); +void ff_hevc_rpi_sao_band_32_neon_8(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, ptrdiff_t stride_src, + int16_t *sao_offset_val, int sao_left_class, int width, int height); +void ff_hevc_rpi_sao_band_64_neon_8(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, ptrdiff_t stride_src, + int16_t *sao_offset_val, int sao_left_class, int width, int height); + +void ff_hevc_rpi_sao_band_8_neon_10(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, ptrdiff_t stride_src, + int16_t *sao_offset_val, int sao_left_class, int width, int height); +void ff_hevc_rpi_sao_band_16_neon_10(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, ptrdiff_t stride_src, + int16_t *sao_offset_val, int sao_left_class, int width, int height); +void ff_hevc_rpi_sao_band_32_neon_10(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, ptrdiff_t stride_src, + int16_t *sao_offset_val, int sao_left_class, int width, int height); +void ff_hevc_rpi_sao_band_64_neon_10(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, ptrdiff_t stride_src, + int16_t *sao_offset_val, int sao_left_class, int width, int height); + + +uint32_t ff_hevc_rpi_deblocking_boundary_strengths_neon(int pus, int dup, const struct HEVCRpiMvField *curr, const struct HEVCRpiMvField *neigh, + const int *curr_rpl0, const int *curr_rpl1, const int *neigh_rpl0, const int *neigh_rpl1, + int in_inc0, int in_inc1); +void ff_hevc_rpi_cpy_blks8x4_neon(uint8_t *dst, unsigned int stride_dst, const uint8_t *src, unsigned stride_src, unsigned int width, unsigned int height); + + +static void ff_hevc_rpi_sao_edge_48_neon_8(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *_sao_offset_val, int eo, int width, int height) +{ + ff_hevc_rpi_sao_edge_32_neon_8(_dst, _src, stride_dst, _sao_offset_val, eo, 32, height); + ff_hevc_rpi_sao_edge_16_neon_8(_dst + 32, _src + 32, stride_dst, _sao_offset_val, eo, 16, height); +} +static void ff_hevc_rpi_sao_edge_48_neon_10(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *_sao_offset_val, int eo, int width, int height) +{ + ff_hevc_rpi_sao_edge_32_neon_10(_dst, _src, stride_dst, _sao_offset_val, eo, 32, height); + ff_hevc_rpi_sao_edge_16_neon_10(_dst + 64, _src + 64, stride_dst, _sao_offset_val, eo, 16, height); +} + +static void ff_hevc_rpi_sao_band_48_neon_8(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, ptrdiff_t stride_src, + int16_t *sao_offset_val, int sao_left_class, int width, int height) +{ + ff_hevc_rpi_sao_band_32_neon_8(_dst, _src, stride_dst, stride_src, sao_offset_val, sao_left_class, 32, height); + ff_hevc_rpi_sao_band_16_neon_8(_dst + 32, _src + 32, stride_dst, stride_src, sao_offset_val, sao_left_class, 16, height); +} +static void ff_hevc_rpi_sao_band_48_neon_10(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, ptrdiff_t stride_src, + int16_t *sao_offset_val, int sao_left_class, int width, int height) +{ + ff_hevc_rpi_sao_band_32_neon_10(_dst, _src, stride_dst, stride_src, sao_offset_val, sao_left_class, 32, height); + ff_hevc_rpi_sao_band_16_neon_10(_dst + 64, _src + 64, stride_dst, stride_src, sao_offset_val, sao_left_class, 16, height); +} + +#if SAO_FILTER_N == 6 +static void ff_hevc_rpi_sao_edge_24_neon_8(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *_sao_offset_val, int eo, int width, int height) +{ + ff_hevc_rpi_sao_edge_16_neon_8(_dst, _src, stride_dst, _sao_offset_val, eo, 16, height); + ff_hevc_rpi_sao_edge_8_neon_8(_dst + 16, _src + 16, stride_dst, _sao_offset_val, eo, 8, height); +} +static void ff_hevc_rpi_sao_edge_24_neon_10(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *_sao_offset_val, int eo, int width, int height) +{ + ff_hevc_rpi_sao_edge_16_neon_10(_dst, _src, stride_dst, _sao_offset_val, eo, 16, height); + ff_hevc_rpi_sao_edge_8_neon_10(_dst + 32, _src + 32, stride_dst, _sao_offset_val, eo, 8, height); +} + +static void ff_hevc_rpi_sao_band_24_neon_8(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, ptrdiff_t stride_src, + int16_t *sao_offset_val, int sao_left_class, int width, int height) +{ + ff_hevc_rpi_sao_band_16_neon_8(_dst, _src, stride_dst, stride_src, sao_offset_val, sao_left_class, 16, height); + ff_hevc_rpi_sao_band_8_neon_8(_dst + 16, _src + 16, stride_dst, stride_src, sao_offset_val, sao_left_class, 8, height); +} +static void ff_hevc_rpi_sao_band_24_neon_10(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, ptrdiff_t stride_src, + int16_t *sao_offset_val, int sao_left_class, int width, int height) +{ + ff_hevc_rpi_sao_band_16_neon_10(_dst, _src, stride_dst, stride_src, sao_offset_val, sao_left_class, 16, height); + ff_hevc_rpi_sao_band_8_neon_10(_dst + 32, _src + 32, stride_dst, stride_src, sao_offset_val, sao_left_class, 8, height); +} + +static void ff_hevc_rpi_sao_edge_c_24_neon_8(uint8_t *_dst, const uint8_t *_src, ptrdiff_t stride_dst, + const int16_t *_sao_offset_val_u, const int16_t *_sao_offset_val_v, + int eo, int width, int height) +{ + ff_hevc_rpi_sao_edge_c_16_neon_8(_dst, _src, stride_dst, _sao_offset_val_u, _sao_offset_val_v, eo, 16, height); + ff_hevc_rpi_sao_edge_c_8_neon_8(_dst + 32, _src + 32, stride_dst, _sao_offset_val_u, _sao_offset_val_v, eo, 8, height); +} +static void ff_hevc_rpi_sao_edge_c_24_neon_10(uint8_t *_dst, const uint8_t *_src, ptrdiff_t stride_dst, + const int16_t *_sao_offset_val_u, const int16_t *_sao_offset_val_v, + int eo, int width, int height) +{ + ff_hevc_rpi_sao_edge_c_16_neon_10(_dst, _src, stride_dst, _sao_offset_val_u, _sao_offset_val_v, eo, 16, height); + ff_hevc_rpi_sao_edge_c_8_neon_10(_dst + 64, _src + 64, stride_dst, _sao_offset_val_u, _sao_offset_val_v, eo, 8, height); +} + +static void ff_hevc_rpi_sao_band_c_24_neon_8(uint8_t *_dst, const uint8_t *_src, + ptrdiff_t stride_dst, ptrdiff_t stride_src, + const int16_t *sao_offset_val_u, int sao_left_class_u, + const int16_t *sao_offset_val_v, int sao_left_class_v, + int width, int height) +{ + ff_hevc_rpi_sao_band_c_16_neon_8(_dst, _src, stride_dst, stride_src, + sao_offset_val_u, sao_left_class_u, sao_offset_val_v, sao_left_class_v, 16, height); + ff_hevc_rpi_sao_band_c_8_neon_8(_dst + 32, _src + 32, stride_dst, stride_src, + sao_offset_val_u, sao_left_class_u, sao_offset_val_v, sao_left_class_v, 8, height); +} +static void ff_hevc_rpi_sao_band_c_24_neon_10(uint8_t *_dst, const uint8_t *_src, + ptrdiff_t stride_dst, ptrdiff_t stride_src, + const int16_t *sao_offset_val_u, int sao_left_class_u, + const int16_t *sao_offset_val_v, int sao_left_class_v, + int width, int height) +{ + ff_hevc_rpi_sao_band_c_16_neon_10(_dst, _src, stride_dst, stride_src, + sao_offset_val_u, sao_left_class_u, sao_offset_val_v, sao_left_class_v, 16, height); + ff_hevc_rpi_sao_band_c_8_neon_10(_dst + 64, _src + 64, stride_dst, stride_src, + sao_offset_val_u, sao_left_class_u, sao_offset_val_v, sao_left_class_v, 8, height); +} +#endif + + + +#if RPI_HEVC_SAO_BUF_STRIDE != 160 +#error SAO edge src stride not 160 - value used in .S +#endif + +av_cold void ff_hevcdsp_rpi_init_neon(HEVCDSPContext *c, const int bit_depth) +{ + if (bit_depth == 8) { + c->hevc_v_loop_filter_luma = ff_hevc_rpi_v_loop_filter_luma_neon_8; + c->hevc_v_loop_filter_luma_c = ff_hevc_rpi_v_loop_filter_luma_neon_8; + c->hevc_h_loop_filter_luma = ff_hevc_rpi_h_loop_filter_luma_neon_8; + c->hevc_h_loop_filter_luma_c = ff_hevc_rpi_h_loop_filter_luma_neon_8; + c->hevc_h_loop_filter_luma2 = ff_hevc_rpi_h_loop_filter_luma2_neon_8; + c->hevc_v_loop_filter_luma2 = ff_hevc_rpi_v_loop_filter_luma2_neon_8; + c->hevc_h_loop_filter_uv = ff_hevc_rpi_h_loop_filter_uv_neon_8; + c->hevc_v_loop_filter_uv2 = ff_hevc_rpi_v_loop_filter_uv2_neon_8; + c->idct[0] = ff_hevc_rpi_transform_4x4_neon_8; + c->idct[1] = ff_hevc_rpi_transform_8x8_neon_8; + c->idct_dc[0] = ff_hevc_rpi_idct_4x4_dc_neon_8; + c->idct_dc[1] = ff_hevc_rpi_idct_8x8_dc_neon_8; + c->idct_dc[2] = ff_hevc_rpi_idct_16x16_dc_neon_8; + c->idct_dc[3] = ff_hevc_rpi_idct_32x32_dc_neon_8; + c->add_residual[0] = ff_hevc_rpi_add_residual_4x4_neon_8; + c->add_residual[1] = ff_hevc_rpi_add_residual_8x8_neon_8; + c->add_residual[2] = ff_hevc_rpi_add_residual_16x16_neon_8; + c->add_residual[3] = ff_hevc_rpi_add_residual_32x32_neon_8; + c->add_residual_dc[0] = ff_hevc_rpi_add_residual_4x4_dc_neon_8; + c->add_residual_dc[1] = ff_hevc_rpi_add_residual_8x8_dc_neon_8; + c->add_residual_dc[2] = ff_hevc_rpi_add_residual_16x16_dc_neon_8; + c->add_residual_dc[3] = ff_hevc_rpi_add_residual_32x32_dc_neon_8; + c->add_residual_u[0] = ff_hevc_rpi_add_residual_4x4_u_neon_8; + c->add_residual_u[1] = ff_hevc_rpi_add_residual_8x8_u_neon_8; + c->add_residual_u[2] = ff_hevc_rpi_add_residual_16x16_u_neon_8; + c->add_residual_v[0] = ff_hevc_rpi_add_residual_4x4_v_neon_8; + c->add_residual_v[1] = ff_hevc_rpi_add_residual_8x8_v_neon_8; + c->add_residual_v[2] = ff_hevc_rpi_add_residual_16x16_v_neon_8; + c->add_residual_c[0] = ff_hevc_rpi_add_residual_4x4_c_neon_8; + c->add_residual_c[1] = ff_hevc_rpi_add_residual_8x8_c_neon_8; + c->add_residual_c[2] = ff_hevc_rpi_add_residual_16x16_c_neon_8; + c->add_residual_dc_c[0] = ff_hevc_rpi_add_residual_4x4_dc_c_neon_8; + c->add_residual_dc_c[1] = ff_hevc_rpi_add_residual_8x8_dc_c_neon_8; + c->add_residual_dc_c[2] = ff_hevc_rpi_add_residual_16x16_dc_c_neon_8; + c->transform_4x4_luma = ff_hevc_rpi_transform_luma_4x4_neon_8; + c->sao_band_filter[0] = ff_hevc_rpi_sao_band_8_neon_8; + c->sao_band_filter[1] = ff_hevc_rpi_sao_band_16_neon_8; + c->sao_band_filter[2] = ff_hevc_rpi_sao_band_32_neon_8; + c->sao_band_filter[3] = ff_hevc_rpi_sao_band_48_neon_8; + c->sao_band_filter[4] = ff_hevc_rpi_sao_band_64_neon_8; + c->sao_edge_filter[0] = ff_hevc_rpi_sao_edge_8_neon_8; + c->sao_edge_filter[1] = ff_hevc_rpi_sao_edge_16_neon_8; + c->sao_edge_filter[2] = ff_hevc_rpi_sao_edge_32_neon_8; + c->sao_edge_filter[3] = ff_hevc_rpi_sao_edge_48_neon_8; + c->sao_edge_filter[4] = ff_hevc_rpi_sao_edge_64_neon_8; +#if SAO_FILTER_N == 6 + c->sao_band_filter[5] = ff_hevc_rpi_sao_band_24_neon_8; + c->sao_edge_filter[5] = ff_hevc_rpi_sao_edge_24_neon_8; +#endif + c->sao_band_filter_c[0] = ff_hevc_rpi_sao_band_c_8_neon_8; + c->sao_band_filter_c[1] = ff_hevc_rpi_sao_band_c_16_neon_8; + c->sao_band_filter_c[2] = ff_hevc_rpi_sao_band_c_32_neon_8; + + c->sao_edge_filter_c[0] = ff_hevc_rpi_sao_edge_c_8_neon_8; + c->sao_edge_filter_c[1] = ff_hevc_rpi_sao_edge_c_16_neon_8; + c->sao_edge_filter_c[2] = ff_hevc_rpi_sao_edge_c_32_neon_8; + +#if SAO_FILTER_N == 6 + c->sao_band_filter_c[5] = ff_hevc_rpi_sao_band_c_24_neon_8; + c->sao_edge_filter_c[5] = ff_hevc_rpi_sao_edge_c_24_neon_8; +#endif + } + else if (bit_depth == 10) { + c->hevc_v_loop_filter_luma = ff_hevc_rpi_v_loop_filter_luma_neon_10; + c->hevc_v_loop_filter_luma_c = ff_hevc_rpi_v_loop_filter_luma_neon_10; + c->hevc_h_loop_filter_luma = ff_hevc_rpi_h_loop_filter_luma_neon_10; + c->hevc_h_loop_filter_luma_c = ff_hevc_rpi_h_loop_filter_luma_neon_10; + c->hevc_h_loop_filter_luma2 = ff_hevc_rpi_h_loop_filter_luma2_neon_10; + c->hevc_v_loop_filter_luma2 = ff_hevc_rpi_v_loop_filter_luma2_neon_10; + c->hevc_h_loop_filter_uv = ff_hevc_rpi_h_loop_filter_uv_neon_10; + c->hevc_v_loop_filter_uv2 = ff_hevc_rpi_v_loop_filter_uv2_neon_10; + c->idct[0] = ff_hevc_rpi_transform_4x4_neon_10; + c->idct[1] = ff_hevc_rpi_transform_8x8_neon_10; + c->idct_dc[0] = ff_hevc_rpi_idct_4x4_dc_neon_10; + c->idct_dc[1] = ff_hevc_rpi_idct_8x8_dc_neon_10; + c->idct_dc[2] = ff_hevc_rpi_idct_16x16_dc_neon_10; + c->idct_dc[3] = ff_hevc_rpi_idct_32x32_dc_neon_10; + c->add_residual[0] = ff_hevc_rpi_add_residual_4x4_neon_10; + c->add_residual[1] = ff_hevc_rpi_add_residual_8x8_neon_10; + c->add_residual[2] = ff_hevc_rpi_add_residual_16x16_neon_10; + c->add_residual[3] = ff_hevc_rpi_add_residual_32x32_neon_10; + c->add_residual_dc[0] = ff_hevc_rpi_add_residual_4x4_dc_neon_10; + c->add_residual_dc[1] = ff_hevc_rpi_add_residual_8x8_dc_neon_10; + c->add_residual_dc[2] = ff_hevc_rpi_add_residual_16x16_dc_neon_10; + c->add_residual_dc[3] = ff_hevc_rpi_add_residual_32x32_dc_neon_10; + c->add_residual_u[0] = ff_hevc_rpi_add_residual_4x4_u_neon_10; + c->add_residual_u[1] = ff_hevc_rpi_add_residual_8x8_u_neon_10; + c->add_residual_u[2] = ff_hevc_rpi_add_residual_16x16_u_neon_10; + c->add_residual_v[0] = ff_hevc_rpi_add_residual_4x4_v_neon_10; + c->add_residual_v[1] = ff_hevc_rpi_add_residual_8x8_v_neon_10; + c->add_residual_v[2] = ff_hevc_rpi_add_residual_16x16_v_neon_10; + c->add_residual_c[0] = ff_hevc_rpi_add_residual_4x4_c_neon_10; + c->add_residual_c[1] = ff_hevc_rpi_add_residual_8x8_c_neon_10; + c->add_residual_c[2] = ff_hevc_rpi_add_residual_16x16_c_neon_10; + c->add_residual_dc_c[0] = ff_hevc_rpi_add_residual_4x4_dc_c_neon_10; + c->add_residual_dc_c[1] = ff_hevc_rpi_add_residual_8x8_dc_c_neon_10; + c->add_residual_dc_c[2] = ff_hevc_rpi_add_residual_16x16_dc_c_neon_10; + c->transform_4x4_luma = ff_hevc_rpi_transform_luma_4x4_neon_10; + c->sao_band_filter[0] = ff_hevc_rpi_sao_band_8_neon_10; + c->sao_band_filter[1] = ff_hevc_rpi_sao_band_16_neon_10; + c->sao_band_filter[2] = ff_hevc_rpi_sao_band_32_neon_10; + c->sao_band_filter[3] = ff_hevc_rpi_sao_band_48_neon_10; + c->sao_band_filter[4] = ff_hevc_rpi_sao_band_64_neon_10; + + c->sao_edge_filter[0] = ff_hevc_rpi_sao_edge_8_neon_10; + c->sao_edge_filter[1] = ff_hevc_rpi_sao_edge_16_neon_10; + c->sao_edge_filter[2] = ff_hevc_rpi_sao_edge_32_neon_10; + c->sao_edge_filter[3] = ff_hevc_rpi_sao_edge_48_neon_10; + c->sao_edge_filter[4] = ff_hevc_rpi_sao_edge_64_neon_10; +#if SAO_FILTER_N == 6 + c->sao_band_filter[5] = ff_hevc_rpi_sao_band_24_neon_10; + c->sao_edge_filter[5] = ff_hevc_rpi_sao_edge_24_neon_10; +#endif + c->sao_band_filter_c[0] = ff_hevc_rpi_sao_band_c_8_neon_10; + c->sao_band_filter_c[1] = ff_hevc_rpi_sao_band_c_16_neon_10; + c->sao_band_filter_c[2] = ff_hevc_rpi_sao_band_c_32_neon_10; + + c->sao_edge_filter_c[0] = ff_hevc_rpi_sao_edge_c_8_neon_10; + c->sao_edge_filter_c[1] = ff_hevc_rpi_sao_edge_c_16_neon_10; + c->sao_edge_filter_c[2] = ff_hevc_rpi_sao_edge_c_32_neon_10; + +#if SAO_FILTER_N == 6 + c->sao_band_filter_c[5] = ff_hevc_rpi_sao_band_c_24_neon_10; + c->sao_edge_filter_c[5] = ff_hevc_rpi_sao_edge_c_24_neon_10; +#endif + } + + assert(offsetof(HEVCRpiMvField, mv) == 0); + assert(offsetof(HEVCRpiMvField, ref_idx) == 8); + assert(offsetof(HEVCRpiMvField, pred_flag) == 10); + c->hevc_deblocking_boundary_strengths = ff_hevc_rpi_deblocking_boundary_strengths_neon; + c->cpy_blk = ff_hevc_rpi_cpy_blks8x4_neon; +} diff --git a/libavcodec/arm/rpi_hevcdsp_res16_neon.S b/libavcodec/arm/rpi_hevcdsp_res16_neon.S new file mode 100644 index 0000000000..93876d14c0 --- /dev/null +++ b/libavcodec/arm/rpi_hevcdsp_res16_neon.S @@ -0,0 +1,620 @@ +/* +Copyright (c) 2017 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox, Ben Avison +*/ + +#include "libavutil/arm/asm.S" +#include "neon.S" + + .arch_extension mp @ enable PLDW + +#define BIT_DEPTH 10 + +.macro clip16_4 Q0, Q1, Q2, Q3, Q_MIN, Q_MAX + vmax.s16 \Q0, \Q_MIN + vmax.s16 \Q1, \Q_MIN + vmax.s16 \Q2, \Q_MIN + vmax.s16 \Q3, \Q_MIN + vmin.s16 \Q0, \Q_MAX + vmin.s16 \Q1, \Q_MAX + vmin.s16 \Q2, \Q_MAX + vmin.s16 \Q3, \Q_MAX +.endm + +@ add_residual4x4( +@ uint16_t *_dst, [r0] +@ int16_t *res, [r1] +@ ptrdiff_t stride) [r2] + +function JOIN(ff_hevc_rpi_add_residual_4x4_neon_, BIT_DEPTH), export=1 + add ip, r0, r2 + vld1.16 {q10, q11}, [r1] + lsl r2, #1 + vld1.16 {d0}, [r0 :64], r2 + vld1.16 {d1}, [ip :64], r2 + vld1.16 {d2}, [r0 :64] + vld1.16 {d3}, [ip :64] + sub r0, r2 + vqadd.s16 q0, q10 + sub ip, r2 + vqadd.s16 q1, q11 + vmov.i16 q8, #0 + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + vmax.s16 q0, q0, q8 + vmax.s16 q1, q1, q8 + vmin.s16 q0, q0, q9 + vmin.s16 q1, q1, q9 + vst1.16 {d0}, [r0 :64], r2 + vst1.16 {d1}, [ip :64], r2 + vst1.16 {d2}, [r0 :64] + vst1.16 {d3}, [ip :64] + bx lr + +endfunc + +@ add_residual4x4_dc( +@ uint16_t *_dst, [r0] +@ ptrdiff_t stride, [r1] +@ int dc) [r2] + +function JOIN(ff_hevc_rpi_add_residual_4x4_dc_neon_, BIT_DEPTH), export=1 + add ip, r0, r1 + vdup.16 q15, r2 + lsl r1, #1 + vld1.16 {d0}, [r0 :64], r1 + vld1.16 {d1}, [ip :64], r1 + vld1.16 {d2}, [r0 :64] + vld1.16 {d3}, [ip :64] + sub r0, r1 + vqadd.s16 q0, q15 + sub ip, r1 + vqadd.s16 q1, q15 + vmov.i16 q8, #0 + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + vmax.s16 q0, q0, q8 + vmax.s16 q1, q1, q8 + vmin.s16 q0, q0, q9 + vmin.s16 q1, q1, q9 + vst1.16 {d0}, [r0 :64], r1 + vst1.16 {d1}, [ip :64], r1 + vst1.16 {d2}, [r0 :64] + vst1.16 {d3}, [ip :64] + bx lr + +endfunc + + +@ add_residual8x8( +@ uint16_t *_dst, [r0] +@ int16_t *res, [r1] +@ ptrdiff_t stride) [r2] + +function JOIN(ff_hevc_rpi_add_residual_8x8_neon_, BIT_DEPTH), export=1 + mov r3, #8 + vmov.i64 q8, #0 + add ip, r0, r2 + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + lsl r2, #1 +1: + vldm r1!, {q10-q13} + vld1.16 {q0}, [r0 :128], r2 + vld1.16 {q1}, [ip :128], r2 + vld1.16 {q2}, [r0 :128] + vld1.16 {q3}, [ip :128] + sub r0, r2 + vqadd.s16 q0, q10 + sub ip, r2 + vqadd.s16 q1, q11 + subs r3, #4 + vqadd.s16 q2, q12 + vqadd.s16 q3, q13 + clip16_4 q0, q1, q2, q3, q8, q9 + vst1.16 {q0}, [r0 :128], r2 + vst1.16 {q1}, [ip :128], r2 + vst1.16 {q2}, [r0 :128], r2 + vst1.16 {q3}, [ip :128], r2 + bne 1b + bx lr + +endfunc + +@ add_residual4x4_dc_c( +@ uint16_t *_dst, [r0] +@ ptrdiff_t stride, [r1] +@ int dc_uv) [r2] + +function JOIN(ff_hevc_rpi_add_residual_4x4_dc_c_neon_, BIT_DEPTH), export=1 + mov r3, #4 + vdup.32 q15, r2 + b 9f +endfunc + +@ add_residual8x8_dc( +@ uint16_t *_dst, [r0] +@ ptrdiff_t stride, [r1] +@ int dc) [r2] + +function JOIN(ff_hevc_rpi_add_residual_8x8_dc_neon_, BIT_DEPTH), export=1 + vdup.16 q15, r2 + mov r3, #8 +9: + vmov.i16 q8, #0 + add ip, r0, r1 + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + lsl r1, #1 +1: + vld1.16 {q0}, [r0 :128], r1 + vld1.16 {q1}, [ip :128], r1 + vld1.16 {q2}, [r0 :128] + vld1.16 {q3}, [ip :128] + sub r0, r1 + vqadd.s16 q0, q15 + sub ip, r1 + vqadd.s16 q1, q15 + subs r3, #4 + vqadd.s16 q2, q15 + vqadd.s16 q3, q15 + clip16_4 q0, q1, q2, q3, q8, q9 + vst1.16 {q0}, [r0 :128], r1 + vst1.16 {q1}, [ip :128], r1 + vst1.16 {q2}, [r0 :128], r1 + vst1.16 {q3}, [ip :128], r1 + bne 1b + bx lr + +endfunc + +@ add_residual16x16( +@ uint16_t *_dst, [r0] +@ int16_t *res, [r1] +@ ptrdiff_t stride) [r2] + +function JOIN(ff_hevc_rpi_add_residual_16x16_neon_, BIT_DEPTH), export=1 + add ip, r0, r2 + vmov.i16 q8, #0 + lsl r2, #1 + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + mov r3, #16 +1: + vldm r1!, {q10-q13} + @ For RPI Sand we could guarantee :256 but not for general + @ non-RPI allocation. :128 is as good as we can claim + vld1.16 {q0, q1}, [r0 :128] + subs r3, #2 + vld1.16 {q2, q3}, [ip :128] + vqadd.s16 q0, q10 + vqadd.s16 q1, q11 + vqadd.s16 q2, q12 + vqadd.s16 q3, q13 + clip16_4 q0, q1, q2, q3, q8, q9 + vst1.16 {q0, q1}, [r0 :128], r2 + vst1.16 {q2, q3}, [ip :128], r2 + bne 1b + bx lr +endfunc + +@ add_residual8x8_dc_c( +@ uint16_t *_dst, [r0] +@ ptrdiff_t stride, [r1] +@ int dc_uv) [r2] + +function JOIN(ff_hevc_rpi_add_residual_8x8_dc_c_neon_, BIT_DEPTH), export=1 + mov r3, #8 + vdup.32 q15, r2 + b 9f +endfunc + +@ add_residual16x16_dc( +@ uint16_t *_dst, [r0] +@ ptrdiff_t stride, [r1] +@ int dc) [r2] + +function JOIN(ff_hevc_rpi_add_residual_16x16_dc_neon_, BIT_DEPTH), export=1 + vdup.i16 q15, r2 + mov r3, #16 +9: + vmov.i16 q8, #0 + add ip, r0, r1 + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + lsl r1, #1 +1: + @ For RPI Sand we could guarantee :256 but not for general + @ non-RPI allocation. :128 is as good as we can claim + vld1.16 {q0, q1}, [r0 :128] + subs r3, #2 + vqadd.s16 q0, q15 + vqadd.s16 q1, q15 + vld1.16 {q2, q3}, [ip :128] + vqadd.s16 q2, q15 + vqadd.s16 q3, q15 + clip16_4 q0, q1, q2, q3, q8, q9 + vst1.16 {q0, q1}, [r0 :128], r1 + vst1.16 {q2, q3}, [ip :128], r1 + bne 1b + bx lr + +endfunc + + +@ add_residual32x32( +@ uint16_t *_dst, [r0] +@ int16_t *res, [r1] +@ ptrdiff_t stride) [r2] + +function JOIN(ff_hevc_rpi_add_residual_32x32_neon_, BIT_DEPTH), export=1 + push {lr} + mov r3, #32 + vmov.i16 q8, #0 + add lr, r0, r2 + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + add ip, r0, #32 +1: + vldm r1!, {q10-q13} + vldm r0, {q0-q3} + vqadd.s16 q0, q10 + pldw [lr] + vqadd.s16 q1, q11 + add lr, r2 + vqadd.s16 q2, q12 + subs r3, #1 + vqadd.s16 q3, q13 + clip16_4 q0, q1, q2, q3, q8, q9 + vst1.16 {q0-q1}, [r0], r2 + vst1.16 {q2-q3}, [ip], r2 + bne 1b + pop {pc} + +endfunc + +@ add_residual16x16_dc_c( +@ uint16_t *_dst, [r0] +@ ptrdiff_t stride, [r1] +@ int dc_uv) [r2] + +function JOIN(ff_hevc_rpi_add_residual_16x16_dc_c_neon_, BIT_DEPTH), export=1 + mov r3, #16 + vdup.32 q15, r2 + b 9f +endfunc + +@ add_residual32x32_dc( +@ uint16_t *_dst, [r0] +@ ptrdiff_t stride, [r1] +@ int dc) [r2] + +function JOIN(ff_hevc_rpi_add_residual_32x32_dc_neon_, BIT_DEPTH), export=1 + vdup.16 q15, r2 + mov r3, #32 +9: + vmov.i16 q8, #0 + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + add ip, r0, #32 +1: + vldm r0, {q0-q3} + vqadd.s16 q0, q15 + subs r3, #1 + vqadd.s16 q1, q15 + vqadd.s16 q2, q15 + vqadd.s16 q3, q15 + clip16_4 q0, q1, q2, q3, q8, q9 + vst1.16 {q0-q1}, [r0], r1 + vst1.16 {q2-q3}, [ip], r1 + bne 1b + bx lr + +endfunc + +@ ============================================================================ +@ U add + +@ add_residual4x4_u( +@ uint16_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride, [r2] +@ int dc) [r3] + +function JOIN(ff_hevc_rpi_add_residual_4x4_u_neon_, BIT_DEPTH), export=1 + vdup.16 q15, r3 + add ip, r0, r2 + vld1.16 {q10, q11}, [r1 :256] + lsl r2, #1 + vld2.16 {d0, d2}, [r0 :128], r2 + vld2.16 {d1, d3}, [ip :128], r2 + vld2.16 {d4, d6}, [r0 :128] + vld2.16 {d5, d7}, [ip :128] + sub r0, r2 + vmov.i16 q8, #0 + sub ip, r2 + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + + vqadd.s16 q0, q10 + vqadd.s16 q1, q15 + vqadd.s16 q2, q11 + vqadd.s16 q3, q15 + clip16_4 q0, q1, q2, q3, q8, q9 + + vst2.16 {d0, d2}, [r0 :128], r2 + vst2.16 {d1, d3}, [ip :128], r2 + vst2.16 {d4, d6}, [r0 :128] + vst2.16 {d5, d7}, [ip :128] + bx lr +endfunc + +@ add_residual8x8_u( +@ uint16_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride, [r2] +@ int dc) [r3] + +function JOIN(ff_hevc_rpi_add_residual_8x8_u_neon_, BIT_DEPTH), export=1 + vdup.16 q15, r3 + mov r3, #8 + vmov.i16 q8, #0 + add ip, r0, r2 + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + lsl r2, #1 +1: + vld2.16 {q0, q1}, [r0 :256] + subs r3, #2 + vld2.16 {q2, q3}, [ip :256] + vld1.16 {q10, q11}, [r1 :256]! + vqadd.s16 q0, q10 + vqadd.s16 q1, q15 + vqadd.s16 q2, q11 + vqadd.s16 q3, q15 + clip16_4 q0, q1, q2, q3, q8, q9 + vst2.16 {q0, q1}, [r0 :256], r2 + vst2.16 {q2, q3}, [ip :256], r2 + bne 1b + bx lr +endfunc + +@ add_residual16x16_u( +@ uint16_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride, [r2] +@ int dc) [r3] + +function JOIN(ff_hevc_rpi_add_residual_16x16_u_neon_, BIT_DEPTH), export=1 + push {lr} + vdup.16 q15, r3 + mov r3, #16 + vmov.i16 q8, #0 + add lr, r0, r2 + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + add ip, r0, #32 +1: + vld2.16 {q0, q1}, [r0 :256] + vld2.16 {q2, q3}, [ip :256] + vld1.16 {q10, q11}, [r1 :256]! + vqadd.s16 q0, q10 + pldw [lr] + vqadd.s16 q1, q15 + add lr, r2 + vqadd.s16 q2, q11 + subs r3, #1 + vqadd.s16 q3, q15 + clip16_4 q0, q1, q2, q3, q8, q9 + vst2.16 {q0, q1}, [r0 :256], r2 + vst2.16 {q2, q3}, [ip :256], r2 + bne 1b + pop {pc} +endfunc + +@ ============================================================================ +@ V add + +@ add_residual4x4_v( +@ uint16_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride, [r2] +@ int dc) [r3] + +function JOIN(ff_hevc_rpi_add_residual_4x4_v_neon_, BIT_DEPTH), export=1 + vdup.16 q15, r3 + add ip, r0, r2 + vld1.16 {q10, q11}, [r1 :256] + lsl r2, #1 + vld2.16 {d0, d2}, [r0 :128], r2 + vld2.16 {d1, d3}, [ip :128], r2 + vld2.16 {d4, d6}, [r0 :128] + vld2.16 {d5, d7}, [ip :128] + sub r0, r2 + vmov.i16 q8, #0 + sub ip, r2 + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + + vqadd.s16 q0, q15 + vqadd.s16 q1, q10 + vqadd.s16 q2, q15 + vqadd.s16 q3, q11 + clip16_4 q0, q1, q2, q3, q8, q9 + + vst2.16 {d0, d2}, [r0 :128], r2 + vst2.16 {d1, d3}, [ip :128], r2 + vst2.16 {d4, d6}, [r0 :128] + vst2.16 {d5, d7}, [ip :128] + bx lr +endfunc + +@ add_residual8x8_v( +@ uint16_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride, [r2] +@ int dc) [r3] + +function JOIN(ff_hevc_rpi_add_residual_8x8_v_neon_, BIT_DEPTH), export=1 + vdup.16 q15, r3 + mov r3, #8 + vmov.i16 q8, #0 + add ip, r0, r2 + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + lsl r2, #1 +1: + vld2.16 {q0, q1}, [r0 :256] + subs r3, #2 + vld2.16 {q2, q3}, [ip :256] + vld1.16 {q10, q11}, [r1 :256]! + vqadd.s16 q0, q15 + vqadd.s16 q1, q10 + vqadd.s16 q2, q15 + vqadd.s16 q3, q11 + clip16_4 q0, q1, q2, q3, q8, q9 + vst2.16 {q0, q1}, [r0 :256], r2 + vst2.16 {q2, q3}, [ip :256], r2 + bne 1b + bx lr +endfunc + +@ add_residual16x16_v( +@ uint16_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride, [r2] +@ int dc) [r3] + +function JOIN(ff_hevc_rpi_add_residual_16x16_v_neon_, BIT_DEPTH), export=1 + push {lr} + vdup.16 q15, r3 + mov r3, #16 + vmov.i16 q8, #0 + add lr, r0, r2 + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + add ip, r0, #32 +1: + vld2.16 {q0, q1}, [r0 :256] + vld2.16 {q2, q3}, [ip :256] + vld1.16 {q10, q11}, [r1 :256]! + vqadd.s16 q0, q15 + pldw [lr] + vqadd.s16 q1, q10 + add lr, r2 + vqadd.s16 q2, q15 + subs r3, #1 + vqadd.s16 q3, q11 + clip16_4 q0, q1, q2, q3, q8, q9 + vst2.16 {q0, q1}, [r0 :256], r2 + vst2.16 {q2, q3}, [ip :256], r2 + bne 1b + pop {pc} +endfunc + +@ ============================================================================ +@ U & V add + +@ add_residual4x4_c( +@ uint16_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride) [r2] + +function JOIN(ff_hevc_rpi_add_residual_4x4_c_neon_, BIT_DEPTH), export=1 + vmov.i16 q8, #0 + add ip, r0, r2 + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + lsl r2, #1 + vldm r1, {q10-q13} + vld2.16 {d0, d2}, [r0 :128], r2 + vld2.16 {d1, d3}, [ip :128], r2 + vld2.16 {d4, d6}, [r0 :128] + vld2.16 {d5, d7}, [ip :128] + + sub r0, r2 + vqadd.s16 q0, q10 + sub ip, r2 + vqadd.s16 q1, q12 + vqadd.s16 q2, q11 + vqadd.s16 q3, q13 + clip16_4 q0, q1, q2, q3, q8, q9 + + vst2.16 {d0, d2}, [r0 :128], r2 + vst2.16 {d1, d3}, [ip :128], r2 + vst2.16 {d4, d6}, [r0 :128] + vst2.16 {d5, d7}, [ip :128] + bx lr +endfunc + +@ add_residual8x8_c( +@ uint16_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride) [r2] + +function JOIN(ff_hevc_rpi_add_residual_8x8_c_neon_, BIT_DEPTH), export=1 + push {lr} + add ip, r0, r2 + lsl r2, #1 + vmov.i16 q8, #0 + add r3, r1, #(8*8*2) @ Offset to V + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + mov lr, #8 +1: + vld1.16 {q10, q11}, [r1 :256]! + subs lr, #2 + vld2.16 {q0, q1}, [r0 :256] + vld2.16 {q2, q3}, [ip :256] + vld1.16 {q12, q13}, [r3 :256]! + vqadd.s16 q0, q10 + vqadd.s16 q1, q12 + vqadd.s16 q2, q11 + vqadd.s16 q3, q13 + clip16_4 q0, q1, q2, q3, q8, q9 + vst2.16 {q0, q1}, [r0 :256], r2 + vst2.16 {q2, q3}, [ip :256], r2 + bne 1b + pop {pc} +endfunc + +@ add_residual16x16_c( +@ uint16_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride) [r2] + +function JOIN(ff_hevc_rpi_add_residual_16x16_c_neon_, BIT_DEPTH), export=1 + push {r4, lr} + vmov.i16 q8, #0 + add r3, r1, #(16*16*2) @ Offset to V + vmov.i16 q9, #(1 << BIT_DEPTH) - 1 + add ip, r0, #32 + add r4, r0, r2 + mov lr, #16 +1: + vld2.16 {q0, q1}, [r0 :256] + vld2.16 {q2, q3}, [ip :256] + vld1.16 {q10, q11}, [r1 :256]! + vld1.16 {q12, q13}, [r3 :256]! + vqadd.s16 q0, q10 + pldw [r4] + vqadd.s16 q1, q12 + add r4, r2 + vqadd.s16 q2, q11 + subs lr, #1 + vqadd.s16 q3, q13 + clip16_4 q0, q1, q2, q3, q8, q9 + vst2.16 {q0, q1}, [r0 :256], r2 + vst2.16 {q2, q3}, [ip :256], r2 + bne 1b + pop {r4,pc} +endfunc + diff --git a/libavcodec/arm/rpi_hevcdsp_res8_neon.S b/libavcodec/arm/rpi_hevcdsp_res8_neon.S new file mode 100644 index 0000000000..d9a1d7d98c --- /dev/null +++ b/libavcodec/arm/rpi_hevcdsp_res8_neon.S @@ -0,0 +1,741 @@ +/* +Copyright (c) 2017 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox, Ben Avison +*/ + +#include "libavutil/arm/asm.S" +#include "neon.S" + + .arch_extension mp @ enable PLDW + +@ General notes: +@ +@ Residual is generally only guaranteed to be clipped to 16 bits. +@ This means that we do need to do vmovl, vqadd, vqmovun +@ rather than vaddw, vqmovun (if we were clipped to 15 then we could get away +@ with this). +@ +@ There is an exception for the DC case because its transform is guaranteed +@ to be small enough that overflow cannot occur during the first add. + +@ ============================================================================ +@ Y add + +function ff_hevc_rpi_add_residual_4x4_neon_8, export=1 + add ip, r0, r2 + vld1.16 {q0, q1}, [r1] + lsl r2, #1 + vld1.32 d4[0], [r0], r2 + rsb r3, r2, #0 + vld1.32 d4[1], [ip], r2 + vld1.32 d5[0], [r0], r3 + vld1.32 d5[1], [ip], r3 + vmovl.u8 q8, d4 + vmovl.u8 q9, d5 + vqadd.s16 q0, q8 + vqadd.s16 q1, q9 + vqmovun.s16 d0, q0 + vqmovun.s16 d1, q1 + vst1.32 d0[0], [r0], r2 + vst1.32 d0[1], [ip], r2 + vst1.32 d1[0], [r0] + vst1.32 d1[1], [ip] + bx lr +endfunc + +function ff_hevc_rpi_add_residual_8x8_neon_8, export=1 + push {r4, lr} + vld1.16 {q0, q1}, [r1]! + add ip, r0, r2 + vld1.8 {d6}, [r0] + add r4, r0, r2, lsl #1 + vld1.8 {d7}, [ip] + add lr, ip, r2, lsl #1 + lsl r2, #1 + mov r3, #8-2 + vmovl.u8 q2, d6 + vmovl.u8 q3, d7 + vqadd.s16 q2, q0 + vqadd.s16 q3, q1 +1: + vld1.16 {q0, q1}, [r1]! + subs r3, #2 + vqmovun.s16 d4, q2 + vqmovun.s16 d5, q3 + vld1.8 {d6}, [r4], r2 + vld1.8 {d7}, [lr], r2 + vst1.8 {d4}, [r0], r2 + vst1.8 {d5}, [ip], r2 + vmovl.u8 q2, d6 + pldw [r4] + vmovl.u8 q3, d7 + vqadd.s16 q2, q0 + vqadd.s16 q3, q1 + bne 1b + + vqmovun.s16 d4, q2 + vqmovun.s16 d5, q3 + vst1.8 {d4}, [r0] + vst1.8 {d5}, [ip] + pop {r4, pc} +endfunc + +function ff_hevc_rpi_add_residual_16x16_neon_8, export=1 + vld1.16 {q0, q1}, [r1]! + add ip, r0, r2 + vld1.8 {q3}, [r0] + mov r3, #16-1 + vmovl.u8 q2, d6 + vmovl.u8 q3, d7 + vqadd.s16 q2, q0 + vqadd.s16 q3, q1 +1: + vld1.16 {q0, q1}, [r1]! + subs r3, #1 + vqmovun.s16 d4, q2 + vqmovun.s16 d5, q3 + vld1.8 {q3}, [ip], r2 + vst1.8 {q2}, [r0], r2 + vmovl.u8 q2, d6 + pldw [ip] + vmovl.u8 q3, d7 + vqadd.s16 q2, q0 + vqadd.s16 q3, q1 + bne 1b + + vqmovun.s16 d4, q2 + vqmovun.s16 d5, q3 + vst1.8 {q2}, [r0] + bx lr +endfunc + +function ff_hevc_rpi_add_residual_32x32_neon_8, export=1 + vldm r1!, {q0-q3} + vld1.8 {q8, q9}, [r0] + add ip, r0, r2 + vmovl.u8 q10, d16 + mov r3, #32-1 + vmovl.u8 q11, d17 + vmovl.u8 q12, d18 + vmovl.u8 q13, d19 + vqadd.s16 q10, q0 + vqadd.s16 q11, q1 + vqadd.s16 q12, q2 + vqadd.s16 q13, q3 +1: + vldm r1!, {q0-q3} + vqmovun.s16 d20, q10 + vqmovun.s16 d21, q11 + vqmovun.s16 d22, q12 + vqmovun.s16 d23, q13 + vld1.8 {q8, q9}, [ip], r2 + subs r3, #1 + vst1.8 {q10, q11}, [r0], r2 + vmovl.u8 q10, d16 + pldw [ip] + vmovl.u8 q11, d17 + vmovl.u8 q12, d18 + vmovl.u8 q13, d19 + vqadd.s16 q10, q0 + vqadd.s16 q11, q1 + vqadd.s16 q12, q2 + vqadd.s16 q13, q3 + bne 1b + + vqmovun.s16 d20, q10 + vqmovun.s16 d21, q11 + vqmovun.s16 d22, q12 + vqmovun.s16 d23, q13 + vst1.8 {q10, q11}, [r0] + bx lr +endfunc + + +@ ff_hevc_rpi_add_residual_4x4_dc_neon_8( +@ uint8_t * dst, // [r0] +@ unsigned int stride, // [r1] +@ int dc) // [r2] + +function ff_hevc_rpi_add_residual_4x4_dc_neon_8, export=1 + add ip, r0, r1 + vdup.16 q15, r2 + lsl r1, #1 + vld1.32 d4[0], [r0], r1 + rsb r3, r1, #0 + vld1.32 d4[1], [ip], r1 + vld1.32 d5[0], [r0], r3 + vld1.32 d5[1], [ip], r3 + vaddw.u8 q0, q15, d4 + vaddw.u8 q1, q15, d5 + vqmovun.s16 d0, q0 + vqmovun.s16 d1, q1 + vst1.32 d0[0], [r0], r1 + vst1.32 d0[1], [ip], r1 + vst1.32 d1[0], [r0] + vst1.32 d1[1], [ip] + bx lr +endfunc + +@ ============================================================================ +@ DC Y or C add + +@ ff_hevc_rpi_add_residual_4x4_dc_c_neon_8( +@ uint8_t * dst, // [r0] +@ unsigned int stride, // [r1] +@ int dc) // [r2] + +function ff_hevc_rpi_add_residual_4x4_dc_c_neon_8, export=1 + mov r3, #4-2 + vdup.32 q15, r2 + b 1f +endfunc + +@ ff_hevc_rpi_add_residual_8x8_dc_neon_8( +@ uint8_t * dst, // [r0] +@ unsigned int stride, // [r1] +@ int dc) // [r2] + +function ff_hevc_rpi_add_residual_8x8_dc_neon_8, export=1 + vdup.16 q15, r2 + mov r3, #8-2 +1: vld1.8 d16, [r0] + add ip, r0, r1 + push {r4, lr} + vld1.8 d17, [ip] + add r4, r0, r1, lsl #1 + vaddw.u8 q0, q15, d16 + lsl r1, #1 + vaddw.u8 q1, q15, d17 + add lr, ip, r1 +1: + vld1.8 {d16}, [r4], r1 + vld1.8 {d17}, [lr], r1 + subs r3, #2 + vqmovun.s16 d4, q0 + vqmovun.s16 d5, q1 + vaddw.u8 q0, q15, d16 + vaddw.u8 q1, q15, d17 + vst1.8 {d4}, [r0], r1 + vst1.8 {d5}, [ip], r1 + bne 1b + + vqmovun.s16 d4, q0 + vqmovun.s16 d5, q1 + vst1.8 {d4}, [r0] + vst1.8 {d5}, [ip] + pop {r4, pc} +endfunc + + +@ ff_hevc_rpi_add_residual_8x8_dc_c_neon_8( +@ uint8_t * dst, // [r0] +@ unsigned int stride, // [r1] +@ int dc) // [r2] + +function ff_hevc_rpi_add_residual_8x8_dc_c_neon_8, export=1 + mov r3, #8-1 + vdup.32 q15, r2 + b 1f +endfunc + +@ ff_hevc_rpi_add_residual_16x16_dc_neon_8( +@ uint8_t * dst, // [r0] +@ unsigned int stride, // [r1] +@ int dc) // [r2] + +function ff_hevc_rpi_add_residual_16x16_dc_neon_8, export=1 + vdup.16 q15, r2 + mov r3, #16-1 +1: vld1.8 {q8}, [r0] + add ip, r0, r1 + vaddw.u8 q0, q15, d16 + vaddw.u8 q1, q15, d17 +1: + vld1.8 {q8}, [ip], r1 + subs r3, #1 + vqmovun.s16 d4, q0 + vqmovun.s16 d5, q1 + vaddw.u8 q0, q15, d16 + vaddw.u8 q1, q15, d17 + vst1.8 {q2}, [r0], r1 + bne 1b + + vqmovun.s16 d4, q0 + vqmovun.s16 d5, q1 + vst1.8 {q2}, [r0] + bx lr +endfunc + + +@ ff_hevc_rpi_add_residual_16x16_dc_c_neon_8( +@ uint8_t * dst, // [r0] +@ unsigned int stride, // [r1] +@ int dc) // [r2] + +function ff_hevc_rpi_add_residual_16x16_dc_c_neon_8, export=1 + mov r3, #16-1 + vdup.32 q15, r2 + b 1f +endfunc + +@ ff_hevc_rpi_add_residual_32x32_dc_neon_8( +@ uint8_t * dst, // [r0] +@ unsigned int stride, // [r1] +@ int dc) // [r2] + +function ff_hevc_rpi_add_residual_32x32_dc_neon_8, export=1 + vdup.16 q15, r2 + mov r3, #32-1 +1: vld1.8 {q8, q9}, [r0] + add ip, r0, r1 + vaddw.u8 q0, q15, d16 + vaddw.u8 q1, q15, d17 + vaddw.u8 q2, q15, d18 + vaddw.u8 q3, q15, d19 +1: + vqmovun.s16 d20, q0 + vqmovun.s16 d21, q1 + vqmovun.s16 d22, q2 + vqmovun.s16 d23, q3 + vld1.8 {q8, q9}, [ip], r1 + subs r3, #1 + vaddw.u8 q0, q15, d16 + vaddw.u8 q1, q15, d17 + vaddw.u8 q2, q15, d18 + vaddw.u8 q3, q15, d19 + vst1.8 {q10, q11}, [r0], r1 + bne 1b + + vqmovun.s16 d20, q0 + vqmovun.s16 d21, q1 + vqmovun.s16 d22, q2 + vqmovun.s16 d23, q3 + vst1.8 {q10, q11}, [r0] + bx lr +endfunc + +@ ============================================================================ +@ U add + +@ add_residual4x4_c( +@ uint8_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride, [r2] +@ int dc_v) [r3] + +function ff_hevc_rpi_add_residual_4x4_u_neon_8, export=1 + add ip, r0, r2 + vld1.16 {q0, q1}, [r1] + lsl r2, #1 + vld1.8 {d16}, [r0 :64], r2 + vld1.8 {d17}, [ip :64], r2 + vld1.8 {d18}, [r0 :64] + sub r0, r2 + vld1.8 {d19}, [ip :64] + sub ip, r2 + vdup.16 q2, r3 + vdup.16 q3, r3 + vmovl.u8 q10, d16 + vmovl.u8 q11, d17 + vmovl.u8 q12, d18 + vmovl.u8 q13, d19 + vzip.16 q0, q2 + vzip.16 q1, q3 + vqadd.s16 q0, q10 + vqadd.s16 q2, q11 + vqadd.s16 q1, q12 + vqadd.s16 q3, q13 + vqmovun.s16 d0, q0 + vqmovun.s16 d1, q2 + vqmovun.s16 d2, q1 + vqmovun.s16 d3, q3 + vst1.8 {d0}, [r0 :64], r2 + vst1.8 {d1}, [ip :64], r2 + vst1.8 {d2}, [r0 :64] + vst1.8 {d3}, [ip :64] + bx lr +endfunc + +@ add_residual8x8_c( +@ uint8_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride) [r2] +@ int dc_v) [r3] + +function ff_hevc_rpi_add_residual_8x8_u_neon_8, export=1 + vdup.16 q15, r3 + add ip, r0, r2 + push {r4, lr} + vld2.8 {d16, d17}, [r0 :128] + lsl r2, #1 + vld2.8 {d18, d19}, [ip :128] + mov r3, #8-2 + vld1.16 {q0, q1}, [r1 :256]! + add r4, r0, r2 + vmovl.u8 q10, d16 + add lr, ip, r2 + vmovl.u8 q11, d18 + vqadd.s16 q0, q10 + vaddw.u8 q2, q15, d17 + vqadd.s16 q1, q11 + vaddw.u8 q3, q15, d19 +1: + vqmovun.s16 d20, q0 + vqmovun.s16 d21, q2 + vld2.8 {d16, d17}, [r4 :128], r2 + subs r3, #2 + vqmovun.s16 d22, q1 + vqmovun.s16 d23, q3 + vst2.8 {d20, d21}, [r0 :128], r2 + vld2.8 {d18, d19}, [lr :128], r2 + vst2.8 {d22, d23}, [ip :128], r2 + vld1.16 {q0, q1}, [r1 :256]! + vmovl.u8 q10, d16 + vmovl.u8 q11, d18 + vqadd.s16 q0, q10 + vaddw.u8 q2, q15, d17 + vqadd.s16 q1, q11 + vaddw.u8 q3, q15, d19 + bne 1b + + vqmovun.s16 d20, q0 + vqmovun.s16 d21, q2 + vqmovun.s16 d22, q1 + vqmovun.s16 d23, q3 + vst2.8 {d20, d21}, [r0 :128] + vst2.8 {d22, d23}, [ip :128] + pop {r4, pc} +endfunc + +@ add_residual16x16_u( +@ uint8_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride) [r2] +@ int dc_v) [r3] + +function ff_hevc_rpi_add_residual_16x16_u_neon_8, export=1 + vdup.16 q15, r3 + add ip, r0, r2 + vld2.8 {q8, q9}, [r0 :256] + mov r3, #16-1 + vld1.16 {q0, q1}, [r1 :256]! + vmovl.u8 q11, d16 + vmovl.u8 q12, d17 + vqadd.s16 q0, q11 + vaddw.u8 q11, q15, d18 + vqadd.s16 q1, q12 + vaddw.u8 q12, q15, d19 +1: + vld2.8 {q8, q9}, [ip :256], r2 + subs r3, #1 + vqmovun.s16 d20, q0 + vqmovun.s16 d22, q11 + vqmovun.s16 d21, q1 + vqmovun.s16 d23, q12 + vld1.16 {q0, q1}, [r1 :256]! + vst2.8 {q10, q11}, [r0 :256], r2 + vmovl.u8 q11, d16 + pldw [ip] + vmovl.u8 q12, d17 + vqadd.s16 q0, q11 + vaddw.u8 q11, q15, d18 + vqadd.s16 q1, q12 + vaddw.u8 q12, q15, d19 + bne 1b + + vqmovun.s16 d20, q0 + vqmovun.s16 d22, q11 + vqmovun.s16 d21, q1 + vqmovun.s16 d23, q12 + vst2.8 {q10, q11}, [r0 :256] + bx lr +endfunc + +@ ============================================================================ +@ V add + +@ add_residual4x4_v( +@ uint8_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride) [r2] + +function ff_hevc_rpi_add_residual_4x4_v_neon_8, export=1 + add ip, r0, r2 + vld1.16 {q2, q3}, [r1] + lsl r2, #1 + vld1.8 {d16}, [r0 :64], r2 + vld1.8 {d17}, [ip :64], r2 + vld1.8 {d18}, [r0 :64] + sub r0, r2 + vld1.8 {d19}, [ip :64] + sub ip, r2 + vdup.16 q0, r3 + vdup.16 q1, r3 + vmovl.u8 q10, d16 + vmovl.u8 q11, d17 + vmovl.u8 q12, d18 + vmovl.u8 q13, d19 + vzip.16 q0, q2 + vzip.16 q1, q3 + vqadd.s16 q0, q10 + vqadd.s16 q2, q11 + vqadd.s16 q1, q12 + vqadd.s16 q3, q13 + vqmovun.s16 d0, q0 + vqmovun.s16 d1, q2 + vqmovun.s16 d2, q1 + vqmovun.s16 d3, q3 + vst1.8 {d0}, [r0 :64], r2 + vst1.8 {d1}, [ip :64], r2 + vst1.8 {d2}, [r0 :64] + vst1.8 {d3}, [ip :64] + bx lr +endfunc + +@ add_residual8x8_v( +@ uint8_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride) [r2] + +function ff_hevc_rpi_add_residual_8x8_v_neon_8, export=1 + vdup.16 q15, r3 + add ip, r0, r2 + push {r4, lr} + vld2.8 {d16, d17}, [r0 :128] + lsl r2, #1 + vld2.8 {d18, d19}, [ip :128] + mov r3, #8-2 + vld1.16 {q0, q1}, [r1 :256]! + add r4, r0, r2 + vmovl.u8 q10, d17 + add lr, ip, r2 + vmovl.u8 q11, d19 + vqadd.s16 q0, q10 + vaddw.u8 q2, q15, d16 + vqadd.s16 q1, q11 + vaddw.u8 q3, q15, d18 +1: + vqmovun.s16 d20, q2 + vqmovun.s16 d21, q0 + vld2.8 {d16, d17}, [r4 :128], r2 + subs r3, #2 + vqmovun.s16 d22, q3 + vqmovun.s16 d23, q1 + vst2.8 {d20, d21}, [r0 :128], r2 + vld2.8 {d18, d19}, [lr :128], r2 + vst2.8 {d22, d23}, [ip :128], r2 + vld1.16 {q0, q1}, [r1 :256]! + vmovl.u8 q10, d17 + vmovl.u8 q11, d19 + vqadd.s16 q0, q10 + vaddw.u8 q2, q15, d16 + vqadd.s16 q1, q11 + vaddw.u8 q3, q15, d18 + bne 1b + + vqmovun.s16 d20, q2 + vqmovun.s16 d21, q0 + vqmovun.s16 d22, q3 + vqmovun.s16 d23, q1 + vst2.8 {d20, d21}, [r0 :128] + vst2.8 {d22, d23}, [ip :128] + pop {r4, pc} +endfunc + +@ add_residual16x16_v( +@ uint8_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride) [r2] + +function ff_hevc_rpi_add_residual_16x16_v_neon_8, export=1 + vdup.16 q15, r3 + add ip, r0, r2 + vld2.8 {q8, q9}, [r0 :256] + mov r3, #16-1 + vld1.16 {q0, q1}, [r1 :256]! + vmovl.u8 q11, d18 + vmovl.u8 q12, d19 + vqadd.s16 q0, q11 + vaddw.u8 q11, q15, d16 + vqadd.s16 q1, q12 + vaddw.u8 q12, q15, d17 +1: + vld2.8 {q8, q9}, [ip :256], r2 + subs r3, #1 + vqmovun.s16 d20, q11 + vqmovun.s16 d22, q0 + vqmovun.s16 d21, q12 + vqmovun.s16 d23, q1 + vld1.16 {q0, q1}, [r1 :256]! + vst2.8 {q10, q11}, [r0 :256], r2 + vmovl.u8 q11, d18 + pldw [ip] + vmovl.u8 q12, d19 + vqadd.s16 q0, q11 + vaddw.u8 q11, q15, d16 + vqadd.s16 q1, q12 + vaddw.u8 q12, q15, d17 + bne 1b + + vqmovun.s16 d20, q11 + vqmovun.s16 d22, q0 + vqmovun.s16 d21, q12 + vqmovun.s16 d23, q1 + vst2.8 {q10, q11}, [r0 :256] + bx lr +endfunc + +@ ============================================================================ +@ U & V add + +@ add_residual4x4_c( +@ uint8_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride) [r2] + +function ff_hevc_rpi_add_residual_4x4_c_neon_8, export=1 + add ip, r0, r2 + vld1.16 {q0, q1}, [r1]! @ all of U + lsl r2, #1 + vld1.8 {d16}, [r0 :64], r2 + rsb r3, r2, #0 + vld1.8 {d17}, [ip :64], r2 + vld1.16 {q2, q3}, [r1] @ all of V + vld1.8 {d18}, [r0 :64], r3 + vld1.8 {d19}, [ip :64], r3 + vmovl.u8 q10, d16 + vmovl.u8 q11, d17 + vmovl.u8 q12, d18 + vmovl.u8 q13, d19 + vzip.16 q0, q2 + vzip.16 q1, q3 + vqadd.s16 q0, q10 + vqadd.s16 q2, q11 + vqadd.s16 q1, q12 + vqadd.s16 q3, q13 + vqmovun.s16 d0, q0 + vqmovun.s16 d1, q2 + vqmovun.s16 d2, q1 + vqmovun.s16 d3, q3 + vst1.8 {d0}, [r0 :64], r2 + vst1.8 {d1}, [ip :64], r2 + vst1.8 {d2}, [r0 :64] + vst1.8 {d3}, [ip :64] + bx lr +endfunc + +@ add_residual8x8_c( +@ uint8_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride) [r2] + +function ff_hevc_rpi_add_residual_8x8_c_neon_8, export=1 + vld2.8 {d16, d17}, [r0 :128] + add r3, r1, #(8*8*2) @ Offset to V + vld1.16 {q0}, [r1 :128]! + add ip, r0, r2 + vld1.16 {q1}, [r3 :128]! + vmovl.u8 q10, d16 + push {lr} + vmovl.u8 q8, d17 + mov lr, #8-1 + vqadd.s16 q10, q0 + vqadd.s16 q1, q8 +1: + vld2.8 {d16, d17}, [ip :128], r2 + subs lr, #1 + vld1.16 {q0}, [r1 :128]! + vqmovun.s16 d20, q10 + vqmovun.s16 d21, q1 + vld1.16 {q1}, [r3 :128]! + vst2.8 {d20, d21}, [r0 :128], r2 + vmovl.u8 q10, d16 + pldw [ip] + vmovl.u8 q8, d17 + vqadd.s16 q10, q0 + vqadd.s16 q1, q8 + bne 1b + + vqmovun.s16 d20, q10 + vqmovun.s16 d21, q1 + vst2.8 {d20, d21}, [r0 :128] + pop {pc} +endfunc + +@ add_residual16x16_c( +@ uint8_t *_dst, [r0] +@ const int16_t *res, [r1] +@ ptrdiff_t stride) [r2] + +function ff_hevc_rpi_add_residual_16x16_c_neon_8, export=1 + vld2.8 {q8, q9}, [r0 :256] + add r3, r1, #(16*16*2) @ Offset to V + vld1.16 {q0, q1}, [r1 :256]! + add ip, r0, r2 + vld1.16 {q2, q3}, [r3 :256]! + vmovl.u8 q10, d16 + push {lr} + vmovl.u8 q8, d17 + mov lr, #16-1 + vmovl.u8 q11, d18 + vmovl.u8 q9, d19 + vqadd.s16 q0, q10 + vqadd.s16 q1, q8 + vqadd.s16 q2, q11 + vqadd.s16 q3, q9 +1: + vld2.8 {q8, q9}, [ip :256], r2 + subs lr, #1 + vqmovun.s16 d20, q0 + vqmovun.s16 d22, q2 + vqmovun.s16 d21, q1 + vqmovun.s16 d23, q3 + vld1.16 {q0, q1}, [r1 :256]! + vst2.8 {d20-d23}, [r0 :256], r2 + vld1.16 {q2, q3}, [r3 :256]! + vmovl.u8 q10, d16 + pldw [ip] + vmovl.u8 q8, d17 + vmovl.u8 q11, d18 + vmovl.u8 q9, d19 + vqadd.s16 q0, q10 + vqadd.s16 q1, q8 + vqadd.s16 q2, q11 + vqadd.s16 q3, q9 + bne 1b + + vqmovun.s16 d20, q0 + vqmovun.s16 d22, q2 + vqmovun.s16 d21, q1 + vqmovun.s16 d23, q3 + vst2.8 {d20-d23}, [r0 :256] + pop {pc} +endfunc + +@ 32x32 chroma never occurs so NIF + +@ ============================================================================ diff --git a/libavcodec/arm/rpi_hevcdsp_sao_neon.S b/libavcodec/arm/rpi_hevcdsp_sao_neon.S new file mode 100644 index 0000000000..b56e0f9644 --- /dev/null +++ b/libavcodec/arm/rpi_hevcdsp_sao_neon.S @@ -0,0 +1,2245 @@ +/* + * Copyright (c) 2014 - 2015 Seppo Tomperi + * 2017 John Cox (for Raspberry Pi) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/arm/asm.S" +#include "neon.S" + +.set EDGE_SRC_STRIDE, 160 + +@ PIC jump tables are fractionally more expensive than absolute in our code +.set jent_pic, CONFIG_PIC + + +.macro sao_band_64b_8 XLAT0, XLAT1, Q_K128, I1, I2, I3, I4 + vshr.u8 q12, q8, #3 + \I1 + vadd.i8 q8, \Q_K128 + \I2 + vshr.u8 q13, q9, #3 + \I3 + vadd.i8 q9, \Q_K128 + \I4 + vtbl.8 d24, \XLAT0, d24 + vtbl.8 d25, \XLAT0, d25 + vtbl.8 d26, \XLAT1, d26 + vtbl.8 d27, \XLAT1, d27 + + vqadd.s8 q8, q12 + vshr.u8 q12, q10, #3 + vadd.i8 q10, \Q_K128 + vqadd.s8 q9, q13 + vshr.u8 q13, q11, #3 + vadd.i8 q11, \Q_K128 + + vtbl.8 d24, \XLAT0, d24 + vtbl.8 d25, \XLAT0, d25 + vtbl.8 d26, \XLAT1, d26 + vtbl.8 d27, \XLAT1, d27 + vqadd.s8 q10, q12 + vsub.i8 q8, \Q_K128 + vqadd.s8 q11, q13 + vsub.i8 q9, \Q_K128 + vsub.i8 q10, \Q_K128 + vsub.i8 q11, \Q_K128 +.endm + +.macro sao_band_16b_8 XLAT0, XLAT1, Q_K128, L1, L2, L3, L4, L5, S1, S2, S3, S4 + \L1 + \L2 + \L3 + \L4 + \L5 + vadd.i8 q12, q8, \Q_K128 + vshr.u8 q8, #3 + vtbl.8 d16, \XLAT0, d16 + vtbl.8 d17, \XLAT1, d17 + vqadd.s8 q12, q8 + bmi 2f +1: \L1 + \L2 + \L3 + \L4 + \L5 + vsub.i8 q13, q12, \Q_K128 + vadd.i8 q12, q8, \Q_K128 + vshr.u8 q8, #3 + \S1 + \S2 + \S3 + \S4 + vtbl.8 d16, \XLAT0, d16 + vtbl.8 d17, \XLAT1, d17 + vqadd.s8 q12, q8 + bpl 1b +2: vsub.i8 q13, q12, \Q_K128 + \S1 + \S2 + \S3 + \S4 +.endm + + +.macro clip16_4 Q0, Q1, Q2, Q3, Q_MIN, Q_MAX + vmax.s16 \Q0, \Q_MIN + vmax.s16 \Q1, \Q_MIN + vmax.s16 \Q2, \Q_MIN + vmax.s16 \Q3, \Q_MIN + vmin.s16 \Q0, \Q_MAX + vmin.s16 \Q1, \Q_MAX + vmin.s16 \Q2, \Q_MAX + vmin.s16 \Q3, \Q_MAX +.endm + +@ Clobbers q12, q13 +.macro sao_band_64b_16 Q0, Q1, Q2, Q3, XLAT0, XLAT1, Q_MIN, Q_MAX, bit_depth, I1, I2 + vshrn.i16 d24, \Q0, #(\bit_depth - 5) + vshrn.i16 d25, \Q1, #(\bit_depth - 5) + vshrn.i16 d26, \Q2, #(\bit_depth - 5) + \I1 + vtbl.8 d24, \XLAT0, d24 + vshrn.i16 d27, \Q3, #(\bit_depth - 5) + vtbl.8 d25, \XLAT1, d25 + \I2 + vtbl.8 d26, \XLAT0, d26 + vtbl.8 d27, \XLAT1, d27 + vaddw.s8 \Q0, d24 + vaddw.s8 \Q1, d25 + vaddw.s8 \Q2, d26 + vaddw.s8 \Q3, d27 + clip16_4 \Q0, \Q1, \Q2, \Q3, \Q_MIN, \Q_MAX +.endm + +@ Clobbers q10, q11, q12 +.macro sao_band_32b_16 Q0, Q1, XLAT0, XLAT1, Q_MIN, Q_MAX, bit_depth, L1, L2, L3, L4, L5, S1, S2, S3, S4 + \L1 + \L2 + \L3 + \L4 + \L5 + vshrn.i16 d24, \Q0, #\bit_depth - 5 + vshrn.i16 d25, \Q1, #\bit_depth - 5 + vtbl.8 d24, \XLAT0, d24 + vtbl.8 d25, \XLAT1, d25 + vaddw.s8 q10, \Q0, d24 + vaddw.s8 q11, \Q1, d25 + bmi 2f +1: \L1 + \L2 + \L3 + \L4 + \L5 + vmax.s16 q10, \Q_MIN + vmax.s16 q11, \Q_MIN + vshrn.i16 d24, \Q0, #\bit_depth - 5 + vshrn.i16 d25, \Q1, #\bit_depth - 5 + vmin.s16 q10, \Q_MAX + vmin.s16 q11, \Q_MAX + \S1 + \S2 + \S3 + \S4 + vtbl.8 d24, \XLAT0, d24 + vtbl.8 d25, \XLAT1, d25 + vaddw.s8 q10, \Q0, d24 + vaddw.s8 q11, \Q1, d25 + bpl 1b +2: vmax.s16 q10, \Q_MIN + vmax.s16 q11, \Q_MIN + vmin.s16 q10, \Q_MAX + vmin.s16 q11, \Q_MAX + \S1 + \S2 + \S3 + \S4 +.endm + + +@ Standard coding rules for sao_offset_abs limit it to 0-31 (Table 9-38) +@ so we are quite safe stuffing it into a byte array +@ There may be a subsequent shl by log2_sao_offset_scale_luma/chroma +@ (7.4.3.3.2 && 7-70) but we should still be safe to at least 12 bits of +@ precision + +@ This, somewhat nasty, bit of code builds the {d0-d3} translation +@ array via the stack +@ Given that sao_left_class > 28 can cause wrap we can't just poke +@ all 4 bytes in at once +@ +@ It also loads other common regs + +@ Beware that the offset read here overrreads by 6 bytes so source must be sized appropriately +function band_load_y + ldr ip, [sp, #16] @ &sao_offset_val[0] + ldr r4, [sp, #20] @ sao_left_class + vmov.i64 d4, #0 + vmov.i64 q0, #0 + pld [r1] + vld2.8 {q8}, [ip] + sub ip, sp, #8*5 + vmov.i64 q1, #0 + add r4, ip, r4 + vpush {d0-d4} @ Put zero array on stack + vshr.u64 d16, d16, #8 @ 1st interesting val is [1] + ldr ip, [ip, #8*5 + 28] @ height + vst1.32 {d16[0]}, [r4] + add r4, r1, r3 + vpop {d0-d4} @ Pop modified array + sub ip, ip, #1 + vorr d0, d0, d4 + bx lr +endfunc + +@ Beware that offset reads here overrread by 6 bytes so source must be sized appropriately +function band_load_c + ldr ip, [sp, #16] @ &sao_offset_val1[0] + ldr r4, [sp, #20] @ sao_left_class1 + vmov.i64 d24, #0 + vmov.i64 q10, #0 + pld [r1] + vld2.8 {q8}, [ip] + sub ip, sp, #8*5 + vmov.i64 q11, #0 + add r4, ip, r4 + ldr ip, [sp, #24] @ &sao_offset_val2[0] + vpush {d20-d24} @ Put zero array on stack + vld2.8 {q9}, [ip] + vshr.u64 d16, d16, #8 @ 1st interesting val is [1] + ldr ip, [sp, #8*5 + 28] @ sao_left_class2 + vst1.32 {d16[0]}, [r4] + add ip, sp, ip + vshr.u64 d18, d18, #8 @ 1st interesting val is [1] + vldmia sp, {d0-d3} @ Load modified array + vldr d16, [sp, #8*4] + add r4, r1, r3 + vstmia sp, {d20-d24} @ Put zero array on stack (again) + vst1.32 {d18[0]}, [ip] + vorr d0, d0, d16 + vldmia sp, {d4-d7} @ Load modified array + vldr d18, [sp, #8*4] + ldr ip, [sp, #8*5 + 36] @ height + add sp, sp, #8*5 + vorr d4, d4, d18 + sub ip, ip, #1 + bx lr +endfunc + + +@ ff_hevc_rpi_sao_band_64_neon_8 ( +@ uint8_t *_dst, [r0] +@ uint8_t *_src, [r1] +@ ptrdiff_t stride_dst, [r2] +@ ptrdiff_t stride_src, [r3] +@ int16_t *sao_offset_val, [sp, #0] +@ int sao_left_class, [sp, #4] +@ int width, [sp, #8] +@ int height) [sp, #12] + +function ff_hevc_rpi_sao_band_64_neon_8, export=1 + push {r4-r6, lr} + vmov.u8 q15, #128 + bl band_load_y + +1: vldmia r1, {q8-q11} + sao_band_64b_8 {d0-d3}, {d0-d3}, q15, \ + "pld [r4]", \ + "subs ip, #1", \ + "it ne; addne r4, r3", \ + "add r1, r3" + vstmia r0, {q8-q11} + add r0, r2 + bpl 1b + + pop {r4-r6, pc} +endfunc + +@ ff_hevc_rpi_sao_band_32_neon_8 ( +@ uint8_t *_dst, [r0] +@ uint8_t *_src, [r1] +@ ptrdiff_t stride_dst, [r2] +@ ptrdiff_t stride_src, [r3] +@ int16_t *sao_offset_val, [sp, #0] +@ int sao_left_class, [sp, #4] +@ int width, [sp, #8] +@ int height) [sp, #12] + +function ff_hevc_rpi_sao_band_32_neon_8, export=1 + push {r4-r6, lr} + add r5, r0, r2 + add r6, r1, r3 + lsl r2, #1 + lsl r3, #1 + vmov.u8 q15, #128 + bl band_load_y + +1: vld1.8 { q8, q9 }, [r1, :128], r3 + subs ip, #2 + vld1.8 {q10, q11}, [r6, :128], r3 + + sao_band_64b_8 {d0-d3}, {d0-d3}, q15 + + vst1.8 { q8, q9 }, [r0, :128], r2 + vst1.8 {q10, q11}, [r5, :128], r2 + bpl 1b + + pop {r4-r6, pc} +endfunc + +@ ff_hevc_rpi_sao_band_16_neon_8 ( +@ uint8_t *_dst, [r0] +@ uint8_t *_src, [r1] +@ ptrdiff_t stride_dst, [r2] +@ ptrdiff_t stride_src, [r3] +@ int16_t *sao_offset_val, [sp, #0] +@ int sao_left_class, [sp, #4] +@ int width, [sp, #8] +@ int height) [sp, #12] + +function ff_hevc_rpi_sao_band_16_neon_8, export=1 + push {r4-r6, lr} + add r5, r0, r2 + add r6, r1, r3 + lsl r2, #1 + lsl r3, #1 + vmov.u8 q15, #128 + bl band_load_y + +1: vld1.8 { q8}, [r1, :128], r3 + subs ip, #4 + vld1.8 { q9}, [r6, :128], r3 + vld1.8 {q10}, [r1, :128], r3 + vld1.8 {q11}, [r6, :128], r3 + + sao_band_64b_8 {d0-d3}, {d0-d3}, q15 + + vst1.8 { q8}, [r0, :128], r2 + vst1.8 { q9}, [r5, :128], r2 + vst1.8 {q10}, [r0, :128], r2 + vst1.8 {q11}, [r5, :128], r2 + bpl 1b + + pop {r4-r6, pc} +endfunc + +@ ff_hevc_rpi_sao_band_8_neon_8 ( +@ uint8_t *_dst, [r0] +@ uint8_t *_src, [r1] +@ ptrdiff_t stride_dst, [r2] +@ ptrdiff_t stride_src, [r3] +@ int16_t *sao_offset_val, [sp, #0] +@ int sao_left_class, [sp, #4] +@ int width, [sp, #8] +@ int height) [sp, #12] + +function ff_hevc_rpi_sao_band_8_neon_8, export=1 + ldr ip, [sp, #8] @ width + push {r4-r6, lr} + vmov.u8 q15, #128 + cmp ip, #8 + bl band_load_y + add r5, r0, r2 + add r6, r1, r3 + lsl r2, #1 + lsl r3, #1 + blt 4f + + sao_band_16b_8 {d0-d3}, {d0-d3}, q15, \ + "vld1.8 {d16}, [r1, :64], r3", \ + "subs ip, #2", \ + "vld1.8 {d17}, [r6, :64], r3", \ + "", \ + "", \ + "vst1.8 {d26}, [r0, :64], r2", \ + "vst1.8 {d27}, [r5, :64], r2" + pop {r4-r6, pc} +4: + sao_band_16b_8 {d0-d3}, {d0-d3}, q15, \ + "vld1.32 {d16[0]}, [r1, :32], r3", \ + "subs ip, #4", \ + "vld1.32 {d16[1]}, [r6, :32], r3", \ + "vld1.32 {d17[0]}, [r1, :32], r3", \ + "vld1.32 {d17[1]}, [r6, :32], r3", \ + "vst1.32 {d26[0]}, [r0, :32], r2", \ + "vst1.32 {d26[1]}, [r5, :32], r2", \ + "vst1.32 {d27[0]}, [r0, :32], r2", \ + "vst1.32 {d27[1]}, [r5, :32], r2" + pop {r4-r6, pc} +endfunc + +@ ff_hevc_rpi_sao_band_c_32_neon_8( +@ uint8_t * dst [r0] +@ uint8_t * src [r1] +@ uint32_t dst_stride [r2] +@ uint32_t src_stride [r3] +@ const int16_t * table1 sp[0] +@ uint32_t offset1 sp[4] +@ const int16_t * table2 sp[8] +@ uint32_t offset2 sp[12] +@ int width sp[16] +@ int height sp[20] + +function ff_hevc_rpi_sao_band_c_32_neon_8, export=1 + push {r4-r6, lr} + add r5, r0, #32 + add r6, r1, #32 + vmov.u8 q15, #128 + bl band_load_c + +1: vld2.8 { q8, q9 }, [r1, :128], r3 + subs ip, #1 + vld2.8 {q10, q11}, [r6, :128], r3 + + sao_band_64b_8 {d0-d3}, {d4-d7}, q15, \ + "pld [r4]", \ + "it ne; addne r4, r3" + + vst2.8 { q8, q9 }, [r0, :128], r2 + vst2.8 {q10, q11}, [r5, :128], r2 + bpl 1b + + pop {r4-r6, pc} +endfunc + +@ ff_hevc_rpi_sao_band_c_16_neon_8( +@ uint8_t * dst [r0] +@ uint8_t * src [r1] +@ uint32_t dst_stride [r2] +@ uint32_t src_stride [r3] +@ const int16_t * table1 sp[0] +@ uint32_t offset1 sp[4] +@ const int16_t * table2 sp[8] +@ uint32_t offset2 sp[12] +@ int width sp[16] +@ int height sp[20] + +function ff_hevc_rpi_sao_band_c_16_neon_8, export=1 + push {r4-r6, lr} + add r5, r0, r2 + add r6, r1, r3 + lsl r2, #1 + lsl r3, #1 + vmov.u8 q15, #128 + bl band_load_c + +1: vld2.8 { q8, q9 }, [r1, :128], r3 + subs ip, #2 + vld2.8 {q10, q11}, [r6, :128], r3 + + sao_band_64b_8 {d0-d3}, {d4-d7}, q15 + + vst2.8 { q8, q9 }, [r0, :128], r2 + vst2.8 {q10, q11}, [r5, :128], r2 + bpl 1b + + pop {r4-r6, pc} +endfunc + +@ ff_hevc_rpi_sao_band_c_8_neon_8( +@ uint8_t * dst [r0] +@ uint8_t * src [r1] +@ uint32_t dst_stride [r2] +@ uint32_t src_stride [r3] +@ const int16_t * table1 sp[0] +@ uint32_t offset1 sp[4] +@ const int16_t * table2 sp[8] +@ uint32_t offset2 sp[12] +@ int width sp[16] +@ int height sp[20] + +function ff_hevc_rpi_sao_band_c_8_neon_8, export=1 + ldr ip, [sp, #16] @ width + push {r4-r6, lr} + vmov.u8 q15, #128 + cmp ip, #8 + bl band_load_c + blt 4f + + sao_band_16b_8 {d0-d3}, {d4-d7}, q15, \ + "vld2.8 {d16-d17}, [r1, :128], r3", \ + "subs ip, #1", \ + "", \ + "", \ + "", \ + "vst2.8 {d26-d27}, [r0, :128], r2" + pop {r4-r6, pc} +4: + add r5, r0, r2 + add r6, r1, r3 + lsl r2, #1 + lsl r3, #1 + sao_band_16b_8 {d0-d3}, {d4-d7}, q15, \ + "vld1.8 {d16}, [r1, :64], r3", \ + "subs ip, #2", \ + "vld1.8 {d17}, [r6, :64], r3", \ + "vuzp.8 d16, d17", \ + "", \ + "vzip.8 d26, d27", \ + "vst1.8 {d26}, [r0, :64], r2", \ + "vst1.8 {d27}, [r5, :64], r2" + pop {r4-r6, pc} +endfunc + + +@ ff_hevc_rpi_sao_band_64_neon_10 ( +@ uint8_t *_dst, [r0] +@ uint8_t *_src, [r1] +@ ptrdiff_t stride_dst, [r2] +@ ptrdiff_t stride_src, [r3] +@ int16_t *sao_offset_val, [sp, #0] +@ int sao_left_class, [sp, #4] +@ int width, [sp, #8] +@ int height) [sp, #12] + +.macro band_64_16 bit_depth + push {r4-r6, lr} + vmov.i64 q2, #0 + vmov.i16 q3, #(1 << \bit_depth) - 1 + bl band_load_y + vpush {q4-q7} + +1: vldm r1, {q4-q11} + sao_band_64b_16 q4, q5, q6, q7, {d0-d3}, {d0-d3}, q2, q3, \bit_depth, \ + "subs ip, #1", \ + "add r1, r3" + sao_band_64b_16 q8, q9, q10, q11, {d0-d3}, {d0-d3}, q2, q3, \bit_depth + vstm r0, {q4-q11} + add r0, r2 + bpl 1b + + vpop {q4-q7} + pop {r4-r6, pc} +.endm + +function ff_hevc_rpi_sao_band_64_neon_10, export=1 + band_64_16 10 +endfunc + +@ ff_hevc_rpi_sao_band_32_neon_10 ( +@ uint8_t *_dst, [r0] +@ uint8_t *_src, [r1] +@ ptrdiff_t stride_dst, [r2] +@ ptrdiff_t stride_src, [r3] +@ int16_t *sao_offset_val, [sp, #0] +@ int sao_left_class, [sp, #4] +@ int width, [sp, #8] +@ int height) [sp, #12] + +.macro band_32_16 bit_depth + push {r4-r6, lr} + vmov.i64 q2, #0 + vmov.i16 q3, #(1 << \bit_depth) - 1 + bl band_load_y + +1: vldm r1, {q8-q11} + sao_band_64b_16 q8, q9, q10, q11, {d0-d3}, {d0-d3}, q2, q3, \bit_depth, \ + "subs ip, #1", \ + "add r1, r3" + vstm r0, {q8-q11} + add r0, r2 + bpl 1b + + pop {r4-r6, pc} +.endm + +function ff_hevc_rpi_sao_band_32_neon_10, export=1 + band_32_16 10 +endfunc + +@ ff_hevc_rpi_sao_band_16_neon_10 ( +@ uint8_t *_dst, [r0] +@ uint8_t *_src, [r1] +@ ptrdiff_t stride_dst, [r2] +@ ptrdiff_t stride_src, [r3] +@ int16_t *sao_offset_val, [sp, #0] +@ int sao_left_class, [sp, #4] +@ int width, [sp, #8] +@ int height) [sp, #12] + +.macro band_16_16 bit_depth + push {r4-r6, lr} + add r5, r0, r2 + add r6, r1, r3 + lsl r2, #1 + lsl r3, #1 + vmov.i64 q14, #0 + vmov.i16 q15, #(1 << \bit_depth) - 1 + bl band_load_y + +1: vld1.16 { q8, q9 }, [r1, :128], r3 + subs r12, #2 + vld1.16 {q10, q11}, [r6, :128], r3 + sao_band_64b_16 q8, q9, q10, q11, {d0-d3}, {d0-d3}, q14, q15, \bit_depth + vst1.16 { q8, q9 }, [r0, :128], r2 + vst1.16 {q10, q11}, [r5, :128], r2 + bpl 1b + + pop {r4-r6, pc} +.endm + +function ff_hevc_rpi_sao_band_16_neon_10, export=1 + band_16_16 10 +endfunc + +@ ff_hevc_rpi_sao_band_8_neon_10 ( +@ uint8_t *_dst, [r0] +@ uint8_t *_src, [r1] +@ ptrdiff_t stride_dst, [r2] +@ ptrdiff_t stride_src, [r3] +@ int16_t *sao_offset_val, [sp, #0] +@ int sao_left_class, [sp, #4] +@ int width, [sp, #8] +@ int height) [sp, #12] + +.macro band_8_16 bit_depth + ldr ip, [sp, #8] @ width + push {r4-r6, lr} + vmov.i64 q14, #0 + cmp ip, #8 + vmov.i16 q15, #(1 << \bit_depth) - 1 + bl band_load_y + add r5, r0, r2 + add r6, r1, r3 + lsl r2, #1 + lsl r3, #1 + blt 4f + + sao_band_32b_16 q8, q9, {d0-d3}, {d0-d3}, q14, q15, \bit_depth, \ + "vld1.16 {q8}, [r1, :128], r3", \ + "subs ip, #2", \ + "vld1.16 {q9}, [r6, :128], r3", \ + "", \ + "", \ + "vst1.16 {q10}, [r0, :128], r2", \ + "vst1.16 {q11}, [r5, :128], r2" + pop {r4-r6, pc} +4: + sao_band_32b_16 q8, q9, {d0-d3}, {d0-d3}, q14, q15, \bit_depth, \ + "vld1.16 {d16}, [r1, :64], r3", \ + "subs ip, #4", \ + "vld1.16 {d17}, [r6, :64], r3", \ + "vld1.16 {d18}, [r1, :64], r3", \ + "vld1.16 {d19}, [r6, :64], r3", \ + "vst1.16 {d20}, [r0, :64], r2", \ + "vst1.16 {d21}, [r5, :64], r2", \ + "vst1.16 {d22}, [r0, :64], r2", \ + "vst1.16 {d23}, [r5, :64], r2" + pop {r4-r6, pc} +.endm + +function ff_hevc_rpi_sao_band_8_neon_10, export=1 + band_8_16 10 +endfunc + + +@ ff_hevc_rpi_sao_band_c_32_neon_10( +@ uint8_t * dst [r0] +@ uint8_t * src [r1] +@ uint32_t dst_stride [r2] +@ uint32_t src_stride [r3] +@ const int16_t * table1 sp[0] +@ uint32_t offset1 sp[4] +@ const int16_t * table2 sp[8] +@ uint32_t offset2 sp[12] +@ int width sp[16] +@ int height sp[20] + +.macro band_c_32_16 bit_depth + push {r4-r6, lr} + add r5, r0, #32 + add r6, r1, #32 + sub r2, #64 + sub r3, #64 + vmov.i64 q14, #0 + vmov.i16 q15, #(1 << \bit_depth) - 1 + bl band_load_c + mov lr, #64 + vpush {q4-q7} + +1: vld2.16 { q4, q5 }, [r1, :128], lr + subs ip, #1 + vld2.16 { q6, q7 }, [r6, :128], lr + vld2.16 { q8, q9 }, [r1, :128], r3 + vld2.16 {q10, q11}, [r6, :128], r3 + + sao_band_64b_16 q4, q5, q6, q7, {d0-d3}, {d4-d7}, q14, q15, \bit_depth, \ + "pld [r4]", \ + "it ne; addne r4, r3" + sao_band_64b_16 q8, q9, q10, q11, {d0-d3}, {d4-d7}, q14, q15, \bit_depth + + vst2.16 { q4, q5 }, [r0, :128], lr + vst2.16 { q6, q7 }, [r5, :128], lr + vst2.16 { q8, q9 }, [r0, :128], r2 + vst2.16 {q10, q11}, [r5, :128], r2 + + bpl 1b + + vpop {q4-q7} + pop {r4-r6, pc} +.endm + +function ff_hevc_rpi_sao_band_c_32_neon_10, export=1 + band_c_32_16 10 +endfunc + + +@ ff_hevc_rpi_sao_band_c_16_neon_10( +@ uint8_t * dst [r0] +@ uint8_t * src [r1] +@ uint32_t dst_stride [r2] +@ uint32_t src_stride [r3] +@ const int16_t * table1 sp[0] +@ uint32_t offset1 sp[4] +@ const int16_t * table2 sp[8] +@ uint32_t offset2 sp[12] +@ int width sp[16] +@ int height sp[20] + +.macro band_c_16_16 bit_depth + push {r4-r6, lr} + add r5, r0, #32 + add r6, r1, #32 + vmov.i64 q14, #0 + vmov.i16 q15, #(1 << \bit_depth) - 1 + bl band_load_c + +1: vld2.16 { q8, q9 }, [r1, :128], r3 + subs ip, #1 + vld2.16 {q10, q11}, [r6, :128], r3 + + sao_band_64b_16 q4, q5, q6, q7, {d0-d3}, {d4-d7}, q14, q15, \bit_depth + sao_band_64b_16 q8, q9, q10, q11, {d0-d3}, {d4-d7}, q14, q15, \bit_depth + + vst2.16 { q8, q9 }, [r0, :128], r2 + vst2.16 {q10, q11}, [r5, :128], r2 + + bpl 1b + pop {r4-r6, pc} +.endm + +function ff_hevc_rpi_sao_band_c_16_neon_10, export=1 + band_c_16_16 10 +endfunc + + +@ ff_hevc_rpi_sao_band_c_8_neon_10( +@ uint8_t * dst [r0] +@ uint8_t * src [r1] +@ uint32_t dst_stride [r2] +@ uint32_t src_stride [r3] +@ const int16_t * table1 sp[0] +@ uint32_t offset1 sp[4] +@ const int16_t * table2 sp[8] +@ uint32_t offset2 sp[12] +@ int width sp[16] +@ int height sp[20] + +.macro band_c_8_16 bit_depth + ldr ip, [sp, #16] @ width + push {r4-r6, lr} + vmov.i64 q14, #0 + cmp ip, #8 + vmov.i16 q15, #(1 << \bit_depth) - 1 + bl band_load_c + blt 4f + + sao_band_32b_16 q8, q9, {d0-d3}, {d4-d7}, q14, q15, \bit_depth, \ + "vld2.16 {q8,q9}, [r1, :128], r3", \ + "subs ip, #1", \ + "", \ + "", \ + "", \ + "vst2.16 {q10,q11}, [r0, :128], r2" + pop {r4-r6, pc} +4: + add r5, r0, r2 + add r6, r1, r3 + lsl r2, #1 + lsl r3, #1 + sao_band_32b_16 q8, q9, {d0-d3}, {d4-d7}, q14, q15, \bit_depth, \ + "vld2.16 {d16,d18}, [r1, :128], r3", \ + "subs ip, #2", \ + "vld2.16 {d17,d19}, [r6, :128], r3", \ + "", \ + "", \ + "vst2.16 {d20,d22}, [r0, :128], r2", \ + "vst2.16 {d21,d23}, [r5, :128], r2" + pop {r4-r6, pc} +.endm + +function ff_hevc_rpi_sao_band_c_8_neon_10, export=1 + band_c_8_16 10 +endfunc + + +@ ============================================================================= +@ SAO EDGE + +@ r0 destination address +@ r2 stride to post-increment r0 with +@ [r5] translate values +@ +@ a <- c <- b +@ a in q0 - q3 +@ c in q4 - q7 +@ b in q8 - q11 +@ +@ q12-15 used as temp +@ +@ Can be used for both Y & C as we unzip/zip the deltas and +@ transform "u/v" separately via d26/d27. For Y d26=d27 + +function edge_64b_body_8 + + vcgt.u8 q12, q4, q0 @ c > a -> -1 , otherwise 0 + vcgt.u8 q13, q5, q1 + vcgt.u8 q14, q6, q2 + vcgt.u8 q15, q7, q3 + + vcgt.u8 q0, q4 @ a > c -> -1 , otherwise 0 + vcgt.u8 q1, q5 + vcgt.u8 q2, q6 + vcgt.u8 q3, q7 + + vsub.s8 q0, q12 @ a = sign(c-a) + vsub.s8 q1, q13 + vsub.s8 q2, q14 + vsub.s8 q3, q15 + + vcgt.u8 q12, q4, q8 @ c > b -> -1 , otherwise 0 + vcgt.u8 q13, q5, q9 + vcgt.u8 q14, q6, q10 + vcgt.u8 q15, q7, q11 + + vsub.s8 q0, q12 + vsub.s8 q1, q13 + vsub.s8 q2, q14 + vsub.s8 q3, q15 + + vcgt.u8 q12, q8, q4 @ c < b -> -1 , otherwise 0 + vcgt.u8 q13, q9, q5 + vcgt.u8 q14, q10, q6 + vcgt.u8 q15, q11, q7 + + vadd.s8 q0, q12 @ a = sign(c-a) + sign(c-b) + vadd.s8 q1, q13 + vmov.u8 q12, #2 + vadd.s8 q2, q14 + vadd.s8 q3, q15 + + vadd.s8 q0, q12 + vadd.s8 q1, q12 + + vld1.8 {d26, d27}, [r5] + + vadd.s8 q2, q12 + vuzp.8 q0, q1 + vmov.u8 q15, #128 + vadd.s8 q3, q12 @ a = 2 + sign(c-a) + sign(c-b) + + vtbl.8 d0, {d26}, d0 + vadd.s8 q12, q4, q15 @ Add -128 so we can use saturating signed add + + vtbl.8 d1, {d26}, d1 + vadd.s8 q14, q5, q15 + + vtbl.8 d2, {d27}, d2 + vuzp.8 q2, q3 + + vtbl.8 d3, {d27}, d3 + + vtbl.8 d4, {d26}, d4 + vzip.8 q0, q1 + + vtbl.8 d5, {d26}, d5 + vqadd.s8 q0, q12 + vqadd.s8 q1, q14 + vadd.s8 q12, q6, q15 @ Add -128 so we can use saturating signed add + + vtbl.8 d6, {d27}, d6 + vtbl.8 d7, {d27}, d7 + vadd.s8 q14, q7, q15 @ Add -128 so we can use saturating signed add + vzip.8 q2, q3 + + vsub.s8 q0, q15 + vqadd.s8 q2, q12 + vqadd.s8 q3, q14 + vsub.s8 q1, q15 + vsub.s8 q2, q15 + vsub.s8 q3, q15 + + bx lr +endfunc + +@ r0 destination address +@ r2 stride to post-increment r0 with +@ r4 upper clip value +@ [r5] translate values +@ +@ a <- c <- b +@ a in q0 - q3 +@ c in q4 - q7 +@ b in q8 - q11 +@ +@ q12-15 used as temp +@ +@ Can be used for both Y & C as we unzip/zip the deltas and +@ transform "u/v" separately via d26/d27. For Y d26=d27 + +function edge_64b_body_16 + + vcgt.u16 q12, q4, q0 // c > a -> -1 , otherwise 0 + vcgt.u16 q13, q5, q1 + vcgt.u16 q14, q6, q2 + vcgt.u16 q15, q7, q3 + + vcgt.u16 q0, q0, q4 // a > c -> -1 , otherwise 0 + vcgt.u16 q1, q1, q5 + vcgt.u16 q2, q2, q6 + vcgt.u16 q3, q3, q7 + + vsub.s16 q0, q0, q12 // a = sign(c-a) + vsub.s16 q1, q1, q13 + vsub.s16 q2, q2, q14 + vsub.s16 q3, q3, q15 + + vcgt.u16 q12, q4, q8 // c > b -> -1 , otherwise 0 + vcgt.u16 q13, q5, q9 + vcgt.u16 q14, q6, q10 + vcgt.u16 q15, q7, q11 + + vsub.s16 q0, q0, q12 + vsub.s16 q1, q1, q13 + vsub.s16 q2, q2, q14 + vsub.s16 q3, q3, q15 + + vcgt.u16 q12, q8, q4 // c < b -> -1 , otherwise 0 + vcgt.u16 q13, q9, q5 + vcgt.u16 q14, q10, q6 + vcgt.u16 q15, q11, q7 + + vadd.s16 q0, q0, q12 // a = sign(c-a) + sign(c-b) + vadd.s16 q1, q1, q13 + vadd.s16 q2, q2, q14 + vadd.s16 q3, q3, q15 + + vmov.u8 q12, #2 + + vmovn.s16 d0, q0 + vmovn.s16 d1, q1 + vmovn.s16 d2, q2 + vmovn.s16 d3, q3 + + vldr d26, [r5] + + vuzp.8 q0, q1 + + vldr d27, [r5, #8] + + vadd.s8 q0, q0, q12 + vadd.s8 q1, q1, q12 + + vmov.i64 q12, #0 + + vtbl.8 d0, {d26}, d0 + vtbl.8 d1, {d26}, d1 + vtbl.8 d2, {d27}, d2 + vtbl.8 d3, {d27}, d3 + + vdup.i16 q13, r4 + + vzip.8 q0, q1 + + @ Avoid overwrite whilst widening + vaddw.s8 q2, q6, d2 + vaddw.s8 q3, q7, d3 + vaddw.s8 q1, q5, d1 + vaddw.s8 q0, q4, d0 + + @ now clip + clip16_4 q2, q3, q1, q0, q12, q13 + + bx lr +endfunc + + +@ a <- c <- b +@ a in q0 +@ c in q1 +@ b in q2 +@ Temp q3, q9, q10 +@ +@ d16, d17 (q8) xlat U, V +@ q14.u8 #2 +@ q15.u8 #128 + +function edge_16b_body_8 + vcgt.u8 q9, q0, q1 @ a > c -> -1 , otherwise 0 + vadd.u8 q9, q14, q9 + vcgt.u8 q0, q1, q0 @ c > a -> -1 , otherwise 0 + vsub.u8 q9, q9, q0 + vcgt.u8 q0, q2, q1 @ c < b -> -1 , otherwise 0 + vadd.u8 q9, q9, q0 + vcgt.u8 q0, q1, q2 @ c > b -> -1 , otherwise 0 + vsub.u8 q0, q9, q0 + + vadd.s8 q3, q1, q15 @ Add -128 so we can use saturating signed add + + vuzp.8 d0, d1 + + vtbl.8 d0, {d16}, d0 + vtbl.8 d1, {d17}, d1 + + vzip.8 d0, d1 + vqadd.s8 q0, q3 + vsub.s8 q0, q15 + + bx lr +endfunc + +@ a <- c <- b +@ a in q0 +@ c in q1 +@ b in q2 +@ Temp q3 +@ +@ q12, #0 +@ d16, d17 xlat U, V +@ q14.u8 #2 +@ q15.u16 max +function edge_16b_body_16 + vcgt.u16 q9, q0, q1 @ a > c -> -1 , otherwise 0 + vadd.u16 q9, q14, q9 + vcgt.u16 q0, q1, q0 @ c > a -> -1 , otherwise 0 + vsub.u16 q9, q9, q0 + vcgt.u16 q0, q2, q1 @ c < b -> -1 , otherwise 0 + vadd.u16 q9, q9, q0 + vcgt.u16 q0, q1, q2 @ c > b -> -1 , otherwise 0 + vsub.u16 q0, q9, q0 + + vmovn.s16 d0, q0 + @ d1 will have random contents that we transform but + @ that doesn't matter as we then discard them + vuzp.8 d0, d1 + + vtbl.8 d0, {d16}, d0 + vtbl.8 d1, {d17}, d1 + + vzip.8 d0, d1 + + vaddw.s8 q0, q1, d0 + + @ now clip + vmax.s16 q0, q12 + vmin.s16 q0, q15 + bx lr +endfunc + + +@ ff_hevc_rpi_sao_edge_[c_]xx_neon( +@ uint8_t *_dst, [r0] +@ const uint8_t *_src, [r1] +@ ptrdiff_t stride_dst, [r2] +@ const int16_t *_sao_offset_val_u, [r3] +@ const int16_t *_sao_offset_val_v, [sp, #0] // Chroma only +@ int eo, [sp, #sp_base + 0] +@ int width, [sp, #sp_base + 4] +@ int height) [sp, #sp_base + 8] + +@ Jumps via jump_tab with +@ uint8_t *_dst, [r0] +@ const uint8_t *_src, [r1] +@ ptrdiff_t stride_dst, [r2] +@ EDGE_SRC_STRIDE [r3] +@ (1 << \bit_depth) - 1 [r4] +@ * xlat_table [r5] // setup_64b only +@ int height [r12] +@ +@ 0 [q12] // > 8 bit +@ 2 [q14] +@ 128 [q15] // = 8 bit +@ r4 [q15] // > 8 bit + +.macro edge_xxb_init, bit_depth, is_chroma, jump_tab, setup_64b = 0, setup_16b = 0, check_w4 = 0, do2 = 0, xjump = 0 + +@ Build translate registers +@ As translate values can only be 0-4 we don't care about junk in the rest +@ of the register +.if \is_chroma + ldr ip, [sp, #0] + push {r4-r6, lr} @ 16 bytes + vld1.8 {d16[2]}, [r3] + add r3, r3, #2 + vld1.8 {d17[2]}, [ip] + add ip, ip, #2 + vld1.8 {d16[0]}, [r3] + add r3, r3, #2 + vld1.8 {d17[0]}, [ip] + add ip, ip, #2 + vld1.8 {d16[1]}, [r3] + add r3, r3, #2 + vld1.8 {d17[1]}, [ip] + add ip, ip, #2 + vld1.8 {d16[3]}, [r3] + add r3, r3, #2 + vld1.8 {d17[3]}, [ip] + add ip, ip, #2 + vld1.8 {d16[4]}, [r3] + vld1.8 {d17[4]}, [ip] + movw r3, EDGE_SRC_STRIDE +.set sp_base, 20 +.else + add ip, r3, #4 + vld1.8 {d16[1]}, [r3] + add r3, r3, #2 + vld1.8 {d17[0]}, [ip] + add ip, ip, #2 + vld1.8 {d16[0]}, [r3] + add r3, r3, #6 + vld1.8 {d17[1]}, [ip] + vld1.8 {d16[2]}, [r3] + movw r3, EDGE_SRC_STRIDE + push {r4-r6, lr} @ 16 bytes + vzip.8 d16, d17 + vmov d17, d16 +.set sp_base, 16 +.endif + +@ If setup_64b we need the xlat table on the stack +.if \setup_64b + sub r5, sp, #16 +.endif + +@ Get jump address +@ We have a special case for width 4 as the calling code doesn't detect it +@ If we may have w4 then we add a 2nd jump table after the 1st +.if \check_w4 + ldr r12, [sp, #sp_base + 4] @ width + adr r6, \jump_tab + ldr lr, [sp, #sp_base + 0] @ e0 + cmp r12, #8 + it lt + addlt r6, #16 +.else + ldr lr, [sp, #sp_base + 0] @ e0 + adr r6, \jump_tab +.endif + + ldr r12, [sp, #sp_base + 8] @ height + +.if \bit_depth > 8 + movw r4, (1 << \bit_depth) - 1 +.endif +.if \setup_16b +.if \bit_depth > 8 + vmov.i64 q12, #0 + vdup.16 q15, r4 + vmov.u16 q14, #2 +.else + vmov.u8 q15, #128 + vmov.u8 q14, #2 +.endif +.endif + +@ If setup_64b we need q4-q7 saved. +.if \setup_64b + vpush {q4-q8} @ 80 bytes, q8 pushed first +.set sp_base, sp_base + 80 +.endif + + ldr r6, [r6, lr, lsl #2] + +@ For 16 bit width 64 (or chroma 32) we need to do this in 2 passes +.if \do2 + push {r0, r1, r6, r12} +.if jent_pic + bl 98f +.else + blx r6 +.endif + pop {r0, r1, r6, r12} + + add r0, #64 + add r1, #64 +.endif + +.if jent_pic + bl 98f +.else + blx r6 +.endif + +@ Tidy up & return +.if \setup_64b + vpop {q4-q8} @ spurious but harmless load of q8 +.endif + pop {r4-r6, pc} + +.if jent_pic && !\xjump +@ Magic label - used as 98b in jent macro +98: + add pc, r6 +.endif +.endm + + +.macro edge_16b_init, bit_depth, is_chroma, check_w4, jump_tab + edge_xxb_init \bit_depth, \is_chroma, \jump_tab, check_w4=\check_w4, setup_16b=1 +.endm + +.macro edge_64b_init, bit_depth, is_chroma, do2, jump_tab, xjump=0 + edge_xxb_init \bit_depth, \is_chroma, \jump_tab, do2=\do2, setup_64b=1, xjump=\xjump +.endm + + +.macro edge_64b_e0, body_fn, pb + sub r1, #8 + mov r6, lr +1: vldm r1, {d7-d16} + // load a + vext.8 q0, q3, q4, #(16 - \pb) + add r1, r3 + vext.8 q1, q4, q5, #(16 - \pb) + subs r12, #1 + vext.8 q2, q5, q6, #(16 - \pb) + vext.8 q3, q6, q7, #(16 - \pb) + pld [r1] + // load b + vext.8 q11, q7, q8, #\pb @ Avoid overwrite + pld [r1, #64] + vext.8 q8, q4, q5, #\pb + vext.8 q9, q5, q6, #\pb + vext.8 q10, q6, q7, #\pb + bl \body_fn + vstm r0, {q0-q3} + add r0, r0, r2 + bgt 1b + bx r6 +.endm + +.macro edge_32bx2_e0, body_fn, pb + add r6, r1, r3 + push {r7,lr} + sub r1, #8 + add r7, r0, r2 + lsl r2, #1 +1: vldmia r1, {d7-d12} + // load a + vext.8 q0, q3, q4, #16 - \pb + add r1, r1, r3, lsl #1 + vext.8 q1, q4, q5, #16 - \pb + subs r12, #2 + // load b + vext.8 q8, q4, q5, #\pb + vext.8 q9, q5, q6, #\pb + vldr d25, [r6, #-8] + vldmia r6, {d12-d15} + vldr d26, [r6, #32] + // load a + vext.8 q2, q12, q6, #16 - \pb + add r6, r6, r3, lsl #1 + vext.8 q3, q6, q7, #16 - \pb + // load b + vext.8 q10, q6, q7, #\pb + vext.8 q11, q7, q13, #\pb + bl \body_fn + vst1.8 {q0-q1}, [r0, :256], r2 + vst1.8 {q2-q3}, [r7, :256], r2 + bgt 1b + pop {r7,pc} +.endm + +.macro edge_16b_e0, body_fn, pb + sub r1, #8 + mov r6, lr +1: vldmia r1, {d1-d4} + add r1, r3 + subs r12, #1 + vext.8 q0, q0, q1, #16 - \pb + vext.8 q2, q1, q2, #\pb + + bl \body_fn + vst1.8 {q0}, [r0, :128], r2 + bgt 1b + bx r6 +.endm + +.macro edge_8bx2_e0, body_fn, pb + add r6, r1, r3 + push {r7,lr} + sub r1, #8 + add r7, r0, r2 + lsl r2, #1 +1: vldmia r1, {d1-d2} + vldmia r6, {d3-d4} + vldr d6, [r1, #16] + subs r12, #2 + vldr d7, [r6, #-8] + add r1, r1, r3, lsl #1 + vext.8 d0, d1, d2, #8 - \pb + add r6, r6, r3, lsl #1 + vext.8 d5, d3, d4, #\pb + vext.8 d4, d2, d6, #\pb + vext.8 d1, d7, d3, #8 - \pb + + bl \body_fn + vst1.8 {d0}, [r0, :64], r2 + vst1.8 {d1}, [r7, :64], r2 + bgt 1b + pop {r7,pc} +.endm + +.macro edge_4bx4_e0, body_fn, pb + add r6, r1, r3 + push {r7,lr} + add r7, r0, r2 + lsl r2, #1 + + tst r1, #4 + bne 2f +1: // r1 (and assumed r6) are 64-bit aligned + vldr d2, [r1] + vldr d0, [r1, #-8] + add r1, r1, r3, lsl #1 + vldr d20, [r6] + subs r12, #4 + vldr d18, [r6, #-8] + add r6, r6, r3, lsl #1 + vldr d3, [r1] + vshr.u64 d4, d2, #\pb * 8 + vldr d1, [r1, #-8] + add r1, r1, r3, lsl #1 + vldr d21, [r6] + vext.8 d0, d0, d2, #8 - \pb + vldr d19, [r6,#-8] + add r6, r6, r3, lsl #1 + vshr.u64 d22, d20, #\pb * 8 + vext.8 d18, d18, d20, #8 - \pb + vshr.u64 d5, d3, #\pb * 8 + vext.8 d1, d1, d3, #8 - \pb + vshr.u64 d23, d21, #\pb * 8 + vext.8 d19, d19, d21, #8 - \pb + vsli.64 q1, q10, #32 + vsli.64 q2, q11, #32 + vsli.64 q0, q9, #32 + + bl \body_fn + vst1.32 {d0[0]}, [r0, :32], r2 + vst1.32 {d0[1]}, [r7, :32], r2 + vst1.32 {d1[0]}, [r0, :32], r2 + vst1.32 {d1[1]}, [r7, :32], r2 + bgt 1b + pop {r7,pc} + +2: // r1 (and assumed r6) are 32-bit but not 64-bit aligned + vldr d20, [r1, #-4] + vldr d22, [r1, #4] + add r1, r1, r3, lsl #1 + vldr d2, [r6, #-4] + subs r12, #4 + vldr d4, [r6, #4] + add r6, r6, r3, lsl #1 + vldr d21, [r1, #-4] + vshl.i64 d18, d20, #\pb * 8 + vldr d23, [r1, #4] + add r1, r1, r3, lsl #1 + vldr d3, [r6, #-4] + vext.8 d22, d20, d22, #\pb + vldr d5, [r6, #4] + add r6, r6, r3, lsl #1 + vshl.i64 d0, d2, #\pb * 8 + vext.8 d4, d2, d4, #\pb + vshl.i64 d19, d21, #\pb * 8 + vext.8 d23, d21, d23, #\pb + vshl.i64 d1, d3, #\pb * 8 + vext.8 d5, d3, d5, #\pb + vsri.64 q1, q10, #32 + vsri.64 q0, q9, #32 + vsri.64 q2, q11, #32 + + bl \body_fn + vst1.32 {d0[0]}, [r0, :32], r2 + vst1.32 {d0[1]}, [r7, :32], r2 + vst1.32 {d1[0]}, [r0, :32], r2 + vst1.32 {d1[1]}, [r7, :32], r2 + bgt 2b + pop {r7,pc} +.endm + + +.macro edge_64b_e1, body_fn + sub r1, r3 + push {lr} + add r6, r1, #32 + // load a + vld1.8 {q0-q1}, [r1, :256], r3 + vld1.8 {q2-q3}, [r6, :256], r3 + // load c + vld1.8 {q4-q5}, [r1, :256], r3 + vld1.8 {q6-q7}, [r6, :256], r3 +1: // load b + vld1.8 {q8-q9}, [r1, :256], r3 + subs r12, #1 + vld1.8 {q10-q11}, [r6, :256], r3 + bl \body_fn + vstm r0, {q0-q3} + // copy c to a + vmov.64 q0, q4 + pld [r1, r3] + vmov.64 q1, q5 + it le + pople {lr} + vmov.64 q2, q6 + it le + bxle lr + vmov.64 q3, q7 + add r0, r0, r2 + // copy b to c + vmov.64 q4, q8 + vmov.64 q5, q9 + vmov.64 q6, q10 + vmov.64 q7, q11 + b 1b +.endm + +.macro edge_32bx2_e1, body_fn + sub r6, r1, r3 + vld1.8 {q2-q3}, [r1, :256], r3 + vld1.8 {q0-q1}, [r6, :256] + mov r6, lr + +1: @ Given the data duplication here we could obviously do better than + @ using the generic body_fn but it almost certainly isn't worth it + vld1.8 {q8-q9}, [r1, :256], r3 + subs r12, #2 + vmov q4, q2 + vmov q5, q3 + vld1.8 {q10-q11}, [r1, :256], r3 + vmov q6, q8 + vmov q7, q9 + + bl \body_fn + + vst1.8 {q0-q1}, [r0, :256], r2 + // copy b to a + vmov q0, q8 + vmov q1, q9 + vst1.8 {q2-q3}, [r0, :256], r2 + vmov q2, q10 + it le + bxle r6 + vmov q3, q11 + b 1b +.endm + +.macro edge_16b_e1, body_fn + sub r6, r1, r3 + // load c + vld1.8 {q1}, [r1, :128], r3 + // load a + vld1.8 {q0}, [r6, :128] + mov r6, lr +1: // load b + vld1.8 {q2}, [r1, :128], r3 + bl \body_fn + vst1.8 {q0}, [r0, :128], r2 + subs r12, #1 + // copy c to a + vmov.64 q0, q1 + it le + bxle r6 + // copy b to c + vmov.64 q1, q2 + b 1b +.endm + +.macro edge_8bx2_e1, body_fn + sub r6, r1, r3 + lsl r3, #1 + push {r7, lr} + vld1.8 {d1}, [r1, :64], r3 + vld1.8 {d0}, [r6, :64], r3 + add r7, r0, r2 + lsl r2, #1 +1: @ Given the data duplication here we could obviously do better than + @ using the generic body_fn but it almost certainly isn't worth it + vld1.8 {d4}, [r6, :64], r3 + vmov d2, d1 + vld1.8 {d5}, [r1, :64], r3 + subs r12, #2 + vmov d3, d4 + + bl \body_fn + + vst1.8 {d0}, [r0, :64], r2 + vst1.8 {d1}, [r7, :64], r2 + + // copy b to a + vmov q0, q2 + bgt 1b + pop {r7, pc} +.endm + +.macro edge_4bx4_e1, body_fn + sub r6, r1, r3 + lsl r3, #1 + push {r7, lr} + vld1.32 {d0[1]}, [r1, :32], r3 + add r7, r0, r2 + vld1.32 {d0[0]}, [r6, :32], r3 + lsl r2, #1 + vld1.32 {d4[1]}, [r1, :32], r3 + vld1.32 {d4[0]}, [r6, :32], r3 + vld1.32 {d5[1]}, [r1, :32], r3 + vld1.32 {d5[0]}, [r6, :32], r3 + vmov d1, d4 + vext.32 d2, d0, d4, #1 + subs r12, #4 + vmov d22, d5 + vext.32 d3, d4, d5, #1 + b 2f + +1: vst1.32 {d0[0]}, [r0, :32], r2 + vext.32 d2, d22, d4, #1 + vst1.32 {d0[1]}, [r7, :32], r2 + vmov d0, d22 + vst1.32 {d1[0]}, [r0, :32], r2 + vext.32 d3, d4, d5, #1 + vst1.32 {d1[1]}, [r7, :32], r2 + vmov d1, d4 + vmov d22, d5 +2: @ Given the data duplication here we could probably do better than + @ using the generic body_fn but it almost certainly isn't worth it + bl \body_fn + ble 3f + vld1.32 {d4[0]}, [r6, :32], r3 + subs r12, #4 + vld1.32 {d4[1]}, [r1, :32], r3 + vld1.32 {d5[0]}, [r6, :32], r3 + vld1.32 {d5[1]}, [r1, :32], r3 + b 1b + +3: vst1.32 {d0[0]}, [r0, :32], r2 + vst1.32 {d0[1]}, [r7, :32], r2 + vst1.32 {d1[0]}, [r0, :32] + vst1.32 {d1[1]}, [r7, :32] + pop {r7, pc} +.endm + +.macro edge_64b_e2, body_fn, pb + push {lr} + sub r6, r1, r3 + // load c and a + vld1.8 {q4-q5}, [r1, :128] + vldr d25, [r6, #-8] + vldmia r6, {d16-d23} + vext.8 q0, q12, q8, #16 - \pb + add r6, r1, #32 + vext.8 q1, q8, q9, #16 - \pb + add r1, r1, r3 + vext.8 q2, q9, q10, #16 - \pb + vld1.8 {q6-q7}, [r6, :128] + sub r6, r1, r3 + vext.8 q3, q10, q11, #16 - \pb + +1: // load b + vldmia r1, {d16-d24} + vext.8 q8, q8, q9, #\pb + pld [r1, r3] + vext.8 q9, q9, q10, #\pb + subs r12, #1 + vext.8 q10, q10, q11, #\pb + vext.8 q11, q11, q12, #\pb + bl \body_fn + // next a is mostly available in c + vldr d25, [r6, #-8] + vstmia r0, {q0-q3} + vext.8 q3, q6, q7, #16 - \pb + it le + pople {lr} + vext.8 q2, q5, q6, #16 - \pb + it le + bxle lr + vext.8 q1, q4, q5, #16 - \pb + add r6, r6, r3 + vext.8 q0, q12, q4, #16 - \pb + add r0, r0, r2 + // next c is mostly available in b + vldr d8, [r1] + vext.8 d9, d16, d17, #8 - \pb + vext.8 q5, q8, q9, #16 - \pb + add r1, r1, r3 + vext.8 q6, q9, q10, #16 - \pb + pld [r6, #-8] + vext.8 q7, q10, q11, #16 - \pb + b 1b +.endm + +.macro edge_32bx2_e2, body_fn, pb + sub r6, r1, r3 + push {r7, lr} + add r7, r0, r2 + lsl r2, #1 + // load a and first 32b of c + vld1.8 {q4-q5}, [r1, :256] + vldr d25, [r6, #-8] + vld1.8 {q13-q14}, [r6, :256] + vldr d31, [r1, #-8] + add r6, r6, r3, lsl #1 + vext.8 q0, q12, q13, #16 - \pb + add r1, r1, r3, lsl #1 + vext.8 q1, q13, q14, #16 - \pb + vext.8 q2, q15, q4, #16 - \pb + vext.8 q3, q4, q5, #16 - \pb +1: + // load second 32b of c and second 32b of b + vldmia r6, {d12-d16} + vldmia r1, {d20-d24} + // first 32b of b is mostly available in second 32b of c + vext.8 q9, q7, q8, #\pb + subs r12, #2 + vext.8 q8, q6, q7, #\pb + vext.8 q10, q10, q11, #\pb + vext.8 q11, q11, q12, #\pb + + bl \body_fn + + vst1.8 {q0-q1}, [r0, :256], r2 + vst1.8 {q2-q3}, [r7, :256], r2 + ble 2f + + vldr d25, [r6, #-8] + add r6, r6, r3, lsl #1 + vldr d8, [r1] + vext.8 d9, d20, d21, #8 - \pb + vldr d31, [r1, #-8] + add r1, r1, r3, lsl #1 + // first 32b of a is mostly available in second 32b of c + vext.8 q1, q6, q7, #16 - \pb + vext.8 q0, q12, q6, #16 - \pb + // first 32b of c is mostly available in second 32b of b + vext.8 q5, q10, q11, #16 - \pb + // second 32b of a is mostly available in first 32b of c + vext.8 q2, q15, q4, #16 - \pb + vext.8 q3, q4, q5, #16 - \pb + b 1b + +2: pop {r7, pc} +.endm + +.macro edge_16b_e2, body_fn, pb + push {lr} + sub r6, r1, r3 + vld1.8 {q1}, [r1, :128], r3 + vldr d19, [r6, #-8] + vld1.8 {q10}, [r6, :128], r3 + +1: vldmia r1, {d4-d6} + vext.8 q0, q9, q10, #16 - \pb + subs r12, #1 + vext.8 q2, q2, q3, #\pb + bl \body_fn + vst1.8 {q0}, [r0, :128], r2 + ble 2f + vmov q10, q1 + vldr d2, [r1] + add r1, r1, r3 + vldr d19, [r6, #-8] + add r6, r6, r3 + vext.8 d3, d4, d5, #8 - \pb + b 1b + +2: pop {pc} +.endm + +.macro edge_8bx2_e2, body_fn, pb + sub r6, r1, r3 + push {r7, lr} + add r7, r0, r2 + lsl r2, #1 + vldr d18, [r6, #-8] + vldr d19, [r6] + add r6, r6, r3, lsl #1 + vldr d20, [r1, #-8] + vldr d2, [r1] + add r1, r1, r3, lsl #1 + vldmia r6, {d3-d4} + vld1.8 {d21-d22}, [r1, :128] + +1: vext.8 d0, d18, d19, #8 - \pb + vext.8 d4, d3, d4, #\pb + vext.8 d1, d20, d2, #8 - \pb + subs r12, #2 + vext.8 d5, d21, d22, #\pb + + bl \body_fn + + vst1.8 {d0}, [r0, :64], r2 + vst1.8 {d1}, [r7, :64], r2 + ble 2f + + vldr d18, [r6, #-8] + add r6, r6, r3, lsl #1 + vldr d20, [r1, #-8] + vmov d19, d3 + vldr d2, [r1] + add r1, r1, r3, lsl #1 + vldmia r6, {d3-d4} + vld1.8 {d21-d22}, [r1, :128] + b 1b + +2: pop {r7, pc} +.endm + +.macro edge_4bx4_e2, body_fn, pb + sub r6, r1, r3 + push {r7-r9, lr} + add r8, r1, r3 + sub r6, r6, #\pb + add r8, r8, #\pb + add r7, r0, r2 + lsl r2, #1 + +1: vld1.32 {d0[0]}, [r6], r3 + subs r12, #4 + vld1.32 {d2[0]}, [r1], r3 + vld1.32 {d4[0]}, [r8], r3 + vld1.32 {d0[1]}, [r6], r3 + vld1.32 {d2[1]}, [r1], r3 + vld1.32 {d4[1]}, [r8], r3 + vld1.32 {d1[0]}, [r6], r3 + vld1.32 {d3[0]}, [r1], r3 + vld1.32 {d5[0]}, [r8], r3 + vld1.32 {d1[1]}, [r6], r3 + vld1.32 {d3[1]}, [r1], r3 + vld1.32 {d5[1]}, [r8], r3 + + bl \body_fn + + vst1.32 {d0[0]}, [r0, :32], r2 + vst1.32 {d0[1]}, [r7, :32], r2 + vst1.32 {d1[0]}, [r0, :32], r2 + vst1.32 {d1[1]}, [r7, :32], r2 + bgt 1b + + pop {r7-r9,pc} +.endm + +.macro edge_64b_e3, body_fn, pb + push {lr} + sub r6, r1, r3 + // load c and a + vld1.8 {q4-q5}, [r1, :128] + vldmia r6, {d16-d24} + vext.8 q0, q8, q9, #\pb + add r6, r1, #32 + vext.8 q1, q9, q10, #\pb + add r1, r1, r3 + vext.8 q2, q10, q11, #\pb + vld1.8 {q6-q7}, [r6, :128] + sub r6, r1, r3 + vext.8 q3, q11, q12, #\pb + +1: // load b + vldr d17, [r1, #-8] + vldmia r1, {d18-d25} + vext.8 q8, q8, q9, #16 - \pb + pld [r1, r3] + vext.8 q9, q9, q10, #16 - \pb + subs r12, #1 + vext.8 q10, q10, q11, #16 - \pb + vext.8 q11, q11, q12, #16 - \pb + bl \body_fn + // next a is mostly available in c + vldr d24, [r6, #64] + vstmia r0, {q0-q3} + vext.8 q0, q4, q5, #\pb + it le + pople {lr} + vext.8 q1, q5, q6, #\pb + it le + bxle lr + vext.8 q2, q6, q7, #\pb + add r6, r6, r3 + vext.8 q3, q7, q12, #\pb + add r0, r0, r2 + // next c is mostly available in b + vext.8 d14, d22, d23, #\pb + vldr d15, [r1, #56] + vext.8 q4, q8, q9, #\pb + add r1, r1, r3 + vext.8 q5, q9, q10, #\pb + vext.8 q6, q10, q11, #\pb + b 1b +.endm + +.macro edge_32bx2_e3, body_fn, pb + sub r6, r1, r3 + push {r7, lr} + add r7, r0, r2 + lsl r2, #1 + // load a and first 32b of c + vldmia r1, {d8-d12} + vldmia r6, {d24-d28} + vext.8 q2, q4, q5, #\pb + add r6, r6, r3, lsl #1 + vext.8 q3, q5, q6, #\pb + add r1, r1, r3, lsl #1 + vext.8 q0, q12, q13, #\pb + vext.8 q1, q13, q14, #\pb +1: + // load second 32b of c and second 32b of b + vldr d25, [r6, #-8] + subs r12, #2 + vldmia r6, {d12-d15} + vldr d27, [r1, #-8] + vldmia r1, {d20-d23} + // first 32b of b is mostly available in second 32b of c + vext.8 q8, q12, q6, #16 - \pb + vext.8 q9, q6, q7, #16 - \pb + vext.8 q11, q10, q11, #16 - \pb + vext.8 q10, q13, q10, #16 - \pb + + bl \body_fn + + vst1.8 {q0-q1}, [r0, :256], r2 + vst1.8 {q2-q3}, [r7, :256], r2 + ble 2f + + vldr d24, [r6, #32] + add r6, r6, r3, lsl #1 + vldr d11, [r1, #24] + vext.8 d10, d22, d23, #\pb + vldr d30, [r1, #32] + add r1, r1, r3, lsl #1 + // first 32b of a is mostly available in second 32b of c + vext.8 q0, q6, q7, #\pb + vext.8 q1, q7, q12, #\pb + // first 32b of c is mostly available in second 32b of b + vext.8 q4, q10, q11, #\pb + // second 32b of a is mostly available in first 32b of c + vext.8 q3, q5, q15, #\pb + vext.8 q2, q4, q5, #\pb + b 1b + +2: pop {r7, pc} +.endm + +.macro edge_16b_e3, body_fn, pb + push {lr} + sub r6, r1, r3 + vld1.8 {q1}, [r1, :128], r3 + vldmia r6, {d18-d20} + add r6, r6, r3 + +1: vldr d5, [r1, #-8] + vld1.8 {q3}, [r1, :128] + subs r12, #1 + vext.8 q0, q9, q10, #\pb + vext.8 q2, q2, q3, #16 - \pb + bl \body_fn + vst1.8 {q0}, [r0, :128], r2 + ble 2f + vmov q9, q1 + vldr d3, [r1, #8] + add r1, r1, r3 + vldr d20, [r6, #16] + add r6, r6, r3 + vext.8 d2, d4, d5, #\pb + b 1b + +2: pop {pc} +.endm + +.macro edge_8bx2_e3, body_fn, pb + sub r6, r1, r3 + push {r7, lr} + add r7, r0, r2 + lsl r2, #1 + vld1.8 {d18-d19}, [r6] + add r6, r6, r3, lsl #1 + vldr d20, [r1, #8] + vldr d2, [r1] + add r1, r1, r3, lsl #1 + vldr d4, [r6, #-8] + vldr d3, [r6] + vldr d21, [r1, #-8] + vldr d22, [r1] + +1: vext.8 d0, d18, d19, #\pb + vext.8 d4, d4, d3, #8 - \pb + vext.8 d1, d2, d20, #\pb + subs r12, #2 + vext.8 d5, d21, d22, #8 - \pb + + bl \body_fn + + vst1.8 {d0}, [r0, :64], r2 + vst1.8 {d1}, [r7, :64], r2 + ble 2f + + vldr d19, [r6, #8] + add r6, r6, r3, lsl #1 + vldr d20, [r1, #8] + vmov d18, d3 + vldr d2, [r1] + add r1, r1, r3, lsl #1 + vldr d4, [r6, #-8] + vldr d3, [r6] + vldr d21, [r1, #-8] + vldr d22, [r1] + b 1b + +2: pop {r7, pc} +.endm + +.macro edge_4bx4_e3, body_fn, pb + @ e3 is the same as e2 but with the X offset reversed + edge_4bx4_e2 \body_fn, (-\pb) +.endm + +@ Jump table entry - if in neon mode the bottom bit must be set +@ ? There is probably a real asm instruction to do this but I haven't found it +.macro jent lab +.if jent_pic +@ Could use .short here but due to A32 not supporting ldrh [lsl#1] it is +@ simpler and clearer in the code to stick with .word +T .word (0 + \lab) - (4 + 98b) +A .word (0 + \lab) - (8 + 98b) +.else +T .word 1 + \lab +A .word \lab +.endif +.endm + +.macro edge_64b_bodies, body_fn, pb + jent 0f + jent 10f + jent 20f + jent 30f + +0: edge_64b_e0 \body_fn, \pb +10: edge_64b_e1 \body_fn +20: edge_64b_e2 \body_fn, \pb +30: edge_64b_e3 \body_fn, \pb +.endm + +.macro edge_32bx2_bodies, body_fn, pb + jent 0f + jent 10f + jent 20f + jent 30f + +0: edge_32bx2_e0 \body_fn, \pb +10: edge_32bx2_e1 \body_fn +20: edge_32bx2_e2 \body_fn, \pb +30: edge_32bx2_e3 \body_fn, \pb +.endm + +.macro edge_16b_bodies, body_fn, pb + jent 0f + jent 10f + jent 20f + jent 30f + +0: edge_16b_e0 \body_fn, \pb +10: edge_16b_e1 \body_fn +20: edge_16b_e2 \body_fn, \pb +30: edge_16b_e3 \body_fn, \pb +.endm + +.macro edge_32bx2_16b_bodies, body_fn_64b, body_fn_16b, pb + jent 0f + jent 10f + jent 20f + jent 30f + jent 5f + jent 15f + jent 25f + jent 35f + +0: edge_32bx2_e0 \body_fn_64b, \pb +10: edge_32bx2_e1 \body_fn_64b +20: edge_32bx2_e2 \body_fn_64b, \pb +30: edge_32bx2_e3 \body_fn_64b, \pb +5: edge_16b_e0 \body_fn_16b, \pb +15: edge_16b_e1 \body_fn_16b +25: edge_16b_e2 \body_fn_16b, \pb +35: edge_16b_e3 \body_fn_16b, \pb +.endm + +.macro edge_16b_8bx2_bodies, body_fn, pb + jent 0f + jent 10f + jent 20f + jent 30f + jent 5f + jent 15f + jent 25f + jent 35f + +0: edge_16b_e0 \body_fn, \pb +10: edge_16b_e1 \body_fn +20: edge_16b_e2 \body_fn, \pb +30: edge_16b_e3 \body_fn, \pb +5: edge_8bx2_e0 \body_fn, \pb +15: edge_8bx2_e1 \body_fn +25: edge_8bx2_e2 \body_fn, \pb +35: edge_8bx2_e3 \body_fn, \pb +.endm + +.macro edge_8bx2_4bx4_bodies, body_fn, pb + jent 0f + jent 10f + jent 20f + jent 30f + jent 5f + jent 15f + jent 25f + jent 35f + +0: edge_8bx2_e0 \body_fn, \pb +10: edge_8bx2_e1 \body_fn +20: edge_8bx2_e2 \body_fn, \pb +30: edge_8bx2_e3 \body_fn, \pb +5: edge_4bx4_e0 \body_fn, \pb +15: edge_4bx4_e1 \body_fn +25: edge_4bx4_e2 \body_fn, \pb +35: edge_4bx4_e3 \body_fn, \pb +.endm + +@ void ff_hevc_rpi_sao_edge_8_neon_8( +@ uint8_t *_dst, [r0] +@ uint8_t *_src, [r1] +@ int stride_dst, [r2] +@ int16_t *_sao_offset_val, [r3] +@ int eo, [sp, #0] +@ int width, [sp, #4] +@ int height) [sp, #8] + +function ff_hevc_rpi_sao_edge_8_neon_8, export=1 + edge_16b_init 8, 0, 1, 99f +99: + edge_8bx2_4bx4_bodies edge_16b_body_8, 1 +endfunc + +@ void ff_hevc_rpi_sao_edge_16_neon_8( +@ uint8_t *_dst, [r0] +@ uint8_t *_src, [r1] +@ int stride_dst, [r2] +@ int16_t *_sao_offset_val, [r3] +@ int eo, [sp, #0] +@ int width, [sp, #4] +@ int height) [sp, #8] + +function ff_hevc_rpi_sao_edge_16_neon_8, export=1 + edge_16b_init 8, 0, 0, 99f +99: + edge_16b_bodies edge_16b_body_8, 1 +endfunc + +@ void ff_hevc_rpi_sao_edge_32_neon_8( +@ uint8_t *_dst, [r0] +@ uint8_t *_src, [r1] +@ int stride_dst, [r2] +@ int16_t *_sao_offset_val, [r3] +@ int eo, [sp, #0] +@ int width, [sp, #4] +@ int height) [sp, #8] + +function ff_hevc_rpi_sao_edge_32_neon_8, export=1 + edge_64b_init 8, 0, 0, 99f +99: + edge_32bx2_bodies edge_64b_body_8, 1 +endfunc + +@ void ff_hevc_rpi_sao_edge_64_neon_8( +@ uint8_t *_dst, [r0] +@ uint8_t *_src, [r1] +@ int stride_dst, [r2] +@ int16_t *_sao_offset_val, [r3] +@ int eo, [sp, #0] +@ int width, [sp, #4] +@ int height) [sp, #8] + +function ff_hevc_rpi_sao_edge_64_neon_8, export=1 + edge_64b_init 8, 0, 0, 99f +99: + edge_64b_bodies edge_64b_body_8, 1 +endfunc + +@ ff_hevc_rpi_sao_edge_c_8_neon_8( +@ uint8_t *_dst, [r0] +@ const uint8_t *_src, [r1] +@ ptrdiff_t stride_dst, [r2] +@ const int16_t *_sao_offset_val_u, [r3] +@ const int16_t *_sao_offset_val_v, [sp, #0] +@ int eo, [sp, #4] +@ int width, [sp, #8] +@ int height) [sp, #12] + +function ff_hevc_rpi_sao_edge_c_8_neon_8, export=1 + edge_16b_init 8, 1, 1, 99f +99: + edge_16b_8bx2_bodies edge_16b_body_8, 2 +endfunc + +@ ff_hevc_rpi_sao_edge_c_16_neon_8( +@ uint8_t *_dst, [r0] +@ const uint8_t *_src, [r1] +@ ptrdiff_t stride_dst, [r2] +@ const int16_t *_sao_offset_val_u, [r3] +@ const int16_t *_sao_offset_val_v, [sp, #0] +@ int eo, [sp, #4] +@ int width, [sp, #8] +@ int height) [sp, #12] + +function ff_hevc_rpi_sao_edge_c_16_neon_8, export=1 + edge_64b_init 8, 1, 0, 99f +99: + edge_32bx2_bodies edge_64b_body_8, 2 +endfunc + +@ ff_hevc_rpi_sao_edge_c_32_neon_8( +@ uint8_t *_dst, [r0] +@ const uint8_t *_src, [r1] +@ ptrdiff_t stride_dst, [r2] +@ const int16_t *_sao_offset_val_u, [r3] +@ const int16_t *_sao_offset_val_v, [sp, #0] +@ int eo, [sp, #4] +@ int width, [sp, #8] +@ int height) [sp, #12] + +function ff_hevc_rpi_sao_edge_c_32_neon_8, export=1 + edge_64b_init 8, 1, 0, 99f +99: + edge_64b_bodies edge_64b_body_8, 2 +endfunc + +@ void ff_hevc_rpi_sao_edge_8_neon_10( +@ uint8_t *_dst, [r0] +@ uint8_t *_src, [r1] +@ int stride_dst, [r2] +@ int16_t *_sao_offset_val, [r3] +@ int eo, [sp, #0] +@ int width, [sp, #4] +@ int height) [sp, #8] + +function ff_hevc_rpi_sao_edge_8_neon_10, export=1 + edge_16b_init 10, 0, 1, 99f +99: + edge_16b_8bx2_bodies edge_16b_body_16, 2 +endfunc + +@ void ff_hevc_rpi_sao_edge_16_neon_10( +@ uint8_t *_dst, [r0] +@ uint8_t *_src, [r1] +@ int stride_dst, [r2] +@ int16_t *_sao_offset_val, [r3] +@ int eo, [sp, #0] +@ int width, [sp, #4] +@ int height) [sp, #8] + +function ff_hevc_rpi_sao_edge_16_neon_10, export=1 + edge_64b_init 10, 0, 0, 99f +99: + edge_32bx2_bodies edge_64b_body_16, 2 +endfunc + +@ void ff_hevc_rpi_sao_edge_64_neon_10( +@ uint8_t *_dst, [r0] +@ uint8_t *_src, [r1] +@ int stride_dst, [r2] +@ int16_t *_sao_offset_val, [r3] +@ int eo, [sp, #0] +@ int width, [sp, #4] +@ int height) [sp, #8] + +@ We simply split the 32 case into 2 vertical stripes +@ and call the fns for w32 +@ +@ Calling code will always have src != dst so we don't have to worry +@ about edge effects + +function ff_hevc_rpi_sao_edge_64_neon_10, export=1 + edge_64b_init 10, 0, 1, 99f, xjump=1 +endfunc + +@ void ff_hevc_rpi_sao_edge_32_neon_10( +@ uint8_t *_dst, [r0] +@ uint8_t *_src, [r1] +@ int stride_dst, [r2] +@ int16_t *_sao_offset_val, [r3] +@ int eo, [sp, #0] +@ int width, [sp, #4] +@ int height) [sp, #8] + +function ff_hevc_rpi_sao_edge_32_neon_10, export=1 + edge_64b_init 10, 0, 0, 99f +99: + edge_64b_bodies edge_64b_body_16, 2 +endfunc + +@ ff_hevc_rpi_sao_edge_c_8_neon_10( +@ uint8_t *_dst, [r0] +@ const uint8_t *_src, [r1] +@ ptrdiff_t stride_dst, [r2] +@ const int16_t *_sao_offset_val_u, [r3] +@ const int16_t *_sao_offset_val_v, [sp, #0] +@ int eo, [sp, #4] +@ int width, [sp, #8] +@ int height) [sp, #12] + +function ff_hevc_rpi_sao_edge_c_8_neon_10, export=1 + edge_xxb_init 10, 1, 99f, check_w4=1, setup_16b=1, setup_64b=1 +99: + edge_32bx2_16b_bodies edge_64b_body_16, edge_16b_body_16, 4 +endfunc + +@ ff_hevc_rpi_sao_edge_c_32_neon_10( +@ uint8_t *_dst, [r0] +@ const uint8_t *_src, [r1] +@ ptrdiff_t stride_dst, [r2] +@ const int16_t *_sao_offset_val_u, [r3] +@ const int16_t *_sao_offset_val_v, [sp, #0] +@ int eo, [sp, #4] +@ int width, [sp, #8] +@ int height) [sp, #12] + +function ff_hevc_rpi_sao_edge_c_32_neon_10, export=1 + edge_64b_init 10, 1, 1, 99f, xjump=1 +endfunc + + +@ ff_hevc_rpi_sao_edge_c_16_neon_10( +@ uint8_t *_dst, [r0] +@ const uint8_t *_src, [r1] +@ ptrdiff_t stride_dst, [r2] +@ const int16_t *_sao_offset_val_u, [r3] +@ const int16_t *_sao_offset_val_v, [sp, #0] +@ int eo, [sp, #4] +@ int width, [sp, #8] +@ int height) [sp, #12] + +function ff_hevc_rpi_sao_edge_c_16_neon_10, export=1 + edge_64b_init 10, 1, 0, 99f +99: + edge_64b_bodies edge_64b_body_16, 4 +endfunc + diff --git a/libavcodec/arm/rpi_hevcpred_arm.h b/libavcodec/arm/rpi_hevcpred_arm.h new file mode 100644 index 0000000000..36a23a5bf9 --- /dev/null +++ b/libavcodec/arm/rpi_hevcpred_arm.h @@ -0,0 +1,28 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_ARM_HEVCPRED_ARM_H +#define AVCODEC_ARM_HEVCPRED_ARM_H + +#include "libavcodec/rpi_hevcpred.h" + +void ff_hevc_rpi_pred_init_arm(HEVCRpiPredContext * const c, const int bit_depth); +void ff_hevc_rpi_pred_init_neon(HEVCRpiPredContext * const c, const int bit_depth); + +#endif /* AVCODEC_ARM_HEVCPRED_ARM_H */ + diff --git a/libavcodec/arm/rpi_hevcpred_init_arm.c b/libavcodec/arm/rpi_hevcpred_init_arm.c new file mode 100644 index 0000000000..80724d4cf3 --- /dev/null +++ b/libavcodec/arm/rpi_hevcpred_init_arm.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018 John Cox (for Raspberry Pi) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/attributes.h" +#include "libavutil/cpu.h" +#include "libavutil/arm/cpu.h" + +#include "libavcodec/rpi_hevcpred.h" +#include "rpi_hevcpred_arm.h" + +av_cold void ff_hevc_rpi_pred_init_arm(HEVCRpiPredContext * const c, const int bit_depth) +{ + int cpu_flags = av_get_cpu_flags(); + + if (have_neon(cpu_flags)) + ff_hevc_rpi_pred_init_neon(c, bit_depth); +} + diff --git a/libavcodec/arm/rpi_hevcpred_init_neon.c b/libavcodec/arm/rpi_hevcpred_init_neon.c new file mode 100644 index 0000000000..21e7700174 --- /dev/null +++ b/libavcodec/arm/rpi_hevcpred_init_neon.c @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2018 John Cox (for Raspberry Pi) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "rpi_hevcpred_arm.h" + +intra_filter_fn_t ff_hevc_rpi_intra_filter_4_neon_8; +intra_filter_fn_t ff_hevc_rpi_intra_filter_8_neon_8; +intra_filter_fn_t ff_hevc_rpi_intra_filter_4_neon_16; +intra_filter_fn_t ff_hevc_rpi_intra_filter_8_neon_16; +intra_filter_fn_t ff_hevc_rpi_intra_filter_16_neon_16; +intra_filter_fn_t ff_hevc_rpi_intra_filter_4_neon_32; +intra_filter_fn_t ff_hevc_rpi_intra_filter_8_neon_32; +intra_filter_fn_t ff_hevc_rpi_intra_filter_16_neon_32; + +void ff_hevc_rpi_pred_angular_4_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_angular_8_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_angular_16_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_angular_32_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_angular_c_4_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_angular_c_8_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_angular_c_16_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_angular_4_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_angular_8_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_angular_16_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_angular_32_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_angular_c_4_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_angular_c_8_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_angular_c_16_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); + +void ff_hevc_rpi_pred_vertical_4_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_vertical_8_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_vertical_16_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_vertical_32_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_vertical_c_4_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_vertical_c_8_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_vertical_c_16_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_vertical_4_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_vertical_8_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_vertical_16_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_vertical_32_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_vertical_c_4_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_vertical_c_8_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_vertical_c_16_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); + +void ff_hevc_rpi_pred_horizontal_4_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_horizontal_8_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_horizontal_16_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_horizontal_32_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_horizontal_c_4_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_horizontal_c_8_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_horizontal_c_16_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_horizontal_4_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_horizontal_8_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_horizontal_16_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_horizontal_32_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_horizontal_c_4_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_horizontal_c_8_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); +void ff_hevc_rpi_pred_horizontal_c_16_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int mode); + +void ff_hevc_rpi_pred_planar_4_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_planar_8_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_planar_16_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_planar_32_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_planar_c_4_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_planar_c_8_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_planar_c_16_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_planar_4_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_planar_8_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_planar_16_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_planar_32_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_planar_c_4_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_planar_c_8_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_planar_c_16_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); + +void ff_hevc_rpi_pred_dc_4_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_dc_8_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_dc_16_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_dc_32_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_dc_c_4_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_dc_c_8_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_dc_c_16_neon_8(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_dc_4_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_dc_8_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_dc_16_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_dc_32_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_dc_c_4_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_dc_c_8_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); +void ff_hevc_rpi_pred_dc_c_16_neon_10(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); + +void ff_hevc_rpi_pred_init_neon(HEVCRpiPredContext * const c, const int bit_depth) +{ + switch (bit_depth) + { + case 8: + c->intra_filter[0] = ff_hevc_rpi_intra_filter_4_neon_8; + c->intra_filter[1] = ff_hevc_rpi_intra_filter_8_neon_8; + c->intra_filter_c[0] = ff_hevc_rpi_intra_filter_4_neon_16; // Equivalent to c_4_neon_8 + c->intra_filter_c[1] = ff_hevc_rpi_intra_filter_8_neon_16; + c->intra_filter_c[2] = ff_hevc_rpi_intra_filter_16_neon_16; + + c->pred_angular[0] = ff_hevc_rpi_pred_angular_4_neon_8; + c->pred_angular[1] = ff_hevc_rpi_pred_angular_8_neon_8; + c->pred_angular[2] = ff_hevc_rpi_pred_angular_16_neon_8; + c->pred_angular[3] = ff_hevc_rpi_pred_angular_32_neon_8; + c->pred_angular_c[0] = ff_hevc_rpi_pred_angular_c_4_neon_8; + c->pred_angular_c[1] = ff_hevc_rpi_pred_angular_c_8_neon_8; + c->pred_angular_c[2] = ff_hevc_rpi_pred_angular_c_16_neon_8; + + c->pred_horizontal[0] = ff_hevc_rpi_pred_horizontal_4_neon_8; + c->pred_horizontal[1] = ff_hevc_rpi_pred_horizontal_8_neon_8; + c->pred_horizontal[2] = ff_hevc_rpi_pred_horizontal_16_neon_8; + c->pred_horizontal[3] = ff_hevc_rpi_pred_horizontal_32_neon_8; + c->pred_horizontal_c[0] = ff_hevc_rpi_pred_horizontal_c_4_neon_8; + c->pred_horizontal_c[1] = ff_hevc_rpi_pred_horizontal_c_8_neon_8; + c->pred_horizontal_c[2] = ff_hevc_rpi_pred_horizontal_c_16_neon_8; + + c->pred_vertical[0] = ff_hevc_rpi_pred_vertical_4_neon_8; + c->pred_vertical[1] = ff_hevc_rpi_pred_vertical_8_neon_8; + c->pred_vertical[2] = ff_hevc_rpi_pred_vertical_16_neon_8; + c->pred_vertical[3] = ff_hevc_rpi_pred_vertical_32_neon_8; + c->pred_vertical_c[0] = ff_hevc_rpi_pred_vertical_c_4_neon_8; + c->pred_vertical_c[1] = ff_hevc_rpi_pred_vertical_c_8_neon_8; + c->pred_vertical_c[2] = ff_hevc_rpi_pred_vertical_c_16_neon_8; + + c->pred_planar[0] = ff_hevc_rpi_pred_planar_4_neon_8; + c->pred_planar[1] = ff_hevc_rpi_pred_planar_8_neon_8; + c->pred_planar[2] = ff_hevc_rpi_pred_planar_16_neon_8; + c->pred_planar[3] = ff_hevc_rpi_pred_planar_32_neon_8; + c->pred_planar_c[0] = ff_hevc_rpi_pred_planar_c_4_neon_8; + c->pred_planar_c[1] = ff_hevc_rpi_pred_planar_c_8_neon_8; + c->pred_planar_c[2] = ff_hevc_rpi_pred_planar_c_16_neon_8; + + c->pred_dc[0] = ff_hevc_rpi_pred_dc_4_neon_8; + c->pred_dc[1] = ff_hevc_rpi_pred_dc_8_neon_8; + c->pred_dc[2] = ff_hevc_rpi_pred_dc_16_neon_8; + c->pred_dc[3] = ff_hevc_rpi_pred_dc_32_neon_8; + c->pred_dc_c[0] = ff_hevc_rpi_pred_dc_c_4_neon_8; + c->pred_dc_c[1] = ff_hevc_rpi_pred_dc_c_8_neon_8; + c->pred_dc_c[2] = ff_hevc_rpi_pred_dc_c_16_neon_8; + break; + case 10: + c->intra_filter[0] = ff_hevc_rpi_intra_filter_4_neon_16; + c->intra_filter[1] = ff_hevc_rpi_intra_filter_8_neon_16; + c->intra_filter[2] = ff_hevc_rpi_intra_filter_16_neon_16; + c->intra_filter_c[0] = ff_hevc_rpi_intra_filter_4_neon_32; + c->intra_filter_c[1] = ff_hevc_rpi_intra_filter_8_neon_32; + c->intra_filter_c[2] = ff_hevc_rpi_intra_filter_16_neon_32; + + c->pred_angular[0] = ff_hevc_rpi_pred_angular_4_neon_10; + c->pred_angular[1] = ff_hevc_rpi_pred_angular_8_neon_10; + c->pred_angular[2] = ff_hevc_rpi_pred_angular_16_neon_10; + c->pred_angular[3] = ff_hevc_rpi_pred_angular_32_neon_10; + c->pred_angular_c[0] = ff_hevc_rpi_pred_angular_c_4_neon_10; + c->pred_angular_c[1] = ff_hevc_rpi_pred_angular_c_8_neon_10; + c->pred_angular_c[2] = ff_hevc_rpi_pred_angular_c_16_neon_10; + + c->pred_horizontal[0] = ff_hevc_rpi_pred_horizontal_4_neon_10; + c->pred_horizontal[1] = ff_hevc_rpi_pred_horizontal_8_neon_10; + c->pred_horizontal[2] = ff_hevc_rpi_pred_horizontal_16_neon_10; + c->pred_horizontal[3] = ff_hevc_rpi_pred_horizontal_32_neon_10; + c->pred_horizontal_c[0] = ff_hevc_rpi_pred_horizontal_c_4_neon_10; + c->pred_horizontal_c[1] = ff_hevc_rpi_pred_horizontal_c_8_neon_10; + c->pred_horizontal_c[2] = ff_hevc_rpi_pred_horizontal_c_16_neon_10; + + c->pred_vertical[0] = ff_hevc_rpi_pred_vertical_4_neon_10; + c->pred_vertical[1] = ff_hevc_rpi_pred_vertical_8_neon_10; + c->pred_vertical[2] = ff_hevc_rpi_pred_vertical_16_neon_10; + c->pred_vertical[3] = ff_hevc_rpi_pred_vertical_32_neon_10; + c->pred_vertical_c[0] = ff_hevc_rpi_pred_vertical_c_4_neon_10; + c->pred_vertical_c[1] = ff_hevc_rpi_pred_vertical_c_8_neon_10; + c->pred_vertical_c[2] = ff_hevc_rpi_pred_vertical_c_16_neon_10; + + c->pred_planar[0] = ff_hevc_rpi_pred_planar_4_neon_10; + c->pred_planar[1] = ff_hevc_rpi_pred_planar_8_neon_10; + c->pred_planar[2] = ff_hevc_rpi_pred_planar_16_neon_10; + c->pred_planar[3] = ff_hevc_rpi_pred_planar_32_neon_10; + c->pred_planar_c[0] = ff_hevc_rpi_pred_planar_c_4_neon_10; + c->pred_planar_c[1] = ff_hevc_rpi_pred_planar_c_8_neon_10; + c->pred_planar_c[2] = ff_hevc_rpi_pred_planar_c_16_neon_10; + + c->pred_dc[0] = ff_hevc_rpi_pred_dc_4_neon_10; + c->pred_dc[1] = ff_hevc_rpi_pred_dc_8_neon_10; + c->pred_dc[2] = ff_hevc_rpi_pred_dc_16_neon_10; + c->pred_dc[3] = ff_hevc_rpi_pred_dc_32_neon_10; + c->pred_dc_c[0] = ff_hevc_rpi_pred_dc_c_4_neon_10; + c->pred_dc_c[1] = ff_hevc_rpi_pred_dc_c_8_neon_10; + c->pred_dc_c[2] = ff_hevc_rpi_pred_dc_c_16_neon_10; + break; + default: + break; + } +} + diff --git a/libavcodec/arm/rpi_hevcpred_intra_angular_neon.S b/libavcodec/arm/rpi_hevcpred_intra_angular_neon.S new file mode 100644 index 0000000000..fa8f67cf03 --- /dev/null +++ b/libavcodec/arm/rpi_hevcpred_intra_angular_neon.S @@ -0,0 +1,2984 @@ +/* +Copyright (c) 2017 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox, Ben Avison +*/ + +/* + * General angular pred + * + * Horizontal (10) & Vertical (26) cases have their own file + * and are not dealt with properly here (luma filtering is missing) + * + * The inv_angle calculations are annoying - if it wasn't for the +128 + * rounding step then the result would simply be the loop counter :-( + */ + + +#include "libavutil/arm/asm.S" +#include "neon.S" + +.text + +@ Horizontal Patch functions +@ These need a transpose before store so exist as smaller patches +@ Patches can be called repeatedly without any intermediate setup +@ to generate a horizontal block +@ +@ It is almost certainly the case that larger patch fns can be built +@ and they would be a little faster, but we would still need the small +@ fns and code size (or at least instruction cache size) is an issue +@ given how much code we already have here + +@ Generate 8x8 luma 8 patch +@ +@ r3 Out stride +@ r4 Angle add +@ r7 Inv angle (_up only) +@ +@ In/Out (updated) +@ r0 Out pointer - on exit point to start of next patch horizontally (i.e. r0 + patch width) +@ r2 Left ptr - updated +@ r10 Inv angle accumulator (_up only) +@ r12 32 - angle frac (_down) or angle frac (_up) +@ d0 Older reference samples +@ d1=r8+r9 Newer reference samples +@ d2 32 - angle frac +@ d3 Angle frac +@ q2 Partially computed next result (_up only) +@ +@ Temps +@ r5 Loop counter +@ r6 +@ r7 (_down only) +@ r11 (_up only) +@ q2, q8-q11 + +patch_h_down_8x8_8: + ldrd r8, r9, [r2] @ Left + rsb r12, r6, #32 + vmov d0, r8, r9 + vdup.8 d3, r6 + lsr r8, #8 + vdup.8 d2, r12 + orr r8, r8, r9, lsl #24 + ldr r9, [r2, #5]! + vmov d1, r8, r9 + // drop through... +patch_h_down_8x8_8_continue: + mov r5, #8 +1: + subs r12, r4 + vmull.u8 q2, d0, d2 + it mi + addmi r12, #32 + vmlal.u8 q2, d1, d3 + rsb r6, r12, #32 + vext.8 q8, q8, q9, #8 + itt mi + lsrmi r7, r8, #8 + vmovmi d0, r8, r9 + vdup.8 d2, r12 + vext.8 q9, q9, q10, #8 + it mi + orrmi r8, r7, r9, lsl #24 + vext.8 q10, q10, q11, #8 + it mi + ldrmi r9, [r2, #1]! + vmov d22, d23 + vrshrn.u16 d23, q2, #5 + it mi + vmovmi d1, r8, r9 + subs r5, #1 + vdup.8 d3, r6 + bne 1b + // drop through... +store_tran_8x8_8: + vzip.8 d16, d17 + add r6, r0, r3 + vzip.8 d18, d19 + lsl r3, #1 + vzip.8 d20, d21 + add r5, r0, r3 + vzip.8 d22, d23 + vzip.16 q8, q9 + vzip.16 q10, q11 + vzip.32 q8, q10 + vzip.32 q9, q11 + vst1.8 {d16}, [r0]! + vst1.8 {d17}, [r6], r3 + vst1.8 {d20}, [r5], r3 + vst1.8 {d21}, [r6], r3 + vst1.8 {d18}, [r5], r3 + vst1.8 {d19}, [r6], r3 + vst1.8 {d22}, [r5] + asr r3, #1 + vst1.8 {d23}, [r6] + + bx lr + +patch_h_up_8x8_8: + ldrd r8, r9, [r2] + rsb r6, r4, #32 + vmov d0, r8, r9 + vdup.8 d3, r4 + lsr r11, r8, #24 + vdup.8 d2, r6 + ldr r8, [r2, #-1]! + orr r9, r11, r9, lsl #8 + vmov d1, r8, r9 + mov r12, r4 + vmull.u8 q2, d0, d2 + vmlal.u8 q2, d1, d3 +patch_h_up_8x8_8_continue: + mov r5, #8 +1: + add r12, r4 + mov r11, #0 + cmp r12, #33 + it cs + addcs r10, r7 + vext.8 q8, q8, q9, #8 + itt cs + subcs r12, #32 + tstcs r10, #1<<31 + rsb r6, r12, #32 + it eq + asreq r11, r10, #8 + it cs + vmovcs d0, r8, r9 + vdup.8 d2, r6 + it cs + lsrcs r6, r8, #24 + vext.8 q9, q9, q10, #8 + itt cs + orrcs r9, r6, r9, lsl #8 + ldrbcs r11, [r1, r11] + vdup.8 d3, r12 + vext.8 q10, q10, q11, #8 + it hi + ldrbhi r11, [r2, #-1]! + vmov d22, d23 + vrshrn.u16 d23, q2, #5 + itt cs + orrcs r8, r11, r8, lsl #8 + vmovcs d1, r8, r9 + vmull.u8 q2, d0, d2 + subs r5, #1 + vmlal.u8 q2, d1, d3 + bne 1b + + b store_tran_8x8_8 + + +.macro ADRT reg, val +@ adr in T32 has enough range but not in A32 +A adrl \reg, \val +T adr \reg, \val +.endm + +@ ff_hevc_rpi_pred_angular_4_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride [r3] +@ unsigned int mode [sp, #0] 2..34 + +function ff_hevc_rpi_pred_angular_4_neon_8, export=1 + ldr r12, [sp] + push {r4-r8, lr} + ADRT r4, angle_2 - 2 + ADRT r7, inv_angle - 11*2 + add r7, r7, r12, lsl #1 + ldrsb r6, [r4, r12] + cmp r12, #26 + ldrsb r4, [r4, r12] + bge 26f + cmp r12, #18 + bge 18f + cmp r12, #10 + bge 10f + +@ Down of Horizontal - works down left + ldr lr, [r2], #1 @ Top + rsb r12, r6, #32 + vmov s0, lr + vdup.8 d3, r6 + ldr lr, [r2], #1 + vdup.8 d2, r12 + vmov s2, lr + subs r12, r4 + vmull.u8 q2, d0, d2 + it mi + addmi r12, #32 + vmlal.u8 q2, d1, d3 + rsb r6, r12, #32 + itt mi + vmovmi s0, lr + ldrmi lr, [r2], #1 + vdup.8 d2, r12 + it mi + vmovmi s2, lr + vdup.8 d3, r6 + mov r5, #2 +1: + vrshrn.u16 d20, q2, #5 + subs r12, r4 + vmull.u8 q2, d0, d2 + it mi + addmi r12, #32 + vmlal.u8 q2, d1, d3 + rsb r6, r12, #32 + vext.64 q8, q8, q9, #1 + it mi + vmovmi s0, lr + vext.64 q9, q9, q10, #1 + it mi + ldrmi lr, [r2], #1 + vdup.8 d2, r12 + it mi + vmovmi s2, lr + subs r5, #1 + vdup.8 d3, r6 + bne 1b + + vrshrn.u16 d20, q2, #5 + vmull.u8 q2, d0, d2 + add r12, r0, r3 + vmlal.u8 q2, d1, d3 + lsl r3, #1 + vext.64 q8, q8, q9, #1 + vext.64 q9, q9, q10, #1 + vrshrn.u16 d20, q2, #5 + +98: + vst4.8 {d17[0], d18[0], d19[0], d20[0]}, [r0], r3 + vst4.8 {d17[1], d18[1], d19[1], d20[1]}, [r12], r3 + vst4.8 {d17[2], d18[2], d19[2], d20[2]}, [r0] + vst4.8 {d17[3], d18[3], d19[3], d20[3]}, [r12] + pop {r4-r8, pc} + +@ Up of Horizontal - works down up +10: + ldrh r7, [r7] + rsb r12, r6, #32 + ldr lr, [r2] @ Left + ldrb r2, [r2, #-1] @ Top-left + vmov s0, lr + vdup.8 d2, r12 + vdup.8 d3, r6 + orr lr, r2, lr, lsl #8 + vmov s2, lr + sub r8, r7, #128 + mov r5, #3 +2: + vmull.u8 q2, d0, d2 + subs r12, r4 + vmlal.u8 q2, d1, d3 +T it mi + addmi r12, #32 +T asr r6, r8, #8 +T it mi +T ldrbmi r2, [r1, r6] +A ldrbmi r2, [r1, r8, asr #8] + rsb r6, r12, #32 + vdup.8 d2, r12 + ittt mi + vmovmi s0, lr + orrmi lr, r2, lr, lsl #8 + vmovmi s2, lr + vrshrn.u16 d20, q2, #5 + vdup.8 d3, r6 + it mi + addmi r8, r7 + subs r5, #1 + vext.64 q8, q8, q9, #1 + vext.64 q9, q9, q10, #1 + bne 2b + + vmull.u8 q2, d0, d2 + add r12, r0, r3 + vmlal.u8 q2, d1, d3 + lsl r3, #1 + vrshrn.u16 d20, q2, #5 + b 98b + +@ Left of vertical - works down left +18: + ldrh r7, [r7] + rsb r12, r6, #32 + ldr lr, [r1] @ Top + ldrb r1, [r2, #-1] @ Top-left + vmov s0, lr + vdup.8 d2, r12 + vdup.8 d3, r6 + orr lr, r1, lr, lsl #8 + vmov s2, lr + sub r8, r7, #128 + mov r5, #3 +2: + vmull.u8 q2, d0, d2 + subs r12, r4 + vmlal.u8 q2, d1, d3 +T it mi + addmi r12, #32 +T asr r6, r8, #8 +T it mi +T ldrbmi r1, [r2, r6] +A ldrbmi r1, [r2, r8, asr #8] + rsb r6, r12, #32 + vdup.8 d2, r12 + ittt mi + vmovmi s0, lr + orrmi lr, r1, lr, lsl #8 + vmovmi s2, lr + vrshrn.u16 d4, q2, #5 + vdup.8 d3, r6 + it mi + addmi r8, r7 + subs r5, #1 + vst1.32 {d4[0]}, [r0], r3 + bne 2b + + vmull.u8 q2, d0, d2 + vmlal.u8 q2, d1, d3 + vrshrn.u16 d4, q2, #5 + vst1.32 {d4[0]}, [r0] + + pop {r4-r8, pc} + +@ Right of vertical - works along top - left unused +26: + ldr lr, [r1], #1 @ Top + rsb r12, r6, #32 + vmov s0, lr + vdup.8 d3, r6 + ldr lr, [r1], #1 + vdup.8 d2, r12 + vmov s2, lr + subs r12, r4 + vmull.u8 q2, d0, d2 + it mi + addmi r12, #32 + vmlal.u8 q2, d1, d3 + rsb r6, r12, #32 + itt mi + vmovmi s0, lr + ldrmi lr, [r1], #1 + vdup.8 d2, r12 + it mi + vmovmi s2, lr + vdup.8 d3, r6 + mov r5, #2 +1: + vrshrn.u16 d6, q2, #5 + subs r12, r4 + vmull.u8 q2, d0, d2 + it mi + addmi r12, #32 + vmlal.u8 q2, d1, d3 + rsb r6, r12, #32 + vst1.32 {d6[0]}, [r0], r3 + itt mi + vmovmi s0, lr + ldrmi lr, [r1], #1 + vdup.8 d2, r12 + it mi + vmovmi s2, lr + subs r5, #1 + vdup.8 d3, r6 + bne 1b + + vrshrn.u16 d6, q2, #5 + vmull.u8 q2, d0, d2 + vmlal.u8 q2, d1, d3 + vst1.32 {d6[0]}, [r0], r3 + vrshrn.u16 d6, q2, #5 + vst1.32 {d6[0]}, [r0] + + pop {r4-r8, pc} + +endfunc + + + +@ ff_hevc_rpi_pred_angular_8_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride [r3] +@ unsigned int mode [sp, #0] 2..34 + +function ff_hevc_rpi_pred_angular_8_neon_8, export=1 + ldr r12, [sp] + push {r4-r11, lr} + ADRT r4, angle_2 - 2 + ADRT r7, inv_angle - 11*2 + add r7, r7, r12, lsl #1 + ldrsb r6, [r4, r12] + cmp r12, #26 + ldrsb r4, [r4, r12] + bge 26f + cmp r12, #18 + bge 18f + cmp r12, #10 + bge 10f + +@ Down of Horizontal - works down left + bl patch_h_down_8x8_8 + pop {r4-r11, pc} + +@ Up of Horizontal - works down up +10: + ldrh r7, [r7] + mov r10, #-128 + bl patch_h_up_8x8_8 + pop {r4-r11, pc} + +@ Left of vertical - works down left +18: + ldrd r8, r9, [r1] @ Top + rsb r12, r6, #32 + ldrb lr, [r2, #-1] @ Top-left + ldrh r7, [r7] + vmov d0, r8, r9 + lsl r9, r9, #8 + vdup.8 d2, r12 + orr r9, r9, r8, lsr #24 + orr r8, lr, r8, lsl #8 + vmov d1, r8, r9 + sub r1, r7, #128 + mov r5, #7 +1: + vdup.8 d3, r6 + vmull.u8 q2, d0, d2 + subs r12, r12, r4 + vmlal.u8 q2, d1, d3 + ittt mi + addmi lr, r2, r1, asr #8 + addmi r12, r12, #32 + vmovmi d0, r8, r9 + rsb r6, r12, #32 + itt mi + lslmi r9, r9, #8 + ldrbmi lr, [lr] + vdup.8 d2, r12 + vrshrn.u16 d4, q2, #5 + itttt mi + orrmi r9, r9, r8, lsr #24 + orrmi r8, lr, r8, lsl #8 + vmovmi d1, r8, r9 + addmi r1, r1, r7 + subs r5, r5, #1 + vst1.8 {d4}, [r0], r3 + bne 1b + + vdup.8 d3, r6 + vmull.u8 q2, d0, d2 + vmlal.u8 q2, d1, d3 + vrshrn.u16 d4, q2, #5 + vst1.8 {d4}, [r0] + + pop {r4-r11, pc} + +@ Right of vertical - works along top - left unused +26: + ldrd r8, r9, [r1] @ Top + rsb r12, r6, #32 + vmov d0, r8, r9 + vdup.8 d3, r6 + mov r5, #7 + lsr r8, #8 + vdup.8 d2, r12 + orr r8, r8, r9, lsl #24 + ldr r9, [r1, #5]! + vmov d1, r8, r9 +1: + vmull.u8 q2, d0, d2 + subs r12, r4 + vmlal.u8 q2, d1, d3 + it mi + addmi r12, #32 + rsb r6, r12, #32 + itt mi + vmovmi d0, r8, r9 + lsrmi r8, #8 + vdup.8 d2, r12 + itt mi + orrmi r8, r8, r9, lsl #24 + ldrmi r9, [r1, #1]! + vrshrn.u16 d6, q2, #5 + it mi + vmovmi d1, r8, r9 + vdup.8 d3, r6 + subs r5, #1 + vst1.8 {d6}, [r0], r3 + bne 1b + + vmull.u8 q2, d0, d2 + vmlal.u8 q2, d1, d3 + vrshrn.u16 d6, q2, #5 + vst1.8 {d6}, [r0] + + pop {r4-r11, pc} + +endfunc + + +@ ff_hevc_rpi_pred_angular_16_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride [r3] +@ unsigned int mode [sp, #0] 2..34 + +function ff_hevc_rpi_pred_angular_16_neon_8, export=1 + ldr r12, [sp] + push {r4-r11, lr} + ADRT r4, angle_2 - 2 + ADRT r7, inv_angle - 11*2 + add r7, r7, r12, lsl #1 + ldrsb r6, [r4, r12] + cmp r12, #26 + ldrsb r4, [r4, r12] + bge 26f + cmp r12, #18 + bge 18f + cmp r12, #10 + bge 10f + +@ Down of Horizontal - works down left + mov r1, r2 @ save r2 - r1 unused by patch_down + + bl patch_h_down_8x8_8 + bl patch_h_down_8x8_8_continue + + add r2, r1, #8 @ restore r2, but 8 rows further down left + sub r0, #16 + mov r6, r4 + add r0, r0, r3, lsl #3 + + bl patch_h_down_8x8_8 + bl patch_h_down_8x8_8_continue + + pop {r4-r11, pc} + +@ Up of Horizontal - works down up +10: + ldrh r7, [r7] + mov r10, #-128 + + push {r2} + bl patch_h_up_8x8_8 + bl patch_h_up_8x8_8_continue + pop {r2} + + sub r0, #16 + mov r10, #-128 + add r2, #8 + add r0, r0, r3, lsl #3 + sub r10, r10, r7, lsl #3 + + bl patch_h_up_8x8_8 + bl patch_h_up_8x8_8_continue + + pop {r4-r11, pc} + +@ Left of vertical - works down left +18: + vld1.8 {q9}, [r1] + sub r1, r2, #1 + rsb r12, r6, #32 + ldrh r7, [r7] + vdup.8 d6, r6 + vext.8 q8, q9, q9, #15 + sub r8, r7, #128 + vld1.8 {d16[0]}, [r1] + vdup.8 d7, r12 + mov r5, #15 +1: + vmull.u8 q0, d18, d7 + subs r12, r4 + vmlal.u8 q0, d16, d6 + it cc + addcc r12, #32 + vmull.u8 q1, d19, d7 + it cc + addcc r1, r2, r8, asr #8 + vmlal.u8 q1, d17, d6 + rsb r6, r12, #32 + vext.8 q10, q8, q8, #15 + sub r5, #1 + vld1.8 {d20[0]}, [r1] + it cc + addcc r8, r7 + vmov q11, q8 + teq r5, #0 + vrshrn.u16 d0, q0, #5 + vrshrn.u16 d1, q1, #5 + vdup.8 d6, r6 + vdup.8 d7, r12 + vst1.8 {q0}, [r0], r3 + bhi 1b + beq 4f +2: + vmull.u8 q0, d22, d7 + subs r12, r4 + vmlal.u8 q0, d20, d6 + it cc + addcc r12, #32 + vmull.u8 q1, d23, d7 + it cc + addcc r1, r2, r8, asr #8 + vmlal.u8 q1, d21, d6 + rsb r6, r12, #32 + vext.8 q8, q10, q10, #15 + sub r5, #1 + vld1.8 {d16[0]}, [r1] + it cc + addcc r8, r7 + vmov q9, q10 + teq r5, #0 + vrshrn.u16 d0, q0, #5 + vrshrn.u16 d1, q1, #5 + vdup.8 d6, r6 + vdup.8 d7, r12 + vst1.8 {q0}, [r0], r3 + bhi 2b + bne 1b + bcc 5f +3: + vmull.u8 q0, d22, d7 + vmlal.u8 q0, d20, d6 + vmull.u8 q1, d23, d7 + vmlal.u8 q1, d21, d6 + vrshrn.u16 d0, q0, #5 + vrshrn.u16 d1, q1, #5 + vst1.8 {q0}, [r0] + + pop {r4-r11, pc} +4: + bcc 3b +5: + vmull.u8 q0, d18, d7 + vmlal.u8 q0, d16, d6 + vmull.u8 q1, d19, d7 + vmlal.u8 q1, d17, d6 + vrshrn.u16 d0, q0, #5 + vrshrn.u16 d1, q1, #5 + vst1.8 {q0}, [r0] + + pop {r4-r11, pc} + +@ Right of vertical - works along top - left unused +26: + vld1.8 {q9}, [r1]! + rsb r12, r6, #32 + vdup.8 d6, r6 + vdup.8 d7, r12 + vext.8 q8, q9, q9, #1 + vld1.8 {d17[7]}, [r1]! + mov r5, #15 +1: + vmull.u8 q0, d16, d6 + subs r12, r4 + vmlal.u8 q0, d18, d7 + it cc + addcc r12, #32 + vmull.u8 q1, d17, d6 + rsb r6, r12, #32 + vmlal.u8 q1, d19, d7 + sub r5, #1 + vext.8 q10, q8, q8, #1 + teq r5, #0 + vld1.8 {d21[7]}, [r1] + it cc + addcc r1, #1 + vmov q11, q8 + vrshrn.u16 d0, q0, #5 + vrshrn.u16 d1, q1, #5 + vdup.8 d6, r6 + vdup.8 d7, r12 + vst1.8 {q0}, [r0], r3 + bhi 1b + beq 4f +2: + vmull.u8 q0, d20, d6 + subs r12, r4 + vmlal.u8 q0, d22, d7 + it cc + addcc r12, #32 + vmull.u8 q1, d21, d6 + rsb r6, r12, #32 + vmlal.u8 q1, d23, d7 + sub r5, #1 + vext.8 q8, q10, q10, #1 + teq r5, #0 + vld1.8 {d17[7]}, [r1] + it cc + addcc r1, #1 + vmov q9, q10 + vrshrn.u16 d0, q0, #5 + vrshrn.u16 d1, q1, #5 + vdup.8 d6, r6 + vdup.8 d7, r12 + vst1.8 {q0}, [r0], r3 + bhi 2b + bne 1b + bcc 5f +3: + vmull.u8 q0, d20, d6 + vmlal.u8 q0, d22, d7 + vmull.u8 q1, d21, d6 + vmlal.u8 q1, d23, d7 + vrshrn.u16 d0, q0, #5 + vrshrn.u16 d1, q1, #5 + vst1.8 {q0}, [r0] + + pop {r4-r11, pc} +4: + bcc 3b +5: + vmull.u8 q0, d16, d6 + vmlal.u8 q0, d18, d7 + vmull.u8 q1, d17, d6 + vmlal.u8 q1, d19, d7 + vrshrn.u16 d0, q0, #5 + vrshrn.u16 d1, q1, #5 + vst1.8 {q0}, [r0] + + pop {r4-r11, pc} + +endfunc + + +@ ff_hevc_rpi_pred_angular_32_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride [r3] +@ unsigned int mode [sp, #0] 2..34 + +function ff_hevc_rpi_pred_angular_32_neon_8, export=1 + ldr r12, [sp] + push {r4-r11, lr} + ADRT r4, angle_2 - 2 + ADRT r7, inv_angle - 11*2 + add r7, r7, r12, lsl #1 + ldrsb r6, [r4, r12] + cmp r12, #26 + ldrsb r4, [r4, r12] + bge 26f + cmp r12, #18 + bge 18f + cmp r12, #10 + bge 10f + +@ Down of Horizontal - works down left + mov r10, #4 + mov r1, r2 +1: + bl patch_h_down_8x8_8 + bl patch_h_down_8x8_8_continue + bl patch_h_down_8x8_8_continue + bl patch_h_down_8x8_8_continue + + add r2, r1, #8 @ restore r2, but 8 rows further down left + add r1, r1, #8 + mov r6, r4 + sub r0, #32 + subs r10, #1 + add r0, r0, r3, lsl #3 + bne 1b + + pop {r4-r11, pc} + +@ Up of Horizontal - works down up +10: + ldrh r7, [r7] + mov r10, #-128 + vmov.i8 d6, #1<<2 +1: + push {r2,r10} + bl patch_h_up_8x8_8 + bl patch_h_up_8x8_8_continue + bl patch_h_up_8x8_8_continue + bl patch_h_up_8x8_8_continue + pop {r2,r10} + + vmov r8, s12 + sub r0, #32 + add r2, #8 + add r0, r0, r3, lsl #3 + sub r10, r10, r7, lsl #3 + vshr.u8 d6, #1 + teq r8, #0 + bne 1b + + pop {r4-r11, pc} + +@ Left of vertical - works down left +18: + vld1.8 {q0-q1}, [r1] + sub r9, r2, #1 + rsb r12, r6, #32 + ldrh r7, [r7] + mov r8, #-128 + vdup.8 d18, r6 + vdup.8 d19, r12 + mov r5, #32 +1: + vld1.8 {d17[7]}, [r9] + add r8, r7 + vmov q2, q0 + vmov q3, q1 + add r9, r2, r8, asr #8 + vext.8 q1, q0, q1, #15 + vext.8 q0, q8, q0, #15 +2: + vmull.u8 q10, d4, d19 + subs r12, r4 + vmlal.u8 q10, d0, d18 + it cc + addcc r12, #32 + vmull.u8 q11, d5, d19 + rsb r6, r12, #32 + vmlal.u8 q11, d1, d18 + sub r5, #1 + vmull.u8 q12, d6, d19 + teq r5, #0 + vmlal.u8 q12, d2, d18 + vmull.u8 q13, d7, d19 + vmlal.u8 q13, d3, d18 + vdup.8 d18, r6 + vdup.8 d19, r12 + vrshrn.u16 d20, q10, #5 + vrshrn.u16 d21, q11, #5 + vrshrn.u16 d22, q12, #5 + vrshrn.u16 d23, q13, #5 + vst1.8 {q10-q11}, [r0], r3 + bhi 2b + bne 1b + + pop {r4-r11, pc} + +@ Right of vertical - works along top - left unused +26: + add r5, r1, #32 + vld1.8 {q0-q1}, [r1]! + rsb r12, r6, #32 + vld1.8 {d16[0]}, [r5] + mov r5, #32 + vdup.8 d18, r6 + vdup.8 d19, r12 +1: + vmov q2, q0 + add r1, #1 + vmov q3, q1 + vext.8 q0, q0, q1, #1 + vext.8 q1, q1, q8, #1 +2: + vmull.u8 q10, d0, d18 + subs r12, r4 + vmlal.u8 q10, d4, d19 + it cc + addcc r12, #32 + vmull.u8 q11, d1, d18 + rsb r6, r12, #32 + vmlal.u8 q11, d5, d19 + sub r5, #1 + vmull.u8 q12, d2, d18 + teq r5, #0 + vmlal.u8 q12, d6, d19 + vmull.u8 q13, d3, d18 + vmlal.u8 q13, d7, d19 + vld1.8 {d16[0]}, [r1] + vdup.8 d18, r6 + vdup.8 d19, r12 + vrshrn.u16 d20, q10, #5 + vrshrn.u16 d21, q11, #5 + vrshrn.u16 d22, q12, #5 + vrshrn.u16 d23, q13, #5 + vst1.8 {q10-q11}, [r0], r3 + bhi 2b + bne 1b + + pop {r4-r11, pc} + +endfunc + + +@ Chroma 8 bit 4x4 patch fns + .text + +patch_h_down_c_4x4_8: + ldrd r8, r9, [r2] @ Left + rsb r12, r6, #32 + vmov d0, r8, r9 + vdup.8 d3, r6 + lsr r8, #16 + vdup.8 d2, r12 + orr r8, r8, r9, lsl #16 + ldr r9, [r2, #6]! + vmov d1, r8, r9 + // drop through... +patch_h_down_c_4x4_8_continue: + mov r5, #4 +1: + subs r12, r4 + vmull.u8 q2, d0, d2 + it mi + addmi r12, #32 + vmlal.u8 q2, d1, d3 + rsb r6, r12, #32 + vext.8 q8, q8, q9, #8 + it mi + lsrmi r7, r8, #16 + vmov d18, d19 + it mi + vmovmi d0, r8, r9 + vdup.8 d2, r12 + it mi + orrmi r8, r7, r9, lsl #16 + vrshrn.u16 d19, q2, #5 + itt mi + ldrmi r9, [r2, #2]! + vmovmi d1, r8, r9 + subs r5, #1 + vdup.8 d3, r6 + bne 1b + // drop through... +store_tran_c_4x4_8: + vzip.16 d16, d17 + add r6, r0, r3 + vzip.16 d18, d19 + lsl r3, #1 + vzip.32 q8, q9 + add r5, r0, r3 + vst1.16 {d16}, [r0]! + vst1.16 {d17}, [r6], r3 + vst1.16 {d18}, [r5] + asr r3, #1 + vst1.16 {d19}, [r6] + + bx lr + +patch_h_up_c_4x4_8: + ldrd r8, r9, [r2] + rsb r6, r4, #32 + vmov d0, r8, r9 + vdup.8 d3, r4 + lsr r11, r8, #16 + vdup.8 d2, r6 + ldr r8, [r2, #-2]! + orr r9, r11, r9, lsl #16 + vmov d1, r8, r9 + mov r12, r4 + vmull.u8 q2, d0, d2 + vmlal.u8 q2, d1, d3 +patch_h_up_c_4x4_8_continue: + mov r5, #4 +1: + add r12, r4 + cmp r12, #33 + it cs + addcs r10, r7 + mov r11, #0 + itt cs + subcs r12, #32 + tstcs r10, #1<<31 + rsb r6, r12, #32 + it eq + asreq r11, r10, #7 + it cs + vmovcs d0, r8, r9 + it eq + biceq r11, #1 + vdup.8 d2, r6 + it cs + lsrcs r6, r8, #16 + vdup.8 d3, r12 + vext.8 q8, q8, q9, #8 + itt cs + orrcs r9, r6, r9, lsl #16 + ldrhcs r11, [r1, r11] + vmov d18, d19 + it hi + ldrhhi r11, [r2, #-2]! + vrshrn.u16 d19, q2, #5 + itt cs + orrcs r8, r11, r8, lsl #16 + vmovcs d1, r8, r9 + vmull.u8 q2, d0, d2 + subs r5, #1 + vmlal.u8 q2, d1, d3 + bne 1b + + b store_tran_c_4x4_8 + + +@ ff_hevc_rpi_pred_angular_c_4_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride [r3] +@ unsigned int mode [sp, #0] 2..34 + +function ff_hevc_rpi_pred_angular_c_4_neon_8, export=1 + ldr r12, [sp] + push {r4-r11, lr} + ADRT r4, angle_2 - 2 + ADRT r7, inv_angle - 11*2 + add r7, r7, r12, lsl #1 + lsl r3, #1 + ldrsb r6, [r4, r12] + cmp r12, #26 + ldrsb r4, [r4, r12] + bge 26f + cmp r12, #18 + bge 18f + cmp r12, #10 + bge 10f + +@ Down of Horizontal - works down left + bl patch_h_down_c_4x4_8 + pop {r4-r11, pc} + +@ Up of Horizontal - works down up +10: + ldrh r7, [r7] + mov r10, #-128 + bl patch_h_up_c_4x4_8 + pop {r4-r11, pc} + +@ Left of vertical - works down left +18: + ldrd r8, r9, [r1] @ Top + rsb r12, r6, #32 + ldrh lr, [r2, #-2] @ Top-left + ldrh r7, [r7] + vmov d0, r8, r9 + lsl r9, r9, #16 + vdup.8 d2, r12 + orr r9, r9, r8, lsr #16 + orr r8, lr, r8, lsl #16 + vmov d1, r8, r9 + sub r1, r7, #128 + mov r5, #3 +1: + vdup.8 d3, r6 + vmull.u8 q2, d0, d2 + subs r12, r12, r4 + vmlal.u8 q2, d1, d3 + itttt mi + addmi lr, r2, r1, asr #7 + bicmi lr, #1 + addmi r12, r12, #32 + vmovmi d0, r8, r9 + rsb r6, r12, #32 + itt mi + lslmi r9, r9, #16 + ldrhmi lr, [lr] + vdup.8 d2, r12 + vrshrn.u16 d4, q2, #5 + itttt mi + orrmi r9, r9, r8, lsr #16 + orrmi r8, lr, r8, lsl #16 + vmovmi d1, r8, r9 + addmi r1, r1, r7 + subs r5, r5, #1 + vst1.16 {d4}, [r0], r3 + bne 1b + + vdup.8 d3, r6 + vmull.u8 q2, d0, d2 + vmlal.u8 q2, d1, d3 + vrshrn.u16 d4, q2, #5 + vst1.16 {d4}, [r0] + + pop {r4-r11, pc} + +@ Right of vertical - works along top - left unused +26: + ldrd r8, r9, [r1] @ Top + rsb r12, r6, #32 + vmov d0, r8, r9 + vdup.8 d3, r6 + mov r5, #3 + lsr r8, #16 + vdup.8 d2, r12 + orr r8, r8, r9, lsl #16 + ldr r9, [r1, #6]! + vmov d1, r8, r9 +1: + vmull.u8 q2, d0, d2 + subs r12, r4 + vmlal.u8 q2, d1, d3 + it mi + addmi r12, #32 + rsb r6, r12, #32 + itt mi + vmovmi d0, r8, r9 + lsrmi r8, #16 + vdup.8 d2, r12 + itt mi + orrmi r8, r8, r9, lsl #16 + ldrmi r9, [r1, #2]! + vrshrn.u16 d6, q2, #5 + it mi + vmovmi d1, r8, r9 + vdup.8 d3, r6 + subs r5, #1 + vst1.16 {d6}, [r0], r3 + bne 1b + + vmull.u8 q2, d0, d2 + vmlal.u8 q2, d1, d3 + vrshrn.u16 d6, q2, #5 + vst1.16 {d6}, [r0] + + pop {r4-r11, pc} + +endfunc + + +@ ff_hevc_rpi_pred_angular_c_8_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride [r3] +@ unsigned int mode [sp, #0] 2..34 + +function ff_hevc_rpi_pred_angular_c_8_neon_8, export=1 + ldr r12, [sp] + push {r4-r11, lr} + ADRT r4, angle_2 - 2 + ADRT r7, inv_angle - 11*2 + add r7, r7, r12, lsl #1 + lsl r3, #1 + ldrsb r6, [r4, r12] + cmp r12, #26 + ldrsb r4, [r4, r12] + bge 26f + cmp r12, #18 + bge 18f + cmp r12, #10 + bge 10f + +@ Down of Horizontal - works down left + mov r1, r2 @ save r2 - r1 unused by patch_down + + bl patch_h_down_c_4x4_8 + bl patch_h_down_c_4x4_8_continue + + add r2, r1, #4*2 @ restore r2, but 4 rows further down left + sub r0, #16 + mov r6, r4 + add r0, r0, r3, lsl #2 + + bl patch_h_down_c_4x4_8 + bl patch_h_down_c_4x4_8_continue + + pop {r4-r11, pc} + +@ Up of Horizontal - works down up +10: + ldrh r7, [r7] + mov r10, #-128 + + push {r2} + bl patch_h_up_c_4x4_8 + bl patch_h_up_c_4x4_8_continue + pop {r2} + + sub r0, #16 + mov r10, #-128 + add r2, #8 + add r0, r0, r3, lsl #2 + sub r10, r10, r7, lsl #2 + + bl patch_h_up_c_4x4_8 + bl patch_h_up_c_4x4_8_continue + + pop {r4-r11, pc} + +@ Left of vertical - works down left +18: + vld1.8 {q9}, [r1] + sub r1, r2, #2 + rsb r12, r6, #32 + ldrh r7, [r7] + vdup.8 d6, r6 + vext.8 q8, q9, q9, #14 + sub r8, r7, #128 + vld1.16 {d16[0]}, [r1] + vdup.8 d7, r12 + mov r5, #7 +1: + subs r12, r4 + vmull.u8 q0, d18, d7 + it cc + asrcc r1, r8, #8 + vmlal.u8 q0, d16, d6 + it cc + addcc r12, #32 + vmull.u8 q1, d19, d7 + it cc + addcc r1, r2, r1, lsl #1 + vmlal.u8 q1, d17, d6 + rsb r6, r12, #32 + vext.8 q10, q8, q8, #14 + sub r5, #1 + vld1.16 {d20[0]}, [r1] + it cc + addcc r8, r7 + vmov q11, q8 + teq r5, #0 + vrshrn.u16 d0, q0, #5 + vrshrn.u16 d1, q1, #5 + vdup.8 d6, r6 + vdup.8 d7, r12 + vst1.8 {q0}, [r0], r3 + bhi 1b + beq 4f +2: + subs r12, r4 + vmull.u8 q0, d22, d7 + it cc + asrcc r1, r8, #8 + vmlal.u8 q0, d20, d6 + it cc + addcc r12, #32 + vmull.u8 q1, d23, d7 + it cc + addcc r1, r2, r1, lsl #1 + vmlal.u8 q1, d21, d6 + rsb r6, r12, #32 + vext.8 q8, q10, q10, #14 + sub r5, #1 + vld1.16 {d16[0]}, [r1] + it cc + addcc r8, r7 + vmov q9, q10 + teq r5, #0 + vrshrn.u16 d0, q0, #5 + vrshrn.u16 d1, q1, #5 + vdup.8 d6, r6 + vdup.8 d7, r12 + vst1.8 {q0}, [r0], r3 + bhi 2b + bne 1b + bcc 5f +3: + vmull.u8 q0, d22, d7 + vmlal.u8 q0, d20, d6 + vmull.u8 q1, d23, d7 + vmlal.u8 q1, d21, d6 + vrshrn.u16 d0, q0, #5 + vrshrn.u16 d1, q1, #5 + vst1.8 {q0}, [r0] + + pop {r4-r11, pc} +4: + bcc 3b +5: + vmull.u8 q0, d18, d7 + vmlal.u8 q0, d16, d6 + vmull.u8 q1, d19, d7 + vmlal.u8 q1, d17, d6 + vrshrn.u16 d0, q0, #5 + vrshrn.u16 d1, q1, #5 + vst1.8 {q0}, [r0] + + pop {r4-r11, pc} + +@ Right of vertical - works along top - left unused +26: + vld1.8 {q9}, [r1]! + rsb r12, r6, #32 + vdup.8 d6, r6 + vdup.8 d7, r12 + vext.8 q8, q9, q9, #2 + vld1.16 {d17[3]}, [r1]! + mov r5, #7 +1: + vmull.u8 q0, d16, d6 + subs r12, r4 + vmlal.u8 q0, d18, d7 + it cc + addcc r12, #32 + vmull.u8 q1, d17, d6 + rsb r6, r12, #32 + vmlal.u8 q1, d19, d7 + sub r5, #1 + vext.8 q10, q8, q8, #2 + teq r5, #0 + vld1.16 {d21[3]}, [r1] + it cc + addcc r1, #2 + vmov q11, q8 + vrshrn.u16 d0, q0, #5 + vrshrn.u16 d1, q1, #5 + vdup.8 d6, r6 + vdup.8 d7, r12 + vst1.8 {q0}, [r0], r3 + bhi 1b + beq 4f +2: + vmull.u8 q0, d20, d6 + subs r12, r4 + vmlal.u8 q0, d22, d7 + it cc + addcc r12, #32 + vmull.u8 q1, d21, d6 + rsb r6, r12, #32 + vmlal.u8 q1, d23, d7 + sub r5, #1 + vext.8 q8, q10, q10, #2 + teq r5, #0 + vld1.16 {d17[3]}, [r1] + it cc + addcc r1, #2 + vmov q9, q10 + vrshrn.u16 d0, q0, #5 + vrshrn.u16 d1, q1, #5 + vdup.8 d6, r6 + vdup.8 d7, r12 + vst1.8 {q0}, [r0], r3 + bhi 2b + bne 1b + bcc 5f +3: + vmull.u8 q0, d20, d6 + vmlal.u8 q0, d22, d7 + vmull.u8 q1, d21, d6 + vmlal.u8 q1, d23, d7 + vrshrn.u16 d0, q0, #5 + vrshrn.u16 d1, q1, #5 + vst1.8 {q0}, [r0] + + pop {r4-r11, pc} +4: + bcc 3b +5: + vmull.u8 q0, d16, d6 + vmlal.u8 q0, d18, d7 + vmull.u8 q1, d17, d6 + vmlal.u8 q1, d19, d7 + vrshrn.u16 d0, q0, #5 + vrshrn.u16 d1, q1, #5 + vst1.8 {q0}, [r0] + + pop {r4-r11, pc} + +endfunc + + +@ ff_hevc_rpi_pred_angular_c_16_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride [r3] +@ unsigned int mode [sp, #0] 2..34 + +function ff_hevc_rpi_pred_angular_c_16_neon_8, export=1 + ldr r12, [sp] + push {r4-r11, lr} + ADRT r4, angle_2 - 2 + ADRT r7, inv_angle - 11*2 + add r7, r7, r12, lsl #1 + lsl r3, #1 + ldrsb r6, [r4, r12] + cmp r12, #26 + ldrsb r4, [r4, r12] + bge 26f + cmp r12, #18 + bge 18f + cmp r12, #10 + bge 10f + +@ Down of Horizontal - works down left + mov r10, #4 + mov r1, r2 +1: + bl patch_h_down_c_4x4_8 + bl patch_h_down_c_4x4_8_continue + bl patch_h_down_c_4x4_8_continue + bl patch_h_down_c_4x4_8_continue + + add r2, r1, #4*2 @ restore r2, but 4 rows further down left + add r1, r1, #4*2 + mov r6, r4 + sub r0, #32 + subs r10, #1 + add r0, r0, r3, lsl #2 + bne 1b + + pop {r4-r11, pc} + +@ Up of Horizontal - works down up +10: + ldrh r7, [r7] + mov r10, #-128 + vmov.i8 d6, #1<<2 +1: + push {r2, r10} + bl patch_h_up_c_4x4_8 + bl patch_h_up_c_4x4_8_continue + bl patch_h_up_c_4x4_8_continue + bl patch_h_up_c_4x4_8_continue + pop {r2, r10} + + vmov r8, s12 + sub r0, #32 + add r2, #8 + add r0, r0, r3, lsl #2 + sub r10, r10, r7, lsl #2 + vshr.u8 d6, #1 + teq r8, #0 + bne 1b + + pop {r4-r11, pc} + +@ Left of vertical - works down left +18: + vld1.8 {q0-q1}, [r1] + sub r9, r2, #2 + rsb r12, r6, #32 + ldrh r7, [r7] + mov r8, #-128 + vdup.8 d18, r6 + vdup.8 d19, r12 + mov r5, #16 +1: + vld1.16 {d17[3]}, [r9] + add r8, r7 + vmov q2, q0 + vmov q3, q1 + asr r9, r8, #8 + vext.8 q1, q0, q1, #14 + add r9, r2, r9, lsl #1 + vext.8 q0, q8, q0, #14 +2: + vmull.u8 q10, d4, d19 + subs r12, r4 + vmlal.u8 q10, d0, d18 + it cc + addcc r12, #32 + vmull.u8 q11, d5, d19 + rsb r6, r12, #32 + vmlal.u8 q11, d1, d18 + sub r5, #1 + vmull.u8 q12, d6, d19 + teq r5, #0 + vmlal.u8 q12, d2, d18 + vmull.u8 q13, d7, d19 + vmlal.u8 q13, d3, d18 + vdup.8 d18, r6 + vdup.8 d19, r12 + vrshrn.u16 d20, q10, #5 + vrshrn.u16 d21, q11, #5 + vrshrn.u16 d22, q12, #5 + vrshrn.u16 d23, q13, #5 + vst1.8 {q10-q11}, [r0], r3 + bhi 2b + bne 1b + + pop {r4-r11, pc} + +@ Right of vertical - works along top - left unused +26: + add r5, r1, #32 + vld1.8 {q0-q1}, [r1]! + rsb r12, r6, #32 + vld1.16 {d16[0]}, [r5] + mov r5, #16 + vdup.8 d18, r6 + vdup.8 d19, r12 +1: + vmov q2, q0 + add r1, #2 + vmov q3, q1 + vext.8 q0, q0, q1, #2 + vext.8 q1, q1, q8, #2 +2: + vmull.u8 q10, d0, d18 + subs r12, r4 + vmlal.u8 q10, d4, d19 + it cc + addcc r12, #32 + vmull.u8 q11, d1, d18 + rsb r6, r12, #32 + vmlal.u8 q11, d5, d19 + sub r5, #1 + vmull.u8 q12, d2, d18 + teq r5, #0 + vmlal.u8 q12, d6, d19 + vmull.u8 q13, d3, d18 + vmlal.u8 q13, d7, d19 + vld1.16 {d16[0]}, [r1] + vdup.8 d18, r6 + vdup.8 d19, r12 + vrshrn.u16 d20, q10, #5 + vrshrn.u16 d21, q11, #5 + vrshrn.u16 d22, q12, #5 + vrshrn.u16 d23, q13, #5 + vst1.8 {q10-q11}, [r0], r3 + bhi 2b + bne 1b + + pop {r4-r11, pc} + +endfunc + +@------------------------------------------------------------------------------ +@ Data + + .text + .balign 64 +angle_2: + .byte 32 + .byte 26, 21, 17, 13, 9, 5, 2, 0 + @ Sign inverted from standards table + .byte 2, 5, 9, 13, 17, 21, 26, 32 + .byte 26, 21, 17, 13, 9, 5, 2, 0 + @ Standard sign + .byte 2, 5, 9, 13, 17, 21, 26, 32 + + .balign 2 + + @ Sign inverted from standards table +inv_angle: + .short 4096, 1638, 910, 630, 482, 390, 315 + .short 256 + .short 315, 390, 482, 630, 910, 1638, 4096 + +@------------------------------------------------------------------------------ +@ +@ 10 bit fns +@ Should work for 9 & 11 bit as there is no actual bit-depth specific code +@ but runs out of register width for 12+ bit + + .text + .balign 64 + +patch_h_down_4x4_10: + ldrd r8, r9, [r2] @ Left + rsb r12, r6, #32 + vmov d0, r8, r9 + vdup.16 d3, r6 + lsr r8, #16 + vdup.16 d2, r12 + orr r8, r8, r9, lsl #16 + ldr r9, [r2, #6]! + vmov d1, r8, r9 + // drop through... +patch_h_down_4x4_10_continue: + mov r5, #4 +1: + subs r12, r4 + vmul.u16 d4, d0, d2 + it mi + addmi r12, #32 + vmla.u16 d4, d1, d3 + rsb r6, r12, #32 + vext.16 q8, q8, q9, #4 + it mi + lsrmi r7, r8, #16 + vmov d18, d19 + it mi + vmovmi d0, r8, r9 + vdup.16 d2, r12 + it mi + orrmi r8, r7, r9, lsl #16 + vrshr.u16 d19, d4, #5 + itt mi + ldrmi r9, [r2, #2]! + vmovmi d1, r8, r9 + subs r5, #1 + vdup.16 d3, r6 + bne 1b + // drop through... +store_tran_4x4_10: + vzip.16 d16, d17 + add r6, r0, r3 + vzip.16 d18, d19 + lsl r3, #1 + vzip.32 q8, q9 + add r5, r0, r3 + vst1.16 {d16}, [r0]! + vst1.16 {d17}, [r6], r3 + vst1.16 {d18}, [r5] + asr r3, #1 + vst1.16 {d19}, [r6] + + bx lr + +patch_h_up_4x4_10: + ldrd r8, r9, [r2] + rsb r6, r4, #32 + vmov d0, r8, r9 + vdup.16 d3, r4 + lsr r11, r8, #16 + vdup.16 d2, r6 + ldr r8, [r2, #-2]! + orr r9, r11, r9, lsl #16 + vmov d1, r8, r9 + mov r12, r4 + vmul.u16 d4, d0, d2 + vmla.u16 d4, d1, d3 +patch_h_up_4x4_10_continue: + mov r5, #4 +1: + add r12, r4 + cmp r12, #33 + it cs + addcs r10, r7 + mov r11, #0 + itt cs + subcs r12, #32 + tstcs r10, #1<<31 + rsb r6, r12, #32 + it eq + asreq r11, r10, #7 + it cs + vmovcs d0, r8, r9 + it eq + biceq r11, #1 + vdup.16 d2, r6 + it cs + lsrcs r6, r8, #16 + vdup.16 d3, r12 + vext.16 q8, q8, q9, #4 + itt cs + orrcs r9, r6, r9, lsl #16 + ldrhcs r11, [r1, r11] + vmov d18, d19 + it hi + ldrhhi r11, [r2, #-2]! + vrshr.u16 d19, d4, #5 + itt cs + orrcs r8, r11, r8, lsl #16 + vmovcs d1, r8, r9 + vmul.u16 d4, d0, d2 + subs r5, #1 + vmla.u16 d4, d1, d3 + bne 1b + + b store_tran_4x4_10 + + +@ ff_hevc_rpi_pred_angular_4_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride [r3] +@ unsigned int mode [sp, #0] 2..34 + +function ff_hevc_rpi_pred_angular_4_neon_10, export=1 + ldr r12, [sp] + push {r4-r11, lr} + ADRT r4, angle_2 - 2 + ADRT r7, inv_angle - 11*2 + add r7, r7, r12, lsl #1 + lsl r3, #1 + ldrsb r6, [r4, r12] + cmp r12, #26 + ldrsb r4, [r4, r12] + bge 26f + cmp r12, #18 + bge 18f + cmp r12, #10 + bge 10f + +@ Down of Horizontal - works down left + bl patch_h_down_4x4_10 + pop {r4-r11, pc} + +@ Up of Horizontal - works down up +10: + ldrh r7, [r7] + mov r10, #-128 + bl patch_h_up_4x4_10 + pop {r4-r11, pc} + +@ Left of vertical - works down left +18: + ldrd r8, r9, [r1] @ Top + rsb r12, r6, #32 + ldrh lr, [r2, #-2] @ Top-left + ldrh r7, [r7] + vmov d0, r8, r9 + lsl r9, r9, #16 + vdup.16 d2, r12 + orr r9, r9, r8, lsr #16 + orr r8, lr, r8, lsl #16 + vmov d1, r8, r9 + sub r1, r7, #128 + mov r5, #3 +1: + sel lr, lr, lr @ force pipeline 0 on Cortex-A53 + vdup.16 d3, r6 + vmul.u16 d4, d0, d2 + subs r12, r12, r4 + vmla.u16 d4, d1, d3 + itttt mi + addmi lr, r2, r1, asr #7 + bicmi lr, #1 + addmi r12, r12, #32 + vmovmi d0, r8, r9 + rsb r6, r12, #32 + itt mi + lslmi r9, r9, #16 + ldrhmi lr, [lr] + vdup.16 d2, r12 + vrshr.u16 d4, d4, #5 + itttt mi + orrmi r9, r9, r8, lsr #16 + orrmi r8, lr, r8, lsl #16 + vmovmi d1, r8, r9 + addmi r1, r1, r7 + subs r5, r5, #1 + vst1.16 {d4}, [r0], r3 + bne 1b + + vdup.16 d3, r6 + nop @ force next insn into pipeline 0 to enable + vmul.u16 d4, d0, d2 @ vmla to execute back-to-back on Cortex-A53 + vmla.u16 d4, d1, d3 + vrshr.u16 d4, d4, #5 + vst1.16 {d4}, [r0] + + pop {r4-r11, pc} + +@ Right of vertical - works along top - left unused +26: + ldrd r8, r9, [r1] @ Top + rsb r12, r6, #32 + vmov d0, r8, r9 + vdup.16 d3, r6 + lsr r8, #16 + vdup.16 d2, r12 + orr r8, r8, r9, lsl #16 + ldr r9, [r1, #6]! + vmov d1, r8, r9 + mov r5, #3 +1: + vmul.u16 d4, d0, d2 + subs r12, r4 + vmla.u16 d4, d1, d3 + it mi + addmi r12, #32 + rsb r6, r12, #32 + itt mi + vmovmi d0, r8, r9 + lsrmi r8, #16 + vdup.16 d2, r12 + itt mi + orrmi r8, r8, r9, lsl #16 + ldrmi r9, [r1, #2]! + vrshr.u16 d4, d4, #5 + it mi + vmovmi d1, r8, r9 + vdup.16 d3, r6 + subs r5, #1 + vst1.16 {d4}, [r0], r3 + bne 1b + + vmul.u16 d4, d0, d2 + vmla.u16 d4, d1, d3 + vrshr.u16 d4, d4, #5 + vst1.16 {d4}, [r0] + + pop {r4-r11, pc} + +endfunc + + +@ ff_hevc_rpi_pred_angular_8_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride [r3] +@ unsigned int mode [sp, #0] 2..34 + +function ff_hevc_rpi_pred_angular_8_neon_10, export=1 + ldr r12, [sp] + push {r4-r11, lr} + ADRT r4, angle_2 - 2 + ADRT r7, inv_angle - 11*2 + add r7, r7, r12, lsl #1 + lsl r3, #1 + ldrsb r6, [r4, r12] + cmp r12, #26 + ldrsb r4, [r4, r12] + bge 26f + cmp r12, #18 + bge 18f + cmp r12, #10 + bge 10f + +@ Down of Horizontal - works down left + mov r1, r2 @ save r2 - r1 unused by patch_down + + bl patch_h_down_4x4_10 + bl patch_h_down_4x4_10_continue + + add r2, r1, #4*2 @ restore r2, but 4 rows further down left + sub r0, #16 + mov r6, r4 + add r0, r0, r3, lsl #2 + + bl patch_h_down_4x4_10 + bl patch_h_down_4x4_10_continue + + pop {r4-r11, pc} + +@ Up of Horizontal - works down up +10: + ldrh r7, [r7] + mov r10, #-128 + + push {r2} + bl patch_h_up_4x4_10 + bl patch_h_up_4x4_10_continue + pop {r2} + + sub r0, #16 + mov r10, #-128 + add r2, #8 + add r0, r0, r3, lsl #2 + sub r10, r10, r7, lsl #2 + + bl patch_h_up_4x4_10 + bl patch_h_up_4x4_10_continue + + pop {r4-r11, pc} + +@ Left of vertical - works down left +18: + vld1.16 {q9}, [r1] + sub r1, r2, #2 + rsb r12, r6, #32 + ldrh r7, [r7] + vdup.16 q2, r6 + vext.16 q8, q9, q9, #7 + sub r8, r7, #128 + vld1.16 {d16[0]}, [r1] + vdup.16 q3, r12 + mov r5, #7 +1: + vmul.u16 q0, q9, q3 + subs r12, r4 + vmla.u16 q0, q8, q2 + ittt cc + asrcc r1, r8, #8 + addcc r12, #32 + addcc r1, r2, r1, lsl #1 + vext.16 q10, q8, q8, #7 + rsb r6, r12, #32 + vmov q11, q8 + sub r5, #1 + vrshr.u16 q0, q0, #5 + it cc + addcc r8, r7 + vld1.16 {d20[0]}, [r1] + teq r5, #0 + vdup.16 q2, r6 + vdup.16 q3, r12 + vst1.16 {q0}, [r0], r3 + bhi 1b + beq 4f +2: + vmul.u16 q0, q11, q3 + subs r12, r4 + vmla.u16 q0, q10, q2 + ittt cc + asrcc r1, r8, #8 + addcc r12, #32 + addcc r1, r2, r1, lsl #1 + vext.16 q8, q10, q10, #7 + rsb r6, r12, #32 + vmov q9, q10 + sub r5, #1 + vrshr.u16 q0, q0, #5 + it cc + addcc r8, r7 + vld1.16 {d16[0]}, [r1] + teq r5, #0 + vdup.16 q2, r6 + vdup.16 q3, r12 + vst1.16 {q0}, [r0], r3 + bhi 2b + bne 1b + bcc 5f +3: + vmul.u16 q0, q11, q3 + vmla.u16 q0, q10, q2 + vrshr.u16 q0, q0, #5 + vst1.16 {q0}, [r0] + + pop {r4-r11, pc} +4: + bcc 3b +5: + vmul.u16 q0, q9, q3 + vmla.u16 q0, q8, q2 + vrshr.u16 q0, q0, #5 + vst1.16 {q0}, [r0] + + pop {r4-r11, pc} + +@ Right of vertical - works along top - left unused +26: + vld1.16 {q9}, [r1]! + rsb r12, r6, #32 + vdup.16 q2, r6 + vdup.16 q3, r12 + vext.16 q8, q9, q9, #1 + vld1.16 {d17[3]}, [r1]! + mov r5, #7 +1: + vmul.u16 q0, q8, q2 + subs r12, r4 + vmla.u16 q0, q9, q3 + it cc + addcc r12, #32 + vext.16 q10, q8, q8, #1 + rsb r6, r12, #32 + vld1.16 {d21[3]}, [r1] + sub r5, #1 + vmov q11, q8 + teq r5, #0 + vrshr.u16 q0, q0, #5 + it cc + addcc r1, #2 + vdup.16 q2, r6 + vdup.16 q3, r12 + vst1.16 {q0}, [r0], r3 + bhi 1b + beq 4f +2: + vmul.u16 q0, q10, q2 + subs r12, r4 + vmla.u16 q0, q11, q3 + it cc + addcc r12, #32 + vext.16 q8, q10, q10, #1 + rsb r6, r12, #32 + vld1.16 {d17[3]}, [r1] + sub r5, #1 + vmov q9, q10 + teq r5, #0 + vrshr.u16 q0, q0, #5 + it cc + addcc r1, #2 + vdup.16 q2, r6 + vdup.16 q3, r12 + vst1.16 {q0}, [r0], r3 + bhi 2b + bne 1b + bcc 5f +3: + vmul.u16 q0, q10, q2 + vmla.u16 q0, q11, q3 + vrshr.u16 q0, q0, #5 + vst1.16 {q0}, [r0] + + pop {r4-r11, pc} +4: + bcc 3b +5: + vmul.u16 q0, q8, q2 + vmla.u16 q0, q9, q3 + vrshr.u16 q0, q0, #5 + vst1.16 {q0}, [r0] + + pop {r4-r11, pc} + +endfunc + + +@ ff_hevc_rpi_pred_angular_16_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride [r3] +@ unsigned int mode [sp, #0] 2..34 + +function ff_hevc_rpi_pred_angular_16_neon_10, export=1 + ldr r12, [sp] + push {r4-r11, lr} + ADRT r4, angle_2 - 2 + ADRT r7, inv_angle - 11*2 + add r7, r7, r12, lsl #1 + lsl r3, #1 + ldrsb r6, [r4, r12] + cmp r12, #26 + ldrsb r4, [r4, r12] + bge 26f + cmp r12, #18 + bge 18f + cmp r12, #10 + bge 10f + +@ Down of Horizontal - works down left + mov r10, #4 + mov r1, r2 +1: + bl patch_h_down_4x4_10 + bl patch_h_down_4x4_10_continue + bl patch_h_down_4x4_10_continue + bl patch_h_down_4x4_10_continue + + add r2, r1, #4*2 @ restore r2, but 4 rows further down left + add r1, r1, #4*2 + mov r6, r4 + sub r0, #32 + subs r10, #1 + add r0, r0, r3, lsl #2 + bne 1b + + pop {r4-r11, pc} + +@ Up of Horizontal - works down up +10: + ldrh r7, [r7] + mov r10, #-128 + vmov.i8 d6, #1<<2 +1: + push {r2, r10} + bl patch_h_up_4x4_10 + bl patch_h_up_4x4_10_continue + bl patch_h_up_4x4_10_continue + bl patch_h_up_4x4_10_continue + pop {r2, r10} + + vmov r8, s12 + sub r0, #32 + add r2, #8 + add r0, r0, r3, lsl #2 + sub r10, r10, r7, lsl #2 + vshr.u8 d6, #1 + teq r8, #0 + bne 1b + + pop {r4-r11, pc} + +@ Left of vertical - works down left +18: + vld1.16 {q0-q1}, [r1] + sub r9, r2, #2 + rsb r12, r6, #32 + ldrh r7, [r7] + mov r8, #-128 + vdup.16 q9, r6 + vdup.16 q10, r12 + mov r5, #16 +1: + vld1.16 {d17[3]}, [r9] + add r8, r7 + vmov q2, q0 + vmov q3, q1 + asr r9, r8, #8 + vext.16 q1, q0, q1, #7 + add r9, r2, r9, lsl #1 + vext.16 q0, q8, q0, #7 +2: + vmul.u16 q11, q2, q10 + subs r12, r4 + vmla.u16 q11, q0, q9 + it cc + addcc r12, #32 + vmul.u16 q12, q3, q10 + rsb r6, r12, #32 + vmla.u16 q12, q1, q9 + sub r5, #1 + teq r5, #0 + vdup.16 q9, r6 + vdup.16 q10, r12 + vrshr.u16 q11, q11, #5 + vrshr.u16 q12, q12, #5 + vst1.16 {q11-q12}, [r0], r3 + bhi 2b + bne 1b + + pop {r4-r11, pc} + +@ Right of vertical - works along top - left unused +26: + add r5, r1, #32 + vld1.16 {q0-q1}, [r1]! + rsb r12, r6, #32 + vld1.16 {d16[0]}, [r5] + mov r5, #16 + vdup.16 q9, r6 + vdup.16 q10, r12 +1: + vmov q2, q0 + add r1, #2 + vmov q3, q1 + vext.16 q0, q0, q1, #1 + vext.16 q1, q1, q8, #1 +2: + vmul.u16 q11, q0, q9 + subs r12, r4 + vmla.u16 q11, q2, q10 + it cc + addcc r12, #32 + vmul.u16 q12, q1, q9 + rsb r6, r12, #32 + vmla.u16 q12, q3, q10 + sub r5, #1 + vld1.16 {d16[0]}, [r1] + teq r5, #0 + vdup.16 q9, r6 + vdup.16 q10, r12 + vrshr.u16 q11, q11, #5 + vrshr.u16 q12, q12, #5 + vst1.16 {q11-q12}, [r0], r3 + bhi 2b + bne 1b + + pop {r4-r11, pc} + +endfunc + + +@ ff_hevc_rpi_pred_angular_32_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride [r3] +@ unsigned int mode [sp, #0] 2..34 + +function ff_hevc_rpi_pred_angular_32_neon_10, export=1 + ldr r12, [sp] + push {r4-r11, lr} + ADRT r4, angle_2 - 2 + ADRT r7, inv_angle - 11*2 + add r7, r7, r12, lsl #1 + lsl r3, #1 + vpush {d8} + ldrsb r6, [r4, r12] + cmp r12, #26 + ldrsb r4, [r4, r12] + bge 26f + cmp r12, #18 + bge 18f + cmp r12, #10 + bge 10f + +@ Down of Horizontal - works down left + add sp, #8 + mov r10, #8 + mov r1, r2 +1: + bl patch_h_down_4x4_10 + bl patch_h_down_4x4_10_continue + bl patch_h_down_4x4_10_continue + bl patch_h_down_4x4_10_continue + bl patch_h_down_4x4_10_continue + bl patch_h_down_4x4_10_continue + bl patch_h_down_4x4_10_continue + bl patch_h_down_4x4_10_continue + + add r2, r1, #4*2 @ restore r2, but 4 rows further down left + add r1, r1, #4*2 + mov r6, r4 + sub r0, #64 + subs r10, #1 + add r0, r0, r3, lsl #2 + bne 1b + + pop {r4-r11, pc} + +@ Up of Horizontal - works down up +10: + add sp, #8 + ldrh r7, [r7] + mov r10, #-128 + vmov.i8 d6, #1<<6 +1: + push {r2, r10} + bl patch_h_up_4x4_10 + bl patch_h_up_4x4_10_continue + bl patch_h_up_4x4_10_continue + bl patch_h_up_4x4_10_continue + bl patch_h_up_4x4_10_continue + bl patch_h_up_4x4_10_continue + bl patch_h_up_4x4_10_continue + bl patch_h_up_4x4_10_continue + pop {r2, r10} + + vmov r8, s12 + sub r0, #64 + add r2, #8 + add r0, r0, r3, lsl #2 + sub r10, r10, r7, lsl #2 + vshr.u8 d6, #1 + teq r8, #0 + bne 1b + + pop {r4-r11, pc} + +@ Left of vertical - works down left +18: + add r5, r1, #32 + vld1.16 {q1-q2}, [r1] + rsb r12, r6, r6, lsl #16 + vld1.16 {q3-q4}, [r5] + sub r9, r2, #2 + rsb r4, r12, #0 + rsb r12, r12, #32 << 16 + ldrh r7, [r7] + mov r8, #-128 + vmov d0, d9 + vmov s2, r12 + add r10, r0, #32 + mov r5, #32 +1: + vld1.16 {d1[3]}, [r9] + add r8, r7 + vmov q11, q4 + vmov q10, q3 + asr r9, r8, #8 + vmov q9, q2 + add r9, r2, r9, lsl #1 + vmov q8, q1 + vext.16 q4, q3, q4, #7 + vext.16 q3, q2, q3, #7 + vext.16 q2, q1, q2, #7 + vext.16 q1, q0, q1, #7 +2: + vmul.u16 q12, q8, d1[1] + adds r12, r4 + vmla.u16 q12, q1, d1[0] + it cc + addcc r12, #32 << 16 + vmul.u16 q13, q9, d1[1] + it cc + subcc r12, #32 + vmla.u16 q13, q2, d1[0] + sub r5, #1 + vmul.u16 q14, q10, d1[1] + teq r5, #0 + vmla.u16 q14, q3, d1[0] + vmul.u16 q15, q11, d1[1] + vmla.u16 q15, q4, d1[0] + vmov s2, r12 + vrshr.u16 q12, q12, #5 + vrshr.u16 q13, q13, #5 + vrshr.u16 q14, q14, #5 + vrshr.u16 q15, q15, #5 + vst1.16 {q12-q13}, [r0], r3 + vst1.16 {q14-q15}, [r10], r3 + bhi 2b + bne 1b + + vpop {d8} + vmov d9, d0 + pop {r4-r11, pc} + +@ Right of vertical - works along top - left unused +26: + add r5, r1, #32 + vld1.16 {q1-q2}, [r1] + rsb r12, r6, r6, lsl #16 + vld1.16 {q3-q4}, [r5] + add r1, r1, #64 + rsb r4, r12, #0 + rsb r12, r12, #32 << 16 + vmov d1, d9 + vmov s1, r12 + add r10, r0, #32 + mov r5, #32 +1: + vld1.16 {d0[0]}, [r1]! + vmov q8, q1 + vmov q9, q2 + vmov q10, q3 + vmov q11, q4 + vext.16 q1, q1, q2, #1 + vext.16 q2, q2, q3, #1 + vext.16 q3, q3, q4, #1 + vext.16 q4, q4, q0, #1 +2: + vmul.u16 q12, q1, d0[2] + adds r12, r4 + vmla.u16 q12, q8, d0[3] + it cc + addcc r12, #32 << 16 + vmul.u16 q13, q2, d0[2] + it cc + subcc r12, #32 + vmla.u16 q13, q9, d0[3] + sub r5, #1 + vmul.u16 q14, q3, d0[2] + teq r5, #0 + vmla.u16 q14, q10, d0[3] + vmul.u16 q15, q4, d0[2] + vmla.u16 q15, q11, d0[3] + vmov s1, r12 + vrshr.u16 q12, q12, #5 + vrshr.u16 q13, q13, #5 + vrshr.u16 q14, q14, #5 + vrshr.u16 q15, q15, #5 + vst1.16 {q12-q13}, [r0], r3 + vst1.16 {q14-q15}, [r10], r3 + bhi 2b + bne 1b + + vpop {d8} + vmov d9, d1 + pop {r4-r11, pc} + +endfunc + + + +@ Generate 4x4 chroma patch +@ +@ In (const) +@ r1 Up ptr (_up only) +@ r3 Out stride +@ r4 Angle add +@ r7 Inv angle (_up only) +@ +@ In/Out (updated) +@ r0 Out pointer - on exit point to start of next patch horizontally (i.e. r0 + patch width) +@ r2 Left ptr - updated +@ r6 Angle frac (init to r4 + 32) +@ r8 Inv angle accumulator +@ q2 Cur Line - load before 1st call for down - set by _up +@ q8 Cur Line - load before 1st call for up - set by _down +@ +@ Temps +@ r5 Loop counter +@ r12 +@ d0, q1, q12-q15 + +patch_h_down_c_4x4_10: + vld1.16 {q12}, [r2]! + rsb r12, r6, #32 + vdup.16 q2, r6 + vdup.16 q3, r12 + mov r5, #4 +1: + vmov q13, q12 + vext.16 q12, q12, q12, #2 + vld1.32 {d25[1]}, [r2]! +patch_h_down_c_4x4_10_continue: +2: + vmov q8, q9 + subs r12, r4 + vmul.u16 q0, q13, q3 + it cc + addcc r12, #32 + vmla.u16 q0, q12, q2 + rsb r6, r12, #32 + vmov q9, q10 + sub r5, #1 + vmov q10, q11 + teq r5, #0 + vdup.16 q2, r6 + vdup.16 q3, r12 + vrshr.u16 q11, q0, #5 + bhi 2b + bne 1b + + bcs 3f + vmov q13, q12 + vext.16 q12, q12, q12, #2 + vld1.32 {d25[1]}, [r2]! +3: + +store_tran_c_4x4_10: +T add r6, r0, r3 + vzip.32 q8, q10 +A add r6, r0, r3 +T lsl r3, #1 + vzip.32 q9, q11 +A add r5, r0, r3, lsl #1 +T add r5, r0, r3 + vst2.32 {d16,d18}, [r0]! +A lsl r3, #1 + vst2.32 {d17,d19}, [r6], r3 + asr r3, #1 + vst2.32 {d20,d22}, [r5] + mov r5, #4 + vst2.32 {d21,d23}, [r6] + bx lr + +patch_h_up_c_4x4_10: + vld1.16 {q1}, [r2] + rsb r12, r6, #32 + vdup.16 q2, r6 + vdup.16 q3, r12 + mov r5, #4 +1: + adds r8, r7 + vmov q12, q1 + it mi + ldrmi r6, [r2, #-4]! + vext.16 q1, q1, q1, #6 + itt pl + asrpl r6, r8, #8 + ldrpl r6, [r1, r6, lsl #2] + vmov s4, r6 +patch_h_up_c_4x4_10_continue: +2: + vmov q8, q9 + subs r12, r4 + vmul.u16 q0, q12, q3 + it cc + addcc r12, #32 + vmla.u16 q0, q1, q2 + rsb r6, r12, #32 + vmov q9, q10 + sub r5, #1 + vmov q10, q11 + teq r5, #0 + vdup.16 q2, r6 + vdup.16 q3, r12 + vrshr.u16 q11, q0, #5 + bhi 2b + bne 1b + + bcs store_tran_c_4x4_10 + adds r8, r7 + vmov q12, q1 + it mi + ldrmi r6, [r2, #-4]! + vext.16 q1, q1, q1, #6 + itt pl + asrpl r6, r8, #8 + ldrpl r6, [r1, r6, lsl #2] + vmov s4, r6 + b store_tran_c_4x4_10 + + +@ ff_hevc_rpi_pred_angular_c_4_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride [r3] +@ unsigned int mode [sp, #0] 2..34 + +function ff_hevc_rpi_pred_angular_c_4_neon_10, export=1 + ldr r12, [sp] + push {r4-r8, lr} + ADRT r4, angle_2 - 2 + ADRT r7, inv_angle - 11*2 + add r7, r7, r12, lsl #1 + lsl r3, #2 + ldrsb r6, [r4, r12] + cmp r12, #26 + ldrsb r4, [r4, r12] + bge 26f + cmp r12, #18 + bge 18f + cmp r12, #10 + bge 10f + +@ Down of Horizontal - works down left + bl patch_h_down_c_4x4_10 + pop {r4-r8, pc} + +@ Up of Horizontal - works down up +10: + ldrh r7, [r7] + mov r8, #-128 + sub r8, r7 + bl patch_h_up_c_4x4_10 + pop {r4-r8, pc} + +@ Left of vertical - works down left +18: + vld1.16 {q9}, [r1] + sub r1, r2, #4 + rsb r12, r6, #32 + ldrh r7, [r7] + vdup.16 q2, r6 + vext.16 q8, q9, q9, #6 + sub r8, r7, #128 + vld1.32 {d16[0]}, [r1] + vdup.16 q3, r12 + mov r5, #3 +1: + vmul.u16 q0, q9, q3 + subs r12, r4 + vmla.u16 q0, q8, q2 + ittt cc + asrcc r1, r8, #8 + addcc r12, #32 + addcc r1, r2, r1, lsl #2 + vext.16 q10, q8, q8, #6 + rsb r6, r12, #32 + vmov q11, q8 + sub r5, #1 + vrshr.u16 q0, q0, #5 + it cc + addcc r8, r7 + vld1.32 {d20[0]}, [r1] + teq r5, #0 + vdup.16 q2, r6 + vdup.16 q3, r12 + vst1.16 {q0}, [r0], r3 + bhi 1b + beq 4f +2: + vmul.u16 q0, q11, q3 + subs r12, r4 + vmla.u16 q0, q10, q2 + ittt cc + asrcc r1, r8, #8 + addcc r12, #32 + addcc r1, r2, r1, lsl #2 + vext.16 q8, q10, q10, #6 + rsb r6, r12, #32 + vmov q9, q10 + sub r5, #1 + vrshr.u16 q0, q0, #5 + it cc + addcc r8, r7 + vld1.32 {d16[0]}, [r1] + teq r5, #0 + vdup.16 q2, r6 + vdup.16 q3, r12 + vst1.16 {q0}, [r0], r3 + bhi 2b + bne 1b + bcc 5f +3: + vmul.u16 q0, q11, q3 + vmla.u16 q0, q10, q2 + vrshr.u16 q0, q0, #5 + vst1.16 {q0}, [r0] + + pop {r4-r8, pc} +4: + bcc 3b +5: + vmul.u16 q0, q9, q3 + vmla.u16 q0, q8, q2 + vrshr.u16 q0, q0, #5 + vst1.16 {q0}, [r0] + + pop {r4-r8, pc} + +@ Right of vertical - works along top - left unused +26: + vld1.16 {q9}, [r1]! + rsb r12, r6, #32 + vdup.16 q2, r6 + vdup.16 q3, r12 + vext.16 q8, q9, q9, #2 + vld1.32 {d17[1]}, [r1]! + mov r5, #3 +1: + vmul.u16 q0, q8, q2 + subs r12, r4 + vmla.u16 q0, q9, q3 + it cc + addcc r12, #32 + vext.16 q10, q8, q8, #2 + rsb r6, r12, #32 + vld1.32 {d21[1]}, [r1] + sub r5, #1 + vmov q11, q8 + teq r5, #0 + vrshr.u16 q0, q0, #5 + it cc + addcc r1, #4 + vdup.16 q2, r6 + vdup.16 q3, r12 + vst1.16 {q0}, [r0], r3 + bhi 1b + beq 4f +2: + vmul.u16 q0, q10, q2 + subs r12, r4 + vmla.u16 q0, q11, q3 + it cc + addcc r12, #32 + vext.16 q8, q10, q10, #2 + rsb r6, r12, #32 + vld1.32 {d17[1]}, [r1] + sub r5, #1 + vmov q9, q10 + teq r5, #0 + vrshr.u16 q0, q0, #5 + it cc + addcc r1, #4 + vdup.16 q2, r6 + vdup.16 q3, r12 + vst1.16 {q0}, [r0], r3 + bhi 2b + bne 1b + bcc 5f +3: + vmul.u16 q0, q10, q2 + vmla.u16 q0, q11, q3 + vrshr.u16 q0, q0, #5 + vst1.16 {q0}, [r0] + + pop {r4-r8, pc} +4: + bcc 3b +5: + vmul.u16 q0, q8, q2 + vmla.u16 q0, q9, q3 + vrshr.u16 q0, q0, #5 + vst1.16 {q0}, [r0] + + pop {r4-r8, pc} + +endfunc + + +@ ff_hevc_rpi_pred_angular_c_8_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride [r3] +@ unsigned int mode [sp, #0] 2..34 + +function ff_hevc_rpi_pred_angular_c_8_neon_10, export=1 + ldr r12, [sp] + push {r4-r8, lr} + ADRT r4, angle_2 - 2 + ADRT r7, inv_angle - 11*2 + add r7, r7, r12, lsl #1 + lsl r3, #2 + ldrsb r6, [r4, r12] + cmp r12, #26 + ldrsb r4, [r4, r12] + bge 26f + cmp r12, #18 + bge 18f + cmp r12, #10 + bge 10f + +@ Down of Horizontal - works down left + mov r1, r2 @ save r2 - r1 unused by patch_down + + bl patch_h_down_c_4x4_10 + bl patch_h_down_c_4x4_10_continue + + add r2, r1, #4*4 @ restore r2, but 4 rows further down left + sub r0, #32 + mov r6, r4 + add r0, r0, r3, lsl #2 + + bl patch_h_down_c_4x4_10 + bl patch_h_down_c_4x4_10_continue + + pop {r4-r8, pc} + +@ Up of Horizontal - works down up +10: + ldrh r7, [r7] + mov r8, #-128 + sub r8, r7 + + push {r2, r8} + bl patch_h_up_c_4x4_10 + bl patch_h_up_c_4x4_10_continue + pop {r2, r8} + + sub r0, #32 + mov r6, r4 + add r2, #16 + sub r8, r8, r7, lsl #2 + add r0, r0, r3, lsl #2 + + bl patch_h_up_c_4x4_10 + bl patch_h_up_c_4x4_10_continue + + pop {r4-r8, pc} + +@ Left of vertical - works down left +18: + vld1.16 {q0-q1}, [r1] + sub r9, r2, #4 + rsb r12, r6, #32 + ldrh r7, [r7] + mov r8, #-128 + vdup.16 q9, r6 + vdup.16 q10, r12 + mov r5, #8 +1: + vld1.32 {d17[1]}, [r9] + add r8, r7 + vmov q2, q0 + vmov q3, q1 + asr r9, r8, #8 + vext.16 q1, q0, q1, #6 + add r9, r2, r9, lsl #2 + vext.16 q0, q8, q0, #6 +2: + vmul.u16 q11, q2, q10 + subs r12, r4 + vmla.u16 q11, q0, q9 + it cc + addcc r12, #32 + vmul.u16 q12, q3, q10 + rsb r6, r12, #32 + vmla.u16 q12, q1, q9 + sub r5, #1 + teq r5, #0 + vdup.16 q9, r6 + vdup.16 q10, r12 + vrshr.u16 q11, q11, #5 + vrshr.u16 q12, q12, #5 + vst1.16 {q11-q12}, [r0], r3 + bhi 2b + bne 1b + + pop {r4-r8, pc} + +@ Right of vertical - works along top - left unused +26: + add r5, r1, #32 + vld1.16 {q0-q1}, [r1]! + rsb r12, r6, #32 + vld1.32 {d16[0]}, [r5] + mov r5, #8 + vdup.16 q9, r6 + vdup.16 q10, r12 +1: + vmov q2, q0 + add r1, #4 + vmov q3, q1 + vext.16 q0, q0, q1, #2 + vext.16 q1, q1, q8, #2 +2: + vmul.u16 q11, q0, q9 + subs r12, r4 + vmla.u16 q11, q2, q10 + it cc + addcc r12, #32 + vmul.u16 q12, q1, q9 + rsb r6, r12, #32 + vmla.u16 q12, q3, q10 + sub r5, #1 + vld1.32 {d16[0]}, [r1] + teq r5, #0 + vdup.16 q9, r6 + vdup.16 q10, r12 + vrshr.u16 q11, q11, #5 + vrshr.u16 q12, q12, #5 + vst1.16 {q11-q12}, [r0], r3 + bhi 2b + bne 1b + + pop {r4-r8, pc} + +endfunc + + +@ ff_hevc_rpi_pred_angular_c_16_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride [r3] +@ unsigned int mode [sp, #0] 2..34 + +function ff_hevc_rpi_pred_angular_c_16_neon_10, export=1 + ldr r12, [sp] + push {r4-r10, lr} + ADRT r4, angle_2 - 2 + ADRT r7, inv_angle - 11*2 + add r7, r7, r12, lsl #1 + lsl r3, #2 + vpush {d8} + ldrsb r6, [r4, r12] + cmp r12, #26 + ldrsb r4, [r4, r12] + bge 26f + cmp r12, #18 + bge 18f + cmp r12, #10 + bge 10f + +@ Down of Horizontal - works down left + add sp, #8 + mov r10, #4 + mov r1, r2 +1: + bl patch_h_down_c_4x4_10 + bl patch_h_down_c_4x4_10_continue + bl patch_h_down_c_4x4_10_continue + bl patch_h_down_c_4x4_10_continue + + add r2, r1, #4*4 @ restore r2, but 4 rows further down left + add r1, r1, #4*4 + mov r6, r4 + sub r0, #64 + subs r10, #1 + add r0, r0, r3, lsl #2 + bne 1b + + pop {r4-r10, pc} + +@ Up of Horizontal - works down up +10: + add sp, #8 + mov r10, #4 + ldrh r7, [r7] + mov r8, #-128 + sub r8, r7 +2: + push {r2, r8} + bl patch_h_up_c_4x4_10 + bl patch_h_up_c_4x4_10_continue + bl patch_h_up_c_4x4_10_continue + bl patch_h_up_c_4x4_10_continue + pop {r2, r8} + + sub r0, #64 + mov r6, r4 + add r2, #16 + sub r8, r8, r7, lsl #2 + add r0, r0, r3, lsl #2 + subs r10, #1 + bne 2b + + pop {r4-r10, pc} + +@ Left of vertical - works down left +18: + add r5, r1, #32 + vld1.16 {q1-q2}, [r1] + rsb r12, r6, r6, lsl #16 + vld1.16 {q3-q4}, [r5] + sub r9, r2, #4 + rsb r4, r12, #0 + rsb r12, r12, #32 << 16 + ldrh r7, [r7] + mov r8, #-128 + vmov d0, d9 + vmov s2, r12 + add r10, r0, #32 + mov r5, #16 +1: + vld1.32 {d1[1]}, [r9] + add r8, r7 + vmov q11, q4 + vmov q10, q3 + asr r9, r8, #8 + vmov q9, q2 + add r9, r2, r9, lsl #2 + vmov q8, q1 + vext.16 q4, q3, q4, #6 + vext.16 q3, q2, q3, #6 + vext.16 q2, q1, q2, #6 + vext.16 q1, q0, q1, #6 +2: + vmul.u16 q12, q8, d1[1] + adds r12, r4 + vmla.u16 q12, q1, d1[0] + it cc + addcc r12, #32 << 16 + vmul.u16 q13, q9, d1[1] + it cc + subcc r12, #32 + vmla.u16 q13, q2, d1[0] + sub r5, #1 + vmul.u16 q14, q10, d1[1] + teq r5, #0 + vmla.u16 q14, q3, d1[0] + vmul.u16 q15, q11, d1[1] + vmla.u16 q15, q4, d1[0] + vmov s2, r12 + vrshr.u16 q12, q12, #5 + vrshr.u16 q13, q13, #5 + vrshr.u16 q14, q14, #5 + vrshr.u16 q15, q15, #5 + vst1.16 {q12-q13}, [r0], r3 + vst1.16 {q14-q15}, [r10], r3 + bhi 2b + bne 1b + + vpop {d8} + vmov d9, d0 + pop {r4-r10, pc} + +@ Right of vertical - works along top - left unused +26: + add r5, r1, #32 + vld1.16 {q1-q2}, [r1] + rsb r12, r6, r6, lsl #16 + vld1.16 {q3-q4}, [r5] + add r1, r1, #64 + rsb r4, r12, #0 + rsb r12, r12, #32 << 16 + vmov d1, d9 + vmov s1, r12 + add r10, r0, #32 + mov r5, #16 +1: + vld1.32 {d0[0]}, [r1]! + vmov q8, q1 + vmov q9, q2 + vmov q10, q3 + vmov q11, q4 + vext.16 q1, q1, q2, #2 + vext.16 q2, q2, q3, #2 + vext.16 q3, q3, q4, #2 + vext.16 q4, q4, q0, #2 +2: + vmul.u16 q12, q1, d0[2] + adds r12, r4 + vmla.u16 q12, q8, d0[3] + it cc + addcc r12, #32 << 16 + vmul.u16 q13, q2, d0[2] + it cc + subcc r12, #32 + vmla.u16 q13, q9, d0[3] + sub r5, #1 + vmul.u16 q14, q3, d0[2] + teq r5, #0 + vmla.u16 q14, q10, d0[3] + vmul.u16 q15, q4, d0[2] + vmla.u16 q15, q11, d0[3] + vmov s1, r12 + vrshr.u16 q12, q12, #5 + vrshr.u16 q13, q13, #5 + vrshr.u16 q14, q14, #5 + vrshr.u16 q15, q15, #5 + vst1.16 {q12-q13}, [r0], r3 + vst1.16 {q14-q15}, [r10], r3 + bhi 2b + bne 1b + + vpop {d8} + vmov d9, d1 + pop {r4-r10, pc} + +endfunc diff --git a/libavcodec/arm/rpi_hevcpred_intra_dc_neon.S b/libavcodec/arm/rpi_hevcpred_intra_dc_neon.S new file mode 100644 index 0000000000..df8c1c25b9 --- /dev/null +++ b/libavcodec/arm/rpi_hevcpred_intra_dc_neon.S @@ -0,0 +1,705 @@ +/* +Copyright (c) 2018 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox, Ben Avison +*/ + + +#include "libavutil/arm/asm.S" +#include "neon.S" + + +@ ff_hevc_rpi_pred_dc_4_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_dc_4_neon_8, export=1 + + @ Average the els of top & left + ldr r2, [r2] + vld1.32 {d0[0]}, [r1] + mov r1, #2 + vmov s1, r2 + vmov s2, r2 + vmov.i16 q2, #3 + add r2, r0, r3 + vaddl.u8 q1, d0, d1 @ d2[0] = top[0] + left[0] + lsl r3, #1 + vmovl.u8 q0, d0 + vmov.i64 d7, #0xffff + vmov.16 d4[0], r1 @ 2, 3, 3, 3... + vpadd.i16 d6, d2, d2 @ 2 (top & bottom of vector the same) + vbit d0, d2, d7 @ q0 = top[0]+left[0], top[1..3], left[0..3] + + @ top line gets some smoothing + @ (top[i] + 3*dc + 2) >> 2 + @ as does left + @ top_line[0] is extra special + @ (top[0] + left[0] + 2*dc + 2) >> 2 + + vmov.i64 d7, #0xff + vpadd.i16 d6, d6 @ 1 (all the same) + vrshr.u16 d6, #3 + vmla.i16 q0, q2, d6[0] + vdup.8 d6, d6[0] + vrshrn.i16 d0, q0, #2 + + @ Store top line + vst1.32 {d0[0]}, [r0], r3 + + @ Store the rest + vshr.u64 d1, d0, #5*8 + vshr.u64 d2, d0, #6*8 + vshr.u64 d3, d0, #7*8 + vbif d1, d6, d7 + vbif d2, d6, d7 + vst1.32 {d1[0]}, [r2], r3 + vbif d3, d6, d7 + vst1.32 {d2[0]}, [r0] + vst1.32 {d3[0]}, [r2] + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_dc_c_4_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_dc_c_4_neon_8, export=1 + + @ Average the els of top & left + vld1.8 {d0}, [r1] + vld1.8 {d1}, [r2] +A add r2, r0, r3, lsl #1 +A lsl r3, #2 +T lsl r3, #1 +T add r2, r0, r3 +T lsl r3, #1 + vaddl.u8 q0, d0, d1 + vadd.i16 d0, d1 @ d0 has 2 val pairs + vpadd.i32 d2, d0, d0 @ This adds U & V separately + vpadd.i32 d3, d0, d0 + vrshrn.u16 d0, q1, #3 + + @ Store + vst1.8 {d0}, [r0], r3 + vst1.8 {d0}, [r2], r3 + vst1.8 {d0}, [r0] + vst1.8 {d0}, [r2] + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_dc_8_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_dc_8_neon_8, export=1 + + @ Average the els of top & left + vld1.8 {d0}, [r1] + mov r1, #2 + vld1.8 {d16}, [r2] + vmov.i16 q2, #3 + vmov.i64 d7, #0xffff + vaddl.u8 q1, d0, d16 @ d2[0] = top[0] + left[0] + vmovl.u8 q0, d0 + vadd.i16 d6, d2, d3 @ d6 has 4 vals + vmov.16 d4[0], r1 @ 2, 3, 3, 3... + vbit d0, d2, d7 @ q0 = top[0]+left[0], top[1..7] + + @ top line gets some smoothing + @ (top[i] + 3*dc + 2) >> 2 + @ as does left + @ top_line[0] is extra special + @ (top[0] + left[0] + 2*dc + 2) >> 2 + + vmov.i64 d7, #0xff + vmovl.u8 q1, d16 + vpadd.i16 d6, d6 @ 2 (top & bottom of vector the same) + vpadd.i16 d6, d6 @ 1 (all the same) + vrshr.u16 d6, #4 + vmla.i16 q1, q2, d6[0] + vmla.i16 q0, q2, d6[0] + vdup.8 d6, d6[0] + vrshrn.i16 d2, q1, #2 + vrshrn.i16 d0, q0, #2 + + @ Store top line + vst1.8 {d0}, [r0], r3 + + @ Store the rest + vshr.u64 d2, #8 + vbit d6, d2, d7 + vshr.u64 d2, #8 + vst1.8 {d6}, [r0], r3 + mov r1, #6 +1: + vbit d6, d2, d7 + vshr.u64 d2, #8 + vst1.8 {d6}, [r0], r3 + subs r1, #2 + vbit d6, d2, d7 + vshr.u64 d2, #8 + vst1.8 {d6}, [r0], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_dc_c_8_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_dc_c_8_neon_8, export=1 + + @ Average the els of top & left + vld1.8 {q0}, [r1] + mov r1, #8 + vld1.8 {q1}, [r2] +T lsl r3, #1 + vaddl.u8 q0, d0, d1 +A add r2, r0, r3, lsl #1 +A lsl r3, #2 +T add r2, r0, r3 +T lsl r3, #1 + vaddl.u8 q1, d2, d3 + vadd.i16 q1, q0 + vadd.i16 d3, d2 @ d3 has 2 val pairs + vpadd.i32 d2, d3, d3 @ This add U & V separately + vpadd.i32 d3, d3, d3 + vrshrn.u16 d0, q1, #4 + vrshrn.u16 d1, q1, #4 + + @ Store +1: + vst1.8 {q0}, [r0], r3 + subs r1, #4 + vst1.8 {q0}, [r2], r3 + vst1.8 {q0}, [r0], r3 + vst1.8 {q0}, [r2], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_dc_16_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_dc_16_neon_8, export=1 + + @ Average the els of top & left + vld1.8 {q8}, [r1] + mov r1, #2 + vld1.8 {q9}, [r2] + vaddl.u8 q10, d16, d17 + vaddl.u8 q11, d16, d18 + vaddl.u8 q0, d18, d19 + vmov.i16 q1, #3 + vadd.i16 q10, q0 + vmovl.u8 q0, d18 + vadd.i16 d20, d21 + vmov.i16 d2[0], r1 @ 2, 3, 3, 3... + + @ top line gets some smoothing + @ (top[i] + 3*dc + 2) >> 2 + @ as does left + @ top_line[0] is extra special + @ (top[0] + left[0] + 2*dc + 2) >> 2 + + vmovl.u8 q2, d16 + vmovl.u8 q9, d19 + vpadd.i16 d20, d20 @ 2 (top & bottom of vector the same) + vmov.i64 d7, #0xffff + vmovl.u8 q8, d17 + vbit d4, d22, d7 @ q2 = top[0]+left[0], top[1..7] + vmov.i64 d7, #0xff + vpadd.i16 d20, d20 @ 1 (all the same) + vrshr.u16 d21, d20, #5 + vrshr.u16 d20, d20, #5 + vmla.i16 q0, q10, d2[1] + vmla.i16 q9, q10, d2[1] + vmla.i16 q2, q10, q1 + vmla.i16 q8, q10, d2[1] + vdup.8 q1, d20[0] + vrshrn.i16 d0, q0, #2 + vrshrn.i16 d1, q9, #2 + vrshrn.i16 d4, q2, #2 + vrshrn.i16 d5, q8, #2 + vext.8 q0, q0, q0, #1 + + @ Store top line + vst1.8 {q2}, [r0], r3 + + @ Store the rest + mov r1, #15 +1: + vbit d2, d0, d7 + vext.8 q0, q0, q0, #1 + subs r1, #1 + vst1.8 {q1}, [r0], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_dc_c_16_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_dc_c_16_neon_8, export=1 + + @ Average the els of top & left + vld1.8 {q0-q1}, [r1] + mov r1, #16 + vld1.8 {q2-q3}, [r2] +T lsl r3, #1 + vaddl.u8 q0, d0, d1 +A add r2, r0, r3, lsl #1 +T add r2, r0, r3 + vaddl.u8 q1, d2, d3 +A lsl r3, #2 +T lsl r3, #1 + vaddl.u8 q2, d4, d5 + vaddl.u8 q3, d6, d7 + vadd.i16 q0, q1 + vadd.i16 q2, q3 + vadd.i16 q0, q2 + vadd.i16 d0, d1 @ d0 has 2 val pairs + vpadd.i32 d4, d0, d0 @ This adds U & V separately + vpadd.i32 d5, d0, d0 + vrshrn.u16 d0, q2, #5 + vrshrn.u16 d1, q2, #5 + vrshrn.u16 d2, q2, #5 + vrshrn.u16 d3, q2, #5 + + @ Store +1: + vst1.8 {q0-q1}, [r0], r3 + subs r1, #2 + vst1.8 {q0-q1}, [r2], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_dc_32_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_dc_32_neon_8, export=1 + + @ Average the els of top & left + vld1.8 {q0-q1}, [r1] + mov r1, #32 + vld1.8 {q2-q3}, [r2] + add r2, r0, r3 + vaddl.u8 q0, d0, d1 + lsl r3, #1 + vaddl.u8 q1, d2, d3 + vaddl.u8 q2, d4, d5 + vaddl.u8 q3, d6, d7 + vadd.i16 q0, q1 + vadd.i16 q2, q3 + vadd.i16 q0, q2 + vadd.i16 d0, d1 @ d0 has 4 vals + vpadd.i16 d0, d0 @ 2 (top & bottom the same) + vpadd.i16 d4, d0, d0 @ 1 (all the same) + vpadd.i16 d5, d0, d0 + vrshrn.u16 d0, q2, #6 + vrshrn.u16 d1, q2, #6 + vrshrn.u16 d2, q2, #6 + vrshrn.u16 d3, q2, #6 + + @ Store +1: + vst1.8 {q0-q1}, [r0], r3 + subs r1, #2 + vst1.8 {q0-q1}, [r2], r3 + bne 1b + + bx lr +endfunc + + +@ ----------------------------------------------------------------------------- +@ +@ 10 Bit versions +@ +@ There is no actual bit depth dependency in this code except that our +@ intermediate results will overflow the 16 bits they are stored in +@ All there functions are good to 10 bits - with the worst case being +@ in dc_32 where we use all 16 bits. + + +@ ff_hevc_rpi_pred_dc_4_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_dc_4_neon_10, export=1 + + @ Average the els of top & left + vld1.16 {d0}, [r1] + mov r1, #2 + vld1.16 {d1}, [r2] +T lsl r3, #1 + vmov.i16 q2, #3 +A add r2, r0, r3, lsl #1 +T add r2, r0, r3 + vadd.u16 d2, d0, d1 @ d2[0] = top[0] + left[0] +A lsl r3, #2 +T lsl r3, #1 + vmov.16 d4[0], r1 @ 2, 3, 3, 3... + vmov.i64 d7, #0xffff + vbit d0, d2, d7 @ q0 = top[0]+left[0], top[1..3], left[0..3] + + @ top line gets some smoothing + @ (top[i] + 3*dc + 2) >> 2 + @ as does left + @ top_line[0] is extra special + @ (top[0] + left[0] + 2*dc + 2) >> 2 + + vpadd.i16 d6, d2, d2 @ 2 (top & bottom of vector the same) + vpadd.i16 d6, d6 @ 1 (all the same) + vrshr.u16 d6, #3 + vmla.i16 q0, q2, d6[0] + vrshr.u16 q0, #2 + + @ Store top line + vst1.16 {d0}, [r0], r3 + + @ Store the rest + vshr.u64 d3, d1, #1*16 + vshr.u64 d4, d1, #2*16 + vshr.u64 d5, d1, #3*16 + vbif d3, d6, d7 + vbif d4, d6, d7 + vst1.16 {d3}, [r2], r3 + vbif d5, d6, d7 + vst1.16 {d4}, [r0] + vst1.16 {d5}, [r2] + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_dc_c_4_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] (In pels - needs * 4) + +function ff_hevc_rpi_pred_dc_c_4_neon_10, export=1 + + @ Average the els of top & left + vld1.8 {q0}, [r1] + vld1.8 {q1}, [r2] +A add r2, r0, r3, lsl #2 +A lsl r3, #3 +T lsl r3, #2 +T add r2, r0, r3 +T lsl r3, #1 + vadd.i16 q0, q1 + vadd.i16 d0, d1 @ d0 has 2 val pairs + vpadd.i32 d2, d0, d0 @ This adds U & V separately + vpadd.i32 d3, d0, d0 + vrshr.u16 q0, q1, #3 + + vst1.16 {q0}, [r0], r3 + vst1.16 {q0}, [r2], r3 + vst1.16 {q0}, [r0] + vst1.16 {q0}, [r2] + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_dc_8_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_dc_8_neon_10, export=1 + + @ Average the els of top & left + vld1.16 {q0}, [r1] + mov r1, #2 + vld1.16 {q8}, [r2] +T lsl r3, #1 + vmov.i16 q2, #3 +A add r2, r0, r3, lsl #1 +T add r2, r0, r3 + vadd.i16 q1, q0, q8 @ q1[0] = top[0] + left[0] +A lsl r3, #2 +T lsl r3, #1 + vmov.i64 d7, #0xffff + vmov.16 d4[0], r1 @ 2, 3, 3, 3... + vadd.i16 d6, d2, d3 @ d6 has 4 vals + vbit d0, d2, d7 @ q0 = top[0]+left[0], top[1..7] + + @ top line gets some smoothing + @ (top[i] + 3*dc + 2) >> 2 + @ as does left + @ top_line[0] is extra special + @ (top[0] + left[0] + 2*dc + 2) >> 2 + + vpadd.i16 d6, d6 @ 2 (top & bottom of vector the same) + vpadd.i16 d6, d6 @ 1 (all the same) + vrshr.u16 d6, #4 + vmla.i16 q8, q2, d6[0] + vmla.i16 q0, q2, d6[0] + vdup.16 q2, d6[0] + vdup.16 q9, d6[0] + vrshr.u16 q8, q8, #2 + vrshr.u16 q0, q0, #2 + vext.16 q1, q8, q8, #1 + + @ Store top line + vst1.16 {q0}, [r0], r3 + + @ Store the rest + vbit d18, d2, d7 + vst1.16 {q9}, [r2], r3 + mov r1, #6 +1: + vext.16 q8, q8, q8, #2 + subs r1, #2 + vext.16 q1, q1, q1, #2 + vbit d4, d16, d7 + vst1.16 {q2}, [r0], r3 + vbit d18, d2, d7 + vst1.16 {q9}, [r2], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_dc_c_8_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] (In pels - needs * 4) + +function ff_hevc_rpi_pred_dc_c_8_neon_10, export=1 + + @ Average the els of top & left + vld1.16 {q0-q1}, [r1] + mov r1, #8 + vld1.16 {q2-q3}, [r2] +T lsl r3, #2 + vadd.i16 q1, q0 +A add r2, r0, r3, lsl #2 +A lsl r3, #3 +T add r2, r0, r3 +T lsl r3, #1 + vadd.i16 q2, q3 + vadd.i16 q1, q2 + vadd.i16 d3, d2 @ d3 has 2 val pairs + vpadd.i32 d2, d3, d3 @ This add U & V separately + vpadd.i32 d3, d3, d3 + vrshr.u16 q0, q1, #4 + vrshr.u16 q1, q1, #4 + + @ Store +1: + vst1.8 {q0-q1}, [r0], r3 + subs r1, #2 + vst1.8 {q0-q1}, [r2], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_dc_16_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_dc_16_neon_10, export=1 + + @ Average the els of top & left + vld1.16 {q8-q9}, [r1] + mov r1, #2 + vld1.16 {q10-q11}, [r2] + lsl r3, #1 @ stride given in pels + vadd.i16 q0, q8, q9 + vadd.i16 q1, q10, q11 + vmov.i16 q3, #3 + vadd.i16 q1, q0 + vadd.i16 d0, d16, d20 + vmov.i64 d31, #0xffff + vadd.i16 d3, d2 + vmov.16 d6[0], r1 @ 2, 3, 3, 3... + + @ top line gets some smoothing + @ (top[i] + 3*dc + 2) >> 2 + @ as does left + @ topline[0] is extra special + @ (top[0] + left[0] + 2*dc + 2) >> 2 + + vbit d16, d0, d31 @ q8 = top[0]+left[0], top[1..7] + vpadd.i16 d3, d3 @ 2 (top & bottom of vector the same) + vpadd.i16 d3, d3 @ 1 (all the same) + vrshr.u16 d2, d3, #5 + vrshr.u16 d3, d3, #5 + vmov q0, q1 + vmla.i16 q10, q1, d6[1] + vmla.i16 q11, q1, d6[1] + vmla.i16 q8, q1, q3 + vmla.i16 q9, q1, d6[1] + vrshr.u16 q2, q10, #2 + vrshr.u16 q3, q11, #2 + vrshr.u16 q8, #2 + vrshr.u16 q9, #2 + vext.16 q2, q2, q2, #1 + mov r1, #7<<29 + + @ Store top line + vst1.16 {q8-q9}, [r0], r3 + + @ Store the rest +1: + vbit d0, d4, d31 + vext.16 q2, q2, q2, #1 + subs r1, #1<<29 + vst1.16 {q0-q1}, [r0], r3 + bne 1b +1: + vbit d0, d6, d31 + vext.16 q3, q3, q3, #1 + subs r1, #1<<29 + vst1.16 {q0-q1}, [r0], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_dc_c_16_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] (In pels - needs * 4) + +function ff_hevc_rpi_pred_dc_c_16_neon_10, export=1 + + @ Average the els of top & left + vldm r1, {q0-q3} + vldm r2, {q8-q11} + vadd.i16 q0, q1 + mov r1, #16 + vadd.i16 q2, q3 + add r2, r0, #32 + vadd.i16 q8, q9 + lsl r3, #2 + vadd.i16 q10, q11 + vadd.u16 q0, q2 + vadd.u16 q8, q10 + vadd.i16 q0, q8 + vadd.i16 d0, d1 @ d0 has 2 val pairs + vpadd.i32 d4, d0, d0 @ This adds U & V separately + vpadd.i32 d5, d0, d0 + vrshr.u16 q0, q2, #5 + vrshr.u16 q1, q2, #5 + + @ Store +1: + vst1.16 {q0-q1}, [r0], r3 + subs r1, #1 + vst1.16 {q0-q1}, [r2], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_dc_32_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] (In pels) + +function ff_hevc_rpi_pred_dc_32_neon_10, export=1 + + @ Average the els of top & left + @ With 10 bits we are (just) safe from overflow in i16 + vldm r1, {q0-q3} + vldm r2, {q8-q11} + vadd.i16 q0, q1 + mov r1, #32 + vadd.i16 q2, q3 + add r2, r0, #32 + vadd.i16 q8, q9 + lsl r3, #1 + vadd.i16 q10, q11 + vadd.u16 q0, q2 + vadd.u16 q8, q10 + vadd.i16 q0, q8 + vadd.i16 d0, d1 @ d0 has 4 vals + vpadd.i16 d0, d0 @ 2 (top & bottom the same) + vpadd.i16 d4, d0, d0 @ 1 (all the same) + vpadd.i16 d5, d0, d0 + vrshr.u16 q0, q2, #6 + vrshr.u16 q1, q2, #6 + + @ Store +1: + vst1.16 {q0-q1}, [r0], r3 + subs r1, #1 + vst1.16 {q0-q1}, [r2], r3 + bne 1b + + bx lr +endfunc + + diff --git a/libavcodec/arm/rpi_hevcpred_intra_filter_neon.S b/libavcodec/arm/rpi_hevcpred_intra_filter_neon.S new file mode 100644 index 0000000000..f6969d3591 --- /dev/null +++ b/libavcodec/arm/rpi_hevcpred_intra_filter_neon.S @@ -0,0 +1,881 @@ +/* +Copyright (c) 2018 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox, Ben Avison +*/ + +#include "libavutil/arm/asm.S" +#include "neon.S" + +@ All functions have the call +@ +@ int ff_hevc_rpi_intra_filter_N_neon_PW( +@ pixel * const left, [r0] +@ pixel * const top, [r1] +@ const unsigned int req, [r2] +@ const unsigned int avail, [r3] +@ const pixel * const src_l, [sp, #0] +@ const pixel * const src_u, [sp, #4] +@ const pixel * const src_ur, [sp, #8] +@ const unsigned int stride, [sp, #12] (pels) +@ const unsigned int top_right_size, [sp, #16] +@ const unsigned int down_left_size) [sp, #20] +@ +@ Assumptions: +@ (that wouldn't apply to all frame layoouts but do apply to sand, so beware +@ if reuseing this code) +@ +@ Min ctb size is 8 so we don't need to worry about tr_size or dl_size for +@ N==4, but do for chroma N>=8. As we share Y/C fns that means we can ignore +@ N==8,PW=8 (chroma always PW>8) but have to cope for larger +@ +@ We always have at least 64 pixel H frame width rounding - this lets us +@ load UR widthout having to worry about exactly how many pixels are actually +@ within the frame. As partial loads will only occur very occasionally this +@ should be a win in nearly all cases. +@ +@ 16 bit fns can be used as 8 bit chroma fns as chroma never filters +@ so we do no maths on the contents +@ +@ No filtering in 32bit fns as they are chroma only + + +.equ AVAIL_UR, 1 +.equ AVAIL_U, 2 +.equ AVAIL_UL, 4 +.equ AVAIL_L, 8 +.equ AVAIL_DL, 16 + +.equ FILTER_LIGHT, 0x40 +.equ FILTER_STRONG, 0x80 + +.equ AVAIL_S_UR_N_U_C, 32 - 1 +.equ AVAIL_S_U_N_UL_C, 32 - 2 +.equ AVAIL_S_UL_N_L_C, 32 - 3 +.equ AVAIL_S_L_N_DL_C, 32 - 4 + +.equ AVAIL_S_U_DL_CPSR, 31 - 4 @ Shift for u..dl to go into flags via cpsr + +@ On entry +@ r2 req +@ r3 avail +@ [sp, #sp_offset...] args +@ +@ On Exit: +@ +@ Extend values: +@ d_l scalar contains value for L & DL +@ if DL avail then this is is DL[0] so we don't need to load that +@ d_ul scalar containing value for UL +@ d_u scalar containing value for U +@ d_ur scalar containing value for UR +@ If DL avail then d_l == b_dl elif L avail then d_l == a_l else... +@ This means that L-light-filter works even if nreq DL (we never filter +@ req-DL without req-L, but we do filter req-L without req-DL) +@ If UR avail then d_ur == a_ur so U-filter good too +@ +@ Data load pointers (only load if req & avail): +@ r4 DL + stride +@ r10 L +@ r6 U +@ r5 UR +@ +@ Others: +@ r2 req +@ r7 req & avail +@ r3 L + stride +@ r8 DL + stride * 2 +@ r9 stride * 2 +@ cs Load U +@ mi Load UR +@ +@ Clobbered: +@ r12 + +.macro load_pointers pw_s, log2_s, sp_offset, d_type, d_l, d_ul, d_u, d_ur + +.equ src_l\@, \sp_offset + 0 +.equ src_u\@, \sp_offset + 4 +.equ src_ur\@, \sp_offset + 8 +.equ stride\@, \sp_offset + 12 +.equ pw\@, (1 << \pw_s) @ pel width in bytes +.equ b_size\@, (1 << (\pw_s + \log2_s)) @ size in bytes + +@ r9 stride +@ r7 = ab_ul, r6 = a_u, r5 = a_ur +@ r4 = b_dl, r10 = b_l, r8 = b_u + + ldr r5, [sp, #src_ur\@] + lsl r12, r3, #AVAIL_S_U_DL_CPSR + ldr r10, [sp, #src_l\@] + ldr r9, [sp, #stride\@] + ldr r6, [sp, #src_u\@] + + @ This is quite a slow instruction but it replaces + @ a decent number of tests that yield a max of 2 flags/op + @ It is annoying we can't branch on Q! + @ If L navail (ne) then DL must be navail (pl) + msr APSR_nzcvq, r12 @ n=dl, z=l, c=ul, v=u, q=ur + + mov r4, r5 + sub r7, r10, r9 + it vs + movvs r4, r6 + add r8, r6, #b_size\@ - pw\@ + it cs + movcs r4, r7 + ite ne + movne r10, r4 + addeq r4, r7, r9, lsl #\log2_s + it cc + movcc r7, r10 + it mi + addmi r4, r10, r9, lsl #\log2_s + vld1.\d_type {\d_ul}, [r7] + itt vc + movvc r8, r7 + movvc r6, r7 + vld1.\d_type {\d_l }, [r4], r9 + tst r3, #AVAIL_UR + vld1.\d_type {\d_u }, [r6] + it eq + moveq r5, r8 + and r7, r2, r3 + add r8, r4, r9 + vld1.\d_type {\d_ur}, [r5] + lsls r12, r7, #AVAIL_S_UR_N_U_C + add r3, r10, r9 + lsl r9, #1 +.endm + + + +@ int ff_hevc_rpi_intra_filter_4_neon_8( +@ pixel * const left, [r0] +@ pixel * const top, [r1] +@ const unsigned int req, [r2] +@ const unsigned int avail, [r3] +@ const pixel * const src_l, [sp, #0] +@ const pixel * const src_u, [sp, #4] +@ const pixel * const src_ur, [sp, #8] +@ const unsigned int stride, [sp, #12] (pels) +@ const unsigned int top_right_size, [sp, #16] +@ const unsigned int down_left_size) [sp, #20] + +.set sp_base, 8*4 +.set pw_s, 0 +.set pw, (1 << pw_s) +.set log2_s, 2 + +function ff_hevc_rpi_intra_filter_4_neon_8, export=1 + push {r4-r10, lr} + load_pointers pw_s, log2_s, sp_base, 8, d0[], d31[7], d1[], d2[] + + it cs + vldrcs s2, [r6] + ite pl + vmovpl s3, s4 + vldrmi s3, [r5] + + lsls r7, #AVAIL_S_L_N_DL_C + add r12, r0, #-pw + bpl 1f + + vld1.8 {d0[0]}, [r10], r9 + vld1.8 {d0[1]}, [r3], r9 + vld1.8 {d0[2]}, [r10] + vld1.8 {d0[3]}, [r3] +1: + bcc 1f + vld1.8 {d0[5]}, [r4], r9 + vld1.8 {d0[6]}, [r8] + vld1.8 {d0[7]}, [r4] +1: + vstr d1, [r1] @ Up + vst1.8 {d31[7]}, [r12] + vstr d0, [r0] @ Left + pop {r4-r10, pc} +endfunc + + +@ int ff_hevc_rpi_intra_filter_4_neon_16( +@ pixel * const left, [r0] +@ pixel * const top, [r1] +@ const unsigned int req, [r2] +@ const unsigned int avail, [r3] +@ const pixel * const src_l, [sp, #0] +@ const pixel * const src_u, [sp, #4] +@ const pixel * const src_ur, [sp, #8] +@ const unsigned int stride, [sp, #12] (pels) +@ const unsigned int top_right_size, [sp, #16] +@ const unsigned int down_left_size) [sp, #20] + +.set sp_base, 8*4 +.set pw_s, 1 +.set pw, (1 << pw_s) +.set log2_s, 2 + +function ff_hevc_rpi_intra_filter_4_neon_16, export=1 + push {r4-r10, lr} + load_pointers pw_s, log2_s, sp_base, 16, "d0[],d1[]", d31[3], d2[], d3[] + + it cs + vldrcs d2, [r6] + it mi + vldrmi d3, [r5] + lsls r7, #AVAIL_S_L_N_DL_C + add r12, r0, #-pw + bpl 1f + vld1.16 {d0[0]}, [r10], r9 + vld1.16 {d0[1]}, [r3], r9 + vld1.16 {d0[2]}, [r10] + vld1.16 {d0[3]}, [r3] +1: + bcc 1f + vld1.16 {d1[1]}, [r4], r9 + vld1.16 {d1[2]}, [r8] + vld1.16 {d1[3]}, [r4] +1: + vst1.16 {q1}, [r1] @ Up + vst1.16 {d31[3]}, [r12] + vst1.16 {q0}, [r0] @ Left + pop {r4-r10, pc} +endfunc + + +@ int ff_hevc_rpi_intra_filter_8_neon_8( +@ pixel * const left, [r0] +@ pixel * const top, [r1] +@ const unsigned int req, [r2] +@ const unsigned int avail, [r3] +@ const pixel * const src_l, [sp, #0] +@ const pixel * const src_u, [sp, #4] +@ const pixel * const src_ur, [sp, #8] +@ const unsigned int stride, [sp, #12] (pels) +@ const unsigned int top_right_size, [sp, #16] +@ const unsigned int down_left_size) [sp, #20] + +.set sp_base, 8*4 +.set pw_s, 0 +.set pw, (1 << pw_s) +.set log2_s, 3 + +function ff_hevc_rpi_intra_filter_8_neon_8, export=1 + push {r4-r10, lr} + load_pointers pw_s, log2_s, sp_base, 8, "d0[],d1[]", d31[7], d4[], d5[] + + it cs + vldrcs d4, [r6] + it mi + vldrmi d5, [r5] + + lsls r7, #AVAIL_S_L_N_DL_C + bpl 1f + vld1.8 {d0[0]}, [r10], r9 + vld1.8 {d0[1]}, [r3], r9 + vld1.8 {d0[2]}, [r10], r9 + vld1.8 {d0[3]}, [r3], r9 + vld1.8 {d0[4]}, [r10], r9 + vld1.8 {d0[5]}, [r3], r9 + vld1.8 {d0[6]}, [r10] + vld1.8 {d0[7]}, [r3] +1: + bcc 1f + vld1.8 {d1[1]}, [r4], r9 + vld1.8 {d1[2]}, [r8], r9 + vld1.8 {d1[3]}, [r4], r9 + vld1.8 {d1[4]}, [r8], r9 + vld1.8 {d1[5]}, [r4], r9 + vld1.8 {d1[6]}, [r8] + vld1.8 {d1[7]}, [r4] +1: + tst r2, #FILTER_LIGHT + add r12, r0, #-pw + beq 10f + + @ Luma light filter + vext.8 q8, q15, q2, #15 + vext.8 q12, q15, q0, #15 + vaddl.u8 q9, d17, d5 + vaddl.u8 q8, d16, d4 + vaddl.u8 q13, d25, d1 + vaddl.u8 q12, d24, d0 + vmov.u8 r3, d5[7] @ Save final pel + vmov.u8 r2, d1[7] @ Save final pel + + vext.16 q2, q8, q9, #1 + vext.16 q3, q9, q9, #1 + vext.16 q0, q12, q13, #1 + vext.16 q1, q13, q13, #1 + vadd.u16 d30, d16, d24 @ d30[0] = l[0] + 2ul + u[0] + vadd.u16 q2, q8 + vadd.u16 q3, q9 + vadd.u16 q0, q12 + vadd.u16 q1, q13 + + vrshrn.u16 d4, q2, #2 + vrshrn.u16 d5, q3, #2 + vrshrn.u16 d0, q0, #2 + vrshrn.u16 d1, q1, #2 + vrshr.u16 d30, #2 + vmov.u8 d5[7], r3 @ Restore final pel + vmov.u8 d1[7], r2 @ Restore final pel + vdup.u8 d31, d30[0] @ d31[3] = d30[0] + +10: + vst1.8 {q2 }, [r1] @ Up + vst1.8 {d31[7]}, [r12] @ Up-left + vst1.8 {q0 }, [r0] @ Left + pop {r4-r10, pc} +endfunc + + +@ int ff_hevc_rpi_intra_filter_8_neon_16( +@ pixel * const left, [r0] +@ pixel * const top, [r1] +@ const unsigned int req, [r2] +@ const unsigned int avail, [r3] +@ const pixel * const src_l, [sp, #0] +@ const pixel * const src_u, [sp, #4] +@ const pixel * const src_ur, [sp, #8] +@ const unsigned int stride, [sp, #12] (pels) +@ const unsigned int top_right_size, [sp, #16] +@ const unsigned int down_left_size) [sp, #20] + +.set sp_base, 8*4 +.set ur_size, sp_base + 16 +.set dl_size, sp_base + 20 +.set pw_s, 1 +.set pw, (1 << pw_s) +.set log2_s, 3 +.set p_size, (1 << log2_s) @ size in pels + +function ff_hevc_rpi_intra_filter_8_neon_16, export=1 + push {r4-r10, lr} + load_pointers pw_s, log2_s, sp_base, 16, "d0[],d1[]", d31[3], "d4[],d5[]", "d6[],d7[]" + + it cs + vldmcs r6, {d4, d5} + ldr r12, [sp, #ur_size] + bpl 1f + cmp r12, #4 + vldm r5, {d6, d7} + bgt 1f + vdup.16 d7, d6[3] +1: + lsls r12, r7, #AVAIL_S_L_N_DL_C + vdup.16 q1, d0[0] + bpl 1f + vld1.16 {d0[0]}, [r10], r9 + vld1.16 {d0[1]}, [r3], r9 + vld1.16 {d0[2]}, [r10], r9 + vld1.16 {d0[3]}, [r3], r9 + vld1.16 {d1[0]}, [r10], r9 + vld1.16 {d1[1]}, [r3], r9 + vld1.16 {d1[2]}, [r10] + vld1.16 {d1[3]}, [r3] +1: + bcc 1f + ldr r12, [sp, #dl_size] + vld1.16 {d2[1]}, [r4], r9 + cmp r12, #p_size + vld1.16 {d2[2]}, [r8], r9 + vld1.16 {d2[3]}, [r4], r9 + blt 2f + vld1.16 {d3[0]}, [r8], r9 + vld1.16 {d3[1]}, [r4], r9 + vld1.16 {d3[2]}, [r8] + vld1.16 {d3[3]}, [r4] + b 1f +2: + vdup.16 d3, d2[3] +1: + tst r2, #FILTER_LIGHT + add r12, r0, #-pw + beq 10f + + @ Luma light filter + vext.16 q9, q2, q3, #7 + vext.16 q8, q15, q2, #7 + vext.16 q13, q0, q1, #7 + vext.16 q12, q15, q0, #7 + vadd.u16 q9, q3 + vadd.u16 q8, q2 + vadd.u16 q13, q1 + vadd.u16 q12, q0 + vmov.u16 r3, d7[3] @ Save final pel + vmov.u16 r2, d3[3] @ Save final pel + + vext.16 q2, q8, q9, #1 + vext.16 q3, q9, q9, #1 + vext.16 q0, q12, q13, #1 + vext.16 q1, q13, q13, #1 + vadd.u16 d30, d16, d24 @ d30[0] = l[0] + 2ul + u[0] + vadd.u16 q2, q8 + vadd.u16 q3, q9 + vadd.u16 q0, q12 + vadd.u16 q1, q13 + + vrshr.u16 q2, #2 + vrshr.u16 q3, #2 + vrshr.u16 q0, #2 + vrshr.u16 q1, #2 + vrshr.u16 d30, #2 + vmov.u16 d7[3], r3 @ Restore final pel + vmov.u16 d3[3], r2 @ Restore final pel + vdup.u16 d31, d30[0] @ d31[3] = d30[0] + +10: + vst1.16 {q2, q3}, [r1] @ Up + vst1.16 {d31[3]}, [r12] @ Up-left + vst1.16 {q0, q1}, [r0] @ Left + pop {r4-r10, pc} +endfunc + +@ int ff_hevc_rpi_intra_filter_16_neon_16( +@ pixel * const left, [r0] +@ pixel * const top, [r1] +@ const unsigned int req, [r2] +@ const unsigned int avail, [r3] +@ const pixel * const src_l, [sp, #0] +@ const pixel * const src_u, [sp, #4] +@ const pixel * const src_ur, [sp, #8] +@ const unsigned int stride, [sp, #12] (pels) +@ const unsigned int top_right_size, [sp, #16] +@ const unsigned int down_left_size) [sp, #20] + +.set sp_base, 8*4 +.set ur_size, sp_base + 16 +.set dl_size, sp_base + 20 +.set pw_s, 1 +.set pw, (1 << pw_s) +.set log2_s, 4 +.set p_size, (1 << log2_s) @ size in pels + +function ff_hevc_rpi_intra_filter_16_neon_16, export=1 + push {r4-r10, lr} + load_pointers pw_s, log2_s, sp_base, 16, "d0[],d1[]", d31[3], "d16[],d17[]", "d20[],d21[]" + + vdup.16 q9, d16[0] + vdup.16 q11, d20[0] + + it cs + vldmcs r6, {d16-d19} + ldr r12, [sp, #ur_size] + bpl 1f + cmp r12, #12 + @ Given chroma frame layout, if UR exists then it is always legit to + @ load all of it even if most of it is outside the frame. + vldm r5, {d20-d23} + bgt 1f + bge 4f + cmp r12, #8 + bge 3f + vdup.16 d21, d20[3] +3: vdup.16 d22, d21[3] +4: vdup.16 d23, d22[3] + +1: + lsls r7, #AVAIL_S_L_N_DL_C + ldr r12, [sp, #dl_size] + vdup.16 q1, d0[0] + vdup.16 q2, d0[0] + vdup.16 q3, d0[0] + bpl 1f + vld1.16 {d0[0]}, [r10], r9 + vld1.16 {d0[1]}, [r3], r9 + vld1.16 {d0[2]}, [r10], r9 + vld1.16 {d0[3]}, [r3], r9 + vld1.16 {d1[0]}, [r10], r9 + vld1.16 {d1[1]}, [r3], r9 + vld1.16 {d1[2]}, [r10], r9 + vld1.16 {d1[3]}, [r3], r9 + vld1.16 {d2[0]}, [r10], r9 + vld1.16 {d2[1]}, [r3], r9 + vld1.16 {d2[2]}, [r10], r9 + vld1.16 {d2[3]}, [r3], r9 + vld1.16 {d3[0]}, [r10], r9 + vld1.16 {d3[1]}, [r3], r9 + vld1.16 {d3[2]}, [r10] + vld1.16 {d3[3]}, [r3] +1: + bcc 1f + vld1.16 {d4[1]}, [r4], r9 + cmp r12, #4 + vld1.16 {d4[2]}, [r8], r9 + vld1.16 {d4[3]}, [r4], r9 + ble 2f + vld1.16 {d5[0]}, [r8], r9 + vld1.16 {d5[1]}, [r4], r9 + cmp r12, #12 + vld1.16 {d5[2]}, [r8], r9 + vld1.16 {d5[3]}, [r4], r9 + blt 3f + vld1.16 {d6[0]}, [r8], r9 + vld1.16 {d6[1]}, [r4], r9 + vld1.16 {d6[2]}, [r8], r9 + vld1.16 {d6[3]}, [r4], r9 + ble 4f + vld1.16 {d7[0]}, [r8], r9 + vld1.16 {d7[1]}, [r4], r9 + vld1.16 {d7[2]}, [r8] + vld1.16 {d7[3]}, [r4] + b 1f +2: vdup.16 d5, d4[3] +3: vdup.16 d6, d5[3] +4: vdup.16 d7, d6[3] +1: + tst r2, #FILTER_LIGHT + add r12, r0, #-pw + beq 10f + + vpush {q5} + @ Luma light filter + @ Left + vext.16 q5, q2, q3, #7 + vext.16 q14, q1, q2, #7 + vext.16 q13, q0, q1, #7 + vext.16 q12, q15, q0, #7 + + vadd.u16 q5, q3 + vadd.u16 q14, q2 + vadd.u16 q13, q1 + vadd.u16 q12, q0 + vmov.u16 r2, d7[3] @ Save final pel + + vext.16 q0, q12, q13, #1 + vext.16 q1, q13, q14, #1 + vext.16 q2, q14, q5, #1 + vext.16 q3, q5, q5, #1 + + vmov d30, d24 @ d30[0] = l[0] + ul + vadd.u16 q0, q12 + vadd.u16 q1, q13 + vadd.u16 q2, q14 + vadd.u16 q3, q5 + + vrshr.u16 q0, #2 + vrshr.u16 q1, #2 + vrshr.u16 q2, #2 + vrshr.u16 q3, #2 + + @ Up + vext.16 q5, q10, q11, #7 + vext.16 q14, q9, q10, #7 + vext.16 q13, q8, q9, #7 + vext.16 q12, q15, q8, #7 + + vadd.u16 q5, q11 + vadd.u16 q14, q10 + vadd.u16 q13, q9 + vadd.u16 q12, q8 + vmov.u16 r3, d23[3] @ Save final pel + + vext.16 q8, q12, q13, #1 + vext.16 q9, q13, q14, #1 + vext.16 q10, q14, q5, #1 + vext.16 q11, q5, q5, #1 + + vadd.u16 d30, d24 @ d30[0] = l[0] + 2ul + u[0] + vadd.u16 q8, q12 + vadd.u16 q9, q13 + vadd.u16 q10, q14 + vadd.u16 q11, q5 + + vrshr.u16 q8, #2 + vrshr.u16 q9, #2 + vrshr.u16 q10, #2 + vrshr.u16 q11, #2 + + @ Misc + vrshr.u16 d30, #2 + vmov.u16 d7[3], r2 @ Restore final pel + vmov.u16 d23[3], r3 @ Restore final pel + vdup.u16 d31, d30[0] @ d31[3] = d30[0] + vpop {q5} + +10: + vstm r1, {d16-d23} @ Up + vst1.16 {d31[3]}, [r12] @ Up-left + vstm r0, { d0-d7 } @ Left + pop {r4-r10, pc} +endfunc + +@ int ff_hevc_rpi_intra_filter_4_neon_32( +@ pixel * const left, [r0] +@ pixel * const top, [r1] +@ const unsigned int req, [r2] +@ const unsigned int avail, [r3] +@ const pixel * const src_l, [sp, #0] +@ const pixel * const src_u, [sp, #4] +@ const pixel * const src_ur, [sp, #8] +@ const unsigned int stride, [sp, #12] (pels) +@ const unsigned int top_right_size, [sp, #16] +@ const unsigned int down_left_size) [sp, #20] + +.set sp_base, 8*4 +.set pw_s, 2 +.set pw, (1 << pw_s) +.set log2_s, 2 + +function ff_hevc_rpi_intra_filter_4_neon_32, export=1 + push {r4-r10, lr} + load_pointers pw_s, log2_s, sp_base, 32, "d0[],d1[]", d31[1], "d4[],d5[]", "d6[],d7[]" + + it cs + vldmcs r6, {d4, d5} + it mi + vldmmi r5, {d6, d7} + lsls r7, #AVAIL_S_L_N_DL_C + vdup.32 q1, d0[0] + add r12, r0, #-pw + bpl 1f + vld1.32 {d0[0]}, [r10], r9 + vld1.32 {d0[1]}, [r3], r9 + vld1.32 {d1[0]}, [r10] + vld1.32 {d1[1]}, [r3] +1: + bcc 1f + vld1.32 {d2[1]}, [r4], r9 + vld1.32 {d3[0]}, [r8] + vld1.32 {d3[1]}, [r4] +1: + vst1.32 {q2, q3 }, [r1] @ Up + vst1.32 {d31[1]}, [r12] + vst1.32 {q0, q1 }, [r0] @ Left + pop {r4-r10, pc} +endfunc + + +@ int ff_hevc_rpi_intra_filter_8_neon_32( +@ pixel * const left, [r0] +@ pixel * const top, [r1] +@ const unsigned int req, [r2] +@ const unsigned int avail, [r3] +@ const pixel * const src_l, [sp, #0] +@ const pixel * const src_u, [sp, #4] +@ const pixel * const src_ur, [sp, #8] +@ const unsigned int stride, [sp, #12] (pels) +@ const unsigned int top_right_size, [sp, #16] +@ const unsigned int down_left_size) [sp, #20] + +.set sp_base, 8*4 +.set ur_size, sp_base + 16 +.set dl_size, sp_base + 20 +.set pw_s, 2 +.set pw, (1 << pw_s) +.set log2_s, 3 +.set p_size, (1 << log2_s) @ size in pels + +function ff_hevc_rpi_intra_filter_8_neon_32, export=1 + push {r4-r10, lr} + load_pointers pw_s, log2_s, sp_base, 32, "d0[],d1[]", d31[1], "d16[],d17[]", "d20[],d21[]" + + vdup.32 q9, d16[0] + vdup.32 q11, d20[0] + + it cs + vldmcs r6, {q8, q9 } + ldr r12, [sp, #ur_size] + bpl 1f + cmp r12, #p_size + vldm r5, {q10, q11} + bge 1f + vdup.32 q11, d21[1] +1: + lsls r7, #AVAIL_S_L_N_DL_C + vdup.32 q1, d0[0] + vdup.32 q2, d0[0] + vdup.32 q3, d0[0] + bpl 1f + vld1.32 {d0[0]}, [r10], r9 + vld1.32 {d0[1]}, [r3], r9 + vld1.32 {d1[0]}, [r10], r9 + vld1.32 {d1[1]}, [r3], r9 + vld1.32 {d2[0]}, [r10], r9 + vld1.32 {d2[1]}, [r3], r9 + vld1.32 {d3[0]}, [r10] + vld1.32 {d3[1]}, [r3] +1: + bcc 1f + ldr r12, [sp, #dl_size] + vld1.32 {d4[1]}, [r4], r9 + cmp r12, #p_size + vld1.32 {d5[0]}, [r8], r9 + vld1.32 {d5[1]}, [r4], r9 + blt 2f + vld1.32 {d6[0]}, [r8], r9 + vld1.32 {d6[1]}, [r4], r9 + vld1.32 {d7[0]}, [r8] + vld1.32 {d7[1]}, [r4] + b 1f +2: + vdup.32 q3, d5[1] +1: + add r12, r0, #-pw + vstm r1, { q8-q11} @ Up + vst1.32 {d31[1]}, [r12] + vstm r0, { q0-q3 } @ Left + pop {r4-r10, pc} +endfunc + + +@ int ff_hevc_rpi_intra_filter_16_neon_32( +@ pixel * const left, [r0] +@ pixel * const top, [r1] +@ const unsigned int req, [r2] +@ const unsigned int avail, [r3] +@ const pixel * const src_l, [sp, #0] +@ const pixel * const src_u, [sp, #4] +@ const pixel * const src_ur, [sp, #8] +@ const unsigned int stride, [sp, #12] (pels) +@ const unsigned int top_right_size, [sp, #16] +@ const unsigned int down_left_size) [sp, #20] + +.set sp_base, 8*4 +.set ur_size, sp_base + 16 +.set dl_size, sp_base + 20 +.set pw_s, 2 +.set pw, (1 << pw_s) +.set log2_s, 4 +.set p_size, (1 << log2_s) @ size in pels + +function ff_hevc_rpi_intra_filter_16_neon_32, export=1 + push {r4-r10, lr} + load_pointers pw_s, log2_s, sp_base, 32, d30[0], d30[1], d31[0], d31[1] + + @ Once we get this big we have run out of neon regs to store + @ everything at once so do in pieces + + @ Up (have) + it cs + vldmcs r6, { q0-q3 } + ldr r12, [sp, #ur_size] + it mi + vldmmi r5, { q8-q11} + it cs + vstmcs r1, { q0-q3 } + bpl 1f + cmp r12, #12 + add lr, r1, #(pw << log2_s) + bgt 2f + cmp r12, #8 + bge 3f + vdup.16 q9, d17[1] +4: vdup.16 d10, d19[1] +3: vdup.16 q11, d21[1] +2: vstm lr, { q8-q11} +1: + + @ Left (have) + add lr, r0, #-pw + lsls r12, r7, #AVAIL_S_L_N_DL_C + vst1.32 {d30[1]}, [lr] @ UL + bpl 1f + vld1.32 { d0[0]}, [r10], r9 + vld1.32 { d0[1]}, [r3], r9 + vld1.32 { d1[0]}, [r10], r9 + vld1.32 { d1[1]}, [r3], r9 + vld1.32 { d2[0]}, [r10], r9 + vld1.32 { d2[1]}, [r3], r9 + vld1.32 { d3[0]}, [r10], r9 + vld1.32 { d3[1]}, [r3], r9 + vld1.32 { d4[0]}, [r10], r9 + vld1.32 { d4[1]}, [r3], r9 + vld1.32 { d5[0]}, [r10], r9 + vld1.32 { d5[1]}, [r3], r9 + vld1.32 { d6[0]}, [r10], r9 + vld1.32 { d6[1]}, [r3], r9 + vld1.32 { d7[0]}, [r10] + vld1.32 { d7[1]}, [r3] + vstm r0, { q0-q3 } +1: + bcc 1f + ldr r12, [sp, #dl_size] + vdup.32 d16, d30[0] @ d16[0] = d30[0] + add lr, r0, #(pw << log2_s) + vld1.32 {d16[1]}, [r4], r9 + cmp r12, #4 + vld1.32 {d17[0]}, [r8], r9 + vld1.32 {d17[1]}, [r4], r9 + ble 2f + vld1.32 {d18[0]}, [r8], r9 + vld1.32 {d18[1]}, [r4], r9 + cmp r12, #12 + vld1.32 {d19[0]}, [r8], r9 + vld1.32 {d19[1]}, [r4], r9 + blt 3f + vld1.32 {d20[0]}, [r8], r9 + vld1.32 {d20[1]}, [r4], r9 + vld1.32 {d21[0]}, [r8], r9 + vld1.32 {d21[1]}, [r4], r9 + ble 4f + vld1.32 {d22[0]}, [r8], r9 + vld1.32 {d22[1]}, [r4], r9 + vld1.32 {d23[0]}, [r8] + vld1.32 {d23[1]}, [r4] + b 5f +2: vdup.32 q9, d17[1] +3: vdup.32 q10, d19[1] +4: vdup.32 q11, d21[1] +5: vstm lr, { q8-q11} +1: + eors r7, r2 + beq 99f + + lsls r12, r7, #AVAIL_S_UR_N_U_C + vdup.32 q0, d31[0] + vdup.32 q1, d31[0] + vdup.32 q2, d31[0] + vdup.32 q3, d31[0] + add lr, r1, #(pw << log2_s) + vdup.32 q8, d31[1] + vdup.32 q9, d31[1] + vdup.32 q10, d31[1] + vdup.32 q11, d31[1] + it cs + vstmcs r1, { q0-q3 } + it mi + vstmmi lr, { q8-q11} + + lsls r7, #AVAIL_S_L_N_DL_C + vdup.32 q0, d30[0] + vdup.32 q1, d30[0] + vdup.32 q2, d30[0] + vdup.32 q3, d30[0] + add lr, r0, #(pw << log2_s) + it mi + vstmmi r0, { q0-q3 } + it cs + vstmcs lr, { q0-q3 } + +99: + pop {r4-r10, pc} +endfunc + + + + diff --git a/libavcodec/arm/rpi_hevcpred_intra_hv_neon.S b/libavcodec/arm/rpi_hevcpred_intra_hv_neon.S new file mode 100644 index 0000000000..56819ae439 --- /dev/null +++ b/libavcodec/arm/rpi_hevcpred_intra_hv_neon.S @@ -0,0 +1,920 @@ +/* +Copyright (c) 2018 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox, Ben Avison +*/ + +/* + * Horizontal & Vertical special cases of angular intra pred + * + * Split out because: + * Vertical, at least, is relatively common + * Much simpler code than the general angular case + * Luma with size < 32 has extra filtering that doesn't happen anywhere else + * + * *** Currently luma filtering is mandatory where it occurs, but there are + * cases where it should be turned off (rdpcm & an extension sps flag). + * These don't occur in the standard conformance suite for Main Profile + */ + +#include "libavutil/arm/asm.S" +#include "neon.S" + +@ ff_hevc_rpi_pred_vertical_4_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_vertical_4_neon_8, export=1 + ldrb ip, [r2, #-1] @ Top-left + vld1.32 {d0[0]}, [r2 :32] @ Left + add r2, r0, r3 + vld1.8 {d1[]}, [r1] + lsl r3, #1 + vdup.8 d4, ip + vmov.i8 d2, #128 + vhsub.u8 d4, d0, d4 + veor d1, d2 + vld1.32 {d0[0]}, [r1 :32] @ Top + vqadd.s8 d1, d4 + vmov.i64 d3, #0xff + vmov d4, d0 + veor d5, d1, d2 + veor d1, d1, d2 + vbit d0, d1, d3 + vshr.u64 d5, #8 + vst1.32 {d0[0]}, [r0], r3 + vshr.u64 d1, #16 + vbit d4, d5, d3 + vshr.u64 d5, #16 + vst1.32 {d4[0]}, [r2], r3 + vbit d0, d1, d3 + vst1.32 {d0[0]}, [r0] + vbit d4, d5, d3 + vst1.32 {d4[0]}, [r2] + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_vertical_8_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_vertical_8_neon_8, export=1 + ldrb ip, [r2, #-1] @ Top-left + vld1.8 {d0}, [r2 :64] @ Left + vmov.i8 d1, #128 + vld1.8 {d2[]}, [r1] + vld1.8 {d3}, [r1 :64] @ Top + vdup.8 d4, ip + vhsub.u8 d4, d0, d4 + veor d2, d1 + vmov.i64 d0, #0xff + mov r1, #8 + vqadd.s8 d2, d4, d2 + veor d1, d2, d1 +1: + vbit d3, d1, d0 + vshr.u64 d1, #8 + vst1.8 {d3}, [r0 :64], r3 + subs r1, #2 + vbit d3, d1, d0 + vshr.u64 d1, #8 + vst1.8 {d3}, [r0 :64], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_vertical_16_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_vertical_16_neon_8, export=1 + ldrb ip, [r2, #-1] @ Top-left + vld1.8 {q0}, [r2 :128] @ Left + vdup.8 q1, ip + vld1.8 {d4[],d5[]}, [r1] + vhsub.u8 q0, q1 + vmov.i8 q1, #128 + veor q2, q1 + vmov.i64 d16, #0xff + vqadd.s8 q0, q2 + vld1.8 {q3}, [r1 :128] @ Top + mov r1, #16 + veor q0, q1 + vmov q1, q3 + vext.8 q2, q0, q0, #1 +1: + vbit d2, d0, d16 + vbit d6, d4, d16 + vext.8 q0, q0, q0, #2 + subs r1, #2 + vst1.8 {q1}, [r0 :128], r3 + vext.8 q2, q2, q2, #2 + vst1.8 {q3}, [r0 :128], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_vert_32_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_vertical_32_neon_8, export=1 + vld1.8 {q0, q1 }, [r1 :128] @ Up + add r2, r0, r3 + lsl r3, #1 + mov r1, #16 +1: + vst1.8 {q0, q1 }, [r0 :128], r3 + subs r1, #1 + vst1.8 {q0, q1 }, [r2 :128], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_vertical_c_4_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_vertical_c_4_neon_8, export=1 + vld1.16 {d0 }, [r1 :64] @ Up + add r2, r0, r3, lsl #1 + lsl r3, #2 + + vst1.16 {d0 }, [r0 :64], r3 + vst1.16 {d0 }, [r2 :64], r3 + vst1.16 {d0 }, [r0 :64] + vst1.16 {d0 }, [r2 :64] + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_vertical_c_8_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_vertical_c_8_neon_8, export=1 + vld1.16 {q0 }, [r1 :128] @ Up + add r2, r0, r3, lsl #1 + lsl r3, #2 + mov r1, #4 +1: + vst1.16 {q0 }, [r0 :128], r3 + subs r1, #2 + vst1.16 {q0 }, [r2 :128], r3 + vst1.16 {q0 }, [r0 :128], r3 + vst1.16 {q0 }, [r2 :128], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_vertical_c_16_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_vertical_c_16_neon_8, export=1 + vld1.16 {q0, q1 }, [r1 :128] @ Up + add r2, r0, r3, lsl #1 + lsl r3, #2 + mov r1, #8 +1: + vst1.16 {q0, q1 }, [r0 :128], r3 + subs r1, #1 + vst1.16 {q0, q1 }, [r2 :128], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_horizontalal_4_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +@ ? Might be faster as simple arm + +function ff_hevc_rpi_pred_horizontal_4_neon_8, export=1 + ldrb ip, [r2, #-1] @ Top-left + vld1.32 {d0[0]}, [r1 :32] @ Top + add r1, r2, #3 + vld1.8 {d1[]}, [r2]! + vdup.8 d2, ip + vmov.i8 d3, #128 + vhsub.u8 d0, d2 + veor d1, d3 + vld1.8 {d2[]}, [r2]! + add ip, r0, r3 + vqadd.s8 d0, d0, d1 + lsl r3, #1 + vld1.8 {d1[]}, [r2] + vld1.8 {d4[]}, [r1] + veor d0, d3 + vst1.32 {d0[0]}, [r0 :32], r3 + vst1.32 {d2[0]}, [ip :32], r3 + vst1.32 {d1[0]}, [r0 :32] + vst1.32 {d4[0]}, [ip :32] + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_horizontal_8_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_horizontal_8_neon_8, export=1 + ldrb ip, [r2, #-1] @ Top-left + vld1.8 {d0}, [r1 :64] @ Top + vmov.i8 d1, #128 + vld1.8 {d2[]}, [r2]! + mov r1, #8-2 + vdup.8 d3, ip + vhsub.u8 d0, d3 + veor d2, d1 + vqadd.s8 d0, d2 + vld1.8 {d2[]}, [r2]! + veor d0, d1 + vst1.8 {d0}, [r0], r3 +1: + vld1.8 {d0[]}, [r2]! + subs r1, #2 + vst1.8 {d2}, [r0 :64], r3 + vld1.8 {d2[]}, [r2]! + vst1.8 {d0}, [r0 :64], r3 + bne 1b + + vst1.8 {d2}, [r0 :64] + bx lr +endfunc + + +@ ff_hevc_rpi_pred_horizontal_16_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_horizontal_16_neon_8, export=1 + ldrb ip, [r2, #-1] @ Top-left + vld1.8 {q0}, [r1 :64] @ Top + mov r1, #16-2 + vld1.8 {d4[],d5[]}, [r2]! + vdup.8 q3, ip + vhsub.u8 q0, q3 + vmov.i8 q1, #128 + veor q2, q1 + vqadd.s8 q0, q2 + vld1.8 {d4[],d5[]}, [r2]! + veor q0, q1 + vst1.8 {q0}, [r0], r3 +1: + vld1.8 {d0[],d1[]}, [r2]! + subs r1, #2 + vst1.8 {q2}, [r0 :64], r3 + vld1.8 {d4[],d5[]}, [r2]! + vst1.8 {q0}, [r0 :64], r3 + bne 1b + + vst1.8 {q2}, [r0 :64] + bx lr +endfunc + + +@ ff_hevc_rpi_pred_horizontal_32_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_horizontal_32_neon_8, export=1 + vld1.8 {d0[],d1[]}, [r2]! + add ip, r0, #16 + mov r1, #32-2 + vld1.8 {d2[],d3[]}, [r2]! + vst1.8 {q0}, [r0 :128], r3 + vst1.8 {q0}, [ip :128], r3 +1: + vld1.8 {d0[],d1[]}, [r2]! + subs r1, #2 + vst1.8 {q1}, [r0 :128], r3 + vst1.8 {q1}, [ip :128], r3 + vld1.8 {d2[],d3[]}, [r2]! + vst1.8 {q0}, [r0 :128], r3 + vst1.8 {q0}, [ip :128], r3 + bne 1b + + vst1.8 {q1}, [r0 :128] + vst1.8 {q1}, [ip :128] + bx lr +endfunc + + +@ ff_hevc_rpi_pred_horizontal_c_4_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_horizontal_c_4_neon_8, export=1 + add r1, r2, #2 + vld1.16 {d0[]}, [r2] + add r2, #4 + vld1.16 {d1[]}, [r1] + add r1, #4 + vld1.16 {d2[]}, [r2] +A add r2, r0, r3, lsl #1 +T lsl r3, #1 +T add r2, r0, r3 + vld1.16 {d3[]}, [r1] +A lsl r3, #2 +T lsl r3, #1 + vst1.16 {d0}, [r0 :64], r3 + vst1.16 {d1}, [r2 :64], r3 + vst1.16 {d2}, [r0 :64] + vst1.16 {d3}, [r2 :64] + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_horizontal_c_8_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_horizontal_c_8_neon_8, export=1 + vld1.16 {d0[],d1[]}, [r2]! + lsl r3, #1 + vld1.16 {d2[],d3[]}, [r2]! + mov r1, #8-2 + vst1.16 {q0}, [r0 :64], r3 +1: + vld1.16 {d0[],d1[]}, [r2]! + subs r1, #2 + vst1.16 {q1}, [r0 :64], r3 + vld1.16 {d2[],d3[]}, [r2]! + vst1.16 {q0}, [r0 :64], r3 + bne 1b + + vst1.16 {q1}, [r0 :64] + bx lr +endfunc + + +@ ff_hevc_rpi_pred_horizontal_c_16_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_horizontal_c_16_neon_8, export=1 + vld1.16 {d0[],d1[]}, [r2]! + lsl r3, #1 + add ip, r0, #16 + mov r1, #16-2 + vld1.16 {d2[],d3[]}, [r2]! + vst1.16 {q0}, [r0 :128], r3 + vst1.16 {q0}, [ip :128], r3 +1: + vld1.16 {d0[],d1[]}, [r2]! + subs r1, #2 + vst1.16 {q1}, [r0 :128], r3 + vst1.16 {q1}, [ip :128], r3 + vld1.16 {d2[],d3[]}, [r2]! + vst1.16 {q0}, [r0 :128], r3 + vst1.16 {q0}, [ip :128], r3 + bne 1b + + vst1.16 {q1}, [r0 :128] + vst1.16 {q1}, [ip :128] + bx lr +endfunc + + +@------------------------------------------------------------------------------ +@ +@ 10 Bit +@ Has clipping constants so 10-bit only but could easily be macroed up to +@ 14-bit before we run out of bits + + +@ ff_hevc_rpi_pred_vertical_4_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_vertical_4_neon_10, export=1 + ldrh ip, [r2, #-2] @ Top-left + vld1.16 {d0}, [r2 :64] @ Left + vmov.i16 d2, #0 + vld1.16 {d1[]}, [r1] +T lsl r3, #1 + vdup.16 d4, ip + vmov.i16 d3, #0x3ff + vld1.16 {d5}, [r1 :64] @ Top + vhsub.u16 d4, d0, d4 + vmov.i64 d0, #0xffff +A add r2, r0, r3, lsl #1 +T add r2, r0, r3 + vadd.i16 d1, d1, d4 + vmov d6, d5 + vmax.s16 d1, d1, d2 + vmin.s16 d2, d1, d3 + vmin.s16 d1, d1, d3 + vbit d5, d1, d0 +A lsl r3, #2 +T lsl r3, #1 + vshr.u64 d2, #16 + vshr.u64 d1, #32 + vbit d6, d2, d0 + vst1.16 {d5}, [r0], r3 + vshr.u64 d2, #32 + vst1.16 {d6}, [r2], r3 + vbit d5, d1, d0 + vst1.16 {d5}, [r0] + vbit d6, d2, d0 + vst1.16 {d6}, [r2] + bx lr +endfunc + + +@ ff_hevc_rpi_pred_vertical_8_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_vertical_8_neon_10, export=1 + ldrh ip, [r2, #-2] @ Top-left + vld1.16 {q0}, [r2 :128] @ Left + lsl r3, #1 + vdup.16 q1, ip + vld1.16 {d4[],d5[]}, [r1] + vhsub.u16 q0, q0, q1 + vmov.i16 q1, #0 + vadd.i16 q0, q2 + vmov.i16 q2, #0x3ff + vld1.16 {q3}, [r1 :128] @ Top + mov r1, #8 + vmax.s16 q0, q1 + vmov q1, q3 + vmin.s16 q0, q2 + vmov.i64 d16, #0xffff + vext.16 q2, q0, q0, #1 +1: + vbit d2, d0, d16 + vbit d6, d4, d16 + vext.16 q0, q0, q0, #2 + subs r1, #2 + vst1.16 {q1}, [r0 :128], r3 + vext.16 q2, q2, q2, #2 + vst1.16 {q3}, [r0 :128], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_vertical_16_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_vertical_16_neon_10, export=1 + ldrh ip, [r2, #-2] @ Top-left + vld1.16 {q0-q1}, [r2 :128] @ Left +T lsl r3, #1 + vdup.16 q2, ip +A add r2, r0, r3, lsl #1 +T add r2, r0, r3 + vld1.16 {d6[],d7[]}, [r1] +A lsl r3, #2 +T lsl r3, #1 + vhsub.u16 q0, q2 + vhsub.u16 q1, q2 + vadd.i16 q0, q3 + vadd.i16 q1, q3 + vmov.i16 q2, #0 + vld1.16 {q8-q9}, [r1 :128] @ Top + mov r1, #0 + vmov.i16 q3, #0x3ff + vmax.s16 q0, q2 + vmax.s16 q1, q2 + vmin.s16 q0, q3 + vmin.s16 q1, q3 + vmov q10, q8 + vmov q11, q9 + vext.16 q2, q0, q1, #1 + vext.16 q3, q1, q1, #1 + vmov.i64 d24, #0xffff +1: + vbit d16, d0, d24 + vbit d20, d4, d24 + vext.16 q0, q0, q0, #2 + subs r1, #1<<30 + vst1.16 {q8-q9}, [r0 :128], r3 + vext.16 q2, q2, q2, #2 + vst1.16 {q10-q11}, [r2 :128], r3 + bne 1b +1: + vbit d16, d2, d24 + vbit d20, d6, d24 + vext.16 q1, q1, q1, #2 + subs r1, #1<<30 + vst1.16 {q8-q9}, [r0 :128], r3 + vext.16 q3, q3, q3, #2 + vst1.16 {q10-q11}, [r2 :128], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_vertical_32_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_vertical_32_neon_10, export=1 + vldm r1, { q0-q3 } @ Up + lsl r3, #1 + mov r1, #32 + add r2, r0, #32 +1: + vst1.16 {q0-q1}, [r0 :128], r3 + subs r1, #1 + vst1.16 {q2-q3}, [r2 :128], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_vertical_c_4_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_vertical_c_4_neon_10, export=1 + vld1.16 {q0 }, [r1 :128] @ Up + add r2, r0, r3, lsl #2 + lsl r3, #3 + + vst1.16 {q0 }, [r0 :128], r3 + vst1.16 {q0 }, [r2 :128], r3 + vst1.16 {q0 }, [r0 :128] + vst1.16 {q0 }, [r2 :128] + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_vertical_c_8_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_vertical_c_8_neon_10, export=1 + vld1.16 {q0, q1 }, [r1 :128] @ Up + add r2, r0, r3, lsl #2 + lsl r3, #3 + mov r1, #4 +1: + vst1.16 {q0, q1 }, [r0 :128], r3 + subs r1, #1 + vst1.16 {q0, q1 }, [r2 :128], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_vertical_c_16_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_vertical_c_16_neon_10, export=1 + vldm r1, { q0-q3 } @ Up + lsl r3, #2 + mov r1, #16 + add r2, r0, #32 +1: + vst1.16 {q0-q1}, [r0 :128], r3 + subs r1, #1 + vst1.16 {q2-q3}, [r2 :128], r3 + bne 1b + + bx lr +endfunc + +@ ff_hevc_rpi_pred_horizontal_4_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_horizontal_4_neon_10, export=1 + ldrh ip, [r2, #-2] @ Top-left + vld1.16 {d0}, [r1 :64] @ Top + vmov.i16 d1, #0 + vld1.16 {d2[]}, [r2]! +T lsl r3, #1 + vdup.16 d3, ip + vmov.i16 d4, #0x3ff + vhsub.u16 d0, d3 +A add ip, r0, r3, lsl #1 +T add ip, r0, r3 + vld1.16 {d3[]}, [r2]! +A lsl r3, #2 +T lsl r3, #1 + vadd.i16 d0, d2 + vld1.16 {d2[]}, [r2]! + vmax.s16 d0, d1 + vld1.16 {d1[]}, [r2] + vmin.s16 d0, d4 + vst1.16 {d0}, [r0 :64], r3 + vst1.16 {d3}, [ip :64], r3 + vst1.16 {d2}, [r0 :64] + vst1.16 {d1}, [ip :64] + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_horizontal_8_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_horizontal_8_neon_10, export=1 + ldrh ip, [r2, #-2] @ Top-left + vld1.16 {q0}, [r1 :128] @ Top + lsl r3, #1 + vdup.16 q1, ip + mov r1, #8-2 + vhsub.u16 q0, q1 + vld1.16 {d2[],d3[]}, [r2]! + vmov.i16 q2, #0 + vadd.i16 q0, q1 + vmov.i16 q1, #0x3ff + vmax.s16 q0, q2 + vld1.16 {d4[],d5[]}, [r2]! + vmin.s16 q0, q1 + vst1.16 {q0}, [r0 :128], r3 +1: + vld1.16 {d0[],d1[]}, [r2]! + subs r1, #2 + vst1.16 {q2}, [r0 :128], r3 + vld1.16 {d4[],d5[]}, [r2]! + vst1.16 {q0}, [r0 :128], r3 + bne 1b + + vst1.16 {q2}, [r0 :128] + bx lr +endfunc + + +@ ff_hevc_rpi_pred_horizontalal_16_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_horizontal_16_neon_10, export=1 + ldrh ip, [r2, #-2] @ Top-left + vld1.16 {q0-q1}, [r1 :128] @ Top + lsl r3, #1 + vdup.16 q2, ip + add ip, r0, r3 + vhsub.u16 q0, q2 + add ip, #16 + vhsub.u16 q1, q2 + mov r1, #16-2 + vld1.16 {d4[],d5[]}, [r2]! + vmov.i16 q3, #0 + vadd.u16 q0, q2 + vadd.i16 q1, q2 + vmov.i16 q2, #0x3ff + vmax.s16 q0, q3 + vmax.s16 q1, q3 + vld1.16 {d6[],d7[]}, [r2]! + vmin.s16 q0, q2 + vmin.s16 q1, q2 + vst1.16 {q0-q1}, [r0 :128], r3 +1: + vld1.16 {d0[],d1[]}, [r2]! + subs r1, #2 + vst1.16 {q3}, [r0 :128], r3 + vst1.16 {q3}, [ip :128], r3 + vld1.16 {d6[],d7[]}, [r2]! + vst1.16 {q0}, [r0 :128], r3 + vst1.16 {q0}, [ip :128], r3 + bne 1b + + vst1.16 {q3}, [r0 :128] + vst1.16 {q3}, [ip :128] + bx lr +endfunc + + +@ ff_hevc_rpi_pred_horizontal_32_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_horizontal_32_neon_10, export=1 + vld1.16 {d0[],d1[]}, [r2]! + add ip, r0, #16 + push {lr} + mov lr, #32 + vld1.16 {d2[],d3[]}, [r2]! + lsl r3, #1 + vst1.16 {q0}, [r0 :128], lr + sub r3, #32 + vst1.16 {q0}, [ip :128], lr + mov r1, #32-2 + vst1.16 {q0}, [r0 :128], r3 + vst1.16 {q0}, [ip :128], r3 +1: + vld1.16 {d0[],d1[]}, [r2]! + subs r1, #2 + vst1.16 {q1}, [r0 :128], lr + vst1.16 {q1}, [ip :128], lr + vst1.16 {q1}, [r0 :128], r3 + vst1.16 {q1}, [ip :128], r3 + vld1.16 {d2[],d3[]}, [r2]! + vst1.16 {q0}, [r0 :128], lr + vst1.16 {q0}, [ip :128], lr + vst1.16 {q0}, [r0 :128], r3 + vst1.16 {q0}, [ip :128], r3 + bne 1b + + vst1.16 {q1}, [r0 :128], lr + vst1.16 {q1}, [ip :128], lr + vst1.16 {q1}, [r0 :128] + vst1.16 {q1}, [ip :128] + pop {pc} +endfunc + + +@ ff_hevc_rpi_pred_horizontal_c_4_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_horizontal_c_4_neon_10, export=1 + add r1, r2, #4 + vld1.32 {d0[],d1[]}, [r2] + add r2, #8 + vld1.32 {d2[],d3[]}, [r1] + add r1, #8 + vld1.32 {d4[],d5[]}, [r2] +A add r2, r0, r3, lsl #2 +T lsl r3, #2 +T add r2, r0, r3 + vld1.32 {d6[],d7[]}, [r1] +A lsl r3, #3 +T lsl r3, #1 + vst1.32 {q0}, [r0 :128], r3 + vst1.32 {q1}, [r2 :128], r3 + vst1.32 {q2}, [r0 :128] + vst1.32 {q3}, [r2 :128] + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_horizontal_c_8_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_horizontal_c_8_neon_10, export=1 + vld1.32 {d0[],d1[]}, [r2]! + lsl r3, #2 + add ip, r0, #16 + mov r1, #8-2 + vld1.32 {d2[],d3[]}, [r2]! + vst1.32 {q0}, [r0 :128], r3 + vst1.32 {q0}, [ip :128], r3 +1: + vld1.32 {d0[],d1[]}, [r2]! + subs r1, #2 + vst1.32 {q1}, [r0 :128], r3 + vst1.32 {q1}, [ip :128], r3 + vld1.32 {d2[],d3[]}, [r2]! + vst1.32 {q0}, [r0 :128], r3 + vst1.32 {q0}, [ip :128], r3 + bne 1b + + vst1.32 {q1}, [r0 :128] + vst1.32 {q1}, [ip :128] + bx lr +endfunc + + +@ ff_hevc_rpi_pred_horizontal_c_16_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_horizontal_c_16_neon_10, export=1 + vld1.32 {d0[],d1[]}, [r2]! + add ip, r0, #16 + push {lr} + mov lr, #32 + vld1.32 {d2[],d3[]}, [r2]! + lsl r3, #2 + vst1.32 {q0}, [r0 :128], lr + sub r3, #32 + vst1.32 {q0}, [ip :128], lr + mov r1, #16-2 + vst1.32 {q0}, [r0 :128], r3 + vst1.32 {q0}, [ip :128], r3 +1: + vld1.32 {d0[],d1[]}, [r2]! + subs r1, #2 + vst1.32 {q1}, [r0 :128], lr + vst1.32 {q1}, [ip :128], lr + vst1.32 {q1}, [r0 :128], r3 + vst1.32 {q1}, [ip :128], r3 + vld1.32 {d2[],d3[]}, [r2]! + vst1.32 {q0}, [r0 :128], lr + vst1.32 {q0}, [ip :128], lr + vst1.32 {q0}, [r0 :128], r3 + vst1.32 {q0}, [ip :128], r3 + bne 1b + + vst1.32 {q1}, [r0 :128], lr + vst1.32 {q1}, [ip :128], lr + vst1.32 {q1}, [r0 :128] + vst1.32 {q1}, [ip :128] + pop {pc} +endfunc + + + diff --git a/libavcodec/arm/rpi_hevcpred_intra_planar_neon.S b/libavcodec/arm/rpi_hevcpred_intra_planar_neon.S new file mode 100644 index 0000000000..af8c4c03f0 --- /dev/null +++ b/libavcodec/arm/rpi_hevcpred_intra_planar_neon.S @@ -0,0 +1,1043 @@ +/* +Copyright (c) 2018 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox, Ben Avison +*/ + +#include "libavutil/arm/asm.S" +#include "neon.S" + +@ Planar intra pred (8.4.4.2.4) +@ +@ predSamples[ x ][ y ] = +@ ( ( nTbS - 1 - x ) * p[ -1 ][ y ] + +@ ( x + 1 ) * p[ nTbS ][ -1 ] + +@ ( nTbS - 1 - y ) * p[ x ][ -1 ] + +@ ( y + 1 ) * p[ -1 ][ nTbS ] + nTbS ) >> ( Log2( nTbS ) + 1 ) + +@ All 10-bit functions would work with 9 + + +@ ff_hevc_rpi_pred_planar_8_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_planar_4_neon_8, export=1 + + vld1.8 {d0}, [r1] @ Top + adr ip, nb_3_0_1_4 + vld1.8 {d1}, [r2] @ Left + vmov.i64 d2, #0xffffffff + vldr d3, [ip, #8] @ {1,2,3,4,1,2,3,4} + add r1, r0, r3 + vdup.32 d4, d0[0] @ {t0,t1,t2,t3,t0,t1,t2,t3} + vdup.8 d0, d0[4] @ {t4,t4,t4,t4,t4,t4,t4,t4} + vdup.8 d5, d1[4] @ {l4,l4,l4,l4,l4,l4,l4,l4} + vdup.8 d6, d1[0] @ {l0,l0,l0,l0,l0,l0,l0,l0} + vshll.u8 q8, d4, #2 + lsl r3, #1 + vsubl.u8 q2, d5, d4 + vmlal.u8 q8, d0, d3 + vld1.8 {d0}, [ip] @ {3,2,1,0,3,2,1,0} + vdup.8 d7, d1[1] @ {l1,l1,l1,l1,l1,l1,l1,l1} + vshl.s16 q9, q2, #1 + vbif d6, d7, d2 @ {l0,l0,l0,l0,l1,l1,l1,l1} + vadd.i16 d16, d4 + vdup.8 d7, d1[2] @ {l2,l2,l2,l2,l2,l2,l2,l2} + vadd.i16 d17, d18 + vdup.8 d1, d1[3] @ {l3,l3,l3,l3,l3,l3,l3,l3} + vadd.i16 q2, q8, q9 + vmlal.u8 q8, d0, d6 + vbif d7, d1, d2 @ {l2,l2,l2,l2,l3,l3,l3,l3} + vmlal.u8 q2, d0, d7 + vrshrn.i16 d0, q8, #3 + vst1.32 d0[0], [r0 :32], r3 + vst1.32 d0[1], [r1 :32], r3 + vrshrn.i16 d0, q2, #3 + vst1.32 d0[0], [r0 :32] + vst1.32 d0[1], [r1 :32] + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_planar_4_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_planar_4_neon_10, export=1 + @ Load from bytes & expand later - at the very least this uses less + @ memory than having a short table + vld1.16 {q0}, [r1 :64] @ Top + adr ip, nbh_3_0_1_4 + vldr d2, [r2, #8] @ Left (lower) + vldr d3, [ip, #8] @ {1,2,3,4} +T lsl r3, #1 + vshl.s16 d4, d0, #2 + vdup.16 d1, d1[0] @ {t4,t4,t4,t4} + vldr d5, [r2] @ Left (upper) + vdup.16 d2, d2[0] @ {l4,l4,l4,l4} + vldr d6, [ip] @ {3,2,1,0} + vmla.i16 d4, d3, d1 @ Acc set up + vsub.i16 d0, d2, d0 @ Add set up + vmov d7, d6 + vdup.16 d2, d5[0] + vdup.16 d3, d5[1] + vdup.16 d16, d5[2] + vadd.i16 d18, d0, d4 + vshl.s16 d0, #1 @ x2 + vadd.i16 d19, d0, d4 + vdup.16 d17, d5[3] + vadd.i16 d4, d0, d18 +A add r1, r0, r3, lsl #1 +T add r1, r0, r3 + vadd.i16 d5, d0, d19 +A lsl r3, #2 +T lsl r3, #1 + vmla.i16 q9, q1, q3 + vmla.i16 q2, q8, q3 + vrshr.u16 q0, q9, #3 + vst1.16 {d0}, [r0], r3 + vrshr.u16 d2, d4, #3 + vst1.16 {d1}, [r1], r3 + vrshr.u16 d3, d5, #3 + vst1.16 {d2}, [r0] + vst1.16 {d3}, [r1] + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_planar_8_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_planar_8_neon_8, export=1 + + vld1.8 {q0}, [r1] @ Top + adr ip, nb_7_0_1_8 + vldr d2, [r2, #8] @ Left (lower) + mov r1, #8 + vldr d3, [ip, #8] @ {1,2,3,4,5,6,7,8} + vshll.u8 q2, d0, #3 + vdup.8 d1, d1[0] @ {t8,t8,t8,t8,t8,t8,t8,t8} + vdup.8 d2, d2[0] @ {l8,l8,l8,l8,l8,l8,l8,l8} + vldr d6, [r2] @ Left (upper) + vmlal.u8 q2, d3, d1 + vsubl.u8 q0, d2, d0 + vldr d7, [ip] @ {7,6,5,4,3,2,1,0} + +@ u8 7..0 [1] d7 +@ u8 left[y] [1] d6 +@ u16 acc [2] q2 (even rows) or q8 (odd rows) = (x+1)*p[nTbS][-1] + 32*p[x][-1] initially +@ u16 add [2] q0 = p[-1][nTbs] - p[x][-1] + + vdup.8 d2, d6[0] + vadd.i16 q2, q0 + vdup.8 d3, d6[1] + vadd.i16 q8, q2, q0 +1: + vmlal.u8 q2, d7, d2 + subs r1, #2 + vadd.i16 q9, q8, q0 + vmlal.u8 q8, d7, d3 + vdup.8 d2, d6[2] + vdup.8 d3, d6[3] + vrshrn.i16 d20, q2, #4 + vshr.u64 d6, #16 + vmov q2, q9 + vst1.8 {d20}, [r0], r3 + vrshrn.i16 d20, q8, #4 + vadd.i16 q8, q2, q0 + vst1.8 {d20}, [r0], r3 + bne 1b + + bx lr + +endfunc + + +@ ff_hevc_rpi_pred_planar_8_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_planar_8_neon_10, export=1 + + adr ip, nb_7_0_1_8 + vld1.16 {q0}, [r1 :128]! @ Top (left) + lsl r3, #1 + vld1.16 {q1}, [ip :128] @ {7,6,5,4,3,2,1,0,1,2,3,4,5,6,7,8} + add ip, r2, #16 + vld1.16 {d4[],d5[]}, [r1] @ Top (right) + mov r1, #8-2 + vshl.s16 q3, q0, #3 + vmovl.u8 q8, d3 @ {1,2,3,4,5,6,7,8} + vld1.16 {d18[],d19[]}, [ip] @ Left (lower) + vmla.i16 q3, q8, q2 @ Acc set up + vsub.i16 q0, q9, q0 @ Add set up + vmovl.u8 q1, d2 @ {7,6,5,4,3,2,1,0} + vadd.i16 q2, q3, q0 + +@ u16 7..0 [1] q1 +@ u32 left[y] [1] [r2] +@ u16 acc [1] q3 = (x+1)*p[nTbS][-1] + 32*p[x][-1] initially +@ u16 add [1] q0 = p[-1][nTbs] - p[x][-1] + + vld1.16 {d6[],d7[]}, [r2]! + vadd.i16 q8, q2, q0 + vld1.16 {d18[],d19[]}, [r2]! + vmla.i16 q2, q1, q3 + vadd.i16 q3, q8, q0 + vmla.i16 q8, q1, q9 +1: + vrshr.u16 q9, q2, #4 + subs r1, #2 + vmov q2, q3 + vrshr.u16 q10, q8, #4 + vld1.16 {d6[],d7[]}, [r2]! + vst1.16 {q9}, [r0 :128], r3 + vadd.i16 q8, q2, q0 + vld1.16 {d18[],d19[]}, [r2]! + vmla.i16 q2, q1, q3 + vadd.i16 q3, q8, q0 + vmla.i16 q8, q1, q9 + vst1.16 {q10}, [r0 :128], r3 + bne 1b + + vrshr.u16 q9, q2, #4 + add r3, r0 + vrshr.u16 q10, q8, #4 + vst1.16 {q9}, [r0 :128] + vst1.16 {q10}, [r3 :128] + + bx lr +endfunc + + +@------------------------------------------------------------------------------ +@ +@ Data - has to be in two lumps to ensure we can always reach using adr + + .balign 64 + +nb_31_0_1_32: + .byte 31, 30, 29, 28, 27, 26, 25, 24 + .byte 23, 22, 21, 20, 19, 18, 17, 16 +nb_15_0_1_16: + .byte 15, 14, 13, 12, 11, 10, 9, 8 + .byte 7, 6, 5, 4, 3, 2, 1, 0 + .byte 1, 2, 3, 4, 5, 6, 7, 8 + .byte 9, 10, 11, 12, 13, 14, 15, 16 + .byte 17, 18, 19, 20, 21, 22, 23, 24 + .byte 25, 26, 27, 28, 29, 30, 31, 32 + + @ should be back on a 64-byte boundary here + + @ These could be extracted from the above array, but separate out + @ out for better (16 byte) alignment +nb_3_0_1_4: + .byte 3, 2, 1, 0, 3, 2, 1, 0 + .byte 1, 2, 3, 4, 1, 2, 3, 4 +nb_7_0_1_8: + .byte 7, 6, 5, 4, 3, 2, 1, 0 + .byte 1, 2, 3, 4, 5, 6, 7, 8 +nbh_3_0_1_4: + .short 3, 2, 1, 0, 1, 2, 3, 4 + +@------------------------------------------------------------------------------ + + +@ ff_hevc_rpi_pred_planar_16_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_planar_16_neon_8, export=1 + + adr ip, nb_15_0_1_16 + 16 + vld1.8 {q0}, [r1 :128]! @ Top (left) + add r2, #16 + vld1.8 {q1}, [ip: 128] @ {1,2,3...16} + vld1.8 {d4[]}, [r1] @ Top (right) + sub ip, #16 + vshll.u8 q3, d0, #4 + mov r1, #16 + vshll.u8 q8, d1, #4 + vld1.8 {d5[]}, [r2] @ Left (lower) + sub r2, #16 + vmlal.u8 q3, d2, d4 + vmlal.u8 q8, d3, d4 @ Acc set up + vsubl.u8 q1, d5, d0 + vsubl.u8 q0, d5, d1 @ Add set up + vld1.8 {q2}, [ip :128] @ {15,14,13...0} + +@ u8 15..0 [1] q2 +@ u8 left[y] [1] [r2] +@ u16 acc [2] q3,q8 = (x+1)*p[nTbS][-1] + 32*p[x][-1] initially +@ u16 add [2] q1,q0 = p[-1][nTbs] - p[x][-1] + + vadd.i16 q3, q1 + vadd.i16 q8, q0 +1: + vadd.i16 q10, q3, q1 + subs r1, #2 + vld1.8 {d18[]}, [r2]! + vadd.i16 q11, q8, q0 + vld1.8 {d19[]}, [r2]! + vmlal.u8 q3, d4, d18 + vmlal.u8 q8, d5, d18 + vadd.i16 q12, q10, q1 + vmlal.u8 q10, d4, d19 + vadd.i16 q13, q11, q0 + vmlal.u8 q11, d5, d19 + vrshrn.u16 d18, q3, #5 + vrshrn.u16 d19, q8, #5 + vmov q3, q12 + vst1.8 {q9}, [r0 :128], r3 + vrshrn.u16 d18, q10, #5 + vrshrn.u16 d19, q11, #5 + vmov q8, q13 + vst1.8 {q9}, [r0 :128], r3 + bne 1b + + bx lr + +endfunc + + +@ ff_hevc_rpi_pred_planar_16_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_planar_16_neon_10, export=1 + + @ Load from bytes & expand later - at the very least this uses less + @ memory than having a short table + adr ip, nb_15_0_1_16 + 16 + vld1.16 {q0-q1}, [r1 :128]! @ Top (left) + add r2, #32 + vld1.8 {q2}, [ip :128] @ {1,2,3...16} + lsl r3, #1 + vld1.16 {d6[],d7[]}, [r1] @ Top (right) + sub ip, #16 + vmovl.u8 q8, d4 + mov r1, #16 + vshl.i16 q9, q0, #4 + vmovl.u8 q2, d5 + vshl.i16 q10, q1, #4 + vld1.16 {d22[],d23[]}, [r2] @ Left (lower) + sub r2, #32 + vld1.8 {q12}, [ip] @ {15,14,13...0} + vmla.i16 q9, q8, q3 + vmla.i16 q10, q2, q3 @ Acc set up + vsub.i16 q0, q11, q0 + vsub.i16 q1, q11, q1 @ Add set up + vadd.i16 q2, q9, q0 + vadd.i16 q3, q10, q1 + vmovl.u8 q8, d24 + vmovl.u8 q9, d25 + +@ u16 15..0 [2] q8,q9 +@ u32 left[y] [2] [r2] +@ u16 acc [2] q2,q3 = (x+1)*p[nTbS][-1] + 32*p[x][-1] initially +@ u16 add [2] q0,q1 = p[-1][nTbs] - p[x][-1] + +1: + vadd.i16 q10, q2, q0 + subs r1, #2 + vld1.16 {d24[],d25[]}, [r2]! + vadd.i16 q11, q3, q1 + vld1.16 {d28[],d29[]}, [r2]! + vmla.i16 q2, q8, q12 + vmla.i16 q3, q9, q12 + vadd.i16 q12, q10, q0 + vmla.i16 q10, q8, q14 + vadd.i16 q13, q11, q1 + vmla.i16 q11, q9, q14 + vrshr.u16 q14, q2, #5 + vrshr.u16 q15, q3, #5 + vmov q2, q12 + vst1.16 {q14-q15}, [r0 :128], r3 + vrshr.u16 q14, q10, #5 + vrshr.u16 q15, q11, #5 + vmov q3, q13 + vst1.16 {q14-q15}, [r0 :128], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_planar_32_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_planar_32_neon_8, export=1 + + vld1.8 {q0-q1}, [r1 :128]! @ Top (left) + adr ip, nb_31_0_1_32 + 32 + vpush {d8-d12} + vld1.8 {q2-q3}, [ip :128] @ {1,2,3...32} + add r2, #32 + vld1.8 {d8[]}, [r1] @ Top (right) + sub ip, #32 + vshll.u8 q8, d0, #5 + mov r1, #32 + vld1.8 {d9[]}, [r2] @ Left (lower) + sub r2, #32 + vshll.u8 q9, d1, #5 + vshll.u8 q10, d2, #5 + vshll.u8 q11, d3, #5 + vmlal.u8 q8, d4, d8 + vsubl.u8 q12, d9, d0 + vmlal.u8 q9, d5, d8 + vsubl.u8 q13, d9, d1 + vmlal.u8 q10, d6, d8 + vsubl.u8 q14, d9, d2 + vmlal.u8 q11, d7, d8 @ Acc set up + vsubl.u8 q15, d9, d3 @ Add set up + vadd.i16 q8, q12 + vadd.i16 q9, q13 + vadd.i16 q10, q14 + vadd.i16 q11, q15 + vld1.8 {q4-q5}, [ip :128] @ {31,30,29...0} + +@ u8 31..0 [2] q4,q5 +@ u8 left[y] [2] [r2] +@ u16 acc [4] q8-q11 = (x+1)*p[nTbS][-1] + 32*p[x][-1] initially +@ u16 add [4] q12-q15 = p[-1][nTbs] - p[x][-1] + + vld1.8 {d12[]}, [r2]! + vadd.i16 q0, q8, q12 + b 2f +1: + vld1.8 {d12[]}, [r2]! + vrshrn.u16 d3, q1, #6 + vrshrn.u16 d2, q0, #6 + vadd.i16 q0, q8, q12 + vrshrn.u16 d4, q2, #6 + vrshrn.u16 d5, q3, #6 + vst1.8 {q1-q2}, [r0 :128], r3 +2: vadd.i16 q1, q9, q13 + subs r1, #2 + vadd.i16 q2, q10, q14 + vadd.i16 q3, q11, q15 + vmlal.u8 q8, d8, d12 + vmlal.u8 q9, d9, d12 + vmlal.u8 q10, d10, d12 + vmlal.u8 q11, d11, d12 + vld1.8 {d12[]}, [r2]! + vrshrn.u16 d19, q9, #6 + vrshrn.u16 d18, q8, #6 + vadd.i16 q8, q0, q12 + vrshrn.u16 d20, q10, #6 + vrshrn.u16 d21, q11, #6 + vst1.8 {q9-q10}, [r0 :128], r3 + vadd.i16 q9, q1, q13 + vadd.i16 q10, q2, q14 + vadd.i16 q11, q3, q15 + vmlal.u8 q0, d8, d12 + vmlal.u8 q1, d9, d12 + vmlal.u8 q2, d10, d12 + vmlal.u8 q3, d11, d12 + + bne 1b + + vpop {d8-d12} + + vrshrn.u16 d3, q1, #6 + vrshrn.u16 d2, q0, #6 + vrshrn.u16 d4, q2, #6 + vrshrn.u16 d5, q3, #6 + vst1.8 {q1-q2}, [r0 :128] + + bx lr + +endfunc + + +@ ff_hevc_rpi_pred_planar_32_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_planar_32_neon_10, export=1 + + @ Load from bytes & expand later - at the very least this uses less + @ memory than having a short table + vld1.16 {q0-q1}, [r1 :128]! @ Top (left) + adr ip, nb_31_0_1_32 + 32 + vpush {q4-q7} + vld1.16 {q2-q3}, [r1 :128]! @ Top (centre) + add r2, #64 + vld1.8 {q14-q15}, [ip :128] @ {1,2,3...32} +T lsl r3, #1 + vld1.16 {d8[],d9[]}, [r1] @ Top (right) + sub ip, #32 + vmovl.u8 q12, d28 + mov r1, #32 + vmovl.u8 q13, d29 + vld1.8 {q6-q7}, [ip :128] @ {31,30,29...0} + vmovl.u8 q14, d30 + vmovl.u8 q15, d31 + vld1.16 {d10[],d11[]}, [r2] @ Left (lower) + sub r2, #64 + vshl.i16 q8, q0, #5 + vshl.i16 q9, q1, #5 + vshl.i16 q10, q2, #5 + vshl.i16 q11, q3, #5 + vmla.i16 q8, q12, q4 + vsub.i16 q0, q5, q0 + vmla.i16 q9, q13, q4 + vsub.i16 q1, q5, q1 + vmla.i16 q10, q14, q4 + vmov.u16 ip, d0[0] + vsub.i16 q2, q5, q2 + vmla.i16 q11, q15, q4 @ Acc set up + vsub.i16 q3, q5, q3 @ Add set up + vadd.i16 q8, q0 + vadd.i16 q9, q1 + vadd.i16 q10, q2 + vadd.i16 q11, q3 + vmovl.u8 q4, d12 + vmovl.u8 q5, d13 + vmovl.u8 q6, d14 + vmovl.u8 q7, d15 + +@ u16 31..0 [4] q4-q7 +@ u16 left[y] [4] [r2] +@ u16 acc [4] q8-q11 = (x+1)*p[nTbS][-1] + 32*p[x][-1] initially +@ u16 add [4] q0-q3 = p[-1][nTbs] - p[x][-1] + + vadd.i16 q12, q8, q0 +A sub r0, r0, r3, lsl #1 +T sub r0, r3 +1: + vld1.16 {d0[0]}, [r2]! +A add r0, r0, r3, lsl #1 +T add r0, r3 + vadd.i16 q13, q9, q1 + subs r1, #2 + vadd.i16 q14, q10, q2 + vadd.i16 q15, q11, q3 + vmla.i16 q8, q4, d0[0] + vmla.i16 q9, q5, d0[0] + vmla.i16 q10, q6, d0[0] + vmla.i16 q11, q7, d0[0] + vmov.16 d0[0], ip + vrshr.u16 q8, #6 + vrshr.u16 q9, #6 + vrshr.u16 q10, #6 + vrshr.u16 q11, #6 + vstm r0, {q8-q11} + vadd.i16 q8, q12, q0 +A add r0, r0, r3, lsl #1 +T add r0, r3 + vld1.16 {d0[0]}, [r2]! + vadd.i16 q9, q13, q1 + vadd.i16 q10, q14, q2 + vadd.i16 q11, q15, q3 + vmla.i16 q12, q4, d0[0] + vmla.i16 q13, q5, d0[0] + vmla.i16 q14, q6, d0[0] + vmla.i16 q15, q7, d0[0] + vmov.16 d0[0], ip + vrshr.u16 q12, #6 + vrshr.u16 q13, #6 + vrshr.u16 q14, #6 + vrshr.u16 q15, #6 + vstm r0, {q12-q15} + vadd.i16 q12, q8, q0 + bne 1b + + vpop {q4-q7} + bx lr + +endfunc + + +@ ff_hevc_rpi_pred_planar_c_4_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_planar_c_4_neon_8, export=1 + + vld1.8 {q0}, [r1] @ Top + adr ip, nbx2_3_0_1_4 + vldr d2, [r2, #8] @ Left (lower) + mov r1, #4 + vldr d3, [ip, #8] @ {1,1,2,2,3,3,4,4} + lsl r3, #1 + vshll.u8 q2, d0, #2 + vdup.16 d1, d1[0] @ {t4,t4,t4,t4,t4,t4,t4,t4} + vdup.16 d2, d2[0] @ {l4,l4,l4,l4,l4,l4,l4,l4} + vldr d6, [r2] @ Left (upper) + vmlal.u8 q2, d3, d1 + vsubl.u8 q0, d2, d0 + vldr d7, [ip] @ {3,3,2,2,1,1,0,0} + +@ u8 3..0 [1] d7 +@ u8 left[y] [1] d6 +@ u16 acc [2] q2 (even rows) or q8 (odd rows) = (x+1)*p[nTbS][-1] + 32*p[x][-1] initially +@ u16 add [2] q0 = p[-1][nTbs] - p[x][-1] + + vdup.16 d2, d6[0] + vadd.i16 q2, q0 + vdup.16 d3, d6[1] + vadd.i16 q8, q2, q0 +1: + vmlal.u8 q2, d7, d2 + subs r1, #2 + vadd.i16 q9, q8, q0 + vmlal.u8 q8, d7, d3 + vdup.16 d2, d6[2] + vdup.16 d3, d6[3] + vrshrn.i16 d20, q2, #3 + vmov q2, q9 + vst1.8 {d20}, [r0], r3 + vrshrn.i16 d20, q8, #3 + vadd.i16 q8, q2, q0 + vst1.8 {d20}, [r0], r3 + bne 1b + + bx lr + +endfunc + + +@ ff_hevc_rpi_pred_planar_c_4_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_planar_c_4_neon_10, export=1 + + adr ip, nbx2_3_0_1_4 + vld1.16 {q0}, [r1 :128]! @ Top (left) + lsl r3, #2 + vld1.16 {q1}, [ip :128] @ {3,3,2,2,1,1,0,0,1,1,2,2,3,3,4,4} + add ip, r2, #16 + vld1.32 {d4[],d5[]}, [r1] @ Top (right) + vshl.s16 q3, q0, #2 + vmovl.u8 q8, d3 @ {1,1,2,2,3,3,4,4} + vld1.32 {d18[],d19[]}, [ip] @ Left (lower) + vmla.i16 q3, q8, q2 @ Acc set up + vsub.i16 q0, q9, q0 @ Add set up + vmovl.u8 q1, d2 @ {3,3,2,2,1,1,0,0} + vadd.i16 q2, q3, q0 + +@ u16 3..0 [1] q1 +@ u32 left[y] [1] [r2] +@ u16 acc [1] q3 = (x+1)*p[nTbS][-1] + 32*p[x][-1] initially +@ u16 add [1] q0 = p[-1][nTbs] - p[x][-1] + + vld1.32 {d6[],d7[]}, [r2]! + vadd.i16 q8, q2, q0 + vld1.32 {d18[],d19[]}, [r2]! + vmla.i16 q2, q1, q3 + vadd.i16 q3, q8, q0 + vmla.i16 q8, q1, q9 + + vrshr.u16 q9, q2, #3 + vmov q2, q3 + vrshr.u16 q10, q8, #3 + vld1.32 {d6[],d7[]}, [r2]! + vst1.16 {q9}, [r0 :128], r3 + vadd.i16 q8, q2, q0 + vld1.32 {d18[],d19[]}, [r2]! + vmla.i16 q2, q1, q3 + vadd.i16 q3, q8, q0 + vmla.i16 q8, q1, q9 + vst1.16 {q10}, [r0 :128], r3 + + vrshr.u16 q9, q2, #3 + add r3, r0 + vrshr.u16 q10, q8, #3 + vst1.16 {q9}, [r0 :128] + vst1.16 {q10}, [r3 :128] + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_planar_c_8_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_planar_c_8_neon_8, export=1 + + adr ip, nbx2_7_0_1_8 + 16 + vld1.8 {q0}, [r1 :128]! @ Top (left) + add r2, #16 + vld1.8 {q1}, [ip: 128] @ {1,1,2,2,3,3...8,8} + lsl r3, #1 + vld1.16 {d4[]}, [r1] @ Top (right) + sub ip, #16 + vshll.u8 q3, d0, #3 + mov r1, #8 + vshll.u8 q8, d1, #3 + vld1.16 {d5[]}, [r2] @ Left (lower) + sub r2, #16 + vmlal.u8 q3, d2, d4 + vmlal.u8 q8, d3, d4 @ Acc set up + vsubl.u8 q1, d5, d0 + vsubl.u8 q0, d5, d1 @ Add set up + vld1.8 {q2}, [ip :128] @ {7,7,6,6,5,5...0,0} + +@ u8 7..0 [1] q2 +@ u8 left[y] [1] [r2] +@ u16 acc [2] q3,q8 = (x+1)*p[nTbS][-1] + 32*p[x][-1] initially +@ u16 add [2] q1,q0 = p[-1][nTbs] - p[x][-1] + + vadd.i16 q3, q1 + vadd.i16 q8, q0 +1: + vadd.i16 q10, q3, q1 + subs r1, #2 + vld1.16 {d18[]}, [r2]! + vadd.i16 q11, q8, q0 + vld1.16 {d19[]}, [r2]! + vmlal.u8 q3, d4, d18 + vmlal.u8 q8, d5, d18 + vadd.i16 q12, q10, q1 + vmlal.u8 q10, d4, d19 + vadd.i16 q13, q11, q0 + vmlal.u8 q11, d5, d19 + vrshrn.u16 d18, q3, #4 + vrshrn.u16 d19, q8, #4 + vmov q3, q12 + vst1.8 {q9}, [r0 :128], r3 + vrshrn.u16 d18, q10, #4 + vrshrn.u16 d19, q11, #4 + vmov q8, q13 + vst1.8 {q9}, [r0 :128], r3 + bne 1b + + bx lr + +endfunc + + +@------------------------------------------------------------------------------ +@ +@ Data - has to be in two lumps to ensure we can always reach using adr + + .balign 64 + +nbx2_15_0_1_16: + .byte 15, 15, 14, 14, 13, 13, 12, 12 + .byte 11, 11, 10, 10, 9, 9, 8, 8 +nbx2_7_0_1_8: + .byte 7, 7, 6, 6, 5, 5, 4, 4 + .byte 3, 3, 2, 2, 1, 1, 0, 0 + .byte 1, 1, 2, 2, 3, 3, 4, 4 + .byte 5, 5, 6, 6, 7, 7, 8, 8 + .byte 9, 9, 10, 10, 11, 11, 12, 12 + .byte 13, 13, 14, 14, 15, 15, 16, 16 + + @ should be back on a 64-byte boundary here + +nbx2_3_0_1_4: + .byte 3, 3, 2, 2, 1, 1, 0, 0 + .byte 1, 1, 2, 2, 3, 3, 4, 4 + +@------------------------------------------------------------------------------ + + +@ ff_hevc_rpi_pred_planar_c_8_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_planar_c_8_neon_10, export=1 + + @ Load from bytes & expand later - at the very least this uses less + @ memory than having a short table + adr ip, nbx2_7_0_1_8 + 16 + vld1.16 {q0-q1}, [r1 :128]! @ Top (left) + add r2, #32 + vld1.8 {q2}, [ip :128] @ {1,1,2,2,3,3...8,8} + lsl r3, #2 + vld1.32 {d6[],d7[]}, [r1] @ Top (right) + sub ip, #16 + vmovl.u8 q8, d4 + mov r1, #8 + vshl.i16 q9, q0, #3 + vmovl.u8 q2, d5 + vshl.i16 q10, q1, #3 + vld1.32 {d22[],d23[]}, [r2] @ Left (lower) + sub r2, #32 + vld1.8 {q12}, [ip] @ {7,7,6,6,5,5...0,0} + vmla.i16 q9, q8, q3 + vmla.i16 q10, q2, q3 @ Acc set up + vsub.i16 q0, q11, q0 + vsub.i16 q1, q11, q1 @ Add set up + vadd.i16 q2, q9, q0 + vadd.i16 q3, q10, q1 + vmovl.u8 q8, d24 + vmovl.u8 q9, d25 + +@ u16 7..0 [2] q8,q9 +@ u32 left[y] [2] [r2] +@ u16 acc [2] q2,q3 = (x+1)*p[nTbS][-1] + 32*p[x][-1] initially +@ u16 add [2] q0,q1 = p[-1][nTbs] - p[x][-1] + +1: + vadd.i16 q10, q2, q0 + subs r1, #2 + vld1.32 {d24[],d25[]}, [r2]! + vadd.i16 q11, q3, q1 + vld1.32 {d28[],d29[]}, [r2]! + vmla.i16 q2, q8, q12 + vmla.i16 q3, q9, q12 + vadd.i16 q12, q10, q0 + vmla.i16 q10, q8, q14 + vadd.i16 q13, q11, q1 + vmla.i16 q11, q9, q14 + vrshr.u16 q14, q2, #4 + vrshr.u16 q15, q3, #4 + vmov q2, q12 + vst1.16 {q14-q15}, [r0 :128], r3 + vrshr.u16 q14, q10, #4 + vrshr.u16 q15, q11, #4 + vmov q3, q13 + vst1.16 {q14-q15}, [r0 :128], r3 + bne 1b + + bx lr +endfunc + + +@ ff_hevc_rpi_pred_planar_c_16_neon_8 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_planar_c_16_neon_8, export=1 + + vld1.8 {q0-q1}, [r1 :128]! @ Top (left) + adr ip, nbx2_15_0_1_16 + 32 + vpush {d8-d12} + vld1.8 {q2-q3}, [ip :128] @ {1,1,2,2,3,3...16,16} + add r2, #32 + vld1.16 {d8[]}, [r1] @ Top (right) + sub ip, #32 + vshll.u8 q8, d0, #4 + mov r1, #16 + vld1.16 {d9[]}, [r2] @ Left (lower) + sub r2, #32 + vshll.u8 q9, d1, #4 + lsl r3, #1 + vshll.u8 q10, d2, #4 + vshll.u8 q11, d3, #4 + vmlal.u8 q8, d4, d8 + vsubl.u8 q12, d9, d0 + vmlal.u8 q9, d5, d8 + vsubl.u8 q13, d9, d1 + vmlal.u8 q10, d6, d8 + vsubl.u8 q14, d9, d2 + vmlal.u8 q11, d7, d8 @ Acc set up + vsubl.u8 q15, d9, d3 @ Add set up + vadd.i16 q8, q12 + vadd.i16 q9, q13 + vadd.i16 q10, q14 + vadd.i16 q11, q15 + vld1.8 {q4-q5}, [ip :128] @ {15,15,14,14,13,13...0,0} + +@ u8 15..0 [2] q4,q5 +@ u8 left[y] [2] [r2] +@ u16 acc [4] q8-q11 = (x+1)*p[nTbS][-1] + 32*p[x][-1] initially +@ u16 add [4] q12-q15 = p[-1][nTbs] - p[x][-1] + + vld1.16 {d12[]}, [r2]! + vadd.i16 q0, q8, q12 + b 2f +1: + vld1.16 {d12[]}, [r2]! + vrshrn.u16 d3, q1, #5 + vrshrn.u16 d2, q0, #5 + vadd.i16 q0, q8, q12 + vrshrn.u16 d4, q2, #5 + vrshrn.u16 d5, q3, #5 + vst1.8 {q1-q2}, [r0 :128], r3 +2: vadd.i16 q1, q9, q13 + subs r1, #2 + vadd.i16 q2, q10, q14 + vadd.i16 q3, q11, q15 + vmlal.u8 q8, d8, d12 + vmlal.u8 q9, d9, d12 + vmlal.u8 q10, d10, d12 + vmlal.u8 q11, d11, d12 + vld1.16 {d12[]}, [r2]! + vrshrn.u16 d19, q9, #5 + vrshrn.u16 d18, q8, #5 + vadd.i16 q8, q0, q12 + vrshrn.u16 d20, q10, #5 + vrshrn.u16 d21, q11, #5 + vst1.8 {q9-q10}, [r0 :128], r3 + vadd.i16 q9, q1, q13 + vadd.i16 q10, q2, q14 + vadd.i16 q11, q3, q15 + vmlal.u8 q0, d8, d12 + vmlal.u8 q1, d9, d12 + vmlal.u8 q2, d10, d12 + vmlal.u8 q3, d11, d12 + + bne 1b + + vpop {d8-d12} + + vrshrn.u16 d3, q1, #5 + vrshrn.u16 d2, q0, #5 + vrshrn.u16 d4, q2, #5 + vrshrn.u16 d5, q3, #5 + vst1.8 {q1-q2}, [r0 :128] + + bx lr + +endfunc + + +@ ff_hevc_rpi_pred_planar_c_16_neon_10 +@ uint8_t *_src, [r0] +@ const uint8_t *_top, [r1] +@ const uint8_t *_left, [r2] +@ ptrdiff_t stride) [r3] + +function ff_hevc_rpi_pred_planar_c_16_neon_10, export=1 + + @ Load from bytes & expand later - at the very least this uses less + @ memory than having a short table + vld1.16 {q0-q1}, [r1 :128]! @ Top (left) + adr ip, nbx2_15_0_1_16 + 32 + vpush {q4-q7} + vld1.16 {q2-q3}, [r1 :128]! @ Top (centre) + add r2, #64 + vld1.8 {q14-q15}, [ip :128] @ {1,1,2,2,3,3...16,16} +T lsl r3, #2 + vld1.32 {d8[],d9[]}, [r1] @ Top (right) + sub ip, #32 + vmovl.u8 q12, d28 + mov r1, #16 + vmovl.u8 q13, d29 + vld1.8 {q6-q7}, [ip :128] @ {15,15,14,14,13,13...0,0} + vmovl.u8 q14, d30 + vmovl.u8 q15, d31 + vld1.32 {d10[],d11[]}, [r2] @ Left (lower) + sub r2, #64 + vshl.i16 q8, q0, #4 + vshl.i16 q9, q1, #4 + vshl.i16 q10, q2, #4 + vshl.i16 q11, q3, #4 + vmla.i16 q8, q12, q4 + vsub.i16 q0, q5, q0 + vmla.i16 q9, q13, q4 + vpush {q0} + vsub.i16 q1, q5, q1 + vmla.i16 q10, q14, q4 + vsub.i16 q2, q5, q2 + vmla.i16 q11, q15, q4 @ Acc set up + vsub.i16 q3, q5, q3 @ Add set up + vadd.i16 q8, q0 + vadd.i16 q9, q1 + vadd.i16 q10, q2 + vadd.i16 q11, q3 + vmovl.u8 q4, d12 + vmovl.u8 q5, d13 + vmovl.u8 q6, d14 + vmovl.u8 q7, d15 + +@ u16 31..0 [4] q4-q7 +@ u16 left[y] [4] [r2] +@ u16 acc [4] q8-q11 = (x+1)*p[nTbS][-1] + 32*p[x][-1] initially +@ u16 add [4] q0-q3 = p[-1][nTbs] - p[x][-1] + + vadd.i16 q12, q8, q0 +A sub r0, r0, r3, lsl #2 +T sub r0, r3 +1: + vld1.32 {d0[],d1[]}, [r2]! +A add r0, r0, r3, lsl #2 +T add r0, r3 + vadd.i16 q13, q9, q1 + subs r1, #2 + vadd.i16 q14, q10, q2 + vadd.i16 q15, q11, q3 + vmla.i16 q8, q4, q0 + vmla.i16 q9, q5, q0 + vmla.i16 q10, q6, q0 + vmla.i16 q11, q7, q0 + vld1.16 {q0}, [sp] + vrshr.u16 q8, #5 + vrshr.u16 q9, #5 + vrshr.u16 q10, #5 + vrshr.u16 q11, #5 + vstm r0, {q8-q11} + vadd.i16 q8, q12, q0 +A add r0, r0, r3, lsl #2 +T add r0, r3 + vld1.32 {d0[],d1[]}, [r2]! + vadd.i16 q9, q13, q1 + vadd.i16 q10, q14, q2 + vadd.i16 q11, q15, q3 + vmla.i16 q12, q4, q0 + vmla.i16 q13, q5, q0 + vmla.i16 q14, q6, q0 + vmla.i16 q15, q7, q0 + vld1.16 {q0}, [sp] + vrshr.u16 q12, #5 + vrshr.u16 q13, #5 + vrshr.u16 q14, #5 + vrshr.u16 q15, #5 + vstm r0, {q12-q15} + vadd.i16 q12, q8, q0 + bne 1b + + vpop {q3-q7} + bx lr + +endfunc diff --git a/libavcodec/arm/vc1dsp_init_neon.c b/libavcodec/arm/vc1dsp_init_neon.c index 2cca784f5a..48cb816b70 100644 --- a/libavcodec/arm/vc1dsp_init_neon.c +++ b/libavcodec/arm/vc1dsp_init_neon.c @@ -19,6 +19,7 @@ #include #include "libavutil/attributes.h" +#include "libavutil/intreadwrite.h" #include "libavcodec/vc1dsp.h" #include "vc1dsp.h" @@ -32,6 +33,13 @@ void ff_vc1_inv_trans_4x8_dc_neon(uint8_t *dest, ptrdiff_t stride, int16_t *bloc void ff_vc1_inv_trans_8x4_dc_neon(uint8_t *dest, ptrdiff_t stride, int16_t *block); void ff_vc1_inv_trans_4x4_dc_neon(uint8_t *dest, ptrdiff_t stride, int16_t *block); +void ff_vc1_v_loop_filter4_neon(uint8_t *src, int stride, int pq); +void ff_vc1_h_loop_filter4_neon(uint8_t *src, int stride, int pq); +void ff_vc1_v_loop_filter8_neon(uint8_t *src, int stride, int pq); +void ff_vc1_h_loop_filter8_neon(uint8_t *src, int stride, int pq); +void ff_vc1_v_loop_filter16_neon(uint8_t *src, int stride, int pq); +void ff_vc1_h_loop_filter16_neon(uint8_t *src, int stride, int pq); + void ff_put_pixels8x8_neon(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int rnd); @@ -77,6 +85,64 @@ void ff_put_vc1_chroma_mc4_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride, void ff_avg_vc1_chroma_mc4_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride, int h, int x, int y); +int ff_vc1_unescape_buffer_helper_neon(const uint8_t *src, int size, uint8_t *dst); + +static int vc1_unescape_buffer_neon(const uint8_t *src, int size, uint8_t *dst) +{ + /* Dealing with starting and stopping, and removing escape bytes, are + * comparatively less time-sensitive, so are more clearly expressed using + * a C wrapper around the assembly inner loop. Note that we assume a + * little-endian machine that supports unaligned loads. */ + int dsize = 0; + while (size >= 4) + { + int found = 0; + while (!found && (((uintptr_t) dst) & 7) && size >= 4) + { + found = (AV_RL32(src) &~ 0x03000000) == 0x00030000; + if (!found) + { + *dst++ = *src++; + --size; + ++dsize; + } + } + if (!found) + { + int skip = size - ff_vc1_unescape_buffer_helper_neon(src, size, dst); + dst += skip; + src += skip; + size -= skip; + dsize += skip; + while (!found && size >= 4) + { + found = (AV_RL32(src) &~ 0x03000000) == 0x00030000; + if (!found) + { + *dst++ = *src++; + --size; + ++dsize; + } + } + } + if (found) + { + *dst++ = *src++; + *dst++ = *src++; + ++src; + size -= 3; + dsize += 2; + } + } + while (size > 0) + { + *dst++ = *src++; + --size; + ++dsize; + } + return dsize; +} + #define FN_ASSIGN(X, Y) \ dsp->put_vc1_mspel_pixels_tab[0][X+4*Y] = ff_put_vc1_mspel_mc##X##Y##_16_neon; \ dsp->put_vc1_mspel_pixels_tab[1][X+4*Y] = ff_put_vc1_mspel_mc##X##Y##_neon @@ -92,6 +158,13 @@ av_cold void ff_vc1dsp_init_neon(VC1DSPContext *dsp) dsp->vc1_inv_trans_8x4_dc = ff_vc1_inv_trans_8x4_dc_neon; dsp->vc1_inv_trans_4x4_dc = ff_vc1_inv_trans_4x4_dc_neon; + dsp->vc1_v_loop_filter4 = ff_vc1_v_loop_filter4_neon; + dsp->vc1_h_loop_filter4 = ff_vc1_h_loop_filter4_neon; + dsp->vc1_v_loop_filter8 = ff_vc1_v_loop_filter8_neon; + dsp->vc1_h_loop_filter8 = ff_vc1_h_loop_filter8_neon; + dsp->vc1_v_loop_filter16 = ff_vc1_v_loop_filter16_neon; + dsp->vc1_h_loop_filter16 = ff_vc1_h_loop_filter16_neon; + dsp->put_vc1_mspel_pixels_tab[1][ 0] = ff_put_pixels8x8_neon; FN_ASSIGN(1, 0); FN_ASSIGN(2, 0); @@ -116,4 +189,6 @@ av_cold void ff_vc1dsp_init_neon(VC1DSPContext *dsp) dsp->avg_no_rnd_vc1_chroma_pixels_tab[0] = ff_avg_vc1_chroma_mc8_neon; dsp->put_no_rnd_vc1_chroma_pixels_tab[1] = ff_put_vc1_chroma_mc4_neon; dsp->avg_no_rnd_vc1_chroma_pixels_tab[1] = ff_avg_vc1_chroma_mc4_neon; + + dsp->vc1_unescape_buffer = vc1_unescape_buffer_neon; } diff --git a/libavcodec/arm/vc1dsp_neon.S b/libavcodec/arm/vc1dsp_neon.S index 93f043bf08..96014fbebc 100644 --- a/libavcodec/arm/vc1dsp_neon.S +++ b/libavcodec/arm/vc1dsp_neon.S @@ -1161,3 +1161,764 @@ function ff_vc1_inv_trans_4x4_dc_neon, export=1 vst1.32 {d1[1]}, [r0,:32] bx lr endfunc + +@ VC-1 in-loop deblocking filter for 4 pixel pairs at boundary of vertically-neighbouring blocks +@ On entry: +@ r0 -> top-left pel of lower block +@ r1 = row stride, bytes +@ r2 = PQUANT bitstream parameter +function ff_vc1_v_loop_filter4_neon, export=1 + sub r3, r0, r1, lsl #2 + vldr d0, .Lcoeffs + vld1.32 {d1[0]}, [r0], r1 @ P5 + vld1.32 {d2[0]}, [r3], r1 @ P1 + vld1.32 {d3[0]}, [r3], r1 @ P2 + vld1.32 {d4[0]}, [r0], r1 @ P6 + vld1.32 {d5[0]}, [r3], r1 @ P3 + vld1.32 {d6[0]}, [r0], r1 @ P7 + vld1.32 {d7[0]}, [r3] @ P4 + vld1.32 {d16[0]}, [r0] @ P8 + vshll.u8 q9, d1, #1 @ 2*P5 + vdup.16 d17, r2 @ pq + vshll.u8 q10, d2, #1 @ 2*P1 + vmovl.u8 q11, d3 @ P2 + vmovl.u8 q1, d4 @ P6 + vmovl.u8 q12, d5 @ P3 + vmls.i16 d20, d22, d0[1] @ 2*P1-5*P2 + vmovl.u8 q11, d6 @ P7 + vmls.i16 d18, d2, d0[1] @ 2*P5-5*P6 + vshll.u8 q2, d5, #1 @ 2*P3 + vmovl.u8 q3, d7 @ P4 + vmla.i16 d18, d22, d0[1] @ 2*P5-5*P6+5*P7 + vmovl.u8 q11, d16 @ P8 + vmla.u16 d20, d24, d0[1] @ 2*P1-5*P2+5*P3 + vmovl.u8 q12, d1 @ P5 + vmls.u16 d4, d6, d0[1] @ 2*P3-5*P4 + vmls.u16 d18, d22, d0[0] @ 2*P5-5*P6+5*P7-2*P8 + vsub.i16 d1, d6, d24 @ P4-P5 + vmls.i16 d20, d6, d0[0] @ 2*P1-5*P2+5*P3-2*P4 + vmla.i16 d4, d24, d0[1] @ 2*P3-5*P4+5*P5 + vmls.i16 d4, d2, d0[0] @ 2*P3-5*P4+5*P5-2*P6 + vabs.s16 d2, d1 + vrshr.s16 d3, d18, #3 + vrshr.s16 d5, d20, #3 + vshr.s16 d2, d2, #1 @ clip + vrshr.s16 d4, d4, #3 + vabs.s16 d3, d3 @ a2 + vshr.s16 d1, d1, #8 @ clip_sign + vabs.s16 d5, d5 @ a1 + vceq.i16 d7, d2, #0 @ test clip == 0 + vabs.s16 d16, d4 @ a0 + vshr.s16 d4, d4, #8 @ a0_sign + vcge.s16 d18, d5, d3 @ test a1 >= a2 + vcge.s16 d17, d16, d17 @ test a0 >= pq + vbsl d18, d3, d5 @ a3 + vsub.i16 d1, d1, d4 @ clip_sign - a0_sign + vorr d3, d7, d17 @ test clip == 0 || a0 >= pq + vqsub.u16 d4, d16, d18 @ a0 >= a3 ? a0-a3 : 0 (a0 > a3 in all cases where filtering is enabled, so makes more sense to subtract this way round than the opposite and then taking the abs) + vcge.s16 d5, d18, d16 @ test a3 >= a0 + vmul.i16 d0, d4, d0[1] @ a0 >= a3 ? 5*(a0-a3) : 0 + vorr d4, d3, d5 @ test clip == 0 || a0 >= pq || a3 >= a0 + vmov.32 r0, d4[1] @ move to gp reg + vshr.u16 d0, d0, #3 @ a0 >= a3 ? (5*(a0-a3))>>3 : 0 + vcge.s16 d4, d0, d2 + tst r0, #1 + bne 1f @ none of the 4 pixel pairs should be updated if this one is not filtered + vbsl d4, d2, d0 @ FFMIN(d, clip) + vbic d0, d4, d3 @ set each d to zero if it should not be filtered because clip == 0 || a0 >= pq (a3 > a0 case already zeroed by saturating sub) + vmls.i16 d6, d0, d1 @ invert d depending on clip_sign & a0_sign, or zero it if they match, and accumulate into P4 + vmla.i16 d24, d0, d1 @ invert d depending on clip_sign & a0_sign, or zero it if they match, and accumulate into P5 + vqmovun.s16 d0, q3 + vqmovun.s16 d1, q12 + vst1.32 {d0[0]}, [r3], r1 + vst1.32 {d1[0]}, [r3] +1: bx lr +endfunc + +@ VC-1 in-loop deblocking filter for 4 pixel pairs at boundary of horizontally-neighbouring blocks +@ On entry: +@ r0 -> top-left pel of right block +@ r1 = row stride, bytes +@ r2 = PQUANT bitstream parameter +function ff_vc1_h_loop_filter4_neon, export=1 + sub r3, r0, #4 @ where to start reading + vldr d0, .Lcoeffs + vld1.32 {d2}, [r3], r1 + sub r0, r0, #1 @ where to start writing + vld1.32 {d4}, [r3], r1 + vld1.32 {d3}, [r3], r1 + vld1.32 {d5}, [r3] + vdup.16 d1, r2 @ pq + vtrn.8 q1, q2 + vtrn.16 d2, d3 @ P1, P5, P3, P7 + vtrn.16 d4, d5 @ P2, P6, P4, P8 + vshll.u8 q3, d2, #1 @ 2*P1, 2*P5 + vmovl.u8 q8, d4 @ P2, P6 + vmovl.u8 q9, d3 @ P3, P7 + vmovl.u8 q2, d5 @ P4, P8 + vmls.i16 q3, q8, d0[1] @ 2*P1-5*P2, 2*P5-5*P6 + vshll.u8 q10, d3, #1 @ 2*P3, 2*P7 + vmovl.u8 q1, d2 @ P1, P5 + vmla.i16 q3, q9, d0[1] @ 2*P1-5*P2+5*P3, 2*P5-5*P6+5*P7 + vmls.i16 q3, q2, d0[0] @ 2*P1-5*P2+5*P3-2*P4, 2*P5-5*P6+5*P7-2*P8 + vmov d2, d3 @ needs to be in an even-numbered vector for when we come to narrow it later + vmls.i16 d20, d4, d0[1] @ 2*P3-5*P4 + vmla.i16 d20, d3, d0[1] @ 2*P3-5*P4+5*P5 + vsub.i16 d3, d4, d2 @ P4-P5 + vmls.i16 d20, d17, d0[0] @ 2*P3-5*P4+5*P5-2*P6 + vrshr.s16 q3, q3, #3 + vabs.s16 d5, d3 + vshr.s16 d3, d3, #8 @ clip_sign + vrshr.s16 d16, d20, #3 + vabs.s16 q3, q3 @ a1, a2 + vshr.s16 d5, d5, #1 @ clip + vabs.s16 d17, d16 @ a0 + vceq.i16 d18, d5, #0 @ test clip == 0 + vshr.s16 d16, d16, #8 @ a0_sign + vcge.s16 d19, d6, d7 @ test a1 >= a2 + vcge.s16 d1, d17, d1 @ test a0 >= pq + vsub.i16 d16, d3, d16 @ clip_sign - a0_sign + vbsl d19, d7, d6 @ a3 + vorr d1, d18, d1 @ test clip == 0 || a0 >= pq + vqsub.u16 d3, d17, d19 @ a0 >= a3 ? a0-a3 : 0 (a0 > a3 in all cases where filtering is enabled, so makes more sense to subtract this way round than the opposite and then taking the abs) + vcge.s16 d6, d19, d17 @ test a3 >= a0 @ + vmul.i16 d0, d3, d0[1] @ a0 >= a3 ? 5*(a0-a3) : 0 + vorr d3, d1, d6 @ test clip == 0 || a0 >= pq || a3 >= a0 + vmov.32 r2, d3[1] @ move to gp reg + vshr.u16 d0, d0, #3 @ a0 >= a3 ? (5*(a0-a3))>>3 : 0 + vcge.s16 d3, d0, d5 + tst r2, #1 + bne 1f @ none of the 4 pixel pairs should be updated if this one is not filtered + vbsl d3, d5, d0 @ FFMIN(d, clip) + vbic d0, d3, d1 @ set each d to zero if it should not be filtered because clip == 0 || a0 >= pq (a3 > a0 case already zeroed by saturating sub) + vmla.i16 d2, d0, d16 @ invert d depending on clip_sign & a0_sign, or zero it if they match, and accumulate into P5 + vmls.i16 d4, d0, d16 @ invert d depending on clip_sign & a0_sign, or zero it if they match, and accumulate into P4 + vqmovun.s16 d1, q1 + vqmovun.s16 d0, q2 + vst2.8 {d0[0], d1[0]}, [r0], r1 + vst2.8 {d0[1], d1[1]}, [r0], r1 + vst2.8 {d0[2], d1[2]}, [r0], r1 + vst2.8 {d0[3], d1[3]}, [r0] +1: bx lr +endfunc + +@ VC-1 in-loop deblocking filter for 8 pixel pairs at boundary of vertically-neighbouring blocks +@ On entry: +@ r0 -> top-left pel of lower block +@ r1 = row stride, bytes +@ r2 = PQUANT bitstream parameter +function ff_vc1_v_loop_filter8_neon, export=1 + sub r3, r0, r1, lsl #2 + vldr d0, .Lcoeffs + vld1.32 {d1}, [r0 :64], r1 @ P5 + vld1.32 {d2}, [r3 :64], r1 @ P1 + vld1.32 {d3}, [r3 :64], r1 @ P2 + vld1.32 {d4}, [r0 :64], r1 @ P6 + vld1.32 {d5}, [r3 :64], r1 @ P3 + vld1.32 {d6}, [r0 :64], r1 @ P7 + vshll.u8 q8, d1, #1 @ 2*P5 + vshll.u8 q9, d2, #1 @ 2*P1 + vld1.32 {d7}, [r3 :64] @ P4 + vmovl.u8 q1, d3 @ P2 + vld1.32 {d20}, [r0 :64] @ P8 + vmovl.u8 q11, d4 @ P6 + vdup.16 q12, r2 @ pq + vmovl.u8 q13, d5 @ P3 + vmls.i16 q9, q1, d0[1] @ 2*P1-5*P2 + vmovl.u8 q1, d6 @ P7 + vshll.u8 q2, d5, #1 @ 2*P3 + vmls.i16 q8, q11, d0[1] @ 2*P5-5*P6 + vmovl.u8 q3, d7 @ P4 + vmovl.u8 q10, d20 @ P8 + vmla.i16 q8, q1, d0[1] @ 2*P5-5*P6+5*P7 + vmovl.u8 q1, d1 @ P5 + vmla.i16 q9, q13, d0[1] @ 2*P1-5*P2+5*P3 + vsub.i16 q13, q3, q1 @ P4-P5 + vmls.i16 q2, q3, d0[1] @ 2*P3-5*P4 + vmls.i16 q8, q10, d0[0] @ 2*P5-5*P6+5*P7-2*P8 + vabs.s16 q10, q13 + vshr.s16 q13, q13, #8 @ clip_sign + vmls.i16 q9, q3, d0[0] @ 2*P1-5*P2+5*P3-2*P4 + vshr.s16 q10, q10, #1 @ clip + vmla.i16 q2, q1, d0[1] @ 2*P3-5*P4+5*P5 + vrshr.s16 q8, q8, #3 + vmls.i16 q2, q11, d0[0] @ 2*P3-5*P4+5*P5-2*P6 + vceq.i16 q11, q10, #0 @ test clip == 0 + vrshr.s16 q9, q9, #3 + vabs.s16 q8, q8 @ a2 + vabs.s16 q9, q9 @ a1 + vrshr.s16 q2, q2, #3 + vcge.s16 q14, q9, q8 @ test a1 >= a2 + vabs.s16 q15, q2 @ a0 + vshr.s16 q2, q2, #8 @ a0_sign + vbsl q14, q8, q9 @ a3 + vcge.s16 q8, q15, q12 @ test a0 >= pq + vsub.i16 q2, q13, q2 @ clip_sign - a0_sign + vqsub.u16 q9, q15, q14 @ a0 >= a3 ? a0-a3 : 0 (a0 > a3 in all cases where filtering is enabled, so makes more sense to subtract this way round than the opposite and then taking the abs) + vcge.s16 q12, q14, q15 @ test a3 >= a0 + vorr q8, q11, q8 @ test clip == 0 || a0 >= pq + vmul.i16 q0, q9, d0[1] @ a0 >= a3 ? 5*(a0-a3) : 0 + vorr q9, q8, q12 @ test clip == 0 || a0 >= pq || a3 >= a0 + vshl.i64 q11, q9, #16 + vmov.32 r0, d18[1] @ move to gp reg + vshr.u16 q0, q0, #3 @ a0 >= a3 ? (5*(a0-a3))>>3 : 0 + vmov.32 r2, d19[1] + vshr.s64 q9, q11, #48 + vcge.s16 q11, q0, q10 + vorr q8, q8, q9 + and r0, r0, r2 + vbsl q11, q10, q0 @ FFMIN(d, clip) + tst r0, #1 + bne 1f @ none of the 8 pixel pairs should be updated in this case + vbic q0, q11, q8 @ set each d to zero if it should not be filtered + vmls.i16 q3, q0, q2 @ invert d depending on clip_sign & a0_sign, or zero it if they match, and accumulate into P4 + vmla.i16 q1, q0, q2 @ invert d depending on clip_sign & a0_sign, or zero it if they match, and accumulate into P5 + vqmovun.s16 d0, q3 + vqmovun.s16 d1, q1 + vst1.32 {d0}, [r3 :64], r1 + vst1.32 {d1}, [r3 :64] +1: bx lr +endfunc + +.align 5 +.Lcoeffs: +.quad 0x00050002 + +@ VC-1 in-loop deblocking filter for 8 pixel pairs at boundary of horizontally-neighbouring blocks +@ On entry: +@ r0 -> top-left pel of right block +@ r1 = row stride, bytes +@ r2 = PQUANT bitstream parameter +function ff_vc1_h_loop_filter8_neon, export=1 + push {lr} + sub r3, r0, #4 @ where to start reading + vldr d0, .Lcoeffs + vld1.32 {d2}, [r3], r1 @ P1[0], P2[0]... + sub r0, r0, #1 @ where to start writing + vld1.32 {d4}, [r3], r1 + add r12, r0, r1, lsl #2 + vld1.32 {d3}, [r3], r1 + vld1.32 {d5}, [r3], r1 + vld1.32 {d6}, [r3], r1 + vld1.32 {d16}, [r3], r1 + vld1.32 {d7}, [r3], r1 + vld1.32 {d17}, [r3] + vtrn.8 q1, q2 @ P1[0], P1[1], P3[0]... P1[2], P1[3], P3[2]... P2[0], P2[1], P4[0]... P2[2], P2[3], P4[2]... + vdup.16 q9, r2 @ pq + vtrn.16 d2, d3 @ P1[0], P1[1], P1[2], P1[3], P5[0]... P3[0], P3[1], P3[2], P3[3], P7[0]... + vtrn.16 d4, d5 @ P2[0], P2[1], P2[2], P2[3], P6[0]... P4[0], P4[1], P4[2], P4[3], P8[0]... + vtrn.8 q3, q8 @ P1[4], P1[5], P3[4]... P1[6], P1[7], P3[6]... P2[4], P2[5], P4[4]... P2[6], P2[7], P4[6]... + vtrn.16 d6, d7 @ P1[4], P1[5], P1[6], P1[7], P5[4]... P3[4], P3[5], P3[5], P3[7], P7[4]... + vtrn.16 d16, d17 @ P2[4], P2[5], P2[6], P2[7], P6[4]... P4[4], P4[5], P4[6], P4[7], P8[4]... + vtrn.32 d2, d6 @ P1, P5 + vtrn.32 d4, d16 @ P2, P6 + vtrn.32 d3, d7 @ P3, P7 + vtrn.32 d5, d17 @ P4, P8 + vshll.u8 q10, d2, #1 @ 2*P1 + vshll.u8 q11, d6, #1 @ 2*P5 + vmovl.u8 q12, d4 @ P2 + vmovl.u8 q13, d16 @ P6 + vmovl.u8 q14, d3 @ P3 + vmls.i16 q10, q12, d0[1] @ 2*P1-5*P2 + vmovl.u8 q12, d7 @ P7 + vshll.u8 q1, d3, #1 @ 2*P3 + vmls.i16 q11, q13, d0[1] @ 2*P5-5*P6 + vmovl.u8 q2, d5 @ P4 + vmovl.u8 q8, d17 @ P8 + vmla.i16 q11, q12, d0[1] @ 2*P5-5*P6+5*P7 + vmovl.u8 q3, d6 @ P5 + vmla.i16 q10, q14, d0[1] @ 2*P1-5*P2+5*P3 + vsub.i16 q12, q2, q3 @ P4-P5 + vmls.i16 q1, q2, d0[1] @ 2*P3-5*P4 + vmls.i16 q11, q8, d0[0] @ 2*P5-5*P6+5*P7-2*P8 + vabs.s16 q8, q12 + vshr.s16 q12, q12, #8 @ clip_sign + vmls.i16 q10, q2, d0[0] @ 2*P1-5*P2+5*P3-2*P4 + vshr.s16 q8, q8, #1 @ clip + vmla.i16 q1, q3, d0[1] @ 2*P3-5*P4+5*P5 + vrshr.s16 q11, q11, #3 + vmls.i16 q1, q13, d0[0] @ 2*P3-5*P4+5*P5-2*P6 + vceq.i16 q13, q8, #0 @ test clip == 0 + vrshr.s16 q10, q10, #3 + vabs.s16 q11, q11 @ a2 + vabs.s16 q10, q10 @ a1 + vrshr.s16 q1, q1, #3 + vcge.s16 q14, q10, q11 @ test a1 >= a2 + vabs.s16 q15, q1 @ a0 + vshr.s16 q1, q1, #8 @ a0_sign + vbsl q14, q11, q10 @ a3 + vcge.s16 q9, q15, q9 @ test a0 >= pq + vsub.i16 q1, q12, q1 @ clip_sign - a0_sign + vqsub.u16 q10, q15, q14 @ a0 >= a3 ? a0-a3 : 0 (a0 > a3 in all cases where filtering is enabled, so makes more sense to subtract this way round than the opposite and then taking the abs) + vcge.s16 q11, q14, q15 @ test a3 >= a0 + vorr q9, q13, q9 @ test clip == 0 || a0 >= pq + vmul.i16 q0, q10, d0[1] @ a0 >= a3 ? 5*(a0-a3) : 0 + vorr q10, q9, q11 @ test clip == 0 || a0 >= pq || a3 >= a0 + vmov.32 r2, d20[1] @ move to gp reg + vshr.u16 q0, q0, #3 @ a0 >= a3 ? (5*(a0-a3))>>3 : 0 + vmov.32 r3, d21[1] + vcge.s16 q10, q0, q8 + and r14, r2, r3 + vbsl q10, q8, q0 @ FFMIN(d, clip) + tst r14, #1 + bne 2f @ none of the 8 pixel pairs should be updated in this case + vbic q0, q10, q9 @ set each d to zero if it should not be filtered because clip == 0 || a0 >= pq (a3 > a0 case already zeroed by saturating sub) + vmla.i16 q3, q0, q1 @ invert d depending on clip_sign & a0_sign, or zero it if they match, and accumulate into P5 + vmls.i16 q2, q0, q1 @ invert d depending on clip_sign & a0_sign, or zero it if they match, and accumulate into P4 + vqmovun.s16 d1, q3 + vqmovun.s16 d0, q2 + tst r2, #1 + bne 1f @ none of the first 4 pixel pairs should be updated if so + vst2.8 {d0[0], d1[0]}, [r0], r1 + vst2.8 {d0[1], d1[1]}, [r0], r1 + vst2.8 {d0[2], d1[2]}, [r0], r1 + vst2.8 {d0[3], d1[3]}, [r0] +1: tst r3, #1 + bne 2f @ none of the second 4 pixel pairs should be updated if so + vst2.8 {d0[4], d1[4]}, [r12], r1 + vst2.8 {d0[5], d1[5]}, [r12], r1 + vst2.8 {d0[6], d1[6]}, [r12], r1 + vst2.8 {d0[7], d1[7]}, [r12] +2: pop {pc} +endfunc + +@ VC-1 in-loop deblocking filter for 16 pixel pairs at boundary of vertically-neighbouring blocks +@ On entry: +@ r0 -> top-left pel of lower block +@ r1 = row stride, bytes +@ r2 = PQUANT bitstream parameter +function ff_vc1_v_loop_filter16_neon, export=1 + vpush {d8-d15} + sub r3, r0, r1, lsl #2 + vldr d0, .Lcoeffs + vld1.64 {q1}, [r0 :128], r1 @ P5 + vld1.64 {q2}, [r3 :128], r1 @ P1 + vld1.64 {q3}, [r3 :128], r1 @ P2 + vld1.64 {q4}, [r0 :128], r1 @ P6 + vld1.64 {q5}, [r3 :128], r1 @ P3 + vld1.64 {q6}, [r0 :128], r1 @ P7 + vshll.u8 q7, d2, #1 @ 2*P5[0..7] + vshll.u8 q8, d4, #1 @ 2*P1[0..7] + vld1.64 {q9}, [r3 :128] @ P4 + vmovl.u8 q10, d6 @ P2[0..7] + vld1.64 {q11}, [r0 :128] @ P8 + vmovl.u8 q12, d8 @ P6[0..7] + vdup.16 q13, r2 @ pq + vshll.u8 q2, d5, #1 @ 2*P1[8..15] + vmls.i16 q8, q10, d0[1] @ 2*P1[0..7]-5*P2[0..7] + vshll.u8 q10, d3, #1 @ 2*P5[8..15] + vmovl.u8 q3, d7 @ P2[8..15] + vmls.i16 q7, q12, d0[1] @ 2*P5[0..7]-5*P6[0..7] + vmovl.u8 q4, d9 @ P6[8..15] + vmovl.u8 q14, d10 @ P3[0..7] + vmovl.u8 q15, d12 @ P7[0..7] + vmls.i16 q2, q3, d0[1] @ 2*P1[8..15]-5*P2[8..15] + vshll.u8 q3, d10, #1 @ 2*P3[0..7] + vmls.i16 q10, q4, d0[1] @ 2*P5[8..15]-5*P6[8..15] + vmovl.u8 q6, d13 @ P7[8..15] + vmla.i16 q8, q14, d0[1] @ 2*P1[0..7]-5*P2[0..7]+5*P3[0..7] + vmovl.u8 q14, d18 @ P4[0..7] + vmovl.u8 q9, d19 @ P4[8..15] + vmla.i16 q7, q15, d0[1] @ 2*P5[0..7]-5*P6[0..7]+5*P7[0..7] + vmovl.u8 q15, d11 @ P3[8..15] + vshll.u8 q5, d11, #1 @ 2*P3[8..15] + vmls.i16 q3, q14, d0[1] @ 2*P3[0..7]-5*P4[0..7] + vmla.i16 q2, q15, d0[1] @ 2*P1[8..15]-5*P2[8..15]+5*P3[8..15] + vmovl.u8 q15, d22 @ P8[0..7] + vmovl.u8 q11, d23 @ P8[8..15] + vmla.i16 q10, q6, d0[1] @ 2*P5[8..15]-5*P6[8..15]+5*P7[8..15] + vmovl.u8 q6, d2 @ P5[0..7] + vmovl.u8 q1, d3 @ P5[8..15] + vmls.i16 q5, q9, d0[1] @ 2*P3[8..15]-5*P4[8..15] + vmls.i16 q8, q14, d0[0] @ 2*P1[0..7]-5*P2[0..7]+5*P3[0..7]-2*P4[0..7] + vmls.i16 q7, q15, d0[0] @ 2*P5[0..7]-5*P6[0..7]+5*P7[0..7]-2*P8[0..7] + vsub.i16 q15, q14, q6 @ P4[0..7]-P5[0..7] + vmla.i16 q3, q6, d0[1] @ 2*P3[0..7]-5*P4[0..7]+5*P5[0..7] + vrshr.s16 q8, q8, #3 + vmls.i16 q2, q9, d0[0] @ 2*P1[8..15]-5*P2[8..15]+5*P3[8..15]-2*P4[8..15] + vrshr.s16 q7, q7, #3 + vmls.i16 q10, q11, d0[0] @ 2*P5[8..15]-5*P6[8..15]+5*P7[8..15]-2*P8[8..15] + vabs.s16 q11, q15 + vabs.s16 q8, q8 @ a1[0..7] + vmla.i16 q5, q1, d0[1] @ 2*P3[8..15]-5*P4[8..15]+5*P5[8..15] + vshr.s16 q15, q15, #8 @ clip_sign[0..7] + vrshr.s16 q2, q2, #3 + vmls.i16 q3, q12, d0[0] @ 2*P3[0..7]-5*P4[0..7]+5*P5[0..7]-2*P6[0..7] + vabs.s16 q7, q7 @ a2[0..7] + vrshr.s16 q10, q10, #3 + vsub.i16 q12, q9, q1 @ P4[8..15]-P5[8..15] + vshr.s16 q11, q11, #1 @ clip[0..7] + vmls.i16 q5, q4, d0[0] @ 2*P3[8..15]-5*P4[8..15]+5*P5[8..15]-2*P6[8..15] + vcge.s16 q4, q8, q7 @ test a1[0..7] >= a2[0..7] + vabs.s16 q2, q2 @ a1[8..15] + vrshr.s16 q3, q3, #3 + vabs.s16 q10, q10 @ a2[8..15] + vbsl q4, q7, q8 @ a3[0..7] + vabs.s16 q7, q12 + vshr.s16 q8, q12, #8 @ clip_sign[8..15] + vrshr.s16 q5, q5, #3 + vcge.s16 q12, q2, q10 @ test a1[8..15] >= a2[8.15] + vshr.s16 q7, q7, #1 @ clip[8..15] + vbsl q12, q10, q2 @ a3[8..15] + vabs.s16 q2, q3 @ a0[0..7] + vceq.i16 q10, q11, #0 @ test clip[0..7] == 0 + vshr.s16 q3, q3, #8 @ a0_sign[0..7] + vsub.i16 q3, q15, q3 @ clip_sign[0..7] - a0_sign[0..7] + vcge.s16 q15, q2, q13 @ test a0[0..7] >= pq + vorr q10, q10, q15 @ test clip[0..7] == 0 || a0[0..7] >= pq + vqsub.u16 q15, q2, q4 @ a0[0..7] >= a3[0..7] ? a0[0..7]-a3[0..7] : 0 (a0 > a3 in all cases where filtering is enabled, so makes more sense to subtract this way round than the opposite and then taking the abs) + vcge.s16 q2, q4, q2 @ test a3[0..7] >= a0[0..7] + vabs.s16 q4, q5 @ a0[8..15] + vshr.s16 q5, q5, #8 @ a0_sign[8..15] + vmul.i16 q15, q15, d0[1] @ a0[0..7] >= a3[0..7] ? 5*(a0[0..7]-a3[0..7]) : 0 + vcge.s16 q13, q4, q13 @ test a0[8..15] >= pq + vorr q2, q10, q2 @ test clip[0..7] == 0 || a0[0..7] >= pq || a3[0..7] >= a0[0..7] + vsub.i16 q5, q8, q5 @ clip_sign[8..15] - a0_sign[8..15] + vceq.i16 q8, q7, #0 @ test clip[8..15] == 0 + vshr.u16 q15, q15, #3 @ a0[0..7] >= a3[0..7] ? (5*(a0[0..7]-a3[0..7]))>>3 : 0 + vmov.32 r0, d4[1] @ move to gp reg + vorr q8, q8, q13 @ test clip[8..15] == 0 || a0[8..15] >= pq + vqsub.u16 q13, q4, q12 @ a0[8..15] >= a3[8..15] ? a0[8..15]-a3[8..15] : 0 (a0 > a3 in all cases where filtering is enabled, so makes more sense to subtract this way round than the opposite and then taking the abs) + vmov.32 r2, d5[1] + vcge.s16 q4, q12, q4 @ test a3[8..15] >= a0[8..15] + vshl.i64 q2, q2, #16 + vcge.s16 q12, q15, q11 + vmul.i16 q0, q13, d0[1] @ a0[8..15] >= a3[8..15] ? 5*(a0[8..15]-a3[8..15]) : 0 + vorr q4, q8, q4 @ test clip[8..15] == 0 || a0[8..15] >= pq || a3[8..15] >= a0[8..15] + vshr.s64 q2, q2, #48 + and r0, r0, r2 + vbsl q12, q11, q15 @ FFMIN(d[0..7], clip[0..7]) + vshl.i64 q11, q4, #16 + vmov.32 r2, d8[1] + vshr.u16 q0, q0, #3 @ a0[8..15] >= a3[8..15] ? (5*(a0[8..15]-a3[8..15]))>>3 : 0 + vorr q2, q10, q2 + vmov.32 r12, d9[1] + vshr.s64 q4, q11, #48 + vcge.s16 q10, q0, q7 + vbic q2, q12, q2 @ set each d[0..7] to zero if it should not be filtered because clip[0..7] == 0 || a0[0..7] >= pq (a3 > a0 case already zeroed by saturating sub) + vorr q4, q8, q4 + and r2, r2, r12 + vbsl q10, q7, q0 @ FFMIN(d[8..15], clip[8..15]) + vmls.i16 q14, q2, q3 @ invert d[0..7] depending on clip_sign[0..7] & a0_sign[0..7], or zero it if they match, and accumulate into P4[0..7] + and r0, r0, r2 + vbic q0, q10, q4 @ set each d[8..15] to zero if it should not be filtered because clip[8..15] == 0 || a0[8..15] >= pq (a3 > a0 case already zeroed by saturating sub) + tst r0, #1 + bne 1f @ none of the 16 pixel pairs should be updated in this case + vmla.i16 q6, q2, q3 @ invert d[0..7] depending on clip_sign[0..7] & a0_sign[0..7], or zero it if they match, and accumulate into P5[0..7] + vmls.i16 q9, q0, q5 @ invert d[8..15] depending on clip_sign[8..15] & a0_sign[8..15], or zero it if they match, and accumulate into P4[8..15] + vqmovun.s16 d4, q14 + vmla.i16 q1, q0, q5 @ invert d[8..15] depending on clip_sign[8..15] & a0_sign[8..15], or zero it if they match, and accumulate into P5[8..15] + vqmovun.s16 d0, q6 + vqmovun.s16 d5, q9 + vqmovun.s16 d1, q1 + vst1.64 {q2}, [r3 :128], r1 + vst1.64 {q0}, [r3 :128] +1: vpop {d8-d15} + bx lr +endfunc + +@ VC-1 in-loop deblocking filter for 16 pixel pairs at boundary of horizontally-neighbouring blocks +@ On entry: +@ r0 -> top-left pel of right block +@ r1 = row stride, bytes +@ r2 = PQUANT bitstream parameter +function ff_vc1_h_loop_filter16_neon, export=1 + push {r4-r6,lr} + vpush {d8-d15} + sub r3, r0, #4 @ where to start reading + vldr d0, .Lcoeffs + vld1.32 {d2}, [r3], r1 @ P1[0], P2[0]... + sub r0, r0, #1 @ where to start writing + vld1.32 {d3}, [r3], r1 + add r4, r0, r1, lsl #2 + vld1.32 {d10}, [r3], r1 + vld1.32 {d11}, [r3], r1 + vld1.32 {d16}, [r3], r1 + vld1.32 {d4}, [r3], r1 + vld1.32 {d8}, [r3], r1 + vtrn.8 d2, d3 @ P1[0], P1[1], P3[0]... P2[0], P2[1], P4[0]... + vld1.32 {d14}, [r3], r1 + vld1.32 {d5}, [r3], r1 + vtrn.8 d10, d11 @ P1[2], P1[3], P3[2]... P2[2], P2[3], P4[2]... + vld1.32 {d6}, [r3], r1 + vld1.32 {d12}, [r3], r1 + vtrn.8 d16, d4 @ P1[4], P1[5], P3[4]... P2[4], P2[5], P4[4]... + vld1.32 {d13}, [r3], r1 + vtrn.16 d2, d10 @ P1[0], P1[1], P1[2], P1[3], P5[0]... P3[0], P3[1], P3[2], P3[3], P7[0]... + vld1.32 {d1}, [r3], r1 + vtrn.8 d8, d14 @ P1[6], P1[7], P3[6]... P2[6], P2[7], P4[6]... + vld1.32 {d7}, [r3], r1 + vtrn.16 d3, d11 @ P2[0], P2[1], P2[2], P2[3], P6[0]... P4[0], P4[1], P4[2], P4[3], P8[0]... + vld1.32 {d9}, [r3], r1 + vtrn.8 d5, d6 @ P1[8], P1[9], P3[8]... P2[8], P2[9], P4[8]... + vld1.32 {d15}, [r3] + vtrn.16 d16, d8 @ P1[4], P1[5], P1[6], P1[7], P5[4]... P3[4], P3[5], P3[6], P3[7], P7[4]... + vtrn.16 d4, d14 @ P2[4], P2[5], P2[6], P2[7], P6[4]... P4[4], P4[5], P4[6], P4[7], P8[4]... + vtrn.8 d12, d13 @ P1[10], P1[11], P3[10]... P2[10], P2[11], P4[10]... + vdup.16 q9, r2 @ pq + vtrn.8 d1, d7 @ P1[12], P1[13], P3[12]... P2[12], P2[13], P4[12]... + vtrn.32 d2, d16 @ P1[0..7], P5[0..7] + vtrn.16 d5, d12 @ P1[8], P1[7], P1[10], P1[11], P5[8]... P3[8], P3[9], P3[10], P3[11], P7[8]... + vtrn.16 d6, d13 @ P2[8], P2[7], P2[10], P2[11], P6[8]... P4[8], P4[9], P4[10], P4[11], P8[8]... + vtrn.8 d9, d15 @ P1[14], P1[15], P3[14]... P2[14], P2[15], P4[14]... + vtrn.32 d3, d4 @ P2[0..7], P6[0..7] + vshll.u8 q10, d2, #1 @ 2*P1[0..7] + vtrn.32 d10, d8 @ P3[0..7], P7[0..7] + vshll.u8 q11, d16, #1 @ 2*P5[0..7] + vtrn.32 d11, d14 @ P4[0..7], P8[0..7] + vtrn.16 d1, d9 @ P1[12], P1[13], P1[14], P1[15], P5[12]... P3[12], P3[13], P3[14], P3[15], P7[12]... + vtrn.16 d7, d15 @ P2[12], P2[13], P2[14], P2[15], P6[12]... P4[12], P4[13], P4[14], P4[15], P8[12]... + vmovl.u8 q1, d3 @ P2[0..7] + vmovl.u8 q12, d4 @ P6[0..7] + vtrn.32 d5, d1 @ P1[8..15], P5[8..15] + vtrn.32 d6, d7 @ P2[8..15], P6[8..15] + vtrn.32 d12, d9 @ P3[8..15], P7[8..15] + vtrn.32 d13, d15 @ P4[8..15], P8[8..15] + vmls.i16 q10, q1, d0[1] @ 2*P1[0..7]-5*P2[0..7] + vmovl.u8 q1, d10 @ P3[0..7] + vshll.u8 q2, d5, #1 @ 2*P1[8..15] + vshll.u8 q13, d1, #1 @ 2*P5[8..15] + vmls.i16 q11, q12, d0[1] @ 2*P5[0..7]-5*P6[0..7] + vmovl.u8 q14, d6 @ P2[8..15] + vmovl.u8 q3, d7 @ P6[8..15] + vmovl.u8 q15, d8 @ P7[0..7] + vmla.i16 q10, q1, d0[1] @ 2*P1[0..7]-5*P2[0..7]+5*P3[0..7] + vmovl.u8 q1, d12 @ P3[8..15] + vmls.i16 q2, q14, d0[1] @ 2*P1[8..15]-5*P2[8..15] + vmovl.u8 q4, d9 @ P7[8..15] + vshll.u8 q14, d10, #1 @ 2*P3[0..7] + vmls.i16 q13, q3, d0[1] @ 2*P5[8..15]-5*P6[8..15] + vmovl.u8 q5, d11 @ P4[0..7] + vmla.i16 q11, q15, d0[1] @ 2*P5[0..7]-5*P6[0..7]+5*P7[0..7] + vshll.u8 q15, d12, #1 @ 2*P3[8..15] + vmovl.u8 q6, d13 @ P4[8..15] + vmla.i16 q2, q1, d0[1] @ 2*P1[8..15]-5*P2[8..15]+5*P3[8..15] + vmovl.u8 q1, d14 @ P8[0..7] + vmovl.u8 q7, d15 @ P8[8..15] + vmla.i16 q13, q4, d0[1] @ 2*P5[8..15]-5*P6[8..15]+5*P7[8..15] + vmovl.u8 q4, d16 @ P5[0..7] + vmovl.u8 q8, d1 @ P5[8..15] + vmls.i16 q14, q5, d0[1] @ 2*P3[0..7]-5*P4[0..7] + vmls.i16 q15, q6, d0[1] @ 2*P3[8..15]-5*P4[8..15] + vmls.i16 q10, q5, d0[0] @ 2*P1[0..7]-5*P2[0..7]+5*P3[0..7]-2*P4[0..7] + vmls.i16 q11, q1, d0[0] @ 2*P5[0..7]-5*P6[0..7]+5*P7[0..7]-2*P8[0..7] + vsub.i16 q1, q5, q4 @ P4[0..7]-P5[0..7] + vmls.i16 q2, q6, d0[0] @ 2*P1[8..15]-5*P2[8..15]+5*P3[8..15]-2*P4[8..15] + vrshr.s16 q10, q10, #3 + vmls.i16 q13, q7, d0[0] @ 2*P5[8..15]-5*P6[8..15]+5*P7[8..15]-2*P8[8..15] + vsub.i16 q7, q6, q8 @ P4[8..15]-P5[8..15] + vrshr.s16 q11, q11, #3 + vmla.s16 q14, q4, d0[1] @ 2*P3[0..7]-5*P4[0..7]+5*P5[0..7] + vrshr.s16 q2, q2, #3 + vmla.i16 q15, q8, d0[1] @ 2*P3[8..15]-5*P4[8..15]+5*P5[8..15] + vabs.s16 q10, q10 @ a1[0..7] + vrshr.s16 q13, q13, #3 + vmls.i16 q15, q3, d0[0] @ 2*P3[8..15]-5*P4[8..15]+5*P5[8..15]-2*P6[8..15] + vabs.s16 q3, q11 @ a2[0..7] + vabs.s16 q2, q2 @ a1[8..15] + vmls.i16 q14, q12, d0[0] @ 2*P3[0..7]-5*P4[0..7]+5*P5[0..7]-2*P6[0..7] + vabs.s16 q11, q1 + vabs.s16 q12, q13 @ a2[8..15] + vcge.s16 q13, q10, q3 @ test a1[0..7] >= a2[0..7] + vshr.s16 q1, q1, #8 @ clip_sign[0..7] + vrshr.s16 q15, q15, #3 + vshr.s16 q11, q11, #1 @ clip[0..7] + vrshr.s16 q14, q14, #3 + vbsl q13, q3, q10 @ a3[0..7] + vcge.s16 q3, q2, q12 @ test a1[8..15] >= a2[8.15] + vabs.s16 q10, q15 @ a0[8..15] + vshr.s16 q15, q15, #8 @ a0_sign[8..15] + vbsl q3, q12, q2 @ a3[8..15] + vabs.s16 q2, q14 @ a0[0..7] + vabs.s16 q12, q7 + vshr.s16 q7, q7, #8 @ clip_sign[8..15] + vshr.s16 q14, q14, #8 @ a0_sign[0..7] + vshr.s16 q12, q12, #1 @ clip[8..15] + vsub.i16 q7, q7, q15 @ clip_sign[8..15] - a0_sign[8..15] + vqsub.u16 q15, q10, q3 @ a0[8..15] >= a3[8..15] ? a0[8..15]-a3[8..15] : 0 (a0 > a3 in all cases where filtering is enabled, so makes more sense to subtract this way round than the opposite and then taking the abs) + vcge.s16 q3, q3, q10 @ test a3[8..15] >= a0[8..15] + vcge.s16 q10, q10, q9 @ test a0[8..15] >= pq + vcge.s16 q9, q2, q9 @ test a0[0..7] >= pq + vsub.i16 q1, q1, q14 @ clip_sign[0..7] - a0_sign[0..7] + vqsub.u16 q14, q2, q13 @ a0[0..7] >= a3[0..7] ? a0[0..7]-a3[0..7] : 0 (a0 > a3 in all cases where filtering is enabled, so makes more sense to subtract this way round than the opposite and then taking the abs) + vcge.s16 q2, q13, q2 @ test a3[0..7] >= a0[0..7] + vmul.i16 q13, q15, d0[1] @ a0[8..15] >= a3[8..15] ? 5*(a0[8..15]-a3[8..15]) : 0 + vceq.i16 q15, q11, #0 @ test clip[0..7] == 0 + vmul.i16 q0, q14, d0[1] @ a0[0..7] >= a3[0..7] ? 5*(a0[0..7]-a3[0..7]) : 0 + vorr q9, q15, q9 @ test clip[0..7] == 0 || a0[0..7] >= pq + vceq.i16 q14, q12, #0 @ test clip[8..15] == 0 + vshr.u16 q13, q13, #3 @ a0[8..15] >= a3[8..15] ? (5*(a0[8..15]-a3[8..15]))>>3 : 0 + vorr q2, q9, q2 @ test clip[0..7] == 0 || a0[0..7] >= pq || a3[0..7] >= a0[0..7] + vshr.u16 q0, q0, #3 @ a0[0..7] >= a3[0..7] ? (5*(a0[0..7]-a3[0..7]))>>3 : 0 + vorr q10, q14, q10 @ test clip[8..15] == 0 || a0[8..15] >= pq + vcge.s16 q14, q13, q12 + vmov.32 r2, d4[1] @ move to gp reg + vorr q3, q10, q3 @ test clip[8..15] == 0 || a0[8..15] >= pq || a3[8..15] >= a0[8..15] + vmov.32 r3, d5[1] + vcge.s16 q2, q0, q11 + vbsl q14, q12, q13 @ FFMIN(d[8..15], clip[8..15]) + vbsl q2, q11, q0 @ FFMIN(d[0..7], clip[0..7]) + vmov.32 r5, d6[1] + vbic q0, q14, q10 @ set each d[8..15] to zero if it should not be filtered because clip[8..15] == 0 || a0[8..15] >= pq (a3 > a0 case already zeroed by saturating sub) + vmov.32 r6, d7[1] + and r12, r2, r3 + vbic q2, q2, q9 @ set each d[0..7] to zero if it should not be filtered because clip[0..7] == 0 || a0[0..7] >= pq (a3 > a0 case already zeroed by saturating sub) + vmls.i16 q6, q0, q7 @ invert d[8..15] depending on clip_sign[8..15] & a0_sign[8..15], or zero it if they match, and accumulate into P4 + vmls.i16 q5, q2, q1 @ invert d[0..7] depending on clip_sign[0..7] & a0_sign[0..7], or zero it if they match, and accumulate into P4 + and r14, r5, r6 + vmla.i16 q4, q2, q1 @ invert d[0..7] depending on clip_sign[0..7] & a0_sign[0..7], or zero it if they match, and accumulate into P5 + and r12, r12, r14 + vqmovun.s16 d4, q6 + vmla.i16 q8, q0, q7 @ invert d[8..15] depending on clip_sign[8..15] & a0_sign[8..15], or zero it if they match, and accumulate into P5 + tst r12, #1 + bne 4f @ none of the 16 pixel pairs should be updated in this case + vqmovun.s16 d2, q5 + vqmovun.s16 d3, q4 + vqmovun.s16 d5, q8 + tst r2, #1 + bne 1f + vst2.8 {d2[0], d3[0]}, [r0], r1 + vst2.8 {d2[1], d3[1]}, [r0], r1 + vst2.8 {d2[2], d3[2]}, [r0], r1 + vst2.8 {d2[3], d3[3]}, [r0] +1: add r0, r4, r1, lsl #2 + tst r3, #1 + bne 2f + vst2.8 {d2[4], d3[4]}, [r4], r1 + vst2.8 {d2[5], d3[5]}, [r4], r1 + vst2.8 {d2[6], d3[6]}, [r4], r1 + vst2.8 {d2[7], d3[7]}, [r4] +2: add r4, r0, r1, lsl #2 + tst r5, #1 + bne 3f + vst2.8 {d4[0], d5[0]}, [r0], r1 + vst2.8 {d4[1], d5[1]}, [r0], r1 + vst2.8 {d4[2], d5[2]}, [r0], r1 + vst2.8 {d4[3], d5[3]}, [r0] +3: tst r6, #1 + bne 4f + vst2.8 {d4[4], d5[4]}, [r4], r1 + vst2.8 {d4[5], d5[5]}, [r4], r1 + vst2.8 {d4[6], d5[6]}, [r4], r1 + vst2.8 {d4[7], d5[7]}, [r4] +4: vpop {d8-d15} + pop {r4-r6,pc} +endfunc + +@ Copy at most the specified number of bytes from source to destination buffer, +@ stopping at a multiple of 16 bytes, none of which are the start of an escape sequence +@ On entry: +@ r0 -> source buffer +@ r1 = max number of bytes to copy +@ r2 -> destination buffer, optimally 8-byte aligned +@ On exit: +@ r0 = number of bytes not copied +function ff_vc1_unescape_buffer_helper_neon, export=1 + @ Offset by 48 to screen out cases that are too short for us to handle, + @ and also make it easy to test for loop termination, or to determine + @ whether we need an odd number of half-iterations of the loop. + subs r1, r1, #48 + bmi 90f + + @ Set up useful constants + vmov.i32 q0, #0x3000000 + vmov.i32 q1, #0x30000 + + tst r1, #16 + bne 1f + + vld1.8 {q8, q9}, [r0]! + vbic q12, q8, q0 + vext.8 q13, q8, q9, #1 + vext.8 q14, q8, q9, #2 + vext.8 q15, q8, q9, #3 + veor q12, q12, q1 + vbic q13, q13, q0 + vbic q14, q14, q0 + vbic q15, q15, q0 + vceq.i32 q12, q12, #0 + veor q13, q13, q1 + veor q14, q14, q1 + veor q15, q15, q1 + vceq.i32 q13, q13, #0 + vceq.i32 q14, q14, #0 + vceq.i32 q15, q15, #0 + add r1, r1, #16 + b 3f + +1: vld1.8 {q10, q11}, [r0]! + vbic q12, q10, q0 + vext.8 q13, q10, q11, #1 + vext.8 q14, q10, q11, #2 + vext.8 q15, q10, q11, #3 + veor q12, q12, q1 + vbic q13, q13, q0 + vbic q14, q14, q0 + vbic q15, q15, q0 + vceq.i32 q12, q12, #0 + veor q13, q13, q1 + veor q14, q14, q1 + veor q15, q15, q1 + vceq.i32 q13, q13, #0 + vceq.i32 q14, q14, #0 + vceq.i32 q15, q15, #0 + @ Drop through... +2: vmov q8, q11 + vld1.8 {q9}, [r0]! + vorr q13, q12, q13 + vorr q15, q14, q15 + vbic q12, q8, q0 + vorr q3, q13, q15 + vext.8 q13, q8, q9, #1 + vext.8 q14, q8, q9, #2 + vext.8 q15, q8, q9, #3 + veor q12, q12, q1 + vorr d6, d6, d7 + vbic q13, q13, q0 + vbic q14, q14, q0 + vbic q15, q15, q0 + vceq.i32 q12, q12, #0 + vmov r3, r12, d6 + veor q13, q13, q1 + veor q14, q14, q1 + veor q15, q15, q1 + vceq.i32 q13, q13, #0 + vceq.i32 q14, q14, #0 + vceq.i32 q15, q15, #0 + orrs r3, r3, r12 + bne 90f + vst1.64 {q10}, [r2]! +3: vmov q10, q9 + vld1.8 {q11}, [r0]! + vorr q13, q12, q13 + vorr q15, q14, q15 + vbic q12, q10, q0 + vorr q3, q13, q15 + vext.8 q13, q10, q11, #1 + vext.8 q14, q10, q11, #2 + vext.8 q15, q10, q11, #3 + veor q12, q12, q1 + vorr d6, d6, d7 + vbic q13, q13, q0 + vbic q14, q14, q0 + vbic q15, q15, q0 + vceq.i32 q12, q12, #0 + vmov r3, r12, d6 + veor q13, q13, q1 + veor q14, q14, q1 + veor q15, q15, q1 + vceq.i32 q13, q13, #0 + vceq.i32 q14, q14, #0 + vceq.i32 q15, q15, #0 + orrs r3, r3, r12 + bne 91f + vst1.64 {q8}, [r2]! + subs r1, r1, #32 + bpl 2b + +90: add r0, r1, #48 + bx lr + +91: sub r1, r1, #16 + b 90b +endfunc diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 8a71c04230..53644506e5 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -2595,6 +2595,17 @@ typedef struct AVHWAccel { * that avctx->hwaccel_priv_data is invalid. */ int (*frame_params)(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx); + + /** + * Called if parsing fails + * + * An error has occured, end_frame will not be called + * start_frame & decode_slice may or may not have been called + * Optional + * + * @param avctx the codec context + */ + void (*abort_frame)(AVCodecContext *avctx); } AVHWAccel; /** diff --git a/libavcodec/cabac.h b/libavcodec/cabac.h index 38d06b2842..bbf5d70560 100644 --- a/libavcodec/cabac.h +++ b/libavcodec/cabac.h @@ -44,6 +44,10 @@ typedef struct CABACContext{ const uint8_t *bytestream_start; const uint8_t *bytestream; const uint8_t *bytestream_end; + struct { + uint16_t bits; + uint16_t range; + } by22; }CABACContext; int ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size); diff --git a/libavcodec/codec.h b/libavcodec/codec.h index 50a22f6e3c..5acf572ef4 100644 --- a/libavcodec/codec.h +++ b/libavcodec/codec.h @@ -367,6 +367,17 @@ const AVCodec *av_codec_iterate(void **opaque); */ AVCodec *avcodec_find_decoder(enum AVCodecID id); +/** + * Find a registered decoder with a matching codec ID and pix_fmt. + * A decoder will pix_fmt set to NULL will match any fmt. + * A fmt of AV_PIX_FMT_NONE will only match a decoder will px_fmt NULL. + * + * @param id AVCodecID of the requested decoder + * @param fmt AVPixelForma that msut be supported by decoder + * @return A decoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_decoder_by_id_and_fmt(enum AVCodecID id, enum AVPixelFormat fmt); + /** * Find a registered decoder with the specified name. * diff --git a/libavcodec/hevc-ctrls-v1.h b/libavcodec/hevc-ctrls-v1.h new file mode 100644 index 0000000000..72cbba0953 --- /dev/null +++ b/libavcodec/hevc-ctrls-v1.h @@ -0,0 +1,229 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * These are the HEVC state controls for use with stateless HEVC + * 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 _HEVC_CTRLS_H_ +#define _HEVC_CTRLS_H_ + +#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) +#define V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE (V4L2_CID_MPEG_BASE + 1015) +#define V4L2_CID_MPEG_VIDEO_HEVC_START_CODE (V4L2_CID_MPEG_BASE + 1016) + +/* enum v4l2_ctrl_type type values */ +#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 + +enum v4l2_mpeg_video_hevc_decode_mode { + V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED, + V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_FRAME_BASED, +}; + +enum v4l2_mpeg_video_hevc_start_code { + V4L2_MPEG_VIDEO_HEVC_START_CODE_NONE, + V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B, +}; + +#define V4L2_HEVC_SLICE_TYPE_B 0 +#define V4L2_HEVC_SLICE_TYPE_P 1 +#define V4L2_HEVC_SLICE_TYPE_I 2 + +#define V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE (1ULL << 0) +#define V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED (1ULL << 1) +#define V4L2_HEVC_SPS_FLAG_AMP_ENABLED (1ULL << 2) +#define V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET (1ULL << 3) +#define V4L2_HEVC_SPS_FLAG_PCM_ENABLED (1ULL << 4) +#define V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED (1ULL << 5) +#define V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT (1ULL << 6) +#define V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED (1ULL << 7) +#define V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED (1ULL << 8) + +/* 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 */ + __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 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 num_short_term_ref_pic_sets; + __u8 num_long_term_ref_pics_sps; + __u8 chroma_format_idc; + __u8 sps_max_sub_layers_minus1; + + __u64 flags; +}; + +#define V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT (1ULL << 0) +#define V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT (1ULL << 1) +#define V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED (1ULL << 2) +#define V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT (1ULL << 3) +#define V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED (1ULL << 4) +#define V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED (1ULL << 5) +#define V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED (1ULL << 6) +#define V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT (1ULL << 7) +#define V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED (1ULL << 8) +#define V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED (1ULL << 9) +#define V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED (1ULL << 10) +#define V4L2_HEVC_PPS_FLAG_TILES_ENABLED (1ULL << 11) +#define V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED (1ULL << 12) +#define V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED (1ULL << 13) +#define V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 14) +#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED (1ULL << 15) +#define V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER (1ULL << 16) +#define V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT (1ULL << 17) +#define V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT (1ULL << 18) + +struct v4l2_ctrl_hevc_pps { + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture parameter set */ + __u8 num_extra_slice_header_bits; + __s8 init_qp_minus26; + __u8 diff_cu_qp_delta_depth; + __s8 pps_cb_qp_offset; + __s8 pps_cr_qp_offset; + __u8 num_tile_columns_minus1; + __u8 num_tile_rows_minus1; + __u8 column_width_minus1[20]; + __u8 row_height_minus1[22]; + __s8 pps_beta_offset_div2; + __s8 pps_tc_offset_div2; + __u8 log2_parallel_merge_level_minus2; + + __u8 padding[4]; + __u64 flags; +}; + +#define V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_BEFORE 0x01 +#define V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_AFTER 0x02 +#define V4L2_HEVC_DPB_ENTRY_RPS_LT_CURR 0x03 + +#define V4L2_HEVC_DPB_ENTRIES_NUM_MAX 16 + +struct v4l2_hevc_dpb_entry { + __u64 timestamp; + __u8 rps; + __u8 field_pic; + __u16 pic_order_cnt[2]; + __u8 padding[2]; +}; + +struct v4l2_hevc_pred_weight_table { + __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]; + + __u8 padding[6]; + + __u8 luma_log2_weight_denom; + __s8 delta_chroma_log2_weight_denom; +}; + +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_LUMA (1ULL << 0) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_CHROMA (1ULL << 1) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_TEMPORAL_MVP_ENABLED (1ULL << 2) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_MVD_L1_ZERO (1ULL << 3) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_CABAC_INIT (1ULL << 4) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_COLLOCATED_FROM_L0 (1ULL << 5) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_USE_INTEGER_MV (1ULL << 6) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_DEBLOCKING_FILTER_DISABLED (1ULL << 7) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 8) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT (1ULL << 9) + +struct v4l2_ctrl_hevc_slice_params { + __u32 bit_size; + __u32 data_bit_offset; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + __u32 slice_segment_addr; + __u32 num_entry_point_offsets; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: NAL unit header */ + __u8 nal_unit_type; + __u8 nuh_temporal_id_plus1; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + __u8 slice_type; + __u8 colour_plane_id; + __u16 slice_pic_order_cnt; + __u8 num_ref_idx_l0_active_minus1; + __u8 num_ref_idx_l1_active_minus1; + __u8 collocated_ref_idx; + __u8 five_minus_max_num_merge_cand; + __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; + __s8 slice_beta_offset_div2; + __s8 slice_tc_offset_div2; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture timing SEI message */ + __u8 pic_struct; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + __u8 num_active_dpb_entries; + __u8 ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u8 ref_idx_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + + __u8 num_rps_poc_st_curr_before; + __u8 num_rps_poc_st_curr_after; + __u8 num_rps_poc_lt_curr; + + __u8 padding; + + __u32 entry_point_offset_minus1[256]; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */ + struct v4l2_hevc_pred_weight_table pred_weight_table; + + __u64 flags; +}; + +struct v4l2_ctrl_hevc_scaling_matrix { + __u8 scaling_list_4x4[6][16]; + __u8 scaling_list_8x8[6][64]; + __u8 scaling_list_16x16[6][64]; + __u8 scaling_list_32x32[2][64]; + __u8 scaling_list_dc_coef_16x16[6]; + __u8 scaling_list_dc_coef_32x32[2]; +}; + +#endif diff --git a/libavcodec/hevc-ctrls-v2.h b/libavcodec/hevc-ctrls-v2.h new file mode 100644 index 0000000000..7cbbbf055f --- /dev/null +++ b/libavcodec/hevc-ctrls-v2.h @@ -0,0 +1,257 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * These are the HEVC state controls for use with stateless HEVC + * 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 _HEVC_CTRLS_H_ +#define _HEVC_CTRLS_H_ + +#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_CODEC_BASE + 1008) +#define V4L2_CID_MPEG_VIDEO_HEVC_PPS (V4L2_CID_CODEC_BASE + 1009) +#define V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (V4L2_CID_CODEC_BASE + 1010) +#define V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX (V4L2_CID_CODEC_BASE + 1011) +#define V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS (V4L2_CID_CODEC_BASE + 1012) +#define V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE (V4L2_CID_CODEC_BASE + 1015) +#define V4L2_CID_MPEG_VIDEO_HEVC_START_CODE (V4L2_CID_CODEC_BASE + 1016) + +/* enum v4l2_ctrl_type type values */ +#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_CTRL_TYPE_HEVC_DECODE_PARAMS 0x0124 + +enum v4l2_mpeg_video_hevc_decode_mode { + V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED, + V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_FRAME_BASED, +}; + +enum v4l2_mpeg_video_hevc_start_code { + V4L2_MPEG_VIDEO_HEVC_START_CODE_NONE, + V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B, +}; + +#define V4L2_HEVC_SLICE_TYPE_B 0 +#define V4L2_HEVC_SLICE_TYPE_P 1 +#define V4L2_HEVC_SLICE_TYPE_I 2 + +#define V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE (1ULL << 0) +#define V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED (1ULL << 1) +#define V4L2_HEVC_SPS_FLAG_AMP_ENABLED (1ULL << 2) +#define V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET (1ULL << 3) +#define V4L2_HEVC_SPS_FLAG_PCM_ENABLED (1ULL << 4) +#define V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED (1ULL << 5) +#define V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT (1ULL << 6) +#define V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED (1ULL << 7) +#define V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED (1ULL << 8) + +/* 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 */ + __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 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 num_short_term_ref_pic_sets; + __u8 num_long_term_ref_pics_sps; + __u8 chroma_format_idc; + __u8 sps_max_sub_layers_minus1; + + __u64 flags; +}; + +#define V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED (1ULL << 0) +#define V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT (1ULL << 1) +#define V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED (1ULL << 2) +#define V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT (1ULL << 3) +#define V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED (1ULL << 4) +#define V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED (1ULL << 5) +#define V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED (1ULL << 6) +#define V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT (1ULL << 7) +#define V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED (1ULL << 8) +#define V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED (1ULL << 9) +#define V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED (1ULL << 10) +#define V4L2_HEVC_PPS_FLAG_TILES_ENABLED (1ULL << 11) +#define V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED (1ULL << 12) +#define V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED (1ULL << 13) +#define V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 14) +#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED (1ULL << 15) +#define V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER (1ULL << 16) +#define V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT (1ULL << 17) +#define V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT (1ULL << 18) +#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT (1ULL << 19) +#define V4L2_HEVC_PPS_FLAG_UNIFORM_SPACING (1ULL << 20) + +struct v4l2_ctrl_hevc_pps { + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture parameter set */ + __u8 num_extra_slice_header_bits; + __u8 num_ref_idx_l0_default_active_minus1; + __u8 num_ref_idx_l1_default_active_minus1; + __s8 init_qp_minus26; + __u8 diff_cu_qp_delta_depth; + __s8 pps_cb_qp_offset; + __s8 pps_cr_qp_offset; + __u8 num_tile_columns_minus1; + __u8 num_tile_rows_minus1; + __u8 column_width_minus1[20]; + __u8 row_height_minus1[22]; + __s8 pps_beta_offset_div2; + __s8 pps_tc_offset_div2; + __u8 log2_parallel_merge_level_minus2; + + __u8 padding[4]; + __u64 flags; +}; + +#define V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_BEFORE 0x01 +#define V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_AFTER 0x02 +#define V4L2_HEVC_DPB_ENTRY_RPS_LT_CURR 0x03 + +#define V4L2_HEVC_DPB_ENTRIES_NUM_MAX 16 + +struct v4l2_hevc_dpb_entry { + __u64 timestamp; + __u8 rps; + __u8 field_pic; + __u16 pic_order_cnt[2]; + __u8 padding[2]; +}; + +struct v4l2_hevc_pred_weight_table { + __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]; + + __u8 padding[6]; + + __u8 luma_log2_weight_denom; + __s8 delta_chroma_log2_weight_denom; +}; + +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_LUMA (1ULL << 0) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_CHROMA (1ULL << 1) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_TEMPORAL_MVP_ENABLED (1ULL << 2) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_MVD_L1_ZERO (1ULL << 3) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_CABAC_INIT (1ULL << 4) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_COLLOCATED_FROM_L0 (1ULL << 5) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_USE_INTEGER_MV (1ULL << 6) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_DEBLOCKING_FILTER_DISABLED (1ULL << 7) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 8) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT (1ULL << 9) + +struct v4l2_ctrl_hevc_slice_params { + __u32 bit_size; + __u32 data_bit_offset; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + __u32 slice_segment_addr; + __u32 num_entry_point_offsets; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: NAL unit header */ + __u8 nal_unit_type; + __u8 nuh_temporal_id_plus1; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + __u8 slice_type; + __u8 colour_plane_id; + __u16 slice_pic_order_cnt; + __u8 num_ref_idx_l0_active_minus1; + __u8 num_ref_idx_l1_active_minus1; + __u8 collocated_ref_idx; + __u8 five_minus_max_num_merge_cand; + __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; + __s8 slice_beta_offset_div2; + __s8 slice_tc_offset_div2; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture timing SEI message */ + __u8 pic_struct; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + __u8 ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u8 ref_idx_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + + __u8 padding[5]; + + __u32 entry_point_offset_minus1[256]; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */ + struct v4l2_hevc_pred_weight_table pred_weight_table; + + __u64 flags; +}; + +#define V4L2_HEVC_DECODE_PARAM_FLAG_IRAP_PIC 0x1 +#define V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC 0x2 +#define V4L2_HEVC_DECODE_PARAM_FLAG_NO_OUTPUT_OF_PRIOR 0x4 + +struct v4l2_ctrl_hevc_decode_params { + __s32 pic_order_cnt_val; + __u8 num_active_dpb_entries; + struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u8 num_poc_st_curr_before; + __u8 num_poc_st_curr_after; + __u8 num_poc_lt_curr; + __u8 poc_st_curr_before[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u8 poc_st_curr_after[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u8 poc_lt_curr[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u64 flags; +}; + +/* MPEG-class control IDs specific to the Hantro driver as defined by V4L2 */ +#define V4L2_CID_CODEC_HANTRO_BASE (V4L2_CTRL_CLASS_CODEC | 0x1200) +/* + * V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP - + * the number of data (in bits) to skip in the + * slice segment header. + * If non-IDR, the bits to be skipped go from syntax element "pic_output_flag" + * to before syntax element "slice_temporal_mvp_enabled_flag". + * If IDR, the skipped bits are just "pic_output_flag" + * (separate_colour_plane_flag is not supported). + */ +#define V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP (V4L2_CID_CODEC_HANTRO_BASE + 0) + +struct v4l2_ctrl_hevc_scaling_matrix { + __u8 scaling_list_4x4[6][16]; + __u8 scaling_list_8x8[6][64]; + __u8 scaling_list_16x16[6][64]; + __u8 scaling_list_32x32[2][64]; + __u8 scaling_list_dc_coef_16x16[6]; + __u8 scaling_list_dc_coef_32x32[2]; +}; + +#endif diff --git a/libavcodec/hevc-ctrls-v3.h b/libavcodec/hevc-ctrls-v3.h new file mode 100644 index 0000000000..4e35bd583d --- /dev/null +++ b/libavcodec/hevc-ctrls-v3.h @@ -0,0 +1,255 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * These are the HEVC state controls for use with stateless HEVC + * 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 _HEVC_CTRLS_H_ +#define _HEVC_CTRLS_H_ + +#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_CODEC_BASE + 1008) +#define V4L2_CID_MPEG_VIDEO_HEVC_PPS (V4L2_CID_CODEC_BASE + 1009) +#define V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (V4L2_CID_CODEC_BASE + 1010) +#define V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX (V4L2_CID_CODEC_BASE + 1011) +#define V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS (V4L2_CID_CODEC_BASE + 1012) +#define V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE (V4L2_CID_CODEC_BASE + 1015) +#define V4L2_CID_MPEG_VIDEO_HEVC_START_CODE (V4L2_CID_CODEC_BASE + 1016) + +/* enum v4l2_ctrl_type type values */ +#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_CTRL_TYPE_HEVC_DECODE_PARAMS 0x0124 + +enum v4l2_mpeg_video_hevc_decode_mode { + V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED, + V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_FRAME_BASED, +}; + +enum v4l2_mpeg_video_hevc_start_code { + V4L2_MPEG_VIDEO_HEVC_START_CODE_NONE, + V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B, +}; + +#define V4L2_HEVC_SLICE_TYPE_B 0 +#define V4L2_HEVC_SLICE_TYPE_P 1 +#define V4L2_HEVC_SLICE_TYPE_I 2 + +#define V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE (1ULL << 0) +#define V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED (1ULL << 1) +#define V4L2_HEVC_SPS_FLAG_AMP_ENABLED (1ULL << 2) +#define V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET (1ULL << 3) +#define V4L2_HEVC_SPS_FLAG_PCM_ENABLED (1ULL << 4) +#define V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED (1ULL << 5) +#define V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT (1ULL << 6) +#define V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED (1ULL << 7) +#define V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED (1ULL << 8) + +/* 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 */ + __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 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 num_short_term_ref_pic_sets; + __u8 num_long_term_ref_pics_sps; + __u8 chroma_format_idc; + __u8 sps_max_sub_layers_minus1; + + __u64 flags; +}; + +#define V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED (1ULL << 0) +#define V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT (1ULL << 1) +#define V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED (1ULL << 2) +#define V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT (1ULL << 3) +#define V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED (1ULL << 4) +#define V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED (1ULL << 5) +#define V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED (1ULL << 6) +#define V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT (1ULL << 7) +#define V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED (1ULL << 8) +#define V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED (1ULL << 9) +#define V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED (1ULL << 10) +#define V4L2_HEVC_PPS_FLAG_TILES_ENABLED (1ULL << 11) +#define V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED (1ULL << 12) +#define V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED (1ULL << 13) +#define V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 14) +#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED (1ULL << 15) +#define V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER (1ULL << 16) +#define V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT (1ULL << 17) +#define V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT (1ULL << 18) +#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT (1ULL << 19) +#define V4L2_HEVC_PPS_FLAG_UNIFORM_SPACING (1ULL << 20) + +struct v4l2_ctrl_hevc_pps { + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture parameter set */ + __u8 num_extra_slice_header_bits; + __u8 num_ref_idx_l0_default_active_minus1; + __u8 num_ref_idx_l1_default_active_minus1; + __s8 init_qp_minus26; + __u8 diff_cu_qp_delta_depth; + __s8 pps_cb_qp_offset; + __s8 pps_cr_qp_offset; + __u8 num_tile_columns_minus1; + __u8 num_tile_rows_minus1; + __u8 column_width_minus1[20]; + __u8 row_height_minus1[22]; + __s8 pps_beta_offset_div2; + __s8 pps_tc_offset_div2; + __u8 log2_parallel_merge_level_minus2; + + __u8 padding[4]; + __u64 flags; +}; + +#define V4L2_HEVC_DPB_ENTRY_LONG_TERM_REFERENCE 0x01 + +#define V4L2_HEVC_DPB_ENTRIES_NUM_MAX 16 + +struct v4l2_hevc_dpb_entry { + __u64 timestamp; + __u8 flags; + __u8 field_pic; + __u16 pic_order_cnt[2]; + __u8 padding[2]; +}; + +struct v4l2_hevc_pred_weight_table { + __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]; + + __u8 padding[6]; + + __u8 luma_log2_weight_denom; + __s8 delta_chroma_log2_weight_denom; +}; + +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_LUMA (1ULL << 0) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_CHROMA (1ULL << 1) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_TEMPORAL_MVP_ENABLED (1ULL << 2) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_MVD_L1_ZERO (1ULL << 3) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_CABAC_INIT (1ULL << 4) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_COLLOCATED_FROM_L0 (1ULL << 5) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_USE_INTEGER_MV (1ULL << 6) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_DEBLOCKING_FILTER_DISABLED (1ULL << 7) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 8) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT (1ULL << 9) + +struct v4l2_ctrl_hevc_slice_params { + __u32 bit_size; + __u32 data_bit_offset; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + __u32 slice_segment_addr; + __u32 num_entry_point_offsets; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: NAL unit header */ + __u8 nal_unit_type; + __u8 nuh_temporal_id_plus1; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + __u8 slice_type; + __u8 colour_plane_id; + __u16 slice_pic_order_cnt; + __u8 num_ref_idx_l0_active_minus1; + __u8 num_ref_idx_l1_active_minus1; + __u8 collocated_ref_idx; + __u8 five_minus_max_num_merge_cand; + __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; + __s8 slice_beta_offset_div2; + __s8 slice_tc_offset_div2; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture timing SEI message */ + __u8 pic_struct; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + __u8 ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u8 ref_idx_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + + __u8 padding[5]; + + __u32 entry_point_offset_minus1[256]; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */ + struct v4l2_hevc_pred_weight_table pred_weight_table; + + __u64 flags; +}; + +#define V4L2_HEVC_DECODE_PARAM_FLAG_IRAP_PIC 0x1 +#define V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC 0x2 +#define V4L2_HEVC_DECODE_PARAM_FLAG_NO_OUTPUT_OF_PRIOR 0x4 + +struct v4l2_ctrl_hevc_decode_params { + __s32 pic_order_cnt_val; + __u8 num_active_dpb_entries; + struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u8 num_poc_st_curr_before; + __u8 num_poc_st_curr_after; + __u8 num_poc_lt_curr; + __u8 poc_st_curr_before[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u8 poc_st_curr_after[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u8 poc_lt_curr[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u64 flags; +}; + +struct v4l2_ctrl_hevc_scaling_matrix { + __u8 scaling_list_4x4[6][16]; + __u8 scaling_list_8x8[6][64]; + __u8 scaling_list_16x16[6][64]; + __u8 scaling_list_32x32[2][64]; + __u8 scaling_list_dc_coef_16x16[6]; + __u8 scaling_list_dc_coef_32x32[2]; +}; + +/* MPEG-class control IDs specific to the Hantro driver as defined by V4L2 */ +#define V4L2_CID_CODEC_HANTRO_BASE (V4L2_CTRL_CLASS_CODEC | 0x1200) +/* + * V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP - + * the number of data (in bits) to skip in the + * slice segment header. + * If non-IDR, the bits to be skipped go from syntax element "pic_output_flag" + * to before syntax element "slice_temporal_mvp_enabled_flag". + * If IDR, the skipped bits are just "pic_output_flag" + * (separate_colour_plane_flag is not supported). + */ +#define V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP (V4L2_CID_CODEC_HANTRO_BASE + 0) + +#endif diff --git a/libavcodec/hevc-ctrls-v4.h b/libavcodec/hevc-ctrls-v4.h new file mode 100644 index 0000000000..c02fdbe5a8 --- /dev/null +++ b/libavcodec/hevc-ctrls-v4.h @@ -0,0 +1,524 @@ +/* SPDX-License-Identifier: ((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) */ +/* + * Video for Linux Two controls header file + * + * Copyright (C) 1999-2012 the contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Alternatively you can redistribute this file under the terms of the + * BSD license as stated below: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The contents of this header was split off from videodev2.h. All control + * definitions should be added to this header, which is included by + * videodev2.h. + */ + +#ifndef AVCODEC_HEVC_CTRLS_V4_H +#define AVCODEC_HEVC_CTRLS_V4_H + +#include +#include + +#ifndef V4L2_CTRL_CLASS_CODEC_STATELESS +#define V4L2_CTRL_CLASS_CODEC_STATELESS 0x00a40000 /* Stateless codecs controls */ +#endif +#ifndef V4L2_CID_CODEC_STATELESS_BASE +#define V4L2_CID_CODEC_STATELESS_BASE (V4L2_CTRL_CLASS_CODEC_STATELESS | 0x900) +#endif + +#define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */ + +#define V4L2_CID_STATELESS_HEVC_SPS (V4L2_CID_CODEC_STATELESS_BASE + 400) +#define V4L2_CID_STATELESS_HEVC_PPS (V4L2_CID_CODEC_STATELESS_BASE + 401) +#define V4L2_CID_STATELESS_HEVC_SLICE_PARAMS (V4L2_CID_CODEC_STATELESS_BASE + 402) +#define V4L2_CID_STATELESS_HEVC_SCALING_MATRIX (V4L2_CID_CODEC_STATELESS_BASE + 403) +#define V4L2_CID_STATELESS_HEVC_DECODE_PARAMS (V4L2_CID_CODEC_STATELESS_BASE + 404) +#define V4L2_CID_STATELESS_HEVC_DECODE_MODE (V4L2_CID_CODEC_STATELESS_BASE + 405) +#define V4L2_CID_STATELESS_HEVC_START_CODE (V4L2_CID_CODEC_STATELESS_BASE + 406) +#define V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS (V4L2_CID_CODEC_STATELESS_BASE + 407) + +enum v4l2_stateless_hevc_decode_mode { + V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED, + V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED, +}; + +enum v4l2_stateless_hevc_start_code { + V4L2_STATELESS_HEVC_START_CODE_NONE, + V4L2_STATELESS_HEVC_START_CODE_ANNEX_B, +}; + +#define V4L2_HEVC_SLICE_TYPE_B 0 +#define V4L2_HEVC_SLICE_TYPE_P 1 +#define V4L2_HEVC_SLICE_TYPE_I 2 + +#define V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE (1ULL << 0) +#define V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED (1ULL << 1) +#define V4L2_HEVC_SPS_FLAG_AMP_ENABLED (1ULL << 2) +#define V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET (1ULL << 3) +#define V4L2_HEVC_SPS_FLAG_PCM_ENABLED (1ULL << 4) +#define V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED (1ULL << 5) +#define V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT (1ULL << 6) +#define V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED (1ULL << 7) +#define V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED (1ULL << 8) + +/** + * struct v4l2_ctrl_hevc_sps - ITU-T Rec. H.265: Sequence parameter set + * + * @video_parameter_set_id: specifies the value of the + * vps_video_parameter_set_id of the active VPS + * @seq_parameter_set_id: provides an identifier for the SPS for + * reference by other syntax elements + * @pic_width_in_luma_samples: specifies the width of each decoded picture + * in units of luma samples + * @pic_height_in_luma_samples: specifies the height of each decoded picture + * in units of luma samples + * @bit_depth_luma_minus8: this value plus 8specifies the bit depth of the + * samples of the luma array + * @bit_depth_chroma_minus8: this value plus 8 specifies the bit depth of the + * samples of the chroma arrays + * @log2_max_pic_order_cnt_lsb_minus4: this value plus 4 specifies the value of + * the variable MaxPicOrderCntLsb + * @sps_max_dec_pic_buffering_minus1: this value plus 1 specifies the maximum + * required size of the decoded picture + * buffer for the codec video sequence + * @sps_max_num_reorder_pics: indicates the maximum allowed number of pictures + * @sps_max_latency_increase_plus1: not equal to 0 is used to compute the + * value of SpsMaxLatencyPictures array + * @log2_min_luma_coding_block_size_minus3: plus 3 specifies the minimum + * luma coding block size + * @log2_diff_max_min_luma_coding_block_size: specifies the difference between + * the maximum and minimum luma + * coding block size + * @log2_min_luma_transform_block_size_minus2: plus 2 specifies the minimum luma + * transform block size + * @log2_diff_max_min_luma_transform_block_size: specifies the difference between + * the maximum and minimum luma + * transform block size + * @max_transform_hierarchy_depth_inter: specifies the maximum hierarchy + * depth for transform units of + * coding units coded in inter + * prediction mode + * @max_transform_hierarchy_depth_intra: specifies the maximum hierarchy + * depth for transform units of + * coding units coded in intra + * prediction mode + * @pcm_sample_bit_depth_luma_minus1: this value plus 1 specifies the number of + * bits used to represent each of PCM sample + * values of the luma component + * @pcm_sample_bit_depth_chroma_minus1: this value plus 1 specifies the number + * of bits used to represent each of PCM + * sample values of the chroma components + * @log2_min_pcm_luma_coding_block_size_minus3: this value plus 3 specifies the + * minimum size of coding blocks + * @log2_diff_max_min_pcm_luma_coding_block_size: specifies the difference between + * the maximum and minimum size of + * coding blocks + * @num_short_term_ref_pic_sets: specifies the number of st_ref_pic_set() + * syntax structures included in the SPS + * @num_long_term_ref_pics_sps: specifies the number of candidate long-term + * reference pictures that are specified in the SPS + * @chroma_format_idc: specifies the chroma sampling + * @sps_max_sub_layers_minus1: this value plus 1 specifies the maximum number + * of temporal sub-layers + * @reserved: padding field. Should be zeroed by applications. + * @flags: see V4L2_HEVC_SPS_FLAG_{} + */ +struct v4l2_ctrl_hevc_sps { + __u8 video_parameter_set_id; + __u8 seq_parameter_set_id; + __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 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 num_short_term_ref_pic_sets; + __u8 num_long_term_ref_pics_sps; + __u8 chroma_format_idc; + __u8 sps_max_sub_layers_minus1; + + __u8 reserved[6]; + __u64 flags; +}; + +#define V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED (1ULL << 0) +#define V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT (1ULL << 1) +#define V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED (1ULL << 2) +#define V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT (1ULL << 3) +#define V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED (1ULL << 4) +#define V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED (1ULL << 5) +#define V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED (1ULL << 6) +#define V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT (1ULL << 7) +#define V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED (1ULL << 8) +#define V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED (1ULL << 9) +#define V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED (1ULL << 10) +#define V4L2_HEVC_PPS_FLAG_TILES_ENABLED (1ULL << 11) +#define V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED (1ULL << 12) +#define V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED (1ULL << 13) +#define V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 14) +#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED (1ULL << 15) +#define V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER (1ULL << 16) +#define V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT (1ULL << 17) +#define V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT (1ULL << 18) +#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT (1ULL << 19) +#define V4L2_HEVC_PPS_FLAG_UNIFORM_SPACING (1ULL << 20) + +/** + * struct v4l2_ctrl_hevc_pps - ITU-T Rec. H.265: Picture parameter set + * + * @pic_parameter_set_id: identifies the PPS for reference by other + * syntax elements + * @num_extra_slice_header_bits: specifies the number of extra slice header + * bits that are present in the slice header RBSP + * for coded pictures referring to the PPS. + * @num_ref_idx_l0_default_active_minus1: this value plus 1 specifies the + * inferred value of num_ref_idx_l0_active_minus1 + * @num_ref_idx_l1_default_active_minus1: this value plus 1 specifies the + * inferred value of num_ref_idx_l1_active_minus1 + * @init_qp_minus26: this value plus 26 specifies the initial value of SliceQp Y for + * each slice referring to the PPS + * @diff_cu_qp_delta_depth: specifies the difference between the luma coding + * tree block size and the minimum luma coding block + * size of coding units that convey cu_qp_delta_abs + * and cu_qp_delta_sign_flag + * @pps_cb_qp_offset: specify the offsets to the luma quantization parameter Cb + * @pps_cr_qp_offset: specify the offsets to the luma quantization parameter Cr + * @num_tile_columns_minus1: this value plus 1 specifies the number of tile columns + * partitioning the picture + * @num_tile_rows_minus1: this value plus 1 specifies the number of tile rows partitioning + * the picture + * @column_width_minus1: this value plus 1 specifies the width of the each tile column in + * units of coding tree blocks + * @row_height_minus1: this value plus 1 specifies the height of the each tile row in + * units of coding tree blocks + * @pps_beta_offset_div2: specify the default deblocking parameter offsets for + * beta divided by 2 + * @pps_tc_offset_div2: specify the default deblocking parameter offsets for tC + * divided by 2 + * @log2_parallel_merge_level_minus2: this value plus 2 specifies the value of + * the variable Log2ParMrgLevel + * @reserved: padding field. Should be zeroed by applications. + * @flags: see V4L2_HEVC_PPS_FLAG_{} + */ +struct v4l2_ctrl_hevc_pps { + __u8 pic_parameter_set_id; + __u8 num_extra_slice_header_bits; + __u8 num_ref_idx_l0_default_active_minus1; + __u8 num_ref_idx_l1_default_active_minus1; + __s8 init_qp_minus26; + __u8 diff_cu_qp_delta_depth; + __s8 pps_cb_qp_offset; + __s8 pps_cr_qp_offset; + __u8 num_tile_columns_minus1; + __u8 num_tile_rows_minus1; + __u8 column_width_minus1[20]; + __u8 row_height_minus1[22]; + __s8 pps_beta_offset_div2; + __s8 pps_tc_offset_div2; + __u8 log2_parallel_merge_level_minus2; + __u8 reserved; + __u64 flags; +}; + +#define V4L2_HEVC_DPB_ENTRY_LONG_TERM_REFERENCE 0x01 + +#define V4L2_HEVC_SEI_PIC_STRUCT_FRAME 0 +#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_FIELD 1 +#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_FIELD 2 +#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_BOTTOM 3 +#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_TOP 4 +#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_BOTTOM_TOP 5 +#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM 6 +#define V4L2_HEVC_SEI_PIC_STRUCT_FRAME_DOUBLING 7 +#define V4L2_HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING 8 +#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_PAIRED_PREVIOUS_BOTTOM 9 +#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_PAIRED_PREVIOUS_TOP 10 +#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_PAIRED_NEXT_BOTTOM 11 +#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_PAIRED_NEXT_TOP 12 + +#define V4L2_HEVC_DPB_ENTRIES_NUM_MAX 16 + +/** + * struct v4l2_hevc_dpb_entry - HEVC decoded picture buffer entry + * + * @timestamp: timestamp of the V4L2 capture buffer to use as reference. + * @flags: long term flag for the reference frame + * @field_pic: whether the reference is a field picture or a frame. + * @reserved: padding field. Should be zeroed by applications. + * @pic_order_cnt_val: the picture order count of the current picture. + */ +struct v4l2_hevc_dpb_entry { + __u64 timestamp; + __u8 flags; + __u8 field_pic; + __u16 reserved; + __s32 pic_order_cnt_val; +}; + +/** + * struct v4l2_hevc_pred_weight_table - HEVC weighted prediction parameters + * + * @delta_luma_weight_l0: the difference of the weighting factor applied + * to the luma prediction value for list 0 + * @luma_offset_l0: the additive offset applied to the luma prediction value + * for list 0 + * @delta_chroma_weight_l0: the difference of the weighting factor applied + * to the chroma prediction values for list 0 + * @chroma_offset_l0: the difference of the additive offset applied to + * the chroma prediction values for list 0 + * @delta_luma_weight_l1: the difference of the weighting factor applied + * to the luma prediction value for list 1 + * @luma_offset_l1: the additive offset applied to the luma prediction value + * for list 1 + * @delta_chroma_weight_l1: the difference of the weighting factor applied + * to the chroma prediction values for list 1 + * @chroma_offset_l1: the difference of the additive offset applied to + * the chroma prediction values for list 1 + * @luma_log2_weight_denom: the base 2 logarithm of the denominator for + * all luma weighting factors + * @delta_chroma_log2_weight_denom: the difference of the base 2 logarithm + * of the denominator for all chroma + * weighting factors + */ +struct v4l2_hevc_pred_weight_table { + __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]; + + __u8 luma_log2_weight_denom; + __s8 delta_chroma_log2_weight_denom; +}; + +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_LUMA (1ULL << 0) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_CHROMA (1ULL << 1) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_TEMPORAL_MVP_ENABLED (1ULL << 2) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_MVD_L1_ZERO (1ULL << 3) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_CABAC_INIT (1ULL << 4) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_COLLOCATED_FROM_L0 (1ULL << 5) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_USE_INTEGER_MV (1ULL << 6) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_DEBLOCKING_FILTER_DISABLED (1ULL << 7) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 8) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT (1ULL << 9) + +/** + * struct v4l2_ctrl_hevc_slice_params - HEVC slice parameters + * + * This control is a dynamically sized 1-dimensional array, + * V4L2_CTRL_FLAG_DYNAMIC_ARRAY flag must be set when using it. + * + * @bit_size: size (in bits) of the current slice data + * @data_byte_offset: offset (in bytes) to the video data in the current slice data + * @num_entry_point_offsets: specifies the number of entry point offset syntax + * elements in the slice header. + * @nal_unit_type: specifies the coding type of the slice (B, P or I) + * @nuh_temporal_id_plus1: minus 1 specifies a temporal identifier for the NAL unit + * @slice_type: see V4L2_HEVC_SLICE_TYPE_{} + * @colour_plane_id: specifies the colour plane associated with the current slice + * @slice_pic_order_cnt: specifies the picture order count + * @num_ref_idx_l0_active_minus1: this value plus 1 specifies the maximum + * reference index for reference picture list 0 + * that may be used to decode the slice + * @num_ref_idx_l1_active_minus1: this value plus 1 specifies the maximum + * reference index for reference picture list 1 + * that may be used to decode the slice + * @collocated_ref_idx: specifies the reference index of the collocated picture used + * for temporal motion vector prediction + * @five_minus_max_num_merge_cand: specifies the maximum number of merging + * motion vector prediction candidates supported in + * the slice subtracted from 5 + * @slice_qp_delta: specifies the initial value of QpY to be used for the coding + * blocks in the slice + * @slice_cb_qp_offset: specifies a difference to be added to the value of pps_cb_qp_offset + * @slice_cr_qp_offset: specifies a difference to be added to the value of pps_cr_qp_offset + * @slice_act_y_qp_offset: screen content extension parameters + * @slice_act_cb_qp_offset: screen content extension parameters + * @slice_act_cr_qp_offset: screen content extension parameters + * @slice_beta_offset_div2: specify the deblocking parameter offsets for beta divided by 2 + * @slice_tc_offset_div2: specify the deblocking parameter offsets for tC divided by 2 + * @pic_struct: indicates whether a picture should be displayed as a frame or as one or + * more fields + * @reserved0: padding field. Should be zeroed by applications. + * @slice_segment_addr: specifies the address of the first coding tree block in + * the slice segment + * @ref_idx_l0: the list of L0 reference elements as indices in the DPB + * @ref_idx_l1: the list of L1 reference elements as indices in the DPB + * @short_term_ref_pic_set_size: specifies the size of short-term reference + * pictures set included in the SPS + * @long_term_ref_pic_set_size: specifies the size of long-term reference + * pictures set include in the SPS + * @pred_weight_table: the prediction weight coefficients for inter-picture + * prediction + * @reserved1: padding field. Should be zeroed by applications. + * @flags: see V4L2_HEVC_SLICE_PARAMS_FLAG_{} + */ +struct v4l2_ctrl_hevc_slice_params { + __u32 bit_size; + __u32 data_byte_offset; + __u32 num_entry_point_offsets; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: NAL unit header */ + __u8 nal_unit_type; + __u8 nuh_temporal_id_plus1; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + __u8 slice_type; + __u8 colour_plane_id; + __s32 slice_pic_order_cnt; + __u8 num_ref_idx_l0_active_minus1; + __u8 num_ref_idx_l1_active_minus1; + __u8 collocated_ref_idx; + __u8 five_minus_max_num_merge_cand; + __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; + __s8 slice_beta_offset_div2; + __s8 slice_tc_offset_div2; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture timing SEI message */ + __u8 pic_struct; + + __u8 reserved0[3]; + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + __u32 slice_segment_addr; + __u8 ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u8 ref_idx_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u16 short_term_ref_pic_set_size; + __u16 long_term_ref_pic_set_size; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */ + struct v4l2_hevc_pred_weight_table pred_weight_table; + + __u8 reserved1[2]; + __u64 flags; +}; + +#define V4L2_HEVC_DECODE_PARAM_FLAG_IRAP_PIC 0x1 +#define V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC 0x2 +#define V4L2_HEVC_DECODE_PARAM_FLAG_NO_OUTPUT_OF_PRIOR 0x4 + +/** + * struct v4l2_ctrl_hevc_decode_params - HEVC decode parameters + * + * @pic_order_cnt_val: picture order count + * @short_term_ref_pic_set_size: specifies the size of short-term reference + * pictures set included in the SPS of the first slice + * @long_term_ref_pic_set_size: specifies the size of long-term reference + * pictures set include in the SPS of the first slice + * @num_active_dpb_entries: the number of entries in dpb + * @num_poc_st_curr_before: the number of reference pictures in the short-term + * set that come before the current frame + * @num_poc_st_curr_after: the number of reference pictures in the short-term + * set that come after the current frame + * @num_poc_lt_curr: the number of reference pictures in the long-term set + * @poc_st_curr_before: provides the index of the short term before references + * in DPB array + * @poc_st_curr_after: provides the index of the short term after references + * in DPB array + * @poc_lt_curr: provides the index of the long term references in DPB array + * @reserved: padding field. Should be zeroed by applications. + * @dpb: the decoded picture buffer, for meta-data about reference frames + * @flags: see V4L2_HEVC_DECODE_PARAM_FLAG_{} + */ +struct v4l2_ctrl_hevc_decode_params { + __s32 pic_order_cnt_val; + __u16 short_term_ref_pic_set_size; + __u16 long_term_ref_pic_set_size; + __u8 num_active_dpb_entries; + __u8 num_poc_st_curr_before; + __u8 num_poc_st_curr_after; + __u8 num_poc_lt_curr; + __u8 poc_st_curr_before[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u8 poc_st_curr_after[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u8 poc_lt_curr[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u8 reserved[4]; + struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; + __u64 flags; +}; + +/** + * struct v4l2_ctrl_hevc_scaling_matrix - HEVC scaling lists parameters + * + * @scaling_list_4x4: scaling list is used for the scaling process for + * transform coefficients. The values on each scaling + * list are expected in raster scan order + * @scaling_list_8x8: scaling list is used for the scaling process for + * transform coefficients. The values on each scaling + * list are expected in raster scan order + * @scaling_list_16x16: scaling list is used for the scaling process for + * transform coefficients. The values on each scaling + * list are expected in raster scan order + * @scaling_list_32x32: scaling list is used for the scaling process for + * transform coefficients. The values on each scaling + * list are expected in raster scan order + * @scaling_list_dc_coef_16x16: scaling list is used for the scaling process + * for transform coefficients. The values on each + * scaling list are expected in raster scan order. + * @scaling_list_dc_coef_32x32: scaling list is used for the scaling process + * for transform coefficients. The values on each + * scaling list are expected in raster scan order. + */ +struct v4l2_ctrl_hevc_scaling_matrix { + __u8 scaling_list_4x4[6][16]; + __u8 scaling_list_8x8[6][64]; + __u8 scaling_list_16x16[6][64]; + __u8 scaling_list_32x32[2][64]; + __u8 scaling_list_dc_coef_16x16[6]; + __u8 scaling_list_dc_coef_32x32[2]; +}; + +#endif diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c index 463d352055..7feff43c28 100644 --- a/libavcodec/hevc_parser.c +++ b/libavcodec/hevc_parser.c @@ -98,6 +98,19 @@ static int hevc_parse_slice_header(AVCodecParserContext *s, H2645NAL *nal, avctx->profile = ps->sps->ptl.general_ptl.profile_idc; avctx->level = ps->sps->ptl.general_ptl.level_idc; + if (ps->sps->chroma_format_idc == 1) { + avctx->chroma_sample_location = ps->sps->vui.chroma_loc_info_present_flag ? + ps->sps->vui.chroma_sample_loc_type_top_field + 1 : + AVCHROMA_LOC_LEFT; + } + else if (ps->sps->chroma_format_idc == 2 || + ps->sps->chroma_format_idc == 3) { + avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT;; + } + else { + avctx->chroma_sample_location = AVCHROMA_LOC_UNSPECIFIED; + } + if (ps->vps->vps_timing_info_present_flag) { num = ps->vps->vps_num_units_in_tick; den = ps->vps->vps_time_scale; diff --git a/libavcodec/hevc_refs.c b/libavcodec/hevc_refs.c index 4f6d985ae6..eefae71275 100644 --- a/libavcodec/hevc_refs.c +++ b/libavcodec/hevc_refs.c @@ -96,18 +96,22 @@ static HEVCFrame *alloc_frame(HEVCContext *s) if (!frame->rpl_buf) goto fail; - frame->tab_mvf_buf = av_buffer_pool_get(s->tab_mvf_pool); - if (!frame->tab_mvf_buf) - goto fail; - frame->tab_mvf = (MvField *)frame->tab_mvf_buf->data; + if (s->tab_mvf_pool) { + frame->tab_mvf_buf = av_buffer_pool_get(s->tab_mvf_pool); + if (!frame->tab_mvf_buf) + goto fail; + frame->tab_mvf = (MvField *)frame->tab_mvf_buf->data; + } - frame->rpl_tab_buf = av_buffer_pool_get(s->rpl_tab_pool); - if (!frame->rpl_tab_buf) - goto fail; - frame->rpl_tab = (RefPicListTab **)frame->rpl_tab_buf->data; - frame->ctb_count = s->ps.sps->ctb_width * s->ps.sps->ctb_height; - for (j = 0; j < frame->ctb_count; j++) - frame->rpl_tab[j] = (RefPicListTab *)frame->rpl_buf->data; + if (s->rpl_tab_pool) { + frame->rpl_tab_buf = av_buffer_pool_get(s->rpl_tab_pool); + if (!frame->rpl_tab_buf) + goto fail; + frame->rpl_tab = (RefPicListTab **)frame->rpl_tab_buf->data; + frame->ctb_count = s->ps.sps->ctb_width * s->ps.sps->ctb_height; + for (j = 0; j < frame->ctb_count; j++) + frame->rpl_tab[j] = (RefPicListTab *)frame->rpl_buf->data; + } frame->frame->top_field_first = s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_TOP_FIELD; frame->frame->interlaced_frame = (s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_TOP_FIELD) || (s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_BOTTOM_FIELD); @@ -276,14 +280,17 @@ static int init_slice_rpl(HEVCContext *s) int ctb_count = frame->ctb_count; int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_segment_addr]; int i; + RefPicListTab * const tab = (RefPicListTab *)frame->rpl_buf->data + s->slice_idx; if (s->slice_idx >= frame->rpl_buf->size / sizeof(RefPicListTab)) return AVERROR_INVALIDDATA; - for (i = ctb_addr_ts; i < ctb_count; i++) - frame->rpl_tab[i] = (RefPicListTab *)frame->rpl_buf->data + s->slice_idx; + if (frame->rpl_tab) { + for (i = ctb_addr_ts; i < ctb_count; i++) + frame->rpl_tab[i] = tab; + } - frame->refPicList = (RefPicList *)frame->rpl_tab[ctb_addr_ts]; + frame->refPicList = tab->refPicList; return 0; } diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index 2231aed259..7b05b41441 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -333,6 +333,19 @@ static void export_stream_params(HEVCContext *s, const HEVCSPS *sps) ff_set_sar(avctx, sps->vui.sar); + if (sps->chroma_format_idc == 1) { + avctx->chroma_sample_location = sps->vui.chroma_loc_info_present_flag ? + sps->vui.chroma_sample_loc_type_top_field + 1 : + AVCHROMA_LOC_LEFT; + } + else if (sps->chroma_format_idc == 2 || + sps->chroma_format_idc == 3) { + avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT;; + } + else { + avctx->chroma_sample_location = AVCHROMA_LOC_UNSPECIFIED; + } + if (sps->vui.video_signal_type_present_flag) avctx->color_range = sps->vui.video_full_range_flag ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; @@ -392,14 +405,20 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps) #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \ CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \ CONFIG_HEVC_NVDEC_HWACCEL + \ + CONFIG_HEVC_V4L2REQUEST_HWACCEL + \ CONFIG_HEVC_VAAPI_HWACCEL + \ CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \ + CONFIG_HEVC_RPI4_8_HWACCEL + \ + CONFIG_HEVC_RPI4_10_HWACCEL + \ CONFIG_HEVC_VDPAU_HWACCEL) enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts; switch (sps->pix_fmt) { case AV_PIX_FMT_YUV420P: case AV_PIX_FMT_YUVJ420P: +#if CONFIG_HEVC_RPI4_8_HWACCEL + *fmt++ = AV_PIX_FMT_RPI4_8; +#endif #if CONFIG_HEVC_DXVA2_HWACCEL *fmt++ = AV_PIX_FMT_DXVA2_VLD; #endif @@ -418,9 +437,15 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps) #endif #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX; +#endif +#if CONFIG_HEVC_V4L2REQUEST_HWACCEL + *fmt++ = AV_PIX_FMT_DRM_PRIME; #endif break; case AV_PIX_FMT_YUV420P10: +#if CONFIG_HEVC_RPI4_10_HWACCEL + *fmt++ = AV_PIX_FMT_RPI4_10; +#endif #if CONFIG_HEVC_DXVA2_HWACCEL *fmt++ = AV_PIX_FMT_DXVA2_VLD; #endif @@ -439,6 +464,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps) #endif #if CONFIG_HEVC_NVDEC_HWACCEL *fmt++ = AV_PIX_FMT_CUDA; +#endif +#if CONFIG_HEVC_V4L2REQUEST_HWACCEL + *fmt++ = AV_PIX_FMT_DRM_PRIME; #endif break; case AV_PIX_FMT_YUV444P: @@ -485,6 +513,16 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps, if (!sps) return 0; + // If hwaccel then we don't need all the s/w decode helper arrays + if (s->avctx->hwaccel) { + export_stream_params(s, sps); + + s->avctx->pix_fmt = pix_fmt; + s->ps.sps = sps; + s->ps.vps = (HEVCVPS*) s->ps.vps_list[s->ps.sps->vps_id]->data; + return 0; + } + ret = pic_arrays_init(s, sps); if (ret < 0) goto fail; @@ -2901,11 +2939,13 @@ static int hevc_frame_start(HEVCContext *s) ((s->ps.sps->height >> s->ps.sps->log2_min_cb_size) + 1); int ret; - memset(s->horizontal_bs, 0, s->bs_width * s->bs_height); - memset(s->vertical_bs, 0, s->bs_width * s->bs_height); - memset(s->cbf_luma, 0, s->ps.sps->min_tb_width * s->ps.sps->min_tb_height); - memset(s->is_pcm, 0, (s->ps.sps->min_pu_width + 1) * (s->ps.sps->min_pu_height + 1)); - memset(s->tab_slice_address, -1, pic_size_in_ctb * sizeof(*s->tab_slice_address)); + if (s->horizontal_bs) { + memset(s->horizontal_bs, 0, s->bs_width * s->bs_height); + memset(s->vertical_bs, 0, s->bs_width * s->bs_height); + memset(s->cbf_luma, 0, s->ps.sps->min_tb_width * s->ps.sps->min_tb_height); + memset(s->is_pcm, 0, (s->ps.sps->min_pu_width + 1) * (s->ps.sps->min_pu_height + 1)); + memset(s->tab_slice_address, -1, pic_size_in_ctb * sizeof(*s->tab_slice_address)); + } s->is_decoded = 0; s->first_nal_type = s->nal_unit_type; @@ -3327,7 +3367,14 @@ static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output, s->ref = NULL; ret = decode_nal_units(s, avpkt->data, avpkt->size); if (ret < 0) + { + // Ensure that hwaccel knows this frame is over + if (s->avctx->hwaccel && s->avctx->hwaccel->abort_frame) { + s->avctx->hwaccel->abort_frame(s->avctx); + } + return ret; + } if (avctx->hwaccel) { if (s->ref && (ret = avctx->hwaccel->end_frame(avctx)) < 0) { @@ -3370,15 +3417,19 @@ static int hevc_ref_frame(HEVCContext *s, HEVCFrame *dst, HEVCFrame *src) if (ret < 0) return ret; - dst->tab_mvf_buf = av_buffer_ref(src->tab_mvf_buf); - if (!dst->tab_mvf_buf) - goto fail; - dst->tab_mvf = src->tab_mvf; + if (src->tab_mvf_buf) { + dst->tab_mvf_buf = av_buffer_ref(src->tab_mvf_buf); + if (!dst->tab_mvf_buf) + goto fail; + dst->tab_mvf = src->tab_mvf; + } - dst->rpl_tab_buf = av_buffer_ref(src->rpl_tab_buf); - if (!dst->rpl_tab_buf) - goto fail; - dst->rpl_tab = src->rpl_tab; + if (src->rpl_tab_buf) { + dst->rpl_tab_buf = av_buffer_ref(src->rpl_tab_buf); + if (!dst->rpl_tab_buf) + goto fail; + dst->rpl_tab = src->rpl_tab; + } dst->rpl_buf = av_buffer_ref(src->rpl_buf); if (!dst->rpl_buf) @@ -3697,6 +3748,15 @@ AVCodec ff_hevc_decoder = { #if CONFIG_HEVC_NVDEC_HWACCEL HWACCEL_NVDEC(hevc), #endif +#if CONFIG_HEVC_RPI4_8_HWACCEL + HWACCEL_RPI4_8(hevc), +#endif +#if CONFIG_HEVC_RPI4_10_HWACCEL + HWACCEL_RPI4_10(hevc), +#endif +#if CONFIG_HEVC_V4L2REQUEST_HWACCEL + HWACCEL_V4L2REQUEST(hevc), +#endif #if CONFIG_HEVC_VAAPI_HWACCEL HWACCEL_VAAPI(hevc), #endif diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h index 8e54cf73f9..2277aadf75 100644 --- a/libavcodec/hwaccels.h +++ b/libavcodec/hwaccels.h @@ -39,6 +39,9 @@ extern const AVHWAccel ff_hevc_d3d11va_hwaccel; extern const AVHWAccel ff_hevc_d3d11va2_hwaccel; extern const AVHWAccel ff_hevc_dxva2_hwaccel; extern const AVHWAccel ff_hevc_nvdec_hwaccel; +extern const AVHWAccel ff_hevc_rpi4_8_hwaccel; +extern const AVHWAccel ff_hevc_rpi4_10_hwaccel; +extern const AVHWAccel ff_hevc_v4l2request_hwaccel; extern const AVHWAccel ff_hevc_vaapi_hwaccel; extern const AVHWAccel ff_hevc_vdpau_hwaccel; extern const AVHWAccel ff_hevc_videotoolbox_hwaccel; diff --git a/libavcodec/hwconfig.h b/libavcodec/hwconfig.h index f421dc909f..f93283b893 100644 --- a/libavcodec/hwconfig.h +++ b/libavcodec/hwconfig.h @@ -24,6 +24,7 @@ #define HWACCEL_CAP_ASYNC_SAFE (1 << 0) +#define HWACCEL_CAP_MT_SAFE (1 << 1) typedef struct AVCodecHWConfigInternal { @@ -70,6 +71,12 @@ typedef struct AVCodecHWConfigInternal { HW_CONFIG_HWACCEL(1, 1, 0, D3D11, D3D11VA, ff_ ## codec ## _d3d11va2_hwaccel) #define HWACCEL_NVDEC(codec) \ HW_CONFIG_HWACCEL(1, 1, 0, CUDA, CUDA, ff_ ## codec ## _nvdec_hwaccel) +#define HWACCEL_RPI4_8(codec) \ + HW_CONFIG_HWACCEL(0, 0, 1, RPI4_8, NONE, ff_ ## codec ## _rpi4_8_hwaccel) +#define HWACCEL_RPI4_10(codec) \ + HW_CONFIG_HWACCEL(0, 0, 1, RPI4_10, NONE, ff_ ## codec ## _rpi4_10_hwaccel) +#define HWACCEL_V4L2REQUEST(codec) \ + HW_CONFIG_HWACCEL(1, 0, 0, DRM_PRIME, DRM, ff_ ## codec ## _v4l2request_hwaccel) #define HWACCEL_VAAPI(codec) \ HW_CONFIG_HWACCEL(1, 1, 1, VAAPI, VAAPI, ff_ ## codec ## _vaapi_hwaccel) #define HWACCEL_VDPAU(codec) \ diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c index cb15ac072a..f6261db962 100644 --- a/libavcodec/mmaldec.c +++ b/libavcodec/mmaldec.c @@ -24,6 +24,9 @@ * MMAL Video Decoder */ +#pragma GCC diagnostic push +// Many many redundant decls in the header files +#pragma GCC diagnostic ignored "-Wredundant-decls" #include #include #include @@ -31,6 +34,7 @@ #include #include #include +#pragma GCC diagnostic pop #include #include "avcodec.h" diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c index 9176027f15..0b0ff03c18 100644 --- a/libavcodec/pthread_frame.c +++ b/libavcodec/pthread_frame.c @@ -209,7 +209,8 @@ FF_ENABLE_DEPRECATION_WARNINGS /* if the previous thread uses hwaccel then we take the lock to ensure * the threads don't run concurrently */ - if (avctx->hwaccel) { + if (avctx->hwaccel && + !(avctx->hwaccel->caps_internal & HWACCEL_CAP_MT_SAFE)) { pthread_mutex_lock(&p->parent->hwaccel_mutex); p->hwaccel_serializing = 1; } @@ -636,7 +637,9 @@ void ff_thread_finish_setup(AVCodecContext *avctx) { if (!(avctx->active_thread_type&FF_THREAD_FRAME)) return; - if (avctx->hwaccel && !p->hwaccel_serializing) { + if (avctx->hwaccel && + !(avctx->hwaccel->caps_internal & HWACCEL_CAP_MT_SAFE) && + !p->hwaccel_serializing) { pthread_mutex_lock(&p->parent->hwaccel_mutex); p->hwaccel_serializing = 1; } diff --git a/libavcodec/raw.c b/libavcodec/raw.c index 079d5c5d10..0781f28615 100644 --- a/libavcodec/raw.c +++ b/libavcodec/raw.c @@ -294,6 +294,12 @@ const PixelFormatTag ff_raw_pix_fmt_tags[] = { { AV_PIX_FMT_RGB565LE,MKTAG( 3 , 0 , 0 , 0 ) }, /* flipped RGB565LE */ { AV_PIX_FMT_YUV444P, MKTAG('Y', 'V', '2', '4') }, /* YUV444P, swapped UV */ + /* RPI (Might as well define for everything) */ + { AV_PIX_FMT_SAND128, MKTAG('S', 'A', 'N', 'D') }, + { AV_PIX_FMT_RPI4_8, MKTAG('S', 'A', 'N', 'D') }, + { AV_PIX_FMT_SAND64_10, MKTAG('S', 'N', 'D', 'A') }, + { AV_PIX_FMT_RPI4_10, MKTAG('S', 'N', 'D', 'B') }, + { AV_PIX_FMT_NONE, 0 }, }; diff --git a/libavcodec/rawenc.c b/libavcodec/rawenc.c index d181b74570..b943dd0379 100644 --- a/libavcodec/rawenc.c +++ b/libavcodec/rawenc.c @@ -24,6 +24,7 @@ * Raw Video Encoder */ +#include "config.h" #include "avcodec.h" #include "raw.h" #include "internal.h" @@ -31,6 +32,10 @@ #include "libavutil/intreadwrite.h" #include "libavutil/imgutils.h" #include "libavutil/internal.h" +#include "libavutil/avassert.h" +#if CONFIG_SAND +#include "libavutil/rpi_sand_fns.h" +#endif static av_cold int raw_encode_init(AVCodecContext *avctx) { @@ -49,22 +54,114 @@ FF_ENABLE_DEPRECATION_WARNINGS return 0; } +#if CONFIG_SAND +static int raw_sand8_as_yuv420(AVCodecContext *avctx, AVPacket *pkt, + const AVFrame *frame) +{ + const int width = av_frame_cropped_width(frame); + const int height = av_frame_cropped_height(frame); + const int x0 = frame->crop_left; + const int y0 = frame->crop_top; + const int size = width * height * 3 / 2; + uint8_t * dst; + int ret; + + if ((ret = ff_alloc_packet2(avctx, pkt, size, size)) < 0) + return ret; + + dst = pkt->data; + + av_rpi_sand_to_planar_y8(dst, width, frame->data[0], frame->linesize[0], frame->linesize[3], x0, y0, width, height); + dst += width * height; + av_rpi_sand_to_planar_c8(dst, width / 2, dst + width * height / 4, width / 2, + frame->data[1], frame->linesize[1], av_rpi_sand_frame_stride2(frame), x0 / 2, y0 / 2, width / 2, height / 2); + return 0; +} + +static int raw_sand16_as_yuv420(AVCodecContext *avctx, AVPacket *pkt, + const AVFrame *frame) +{ + const int width = av_frame_cropped_width(frame); + const int height = av_frame_cropped_height(frame); + const int x0 = frame->crop_left; + const int y0 = frame->crop_top; + const int size = width * height * 3; + uint8_t * dst; + int ret; + + if ((ret = ff_alloc_packet2(avctx, pkt, size, size)) < 0) + return ret; + + dst = pkt->data; + + av_rpi_sand_to_planar_y16(dst, width * 2, frame->data[0], frame->linesize[0], frame->linesize[3], x0 * 2, y0, width * 2, height); + dst += width * height * 2; + av_rpi_sand_to_planar_c16(dst, width, dst + width * height / 2, width, + frame->data[1], frame->linesize[1], av_rpi_sand_frame_stride2(frame), x0, y0 / 2, width, height / 2); + return 0; +} + +static int raw_sand30_as_yuv420(AVCodecContext *avctx, AVPacket *pkt, + const AVFrame *frame) +{ + const int width = av_frame_cropped_width(frame); + const int height = av_frame_cropped_height(frame); + const int x0 = frame->crop_left; + const int y0 = frame->crop_top; + const int size = width * height * 3; + uint8_t * dst; + int ret; + + if ((ret = ff_alloc_packet2(avctx, pkt, size, size)) < 0) + return ret; + + dst = pkt->data; + + av_rpi_sand30_to_planar_y16(dst, width * 2, frame->data[0], frame->linesize[0], frame->linesize[3], x0, y0, width, height); + dst += width * height * 2; + av_rpi_sand30_to_planar_c16(dst, width, dst + width * height / 2, width, + frame->data[1], frame->linesize[1], av_rpi_sand_frame_stride2(frame), x0/2, y0 / 2, width/2, height / 2); + return 0; +} +#endif + + static int raw_encode(AVCodecContext *avctx, AVPacket *pkt, - const AVFrame *frame, int *got_packet) + const AVFrame *src_frame, int *got_packet) { - int ret = av_image_get_buffer_size(frame->format, - frame->width, frame->height, 1); + int ret; + AVFrame * frame = NULL; - if (ret < 0) +#if CONFIG_SAND + if (av_rpi_is_sand_frame(src_frame)) { + ret = av_rpi_is_sand8_frame(src_frame) ? raw_sand8_as_yuv420(avctx, pkt, src_frame) : + av_rpi_is_sand16_frame(src_frame) ? raw_sand16_as_yuv420(avctx, pkt, src_frame) : + av_rpi_is_sand30_frame(src_frame) ? raw_sand30_as_yuv420(avctx, pkt, src_frame) : -1; + *got_packet = (ret == 0); return ret; + } +#endif + + if ((frame = av_frame_clone(src_frame)) == NULL) { + ret = AVERROR(ENOMEM); + goto fail; + } + + if ((ret = av_frame_apply_cropping(frame, AV_FRAME_CROP_UNALIGNED)) < 0) + goto fail; + + ret = av_image_get_buffer_size(frame->format, + frame->width, frame->height, 1); + if (ret < 0) + goto fail; if ((ret = ff_alloc_packet2(avctx, pkt, ret, ret)) < 0) - return ret; + goto fail; if ((ret = av_image_copy_to_buffer(pkt->data, pkt->size, (const uint8_t **)frame->data, frame->linesize, frame->format, frame->width, frame->height, 1)) < 0) - return ret; + goto fail; if(avctx->codec_tag == AV_RL32("yuv2") && ret > 0 && frame->format == AV_PIX_FMT_YUYV422) { @@ -81,8 +178,14 @@ static int raw_encode(AVCodecContext *avctx, AVPacket *pkt, } } pkt->flags |= AV_PKT_FLAG_KEY; + av_frame_free(&frame); *got_packet = 1; return 0; + +fail: + av_frame_free(&frame); + *got_packet = 0; + return ret; } AVCodec ff_rawvideo_encoder = { diff --git a/libavcodec/rpi_hevc_cabac.c b/libavcodec/rpi_hevc_cabac.c new file mode 100644 index 0000000000..58c094c5f8 --- /dev/null +++ b/libavcodec/rpi_hevc_cabac.c @@ -0,0 +1,2257 @@ +/* + * HEVC CABAC decoding + * + * Copyright (C) 2012 - 2013 Guillaume Martres + * Copyright (C) 2012 - 2013 Gildas Cocherel + * Copyright (C) 2012 - 2013 Gildas Cocherel + * Copyright (C) 2018 John Cox, Ben Avison, Peter de Rivaz for Raspberry Pi (Trading) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#define UNCHECKED_BITSTREAM_READER 1 + +#include "libavutil/attributes.h" +#include "libavutil/common.h" + +#include "cabac_functions.h" +#include "rpi_hevc_data.h" +#include "hevc.h" +#include "rpi_hevcdec.h" +#include "rpi_hevc_cabac_fns.h" + +#include "libavutil/rpi_sand_fns.h" + +// BY22 is probably faster than simple bypass if the processor has +// either a fast 32-bit divide or a fast 32x32->64[63:32] instruction +// x86 has fast int divide +// Arm doesn't have divide or general fast 64 bit, but does have the multiply +// * Beware: ARCH_xxx isn't set if configure --disable-asm is used +#define USE_BY22 (HAVE_FAST_64BIT || ARCH_ARM || ARCH_X86) +// Use native divide if we have a fast one - otherwise use mpy 1/x +// x86 has a fast integer divide - arm doesn't - unsure about other +// architectures +#define USE_BY22_DIV ARCH_X86 + +// Special case blocks with a single significant ceoff +// Decreases the complexity of the code for a common case but increases the +// code size. +#define USE_N_END_1 1 + +#if !USE_BY22_DIV +// * 1/x @ 32 bits gets us 22 bits of accuracy +#define CABAC_BY22_PEEK_BITS 22 +#else +// A real 32-bit divide gets us another bit +// If we have a 64 bit int & a unit time divider then we should get a lot +// of bits (55) but that is untested and it is unclear if it would give +// us a large advantage +#define CABAC_BY22_PEEK_BITS 23 +#endif + +#define CABAC_MAX_BIN 31 + + +#if USE_BY22 && !USE_BY22_DIV +#define I(x) (uint32_t)((0x10000000000ULL / (uint64_t)(x)) + 1ULL) + +static const uint32_t cabac_by22_inv_range[256] = { + 0, I(257), I(258), I(259), + I(260), I(261), I(262), I(263), I(264), I(265), I(266), I(267), I(268), I(269), + I(270), I(271), I(272), I(273), I(274), I(275), I(276), I(277), I(278), I(279), + I(280), I(281), I(282), I(283), I(284), I(285), I(286), I(287), I(288), I(289), + I(290), I(291), I(292), I(293), I(294), I(295), I(296), I(297), I(298), I(299), + I(300), I(301), I(302), I(303), I(304), I(305), I(306), I(307), I(308), I(309), + I(310), I(311), I(312), I(313), I(314), I(315), I(316), I(317), I(318), I(319), + I(320), I(321), I(322), I(323), I(324), I(325), I(326), I(327), I(328), I(329), + I(330), I(331), I(332), I(333), I(334), I(335), I(336), I(337), I(338), I(339), + I(340), I(341), I(342), I(343), I(344), I(345), I(346), I(347), I(348), I(349), + I(350), I(351), I(352), I(353), I(354), I(355), I(356), I(357), I(358), I(359), + I(360), I(361), I(362), I(363), I(364), I(365), I(366), I(367), I(368), I(369), + I(370), I(371), I(372), I(373), I(374), I(375), I(376), I(377), I(378), I(379), + I(380), I(381), I(382), I(383), I(384), I(385), I(386), I(387), I(388), I(389), + I(390), I(391), I(392), I(393), I(394), I(395), I(396), I(397), I(398), I(399), + I(400), I(401), I(402), I(403), I(404), I(405), I(406), I(407), I(408), I(409), + I(410), I(411), I(412), I(413), I(414), I(415), I(416), I(417), I(418), I(419), + I(420), I(421), I(422), I(423), I(424), I(425), I(426), I(427), I(428), I(429), + I(430), I(431), I(432), I(433), I(434), I(435), I(436), I(437), I(438), I(439), + I(440), I(441), I(442), I(443), I(444), I(445), I(446), I(447), I(448), I(449), + I(450), I(451), I(452), I(453), I(454), I(455), I(456), I(457), I(458), I(459), + I(460), I(461), I(462), I(463), I(464), I(465), I(466), I(467), I(468), I(469), + I(470), I(471), I(472), I(473), I(474), I(475), I(476), I(477), I(478), I(479), + I(480), I(481), I(482), I(483), I(484), I(485), I(486), I(487), I(488), I(489), + I(490), I(491), I(492), I(493), I(494), I(495), I(496), I(497), I(498), I(499), + I(500), I(501), I(502), I(503), I(504), I(505), I(506), I(507), I(508), I(509), + I(510), I(511) +}; +#undef I +#endif // USE_BY22 + +#if ARCH_ARM +#include "arm/rpi_hevc_cabac.h" +#endif + +/** + * number of bin by SyntaxElement. + */ +static const int8_t num_bins_in_se[] = { + 1, // sao_merge_flag + 1, // sao_type_idx + 0, // sao_eo_class + 0, // sao_band_position + 0, // sao_offset_abs + 0, // sao_offset_sign + 0, // end_of_slice_flag + 3, // split_coding_unit_flag + 1, // cu_transquant_bypass_flag + 3, // skip_flag + 3, // cu_qp_delta + 1, // pred_mode + 4, // part_mode + 0, // pcm_flag + 1, // prev_intra_luma_pred_mode + 0, // mpm_idx + 0, // rem_intra_luma_pred_mode + 2, // intra_chroma_pred_mode + 1, // merge_flag + 1, // merge_idx + 5, // inter_pred_idc + 2, // ref_idx_l0 + 2, // ref_idx_l1 + 2, // abs_mvd_greater0_flag + 2, // abs_mvd_greater1_flag + 0, // abs_mvd_minus2 + 0, // mvd_sign_flag + 1, // mvp_lx_flag + 1, // no_residual_data_flag + 3, // split_transform_flag + 2, // cbf_luma + 4, // cbf_cb, cbf_cr + 2, // transform_skip_flag[][] + 2, // explicit_rdpcm_flag[][] + 2, // explicit_rdpcm_dir_flag[][] + 18, // last_significant_coeff_x_prefix + 18, // last_significant_coeff_y_prefix + 0, // last_significant_coeff_x_suffix + 0, // last_significant_coeff_y_suffix + 4, // significant_coeff_group_flag + 44, // significant_coeff_flag + 24, // coeff_abs_level_greater1_flag + 6, // coeff_abs_level_greater2_flag + 0, // coeff_abs_level_remaining + 0, // coeff_sign_flag + 8, // log2_res_scale_abs + 2, // res_scale_sign_flag + 1, // cu_chroma_qp_offset_flag + 1, // cu_chroma_qp_offset_idx +}; + +/** + * Offset to ctxIdx 0 in init_values and states, indexed by SyntaxElement. + */ +static const int elem_offset[sizeof(num_bins_in_se)] = { + 0, // sao_merge_flag + 1, // sao_type_idx + 2, // sao_eo_class + 2, // sao_band_position + 2, // sao_offset_abs + 2, // sao_offset_sign + 2, // end_of_slice_flag + 2, // split_coding_unit_flag + 5, // cu_transquant_bypass_flag + 6, // skip_flag + 9, // cu_qp_delta + 12, // pred_mode + 13, // part_mode + 17, // pcm_flag + 17, // prev_intra_luma_pred_mode + 18, // mpm_idx + 18, // rem_intra_luma_pred_mode + 18, // intra_chroma_pred_mode + 20, // merge_flag + 21, // merge_idx + 22, // inter_pred_idc + 27, // ref_idx_l0 + 29, // ref_idx_l1 + 31, // abs_mvd_greater0_flag + 33, // abs_mvd_greater1_flag + 35, // abs_mvd_minus2 + 35, // mvd_sign_flag + 35, // mvp_lx_flag + 36, // no_residual_data_flag + 37, // split_transform_flag + 40, // cbf_luma + 42, // cbf_cb, cbf_cr + 46, // transform_skip_flag[][] + 48, // explicit_rdpcm_flag[][] + 50, // explicit_rdpcm_dir_flag[][] + 52, // last_significant_coeff_x_prefix + 70, // last_significant_coeff_y_prefix + 88, // last_significant_coeff_x_suffix + 88, // last_significant_coeff_y_suffix + 88, // significant_coeff_group_flag + 92, // significant_coeff_flag + 136, // coeff_abs_level_greater1_flag + 160, // coeff_abs_level_greater2_flag + 166, // coeff_abs_level_remaining + 166, // coeff_sign_flag + 166, // log2_res_scale_abs + 174, // res_scale_sign_flag + 176, // cu_chroma_qp_offset_flag + 177, // cu_chroma_qp_offset_idx +}; + +#define CNU 154 +/** + * Indexed by init_type + */ +static const uint8_t init_values[3][HEVC_CONTEXTS] = { + { // sao_merge_flag + 153, + // sao_type_idx + 200, + // split_coding_unit_flag + 139, 141, 157, + // cu_transquant_bypass_flag + 154, + // skip_flag + CNU, CNU, CNU, + // cu_qp_delta + 154, 154, 154, + // pred_mode + CNU, + // part_mode + 184, CNU, CNU, CNU, + // prev_intra_luma_pred_mode + 184, + // intra_chroma_pred_mode + 63, 139, + // merge_flag + CNU, + // merge_idx + CNU, + // inter_pred_idc + CNU, CNU, CNU, CNU, CNU, + // ref_idx_l0 + CNU, CNU, + // ref_idx_l1 + CNU, CNU, + // abs_mvd_greater1_flag + CNU, CNU, + // abs_mvd_greater1_flag + CNU, CNU, + // mvp_lx_flag + CNU, + // no_residual_data_flag + CNU, + // split_transform_flag + 153, 138, 138, + // cbf_luma + 111, 141, + // cbf_cb, cbf_cr + 94, 138, 182, 154, + // transform_skip_flag + 139, 139, + // explicit_rdpcm_flag + 139, 139, + // explicit_rdpcm_dir_flag + 139, 139, + // last_significant_coeff_x_prefix + 110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111, + 79, 108, 123, 63, + // last_significant_coeff_y_prefix + 110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111, + 79, 108, 123, 63, + // significant_coeff_group_flag + 91, 171, 134, 141, + // significant_coeff_flag + 111, 111, 125, 110, 110, 94, 124, 108, 124, 107, 125, 141, 179, 153, + 125, 107, 125, 141, 179, 153, 125, 107, 125, 141, 179, 153, 125, 140, + 139, 182, 182, 152, 136, 152, 136, 153, 136, 139, 111, 136, 139, 111, + 141, 111, + // coeff_abs_level_greater1_flag + 140, 92, 137, 138, 140, 152, 138, 139, 153, 74, 149, 92, 139, 107, + 122, 152, 140, 179, 166, 182, 140, 227, 122, 197, + // coeff_abs_level_greater2_flag + 138, 153, 136, 167, 152, 152, + // log2_res_scale_abs + 154, 154, 154, 154, 154, 154, 154, 154, + // res_scale_sign_flag + 154, 154, + // cu_chroma_qp_offset_flag + 154, + // cu_chroma_qp_offset_idx + 154, + }, + { // sao_merge_flag + 153, + // sao_type_idx + 185, + // split_coding_unit_flag + 107, 139, 126, + // cu_transquant_bypass_flag + 154, + // skip_flag + 197, 185, 201, + // cu_qp_delta + 154, 154, 154, + // pred_mode + 149, + // part_mode + 154, 139, 154, 154, + // prev_intra_luma_pred_mode + 154, + // intra_chroma_pred_mode + 152, 139, + // merge_flag + 110, + // merge_idx + 122, + // inter_pred_idc + 95, 79, 63, 31, 31, + // ref_idx_l0 + 153, 153, + // ref_idx_l1 + 153, 153, + // abs_mvd_greater1_flag + 140, 198, + // abs_mvd_greater1_flag + 140, 198, + // mvp_lx_flag + 168, + // no_residual_data_flag + 79, + // split_transform_flag + 124, 138, 94, + // cbf_luma + 153, 111, + // cbf_cb, cbf_cr + 149, 107, 167, 154, + // transform_skip_flag + 139, 139, + // explicit_rdpcm_flag + 139, 139, + // explicit_rdpcm_dir_flag + 139, 139, + // last_significant_coeff_x_prefix + 125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, 111, 111, 95, + 94, 108, 123, 108, + // last_significant_coeff_y_prefix + 125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, 111, 111, 95, + 94, 108, 123, 108, + // significant_coeff_group_flag + 121, 140, 61, 154, + // significant_coeff_flag + 155, 154, 139, 153, 139, 123, 123, 63, 153, 166, 183, 140, 136, 153, + 154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170, + 153, 123, 123, 107, 121, 107, 121, 167, 151, 183, 140, 151, 183, 140, + 140, 140, + // coeff_abs_level_greater1_flag + 154, 196, 196, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121, + 136, 137, 169, 194, 166, 167, 154, 167, 137, 182, + // coeff_abs_level_greater2_flag + 107, 167, 91, 122, 107, 167, + // log2_res_scale_abs + 154, 154, 154, 154, 154, 154, 154, 154, + // res_scale_sign_flag + 154, 154, + // cu_chroma_qp_offset_flag + 154, + // cu_chroma_qp_offset_idx + 154, + }, + { // sao_merge_flag + 153, + // sao_type_idx + 160, + // split_coding_unit_flag + 107, 139, 126, + // cu_transquant_bypass_flag + 154, + // skip_flag + 197, 185, 201, + // cu_qp_delta + 154, 154, 154, + // pred_mode + 134, + // part_mode + 154, 139, 154, 154, + // prev_intra_luma_pred_mode + 183, + // intra_chroma_pred_mode + 152, 139, + // merge_flag + 154, + // merge_idx + 137, + // inter_pred_idc + 95, 79, 63, 31, 31, + // ref_idx_l0 + 153, 153, + // ref_idx_l1 + 153, 153, + // abs_mvd_greater1_flag + 169, 198, + // abs_mvd_greater1_flag + 169, 198, + // mvp_lx_flag + 168, + // no_residual_data_flag + 79, + // split_transform_flag + 224, 167, 122, + // cbf_luma + 153, 111, + // cbf_cb, cbf_cr + 149, 92, 167, 154, + // transform_skip_flag + 139, 139, + // explicit_rdpcm_flag + 139, 139, + // explicit_rdpcm_dir_flag + 139, 139, + // last_significant_coeff_x_prefix + 125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, 126, 111, 111, + 79, 108, 123, 93, + // last_significant_coeff_y_prefix + 125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, 126, 111, 111, + 79, 108, 123, 93, + // significant_coeff_group_flag + 121, 140, 61, 154, + // significant_coeff_flag + 170, 154, 139, 153, 139, 123, 123, 63, 124, 166, 183, 140, 136, 153, + 154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170, + 153, 138, 138, 122, 121, 122, 121, 167, 151, 183, 140, 151, 183, 140, + 140, 140, + // coeff_abs_level_greater1_flag + 154, 196, 167, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121, + 136, 122, 169, 208, 166, 167, 154, 152, 167, 182, + // coeff_abs_level_greater2_flag + 107, 167, 91, 107, 107, 167, + // log2_res_scale_abs + 154, 154, 154, 154, 154, 154, 154, 154, + // res_scale_sign_flag + 154, 154, + // cu_chroma_qp_offset_flag + 154, + // cu_chroma_qp_offset_idx + 154, + }, +}; + +static const uint8_t scan_1x1[1] = { + 0, +}; + +static const uint8_t horiz_scan2x2_x[4] = { + 0, 1, 0, 1, +}; + +static const uint8_t horiz_scan2x2_y[4] = { + 0, 0, 1, 1 +}; + +static const uint8_t horiz_scan4x4_x[16] = { + 0, 1, 2, 3, + 0, 1, 2, 3, + 0, 1, 2, 3, + 0, 1, 2, 3, +}; + +static const uint8_t horiz_scan4x4_y[16] = { + 0, 0, 0, 0, + 1, 1, 1, 1, + 2, 2, 2, 2, + 3, 3, 3, 3, +}; + +static const uint8_t horiz_scan8x8_inv[8][8] = { + { 0, 1, 2, 3, 16, 17, 18, 19, }, + { 4, 5, 6, 7, 20, 21, 22, 23, }, + { 8, 9, 10, 11, 24, 25, 26, 27, }, + { 12, 13, 14, 15, 28, 29, 30, 31, }, + { 32, 33, 34, 35, 48, 49, 50, 51, }, + { 36, 37, 38, 39, 52, 53, 54, 55, }, + { 40, 41, 42, 43, 56, 57, 58, 59, }, + { 44, 45, 46, 47, 60, 61, 62, 63, }, +}; + +static const uint8_t diag_scan2x2_x[4] = { + 0, 0, 1, 1, +}; + +static const uint8_t diag_scan2x2_y[4] = { + 0, 1, 0, 1, +}; + +static const uint8_t diag_scan2x2_inv[2][2] = { + { 0, 2, }, + { 1, 3, }, +}; + +static const uint8_t diag_scan4x4_inv[4][4] = { + { 0, 2, 5, 9, }, + { 1, 4, 8, 12, }, + { 3, 7, 11, 14, }, + { 6, 10, 13, 15, }, +}; + +static const uint8_t diag_scan8x8_inv[8][8] = { + { 0, 2, 5, 9, 14, 20, 27, 35, }, + { 1, 4, 8, 13, 19, 26, 34, 42, }, + { 3, 7, 12, 18, 25, 33, 41, 48, }, + { 6, 11, 17, 24, 32, 40, 47, 53, }, + { 10, 16, 23, 31, 39, 46, 52, 57, }, + { 15, 22, 30, 38, 45, 51, 56, 60, }, + { 21, 29, 37, 44, 50, 55, 59, 62, }, + { 28, 36, 43, 49, 54, 58, 61, 63, }, +}; + + +typedef struct +{ + uint16_t coeff; + uint16_t scale; +} xy_off_t; + +#define XYT_C(x,y,t) ((x) + ((y) << (t))) +#define SCALE_TRAFO(t) ((t) > 3 ? 3 : (t)) +#define SCALE_SHR(t) ((t) - SCALE_TRAFO(t)) +#define XYT_S(x,y,t) (((x) >> SCALE_SHR(t)) + (((y) >> SCALE_SHR(t)) << SCALE_TRAFO(t))) + +#define XYT(x,y,t) {XYT_C(x,y,t), XYT_S(x,y,t)} + +#define OFF_DIAG(t) {\ + XYT(0,0,t), XYT(0,1,t), XYT(1,0,t), XYT(0,2,t),\ + XYT(1,1,t), XYT(2,0,t), XYT(0,3,t), XYT(1,2,t),\ + XYT(2,1,t), XYT(3,0,t), XYT(1,3,t), XYT(2,2,t),\ + XYT(3,1,t), XYT(2,3,t), XYT(3,2,t), XYT(3,3,t)\ +} + +#define OFF_HORIZ(t) {\ + XYT(0,0,t), XYT(1,0,t), XYT(2,0,t), XYT(3,0,t),\ + XYT(0,1,t), XYT(1,1,t), XYT(2,1,t), XYT(3,1,t),\ + XYT(0,2,t), XYT(1,2,t), XYT(2,2,t), XYT(3,2,t),\ + XYT(0,3,t), XYT(1,3,t), XYT(2,3,t), XYT(3,3,t)\ +} + +#define OFF_VERT(t) {\ + XYT(0,0,t), XYT(0,1,t), XYT(0,2,t), XYT(0,3,t),\ + XYT(1,0,t), XYT(1,1,t), XYT(1,2,t), XYT(1,3,t),\ + XYT(2,0,t), XYT(2,1,t), XYT(2,2,t), XYT(2,3,t),\ + XYT(3,0,t), XYT(3,1,t), XYT(3,2,t), XYT(3,3,t)\ +} + +static const xy_off_t off_xys[3][4][16] = +{ + {OFF_DIAG(2), OFF_DIAG(3), OFF_DIAG(4), OFF_DIAG(5)}, + {OFF_HORIZ(2), OFF_HORIZ(3), OFF_HORIZ(4), OFF_HORIZ(5)}, + {OFF_VERT(2), OFF_VERT(3), OFF_VERT(4), OFF_VERT(5)} +}; + + +// Helper fns +#ifndef hevc_mem_bits32 +static av_always_inline uint32_t hevc_mem_bits32(const void * buf, const unsigned int offset) +{ + return AV_RB32((const uint8_t *)buf + (offset >> 3)) << (offset & 7); +} +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,4) && !defined(hevc_clz32) +#define hevc_clz32 hevc_clz32_builtin +static av_always_inline unsigned int hevc_clz32_builtin(const uint32_t x) +{ + // __builtin_clz says it works on ints - so adjust if int is >32 bits long + return __builtin_clz(x) - (sizeof(int) * 8 - 32); +} +#endif + +// It is unlikely that we will ever need this but include for completeness +#ifndef hevc_clz32 +static inline unsigned int hevc_clz32(unsigned int x) +{ + unsigned int n = 1; + if ((x & 0xffff0000) == 0) { + n += 16; + x <<= 16; + } + if ((x & 0xff000000) == 0) { + n += 8; + x <<= 8; + } + if ((x & 0xf0000000) == 0) { + n += 4; + x <<= 4; + } + if ((x & 0xc0000000) == 0) { + n += 2; + x <<= 2; + } + return n - ((x >> 31) & 1); +} +#endif + +static inline int cabac_overflow(const CABACContext * const cc) +{ + av_assert0(cc->bytestream >= cc->bytestream_start); + return cc->bytestream >= cc->bytestream_end + 4; +} + +int ff_hevc_rpi_cabac_overflow(const HEVCRpiLocalContext * const lc) +{ + return cabac_overflow(&lc->cc); +} + +#if !USE_BY22 +// If no by22 then _by22 functions will revert to normal and so _peek/_flush +// will no longer be called but the setup calls will still exist and we want +// to null them out +#define bypass_start(s) +#define bypass_finish(s) +#else +// Use BY22 for residual bypass block + +#define bypass_start(cc) get_cabac_by22_start(cc) +#define bypass_finish(cc) get_cabac_by22_finish(cc) + +// BY22 notes that bypass is simply a divide into the bitstream and so we +// can peek out large quantities of bits at once and treat the result as if +// it was VLC. In many cases this will lead to O(1) processing rather than +// O(n) though the setup and teardown is sufficiently expensive that it is +// only worth using if we expect to be dealing with more than a few bits +// The definition of "a few bits" will vary from platform to platform but +// tests on ARM show that it probably isn't worth it for a single coded +// residual, but is for >1 - it also seems likely that if there are +// more residuals then they are likely to be bigger and this will make the +// O(1) nature of the code more worthwhile. + + +// Bypass block start +// Must be called before _by22_peek is used as it sets the CABAC environment +// into the correct state. _by22_finish must be called to return to 'normal' +// (i.e. non-bypass) cabac decoding +#ifndef get_cabac_by22_start +static inline void get_cabac_by22_start(CABACContext * const c) +{ + const unsigned int bits = __builtin_ctz(c->low); + const uint32_t m = hevc_mem_bits32(c->bytestream, 0); + uint32_t x = (c->low << (22 - CABAC_BITS)) ^ ((m ^ 0x80000000U) >> (9 + CABAC_BITS - bits)); +#if !USE_BY22_DIV + const uint32_t inv = cabac_by22_inv_range[c->range & 0xff]; +#endif + + c->bytestream -= (CABAC_BITS / 8); + c->by22.bits = bits; +#if !USE_BY22_DIV + c->by22.range = c->range; + c->range = inv; +#endif + c->low = x; +} +#endif + +// Bypass block finish +// Must be called at the end of the bypass block to return to normal operation +static inline void get_cabac_by22_finish(CABACContext * const c) +{ + unsigned int used = c->by22.bits; + unsigned int bytes_used = (used / CABAC_BITS) * (CABAC_BITS / 8); + unsigned int bits_used = used & (CABAC_BITS == 16 ? 15 : 7); + + c->bytestream += bytes_used + (CABAC_BITS / 8); + c->low = (((uint32_t)c->low >> (22 - CABAC_BITS + bits_used)) | 1) << bits_used; +#if !USE_BY22_DIV + c->range = c->by22.range; +#endif +} + +// Peek bypass bits +// _by22_start must be called before _by22_peek is called and _by22_flush +// must be called afterwards to flush any used bits +// The actual number of valid bits returned is +// min(, CABAC_BY22_PEEK_BITS). CABAC_BY22_PEEK_BITS +// will be at least 22 which should be long enough for any prefix or suffix +// though probably not long enough for the worst case combination +#ifndef get_cabac_by22_peek +static inline uint32_t get_cabac_by22_peek(const CABACContext * const c) +{ +#if USE_BY22_DIV + return ((unsigned int)c->low / (unsigned int)c->range) << 9; +#else + uint32_t x = c->low & ~1U; + const uint32_t inv = c->range; + + if (inv != 0) + x = (uint32_t)(((uint64_t)x * (uint64_t)inv) >> 32); + + return x << 1; +#endif +} +#endif + +// Flush bypass bits peeked by _by22_peek +// Flush n bypass bits. n must be >= 1 to guarantee correct operation +// val is an unmodified copy of whatever _by22_peek returned +#ifndef get_cabac_by22_flush +static inline void get_cabac_by22_flush(CABACContext * c, const unsigned int n, const uint32_t val) +{ + // Subtract the bits used & reshift up to the top of the word +#if USE_BY22_DIV + const uint32_t low = (((unsigned int)c->low << n) - (((val >> (32 - n)) * (unsigned int)c->range) << 23)); +#else + const uint32_t low = (((uint32_t)c->low << n) - (((val >> (32 - n)) * c->by22.range) << 23)); +#endif + + // and refill lower bits + // We will probably OR over some existing bits but that doesn't matter + c->by22.bits += n; + c->low = low | (hevc_mem_bits32(c->bytestream, c->by22.bits) >> 9); +} +#endif + +#endif // USE_BY22 + + +void ff_hevc_rpi_save_states(HEVCRpiContext *s, const HEVCRpiLocalContext * const lc) +{ + memcpy(s->cabac_save->rice, lc->stat_coeff, 4); + memcpy(s->cabac_save->state, lc->cabac_state, HEVC_CONTEXTS); +} + +static void load_states(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc) +{ + memcpy(lc->stat_coeff, s->cabac_save->rice, 4); + memcpy(lc->cabac_state, s->cabac_save->state, HEVC_CONTEXTS); +} + +int ff_hevc_rpi_cabac_init_decoder(HEVCRpiLocalContext * const lc) +{ + GetBitContext * const gb = &lc->gb; + skip_bits(gb, 1); + align_get_bits(gb); + return ff_init_cabac_decoder(&lc->cc, + gb->buffer + get_bits_count(gb) / 8, + (get_bits_left(gb) + 7) / 8); +} + +static void cabac_init_state(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc) +{ + int init_type = 2 - s->sh.slice_type; + int i; + + if (s->sh.cabac_init_flag && s->sh.slice_type != HEVC_SLICE_I) + init_type ^= 3; + + for (i = 0; i < HEVC_CONTEXTS; i++) { + int init_value = init_values[init_type][i]; + int m = (init_value >> 4) * 5 - 45; + int n = ((init_value & 15) << 3) - 16; + int pre = 2 * (((m * av_clip(s->sh.slice_qp, 0, 51)) >> 4) + n) - 127; + + pre ^= pre >> 31; + if (pre > 124) + pre = 124 + (pre & 1); + lc->cabac_state[i] = pre; + } + + for (i = 0; i < 4; i++) + lc->stat_coeff[i] = 0; +} + +void ff_hevc_rpi_cabac_init(const HEVCRpiContext * const s, HEVCRpiLocalContext *const lc, const unsigned int ctb_flags) +{ + if (lc->cabac_init_req == 1 || (ctb_flags & CTB_TS_FLAGS_CIREQ) != 0) + { + lc->qPy_pred = s->sh.slice_qp; + cabac_init_state(s, lc); + } + else if ((ctb_flags & CTB_TS_FLAGS_CLOAD) != 0) + { + lc->qPy_pred = s->sh.slice_qp; + load_states(s, lc); + } + lc->cabac_init_req = 0; +} + +#define GET_CABAC_LC(ctx) get_cabac(&lc->cc, lc->cabac_state + (ctx)) + +int ff_hevc_rpi_get_cabac(CABACContext * const c, uint8_t * const state) +{ + return get_cabac_inline(c, state); +} + +int ff_hevc_rpi_get_cabac_terminate(CABACContext * const c) +{ + return get_cabac_terminate(c); +} + +int ff_hevc_rpi_sao_type_idx_decode(HEVCRpiLocalContext * const lc) +{ + if (!GET_CABAC_LC(elem_offset[SAO_TYPE_IDX])) + return 0; + + if (!get_cabac_bypass(&lc->cc)) + return SAO_BAND; + return SAO_EDGE; +} + +int ff_hevc_rpi_sao_band_position_decode(HEVCRpiLocalContext * const lc) +{ + int i; + int value = get_cabac_bypass(&lc->cc); + + for (i = 0; i < 4; i++) + value = (value << 1) | get_cabac_bypass(&lc->cc); + return value; +} + +int ff_hevc_rpi_sao_offset_abs_decode(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc) +{ + int i = 0; + int length = (1 << (FFMIN(s->ps.sps->bit_depth, 10) - 5)) - 1; + + while (i < length && get_cabac_bypass(&lc->cc)) + i++; + return i; +} + +int ff_hevc_rpi_sao_offset_sign_decode(HEVCRpiLocalContext * const lc) +{ + return get_cabac_bypass(&lc->cc); +} + +int ff_hevc_rpi_sao_eo_class_decode(HEVCRpiLocalContext * const lc) +{ + int ret = get_cabac_bypass(&lc->cc) << 1; + ret |= get_cabac_bypass(&lc->cc); + return ret; +} + +int ff_hevc_rpi_cu_qp_delta(HEVCRpiLocalContext * const lc) +{ + int val = 1; + + if (get_cabac(&lc->cc, lc->cabac_state + HEVC_BIN_CU_QP_DELTA) == 0) + return 0; + + while (val < 5 && + get_cabac(&lc->cc, lc->cabac_state + HEVC_BIN_CU_QP_DELTA + 1) != 0) + val++; + + if (val >= 5) { + unsigned int k = 0; + while (k < CABAC_MAX_BIN && get_cabac_bypass(&lc->cc)) { + val += 1 << k; + k++; + } +// if (k == CABAC_MAX_BIN) +// av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k); + + while (k--) + val += get_cabac_bypass(&lc->cc) << k; + } + return get_cabac_bypass(&lc->cc) ? -val : val; +} + +int ff_hevc_rpi_cu_chroma_qp_offset_idx(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc) +{ + int c_max= FFMAX(5, s->ps.pps->chroma_qp_offset_list_len_minus1); + int i = 0; + + while (i < c_max && GET_CABAC_LC(elem_offset[CU_CHROMA_QP_OFFSET_IDX])) + i++; + + return i; +} + +int ff_hevc_rpi_part_mode_decode(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, const int log2_cb_size) +{ + if (GET_CABAC_LC(elem_offset[PART_MODE])) // 1 + return PART_2Nx2N; + if (log2_cb_size == s->ps.sps->log2_min_cb_size) { + if (lc->cu.pred_mode == MODE_INTRA) // 0 + return PART_NxN; + if (GET_CABAC_LC(elem_offset[PART_MODE] + 1)) // 01 + return PART_2NxN; + if (log2_cb_size == 3) // 00 + return PART_Nx2N; + if (GET_CABAC_LC(elem_offset[PART_MODE] + 2)) // 001 + return PART_Nx2N; + return PART_NxN; // 000 + } + + if (!s->ps.sps->amp_enabled_flag) { + if (GET_CABAC_LC(elem_offset[PART_MODE] + 1)) // 01 + return PART_2NxN; + return PART_Nx2N; + } + + if (GET_CABAC_LC(elem_offset[PART_MODE] + 1)) { // 01X, 01XX + if (GET_CABAC_LC(elem_offset[PART_MODE] + 3)) // 011 + return PART_2NxN; + if (get_cabac_bypass(&lc->cc)) // 0101 + return PART_2NxnD; + return PART_2NxnU; // 0100 + } + + if (GET_CABAC_LC(elem_offset[PART_MODE] + 3)) // 001 + return PART_Nx2N; + if (get_cabac_bypass(&lc->cc)) // 0001 + return PART_nRx2N; + return PART_nLx2N; // 0000 +} + +int ff_hevc_rpi_mpm_idx_decode(HEVCRpiLocalContext * const lc) +{ + int i = 0; + while (i < 2 && get_cabac_bypass(&lc->cc)) + i++; + return i; +} + +int ff_hevc_rpi_rem_intra_luma_pred_mode_decode(HEVCRpiLocalContext * const lc) +{ + int i; + int value = get_cabac_bypass(&lc->cc); + + for (i = 0; i < 4; i++) + value = (value << 1) | get_cabac_bypass(&lc->cc); + return value; +} + +int ff_hevc_rpi_intra_chroma_pred_mode_decode(HEVCRpiLocalContext * const lc) +{ + int ret; + if (!GET_CABAC_LC(elem_offset[INTRA_CHROMA_PRED_MODE])) + return 4; + + ret = get_cabac_bypass(&lc->cc) << 1; + ret |= get_cabac_bypass(&lc->cc); + return ret; +} + +int ff_hevc_rpi_merge_idx_decode(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc) +{ + int i = GET_CABAC_LC(elem_offset[MERGE_IDX]); + + if (i != 0) { + while (i < s->sh.max_num_merge_cand-1 && get_cabac_bypass(&lc->cc)) + i++; + } + return i; +} + +int ff_hevc_rpi_inter_pred_idc_decode(HEVCRpiLocalContext * const lc, int nPbW, int nPbH) +{ + if (nPbW + nPbH == 12) + return GET_CABAC_LC(elem_offset[INTER_PRED_IDC] + 4); + if (GET_CABAC_LC(elem_offset[INTER_PRED_IDC] + lc->ct_depth)) + return PRED_BI; + + return GET_CABAC_LC(elem_offset[INTER_PRED_IDC] + 4); +} + +int ff_hevc_rpi_ref_idx_lx_decode(HEVCRpiLocalContext * const lc, const int num_ref_idx_lx) +{ + int i = 0; + int max = num_ref_idx_lx - 1; + int max_ctx = FFMIN(max, 2); + + while (i < max_ctx && GET_CABAC_LC(elem_offset[REF_IDX_L0] + i)) + i++; + if (i == 2) { + while (i < max && get_cabac_bypass(&lc->cc)) + i++; + } + + return i; +} + +static av_always_inline int abs_mvd_greater0_flag_decode(HEVCRpiLocalContext * const lc) +{ + return GET_CABAC_LC(elem_offset[ABS_MVD_GREATER0_FLAG]); +} + +static av_always_inline int abs_mvd_greater1_flag_decode(HEVCRpiLocalContext * const lc) +{ + return GET_CABAC_LC(elem_offset[ABS_MVD_GREATER1_FLAG] + 1); +} + +#if !USE_BY22 +static av_always_inline int mvd_decode(HEVCRpiLocalContext * const lc) +{ + int ret = 2; + int k = 1; + + while (k < CABAC_MAX_BIN && get_cabac_bypass(&lc->cc)) { + ret += 1U << k; + k++; + } + if (k == CABAC_MAX_BIN) { + av_log(NULL, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k); + return 0; + } + + while (k--) + ret += get_cabac_bypass(&lc->cc) << k; + return get_cabac_bypass_sign(&lc->cc, -ret); +} +#endif + +static av_always_inline int mvd_sign_flag_decode(HEVCRpiLocalContext * const lc) +{ + return get_cabac_bypass_sign(&lc->cc, -1); +} + +static int hevc_transform_skip_flag_decode(HEVCRpiLocalContext * const lc, int c_idx_nz) +{ + return GET_CABAC_LC(elem_offset[TRANSFORM_SKIP_FLAG] + c_idx_nz); +} + +static int explicit_rdpcm_flag_decode(HEVCRpiLocalContext * const lc, int c_idx_nz) +{ + return GET_CABAC_LC(elem_offset[EXPLICIT_RDPCM_FLAG] + c_idx_nz); +} + +static int explicit_rdpcm_dir_flag_decode(HEVCRpiLocalContext * const lc, int c_idx_nz) +{ + return GET_CABAC_LC(elem_offset[EXPLICIT_RDPCM_DIR_FLAG] + c_idx_nz); +} + + +int ff_hevc_rpi_log2_res_scale_abs(HEVCRpiLocalContext * const lc, const int idx) { + int i =0; + + while (i < 4 && GET_CABAC_LC(elem_offset[LOG2_RES_SCALE_ABS] + 4 * idx + i)) + i++; + + return i; +} + +static av_always_inline void last_significant_coeff_xy_prefix_decode(HEVCRpiLocalContext * const lc, int c_idx_nz, + int log2_size, int *last_scx_prefix, int *last_scy_prefix) +{ + int i = 0; + int max = (log2_size << 1) - 1; + int ctx_offset, ctx_shift; + + if (!c_idx_nz) { + ctx_offset = 3 * (log2_size - 2) + ((log2_size - 1) >> 2); + ctx_shift = (log2_size + 1) >> 2; + } else { + ctx_offset = 15; + ctx_shift = log2_size - 2; + } + while (i < max && + GET_CABAC_LC(elem_offset[LAST_SIGNIFICANT_COEFF_X_PREFIX] + (i >> ctx_shift) + ctx_offset)) + i++; + *last_scx_prefix = i; + + i = 0; + while (i < max && + GET_CABAC_LC(elem_offset[LAST_SIGNIFICANT_COEFF_Y_PREFIX] + (i >> ctx_shift) + ctx_offset)) + i++; + *last_scy_prefix = i; +} + +static av_always_inline int last_significant_coeff_suffix_decode(HEVCRpiLocalContext * const lc, + int last_significant_coeff_prefix) +{ + int i; + int length = (last_significant_coeff_prefix >> 1) - 1; + int value = get_cabac_bypass(&lc->cc); + + for (i = 1; i < length; i++) + value = (value << 1) | get_cabac_bypass(&lc->cc); + return value; +} + +static av_always_inline int significant_coeff_group_flag_decode(HEVCRpiLocalContext * const lc, int c_idx_nz, int ctx_cg) +{ + int inc; + + inc = (ctx_cg != 0) + (c_idx_nz << 1); + + return GET_CABAC_LC(elem_offset[SIGNIFICANT_COEFF_GROUP_FLAG] + inc); +} + +static av_always_inline int significant_coeff_flag_decode_0(HEVCRpiLocalContext * const lc, int offset) +{ + return GET_CABAC_LC(elem_offset[SIGNIFICANT_COEFF_FLAG] + offset); +} + +#if !USE_BY22 +#define coeff_abs_level_remaining_decode_bypass(s,r) coeff_abs_level_remaining_decode(s, r) +#endif + + +#ifndef coeff_abs_level_remaining_decode_bypass +static int coeff_abs_level_remaining_decode_bypass(CABACContext * const c, const unsigned int rice_param) +{ + uint32_t y; + unsigned int prefix; + unsigned int last_coeff_abs_level_remaining; + unsigned int n; + + y = get_cabac_by22_peek(c); + prefix = hevc_clz32(~y); + // y << prefix will always have top bit 0 + + if (prefix < 3) { + const unsigned int suffix = (y << prefix) >> (31 - rice_param); + last_coeff_abs_level_remaining = (prefix << rice_param) + suffix; + n = prefix + 1 + rice_param; + } + else if (prefix * 2 + rice_param <= CABAC_BY22_PEEK_BITS + 2) + { + const uint32_t suffix = ((y << prefix) | 0x80000000) >> (34 - (prefix + rice_param)); + + last_coeff_abs_level_remaining = (2 << rice_param) + suffix; + n = prefix * 2 + rice_param - 2; + } + else { + unsigned int suffix; + + get_cabac_by22_flush(c, prefix, y); + y = get_cabac_by22_peek(c); + + suffix = (y | 0x80000000) >> (34 - (prefix + rice_param)); + last_coeff_abs_level_remaining = (2 << rice_param) + suffix; + n = prefix + rice_param - 2; + } + + get_cabac_by22_flush(c, n, y); + + return last_coeff_abs_level_remaining; +} +#endif + +static int coeff_abs_level_remaining_decode(CABACContext * const c, int rc_rice_param) +{ + int prefix = 0; + int suffix = 0; + int last_coeff_abs_level_remaining; + int i; + + while (prefix < CABAC_MAX_BIN && get_cabac_bypass(c)) + prefix++; + if (prefix == CABAC_MAX_BIN) { +// av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", prefix); + return 0; + } + + if (prefix < 3) { + for (i = 0; i < rc_rice_param; i++) + suffix = (suffix << 1) | get_cabac_bypass(c); + last_coeff_abs_level_remaining = (prefix << rc_rice_param) + suffix; + } else { + int prefix_minus3 = prefix - 3; + for (i = 0; i < prefix_minus3 + rc_rice_param; i++) + suffix = (suffix << 1) | get_cabac_bypass(c); + last_coeff_abs_level_remaining = (((1 << prefix_minus3) + 3 - 1) + << rc_rice_param) + suffix; + } + + return last_coeff_abs_level_remaining; +} + +#if !USE_BY22 +#define coeff_sign_flag_decode_bypass coeff_sign_flag_decode +static inline uint32_t coeff_sign_flag_decode(CABACContext * const c, const unsigned int nb) +{ + unsigned int i; + uint32_t ret = 0; + + for (i = 0; i < nb; i++) + ret = (ret << 1) | get_cabac_bypass(c); + + return ret << (32 - nb); +} +#endif + +#ifndef coeff_sign_flag_decode_bypass +static inline uint32_t coeff_sign_flag_decode_bypass(CABACContext * const c, const unsigned int nb) +{ + uint32_t y; + y = get_cabac_by22_peek(c); + get_cabac_by22_flush(c, nb, y); + return y & ~(0xffffffffU >> nb); +} +#endif + + +#ifndef get_cabac_greater1_bits +static inline unsigned int get_cabac_greater1_bits(CABACContext * const c, const unsigned int n, + uint8_t * const state0) +{ + unsigned int i; + unsigned int rv = 0; + for (i = 0; i != n; ++i) { + const unsigned int idx = rv != 0 ? 0 : i < 3 ? i + 1 : 3; + const unsigned int b = get_cabac(c, state0 + idx); + rv = (rv << 1) | b; + } + return rv; +} +#endif + + +// N.B. levels returned are the values assuming coeff_abs_level_remaining +// is uncoded, so 1 must be added if it is coded. sum_abs also reflects +// this version of events. +static inline uint32_t get_greaterx_bits(HEVCRpiLocalContext * const lc, const unsigned int n_end, int * const levels, + int * const pprev_subset_coded, int * const psum, + const unsigned int idx0_gt1, const unsigned int idx_gt2) +{ + CABACContext * const c = &lc->cc; + uint8_t * const state0 = lc->cabac_state + idx0_gt1; + uint8_t * const state_gt2 = lc->cabac_state + idx_gt2; + unsigned int rv; + unsigned int i; + const unsigned int n = FFMIN(n_end, 8); + + // Really this is i != n but the simple unconditional loop is cheaper + // and faster + for (i = 0; i != 8; ++i) + levels[i] = 1; + + rv = get_cabac_greater1_bits(c, n, state0); + + *pprev_subset_coded = 0; + *psum = n; + + rv <<= (32 - n); + if (rv != 0) + { + *pprev_subset_coded = 1; + *psum = n + 1; + i = hevc_clz32(rv); + levels[i] = 2; + if (get_cabac(c, state_gt2) == 0) + { + // Unset first coded bit + rv &= ~(0x80000000U >> i); + } + } + + if (n_end > 8) { + const unsigned int g8 = n_end - 8; + rv |= ((1 << g8) - 1) << (24 - g8); + for (i = 0; i != g8; ++i) { + levels[i + 8] = 0; + } + } + + return rv; +} + +// extended_precision_processing_flag must be false given we are +// putting the result into a 16-bit array +// So trans_coeff_level must fit in 16 bits too (7.4.9.1 definition of coeff_abs_level_remaining) +// scale_m is uint8_t +// +// scale is [40 - 72] << [0..12] based on qp- worst case is (45 << 12) +// or it can be 2 (if we have transquant_bypass) +// shift is set to one less than we really want but would normally be +// s->ps.sps->bit_depth (max 16, min 8) + log2_trafo_size (max 5, min 2?) - 5 = max 16 min 5? +// however the scale shift is substracted from shift to a min 0 so scale_m worst = 45 << 6 +// This can still theoretically lead to overflow but the coding would have to be very odd (& inefficient) +// to achieve it + +#ifndef trans_scale_sat +static inline int trans_scale_sat(const int level, const unsigned int scale, const unsigned int scale_m, const unsigned int shift) +{ + return av_clip_int16((((level * (int)(scale * scale_m)) >> shift) + 1) >> 1); +} +#endif + + +#ifndef update_rice +static inline void update_rice(uint8_t * const stat_coeff, + const unsigned int last_coeff_abs_level_remaining, + const unsigned int c_rice_param) +{ + const unsigned int x = (last_coeff_abs_level_remaining << 1) >> c_rice_param; + if (x >= 6) + (*stat_coeff)++; + else if (x == 0 && *stat_coeff > 0) + (*stat_coeff)--; +} +#endif + + +// n must be > 0 on entry +#ifndef get_cabac_sig_coeff_flag_idxs +static inline uint8_t * get_cabac_sig_coeff_flag_idxs(CABACContext * const c, uint8_t * const state0, + unsigned int n, + const uint8_t const * ctx_map, + uint8_t * p) +{ + do { + if (get_cabac(c, state0 + ctx_map[n])) + *p++ = n; + } while (--n != 0); + return p; +} +#endif + + +static int get_sig_coeff_flag_idxs(CABACContext * const c, uint8_t * const state0, + unsigned int n, + const uint8_t * ctx_map, // const ptr here but not in asm + uint8_t * const flag_idx) +{ + int rv; + + rv = get_cabac_sig_coeff_flag_idxs(c, state0, n, ctx_map, flag_idx) - flag_idx; + + return rv; +} + +#define H4x4(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15) {\ + x0, x1, x2, x3,\ + x4, x5, x6, x7,\ + x8, x9, x10, x11,\ + x12, x13, x14, x15} + +#define V4x4(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15) {\ + x0, x4, x8, x12,\ + x1, x5, x9, x13,\ + x2, x6, x10, x14,\ + x3, x7, x11, x15} + +#define D4x4(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15) {\ + x0, x4, x1, x8,\ + x5, x2, x12, x9,\ + x6, x3, x13, x10,\ + x7, x14, x11, x15} + + +static inline int next_subset(HEVCRpiLocalContext * const lc, int i, const int c_idx_nz, + uint8_t * const significant_coeff_group_flag, + const uint8_t * const scan_x_cg, const uint8_t * const scan_y_cg, + int * const pPrev_sig) +{ + while (--i >= 0) { + uint8_t * const gf_y = scan_y_cg[i] + significant_coeff_group_flag; + const unsigned int x_cg = scan_x_cg[i]; + + // For the flag decode we only care about Z/NZ but + // we use the full Right * 2 + Down when calculating + // significant coeff flags so we obtain it here. + // + // The group flag array is one longer than it needs to + // be so we don't need to check for y_cg limits + const unsigned int prev_sig = ((gf_y[0] >> x_cg) & 2) | ((gf_y[1] >> x_cg) & 1); + + if (i == 0 || + significant_coeff_group_flag_decode(lc, c_idx_nz, prev_sig)) + { + gf_y[0] |= (1 << x_cg); + *pPrev_sig = prev_sig; + break; + } + } + + return i; +} + +static void rpi_add_residual(const HEVCRpiContext *const s, HEVCRpiJob * const jb, + const unsigned int log2_trafo_size, const unsigned int c_idx, + const unsigned int x0, const unsigned int y0, const int16_t * const coeffs) +{ + const AVFrame * const frame = s->frame; + const unsigned int stride = frame_stride1(s->frame, c_idx); + const unsigned int x = x0 >> ctx_hshift(s, c_idx); + const unsigned int y = y0 >> ctx_vshift(s, c_idx); + const int is_sliced = 1; // av_rpi_is_sand_frame(frame); + uint8_t * const dst = !is_sliced ? + s->frame->data[c_idx] + y * stride + (x << s->ps.sps->pixel_shift) : + c_idx == 0 ? + av_rpi_sand_frame_pos_y(frame, x, y) : + av_rpi_sand_frame_pos_c(frame, x, y); + + const unsigned int i = jb->intra.n; + HEVCPredCmd *const pc = jb->intra.cmds + i - 1; + + if (i != 0 && c_idx == 2 && pc->type == RPI_PRED_ADD_RESIDUAL_U && + pc->ta.dst == dst) + { + av_assert1(pc->size == log2_trafo_size && + pc->c_idx == 1 && + pc->ta.stride == stride); + + pc->type = RPI_PRED_ADD_RESIDUAL_C; + } + else if (i != 0 && c_idx == 2 && pc->type == RPI_PRED_ADD_DC_U && + pc->dc.dst == dst) + { + const int16_t dc = (int16_t)pc->dc.dc; // Discard top bits + av_assert1(pc->size == log2_trafo_size && + pc->c_idx == 1 && + pc->dc.stride == stride); + + // Rewrite as add residual - must rewrite all fields as different union member + pc->type = RPI_PRED_ADD_RESIDUAL_V; + pc->ta.buf = coeffs; + pc->ta.dst = dst; + pc->ta.stride = stride; + pc->ta.dc = dc; + } + else + { + HEVCPredCmd * const cmd = pc + 1; + jb->intra.n = i + 1; + + cmd->type = RPI_PRED_ADD_RESIDUAL + (is_sliced ? c_idx : 0); + cmd->size = log2_trafo_size; + cmd->ta.buf = coeffs; + cmd->ta.dst = dst; + cmd->ta.stride = stride; + cmd->ta.dc = 0; + } +} + + +static void rpi_add_dc(const HEVCRpiContext * const s, HEVCRpiJob * const jb, + const unsigned int log2_trafo_size, const unsigned int c_idx, + const unsigned int x0, const unsigned int y0, const int16_t * const coeffs) +{ + const AVFrame * const frame = s->frame; + const unsigned int stride = frame_stride1(s->frame, c_idx); + const unsigned int x = x0 >> ctx_hshift(s, c_idx); + const unsigned int y = y0 >> ctx_vshift(s, c_idx); + const int is_sliced = 1; + uint8_t * const dst = !is_sliced ? + s->frame->data[c_idx] + y * stride + (x << s->ps.sps->pixel_shift) : + c_idx == 0 ? + av_rpi_sand_frame_pos_y(frame, x, y) : + av_rpi_sand_frame_pos_c(frame, x, y); + + const unsigned int shift = FFMAX(14 - s->ps.sps->bit_depth, 0); + const int coeff = (coeffs[0] + (1 | (1 << shift))) >> (shift + 1); + + const unsigned int i = jb->intra.n; + HEVCPredCmd *const pc = jb->intra.cmds + i - 1; + + if (i != 0 && c_idx == 2 && pc->type == RPI_PRED_ADD_RESIDUAL_U && + pc->ta.dst == dst) + { + av_assert1(pc->size == log2_trafo_size && + pc->c_idx == 1 && + pc->ta.stride == stride); + + pc->ta.dc = (int16_t)coeff; + } + else if (i != 0 && c_idx == 2 && pc->type == RPI_PRED_ADD_DC_U && + pc->dc.dst == dst) + { + av_assert1(pc->size == log2_trafo_size && + pc->c_idx == 1 && + pc->dc.stride == stride && + (pc->dc.dc & ~0xffff) == 0); + + pc->dc.dc |= (coeff << 16); + } + else + { + HEVCPredCmd * const cmd = pc + 1; + jb->intra.n = i + 1; + + cmd->type = RPI_PRED_ADD_DC + c_idx; + cmd->size = log2_trafo_size; + cmd->dc.dst = dst; + cmd->dc.stride = stride; + cmd->dc.dc = c_idx == 0 ? coeff : c_idx == 2 ? coeff << 16 : coeff & 0xffff; + } +} + + +void ff_hevc_rpi_hls_residual_coding(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, + const int x0, const int y0, + const int log2_trafo_size, const enum ScanType scan_idx, + const int c_idx) +{ + int trans_skip_or_bypass = lc->cu.cu_transquant_bypass_flag; + + int last_significant_coeff_x, last_significant_coeff_y; + int num_coeff = 0; + int prev_subset_coded = 0; + + int num_last_subset; + int x_cg_last_sig, y_cg_last_sig; + + const uint8_t *scan_x_cg, *scan_y_cg; + const xy_off_t * const scan_xy_off = off_xys[scan_idx][log2_trafo_size - 2]; + + int use_vpu; +#if RPI_COMPRESS_COEFFS + int num_nonzero = 0; + int use_compress = 0; + int *coeffs32; +#endif + int use_dc = 0; + int16_t *coeffs; + uint8_t significant_coeff_group_flag[9] = {0}; // Allow 1 final byte that is always zero + int explicit_rdpcm_flag = 0; + int explicit_rdpcm_dir_flag; + + int i; + int shift,scale; + const uint8_t *scale_matrix = NULL; + uint8_t dc_scale; + const int c_idx_nz = (c_idx != 0); + const int pred_mode_intra = c_idx_nz ? lc->tu.intra_pred_mode_c : lc->tu.intra_pred_mode; + int prev_sig = 0; + int may_hide_sign; + + int16_t dummy_coeffs[16]; + + // Derive QP for dequant + if (!lc->cu.cu_transquant_bypass_flag) { + may_hide_sign = s->ps.pps->sign_data_hiding_flag; + + if (s->ps.pps->transform_skip_enabled_flag && + log2_trafo_size <= s->ps.pps->log2_max_transform_skip_block_size) { + int transform_skip_flag = hevc_transform_skip_flag_decode(lc, c_idx_nz); + if (transform_skip_flag) { + trans_skip_or_bypass = 1; + if (lc->cu.pred_mode == MODE_INTRA && + s->ps.sps->implicit_rdpcm_enabled_flag && + (pred_mode_intra == 10 || pred_mode_intra == 26)) { + may_hide_sign = 0; + } + } + } + + { + static const uint8_t level_scale[8] = { + 40, 45, 51, 57, 64, 72, 0, 0 // Pad to 8 + }; + const int qp6 = (int8_t)lc->tu.qp_divmod6[c_idx][lc->qp_y]; + + // Shift is set to one less than will actually occur as the scale + // and saturate step adds 1 and then shifts right again + scale = level_scale[qp6 & 7]; +// shift = s->ps.sps->bit_depth + log2_trafo_size - (int)(qp6 >> 3); + shift = log2_trafo_size - (qp6 >> 3); + + if (shift < 0) { + scale <<= -shift; + shift = 0; + } + } + + if (s->ps.sps->scaling_list_enable_flag && !(trans_skip_or_bypass && log2_trafo_size > 2)) { + const ScalingList * const sl = s->ps.pps->scaling_list_data_present_flag ? + &s->ps.pps->scaling_list : &s->ps.sps->scaling_list; + const unsigned int matrix_id = + lc->cu.pred_mode != MODE_INTRA ? 3 + c_idx : c_idx; + + scale_matrix = sl->sl[log2_trafo_size - 2][matrix_id]; + dc_scale = scale_matrix[0]; + if (log2_trafo_size >= 4) + dc_scale = sl->sl_dc[log2_trafo_size - 4][matrix_id]; + } + else + { + static const uint8_t sixteen_scale[64] = { + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16 + }; + scale_matrix = sixteen_scale; + dc_scale = 16; + } + } else { + static const uint8_t unit_scale[64] = { + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + }; + scale_matrix = unit_scale; + shift = 0; + scale = 2; // We will shift right to kill this + dc_scale = 1; + + may_hide_sign = 0; + } + + + + + if (lc->cu.pred_mode == MODE_INTER && s->ps.sps->explicit_rdpcm_enabled_flag && + trans_skip_or_bypass) { + explicit_rdpcm_flag = explicit_rdpcm_flag_decode(lc, c_idx_nz); + if (explicit_rdpcm_flag) { + may_hide_sign = 0; + explicit_rdpcm_dir_flag = explicit_rdpcm_dir_flag_decode(lc, c_idx_nz); + } + } + + last_significant_coeff_xy_prefix_decode(lc, c_idx_nz, log2_trafo_size, + &last_significant_coeff_x, &last_significant_coeff_y); + + if (last_significant_coeff_x > 3) { + int suffix = last_significant_coeff_suffix_decode(lc, last_significant_coeff_x); + last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) * + (2 + (last_significant_coeff_x & 1)) + + suffix; + } + + if (last_significant_coeff_y > 3) { + int suffix = last_significant_coeff_suffix_decode(lc, last_significant_coeff_y); + last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) * + (2 + (last_significant_coeff_y & 1)) + + suffix; + } + + if (scan_idx == SCAN_VERT) + FFSWAP(int, last_significant_coeff_x, last_significant_coeff_y); + + x_cg_last_sig = last_significant_coeff_x >> 2; + y_cg_last_sig = last_significant_coeff_y >> 2; + + switch (scan_idx) { + case SCAN_DIAG: { + int last_x_c = last_significant_coeff_x & 3; + int last_y_c = last_significant_coeff_y & 3; + + num_coeff = diag_scan4x4_inv[last_y_c][last_x_c]; + + switch (log2_trafo_size) { + case 2: + scan_x_cg = scan_1x1; + scan_y_cg = scan_1x1; + break; + case 3: + num_coeff += diag_scan2x2_inv[y_cg_last_sig][x_cg_last_sig] << 4; + scan_x_cg = diag_scan2x2_x; + scan_y_cg = diag_scan2x2_y; + break; + case 4: + num_coeff += diag_scan4x4_inv[y_cg_last_sig][x_cg_last_sig] << 4; + scan_x_cg = ff_hevc_rpi_diag_scan4x4_x; + scan_y_cg = ff_hevc_rpi_diag_scan4x4_y; + break; + case 5: + default: + num_coeff += diag_scan8x8_inv[y_cg_last_sig][x_cg_last_sig] << 4; + scan_x_cg = ff_hevc_rpi_diag_scan8x8_x; + scan_y_cg = ff_hevc_rpi_diag_scan8x8_y; + break; + } + break; + } + case SCAN_HORIZ: + scan_x_cg = horiz_scan2x2_x; + scan_y_cg = horiz_scan2x2_y; + num_coeff = horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x]; + break; + default: //SCAN_VERT + scan_x_cg = horiz_scan2x2_y; + scan_y_cg = horiz_scan2x2_x; + num_coeff = horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y]; + break; + } + num_coeff++; + num_last_subset = (num_coeff - 1) >> 4; + + significant_coeff_group_flag[y_cg_last_sig] = 1 << x_cg_last_sig; // 1st subset always significant + + { + const unsigned int ccount = 1 << (log2_trafo_size * 2); + const int special = trans_skip_or_bypass /* || lc->tu.cross_pf */; // These need special processing + use_vpu = 0; + use_dc = (num_coeff == 1) && !special && + !(lc->cu.pred_mode == MODE_INTRA && c_idx == 0 && log2_trafo_size == 2); + + if (use_dc) { + // Just need a little empty space + coeffs = dummy_coeffs; + // No need to clear + } + else + { + use_vpu = !special && log2_trafo_size >= 4; +#if RPI_COMPRESS_COEFFS + use_compress = use_vpu && lc->jb0->coeffs.s[log2_trafo_size - 2].packed; +#endif + coeffs = rpi_alloc_coeff_buf(lc->jb0, !use_vpu ? 0 : log2_trafo_size - 2, ccount); +#if RPI_COMPRESS_COEFFS + coeffs32 = (int*)coeffs; + if (!use_compress) +#endif +#if HAVE_NEON + rpi_zap_coeff_vals_neon(coeffs, log2_trafo_size - 2); +#else + memset(coeffs, 0, ccount * sizeof(int16_t)); +#endif + } + } + + i = num_last_subset; + do { + int implicit_non_zero_coeff = 0; + int n_end; + + uint8_t significant_coeff_flag_idx[16]; + unsigned int nb_significant_coeff_flag = 0; + + if (i == num_last_subset) { + // First time through + int last_scan_pos = num_coeff - (i << 4) - 1; + n_end = last_scan_pos - 1; + significant_coeff_flag_idx[0] = last_scan_pos; + nb_significant_coeff_flag = 1; + } else { + n_end = 15; + implicit_non_zero_coeff = (i != 0); + } + + if (n_end >= 0) { + static const uint8_t ctx_idx_maps_ts2[3][16] = { + D4x4(0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8), // log2_trafo_size == 2 + H4x4(0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8), // log2_trafo_size == 2 + V4x4(0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8) // log2_trafo_size == 2 + }; + // N.B. prev_sig = Right * 2 + Down + static const uint8_t ctx_idx_maps[3][4][16] = { + { + D4x4(1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0), // prev_sig == 0 + D4x4(2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0), // prev_sig == 1 + D4x4(2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0), // prev_sig == 2 + D4x4(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2) // prev_sig == 3, default + }, + { + H4x4(1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0), // prev_sig == 0 + H4x4(2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0), // prev_sig == 1 + H4x4(2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0), // prev_sig == 2 + H4x4(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2) // prev_sig == 3, default + }, + { + V4x4(1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0), // prev_sig == 0 + V4x4(2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0), // prev_sig == 1 + V4x4(2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0), // prev_sig == 2 + V4x4(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2) // prev_sig == 3, default + } + }; + const uint8_t *ctx_idx_map_p; + int scf_offset = 0; + + if (s->ps.sps->transform_skip_context_enabled_flag && trans_skip_or_bypass) { + ctx_idx_map_p = ctx_idx_maps[0][3]; + scf_offset = 40 + c_idx_nz; + } else { + if (c_idx_nz != 0) + scf_offset = 27; + + if (log2_trafo_size == 2) { + ctx_idx_map_p = ctx_idx_maps_ts2[scan_idx]; + } else { + ctx_idx_map_p = ctx_idx_maps[scan_idx][prev_sig]; + if (!c_idx_nz) { + if (i != 0) + scf_offset += 3; + + if (log2_trafo_size == 3) { + scf_offset += (scan_idx == SCAN_DIAG) ? 9 : 15; + } else { + scf_offset += 21; + } + } else { + if (log2_trafo_size == 3) + scf_offset += 9; + else + scf_offset += 12; + } + } + } + + if (n_end > 0) { + int cnt = get_sig_coeff_flag_idxs(&lc->cc, + lc->cabac_state + elem_offset[SIGNIFICANT_COEFF_FLAG] + scf_offset, + n_end, ctx_idx_map_p, + significant_coeff_flag_idx + nb_significant_coeff_flag); + + nb_significant_coeff_flag += cnt; + if (cnt != 0) { + implicit_non_zero_coeff = 0; + } + } + + if (implicit_non_zero_coeff == 0) { + if (s->ps.sps->transform_skip_context_enabled_flag && trans_skip_or_bypass) { + scf_offset = 42 + c_idx_nz; + } else { + if (i == 0) { + scf_offset = c_idx_nz ? 27 : 0; + } else { + scf_offset = 2 + scf_offset; + } + } + if (significant_coeff_flag_decode_0(lc, scf_offset) == 1) { + significant_coeff_flag_idx[nb_significant_coeff_flag] = 0; + nb_significant_coeff_flag++; + } + } else { + significant_coeff_flag_idx[nb_significant_coeff_flag] = 0; + nb_significant_coeff_flag++; + } + } +#if RPI_COMPRESS_COEFFS + if (use_compress && (nb_significant_coeff_flag + num_nonzero + 1 >= (1<<(2*log2_trafo_size-1)))) { // Overflow when half-full! + int16_t temp[32*32]; + const unsigned int ccount = 1 << (log2_trafo_size * 2); + lc->jb0->coeffs.s[log2_trafo_size - 2].packed = 0; + lc->jb0->coeffs.s[log2_trafo_size - 2].packed_n = lc->jb0->coeffs.s[log2_trafo_size - 2].n - ccount; // Don't want to unpack the last buffer + memcpy(temp, coeffs, sizeof(int)*num_nonzero); + coeffs32 = (int *)temp; + memset(coeffs, 0, ccount * sizeof(int16_t)); + num_nonzero--; + while (num_nonzero >= 0) { + const unsigned int res = coeffs32[num_nonzero]; + const unsigned int offset = res & 0xffff; + coeffs[ offset ] = res >> 16; + num_nonzero--; + } + use_compress = 0; + } +#endif + + if (nb_significant_coeff_flag != 0) { + const unsigned int gt1_idx_delta = (c_idx_nz << 2) | + ((i != 0 && !c_idx_nz) ? 2 : 0) | + prev_subset_coded; + const unsigned int idx0_gt1 = elem_offset[COEFF_ABS_LEVEL_GREATER1_FLAG] + + (gt1_idx_delta << 2); + const unsigned int idx_gt2 = elem_offset[COEFF_ABS_LEVEL_GREATER2_FLAG] + + gt1_idx_delta; + + const unsigned int x_cg = scan_x_cg[i]; + const unsigned int y_cg = scan_y_cg[i]; + int16_t * const blk_coeffs = coeffs + + ((x_cg + (y_cg << log2_trafo_size)) << 2); + // This calculation is 'wrong' for log2_traffo_size == 2 + // but that doesn't matter as in this case x_cg & y_cg + // are always 0 so result is correct (0) anyway + const uint8_t * const blk_scale = scale_matrix + + (((x_cg + (y_cg << 3)) << (5 - log2_trafo_size))); + + // * The following code block doesn't deal with these flags: + // (nor did the one it replaces) + // + // cabac_bypass_alignment_enabled_flag + // This should be easy but I can't find a test case + // extended_precision_processing_flag + // This can extend the required precision past 16bits + // so is probably tricky - also no example found yet + +#if USE_N_END_1 + if (nb_significant_coeff_flag == 1) { + // There is a small gain to be had from special casing the single + // transform coefficient case. The reduction in complexity + // makes up for the code duplicatioon. + + int trans_coeff_level = 1; + int coeff_sign_flag; + int coded_val = 0; + + // initialize first elem of coeff_bas_level_greater1_flag + prev_subset_coded = 0; + + if (get_cabac(&lc->cc, lc->cabac_state + idx0_gt1 + 1)) { + trans_coeff_level = 2; + prev_subset_coded = 1; + coded_val = get_cabac(&lc->cc, lc->cabac_state + idx_gt2); + } + + // Probably not worth the overhead of starting by22 for just one value + coeff_sign_flag = get_cabac_bypass(&lc->cc); + + if (coded_val) + { + if (!s->ps.sps->persistent_rice_adaptation_enabled_flag) { + trans_coeff_level = 3 + coeff_abs_level_remaining_decode(&lc->cc, 0); + } else { + uint8_t * const stat_coeff = + lc->stat_coeff + trans_skip_or_bypass + 2 - ((c_idx_nz) << 1); + const unsigned int c_rice_param = *stat_coeff >> 2; + const int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(&lc->cc, c_rice_param); + + trans_coeff_level = 3 + last_coeff_abs_level_remaining; + update_rice(stat_coeff, last_coeff_abs_level_remaining, c_rice_param); + } + } + + { + const xy_off_t * const xy_off = scan_xy_off + significant_coeff_flag_idx[0]; + const int k = (int32_t)(coeff_sign_flag << 31) >> 31; + const unsigned int scale_m = blk_scale[xy_off->scale]; + const int res = trans_scale_sat( + (trans_coeff_level ^ k) - k, // Apply sign + scale, + i == 0 && xy_off->coeff == 0 ? dc_scale : scale_m, + shift); +#if RPI_COMPRESS_COEFFS + if (use_compress) + coeffs32[num_nonzero++] = (res<<16) + (&blk_coeffs[xy_off->coeff] - coeffs); + else +#endif + blk_coeffs[xy_off->coeff] = res; + } + } + else +#endif + { + int sign_hidden = may_hide_sign; + int levels[16]; // Should be able to get away with int16_t but that fails some tests + uint32_t coeff_sign_flags; + uint32_t coded_vals = 0; + // Sum(abs(level[])) + // In fact we only need the bottom bit and in some future + // version that may be all we calculate + unsigned int sum_abs; + + coded_vals = get_greaterx_bits(lc, nb_significant_coeff_flag, levels, + &prev_subset_coded, &sum_abs, idx0_gt1, idx_gt2); + + if (significant_coeff_flag_idx[0] - significant_coeff_flag_idx[nb_significant_coeff_flag - 1] <= 3) + sign_hidden = 0; + + // -- Start bypass block + + bypass_start(&lc->cc); + + coeff_sign_flags = coeff_sign_flag_decode_bypass(&lc->cc, nb_significant_coeff_flag - sign_hidden); + + if (coded_vals != 0) + { + const int rice_adaptation_enabled = s->ps.sps->persistent_rice_adaptation_enabled_flag; + uint8_t * stat_coeff = !rice_adaptation_enabled ? NULL : + lc->stat_coeff + trans_skip_or_bypass + 2 - ((c_idx_nz) << 1); + int c_rice_param = !rice_adaptation_enabled ? 0 : *stat_coeff >> 2; + int * level = levels - 1; + + do { + { + const unsigned int z = hevc_clz32(coded_vals) + 1; + level += z; + coded_vals <<= z; + } + + { + const int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode_bypass(&lc->cc, c_rice_param); + const int trans_coeff_level = *level + last_coeff_abs_level_remaining + 1; + + sum_abs += last_coeff_abs_level_remaining + 1; + *level = trans_coeff_level; + + if (stat_coeff != NULL) + update_rice(stat_coeff, last_coeff_abs_level_remaining, c_rice_param); + stat_coeff = NULL; + + if (trans_coeff_level > (3 << c_rice_param) && + (c_rice_param < 4 || rice_adaptation_enabled)) + ++c_rice_param; + } + } while (coded_vals != 0); + } + + // sign_hidden = 0 or 1 so we can combine the tests + if ((sign_hidden & sum_abs) != 0) { + levels[nb_significant_coeff_flag - 1] = -levels[nb_significant_coeff_flag - 1]; + } + + bypass_finish(&lc->cc); + + // -- Finish bypass block + + // Scale loop + { + int m = nb_significant_coeff_flag - 1; + + // Deal with DC component (if any) first + if (i == 0 && significant_coeff_flag_idx[m] == 0) + { + const int k = (int32_t)(coeff_sign_flags << m) >> 31; + const int res = trans_scale_sat( + (levels[m] ^ k) - k, scale, dc_scale, shift); +#if RPI_COMPRESS_COEFFS + if (use_compress) + { + coeffs32[num_nonzero++] = (res<<16) + (blk_coeffs - coeffs); + } + else +#endif + { + blk_coeffs[0] = res; + } + --m; + } + +#if !USE_N_END_1 + // If N_END_1 set then m was at least 1 initially + if (m >= 0) +#endif + { + do { + const xy_off_t * const xy_off = scan_xy_off + + significant_coeff_flag_idx[m]; + const int k = (int32_t)(coeff_sign_flags << m) >> 31; + const int res = trans_scale_sat( + (levels[m] ^ k) - k, + scale, + blk_scale[xy_off->scale], + shift); +#if RPI_COMPRESS_COEFFS + if (use_compress) { + coeffs32[num_nonzero++] = (res<<16) + (&blk_coeffs[xy_off->coeff] - coeffs); + } else +#endif + blk_coeffs[xy_off->coeff] = res; + } while (--m >= 0); + } + } + + } + } + } while ((i = next_subset(lc, i, c_idx_nz, + significant_coeff_group_flag, scan_x_cg, scan_y_cg, &prev_sig)) >= 0 && + !cabac_overflow(&lc->cc)); + + if (lc->cu.cu_transquant_bypass_flag) { + if (explicit_rdpcm_flag || (s->ps.sps->implicit_rdpcm_enabled_flag && + (pred_mode_intra == 10 || pred_mode_intra == 26))) { + int mode = s->ps.sps->implicit_rdpcm_enabled_flag ? (pred_mode_intra == 26) : explicit_rdpcm_dir_flag; + + s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode); + } + } else { + if (trans_skip_or_bypass) { // Must be trans_skip as we've already dealt with bypass + int rot = s->ps.sps->transform_skip_rotation_enabled_flag && + log2_trafo_size == 2 && + lc->cu.pred_mode == MODE_INTRA; + if (rot) { + for (i = 0; i < 8; i++) + FFSWAP(int16_t, coeffs[i], coeffs[16 - i - 1]); + } + + s->hevcdsp.dequant(coeffs, log2_trafo_size); + + if (explicit_rdpcm_flag || (s->ps.sps->implicit_rdpcm_enabled_flag && + lc->cu.pred_mode == MODE_INTRA && + (pred_mode_intra == 10 || pred_mode_intra == 26))) { + int mode = explicit_rdpcm_flag ? explicit_rdpcm_dir_flag : (pred_mode_intra == 26); + + s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode); + } + } else if (lc->cu.pred_mode == MODE_INTRA && c_idx == 0 && log2_trafo_size == 2) { + s->hevcdsp.transform_4x4_luma(coeffs); + } + else if (!use_vpu) + { + int max_xy = FFMAX(last_significant_coeff_x, last_significant_coeff_y); + if (max_xy == 0) + { + if (use_dc) + rpi_add_dc(s, lc->jb0, log2_trafo_size, c_idx, x0, y0, coeffs); + else + s->hevcdsp.idct_dc[log2_trafo_size - 2](coeffs); + } + else { + int col_limit = last_significant_coeff_x + last_significant_coeff_y + 4; + if (max_xy < 4) + col_limit = FFMIN(4, col_limit); + else if (max_xy < 8) + col_limit = FFMIN(8, col_limit); + else if (max_xy < 12) + col_limit = FFMIN(24, col_limit); + s->hevcdsp.idct[log2_trafo_size - 2](coeffs, col_limit); + } + } + } + +#if 0 + // Mildly rotted - we support no mode where cross is valid + if (lc->tu.cross_pf) { + int16_t * const coeffs_y = (int16_t*)lc->edge_emu_buffer; + const int ccount = 1 << (log2_trafo_size * 2); + + for (i = 0; i < ccount; i++) { + coeffs[i] = coeffs[i] + ((lc->tu.res_scale_val * coeffs_y[i]) >> 3); + } + } +#endif + + if (!use_dc) { +#if RPI_COMPRESS_COEFFS + if (use_compress) { + coeffs32[num_nonzero] = 0; + } +#endif + rpi_add_residual(s, lc->jb0, log2_trafo_size, c_idx, x0, y0, coeffs); + } +} + +#if !USE_BY22 +// Stores results to lc +MvXY ff_hevc_rpi_hls_mvd_coding(HEVCRpiLocalContext * const lc) +{ + int x = abs_mvd_greater0_flag_decode(lc); + int y = abs_mvd_greater0_flag_decode(lc); + + if (x) + x += abs_mvd_greater1_flag_decode(lc); + if (y) + y += abs_mvd_greater1_flag_decode(lc); + + switch (x) { + case 2: x = mvd_decode(lc); break; + case 1: x = mvd_sign_flag_decode(lc); break; + case 0: x = 0; break; + } + + switch (y) { + case 2: y = mvd_decode(lc); break; + case 1: y = mvd_sign_flag_decode(lc); break; + case 0: y = 0; break; + } + return MV_XY(x,y); +} +#else +MvXY ff_hevc_rpi_hls_mvd_coding(HEVCRpiLocalContext * const lc) +{ + int x = abs_mvd_greater0_flag_decode(lc); + int y = abs_mvd_greater0_flag_decode(lc); + + if ((x | y) == 0) + return 0; + + if (x != 0) + x += abs_mvd_greater1_flag_decode(lc); + if (y != 0) + y += abs_mvd_greater1_flag_decode(lc); + + if ((x | y) == 1) + { + // Not worth starting BY22 + if (x != 0) + x = mvd_sign_flag_decode(lc); + if (y != 0) + y = mvd_sign_flag_decode(lc); + } + else + { + CABACContext * const cc = &lc->cc; + uint32_t val; + uint32_t b; + unsigned int n = 0; + + bypass_start(cc); + b = val = get_cabac_by22_peek(cc); + + if (x == 1) { + x = ((int32_t)b >> 31) | 1; + n = 1; + b <<= 1; + } + else if (x == 2) { + // EG1 so we have (leading one bits + 1) of suffix + // This makes prefix & suffix lengths the same + const unsigned int k = hevc_clz32(~b) + 1; + int s; + + av_assert2(k <= 15); + + b <<= k; + n = 2 * k + 1; // Includes suffix & sign + + // We need to have k*2 + 2 (prefix, suffix, sign, y-sign) bits peeked + // if we are going to do this without a flush + if (k > CABAC_BY22_PEEK_BITS / 2 - 1) + { + // Need too many bits - flush + // n = k + get_cabac_by22_flush(cc, k, val); + b = val = get_cabac_by22_peek(cc); + n = k + 1; + } + + x = (b >> (32 - k)) + (1 << k); + b <<= k; + s = (int32_t)b >> 31; + x = (x ^ s) - s; + b <<= 1; + + // Max abs value of an mv is 2^15 - 1 (i.e. a prefix len of 15 bits) + if (y > 1 && n > CABAC_BY22_PEEK_BITS - 15) + { + get_cabac_by22_flush(cc, n, val); + b = val = get_cabac_by22_peek(cc); + n = 0; + } + } + + if (y == 1) { + y = ((int32_t)b >> 31) | 1; + ++n; + // don't care about b anymore + } + else if (y == 2) { + const unsigned int k = hevc_clz32(~b) + 1; + int s; + + av_assert2(k <= 15); + + // We need to have k*2 + 1 (prefix, suffix, sign) bits peeked + // if we are going to do this without a flush + b <<= k; + n += 2 * k + 1; + + if (n > CABAC_BY22_PEEK_BITS) + { + // Need too many bits - flush + get_cabac_by22_flush(cc, n - (k + 1), val); + b = val = get_cabac_by22_peek(cc); + n = k + 1; + } + + y = (b >> (32 - k)) + (1 << k); + s = (int32_t)(b << k) >> 31; + y = (y ^ s) - s; + // don't care about b anymore + } + + get_cabac_by22_flush(cc, n, val); + bypass_finish(cc); + } + + return MV_XY(x, y); +} +#endif diff --git a/libavcodec/rpi_hevc_cabac_fns.h b/libavcodec/rpi_hevc_cabac_fns.h new file mode 100644 index 0000000000..ca191f00d9 --- /dev/null +++ b/libavcodec/rpi_hevc_cabac_fns.h @@ -0,0 +1,217 @@ +/* + * HEVC CABAC decoding + * + * Copyright (C) 2012 - 2013 Guillaume Martres + * Copyright (C) 2012 - 2013 Gildas Cocherel + * Copyright (C) 2012 - 2013 Gildas Cocherel + * Copyright (C) 2018 John Cox + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef AVCODEC_RPI_HEVC_CABAC_FNS_H +#define AVCODEC_RPI_HEVC_CABAC_FNS_H + +#include "config.h" +#include "rpi_hevcdec.h" + +void ff_hevc_rpi_save_states(HEVCRpiContext *s, const HEVCRpiLocalContext * const lc); +int ff_hevc_rpi_cabac_init_decoder(HEVCRpiLocalContext * const lc); +void ff_hevc_rpi_cabac_init(const HEVCRpiContext * const s, HEVCRpiLocalContext *const lc, const unsigned int ctb_flags); +int ff_hevc_rpi_sao_type_idx_decode(HEVCRpiLocalContext * const lc); +int ff_hevc_rpi_sao_band_position_decode(HEVCRpiLocalContext * const lc); +int ff_hevc_rpi_sao_offset_abs_decode(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc); +int ff_hevc_rpi_sao_offset_sign_decode(HEVCRpiLocalContext * const lc); +int ff_hevc_rpi_sao_eo_class_decode(HEVCRpiLocalContext * const lc); +int ff_hevc_rpi_part_mode_decode(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, const int log2_cb_size); +int ff_hevc_rpi_mpm_idx_decode(HEVCRpiLocalContext * const lc); +int ff_hevc_rpi_rem_intra_luma_pred_mode_decode(HEVCRpiLocalContext * const lc); +int ff_hevc_rpi_intra_chroma_pred_mode_decode(HEVCRpiLocalContext * const lc); +int ff_hevc_rpi_merge_idx_decode(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc); +int ff_hevc_rpi_inter_pred_idc_decode(HEVCRpiLocalContext * const lc, int nPbW, int nPbH); +int ff_hevc_rpi_ref_idx_lx_decode(HEVCRpiLocalContext * const lc, const int num_ref_idx_lx); +int ff_hevc_rpi_log2_res_scale_abs(HEVCRpiLocalContext * const lc, const int idx); + +//int ff_hevc_rpi_cu_qp_delta_sign_flag(HEVCRpiLocalContext * const lc); +int ff_hevc_rpi_cu_qp_delta(HEVCRpiLocalContext * const lc); +int ff_hevc_rpi_cu_chroma_qp_offset_idx(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc); +void ff_hevc_rpi_hls_residual_coding(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, + const int x0, const int y0, + const int log2_trafo_size, const enum ScanType scan_idx, + const int c_idx); + +MvXY ff_hevc_rpi_hls_mvd_coding(HEVCRpiLocalContext * const lc); +int ff_hevc_rpi_cabac_overflow(const HEVCRpiLocalContext * const lc); + +#define HEVC_BIN_SAO_MERGE_FLAG 0 +#define HEVC_BIN_SAO_TYPE_IDX 1 +#define HEVC_BIN_SAO_EO_CLASS 2 +#define HEVC_BIN_SAO_BAND_POSITION 2 +#define HEVC_BIN_SAO_OFFSET_ABS 2 +#define HEVC_BIN_SAO_OFFSET_SIGN 2 +#define HEVC_BIN_END_OF_SLICE_FLAG 2 +#define HEVC_BIN_SPLIT_CODING_UNIT_FLAG 2 +#define HEVC_BIN_CU_TRANSQUANT_BYPASS_FLAG 5 +#define HEVC_BIN_SKIP_FLAG 6 +#define HEVC_BIN_CU_QP_DELTA 9 +#define HEVC_BIN_PRED_MODE 12 +#define HEVC_BIN_PART_MODE 13 +#define HEVC_BIN_PCM_FLAG 17 +#define HEVC_BIN_PREV_INTRA_LUMA_PRED_MODE 17 +#define HEVC_BIN_MPM_IDX 18 +#define HEVC_BIN_REM_INTRA_LUMA_PRED_MODE 18 +#define HEVC_BIN_INTRA_CHROMA_PRED_MODE 18 +#define HEVC_BIN_MERGE_FLAG 20 +#define HEVC_BIN_MERGE_IDX 21 +#define HEVC_BIN_INTER_PRED_IDC 22 +#define HEVC_BIN_REF_IDX_L0 27 +#define HEVC_BIN_REF_IDX_L1 29 +#define HEVC_BIN_ABS_MVD_GREATER0_FLAG 31 +#define HEVC_BIN_ABS_MVD_GREATER1_FLAG 33 +#define HEVC_BIN_ABS_MVD_MINUS2 35 +#define HEVC_BIN_MVD_SIGN_FLAG 35 +#define HEVC_BIN_MVP_LX_FLAG 35 +#define HEVC_BIN_NO_RESIDUAL_DATA_FLAG 36 +#define HEVC_BIN_SPLIT_TRANSFORM_FLAG 37 +#define HEVC_BIN_CBF_LUMA 40 +#define HEVC_BIN_CBF_CB_CR 42 +#define HEVC_BIN_TRANSFORM_SKIP_FLAG 46 +#define HEVC_BIN_EXPLICIT_RDPCM_FLAG 48 +#define HEVC_BIN_EXPLICIT_RDPCM_DIR_FLAG 50 +#define HEVC_BIN_LAST_SIGNIFICANT_COEFF_X_PREFIX 52 +#define HEVC_BIN_LAST_SIGNIFICANT_COEFF_Y_PREFIX 70 +#define HEVC_BIN_LAST_SIGNIFICANT_COEFF_X_SUFFIX 88 +#define HEVC_BIN_LAST_SIGNIFICANT_COEFF_Y_SUFFIX 88 +#define HEVC_BIN_SIGNIFICANT_COEFF_GROUP_FLAG 88 +#define HEVC_BIN_SIGNIFICANT_COEFF_FLAG 92 +#define HEVC_BIN_COEFF_ABS_LEVEL_GREATER1_FLAG 136 +#define HEVC_BIN_COEFF_ABS_LEVEL_GREATER2_FLAG 160 +#define HEVC_BIN_COEFF_ABS_LEVEL_REMAINING 166 +#define HEVC_BIN_COEFF_SIGN_FLAG 166 +#define HEVC_BIN_LOG2_RES_SCALE_ABS 166 +#define HEVC_BIN_RES_SCALE_SIGN_FLAG 174 +#define HEVC_BIN_CU_CHROMA_QP_OFFSET_FLAG 176 +#define HEVC_BIN_CU_CHROMA_QP_OFFSET_IDX 177 + + +int ff_hevc_rpi_get_cabac(CABACContext * const c, uint8_t * const state); +int ff_hevc_rpi_get_cabac_terminate(CABACContext * const c); + +static inline const uint8_t* ff_hevc_rpi_cabac_skip_bytes(CABACContext * const c, int n) { + const uint8_t *ptr = c->bytestream; + + if (c->low & 0x1) + ptr--; +#if CABAC_BITS == 16 + if (c->low & 0x1FF) + ptr--; +#endif + if ((int) (c->bytestream_end - ptr) < n) + return NULL; + if (ff_init_cabac_decoder(c, ptr + n, c->bytestream_end - ptr - n) < 0) + return NULL; + + return ptr; +} + +static inline int ff_hevc_rpi_sao_merge_flag_decode(HEVCRpiLocalContext * const lc) +{ + return ff_hevc_rpi_get_cabac(&lc->cc, lc->cabac_state + HEVC_BIN_SAO_MERGE_FLAG); +} + +static inline int ff_hevc_rpi_cu_transquant_bypass_flag_decode(HEVCRpiLocalContext * const lc) +{ + return ff_hevc_rpi_get_cabac(&lc->cc, lc->cabac_state + HEVC_BIN_CU_TRANSQUANT_BYPASS_FLAG); +} + +static inline int ff_hevc_rpi_cu_chroma_qp_offset_flag(HEVCRpiLocalContext * const lc) +{ + return ff_hevc_rpi_get_cabac(&lc->cc, lc->cabac_state + HEVC_BIN_CU_CHROMA_QP_OFFSET_FLAG); +} + +static inline int ff_hevc_rpi_split_coding_unit_flag_decode(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, + const unsigned int ct_depth, + const unsigned int x0, const unsigned int y0) +{ + return ff_hevc_rpi_get_cabac(&lc->cc, lc->cabac_state + HEVC_BIN_SPLIT_CODING_UNIT_FLAG + + ((s->cabac_stash_left[y0 >> 3] >> 1) > ct_depth) + + ((s->cabac_stash_up[x0 >> 3] >> 1) > ct_depth)); +} + +static inline int ff_hevc_rpi_skip_flag_decode(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, + const int x0, const int y0, const int x_cb, const int y_cb) +{ + return ff_hevc_rpi_get_cabac(&lc->cc, lc->cabac_state + HEVC_BIN_SKIP_FLAG + + (s->cabac_stash_left[y0 >> 3] & 1) + + (s->cabac_stash_up[x0 >> 3] & 1)); +} + +static inline int ff_hevc_rpi_pred_mode_decode(HEVCRpiLocalContext * const lc) +{ + return ff_hevc_rpi_get_cabac(&lc->cc, lc->cabac_state + HEVC_BIN_PRED_MODE); +} + +static inline int ff_hevc_rpi_pcm_flag_decode(HEVCRpiLocalContext * const lc) +{ + return ff_hevc_rpi_get_cabac_terminate(&lc->cc); +} + +static inline int ff_hevc_rpi_prev_intra_luma_pred_flag_decode(HEVCRpiLocalContext * const lc) +{ + return ff_hevc_rpi_get_cabac(&lc->cc, lc->cabac_state + HEVC_BIN_PREV_INTRA_LUMA_PRED_MODE); +} + +static inline int ff_hevc_rpi_merge_flag_decode(HEVCRpiLocalContext * const lc) +{ + return ff_hevc_rpi_get_cabac(&lc->cc, lc->cabac_state + HEVC_BIN_MERGE_FLAG); +} + +static inline int ff_hevc_rpi_mvp_lx_flag_decode(HEVCRpiLocalContext * const lc) +{ + return ff_hevc_rpi_get_cabac(&lc->cc, lc->cabac_state + HEVC_BIN_MVP_LX_FLAG); +} + +static inline int ff_hevc_rpi_no_residual_syntax_flag_decode(HEVCRpiLocalContext * const lc) +{ + return ff_hevc_rpi_get_cabac(&lc->cc, lc->cabac_state + HEVC_BIN_NO_RESIDUAL_DATA_FLAG); +} + +static inline int ff_hevc_rpi_cbf_cb_cr_decode(HEVCRpiLocalContext * const lc, const int trafo_depth) +{ + return ff_hevc_rpi_get_cabac(&lc->cc, lc->cabac_state + HEVC_BIN_CBF_CB_CR + trafo_depth); +} + +static inline int ff_hevc_rpi_cbf_luma_decode(HEVCRpiLocalContext * const lc, const int trafo_depth) +{ + return ff_hevc_rpi_get_cabac(&lc->cc, lc->cabac_state + HEVC_BIN_CBF_LUMA + !trafo_depth); +} + +static inline int ff_hevc_rpi_split_transform_flag_decode(HEVCRpiLocalContext * const lc, const int log2_trafo_size) +{ + return ff_hevc_rpi_get_cabac(&lc->cc, lc->cabac_state + HEVC_BIN_SPLIT_TRANSFORM_FLAG + 5 - log2_trafo_size); +} + +static inline int ff_hevc_rpi_res_scale_sign_flag(HEVCRpiLocalContext *const lc, const int idx) +{ + return ff_hevc_rpi_get_cabac(&lc->cc, lc->cabac_state + HEVC_BIN_RES_SCALE_SIGN_FLAG + idx); +} + + + +#endif + diff --git a/libavcodec/rpi_hevc_data.c b/libavcodec/rpi_hevc_data.c new file mode 100644 index 0000000000..341bb77d9d --- /dev/null +++ b/libavcodec/rpi_hevc_data.c @@ -0,0 +1,75 @@ +/* + * HEVC shared tables + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "rpi_hevc_data.h" + +const uint8_t ff_hevc_rpi_diag_scan4x4_x[16] = { + 0, 0, 1, 0, + 1, 2, 0, 1, + 2, 3, 1, 2, + 3, 2, 3, 3, +}; + +const uint8_t ff_hevc_rpi_diag_scan4x4_y[16] = { + 0, 1, 0, 2, + 1, 0, 3, 2, + 1, 0, 3, 2, + 1, 3, 2, 3, +}; + +const uint8_t ff_hevc_rpi_diag_scan8x8_x[64] = { + 0, 0, 1, 0, + 1, 2, 0, 1, + 2, 3, 0, 1, + 2, 3, 4, 0, + 1, 2, 3, 4, + 5, 0, 1, 2, + 3, 4, 5, 6, + 0, 1, 2, 3, + 4, 5, 6, 7, + 1, 2, 3, 4, + 5, 6, 7, 2, + 3, 4, 5, 6, + 7, 3, 4, 5, + 6, 7, 4, 5, + 6, 7, 5, 6, + 7, 6, 7, 7, +}; + +const uint8_t ff_hevc_rpi_diag_scan8x8_y[64] = { + 0, 1, 0, 2, + 1, 0, 3, 2, + 1, 0, 4, 3, + 2, 1, 0, 5, + 4, 3, 2, 1, + 0, 6, 5, 4, + 3, 2, 1, 0, + 7, 6, 5, 4, + 3, 2, 1, 0, + 7, 6, 5, 4, + 3, 2, 1, 7, + 6, 5, 4, 3, + 2, 7, 6, 5, + 4, 3, 7, 6, + 5, 4, 7, 6, + 5, 7, 6, 7, +}; diff --git a/libavcodec/rpi_hevc_data.h b/libavcodec/rpi_hevc_data.h new file mode 100644 index 0000000000..0aee673d8b --- /dev/null +++ b/libavcodec/rpi_hevc_data.h @@ -0,0 +1,31 @@ +/* + * HEVC shared data tables + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_RPI_HEVC_DATA_H +#define AVCODEC_RPI_HEVC_DATA_H + +#include + +extern const uint8_t ff_hevc_rpi_diag_scan4x4_x[16]; +extern const uint8_t ff_hevc_rpi_diag_scan4x4_y[16]; +extern const uint8_t ff_hevc_rpi_diag_scan8x8_x[64]; +extern const uint8_t ff_hevc_rpi_diag_scan8x8_y[64]; + +#endif /* AVCODEC_RPI_HEVC_DATA_H */ diff --git a/libavcodec/rpi_hevc_filter.c b/libavcodec/rpi_hevc_filter.c new file mode 100644 index 0000000000..5125d1eb6b --- /dev/null +++ b/libavcodec/rpi_hevc_filter.c @@ -0,0 +1,1210 @@ +/* + * HEVC video decoder + * + * Originally by: + * Copyright (C) 2012 - 2013 Guillaume Martres + * Copyright (C) 2013 Seppo Tomperi + * Copyright (C) 2013 Wassim Hamidouche + * + * Substantially rewritten: + * Copyright (C) 2018 John Cox, Ben Avison for Raspberry Pi (Trading) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +//#define DISABLE_SAO +//#define DISABLE_DEBLOCK +//#define DISABLE_STRENGTHS +// define DISABLE_DEBLOCK_NONREF for a 6% speed boost (by skipping deblocking on unimportant frames) +//#define DISABLE_DEBLOCK_NONREF + +#include "libavutil/common.h" +#include "libavutil/internal.h" + +#include "rpi_hevcdec.h" + +#include "bit_depth_template.c" + +#include "rpi_qpu.h" +#include "rpi_zc.h" +#include "libavutil/rpi_sand_fns.h" + +#define LUMA 0 +#define CB 1 +#define CR 2 + +// tcoffset: -12,12; qp: 0,51; (bs-1)*2: 0,2 +// so -12,75 overall +static const uint8_t tctablex[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // -ve quant padding + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // -12..-1 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // QP 0...18 + 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, // QP 19...37 + 5, 5, 6, 6, 7, 8, 9, 10, 11, 13, 14, 16, 18, 20, 22, 24, // QP 38...53 + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24 // 54..75 +}; +#define tctable (tctablex + 12 + 6*8) + +static const uint8_t betatablex[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // -ve quant padding + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // -12..-1 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, // QP 0...18 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, // QP 19...37 + 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, // QP 38...51 + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 // 52..73 +}; +#define betatable (betatablex + 12 + 6*8) + +static inline int chroma_tc(const HEVCRpiContext * const s, const int qp_y, + const int c_idx, const int tc_offset) +{ + return tctable[(int)s->ps.pps->qp_dblk_x[c_idx][qp_y] + tc_offset + 2]; +} + +static inline int get_qPy_pred(const HEVCRpiContext * const s, const HEVCRpiLocalContext * const lc, + const unsigned int xBase, const unsigned int yBase) +{ + const unsigned int ctb_size_mask = (1 << s->ps.sps->log2_ctb_size) - 1; + const unsigned int MinCuQpDeltaSizeMask = ~0U << s->ps.pps->log2_min_cu_qp_delta_size; + const unsigned int xQgBase = xBase & MinCuQpDeltaSizeMask; + const unsigned int yQgBase = yBase & MinCuQpDeltaSizeMask; + const unsigned int min_cb_width = s->ps.sps->min_cb_width; + const unsigned int x_cb = xQgBase >> s->ps.sps->log2_min_cb_size; + const unsigned int y_cb = yQgBase >> s->ps.sps->log2_min_cb_size; + const int qPy_pred = lc->qPy_pred; + + return (((xQgBase & ctb_size_mask) == 0 ? qPy_pred : + s->qp_y_tab[(x_cb - 1) + y_cb * min_cb_width]) + + ((yQgBase & ctb_size_mask) == 0 ? qPy_pred : + s->qp_y_tab[x_cb + (y_cb - 1) * min_cb_width]) + 1) >> 1; +} + +// * Only called from bitstream decode in foreground +// so should be safe +void ff_hevc_rpi_set_qPy(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, int xBase, int yBase) +{ + const int qp_y = get_qPy_pred(s, lc, xBase, yBase); + + if (lc->tu.cu_qp_delta != 0) { + // ?? I suspect that the -bd_offset here leads to us adding it elsewhere + int off = s->ps.sps->qp_bd_offset; + lc->qp_y = FFUMOD(qp_y + lc->tu.cu_qp_delta + 52 + 2 * off, + 52 + off) - off; + } else + lc->qp_y = qp_y; +} + +static inline unsigned int pixel_shift(const HEVCRpiContext * const s, const unsigned int c_idx) +{ + return c_idx != 0 ? 1 + s->ps.sps->pixel_shift : s->ps.sps->pixel_shift; +} + +// "DSP" these? +static void copy_pixel(uint8_t *dst, const uint8_t *src, int pixel_shift) +{ + switch (pixel_shift) + { + case 2: + *(uint32_t *)dst = *(uint32_t *)src; + break; + case 1: + *(uint16_t *)dst = *(uint16_t *)src; + break; + default: + *dst = *src; + break; + } +} + +static void copy_CTB_to_hv(const HEVCRpiContext * const s, const uint8_t * const src, + ptrdiff_t stride_src, int x, int y, int width, int height, + int c_idx, int x_ctb, int y_ctb) +{ + const unsigned int sh = pixel_shift(s, c_idx); + const unsigned int w = s->ps.sps->width >> ctx_hshift(s, c_idx); + const unsigned int h = s->ps.sps->height >> ctx_vshift(s, c_idx); + + /* copy horizontal edges */ + memcpy(s->sao_pixel_buffer_h[c_idx] + (((2 * y_ctb) * w + x) << sh), + src, width << sh); + memcpy(s->sao_pixel_buffer_h[c_idx] + (((2 * y_ctb + 1) * w + x) << sh), + src + stride_src * (height - 1), width << sh); + + /* copy vertical edges */ + ff_hevc_rpi_copy_vert(s->sao_pixel_buffer_v[c_idx] + (((2 * x_ctb) * h + y) << sh), src, sh, height, 1 << sh, stride_src); + + ff_hevc_rpi_copy_vert(s->sao_pixel_buffer_v[c_idx] + (((2 * x_ctb + 1) * h + y) << sh), src + ((width - 1) << sh), sh, height, 1 << sh, stride_src); +} + +// N.B. Src & dst are swapped as this is a restore! +// x0 & y0 are in luma coords +// Width & height are in Y/C pels as appropriate +// * Clear scope for optimsation here but not used enough to be worth it +static void restore_tqb_pixels(const HEVCRpiContext * const s, + uint8_t *src1, const uint8_t *dst1, + const ptrdiff_t stride_src, const ptrdiff_t stride_dst, + const unsigned int x0, const unsigned int y0, + const unsigned int width, const int height, + const int c_idx) +{ + if (s->ps.pps->transquant_bypass_enable_flag || + s->ps.sps->pcm.loop_filter_disable_flag) + { + const uint8_t *pcm = s->is_pcm + (x0 >> 6) + (y0 >> 3) * s->ps.sps->pcm_width; + int blks_y = height >> (c_idx == 0 ? 3 : 2); + const unsigned int bwidth = 8 << s->ps.sps->pixel_shift; // Y & C have the same width in sand + const unsigned int bheight = (c_idx == 0) ? 8 : 4; + const unsigned int sh = ((x0 >> 3) & 7); + const unsigned int mask = (1 << (width >> (c_idx == 0 ? 3 : 2))) - 1; + + do { + unsigned int m = (*pcm >> sh) & mask; + uint8_t * bd = src1; + const uint8_t * bs = dst1; + while (m != 0) { + if ((m & 1) != 0) { + s->hevcdsp.cpy_blk(bd, stride_src, bs, stride_dst, bwidth, bheight); + } + m >>= 1; + bs += bwidth; + bd += bwidth; + } + src1 += stride_src * bheight; + dst1 += stride_dst * bheight; + pcm += s->ps.sps->pcm_width; + } while (--blks_y > 0); + } +} + +#define CTB(tab, x, y) ((tab)[(y) * s->ps.sps->ctb_width + (x)]) + +static void sao_filter_CTB(const HEVCRpiContext * const s, const int x, const int y) +{ +#if SAO_FILTER_N == 5 + static const uint8_t sao_tab[8] = { 0 /* 8 */, 1 /* 16 */, 2 /* 24 */, 2 /* 32 */, 3, 3 /* 48 */, 4, 4 /* 64 */}; +#elif SAO_FILTER_N == 6 + static const uint8_t sao_tab[8] = { 0 /* 8 */, 1 /* 16 */, 5 /* 24 */, 2 /* 32 */, 3, 3 /* 48 */, 4, 4 /* 64 */}; +#else +#error Confused by size of sao fn array +#endif + int c_idx; + int edges[4]; // 0 left 1 top 2 right 3 bottom + int x_ctb = x >> s->ps.sps->log2_ctb_size; + int y_ctb = y >> s->ps.sps->log2_ctb_size; + int ctb_addr_rs = y_ctb * s->ps.sps->ctb_width + x_ctb; + int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs]; + RpiSAOParams *sao = &CTB(s->sao, x_ctb, y_ctb); + // flags indicating unfilterable edges + uint8_t vert_edge[] = { 0, 0 }; + uint8_t horiz_edge[] = { 0, 0 }; + uint8_t diag_edge[] = { 0, 0, 0, 0 }; + uint8_t lfase = CTB(s->filter_slice_edges, x_ctb, y_ctb); + uint8_t no_tile_filter = s->ps.pps->tiles_enabled_flag && + !s->ps.pps->loop_filter_across_tiles_enabled_flag; + uint8_t restore = no_tile_filter || !lfase; + uint8_t left_tile_edge = 0; + uint8_t right_tile_edge = 0; + uint8_t up_tile_edge = 0; + uint8_t bottom_tile_edge = 0; + const int sliced = 1; + const int plane_count = sliced ? 2 : (ctx_cfmt(s) != 0 ? 3 : 1); + + edges[0] = x_ctb == 0; + edges[1] = y_ctb == 0; + edges[2] = x_ctb == s->ps.sps->ctb_width - 1; + edges[3] = y_ctb == s->ps.sps->ctb_height - 1; + +#ifdef DISABLE_SAO + return; +#endif + + if (restore) { + if (!edges[0]) { + left_tile_edge = no_tile_filter && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs-1]]; + vert_edge[0] = (!lfase && CTB(s->tab_slice_address, x_ctb, y_ctb) != CTB(s->tab_slice_address, x_ctb - 1, y_ctb)) || left_tile_edge; + } + if (!edges[2]) { + right_tile_edge = no_tile_filter && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs+1]]; + vert_edge[1] = (!lfase && CTB(s->tab_slice_address, x_ctb, y_ctb) != CTB(s->tab_slice_address, x_ctb + 1, y_ctb)) || right_tile_edge; + } + if (!edges[1]) { + up_tile_edge = no_tile_filter && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs - s->ps.sps->ctb_width]]; + horiz_edge[0] = (!lfase && CTB(s->tab_slice_address, x_ctb, y_ctb) != CTB(s->tab_slice_address, x_ctb, y_ctb - 1)) || up_tile_edge; + } + if (!edges[3]) { + bottom_tile_edge = no_tile_filter && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs + s->ps.sps->ctb_width]]; + horiz_edge[1] = (!lfase && CTB(s->tab_slice_address, x_ctb, y_ctb) != CTB(s->tab_slice_address, x_ctb, y_ctb + 1)) || bottom_tile_edge; + } + if (!edges[0] && !edges[1]) { + diag_edge[0] = (!lfase && CTB(s->tab_slice_address, x_ctb, y_ctb) != CTB(s->tab_slice_address, x_ctb - 1, y_ctb - 1)) || left_tile_edge || up_tile_edge; + } + if (!edges[1] && !edges[2]) { + diag_edge[1] = (!lfase && CTB(s->tab_slice_address, x_ctb, y_ctb) != CTB(s->tab_slice_address, x_ctb + 1, y_ctb - 1)) || right_tile_edge || up_tile_edge; + } + if (!edges[2] && !edges[3]) { + diag_edge[2] = (!lfase && CTB(s->tab_slice_address, x_ctb, y_ctb) != CTB(s->tab_slice_address, x_ctb + 1, y_ctb + 1)) || right_tile_edge || bottom_tile_edge; + } + if (!edges[0] && !edges[3]) { + diag_edge[3] = (!lfase && CTB(s->tab_slice_address, x_ctb, y_ctb) != CTB(s->tab_slice_address, x_ctb - 1, y_ctb + 1)) || left_tile_edge || bottom_tile_edge; + } + } + + for (c_idx = 0; c_idx < plane_count; c_idx++) { + const unsigned int vshift = ctx_vshift(s, c_idx); + const unsigned int hshift = ctx_hshift(s, c_idx); + const int x0 = x >> hshift; + const int y0 = y >> vshift; + const ptrdiff_t stride_src = frame_stride1(s->frame, c_idx); + const int ctb_size_h = (1 << (s->ps.sps->log2_ctb_size)) >> hshift; + const int ctb_size_v = (1 << (s->ps.sps->log2_ctb_size)) >> vshift; + const int width = FFMIN(ctb_size_h, (s->ps.sps->width >> hshift) - x0); + const int height = FFMIN(ctb_size_v, (s->ps.sps->height >> vshift) - y0); + int tab = sao_tab[(FFALIGN(width, 8) >> 3) - 1]; + ptrdiff_t stride_dst; + uint8_t *dst; + + const unsigned int sh = s->ps.sps->pixel_shift + (sliced && c_idx != 0); + const int wants_lr = sao->type_idx[c_idx] == SAO_EDGE && sao->eo_class[c_idx] != 1 /* Vertical */; + uint8_t * const src = !sliced ? + &s->frame->data[c_idx][y0 * stride_src + (x0 << sh)] : + c_idx == 0 ? + av_rpi_sand_frame_pos_y(s->frame, x0, y0) : + av_rpi_sand_frame_pos_c(s->frame, x0, y0); + const uint8_t * const src_l = edges[0] || !wants_lr ? NULL : + !sliced ? src - (1 << sh) : + c_idx == 0 ? + av_rpi_sand_frame_pos_y(s->frame, x0 - 1, y0) : + av_rpi_sand_frame_pos_c(s->frame, x0 - 1, y0); + const uint8_t * const src_r = edges[2] || !wants_lr ? NULL : + !sliced ? src + (width << sh) : + c_idx == 0 ? + av_rpi_sand_frame_pos_y(s->frame, x0 + width, y0) : + av_rpi_sand_frame_pos_c(s->frame, x0 + width, y0); + + if (sliced && c_idx > 1) { + break; + } + +// if (c_idx == 1) +// printf("%d: %dx%d %d,%d: lr=%d\n", c_idx, width, height, x0, y0, wants_lr); + + switch (sao->type_idx[c_idx]) { + case SAO_BAND: + copy_CTB_to_hv(s, src, stride_src, x0, y0, width, height, c_idx, + x_ctb, y_ctb); + if (s->ps.pps->transquant_bypass_enable_flag || + s->ps.sps->pcm.loop_filter_disable_flag) + { + // Can't use the edge buffer here as it may be in use by the foreground + DECLARE_ALIGNED(64, uint8_t, dstbuf) + [2*MAX_PB_SIZE*MAX_PB_SIZE]; + dst = dstbuf; + stride_dst = 2*MAX_PB_SIZE; + s->hevcdsp.cpy_blk(dst, stride_dst, src, stride_src, width << sh, height); + if (sliced && c_idx != 0) + { + s->hevcdsp.sao_band_filter_c[tab](src, dst, stride_src, stride_dst, + sao->offset_val[1], sao->band_position[1], + sao->offset_val[2], sao->band_position[2], + width, height); + } + else + { + s->hevcdsp.sao_band_filter[tab](src, dst, stride_src, stride_dst, + sao->offset_val[c_idx], sao->band_position[c_idx], + width, height); + } + restore_tqb_pixels(s, src, dst, stride_src, stride_dst, + x, y, width, height, c_idx); + } else { + if (sliced && c_idx != 0) + { + s->hevcdsp.sao_band_filter_c[tab](src, src, stride_src, stride_src, + sao->offset_val[1], sao->band_position[1], + sao->offset_val[2], sao->band_position[2], + width, height); + } + else + { + s->hevcdsp.sao_band_filter[tab](src, src, stride_src, stride_src, + sao->offset_val[c_idx], sao->band_position[c_idx], + width, height); + } + } + sao->type_idx[c_idx] = SAO_APPLIED; + break; + case SAO_EDGE: + { + const int w = s->ps.sps->width >> hshift; + const int h = s->ps.sps->height >> vshift; + int top_edge = edges[1]; + int bottom_edge = edges[3]; + // Can't use the edge buffer here as it may be in use by the foreground + DECLARE_ALIGNED(64, uint8_t, dstbuf) + [RPI_HEVC_SAO_BUF_STRIDE * (MAX_PB_SIZE + 2) + 64]; + + stride_dst = RPI_HEVC_SAO_BUF_STRIDE; + dst = dstbuf + stride_dst + 32; + + if (!top_edge) { + uint8_t *dst1; + int src_idx; + const uint8_t * const src_spb = s->sao_pixel_buffer_h[c_idx] + (((2 * y_ctb - 1) * w + x0) << sh); + + dst1 = dst - stride_dst; + + if (src_l != NULL) { + src_idx = (CTB(s->sao, x_ctb-1, y_ctb-1).type_idx[c_idx] == + SAO_APPLIED); + copy_pixel(dst1 - (1 << sh), src_idx ? src_spb - (1 << sh) : src_l - stride_src, sh); + } + + src_idx = (CTB(s->sao, x_ctb, y_ctb-1).type_idx[c_idx] == + SAO_APPLIED); + memcpy(dst1, src_idx ? src_spb : src - stride_src, width << sh); + + if (src_r != NULL) { + src_idx = (CTB(s->sao, x_ctb+1, y_ctb-1).type_idx[c_idx] == + SAO_APPLIED); + copy_pixel(dst1 + (width << sh), src_idx ? src_spb + (width << sh) : src_r - stride_src, sh); + } + } + if (!bottom_edge) { + uint8_t * const dst1 = dst + height * stride_dst; + int src_idx; + const uint8_t * const src_spb = s->sao_pixel_buffer_h[c_idx] + (((2 * y_ctb + 2) * w + x0) << sh); + const unsigned int hoff = height * stride_src; + + if (src_l != NULL) { + src_idx = (CTB(s->sao, x_ctb-1, y_ctb+1).type_idx[c_idx] == + SAO_APPLIED); + copy_pixel(dst1 - (1 << sh), src_idx ? src_spb - (1 << sh) : src_l + hoff, sh); + } + + src_idx = (CTB(s->sao, x_ctb, y_ctb+1).type_idx[c_idx] == + SAO_APPLIED); + memcpy(dst1, src_idx ? src_spb : src + hoff, width << sh); + + if (src_r != NULL) { + src_idx = (CTB(s->sao, x_ctb+1, y_ctb+1).type_idx[c_idx] == + SAO_APPLIED); + copy_pixel(dst1 + (width << sh), src_idx ? src_spb + (width << sh) : src_r + hoff, sh); + } + } + if (src_l != NULL) { + if (CTB(s->sao, x_ctb-1, y_ctb).type_idx[c_idx] == SAO_APPLIED) { + ff_hevc_rpi_copy_vert(dst - (1 << sh), + s->sao_pixel_buffer_v[c_idx] + (((2 * x_ctb - 1) * h + y0) << sh), + sh, height, stride_dst, 1 << sh); + } else { + ff_hevc_rpi_copy_vert(dst - (1 << sh), + src_l, + sh, height, stride_dst, stride_src); + } + } + if (src_r != NULL) { + if (CTB(s->sao, x_ctb+1, y_ctb).type_idx[c_idx] == SAO_APPLIED) { + ff_hevc_rpi_copy_vert(dst + (width << sh), + s->sao_pixel_buffer_v[c_idx] + (((2 * x_ctb + 2) * h + y0) << sh), + sh, height, stride_dst, 1 << sh); + } else { + ff_hevc_rpi_copy_vert(dst + (width << sh), + src_r, + sh, height, stride_dst, stride_src); + } + } + + s->hevcdsp.cpy_blk(dst, stride_dst, src, stride_src, width << sh, height); + + copy_CTB_to_hv(s, src, stride_src, x0, y0, width, height, c_idx, + x_ctb, y_ctb); + if (sliced && c_idx != 0) + { + // Class always the same for both U & V (which is just as well :-)) + s->hevcdsp.sao_edge_filter_c[tab](src, dst, stride_src, + sao->offset_val[1], sao->offset_val[2], sao->eo_class[1], + width, height); + s->hevcdsp.sao_edge_restore_c[restore](src, dst, + stride_src, stride_dst, + sao, + edges, width, + height, c_idx, + vert_edge, + horiz_edge, + diag_edge); + } + else + { + s->hevcdsp.sao_edge_filter[tab](src, dst, stride_src, sao->offset_val[c_idx], + sao->eo_class[c_idx], width, height); + s->hevcdsp.sao_edge_restore[restore](src, dst, + stride_src, stride_dst, + sao, + edges, width, + height, c_idx, + vert_edge, + horiz_edge, + diag_edge); + } + restore_tqb_pixels(s, src, dst, stride_src, stride_dst, + x, y, width, height, c_idx); + sao->type_idx[c_idx] = SAO_APPLIED; + break; + } + } + } + +#if RPI_ZC_SAND_8_IN_10_BUF + if (s->frame->format == AV_PIX_FMT_SAND64_10 && s->frame->buf[RPI_ZC_SAND_8_IN_10_BUF] != NULL && + (((x + (1 << (s->ps.sps->log2_ctb_size))) & 255) == 0 || edges[2])) + { + const unsigned int stride1 = frame_stride1(s->frame, 1); + const unsigned int stride2 = av_rpi_sand_frame_stride2(s->frame); + const unsigned int xoff = (x >> 8) * stride2 * stride1; + const unsigned int ctb_size = (1 << s->ps.sps->log2_ctb_size); + const uint8_t * const sy = s->frame->data[0] + xoff * 4 + y * stride1; + uint8_t * const dy = s->frame->buf[4]->data + xoff * 2 + y * stride1; + const uint8_t * const sc = s->frame->data[1] + xoff * 4 + (y >> 1) * stride1; + uint8_t * const dc = s->frame->buf[4]->data + (s->frame->data[1] - s->frame->data[0]) + xoff * 2 + (y >> 1) * stride1; + const unsigned int wy = !edges[2] ? 256 : s->ps.sps->width - (x & ~255); + const unsigned int hy = !edges[3] ? ctb_size : s->ps.sps->height - y; + +// printf("dy=%p/%p, stride1=%d, stride2=%d, sy=%p/%p, wy=%d, hy=%d, x=%d, y=%d, cs=%d\n", dy, dc, stride1, stride2, sy, sc, wy, hy, x, y, ctb_size); + av_rpi_sand16_to_sand8(dy, stride1, stride2, sy, stride1, stride2, wy, hy, 3); + av_rpi_sand16_to_sand8(dc, stride1, stride2, sc, stride1, stride2, wy, hy >> 1, 3); + } +#endif +} + +// When bits are delivered to deblock we want them +//#define TL 1 +//#define TR 2 +//#define BL 4 +//#define BR 8 + +// pcm4 returns them as b0 = tl, b1 = tr, b16 = bl, b17 = br +// so we need to rearrange before passing on + +static inline uint32_t pcm4(const HEVCRpiContext * const s, const unsigned int x, const unsigned int y) +{ + const uint8_t * const pcm = s->is_pcm + (x >> 6) + (y >> 3) * s->ps.sps->pcm_width; + return (pcm[0] | + (pcm[1] << 8) | + (pcm[s->ps.sps->pcm_width] << 16) | + (pcm[s->ps.sps->pcm_width + 1] << 24)) >> ((x >> 3) & 7); +} + +static inline uint32_t pcm2(const HEVCRpiContext * const s, const unsigned int x, const unsigned int y) +{ + const uint8_t * const pcm = s->is_pcm + (x >> 6) + (y >> 3) * s->ps.sps->pcm_width; + return (pcm[0] | (pcm[1] << 8)) >> ((x >> 3) & 7); +} + +// We cast away const here as we want this to work for both get and set +static inline uint32_t * bs_ptr32(const uint8_t * bs, const unsigned int stride2, const unsigned int x, const unsigned int y) +{ + return (uint32_t *)(bs + +#if (~3U & (HEVC_RPI_BS_STRIDE1_PEL_MASK >> HEVC_RPI_BS_PELS_PER_BYTE_SHIFT)) != 0 +#warning Unexpected masks + // As it happens we end up with stride1 = sizeof(uint32_t) so this expr vanishes + ((x >> HEVC_RPI_BS_PELS_PER_BYTE_SHIFT) & + (~3 & (HEVC_RPI_BS_STRIDE1_PEL_MASK >> HEVC_RPI_BS_PELS_PER_BYTE_SHIFT))) + +#elif HEVC_RPI_BS_STRIDE1_BYTES < 4 +#error Stride1 < return size +#endif + ((y >> HEVC_RPI_BS_Y_SHR) << HEVC_RPI_BS_STRIDE1_BYTE_SHIFT) + + (x >> HEVC_RPI_BS_STRIDE1_PEL_SHIFT) * stride2); +} + +static inline uint8_t * bs_ptr8(const uint8_t * bs, const unsigned int stride2, const unsigned int x, const unsigned int y) +{ + return (uint8_t *)(bs + + ((x >> HEVC_RPI_BS_PELS_PER_BYTE_SHIFT) & + (HEVC_RPI_BS_STRIDE1_PEL_MASK >> HEVC_RPI_BS_PELS_PER_BYTE_SHIFT)) + + ((y >> HEVC_RPI_BS_Y_SHR) << HEVC_RPI_BS_STRIDE1_BYTE_SHIFT) + + (x >> HEVC_RPI_BS_STRIDE1_PEL_SHIFT) * stride2); +} + + +// Get block strength +// Given how we call we will always get within the 32bit boundries +static inline uint32_t bs_get32(const uint8_t * bs, unsigned int stride2, + unsigned int xl, unsigned int xr, const unsigned int y) +{ + if (xr <= xl) { + return 0; + } + else + { +#if HAVE_ARMV6T2_INLINE +#if (~3U & (HEVC_RPI_BS_STRIDE1_PEL_MASK >> HEVC_RPI_BS_PELS_PER_BYTE_SHIFT)) != 0 +#error This case not yet handled in bs_get32 +#elif HEVC_RPI_BS_STRIDE1_BYTES < 4 +#error Stride1 < return size +#endif + uint32_t tmp; + __asm__ ( + "lsr %[tmp], %[xl], %[xl_shift] \n\t" + "rsb %[xr], %[xl], %[xr] \n\t" + "mla %[stride2], %[stride2], %[tmp], %[bs] \n\t" + "add %[xr], %[xr], #7 \n\t" + "lsr %[bs], %[y], %[y_shift1] \n\t" + "bic %[xr], %[xr], #7 \n\t" + "ubfx %[xl], %[xl], #1, #5 \n\t" + "lsr %[xr], %[xr], #1 \n\t" + "cmp %[xr], #32 \n\t" + "mvn %[tmp], #0 \n\t" + "ldr %[bs], [%[stride2], %[bs], lsl %[y_shift2]] \n\t" + "lsl %[tmp], %[tmp], %[xr] \n\t" + "lsr %[xl], %[bs], %[xl] \n\t" + "it ne \n\t" + "bicne %[bs], %[xl], %[tmp] \n\t" + : // Outputs + [bs]"+r"(bs), + [stride2]"+r"(stride2), + [xl]"+r"(xl), + [xr]"+r"(xr), + [tmp]"=&r"(tmp) + : // Inputs + [y]"r"(y), + [xl_shift]"M"(HEVC_RPI_BS_STRIDE1_PEL_SHIFT), + [y_shift1]"M"(HEVC_RPI_BS_Y_SHR), + [y_shift2]"M"(HEVC_RPI_BS_STRIDE1_BYTE_SHIFT) + : // Clobbers + "cc" + ); + return (uint32_t) bs; +#else + const uint32_t a = *bs_ptr32(bs, stride2, xl, y); + const unsigned int n = ((xr - xl + 7) & ~7) >> 1; + + return n == 32 ? a : + (a >> ((xl >> 1) & 31)) & ~(~0U << n); +#endif + } +} + +static inline uint32_t hbs_get32(const HEVCRpiContext * const s, const unsigned int xl, const unsigned int xr, const unsigned int y) +{ + av_assert2(((xl ^ (xr - 1)) >> s->ps.sps->log2_ctb_size) == 0); + return bs_get32(s->bs_horizontal, s->bs_stride2, xl, xr, y); +} + +static inline uint32_t vbs_get32(const HEVCRpiContext * const s, const unsigned int xl, const unsigned int xr, const unsigned int y) +{ + av_assert2(((xl ^ (xr - 1)) >> s->ps.sps->log2_ctb_size) == 0); + return bs_get32(s->bs_vertical, s->bs_stride2, xl, xr, y); +} + + +static void deblock_y_blk(const HEVCRpiContext * const s, const RpiBlk bounds, const int end_x, const int end_y) +{ + const unsigned int log2_ctb_size = s->ps.sps->log2_ctb_size; + const unsigned int log2_min_cb_size = s->ps.sps->log2_min_cb_size; + const unsigned int ctb_size = (1 << log2_ctb_size); + const unsigned int cb_r = bounds.x + bounds.w - (end_x ? 0 : 1); + const unsigned int ctb_n = (bounds.x + bounds.y * s->ps.sps->ctb_width) >> log2_ctb_size; + const DBParams * cb_dbp = s->deblock + ctb_n; + const unsigned int b_b = bounds.y + bounds.h - (end_y ? 0 : 8); + + unsigned int cb_x; + + // Do in CTB-shaped blocks + for (cb_x = bounds.x; cb_x < cb_r; cb_x += ctb_size, ++cb_dbp) + { + const unsigned int bv_r = FFMIN(cb_x + ctb_size, cb_r); + const unsigned int bv_l = FFMAX(cb_x, 8); + const unsigned int bh_r = cb_x + ctb_size >= cb_r ? cb_r - 8 : cb_x + ctb_size - 9; + const unsigned int bh_l = bv_l - 8; + unsigned int y; + + // Main body + for (y = (bounds.y == 0 ? 0 : bounds.y - 8); y < b_b; y += 8) + { + uint32_t vbs = vbs_get32(s, bv_l, bv_r, y); + + const DBParams * const dbp = y < bounds.y ? cb_dbp - s->ps.sps->ctb_width : cb_dbp; + const int8_t * const qta = s->qp_y_tab + ((y - 1) >> log2_min_cb_size) * s->ps.sps->min_cb_width; + const int8_t * const qtb = s->qp_y_tab + (y >> log2_min_cb_size) * s->ps.sps->min_cb_width; + + if (vbs != 0) + { + const uint8_t * const tcv = tctable + dbp->tc_offset; + const uint8_t * const betav = betatable + dbp->beta_offset; + unsigned int pcmfa = pcm2(s, bv_l - 1, y); + unsigned int x; + + for (x = bv_l; vbs != 0; x += 8, vbs >>= 4, pcmfa >>= 1) + { + if ((vbs & 0xf) != 0 && (pcmfa & 3) != 3) + { + const int qp = (qtb[(x - 1) >> log2_min_cb_size] + qtb[x >> log2_min_cb_size] + 1) >> 1; + s->hevcdsp.hevc_v_loop_filter_luma2(av_rpi_sand_frame_pos_y(s->frame, x, y), + frame_stride1(s->frame, LUMA), + betav[qp], + ((vbs & 3) == 0 ? 0 : tcv[qp + (int)(vbs & 2)]) | + (((vbs & 0xc) == 0 ? 0 : tcv[qp + (int)((vbs >> 2) & 2)]) << 16), + pcmfa & 3, + av_rpi_sand_frame_pos_y(s->frame, x - 4, y)); + } + } + } + + if (y != 0) + { + uint32_t hbs; + + // H left - mostly separated out so we only need a uint32_t hbs + if ((hbs = hbs_get32(s, bh_l, cb_x, y)) != 0) + { + const unsigned int x = bh_l; + const unsigned int pcmfa = pcm4(s, bh_l, y - 1); + const int qp = (qta[x >> log2_min_cb_size] + qtb[x >> log2_min_cb_size] + 1) >> 1; + const DBParams * const dbph = dbp - 1; + const uint8_t * const tc = tctable + dbph->tc_offset + qp; + + av_assert2(cb_x - bh_l == 8); + + s->hevcdsp.hevc_h_loop_filter_luma2(av_rpi_sand_frame_pos_y(s->frame, x, y), + frame_stride1(s->frame, LUMA), + betatable[qp + dbph->beta_offset], + ((hbs & 3) == 0 ? 0 : tc[hbs & 2]) | + (((hbs & 0xc) == 0 ? 0 : tc[(hbs >> 2) & 2]) << 16), + (pcmfa & 1) | ((pcmfa & 0x10000) >> 15)); + } + + // H + if ((hbs = hbs_get32(s, cb_x, bh_r + 1, y)) != 0) // Will give (x <= bh_r) in for loop + { + unsigned int x; + unsigned int pcmfa = pcm4(s, cb_x, y - 1); + + for (x = cb_x; hbs != 0; x += 8, hbs >>= 4, pcmfa >>= 1) + { + if ((hbs & 0xf) != 0 && (~pcmfa & 0x10001) != 0) + { + const int qp = (qta[x >> log2_min_cb_size] + qtb[x >> log2_min_cb_size] + 1) >> 1; + const uint8_t * const tc = tctable + dbp->tc_offset + qp; + s->hevcdsp.hevc_h_loop_filter_luma2(av_rpi_sand_frame_pos_y(s->frame, x, y), + frame_stride1(s->frame, LUMA), + betatable[qp + dbp->beta_offset], + ((hbs & 3) == 0 ? 0 : tc[hbs & 2]) | + (((hbs & 0xc) == 0 ? 0 : tc[(hbs >> 2) & 2]) << 16), + (pcmfa & 1) | ((pcmfa & 0x10000) >> 15)); + } + } + } + } + + } + } +} + +static av_always_inline int q2h(const HEVCRpiContext * const s, const unsigned int x, const unsigned int y) +{ + const unsigned int log2_min_cb_size = s->ps.sps->log2_min_cb_size; + const int8_t * const qt = s->qp_y_tab + (y >> log2_min_cb_size) * s->ps.sps->min_cb_width; + return (qt[(x - 1) >> log2_min_cb_size] + qt[x >> log2_min_cb_size] + 1) >> 1; +} + +static void deblock_uv_blk(const HEVCRpiContext * const s, const RpiBlk bounds, const int end_x, const int end_y) +{ + const unsigned int log2_ctb_size = s->ps.sps->log2_ctb_size; + const unsigned int log2_min_cb_size = s->ps.sps->log2_min_cb_size; + const unsigned int ctb_size = (1 << log2_ctb_size); + const unsigned int cb_r = bounds.x + bounds.w - (end_x ? 0 : 8); + const unsigned int ctb_n = (bounds.x + bounds.y * s->ps.sps->ctb_width) >> log2_ctb_size; + const DBParams * dbp = s->deblock + ctb_n; + const unsigned int b_b = bounds.y + bounds.h - (end_y ? 0 : 8); + const uint8_t * const tcq_u = s->ps.pps->qp_dblk_x[1]; + const uint8_t * const tcq_v = s->ps.pps->qp_dblk_x[2]; + + unsigned int cb_x; + + av_assert1((bounds.x & (ctb_size - 1)) == 0); + av_assert1((bounds.y & (ctb_size - 1)) == 0); + av_assert1(bounds.h <= ctb_size); + + // Do in CTB-shaped blocks + for (cb_x = bounds.x; cb_x < cb_r; cb_x += ctb_size, ++dbp) { + const unsigned int bv_r = FFMIN(cb_x + ctb_size, cb_r); + const unsigned int bv_l = FFMAX(cb_x, 16); + unsigned int y; + + // V above + if (bounds.y != 0) { + // Deblock V up 8 + // CTB above current + // Top-half only (tc4 & ~0xffff == 0) is special cased in asm + const unsigned int y = bounds.y - 8; + uint32_t vbs = vbs_get32(s, bv_l, bv_r, y) & 0x02020202U; + + if (vbs != 0) + { + unsigned int pcmfa = pcm2(s, bv_l - 1, y); + const uint8_t * const tc = tctable + 2 + (dbp - s->ps.sps->ctb_width)->tc_offset; + unsigned int x; + + for (x = bv_l; vbs != 0; x += 16, vbs >>= 8, pcmfa >>= 2) + { + if ((vbs & 2) != 0 && (~pcmfa & 3) != 0) + { + const int qp0 = q2h(s, x, y); + s->hevcdsp.hevc_v_loop_filter_uv2(av_rpi_sand_frame_pos_c(s->frame, x >> 1, y >> 1), + frame_stride1(s->frame, 1), + tc[tcq_u[qp0]] | (tc[tcq_v[qp0]] << 8), + av_rpi_sand_frame_pos_c(s->frame, (x >> 1) - 2, y >> 1), + pcmfa & 3); + } + } + } + } + + for (y = bounds.y; y < b_b; y += 16) + { + uint32_t vbs = (vbs_get32(s, bv_l, bv_r, y) & 0x02020202U) | + (y + 16 > b_b ? 0 : (vbs_get32(s, bv_l, bv_r, y + 8) & 0x02020202U) << 4); + + // V + if (vbs != 0) + { + unsigned int x; + unsigned int pcmfa = + (y + 16 > b_b ? + pcm2(s, bv_l - 1, y) | 0xffff0000 : + pcm4(s, bv_l - 1, y)); + const uint8_t * const tc = tctable + 2 + dbp->tc_offset; + + for (x = bv_l; vbs != 0; x += 16, vbs >>= 8, pcmfa >>= 2) + { + if ((vbs & 0xff) != 0 && (~pcmfa & 0x30003) != 0) + { + const int qp0 = q2h(s, x, y); + const int qp1 = q2h(s, x, y + 8); + s->hevcdsp.hevc_v_loop_filter_uv2(av_rpi_sand_frame_pos_c(s->frame, x >> 1, y >> 1), + frame_stride1(s->frame, 1), + ((vbs & 2) == 0 ? 0 : (tc[tcq_u[qp0]] << 0) | (tc[tcq_v[qp0]] << 8)) | + ((vbs & 0x20) == 0 ? 0 : (tc[tcq_u[qp1]] << 16) | (tc[tcq_v[qp1]] << 24)), + av_rpi_sand_frame_pos_c(s->frame, (x >> 1) - 2, y >> 1), + (pcmfa & 3) | ((pcmfa >> 14) & 0xc)); + } + } + } + + // H + if (y != 0) + { + uint32_t hbs; + const unsigned int bh_l = bv_l - 16; + const unsigned int bh_r = cb_x + ctb_size >= cb_r ? cb_r : cb_x + ctb_size - 16; + const int8_t * const qta = s->qp_y_tab + ((y - 1) >> log2_min_cb_size) * s->ps.sps->min_cb_width; + const int8_t * const qtb = s->qp_y_tab + (y >> log2_min_cb_size) * s->ps.sps->min_cb_width; + + // H left - mostly separated out so we only need a uint32_t hbs + // Stub is width 8 to the left of bounds, but width 16 internally + if ((hbs = hbs_get32(s, bh_l, cb_x, y) & 0x22U) != 0) + { + unsigned int pcmfa = pcm4(s, bh_l, y - 1); + + // Chop off bits we don't want... + if (bh_l < bounds.x) { + pcmfa |= 0x10001; // TL|BL pre rearrangement + hbs &= ~3; // Make BS 0 + } + + // Double check we still want this + if (hbs != 0 && (~pcmfa & 0x30003) != 0) + { + const unsigned int x = bh_l; + const int qp0 = (qta[x >> log2_min_cb_size] + qtb[x >> log2_min_cb_size] + 1) >> 1; + const int qp1 = (qta[(x + 8) >> log2_min_cb_size] + qtb[(x + 8) >> log2_min_cb_size] + 1) >> 1; + const uint8_t * const tc = tctable + 2 + (dbp - 1)->tc_offset; + + s->hevcdsp.hevc_h_loop_filter_uv(av_rpi_sand_frame_pos_c(s->frame, x >> 1, y >> 1), + frame_stride1(s->frame, 1), + ((hbs & 2) == 0 ? 0 : (tc[tcq_u[qp0]] << 0) | (tc[tcq_v[qp0]] << 8)) | + ((hbs & 0x20) == 0 ? 0 : (tc[tcq_u[qp1]] << 16) | (tc[tcq_v[qp1]] << 24)), + (pcmfa & 3) | ((pcmfa >> 14) & 0xc)); + } + } + + // H main + if ((hbs = (hbs_get32(s, cb_x, bh_r, y) & 0x22222222U)) != 0) + { + unsigned int x; + unsigned int pcmfa = pcm4(s, cb_x, y - 1); // Might like to mask out far right writes but probably not worth it + + for (x = cb_x; hbs != 0; x += 16, hbs >>= 8, pcmfa >>= 2) + { + if ((hbs & 0xff) != 0 && (~pcmfa & 0x30003) != 0) + { + const int qp0 = (qta[x >> log2_min_cb_size] + qtb[x >> log2_min_cb_size] + 1) >> 1; + const int qp1 = (qta[(x + 8) >> log2_min_cb_size] + qtb[(x + 8) >> log2_min_cb_size] + 1) >> 1; + const uint8_t * const tc = tctable + 2 + dbp->tc_offset; + + s->hevcdsp.hevc_h_loop_filter_uv(av_rpi_sand_frame_pos_c(s->frame, x >> 1, y >> 1), + frame_stride1(s->frame, 1), + ((hbs & 2) == 0 ? 0 : (tc[tcq_u[qp0]] << 0) | (tc[tcq_v[qp0]] << 8)) | + ((hbs & 0x20) == 0 ? 0 : (tc[tcq_u[qp1]] << 16) | (tc[tcq_v[qp1]] << 24)), + (pcmfa & 3) | ((pcmfa >> 14) & 0xc)); + } + } + } + } + } + } +} + +static inline unsigned int off_boundary(const unsigned int x, const unsigned int log2_n) +{ + return x & ~(~0U << log2_n); +} + +static inline void hbs_set(const HEVCRpiContext * const s, const unsigned int x, const unsigned int y, const uint32_t mask, uint32_t bsf) +{ + av_assert2((y & 7) == 0); + + // This doesn't have the same simultainious update issues that bsf_stash + // does (other threads will have a different y) so we can do it the easy way + if ((bsf &= mask) != 0) + *bs_ptr32(s->bs_horizontal, s->bs_stride2, x, y) |= bsf << ((x >> 1) & 31); +} + + +static void vbs_set(const HEVCRpiContext * const s, const unsigned int x, const unsigned int y, const uint32_t mask, uint32_t bsf) +{ + // We arrange this in a slightly odd fashion but it lines up with + // how we are going to use it in the actual deblock code & it is easier + // to do the contortions here than there + // + // Arrange (LE) {x0y0, x0y4, x8y0, x8,y4}, {x16y0, x16y4, x24y0, x24y4},... + + av_assert2((x & 7) == 0); + + if ((bsf &= mask) != 0) + { + uint8_t *p = bs_ptr8(s->bs_vertical, s->bs_stride2, x, y); + const unsigned int sh = ((x & 8) | (y & 4)) >> 1; + + if (mask <= 0xf) + { + *p |= (bsf << sh); + } + else + { + do { + *p |= (bsf & 0xf) << sh; + p += HEVC_RPI_BS_STRIDE1_BYTES; + } while ((bsf >>= 4) != 0); + } + } +} + +static inline uint32_t bsf_mv(const HEVCRpiContext * const s, + const unsigned int rep, const unsigned int dup, + const unsigned int mvf_stride0, + const unsigned int mvf_stride1, + const RefPicList * const rpl_p, const RefPicList * const rpl_q, + const HEVCRpiMvField * const mvf_p, const HEVCRpiMvField * const mvf_q) +{ + return s->hevcdsp.hevc_deblocking_boundary_strengths(rep, dup, + mvf_p, mvf_q, + rpl_p[0].list, rpl_p[1].list, rpl_q[0].list, rpl_q[1].list, + sizeof(HEVCRpiMvField) * mvf_stride0, sizeof(HEVCRpiMvField) * mvf_stride1); +} + + +void ff_hevc_rpi_deblocking_boundary_strengths(const HEVCRpiContext * const s, + const HEVCRpiLocalContext * const lc, + const unsigned int x0, const unsigned int y0, + const unsigned int log2_trafo_size, + const int is_coded_block) +{ + const HEVCRpiMvField * const mvf_curr = mvf_stash_ptr(s, lc, x0, y0); + const unsigned int log2_min_pu_size = LOG2_MIN_PU_SIZE; + const RefPicList * const rpl = s->refPicList; + // Rep count for bsf_mv when running with min_pu chuncks + const unsigned int log2_rep_min_pu = log2_trafo_size <= log2_min_pu_size ? 0 : log2_trafo_size - log2_min_pu_size; + const unsigned int boundary_flags = s->sh.no_dblk_boundary_flags & lc->boundary_flags; + const unsigned int trafo_size = (1U << log2_trafo_size); + const uint32_t bsf_mask = log2_trafo_size > 5 ? ~0U : (1U << (trafo_size >> 1)) - 1; + const uint32_t bsf_cbf = (bsf_mask & 0x55555555); + + // Do we cover a pred split line? + const int has_x_split = x0 < lc->cu.x_split && x0 + trafo_size > lc->cu.x_split; + const int has_y_split = y0 < lc->cu.y_split && y0 + trafo_size > lc->cu.y_split; + + uint32_t bsf_h; + uint32_t bsf_v; + +#ifdef DISABLE_STRENGTHS + return; +#endif + + // We are always on a size boundary + av_assert2((x0 & (trafo_size - 1)) == 0); + av_assert2((y0 & (trafo_size - 1)) == 0); + // log2_trafo_size not really a transform size; we can have to deal + // with size 2^6 blocks + av_assert2(log2_trafo_size >= 2 && log2_trafo_size <= 6); + + // Retrieve and update coded (b0), intra (b1) bs flags + // + // Store on min width (rather than uint32_t) to avoid possible issues + // with another thread on another core running wpp using the same + // memory (min CTB = 16 pels = 4 bsf els = 8 bits) + // + // In bsf BS=2 is represented by 3 as it is much easier to test & set + // and the actual deblock code tests for 0 and b1 set/not-set so 2 and + // 3 will work the same + { + // Given where we are called from is_cbf_luma & is_intra will be constant over the block + const uint32_t bsf0 = (lc->cu.pred_mode == MODE_INTRA) ? bsf_mask : is_coded_block ? bsf_cbf : 0; + uint8_t *const p = s->bsf_stash_up + (x0 >> 4); + uint8_t *const q = s->bsf_stash_left + (y0 >> 4); + + switch (log2_trafo_size) + { + case 2: + case 3: + { + const unsigned int sh_h = (x0 >> 1) & 7; + const unsigned int sh_v = (y0 >> 1) & 7; + bsf_h = *p; + bsf_v = *q; + *p = (bsf_h & ~(bsf_mask << sh_h)) | (bsf0 << sh_h); + *q = (bsf_v & ~(bsf_mask << sh_v)) | (bsf0 << sh_v); + bsf_h >>= sh_h; + bsf_v >>= sh_v; + break; + } + case 4: + bsf_h = *p; + bsf_v = *q; + *p = bsf0; + *q = bsf0; + break; + case 5: + bsf_h = *(uint16_t *)p; + bsf_v = *(uint16_t *)q; + *(uint16_t *)p = bsf0; + *(uint16_t *)q = bsf0; + break; + case 6: + default: + bsf_h = *(uint32_t *)p; + bsf_v = *(uint32_t *)q; + *(uint32_t *)p = bsf0; + *(uint32_t *)q = bsf0; + break; + } + + bsf_h |= bsf0; + bsf_v |= bsf0; + } + + // Do Horizontal + if ((y0 & 7) == 0) + { + // Boundary upper + if (y0 != 0 && + (off_boundary(y0, s->ps.sps->log2_ctb_size) || + (boundary_flags & (BOUNDARY_UPPER_SLICE | BOUNDARY_UPPER_TILE)) == 0)) + { + // Look at MVs (BS=1) if we don't already has a full set of bs bits + if ((~bsf_h & bsf_cbf) != 0 && (y0 == lc->cu.y || y0 == lc->cu.y_split)) + { + // If we aren't on the top boundary we must be in the middle + // and in that case we know where mvf can change + const unsigned int log2_rep = (y0 == lc->cu.y) ? log2_rep_min_pu : has_x_split ? 1 : 0; + const RefPicList *const rpl_top = !off_boundary(y0, s->ps.sps->log2_ctb_size) ? + s->rpl_up[x0 >> s->ps.sps->log2_ctb_size] : + rpl; + + bsf_h |= bsf_mv(s, 1 << log2_rep, trafo_size >> (2 + log2_rep), + trafo_size >> (log2_min_pu_size + log2_rep), + trafo_size >> (log2_min_pu_size + log2_rep), + rpl, rpl_top, + mvf_curr, mvf_ptr(s, lc, x0, y0, x0, y0 - 1)); + } + + // Finally put the results into bs + hbs_set(s, x0, y0, bsf_mask, bsf_h); + } + + // Max of 1 pu internal split - ignore if not on 8pel boundary + if (has_y_split && !off_boundary(lc->cu.y_split, 3)) + { + const HEVCRpiMvField * const mvf = mvf_stash_ptr(s, lc, x0, lc->cu.y_split); + // If we have the x split as well then it must be in the middle + const unsigned int log2_rep = has_x_split ? 1 : 0; + + hbs_set(s, x0, lc->cu.y_split, bsf_mask, + bsf_mv(s, 1 << log2_rep, trafo_size >> (2 + log2_rep), + trafo_size >> (log2_min_pu_size + log2_rep), + trafo_size >> (log2_min_pu_size + log2_rep), + rpl, rpl, + mvf, mvf - MVF_STASH_WIDTH_PU)); + } + } + + // And again for vertical - same logic as horizontal just in the other direction + if ((x0 & 7) == 0) + { + // Boundary left + if (x0 != 0 && + (off_boundary(x0, s->ps.sps->log2_ctb_size) || + (boundary_flags & (BOUNDARY_LEFT_SLICE | BOUNDARY_LEFT_TILE)) == 0)) + { + if ((~bsf_v & bsf_cbf) != 0 && (x0 == lc->cu.x || x0 == lc->cu.x_split)) + { + const unsigned int log2_rep = (x0 == lc->cu.x) ? log2_rep_min_pu : has_y_split ? 1 : 0; + const RefPicList *const rpl_left = !off_boundary(x0, s->ps.sps->log2_ctb_size) ? + s->rpl_left[y0 >> s->ps.sps->log2_ctb_size] : + rpl; + + bsf_v |= bsf_mv(s, 1 << log2_rep, trafo_size >> (2 + log2_rep), + (MVF_STASH_WIDTH_PU << log2_trafo_size) >> (log2_min_pu_size + log2_rep), + (mvf_left_stride(s, x0, x0 - 1) << log2_trafo_size) >> (log2_min_pu_size + log2_rep), + rpl, rpl_left, + mvf_curr, mvf_ptr(s, lc, x0, y0, x0 - 1, y0)); + } + + vbs_set(s, x0, y0, bsf_mask, bsf_v); + } + + if (has_x_split && !off_boundary(lc->cu.x_split, 3)) + { + const HEVCRpiMvField *const mvf = mvf_stash_ptr(s, lc, lc->cu.x_split, y0); + const unsigned int log2_rep = has_y_split ? 1 : 0; + + vbs_set(s, lc->cu.x_split, y0, bsf_mask, + bsf_mv(s, 1 << log2_rep, trafo_size >> (2 + log2_rep), + (MVF_STASH_WIDTH_PU << log2_trafo_size) >> (log2_min_pu_size + log2_rep), + (MVF_STASH_WIDTH_PU << log2_trafo_size) >> (log2_min_pu_size + log2_rep), + rpl, rpl, + mvf, mvf - 1)); + } + } +} + +#undef LUMA +#undef CB +#undef CR + +static inline unsigned int ussub(const unsigned int a, const unsigned int b) +{ + return a < b ? 0 : a - b; +} + +static inline int cache_boundry(const AVFrame * const frame, const unsigned int x) +{ + return ((x >> av_rpi_sand_frame_xshl(frame)) & ~63) == 0; +} + +int ff_hevc_rpi_hls_filter_blk(const HEVCRpiContext * const s, const RpiBlk bounds, const int eot) +{ + const int ctb_size = (1 << s->ps.sps->log2_ctb_size); + int x, y; + + const unsigned int br = bounds.x + bounds.w; + const unsigned int bb = bounds.y + bounds.h; + + const int x_end = (br >= s->ps.sps->width); + const int y_end = (bb >= s->ps.sps->height); + + // Deblock may not touch the edges of the bound as they are still needed + // for Intra pred + // + // Deblock is disabled with a per-slice flag + // Given that bounds may cover multiple slices & we dblock outside bounds + // anyway we can't avoid deblock using that flag - about the only thing we + // could do is have a "no deblock seen yet" flag but it doesn't really + // seem worth the effort + + deblock_y_blk(s, bounds, x_end, y_end); + deblock_uv_blk(s, bounds, x_end, y_end); + + // SAO needs + // (a) CTB alignment + // (b) Valid pixels all the way around the CTB in particular it needs the DR pixel + { + const unsigned int xo = bounds.x - ((bounds.x - 16) & ~(ctb_size - 1)); + const unsigned int yo = bounds.y - ((bounds.y - 16) & ~(ctb_size - 1)); + const unsigned int yt = ussub(bounds.y, yo); + const unsigned int yb = y_end ? bb : ussub(bb, yo); + const unsigned int xl = ussub(bounds.x, xo); + const unsigned int xr = x_end ? br : ussub(br, xo); + + if (s->ps.sps->sao_enabled) + { + for (y = yt; y < yb; y += ctb_size) { + for (x = xl; x < xr; x += ctb_size) { + sao_filter_CTB(s, x, y); + } + } + } + + // Cache invalidate + y = 0; + if (xr != 0 && yb != 0) + { + const unsigned int llen = + (av_rpi_sand_frame_stride1(s->frame) >> av_rpi_sand_frame_xshl(s->frame)); + const unsigned int mask = ~(llen - 1); + const unsigned int il = (xl == 0) ? 0 : (xl - 1) & mask; + const unsigned int ir = x_end || !cache_boundry(s->frame, br) ? br : (xr - 1) & mask; + const unsigned int it = ussub(yt, 1); + const unsigned int ib = y_end ? bb : yb - 1; + + if (il < ir) { + rpi_cache_buf_t cbuf; + rpi_cache_flush_env_t * const rfe = rpi_cache_flush_init(&cbuf); + rpi_cache_flush_add_frame_block(rfe, s->frame, RPI_CACHE_FLUSH_MODE_WB_INVALIDATE, + il, it, ir - il, ib - it, + ctx_vshift(s, 1), 1, 1); + + // If we have to commit the right hand tile boundry due to + // cache boundry considerations then at EoTile we must commit + // that boundry to bottom of tile (bounds) + if (ib != bb && ir == br && eot) { + rpi_cache_flush_add_frame_block(rfe, s->frame, RPI_CACHE_FLUSH_MODE_WB_INVALIDATE, + br - 1, ib, 1, bb - ib, + ctx_vshift(s, 1), 1, 1); + } + + rpi_cache_flush_finish(rfe); + + if (x_end) + y = y_end ? INT_MAX : ib; + +// printf("Flush: %4d,%4d -> %4d,%4d: signal: %d\n", il, it, ir, ib, y - 1); + } + } + } + + return y; +} + diff --git a/libavcodec/rpi_hevc_mv.h b/libavcodec/rpi_hevc_mv.h new file mode 100644 index 0000000000..6b36f5e737 --- /dev/null +++ b/libavcodec/rpi_hevc_mv.h @@ -0,0 +1,71 @@ +#ifndef AVCODEC_RPI_HEVC_MV_H +#define AVCODEC_RPI_HEVC_MV_H + +#include "config.h" + +typedef int32_t MvXY; + +typedef struct HEVCRpiMvField { + MvXY xy[2]; + int8_t ref_idx[2]; + int8_t pred_flag; + int8_t dummy; // To 12 bytes +} HEVCRpiMvField; + + +#define MV_X(xy) (((xy) << 16) >> 16) +#define MV_Y(xy) ((xy) >> 16) +#define MV_XY(x, y) ((x & 0xffff) | ((y) << 16)) + +#if ARCH_ARM +#include "arm/rpi_hevc_mv_arm.h" +#endif + +#ifndef mvxy_add +static inline MvXY mvxy_add(const MvXY a, const MvXY b) +{ + return MV_XY(MV_X(a) + MV_X(b), MV_Y(a) + MV_Y(b)); +} +#endif + + +#ifndef mv_scale_xy +static inline MvXY mv_scale_xy(const MvXY const src, int td, int tb) +{ + int tx, scale_factor; + + td = td == 0 ? 1 : av_clip_int8(td); + tb = av_clip_int8(tb); + tx = (0x4000 + (abs(td) >> 1)) / td; + scale_factor = av_clip_intp2((tb * tx + 32) >> 6, 12); + return MV_XY( + av_clip_int16((scale_factor * MV_X(src) + 127 + + (scale_factor * MV_X(src) < 0)) >> 8), + av_clip_int16((scale_factor * MV_Y(src) + 127 + + (scale_factor * MV_Y(src) < 0)) >> 8)); +} +#endif + +// 8.3.1 states that the bitstream may not contain poc diffs that do not +// fit in 16 bits, so given that we don't care about the high bits we only +// store the low 16 + LT & Inter flags + +#define COL_POC_INTRA 0 +#define COL_POC_INTER (1 << 16) +#define COL_POC_LT (1 << 17) +#define COL_POC_DIFF(x,y) ((int16_t)((x) - (y))) +#define COL_POC_MAKE_INTER(lt,poc) (COL_POC_INTER | ((lt) ? COL_POC_LT : 0) | ((poc) & 0xffff)) +#define COL_POC_IS_LT(x) (((x) & COL_POC_LT) != 0) + +typedef struct ColMv_s { + int32_t poc; + int32_t xy; +} ColMv; + +typedef struct ColMvField_s { + ColMv L[2]; +} ColMvField; + + + +#endif // AVCODEC_RPI_HEVC_MV_H diff --git a/libavcodec/rpi_hevc_mvs.c b/libavcodec/rpi_hevc_mvs.c new file mode 100644 index 0000000000..27a9f69525 --- /dev/null +++ b/libavcodec/rpi_hevc_mvs.c @@ -0,0 +1,487 @@ +/* + * HEVC video decoder + * + * Copyright (C) 2012 - 2013 Guillaume Martres + * Copyright (C) 2013 Anand Meher Kotra + * Copyright (C) 2018 John Cox for Raspberry Pi (Trading) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hevc.h" +#include "rpi_hevcdec.h" + +static av_always_inline int +is_eq_mer(const unsigned int plevel, + const unsigned int xN, const unsigned int yN, + const unsigned int xP, const unsigned int yP) +{ + return (((xN ^ xP) | (yN ^ yP)) >> plevel) == 0; +} + +// check if the mv's and refidx are the same between A and B +static av_always_inline int compare_mv_ref_idx(const HEVCRpiMvField * const a, const HEVCRpiMvField * const b) +{ + return a->pred_flag == b->pred_flag && + ((a->pred_flag & PF_L0) == 0 || (a->ref_idx[0] == b->ref_idx[0] && a->xy[0] == b->xy[0])) && + ((a->pred_flag & PF_L1) == 0 || (a->ref_idx[1] == b->ref_idx[1] && a->xy[1] == b->xy[1])); + return 0; +} + +/* + * 8.5.3.1.7 temporal luma motion vector prediction + */ +static int temporal_luma_motion_vector(const HEVCRpiContext * const s, + const HEVCRpiLocalContext * const lc, const int x0, const int y0, + const int nPbW, const int nPbH, const int refIdxLx, + MvXY * const mvLXCol, const int X) +{ + int x, y; + const ColMv * cmv = NULL; + + HEVCRpiFrame * const col_ref = s->ref->collocated_ref; + const RefPicList * const refPicList = s->refPicList + X; + const int cur_lt = refPicList->isLongTerm[refIdxLx]; + + *mvLXCol = 0; + // Unlikely but we might have a col_ref IDR frame! + if (col_ref->col_mvf == NULL) + return 0; + + ff_hevc_rpi_progress_wait_mv(s, lc->jb0, col_ref, y0 + nPbH); + + //bottom right collocated motion vector + x = x0 + nPbW; + y = y0 + nPbH; + + if ((y0 >> s->ps.sps->log2_ctb_size) == (y >> s->ps.sps->log2_ctb_size) && + y < s->ps.sps->height && + x < s->ps.sps->width) + { + const ColMvField * const col = col_ref->col_mvf + (x >> 4) + + (y >> 4) * s->col_mvf_stride; + + if (col->L[0].poc != COL_POC_INTRA && + (col->L[1].poc == COL_POC_INTRA || + (s->no_backward_pred_flag ? s->sh.collocated_list == L1 : X == 0))) + { + cmv = col->L + 0; + } + else if (col->L[1].poc != COL_POC_INTRA) + { + cmv = col->L + 1; + } + } + + // derive center collocated motion vector + if (cmv == NULL || COL_POC_IS_LT(cmv->poc) != cur_lt) + { + cmv = NULL; + x = x0 + (nPbW >> 1); + y = y0 + (nPbH >> 1); + + { + const ColMvField * const col = col_ref->col_mvf + (x >> 4) + + (y >> 4) * s->col_mvf_stride; + + if (col->L[0].poc != COL_POC_INTRA && + (col->L[1].poc == COL_POC_INTRA || + (s->no_backward_pred_flag ? s->sh.collocated_list == L1 : X == 0))) + { + cmv = col->L + 0; + } + else if (col->L[1].poc != COL_POC_INTRA) + { + cmv = col->L + 1; + } + } + } + + if (cmv == NULL || cur_lt != COL_POC_IS_LT(cmv->poc)) + return 0; + + { + const int col_poc = col_ref->poc; + const int ref_poc = refPicList->list[refIdxLx]; + + *mvLXCol = (cur_lt || + cmv->poc == col_poc || + COL_POC_DIFF(col_poc, cmv->poc) == s->poc - ref_poc) ? + cmv->xy : + mv_scale_xy(cmv->xy, COL_POC_DIFF(col_poc, cmv->poc), s->poc - ref_poc); + } + + return cmv != NULL; +} + +static inline int mvf_eq(const HEVCRpiMvField * const a, const HEVCRpiMvField * const b) +{ + return b != NULL && compare_mv_ref_idx(a, b); +} + + + +/* + * 8.5.3.1.2 Derivation process for spatial merging candidates + */ +static inline const HEVCRpiMvField * +derive_spatial_merge_candidates( + const HEVCRpiContext * const s, + const HEVCRpiLocalContext * const lc, + const unsigned int x0, const unsigned int y0, + const unsigned int nPbW, const unsigned int nPbH, + const unsigned int avail, + const unsigned int part_idx, + const unsigned int merge_idx, + HEVCRpiMvField * const mvf_t) +{ + const unsigned int parts_a1 = (1 << PART_Nx2N) | (1 << PART_nLx2N) | (1 << PART_nRx2N); + const unsigned int parts_b1 = (1 << PART_2NxN) | (1<< PART_2NxnU) | (1 << PART_2NxnD); + + const HEVCRpiMvField * mvf_a1 = mvf_ptr(s, lc, x0, y0, x0 - 1, y0 + nPbH - 1); + const HEVCRpiMvField * mvf_a0 = mvf_a1 + mvf_left_stride(s, x0, x0 - 1); + const HEVCRpiMvField * mvf_b1 = mvf_ptr(s, lc, x0, y0, x0 + nPbW - 1, y0 - 1); + const HEVCRpiMvField * mvf_b0 = mvf_b1 + 1; + const unsigned int plevel = s->ps.pps->log2_parallel_merge_level; + const unsigned int part_mode = lc->cu.part_mode; + + const HEVCRpiMvField * perm[4]; + unsigned int nb_merge_cand = 0; + + // singleMCLFlag => part_idx == 0 so no need to test for it + if ((avail & AVAIL_L) == 0 || + (part_idx == 1 && + ((parts_a1 >> part_mode) & 1) != 0 || + is_eq_mer(plevel, x0 - 1, y0 + nPbH - 1, x0, y0)) || + mvf_a1->pred_flag == PF_INTRA) + { + mvf_a1 = NULL; + } + else + { + if (merge_idx == nb_merge_cand) + return mvf_a1; + perm[nb_merge_cand++] = mvf_a1; + } + + if ((avail & AVAIL_U) == 0 || + (part_idx == 1 && + ((parts_b1 >> part_mode) & 1) != 0 || + is_eq_mer(plevel, x0 + nPbW - 1, y0 - 1, x0, y0)) || + mvf_b1->pred_flag == PF_INTRA) + { + mvf_b1 = NULL; + } + else if (!mvf_eq(mvf_b1, mvf_a1)) + { + if (merge_idx == nb_merge_cand) + return mvf_b1; + perm[nb_merge_cand++] = mvf_b1; + } + + // above right spatial merge candidate + // Never need mvf_b0 again so don't bother zeroing if navail + if ((avail & AVAIL_UR) != 0 && + !is_eq_mer(plevel, x0 + nPbW, y0 - 1, x0, y0) && + mvf_b0->pred_flag != PF_INTRA && + !mvf_eq(mvf_b0, mvf_b1)) + { + if (merge_idx == nb_merge_cand) + return mvf_b0; + perm[nb_merge_cand++] = mvf_b0; + } + + // left bottom spatial merge candidate + // Never need mvf_a0 again so don't bother zeroing if navail + if ((avail & AVAIL_DL) != 0 && + !is_eq_mer(plevel, x0 - 1, y0 + nPbH, x0, y0) && + mvf_a0->pred_flag != PF_INTRA && + !mvf_eq(mvf_a0, mvf_a1)) + { + if (merge_idx == nb_merge_cand) + return mvf_a0; + perm[nb_merge_cand++] = mvf_a0; + } + + // above left spatial merge candidate + if (nb_merge_cand != 4 && + (avail & AVAIL_UL) != 0 && + !is_eq_mer(plevel, x0 - 1, y0 - 1, x0, y0)) + { + const HEVCRpiMvField * mvf_b2 = mvf_ptr(s, lc, x0, y0, x0 - 1, y0 - 1); // UL + + if (mvf_b2->pred_flag != PF_INTRA && + !mvf_eq(mvf_b2, mvf_a1) && + !mvf_eq(mvf_b2, mvf_b1)) + { + if (merge_idx == nb_merge_cand) + return mvf_b2; + perm[nb_merge_cand++] = mvf_b2; + } + } + + // temporal motion vector candidate + if (s->sh.slice_temporal_mvp_enabled_flag) + { + static const HEVCRpiMvField mvf_z = {{0}}; + + *mvf_t = mvf_z; + + if (temporal_luma_motion_vector(s, lc, x0, y0, nPbW, nPbH, + 0, mvf_t->xy + 0, 0)) + mvf_t->pred_flag = PF_L0; + + if (s->sh.slice_type == HEVC_SLICE_B && + temporal_luma_motion_vector(s, lc, x0, y0, nPbW, nPbH, + 0, mvf_t->xy + 1, 1)) + mvf_t->pred_flag |= PF_L1; + + if (mvf_t->pred_flag != 0) + { + if (merge_idx == nb_merge_cand) + return mvf_t; + perm[nb_merge_cand++] = mvf_t; + } + } + + // combined bi-predictive merge candidates (applies for B slices) + if (s->sh.slice_type == HEVC_SLICE_B && nb_merge_cand > 1) + { + unsigned int comb_idx = 0; + const unsigned int cand_count = nb_merge_cand * (nb_merge_cand - 1); + const RefPicList * const refPicList = s->refPicList; + + for (comb_idx = 0; comb_idx < cand_count; comb_idx++) + { + static const uint8_t l0_l1_cand_idx[12][2] = { + { 0, 1, }, + { 1, 0, }, + { 0, 2, }, + { 2, 0, }, + { 1, 2, }, + { 2, 1, }, + { 0, 3, }, + { 3, 0, }, + { 1, 3, }, + { 3, 1, }, + { 2, 3, }, + { 3, 2, }, + }; + + const unsigned int l0_cand_idx = l0_l1_cand_idx[comb_idx][0]; + const unsigned int l1_cand_idx = l0_l1_cand_idx[comb_idx][1]; + const HEVCRpiMvField * const mvf_c0 = perm[l0_cand_idx]; + const HEVCRpiMvField * const mvf_c1 = perm[l1_cand_idx]; + + if ((mvf_c0->pred_flag & PF_L0) != 0 && + (mvf_c1->pred_flag & PF_L1) != 0 && + (refPicList[0].list[mvf_c0->ref_idx[0]] != refPicList[1].list[mvf_c1->ref_idx[1]] || + mvf_c0->xy[0] != mvf_c1->xy[1])) + { + if (merge_idx == nb_merge_cand++) + { + // Need to be a bit careful as we will construct mvf_t and we + // may already be using that as one of our condidates + // so build & copy rather than build in place + const HEVCRpiMvField mvf_m = { + .xy = { + mvf_c0->xy[0], + mvf_c1->xy[1]}, + .ref_idx = { + mvf_c0->ref_idx[0], + mvf_c1->ref_idx[1]}, + .pred_flag = PF_BI + }; + *mvf_t = mvf_m; + return mvf_t; + } + } + } + } + + // "append" Zero motion vector candidates + { + const unsigned int nb_refs = (s->sh.slice_type == HEVC_SLICE_B) ? + FFMIN(s->sh.nb_refs[0], s->sh.nb_refs[1]) : s->sh.nb_refs[0]; + const unsigned int zero_idx = merge_idx - nb_merge_cand; + + const HEVCRpiMvField mvf_m = { + .xy = {0, 0}, + .ref_idx = { + zero_idx < nb_refs ? zero_idx : 0, + (s->sh.slice_type == HEVC_SLICE_B && zero_idx < nb_refs) ? zero_idx : 0}, + .pred_flag = (s->sh.slice_type == HEVC_SLICE_B) ? PF_BI : PF_L0 + }; + + *mvf_t = mvf_m; + return mvf_t; + } +} + + +// 8.5.3.1.1 Derivation process of luma Mvs for merge mode +void ff_hevc_rpi_luma_mv_merge_mode(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, int x0, int y0, int nPbW, + int nPbH, int log2_cb_size, int part_idx, + int merge_idx, HEVCRpiMvField * const mv) +{ + const HEVCRpiMvField * mvf_m = (s->ps.pps->log2_parallel_merge_level > 2 && log2_cb_size == 3) ? + derive_spatial_merge_candidates(s, lc, lc->cu.x, lc->cu.y, 8, 8, + ff_hevc_rpi_tb_avail_flags(s, lc, lc->cu.x, lc->cu.y, 8, 8), + 0, merge_idx, mv) : + derive_spatial_merge_candidates(s, lc, x0, y0, nPbW, nPbH, + ff_hevc_rpi_tb_avail_flags(s, lc, x0, y0, nPbW, nPbH), + part_idx, merge_idx, mv); + + if (mvf_m != mv) + *mv = *mvf_m; + + if (mv->pred_flag == PF_BI && (nPbW + nPbH) == 12) + mv->pred_flag = PF_L0; +} + + +static av_always_inline const MvXY * +mvf_same_poc(const RefPicList * const rpl, const unsigned int pfi0, const unsigned int pfi1, const int poc0, const HEVCRpiMvField * const mvf) +{ + if (mvf != NULL) + { + if (((mvf->pred_flag >> pfi0) & 1) != 0 && rpl[pfi0].list[mvf->ref_idx[pfi0]] == poc0) + return mvf->xy + pfi0; + if (((mvf->pred_flag >> pfi1) & 1) != 0 && rpl[pfi1].list[mvf->ref_idx[pfi1]] == poc0) + return mvf->xy + pfi1; + } + return NULL; +} + +static av_always_inline const MvXY * +mvf_other_poc(const RefPicList * const rpl, const unsigned int pfi0, const unsigned int pfi1, + const int islt0, const int poc0, const int poc_cur, + MvXY * const mv_t, const HEVCRpiMvField * const mvf) +{ + if (mvf != NULL) + { + if (((mvf->pred_flag >> pfi0) & 1) != 0 && rpl[pfi0].isLongTerm[mvf->ref_idx[pfi0]] == islt0) + { + const int poc1 = rpl[pfi0].list[mvf->ref_idx[pfi0]]; + if (islt0 || poc1 == poc0) { + return mvf->xy + pfi0; + } + *mv_t = mv_scale_xy(mvf->xy[pfi0], poc_cur - poc1, poc_cur - poc0); + return mv_t; + } + if (((mvf->pred_flag >> pfi1) & 1) != 0 && rpl[pfi1].isLongTerm[mvf->ref_idx[pfi1]] == islt0) + { + const int poc1 = rpl[pfi1].list[mvf->ref_idx[pfi1]]; + if (islt0 || poc1 == poc0) { + return mvf->xy + pfi1; + } + *mv_t = mv_scale_xy(mvf->xy[pfi1], poc_cur - poc1, poc_cur - poc0); + return mv_t; + } + } + return NULL; +} + +void ff_hevc_rpi_luma_mv_mvp_mode(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, + const unsigned int x0, const unsigned int y0, + const unsigned int nPbW, const unsigned int nPbH, + const unsigned int avail, + HEVCRpiMvField * const mv, + const unsigned int mvp_lx_flag, const unsigned int LX) +{ + const unsigned int pfi0 = LX; + const unsigned int pfi1 = LX == 0 ? 1 : 0; + const RefPicList * const rpl = s->refPicList; + const int poc0 = rpl[LX].list[mv->ref_idx[LX]]; + const int poc_cur = s->poc; + const int islt0 = rpl[LX].isLongTerm[mv->ref_idx[LX]]; + + const HEVCRpiMvField * mvf_a1 = mvf_ptr(s, lc, x0, y0, x0 - 1, y0 + nPbH - 1); + const HEVCRpiMvField * mvf_a0 = mvf_a1 + mvf_left_stride(s, x0, x0 - 1); + const HEVCRpiMvField * mvf_b2 = mvf_ptr(s, lc, x0, y0, x0 - 1, y0 - 1); // UL + const HEVCRpiMvField * mvf_b1 = mvf_ptr(s, lc, x0, y0, x0 + nPbW - 1, y0 - 1); + const HEVCRpiMvField * mvf_b0 = mvf_b1 + 1; + const MvXY * mva = NULL; + const MvXY * mvb; + MvXY * const mv_rv = mv->xy + LX; + MvXY mvt_a, mvt_b; + + *mv_rv = 0; + + if ((avail & AVAIL_DL) == 0 || mvf_a0->pred_flag == PF_INTRA) + mvf_a0 = NULL; + else if ((mva = mvf_same_poc(rpl, pfi0, pfi1, poc0, mvf_a0)) != NULL && mvp_lx_flag == 0) + goto use_mva; + + if ((avail & AVAIL_L) == 0 || mvf_a1->pred_flag == PF_INTRA) + mvf_a1 = NULL; + + if (mva == NULL && + (mva = mvf_same_poc(rpl, pfi0, pfi1, poc0, mvf_a1)) == NULL && + (mva = mvf_other_poc(rpl, pfi0, pfi1, islt0, poc0, poc_cur, &mvt_a, mvf_a0)) == NULL) + mva = mvf_other_poc(rpl, pfi0, pfi1, islt0, poc0, poc_cur, &mvt_a, mvf_a1); + + if (mvp_lx_flag == 0 && mva != NULL) + goto use_mva; + + if ((avail & AVAIL_UR) == 0 || mvf_b0->pred_flag == PF_INTRA) + mvf_b0 = NULL; + if ((avail & AVAIL_U) == 0 || mvf_b1->pred_flag == PF_INTRA) + mvf_b1 = NULL; + if ((avail & AVAIL_UL) == 0 || mvf_b2->pred_flag == PF_INTRA) + mvf_b2 = NULL; + + if ((mvb = mvf_same_poc(rpl, pfi0, pfi1, poc0, mvf_b0)) == NULL && + (mvb = mvf_same_poc(rpl, pfi0, pfi1, poc0, mvf_b1)) == NULL) + mvb = mvf_same_poc(rpl, pfi0, pfi1, poc0, mvf_b2); + + if (mvf_a0 == NULL && mvf_a1 == NULL) { + mva = mvb; + if (mvp_lx_flag == 0 && mva != NULL) + goto use_mva; + + if ((mvb = mvf_other_poc(rpl, pfi0, pfi1, islt0, poc0, poc_cur, &mvt_b, mvf_b0)) == NULL && + (mvb = mvf_other_poc(rpl, pfi0, pfi1, islt0, poc0, poc_cur, &mvt_b, mvf_b1)) == NULL) + mvb = mvf_other_poc(rpl, pfi0, pfi1, islt0, poc0, poc_cur, &mvt_b, mvf_b2); + } + + if (mva == NULL) { + mva = mvb; + mvb = NULL; + } + + if (mvb != NULL && *mva == *mvb) // If A == B then ignore B + mvb = NULL; + + if (mvp_lx_flag == 0 && mva != NULL) { + goto use_mva; + } + else if (mvp_lx_flag != 0 && mvb != NULL) { + *mv_rv = *mvb; + } + else if (s->sh.slice_temporal_mvp_enabled_flag && ((mvp_lx_flag == 0 && mva == NULL) || (mvp_lx_flag != 0 && mva != NULL))) { + temporal_luma_motion_vector(s, lc, x0, y0, nPbW, + nPbH, mv->ref_idx[LX], + mv_rv, LX); + } + return; + +use_mva: + *mv_rv = *mva; + return; +} + diff --git a/libavcodec/rpi_hevc_parse.c b/libavcodec/rpi_hevc_parse.c new file mode 100644 index 0000000000..e58a59ce5e --- /dev/null +++ b/libavcodec/rpi_hevc_parse.c @@ -0,0 +1,143 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "bytestream.h" +#include "h2645_parse.h" +#include "hevc.h" +#include "rpi_hevc_parse.h" + +static int hevc_decode_nal_units(const uint8_t *buf, int buf_size, HEVCRpiParamSets *ps, + HEVCSEIContext *sei, int is_nalff, int nal_length_size, + int err_recognition, int apply_defdispwin, void *logctx) +{ + int i; + int ret = 0; + H2645Packet pkt = { 0 }; + + ret = ff_h2645_packet_split(&pkt, buf, buf_size, logctx, is_nalff, + nal_length_size, AV_CODEC_ID_HEVC, 1, 0); + if (ret < 0) { + goto done; + } + + for (i = 0; i < pkt.nb_nals; i++) { + H2645NAL *nal = &pkt.nals[i]; + + /* ignore everything except parameter sets and VCL NALUs */ + switch (nal->type) { + case HEVC_NAL_VPS: + ret = ff_hevc_rpi_decode_nal_vps(&nal->gb, logctx, ps); + if (ret < 0) + goto done; + break; + case HEVC_NAL_SPS: + ret = ff_hevc_rpi_decode_nal_sps(&nal->gb, logctx, ps, apply_defdispwin); + if (ret < 0) + goto done; + break; + case HEVC_NAL_PPS: + ret = ff_hevc_rpi_decode_nal_pps(&nal->gb, logctx, ps); + if (ret < 0) + goto done; + break; + case HEVC_NAL_SEI_PREFIX: + case HEVC_NAL_SEI_SUFFIX: + ret = ff_hevc_rpi_decode_nal_sei(&nal->gb, logctx, sei, ps, nal->type); + if (ret < 0) + goto done; + break; + default: + av_log(logctx, AV_LOG_VERBOSE, "Ignoring NAL type %d in extradata\n", nal->type); + break; + } + } + +done: + ff_h2645_packet_uninit(&pkt); + if (err_recognition & AV_EF_EXPLODE) + return ret; + + return 0; +} + +int ff_hevc_rpi_decode_extradata(const uint8_t *data, int size, HEVCRpiParamSets *ps, + HEVCSEIContext *sei, int *is_nalff, int *nal_length_size, + int err_recognition, int apply_defdispwin, void *logctx) +{ + int ret = 0; + GetByteContext gb; + + bytestream2_init(&gb, data, size); + + if (size > 3 && (data[0] || data[1] || data[2] > 1)) { + /* It seems the extradata is encoded as hvcC format. + * Temporarily, we support configurationVersion==0 until 14496-15 3rd + * is finalized. When finalized, configurationVersion will be 1 and we + * can recognize hvcC by checking if avctx->extradata[0]==1 or not. */ + int i, j, num_arrays, nal_len_size; + + *is_nalff = 1; + + bytestream2_skip(&gb, 21); + nal_len_size = (bytestream2_get_byte(&gb) & 3) + 1; + num_arrays = bytestream2_get_byte(&gb); + + /* nal units in the hvcC always have length coded with 2 bytes, + * so put a fake nal_length_size = 2 while parsing them */ + *nal_length_size = 2; + + /* Decode nal units from hvcC. */ + for (i = 0; i < num_arrays; i++) { + int type = bytestream2_get_byte(&gb) & 0x3f; + int cnt = bytestream2_get_be16(&gb); + + for (j = 0; j < cnt; j++) { + // +2 for the nal size field + int nalsize = bytestream2_peek_be16(&gb) + 2; + if (bytestream2_get_bytes_left(&gb) < nalsize) { + av_log(logctx, AV_LOG_ERROR, + "Invalid NAL unit size in extradata.\n"); + return AVERROR_INVALIDDATA; + } + + ret = hevc_decode_nal_units(gb.buffer, nalsize, ps, sei, *is_nalff, + *nal_length_size, err_recognition, apply_defdispwin, + logctx); + if (ret < 0) { + av_log(logctx, AV_LOG_ERROR, + "Decoding nal unit %d %d from hvcC failed\n", + type, i); + return ret; + } + bytestream2_skip(&gb, nalsize); + } + } + + /* Now store right nal length size, that will be used to parse + * all other nals */ + *nal_length_size = nal_len_size; + } else { + *is_nalff = 0; + ret = hevc_decode_nal_units(data, size, ps, sei, *is_nalff, *nal_length_size, + err_recognition, apply_defdispwin, logctx); + if (ret < 0) + return ret; + } + + return ret; +} diff --git a/libavcodec/rpi_hevc_parse.h b/libavcodec/rpi_hevc_parse.h new file mode 100644 index 0000000000..4b4d032a16 --- /dev/null +++ b/libavcodec/rpi_hevc_parse.h @@ -0,0 +1,36 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * H.265 parser code + */ + +#ifndef AVCODEC_RPI_HEVC_PARSE_H +#define AVCODEC_RPI_HEVC_PARSE_H + +#include + +#include "rpi_hevc_ps.h" +#include "rpi_hevc_sei.h" + +int ff_hevc_rpi_decode_extradata(const uint8_t *data, int size, HEVCRpiParamSets *ps, + HEVCSEIContext *sei, int *is_nalff, int *nal_length_size, + int err_recognition, int apply_defdispwin, void *logctx); + +#endif /* AVCODEC_RPI_HEVC_PARSE_H */ diff --git a/libavcodec/rpi_hevc_ps.c b/libavcodec/rpi_hevc_ps.c new file mode 100644 index 0000000000..f4e31f7d1d --- /dev/null +++ b/libavcodec/rpi_hevc_ps.c @@ -0,0 +1,1938 @@ +/* + * HEVC Parameter Set decoding + * + * Copyright (C) 2012 - 2103 Guillaume Martres + * Copyright (C) 2012 - 2103 Mickael Raulet + * Copyright (C) 2012 - 2013 Gildas Cocherel + * Copyright (C) 2013 Vittorio Giovara + * Copyright (C) 2018 John Cox for Raspberry Pi (Trading) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/imgutils.h" +#include "golomb.h" +#include "rpi_hevc_data.h" +#include "rpi_hevc_ps.h" +#include "rpi_hevcdec.h" + +static const uint8_t default_scaling_list_intra[] = { + 16, 16, 16, 16, 17, 18, 21, 24, + 16, 16, 16, 16, 17, 19, 22, 25, + 16, 16, 17, 18, 20, 22, 25, 29, + 16, 16, 18, 21, 24, 27, 31, 36, + 17, 17, 20, 24, 30, 35, 41, 47, + 18, 19, 22, 27, 35, 44, 54, 65, + 21, 22, 25, 31, 41, 54, 70, 88, + 24, 25, 29, 36, 47, 65, 88, 115 +}; + +static const uint8_t default_scaling_list_inter[] = { + 16, 16, 16, 16, 17, 18, 20, 24, + 16, 16, 16, 17, 18, 20, 24, 25, + 16, 16, 17, 18, 20, 24, 25, 28, + 16, 17, 18, 20, 24, 25, 28, 33, + 17, 18, 20, 24, 25, 28, 33, 41, + 18, 20, 24, 25, 28, 33, 41, 54, + 20, 24, 25, 28, 33, 41, 54, 71, + 24, 25, 28, 33, 41, 54, 71, 91 +}; + +static const AVRational vui_sar[] = { + { 0, 1 }, + { 1, 1 }, + { 12, 11 }, + { 10, 11 }, + { 16, 11 }, + { 40, 33 }, + { 24, 11 }, + { 20, 11 }, + { 32, 11 }, + { 80, 33 }, + { 18, 11 }, + { 15, 11 }, + { 64, 33 }, + { 160, 99 }, + { 4, 3 }, + { 3, 2 }, + { 2, 1 }, +}; + + +// pps_cb_qp_offset: -12,+12 +// slice_cb_qp_offset: -12,+12 also +// "The value of pps_cb_qp_offset + slice_cb_qp_offset shall be in the range of -12 to +12, inclusive." +// cr_qp_offset_list[n]: -12,+12 +// So worst case total offset: -24,+24 + +#define T(n) ((((48+(n))/6-10)<<3) | (48+(n))%6) +#define C(B,n) T(B*6+(n) < 0 ? -B*6 : (n) > 51 ? 51 : (n)) +#define M(B,n) C(B,(-n)) + +// Sizeof the QP_START_BLOCK +#define QP_OFFSET_0 (8*6 + 12*2) +#define QP_START(B) \ + M(B,48), M(B,48), M(B,48), M(B,48), M(B,48), M(B,48),\ + M(B,48), M(B,48), M(B,48), M(B,48), M(B,48), M(B,48),\ + M(B,48), M(B,48), M(B,48), M(B,48), M(B,48), M(B,48),\ + M(B,48), M(B,48), M(B,48), M(B,48), M(B,48), M(B,48),\ +\ + M(B,48), M(B,47), M(B,46), M(B,45), M(B,44), M(B,43),\ + M(B,42), M(B,41), M(B,40), M(B,39), M(B,38), M(B,37),\ + M(B,36), M(B,35), M(B,34), M(B,33), M(B,32), M(B,31),\ + M(B,30), M(B,29), M(B,28), M(B,27), M(B,26), M(B,25),\ + M(B,24), M(B,23), M(B,22), M(B,21), M(B,20), M(B,19),\ + M(B,18), M(B,17), M(B,16), M(B,15), M(B,14), M(B,13),\ + M(B,12), M(B,11), M(B,10), M(B, 9), M(B, 8), M(B, 7),\ + M(B, 6), M(B, 5), M(B, 4), M(B, 3), M(B, 2), M(B, 1) +#define QP_END(B) \ + C(B,51), C(B,51), C(B,51), C(B,51), C(B,51), C(B,51),\ + C(B,51), C(B,51), C(B,51), C(B,51), C(B,51), C(B,51),\ + C(B,51), C(B,51), C(B,51), C(B,51), C(B,51), C(B,51) + +#define T1(B)\ +{\ + QP_START(B),\ + C(B, 0), C(B, 1), C(B, 2), C(B, 3), C(B, 4), C(B, 5), C(B, 6), C(B, 7), C(B, 8), C(B, 9),\ + C(B,10), C(B,11), C(B,12), C(B,13), C(B,14), C(B,15), C(B,16), C(B,17), C(B,18), C(B,19),\ + C(B,20), C(B,21), C(B,22), C(B,23), C(B,24), C(B,25), C(B,26), C(B,27), C(B,28), C(B,29),\ + C(B,29), C(B,30), C(B,31), C(B,32), C(B,33), C(B,33), C(B,34), C(B,34), C(B,35), C(B,35),\ + C(B,36), C(B,36), C(B,37), C(B,37), C(B,38), C(B,39), C(B,40), C(B,41), C(B,42), C(B,43),\ + C(B,44), C(B,45),\ + C(B,46), C(B,47), C(B,48), C(B,49), C(B,50), C(B,51),\ + QP_END(B)\ +} +#define T0(B)\ +{\ + QP_START(B),\ + C(B, 0), C(B, 1), C(B, 2), C(B, 3), C(B, 4), C(B, 5), C(B, 6), C(B, 7), C(B, 8), C(B, 9),\ + C(B,10), C(B,11), C(B,12), C(B,13), C(B,14), C(B,15), C(B,16), C(B,17), C(B,18), C(B,19),\ + C(B,20), C(B,21), C(B,22), C(B,23), C(B,24), C(B,25), C(B,26), C(B,27), C(B,28), C(B,29),\ + C(B,30), C(B,31), C(B,32), C(B,33), C(B,34), C(B,35), C(B,36), C(B,37), C(B,38), C(B,39),\ + C(B,40), C(B,41), C(B,42), C(B,43), C(B,44), C(B,45), C(B,46), C(B,47), C(B,48), C(B,49),\ + C(B,50), C(B,51),\ + C(B,51), C(B,51), C(B,51), C(B,51), C(B,51), C(B,51),\ + QP_END(B)\ +} + +#define QP_TABLE_SIZE (QP_OFFSET_0 + 52 + 12*2) + +static const int8_t qp_c_bd_0[8][QP_TABLE_SIZE] = {T0(0),T0(1),T0(2),T0(3),T0(4),T0(5),T0(6),T0(7)}; +static const int8_t qp_c_bd_1[8][QP_TABLE_SIZE] = {T1(0),T1(1),T1(2),T1(3),T1(4),T1(5),T1(6),T1(7)}; + +#undef T +#undef C +#undef QP_END + +#define C(B,n) ((n)<0?0:(n)>51?51:(n)) +// We do need a lot of -ve padding to cope with high bit depths that give -ve qps +#define QP_DBLK_OFFSET_0 QP_OFFSET_0 +#define QP_END(B)\ + 51, 51, 51, 51, 51, 51 + +// These don't need all the padding we have here (12 top/bottom would be enough) +static const uint8_t qp_c_dblk_0[] = T0(0); +static const uint8_t qp_c_dblk_1[] = T1(0); + +#undef T +#undef M +#undef C +#undef QP_END +#undef QP_START + + +static void remove_pps(HEVCRpiParamSets * const s, const int id) +{ + if (s->pps_list[id] && s->pps == (const HEVCRpiPPS*)s->pps_list[id]->data) + s->pps = NULL; + av_buffer_unref(&s->pps_list[id]); +} + +static void remove_sps(HEVCRpiParamSets * const s, const int id) +{ + int i; + if (s->sps_list[id]) { + if (s->sps == (const HEVCRpiSPS*)s->sps_list[id]->data) + s->sps = NULL; + + /* drop all PPS that depend on this SPS */ + for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++) + if (s->pps_list[i] && ((HEVCRpiPPS*)s->pps_list[i]->data)->sps_id == id) + remove_pps(s, i); + + av_assert0(!(s->sps_list[id] && s->sps == (HEVCRpiSPS*)s->sps_list[id]->data)); + } + av_buffer_unref(&s->sps_list[id]); +} + +static void remove_vps(HEVCRpiParamSets * const s, const int id) +{ + int i; + if (s->vps_list[id]) { + if (s->vps == (const HEVCRpiVPS*)s->vps_list[id]->data) + s->vps = NULL; + + for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++) + if (s->sps_list[i] && ((HEVCRpiSPS*)s->sps_list[i]->data)->vps_id == id) + remove_sps(s, i); + } + av_buffer_unref(&s->vps_list[id]); +} + +int ff_hevc_rpi_decode_short_term_rps(GetBitContext * const gb, AVCodecContext * const avctx, + ShortTermRPS * const rps, const HEVCRpiSPS * const sps, const int is_slice_header) +{ + uint8_t rps_predict = 0; + int delta_poc; + int k0 = 0; + int k1 = 0; + int k = 0; + int i; + + if (rps != sps->st_rps && sps->nb_st_rps) + rps_predict = get_bits1(gb); + + if (rps_predict) { + const ShortTermRPS *rps_ridx; + int delta_rps; + unsigned abs_delta_rps; + uint8_t use_delta_flag = 0; + uint8_t delta_rps_sign; + + if (is_slice_header) { + unsigned int delta_idx = get_ue_golomb_long(gb) + 1; + if (delta_idx > sps->nb_st_rps) { + av_log(avctx, AV_LOG_ERROR, + "Invalid value of delta_idx in slice header RPS: %d > %d.\n", + delta_idx, sps->nb_st_rps); + return AVERROR_INVALIDDATA; + } + rps_ridx = &sps->st_rps[sps->nb_st_rps - delta_idx]; + rps->rps_idx_num_delta_pocs = rps_ridx->num_delta_pocs; + } else + rps_ridx = &sps->st_rps[rps - sps->st_rps - 1]; + + delta_rps_sign = get_bits1(gb); + abs_delta_rps = get_ue_golomb_long(gb) + 1; + if (abs_delta_rps < 1 || abs_delta_rps > 32768) { + av_log(avctx, AV_LOG_ERROR, + "Invalid value of abs_delta_rps: %d\n", + abs_delta_rps); + return AVERROR_INVALIDDATA; + } + delta_rps = (1 - (delta_rps_sign << 1)) * abs_delta_rps; + for (i = 0; i <= rps_ridx->num_delta_pocs; i++) { + int used = rps->used[k] = get_bits1(gb); + + if (!used) + use_delta_flag = get_bits1(gb); + + if (used || use_delta_flag) { + if (i < rps_ridx->num_delta_pocs) + delta_poc = delta_rps + rps_ridx->delta_poc[i]; + else + delta_poc = delta_rps; + rps->delta_poc[k] = delta_poc; + if (delta_poc < 0) + k0++; + else + k1++; + k++; + } + } + + if (k >= FF_ARRAY_ELEMS(rps->used)) { + av_log(avctx, AV_LOG_ERROR, + "Invalid num_delta_pocs: %d\n", k); + return AVERROR_INVALIDDATA; + } + + rps->num_delta_pocs = k; + rps->num_negative_pics = k0; + // sort in increasing order (smallest first) + if (rps->num_delta_pocs != 0) { + int used, tmp; + for (i = 1; i < rps->num_delta_pocs; i++) { + delta_poc = rps->delta_poc[i]; + used = rps->used[i]; + for (k = i - 1; k >= 0; k--) { + tmp = rps->delta_poc[k]; + if (delta_poc < tmp) { + rps->delta_poc[k + 1] = tmp; + rps->used[k + 1] = rps->used[k]; + rps->delta_poc[k] = delta_poc; + rps->used[k] = used; + } + } + } + } + if ((rps->num_negative_pics >> 1) != 0) { + int used; + k = rps->num_negative_pics - 1; + // flip the negative values to largest first + for (i = 0; i < rps->num_negative_pics >> 1; i++) { + delta_poc = rps->delta_poc[i]; + used = rps->used[i]; + rps->delta_poc[i] = rps->delta_poc[k]; + rps->used[i] = rps->used[k]; + rps->delta_poc[k] = delta_poc; + rps->used[k] = used; + k--; + } + } + } else { + unsigned int prev, nb_positive_pics; + rps->num_negative_pics = get_ue_golomb_long(gb); + nb_positive_pics = get_ue_golomb_long(gb); + + if (rps->num_negative_pics >= HEVC_MAX_REFS || + nb_positive_pics >= HEVC_MAX_REFS) { + av_log(avctx, AV_LOG_ERROR, "Too many refs in a short term RPS.\n"); + return AVERROR_INVALIDDATA; + } + + rps->num_delta_pocs = rps->num_negative_pics + nb_positive_pics; + if (rps->num_delta_pocs) { + prev = 0; + for (i = 0; i < rps->num_negative_pics; i++) { + delta_poc = get_ue_golomb_long(gb) + 1; + if (delta_poc < 1 || delta_poc > 32768) { + av_log(avctx, AV_LOG_ERROR, + "Invalid value of delta_poc: %d\n", + delta_poc); + return AVERROR_INVALIDDATA; + } + prev -= delta_poc; + rps->delta_poc[i] = prev; + rps->used[i] = get_bits1(gb); + } + prev = 0; + for (i = 0; i < nb_positive_pics; i++) { + delta_poc = get_ue_golomb_long(gb) + 1; + if (delta_poc < 1 || delta_poc > 32768) { + av_log(avctx, AV_LOG_ERROR, + "Invalid value of delta_poc: %d\n", + delta_poc); + return AVERROR_INVALIDDATA; + } + prev += delta_poc; + rps->delta_poc[rps->num_negative_pics + i] = prev; + rps->used[rps->num_negative_pics + i] = get_bits1(gb); + } + } + } + return 0; +} + + +static int decode_profile_tier_level(GetBitContext * const gb, AVCodecContext * const avctx, + PTLCommon * const ptl) +{ + int i; + + if (get_bits_left(gb) < 2+1+5 + 32 + 4 + 16 + 16 + 12) + return -1; + + ptl->profile_space = get_bits(gb, 2); + ptl->tier_flag = get_bits1(gb); + ptl->profile_idc = get_bits(gb, 5); + if (ptl->profile_idc == FF_PROFILE_HEVC_MAIN) + av_log(avctx, AV_LOG_DEBUG, "Main profile bitstream\n"); + else if (ptl->profile_idc == FF_PROFILE_HEVC_MAIN_10) + av_log(avctx, AV_LOG_DEBUG, "Main 10 profile bitstream\n"); + else if (ptl->profile_idc == FF_PROFILE_HEVC_MAIN_STILL_PICTURE) + av_log(avctx, AV_LOG_DEBUG, "Main Still Picture profile bitstream\n"); + else if (ptl->profile_idc == FF_PROFILE_HEVC_REXT) + av_log(avctx, AV_LOG_DEBUG, "Range Extension profile bitstream\n"); + else + av_log(avctx, AV_LOG_WARNING, "Unknown HEVC profile: %d\n", ptl->profile_idc); + + for (i = 0; i < 32; i++) { + ptl->profile_compatibility_flag[i] = get_bits1(gb); + + if (ptl->profile_idc == 0 && i > 0 && ptl->profile_compatibility_flag[i]) + ptl->profile_idc = i; + } + ptl->progressive_source_flag = get_bits1(gb); + ptl->interlaced_source_flag = get_bits1(gb); + ptl->non_packed_constraint_flag = get_bits1(gb); + ptl->frame_only_constraint_flag = get_bits1(gb); + + skip_bits(gb, 16); // XXX_reserved_zero_44bits[0..15] + skip_bits(gb, 16); // XXX_reserved_zero_44bits[16..31] + skip_bits(gb, 12); // XXX_reserved_zero_44bits[32..43] + + return 0; +} + +static int parse_ptl(GetBitContext * const gb, AVCodecContext * const avctx, + PTL * const ptl, const int max_num_sub_layers) +{ + int i; + if (decode_profile_tier_level(gb, avctx, &ptl->general_ptl) < 0 || + get_bits_left(gb) < 8 + (8*2 * (max_num_sub_layers - 1 > 0))) { + av_log(avctx, AV_LOG_ERROR, "PTL information too short\n"); + return -1; + } + + ptl->general_ptl.level_idc = get_bits(gb, 8); + + for (i = 0; i < max_num_sub_layers - 1; i++) { + ptl->sub_layer_profile_present_flag[i] = get_bits1(gb); + ptl->sub_layer_level_present_flag[i] = get_bits1(gb); + } + + if (max_num_sub_layers - 1> 0) + for (i = max_num_sub_layers - 1; i < 8; i++) + skip_bits(gb, 2); // reserved_zero_2bits[i] + for (i = 0; i < max_num_sub_layers - 1; i++) { + if (ptl->sub_layer_profile_present_flag[i] && + decode_profile_tier_level(gb, avctx, &ptl->sub_layer_ptl[i]) < 0) { + av_log(avctx, AV_LOG_ERROR, + "PTL information for sublayer %i too short\n", i); + return -1; + } + if (ptl->sub_layer_level_present_flag[i]) { + if (get_bits_left(gb) < 8) { + av_log(avctx, AV_LOG_ERROR, + "Not enough data for sublayer %i level_idc\n", i); + return -1; + } else + ptl->sub_layer_ptl[i].level_idc = get_bits(gb, 8); + } + } + + return 0; +} + +static void decode_sublayer_hrd(GetBitContext * const gb, const unsigned int nb_cpb, + const int subpic_params_present) +{ + int i; + + for (i = 0; i < nb_cpb; i++) { + get_ue_golomb_long(gb); // bit_rate_value_minus1 + get_ue_golomb_long(gb); // cpb_size_value_minus1 + + if (subpic_params_present) { + get_ue_golomb_long(gb); // cpb_size_du_value_minus1 + get_ue_golomb_long(gb); // bit_rate_du_value_minus1 + } + skip_bits1(gb); // cbr_flag + } +} + +static int decode_hrd(GetBitContext * const gb, const int common_inf_present, + const int max_sublayers) +{ + int nal_params_present = 0, vcl_params_present = 0; + int subpic_params_present = 0; + int i; + + if (common_inf_present) { + nal_params_present = get_bits1(gb); + vcl_params_present = get_bits1(gb); + + if (nal_params_present || vcl_params_present) { + subpic_params_present = get_bits1(gb); + + if (subpic_params_present) { + skip_bits(gb, 8); // tick_divisor_minus2 + skip_bits(gb, 5); // du_cpb_removal_delay_increment_length_minus1 + skip_bits(gb, 1); // sub_pic_cpb_params_in_pic_timing_sei_flag + skip_bits(gb, 5); // dpb_output_delay_du_length_minus1 + } + + skip_bits(gb, 4); // bit_rate_scale + skip_bits(gb, 4); // cpb_size_scale + + if (subpic_params_present) + skip_bits(gb, 4); // cpb_size_du_scale + + skip_bits(gb, 5); // initial_cpb_removal_delay_length_minus1 + skip_bits(gb, 5); // au_cpb_removal_delay_length_minus1 + skip_bits(gb, 5); // dpb_output_delay_length_minus1 + } + } + + for (i = 0; i < max_sublayers; i++) { + int low_delay = 0; + unsigned int nb_cpb = 1; + int fixed_rate = get_bits1(gb); + + if (!fixed_rate) + fixed_rate = get_bits1(gb); + + if (fixed_rate) + get_ue_golomb_long(gb); // elemental_duration_in_tc_minus1 + else + low_delay = get_bits1(gb); + + if (!low_delay) { + nb_cpb = get_ue_golomb_long(gb) + 1; + if (nb_cpb < 1 || nb_cpb > 32) { + av_log(NULL, AV_LOG_ERROR, "nb_cpb %d invalid\n", nb_cpb); + return AVERROR_INVALIDDATA; + } + } + + if (nal_params_present) + decode_sublayer_hrd(gb, nb_cpb, subpic_params_present); + if (vcl_params_present) + decode_sublayer_hrd(gb, nb_cpb, subpic_params_present); + } + return 0; +} + +int ff_hevc_rpi_decode_nal_vps(GetBitContext * const gb, AVCodecContext * const avctx, + HEVCRpiParamSets * const ps) +{ + int i,j; + int vps_id = 0; + ptrdiff_t nal_size; + HEVCRpiVPS *vps; + AVBufferRef *vps_buf = av_buffer_allocz(sizeof(*vps)); + + if (!vps_buf) + return AVERROR(ENOMEM); + vps = (HEVCRpiVPS*)vps_buf->data; + + av_log(avctx, AV_LOG_DEBUG, "Decoding VPS\n"); + + nal_size = gb->buffer_end - gb->buffer; + if (nal_size > sizeof(vps->data)) { + av_log(avctx, AV_LOG_WARNING, "Truncating likely oversized VPS " + "(%"PTRDIFF_SPECIFIER" > %"SIZE_SPECIFIER")\n", + nal_size, sizeof(vps->data)); + vps->data_size = sizeof(vps->data); + } else { + vps->data_size = nal_size; + } + memcpy(vps->data, gb->buffer, vps->data_size); + + vps_id = get_bits(gb, 4); + if (vps_id >= HEVC_MAX_VPS_COUNT) { + av_log(avctx, AV_LOG_ERROR, "VPS id out of range: %d\n", vps_id); + goto err; + } + + if (get_bits(gb, 2) != 3) { // vps_reserved_three_2bits + av_log(avctx, AV_LOG_ERROR, "vps_reserved_three_2bits is not three\n"); + goto err; + } + + vps->vps_max_layers = get_bits(gb, 6) + 1; + vps->vps_max_sub_layers = get_bits(gb, 3) + 1; + vps->vps_temporal_id_nesting_flag = get_bits1(gb); + + if (get_bits(gb, 16) != 0xffff) { // vps_reserved_ffff_16bits + av_log(avctx, AV_LOG_ERROR, "vps_reserved_ffff_16bits is not 0xffff\n"); + goto err; + } + + if (vps->vps_max_sub_layers > HEVC_MAX_SUB_LAYERS) { + av_log(avctx, AV_LOG_ERROR, "vps_max_sub_layers out of range: %d\n", + vps->vps_max_sub_layers); + goto err; + } + + if (parse_ptl(gb, avctx, &vps->ptl, vps->vps_max_sub_layers) < 0) + goto err; + + vps->vps_sub_layer_ordering_info_present_flag = get_bits1(gb); + + i = vps->vps_sub_layer_ordering_info_present_flag ? 0 : vps->vps_max_sub_layers - 1; + for (; i < vps->vps_max_sub_layers; i++) { + vps->vps_max_dec_pic_buffering[i] = get_ue_golomb_long(gb) + 1; + vps->vps_num_reorder_pics[i] = get_ue_golomb_long(gb); + vps->vps_max_latency_increase[i] = get_ue_golomb_long(gb) - 1; + + if (vps->vps_max_dec_pic_buffering[i] > HEVC_MAX_DPB_SIZE || !vps->vps_max_dec_pic_buffering[i]) { + av_log(avctx, AV_LOG_ERROR, "vps_max_dec_pic_buffering_minus1 out of range: %d\n", + vps->vps_max_dec_pic_buffering[i] - 1); + goto err; + } + if (vps->vps_num_reorder_pics[i] > vps->vps_max_dec_pic_buffering[i] - 1) { + av_log(avctx, AV_LOG_WARNING, "vps_max_num_reorder_pics out of range: %d\n", + vps->vps_num_reorder_pics[i]); + if (avctx->err_recognition & AV_EF_EXPLODE) + goto err; + } + } + + vps->vps_max_layer_id = get_bits(gb, 6); + vps->vps_num_layer_sets = get_ue_golomb_long(gb) + 1; + if (vps->vps_num_layer_sets < 1 || vps->vps_num_layer_sets > 1024 || + (vps->vps_num_layer_sets - 1LL) * (vps->vps_max_layer_id + 1LL) > get_bits_left(gb)) { + av_log(avctx, AV_LOG_ERROR, "too many layer_id_included_flags\n"); + goto err; + } + + for (i = 1; i < vps->vps_num_layer_sets; i++) + for (j = 0; j <= vps->vps_max_layer_id; j++) + skip_bits(gb, 1); // layer_id_included_flag[i][j] + + vps->vps_timing_info_present_flag = get_bits1(gb); + if (vps->vps_timing_info_present_flag) { + vps->vps_num_units_in_tick = get_bits_long(gb, 32); + vps->vps_time_scale = get_bits_long(gb, 32); + vps->vps_poc_proportional_to_timing_flag = get_bits1(gb); + if (vps->vps_poc_proportional_to_timing_flag) + vps->vps_num_ticks_poc_diff_one = get_ue_golomb_long(gb) + 1; + vps->vps_num_hrd_parameters = get_ue_golomb_long(gb); + if (vps->vps_num_hrd_parameters > (unsigned)vps->vps_num_layer_sets) { + av_log(avctx, AV_LOG_ERROR, + "vps_num_hrd_parameters %d is invalid\n", vps->vps_num_hrd_parameters); + goto err; + } + for (i = 0; i < vps->vps_num_hrd_parameters; i++) { + int common_inf_present = 1; + + get_ue_golomb_long(gb); // hrd_layer_set_idx + if (i) + common_inf_present = get_bits1(gb); + decode_hrd(gb, common_inf_present, vps->vps_max_sub_layers); + } + } + get_bits1(gb); /* vps_extension_flag */ + + if (get_bits_left(gb) < 0) { + av_log(avctx, AV_LOG_ERROR, + "Overread VPS by %d bits\n", -get_bits_left(gb)); + if (ps->vps_list[vps_id]) + goto err; + } + + if (ps->vps_list[vps_id] && + !memcmp(ps->vps_list[vps_id]->data, vps_buf->data, vps_buf->size)) { + av_buffer_unref(&vps_buf); + } else { + remove_vps(ps, vps_id); + ps->vps_list[vps_id] = vps_buf; + } + + return 0; + +err: + av_buffer_unref(&vps_buf); + return AVERROR_INVALIDDATA; +} + +static void decode_vui(GetBitContext * const gb, AVCodecContext * const avctx, + const int apply_defdispwin, HEVCRpiSPS * const sps) +{ + VUI backup_vui, * const vui = &sps->vui; + GetBitContext backup; + int sar_present, alt = 0; + + av_log(avctx, AV_LOG_DEBUG, "Decoding VUI\n"); + + sar_present = get_bits1(gb); + if (sar_present) { + uint8_t sar_idx = get_bits(gb, 8); + if (sar_idx < FF_ARRAY_ELEMS(vui_sar)) + vui->sar = vui_sar[sar_idx]; + else if (sar_idx == 255) { + vui->sar.num = get_bits(gb, 16); + vui->sar.den = get_bits(gb, 16); + } else + av_log(avctx, AV_LOG_WARNING, + "Unknown SAR index: %u.\n", sar_idx); + } + + vui->overscan_info_present_flag = get_bits1(gb); + if (vui->overscan_info_present_flag) + vui->overscan_appropriate_flag = get_bits1(gb); + + vui->video_signal_type_present_flag = get_bits1(gb); + if (vui->video_signal_type_present_flag) { + vui->video_format = get_bits(gb, 3); + vui->video_full_range_flag = get_bits1(gb); + vui->colour_description_present_flag = get_bits1(gb); + if (vui->video_full_range_flag && sps->pix_fmt == AV_PIX_FMT_YUV420P) + sps->pix_fmt = AV_PIX_FMT_YUVJ420P; + if (vui->colour_description_present_flag) { + vui->colour_primaries = get_bits(gb, 8); + vui->transfer_characteristic = get_bits(gb, 8); + vui->matrix_coeffs = get_bits(gb, 8); + + // Set invalid values to "unspecified" + if (!av_color_primaries_name(vui->colour_primaries)) + vui->colour_primaries = AVCOL_PRI_UNSPECIFIED; + if (!av_color_transfer_name(vui->transfer_characteristic)) + vui->transfer_characteristic = AVCOL_TRC_UNSPECIFIED; + if (!av_color_space_name(vui->matrix_coeffs)) + vui->matrix_coeffs = AVCOL_SPC_UNSPECIFIED; + if (vui->matrix_coeffs == AVCOL_SPC_RGB) { + switch (sps->pix_fmt) { + case AV_PIX_FMT_YUV444P: + sps->pix_fmt = AV_PIX_FMT_GBRP; + break; + case AV_PIX_FMT_YUV444P10: + sps->pix_fmt = AV_PIX_FMT_GBRP10; + break; + case AV_PIX_FMT_YUV444P12: + sps->pix_fmt = AV_PIX_FMT_GBRP12; + break; + } + } + } + } + + vui->chroma_loc_info_present_flag = get_bits1(gb); + if (vui->chroma_loc_info_present_flag) { + vui->chroma_sample_loc_type_top_field = get_ue_golomb_long(gb); + vui->chroma_sample_loc_type_bottom_field = get_ue_golomb_long(gb); + } + + vui->neutra_chroma_indication_flag = get_bits1(gb); + vui->field_seq_flag = get_bits1(gb); + vui->frame_field_info_present_flag = get_bits1(gb); + + // Backup context in case an alternate header is detected + memcpy(&backup, gb, sizeof(backup)); + memcpy(&backup_vui, vui, sizeof(backup_vui)); + if (get_bits_left(gb) >= 68 && show_bits_long(gb, 21) == 0x100000) { + vui->default_display_window_flag = 0; + av_log(avctx, AV_LOG_WARNING, "Invalid default display window\n"); + } else + vui->default_display_window_flag = get_bits1(gb); + + if (vui->default_display_window_flag) { + int vert_mult = 1 + (sps->chroma_format_idc < 2); + int horiz_mult = 1 + (sps->chroma_format_idc < 3); + vui->def_disp_win.left_offset = get_ue_golomb_long(gb) * horiz_mult; + vui->def_disp_win.right_offset = get_ue_golomb_long(gb) * horiz_mult; + vui->def_disp_win.top_offset = get_ue_golomb_long(gb) * vert_mult; + vui->def_disp_win.bottom_offset = get_ue_golomb_long(gb) * vert_mult; + + if (apply_defdispwin && + avctx->flags2 & AV_CODEC_FLAG2_IGNORE_CROP) { + av_log(avctx, AV_LOG_DEBUG, + "discarding vui default display window, " + "original values are l:%u r:%u t:%u b:%u\n", + vui->def_disp_win.left_offset, + vui->def_disp_win.right_offset, + vui->def_disp_win.top_offset, + vui->def_disp_win.bottom_offset); + + vui->def_disp_win.left_offset = + vui->def_disp_win.right_offset = + vui->def_disp_win.top_offset = + vui->def_disp_win.bottom_offset = 0; + } + } + +timing_info: + vui->vui_timing_info_present_flag = get_bits1(gb); + + if (vui->vui_timing_info_present_flag) { + if( get_bits_left(gb) < 66 && !alt) { + // The alternate syntax seem to have timing info located + // at where def_disp_win is normally located + av_log(avctx, AV_LOG_WARNING, + "Strange VUI timing information, retrying...\n"); + memcpy(vui, &backup_vui, sizeof(backup_vui)); + memcpy(gb, &backup, sizeof(backup)); + alt = 1; + goto timing_info; + } + vui->vui_num_units_in_tick = get_bits_long(gb, 32); + vui->vui_time_scale = get_bits_long(gb, 32); + if (alt) { + av_log(avctx, AV_LOG_INFO, "Retry got %"PRIu32"/%"PRIu32" fps\n", + vui->vui_time_scale, vui->vui_num_units_in_tick); + } + vui->vui_poc_proportional_to_timing_flag = get_bits1(gb); + if (vui->vui_poc_proportional_to_timing_flag) + vui->vui_num_ticks_poc_diff_one_minus1 = get_ue_golomb_long(gb); + vui->vui_hrd_parameters_present_flag = get_bits1(gb); + if (vui->vui_hrd_parameters_present_flag) + decode_hrd(gb, 1, sps->max_sub_layers); + } + + vui->bitstream_restriction_flag = get_bits1(gb); + if (vui->bitstream_restriction_flag) { + if (get_bits_left(gb) < 8 && !alt) { + av_log(avctx, AV_LOG_WARNING, + "Strange VUI bitstream restriction information, retrying" + " from timing information...\n"); + memcpy(vui, &backup_vui, sizeof(backup_vui)); + memcpy(gb, &backup, sizeof(backup)); + alt = 1; + goto timing_info; + } + vui->tiles_fixed_structure_flag = get_bits1(gb); + vui->motion_vectors_over_pic_boundaries_flag = get_bits1(gb); + vui->restricted_ref_pic_lists_flag = get_bits1(gb); + vui->min_spatial_segmentation_idc = get_ue_golomb_long(gb); + vui->max_bytes_per_pic_denom = get_ue_golomb_long(gb); + vui->max_bits_per_min_cu_denom = get_ue_golomb_long(gb); + vui->log2_max_mv_length_horizontal = get_ue_golomb_long(gb); + vui->log2_max_mv_length_vertical = get_ue_golomb_long(gb); + } + + if (get_bits_left(gb) < 1 && !alt) { + // XXX: Alternate syntax when sps_range_extension_flag != 0? + av_log(avctx, AV_LOG_WARNING, + "Overread in VUI, retrying from timing information...\n"); + memcpy(vui, &backup_vui, sizeof(backup_vui)); + memcpy(gb, &backup, sizeof(backup)); + alt = 1; + goto timing_info; + } +} + +static void set_default_scaling_list_data(ScalingList * const sl) +{ + int matrixId; + + for (matrixId = 0; matrixId < 6; matrixId++) { + // 4x4 default is 16 + memset(sl->sl[0][matrixId], 16, 16); + sl->sl_dc[0][matrixId] = 16; // default for 16x16 + sl->sl_dc[1][matrixId] = 16; // default for 32x32 + } + + memcpy(sl->sl[1][0], default_scaling_list_intra, 64); + memcpy(sl->sl[1][1], default_scaling_list_intra, 64); + memcpy(sl->sl[1][2], default_scaling_list_intra, 64); + + memcpy(sl->sl[1][3], default_scaling_list_inter, 64); + memcpy(sl->sl[1][4], default_scaling_list_inter, 64); + memcpy(sl->sl[1][5], default_scaling_list_inter, 64); + + memcpy(sl->sl[2][0], default_scaling_list_intra, 64); + memcpy(sl->sl[2][1], default_scaling_list_intra, 64); + memcpy(sl->sl[2][2], default_scaling_list_intra, 64); + + memcpy(sl->sl[2][3], default_scaling_list_inter, 64); + memcpy(sl->sl[2][4], default_scaling_list_inter, 64); + memcpy(sl->sl[2][5], default_scaling_list_inter, 64); + + memcpy(sl->sl[3][0], default_scaling_list_intra, 64); + memcpy(sl->sl[3][1], default_scaling_list_intra, 64); + memcpy(sl->sl[3][2], default_scaling_list_intra, 64); + + memcpy(sl->sl[3][3], default_scaling_list_inter, 64); + memcpy(sl->sl[3][4], default_scaling_list_inter, 64); + memcpy(sl->sl[3][5], default_scaling_list_inter, 64); +} + +static int scaling_list_data(GetBitContext * const gb, AVCodecContext * const avctx, ScalingList * const sl, + const HEVCRpiSPS * const sps) +{ + uint8_t scaling_list_pred_mode_flag; + int32_t scaling_list_dc_coef[2][6]; + int size_id, matrix_id, pos; + int i; + + for (size_id = 0; size_id < 4; size_id++) + for (matrix_id = 0; matrix_id < 6; matrix_id += ((size_id == 3) ? 3 : 1)) { + scaling_list_pred_mode_flag = get_bits1(gb); + if (!scaling_list_pred_mode_flag) { + unsigned int delta = get_ue_golomb_long(gb); + /* Only need to handle non-zero delta. Zero means default, + * which should already be in the arrays. */ + if (delta) { + // Copy from previous array. + delta *= (size_id == 3) ? 3 : 1; + if (matrix_id < delta) { + av_log(avctx, AV_LOG_ERROR, + "Invalid delta in scaling list data: %d.\n", delta); + return AVERROR_INVALIDDATA; + } + + memcpy(sl->sl[size_id][matrix_id], + sl->sl[size_id][matrix_id - delta], + size_id > 0 ? 64 : 16); + if (size_id > 1) + sl->sl_dc[size_id - 2][matrix_id] = sl->sl_dc[size_id - 2][matrix_id - delta]; + } + } else { + int next_coef, coef_num; + int32_t scaling_list_delta_coef; + + next_coef = 8; + coef_num = FFMIN(64, 1 << (4 + (size_id << 1))); + if (size_id > 1) { + scaling_list_dc_coef[size_id - 2][matrix_id] = get_se_golomb(gb) + 8; + next_coef = scaling_list_dc_coef[size_id - 2][matrix_id]; + sl->sl_dc[size_id - 2][matrix_id] = next_coef; + } + for (i = 0; i < coef_num; i++) { + if (size_id == 0) + pos = 4 * ff_hevc_rpi_diag_scan4x4_y[i] + + ff_hevc_rpi_diag_scan4x4_x[i]; + else + pos = 8 * ff_hevc_rpi_diag_scan8x8_y[i] + + ff_hevc_rpi_diag_scan8x8_x[i]; + + scaling_list_delta_coef = get_se_golomb(gb); + next_coef = (next_coef + 256U + scaling_list_delta_coef) % 256; + sl->sl[size_id][matrix_id][pos] = next_coef; + } + } + } + + if (sps->chroma_format_idc == 3) { + for (i = 0; i < 64; i++) { + sl->sl[3][1][i] = sl->sl[2][1][i]; + sl->sl[3][2][i] = sl->sl[2][2][i]; + sl->sl[3][4][i] = sl->sl[2][4][i]; + sl->sl[3][5][i] = sl->sl[2][5][i]; + } + sl->sl_dc[1][1] = sl->sl_dc[0][1]; + sl->sl_dc[1][2] = sl->sl_dc[0][2]; + sl->sl_dc[1][4] = sl->sl_dc[0][4]; + sl->sl_dc[1][5] = sl->sl_dc[0][5]; + } + + + return 0; +} + +static int map_pixel_format(HEVCRpiSPS * const sps) +{ + const int cfmt = sps->chroma_format_idc; + + sps->pix_fmt = AV_PIX_FMT_NONE; + switch (sps->bit_depth) { + case 8: + if (cfmt == 1) + sps->pix_fmt = AV_PIX_FMT_SAND128; + break; + case 10: + if (cfmt == 1) + sps->pix_fmt = AV_PIX_FMT_SAND64_10; + break; + default: + break; + } + + sps->hshift[0] = sps->vshift[0] = 0; + sps->hshift[2] = sps->hshift[1] = cfmt > 2 ? 0 : 1; // 1 unless 4:4:4 + sps->vshift[2] = sps->vshift[1] = cfmt > 1 ? 0 : 1; // 1 unless 4:4:4 or 4:2:2 + + sps->pixel_shift = sps->bit_depth > 8 ? 1 : 0; + + return 0; +} + +static int ff_hevc_rpi_parse_sps(HEVCRpiSPS * const sps, GetBitContext * const gb, unsigned int * const sps_id, + const int apply_defdispwin, AVBufferRef * const * const vps_list, AVCodecContext * const avctx) +{ + HEVCRpiWindow *ow; + int ret = 0; + int log2_diff_max_min_transform_block_size; + int bit_depth_chroma, start, vui_present, sublayer_ordering_info; + int i; + + // Coded parameters + + sps->vps_id = get_bits(gb, 4); + if (sps->vps_id >= HEVC_MAX_VPS_COUNT) { + av_log(avctx, AV_LOG_ERROR, "VPS id out of range: %d\n", sps->vps_id); + return AVERROR_INVALIDDATA; + } + + if (vps_list && !vps_list[sps->vps_id]) { + av_log(avctx, AV_LOG_ERROR, "VPS %d does not exist\n", + sps->vps_id); + return AVERROR_INVALIDDATA; + } + + sps->max_sub_layers = get_bits(gb, 3) + 1; + if (sps->max_sub_layers > HEVC_MAX_SUB_LAYERS) { + av_log(avctx, AV_LOG_ERROR, "sps_max_sub_layers out of range: %d\n", + sps->max_sub_layers); + return AVERROR_INVALIDDATA; + } + + sps->temporal_id_nesting_flag = get_bits(gb, 1); + + if ((ret = parse_ptl(gb, avctx, &sps->ptl, sps->max_sub_layers)) < 0) + return ret; + + *sps_id = get_ue_golomb_long(gb); + if (*sps_id >= HEVC_MAX_SPS_COUNT) { + av_log(avctx, AV_LOG_ERROR, "SPS id out of range: %d\n", *sps_id); + return AVERROR_INVALIDDATA; + } + + sps->chroma_format_idc = get_ue_golomb_long(gb); + if (sps->chroma_format_idc > 3U) { + av_log(avctx, AV_LOG_ERROR, "chroma_format_idc %d is invalid\n", sps->chroma_format_idc); + return AVERROR_INVALIDDATA; + } + + if (sps->chroma_format_idc == 3) + sps->separate_colour_plane_flag = get_bits1(gb); + + if (sps->separate_colour_plane_flag) + sps->chroma_format_idc = 0; + + sps->width = get_ue_golomb_long(gb); + sps->height = get_ue_golomb_long(gb); + if ((ret = av_image_check_size(sps->width, + sps->height, 0, avctx)) < 0) + return ret; + + if (get_bits1(gb)) { // pic_conformance_flag + int vert_mult = 1 + (sps->chroma_format_idc < 2); + int horiz_mult = 1 + (sps->chroma_format_idc < 3); + sps->pic_conf_win.left_offset = get_ue_golomb_long(gb) * horiz_mult; + sps->pic_conf_win.right_offset = get_ue_golomb_long(gb) * horiz_mult; + sps->pic_conf_win.top_offset = get_ue_golomb_long(gb) * vert_mult; + sps->pic_conf_win.bottom_offset = get_ue_golomb_long(gb) * vert_mult; + + if (avctx->flags2 & AV_CODEC_FLAG2_IGNORE_CROP) { + av_log(avctx, AV_LOG_DEBUG, + "discarding sps conformance window, " + "original values are l:%u r:%u t:%u b:%u\n", + sps->pic_conf_win.left_offset, + sps->pic_conf_win.right_offset, + sps->pic_conf_win.top_offset, + sps->pic_conf_win.bottom_offset); + + sps->pic_conf_win.left_offset = + sps->pic_conf_win.right_offset = + sps->pic_conf_win.top_offset = + sps->pic_conf_win.bottom_offset = 0; + } + sps->output_window = sps->pic_conf_win; + } + + sps->bit_depth = get_ue_golomb_long(gb) + 8; + bit_depth_chroma = get_ue_golomb_long(gb) + 8; + if (sps->chroma_format_idc && bit_depth_chroma != sps->bit_depth) { + av_log(avctx, AV_LOG_ERROR, + "Luma bit depth (%d) is different from chroma bit depth (%d), " + "this is unsupported.\n", + sps->bit_depth, bit_depth_chroma); + return AVERROR_INVALIDDATA; + } + + ret = map_pixel_format(sps); + if (ret < 0) + return ret; + + sps->log2_max_poc_lsb = get_ue_golomb_long(gb) + 4; + if (sps->log2_max_poc_lsb > 16) { + av_log(avctx, AV_LOG_ERROR, "log2_max_pic_order_cnt_lsb_minus4 out range: %d\n", + sps->log2_max_poc_lsb - 4); + return AVERROR_INVALIDDATA; + } + + sublayer_ordering_info = get_bits1(gb); + start = sublayer_ordering_info ? 0 : sps->max_sub_layers - 1; + for (i = start; i < sps->max_sub_layers; i++) { + sps->temporal_layer[i].max_dec_pic_buffering = get_ue_golomb_long(gb) + 1; + sps->temporal_layer[i].num_reorder_pics = get_ue_golomb_long(gb); + sps->temporal_layer[i].max_latency_increase = get_ue_golomb_long(gb) - 1; + if (sps->temporal_layer[i].max_dec_pic_buffering > (unsigned)HEVC_MAX_DPB_SIZE) { + av_log(avctx, AV_LOG_ERROR, "sps_max_dec_pic_buffering_minus1 out of range: %d\n", + sps->temporal_layer[i].max_dec_pic_buffering - 1U); + return AVERROR_INVALIDDATA; + } + if (sps->temporal_layer[i].num_reorder_pics > sps->temporal_layer[i].max_dec_pic_buffering - 1) { + av_log(avctx, AV_LOG_WARNING, "sps_max_num_reorder_pics out of range: %d\n", + sps->temporal_layer[i].num_reorder_pics); + if (avctx->err_recognition & AV_EF_EXPLODE || + sps->temporal_layer[i].num_reorder_pics > HEVC_MAX_DPB_SIZE - 1) { + return AVERROR_INVALIDDATA; + } + sps->temporal_layer[i].max_dec_pic_buffering = sps->temporal_layer[i].num_reorder_pics + 1; + } + } + + if (!sublayer_ordering_info) { + for (i = 0; i < start; i++) { + sps->temporal_layer[i].max_dec_pic_buffering = sps->temporal_layer[start].max_dec_pic_buffering; + sps->temporal_layer[i].num_reorder_pics = sps->temporal_layer[start].num_reorder_pics; + sps->temporal_layer[i].max_latency_increase = sps->temporal_layer[start].max_latency_increase; + } + } + + sps->log2_min_cb_size = get_ue_golomb_long(gb) + 3; + sps->log2_diff_max_min_coding_block_size = get_ue_golomb_long(gb); + sps->log2_min_tb_size = get_ue_golomb_long(gb) + 2; + log2_diff_max_min_transform_block_size = get_ue_golomb_long(gb); + sps->log2_max_trafo_size = log2_diff_max_min_transform_block_size + + sps->log2_min_tb_size; + + if (sps->log2_min_cb_size < 3 || sps->log2_min_cb_size > 30) { + av_log(avctx, AV_LOG_ERROR, "Invalid value %d for log2_min_cb_size", sps->log2_min_cb_size); + return AVERROR_INVALIDDATA; + } + + if (sps->log2_diff_max_min_coding_block_size > 30) { + av_log(avctx, AV_LOG_ERROR, "Invalid value %d for log2_diff_max_min_coding_block_size", sps->log2_diff_max_min_coding_block_size); + return AVERROR_INVALIDDATA; + } + + if (sps->log2_min_tb_size >= sps->log2_min_cb_size || sps->log2_min_tb_size < 2) { + av_log(avctx, AV_LOG_ERROR, "Invalid value for log2_min_tb_size"); + return AVERROR_INVALIDDATA; + } + + if (log2_diff_max_min_transform_block_size < 0 || log2_diff_max_min_transform_block_size > 30) { + av_log(avctx, AV_LOG_ERROR, "Invalid value %d for log2_diff_max_min_transform_block_size", log2_diff_max_min_transform_block_size); + return AVERROR_INVALIDDATA; + } + + { + const unsigned int CtbLog2SizeY = sps->log2_min_cb_size + sps->log2_diff_max_min_coding_block_size; + // Not a bitstream limitation, but all profiles + if (CtbLog2SizeY < 4 || CtbLog2SizeY > HEVC_MAX_LOG2_CTB_SIZE) { + av_log(avctx, AV_LOG_ERROR, "Invalid value %d for CtbLog2SizeY", CtbLog2SizeY); + return AVERROR_INVALIDDATA; + } + + if (sps->log2_max_trafo_size > FFMIN(5, CtbLog2SizeY)) { + av_log(avctx, AV_LOG_ERROR, "Invalid value %d for MaxTbLog2SizeY", sps->log2_max_trafo_size); + return AVERROR_INVALIDDATA; + } + + // Inferred parameters + sps->log2_ctb_size = CtbLog2SizeY; +// sps->log2_min_pu_size = sps->log2_min_cb_size - 1; + } + + sps->max_transform_hierarchy_depth_inter = get_ue_golomb_long(gb); + sps->max_transform_hierarchy_depth_intra = get_ue_golomb_long(gb); + + sps->scaling_list_enable_flag = get_bits1(gb); + if (sps->scaling_list_enable_flag) { + set_default_scaling_list_data(&sps->scaling_list); + + if (get_bits1(gb)) { + ret = scaling_list_data(gb, avctx, &sps->scaling_list, sps); + if (ret < 0) + return ret; + } + } + + sps->amp_enabled_flag = get_bits1(gb); + sps->sao_enabled = get_bits1(gb); + + // Set pcm defaults (0) so we don't have to test _enabled when we + // want to use them + memset(&sps->pcm, 0, sizeof(sps->pcm)); + + if (get_bits1(gb)) // pcm_enabled_flag + { + const unsigned int limit_max_pcm = FFMIN(5, + sps->log2_min_cb_size + sps->log2_diff_max_min_coding_block_size); + sps->pcm.bit_depth = get_bits(gb, 4) + 1; + sps->pcm.bit_depth_chroma = get_bits(gb, 4) + 1; + sps->pcm.log2_min_pcm_cb_size = get_ue_golomb_long(gb) + 3; + sps->pcm.log2_max_pcm_cb_size = sps->pcm.log2_min_pcm_cb_size + + get_ue_golomb_long(gb); + if (FFMAX(sps->pcm.bit_depth, sps->pcm.bit_depth_chroma) > sps->bit_depth) { + av_log(avctx, AV_LOG_ERROR, + "PCM bit depth (%d, %d) is greater than normal bit depth (%d)\n", + sps->pcm.bit_depth, sps->pcm.bit_depth_chroma, sps->bit_depth); + return AVERROR_INVALIDDATA; + } + if (sps->pcm.log2_min_pcm_cb_size < sps->log2_min_cb_size || + sps->pcm.log2_max_pcm_cb_size > limit_max_pcm) { + av_log(avctx, AV_LOG_ERROR, "Bad PCM CB min/max size (%d->%d)", + sps->pcm.log2_min_pcm_cb_size, sps->pcm.log2_max_pcm_cb_size); + return AVERROR_INVALIDDATA; + } + + sps->pcm.loop_filter_disable_flag = get_bits1(gb); + } + + // Could be based on min_pcm_cb_size but much easier logic if we just stick + // with 8 (and costs us little) + sps->pcm_width = (sps->width + 63) >> 6; // 8 for min size, 8 bits per byte - round up + sps->pcm_height = (sps->height + 7) >> 3; + + sps->nb_st_rps = get_ue_golomb_long(gb); + if (sps->nb_st_rps > HEVC_MAX_SHORT_TERM_REF_PIC_SETS) { + av_log(avctx, AV_LOG_ERROR, "Too many short term RPS: %d.\n", + sps->nb_st_rps); + return AVERROR_INVALIDDATA; + } + for (i = 0; i < sps->nb_st_rps; i++) { + if ((ret = ff_hevc_rpi_decode_short_term_rps(gb, avctx, &sps->st_rps[i], + sps, 0)) < 0) + return ret; + } + + sps->long_term_ref_pics_present_flag = get_bits1(gb); + if (sps->long_term_ref_pics_present_flag) { + sps->num_long_term_ref_pics_sps = get_ue_golomb_long(gb); + if (sps->num_long_term_ref_pics_sps > HEVC_MAX_LONG_TERM_REF_PICS) { + av_log(avctx, AV_LOG_ERROR, "num_long_term_ref_pics_sps %d is out of range.\n", + sps->num_long_term_ref_pics_sps); + return AVERROR_INVALIDDATA; + } + for (i = 0; i < sps->num_long_term_ref_pics_sps; i++) { + sps->lt_ref_pic_poc_lsb_sps[i] = get_bits(gb, sps->log2_max_poc_lsb); + sps->used_by_curr_pic_lt_sps_flag[i] = get_bits1(gb); + } + } + + sps->sps_temporal_mvp_enabled_flag = get_bits1(gb); + sps->intra_filters_disable = get_bits1(gb) ? 0 : FILTER_STRONG; // sps->sps_strong_intra_smoothing_enable_flag + sps->vui.sar = (AVRational){0, 1}; + vui_present = get_bits1(gb); + if (vui_present) + decode_vui(gb, avctx, apply_defdispwin, sps); + + if (get_bits1(gb)) { // sps_extension_flag + int sps_extension_flag[1]; + for (i = 0; i < 1; i++) + sps_extension_flag[i] = get_bits1(gb); + skip_bits(gb, 7); //sps_extension_7bits = get_bits(gb, 7); + if (sps_extension_flag[0]) { + int extended_precision_processing_flag; + int cabac_bypass_alignment_enabled_flag; + + sps->transform_skip_rotation_enabled_flag = get_bits1(gb); + sps->transform_skip_context_enabled_flag = get_bits1(gb); + sps->implicit_rdpcm_enabled_flag = get_bits1(gb); + + sps->explicit_rdpcm_enabled_flag = get_bits1(gb); + + extended_precision_processing_flag = get_bits1(gb); + if (extended_precision_processing_flag) + av_log(avctx, AV_LOG_WARNING, + "extended_precision_processing_flag not yet implemented\n"); + + if (get_bits1(gb)) // sps->intra_smoothing_disabled_flag + sps->intra_filters_disable |= FILTER_EITHER; + sps->high_precision_offsets_enabled_flag = get_bits1(gb); + sps->persistent_rice_adaptation_enabled_flag = get_bits1(gb); + + cabac_bypass_alignment_enabled_flag = get_bits1(gb); + if (cabac_bypass_alignment_enabled_flag) + av_log(avctx, AV_LOG_WARNING, + "cabac_bypass_alignment_enabled_flag not yet implemented\n"); + } + } + if (apply_defdispwin) { + sps->output_window.left_offset += sps->vui.def_disp_win.left_offset; + sps->output_window.right_offset += sps->vui.def_disp_win.right_offset; + sps->output_window.top_offset += sps->vui.def_disp_win.top_offset; + sps->output_window.bottom_offset += sps->vui.def_disp_win.bottom_offset; + } + + ow = &sps->output_window; + if (ow->left_offset >= INT_MAX - ow->right_offset || + ow->top_offset >= INT_MAX - ow->bottom_offset || + ow->left_offset + ow->right_offset >= sps->width || + ow->top_offset + ow->bottom_offset >= sps->height) { + av_log(avctx, AV_LOG_WARNING, "Invalid cropping offsets: %u/%u/%u/%u\n", + ow->left_offset, ow->right_offset, ow->top_offset, ow->bottom_offset); + if (avctx->err_recognition & AV_EF_EXPLODE) { + return AVERROR_INVALIDDATA; + } + av_log(avctx, AV_LOG_WARNING, + "Displaying the whole video surface.\n"); + memset(ow, 0, sizeof(*ow)); + memset(&sps->pic_conf_win, 0, sizeof(sps->pic_conf_win)); + } + + // Inferred parameters + + sps->ctb_width = (sps->width + (1 << sps->log2_ctb_size) - 1) >> sps->log2_ctb_size; + sps->ctb_height = (sps->height + (1 << sps->log2_ctb_size) - 1) >> sps->log2_ctb_size; + sps->ctb_size = sps->ctb_width * sps->ctb_height; + + sps->min_cb_width = sps->width >> sps->log2_min_cb_size; + sps->min_cb_height = sps->height >> sps->log2_min_cb_size; + sps->min_tb_width = sps->width >> sps->log2_min_tb_size; + sps->min_tb_height = sps->height >> sps->log2_min_tb_size; + sps->min_pu_width = sps->width >> LOG2_MIN_PU_SIZE; + sps->min_pu_height = sps->height >> LOG2_MIN_PU_SIZE; + sps->tb_mask = (1 << (sps->log2_ctb_size - sps->log2_min_tb_size)) - 1; + + sps->qp_bd_offset = 6 * (sps->bit_depth - 8); + sps->wp_offset_half_range = (1U << (sps->high_precision_offsets_enabled_flag ? sps->bit_depth - 1 : 7)); + + if (av_mod_uintp2(sps->width, sps->log2_min_cb_size) || + av_mod_uintp2(sps->height, sps->log2_min_cb_size)) { + av_log(avctx, AV_LOG_ERROR, "Invalid coded frame dimensions.\n"); + return AVERROR_INVALIDDATA; + } + + if (sps->max_transform_hierarchy_depth_inter > sps->log2_ctb_size - sps->log2_min_tb_size) { + av_log(avctx, AV_LOG_ERROR, "max_transform_hierarchy_depth_inter out of range: %d\n", + sps->max_transform_hierarchy_depth_inter); + return AVERROR_INVALIDDATA; + } + if (sps->max_transform_hierarchy_depth_intra > sps->log2_ctb_size - sps->log2_min_tb_size) { + av_log(avctx, AV_LOG_ERROR, "max_transform_hierarchy_depth_intra out of range: %d\n", + sps->max_transform_hierarchy_depth_intra); + return AVERROR_INVALIDDATA; + } + if (sps->log2_max_trafo_size > FFMIN(sps->log2_ctb_size, 5)) { + av_log(avctx, AV_LOG_ERROR, + "max transform block size out of range: %d\n", + sps->log2_max_trafo_size); + return AVERROR_INVALIDDATA; + } + + if (get_bits_left(gb) < 0) { + av_log(avctx, AV_LOG_ERROR, + "Overread SPS by %d bits\n", -get_bits_left(gb)); + return AVERROR_INVALIDDATA; + } + + return 0; +} + +int ff_hevc_rpi_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx, + HEVCRpiParamSets *ps, int apply_defdispwin) +{ + HEVCRpiSPS *sps; + AVBufferRef *sps_buf = av_buffer_allocz(sizeof(*sps)); + unsigned int sps_id; + int ret; + ptrdiff_t nal_size; + + if (!sps_buf) + return AVERROR(ENOMEM); + sps = (HEVCRpiSPS*)sps_buf->data; + + av_log(avctx, AV_LOG_DEBUG, "Decoding SPS\n"); + + nal_size = gb->buffer_end - gb->buffer; + if (nal_size > sizeof(sps->data)) { + av_log(avctx, AV_LOG_WARNING, "Truncating likely oversized SPS " + "(%"PTRDIFF_SPECIFIER" > %"SIZE_SPECIFIER")\n", + nal_size, sizeof(sps->data)); + sps->data_size = sizeof(sps->data); + } else { + sps->data_size = nal_size; + } + memcpy(sps->data, gb->buffer, sps->data_size); + + ret = ff_hevc_rpi_parse_sps(sps, gb, &sps_id, + apply_defdispwin, + ps->vps_list, avctx); + if (ret < 0) { + av_buffer_unref(&sps_buf); + return ret; + } + + if (avctx->debug & FF_DEBUG_BITSTREAM) { + av_log(avctx, AV_LOG_DEBUG, + "Parsed SPS: id %d; coded wxh: %dx%d; " + "cropped wxh: %dx%d; pix_fmt: %s.\n", + sps_id, sps->width, sps->height, + sps->width - (sps->output_window.left_offset + sps->output_window.right_offset), + sps->height - (sps->output_window.top_offset + sps->output_window.bottom_offset), + av_get_pix_fmt_name(sps->pix_fmt)); + } + + /* check if this is a repeat of an already parsed SPS, then keep the + * original one. + * otherwise drop all PPSes that depend on it */ + if (ps->sps_list[sps_id] && + !memcmp(ps->sps_list[sps_id]->data, sps_buf->data, sps_buf->size)) { + av_buffer_unref(&sps_buf); + } else { + remove_sps(ps, sps_id); + ps->sps_list[sps_id] = sps_buf; + } + + return 0; +} + +static void hevc_pps_free(void *opaque, uint8_t *data) +{ + HEVCRpiPPS *pps = (HEVCRpiPPS*)data; + + av_freep(&pps->column_width); + av_freep(&pps->row_height); + av_freep(&pps->col_bd); + av_freep(&pps->row_bd); + av_freep(&pps->col_idxX); + av_freep(&pps->ctb_addr_rs_to_ts); + av_freep(&pps->ctb_addr_ts_to_rs); + av_freep(&pps->tile_pos_ts); + av_freep(&pps->tile_size); + av_freep(&pps->tile_id); + av_freep(&pps->ctb_ts_flags); + + av_freep(&pps); +} + +static int get_offset_list(GetBitContext * const gb, AVCodecContext * const avctx, unsigned int n_minus_1, int8_t * offsets) +{ + do + { + const int offset = get_se_golomb_long(gb); + if (offset < -12 || offset > 12) { + av_log(avctx, AV_LOG_ERROR, "qp_offset_list[]: %d out of range\n", offset); + return AVERROR_INVALIDDATA; + } + *offsets++ = offset; + } while (n_minus_1-- != 0); + return 0; +} + +static int pps_range_extensions(GetBitContext * const gb, AVCodecContext * const avctx, + HEVCRpiPPS * const pps, const HEVCRpiSPS * const sps) +{ + if (pps->transform_skip_enabled_flag) { + pps->log2_max_transform_skip_block_size = get_ue_golomb_long(gb) + 2; + } + pps->cross_component_prediction_enabled_flag = get_bits1(gb); + if (pps->cross_component_prediction_enabled_flag && + (sps->chroma_format_idc != 3 || sps->separate_colour_plane_flag)) + { + av_log(avctx, AV_LOG_ERROR, "cross_component_prediction_enabled but chroma_format_idc != 3\n"); + return AVERROR_INVALIDDATA; + } + pps->chroma_qp_offset_list_enabled_flag = get_bits1(gb); + if (pps->chroma_qp_offset_list_enabled_flag) { + int err; + + pps->diff_cu_chroma_qp_offset_depth = get_ue_golomb_long(gb); + pps->chroma_qp_offset_list_len_minus1 = get_ue_golomb_long(gb); + if (pps->chroma_qp_offset_list_len_minus1 > 5) { + av_log(avctx, AV_LOG_ERROR, + "chroma_qp_offset_list_len_minus1 shall be in the range [0, 5].\n"); + return AVERROR_INVALIDDATA; + } + av_log(avctx, AV_LOG_WARNING, "cb_qp_offset_list not tested yet.\n"); + + if ((err = get_offset_list(gb, avctx, pps->chroma_qp_offset_list_len_minus1, pps->cb_qp_offset_list)) != 0 || + (err = get_offset_list(gb, avctx, pps->chroma_qp_offset_list_len_minus1, pps->cr_qp_offset_list)) != 0) + return err; + } + + { + const unsigned int max_offset = sps->bit_depth > 10 ? sps->bit_depth - 10 : 0; + + pps->log2_sao_offset_scale_luma = get_ue_golomb_long(gb); + if (pps->log2_sao_offset_scale_luma > max_offset) { + av_log(avctx, AV_LOG_ERROR, "log2_sao_offset_scale_luma invalid"); + return AVERROR_INVALIDDATA; + } + pps->log2_sao_offset_scale_chroma = get_ue_golomb_long(gb); + if (pps->log2_sao_offset_scale_chroma > max_offset) { + av_log(avctx, AV_LOG_ERROR, "log2_sao_offset_scale_chroma invalid"); + return AVERROR_INVALIDDATA; + } + } + + return(0); +} + +static inline int setup_pps(AVCodecContext * const avctx, + HEVCRpiPPS * const pps, const HEVCRpiSPS * const sps) +{ + int pic_area_in_ctbs; + int i, j, x, y, ctb_addr_rs, tile_id; + + // Inferred parameters + + // qp_y -> qp_u/qp_v tables + // The tables have at least -24,+24 overrun after adding offset here + // which should allow for clipless offseting + + pps->qp_dblk_x[0] = qp_c_dblk_0 + QP_DBLK_OFFSET_0; // No offset for luma, but may be useful for general code + pps->qp_bd_x[0] = qp_c_bd_0[sps->bit_depth - 8] + QP_OFFSET_0; + + if (sps->chroma_format_idc == 1) { + pps->qp_dblk_x[1] = qp_c_dblk_1 + pps->cb_qp_offset + QP_DBLK_OFFSET_0; + pps->qp_bd_x[1] = qp_c_bd_1[sps->bit_depth - 8] + pps->cb_qp_offset + QP_OFFSET_0; + pps->qp_dblk_x[2] = qp_c_dblk_1 + pps->cr_qp_offset + QP_DBLK_OFFSET_0; + pps->qp_bd_x[2] = qp_c_bd_1[sps->bit_depth - 8] + pps->cr_qp_offset + QP_OFFSET_0; + } + else + { + pps->qp_dblk_x[1] = qp_c_dblk_0 + pps->cb_qp_offset + QP_DBLK_OFFSET_0; + pps->qp_bd_x[1] = qp_c_bd_0[sps->bit_depth - 8] + pps->cb_qp_offset + QP_OFFSET_0; + pps->qp_dblk_x[2] = qp_c_dblk_0 + pps->cr_qp_offset + QP_DBLK_OFFSET_0; + pps->qp_bd_x[2] = qp_c_bd_0[sps->bit_depth - 8] + pps->cr_qp_offset + QP_OFFSET_0; + } + + pps->col_bd = av_malloc_array(pps->num_tile_columns + 1, sizeof(*pps->col_bd)); + pps->row_bd = av_malloc_array(pps->num_tile_rows + 1, sizeof(*pps->row_bd)); + pps->col_idxX = av_malloc_array(sps->ctb_width, sizeof(*pps->col_idxX)); + if (!pps->col_bd || !pps->row_bd || !pps->col_idxX) + return AVERROR(ENOMEM); + + if (pps->uniform_spacing_flag) { + if (!pps->column_width) { + pps->column_width = av_malloc_array(pps->num_tile_columns, sizeof(*pps->column_width)); + pps->row_height = av_malloc_array(pps->num_tile_rows, sizeof(*pps->row_height)); + } + if (!pps->column_width || !pps->row_height) + return AVERROR(ENOMEM); + + for (i = 0; i < pps->num_tile_columns; i++) { + pps->column_width[i] = ((i + 1) * sps->ctb_width) / pps->num_tile_columns - + (i * sps->ctb_width) / pps->num_tile_columns; + } + + for (i = 0; i < pps->num_tile_rows; i++) { + pps->row_height[i] = ((i + 1) * sps->ctb_height) / pps->num_tile_rows - + (i * sps->ctb_height) / pps->num_tile_rows; + } + } + + { + const unsigned int td_mask = 63 >> (sps->log2_ctb_size + sps->pixel_shift); + pps->col_bd[0] = 0; + pps->tile_wpp_inter_disable = 0; + for (i = 0; i < pps->num_tile_columns; i++) + { + pps->col_bd[i + 1] = pps->col_bd[i] + pps->column_width[i]; + + // Avoid trying tile parallel if the columns don't fall on cache boundries + // (this causes too much pain syncing flushes with the QPU) + // Ignore the final (RHS of pic) tile boundry + if ((pps->col_bd[i] & td_mask) != 0) { + pps->tile_wpp_inter_disable = 1; + } + } + + // If we can start the next row before finishing the first line of + // this one then we must wait at the end of the tile + // * if this happens a lot then there are better but more complicated + // conditions that we could apply + if (pps->tile_wpp_inter_disable) { + for (i = 0; i < pps->num_tile_rows; i++) + { + if (pps->row_height[i] <= RPI_MAX_JOBS) { + pps->tile_wpp_inter_disable = 2; + break; + } + } + } + } + + pps->row_bd[0] = 0; + for (i = 0; i < pps->num_tile_rows; i++) + pps->row_bd[i + 1] = pps->row_bd[i] + pps->row_height[i]; + + for (i = 0, j = 0; i < sps->ctb_width; i++) { + if (i >= pps->col_bd[j + 1]) + j++; + pps->col_idxX[i] = j; + } + + /** + * 6.5 + */ + pic_area_in_ctbs = sps->ctb_size; + + pps->ctb_addr_rs_to_ts = av_malloc_array(pic_area_in_ctbs, sizeof(*pps->ctb_addr_rs_to_ts)); + pps->ctb_addr_ts_to_rs = av_malloc_array(pic_area_in_ctbs, sizeof(*pps->ctb_addr_ts_to_rs)); + pps->tile_id = av_malloc_array(pic_area_in_ctbs, sizeof(*pps->tile_id)); + pps->tile_size = av_malloc_array(pps->num_tile_columns * pps->num_tile_rows, sizeof(*pps->tile_size)); + pps->tile_pos_ts = av_malloc_array(pps->num_tile_columns * pps->num_tile_rows, sizeof(*pps->tile_pos_ts)); + pps->ctb_ts_flags = av_malloc_array(pic_area_in_ctbs, sizeof(*pps->ctb_ts_flags)); + if (!pps->ctb_addr_rs_to_ts || !pps->ctb_addr_ts_to_rs || + !pps->tile_id || pps->tile_pos_ts == NULL || pps->tile_size == NULL) { + return AVERROR(ENOMEM); + } + + memset(pps->ctb_ts_flags, 0, pic_area_in_ctbs * sizeof(*pps->ctb_ts_flags)); + + for (ctb_addr_rs = 0; ctb_addr_rs < pic_area_in_ctbs; ctb_addr_rs++) { + int tb_x = ctb_addr_rs % sps->ctb_width; + int tb_y = ctb_addr_rs / sps->ctb_width; + int tile_x = 0; + int tile_y = 0; + int val = 0; + + for (i = 0; i < pps->num_tile_columns; i++) { + if (tb_x < pps->col_bd[i + 1]) { + tile_x = i; + break; + } + } + + for (i = 0; i < pps->num_tile_rows; i++) { + if (tb_y < pps->row_bd[i + 1]) { + tile_y = i; + break; + } + } + + for (i = 0; i < tile_x; i++) + val += pps->row_height[tile_y] * pps->column_width[i]; + for (i = 0; i < tile_y; i++) + val += sps->ctb_width * pps->row_height[i]; + + val += (tb_y - pps->row_bd[tile_y]) * pps->column_width[tile_x] + + tb_x - pps->col_bd[tile_x]; + + pps->ctb_addr_rs_to_ts[ctb_addr_rs] = val; + pps->ctb_addr_ts_to_rs[val] = ctb_addr_rs; + } + + { + uint8_t * pflags = pps->ctb_ts_flags; + uint16_t * ptid = pps->tile_id; + + for (j = 0, tile_id = 0; j < pps->num_tile_rows; j++) + { + for (i = 0; i < pps->num_tile_columns; i++, tile_id++) + { + const unsigned int tile_w = pps->column_width[i]; + + pflags[0] |= CTB_TS_FLAGS_CIREQ; + + for (x = 0; x != tile_w; ++x) { + pflags[x] |= CTB_TS_FLAGS_TOT; + } + + for (y = pps->row_bd[j]; y < pps->row_bd[j + 1]; y++) + { + pflags[0] |= CTB_TS_FLAGS_SOTL; + + if (pps->entropy_coding_sync_enabled_flag) + { + if (pps->column_width[i] != 1) + pflags[1] |= CTB_TS_FLAGS_CSAVE; + else + pflags[0] |= CTB_TS_FLAGS_CIREQ; + + if ((pflags[0] & CTB_TS_FLAGS_CIREQ) == 0) + pflags[0] |= CTB_TS_FLAGS_CLOAD; + } + + for (x = 0; x != tile_w; ++x) + *ptid++ = tile_id; + + pflags += tile_w; + pflags[-1] |= CTB_TS_FLAGS_EOTL; + if (i + 1 == pps->num_tile_columns) + pflags[-1] |= CTB_TS_FLAGS_EOL; + } + + pflags[-1] |= CTB_TS_FLAGS_EOT; + } + } + } + + { + unsigned int ts = 0; + for (j = 0; j < pps->num_tile_rows; j++) + for (i = 0; i < pps->num_tile_columns; i++) + { + const unsigned int size = pps->column_width[i] * pps->row_height[j]; + pps->tile_size[j * pps->num_tile_columns + i] = size; + pps->tile_pos_ts[j * pps->num_tile_columns + i] = ts; + ts += size; + } + } + + return 0; +} + +int ff_hevc_rpi_decode_nal_pps(GetBitContext * const gb, AVCodecContext * const avctx, + HEVCRpiParamSets * const ps) +{ + const HEVCRpiSPS *sps = NULL; + int i, ret = 0; + unsigned int pps_id = 0; + ptrdiff_t nal_size; + unsigned log2_parallel_merge_level_minus2; + + AVBufferRef *pps_buf; + HEVCRpiPPS *pps = av_mallocz(sizeof(*pps)); + + if (!pps) + return AVERROR(ENOMEM); + + pps_buf = av_buffer_create((uint8_t *)pps, sizeof(*pps), + hevc_pps_free, NULL, 0); + if (!pps_buf) { + av_freep(&pps); + return AVERROR(ENOMEM); + } + + av_log(avctx, AV_LOG_DEBUG, "Decoding PPS\n"); + + nal_size = gb->buffer_end - gb->buffer; + if (nal_size > sizeof(pps->data)) { + av_log(avctx, AV_LOG_WARNING, "Truncating likely oversized PPS " + "(%"PTRDIFF_SPECIFIER" > %"SIZE_SPECIFIER")\n", + nal_size, sizeof(pps->data)); + pps->data_size = sizeof(pps->data); + } else { + pps->data_size = nal_size; + } + memcpy(pps->data, gb->buffer, pps->data_size); + + // Default values + pps->loop_filter_across_tiles_enabled_flag = 1; + pps->num_tile_columns = 1; + pps->num_tile_rows = 1; + pps->uniform_spacing_flag = 1; + pps->disable_dbf = 0; + pps->beta_offset = 0; + pps->tc_offset = 0; + pps->log2_max_transform_skip_block_size = 2; + + // Coded parameters + pps_id = get_ue_golomb_long(gb); + if (pps_id >= HEVC_MAX_PPS_COUNT) { + av_log(avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", pps_id); + ret = AVERROR_INVALIDDATA; + goto err; + } + pps->sps_id = get_ue_golomb_long(gb); + if (pps->sps_id >= HEVC_MAX_SPS_COUNT) { + av_log(avctx, AV_LOG_ERROR, "SPS id out of range: %d\n", pps->sps_id); + ret = AVERROR_INVALIDDATA; + goto err; + } + if (!ps->sps_list[pps->sps_id]) { + av_log(avctx, AV_LOG_ERROR, "SPS %u does not exist.\n", pps->sps_id); + ret = AVERROR_INVALIDDATA; + goto err; + } + sps = (HEVCRpiSPS *)ps->sps_list[pps->sps_id]->data; + + pps->dependent_slice_segments_enabled_flag = get_bits1(gb); + pps->output_flag_present_flag = get_bits1(gb); + pps->num_extra_slice_header_bits = get_bits(gb, 3); + + pps->sign_data_hiding_flag = get_bits1(gb); + + pps->cabac_init_present_flag = get_bits1(gb); + + pps->num_ref_idx_l0_default_active = get_ue_golomb_long(gb) + 1; + if (pps->num_ref_idx_l0_default_active < 1 || pps->num_ref_idx_l0_default_active > 15) { + av_log(avctx, AV_LOG_ERROR, "pps->num_ref_idx_l0_default_active invalid\n"); + ret = AVERROR_INVALIDDATA; + goto err; + } + pps->num_ref_idx_l1_default_active = get_ue_golomb_long(gb) + 1; + if (pps->num_ref_idx_l1_default_active < 1 || pps->num_ref_idx_l1_default_active > 15) { + av_log(avctx, AV_LOG_ERROR, "pps->num_ref_idx_l1_default_active invalid\n"); + ret = AVERROR_INVALIDDATA; + goto err; + } + + pps->pic_init_qp_minus26 = get_se_golomb(gb); + if (pps->pic_init_qp_minus26 > 25 || pps->pic_init_qp_minus26 < -(26 + sps->qp_bd_offset)) { + av_log(avctx, AV_LOG_ERROR, + "init_qp_minus26 %d is outside the valid range " + "[%d, %d].\n", + pps->pic_init_qp_minus26, + -(26 + sps->qp_bd_offset), 25); + ret = AVERROR_INVALIDDATA; + goto err; + } + + pps->constrained_intra_pred_flag = get_bits1(gb); + pps->transform_skip_enabled_flag = get_bits1(gb); + + pps->cu_qp_delta_enabled_flag = get_bits1(gb); + pps->log2_min_cu_qp_delta_size = sps->log2_ctb_size; + if (pps->cu_qp_delta_enabled_flag) + { + const unsigned int diff_cu_qp_delta_depth = get_ue_golomb_long(gb); + + if (diff_cu_qp_delta_depth > sps->log2_diff_max_min_coding_block_size) { + av_log(avctx, AV_LOG_ERROR, "diff_cu_qp_delta_depth %d is invalid\n", + diff_cu_qp_delta_depth); + ret = AVERROR_INVALIDDATA; + goto err; + } + + pps->log2_min_cu_qp_delta_size = sps->log2_ctb_size - diff_cu_qp_delta_depth; + } + + pps->cb_qp_offset = get_se_golomb(gb); + if (pps->cb_qp_offset < -12 || pps->cb_qp_offset > 12) { + av_log(avctx, AV_LOG_ERROR, "pps_cb_qp_offset out of range: %d\n", + pps->cb_qp_offset); + ret = AVERROR_INVALIDDATA; + goto err; + } + pps->cr_qp_offset = get_se_golomb(gb); + if (pps->cr_qp_offset < -12 || pps->cr_qp_offset > 12) { + av_log(avctx, AV_LOG_ERROR, "pps_cr_qp_offset out of range: %d\n", + pps->cr_qp_offset); + ret = AVERROR_INVALIDDATA; + goto err; + } + pps->pic_slice_level_chroma_qp_offsets_present_flag = get_bits1(gb); + + pps->weighted_pred_flag = get_bits1(gb); + pps->weighted_bipred_flag = get_bits1(gb); + + pps->transquant_bypass_enable_flag = get_bits1(gb); + pps->tiles_enabled_flag = get_bits1(gb); + pps->entropy_coding_sync_enabled_flag = get_bits1(gb); + + if (pps->tiles_enabled_flag) { + pps->num_tile_columns = get_ue_golomb_long(gb) + 1; + pps->num_tile_rows = get_ue_golomb_long(gb) + 1; + if (pps->num_tile_columns <= 0 || + pps->num_tile_columns >= sps->width) { + av_log(avctx, AV_LOG_ERROR, "num_tile_columns_minus1 out of range: %d\n", + pps->num_tile_columns - 1); + ret = AVERROR_INVALIDDATA; + goto err; + } + if (pps->num_tile_rows <= 0 || + pps->num_tile_rows >= sps->height) { + av_log(avctx, AV_LOG_ERROR, "num_tile_rows_minus1 out of range: %d\n", + pps->num_tile_rows - 1); + ret = AVERROR_INVALIDDATA; + goto err; + } + + pps->column_width = av_malloc_array(pps->num_tile_columns, sizeof(*pps->column_width)); + pps->row_height = av_malloc_array(pps->num_tile_rows, sizeof(*pps->row_height)); + if (!pps->column_width || !pps->row_height) { + ret = AVERROR(ENOMEM); + goto err; + } + + pps->uniform_spacing_flag = get_bits1(gb); + if (!pps->uniform_spacing_flag) { + uint64_t sum = 0; + for (i = 0; i < pps->num_tile_columns - 1; i++) { + pps->column_width[i] = get_ue_golomb_long(gb) + 1; + sum += pps->column_width[i]; + } + if (sum >= sps->ctb_width) { + av_log(avctx, AV_LOG_ERROR, "Invalid tile widths.\n"); + ret = AVERROR_INVALIDDATA; + goto err; + } + pps->column_width[pps->num_tile_columns - 1] = sps->ctb_width - sum; + + sum = 0; + for (i = 0; i < pps->num_tile_rows - 1; i++) { + pps->row_height[i] = get_ue_golomb_long(gb) + 1; + sum += pps->row_height[i]; + } + if (sum >= sps->ctb_height) { + av_log(avctx, AV_LOG_ERROR, "Invalid tile heights.\n"); + ret = AVERROR_INVALIDDATA; + goto err; + } + pps->row_height[pps->num_tile_rows - 1] = sps->ctb_height - sum; + } + pps->loop_filter_across_tiles_enabled_flag = get_bits1(gb); + } + + pps->seq_loop_filter_across_slices_enabled_flag = get_bits1(gb); + + pps->deblocking_filter_control_present_flag = get_bits1(gb); + if (pps->deblocking_filter_control_present_flag) { + pps->deblocking_filter_override_enabled_flag = get_bits1(gb); + pps->disable_dbf = get_bits1(gb); + if (!pps->disable_dbf) { + int beta_offset_div2 = get_se_golomb(gb); + int tc_offset_div2 = get_se_golomb(gb) ; + if (beta_offset_div2 < -6 || beta_offset_div2 > 6) { + av_log(avctx, AV_LOG_ERROR, "pps_beta_offset_div2 out of range: %d\n", + beta_offset_div2); + ret = AVERROR_INVALIDDATA; + goto err; + } + if (tc_offset_div2 < -6 || tc_offset_div2 > 6) { + av_log(avctx, AV_LOG_ERROR, "pps_tc_offset_div2 out of range: %d\n", + tc_offset_div2); + ret = AVERROR_INVALIDDATA; + goto err; + } + pps->beta_offset = 2 * beta_offset_div2; + pps->tc_offset = 2 * tc_offset_div2; + } + } + + pps->scaling_list_data_present_flag = get_bits1(gb); + if (pps->scaling_list_data_present_flag) { + set_default_scaling_list_data(&pps->scaling_list); + ret = scaling_list_data(gb, avctx, &pps->scaling_list, sps); + if (ret < 0) + goto err; + } + pps->lists_modification_present_flag = get_bits1(gb); + log2_parallel_merge_level_minus2 = get_ue_golomb_long(gb); + if (log2_parallel_merge_level_minus2 > sps->log2_ctb_size) { + av_log(avctx, AV_LOG_ERROR, "log2_parallel_merge_level_minus2 out of range: %d\n", + log2_parallel_merge_level_minus2); + ret = AVERROR_INVALIDDATA; + goto err; + } + pps->log2_parallel_merge_level = log2_parallel_merge_level_minus2 + 2; + + pps->slice_header_extension_present_flag = get_bits1(gb); + + if (get_bits1(gb)) { // pps_extension_present_flag + int pps_range_extensions_flag = get_bits1(gb); + skip_bits(gb, 7); // pps_extension_7bits + if (sps->ptl.general_ptl.profile_idc == FF_PROFILE_HEVC_REXT && pps_range_extensions_flag) { + if ((ret = pps_range_extensions(gb, avctx, pps, sps)) < 0) + goto err; + } + } + + ret = setup_pps(avctx, pps, sps); + if (ret < 0) + goto err; + + if (get_bits_left(gb) < 0) { + av_log(avctx, AV_LOG_ERROR, + "Overread PPS by %d bits\n", -get_bits_left(gb)); + ret = AVERROR_INVALIDDATA; + goto err; + } + + remove_pps(ps, pps_id); + ps->pps_list[pps_id] = pps_buf; + + return 0; + +err: + av_buffer_unref(&pps_buf); + return ret; +} + +int ff_hevc_rpi_compute_poc(const HEVCRpiSPS *sps, int pocTid0, int poc_lsb, int nal_unit_type) +{ + int max_poc_lsb = 1 << sps->log2_max_poc_lsb; + int prev_poc_lsb = pocTid0 % max_poc_lsb; + int prev_poc_msb = pocTid0 - prev_poc_lsb; + int poc_msb; + + if (poc_lsb < prev_poc_lsb && prev_poc_lsb - poc_lsb >= max_poc_lsb / 2) + poc_msb = prev_poc_msb + max_poc_lsb; + else if (poc_lsb > prev_poc_lsb && poc_lsb - prev_poc_lsb > max_poc_lsb / 2) + poc_msb = prev_poc_msb - max_poc_lsb; + else + poc_msb = prev_poc_msb; + + // For BLA picture types, POCmsb is set to 0. + if (nal_unit_type == HEVC_NAL_BLA_W_LP || + nal_unit_type == HEVC_NAL_BLA_W_RADL || + nal_unit_type == HEVC_NAL_BLA_N_LP) + poc_msb = 0; + + return poc_msb + poc_lsb; +} diff --git a/libavcodec/rpi_hevc_ps.h b/libavcodec/rpi_hevc_ps.h new file mode 100644 index 0000000000..c725ebb9ca --- /dev/null +++ b/libavcodec/rpi_hevc_ps.h @@ -0,0 +1,449 @@ +/* + * HEVC parameter set parsing + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_RPI_HEVC_PS_H +#define AVCODEC_RPI_HEVC_PS_H + +#include + +#include "libavutil/buffer.h" +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" + +#include "avcodec.h" +#include "get_bits.h" +#include "hevc.h" + +typedef struct ShortTermRPS { + unsigned int num_negative_pics; + int num_delta_pocs; + int rps_idx_num_delta_pocs; + int32_t delta_poc[32]; + uint8_t used[32]; +} ShortTermRPS; + +typedef struct LongTermRPS { + int poc[32]; + uint8_t used[32]; + uint8_t nb_refs; +} LongTermRPS; + +typedef struct RpiSliceHeader { + unsigned int pps_id; + + ///< address (in raster order) of the first block in the current slice segment + unsigned int slice_segment_addr; + ///< address (in raster order) of the first block in the current slice + unsigned int slice_addr; + + enum HEVCSliceType slice_type; + + int pic_order_cnt_lsb; + + uint8_t first_slice_in_pic_flag; + uint8_t dependent_slice_segment_flag; + uint8_t pic_output_flag; + uint8_t colour_plane_id; + + ///< RPS coded in the slice header itself is stored here + int short_term_ref_pic_set_sps_flag; + int short_term_ref_pic_set_size; + ShortTermRPS slice_rps; + const ShortTermRPS *short_term_rps; + int long_term_ref_pic_set_size; + LongTermRPS long_term_rps; + unsigned int list_entry_lx[2][32]; + + uint8_t rpl_modification_flag[2]; + uint8_t no_output_of_prior_pics_flag; + uint8_t slice_temporal_mvp_enabled_flag; + + unsigned int nb_refs[2]; + + uint8_t slice_sample_adaptive_offset_flag[3]; + uint8_t mvd_l1_zero_flag; + + uint8_t cabac_init_flag; + uint8_t disable_deblocking_filter_flag; ///< slice_header_disable_deblocking_filter_flag + uint8_t slice_loop_filter_across_slices_enabled_flag; + uint8_t collocated_list; + + uint8_t no_dblk_boundary_flags; + + unsigned int collocated_ref_idx; + + int slice_qp_delta; + int slice_cb_qp_offset; // -12, +12 + int slice_cr_qp_offset; // -12, +12 + + uint8_t cu_chroma_qp_offset_enabled_flag; + + int beta_offset; ///< beta_offset_div2 * 2 + int tc_offset; ///< tc_offset_div2 * 2 + + unsigned int max_num_merge_cand; ///< 5 - 5_minus_max_num_merge_cand + + unsigned *entry_point_offset; + int * offset; + int * size; + int num_entry_point_offsets; + int offsets_allocated; + + uint8_t offload_wpp; + uint8_t offload_tiles; + + int8_t slice_qp; + + uint8_t luma_log2_weight_denom; + uint8_t chroma_log2_weight_denom; + + int16_t luma_weight_l0[16]; // -128, +255 + int16_t luma_offset_l0[16]; + int16_t chroma_weight_l0[16][2]; + int16_t chroma_offset_l0[16][2]; + + int16_t luma_weight_l1[16]; + int16_t luma_offset_l1[16]; + int16_t chroma_weight_l1[16][2]; + int16_t chroma_offset_l1[16][2]; + +} RpiSliceHeader; + +typedef struct HEVCRpiWindow { + uint16_t left_offset; + uint16_t right_offset; + uint16_t top_offset; + uint16_t bottom_offset; +} HEVCRpiWindow; + +typedef struct VUI { + AVRational sar; + + int overscan_info_present_flag; + int overscan_appropriate_flag; + + int video_signal_type_present_flag; + int video_format; + int video_full_range_flag; + int colour_description_present_flag; + uint8_t colour_primaries; + uint8_t transfer_characteristic; + uint8_t matrix_coeffs; + + int chroma_loc_info_present_flag; + int chroma_sample_loc_type_top_field; + int chroma_sample_loc_type_bottom_field; + int neutra_chroma_indication_flag; + + int field_seq_flag; + int frame_field_info_present_flag; + + int default_display_window_flag; + HEVCRpiWindow def_disp_win; + + int vui_timing_info_present_flag; + uint32_t vui_num_units_in_tick; + uint32_t vui_time_scale; + int vui_poc_proportional_to_timing_flag; + int vui_num_ticks_poc_diff_one_minus1; + int vui_hrd_parameters_present_flag; + + int bitstream_restriction_flag; + int tiles_fixed_structure_flag; + int motion_vectors_over_pic_boundaries_flag; + int restricted_ref_pic_lists_flag; + int min_spatial_segmentation_idc; + int max_bytes_per_pic_denom; + int max_bits_per_min_cu_denom; + int log2_max_mv_length_horizontal; + int log2_max_mv_length_vertical; +} VUI; + +typedef struct PTLCommon { + uint8_t profile_space; + uint8_t tier_flag; + uint8_t profile_idc; + uint8_t profile_compatibility_flag[32]; + uint8_t level_idc; + uint8_t progressive_source_flag; + uint8_t interlaced_source_flag; + uint8_t non_packed_constraint_flag; + uint8_t frame_only_constraint_flag; +} PTLCommon; + +typedef struct PTL { + PTLCommon general_ptl; + PTLCommon sub_layer_ptl[HEVC_MAX_SUB_LAYERS]; + + uint8_t sub_layer_profile_present_flag[HEVC_MAX_SUB_LAYERS]; + uint8_t sub_layer_level_present_flag[HEVC_MAX_SUB_LAYERS]; +} PTL; + +typedef struct HEVCRpiVPS { + uint8_t vps_temporal_id_nesting_flag; + int vps_max_layers; + int vps_max_sub_layers; ///< vps_max_temporal_layers_minus1 + 1 + + PTL ptl; + int vps_sub_layer_ordering_info_present_flag; + unsigned int vps_max_dec_pic_buffering[HEVC_MAX_SUB_LAYERS]; + unsigned int vps_num_reorder_pics[HEVC_MAX_SUB_LAYERS]; + unsigned int vps_max_latency_increase[HEVC_MAX_SUB_LAYERS]; + int vps_max_layer_id; + int vps_num_layer_sets; ///< vps_num_layer_sets_minus1 + 1 + uint8_t vps_timing_info_present_flag; + uint32_t vps_num_units_in_tick; + uint32_t vps_time_scale; + uint8_t vps_poc_proportional_to_timing_flag; + int vps_num_ticks_poc_diff_one; ///< vps_num_ticks_poc_diff_one_minus1 + 1 + int vps_num_hrd_parameters; + + uint8_t data[4096]; + int data_size; +} HEVCRpiVPS; + +typedef struct ScalingList { + /* This is a little wasteful, since sizeID 0 only needs 8 coeffs, + * and size ID 3 only has 2 arrays, not 6. */ + uint8_t sl[4][6][64]; + uint8_t sl_dc[2][6]; +} ScalingList; + +typedef struct HEVCRpiSPS { + unsigned vps_id; + uint8_t chroma_format_idc; + uint8_t separate_colour_plane_flag; + + HEVCRpiWindow output_window; + + HEVCRpiWindow pic_conf_win; + + uint16_t wp_offset_half_range; // WpOffsetHalfRange + + uint8_t bit_depth; + +// int bit_depth_chroma; // We only support lum_bit_depth = chroma_bit_depth + uint8_t pixel_shift; + enum AVPixelFormat pix_fmt; + + unsigned int log2_max_poc_lsb; + + int max_sub_layers; + struct { + int max_dec_pic_buffering; + int num_reorder_pics; + int max_latency_increase; + } temporal_layer[HEVC_MAX_SUB_LAYERS]; + uint8_t temporal_id_nesting_flag; + + uint8_t scaling_list_enable_flag; + ScalingList scaling_list; + + unsigned int nb_st_rps; + ShortTermRPS st_rps[HEVC_MAX_SHORT_TERM_REF_PIC_SETS]; + + uint8_t amp_enabled_flag; + uint8_t sao_enabled; + + uint8_t long_term_ref_pics_present_flag; + uint16_t lt_ref_pic_poc_lsb_sps[HEVC_MAX_LONG_TERM_REF_PICS]; + uint8_t used_by_curr_pic_lt_sps_flag[HEVC_MAX_LONG_TERM_REF_PICS]; + uint8_t num_long_term_ref_pics_sps; + + struct { + uint8_t bit_depth; + uint8_t bit_depth_chroma; + uint8_t log2_min_pcm_cb_size; + uint8_t log2_max_pcm_cb_size; + uint8_t loop_filter_disable_flag; + } pcm; + char sps_temporal_mvp_enabled_flag; +// char sps_strong_intra_smoothing_enable_flag; -> intra_filtes_disable + + uint8_t log2_min_cb_size; // 3..6 + uint8_t log2_diff_max_min_coding_block_size; + uint8_t log2_min_tb_size; // 2..5 + uint8_t log2_max_trafo_size; + uint8_t log2_ctb_size; // 4..6 +// unsigned int log2_min_pu_size; // 2..5 (min_cb_size - 1) +#define LOG2_MIN_PU_SIZE 2 +#define LOG2_MIN_CU_SIZE 3 + + uint8_t max_transform_hierarchy_depth_inter; + uint8_t max_transform_hierarchy_depth_intra; + + char transform_skip_rotation_enabled_flag; + char transform_skip_context_enabled_flag; + char implicit_rdpcm_enabled_flag; + char explicit_rdpcm_enabled_flag; +// char intra_smoothing_disabled_flag; -> intra_filtes_disable + char high_precision_offsets_enabled_flag; + char persistent_rice_adaptation_enabled_flag; + + uint8_t intra_filters_disable; + + ///< coded frame dimension in various units + int width; + int height; + int ctb_width; + int ctb_height; + int ctb_size; // Pic size in CTBs not size of a CTB + int min_cb_width; + int min_cb_height; + int min_tb_width; + int min_tb_height; + int min_pu_width; + int min_pu_height; + int pcm_width; + int pcm_height; + int tb_mask; + + int hshift[3]; + int vshift[3]; + + int qp_bd_offset; + + uint8_t data[4096]; + int data_size; + + VUI vui; + PTL ptl; +} HEVCRpiSPS; + +#define CTB_TS_FLAGS_SOTL (1U << 0) // X start of tile line +#define CTB_TS_FLAGS_EOTL (1U << 1) // Last CTB of a tile line +#define CTB_TS_FLAGS_EOL (1U << 2) // Last CTB of a complete line +#define CTB_TS_FLAGS_EOT (1U << 3) // Last CTB of a tile +#define CTB_TS_FLAGS_CSAVE (1U << 4) +#define CTB_TS_FLAGS_CIREQ (1U << 5) // Cabac init request +#define CTB_TS_FLAGS_TOT (1U << 6) // CTB on top row of a tile +#define CTB_TS_FLAGS_CLOAD (1U << 7) + +typedef struct HEVCRpiPPS { + unsigned int sps_id; ///< seq_parameter_set_id + + uint8_t sign_data_hiding_flag; + + uint8_t cabac_init_present_flag; + + int num_ref_idx_l0_default_active; ///< num_ref_idx_l0_default_active_minus1 + 1 + int num_ref_idx_l1_default_active; ///< num_ref_idx_l1_default_active_minus1 + 1 + int pic_init_qp_minus26; + + uint8_t constrained_intra_pred_flag; + uint8_t transform_skip_enabled_flag; + + uint8_t cu_qp_delta_enabled_flag; + uint8_t log2_min_cu_qp_delta_size; + int cb_qp_offset; // -12..12 + int cr_qp_offset; // -12..12 + const uint8_t * qp_dblk_x[3]; + const int8_t * qp_bd_x[3]; + + uint8_t pic_slice_level_chroma_qp_offsets_present_flag; + uint8_t weighted_pred_flag; + uint8_t weighted_bipred_flag; + uint8_t output_flag_present_flag; + uint8_t transquant_bypass_enable_flag; + + uint8_t dependent_slice_segments_enabled_flag; + uint8_t tiles_enabled_flag; + uint8_t entropy_coding_sync_enabled_flag; + + uint8_t tile_wpp_inter_disable; + int num_tile_columns; ///< num_tile_columns_minus1 + 1 + int num_tile_rows; ///< num_tile_rows_minus1 + 1 + uint8_t uniform_spacing_flag; + uint8_t loop_filter_across_tiles_enabled_flag; + + uint8_t seq_loop_filter_across_slices_enabled_flag; + + uint8_t deblocking_filter_control_present_flag; + uint8_t deblocking_filter_override_enabled_flag; + uint8_t disable_dbf; + int beta_offset; ///< beta_offset_div2 * 2 + int tc_offset; ///< tc_offset_div2 * 2 + + uint8_t scaling_list_data_present_flag; + ScalingList scaling_list; + + uint8_t lists_modification_present_flag; + int log2_parallel_merge_level; ///< log2_parallel_merge_level_minus2 + 2 + int num_extra_slice_header_bits; + uint8_t slice_header_extension_present_flag; + uint8_t log2_max_transform_skip_block_size; + uint8_t cross_component_prediction_enabled_flag; + uint8_t chroma_qp_offset_list_enabled_flag; + uint8_t diff_cu_chroma_qp_offset_depth; + uint8_t chroma_qp_offset_list_len_minus1; + int8_t cb_qp_offset_list[6]; + int8_t cr_qp_offset_list[6]; + uint8_t log2_sao_offset_scale_luma; + uint8_t log2_sao_offset_scale_chroma; + + // Inferred parameters + uint16_t *column_width; ///< ColumnWidth + uint16_t *row_height; ///< RowHeight + uint16_t *col_bd; ///< ColBd + uint16_t *row_bd; ///< RowBd + uint16_t *col_idxX; + + // We can limit these to uint16_t given our other size limits + uint16_t *ctb_addr_rs_to_ts; ///< CtbAddrRSToTS + uint16_t *ctb_addr_ts_to_rs; ///< CtbAddrTSToRS + uint16_t *tile_id; ///< TileId + uint16_t *tile_pos_ts; ///< TilePosRS + uint16_t *tile_size; ///< TileSize + uint8_t * ctb_ts_flags; + + uint8_t data[4096]; + int data_size; +} HEVCRpiPPS; + +typedef struct HEVCRpiParamSets { + /* currently active parameter sets */ + const HEVCRpiVPS *vps; + const HEVCRpiSPS *sps; + const HEVCRpiPPS *pps; + + AVBufferRef *vps_list[HEVC_MAX_VPS_COUNT]; + AVBufferRef *sps_list[HEVC_MAX_SPS_COUNT]; + AVBufferRef *pps_list[HEVC_MAX_PPS_COUNT]; +} HEVCRpiParamSets; + +int ff_hevc_rpi_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx, + HEVCRpiParamSets *ps); +int ff_hevc_rpi_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx, + HEVCRpiParamSets *ps, int apply_defdispwin); +int ff_hevc_rpi_decode_nal_pps(GetBitContext *gb, AVCodecContext *avctx, + HEVCRpiParamSets *ps); + +int ff_hevc_rpi_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx, + ShortTermRPS *rps, const HEVCRpiSPS *sps, int is_slice_header); + +int ff_hevc_rpi_encode_nal_vps(HEVCRpiVPS *vps, unsigned int id, + uint8_t *buf, int buf_size); + +/** + * Compute POC of the current frame and return it. + */ +int ff_hevc_rpi_compute_poc(const HEVCRpiSPS *sps, int pocTid0, int poc_lsb, int nal_unit_type); + +#endif /* AVCODEC_RPI_HEVC_PS_H */ diff --git a/libavcodec/rpi_hevc_refs.c b/libavcodec/rpi_hevc_refs.c new file mode 100644 index 0000000000..8cc5796cf0 --- /dev/null +++ b/libavcodec/rpi_hevc_refs.c @@ -0,0 +1,485 @@ +/* + * HEVC video decoder + * + * Copyright (C) 2012 - 2013 Guillaume Martres + * Copyright (C) 2012 - 2013 Gildas Cocherel + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/avassert.h" +#include "libavutil/pixdesc.h" +#include "libavutil/rpi_sand_fns.h" +#include "internal.h" +#include "thread.h" +#include "hevc.h" +#include "rpi_hevcdec.h" + +void ff_hevc_rpi_unref_frame(HEVCRpiContext *s, HEVCRpiFrame *frame, int flags) +{ + /* frame->frame can be NULL if context init failed */ + if (!frame->frame || !frame->frame->buf[0]) + return; + + frame->flags &= ~flags; + if (!frame->flags) { + ff_thread_release_buffer(s->avctx, &frame->tf); + + av_buffer_unref(&frame->col_mvf_buf); // OK if already NULL + frame->col_mvf = NULL; + + frame->collocated_ref = NULL; + } +} + +void ff_hevc_rpi_clear_refs(HEVCRpiContext *s) +{ + int i; + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) + ff_hevc_rpi_unref_frame(s, &s->DPB[i], + HEVC_FRAME_FLAG_SHORT_REF | + HEVC_FRAME_FLAG_LONG_REF); +} + +void ff_hevc_rpi_flush_dpb(HEVCRpiContext *s) +{ + int i; + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) + ff_hevc_rpi_unref_frame(s, &s->DPB[i], ~0); +} + +static HEVCRpiFrame *alloc_frame(HEVCRpiContext * const s) +{ + int i, ret; + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) { + HEVCRpiFrame * const frame = &s->DPB[i]; + if (frame->frame->buf[0]) + continue; + + ret = ff_thread_get_buffer(s->avctx, &frame->tf, + AV_GET_BUFFER_FLAG_REF); + if (ret < 0) + return NULL; + + frame->col_mvf = NULL; + frame->col_mvf_buf = NULL; + if (s->used_for_ref && !s->is_irap) + { + frame->col_mvf_buf = av_buffer_pool_get(s->col_mvf_pool); + if (!frame->col_mvf_buf) + goto fail; + frame->col_mvf = (ColMvField *)frame->col_mvf_buf->data; + } + + frame->frame->top_field_first = s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_TOP_FIELD; + frame->frame->interlaced_frame = (s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_TOP_FIELD) || (s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_BOTTOM_FIELD); + + return frame; + +fail: + ff_hevc_rpi_unref_frame(s, frame, ~0); + return NULL; + } + av_log(s->avctx, AV_LOG_ERROR, "Error allocating frame, DPB full.\n"); + return NULL; +} + +int ff_hevc_rpi_set_new_ref(HEVCRpiContext *s, AVFrame **frame, int poc) +{ + HEVCRpiFrame *ref; + int i; + + /* check that this POC doesn't already exist */ + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) { + HEVCRpiFrame *frame = &s->DPB[i]; + + if (frame->frame->buf[0] && frame->sequence == s->seq_decode && + frame->poc == poc) { + av_log(s->avctx, AV_LOG_ERROR, "Duplicate POC in a sequence: %d.\n", + poc); + return AVERROR_INVALIDDATA; + } + } + + ref = alloc_frame(s); + if (!ref) + return AVERROR(ENOMEM); + + *frame = ref->frame; + s->ref = ref; + + if (s->sh.pic_output_flag) + ref->flags = HEVC_FRAME_FLAG_OUTPUT | HEVC_FRAME_FLAG_SHORT_REF; + else + ref->flags = HEVC_FRAME_FLAG_SHORT_REF; + + ref->poc = poc; + ref->sequence = s->seq_decode; + ref->frame->crop_left = s->ps.sps->output_window.left_offset; + ref->frame->crop_right = s->ps.sps->output_window.right_offset; + ref->frame->crop_top = s->ps.sps->output_window.top_offset; + ref->frame->crop_bottom = s->ps.sps->output_window.bottom_offset; + + return 0; +} + +int ff_hevc_rpi_output_frame(HEVCRpiContext *s, AVFrame *out, int flush) +{ + do { + int nb_output = 0; + int min_poc = INT_MAX; + int i, min_idx, ret; + + if (s->sh.no_output_of_prior_pics_flag == 1 && s->no_rasl_output_flag == 1) { + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) { + HEVCRpiFrame *frame = &s->DPB[i]; + if (!(frame->flags & HEVC_FRAME_FLAG_BUMPING) && frame->poc != s->poc && + frame->sequence == s->seq_output) { + ff_hevc_rpi_unref_frame(s, frame, HEVC_FRAME_FLAG_OUTPUT); + } + } + } + + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) { + HEVCRpiFrame *frame = &s->DPB[i]; + if ((frame->flags & HEVC_FRAME_FLAG_OUTPUT) && + frame->sequence == s->seq_output) { + nb_output++; + if (frame->poc < min_poc || nb_output == 1) { + min_poc = frame->poc; + min_idx = i; + } + } + } + + /* wait for more frames before output */ + if (!flush && s->seq_output == s->seq_decode && s->ps.sps && + nb_output <= s->ps.sps->temporal_layer[s->ps.sps->max_sub_layers - 1].num_reorder_pics) + return 0; + + if (nb_output) { + HEVCRpiFrame *frame = &s->DPB[min_idx]; + if (frame->frame->format == AV_PIX_FMT_VIDEOTOOLBOX && frame->frame->buf[0]->size == 1) + return 0; + + ret = av_frame_ref(out, frame->frame); + if (frame->flags & HEVC_FRAME_FLAG_BUMPING) + ff_hevc_rpi_unref_frame(s, frame, HEVC_FRAME_FLAG_OUTPUT | HEVC_FRAME_FLAG_BUMPING); + else + ff_hevc_rpi_unref_frame(s, frame, HEVC_FRAME_FLAG_OUTPUT); + if (ret < 0) + return ret; + av_log(s->avctx, AV_LOG_DEBUG, + "Output frame with POC %d.\n", frame->poc); + return 1; + } + + if (s->seq_output != s->seq_decode) + s->seq_output = (s->seq_output + 1) & 0xff; + else + break; + } while (1); + + return 0; +} + +void ff_hevc_rpi_bump_frame(HEVCRpiContext *s) +{ + int dpb = 0; + int min_poc = INT_MAX; + int i; + + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) { + HEVCRpiFrame *frame = &s->DPB[i]; + if ((frame->flags) && + frame->sequence == s->seq_output && + frame->poc != s->poc) { + dpb++; + } + } + + if (s->ps.sps && dpb >= s->ps.sps->temporal_layer[s->ps.sps->max_sub_layers - 1].max_dec_pic_buffering) { + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) { + HEVCRpiFrame *frame = &s->DPB[i]; + if ((frame->flags) && + frame->sequence == s->seq_output && + frame->poc != s->poc) { + if (frame->flags == HEVC_FRAME_FLAG_OUTPUT && frame->poc < min_poc) { + min_poc = frame->poc; + } + } + } + + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) { + HEVCRpiFrame *frame = &s->DPB[i]; + if (frame->flags & HEVC_FRAME_FLAG_OUTPUT && + frame->sequence == s->seq_output && + frame->poc <= min_poc) { + frame->flags |= HEVC_FRAME_FLAG_BUMPING; + } + } + + dpb--; + } +} + +static int init_slice_rpl(HEVCRpiContext *s) +{ + if (s->slice_idx >= s->rpl_tab_size) + return AVERROR_INVALIDDATA; + + s->refPicList = s->rpl_tab[s->slice_idx].refPicList + 0; + return 0; +} + +int ff_hevc_rpi_slice_rpl(HEVCRpiContext *s) +{ + RpiSliceHeader *sh = &s->sh; + + uint8_t nb_list = sh->slice_type == HEVC_SLICE_B ? 2 : 1; + uint8_t list_idx; + int i, j, ret; + + ret = init_slice_rpl(s); + if (ret < 0) + return ret; + + if (!(s->rps[ST_CURR_BEF].nb_refs + s->rps[ST_CURR_AFT].nb_refs + + s->rps[LT_CURR].nb_refs)) { + av_log(s->avctx, AV_LOG_ERROR, "Zero refs in the frame RPS.\n"); + return AVERROR_INVALIDDATA; + } + + for (list_idx = 0; list_idx < nb_list; list_idx++) { + RefPicList rpl_tmp = { { 0 } }; + RefPicList *rpl = &s->refPicList[list_idx]; + + /* The order of the elements is + * ST_CURR_BEF - ST_CURR_AFT - LT_CURR for the L0 and + * ST_CURR_AFT - ST_CURR_BEF - LT_CURR for the L1 */ + int cand_lists[3] = { list_idx ? ST_CURR_AFT : ST_CURR_BEF, + list_idx ? ST_CURR_BEF : ST_CURR_AFT, + LT_CURR }; + + /* concatenate the candidate lists for the current frame */ + while (rpl_tmp.nb_refs < sh->nb_refs[list_idx]) { + for (i = 0; i < FF_ARRAY_ELEMS(cand_lists); i++) { + RefPicList *rps = &s->rps[cand_lists[i]]; + for (j = 0; j < rps->nb_refs && rpl_tmp.nb_refs < HEVC_MAX_REFS; j++) { + rpl_tmp.list[rpl_tmp.nb_refs] = rps->list[j]; + rpl_tmp.ref[rpl_tmp.nb_refs] = rps->ref[j]; + rpl_tmp.isLongTerm[rpl_tmp.nb_refs] = i == 2; + rpl_tmp.nb_refs++; + } + } + } + + /* reorder the references if necessary */ + if (sh->rpl_modification_flag[list_idx]) { + for (i = 0; i < sh->nb_refs[list_idx]; i++) { + int idx = sh->list_entry_lx[list_idx][i]; + + if (idx >= rpl_tmp.nb_refs) { + av_log(s->avctx, AV_LOG_ERROR, "Invalid reference index.\n"); + return AVERROR_INVALIDDATA; + } + + rpl->list[i] = rpl_tmp.list[idx]; + rpl->ref[i] = rpl_tmp.ref[idx]; + rpl->isLongTerm[i] = rpl_tmp.isLongTerm[idx]; + rpl->nb_refs++; + } + } else { + memcpy(rpl, &rpl_tmp, sizeof(*rpl)); + rpl->nb_refs = FFMIN(rpl->nb_refs, sh->nb_refs[list_idx]); + } + + if (sh->collocated_list == list_idx && + sh->collocated_ref_idx < rpl->nb_refs) + s->ref->collocated_ref = rpl->ref[sh->collocated_ref_idx]; + } + + return 0; +} + +static HEVCRpiFrame *find_ref_idx(HEVCRpiContext *s, int poc) +{ + int i; + int LtMask = (1 << s->ps.sps->log2_max_poc_lsb) - 1; + + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) { + HEVCRpiFrame *ref = &s->DPB[i]; + if (ref->frame->buf[0] && (ref->sequence == s->seq_decode)) { + if ((ref->poc & LtMask) == poc) + return ref; + } + } + + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) { + HEVCRpiFrame *ref = &s->DPB[i]; + if (ref->frame->buf[0] && ref->sequence == s->seq_decode) { + if (ref->poc == poc || (ref->poc & LtMask) == poc) + return ref; + } + } + + if (s->nal_unit_type != HEVC_NAL_CRA_NUT && !IS_BLA(s)) + av_log(s->avctx, AV_LOG_ERROR, + "Could not find ref with POC %d\n", poc); + return NULL; +} + +static void mark_ref(HEVCRpiFrame *frame, int flag) +{ + frame->flags &= ~(HEVC_FRAME_FLAG_LONG_REF | HEVC_FRAME_FLAG_SHORT_REF); + frame->flags |= flag; +} + +static HEVCRpiFrame *generate_missing_ref(HEVCRpiContext *s, int poc) +{ + HEVCRpiFrame *frame; + int i, x, y; + + frame = alloc_frame(s); + if (!frame) + return NULL; + + if (!s->ps.sps->pixel_shift) { + for (i = 0; frame->frame->buf[i]; i++) + memset(frame->frame->buf[i]->data, 1 << (s->ps.sps->bit_depth - 1), + frame->frame->buf[i]->size); + } else { + for (i = 0; frame->frame->data[i]; i++) + for (y = 0; y < (s->ps.sps->height >> s->ps.sps->vshift[i]); y++) + for (x = 0; x < (s->ps.sps->width >> s->ps.sps->hshift[i]); x++) { + AV_WN16(frame->frame->data[i] + y * frame_stride1(frame->frame, 1) + 2 * x, + 1 << (s->ps.sps->bit_depth - 1)); + } + } + + frame->poc = poc; + frame->sequence = s->seq_decode; + frame->flags = 0; + + ff_hevc_rpi_progress_set_all_done(frame); + + return frame; +} + +/* add a reference with the given poc to the list and mark it as used in DPB */ +static int add_candidate_ref(HEVCRpiContext *s, RefPicList *list, + int poc, int ref_flag) +{ + HEVCRpiFrame *ref = find_ref_idx(s, poc); + + if (ref == s->ref || list->nb_refs >= HEVC_MAX_REFS) + return AVERROR_INVALIDDATA; + + if (!ref) { + ref = generate_missing_ref(s, poc); + if (!ref) + return AVERROR(ENOMEM); + } + + list->list[list->nb_refs] = ref->poc; + list->ref[list->nb_refs] = ref; + list->nb_refs++; + + mark_ref(ref, ref_flag); + return 0; +} + +int ff_hevc_rpi_frame_rps(HEVCRpiContext *s) +{ + const ShortTermRPS *short_rps = s->sh.short_term_rps; + const LongTermRPS *long_rps = &s->sh.long_term_rps; + RefPicList *rps = s->rps; + int i, ret = 0; + + if (!short_rps) { + rps[0].nb_refs = rps[1].nb_refs = 0; + return 0; + } + + /* clear the reference flags on all frames except the current one */ + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) { + HEVCRpiFrame *frame = &s->DPB[i]; + + if (frame == s->ref) + continue; + + mark_ref(frame, 0); + } + + for (i = 0; i < NB_RPS_TYPE; i++) + rps[i].nb_refs = 0; + + /* add the short refs */ + for (i = 0; i < short_rps->num_delta_pocs; i++) { + int poc = s->poc + short_rps->delta_poc[i]; + int list; + + if (!short_rps->used[i]) + list = ST_FOLL; + else if (i < short_rps->num_negative_pics) + list = ST_CURR_BEF; + else + list = ST_CURR_AFT; + + ret = add_candidate_ref(s, &rps[list], poc, HEVC_FRAME_FLAG_SHORT_REF); + if (ret < 0) + goto fail; + } + + /* add the long refs */ + for (i = 0; i < long_rps->nb_refs; i++) { + int poc = long_rps->poc[i]; + int list = long_rps->used[i] ? LT_CURR : LT_FOLL; + + ret = add_candidate_ref(s, &rps[list], poc, HEVC_FRAME_FLAG_LONG_REF); + if (ret < 0) + goto fail; + } + +fail: + /* release any frames that are now unused */ + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) + ff_hevc_rpi_unref_frame(s, &s->DPB[i], 0); + + return ret; +} + +int ff_hevc_rpi_frame_nb_refs(HEVCRpiContext *s) +{ + int ret = 0; + int i; + const ShortTermRPS *rps = s->sh.short_term_rps; + LongTermRPS *long_rps = &s->sh.long_term_rps; + + if (rps) { + for (i = 0; i < rps->num_negative_pics; i++) + ret += !!rps->used[i]; + for (; i < rps->num_delta_pocs; i++) + ret += !!rps->used[i]; + } + + if (long_rps) { + for (i = 0; i < long_rps->nb_refs; i++) + ret += !!long_rps->used[i]; + } + return ret; +} diff --git a/libavcodec/rpi_hevc_sei.c b/libavcodec/rpi_hevc_sei.c new file mode 100644 index 0000000000..cd8149d58e --- /dev/null +++ b/libavcodec/rpi_hevc_sei.c @@ -0,0 +1,368 @@ +/* + * HEVC Supplementary Enhancement Information messages + * + * Copyright (C) 2012 - 2013 Guillaume Martres + * Copyright (C) 2012 - 2013 Gildas Cocherel + * Copyright (C) 2013 Vittorio Giovara + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "golomb.h" +#include "rpi_hevc_ps.h" +#include "rpi_hevc_sei.h" + +static int decode_nal_sei_decoded_picture_hash(HEVCSEIPictureHash *s, GetBitContext *gb) +{ + int cIdx, i; + uint8_t hash_type; + //uint16_t picture_crc; + //uint32_t picture_checksum; + hash_type = get_bits(gb, 8); + + for (cIdx = 0; cIdx < 3/*((s->sps->chroma_format_idc == 0) ? 1 : 3)*/; cIdx++) { + if (hash_type == 0) { + s->is_md5 = 1; + for (i = 0; i < 16; i++) + s->md5[cIdx][i] = get_bits(gb, 8); + } else if (hash_type == 1) { + // picture_crc = get_bits(gb, 16); + skip_bits(gb, 16); + } else if (hash_type == 2) { + // picture_checksum = get_bits_long(gb, 32); + skip_bits(gb, 32); + } + } + return 0; +} + +static int decode_nal_sei_mastering_display_info(HEVCSEIMasteringDisplay *s, GetBitContext *gb) +{ + int i; + // Mastering primaries + for (i = 0; i < 3; i++) { + s->display_primaries[i][0] = get_bits(gb, 16); + s->display_primaries[i][1] = get_bits(gb, 16); + } + // White point (x, y) + s->white_point[0] = get_bits(gb, 16); + s->white_point[1] = get_bits(gb, 16); + + // Max and min luminance of mastering display + s->max_luminance = get_bits_long(gb, 32); + s->min_luminance = get_bits_long(gb, 32); + + // As this SEI message comes before the first frame that references it, + // initialize the flag to 2 and decrement on IRAP access unit so it + // persists for the coded video sequence (e.g., between two IRAPs) + s->present = 2; + return 0; +} + +static int decode_nal_sei_content_light_info(HEVCSEIContentLight *s, GetBitContext *gb) +{ + // Max and average light levels + s->max_content_light_level = get_bits_long(gb, 16); + s->max_pic_average_light_level = get_bits_long(gb, 16); + // As this SEI message comes before the first frame that references it, + // initialize the flag to 2 and decrement on IRAP access unit so it + // persists for the coded video sequence (e.g., between two IRAPs) + s->present = 2; + return 0; +} + +static int decode_nal_sei_frame_packing_arrangement(HEVCSEIFramePacking *s, GetBitContext *gb) +{ + get_ue_golomb_long(gb); // frame_packing_arrangement_id + s->present = !get_bits1(gb); + + if (s->present) { + s->arrangement_type = get_bits(gb, 7); + s->quincunx_subsampling = get_bits1(gb); + s->content_interpretation_type = get_bits(gb, 6); + + // spatial_flipping_flag, frame0_flipped_flag, field_views_flag + skip_bits(gb, 3); + s->current_frame_is_frame0_flag = get_bits1(gb); + // frame0_self_contained_flag, frame1_self_contained_flag + skip_bits(gb, 2); + + if (!s->quincunx_subsampling && s->arrangement_type != 5) + skip_bits(gb, 16); // frame[01]_grid_position_[xy] + skip_bits(gb, 8); // frame_packing_arrangement_reserved_byte + skip_bits1(gb); // frame_packing_arrangement_persistence_flag + } + skip_bits1(gb); // upsampled_aspect_ratio_flag + return 0; +} + +static int decode_nal_sei_display_orientation(HEVCSEIDisplayOrientation *s, GetBitContext *gb) +{ + s->present = !get_bits1(gb); + + if (s->present) { + s->hflip = get_bits1(gb); // hor_flip + s->vflip = get_bits1(gb); // ver_flip + + s->anticlockwise_rotation = get_bits(gb, 16); + skip_bits1(gb); // display_orientation_persistence_flag + } + + return 0; +} + +static int decode_nal_sei_pic_timing(HEVCSEIContext *s, GetBitContext *gb, const HEVCRpiParamSets *ps, + void *logctx, int size) +{ + HEVCSEIPictureTiming *h = &s->picture_timing; + HEVCRpiSPS *sps; + + if (!ps->sps_list[s->active_seq_parameter_set_id]) + return(AVERROR(ENOMEM)); + sps = (HEVCRpiSPS*)ps->sps_list[s->active_seq_parameter_set_id]->data; + + if (sps->vui.frame_field_info_present_flag) { + int pic_struct = get_bits(gb, 4); + h->picture_struct = AV_PICTURE_STRUCTURE_UNKNOWN; + if (pic_struct == 2 || pic_struct == 10 || pic_struct == 12) { + av_log(logctx, AV_LOG_DEBUG, "BOTTOM Field\n"); + h->picture_struct = AV_PICTURE_STRUCTURE_BOTTOM_FIELD; + } else if (pic_struct == 1 || pic_struct == 9 || pic_struct == 11) { + av_log(logctx, AV_LOG_DEBUG, "TOP Field\n"); + h->picture_struct = AV_PICTURE_STRUCTURE_TOP_FIELD; + } + get_bits(gb, 2); // source_scan_type + get_bits(gb, 1); // duplicate_flag + skip_bits1(gb); + size--; + } + skip_bits_long(gb, 8 * size); + + return 0; +} + +static int decode_registered_user_data_closed_caption(HEVCSEIA53Caption *s, GetBitContext *gb, + int size) +{ + int flag; + int user_data_type_code; + int cc_count; + + if (size < 3) + return AVERROR(EINVAL); + + user_data_type_code = get_bits(gb, 8); + if (user_data_type_code == 0x3) { + skip_bits(gb, 1); // reserved + + flag = get_bits(gb, 1); // process_cc_data_flag + if (flag) { + skip_bits(gb, 1); + cc_count = get_bits(gb, 5); + skip_bits(gb, 8); // reserved + size -= 2; + + if (cc_count && size >= cc_count * 3) { + const uint64_t new_size = (s->a53_caption_size + cc_count + * UINT64_C(3)); + int i, ret; + + if (new_size > INT_MAX) + return AVERROR(EINVAL); + + /* Allow merging of the cc data from two fields. */ + ret = av_reallocp(&s->a53_caption, new_size); + if (ret < 0) + return ret; + + for (i = 0; i < cc_count; i++) { + s->a53_caption[s->a53_caption_size++] = get_bits(gb, 8); + s->a53_caption[s->a53_caption_size++] = get_bits(gb, 8); + s->a53_caption[s->a53_caption_size++] = get_bits(gb, 8); + } + skip_bits(gb, 8); // marker_bits + } + } + } else { + int i; + for (i = 0; i < size - 1; i++) + skip_bits(gb, 8); + } + + return 0; +} + +static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCSEIContext *s, GetBitContext *gb, + int size) +{ + uint32_t country_code; + uint32_t user_identifier; + + if (size < 7) + return AVERROR(EINVAL); + size -= 7; + + country_code = get_bits(gb, 8); + if (country_code == 0xFF) { + skip_bits(gb, 8); + size--; + } + + skip_bits(gb, 8); + skip_bits(gb, 8); + + user_identifier = get_bits_long(gb, 32); + + switch (user_identifier) { + case MKBETAG('G', 'A', '9', '4'): + return decode_registered_user_data_closed_caption(&s->a53_caption, gb, size); + default: + skip_bits_long(gb, size * 8); + break; + } + return 0; +} + +static int decode_nal_sei_active_parameter_sets(HEVCSEIContext *s, GetBitContext *gb, void *logctx) +{ + int num_sps_ids_minus1; + int i; + unsigned active_seq_parameter_set_id; + + get_bits(gb, 4); // active_video_parameter_set_id + get_bits(gb, 1); // self_contained_cvs_flag + get_bits(gb, 1); // num_sps_ids_minus1 + num_sps_ids_minus1 = get_ue_golomb_long(gb); // num_sps_ids_minus1 + + if (num_sps_ids_minus1 < 0 || num_sps_ids_minus1 > 15) { + av_log(logctx, AV_LOG_ERROR, "num_sps_ids_minus1 %d invalid\n", num_sps_ids_minus1); + return AVERROR_INVALIDDATA; + } + + active_seq_parameter_set_id = get_ue_golomb_long(gb); + if (active_seq_parameter_set_id >= HEVC_MAX_SPS_COUNT) { + av_log(logctx, AV_LOG_ERROR, "active_parameter_set_id %d invalid\n", active_seq_parameter_set_id); + return AVERROR_INVALIDDATA; + } + s->active_seq_parameter_set_id = active_seq_parameter_set_id; + + for (i = 1; i <= num_sps_ids_minus1; i++) + get_ue_golomb_long(gb); // active_seq_parameter_set_id[i] + + return 0; +} + +static int decode_nal_sei_alternative_transfer(HEVCSEIAlternativeTransfer *s, GetBitContext *gb) +{ + s->present = 1; + s->preferred_transfer_characteristics = get_bits(gb, 8); + return 0; +} + +static int decode_nal_sei_prefix(GetBitContext *gb, void *logctx, HEVCSEIContext *s, const HEVCRpiParamSets *ps, + int type, int size) +{ + switch (type) { + case 256: // Mismatched value from HM 8.1 + return decode_nal_sei_decoded_picture_hash(&s->picture_hash, gb); + case HEVC_SEI_TYPE_FRAME_PACKING: + return decode_nal_sei_frame_packing_arrangement(&s->frame_packing, gb); + case HEVC_SEI_TYPE_DISPLAY_ORIENTATION: + return decode_nal_sei_display_orientation(&s->display_orientation, gb); + case HEVC_SEI_TYPE_PICTURE_TIMING: + return decode_nal_sei_pic_timing(s, gb, ps, logctx, size); + case HEVC_SEI_TYPE_MASTERING_DISPLAY_INFO: + return decode_nal_sei_mastering_display_info(&s->mastering_display, gb); + case HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO: + return decode_nal_sei_content_light_info(&s->content_light, gb); + case HEVC_SEI_TYPE_ACTIVE_PARAMETER_SETS: + return decode_nal_sei_active_parameter_sets(s, gb, logctx); + case HEVC_SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35: + return decode_nal_sei_user_data_registered_itu_t_t35(s, gb, size); + case HEVC_SEI_TYPE_ALTERNATIVE_TRANSFER_CHARACTERISTICS: + return decode_nal_sei_alternative_transfer(&s->alternative_transfer, gb); + default: + av_log(logctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type); + skip_bits_long(gb, 8 * size); + return 0; + } +} + +static int decode_nal_sei_suffix(GetBitContext *gb, void *logctx, HEVCSEIContext *s, + int type, int size) +{ + switch (type) { + case HEVC_SEI_TYPE_DECODED_PICTURE_HASH: + return decode_nal_sei_decoded_picture_hash(&s->picture_hash, gb); + default: + av_log(logctx, AV_LOG_DEBUG, "Skipped SUFFIX SEI %d\n", type); + skip_bits_long(gb, 8 * size); + return 0; + } +} + +static int decode_nal_sei_message(GetBitContext * const gb, void * const logctx, HEVCSEIContext * const s, + const HEVCRpiParamSets * const ps, const int nal_unit_type) +{ + int payload_type = 0; + int payload_size = 0; + int byte = 0xFF; + av_log(logctx, AV_LOG_DEBUG, "Decoding SEI\n"); + + while (byte == 0xFF) { + if (get_bits_left(gb) < 16 || payload_type > INT_MAX - 255) + return AVERROR_INVALIDDATA; + byte = get_bits(gb, 8); + payload_type += byte; + } + byte = 0xFF; + while (byte == 0xFF) { + if (get_bits_left(gb) < 8 + 8LL*payload_size) + return AVERROR_INVALIDDATA; + byte = get_bits(gb, 8); + payload_size += byte; + } + if (nal_unit_type == HEVC_NAL_SEI_PREFIX) { + return decode_nal_sei_prefix(gb, logctx, s, ps, payload_type, payload_size); + } else { /* nal_unit_type == NAL_SEI_SUFFIX */ + return decode_nal_sei_suffix(gb, logctx, s, payload_type, payload_size); + } +} + +static int more_rbsp_data(GetBitContext *gb) +{ + return get_bits_left(gb) > 0 && show_bits(gb, 8) != 0x80; +} + +int ff_hevc_rpi_decode_nal_sei(GetBitContext *gb, void *logctx, HEVCSEIContext *s, + const HEVCRpiParamSets *ps, int type) +{ + int ret; + + do { + ret = decode_nal_sei_message(gb, logctx, s, ps, type); + if (ret < 0) + return ret; + } while (more_rbsp_data(gb)); + return 1; +} + +void ff_hevc_rpi_reset_sei(HEVCSEIContext *s) +{ + s->a53_caption.a53_caption_size = 0; + av_freep(&s->a53_caption.a53_caption); +} diff --git a/libavcodec/rpi_hevc_sei.h b/libavcodec/rpi_hevc_sei.h new file mode 100644 index 0000000000..d4ac348df9 --- /dev/null +++ b/libavcodec/rpi_hevc_sei.h @@ -0,0 +1,135 @@ +/* + * HEVC Supplementary Enhancement Information messages + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_RPI_HEVC_SEI_H +#define AVCODEC_RPI_HEVC_SEI_H + +#include + +#include "libavutil/md5.h" + +#include "get_bits.h" + +/** + * SEI message types + */ +typedef enum { + HEVC_SEI_TYPE_BUFFERING_PERIOD = 0, + HEVC_SEI_TYPE_PICTURE_TIMING = 1, + HEVC_SEI_TYPE_PAN_SCAN_RECT = 2, + HEVC_SEI_TYPE_FILLER_PAYLOAD = 3, + HEVC_SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35 = 4, + HEVC_SEI_TYPE_USER_DATA_UNREGISTERED = 5, + HEVC_SEI_TYPE_RECOVERY_POINT = 6, + HEVC_SEI_TYPE_SCENE_INFO = 9, + HEVC_SEI_TYPE_FULL_FRAME_SNAPSHOT = 15, + HEVC_SEI_TYPE_PROGRESSIVE_REFINEMENT_SEGMENT_START = 16, + HEVC_SEI_TYPE_PROGRESSIVE_REFINEMENT_SEGMENT_END = 17, + HEVC_SEI_TYPE_FILM_GRAIN_CHARACTERISTICS = 19, + HEVC_SEI_TYPE_POST_FILTER_HINT = 22, + HEVC_SEI_TYPE_TONE_MAPPING_INFO = 23, + HEVC_SEI_TYPE_FRAME_PACKING = 45, + HEVC_SEI_TYPE_DISPLAY_ORIENTATION = 47, + HEVC_SEI_TYPE_SOP_DESCRIPTION = 128, + HEVC_SEI_TYPE_ACTIVE_PARAMETER_SETS = 129, + HEVC_SEI_TYPE_DECODING_UNIT_INFO = 130, + HEVC_SEI_TYPE_TEMPORAL_LEVEL0_INDEX = 131, + HEVC_SEI_TYPE_DECODED_PICTURE_HASH = 132, + HEVC_SEI_TYPE_SCALABLE_NESTING = 133, + HEVC_SEI_TYPE_REGION_REFRESH_INFO = 134, + HEVC_SEI_TYPE_MASTERING_DISPLAY_INFO = 137, + HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO = 144, + HEVC_SEI_TYPE_ALTERNATIVE_TRANSFER_CHARACTERISTICS = 147, +} HEVC_SEI_Type; + +typedef struct HEVCSEIPictureHash { + uint8_t md5[3][16]; + uint8_t is_md5; +} HEVCSEIPictureHash; + +typedef struct HEVCSEIFramePacking { + int present; + int arrangement_type; + int content_interpretation_type; + int quincunx_subsampling; + int current_frame_is_frame0_flag; +} HEVCSEIFramePacking; + +typedef struct HEVCSEIDisplayOrientation { + int present; + int anticlockwise_rotation; + int hflip, vflip; +} HEVCSEIDisplayOrientation; + +typedef struct HEVCSEIPictureTiming { + int picture_struct; +} HEVCSEIPictureTiming; + +typedef struct HEVCSEIA53Caption { + int a53_caption_size; + uint8_t *a53_caption; +} HEVCSEIA53Caption; + +typedef struct HEVCSEIMasteringDisplay { + int present; + uint16_t display_primaries[3][2]; + uint16_t white_point[2]; + uint32_t max_luminance; + uint32_t min_luminance; +} HEVCSEIMasteringDisplay; + +typedef struct HEVCSEIContentLight { + int present; + uint16_t max_content_light_level; + uint16_t max_pic_average_light_level; +} HEVCSEIContentLight; + +typedef struct HEVCSEIAlternativeTransfer { + int present; + int preferred_transfer_characteristics; +} HEVCSEIAlternativeTransfer; + +typedef struct HEVCSEIContext { + HEVCSEIPictureHash picture_hash; + HEVCSEIFramePacking frame_packing; + HEVCSEIDisplayOrientation display_orientation; + HEVCSEIPictureTiming picture_timing; + HEVCSEIA53Caption a53_caption; + HEVCSEIMasteringDisplay mastering_display; + HEVCSEIContentLight content_light; + int active_seq_parameter_set_id; + HEVCSEIAlternativeTransfer alternative_transfer; +} HEVCSEIContext; + +struct HEVCRpiParamSets; + +int ff_hevc_rpi_decode_nal_sei(GetBitContext *gb, void *logctx, HEVCSEIContext *s, + const struct HEVCRpiParamSets *ps, int type); + +/** + * Reset SEI values that are stored on the Context. + * e.g. Caption data that was extracted during NAL + * parsing. + * + * @param s HEVCRpiContext. + */ +void ff_hevc_rpi_reset_sei(HEVCSEIContext *s); + +#endif /* AVCODEC_RPI_HEVC_SEI_H */ diff --git a/libavcodec/rpi_hevc_shader.c b/libavcodec/rpi_hevc_shader.c new file mode 100644 index 0000000000..23b49a99ae --- /dev/null +++ b/libavcodec/rpi_hevc_shader.c @@ -0,0 +1,1537 @@ +#include "rpi_hevc_shader.h" + +#ifdef _MSC_VER + #include + /* cast through uintptr_t to avoid warnings */ + #define POINTER_TO_UINT(X) ((unsigned int)(uintptr_t)(X)) +#else + #define POINTER_TO_UINT(X) ((unsigned int)(X)) +#endif + +#ifdef __cplusplus +extern "C" { /* the types are probably wrong... */ +#endif +#ifdef __cplusplus +} +#endif + +#ifdef _MSC_VER +__declspec(align(8)) +#elif defined(__GNUC__) +__attribute__((aligned(8))) +#endif +unsigned int ff_hevc_rpi_shader[] = { +// ::mc_setup_c_q0 +// ::mc_start +/* [0x00000000] */ 0x0000000c, 0xe80009e7, // mov dst, srel(i) +// ::mc_setup_c_qn +/* [0x00000008] */ 0x95801ff6, 0xd0025900, // mov tmurs, 1 ; mov ra0, unif +/* [0x00000010] */ 0xaaaaff00, 0xe6020827, // mov r0, [0,2,0,2,0,2,0,2,1,3,1,3,1,3,1,3] +/* [0x00000018] */ 0x9181e1f6, 0xd00250d8, // shl rb_ef, r0, i_shift30 ; mov ra_base, unif +/* [0x00000020] */ 0x0d801dc0, 0xd0020827, // sub r0, unif, 1 +/* [0x00000028] */ 0x119c11c0, 0xd00216a7, // shl rb_max_x, r0, v_x_shift +/* [0x00000030] */ 0x0d801dc0, 0xd00217a7, // sub rb_max_y, unif, 1 +/* [0x00000038] */ 0xff800100, 0xe0020527, // mov ra_kff800100, 0xff800100 +/* [0x00000040] */ 0x000000ff, 0xe0021627, // mov rb_pmask, v_pmask +/* [0x00000048] */ 0x001000ff, 0xe00205e7, // mov ra_blk_height_pmax, ((1 << v_bit_depth) - 1) | (v_blk_height << 16) +/* [0x00000050] */ 0x00004000, 0xe00217e7, // mov rb_fir_off_h, (FIR_OFFSET << (v_bit_depth - 8)) +/* [0x00000058] */ 0x4000000e, 0xe0020667, // mov ra_fir_off_val_wt_den_p7, (FIR_OFFSET << 16) | (DENOM + 15 - v_bit_depth) +/* [0x00000060] */ 0x95803ff6, 0x10024754, // mov ra_ef, rb_ef ; mov rb_xpitch, unif +/* [0x00000068] */ 0x15827d80, 0x10021427, // mov rb_pitch, unif +/* [0x00000070] */ 0xc0000000, 0xe0020867, // mov r1, vdw_setup_1(0) +/* [0x00000078] */ 0x0c9d03c0, 0x10021667, // add rb_dma1_base, r1, rb_pitch +/* [0x00000080] */ 0x14981f80, 0xd0020827, // and r0, 1, elem_num +/* [0x00000088] */ 0x409c5007, 0xd00049e0, // nop ; mul24 r0, r0, 5 +/* [0x00000090] */ 0x0c9a7180, 0x100210a7, // add rb_elem_x, r0, elem_num +/* [0x00000098] */ 0x11001dc0, 0xd4020827, // shl r0, ra0.16b, v_x_shift +/* [0x000000a0] */ 0x0c9c21c0, 0x10020827, // add r0, r0, rb_elem_x +/* [0x000000a8] */ 0x930001f6, 0xd2225811, // max r0, r0, 0 ; mov ra_y, ra0.16a +/* [0x000000b0] */ 0x129da1c0, 0x10020827, // min r0, r0, rb_max_x +/* [0x000000b8] */ 0x119c31c0, 0xd0220567, // shl ra_xshift_next, r0, 3 +/* [0x000000c0] */ 0x149dc1c0, 0xd0020827, // and r0, r0, -4 +/* [0x000000c8] */ 0x0d510dc0, 0x18020867, // sub r1, ra_k0, rb_pitch +/* [0x000000d0] */ 0x149e7040, 0x10020867, // and r1, r0, r1 +/* [0x000000d8] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x000000e0] */ 0x8c827076, 0x10025800, // add r0, r0, r1 ; mov ra0, unif +/* [0x000000e8] */ 0x0c627c00, 0x10020627, // add ra_base, ra_base, r0 +/* [0x000000f0] */ 0x159e6fc0, 0x100208a7, // mov r2, qpu_num +/* [0x000000f8] */ 0x0f9c25c0, 0xd0020867, // asr r1, r2, 2 +/* [0x00000100] */ 0x119c63c0, 0xd0020867, // shl r1, r1, 6 +/* [0x00000108] */ 0x149c35c0, 0xd0020827, // and r0, r2, 3 +/* [0x00000110] */ 0x159e7040, 0x10020827, // or r0, r0, r1 +/* [0x00000118] */ 0x00004800, 0xe0020867, // mov r1, vpm_setup(0, 4, h8p(0, 0)) +/* [0x00000120] */ 0x0c9e7040, 0x10021727, // add r_vpm, r0, r1 +/* [0x00000128] */ 0x80004004, 0xe0020867, // mov r1, vdw_setup_0(0, 0, dma_h8p(0,0,0)) +/* [0x00000130] */ 0x119c51c0, 0xd0020827, // shl r0, r0, 5 +/* [0x00000138] */ 0x0c9e7040, 0x100216e7, // add r_dma, r0, r1 +/* [0x00000140] */ 0x11001dc0, 0xd4020827, // shl r0, ra0.16b, v_x_shift +/* [0x00000148] */ 0x8c0021f6, 0x12125811, // add r0, r0, rb_elem_x ; mov ra_y2, ra0.16a +/* [0x00000150] */ 0x938001f6, 0xd002480f, // max r0, r0, 0 ; mov rb_base2, unif +/* [0x00000158] */ 0x129da1c0, 0x10020827, // min r0, r0, rb_max_x +/* [0x00000160] */ 0x119c31c0, 0xd0021067, // shl rb_xshift2_next, r0, 3 +/* [0x00000168] */ 0x149dc1c0, 0xd0020827, // and r0, r0, -4 +/* [0x00000170] */ 0x0d510dc0, 0x18020867, // sub r1, ra_k0, rb_pitch +/* [0x00000178] */ 0x949c307f, 0xd0024863, // and r1, r0, r1 ; mov r3, PREREAD +/* [0x00000180] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00000188] */ 0x8c467076, 0x12024822, // add r0, r0, r1 ; mov r2, ra_y2 +/* [0x00000190] */ 0x8c44fe36, 0x140253e0, // add rb_base2, rb_base2, r0 ; mov r0, ra_y +// :1 +/* [0x00000198] */ 0x0d9c17c0, 0xd00228e7, // sub.setf r3, r3, 1 +/* [0x000001a0] */ 0x139c01c0, 0xd0020867, // max r1, r0, 0 +/* [0x000001a8] */ 0x129de3c0, 0x10020867, // min r1, r1, rb_max_y +/* [0x000001b0] */ 0x4c51018f, 0x1a024821, // add r0, r0, ra_k1 ; mul24 r1, r1, rb_pitch +/* [0x000001b8] */ 0x8c627c40, 0x10225e11, // add t0s, ra_base, r1 ; mov ra_y, r0 +/* [0x000001c0] */ 0x139c05c0, 0xd0020867, // max r1, r2, 0 +/* [0x000001c8] */ 0xffffffb0, 0xf03809e7, // brr.anynz -, r:1b +/* [0x000001d0] */ 0x129de3c0, 0x10020867, // min r1, r1, rb_max_y +/* [0x000001d8] */ 0x4c51058f, 0x1a0248a1, // add r2, r2, ra_k1 ; mul24 r1, r1, rb_pitch +/* [0x000001e0] */ 0x8c9cfe52, 0x10125f11, // add t1s, rb_base2, r1 ; mov ra_y2, r2 +/* [0x000001e8] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x000001f0] */ 0x00000000, 0xe0024104, // mov ra4, 0 ; mov rb4, 0 +/* [0x000001f8] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00000200] */ 0x00000000, 0xe0024145, // mov ra5, 0 ; mov rb5, 0 +/* [0x00000208] */ 0x00000000, 0xe0024186, // mov ra6, 0 ; mov rb6, 0 +/* [0x00000210] */ 0x00000000, 0xe00241c7, // mov ra7, 0 ; mov rb7, 0 +// ::mc_filter_c_p +/* [0x00000218] */ 0x9581cff6, 0x10025c42, // mov vw_setup, rb_vpm_init ; mov ra2, unif +/* [0x00000220] */ 0x8c803ff6, 0x100269e3, // add.setf -, rb_ef, rb_ef ; mov r3, unif +/* [0x00000228] */ 0xf1081dc0, 0xd4024825, // shl r0, ra2.16b, v_x_shift ; v8subs r5rep, r0, r0 +/* [0x00000230] */ 0x8c8021f6, 0x10025810, // add r0, r0, rb_elem_x ; mov ra_width_height, unif +/* [0x00000238] */ 0x8d810bf6, 0x10025840, // sub r1, r5, rb_pitch ; mov ra0, unif +/* [0x00000240] */ 0x93567176, 0x14024800, // max r0, r0, r5 ; mov vrx_xshift, vrx_xshift_next +/* [0x00000248] */ 0x9209a1f6, 0x12225813, // min r0, r0, rb_max_x ; mov vra_y_next, ra2.16a +/* [0x00000250] */ 0x119c31c0, 0xd0220567, // shl vrx_xshift_next, r0, 3 +/* [0x00000258] */ 0x149dc1c0, 0xd0020827, // and r0, r0, -4 +/* [0x00000260] */ 0x54402077, 0xd4024862, // and r1, r0, r1 ; mul24 r2, ra_width, v_x_mul +/* [0x00000268] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00000270] */ 0x8c827076, 0x10025803, // add r0, r0, r1 ; mov ra3, unif +/* [0x00000278] */ 0x8c427636, 0x120246a1, // add vrx_base_next, r3, r0 ; mov r1, ra_height +/* [0x00000280] */ 0x8d819eb6, 0x10025756, // sub rb_dma1, rb_dma1_base, r2 ; mov ra_wt_off_mul_l0, unif +/* [0x00000288] */ 0x8c5dc3ce, 0xdc025461, // add rb_i_tmu, r1, (3-4) - PREREAD ; v8min r1, r1, ra_blk_height +/* [0x00000290] */ 0x8c81f3f6, 0xd0039496, // add rb_lcount, r1, (3-4) ; mov.ifc ra_wt_off_mul_l0, unif +/* [0x00000298] */ 0x918073f6, 0xd002581c, // shl r0, r1, v_dma_h_shift ; mov ra_dest, unif +/* [0x000002a0] */ 0x8c6670b6, 0x14024822, // add r0, r0, r2 ; mov r2, ra_fir_off_val +/* [0x000002a8] */ 0x910d01f6, 0xdc02480a, // shl r0, r0, v_dma_wh_shift ; mov rb10, ra3.8c +/* [0x000002b0] */ 0x8c59b1f6, 0x140246e1, // add ra_dma0, r0, rb_dma0_base ; mov r1, ra_wt_off_l0 +/* [0x000002b8] */ 0x5158c3d6, 0xd2024860, // shl r1, r1, i_wt_den_p5 ; mul24 r0, r2, ra_wt_mul_l0 +/* [0x000002c0] */ 0x8d667236, 0x14025320, // sub rb_wt_off, r1, r0 ; mov r0, ra_kmul_add +/* [0x000002c8] */ 0x8c59cc3f, 0xd21245a5, // add ra_wt_mul_l0, ra_wt_mul_l0, r0 ; mov r5rep, -4 +/* [0x000002d0] */ 0x950e0dbf, 0x1e0252de, // mov rb11, ra3.8d ; mov ra_link, unif +// :1 +/* [0x000002d8] */ 0x8d151bf6, 0xa00269c4, // sub.setf -, r5, rb_i_tmu ; mov rb4, ra5 ; ldtmu0 +/* [0x000002e0] */ 0x8e4c09f6, 0x140288a3, // shr r2, r4, vrx_xshift ; mov.ifz r3, vra_y_next +/* [0x000002e8] */ 0x8e4485f6, 0xd402c863, // shr r1, r2, v_v_shift ; mov.ifnz r3, vra_y +/* [0x000002f0] */ 0x8c683ff6, 0x1002b9d8, // add.setf -, rb_ef, rb_ef ; mov.ifz vra_base, vrx_base_next +/* [0x000002f8] */ 0x8c531789, 0xda224460, // add vra_y, r3, ra_k1 ; mov r0, r1 << 15 +/* [0x00000300] */ 0x9353f792, 0xd803c8e1, // max r3, r3, ra_k0 ; mov.ifnc r1, r2 << 1 +/* [0x00000308] */ 0x929de7d2, 0x1003c8e0, // min r3, r3, rb_max_y ; mov.ifnc r0, r2 +/* [0x00000310] */ 0x545d039f, 0x12024863, // and r1, r1, ra_pmax ; mul24 r3, r3, rb_pitch +/* [0x00000318] */ 0x8c618cc7, 0x10024e20, // add vr_txs, vra_base, r3 ; v8min r0, r0, rb_pmask +/* [0x00000320] */ 0x4c001bf0, 0xd8025963, // add r5rep, r5, 1 ; mul24 r3, ra0.8a, r0 +/* [0x00000328] */ 0x4d01fef1, 0x1e0248a3, // sub r2, rb_fir_off_h, r3 ; mul24 r3, ra0.8d, r1 +/* [0x00000330] */ 0x4d03e4f0, 0xda0248a3, // sub r2, r2, r3 ; mul24 r3, ra0.8b << 2, r0 << 2 @ "mul_used", 0 +/* [0x00000338] */ 0x40034031, 0xda0109e3, // nop ; mul24.ifn r3, ra0.8b << 12, r1 << 12 @ "mul_used", 0 +/* [0x00000340] */ 0x4c03c4f0, 0xdc0248a3, // add r2, r2, r3 ; mul24 r3, ra0.8c << 4, r0 << 4 @ "mul_used", 0 +/* [0x00000348] */ 0x4c032b71, 0xdc0329e3, // add.setf -, r5, r5 ; mul24.ifn r3, ra0.8c << 14, r1 << 14 @ "mul_used", 0 +/* [0x00000350] */ 0xffffff68, 0xf06809e7, // brr.anyn -, r:1b +/* [0x00000358] */ 0x4c1ca4f7, 0x100248a0, // add r2, r2, r3 ; mul24 r0, ra7, rb10 +/* [0x00000360] */ 0x550c6ffe, 0x1a024161, // mov ra5, rb6 ; mul24 r1, rb6, ra3.8b +/* [0x00000368] */ 0x8f1c05f6, 0xd00241c6, // asr ra7, r2, v_bit_depth - 8 ; mov rb6, ra7 +/* [0x00000370] */ 0x4c0c423e, 0x18024860, // add r1, r1, r0 ; mul24 r0, rb4, ra3.8a +/* [0x00000378] */ 0x4d1cb237, 0x10024860, // sub r1, r1, r0 ; mul24 r0, ra7, rb11 +/* [0x00000380] */ 0x0d9e7200, 0x10020867, // sub r1, r1, r0 +/* [0x00000388] */ 0x8f5c63f6, 0xdc024863, // asr r1, r1, 6 ; mov r3, ra_blk_height +/* [0x00000390] */ 0x4d592bce, 0x120269e0, // sub.setf -, r5, rb_lcount ; mul24 r0, r1, ra_wt_mul_l0 +/* [0x00000398] */ 0x4c64c1ce, 0x14024821, // add r0, r0, rb_wt_off ; mul24 r1, r1, ra_kmul_add +/* [0x000003a0] */ 0xed427073, 0x12024860, // sub r1, r0, r1 ; v8subs r0, ra_height, r3 +/* [0x000003a8] */ 0xffffff10, 0xf06809e7, // brr.anyn -, r:1b +/* [0x000003b0] */ 0x0f9cd3c0, 0xd0020867, // asr r1, r1, i_wt_den_p6 +/* [0x000003b8] */ 0x925f23bf, 0x12020867, // min r1, r1, ra_pmax ; mov -, vw_wait +/* [0x000003c0] */ 0x5351039f, 0x18024c22, // max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch +/* [0x000003c8] */ 0x956e7036, 0x10126431, // mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 +/* [0x000003d0] */ 0x00000000, 0xf027c9e7, // bra.anyz -, ra_link +/* [0x000003d8] */ 0x929dd0ff, 0x10024831, // min r0, r0, r3 ; mov vw_setup, rb_dma1 +/* [0x000003e0] */ 0x8d7270f6, 0x10024872, // sub r1, r0, r3 ; mov vw_addr, ra_dest +/* [0x000003e8] */ 0x119d73c0, 0xd0020867, // shl r1, r1, i_shift23 +/* [0x000003f0] */ 0xfffffec8, 0xf0f809e7, // brr -, r:1b +/* [0x000003f8] */ 0x0c9d2e00, 0x100214a7, // add rb_lcount, rb_lcount, r0 +/* [0x00000400] */ 0x0c6e7c40, 0x100206e7, // add ra_dma0, ra_dma0, r1 +/* [0x00000408] */ 0x8c71ccbf, 0x10024731, // add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init +// ::mc_filter_c_p_l1 +/* [0x00000410] */ 0x9581cff6, 0x10025c42, // mov vw_setup, rb_vpm_init ; mov ra2, unif +/* [0x00000418] */ 0x8c803ff6, 0x100269e3, // add.setf -, rb_ef, rb_ef ; mov r3, unif +/* [0x00000420] */ 0xf1081dc0, 0xd4024825, // shl r0, ra2.16b, v_x_shift ; v8subs r5rep, r0, r0 +/* [0x00000428] */ 0x8c8021f6, 0x10025810, // add r0, r0, rb_elem_x ; mov ra_width_height, unif +/* [0x00000430] */ 0x8d810bf6, 0x10025840, // sub r1, r5, rb_pitch ; mov ra0, unif +/* [0x00000438] */ 0x939c117f, 0x10125815, // max r0, r0, r5 ; mov vrx_xshift, vrx_xshift_next +/* [0x00000440] */ 0x9209a1f6, 0x12125813, // min r0, r0, rb_max_x ; mov vra_y_next, ra2.16a +/* [0x00000448] */ 0x119c31c0, 0xd0021067, // shl vrx_xshift_next, r0, 3 +/* [0x00000450] */ 0x149dc1c0, 0xd0020827, // and r0, r0, -4 +/* [0x00000458] */ 0x54402077, 0xd4024862, // and r1, r0, r1 ; mul24 r2, ra_width, v_x_mul +/* [0x00000460] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00000468] */ 0x8c827076, 0x10025803, // add r0, r0, r1 ; mov ra3, unif +/* [0x00000470] */ 0x8c427636, 0x120254e1, // add vrx_base_next, r3, r0 ; mov r1, ra_height +/* [0x00000478] */ 0x8d819eb6, 0x10025756, // sub rb_dma1, rb_dma1_base, r2 ; mov ra_wt_off_mul_l0, unif +/* [0x00000480] */ 0x8c5dc3ce, 0xdc025461, // add rb_i_tmu, r1, (3-4) - PREREAD ; v8min r1, r1, ra_blk_height +/* [0x00000488] */ 0x8c81f3f6, 0xd0039496, // add rb_lcount, r1, (3-4) ; mov.ifc ra_wt_off_mul_l0, unif +/* [0x00000490] */ 0x918073f6, 0xd002581c, // shl r0, r1, v_dma_h_shift ; mov ra_dest, unif +/* [0x00000498] */ 0x8c6670b6, 0x14024822, // add r0, r0, r2 ; mov r2, ra_fir_off_val +/* [0x000004a0] */ 0x910d01f6, 0xdc02480a, // shl r0, r0, v_dma_wh_shift ; mov rb10, ra3.8c +/* [0x000004a8] */ 0x8c59b1f6, 0x140246e1, // add ra_dma0, r0, rb_dma0_base ; mov r1, ra_wt_off_l0 +/* [0x000004b0] */ 0x5158c3d6, 0xd2024860, // shl r1, r1, i_wt_den_p5 ; mul24 r0, r2, ra_wt_mul_l0 +/* [0x000004b8] */ 0x8d667236, 0x14025320, // sub rb_wt_off, r1, r0 ; mov r0, ra_kmul_add +/* [0x000004c0] */ 0x8c59cc3f, 0xd21245a5, // add ra_wt_mul_l0, ra_wt_mul_l0, r0 ; mov r5rep, -4 +/* [0x000004c8] */ 0x950e0dbf, 0x1e0252de, // mov rb11, ra3.8d ; mov ra_link, unif +// :1 +/* [0x000004d0] */ 0x8d151bf6, 0xb00269c4, // sub.setf -, r5, rb_i_tmu ; mov rb4, ra5 ; ldtmu1 +/* [0x000004d8] */ 0x8e5539bf, 0x1202888f, // shr r2, r4, vrx_xshift ; mov.ifz vra_base, vrx_base_next +/* [0x000004e0] */ 0x8e4485f6, 0xd202c863, // shr r1, r2, v_v_shift ; mov.ifnz r3, vra_y +/* [0x000004e8] */ 0x8c4c3ff6, 0x1202a9e3, // add.setf -, rb_ef, rb_ef ; mov.ifz r3, vra_y_next +/* [0x000004f0] */ 0x8c531789, 0xda124460, // add vra_y, r3, ra_k1 ; mov r0, r1 << 15 +/* [0x000004f8] */ 0x9353f792, 0xd803c8e1, // max r3, r3, ra_k0 ; mov.ifnc r1, r2 << 1 +/* [0x00000500] */ 0x929de7d2, 0x1003c8e0, // min r3, r3, rb_max_y ; mov.ifnc r0, r2 +/* [0x00000508] */ 0x545d039f, 0x12024863, // and r1, r1, ra_pmax ; mul24 r3, r3, rb_pitch +/* [0x00000510] */ 0x8c5cfec6, 0x12024f20, // add vr_txs, vra_base, r3 ; v8min r0, r0, ra_pmax +/* [0x00000518] */ 0x4c001bf0, 0xd8025963, // add r5rep, r5, 1 ; mul24 r3, ra0.8a, r0 +/* [0x00000520] */ 0x4d01fef1, 0x1e0248a3, // sub r2, rb_fir_off_h, r3 ; mul24 r3, ra0.8d, r1 +/* [0x00000528] */ 0x4d03e4f0, 0xda0248a3, // sub r2, r2, r3 ; mul24 r3, ra0.8b << 2, r0 << 2 @ "mul_used", 0 +/* [0x00000530] */ 0x40034031, 0xda0109e3, // nop ; mul24.ifn r3, ra0.8b << 12, r1 << 12 @ "mul_used", 0 +/* [0x00000538] */ 0x4c03c4f0, 0xdc0248a3, // add r2, r2, r3 ; mul24 r3, ra0.8c << 4, r0 << 4 @ "mul_used", 0 +/* [0x00000540] */ 0x4c032b71, 0xdc0329e3, // add.setf -, r5, r5 ; mul24.ifn r3, ra0.8c << 14, r1 << 14 @ "mul_used", 0 +/* [0x00000548] */ 0xffffff68, 0xf06809e7, // brr.anyn -, r:1b +/* [0x00000550] */ 0x4c1ca4f7, 0x100248a0, // add r2, r2, r3 ; mul24 r0, ra7, rb10 +/* [0x00000558] */ 0x550c6ffe, 0x1a024161, // mov ra5, rb6 ; mul24 r1, rb6, ra3.8b +/* [0x00000560] */ 0x8f1c05f6, 0xd00241c6, // asr ra7, r2, v_bit_depth - 8 ; mov rb6, ra7 +/* [0x00000568] */ 0x4c0c423e, 0x18024860, // add r1, r1, r0 ; mul24 r0, rb4, ra3.8a +/* [0x00000570] */ 0x4d1cb237, 0x10024860, // sub r1, r1, r0 ; mul24 r0, ra7, rb11 +/* [0x00000578] */ 0x0d9e7200, 0x10020867, // sub r1, r1, r0 +/* [0x00000580] */ 0x8f5c63f6, 0xdc024863, // asr r1, r1, 6 ; mov r3, ra_blk_height +/* [0x00000588] */ 0x4d592bce, 0x120269e0, // sub.setf -, r5, rb_lcount ; mul24 r0, r1, ra_wt_mul_l0 +/* [0x00000590] */ 0x4c64c1ce, 0x14024821, // add r0, r0, rb_wt_off ; mul24 r1, r1, ra_kmul_add +/* [0x00000598] */ 0xed427073, 0x12024860, // sub r1, r0, r1 ; v8subs r0, ra_height, r3 +/* [0x000005a0] */ 0xffffff10, 0xf06809e7, // brr.anyn -, r:1b +/* [0x000005a8] */ 0x0f9cd3c0, 0xd0020867, // asr r1, r1, i_wt_den_p6 +/* [0x000005b0] */ 0x925f23bf, 0x12020867, // min r1, r1, ra_pmax ; mov -, vw_wait +/* [0x000005b8] */ 0x5351039f, 0x18024c22, // max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch +/* [0x000005c0] */ 0x956e7036, 0x10126431, // mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 +/* [0x000005c8] */ 0x00000000, 0xf027c9e7, // bra.anyz -, ra_link +/* [0x000005d0] */ 0x929dd0ff, 0x10024831, // min r0, r0, r3 ; mov vw_setup, rb_dma1 +/* [0x000005d8] */ 0x8d7270f6, 0x10024872, // sub r1, r0, r3 ; mov vw_addr, ra_dest +/* [0x000005e0] */ 0x119d73c0, 0xd0020867, // shl r1, r1, i_shift23 +/* [0x000005e8] */ 0xfffffec8, 0xf0f809e7, // brr -, r:1b +/* [0x000005f0] */ 0x0c9d2e00, 0x100214a7, // add rb_lcount, rb_lcount, r0 +/* [0x000005f8] */ 0x0c6e7c40, 0x100206e7, // add ra_dma0, ra_dma0, r1 +/* [0x00000600] */ 0x8c71ccbf, 0x10024731, // add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init +// ::mc_filter_c_b +/* [0x00000608] */ 0x9581cff6, 0x10025c42, // mov vw_setup, rb_vpm_init ; mov ra2, unif +/* [0x00000610] */ 0x8c803ff6, 0x100269e3, // add.setf -, rb_ef, rb_ef ; mov r3, unif +/* [0x00000618] */ 0xf1081dc9, 0xd4024825, // shl r0, ra2.16b, v_x_shift ; v8subs r5rep, r1, r1 +/* [0x00000620] */ 0x8c0821f6, 0x12225813, // add r0, r0, rb_elem_x ; mov ra_y_next, ra2.16a +/* [0x00000628] */ 0x8d810bf6, 0x10025850, // sub r1, r5, rb_pitch ; mov ra_width_height, unif +/* [0x00000630] */ 0x93567176, 0x14125815, // max r0, r0, r5 ; mov ra_xshift, ra_xshift_next +/* [0x00000638] */ 0x9281a1f6, 0x10025800, // min r0, r0, rb_max_x ; mov ra0, unif +/* [0x00000640] */ 0x119c31c0, 0xd0220567, // shl ra_xshift_next, r0, 3 +/* [0x00000648] */ 0x9481c1f6, 0xd0025802, // and r0, r0, -4 ; mov ra2, unif +/* [0x00000650] */ 0x54402077, 0xd4024862, // and r1, r0, r1 ; mul24 r2, ra_width, v_x_mul +/* [0x00000658] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00000660] */ 0x8c427076, 0x12024821, // add r0, r0, r1 ; mov r1, ra_height +/* [0x00000668] */ 0x8c9c163f, 0x10024680, // add ra_base_next, r3, r0 ; mov rb_xshift2, rb_xshift2_next +/* [0x00000670] */ 0x8d819eb6, 0x10025756, // sub rb_dma1, rb_dma1_base, r2 ; mov ra_wt_off_mul_l0, unif +/* [0x00000678] */ 0x8c5dc3ce, 0xdc025461, // add rb_i_tmu, r1, (3-4) - PREREAD ; v8min r1, r1, ra_blk_height +/* [0x00000680] */ 0x8c59f3f6, 0xd4139496, // add rb_lcount, r1, (3-4) ; mov.ifc ra_wt_mul_l0, ra_wt_off_l0 +/* [0x00000688] */ 0x918073f6, 0xd0025803, // shl r0, r1, v_dma_h_shift ; mov ra3, unif +/* [0x00000690] */ 0x8c8270b6, 0x10024823, // add r0, r0, r2 ; mov r3, unif +/* [0x00000698] */ 0x910d01f6, 0xd2125813, // shl r0, r0, v_dma_wh_shift ; mov ra_y2_next, ra3.16a +/* [0x000006a0] */ 0x8c0db1f6, 0x140246e0, // add ra_dma0, r0, rb_dma0_base ; mov r0, ra3.16b +/* [0x000006a8] */ 0x918011f6, 0xd0025801, // shl r0, r0, v_x_shift ; mov ra1, unif +/* [0x000006b0] */ 0x8c8021f6, 0x10025803, // add r0, r0, rb_elem_x ; mov ra3, unif +/* [0x000006b8] */ 0x8d810bf6, 0x10025852, // sub r1, r5, rb_pitch ; mov ra_wt_off_mul_l1, unif +/* [0x000006c0] */ 0x939de17f, 0x10025809, // max r0, r0, r5 ; mov ra9, rb_max_y +/* [0x000006c8] */ 0x9265a1f6, 0x14024822, // min r0, r0, rb_max_x ; mov r2, ra_kmul_add +/* [0x000006d0] */ 0x119c31c0, 0xd0021067, // shl rb_xshift2_next, r0, 3 +/* [0x000006d8] */ 0x9481c1f6, 0xd0039812, // and r0, r0, -4 ; mov.ifc ra_wt_off_mul_l1, unif +/* [0x000006e0] */ 0x949dc07f, 0xd0024865, // and r1, r0, r1 ; mov r5rep, -4 +/* [0x000006e8] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x000006f0] */ 0x8c827076, 0x1002581c, // add r0, r0, r1 ; mov ra_dest, unif +/* [0x000006f8] */ 0x8c667636, 0x140254e0, // add rb_base2_next, r3, r0 ; mov r0, ra_fir_off_val +/* [0x00000700] */ 0x4c5a7c86, 0x121245a1, // add ra_wt_mul_l0, ra_wt_mul_l0, r2 ; mul24 r1, r0, ra_wt_mul_l0 +/* [0x00000708] */ 0x4c4a7c86, 0x121244a0, // add ra_wt_mul_l1, ra_wt_mul_l1, r2 ; mul24 r0, r0, ra_wt_mul_l1 +/* [0x00000710] */ 0x8c4a7076, 0x14024821, // add r0, r0, r1 ; mov r1, ra_wt_off_l1 +/* [0x00000718] */ 0x910cd3f6, 0xde02484b, // shl r1, r1, i_wt_den_p6 ; mov rb11, ra3.8d +/* [0x00000720] */ 0x8d827236, 0x1002531e, // sub rb_wt_off, r1, r0 ; mov ra_link, unif +/* [0x00000728] */ 0x95080ff6, 0x1e024287, // mov ra10, rb_xshift2 ; mov rb7, ra2.8d +// :1 +/* [0x00000730] */ 0x0d9d1bc0, 0xa00229e7, // sub.setf -, r5, rb_i_tmu ; nop ; ldtmu0 +/* [0x00000738] */ 0x8e5539bf, 0x1202888f, // shr r2, r4, ra_xshift ; mov.ifz rb_base2, rb_base2_next +/* [0x00000740] */ 0x8e4c85f6, 0xd0029851, // shr r1, r2, v_v_shift ; mov.ifz ra_y_y2, ra_y_y2_next +/* [0x00000748] */ 0x8c683ff6, 0x1002b9d8, // add.setf -, rb_ef, rb_ef ; mov.ifz ra_base, ra_base_next +/* [0x00000750] */ 0x8c441fb6, 0xd4224463, // add ra_y, 1, ra_y ; mov r3, ra_y +/* [0x00000758] */ 0x93531789, 0xd80248e0, // max r3, r3, ra_k0 ; mov r0, r1 << 15 +/* [0x00000760] */ 0x9227f792, 0xd003c8e1, // min r3, r3, ra9 ; mov.ifnc r1, r2 << 1 +/* [0x00000768] */ 0x559d049f, 0x100e4823, // mov.ifnc r0, r2 ; mul24 r3, r3, rb_pitch +/* [0x00000770] */ 0x8c618cc7, 0x10024e20, // add t0s, ra_base, r3 ; v8min r0, r0, rb_pmask +/* [0x00000778] */ 0x540183f0, 0x18024862, // and r1, r1, rb_pmask ; mul24 r2, ra0.8a, r0 +/* [0x00000780] */ 0x4d01feb1, 0x1e0248a3, // sub r2, rb_fir_off_h, r2 ; mul24 r3, ra0.8d, r1 +/* [0x00000788] */ 0x4d03e4f0, 0xda0248a3, // sub r2, r2, r3 ; mul24 r3, ra0.8b << 2, r0 << 2 @ "mul_used", 0 +/* [0x00000790] */ 0x40034031, 0xda0109e3, // nop ; mul24.ifn r3, ra0.8b << 12, r1 << 12 @ "mul_used", 0 +/* [0x00000798] */ 0x4c03c4f0, 0xdc0248a3, // add r2, r2, r3 ; mul24 r3, ra0.8c << 4, r0 << 4 @ "mul_used", 0 +/* [0x000007a0] */ 0x40032031, 0xdc0109e3, // nop ; mul24.ifn r3, ra0.8c << 14, r1 << 14 @ "mul_used", 0 +/* [0x000007a8] */ 0x4c0854fe, 0xb8025804, // add r0, r2, r3 ; mul24 ra4, rb5, ra2.8a ; ldtmu1 +/* [0x000007b0] */ 0x8e2869bf, 0x10024885, // shr r2, r4, ra10 ; mov rb5, rb6 +/* [0x000007b8] */ 0x8e4485f6, 0xd2024863, // shr r1, r2, v_v_shift ; mov r3, ra_y2 +/* [0x000007c0] */ 0x8e1c01f6, 0xd00241c6, // shr ra7, r0, v_bit_depth - 8 ; mov rb6, ra7 +/* [0x000007c8] */ 0x8c531789, 0xda124460, // add ra_y2, r3, ra_k1 ; mov r0, r1 << 15 +/* [0x000007d0] */ 0x9353f792, 0xd803c8e1, // max r3, r3, ra_k0 ; mov.ifnc r1, r2 << 1 +/* [0x000007d8] */ 0x925de7ce, 0x120248e1, // min r3, r3, rb_max_y ; v8min r1, r1, ra_pmax +/* [0x000007e0] */ 0x559d049f, 0x100e4823, // mov.ifnc r0, r2 ; mul24 r3, r3, rb_pitch +/* [0x000007e8] */ 0x8c5cfec6, 0x12024f20, // add t1s, rb_base2, r3 ; v8min r0, r0, ra_pmax +/* [0x000007f0] */ 0x4c041bf0, 0xd8025962, // add r5rep, r5, 1 ; mul24 r2, ra1.8a, r0 +/* [0x000007f8] */ 0x4d05feb1, 0x1e0248a3, // sub r2, rb_fir_off_h, r2 ; mul24 r3, ra1.8d, r1 +/* [0x00000800] */ 0x4d07e4f0, 0xda0248a3, // sub r2, r2, r3 ; mul24 r3, ra1.8b << 2, r0 << 2 @ "mul_used", 0 +/* [0x00000808] */ 0x40074031, 0xda0109e3, // nop ; mul24.ifn r3, ra1.8b << 12, r1 << 12 @ "mul_used", 0 +/* [0x00000810] */ 0x4c07c6b0, 0xdc0248a3, // add r2, r3, r2 ; mul24 r3, ra1.8c << 4, r0 << 4 @ "mul_used", 0 +/* [0x00000818] */ 0x4c072b71, 0xdc0329e3, // add.setf -, r5, r5 ; mul24.ifn r3, ra1.8c << 14, r1 << 14 @ "mul_used", 0 +/* [0x00000820] */ 0xfffffef0, 0xf06809e7, // brr.anyn -, r:1b +/* [0x00000828] */ 0x4c0c94fe, 0x180248a0, // add r2, r2, r3 ; mul24 r0, rb9, ra3.8a +/* [0x00000830] */ 0x550caffe, 0x1a025261, // mov rb9, rb10 ; mul24 r1, rb10, ra3.8b +/* [0x00000838] */ 0x8e2c05f6, 0xd00242ca, // shr ra11, r2, v_bit_depth - 8 ; mov rb10, ra11 +/* [0x00000840] */ 0x4d08523e, 0x1a0248a1, // sub r2, r1, r0 ; mul24 r1, rb5, ra2.8b +/* [0x00000848] */ 0x8d112bf6, 0x100269e0, // sub.setf -, r5, rb_lcount ; mov r0, ra4 +/* [0x00000850] */ 0x4d08623e, 0x1c024860, // sub r1, r1, r0 ; mul24 r0, rb6, ra2.8c +/* [0x00000858] */ 0x4c1c7237, 0x10024860, // add r1, r1, r0 ; mul24 r0, ra7, rb7 +/* [0x00000860] */ 0x4d0ca23e, 0x1c024860, // sub r1, r1, r0 ; mul24 r0, rb10, ra3.8c +/* [0x00000868] */ 0x4c2cb437, 0x100248a0, // add r2, r2, r0 ; mul24 r0, ra11, rb11 +/* [0x00000870] */ 0x0d9e7400, 0x100208a7, // sub r2, r2, r0 +/* [0x00000878] */ 0x0e9c63c0, 0xd0020867, // shr r1, r1, 6 +/* [0x00000880] */ 0x4e5865ce, 0xd20248a0, // shr r2, r2, 6 ; mul24 r0, r1, ra_wt_mul_l0 +/* [0x00000888] */ 0x4c4a7456, 0x120248a1, // add r2, r2, r1 ; mul24 r1, r2, ra_wt_mul_l1 +/* [0x00000890] */ 0x4c667216, 0x14024862, // add r1, r1, r0 ; mul24 r2, r2, ra_kmul_add +/* [0x00000898] */ 0x8d5e72b6, 0x1c024863, // sub r1, r1, r2 ; mov r3, ra_blk_height +/* [0x000008a0] */ 0xec40c3f3, 0x12024860, // add r1, r1, rb_wt_off ; v8subs r0, ra_height, r3 +/* [0x000008a8] */ 0xfffffe68, 0xf06809e7, // brr.anyn -, r:1b +/* [0x000008b0] */ 0x0f667380, 0x18020867, // asr r1, r1, ra_wt_den_p7 +/* [0x000008b8] */ 0x925f23bf, 0x12020867, // min r1, r1, ra_pmax ; mov -, vw_wait +/* [0x000008c0] */ 0x5351039f, 0x18024c22, // max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch +/* [0x000008c8] */ 0x956e7036, 0x10126431, // mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 +/* [0x000008d0] */ 0x00000000, 0xf027c9e7, // bra.anyz -, ra_link +/* [0x000008d8] */ 0x929dd0ff, 0x10024831, // min r0, r0, r3 ; mov vw_setup, rb_dma1 +/* [0x000008e0] */ 0x8d7270f6, 0x10024872, // sub r1, r0, r3 ; mov vw_addr, ra_dest +/* [0x000008e8] */ 0x119d73c0, 0xd0020867, // shl r1, r1, i_shift23 +/* [0x000008f0] */ 0xfffffe20, 0xf0f809e7, // brr -, r:1b +/* [0x000008f8] */ 0x0c9d2e00, 0x100214a7, // add rb_lcount, rb_lcount, r0 +/* [0x00000900] */ 0x0c6e7c40, 0x100206e7, // add ra_dma0, ra_dma0, r1 +/* [0x00000908] */ 0x8c71ccbf, 0x10024731, // add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init +// ::mc_sync_q0 +/* [0x00000910] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00000918] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00000920] */ 0x00000010, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000928] */ 0x00000010, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000930] */ 0x00000010, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000938] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00000940] */ 0x0000001c, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000948] */ 0x00000001, 0xe80009e7, // mov dst, srel(i) +/* [0x00000950] */ 0x0000000d, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync_q1 +/* [0x00000958] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00000960] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00000968] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00000970] */ 0x00000000, 0xe80009e7, // mov dst, srel(i) +/* [0x00000978] */ 0x00000011, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000980] */ 0x00000002, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync_q2 +/* [0x00000988] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00000990] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00000998] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x000009a0] */ 0x00000000, 0xe80009e7, // mov dst, srel(i) +/* [0x000009a8] */ 0x00000012, 0xe80009e7, // mov dst, sacq(i) +/* [0x000009b0] */ 0x00000003, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync_q3 +/* [0x000009b8] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x000009c0] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x000009c8] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x000009d0] */ 0x00000000, 0xe80009e7, // mov dst, srel(i) +/* [0x000009d8] */ 0x00000013, 0xe80009e7, // mov dst, sacq(i) +/* [0x000009e0] */ 0x009e7000, 0x100009e7, // nop +// ::mc_sync_q4 +/* [0x000009e8] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x000009f0] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x000009f8] */ 0x00000014, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000a00] */ 0x00000014, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000a08] */ 0x00000014, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000a10] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00000a18] */ 0x0000001d, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000a20] */ 0x00000005, 0xe80009e7, // mov dst, srel(i) +/* [0x00000a28] */ 0x0000000e, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync_q5 +/* [0x00000a30] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00000a38] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00000a40] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00000a48] */ 0x00000004, 0xe80009e7, // mov dst, srel(i) +/* [0x00000a50] */ 0x00000015, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000a58] */ 0x00000006, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync_q6 +/* [0x00000a60] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00000a68] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00000a70] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00000a78] */ 0x00000004, 0xe80009e7, // mov dst, srel(i) +/* [0x00000a80] */ 0x00000016, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000a88] */ 0x00000007, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync_q7 +/* [0x00000a90] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00000a98] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00000aa0] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00000aa8] */ 0x00000004, 0xe80009e7, // mov dst, srel(i) +/* [0x00000ab0] */ 0x00000017, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000ab8] */ 0x009e7000, 0x100009e7, // nop +// ::mc_sync_q8 +/* [0x00000ac0] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00000ac8] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00000ad0] */ 0x00000018, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000ad8] */ 0x00000018, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000ae0] */ 0x00000018, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000ae8] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00000af0] */ 0x0000001e, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000af8] */ 0x00000009, 0xe80009e7, // mov dst, srel(i) +/* [0x00000b00] */ 0x0000000c, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync_q9 +/* [0x00000b08] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00000b10] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00000b18] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00000b20] */ 0x00000008, 0xe80009e7, // mov dst, srel(i) +/* [0x00000b28] */ 0x00000019, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000b30] */ 0x0000000a, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync_q10 +/* [0x00000b38] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00000b40] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00000b48] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00000b50] */ 0x00000008, 0xe80009e7, // mov dst, srel(i) +/* [0x00000b58] */ 0x0000001a, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000b60] */ 0x0000000b, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync_q11 +/* [0x00000b68] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00000b70] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00000b78] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00000b80] */ 0x00000008, 0xe80009e7, // mov dst, srel(i) +/* [0x00000b88] */ 0x0000001b, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000b90] */ 0x009e7000, 0x100009e7, // nop +// ::mc_exit_c_qn +// ::mc_exit_y_qn +/* [0x00000b98] */ 0x00000002, 0xe00228e7, // mov.setf r3, PREREAD - 1 +// :1 +/* [0x00000ba0] */ 0xffffffe0, 0xf03809e7, // brr.anynz -, r:1b +/* [0x00000ba8] */ 0x009e7000, 0xa00009e7, // nop ; nop ; ldtmu0 +/* [0x00000bb0] */ 0x009e7000, 0xb00009e7, // nop ; nop ; ldtmu1 +/* [0x00000bb8] */ 0x0d9c17c0, 0xd00228e7, // sub.setf r3, r3, 1 +/* [0x00000bc0] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00000bc8] */ 0x009e7000, 0x300009e7, // nop ; nop ; thrend +/* [0x00000bd0] */ 0x009e7000, 0x100009e7, // nop +/* [0x00000bd8] */ 0x009e7000, 0x100009e7, // nop +// ::mc_exit_c_q0 +// ::mc_exit_y_q0 +/* [0x00000be0] */ 0x00000002, 0xe00228e7, // mov.setf r3, PREREAD - 1 +// :1 +/* [0x00000be8] */ 0xffffffe0, 0xf03809e7, // brr.anynz -, r:1b +/* [0x00000bf0] */ 0x009e7000, 0xa00009e7, // nop ; nop ; ldtmu0 +/* [0x00000bf8] */ 0x009e7000, 0xb00009e7, // nop ; nop ; ldtmu1 +/* [0x00000c00] */ 0x0d9c17c0, 0xd00228e7, // sub.setf r3, r3, 1 +/* [0x00000c08] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00000c10] */ 0x0000001c, 0xe80009e7, // mov dst, sacq(i) +/* [0x00000c18] */ 0x009e7000, 0x300009e7, // nop ; nop ; thrend +/* [0x00000c20] */ 0x00000001, 0xe00209a7, // mov interrupt, 1 +/* [0x00000c28] */ 0x009e7000, 0x100009e7, // nop +// ::mc_setup_y_q0 +/* [0x00000c30] */ 0x0000000c, 0xe80009e7, // mov dst, srel(i) +// ::mc_setup_y_qn +/* [0x00000c38] */ 0x95801ff6, 0xd0025900, // mov tmurs, 1 ; mov ra0, unif +/* [0x00000c40] */ 0x15827d80, 0x10020267, // mov ra9, unif +/* [0x00000c48] */ 0x15827d80, 0x10020067, // mov ra1, unif +/* [0x00000c50] */ 0xaaaaff00, 0xe6020827, // mov r0, [0,2,0,2,0,2,0,2,1,3,1,3,1,3,1,3] +/* [0x00000c58] */ 0x9181e1f6, 0xd00250cb, // shl rb_ef, r0, i_shift30 ; mov ra11, unif +/* [0x00000c60] */ 0xff800100, 0xe0020527, // mov ra_kff800100, 0xff800100 +/* [0x00000c68] */ 0x000000ff, 0xe0021627, // mov rb_pmask, v_pmask +/* [0x00000c70] */ 0x001000ff, 0xe00205e7, // mov ra_blk_height_pmax, ((1 << v_bit_depth) - 1) | (v_blk_height << 16) +/* [0x00000c78] */ 0x00004000, 0xe00217e7, // mov rb_fir_off_h, (FIR_OFFSET << (v_bit_depth - 8)) +/* [0x00000c80] */ 0x4000000e, 0xe0020667, // mov ra_fir_off_val_wt_den_p7, (FIR_OFFSET << 16) | (DENOM + 15 - v_bit_depth) +/* [0x00000c88] */ 0x050b0a00, 0xe0021567, // mov rb_y_coeffs_2, 0x050b0a00 +/* [0x00000c90] */ 0x11283a40, 0xe00215a7, // mov rb_y_coeffs_3, 0x11283a40 +/* [0x00000c98] */ 0x0a0b0500, 0xe00215e7, // mov rb_y_coeffs_5, 0x0a0b0500 +/* [0x00000ca0] */ 0x15827d80, 0x100200e7, // mov ra3, unif +/* [0x00000ca8] */ 0x95803ff6, 0x10024754, // mov ra_ef, rb_ef ; mov rb_xpitch, unif +/* [0x00000cb0] */ 0x0d0c1dc0, 0xd40216a7, // sub rb_max_x, ra3.16b, 1 +/* [0x00000cb8] */ 0x0d0c1dc0, 0xd20217a7, // sub rb_max_y, ra3.16a, 1 +/* [0x00000cc0] */ 0x959a0dbf, 0x100248d0, // mov r3, elem_num ; mov rb_pitch, unif +/* [0x00000cc8] */ 0xc0000000, 0xe0020867, // mov r1, vdw_setup_1(0) +/* [0x00000cd0] */ 0x159d03c0, 0x10021667, // or rb_dma1_base, r1, rb_pitch +/* [0x00000cd8] */ 0x0c027cc0, 0x14020827, // add r0, ra0.16b, r3 +/* [0x00000ce0] */ 0x139c01c0, 0xd0020827, // max r0, r0, 0 +/* [0x00000ce8] */ 0x129da1c0, 0x10020827, // min r0, r0, rb_max_x +/* [0x00000cf0] */ 0x119c31c0, 0xd0220567, // shl ra_xshift_next, r0, 3 +/* [0x00000cf8] */ 0xf49dc1d2, 0xd0024822, // and r0, r0, -4 ; v8subs r2, r2, r2 +/* [0x00000d00] */ 0x0d9d05c0, 0x100208a7, // sub r2, r2, rb_pitch +/* [0x00000d08] */ 0x149e7080, 0x10020867, // and r1, r0, r2 +/* [0x00000d10] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00000d18] */ 0x0c9e7040, 0x10020827, // add r0, r0, r1 +/* [0x00000d20] */ 0x0c267c00, 0x10020627, // add ra_base, ra9, r0 +/* [0x00000d28] */ 0x0c067cc0, 0x14020827, // add r0, ra1.16b, r3 +/* [0x00000d30] */ 0x139c01c0, 0xd0020827, // max r0, r0, 0 +/* [0x00000d38] */ 0x129da1c0, 0x10020827, // min r0, r0, rb_max_x +/* [0x00000d40] */ 0x119c31c0, 0xd0021067, // shl rb_xshift2_next, r0, 3 +/* [0x00000d48] */ 0x149dc1c0, 0xd0020827, // and r0, r0, -4 +/* [0x00000d50] */ 0x149e7080, 0x10020867, // and r1, r0, r2 +/* [0x00000d58] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00000d60] */ 0x0c9e7040, 0x10020827, // add r0, r0, r1 +/* [0x00000d68] */ 0x0c2e7c00, 0x100213e7, // add rb_base2, ra11, r0 +/* [0x00000d70] */ 0x80027036, 0x120049e0, // nop ; mov r0, ra0.16a +/* [0x00000d78] */ 0x95043ff6, 0xd20248e2, // mov r3, PREREAD ; mov r2, ra1.16a +// :1 +/* [0x00000d80] */ 0x0d9c17c0, 0xd00228e7, // sub.setf r3, r3, 1 +/* [0x00000d88] */ 0x139c01c0, 0xd0020867, // max r1, r0, 0 +/* [0x00000d90] */ 0x129de3c0, 0x10020867, // min r1, r1, rb_max_y +/* [0x00000d98] */ 0x4c51018f, 0x1a024821, // add r0, r0, ra_k1 ; mul24 r1, r1, rb_pitch +/* [0x00000da0] */ 0x8c627c40, 0x10225e11, // add t0s, ra_base, r1 ; mov ra_y, r0 +/* [0x00000da8] */ 0x139c05c0, 0xd0020867, // max r1, r2, 0 +/* [0x00000db0] */ 0xffffffb0, 0xf03809e7, // brr.anynz -, r:1b +/* [0x00000db8] */ 0x129de3c0, 0x10020867, // min r1, r1, rb_max_y +/* [0x00000dc0] */ 0x4c51058f, 0x1a0248a1, // add r2, r2, ra_k1 ; mul24 r1, r1, rb_pitch +/* [0x00000dc8] */ 0x8c9cfe52, 0x10125f11, // add t1s, rb_base2, r1 ; mov ra_y2, r2 +/* [0x00000dd0] */ 0x159e6fc0, 0x100208a7, // mov r2, qpu_num +/* [0x00000dd8] */ 0x0f9c25c0, 0xd0020867, // asr r1, r2, 2 +/* [0x00000de0] */ 0x119c63c0, 0xd0020867, // shl r1, r1, 6 +/* [0x00000de8] */ 0x149c35c0, 0xd0020827, // and r0, r2, 3 +/* [0x00000df0] */ 0x159e7040, 0x10020827, // or r0, r0, r1 +/* [0x00000df8] */ 0x00004800, 0xe0020867, // mov r1, vpm_setup(0, 4, h8p(0, 0)) +/* [0x00000e00] */ 0x0c9e7040, 0x10021727, // add r_vpm, r0, r1 +/* [0x00000e08] */ 0x80004004, 0xe0020867, // mov r1, vdw_setup_0(0, 0, dma_h8p(0,0,0)) +/* [0x00000e10] */ 0x119c51c0, 0xd0020827, // shl r0, r0, 5 +/* [0x00000e18] */ 0x0c9e7040, 0x100216e7, // add r_dma, r0, r1 +/* [0x00000e20] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00000e28] */ 0x00000000, 0xe0024208, // mov ra8, 0 ; mov rb8, 0 +/* [0x00000e30] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00000e38] */ 0x00000000, 0xe0024249, // mov ra9, 0 ; mov rb9, 0 +/* [0x00000e40] */ 0x00000000, 0xe002428a, // mov ra10, 0 ; mov rb10, 0 +/* [0x00000e48] */ 0x00000000, 0xe00242cb, // mov ra11, 0 ; mov rb11, 0 +// :per_block_setup_8 +/* [0x00000e50] */ 0x93567176, 0x14125815, // max r0, r0, r5 ; mov ra_xshift, ra_xshift_next +/* [0x00000e58] */ 0x129da1c0, 0x10020827, // min r0, r0, rb_max_x +/* [0x00000e60] */ 0x119c31c0, 0xd0220567, // shl ra_xshift_next, r0, 3 +/* [0x00000e68] */ 0x149dc1c0, 0xd0020827, // and r0, r0, -4 +/* [0x00000e70] */ 0x8d810bf6, 0x1002589a, // sub r2, r5, rb_pitch ; mov ra_base_next, unif +/* [0x00000e78] */ 0x940270b6, 0x12225853, // and r1, r0, r2 ; mov ra_y_next, ra0.16a +/* [0x00000e80] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00000e88] */ 0x8c827076, 0x10025801, // add r0, r0, r1 ; mov ra1, unif +/* [0x00000e90] */ 0x0c6a7c00, 0x100206a7, // add ra_base_next, ra_base_next, r0 +/* [0x00000e98] */ 0x0c067cc0, 0x14020827, // add r0, ra1.16b, r3 +/* [0x00000ea0] */ 0x93067176, 0x12125813, // max r0, r0, r5 ; mov ra_y2_next, ra1.16a +/* [0x00000ea8] */ 0x9281a1f6, 0x10024813, // min r0, r0, rb_max_x ; mov rb_base2_next, unif +/* [0x00000eb0] */ 0x119c31c0, 0xd0021067, // shl rb_xshift2_next, r0, 3 +/* [0x00000eb8] */ 0x9481c1f6, 0xd0025810, // and r0, r0, -4 ; mov ra_width_height, unif +/* [0x00000ec0] */ 0x949dc0bf, 0x10024871, // and r1, r0, r2 ; mov vw_setup, rb_vpm_init +/* [0x00000ec8] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00000ed0] */ 0x4c401077, 0xd4024821, // add r0, r0, r1 ; mul24 r1, ra_width, v_x_mul +/* [0x00000ed8] */ 0x0c9d3e00, 0x100214e7, // add rb_base2_next, rb_base2_next, r0 +/* [0x00000ee0] */ 0x8d419e76, 0x12025760, // sub rb_dma1, rb_dma1_base, r1 ; mov r0, ra_height +/* [0x00000ee8] */ 0x8c5dc1c6, 0xdc025460, // add rb_i_tmu, r0, (7-8) - PREREAD ; v8min r0, r0, ra_blk_height +/* [0x00000ef0] */ 0x0c9df1c0, 0xd00214a7, // add rb_lcount, r0, (7-8) +/* [0x00000ef8] */ 0x916471f6, 0xd4024823, // shl r0, r0, v_dma_h_shift ; mov r3, ra_kmul_add +/* [0x00000f00] */ 0x0c9e7040, 0x10020827, // add r0, r0, r1 +/* [0x00000f08] */ 0x916501f6, 0xd4024822, // shl r0, r0, v_dma_wh_shift ; mov r2, ra_fir_off_val +/* [0x00000f10] */ 0x8c81b1f6, 0x100246e0, // add ra_dma0, r0, rb_dma0_base ; mov r0, unif +/* [0x00000f18] */ 0x918101f6, 0xd00a5816, // shl.ifnn r0, r0, i_shift16 ; mov ra_wt_off_mul_l0, unif +/* [0x00000f20] */ 0x915031f6, 0xde024205, // shl ra8, r0, 3 ; mov rb5, ra_k255 +/* [0x00000f28] */ 0x01040400, 0xe0020867, // mov r1, 0x01040400 +/* [0x00000f30] */ 0x10227380, 0x1e5200a7, // ror ra2.8b, r1, ra8.8d +/* [0x00000f38] */ 0x10227380, 0x1c520027, // ror ra0.8b, r1, ra8.8c +/* [0x00000f40] */ 0x10215f80, 0x1e6200a7, // ror ra2.8c, rb_y_coeffs_2, ra8.8d +/* [0x00000f48] */ 0x10215f80, 0x1c620027, // ror ra0.8c, rb_y_coeffs_2, ra8.8c +/* [0x00000f50] */ 0x00010100, 0xe0020867, // mov r1,0x00010100 +/* [0x00000f58] */ 0x902203bf, 0x1e025812, // ror r0, r1, ra8.8d ; mov ra_wt_off_mul_l1, unif +/* [0x00000f60] */ 0x90205387, 0x1c424004, // ror ra0.8a, r1, ra8.8c ; v8min rb4, r0, rb5 +/* [0x00000f68] */ 0x914883f6, 0xd0031856, // shl r1, r1, 8 ; mov.ifn ra_wt_off_mul_l0, ra_wt_off_mul_l1 +/* [0x00000f70] */ 0x902203bf, 0x1e02581c, // ror r0, r1, ra8.8d ; mov ra_dest, unif +/* [0x00000f78] */ 0x90205387, 0x1c72404b, // ror ra1.8d, r1, ra8.8c ; v8min rb11, r0, rb5 +/* [0x00000f80] */ 0x10216f80, 0x1e7200a7, // ror ra2.8d, rb_y_coeffs_3, ra8.8d +/* [0x00000f88] */ 0x10216f80, 0x1c720027, // ror ra0.8d, rb_y_coeffs_3, ra8.8c +/* [0x00000f90] */ 0x10217f80, 0x1e5200e7, // ror ra3.8b, rb_y_coeffs_5, ra8.8d +/* [0x00000f98] */ 0x10217f80, 0x1c520067, // ror ra1.8b, rb_y_coeffs_5, ra8.8c +/* [0x00000fa0] */ 0x04040100, 0xe0020867, // mov r1,0x04040100 +/* [0x00000fa8] */ 0x10227380, 0x1e6200e7, // ror ra3.8c, r1, ra8.8d +/* [0x00000fb0] */ 0x902183bf, 0xdc624065, // ror ra1.8c, r1, ra8.8c ; mov r5rep, -8 +/* [0x00000fb8] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00000fc0] */ 0x3a281100, 0xe0020867, // mov r1,0x3a281100 +/* [0x00000fc8] */ 0x902203bf, 0x1e02581e, // ror r0, r1, ra8.8d ; mov ra_link, unif +/* [0x00000fd0] */ 0x90205387, 0x1c424048, // ror ra1.8a, r1, ra8.8c ; v8min rb8, r0, rb5 +// ::mc_filter_y_pxx +/* [0x00000fd8] */ 0xfffffe58, 0xf0f807a7, // brr ra_link, r:per_block_setup_8 +/* [0x00000fe0] */ 0x959a0ff6, 0x10024023, // mov ra0, unif ; mov r3, elem_num +/* [0x00000fe8] */ 0xec9c3fd2, 0x100269e5, // add.setf -, rb_ef, rb_ef ; v8subs r5rep, r2, r2 +/* [0x00000ff0] */ 0x8c001cff, 0x14024800, // add r0, ra0.16b, r3 ; mov rb_xshift2, rb_xshift2_next +/* [0x00000ff8] */ 0x1158cdc0, 0xd4020867, // shl r1, ra_wt_off_l0, i_wt_den_p5 +/* [0x00001000] */ 0x4c5a7cd6, 0x121245a0, // add ra_wt_mul_l0, ra_wt_mul_l0, r3 ; mul24 r0, r2, ra_wt_mul_l0 +/* [0x00001008] */ 0x8d9c423f, 0x1042531d, // sub rb_wt_off, r1, r0 ; mov ra_ef.8a, rb4 +// :1 +/* [0x00001010] */ 0x4c745dbe, 0x100279c4, // add.setf -, ra_ef, ra_ef ; mul24 ra4, rb5, ra_ef +/* [0x00001018] */ 0x93440dff, 0xd40248a1, // max r2, ra_y, 0 ; mov r1, 0 +/* [0x00001020] */ 0x9251e5f6, 0x1a0248a3, // min r2, r2, rb_max_y ; mov r3, ra_k1 +/* [0x00001028] */ 0x4c450cd7, 0xa4224462, // add ra_y, ra_y, r3 ; mul24 r2, r2, rb_pitch ; ldtmu0 +/* [0x00001030] */ 0x8c606cbf, 0x10024e05, // add t0s, ra_base, r2 ; mov rb5, rb6 +/* [0x00001038] */ 0x8e5479bf, 0x12024806, // shr r0, r4, ra_xshift ; mov rb6, rb7 +/* [0x00001040] */ 0x93458c47, 0xb20248a0, // max r2, ra_y2, r1 ; v8min r0, r0, rb_pmask ; ldtmu1 +/* [0x00001048] */ 0x8e2009f6, 0x10024847, // shr r1, r4, rb_xshift2 ; mov rb7, ra8 +/* [0x00001050] */ 0x925de5ce, 0x120248a1, // min r2, r2, rb_max_y ; v8min r1, r1, ra_pmax +/* [0x00001058] */ 0x4c450cd7, 0x12124462, // add ra_y2, ra_y2, r3 ; mul24 r2, r2, rb_pitch +/* [0x00001060] */ 0x8c24feb6, 0x10025f08, // add t1s, rb_base2, r2 ; mov ra8, ra9 +/* [0x00001068] */ 0x4c038af1, 0xd8025962, // add r5rep, r5, r3 ; mul24 r2, ra0.8a << 8, r1 << 8 @ "mul_used", 0 +/* [0x00001070] */ 0x5501fff0, 0x180348e2, // mov r3, rb_fir_off_h ; mul24.ifnn r2, ra0.8a, r0 +/* [0x00001078] */ 0x4d03f6b0, 0xda0248a3, // sub r2, r3, r2 ; mul24 r3, ra0.8b << 1, r0 << 1 @ "mul_used", 0 +/* [0x00001080] */ 0x40037031, 0xda0109e3, // nop ; mul24.ifn r3, ra0.8b << 9, r1 << 9 @ "mul_used", 0 +/* [0x00001088] */ 0x4c03e4f0, 0xdc0248a3, // add r2, r2, r3 ; mul24 r3, ra0.8c << 2, r0 << 2 @ "mul_used", 0 +/* [0x00001090] */ 0x40036031, 0xdc0109e3, // nop ; mul24.ifn r3, ra0.8c << 10, r1 << 10 @ "mul_used", 0 +/* [0x00001098] */ 0x4d03d4f0, 0xde0248a3, // sub r2, r2, r3 ; mul24 r3, ra0.8d << 3, r0 << 3 @ "mul_used", 0 +/* [0x000010a0] */ 0x40035031, 0xde0109e3, // nop ; mul24.ifn r3, ra0.8d << 11, r1 << 11 @ "mul_used", 0 +/* [0x000010a8] */ 0x4c07c4f0, 0xd80248a3, // add r2, r2, r3 ; mul24 r3, ra1.8a << 4, r0 << 4 @ "mul_used", 0 +/* [0x000010b0] */ 0x40074031, 0xd80109e3, // nop ; mul24.ifn r3, ra1.8a << 12, r1 << 12 @ "mul_used", 0 +/* [0x000010b8] */ 0x4c07b4f0, 0xda0248a3, // add r2, r2, r3 ; mul24 r3, ra1.8b << 5, r0 << 5 @ "mul_used", 0 +/* [0x000010c0] */ 0x40073031, 0xda0109e3, // nop ; mul24.ifn r3, ra1.8b << 13, r1 << 13 @ "mul_used", 0 +/* [0x000010c8] */ 0x4d07a4f0, 0xdc0248a3, // sub r2, r2, r3 ; mul24 r3, ra1.8c << 6, r0 << 6 @ "mul_used", 0 +/* [0x000010d0] */ 0x40072031, 0xdc0109e3, // nop ; mul24.ifn r3, ra1.8c << 14, r1 << 14 @ "mul_used", 0 +/* [0x000010d8] */ 0x4c0794f0, 0xde0248a3, // add r2, r2, r3 ; mul24 r3, ra1.8d << 7, r0 << 7 @ "mul_used", 0 +/* [0x000010e0] */ 0x4c071b71, 0xde0329e3, // add.setf -, r5, r5 ; mul24.ifn r3, ra1.8d << 15, r1 << 15 @ "mul_used", 0 +/* [0x000010e8] */ 0xffffff08, 0xf06809e7, // brr.anyn -, r:1b +/* [0x000010f0] */ 0x4d0854fe, 0x1a0248a1, // sub r2, r2, r3 ; mul24 r1, rb5, ra2.8b +/* [0x000010f8] */ 0x550caffe, 0x1a024260, // mov ra9, rb10 ; mul24 r0, rb10, ra3.8b +/* [0x00001100] */ 0x8f2c05f6, 0xd00242ca, // asr ra11, r2, v_bit_depth - 8 ; mov rb10, ra11 +/* [0x00001108] */ 0x4d08623e, 0x1c024860, // sub r1, r1, r0 ; mul24 r0, rb6, ra2.8c +/* [0x00001110] */ 0x4d08723e, 0x1e024860, // sub r1, r1, r0 ; mul24 r0, rb7, ra2.8d +/* [0x00001118] */ 0x4c208237, 0x10024860, // add r1, r1, r0 ; mul24 r0, ra8, rb8 +/* [0x00001120] */ 0x4c0ca23e, 0x1c024860, // add r1, r1, r0 ; mul24 r0, rb10, ra3.8c +/* [0x00001128] */ 0x4c2cb237, 0x10024860, // add r1, r1, r0 ; mul24 r0, ra11, rb11 +/* [0x00001130] */ 0x8d5d1bf6, 0x1c0269e3, // sub.setf -, r5, rb_i_tmu ; mov r3, ra_blk_height +/* [0x00001138] */ 0x8d1133bf, 0x1002884f, // sub r1, r1, ra4 ; mov.ifz rb_base2, rb_base2_next +/* [0x00001140] */ 0x8d6a7236, 0x10029858, // sub r1, r1, r0 ; mov.ifz ra_base, ra_base_next +/* [0x00001148] */ 0x8f4c63f6, 0xd0029851, // asr r1, r1, 6 ; mov.ifz ra_y_y2, ra_y_y2_next +/* [0x00001150] */ 0x4d592bce, 0x120269e0, // sub.setf -, r5, rb_lcount ; mul24 r0, r1, ra_wt_mul_l0 +/* [0x00001158] */ 0x4c64c1ce, 0x14024821, // add r0, r0, rb_wt_off ; mul24 r1, r1, ra_kmul_add +/* [0x00001160] */ 0xed427073, 0x12024860, // sub r1, r0, r1 ; v8subs r0, ra_height, r3 +/* [0x00001168] */ 0xfffffe88, 0xf06809e7, // brr.anyn -, r:1b +/* [0x00001170] */ 0x0f9cd3c0, 0xd0020867, // asr r1, r1, i_wt_den_p6 +/* [0x00001178] */ 0x925f23bf, 0x12020867, // min r1, r1, ra_pmax ; mov -, vw_wait +/* [0x00001180] */ 0x5351039f, 0x18024c22, // max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch +/* [0x00001188] */ 0x956e7036, 0x10126431, // mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 +/* [0x00001190] */ 0x00000000, 0xf027c9e7, // bra.anyz -, ra_link +/* [0x00001198] */ 0x929dd0ff, 0x10024831, // min r0, r0, r3 ; mov vw_setup, rb_dma1 +/* [0x000011a0] */ 0x8d7270f6, 0x10024872, // sub r1, r0, r3 ; mov vw_addr, ra_dest +/* [0x000011a8] */ 0x119d73c0, 0xd0020867, // shl r1, r1, i_shift23 +/* [0x000011b0] */ 0xfffffe40, 0xf0f809e7, // brr -, r:1b +/* [0x000011b8] */ 0x0c9d2e00, 0x100214a7, // add rb_lcount, rb_lcount, r0 +/* [0x000011c0] */ 0x0c6e7c40, 0x100206e7, // add ra_dma0, ra_dma0, r1 +/* [0x000011c8] */ 0x8c71ccbf, 0x10024731, // add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init +// ::mc_filter_y_bxx +/* [0x000011d0] */ 0xfffffc60, 0xf0f807a7, // brr ra_link, r:per_block_setup_8 +/* [0x000011d8] */ 0x959a0ff6, 0x10024023, // mov ra0, unif ; mov r3, elem_num +/* [0x000011e0] */ 0xec9c3fd2, 0x100269e5, // add.setf -, rb_ef, rb_ef ; v8subs r5rep, r2, r2 +/* [0x000011e8] */ 0x8c001cff, 0x14024800, // add r0, ra0.16b, r3 ; mov rb_xshift2, rb_xshift2_next +/* [0x000011f0] */ 0x1158ddc0, 0xd4020867, // shl r1, ra_wt_off_l0, i_wt_den_p6 +/* [0x000011f8] */ 0x4c5a7cd6, 0x121245a0, // add ra_wt_mul_l0, ra_wt_mul_l0, r3 ; mul24 r0, r2, ra_wt_mul_l0 +/* [0x00001200] */ 0x4d4a7216, 0x12024860, // sub r1, r1, r0 ; mul24 r0, r2, ra_wt_mul_l1 +/* [0x00001208] */ 0x8d9c423f, 0x1042531d, // sub rb_wt_off, r1, r0 ; mov ra_ef.8a, rb4 +// :1 +/* [0x00001210] */ 0x4c745dbe, 0x100279c4, // add.setf -, ra_ef, ra_ef ; mul24 ra4, rb5, ra_ef +/* [0x00001218] */ 0x93440dff, 0xd40248a1, // max r2, ra_y, 0 ; mov r1, 0 +/* [0x00001220] */ 0x9251e5f6, 0x1a0248a3, // min r2, r2, rb_max_y ; mov r3, ra_k1 +/* [0x00001228] */ 0x4c450cd7, 0xa4224462, // add ra_y, ra_y, r3 ; mul24 r2, r2, rb_pitch ; ldtmu0 +/* [0x00001230] */ 0x8c606cbf, 0x10024e05, // add t0s, ra_base, r2 ; mov rb5, rb6 +/* [0x00001238] */ 0x8e5479bf, 0x12024806, // shr r0, r4, ra_xshift ; mov rb6, rb7 +/* [0x00001240] */ 0x93458c47, 0xb20248a0, // max r2, ra_y2, r1 ; v8min r0, r0, rb_pmask ; ldtmu1 +/* [0x00001248] */ 0x8e2009f6, 0x10024847, // shr r1, r4, rb_xshift2 ; mov rb7, ra8 +/* [0x00001250] */ 0x925de5ce, 0x120248a1, // min r2, r2, rb_max_y ; v8min r1, r1, ra_pmax +/* [0x00001258] */ 0x4c450cd7, 0x12124462, // add ra_y2, ra_y2, r3 ; mul24 r2, r2, rb_pitch +/* [0x00001260] */ 0x8c24feb6, 0x10025f08, // add t1s, rb_base2, r2 ; mov ra8, ra9 +/* [0x00001268] */ 0x4c038af1, 0xd8025962, // add r5rep, r5, r3 ; mul24 r2, ra0.8a << 8, r1 << 8 @ "mul_used", 0 +/* [0x00001270] */ 0x5501fff0, 0x180348e2, // mov r3, rb_fir_off_h ; mul24.ifnn r2, ra0.8a, r0 +/* [0x00001278] */ 0x4d03f6b0, 0xda0248a3, // sub r2, r3, r2 ; mul24 r3, ra0.8b << 1, r0 << 1 @ "mul_used", 0 +/* [0x00001280] */ 0x40037031, 0xda0109e3, // nop ; mul24.ifn r3, ra0.8b << 9, r1 << 9 @ "mul_used", 0 +/* [0x00001288] */ 0x4c03e4f0, 0xdc0248a3, // add r2, r2, r3 ; mul24 r3, ra0.8c << 2, r0 << 2 @ "mul_used", 0 +/* [0x00001290] */ 0x40036031, 0xdc0109e3, // nop ; mul24.ifn r3, ra0.8c << 10, r1 << 10 @ "mul_used", 0 +/* [0x00001298] */ 0x4d03d4f0, 0xde0248a3, // sub r2, r2, r3 ; mul24 r3, ra0.8d << 3, r0 << 3 @ "mul_used", 0 +/* [0x000012a0] */ 0x40035031, 0xde0109e3, // nop ; mul24.ifn r3, ra0.8d << 11, r1 << 11 @ "mul_used", 0 +/* [0x000012a8] */ 0x4c07c4f0, 0xd80248a3, // add r2, r2, r3 ; mul24 r3, ra1.8a << 4, r0 << 4 @ "mul_used", 0 +/* [0x000012b0] */ 0x40074031, 0xd80109e3, // nop ; mul24.ifn r3, ra1.8a << 12, r1 << 12 @ "mul_used", 0 +/* [0x000012b8] */ 0x4c07b4f0, 0xda0248a3, // add r2, r2, r3 ; mul24 r3, ra1.8b << 5, r0 << 5 @ "mul_used", 0 +/* [0x000012c0] */ 0x40073031, 0xda0109e3, // nop ; mul24.ifn r3, ra1.8b << 13, r1 << 13 @ "mul_used", 0 +/* [0x000012c8] */ 0x4d07a4f0, 0xdc0248a3, // sub r2, r2, r3 ; mul24 r3, ra1.8c << 6, r0 << 6 @ "mul_used", 0 +/* [0x000012d0] */ 0x40072031, 0xdc0109e3, // nop ; mul24.ifn r3, ra1.8c << 14, r1 << 14 @ "mul_used", 0 +/* [0x000012d8] */ 0x4c0794f0, 0xde0248a3, // add r2, r2, r3 ; mul24 r3, ra1.8d << 7, r0 << 7 @ "mul_used", 0 +/* [0x000012e0] */ 0x4c071b71, 0xde0329e3, // add.setf -, r5, r5 ; mul24.ifn r3, ra1.8d << 15, r1 << 15 @ "mul_used", 0 +/* [0x000012e8] */ 0xffffff08, 0xf06809e7, // brr.anyn -, r:1b +/* [0x000012f0] */ 0x4d0854fe, 0x1a0248a1, // sub r2, r2, r3 ; mul24 r1, rb5, ra2.8b +/* [0x000012f8] */ 0x550caffe, 0x1a024260, // mov ra9, rb10 ; mul24 r0, rb10, ra3.8b +/* [0x00001300] */ 0x8f2c05f6, 0xd00242ca, // asr ra11, r2, v_bit_depth - 8 ; mov rb10, ra11 +/* [0x00001308] */ 0x4d08623e, 0x1c024860, // sub r1, r1, r0 ; mul24 r0, rb6, ra2.8c +/* [0x00001310] */ 0x4d08723e, 0x1e024860, // sub r1, r1, r0 ; mul24 r0, rb7, ra2.8d +/* [0x00001318] */ 0x4c208237, 0x10024860, // add r1, r1, r0 ; mul24 r0, ra8, rb8 +/* [0x00001320] */ 0x4c0ca23e, 0x1c024860, // add r1, r1, r0 ; mul24 r0, rb10, ra3.8c +/* [0x00001328] */ 0x4c2cb237, 0x10024860, // add r1, r1, r0 ; mul24 r0, ra11, rb11 +/* [0x00001330] */ 0x0d127380, 0x10020867, // sub r1, r1, ra4 +/* [0x00001338] */ 0x8d9cc23f, 0x10024862, // sub r1, r1, r0 ; mov r2, rb_wt_off +/* [0x00001340] */ 0x0f9c63c0, 0xd0020867, // asr r1, r1, 6 +/* [0x00001348] */ 0x4d591bce, 0x120269e0, // sub.setf -, r5, rb_i_tmu ; mul24 r0, r1, ra_wt_mul_l0 +/* [0x00001350] */ 0x55653fce, 0x140453e1, // mov.ifz rb_base2, rb_base2_next ; mul24 r1, r1, ra_kmul_add +/* [0x00001358] */ 0x8d4e7076, 0x10029851, // sub r1, r0, r1 ; mov.ifz ra_y_y2, ra_y_y2_next +/* [0x00001360] */ 0x8d692bf6, 0x1002b9d8, // sub.setf -, r5, rb_lcount ; mov.ifz ra_base, ra_base_next +/* [0x00001368] */ 0x8c9f8289, 0xd0024860, // add r1, r1, r2 ; mov r0, r1 << 8 +/* [0x00001370] */ 0x8c5e7236, 0x1c024863, // add r1, r1, r0 ; mov r3, ra_blk_height +/* [0x00001378] */ 0xfffffe78, 0xf06809e7, // brr.anyn -, r:1b +/* [0x00001380] */ 0x4f65039f, 0x18024862, // asr r1, r1, ra_wt_den_p7 ; mul24 r2, r3, rb_pitch +/* [0x00001388] */ 0x925f23bf, 0x12020867, // min r1, r1, ra_pmax ; mov -, vw_wait +/* [0x00001390] */ 0xf34003f3, 0xd2024c20, // max vpm, r1, 0 ; v8subs r0, ra_height, r3 +/* [0x00001398] */ 0x956e7036, 0x10126431, // mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 +/* [0x000013a0] */ 0x00000000, 0xf027c9e7, // bra.anyz -, ra_link +/* [0x000013a8] */ 0x929dd0ff, 0x10024831, // min r0, r0, r3 ; mov vw_setup, rb_dma1 +/* [0x000013b0] */ 0x8d7270f6, 0x10024872, // sub r1, r0, r3 ; mov vw_addr, ra_dest +/* [0x000013b8] */ 0x119d73c0, 0xd0020867, // shl r1, r1, i_shift23 +/* [0x000013c0] */ 0xfffffe30, 0xf0f809e7, // brr -, r:1b +/* [0x000013c8] */ 0x0c9d2e00, 0x100214a7, // add rb_lcount, rb_lcount, r0 +/* [0x000013d0] */ 0x0c6e7c40, 0x100206e7, // add ra_dma0, ra_dma0, r1 +/* [0x000013d8] */ 0x8c71ccbf, 0x10024731, // add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init +// ::mc_filter_y_p00 +/* [0x000013e0] */ 0x959a0ff6, 0x10024020, // mov ra0, unif ; mov r0, elem_num +/* [0x000013e8] */ 0xf5567dad, 0x14124565, // mov ra_xshift, ra_xshift_next ; v8subs r5rep, r5, r5 +/* [0x000013f0] */ 0x8c020c3f, 0x1402581a, // add r0, ra0.16b, r0 ; mov ra_base_next, unif +/* [0x000013f8] */ 0x93027176, 0x12225813, // max r0, r0, r5 ; mov ra_y_next, ra0.16a +/* [0x00001400] */ 0x9281a1f6, 0x10025810, // min r0, r0, rb_max_x ; mov ra_width_height, unif +/* [0x00001408] */ 0x119c31c0, 0xd0220567, // shl ra_xshift_next, r0, 3 +/* [0x00001410] */ 0x149dc1c0, 0xd0020827, // and r0, r0, -4 +/* [0x00001418] */ 0x8d810bf6, 0x10025896, // sub r2, r5, rb_pitch ; mov ra_wt_off_mul_l0, unif +/* [0x00001420] */ 0x149e7080, 0x10020867, // and r1, r0, r2 +/* [0x00001428] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00001430] */ 0x8c827076, 0x1002581c, // add r0, r0, r1 ; mov ra_dest, unif +/* [0x00001438] */ 0x8c69cc3f, 0x100246b1, // add ra_base_next, ra_base_next, r0 ; mov vw_setup, rb_vpm_init +/* [0x00001440] */ 0x11400dc0, 0xd4020867, // shl r1, ra_width, v_x_shift +/* [0x00001448] */ 0x8d419e76, 0x12025760, // sub rb_dma1, rb_dma1_base, r1 ; mov r0, ra_height +/* [0x00001450] */ 0x8d5c31c6, 0xdc025460, // sub rb_i_tmu, r0, PREREAD ; v8min r0, r0, ra_blk_height +/* [0x00001458] */ 0x919c71c0, 0xd0024812, // shl r0, r0, v_dma_h_shift ; mov rb_lcount, r0 +/* [0x00001460] */ 0x0c9e7040, 0x10020827, // add r0, r0, r1 +/* [0x00001468] */ 0x1158edc0, 0xd4021327, // shl rb_wt_off, ra_wt_off_l0, DENOM + 7 +/* [0x00001470] */ 0x918101f6, 0xd002581e, // shl r0, r0, v_dma_wh_shift ; mov ra_link, unif +/* [0x00001478] */ 0x0c9db1c0, 0x100206e7, // add ra_dma0, r0, rb_dma0_base +// :1 +/* [0x00001480] */ 0xcd511bee, 0x1a0269e5, // sub.setf -, r5, rb_i_tmu ; v8adds r5rep, r5, ra_k1 +/* [0x00001488] */ 0x804e7036, 0xa42099d1, // nop ; mov.ifz ra_y, ra_y_next ; ldtmu0 +/* [0x00001490] */ 0x8e5509bf, 0x12024823, // shr r0, r4, ra_xshift ; mov r3, rb_pitch +/* [0x00001498] */ 0x13440dc0, 0xd40208a7, // max r2, ra_y, 0 +/* [0x000014a0] */ 0x9269e5f6, 0x10029898, // min r2, r2, rb_max_y ; mov.ifz ra_base, ra_base_next +/* [0x000014a8] */ 0x4c441dd3, 0xd4224462, // add ra_y, ra_y, 1 ; mul24 r2, r2, r3 +/* [0x000014b0] */ 0x8c618c87, 0x10024e20, // add t0s, ra_base, r2 ; v8min r0, r0, rb_pmask +/* [0x000014b8] */ 0x4d592bc6, 0x120269e1, // sub.setf -, r5, rb_lcount ; mul24 r1, r0, ra_wt_mul_l0 +/* [0x000014c0] */ 0x915c83f6, 0xdc024863, // shl r1, r1, 8 ; mov r3, ra_blk_height +/* [0x000014c8] */ 0xec40c3f3, 0x12024860, // add r1, r1, rb_wt_off ; v8subs r0, ra_height, r3 +/* [0x000014d0] */ 0xffffff90, 0xf06809e7, // brr.anyn -, r:1b +/* [0x000014d8] */ 0x0f9cf3c0, 0xd0020867, // asr r1, r1, DENOM + 8 +/* [0x000014e0] */ 0x925f23bf, 0x12020867, // min r1, r1, ra_pmax ; mov -, vw_wait +/* [0x000014e8] */ 0x5351039f, 0x18024c22, // max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch +/* [0x000014f0] */ 0x956e7036, 0x10126431, // mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 +/* [0x000014f8] */ 0x00000000, 0xf027c9e7, // bra.anyz -, ra_link +/* [0x00001500] */ 0x929dd0ff, 0x10024831, // min r0, r0, r3 ; mov vw_setup, rb_dma1 +/* [0x00001508] */ 0x8d7270f6, 0x10024872, // sub r1, r0, r3 ; mov vw_addr, ra_dest +/* [0x00001510] */ 0x119d73c0, 0xd0020867, // shl r1, r1, i_shift23 +/* [0x00001518] */ 0xffffff48, 0xf0f809e7, // brr -, r:1b +/* [0x00001520] */ 0x0c9d2e00, 0x100214a7, // add rb_lcount, rb_lcount, r0 +/* [0x00001528] */ 0x0c6e7c40, 0x100206e7, // add ra_dma0, ra_dma0, r1 +/* [0x00001530] */ 0x8c71ccbf, 0x10024731, // add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init +// ::mc_filter_y_b00 +/* [0x00001538] */ 0xfffff8f8, 0xf0f807a7, // brr ra_link, r:per_block_setup_8 +/* [0x00001540] */ 0x959a0ff6, 0x10024023, // mov ra0, unif ; mov r3, elem_num +/* [0x00001548] */ 0xec9c3fd2, 0x100269e5, // add.setf -, rb_ef, rb_ef ; v8subs r5rep, r2, r2 +/* [0x00001550] */ 0x8c001cff, 0x14024800, // add r0, ra0.16b, r3 ; mov rb_xshift2, rb_xshift2_next +/* [0x00001558] */ 0x00000001, 0xe00208a7, // mov r2, 1 +/* [0x00001560] */ 0x8c591eb6, 0x10025461, // add rb_i_tmu, rb_i_tmu, r2 ; mov r1, ra_wt_off_mul_l0 +/* [0x00001568] */ 0xf158fded, 0xd4025325, // shl rb_wt_off, ra_wt_off_l0, DENOM + 8 ; v8subs r5quad, r5, r5 +/* [0x00001570] */ 0x809f8009, 0xd000d9d6, // nop ; mov.ifnz ra_wt_off_mul_l0, r1 << 8 +// :1 +/* [0x00001578] */ 0x0d9d1bc0, 0xb00229e7, // sub.setf -, r5, rb_i_tmu ; nop ; ldtmu1 +/* [0x00001580] */ 0x8e4c09f6, 0xa0029851, // shr r1, r4, rb_xshift2 ; mov.ifz ra_y_y2, ra_y_y2_next ; ldtmu0 +/* [0x00001588] */ 0x8e5509bf, 0x12024823, // shr r0, r4, ra_xshift ; mov r3, rb_pitch +/* [0x00001590] */ 0x13440dc0, 0xd40208a7, // max r2, ra_y, 0 +/* [0x00001598] */ 0x9269e5f6, 0x10029898, // min r2, r2, rb_max_y ; mov.ifz ra_base, ra_base_next +/* [0x000015a0] */ 0x4c441dd3, 0xd4224462, // add ra_y, ra_y, 1 ; mul24 r2, r2, r3 +/* [0x000015a8] */ 0x8c613cbf, 0x10028e0f, // add t0s, ra_base, r2 ; mov.ifz rb_base2, rb_base2_next +/* [0x000015b0] */ 0x13440dc0, 0xd20208a7, // max r2, ra_y2, 0 +/* [0x000015b8] */ 0x129de5c0, 0x100208a7, // min r2, r2, rb_max_y +/* [0x000015c0] */ 0x4c441dd3, 0xd2124462, // add ra_y2, ra_y2, 1 ; mul24 r2, r2, r3 +/* [0x000015c8] */ 0x8c5cfe86, 0x12024f20, // add t1s, rb_base2, r2 ; v8min r0, r0, ra_pmax +/* [0x000015d0] */ 0x545983c6, 0x12024860, // and r1, r1, rb_pmask ; mul24 r0, r0, ra_wt_mul_l0 +/* [0x000015d8] */ 0x4d492bce, 0x120269e1, // sub.setf -, r5, rb_lcount ; mul24 r1, r1, ra_wt_mul_l1 +/* [0x000015e0] */ 0xcc52706e, 0x1a024865, // add r1, r0, r1 ; v8adds r5rep, r5, ra_k1 +/* [0x000015e8] */ 0x915c83f6, 0xdc024863, // shl r1, r1, 8 ; mov r3, ra_blk_height +/* [0x000015f0] */ 0xec40c3f3, 0x12024860, // add r1, r1, rb_wt_off ; v8subs r0, ra_height, r3 +/* [0x000015f8] */ 0xffffff60, 0xf06809e7, // brr.anyn -, r:1b +/* [0x00001600] */ 0x0f9d03c0, 0xd0020867, // asr r1, r1, (DENOM + 9) - 32 +/* [0x00001608] */ 0x925f23bf, 0x12020867, // min r1, r1, ra_pmax ; mov -, vw_wait +/* [0x00001610] */ 0x5351039f, 0x18024c22, // max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch +/* [0x00001618] */ 0x956e7036, 0x10126431, // mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 +/* [0x00001620] */ 0x00000000, 0xf027c9e7, // bra.anyz -, ra_link +/* [0x00001628] */ 0x929dd0ff, 0x10024831, // min r0, r0, r3 ; mov vw_setup, rb_dma1 +/* [0x00001630] */ 0x8d7270f6, 0x10024872, // sub r1, r0, r3 ; mov vw_addr, ra_dest +/* [0x00001638] */ 0x119d73c0, 0xd0020867, // shl r1, r1, i_shift23 +/* [0x00001640] */ 0xffffff18, 0xf0f809e7, // brr -, r:1b +/* [0x00001648] */ 0x0c9d2e00, 0x100214a7, // add rb_lcount, rb_lcount, r0 +/* [0x00001650] */ 0x0c6e7c40, 0x100206e7, // add ra_dma0, ra_dma0, r1 +/* [0x00001658] */ 0x8c71ccbf, 0x10024731, // add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init +// ::mc_setup_c10_q0 +/* [0x00001660] */ 0x0000000c, 0xe80009e7, // mov dst, srel(i) +// ::mc_setup_c10_qn +/* [0x00001668] */ 0x95801ff6, 0xd0025900, // mov tmurs, 1 ; mov ra0, unif +/* [0x00001670] */ 0xaaaaff00, 0xe6020827, // mov r0, [0,2,0,2,0,2,0,2,1,3,1,3,1,3,1,3] +/* [0x00001678] */ 0x9181e1f6, 0xd00250d8, // shl rb_ef, r0, i_shift30 ; mov ra_base, unif +/* [0x00001680] */ 0x0d801dc0, 0xd0020827, // sub r0, unif, 1 +/* [0x00001688] */ 0x119c21c0, 0xd00216a7, // shl rb_max_x, r0, v_x_shift +/* [0x00001690] */ 0x0d801dc0, 0xd00217a7, // sub rb_max_y, unif, 1 +/* [0x00001698] */ 0xff800100, 0xe0020527, // mov ra_kff800100, 0xff800100 +/* [0x000016a0] */ 0x0000ffff, 0xe0021627, // mov rb_pmask, v_pmask +/* [0x000016a8] */ 0x000803ff, 0xe00205e7, // mov ra_blk_height_pmax, ((1 << v_bit_depth) - 1) | (v_blk_height << 16) +/* [0x000016b0] */ 0x00010000, 0xe00217e7, // mov rb_fir_off_h, (FIR_OFFSET << (v_bit_depth - 8)) +/* [0x000016b8] */ 0x4000000c, 0xe0020667, // mov ra_fir_off_val_wt_den_p7, (FIR_OFFSET << 16) | (DENOM + 15 - v_bit_depth) +/* [0x000016c0] */ 0x95803ff6, 0x10024754, // mov ra_ef, rb_ef ; mov rb_xpitch, unif +/* [0x000016c8] */ 0x15827d80, 0x10021427, // mov rb_pitch, unif +/* [0x000016d0] */ 0xc0000000, 0xe0020867, // mov r1, vdw_setup_1(0) +/* [0x000016d8] */ 0x0c9d03c0, 0x10021667, // add rb_dma1_base, r1, rb_pitch +/* [0x000016e0] */ 0x14981f80, 0xd0020827, // and r0, 1, elem_num +/* [0x000016e8] */ 0x409c5007, 0xd00049e0, // nop ; mul24 r0, r0, 5 +/* [0x000016f0] */ 0x0c9a7180, 0x10020827, // add r0, r0, elem_num +/* [0x000016f8] */ 0x0c9e7000, 0x100210a7, // add rb_elem_x, r0, r0 +/* [0x00001700] */ 0x11002dc0, 0xd4020827, // shl r0, ra0.16b, v_x_shift +/* [0x00001708] */ 0x0c9c21c0, 0x10020827, // add r0, r0, rb_elem_x +/* [0x00001710] */ 0x930001f6, 0xd2225811, // max r0, r0, 0 ; mov ra_y, ra0.16a +/* [0x00001718] */ 0x129da1c0, 0x10020827, // min r0, r0, rb_max_x +/* [0x00001720] */ 0x00000000, 0xe0224541, // mov ra_xshift_next, 0 ; mov rb_xshift2_next, 0 +/* [0x00001728] */ 0x0d510dc0, 0x18020867, // sub r1, ra_k0, rb_pitch +/* [0x00001730] */ 0x149e7040, 0x10020867, // and r1, r0, r1 +/* [0x00001738] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00001740] */ 0x8c827076, 0x10025800, // add r0, r0, r1 ; mov ra0, unif +/* [0x00001748] */ 0x0c627c00, 0x10020627, // add ra_base, ra_base, r0 +/* [0x00001750] */ 0x159e6fc0, 0x100208a7, // mov r2, qpu_num +/* [0x00001758] */ 0x0f9c15c0, 0xd0020867, // asr r1, r2, 1 +/* [0x00001760] */ 0x119c43c0, 0xd0020867, // shl r1, r1, 4 +/* [0x00001768] */ 0x149c15c0, 0xd0020827, // and r0, r2, 1 +/* [0x00001770] */ 0x159e7040, 0x10020827, // or r0, r0, r1 +/* [0x00001778] */ 0x00002900, 0xe0020867, // mov r1, vpm_setup(0, 2, h16p(0, 0)) +/* [0x00001780] */ 0x0c9e7040, 0x10021727, // add r_vpm, r0, r1 +/* [0x00001788] */ 0x80004002, 0xe0020867, // mov r1, vdw_setup_0(0, 0, dma_h16p(0,0,0)) +/* [0x00001790] */ 0x119c61c0, 0xd0020827, // shl r0, r0, 6 +/* [0x00001798] */ 0x0c9e7040, 0x100216e7, // add r_dma, r0, r1 +/* [0x000017a0] */ 0x11002dc0, 0xd4020827, // shl r0, ra0.16b, v_x_shift +/* [0x000017a8] */ 0x8c0021f6, 0x12125811, // add r0, r0, rb_elem_x ; mov ra_y2, ra0.16a +/* [0x000017b0] */ 0x938001f6, 0xd002480f, // max r0, r0, 0 ; mov rb_base2, unif +/* [0x000017b8] */ 0x129da1c0, 0x10020827, // min r0, r0, rb_max_x +/* [0x000017c0] */ 0x0d510dc0, 0x18020867, // sub r1, ra_k0, rb_pitch +/* [0x000017c8] */ 0x949c307f, 0xd0024863, // and r1, r0, r1 ; mov r3, PREREAD +/* [0x000017d0] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x000017d8] */ 0x8c467076, 0x12024822, // add r0, r0, r1 ; mov r2, ra_y2 +/* [0x000017e0] */ 0x8c44fe36, 0x140253e0, // add rb_base2, rb_base2, r0 ; mov r0, ra_y +// :1 +/* [0x000017e8] */ 0x0d9c17c0, 0xd00228e7, // sub.setf r3, r3, 1 +/* [0x000017f0] */ 0x139c01c0, 0xd0020867, // max r1, r0, 0 +/* [0x000017f8] */ 0x129de3c0, 0x10020867, // min r1, r1, rb_max_y +/* [0x00001800] */ 0x4c51018f, 0x1a024821, // add r0, r0, ra_k1 ; mul24 r1, r1, rb_pitch +/* [0x00001808] */ 0x8c627c40, 0x10225e11, // add t0s, ra_base, r1 ; mov ra_y, r0 +/* [0x00001810] */ 0x139c05c0, 0xd0020867, // max r1, r2, 0 +/* [0x00001818] */ 0xffffffb0, 0xf03809e7, // brr.anynz -, r:1b +/* [0x00001820] */ 0x129de3c0, 0x10020867, // min r1, r1, rb_max_y +/* [0x00001828] */ 0x4c51058f, 0x1a0248a1, // add r2, r2, ra_k1 ; mul24 r1, r1, rb_pitch +/* [0x00001830] */ 0x8c9cfe52, 0x10125f11, // add t1s, rb_base2, r1 ; mov ra_y2, r2 +/* [0x00001838] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00001840] */ 0x00000000, 0xe0024104, // mov ra4, 0 ; mov rb4, 0 +/* [0x00001848] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00001850] */ 0x00000000, 0xe0024145, // mov ra5, 0 ; mov rb5, 0 +/* [0x00001858] */ 0x00000000, 0xe0024186, // mov ra6, 0 ; mov rb6, 0 +/* [0x00001860] */ 0x00000000, 0xe00241c7, // mov ra7, 0 ; mov rb7, 0 +// ::mc_filter_c10_p +/* [0x00001868] */ 0x9581cff6, 0x10025c42, // mov vw_setup, rb_vpm_init ; mov ra2, unif +/* [0x00001870] */ 0x8c803ff6, 0x100269e3, // add.setf -, rb_ef, rb_ef ; mov r3, unif +/* [0x00001878] */ 0xf1082dc0, 0xd4024825, // shl r0, ra2.16b, v_x_shift ; v8subs r5rep, r0, r0 +/* [0x00001880] */ 0x8c8021f6, 0x10025810, // add r0, r0, rb_elem_x ; mov ra_width_height, unif +/* [0x00001888] */ 0x8d810bf6, 0x10025840, // sub r1, r5, rb_pitch ; mov ra0, unif +/* [0x00001890] */ 0x93567176, 0x14024800, // max r0, r0, r5 ; mov vrx_xshift, vrx_xshift_next +/* [0x00001898] */ 0x9209a1f6, 0x12225813, // min r0, r0, rb_max_x ; mov vra_y_next, ra2.16a +/* [0x000018a0] */ 0x54404077, 0xd4024862, // and r1, r0, r1 ; mul24 r2, ra_width, v_x_mul +/* [0x000018a8] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x000018b0] */ 0x8c827076, 0x10025803, // add r0, r0, r1 ; mov ra3, unif +/* [0x000018b8] */ 0x8c427636, 0x120246a1, // add vrx_base_next, r3, r0 ; mov r1, ra_height +/* [0x000018c0] */ 0x8d819eb6, 0x10025756, // sub rb_dma1, rb_dma1_base, r2 ; mov ra_wt_off_mul_l0, unif +/* [0x000018c8] */ 0x8c5dc3ce, 0xdc025461, // add rb_i_tmu, r1, (3-4) - PREREAD ; v8min r1, r1, ra_blk_height +/* [0x000018d0] */ 0x8c81f3f6, 0xd0039496, // add rb_lcount, r1, (3-4) ; mov.ifc ra_wt_off_mul_l0, unif +/* [0x000018d8] */ 0x918083f6, 0xd002581c, // shl r0, r1, v_dma_h_shift ; mov ra_dest, unif +/* [0x000018e0] */ 0x8c6670b6, 0x14024822, // add r0, r0, r2 ; mov r2, ra_fir_off_val +/* [0x000018e8] */ 0x910cf1f6, 0xdc02480a, // shl r0, r0, v_dma_wh_shift ; mov rb10, ra3.8c +/* [0x000018f0] */ 0x8c59b1f6, 0x140246e1, // add ra_dma0, r0, rb_dma0_base ; mov r1, ra_wt_off_l0 +/* [0x000018f8] */ 0x5158a3d6, 0xd2024860, // shl r1, r1, i_wt_den_p5 ; mul24 r0, r2, ra_wt_mul_l0 +/* [0x00001900] */ 0x8d667236, 0x14025320, // sub rb_wt_off, r1, r0 ; mov r0, ra_kmul_add +/* [0x00001908] */ 0x8c59cc3f, 0xd21245a5, // add ra_wt_mul_l0, ra_wt_mul_l0, r0 ; mov r5rep, -4 +/* [0x00001910] */ 0x950e0dbf, 0x1e0252de, // mov rb11, ra3.8d ; mov ra_link, unif +// :1 +/* [0x00001918] */ 0x8d151bf6, 0xa00269c4, // sub.setf -, r5, rb_i_tmu ; mov rb4, ra5 ; ldtmu0 +/* [0x00001920] */ 0x8e4c09f6, 0x140288a3, // shr r2, r4, vrx_xshift ; mov.ifz r3, vra_y_next +/* [0x00001928] */ 0x8e4505f6, 0xd402c863, // shr r1, r2, v_v_shift ; mov.ifnz r3, vra_y +/* [0x00001930] */ 0x8c683ff6, 0x1002b9d8, // add.setf -, rb_ef, rb_ef ; mov.ifz vra_base, vrx_base_next +/* [0x00001938] */ 0x8c531789, 0xda224460, // add vra_y, r3, ra_k1 ; mov r0, r1 << 15 +/* [0x00001940] */ 0x9353f792, 0xd803c8e1, // max r3, r3, ra_k0 ; mov.ifnc r1, r2 << 1 +/* [0x00001948] */ 0x929de7d2, 0x1003c8e0, // min r3, r3, rb_max_y ; mov.ifnc r0, r2 +/* [0x00001950] */ 0x545d039f, 0x12024863, // and r1, r1, ra_pmax ; mul24 r3, r3, rb_pitch +/* [0x00001958] */ 0x8c618cc7, 0x10024e20, // add vr_txs, vra_base, r3 ; v8min r0, r0, rb_pmask +/* [0x00001960] */ 0x4c001bf0, 0xd8025963, // add r5rep, r5, 1 ; mul24 r3, ra0.8a, r0 +/* [0x00001968] */ 0x4d01fef1, 0x1e0248a3, // sub r2, rb_fir_off_h, r3 ; mul24 r3, ra0.8d, r1 +/* [0x00001970] */ 0x4d03e4f0, 0xda0248a3, // sub r2, r2, r3 ; mul24 r3, ra0.8b << 2, r0 << 2 @ "mul_used", 0 +/* [0x00001978] */ 0x40034031, 0xda0109e3, // nop ; mul24.ifn r3, ra0.8b << 12, r1 << 12 @ "mul_used", 0 +/* [0x00001980] */ 0x4c03c4f0, 0xdc0248a3, // add r2, r2, r3 ; mul24 r3, ra0.8c << 4, r0 << 4 @ "mul_used", 0 +/* [0x00001988] */ 0x4c032b71, 0xdc0329e3, // add.setf -, r5, r5 ; mul24.ifn r3, ra0.8c << 14, r1 << 14 @ "mul_used", 0 +/* [0x00001990] */ 0xffffff68, 0xf06809e7, // brr.anyn -, r:1b +/* [0x00001998] */ 0x4c1ca4f7, 0x100248a0, // add r2, r2, r3 ; mul24 r0, ra7, rb10 +/* [0x000019a0] */ 0x550c6ffe, 0x1a024161, // mov ra5, rb6 ; mul24 r1, rb6, ra3.8b +/* [0x000019a8] */ 0x8f1c25f6, 0xd00241c6, // asr ra7, r2, v_bit_depth - 8 ; mov rb6, ra7 +/* [0x000019b0] */ 0x4c0c423e, 0x18024860, // add r1, r1, r0 ; mul24 r0, rb4, ra3.8a +/* [0x000019b8] */ 0x4d1cb237, 0x10024860, // sub r1, r1, r0 ; mul24 r0, ra7, rb11 +/* [0x000019c0] */ 0x0d9e7200, 0x10020867, // sub r1, r1, r0 +/* [0x000019c8] */ 0x8f5c63f6, 0xdc024863, // asr r1, r1, 6 ; mov r3, ra_blk_height +/* [0x000019d0] */ 0x4d592bce, 0x120269e0, // sub.setf -, r5, rb_lcount ; mul24 r0, r1, ra_wt_mul_l0 +/* [0x000019d8] */ 0x4c64c1ce, 0x14024821, // add r0, r0, rb_wt_off ; mul24 r1, r1, ra_kmul_add +/* [0x000019e0] */ 0xed427073, 0x12024860, // sub r1, r0, r1 ; v8subs r0, ra_height, r3 +/* [0x000019e8] */ 0xffffff10, 0xf06809e7, // brr.anyn -, r:1b +/* [0x000019f0] */ 0x0f9cb3c0, 0xd0020867, // asr r1, r1, i_wt_den_p6 +/* [0x000019f8] */ 0x925f23bf, 0x12020867, // min r1, r1, ra_pmax ; mov -, vw_wait +/* [0x00001a00] */ 0x5351039f, 0x18024c22, // max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch +/* [0x00001a08] */ 0x956e7036, 0x10126431, // mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 +/* [0x00001a10] */ 0x00000000, 0xf027c9e7, // bra.anyz -, ra_link +/* [0x00001a18] */ 0x929dd0ff, 0x10024831, // min r0, r0, r3 ; mov vw_setup, rb_dma1 +/* [0x00001a20] */ 0x8d7270f6, 0x10024872, // sub r1, r0, r3 ; mov vw_addr, ra_dest +/* [0x00001a28] */ 0x119d73c0, 0xd0020867, // shl r1, r1, i_shift23 +/* [0x00001a30] */ 0xfffffec8, 0xf0f809e7, // brr -, r:1b +/* [0x00001a38] */ 0x0c9d2e00, 0x100214a7, // add rb_lcount, rb_lcount, r0 +/* [0x00001a40] */ 0x0c6e7c40, 0x100206e7, // add ra_dma0, ra_dma0, r1 +/* [0x00001a48] */ 0x8c71ccbf, 0x10024731, // add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init +// ::mc_filter_c10_p_l1 +/* [0x00001a50] */ 0x9581cff6, 0x10025c42, // mov vw_setup, rb_vpm_init ; mov ra2, unif +/* [0x00001a58] */ 0x8c803ff6, 0x100269e3, // add.setf -, rb_ef, rb_ef ; mov r3, unif +/* [0x00001a60] */ 0xf1082dc0, 0xd4024825, // shl r0, ra2.16b, v_x_shift ; v8subs r5rep, r0, r0 +/* [0x00001a68] */ 0x8c8021f6, 0x10025810, // add r0, r0, rb_elem_x ; mov ra_width_height, unif +/* [0x00001a70] */ 0x8d810bf6, 0x10025840, // sub r1, r5, rb_pitch ; mov ra0, unif +/* [0x00001a78] */ 0x939c117f, 0x10125815, // max r0, r0, r5 ; mov vrx_xshift, vrx_xshift_next +/* [0x00001a80] */ 0x9209a1f6, 0x12125813, // min r0, r0, rb_max_x ; mov vra_y_next, ra2.16a +/* [0x00001a88] */ 0x54404077, 0xd4024862, // and r1, r0, r1 ; mul24 r2, ra_width, v_x_mul +/* [0x00001a90] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00001a98] */ 0x8c827076, 0x10025803, // add r0, r0, r1 ; mov ra3, unif +/* [0x00001aa0] */ 0x8c427636, 0x120254e1, // add vrx_base_next, r3, r0 ; mov r1, ra_height +/* [0x00001aa8] */ 0x8d819eb6, 0x10025756, // sub rb_dma1, rb_dma1_base, r2 ; mov ra_wt_off_mul_l0, unif +/* [0x00001ab0] */ 0x8c5dc3ce, 0xdc025461, // add rb_i_tmu, r1, (3-4) - PREREAD ; v8min r1, r1, ra_blk_height +/* [0x00001ab8] */ 0x8c81f3f6, 0xd0039496, // add rb_lcount, r1, (3-4) ; mov.ifc ra_wt_off_mul_l0, unif +/* [0x00001ac0] */ 0x918083f6, 0xd002581c, // shl r0, r1, v_dma_h_shift ; mov ra_dest, unif +/* [0x00001ac8] */ 0x8c6670b6, 0x14024822, // add r0, r0, r2 ; mov r2, ra_fir_off_val +/* [0x00001ad0] */ 0x910cf1f6, 0xdc02480a, // shl r0, r0, v_dma_wh_shift ; mov rb10, ra3.8c +/* [0x00001ad8] */ 0x8c59b1f6, 0x140246e1, // add ra_dma0, r0, rb_dma0_base ; mov r1, ra_wt_off_l0 +/* [0x00001ae0] */ 0x5158a3d6, 0xd2024860, // shl r1, r1, i_wt_den_p5 ; mul24 r0, r2, ra_wt_mul_l0 +/* [0x00001ae8] */ 0x8d667236, 0x14025320, // sub rb_wt_off, r1, r0 ; mov r0, ra_kmul_add +/* [0x00001af0] */ 0x8c59cc3f, 0xd21245a5, // add ra_wt_mul_l0, ra_wt_mul_l0, r0 ; mov r5rep, -4 +/* [0x00001af8] */ 0x950e0dbf, 0x1e0252de, // mov rb11, ra3.8d ; mov ra_link, unif +// :1 +/* [0x00001b00] */ 0x8d151bf6, 0xb00269c4, // sub.setf -, r5, rb_i_tmu ; mov rb4, ra5 ; ldtmu1 +/* [0x00001b08] */ 0x8e5539bf, 0x1202888f, // shr r2, r4, vrx_xshift ; mov.ifz vra_base, vrx_base_next +/* [0x00001b10] */ 0x8e4505f6, 0xd202c863, // shr r1, r2, v_v_shift ; mov.ifnz r3, vra_y +/* [0x00001b18] */ 0x8c4c3ff6, 0x1202a9e3, // add.setf -, rb_ef, rb_ef ; mov.ifz r3, vra_y_next +/* [0x00001b20] */ 0x8c531789, 0xda124460, // add vra_y, r3, ra_k1 ; mov r0, r1 << 15 +/* [0x00001b28] */ 0x9353f792, 0xd803c8e1, // max r3, r3, ra_k0 ; mov.ifnc r1, r2 << 1 +/* [0x00001b30] */ 0x929de7d2, 0x1003c8e0, // min r3, r3, rb_max_y ; mov.ifnc r0, r2 +/* [0x00001b38] */ 0x545d039f, 0x12024863, // and r1, r1, ra_pmax ; mul24 r3, r3, rb_pitch +/* [0x00001b40] */ 0x8c5cfec6, 0x12024f20, // add vr_txs, vra_base, r3 ; v8min r0, r0, ra_pmax +/* [0x00001b48] */ 0x4c001bf0, 0xd8025963, // add r5rep, r5, 1 ; mul24 r3, ra0.8a, r0 +/* [0x00001b50] */ 0x4d01fef1, 0x1e0248a3, // sub r2, rb_fir_off_h, r3 ; mul24 r3, ra0.8d, r1 +/* [0x00001b58] */ 0x4d03e4f0, 0xda0248a3, // sub r2, r2, r3 ; mul24 r3, ra0.8b << 2, r0 << 2 @ "mul_used", 0 +/* [0x00001b60] */ 0x40034031, 0xda0109e3, // nop ; mul24.ifn r3, ra0.8b << 12, r1 << 12 @ "mul_used", 0 +/* [0x00001b68] */ 0x4c03c4f0, 0xdc0248a3, // add r2, r2, r3 ; mul24 r3, ra0.8c << 4, r0 << 4 @ "mul_used", 0 +/* [0x00001b70] */ 0x4c032b71, 0xdc0329e3, // add.setf -, r5, r5 ; mul24.ifn r3, ra0.8c << 14, r1 << 14 @ "mul_used", 0 +/* [0x00001b78] */ 0xffffff68, 0xf06809e7, // brr.anyn -, r:1b +/* [0x00001b80] */ 0x4c1ca4f7, 0x100248a0, // add r2, r2, r3 ; mul24 r0, ra7, rb10 +/* [0x00001b88] */ 0x550c6ffe, 0x1a024161, // mov ra5, rb6 ; mul24 r1, rb6, ra3.8b +/* [0x00001b90] */ 0x8f1c25f6, 0xd00241c6, // asr ra7, r2, v_bit_depth - 8 ; mov rb6, ra7 +/* [0x00001b98] */ 0x4c0c423e, 0x18024860, // add r1, r1, r0 ; mul24 r0, rb4, ra3.8a +/* [0x00001ba0] */ 0x4d1cb237, 0x10024860, // sub r1, r1, r0 ; mul24 r0, ra7, rb11 +/* [0x00001ba8] */ 0x0d9e7200, 0x10020867, // sub r1, r1, r0 +/* [0x00001bb0] */ 0x8f5c63f6, 0xdc024863, // asr r1, r1, 6 ; mov r3, ra_blk_height +/* [0x00001bb8] */ 0x4d592bce, 0x120269e0, // sub.setf -, r5, rb_lcount ; mul24 r0, r1, ra_wt_mul_l0 +/* [0x00001bc0] */ 0x4c64c1ce, 0x14024821, // add r0, r0, rb_wt_off ; mul24 r1, r1, ra_kmul_add +/* [0x00001bc8] */ 0xed427073, 0x12024860, // sub r1, r0, r1 ; v8subs r0, ra_height, r3 +/* [0x00001bd0] */ 0xffffff10, 0xf06809e7, // brr.anyn -, r:1b +/* [0x00001bd8] */ 0x0f9cb3c0, 0xd0020867, // asr r1, r1, i_wt_den_p6 +/* [0x00001be0] */ 0x925f23bf, 0x12020867, // min r1, r1, ra_pmax ; mov -, vw_wait +/* [0x00001be8] */ 0x5351039f, 0x18024c22, // max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch +/* [0x00001bf0] */ 0x956e7036, 0x10126431, // mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 +/* [0x00001bf8] */ 0x00000000, 0xf027c9e7, // bra.anyz -, ra_link +/* [0x00001c00] */ 0x929dd0ff, 0x10024831, // min r0, r0, r3 ; mov vw_setup, rb_dma1 +/* [0x00001c08] */ 0x8d7270f6, 0x10024872, // sub r1, r0, r3 ; mov vw_addr, ra_dest +/* [0x00001c10] */ 0x119d73c0, 0xd0020867, // shl r1, r1, i_shift23 +/* [0x00001c18] */ 0xfffffec8, 0xf0f809e7, // brr -, r:1b +/* [0x00001c20] */ 0x0c9d2e00, 0x100214a7, // add rb_lcount, rb_lcount, r0 +/* [0x00001c28] */ 0x0c6e7c40, 0x100206e7, // add ra_dma0, ra_dma0, r1 +/* [0x00001c30] */ 0x8c71ccbf, 0x10024731, // add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init +// ::mc_filter_c10_b +/* [0x00001c38] */ 0x9581cff6, 0x10025c42, // mov vw_setup, rb_vpm_init ; mov ra2, unif +/* [0x00001c40] */ 0x8c803ff6, 0x100269e3, // add.setf -, rb_ef, rb_ef ; mov r3, unif +/* [0x00001c48] */ 0xf1082dc9, 0xd4024825, // shl r0, ra2.16b, v_x_shift ; v8subs r5rep, r1, r1 +/* [0x00001c50] */ 0x8c0821f6, 0x12225813, // add r0, r0, rb_elem_x ; mov ra_y_next, ra2.16a +/* [0x00001c58] */ 0x8d810bf6, 0x10025850, // sub r1, r5, rb_pitch ; mov ra_width_height, unif +/* [0x00001c60] */ 0x93567176, 0x14125815, // max r0, r0, r5 ; mov ra_xshift, ra_xshift_next +/* [0x00001c68] */ 0x9281a1f6, 0x10025800, // min r0, r0, rb_max_x ; mov ra0, unif +/* [0x00001c70] */ 0x9481c1f6, 0xd0025802, // and r0, r0, -4 ; mov ra2, unif +/* [0x00001c78] */ 0x54404077, 0xd4024862, // and r1, r0, r1 ; mul24 r2, ra_width, v_x_mul +/* [0x00001c80] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00001c88] */ 0x8c427076, 0x12024821, // add r0, r0, r1 ; mov r1, ra_height +/* [0x00001c90] */ 0x8c9c163f, 0x10024680, // add ra_base_next, r3, r0 ; mov rb_xshift2, rb_xshift2_next +/* [0x00001c98] */ 0x8d819eb6, 0x10025756, // sub rb_dma1, rb_dma1_base, r2 ; mov ra_wt_off_mul_l0, unif +/* [0x00001ca0] */ 0x8c5dc3ce, 0xdc025461, // add rb_i_tmu, r1, (3-4) - PREREAD ; v8min r1, r1, ra_blk_height +/* [0x00001ca8] */ 0x8c59f3f6, 0xd4139496, // add rb_lcount, r1, (3-4) ; mov.ifc ra_wt_mul_l0, ra_wt_off_l0 +/* [0x00001cb0] */ 0x918083f6, 0xd0025803, // shl r0, r1, v_dma_h_shift ; mov ra3, unif +/* [0x00001cb8] */ 0x8c8270b6, 0x10024823, // add r0, r0, r2 ; mov r3, unif +/* [0x00001cc0] */ 0x910cf1f6, 0xd2125813, // shl r0, r0, v_dma_wh_shift ; mov ra_y2_next, ra3.16a +/* [0x00001cc8] */ 0x8c0db1f6, 0x140246e0, // add ra_dma0, r0, rb_dma0_base ; mov r0, ra3.16b +/* [0x00001cd0] */ 0x918021f6, 0xd0025801, // shl r0, r0, v_x_shift ; mov ra1, unif +/* [0x00001cd8] */ 0x8c8021f6, 0x10025803, // add r0, r0, rb_elem_x ; mov ra3, unif +/* [0x00001ce0] */ 0x8d810bf6, 0x10025852, // sub r1, r5, rb_pitch ; mov ra_wt_off_mul_l1, unif +/* [0x00001ce8] */ 0x939de17f, 0x10025809, // max r0, r0, r5 ; mov ra9, rb_max_y +/* [0x00001cf0] */ 0x9265a1f6, 0x14024822, // min r0, r0, rb_max_x ; mov r2, ra_kmul_add +/* [0x00001cf8] */ 0x9481c1f6, 0xd0039812, // and r0, r0, -4 ; mov.ifc ra_wt_off_mul_l1, unif +/* [0x00001d00] */ 0x949dc07f, 0xd0024865, // and r1, r0, r1 ; mov r5rep, -4 +/* [0x00001d08] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00001d10] */ 0x8c827076, 0x1002581c, // add r0, r0, r1 ; mov ra_dest, unif +/* [0x00001d18] */ 0x8c667636, 0x140254e0, // add rb_base2_next, r3, r0 ; mov r0, ra_fir_off_val +/* [0x00001d20] */ 0x4c5a7c86, 0x121245a1, // add ra_wt_mul_l0, ra_wt_mul_l0, r2 ; mul24 r1, r0, ra_wt_mul_l0 +/* [0x00001d28] */ 0x4c4a7c86, 0x121244a0, // add ra_wt_mul_l1, ra_wt_mul_l1, r2 ; mul24 r0, r0, ra_wt_mul_l1 +/* [0x00001d30] */ 0x8c4a7076, 0x14024821, // add r0, r0, r1 ; mov r1, ra_wt_off_l1 +/* [0x00001d38] */ 0x910cb3f6, 0xde02484b, // shl r1, r1, i_wt_den_p6 ; mov rb11, ra3.8d +/* [0x00001d40] */ 0x8d827236, 0x1002531e, // sub rb_wt_off, r1, r0 ; mov ra_link, unif +/* [0x00001d48] */ 0x95080ff6, 0x1e024287, // mov ra10, rb_xshift2 ; mov rb7, ra2.8d +// :1 +/* [0x00001d50] */ 0x0d9d1bc0, 0xa00229e7, // sub.setf -, r5, rb_i_tmu ; nop ; ldtmu0 +/* [0x00001d58] */ 0x8e5539bf, 0x1202888f, // shr r2, r4, ra_xshift ; mov.ifz rb_base2, rb_base2_next +/* [0x00001d60] */ 0x8e4d05f6, 0xd0029851, // shr r1, r2, v_v_shift ; mov.ifz ra_y_y2, ra_y_y2_next +/* [0x00001d68] */ 0x8c683ff6, 0x1002b9d8, // add.setf -, rb_ef, rb_ef ; mov.ifz ra_base, ra_base_next +/* [0x00001d70] */ 0x8c441fb6, 0xd4224463, // add ra_y, 1, ra_y ; mov r3, ra_y +/* [0x00001d78] */ 0x93531789, 0xd80248e0, // max r3, r3, ra_k0 ; mov r0, r1 << 15 +/* [0x00001d80] */ 0x9227f792, 0xd003c8e1, // min r3, r3, ra9 ; mov.ifnc r1, r2 << 1 +/* [0x00001d88] */ 0x559d049f, 0x100e4823, // mov.ifnc r0, r2 ; mul24 r3, r3, rb_pitch +/* [0x00001d90] */ 0x8c618cc7, 0x10024e20, // add t0s, ra_base, r3 ; v8min r0, r0, rb_pmask +/* [0x00001d98] */ 0x540183f0, 0x18024862, // and r1, r1, rb_pmask ; mul24 r2, ra0.8a, r0 +/* [0x00001da0] */ 0x4d01feb1, 0x1e0248a3, // sub r2, rb_fir_off_h, r2 ; mul24 r3, ra0.8d, r1 +/* [0x00001da8] */ 0x4d03e4f0, 0xda0248a3, // sub r2, r2, r3 ; mul24 r3, ra0.8b << 2, r0 << 2 @ "mul_used", 0 +/* [0x00001db0] */ 0x40034031, 0xda0109e3, // nop ; mul24.ifn r3, ra0.8b << 12, r1 << 12 @ "mul_used", 0 +/* [0x00001db8] */ 0x4c03c4f0, 0xdc0248a3, // add r2, r2, r3 ; mul24 r3, ra0.8c << 4, r0 << 4 @ "mul_used", 0 +/* [0x00001dc0] */ 0x40032031, 0xdc0109e3, // nop ; mul24.ifn r3, ra0.8c << 14, r1 << 14 @ "mul_used", 0 +/* [0x00001dc8] */ 0x4c0854fe, 0xb8025804, // add r0, r2, r3 ; mul24 ra4, rb5, ra2.8a ; ldtmu1 +/* [0x00001dd0] */ 0x8e2869bf, 0x10024885, // shr r2, r4, ra10 ; mov rb5, rb6 +/* [0x00001dd8] */ 0x8e4505f6, 0xd2024863, // shr r1, r2, v_v_shift ; mov r3, ra_y2 +/* [0x00001de0] */ 0x8e1c21f6, 0xd00241c6, // shr ra7, r0, v_bit_depth - 8 ; mov rb6, ra7 +/* [0x00001de8] */ 0x8c531789, 0xda124460, // add ra_y2, r3, ra_k1 ; mov r0, r1 << 15 +/* [0x00001df0] */ 0x9353f792, 0xd803c8e1, // max r3, r3, ra_k0 ; mov.ifnc r1, r2 << 1 +/* [0x00001df8] */ 0x925de7ce, 0x120248e1, // min r3, r3, rb_max_y ; v8min r1, r1, ra_pmax +/* [0x00001e00] */ 0x559d049f, 0x100e4823, // mov.ifnc r0, r2 ; mul24 r3, r3, rb_pitch +/* [0x00001e08] */ 0x8c5cfec6, 0x12024f20, // add t1s, rb_base2, r3 ; v8min r0, r0, ra_pmax +/* [0x00001e10] */ 0x4c041bf0, 0xd8025962, // add r5rep, r5, 1 ; mul24 r2, ra1.8a, r0 +/* [0x00001e18] */ 0x4d05feb1, 0x1e0248a3, // sub r2, rb_fir_off_h, r2 ; mul24 r3, ra1.8d, r1 +/* [0x00001e20] */ 0x4d07e4f0, 0xda0248a3, // sub r2, r2, r3 ; mul24 r3, ra1.8b << 2, r0 << 2 @ "mul_used", 0 +/* [0x00001e28] */ 0x40074031, 0xda0109e3, // nop ; mul24.ifn r3, ra1.8b << 12, r1 << 12 @ "mul_used", 0 +/* [0x00001e30] */ 0x4c07c6b0, 0xdc0248a3, // add r2, r3, r2 ; mul24 r3, ra1.8c << 4, r0 << 4 @ "mul_used", 0 +/* [0x00001e38] */ 0x4c072b71, 0xdc0329e3, // add.setf -, r5, r5 ; mul24.ifn r3, ra1.8c << 14, r1 << 14 @ "mul_used", 0 +/* [0x00001e40] */ 0xfffffef0, 0xf06809e7, // brr.anyn -, r:1b +/* [0x00001e48] */ 0x4c0c94fe, 0x180248a0, // add r2, r2, r3 ; mul24 r0, rb9, ra3.8a +/* [0x00001e50] */ 0x550caffe, 0x1a025261, // mov rb9, rb10 ; mul24 r1, rb10, ra3.8b +/* [0x00001e58] */ 0x8e2c25f6, 0xd00242ca, // shr ra11, r2, v_bit_depth - 8 ; mov rb10, ra11 +/* [0x00001e60] */ 0x4d08523e, 0x1a0248a1, // sub r2, r1, r0 ; mul24 r1, rb5, ra2.8b +/* [0x00001e68] */ 0x8d112bf6, 0x100269e0, // sub.setf -, r5, rb_lcount ; mov r0, ra4 +/* [0x00001e70] */ 0x4d08623e, 0x1c024860, // sub r1, r1, r0 ; mul24 r0, rb6, ra2.8c +/* [0x00001e78] */ 0x4c1c7237, 0x10024860, // add r1, r1, r0 ; mul24 r0, ra7, rb7 +/* [0x00001e80] */ 0x4d0ca23e, 0x1c024860, // sub r1, r1, r0 ; mul24 r0, rb10, ra3.8c +/* [0x00001e88] */ 0x4c2cb437, 0x100248a0, // add r2, r2, r0 ; mul24 r0, ra11, rb11 +/* [0x00001e90] */ 0x0d9e7400, 0x100208a7, // sub r2, r2, r0 +/* [0x00001e98] */ 0x0e9c63c0, 0xd0020867, // shr r1, r1, 6 +/* [0x00001ea0] */ 0x4e5865ce, 0xd20248a0, // shr r2, r2, 6 ; mul24 r0, r1, ra_wt_mul_l0 +/* [0x00001ea8] */ 0x4c4a7456, 0x120248a1, // add r2, r2, r1 ; mul24 r1, r2, ra_wt_mul_l1 +/* [0x00001eb0] */ 0x4c667216, 0x14024862, // add r1, r1, r0 ; mul24 r2, r2, ra_kmul_add +/* [0x00001eb8] */ 0x8d5e72b6, 0x1c024863, // sub r1, r1, r2 ; mov r3, ra_blk_height +/* [0x00001ec0] */ 0xec40c3f3, 0x12024860, // add r1, r1, rb_wt_off ; v8subs r0, ra_height, r3 +/* [0x00001ec8] */ 0xfffffe68, 0xf06809e7, // brr.anyn -, r:1b +/* [0x00001ed0] */ 0x0f667380, 0x18020867, // asr r1, r1, ra_wt_den_p7 +/* [0x00001ed8] */ 0x925f23bf, 0x12020867, // min r1, r1, ra_pmax ; mov -, vw_wait +/* [0x00001ee0] */ 0x5351039f, 0x18024c22, // max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch +/* [0x00001ee8] */ 0x956e7036, 0x10126431, // mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 +/* [0x00001ef0] */ 0x00000000, 0xf027c9e7, // bra.anyz -, ra_link +/* [0x00001ef8] */ 0x929dd0ff, 0x10024831, // min r0, r0, r3 ; mov vw_setup, rb_dma1 +/* [0x00001f00] */ 0x8d7270f6, 0x10024872, // sub r1, r0, r3 ; mov vw_addr, ra_dest +/* [0x00001f08] */ 0x119d73c0, 0xd0020867, // shl r1, r1, i_shift23 +/* [0x00001f10] */ 0xfffffe20, 0xf0f809e7, // brr -, r:1b +/* [0x00001f18] */ 0x0c9d2e00, 0x100214a7, // add rb_lcount, rb_lcount, r0 +/* [0x00001f20] */ 0x0c6e7c40, 0x100206e7, // add ra_dma0, ra_dma0, r1 +/* [0x00001f28] */ 0x8c71ccbf, 0x10024731, // add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init +// ::mc_sync10_q0 +/* [0x00001f30] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00001f38] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00001f40] */ 0x00000010, 0xe80009e7, // mov dst, sacq(i) +/* [0x00001f48] */ 0x00000010, 0xe80009e7, // mov dst, sacq(i) +/* [0x00001f50] */ 0x00000010, 0xe80009e7, // mov dst, sacq(i) +/* [0x00001f58] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00001f60] */ 0x0000001c, 0xe80009e7, // mov dst, sacq(i) +/* [0x00001f68] */ 0x00000001, 0xe80009e7, // mov dst, srel(i) +/* [0x00001f70] */ 0x0000000d, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync10_q1 +/* [0x00001f78] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00001f80] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00001f88] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00001f90] */ 0x00000000, 0xe80009e7, // mov dst, srel(i) +/* [0x00001f98] */ 0x00000011, 0xe80009e7, // mov dst, sacq(i) +/* [0x00001fa0] */ 0x00000002, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync10_q2 +/* [0x00001fa8] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00001fb0] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00001fb8] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00001fc0] */ 0x00000000, 0xe80009e7, // mov dst, srel(i) +/* [0x00001fc8] */ 0x00000012, 0xe80009e7, // mov dst, sacq(i) +/* [0x00001fd0] */ 0x00000003, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync10_q3 +/* [0x00001fd8] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00001fe0] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00001fe8] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00001ff0] */ 0x00000000, 0xe80009e7, // mov dst, srel(i) +/* [0x00001ff8] */ 0x00000013, 0xe80009e7, // mov dst, sacq(i) +/* [0x00002000] */ 0x009e7000, 0x100009e7, // nop +// ::mc_sync10_q4 +/* [0x00002008] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00002010] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00002018] */ 0x00000014, 0xe80009e7, // mov dst, sacq(i) +/* [0x00002020] */ 0x00000014, 0xe80009e7, // mov dst, sacq(i) +/* [0x00002028] */ 0x00000014, 0xe80009e7, // mov dst, sacq(i) +/* [0x00002030] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00002038] */ 0x0000001d, 0xe80009e7, // mov dst, sacq(i) +/* [0x00002040] */ 0x00000005, 0xe80009e7, // mov dst, srel(i) +/* [0x00002048] */ 0x0000000e, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync10_q5 +/* [0x00002050] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00002058] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00002060] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00002068] */ 0x00000004, 0xe80009e7, // mov dst, srel(i) +/* [0x00002070] */ 0x00000015, 0xe80009e7, // mov dst, sacq(i) +/* [0x00002078] */ 0x00000006, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync10_q6 +/* [0x00002080] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00002088] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00002090] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00002098] */ 0x00000004, 0xe80009e7, // mov dst, srel(i) +/* [0x000020a0] */ 0x00000016, 0xe80009e7, // mov dst, sacq(i) +/* [0x000020a8] */ 0x00000007, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync10_q7 +/* [0x000020b0] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x000020b8] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x000020c0] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x000020c8] */ 0x00000004, 0xe80009e7, // mov dst, srel(i) +/* [0x000020d0] */ 0x00000017, 0xe80009e7, // mov dst, sacq(i) +/* [0x000020d8] */ 0x009e7000, 0x100009e7, // nop +// ::mc_sync10_q8 +/* [0x000020e0] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x000020e8] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x000020f0] */ 0x00000018, 0xe80009e7, // mov dst, sacq(i) +/* [0x000020f8] */ 0x00000018, 0xe80009e7, // mov dst, sacq(i) +/* [0x00002100] */ 0x00000018, 0xe80009e7, // mov dst, sacq(i) +/* [0x00002108] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00002110] */ 0x0000001e, 0xe80009e7, // mov dst, sacq(i) +/* [0x00002118] */ 0x00000009, 0xe80009e7, // mov dst, srel(i) +/* [0x00002120] */ 0x0000000c, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync10_q9 +/* [0x00002128] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00002130] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00002138] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00002140] */ 0x00000008, 0xe80009e7, // mov dst, srel(i) +/* [0x00002148] */ 0x00000019, 0xe80009e7, // mov dst, sacq(i) +/* [0x00002150] */ 0x0000000a, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync10_q10 +/* [0x00002158] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00002160] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00002168] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00002170] */ 0x00000008, 0xe80009e7, // mov dst, srel(i) +/* [0x00002178] */ 0x0000001a, 0xe80009e7, // mov dst, sacq(i) +/* [0x00002180] */ 0x0000000b, 0xe80009e7, // mov dst, srel(i) +// ::mc_sync10_q11 +/* [0x00002188] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00002190] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00002198] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x000021a0] */ 0x00000008, 0xe80009e7, // mov dst, srel(i) +/* [0x000021a8] */ 0x0000001b, 0xe80009e7, // mov dst, sacq(i) +/* [0x000021b0] */ 0x009e7000, 0x100009e7, // nop +// ::mc_exit_c10_q0 +// ::mc_exit_y10_q0 +/* [0x000021b8] */ 0x00000002, 0xe00228e7, // mov.setf r3, PREREAD - 1 +// :1 +/* [0x000021c0] */ 0xffffffe0, 0xf03809e7, // brr.anynz -, r:1b +/* [0x000021c8] */ 0x009e7000, 0xa00009e7, // nop ; nop ; ldtmu0 +/* [0x000021d0] */ 0x009e7000, 0xb00009e7, // nop ; nop ; ldtmu1 +/* [0x000021d8] */ 0x0d9c17c0, 0xd00228e7, // sub.setf r3, r3, 1 +/* [0x000021e0] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x000021e8] */ 0x0000001c, 0xe80009e7, // mov dst, sacq(i) +/* [0x000021f0] */ 0x009e7000, 0x300009e7, // nop ; nop ; thrend +/* [0x000021f8] */ 0x00000001, 0xe00209a7, // mov interrupt, 1 +/* [0x00002200] */ 0x009e7000, 0x100009e7, // nop +// ::mc_exit_c10_qn +// ::mc_exit_y10_qn +/* [0x00002208] */ 0x00000002, 0xe00228e7, // mov.setf r3, PREREAD - 1 +// :1 +/* [0x00002210] */ 0xffffffe0, 0xf03809e7, // brr.anynz -, r:1b +/* [0x00002218] */ 0x009e7000, 0xa00009e7, // nop ; nop ; ldtmu0 +/* [0x00002220] */ 0x009e7000, 0xb00009e7, // nop ; nop ; ldtmu1 +/* [0x00002228] */ 0x0d9c17c0, 0xd00228e7, // sub.setf r3, r3, 1 +/* [0x00002230] */ 0x159f2fc0, 0x100009e7, // mov -, vw_wait +/* [0x00002238] */ 0x009e7000, 0x300009e7, // nop ; nop ; thrend +/* [0x00002240] */ 0x009e7000, 0x100009e7, // nop +/* [0x00002248] */ 0x009e7000, 0x100009e7, // nop +// ::mc_setup_y10_q0 +/* [0x00002250] */ 0x0000000c, 0xe80009e7, // mov dst, srel(i) +// ::mc_setup_y10_qn +/* [0x00002258] */ 0x95801ff6, 0xd0025900, // mov tmurs, 1 ; mov ra0, unif +/* [0x00002260] */ 0x15827d80, 0x10020267, // mov ra9, unif +/* [0x00002268] */ 0x15827d80, 0x10020067, // mov ra1, unif +/* [0x00002270] */ 0xaaaaff00, 0xe6020827, // mov r0, [0,2,0,2,0,2,0,2,1,3,1,3,1,3,1,3] +/* [0x00002278] */ 0x9181e1f6, 0xd00250cb, // shl rb_ef, r0, i_shift30 ; mov ra11, unif +/* [0x00002280] */ 0xff800100, 0xe0020527, // mov ra_kff800100, 0xff800100 +/* [0x00002288] */ 0x0000ffff, 0xe0021627, // mov rb_pmask, v_pmask +/* [0x00002290] */ 0x000803ff, 0xe00205e7, // mov ra_blk_height_pmax, ((1 << v_bit_depth) - 1) | (v_blk_height << 16) +/* [0x00002298] */ 0x00010000, 0xe00217e7, // mov rb_fir_off_h, (FIR_OFFSET << (v_bit_depth - 8)) +/* [0x000022a0] */ 0x4000000c, 0xe0020667, // mov ra_fir_off_val_wt_den_p7, (FIR_OFFSET << 16) | (DENOM + 15 - v_bit_depth) +/* [0x000022a8] */ 0x050b0a00, 0xe0021567, // mov rb_y_coeffs_2, 0x050b0a00 +/* [0x000022b0] */ 0x11283a40, 0xe00215a7, // mov rb_y_coeffs_3, 0x11283a40 +/* [0x000022b8] */ 0x0a0b0500, 0xe00215e7, // mov rb_y_coeffs_5, 0x0a0b0500 +/* [0x000022c0] */ 0x15827d80, 0x100200e7, // mov ra3, unif +/* [0x000022c8] */ 0x95803ff6, 0x10024754, // mov ra_ef, rb_ef ; mov rb_xpitch, unif +/* [0x000022d0] */ 0x0d0c1dc0, 0xd4020827, // sub r0, ra3.16b, 1 +/* [0x000022d8] */ 0x119c11c0, 0xd00216a7, // shl rb_max_x, r0, v_x_shift +/* [0x000022e0] */ 0x0d0c1dc0, 0xd20217a7, // sub rb_max_y, ra3.16a, 1 +/* [0x000022e8] */ 0x959a0dbf, 0x100248d0, // mov r3, elem_num ; mov rb_pitch, unif +/* [0x000022f0] */ 0xc0000000, 0xe0020867, // mov r1, vdw_setup_1(0) +/* [0x000022f8] */ 0x159d03c0, 0x10021667, // or rb_dma1_base, r1, rb_pitch +/* [0x00002300] */ 0x0c027cc0, 0x14020827, // add r0, ra0.16b, r3 +/* [0x00002308] */ 0x119c11c0, 0xd0020827, // shl r0, r0, v_x_shift +/* [0x00002310] */ 0x139c01c0, 0xd0020827, // max r0, r0, 0 +/* [0x00002318] */ 0x129da1c0, 0x10020827, // min r0, r0, rb_max_x +/* [0x00002320] */ 0x119c31c0, 0xd0220567, // shl ra_xshift_next, r0, 3 +/* [0x00002328] */ 0xf49dc1d2, 0xd0024822, // and r0, r0, -4 ; v8subs r2, r2, r2 +/* [0x00002330] */ 0x0d9d05c0, 0x100208a7, // sub r2, r2, rb_pitch +/* [0x00002338] */ 0x149e7080, 0x10020867, // and r1, r0, r2 +/* [0x00002340] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00002348] */ 0x0c9e7040, 0x10020827, // add r0, r0, r1 +/* [0x00002350] */ 0x0c267c00, 0x10020627, // add ra_base, ra9, r0 +/* [0x00002358] */ 0x0c067cc0, 0x14020827, // add r0, ra1.16b, r3 +/* [0x00002360] */ 0x119c11c0, 0xd0020827, // shl r0, r0, v_x_shift +/* [0x00002368] */ 0x139c01c0, 0xd0020827, // max r0, r0, 0 +/* [0x00002370] */ 0x129da1c0, 0x10020827, // min r0, r0, rb_max_x +/* [0x00002378] */ 0x119c31c0, 0xd0021067, // shl rb_xshift2_next, r0, 3 +/* [0x00002380] */ 0x149dc1c0, 0xd0020827, // and r0, r0, -4 +/* [0x00002388] */ 0x149e7080, 0x10020867, // and r1, r0, r2 +/* [0x00002390] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00002398] */ 0x0c9e7040, 0x10020827, // add r0, r0, r1 +/* [0x000023a0] */ 0x0c2e7c00, 0x100213e7, // add rb_base2, ra11, r0 +/* [0x000023a8] */ 0x80027036, 0x120049e0, // nop ; mov r0, ra0.16a +/* [0x000023b0] */ 0x95043ff6, 0xd20248e2, // mov r3, PREREAD ; mov r2, ra1.16a +// :1 +/* [0x000023b8] */ 0x0d9c17c0, 0xd00228e7, // sub.setf r3, r3, 1 +/* [0x000023c0] */ 0x139c01c0, 0xd0020867, // max r1, r0, 0 +/* [0x000023c8] */ 0x129de3c0, 0x10020867, // min r1, r1, rb_max_y +/* [0x000023d0] */ 0x4c51018f, 0x1a024821, // add r0, r0, ra_k1 ; mul24 r1, r1, rb_pitch +/* [0x000023d8] */ 0x8c627c40, 0x10225e11, // add t0s, ra_base, r1 ; mov ra_y, r0 +/* [0x000023e0] */ 0x139c05c0, 0xd0020867, // max r1, r2, 0 +/* [0x000023e8] */ 0xffffffb0, 0xf03809e7, // brr.anynz -, r:1b +/* [0x000023f0] */ 0x129de3c0, 0x10020867, // min r1, r1, rb_max_y +/* [0x000023f8] */ 0x4c51058f, 0x1a0248a1, // add r2, r2, ra_k1 ; mul24 r1, r1, rb_pitch +/* [0x00002400] */ 0x8c9cfe52, 0x10125f11, // add t1s, rb_base2, r1 ; mov ra_y2, r2 +/* [0x00002408] */ 0x159e6fc0, 0x100208a7, // mov r2, qpu_num +/* [0x00002410] */ 0x0f9c15c0, 0xd0020867, // asr r1, r2, 1 +/* [0x00002418] */ 0x119c43c0, 0xd0020867, // shl r1, r1, 4 +/* [0x00002420] */ 0x149c15c0, 0xd0020827, // and r0, r2, 1 +/* [0x00002428] */ 0x159e7040, 0x10020827, // or r0, r0, r1 +/* [0x00002430] */ 0x00002900, 0xe0020867, // mov r1, vpm_setup(0, 2, h16p(0, 0)) +/* [0x00002438] */ 0x0c9e7040, 0x10021727, // add r_vpm, r0, r1 +/* [0x00002440] */ 0x80004002, 0xe0020867, // mov r1, vdw_setup_0(0, 0, dma_h16p(0,0,0)) +/* [0x00002448] */ 0x119c61c0, 0xd0020827, // shl r0, r0, 6 +/* [0x00002450] */ 0x0c9e7040, 0x100216e7, // add r_dma, r0, r1 +/* [0x00002458] */ 0x15827d80, 0x100207a7, // mov ra_link, unif +/* [0x00002460] */ 0x00000000, 0xe0024208, // mov ra8, 0 ; mov rb8, 0 +/* [0x00002468] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00002470] */ 0x00000000, 0xe0024249, // mov ra9, 0 ; mov rb9, 0 +/* [0x00002478] */ 0x00000000, 0xe002428a, // mov ra10, 0 ; mov rb10, 0 +/* [0x00002480] */ 0x00000000, 0xe00242cb, // mov ra11, 0 ; mov rb11, 0 +// :per_block_setup_10 +/* [0x00002488] */ 0x119c11c0, 0xd0020827, // shl r0, r0, v_x_shift +/* [0x00002490] */ 0x93567176, 0x14125815, // max r0, r0, r5 ; mov ra_xshift, ra_xshift_next +/* [0x00002498] */ 0x129da1c0, 0x10020827, // min r0, r0, rb_max_x +/* [0x000024a0] */ 0x119c31c0, 0xd0220567, // shl ra_xshift_next, r0, 3 +/* [0x000024a8] */ 0x149dc1c0, 0xd0020827, // and r0, r0, -4 +/* [0x000024b0] */ 0x8d810bf6, 0x1002589a, // sub r2, r5, rb_pitch ; mov ra_base_next, unif +/* [0x000024b8] */ 0x940270b6, 0x12225853, // and r1, r0, r2 ; mov ra_y_next, ra0.16a +/* [0x000024c0] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x000024c8] */ 0x8c827076, 0x10025801, // add r0, r0, r1 ; mov ra1, unif +/* [0x000024d0] */ 0x0c6a7c00, 0x100206a7, // add ra_base_next, ra_base_next, r0 +/* [0x000024d8] */ 0x0c067cc0, 0x14020827, // add r0, ra1.16b, r3 +/* [0x000024e0] */ 0x119c11c0, 0xd0020827, // shl r0, r0, v_x_shift +/* [0x000024e8] */ 0x93067176, 0x12125813, // max r0, r0, r5 ; mov ra_y2_next, ra1.16a +/* [0x000024f0] */ 0x9281a1f6, 0x10024813, // min r0, r0, rb_max_x ; mov rb_base2_next, unif +/* [0x000024f8] */ 0x119c31c0, 0xd0021067, // shl rb_xshift2_next, r0, 3 +/* [0x00002500] */ 0x9481c1f6, 0xd0025810, // and r0, r0, -4 ; mov ra_width_height, unif +/* [0x00002508] */ 0x949dc0bf, 0x10024871, // and r1, r0, r2 ; mov vw_setup, rb_vpm_init +/* [0x00002510] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00002518] */ 0x4c402077, 0xd4024821, // add r0, r0, r1 ; mul24 r1, ra_width, v_x_mul +/* [0x00002520] */ 0x0c9d3e00, 0x100214e7, // add rb_base2_next, rb_base2_next, r0 +/* [0x00002528] */ 0x8d419e76, 0x12025760, // sub rb_dma1, rb_dma1_base, r1 ; mov r0, ra_height +/* [0x00002530] */ 0x8c5dc1c6, 0xdc025460, // add rb_i_tmu, r0, (7-8) - PREREAD ; v8min r0, r0, ra_blk_height +/* [0x00002538] */ 0x0c9df1c0, 0xd00214a7, // add rb_lcount, r0, (7-8) +/* [0x00002540] */ 0x916481f6, 0xd4024823, // shl r0, r0, v_dma_h_shift ; mov r3, ra_kmul_add +/* [0x00002548] */ 0x0c9e7040, 0x10020827, // add r0, r0, r1 +/* [0x00002550] */ 0x9164f1f6, 0xd4024822, // shl r0, r0, v_dma_wh_shift ; mov r2, ra_fir_off_val +/* [0x00002558] */ 0x8c81b1f6, 0x100246e0, // add ra_dma0, r0, rb_dma0_base ; mov r0, unif +/* [0x00002560] */ 0x918101f6, 0xd00a5816, // shl.ifnn r0, r0, i_shift16 ; mov ra_wt_off_mul_l0, unif +/* [0x00002568] */ 0x915031f6, 0xde024205, // shl ra8, r0, 3 ; mov rb5, ra_k255 +/* [0x00002570] */ 0x01040400, 0xe0020867, // mov r1, 0x01040400 +/* [0x00002578] */ 0x10227380, 0x1e5200a7, // ror ra2.8b, r1, ra8.8d +/* [0x00002580] */ 0x10227380, 0x1c520027, // ror ra0.8b, r1, ra8.8c +/* [0x00002588] */ 0x10215f80, 0x1e6200a7, // ror ra2.8c, rb_y_coeffs_2, ra8.8d +/* [0x00002590] */ 0x10215f80, 0x1c620027, // ror ra0.8c, rb_y_coeffs_2, ra8.8c +/* [0x00002598] */ 0x00010100, 0xe0020867, // mov r1,0x00010100 +/* [0x000025a0] */ 0x902203bf, 0x1e025812, // ror r0, r1, ra8.8d ; mov ra_wt_off_mul_l1, unif +/* [0x000025a8] */ 0x90205387, 0x1c424004, // ror ra0.8a, r1, ra8.8c ; v8min rb4, r0, rb5 +/* [0x000025b0] */ 0x914883f6, 0xd0031856, // shl r1, r1, 8 ; mov.ifn ra_wt_off_mul_l0, ra_wt_off_mul_l1 +/* [0x000025b8] */ 0x902203bf, 0x1e02581c, // ror r0, r1, ra8.8d ; mov ra_dest, unif +/* [0x000025c0] */ 0x90205387, 0x1c72404b, // ror ra1.8d, r1, ra8.8c ; v8min rb11, r0, rb5 +/* [0x000025c8] */ 0x10216f80, 0x1e7200a7, // ror ra2.8d, rb_y_coeffs_3, ra8.8d +/* [0x000025d0] */ 0x10216f80, 0x1c720027, // ror ra0.8d, rb_y_coeffs_3, ra8.8c +/* [0x000025d8] */ 0x10217f80, 0x1e5200e7, // ror ra3.8b, rb_y_coeffs_5, ra8.8d +/* [0x000025e0] */ 0x10217f80, 0x1c520067, // ror ra1.8b, rb_y_coeffs_5, ra8.8c +/* [0x000025e8] */ 0x04040100, 0xe0020867, // mov r1,0x04040100 +/* [0x000025f0] */ 0x10227380, 0x1e6200e7, // ror ra3.8c, r1, ra8.8d +/* [0x000025f8] */ 0x902183bf, 0xdc624065, // ror ra1.8c, r1, ra8.8c ; mov r5rep, -8 +/* [0x00002600] */ 0x00000000, 0xf0f7c9e7, // bra -, ra_link +/* [0x00002608] */ 0x3a281100, 0xe0020867, // mov r1,0x3a281100 +/* [0x00002610] */ 0x902203bf, 0x1e02581e, // ror r0, r1, ra8.8d ; mov ra_link, unif +/* [0x00002618] */ 0x90205387, 0x1c424048, // ror ra1.8a, r1, ra8.8c ; v8min rb8, r0, rb5 +// ::mc_filter_y10_pxx +/* [0x00002620] */ 0xfffffe48, 0xf0f807a7, // brr ra_link, r:per_block_setup_10 +/* [0x00002628] */ 0x959a0ff6, 0x10024023, // mov ra0, unif ; mov r3, elem_num +/* [0x00002630] */ 0xec9c3fd2, 0x100269e5, // add.setf -, rb_ef, rb_ef ; v8subs r5rep, r2, r2 +/* [0x00002638] */ 0x8c001cff, 0x14024800, // add r0, ra0.16b, r3 ; mov rb_xshift2, rb_xshift2_next +/* [0x00002640] */ 0x1158adc0, 0xd4020867, // shl r1, ra_wt_off_l0, i_wt_den_p5 +/* [0x00002648] */ 0x4c5a7cd6, 0x121245a0, // add ra_wt_mul_l0, ra_wt_mul_l0, r3 ; mul24 r0, r2, ra_wt_mul_l0 +/* [0x00002650] */ 0x8d9c423f, 0x1042531d, // sub rb_wt_off, r1, r0 ; mov ra_ef.8a, rb4 +// :1 +/* [0x00002658] */ 0x4c745dbe, 0x100279c4, // add.setf -, ra_ef, ra_ef ; mul24 ra4, rb5, ra_ef +/* [0x00002660] */ 0x93440dff, 0xd40248a1, // max r2, ra_y, 0 ; mov r1, 0 +/* [0x00002668] */ 0x9251e5f6, 0x1a0248a3, // min r2, r2, rb_max_y ; mov r3, ra_k1 +/* [0x00002670] */ 0x4c450cd7, 0xa4224462, // add ra_y, ra_y, r3 ; mul24 r2, r2, rb_pitch ; ldtmu0 +/* [0x00002678] */ 0x8c606cbf, 0x10024e05, // add t0s, ra_base, r2 ; mov rb5, rb6 +/* [0x00002680] */ 0x8e5479bf, 0x12024806, // shr r0, r4, ra_xshift ; mov rb6, rb7 +/* [0x00002688] */ 0x93458c47, 0xb20248a0, // max r2, ra_y2, r1 ; v8min r0, r0, rb_pmask ; ldtmu1 +/* [0x00002690] */ 0x8e2009f6, 0x10024847, // shr r1, r4, rb_xshift2 ; mov rb7, ra8 +/* [0x00002698] */ 0x925de5ce, 0x120248a1, // min r2, r2, rb_max_y ; v8min r1, r1, ra_pmax +/* [0x000026a0] */ 0x4c450cd7, 0x12124462, // add ra_y2, ra_y2, r3 ; mul24 r2, r2, rb_pitch +/* [0x000026a8] */ 0x8c24feb6, 0x10025f08, // add t1s, rb_base2, r2 ; mov ra8, ra9 +/* [0x000026b0] */ 0x4c038af1, 0xd8025962, // add r5rep, r5, r3 ; mul24 r2, ra0.8a << 8, r1 << 8 @ "mul_used", 0 +/* [0x000026b8] */ 0x5501fff0, 0x180348e2, // mov r3, rb_fir_off_h ; mul24.ifnn r2, ra0.8a, r0 +/* [0x000026c0] */ 0x4d03f6b0, 0xda0248a3, // sub r2, r3, r2 ; mul24 r3, ra0.8b << 1, r0 << 1 @ "mul_used", 0 +/* [0x000026c8] */ 0x40037031, 0xda0109e3, // nop ; mul24.ifn r3, ra0.8b << 9, r1 << 9 @ "mul_used", 0 +/* [0x000026d0] */ 0x4c03e4f0, 0xdc0248a3, // add r2, r2, r3 ; mul24 r3, ra0.8c << 2, r0 << 2 @ "mul_used", 0 +/* [0x000026d8] */ 0x40036031, 0xdc0109e3, // nop ; mul24.ifn r3, ra0.8c << 10, r1 << 10 @ "mul_used", 0 +/* [0x000026e0] */ 0x4d03d4f0, 0xde0248a3, // sub r2, r2, r3 ; mul24 r3, ra0.8d << 3, r0 << 3 @ "mul_used", 0 +/* [0x000026e8] */ 0x40035031, 0xde0109e3, // nop ; mul24.ifn r3, ra0.8d << 11, r1 << 11 @ "mul_used", 0 +/* [0x000026f0] */ 0x4c07c4f0, 0xd80248a3, // add r2, r2, r3 ; mul24 r3, ra1.8a << 4, r0 << 4 @ "mul_used", 0 +/* [0x000026f8] */ 0x40074031, 0xd80109e3, // nop ; mul24.ifn r3, ra1.8a << 12, r1 << 12 @ "mul_used", 0 +/* [0x00002700] */ 0x4c07b4f0, 0xda0248a3, // add r2, r2, r3 ; mul24 r3, ra1.8b << 5, r0 << 5 @ "mul_used", 0 +/* [0x00002708] */ 0x40073031, 0xda0109e3, // nop ; mul24.ifn r3, ra1.8b << 13, r1 << 13 @ "mul_used", 0 +/* [0x00002710] */ 0x4d07a4f0, 0xdc0248a3, // sub r2, r2, r3 ; mul24 r3, ra1.8c << 6, r0 << 6 @ "mul_used", 0 +/* [0x00002718] */ 0x40072031, 0xdc0109e3, // nop ; mul24.ifn r3, ra1.8c << 14, r1 << 14 @ "mul_used", 0 +/* [0x00002720] */ 0x4c0794f0, 0xde0248a3, // add r2, r2, r3 ; mul24 r3, ra1.8d << 7, r0 << 7 @ "mul_used", 0 +/* [0x00002728] */ 0x4c071b71, 0xde0329e3, // add.setf -, r5, r5 ; mul24.ifn r3, ra1.8d << 15, r1 << 15 @ "mul_used", 0 +/* [0x00002730] */ 0xffffff08, 0xf06809e7, // brr.anyn -, r:1b +/* [0x00002738] */ 0x4d0854fe, 0x1a0248a1, // sub r2, r2, r3 ; mul24 r1, rb5, ra2.8b +/* [0x00002740] */ 0x550caffe, 0x1a024260, // mov ra9, rb10 ; mul24 r0, rb10, ra3.8b +/* [0x00002748] */ 0x8f2c25f6, 0xd00242ca, // asr ra11, r2, v_bit_depth - 8 ; mov rb10, ra11 +/* [0x00002750] */ 0x4d08623e, 0x1c024860, // sub r1, r1, r0 ; mul24 r0, rb6, ra2.8c +/* [0x00002758] */ 0x4d08723e, 0x1e024860, // sub r1, r1, r0 ; mul24 r0, rb7, ra2.8d +/* [0x00002760] */ 0x4c208237, 0x10024860, // add r1, r1, r0 ; mul24 r0, ra8, rb8 +/* [0x00002768] */ 0x4c0ca23e, 0x1c024860, // add r1, r1, r0 ; mul24 r0, rb10, ra3.8c +/* [0x00002770] */ 0x4c2cb237, 0x10024860, // add r1, r1, r0 ; mul24 r0, ra11, rb11 +/* [0x00002778] */ 0x8d5d1bf6, 0x1c0269e3, // sub.setf -, r5, rb_i_tmu ; mov r3, ra_blk_height +/* [0x00002780] */ 0x8d1133bf, 0x1002884f, // sub r1, r1, ra4 ; mov.ifz rb_base2, rb_base2_next +/* [0x00002788] */ 0x8d6a7236, 0x10029858, // sub r1, r1, r0 ; mov.ifz ra_base, ra_base_next +/* [0x00002790] */ 0x8f4c63f6, 0xd0029851, // asr r1, r1, 6 ; mov.ifz ra_y_y2, ra_y_y2_next +/* [0x00002798] */ 0x4d592bce, 0x120269e0, // sub.setf -, r5, rb_lcount ; mul24 r0, r1, ra_wt_mul_l0 +/* [0x000027a0] */ 0x4c64c1ce, 0x14024821, // add r0, r0, rb_wt_off ; mul24 r1, r1, ra_kmul_add +/* [0x000027a8] */ 0xed427073, 0x12024860, // sub r1, r0, r1 ; v8subs r0, ra_height, r3 +/* [0x000027b0] */ 0xfffffe88, 0xf06809e7, // brr.anyn -, r:1b +/* [0x000027b8] */ 0x0f9cb3c0, 0xd0020867, // asr r1, r1, i_wt_den_p6 +/* [0x000027c0] */ 0x925f23bf, 0x12020867, // min r1, r1, ra_pmax ; mov -, vw_wait +/* [0x000027c8] */ 0x5351039f, 0x18024c22, // max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch +/* [0x000027d0] */ 0x956e7036, 0x10126431, // mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 +/* [0x000027d8] */ 0x00000000, 0xf027c9e7, // bra.anyz -, ra_link +/* [0x000027e0] */ 0x929dd0ff, 0x10024831, // min r0, r0, r3 ; mov vw_setup, rb_dma1 +/* [0x000027e8] */ 0x8d7270f6, 0x10024872, // sub r1, r0, r3 ; mov vw_addr, ra_dest +/* [0x000027f0] */ 0x119d73c0, 0xd0020867, // shl r1, r1, i_shift23 +/* [0x000027f8] */ 0xfffffe40, 0xf0f809e7, // brr -, r:1b +/* [0x00002800] */ 0x0c9d2e00, 0x100214a7, // add rb_lcount, rb_lcount, r0 +/* [0x00002808] */ 0x0c6e7c40, 0x100206e7, // add ra_dma0, ra_dma0, r1 +/* [0x00002810] */ 0x8c71ccbf, 0x10024731, // add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init +// ::mc_filter_y10_p00 +/* [0x00002818] */ 0x959a0ff6, 0x10024020, // mov ra0, unif ; mov r0, elem_num +/* [0x00002820] */ 0xf5567dad, 0x14124565, // mov ra_xshift, ra_xshift_next ; v8subs r5rep, r5, r5 +/* [0x00002828] */ 0x8c020c3f, 0x1402581a, // add r0, ra0.16b, r0 ; mov ra_base_next, unif +/* [0x00002830] */ 0x119c11c0, 0xd0020827, // shl r0, r0, v_x_shift +/* [0x00002838] */ 0x93027176, 0x12225813, // max r0, r0, r5 ; mov ra_y_next, ra0.16a +/* [0x00002840] */ 0x9281a1f6, 0x10025810, // min r0, r0, rb_max_x ; mov ra_width_height, unif +/* [0x00002848] */ 0x119c31c0, 0xd0220567, // shl ra_xshift_next, r0, 3 +/* [0x00002850] */ 0x149dc1c0, 0xd0020827, // and r0, r0, -4 +/* [0x00002858] */ 0x8d810bf6, 0x10025896, // sub r2, r5, rb_pitch ; mov ra_wt_off_mul_l0, unif +/* [0x00002860] */ 0x149e7080, 0x10020867, // and r1, r0, r2 +/* [0x00002868] */ 0x569d404f, 0x10024821, // xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch +/* [0x00002870] */ 0x8c827076, 0x1002581c, // add r0, r0, r1 ; mov ra_dest, unif +/* [0x00002878] */ 0x8c69cc3f, 0x100246b1, // add ra_base_next, ra_base_next, r0 ; mov vw_setup, rb_vpm_init +/* [0x00002880] */ 0x11401dc0, 0xd4020867, // shl r1, ra_width, v_x_shift +/* [0x00002888] */ 0x8d419e76, 0x12025760, // sub rb_dma1, rb_dma1_base, r1 ; mov r0, ra_height +/* [0x00002890] */ 0x8d5c31c6, 0xdc025460, // sub rb_i_tmu, r0, PREREAD ; v8min r0, r0, ra_blk_height +/* [0x00002898] */ 0x919c81c0, 0xd0024812, // shl r0, r0, v_dma_h_shift ; mov rb_lcount, r0 +/* [0x000028a0] */ 0x0c9e7040, 0x10020827, // add r0, r0, r1 +/* [0x000028a8] */ 0x1158edc0, 0xd4021327, // shl rb_wt_off, ra_wt_off_l0, DENOM + 7 +/* [0x000028b0] */ 0x9180f1f6, 0xd002581e, // shl r0, r0, v_dma_wh_shift ; mov ra_link, unif +/* [0x000028b8] */ 0x0c9db1c0, 0x100206e7, // add ra_dma0, r0, rb_dma0_base +// :1 +/* [0x000028c0] */ 0xcd511bee, 0x1a0269e5, // sub.setf -, r5, rb_i_tmu ; v8adds r5rep, r5, ra_k1 +/* [0x000028c8] */ 0x804e7036, 0xa42099d1, // nop ; mov.ifz ra_y, ra_y_next ; ldtmu0 +/* [0x000028d0] */ 0x8e5509bf, 0x12024823, // shr r0, r4, ra_xshift ; mov r3, rb_pitch +/* [0x000028d8] */ 0x13440dc0, 0xd40208a7, // max r2, ra_y, 0 +/* [0x000028e0] */ 0x9269e5f6, 0x10029898, // min r2, r2, rb_max_y ; mov.ifz ra_base, ra_base_next +/* [0x000028e8] */ 0x4c441dd3, 0xd4224462, // add ra_y, ra_y, 1 ; mul24 r2, r2, r3 +/* [0x000028f0] */ 0x8c618c87, 0x10024e20, // add t0s, ra_base, r2 ; v8min r0, r0, rb_pmask +/* [0x000028f8] */ 0x4d592bc6, 0x120269e1, // sub.setf -, r5, rb_lcount ; mul24 r1, r0, ra_wt_mul_l0 +/* [0x00002900] */ 0x915c83f6, 0xdc024863, // shl r1, r1, 8 ; mov r3, ra_blk_height +/* [0x00002908] */ 0xec40c3f3, 0x12024860, // add r1, r1, rb_wt_off ; v8subs r0, ra_height, r3 +/* [0x00002910] */ 0xffffff90, 0xf06809e7, // brr.anyn -, r:1b +/* [0x00002918] */ 0x0f9cf3c0, 0xd0020867, // asr r1, r1, DENOM + 8 +/* [0x00002920] */ 0x925f23bf, 0x12020867, // min r1, r1, ra_pmax ; mov -, vw_wait +/* [0x00002928] */ 0x5351039f, 0x18024c22, // max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch +/* [0x00002930] */ 0x956e7036, 0x10126431, // mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 +/* [0x00002938] */ 0x00000000, 0xf027c9e7, // bra.anyz -, ra_link +/* [0x00002940] */ 0x929dd0ff, 0x10024831, // min r0, r0, r3 ; mov vw_setup, rb_dma1 +/* [0x00002948] */ 0x8d7270f6, 0x10024872, // sub r1, r0, r3 ; mov vw_addr, ra_dest +/* [0x00002950] */ 0x119d73c0, 0xd0020867, // shl r1, r1, i_shift23 +/* [0x00002958] */ 0xffffff48, 0xf0f809e7, // brr -, r:1b +/* [0x00002960] */ 0x0c9d2e00, 0x100214a7, // add rb_lcount, rb_lcount, r0 +/* [0x00002968] */ 0x0c6e7c40, 0x100206e7, // add ra_dma0, ra_dma0, r1 +/* [0x00002970] */ 0x8c71ccbf, 0x10024731, // add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init +// ::mc_filter_y10_bxx +/* [0x00002978] */ 0xfffffaf0, 0xf0f807a7, // brr ra_link, r:per_block_setup_10 +/* [0x00002980] */ 0x959a0ff6, 0x10024023, // mov ra0, unif ; mov r3, elem_num +/* [0x00002988] */ 0xec9c3fd2, 0x100269e5, // add.setf -, rb_ef, rb_ef ; v8subs r5rep, r2, r2 +/* [0x00002990] */ 0x8c001cff, 0x14024800, // add r0, ra0.16b, r3 ; mov rb_xshift2, rb_xshift2_next +/* [0x00002998] */ 0x1158bdc0, 0xd4020867, // shl r1, ra_wt_off_l0, i_wt_den_p6 +/* [0x000029a0] */ 0x4c5a7cd6, 0x121245a0, // add ra_wt_mul_l0, ra_wt_mul_l0, r3 ; mul24 r0, r2, ra_wt_mul_l0 +/* [0x000029a8] */ 0x4d4a7216, 0x12024860, // sub r1, r1, r0 ; mul24 r0, r2, ra_wt_mul_l1 +/* [0x000029b0] */ 0x8d9c423f, 0x1042531d, // sub rb_wt_off, r1, r0 ; mov ra_ef.8a, rb4 +// :1 +/* [0x000029b8] */ 0x4c745dbe, 0x100279c4, // add.setf -, ra_ef, ra_ef ; mul24 ra4, rb5, ra_ef +/* [0x000029c0] */ 0x93440dff, 0xd40248a1, // max r2, ra_y, 0 ; mov r1, 0 +/* [0x000029c8] */ 0x9251e5f6, 0x1a0248a3, // min r2, r2, rb_max_y ; mov r3, ra_k1 +/* [0x000029d0] */ 0x4c450cd7, 0xa4224462, // add ra_y, ra_y, r3 ; mul24 r2, r2, rb_pitch ; ldtmu0 +/* [0x000029d8] */ 0x8c606cbf, 0x10024e05, // add t0s, ra_base, r2 ; mov rb5, rb6 +/* [0x000029e0] */ 0x8e5479bf, 0x12024806, // shr r0, r4, ra_xshift ; mov rb6, rb7 +/* [0x000029e8] */ 0x93458c47, 0xb20248a0, // max r2, ra_y2, r1 ; v8min r0, r0, rb_pmask ; ldtmu1 +/* [0x000029f0] */ 0x8e2009f6, 0x10024847, // shr r1, r4, rb_xshift2 ; mov rb7, ra8 +/* [0x000029f8] */ 0x925de5ce, 0x120248a1, // min r2, r2, rb_max_y ; v8min r1, r1, ra_pmax +/* [0x00002a00] */ 0x4c450cd7, 0x12124462, // add ra_y2, ra_y2, r3 ; mul24 r2, r2, rb_pitch +/* [0x00002a08] */ 0x8c24feb6, 0x10025f08, // add t1s, rb_base2, r2 ; mov ra8, ra9 +/* [0x00002a10] */ 0x4c038af1, 0xd8025962, // add r5rep, r5, r3 ; mul24 r2, ra0.8a << 8, r1 << 8 @ "mul_used", 0 +/* [0x00002a18] */ 0x5501fff0, 0x180348e2, // mov r3, rb_fir_off_h ; mul24.ifnn r2, ra0.8a, r0 +/* [0x00002a20] */ 0x4d03f6b0, 0xda0248a3, // sub r2, r3, r2 ; mul24 r3, ra0.8b << 1, r0 << 1 @ "mul_used", 0 +/* [0x00002a28] */ 0x40037031, 0xda0109e3, // nop ; mul24.ifn r3, ra0.8b << 9, r1 << 9 @ "mul_used", 0 +/* [0x00002a30] */ 0x4c03e4f0, 0xdc0248a3, // add r2, r2, r3 ; mul24 r3, ra0.8c << 2, r0 << 2 @ "mul_used", 0 +/* [0x00002a38] */ 0x40036031, 0xdc0109e3, // nop ; mul24.ifn r3, ra0.8c << 10, r1 << 10 @ "mul_used", 0 +/* [0x00002a40] */ 0x4d03d4f0, 0xde0248a3, // sub r2, r2, r3 ; mul24 r3, ra0.8d << 3, r0 << 3 @ "mul_used", 0 +/* [0x00002a48] */ 0x40035031, 0xde0109e3, // nop ; mul24.ifn r3, ra0.8d << 11, r1 << 11 @ "mul_used", 0 +/* [0x00002a50] */ 0x4c07c4f0, 0xd80248a3, // add r2, r2, r3 ; mul24 r3, ra1.8a << 4, r0 << 4 @ "mul_used", 0 +/* [0x00002a58] */ 0x40074031, 0xd80109e3, // nop ; mul24.ifn r3, ra1.8a << 12, r1 << 12 @ "mul_used", 0 +/* [0x00002a60] */ 0x4c07b4f0, 0xda0248a3, // add r2, r2, r3 ; mul24 r3, ra1.8b << 5, r0 << 5 @ "mul_used", 0 +/* [0x00002a68] */ 0x40073031, 0xda0109e3, // nop ; mul24.ifn r3, ra1.8b << 13, r1 << 13 @ "mul_used", 0 +/* [0x00002a70] */ 0x4d07a4f0, 0xdc0248a3, // sub r2, r2, r3 ; mul24 r3, ra1.8c << 6, r0 << 6 @ "mul_used", 0 +/* [0x00002a78] */ 0x40072031, 0xdc0109e3, // nop ; mul24.ifn r3, ra1.8c << 14, r1 << 14 @ "mul_used", 0 +/* [0x00002a80] */ 0x4c0794f0, 0xde0248a3, // add r2, r2, r3 ; mul24 r3, ra1.8d << 7, r0 << 7 @ "mul_used", 0 +/* [0x00002a88] */ 0x4c071b71, 0xde0329e3, // add.setf -, r5, r5 ; mul24.ifn r3, ra1.8d << 15, r1 << 15 @ "mul_used", 0 +/* [0x00002a90] */ 0xffffff08, 0xf06809e7, // brr.anyn -, r:1b +/* [0x00002a98] */ 0x4d0854fe, 0x1a0248a1, // sub r2, r2, r3 ; mul24 r1, rb5, ra2.8b +/* [0x00002aa0] */ 0x550caffe, 0x1a024260, // mov ra9, rb10 ; mul24 r0, rb10, ra3.8b +/* [0x00002aa8] */ 0x8f2c25f6, 0xd00242ca, // asr ra11, r2, v_bit_depth - 8 ; mov rb10, ra11 +/* [0x00002ab0] */ 0x4d08623e, 0x1c024860, // sub r1, r1, r0 ; mul24 r0, rb6, ra2.8c +/* [0x00002ab8] */ 0x4d08723e, 0x1e024860, // sub r1, r1, r0 ; mul24 r0, rb7, ra2.8d +/* [0x00002ac0] */ 0x4c208237, 0x10024860, // add r1, r1, r0 ; mul24 r0, ra8, rb8 +/* [0x00002ac8] */ 0x4c0ca23e, 0x1c024860, // add r1, r1, r0 ; mul24 r0, rb10, ra3.8c +/* [0x00002ad0] */ 0x4c2cb237, 0x10024860, // add r1, r1, r0 ; mul24 r0, ra11, rb11 +/* [0x00002ad8] */ 0x0d127380, 0x10020867, // sub r1, r1, ra4 +/* [0x00002ae0] */ 0x8d9cc23f, 0x10024862, // sub r1, r1, r0 ; mov r2, rb_wt_off +/* [0x00002ae8] */ 0x0f9c63c0, 0xd0020867, // asr r1, r1, 6 +/* [0x00002af0] */ 0x4d591bce, 0x120269e0, // sub.setf -, r5, rb_i_tmu ; mul24 r0, r1, ra_wt_mul_l0 +/* [0x00002af8] */ 0x55653fce, 0x140453e1, // mov.ifz rb_base2, rb_base2_next ; mul24 r1, r1, ra_kmul_add +/* [0x00002b00] */ 0x8d4e7076, 0x10029851, // sub r1, r0, r1 ; mov.ifz ra_y_y2, ra_y_y2_next +/* [0x00002b08] */ 0x8d692bf6, 0x1002b9d8, // sub.setf -, r5, rb_lcount ; mov.ifz ra_base, ra_base_next +/* [0x00002b10] */ 0x8c9f8289, 0xd0024860, // add r1, r1, r2 ; mov r0, r1 << 8 +/* [0x00002b18] */ 0x8c5e7236, 0x1c024863, // add r1, r1, r0 ; mov r3, ra_blk_height +/* [0x00002b20] */ 0xfffffe78, 0xf06809e7, // brr.anyn -, r:1b +/* [0x00002b28] */ 0x4f65039f, 0x18024862, // asr r1, r1, ra_wt_den_p7 ; mul24 r2, r3, rb_pitch +/* [0x00002b30] */ 0x925f23bf, 0x12020867, // min r1, r1, ra_pmax ; mov -, vw_wait +/* [0x00002b38] */ 0xf34003f3, 0xd2024c20, // max vpm, r1, 0 ; v8subs r0, ra_height, r3 +/* [0x00002b40] */ 0x956e7036, 0x10126431, // mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 +/* [0x00002b48] */ 0x00000000, 0xf027c9e7, // bra.anyz -, ra_link +/* [0x00002b50] */ 0x929dd0ff, 0x10024831, // min r0, r0, r3 ; mov vw_setup, rb_dma1 +/* [0x00002b58] */ 0x8d7270f6, 0x10024872, // sub r1, r0, r3 ; mov vw_addr, ra_dest +/* [0x00002b60] */ 0x119d73c0, 0xd0020867, // shl r1, r1, i_shift23 +/* [0x00002b68] */ 0xfffffe30, 0xf0f809e7, // brr -, r:1b +/* [0x00002b70] */ 0x0c9d2e00, 0x100214a7, // add rb_lcount, rb_lcount, r0 +/* [0x00002b78] */ 0x0c6e7c40, 0x100206e7, // add ra_dma0, ra_dma0, r1 +/* [0x00002b80] */ 0x8c71ccbf, 0x10024731, // add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init +// ::mc_filter_y10_b00 +/* [0x00002b88] */ 0xfffff8e0, 0xf0f807a7, // brr ra_link, r:per_block_setup_10 +/* [0x00002b90] */ 0x959a0ff6, 0x10024023, // mov ra0, unif ; mov r3, elem_num +/* [0x00002b98] */ 0xec9c3fd2, 0x100269e5, // add.setf -, rb_ef, rb_ef ; v8subs r5rep, r2, r2 +/* [0x00002ba0] */ 0x8c001cff, 0x14024800, // add r0, ra0.16b, r3 ; mov rb_xshift2, rb_xshift2_next +/* [0x00002ba8] */ 0x00000001, 0xe00208a7, // mov r2, 1 +/* [0x00002bb0] */ 0x8c591eb6, 0x10025461, // add rb_i_tmu, rb_i_tmu, r2 ; mov r1, ra_wt_off_mul_l0 +/* [0x00002bb8] */ 0xf158fded, 0xd4025325, // shl rb_wt_off, ra_wt_off_l0, DENOM + 8 ; v8subs r5quad, r5, r5 +/* [0x00002bc0] */ 0x809f8009, 0xd000d9d6, // nop ; mov.ifnz ra_wt_off_mul_l0, r1 << 8 +// :1 +/* [0x00002bc8] */ 0x0d9d1bc0, 0xb00229e7, // sub.setf -, r5, rb_i_tmu ; nop ; ldtmu1 +/* [0x00002bd0] */ 0x8e4c09f6, 0xa0029851, // shr r1, r4, rb_xshift2 ; mov.ifz ra_y_y2, ra_y_y2_next ; ldtmu0 +/* [0x00002bd8] */ 0x8e5509bf, 0x12024823, // shr r0, r4, ra_xshift ; mov r3, rb_pitch +/* [0x00002be0] */ 0x13440dc0, 0xd40208a7, // max r2, ra_y, 0 +/* [0x00002be8] */ 0x9269e5f6, 0x10029898, // min r2, r2, rb_max_y ; mov.ifz ra_base, ra_base_next +/* [0x00002bf0] */ 0x4c441dd3, 0xd4224462, // add ra_y, ra_y, 1 ; mul24 r2, r2, r3 +/* [0x00002bf8] */ 0x8c613cbf, 0x10028e0f, // add t0s, ra_base, r2 ; mov.ifz rb_base2, rb_base2_next +/* [0x00002c00] */ 0x13440dc0, 0xd20208a7, // max r2, ra_y2, 0 +/* [0x00002c08] */ 0x129de5c0, 0x100208a7, // min r2, r2, rb_max_y +/* [0x00002c10] */ 0x4c441dd3, 0xd2124462, // add ra_y2, ra_y2, 1 ; mul24 r2, r2, r3 +/* [0x00002c18] */ 0x8c5cfe86, 0x12024f20, // add t1s, rb_base2, r2 ; v8min r0, r0, ra_pmax +/* [0x00002c20] */ 0x545983c6, 0x12024860, // and r1, r1, rb_pmask ; mul24 r0, r0, ra_wt_mul_l0 +/* [0x00002c28] */ 0x4d492bce, 0x120269e1, // sub.setf -, r5, rb_lcount ; mul24 r1, r1, ra_wt_mul_l1 +/* [0x00002c30] */ 0xcc52706e, 0x1a024865, // add r1, r0, r1 ; v8adds r5rep, r5, ra_k1 +/* [0x00002c38] */ 0x915c83f6, 0xdc024863, // shl r1, r1, 8 ; mov r3, ra_blk_height +/* [0x00002c40] */ 0xec40c3f3, 0x12024860, // add r1, r1, rb_wt_off ; v8subs r0, ra_height, r3 +/* [0x00002c48] */ 0xffffff60, 0xf06809e7, // brr.anyn -, r:1b +/* [0x00002c50] */ 0x0f9d03c0, 0xd0020867, // asr r1, r1, (DENOM + 9) - 32 +/* [0x00002c58] */ 0x925f23bf, 0x12020867, // min r1, r1, ra_pmax ; mov -, vw_wait +/* [0x00002c60] */ 0x5351039f, 0x18024c22, // max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch +/* [0x00002c68] */ 0x956e7036, 0x10126431, // mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 +/* [0x00002c70] */ 0x00000000, 0xf027c9e7, // bra.anyz -, ra_link +/* [0x00002c78] */ 0x929dd0ff, 0x10024831, // min r0, r0, r3 ; mov vw_setup, rb_dma1 +/* [0x00002c80] */ 0x8d7270f6, 0x10024872, // sub r1, r0, r3 ; mov vw_addr, ra_dest +/* [0x00002c88] */ 0x119d73c0, 0xd0020867, // shl r1, r1, i_shift23 +/* [0x00002c90] */ 0xffffff18, 0xf0f809e7, // brr -, r:1b +/* [0x00002c98] */ 0x0c9d2e00, 0x100214a7, // add rb_lcount, rb_lcount, r0 +/* [0x00002ca0] */ 0x0c6e7c40, 0x100206e7, // add ra_dma0, ra_dma0, r1 +/* [0x00002ca8] */ 0x8c71ccbf, 0x10024731, // add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init +// ::mc_end +}; +#ifdef __HIGHC__ +#pragma Align_to(8, ff_hevc_rpi_shader) +#endif diff --git a/libavcodec/rpi_hevc_shader.h b/libavcodec/rpi_hevc_shader.h new file mode 100644 index 0000000000..79651c9b6c --- /dev/null +++ b/libavcodec/rpi_hevc_shader.h @@ -0,0 +1,63 @@ +#ifndef rpi_hevc_shader_H +#define rpi_hevc_shader_H + +extern unsigned int ff_hevc_rpi_shader[]; + +#define mc_setup_c_q0 (ff_hevc_rpi_shader + 0) +#define mc_start (ff_hevc_rpi_shader + 0) +#define mc_setup_c_qn (ff_hevc_rpi_shader + 2) +#define mc_filter_c_p (ff_hevc_rpi_shader + 134) +#define mc_filter_c_p_l1 (ff_hevc_rpi_shader + 260) +#define mc_filter_c_b (ff_hevc_rpi_shader + 386) +#define mc_sync_q0 (ff_hevc_rpi_shader + 580) +#define mc_sync_q1 (ff_hevc_rpi_shader + 598) +#define mc_sync_q2 (ff_hevc_rpi_shader + 610) +#define mc_sync_q3 (ff_hevc_rpi_shader + 622) +#define mc_sync_q4 (ff_hevc_rpi_shader + 634) +#define mc_sync_q5 (ff_hevc_rpi_shader + 652) +#define mc_sync_q6 (ff_hevc_rpi_shader + 664) +#define mc_sync_q7 (ff_hevc_rpi_shader + 676) +#define mc_sync_q8 (ff_hevc_rpi_shader + 688) +#define mc_sync_q9 (ff_hevc_rpi_shader + 706) +#define mc_sync_q10 (ff_hevc_rpi_shader + 718) +#define mc_sync_q11 (ff_hevc_rpi_shader + 730) +#define mc_exit_c_qn (ff_hevc_rpi_shader + 742) +#define mc_exit_y_qn (ff_hevc_rpi_shader + 742) +#define mc_exit_c_q0 (ff_hevc_rpi_shader + 760) +#define mc_exit_y_q0 (ff_hevc_rpi_shader + 760) +#define mc_setup_y_q0 (ff_hevc_rpi_shader + 780) +#define mc_setup_y_qn (ff_hevc_rpi_shader + 782) +#define mc_filter_y_pxx (ff_hevc_rpi_shader + 1014) +#define mc_filter_y_bxx (ff_hevc_rpi_shader + 1140) +#define mc_filter_y_p00 (ff_hevc_rpi_shader + 1272) +#define mc_filter_y_b00 (ff_hevc_rpi_shader + 1358) +#define mc_setup_c10_q0 (ff_hevc_rpi_shader + 1432) +#define mc_setup_c10_qn (ff_hevc_rpi_shader + 1434) +#define mc_filter_c10_p (ff_hevc_rpi_shader + 1562) +#define mc_filter_c10_p_l1 (ff_hevc_rpi_shader + 1684) +#define mc_filter_c10_b (ff_hevc_rpi_shader + 1806) +#define mc_sync10_q0 (ff_hevc_rpi_shader + 1996) +#define mc_sync10_q1 (ff_hevc_rpi_shader + 2014) +#define mc_sync10_q2 (ff_hevc_rpi_shader + 2026) +#define mc_sync10_q3 (ff_hevc_rpi_shader + 2038) +#define mc_sync10_q4 (ff_hevc_rpi_shader + 2050) +#define mc_sync10_q5 (ff_hevc_rpi_shader + 2068) +#define mc_sync10_q6 (ff_hevc_rpi_shader + 2080) +#define mc_sync10_q7 (ff_hevc_rpi_shader + 2092) +#define mc_sync10_q8 (ff_hevc_rpi_shader + 2104) +#define mc_sync10_q9 (ff_hevc_rpi_shader + 2122) +#define mc_sync10_q10 (ff_hevc_rpi_shader + 2134) +#define mc_sync10_q11 (ff_hevc_rpi_shader + 2146) +#define mc_exit_c10_q0 (ff_hevc_rpi_shader + 2158) +#define mc_exit_y10_q0 (ff_hevc_rpi_shader + 2158) +#define mc_exit_c10_qn (ff_hevc_rpi_shader + 2178) +#define mc_exit_y10_qn (ff_hevc_rpi_shader + 2178) +#define mc_setup_y10_q0 (ff_hevc_rpi_shader + 2196) +#define mc_setup_y10_qn (ff_hevc_rpi_shader + 2198) +#define mc_filter_y10_pxx (ff_hevc_rpi_shader + 2440) +#define mc_filter_y10_p00 (ff_hevc_rpi_shader + 2566) +#define mc_filter_y10_bxx (ff_hevc_rpi_shader + 2654) +#define mc_filter_y10_b00 (ff_hevc_rpi_shader + 2786) +#define mc_end (ff_hevc_rpi_shader + 2860) + +#endif diff --git a/libavcodec/rpi_hevc_shader.qasm b/libavcodec/rpi_hevc_shader.qasm new file mode 100644 index 0000000000..af5b59e181 --- /dev/null +++ b/libavcodec/rpi_hevc_shader.qasm @@ -0,0 +1,1850 @@ +# Copyright (c) 2017 Raspberry Pi (Trading) Ltd. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Written by Peter de Rivaz, John Cox + + + +# Inter pred asm +# +# Logic here should be good to 14 bits without modification +# but only 8 & 10 are currently instantiated & tested +# 15 & 16 bits have different shift1, shift2 calc & I also suspect overflow +# in _p00 & _b00 + +# The @ "mul_used", 0 annotations that occur by various mul blocks suppress +# the warning that we are using rotation & ra/rb registers. r0..3 can be +# rotated through all 16 elems ra regs can only be rotated through their +# local 4. As it happens this is what is wanted here as we do not want the +# constants from the other half of the calc. + +# Number limits in P/B calculation +# +# In order to avoid issues with mul24 being an unsigned 24->32 bit multiplier +# we offset our intermediates s.t. they always end up +ve before the next +# multiply (may be -ve whilst summing but that doesn't matter). +# +# Range calc for up to 14 bits (Y-B pred): +# +# denom: [0, 7] +# bmax = (1 << bits) - 1 +# off: [-(1 << (bits-1)), (1 << (bits-1)) - 1] +# +# wt_mul: [-128, 255] +# wt_off = off * 2 + 1: [-bmax, bmax] +# +# pel: [0, bmax] +# H-filter: [(-22*pel + 88*pel) >> (bits-8) + 0x4000] = [0x2a00, 0x97ff] +# V-filter: [(-22*hf + 88*hf) >> 6] = [0x580, 0xc28e] +# mul_t = (V_L0 + V_l1) * (wt_mul + 128): [0, 0x24624e6] +# mul_t - (V_l0 + V_l1)* 128: [-0xc28e00, 0x18396e4] +# adj_wt_off = (wt_off << ((denom + 6) - (bits - 8))) - 0x4000 * (wt_mul * 2): +# [wt_off << (21 - bits)] - [wt_mul << 15] = [-0x1fffff, 0x1fffff] - [-0x400000, 0x7f8000] +# +# This all looks good and is mostly bit depth independant - and as we manage +# to do unsigned multiplies everywhere (now) this should be good for any bit +# depth up to 14 (we could probably do 16 - but that requires a few tweaks +# to the shifts we don't currently have logic for) + +# PREREAD is the number of requests that we have sitting in the TMU request +# queue. +# +# There are 8 slots availible in the TMU request Q for tm0s requests, but +# only 4 output FIFO entries and overflow is bad (corruption or crash) +# (If threaded then only 2 out FIFO entries, but we aren't.) +# In s/w we are effectively limited to the min vertical read which is >= 4 +# so output FIFO is the limit. +# +# As the test for read-next is is the main part of the Luma loop (rather than +# the preload FIFO part) we are limited to min_luma_height - 1 +# Min_luma_height is 4 so we can only have a preload of 3 +# Beware that min_chroma_height (and_width) is 2 so we can't do the same trick +# in chroma without abandoning preload pretty much entirely (which would be bad) +# +# Timing tests vs preload of 4 suggests this doesn't hurt us much +# Could have preread 4 for Chroma but when tested it didn't help + +.set PREREAD, 3 + +# Offset added (effectively) at the exit of the H FIR filter +# This is enough to force the result +ve +# Is good if it is a power of 2 as that allows for >> without loss +# +# Worst case for a single Y FIR is *-22 so we need an offset of 256*22 +# But we need twice offset to survive both H & V = 256*22*2 = 0x2c00 +# Round up to next power of 2 + +.set FIR_OFFSET, 0x4000 + +# Block heights - 8 & 16 are the only numbers we currently support + +.set C_BLK_HEIGHT_8, 16 +.set C_BLK_HEIGHT_16, 8 +.set Y_BLK_HEIGHT_8, 16 +.set Y_BLK_HEIGHT_16, 8 + +# QPU counts - depend on block size +# If we have a 2-byte format & block_size > 8 then can only afford +# 8 QPUs +# These numbers must match the numbers in ff_hevc_rpi_shader_cmd.h + +.set N_QPU_8, 12 +.set N_QPU_16, 12 + +# Value to add to the weight multiplier to convert it into an unsigned value +# Should be power of two for convienience + +.set LOG2_MUL_ADD, 14 +.set MUL_ADD, (1 << LOG2_MUL_ADD) + +# Fixed denom (max that it can be set to) +.set DENOM, 7 + +# register allocation +# + +# ra0-3 +# Used as temp and may be loop filter coeffs (split into .8s) +# or temp in loop. Check usage on an individual basis. + +# ra4-11 +# V FIFO / temp / free + +# -- free -- ra12 + +# -- free -- ra13 + +# -- free -- ra14 + +# -- free -- ra15 + +# uniform: width:height +.set ra_width_height, ra16 +.set ra_width, ra16.16b +.set ra_height, ra16.16a + +# y:y2 same layout as y_y2_next so we can update both together +.set ra_y_y2, ra17 +.set ra_y2, ra17.16a +.set ra_y, ra17.16b + +# uniform: L1 weight (U on left, V on right) +# Only used in Y B +.set ra_wt_off_mul_l1, ra18 +.set ra_wt_off_l1, ra18.16b +.set ra_wt_mul_l1, ra18.16a + +# y_next:y2_next same layout as y_y2 so we can update both together +.set ra_y_y2_next, ra19 +.set ra_y_next, ra19.16b +.set ra_y2_next, ra19.16a + +# Setup: consts - subdivide a single register +.set ra_kff800100, ra20 +.set ra_k256, ra20.16a +.set ra_k0, ra20.8a +.set ra_k1, ra20.8b +.set ra_k128, ra20.8c +.set ra_k255, ra20.8d + +# Loop: xshifts +.set ra_xshift, ra21.16a +.set ra_xshift_next, ra21.16b + +# Loop var: L0 weight (U on left, V on right) +# _off_ is not used in loop as we want to modify it before use +.set ra_wt_off_mul_l0, ra22 +.set ra_wt_mul_l0, ra22.16a +.set ra_wt_off_l0, ra22.16b + +# Max pel value (for 8 bit we can get away with sat ops but not 9+) +# * Could merge with rb_pmask. For 10 bit Logically pmask needs 0xff in the +# 2nd byte but as the source should never be > 3 there 0x3ff should do +.set ra_blk_height_pmax, ra23 +.set ra_pmax, ra23.16a +.set ra_blk_height, ra23.8c +# --free -- ra23.8d + +# Loop: src frame base (L0) +.set ra_base, ra24 + +# Misc offsets +.set ra_fir_off_val_wt_den_p7, ra25 +.set ra_wt_den_p7, ra25.8a +# -- free -- ra25.8b +.set ra_fir_off_val, ra25.16b + +# As it happens these constants are the same +.if FIR_OFFSET == MUL_ADD +# Weight multiplier unsigned add +.set ra_kmul_add, ra_fir_off_val +.else +.error "FIR_OFFSET != MUL_ADD: Need new register & init" +.endif + +# Loop: next src frame base (L0) +.set ra_base_next, ra26 + +# Loop: height<<23 + width<<16 + vdw_setup_0 +.set ra_dma0, ra27 + +# Loop: destination address +.set ra_dest, ra28 + +# Setup: Dup of rb_ef +# Lo bits are used as Y coeff 0 as that lefts us combine test & coeff mul +# (top bits are ignored by mul24) +.set ra_ef, ra29 + +# Use an even numbered register as a link register to avoid corrupting flags +.set ra_link, ra30 + +# -- free -- ra31 + +.set rb_xshift2, rb0 +.set rb_xshift2_next, rb1 + +# C: (elem & 1) == 0 ? elem * 2 : (elem + 4) * 2 +.set rb_elem_x, rb2 + +# El Flags +# After adding to self we to have el even/odd on nc/c and lo/hi on nn/n +# Duped into ra_ef as sometimes that is easier to use +.set rb_ef, rb3 + +# rb4-11 +# Loop: V filter FIFO or V filter coeff + +# Loop var: offset to add before shift (round + weighting offsets) +# Exact value varies by loop +.set rb_wt_off, rb12 + +# -- free -- rb13 + +# -- free -- rb14 + +# Loop: src frame base (L1) +.set rb_base2, rb15 + +# Line pitch (128 for sand128) +.set rb_pitch, rb16 + +# Loop count - 2 (set up TMU for next xfer) +.set rb_i_tmu, rb17 + +# Loop count for min(height, 16) +# Y will reset & loop again if height > 16 +.set rb_lcount, rb18 + +# frame_base2_next +.set rb_base2_next, rb19 + +# Setup: Height of Y+C in sand, (x&mask)*xpitch will give +# offset to the slice +.set rb_xpitch, rb20 + +# These 3 consts each save 1 instruction in Y loop setup +# so whilst they are worthwhile they should be the 1st to die if we need +# another b reg +.set rb_y_coeffs_2, rb21 # 0x050b0a00 +.set rb_y_coeffs_3, rb22 # 0x11283a40 +.set rb_y_coeffs_5, rb23 # 0x0a0b0500 + +# Setup: 0xff (8-bit) / 0xffff (9+ bit) +.set rb_pmask, rb24 + +# vdw_setup_1(dst_pitch) +.set rb_dma1_base, rb25 + +# Setup: pic width - 1 +# In bytes so 8 bit luma is (width - 1)*1, 16 bit chroma is (width -1)*4 etc. +.set rb_max_x, rb26 + +# vdw_setup_0 (depends on QPU number) +.set rb_dma0_base, rb27 + +# Setup: vw_setup value to reset VPM write pointer +.set rb_vpm_init, rb28 + +# Loop: vdw_setup_1(dst_pitch-width) = stride +.set rb_dma1, rb29 + +# Setup: pic_height - 1 +.set rb_max_y, rb30 + +# Setup: FIR H offset +.set rb_fir_off_h, rb31 + + +# With shifts only the bottom 5 bits are considered so -16=16, -15=17 etc. +.set i_shift16, -16 +.set i_shift21, -11 +.set i_shift23, -9 +.set i_shift30, -2 + +# Much of the setup code is common between Y & C +# Macros that express this - obviously these can't be overlapped +# so are probably unsuitable for loop code + +.macro m_calc_dma_regs, v_bit_depth, v_blk_height, r_vpm, r_dma + mov r2, qpu_num +.if v_bit_depth <= 8 + # 8 bit version + asr r1, r2, 2 + shl r1, r1, 6 + and r0, r2, 3 + or r0, r0, r1 + + mov r1, vpm_setup(0, 4, h8p(0, 0)) # 4 is stride - stride acts on ADDR which is Y[5:0],B[1:0] for 8 bit + add r_vpm, r0, r1 # VPM 8bit storage + + mov r1, vdw_setup_0(0, 0, dma_h8p(0,0,0)) # height,width added later + shl r0, r0, 5 + +.else + # 16 bit version + # Limited to 8 QPUs if blk height > 8 + asr r1, r2, 1 +.if v_blk_height <= 8 + shl r1, r1, 4 +.else + shl r1, r1, 5 +.endif + and r0, r2, 1 + or r0, r0, r1 + + mov r1, vpm_setup(0, 2, h16p(0, 0)) # 2 is stride - stride acts on ADDR + add r_vpm, r0, r1 + + # X = H * 8 so the YH from VPMVCD_WR_SETUP[ADDR] drops into + # XY VPMVCD_WR_SETUP[VPMBASE] if shifted left 3 (+ 3 for pos of field in reg) + mov r1, vdw_setup_0(0, 0, dma_h16p(0,0,0)) # height,width added later + shl r0, r0, 6 +.endif + add r_dma, r0, r1 # DMA out +.endm + + +.macro m_setup_q0 + srel -, 12 +.endm + +# Code start label +::mc_start + +################################################################################ +# mc_setup_c +# +# typedef struct qpu_mc_pred_c_s_s { +# int16_t y; +# int16_t x; +# uint32_t base; +# uint32_t pic_cw; // C Width (== Y width / 2) +# uint32_t pic_ch; // C Height (== Y Height / 2) +# uint32_t stride2; +# uint32_t stride1; +# uint32_t wdenom; +# int16_t y2; +# int16_t x2; +# uint32_t base2; +# uint32_t next_fn; +# } qpu_mc_pred_c_s_t; + +.macro m_setup_c, v_bit_depth + +# Cannot use mul24 on x as x might be -ve, so must use shift +.if v_bit_depth <= 8 +.set v_x_shift, 1 +.set v_pmask, 0xff +.set v_blk_height, C_BLK_HEIGHT_8 +.else +.set v_x_shift, 2 +.set v_pmask, 0xffff +.set v_blk_height, C_BLK_HEIGHT_16 +.endif + + mov tmurs, 1 ; mov ra0, unif # No TMU swap ; x_y + + mov r0, [0,2,0,2,0,2,0,2,1,3,1,3,1,3,1,3] + shl rb_ef, r0, i_shift30 ; mov ra_base, unif # ; ref_c_base + +# Read image dimensions + sub r0, unif, 1 # pic c width + shl rb_max_x, r0, v_x_shift # rb_max_x in bytes + sub rb_max_y, unif, 1 # pic c height + +# load constants + mov ra_kff800100, 0xff800100 + mov rb_pmask, v_pmask + mov ra_blk_height_pmax, ((1 << v_bit_depth) - 1) | (v_blk_height << 16) + mov rb_fir_off_h, (FIR_OFFSET << (v_bit_depth - 8)) + mov ra_fir_off_val_wt_den_p7, (FIR_OFFSET << 16) | (DENOM + 15 - v_bit_depth) + +# get source pitch + mov ra_ef, rb_ef ; mov rb_xpitch, unif # ; stride2 + mov rb_pitch, unif # stride1 + mov r1, vdw_setup_1(0) # [rb_pitch delay] Merged with dst_stride shortly + add rb_dma1_base, r1, rb_pitch # vdw_setup_1 + + and r0, 1, elem_num + nop ; mul24 r0, r0, 5 +.if v_bit_depth <= 8 + add rb_elem_x, r0, elem_num +.else + add r0, r0, elem_num + add rb_elem_x, r0, r0 +.endif + +# Compute base address for first and second access +# ra_base ends up with t0s base +# ra_base2 ends up with t1s base + + shl r0, ra0.16b, v_x_shift # [rb_elem_x delay] + add r0, r0, rb_elem_x # Add elem no to x to get X for this slice + max r0, r0, 0 ; mov ra_y, ra0.16a # ; stash Y + min r0, r0, rb_max_x + +# Get shift +# Shift will always calculate as 0 for 9+ bit +# Ideally we can optimize the shift out of the code in these cases but for now +# it is tidier to leave it in +.if v_bit_depth <= 8 + shl ra_xshift_next, r0, 3 +.else + mov ra_xshift_next, 0 ; mov rb_xshift2_next, 0 +.endif + +# In a single 32 bit word we get 1 or 2 UV pairs so mask bottom bits of xs if we need to + +.if v_bit_depth <= 8 + and r0, r0, -4 +.endif + sub r1, ra_k0, rb_pitch + and r1, r0, r1 + xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch + add r0, r0, r1 ; mov ra0, unif # ; next_x2_y2 + add ra_base, ra_base, r0 + +# Compute part of VPM to use for DMA output +# * We only get 8 QPUs if 16 bit - maybe reduce height and auto-loop? + m_calc_dma_regs v_bit_depth, v_blk_height, rb_vpm_init, rb_dma0_base + +# And again for L1, but only worrying about frame2 stuff + +# Compute base address for first and second access +# ra_base ends up with t0s base +# rb_base2 ends up with t1s base + + shl r0, ra0.16b, v_x_shift + add r0, r0, rb_elem_x ; mov ra_y2, ra0.16a # Add QPU slice offset + max r0, r0, 0 ; mov rb_base2, unif # ref_c_base2 + min r0, r0, rb_max_x + +# Get shift (already zero if 9+ bit so ignore) +.if v_bit_depth <= 8 + shl rb_xshift2_next, r0, 3 +.endif + +# In a single 32 bit word we get 2 UV pairs so mask bottom bit of xs + +.if v_bit_depth <= 8 + and r0, r0, -4 +.endif + sub r1, ra_k0, rb_pitch + and r1, r0, r1 ; mov r3, PREREAD + xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch + add r0, r0, r1 ; mov r2, ra_y2 + add rb_base2, rb_base2, r0 ; mov r0, ra_y + +# Do preloads +# r0 = ra_y, r2 = ra_y2, r3 = PREREAD + +:1 + sub.setf r3, r3, 1 + max r1, r0, 0 + min r1, r1, rb_max_y + add r0, r0, ra_k1 ; mul24 r1, r1, rb_pitch + add t0s, ra_base, r1 ; mov ra_y, r0 + + max r1, r2, 0 + brr.anynz -, r:1b + min r1, r1, rb_max_y + add r2, r2, ra_k1 ; mul24 r1, r1, rb_pitch + add t1s, rb_base2, r1 ; mov ra_y2, r2 +# >>> .anynz 1b + + mov ra_link, unif # link +# touch registers to keep simulator happy (and fills in delay slots) + mov ra4, 0 ; mov rb4, 0 + bra -, ra_link + mov ra5, 0 ; mov rb5, 0 + mov ra6, 0 ; mov rb6, 0 + mov ra7, 0 ; mov rb7, 0 +# >>> ra_link +.endm + +::mc_setup_c_q0 + m_setup_q0 +::mc_setup_c_qn + m_setup_c 8 + +################################################################################ +# +# mc_filter_c_p +# +# typedef struct qpu_mc_pred_c_p_s { +# int16_t y; +# int16_t x; +# uint32_t base; +# uint16_t h; +# uint16_t w; +# uint32_t coeffs_x; +# uint32_t coeffs_y; +# uint32_t wo_u; +# uint32_t wo_v; +# uint32_t dst_addr_c; +# uint32_t next_fn; +# } qpu_mc_pred_c_p_t; + +.macro m_filter_c_p, v_tmu, v_bit_depth + +.if v_bit_depth <= 8 +.set v_x_shift, 1 +.set v_x_mul, 2 +.set v_v_shift, 8 +# Shifts to get width & height in the right place in rb_dma0 +.set v_dma_h_shift, 7 +.set v_dma_wh_shift, i_shift16 +.else +.set v_x_shift, 2 +.set v_x_mul, 4 +.set v_v_shift, i_shift16 +# Shifts to get width & height in the right place in rb_dma0 +.set v_dma_h_shift, 8 +.set v_dma_wh_shift, 15 +.endif + +.if v_tmu == 0 +.set vrx_xshift, rb_xshift2 # b side more convienient +.set vrx_xshift_next, ra_xshift_next +.set vra_y_next, ra_y_next +.set vrx_base_next, ra_base_next +.set vra_y, ra_y +.set vra_base, ra_base +.set vr_txs, t0s +.else +.set vrx_xshift, ra_xshift # a side more convienient +.set vrx_xshift_next, rb_xshift2_next +.set vra_y_next, ra_y2_next +.set vrx_base_next, rb_base2_next +.set vra_y, ra_y2 +.set vra_base, rb_base2 +.set vr_txs, t1s +.endif + +# denom shift values +.set i_wt_den_p5, (DENOM + 13 - v_bit_depth) +.set i_wt_den_p6, (DENOM + 14 - v_bit_depth) + +# per-channel shifts were calculated on the *previous* invocation +# get base addresses and per-channel shifts for *next* invocation + mov vw_setup, rb_vpm_init ; mov ra2, unif # ; x_y + + add.setf -, rb_ef, rb_ef ; mov r3, unif # [ra2 delay] ; base + + shl r0, ra2.16b, v_x_shift ; v8subs r5rep, r0, r0 # r5 = 0 + add r0, r0, rb_elem_x ; mov ra_width_height, unif # r1=pitch2 mask ; width_height + sub r1, r5, rb_pitch ; mov ra0, unif # ; H filter coeffs + max r0, r0, r5 ; mov vrx_xshift, vrx_xshift_next + min r0, r0, rb_max_x ; mov vra_y_next, ra2.16a + +.if v_bit_depth <= 8 + shl vrx_xshift_next, r0, 3 + and r0, r0, -4 +.endif + and r1, r0, r1 ; mul24 r2, ra_width, v_x_mul # r2=w*2 (we are working in pel pairs) ** x*2 already calced! + xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch + add r0, r0, r1 ; mov ra3, unif # ; V filter coeffs + add vrx_base_next, r3, r0 ; mov r1, ra_height + +# set up VPM write + sub rb_dma1, rb_dma1_base, r2 ; mov ra_wt_off_mul_l0, unif # Compute vdw_setup1(dst_pitch-width) ; U offset/weight + add rb_i_tmu, r1, (3-4) - PREREAD ; v8min r1, r1, ra_blk_height + add rb_lcount, r1, (3-4) ; mov.ifc ra_wt_off_mul_l0, unif # ; V offset/weight + +# Misc final setup... + + shl r0, r1, v_dma_h_shift ; mov ra_dest, unif # ; dst_addr + add r0, r0, r2 ; mov r2, ra_fir_off_val # Combine width and height of destination area (r0=h<<8, r2=w*2) + shl r0, r0, v_dma_wh_shift ; mov rb10, ra3.8c # Shift into bits 16 upwards of the vdw_setup0 register + add ra_dma0, r0, rb_dma0_base ; mov r1, ra_wt_off_l0 # ; r1=weight + shl r1, r1, i_wt_den_p5 ; mul24 r0, r2, ra_wt_mul_l0 + sub rb_wt_off, r1, r0 ; mov r0, ra_kmul_add + add ra_wt_mul_l0, ra_wt_mul_l0, r0 ; mov r5rep, -4 # ; loop counter (V FIFO fill = 4) + mov rb11, ra3.8d ; mov ra_link, unif # ; Link + +# r5 = -4 (loop counter) +# ra_wt_mul_l0 = weight L0 + 128 (now unsigned) +# rb_wt_off = (offset * 2 + 1) << (wt_den + 5) +# rb31 = FIR value offset + +# FIFO: rb4, ra5, rb6, ra7 +# Coeffs in ra3.8a, ra3.8b, rb10, rb11 + +# We want (r0r1) +# U0U3 : V0V3 : U1U4 : V1V4 : U2U5 : V2U5 : ... +# We fetch (after shift) +# C0 : C3 : C1 : C4 : C2 : C5 : ... + +:1 +# retrieve texture results and pick out bytes +# then submit two more texture requests + +.if v_tmu == 0 + sub.setf -, r5, rb_i_tmu ; mov rb4, ra5 ; ldtmu0 + shr r2, r4, vrx_xshift ; mov.ifz r3, vra_y_next + shr r1, r2, v_v_shift ; mov.ifnz r3, vra_y + add.setf -, rb_ef, rb_ef ; mov.ifz vra_base, vrx_base_next +.else + sub.setf -, r5, rb_i_tmu ; mov rb4, ra5 ; ldtmu1 + shr r2, r4, vrx_xshift ; mov.ifz vra_base, vrx_base_next + shr r1, r2, v_v_shift ; mov.ifnz r3, vra_y + add.setf -, rb_ef, rb_ef ; mov.ifz r3, vra_y_next # [r1 << delay] +.endif + + add vra_y, r3, ra_k1 ; mov r0, r1 << 15 + max r3, r3, ra_k0 ; mov.ifnc r1, r2 << 1 + min r3, r3, rb_max_y ; mov.ifnc r0, r2 + + and r1, r1, ra_pmax ; mul24 r3, r3, rb_pitch +.if v_tmu == 0 + add vr_txs, vra_base, r3 ; v8min r0, r0, rb_pmask # ; mask bytes +.else + add vr_txs, vra_base, r3 ; v8min r0, r0, ra_pmax # ; mask bytes +.endif + +# apply horizontal filter +# The filter coeffs for the two halves of this are the same (unlike in the +# Y case) so it doesn't matter which ra0 we get them from +# Also as the two halves are locked together we don't need to separate the 1st +# r0 mul or the last r1 mul as they are valid for all QPUs + + add r5rep, r5, 1 ; mul24 r3, ra0.8a, r0 + sub r2, rb_fir_off_h, r3 ; mul24 r3, ra0.8d, r1 + sub r2, r2, r3 ; mul24 r3, ra0.8b << 2, r0 << 2 @ "mul_used", 0 + nop ; mul24.ifn r3, ra0.8b << 12, r1 << 12 @ "mul_used", 0 + add r2, r2, r3 ; mul24 r3, ra0.8c << 4, r0 << 4 @ "mul_used", 0 + add.setf -, r5, r5 ; mul24.ifn r3, ra0.8c << 14, r1 << 14 @ "mul_used", 0 + +# V filter = - r4 * a + r5 * b + r6 * c - r7 * d (post FIFO shift) +# We would like to save the r5->r4 shift but we need a delay slot +# for both r7 & r6 which we can't find anything to put in if we have +# already multiplied r4 & r5! + brr.anyn -, r:1b + add r2, r2, r3 ; mul24 r0, ra7, rb10 # r6 post + mov ra5, rb6 ; mul24 r1, rb6, ra3.8b # r5 post + asr ra7, r2, v_bit_depth - 8 ; mov rb6, ra7 +# >>> .anyn 1b + + add r1, r1, r0 ; mul24 r0, rb4, ra3.8a # [ra7 delay] + sub r1, r1, r0 ; mul24 r0, ra7, rb11 + sub r1, r1, r0 + + asr r1, r1, 6 ; mov r3, ra_blk_height # ; NxtLoop + sub.setf -, r5, rb_lcount ; mul24 r0, r1, ra_wt_mul_l0 + add r0, r0, rb_wt_off ; mul24 r1, r1, ra_kmul_add + sub r1, r0, r1 ; v8subs r0, ra_height, r3 # ; NxtLoop + brr.anyn -, r:1b + asr r1, r1, i_wt_den_p6 + min r1, r1, ra_pmax ; mov -, vw_wait + max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch # ; NxtLoop +# >>> .anyn 1b + +# r0 = remaining height (min 0) +# r2 = r3 * rb_pitch +# r3 = block_height + +# If looping again then we consumed 16 height last loop +# rb_dma1 (stride) remains constant +# rb_i_tmu remains const (based on total height) +# recalc ra_dma0, rb_lcount based on new segment height + + mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 # VDW setup 0 + +# DMA out + bra.anyz -, ra_link + min r0, r0, r3 ; mov vw_setup, rb_dma1 # Stride + sub r1, r0, r3 ; mov vw_addr, ra_dest # start the VDW + shl r1, r1, i_shift23 +# >>> .anyz ra_link + +# Here r1 = cur_blk_height - 16 so it will be 0 or -ve +# We add to dma0 to reduce the number of output lines in the final block + brr -, r:1b + add rb_lcount, rb_lcount, r0 + add ra_dma0, ra_dma0, r1 + add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init # ; Reset our VDM write pointer +# >>> 1b +.endm + +::mc_filter_c_p + m_filter_c_p 0, 8 + +::mc_filter_c_p_l1 + m_filter_c_p 1, 8 + +################################################################################ +# +# mc_filter_c_b +# +# typedef struct qpu_mc_pred_c_b_s { +# int16_t y; +# int16_t x; +# uint32_t base; +# uint16_t h; +# uint16_t w; +# uint32_t coeffs_x1; +# uint32_t coeffs_y1; +# int16_t weight_u1; +# int16_t weight_v1; +# int16_t y2; +# int16_t x2; +# uint32_t base2; +# uint32_t coeffs_x2; +# uint32_t coeffs_y2; +# uint32_t wo_u2; +# uint32_t wo_v2; +# uint32_t dst_addr_c; +# uint32_t next_fn; +# } qpu_mc_pred_c_b_t; + +.macro m_filter_c_b, v_bit_depth + +.if v_bit_depth <= 8 +.set v_x_shift, 1 +.set v_v_shift, 8 +# Shifts to get width & height in the right place in ra_dma0 +.set v_dma_h_shift, 7 +.set v_dma_wh_shift, i_shift16 +.else +.set v_x_shift, 2 +.set v_v_shift, i_shift16 +# Shifts to get width & height in the right place in ra_dma0 +.set v_dma_h_shift, 8 +.set v_dma_wh_shift, 15 +.endif +.set v_x_mul, (1 << v_x_shift) + +# denom shift values +.set i_wt_den_p5, (DENOM + 13 - v_bit_depth) +.set i_wt_den_p6, (DENOM + 14 - v_bit_depth) + +# per-channel shifts were calculated on the *previous* invocation + +# get base addresses and per-channel shifts for *next* invocation + mov vw_setup, rb_vpm_init ; mov ra2, unif # ; x_y + + add.setf -, rb_ef, rb_ef ; mov r3, unif # [ra2 delay] ; r3=base + + shl r0, ra2.16b, v_x_shift ; v8subs r5rep, r1, r1 # x ; r5=0 + add r0, r0, rb_elem_x ; mov ra_y_next, ra2.16a + sub r1, r5, rb_pitch ; mov ra_width_height, unif # r1=pitch2 mask ; width_height + max r0, r0, r5 ; mov ra_xshift, ra_xshift_next + min r0, r0, rb_max_x ; mov ra0, unif # ; L0 H filter coeffs + +.if v_bit_depth <= 8 + shl ra_xshift_next, r0, 3 +.endif + + and r0, r0, -4 ; mov ra2, unif # ; L0 V filter coeffs + and r1, r0, r1 ; mul24 r2, ra_width, v_x_mul # r2=x*2 (we are working in pel pairs) + xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch + add r0, r0, r1 ; mov r1, ra_height # Add stripe offsets ; r1=height + add ra_base_next, r3, r0 ; mov rb_xshift2, rb_xshift2_next # ; xshift2 used because B + +# set up VPM write + + sub rb_dma1, rb_dma1_base, r2 ; mov ra_wt_off_mul_l0, unif # Compute vdw_setup1(dst_pitch-width) ; U weight + add rb_i_tmu, r1, (3-4) - PREREAD ; v8min r1, r1, ra_blk_height + add rb_lcount, r1, (3-4) ; mov.ifc ra_wt_mul_l0, ra_wt_off_l0 # ; V weight + + shl r0, r1, v_dma_h_shift ; mov ra3, unif # ; x2_y2 + add r0, r0, r2 ; mov r3, unif # [ra3 delay] ; base + shl r0, r0, v_dma_wh_shift ; mov ra_y2_next, ra3.16a # Shift into bits 16 upwards of the vdw_setup0 register + add ra_dma0, r0, rb_dma0_base ; mov r0, ra3.16b # r0=x + +# L1 - uniform layout could possibly be optimized + + shl r0, r0, v_x_shift ; mov ra1, unif # r0=x<>> .anyn 1b + + sub r2, r1, r0 ; mul24 r1, rb5, ra2.8b # L1 ; L0 + sub.setf -, r5, rb_lcount ; mov r0, ra4 + sub r1, r1, r0 ; mul24 r0, rb6, ra2.8c + add r1, r1, r0 ; mul24 r0, ra7, rb7 + + sub r1, r1, r0 ; mul24 r0, rb10, ra3.8c # L1 + add r2, r2, r0 ; mul24 r0, ra11, rb11 # L1 + sub r2, r2, r0 + + shr r1, r1, 6 + shr r2, r2, 6 ; mul24 r0, r1, ra_wt_mul_l0 + add r2, r2, r1 ; mul24 r1, r2, ra_wt_mul_l1 + add r1, r1, r0 ; mul24 r2, r2, ra_kmul_add + sub r1, r1, r2 ; mov r3, ra_blk_height # ; NxtLoop + add r1, r1, rb_wt_off ; v8subs r0, ra_height, r3 # ; NxtLoop + + brr.anyn -, r:1b + asr r1, r1, ra_wt_den_p7 + min r1, r1, ra_pmax ; mov -, vw_wait + max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch # ; NxtLoop +# >>> .anyn 1b + +# r0 = remaining height (min 0) +# r2 = r3 * rb_pitch +# r3 = block_height + +# If looping again then we consumed 16 height last loop +# rb_dma1 (stride) remains constant +# rb_i_tmu remains const (based on total height) +# recalc ra_dma0, rb_lcount based on new segment height + + mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 # ; VDW setup 0 + +# DMA out + bra.anyz -, ra_link + min r0, r0, r3 ; mov vw_setup, rb_dma1 # ; Stride + sub r1, r0, r3 ; mov vw_addr, ra_dest # ; start the VDW + shl r1, r1, i_shift23 +# >>> .anyz ra_link + +# Here r1 = cur_blk_height - 16 so it will be 0 or -ve +# We add to dma0 to reduce the number of output lines in the final block + brr -, r:1b + add rb_lcount, rb_lcount, r0 + add ra_dma0, ra_dma0, r1 + add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init # ; Reset our VDM write pointer +# >>> 1b +.endm + +::mc_filter_c_b + m_filter_c_b 8 + +################################################################################ +# Exit code used by both Luma & Chroma so place between them to avoid I-cache +# conflicts + +.macro m_exit_drain +.if PREREAD == 2 +# Special case 2 as loop is wasteful + nop ; nop ; ldtmu0 + nop ; nop ; ldtmu1 + nop ; nop ; ldtmu0 + mov -, vw_wait ; nop ; ldtmu1 +.else + mov.setf r3, PREREAD - 1 +:1 + brr.anynz -, r:1b + nop ; nop ; ldtmu0 + nop ; nop ; ldtmu1 + sub.setf r3, r3, 1 + # >>> + mov -, vw_wait +.endif +.endm + +# This sync layout groups QPUs 0-3, 4-7, 8-11 (i.e. 1 group per TMU pair) +# All qpus start at the beginning and after that (group - 1) must have finished +# before (group) can start +# +# Requires setup code for QPU 0 to srel sem 12 (m_setup_q0) to start the chain +# Exit code will sacq sem 12 so everything is @ 0 on exit (this is important - +# lockup otherwise) +# +# There is some, currently ill defined, potential lockup if we have the VDM active +# whilst doing sem stuff so we wait first. ?? QPU stall from sem stalls VDM pipe too ?? +# +# The code stalled when I had many waiters on a single sem so we have a +# "ripple" of srels to restart. Unsure why, may have been bug, but this works +# and we currently have both the memory & sems to support it. +.macro m_sync_q, n_qpu, n_quads +# Do not generate code for qpu >= quads * 4 - fns should never be called +.if n_qpu < n_quads * 4 + mov ra_link, unif # Can only branch to an a reg (not r0) + mov -, vw_wait # [ra_link delay] + +.set n_sem_sync, n_qpu - (n_qpu % 4) +.set n_sem_in, n_qpu +.set n_sem_out, n_qpu + 1 + +.if n_qpu % 4 == 0 + +.set n_sem_quad_in, 12 + n_qpu / 4 +.set n_sem_quad_out, 12 + (((n_qpu / 4) + 1) % n_quads) + + sacq -, n_sem_sync + sacq -, n_sem_sync + sacq -, n_sem_sync + bra -, ra_link + sacq -, n_sem_quad_in + srel -, n_sem_out + srel -, n_sem_quad_out + +.else + bra -, ra_link + srel -, n_sem_sync + sacq -, n_sem_in +.if n_sem_out % 4 != 0 + srel -, n_sem_out +.else + nop +.endif +.endif +.endif +.endm + +.set v_quads8, N_QPU_8 / 4 + +::mc_sync_q0 + m_sync_q 0, v_quads8 +::mc_sync_q1 + m_sync_q 1, v_quads8 +::mc_sync_q2 + m_sync_q 2, v_quads8 +::mc_sync_q3 + m_sync_q 3, v_quads8 +::mc_sync_q4 + m_sync_q 4, v_quads8 +::mc_sync_q5 + m_sync_q 5, v_quads8 +::mc_sync_q6 + m_sync_q 6, v_quads8 +::mc_sync_q7 + m_sync_q 7, v_quads8 +::mc_sync_q8 + m_sync_q 8, v_quads8 +::mc_sync_q9 + m_sync_q 9, v_quads8 +::mc_sync_q10 + m_sync_q 10, v_quads8 +::mc_sync_q11 + m_sync_q 11, v_quads8 + +# mc_exit() +# Chroma & Luma the same now + +.macro m_exit_qn + m_exit_drain + nop ; nop ; thrend + nop + nop +# >>> thrend <<< +.endm + +::mc_exit_c_qn +::mc_exit_y_qn + m_exit_qn + + + +# mc_interrupt_exit12() + +.macro m_exit_q0 + m_exit_drain + sacq -, 12 + nop ; nop ; thrend + mov interrupt, 1 + nop +# >>> thrend <<< +.endm + +::mc_exit_c_q0 +::mc_exit_y_q0 + m_exit_q0 + +# LUMA CODE + +# The idea is to form B predictions by doing 8 pixels from ref0 in parallel with 8 pixels from ref1. +# For P frames we make the second x,y coordinates offset by +8 + + +################################################################################ +# mc_setup +# +# typedef struct qpu_mc_pred_y_s_s { +# qpu_mc_src_t next_src1; +# qpu_mc_src_t next_src2; +# uint16_t pic_h; +# uint16_t pic_w; +# uint32_t stride2; +# uint32_t stride1; +# uint32_t wdenom; +# uint32_t next_fn; +# } qpu_mc_pred_y_s_t; + +.macro m_setup_y, v_bit_depth + +# Cannot use mul24 on x as x might be -ve, so must use shift +.if v_bit_depth <= 8 +.set v_x_shift, 0 +.set v_pmask, 0xff +.set v_blk_height, Y_BLK_HEIGHT_8 +.else +.set v_x_shift, 1 +.set v_pmask, 0xffff +.set v_blk_height, Y_BLK_HEIGHT_16 +.endif + + + # Need to save these because we need to know the frame dimensions before computing texture coordinates + mov tmurs, 1 ; mov ra0, unif # No TMU swap ; x_y + mov ra9, unif # ref_y_base + mov ra1, unif # x2_y2 + + +# load constants + mov r0, [0,2,0,2,0,2,0,2,1,3,1,3,1,3,1,3] + shl rb_ef, r0, i_shift30 ; mov ra11, unif # ; ref_y2_base + + mov ra_kff800100, 0xff800100 + mov rb_pmask, v_pmask + mov ra_blk_height_pmax, ((1 << v_bit_depth) - 1) | (v_blk_height << 16) + mov rb_fir_off_h, (FIR_OFFSET << (v_bit_depth - 8)) + mov ra_fir_off_val_wt_den_p7, (FIR_OFFSET << 16) | (DENOM + 15 - v_bit_depth) + mov rb_y_coeffs_2, 0x050b0a00 + mov rb_y_coeffs_3, 0x11283a40 + mov rb_y_coeffs_5, 0x0a0b0500 + +# Compute part of VPM to use + +# Read image dimensions + mov ra3, unif # width_height + mov ra_ef, rb_ef ; mov rb_xpitch, unif # [ra3 delay] ; stride2 +.if v_x_shift == 0 + sub rb_max_x, ra3.16b, 1 +.else + sub r0, ra3.16b, 1 + shl rb_max_x, r0, v_x_shift +.endif + sub rb_max_y, ra3.16a, 1 + mov r3, elem_num ; mov rb_pitch, unif # stride1 + +# get destination pitch + mov r1, vdw_setup_1(0) # [rb_pitch delay] + or rb_dma1_base, r1, rb_pitch + +# Compute base address for first and second access + add r0, ra0.16b, r3 # Load x + elem_num +.if v_x_shift != 0 + shl r0, r0, v_x_shift +.endif + max r0, r0, 0 + min r0, r0, rb_max_x + shl ra_xshift_next, r0, 3 # Compute shifts + +# X is byte offset - we can only load words - mask + + and r0, r0, -4 ; v8subs r2, r2, r2 + sub r2, r2, rb_pitch + and r1, r0, r2 + xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch + add r0, r0, r1 # Add stripe offsets + add ra_base, ra9, r0 + + # r3 still contains elem_num + add r0, ra1.16b, r3 # Load x +.if v_x_shift != 0 + shl r0, r0, v_x_shift +.endif + max r0, r0, 0 + min r0, r0, rb_max_x + shl rb_xshift2_next, r0, 3 # Compute shifts + + # r2 still contains mask + and r0, r0, -4 + and r1, r0, r2 + xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch + add r0, r0, r1 # Add stripe offsets + add rb_base2, ra11, r0 + +# Do preloads + nop ; mov r0, ra0.16a # ; r0 = y + mov r3, PREREAD ; mov r2, ra1.16a # ; r2 = y2 + +:1 + sub.setf r3, r3, 1 + max r1, r0, 0 + min r1, r1, rb_max_y + add r0, r0, ra_k1 ; mul24 r1, r1, rb_pitch + add t0s, ra_base, r1 ; mov ra_y, r0 + + max r1, r2, 0 + brr.anynz -, r:1b + min r1, r1, rb_max_y + add r2, r2, ra_k1 ; mul24 r1, r1, rb_pitch + add t1s, rb_base2, r1 ; mov ra_y2, r2 +# >>> .anynz 1b + + m_calc_dma_regs v_bit_depth, v_blk_height, rb_vpm_init, rb_dma0_base + + mov ra_link, unif # Next fn + +# touch vertical context to keep simulator happy + mov ra8, 0 ; mov rb8, 0 # [ra_link delay] + bra -, ra_link + mov ra9, 0 ; mov rb9, 0 + mov ra10, 0 ; mov rb10, 0 + mov ra11, 0 ; mov rb11, 0 +# >>> ra_link +.endm + +::mc_setup_y_q0 + m_setup_q0 +::mc_setup_y_qn + m_setup_y 8 + +################################################################################ +# +# Start of per-block setup code +# P and B blocks share the same setup code to save on Icache space + +# get base addresses and per-channel shifts for *next* invocation +# per-channel shifts were calculated on the *previous* invocation + +# 1st 3 instructions of per_block-setup in branch delay +# +# typedef struct qpu_mc_pred_y_p_s { +# qpu_mc_src_t next_src1; +# qpu_mc_src_t next_src2; +# uint16_t h; +# uint16_t w; +# uint32_t mymx21; +# uint32_t wo1; +# uint32_t wo2; +# uint32_t dst_addr; +# uint32_t next_fn; +# } qpu_mc_pred_y_p_t; +# + +.macro m_luma_setup, v_bit_depth +# Hack - QASM may well have have label pasting but I have no idea how... +.if v_bit_depth == 8 + brr ra_link, r:per_block_setup_8 +.elif v_bit_depth == 10 + brr ra_link, r:per_block_setup_10 +.endif + mov ra0, unif ; mov r3, elem_num # y_x ; elem_num has implicit unpack?? + add.setf -, rb_ef, rb_ef ; v8subs r5rep, r2, r2 # [ra0 delay] ; r5 = 0 + add r0, ra0.16b, r3 ; mov rb_xshift2, rb_xshift2_next +.endm + +.macro m_per_block_setup, v_bit_depth + +.if v_bit_depth <= 8 +.set v_x_shift, 0 +.set v_x_mul, 1 +# Shifts to get width & height in the right place in ra_dma0 +.set v_dma_h_shift, 7 +.set v_dma_wh_shift, i_shift16 +.else +.set v_x_shift, 1 +.set v_x_mul, 2 +# Shifts to get width & height in the right place in ra_dma0 +.set v_dma_h_shift, 8 +.set v_dma_wh_shift, 15 +.endif + +.if v_x_shift != 0 + shl r0, r0, v_x_shift +.endif + max r0, r0, r5 ; mov ra_xshift, ra_xshift_next + min r0, r0, rb_max_x + + shl ra_xshift_next, r0, 3 # Compute shifts + and r0, r0, -4 + sub r2, r5, rb_pitch ; mov ra_base_next, unif # ; src1.base + and r1, r0, r2 ; mov ra_y_next, ra0.16a + xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch + add r0, r0, r1 ; mov ra1, unif # Add stripe offsets ; src2.x_y + add ra_base_next, ra_base_next, r0 # [ra1 delay] + + add r0, ra1.16b, r3 # Load x2 +.if v_x_shift != 0 + shl r0, r0, v_x_shift +.endif + max r0, r0, r5 ; mov ra_y2_next, ra1.16a + min r0, r0, rb_max_x ; mov rb_base2_next, unif # ; src2.base + shl rb_xshift2_next, r0, 3 # Compute shifts + and r0, r0, -4 ; mov ra_width_height, unif # ; width_height + and r1, r0, r2 ; mov vw_setup, rb_vpm_init # ; set up VPM write + xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch + add r0, r0, r1 ; mul24 r1, ra_width, v_x_mul # Add stripe offsets ; r1 = x in bytes + add rb_base2_next, rb_base2_next, r0 + +# get width,height of block (unif load above), r1 = width * pel_size + sub rb_dma1, rb_dma1_base, r1 ; mov r0, ra_height # Compute vdw_setup1(dst_pitch-width) + add rb_i_tmu, r0, (7-8) - PREREAD ; v8min r0, r0, ra_blk_height + add rb_lcount, r0, (7-8) + shl r0, r0, v_dma_h_shift ; mov r3, ra_kmul_add # ; r3 return val + add r0, r0, r1 # Combine width and height of destination area + shl r0, r0, v_dma_wh_shift ; mov r2, ra_fir_off_val # Shift into bits 16 upwards of the vdw_setup0 register ; r2 return val + add ra_dma0, r0, rb_dma0_base ; mov r0, unif # ; Packed filter offsets + +# get filter coefficients and discard unused B frame values + shl.ifnn r0, r0, i_shift16 ; mov ra_wt_off_mul_l0, unif # Pick half to use ; L0 offset/weight + shl ra8, r0, 3 ; mov rb5, ra_k255 + +# Coeffs are all abs values here as that means mul24 works (no sign extend from .8) + +# 2nd half coeffs same as first if we can swap 8<->24 in the rotate val +# but I can't see a way of doing that that is cheap enough to be worth it + +# Picked out in a slightly random order to space out uniform loads + + # 1 + mov r1, 0x01040400 # [ra8 delay] + ror ra2.8b, r1, ra8.8d + ror ra0.8b, r1, ra8.8c + # 2 + ror ra2.8c, rb_y_coeffs_2, ra8.8d + ror ra0.8c, rb_y_coeffs_2, ra8.8c + # 0 + mov r1,0x00010100 # -ve [ra8 delay] + ror r0, r1, ra8.8d ; mov ra_wt_off_mul_l1, unif # ; L1 Wt/Offset + ror ra0.8a, r1, ra8.8c ; v8min rb4, r0, rb5 + # 7 + shl r1, r1, 8 ; mov.ifn ra_wt_off_mul_l0, ra_wt_off_mul_l1 # r1 = 0x01010000 + ror r0, r1, ra8.8d ; mov ra_dest, unif # ; Destination address + ror ra1.8d, r1, ra8.8c ; v8min rb11, r0, rb5 + # 3 + ror ra2.8d, rb_y_coeffs_3, ra8.8d + ror ra0.8d, rb_y_coeffs_3, ra8.8c + # 5 + ror ra3.8b, rb_y_coeffs_5, ra8.8d + ror ra1.8b, rb_y_coeffs_5, ra8.8c + # 6 + mov r1,0x04040100 + ror ra3.8c, r1, ra8.8d + ror ra1.8c, r1, ra8.8c ; mov r5rep, -8 # ; r5 return val + + bra -, ra_link + # 4 + mov r1,0x3a281100 + ror r0, r1, ra8.8d ; mov ra_link, unif # ; link - load after we've used its previous val + ror ra1.8a, r1, ra8.8c ; v8min rb8, r0, rb5 +# >>> branch ra_link + +# r5 = -8 +# r2 = fir_off_val +# r3 = 128 +.endm + +:per_block_setup_8 + m_per_block_setup 8 + + + +################################################################################ +# +# mc_filter_y_pxx +# +# Setup (& therefore uniform struct) shared with _bxx +# Struct in m_luma_setup +# +# We can have 2 separate P reqs here as long as they mate to generate a +# rectangular output block (i.e. h0 = h1, w0 = 8) +# +# At this point we have already issued PREREAD pairs of texture requests for the current block + +.macro m_filter_y_pxx, v_bit_depth + +# denom shift values +.set i_wt_den_p5, (DENOM + 13 - v_bit_depth) +.set i_wt_den_p6, (DENOM + 14 - v_bit_depth) + + m_luma_setup v_bit_depth + + shl r1, ra_wt_off_l0, i_wt_den_p5 + add ra_wt_mul_l0, ra_wt_mul_l0, r3 ; mul24 r0, r2, ra_wt_mul_l0 # r2 = 0x4000 so mul24 safe even with -ve wt_mul + sub rb_wt_off, r1, r0 ; mov ra_ef.8a, rb4 + +# retrieve texture results and pick out bytes +# then submit two more texture requests + +# This loop is identical to the B loop from here ---> +:1 + add.setf -, ra_ef, ra_ef ; mul24 ra4, rb5, ra_ef + + max r2, ra_y, 0 ; mov r1, 0 + min r2, r2, rb_max_y ; mov r3, ra_k1 + add ra_y, ra_y, r3 ; mul24 r2, r2, rb_pitch ; ldtmu0 + add t0s, ra_base, r2 ; mov rb5, rb6 + shr r0, r4, ra_xshift ; mov rb6, rb7 + + max r2, ra_y2, r1 ; v8min r0, r0, rb_pmask ; ldtmu1 # ; masks out all but wanted bytes + shr r1, r4, rb_xshift2 ; mov rb7, ra8 + min r2, r2, rb_max_y ; v8min r1, r1, ra_pmax + add ra_y2, ra_y2, r3 ; mul24 r2, r2, rb_pitch + add t1s, rb_base2, r2 ; mov ra8, ra9 + +# apply horizontal filter + add r5rep, r5, r3 ; mul24 r2, ra0.8a << 8, r1 << 8 @ "mul_used", 0 + mov r3, rb_fir_off_h ; mul24.ifnn r2, ra0.8a, r0 + sub r2, r3, r2 ; mul24 r3, ra0.8b << 1, r0 << 1 @ "mul_used", 0 + nop ; mul24.ifn r3, ra0.8b << 9, r1 << 9 @ "mul_used", 0 + add r2, r2, r3 ; mul24 r3, ra0.8c << 2, r0 << 2 @ "mul_used", 0 + nop ; mul24.ifn r3, ra0.8c << 10, r1 << 10 @ "mul_used", 0 + sub r2, r2, r3 ; mul24 r3, ra0.8d << 3, r0 << 3 @ "mul_used", 0 + nop ; mul24.ifn r3, ra0.8d << 11, r1 << 11 @ "mul_used", 0 + add r2, r2, r3 ; mul24 r3, ra1.8a << 4, r0 << 4 @ "mul_used", 0 + nop ; mul24.ifn r3, ra1.8a << 12, r1 << 12 @ "mul_used", 0 + add r2, r2, r3 ; mul24 r3, ra1.8b << 5, r0 << 5 @ "mul_used", 0 + nop ; mul24.ifn r3, ra1.8b << 13, r1 << 13 @ "mul_used", 0 + sub r2, r2, r3 ; mul24 r3, ra1.8c << 6, r0 << 6 @ "mul_used", 0 + nop ; mul24.ifn r3, ra1.8c << 14, r1 << 14 @ "mul_used", 0 + add r2, r2, r3 ; mul24 r3, ra1.8d << 7, r0 << 7 @ "mul_used", 0 + add.setf -, r5, r5 ; mul24.ifn r3, ra1.8d << 15, r1 << 15 @ "mul_used", 0 + + brr.anyn -, r:1b + sub r2, r2, r3 ; mul24 r1, rb5, ra2.8b + mov ra9, rb10 ; mul24 r0, rb10, ra3.8b + asr ra11, r2, v_bit_depth - 8 ; mov rb10, ra11 + # >>> .anyn 1b (r5 + r5) + + # apply vertical filter and write to VPM + # - r4* + r5 - r6 + r7 + r8 - r9 + r10 - r11 + + sub r1, r1, r0 ; mul24 r0, rb6, ra2.8c + sub r1, r1, r0 ; mul24 r0, rb7, ra2.8d + add r1, r1, r0 ; mul24 r0, ra8, rb8 + add r1, r1, r0 ; mul24 r0, rb10, ra3.8c + add r1, r1, r0 ; mul24 r0, ra11, rb11 +# <--- to here + sub.setf -, r5, rb_i_tmu ; mov r3, ra_blk_height # ; NxtLoop: r3 = block height + sub r1, r1, ra4 ; mov.ifz rb_base2, rb_base2_next + sub r1, r1, r0 ; mov.ifz ra_base, ra_base_next + + asr r1, r1, 6 ; mov.ifz ra_y_y2, ra_y_y2_next + sub.setf -, r5, rb_lcount ; mul24 r0, r1, ra_wt_mul_l0 + add r0, r0, rb_wt_off ; mul24 r1, r1, ra_kmul_add + sub r1, r0, r1 ; v8subs r0, ra_height, r3 # ; NxtLoop: r0 = remaining height (0 saturate) + + brr.anyn -, r:1b + asr r1, r1, i_wt_den_p6 + min r1, r1, ra_pmax ; mov -, vw_wait + max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch # ; NxtLoop +# >>> branch.anyn 1b (r5 - rb_lcount) + +# r0 = remaining height (min 0) +# r2 = r3 * rb_pitch +# r3 = block_height + +# If looping again then we consumed 16 height last loop +# rb_dma1 (stride) remains constant +# rb_i_tmu remains const (based on total height) +# recalc ra_dma0, rb_lcount based on new segment height + + mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 # VDW setup 0 + +# DMA out + bra.anyz -, ra_link + min r0, r0, r3 ; mov vw_setup, rb_dma1 # Stride + sub r1, r0, r3 ; mov vw_addr, ra_dest # start the VDW + shl r1, r1, i_shift23 +# >>> .anyz ra_link + +# Here r1 = cur_blk_height - 16 so it will be 0 or -ve +# We add to dma0 to reduce the number of output lines in the final block + brr -, r:1b + add rb_lcount, rb_lcount, r0 + add ra_dma0, ra_dma0, r1 + add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init # ; Reset our VDM write pointer +# >>> 1b +.endm + +::mc_filter_y_pxx + m_filter_y_pxx 8 + + +################################################################################ + +# mc_filter_b(y_x, base, y2_x2, base2, width_height, my2_mx2_my_mx, offsetweight0, this_dst, next_kernel) +# +# Setup (& therefore uniform struct) shared with _pxx +# Struct in m_luma_setup +# +# l0 calc in els 0-7, L1 in 8-15 +# Only els 0-7 write data that is stored back to ram (els 8-15 may write tosh) +# +# At this point we have already issued PREREAD pairs of texture requests for the current block + +.macro m_filter_y_bxx, v_bit_depth + +# denom shift values +.set i_wt_den_p5, (DENOM + 13 - v_bit_depth) +.set i_wt_den_p6, (DENOM + 14 - v_bit_depth) + + m_luma_setup v_bit_depth + + shl r1, ra_wt_off_l0, i_wt_den_p6 + add ra_wt_mul_l0, ra_wt_mul_l0, r3 ; mul24 r0, r2, ra_wt_mul_l0 + sub r1, r1, r0 ; mul24 r0, r2, ra_wt_mul_l1 + sub rb_wt_off, r1, r0 ; mov ra_ef.8a, rb4 + +# This loop is identical to the P loop from here ---> +:1 + add.setf -, ra_ef, ra_ef ; mul24 ra4, rb5, ra_ef + + max r2, ra_y, 0 ; mov r1, 0 + min r2, r2, rb_max_y ; mov r3, ra_k1 + add ra_y, ra_y, r3 ; mul24 r2, r2, rb_pitch ; ldtmu0 + add t0s, ra_base, r2 ; mov rb5, rb6 + shr r0, r4, ra_xshift ; mov rb6, rb7 + + max r2, ra_y2, r1 ; v8min r0, r0, rb_pmask ; ldtmu1 # ; masks out all but wanted bytes + shr r1, r4, rb_xshift2 ; mov rb7, ra8 + min r2, r2, rb_max_y ; v8min r1, r1, ra_pmax + add ra_y2, ra_y2, r3 ; mul24 r2, r2, rb_pitch + add t1s, rb_base2, r2 ; mov ra8, ra9 + +# apply horizontal filter + add r5rep, r5, r3 ; mul24 r2, ra0.8a << 8, r1 << 8 @ "mul_used", 0 + mov r3, rb_fir_off_h ; mul24.ifnn r2, ra0.8a, r0 + sub r2, r3, r2 ; mul24 r3, ra0.8b << 1, r0 << 1 @ "mul_used", 0 + nop ; mul24.ifn r3, ra0.8b << 9, r1 << 9 @ "mul_used", 0 + add r2, r2, r3 ; mul24 r3, ra0.8c << 2, r0 << 2 @ "mul_used", 0 + nop ; mul24.ifn r3, ra0.8c << 10, r1 << 10 @ "mul_used", 0 + sub r2, r2, r3 ; mul24 r3, ra0.8d << 3, r0 << 3 @ "mul_used", 0 + nop ; mul24.ifn r3, ra0.8d << 11, r1 << 11 @ "mul_used", 0 + add r2, r2, r3 ; mul24 r3, ra1.8a << 4, r0 << 4 @ "mul_used", 0 + nop ; mul24.ifn r3, ra1.8a << 12, r1 << 12 @ "mul_used", 0 + add r2, r2, r3 ; mul24 r3, ra1.8b << 5, r0 << 5 @ "mul_used", 0 + nop ; mul24.ifn r3, ra1.8b << 13, r1 << 13 @ "mul_used", 0 + sub r2, r2, r3 ; mul24 r3, ra1.8c << 6, r0 << 6 @ "mul_used", 0 + nop ; mul24.ifn r3, ra1.8c << 14, r1 << 14 @ "mul_used", 0 + add r2, r2, r3 ; mul24 r3, ra1.8d << 7, r0 << 7 @ "mul_used", 0 + add.setf -, r5, r5 ; mul24.ifn r3, ra1.8d << 15, r1 << 15 @ "mul_used", 0 + + brr.anyn -, r:1b + sub r2, r2, r3 ; mul24 r1, rb5, ra2.8b + mov ra9, rb10 ; mul24 r0, rb10, ra3.8b + asr ra11, r2, v_bit_depth - 8 ; mov rb10, ra11 + # >>> .anyn 1b (r5 + r5) + + # apply vertical filter and write to VPM + # - r4* + r5 - r6 + r7 + r8 - r9 + r10 - r11 + + sub r1, r1, r0 ; mul24 r0, rb6, ra2.8c + sub r1, r1, r0 ; mul24 r0, rb7, ra2.8d + add r1, r1, r0 ; mul24 r0, ra8, rb8 + add r1, r1, r0 ; mul24 r0, rb10, ra3.8c + add r1, r1, r0 ; mul24 r0, ra11, rb11 +# <--- to here + sub r1, r1, ra4 + sub r1, r1, r0 ; mov r2, rb_wt_off + + asr r1, r1, 6 + sub.setf -, r5, rb_i_tmu ; mul24 r0, r1, ra_wt_mul_l0 + mov.ifz rb_base2, rb_base2_next ; mul24 r1, r1, ra_kmul_add + sub r1, r0, r1 ; mov.ifz ra_y_y2, ra_y_y2_next + sub.setf -, r5, rb_lcount ; mov.ifz ra_base, ra_base_next + add r1, r1, r2 ; mov r0, r1 << 8 + add r1, r1, r0 ; mov r3, ra_blk_height # ; NxtLoop: r3 = block height + + brr.anyn -, r:1b + asr r1, r1, ra_wt_den_p7 ; mul24 r2, r3, rb_pitch # ; NxtLoop + min r1, r1, ra_pmax ; mov -, vw_wait + max vpm, r1, 0 ; v8subs r0, ra_height, r3 # ; NxtLoop: r0 = remaining height (0 saturate) +# >>> branch.anyn 1b (r5 - rb_lcount) + +# r0 = remaining height (min 0) +# r2 = r3 * rb_pitch +# r3 = block_height + +# If looping again then we consumed block_height last loop +# rb_dma1 (stride) remains constant +# rb_i_tmu remains const (based on total height) +# recalc ra_dma0, rb_lcount based on new segment height + + mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 # VDW setup 0 + +# DMA out + bra.anyz -, ra_link + min r0, r0, r3 ; mov vw_setup, rb_dma1 # Stride + sub r1, r0, r3 ; mov vw_addr, ra_dest # start the VDW + shl r1, r1, i_shift23 +# >>> .anyz ra_link (ra_height - remaining height) + +# Here r1 = cur_blk_height - blk_height so it will be 0 or -ve +# We add to dma0 to reduce the number of output lines in the final block + brr -, r:1b + add rb_lcount, rb_lcount, r0 + add ra_dma0, ra_dma0, r1 + add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init # ; Reset our VDM write pointer +# >>> 1b +.endm + +::mc_filter_y_bxx + m_filter_y_bxx 8 + +################################################################################ +# +# typedef struct qpu_mc_pred_y_p00_s { +# qpu_mc_src_t next_src1; +# uint16_t h; +# uint16_t w; +# uint32_t wo1; +# uint32_t dst_addr; +# uint32_t next_fn; +# } qpu_mc_pred_y_p00_t; + +.macro m_filter_y_p00, v_bit_depth + +.if v_bit_depth <= 8 +.set v_x_shift, 0 +.set v_x_mul, 1 +# Shifts to get width & height in the right place in ra_dma0 +.set v_dma_h_shift, 7 +.set v_dma_wh_shift, i_shift16 +.else +.set v_x_shift, 1 +.set v_x_mul, 2 +# Shifts to get width & height in the right place in ra_dma0 +.set v_dma_h_shift, 8 +.set v_dma_wh_shift, 15 +.endif + + mov ra0, unif ; mov r0, elem_num # y_x + mov ra_xshift, ra_xshift_next ; v8subs r5rep, r5, r5 # [ra0 delay] ; r5 = 0 + add r0, ra0.16b, r0 ; mov ra_base_next, unif # ; src1.base +.if v_x_shift != 0 + shl r0, r0, v_x_shift +.endif + + max r0, r0, r5 ; mov ra_y_next, ra0.16a # ; width_height + min r0, r0, rb_max_x ; mov ra_width_height, unif + + shl ra_xshift_next, r0, 3 # Compute shifts + and r0, r0, -4 + sub r2, r5, rb_pitch ; mov ra_wt_off_mul_l0, unif # ; weight_offset + and r1, r0, r2 + xor r0, r0, r1 ; mul24 r1, r1, rb_xpitch + add r0, r0, r1 ; mov ra_dest, unif # Add stripe offsets ; dest addr + add ra_base_next, ra_base_next, r0 ; mov vw_setup, rb_vpm_init # [ra_width delay] ; set up VPM write + +# get width,height of block (unif load above) +# Compute vdw_setup1(dst_pitch-width) + shl r1, ra_width, v_x_shift + sub rb_dma1, rb_dma1_base, r1 ; mov r0, ra_height + sub rb_i_tmu, r0, PREREAD ; v8min r0, r0, ra_blk_height + shl r0, r0, v_dma_h_shift ; mov rb_lcount, r0 + add r0, r0, r1 # Combine width and height of destination area + shl rb_wt_off, ra_wt_off_l0, DENOM + 7 + shl r0, r0, v_dma_wh_shift ; mov ra_link, unif # Shift into bits 16 upwards of the vdw_setup0 register ; link + add ra_dma0, r0, rb_dma0_base + +:1 + sub.setf -, r5, rb_i_tmu ; v8adds r5rep, r5, ra_k1 + nop ; mov.ifz ra_y, ra_y_next ; ldtmu0 + shr r0, r4, ra_xshift ; mov r3, rb_pitch + + max r2, ra_y, 0 # y + min r2, r2, rb_max_y ; mov.ifz ra_base, ra_base_next + add ra_y, ra_y, 1 ; mul24 r2, r2, r3 + add t0s, ra_base, r2 ; v8min r0, r0, rb_pmask + + sub.setf -, r5, rb_lcount ; mul24 r1, r0, ra_wt_mul_l0 + shl r1, r1, 8 ; mov r3, ra_blk_height + add r1, r1, rb_wt_off ; v8subs r0, ra_height, r3 + + brr.anyn -, r:1b + asr r1, r1, DENOM + 8 + min r1, r1, ra_pmax ; mov -, vw_wait + max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch +# >>> branch.anyn 1b + +# r0 = remaining height (min 0) +# r2 = r3 * rb_pitch +# r3 = block_height + +# If looping again then we consumed 16 height last loop +# rb_dma1 (stride) remains constant +# rb_i_tmu remains const (based on total height) +# recalc ra_dma0, rb_lcount based on new segment height + + mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 # VDW setup 0 + +# DMA out + bra.anyz -, ra_link + min r0, r0, r3 ; mov vw_setup, rb_dma1 # Stride + sub r1, r0, r3 ; mov vw_addr, ra_dest # start the VDW + shl r1, r1, i_shift23 +# >>> .anyz ra_link + +# Here r1 = cur_blk_height - 16 so it will be 0 or -ve +# We add to dma0 to reduce the number of output lines in the final block + brr -, r:1b + add rb_lcount, rb_lcount, r0 + add ra_dma0, ra_dma0, r1 + add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init # ; Reset our VDM write pointer +# >>> 1b +.endm + +::mc_filter_y_p00 + m_filter_y_p00 8 + +################################################################################ + +.macro m_filter_y_b00, v_bit_depth +# luma setup does a fair bit more than we need calculating filter coeffs +# that we will never use but it saves I-cache to use it (also simple!) + m_luma_setup v_bit_depth + +# Fix up vals that were expecting a filter (somewhat icky) + mov r2, 1 + add rb_i_tmu, rb_i_tmu, r2 ; mov r1, ra_wt_off_mul_l0 # Need in rX rather than raX for <<8 to do what we want + shl rb_wt_off, ra_wt_off_l0, DENOM + 8 ; v8subs r5quad, r5, r5 # [r1 << delay] ; r5quad OK for zero + nop ; mov.ifnz ra_wt_off_mul_l0, r1 << 8 + +:1 + sub.setf -, r5, rb_i_tmu ; nop ; ldtmu1 + shr r1, r4, rb_xshift2 ; mov.ifz ra_y_y2, ra_y_y2_next ; ldtmu0 + shr r0, r4, ra_xshift ; mov r3, rb_pitch + + max r2, ra_y, 0 # y + min r2, r2, rb_max_y ; mov.ifz ra_base, ra_base_next + add ra_y, ra_y, 1 ; mul24 r2, r2, r3 + add t0s, ra_base, r2 ; mov.ifz rb_base2, rb_base2_next + + max r2, ra_y2, 0 + min r2, r2, rb_max_y + add ra_y2, ra_y2, 1 ; mul24 r2, r2, r3 + add t1s, rb_base2, r2 ; v8min r0, r0, ra_pmax # v8subs masks out all but bottom byte + and r1, r1, rb_pmask ; mul24 r0, r0, ra_wt_mul_l0 + + sub.setf -, r5, rb_lcount ; mul24 r1, r1, ra_wt_mul_l1 + add r1, r0, r1 ; v8adds r5rep, r5, ra_k1 + + shl r1, r1, 8 ; mov r3, ra_blk_height + add r1, r1, rb_wt_off ; v8subs r0, ra_height, r3 + + brr.anyn -, r:1b + asr r1, r1, (DENOM + 9) - 32 # -32 to get valid shift immediate + min r1, r1, ra_pmax ; mov -, vw_wait + max vpm, r1, ra_k0 ; mul24 r2, r3, rb_pitch +# >>> branch.anyn 1b + +# r0 = remaining height (min 0) +# r2 = r3 * rb_pitch +# r3 = block_height + +# If looping again then we consumed 16 height last loop +# rb_dma1 (stride) remains constant +# rb_i_tmu remains const (based on total height) +# recalc ra_dma0, rb_lcount based on new segment height + + mov.setf ra_height, r0 ; mov vw_setup, ra_dma0 # ; VDW setup 0 + +# DMA out + bra.anyz -, ra_link + min r0, r0, r3 ; mov vw_setup, rb_dma1 # ; Stride + sub r1, r0, r3 ; mov vw_addr, ra_dest # ; start the VDW + shl r1, r1, i_shift23 +# >>> .anyz ra_link + +# Here r1 = cur_blk_height - 16 so it will be 0 or -ve +# We add to dma0 to reduce the number of output lines in the final block + brr -, r:1b + add rb_lcount, rb_lcount, r0 + add ra_dma0, ra_dma0, r1 + add ra_dest, ra_dest, r2 ; mov vw_setup, rb_vpm_init # ; Reset our VDM write pointer +# >>> 1b +.endm + +::mc_filter_y_b00 + m_filter_y_b00 8 + +################################################################################ +################################################################################ +# 10 BIT + +::mc_setup_c10_q0 + m_setup_q0 +::mc_setup_c10_qn + m_setup_c 10 + +::mc_filter_c10_p + m_filter_c_p 0, 10 + +::mc_filter_c10_p_l1 + m_filter_c_p 1, 10 + + +::mc_filter_c10_b + m_filter_c_b 10 + +# Even if these fns are the same as for other bit depths we want our own copy +# to keep the code we are using in a single lump to avoid (direct map) cache +# thrashing +.set v_quads10, N_QPU_16 / 4 + +::mc_sync10_q0 + m_sync_q 0, v_quads10 +::mc_sync10_q1 + m_sync_q 1, v_quads10 +::mc_sync10_q2 + m_sync_q 2, v_quads10 +::mc_sync10_q3 + m_sync_q 3, v_quads10 +::mc_sync10_q4 + m_sync_q 4, v_quads10 +::mc_sync10_q5 + m_sync_q 5, v_quads10 +::mc_sync10_q6 + m_sync_q 6, v_quads10 +::mc_sync10_q7 + m_sync_q 7, v_quads10 +::mc_sync10_q8 + m_sync_q 8, v_quads10 +::mc_sync10_q9 + m_sync_q 9, v_quads10 +::mc_sync10_q10 + m_sync_q 10, v_quads10 +::mc_sync10_q11 + m_sync_q 11, v_quads10 + +::mc_exit_y10_q0 +::mc_exit_c10_q0 + m_exit_q0 + +::mc_exit_y10_qn +::mc_exit_c10_qn + m_exit_qn + +::mc_setup_y10_q0 + m_setup_q0 +::mc_setup_y10_qn + m_setup_y 10 + +:per_block_setup_10 + m_per_block_setup 10 + +::mc_filter_y10_pxx + m_filter_y_pxx 10 + +::mc_filter_y10_p00 + m_filter_y_p00 10 + +::mc_filter_y10_bxx + m_filter_y_bxx 10 + +::mc_filter_y10_b00 + m_filter_y_b00 10 + + + +::mc_end +# Do not add code here because mc_end must appear after all other code. diff --git a/libavcodec/rpi_hevc_shader_cmd.h b/libavcodec/rpi_hevc_shader_cmd.h new file mode 100644 index 0000000000..89711d776b --- /dev/null +++ b/libavcodec/rpi_hevc_shader_cmd.h @@ -0,0 +1,165 @@ +/* +Copyright (c) 2017 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef RPI_SHADER_CMD_H +#define RPI_SHADER_CMD_H + +#pragma pack(push, 4) + +#if RPI_QPU_EMU_C && RPI_QPU_EMU_Y +// If mixed then we are just confused and get a lot of warnings.... +typedef const uint8_t * qpu_mc_src_addr_t; +typedef uint8_t * qpu_mc_dst_addr_t; +#else +typedef uint32_t qpu_mc_src_addr_t; +typedef uint32_t qpu_mc_dst_addr_t; +#endif + +typedef struct qpu_mc_src_s +{ + int16_t y; + int16_t x; + qpu_mc_src_addr_t base; +} qpu_mc_src_t; + + +typedef struct qpu_mc_pred_c_p_s { + qpu_mc_src_t next_src; + uint16_t h; + uint16_t w; + uint32_t coeffs_x; + uint32_t coeffs_y; + uint32_t wo_u; + uint32_t wo_v; + qpu_mc_dst_addr_t dst_addr_c; + uint32_t next_fn; +} qpu_mc_pred_c_p_t; + +typedef struct qpu_mc_pred_c_b_s { + qpu_mc_src_t next_src1; + uint16_t h; + uint16_t w; + uint32_t coeffs_x1; + uint32_t coeffs_y1; + int16_t weight_u1; + int16_t weight_v1; + qpu_mc_src_t next_src2; + uint32_t coeffs_x2; + uint32_t coeffs_y2; + uint32_t wo_u2; + uint32_t wo_v2; + qpu_mc_dst_addr_t dst_addr_c; + uint32_t next_fn; +} qpu_mc_pred_c_b_t; + +typedef struct qpu_mc_pred_c_s_s { + qpu_mc_src_t next_src1; + uint32_t pic_cw; // C Width (== Y width / 2) + uint32_t pic_ch; // C Height (== Y Height / 2) + uint32_t stride2; + uint32_t stride1; + qpu_mc_src_t next_src2; + uint32_t next_fn; +} qpu_mc_pred_c_s_t; + +typedef struct qpu_mc_pred_c_s { + union { + qpu_mc_pred_c_p_t p; + qpu_mc_pred_c_b_t b; + qpu_mc_pred_c_s_t s; + }; +} qpu_mc_pred_c_t; + + +typedef struct qpu_mc_pred_y_p_s { + qpu_mc_src_t next_src1; + qpu_mc_src_t next_src2; + uint16_t h; + uint16_t w; + uint32_t mymx21; + uint32_t wo1; + uint32_t wo2; + qpu_mc_dst_addr_t dst_addr; + uint32_t next_fn; +} qpu_mc_pred_y_p_t; + +typedef struct qpu_mc_pred_y_p00_s { + qpu_mc_src_t next_src1; + uint16_t h; + uint16_t w; + uint32_t wo1; + qpu_mc_dst_addr_t dst_addr; + uint32_t next_fn; +} qpu_mc_pred_y_p00_t; + +typedef struct qpu_mc_pred_y_s_s { + qpu_mc_src_t next_src1; + qpu_mc_src_t next_src2; + uint16_t pic_h; + uint16_t pic_w; + uint32_t stride2; + uint32_t stride1; + uint32_t next_fn; +} qpu_mc_pred_y_s_t; + +typedef struct qpu_mc_pred_sync_s { + uint32_t next_fn; +} qpu_mc_pred_sync_t; + +// Only a useful structure in that it allows us to return something other than a void * +typedef struct qpu_mc_pred_y_s { + union { + qpu_mc_pred_y_p_t p; + qpu_mc_pred_y_p00_t p00; + qpu_mc_pred_y_s_t s; + }; +} qpu_mc_pred_y_t; + +typedef union qpu_mc_pred_cmd_u { + qpu_mc_pred_y_t y; + qpu_mc_pred_c_t c; + qpu_mc_pred_sync_t sync; +} qpu_mc_pred_cmd_t; + +static void inline qpu_mc_link_set(qpu_mc_pred_cmd_t * const cmd, const uint32_t fn) +{ + // Link is last el of previous cmd + ((uint32_t *)cmd)[-1] = fn; +} + +#define QPU_MC_PRED_N_Y8 12 +#define QPU_MC_PRED_N_C8 12 + +#define QPU_MC_PRED_N_Y10 12 +#define QPU_MC_PRED_N_C10 12 + +#define QPU_MC_DENOM 7 + +#pragma pack(pop) + +#endif + diff --git a/libavcodec/rpi_hevc_shader_template.c b/libavcodec/rpi_hevc_shader_template.c new file mode 100644 index 0000000000..77d8366eb8 --- /dev/null +++ b/libavcodec/rpi_hevc_shader_template.c @@ -0,0 +1,88 @@ +/* +Copyright (c) 2017 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "hevc.h" +#include "rpi_hevcdec.h" +#include "libavutil/rpi_sand_fns.h" +#include "rpi_hevc_shader_cmd.h" +#include "rpi_hevc_shader_template.h" + +typedef struct shader_track_s +{ + const union qpu_mc_pred_cmd_u *qpu_mc_curr; + const struct qpu_mc_src_s *last_l0; + const struct qpu_mc_src_s *last_l1; + uint32_t width; // pic_width * PW + uint32_t height; + uint32_t stride2; + uint32_t stride1; +} shader_track_t; + +static int wtoidx(const unsigned int w) +{ + static const uint8_t pel_weight[65] = { [2] = 0, [4] = 1, [6] = 2, [8] = 3, [12] = 4, [16] = 5, [24] = 6, [32] = 7, [48] = 8, [64] = 9 }; + return pel_weight[w]; +} + +static const int fctom(uint32_t x) +{ + int rv; + // As it happens we can take the 2nd filter term & divide it by 8 + // (dropping fractions) to get the fractional move + rv = 8 - ((x >> 11) & 0xf); + av_assert2(rv >= 0 && rv <= 7); + return rv; +} + +static inline int32_t ext(int32_t x, unsigned int shl, unsigned int shr) +{ + return (x << shl) >> shr; +} + +static inline int woff_p(HEVCRpiContext *const s, int32_t x) +{ + return ext(x, 0, 17 + s->ps.sps->bit_depth - 8); +} + +static inline int woff_b(HEVCRpiContext *const s, int32_t x) +{ + return ext(x - 0x10000, 0, 16 + s->ps.sps->bit_depth - 8); +} + +static inline int wweight(int32_t x) +{ + return ext(x, 16, 16); +} + + +#define PW 1 +#include "rpi_hevc_shader_template_fn.h" + +#undef PW +#define PW 2 +#include "rpi_hevc_shader_template_fn.h" + diff --git a/libavcodec/rpi_hevc_shader_template.h b/libavcodec/rpi_hevc_shader_template.h new file mode 100644 index 0000000000..0fc5a45e9f --- /dev/null +++ b/libavcodec/rpi_hevc_shader_template.h @@ -0,0 +1,49 @@ +/* +Copyright (c) 2017 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef LIBAVCODEC_RPI_SHADER_TEMPLATE_H +#define LIBAVCODEC_RPI_SHADER_TEMPLATE_H + +struct HEVCRpiContext; +struct HEVCRpiInterPredEnv; + +void ff_hevc_rpi_shader_c8(struct HEVCRpiContext *const s, + const struct HEVCRpiInterPredEnv *const ipe_y, + const struct HEVCRpiInterPredEnv *const ipe_c); + +void ff_hevc_rpi_shader_c16(struct HEVCRpiContext *const s, + const struct HEVCRpiInterPredEnv *const ipe_y, + const struct HEVCRpiInterPredEnv *const ipe_c); + +void rpi_sand_dump8(const char * const name, + const uint8_t * const base, const int stride1, const int stride2, int x, int y, int w, int h, const int is_c); + +void rpi_sand_dump16(const char * const name, + const uint8_t * const base, const int stride1, const int stride2, int x, int y, int w, int h, const int is_c); + +#endif + diff --git a/libavcodec/rpi_hevc_shader_template_fn.h b/libavcodec/rpi_hevc_shader_template_fn.h new file mode 100644 index 0000000000..10c163a4b9 --- /dev/null +++ b/libavcodec/rpi_hevc_shader_template_fn.h @@ -0,0 +1,502 @@ +/* +Copyright (c) 2017 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#define STRCAT(x,y) x##y + +#if PW == 1 +#define pixel uint8_t +#define FUNC(f) STRCAT(f, 8) +#elif PW == 2 +#define pixel uint16_t +#define FUNC(f) STRCAT(f, 16) +#else +#error Unexpected PW +#endif + +#define PATCH_STRIDE (16 * PW) + +static void FUNC(dup_lr)(uint8_t * dst, const uint8_t * src, unsigned int w, unsigned int h, unsigned int stride) +{ + for (unsigned int i = 0; i != h; ++i, dst += stride, src += stride) { + const pixel s = *(const pixel *)src; + pixel * d = (pixel *)dst; + for (unsigned int j = 0; j < w; j += PW) { + *d++ = s; + } + } +} + +static void FUNC(dup_tb)(uint8_t * dst, const uint8_t * src, unsigned int w, unsigned int h, unsigned int stride) +{ + for (unsigned int i = 0; i != h; ++i, dst += stride) { + memcpy(dst, src, w); + } +} + +static void FUNC(get_patch_y)(const shader_track_t * const st, + uint8_t * dst, const unsigned int dst_stride, + const qpu_mc_src_t *src, + unsigned int _w, unsigned int _h) +{ + int x = src->x * PW; + int y = src->y; + int w = _w * PW; + int h = _h; + int dl = 0; + int dr = 0; + int dt = 0; + int db = 0; + + if (x < 0) { + if (-x >= w) + x = PW - w; + dl = -x; + w += x; + x = 0; + } + if (x + w > st->width) { + if (x >= st->width) + x = st->width - PW; + dr = (x + w) - st->width; + w = st->width - x; + } + + // Y + if (y < 0) { + if (-y >= h) + y = 1 - h; + dt = -y; + h += y; + y = 0; + } + if (y + h > st->height) { + if (y >= st->height) + y = st->height - 1; + db = (y + h) - st->height; + h = st->height - y; + } + + dst += dl + dt * dst_stride; + FUNC(av_rpi_sand_to_planar_y)(dst, dst_stride, (const uint8_t *)src->base, st->stride1, st->stride2, x, y, w, h); + + // Edge dup + if (dl != 0) + FUNC(dup_lr)(dst - dl, dst, dl, h, dst_stride); + if (dr != 0) + FUNC(dup_lr)(dst + w, dst + w - PW, dr, h, dst_stride); + w += dl + dr; + dst -= dl; + + if (dt != 0) + FUNC(dup_tb)(dst - dt * dst_stride, dst, w, dt, dst_stride); + if (db != 0) + FUNC(dup_tb)(dst + h * dst_stride, dst + (h - 1) * dst_stride, w, db, dst_stride); +} + + + +static void FUNC(get_patch_c)(const shader_track_t * const st, + uint8_t * dst_u, uint8_t * dst_v, const unsigned int dst_stride, + const qpu_mc_src_t *src, + unsigned int _w, unsigned int _h) +{ + int x = src->x * PW; + int y = src->y; + int w = _w * PW; + int h = _h; + int dl = 0; + int dr = 0; + int dt = 0; + int db = 0; + const int width = st->width; + const int height = st->height; + + if (x < 0) { + if (-x >= w) + x = PW - w; + dl = -x; + w += x; + x = 0; + } + if (x + w > width) { + if (x >= width) + x = width - PW; + dr = (x + w) - width; + w = width - x; + } + + // Y + if (y < 0) { + if (-y >= h) + y = 1 - h; + dt = -y; + h += y; + y = 0; + } + if (y + h > height) { + if (y >= height) + y = height - 1; + db = (y + h) - height; + h = height - y; + } + + dst_u += dl + dt * dst_stride; + dst_v += dl + dt * dst_stride; + FUNC(av_rpi_sand_to_planar_c)(dst_u, dst_stride, dst_v, dst_stride, (const uint8_t *)src->base, st->stride1, st->stride2, x, y, w, h); + + // Edge dup + if (dl != 0) + { + FUNC(dup_lr)(dst_u - dl, dst_u, dl, h, dst_stride); + FUNC(dup_lr)(dst_v - dl, dst_v, dl, h, dst_stride); + } + if (dr != 0) + { + FUNC(dup_lr)(dst_u + w, dst_u + w - PW, dr, h, dst_stride); + FUNC(dup_lr)(dst_v + w, dst_v + w - PW, dr, h, dst_stride); + } + w += dl + dr; + dst_u -= dl; + dst_v -= dl; + + if (dt != 0) + { + FUNC(dup_tb)(dst_u - dt * dst_stride, dst_u, w, dt, dst_stride); + FUNC(dup_tb)(dst_v - dt * dst_stride, dst_v, w, dt, dst_stride); + } + if (db != 0) + { + FUNC(dup_tb)(dst_u + h * dst_stride, dst_u + (h - 1) * dst_stride, w, db, dst_stride); + FUNC(dup_tb)(dst_v + h * dst_stride, dst_v + (h - 1) * dst_stride, w, db, dst_stride); + } +} + +// w, y, w, h in pixels +// stride1, stride2 in bytes +void FUNC(rpi_sand_dump)(const char * const name, + const uint8_t * const base, const int stride1, const int stride2, int x, int y, int w, int h, const int is_c) +{ + const int mask = stride2 == 0 ? ~0 : stride1 - 1; + + printf("%s (%d,%d) %dx%d\n", name, x, y, w, h); + + if (is_c) { + x *= 2; + w *= 2; + } + + for (int i = y; i != y + h; ++i) { + for (int j = x; j != x + w; ++j) { + const uint8_t * p = base + ((j*PW) & mask) + i * stride1 + ((j*PW) & ~mask) * stride2; + char sep = is_c && (j & 1) == 0 ? ':' : ' '; +#if PW == 1 + if (j < 0 || i < 0) + printf("..%c", sep); + else + printf("%02x%c", *(const pixel*)p, sep); +#else + if (j < 0 || i < 0) + printf("...%c", sep); + else + printf("%03x%c", *(const pixel*)p, sep); +#endif + } + printf("\n"); + } +} + + +void FUNC(ff_hevc_rpi_shader_c)(HEVCRpiContext *const s, + const HEVCRpiInterPredEnv *const ipe_y, + const HEVCRpiInterPredEnv *const ipe_c) +{ + for (int c_idx = 0; c_idx < 2; ++c_idx) + { + const HEVCRpiInterPredEnv *const ipe = c_idx == 0 ? ipe_y : ipe_c; + shader_track_t tracka[QPU_N_MAX] = {{NULL}}; + unsigned int exit_n = 0; + + if (ipe == NULL || !ipe->used) { + continue; + } + + do { + for (unsigned int i = 0; i != ipe->n; ++i) { + const HEVCRpiInterPredQ * const q = ipe->q + i; + shader_track_t * const st = tracka + i; + const qpu_mc_pred_cmd_t * cmd = st->qpu_mc_curr == NULL ? q->qpu_mc_base : st->qpu_mc_curr; + + for (;;) { + const uint32_t link = (cmd == q->qpu_mc_base) ? q->code_setup : ((uint32_t *)cmd)[-1]; + + if (link == q->code_setup) { + if (c_idx == 0) { + // Luma + const qpu_mc_pred_y_s_t *const c = &cmd->y.s; + + st->height = c->pic_h; + st->width = c->pic_w * PW; + st->stride1 = c->stride1; + st->stride2 = c->stride2; + st->last_l0 = &c->next_src1; + st->last_l1 = &c->next_src2; + cmd = (const qpu_mc_pred_cmd_t *)(c + 1); + } + else { + // Chroma + const qpu_mc_pred_c_s_t *const c = &cmd->c.s; + + st->height = c->pic_ch; + st->width = c->pic_cw * PW; + st->stride1 = c->stride1; + st->stride2 = c->stride2; + st->last_l0 = &c->next_src1; + st->last_l1 = &c->next_src2; + cmd = (const qpu_mc_pred_cmd_t *)(c + 1); + } + } + else if (link == s->qpu.y_pxx) { + const qpu_mc_pred_y_p_t *const c = &cmd->y.p; + const int w1 = FFMIN(c->w, 8); + const int w2 = c->w - w1; + + uint8_t patch_y1[PATCH_STRIDE * 72]; // (Max width + 8) * (max height + 8) + uint8_t patch_y2[PATCH_STRIDE * 72]; // (Max width + 8) * (max height + 8) + + FUNC(get_patch_y)(st, + patch_y1, PATCH_STRIDE, + st->last_l0, + 16, c->h + 7); + if (w2 > 0) { + FUNC(get_patch_y)(st, + patch_y2, PATCH_STRIDE, + st->last_l1, + 16, c->h + 7); + } + + // wo[offset] = offset*2+1 + s->hevcdsp.put_hevc_qpel_uni_w[wtoidx(w1)][(c->mymx21 & 0xff00) != 0][(c->mymx21 & 0xff) != 0]( + (uint8_t *)c->dst_addr, st->stride1, patch_y1 + 3 * (PATCH_STRIDE + PW), PATCH_STRIDE, + c->h, QPU_MC_DENOM, wweight(c->wo1), woff_p(s, c->wo1), (c->mymx21 & 0xff), ((c->mymx21 >> 8) & 0xff), w1); + if (w2 > 0) { + s->hevcdsp.put_hevc_qpel_uni_w[wtoidx(w2)][(c->mymx21 & 0xff000000) != 0][(c->mymx21 & 0xff0000) != 0]( + (uint8_t *)c->dst_addr + 8 * PW, st->stride1, patch_y2 + 3 * (PATCH_STRIDE + PW), PATCH_STRIDE, + c->h, QPU_MC_DENOM, wweight(c->wo2), woff_p(s, c->wo2), ((c->mymx21 >> 16) & 0xff), ((c->mymx21 >> 24) & 0xff), w2); + } + st->last_l0 = &c->next_src1; + st->last_l1 = &c->next_src2; + cmd = (const qpu_mc_pred_cmd_t *)(c + 1); + } + else if (link == s->qpu.y_bxx) { + const qpu_mc_pred_y_p_t *const c = &cmd->y.p; + + uint8_t patch_y1[PATCH_STRIDE * 72]; // (Max width + 8) * (max height + 8) + uint8_t patch_y2[PATCH_STRIDE * 72]; // (Max width + 8) * (max height + 8) + int16_t patch_y3[MAX_PB_SIZE * MAX_PB_SIZE]; + + FUNC(get_patch_y)(st, + patch_y1, PATCH_STRIDE, + st->last_l0, + 16, c->h + 7); + FUNC(get_patch_y)(st, + patch_y2, PATCH_STRIDE, + st->last_l1, + 16, c->h + 7); + + s->hevcdsp.put_hevc_qpel[wtoidx(c->w)][(c->mymx21 & 0xff00) != 0][(c->mymx21 & 0xff) != 0]( + patch_y3, patch_y1+ 3 * (PATCH_STRIDE + PW), PATCH_STRIDE, + c->h, (c->mymx21 & 0xff), ((c->mymx21 >> 8) & 0xff), c->w); + + s->hevcdsp.put_hevc_qpel_bi_w[wtoidx(c->w)][(c->mymx21 & 0xff000000) != 0][(c->mymx21 & 0xff0000) != 0]( + (uint8_t *)c->dst_addr, st->stride1, patch_y2 + 3 * (PATCH_STRIDE + PW), PATCH_STRIDE, patch_y3, + c->h, QPU_MC_DENOM, wweight(c->wo1), wweight(c->wo2), + 0, woff_b(s, c->wo2), ((c->mymx21 >> 16) & 0xff), ((c->mymx21 >> 24) & 0xff), c->w); + st->last_l0 = &c->next_src1; + st->last_l1 = &c->next_src2; + cmd = (const qpu_mc_pred_cmd_t *)(c + 1); + } + else if (link == s->qpu.y_p00) { + const qpu_mc_pred_y_p00_t *const c = &cmd->y.p00; + + uint8_t patch_y1[PATCH_STRIDE * 72]; // (Max width + 8) * (max height + 8) + + FUNC(get_patch_y)(st, + patch_y1, PATCH_STRIDE, + st->last_l0, + 16, c->h + 7); + + // wo[offset] = offset*2+1 + s->hevcdsp.put_hevc_qpel_uni_w[wtoidx(c->w)][0][0]( + (uint8_t *)c->dst_addr, st->stride1, patch_y1, PATCH_STRIDE, + c->h, QPU_MC_DENOM, wweight(c->wo1), woff_p(s, c->wo1), 0, 0, c->w); + + st->last_l0 = &c->next_src1; + cmd = (const qpu_mc_pred_cmd_t *)(c + 1); + } + else if (link == s->qpu.y_b00) { + const qpu_mc_pred_y_p_t *const c = &cmd->y.p; + + uint8_t patch_y1[PATCH_STRIDE * 72]; // (Max width + 8) * (max height + 8) + uint8_t patch_y2[PATCH_STRIDE * 72]; // (Max width + 8) * (max height + 8) + int16_t patch_y3[MAX_PB_SIZE * MAX_PB_SIZE]; + + av_assert0(c->w <= 16 && c->h <= 64); + + FUNC(get_patch_y)(st, + patch_y1, PATCH_STRIDE, + st->last_l0, + 16, c->h); + FUNC(get_patch_y)(st, + patch_y2, PATCH_STRIDE, + st->last_l1, + 16, c->h); + + s->hevcdsp.put_hevc_qpel[wtoidx(c->w)][0][0]( + patch_y3, patch_y1, PATCH_STRIDE, + c->h, 0, 0, c->w); + + s->hevcdsp.put_hevc_qpel_bi_w[wtoidx(c->w)][0][0]( + (uint8_t *)c->dst_addr, st->stride1, patch_y2, PATCH_STRIDE, patch_y3, + c->h, QPU_MC_DENOM, wweight(c->wo1), wweight(c->wo2), + 0, woff_b(s, c->wo2), 0, 0, c->w); + st->last_l0 = &c->next_src1; + st->last_l1 = &c->next_src2; + cmd = (const qpu_mc_pred_cmd_t *)(c + 1); + } + else if (link == s->qpu.c_pxx) { + const qpu_mc_pred_c_p_t *const c = &cmd->c.p; + const int mx = fctom(c->coeffs_x); + const int my = fctom(c->coeffs_y); + + uint8_t patch_u1[PATCH_STRIDE * 72]; // (Max width + 8) * (max height + 8) + uint8_t patch_v1[PATCH_STRIDE * 72]; // (Max width + 8) * (max height + 8) + uint8_t patch_u3[8 * 16 * PW]; + uint8_t patch_v3[8 * 16 * PW]; + + FUNC(get_patch_c)(st, patch_u1, patch_v1, PATCH_STRIDE, st->last_l0, 8+3, c->h + 3); + + s->hevcdsp.put_hevc_epel_uni_w[wtoidx(c->w)][my != 0][mx != 0]( + patch_u3, 8 * PW, patch_u1 + PATCH_STRIDE + PW, PATCH_STRIDE, + c->h, QPU_MC_DENOM, wweight(c->wo_u), woff_p(s, c->wo_u), mx, my, c->w); + s->hevcdsp.put_hevc_epel_uni_w[wtoidx(c->w)][my != 0][mx != 0]( + patch_v3, 8 * PW, patch_v1 + PATCH_STRIDE + PW, PATCH_STRIDE, + c->h, QPU_MC_DENOM, wweight(c->wo_v), woff_p(s, c->wo_v), mx, my, c->w); + + FUNC(av_rpi_planar_to_sand_c)((uint8_t *)c->dst_addr_c, st->stride1, st->stride2, patch_u3, 8 * PW, patch_v3, 8 * PW, 0, 0, c->w * PW, c->h); + + st->last_l0 = &c->next_src; + cmd = (const qpu_mc_pred_cmd_t *)(c + 1); + } + else if (link == s->qpu.c_pxx_l1) { + const qpu_mc_pred_c_p_t *const c = &cmd->c.p; + const int mx = fctom(c->coeffs_x); + const int my = fctom(c->coeffs_y); + + uint8_t patch_u1[PATCH_STRIDE * 72]; // (Max width + 8) * (max height + 8) + uint8_t patch_v1[PATCH_STRIDE * 72]; // (Max width + 8) * (max height + 8) + uint8_t patch_u3[8 * 16 * PW]; + uint8_t patch_v3[8 * 16 * PW]; + + FUNC(get_patch_c)(st, patch_u1, patch_v1, PATCH_STRIDE, st->last_l1, 8+3, c->h + 3); + + s->hevcdsp.put_hevc_epel_uni_w[wtoidx(c->w)][my != 0][mx != 0]( + patch_u3, 8 * PW, patch_u1 + PATCH_STRIDE + PW, PATCH_STRIDE, + c->h, QPU_MC_DENOM, wweight(c->wo_u), woff_p(s, c->wo_u), mx, my, c->w); + s->hevcdsp.put_hevc_epel_uni_w[wtoidx(c->w)][my != 0][mx != 0]( + patch_v3, 8 * PW, patch_v1 + PATCH_STRIDE + PW, PATCH_STRIDE, + c->h, QPU_MC_DENOM, wweight(c->wo_v), woff_p(s, c->wo_v), mx, my, c->w); + + FUNC(av_rpi_planar_to_sand_c)((uint8_t *)c->dst_addr_c, st->stride1, st->stride2, patch_u3, 8 * PW, patch_v3, 8 * PW, 0, 0, c->w * PW, c->h); + + st->last_l1 = &c->next_src; + cmd = (const qpu_mc_pred_cmd_t *)(c + 1); + } + else if (link == s->qpu.c_bxx) { + const qpu_mc_pred_c_b_t *const c = &cmd->c.b; + const int mx1 = fctom(c->coeffs_x1); + const int my1 = fctom(c->coeffs_y1); + const int mx2 = fctom(c->coeffs_x2); + const int my2 = fctom(c->coeffs_y2); + + uint8_t patch_u1[PATCH_STRIDE * 72]; + uint8_t patch_v1[PATCH_STRIDE * 72]; + uint8_t patch_u2[PATCH_STRIDE * 72]; + uint8_t patch_v2[PATCH_STRIDE * 72]; + uint8_t patch_u3[8 * 16 * PW]; + uint8_t patch_v3[8 * 16 * PW]; + uint16_t patch_u4[MAX_PB_SIZE * MAX_PB_SIZE]; + uint16_t patch_v4[MAX_PB_SIZE * MAX_PB_SIZE]; + + FUNC(get_patch_c)(st, patch_u1, patch_v1, PATCH_STRIDE, st->last_l0, 8+3, c->h + 3); + FUNC(get_patch_c)(st, patch_u2, patch_v2, PATCH_STRIDE, st->last_l1, 8+3, c->h + 3); + + s->hevcdsp.put_hevc_epel[wtoidx(c->w)][my1 != 0][mx1 != 0]( + patch_u4, patch_u1 + PATCH_STRIDE + PW, PATCH_STRIDE, + c->h, mx1, my1, c->w); + s->hevcdsp.put_hevc_epel[wtoidx(c->w)][my1 != 0][mx1 != 0]( + patch_v4, patch_v1 + PATCH_STRIDE + PW, PATCH_STRIDE, + c->h, mx1, my1, c->w); + + s->hevcdsp.put_hevc_epel_bi_w[wtoidx(c->w)][my2 != 0][mx2 != 0]( + patch_u3, 8 * PW, patch_u2 + PATCH_STRIDE + PW, PATCH_STRIDE, patch_u4, + c->h, QPU_MC_DENOM, c->weight_u1, wweight(c->wo_u2), + 0, woff_b(s, c->wo_u2), mx2, my2, c->w); + s->hevcdsp.put_hevc_epel_bi_w[wtoidx(c->w)][my2 != 0][mx2 != 0]( + patch_v3, 8 * PW, patch_v2 + PATCH_STRIDE + PW, PATCH_STRIDE, patch_v4, + c->h, QPU_MC_DENOM, c->weight_v1, wweight(c->wo_v2), + 0, woff_b(s, c->wo_v2), mx2, my2, c->w); + + FUNC(av_rpi_planar_to_sand_c)((uint8_t *)c->dst_addr_c, st->stride1, st->stride2, patch_u3, 8 * PW, patch_v3, 8 * PW, 0, 0, c->w * PW, c->h); + + st->last_l0 = &c->next_src1; + st->last_l1 = &c->next_src2; + cmd = (const qpu_mc_pred_cmd_t *)(c + 1); + } + else if (link == q->code_sync) { + cmd = (const qpu_mc_pred_cmd_t *)((uint32_t *)cmd + 1); + break; + } + else if (link == q->code_exit) { + // We expect exit to occur without other sync + av_assert0(i == exit_n); + ++exit_n; + break; + } + else { + av_assert0(0); + } + } + + st->qpu_mc_curr = cmd; + } + } while (exit_n == 0); + } +} + +#undef FUNC +#undef pixel + diff --git a/libavcodec/rpi_hevc_transform.s b/libavcodec/rpi_hevc_transform.s new file mode 100644 index 0000000000..3caef20137 --- /dev/null +++ b/libavcodec/rpi_hevc_transform.s @@ -0,0 +1,444 @@ +# ****************************************************************************** +# Argon Design Ltd. +# (c) Copyright 2015 Argon Design Ltd. All rights reserved. +# +# Module : HEVC +# Author : Peter de Rivaz +# ****************************************************************************** + +# USE_STACK = 1 means temporary data stored on the stack (requires build with larger stack) +# USE_STACK = 0 means temporary data stored in fixed per-VPU data buffers (requires modifications to vasm to handle instruction encoding for PC relative instructions) +.set USE_STACK, 0 + +# Lines that fail to assemble start with #: +# The script insert_magic_opcodes.sh inserts the machine code directly for these. +# HEVC VPU Transform +# +# Transform matrix can be thought of as +# output row vector = input row vector * transMatrix2 +# +# The even rows of the matrix are symmetric +# The odd rows of the matrix are antisymmetric +# +# So only need to compute the first half of the results, then can compute the remainder with a butterfly +# +# EXAMPLE +# (a b c d) (1 2 2 1) +# (3 4 -4 -3) +# (5 6 6 5) +# (7 8 -8 -7) +# +# x=(a c)(1 2) = 1a+5c 2a+6c +# (5 6) +# +# y=(b d)(3 4) = 3b+7d 4b+8d +# (7 8) +# +# u=x+y = 1a+5c+3b+7d 2a+4b+6c+8d +# v=x-y = 1a+5c-3b-7d 2a+6c-4b-8d +# +# Final results are (u , v[::-1]) +# +# +# For 32x1 input, load even rows into HX(0++,0), odd rows into HX(16++,0) +# Apply the even matrix first and stop before rounding +# Then apply the odd matrix in a full manner: +# +# First step is to compute partial products with the first input (16 cycles) +# 1a 3b 5c 7d 16x1 input coefficients produce 16x16 output +# 2a 4b 6c 8d +# 2a -4b 6c -8d +# 1a -3b 5c -7d +# +# Second step is to sum partial products into final position (8 cycles) +# 1a+3b+5c+7d +# 2a+4b+6c+8d +# 2a-4b+6c-8d +# 1a-3b+5c-7d +# +# Then can apply butterfly to combine even results and odd results + rounding to produce 16 rows of output at a time (need to save in transposed format) +# +# For 16x16 no butterfly is required and can store final results in original location (Could do 2 16x16s in parallel to make use of the trick - saves on the adds) +# +# For 8x8 we could compute two in parallel. +# +# + +# Columns are transformed first +# +# Store top left half of transMatrix2 in +# Store bottom left half of transMatrix2 in HX(32,32) +# +# For 16x16 +# HX(0:15,0) contains input data before transform +# HY(0:15,0) contains 32bit output data after transform +# HX(32,0) contains even rows of left half of transMatrix2 +# HX(32,32) contains odd rows of left half of transMatrix2 +# HY(48,0) contains partial products ready for summing +# + + +# hevc_trans_16x16(short *transMatrix2, short *coeffs, int num) # TODO add size so we can branch to correct implementation (or perhaps have coeffs32 and num32 as secondary inputs!) +# transMatrix2: address of the constant matrix (must be at 32 byte aligned address in Videocore memory) +# coeffs: address of the transform coefficients (must be at 32 byte aligned address in Videocore memory) +# num: number of 16x16 transforms to be done +# coeffs32 +# num32: number of 32x32 transforms +# command 0 for transform, 1 for memclear16(int16_t *dst,num16) +# + +.equ TRANS_SHIFT, 20 - BIT_DEPTH +.equ TRANS_RND2, 1 << (TRANS_SHIFT - 1) +.equ TRANS_ASL2, 16 - TRANS_SHIFT + + +hevc_trans_16x16: + push r6-r15, lr # TODO cut down number of used registers + mov r14,r3 # coeffs32 + mov r15,r4 # num32 + mov r3, 16*2 # Stride of transMatrix2 in bytes + vldh HX(32++,0),(r0 += r3) REP 16 # This is the 16x16 matrix, a transform is equivalent to multiplying input row vector * matrix + + add r0, 16*16*2 # For 32x32 transforms we also need this matrix + vldh HX(32++,32),(r0 += r3) REP 16 # This is the odd 16x16 matrix + + # Now use r0 to describe which matrix we are working on. + # Allows us to prefetch the next block of coefficients for efficiency. + mov r0,0 # This describes the location where we read our coefficients from + mov r3,16*2 # Stride of coefficients in bytes (TODO remove) + mov r7,16*16*2 # Total block size + mov r8,64*16 # Value used to swap from current to next VRF location + mov r4,64 # Constant used for rounding first pass + mov r5,TRANS_RND2 # Constant used for rounding second pass + + sub sp,sp,64+16*16*2 # Move on stack pointer in case interrupt occurs and uses stack + + add r11,sp,64 # Space for 32 bytes before, and rounding + lsr r11,5 + lsl r11,5 # Make sure r11 is rounded to multiple of 2**5==32 + + lsr r10, r2, 16 # Number of compressed blocks stored in top short + extu r2,16 + # At start of block r0,r1 point to the current block (that has already been loaded) + # r0 VRF location of current block + # r1 address of current block + # r2 number of 16*16 transforms to do + # r3 Stride of coefficients (==32) + # r4 TRANS_RND1 (64) + # r5 TRANS_RND2 + # r6 temporary used inside col_trans16 + # r7 16*16*2 total bytes in block + # r8 64*16 VRF switch locations + # r9 temporary in unpack_coeff for index + # r10 number of 16x16 transforms using compression + # r11 unpacked data buffer (16*16 shorts) (preceded by 16 shorts of packed data buffer) + # r12 temporary counter in unpack_coeff + # r13 + # r14 Save information for 32 bit transform (coeffs location) + # r15 Save information for 32 bit transform (number of transforms) + cmp r2,0 + beq done16x16s +block_loop: + # With compressed coefficients, we don't use prefetch as we don't want to issue unnecessary memory requests + cmp r10,0 + mov r6, r1 + beq not_compressed + sub r10, 1 + bl unpack16x16 +not_compressed: + #mov r6,r1 # DEBUG without compress + vldh HX(0++,0)+r0,(r6 += r3) REP 16 + #eor r0,r8 + #add r1,r7 + # Prefetch the next block + #bl unpack16x16 + #vldh HX(0++,0)+r0,(r6 += r3) REP 16 + #vmov HX(0++,0)+r0,0 REP 16 # DEBUG + #eor r0,r8 + #sub r1,r7 + + # Transform the current block + bl col_trans_16 + vadd HY(0++,0)+r0,HY(0++,0)+r0,r4 REP 16 # Now add on rounding, shift down by 7, and saturate + #vsasls HY(0++,0)+r0,HY(0++,0)+r0,9 REP 16 # 9+7=16 so this ends up with the output saturated and in the top half of the word. + vasl HY(0++,0)+r0,HY(0++,0)+r0,9 REP 16 # This should be saturating, but the instruction above does not assemble? + vmov VX(0,0++)+r0, HX(0++,32)+r0 REP 16 # For simplicity transpose this back to the original position + + bl col_trans_16 + vadd HY(0++,0)+r0,HY(0++,0)+r0,r5 REP 16 # Now add on rounding, shift down by 7, and saturate + #vsasls HY(0++,0)+r0,HY(0++,0)+r0,4 REP 16 # 4+12=16 so this ends up with the output saturated and in the top half of the word. + vasl HY(0++,0)+r0,HY(0++,0)+r0,TRANS_ASL2 REP 16 # This should be saturating, but the instruction above does not assemble? (Probably because it ends with ls which is interpreted as a condition flag) + + # Save results - note there has been a transposition during the processing so we save columns + vsth VX(0,32++)+r0, (r1 += r3) REP 16 + + # Move onto next block + eor r0,r8 + add r1,r7 + + addcmpbgt r2,-1,0,block_loop +done16x16s: + + add sp,sp,64+16*16*2 # Move on stack pointer in case interrupt occurs and uses stack + # Now go and do any 32x32 transforms + b hevc_trans_32x32 + + pop r6-r15, pc +# This returns a value in r6 that says where to load the data from. +# We load data 16 shorts at a time from memory (uncached), and store to stack space to allow us to process it. +unpack16x16: +# Clear out destination + vmov HX(0,0)+r0,0 + mov r6, r11 + vsth HX(0,0)+r0,(r6 += r3) REP 16 + mov r5, r1 # Moving pointer to input coefficients +unpack_outer_loop: + # Loop until we find the end + vldh HX(0,0)+r0,(r5) # TODO would prefetch help here while unpacking previous? + sub r6,r11,32 + #add r6,pc,packed_data-$ # Packed data + vsth HX(0,0)+r0,(r6) # Store into packed data + mov r12,0 +unpack_loop: + ld r4,(r6) + add r6,r6,4 + lsr r9,r4,16 # r9 is destination value + cmp r4,0 # {value,index} + extu r4,8 + beq done_unpack + sth r9,(r11, r4) + addcmpblt r12,1,8,unpack_loop +# # Read next 16 + add r5,32 + b unpack_outer_loop +done_unpack: +# # Set new load location + mov r6, r11 + #add r6,pc,unpacked_data-$ +# # Restore constants + mov r4,64 + mov r5,TRANS_RND2 +# pop r6-r15, pc + b lr + +# r1,r2,r3 r7,r8 should be preserved +# HX(0++,0)+r0 is the block to be transformed +# HX(32++,0)+r6 is the 16x16 matrix of transform coefficients +# Use HY(48,0) for intermediate results +# r0 can be used, but should be returned to its original value at the end +col_trans_16: + add r6,r0,16 # Final value for this loop +col_trans_16_loop: + # First compute partial products for a single column + vmul32s HY(48++,0), VX(0,0)+r0, VX(32,0++) REP 16 + # Then sum up the results and place back + vadd VY(0,0)+r0, VY(48,0++), VY(48,8++) REP 8 CLRA SACC + addcmpblt r0,1,r6,col_trans_16_loop + sub r0,16 # put r0 back to its original value + b lr + +col_trans_odd_16: + add r6,r0,16 # Final value for this loop +col_trans_odd_16_loop: + # First compute partial products for a single column + vmul32s HY(48++,0), VX(0,0)+r0, VX(32,32++) REP 16 + # Then sum up the results and place back + vadd VY(0,0)+r0, VY(48,0++), VY(48,8++) REP 8 CLRA SACC + addcmpblt r0,1,r6,col_trans_odd_16_loop + sub r0,16 # put r0 back to its original value + b lr + +# r1/r10 input pointer +# r0,r4,r5,r6 free +# r8/r9 output storage +# +# Store packed coefficients at r9-32 +# Store unpacked at r9+32*32 (because transform works on even/odd rows on input, but writes all rows) +unpack32x32: +# Clear out destination + vmov HX(0,0),0 + add r0, r9, 32*32*2 # Unpacked buffer + mov r4, 32 + vsth HX(0,0),(r0 += r4) REP 64 +unpack_outer_loop32: + # Loop until we find the end + vldh HX(0,0),(r1) # TODO would prefetch help here while unpacking previous? + sub r6,r9,32 + #add r6,pc,packed_data-$ # Packed data + vsth HX(0,0),(r6) # Store into packed data + mov r8,0 +unpack_loop32: + ld r4,(r6) + add r6,r6,4 + lsr r5,r4,16 # r5 is destination value + cmp r4,0 # {value,index} + extu r4,10 + beq done_unpack + sth r5,(r0, r4) + addcmpblt r8,1,8,unpack_loop32 +# # Read next 16 + add r1,32 + b unpack_outer_loop32 +done_unpack32: + b lr +# hevc_trans_32x32(short *transMatrix2, short *coeffs, int num) +# transMatrix2: address of the constant matrix (must be at 32 byte aligned address in Videocore memory) Even followed by odd +# coeffs: address of the transform coefficients (must be at 32 byte aligned address in Videocore memory) +# num: number of 16x16 transforms to be done in low 16, number of packed in high 16 +# +# Note that the 32x32 transforms are stored in reverse order, this means that the unpacked ones appear first! +hevc_trans_32x32: + mov r1,r14 # coeffs + mov r2,r15 # num + lsr r15,r15,16 # Number that are packed + extu r2,16 # Total number + + # Fetch odd transform matrix + #mov r3, 16*2 # Stride of transMatrix2 in bytes (and of coefficients) + #vldh HX(32++,0),(r0 += r3) REP 16 # This is the even 16x16 matrix + #add r0, 16*16*2 + #vldh HX(32++,32),(r0 += r3) REP 16 # This is the odd 16x16 matrix + + mov r3, 32*2*2 # Stride used to fetch alternate rows of our input coefficient buffer + mov r7, 16*16*2 # Total block size + +.if USE_STACK + # Stack base allocation + sub sp,sp,32*32*4+64 # Allocate some space on the stack for us to store 32*32 shorts as temporary results (needs to be aligned) and another 32*32 for unpacking + # set r8 to 32byte aligned stack pointer with 32 bytes of space before it + add r8,sp,63 + lsr r8,5 + lsl r8,5 +.else +#:version r8 + .half 0x00e8 #AUTOINSERTED + btst r8,16 +#:add r8,pc,intermediate_results-$ + .half 0xbfe8 + .half intermediate_results-($-2) + beq on_vpu1 + add r8,r8,32*32*2*2+16*2 # Move to secondary storage +on_vpu1: +.endif + mov r9,r8 # Backup of the temporary storage + mov r10,r1 # Backup of the coefficient buffer + + cmp r2,0 + beq done32x32s +block_loop32: + + # Transform the first 16 columns + mov r1,r10 # Input Coefficient buffer + mov r8,r9 # Output temporary storage + # Unpacked are first, so need to only do unpacking when r2(=num left) <= r15 (=num packed) + cmp r2,r15 + bgt not_compressed_32 + bl unpack32x32 + add r1,r9,32*32*2 # Uncompressed into temporary storage + mov r8,r9 # Transform into here +not_compressed_32: + # COLUMN TRANSFORM + mov r4, 64 # Constant used for rounding first pass + mov r5, 9 # left shift used for rounding first pass + + bl trans32 + # Transform the second 16 columns + add r8,32*16*2 + add r1,32 + bl trans32 + + # ROW TRANSFORM + mov r4, TRANS_RND2 # Constant used for rounding second pass + mov r5, TRANS_ASL2 # left shift used for rounding second pass + + mov r1,r9 # Input temporary storage + mov r8,r10 # Output Coefficient buffer + bl trans32 + # Transform the second 16 columns + add r8,32*16*2 + add r1,32 + bl trans32 + + add r10, 32*32*2 # move onto next block of coefficients + addcmpbgt r2,-1,0,block_loop32 +done32x32s: + +.if USE_STACK + add sp,sp,32*32*4+64# Restore stack +.endif + + pop r6-r15, pc + +trans32: + push lr + # We can no longer afford the VRF space to do prefetching when doing 32x32 + # Fetch the even rows + vldh HX(0++,0),(r1 += r3) REP 16 + # Fetch the odd rows + vldh HX(16++,0),64(r1 += r3) REP 16 # First odd row is 32 shorts ahead of r1 + + # Transform the even rows using even matrix + mov r0, 0 # Even rows + bl col_trans_16 + + # Now transform the odd rows using odd matrix + mov r0, 64*16 # Odd rows + bl col_trans_odd_16 + + # Now apply butterfly to compute the first 16 results + vadd HY(48++,0),HY(0++,0),HY(16++,0) REP 16 + vadd HY(48++,0),HY(48++,0),r4 REP 16 # add on rounding, + vasl HY(48++,0),HY(48++,0),r5 REP 16 # shift down by 7, and saturate + # 16bit results now in HX(48,32) + mov r0,r8 + mov r6,32*2 + vsth VX(48,32++),(r0+=r6) REP 16 + + # Now apply butterfly to compute the second 16 results (in reverse order) + vsub HY(63,0),HY(0 ,0),HY(16,0) + vsub HY(62,0),HY(1 ,0),HY(17,0) + vsub HY(61,0),HY(2 ,0),HY(18,0) + vsub HY(60,0),HY(3 ,0),HY(19,0) + vsub HY(59,0),HY(4 ,0),HY(20,0) + vsub HY(58,0),HY(5 ,0),HY(21,0) + vsub HY(57,0),HY(6 ,0),HY(22,0) + vsub HY(56,0),HY(7 ,0),HY(23,0) + vsub HY(55,0),HY(8 ,0),HY(24,0) + vsub HY(54,0),HY(9 ,0),HY(25,0) + vsub HY(53,0),HY(10,0),HY(26,0) + vsub HY(52,0),HY(11,0),HY(27,0) + vsub HY(51,0),HY(12,0),HY(28,0) + vsub HY(50,0),HY(13,0),HY(29,0) + vsub HY(49,0),HY(14,0),HY(30,0) + vsub HY(48,0),HY(15,0),HY(31,0) + vadd HY(48++,0),HY(48++,0),r4 REP 16 # add on rounding, + vasl HY(48++,0),HY(48++,0),r5 REP 16 # shift down by 7, and saturate + add r0,r8,32 + vsth VX(48,32++),(r0+=r6) REP 16 + pop pc + +.if USE_STACK == 0 + .balign 32 + +# .space directives generate 0's in the bin so avoid unnecessary padding by +# just setting to appropriate value +.equ intermediate_results, $+16*2 + +# Layout goes: +# +#packed_buffer: +# .space 16*2 +#intermediate_results: +# .space 32*32*2 +#unpacked_buffer: +# .space 32*32*2 +# +#packed_buffer2: +# .space 16*2 +#intermediate_results2: +# .space 32*32*2 +#unpacked_buffer2: +# .space 32*32*2 +.endif + + diff --git a/libavcodec/rpi_hevc_transform10.h b/libavcodec/rpi_hevc_transform10.h new file mode 100644 index 0000000000..1c364492d0 --- /dev/null +++ b/libavcodec/rpi_hevc_transform10.h @@ -0,0 +1,94 @@ +static const unsigned char rpi_hevc_transform10 [] = { +0xa9, 0x03, 0x3e, 0x40, 0x4f, 0x40, 0x03, 0xb0, // 0000 +0x20, 0x00, 0x0c, 0xf8, 0x38, 0x88, 0x80, 0x03, // 0008 +0xc0, 0xf8, 0x00, 0x00, 0x40, 0xb0, 0x00, 0x02, // 0010 +0x0c, 0xf8, 0x38, 0xa8, 0x80, 0x03, 0xc0, 0xf8, // 0018 +0x00, 0x00, 0x00, 0x60, 0x03, 0xb0, 0x20, 0x00, // 0020 +0x07, 0xb0, 0x00, 0x02, 0x08, 0xb0, 0x00, 0x04, // 0028 +0x04, 0xb0, 0x40, 0x00, 0x05, 0xb0, 0x00, 0x02, // 0030 +0x59, 0xb0, 0xc0, 0xfd, 0x0b, 0x12, 0x5b, 0x7a, // 0038 +0x5b, 0x7c, 0x4a, 0xc3, 0x50, 0x17, 0x02, 0x6f, // 0040 +0x02, 0x6a, 0x32, 0x18, 0x0a, 0x6a, 0x16, 0x40, // 0048 +0x04, 0x18, 0x1a, 0x66, 0x80, 0x90, 0x32, 0x00, // 0050 +0x0c, 0xf8, 0x38, 0x80, 0x80, 0x03, 0xc0, 0x08, // 0058 +0x18, 0x00, 0x80, 0x90, 0x51, 0x00, 0x04, 0xff, // 0060 +0x30, 0xc0, 0x80, 0x03, 0x20, 0x08, 0x10, 0x00, // 0068 +0x4c, 0xfe, 0x30, 0xc0, 0x09, 0x04, 0x20, 0x08, // 0070 +0x00, 0x00, 0x04, 0xfc, 0x38, 0x90, 0x80, 0x02, // 0078 +0xc0, 0x0b, 0x02, 0x00, 0x80, 0x90, 0x40, 0x00, // 0080 +0x04, 0xff, 0x30, 0xc0, 0x80, 0x03, 0x20, 0x08, // 0088 +0x14, 0x00, 0x4c, 0xfe, 0x30, 0xc0, 0x06, 0x04, // 0090 +0x20, 0x08, 0x00, 0x00, 0x8c, 0xf8, 0x2c, 0xe0, // 0098 +0x80, 0x03, 0x20, 0x30, 0x04, 0x00, 0x80, 0x45, // 00a0 +0x71, 0x42, 0xf2, 0x8c, 0xd1, 0xc0, 0x59, 0xb0, // 00a8 +0x40, 0x02, 0x00, 0x9e, 0x6d, 0x00, 0x29, 0x03, // 00b0 +0x00, 0xf4, 0x38, 0x80, 0x00, 0x0c, 0xb6, 0x40, // 00b8 +0x8c, 0xf8, 0x20, 0xe0, 0x80, 0x03, 0x00, 0x30, // 00c0 +0x18, 0x00, 0x15, 0x40, 0x08, 0xf0, 0x38, 0x80, // 00c8 +0x85, 0x0b, 0x66, 0xb5, 0xe0, 0xff, 0x88, 0xf0, // 00d0 +0x24, 0xe0, 0x86, 0x03, 0x0c, 0x60, 0x64, 0x08, // 00d8 +0x46, 0x62, 0x49, 0xc3, 0x50, 0x27, 0x04, 0x6a, // 00e0 +0x84, 0x6e, 0x07, 0x18, 0x69, 0xa0, 0x04, 0x5f, // 00e8 +0x1c, 0x8b, 0xf7, 0xc8, 0x45, 0x76, 0x6b, 0x1f, // 00f0 +0xb6, 0x40, 0x04, 0xb0, 0x40, 0x00, 0x05, 0xb0, // 00f8 +0x00, 0x02, 0x5a, 0x00, 0x06, 0xb4, 0x10, 0x00, // 0100 +0xa4, 0xff, 0x24, 0xcc, 0x60, 0x02, 0x00, 0xf8, // 0108 +0x3e, 0x00, 0x03, 0xff, 0x37, 0xd0, 0x78, 0x03, // 0110 +0xe0, 0x03, 0xbe, 0x0b, 0x10, 0x8b, 0xf6, 0x5b, // 0118 +0x00, 0x67, 0x5a, 0x00, 0x06, 0xb4, 0x10, 0x00, // 0120 +0xa4, 0xff, 0x24, 0xcc, 0xe0, 0x02, 0x00, 0xf8, // 0128 +0x3e, 0x00, 0x03, 0xff, 0x37, 0xd0, 0x78, 0x03, // 0130 +0xe0, 0x03, 0xbe, 0x0b, 0x10, 0x8b, 0xf6, 0x5b, // 0138 +0x00, 0x67, 0x5a, 0x00, 0x00, 0xf4, 0x38, 0x80, // 0140 +0x00, 0x04, 0x20, 0xb5, 0x00, 0x08, 0x04, 0xb0, // 0148 +0x20, 0x00, 0x8e, 0xf8, 0x20, 0xe0, 0x80, 0x03, // 0150 +0xc0, 0x43, 0x00, 0x00, 0x08, 0xf0, 0x38, 0x80, // 0158 +0x81, 0x03, 0x26, 0xb5, 0xe0, 0xff, 0x88, 0xf0, // 0160 +0x20, 0xe0, 0x86, 0x03, 0x08, 0x60, 0x64, 0x08, // 0168 +0x46, 0x62, 0x45, 0xc3, 0x50, 0x27, 0x04, 0x6a, // 0170 +0xa4, 0x6e, 0x7f, 0x90, 0xbf, 0xff, 0x65, 0xa0, // 0178 +0x04, 0x07, 0x18, 0x8b, 0xf6, 0xc8, 0x41, 0x76, // 0180 +0x6a, 0x1f, 0x5a, 0x00, 0xe1, 0x40, 0xf2, 0x40, // 0188 +0x0f, 0x7b, 0x02, 0x6f, 0x03, 0xb0, 0x80, 0x00, // 0190 +0x07, 0xb0, 0x00, 0x02, 0xe8, 0x00, 0x08, 0x6d, // 0198 +0xe8, 0xbf, 0x60, 0x01, 0x03, 0x18, 0x48, 0xb0, // 01a0 +0x20, 0x10, 0x89, 0x40, 0x1a, 0x40, 0x02, 0x6a, // 01a8 +0x24, 0x18, 0xa1, 0x40, 0x98, 0x40, 0xf2, 0x4a, // 01b0 +0x06, 0x1e, 0xff, 0x9f, 0xc5, 0xff, 0x21, 0xb5, // 01b8 +0x00, 0x08, 0x98, 0x40, 0x04, 0xb0, 0x40, 0x00, // 01c0 +0x95, 0x60, 0x80, 0x90, 0x18, 0x00, 0x48, 0xb0, // 01c8 +0x00, 0x04, 0x41, 0x76, 0x80, 0x90, 0x13, 0x00, // 01d0 +0x04, 0xb0, 0x00, 0x02, 0x65, 0x60, 0x91, 0x40, // 01d8 +0xa8, 0x40, 0x80, 0x90, 0x0c, 0x00, 0x48, 0xb0, // 01e0 +0x00, 0x04, 0x41, 0x76, 0x80, 0x90, 0x07, 0x00, // 01e8 +0x4a, 0xb0, 0x00, 0x08, 0xf2, 0x8c, 0xdf, 0xc0, // 01f0 +0x29, 0x03, 0xef, 0x03, 0x0c, 0xf8, 0x38, 0x80, // 01f8 +0x80, 0x03, 0xc0, 0xf8, 0x04, 0x00, 0x0c, 0xf8, // 0200 +0x38, 0x84, 0xc0, 0x03, 0xc0, 0xf8, 0x04, 0x00, // 0208 +0x00, 0x60, 0xff, 0x9f, 0x79, 0xff, 0x00, 0xb0, // 0210 +0x00, 0x04, 0xff, 0x9f, 0x85, 0xff, 0x04, 0xff, // 0218 +0x30, 0xcc, 0x10, 0x03, 0xe0, 0xfb, 0x3e, 0x00, // 0220 +0x04, 0xff, 0x33, 0xcc, 0x80, 0x03, 0xe0, 0xfb, // 0228 +0x10, 0x00, 0x4c, 0xfe, 0x33, 0xcc, 0x80, 0x03, // 0230 +0xe0, 0xfb, 0x14, 0x00, 0x80, 0x40, 0x06, 0xb0, // 0238 +0x40, 0x00, 0x8c, 0xf8, 0x2f, 0xe0, 0x80, 0x03, // 0240 +0xe0, 0x63, 0x00, 0x00, 0x20, 0xf7, 0xf0, 0xcf, // 0248 +0x10, 0x03, 0x20, 0xf7, 0xb0, 0xcf, 0x11, 0x13, // 0250 +0x20, 0xf7, 0x70, 0xcf, 0x12, 0x23, 0x20, 0xf7, // 0258 +0x30, 0xcf, 0x13, 0x33, 0x20, 0xf7, 0xf0, 0xce, // 0260 +0x14, 0x43, 0x20, 0xf7, 0xb0, 0xce, 0x15, 0x53, // 0268 +0x20, 0xf7, 0x70, 0xce, 0x16, 0x63, 0x20, 0xf7, // 0270 +0x30, 0xce, 0x17, 0x73, 0x20, 0xf7, 0xf0, 0xcd, // 0278 +0x18, 0x83, 0x20, 0xf7, 0xb0, 0xcd, 0x19, 0x93, // 0280 +0x20, 0xf7, 0x70, 0xcd, 0x1a, 0xa3, 0x20, 0xf7, // 0288 +0x30, 0xcd, 0x1b, 0xb3, 0x20, 0xf7, 0xf0, 0xcc, // 0290 +0x1c, 0xc3, 0x20, 0xf7, 0xb0, 0xcc, 0x1d, 0xd3, // 0298 +0x20, 0xf7, 0x70, 0xcc, 0x1e, 0xe3, 0x20, 0xf7, // 02a0 +0x30, 0xcc, 0x1f, 0xf3, 0x04, 0xff, 0x33, 0xcc, // 02a8 +0x80, 0x03, 0xe0, 0xfb, 0x10, 0x00, 0x4c, 0xfe, // 02b0 +0x33, 0xcc, 0x80, 0x03, 0xe0, 0xfb, 0x14, 0x00, // 02b8 +0x00, 0xb5, 0x20, 0x00, 0x8c, 0xf8, 0x2f, 0xe0, // 02c0 +0x80, 0x03, 0xe0, 0x63, 0x00, 0x00, 0x6f, 0x03, // 02c8 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 02d0 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 02d8 +}; diff --git a/libavcodec/rpi_hevc_transform8.h b/libavcodec/rpi_hevc_transform8.h new file mode 100644 index 0000000000..1128a2c054 --- /dev/null +++ b/libavcodec/rpi_hevc_transform8.h @@ -0,0 +1,94 @@ +static const unsigned char rpi_hevc_transform8 [] = { +0xa9, 0x03, 0x3e, 0x40, 0x4f, 0x40, 0x03, 0xb0, // 0000 +0x20, 0x00, 0x0c, 0xf8, 0x38, 0x88, 0x80, 0x03, // 0008 +0xc0, 0xf8, 0x00, 0x00, 0x40, 0xb0, 0x00, 0x02, // 0010 +0x0c, 0xf8, 0x38, 0xa8, 0x80, 0x03, 0xc0, 0xf8, // 0018 +0x00, 0x00, 0x00, 0x60, 0x03, 0xb0, 0x20, 0x00, // 0020 +0x07, 0xb0, 0x00, 0x02, 0x08, 0xb0, 0x00, 0x04, // 0028 +0x04, 0xb0, 0x40, 0x00, 0x05, 0xb0, 0x00, 0x08, // 0030 +0x59, 0xb0, 0xc0, 0xfd, 0x0b, 0x12, 0x5b, 0x7a, // 0038 +0x5b, 0x7c, 0x4a, 0xc3, 0x50, 0x17, 0x02, 0x6f, // 0040 +0x02, 0x6a, 0x32, 0x18, 0x0a, 0x6a, 0x16, 0x40, // 0048 +0x04, 0x18, 0x1a, 0x66, 0x80, 0x90, 0x32, 0x00, // 0050 +0x0c, 0xf8, 0x38, 0x80, 0x80, 0x03, 0xc0, 0x08, // 0058 +0x18, 0x00, 0x80, 0x90, 0x51, 0x00, 0x04, 0xff, // 0060 +0x30, 0xc0, 0x80, 0x03, 0x20, 0x08, 0x10, 0x00, // 0068 +0x4c, 0xfe, 0x30, 0xc0, 0x09, 0x04, 0x20, 0x08, // 0070 +0x00, 0x00, 0x04, 0xfc, 0x38, 0x90, 0x80, 0x02, // 0078 +0xc0, 0x0b, 0x02, 0x00, 0x80, 0x90, 0x40, 0x00, // 0080 +0x04, 0xff, 0x30, 0xc0, 0x80, 0x03, 0x20, 0x08, // 0088 +0x14, 0x00, 0x4c, 0xfe, 0x30, 0xc0, 0x04, 0x04, // 0090 +0x20, 0x08, 0x00, 0x00, 0x8c, 0xf8, 0x2c, 0xe0, // 0098 +0x80, 0x03, 0x20, 0x30, 0x04, 0x00, 0x80, 0x45, // 00a0 +0x71, 0x42, 0xf2, 0x8c, 0xd1, 0xc0, 0x59, 0xb0, // 00a8 +0x40, 0x02, 0x00, 0x9e, 0x6d, 0x00, 0x29, 0x03, // 00b0 +0x00, 0xf4, 0x38, 0x80, 0x00, 0x0c, 0xb6, 0x40, // 00b8 +0x8c, 0xf8, 0x20, 0xe0, 0x80, 0x03, 0x00, 0x30, // 00c0 +0x18, 0x00, 0x15, 0x40, 0x08, 0xf0, 0x38, 0x80, // 00c8 +0x85, 0x0b, 0x66, 0xb5, 0xe0, 0xff, 0x88, 0xf0, // 00d0 +0x24, 0xe0, 0x86, 0x03, 0x0c, 0x60, 0x64, 0x08, // 00d8 +0x46, 0x62, 0x49, 0xc3, 0x50, 0x27, 0x04, 0x6a, // 00e0 +0x84, 0x6e, 0x07, 0x18, 0x69, 0xa0, 0x04, 0x5f, // 00e8 +0x1c, 0x8b, 0xf7, 0xc8, 0x45, 0x76, 0x6b, 0x1f, // 00f0 +0xb6, 0x40, 0x04, 0xb0, 0x40, 0x00, 0x05, 0xb0, // 00f8 +0x00, 0x08, 0x5a, 0x00, 0x06, 0xb4, 0x10, 0x00, // 0100 +0xa4, 0xff, 0x24, 0xcc, 0x60, 0x02, 0x00, 0xf8, // 0108 +0x3e, 0x00, 0x03, 0xff, 0x37, 0xd0, 0x78, 0x03, // 0110 +0xe0, 0x03, 0xbe, 0x0b, 0x10, 0x8b, 0xf6, 0x5b, // 0118 +0x00, 0x67, 0x5a, 0x00, 0x06, 0xb4, 0x10, 0x00, // 0120 +0xa4, 0xff, 0x24, 0xcc, 0xe0, 0x02, 0x00, 0xf8, // 0128 +0x3e, 0x00, 0x03, 0xff, 0x37, 0xd0, 0x78, 0x03, // 0130 +0xe0, 0x03, 0xbe, 0x0b, 0x10, 0x8b, 0xf6, 0x5b, // 0138 +0x00, 0x67, 0x5a, 0x00, 0x00, 0xf4, 0x38, 0x80, // 0140 +0x00, 0x04, 0x20, 0xb5, 0x00, 0x08, 0x04, 0xb0, // 0148 +0x20, 0x00, 0x8e, 0xf8, 0x20, 0xe0, 0x80, 0x03, // 0150 +0xc0, 0x43, 0x00, 0x00, 0x08, 0xf0, 0x38, 0x80, // 0158 +0x81, 0x03, 0x26, 0xb5, 0xe0, 0xff, 0x88, 0xf0, // 0160 +0x20, 0xe0, 0x86, 0x03, 0x08, 0x60, 0x64, 0x08, // 0168 +0x46, 0x62, 0x45, 0xc3, 0x50, 0x27, 0x04, 0x6a, // 0170 +0xa4, 0x6e, 0x7f, 0x90, 0xbf, 0xff, 0x65, 0xa0, // 0178 +0x04, 0x07, 0x18, 0x8b, 0xf6, 0xc8, 0x41, 0x76, // 0180 +0x6a, 0x1f, 0x5a, 0x00, 0xe1, 0x40, 0xf2, 0x40, // 0188 +0x0f, 0x7b, 0x02, 0x6f, 0x03, 0xb0, 0x80, 0x00, // 0190 +0x07, 0xb0, 0x00, 0x02, 0xe8, 0x00, 0x08, 0x6d, // 0198 +0xe8, 0xbf, 0x60, 0x01, 0x03, 0x18, 0x48, 0xb0, // 01a0 +0x20, 0x10, 0x89, 0x40, 0x1a, 0x40, 0x02, 0x6a, // 01a8 +0x24, 0x18, 0xa1, 0x40, 0x98, 0x40, 0xf2, 0x4a, // 01b0 +0x06, 0x1e, 0xff, 0x9f, 0xc5, 0xff, 0x21, 0xb5, // 01b8 +0x00, 0x08, 0x98, 0x40, 0x04, 0xb0, 0x40, 0x00, // 01c0 +0x95, 0x60, 0x80, 0x90, 0x18, 0x00, 0x48, 0xb0, // 01c8 +0x00, 0x04, 0x41, 0x76, 0x80, 0x90, 0x13, 0x00, // 01d0 +0x04, 0xb0, 0x00, 0x08, 0x45, 0x60, 0x91, 0x40, // 01d8 +0xa8, 0x40, 0x80, 0x90, 0x0c, 0x00, 0x48, 0xb0, // 01e0 +0x00, 0x04, 0x41, 0x76, 0x80, 0x90, 0x07, 0x00, // 01e8 +0x4a, 0xb0, 0x00, 0x08, 0xf2, 0x8c, 0xdf, 0xc0, // 01f0 +0x29, 0x03, 0xef, 0x03, 0x0c, 0xf8, 0x38, 0x80, // 01f8 +0x80, 0x03, 0xc0, 0xf8, 0x04, 0x00, 0x0c, 0xf8, // 0200 +0x38, 0x84, 0xc0, 0x03, 0xc0, 0xf8, 0x04, 0x00, // 0208 +0x00, 0x60, 0xff, 0x9f, 0x79, 0xff, 0x00, 0xb0, // 0210 +0x00, 0x04, 0xff, 0x9f, 0x85, 0xff, 0x04, 0xff, // 0218 +0x30, 0xcc, 0x10, 0x03, 0xe0, 0xfb, 0x3e, 0x00, // 0220 +0x04, 0xff, 0x33, 0xcc, 0x80, 0x03, 0xe0, 0xfb, // 0228 +0x10, 0x00, 0x4c, 0xfe, 0x33, 0xcc, 0x80, 0x03, // 0230 +0xe0, 0xfb, 0x14, 0x00, 0x80, 0x40, 0x06, 0xb0, // 0238 +0x40, 0x00, 0x8c, 0xf8, 0x2f, 0xe0, 0x80, 0x03, // 0240 +0xe0, 0x63, 0x00, 0x00, 0x20, 0xf7, 0xf0, 0xcf, // 0248 +0x10, 0x03, 0x20, 0xf7, 0xb0, 0xcf, 0x11, 0x13, // 0250 +0x20, 0xf7, 0x70, 0xcf, 0x12, 0x23, 0x20, 0xf7, // 0258 +0x30, 0xcf, 0x13, 0x33, 0x20, 0xf7, 0xf0, 0xce, // 0260 +0x14, 0x43, 0x20, 0xf7, 0xb0, 0xce, 0x15, 0x53, // 0268 +0x20, 0xf7, 0x70, 0xce, 0x16, 0x63, 0x20, 0xf7, // 0270 +0x30, 0xce, 0x17, 0x73, 0x20, 0xf7, 0xf0, 0xcd, // 0278 +0x18, 0x83, 0x20, 0xf7, 0xb0, 0xcd, 0x19, 0x93, // 0280 +0x20, 0xf7, 0x70, 0xcd, 0x1a, 0xa3, 0x20, 0xf7, // 0288 +0x30, 0xcd, 0x1b, 0xb3, 0x20, 0xf7, 0xf0, 0xcc, // 0290 +0x1c, 0xc3, 0x20, 0xf7, 0xb0, 0xcc, 0x1d, 0xd3, // 0298 +0x20, 0xf7, 0x70, 0xcc, 0x1e, 0xe3, 0x20, 0xf7, // 02a0 +0x30, 0xcc, 0x1f, 0xf3, 0x04, 0xff, 0x33, 0xcc, // 02a8 +0x80, 0x03, 0xe0, 0xfb, 0x10, 0x00, 0x4c, 0xfe, // 02b0 +0x33, 0xcc, 0x80, 0x03, 0xe0, 0xfb, 0x14, 0x00, // 02b8 +0x00, 0xb5, 0x20, 0x00, 0x8c, 0xf8, 0x2f, 0xe0, // 02c0 +0x80, 0x03, 0xe0, 0x63, 0x00, 0x00, 0x6f, 0x03, // 02c8 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 02d0 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 02d8 +}; diff --git a/libavcodec/rpi_hevcdec.c b/libavcodec/rpi_hevcdec.c new file mode 100644 index 0000000000..e651e5c565 --- /dev/null +++ b/libavcodec/rpi_hevcdec.c @@ -0,0 +1,6134 @@ +/* + * HEVC video Decoder + * + * Copyright (C) 2012 - 2013 Guillaume Martres + * Copyright (C) 2012 - 2013 Mickael Raulet + * Copyright (C) 2012 - 2013 Gildas Cocherel + * Copyright (C) 2012 - 2013 Wassim Hamidouche + * Copyright (C) 2018 John Cox, Ben Avison, Peter de Rivaz for Raspberry Pi (Trading) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/attributes.h" +#include "libavutil/common.h" +#include "libavutil/display.h" +#include "libavutil/internal.h" +#include "libavutil/mastering_display_metadata.h" +#include "libavutil/md5.h" +#include "libavutil/opt.h" +#include "libavutil/pixdesc.h" +#include "libavutil/stereo3d.h" + +#include "decode.h" +#include "bswapdsp.h" +#include "bytestream.h" +#include "golomb.h" +#include "hevc.h" +#include "rpi_hevc_data.h" +#include "rpi_hevc_parse.h" +#include "rpi_hevcdec.h" +#include "rpi_hevc_cabac_fns.h" +#include "profiles.h" +#include "hwconfig.h" + +#include "rpi_zc_frames.h" +#include "rpi_qpu.h" +#include "rpi_hevc_shader.h" +#include "rpi_hevc_shader_cmd.h" +#include "rpi_hevc_shader_template.h" +#include "rpi_zc.h" +#include "libavutil/rpi_sand_fns.h" + +#include "pthread.h" +#include + +#define DEBUG_DECODE_N 0 // 0 = do all, n = frames idr onwards + +#define PACK2(hi,lo) (((hi) << 16) | ((lo) & 0xffff)) + +#ifndef av_mod_uintp2 +static av_always_inline av_const unsigned av_mod_uintp2_c(unsigned a, unsigned p) +{ + return a & ((1 << p) - 1); +} +# define av_mod_uintp2 av_mod_uintp2_c +#endif + +const uint8_t ff_hevc_rpi_pel_weight[65] = { [2] = 0, [4] = 1, [6] = 2, [8] = 3, [12] = 4, [16] = 5, [24] = 6, [32] = 7, [48] = 8, [64] = 9 }; +static void rpi_begin(const HEVCRpiContext * const s, HEVCRpiJob * const jb, const unsigned int ctu_ts_first); + +#define MC_DUMMY_X (-32) +#define MC_DUMMY_Y (-32) + +// UV & Y both have min 4x4 pred (no 2x2 chroma) +// Allow for even spread +1 for setup, +1 for rounding +// As we have load sharing this can (in theory) be exceeded so we have to +// check after each CTU, but it is a good base size + +// Worst case (all 4x4) commands per CTU +#define QPU_Y_CMD_PER_CTU_MAX (16 * 16) +#define QPU_C_CMD_PER_CTU_MAX (8 * 8) + +#define QPU_MAX_CTU_PER_LINE ((HEVC_RPI_MAX_WIDTH + 63) / 64) + +#define QPU_GRPS (QPU_N_MAX / QPU_N_GRP) +#define QPU_CTU_PER_GRP ((QPU_MAX_CTU_PER_LINE + QPU_GRPS - 1) / QPU_GRPS) + +#define QPU_Y_CMD_SLACK_PER_Q (QPU_Y_CMD_PER_CTU_MAX / 2) +#define QPU_C_CMD_SLACK_PER_Q (QPU_C_CMD_PER_CTU_MAX / 2) + +// Total cmds to allocate - allow for slack & setup +#define QPU_Y_COMMANDS (QPU_CTU_PER_GRP * QPU_GRPS * QPU_Y_CMD_PER_CTU_MAX + (1 + QPU_Y_CMD_SLACK_PER_Q) * QPU_N_MAX) +#define QPU_C_COMMANDS (QPU_CTU_PER_GRP * QPU_GRPS * QPU_C_CMD_PER_CTU_MAX + (1 + QPU_C_CMD_SLACK_PER_Q) * QPU_N_MAX) + +#define QPU_Y_SYNCS (QPU_N_MAX * (16 + 2)) +#define QPU_C_SYNCS (QPU_N_MAX * (8 + 2)) + +// The QPU code for UV blocks only works up to a block width of 8 +#define RPI_CHROMA_BLOCK_WIDTH 8 + +#define ENCODE_COEFFS(c0, c1, c2, c3) (((c0) & 0xff) | ((c1) & 0xff) << 8 | ((c2) & 0xff) << 16 | ((c3) & 0xff) << 24) + + +// Actual filter goes -ve, +ve, +ve, -ve using these values +static const uint32_t rpi_filter_coefs[8] = { + ENCODE_COEFFS( 0, 64, 0, 0), + ENCODE_COEFFS( 2, 58, 10, 2), + ENCODE_COEFFS( 4, 54, 16, 2), + ENCODE_COEFFS( 6, 46, 28, 4), + ENCODE_COEFFS( 4, 36, 36, 4), + ENCODE_COEFFS( 4, 28, 46, 6), + ENCODE_COEFFS( 2, 16, 54, 4), + ENCODE_COEFFS( 2, 10, 58, 2) +}; + +// Function arrays by QPU + +static const int * const inter_pred_setup_c_qpu[12] = { + mc_setup_c_q0, mc_setup_c_qn, mc_setup_c_qn, mc_setup_c_qn, + mc_setup_c_qn, mc_setup_c_qn, mc_setup_c_qn, mc_setup_c_qn, + mc_setup_c_qn, mc_setup_c_qn, mc_setup_c_qn, mc_setup_c_qn +}; + +static const int * const inter_pred_setup_c10_qpu[12] = { + mc_setup_c10_q0, mc_setup_c10_qn, mc_setup_c10_qn, mc_setup_c10_qn, + mc_setup_c10_qn, mc_setup_c10_qn, mc_setup_c10_qn, mc_setup_c10_qn, + mc_setup_c10_qn, mc_setup_c10_qn, mc_setup_c10_qn, mc_setup_c10_qn +}; + +static const int * const inter_pred_setup_y_qpu[12] = { + mc_setup_y_q0, mc_setup_y_qn, mc_setup_y_qn, mc_setup_y_qn, + mc_setup_y_qn, mc_setup_y_qn, mc_setup_y_qn, mc_setup_y_qn, + mc_setup_y_qn, mc_setup_y_qn, mc_setup_y_qn, mc_setup_y_qn +}; + +static const int * const inter_pred_setup_y10_qpu[12] = { + mc_setup_y10_q0, mc_setup_y10_qn, mc_setup_y10_qn, mc_setup_y10_qn, + mc_setup_y10_qn, mc_setup_y10_qn, mc_setup_y10_qn, mc_setup_y10_qn, + mc_setup_y10_qn, mc_setup_y10_qn, mc_setup_y10_qn, mc_setup_y10_qn +}; + +static const int * const inter_pred_sync_qpu[12] = { + mc_sync_q0, mc_sync_q1, mc_sync_q2, mc_sync_q3, + mc_sync_q4, mc_sync_q5, mc_sync_q6, mc_sync_q7, + mc_sync_q8, mc_sync_q9, mc_sync_q10, mc_sync_q11 +}; + +static const int * const inter_pred_sync10_qpu[12] = { + mc_sync10_q0, mc_sync10_q1, mc_sync10_q2, mc_sync10_q3, + mc_sync10_q4, mc_sync10_q5, mc_sync10_q6, mc_sync10_q7, + mc_sync10_q8, mc_sync10_q9, mc_sync10_q10, mc_sync10_q11 +}; + +static const int * const inter_pred_exit_c_qpu[12] = { + mc_exit_c_q0, mc_exit_c_qn, mc_exit_c_qn, mc_exit_c_qn, + mc_exit_c_qn, mc_exit_c_qn, mc_exit_c_qn, mc_exit_c_qn, + mc_exit_c_qn, mc_exit_c_qn, mc_exit_c_qn, mc_exit_c_qn +}; + +static const int * const inter_pred_exit_c10_qpu[12] = { + mc_exit_c10_q0, mc_exit_c10_qn, mc_exit_c10_qn, mc_exit_c10_qn, + mc_exit_c10_qn, mc_exit_c10_qn, mc_exit_c10_qn, mc_exit_c10_qn, + mc_exit_c10_qn, mc_exit_c10_qn, mc_exit_c10_qn, mc_exit_c10_qn +}; + +static const int * const inter_pred_exit_y_qpu[12] = { + mc_exit_y_q0, mc_exit_y_qn, mc_exit_y_qn, mc_exit_y_qn, + mc_exit_y_qn, mc_exit_y_qn, mc_exit_y_qn, mc_exit_y_qn, + mc_exit_y_qn, mc_exit_y_qn, mc_exit_y_qn, mc_exit_y_qn +}; + +static const int * const inter_pred_exit_y10_qpu[12] = { + mc_exit_y10_q0, mc_exit_y10_qn, mc_exit_y10_qn, mc_exit_y10_qn, + mc_exit_y10_qn, mc_exit_y10_qn, mc_exit_y10_qn, mc_exit_y10_qn, + mc_exit_y10_qn, mc_exit_y10_qn, mc_exit_y10_qn, mc_exit_y10_qn +}; + +typedef struct ipe_chan_info_s +{ + const uint8_t bit_depth; + const uint8_t n; + const int * const * setup_fns; + const int * const * sync_fns; + const int * const * exit_fns; +} ipe_chan_info_t; + +typedef struct ipe_init_info_s +{ + ipe_chan_info_t luma; + ipe_chan_info_t chroma; +} ipe_init_info_t; + +static void set_bytes(uint8_t * b, const unsigned int stride, const int ln, unsigned int a) +{ + switch (ln) + { + default: // normally 0 + *b = a; + break; + case 1: + a |= a << 8; + *(uint16_t *)b = a; + b += stride; + *(uint16_t *)b = a; + break; + case 2: + a |= a << 8; + a |= a << 16; + *(uint32_t *)b = a; + b += stride; + *(uint32_t *)b = a; + b += stride; + *(uint32_t *)b = a; + b += stride; + *(uint32_t *)b = a; + break; + case 3: + { + unsigned int i; + uint64_t d; + a |= a << 8; + a |= a << 16; + d = ((uint64_t)a << 32) | a; + for (i = 0; i != 8; ++i, b += stride) + *(uint64_t *)b = d; + break; + } + case 4: + { + unsigned int i; + uint64_t d; + a |= a << 8; + a |= a << 16; + d = ((uint64_t)a << 32) | a; + for (i = 0; i != 16; ++i, b += stride) + { + *(uint64_t *)b = d; + *(uint64_t *)(b + 8) = d; + } + break; + } + } +} + +// We expect this to be called with ln = (log2_cb_size - 3) so range = -1..3 +// (4 not required) +static void set_stash2(uint8_t * b_u, uint8_t * b_l, const int ln, unsigned int a) +{ + switch (ln) + { + default: // 0 or -1 + *b_u = a; + *b_l = a; + break; + case 1: + a |= a << 8; + *(uint16_t *)b_u = a; + *(uint16_t *)b_l = a; + break; + case 2: + a |= a << 8; + a |= a << 16; + *(uint32_t *)b_u = a; + *(uint32_t *)b_l = a; + break; + case 3: + a |= a << 8; + a |= a << 16; + *(uint32_t *)b_u = a; + *(uint32_t *)(b_u + 4) = a; + *(uint32_t *)b_l = a; + *(uint32_t *)(b_l + 4) = a; + break; + case 4: + a |= a << 8; + a |= a << 16; + *(uint32_t *)b_u = a; + *(uint32_t *)(b_u + 4) = a; + *(uint32_t *)(b_u + 8) = a; + *(uint32_t *)(b_u + 12) = a; + *(uint32_t *)b_l = a; + *(uint32_t *)(b_l + 4) = a; + *(uint32_t *)(b_l + 8) = a; + *(uint32_t *)(b_l + 12) = a; + break; + } +} + +static void zap_cabac_stash(uint8_t * b, const int ln) +{ + switch (ln) + { + default: // 0 + *b = 0; + break; + case 1: + *(uint16_t *)b = 0; + break; + case 2: + *(uint32_t *)b = 0; + break; + case 3: + *(uint32_t *)b = 0; + *(uint32_t *)(b + 4) = 0; + break; + } +} + + + +// Set a small square block of bits in a bitmap +// Bits must be aligned on their size boundry (which will be true of all split CBs) +static void set_bits(uint8_t * f, const unsigned int x, const unsigned int stride, const unsigned int ln) +{ + unsigned int n; + const unsigned int sh = (x & 7); + + f += (x >> 3); + + av_assert2(ln <= 3); + av_assert2((x & ((1 << ln) - 1)) == 0); + + switch (ln) + { + default: // 1 + f[0] |= 1 << sh; + break; + case 1: // 3 * 2 + n = 3 << sh; + f[0] |= n; + f[stride] |= n; + break; + case 2: // 0xf * 4 + n = 0xf << sh; + f[0] |= n; + f[stride] |= n; + f[stride * 2] |= n; + f[stride * 3] |= n; + break; + case 3: // 0xff * 8 + for (n = 0; n != 8; ++n, f += stride) + *f = 0xff; + break; + } +} + +static const ipe_init_info_t ipe_init_infos[9] = { // Alloc for bit depths of 8-16 + { // 8 + .luma = {8, QPU_MC_PRED_N_Y8, inter_pred_setup_y_qpu, inter_pred_sync_qpu, inter_pred_exit_y_qpu}, + .chroma = {8, QPU_MC_PRED_N_C8, inter_pred_setup_c_qpu, inter_pred_sync_qpu, inter_pred_exit_c_qpu} + }, + { // 9 + .luma = {0}, + .chroma = {0} + }, + { // 10 + .luma = {10, QPU_MC_PRED_N_Y10, inter_pred_setup_y10_qpu, inter_pred_sync10_qpu, inter_pred_exit_y10_qpu}, + .chroma = {10, QPU_MC_PRED_N_C10, inter_pred_setup_c10_qpu, inter_pred_sync10_qpu, inter_pred_exit_c10_qpu} + } + +}; + +static void set_ipe_from_ici(HEVCRpiInterPredEnv * const ipe, const ipe_chan_info_t * const ici) +{ + const unsigned int n = ici->n; + const unsigned int q1_size = (ipe->gptr.numbytes / n) & ~3; // Round down to word + + ipe->n = n; + ipe->max_fill = q1_size - ipe->min_gap; + for(unsigned int i = 0; i < n; i++) { + HEVCRpiInterPredQ * const q = ipe->q + i; + q->qpu_mc_curr = q->qpu_mc_base = + (qpu_mc_pred_cmd_t *)(ipe->gptr.arm + i * q1_size); + q->code_setup = qpu_fn(ici->setup_fns[i]); + q->code_sync = qpu_fn(ici->sync_fns[i]); + q->code_exit = qpu_fn(ici->exit_fns[i]); + } +} + +static void rpi_hevc_qpu_set_fns(HEVCRpiContext * const s, const unsigned int bit_depth) +{ + av_assert0(bit_depth >= 8 && bit_depth <= 16); + + rpi_hevc_qpu_init_fn(&s->qpu, bit_depth); +} + +// Unsigned Trivial MOD +static inline unsigned int utmod(const unsigned int x, const unsigned int n) +{ + return x >= n ? x - n : x; +} + +// returns pq->job_n++ +static inline unsigned int pass_queue_inc_job_n(HEVCRpiPassQueue * const pq) +{ + unsigned int const x2 = pq->job_n; + pq->job_n = utmod(x2 + 1, RPI_MAX_JOBS); + return x2; +} + +static void pass_queue_init(HEVCRpiPassQueue * const pq, HEVCRpiContext * const s, HEVCRpiWorkerFn * const worker, sem_t * const psem_out, const int n) +{ + pq->terminate = 0; + pq->job_n = 0; + pq->context = s; + pq->worker = worker; + pq->psem_out = psem_out; + pq->pass_n = n; + pq->started = 0; + sem_init(&pq->sem_in, 0, 0); +} + +static void pass_queue_kill(HEVCRpiPassQueue * const pq) +{ + sem_destroy(&pq->sem_in); +} + +static inline void rpi_sem_wait(sem_t * const sem) +{ + while (sem_wait(sem) != 0) { + av_assert0(errno == EINTR); + } +} + +static void pass_queue_submit_job(HEVCRpiPassQueue * const pq) +{ + sem_post(&pq->sem_in); +} + +static inline void pass_queue_do_all(HEVCRpiContext * const s, HEVCRpiJob * const jb) +{ + // Do the various passes - common with the worker code + for (unsigned int i = 0; i != RPI_PASSES; ++i) { + s->passq[i].worker(s, jb); + } +} + + +#if 0 +static void dump_jbc(const HEVCRpiJobCtl *const jbc, const char * const func) +{ + int x; + sem_getvalue((sem_t *)&jbc->sem_out, &x); + printf("%s: jbc: in=%d, out=%d, sum=%d\n", func, jbc->offload_in, jbc->offload_out, x); +} +#endif + + +static HEVCRpiJob * job_alloc(HEVCRpiJobCtl * const jbc, HEVCRpiLocalContext * const lc) +{ + HEVCRpiJob * jb; + HEVCRpiJobGlobal * const jbg = jbc->jbg; + + pthread_mutex_lock(&jbg->lock); + // Check local 1st + if ((jb = jbc->jb1) != NULL) + { + // Only 1 - very easy :-) + jbc->jb1 = NULL; + } + else + { + // Now look for global free chain + if ((jb = jbg->free1) != NULL) + { + // Found one - unlink it + jbg->free1 = jb->next; + jb->next = NULL; + } + else + { + // Out of places to look - wait for one to become free - add to Qs + + // Global + // If "good" lc then add after the last "good" el in the chain + // otherwise add to the tail + if (jbg->wait_tail == NULL || jbg->wait_tail->last_progress_good || !lc->last_progress_good) + { + // Add to end as we had to wait last time or wait Q empty + if ((lc->jw_prev = jbg->wait_tail) == NULL) + jbg->wait_head = lc; + else + lc->jw_prev->jw_next = lc; + lc->jw_next = NULL; + jbg->wait_tail = lc; + } + else + { + // This is a "good" lc that we need to poke into the middle + // of the Q + // We know that the Q isn't empty and there is at least one + // !last_progess_good el in it from the previous test + + HEVCRpiLocalContext * const p = jbg->wait_good; // Insert after + + if (p == NULL) + { + // No current good els - add to head + lc->jw_next = jbg->wait_head; + jbg->wait_head = lc; + } + else + { + lc->jw_next = p->jw_next; + p->jw_next = lc; + } + + lc->jw_next->jw_prev = lc; + lc->jw_prev = p; + } + + // If "good" then we are now the last good waiting el + if (lc->last_progress_good) + jbg->wait_good = lc; + + // Local + if ((lc->ljw_prev = jbc->lcw_tail) == NULL) + jbc->lcw_head = lc; + else + lc->ljw_prev->ljw_next = lc; + lc->ljw_next = NULL; + jbc->lcw_tail = lc; + } + } + + pthread_mutex_unlock(&jbg->lock); + + if (jb == NULL) // Need to wait + { + rpi_sem_wait(&lc->jw_sem); + jb = lc->jw_job; // Set by free code + } + + return jb; +} + + +static void job_free(HEVCRpiJobCtl * const jbc0, HEVCRpiJob * const jb) +{ + HEVCRpiJobGlobal * const jbg = jbc0->jbg; // This jbc only used to find jbg so we can get the lock + HEVCRpiJobCtl * jbc = jb->jbc_local; + HEVCRpiLocalContext * lc = NULL; + + pthread_mutex_lock(&jbg->lock); + + if (jbc != NULL) + { + av_assert1(jbc->jb1 == NULL); + + // Release to Local if nothing waiting there + if ((lc = jbc->lcw_head) == NULL) + jbc->jb1 = jb; + } + else + { + // Release to global if nothing waiting there + if ((lc = jbg->wait_head) == NULL) + { + jb->next = jbg->free1; + jbg->free1 = jb; + } + else + { + // ? seems somehow mildy ugly... + jbc = lc->context->jbc; + } + } + + if (lc != NULL) + { + // Something was waiting + + // Unlink + // Global + if (lc->jw_next == NULL) + jbg->wait_tail = lc->jw_prev; + else + lc->jw_next->jw_prev = lc->jw_prev; + + if (lc->jw_prev == NULL) + jbg->wait_head = lc->jw_next; + else + lc->jw_prev->jw_next = lc->jw_next; + + // Local + if (lc->ljw_next == NULL) + jbc->lcw_tail = lc->ljw_prev; + else + lc->ljw_next->ljw_prev = lc->ljw_prev; + + if (lc->ljw_prev == NULL) + jbc->lcw_head = lc->ljw_next; + else + lc->ljw_prev->ljw_next = lc->ljw_next; + + // Update good if required + if (jbg->wait_good == lc) + jbg->wait_good = lc->jw_prev; + + // Prod + lc->jw_job = jb; + sem_post(&lc->jw_sem); + } + + pthread_mutex_unlock(&jbg->lock); +} + +static void job_lc_kill(HEVCRpiLocalContext * const lc) +{ + sem_destroy(&lc->jw_sem); +} + +static void job_lc_init(HEVCRpiLocalContext * const lc) +{ + lc->jw_next = NULL; + lc->jw_prev = NULL; + lc->ljw_next = NULL; + lc->ljw_prev = NULL; + lc->jw_job = NULL; + sem_init(&lc->jw_sem, 0, 0); +} + +// Returns: +// 0 if we have waited for MV or expect to wait for recon +// 1 if we haven't waited for MV & do not need to wait for recon +static int progress_good(const HEVCRpiContext *const s, const HEVCRpiJob * const jb) +{ + if (jb->waited) // reset by rpi_begin + return 0; + for (unsigned int i = 0; i != FF_ARRAY_ELEMS(jb->progress_req); ++i) + { + if (jb->progress_req[i] >= 0 && s->DPB[i].tf.progress != NULL && + ((volatile int *)(s->DPB[i].tf.progress->data))[0] < jb->progress_req[i]) + return 0; + } + return 1; +} + +// Submit job if it is full (indicated by having ctu_ts_last set >= 0) +static inline void worker_submit_job(HEVCRpiContext *const s, HEVCRpiLocalContext * const lc) +{ + HEVCRpiJobCtl *const jbc = s->jbc; + HEVCRpiJob * const jb = lc->jb0; + + av_assert1(jb != NULL); + + if (jb->ctu_ts_last < 0) { + return; + } + + lc->last_progress_good = progress_good(s, jb); + jb->waited = !lc->last_progress_good; + lc->jb0 = NULL; + + if (s->offload_recon) + { + pthread_mutex_lock(&jbc->in_lock); + jbc->offloadq[jbc->offload_in] = jb; + jbc->offload_in = utmod(jbc->offload_in + 1, RPI_MAX_JOBS); + pthread_mutex_unlock(&jbc->in_lock); + + pass_queue_submit_job(s->passq + 0); // Consumes job eventually + } + else + { + pass_queue_do_all(s, jb); // Consumes job before return + } +} + + +// Call worker_pass0_ready to wait until the s->pass0_job slot becomes +// available to receive the next job. +// +// Now safe against multiple callers - needed for tiles +// "normal" and WPP will only call here one at a time +static inline void worker_pass0_ready(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc) +{ + HEVCRpiJobCtl * const jbc = s->jbc; + + // It is legit for us to already have a job allocated - do nothing in this case + if (lc->jb0 != NULL) + return; + + if (s->offload_recon) + rpi_sem_wait(&jbc->sem_out); // This sem will stop this frame grabbing too much + + lc->jb0 = job_alloc(jbc, lc); + + rpi_begin(s, lc->jb0, lc->ts); +} + +// Free up a job without submission +static void worker_free(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc) +{ + HEVCRpiJobCtl * const jbc = s->jbc; + HEVCRpiJob * const jb = lc->jb0; + + if (jb == NULL) { + return; + } + + lc->jb0 = NULL; + + job_free(jbc, jb); + + // If offload then poke sem_out too + if (s->offload_recon) { + sem_post(&jbc->sem_out); + } +} + + +// Call this to wait for all jobs to have completed at the end of a frame +// Slightly icky as there is no clean way to wait for a sem to count up +// Not reentrant - call on main thread only +static void worker_wait(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc) +{ + HEVCRpiJobCtl * const jbc = s->jbc; + int i = 0; + + // We shouldn't reach here with an unsubmitted job + av_assert1(lc->jb0 == NULL); + + // If no offload then there can't be anything to wait for + if (!s->offload_recon) { + return; + } + + if (sem_getvalue(&jbc->sem_out, &i) == 0 && i < RPI_MAX_JOBS) + { + for (i = 0; i != RPI_MAX_JOBS; ++i) { + rpi_sem_wait(&jbc->sem_out); + } + for (i = 0; i != RPI_MAX_JOBS; ++i) { + sem_post(&jbc->sem_out); + } + } +} + +static void * pass_worker(void *arg) +{ + HEVCRpiPassQueue *const pq = (HEVCRpiPassQueue *)arg; + HEVCRpiContext *const s = pq->context; + + for (;;) + { + rpi_sem_wait(&pq->sem_in); + + if (pq->terminate) + break; + + pq->worker(s, s->jbc->offloadq[pass_queue_inc_job_n(pq)]); + // * should really set jb->passes_done here + + sem_post(pq->psem_out); + } + return NULL; +} + +static void pass_queues_start_all(HEVCRpiContext *const s) +{ + unsigned int i; + HEVCRpiPassQueue * const pqs = s->passq; + + for (i = 0; i != RPI_PASSES; ++i) + { + av_assert0(pthread_create(&pqs[i].thread, NULL, pass_worker, pqs + i) == 0); + pqs[i].started = 1; + } +} + +static void pass_queues_term_all(HEVCRpiContext *const s) +{ + unsigned int i; + HEVCRpiPassQueue * const pqs = s->passq; + + for (i = 0; i != RPI_PASSES; ++i) + pqs[i].terminate = 1; + for (i = 0; i != RPI_PASSES; ++i) + { + if (pqs[i].started) + sem_post(&pqs[i].sem_in); + } + for (i = 0; i != RPI_PASSES; ++i) + { + if (pqs[i].started) { + pthread_join(pqs[i].thread, NULL); + pqs[i].started = 0; + } + } +} + +static void pass_queues_kill_all(HEVCRpiContext *const s) +{ + unsigned int i; + HEVCRpiPassQueue * const pqs = s->passq; + + for (i = 0; i != RPI_PASSES; ++i) + pass_queue_kill(pqs + i); +} + + +static void worker_pic_free_one(HEVCRpiJob * const jb) +{ + // Free coeff stuff - allocation not the same for all buffers + HEVCRpiCoeffsEnv * const cf = &jb->coeffs; + + if (cf->s[0].buf != NULL) + av_freep(&cf->mptr); + if (cf->s[2].buf != NULL) + gpu_free(&cf->gptr); + memset(cf, 0, sizeof(*cf)); +} + +static int worker_pic_alloc_one(HEVCRpiJob * const jb, const unsigned int coeff_count) +{ + HEVCRpiCoeffsEnv * const cf = &jb->coeffs; + + if (gpu_malloc_cached((coeff_count + 32*32) * sizeof(cf->s[2].buf[0]), &cf->gptr) != 0) + goto fail; + cf->s[2].buf = (int16_t *)cf->gptr.arm; + cf->s[3].buf = cf->s[2].buf + coeff_count; + + // Must be 64 byte aligned for our zero zapping code so over-allocate & + // round + if ((cf->mptr = av_malloc(coeff_count * sizeof(cf->s[0].buf[0]) + 63)) == NULL) + goto fail; + cf->s[0].buf = (void *)(((intptr_t)cf->mptr + 63) & ~63); + return 0; + +fail: + av_log(NULL, AV_LOG_ERROR, "%s: Allocation failed\n", __func__); + worker_pic_free_one(jb); + return -1; +} + +static void worker_pic_reset(HEVCRpiCoeffsEnv * const cf) +{ + unsigned int i; + for (i = 0; i != 4; ++i) { + cf->s[i].n = 0; +#if RPI_COMPRESS_COEFFS + cf->s[i].packed = 1; + cf->s[i].packed_n = 0; +#endif + } +} + +int16_t * rpi_alloc_coeff_buf(HEVCRpiJob * const jb, const int buf_no, const int n) +{ + HEVCRpiCoeffEnv *const cfe = jb->coeffs.s + buf_no; + int16_t * const coeffs = (buf_no != 3) ? cfe->buf + cfe->n : cfe->buf - (cfe->n + n); + cfe->n += n; + return coeffs; +} + +void ff_hevc_rpi_progress_wait_field(const HEVCRpiContext * const s, HEVCRpiJob * const jb, + const HEVCRpiFrame * const ref, const int val, const int field) +{ + if (ref->tf.progress != NULL && ((int *)ref->tf.progress->data)[field] < val) { + HEVCRpiContext *const fs = ref->tf.owner[field]->priv_data; + HEVCRpiFrameProgressState * const pstate = fs->progress_states + field; + sem_t * sem = NULL; + + av_assert0(pthread_mutex_lock(&pstate->lock) == 0); + if (((volatile int *)ref->tf.progress->data)[field] < val) { + HEVCRpiFrameProgressWait * const pwait = &jb->progress_wait; + + av_assert1(pwait->req == -1 && pwait->next == NULL); + jb->waited = 1; // Remember that we had to wait for later scheduling + + pwait->req = val; + pwait->next = NULL; + if (pstate->first == NULL) + pstate->first = pwait; + else + pstate->last->next = pwait; + pstate->last = pwait; + sem = &pwait->sem; + } + pthread_mutex_unlock(&pstate->lock); + + if (sem != NULL) { + rpi_sem_wait(sem); + } + } +} + +void ff_hevc_rpi_progress_signal_field(HEVCRpiContext * const s, const int val, const int field) +{ + HEVCRpiFrameProgressState *const pstate = s->progress_states + field; + + ((int *)s->ref->tf.progress->data)[field] = val; + + av_assert0(pthread_mutex_lock(&pstate->lock) == 0); + { + HEVCRpiFrameProgressWait ** ppwait = &pstate->first; + HEVCRpiFrameProgressWait * pwait; + + while ((pwait = *ppwait) != NULL) { + if (pwait->req > val) + { + ppwait = &pwait->next; + pstate->last = pwait; + } + else + { + *ppwait = pwait->next; + pwait->req = -1; + pwait->next = NULL; + sem_post(&pwait->sem); + } + } + } + pthread_mutex_unlock(&pstate->lock); +} + +static void ff_hevc_rpi_progress_init_state(HEVCRpiFrameProgressState * const pstate) +{ + pstate->first = NULL; + pstate->last = NULL; + pthread_mutex_init(&pstate->lock, NULL); +} + +static void ff_hevc_rpi_progress_init_wait(HEVCRpiFrameProgressWait * const pwait) +{ + pwait->req = -1; + pwait->next = NULL; + sem_init(&pwait->sem, 0, 0); +} + +static void ff_hevc_rpi_progress_kill_state(HEVCRpiFrameProgressState * const pstate) +{ + av_assert1(pstate->first == NULL); + pthread_mutex_destroy(&pstate->lock); +} + +static void ff_hevc_rpi_progress_kill_wait(HEVCRpiFrameProgressWait * const pwait) +{ + sem_destroy(&pwait->sem); +} + + +/** + * NOTE: Each function hls_foo correspond to the function foo in the + * specification (HLS stands for High Level Syntax). + */ + +/** + * Section 5.7 + */ + +// Realloc the entry point arrays +static int alloc_entry_points(RpiSliceHeader * const sh, const int n) +{ + if (sh->entry_point_offset == NULL || n > sh->offsets_allocated || n == 0) + { + // Round up alloc to multiple of 32 + int a = (n + 31) & ~31; + + // We don't care about the previous contents so probably fastest to simply discard + av_freep(&sh->entry_point_offset); + av_freep(&sh->offset); + av_freep(&sh->size); + + if (a != 0) + { + sh->entry_point_offset = av_malloc_array(a, sizeof(unsigned)); + sh->offset = av_malloc_array(a, sizeof(int)); + sh->size = av_malloc_array(a, sizeof(int)); + + if (!sh->entry_point_offset || !sh->offset || !sh->size) { + sh->num_entry_point_offsets = 0; + sh->offsets_allocated = 0; + return AVERROR(ENOMEM); + } + } + + sh->offsets_allocated = a; + } + + return 0; +} + +/* free everything allocated by pic_arrays_init() */ +static void pic_arrays_free(HEVCRpiContext *s) +{ + av_freep(&s->sao); + av_freep(&s->deblock); + + av_freep(&s->cabac_stash_up); + s->cabac_stash_left = NULL; // freed with _up + + av_freep(&s->mvf_up); + av_freep(&s->mvf_left); + + av_freep(&s->is_pcm); + av_freep(&s->is_intra_store); + s->is_intra = NULL; + av_freep(&s->rpl_tab); + s->rpl_tab_size = 0; + + av_freep(&s->qp_y_tab); + av_freep(&s->tab_slice_address); + av_freep(&s->filter_slice_edges); + + av_freep(&s->bs_horizontal); + s->bs_vertical = NULL; // freed with H + av_freep(&s->bsf_stash_left); + av_freep(&s->bsf_stash_up); + + av_freep(&s->rpl_up); + av_freep(&s->rpl_left); + + alloc_entry_points(&s->sh, 0); + + av_buffer_pool_uninit(&s->col_mvf_pool); +} + +/* allocate arrays that depend on frame dimensions */ +static int pic_arrays_init(HEVCRpiContext * const s, const HEVCRpiSPS * const sps) +{ + const unsigned int log2_min_cb_size = sps->log2_min_cb_size; + const unsigned int width = sps->width; + const unsigned int height = sps->height; + const unsigned int pic_size_in_cb = ((width >> log2_min_cb_size) + 1) * + ((height >> log2_min_cb_size) + 1); + const unsigned int ctb_count = sps->ctb_size; + + { + unsigned int w = ((width + HEVC_RPI_BS_STRIDE1_PEL_MASK) & ~HEVC_RPI_BS_STRIDE1_PEL_MASK); + unsigned int h = ((height + 15) & ~15); + + s->bs_stride2 = h >> HEVC_RPI_BS_COL_BYTES_SHR; // Column size + s->bs_size = s->bs_stride2 * (w >> HEVC_RPI_BS_STRIDE1_PEL_SHIFT); // col size * cols + } + + s->sao = av_mallocz(ctb_count * sizeof(*s->sao) + 8); // Our sao code overreads this array slightly + s->deblock = av_mallocz_array(ctb_count, sizeof(*s->deblock)); + if (!s->sao || !s->deblock) + goto fail; + + s->cabac_stash_up = av_malloc((((width + 63) & ~63) >> 3) + (((height + 63) & ~63) >> 3)); + s->cabac_stash_left = s->cabac_stash_up + (((width + 63) & ~63) >> 3); + if (s->cabac_stash_up == NULL) + goto fail; + + // Round width up to max ctb size + s->mvf_up = av_malloc((((width + 63) & ~63) >> LOG2_MIN_PU_SIZE) * sizeof(*s->mvf_up)); + // * Only needed if we have H tiles + s->mvf_left = av_malloc((((height + 63) & ~63) >> LOG2_MIN_PU_SIZE) * sizeof(*s->mvf_up)); + + // We can overread by 1 line & one byte in deblock so alloc & zero + // We don't need to zero the extra @ start of frame as it will never be + // written + s->is_pcm = av_mallocz(sps->pcm_width * (sps->pcm_height + 1) + 1); + s->is_intra_store = av_mallocz(sps->pcm_width * (sps->pcm_height + 1) + 1); + if (s->is_pcm == NULL || s->is_intra_store == NULL) + goto fail; + + s->filter_slice_edges = av_mallocz(ctb_count); + s->tab_slice_address = av_malloc_array(ctb_count, + sizeof(*s->tab_slice_address)); + s->qp_y_tab = av_malloc_array(pic_size_in_cb, + sizeof(*s->qp_y_tab)); + if (!s->qp_y_tab || !s->filter_slice_edges || !s->tab_slice_address) + goto fail; + + s->bs_horizontal = av_mallocz(s->bs_size * 2); + s->bs_vertical = s->bs_horizontal + s->bs_size; + if (s->bs_horizontal == NULL) + goto fail; + + s->rpl_up = av_mallocz(sps->ctb_width * sizeof(*s->rpl_up)); + s->rpl_left = av_mallocz(sps->ctb_height * sizeof(*s->rpl_left)); + if (s->rpl_left == NULL || s->rpl_up == NULL) + goto fail; + + if ((s->bsf_stash_left = av_mallocz(((height + 63) & ~63) >> 4)) == NULL || + (s->bsf_stash_up = av_mallocz(((width + 63) & ~63) >> 4)) == NULL) + goto fail; + + s->col_mvf_stride = (width + 15) >> 4; + s->col_mvf_pool = av_buffer_pool_init(((height + 15) >> 4) * s->col_mvf_stride * sizeof(ColMvField), + av_buffer_allocz); + if (s->col_mvf_pool == NULL) + goto fail; + + return 0; + +fail: + pic_arrays_free(s); + return AVERROR(ENOMEM); +} + +static void default_pred_weight_table(HEVCRpiContext * const s) +{ + unsigned int i; + const unsigned int wt = 1 << QPU_MC_DENOM; + s->sh.luma_log2_weight_denom = 0; + s->sh.chroma_log2_weight_denom = 0; + for (i = 0; i < s->sh.nb_refs[L0]; i++) { + s->sh.luma_weight_l0[i] = wt; + s->sh.luma_offset_l0[i] = 0; + s->sh.chroma_weight_l0[i][0] = wt; + s->sh.chroma_weight_l0[i][1] = wt; + s->sh.chroma_offset_l0[i][0] = 0; + s->sh.chroma_offset_l0[i][1] = 0; + } + for (i = 0; i < s->sh.nb_refs[L1]; i++) { + s->sh.luma_weight_l1[i] = wt; + s->sh.luma_offset_l1[i] = 0; + s->sh.chroma_weight_l1[i][0] = wt; + s->sh.chroma_weight_l1[i][1] = wt; + s->sh.chroma_offset_l1[i][0] = 0; + s->sh.chroma_offset_l1[i][1] = 0; + } +} + +static int get_weights(HEVCRpiContext * const s, GetBitContext * const gb, + const unsigned int refs, + int16_t * luma_weight, int16_t * luma_offset, + int16_t * chroma_weight, int16_t * chroma_offset) +{ + unsigned int luma_flags; + unsigned int chroma_flags; + unsigned int i; + const unsigned int wp_offset_bd_shift = s->ps.sps->high_precision_offsets_enabled_flag ? 0 : (s->ps.sps->bit_depth - 8); + const int wp_offset_half_range = s->ps.sps->wp_offset_half_range; + const unsigned int luma_weight_base = 1 << QPU_MC_DENOM; + const unsigned int chroma_weight_base = 1 << QPU_MC_DENOM; + const unsigned int luma_weight_shift = (QPU_MC_DENOM - s->sh.luma_log2_weight_denom); + const unsigned int chroma_weight_shift = (QPU_MC_DENOM - s->sh.chroma_log2_weight_denom); + + if (refs == 0) + return 0; + + luma_flags = get_bits(gb, refs); + chroma_flags = ctx_cfmt(s) == 0 ? 0 : get_bits(gb, refs); + i = 1 << (refs - 1); + + do + { + if ((luma_flags & i) != 0) + { + const int delta_weight = get_se_golomb(gb); + const int offset = get_se_golomb(gb); + if (delta_weight < -128 || delta_weight > 127 || + offset < -wp_offset_half_range || offset >= wp_offset_half_range) + { + return AVERROR_INVALIDDATA; + } + *luma_weight++ = luma_weight_base + (delta_weight << luma_weight_shift); + *luma_offset++ = offset << wp_offset_bd_shift; + } + else + { + *luma_weight++ = luma_weight_base; + *luma_offset++ = 0; + } + + if ((chroma_flags & i) != 0) + { + unsigned int j; + for (j = 0; j != 2; ++j) + { + const int delta_weight = get_se_golomb(gb); + const int delta_offset = get_se_golomb(gb); + + if (delta_weight < -128 || delta_weight > 127 || + delta_offset < -4 * wp_offset_half_range || delta_offset >= 4 * wp_offset_half_range) + { + return AVERROR_INVALIDDATA; + } + + *chroma_weight++ = chroma_weight_base + (delta_weight << chroma_weight_shift); + *chroma_offset++ = av_clip( + wp_offset_half_range + delta_offset - + ((wp_offset_half_range * ((1 << s->sh.chroma_log2_weight_denom) + delta_weight)) >> s->sh.chroma_log2_weight_denom), + -wp_offset_half_range, wp_offset_half_range - 1) << wp_offset_bd_shift; + } + } + else + { + *chroma_weight++ = chroma_weight_base; + *chroma_weight++ = chroma_weight_base; + *chroma_offset++ = 0; + *chroma_offset++ = 0; + } + } while ((i >>= 1) != 0); + + return 0; +} + +static int pred_weight_table(HEVCRpiContext *s, GetBitContext *gb) +{ + int err; + const unsigned int luma_log2_weight_denom = get_ue_golomb_long(gb); + const unsigned int chroma_log2_weight_denom = (ctx_cfmt(s) == 0) ? 0 : luma_log2_weight_denom + get_se_golomb(gb); + + if (luma_log2_weight_denom > 7 || + chroma_log2_weight_denom > 7) + { + av_log(s->avctx, AV_LOG_ERROR, "Invalid prediction weight denom: luma=%d, chroma=%d\n", + luma_log2_weight_denom, chroma_log2_weight_denom); + return AVERROR_INVALIDDATA; + } + + s->sh.luma_log2_weight_denom = luma_log2_weight_denom; + s->sh.chroma_log2_weight_denom = chroma_log2_weight_denom; + + if ((err = get_weights(s, gb, s->sh.nb_refs[L0], + s->sh.luma_weight_l0, s->sh.luma_offset_l0, + s->sh.chroma_weight_l0[0], s->sh.chroma_offset_l0[0])) != 0 || + (err = get_weights(s, gb, s->sh.nb_refs[L1], + s->sh.luma_weight_l1, s->sh.luma_offset_l1, + s->sh.chroma_weight_l1[0], s->sh.chroma_offset_l1[0])) != 0) + { + av_log(s->avctx, AV_LOG_ERROR, "Invalid prediction weight or offset\n"); + return err; + } + + return 0; +} + +static int decode_lt_rps(HEVCRpiContext *s, LongTermRPS *rps, GetBitContext *gb) +{ + const HEVCRpiSPS *sps = s->ps.sps; + int max_poc_lsb = 1 << sps->log2_max_poc_lsb; + int prev_delta_msb = 0; + unsigned int nb_sps = 0, nb_sh; + int i; + + rps->nb_refs = 0; + if (!sps->long_term_ref_pics_present_flag) + return 0; + + if (sps->num_long_term_ref_pics_sps > 0) + nb_sps = get_ue_golomb_long(gb); + nb_sh = get_ue_golomb_long(gb); + + if (nb_sps > sps->num_long_term_ref_pics_sps) + return AVERROR_INVALIDDATA; + if (nb_sh + (uint64_t)nb_sps > FF_ARRAY_ELEMS(rps->poc)) + return AVERROR_INVALIDDATA; + + rps->nb_refs = nb_sh + nb_sps; + + for (i = 0; i < rps->nb_refs; i++) { + uint8_t delta_poc_msb_present; + + if (i < nb_sps) { + uint8_t lt_idx_sps = 0; + + if (sps->num_long_term_ref_pics_sps > 1) + lt_idx_sps = get_bits(gb, av_ceil_log2(sps->num_long_term_ref_pics_sps)); + + rps->poc[i] = sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps]; + rps->used[i] = sps->used_by_curr_pic_lt_sps_flag[lt_idx_sps]; + } else { + rps->poc[i] = get_bits(gb, sps->log2_max_poc_lsb); + rps->used[i] = get_bits1(gb); + } + + delta_poc_msb_present = get_bits1(gb); + if (delta_poc_msb_present) { + int64_t delta = get_ue_golomb_long(gb); + int64_t poc; + + if (i && i != nb_sps) + delta += prev_delta_msb; + + poc = rps->poc[i] + s->poc - delta * max_poc_lsb - s->sh.pic_order_cnt_lsb; + if (poc != (int32_t)poc) + return AVERROR_INVALIDDATA; + rps->poc[i] = poc; + prev_delta_msb = delta; + } + } + + return 0; +} + +static void export_stream_params(AVCodecContext *avctx, const HEVCRpiParamSets *ps, + const HEVCRpiSPS *sps) +{ + const HEVCRpiVPS *vps = (const HEVCRpiVPS*)ps->vps_list[sps->vps_id]->data; + const HEVCRpiWindow *ow = &sps->output_window; + unsigned int num = 0, den = 0; + + avctx->pix_fmt = sps->pix_fmt; + avctx->coded_width = sps->width; + avctx->coded_height = sps->height; + avctx->width = sps->width - ow->left_offset - ow->right_offset; + avctx->height = sps->height - ow->top_offset - ow->bottom_offset; + avctx->has_b_frames = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics; + avctx->profile = sps->ptl.general_ptl.profile_idc; + avctx->level = sps->ptl.general_ptl.level_idc; + + ff_set_sar(avctx, sps->vui.sar); + + if (sps->vui.video_signal_type_present_flag) + avctx->color_range = sps->vui.video_full_range_flag ? AVCOL_RANGE_JPEG + : AVCOL_RANGE_MPEG; + else + avctx->color_range = AVCOL_RANGE_MPEG; + + if (sps->vui.colour_description_present_flag) { + avctx->color_primaries = sps->vui.colour_primaries; + avctx->color_trc = sps->vui.transfer_characteristic; + avctx->colorspace = sps->vui.matrix_coeffs; + } else { + avctx->color_primaries = AVCOL_PRI_UNSPECIFIED; + avctx->color_trc = AVCOL_TRC_UNSPECIFIED; + avctx->colorspace = AVCOL_SPC_UNSPECIFIED; + } + + if (vps->vps_timing_info_present_flag) { + num = vps->vps_num_units_in_tick; + den = vps->vps_time_scale; + } else if (sps->vui.vui_timing_info_present_flag) { + num = sps->vui.vui_num_units_in_tick; + den = sps->vui.vui_time_scale; + } + + if (num != 0 && den != 0) + av_reduce(&avctx->framerate.den, &avctx->framerate.num, + num, den, 1 << 30); +} + +static enum AVPixelFormat get_format(HEVCRpiContext *s, const HEVCRpiSPS *sps) +{ + enum AVPixelFormat pix_fmts[4], *fmt = pix_fmts; + + // Admit to no h/w formats + + *fmt++ = sps->pix_fmt; + *fmt = AV_PIX_FMT_NONE; + + return pix_fmts[0] == AV_PIX_FMT_NONE ? AV_PIX_FMT_NONE: ff_thread_get_format(s->avctx, pix_fmts); +} + +static int is_sps_supported(const HEVCRpiSPS * const sps) +{ + return av_rpi_is_sand_format(sps->pix_fmt) && + sps->width <= HEVC_RPI_MAX_WIDTH && + sps->height <= HEVC_RPI_MAX_HEIGHT; +} + +static int set_sps(HEVCRpiContext * const s, const HEVCRpiSPS * const sps, + const enum AVPixelFormat pix_fmt) +{ + int ret; + + pic_arrays_free(s); + s->ps.sps = NULL; + s->ps.vps = NULL; + + if (sps == NULL) + return 0; + + if (!is_sps_supported(sps)) + return AVERROR_DECODER_NOT_FOUND; + + ret = pic_arrays_init(s, sps); + if (ret < 0) + goto fail; + + export_stream_params(s->avctx, &s->ps, sps); + + s->avctx->pix_fmt = pix_fmt; + + ff_hevc_rpi_pred_init(&s->hpc, sps->bit_depth); + ff_hevc_rpi_dsp_init (&s->hevcdsp, sps->bit_depth); + + // * We don't support cross_component_prediction_enabled_flag but as that + // must be 0 unless we have 4:4:4 there is no point testing for it as we + // only deal with sand which is never 4:4:4 + // [support wouldn't be hard] + + rpi_hevc_qpu_set_fns(s, sps->bit_depth); + + av_freep(&s->sao_pixel_buffer_h[0]); + av_freep(&s->sao_pixel_buffer_v[0]); + + if (sps->sao_enabled) + { + const unsigned int c_count = (ctx_cfmt(s) != 0) ? 3 : 1; + unsigned int c_idx; + size_t vsize[3] = {0}; + size_t hsize[3] = {0}; + + for(c_idx = 0; c_idx < c_count; c_idx++) { + int w = sps->width >> ctx_hshift(s, c_idx); + int h = sps->height >> ctx_vshift(s, c_idx); + // ctb height & width are a min of 8 so this must a multiple of 16 + // so no point rounding up! + hsize[c_idx] = (w * 2 * sps->ctb_height) << sps->pixel_shift; + vsize[c_idx] = (h * 2 * sps->ctb_width) << sps->pixel_shift; + } + + // Allocate as a single lump so we can extend h[1] & v[1] into h[2] & v[2] + // when we have plaited chroma + s->sao_pixel_buffer_h[0] = av_malloc(hsize[0] + hsize[1] + hsize[2]); + s->sao_pixel_buffer_v[0] = av_malloc(vsize[0] + vsize[1] + vsize[2]); + s->sao_pixel_buffer_h[1] = s->sao_pixel_buffer_h[0] + hsize[0]; + s->sao_pixel_buffer_h[2] = s->sao_pixel_buffer_h[1] + hsize[1]; + s->sao_pixel_buffer_v[1] = s->sao_pixel_buffer_v[0] + vsize[0]; + s->sao_pixel_buffer_v[2] = s->sao_pixel_buffer_v[1] + vsize[1]; + } + + s->ps.sps = sps; + s->ps.vps = (HEVCRpiVPS*) s->ps.vps_list[s->ps.sps->vps_id]->data; + + return 0; + +fail: + pic_arrays_free(s); + s->ps.sps = NULL; + return ret; +} + +static inline int qp_offset_valid(const int qp_offset) +{ + return qp_offset >= -12 && qp_offset <= 12; +} + +static int hls_slice_header(HEVCRpiContext * const s) +{ + GetBitContext * const gb = &s->HEVClc->gb; + RpiSliceHeader * const sh = &s->sh; + int i, ret; + + // Coded parameters + sh->first_slice_in_pic_flag = get_bits1(gb); + if ((IS_IDR(s) || IS_BLA(s)) && sh->first_slice_in_pic_flag) { + s->seq_decode = (s->seq_decode + 1) & 0xff; + s->max_ra = INT_MAX; + if (IS_IDR(s)) + ff_hevc_rpi_clear_refs(s); + } + sh->no_output_of_prior_pics_flag = 0; + if (IS_IRAP(s)) + sh->no_output_of_prior_pics_flag = get_bits1(gb); + + sh->pps_id = get_ue_golomb_long(gb); + if (sh->pps_id >= HEVC_MAX_PPS_COUNT || !s->ps.pps_list[sh->pps_id]) { + av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", sh->pps_id); + return AVERROR_INVALIDDATA; + } + if (!sh->first_slice_in_pic_flag && + s->ps.pps != (HEVCRpiPPS*)s->ps.pps_list[sh->pps_id]->data) { + av_log(s->avctx, AV_LOG_ERROR, "PPS changed between slices.\n"); + return AVERROR_INVALIDDATA; + } + s->ps.pps = (HEVCRpiPPS*)s->ps.pps_list[sh->pps_id]->data; + if (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos == 1) + sh->no_output_of_prior_pics_flag = 1; + + if (s->ps.sps != (HEVCRpiSPS*)s->ps.sps_list[s->ps.pps->sps_id]->data) { + const HEVCRpiSPS *sps = (HEVCRpiSPS*)s->ps.sps_list[s->ps.pps->sps_id]->data; + const HEVCRpiSPS *last_sps = s->ps.sps; + enum AVPixelFormat pix_fmt; + + if (last_sps && IS_IRAP(s) && s->nal_unit_type != HEVC_NAL_CRA_NUT) { + if (sps->width != last_sps->width || sps->height != last_sps->height || + sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering != + last_sps->temporal_layer[last_sps->max_sub_layers - 1].max_dec_pic_buffering) + sh->no_output_of_prior_pics_flag = 0; + } + ff_hevc_rpi_clear_refs(s); + + ret = set_sps(s, sps, sps->pix_fmt); + if (ret < 0) + return ret; + + pix_fmt = get_format(s, sps); + if (pix_fmt < 0) + return pix_fmt; + +// ret = set_sps(s, sps, pix_fmt); +// if (ret < 0) +// return ret; + + s->avctx->pix_fmt = pix_fmt; + + s->seq_decode = (s->seq_decode + 1) & 0xff; + s->max_ra = INT_MAX; + } + + sh->dependent_slice_segment_flag = 0; + if (!sh->first_slice_in_pic_flag) { + int slice_address_length; + + if (s->ps.pps->dependent_slice_segments_enabled_flag) + sh->dependent_slice_segment_flag = get_bits1(gb); + + slice_address_length = av_ceil_log2(s->ps.sps->ctb_size); + sh->slice_segment_addr = get_bitsz(gb, slice_address_length); + if (sh->slice_segment_addr >= s->ps.sps->ctb_size) { + av_log(s->avctx, AV_LOG_ERROR, + "Invalid slice segment address: %u.\n", + sh->slice_segment_addr); + return AVERROR_INVALIDDATA; + } + + if (!sh->dependent_slice_segment_flag) { + sh->slice_addr = sh->slice_segment_addr; + s->slice_idx++; + } + } else { + sh->slice_segment_addr = sh->slice_addr = 0; + s->slice_idx = 0; + s->slice_initialized = 0; + } + + if (!sh->dependent_slice_segment_flag) { + s->slice_initialized = 0; + + for (i = 0; i < s->ps.pps->num_extra_slice_header_bits; i++) + skip_bits(gb, 1); // slice_reserved_undetermined_flag[] + + sh->slice_type = get_ue_golomb_long(gb); + if (!(sh->slice_type == HEVC_SLICE_I || + sh->slice_type == HEVC_SLICE_P || + sh->slice_type == HEVC_SLICE_B)) { + av_log(s->avctx, AV_LOG_ERROR, "Unknown slice type: %d.\n", + sh->slice_type); + return AVERROR_INVALIDDATA; + } + if (IS_IRAP(s) && sh->slice_type != HEVC_SLICE_I) { + av_log(s->avctx, AV_LOG_ERROR, "Inter slices in an IRAP frame.\n"); + return AVERROR_INVALIDDATA; + } + + // when flag is not present, picture is inferred to be output + sh->pic_output_flag = 1; + if (s->ps.pps->output_flag_present_flag) + sh->pic_output_flag = get_bits1(gb); + + if (s->ps.sps->separate_colour_plane_flag) + sh->colour_plane_id = get_bits(gb, 2); + + if (!IS_IDR(s)) { + int poc, pos; + + sh->pic_order_cnt_lsb = get_bits(gb, s->ps.sps->log2_max_poc_lsb); + poc = ff_hevc_rpi_compute_poc(s->ps.sps, s->pocTid0, sh->pic_order_cnt_lsb, s->nal_unit_type); + if (!sh->first_slice_in_pic_flag && poc != s->poc) { + av_log(s->avctx, AV_LOG_WARNING, + "Ignoring POC change between slices: %d -> %d\n", s->poc, poc); + if (s->avctx->err_recognition & AV_EF_EXPLODE) + return AVERROR_INVALIDDATA; + poc = s->poc; + } + s->poc = poc; + + sh->short_term_ref_pic_set_sps_flag = get_bits1(gb); + pos = get_bits_left(gb); + if (!sh->short_term_ref_pic_set_sps_flag) { + ret = ff_hevc_rpi_decode_short_term_rps(gb, s->avctx, &sh->slice_rps, s->ps.sps, 1); + if (ret < 0) + return ret; + + sh->short_term_rps = &sh->slice_rps; + } else { + int numbits, rps_idx; + + if (!s->ps.sps->nb_st_rps) { + av_log(s->avctx, AV_LOG_ERROR, "No ref lists in the SPS.\n"); + return AVERROR_INVALIDDATA; + } + + numbits = av_ceil_log2(s->ps.sps->nb_st_rps); + rps_idx = numbits > 0 ? get_bits(gb, numbits) : 0; + sh->short_term_rps = &s->ps.sps->st_rps[rps_idx]; + } + sh->short_term_ref_pic_set_size = pos - get_bits_left(gb); + + pos = get_bits_left(gb); + ret = decode_lt_rps(s, &sh->long_term_rps, gb); + if (ret < 0) { + av_log(s->avctx, AV_LOG_WARNING, "Invalid long term RPS.\n"); + if (s->avctx->err_recognition & AV_EF_EXPLODE) + return AVERROR_INVALIDDATA; + } + sh->long_term_ref_pic_set_size = pos - get_bits_left(gb); + + if (s->ps.sps->sps_temporal_mvp_enabled_flag) + sh->slice_temporal_mvp_enabled_flag = get_bits1(gb); + else + sh->slice_temporal_mvp_enabled_flag = 0; + } else { + s->sh.short_term_rps = NULL; + s->poc = 0; + } + + /* 8.3.1 */ + if (sh->first_slice_in_pic_flag && s->temporal_id == 0 && + s->nal_unit_type != HEVC_NAL_TRAIL_N && + s->nal_unit_type != HEVC_NAL_TSA_N && + s->nal_unit_type != HEVC_NAL_STSA_N && + s->nal_unit_type != HEVC_NAL_RADL_N && + s->nal_unit_type != HEVC_NAL_RADL_R && + s->nal_unit_type != HEVC_NAL_RASL_N && + s->nal_unit_type != HEVC_NAL_RASL_R) + s->pocTid0 = s->poc; + + if (s->ps.sps->sao_enabled) { + sh->slice_sample_adaptive_offset_flag[0] = get_bits1(gb); + if (ctx_cfmt(s) != 0) { + sh->slice_sample_adaptive_offset_flag[1] = + sh->slice_sample_adaptive_offset_flag[2] = get_bits1(gb); + } + } else { + sh->slice_sample_adaptive_offset_flag[0] = 0; + sh->slice_sample_adaptive_offset_flag[1] = 0; + sh->slice_sample_adaptive_offset_flag[2] = 0; + } + + sh->nb_refs[L0] = sh->nb_refs[L1] = 0; + if (sh->slice_type == HEVC_SLICE_P || sh->slice_type == HEVC_SLICE_B) { + int nb_refs; + + sh->nb_refs[L0] = s->ps.pps->num_ref_idx_l0_default_active; + if (sh->slice_type == HEVC_SLICE_B) + sh->nb_refs[L1] = s->ps.pps->num_ref_idx_l1_default_active; + + if (get_bits1(gb)) { // num_ref_idx_active_override_flag + sh->nb_refs[L0] = get_ue_golomb_long(gb) + 1; + if (sh->slice_type == HEVC_SLICE_B) + sh->nb_refs[L1] = get_ue_golomb_long(gb) + 1; + } + if (sh->nb_refs[L0] > HEVC_MAX_REFS || sh->nb_refs[L1] > HEVC_MAX_REFS) { + av_log(s->avctx, AV_LOG_ERROR, "Too many refs: %d/%d.\n", + sh->nb_refs[L0], sh->nb_refs[L1]); + return AVERROR_INVALIDDATA; + } + + sh->rpl_modification_flag[0] = 0; + sh->rpl_modification_flag[1] = 0; + nb_refs = ff_hevc_rpi_frame_nb_refs(s); + if (!nb_refs) { + av_log(s->avctx, AV_LOG_ERROR, "Zero refs for a frame with P or B slices.\n"); + return AVERROR_INVALIDDATA; + } + + if (s->ps.pps->lists_modification_present_flag && nb_refs > 1) { + sh->rpl_modification_flag[0] = get_bits1(gb); + if (sh->rpl_modification_flag[0]) { + for (i = 0; i < sh->nb_refs[L0]; i++) + sh->list_entry_lx[0][i] = get_bits(gb, av_ceil_log2(nb_refs)); + } + + if (sh->slice_type == HEVC_SLICE_B) { + sh->rpl_modification_flag[1] = get_bits1(gb); + if (sh->rpl_modification_flag[1] == 1) + for (i = 0; i < sh->nb_refs[L1]; i++) + sh->list_entry_lx[1][i] = get_bits(gb, av_ceil_log2(nb_refs)); + } + } + + if (sh->slice_type == HEVC_SLICE_B) + sh->mvd_l1_zero_flag = get_bits1(gb); + + if (s->ps.pps->cabac_init_present_flag) + sh->cabac_init_flag = get_bits1(gb); + else + sh->cabac_init_flag = 0; + + sh->collocated_ref_idx = 0; + if (sh->slice_temporal_mvp_enabled_flag) { + sh->collocated_list = L0; + if (sh->slice_type == HEVC_SLICE_B) + sh->collocated_list = !get_bits1(gb); + + if (sh->nb_refs[sh->collocated_list] > 1) { + sh->collocated_ref_idx = get_ue_golomb_long(gb); + if (sh->collocated_ref_idx >= sh->nb_refs[sh->collocated_list]) { + av_log(s->avctx, AV_LOG_ERROR, + "Invalid collocated_ref_idx: %d.\n", + sh->collocated_ref_idx); + return AVERROR_INVALIDDATA; + } + } + } + + if ((s->ps.pps->weighted_pred_flag && sh->slice_type == HEVC_SLICE_P) || + (s->ps.pps->weighted_bipred_flag && sh->slice_type == HEVC_SLICE_B)) + { + if ((ret = pred_weight_table(s, gb)) != 0) + return ret; + } + else + { + // Give us unit weights + default_pred_weight_table(s); + } + + sh->max_num_merge_cand = 5 - get_ue_golomb_long(gb); + if (sh->max_num_merge_cand < 1 || sh->max_num_merge_cand > 5) { + av_log(s->avctx, AV_LOG_ERROR, + "Invalid number of merging MVP candidates: %d.\n", + sh->max_num_merge_cand); + return AVERROR_INVALIDDATA; + } + } + + sh->slice_qp_delta = get_se_golomb(gb); + + if (s->ps.pps->pic_slice_level_chroma_qp_offsets_present_flag) { + sh->slice_cb_qp_offset = get_se_golomb(gb); + sh->slice_cr_qp_offset = get_se_golomb(gb); + if (!qp_offset_valid(sh->slice_cb_qp_offset) || + !qp_offset_valid(s->ps.pps->cb_qp_offset + sh->slice_cb_qp_offset) || + !qp_offset_valid(sh->slice_cr_qp_offset) || + !qp_offset_valid(s->ps.pps->cr_qp_offset + sh->slice_cr_qp_offset)) + { + av_log(s->avctx, AV_LOG_ERROR, "Bad chroma offset (pps:%d/%d; slice=%d/%d\n", + sh->slice_cr_qp_offset, sh->slice_cr_qp_offset, + s->ps.pps->cb_qp_offset, s->ps.pps->cr_qp_offset); + return AVERROR_INVALIDDATA; + } + } else + { + sh->slice_cb_qp_offset = 0; + sh->slice_cr_qp_offset = 0; + } + + if (s->ps.pps->chroma_qp_offset_list_enabled_flag) + sh->cu_chroma_qp_offset_enabled_flag = get_bits1(gb); + else + sh->cu_chroma_qp_offset_enabled_flag = 0; + + if (s->ps.pps->deblocking_filter_control_present_flag) { + int deblocking_filter_override_flag = 0; + + if (s->ps.pps->deblocking_filter_override_enabled_flag) + deblocking_filter_override_flag = get_bits1(gb); + + if (deblocking_filter_override_flag) { + sh->disable_deblocking_filter_flag = get_bits1(gb); + if (!sh->disable_deblocking_filter_flag) { + int beta_offset_div2 = get_se_golomb(gb); + int tc_offset_div2 = get_se_golomb(gb) ; + if (beta_offset_div2 < -6 || beta_offset_div2 > 6 || + tc_offset_div2 < -6 || tc_offset_div2 > 6) { + av_log(s->avctx, AV_LOG_ERROR, + "Invalid deblock filter offsets: %d, %d\n", + beta_offset_div2, tc_offset_div2); + return AVERROR_INVALIDDATA; + } + sh->beta_offset = beta_offset_div2 * 2; + sh->tc_offset = tc_offset_div2 * 2; + } + } else { + sh->disable_deblocking_filter_flag = s->ps.pps->disable_dbf; + sh->beta_offset = s->ps.pps->beta_offset; + sh->tc_offset = s->ps.pps->tc_offset; + } + } else { + sh->disable_deblocking_filter_flag = 0; + sh->beta_offset = 0; + sh->tc_offset = 0; + } + + if (s->ps.pps->seq_loop_filter_across_slices_enabled_flag && + (sh->slice_sample_adaptive_offset_flag[0] || + sh->slice_sample_adaptive_offset_flag[1] || + !sh->disable_deblocking_filter_flag)) { + sh->slice_loop_filter_across_slices_enabled_flag = get_bits1(gb); + } else { + sh->slice_loop_filter_across_slices_enabled_flag = s->ps.pps->seq_loop_filter_across_slices_enabled_flag; + } + sh->no_dblk_boundary_flags = + (sh->slice_loop_filter_across_slices_enabled_flag ? 0 : + BOUNDARY_UPPER_SLICE | BOUNDARY_LEFT_SLICE) | + (s->ps.pps->loop_filter_across_tiles_enabled_flag ? 0 : + BOUNDARY_UPPER_TILE | BOUNDARY_LEFT_TILE); + + + } else if (!s->slice_initialized) { + av_log(s->avctx, AV_LOG_ERROR, "Independent slice segment missing.\n"); + return AVERROR_INVALIDDATA; + } + + sh->num_entry_point_offsets = 0; + sh->offload_wpp = 0; + sh->offload_tiles = 0; + + if (s->ps.pps->tiles_enabled_flag || s->ps.pps->entropy_coding_sync_enabled_flag) { + unsigned num_entry_point_offsets = get_ue_golomb_long(gb); + // It would be possible to bound this tighter but this here is simpler + if (num_entry_point_offsets > get_bits_left(gb)) { + av_log(s->avctx, AV_LOG_ERROR, "num_entry_point_offsets %d is invalid\n", num_entry_point_offsets); + return AVERROR_INVALIDDATA; + } + + sh->num_entry_point_offsets = num_entry_point_offsets; + if (sh->num_entry_point_offsets > 0) { + int offset_len = get_ue_golomb_long(gb) + 1; + + if (offset_len < 1 || offset_len > 32) { + sh->num_entry_point_offsets = 0; + av_log(s->avctx, AV_LOG_ERROR, "offset_len %d is invalid\n", offset_len); + return AVERROR_INVALIDDATA; + } + + if ((ret = alloc_entry_points(sh, sh->num_entry_point_offsets)) < 0) + { + av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate memory\n"); + return ret; + } + + for (i = 0; i < sh->num_entry_point_offsets; i++) { + uint32_t val_minus1 = get_bits_long(gb, offset_len); + if (val_minus1 > (1 << 28)) + { + // We can declare offsets of > 2^28 bad without loss of generality + // Will check actual bounds wrt NAL later, but this keeps + // the values within bounds we can deal with easily + av_log(s->avctx, AV_LOG_ERROR, "entry_point_offset_minus1 %d invalid\n", val_minus1); + return AVERROR_INVALIDDATA; + } + sh->entry_point_offset[i] = val_minus1 + 1; // +1 to get the size + } + + // Do we want to offload this + if (s->threads_type != 0) + { + sh->offload_tiles = (!s->ps.pps->tile_wpp_inter_disable || sh->slice_type == HEVC_SLICE_I) && + s->ps.pps->num_tile_columns > 1; + // * We only cope with WPP in a single column + // Probably want to deal with that case as tiles rather than WPP anyway + // ?? Not actually sure that the main code deals with WPP + multi-col correctly + sh->offload_wpp = s->ps.pps->entropy_coding_sync_enabled_flag && + s->ps.pps->num_tile_columns == 1; + } + } + } + + if (s->ps.pps->slice_header_extension_present_flag) { + unsigned int length = get_ue_golomb_long(gb); + if (length*8LL > get_bits_left(gb)) { + av_log(s->avctx, AV_LOG_ERROR, "too many slice_header_extension_data_bytes\n"); + return AVERROR_INVALIDDATA; + } + for (i = 0; i < length; i++) + skip_bits(gb, 8); // slice_header_extension_data_byte + } + + // Inferred parameters + sh->slice_qp = 26U + s->ps.pps->pic_init_qp_minus26 + sh->slice_qp_delta; + if (sh->slice_qp > 51 || + sh->slice_qp < -s->ps.sps->qp_bd_offset) { + av_log(s->avctx, AV_LOG_ERROR, + "The slice_qp %d is outside the valid range " + "[%d, 51].\n", + sh->slice_qp, + -s->ps.sps->qp_bd_offset); + return AVERROR_INVALIDDATA; + } + + if (get_bits_left(gb) < 0) { + av_log(s->avctx, AV_LOG_ERROR, + "Overread slice header by %d bits\n", -get_bits_left(gb)); + return AVERROR_INVALIDDATA; + } + + s->slice_initialized = 1; + return 0; +} + +static void hls_sao_param(const HEVCRpiContext *s, HEVCRpiLocalContext * const lc, const int rx, const int ry) +{ + RpiSAOParams * const sao = s->sao + rx + ry * s->ps.sps->ctb_width; + int c_idx, i; + + if (s->sh.slice_sample_adaptive_offset_flag[0] || + s->sh.slice_sample_adaptive_offset_flag[1]) { + if ((lc->ctb_avail & AVAIL_L) != 0) + { + const int sao_merge_left_flag = ff_hevc_rpi_sao_merge_flag_decode(lc); + if (sao_merge_left_flag) { + *sao = sao[-1]; + return; + } + } + if ((lc->ctb_avail & AVAIL_U) != 0) + { + const int sao_merge_up_flag = ff_hevc_rpi_sao_merge_flag_decode(lc); + if (sao_merge_up_flag) { + *sao = sao[-(int)s->ps.sps->ctb_width]; + return; + } + } + } + + for (c_idx = 0; c_idx < (ctx_cfmt(s) != 0 ? 3 : 1); c_idx++) { + const unsigned int log2_sao_offset_scale = c_idx == 0 ? s->ps.pps->log2_sao_offset_scale_luma : + s->ps.pps->log2_sao_offset_scale_chroma; + int offset_abs[4]; + char offset_sign[4] = {0}; + + if (!s->sh.slice_sample_adaptive_offset_flag[c_idx]) { + sao->type_idx[c_idx] = SAO_NOT_APPLIED; + continue; + } + + if (c_idx == 2) { + sao->type_idx[2] = sao->type_idx[1]; + sao->eo_class[2] = sao->eo_class[1]; + } else { + sao->type_idx[c_idx] = ff_hevc_rpi_sao_type_idx_decode(lc); + } + + // ** Could use BY22 here quite plausibly - this is all bypass stuff + // though only per CTB so not very timing critical + + if (sao->type_idx[c_idx] == SAO_NOT_APPLIED) + continue; + + for (i = 0; i < 4; i++) + offset_abs[i] = ff_hevc_rpi_sao_offset_abs_decode(s, lc); + + if (sao->type_idx[c_idx] == SAO_BAND) { + for (i = 0; i < 4; i++) { + if (offset_abs[i] != 0) + offset_sign[i] = ff_hevc_rpi_sao_offset_sign_decode(lc); + } + sao->band_position[c_idx] = ff_hevc_rpi_sao_band_position_decode(lc); + } else if (c_idx != 2) { + sao->eo_class[c_idx] = ff_hevc_rpi_sao_eo_class_decode(lc); + } + + // Inferred parameters + sao->offset_val[c_idx][0] = 0; + for (i = 0; i < 4; i++) { + sao->offset_val[c_idx][i + 1] = offset_abs[i] << log2_sao_offset_scale; + if (sao->type_idx[c_idx] == SAO_EDGE) { + if (i > 1) + sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1]; + } else if (offset_sign[i]) { + sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1]; + } + } + } +} + +#if 0 +static int hls_cross_component_pred(HEVCRpiLocalContext * const lc, const int idx) { + int log2_res_scale_abs_plus1 = ff_hevc_rpi_log2_res_scale_abs(lc, idx); // 0..4 + + if (log2_res_scale_abs_plus1 != 0) { + int res_scale_sign_flag = ff_hevc_rpi_res_scale_sign_flag(lc, idx); + lc->tu.res_scale_val = (1 << (log2_res_scale_abs_plus1 - 1)) * + (1 - 2 * res_scale_sign_flag); + } else { + lc->tu.res_scale_val = 0; + } + + + return 0; +} +#endif + +static inline HEVCPredCmd * rpi_new_intra_cmd(HEVCRpiJob * const jb) +{ + return jb->intra.cmds + jb->intra.n++; +} + +#define A0(x, y, U, L, UL, UR, DL) \ + [(x)+(y)*16] = (((U) ? AVAIL_U : 0) | ((L) ? AVAIL_L : 0) | ((UL) ? AVAIL_UL : 0) | ((UR) ? AVAIL_UR : 0) | ((DL) ? AVAIL_DL : 0)) + +#define A1(x, y, U, L, UL, UR, DL) \ + A0((x) + 0, (y) + 0, (U), (L), (UL), (U), (L) ), A0((x) + 1, (y) + 0, (U), 1, (U), (UR), 0 ),\ + A0((x) + 0, (y) + 1, 1, (L), (L), 1, (DL)), A0((x) + 1, (y) + 1, 1, 1, 1, 0, 0 ) + +#define A2(x, y, U, L, UL, UR, DL) \ + A1((x) + 0, (y) + 0, (U), (L), (UL), (U), (L) ), A1((x) + 2, (y) + 0, (U), 1, (U), (UR), 0 ),\ + A1((x) + 0, (y) + 2, 1, (L), (L), 1, (DL)), A1((x) + 2, (y) + 2, 1, 1, 1, 0, 0 ) + +#define A3(x, y, U, L, UL, UR, DL) \ + A2((x) + 0, (y) + 0, (U), (L), (UL), (U), (L) ), A2((x) + 4, (y) + 0, (U), 1, (U), (UR), 0 ),\ + A2((x) + 0, (y) + 4, 1, (L), (L), 1, (DL)), A2((x) + 4, (y) + 4, 1, 1, 1, 0, 0 ) + +#define A4(x, y, U, L, UL, UR, DL) \ + A3((x) + 0, (y) + 0, (U), (L), (UL), (U), (L) ), A3((x) + 8, (y) + 0, (U), 1, (U), (UR), 0 ),\ + A3((x) + 0, (y) + 8, 1, (L), (L), 1, (DL)), A3((x) + 8, (y) + 8, 1, 1, 1, 0, 0 ) + +static const uint8_t tb_flags[16 * 16] = {A4(0, 0, 0, 0, 0, 0, 0)}; + +unsigned int ff_hevc_rpi_tb_avail_flags( + const HEVCRpiContext * const s, const HEVCRpiLocalContext * const lc, + const unsigned int x, const unsigned int y, const unsigned int w, const unsigned int h) +{ + const unsigned int ctb_mask = ~0U << s->ps.sps->log2_ctb_size; + const unsigned int tb_x = x & ~ctb_mask; + const unsigned int tb_y = y & ~ctb_mask; + const unsigned int ctb_avail = lc->ctb_avail; + + const uint8_t * const tb_f = tb_flags + (tb_x >> 2) + (tb_y >> 2) * 16; + + unsigned int f = (ctb_avail | tb_f[0]) & (AVAIL_L | AVAIL_U | AVAIL_UL); + + // This deals with both the U & L edges + if ((tb_x | tb_y) != 0 && (~f & (AVAIL_L | AVAIL_U)) == 0) + f |= AVAIL_UL; + + if (x + w < lc->end_of_ctb_x) + f |= (tb_y == 0 ? ctb_avail >> (AVAIL_S_U - AVAIL_S_UR) : tb_f[(w - 1) >> 2]) & AVAIL_UR; + else if (tb_y == 0) + f |= (ctb_avail & AVAIL_UR); +#if AVAIL_S_U - AVAIL_S_UR < 0 +#error Shift problem +#endif + + // Never any D if Y beyond eoctb + if (y + h < lc->end_of_ctb_y) + f |= (tb_x == 0 ? ctb_avail << (AVAIL_S_DL - AVAIL_S_L) : tb_f[((h - 1) >> 2) * 16]) & AVAIL_DL; +#if AVAIL_S_DL - AVAIL_S_L < 0 +#error Shift problem +#endif + +// printf("(%#x, %#x): %dx%d ca=%02x, ful=%02x, ftr=%02x, fdl=%02x, eox=%#x, eoy=%#x\n", x, y, w, h, +// lc->ctb_avail, tb_f[0], tb_f[(w - 1) >> 2], tb_f[((h - 1) >> 2) * 16], +// lc->end_of_ctb_x, lc->end_of_ctb_y); + + return f; +} + +#undef A0 +#undef A1 +#undef A2 +#undef A3 +#undef A4 + +static void do_intra_pred(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, int log2_trafo_size, int x0, int y0, int c_idx, + unsigned int avail) +{ + // If rpi_enabled then sand - U & V done on U call + if (c_idx <= 1) + { + HEVCPredCmd *const cmd = rpi_new_intra_cmd(lc->jb0); + cmd->type = RPI_PRED_INTRA + c_idx; + cmd->size = log2_trafo_size; + cmd->avail = avail; + cmd->i_pred.x = x0; + cmd->i_pred.y = y0; + cmd->i_pred.mode = c_idx ? lc->tu.intra_pred_mode_c : lc->tu.intra_pred_mode; + +// printf("(%#x, %#x) c_idx=%d, s=%d, a=%#x\n", x0, y0, c_idx, 1 << log2_trafo_size, avail); + } +} + +#define CBF_CB0_S 0 +#define CBF_CB1_S 1 // CB1 must be CB0 + 1 +#define CBF_CR0_S 2 +#define CBF_CR1_S 3 + +#define CBF_CB0 (1 << CBF_CB0_S) +#define CBF_CR0 (1 << CBF_CR0_S) +#define CBF_CB1 (1 << CBF_CB1_S) +#define CBF_CR1 (1 << CBF_CR1_S) + +// * Only good for chroma_idx == 1 +static int hls_transform_unit(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, + const unsigned int x0, const unsigned int y0, + const unsigned int log2_cb_size, const unsigned int log2_trafo_size, + const unsigned int blk_idx, const int cbf_luma, + const unsigned int cbf_chroma) +{ + const unsigned int log2_trafo_size_c = FFMAX(2, log2_trafo_size - 1); + const unsigned int x0_c = x0 & ~7; + const unsigned int y0_c = y0 & ~7; + + enum ScanType scan_idx = SCAN_DIAG; + enum ScanType scan_idx_c = SCAN_DIAG; + + if (lc->cu.pred_mode == MODE_INTRA) + { + const unsigned int trafo_size = 1 << log2_trafo_size; + const unsigned int avail = ff_hevc_rpi_tb_avail_flags(s, lc, x0, y0, trafo_size, trafo_size); + + do_intra_pred(s, lc, log2_trafo_size, x0, y0, 0, avail); + + if (log2_trafo_size > 2) + do_intra_pred(s, lc, log2_trafo_size_c, x0_c, y0_c, 1, avail); + else if (blk_idx == 3) + do_intra_pred(s, lc, log2_trafo_size_c, x0_c, y0_c, 1, + ff_hevc_rpi_tb_avail_flags(s, lc, x0_c, y0_c, 8, 8)); + + if (log2_trafo_size < 4) { + if (lc->tu.intra_pred_mode >= 6 && + lc->tu.intra_pred_mode <= 14) { + scan_idx = SCAN_VERT; + } else if (lc->tu.intra_pred_mode >= 22 && + lc->tu.intra_pred_mode <= 30) { + scan_idx = SCAN_HORIZ; + } + + if (lc->tu.intra_pred_mode_c >= 6 && + lc->tu.intra_pred_mode_c <= 14) { + scan_idx_c = SCAN_VERT; + } else if (lc->tu.intra_pred_mode_c >= 22 && + lc->tu.intra_pred_mode_c <= 30) { + scan_idx_c = SCAN_HORIZ; + } + } + } + + if (!cbf_luma && cbf_chroma == 0) + return 0; + + if (lc->tu.is_cu_qp_delta_wanted) + { + const int qp_delta = ff_hevc_rpi_cu_qp_delta(lc); + const unsigned int cb_mask = ~0U << log2_cb_size; + + if (qp_delta < -(26 + (s->ps.sps->qp_bd_offset >> 1)) || + qp_delta > (25 + (s->ps.sps->qp_bd_offset >> 1))) + { + av_log(s->avctx, AV_LOG_ERROR, + "The cu_qp_delta %d is outside the valid range " + "[%d, %d].\n", + qp_delta, + -(26 + (s->ps.sps->qp_bd_offset >> 1)), + (25 + (s->ps.sps->qp_bd_offset >> 1))); + return AVERROR_INVALIDDATA; + } + + lc->tu.is_cu_qp_delta_wanted = 0; + lc->tu.cu_qp_delta = qp_delta; + ff_hevc_rpi_set_qPy(s, lc, x0 & cb_mask, y0 & cb_mask); + } + + // * Not main profile & untested due to no conform streams + if (lc->tu.cu_chroma_qp_offset_wanted && cbf_chroma && + !lc->cu.cu_transquant_bypass_flag) { + int cu_chroma_qp_offset_flag = ff_hevc_rpi_cu_chroma_qp_offset_flag(lc); + if (cu_chroma_qp_offset_flag) { + int cu_chroma_qp_offset_idx = 0; + if (s->ps.pps->chroma_qp_offset_list_len_minus1 > 0) { + cu_chroma_qp_offset_idx = ff_hevc_rpi_cu_chroma_qp_offset_idx(s, lc); + } + lc->tu.qp_divmod6[1] += s->ps.pps->cb_qp_offset_list[cu_chroma_qp_offset_idx]; + lc->tu.qp_divmod6[2] += s->ps.pps->cr_qp_offset_list[cu_chroma_qp_offset_idx]; + } + lc->tu.cu_chroma_qp_offset_wanted = 0; + } + + if (cbf_luma) + ff_hevc_rpi_hls_residual_coding(s, lc, x0, y0, log2_trafo_size, scan_idx, 0); + + if (log2_trafo_size > 2 || blk_idx == 3) + { + if ((cbf_chroma & CBF_CB0) != 0) + ff_hevc_rpi_hls_residual_coding(s, lc, x0_c, y0_c, + log2_trafo_size_c, scan_idx_c, 1); + if ((cbf_chroma & CBF_CR0) != 0) + ff_hevc_rpi_hls_residual_coding(s, lc, x0_c, y0_c, + log2_trafo_size_c, scan_idx_c, 2); + } + + return 0; +} + +static inline void set_deblocking_bypass(const HEVCRpiContext * const s, const int x0, const int y0, const int log2_cb_size) +{ + set_bits(s->is_pcm + (y0 >> 3) * s->ps.sps->pcm_width, x0 >> 3, s->ps.sps->pcm_width, log2_cb_size - 3); +} + + +static int hls_transform_tree(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, + const unsigned int x0, const unsigned int y0, + const unsigned int log2_trafo_size, + const unsigned int trafo_depth, const unsigned int blk_idx, + const unsigned int cbf_c0) +{ + // When trafo_size == 2 hls_transform_unit uses c0 so put in c1 + unsigned int cbf_c1 = cbf_c0; + int split_transform_flag; + int ret; + + if (lc->cu.intra_split_flag) { + if (trafo_depth == 1) { + lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[blk_idx]; + if (ctx_cfmt(s) == 3) { + lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[blk_idx]; + lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[blk_idx]; + } else { + lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[0]; + lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0]; + } + } + } else { + lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[0]; + lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[0]; + lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0]; + } + + if (log2_trafo_size <= s->ps.sps->log2_max_trafo_size && + log2_trafo_size > s->ps.sps->log2_min_tb_size && + trafo_depth < lc->cu.max_trafo_depth && + !(lc->cu.intra_split_flag && trafo_depth == 0)) + { + split_transform_flag = ff_hevc_rpi_split_transform_flag_decode(lc, log2_trafo_size); + } else { + int inter_split = s->ps.sps->max_transform_hierarchy_depth_inter == 0 && + lc->cu.pred_mode == MODE_INTER && + lc->cu.part_mode != PART_2Nx2N && + trafo_depth == 0; + + split_transform_flag = log2_trafo_size > s->ps.sps->log2_max_trafo_size || + (lc->cu.intra_split_flag && trafo_depth == 0) || + inter_split; + } + + if (log2_trafo_size > 2 || ctx_cfmt(s) == 3) + { + const int wants_c1 = ctx_cfmt(s) == 2 && (!split_transform_flag || log2_trafo_size == 3); + cbf_c1 = 0; + + if ((cbf_c0 & CBF_CB0) != 0) + { + cbf_c1 = ff_hevc_rpi_cbf_cb_cr_decode(lc, trafo_depth) << CBF_CB0_S; + if (wants_c1) + cbf_c1 |= ff_hevc_rpi_cbf_cb_cr_decode(lc, trafo_depth) << CBF_CB1_S; + } + + if ((cbf_c0 & CBF_CR0) != 0) + { + cbf_c1 |= ff_hevc_rpi_cbf_cb_cr_decode(lc, trafo_depth) << CBF_CR0_S; + if (wants_c1) + cbf_c1 |= ff_hevc_rpi_cbf_cb_cr_decode(lc, trafo_depth) << CBF_CR1_S; + } + } + + if (split_transform_flag) { + const int trafo_size_split = 1 << (log2_trafo_size - 1); + const int x1 = x0 + trafo_size_split; + const int y1 = y0 + trafo_size_split; + +#define SUBDIVIDE(x, y, idx) \ +do { \ + ret = hls_transform_tree(s, lc, x, y, \ + log2_trafo_size - 1, trafo_depth + 1, idx, \ + cbf_c1); \ + if (ret < 0) \ + return ret; \ +} while (0) + + SUBDIVIDE(x0, y0, 0); + SUBDIVIDE(x1, y0, 1); + SUBDIVIDE(x0, y1, 2); + SUBDIVIDE(x1, y1, 3); + +#undef SUBDIVIDE + } else { + // If trafo_size == 2 then we should have cbf_c == 0 here but as we can't have + // trafo_size == 2 with depth == 0 the issue is moot + const int cbf_luma = ((lc->cu.pred_mode != MODE_INTRA && trafo_depth == 0 && cbf_c1 == 0) || + ff_hevc_rpi_cbf_luma_decode(lc, trafo_depth)); + + ret = hls_transform_unit(s, lc, x0, y0, + log2_trafo_size + trafo_depth, log2_trafo_size, + blk_idx, cbf_luma, cbf_c1); + if (ret < 0) + return ret; + + if (!s->sh.disable_deblocking_filter_flag) { + ff_hevc_rpi_deblocking_boundary_strengths(s, lc, x0, y0, log2_trafo_size, cbf_luma); + } + } + return 0; +} + + +static int pcm_extract(const HEVCRpiContext * const s, const uint8_t * pcm, const int length, const int x0, const int y0, const int cb_size) +{ + GetBitContext gb; + int ret; + + ret = init_get_bits(&gb, pcm, length); + if (ret < 0) + return ret; + + s->hevcdsp.put_pcm(av_rpi_sand_frame_pos_y(s->frame, x0, y0), + frame_stride1(s->frame, 0), + cb_size, cb_size, &gb, s->ps.sps->pcm.bit_depth); + + s->hevcdsp.put_pcm_c(av_rpi_sand_frame_pos_c(s->frame, x0 >> ctx_hshift(s, 1), y0 >> ctx_vshift(s, 1)), + s->frame->linesize[1], + cb_size >> ctx_hshift(s, 1), + cb_size >> ctx_vshift(s, 1), + &gb, s->ps.sps->pcm.bit_depth_chroma); + + return 0; +} + + +// x * 2^(y*2) +static inline unsigned int xyexp2(const unsigned int x, const unsigned int y) +{ + return x << (y * 2); +} + +static int hls_pcm_sample(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, const int x0, const int y0, unsigned int log2_cb_size) +{ + // Length in bits + const unsigned int length = xyexp2(s->ps.sps->pcm.bit_depth, log2_cb_size) + + xyexp2(s->ps.sps->pcm.bit_depth_chroma, log2_cb_size - ctx_vshift(s, 1)) + + xyexp2(s->ps.sps->pcm.bit_depth_chroma, log2_cb_size - ctx_vshift(s, 2)); + + const uint8_t * const pcm = ff_hevc_rpi_cabac_skip_bytes(&lc->cc, (length + 7) >> 3); + + if (!s->sh.disable_deblocking_filter_flag) + ff_hevc_rpi_deblocking_boundary_strengths(s, lc, x0, y0, log2_cb_size, 0); + + // Copy coeffs + { + const int blen = (length + 7) >> 3; + // Round allocated bytes up to nearest 32 to avoid alignment confusion + // Allocation is in int16_t s + // As we are only using 1 byte per sample and the coeff buffer allows 2 per + // sample this rounding doesn't affect the total size we need to allocate for + // the coeff buffer + int16_t * const coeffs = rpi_alloc_coeff_buf(lc->jb0, 0, ((blen + 31) & ~31) >> 1); + memcpy(coeffs, pcm, blen); + + // Our coeff stash assumes that any partially allocated 64byte lump + // is zeroed so make that true. + { + uint8_t * const eopcm = (uint8_t *)coeffs + blen; + if ((-(intptr_t)eopcm & 63) != 0) + memset(eopcm, 0, -(intptr_t)eopcm & 63); + } + + // Add command + { + HEVCPredCmd *const cmd = rpi_new_intra_cmd(lc->jb0); + cmd->type = RPI_PRED_I_PCM; + cmd->size = log2_cb_size; + cmd->i_pcm.src = coeffs; + cmd->i_pcm.x = x0; + cmd->i_pcm.y = y0; + cmd->i_pcm.src_len = length; + } + return 0; + } +} + + +static void hevc_await_progress(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, const HEVCRpiFrame * const ref, + const MvXY xy, const int y0, const int height) +{ + if (s->threads_type != 0) { + const int y = FFMAX(0, (MV_Y(xy) >> 2) + y0 + height + 9); + + // Progress has to be attached to current job as the actual wait + // is in worker_core which can't use lc + int16_t *const pr = lc->jb0->progress_req + ref->dpb_no; + if (*pr < y) { + *pr = y; + } + } +} + +static void hevc_luma_mv_mvp_mode(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, + const int x0, const int y0, const int nPbW, + const int nPbH, + HEVCRpiMvField * const mv) +{ + enum InterPredIdc inter_pred_idc = PRED_L0; + int mvp_flag; + const unsigned int avail = ff_hevc_rpi_tb_avail_flags(s, lc, x0, y0, nPbW, nPbH); + + mv->pred_flag = 0; + if (s->sh.slice_type == HEVC_SLICE_B) + inter_pred_idc = ff_hevc_rpi_inter_pred_idc_decode(lc, nPbW, nPbH); + + if (inter_pred_idc != PRED_L1) { + MvXY mvd; + + if (s->sh.nb_refs[L0]) + mv->ref_idx[0]= ff_hevc_rpi_ref_idx_lx_decode(lc, s->sh.nb_refs[L0]); + + mv->pred_flag = PF_L0; + mvd = ff_hevc_rpi_hls_mvd_coding(lc); + mvp_flag = ff_hevc_rpi_mvp_lx_flag_decode(lc); + ff_hevc_rpi_luma_mv_mvp_mode(s, lc, x0, y0, nPbW, nPbH, avail, + mv, mvp_flag, 0); + mv->xy[0] = mvxy_add(mv->xy[0], mvd); + } + + if (inter_pred_idc != PRED_L0) { + MvXY mvd = 0; + + if (s->sh.nb_refs[L1]) + mv->ref_idx[1] = ff_hevc_rpi_ref_idx_lx_decode(lc, s->sh.nb_refs[L1]); + + if (s->sh.mvd_l1_zero_flag != 1 || inter_pred_idc != PRED_BI) + mvd = ff_hevc_rpi_hls_mvd_coding(lc); + + mv->pred_flag += PF_L1; + mvp_flag = ff_hevc_rpi_mvp_lx_flag_decode(lc); + ff_hevc_rpi_luma_mv_mvp_mode(s, lc, x0, y0, nPbW, nPbH, avail, + mv, mvp_flag, 1); + mv->xy[1] = mvxy_add(mv->xy[1], mvd); + } +} + + +static HEVCRpiInterPredQ * +rpi_nxt_pred(HEVCRpiInterPredEnv * const ipe, const unsigned int load_val, const uint32_t fn) +{ + HEVCRpiInterPredQ * yp = NULL; + HEVCRpiInterPredQ * ypt = ipe->q + ipe->curr; + const unsigned int max_fill = ipe->max_fill; + unsigned int load = UINT_MAX; + + for (unsigned int i = 0; i != ipe->n_grp; ++i, ++ypt) { + // We will always have enough room between the Qs but if we are + // running critically low due to poor scheduling then use fill size + // rather than load to determine QPU. This has obvious dire + // performance implications but (a) it is better than crashing + // and (b) it should (almost) never happen + const unsigned int tfill = (char *)ypt->qpu_mc_curr - (char *)ypt->qpu_mc_base; + const unsigned int tload = tfill > max_fill ? tfill + 0x1000000 : ypt->load; + + if (tload < load) + { + yp = ypt; + load = tload; + } + } + + yp->load += load_val; + ipe->used_grp = 1; + qpu_mc_link_set(yp->qpu_mc_curr, fn); + + return yp; +} + + +static void rpi_inter_pred_sync(HEVCRpiInterPredEnv * const ipe) +{ + for (unsigned int i = 0; i != ipe->n; ++i) { + HEVCRpiInterPredQ * const q = ipe->q + i; + const unsigned int qfill = (char *)q->qpu_mc_curr - (char *)q->qpu_mc_base; + + qpu_mc_link_set(q->qpu_mc_curr, q->code_sync); + q->qpu_mc_curr = (qpu_mc_pred_cmd_t *)(&q->qpu_mc_curr->sync + 1); + q->load = (qfill >> 7); // Have a mild preference for emptier Qs to balance memory usage + } +} + +// Returns 0 on success +// We no longer check for Q fullness as wew have emergncy code in ctu alloc +// * However it might be an idea to have some means of spotting that we've used it +static int rpi_inter_pred_next_ctu(HEVCRpiInterPredEnv * const ipe) +{ + if (!ipe->used_grp) + return 0; + + if ((ipe->curr += ipe->n_grp) >= ipe->n) + { + ipe->curr = 0; + rpi_inter_pred_sync(ipe); + } + ipe->used = 1; + ipe->used_grp = 0; + + return 0; +} + +static void rpi_inter_pred_reset(HEVCRpiInterPredEnv * const ipe) +{ + unsigned int i; + + ipe->curr = 0; + ipe->used = 0; + ipe->used_grp = 0; + for (i = 0; i != ipe->n; ++i) { + HEVCRpiInterPredQ * const q = ipe->q + i; + q->qpu_mc_curr = q->qpu_mc_base; + q->load = 0; + q->last_l0 = NULL; + q->last_l1 = NULL; + } +} + +static int rpi_inter_pred_alloc(HEVCRpiInterPredEnv * const ipe, + const unsigned int n_max, const unsigned int n_grp, + const unsigned int total_size, const unsigned int min_gap) +{ + int rv; + + memset(ipe, 0, sizeof(*ipe)); + if ((ipe->q = av_mallocz(n_max * sizeof(*ipe->q))) == NULL) + return AVERROR(ENOMEM); + + ipe->n_grp = n_grp; + ipe->min_gap = min_gap; + + if ((rv = gpu_malloc_cached(total_size, &ipe->gptr)) != 0) + av_freep(&ipe->q); + return rv; +} + + +#if RPI_QPU_EMU_Y +#define get_mc_address_y(f) ((f)->data[0]) +#else +#define get_mc_address_y(f) get_vc_address_y(f) +#endif +#if RPI_QPU_EMU_C +#define get_mc_address_u(f) ((f)->data[1]) +#else +#define get_mc_address_u(f) get_vc_address_u(f) +#endif + +static inline uint32_t pack_wo_p(const int off, const int mul) +{ + return PACK2(off * 2 + 1, mul); +} + +static inline uint32_t pack_wo_b(const int off0, const int off1, const int mul) +{ + return PACK2(off0 + off1 + 1, mul); +} + + +static void +rpi_pred_y(const HEVCRpiContext *const s, HEVCRpiJob * const jb, + const int x0, const int y0, + const int nPbW, const int nPbH, + const MvXY mv_xy, + const int weight_mul, + const int weight_offset, + AVFrame *const src_frame) +{ + const unsigned int y_off = av_rpi_sand_frame_off_y(s->frame, x0, y0); + const unsigned int mx = MV_X(mv_xy) & 3; + const unsigned int my = MV_Y(mv_xy) & 3; + const unsigned int my_mx = (my << 8) | mx; + const uint32_t my2_mx2_my_mx = (my_mx << 16) | my_mx; + const qpu_mc_src_addr_t src_vc_address_y = get_mc_address_y(src_frame); + qpu_mc_dst_addr_t dst_addr = get_mc_address_y(s->frame) + y_off; + const uint32_t wo = pack_wo_p(weight_offset, weight_mul); + HEVCRpiInterPredEnv * const ipe = &jb->luma_ip; + const unsigned int xshl = av_rpi_sand_frame_xshl(s->frame); + + if (my_mx == 0) + { + const int x1 = x0 + (MV_X(mv_xy) >> 2); + const int y1 = y0 + (MV_Y(mv_xy) >> 2); + const int bh = nPbH; + + for (int start_x = 0; start_x < nPbW; start_x += 16) + { + const int bw = FFMIN(nPbW - start_x, 16); + HEVCRpiInterPredQ *const yp = rpi_nxt_pred(ipe, bh, s->qpu.y_p00); + qpu_mc_src_t *const src1 = yp->last_l0; + qpu_mc_pred_y_p00_t *const cmd_y = &yp->qpu_mc_curr->y.p00; + +#if RPI_TSTATS + { + HEVCRpiStats *const ts = (HEVCRpiStats *)&s->tstats; + ++ts->y_pred1_x0y0; + + if (nPbW > 8) + ++ts->y_pred1_wgt8; + else + ++ts->y_pred1_wle8; + + if (nPbH > 16) + ++ts->y_pred1_hgt16; + else + ++ts->y_pred1_hle16; + } +#endif + + src1->x = x1 + start_x; + src1->y = y1; + src1->base = src_vc_address_y; + cmd_y->w = bw; + cmd_y->h = bh; + cmd_y->wo1 = wo; + cmd_y->dst_addr = dst_addr + (start_x << xshl); + yp->last_l0 = &cmd_y->next_src1; + yp->qpu_mc_curr = (qpu_mc_pred_cmd_t *)(cmd_y + 1); + } + } + else + { + const int x1_m3 = x0 + (MV_X(mv_xy) >> 2) - 3; + const int y1_m3 = y0 + (MV_Y(mv_xy) >> 2) - 3; + const unsigned int bh = nPbH; + int start_x = 0; + +#if 1 + // As Y-pred operates on two independant 8-wide src blocks we can merge + // this pred with the previous one if it the previous one is 8 pel wide, + // the same height as the current block, immediately to the left of our + // current dest block and mono-pred. + + qpu_mc_pred_y_p_t *const last_y8_p = jb->last_y8_p; + if (last_y8_p != NULL && last_y8_p->h == bh && last_y8_p->dst_addr + (8 << xshl) == dst_addr) + { + const int bw = FFMIN(nPbW, 8); + qpu_mc_src_t *const last_y8_src2 = jb->last_y8_l1; + + last_y8_src2->x = x1_m3; + last_y8_src2->y = y1_m3; + last_y8_src2->base = src_vc_address_y; + last_y8_p->w += bw; + last_y8_p->mymx21 = PACK2(my2_mx2_my_mx, last_y8_p->mymx21); + last_y8_p->wo2 = wo; + + jb->last_y8_p = NULL; + jb->last_y8_l1 = NULL; + start_x = bw; +#if RPI_TSTATS + ++((HEVCRpiStats *)&s->tstats)->y_pred1_y8_merge; +#endif + } +#endif + + for (; start_x < nPbW; start_x += 16) + { + const int bw = FFMIN(nPbW - start_x, 16); + HEVCRpiInterPredQ *const yp = rpi_nxt_pred(ipe, bh + 7, s->qpu.y_pxx); + qpu_mc_src_t *const src1 = yp->last_l0; + qpu_mc_src_t *const src2 = yp->last_l1; + qpu_mc_pred_y_p_t *const cmd_y = &yp->qpu_mc_curr->y.p; +#if RPI_TSTATS + { + HEVCRpiStats *const ts = (HEVCRpiStats *)&s->tstats; + if (mx == 0 && my == 0) + ++ts->y_pred1_x0y0; + else if (mx == 0) + ++ts->y_pred1_x0; + else if (my == 0) + ++ts->y_pred1_y0; + else + ++ts->y_pred1_xy; + + if (nPbW > 8) + ++ts->y_pred1_wgt8; + else + ++ts->y_pred1_wle8; + + if (nPbH > 16) + ++ts->y_pred1_hgt16; + else + ++ts->y_pred1_hle16; + } +#endif + src1->x = x1_m3 + start_x; + src1->y = y1_m3; + src1->base = src_vc_address_y; + if (bw <= 8) + { + src2->x = MC_DUMMY_X; + src2->y = MC_DUMMY_Y; +#if RPI_QPU_EMU_Y + src2->base = s->qpu_dummy_frame_emu; +#else + src2->base = s->qpu_dummy_frame_qpu; +#endif + } + else + { + src2->x = x1_m3 + start_x + 8; + src2->y = y1_m3; + src2->base = src_vc_address_y; + } + cmd_y->w = bw; + cmd_y->h = bh; + cmd_y->mymx21 = my2_mx2_my_mx; + cmd_y->wo1 = wo; + cmd_y->wo2 = wo; + cmd_y->dst_addr = dst_addr + (start_x << xshl); + yp->last_l0 = &cmd_y->next_src1; + yp->last_l1 = &cmd_y->next_src2; + yp->qpu_mc_curr = (qpu_mc_pred_cmd_t *)(cmd_y + 1); + + if (bw == 8) { + jb->last_y8_l1 = src2; + jb->last_y8_p = cmd_y; + } + } + } +} + +static void +rpi_pred_y_b(const HEVCRpiContext * const s, HEVCRpiJob * const jb, + const int x0, const int y0, + const int nPbW, const int nPbH, + const struct HEVCRpiMvField *const mv_field, + const AVFrame *const src_frame, + const AVFrame *const src_frame2) +{ + const unsigned int y_off = av_rpi_sand_frame_off_y(s->frame, x0, y0); + const MvXY mv = mv_field->xy[0]; + const MvXY mv2 = mv_field->xy[1]; + + const unsigned int mx = MV_X(mv) & 3; + const unsigned int my = MV_Y(mv) & 3; + const unsigned int my_mx = (my<<8) | mx; + const unsigned int mx2 = MV_X(mv2) & 3; + const unsigned int my2 = MV_Y(mv2) & 3; + const unsigned int my2_mx2 = (my2<<8) | mx2; + const uint32_t my2_mx2_my_mx = (my2_mx2 << 16) | my_mx; + const unsigned int ref_idx0 = mv_field->ref_idx[0]; + const unsigned int ref_idx1 = mv_field->ref_idx[1]; + const uint32_t wo1 = pack_wo_b(s->sh.luma_offset_l0[ref_idx0], s->sh.luma_offset_l1[ref_idx1], s->sh.luma_weight_l0[ref_idx0]); + const uint32_t wo2 = pack_wo_b(s->sh.luma_offset_l0[ref_idx0], s->sh.luma_offset_l1[ref_idx1], s->sh.luma_weight_l1[ref_idx1]); + + const unsigned int xshl = av_rpi_sand_frame_xshl(s->frame); + qpu_mc_dst_addr_t dst = get_mc_address_y(s->frame) + y_off; + const qpu_mc_src_addr_t src1_base = get_mc_address_y(src_frame); + const qpu_mc_src_addr_t src2_base = get_mc_address_y(src_frame2); + HEVCRpiInterPredEnv * const ipe = &jb->luma_ip; + + if (my2_mx2_my_mx == 0) + { + const int x1 = x0 + (MV_X(mv) >> 2); + const int y1 = y0 + (MV_Y(mv) >> 2); + const int x2 = x0 + (MV_X(mv2) >> 2); + const int y2 = y0 + (MV_Y(mv2) >> 2); + const int bh = nPbH; + + // Can do chunks a full 16 wide if we don't want the H filter + for (int start_x=0; start_x < nPbW; start_x += 16) + { + HEVCRpiInterPredQ *const yp = rpi_nxt_pred(ipe, bh, s->qpu.y_b00); + qpu_mc_src_t *const src1 = yp->last_l0; + qpu_mc_src_t *const src2 = yp->last_l1; + qpu_mc_pred_y_p_t *const cmd_y = &yp->qpu_mc_curr->y.p; +#if RPI_TSTATS + { + HEVCRpiStats *const ts = (HEVCRpiStats *)&s->tstats; + ++ts->y_pred2_x0y0; + + if (nPbH > 16) + ++ts->y_pred2_hgt16; + else + ++ts->y_pred2_hle16; + } +#endif + src1->x = x1 + start_x; + src1->y = y1; + src1->base = src1_base; + src2->x = x2 + start_x; + src2->y = y2; + src2->base = src2_base; + cmd_y->w = FFMIN(nPbW - start_x, 16); + cmd_y->h = bh; + cmd_y->mymx21 = 0; + cmd_y->wo1 = wo1; + cmd_y->wo2 = wo2; + cmd_y->dst_addr = dst + (start_x << xshl); + yp->last_l0 = &cmd_y->next_src1; + yp->last_l1 = &cmd_y->next_src2; + yp->qpu_mc_curr = (qpu_mc_pred_cmd_t *)(cmd_y + 1); + } + } + else + { + // Filter requires a run-up of 3 + const int x1 = x0 + (MV_X(mv) >> 2) - 3; + const int y1 = y0 + (MV_Y(mv) >> 2) - 3; + const int x2 = x0 + (MV_X(mv2) >> 2) - 3; + const int y2 = y0 + (MV_Y(mv2) >> 2) - 3; + const int bh = nPbH; + + for (int start_x=0; start_x < nPbW; start_x += 8) + { // B blocks work 8 at a time + // B weights aren't doubled as the QPU code does the same + // amount of work as it does for P + HEVCRpiInterPredQ *const yp = rpi_nxt_pred(ipe, bh + 7, s->qpu.y_bxx); + qpu_mc_src_t *const src1 = yp->last_l0; + qpu_mc_src_t *const src2 = yp->last_l1; + qpu_mc_pred_y_p_t *const cmd_y = &yp->qpu_mc_curr->y.p; +#if RPI_TSTATS + { + HEVCRpiStats *const ts = (HEVCRpiStats *)&s->tstats; + const unsigned int mmx = mx | mx2; + const unsigned int mmy = my | my2; + if (mmx == 0 && mmy == 0) + ++ts->y_pred2_x0y0; + else if (mmx == 0) + ++ts->y_pred2_x0; + else if (mmy == 0) + ++ts->y_pred2_y0; + else + ++ts->y_pred2_xy; + + if (nPbH > 16) + ++ts->y_pred2_hgt16; + else + ++ts->y_pred2_hle16; + } +#endif + src1->x = x1 + start_x; + src1->y = y1; + src1->base = src1_base; + src2->x = x2 + start_x; + src2->y = y2; + src2->base = src2_base; + cmd_y->w = FFMIN(nPbW - start_x, 8); + cmd_y->h = bh; + cmd_y->mymx21 = my2_mx2_my_mx; + cmd_y->wo1 = wo1; + cmd_y->wo2 = wo2; + cmd_y->dst_addr = dst + (start_x << xshl); + yp->last_l0 = &cmd_y->next_src1; + yp->last_l1 = &cmd_y->next_src2; + yp->qpu_mc_curr = (qpu_mc_pred_cmd_t *)(cmd_y + 1); + } + } +} + +// h/v shifts fixed at one as that is all the qasm copes with +static void +rpi_pred_c(const HEVCRpiContext * const s, HEVCRpiJob * const jb, + const unsigned int lx, const int x0_c, const int y0_c, + const int nPbW_c, const int nPbH_c, + const MvXY mv, + const int16_t * const c_weights, + const int16_t * const c_offsets, + AVFrame * const src_frame) +{ + const unsigned int c_off = av_rpi_sand_frame_off_c(s->frame, x0_c, y0_c); + const int hshift = 1; // = s->ps.sps->hshift[1]; + const int vshift = 1; // = s->ps.sps->vshift[1]; + + const int x1_c = x0_c + (MV_X(mv) >> (2 + hshift)) - 1; + const int y1_c = y0_c + (MV_Y(mv) >> (2 + hshift)) - 1; + const qpu_mc_src_addr_t src_base_u = get_mc_address_u(src_frame); + const uint32_t x_coeffs = rpi_filter_coefs[av_mod_uintp2(MV_X(mv), 2 + hshift) << (1 - hshift)]; + const uint32_t y_coeffs = rpi_filter_coefs[av_mod_uintp2(MV_Y(mv), 2 + vshift) << (1 - vshift)]; + const uint32_t wo_u = pack_wo_p(c_offsets[0], c_weights[0]); + const uint32_t wo_v = pack_wo_p(c_offsets[1], c_weights[1]); + qpu_mc_dst_addr_t dst_base_u = get_mc_address_u(s->frame) + c_off; + HEVCRpiInterPredEnv * const ipe = &jb->chroma_ip; + const unsigned int xshl = av_rpi_sand_frame_xshl(s->frame) + 1; + const unsigned int bh = nPbH_c; + const uint32_t qfn = lx == 0 ? s->qpu.c_pxx : s->qpu.c_pxx_l1; + + for(int start_x=0; start_x < nPbW_c; start_x+=RPI_CHROMA_BLOCK_WIDTH) + { + HEVCRpiInterPredQ * const cp = rpi_nxt_pred(ipe, bh + 3, qfn); + qpu_mc_pred_c_p_t * const cmd_c = &cp->qpu_mc_curr->c.p; + qpu_mc_src_t ** const plast_lx = (lx == 0) ? &cp->last_l0 : &cp->last_l1; + qpu_mc_src_t * const last_lx = *plast_lx; + const int bw = FFMIN(nPbW_c-start_x, RPI_CHROMA_BLOCK_WIDTH); + + last_lx->x = x1_c + start_x; + last_lx->y = y1_c; + last_lx->base = src_base_u; + cmd_c->h = bh; + cmd_c->w = bw; + cmd_c->coeffs_x = x_coeffs; + cmd_c->coeffs_y = y_coeffs; + cmd_c->wo_u = wo_u; + cmd_c->wo_v = wo_v; + cmd_c->dst_addr_c = dst_base_u + (start_x << xshl); + *plast_lx = &cmd_c->next_src; + cp->qpu_mc_curr = (qpu_mc_pred_cmd_t *)(cmd_c + 1); + } + return; +} + +// h/v shifts fixed at one as that is all the qasm copes with +static void +rpi_pred_c_b(const HEVCRpiContext * const s, HEVCRpiJob * const jb, + const int x0_c, const int y0_c, + const int nPbW_c, const int nPbH_c, + const struct HEVCRpiMvField * const mv_field, + const int16_t * const c_weights, + const int16_t * const c_offsets, + const int16_t * const c_weights2, + const int16_t * const c_offsets2, + AVFrame * const src_frame, + AVFrame * const src_frame2) +{ + const unsigned int c_off = av_rpi_sand_frame_off_c(s->frame, x0_c, y0_c); + const int hshift = 1; // s->ps.sps->hshift[1]; + const int vshift = 1; // s->ps.sps->vshift[1]; + const MvXY mv = mv_field->xy[0]; + const MvXY mv2 = mv_field->xy[1]; + + const unsigned int mx = av_mod_uintp2(MV_X(mv), 2 + hshift); + const unsigned int my = av_mod_uintp2(MV_Y(mv), 2 + vshift); + const uint32_t coefs0_x = rpi_filter_coefs[mx << (1 - hshift)]; + const uint32_t coefs0_y = rpi_filter_coefs[my << (1 - vshift)]; // Fractional part of motion vector + const int x1_c = x0_c + (MV_X(mv) >> (2 + hshift)) - 1; + const int y1_c = y0_c + (MV_Y(mv) >> (2 + hshift)) - 1; + + const unsigned int mx2 = av_mod_uintp2(MV_X(mv2), 2 + hshift); + const unsigned int my2 = av_mod_uintp2(MV_Y(mv2), 2 + vshift); + const uint32_t coefs1_x = rpi_filter_coefs[mx2 << (1 - hshift)]; + const uint32_t coefs1_y = rpi_filter_coefs[my2 << (1 - vshift)]; // Fractional part of motion vector + + const int x2_c = x0_c + (MV_X(mv2) >> (2 + hshift)) - 1; + const int y2_c = y0_c + (MV_Y(mv2) >> (2 + hshift)) - 1; + + const uint32_t wo_u2 = pack_wo_b(c_offsets[0], c_offsets2[0], c_weights2[0]); + const uint32_t wo_v2 = pack_wo_b(c_offsets[1], c_offsets2[1], c_weights2[1]); + + const qpu_mc_dst_addr_t dst_base_u = get_mc_address_u(s->frame) + c_off; + const qpu_mc_src_addr_t src1_base = get_mc_address_u(src_frame); + const qpu_mc_src_addr_t src2_base = get_mc_address_u(src_frame2); + HEVCRpiInterPredEnv * const ipe = &jb->chroma_ip; + const unsigned int xshl = av_rpi_sand_frame_xshl(s->frame) + 1; + const unsigned int bh = nPbH_c; + + for (int start_x=0; start_x < nPbW_c; start_x += RPI_CHROMA_BLOCK_WIDTH) + { + const unsigned int bw = FFMIN(nPbW_c-start_x, RPI_CHROMA_BLOCK_WIDTH); + + HEVCRpiInterPredQ * const cp = rpi_nxt_pred(ipe, bh * 2 + 3, s->qpu.c_bxx); + qpu_mc_pred_c_b_t * const u = &cp->qpu_mc_curr->c.b; + qpu_mc_src_t * const src_l0 = cp->last_l0; + qpu_mc_src_t * const src_l1 = cp->last_l1; + + src_l0->x = x1_c + start_x; + src_l0->y = y1_c; + src_l0->base = src1_base; + src_l1->x = x2_c + start_x; + src_l1->y = y2_c; + src_l1->base = src2_base; + + u[0].h = bh; + u[0].w = bw; + u[0].coeffs_x1 = coefs0_x; + u[0].coeffs_y1 = coefs0_y; + u[0].weight_u1 = c_weights[0]; // Weight L0 U + u[0].weight_v1 = c_weights[1]; // Weight L0 V + u[0].coeffs_x2 = coefs1_x; + u[0].coeffs_y2 = coefs1_y; + u[0].wo_u2 = wo_u2; + u[0].wo_v2 = wo_v2; + u[0].dst_addr_c = dst_base_u + (start_x << xshl); + + cp->last_l0 = &u[0].next_src1; + cp->last_l1 = &u[0].next_src2; + cp->qpu_mc_curr = (qpu_mc_pred_cmd_t *)(u + 1); + } +} + + +static inline void +col_stash(const HEVCRpiContext * const s, + const unsigned int x0, const unsigned int y0, const unsigned int w0, const unsigned int h0, + const HEVCRpiMvField * const mvf) +{ + ColMvField * const col_mvf = s->ref->col_mvf; + const unsigned int x = (x0 + 15) >> 4; + const unsigned int y = (y0 + 15) >> 4; + const unsigned int w = ((x0 + 15 + w0) >> 4) - x; + const unsigned int h = ((y0 + 15 + h0) >> 4) - y; + + if (col_mvf != NULL && w != 0 && h != 0) + { + // Only record MV from the top left of the 16x16 block + + const RefPicList * const rpl = s->refPicList; + const ColMvField cmv = { + .L = { + { + .poc = (mvf->pred_flag & PF_L0) == 0 ? + COL_POC_INTRA : + COL_POC_MAKE_INTER(rpl[0].isLongTerm[mvf->ref_idx[0]], rpl[0].list[mvf->ref_idx[0]]), + .xy = mvf->xy[0] + }, + { + .poc = (mvf->pred_flag & PF_L1) == 0 ? + COL_POC_INTRA : + COL_POC_MAKE_INTER(rpl[1].isLongTerm[mvf->ref_idx[1]], rpl[1].list[mvf->ref_idx[1]]), + .xy = mvf->xy[1] + } + } + }; + + ColMvField * p = col_mvf + y * s->col_mvf_stride + x; + const unsigned int stride = s->col_mvf_stride - w; + unsigned int j = h; + + do + { + unsigned int k = w; + do + { + *p++ = cmv; + } while (--k != 0); + p += stride; + } while (--j != 0); + } +} + +static void hls_prediction_unit(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, + const unsigned int x0, const unsigned int y0, + const unsigned int nPbW, const unsigned int nPbH, + const unsigned int log2_cb_size, const unsigned int partIdx, const unsigned int idx) +{ + HEVCRpiJob * const jb = lc->jb0; + + struct HEVCRpiMvField current_mv = {{0}}; + const RefPicList *const refPicList = s->refPicList; + const HEVCRpiFrame *ref0 = NULL, *ref1 = NULL; + + if (lc->cu.pred_mode != MODE_SKIP) + lc->pu.merge_flag = ff_hevc_rpi_merge_flag_decode(lc); + + if (lc->cu.pred_mode == MODE_SKIP || lc->pu.merge_flag) { + const unsigned int merge_idx = s->sh.max_num_merge_cand <= 1 ? 0 : + ff_hevc_rpi_merge_idx_decode(s, lc); + + ff_hevc_rpi_luma_mv_merge_mode(s, lc, x0, y0, nPbW, nPbH, log2_cb_size, + partIdx, merge_idx, ¤t_mv); + } else { + hevc_luma_mv_mvp_mode(s, lc, x0, y0, nPbW, nPbH, ¤t_mv); + } + + { + HEVCRpiMvField * p = mvf_stash_ptr(s, lc, x0, y0); + unsigned int i, j; + + for (j = 0; j < nPbH >> LOG2_MIN_PU_SIZE; j++) + { + for (i = 0; i < nPbW >> LOG2_MIN_PU_SIZE; i++) + p[i] = current_mv; + p += MVF_STASH_WIDTH_PU; + } + } + + col_stash(s, x0, y0, nPbW, nPbH, ¤t_mv); + + if (current_mv.pred_flag & PF_L0) { + ref0 = refPicList[0].ref[current_mv.ref_idx[0]]; + if (!ref0) + return; + hevc_await_progress(s, lc, ref0, current_mv.xy[0], y0, nPbH); + } + if (current_mv.pred_flag & PF_L1) { + ref1 = refPicList[1].ref[current_mv.ref_idx[1]]; + if (!ref1) + return; + hevc_await_progress(s, lc, ref1, current_mv.xy[1], y0, nPbH); + } + + if (current_mv.pred_flag == PF_L0) { + const int x0_c = x0 >> ctx_hshift(s, 1); + const int y0_c = y0 >> ctx_vshift(s, 1); + const int nPbW_c = nPbW >> ctx_hshift(s, 1); + const int nPbH_c = nPbH >> ctx_vshift(s, 1); + + rpi_pred_y(s, jb, x0, y0, nPbW, nPbH, current_mv.xy[0], + s->sh.luma_weight_l0[current_mv.ref_idx[0]], s->sh.luma_offset_l0[current_mv.ref_idx[0]], + ref0->frame); + + if (ctx_cfmt(s) != 0) { + rpi_pred_c(s, jb, 0, x0_c, y0_c, nPbW_c, nPbH_c, current_mv.xy[0], + s->sh.chroma_weight_l0[current_mv.ref_idx[0]], s->sh.chroma_offset_l0[current_mv.ref_idx[0]], + ref0->frame); + return; + } + } else if (current_mv.pred_flag == PF_L1) { + const int x0_c = x0 >> ctx_hshift(s, 1); + const int y0_c = y0 >> ctx_vshift(s, 1); + const int nPbW_c = nPbW >> ctx_hshift(s, 1); + const int nPbH_c = nPbH >> ctx_vshift(s, 1); + + rpi_pred_y(s, jb, x0, y0, nPbW, nPbH, current_mv.xy[1], + s->sh.luma_weight_l1[current_mv.ref_idx[1]], s->sh.luma_offset_l1[current_mv.ref_idx[1]], + ref1->frame); + + if (ctx_cfmt(s) != 0) { + rpi_pred_c(s, jb, 1, x0_c, y0_c, nPbW_c, nPbH_c, current_mv.xy[1], + s->sh.chroma_weight_l1[current_mv.ref_idx[1]], s->sh.chroma_offset_l1[current_mv.ref_idx[1]], + ref1->frame); + return; + } + } else if (current_mv.pred_flag == PF_BI) { + const int x0_c = x0 >> ctx_hshift(s, 1); + const int y0_c = y0 >> ctx_vshift(s, 1); + const int nPbW_c = nPbW >> ctx_hshift(s, 1); + const int nPbH_c = nPbH >> ctx_vshift(s, 1); + + rpi_pred_y_b(s, jb, x0, y0, nPbW, nPbH, ¤t_mv, ref0->frame, ref1->frame); + + if (ctx_cfmt(s) != 0) { + rpi_pred_c_b(s, jb, x0_c, y0_c, nPbW_c, nPbH_c, + ¤t_mv, + s->sh.chroma_weight_l0[current_mv.ref_idx[0]], + s->sh.chroma_offset_l0[current_mv.ref_idx[0]], + s->sh.chroma_weight_l1[current_mv.ref_idx[1]], + s->sh.chroma_offset_l1[current_mv.ref_idx[1]], + ref0->frame, + ref1->frame); + return; + } + } +} + +static void set_ipm(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, + const unsigned int x0, const unsigned int y0, + const unsigned int log2_cb_size, + const unsigned int ipm) +{ + const unsigned int x_pu = x0 >> LOG2_MIN_PU_SIZE; + const unsigned int y_pu = y0 >> LOG2_MIN_PU_SIZE; + + { + const unsigned int ctb_mask = ~(~0U << (s->ps.sps->log2_ctb_size - LOG2_MIN_PU_SIZE)); + set_stash2(lc->ipm_left + (y_pu & ctb_mask), lc->ipm_up + (x_pu & ctb_mask), log2_cb_size - LOG2_MIN_PU_SIZE, ipm); + } + + // If IRAP then everything is Intra & we avoid ever looking at these + // stashes so don't bother setting them + if (!s->is_irap && lc->cu.pred_mode == MODE_INTRA) + { + if (s->is_intra != NULL) + { + set_bits(s->is_intra + (y0 >> LOG2_MIN_CU_SIZE) * s->ps.sps->pcm_width, x0 >> LOG2_MIN_CU_SIZE, s->ps.sps->pcm_width, log2_cb_size - LOG2_MIN_CU_SIZE); + } + + { + HEVCRpiMvField * p = mvf_stash_ptr(s, lc, x0, y0); + const unsigned int size_in_pus = (1 << log2_cb_size) >> LOG2_MIN_PU_SIZE; // min_pu <= log2_cb so >= 1 + unsigned int n = size_in_pus; + + do + { + memset(p, 0, size_in_pus * sizeof(*p)); + p += MVF_STASH_WIDTH_PU; + } while (--n != 0); + } + + + if (s->ref->col_mvf != NULL && ((x0 | y0) & 0xf) == 0) + { + // Only record top left stuff + // Blocks should always be alinged on size boundries + // so cannot have overflow from a small block + + ColMvField * p = s->ref->col_mvf + (y0 >> 4) * s->col_mvf_stride + (x0 >> 4); + const unsigned int size_in_col = log2_cb_size < 4 ? 1 : (1 << (log2_cb_size - 4)); + const unsigned int stride = s->col_mvf_stride - size_in_col; + unsigned int j = size_in_col; + + do + { + unsigned int k = size_in_col; + do + { + p->L[0].poc = COL_POC_INTRA; + p->L[0].xy = 0; + p->L[1].poc = COL_POC_INTRA; + p->L[1].xy = 0; + ++p; + } while (--k != 0); + p += stride; + } while (--j != 0); + } + } +} + +static inline void intra_prediction_unit_default_value(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, + const unsigned int x0, const unsigned int y0, + const unsigned int log2_cb_size) +{ + set_ipm(s, lc, x0, y0, log2_cb_size, INTRA_DC); +} + + +/** + * 8.4.1 + */ +static int luma_intra_pred_mode(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, + int x0, int y0, int log2_pu_size, + int prev_intra_luma_pred_flag, + const unsigned int idx) +{ + const unsigned int ctb_mask = ~(~0U << s->ps.sps->log2_ctb_size); + const unsigned int xb_pu = (x0 & ctb_mask) >> LOG2_MIN_PU_SIZE; + const unsigned int yb_pu = (y0 & ctb_mask) >> LOG2_MIN_PU_SIZE; + + // Up does not cross boundries so as we always scan 1 slice-tile-line in an + // lc we can just keep 1 CTB lR stashes + // Left is reset to DC @ Start of Line/Tile/Slice in fill_job + const unsigned int cand_up = yb_pu == 0 ? INTRA_DC : lc->ipm_up[xb_pu]; + const unsigned int cand_left = lc->ipm_left[yb_pu]; + + unsigned int intra_pred_mode; + unsigned int a, b, c; + + if (cand_left == cand_up) { + if (cand_left < 2) { + a = INTRA_PLANAR; + b = INTRA_DC; + c = INTRA_ANGULAR_26; + } else { + a = cand_left; + b = 2 + ((cand_left - 2 - 1 + 32) & 31); + c = 2 + ((cand_left - 2 + 1) & 31); + } + } else { + a = cand_left; + b = cand_up; + c = (cand_left != INTRA_PLANAR && cand_up != INTRA_PLANAR) ? + INTRA_PLANAR : + (cand_left != INTRA_DC && cand_up != INTRA_DC) ? + INTRA_DC : + INTRA_ANGULAR_26; + } + + if (prev_intra_luma_pred_flag) { + intra_pred_mode = idx == 0 ? a : idx == 1 ? b : c; + } else { + // Sort lowest 1st + if (a > b) + FFSWAP(int, a, b); + if (a > c) + FFSWAP(int, a, c); + if (b > c) + FFSWAP(int, b, c); + + intra_pred_mode = idx; + if (intra_pred_mode >= a) + intra_pred_mode++; + if (intra_pred_mode >= b) + intra_pred_mode++; + if (intra_pred_mode >= c) + intra_pred_mode++; + } + + /* write the intra prediction units into the mv array */ + set_ipm(s, lc, x0, y0, log2_pu_size, intra_pred_mode); + return intra_pred_mode; +} + +static const uint8_t tab_mode_idx[] = { + 0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20, + 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31}; + +static void intra_prediction_unit(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, + const unsigned int x0, const unsigned int y0, + const unsigned int log2_cb_size) +{ + static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 }; + uint8_t prev_intra_luma_pred_flag[4]; + int split = lc->cu.part_mode == PART_NxN; + const unsigned int split_size = (1 << (log2_cb_size - 1)); + int chroma_mode; + const unsigned int n = split ? 4 : 1; + unsigned int i; + + for (i = 0; i != n; i++) + prev_intra_luma_pred_flag[i] = ff_hevc_rpi_prev_intra_luma_pred_flag_decode(lc); + + for (i = 0; i < n; i++) { + // depending on mode idx is mpm or luma_pred_mode + const unsigned int idx = prev_intra_luma_pred_flag[i] ? + ff_hevc_rpi_mpm_idx_decode(lc) : + ff_hevc_rpi_rem_intra_luma_pred_mode_decode(lc); + + lc->pu.intra_pred_mode[i] = + luma_intra_pred_mode(s, lc, + x0 + ((i & 1) == 0 ? 0 : split_size), + y0 + ((i & 2) == 0 ? 0 : split_size), + log2_cb_size - split, + prev_intra_luma_pred_flag[i], idx); + } + + if (ctx_cfmt(s) == 3) { + for (i = 0; i < n; i++) { + lc->pu.chroma_mode_c[i] = chroma_mode = ff_hevc_rpi_intra_chroma_pred_mode_decode(lc); + if (chroma_mode != 4) { + if (lc->pu.intra_pred_mode[i] == intra_chroma_table[chroma_mode]) + lc->pu.intra_pred_mode_c[i] = 34; + else + lc->pu.intra_pred_mode_c[i] = intra_chroma_table[chroma_mode]; + } else { + lc->pu.intra_pred_mode_c[i] = lc->pu.intra_pred_mode[i]; + } + } + } else if (ctx_cfmt(s) == 2) { + int mode_idx; + lc->pu.chroma_mode_c[0] = chroma_mode = ff_hevc_rpi_intra_chroma_pred_mode_decode(lc); + if (chroma_mode != 4) { + if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode]) + mode_idx = 34; + else + mode_idx = intra_chroma_table[chroma_mode]; + } else { + mode_idx = lc->pu.intra_pred_mode[0]; + } + lc->pu.intra_pred_mode_c[0] = tab_mode_idx[mode_idx]; + } else if (ctx_cfmt(s) != 0) { + chroma_mode = ff_hevc_rpi_intra_chroma_pred_mode_decode(lc); + if (chroma_mode != 4) { + if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode]) + lc->pu.intra_pred_mode_c[0] = 34; + else + lc->pu.intra_pred_mode_c[0] = intra_chroma_table[chroma_mode]; + } else { + lc->pu.intra_pred_mode_c[0] = lc->pu.intra_pred_mode[0]; + } + } +} + +static int hls_coding_unit(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, + const unsigned int x0, const unsigned int y0, const unsigned int log2_cb_size) +{ + const unsigned int cb_size = 1 << log2_cb_size; + const unsigned int log2_min_cb_size = s->ps.sps->log2_min_cb_size; + const unsigned int min_cb_width = s->ps.sps->min_cb_width; + const unsigned int x_cb = x0 >> log2_min_cb_size; + const unsigned int y_cb = y0 >> log2_min_cb_size; + const unsigned int idx = log2_cb_size - 2; + const unsigned int qp_block_mask = (1 << s->ps.pps->log2_min_cu_qp_delta_size) - 1; + int skip_flag = 0; + + lc->cu.x = x0; + lc->cu.y = y0; + lc->cu.x_split = x0; + lc->cu.y_split = y0; + + lc->cu.pred_mode = MODE_INTRA; + lc->cu.part_mode = PART_2Nx2N; + lc->cu.intra_split_flag = 0; + lc->cu.cu_transquant_bypass_flag = 0; + lc->pu.intra_pred_mode[0] = 1; + lc->pu.intra_pred_mode[1] = 1; + lc->pu.intra_pred_mode[2] = 1; + lc->pu.intra_pred_mode[3] = 1; + + if (s->ps.pps->transquant_bypass_enable_flag) { + lc->cu.cu_transquant_bypass_flag = ff_hevc_rpi_cu_transquant_bypass_flag_decode(lc); + if (lc->cu.cu_transquant_bypass_flag) + set_deblocking_bypass(s, x0, y0, log2_cb_size); + } + + if (s->sh.slice_type != HEVC_SLICE_I) { + lc->cu.pred_mode = MODE_INTER; + skip_flag = ff_hevc_rpi_skip_flag_decode(s, lc, x0, y0, x_cb, y_cb); + } + + if (skip_flag) { + lc->cu.pred_mode = MODE_SKIP; + + hls_prediction_unit(s, lc, x0, y0, cb_size, cb_size, log2_cb_size, 0, idx); + intra_prediction_unit_default_value(s, lc, x0, y0, log2_cb_size); + + if (!s->sh.disable_deblocking_filter_flag) + ff_hevc_rpi_deblocking_boundary_strengths(s, lc, x0, y0, log2_cb_size, 0); + } else { + int pcm_flag = 0; + + if (s->sh.slice_type != HEVC_SLICE_I) + lc->cu.pred_mode = ff_hevc_rpi_pred_mode_decode(lc); + if (lc->cu.pred_mode != MODE_INTRA || + log2_cb_size == s->ps.sps->log2_min_cb_size) { + lc->cu.part_mode = ff_hevc_rpi_part_mode_decode(s, lc, log2_cb_size); + lc->cu.intra_split_flag = lc->cu.part_mode == PART_NxN && + lc->cu.pred_mode == MODE_INTRA; + } + + if (lc->cu.pred_mode == MODE_INTRA) { + if (lc->cu.part_mode == PART_2Nx2N && + log2_cb_size <= s->ps.sps->pcm.log2_max_pcm_cb_size && // 0 if not enabled + log2_cb_size >= s->ps.sps->pcm.log2_min_pcm_cb_size && + ff_hevc_rpi_pcm_flag_decode(lc) != 0) + { + int ret; + pcm_flag = 1; + intra_prediction_unit_default_value(s, lc, x0, y0, log2_cb_size); + if ((ret = hls_pcm_sample(s, lc, x0, y0, log2_cb_size)) < 0) + return ret; + + if (s->ps.sps->pcm.loop_filter_disable_flag) + set_deblocking_bypass(s, x0, y0, log2_cb_size); + } else { + intra_prediction_unit(s, lc, x0, y0, log2_cb_size); + } + } else { + intra_prediction_unit_default_value(s, lc, x0, y0, log2_cb_size); + switch (lc->cu.part_mode) { + case PART_2Nx2N: + hls_prediction_unit(s, lc, x0, y0, cb_size, cb_size, log2_cb_size, 0, idx); + break; + case PART_2NxN: + hls_prediction_unit(s, lc, x0, y0, cb_size, cb_size / 2, log2_cb_size, 0, idx); + lc->cu.y_split = y0 + cb_size / 2; + hls_prediction_unit(s, lc, x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx); + break; + case PART_Nx2N: + hls_prediction_unit(s, lc, x0, y0, cb_size / 2, cb_size, log2_cb_size, 0, idx - 1); + lc->cu.x_split = x0 + cb_size / 2; + hls_prediction_unit(s, lc, x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1); + break; + case PART_2NxnU: + hls_prediction_unit(s, lc, x0, y0, cb_size, cb_size / 4, log2_cb_size, 0, idx); + lc->cu.y_split = y0 + cb_size / 4; + hls_prediction_unit(s, lc, x0, y0 + cb_size / 4, cb_size, cb_size / 4 * 3, log2_cb_size, 1, idx); + break; + case PART_2NxnD: + hls_prediction_unit(s, lc, x0, y0, cb_size, cb_size / 4 * 3, log2_cb_size, 0, idx); + lc->cu.y_split = y0 + cb_size / 4 * 3; + hls_prediction_unit(s, lc, x0, y0 + cb_size / 4 * 3, cb_size, cb_size / 4, log2_cb_size, 1, idx); + break; + case PART_nLx2N: + hls_prediction_unit(s, lc, x0, y0, cb_size / 4, cb_size, log2_cb_size, 0, idx - 2); + lc->cu.x_split = x0 + cb_size / 4; + hls_prediction_unit(s, lc, x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2); + break; + case PART_nRx2N: + hls_prediction_unit(s, lc, x0, y0, cb_size / 4 * 3, cb_size, log2_cb_size, 0, idx - 2); + lc->cu.x_split = x0 + cb_size / 4 * 3; + hls_prediction_unit(s, lc, x0 + cb_size / 4 * 3, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2); + break; + case PART_NxN: + hls_prediction_unit(s, lc, x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0, idx - 1); + lc->cu.x_split = x0 + cb_size / 2; + hls_prediction_unit(s, lc, x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1); + lc->cu.y_split = y0 + cb_size / 2; + hls_prediction_unit(s, lc, x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1); + hls_prediction_unit(s, lc, x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1); + break; + } + } + + if (!pcm_flag) { + int rqt_root_cbf = 1; + + if (lc->cu.pred_mode != MODE_INTRA && + !(lc->cu.part_mode == PART_2Nx2N && lc->pu.merge_flag)) { + rqt_root_cbf = ff_hevc_rpi_no_residual_syntax_flag_decode(lc); + } + if (rqt_root_cbf) { + const unsigned int cbf_c = ctx_cfmt(s) == 0 ? 0 : (CBF_CR0 | CBF_CB0); + int ret; + + lc->cu.max_trafo_depth = lc->cu.pred_mode == MODE_INTRA ? + s->ps.sps->max_transform_hierarchy_depth_intra + lc->cu.intra_split_flag : + s->ps.sps->max_transform_hierarchy_depth_inter; + // transform_tree does deblock_boundary_strengths + ret = hls_transform_tree(s, lc, x0, y0, + log2_cb_size, 0, 0, cbf_c); + if (ret < 0) + return ret; + } else { + if (!s->sh.disable_deblocking_filter_flag) + ff_hevc_rpi_deblocking_boundary_strengths(s, lc, x0, y0, log2_cb_size, 0); + } + } + } + + // If the delta is still wanted then we haven't read the delta & therefore need to set qp here + if (lc->tu.is_cu_qp_delta_wanted) + ff_hevc_rpi_set_qPy(s, lc, x0, y0); + + if(((x0 + (1<qPy_pred = lc->qp_y; + } + + set_bytes(s->qp_y_tab + y_cb * min_cb_width + x_cb, min_cb_width, log2_cb_size - log2_min_cb_size, lc->qp_y & 0xff); + + set_stash2(s->cabac_stash_up + (x0 >> 3), s->cabac_stash_left + (y0 >> 3), log2_cb_size - 3, (lc->ct_depth << 1) | skip_flag); + + return 0; +} + +// Returns: +// < 0 Error +// 0 More data wanted +// 1 EoSlice / EoPicture +static int hls_coding_quadtree(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, const int x0, const int y0, + const int log2_cb_size, const unsigned int cb_depth) +{ + const int cb_size = 1 << log2_cb_size; + int ret; + int split_cu; + + lc->ct_depth = cb_depth; + split_cu = (log2_cb_size > s->ps.sps->log2_min_cb_size); + if (x0 + cb_size <= s->ps.sps->width && + y0 + cb_size <= s->ps.sps->height && + split_cu) + { + split_cu = ff_hevc_rpi_split_coding_unit_flag_decode(s, lc, cb_depth, x0, y0); + } + + // Qp delta (and offset) need to remain wanted if cb_size < min until + // a coded block is found so we still initial state at depth 0 (outside + // this fn) and only reset here + if (s->ps.pps->cu_qp_delta_enabled_flag && + log2_cb_size >= s->ps.pps->log2_min_cu_qp_delta_size) + { + lc->tu.is_cu_qp_delta_wanted = 1; + lc->tu.cu_qp_delta = 0; + } + if (s->sh.cu_chroma_qp_offset_enabled_flag && + log2_cb_size >= s->ps.pps->log2_min_cu_qp_delta_size) + { + lc->tu.cu_chroma_qp_offset_wanted = 1; + } + + lc->tu.qp_divmod6[0] = s->ps.pps->qp_bd_x[0]; + lc->tu.qp_divmod6[1] = s->ps.pps->qp_bd_x[1] + s->sh.slice_cb_qp_offset; + lc->tu.qp_divmod6[2] = s->ps.pps->qp_bd_x[2] + s->sh.slice_cr_qp_offset; + + if (split_cu) { + int qp_block_mask = (1 << s->ps.pps->log2_min_cu_qp_delta_size) - 1; + const int cb_size_split = cb_size >> 1; + const int x1 = x0 + cb_size_split; + const int y1 = y0 + cb_size_split; + + int more_data = 0; + + more_data = hls_coding_quadtree(s, lc, x0, y0, log2_cb_size - 1, cb_depth + 1); + if (more_data < 0) + return more_data; + + if (more_data && x1 < s->ps.sps->width) { + more_data = hls_coding_quadtree(s, lc, x1, y0, log2_cb_size - 1, cb_depth + 1); + if (more_data < 0) + return more_data; + } + if (more_data && y1 < s->ps.sps->height) { + more_data = hls_coding_quadtree(s, lc, x0, y1, log2_cb_size - 1, cb_depth + 1); + if (more_data < 0) + return more_data; + } + if (more_data && x1 < s->ps.sps->width && + y1 < s->ps.sps->height) { + more_data = hls_coding_quadtree(s, lc, x1, y1, log2_cb_size - 1, cb_depth + 1); + if (more_data < 0) + return more_data; + } + + if(((x0 + (1<qPy_pred = lc->qp_y; + + if (more_data) + return ((x1 + cb_size_split) < s->ps.sps->width || + (y1 + cb_size_split) < s->ps.sps->height); + else + return 0; + } else { + ret = hls_coding_unit(s, lc, x0, y0, log2_cb_size); + if (ret < 0) + return ret; + if ((!((x0 + cb_size) % + (1 << (s->ps.sps->log2_ctb_size))) || + (x0 + cb_size >= s->ps.sps->width)) && + (!((y0 + cb_size) % + (1 << (s->ps.sps->log2_ctb_size))) || + (y0 + cb_size >= s->ps.sps->height))) { + int end_of_slice_flag = ff_hevc_rpi_get_cabac_terminate(&lc->cc); + return !end_of_slice_flag; + } else { + return 1; + } + } + + return 0; // NEVER +} + +static void hls_decode_neighbour(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, + const int x_ctb, const int y_ctb, const int ctb_addr_ts) +{ + const unsigned int ctb_size = 1 << s->ps.sps->log2_ctb_size; + const unsigned int ctb_addr_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts]; + const unsigned int ctb_addr_rs_in_slice = ctb_addr_rs - s->sh.slice_addr; // slice_addr = RS addr of start of slice + const unsigned int ctb_flags = s->ps.pps->ctb_ts_flags[ctb_addr_ts]; + const unsigned int line_w = s->ps.sps->ctb_width; + + s->tab_slice_address[ctb_addr_rs] = s->sh.slice_addr; + + lc->end_of_ctb_x = FFMIN(x_ctb + ctb_size, s->ps.sps->width); + lc->end_of_ctb_y = FFMIN(y_ctb + ctb_size, s->ps.sps->height); + + lc->boundary_flags = 0; + + if ((ctb_flags & CTB_TS_FLAGS_SOTL) != 0) + lc->boundary_flags |= BOUNDARY_LEFT_TILE; + if (x_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - 1]) + lc->boundary_flags |= BOUNDARY_LEFT_SLICE; + if ((ctb_flags & CTB_TS_FLAGS_TOT) != 0) + lc->boundary_flags |= BOUNDARY_UPPER_TILE; + if (y_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - line_w]) + lc->boundary_flags |= BOUNDARY_UPPER_SLICE; + + // Use line width rather than tile width for addr_in_slice test as + // addr_in_slice is in raster units + + lc->ctb_avail = + ((lc->boundary_flags & (BOUNDARY_LEFT_SLICE | BOUNDARY_LEFT_TILE)) == 0 ? AVAIL_L : 0) | + ((lc->boundary_flags & (BOUNDARY_UPPER_SLICE | BOUNDARY_UPPER_TILE)) == 0 ? AVAIL_U : 0) | + ((lc->boundary_flags & (BOUNDARY_LEFT_TILE | BOUNDARY_UPPER_TILE)) == 0 && + (ctb_addr_rs_in_slice > line_w) ? AVAIL_UL : 0) | + ((ctb_flags & (CTB_TS_FLAGS_EOTL | CTB_TS_FLAGS_TOT)) == 0 && + (ctb_addr_rs_in_slice + 1 >= line_w) ? AVAIL_UR : 0); + // Down-left never avail at CTB level +} + + +static void rpi_execute_dblk_cmds(const HEVCRpiContext * const s, HEVCRpiJob * const jb) +{ + int y = ff_hevc_rpi_hls_filter_blk(s, jb->bounds, + (s->ps.pps->ctb_ts_flags[jb->ctu_ts_last] & CTB_TS_FLAGS_EOT) != 0); + + // Signal + if (y > 0) { + // Cast away const as progress is held in s, but this really shouldn't confuse anything + ff_hevc_rpi_progress_signal_recon((HEVCRpiContext *)s, y - 1); + } + + // Job done now + // ? Move outside this fn + job_free(s->jbc, jb); +} + +// I-pred, transform_and_add for all blocks types done here +// All ARM +static void rpi_execute_pred_cmds(const HEVCRpiContext * const s, HEVCRpiJob * const jb) +{ + unsigned int i; + HEVCRpiIntraPredEnv * const iap = &jb->intra; + const HEVCPredCmd *cmd = iap->cmds; + +#if !RPI_WORKER_WAIT_PASS_0 + rpi_sem_wait(&jb->sem); + rpi_cache_flush_execute(jb->rfe); // Invalidate data set up in pass1 +#endif + + for (i = iap->n; i > 0; i--, cmd++) + { + switch (cmd->type) + { + case RPI_PRED_INTRA: + s->hpc.intra_pred(s, cmd->i_pred.mode, cmd->i_pred.x, cmd->i_pred.y, cmd->avail, cmd->size); + break; + case RPI_PRED_INTRA_C: + s->hpc.intra_pred_c(s, cmd->i_pred.mode, cmd->i_pred.x, cmd->i_pred.y, cmd->avail, cmd->size); + break; + case RPI_PRED_ADD_RESIDUAL: + s->hevcdsp.add_residual[cmd->size - 2](cmd->ta.dst, (int16_t *)cmd->ta.buf, cmd->ta.stride); + break; + case RPI_PRED_ADD_DC: + s->hevcdsp.add_residual_dc[cmd->size - 2](cmd->dc.dst, cmd->dc.stride, cmd->dc.dc); + break; + case RPI_PRED_ADD_RESIDUAL_U: + s->hevcdsp.add_residual_u[cmd->size - 2](cmd->ta.dst, (int16_t *)cmd->ta.buf, cmd->ta.stride, cmd->ta.dc); + break; + case RPI_PRED_ADD_RESIDUAL_V: + s->hevcdsp.add_residual_v[cmd->size - 2](cmd->ta.dst, (int16_t *)cmd->ta.buf, cmd->ta.stride, cmd->ta.dc); + break; + case RPI_PRED_ADD_RESIDUAL_C: + s->hevcdsp.add_residual_c[cmd->size - 2](cmd->ta.dst, (int16_t *)cmd->ta.buf, cmd->ta.stride); + break; + case RPI_PRED_ADD_DC_U: + case RPI_PRED_ADD_DC_V: + s->hevcdsp.add_residual_dc_c[cmd->size - 2](cmd->dc.dst, cmd->dc.stride, cmd->dc.dc); + break; + + case RPI_PRED_I_PCM: + pcm_extract(s, cmd->i_pcm.src, cmd->i_pcm.src_len, cmd->i_pcm.x, cmd->i_pcm.y, 1 << cmd->size); + break; + + default: + av_log(s->avctx, AV_LOG_PANIC, "Bad command %d in worker pred Q\n", cmd->type); + abort(); + } + } + + // Mark done + iap->n = 0; +} + + +// Set initial uniform job values & zero ctu_count +static void rpi_begin(const HEVCRpiContext * const s, HEVCRpiJob * const jb, const unsigned int ctu_ts_first) +{ + unsigned int i; + HEVCRpiInterPredEnv *const cipe = &jb->chroma_ip; + HEVCRpiInterPredEnv *const yipe = &jb->luma_ip; + const HEVCRpiSPS * const sps = s->ps.sps; + + const uint16_t pic_width_y = sps->width; + const uint16_t pic_height_y = sps->height; + + const uint16_t pic_width_c = sps->width >> ctx_hshift(s, 1); + const uint16_t pic_height_c = sps->height >> ctx_vshift(s, 1); + + // We expect the pointer to change if we use another sps + if (sps != jb->sps) + { + worker_pic_free_one(jb); + + set_ipe_from_ici(cipe, &ipe_init_infos[s->ps.sps->bit_depth - 8].chroma); + set_ipe_from_ici(yipe, &ipe_init_infos[s->ps.sps->bit_depth - 8].luma); + + { + const int coefs_per_luma = HEVC_MAX_CTB_SIZE * HEVC_RPI_MAX_WIDTH; + const int coefs_per_chroma = (coefs_per_luma * 2) >> (ctx_vshift(s, 1) + ctx_hshift(s, 1)); + worker_pic_alloc_one(jb, coefs_per_luma + coefs_per_chroma); + } + + jb->sps = sps; + } + + jb->waited = 0; + jb->ctu_ts_first = ctu_ts_first; + jb->ctu_ts_last = -1; + + rpi_inter_pred_reset(cipe); + for (i = 0; i < cipe->n; i++) { + HEVCRpiInterPredQ * const cp = cipe->q + i; + qpu_mc_pred_c_s_t * const u = &cp->qpu_mc_base->c.s; + + u->next_src1.x = 0; + u->next_src1.y = 0; + u->next_src1.base = 0; + u->pic_cw = pic_width_c; + u->pic_ch = pic_height_c; + u->stride2 = av_rpi_sand_frame_stride2(s->frame); + u->stride1 = av_rpi_sand_frame_stride1(s->frame); + cp->last_l0 = &u->next_src1; + + u->next_fn = 0; + u->next_src2.x = 0; + u->next_src2.y = 0; + u->next_src2.base = 0; + cp->last_l1 = &u->next_src2; + + cp->qpu_mc_curr = (qpu_mc_pred_cmd_t *)(u + 1); + } + + rpi_inter_pred_reset(yipe); + for (i = 0; i < yipe->n; i++) { + HEVCRpiInterPredQ * const yp = yipe->q + i; + qpu_mc_pred_y_s_t * const y = &yp->qpu_mc_base->y.s; + + y->next_src1.x = 0; + y->next_src1.y = 0; + y->next_src1.base = 0; + y->next_src2.x = 0; + y->next_src2.y = 0; + y->next_src2.base = 0; + y->pic_h = pic_height_y; + y->pic_w = pic_width_y; + y->stride2 = av_rpi_sand_frame_stride2(s->frame); + y->stride1 = av_rpi_sand_frame_stride1(s->frame); + y->next_fn = 0; + yp->last_l0 = &y->next_src1; + yp->last_l1 = &y->next_src2; + + yp->qpu_mc_curr = (qpu_mc_pred_cmd_t *)(y + 1); + } + + jb->last_y8_p = NULL; + jb->last_y8_l1 = NULL; + + for (i = 0; i != FF_ARRAY_ELEMS(jb->progress_req); ++i) { + jb->progress_req[i] = -1; + } + + worker_pic_reset(&jb->coeffs); +} + + +#if !RPI_QPU_EMU_Y || !RPI_QPU_EMU_C +static unsigned int mc_terminate_add_qpu(const HEVCRpiContext * const s, + const vpu_qpu_job_h vqj, + rpi_cache_flush_env_t * const rfe, + HEVCRpiInterPredEnv * const ipe) +{ + unsigned int i; + uint32_t mail[QPU_N_MAX][QPU_MAIL_EL_VALS]; + unsigned int max_block = 0; + + if (!ipe->used) { + return 0; + } + + if (ipe->curr != 0) { + rpi_inter_pred_sync(ipe); + } + + // Add final commands to Q + for(i = 0; i != ipe->n; ++i) { + HEVCRpiInterPredQ * const yp = ipe->q + i; + qpu_mc_src_t *const p0 = yp->last_l0; + qpu_mc_src_t *const p1 = yp->last_l1; + const unsigned int block_size = (char *)yp->qpu_mc_curr - (char *)yp->qpu_mc_base; + + if (block_size > max_block) + max_block = block_size; + + qpu_mc_link_set(yp->qpu_mc_curr, yp->code_exit); + + // Need to set the srcs for L0 & L1 to something that can be (pointlessly) prefetched + p0->x = MC_DUMMY_X; + p0->y = MC_DUMMY_Y; + p0->base = s->qpu_dummy_frame_qpu; + p1->x = MC_DUMMY_X; + p1->y = MC_DUMMY_Y; + p1->base = s->qpu_dummy_frame_qpu; + + yp->last_l0 = NULL; + yp->last_l1 = NULL; + + // Add to mailbox list + mail[i][0] = ipe->gptr.vc + ((uint8_t *)yp->qpu_mc_base - ipe->gptr.arm); + mail[i][1] = yp->code_setup; + } + + // We don't need invalidate here as the uniforms aren't changed by the QPU + // and leaving them in ARM cache avoids (pointless) pre-reads when writing + // new values which seems to give us a small performance advantage + // + // In most cases we will not have a completely packed set of uniforms and as + // we have a 2d invalidate we writeback all uniform Qs to the depth of the + // fullest + rpi_cache_flush_add_gm_blocks(rfe, &ipe->gptr, RPI_CACHE_FLUSH_MODE_WRITEBACK, + (uint8_t *)ipe->q[0].qpu_mc_base - ipe->gptr.arm, max_block, + ipe->n, ipe->max_fill + ipe->min_gap); + vpu_qpu_job_add_qpu(vqj, ipe->n, (uint32_t *)mail); + + return 1; +} +#endif + +#if RPI_QPU_EMU_Y || RPI_QPU_EMU_C +static unsigned int mc_terminate_add_emu(const HEVCRpiContext * const s, + const vpu_qpu_job_h vqj, + rpi_cache_flush_env_t * const rfe, + HEVCRpiInterPredEnv * const ipe) +{ + unsigned int i; + if (!ipe->used) { + return 0; + } + + if (ipe->curr != 0) { + rpi_inter_pred_sync(ipe); + } + + // Add final commands to Q + for(i = 0; i != ipe->n; ++i) { + HEVCRpiInterPredQ * const yp = ipe->q + i; + qpu_mc_src_t *const p0 = yp->last_l0; + qpu_mc_src_t *const p1 = yp->last_l1; + + yp->qpu_mc_curr->data[-1] = yp->code_exit; + + // Need to set the srcs for L0 & L1 to something that can be (pointlessly) prefetched + p0->x = MC_DUMMY_X; + p0->y = MC_DUMMY_Y; + p0->base = s->qpu_dummy_frame_emu; + p1->x = MC_DUMMY_X; + p1->y = MC_DUMMY_Y; + p1->base = s->qpu_dummy_frame_emu; + + yp->last_l0 = NULL; + yp->last_l1 = NULL; + } + + return 1; +} +#endif + + +#if RPI_QPU_EMU_Y +#define mc_terminate_add_y mc_terminate_add_emu +#else +#define mc_terminate_add_y mc_terminate_add_qpu +#endif +#if RPI_QPU_EMU_C +#define mc_terminate_add_c mc_terminate_add_emu +#else +#define mc_terminate_add_c mc_terminate_add_qpu +#endif + + +static void flush_frame(HEVCRpiContext *s,AVFrame *frame) +{ + rpi_cache_buf_t cbuf; + rpi_cache_flush_env_t * rfe = rpi_cache_flush_init(&cbuf); + rpi_cache_flush_add_frame(rfe, frame, RPI_CACHE_FLUSH_MODE_WB_INVALIDATE); + rpi_cache_flush_finish(rfe); +} + +static void job_gen_bounds(const HEVCRpiContext * const s, HEVCRpiJob * const jb) +{ + const unsigned int rs0 = s->ps.pps->ctb_addr_ts_to_rs[jb->ctu_ts_first]; + const unsigned int rs1 = s->ps.pps->ctb_addr_ts_to_rs[jb->ctu_ts_last]; + const unsigned int ctb_width = s->ps.sps->ctb_width; + RpiBlk *const bounds = &jb->bounds; + av_assert1(jb->ctu_ts_first <= jb->ctu_ts_last); + bounds->x = (rs0 % ctb_width) << s->ps.sps->log2_ctb_size; + bounds->y = (rs0 / ctb_width) << s->ps.sps->log2_ctb_size; + bounds->w = ((rs1 - rs0) % ctb_width + 1) << s->ps.sps->log2_ctb_size; + bounds->h = ((rs1 - rs0) / ctb_width + 1) << s->ps.sps->log2_ctb_size; + + bounds->w = FFMIN(bounds->w, s->ps.sps->width - bounds->x); + bounds->h = FFMIN(bounds->h, s->ps.sps->height - bounds->y); +} + +#if RPI_PASSES == 2 +static void worker_core2(HEVCRpiContext * const s, HEVCRpiJob * const jb) +{ + // Perform intra prediction and residual reconstruction + rpi_execute_pred_cmds(s, jb); + + // Perform deblocking for CTBs in this row + rpi_execute_dblk_cmds(s, jb); +} +#endif + +// Core execution tasks +static void worker_core(const HEVCRpiContext * const s, HEVCRpiJob * const jb) +{ + int pred_y, pred_c; + vpu_qpu_job_env_t qvbuf; + const vpu_qpu_job_h vqj = vpu_qpu_job_init(&qvbuf); +#if RPI_WORKER_WAIT_PASS_0 + int do_wait; +#endif + + { + const HEVCRpiCoeffsEnv * const cf = &jb->coeffs; + if (cf->s[3].n + cf->s[2].n != 0) + { + const unsigned int csize = sizeof(cf->s[3].buf[0]); + const unsigned int offset32 = ((cf->s[3].buf - cf->s[2].buf) - cf->s[3].n) * csize; + unsigned int n16 = (cf->s[2].n >> 8); + unsigned int n32 = (cf->s[3].n >> 10); +#if RPI_COMPRESS_COEFFS + if (cf->s[2].packed) { + n16 = n16 | (n16<<16); + } else { + const unsigned int npack16 = (cf->s[2].packed_n>>8); + n16 = n16 | (npack16<<16); + } + if (cf->s[3].packed) { + n32 = n32 | (n32<<16); + } else { + const unsigned int npack32 = (cf->s[3].packed_n>>10); + n32 = n32 | (npack32<<16); + } +#endif + vpu_qpu_job_add_vpu(vqj, + vpu_get_fn(s->ps.sps->bit_depth), + vpu_get_constants(), + cf->gptr.vc, + n16, + cf->gptr.vc + offset32, + n32, + 0); + + rpi_cache_flush_add_gm_range(jb->rfe, &cf->gptr, RPI_CACHE_FLUSH_MODE_WB_INVALIDATE, 0, cf->s[2].n * csize); + rpi_cache_flush_add_gm_range(jb->rfe, &cf->gptr, RPI_CACHE_FLUSH_MODE_WB_INVALIDATE, offset32, cf->s[3].n * csize); + } + } + + pred_c = mc_terminate_add_c(s, vqj, jb->rfe, &jb->chroma_ip); + +// We could take a sync here and try to locally overlap QPU processing with ARM +// but testing showed a slightly negative benefit with noticable extra complexity + + pred_y = mc_terminate_add_y(s, vqj, jb->rfe, &jb->luma_ip); + + // Returns 0 if nothing to do, 1 if sync added +#if RPI_WORKER_WAIT_PASS_0 + do_wait = vpu_qpu_job_add_sync_sem(vqj, &jb->sem); +#else + if (vpu_qpu_job_add_sync_sem(vqj, &jb->sem) == 0) + sem_post(&jb->sem); +#endif + + rpi_cache_flush_execute(jb->rfe); + + // Await progress as required + // jb->waited will only be clear if we have already tested the progress values + // (in worker_submit_job) and found we don't have to wait + if (jb->waited) + { + unsigned int i; + for (i = 0; i != FF_ARRAY_ELEMS(jb->progress_req); ++i) { + if (jb->progress_req[i] >= 0) { + ff_hevc_rpi_progress_wait_recon(s, jb, s->DPB + i, jb->progress_req[i]); + } + } + } + + vpu_qpu_job_finish(vqj); + + // We always work on a rectangular block + if (pred_y || pred_c) + { + rpi_cache_flush_add_frame_block(jb->rfe, s->frame, RPI_CACHE_FLUSH_MODE_INVALIDATE, + jb->bounds.x, jb->bounds.y, jb->bounds.w, jb->bounds.h, + ctx_vshift(s, 1), pred_y, pred_c); + } + + // If we have emulated VPU ops - do it here +#if RPI_QPU_EMU_Y || RPI_QPU_EMU_C + if (av_rpi_is_sand8_frame(s->frame)) + { +#if RPI_QPU_EMU_Y && RPI_QPU_EMU_C + ff_hevc_rpi_shader_c8(s, &jb->luma_ip, &jb->chroma_ip); +#elif RPI_QPU_EMU_Y + ff_hevc_rpi_shader_c8(s, &jb->luma_ip, NULL); +#else + ff_hevc_rpi_shader_c8(s, NULL, &jb->chroma_ip); +#endif + } + else + { +#if RPI_QPU_EMU_Y && RPI_QPU_EMU_C + ff_hevc_rpi_shader_c16(s, &jb->luma_ip, &jb->chroma_ip); +#elif RPI_QPU_EMU_Y + ff_hevc_rpi_shader_c16(s, &jb->luma_ip, NULL); +#else + ff_hevc_rpi_shader_c16(s, NULL, &jb->chroma_ip); +#endif + } +#endif + +#if RPI_WORKER_WAIT_PASS_0 + if (do_wait) + rpi_sem_wait(&jb->sem); + rpi_cache_flush_execute(jb->rfe); +#endif +} + + +static void rpi_free_inter_pred(HEVCRpiInterPredEnv * const ipe) +{ + av_freep(&ipe->q); + gpu_free(&ipe->gptr); +} + +static HEVCRpiJob * job_new(void) +{ + HEVCRpiJob * const jb = av_mallocz(sizeof(HEVCRpiJob)); + + if (jb == NULL) + return NULL; + + sem_init(&jb->sem, 0, 0); + jb->rfe = rpi_cache_flush_init(&jb->flush_buf); + ff_hevc_rpi_progress_init_wait(&jb->progress_wait); + + jb->intra.n = 0; + if ((jb->intra.cmds = av_mallocz(sizeof(HEVCPredCmd) * RPI_MAX_PRED_CMDS)) == NULL) + goto fail1; + + // * Sizeof the union structure might be overkill but at the moment it + // is correct (it certainly isn't going to be too small) + // Set max fill to slack/2 from the end of the Q + // If we exceed this in any Q then we will schedule by size (which should + // mean that we never use that Q again part from syncs) + // * Given how agressive the overflow resonse is we could maybe put the + // threshold even nearer the end, but I don't expect us to ever hit + // it on any real stream anyway. + + if (rpi_inter_pred_alloc(&jb->chroma_ip, + QPU_N_MAX, QPU_N_GRP, + QPU_C_COMMANDS * sizeof(qpu_mc_pred_c_t) + QPU_C_SYNCS * sizeof(uint32_t), + QPU_C_CMD_SLACK_PER_Q * sizeof(qpu_mc_pred_c_t) / 2) != 0) + goto fail2; + if (rpi_inter_pred_alloc(&jb->luma_ip, + QPU_N_MAX, QPU_N_GRP, + QPU_Y_COMMANDS * sizeof(qpu_mc_pred_y_t) + QPU_Y_SYNCS * sizeof(uint32_t), + QPU_Y_CMD_SLACK_PER_Q * sizeof(qpu_mc_pred_y_t) / 2) != 0) + goto fail3; + + return jb; + +fail3: + rpi_free_inter_pred(&jb->luma_ip); +fail2: + av_freep(&jb->intra.cmds); +fail1: + ff_hevc_rpi_progress_kill_wait(&jb->progress_wait); + rpi_cache_flush_finish(jb->rfe); + sem_destroy(&jb->sem); + return NULL; +} + +static void job_delete(HEVCRpiJob * const jb) +{ + worker_pic_free_one(jb); + ff_hevc_rpi_progress_kill_wait(&jb->progress_wait); + rpi_free_inter_pred(&jb->chroma_ip); + rpi_free_inter_pred(&jb->luma_ip); + av_freep(&jb->intra.cmds); + rpi_cache_flush_finish(jb->rfe); // Not really needed - should do nothing + sem_destroy(&jb->sem); + av_free(jb); +} + +static void jbg_delete(HEVCRpiJobGlobal * const jbg) +{ + HEVCRpiJob * jb; + + if (jbg == NULL) + return; + + jb = jbg->free1; + while (jb != NULL) + { + HEVCRpiJob * const jb2 = jb; + jb = jb2->next; + job_delete(jb2); + } + + pthread_mutex_destroy(&jbg->lock); + av_free(jbg); +} + +static HEVCRpiJobGlobal * jbg_new(unsigned int job_count) +{ + HEVCRpiJobGlobal * const jbg = av_mallocz(sizeof(HEVCRpiJobGlobal)); + if (jbg == NULL) + return NULL; + + pthread_mutex_init(&jbg->lock, NULL); + + while (job_count-- != 0) + { + HEVCRpiJob * const jb = job_new(); + if (jb == NULL) + goto fail; + + jb->next = jbg->free1; + jbg->free1 = jb; + } + + return jbg; + +fail: + jbg_delete(jbg); + return NULL; +} + +static void rpi_job_ctl_delete(HEVCRpiJobCtl * const jbc) +{ + HEVCRpiJobGlobal * jbg; + + if (jbc == NULL) + return; + + jbg = jbc->jbg; + + if (jbc->jb1 != NULL) + job_delete(jbc->jb1); + + pthread_mutex_destroy(&jbc->in_lock); + sem_destroy(&jbc->sem_out); + av_free(jbc); + + // Deref the global job context + if (jbg != NULL && atomic_fetch_add(&jbg->ref_count, -1) == 1) + jbg_delete(jbg); +} + +static HEVCRpiJobCtl * rpi_job_ctl_new(HEVCRpiJobGlobal *const jbg) +{ + HEVCRpiJobCtl * const jbc = av_mallocz(sizeof(HEVCRpiJobCtl)); + + if (jbc == NULL) + return NULL; + + jbc->jbg = jbg; + atomic_fetch_add(&jbg->ref_count, 1); + + sem_init(&jbc->sem_out, 0, RPI_MAX_JOBS); + pthread_mutex_init(&jbc->in_lock, NULL); + + if ((jbc->jb1 = job_new()) == NULL) + goto fail; + jbc->jb1->jbc_local = jbc; + + return jbc; + +fail: + rpi_job_ctl_delete(jbc); + return NULL; +} + + + +static av_cold void hevc_init_worker(HEVCRpiContext * const s) +{ +#if RPI_PASSES == 2 + pass_queue_init(s->passq + 1, s, worker_core2, &s->jbc->sem_out, 1); +#elif RPI_PASSES == 3 + pass_queue_init(s->passq + 2, s, rpi_execute_dblk_cmds, &s->jbc->sem_out, 2); + pass_queue_init(s->passq + 1, s, rpi_execute_pred_cmds, &s->passq[2].sem_in, 1); +#else +#error Passes confused +#endif + pass_queue_init(s->passq + 0, s, worker_core, &s->passq[1].sem_in, 0); + + pass_queues_start_all(s); +} + +static av_cold void hevc_exit_worker(HEVCRpiContext *s) +{ + pass_queues_term_all(s); + + pass_queues_kill_all(s); + + rpi_job_ctl_delete(s->jbc); + s->jbc = NULL; +} + + +static int slice_start(const HEVCRpiContext * const s, HEVCRpiLocalContext *const lc) +{ + const int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_segment_addr]; + const int tiles = s->ps.pps->num_tile_rows * s->ps.pps->num_tile_columns; + const unsigned int tile_id = s->ps.pps->tile_id[ctb_addr_ts]; + + // Check for obvious disasters + if (ctb_addr_ts == 0 && s->sh.dependent_slice_segment_flag) { + av_log(s->avctx, AV_LOG_ERROR, "Impossible initial tile.\n"); + return AVERROR_INVALIDDATA; + } + + // If dependant then ctb_addr_ts != 0 from previous check + if (s->sh.dependent_slice_segment_flag) { + int prev_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1]; + if (s->tab_slice_address[prev_rs] != s->sh.slice_addr) { + av_log(s->avctx, AV_LOG_ERROR, "Previous slice segment missing\n"); + return AVERROR_INVALIDDATA; + } + } + + if (!s->ps.pps->entropy_coding_sync_enabled_flag && + tile_id + s->sh.num_entry_point_offsets >= tiles) + { + av_log(s->avctx, AV_LOG_ERROR, "Entry points exceed tiles\n"); + return AVERROR_INVALIDDATA; + } + + // Tiled stuff must start at start of tile if it has multiple entry points + if (!s->ps.pps->entropy_coding_sync_enabled_flag && + s->sh.num_entry_point_offsets != 0 && + ctb_addr_ts != s->ps.pps->tile_pos_ts[tile_id]) + { + av_log(s->avctx, AV_LOG_ERROR, "Multiple tiles in slice; slice start != tile start\n"); + return AVERROR_INVALIDDATA; + } + + ff_hevc_rpi_cabac_init_decoder(lc); + + // Setup any required decode vars + lc->cabac_init_req = !s->sh.dependent_slice_segment_flag; + +// printf("SS: req=%d, sol=%d, sot=%d\n", lc->cabac_init_req, sol, sot); + lc->qp_y = s->sh.slice_qp; + + // General setup + lc->bt_line_no = 0; + lc->ts = ctb_addr_ts; + return 0; +} + +static int gen_entry_points(HEVCRpiContext * const s, const H2645NAL * const nal) +{ + const GetBitContext * const gb = &s->HEVClc->gb; + RpiSliceHeader * const sh = &s->sh; + int i, j; + + const unsigned int length = nal->size; + unsigned int offset = ((gb->index) >> 3) + 1; // We have a bit & align still to come = +1 byte + unsigned int cmpt; + unsigned int startheader; + + if (sh->num_entry_point_offsets == 0) { + s->data = NULL; + return 0; + } + + // offset in slice header includes emulation prevention bytes. + // Unfortunately those have been removed by the time we get here so we + // have to compensate. The nal layer keeps a track of where they were. + for (j = 0, cmpt = 0, startheader = offset + sh->entry_point_offset[0]; j < nal->skipped_bytes; j++) { + if (nal->skipped_bytes_pos[j] >= offset && nal->skipped_bytes_pos[j] < startheader) { + startheader--; + cmpt++; + } + } + + for (i = 1; i < sh->num_entry_point_offsets; i++) { + offset += (sh->entry_point_offset[i - 1] - cmpt); + for (j = 0, cmpt = 0, startheader = offset + sh->entry_point_offset[i]; j < nal->skipped_bytes; j++) { + if (nal->skipped_bytes_pos[j] >= offset && nal->skipped_bytes_pos[j] < startheader) { + startheader--; + cmpt++; + } + } + if (sh->entry_point_offset[i] <= cmpt) { + av_log(s->avctx, AV_LOG_ERROR, "entry point offset <= skipped bytes\n"); + return AVERROR_INVALIDDATA; + } + sh->size[i - 1] = sh->entry_point_offset[i] - cmpt; + sh->offset[i - 1] = offset; + } + + offset += sh->entry_point_offset[sh->num_entry_point_offsets - 1] - cmpt; + if (length < offset) { + av_log(s->avctx, AV_LOG_ERROR, "entry_point_offset table is corrupted\n"); + return AVERROR_INVALIDDATA; + } + sh->size[sh->num_entry_point_offsets - 1] = length - offset; + sh->offset[sh->num_entry_point_offsets - 1] = offset; + + // Remember data start pointer as we won't have nal later + s->data = nal->data; + return 0; +} + + +// Return +// < 0 Error +// 0 OK +// +// jb->ctu_ts_last < 0 Job still filling +// jb->ctu_ts_last >= 0 Job ready + +static int fill_job(HEVCRpiContext * const s, HEVCRpiLocalContext *const lc, unsigned int max_blocks) +{ + const unsigned int log2_ctb_size = s->ps.sps->log2_ctb_size; + const unsigned int ctb_size = (1 << log2_ctb_size); + HEVCRpiJob * const jb = lc->jb0; + int more_data = 1; + unsigned int ctb_addr_ts = lc->ts; + unsigned int ctb_addr_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts]; + unsigned int x_ctb = (ctb_addr_rs % s->ps.sps->ctb_width) << log2_ctb_size; + const unsigned int y_ctb = (ctb_addr_rs / s->ps.sps->ctb_width) << log2_ctb_size; + + lc->unit_done = 0; + + while (more_data && ctb_addr_ts < s->ps.sps->ctb_size) + { + int q_full; + const unsigned int ctb_flags = s->ps.pps->ctb_ts_flags[ctb_addr_ts]; + + hls_decode_neighbour(s, lc, x_ctb, y_ctb, ctb_addr_ts); + + ff_hevc_rpi_cabac_init(s, lc, ctb_flags); + + hls_sao_param(s, lc, x_ctb >> log2_ctb_size, y_ctb >> log2_ctb_size); + + s->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset; + s->deblock[ctb_addr_rs].tc_offset = s->sh.tc_offset; + s->filter_slice_edges[ctb_addr_rs] = s->sh.slice_loop_filter_across_slices_enabled_flag; + + // Zap stashes if navail + if ((lc->ctb_avail & AVAIL_U) == 0) + zap_cabac_stash(s->cabac_stash_up + (x_ctb >> 3), log2_ctb_size - 3); + if ((lc->ctb_avail & AVAIL_L) == 0) + { + memset(lc->ipm_left, INTRA_DC, IPM_TAB_SIZE); + zap_cabac_stash(s->cabac_stash_left + (y_ctb >> 3), log2_ctb_size - 3); + } +#if MVF_STASH_WIDTH > 64 + // Restore left mvf stash at start of tile if not at start of line + if ((ctb_flags & CTB_TS_FLAGS_SOTL) != 0 && x_ctb != 0 && !s->is_irap) + { + unsigned int i; + HEVCRpiMvField * dst = mvf_stash_ptr(s, lc, x_ctb - 1, 0); + const HEVCRpiMvField * src = s->mvf_left + (y_ctb >> LOG2_MIN_PU_SIZE); + for (i = 0; i != ctb_size >> LOG2_MIN_PU_SIZE; ++i) + { + *dst = *src++; + dst += MVF_STASH_WIDTH_PU; + } + } +#endif + + // Set initial tu states + lc->tu.cu_qp_delta = 0; + lc->tu.is_cu_qp_delta_wanted = 0; + lc->tu.cu_chroma_qp_offset_wanted = 0; + + // Decode + more_data = hls_coding_quadtree(s, lc, x_ctb, y_ctb, log2_ctb_size, 0); + + if (ff_hevc_rpi_cabac_overflow(lc)) + { + av_log(s->avctx, AV_LOG_ERROR, "Quadtree bitstream overread\n "); + more_data = AVERROR_INVALIDDATA; + } + + if (more_data < 0) { + s->tab_slice_address[ctb_addr_rs] = TAB_SLICE_ADDR_BROKEN; // Mark slice as broken + return more_data; + } + + if (more_data && ((ctb_flags & CTB_TS_FLAGS_EOT) != 0 || + (s->ps.pps->entropy_coding_sync_enabled_flag && (ctb_flags & CTB_TS_FLAGS_EOTL) != 0))) + { + if (ff_hevc_rpi_get_cabac_terminate(&lc->cc) < 0 || + ff_hevc_rpi_cabac_skip_bytes(&lc->cc, 0) == NULL) + { + av_log(s->avctx, AV_LOG_ERROR, "Error reading terminate el\n "); + return -1; + } + } + + // --- Post CTB processing + + // Stash rpl top/left for deblock that needs to remember such things cross-slice + s->rpl_up[x_ctb >> log2_ctb_size] = s->refPicList; + s->rpl_left[y_ctb >> log2_ctb_size] = s->refPicList; + + if (!s->is_irap) + { + // Copy MVF up to up-left & stash to up + { + const HEVCRpiMvField * src = mvf_stash_ptr(s, lc, x_ctb, ctb_size - 1); + HEVCRpiMvField * dst = s->mvf_up + (x_ctb >> LOG2_MIN_PU_SIZE); + + // printf("Stash: %d,%d, ctb_size=%d, %p->%p\n", x_ctb, y_ctb, ctb_size, src, dst); + + lc->mvf_ul[0] = dst[(ctb_size - 1) >> LOG2_MIN_PU_SIZE]; + memcpy(dst, src, (sizeof(*src)*ctb_size) >> LOG2_MIN_PU_SIZE); + } + // Stash sideways if end of tile line but not end of line (no point) + // ** Could/should do this @ end of fn +#if MVF_STASH_WIDTH > 64 + if ((ctb_flags & (CTB_TS_FLAGS_EOTL | CTB_TS_FLAGS_EOL)) == CTB_TS_FLAGS_EOTL) +#endif + { + unsigned int i; + const HEVCRpiMvField * src = mvf_stash_ptr(s, lc, x_ctb + ctb_size - 1, 0); + HEVCRpiMvField * dst = s->mvf_left + (y_ctb >> LOG2_MIN_PU_SIZE); + for (i = 0; i != ctb_size >> LOG2_MIN_PU_SIZE; ++i) + { + *dst++ = *src; + src += MVF_STASH_WIDTH_PU; + } + } + } + + if ((ctb_flags & CTB_TS_FLAGS_CSAVE) != 0) + ff_hevc_rpi_save_states(s, lc); + + // Report progress so we can use our MVs in other frames + if ((ctb_flags & CTB_TS_FLAGS_EOL) != 0) + ff_hevc_rpi_progress_signal_mv(s, y_ctb + ctb_size - 1); + + // End of line || End of tile line || End of tile + // (EoL covers end of frame for our purposes here) + q_full = ((ctb_flags & CTB_TS_FLAGS_EOTL) != 0); + + // Allocate QPU chunks on fixed size 64 pel boundries rather than + // whatever ctb_size is today. + // * We might quite like to continue to 64 pel vertical too but that + // currently confuses WPP + if (((x_ctb + ctb_size) & 63) == 0 || q_full) + { + int overflow = 0; + if (rpi_inter_pred_next_ctu(&jb->luma_ip) != 0) + overflow = 1; + if (rpi_inter_pred_next_ctu(&jb->chroma_ip) != 0) + overflow = 1; + if (overflow) + { + // * This is very annoying (and slow) to cope with in WPP so + // we treat it as an error there (no known stream triggers this + // with the current buffer sizes). Non-wpp should cope fine. + av_log(s->avctx, AV_LOG_WARNING, "%s: Q full before EoL\n", __func__); + q_full = 1; + } + } + + // Inc TS to next. + ctb_addr_ts++; + ctb_addr_rs++; + x_ctb += ctb_size; + + if (q_full) + { + // Do job + // Prep for submission + jb->ctu_ts_last = ctb_addr_ts - 1; // Was pre-inced + job_gen_bounds(s, jb); + break; + } + + // If max_blocks started as 0 then this will never be true + if (--max_blocks == 0) + break; + } + + lc->unit_done = (more_data <= 0); + lc->ts = ctb_addr_ts; + return 0; +} + +static void bt_lc_init(HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, const unsigned int n) +{ + lc->context = s; + lc->jb0 = NULL; + lc->lc_n = n; + lc->bt_terminate = 0; + lc->bt_psem_out = NULL; + sem_init(&lc->bt_sem_in, 0, 0); +} + +#define TRACE_WPP 0 +#if RPI_EXTRA_BIT_THREADS > 0 +static inline unsigned int line_ts_width(const HEVCRpiContext * const s, unsigned int ts) +{ + unsigned int rs = s->ps.pps->ctb_addr_ts_to_rs[ts]; + return s->ps.pps->column_width[s->ps.pps->col_idxX[rs % s->ps.sps->ctb_width]]; +} + +// Move local context parameters from an aux bit thread back to the main +// thread at the end of a slice as processing is going to continue there. +static void movlc(HEVCRpiLocalContext *const dst_lc, HEVCRpiLocalContext *const src_lc, const int is_dep) +{ + if (src_lc == dst_lc) { + return; + } + + // Move the job + // We will still have an active job if the final line terminates early + // Dest should always be null by now + av_assert1(dst_lc->jb0 == NULL); + dst_lc->jb0 = src_lc->jb0; + src_lc->jb0 = NULL; + + // Always need to store where we are in the bitstream + dst_lc->ts = src_lc->ts; + dst_lc->gb = src_lc->gb; + // Cabac init request will be built at start of next slice + + // Need to store context if we might have a dependent seg + if (is_dep) + { + dst_lc->qPy_pred = src_lc->qPy_pred; + memcpy(dst_lc->ipm_left, src_lc->ipm_left, sizeof(src_lc->ipm_left)); + memcpy(dst_lc->cabac_state, src_lc->cabac_state, sizeof(src_lc->cabac_state)); + memcpy(dst_lc->stat_coeff, src_lc->stat_coeff, sizeof(src_lc->stat_coeff)); + } +} + +static inline int wait_bt_sem_in(HEVCRpiLocalContext * const lc) +{ + rpi_sem_wait(&lc->bt_sem_in); + return lc->bt_terminate; +} + +// Do one WPP line +// Will not work correctly over horizontal tile boundries - vertical should be OK +static int rpi_run_one_line(HEVCRpiContext *const s, HEVCRpiLocalContext * const lc, const int is_first) +{ + const int is_tile = lc->bt_is_tile; + const unsigned int tile_id = s->ps.pps->tile_id[lc->ts]; + const unsigned int line = lc->bt_line_no; + const unsigned int line_inc = lc->bt_line_inc; + const int is_last = (line >= lc->bt_last_line); + + const unsigned int ts_eol = lc->ts + (is_tile ? s->ps.pps->tile_size[tile_id] : lc->bt_line_width); + const unsigned int ts_next = + line + line_inc > (unsigned int)s->sh.num_entry_point_offsets ? + INT_MAX : + is_tile ? + s->ps.pps->tile_pos_ts[tile_id + line_inc] : + lc->ts + lc->bt_line_width * line_inc; + // Tile wants line, WPP a few CTUs (must be >= 2 for cabac context to work) + const unsigned int partial_size = is_tile ? line_ts_width(s, lc->ts) : 2; + unsigned int ts_prev; + int loop_n = 0; + int err = 0; + + av_assert1(line <= s->sh.num_entry_point_offsets); + +#if TRACE_WPP + printf("%s[%d]: Start %s: tile=%d, line=%d/%d/%d, ts=%d/%d/%d, width=%d, jb=%p\n", __func__, + lc->lc_n, is_tile ? "Tile" : "WPP", tile_id, + line, lc->bt_last_line, s->sh.num_entry_point_offsets, + lc->ts, ts_eol, ts_next, partial_size, lc->jb0); +#endif + if (line != 0) + { + const uint8_t * const data = s->data + s->sh.offset[line - 1]; + const unsigned int len = s->sh.size[line - 1]; + if ((err = init_get_bits8(&lc->gb, data, len)) < 0) + return err; + + ff_init_cabac_decoder(&lc->cc, data, len); + } + + // We should never be processing a dependent slice here so reset is good + // ?? These probably shouldn't be needed (as they should be set by later + // logic) but do seem to be required + lc->qp_y = s->sh.slice_qp; + + do + { + if (!is_last && loop_n > 1) { +#if TRACE_WPP + printf("%s[%d]: %sPoke %p\n", __func__, lc->lc_n, err == 0 ? "" : "ERR: ", lc->bt_psem_out); +#endif + sem_post(lc->bt_psem_out); + } + // The wait for loop_n == 0 has been done in bit_thread + if (!is_first && loop_n != 0) + { +#if TRACE_WPP + printf("%s[%d]: %sWait %p\n", __func__, lc->lc_n, err == 0 ? "" : "ERR: ", &lc->bt_sem_in); +#endif + if (wait_bt_sem_in(lc) != 0) + return AVERROR_EXIT; + } + +#if TRACE_WPP + { + int n; + sem_getvalue(&lc->bt_sem_in, &n); + printf("%s[%d]: ts=%d, sem=%d %p\n", __func__, lc->lc_n, lc->ts, n, &lc->bt_sem_in); + } +#endif + + ts_prev = lc->ts; + + // If we have had an error - do no further decode but do continue + // moving signals around so the other threads continue to operate + // correctly (or at least as correctly as they can with this line missing) + // + // Errors in WPP/Tile are less fatal than normal as we have a good idea + // of how to restart on the next line so there is no need to give up totally + if (err != 0) + { + lc->unit_done = 0; + lc->ts += partial_size; + } + else + { + worker_pass0_ready(s, lc); + + if ((err = fill_job(s, lc, partial_size)) < 0 || + (lc->ts < ts_eol && !is_last && (lc->ts != ts_prev + partial_size || lc->unit_done))) + { + if (err == 0) { + av_log(s->avctx, AV_LOG_ERROR, "Unexpected end of tile/wpp section\n"); + err = AVERROR_INVALIDDATA; + } + worker_free(s, lc); + lc->ts = ts_prev + partial_size; // Pretend we did all that + lc->unit_done = 0; + } + else if (is_tile) + { + worker_submit_job(s, lc); + } + } + + ++loop_n; + } while (lc->ts < ts_eol && !lc->unit_done); + + // If we are on the last line & we didn't get a whole line we must wait for + // and sink the sem_posts from the line above / tile to the left. + while ((ts_prev += partial_size) < ts_eol) + { +#if TRACE_WPP + printf("%s[%d]: EOL Wait: ts=%d %p\n", __func__, lc->lc_n, ts_prev, &lc->bt_sem_in); +#endif + if (wait_bt_sem_in(lc) != 0) + return AVERROR_EXIT; + } + + lc->bt_line_no += line_inc; + + if (!is_tile && err == 0) + worker_submit_job(s, lc); + + if (!is_last) { + lc->ts = ts_next; + +#if TRACE_WPP + printf("%s[%d]: Poke post submit %p\n", __func__, lc->lc_n, lc->bt_psem_out); +#endif + sem_post(lc->bt_psem_out); + if (loop_n > 1) { +#if TRACE_WPP + printf("%s[%d]: Poke post submit2 %p\n", __func__, lc->lc_n, lc->bt_psem_out); +#endif + sem_post(lc->bt_psem_out); + } + } + else + { + movlc(s->HEVClcList[0], lc, s->ps.pps->dependent_slice_segments_enabled_flag); // * & not EoT +#if MVF_STASH_WIDTH > 64 + // Horrid calculations to work out what we want but luckily this should almost never execute + // **** Move to movlc + if (!s->is_irap) + { + const unsigned int ctb_flags = s->ps.pps->ctb_ts_flags[lc->ts]; + if ((ctb_flags & CTB_TS_FLAGS_EOTL) == 0) // If EOTL then we have already stashed mvf + { + const unsigned int x_ctb = ((s->ps.pps->ctb_addr_ts_to_rs[lc->ts] % s->ps.sps->ctb_width) << s->ps.sps->log2_ctb_size) - 1; + unsigned int i; + const HEVCRpiMvField *s_mvf = lc->mvf_stash + ((x_ctb >> LOG2_MIN_PU_SIZE) & (MVF_STASH_WIDTH_PU - 1)); + HEVCRpiMvField *d_mvf = s->HEVClcList[0]->mvf_stash + ((x_ctb >> LOG2_MIN_PU_SIZE) & (MVF_STASH_WIDTH_PU - 1)); + + for (i = 0; i != MVF_STASH_HEIGHT_PU; ++i) + { + *d_mvf = *s_mvf; + d_mvf += MVF_STASH_WIDTH_PU; + s_mvf += MVF_STASH_WIDTH_PU; + } + + } + } +#endif + // When all done poke the thread 0 sem_in one final time +#if TRACE_WPP + printf("%s[%d]: Poke final %p\n", __func__, lc->lc_n, &s->HEVClcList[0]->bt_sem_in); +#endif + sem_post(&s->HEVClcList[0]->bt_sem_in); + } + +#if TRACE_WPP + printf("%s[%d]: End. dep=%d\n", __func__, lc->lc_n, s->ps.pps->dependent_slice_segments_enabled_flag); +#endif + return err; +} + +static void wpp_setup_lcs(HEVCRpiContext * const s) +{ + unsigned int ts = s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_segment_addr]; + const unsigned int line_width = line_ts_width(s, ts); + + for (int i = 0; i <= s->sh.num_entry_point_offsets && i < RPI_BIT_THREADS; ++i) + { + HEVCRpiLocalContext * const lc = s->HEVClcList[i]; + lc->ts = ts; + lc->bt_is_tile = 0; + lc->bt_line_no = i; + lc->bt_line_width = line_width; + lc->bt_last_line = s->sh.num_entry_point_offsets; + lc->bt_line_inc = RPI_BIT_THREADS; + ts += line_width; + } +} + + +// Can only process tile single row at once +static void tile_one_row_setup_lcs(HEVCRpiContext * const s, unsigned int slice_row) +{ + const HEVCRpiPPS * const pps = s->ps.pps; + const unsigned int ts0 = pps->ctb_addr_rs_to_ts[s->sh.slice_segment_addr]; + const unsigned int tile0 = pps->tile_id[ts0]; + const unsigned int col0 = tile0 % pps->num_tile_columns; + + const unsigned int col = (slice_row == 0) ? col0 : 0; + unsigned int line = slice_row * pps->num_tile_columns - col0 + col; + const unsigned int last_line = FFMIN( + line + pps->num_tile_columns - 1 - col, s->sh.num_entry_point_offsets); + + const unsigned int par = + FFMIN(RPI_BIT_THREADS, last_line + 1 - line); +#if TRACE_WPP + printf("ts0=%d, ents=%d, row=%d, tiles=%dx%d, col=%d, par=%d, line=%d/%d\n", ts0, s->sh.num_entry_point_offsets, slice_row, + pps->num_tile_columns, pps->num_tile_rows, col, par, line, last_line); +#endif + for (unsigned int i = 0; i != par; ++i, ++line) + { + HEVCRpiLocalContext * const lc = s->HEVClcList[i]; + const unsigned int tile = tile0 + line; + + lc->ts = pps->tile_pos_ts[tile]; + lc->bt_line_no = line; + lc->bt_is_tile = 1; + lc->bt_line_width = line_ts_width(s, lc->ts); + lc->bt_last_line = last_line; + lc->bt_line_inc = par; + } +} + + +static void * bit_thread(void * v) +{ + HEVCRpiLocalContext * const lc = v; + HEVCRpiContext *const s = lc->context; + + while (wait_bt_sem_in(lc) == 0) + { + int err; + + if ((err = rpi_run_one_line(s, lc, 0)) < 0) { // Never first tile/wpp + if (lc->bt_terminate) { + av_log(s->avctx, AV_LOG_ERROR, "%s: Unexpected termination\n", __func__); + break; + } + av_log(s->avctx, AV_LOG_WARNING, "%s: Decode failure: %d\n", __func__, err); + } + } + + return NULL; +} + +static int bit_threads_start(HEVCRpiContext * const s) +{ + if (s->bt_started) + return 0; + + for (int i = 1; i < RPI_BIT_THREADS; ++i) + { + // lc[0] belongs to the main thread - this sets up lc[1..RPI_BIT_THREADS] + if (s->HEVClcList[i] == NULL) { + if ((s->HEVClcList[i] = av_mallocz(sizeof(*s->HEVClcList[0]))) == NULL) + return -1; + } + + bt_lc_init(s, s->HEVClcList[i], i); + job_lc_init(s->HEVClcList[i]); + } + + // Link the sems in a circle + for (int i = 0; i < RPI_BIT_THREADS - 1; ++i) + s->HEVClcList[i]->bt_psem_out = &s->HEVClcList[i + 1]->bt_sem_in; + s->HEVClcList[RPI_BIT_THREADS - 1]->bt_psem_out = &s->HEVClcList[0]->bt_sem_in; + + // Init all lc before starting any threads + for (int i = 0; i < RPI_EXTRA_BIT_THREADS; ++i) + { + if (pthread_create(s->bit_threads + i, NULL, bit_thread, s->HEVClcList[i + 1]) < 0) + return -1; + } + + s->bt_started = 1; + return 0; +} + +static int bit_threads_kill(HEVCRpiContext * const s) +{ + if (!s->bt_started) + return 0; + s->bt_started = 0; + + for (int i = 0; i < RPI_EXTRA_BIT_THREADS; ++i) + { + HEVCRpiLocalContext *const lc = s->HEVClcList[i + 1]; + if (lc == NULL) + break; + + lc->bt_terminate = 1; + sem_post(&lc->bt_sem_in); + pthread_join(s->bit_threads[i], NULL); + + sem_destroy(&lc->bt_sem_in); + job_lc_kill(lc); + } + return 0; +} +#endif + + +// If we are at EoT and the row is shorter than the number of jobs +// we can Q we have to wait for it finish otherwise we risk cache/QPU +// disasters +static inline int tile_needs_wait(const HEVCRpiContext * const s, const int n) +{ + return + s->ps.pps->tile_wpp_inter_disable >= 2 && + s->sh.slice_type != HEVC_SLICE_I && + n >= 0 && + (s->ps.pps->ctb_ts_flags[n] & (CTB_TS_FLAGS_EOT | CTB_TS_FLAGS_EOL)) == CTB_TS_FLAGS_EOT; +} + +static int rpi_decode_entry(AVCodecContext *avctxt, void *isFilterThread) +{ + HEVCRpiContext * const s = avctxt->priv_data; + HEVCRpiLocalContext * const lc = s->HEVClc; + int err; + + // Start of slice + if ((err = slice_start(s, lc)) != 0) + return err; + +#if RPI_EXTRA_BIT_THREADS > 0 + + if (s->sh.offload_tiles) + { + unsigned int slice_row = 0; + +#if TRACE_WPP + printf("%s: Do Tiles\n", __func__); +#endif + // Generate & start extra bit threads if they aren't already running + bit_threads_start(s); + + do + { + // Reset lc lines etc. + tile_one_row_setup_lcs(s, slice_row); + +#if TRACE_WPP + printf("%s: Row %d: Do 1st: line=%d/%d/%d\n", + __func__, slice_row, lc->bt_line_no, lc->bt_last_line, s->sh.num_entry_point_offsets); +#endif + + rpi_run_one_line(s, lc, 1); // Kicks off the other threads +#if TRACE_WPP + printf("%s: Row %d: Done 1st: line=%d/%d/%d\n", + __func__, slice_row, lc->bt_line_no, lc->bt_last_line, s->sh.num_entry_point_offsets); +#endif + + while (lc->bt_line_no <= lc->bt_last_line) { + rpi_sem_wait(&lc->bt_sem_in); + rpi_run_one_line(s, lc, 0); + } +#if TRACE_WPP + printf("%s: Done body\n", __func__); +#endif + + // Wait for everything else to finish + rpi_sem_wait(&lc->bt_sem_in); + + ++slice_row; + } while (lc->bt_last_line < s->sh.num_entry_point_offsets); + + +#if TRACE_WPP + printf("%s: Done wait: ts=%d\n", __func__, lc->ts); +#endif + } + else if (s->sh.offload_wpp) + { +#if TRACE_WPP + printf("%s: Do WPP\n", __func__); +#endif + // Generate & start extra bit threads if they aren't already running + bit_threads_start(s); + + // Reset lc lines etc. + wpp_setup_lcs(s); + + rpi_run_one_line(s, lc, 1); // Kicks off the other threads +#if TRACE_WPP + printf("%s: Done 1st\n", __func__); +#endif + + while (lc->bt_line_no <= s->sh.num_entry_point_offsets) { + rpi_sem_wait(&lc->bt_sem_in); + rpi_run_one_line(s, lc, 0); + } +#if TRACE_WPP + printf("%s: Done body\n", __func__); +#endif + + // Wait for everything else to finish + rpi_sem_wait(&lc->bt_sem_in); + +#if TRACE_WPP + printf("%s: Done wait: ts=%d\n", __func__, lc->ts); +#endif + } + else +#endif + { +#if TRACE_WPP + printf("%s: Single start: ts=%d\n", __func__, lc->ts); +#endif + // Single bit thread + do { + // Make sure we have space to prepare the next job + worker_pass0_ready(s, lc); + + if ((err = fill_job(s, lc, 0)) < 0) + goto fail; + + worker_submit_job(s, lc); + + if (tile_needs_wait(s, lc->ts - 1)) + worker_wait(s, lc); + + } while (!lc->unit_done); + +#if TRACE_WPP + printf("%s: Single end: ts=%d\n", __func__, lc->ts); +#endif + } + + // If we have reached the end of the frame or + // then wait for the worker to finish all its jobs + if (lc->ts >= s->ps.sps->ctb_size) + worker_wait(s, lc); + +#if RPI_TSTATS + { + HEVCRpiStats *const ts = &s->tstats; + + printf("=== P: xy00:%5d/%5d/%5d/%5d h16gl:%5d/%5d w8gl:%5d/%5d y8m:%d\n B: xy00:%5d/%5d/%5d/%5d h16gl:%5d/%5d\n", + ts->y_pred1_xy, ts->y_pred1_x0, ts->y_pred1_y0, ts->y_pred1_x0y0, + ts->y_pred1_hgt16, ts->y_pred1_hle16, ts->y_pred1_wgt8, ts->y_pred1_wle8, ts->y_pred1_y8_merge, + ts->y_pred2_xy, ts->y_pred2_x0, ts->y_pred2_y0, ts->y_pred2_x0y0, + ts->y_pred2_hgt16, ts->y_pred2_hle16); + memset(ts, 0, sizeof(*ts)); + } +#endif + + return lc->ts; + +fail: + // Cleanup + av_log(s->avctx, AV_LOG_ERROR, "%s failed: err=%d\n", __func__, err); + // Free our job & wait for temination + worker_free(s, lc); + worker_wait(s, lc); + return err; +} + + +static void set_no_backward_pred(HEVCRpiContext * const s) +{ + int i, j; + const RefPicList *const refPicList = s->refPicList; + + s->no_backward_pred_flag = 0; + if (s->sh.slice_type != HEVC_SLICE_B || !s->sh.slice_temporal_mvp_enabled_flag) + return; + + for (j = 0; j < 2; j++) { + for (i = 0; i < refPicList[j].nb_refs; i++) { + if (refPicList[j].list[i] > s->poc) { + s->no_backward_pred_flag = 1; + return; + } + } + } +} + +static int hls_slice_data(HEVCRpiContext * const s, const H2645NAL * const nal) +{ + int err; + if ((err = gen_entry_points(s, nal)) < 0) + return err; + + set_no_backward_pred(s); + + return rpi_decode_entry(s->avctx, NULL); +} + +static int set_side_data(HEVCRpiContext *s) +{ + AVFrame *out = s->ref->frame; + + if (s->sei.frame_packing.present && + s->sei.frame_packing.arrangement_type >= 3 && + s->sei.frame_packing.arrangement_type <= 5 && + s->sei.frame_packing.content_interpretation_type > 0 && + s->sei.frame_packing.content_interpretation_type < 3) { + AVStereo3D *stereo = av_stereo3d_create_side_data(out); + if (!stereo) + return AVERROR(ENOMEM); + + switch (s->sei.frame_packing.arrangement_type) { + case 3: + if (s->sei.frame_packing.quincunx_subsampling) + stereo->type = AV_STEREO3D_SIDEBYSIDE_QUINCUNX; + else + stereo->type = AV_STEREO3D_SIDEBYSIDE; + break; + case 4: + stereo->type = AV_STEREO3D_TOPBOTTOM; + break; + case 5: + stereo->type = AV_STEREO3D_FRAMESEQUENCE; + break; + } + + if (s->sei.frame_packing.content_interpretation_type == 2) + stereo->flags = AV_STEREO3D_FLAG_INVERT; + + if (s->sei.frame_packing.arrangement_type == 5) { + if (s->sei.frame_packing.current_frame_is_frame0_flag) + stereo->view = AV_STEREO3D_VIEW_LEFT; + else + stereo->view = AV_STEREO3D_VIEW_RIGHT; + } + } + + if (s->sei.display_orientation.present && + (s->sei.display_orientation.anticlockwise_rotation || + s->sei.display_orientation.hflip || s->sei.display_orientation.vflip)) { + double angle = s->sei.display_orientation.anticlockwise_rotation * 360 / (double) (1 << 16); + AVFrameSideData *rotation = av_frame_new_side_data(out, + AV_FRAME_DATA_DISPLAYMATRIX, + sizeof(int32_t) * 9); + if (!rotation) + return AVERROR(ENOMEM); + + av_display_rotation_set((int32_t *)rotation->data, angle); + av_display_matrix_flip((int32_t *)rotation->data, + s->sei.display_orientation.hflip, + s->sei.display_orientation.vflip); + } + + // Decrement the mastering display flag when IRAP frame has no_rasl_output_flag=1 + // so the side data persists for the entire coded video sequence. + if (s->sei.mastering_display.present > 0 && + IS_IRAP(s) && s->no_rasl_output_flag) { + s->sei.mastering_display.present--; + } + if (s->sei.mastering_display.present) { + // HEVC uses a g,b,r ordering, which we convert to a more natural r,g,b + const int mapping[3] = {2, 0, 1}; + const int chroma_den = 50000; + const int luma_den = 10000; + int i; + AVMasteringDisplayMetadata *metadata = + av_mastering_display_metadata_create_side_data(out); + if (!metadata) + return AVERROR(ENOMEM); + + for (i = 0; i < 3; i++) { + const int j = mapping[i]; + metadata->display_primaries[i][0].num = s->sei.mastering_display.display_primaries[j][0]; + metadata->display_primaries[i][0].den = chroma_den; + metadata->display_primaries[i][1].num = s->sei.mastering_display.display_primaries[j][1]; + metadata->display_primaries[i][1].den = chroma_den; + } + metadata->white_point[0].num = s->sei.mastering_display.white_point[0]; + metadata->white_point[0].den = chroma_den; + metadata->white_point[1].num = s->sei.mastering_display.white_point[1]; + metadata->white_point[1].den = chroma_den; + + metadata->max_luminance.num = s->sei.mastering_display.max_luminance; + metadata->max_luminance.den = luma_den; + metadata->min_luminance.num = s->sei.mastering_display.min_luminance; + metadata->min_luminance.den = luma_den; + metadata->has_luminance = 1; + metadata->has_primaries = 1; + + av_log(s->avctx, AV_LOG_DEBUG, "Mastering Display Metadata:\n"); + av_log(s->avctx, AV_LOG_DEBUG, + "r(%5.4f,%5.4f) g(%5.4f,%5.4f) b(%5.4f %5.4f) wp(%5.4f, %5.4f)\n", + av_q2d(metadata->display_primaries[0][0]), + av_q2d(metadata->display_primaries[0][1]), + av_q2d(metadata->display_primaries[1][0]), + av_q2d(metadata->display_primaries[1][1]), + av_q2d(metadata->display_primaries[2][0]), + av_q2d(metadata->display_primaries[2][1]), + av_q2d(metadata->white_point[0]), av_q2d(metadata->white_point[1])); + av_log(s->avctx, AV_LOG_DEBUG, + "min_luminance=%f, max_luminance=%f\n", + av_q2d(metadata->min_luminance), av_q2d(metadata->max_luminance)); + } + // Decrement the mastering display flag when IRAP frame has no_rasl_output_flag=1 + // so the side data persists for the entire coded video sequence. + if (s->sei.content_light.present > 0 && + IS_IRAP(s) && s->no_rasl_output_flag) { + s->sei.content_light.present--; + } + if (s->sei.content_light.present) { + AVContentLightMetadata *metadata = + av_content_light_metadata_create_side_data(out); + if (!metadata) + return AVERROR(ENOMEM); + metadata->MaxCLL = s->sei.content_light.max_content_light_level; + metadata->MaxFALL = s->sei.content_light.max_pic_average_light_level; + + av_log(s->avctx, AV_LOG_DEBUG, "Content Light Level Metadata:\n"); + av_log(s->avctx, AV_LOG_DEBUG, "MaxCLL=%d, MaxFALL=%d\n", + metadata->MaxCLL, metadata->MaxFALL); + } + + if (s->sei.a53_caption.a53_caption) { + AVFrameSideData* sd = av_frame_new_side_data(out, + AV_FRAME_DATA_A53_CC, + s->sei.a53_caption.a53_caption_size); + if (sd) + memcpy(sd->data, s->sei.a53_caption.a53_caption, s->sei.a53_caption.a53_caption_size); + av_freep(&s->sei.a53_caption.a53_caption); + s->sei.a53_caption.a53_caption_size = 0; + s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS; + } + + if (s->sei.alternative_transfer.present && + av_color_transfer_name(s->sei.alternative_transfer.preferred_transfer_characteristics) && + s->sei.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) { + s->avctx->color_trc = out->color_trc = s->sei.alternative_transfer.preferred_transfer_characteristics; + } + + return 0; +} + +static int hevc_frame_start(HEVCRpiContext * const s) +{ + int ret; + + memset(s->bs_horizontal, 0, s->bs_size * 2); // Does V too + memset(s->is_pcm, 0, s->ps.sps->pcm_width * s->ps.sps->pcm_height); + memset(s->tab_slice_address, -1, s->ps.sps->ctb_size * sizeof(*s->tab_slice_address)); + + // Only need to remember intra for CIP + if (!s->ps.pps->constrained_intra_pred_flag || s->is_irap) + s->is_intra = NULL; + else + { + s->is_intra = s->is_intra_store; + memset(s->is_intra, 0, s->ps.sps->pcm_width * s->ps.sps->pcm_height); + } + + s->is_decoded = 0; + s->first_nal_type = s->nal_unit_type; + + s->no_rasl_output_flag = IS_IDR(s) || IS_BLA(s) || (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos); + + if (s->pkt.nb_nals > s->rpl_tab_size) + { + // In most cases it will be faster to free & realloc as that doesn't + // require (an unwanted) copy + av_freep(&s->rpl_tab); + s->rpl_tab_size = 0; + if ((s->rpl_tab = av_malloc(s->pkt.nb_nals * sizeof(*s->rpl_tab))) == NULL) + goto fail; + s->rpl_tab_size = s->pkt.nb_nals; + } + memset(s->rpl_tab, 0, s->pkt.nb_nals * sizeof(*s->rpl_tab)); + + ret = ff_hevc_rpi_set_new_ref(s, &s->frame, s->poc); + if (ret < 0) + goto fail; + + // Resize rpl_tab to max that we might want + ret = ff_hevc_rpi_frame_rps(s); + if (ret < 0) { + av_log(s->avctx, AV_LOG_ERROR, "Error constructing the frame RPS.\n"); + goto fail; + } + + s->ref->frame->key_frame = IS_IRAP(s); + + ret = set_side_data(s); + if (ret < 0) + goto fail; + + s->frame->pict_type = 3 - s->sh.slice_type; + + if (!IS_IRAP(s)) + ff_hevc_rpi_bump_frame(s); + + av_frame_unref(s->output_frame); + ret = ff_hevc_rpi_output_frame(s, s->output_frame, 0); + if (ret < 0) + goto fail; + + ff_thread_finish_setup(s->avctx); + + return 0; + +fail: + if (s->ref) + ff_hevc_rpi_unref_frame(s, s->ref, ~0); + s->ref = NULL; + return ret; +} + +static inline int is_non_ref_unit_type(const unsigned int nal_unit_type) +{ + // From Table 7-1 + return (nal_unit_type & ~0xe) == 0; // True for 0, 2, 4, 6, 8, 10, 12, 14 +} + +static int decode_nal_unit(HEVCRpiContext *s, const H2645NAL *nal) +{ + GetBitContext * const gb = &s->HEVClc->gb; + int ctb_addr_ts, ret; + + *gb = nal->gb; + s->nal_unit_type = nal->type; + s->temporal_id = nal->temporal_id; + + switch (s->nal_unit_type) { + case HEVC_NAL_VPS: + ret = ff_hevc_rpi_decode_nal_vps(gb, s->avctx, &s->ps); + if (ret < 0) + goto fail; + break; + case HEVC_NAL_SPS: + ret = ff_hevc_rpi_decode_nal_sps(gb, s->avctx, &s->ps, + s->apply_defdispwin); + if (ret < 0) + goto fail; + break; + case HEVC_NAL_PPS: + ret = ff_hevc_rpi_decode_nal_pps(gb, s->avctx, &s->ps); + if (ret < 0) + goto fail; + break; + case HEVC_NAL_SEI_PREFIX: + case HEVC_NAL_SEI_SUFFIX: + ret = ff_hevc_rpi_decode_nal_sei(gb, s->avctx, &s->sei, &s->ps, s->nal_unit_type); + if (ret < 0) + goto fail; + break; + case HEVC_NAL_TRAIL_R: + case HEVC_NAL_TRAIL_N: + case HEVC_NAL_TSA_N: + case HEVC_NAL_TSA_R: + case HEVC_NAL_STSA_N: + case HEVC_NAL_STSA_R: + case HEVC_NAL_BLA_W_LP: + case HEVC_NAL_BLA_W_RADL: + case HEVC_NAL_BLA_N_LP: + case HEVC_NAL_IDR_W_RADL: + case HEVC_NAL_IDR_N_LP: + case HEVC_NAL_CRA_NUT: + case HEVC_NAL_RADL_N: + case HEVC_NAL_RADL_R: + case HEVC_NAL_RASL_N: + case HEVC_NAL_RASL_R: + ret = hls_slice_header(s); + if (ret < 0) + return ret; + + // The definition of _N unit types is "non-reference for other frames + // with the same temporal_id" so they may/will be ref frames for pics + // with a higher temporal_id. + s->used_for_ref = s->ps.sps->max_sub_layers > s->temporal_id + 1 || + !is_non_ref_unit_type(s->nal_unit_type); + s->offload_recon = s->threads_type != 0 && s->used_for_ref; + s->is_irap = IS_IRAP(s); + +#if DEBUG_DECODE_N + { + static int z = 0; + if (IS_IDR(s)) { + z = 1; + } + if (z != 0 && z++ > DEBUG_DECODE_N) { + s->is_decoded = 0; + break; + } + } +#endif + if ( + (s->avctx->skip_frame >= AVDISCARD_NONREF && !s->used_for_ref) || + (s->avctx->skip_frame >= AVDISCARD_BIDIR && s->sh.slice_type == HEVC_SLICE_B) || + (s->avctx->skip_frame >= AVDISCARD_NONINTRA && s->sh.slice_type != HEVC_SLICE_I) || + (s->avctx->skip_frame >= AVDISCARD_NONKEY && !IS_IRAP(s))) + { + s->is_decoded = 0; + break; + } + + if (s->sh.first_slice_in_pic_flag) { + if (s->max_ra == INT_MAX) { + if (s->nal_unit_type == HEVC_NAL_CRA_NUT || IS_BLA(s)) { + s->max_ra = s->poc; + } else { + if (IS_IDR(s)) + s->max_ra = INT_MIN; + } + } + + if ((s->nal_unit_type == HEVC_NAL_RASL_R || s->nal_unit_type == HEVC_NAL_RASL_N) && + s->poc <= s->max_ra) { + s->is_decoded = 0; + break; + } else { + if (s->nal_unit_type == HEVC_NAL_RASL_R && s->poc > s->max_ra) + s->max_ra = INT_MIN; + } + + ret = hevc_frame_start(s); + if (ret < 0) + return ret; + } else if (!s->ref) { + av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n"); + goto fail; + } + + if (s->nal_unit_type != s->first_nal_type) { + av_log(s->avctx, AV_LOG_ERROR, + "Non-matching NAL types of the VCL NALUs: %d %d\n", + s->first_nal_type, s->nal_unit_type); + return AVERROR_INVALIDDATA; + } + + if (!s->sh.dependent_slice_segment_flag && + s->sh.slice_type != HEVC_SLICE_I) { + ret = ff_hevc_rpi_slice_rpl(s); + if (ret < 0) { + av_log(s->avctx, AV_LOG_WARNING, + "Error constructing the reference lists for the current slice.\n"); + goto fail; + } + } + + ctb_addr_ts = hls_slice_data(s, nal); + if (ctb_addr_ts >= s->ps.sps->ctb_size) { + s->is_decoded = 1; + } + + if (ctb_addr_ts < 0) { + ret = ctb_addr_ts; + goto fail; + } + break; + case HEVC_NAL_EOS_NUT: + case HEVC_NAL_EOB_NUT: + s->seq_decode = (s->seq_decode + 1) & 0xff; + s->max_ra = INT_MAX; + break; + case HEVC_NAL_AUD: + case HEVC_NAL_FD_NUT: + break; + default: + av_log(s->avctx, AV_LOG_INFO, + "Skipping NAL unit %d\n", s->nal_unit_type); + } + + return 0; +fail: + if (s->avctx->err_recognition & AV_EF_EXPLODE) + return ret; + return 0; +} + +static int decode_nal_units(HEVCRpiContext *s, const uint8_t *buf, int length) +{ + int i, ret = 0; + int eos_at_start = 1; + + s->ref = NULL; + s->last_eos = s->eos; + s->eos = 0; + + /* split the input packet into NAL units, so we know the upper bound on the + * number of slices in the frame */ + ret = ff_h2645_packet_split(&s->pkt, buf, length, s->avctx, s->is_nalff, + s->nal_length_size, s->avctx->codec_id, 0, 0); + if (ret < 0) { + av_log(s->avctx, AV_LOG_ERROR, + "Error splitting the input into NAL units.\n"); + return ret; + } + + for (i = 0; i < s->pkt.nb_nals; i++) { + if (s->pkt.nals[i].type == HEVC_NAL_EOB_NUT || + s->pkt.nals[i].type == HEVC_NAL_EOS_NUT) { + if (eos_at_start) { + s->last_eos = 1; + } else { + s->eos = 1; + } + } else { + eos_at_start = 0; + } + } + + /* decode the NAL units */ + for (i = 0; i < s->pkt.nb_nals; i++) { + ret = decode_nal_unit(s, &s->pkt.nals[i]); + if (ret < 0) { + av_log(s->avctx, AV_LOG_WARNING, + "Error parsing NAL unit #%d.\n", i); + goto fail; + } + } + +fail: // Also success path + if (s->ref != NULL) { + if (s->used_for_ref && s->threads_type != 0) { + ff_hevc_rpi_progress_signal_all_done(s); + } + else { + // Flush frame to real memory as we expect to be able to pass + // it straight on to mmal + flush_frame(s, s->frame); + } + } + return ret; +} + +static void print_md5(void *log_ctx, int level, uint8_t md5[16]) +{ + int i; + for (i = 0; i < 16; i++) + av_log(log_ctx, level, "%02"PRIx8, md5[i]); +} + +static int verify_md5(HEVCRpiContext *s, AVFrame *frame) +{ + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format); + int pixel_shift; + int i, j; + + if (!desc) + return AVERROR(EINVAL); + + pixel_shift = desc->comp[0].depth > 8; + + av_log(s->avctx, AV_LOG_DEBUG, "Verifying checksum for frame with POC %d: ", + s->poc); + + /* the checksums are LE, so we have to byteswap for >8bpp formats + * on BE arches */ +#if HAVE_BIGENDIAN + if (pixel_shift && !s->checksum_buf) { + av_fast_malloc(&s->checksum_buf, &s->checksum_buf_size, + FFMAX3(frame->linesize[0], frame->linesize[1], + frame->linesize[2])); + if (!s->checksum_buf) + return AVERROR(ENOMEM); + } +#endif + + for (i = 0; frame->data[i]; i++) { + int width = s->avctx->coded_width; + int height = s->avctx->coded_height; + int w = (i == 1 || i == 2) ? (width >> desc->log2_chroma_w) : width; + int h = (i == 1 || i == 2) ? (height >> desc->log2_chroma_h) : height; + uint8_t md5[16]; + + av_md5_init(s->md5_ctx); + for (j = 0; j < h; j++) { + const uint8_t *src = frame->data[i] + j * frame_stride1(frame, 1); +#if HAVE_BIGENDIAN + if (pixel_shift) { + s->bdsp.bswap16_buf((uint16_t *) s->checksum_buf, + (const uint16_t *) src, w); + src = s->checksum_buf; + } +#endif + av_md5_update(s->md5_ctx, src, w << pixel_shift); + } + av_md5_final(s->md5_ctx, md5); + + if (!memcmp(md5, s->sei.picture_hash.md5[i], 16)) { + av_log (s->avctx, AV_LOG_DEBUG, "plane %d - correct ", i); + print_md5(s->avctx, AV_LOG_DEBUG, md5); + av_log (s->avctx, AV_LOG_DEBUG, "; "); + } else { + av_log (s->avctx, AV_LOG_ERROR, "mismatching checksum of plane %d - ", i); + print_md5(s->avctx, AV_LOG_ERROR, md5); + av_log (s->avctx, AV_LOG_ERROR, " != "); + print_md5(s->avctx, AV_LOG_ERROR, s->sei.picture_hash.md5[i]); + av_log (s->avctx, AV_LOG_ERROR, "\n"); + return AVERROR_INVALIDDATA; + } + } + + av_log(s->avctx, AV_LOG_DEBUG, "\n"); + + return 0; +} + +static int all_sps_supported(const HEVCRpiContext * const s) +{ + for (unsigned int i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) { + if (s->ps.sps_list[i] != NULL) + { + const HEVCRpiSPS * const sps = (const HEVCRpiSPS*)s->ps.sps_list[i]->data; + if (!is_sps_supported(sps)) + return 0; + } + } + return 1; +} + +static int hevc_rpi_decode_extradata(HEVCRpiContext *s, uint8_t *buf, int length, int first) +{ + int ret, i; + + ret = ff_hevc_rpi_decode_extradata(buf, length, &s->ps, &s->sei, &s->is_nalff, + &s->nal_length_size, s->avctx->err_recognition, + s->apply_defdispwin, s->avctx); + if (ret < 0) + return ret; + + /* export stream parameters from the first SPS */ + for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) { + if (first && s->ps.sps_list[i]) { + const HEVCRpiSPS *sps = (const HEVCRpiSPS*)s->ps.sps_list[i]->data; + export_stream_params(s->avctx, &s->ps, sps); + break; + } + } + + return 0; +} + +static int hevc_rpi_decode_frame(AVCodecContext *avctx, void *data, int *got_output, + AVPacket *avpkt) +{ + int ret; + int new_extradata_size; + uint8_t *new_extradata; + HEVCRpiContext *s = avctx->priv_data; + + if (!avpkt->size) { + ret = ff_hevc_rpi_output_frame(s, data, 1); + if (ret < 0) + return ret; + + *got_output = ret; + return 0; + } + + new_extradata = av_packet_get_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA, + &new_extradata_size); + if (new_extradata && new_extradata_size > 0) { + ret = hevc_rpi_decode_extradata(s, new_extradata, new_extradata_size, 0); + if (ret < 0) + return ret; + } + + s->ref = NULL; + ret = decode_nal_units(s, avpkt->data, avpkt->size); + if (ret < 0) + return ret; + + /* verify the SEI checksum */ + if (avctx->err_recognition & AV_EF_CRCCHECK && s->is_decoded && + s->sei.picture_hash.is_md5) { + ret = verify_md5(s, s->ref->frame); + if (ret < 0 && avctx->err_recognition & AV_EF_EXPLODE) { + ff_hevc_rpi_unref_frame(s, s->ref, ~0); + return ret; + } + } + s->sei.picture_hash.is_md5 = 0; + + if (s->is_decoded) { + av_log(avctx, AV_LOG_DEBUG, "Decoded frame with POC %d.\n", s->poc); + s->is_decoded = 0; + } + + if (s->output_frame->buf[0]) { + av_frame_move_ref(data, s->output_frame); + *got_output = 1; + } + + return avpkt->size; +} + +static int hevc_ref_frame(HEVCRpiContext *s, HEVCRpiFrame *dst, HEVCRpiFrame *src) +{ + int ret; + + ret = ff_thread_ref_frame(&dst->tf, &src->tf); + if (ret < 0) + return ret; + + if (src->col_mvf_buf != NULL) + { + dst->col_mvf_buf = av_buffer_ref(src->col_mvf_buf); + if (!dst->col_mvf_buf) + goto fail; + } + dst->col_mvf = src->col_mvf; + + dst->poc = src->poc; + dst->flags = src->flags; + dst->sequence = src->sequence; + return 0; + +fail: + ff_hevc_rpi_unref_frame(s, dst, ~0); + return AVERROR(ENOMEM); +} + + +static av_cold int hevc_decode_free(AVCodecContext *avctx) +{ + HEVCRpiContext * const s = avctx->priv_data; + int i; + + pic_arrays_free(s); + + av_freep(&s->md5_ctx); + + av_freep(&s->cabac_save); + +#if RPI_EXTRA_BIT_THREADS + bit_threads_kill(s); +#endif + + hevc_exit_worker(s); + for (i = 0; i != 2; ++i) { + ff_hevc_rpi_progress_kill_state(s->progress_states + i); + } + job_lc_kill(s->HEVClc); + + av_freep(&s->sao_pixel_buffer_h[0]); // [1] & [2] allocated with [0] + av_freep(&s->sao_pixel_buffer_v[0]); + av_frame_free(&s->output_frame); + + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) { + ff_hevc_rpi_unref_frame(s, &s->DPB[i], ~0); + av_frame_free(&s->DPB[i].frame); + } + + for (i = 0; i < FF_ARRAY_ELEMS(s->ps.vps_list); i++) + av_buffer_unref(&s->ps.vps_list[i]); + for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) + av_buffer_unref(&s->ps.sps_list[i]); + for (i = 0; i < FF_ARRAY_ELEMS(s->ps.pps_list); i++) + av_buffer_unref(&s->ps.pps_list[i]); + s->ps.sps = NULL; + s->ps.pps = NULL; + s->ps.vps = NULL; + + // Free separately from sLists as used that way by RPI WPP + for (i = 0; i < MAX_NB_THREADS && s->HEVClcList[i] != NULL; ++i) { + av_freep(s->HEVClcList + i); + } + s->HEVClc = NULL; // Allocated as part of HEVClcList + + ff_h2645_packet_uninit(&s->pkt); + + if (s->qpu_init_ok) + vpu_qpu_term(); + s->qpu_init_ok = 0; + + return 0; +} + + +static av_cold int hevc_init_context(AVCodecContext *avctx) +{ + HEVCRpiContext *s = avctx->priv_data; + int i; + + s->avctx = avctx; + + s->HEVClc = av_mallocz(sizeof(HEVCRpiLocalContext)); + if (!s->HEVClc) + goto fail; + s->HEVClcList[0] = s->HEVClc; + + if (vpu_qpu_init() != 0) + goto fail; + s->qpu_init_ok = 1; + +#if RPI_QPU_EMU_Y || RPI_QPU_EMU_C + { + static const uint32_t dframe[1] = {0x80808080}; + s->qpu_dummy_frame_emu = (const uint8_t *)dframe; + } +#endif +#if !RPI_QPU_EMU_Y || !RPI_QPU_EMU_C + s->qpu_dummy_frame_qpu = qpu_dummy(); +#endif + + bt_lc_init(s, s->HEVClc, 0); + job_lc_init(s->HEVClc); + + for (i = 0; i != 2; ++i) { + ff_hevc_rpi_progress_init_state(s->progress_states + i); + } + + if ((s->cabac_save = av_malloc(sizeof(*s->cabac_save))) == NULL) + goto fail; + + if ((s->output_frame = av_frame_alloc()) == NULL) + goto fail; + + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) { + s->DPB[i].frame = av_frame_alloc(); + if (!s->DPB[i].frame) + goto fail; + s->DPB[i].tf.f = s->DPB[i].frame; + s->DPB[i].dpb_no = i; + } + + s->max_ra = INT_MAX; + + if ((s->md5_ctx = av_md5_alloc()) == NULL) + goto fail; + + s->context_initialized = 1; + s->eos = 0; + + ff_hevc_rpi_reset_sei(&s->sei); + + return 0; + +fail: + av_log(s->avctx, AV_LOG_ERROR, "%s: Failed\n", __func__); + hevc_decode_free(avctx); + return AVERROR(ENOMEM); +} + +#if HAVE_THREADS +static int hevc_update_thread_context(AVCodecContext *dst, + const AVCodecContext *src) +{ + HEVCRpiContext *s = dst->priv_data; + HEVCRpiContext *s0 = src->priv_data; + int i, ret; + + av_assert0(s->context_initialized); + + // dst == src can happen according to the comments and in that case + // there is nothing to do here + if (dst == src) + return 0; + + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) { + ff_hevc_rpi_unref_frame(s, &s->DPB[i], ~0); + if (s0->DPB[i].frame->buf[0]) { + ret = hevc_ref_frame(s, &s->DPB[i], &s0->DPB[i]); + if (ret < 0) + return ret; + } + } + + if (s->ps.sps != s0->ps.sps) + s->ps.sps = NULL; + for (i = 0; i < FF_ARRAY_ELEMS(s->ps.vps_list); i++) { + av_buffer_unref(&s->ps.vps_list[i]); + if (s0->ps.vps_list[i]) { + s->ps.vps_list[i] = av_buffer_ref(s0->ps.vps_list[i]); + if (!s->ps.vps_list[i]) + return AVERROR(ENOMEM); + } + } + + for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) { + av_buffer_unref(&s->ps.sps_list[i]); + if (s0->ps.sps_list[i]) { + s->ps.sps_list[i] = av_buffer_ref(s0->ps.sps_list[i]); + if (!s->ps.sps_list[i]) + return AVERROR(ENOMEM); + } + } + + for (i = 0; i < FF_ARRAY_ELEMS(s->ps.pps_list); i++) { + av_buffer_unref(&s->ps.pps_list[i]); + if (s0->ps.pps_list[i]) { + s->ps.pps_list[i] = av_buffer_ref(s0->ps.pps_list[i]); + if (!s->ps.pps_list[i]) + return AVERROR(ENOMEM); + } + } + + if (s->ps.sps != s0->ps.sps) + if ((ret = set_sps(s, s0->ps.sps, src->pix_fmt)) < 0) + return ret; + + s->seq_decode = s0->seq_decode; + s->seq_output = s0->seq_output; + s->pocTid0 = s0->pocTid0; + s->max_ra = s0->max_ra; + s->eos = s0->eos; + s->no_rasl_output_flag = s0->no_rasl_output_flag; + + s->is_nalff = s0->is_nalff; + s->nal_length_size = s0->nal_length_size; + + s->threads_type = s0->threads_type; + + if (s0->eos) { + s->seq_decode = (s->seq_decode + 1) & 0xff; + s->max_ra = INT_MAX; + } + + s->sei.frame_packing = s0->sei.frame_packing; + s->sei.display_orientation = s0->sei.display_orientation; + s->sei.mastering_display = s0->sei.mastering_display; + s->sei.content_light = s0->sei.content_light; + s->sei.alternative_transfer = s0->sei.alternative_transfer; + + // * We do this here as it allows us to easily locate our parents + // global job pool, but there really should be a less nasty way + if (s->jbc == NULL) + { + av_assert0((s->jbc = rpi_job_ctl_new(s0->jbc->jbg)) != NULL); + hevc_init_worker(s); + } + + return 0; +} +#endif + +#include +static int qpu_ok(void) +{ + static int is_pi3 = -1; + if (is_pi3 == -1) + { + struct stat sb; + is_pi3 = (stat("/dev/rpivid-intcmem", &sb) != 0); + } + return is_pi3; +} + +static av_cold int hevc_decode_init(AVCodecContext *avctx) +{ + HEVCRpiContext *s = avctx->priv_data; + int ret; + + if (!qpu_ok()) + return AVERROR_DECODER_NOT_FOUND; + + if ((ret = hevc_init_context(avctx)) < 0) + return ret; + + // If we are a child context then stop now + // Everything after this point is either 1st decode setup or global alloc + // that must not be repeated + // Global info will be copied into children in update_thread_context (we + // can't do it here as we have no way of finding the parent context) + if (avctx->internal->is_copy) + return 0; + + // Job allocation requires VCSM alloc to work so ensure that we have it + // initialised by this point + { + HEVCRpiJobGlobal * const jbg = jbg_new(FFMAX(avctx->thread_count * 3, 5)); + if (jbg == NULL) { + av_log(s->avctx, AV_LOG_ERROR, "%s: Job global init failed\n", __func__); + ret = AVERROR(ENOMEM); + goto fail; + } + + if ((s->jbc = rpi_job_ctl_new(jbg)) == NULL) { + av_log(s->avctx, AV_LOG_ERROR, "%s: Job ctl init failed\n", __func__); + ret = AVERROR(ENOMEM); + goto fail; + } + } + + hevc_init_worker(s); + + s->eos = 1; + + if (avctx->extradata_size > 0 && avctx->extradata) { + if ((ret = hevc_rpi_decode_extradata(s, avctx->extradata, avctx->extradata_size, 1)) < 0) + goto fail; + + if (!all_sps_supported(s)) { + ret = AVERROR_DECODER_NOT_FOUND; + goto fail; + } + } + + if((avctx->active_thread_type & FF_THREAD_FRAME) && avctx->thread_count > 1) + s->threads_type = FF_THREAD_FRAME; + else + s->threads_type = 0; + + return 0; + +fail: + hevc_decode_free(avctx); + return ret; +} + +static void hevc_decode_flush(AVCodecContext *avctx) +{ + HEVCRpiContext *s = avctx->priv_data; + ff_hevc_rpi_flush_dpb(s); + s->max_ra = INT_MAX; + s->eos = 1; +} + +typedef struct hwaccel_rpi3_qpu_env_s { + const AVClass *av_class; + AVZcEnvPtr zc; +} hwaccel_rpi3_qpu_env_t; + +static int hwaccel_alloc_frame(AVCodecContext *s, AVFrame *frame) +{ + hwaccel_rpi3_qpu_env_t * const r3 = s->internal->hwaccel_priv_data; + int rv; + + if (av_rpi_zc_in_use(s)) + { + rv = s->get_buffer2(s, frame, 0); + } + else + { + rv = av_rpi_zc_get_buffer(r3->zc, frame); + if (rv == 0) + rv = av_rpi_zc_resolve_frame(frame, ZC_RESOLVE_ALLOC_VALID); // actually do the alloc + } + + if (rv == 0 && + (rv = ff_attach_decode_data(frame)) < 0) + { + av_frame_unref(frame); + } + + return rv; +} + +static int hwaccel_rpi3_qpu_free(AVCodecContext *avctx) +{ + hwaccel_rpi3_qpu_env_t * const r3 = avctx->internal->hwaccel_priv_data; + av_rpi_zc_int_env_freep(&r3->zc); + return 0; +} + +static int hwaccel_rpi3_qpu_init(AVCodecContext *avctx) +{ + hwaccel_rpi3_qpu_env_t * const r3 = avctx->internal->hwaccel_priv_data; + + if ((r3->zc = av_rpi_zc_int_env_alloc(avctx)) == NULL) + goto fail; + + return 0; + +fail: + av_log(avctx, AV_LOG_ERROR, "Rpi3 QPU init failed\n"); + hwaccel_rpi3_qpu_free(avctx); + return AVERROR(ENOMEM); +} + + +#define OFFSET(x) offsetof(HEVCRpiContext, x) +#define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM) + + +static const AVOption options[] = { + { "apply_defdispwin", "Apply default display window from VUI", OFFSET(apply_defdispwin), + AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, PAR }, + { "strict-displaywin", "stricly apply default display window size", OFFSET(apply_defdispwin), + AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, PAR }, + { NULL }, +}; + +static const AVClass hevc_rpi_decoder_class = { + .class_name = "HEVC RPI decoder", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + +static const enum AVPixelFormat hevc_rpi_pix_fmts[] = { + AV_PIX_FMT_SAND128, + AV_PIX_FMT_SAND64_10, + AV_PIX_FMT_NONE +}; + + +static const AVHWAccel hwaccel_rpi3_qpu = { + .name = "Pi3 QPU Hwaccel", + .alloc_frame = hwaccel_alloc_frame, + .init = hwaccel_rpi3_qpu_init, + .uninit = hwaccel_rpi3_qpu_free, + .priv_data_size = sizeof(hwaccel_rpi3_qpu_env_t), + .caps_internal = HWACCEL_CAP_ASYNC_SAFE | HWACCEL_CAP_MT_SAFE, +}; + +static const AVCodecHWConfigInternal hevc_rpi_hw_config_sand128 = +{ + .public = { + .pix_fmt = AV_PIX_FMT_SAND128, + .methods = AV_CODEC_HW_CONFIG_METHOD_AD_HOC, + .device_type = AV_HWDEVICE_TYPE_NONE, + }, + .hwaccel = &hwaccel_rpi3_qpu +}; +static const AVCodecHWConfigInternal hevc_rpi_hw_config_sand64_10 = +{ + .public = { + .pix_fmt = AV_PIX_FMT_SAND64_10, + .methods = AV_CODEC_HW_CONFIG_METHOD_AD_HOC, + .device_type = AV_HWDEVICE_TYPE_NONE, + }, + .hwaccel = &hwaccel_rpi3_qpu +}; + + +static const AVCodecHWConfigInternal *hevc_rpi_hw_configs[] = { + &hevc_rpi_hw_config_sand128, + &hevc_rpi_hw_config_sand64_10, + NULL +}; + + +AVCodec ff_hevc_rpi_decoder = { + .name = "hevc_rpi", + .long_name = NULL_IF_CONFIG_SMALL("HEVC (rpi)"), + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_HEVC, + .priv_data_size = sizeof(HEVCRpiContext), + .priv_class = &hevc_rpi_decoder_class, + .init = hevc_decode_init, + .close = hevc_decode_free, + .decode = hevc_rpi_decode_frame, + .flush = hevc_decode_flush, + .update_thread_context = ONLY_IF_THREADS_ENABLED(hevc_update_thread_context), + .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY | + AV_CODEC_CAP_HARDWARE | + AV_CODEC_CAP_AVOID_PROBING | +#if 0 + // Debugging is often easier without threads getting in the way + 0, +#warning H265 threading turned off +#else + // We only have decent optimisation for frame - so only admit to that + AV_CODEC_CAP_FRAME_THREADS, +#endif + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | + FF_CODEC_CAP_EXPORTS_CROPPING | + FF_CODEC_CAP_ALLOCATE_PROGRESS, + .pix_fmts = hevc_rpi_pix_fmts, + .profiles = NULL_IF_CONFIG_SMALL(ff_hevc_profiles), + .hw_configs = hevc_rpi_hw_configs, +// .wrapper_name = "hevc_rpi", +}; + diff --git a/libavcodec/rpi_hevcdec.h b/libavcodec/rpi_hevcdec.h new file mode 100644 index 0000000000..1f94d18673 --- /dev/null +++ b/libavcodec/rpi_hevcdec.h @@ -0,0 +1,1091 @@ +/* + * HEVC video decoder + * + * Copyright (C) 2012 - 2013 Guillaume Martres + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_RPI_HEVCDEC_H +#define AVCODEC_RPI_HEVCDEC_H + +#include "config.h" + +#include + +#include "libavutil/buffer.h" + +#include "avcodec.h" +#include "bswapdsp.h" +#include "cabac.h" +#include "get_bits.h" +#include "rpi_hevcpred.h" +#include "h2645_parse.h" +#include "hevc.h" +#include "rpi_hevc_mv.h" +#include "rpi_hevc_ps.h" +#include "rpi_hevc_sei.h" +#include "rpi_hevcdsp.h" +#include "internal.h" +#include "thread.h" +#include "videodsp.h" + +#if ARCH_ARM +#include "arm/rpi_hevc_misc_neon.h" +#endif + +#define MAX_NB_THREADS 16 +#define SHIFT_CTB_WPP 2 + +//TODO: check if this is really the maximum +#define MAX_TRANSFORM_DEPTH 5 + +#define MAX_TB_SIZE 32 +#define MAX_QP 51 +#define DEFAULT_INTRA_TC_OFFSET 2 + +#define HEVC_CONTEXTS 199 + +#define MRG_MAX_NUM_CANDS 5 + +#define HEVC_MAX_CTB_SIZE (1 << HEVC_MAX_LOG2_CTB_SIZE) // 64 + +// Size of DPB array +#define HEVC_DPB_ELS 32 + +#define L0 0 +#define L1 1 + +#define EPEL_EXTRA_BEFORE 1 +#define EPEL_EXTRA_AFTER 2 +#define EPEL_EXTRA 3 +#define QPEL_EXTRA_BEFORE 3 +#define QPEL_EXTRA_AFTER 4 +#define QPEL_EXTRA 7 + +#define EDGE_EMU_BUFFER_STRIDE 80 + +#include +#include "rpi_qpu.h" + +// Max jobs per frame thread. Actual usage will be limited by the size +// of the global job pool +// ?? Limits +#define RPI_MAX_JOBS 8 + +// This is the number of _extra_ bit threads - we will have +// RPI_EXTRA_BIT_THREADS+1 threads actually doing the processing +// +// 0 is legitimate and will disable our WPP processing +//#define RPI_EXTRA_BIT_THREADS 0 +#define RPI_EXTRA_BIT_THREADS 2 + +// Number of separate threads/passes in worker +// 2 and 3 are the currently valid numbers +// At the moment 3 seems fractionally faster +//#define RPI_PASSES 2 +#define RPI_PASSES 3 + +// Print out various usage stats +#define RPI_TSTATS 0 + +// Define RPI_COMPRESS_COEFFS to 1 to send coefficients in compressed form +#define RPI_COMPRESS_COEFFS 1 + +// Wait for VPU/QPU to finish in worker pass 0 +// If 0 then the wait is in pass 1 +// +// One might expect the better place to wait would be in pass 1 however +// testing shows that pass 0 produces overall faster decode. +// Interestingly it is QPU/VPU limited streams that seem to suffer +// from pass 1 waits, CPU limited ones tend to show a very mild gain. +// This define exists so it is easy to test this. +#define RPI_WORKER_WAIT_PASS_0 1 + +// Use ARM emulation of QPU pred +// These are for debug only as the emulation makes only limited +// effort to be fast +#define RPI_QPU_EMU_Y 0 +#define RPI_QPU_EMU_C 0 + +// Max width & height we are prepared to consider +// Sand frame shape calc becomes confused with large frames +// Some buffer alloc also depends on this +#define HEVC_RPI_MAX_WIDTH 2048 +#define HEVC_RPI_MAX_HEIGHT 1088 + + +// Min CTB size is 16 +#define HEVC_RPI_MAX_CTBS ((HEVC_RPI_MAX_WIDTH + 15) / 16) * ((HEVC_RPI_MAX_HEIGHT + 15) / 16) + +/** + * Value of the luma sample at position (x, y) in the 2D array tab. + */ +#define SAMPLE(tab, x, y) ((tab)[(y) * s->sps->width + (x)]) +#define SAMPLE_CTB(tab, x, y) ((tab)[(y) * min_cb_width + (x)]) + +#define IS_IDR(s) ((s)->nal_unit_type == HEVC_NAL_IDR_W_RADL || (s)->nal_unit_type == HEVC_NAL_IDR_N_LP) +#define IS_BLA(s) ((s)->nal_unit_type == HEVC_NAL_BLA_W_RADL || (s)->nal_unit_type == HEVC_NAL_BLA_W_LP || \ + (s)->nal_unit_type == HEVC_NAL_BLA_N_LP) +#define IS_IRAP(s) ((s)->nal_unit_type >= 16 && (s)->nal_unit_type <= 23) + +enum RPSType { + ST_CURR_BEF = 0, + ST_CURR_AFT, + ST_FOLL, + LT_CURR, + LT_FOLL, + NB_RPS_TYPE, +}; + +enum SyntaxElement { + SAO_MERGE_FLAG = 0, + SAO_TYPE_IDX, + SAO_EO_CLASS, + SAO_BAND_POSITION, + SAO_OFFSET_ABS, + SAO_OFFSET_SIGN, + END_OF_SLICE_FLAG, + SPLIT_CODING_UNIT_FLAG, + CU_TRANSQUANT_BYPASS_FLAG, + SKIP_FLAG, + CU_QP_DELTA, + PRED_MODE_FLAG, + PART_MODE, + PCM_FLAG, + PREV_INTRA_LUMA_PRED_FLAG, + MPM_IDX, + REM_INTRA_LUMA_PRED_MODE, + INTRA_CHROMA_PRED_MODE, + MERGE_FLAG, + MERGE_IDX, + INTER_PRED_IDC, + REF_IDX_L0, + REF_IDX_L1, + ABS_MVD_GREATER0_FLAG, + ABS_MVD_GREATER1_FLAG, + ABS_MVD_MINUS2, + MVD_SIGN_FLAG, + MVP_LX_FLAG, + NO_RESIDUAL_DATA_FLAG, + SPLIT_TRANSFORM_FLAG, + CBF_LUMA, + CBF_CB_CR, + TRANSFORM_SKIP_FLAG, + EXPLICIT_RDPCM_FLAG, + EXPLICIT_RDPCM_DIR_FLAG, + LAST_SIGNIFICANT_COEFF_X_PREFIX, + LAST_SIGNIFICANT_COEFF_Y_PREFIX, + LAST_SIGNIFICANT_COEFF_X_SUFFIX, + LAST_SIGNIFICANT_COEFF_Y_SUFFIX, + SIGNIFICANT_COEFF_GROUP_FLAG, + SIGNIFICANT_COEFF_FLAG, + COEFF_ABS_LEVEL_GREATER1_FLAG, + COEFF_ABS_LEVEL_GREATER2_FLAG, + COEFF_ABS_LEVEL_REMAINING, + COEFF_SIGN_FLAG, + LOG2_RES_SCALE_ABS, + RES_SCALE_SIGN_FLAG, + CU_CHROMA_QP_OFFSET_FLAG, + CU_CHROMA_QP_OFFSET_IDX, +}; + +enum PartMode { + PART_2Nx2N = 0, + PART_2NxN = 1, + PART_Nx2N = 2, + PART_NxN = 3, + PART_2NxnU = 4, + PART_2NxnD = 5, + PART_nLx2N = 6, + PART_nRx2N = 7, +}; + +enum PredMode { + MODE_INTER = 0, + MODE_INTRA, + MODE_SKIP, +}; + +enum InterPredIdc { + PRED_L0 = 0, + PRED_L1, + PRED_BI, +}; + +enum PredFlag { + PF_INTRA = 0, + PF_L0, + PF_L1, + PF_BI, +}; + +enum SAOType { + SAO_NOT_APPLIED = 0, + SAO_BAND, + SAO_EDGE, + SAO_APPLIED +}; + +enum SAOEOClass { + SAO_EO_HORIZ = 0, + SAO_EO_VERT, + SAO_EO_135D, + SAO_EO_45D, +}; + +enum ScanType { + SCAN_DIAG = 0, + SCAN_HORIZ, + SCAN_VERT, +}; + +typedef struct RefPicList { + struct HEVCRpiFrame *ref[HEVC_MAX_REFS]; + int list[HEVC_MAX_REFS]; + uint8_t isLongTerm[HEVC_MAX_REFS]; + int nb_refs; +} RefPicList; + +typedef struct RefPicListTab { + RefPicList refPicList[2]; +} RefPicListTab; + +typedef struct RpiCodingUnit { + unsigned int x; // Passed to deblock + unsigned int y; + unsigned int x_split; + unsigned int y_split; + + enum PredMode pred_mode; ///< PredMode + enum PartMode part_mode; ///< PartMode + + // Inferred parameters + uint8_t intra_split_flag; ///< IntraSplitFlag + uint8_t max_trafo_depth; ///< MaxTrafoDepth + uint8_t cu_transquant_bypass_flag; +} RpiCodingUnit; + +typedef struct RpiPredictionUnit { + uint8_t intra_pred_mode[4]; + uint8_t intra_pred_mode_c[4]; + uint8_t chroma_mode_c[4]; + uint8_t merge_flag; +} RpiPredictionUnit; + +typedef struct HEVCRpiTransformUnit { + int8_t cu_qp_delta; + + // Inferred parameters; + uint8_t intra_pred_mode; + uint8_t intra_pred_mode_c; + uint8_t chroma_mode_c; + uint8_t is_cu_qp_delta_wanted; + uint8_t cu_chroma_qp_offset_wanted; + const int8_t * qp_divmod6[3]; +} HEVCRpiTransformUnit; + +typedef struct DBParams { + int8_t beta_offset; // -12 to +12 + int8_t tc_offset; // -12 to +12 +} DBParams; + +#define HEVC_FRAME_FLAG_OUTPUT (1 << 0) +#define HEVC_FRAME_FLAG_SHORT_REF (1 << 1) +#define HEVC_FRAME_FLAG_LONG_REF (1 << 2) +#define HEVC_FRAME_FLAG_BUMPING (1 << 3) + +struct HEVCRpiJob; + +typedef struct HEVCRpiFrame { + AVFrame *frame; + ThreadFrame tf; + ColMvField *col_mvf; + int poc; + struct HEVCRpiFrame *collocated_ref; + + AVBufferRef *col_mvf_buf; + + /** + * A sequence counter, so that old frames are output first + * after a POC reset + */ + uint16_t sequence; + + /** + * A combination of HEVC_FRAME_FLAG_* + */ + uint8_t flags; + + // Entry no in DPB - can be used as a small unique + // frame identifier (within the current thread) + uint8_t dpb_no; +} HEVCRpiFrame; + +typedef struct HEVCRpiLocalContext { + HEVCRpiTransformUnit tu; + + CABACContext cc; + + // Vars that allow us to locate everything from just an lc + struct HEVCRpiContext * context; // ??? make const ??? + unsigned int lc_n; // lc list el no + + // Job wait links + struct HEVCRpiLocalContext * jw_next; + struct HEVCRpiLocalContext * jw_prev; + struct HEVCRpiLocalContext * ljw_next; + struct HEVCRpiLocalContext * ljw_prev; + struct HEVCRpiJob * volatile jw_job; + sem_t jw_sem; + + // ?? Wrap in structure ?? + sem_t bt_sem_in; + sem_t * bt_psem_out; + volatile int bt_terminate; + unsigned int ts; + unsigned int bt_last_line; // Last line in this bit_thread chunk + unsigned int bt_line_no; + unsigned int bt_line_width; + unsigned int bt_line_inc; + + struct HEVCRpiJob * jb0; + char unit_done; // Set once we have dealt with this slice + char bt_is_tile; + char last_progress_good; + char cabac_init_req; + + uint8_t cabac_state[HEVC_CONTEXTS]; + uint8_t stat_coeff[4]; + GetBitContext gb; + + uint8_t ct_depth; + int8_t qp_y; + int8_t curr_qp_y; + int8_t qPy_pred; + +// N.B. Used by asm (neon) - do not change +#define AVAIL_S_UR 0 +#define AVAIL_S_U 1 +#define AVAIL_S_UL 2 +#define AVAIL_S_L 3 +#define AVAIL_S_DL 4 + +#define AVAIL_U (1 << AVAIL_S_U) +#define AVAIL_L (1 << AVAIL_S_L) +#define AVAIL_UL (1 << AVAIL_S_UL) +#define AVAIL_UR (1 << AVAIL_S_UR) +#define AVAIL_DL (1 << AVAIL_S_DL) + +// Intra filters - same number space as avail +#define FILTER_LIGHT 0x40 +#define FILTER_STRONG 0x80 +#define FILTER_EITHER (FILTER_LIGHT | FILTER_STRONG) + + uint8_t ctb_avail; + int end_of_ctb_x; + int end_of_ctb_y; + + RpiCodingUnit cu; + RpiPredictionUnit pu; + +#define BOUNDARY_LEFT_SLICE (1 << 0) +#define BOUNDARY_LEFT_TILE (1 << 1) +#define BOUNDARY_UPPER_SLICE (1 << 2) +#define BOUNDARY_UPPER_TILE (1 << 3) + /* properties of the boundary of the current CTB for the purposes + * of the deblocking filter */ + unsigned int boundary_flags; + +#define IPM_TAB_SIZE (HEVC_MAX_CTB_SIZE >> LOG2_MIN_PU_SIZE) + uint8_t ipm_left[IPM_TAB_SIZE]; + uint8_t ipm_up[IPM_TAB_SIZE]; + +//#define MVF_STASH_WIDTH 128 +#define MVF_STASH_WIDTH 64 +#define MVF_STASH_HEIGHT 64 +#define MVF_STASH_WIDTH_PU (MVF_STASH_WIDTH >> LOG2_MIN_PU_SIZE) +#define MVF_STASH_HEIGHT_PU (MVF_STASH_HEIGHT >> LOG2_MIN_PU_SIZE) + HEVCRpiMvField mvf_ul[1]; + HEVCRpiMvField mvf_stash[MVF_STASH_WIDTH_PU * MVF_STASH_HEIGHT_PU]; + + /* +7 is for subpixel interpolation, *2 for high bit depths */ +// DECLARE_ALIGNED(32, uint8_t, edge_emu_buffer)[(MAX_PB_SIZE + 7) * EDGE_EMU_BUFFER_STRIDE * 2]; + /* The extended size between the new edge emu buffer is abused by SAO */ +// DECLARE_ALIGNED(32, uint8_t, edge_emu_buffer2)[(MAX_PB_SIZE + 7) * EDGE_EMU_BUFFER_STRIDE * 2]; +// DECLARE_ALIGNED(32, int16_t, tmp [MAX_PB_SIZE * MAX_PB_SIZE]); + +} HEVCRpiLocalContext; + +// Each block can have an intra prediction and an add_residual command +// noof-cmds(2) * max-ctu height(64) / min-transform(4) * planes(3) * MAX_WIDTH + +// Sand only has 2 planes (Y/C) +#define RPI_MAX_PRED_CMDS (2*(HEVC_MAX_CTB_SIZE/4)*2*(HEVC_RPI_MAX_WIDTH/4)) + +// Command for intra prediction and transform_add of predictions to coefficients +enum rpi_pred_cmd_e +{ + RPI_PRED_ADD_RESIDUAL, + RPI_PRED_ADD_RESIDUAL_U, // = RPI_PRED_TRANSFORM_ADD + c_idx + RPI_PRED_ADD_RESIDUAL_V, // = RPI_PRED_TRANSFORM_ADD + c_idx + RPI_PRED_ADD_RESIDUAL_C, // Merged U+V + RPI_PRED_ADD_DC, + RPI_PRED_ADD_DC_U, // Both U & V are effectively C + RPI_PRED_ADD_DC_V, + RPI_PRED_INTRA, + RPI_PRED_INTRA_C, + RPI_PRED_I_PCM, + RPI_PRED_CMD_MAX +}; + +typedef struct HEVCPredCmd { + uint8_t type; + uint8_t size; // log2 "size" used by all variants + uint8_t avail; // i_pred - but left here as they pack well + uint8_t dummy; + union { + struct { // TRANSFORM_ADD + uint8_t * dst; + const int16_t * buf; + uint16_t stride; // Should be good enough for all pic fmts we use + int16_t dc; + } ta; + struct { + uint8_t * dst; + uint32_t stride; + int dc; + } dc; + struct { // INTRA + uint16_t x; + uint16_t y; + enum IntraPredMode mode; + } i_pred; + struct { // I_PCM + uint16_t x; + uint16_t y; + const void * src; + uint32_t src_len; + } i_pcm; + }; +} HEVCPredCmd; + +union qpu_mc_pred_cmd_s; +struct qpu_mc_pred_y_p_s; +struct qpu_mc_src_s; + +typedef struct HEVCRpiInterPredQ +{ + union qpu_mc_pred_cmd_u *qpu_mc_base; + union qpu_mc_pred_cmd_u *qpu_mc_curr; + struct qpu_mc_src_s *last_l0; + struct qpu_mc_src_s *last_l1; + unsigned int load; + uint32_t code_setup; + uint32_t code_sync; + uint32_t code_exit; +} HEVCRpiInterPredQ; + +typedef struct HEVCRpiInterPredEnv +{ + HEVCRpiInterPredQ * q; + uint8_t n; // Number of Qs + uint8_t n_grp; // Number of Q in a group + uint8_t curr; // Current Q number (0..n-1) + uint8_t used; // 0 if nothing in any Q, 1 otherwise + uint8_t used_grp; // 0 if nothing in any Q in the current group + unsigned int max_fill; + unsigned int min_gap; + GPU_MEM_PTR_T gptr; +} HEVCRpiInterPredEnv; + +typedef struct HEVCRpiIntraPredEnv { + unsigned int n; // Number of commands + HEVCPredCmd * cmds; +} HEVCRpiIntraPredEnv; + +typedef struct HEVCRpiCoeffEnv { + unsigned int n; +#if RPI_COMPRESS_COEFFS + unsigned int packed; // Equal to 1 if coefficients should be being packed + unsigned int packed_n; // Value of n when packed was set equal to 0 (i.e. the amount that is sent compressed). Only valid if packed==0 +#endif + int16_t * buf; +} HEVCRpiCoeffEnv; + +typedef struct HEVCRpiCoeffsEnv { + HEVCRpiCoeffEnv s[4]; + GPU_MEM_PTR_T gptr; + void * mptr; +} HEVCRpiCoeffsEnv; + +typedef struct HEVCRpiFrameProgressWait { + int req; + struct HEVCRpiFrameProgressWait * next; + sem_t sem; +} HEVCRpiFrameProgressWait; + +typedef struct HEVCRpiFrameProgressState { + struct HEVCRpiFrameProgressWait * first; + struct HEVCRpiFrameProgressWait * last; + pthread_mutex_t lock; +} HEVCRpiFrameProgressState; + +typedef struct RpiBlk +{ + unsigned int x; + unsigned int y; + unsigned int w; + unsigned int h; +} RpiBlk; + +typedef struct HEVCRpiJob { + struct HEVCRpiJob * next; // Free chain + struct HEVCRpiJobCtl * jbc_local; + const HEVCRpiSPS * sps; // sps used to set up this job + + int waited; + int ctu_ts_first; + int ctu_ts_last; + RpiBlk bounds; // Bounding box of job + + struct qpu_mc_pred_y_p_s * last_y8_p; + struct qpu_mc_src_s * last_y8_l1; + rpi_cache_flush_env_t * rfe; + + HEVCRpiInterPredEnv chroma_ip; + HEVCRpiInterPredEnv luma_ip; + int16_t progress_req[HEVC_DPB_ELS]; // index by dpb_no + HEVCRpiIntraPredEnv intra; + HEVCRpiCoeffsEnv coeffs; + HEVCRpiFrameProgressWait progress_wait; + sem_t sem; + rpi_cache_buf_t flush_buf; +} HEVCRpiJob; + +struct HEVCRpiContext; + +typedef void HEVCRpiWorkerFn(const struct HEVCRpiContext * const s, HEVCRpiJob * const jb); + +typedef struct HEVCRpiPassQueue +{ +// int pending; + volatile int terminate; + sem_t sem_in; + sem_t * psem_out; + unsigned int job_n; + struct HEVCRpiContext * context; // Context pointer as we get to pass a single "void * this" to the thread + HEVCRpiWorkerFn * worker; + pthread_t thread; + uint8_t pass_n; // Pass number - debug + uint8_t started; +} HEVCRpiPassQueue; + + +struct HEVCRpiJobGlobal; + +typedef struct HEVCRpiJobCtl +{ + sem_t sem_out; + + HEVCRpiJob * volatile jb1; // The job associated with this frame if unallocated - NULL if allocated + struct HEVCRpiJobGlobal * jbg; + + HEVCRpiLocalContext * lcw_head; + HEVCRpiLocalContext * lcw_tail; + + pthread_mutex_t in_lock; + int offload_in; + + HEVCRpiJob *offloadq[RPI_MAX_JOBS]; +} HEVCRpiJobCtl; + + +typedef struct HEVCRpiJobGlobal +{ + intptr_t ref_count; + pthread_mutex_t lock; + HEVCRpiJob * free1; // Singly linked list of free jobs + HEVCRpiLocalContext * wait_head; // Double linked list of lcs waiting for a job + HEVCRpiLocalContext * wait_good; // Last good tail + HEVCRpiLocalContext * wait_tail; + +} HEVCRpiJobGlobal; + +#define RPI_BIT_THREADS (RPI_EXTRA_BIT_THREADS + 1) + +#if RPI_TSTATS +typedef struct HEVCRpiStats { + int y_pred1_y8_merge; + int y_pred1_xy; + int y_pred1_x0; + int y_pred1_y0; + int y_pred1_x0y0; + int y_pred1_wle8; + int y_pred1_wgt8; + int y_pred1_hle16; + int y_pred1_hgt16; + int y_pred2_xy; + int y_pred2_x0; + int y_pred2_y0; + int y_pred2_x0y0; + int y_pred2_hle16; + int y_pred2_hgt16; +} HEVCRpiStats; +#endif + +typedef struct HEVCRpiCabacState +{ + uint8_t rice[4]; + uint8_t state[HEVC_CONTEXTS]; +} HEVCRpiCabacState; + +#define HEVC_RPI_BS_STRIDE1_PEL_SHIFT 6 // 64 pels +#define HEVC_RPI_BS_STRIDE1_PELS (1U << HEVC_RPI_BS_STRIDE1_PEL_SHIFT) +#define HEVC_RPI_BS_STRIDE1_PEL_MASK (HEVC_RPI_BS_STRIDE1_PELS - 1) +#define HEVC_RPI_BS_ELS_PER_BYTE_SHIFT 2 // 4 els per byte +#define HEVC_RPI_BS_PELS_PER_EL_SHIFT 2 // 4 pels per el +#define HEVC_RPI_BS_PELS_PER_BYTE_SHIFT (HEVC_RPI_BS_PELS_PER_EL_SHIFT + HEVC_RPI_BS_ELS_PER_BYTE_SHIFT) +#define HEVC_RPI_BS_STRIDE1_BYTE_SHIFT (HEVC_RPI_BS_STRIDE1_PEL_SHIFT - HEVC_RPI_BS_PELS_PER_BYTE_SHIFT) +#define HEVC_RPI_BS_STRIDE1_BYTES (1U << HEVC_RPI_BS_STRIDE1_BYTE_SHIFT) +#define HEVC_RPI_BS_Y_SHR 3 // 8 vertical pels per row +#define HEVC_RPI_BS_COL_BYTES_SHR (HEVC_RPI_BS_Y_SHR - HEVC_RPI_BS_STRIDE1_BYTE_SHIFT) + +typedef struct HEVCRpiContext { + const AVClass *c; // needed by private avoptions + AVCodecContext *avctx; + + uint8_t threads_type; + char qpu_init_ok; + + /** 1 if the independent slice segment header was successfully parsed */ + uint8_t slice_initialized; + char used_for_ref; // rpi + char is_irap; + char offload_recon; + uint8_t eos; ///< current packet contains an EOS/EOB NAL + uint8_t last_eos; ///< last packet contains an EOS/EOB NAL + uint8_t no_backward_pred_flag; + uint8_t is_decoded; + uint8_t no_rasl_output_flag; + + + /** + * Sequence counters for decoded and output frames, so that old + * frames are output first after a POC reset + */ + uint16_t seq_decode; + uint16_t seq_output; + + int width; + int height; + + HEVCRpiJobCtl * jbc; + // cabac stash + // b0 skip flag + // b1+ ct_depth + uint8_t * cabac_stash_left; + uint8_t * cabac_stash_up; + + // Function pointers +#if RPI_QPU_EMU_Y || RPI_QPU_EMU_C + const uint8_t * qpu_dummy_frame_emu; +#endif +#if !RPI_QPU_EMU_Y || !RPI_QPU_EMU_C + uint32_t qpu_dummy_frame_qpu; // Not a frame - just a bit of memory +#endif + HEVCRpiQpu qpu; + + HEVCRpiFrameProgressState progress_states[2]; + + HEVCRpiCabacState *cabac_save; + + AVFrame *frame; + AVFrame *output_frame; + uint8_t *sao_pixel_buffer_h[3]; + uint8_t *sao_pixel_buffer_v[3]; + + unsigned int col_mvf_stride; + AVBufferPool *col_mvf_pool; + + RpiSAOParams *sao; + DBParams *deblock; + enum HEVCNALUnitType nal_unit_type; + int temporal_id; ///< temporal_id_plus1 - 1 + HEVCRpiFrame *ref; + int poc; + int pocTid0; + int slice_idx; ///< number of the slice being currently decoded + int max_ra; + + int8_t *qp_y_tab; + + // Deblocking block strength bitmaps + unsigned int bs_stride2; + unsigned int bs_size; + uint8_t *bs_horizontal; + uint8_t *bs_vertical; + uint8_t *bsf_stash_up; + uint8_t *bsf_stash_left; + +#if HEVC_RPI_MAX_CTBS >= 0xffff +#define TAB_SLICE_ADDR_BROKEN ~(uint32_t)0 + uint32_t *tab_slice_address; +#else +#define TAB_SLICE_ADDR_BROKEN ~(uint16_t)0 + uint16_t *tab_slice_address; +#endif + + // Bitfield 1 bit per 8 pels (min pcm size) + uint8_t *is_pcm; + // Bitfield 1 bit per 8 pels (min cb size) + // Only needed for CIP as CIP processing is async to the main thread + uint8_t *is_intra; + + // PU + HEVCRpiMvField *mvf_up; + HEVCRpiMvField *mvf_left; + + const RefPicList **rpl_up; + const RefPicList **rpl_left; + RefPicList * refPicList; + + // CTB-level flags affecting loop filter operation + uint8_t *filter_slice_edges; + + /** used on BE to byteswap the lines for checksumming */ + uint8_t *checksum_buf; + int checksum_buf_size; + + const uint8_t *data; + + H2645Packet pkt; + // type of the first VCL NAL of the current frame + enum HEVCNALUnitType first_nal_type; + + uint8_t context_initialized; + int is_nalff; ///< this flag is != 0 if bitstream is encapsulated + ///< as a format defined in 14496-15 + int apply_defdispwin; + + int nal_length_size; ///< Number of bytes used for nal length (1, 2 or 4) + int nuh_layer_id; + + struct AVMD5 *md5_ctx; + + RefPicListTab * rpl_tab; + unsigned int rpl_tab_size; + + uint8_t *is_intra_store; + + RpiSliceHeader sh; + + HEVCRpiParamSets ps; + + HEVCRpiLocalContext *HEVClc; + HEVCRpiLocalContext *HEVClcList[MAX_NB_THREADS]; + + HEVCRpiFrame DPB[HEVC_DPB_ELS]; + + ///< candidate references for the current frame + RefPicList rps[5]; + + HEVCRpiPredContext hpc; + HEVCDSPContext hevcdsp; + + HEVCSEIContext sei; + + // Put structures that allocate non-trivial storage at the end + // These are mostly used indirectly so position in the structure doesn't matter + HEVCRpiPassQueue passq[RPI_PASSES]; +#if RPI_EXTRA_BIT_THREADS > 0 + int bt_started; + // This simply contains thread descriptors - task setup is held elsewhere + pthread_t bit_threads[RPI_EXTRA_BIT_THREADS]; +#endif +#if RPI_TSTATS + HEVCRpiStats tstats; +#endif +} HEVCRpiContext; + +/** + * Mark all frames in DPB as unused for reference. + */ +void ff_hevc_rpi_clear_refs(HEVCRpiContext *s); + +/** + * Drop all frames currently in DPB. + */ +void ff_hevc_rpi_flush_dpb(HEVCRpiContext *s); + +/** + * Construct the reference picture sets for the current frame. + */ +int ff_hevc_rpi_frame_rps(HEVCRpiContext *s); + +/** + * Construct the reference picture list(s) for the current slice. + */ +int ff_hevc_rpi_slice_rpl(HEVCRpiContext *s); + + +/** + * Get the number of candidate references for the current frame. + */ +int ff_hevc_rpi_frame_nb_refs(HEVCRpiContext *s); + +int ff_hevc_rpi_set_new_ref(HEVCRpiContext *s, AVFrame **frame, int poc); + +/** + * Find next frame in output order and put a reference to it in frame. + * @return 1 if a frame was output, 0 otherwise + */ +int ff_hevc_rpi_output_frame(HEVCRpiContext *s, AVFrame *frame, int flush); + +void ff_hevc_rpi_bump_frame(HEVCRpiContext *s); + +void ff_hevc_rpi_unref_frame(HEVCRpiContext *s, HEVCRpiFrame *frame, int flags); + +unsigned int ff_hevc_rpi_tb_avail_flags( + const HEVCRpiContext * const s, const HEVCRpiLocalContext * const lc, + const unsigned int x, const unsigned int y, const unsigned int w, const unsigned int h); + +void ff_hevc_rpi_luma_mv_merge_mode(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, int x0, int y0, int nPbW, + int nPbH, int log2_cb_size, int part_idx, + int merge_idx, HEVCRpiMvField * const mv); +void ff_hevc_rpi_luma_mv_mvp_mode(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, + const unsigned int x0, const unsigned int y0, + const unsigned int nPbW, const unsigned int nPbH, + const unsigned int avail, + HEVCRpiMvField * const mv, + const unsigned int mvp_lx_flag, const unsigned int LX); +void ff_hevc_rpi_set_qPy(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, int xBase, int yBase); +void ff_hevc_rpi_deblocking_boundary_strengths(const HEVCRpiContext * const s, const HEVCRpiLocalContext * const lc, + const unsigned int x0, const unsigned int y0, + const unsigned int log2_trafo_size, const int is_coded_block); +int ff_hevc_rpi_hls_filter_blk(const HEVCRpiContext * const s, const RpiBlk bounds, const int eot); + +extern const uint8_t ff_hevc_rpi_qpel_extra_before[4]; +extern const uint8_t ff_hevc_rpi_qpel_extra_after[4]; +extern const uint8_t ff_hevc_rpi_qpel_extra[4]; + +int16_t * rpi_alloc_coeff_buf(HEVCRpiJob * const jb, const int buf_no, const int n); + +// arm/hevc_misc_neon.S +// Neon coeff zap fn +#if HAVE_NEON +extern void rpi_zap_coeff_vals_neon(int16_t * dst, unsigned int l2ts_m2); +#endif + +void ff_hevc_rpi_progress_wait_field(const HEVCRpiContext * const s, HEVCRpiJob * const jb, + const HEVCRpiFrame * const ref, const int val, const int field); + +void ff_hevc_rpi_progress_signal_field(HEVCRpiContext * const s, const int val, const int field); + +// All of these expect that s->threads_type == FF_THREAD_FRAME + +static inline void ff_hevc_rpi_progress_wait_mv(const HEVCRpiContext * const s, HEVCRpiJob * const jb, + const HEVCRpiFrame * const ref, const int y) +{ + if (s->threads_type != 0) + ff_hevc_rpi_progress_wait_field(s, jb, ref, y, 1); +} + +static inline void ff_hevc_rpi_progress_signal_mv(HEVCRpiContext * const s, const int y) +{ + if (s->used_for_ref && s->threads_type != 0) + ff_hevc_rpi_progress_signal_field(s, y, 1); +} + +static inline void ff_hevc_rpi_progress_wait_recon(const HEVCRpiContext * const s, HEVCRpiJob * const jb, + const HEVCRpiFrame * const ref, const int y) +{ + ff_hevc_rpi_progress_wait_field(s, jb, ref, y, 0); +} + +static inline void ff_hevc_rpi_progress_signal_recon(HEVCRpiContext * const s, const int y) +{ + if (s->used_for_ref && s->threads_type != 0) + { + ff_hevc_rpi_progress_signal_field(s, y, 0); + } +} + +static inline void ff_hevc_rpi_progress_signal_all_done(HEVCRpiContext * const s) +{ + ff_hevc_rpi_progress_signal_field(s, INT_MAX, 0); + ff_hevc_rpi_progress_signal_field(s, INT_MAX, 1); +} + + +// Set all done - signal nothing (used in missing refs) +// Works for both rpi & non-rpi +static inline void ff_hevc_rpi_progress_set_all_done(HEVCRpiFrame * const ref) +{ + if (ref->tf.progress != NULL) + { + int * const p = (int *)ref->tf.progress->data; + p[0] = INT_MAX; + p[1] = INT_MAX; + } +} + +#define HEVC_RPI_420_ONLY 1 +#define HEVC_RPI_SAND128_ONLY 1 + +static inline unsigned int ctx_hshift(const HEVCRpiContext * const s, const int cidx) +{ +#if HEVC_RPI_420_ONLY + return cidx == 0 ? 0 : 1; +#else + return s->ps.sps->hshift[cidx]; +#endif +} + +static inline unsigned int ctx_vshift(const HEVCRpiContext * const s, const int cidx) +{ +#if HEVC_RPI_420_ONLY + return cidx == 0 ? 0 : 1; +#else + return s->ps.sps->vshift[cidx]; +#endif +} + +static inline int ctx_cfmt(const HEVCRpiContext * const s) +{ +#if HEVC_RPI_420_ONLY + return 1; +#else + return s->ps.sps->chroma_format_idc; +#endif +} + +static inline int frame_stride1(const AVFrame * const frame, const int c_idx) +{ +#if HEVC_RPI_SAND128_ONLY + return 128; +#else + return frame->linesize[c_idx]; +#endif +} + +#if HEVC_RPI_SAND128_ONLY +// Propagate this decision to later zc includes +#define RPI_ZC_SAND128_ONLY 1 +#endif + +#ifndef ff_hevc_rpi_copy_vert +static inline void ff_hevc_rpi_copy_vert(uint8_t *dst, const uint8_t *src, + int pixel_shift, int height, + ptrdiff_t stride_dst, ptrdiff_t stride_src) +{ + int i; + switch (pixel_shift) + { + case 2: + for (i = 0; i < height; i++) { + *(uint32_t *)dst = *(uint32_t *)src; + dst += stride_dst; + src += stride_src; + } + break; + case 1: + for (i = 0; i < height; i++) { + *(uint16_t *)dst = *(uint16_t *)src; + dst += stride_dst; + src += stride_src; + } + break; + default: + for (i = 0; i < height; i++) { + *dst = *src; + dst += stride_dst; + src += stride_src; + } + break; + } +} +#endif + + +#if MVF_STASH_WIDTH == 64 +static inline HEVCRpiMvField* mvf_stash_ptr(const HEVCRpiContext *const s, const HEVCRpiLocalContext * const lc, + const unsigned int x, const unsigned int y) +{ + const unsigned int mask_cs_hi = (~0U << s->ps.sps->log2_ctb_size); + return (HEVCRpiMvField*)(lc->mvf_stash + ((y & ~mask_cs_hi) >> LOG2_MIN_PU_SIZE) * MVF_STASH_WIDTH_PU + ((x & ~mask_cs_hi) >> LOG2_MIN_PU_SIZE)); +} + +static inline HEVCRpiMvField* mvf_ptr(const HEVCRpiContext *const s, const HEVCRpiLocalContext * const lc, + const unsigned int x0, const unsigned int y0, + const unsigned int x, const unsigned int y) +{ + const unsigned int mask_cs_hi = (~0U << s->ps.sps->log2_ctb_size); + const unsigned int x0_ctb = x0 & mask_cs_hi; + const unsigned int y0_ctb = y0 & mask_cs_hi; + + return (HEVCRpiMvField *)((y < y0_ctb) ? + (x < x0_ctb ? lc->mvf_ul : s->mvf_up + (x >> LOG2_MIN_PU_SIZE)) : + (x < x0_ctb ? s->mvf_left + (y >> LOG2_MIN_PU_SIZE) : + lc->mvf_stash + + ((y & ~mask_cs_hi) >> LOG2_MIN_PU_SIZE) * MVF_STASH_WIDTH_PU + + ((x & ~mask_cs_hi) >> LOG2_MIN_PU_SIZE))); +} + +static inline unsigned int mvf_left_stride(const HEVCRpiContext *const s, + const unsigned int x0, + const unsigned int x) +{ + const unsigned int mask_cs_hi = (~0U << s->ps.sps->log2_ctb_size); + const unsigned int x0_ctb = x0 & mask_cs_hi; + return x < x0_ctb ? 1 : MVF_STASH_WIDTH_PU; +} + +#else +static inline HEVCRpiMvField* mvf_stash_ptr(const HEVCRpiContext *const s, const HEVCRpiLocalContext * const lc, + const unsigned int x, const unsigned int y) +{ + const unsigned int mask_cs_hi = (~0U << s->ps.sps->log2_ctb_size); + return (HEVCRpiMvField*)(lc->mvf_stash + ((y & ~mask_cs_hi) >> LOG2_MIN_PU_SIZE) * MVF_STASH_WIDTH_PU + ((x >> LOG2_MIN_PU_SIZE) & (MVF_STASH_WIDTH_PU - 1))); +} + +static inline HEVCRpiMvField* mvf_ptr(const HEVCRpiContext *const s, const HEVCRpiLocalContext * const lc, + const unsigned int x0, const unsigned int y0, + const unsigned int x, const unsigned int y) +{ + const unsigned int mask_cs_hi = (~0U << s->ps.sps->log2_ctb_size); + + const unsigned int x0_ctb = x0 & mask_cs_hi; + const unsigned int y0_ctb = y0 & mask_cs_hi; + + // If not in the same CTB for Y assume up + if (y < y0_ctb) { + // If not in the same CTB for X too assume up-left + return (HEVCRpiMvField *)(x < x0_ctb ? lc->mvf_ul : s->mvf_up + (x >> LOG2_MIN_PU_SIZE)); + } + return mvf_stash_ptr(s, lc, x, y); +} + +static inline unsigned int mvf_left_stride(const HEVCRpiContext *const s, + const unsigned int x0, + const unsigned int x) +{ + return MVF_STASH_WIDTH_PU; +} +#endif + +#endif /* AVCODEC_RPI_HEVCDEC_H */ diff --git a/libavcodec/rpi_hevcdsp.c b/libavcodec/rpi_hevcdsp.c new file mode 100644 index 0000000000..87f3cc9d14 --- /dev/null +++ b/libavcodec/rpi_hevcdsp.c @@ -0,0 +1,450 @@ +/* + * HEVC video decoder + * + * Copyright (C) 2012 - 2013 Guillaume Martres + * Copyright (C) 2013 - 2014 Pierre-Edouard Lepere + * Copyright (C) 2018 John Cox, Ben Avison for Raspberry Pi (Trading) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "rpi_hevcdsp.h" +#include "rpi_hevc_mv.h" + +static const int8_t transform[32][32] = { + { 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 }, + { 90, 90, 88, 85, 82, 78, 73, 67, 61, 54, 46, 38, 31, 22, 13, 4, + -4, -13, -22, -31, -38, -46, -54, -61, -67, -73, -78, -82, -85, -88, -90, -90 }, + { 90, 87, 80, 70, 57, 43, 25, 9, -9, -25, -43, -57, -70, -80, -87, -90, + -90, -87, -80, -70, -57, -43, -25, -9, 9, 25, 43, 57, 70, 80, 87, 90 }, + { 90, 82, 67, 46, 22, -4, -31, -54, -73, -85, -90, -88, -78, -61, -38, -13, + 13, 38, 61, 78, 88, 90, 85, 73, 54, 31, 4, -22, -46, -67, -82, -90 }, + { 89, 75, 50, 18, -18, -50, -75, -89, -89, -75, -50, -18, 18, 50, 75, 89, + 89, 75, 50, 18, -18, -50, -75, -89, -89, -75, -50, -18, 18, 50, 75, 89 }, + { 88, 67, 31, -13, -54, -82, -90, -78, -46, -4, 38, 73, 90, 85, 61, 22, + -22, -61, -85, -90, -73, -38, 4, 46, 78, 90, 82, 54, 13, -31, -67, -88 }, + { 87, 57, 9, -43, -80, -90, -70, -25, 25, 70, 90, 80, 43, -9, -57, -87, + -87, -57, -9, 43, 80, 90, 70, 25, -25, -70, -90, -80, -43, 9, 57, 87 }, + { 85, 46, -13, -67, -90, -73, -22, 38, 82, 88, 54, -4, -61, -90, -78, -31, + 31, 78, 90, 61, 4, -54, -88, -82, -38, 22, 73, 90, 67, 13, -46, -85 }, + { 83, 36, -36, -83, -83, -36, 36, 83, 83, 36, -36, -83, -83, -36, 36, 83, + 83, 36, -36, -83, -83, -36, 36, 83, 83, 36, -36, -83, -83, -36, 36, 83 }, + { 82, 22, -54, -90, -61, 13, 78, 85, 31, -46, -90, -67, 4, 73, 88, 38, + -38, -88, -73, -4, 67, 90, 46, -31, -85, -78, -13, 61, 90, 54, -22, -82 }, + { 80, 9, -70, -87, -25, 57, 90, 43, -43, -90, -57, 25, 87, 70, -9, -80, + -80, -9, 70, 87, 25, -57, -90, -43, 43, 90, 57, -25, -87, -70, 9, 80 }, + { 78, -4, -82, -73, 13, 85, 67, -22, -88, -61, 31, 90, 54, -38, -90, -46, + 46, 90, 38, -54, -90, -31, 61, 88, 22, -67, -85, -13, 73, 82, 4, -78 }, + { 75, -18, -89, -50, 50, 89, 18, -75, -75, 18, 89, 50, -50, -89, -18, 75, + 75, -18, -89, -50, 50, 89, 18, -75, -75, 18, 89, 50, -50, -89, -18, 75 }, + { 73, -31, -90, -22, 78, 67, -38, -90, -13, 82, 61, -46, -88, -4, 85, 54, + -54, -85, 4, 88, 46, -61, -82, 13, 90, 38, -67, -78, 22, 90, 31, -73 }, + { 70, -43, -87, 9, 90, 25, -80, -57, 57, 80, -25, -90, -9, 87, 43, -70, + -70, 43, 87, -9, -90, -25, 80, 57, -57, -80, 25, 90, 9, -87, -43, 70 }, + { 67, -54, -78, 38, 85, -22, -90, 4, 90, 13, -88, -31, 82, 46, -73, -61, + 61, 73, -46, -82, 31, 88, -13, -90, -4, 90, 22, -85, -38, 78, 54, -67 }, + { 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, + 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64 }, + { 61, -73, -46, 82, 31, -88, -13, 90, -4, -90, 22, 85, -38, -78, 54, 67, + -67, -54, 78, 38, -85, -22, 90, 4, -90, 13, 88, -31, -82, 46, 73, -61 }, + { 57, -80, -25, 90, -9, -87, 43, 70, -70, -43, 87, 9, -90, 25, 80, -57, + -57, 80, 25, -90, 9, 87, -43, -70, 70, 43, -87, -9, 90, -25, -80, 57 }, + { 54, -85, -4, 88, -46, -61, 82, 13, -90, 38, 67, -78, -22, 90, -31, -73, + 73, 31, -90, 22, 78, -67, -38, 90, -13, -82, 61, 46, -88, 4, 85, -54 }, + { 50, -89, 18, 75, -75, -18, 89, -50, -50, 89, -18, -75, 75, 18, -89, 50, + 50, -89, 18, 75, -75, -18, 89, -50, -50, 89, -18, -75, 75, 18, -89, 50 }, + { 46, -90, 38, 54, -90, 31, 61, -88, 22, 67, -85, 13, 73, -82, 4, 78, + -78, -4, 82, -73, -13, 85, -67, -22, 88, -61, -31, 90, -54, -38, 90, -46 }, + { 43, -90, 57, 25, -87, 70, 9, -80, 80, -9, -70, 87, -25, -57, 90, -43, + -43, 90, -57, -25, 87, -70, -9, 80, -80, 9, 70, -87, 25, 57, -90, 43 }, + { 38, -88, 73, -4, -67, 90, -46, -31, 85, -78, 13, 61, -90, 54, 22, -82, + 82, -22, -54, 90, -61, -13, 78, -85, 31, 46, -90, 67, 4, -73, 88, -38 }, + { 36, -83, 83, -36, -36, 83, -83, 36, 36, -83, 83, -36, -36, 83, -83, 36, + 36, -83, 83, -36, -36, 83, -83, 36, 36, -83, 83, -36, -36, 83, -83, 36 }, + { 31, -78, 90, -61, 4, 54, -88, 82, -38, -22, 73, -90, 67, -13, -46, 85, + -85, 46, 13, -67, 90, -73, 22, 38, -82, 88, -54, -4, 61, -90, 78, -31 }, + { 25, -70, 90, -80, 43, 9, -57, 87, -87, 57, -9, -43, 80, -90, 70, -25, + -25, 70, -90, 80, -43, -9, 57, -87, 87, -57, 9, 43, -80, 90, -70, 25 }, + { 22, -61, 85, -90, 73, -38, -4, 46, -78, 90, -82, 54, -13, -31, 67, -88, + 88, -67, 31, 13, -54, 82, -90, 78, -46, 4, 38, -73, 90, -85, 61, -22 }, + { 18, -50, 75, -89, 89, -75, 50, -18, -18, 50, -75, 89, -89, 75, -50, 18, + 18, -50, 75, -89, 89, -75, 50, -18, -18, 50, -75, 89, -89, 75, -50, 18 }, + { 13, -38, 61, -78, 88, -90, 85, -73, 54, -31, 4, 22, -46, 67, -82, 90, + -90, 82, -67, 46, -22, -4, 31, -54, 73, -85, 90, -88, 78, -61, 38, -13 }, + { 9, -25, 43, -57, 70, -80, 87, -90, 90, -87, 80, -70, 57, -43, 25, -9, + -9, 25, -43, 57, -70, 80, -87, 90, -90, 87, -80, 70, -57, 43, -25, 9 }, + { 4, -13, 22, -31, 38, -46, 54, -61, 67, -73, 78, -82, 85, -88, 90, -90, + 90, -90, 88, -85, 82, -78, 73, -67, 61, -54, 46, -38, 31, -22, 13, -4 }, +}; + +DECLARE_ALIGNED(16, const int8_t, ff_hevc_rpi_epel_filters[7][4]) = { + { -2, 58, 10, -2}, + { -4, 54, 16, -2}, + { -6, 46, 28, -4}, + { -4, 36, 36, -4}, + { -4, 28, 46, -6}, + { -2, 16, 54, -4}, + { -2, 10, 58, -2}, +}; + +DECLARE_ALIGNED(16, const int8_t, ff_hevc_rpi_qpel_filters[3][16]) = { + { -1, 4,-10, 58, 17, -5, 1, 0, -1, 4,-10, 58, 17, -5, 1, 0}, + { -1, 4,-11, 40, 40,-11, 4, -1, -1, 4,-11, 40, 40,-11, 4, -1}, + { 0, 1, -5, 17, 58,-10, 4, -1, 0, 1, -5, 17, 58,-10, 4, -1} +}; + +#define BIT_DEPTH 8 +#include "rpi_hevcdsp_template.c" +#undef BIT_DEPTH + +#define BIT_DEPTH 9 +#include "rpi_hevcdsp_template.c" +#undef BIT_DEPTH + +#define BIT_DEPTH 10 +#include "rpi_hevcdsp_template.c" +#undef BIT_DEPTH + +#define BIT_DEPTH 12 +#include "rpi_hevcdsp_template.c" +#undef BIT_DEPTH + +static uint32_t hevc_deblocking_boundary_strengths(int pus, int dup, const HEVCRpiMvField *curr, const HEVCRpiMvField *neigh, + const int *curr_rpl0, const int *curr_rpl1, const int *neigh_rpl0, const int *neigh_rpl1, + int in_inc0, int in_inc1) +{ + int shift = 32; + uint32_t bs = 0; + for (; pus > 0; pus--) { + int strength, out; + int curr_refL0 = curr_rpl0[curr->ref_idx[0]]; + int curr_refL1 = curr_rpl1[curr->ref_idx[1]]; + int nr_idx0 = neigh->ref_idx[0]; + int nr_idx1 = neigh->ref_idx[1]; + int neigh_refL0 = neigh_rpl0[nr_idx0]; + int neigh_refL1 = neigh_rpl1[nr_idx1]; + + av_assert0(nr_idx0 >= 0 && nr_idx0 <=31); + av_assert0(nr_idx1 >= 0 && nr_idx1 <=31); + +#if 1 // This more directly matches the original implementation + if (curr->pred_flag == PF_BI && neigh->pred_flag == PF_BI) { + // same L0 and L1 + if (curr_refL0 == neigh_refL0 && + curr_refL0 == curr_refL1 && + neigh_refL0 == neigh_refL1) { + if ((FFABS(MV_X(neigh->xy[0]) - MV_X(curr->xy[0])) >= 4 || FFABS(MV_Y(neigh->xy[0]) - MV_Y(curr->xy[0])) >= 4 || + FFABS(MV_X(neigh->xy[1]) - MV_X(curr->xy[1])) >= 4 || FFABS(MV_Y(neigh->xy[1]) - MV_Y(curr->xy[1])) >= 4) && + (FFABS(MV_X(neigh->xy[1]) - MV_X(curr->xy[0])) >= 4 || FFABS(MV_Y(neigh->xy[1]) - MV_Y(curr->xy[0])) >= 4 || + FFABS(MV_X(neigh->xy[0]) - MV_X(curr->xy[1])) >= 4 || FFABS(MV_Y(neigh->xy[0]) - MV_Y(curr->xy[1])) >= 4)) + strength = 1; + else + strength = 0; + } else if (neigh_refL0 == curr_refL0 && + neigh_refL1 == curr_refL1) { + if (FFABS(MV_X(neigh->xy[0]) - MV_X(curr->xy[0])) >= 4 || FFABS(MV_Y(neigh->xy[0]) - MV_Y(curr->xy[0])) >= 4 || + FFABS(MV_X(neigh->xy[1]) - MV_X(curr->xy[1])) >= 4 || FFABS(MV_Y(neigh->xy[1]) - MV_Y(curr->xy[1])) >= 4) + strength = 1; + else + strength = 0; + } else if (neigh_refL1 == curr_refL0 && + neigh_refL0 == curr_refL1) { + if (FFABS(MV_X(neigh->xy[1]) - MV_X(curr->xy[0])) >= 4 || FFABS(MV_Y(neigh->xy[1]) - MV_Y(curr->xy[0])) >= 4 || + FFABS(MV_X(neigh->xy[0]) - MV_X(curr->xy[1])) >= 4 || FFABS(MV_Y(neigh->xy[0]) - MV_Y(curr->xy[1])) >= 4) + strength = 1; + else + strength = 0; + } else { + strength = 1; + } + } else if ((curr->pred_flag != PF_BI) && (neigh->pred_flag != PF_BI)){ // 1 MV + MvXY curr_mv0, neigh_mv0; + + if (curr->pred_flag & 1) { + curr_mv0 = curr->xy[0]; + } else { + curr_mv0 = curr->xy[1]; + curr_refL0 = curr_refL1; + } + + if (neigh->pred_flag & 1) { + neigh_mv0 = neigh->xy[0]; + } else { + neigh_mv0 = neigh->xy[1]; + neigh_refL0 = neigh_refL1; + } + + if (curr_refL0 == neigh_refL0) { + if (FFABS(MV_X(curr_mv0) - MV_X(neigh_mv0)) >= 4 || FFABS(MV_Y(curr_mv0) - MV_Y(neigh_mv0)) >= 4) + strength = 1; + else + strength = 0; + } else + strength = 1; + } else + strength = 1; +#else // This has exactly the same effect, but is more suitable for vectorisation + MvXY curr_mv[2]; + MvXY neigh_mv[2]; + memcpy(curr_mv, curr->xy, sizeof curr_mv); + memcpy(neigh_mv, neigh->xy, sizeof neigh_mv); + + if (!(curr->pred_flag & 2)) { + curr_mv[1] = curr_mv[0]; + curr_refL1 = curr_refL0; + } + if (!(neigh->pred_flag & 2)) { + neigh_mv[1] = neigh_mv[0]; + neigh_refL1 = neigh_refL0; + } + if (!(curr->pred_flag & 1)) { + curr_mv[0] = curr_mv[1]; + curr_refL0 = curr_refL1; + } + if (!(neigh->pred_flag & 1)) { + neigh_mv[0] = neigh_mv[1]; + neigh_refL0 = neigh_refL1; + } + + strength = 1; + + strength &= (neigh_refL0 != curr_refL0) | (neigh_refL1 != curr_refL1) | + (FFABS(MV_X(neigh_mv[0]) - MV_X(curr_mv[0])) >= 4) | (FFABS(MV_Y(neigh_mv[0]) - MV_Y(curr_mv[0])) >= 4) | + (FFABS(MV_X(neigh_mv[1]) - MV_X(curr_mv[1])) >= 4) | (FFABS(MV_Y(neigh_mv[1]) - MV_Y(curr_mv[1])) >= 4); + + strength &= (neigh_refL1 != curr_refL0) | (neigh_refL0 != curr_refL1) | + (FFABS(MV_X(neigh_mv[1]) - MV_X(curr_mv[0])) >= 4) | (FFABS(MV_Y(neigh_mv[1]) - MV_Y(curr_mv[0])) >= 4) | + (FFABS(MV_X(neigh_mv[0]) - MV_X(curr_mv[1])) >= 4) | (FFABS(MV_Y(neigh_mv[0]) - MV_Y(curr_mv[1])) >= 4); + + strength |= (((curr->pred_flag + 1) ^ (neigh->pred_flag + 1)) >> 2); +#endif + + curr += in_inc0 / sizeof (HEVCRpiMvField); + neigh += in_inc1 / sizeof (HEVCRpiMvField); + + for (out = dup; out > 0; out--) + { + bs = (bs >> 2) | (strength << 30); + shift -= 2; + } + } + return bs >> shift; +} + + +static void cpy_blk(uint8_t *dst, unsigned int stride_dst, const uint8_t *src, unsigned stride_src, unsigned int width, unsigned int height) +{ + unsigned int i, j; + + if (((intptr_t)dst | (intptr_t)src | stride_dst | stride_src) & 15) { + for (i = 0; i < height; i++) { + for (j = 0; j < width; j+=8) + AV_COPY64U(dst+j, src+j); + dst += stride_dst; + src += stride_src; + } + } else { + for (i = 0; i < height; i++) { + for (j = 0; j < width; j+=16) + AV_COPY128(dst+j, src+j); + dst += stride_dst; + src += stride_src; + } + } +} + + + +void ff_hevc_rpi_dsp_init(HEVCDSPContext *hevcdsp, int bit_depth) +{ +#undef FUNC +#define FUNC(a, depth) a ## _ ## depth + +#undef PEL_FUNC +#define PEL_FUNC(dst1, idx1, idx2, a, depth) \ + for(i = 0 ; i < 10 ; i++) \ +{ \ + hevcdsp->dst1[i][idx1][idx2] = a ## _ ## depth; \ +} + +#undef EPEL_FUNCS +#define EPEL_FUNCS(depth) \ + PEL_FUNC(put_hevc_epel, 0, 0, put_hevc_pel_pixels, depth); \ + PEL_FUNC(put_hevc_epel, 0, 1, put_hevc_epel_h, depth); \ + PEL_FUNC(put_hevc_epel, 1, 0, put_hevc_epel_v, depth); \ + PEL_FUNC(put_hevc_epel, 1, 1, put_hevc_epel_hv, depth) + +#undef EPEL_UNI_FUNCS +#define EPEL_UNI_FUNCS(depth) \ + PEL_FUNC(put_hevc_epel_uni, 0, 0, put_hevc_pel_uni_pixels, depth); \ + PEL_FUNC(put_hevc_epel_uni, 0, 1, put_hevc_epel_uni_h, depth); \ + PEL_FUNC(put_hevc_epel_uni, 1, 0, put_hevc_epel_uni_v, depth); \ + PEL_FUNC(put_hevc_epel_uni, 1, 1, put_hevc_epel_uni_hv, depth); \ + PEL_FUNC(put_hevc_epel_uni_w, 0, 0, put_hevc_pel_uni_w_pixels, depth); \ + PEL_FUNC(put_hevc_epel_uni_w, 0, 1, put_hevc_epel_uni_w_h, depth); \ + PEL_FUNC(put_hevc_epel_uni_w, 1, 0, put_hevc_epel_uni_w_v, depth); \ + PEL_FUNC(put_hevc_epel_uni_w, 1, 1, put_hevc_epel_uni_w_hv, depth) + +#undef EPEL_BI_FUNCS +#define EPEL_BI_FUNCS(depth) \ + PEL_FUNC(put_hevc_epel_bi, 0, 0, put_hevc_pel_bi_pixels, depth); \ + PEL_FUNC(put_hevc_epel_bi, 0, 1, put_hevc_epel_bi_h, depth); \ + PEL_FUNC(put_hevc_epel_bi, 1, 0, put_hevc_epel_bi_v, depth); \ + PEL_FUNC(put_hevc_epel_bi, 1, 1, put_hevc_epel_bi_hv, depth); \ + PEL_FUNC(put_hevc_epel_bi_w, 0, 0, put_hevc_pel_bi_w_pixels, depth); \ + PEL_FUNC(put_hevc_epel_bi_w, 0, 1, put_hevc_epel_bi_w_h, depth); \ + PEL_FUNC(put_hevc_epel_bi_w, 1, 0, put_hevc_epel_bi_w_v, depth); \ + PEL_FUNC(put_hevc_epel_bi_w, 1, 1, put_hevc_epel_bi_w_hv, depth) + +#undef QPEL_FUNCS +#define QPEL_FUNCS(depth) \ + PEL_FUNC(put_hevc_qpel, 0, 0, put_hevc_pel_pixels, depth); \ + PEL_FUNC(put_hevc_qpel, 0, 1, put_hevc_qpel_h, depth); \ + PEL_FUNC(put_hevc_qpel, 1, 0, put_hevc_qpel_v, depth); \ + PEL_FUNC(put_hevc_qpel, 1, 1, put_hevc_qpel_hv, depth) + +#undef QPEL_UNI_FUNCS +#define QPEL_UNI_FUNCS(depth) \ + PEL_FUNC(put_hevc_qpel_uni, 0, 0, put_hevc_pel_uni_pixels, depth); \ + PEL_FUNC(put_hevc_qpel_uni, 0, 1, put_hevc_qpel_uni_h, depth); \ + PEL_FUNC(put_hevc_qpel_uni, 1, 0, put_hevc_qpel_uni_v, depth); \ + PEL_FUNC(put_hevc_qpel_uni, 1, 1, put_hevc_qpel_uni_hv, depth); \ + PEL_FUNC(put_hevc_qpel_uni_w, 0, 0, put_hevc_pel_uni_w_pixels, depth); \ + PEL_FUNC(put_hevc_qpel_uni_w, 0, 1, put_hevc_qpel_uni_w_h, depth); \ + PEL_FUNC(put_hevc_qpel_uni_w, 1, 0, put_hevc_qpel_uni_w_v, depth); \ + PEL_FUNC(put_hevc_qpel_uni_w, 1, 1, put_hevc_qpel_uni_w_hv, depth) + +#undef QPEL_BI_FUNCS +#define QPEL_BI_FUNCS(depth) \ + PEL_FUNC(put_hevc_qpel_bi, 0, 0, put_hevc_pel_bi_pixels, depth); \ + PEL_FUNC(put_hevc_qpel_bi, 0, 1, put_hevc_qpel_bi_h, depth); \ + PEL_FUNC(put_hevc_qpel_bi, 1, 0, put_hevc_qpel_bi_v, depth); \ + PEL_FUNC(put_hevc_qpel_bi, 1, 1, put_hevc_qpel_bi_hv, depth); \ + PEL_FUNC(put_hevc_qpel_bi_w, 0, 0, put_hevc_pel_bi_w_pixels, depth); \ + PEL_FUNC(put_hevc_qpel_bi_w, 0, 1, put_hevc_qpel_bi_w_h, depth); \ + PEL_FUNC(put_hevc_qpel_bi_w, 1, 0, put_hevc_qpel_bi_w_v, depth); \ + PEL_FUNC(put_hevc_qpel_bi_w, 1, 1, put_hevc_qpel_bi_w_hv, depth) + +#define SLICED_ADD_RESIDUAL(depth)\ + hevcdsp->add_residual_u[0] = FUNC(add_residual4x4_u, depth); \ + hevcdsp->add_residual_u[1] = FUNC(add_residual8x8_u, depth); \ + hevcdsp->add_residual_u[2] = FUNC(add_residual16x16_u, depth); \ + hevcdsp->add_residual_u[3] = FUNC(add_residual32x32_u, depth); \ + hevcdsp->add_residual_v[0] = FUNC(add_residual4x4_v, depth); \ + hevcdsp->add_residual_v[1] = FUNC(add_residual8x8_v, depth); \ + hevcdsp->add_residual_v[2] = FUNC(add_residual16x16_v, depth); \ + hevcdsp->add_residual_v[3] = FUNC(add_residual32x32_v, depth); \ + hevcdsp->add_residual_c[0] = FUNC(add_residual4x4_c, depth); \ + hevcdsp->add_residual_c[1] = FUNC(add_residual8x8_c, depth); \ + hevcdsp->add_residual_c[2] = FUNC(add_residual16x16_c, depth); \ + hevcdsp->add_residual_c[3] = FUNC(add_residual32x32_c, depth); \ + hevcdsp->add_residual_dc_c[0] = FUNC(add_residual4x4_dc_c, depth); \ + hevcdsp->add_residual_dc_c[1] = FUNC(add_residual8x8_dc_c, depth); \ + hevcdsp->add_residual_dc_c[2] = FUNC(add_residual16x16_dc_c, depth); \ + hevcdsp->add_residual_dc_c[3] = FUNC(add_residual32x32_dc_c, depth); \ + hevcdsp->put_pcm_c = FUNC(put_pcm_c, depth) +#define SLICED_LOOP_FILTERS(depth)\ + hevcdsp->hevc_h_loop_filter_luma2 = FUNC(hevc_h_loop_filter_luma2, depth); \ + hevcdsp->hevc_v_loop_filter_luma2 = FUNC(hevc_v_loop_filter_luma2, depth); \ + hevcdsp->hevc_h_loop_filter_uv = FUNC(hevc_h_loop_filter_uv, depth); \ + hevcdsp->hevc_v_loop_filter_uv2 = FUNC(hevc_v_loop_filter_uv2, depth) +#define SLICED_SAO(depth)\ + for (i = 0; i != SAO_FILTER_N; ++i) { \ + hevcdsp->sao_band_filter_c[i] = FUNC(sao_band_filter_c, depth); \ + hevcdsp->sao_edge_filter_c[i] = FUNC(sao_edge_filter_c, depth); \ + } \ + hevcdsp->sao_edge_restore_c[0] = FUNC(sao_edge_restore_c_0, depth); \ + hevcdsp->sao_edge_restore_c[1] = FUNC(sao_edge_restore_c_1, depth) + +#define HEVC_DSP(depth) \ + hevcdsp->put_pcm = FUNC(put_pcm, depth); \ + hevcdsp->add_residual[0] = FUNC(add_residual4x4, depth); \ + hevcdsp->add_residual[1] = FUNC(add_residual8x8, depth); \ + hevcdsp->add_residual[2] = FUNC(add_residual16x16, depth); \ + hevcdsp->add_residual[3] = FUNC(add_residual32x32, depth); \ + hevcdsp->add_residual_dc[0] = FUNC(add_residual4x4_dc, depth); \ + hevcdsp->add_residual_dc[1] = FUNC(add_residual8x8_dc, depth); \ + hevcdsp->add_residual_dc[2] = FUNC(add_residual16x16_dc, depth); \ + hevcdsp->add_residual_dc[3] = FUNC(add_residual32x32_dc, depth); \ + SLICED_ADD_RESIDUAL(depth); \ + hevcdsp->dequant = FUNC(dequant, depth); \ + hevcdsp->transform_rdpcm = FUNC(transform_rdpcm, depth); \ + hevcdsp->transform_4x4_luma = FUNC(transform_4x4_luma, depth); \ + hevcdsp->idct[0] = FUNC(idct_4x4, depth); \ + hevcdsp->idct[1] = FUNC(idct_8x8, depth); \ + hevcdsp->idct[2] = FUNC(idct_16x16, depth); \ + hevcdsp->idct[3] = FUNC(idct_32x32, depth); \ + \ + hevcdsp->idct_dc[0] = FUNC(idct_4x4_dc, depth); \ + hevcdsp->idct_dc[1] = FUNC(idct_8x8_dc, depth); \ + hevcdsp->idct_dc[2] = FUNC(idct_16x16_dc, depth); \ + hevcdsp->idct_dc[3] = FUNC(idct_32x32_dc, depth); \ + \ + for (i = 0; i != SAO_FILTER_N; ++i) { \ + hevcdsp->sao_band_filter[i] = FUNC(sao_band_filter, depth); \ + hevcdsp->sao_edge_filter[i] = FUNC(sao_edge_filter, depth); \ + } \ + hevcdsp->sao_edge_restore[0] = FUNC(sao_edge_restore_0, depth); \ + hevcdsp->sao_edge_restore[1] = FUNC(sao_edge_restore_1, depth); \ + SLICED_SAO(depth); \ + \ + QPEL_FUNCS(depth); \ + QPEL_UNI_FUNCS(depth); \ + QPEL_BI_FUNCS(depth); \ + EPEL_FUNCS(depth); \ + EPEL_UNI_FUNCS(depth); \ + EPEL_BI_FUNCS(depth); \ + \ + SLICED_LOOP_FILTERS(depth); \ + hevcdsp->hevc_h_loop_filter_luma = FUNC(hevc_h_loop_filter_luma, depth); \ + hevcdsp->hevc_v_loop_filter_luma = FUNC(hevc_v_loop_filter_luma, depth); \ + hevcdsp->hevc_h_loop_filter_chroma = FUNC(hevc_h_loop_filter_chroma, depth); \ + hevcdsp->hevc_v_loop_filter_chroma = FUNC(hevc_v_loop_filter_chroma, depth); \ + hevcdsp->hevc_h_loop_filter_luma_c = FUNC(hevc_h_loop_filter_luma, depth); \ + hevcdsp->hevc_v_loop_filter_luma_c = FUNC(hevc_v_loop_filter_luma, depth); \ + hevcdsp->hevc_h_loop_filter_chroma_c = FUNC(hevc_h_loop_filter_chroma, depth); \ + hevcdsp->hevc_v_loop_filter_chroma_c = FUNC(hevc_v_loop_filter_chroma, depth) +int i = 0; + + switch (bit_depth) { + case 9: + HEVC_DSP(9); + break; + case 10: + HEVC_DSP(10); + break; + case 12: + HEVC_DSP(12); + break; + default: + HEVC_DSP(8); + break; + } + + hevcdsp->hevc_deblocking_boundary_strengths = hevc_deblocking_boundary_strengths; + hevcdsp->cpy_blk = cpy_blk; + + if (ARCH_PPC) + ff_hevc_rpi_dsp_init_ppc(hevcdsp, bit_depth); + if (ARCH_X86) + ff_hevc_rpi_dsp_init_x86(hevcdsp, bit_depth); + if (ARCH_ARM) + ff_hevcdsp_rpi_init_arm(hevcdsp, bit_depth); + if (ARCH_MIPS) + ff_hevc_rpi_dsp_init_mips(hevcdsp, bit_depth); +} diff --git a/libavcodec/rpi_hevcdsp.h b/libavcodec/rpi_hevcdsp.h new file mode 100644 index 0000000000..5a7cdeeb66 --- /dev/null +++ b/libavcodec/rpi_hevcdsp.h @@ -0,0 +1,177 @@ +/* + * HEVC video decoder + * + * Copyright (C) 2012 - 2013 Guillaume Martres + * Copyright (C) 2013 - 2014 Pierre-Edouard Lepere + * + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_RPI_HEVCDSP_H +#define AVCODEC_RPI_HEVCDSP_H + +#include "hevc.h" +#include "get_bits.h" + +struct HEVCRpiMvField; + +#define MAX_PB_SIZE 64 + +#define RPI_HEVC_SAO_BUF_STRIDE 160 + + +typedef struct RpiSAOParams { + uint8_t band_position[3]; ///< sao_band_position (Y,U,V) + uint8_t eo_class[3]; ///< sao_eo_class (Y,U=V) + uint8_t type_idx[3]; ///< sao_type_idx (Y,U=V) + + int16_t offset_val[3][5]; ///> 16; + const int dc_u = (dc << 16) >> 16; + + stride /= sizeof(pixel); + + for (y = 0; y < size; y++) { + for (x = 0; x < size * 2; x += 2) { + dst[x] = av_clip_pixel(dst[x] + dc_u); + dst[x + 1] = av_clip_pixel(dst[x + 1] + dc_v); + } + dst += stride; + } +} + + +static void FUNC(add_residual4x4)(uint8_t *_dst, int16_t *res, + ptrdiff_t stride) +{ + FUNC(add_residual)(_dst, res, stride, 4); +} + +static void FUNC(add_residual8x8)(uint8_t *_dst, int16_t *res, + ptrdiff_t stride) +{ + FUNC(add_residual)(_dst, res, stride, 8); +} + +static void FUNC(add_residual16x16)(uint8_t *_dst, int16_t *res, + ptrdiff_t stride) +{ + FUNC(add_residual)(_dst, res, stride, 16); +} + +static void FUNC(add_residual32x32)(uint8_t *_dst, int16_t *res, + ptrdiff_t stride) +{ + FUNC(add_residual)(_dst, res, stride, 32); +} + +static void FUNC(add_residual4x4_dc)(uint8_t *_dst, ptrdiff_t stride, int dc) +{ + FUNC(add_residual_dc)(_dst, stride, dc, 4); +} + +static void FUNC(add_residual8x8_dc)(uint8_t *_dst, ptrdiff_t stride, int dc) +{ + FUNC(add_residual_dc)(_dst, stride, dc, 8); +} + +static void FUNC(add_residual16x16_dc)(uint8_t *_dst, ptrdiff_t stride, int dc) +{ + FUNC(add_residual_dc)(_dst, stride, dc, 16); +} + +static void FUNC(add_residual32x32_dc)(uint8_t *_dst, ptrdiff_t stride, int dc) +{ + FUNC(add_residual_dc)(_dst, stride, dc, 32); +} + +// -- U -- (plaited) + +static void FUNC(add_residual4x4_u)(uint8_t *_dst, const int16_t * res, + ptrdiff_t stride, int dc_u) +{ + FUNC(add_residual_u)(_dst, res, stride, dc_u, 4); +} + +static void FUNC(add_residual8x8_u)(uint8_t *_dst, const int16_t * res, + ptrdiff_t stride, int dc_u) +{ + FUNC(add_residual_u)(_dst, res, stride, dc_u, 8); +} + +static void FUNC(add_residual16x16_u)(uint8_t *_dst, const int16_t * res, + ptrdiff_t stride, int dc_u) +{ + FUNC(add_residual_u)(_dst, res, stride, dc_u, 16); +} + +static void FUNC(add_residual32x32_u)(uint8_t *_dst, const int16_t * res, + ptrdiff_t stride, int dc_u) +{ + // Should never occur for 420, which is all that sand supports + av_assert0(0); +} + +// -- V -- (plaited) + +static void FUNC(add_residual4x4_v)(uint8_t *_dst, const int16_t * res, + ptrdiff_t stride, int dc_v) +{ + FUNC(add_residual_v)(_dst, res, stride, dc_v, 4); +} + +static void FUNC(add_residual8x8_v)(uint8_t *_dst, const int16_t * res, + ptrdiff_t stride, int dc_v) +{ + FUNC(add_residual_v)(_dst, res, stride, dc_v, 8); +} + +static void FUNC(add_residual16x16_v)(uint8_t *_dst, const int16_t * res, + ptrdiff_t stride, int dc_v) +{ + FUNC(add_residual_v)(_dst, res, stride, dc_v, 16); +} + +static void FUNC(add_residual32x32_v)(uint8_t *_dst, const int16_t * res, + ptrdiff_t stride, int dc_v) +{ + // Should never occur for 420, which is all that sand supports + av_assert0(0); +} + +// -- C -- (plaited - both U & V) + +static void FUNC(add_residual4x4_c)(uint8_t *_dst, const int16_t * res, + ptrdiff_t stride) +{ + FUNC(add_residual_c)(_dst, res, stride, 4); +} + +static void FUNC(add_residual8x8_c)(uint8_t *_dst, const int16_t * res, + ptrdiff_t stride) +{ + FUNC(add_residual_c)(_dst, res, stride, 8); +} + +static void FUNC(add_residual16x16_c)(uint8_t *_dst, const int16_t * res, + ptrdiff_t stride) +{ + FUNC(add_residual_c)(_dst, res, stride, 16); +} + +static void FUNC(add_residual32x32_c)(uint8_t *_dst, const int16_t * res, + ptrdiff_t stride) +{ + // Should never occur for 420, which is all that sand supports + av_assert0(0); +} + +static void FUNC(add_residual4x4_dc_c)(uint8_t *_dst, ptrdiff_t stride, int32_t dc) +{ + FUNC(add_residual_dc_c)(_dst, stride, dc, 4); +} + +static void FUNC(add_residual8x8_dc_c)(uint8_t *_dst, ptrdiff_t stride, int32_t dc) +{ + FUNC(add_residual_dc_c)(_dst, stride, dc, 8); +} + +static void FUNC(add_residual16x16_dc_c)(uint8_t *_dst, ptrdiff_t stride, int32_t dc) +{ + FUNC(add_residual_dc_c)(_dst, stride, dc, 16); +} + +static void FUNC(add_residual32x32_dc_c)(uint8_t *_dst, ptrdiff_t stride, int32_t dc) +{ + // Should never occur for 420, which is all that sand supports + av_assert0(0); +} + + +static void FUNC(transform_rdpcm)(int16_t *_coeffs, int16_t log2_size, int mode) +{ + int16_t *coeffs = (int16_t *) _coeffs; + int x, y; + int size = 1 << log2_size; + + if (mode) { + coeffs += size; + for (y = 0; y < size - 1; y++) { + for (x = 0; x < size; x++) + coeffs[x] += coeffs[x - size]; + coeffs += size; + } + } else { + for (y = 0; y < size; y++) { + for (x = 1; x < size; x++) + coeffs[x] += coeffs[x - 1]; + coeffs += size; + } + } +} + +static void FUNC(dequant)(int16_t *coeffs, int16_t log2_size) +{ + int shift = 15 - BIT_DEPTH - log2_size; + int x, y; + int size = 1 << log2_size; + + if (shift > 0) { + int offset = 1 << (shift - 1); + for (y = 0; y < size; y++) { + for (x = 0; x < size; x++) { + *coeffs = (*coeffs + offset) >> shift; + coeffs++; + } + } + } else { + for (y = 0; y < size; y++) { + for (x = 0; x < size; x++) { + *coeffs = *coeffs << -shift; + coeffs++; + } + } + } +} + +#define SET(dst, x) (dst) = (x) +#define SCALE(dst, x) (dst) = av_clip_int16(((x) + add) >> shift) + +#define TR_4x4_LUMA(dst, src, step, assign) \ + do { \ + int c0 = src[0 * step] + src[2 * step]; \ + int c1 = src[2 * step] + src[3 * step]; \ + int c2 = src[0 * step] - src[3 * step]; \ + int c3 = 74 * src[1 * step]; \ + \ + assign(dst[2 * step], 74 * (src[0 * step] - \ + src[2 * step] + \ + src[3 * step])); \ + assign(dst[0 * step], 29 * c0 + 55 * c1 + c3); \ + assign(dst[1 * step], 55 * c2 - 29 * c1 + c3); \ + assign(dst[3 * step], 55 * c0 + 29 * c2 - c3); \ + } while (0) + +static void FUNC(transform_4x4_luma)(int16_t *coeffs) +{ + int i; + int shift = 7; + int add = 1 << (shift - 1); + int16_t *src = coeffs; + + for (i = 0; i < 4; i++) { + TR_4x4_LUMA(src, src, 4, SCALE); + src++; + } + + shift = 20 - BIT_DEPTH; + add = 1 << (shift - 1); + for (i = 0; i < 4; i++) { + TR_4x4_LUMA(coeffs, coeffs, 1, SCALE); + coeffs += 4; + } +} + +#undef TR_4x4_LUMA + +#define TR_4(dst, src, dstep, sstep, assign, end) \ + do { \ + const int e0 = 64 * src[0 * sstep] + 64 * src[2 * sstep]; \ + const int e1 = 64 * src[0 * sstep] - 64 * src[2 * sstep]; \ + const int o0 = 83 * src[1 * sstep] + 36 * src[3 * sstep]; \ + const int o1 = 36 * src[1 * sstep] - 83 * src[3 * sstep]; \ + \ + assign(dst[0 * dstep], e0 + o0); \ + assign(dst[1 * dstep], e1 + o1); \ + assign(dst[2 * dstep], e1 - o1); \ + assign(dst[3 * dstep], e0 - o0); \ + } while (0) + +#define TR_8(dst, src, dstep, sstep, assign, end) \ + do { \ + int i, j; \ + int e_8[4]; \ + int o_8[4] = { 0 }; \ + for (i = 0; i < 4; i++) \ + for (j = 1; j < end; j += 2) \ + o_8[i] += transform[4 * j][i] * src[j * sstep]; \ + TR_4(e_8, src, 1, 2 * sstep, SET, 4); \ + \ + for (i = 0; i < 4; i++) { \ + assign(dst[i * dstep], e_8[i] + o_8[i]); \ + assign(dst[(7 - i) * dstep], e_8[i] - o_8[i]); \ + } \ + } while (0) + +#define TR_16(dst, src, dstep, sstep, assign, end) \ + do { \ + int i, j; \ + int e_16[8]; \ + int o_16[8] = { 0 }; \ + for (i = 0; i < 8; i++) \ + for (j = 1; j < end; j += 2) \ + o_16[i] += transform[2 * j][i] * src[j * sstep]; \ + TR_8(e_16, src, 1, 2 * sstep, SET, 8); \ + \ + for (i = 0; i < 8; i++) { \ + assign(dst[i * dstep], e_16[i] + o_16[i]); \ + assign(dst[(15 - i) * dstep], e_16[i] - o_16[i]); \ + } \ + } while (0) + +#define TR_32(dst, src, dstep, sstep, assign, end) \ + do { \ + int i, j; \ + int e_32[16]; \ + int o_32[16] = { 0 }; \ + for (i = 0; i < 16; i++) \ + for (j = 1; j < end; j += 2) \ + o_32[i] += transform[j][i] * src[j * sstep]; \ + TR_16(e_32, src, 1, 2 * sstep, SET, end / 2); \ + \ + for (i = 0; i < 16; i++) { \ + assign(dst[i * dstep], e_32[i] + o_32[i]); \ + assign(dst[(31 - i) * dstep], e_32[i] - o_32[i]); \ + } \ + } while (0) + +#define IDCT_VAR4(H) \ + int limit2 = FFMIN(col_limit + 4, H) +#define IDCT_VAR8(H) \ + int limit = FFMIN(col_limit, H); \ + int limit2 = FFMIN(col_limit + 4, H) +#define IDCT_VAR16(H) IDCT_VAR8(H) +#define IDCT_VAR32(H) IDCT_VAR8(H) + +#define IDCT(H) \ +static void FUNC(idct_ ## H ## x ## H )(int16_t *coeffs, \ + int col_limit) \ +{ \ + int i; \ + int shift = 7; \ + int add = 1 << (shift - 1); \ + int16_t *src = coeffs; \ + IDCT_VAR ## H(H); \ + \ + for (i = 0; i < H; i++) { \ + TR_ ## H(src, src, H, H, SCALE, limit2); \ + if (limit2 < H && i%4 == 0 && !!i) \ + limit2 -= 4; \ + src++; \ + } \ + \ + shift = 20 - BIT_DEPTH; \ + add = 1 << (shift - 1); \ + for (i = 0; i < H; i++) { \ + TR_ ## H(coeffs, coeffs, 1, 1, SCALE, limit); \ + coeffs += H; \ + } \ +} + +#define IDCT_DC(H) \ +static void FUNC(idct_ ## H ## x ## H ## _dc)(int16_t *coeffs) \ +{ \ + int i, j; \ + int shift = 14 - BIT_DEPTH; \ + int add = 1 << (shift - 1); \ + int coeff = (((coeffs[0] + 1) >> 1) + add) >> shift; \ + \ + for (j = 0; j < H; j++) { \ + for (i = 0; i < H; i++) { \ + coeffs[i + j * H] = coeff; \ + } \ + } \ +} + +IDCT( 4) +IDCT( 8) +IDCT(16) +IDCT(32) + +IDCT_DC( 4) +IDCT_DC( 8) +IDCT_DC(16) +IDCT_DC(32) + +#undef TR_4 +#undef TR_8 +#undef TR_16 +#undef TR_32 + +#undef SET +#undef SCALE + +static void FUNC(sao_band_filter)(uint8_t *_dst, uint8_t *_src, + ptrdiff_t stride_dst, ptrdiff_t stride_src, + int16_t *sao_offset_val, int sao_left_class, + int width, int height) +{ + pixel *dst = (pixel *)_dst; + pixel *src = (pixel *)_src; + int offset_table[32] = { 0 }; + int k, y, x; + int shift = BIT_DEPTH - 5; + + stride_dst /= sizeof(pixel); + stride_src /= sizeof(pixel); + + for (k = 0; k < 4; k++) + offset_table[(k + sao_left_class) & 31] = sao_offset_val[k + 1]; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(src[x] + offset_table[src[x] >> shift]); + dst += stride_dst; + src += stride_src; + } +} + +#define CMP(a, b) (((a) > (b)) - ((a) < (b))) + +static void FUNC(sao_edge_filter)(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *sao_offset_val, + int eo, int width, int height) { + + static const uint8_t edge_idx[] = { 1, 2, 0, 3, 4 }; + static const int8_t pos[4][2][2] = { + { { -1, 0 }, { 1, 0 } }, // horizontal + { { 0, -1 }, { 0, 1 } }, // vertical + { { -1, -1 }, { 1, 1 } }, // 45 degree + { { 1, -1 }, { -1, 1 } }, // 135 degree + }; + pixel *dst = (pixel *)_dst; + pixel *src = (pixel *)_src; + int a_stride, b_stride; + int x, y; + const ptrdiff_t stride_src = RPI_HEVC_SAO_BUF_STRIDE / sizeof(pixel); + stride_dst /= sizeof(pixel); + + a_stride = pos[eo][0][0] + pos[eo][0][1] * stride_src; + b_stride = pos[eo][1][0] + pos[eo][1][1] * stride_src; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + int diff0 = CMP(src[x], src[x + a_stride]); + int diff1 = CMP(src[x], src[x + b_stride]); + int offset_val = edge_idx[2 + diff0 + diff1]; + dst[x] = av_clip_pixel(src[x] + sao_offset_val[offset_val]); + } + src += stride_src; + dst += stride_dst; + } +} + + +#if BIT_DEPTH == 10 +// We need a 32 bit variation for the _c restores so hijack bit depth 10 +#undef pixel +#undef BIT_DEPTH +#define pixel uint32_t +#define BIT_DEPTH 32 +// All 16 bit variations are the same +#define sao_edge_restore_0_10 sao_edge_restore_0_9 +#define sao_edge_restore_1_10 sao_edge_restore_1_9 +#define sao_edge_restore_0_11 sao_edge_restore_0_9 +#define sao_edge_restore_1_11 sao_edge_restore_1_9 +#define sao_edge_restore_0_12 sao_edge_restore_0_9 +#define sao_edge_restore_1_12 sao_edge_restore_1_9 +#define sao_edge_restore_0_13 sao_edge_restore_0_9 +#define sao_edge_restore_1_13 sao_edge_restore_1_9 +#define sao_edge_restore_0_14 sao_edge_restore_0_9 +#define sao_edge_restore_1_14 sao_edge_restore_1_9 +#define sao_edge_restore_0_15 sao_edge_restore_0_9 +#define sao_edge_restore_1_15 sao_edge_restore_1_9 +#define sao_edge_restore_0_16 sao_edge_restore_0_9 +#define sao_edge_restore_1_16 sao_edge_restore_1_9 +#endif +#if BIT_DEPTH <= 9 || BIT_DEPTH == 32 +static void FUNC(sao_edge_restore_0)(uint8_t *_dst, uint8_t *_src, + ptrdiff_t stride_dst, ptrdiff_t stride_src, RpiSAOParams *sao, + int *borders, int _width, int _height, + int c_idx, uint8_t *vert_edge, + uint8_t *horiz_edge, uint8_t *diag_edge) +{ + int x, y; + pixel *dst = (pixel *)_dst; + pixel *src = (pixel *)_src; + int sao_eo_class = sao->eo_class[c_idx]; + int init_x = 0, width = _width, height = _height; + + stride_dst /= sizeof(pixel); + stride_src /= sizeof(pixel); + + if (sao_eo_class != SAO_EO_VERT) { + if (borders[0]) { + for (y = 0; y < height; y++) { + dst[y * stride_dst] = src[y * stride_src]; + } + init_x = 1; + } + if (borders[2]) { + int offset = width - 1; + for (x = 0; x < height; x++) { + dst[x * stride_dst + offset] = src[x * stride_src + offset]; + } + width--; + } + } + if (sao_eo_class != SAO_EO_HORIZ) { + if (borders[1]) { + for (x = init_x; x < width; x++) + dst[x] = src[x]; + } + if (borders[3]) { + ptrdiff_t y_stride_dst = stride_dst * (height - 1); + ptrdiff_t y_stride_src = stride_src * (height - 1); + for (x = init_x; x < width; x++) + dst[x + y_stride_dst] = src[x + y_stride_src]; + height--; + } + } +} + +static void FUNC(sao_edge_restore_1)(uint8_t *_dst, uint8_t *_src, + ptrdiff_t stride_dst, ptrdiff_t stride_src, RpiSAOParams *sao, + int *borders, int _width, int _height, + int c_idx, uint8_t *vert_edge, + uint8_t *horiz_edge, uint8_t *diag_edge) +{ + int x, y; + pixel *dst = (pixel *)_dst; + pixel *src = (pixel *)_src; + int sao_eo_class = sao->eo_class[c_idx]; + int init_x = 0, init_y = 0, width = _width, height = _height; + + stride_dst /= sizeof(pixel); + stride_src /= sizeof(pixel); + + if (sao_eo_class != SAO_EO_VERT) { + if (borders[0]) { + for (y = 0; y < height; y++) { + dst[y * stride_dst] = src[y * stride_src]; + } + init_x = 1; + } + if (borders[2]) { + int offset = width - 1; + for (x = 0; x < height; x++) { + dst[x * stride_dst + offset] = src[x * stride_src + offset]; + } + width--; + } + } + if (sao_eo_class != SAO_EO_HORIZ) { + if (borders[1]) { + for (x = init_x; x < width; x++) + dst[x] = src[x]; + init_y = 1; + } + if (borders[3]) { + ptrdiff_t y_stride_dst = stride_dst * (height - 1); + ptrdiff_t y_stride_src = stride_src * (height - 1); + for (x = init_x; x < width; x++) + dst[x + y_stride_dst] = src[x + y_stride_src]; + height--; + } + } + + { + int save_upper_left = !diag_edge[0] && sao_eo_class == SAO_EO_135D && !borders[0] && !borders[1]; + int save_upper_right = !diag_edge[1] && sao_eo_class == SAO_EO_45D && !borders[1] && !borders[2]; + int save_lower_right = !diag_edge[2] && sao_eo_class == SAO_EO_135D && !borders[2] && !borders[3]; + int save_lower_left = !diag_edge[3] && sao_eo_class == SAO_EO_45D && !borders[0] && !borders[3]; + + // Restore pixels that can't be modified + if(vert_edge[0] && sao_eo_class != SAO_EO_VERT) { + for(y = init_y+save_upper_left; y< height-save_lower_left; y++) + dst[y*stride_dst] = src[y*stride_src]; + } + if(vert_edge[1] && sao_eo_class != SAO_EO_VERT) { + for(y = init_y+save_upper_right; y< height-save_lower_right; y++) + dst[y*stride_dst+width-1] = src[y*stride_src+width-1]; + } + + if(horiz_edge[0] && sao_eo_class != SAO_EO_HORIZ) { + for(x = init_x+save_upper_left; x < width-save_upper_right; x++) + dst[x] = src[x]; + } + if(horiz_edge[1] && sao_eo_class != SAO_EO_HORIZ) { + for(x = init_x+save_lower_left; x < width-save_lower_right; x++) + dst[(height-1)*stride_dst+x] = src[(height-1)*stride_src+x]; + } + if(diag_edge[0] && sao_eo_class == SAO_EO_135D) + dst[0] = src[0]; + if(diag_edge[1] && sao_eo_class == SAO_EO_45D) + dst[width-1] = src[width-1]; + if(diag_edge[2] && sao_eo_class == SAO_EO_135D) + dst[stride_dst*(height-1)+width-1] = src[stride_src*(height-1)+width-1]; + if(diag_edge[3] && sao_eo_class == SAO_EO_45D) + dst[stride_dst*(height-1)] = src[stride_src*(height-1)]; + + } +} +#endif +#if BIT_DEPTH == 32 +#undef BIT_DEPTH +#undef pixel +#define BIT_DEPTH 10 +#define pixel uint16_t +#endif + +// --- Plaited chroma versions + +static void FUNC(sao_band_filter_c)(uint8_t *_dst, const uint8_t *_src, + ptrdiff_t stride_dst, ptrdiff_t stride_src, + const int16_t *sao_offset_val_u, int sao_left_class_u, + const int16_t *sao_offset_val_v, int sao_left_class_v, + int width, int height) +{ + pixel *dst = (pixel *)_dst; + pixel *src = (pixel *)_src; + int offset_table_u[32] = { 0 }; + int offset_table_v[32] = { 0 }; + int k, y, x; + int shift = BIT_DEPTH - 5; + + stride_dst /= sizeof(pixel); + stride_src /= sizeof(pixel); + width *= 2; + + for (k = 0; k < 4; k++) + { + offset_table_u[(k + sao_left_class_u) & 31] = sao_offset_val_u[k + 1]; + offset_table_v[(k + sao_left_class_v) & 31] = sao_offset_val_v[k + 1]; + } + for (y = 0; y < height; y++) { + for (x = 0; x < width; x += 2) + { +// printf("dst=%p, src=%p, x=%d, shift=%d\n", dst, src, x, shift); +// printf("offsets=%x,%x\n", src[x + 0], src[x + 1]); + // *** & 31 shouldn't be wanted but just now we generate broken input that + // crashes us in 10-bit world + dst[x + 0] = av_clip_pixel(src[x + 0] + offset_table_u[(src[x + 0] >> shift) & 31]); + dst[x + 1] = av_clip_pixel(src[x + 1] + offset_table_v[(src[x + 1] >> shift) & 31]); + } + dst += stride_dst; + src += stride_src; + } +} + +static void FUNC(sao_edge_filter_c)(uint8_t *_dst, const uint8_t *_src, ptrdiff_t stride_dst, + const int16_t *sao_offset_val_u, const int16_t *sao_offset_val_v, + int eo, int width, int height) { + + static const uint8_t edge_idx[] = { 1, 2, 0, 3, 4 }; + static const int8_t pos[4][2][2] = { + { { -1, 0 }, { 1, 0 } }, // horizontal + { { 0, -1 }, { 0, 1 } }, // vertical + { { -1, -1 }, { 1, 1 } }, // 45 degree + { { 1, -1 }, { -1, 1 } }, // 135 degree + }; + pixel *dst = (pixel *)_dst; + pixel *src = (pixel *)_src; + int a_stride, b_stride; + int x, y; + const ptrdiff_t stride_src = RPI_HEVC_SAO_BUF_STRIDE / sizeof(pixel); + + stride_dst /= sizeof(pixel); + width *= 2; + + av_assert0(width <= 64); + + a_stride = pos[eo][0][0] * 2 + pos[eo][0][1] * stride_src; + b_stride = pos[eo][1][0] * 2 + pos[eo][1][1] * stride_src; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x += 2) { + int diff0u = CMP(src[x], src[x + a_stride]); + int diff1u = CMP(src[x], src[x + b_stride]); + int offset_valu = edge_idx[2 + diff0u + diff1u]; + int diff0v = CMP(src[x+1], src[x+1 + a_stride]); + int diff1v = CMP(src[x+1], src[x+1 + b_stride]); + int offset_valv = edge_idx[2 + diff0v + diff1v]; + dst[x] = av_clip_pixel(src[x] + sao_offset_val_u[offset_valu]); + dst[x+1] = av_clip_pixel(src[x+1] + sao_offset_val_v[offset_valv]); + } + src += stride_src; + dst += stride_dst; + } +} + +// Do once +#if BIT_DEPTH == 8 +// Any old 2 byte 'normal' restore will work for these +#define sao_edge_restore_c_0_8 sao_edge_restore_0_16 +#define sao_edge_restore_c_1_8 sao_edge_restore_1_16 +// We need 32 bit for 9 bit+ +#define sao_edge_restore_c_0_9 sao_edge_restore_0_32 +#define sao_edge_restore_c_1_9 sao_edge_restore_1_32 +#define sao_edge_restore_c_0_10 sao_edge_restore_0_32 +#define sao_edge_restore_c_1_10 sao_edge_restore_1_32 +#define sao_edge_restore_c_0_11 sao_edge_restore_0_32 +#define sao_edge_restore_c_1_11 sao_edge_restore_1_32 +#define sao_edge_restore_c_0_12 sao_edge_restore_0_32 +#define sao_edge_restore_c_1_12 sao_edge_restore_1_32 +#define sao_edge_restore_c_0_13 sao_edge_restore_0_32 +#define sao_edge_restore_c_1_13 sao_edge_restore_1_32 +#define sao_edge_restore_c_0_14 sao_edge_restore_0_32 +#define sao_edge_restore_c_1_14 sao_edge_restore_1_32 +#define sao_edge_restore_c_0_15 sao_edge_restore_0_32 +#define sao_edge_restore_c_1_15 sao_edge_restore_1_32 +#define sao_edge_restore_c_0_16 sao_edge_restore_0_32 +#define sao_edge_restore_c_1_16 sao_edge_restore_1_32 +#endif + +#undef CMP + +//////////////////////////////////////////////////////////////////////////////// +// +//////////////////////////////////////////////////////////////////////////////// +static void FUNC(put_hevc_pel_pixels)(int16_t *dst, + uint8_t *_src, ptrdiff_t _srcstride, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = src[x] << (14 - BIT_DEPTH); + src += srcstride; + dst += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_pel_uni_pixels)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int height, intptr_t mx, intptr_t my, int width) +{ + int y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + + for (y = 0; y < height; y++) { + memcpy(dst, src, width * sizeof(pixel)); + src += srcstride; + dst += dststride; + } +} + +static void FUNC(put_hevc_pel_bi_pixels)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int16_t *src2, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + + int shift = 14 + 1 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((src[x] << (14 - BIT_DEPTH)) + src2[x] + offset) >> shift); + src += srcstride; + dst += dststride; + src2 += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_pel_uni_w_pixels)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + int shift = denom + 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + ox = ox * (1 << (BIT_DEPTH - 8)); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel((((src[x] << (14 - BIT_DEPTH)) * wx + offset) >> shift) + ox); + src += srcstride; + dst += dststride; + } +} + +static void FUNC(put_hevc_pel_bi_w_pixels)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int16_t *src2, + int height, int denom, int wx0, int wx1, + int ox0, int ox1, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + + int shift = 14 + 1 - BIT_DEPTH; + int log2Wd = denom + shift - 1; + + ox0 = ox0 * (1 << (BIT_DEPTH - 8)); + ox1 = ox1 * (1 << (BIT_DEPTH - 8)); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + dst[x] = av_clip_pixel(( (src[x] << (14 - BIT_DEPTH)) * wx1 + src2[x] * wx0 + (ox0 + ox1 + 1) * (1 << log2Wd)) >> (log2Wd + 1)); + } + src += srcstride; + dst += dststride; + src2 += MAX_PB_SIZE; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// +//////////////////////////////////////////////////////////////////////////////// +#define QPEL_FILTER(src, stride) \ + (filter[0] * src[x - 3 * stride] + \ + filter[1] * src[x - 2 * stride] + \ + filter[2] * src[x - stride] + \ + filter[3] * src[x ] + \ + filter[4] * src[x + stride] + \ + filter[5] * src[x + 2 * stride] + \ + filter[6] * src[x + 3 * stride] + \ + filter[7] * src[x + 4 * stride]) + +static void FUNC(put_hevc_qpel_h)(int16_t *dst, + uint8_t *_src, ptrdiff_t _srcstride, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel*)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_qpel_filters[mx - 1]; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = QPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += srcstride; + dst += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_qpel_v)(int16_t *dst, + uint8_t *_src, ptrdiff_t _srcstride, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel*)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_qpel_filters[my - 1]; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = QPEL_FILTER(src, srcstride) >> (BIT_DEPTH - 8); + src += srcstride; + dst += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_qpel_hv)(int16_t *dst, + uint8_t *_src, + ptrdiff_t _srcstride, + int height, intptr_t mx, + intptr_t my, int width) +{ + int x, y; + const int8_t *filter; + pixel *src = (pixel*)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + int16_t tmp_array[(MAX_PB_SIZE + QPEL_EXTRA) * MAX_PB_SIZE]; + int16_t *tmp = tmp_array; + + src -= QPEL_EXTRA_BEFORE * srcstride; + filter = ff_hevc_rpi_qpel_filters[mx - 1]; + for (y = 0; y < height + QPEL_EXTRA; y++) { + for (x = 0; x < width; x++) + tmp[x] = QPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += srcstride; + tmp += MAX_PB_SIZE; + } + + tmp = tmp_array + QPEL_EXTRA_BEFORE * MAX_PB_SIZE; + filter = ff_hevc_rpi_qpel_filters[my - 1]; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = QPEL_FILTER(tmp, MAX_PB_SIZE) >> 6; + tmp += MAX_PB_SIZE; + dst += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_qpel_uni_h)(uint8_t *_dst, ptrdiff_t _dststride, + uint8_t *_src, ptrdiff_t _srcstride, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel*)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_qpel_filters[mx - 1]; + int shift = 14 - BIT_DEPTH; + +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((QPEL_FILTER(src, 1) >> (BIT_DEPTH - 8)) + offset) >> shift); + src += srcstride; + dst += dststride; + } +} + +static void FUNC(put_hevc_qpel_bi_h)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int16_t *src2, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel*)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + + const int8_t *filter = ff_hevc_rpi_qpel_filters[mx - 1]; + + int shift = 14 + 1 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((QPEL_FILTER(src, 1) >> (BIT_DEPTH - 8)) + src2[x] + offset) >> shift); + src += srcstride; + dst += dststride; + src2 += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_qpel_uni_v)(uint8_t *_dst, ptrdiff_t _dststride, + uint8_t *_src, ptrdiff_t _srcstride, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel*)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_qpel_filters[my - 1]; + int shift = 14 - BIT_DEPTH; + +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((QPEL_FILTER(src, srcstride) >> (BIT_DEPTH - 8)) + offset) >> shift); + src += srcstride; + dst += dststride; + } +} + + +static void FUNC(put_hevc_qpel_bi_v)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int16_t *src2, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel*)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + + const int8_t *filter = ff_hevc_rpi_qpel_filters[my - 1]; + + int shift = 14 + 1 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((QPEL_FILTER(src, srcstride) >> (BIT_DEPTH - 8)) + src2[x] + offset) >> shift); + src += srcstride; + dst += dststride; + src2 += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_qpel_uni_hv)(uint8_t *_dst, ptrdiff_t _dststride, + uint8_t *_src, ptrdiff_t _srcstride, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + const int8_t *filter; + pixel *src = (pixel*)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + int16_t tmp_array[(MAX_PB_SIZE + QPEL_EXTRA) * MAX_PB_SIZE]; + int16_t *tmp = tmp_array; + int shift = 14 - BIT_DEPTH; + +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + src -= QPEL_EXTRA_BEFORE * srcstride; + filter = ff_hevc_rpi_qpel_filters[mx - 1]; + for (y = 0; y < height + QPEL_EXTRA; y++) { + for (x = 0; x < width; x++) + tmp[x] = QPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += srcstride; + tmp += MAX_PB_SIZE; + } + + tmp = tmp_array + QPEL_EXTRA_BEFORE * MAX_PB_SIZE; + filter = ff_hevc_rpi_qpel_filters[my - 1]; + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((QPEL_FILTER(tmp, MAX_PB_SIZE) >> 6) + offset) >> shift); + tmp += MAX_PB_SIZE; + dst += dststride; + } +} + +static void FUNC(put_hevc_qpel_bi_hv)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int16_t *src2, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + const int8_t *filter; + pixel *src = (pixel*)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + int16_t tmp_array[(MAX_PB_SIZE + QPEL_EXTRA) * MAX_PB_SIZE]; + int16_t *tmp = tmp_array; + int shift = 14 + 1 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + src -= QPEL_EXTRA_BEFORE * srcstride; + filter = ff_hevc_rpi_qpel_filters[mx - 1]; + for (y = 0; y < height + QPEL_EXTRA; y++) { + for (x = 0; x < width; x++) + tmp[x] = QPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += srcstride; + tmp += MAX_PB_SIZE; + } + + tmp = tmp_array + QPEL_EXTRA_BEFORE * MAX_PB_SIZE; + filter = ff_hevc_rpi_qpel_filters[my - 1]; + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((QPEL_FILTER(tmp, MAX_PB_SIZE) >> 6) + src2[x] + offset) >> shift); + tmp += MAX_PB_SIZE; + dst += dststride; + src2 += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_qpel_uni_w_h)(uint8_t *_dst, ptrdiff_t _dststride, + uint8_t *_src, ptrdiff_t _srcstride, + int height, int denom, int wx, int ox, + intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel*)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_qpel_filters[mx - 1]; + int shift = denom + 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + ox = ox * (1 << (BIT_DEPTH - 8)); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel((((QPEL_FILTER(src, 1) >> (BIT_DEPTH - 8)) * wx + offset) >> shift) + ox); + src += srcstride; + dst += dststride; + } +} + +static void FUNC(put_hevc_qpel_bi_w_h)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int16_t *src2, + int height, int denom, int wx0, int wx1, + int ox0, int ox1, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel*)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + + const int8_t *filter = ff_hevc_rpi_qpel_filters[mx - 1]; + + int shift = 14 + 1 - BIT_DEPTH; + int log2Wd = denom + shift - 1; + + ox0 = ox0 * (1 << (BIT_DEPTH - 8)); + ox1 = ox1 * (1 << (BIT_DEPTH - 8)); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((QPEL_FILTER(src, 1) >> (BIT_DEPTH - 8)) * wx1 + src2[x] * wx0 + + ((ox0 + ox1 + 1) << log2Wd)) >> (log2Wd + 1)); + src += srcstride; + dst += dststride; + src2 += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_qpel_uni_w_v)(uint8_t *_dst, ptrdiff_t _dststride, + uint8_t *_src, ptrdiff_t _srcstride, + int height, int denom, int wx, int ox, + intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel*)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_qpel_filters[my - 1]; + int shift = denom + 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + ox = ox * (1 << (BIT_DEPTH - 8)); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel((((QPEL_FILTER(src, srcstride) >> (BIT_DEPTH - 8)) * wx + offset) >> shift) + ox); + src += srcstride; + dst += dststride; + } +} + +static void FUNC(put_hevc_qpel_bi_w_v)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int16_t *src2, + int height, int denom, int wx0, int wx1, + int ox0, int ox1, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel*)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + + const int8_t *filter = ff_hevc_rpi_qpel_filters[my - 1]; + + int shift = 14 + 1 - BIT_DEPTH; + int log2Wd = denom + shift - 1; + + ox0 = ox0 * (1 << (BIT_DEPTH - 8)); + ox1 = ox1 * (1 << (BIT_DEPTH - 8)); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((QPEL_FILTER(src, srcstride) >> (BIT_DEPTH - 8)) * wx1 + src2[x] * wx0 + + ((ox0 + ox1 + 1) << log2Wd)) >> (log2Wd + 1)); + src += srcstride; + dst += dststride; + src2 += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_qpel_uni_w_hv)(uint8_t *_dst, ptrdiff_t _dststride, + uint8_t *_src, ptrdiff_t _srcstride, + int height, int denom, int wx, int ox, + intptr_t mx, intptr_t my, int width) +{ + int x, y; + const int8_t *filter; + pixel *src = (pixel*)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + int16_t tmp_array[(MAX_PB_SIZE + QPEL_EXTRA) * MAX_PB_SIZE]; + int16_t *tmp = tmp_array; + int shift = denom + 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + src -= QPEL_EXTRA_BEFORE * srcstride; + filter = ff_hevc_rpi_qpel_filters[mx - 1]; + for (y = 0; y < height + QPEL_EXTRA; y++) { + for (x = 0; x < width; x++) + tmp[x] = QPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += srcstride; + tmp += MAX_PB_SIZE; + } + + tmp = tmp_array + QPEL_EXTRA_BEFORE * MAX_PB_SIZE; + filter = ff_hevc_rpi_qpel_filters[my - 1]; + + ox = ox * (1 << (BIT_DEPTH - 8)); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel((((QPEL_FILTER(tmp, MAX_PB_SIZE) >> 6) * wx + offset) >> shift) + ox); + tmp += MAX_PB_SIZE; + dst += dststride; + } +} + +static void FUNC(put_hevc_qpel_bi_w_hv)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int16_t *src2, + int height, int denom, int wx0, int wx1, + int ox0, int ox1, intptr_t mx, intptr_t my, int width) +{ + int x, y; + const int8_t *filter; + pixel *src = (pixel*)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + int16_t tmp_array[(MAX_PB_SIZE + QPEL_EXTRA) * MAX_PB_SIZE]; + int16_t *tmp = tmp_array; + int shift = 14 + 1 - BIT_DEPTH; + int log2Wd = denom + shift - 1; + + src -= QPEL_EXTRA_BEFORE * srcstride; + filter = ff_hevc_rpi_qpel_filters[mx - 1]; + for (y = 0; y < height + QPEL_EXTRA; y++) { + for (x = 0; x < width; x++) + tmp[x] = QPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += srcstride; + tmp += MAX_PB_SIZE; + } + + tmp = tmp_array + QPEL_EXTRA_BEFORE * MAX_PB_SIZE; + filter = ff_hevc_rpi_qpel_filters[my - 1]; + + ox0 = ox0 * (1 << (BIT_DEPTH - 8)); + ox1 = ox1 * (1 << (BIT_DEPTH - 8)); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((QPEL_FILTER(tmp, MAX_PB_SIZE) >> 6) * wx1 + src2[x] * wx0 + + ((ox0 + ox1 + 1) << log2Wd)) >> (log2Wd + 1)); + tmp += MAX_PB_SIZE; + dst += dststride; + src2 += MAX_PB_SIZE; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// +//////////////////////////////////////////////////////////////////////////////// +#define EPEL_FILTER(src, stride) \ + (filter[0] * src[x - stride] + \ + filter[1] * src[x] + \ + filter[2] * src[x + stride] + \ + filter[3] * src[x + 2 * stride]) + +static void FUNC(put_hevc_epel_h)(int16_t *dst, + uint8_t *_src, ptrdiff_t _srcstride, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_epel_filters[mx - 1]; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = EPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += srcstride; + dst += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_epel_v)(int16_t *dst, + uint8_t *_src, ptrdiff_t _srcstride, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_epel_filters[my - 1]; + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = EPEL_FILTER(src, srcstride) >> (BIT_DEPTH - 8); + src += srcstride; + dst += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_epel_hv)(int16_t *dst, + uint8_t *_src, ptrdiff_t _srcstride, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_epel_filters[mx - 1]; + int16_t tmp_array[(MAX_PB_SIZE + EPEL_EXTRA) * MAX_PB_SIZE]; + int16_t *tmp = tmp_array; + + src -= EPEL_EXTRA_BEFORE * srcstride; + + for (y = 0; y < height + EPEL_EXTRA; y++) { + for (x = 0; x < width; x++) + tmp[x] = EPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += srcstride; + tmp += MAX_PB_SIZE; + } + + tmp = tmp_array + EPEL_EXTRA_BEFORE * MAX_PB_SIZE; + filter = ff_hevc_rpi_epel_filters[my - 1]; + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = EPEL_FILTER(tmp, MAX_PB_SIZE) >> 6; + tmp += MAX_PB_SIZE; + dst += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_epel_uni_h)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_epel_filters[mx - 1]; + int shift = 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((EPEL_FILTER(src, 1) >> (BIT_DEPTH - 8)) + offset) >> shift); + src += srcstride; + dst += dststride; + } +} + +static void FUNC(put_hevc_epel_bi_h)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int16_t *src2, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_epel_filters[mx - 1]; + int shift = 14 + 1 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + dst[x] = av_clip_pixel(((EPEL_FILTER(src, 1) >> (BIT_DEPTH - 8)) + src2[x] + offset) >> shift); + } + dst += dststride; + src += srcstride; + src2 += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_epel_uni_v)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_epel_filters[my - 1]; + int shift = 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((EPEL_FILTER(src, srcstride) >> (BIT_DEPTH - 8)) + offset) >> shift); + src += srcstride; + dst += dststride; + } +} + +static void FUNC(put_hevc_epel_bi_v)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int16_t *src2, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_epel_filters[my - 1]; + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + int shift = 14 + 1 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((EPEL_FILTER(src, srcstride) >> (BIT_DEPTH - 8)) + src2[x] + offset) >> shift); + dst += dststride; + src += srcstride; + src2 += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_epel_uni_hv)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_epel_filters[mx - 1]; + int16_t tmp_array[(MAX_PB_SIZE + EPEL_EXTRA) * MAX_PB_SIZE]; + int16_t *tmp = tmp_array; + int shift = 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + src -= EPEL_EXTRA_BEFORE * srcstride; + + for (y = 0; y < height + EPEL_EXTRA; y++) { + for (x = 0; x < width; x++) + tmp[x] = EPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += srcstride; + tmp += MAX_PB_SIZE; + } + + tmp = tmp_array + EPEL_EXTRA_BEFORE * MAX_PB_SIZE; + filter = ff_hevc_rpi_epel_filters[my - 1]; + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((EPEL_FILTER(tmp, MAX_PB_SIZE) >> 6) + offset) >> shift); + tmp += MAX_PB_SIZE; + dst += dststride; + } +} + +static void FUNC(put_hevc_epel_bi_hv)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int16_t *src2, + int height, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_epel_filters[mx - 1]; + int16_t tmp_array[(MAX_PB_SIZE + EPEL_EXTRA) * MAX_PB_SIZE]; + int16_t *tmp = tmp_array; + int shift = 14 + 1 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + src -= EPEL_EXTRA_BEFORE * srcstride; + + for (y = 0; y < height + EPEL_EXTRA; y++) { + for (x = 0; x < width; x++) + tmp[x] = EPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += srcstride; + tmp += MAX_PB_SIZE; + } + + tmp = tmp_array + EPEL_EXTRA_BEFORE * MAX_PB_SIZE; + filter = ff_hevc_rpi_epel_filters[my - 1]; + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((EPEL_FILTER(tmp, MAX_PB_SIZE) >> 6) + src2[x] + offset) >> shift); + tmp += MAX_PB_SIZE; + dst += dststride; + src2 += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_epel_uni_w_h)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_epel_filters[mx - 1]; + int shift = denom + 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + ox = ox * (1 << (BIT_DEPTH - 8)); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + dst[x] = av_clip_pixel((((EPEL_FILTER(src, 1) >> (BIT_DEPTH - 8)) * wx + offset) >> shift) + ox); + } + dst += dststride; + src += srcstride; + } +} + +static void FUNC(put_hevc_epel_bi_w_h)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int16_t *src2, + int height, int denom, int wx0, int wx1, + int ox0, int ox1, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_epel_filters[mx - 1]; + int shift = 14 + 1 - BIT_DEPTH; + int log2Wd = denom + shift - 1; + + ox0 = ox0 * (1 << (BIT_DEPTH - 8)); + ox1 = ox1 * (1 << (BIT_DEPTH - 8)); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((EPEL_FILTER(src, 1) >> (BIT_DEPTH - 8)) * wx1 + src2[x] * wx0 + + ((ox0 + ox1 + 1) << log2Wd)) >> (log2Wd + 1)); + src += srcstride; + dst += dststride; + src2 += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_epel_uni_w_v)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_epel_filters[my - 1]; + int shift = denom + 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + ox = ox * (1 << (BIT_DEPTH - 8)); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + dst[x] = av_clip_pixel((((EPEL_FILTER(src, srcstride) >> (BIT_DEPTH - 8)) * wx + offset) >> shift) + ox); + } + dst += dststride; + src += srcstride; + } +} + +static void FUNC(put_hevc_epel_bi_w_v)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int16_t *src2, + int height, int denom, int wx0, int wx1, + int ox0, int ox1, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_epel_filters[my - 1]; + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + int shift = 14 + 1 - BIT_DEPTH; + int log2Wd = denom + shift - 1; + + ox0 = ox0 * (1 << (BIT_DEPTH - 8)); + ox1 = ox1 * (1 << (BIT_DEPTH - 8)); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((EPEL_FILTER(src, srcstride) >> (BIT_DEPTH - 8)) * wx1 + src2[x] * wx0 + + ((ox0 + ox1 + 1) << log2Wd)) >> (log2Wd + 1)); + src += srcstride; + dst += dststride; + src2 += MAX_PB_SIZE; + } +} + +static void FUNC(put_hevc_epel_uni_w_hv)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_epel_filters[mx - 1]; + int16_t tmp_array[(MAX_PB_SIZE + EPEL_EXTRA) * MAX_PB_SIZE]; + int16_t *tmp = tmp_array; + int shift = denom + 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + src -= EPEL_EXTRA_BEFORE * srcstride; + + for (y = 0; y < height + EPEL_EXTRA; y++) { + for (x = 0; x < width; x++) + tmp[x] = EPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += srcstride; + tmp += MAX_PB_SIZE; + } + + tmp = tmp_array + EPEL_EXTRA_BEFORE * MAX_PB_SIZE; + filter = ff_hevc_rpi_epel_filters[my - 1]; + + ox = ox * (1 << (BIT_DEPTH - 8)); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel((((EPEL_FILTER(tmp, MAX_PB_SIZE) >> 6) * wx + offset) >> shift) + ox); + tmp += MAX_PB_SIZE; + dst += dststride; + } +} + +static void FUNC(put_hevc_epel_bi_w_hv)(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, + int16_t *src2, + int height, int denom, int wx0, int wx1, + int ox0, int ox1, intptr_t mx, intptr_t my, int width) +{ + int x, y; + pixel *src = (pixel *)_src; + ptrdiff_t srcstride = _srcstride / sizeof(pixel); + pixel *dst = (pixel *)_dst; + ptrdiff_t dststride = _dststride / sizeof(pixel); + const int8_t *filter = ff_hevc_rpi_epel_filters[mx - 1]; + int16_t tmp_array[(MAX_PB_SIZE + EPEL_EXTRA) * MAX_PB_SIZE]; + int16_t *tmp = tmp_array; + int shift = 14 + 1 - BIT_DEPTH; + int log2Wd = denom + shift - 1; + + src -= EPEL_EXTRA_BEFORE * srcstride; + + for (y = 0; y < height + EPEL_EXTRA; y++) { + for (x = 0; x < width; x++) + tmp[x] = EPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += srcstride; + tmp += MAX_PB_SIZE; + } + + tmp = tmp_array + EPEL_EXTRA_BEFORE * MAX_PB_SIZE; + filter = ff_hevc_rpi_epel_filters[my - 1]; + + ox0 = ox0 * (1 << (BIT_DEPTH - 8)); + ox1 = ox1 * (1 << (BIT_DEPTH - 8)); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(((EPEL_FILTER(tmp, MAX_PB_SIZE) >> 6) * wx1 + src2[x] * wx0 + + ((ox0 + ox1 + 1) * (1 << log2Wd))) >> (log2Wd + 1)); + tmp += MAX_PB_SIZE; + dst += dststride; + src2 += MAX_PB_SIZE; + } +} + +// line zero +#define P3 pix[-4 * xstride] +#define P2 pix[-3 * xstride] +#define P1 pix[-2 * xstride] +#define P0 pix[-1 * xstride] +#define Q0 pix[0 * xstride] +#define Q1 pix[1 * xstride] +#define Q2 pix[2 * xstride] +#define Q3 pix[3 * xstride] + +// line three. used only for deblocking decision +#define TP3 pix[-4 * xstride + 3 * ystride] +#define TP2 pix[-3 * xstride + 3 * ystride] +#define TP1 pix[-2 * xstride + 3 * ystride] +#define TP0 pix[-1 * xstride + 3 * ystride] +#define TQ0 pix[0 * xstride + 3 * ystride] +#define TQ1 pix[1 * xstride + 3 * ystride] +#define TQ2 pix[2 * xstride + 3 * ystride] +#define TQ3 pix[3 * xstride + 3 * ystride] + +static void FUNC(hevc_loop_filter_luma)(uint8_t *_pix, + ptrdiff_t _xstride, ptrdiff_t _ystride, + int beta, int *_tc, + uint8_t *_no_p, uint8_t *_no_q) +{ + int d, j; + pixel *pix = (pixel *)_pix; + ptrdiff_t xstride = _xstride / sizeof(pixel); + ptrdiff_t ystride = _ystride / sizeof(pixel); + + beta <<= BIT_DEPTH - 8; + + for (j = 0; j < 2; j++) { + const int dp0 = abs(P2 - 2 * P1 + P0); + const int dq0 = abs(Q2 - 2 * Q1 + Q0); + const int dp3 = abs(TP2 - 2 * TP1 + TP0); + const int dq3 = abs(TQ2 - 2 * TQ1 + TQ0); + const int d0 = dp0 + dq0; + const int d3 = dp3 + dq3; + const int tc = _tc[j] << (BIT_DEPTH - 8); + const int no_p = _no_p[j]; + const int no_q = _no_q[j]; + + if (d0 + d3 >= beta) { + pix += 4 * ystride; + continue; + } else { + const int beta_3 = beta >> 3; + const int beta_2 = beta >> 2; + const int tc25 = ((tc * 5 + 1) >> 1); + + if (abs(P3 - P0) + abs(Q3 - Q0) < beta_3 && abs(P0 - Q0) < tc25 && + abs(TP3 - TP0) + abs(TQ3 - TQ0) < beta_3 && abs(TP0 - TQ0) < tc25 && + (d0 << 1) < beta_2 && (d3 << 1) < beta_2) { + // strong filtering + const int tc2 = tc << 1; + for (d = 0; d < 4; d++) { + const int p3 = P3; + const int p2 = P2; + const int p1 = P1; + const int p0 = P0; + const int q0 = Q0; + const int q1 = Q1; + const int q2 = Q2; + const int q3 = Q3; + if (!no_p) { + P0 = p0 + av_clip(((p2 + 2 * p1 + 2 * p0 + 2 * q0 + q1 + 4) >> 3) - p0, -tc2, tc2); + P1 = p1 + av_clip(((p2 + p1 + p0 + q0 + 2) >> 2) - p1, -tc2, tc2); + P2 = p2 + av_clip(((2 * p3 + 3 * p2 + p1 + p0 + q0 + 4) >> 3) - p2, -tc2, tc2); + } + if (!no_q) { + Q0 = q0 + av_clip(((p1 + 2 * p0 + 2 * q0 + 2 * q1 + q2 + 4) >> 3) - q0, -tc2, tc2); + Q1 = q1 + av_clip(((p0 + q0 + q1 + q2 + 2) >> 2) - q1, -tc2, tc2); + Q2 = q2 + av_clip(((2 * q3 + 3 * q2 + q1 + q0 + p0 + 4) >> 3) - q2, -tc2, tc2); + } + pix += ystride; + } + } else { // normal filtering + int nd_p = 1; + int nd_q = 1; + const int tc_2 = tc >> 1; + if (dp0 + dp3 < ((beta + (beta >> 1)) >> 3)) + nd_p = 2; + if (dq0 + dq3 < ((beta + (beta >> 1)) >> 3)) + nd_q = 2; + + for (d = 0; d < 4; d++) { + const int p2 = P2; + const int p1 = P1; + const int p0 = P0; + const int q0 = Q0; + const int q1 = Q1; + const int q2 = Q2; + int delta0 = (9 * (q0 - p0) - 3 * (q1 - p1) + 8) >> 4; + if (abs(delta0) < 10 * tc) { + delta0 = av_clip(delta0, -tc, tc); + if (!no_p) + P0 = av_clip_pixel(p0 + delta0); + if (!no_q) + Q0 = av_clip_pixel(q0 - delta0); + if (!no_p && nd_p > 1) { + const int deltap1 = av_clip((((p2 + p0 + 1) >> 1) - p1 + delta0) >> 1, -tc_2, tc_2); + P1 = av_clip_pixel(p1 + deltap1); + } + if (!no_q && nd_q > 1) { + const int deltaq1 = av_clip((((q2 + q0 + 1) >> 1) - q1 - delta0) >> 1, -tc_2, tc_2); + Q1 = av_clip_pixel(q1 + deltaq1); + } + } + pix += ystride; + } + } + } + } +} + +static void FUNC(hevc_loop_filter_chroma)(uint8_t *_pix, ptrdiff_t _xstride, + ptrdiff_t _ystride, int *_tc, + uint8_t *_no_p, uint8_t *_no_q) +{ + int d, j, no_p, no_q; + pixel *pix = (pixel *)_pix; + ptrdiff_t xstride = _xstride / sizeof(pixel); + ptrdiff_t ystride = _ystride / sizeof(pixel); + + for (j = 0; j < 2; j++) { + const int tc = _tc[j] << (BIT_DEPTH - 8); + if (tc <= 0) { + pix += 4 * ystride; + continue; + } + no_p = _no_p[j]; + no_q = _no_q[j]; + + for (d = 0; d < 4; d++) { + int delta0; + const int p1 = P1; + const int p0 = P0; + const int q0 = Q0; + const int q1 = Q1; + delta0 = av_clip((((q0 - p0) * 4) + p1 - q1 + 4) >> 3, -tc, tc); + if (!no_p) + P0 = av_clip_pixel(p0 + delta0); + if (!no_q) + Q0 = av_clip_pixel(q0 - delta0); + pix += ystride; + } + } +} + +static void FUNC(hevc_h_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride, + int32_t *tc, uint8_t *no_p, + uint8_t *no_q) +{ + FUNC(hevc_loop_filter_chroma)(pix, stride, sizeof(pixel), tc, no_p, no_q); +} + +static void FUNC(hevc_v_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride, + int32_t *tc, uint8_t *no_p, + uint8_t *no_q) +{ + FUNC(hevc_loop_filter_chroma)(pix, sizeof(pixel), stride, tc, no_p, no_q); +} + +static void FUNC(hevc_h_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride, + int beta, int32_t *tc, uint8_t *no_p, + uint8_t *no_q) +{ + FUNC(hevc_loop_filter_luma)(pix, stride, sizeof(pixel), + beta, tc, no_p, no_q); +} + +static void FUNC(hevc_v_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride, + int beta, int32_t *tc, uint8_t *no_p, + uint8_t *no_q) +{ + FUNC(hevc_loop_filter_luma)(pix, sizeof(pixel), stride, + beta, tc, no_p, no_q); +} + +#undef P3 +#undef P2 +#undef P1 +#undef P0 +#undef Q0 +#undef Q1 +#undef Q2 +#undef Q3 + +#undef TP3 +#undef TP2 +#undef TP1 +#undef TP0 +#undef TQ0 +#undef TQ1 +#undef TQ2 +#undef TQ3 + +// line zero +#define P3 pix_l[0 * xstride] +#define P2 pix_l[1 * xstride] +#define P1 pix_l[2 * xstride] +#define P0 pix_l[3 * xstride] +#define Q0 pix_r[0 * xstride] +#define Q1 pix_r[1 * xstride] +#define Q2 pix_r[2 * xstride] +#define Q3 pix_r[3 * xstride] + +// line three. used only for deblocking decision +#define TP3 pix_l[0 * xstride + 3 * ystride] +#define TP2 pix_l[1 * xstride + 3 * ystride] +#define TP1 pix_l[2 * xstride + 3 * ystride] +#define TP0 pix_l[3 * xstride + 3 * ystride] +#define TQ0 pix_r[0 * xstride + 3 * ystride] +#define TQ1 pix_r[1 * xstride + 3 * ystride] +#define TQ2 pix_r[2 * xstride + 3 * ystride] +#define TQ3 pix_r[3 * xstride + 3 * ystride] + +// This is identical to hevc_loop_filter_luma except that the P/Q +// components are on separate pointers +static void FUNC(hevc_v_loop_filter_luma2)(uint8_t * _pix_r, + unsigned int _stride, unsigned int beta, unsigned int tc2, unsigned int no_f, + uint8_t * _pix_l) +{ + int d, j; + pixel *pix_l = (pixel *)_pix_l; + pixel *pix_r = (pixel *)_pix_r; + const ptrdiff_t xstride = 1; + const ptrdiff_t ystride = _stride / sizeof(pixel); + + beta <<= BIT_DEPTH - 8; + + for (j = 0; j < 2; j++) { + const int dp0 = abs(P2 - 2 * P1 + P0); + const int dq0 = abs(Q2 - 2 * Q1 + Q0); + const int dp3 = abs(TP2 - 2 * TP1 + TP0); + const int dq3 = abs(TQ2 - 2 * TQ1 + TQ0); + const int d0 = dp0 + dq0; + const int d3 = dp3 + dq3; + const int tc = ((tc2 >> (j << 4)) & 0xffff) << (BIT_DEPTH - 8); + const int no_p = no_f & 1; + const int no_q = no_f & 2; + + if (d0 + d3 >= beta) { + pix_l += 4 * ystride; + pix_r += 4 * ystride; + continue; + } else { + const int beta_3 = beta >> 3; + const int beta_2 = beta >> 2; + const int tc25 = ((tc * 5 + 1) >> 1); + + if (abs(P3 - P0) + abs(Q3 - Q0) < beta_3 && abs(P0 - Q0) < tc25 && + abs(TP3 - TP0) + abs(TQ3 - TQ0) < beta_3 && abs(TP0 - TQ0) < tc25 && + (d0 << 1) < beta_2 && (d3 << 1) < beta_2) { + // strong filtering + const int tc2 = tc << 1; + for (d = 0; d < 4; d++) { + const int p3 = P3; + const int p2 = P2; + const int p1 = P1; + const int p0 = P0; + const int q0 = Q0; + const int q1 = Q1; + const int q2 = Q2; + const int q3 = Q3; + if (!no_p) { + P0 = p0 + av_clip(((p2 + 2 * p1 + 2 * p0 + 2 * q0 + q1 + 4) >> 3) - p0, -tc2, tc2); + P1 = p1 + av_clip(((p2 + p1 + p0 + q0 + 2) >> 2) - p1, -tc2, tc2); + P2 = p2 + av_clip(((2 * p3 + 3 * p2 + p1 + p0 + q0 + 4) >> 3) - p2, -tc2, tc2); + } + if (!no_q) { + Q0 = q0 + av_clip(((p1 + 2 * p0 + 2 * q0 + 2 * q1 + q2 + 4) >> 3) - q0, -tc2, tc2); + Q1 = q1 + av_clip(((p0 + q0 + q1 + q2 + 2) >> 2) - q1, -tc2, tc2); + Q2 = q2 + av_clip(((2 * q3 + 3 * q2 + q1 + q0 + p0 + 4) >> 3) - q2, -tc2, tc2); + } + pix_l += ystride; + pix_r += ystride; + } + } else { // normal filtering + int nd_p = 1; + int nd_q = 1; + const int tc_2 = tc >> 1; + if (dp0 + dp3 < ((beta + (beta >> 1)) >> 3)) + nd_p = 2; + if (dq0 + dq3 < ((beta + (beta >> 1)) >> 3)) + nd_q = 2; + + for (d = 0; d < 4; d++) { + const int p2 = P2; + const int p1 = P1; + const int p0 = P0; + const int q0 = Q0; + const int q1 = Q1; + const int q2 = Q2; + int delta0 = (9 * (q0 - p0) - 3 * (q1 - p1) + 8) >> 4; + if (abs(delta0) < 10 * tc) { + delta0 = av_clip(delta0, -tc, tc); + if (!no_p) + P0 = av_clip_pixel(p0 + delta0); + if (!no_q) + Q0 = av_clip_pixel(q0 - delta0); + if (!no_p && nd_p > 1) { + const int deltap1 = av_clip((((p2 + p0 + 1) >> 1) - p1 + delta0) >> 1, -tc_2, tc_2); + P1 = av_clip_pixel(p1 + deltap1); + } + if (!no_q && nd_q > 1) { + const int deltaq1 = av_clip((((q2 + q0 + 1) >> 1) - q1 - delta0) >> 1, -tc_2, tc_2); + Q1 = av_clip_pixel(q1 + deltaq1); + } + } + pix_l += ystride; + pix_r += ystride; + } + } + } + } +} + +static void FUNC(hevc_h_loop_filter_luma2)(uint8_t * _pix_r, + unsigned int _stride, unsigned int beta, unsigned int tc2, unsigned int no_f) +{ + // Just call the non-2 function having massaged the parameters + int32_t tc[2] = {tc2 & 0xffff, tc2 >> 16}; + uint8_t no_p[2] = {no_f & 1, no_f & 1}; + uint8_t no_q[2] = {no_f & 2, no_f & 2}; + FUNC(hevc_h_loop_filter_luma)(_pix_r, _stride, beta, tc, no_p, no_q); +} + +#undef TP3 +#undef TP2 +#undef TP1 +#undef TP0 +#undef TQ0 +#undef TQ1 +#undef TQ2 +#undef TQ3 + +#undef P3 +#undef P2 +#undef P1 +#undef P0 +#undef Q0 +#undef Q1 +#undef Q2 +#undef Q3 + +#define P1 pix_l[0 * xstride] +#define P0 pix_l[1 * xstride] +#define Q0 pix_r[0 * xstride] +#define Q1 pix_r[1 * xstride] + +static void FUNC(hevc_loop_filter_uv2)(uint8_t *_pix_l, ptrdiff_t _xstride, + ptrdiff_t _ystride, const int32_t *_tc, + const uint8_t *_no_p, const uint8_t *_no_q, uint8_t *_pix_r) +{ + int d, j, no_p, no_q; + pixel *pix_l = (pixel *)_pix_l; + pixel *pix_r = (pixel *)_pix_r; + ptrdiff_t xstride = _xstride / sizeof(pixel); + ptrdiff_t ystride = _ystride / sizeof(pixel); + + for (j = 0; j < 2; j++) { + const int tc = _tc[j] << (BIT_DEPTH - 8); + if (tc <= 0) { + pix_l += 4 * ystride; + pix_r += 4 * ystride; + continue; + } + no_p = _no_p[j]; + no_q = _no_q[j]; + + for (d = 0; d < 4; d++) { + int delta0; + const int p1 = P1; + const int p0 = P0; + const int q0 = Q0; + const int q1 = Q1; + delta0 = av_clip((((q0 - p0) * 4) + p1 - q1 + 4) >> 3, -tc, tc); + if (!no_p) + P0 = av_clip_pixel(p0 + delta0); + if (!no_q) + Q0 = av_clip_pixel(q0 - delta0); + pix_l += ystride; + pix_r += ystride; + } + } +} + +static void FUNC(hevc_h_loop_filter_uv)(uint8_t * pix, unsigned int stride, uint32_t tc4, + unsigned int no_f) +{ + uint8_t no_p[2] = {no_f & 1, no_f & 2}; + uint8_t no_q[2] = {no_f & 4, no_f & 8}; + int32_t tc[4] = {tc4 & 0xff, (tc4 >> 8) & 0xff, (tc4 >> 16) & 0xff, tc4 >> 24}; + FUNC(hevc_loop_filter_chroma)(pix, stride, sizeof(pixel) * 2, tc, no_p, no_q); + FUNC(hevc_loop_filter_chroma)(pix + sizeof(pixel), stride, sizeof(pixel) * 2, tc + 2, no_p, no_q); +} + +static void FUNC(hevc_v_loop_filter_uv2)(uint8_t * src_r, unsigned int stride, uint32_t tc4, + uint8_t * src_l, + unsigned int no_f) +{ + uint8_t no_p[2] = {no_f & 1, no_f & 2}; + uint8_t no_q[2] = {no_f & 4, no_f & 8}; + int32_t tc[4] = {tc4 & 0xff, (tc4 >> 8) & 0xff, (tc4 >> 16) & 0xff, tc4 >> 24}; + FUNC(hevc_loop_filter_uv2)(src_l, sizeof(pixel) * 2, stride, tc, no_p, no_q, src_r); + FUNC(hevc_loop_filter_uv2)(src_l + sizeof(pixel), sizeof(pixel) * 2, stride, tc + 2, no_p, no_q, src_r + sizeof(pixel)); +} + +#undef P1 +#undef P0 +#undef Q0 +#undef Q1 + diff --git a/libavcodec/rpi_hevcpred.c b/libavcodec/rpi_hevcpred.c new file mode 100644 index 0000000000..0aa8809a4b --- /dev/null +++ b/libavcodec/rpi_hevcpred.c @@ -0,0 +1,161 @@ +/* + * HEVC video Decoder + * + * Copyright (C) 2012 - 2013 Guillaume Martres + * Copyright (C) 2018 John Cox for Raspberry Pi (Trading) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "rpi_hevcdec.h" + +#include "rpi_hevcpred.h" +#if (ARCH_ARM) +#include "arm/rpi_hevcpred_arm.h" +#endif + +#define PRED_C 0 +#define BIT_DEPTH 8 +#include "rpi_hevcpred_template.c" +#undef BIT_DEPTH + +#define BIT_DEPTH 9 +#include "rpi_hevcpred_template.c" +#undef BIT_DEPTH + +#define BIT_DEPTH 10 +#include "rpi_hevcpred_template.c" +#undef BIT_DEPTH + +#define BIT_DEPTH 12 +#include "rpi_hevcpred_template.c" +#undef BIT_DEPTH +#undef PRED_C + +#define PRED_C 1 +#define BIT_DEPTH 8 +#include "rpi_hevcpred_template.c" +#undef BIT_DEPTH + +#define BIT_DEPTH 9 +#include "rpi_hevcpred_template.c" +#undef BIT_DEPTH + +#define BIT_DEPTH 10 +#include "rpi_hevcpred_template.c" +#undef BIT_DEPTH + +#define BIT_DEPTH 12 +#include "rpi_hevcpred_template.c" +#undef BIT_DEPTH +#undef PRED_C + +void ff_hevc_rpi_pred_init(HEVCRpiPredContext *hpc, int bit_depth) +{ +#undef FUNC +#define FUNC(a, depth) a ## _ ## depth + +#undef FUNCC +#define FUNCC(a, depth) a ## _ ## depth ## _c + +#define HEVC_PRED_Y(depth) \ + hpc->intra_pred = FUNC(intra_pred, depth); \ + hpc->intra_filter[0] = FUNC(intra_filter_2, depth); \ + hpc->intra_filter[1] = FUNC(intra_filter_3, depth); \ + hpc->intra_filter[2] = FUNC(intra_filter_4, depth); \ + hpc->intra_filter[3] = FUNC(intra_filter_5, depth); \ + hpc->pred_planar[0] = FUNC(pred_planar_0, depth); \ + hpc->pred_planar[1] = FUNC(pred_planar_1, depth); \ + hpc->pred_planar[2] = FUNC(pred_planar_2, depth); \ + hpc->pred_planar[3] = FUNC(pred_planar_3, depth); \ + hpc->pred_dc[0] = FUNC(pred_dc_0, depth); \ + hpc->pred_dc[1] = FUNC(pred_dc_1, depth); \ + hpc->pred_dc[2] = FUNC(pred_dc_2, depth); \ + hpc->pred_dc[3] = FUNC(pred_dc_3, depth); \ + hpc->pred_vertical[0] = FUNC(pred_angular_0, depth); \ + hpc->pred_vertical[1] = FUNC(pred_angular_1, depth); \ + hpc->pred_vertical[2] = FUNC(pred_angular_2, depth); \ + hpc->pred_vertical[3] = FUNC(pred_angular_3, depth); \ + hpc->pred_horizontal[0] = FUNC(pred_angular_0, depth); \ + hpc->pred_horizontal[1] = FUNC(pred_angular_1, depth); \ + hpc->pred_horizontal[2] = FUNC(pred_angular_2, depth); \ + hpc->pred_horizontal[3] = FUNC(pred_angular_3, depth); \ + hpc->pred_angular[0] = FUNC(pred_angular_0, depth); \ + hpc->pred_angular[1] = FUNC(pred_angular_1, depth); \ + hpc->pred_angular[2] = FUNC(pred_angular_2, depth); \ + hpc->pred_angular[3] = FUNC(pred_angular_3, depth); \ + hpc->pred_dc0[0] = FUNC(pred_dc0_0, depth); \ + hpc->pred_dc0[1] = FUNC(pred_dc0_1, depth); \ + hpc->pred_dc0[2] = FUNC(pred_dc0_2, depth); \ + hpc->pred_dc0[3] = FUNC(pred_dc0_3, depth); + +#define HEVC_PRED_C(depth) \ + hpc->intra_pred_c = FUNCC(intra_pred, depth); \ + hpc->intra_filter_c[0] = FUNCC(intra_filter_2, depth); \ + hpc->intra_filter_c[1] = FUNCC(intra_filter_3, depth); \ + hpc->intra_filter_c[2] = FUNCC(intra_filter_4, depth); \ + hpc->intra_filter_c[3] = FUNCC(intra_filter_5, depth); \ + hpc->pred_planar_c[0] = FUNCC(pred_planar_0, depth); \ + hpc->pred_planar_c[1] = FUNCC(pred_planar_1, depth); \ + hpc->pred_planar_c[2] = FUNCC(pred_planar_2, depth); \ + hpc->pred_planar_c[3] = FUNCC(pred_planar_3, depth); \ + hpc->pred_dc_c[0] = FUNCC(pred_dc_0, depth); \ + hpc->pred_dc_c[1] = FUNCC(pred_dc_1, depth); \ + hpc->pred_dc_c[2] = FUNCC(pred_dc_2, depth); \ + hpc->pred_dc_c[3] = FUNCC(pred_dc_3, depth); \ + hpc->pred_vertical_c[0] = FUNCC(pred_angular_0, depth); \ + hpc->pred_vertical_c[1] = FUNCC(pred_angular_1, depth); \ + hpc->pred_vertical_c[2] = FUNCC(pred_angular_2, depth); \ + hpc->pred_vertical_c[3] = FUNCC(pred_angular_3, depth); \ + hpc->pred_horizontal_c[0] = FUNCC(pred_angular_0, depth); \ + hpc->pred_horizontal_c[1] = FUNCC(pred_angular_1, depth); \ + hpc->pred_horizontal_c[2] = FUNCC(pred_angular_2, depth); \ + hpc->pred_horizontal_c[3] = FUNCC(pred_angular_3, depth); \ + hpc->pred_angular_c[0] = FUNCC(pred_angular_0, depth); \ + hpc->pred_angular_c[1] = FUNCC(pred_angular_1, depth); \ + hpc->pred_angular_c[2] = FUNCC(pred_angular_2, depth); \ + hpc->pred_angular_c[3] = FUNCC(pred_angular_3, depth); \ + hpc->pred_dc0_c[0] = FUNCC(pred_dc0_0, depth); \ + hpc->pred_dc0_c[1] = FUNCC(pred_dc0_1, depth); \ + hpc->pred_dc0_c[2] = FUNCC(pred_dc0_2, depth); \ + hpc->pred_dc0_c[3] = FUNCC(pred_dc0_3, depth); + +#define HEVC_PRED(depth) \ + HEVC_PRED_Y(depth); \ + HEVC_PRED_C(depth); + + switch (bit_depth) { + case 9: + HEVC_PRED(9); + break; + case 10: + HEVC_PRED(10); + break; + case 12: + HEVC_PRED(12); + break; + default: + HEVC_PRED(8); + break; + } + +#if (ARCH_ARM) + ff_hevc_rpi_pred_init_arm(hpc, bit_depth); +#elif (ARCH_MIPS) + ff_hevc_rpi_pred_init_mips(hpc, bit_depth); +#endif +} diff --git a/libavcodec/rpi_hevcpred.h b/libavcodec/rpi_hevcpred.h new file mode 100644 index 0000000000..9f0edb8798 --- /dev/null +++ b/libavcodec/rpi_hevcpred.h @@ -0,0 +1,123 @@ +/* + * HEVC video Decoder + * + * Copyright (C) 2012 - 2013 Guillaume Martres + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_RPI_HEVCPRED_H +#define AVCODEC_RPI_HEVCPRED_H + +#include +#include +#include "config.h" + +struct HEVCRpiContext; +struct HEVCRpiLocalContext; + +enum IntraPredMode { + INTRA_PLANAR = 0, + INTRA_DC, + INTRA_ANGULAR_2, + INTRA_ANGULAR_3, + INTRA_ANGULAR_4, + INTRA_ANGULAR_5, + INTRA_ANGULAR_6, + INTRA_ANGULAR_7, + INTRA_ANGULAR_8, + INTRA_ANGULAR_9, + INTRA_ANGULAR_10, + INTRA_ANGULAR_11, + INTRA_ANGULAR_12, + INTRA_ANGULAR_13, + INTRA_ANGULAR_14, + INTRA_ANGULAR_15, + INTRA_ANGULAR_16, + INTRA_ANGULAR_17, + INTRA_ANGULAR_18, + INTRA_ANGULAR_19, + INTRA_ANGULAR_20, + INTRA_ANGULAR_21, + INTRA_ANGULAR_22, + INTRA_ANGULAR_23, + INTRA_ANGULAR_24, + INTRA_ANGULAR_25, + INTRA_ANGULAR_26, + INTRA_ANGULAR_27, + INTRA_ANGULAR_28, + INTRA_ANGULAR_29, + INTRA_ANGULAR_30, + INTRA_ANGULAR_31, + INTRA_ANGULAR_32, + INTRA_ANGULAR_33, + INTRA_ANGULAR_34, +}; +#define INTRA_ANGULAR_HORIZONTAL INTRA_ANGULAR_10 +#define INTRA_ANGULAR_VERTICAL INTRA_ANGULAR_26 + +typedef void intra_filter_fn_t( + uint8_t * const left, uint8_t * const top, + const unsigned int req, const unsigned int avail, + const uint8_t * const src_l, const uint8_t * const src_u, const uint8_t * const src_ur, + const unsigned int stride, + const unsigned int top_right_size, const unsigned int down_left_size); + +typedef struct HEVCRpiPredContext { + void (*intra_pred)(const struct HEVCRpiContext * const s, + const enum IntraPredMode mode, const unsigned int x0, const unsigned int y0, + const unsigned int avail, const unsigned int log2_size); + + intra_filter_fn_t *intra_filter[4]; + void (*pred_planar[4])(uint8_t *src, const uint8_t *top, + const uint8_t *left, ptrdiff_t stride); + void (*pred_dc[4])(uint8_t *src, const uint8_t *top, const uint8_t *left, + ptrdiff_t stride); + void (*pred_angular[4])(uint8_t *src, const uint8_t *top, + const uint8_t *left, ptrdiff_t stride, + int mode); + void (*pred_vertical[4])(uint8_t *src, const uint8_t *top, + const uint8_t *left, ptrdiff_t stride, + int mode); + void (*pred_horizontal[4])(uint8_t *src, const uint8_t *top, + const uint8_t *left, ptrdiff_t stride, + int mode); + void (*pred_dc0[4])(uint8_t *src, ptrdiff_t stride); + + void (*intra_pred_c)(const struct HEVCRpiContext * const s, + const enum IntraPredMode mode, const unsigned int x0, const unsigned int y0, + const unsigned int avail, const unsigned int log2_size); + intra_filter_fn_t *intra_filter_c[4]; + void (*pred_planar_c[4])(uint8_t *src, const uint8_t *top, + const uint8_t *left, ptrdiff_t stride); + void (*pred_dc_c[4])(uint8_t *src, const uint8_t *top, const uint8_t *left, + ptrdiff_t stride); + void (*pred_angular_c[4])(uint8_t *src, const uint8_t *top, + const uint8_t *left, ptrdiff_t stride, + int mode); + void (*pred_vertical_c[4])(uint8_t *src, const uint8_t *top, + const uint8_t *left, ptrdiff_t stride, + int mode); + void (*pred_horizontal_c[4])(uint8_t *src, const uint8_t *top, + const uint8_t *left, ptrdiff_t stride, + int mode); + void (*pred_dc0_c[4])(uint8_t *src, ptrdiff_t stride); +} HEVCRpiPredContext; + +void ff_hevc_rpi_pred_init(HEVCRpiPredContext *hpc, int bit_depth); + +#endif /* AVCODEC_RPI_HEVCPRED_H */ diff --git a/libavcodec/rpi_hevcpred_template.c b/libavcodec/rpi_hevcpred_template.c new file mode 100644 index 0000000000..f2ebcad332 --- /dev/null +++ b/libavcodec/rpi_hevcpred_template.c @@ -0,0 +1,1407 @@ +/* + * HEVC video decoder + * + * Copyright (C) 2012 - 2013 Guillaume Martres + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" +#include "libavutil/pixdesc.h" +#include "libavutil/rpi_sand_fns.h" +#include "bit_depth_template.c" + +#include "rpi_hevcdec.h" +#include "rpi_hevcpred.h" + +#define DUMP_PRED 0 + +#define POS(x, y) src[(x) + stride * (y)] + +// INCLUDED_ONCE defined at EOF +#ifndef INCLUDED_ONCE +typedef uint8_t (* c8_dst_ptr_t)[2]; +typedef const uint8_t (* c8_src_ptr_t)[2]; +typedef uint16_t (* c16_dst_ptr_t)[2]; +typedef const uint16_t (* c16_src_ptr_t)[2]; + +// *** On ARM make these NEON registers +typedef struct pixel4_16 { + uint16_t x[4]; +} pixel4_16; +typedef struct pixel4_32 { + uint32_t x[4]; +} pixel4_32; +static inline pixel4_16 PIXEL_SPLAT_X4_16(const uint16_t x) +{ + pixel4_16 t = {{x, x, x, x}}; + return t; +} +static inline pixel4_32 PIXEL_SPLAT_X4_32(const uint32_t x) +{ + pixel4_32 t = {{x, x, x, x}}; + return t; +} +#endif + +#if PRED_C +// For chroma we double pixel size so we copy pairs +#undef pixel +#undef pixel2 +#undef pixel4 +#undef dctcoef +#undef INIT_CLIP +#undef no_rnd_avg_pixel4 +#undef rnd_avg_pixel4 +#undef AV_RN2P +#undef AV_RN4P +#undef AV_RN4PA +#undef AV_WN2P +#undef AV_WN4P +#undef AV_WN4PA +#undef CLIP +#undef FUNC +#undef FUNCC +#undef av_clip_pixel +#undef PIXEL_SPLAT_X4 + +#if BIT_DEPTH == 8 +#define pixel uint16_t +#define pixel4 pixel4_16 +#define PIXEL_SPLAT_X4 PIXEL_SPLAT_X4_16 +#define cpel uint8_t +#define c_src_ptr_t c8_src_ptr_t +#define c_dst_ptr_t c8_dst_ptr_t +#else +#define pixel uint32_t +#define pixel4 pixel4_32 +#define PIXEL_SPLAT_X4 PIXEL_SPLAT_X4_32 +#define cpel uint16_t +#define c_src_ptr_t c16_dst_ptr_t +#define c_dst_ptr_t c16_dst_ptr_t +#endif +#define AV_RN4P(p) (*(pixel4*)(p)) +#define AV_WN4P(p,x) (*(pixel4*)(p) = (x)) +#define FUNC(a) FUNC2(a, BIT_DEPTH, _c) +#endif + + +// Get PW prior to horrid PRED_C trickery +#if BIT_DEPTH == 8 +#define PW 1 +#else +#define PW 2 +#endif + + +#if DUMP_PRED && !defined(INCLUDED_ONCE) +static void dump_pred_uv(const uint8_t * data, const unsigned int stride, const unsigned int size) +{ + for (unsigned int y = 0; y != size; y++, data += stride * 2) { + for (unsigned int x = 0; x != size; x++) { + printf("%4d", data[x * 2]); + } + printf("\n"); + } + printf("\n"); +} +#endif + +#ifndef INCLUDED_ONCE +static inline void extend_8(void * ptr, const unsigned int v, unsigned int n) +{ + if ((n >>= 2) != 0) { + uint32_t v4 = v | (v << 8); + uint32_t * p = (uint32_t *)ptr; + v4 = v4 | (v4 << 16); + do { + *p++ = v4; + } while (--n != 0); + } +} + +static inline void extend_16(void * ptr, const unsigned int v, unsigned int n) +{ + if ((n >>= 2) != 0) { + uint32_t v2 = v | (v << 16); + uint32_t * p = (uint32_t *)ptr; + do { + *p++ = v2; + *p++ = v2; + } while (--n != 0); + } +} + +static inline void extend_32(void * ptr, const unsigned int v, unsigned int n) +{ + if ((n >>= 2) != 0) { + uint32_t * p = (uint32_t *)ptr; + do { + *p++ = v; + *p++ = v; + *p++ = v; + *p++ = v; + } while (--n != 0); + } +} + +// Beware that this inverts the avail ordering +// For CIP it seems easier this way round +static unsigned int cip_avail_l(const uint8_t * is_intra, const int i_stride, const unsigned int i_mask, + const unsigned int log2_intra_bits, const unsigned int avail, unsigned int size, + unsigned int s0, unsigned int odd_s) +{ + const unsigned int n = 1 << log2_intra_bits; + unsigned int fa = 0; + unsigned int i; + + size >>= 2; // Now in 4-pel units + s0 >>= 2; + + if ((avail & AVAIL_DL) != 0) + fa |= ((1 << s0) - 1) << (size - s0); + if ((avail & AVAIL_L) != 0) + fa |= ((1 << size) - 1) << size; + if ((avail & AVAIL_UL) != 0) + fa |= 1 << (size << 1); + + if (odd_s) { + if ((fa & 1) != 0 && (*is_intra & i_mask) == 0) + fa &= ~1; + is_intra += i_stride; + } + + for (i = odd_s; (fa >> i) != 0; i += n, is_intra += i_stride) { + const unsigned int m = ((1 << n) - 1) << i; + if ((fa & m) != 0 && (*is_intra & i_mask) == 0) + fa &= ~m; + } + + return fa; +} + +static unsigned int cip_avail_u(const uint8_t * is_intra, unsigned int i_shift, + const unsigned int log2_intra_bits, const unsigned int avail, unsigned int size, + unsigned int s1, unsigned int odd_s) +{ + if ((avail & (AVAIL_U | AVAIL_UR)) == 0) + { + return 0; + } + else + { + const unsigned int n = 1 << log2_intra_bits; + unsigned int fa = 0; + unsigned int i; + unsigned int im = ((is_intra[1] << 8) | (is_intra[0])) >> i_shift; + + size >>= 2; // Now in 4-pel units + s1 >>= 2; + + if ((avail & AVAIL_U) != 0) + fa |= ((1 << size) - 1); + if ((avail & AVAIL_UR) != 0) + fa |= ((1 << s1) - 1) << size; + + if (odd_s) { + fa &= im | ~1; + im >>= 1; + } + + for (i = odd_s; (fa >> i) != 0; i += n, im >>= 1) { + const unsigned int m = ((1 << n) - 1) << i; + if ((im & 1) == 0) + fa &= ~m; + } + return fa; + } +} + + + +static inline unsigned int rmbd(unsigned int x) +{ +#if 1 + return __builtin_ctz(x); +#else + unsigned int n = 0; + if ((x & 0xffff) == 0) { + x >>= 16; + n += 16; + } + if ((x & 0xff) == 0) { + x >>= 8; + n += 8; + } + if ((x & 0xf) == 0) { + x >>= 4; + n += 4; + } + if ((x & 0x3) == 0) { + x >>= 2; + n += 2; + } + + return (x & 1) == 0 ? n + 1 : n; +#endif +} +#endif + + +static void FUNC(cip_fill)(pixel * const left, pixel * const top, + const unsigned int avail_l, const unsigned int avail_u, + const pixel * const src_l, const pixel * const src_u, const pixel * const src_ur, + const unsigned int stride, + const unsigned int size) +{ + pixel a; + unsigned int i; + + // 1st find DL value + if ((avail_l & 1) == 0) { + if (avail_l != 0) + a = src_l[((int)size * 2 - 1 - (int)rmbd(avail_l)*4) * (int)stride]; + else + { + // (avail_l | avail_u) != 0 so this must be good + const unsigned int n = rmbd(avail_u)*4; + a = (n >= size) ? src_ur[n - size] : src_u[n]; + } + } + + // L + { + pixel * d = left + size * 2 - 1; + const pixel * s = src_l + (size * 2 - 1) * stride; + unsigned int x = avail_l; + for (i = 0; i < size * 2; i += 4, x >>= 1) + { + if ((x & 1) != 0) { + // Avail + *d-- = *s; + s -= stride; + *d-- = *s; + s -= stride; + *d-- = *s; + s -= stride; + *d-- = a = *s; + s -= stride; + } + else + { + *d-- = a; + *d-- = a; + *d-- = a; + *d-- = a; + s -= stride * 4; + } + } + // UL + *d = a = (x & 1) != 0 ? *s : a; + } + + // U + { + pixel * d = top; + const pixel * s = src_u; + unsigned int x = avail_u; + + for (i = 0; i < size; i += 4, x >>= 1) + { + if ((x & 1) != 0) { + // Avail + *d++ = *s++; + *d++ = *s++; + *d++ = *s++; + *d++ = a = *s++; + } + else + { + *d++ = a; + *d++ = a; + *d++ = a; + *d++ = a; + s += 4; + } + } + + // UR + s = src_ur; + for (i = 0; i < size; i += 4, x >>= 1) + { + if ((x & 1) != 0) { + // Avail + *d++ = *s++; + *d++ = *s++; + *d++ = *s++; + *d++ = a = *s++; + } + else + { + *d++ = a; + *d++ = a; + *d++ = a; + *d++ = a; + s += 4; + } + } + } +} + + +#if !PRED_C && PW == 1 +#define EXTEND(ptr, val, len) extend_8(ptr, val, len) +#elif (!PRED_C && PW == 2) || (PRED_C && PW == 1) +#define EXTEND(ptr, val, len) extend_16(ptr, val, len) +#else +#define EXTEND(ptr, val, len) extend_32(ptr, val, len) +#endif + +// Reqs: +// +// Planar: DL[0], L, ul, U, UR[0] +// DC: dl, L, ul, U, ur +// A2-9: DL, L, ul, u, ur +// A10: dl, L, ul, u, ur +// A11-17 dl, L, UL, U, ur +// A18-25 dl, L, Ul, U, ur +// A26 dl, l, ul, U, ur +// A27-34 dl, l, ul, U, UR + +#ifndef INCLUDED_ONCE + +intra_filter_fn_t ff_hevc_rpi_intra_filter_8_neon_8; +intra_filter_fn_t ff_hevc_rpi_intra_filter_4_neon_16; +intra_filter_fn_t ff_hevc_rpi_intra_filter_8_neon_16; + +static const uint8_t req_avail_c[35] = +{ + AVAIL_DL | AVAIL_L | 0 | AVAIL_U | AVAIL_UR, // Planar (DL[0] & UR[0] only needed) + AVAIL_L | 0 | AVAIL_U, // DC + AVAIL_DL | AVAIL_L, // 2 + AVAIL_DL | AVAIL_L, // 3 + AVAIL_DL | AVAIL_L, // 4 + AVAIL_DL | AVAIL_L, // 5 + AVAIL_DL | AVAIL_L, // 6 + AVAIL_DL | AVAIL_L, // 7 + AVAIL_DL | AVAIL_L, // 8 + AVAIL_DL | AVAIL_L, // 9 + AVAIL_L, // 10 (H) + AVAIL_L | AVAIL_UL | AVAIL_U, // 11 + AVAIL_L | AVAIL_UL | AVAIL_U, // 12 + AVAIL_L | AVAIL_UL | AVAIL_U, // 13 + AVAIL_L | AVAIL_UL | AVAIL_U, // 14 + AVAIL_L | AVAIL_UL | AVAIL_U, // 15 + AVAIL_L | AVAIL_UL | AVAIL_U, // 16 + AVAIL_L | AVAIL_UL | AVAIL_U, // 17 + AVAIL_L | AVAIL_UL | AVAIL_U, // 18 + AVAIL_L | AVAIL_UL | AVAIL_U, // 19 + AVAIL_L | AVAIL_UL | AVAIL_U, // 20 + AVAIL_L | AVAIL_UL | AVAIL_U, // 21 + AVAIL_L | AVAIL_UL | AVAIL_U, // 22 + AVAIL_L | AVAIL_UL | AVAIL_U, // 23 + AVAIL_L | AVAIL_UL | AVAIL_U, // 24 + AVAIL_L | AVAIL_UL | AVAIL_U, // 25 + AVAIL_U, // 26 (V) + AVAIL_U | AVAIL_UR, // 27 + AVAIL_U | AVAIL_UR, // 28 + AVAIL_U | AVAIL_UR, // 29 + AVAIL_U | AVAIL_UR, // 30 + AVAIL_U | AVAIL_UR, // 31 + AVAIL_U | AVAIL_UR, // 32 + AVAIL_U | AVAIL_UR, // 33 + AVAIL_U | AVAIL_UR // 34 +}; + +static const uint8_t req_avail[4][35] = { +{ + AVAIL_DL | AVAIL_L | 0 | AVAIL_U | AVAIL_UR, // Planar (DL[0] & UR[0] only needed) + AVAIL_L | 0 | AVAIL_U, // DC + AVAIL_DL | AVAIL_L, // 2 + AVAIL_DL | AVAIL_L, // 3 + AVAIL_DL | AVAIL_L, // 4 + AVAIL_DL | AVAIL_L, // 5 + AVAIL_DL | AVAIL_L, // 6 + AVAIL_DL | AVAIL_L, // 7 + AVAIL_DL | AVAIL_L, // 8 + AVAIL_DL | AVAIL_L, // 9 + AVAIL_L | AVAIL_UL | AVAIL_U, // 10 (H) + AVAIL_L | AVAIL_UL | AVAIL_U, // 11 + AVAIL_L | AVAIL_UL | AVAIL_U, // 12 + AVAIL_L | AVAIL_UL | AVAIL_U, // 13 + AVAIL_L | AVAIL_UL | AVAIL_U, // 14 + AVAIL_L | AVAIL_UL | AVAIL_U, // 15 + AVAIL_L | AVAIL_UL | AVAIL_U, // 16 + AVAIL_L | AVAIL_UL | AVAIL_U, // 17 + AVAIL_L | AVAIL_UL | AVAIL_U, // 18 + AVAIL_L | AVAIL_UL | AVAIL_U, // 19 + AVAIL_L | AVAIL_UL | AVAIL_U, // 20 + AVAIL_L | AVAIL_UL | AVAIL_U, // 21 + AVAIL_L | AVAIL_UL | AVAIL_U, // 22 + AVAIL_L | AVAIL_UL | AVAIL_U, // 23 + AVAIL_L | AVAIL_UL | AVAIL_U, // 24 + AVAIL_L | AVAIL_UL | AVAIL_U, // 25 + AVAIL_L | AVAIL_UL | AVAIL_U, // 26 (V) + AVAIL_U | AVAIL_UR, // 27 + AVAIL_U | AVAIL_UR, // 28 + AVAIL_U | AVAIL_UR, // 29 + AVAIL_U | AVAIL_UR, // 30 + AVAIL_U | AVAIL_UR, // 31 + AVAIL_U | AVAIL_UR, // 32 + AVAIL_U | AVAIL_UR, // 33 + AVAIL_U | AVAIL_UR // 34 +}, +{ // 3 + AVAIL_DL | AVAIL_L | 0 | AVAIL_U | AVAIL_UR | FILTER_LIGHT, // Planar (DL[0] & UR[0] only needed) + AVAIL_L | 0 | AVAIL_U, // DC + AVAIL_DL | AVAIL_L | FILTER_LIGHT, // 2 + AVAIL_DL | AVAIL_L | 0, // 3 + AVAIL_DL | AVAIL_L | 0, // 4 + AVAIL_DL | AVAIL_L | 0, // 5 + AVAIL_DL | AVAIL_L | 0, // 6 + AVAIL_DL | AVAIL_L | 0, // 7 + AVAIL_DL | AVAIL_L | 0, // 8 + AVAIL_DL | AVAIL_L | 0, // 9 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 10 (H) + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 11 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 12 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 13 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 14 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 15 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 16 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 17 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_LIGHT, // 18 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 19 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 20 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 21 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 22 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 23 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 24 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 25 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 26 (V) + AVAIL_U | AVAIL_UR | 0, // 27 + AVAIL_U | AVAIL_UR | 0, // 28 + AVAIL_U | AVAIL_UR | 0, // 29 + AVAIL_U | AVAIL_UR | 0, // 30 + AVAIL_U | AVAIL_UR | 0, // 31 + AVAIL_U | AVAIL_UR | 0, // 32 + AVAIL_U | AVAIL_UR | 0, // 33 + AVAIL_U | AVAIL_UR | FILTER_LIGHT // 34 +}, +{ // 4 + AVAIL_DL | AVAIL_L | 0 | AVAIL_U | AVAIL_UR | FILTER_LIGHT, // Planar (DL[0] & UR[0] only needed) + AVAIL_L | 0 | AVAIL_U, // DC + AVAIL_DL | AVAIL_L | FILTER_LIGHT, // 2 + AVAIL_DL | AVAIL_L | FILTER_LIGHT, // 3 + AVAIL_DL | AVAIL_L | FILTER_LIGHT, // 4 + AVAIL_DL | AVAIL_L | FILTER_LIGHT, // 5 + AVAIL_DL | AVAIL_L | FILTER_LIGHT, // 6 + AVAIL_DL | AVAIL_L | FILTER_LIGHT, // 7 + AVAIL_DL | AVAIL_L | FILTER_LIGHT, // 8 + AVAIL_DL | AVAIL_L | 0, // 9 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 10 (H) + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 11 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_LIGHT, // 12 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_LIGHT, // 13 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_LIGHT, // 14 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_LIGHT, // 15 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_LIGHT, // 16 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_LIGHT, // 17 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_LIGHT, // 18 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_LIGHT, // 19 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_LIGHT, // 20 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_LIGHT, // 21 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_LIGHT, // 22 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_LIGHT, // 23 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_LIGHT, // 24 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 25 + AVAIL_L | AVAIL_UL | AVAIL_U | 0, // 26 (V) + AVAIL_U | AVAIL_UR | 0, // 27 + AVAIL_U | AVAIL_UR | FILTER_LIGHT, // 28 + AVAIL_U | AVAIL_UR | FILTER_LIGHT, // 29 + AVAIL_U | AVAIL_UR | FILTER_LIGHT, // 30 + AVAIL_U | AVAIL_UR | FILTER_LIGHT, // 31 + AVAIL_U | AVAIL_UR | FILTER_LIGHT, // 32 + AVAIL_U | AVAIL_UR | FILTER_LIGHT, // 33 + AVAIL_U | AVAIL_UR | FILTER_LIGHT // 34 +}, +{ // 5 + AVAIL_DL | AVAIL_L | 0 | AVAIL_U | AVAIL_UR | FILTER_EITHER, // Planar (DL[0] & UR[0] only needed) + AVAIL_L | 0 | AVAIL_U, // DC + AVAIL_DL | AVAIL_L | FILTER_EITHER, // 2 + AVAIL_DL | AVAIL_L | FILTER_EITHER, // 3 + AVAIL_DL | AVAIL_L | FILTER_EITHER, // 4 + AVAIL_DL | AVAIL_L | FILTER_EITHER, // 5 + AVAIL_DL | AVAIL_L | FILTER_EITHER, // 6 + AVAIL_DL | AVAIL_L | FILTER_EITHER, // 7 + AVAIL_DL | AVAIL_L | FILTER_EITHER, // 8 + AVAIL_DL | AVAIL_L | FILTER_EITHER, // 9 + AVAIL_L | 0, // 10 (H) + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_EITHER, // 11 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_EITHER, // 12 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_EITHER, // 13 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_EITHER, // 14 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_EITHER, // 15 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_EITHER, // 16 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_EITHER, // 17 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_EITHER, // 18 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_EITHER, // 19 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_EITHER, // 20 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_EITHER, // 21 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_EITHER, // 22 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_EITHER, // 23 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_EITHER, // 24 + AVAIL_L | AVAIL_UL | AVAIL_U | FILTER_EITHER, // 25 + AVAIL_U | 0, // 26 (V) + AVAIL_U | AVAIL_UR | FILTER_EITHER, // 27 + AVAIL_U | AVAIL_UR | FILTER_EITHER, // 28 + AVAIL_U | AVAIL_UR | FILTER_EITHER, // 29 + AVAIL_U | AVAIL_UR | FILTER_EITHER, // 30 + AVAIL_U | AVAIL_UR | FILTER_EITHER, // 31 + AVAIL_U | AVAIL_UR | FILTER_EITHER, // 32 + AVAIL_U | AVAIL_UR | FILTER_EITHER, // 33 + AVAIL_U | AVAIL_UR | FILTER_EITHER // 34 +} +}; + + +#endif + +#define filter_light1 FUNC(filter_light1) +static inline pixel filter_light1(pixel a, pixel b, pixel c) +{ + return (a + b*2 + c + 2) >> 2; +} + +#define filter_light FUNC(filter_light) +static inline void filter_light(pixel * dst, pixel p1, const pixel * src, const pixel pn, const int sstride, const unsigned int n) +{ + pixel p0; + pixel p2 = *src; + // Allow for final pel - it is just clearer to to have the call take the actual number of output pels + unsigned int n_minus_1 = n - 1; + + do + { + src += sstride; + p0 = p1; + p1 = p2; + p2 = *src; + *dst++ = filter_light1(p0, p1, p2); + } while (--n_minus_1 != 0); + *dst = filter_light1(p1, p2, pn); +} + +#define filter_strong FUNC(filter_strong) +static inline void filter_strong(pixel * dst, const unsigned int p0, const unsigned int p1, unsigned int n) +{ + unsigned int a = 64 * p0 + 32; + const int v = p1 - p0; + + do + { + *dst++ = (a += v) >> 6; + } while (--n != 0); +} + +#define intra_filter FUNC(intra_filter) +static av_always_inline void intra_filter( + pixel * const left, pixel * const top, + const unsigned int req, const unsigned int avail, + const pixel * const src_l, const pixel * const src_u, const pixel * const src_ur, + const unsigned int stride, + const unsigned int top_right_size, const unsigned int down_left_size, + const unsigned int log2_size) +{ + const unsigned int strong_threshold = 1 << (BIT_DEPTH - 5); + const unsigned int size = 1 << log2_size; + + // a_ is the first pel in a section working round dl -> ur + // b_ is the last + // Beware that top & left work out from UL so usage of a_ & b_ may + // swap between them. It is a bad naming scheme but I have found no + // better + const pixel * a_dl = src_l + (down_left_size + size - 1) * stride; + const pixel * b_dl = src_l + size * stride; + const pixel * a_l = src_l + (size - 1) * stride; + const pixel * b_l = src_l; + const pixel * ab_ul = src_l - stride; + const pixel * a_u = src_u; + const pixel * b_u = src_u + size - 1; + const pixel * a_ur = src_ur; + const pixel * b_ur = src_ur + top_right_size - 1; + + const unsigned int want = req & ~avail; + const unsigned int have = req & avail; + unsigned int i; + + if ((avail & AVAIL_DL) == 0) + { + a_dl = a_ur; + if ((avail & AVAIL_U) != 0) + a_dl = a_u; + if ((avail & AVAIL_UL) != 0) + a_dl = ab_ul; + if ((avail & AVAIL_L) != 0) + a_dl = a_l; + b_dl = a_dl; + } + + if ((avail & AVAIL_L) == 0) + { + a_l = b_dl; + b_l = b_dl; + } + if ((avail & AVAIL_UL) == 0) + { + ab_ul = b_l; + } + if ((avail & AVAIL_U) == 0) + { + a_u = ab_ul; + b_u = ab_ul; + } + if ((avail & AVAIL_UR) == 0) + { + a_ur = b_u; + b_ur = b_u; + } + + if ((req & FILTER_LIGHT) == 0 || PRED_C || log2_size == 2) // PRED_C, log2_size compiler opt hints + { + if ((req & AVAIL_UL) != 0) + left[-1] = *ab_ul; + + if ((want & AVAIL_L) != 0) + EXTEND(left, *a_l, size); + if ((want & AVAIL_DL) != 0) + EXTEND(left + size, *a_dl, size); + if ((want & AVAIL_U) != 0) + EXTEND(top, *a_u, size); + if ((want & AVAIL_UR) != 0) + EXTEND(top + size, *a_ur, size); + + if ((have & AVAIL_U) != 0) + // Always good - even with sand + memcpy(top, a_u, size * sizeof(pixel)); + if ((have & AVAIL_UR) != 0) + { + memcpy(top + size, a_ur, top_right_size * sizeof(pixel)); + EXTEND(top + size + top_right_size, *b_ur, + size - top_right_size); + } + if ((have & AVAIL_L) != 0) + { + for (i = 0; i < size; i++) + left[i] = b_l[stride * i]; + } + if ((have & AVAIL_DL) != 0) + { + for (i = 0; i < down_left_size; i++) + left[i + size] = b_dl[stride * i]; + EXTEND(left + size + down_left_size, *a_dl, + size - down_left_size); + } + } + else if ((req & FILTER_STRONG) != 0 && log2_size == 5 && // log2_size compiler opt hint + FFABS((int)(*a_dl - *a_l * 2 + *ab_ul)) < strong_threshold && + FFABS((int)(*ab_ul - *b_u * 2 + *b_ur)) < strong_threshold) + { + if ((req & (AVAIL_U | AVAIL_UR)) != 0) + filter_strong(top, *ab_ul, *b_ur, size * 2); + left[-1] = *ab_ul; + if ((req & (AVAIL_L | AVAIL_DL)) != 0) + filter_strong(left, *ab_ul, *a_dl, size*2); + } + else + { + // Same code for both have & want for UL + if ((req & AVAIL_UL) != 0) + { + left[-1] = filter_light1(*b_l, *ab_ul, *a_u); + } + + if ((want & AVAIL_L) != 0) + { + EXTEND(left, *a_l, size); + left[0] = (*a_l * 3 + *ab_ul + 2) >> 2; + } + if ((want & AVAIL_DL) != 0) + { + // If we want DL then it cannot be avail so a_dl = a_l so no edge rounding + EXTEND(left + size, *a_l, size); + } + if ((want & AVAIL_U) != 0) + { + EXTEND(top, *a_u, size); + top[size - 1] = (*a_u * 3 + *a_ur + 2) >> 2; + } + if ((want & AVAIL_UR) != 0) + { + // If we want UR then it cannot be avail so a_ur = b_u so no edge rounding + EXTEND(top + size, *a_ur, size); + } + + if ((have & AVAIL_U) != 0) + { + filter_light(top, *ab_ul, a_u, *a_ur, 1, size); + } + if ((have & AVAIL_UR) != 0) { + filter_light(top + size, *b_u, a_ur, *b_ur, 1, top_right_size); + top[size*2 - 1] = *b_ur; + EXTEND(top + size + top_right_size, *b_ur, size - top_right_size); + } + if ((have & AVAIL_L) != 0) + { + filter_light(left, *ab_ul, b_l, *b_dl, stride, size); + } + if ((have & AVAIL_DL) != 0) + { + filter_light(left + size, *a_l, b_dl, *a_dl, stride, down_left_size); + left[size*2 - 1] = *a_dl; + EXTEND(left + size + down_left_size, *a_dl, size - down_left_size); + } + } +} + +#define INTRA_FILTER(log2_size) \ +static void FUNC(intra_filter_ ## log2_size)( \ + uint8_t * const left, uint8_t * const top, \ + const unsigned int req, const unsigned int avail, \ + const uint8_t * const src_l, const uint8_t * const src_u, const uint8_t * const src_ur, \ + const unsigned int stride, \ + const unsigned int top_right_size, const unsigned int down_left_size) \ +{ \ + intra_filter((pixel *)left, (pixel *)top, req, avail, \ + (const pixel *)src_l, (const pixel *)src_u, (const pixel *)src_ur, stride / sizeof(pixel), top_right_size, down_left_size, log2_size); \ +} + +INTRA_FILTER(2) +INTRA_FILTER(3) +INTRA_FILTER(4) +INTRA_FILTER(5) + +#undef intra_filter +#undef INTRA_FILTER + +static void FUNC(intra_pred)(const HEVCRpiContext * const s, + const enum IntraPredMode mode, const unsigned int x0, const unsigned int y0, const unsigned int avail, + const unsigned int log2_size) +{ + // c_idx will alaways be 1 for _c versions and 0 for y + const unsigned int c_idx = PRED_C; + const unsigned int hshift = ctx_hshift(s, c_idx); + const unsigned int vshift = ctx_vshift(s, c_idx); + const unsigned int size = (1 << log2_size); + const unsigned int x = x0 >> hshift; + const unsigned int y = y0 >> vshift; + + const ptrdiff_t stride = frame_stride1(s->frame, c_idx) / sizeof(pixel); + pixel *const src = c_idx == 0 ? + (pixel *)av_rpi_sand_frame_pos_y(s->frame, x, y) : + (pixel *)av_rpi_sand_frame_pos_c(s->frame, x, y); + + // Align so we can do multiple loads in the asm + // Padded to 16 byte boundary so as not to confuse anything + DECLARE_ALIGNED(16, pixel, top[2 * MAX_TB_SIZE]); + DECLARE_ALIGNED(16, pixel, left_array[2 * MAX_TB_SIZE + 16 / sizeof(pixel)]); + + pixel * const left = left_array + 16 / sizeof(pixel); + const pixel * top_pred = top; + + const pixel * src_l = src - 1; + const pixel * src_u = src - stride; + const pixel * src_ur = src_u + size; +#if !PRED_C + const unsigned int req = req_avail[log2_size - 2][mode] & ~s->ps.sps->intra_filters_disable; +#else + const unsigned int req = req_avail_c[mode]; +#endif + + // If we have nothing to pred from then fill with grey + // This isn't a common case but dealing with it here means we don't have to + // test for it later + if (avail == 0) + { +dc_only: +#if !PRED_C + s->hpc.pred_dc0[log2_size - 2]((uint8_t *)src, stride); +#else + s->hpc.pred_dc0_c[log2_size - 2]((uint8_t *)src, stride); +#endif + return; + } + + { + // N.B. stride is in pixels (not bytes) or in the case of chroma pixel-pairs + const AVFrame * const frame = s->frame; + const unsigned int mask = stride - 1; // For chroma pixel=uint16 so stride_c is stride_y / 2 + const unsigned int stripe_adj = (av_rpi_sand_frame_stride2(frame) - 1) * stride; + if ((x & mask) == 0) + src_l -= stripe_adj; + if (((x + size) & mask) == 0) + src_ur += stripe_adj; + } + + // Can deal with I-slices in 'normal' code even if CIP + // This also means that we don't need to generate (elsewhere) is_intra + // for IRAP frames + if (s->ps.pps->constrained_intra_pred_flag == 1 && + s->sh.slice_type != HEVC_SLICE_I) + { + // * If we ever actually care about CIP performance then we should + // special case out size 4 stuff (can be done by 'normal') and + // have 8-pel avail masks + unsigned int avail_l = cip_avail_l(s->is_intra + ((y + size * 2 - 1) >> (3 - vshift)) * s->ps.sps->pcm_width + ((x - 1) >> (6 - hshift)), + -(int)(s->ps.sps->pcm_width), + 1 << (((x - 1) >> (3 - hshift)) & 7), + 1 - hshift, + avail, + size, + FFMIN(size, ((s->ps.sps->height - y0) >> vshift) - size), + vshift != 0 ? 0 : (y >> 2) & 1); + + unsigned int avail_u = cip_avail_u(s->is_intra + ((y - 1) >> (3 - vshift)) * s->ps.sps->pcm_width + (x >> (6 - hshift)), + (x >> (3 - hshift)) & 7, + 1 - hshift, + avail, + size, + FFMIN(size, ((s->ps.sps->width - x0) >> hshift) - size), + hshift != 0 ? 0 : (x >> 2) & 1); + + // Anything left? + if ((avail_l | avail_u) == 0) + goto dc_only; + + FUNC(cip_fill)(left, top, avail_l, avail_u, src_l, src_u, src_ur, stride, size); + +#if !PRED_C + if ((req & FILTER_LIGHT) != 0) + { + const unsigned threshold = 1 << (BIT_DEPTH - 5); + if ((req & FILTER_STRONG) != 0 && + (int)(FFABS(left[-1] + top[63] - 2 * top[31])) < threshold && + (int)(FFABS(left[-1] + left[63] - 2 * left[31])) < threshold) + { + filter_strong(top, left[-1], top[63], 64); + filter_strong(left, left[-1], left[63], 64); + } else + { + // LHS writes UL too so copy for top + const pixel p_ul = left[-1]; + filter_light(left - 1, top[0], left - 1, left[2*size - 1], 1, 2*size); + filter_light(top, p_ul, top, top[2*size - 1], 1, 2*size - 1); + } + } +#endif + } + else + { + const unsigned int ur_size = FFMIN(size, ((s->ps.sps->width - x0) >> hshift) - size); + if ((req & ~((AVAIL_UR | AVAIL_U) & avail)) == 0 && + ((req & AVAIL_UR) == 0 || src_u + 2*size == src_ur + ur_size)) + { + top_pred = src_u; + } + else + { +#if !PRED_C + s->hpc.intra_filter[log2_size - 2] +#else + s->hpc.intra_filter_c[log2_size - 2] +#endif + ((uint8_t *)left, (uint8_t *)top, req, avail, + (const uint8_t *)src_l, (const uint8_t *)src_u, (const uint8_t *)src_ur, stride * sizeof(pixel), + ur_size, + FFMIN(size, ((s->ps.sps->height - y0) >> vshift) - size)); + } + } + + +#if !PRED_C + switch (mode) { + case INTRA_PLANAR: + s->hpc.pred_planar[log2_size - 2]((uint8_t *)src, (uint8_t *)top_pred, + (uint8_t *)left, stride); + break; + case INTRA_DC: + s->hpc.pred_dc[log2_size - 2]((uint8_t *)src, (uint8_t *)top_pred, + (uint8_t *)left, stride); + break; + case INTRA_ANGULAR_HORIZONTAL: + s->hpc.pred_horizontal[log2_size - 2]((uint8_t *)src, (uint8_t *)top_pred, + (uint8_t *)left, stride, + mode); + break; + case INTRA_ANGULAR_VERTICAL: + s->hpc.pred_vertical[log2_size - 2]((uint8_t *)src, (uint8_t *)top_pred, + (uint8_t *)left, stride, + mode); + break; + default: + s->hpc.pred_angular[log2_size - 2]((uint8_t *)src, (uint8_t *)top_pred, + (uint8_t *)left, stride, + mode); + break; + } +#else + switch (mode) { + case INTRA_PLANAR: + s->hpc.pred_planar_c[log2_size - 2]((uint8_t *)src, (uint8_t *)top_pred, + (uint8_t *)left, stride); + break; + case INTRA_DC: + s->hpc.pred_dc_c[log2_size - 2]((uint8_t *)src, (uint8_t *)top_pred, + (uint8_t *)left, stride); + break; + case INTRA_ANGULAR_HORIZONTAL: + s->hpc.pred_horizontal_c[log2_size - 2]((uint8_t *)src, (uint8_t *)top_pred, + (uint8_t *)left, stride, + mode); + break; + case INTRA_ANGULAR_VERTICAL: + s->hpc.pred_vertical_c[log2_size - 2]((uint8_t *)src, (uint8_t *)top_pred, + (uint8_t *)left, stride, + mode); + break; + default: + s->hpc.pred_angular_c[log2_size - 2]((uint8_t *)src, (uint8_t *)top_pred, + (uint8_t *)left, stride, + mode); + break; + } + +#if DUMP_PRED + printf("U pred @ %d, %d: mode=%d\n", x, y, mode); + dump_pred_uv((uint8_t *)src, stride, 1 << log2_size); + printf("V pred @ %d, %d: mode=%d\n", x, y, mode); + dump_pred_uv((uint8_t *)src + 1, stride, 1 << log2_size); +#endif +#endif +} + +#if !PRED_C +static av_always_inline void FUNC(pred_planar)(uint8_t *_src, const uint8_t *_top, + const uint8_t *_left, ptrdiff_t stride, + int trafo_size) +{ + int x, y; + pixel *src = (pixel *)_src; + const pixel *top = (const pixel *)_top; + const pixel *left = (const pixel *)_left; + int size = 1 << trafo_size; + for (y = 0; y < size; y++) + for (x = 0; x < size; x++) + POS(x, y) = ((size - 1 - x) * left[y] + (x + 1) * top[size] + + (size - 1 - y) * top[x] + (y + 1) * left[size] + size) >> (trafo_size + 1); +} +#else +static av_always_inline void FUNC(pred_planar)(uint8_t * _src, const uint8_t * _top, + const uint8_t * _left, ptrdiff_t stride, + int trafo_size) +{ + int x, y; + int size = 1 << trafo_size; + c_dst_ptr_t src = (c_dst_ptr_t)_src; + const c_src_ptr_t top = (c_src_ptr_t)_top; + const c_src_ptr_t left = (c_src_ptr_t)_left; + + for (y = 0; y < size; y++, src += stride) + { + for (x = 0; x < size; x++) + { + src[x][0] = ((size - 1 - x) * left[y][0] + (x + 1) * top[size][0] + + (size - 1 - y) * top[x][0] + (y + 1) * left[size][0] + size) >> (trafo_size + 1); + src[x][1] = ((size - 1 - x) * left[y][1] + (x + 1) * top[size][1] + + (size - 1 - y) * top[x][1] + (y + 1) * left[size][1] + size) >> (trafo_size + 1); + } + } +} +#endif + +#define PRED_PLANAR(size)\ +static void FUNC(pred_planar_ ## size)(uint8_t *src, const uint8_t *top, \ + const uint8_t *left, ptrdiff_t stride) \ +{ \ + FUNC(pred_planar)(src, top, left, stride, size + 2); \ +} + +PRED_PLANAR(0) +PRED_PLANAR(1) +PRED_PLANAR(2) +PRED_PLANAR(3) + +#undef PRED_PLANAR + +#if !PRED_C +static void FUNC(pred_dc)(uint8_t *_src, const uint8_t *_top, + const uint8_t *_left, + ptrdiff_t stride, int log2_size) +{ + int i, j, x, y; + int size = (1 << log2_size); + pixel *src = (pixel *)_src; + const pixel *top = (const pixel *)_top; + const pixel *left = (const pixel *)_left; + int dc = size; + pixel4 a; + for (i = 0; i < size; i++) + dc += left[i] + top[i]; + + dc >>= log2_size + 1; + + a = PIXEL_SPLAT_X4(dc); + + for (i = 0; i < size; i++) + for (j = 0; j < size; j+=4) + AV_WN4P(&POS(j, i), a); + +// if (c_idx == 0 && size < 32) +// As we now have separate fns for y & c - no need to test that + if (size < 32) + { + POS(0, 0) = (left[0] + 2 * dc + top[0] + 2) >> 2; + for (x = 1; x < size; x++) + POS(x, 0) = (top[x] + 3 * dc + 2) >> 2; + for (y = 1; y < size; y++) + POS(0, y) = (left[y] + 3 * dc + 2) >> 2; + } +} +#else +static void FUNC(pred_dc)(uint8_t *_src, const uint8_t *_top, + const uint8_t *_left, + ptrdiff_t stride, int log2_size) +{ + unsigned int i, j; + const unsigned int size = (1 << log2_size); + c_dst_ptr_t src = (c_dst_ptr_t)_src; + const c_src_ptr_t top = (c_src_ptr_t)_top; + const c_src_ptr_t left = (c_src_ptr_t)_left; + unsigned int dc0 = size; + unsigned int dc1 = size; + + for (i = 0; i < size; i++) + { + dc0 += left[i][0] + top[i][0]; + dc1 += left[i][1] + top[i][1]; + } + + dc0 >>= log2_size + 1; + dc1 >>= log2_size + 1; + + for (i = 0; i < size; i++, src += stride) + { + for (j = 0; j < size; ++j) + { + src[j][0] = dc0; + src[j][1] = dc1; + + } + } +} +#endif + +#define PRED_DC(size)\ +static void FUNC(pred_dc_ ## size)(uint8_t *src, const uint8_t *top, \ + const uint8_t *left, ptrdiff_t stride) \ +{ \ + FUNC(pred_dc)(src, top, left, stride, size + 2); \ +} + +PRED_DC(0) +PRED_DC(1) +PRED_DC(2) +PRED_DC(3) + +#undef PRED_DC + + + + +#if !PRED_C +static void FUNC(pred_dc0)(uint8_t *_src, ptrdiff_t stride, int log2_size) +{ + int i, j; + int size = (1 << log2_size); + pixel *src = (pixel *)_src; + pixel4 a = PIXEL_SPLAT_X4(1 << (BIT_DEPTH - 1)); + + for (i = 0; i < size; i++) + for (j = 0; j < size; j+=4) + AV_WN4P(&POS(j, i), a); +} +#else +static void FUNC(pred_dc0)(uint8_t *_src, ptrdiff_t stride, int log2_size) +{ + unsigned int i, j; + const unsigned int size = (1 << log2_size); + c_dst_ptr_t src = (c_dst_ptr_t)_src; + const pixel a = (1 << (BIT_DEPTH - 1)); + + for (i = 0; i < size; i++, src += stride) + { + for (j = 0; j < size; ++j) + { + src[j][0] = a; + src[j][1] = a; + } + } +} +#endif + +#define PRED_DC0(size)\ +static void FUNC(pred_dc0_ ## size)(uint8_t *src, ptrdiff_t stride) \ +{ \ + FUNC(pred_dc0)(src, stride, size + 2); \ +} + +PRED_DC0(0) +PRED_DC0(1) +PRED_DC0(2) +PRED_DC0(3) + +#undef PRED_DC0 + + + + +#ifndef ANGLE_CONSTS +#define ANGLE_CONSTS +static const int intra_pred_angle[] = { + 32, 26, 21, 17, 13, 9, 5, 2, 0, -2, -5, -9, -13, -17, -21, -26, -32, + -26, -21, -17, -13, -9, -5, -2, 0, 2, 5, 9, 13, 17, 21, 26, 32 +}; +static const int inv_angle[] = { + -4096, -1638, -910, -630, -482, -390, -315, -256, -315, -390, -482, + -630, -910, -1638, -4096 +}; +#endif + +#if !PRED_C +static av_always_inline void FUNC(pred_angular)(uint8_t *_src, + const uint8_t *_top, + const uint8_t *_left, + ptrdiff_t stride, + int mode, int size) +{ + int x, y; + pixel *src = (pixel *)_src; + const pixel *top = (const pixel *)_top; + const pixel *left = (const pixel *)_left; + + int angle = intra_pred_angle[mode - 2]; + pixel ref_array[3 * MAX_TB_SIZE + 4]; + pixel *ref_tmp = ref_array + size; + const pixel *ref; + int last = (size * angle) >> 5; + + if (mode >= 18) { + ref = top - 1; + + if (angle < 0) + { + memcpy(ref_tmp + 1, top, size * PW); + ref_tmp[0] = left[-1]; + + for (x = last; x <= -1; x++) + ref_tmp[x] = left[-1 + ((x * inv_angle[mode - 11] + 128) >> 8)]; + ref = ref_tmp; + } + + for (y = 0; y < size; y++) { + int idx = ((y + 1) * angle) >> 5; + int fact = ((y + 1) * angle) & 31; + if (fact) { + for (x = 0; x < size; x += 4) { + POS(x , y) = ((32 - fact) * ref[x + idx + 1] + + fact * ref[x + idx + 2] + 16) >> 5; + POS(x + 1, y) = ((32 - fact) * ref[x + 1 + idx + 1] + + fact * ref[x + 1 + idx + 2] + 16) >> 5; + POS(x + 2, y) = ((32 - fact) * ref[x + 2 + idx + 1] + + fact * ref[x + 2 + idx + 2] + 16) >> 5; + POS(x + 3, y) = ((32 - fact) * ref[x + 3 + idx + 1] + + fact * ref[x + 3 + idx + 2] + 16) >> 5; + } + } else { + for (x = 0; x < size; x += 4) + AV_WN4P(&POS(x, y), AV_RN4P(&ref[x + idx + 1])); + } + } + if (mode == 26 && size < 32) { + for (y = 0; y < size; y++) + POS(0, y) = av_clip_pixel(top[0] + ((left[y] - left[-1]) >> 1)); + } + + } else { + ref = left - 1; + if (angle < 0 && last < -1) { + for (x = 0; x <= size; x += 4) + AV_WN4P(&ref_tmp[x], AV_RN4P(&left[x - 1])); + // Inv angle <= -256 so top offset >= 0 + for (x = last; x <= -1; x++) + ref_tmp[x] = top[-1 + ((x * inv_angle[mode - 11] + 128) >> 8)]; + ref = ref_tmp; + } + + for (x = 0; x < size; x++) { + int idx = ((x + 1) * angle) >> 5; + int fact = ((x + 1) * angle) & 31; + if (fact) { + for (y = 0; y < size; y++) { + POS(x, y) = ((32 - fact) * ref[y + idx + 1] + + fact * ref[y + idx + 2] + 16) >> 5; + } + } else { + for (y = 0; y < size; y++) + POS(x, y) = ref[y + idx + 1]; + } + } + if (mode == 10 && size < 32) { + for (x = 0; x < size; x += 4) { + POS(x, 0) = av_clip_pixel(left[0] + ((top[x ] - left[-1]) >> 1)); + POS(x + 1, 0) = av_clip_pixel(left[0] + ((top[x + 1] - left[-1]) >> 1)); + POS(x + 2, 0) = av_clip_pixel(left[0] + ((top[x + 2] - left[-1]) >> 1)); + POS(x + 3, 0) = av_clip_pixel(left[0] + ((top[x + 3] - left[-1]) >> 1)); + } + } + } +} +#else +static av_always_inline void FUNC(pred_angular)(uint8_t *_src, + const uint8_t *_top, + const uint8_t *_left, + ptrdiff_t stride, + int mode, int size) +{ + int x, y; + c_dst_ptr_t src = (c_dst_ptr_t)_src; + c_src_ptr_t top = (c_src_ptr_t)_top; + c_src_ptr_t left = (c_src_ptr_t)_left; + + const int angle = intra_pred_angle[mode - 2]; + cpel ref_array[3 * MAX_TB_SIZE + 4][2]; + c_dst_ptr_t ref_tmp = ref_array + size; + c_src_ptr_t ref; + const int last = (size * angle) >> 5; + + if (mode >= 18) { + ref = top - 1; + if (angle < 0) { + memcpy(ref_tmp + 1, top, size * 2 * PW); + ref_tmp[0][0] = left[-1][0]; + ref_tmp[0][1] = left[-1][1]; + for (x = last; x <= -1; x++) + { + ref_tmp[x][0] = left[-1 + ((x * inv_angle[mode - 11] + 128) >> 8)][0]; + ref_tmp[x][1] = left[-1 + ((x * inv_angle[mode - 11] + 128) >> 8)][1]; + } + ref = (c_src_ptr_t)ref_tmp; + } + + for (y = 0; y < size; y++, src += stride) { + const int idx = ((y + 1) * angle) >> 5; + const int fact = ((y + 1) * angle) & 31; + if (fact) { + for (x = 0; x < size; ++x) { + src[x][0] = ((32 - fact) * ref[x + idx + 1][0] + + fact * ref[x + idx + 2][0] + 16) >> 5; + src[x][1] = ((32 - fact) * ref[x + idx + 1][1] + + fact * ref[x + idx + 2][1] + 16) >> 5; + } + } else { + memcpy(src, ref + idx + 1, size * 2 * PW); + } + } + } else { + ref = left - 1; + if (angle < 0 && last < -1) { + memcpy(ref_tmp, left - 1, (size + 1) * 2 * PW); + for (x = last; x <= -1; x++) + { + ref_tmp[x][0] = top[-1 + ((x * inv_angle[mode - 11] + 128) >> 8)][0]; + ref_tmp[x][1] = top[-1 + ((x * inv_angle[mode - 11] + 128) >> 8)][1]; + } + ref = (c_src_ptr_t)ref_tmp; + } + + for (x = 0; x < size; x++, src++) { + const int idx = ((x + 1) * angle) >> 5; + const int fact = ((x + 1) * angle) & 31; + if (fact) { + for (y = 0; y < size; y++) { + src[y * stride][0] = ((32 - fact) * ref[y + idx + 1][0] + + fact * ref[y + idx + 2][0] + 16) >> 5; + src[y * stride][1] = ((32 - fact) * ref[y + idx + 1][1] + + fact * ref[y + idx + 2][1] + 16) >> 5; + } + } else { + for (y = 0; y < size; y++) + { + src[y * stride][0] = ref[y + idx + 1][0]; + src[y * stride][1] = ref[y + idx + 1][1]; + } + } + } + } +} +#endif + +static void FUNC(pred_angular_0)(uint8_t *src, const uint8_t *top, + const uint8_t *left, + ptrdiff_t stride, int mode) +{ + FUNC(pred_angular)(src, top, left, stride, mode, 1 << 2); +} + +static void FUNC(pred_angular_1)(uint8_t *src, const uint8_t *top, + const uint8_t *left, + ptrdiff_t stride, int mode) +{ + FUNC(pred_angular)(src, top, left, stride, mode, 1 << 3); +} + +static void FUNC(pred_angular_2)(uint8_t *src, const uint8_t *top, + const uint8_t *left, + ptrdiff_t stride, int mode) +{ + FUNC(pred_angular)(src, top, left, stride, mode, 1 << 4); +} + +static void FUNC(pred_angular_3)(uint8_t *src, const uint8_t *top, + const uint8_t *left, + ptrdiff_t stride, int mode) +{ + FUNC(pred_angular)(src, top, left, stride, mode, 1 << 5); +} + +#undef cpel +#undef c_src_ptr_t +#undef c_dst_ptr_t + +#undef EXTEND +#undef POS +#undef PW + +#undef filter_light1 +#undef filter_light +#undef filter_strong +#undef ref_gen + +#ifndef INCLUDED_ONCE +#define INCLUDED_ONCE +#endif + diff --git a/libavcodec/rpi_mailbox.c b/libavcodec/rpi_mailbox.c new file mode 100644 index 0000000000..98a0b104b7 --- /dev/null +++ b/libavcodec/rpi_mailbox.c @@ -0,0 +1,155 @@ +/* +Copyright (c) 2012, Broadcom Europe Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define MAJOR_NUM 100 +#define IOCTL_MBOX_PROPERTY _IOWR(MAJOR_NUM, 0, char *) +#define DEVICE_FILE_NAME "/dev/vcio" + +#include "rpi_mailbox.h" +//#include + +/* + * use ioctl to send mbox property message + */ + +static int mbox_property(int file_desc, void *buf) +{ + int ret_val = ioctl(file_desc, IOCTL_MBOX_PROPERTY, buf); + + if (ret_val < 0) { + printf("ioctl_set_msg failed:%d\n", ret_val); + } + +#ifdef DEBUG + unsigned *p = buf; int i; unsigned size = *(unsigned *)buf; + for (i=0; i +#include +#include +#include + +#include "config.h" + +#include "libavutil/avassert.h" +#include "libavutil/rpi_sand_fns.h" + +#pragma GCC diagnostic push +// Many many redundant decls in the header files +#pragma GCC diagnostic ignored "-Wredundant-decls" +#include +#include +#include +#pragma GCC diagnostic pop + +#include "rpi_mem.h" +#include "rpi_zc_frames.h" + + +#define OPT_PREFER_CMA 0 + +struct rpi_cache_flush_env_s { + struct vcsm_user_clean_invalid2_s v; +}; + + +// GPU memory alloc fns (internal) + +static void gpu_free_internal(GPU_MEM_PTR_T * const p) +{ + if (p->arm != NULL) + vcsm_unlock_ptr(p->arm); + if (p->vcsm_handle != 0) + vcsm_free(p->vcsm_handle); + memset(p, 0, sizeof(*p)); // Ensure we crash hard if we try and use this again +} + + +static int gpu_malloc_internal(GPU_MEM_PTR_T * const p, + const int numbytes, const unsigned int cache_type, const char * const name) +{ + memset(p, 0, sizeof(*p)); + p->numbytes = (numbytes + 255) & ~255; // Round up + + if ((p->vcsm_handle = vcsm_malloc_cache(p->numbytes, cache_type | 0x80, (char *)name)) == 0) + { + av_log(NULL, AV_LOG_ERROR, "Unable to alloc %d bytes from VCSM for %s\n", p->numbytes, name); + goto fail; + } + if ((p->vc_handle = vcsm_vc_hdl_from_hdl(p->vcsm_handle)) == 0) + { + av_log(NULL, AV_LOG_ERROR, "Unable to VC handle from VCSM for %s\n", name); + goto fail; + } + if ((p->arm = vcsm_lock(p->vcsm_handle)) == NULL) + { + av_log(NULL, AV_LOG_ERROR, "Unable to lock handle from VCSM for %s\n", name); + goto fail; + } + if ((p->vc = vcsm_vc_addr_from_hdl(p->vcsm_handle)) == 0) + { + av_log(NULL, AV_LOG_ERROR, "Unable to get VC addr from VCSM for %s\n", name); + goto fail; + } + + return 0; + +fail: + gpu_free_internal(p); + return AVERROR(ENOMEM); +} + +// Public gpu fns + +// Allocate memory on GPU +// Fills in structure

containing ARM pointer, videocore handle, videocore memory address, numbytes +// Returns 0 on success. +// This allocates memory that will not be cached in ARM's data cache. +// Therefore safe to use without data cache flushing. +int gpu_malloc_uncached(int numbytes, GPU_MEM_PTR_T *p) +{ + return gpu_malloc_internal(p, numbytes, VCSM_CACHE_TYPE_NONE, "ffmpeg uncached"); +} + +// This allocates data that will be +// Cached in ARM L2 +// Uncached in VPU L2 +int gpu_malloc_cached(int numbytes, GPU_MEM_PTR_T *p) +{ + return gpu_malloc_internal(p, numbytes, VCSM_CACHE_TYPE_HOST, "ffmpeg cached"); +} + +void gpu_free(GPU_MEM_PTR_T * const p) { + gpu_free_internal(p); +} + +void rpi_mem_gpu_uninit(void) +{ + vcsm_exit(); + bcm_host_deinit(); +} + +int rpi_mem_gpu_init(const unsigned int flags) +{ + const int wants_cma = bcm_host_is_fkms_active(); + int use_cma; + + (void)flags; + + if (vcsm_init_ex(wants_cma ? 1 : 0, -1) == 0) + use_cma = 1; + else if (vcsm_init_ex(wants_cma ? 0 : 1, -1) == 0) + use_cma = 0; + else + return AVERROR(EINVAL); + + bcm_host_init(); + + return use_cma + 1; +} + +// ---------------------------------------------------------------------------- +// +// Cache flush functions + +#define CACHE_EL_MAX ((sizeof(rpi_cache_buf_t) - sizeof (struct vcsm_user_clean_invalid2_s)) / sizeof (struct vcsm_user_clean_invalid2_block_s)) + +rpi_cache_flush_env_t * rpi_cache_flush_init(rpi_cache_buf_t * const buf) +{ + rpi_cache_flush_env_t * const rfe = (rpi_cache_flush_env_t *)buf; + *rfe = (rpi_cache_flush_env_t){.v={.op_count = 0}}; + return rfe; +} + +void rpi_cache_flush_abort(rpi_cache_flush_env_t * const rfe) +{ + // Nothing needed +} + +int rpi_cache_flush_execute(rpi_cache_flush_env_t * const rfe) +{ + int rc = 0; + if (rfe->v.op_count != 0) { + if (vcsm_clean_invalid2(&rfe->v) != 0) + { + const int err = errno; + av_log(NULL, AV_LOG_ERROR, "vcsm_clean_invalid2 failed: errno=%d\n", err); + rc = AVERROR(err); + } + rfe->v.op_count = 0; + } + return rc; +} + +int rpi_cache_flush_finish(rpi_cache_flush_env_t * const rfe) +{ + int rc = rpi_cache_flush_execute(rfe);; + + return rc; +} + +inline void rpi_cache_flush_add_gm_blocks(rpi_cache_flush_env_t * const rfe, const GPU_MEM_PTR_T * const gm, const unsigned int mode, + const unsigned int offset0, const unsigned int block_size, const unsigned int blocks, const unsigned int block_stride) +{ + struct vcsm_user_clean_invalid2_block_s * const b = rfe->v.s + rfe->v.op_count++; + + av_assert1(rfe->v.op_count <= CACHE_EL_MAX); + + b->invalidate_mode = mode; + b->block_count = blocks; + b->start_address = gm->arm + offset0; + b->block_size = block_size; + b->inter_block_stride = block_stride; +} + +void rpi_cache_flush_add_gm_range(rpi_cache_flush_env_t * const rfe, const GPU_MEM_PTR_T * const gm, const unsigned int mode, + const unsigned int offset, const unsigned int size) +{ + // Deal with empty pointer trivially + if (gm == NULL || size == 0) + return; + + av_assert1(offset <= gm->numbytes); + av_assert1(size <= gm->numbytes); + av_assert1(offset + size <= gm->numbytes); + + rpi_cache_flush_add_gm_blocks(rfe, gm, mode, offset, size, 1, 0); +} + +void rpi_cache_flush_add_gm_ptr(rpi_cache_flush_env_t * const rfe, const GPU_MEM_PTR_T * const gm, const unsigned int mode) +{ + rpi_cache_flush_add_gm_blocks(rfe, gm, mode, 0, gm->numbytes, 1, 0); +} + + +void rpi_cache_flush_add_frame(rpi_cache_flush_env_t * const rfe, const AVFrame * const frame, const unsigned int mode) +{ +#if !RPI_ONE_BUF +#error Fixme! (NIF) +#endif + if (gpu_is_buf1(frame)) { + rpi_cache_flush_add_gm_ptr(rfe, gpu_buf1_gmem(frame), mode); + } + else + { + rpi_cache_flush_add_gm_ptr(rfe, gpu_buf3_gmem(frame, 0), mode); + rpi_cache_flush_add_gm_ptr(rfe, gpu_buf3_gmem(frame, 1), mode); + rpi_cache_flush_add_gm_ptr(rfe, gpu_buf3_gmem(frame, 2), mode); + } +} + +// Flush an area of a frame +// Width, height, x0, y0 in luma pels +void rpi_cache_flush_add_frame_block(rpi_cache_flush_env_t * const rfe, const AVFrame * const frame, const unsigned int mode, + const unsigned int x0, const unsigned int y0, const unsigned int width, const unsigned int height, + const unsigned int uv_shift, const int do_luma, const int do_chroma) +{ + const unsigned int y_offset = frame->linesize[0] * y0; + const unsigned int y_size = frame->linesize[0] * height; + // Round UV up/down to get everything + const unsigned int uv_rnd = (1U << uv_shift) >> 1; + const unsigned int uv_offset = frame->linesize[1] * (y0 >> uv_shift); + const unsigned int uv_size = frame->linesize[1] * ((y0 + height + uv_rnd) >> uv_shift) - uv_offset; + +#if 0 + // *** frame->height is cropped height so not good + // As all unsigned they will also reject -ve + // Test individually as well as added to reject overflow + av_assert0(start_line <= (unsigned int)frame->height); // ***** frame height cropped + av_assert0(n <= (unsigned int)frame->height); + av_assert0(start_line + n <= (unsigned int)frame->height); +#endif + + if (!gpu_is_buf1(frame)) + { + if (do_luma) { + rpi_cache_flush_add_gm_range(rfe, gpu_buf3_gmem(frame, 0), mode, y_offset, y_size); + } + if (do_chroma) { + rpi_cache_flush_add_gm_range(rfe, gpu_buf3_gmem(frame, 1), mode, uv_offset, uv_size); + rpi_cache_flush_add_gm_range(rfe, gpu_buf3_gmem(frame, 2), mode, uv_offset, uv_size); + } + } + else if (!av_rpi_is_sand_frame(frame)) + { + const GPU_MEM_PTR_T * const gm = gpu_buf1_gmem(frame); + if (do_luma) { + rpi_cache_flush_add_gm_range(rfe, gm, mode, (frame->data[0] - gm->arm) + y_offset, y_size); + } + if (do_chroma) { + rpi_cache_flush_add_gm_range(rfe, gm, mode, (frame->data[1] - gm->arm) + uv_offset, uv_size); + rpi_cache_flush_add_gm_range(rfe, gm, mode, (frame->data[2] - gm->arm) + uv_offset, uv_size); + } + } + else + { + const unsigned int stride1 = av_rpi_sand_frame_stride1(frame); + const unsigned int stride2 = av_rpi_sand_frame_stride2(frame); + const unsigned int xshl = av_rpi_sand_frame_xshl(frame); + const unsigned int xleft = x0 & ~((stride1 >> xshl) - 1); + const unsigned int block_count = (((x0 + width - xleft) << xshl) + stride1 - 1) / stride1; // Same for Y & C + av_assert1(rfe->v.op_count + do_chroma + do_luma < CACHE_EL_MAX); + + if (do_chroma) + { + struct vcsm_user_clean_invalid2_block_s * const b = rfe->v.s + rfe->v.op_count++; + b->invalidate_mode = mode; + b->block_count = block_count; + b->start_address = av_rpi_sand_frame_pos_c(frame, xleft >> 1, y0 >> 1); + b->block_size = uv_size; + b->inter_block_stride = stride1 * stride2; + } + if (do_luma) + { + struct vcsm_user_clean_invalid2_block_s * const b = rfe->v.s + rfe->v.op_count++; + b->invalidate_mode = mode; + b->block_count = block_count; + b->start_address = av_rpi_sand_frame_pos_y(frame, xleft, y0); + b->block_size = y_size; + b->inter_block_stride = stride1 * stride2; + } + } +} + +// Call this to clean and invalidate a region of memory +void rpi_cache_flush_one_gm_ptr(const GPU_MEM_PTR_T *const p, const rpi_cache_flush_mode_t mode) +{ + rpi_cache_buf_t cbuf; + rpi_cache_flush_env_t * rfe = rpi_cache_flush_init(&cbuf); + rpi_cache_flush_add_gm_ptr(rfe, p, mode); + rpi_cache_flush_finish(rfe); +} + diff --git a/libavcodec/rpi_mem.h b/libavcodec/rpi_mem.h new file mode 100644 index 0000000000..a451079806 --- /dev/null +++ b/libavcodec/rpi_mem.h @@ -0,0 +1,88 @@ +/* +Copyright (c) 2018 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox, Ben Avison +*/ + +#ifndef RPI_MEM_H +#define RPI_MEM_H + +typedef struct gpu_mem_ptr_s { + unsigned char *arm; // Pointer to memory mapped on ARM side + int vc_handle; // Videocore handle of relocatable memory + int vcsm_handle; // Handle for use by VCSM + int vc; // Address for use in GPU code + int numbytes; // Size of memory block +} GPU_MEM_PTR_T; + +// General GPU functions + +#define GPU_INIT_GPU 1 +#define GPU_INIT_CMA 2 + +extern int gpu_malloc_cached(int numbytes, GPU_MEM_PTR_T *p); +extern int gpu_malloc_uncached(int numbytes, GPU_MEM_PTR_T *p); +extern void gpu_free(GPU_MEM_PTR_T * const p); +int rpi_mem_gpu_init(const unsigned int flags); +void rpi_mem_gpu_uninit(void); + +// Cache flush stuff + +struct rpi_cache_flush_env_s; +typedef struct rpi_cache_flush_env_s rpi_cache_flush_env_t; + +typedef struct {uint32_t t[33];} rpi_cache_buf_t; + +rpi_cache_flush_env_t * rpi_cache_flush_init(rpi_cache_buf_t * const buf); +// Free env without flushing +void rpi_cache_flush_abort(rpi_cache_flush_env_t * const rfe); +// Do the accumulated flush & clear but do not free the env +int rpi_cache_flush_execute(rpi_cache_flush_env_t * const rfe); +// Do the accumulated flush & free the env +int rpi_cache_flush_finish(rpi_cache_flush_env_t * const rfe); + +typedef enum +{ + RPI_CACHE_FLUSH_MODE_INVALIDATE = 1, + RPI_CACHE_FLUSH_MODE_WRITEBACK = 2, + RPI_CACHE_FLUSH_MODE_WB_INVALIDATE = 3 +} rpi_cache_flush_mode_t; + +struct AVFrame; +void rpi_cache_flush_add_gm_ptr(rpi_cache_flush_env_t * const rfe, const GPU_MEM_PTR_T * const gm, const rpi_cache_flush_mode_t mode); +void rpi_cache_flush_add_gm_range(rpi_cache_flush_env_t * const rfe, const GPU_MEM_PTR_T * const gm, const rpi_cache_flush_mode_t mode, + const unsigned int offset, const unsigned int size); +void rpi_cache_flush_add_gm_blocks(rpi_cache_flush_env_t * const rfe, const GPU_MEM_PTR_T * const gm, const unsigned int mode, + const unsigned int offset0, const unsigned int block_size, const unsigned int blocks, const unsigned int block_stride); +void rpi_cache_flush_add_frame(rpi_cache_flush_env_t * const rfe, const struct AVFrame * const frame, const rpi_cache_flush_mode_t mode); +void rpi_cache_flush_add_frame_block(rpi_cache_flush_env_t * const rfe, const struct AVFrame * const frame, const rpi_cache_flush_mode_t mode, + const unsigned int x0, const unsigned int y0, const unsigned int width, const unsigned int height, + const unsigned int uv_shift, const int do_luma, const int do_chroma); + +// init, add, finish for one gm ptr +void rpi_cache_flush_one_gm_ptr(const GPU_MEM_PTR_T * const p, const rpi_cache_flush_mode_t mode); + +#endif diff --git a/libavcodec/rpi_qpu.c b/libavcodec/rpi_qpu.c new file mode 100644 index 0000000000..cb7b96119e --- /dev/null +++ b/libavcodec/rpi_qpu.c @@ -0,0 +1,776 @@ +/* +Copyright (c) 2018 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox +*/ + + +#include +#include +#include +#include +#include +#include "libavutil/avassert.h" + +#include "config.h" + +#include +#include + +#include + +#include "rpi_mailbox.h" +#include "rpi_mem.h" +#include "rpi_qpu.h" +#include "rpi_hevc_shader.h" +#include "rpi_hevc_transform8.h" +#include "rpi_hevc_transform10.h" +#include "libavutil/rpi_sand_fns.h" + +// Trace time spent waiting for GPU (VPU/QPU) (1=Yes, 0=No) +#define RPI_TRACE_TIME_VPU_QPU_WAIT 0 + +// Add profile flags to all QPU requests - generates output in "vcdbg log msg" +// Beware this is expensive and will probably throw off all other timing by >10% +#define RPI_TRACE_QPU_PROFILE_ALL 0 + +// QPU "noflush" flags +// a mixture of flushing & profiling + +#define QPU_FLAGS_NO_FLUSH_VPU 1 // If unset VPU cache will be flushed +#define QPU_FLAGS_PROF_CLEAR_AND_ENABLE 2 // Clear & Enable detailed QPU profiling registers +#define QPU_FLAGS_PROF_OUTPUT_COUNTS 4 // Print the results +#define QPU_FLAGS_OUTPUT_QPU_TIMES 8 // Print QPU times - independant of the profiling +#define QPU_FLAGS_NO_FLUSH_QPU 16 // If unset flush QPU caches & TMUs (uniforms always flushed) + +#define vcos_verify_ge0(x) ((x)>=0) + +// Size in 32bit words +#define QPU_CODE_SIZE 4098 +#define VPU_CODE_SIZE 16384 + +static const short rpi_transMatrix2even[32][16] = { // Even rows first +{64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, +{90, 87, 80, 70, 57, 43, 25, 9, -9, -25, -43, -57, -70, -80, -87, -90}, +{89, 75, 50, 18, -18, -50, -75, -89, -89, -75, -50, -18, 18, 50, 75, 89}, +{87, 57, 9, -43, -80, -90, -70, -25, 25, 70, 90, 80, 43, -9, -57, -87}, +{83, 36, -36, -83, -83, -36, 36, 83, 83, 36, -36, -83, -83, -36, 36, 83}, +{80, 9, -70, -87, -25, 57, 90, 43, -43, -90, -57, 25, 87, 70, -9, -80}, +{75, -18, -89, -50, 50, 89, 18, -75, -75, 18, 89, 50, -50, -89, -18, 75}, +{70, -43, -87, 9, 90, 25, -80, -57, 57, 80, -25, -90, -9, 87, 43, -70}, +{64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64}, +{57, -80, -25, 90, -9, -87, 43, 70, -70, -43, 87, 9, -90, 25, 80, -57}, +{50, -89, 18, 75, -75, -18, 89, -50, -50, 89, -18, -75, 75, 18, -89, 50}, +{43, -90, 57, 25, -87, 70, 9, -80, 80, -9, -70, 87, -25, -57, 90, -43}, +{36, -83, 83, -36, -36, 83, -83, 36, 36, -83, 83, -36, -36, 83, -83, 36}, +{25, -70, 90, -80, 43, 9, -57, 87, -87, 57, -9, -43, 80, -90, 70, -25}, +{18, -50, 75, -89, 89, -75, 50, -18, -18, 50, -75, 89, -89, 75, -50, 18}, +{ 9, -25, 43, -57, 70, -80, 87, -90, 90, -87, 80, -70, 57, -43, 25, -9}, +// Odd rows +{90, 90, 88, 85, 82, 78, 73, 67, 61, 54, 46, 38, 31, 22, 13, 4}, +{90, 82, 67, 46, 22, -4, -31, -54, -73, -85, -90, -88, -78, -61, -38, -13}, +{88, 67, 31, -13, -54, -82, -90, -78, -46, -4, 38, 73, 90, 85, 61, 22}, +{85, 46, -13, -67, -90, -73, -22, 38, 82, 88, 54, -4, -61, -90, -78, -31}, +{82, 22, -54, -90, -61, 13, 78, 85, 31, -46, -90, -67, 4, 73, 88, 38}, +{78, -4, -82, -73, 13, 85, 67, -22, -88, -61, 31, 90, 54, -38, -90, -46}, +{73, -31, -90, -22, 78, 67, -38, -90, -13, 82, 61, -46, -88, -4, 85, 54}, +{67, -54, -78, 38, 85, -22, -90, 4, 90, 13, -88, -31, 82, 46, -73, -61}, +{61, -73, -46, 82, 31, -88, -13, 90, -4, -90, 22, 85, -38, -78, 54, 67}, +{54, -85, -4, 88, -46, -61, 82, 13, -90, 38, 67, -78, -22, 90, -31, -73}, +{46, -90, 38, 54, -90, 31, 61, -88, 22, 67, -85, 13, 73, -82, 4, 78}, +{38, -88, 73, -4, -67, 90, -46, -31, 85, -78, 13, 61, -90, 54, 22, -82}, +{31, -78, 90, -61, 4, 54, -88, 82, -38, -22, 73, -90, 67, -13, -46, 85}, +{22, -61, 85, -90, 73, -38, -4, 46, -78, 90, -82, 54, -13, -31, 67, -88}, +{13, -38, 61, -78, 88, -90, 85, -73, 54, -31, 4, 22, -46, 67, -82, 90}, +{ 4, -13, 22, -31, 38, -46, 54, -61, 67, -73, 78, -82, 85, -88, 90, -90} +}; + +// Code/constants on GPU +struct GPU +{ +// unsigned int qpu_code[QPU_CODE_SIZE]; + unsigned int vpu_code8[VPU_CODE_SIZE]; + unsigned int vpu_code10[VPU_CODE_SIZE]; + short transMatrix2even[16*16*2]; +}; + +#define WAIT_COUNT_MAX 16 + +typedef struct trace_time_one_s +{ + int count; + int64_t start[WAIT_COUNT_MAX]; + int64_t total[WAIT_COUNT_MAX]; +} trace_time_one_t; + +typedef struct trace_time_wait_s +{ + unsigned int jcount; + int64_t start0; + int64_t last_update; + trace_time_one_t active; + trace_time_one_t wait; +} trace_time_wait_t; + +typedef struct vq_wait_s +{ + sem_t sem; + struct vq_wait_s * next; +} vq_wait_t; + +#define VQ_WAIT_POOL_SIZE 16 +typedef struct vq_wait_pool_s +{ + vq_wait_t * head; + vq_wait_t pool[VQ_WAIT_POOL_SIZE]; +} vq_wait_pool_t; + +static void vq_wait_pool_init(vq_wait_pool_t * const pool); +static void vq_wait_pool_deinit(vq_wait_pool_t * const pool); + +typedef struct gpu_env_s +{ + int open_count; + int init_count; + int vpu_i_cache_flushed; + GPU_MEM_PTR_T qpu_code_gm_ptr; + GPU_MEM_PTR_T code_gm_ptr; + GPU_MEM_PTR_T dummy_gm_ptr; + vq_wait_pool_t wait_pool; +#if RPI_TRACE_TIME_VPU_QPU_WAIT + trace_time_wait_t ttw; +#endif +} gpu_env_t; + +// Stop more than one thread trying to allocate memory or use the processing resources at once +static pthread_mutex_t gpu_mutex = PTHREAD_MUTEX_INITIALIZER; +static gpu_env_t * gpu = NULL; + +#if RPI_TRACE_TIME_VPU_QPU_WAIT + +static int64_t ns_time(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (int64_t)ts.tv_sec * (int64_t)1000000000 + ts.tv_nsec; +} + + +#define WAIT_TIME_PRINT_PERIOD (int64_t)2000000000 + +#define T_MS(t) ((unsigned int)((t)/(int64_t)1000000) % 1000U) +#define T_SEC(t) (unsigned int)((t)/(int64_t)1000000000) +#define T_ARG(t) T_SEC(t), T_MS(t) +#define T_FMT "%u.%03u" + +static void tto_print(trace_time_one_t * tto, const int64_t now, const int64_t start0, const char * const prefix) +{ + // Update totals for levels that are still pending + for (int i = 0; i < tto->count; ++i) { + tto->total[i] += now - tto->start[i]; + tto->start[i] = now; + } + + printf("%s: Idle:" T_FMT ", 1:" T_FMT ", 2:" T_FMT ", 3:" T_FMT ", 4:" T_FMT "\n", + prefix, + T_ARG(now - start0 - tto->total[0]), + T_ARG(tto->total[0]), + T_ARG(tto->total[1]), + T_ARG(tto->total[2]), + T_ARG(tto->total[3])); +} + + +static void tto_start(trace_time_one_t * const tto, const int64_t now) +{ + av_assert0(tto->count < WAIT_COUNT_MAX); + tto->start[tto->count++] = now; +} + +static void tto_end(trace_time_one_t * const tto, const int64_t now) +{ + const int n = --tto->count; + av_assert0(n >= 0); + tto->total[n] += now - tto->start[n]; +} + +static void ttw_print(trace_time_wait_t * const ttw, const int64_t now) +{ + printf("Jobs:%d, Total time=" T_FMT "\n", ttw->jcount, T_ARG(now - ttw->start0)); + tto_print(&ttw->active, now, ttw->start0, "Active"); + tto_print(&ttw->wait, now, ttw->start0, " Wait"); +} + +#endif + +// GPU memory alloc fns (internal) + +static void gpu_free_internal(GPU_MEM_PTR_T * const p) +{ + if (p->arm != NULL) + vcsm_unlock_ptr(p->arm); + if (p->vcsm_handle != 0) + vcsm_free(p->vcsm_handle); + memset(p, 0, sizeof(*p)); // Ensure we crash hard if we try and use this again +} + + +static int gpu_malloc_internal(GPU_MEM_PTR_T * const p, + const int numbytes, const unsigned int cache_type, const char * const name) +{ + memset(p, 0, sizeof(*p)); + p->numbytes = (numbytes + 255) & ~255; // Round up + + if ((p->vcsm_handle = vcsm_malloc_cache(p->numbytes, cache_type | 0x80, (char *)name)) == 0 || + (p->vc_handle = vcsm_vc_hdl_from_hdl(p->vcsm_handle)) == 0 || + (p->arm = vcsm_lock(p->vcsm_handle)) == NULL || + (p->vc = vcsm_vc_addr_from_hdl(p->vcsm_handle)) == 0) + { + gpu_free_internal(p); + return AVERROR(ENOMEM); + } + return 0; +} + + +// GPU init, free, lock, unlock + +static void gpu_term(void) +{ + gpu_env_t * const ge = gpu; + + // We have to hope that eveything has terminated... + gpu = NULL; + + vc_gpuserv_deinit(); + + gpu_free_internal(&ge->code_gm_ptr); + gpu_free_internal(&ge->qpu_code_gm_ptr); + gpu_free_internal(&ge->dummy_gm_ptr); + + vcsm_exit(); + + vq_wait_pool_deinit(&ge->wait_pool); + + free(ge); +} + + +// Connect to QPU, returns 0 on success. +static int gpu_init(gpu_env_t ** const gpu) { + volatile struct GPU* ptr; + gpu_env_t * const ge = calloc(1, sizeof(gpu_env_t)); + int rv; + *gpu = NULL; + + if (ge == NULL) + return -1; + + vq_wait_pool_init(&ge->wait_pool); + + vcsm_init(); + + // Now copy over the QPU code into GPU memory + if ((rv = gpu_malloc_internal(&ge->qpu_code_gm_ptr, QPU_CODE_SIZE * 4, VCSM_CACHE_TYPE_NONE, "ffmpeg qpu code")) != 0) + return rv; + + { + int num_bytes = (char *)mc_end - (char *)ff_hevc_rpi_shader; + av_assert0(num_bytes<=QPU_CODE_SIZE*sizeof(unsigned int)); + memcpy(ge->qpu_code_gm_ptr.arm, ff_hevc_rpi_shader, num_bytes); + memset(ge->qpu_code_gm_ptr.arm + num_bytes, 0, QPU_CODE_SIZE*4 - num_bytes); + } + + // And the VPU code + if ((rv = gpu_malloc_internal(&ge->code_gm_ptr, sizeof(struct GPU), VCSM_CACHE_TYPE_VC, "ffmpeg vpu code")) != 0) + return rv; + ptr = (volatile struct GPU*)ge->code_gm_ptr.arm; + + // Zero everything so we have zeros between the code bits + memset((void *)ptr, 0, sizeof(*ptr)); + { + int num_bytes = sizeof(rpi_hevc_transform8); + av_assert0(num_bytes<=VPU_CODE_SIZE*sizeof(unsigned int)); + memcpy((void*)ptr->vpu_code8, rpi_hevc_transform8, num_bytes); + } + { + int num_bytes = sizeof(rpi_hevc_transform10); + av_assert0(num_bytes<=VPU_CODE_SIZE*sizeof(unsigned int)); + memcpy((void*)ptr->vpu_code10, rpi_hevc_transform10, num_bytes); + } + // And the transform coefficients + memcpy((void*)ptr->transMatrix2even, rpi_transMatrix2even, sizeof(rpi_transMatrix2even)); + + // Generate a dummy "frame" & fill with 0x80 + // * Could reset to 1 <dummy_gm_ptr, 0x4000, VCSM_CACHE_TYPE_NONE, "ffmpeg dummy frame")) != 0) + return rv; + memset(ge->dummy_gm_ptr.arm, 0x80, 0x4000); + + *gpu = ge; + return 0; +} + + + +static void gpu_unlock(void) { + pthread_mutex_unlock(&gpu_mutex); +} + +// Make sure we have exclusive access to the mailbox, and enable qpu if necessary. +static gpu_env_t * gpu_lock(void) { + pthread_mutex_lock(&gpu_mutex); + + av_assert1(gpu != NULL); + return gpu; +} + +static gpu_env_t * gpu_lock_ref(void) +{ + pthread_mutex_lock(&gpu_mutex); + + if (gpu == NULL) { + int rv = gpu_init(&gpu); + if (rv != 0) { + gpu_unlock(); + return NULL; + } + } + + ++gpu->open_count; + return gpu; +} + +static void gpu_unlock_unref(gpu_env_t * const ge) +{ + if (--ge->open_count == 0) + gpu_term(); + + gpu_unlock(); +} + +static inline gpu_env_t * gpu_ptr(void) +{ + av_assert1(gpu != NULL); + return gpu; +} + +unsigned int vpu_get_fn(const unsigned int bit_depth) { + uint32_t a = 0; + + // Make sure that the gpu is initialized + av_assert1(gpu != NULL); + switch (bit_depth){ + case 8: + a = gpu->code_gm_ptr.vc + offsetof(struct GPU, vpu_code8); + break; + case 10: + a = gpu->code_gm_ptr.vc + offsetof(struct GPU, vpu_code10); + break; + default: + av_assert0(0); + } + return a; +} + +unsigned int vpu_get_constants(void) { + av_assert1(gpu != NULL); + return (gpu->code_gm_ptr.vc + offsetof(struct GPU,transMatrix2even)); +} + +void gpu_ref(void) +{ + gpu_lock_ref(); + gpu_unlock(); +} + +void gpu_unref(void) +{ + gpu_env_t * const ge = gpu_lock(); + gpu_unlock_unref(ge); +} + +// ---------------------------------------------------------------------------- + + +// Wait abstractions - mostly so we can easily add profile code +static void vq_wait_pool_init(vq_wait_pool_t * const wp) +{ + unsigned int i; + for (i = 0; i != VQ_WAIT_POOL_SIZE; ++i) { + sem_init(&wp->pool[i].sem, 0, 0); + wp->pool[i].next = wp->pool + i + 1; + } + wp->head = wp->pool + 0; + wp->pool[VQ_WAIT_POOL_SIZE - 1].next = NULL; +} + +static void vq_wait_pool_deinit(vq_wait_pool_t * const wp) +{ + unsigned int i; + wp->head = NULL; + for (i = 0; i != VQ_WAIT_POOL_SIZE; ++i) { + sem_destroy(&wp->pool[i].sem); + wp->pool[i].next = NULL; + } +} + + +// If sem_init actually takes time then maybe we want a pool... +static vq_wait_t * vq_wait_new(void) +{ + gpu_env_t * const ge = gpu_lock_ref(); + vq_wait_t * const wait = ge->wait_pool.head; + ge->wait_pool.head = wait->next; + wait->next = NULL; + +#if RPI_TRACE_TIME_VPU_QPU_WAIT + tto_start(&ge->ttw.active, ns_time()); +#endif + + gpu_unlock(); + return wait; +} + +static void vq_wait_delete(vq_wait_t * const wait) +{ + gpu_env_t * const ge = gpu_lock(); + wait->next = ge->wait_pool.head; + ge->wait_pool.head = wait; + +#if RPI_TRACE_TIME_VPU_QPU_WAIT + { + trace_time_wait_t * const ttw = &ge->ttw; + const int64_t now = ns_time(); + ++ttw->jcount; + tto_end(&ttw->wait, now); + + if (ttw->start0 == 0) + { + ttw->start0 = ttw->active.start[0]; + ttw->last_update = ttw->start0; + } + if (now - ttw->last_update > WAIT_TIME_PRINT_PERIOD) + { + ttw->last_update += WAIT_TIME_PRINT_PERIOD; + ttw_print(ttw, now); + } + } +#endif + gpu_unlock_unref(ge); +} + +static void vq_wait_wait(vq_wait_t * const wait) +{ +#if RPI_TRACE_TIME_VPU_QPU_WAIT + { + const int64_t now = ns_time(); + gpu_env_t * const ge = gpu_lock(); + tto_start(&ge->ttw.wait, now); + gpu_unlock(); + } +#endif + + while (sem_wait(&wait->sem) == -1 && errno == EINTR) + /* loop */; +} + +static void vq_wait_post(vq_wait_t * const wait) +{ +#if RPI_TRACE_TIME_VPU_QPU_WAIT + { + gpu_env_t *const ge = gpu_lock(); + tto_end(&ge->ttw.active, ns_time()); + gpu_unlock(); + } +#endif + + sem_post(&wait->sem); +} + + + +// Header comments were wrong for these two +#define VPU_QPU_MASK_QPU 1 +#define VPU_QPU_MASK_VPU 2 + +typedef struct vpu_qpu_job_env_s vpu_qpu_job_env_t; + +vpu_qpu_job_env_t * vpu_qpu_job_init(vpu_qpu_job_env_t * const buf) +{ +// vpu_qpu_job_env_t * vqj = calloc(1, sizeof(vpu_qpu_job_env_t)); + vpu_qpu_job_env_t * vqj = buf; +// memset(vqj, 0, sizeof(*vqj)); + vqj->n = 0; + vqj->mask = 0; + return vqj; +} + +void vpu_qpu_job_delete(vpu_qpu_job_env_t * const vqj) +{ +// memset(vqj, 0, sizeof(*vqj)); +// free(vqj); +} + +static inline struct gpu_job_s * new_job(vpu_qpu_job_env_t * const vqj) +{ + struct gpu_job_s * const j = vqj->j + vqj->n++; + av_assert1(vqj->n <= VPU_QPU_JOB_MAX); + return j; +} + +void vpu_qpu_job_add_vpu(vpu_qpu_job_env_t * const vqj, const uint32_t vpu_code, + const unsigned r0, const unsigned r1, const unsigned r2, const unsigned r3, const unsigned r4, const unsigned r5) +{ + if (vpu_code != 0) { + struct gpu_job_s *const j = new_job(vqj); + vqj->mask |= VPU_QPU_MASK_VPU; + + j->command = EXECUTE_VPU; + j->callback.func = 0; + j->callback.cookie = NULL; + // The bottom two bits of the execute address contain no-flush flags + // b0 will flush the VPU I-cache if unset so we nearly always want that set + // as we never reload code + j->u.v.q[0] = vpu_code | gpu->vpu_i_cache_flushed; + j->u.v.q[1] = r0; + j->u.v.q[2] = r1; + j->u.v.q[3] = r2; + j->u.v.q[4] = r3; + j->u.v.q[5] = r4; + j->u.v.q[6] = r5; + gpu->vpu_i_cache_flushed = 1; + } +} + +// flags are QPU_FLAGS_xxx +void vpu_qpu_job_add_qpu(vpu_qpu_job_env_t * const vqj, const unsigned int n, const uint32_t * const mail) +{ + if (n != 0) { + struct gpu_job_s *const j = new_job(vqj); + vqj->mask |= VPU_QPU_MASK_QPU; + + j->command = EXECUTE_QPU; + j->callback.func = 0; + j->callback.cookie = NULL; + + j->u.q.jobs = n; +#if RPI_TRACE_QPU_PROFILE_ALL + j->u.q.noflush = QPU_FLAGS_NO_FLUSH_VPU | QPU_FLAGS_PROF_CLEAR_AND_ENABLE | QPU_FLAGS_PROF_OUTPUT_COUNTS; +#else + j->u.q.noflush = QPU_FLAGS_NO_FLUSH_VPU; +#endif + j->u.q.timeout = 5000; + memcpy(j->u.q.control, mail, n * QPU_MAIL_EL_VALS * sizeof(uint32_t)); + } +} + +// Convert callback to sem post +static void vpu_qpu_job_callback_wait(void * v) +{ + vq_wait_post(v); +} + +// Poke a user-supplied sem +static void vpu_qpu_job_callback_sem(void * v) +{ + sem_post((sem_t *)v); +} + +void vpu_qpu_job_add_sync_this(vpu_qpu_job_env_t * const vqj, vpu_qpu_wait_h * const wait_h) +{ + vq_wait_t * wait; + + if (vqj->mask == 0) { + *wait_h = NULL; + return; + } + + // We are going to want a sync object + wait = vq_wait_new(); + + // There are 2 VPU Qs & 1 QPU Q so we can collapse sync + // If we only posted one thing or only QPU jobs + if (vqj->n == 1 || vqj->mask == VPU_QPU_MASK_QPU) + { + struct gpu_job_s * const j = vqj->j + (vqj->n - 1); + av_assert1(j->callback.func == 0); + + j->callback.func = vpu_qpu_job_callback_wait; + j->callback.cookie = wait; + } + else + { + struct gpu_job_s *const j = new_job(vqj); + + j->command = EXECUTE_SYNC; + j->u.s.mask = vqj->mask; + j->callback.func = vpu_qpu_job_callback_wait; + j->callback.cookie = wait; + } + + vqj->mask = 0; + *wait_h = wait; +} + +// Returns 0 if no sync added ('cos Q empty), 1 if sync added +int vpu_qpu_job_add_sync_sem(vpu_qpu_job_env_t * const vqj, sem_t * const sem) +{ + // If nothing on q then just return + if (vqj->mask == 0) + return 0; + + // There are 2 VPU Qs & 1 QPU Q so we can collapse sync + // If we only posted one thing or only QPU jobs + if (vqj->n == 1 || vqj->mask == VPU_QPU_MASK_QPU) + { + struct gpu_job_s * const j = vqj->j + (vqj->n - 1); + av_assert1(j->callback.func == 0); + + j->callback.func = vpu_qpu_job_callback_sem; + j->callback.cookie = sem; + } + else + { + struct gpu_job_s *const j = new_job(vqj); + + j->command = EXECUTE_SYNC; + j->u.s.mask = vqj->mask; + j->callback.func = vpu_qpu_job_callback_sem; + j->callback.cookie = sem; + } + + vqj->mask = 0; + return 1; +} + + +int vpu_qpu_job_start(vpu_qpu_job_env_t * const vqj) +{ + if (vqj->n == 0) + return 0; + + return vc_gpuserv_execute_code(vqj->n, vqj->j); +} + +// Simple wrapper of start + delete +int vpu_qpu_job_finish(vpu_qpu_job_env_t * const vqj) +{ + int rv; + rv = vpu_qpu_job_start(vqj); + vpu_qpu_job_delete(vqj); + return rv; +} + +void vpu_qpu_wait(vpu_qpu_wait_h * const wait_h) +{ + if (wait_h != NULL) + { + vq_wait_t * const wait = *wait_h; + if (wait != NULL) { + *wait_h = NULL; + vq_wait_wait(wait); + vq_wait_delete(wait); + } + } +} + +int vpu_qpu_init() +{ + gpu_env_t * const ge = gpu_lock_ref(); + if (ge == NULL) + return -1; + + if (ge->init_count++ == 0) + { + vc_gpuserv_init(); + } + + gpu_unlock(); + return 0; +} + +void vpu_qpu_term() +{ + gpu_env_t * const ge = gpu_lock(); + + if (--ge->init_count == 0) { + vc_gpuserv_deinit(); + +#if RPI_TRACE_TIME_VPU_QPU_WAIT + ttw_print(&ge->ttw, ns_time()); +#endif + } + + gpu_unlock_unref(ge); +} + +uint32_t qpu_fn(const int * const mc_fn) +{ + return gpu->qpu_code_gm_ptr.vc + ((const char *)mc_fn - (const char *)ff_hevc_rpi_shader); +} + +uint32_t qpu_dummy(void) +{ + return gpu->dummy_gm_ptr.vc; +} + +int rpi_hevc_qpu_init_fn(HEVCRpiQpu * const qf, const unsigned int bit_depth) +{ + // Dummy values we can catch with emulation + qf->y_pxx = ~1U; + qf->y_bxx = ~2U; + qf->y_p00 = ~3U; + qf->y_b00 = ~4U; + qf->c_pxx = ~5U; + qf->c_bxx = ~6U; + + switch (bit_depth) { + case 8: + qf->y_pxx = qpu_fn(mc_filter_y_pxx); + qf->y_pxx = qpu_fn(mc_filter_y_pxx); + qf->y_bxx = qpu_fn(mc_filter_y_bxx); + qf->y_p00 = qpu_fn(mc_filter_y_p00); + qf->y_b00 = qpu_fn(mc_filter_y_b00); + qf->c_pxx = qpu_fn(mc_filter_c_p); + qf->c_pxx_l1 = qpu_fn(mc_filter_c_p_l1); + qf->c_bxx = qpu_fn(mc_filter_c_b); + break; + case 10: + qf->c_pxx = qpu_fn(mc_filter_c10_p); + qf->c_pxx_l1 = qpu_fn(mc_filter_c10_p_l1); + qf->c_bxx = qpu_fn(mc_filter_c10_b); + qf->y_pxx = qpu_fn(mc_filter_y10_pxx); + qf->y_bxx = qpu_fn(mc_filter_y10_bxx); + qf->y_p00 = qpu_fn(mc_filter_y10_p00); + qf->y_b00 = qpu_fn(mc_filter_y10_b00); + break; + default: + return -1; + } + return 0; +} + diff --git a/libavcodec/rpi_qpu.h b/libavcodec/rpi_qpu.h new file mode 100644 index 0000000000..8777687021 --- /dev/null +++ b/libavcodec/rpi_qpu.h @@ -0,0 +1,103 @@ +/* +Copyright (c) 2018 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox, Ben Avison +*/ + +#ifndef RPI_QPU_H +#define RPI_QPU_H + +#include "rpi_mem.h" +#include "rpi_zc_frames.h" + +#pragma GCC diagnostic push +// Many many redundant decls in the header files +#pragma GCC diagnostic ignored "-Wredundant-decls" +#pragma GCC diagnostic ignored "-Wstrict-prototypes" +#include "interface/vmcs_host/vc_vchi_gpuserv.h" // for gpu_job_s +#pragma GCC diagnostic pop + +// QPU specific functions + +typedef struct HEVCRpiQpu { + uint32_t c_pxx; + uint32_t c_pxx_l1; + uint32_t c_bxx; + uint32_t y_pxx; + uint32_t y_bxx; + uint32_t y_p00; + uint32_t y_b00; +} HEVCRpiQpu; + +int rpi_hevc_qpu_init_fn(HEVCRpiQpu * const qf, const unsigned int bit_depth); + +uint32_t qpu_fn(const int * const mc_fn); +uint32_t qpu_dummy(void); + +#define QPU_N_GRP 4 +#define QPU_N_MAX 12 + +#define QPU_MAIL_EL_VALS 2 + +struct vpu_qpu_wait_s; +typedef struct vq_wait_s * vpu_qpu_wait_h; + +// VPU specific functions + +struct vpu_qpu_job_env_s; +typedef struct vpu_qpu_job_env_s * vpu_qpu_job_h; + +#define VPU_QPU_JOB_MAX 4 +struct vpu_qpu_job_env_s +{ + unsigned int n; + unsigned int mask; + struct gpu_job_s j[VPU_QPU_JOB_MAX]; +}; +typedef struct vpu_qpu_job_env_s vpu_qpu_job_env_t; + +vpu_qpu_job_h vpu_qpu_job_init(vpu_qpu_job_env_t * const buf); +void vpu_qpu_job_delete(const vpu_qpu_job_h vqj); +void vpu_qpu_job_add_vpu(const vpu_qpu_job_h vqj, const uint32_t vpu_code, + const unsigned r0, const unsigned r1, const unsigned r2, const unsigned r3, const unsigned r4, const unsigned r5); +void vpu_qpu_job_add_qpu(const vpu_qpu_job_h vqj, const unsigned int n, const uint32_t * const mail); +void vpu_qpu_job_add_sync_this(const vpu_qpu_job_h vqj, vpu_qpu_wait_h * const wait_h); +int vpu_qpu_job_add_sync_sem(vpu_qpu_job_env_t * const vqj, sem_t * const sem); +int vpu_qpu_job_start(const vpu_qpu_job_h vqj); +int vpu_qpu_job_finish(const vpu_qpu_job_h vqj); + +extern unsigned int vpu_get_fn(const unsigned int bit_depth); +extern unsigned int vpu_get_constants(void); + +// Waits for previous post_codee to complete and Will null out *wait_h after use +void vpu_qpu_wait(vpu_qpu_wait_h * const wait_h); +int vpu_qpu_init(void); +void vpu_qpu_term(void); + +void gpu_ref(void); +void gpu_unref(void); + +#endif diff --git a/libavcodec/rpi_zc.c b/libavcodec/rpi_zc.c new file mode 100644 index 0000000000..37be9a0f49 --- /dev/null +++ b/libavcodec/rpi_zc.c @@ -0,0 +1,1227 @@ +#include "config.h" + +#include "libavcodec/avcodec.h" +#include "rpi_mem.h" +#include "rpi_mailbox.h" +#include "rpi_zc.h" +#include "libavutil/avassert.h" +#include + +#include "libavutil/buffer_internal.h" + +#pragma GCC diagnostic push +// Many many redundant decls in the header files +#pragma GCC diagnostic ignored "-Wredundant-decls" +#include +#include +#pragma GCC diagnostic pop + +#define TRACE_ALLOC 0 +#define DEBUG_ALWAYS_KEEP_LOCKED 0 + +struct ZcPoolEnt; + +typedef struct ZcPool +{ + size_t numbytes; + struct ZcPoolEnt * head; + pthread_mutex_t lock; +} ZcPool; + +typedef struct ZcPoolEnt +{ + size_t numbytes; + + unsigned int vcsm_handle; + unsigned int vc_handle; + void * map_arm; + unsigned int map_vc; + + struct ZcPoolEnt * next; + struct ZcPool * pool; +} ZcPoolEnt; + +typedef struct ZcOldCtxVals +{ + int thread_safe_callbacks; + int (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags); + void * opaque; +} ZcOldCtxVals; + +typedef struct AVZcEnv +{ + unsigned int refcount; + ZcOldCtxVals old; + + void * pool_env; + av_rpi_zc_alloc_buf_fn_t * alloc_buf; + av_rpi_zc_free_pool_fn_t * free_pool; + + unsigned int pool_size; +} ZcEnv; + +typedef struct ZcUserBufEnv { + void * v; + const av_rpi_zc_buf_fn_tab_t * fn; + size_t numbytes; + int offset; +} ZcUserBufEnv; + +#define ZC_BUF_INVALID 0 +#define ZC_BUF_VALID 1 +#define ZC_BUF_NEVER 2 + +typedef struct ZcBufEnv { + GPU_MEM_PTR_T gmem; + AVZcEnvPtr zc; + int is_valid; + AVBufferRef * user; + AVRpiZcFrameGeometry geo; + size_t size_y; + size_t size_c; + size_t size_pic; + ssize_t offset; + pthread_mutex_t lock; + pthread_cond_t cond; +} ZcBufEnv; + + + + + + +#define ALLOC_PAD 0 +#define ALLOC_ROUND 0x1000 +#define STRIDE_ROUND 64 +#define STRIDE_OR 0 + +#define DEBUG_ZAP0_BUFFERS 0 + +static inline int av_rpi_is_sand_format(const int format) +{ + return (format >= AV_PIX_FMT_SAND128 && format <= AV_PIX_FMT_SAND64_16) || + (format == AV_PIX_FMT_RPI4_8 || format == AV_PIX_FMT_RPI4_10); +} + +static inline int av_rpi_is_sand_frame(const AVFrame * const frame) +{ + return av_rpi_is_sand_format(frame->format); +} + +//---------------------------------------------------------------------------- +// +// Internal pool stuff + +// Pool entry functions + +static ZcPoolEnt * zc_pool_ent_alloc(ZcPool * const pool, const size_t req_size) +{ + ZcPoolEnt * const zp = av_mallocz(sizeof(ZcPoolEnt)); + + // Round up to 4k & add 4k + const unsigned int alloc_size = (req_size + ALLOC_PAD + ALLOC_ROUND - 1) & ~(ALLOC_ROUND - 1); + + if (zp == NULL) { + av_log(NULL, AV_LOG_ERROR, "av_malloc(ZcPoolEnt) failed\n"); + goto fail0; + } + + // The 0x80 here maps all pages here rather than waiting for lazy mapping + // BEWARE that in GPU land a later unlock/lock pair will put us back into + // lazy mode - which will also break cache invalidate calls. + if ((zp->vcsm_handle = vcsm_malloc_cache(alloc_size, VCSM_CACHE_TYPE_HOST | 0x80, "ffmpeg_rpi_zc")) == 0) + { + av_log(NULL, AV_LOG_ERROR, "av_gpu_malloc_cached(%d) failed\n", alloc_size); + goto fail1; + } + +#if TRACE_ALLOC + printf("%s: Alloc %#x bytes @ h=%d\n", __func__, alloc_size, zp->vcsm_handle); +#endif + + zp->numbytes = alloc_size; + zp->pool = pool; + return zp; + +fail1: + av_free(zp); +fail0: + return NULL; +} + +static void zc_pool_ent_free(ZcPoolEnt * const zp) +{ +#if TRACE_ALLOC + printf("%s: Free %#x bytes @ h=%d\n", __func__, zp->numbytes, zp->vcsm_handle); +#endif + + if (zp->vcsm_handle != 0) + { + // VC addr & handle need no dealloc + if (zp->map_arm != NULL) + vcsm_unlock_hdl(zp->vcsm_handle); + vcsm_free(zp->vcsm_handle); + } + av_free(zp); +} + +//---------------------------------------------------------------------------- +// +// Pool functions + +static void zc_pool_free_ent_list(ZcPoolEnt * p) +{ + while (p != NULL) + { + ZcPoolEnt * const zp = p; + p = p->next; + zc_pool_ent_free(zp); + } +} + +static void zc_pool_flush(ZcPool * const pool) +{ + ZcPoolEnt * p = pool->head; + pool->head = NULL; + pool->numbytes = ~0U; + zc_pool_free_ent_list(p); +} + +static ZcPoolEnt * zc_pool_get_ent(ZcPool * const pool, const size_t req_bytes) +{ + ZcPoolEnt * zp = NULL; + ZcPoolEnt * flush_list = NULL; + size_t numbytes; + + pthread_mutex_lock(&pool->lock); + + numbytes = pool->numbytes; + + // If size isn't close then dump the pool + // Close in this context means within 128k + if (req_bytes > numbytes || req_bytes + 0x20000 < numbytes) + { + flush_list = pool->head; + pool->head = NULL; + pool->numbytes = numbytes = req_bytes; + } + else if (pool->head != NULL) + { + zp = pool->head; + pool->head = zp->next; + } + + pthread_mutex_unlock(&pool->lock); + + zc_pool_free_ent_list(flush_list); + + if (zp == NULL) + zp = zc_pool_ent_alloc(pool, numbytes); + + return zp; +} + +static void zc_pool_put_ent(ZcPoolEnt * const zp) +{ + ZcPool * const pool = zp == NULL ? NULL : zp->pool; + if (zp != NULL) + { + pthread_mutex_lock(&pool->lock); +#if TRACE_ALLOC + printf("%s: Recycle %#x, %#x\n", __func__, pool->numbytes, zp->numbytes); +#endif + + if (pool->numbytes == zp->numbytes) + { + zp->next = pool->head; + pool->head = zp; + pthread_mutex_unlock(&pool->lock); + } + else + { + pthread_mutex_unlock(&pool->lock); + zc_pool_ent_free(zp); + } + } +} + +static ZcPool * +zc_pool_new(void) +{ + ZcPool * const pool = av_mallocz(sizeof(*pool)); + if (pool == NULL) + return NULL; + + pool->numbytes = -1; + pool->head = NULL; + pthread_mutex_init(&pool->lock, NULL); + return pool; +} + +static void +zc_pool_delete(ZcPool * const pool) +{ + if (pool != NULL) + { + pool->numbytes = -1; + zc_pool_flush(pool); + pthread_mutex_destroy(&pool->lock); + av_free(pool); + } +} + +//============================================================================ +// +// ZC implementation using above pool implementation +// +// Fn table fns... + +static void zc_pool_free_v(void * v) +{ + zc_pool_put_ent(v); +} + +static unsigned int zc_pool_ent_vcsm_handle_v(void * v) +{ + ZcPoolEnt * zp = v; + return zp->vcsm_handle; +} + +static unsigned int zc_pool_ent_vc_handle_v(void * v) +{ + ZcPoolEnt * zp = v; + if (zp->vc_handle == 0) + { + if ((zp->vc_handle = vcsm_vc_hdl_from_hdl(zp->vcsm_handle)) == 0) + av_log(NULL, AV_LOG_ERROR, "%s: Failed to map VCSM handle %d to VC handle\n", + __func__, zp->vcsm_handle); + } + return zp->vc_handle; +} + +static void * zc_pool_ent_map_arm_v(void * v) +{ + ZcPoolEnt * zp = v; + if (zp->map_arm == NULL) + { + if ((zp->map_arm = vcsm_lock(zp->vcsm_handle)) == NULL) + av_log(NULL, AV_LOG_ERROR, "%s: Failed to map VCSM handle %d to ARM address\n", + __func__, zp->vcsm_handle); + } + return zp->map_arm; +} + +static unsigned int zc_pool_ent_map_vc_v(void * v) +{ + ZcPoolEnt * zp = v; + if (zp->map_vc == 0) + { + if ((zp->map_vc = vcsm_vc_addr_from_hdl(zp->vcsm_handle)) == 0) + av_log(NULL, AV_LOG_ERROR, "%s: Failed to map VCSM handle %d to VC address\n", + __func__, zp->vcsm_handle); + } + return zp->map_vc; +} + +static const av_rpi_zc_buf_fn_tab_t zc_pool_buf_fns = { + .free = zc_pool_free_v, + .vcsm_handle = zc_pool_ent_vcsm_handle_v, + .vc_handle = zc_pool_ent_vc_handle_v, + .map_arm = zc_pool_ent_map_arm_v, + .map_vc = zc_pool_ent_map_vc_v, +}; + +// ZC Env fns + +// Delete pool +// All buffers guaranteed freed by now +static void +zc_pool_delete_v(void * v) +{ + zc_pool_delete((ZcPool *)v); + rpi_mem_gpu_uninit(); +} + +// Allocate a new ZC buffer +static AVBufferRef * +zc_pool_buf_alloc(void * v, size_t size, const AVRpiZcFrameGeometry * geo) +{ + ZcPool * const pool = v; + ZcPoolEnt *const zp = zc_pool_get_ent(pool, size); + AVBufferRef * buf; + + (void)geo; // geo ignored here + + if (zp == NULL) { + av_log(NULL, AV_LOG_ERROR, "zc_pool_alloc(%d) failed\n", size); + goto fail0; + } + + if ((buf = av_rpi_zc_buf(size, 0, zp, &zc_pool_buf_fns)) == NULL) + { + av_log(NULL, AV_LOG_ERROR, "av_rpi_zc_buf() failed\n"); + goto fail2; + } + + return buf; + +fail2: + zc_pool_put_ent(zp); +fail0: + return NULL; +} + +// Init wrappers - the public fns + +AVZcEnvPtr +av_rpi_zc_int_env_alloc(void * logctx) +{ + ZcEnv * zc; + ZcPool * pool_env; + + if (rpi_mem_gpu_init(0) < 0) + return NULL; + + if ((pool_env = zc_pool_new()) == NULL) + goto fail1; + + if ((zc = av_rpi_zc_env_alloc(logctx, pool_env, zc_pool_buf_alloc, zc_pool_delete_v)) == NULL) + goto fail2; + + return zc; + +fail2: + zc_pool_delete(pool_env); +fail1: + rpi_mem_gpu_uninit(); + return NULL; +} + +void +av_rpi_zc_int_env_freep(AVZcEnvPtr * zcp) +{ + const AVZcEnvPtr zc = *zcp; + *zcp = NULL; + if (zc != NULL) + av_rpi_zc_env_release(zc); +} + +//============================================================================ +// +// Geometry +// +// This is a separate chunck to the rest + +// Get mailbox fd - should be in a lock when called +// Rely on process close to close it +static int mbox_fd(void) +{ + static int fd = -1; + if (fd != -1) + return fd; + return (fd = mbox_open()); +} + +AVRpiZcFrameGeometry av_rpi_zc_frame_geometry( + const int format, const unsigned int video_width, const unsigned int video_height) +{ + static pthread_mutex_t sand_lock = PTHREAD_MUTEX_INITIALIZER; + + AVRpiZcFrameGeometry geo = { + .format = format, + .video_width = video_width, + .video_height = video_height + }; + + switch (format) + { + case AV_PIX_FMT_YUV420P: + geo.stride_y = ((video_width + 32 + STRIDE_ROUND - 1) & ~(STRIDE_ROUND - 1)) | STRIDE_OR; + geo.stride_c = geo.stride_y / 2; + geo.height_y = (video_height + 32 + 31) & ~31; + geo.height_c = geo.height_y / 2; + geo.planes_c = 2; + geo.stripes = 1; + geo.bytes_per_pel = 1; + geo.stripe_is_yc = 1; + break; + + case AV_PIX_FMT_YUV420P10: + geo.stride_y = ((video_width * 2 + 64 + STRIDE_ROUND - 1) & ~(STRIDE_ROUND - 1)) | STRIDE_OR; + geo.stride_c = geo.stride_y / 2; + geo.height_y = (video_height + 32 + 31) & ~31; + geo.height_c = geo.height_y / 2; + geo.planes_c = 2; + geo.stripes = 1; + geo.bytes_per_pel = 2; + geo.stripe_is_yc = 1; + break; + + case AV_PIX_FMT_SAND128: + case AV_PIX_FMT_RPI4_8: + { + const unsigned int stripe_w = 128; + + static VC_IMAGE_T img = {0}; + + // Given the overhead of calling the mailbox keep a stashed + // copy as we will almost certainly just want the same numbers again + // but that means we need a lock + pthread_mutex_lock(&sand_lock); + + if (img.width != video_width || img.height != video_height) + { + VC_IMAGE_T new_img = { + .type = VC_IMAGE_YUV_UV, + .width = video_width, + .height = video_height + }; + + mbox_get_image_params(mbox_fd(), &new_img); + img = new_img; + } + + geo.stride_y = stripe_w; + geo.stride_c = stripe_w; + geo.height_y = ((intptr_t)img.extra.uv.u - (intptr_t)img.image_data) / stripe_w; + geo.height_c = img.pitch / stripe_w - geo.height_y; + geo.stripe_is_yc = 1; + if (geo.height_y * stripe_w > img.pitch) + { + // "tall" sand - all C blocks now follow Y + geo.height_y = img.pitch / stripe_w; + geo.height_c = geo.height_y; + geo.stripe_is_yc = 0; + } + geo.planes_c = 1; + geo.stripes = (video_width + stripe_w - 1) / stripe_w; + geo.bytes_per_pel = 1; + + pthread_mutex_unlock(&sand_lock); +#if 0 + printf("Req: %dx%d: stride=%d/%d, height=%d/%d, stripes=%d, img.pitch=%d\n", + video_width, video_height, + geo.stride_y, geo.stride_c, + geo.height_y, geo.height_c, + geo.stripes, img.pitch); +#endif + av_assert0((int)geo.height_y > 0 && (int)geo.height_c > 0); + av_assert0(geo.height_y >= video_height && geo.height_c >= video_height / 2); + break; + } + + case AV_PIX_FMT_RPI4_10: + { + const unsigned int stripe_w = 128; // bytes + + static pthread_mutex_t sand_lock = PTHREAD_MUTEX_INITIALIZER; + static VC_IMAGE_T img = {0}; + + // Given the overhead of calling the mailbox keep a stashed + // copy as we will almost certainly just want the same numbers again + // but that means we need a lock + pthread_mutex_lock(&sand_lock); + + if (img.width != video_width || img.height != video_height) + { + VC_IMAGE_T new_img = { + .type = VC_IMAGE_YUV10COL, + .width = video_width, + .height = video_height + }; + + mbox_get_image_params(mbox_fd(), &new_img); + img = new_img; + } + + geo.stride_y = stripe_w; + geo.stride_c = stripe_w; + geo.height_y = ((intptr_t)img.extra.uv.u - (intptr_t)img.image_data) / stripe_w; + geo.height_c = img.pitch / stripe_w - geo.height_y; + geo.planes_c = 1; + geo.stripes = ((video_width * 4 + 2) / 3 + stripe_w - 1) / stripe_w; + geo.bytes_per_pel = 1; + geo.stripe_is_yc = 1; + + pthread_mutex_unlock(&sand_lock); + +#if 0 + printf("Req: %dx%d: stride=%d/%d, height=%d/%d, stripes=%d, img.pitch=%d\n", + video_width, video_height, + geo.stride_y, geo.stride_c, + geo.height_y, geo.height_c, + geo.stripes, img.pitch); +#endif + av_assert0((int)geo.height_y > 0 && (int)geo.height_c > 0); + av_assert0(geo.height_y >= video_height && geo.height_c >= video_height / 2); + break; + } + + case AV_PIX_FMT_SAND64_16: + case AV_PIX_FMT_SAND64_10: + { + const unsigned int stripe_w = 128; // bytes + + static pthread_mutex_t sand_lock = PTHREAD_MUTEX_INITIALIZER; + static VC_IMAGE_T img = {0}; + + // Given the overhead of calling the mailbox keep a stashed + // copy as we will almost certainly just want the same numbers again + // but that means we need a lock + pthread_mutex_lock(&sand_lock); + + if (img.width != video_width || img.height != video_height) + { + VC_IMAGE_T new_img = { + .type = VC_IMAGE_YUV_UV_16, + .width = video_width, + .height = video_height + }; + + mbox_get_image_params(mbox_fd(), &new_img); + img = new_img; + } + + geo.stride_y = stripe_w; + geo.stride_c = stripe_w; + geo.height_y = ((intptr_t)img.extra.uv.u - (intptr_t)img.image_data) / stripe_w; + geo.height_c = img.pitch / stripe_w - geo.height_y; + geo.planes_c = 1; + geo.stripes = (video_width * 2 + stripe_w - 1) / stripe_w; + geo.bytes_per_pel = 2; + geo.stripe_is_yc = 1; + + pthread_mutex_unlock(&sand_lock); + break; + } + + default: + break; + } + return geo; +} + +//============================================================================ +// +// ZC Env fns +// +// Frame copy fns + +static AVBufferRef * zc_copy(const AVZcEnvPtr zc, + const AVFrame * const src) +{ + AVFrame dest_frame; + AVFrame * const dest = &dest_frame; + unsigned int i; + uint8_t * psrc, * pdest; + + dest->format = src->format; + dest->width = src->width; + dest->height = src->height; + + if (av_rpi_zc_get_buffer(zc, dest) != 0 || + av_rpi_zc_resolve_frame(dest, ZC_RESOLVE_ALLOC_VALID) != 0) + { + return NULL; + } + + for (i = 0, psrc = src->data[0], pdest = dest->data[0]; + i != dest->height; + ++i, psrc += src->linesize[0], pdest += dest->linesize[0]) + { + memcpy(pdest, psrc, dest->width); + } + for (i = 0, psrc = src->data[1], pdest = dest->data[1]; + i != dest->height / 2; + ++i, psrc += src->linesize[1], pdest += dest->linesize[1]) + { + memcpy(pdest, psrc, dest->width / 2); + } + for (i = 0, psrc = src->data[2], pdest = dest->data[2]; + i != dest->height / 2; + ++i, psrc += src->linesize[2], pdest += dest->linesize[2]) + { + memcpy(pdest, psrc, dest->width / 2); + } + + return dest->buf[0]; +} + + +static AVBufferRef * zc_420p10_to_sand128(const AVZcEnvPtr zc, + const AVFrame * const src) +{ + assert(0); + return NULL; +} + + +static AVBufferRef * zc_sand64_16_to_sand128(const AVZcEnvPtr zc, + const AVFrame * const src, const unsigned int src_bits) +{ + assert(0); + return NULL; +} + +//---------------------------------------------------------------------------- +// +// Public info extraction calls + +static void zc_buf_env_free_cb(void * opaque, uint8_t * data); + +static inline ZcBufEnv * pic_zbe_ptr(AVBufferRef *const buf) +{ + // Kludge where we check the free fn to check this is really + // one of our buffers - can't think of a better way + return buf == NULL || buf->buffer->free != zc_buf_env_free_cb ? NULL : + av_buffer_get_opaque(buf); +} + +static inline GPU_MEM_PTR_T * pic_gm_ptr(AVBufferRef * const buf) +{ + // As gmem is the first el NULL should be preserved + return &pic_zbe_ptr(buf)->gmem; +} + +unsigned int av_rpi_zc_vcsm_handle(const AVRpiZcRefPtr fr_ref) +{ + const GPU_MEM_PTR_T * const p = pic_gm_ptr(fr_ref); + return p == NULL ? 0 : p->vcsm_handle; +} + +int av_rpi_zc_vc_handle(const AVRpiZcRefPtr fr_ref) +{ + const GPU_MEM_PTR_T * const p = pic_gm_ptr(fr_ref); + return p == NULL ? -1 : p->vc_handle; +} + +int av_rpi_zc_offset(const AVRpiZcRefPtr fr_ref) +{ + const ZcBufEnv * const zbe = pic_zbe_ptr(fr_ref); + return zbe == NULL ? 0 : zbe->offset; +} + +int av_rpi_zc_length(const AVRpiZcRefPtr fr_ref) +{ + const ZcBufEnv * const zbe = pic_zbe_ptr(fr_ref); + return zbe == NULL ? 0 : zbe->size_pic; +} + +int av_rpi_zc_numbytes(const AVRpiZcRefPtr fr_ref) +{ + const GPU_MEM_PTR_T * const p = pic_gm_ptr(fr_ref); + return p == NULL ? 0 : p->numbytes; +} + +const AVRpiZcFrameGeometry * av_rpi_zc_geometry(const AVRpiZcRefPtr fr_ref) +{ + const ZcBufEnv * const zbe = pic_zbe_ptr(fr_ref); + return zbe == NULL ? NULL : &zbe->geo; +} + +AVRpiZcRefPtr av_rpi_zc_ref(void * const logctx, const AVZcEnvPtr zc, + const AVFrame * const frame, const enum AVPixelFormat expected_format, const int maycopy) +{ + av_assert0(!maycopy || zc != NULL); + + if (frame->format != AV_PIX_FMT_YUV420P && + frame->format != AV_PIX_FMT_YUV420P10 && + !av_rpi_is_sand_frame(frame)) + { + av_log(logctx, AV_LOG_WARNING, "%s: *** Format not SAND/YUV420P: %d\n", __func__, frame->format); + return NULL; + } + + if (frame->buf[1] != NULL || frame->format != expected_format) + { +#if RPI_ZC_SAND_8_IN_10_BUF + if (frame->format == AV_PIX_FMT_SAND64_10 && expected_format == AV_PIX_FMT_SAND128 && frame->buf[RPI_ZC_SAND_8_IN_10_BUF] != NULL) + { +// av_log(s, AV_LOG_INFO, "%s: --- found buf[4]\n", __func__); + return av_buffer_ref(frame->buf[RPI_ZC_SAND_8_IN_10_BUF]); + } +#endif + + if (maycopy) + { + if (frame->buf[1] != NULL) + av_log(logctx, AV_LOG_INFO, "%s: *** Not a single buf frame: copying\n", __func__); + else + av_log(logctx, AV_LOG_INFO, "%s: *** Unexpected frame format %d: copying to %d\n", __func__, frame->format, expected_format); + + switch (frame->format) + { + case AV_PIX_FMT_YUV420P10: + return zc_420p10_to_sand128(zc, frame); + + case AV_PIX_FMT_SAND64_10: + return zc_sand64_16_to_sand128(zc, frame, 10); + + default: + return zc_copy(zc, frame); + } + } + else + { + if (frame->buf[1] != NULL) + av_log(logctx, AV_LOG_WARNING, "%s: *** Not a single buf frame: buf[1] != NULL\n", __func__); + else + av_log(logctx, AV_LOG_INFO, "%s: *** Unexpected frame format: %d != %d\n", __func__, frame->format, expected_format); + return NULL; + } + } + + if (pic_gm_ptr(frame->buf[0]) == NULL) + { + if (maycopy) + { + av_log(logctx, AV_LOG_INFO, "%s: *** Not one of our buffers: copying\n", __func__); + return zc_copy(zc, frame); + } + else + { + av_log(logctx, AV_LOG_WARNING, "%s: *** Not one of our buffers: NULL\n", __func__); + return NULL; + } + } + + return av_buffer_ref(frame->buf[0]); +} + +void av_rpi_zc_unref(AVRpiZcRefPtr fr_ref) +{ + if (fr_ref != NULL) + { + av_buffer_unref(&fr_ref); + } +} + +//---------------------------------------------------------------------------- + +// Extract user environment from an AVBufferRef +void * av_rpi_zc_buf_v(AVBufferRef * const buf) +{ + ZcBufEnv * const zbe = pic_zbe_ptr(buf); + if (zbe != NULL && zbe->user != NULL) + { + const ZcUserBufEnv * const zub = (const ZcUserBufEnv *)zbe->user->data; + return zub == NULL ? NULL : zub->v; + } + return NULL; +} + +// AV buffer pre-free callback +static void zc_user_buf_free_cb(void * opaque, uint8_t * data) +{ + if (opaque != NULL) + { + ZcUserBufEnv * const zub = opaque; + + if (zub->fn->free) + zub->fn->free(zub->v); + + av_free(zub); + } +} + +static void zc_buf_env_free_cb(void * opaque, uint8_t * data) +{ + if (opaque != NULL) + { + ZcBufEnv * const zbe = opaque; + + av_buffer_unref(&zbe->user); + + if (zbe->zc != NULL) + av_rpi_zc_env_release(zbe->zc); + + pthread_cond_destroy(&zbe->cond); + pthread_mutex_destroy(&zbe->lock); + av_free(zbe); + } +} + + +// Wrap the various ZC bits in an AV Buffer and resolve those things we want +// resolved now. +// Currently we resolve everything, but in future we might not +AVBufferRef * av_rpi_zc_buf(size_t numbytes, int addr_offset, void * v, const av_rpi_zc_buf_fn_tab_t * fn_tab) +{ + AVBufferRef *buf; + ZcUserBufEnv * zub; + + if ((zub = av_malloc(sizeof(ZcUserBufEnv))) == NULL) + return NULL; + + zub->fn = fn_tab; + zub->v = v; + zub->numbytes = numbytes; + zub->offset = addr_offset; + + if ((buf = av_buffer_create((uint8_t*)zub, sizeof(*zub), zc_user_buf_free_cb, zub, 0)) == NULL) + { + av_log(NULL, AV_LOG_ERROR, "ZC: Failed av_buffer_create\n"); + av_free(zub); + return NULL; + } + + return buf; +} + +int av_rpi_zc_resolve_buffer(AVBufferRef * const buf, const int alloc_mode) +{ + ZcBufEnv * const zbe = pic_zbe_ptr(buf); + + if (zbe == NULL) + return AVERROR(EINVAL); + + if (alloc_mode == ZC_RESOLVE_FAIL && !zbe->is_valid) + return AVERROR(EAGAIN); + + if (alloc_mode == ZC_RESOLVE_WAIT_VALID && !zbe->is_valid) + { + pthread_mutex_lock(&zbe->lock); + while (!zbe->is_valid) + pthread_cond_wait(&zbe->cond, &zbe->lock); + pthread_mutex_unlock(&zbe->lock); + } + + if (zbe->is_valid == ZC_BUF_NEVER) + return AVERROR(EINVAL); + + // Do alloc if we need it + if (zbe->user == NULL) + { + ZcEnv * const zc = zbe->zc; + const ZcUserBufEnv * zub; + + av_assert0(alloc_mode == ZC_RESOLVE_ALLOC || alloc_mode == ZC_RESOLVE_ALLOC_VALID); + + if ((zbe->user = zc->alloc_buf(zc->pool_env, zbe->size_pic, &zbe->geo)) == NULL) + { + av_log(NULL, AV_LOG_ERROR, "rpi_get_display_buffer: Failed to get buffer from pool\n"); + goto fail; + } + zub = (const ZcUserBufEnv *)zbe->user->data; + + // Track + + zbe->offset = zub->offset; + zbe->gmem.numbytes = zub->numbytes; + if ((zbe->gmem.arm = zub->fn->map_arm(zub->v)) == NULL) + { + av_log(NULL, AV_LOG_ERROR, "ZC: Failed to lock vcsm_handle %u\n", zbe->gmem.vcsm_handle); + goto fail; + } + + if ((zbe->gmem.vcsm_handle = zub->fn->vcsm_handle(zub->v)) == 0) + { + av_log(NULL, AV_LOG_ERROR, "ZC: Failed to get vcsm_handle\n"); + goto fail; + } + + if ((zbe->gmem.vc_handle = zub->fn->vc_handle(zub->v)) == 0) + { + av_log(NULL, AV_LOG_ERROR, "ZC: Failed to get vc handle from vcsm_handle %u\n", zbe->gmem.vcsm_handle); + goto fail; + } + if ((zbe->gmem.vc = zub->fn->map_vc(zub->v)) == 0) + { + av_log(NULL, AV_LOG_ERROR, "ZC: Failed to get vc addr from vcsm_handle %u\n", zbe->gmem.vcsm_handle); + goto fail; + } + + buf->buffer->data = zbe->gmem.arm + zbe->offset; + buf->buffer->size = zbe->size_pic; + + // In this mode we shouldn't have anyone waiting for us + // so no need to signal + if (alloc_mode == ZC_RESOLVE_ALLOC_VALID) + zbe->is_valid = 1; + } + + // Just overwrite - no point in testing + buf->data = zbe->gmem.arm + zbe->offset; + buf->size = zbe->size_pic; + return 0; + +fail: + av_buffer_unref(&zbe->user); + return AVERROR(ENOMEM); +} + +int av_rpi_zc_resolve_frame(AVFrame * const frame, const int may_alloc) +{ + int rv; + + // Do alloc if we need it + if ((rv = av_rpi_zc_resolve_buffer(frame->buf[0], may_alloc)) != 0) + return rv; + + // If we are a framebuf copy then the alloc can be done but we haven't + // imported its results yet + if (frame->data[0] == NULL) + { + const ZcBufEnv * const zbe = pic_zbe_ptr(frame->buf[0]); + + frame->linesize[0] = zbe->geo.stride_y; + frame->linesize[1] = zbe->geo.stride_c; + frame->linesize[2] = zbe->geo.stride_c; + // abuse: linesize[3] = "stripe stride" + // stripe_stride is NOT the stride between slices it is (that / geo.stride_y). + // In a general case this makes the calculation an xor and multiply rather + // than a divide and multiply + if (zbe->geo.stripes > 1) + frame->linesize[3] = zbe->geo.stripe_is_yc ? zbe->geo.height_y + zbe->geo.height_c : zbe->geo.height_y; + + frame->data[0] = frame->buf[0]->data; + frame->data[1] = frame->data[0] + (zbe->geo.stripe_is_yc ? zbe->size_y : zbe->size_y * zbe->geo.stripes); + if (zbe->geo.planes_c > 1) + frame->data[2] = frame->data[1] + zbe->size_c; + + frame->extended_data = frame->data; + // Leave extended buf alone + } + + return 0; +} + +int av_rpi_zc_set_valid_frame(AVFrame * const frame) +{ + ZcBufEnv * const zbe = pic_zbe_ptr(frame->buf[0]); + + if (zbe == NULL) + return AVERROR(EINVAL); + + zbe->is_valid = ZC_BUF_VALID; + pthread_cond_broadcast(&zbe->cond); + + return 0; +} + +int av_rpi_zc_set_broken_frame(AVFrame * const frame) +{ + ZcBufEnv * const zbe = pic_zbe_ptr(frame->buf[0]); + + if (zbe == NULL) + return AVERROR(EINVAL); + + zbe->is_valid = ZC_BUF_NEVER; + pthread_cond_broadcast(&zbe->cond); + + return 0; +} + +void av_rpi_zc_set_decoder_pool_size(ZcEnv *const zc, const unsigned int pool_size) +{ + zc->pool_size = pool_size; +} + +unsigned int av_rpi_zc_get_decoder_pool_size(ZcEnv *const zc) +{ + return zc->pool_size; +} + +int av_rpi_zc_get_buffer(ZcEnv *const zc, AVFrame * const frame) +{ +#if 1 + ZcBufEnv * zbe = av_mallocz(sizeof(*zbe)); + + for (unsigned int i = 0; i < AV_NUM_DATA_POINTERS; i++) { + frame->buf[i] = NULL; + frame->data[i] = NULL; + frame->linesize[i] = 0; + } + + if (zbe == NULL) + return AVERROR(ENOMEM); + + if ((frame->buf[0] = av_buffer_create((uint8_t *)zbe, sizeof(*zbe), zc_buf_env_free_cb, zbe, 0)) == NULL) + { + av_free(zbe); + return AVERROR(ENOMEM); + } + + pthread_mutex_init(&zbe->lock, NULL); + pthread_cond_init(&zbe->cond, NULL); + zbe->zc = zc; + atomic_fetch_add(&zc->refcount, 1); + + zbe->geo = av_rpi_zc_frame_geometry(frame->format, frame->width, frame->height); // Note geometry for later use + zbe->size_y = zbe->geo.stride_y * zbe->geo.height_y; + zbe->size_c = zbe->geo.stride_c * zbe->geo.height_c; + zbe->size_pic = (zbe->size_y + zbe->size_c * zbe->geo.planes_c) * zbe->geo.stripes; + +#else + const AVRpiZcFrameGeometry geo = av_rpi_zc_frame_geometry(frame->format, frame->width, frame->height); + const unsigned int size_y = geo.stride_y * geo.height_y; + const unsigned int size_c = geo.stride_c * geo.height_c; + const unsigned int size_pic = (size_y + size_c * geo.planes_c) * geo.stripes; + AVBufferRef * buf; + unsigned int i; + +// printf("Do local alloc: format=%#x, %dx%d: %u\n", frame->format, frame->width, frame->height, size_pic); + + if ((buf = zc->alloc_buf(zc->pool_env, size_pic, &geo)) == NULL) + { + av_log(NULL, AV_LOG_ERROR, "rpi_get_display_buffer: Failed to get buffer from pool\n"); + return AVERROR(ENOMEM); + } + + // Track + atomic_fetch_add(&zc->refcount, 1); + pic_zbe_ptr(buf)->zc = zc; + + for (i = 0; i < AV_NUM_DATA_POINTERS; i++) { + frame->buf[i] = NULL; + frame->data[i] = NULL; + frame->linesize[i] = 0; + } + + frame->buf[0] = buf; + + frame->linesize[0] = geo.stride_y; + frame->linesize[1] = geo.stride_c; + frame->linesize[2] = geo.stride_c; + // abuse: linesize[3] = "stripe stride" + // stripe_stride is NOT the stride between slices it is (that / geo.stride_y). + // In a general case this makes the calculation an xor and multiply rather + // than a divide and multiply + if (geo.stripes > 1) + frame->linesize[3] = geo.stripe_is_yc ? geo.height_y + geo.height_c : geo.height_y; + + frame->data[0] = buf->data; + frame->data[1] = frame->data[0] + (geo.stripe_is_yc ? size_y : size_y * geo.stripes); + if (geo.planes_c > 1) + frame->data[2] = frame->data[1] + size_c; + + frame->extended_data = frame->data; + // Leave extended buf alone + +#if RPI_ZC_SAND_8_IN_10_BUF != 0 + // *** If we intend to use this for real we will want a 2nd buffer pool + frame->buf[RPI_ZC_SAND_8_IN_10_BUF] = zc_pool_buf_alloc(&zc->pool, size_pic); // *** 2 * wanted size - kludge +#endif +#endif + + return 0; +} + +void av_rpi_zc_env_release(const AVZcEnvPtr zc) +{ + const int n = atomic_fetch_add(&zc->refcount, -1); + if (n == 1) // was 1, now 0 + { + zc->free_pool(zc->pool_env); + av_free(zc); + } +} + +AVZcEnvPtr av_rpi_zc_env_alloc(void * logctx, + void * pool_env, + av_rpi_zc_alloc_buf_fn_t * alloc_buf_fn, + av_rpi_zc_free_pool_fn_t * free_pool_fn) +{ + ZcEnv * zc; + + if ((zc = av_mallocz(sizeof(ZcEnv))) == NULL) + { + av_log(logctx, AV_LOG_ERROR, "av_rpi_zc_env_alloc: Context allocation failed\n"); + return NULL; + } + + *zc = (ZcEnv){ + .refcount = ATOMIC_VAR_INIT(1), + .pool_env = pool_env, + .alloc_buf = alloc_buf_fn, + .free_pool = free_pool_fn, + .pool_size = 0 + }; + + return zc; +} + +//============================================================================ +// +// External ZC initialisation + +#define RPI_GET_BUFFER2 1 + + +static int zc_get_buffer2(struct AVCodecContext *s, AVFrame *frame, int flags) +{ +#if !RPI_GET_BUFFER2 + return avcodec_default_get_buffer2(s, frame, flags); +#else + int rv; + + if ((s->codec->capabilities & AV_CODEC_CAP_DR1) == 0) + { +// printf("Do default alloc: format=%#x\n", frame->format); + rv = avcodec_default_get_buffer2(s, frame, flags); + } + else if (frame->format == AV_PIX_FMT_YUV420P || + av_rpi_is_sand_frame(frame)) + { + if ((rv = av_rpi_zc_get_buffer(s->opaque, frame)) == 0) + rv = av_rpi_zc_resolve_frame(frame, ZC_RESOLVE_ALLOC_VALID); + } + else + { + rv = avcodec_default_get_buffer2(s, frame, flags); + } + +#if 0 + printf("%s: fmt:%d, %dx%d lsize=%d/%d/%d/%d data=%p/%p/%p bref=%p/%p/%p opaque[0]=%p\n", __func__, + frame->format, frame->width, frame->height, + frame->linesize[0], frame->linesize[1], frame->linesize[2], frame->linesize[3], + frame->data[0], frame->data[1], frame->data[2], + frame->buf[0], frame->buf[1], frame->buf[2], + av_buffer_get_opaque(frame->buf[0])); +#endif + return rv; +#endif +} + +int av_rpi_zc_in_use(const struct AVCodecContext * const s) +{ + return s->get_buffer2 == zc_get_buffer2; +} + +int av_rpi_zc_init2(struct AVCodecContext * const s, + void * pool_env, + av_rpi_zc_alloc_buf_fn_t * alloc_buf_fn, + av_rpi_zc_free_pool_fn_t * free_pool_fn) +{ + ZcEnv * zc; + + av_assert0(!av_rpi_zc_in_use(s)); + + if ((zc = av_rpi_zc_env_alloc(s, pool_env, alloc_buf_fn, free_pool_fn)) == NULL) + return AVERROR(ENOMEM); + + zc->old = (ZcOldCtxVals){ + .opaque = s->opaque, + .get_buffer2 = s->get_buffer2, + .thread_safe_callbacks = s->thread_safe_callbacks + }; + + s->opaque = zc; + s->get_buffer2 = zc_get_buffer2; + s->thread_safe_callbacks = 1; + return 0; +} + +void av_rpi_zc_uninit2(struct AVCodecContext * const s) +{ + ZcEnv * const zc = s->opaque; + + av_assert0(av_rpi_zc_in_use(s)); + + s->get_buffer2 = zc->old.get_buffer2; + s->opaque = zc->old.opaque; + s->thread_safe_callbacks = zc->old.thread_safe_callbacks; + + av_rpi_zc_env_release(zc); +} + diff --git a/libavcodec/rpi_zc.h b/libavcodec/rpi_zc.h new file mode 100644 index 0000000000..f00a7c962c --- /dev/null +++ b/libavcodec/rpi_zc.h @@ -0,0 +1,228 @@ +/* +Copyright (c) 2018 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox +*/ + +#ifndef LIBAVCODEC_RPI_ZC_H +#define LIBAVCODEC_RPI_ZC_H + +// Zero-Copy frame code for RPi +// RPi needs Y/U/V planes to be contiguous for display. By default +// ffmpeg will allocate separated planes so a memcpy is needed before +// display. This code provides a method a making ffmpeg allocate a single +// bit of memory for the frame when can then be reference counted until +// display has finished with it. + +// Frame buffer number in which to stuff an 8-bit copy of a 16-bit frame +// 0 disables +// *** This option still in development +// Only works if SAO active +// Allocates buffers that are twice the required size +#define RPI_ZC_SAND_8_IN_10_BUF 0 + +struct AVBufferRef; +struct AVFrame; +struct AVCodecContext; +enum AVPixelFormat; + +// "Opaque" pointer to whatever we are using as a buffer reference +typedef struct AVBufferRef * AVRpiZcRefPtr; + +struct AVZcEnv; +typedef struct AVZcEnv * AVZcEnvPtr; + +typedef struct AVRpiZcFrameGeometry +{ + unsigned int stride_y; // Luma stride (bytes) + unsigned int height_y; // Luma height (lines) + unsigned int stride_c; // Chroma stride (bytes) + unsigned int height_c; // Chroma stride (lines) + unsigned int planes_c; // Chroma plane count (U, V = 2, interleaved = 1) + unsigned int stripes; // Number of stripes (sand) + unsigned int bytes_per_pel; + int stripe_is_yc; // A single stripe is Y then C (false for tall sand) + + int format; // Requested format + unsigned int video_width; // Requested width + unsigned int video_height; // Requested height +} AVRpiZcFrameGeometry; + +// Get expected MMAL geometry for a given format, width & height +AVRpiZcFrameGeometry av_rpi_zc_frame_geometry( + const int format, + const unsigned int video_width, const unsigned int video_height); + +//---------------------------------------------------------------------------- +// +// Calls that extract info from a ZC frame whether internally or externally +// allocated + +// Generate a ZC reference to the buffer(s) in this frame +// If the buffer doesn't appear to be one allocated by ZC +// then the behaviour depends on maycopy: +// If maycopy=0 then return NULL +// If maycopy=1 && the src frame is in a form where we can easily copy +// the data, then allocate a new buffer and copy the data into it +// Otherwise return NULL +// If maycopy == 0 then ZC may be NULL +AVRpiZcRefPtr av_rpi_zc_ref(void * const logging_context, const AVZcEnvPtr zc, + const struct AVFrame * const frame, const enum AVPixelFormat expected_format, const int maycopy); + +// Unreference the buffer refed/allocated by _zc_ref +// If fr_ref is NULL then this will NOP +void av_rpi_zc_unref(AVRpiZcRefPtr fr_ref); + +// Get the vc_handle from the frame ref +// Returns -1 if ref doesn't look valid +int av_rpi_zc_vc_handle(const AVRpiZcRefPtr fr_ref); +// Get the vcsm_handle from the frame ref +// Returns 0 if ref doesn't look valid +unsigned int av_rpi_zc_vcsm_handle(const AVRpiZcRefPtr fr_ref); +// Get offset from the start of the memory referenced +// by the vc_handle to valid data +int av_rpi_zc_offset(const AVRpiZcRefPtr fr_ref); +// Length of buffer data +int av_rpi_zc_length(const AVRpiZcRefPtr fr_ref); +// Get the number of bytes allocated from the frame ref +// Returns 0 if ref doesn't look valid +int av_rpi_zc_numbytes(const AVRpiZcRefPtr fr_ref); +// Geometry this frame was allocated with +const AVRpiZcFrameGeometry * av_rpi_zc_geometry(const AVRpiZcRefPtr fr_ref); + +//---------------------------------------------------------------------------- +// +// Calls for external frame allocation + +// Callbacks registered in av_rpi_zc_init2 + +// Callback to allocate a buf for a frame +// The frame itself is generated in the calling code +// +// Parameters: +// pool_env value passed to av-rpi_zc_init2 +// size size wanted +// geo geometry of the frame to be allocated +// Returns: +// NULL Alloc failed +// ptr AVBufferBuf* of allocated buffer +// In most cases av_rpi_zc_buf will be called by this function +// and this will be the buf returned by that. +typedef AVBufferRef * av_rpi_zc_alloc_buf_fn_t(void * pool_env, size_t size, + const AVRpiZcFrameGeometry * geo); + +// Callback once ffmpeg is completely done with this pool +// Called once all allocated buffers have been derefed and ffmpegs ref to this +// pool has been dropped +typedef void av_rpi_zc_free_pool_fn_t(void * pool_env); + +// Init ZC into a context +// Sets opaque, get_buffer2, thread_safe_callbacks +// Use if you want to allocate your own pools and/or create ZC buffers for +// all decoders +// RPI HEVC decoders will allocate appropriate VCSM buffers which can be taken +// apart by av_rpi_zc_xxx calls without this +int av_rpi_zc_init2(struct AVCodecContext * const s, + void * pool_env, av_rpi_zc_alloc_buf_fn_t * alloc_buf_fn, + av_rpi_zc_free_pool_fn_t * free_pool_fn); + +// Free ZC from a context +void av_rpi_zc_uninit2(struct AVCodecContext * const s); + +// Get minimum pool size in frames - valid by the time the first alloc request +// occurs. Takes into account thread requests and DPB sizes derived from SPS +// rather than just adding a worst case DPB size. +unsigned int av_rpi_zc_get_decoder_pool_size(const AVZcEnvPtr zc); + +typedef struct av_rpi_zc_buf_fn_tab_s { + // This AVBuffer is being freed by ffmpeg - return memory + // to external pool. Memory may be, but need not be, unmapped. + // v is the ptr passed in av_rpi_zc_buf + void (* free)(void * v); + + // Return appropriate handles / mappings + // v is the ptr passed in av_rpi_zc_buf + unsigned int (* vcsm_handle)(void * v); + unsigned int (* vc_handle)(void * v); + void * (* map_arm)(void * v); + unsigned int (* map_vc)(void * v); +} av_rpi_zc_buf_fn_tab_t; + +// Allocate a ZC AVBufferRef and set its callback table +// Doesn't take a buffer address directly - relies on callbacks to return +// addresses as they are required. Mappings need not be generated until +// the map callbacks are called but they should persist from then until +// the buffer is freed. +// +// Parameters: +// numbytes Size of the buffer +// addr_offset Offset to first usable byte of buffer (for alignment) +// normally 0 +// v Pointer passed to callbacks +// fn_tab Function table +AVBufferRef * av_rpi_zc_buf(size_t numbytes, int addr_offset, void * v, const av_rpi_zc_buf_fn_tab_t * fn_tab); + +// Get v ptr set in in av_rpi_zc_buf +void * av_rpi_zc_buf_v(AVBufferRef * const buf); + +//---------------------------------------------------------------------------- +// +// Mostly internal calls but might possibly be wanted by outside code + +void av_rpi_zc_int_env_freep(AVZcEnvPtr * zc); +AVZcEnvPtr av_rpi_zc_int_env_alloc(void * const logctx); +void av_rpi_zc_set_decoder_pool_size(const AVZcEnvPtr zc, const unsigned int pool_size); + +// Test to see if the context is using zc (checks get_buffer2) +int av_rpi_zc_in_use(const struct AVCodecContext * const s); + +// Get buffer generates placeholders for later alloc +int av_rpi_zc_get_buffer(const AVZcEnvPtr zc, AVFrame * const frame); +// Resolve actually does the alloc (noop if already alloced) +// Set data pointers on a buffer/frame that was copied before the alloc +// accured +#define ZC_RESOLVE_FAIL 0 // return error on invalid +#define ZC_RESOLVE_ALLOC 1 // alloc as invalid +#define ZC_RESOLVE_WAIT_VALID 2 // wait for valid +#define ZC_RESOLVE_ALLOC_VALID 3 // alloc as valid +int av_rpi_zc_resolve_buffer(AVBufferRef * const buf, const int may_alloc); +int av_rpi_zc_resolve_frame(AVFrame * const frame, const int may_alloc); + +int av_rpi_zc_set_valid_frame(AVFrame * const frame); +int av_rpi_zc_set_broken_frame(AVFrame * const frame); + + + + +AVZcEnvPtr av_rpi_zc_env_alloc(void * logctx, + void * pool_env, + av_rpi_zc_alloc_buf_fn_t * alloc_buf_fn, + av_rpi_zc_free_pool_fn_t * free_pool_fn); +void av_rpi_zc_env_release(const AVZcEnvPtr zc); + + +#endif + diff --git a/libavcodec/rpi_zc_frames.h b/libavcodec/rpi_zc_frames.h new file mode 100644 index 0000000000..9b7b6536a4 --- /dev/null +++ b/libavcodec/rpi_zc_frames.h @@ -0,0 +1,142 @@ +/* +Copyright (c) 2018 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox, Ben Avison +*/ + +#ifndef RPI_ZC_FRAMES_H +#define RPI_ZC_FRAMES_H + +#define RPI_ONE_BUF 1 + +#include "rpi_mem.h" // for GPU_MEM_PTR_T +#include "libavutil/frame.h" + +#if !RPI_ONE_BUF +static inline uint32_t get_vc_address_y(const AVFrame * const frame) { + GPU_MEM_PTR_T *p = av_buffer_pool_buffer_get_opaque(frame->buf[0]); + return p->vc; +} + +static inline uint32_t get_vc_address_u(const AVFrame * const frame) { + GPU_MEM_PTR_T *p = av_buffer_pool_buffer_get_opaque(frame->buf[1]); + return p->vc; +} + +static inline uint32_t get_vc_address_v(const AVFrame * const frame) { + GPU_MEM_PTR_T *p = av_buffer_pool_buffer_get_opaque(frame->buf[2]); + return p->vc; +} + +static inline GPU_MEM_PTR_T get_gpu_mem_ptr_y(const AVFrame * const frame) { + return *(GPU_MEM_PTR_T *)av_buffer_pool_buffer_get_opaque(frame->buf[0]); +} + +static inline GPU_MEM_PTR_T get_gpu_mem_ptr_u(const AVFrame * const frame) { + return *(GPU_MEM_PTR_T *)av_buffer_pool_buffer_get_opaque(frame->buf[1]); +} + +static inline GPU_MEM_PTR_T get_gpu_mem_ptr_v(const AVFrame * const frame) { + return *(GPU_MEM_PTR_T *)av_buffer_pool_buffer_get_opaque(frame->buf[2]); +} + +#else + +static inline int gpu_is_buf1(const AVFrame * const frame) +{ + return frame->buf[1] == NULL; +} + +static inline GPU_MEM_PTR_T * gpu_buf1_gmem(const AVFrame * const frame) +{ + return av_buffer_get_opaque(frame->buf[0]); +} + +static inline GPU_MEM_PTR_T * gpu_buf3_gmem(const AVFrame * const frame, const unsigned int n) +{ + return av_buffer_pool_buffer_get_opaque(frame->buf[n]); +} + +static inline uint32_t get_vc_address3(const AVFrame * const frame, const unsigned int n) +{ + const GPU_MEM_PTR_T * const gm = gpu_is_buf1(frame) ? gpu_buf1_gmem(frame) : gpu_buf3_gmem(frame, n); + return gm->vc + (frame->data[n] - gm->arm); +} + + +static inline uint32_t get_vc_address_y(const AVFrame * const frame) { + return get_vc_address3(frame, 0); +} + +static inline uint32_t get_vc_address_u(const AVFrame * const frame) { + return get_vc_address3(frame, 1); +} + +static inline uint32_t get_vc_address_v(const AVFrame * const frame) { + return get_vc_address3(frame, 2); +} + +#if 0 +static inline GPU_MEM_PTR_T get_gpu_mem_ptr_y(const AVFrame * const frame) { + if (gpu_is_buf1(frame)) + { + GPU_MEM_PTR_T g = *gpu_buf1_gmem(frame); + g.numbytes = frame->data[1] - frame->data[0]; + return g; + } + else + return *gpu_buf3_gmem(frame, 0); +} + +static inline GPU_MEM_PTR_T get_gpu_mem_ptr_u(const AVFrame * const frame) { + if (gpu_is_buf1(frame)) + { + GPU_MEM_PTR_T g = *gpu_buf1_gmem(frame); + g.arm += frame->data[1] - frame->data[0]; + g.vc += frame->data[1] - frame->data[0]; + g.numbytes = frame->data[2] - frame->data[1]; // chroma size + return g; + } + else + return *gpu_buf3_gmem(frame, 1); +} + +static inline GPU_MEM_PTR_T get_gpu_mem_ptr_v(const AVFrame * const frame) { + if (gpu_is_buf1(frame)) + { + GPU_MEM_PTR_T g = *gpu_buf1_gmem(frame); + g.arm += frame->data[2] - frame->data[0]; + g.vc += frame->data[2] - frame->data[0]; + g.numbytes = frame->data[2] - frame->data[1]; // chroma size + return g; + } + else + return *gpu_buf3_gmem(frame, 2); +} +#endif +#endif + +#endif diff --git a/libavcodec/rpivid_hevc.c b/libavcodec/rpivid_hevc.c new file mode 100644 index 0000000000..85c5b46d75 --- /dev/null +++ b/libavcodec/rpivid_hevc.c @@ -0,0 +1,2128 @@ +// FFMPEG HEVC decoder hardware accelerator +// Andrew Holme, Argon Design Ltd +// Copyright (c) June 2017 Raspberry Pi Ltd + +#include +#include +#include +#include +#include +#include + +#include "fftools/ffmpeg.h" +#include "libavutil/avassert.h" +#include "libavutil/imgutils.h" +#include "avcodec.h" +#include "hwconfig.h" +#include "decode.h" + +#include "hevc.h" +#include "hevcdec.h" +#include "rpi_zc.h" +#include "rpi_mem.h" +#include "rpi_zc_frames.h" +#include "rpi_mailbox.h" + + +#define OPT_PHASE_TIMING 0 // Generate stats for phase usage + +#define OPT_EMU 0 + +#define TRACE_DEV 0 +#define TRACE_ENTRY 0 + +#define NUM_SCALING_FACTORS 4064 + +#define AXI_BASE64 0 + +#define PROB_BACKUP ((20<<12) + (20<<6) + (0<<0)) +#define PROB_RELOAD ((20<<12) + (20<<0) + (0<<6)) + +#define RPIVID_COL_PICS 17 // 16 ref & current + +#define RPIVID_BITBUFS 2 // Bit + Cmd bufs (phase 0 & 1) +#define RPIVID_BITBUF_SIZE (4 << 20) // Bit + Cmd buf size + +#define RPIVID_COEFFBUFS 3 // PU + Coeff bufs (phase 1 & 2) +#define RPIVID_COEFFBUF_SIZE (16 << 20) // PU + Coeff buf size + +////////////////////////////////////////////////////////////////////////////// +// +// Register offsets + +#define RPI_SPS0 0 +#define RPI_SPS1 4 +#define RPI_PPS 8 +#define RPI_SLICE 12 +#define RPI_TILESTART 16 +#define RPI_TILEEND 20 +#define RPI_SLICESTART 24 +#define RPI_MODE 28 +#define RPI_LEFT0 32 +#define RPI_LEFT1 36 +#define RPI_LEFT2 40 +#define RPI_LEFT3 44 +#define RPI_QP 48 +#define RPI_CONTROL 52 +#define RPI_STATUS 56 +#define RPI_VERSION 60 +#define RPI_BFBASE 64 +#define RPI_BFNUM 68 +#define RPI_BFCONTROL 72 +#define RPI_BFSTATUS 76 +#define RPI_PUWBASE 80 +#define RPI_PUWSTRIDE 84 +#define RPI_COEFFWBASE 88 +#define RPI_COEFFWSTRIDE 92 +#define RPI_SLICECMDS 96 +#define RPI_BEGINTILEEND 100 +#define RPI_TRANSFER 104 +#define RPI_CFBASE 108 +#define RPI_CFNUM 112 +#define RPI_CFSTATUS 116 + +#define RPI_PURBASE 0x8000 +#define RPI_PURSTRIDE 0x8004 +#define RPI_COEFFRBASE 0x8008 +#define RPI_COEFFRSTRIDE 0x800C +#define RPI_NUMROWS 0x8010 +#define RPI_CONFIG2 0x8014 +#define RPI_OUTYBASE 0x8018 +#define RPI_OUTYSTRIDE 0x801C +#define RPI_OUTCBASE 0x8020 +#define RPI_OUTCSTRIDE 0x8024 +#define RPI_STATUS2 0x8028 +#define RPI_FRAMESIZE 0x802C +#define RPI_MVBASE 0x8030 +#define RPI_MVSTRIDE 0x8034 +#define RPI_COLBASE 0x8038 +#define RPI_COLSTRIDE 0x803C +#define RPI_CURRPOC 0x8040 + +////////////////////////////////////////////////////////////////////////////// + +// Unused but left here to illustrate the diffrences between FFmpegs prob +// structure and the rpivid one + +struct FFM_PROB { + uint8_t sao_merge_flag [ 1]; + uint8_t sao_type_idx [ 1]; + uint8_t split_coding_unit_flag [ 3]; + uint8_t cu_transquant_bypass_flag [ 1]; + uint8_t skip_flag [ 3]; + uint8_t cu_qp_delta [ 3]; + uint8_t pred_mode_flag [ 1]; + uint8_t part_mode [ 4]; + uint8_t prev_intra_luma_pred_flag [ 1]; + uint8_t intra_chroma_pred_mode [ 2]; + uint8_t merge_flag [ 1]; + uint8_t merge_idx [ 1]; + uint8_t inter_pred_idc [ 5]; + uint8_t ref_idx_l0 [ 2]; + uint8_t ref_idx_l1 [ 2]; + uint8_t abs_mvd_greater0_flag [ 2]; + uint8_t abs_mvd_greater1_flag [ 2]; + uint8_t mvp_lx_flag [ 1]; + uint8_t no_residual_data_flag [ 1]; + uint8_t split_transform_flag [ 3]; + uint8_t cbf_luma [ 2]; + uint8_t cbf_cb_cr [ 4]; + uint8_t transform_skip_flag/*[][]*/ [ 2]; + uint8_t explicit_rdpcm_flag/*[][]*/ [ 2]; + uint8_t explicit_rdpcm_dir_flag/*[][]*/ [ 2]; + uint8_t last_significant_coeff_x_prefix [18]; + uint8_t last_significant_coeff_y_prefix [18]; + uint8_t significant_coeff_group_flag [ 4]; + uint8_t significant_coeff_flag [44]; + uint8_t coeff_abs_level_greater1_flag [24]; + uint8_t coeff_abs_level_greater2_flag [ 6]; + uint8_t log2_res_scale_abs [ 8]; + uint8_t res_scale_sign_flag [ 2]; + uint8_t cu_chroma_qp_offset_flag [ 1]; + uint8_t cu_chroma_qp_offset_idx [ 1]; +} __attribute__((packed)); + +////////////////////////////////////////////////////////////////////////////// + +struct RPI_PROB { + uint8_t SAO_MERGE_FLAG [ 1]; + uint8_t SAO_TYPE_IDX [ 1]; + uint8_t SPLIT_FLAG [ 3]; + uint8_t CU_SKIP_FLAG [ 3]; + uint8_t CU_TRANSQUANT_BYPASS_FLAG [ 1]; + uint8_t PRED_MODE [ 1]; + uint8_t PART_SIZE [ 4]; + uint8_t INTRA_PRED_MODE [ 1]; + uint8_t CHROMA_PRED_MODE [ 1]; + uint8_t MERGE_FLAG_EXT [ 1]; + uint8_t MERGE_IDX_EXT [ 1]; + uint8_t INTER_DIR [ 5]; + uint8_t REF_PIC [ 2]; + uint8_t MVP_IDX [ 1]; + uint8_t MVD [ 2]; + uint8_t QT_ROOT_CBF [ 1]; + uint8_t TRANS_SUBDIV_FLAG [ 3]; + uint8_t QT_CBF [ 6]; + uint8_t DQP [ 2]; + uint8_t ONE_FLAG [24]; + uint8_t LASTX [18]; + uint8_t LASTY [18]; + uint8_t SIG_CG_FLAG [ 4]; + uint8_t ABS_FLAG [ 6]; + uint8_t TRANSFORMSKIP_FLAG [ 2]; + uint8_t SIG_FLAG [42]; + uint8_t SIG_FLAG_unused [ 2]; +} __attribute__((packed)); + +////////////////////////////////////////////////////////////////////////////// + +struct RPI_CMD { + uint32_t addr; + uint32_t data; +} __attribute__((packed)); + +struct RPI_BIT { + int cmd; + const void *ptr; + int len; +}; + +////////////////////////////////////////////////////////////////////////////// + +struct RPI_T; + +// Actual addressability is 38bits but we can only alloc in the bottom 32 +// currently - when passed to rpivid h/w the address is always >> 6 so will +// fit in 32 bit there +// At some point we may weant to make this uint64_t +typedef uint32_t vid_vc_addr_t; + +typedef enum rpivid_decode_state_e { + RPIVID_DECODE_NEW = 0, + RPIVID_DECODE_START, + RPIVID_DECODE_SLICE, + RPIVID_DECODE_END, +} rpivid_decode_state_t; + +#define RPI_PROB_VALS 154U +#define RPI_PROB_ARRAY_SIZE ((154 + 3) & ~3) + +typedef struct dec_env_s { + const AVCodecContext * avctx; + + rpivid_decode_state_t state; + unsigned int decode_order; + + int phase_no; // Current phase (i.e. the last one we waited for) + struct dec_env_s * phase_wait_q_next; + sem_t phase_wait; + + struct RPI_BIT *bit_fifo; + struct RPI_CMD *cmd_fifo; + unsigned int bit_len, bit_max; + unsigned int cmd_len, cmd_max; + unsigned int num_slice_msgs; + unsigned int PicWidthInCtbsY; + unsigned int PicHeightInCtbsY; + unsigned int dpbno_col; + uint32_t reg_slicestart; + unsigned int wpp_entry_x; + unsigned int wpp_entry_y; + + const uint8_t * nal_buffer; + size_t nal_size; + + uint16_t slice_msgs[2*HEVC_MAX_REFS*8+3]; + uint8_t scaling_factors[NUM_SCALING_FACTORS]; +// unsigned int RefPicList[2][HEVC_MAX_REFS]; +} dec_env_t; + +#define RPIVID_PHASES 3 +#define RPIVID_PHASE_NEW (RPIVID_PHASES) // Phase before we have inced decode order +#define RPIVID_PHASE_START (-1) // Phase after we have inced decode_order + +#if OPT_PHASE_TIMING +static const unsigned int time_thresholds[8] = { + 10, 15, 20, 30, 45, 60, 75, 90 +}; +#endif + +typedef struct phase_wait_env_s { + unsigned int last_order; + dec_env_t * q; +#if OPT_PHASE_TIMING + uint64_t phase_time; + uint64_t max_phase_time; + uint64_t time_in_phase; + uint64_t time_out_phase; + unsigned int max_time_decode_order; + unsigned int time_bins[9]; + unsigned int time_bins3[9]; + unsigned int time_bins5[9]; + uint64_t time_stash[16]; + unsigned int i3; +#endif +} phase_wait_env_t; // Single linked list of threads waiting for this phase + +typedef struct RPI_T { + atomic_int ref_count; + sem_t ref_zero; + + dec_env_t ** dec_envs; + AVZcEnvPtr zc; + + pthread_mutex_t phase_lock; + phase_wait_env_t phase_reqs[RPIVID_PHASES]; + + volatile uint32_t * regs; + volatile uint32_t * ints; + + GPU_MEM_PTR_T gcolbuf; + unsigned int col_stride; + size_t col_picsize; + + unsigned int bitbuf_no; + sem_t bitbuf_sem; + GPU_MEM_PTR_T gbitbufs[RPIVID_BITBUFS]; + + unsigned int max_pu_msgs; + unsigned int coeffbuf_no; + sem_t coeffbuf_sem; + GPU_MEM_PTR_T gcoeffbufs[RPIVID_COEFFBUFS]; + + unsigned int decode_order; + int mbox_fd; + int gpu_init_type; +} RPI_T; + +#if OPT_PHASE_TIMING +static uint64_t tus64(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * 1000000 + ts.tv_nsec / 1000; +} +#endif + +static inline unsigned int rnd64(unsigned int x) +{ + return (x + 63) & ~63; +} + +static inline int rpi_sem_wait(sem_t * const sem) +{ + int rv; + while ((rv = sem_wait(sem)) != 0 && errno == EINTR) + /* Loop */; + return rv; +} + +//============================================================================ + +#define REGS_NAME "/dev/rpivid-hevcmem" +#define REGS_SIZE 0x10000 +#define INTS_NAME "/dev/rpivid-intcmem" +#define INTS_SIZE 0x10000 // 4 is probably enough but we are going to alloc a page anyway + +static volatile uint32_t * map_dev(AVCodecContext * const avctx, const char * const dev_name, size_t size) +{ + void *gpio_map; + int mem_fd; + + /* open /dev/mem */ + if ((mem_fd = open(dev_name, O_RDWR|O_SYNC) ) < 0) { + av_log(avctx, AV_LOG_WARNING, "can't open %s\n", dev_name); + return NULL; + } + + // Now map it + gpio_map = mmap( + NULL, + size, + PROT_READ|PROT_WRITE, + MAP_SHARED, + mem_fd, + 0 + ); + + close(mem_fd); // No longer need the FD + + if (gpio_map == MAP_FAILED) { + av_log(avctx, AV_LOG_WARNING, "GPIO mapping failed"); + return NULL; + } + + return (volatile uint32_t *)gpio_map; +} + +static void unmap_devp(volatile uint32_t ** const p_gpio_map, size_t size) +{ + volatile uint32_t * const gpio_map = *p_gpio_map; + if (gpio_map != NULL) { + *p_gpio_map = NULL; + munmap((void *)gpio_map, size); + } +} + +#define MANGLE(x) ((x) &~0xc0000000) // ** If x is ever a 64 bit thing this will need fixing! +#define MANGLE64(x) (uint32_t)(MANGLE(x)>>6) + +static inline void apb_write_vc_addr(const RPI_T *const rpi, const uint32_t addr, const vid_vc_addr_t data) +{ +#if TRACE_DEV + printf("W %x %08x\n", addr, MANGLE64(data)); +#endif + + rpi->regs[addr >> 2] = MANGLE64(data); +} + +static inline void apb_write_vc_len(const RPI_T *const rpi, const uint32_t addr, const unsigned int data) +{ +#if TRACE_DEV + printf("W %x %08x\n", addr, data >> 6); +#endif + + rpi->regs[addr >> 2] = data >> 6; // ?? rnd64 - but not currently needed +} + +static inline void apb_write(const RPI_T * const rpi, const uint32_t addr, const uint32_t data) +{ +#if TRACE_DEV + printf("W %x %08x\n", addr, data); +#endif + + rpi->regs[addr >> 2] = data; +} + +static inline uint32_t apb_read(const RPI_T * const rpi, const uint32_t addr) +{ + const uint32_t v = rpi->regs[addr >> 2]; +#if TRACE_DEV + printf("R %x (=%x)\n", addr, v); +#endif + return v; +} + +#define ARG_IC_ICTRL_ACTIVE1_INT_SET 0x00000001 +#define ARG_IC_ICTRL_ACTIVE1_EDGE_SET 0x00000002 +#define ARG_IC_ICTRL_ACTIVE1_EN_SET 0x00000004 +#define ARG_IC_ICTRL_ACTIVE1_STATUS_SET 0x00000008 +#define ARG_IC_ICTRL_ACTIVE2_INT_SET 0x00000010 +#define ARG_IC_ICTRL_ACTIVE2_EDGE_SET 0x00000020 +#define ARG_IC_ICTRL_ACTIVE2_EN_SET 0x00000040 +#define ARG_IC_ICTRL_ACTIVE2_STATUS_SET 0x00000080 + +static inline void int_wait(const RPI_T * const rpi, const unsigned int phase) +{ + const uint32_t mask_reset = phase == 1 ? ~ARG_IC_ICTRL_ACTIVE2_INT_SET : ~ARG_IC_ICTRL_ACTIVE1_INT_SET; + const uint32_t mask_done = phase == 1 ? ARG_IC_ICTRL_ACTIVE1_INT_SET : ARG_IC_ICTRL_ACTIVE2_INT_SET; + uint32_t ival; + while (((ival = rpi->ints[0]) & mask_done) == 0) { + usleep(1000); + } + rpi->ints[0] = ival & mask_reset; +} + +#if TRACE_DEV && 0 +static void apb_dump_regs(const RPI_T * const rpi, uint16_t addr, int num) { + int i; + + for (i=0; iregs[(addr>>2)+i]); + + if ((i%4)==3 || i+1 == num) + printf("\n"); + else + printf(" "); + } +} + +static void axi_dump(const dec_env_t * const de, uint64_t addr, uint32_t size) { + int i; + + for (i=0; i>2; i++) + { + if ((i%4)==0) + printf("%08x: ", MANGLE(de->gbuf.vc) + (uint32_t)addr + 4*i); + + printf("%08x", ((uint32_t*)de->gbuf.arm)[(addr>>2)+i]); + + if ((i%4)==3 || i+1 == size>>2) + printf("\n"); + else + printf(" "); + } +} +#endif + +////////////////////////////////////////////////////////////////////////////// + +static inline size_t round_up_size(const size_t x) +{ + /* Admit no size < 256 */ + const unsigned int n = x < 256 ? 8 : av_log2(x) - 1; + + return x >= (3 << n) ? 4 << n : (3 << n); +} + +////////////////////////////////////////////////////////////////////////////// +// Scaling factors + +static void expand_scaling_list( + const unsigned int sizeID, + const unsigned int matrixID, + uint8_t * const dst0, + const uint8_t * const src0, + uint8_t dc) +{ + switch (sizeID) { + case 0: + memcpy(dst0, src0, 16); + break; + case 1: + memcpy(dst0, src0, 64); + break; + case 2: + { + uint8_t * d = dst0; + for (unsigned int y=0; y != 16; y++) { + const uint8_t * s = src0 + (y >> 1) * 8; + for (unsigned int x = 0; x != 8; ++x) { + *d++ = *s; + *d++ = *s++; + } + } + dst0[0] = dc; + break; + } + default: + { + uint8_t * d = dst0; + for (unsigned int y=0; y != 32; y++) { + const uint8_t * s = src0 + (y >> 2) * 8; + for (unsigned int x = 0; x != 8; ++x) { + *d++ = *s; + *d++ = *s; + *d++ = *s; + *d++ = *s++; + } + } + dst0[0] = dc; + break; + } + } +} + +static void populate_scaling_factors(dec_env_t * const de, const HEVCContext * const s) { + // Array of constants for scaling factors + static const uint32_t scaling_factor_offsets[4][6] = { + // MID0 MID1 MID2 MID3 MID4 MID5 + {0x0000, 0x0010, 0x0020, 0x0030, 0x0040, 0x0050}, // SID0 (4x4) + {0x0060, 0x00A0, 0x00E0, 0x0120, 0x0160, 0x01A0}, // SID1 (8x8) + {0x01E0, 0x02E0, 0x03E0, 0x04E0, 0x05E0, 0x06E0}, // SID2 (16x16) + {0x07E0, 0, 0, 0x0BE0, 0, 0}}; // SID3 (32x32) + + // ffmpeg places SID3,MID1 where matrixID 3 normally is + const ScalingList * const sl = + s->ps.pps->scaling_list_data_present_flag ? &s->ps.pps->scaling_list + : &s->ps.sps->scaling_list; + unsigned int mid; + + for (mid=0; mid<6; mid++) + expand_scaling_list(0, mid, + de->scaling_factors + scaling_factor_offsets[0][mid], + sl->sl[0][mid], 0); + for (mid=0; mid<6; mid++) + expand_scaling_list(1, mid, + de->scaling_factors + scaling_factor_offsets[1][mid], + sl->sl[1][mid], 0); + for (mid=0; mid<6; mid++) + expand_scaling_list(2, mid, + de->scaling_factors + scaling_factor_offsets[2][mid], + sl->sl[2][mid], + sl->sl_dc[0][mid]); + // second scaling matrix for 32x32 is at matrixID 3 not 1 in ffmpeg + for (mid=0; mid<6; mid += 3) + expand_scaling_list(3, mid, + de->scaling_factors + scaling_factor_offsets[3][mid], + sl->sl[3][mid], + sl->sl_dc[1][mid]); +} + +////////////////////////////////////////////////////////////////////////////// +// Probabilities + +static const uint8_t prob_init[3][156] = { + { + 153, 200, 139, 141, 157, 154, 154, 154, + 154, 154, 184, 154, 154, 154, 184, 63, + 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 153, 138, 138, + 111, 141, 94, 138, 182, 154, 154, 154, + 140, 92, 137, 138, 140, 152, 138, 139, + 153, 74, 149, 92, 139, 107, 122, 152, + 140, 179, 166, 182, 140, 227, 122, 197, + 110, 110, 124, 125, 140, 153, 125, 127, + 140, 109, 111, 143, 127, 111, 79, 108, + 123, 63, 110, 110, 124, 125, 140, 153, + 125, 127, 140, 109, 111, 143, 127, 111, + 79, 108, 123, 63, 91, 171, 134, 141, + 138, 153, 136, 167, 152, 152, 139, 139, + 111, 111, 125, 110, 110, 94, 124, 108, + 124, 107, 125, 141, 179, 153, 125, 107, + 125, 141, 179, 153, 125, 107, 125, 141, + 179, 153, 125, 140, 139, 182, 182, 152, + 136, 152, 136, 153, 136, 139, 111, 136, + 139, 111, 0, 0, }, + { + 153, 185, 107, 139, 126, 197, 185, 201, + 154, 149, 154, 139, 154, 154, 154, 152, + 110, 122, 95, 79, 63, 31, 31, 153, + 153, 168, 140, 198, 79, 124, 138, 94, + 153, 111, 149, 107, 167, 154, 154, 154, + 154, 196, 196, 167, 154, 152, 167, 182, + 182, 134, 149, 136, 153, 121, 136, 137, + 169, 194, 166, 167, 154, 167, 137, 182, + 125, 110, 94, 110, 95, 79, 125, 111, + 110, 78, 110, 111, 111, 95, 94, 108, + 123, 108, 125, 110, 94, 110, 95, 79, + 125, 111, 110, 78, 110, 111, 111, 95, + 94, 108, 123, 108, 121, 140, 61, 154, + 107, 167, 91, 122, 107, 167, 139, 139, + 155, 154, 139, 153, 139, 123, 123, 63, + 153, 166, 183, 140, 136, 153, 154, 166, + 183, 140, 136, 153, 154, 166, 183, 140, + 136, 153, 154, 170, 153, 123, 123, 107, + 121, 107, 121, 167, 151, 183, 140, 151, + 183, 140, 0, 0, }, + { + 153, 160, 107, 139, 126, 197, 185, 201, + 154, 134, 154, 139, 154, 154, 183, 152, + 154, 137, 95, 79, 63, 31, 31, 153, + 153, 168, 169, 198, 79, 224, 167, 122, + 153, 111, 149, 92, 167, 154, 154, 154, + 154, 196, 167, 167, 154, 152, 167, 182, + 182, 134, 149, 136, 153, 121, 136, 122, + 169, 208, 166, 167, 154, 152, 167, 182, + 125, 110, 124, 110, 95, 94, 125, 111, + 111, 79, 125, 126, 111, 111, 79, 108, + 123, 93, 125, 110, 124, 110, 95, 94, + 125, 111, 111, 79, 125, 126, 111, 111, + 79, 108, 123, 93, 121, 140, 61, 154, + 107, 167, 91, 107, 107, 167, 139, 139, + 170, 154, 139, 153, 139, 123, 123, 63, + 124, 166, 183, 140, 136, 153, 154, 166, + 183, 140, 136, 153, 154, 166, 183, 140, + 136, 153, 154, 170, 153, 138, 138, 122, + 121, 122, 121, 167, 151, 183, 140, 151, + 183, 140, 0, 0, }, +}; + + +////////////////////////////////////////////////////////////////////////////// +// Phase 1 command and bit FIFOs + +// ???? uint16_t addr - put in uint32_t +static int p1_apb_write(dec_env_t * const de, const uint16_t addr, const uint32_t data) { + if (de->cmd_len==de->cmd_max) + av_assert0(de->cmd_fifo = realloc(de->cmd_fifo, (de->cmd_max*=2)*sizeof(struct RPI_CMD))); + +#if TRACE_DEV + printf("[%02x] %x %x\n", de->cmd_len, addr, data); +#endif + + de->cmd_fifo[de->cmd_len].addr = addr; + de->cmd_fifo[de->cmd_len].data = data; + return de->cmd_len++; +} + +static void p1_axi_write(dec_env_t * const de, const uint32_t len, const void * const ptr, const int cmd_idx) { + if (de->bit_len==de->bit_max) + av_assert0(de->bit_fifo = realloc(de->bit_fifo, (de->bit_max*=2)*sizeof(struct RPI_BIT))); + de->bit_fifo[de->bit_len].cmd = cmd_idx; + de->bit_fifo[de->bit_len].ptr = ptr; + de->bit_fifo[de->bit_len].len = len; + de->bit_len++; +} + +////////////////////////////////////////////////////////////////////////////// +// Write probability and scaling factor memories + +#if 0 +static void WriteProb(dec_env_t * const de) { + int i; + const uint8_t *p = (uint8_t *) &de->probabilities; + for (i=0; ish.cabac_init_flag && s->sh.slice_type != HEVC_SLICE_I) ? + s->sh.slice_type + 1 : 2 - s->sh.slice_type; + const uint8_t * p = prob_init[init_type]; + const int q = av_clip(s->sh.slice_qp, 0, 51); + unsigned int i; + + for (i = 0; i < RPI_PROB_VALS; i++) { + int init_value = p[i]; + int m = (init_value >> 4) * 5 - 45; + int n = ((init_value & 15) << 3) - 16; + int pre = 2 * (((m * q) >> 4) + n) - 127; + + pre ^= pre >> 31; + if (pre > 124) + pre = 124 + (pre & 1); + dst[i] = pre; + } + for (i = RPI_PROB_VALS; i != RPI_PROB_ARRAY_SIZE; ++i) { + dst[i] = 0; + } + + for (i=0; i < RPI_PROB_ARRAY_SIZE; i+=4) + p1_apb_write(de, 0x1000+i, dst[i] + (dst[i+1]<<8) + (dst[i+2]<<16) + (dst[i+3]<<24)); + +} + + +static void WriteScalingFactors(dec_env_t * const de) { + int i; + const uint8_t *p = (uint8_t *) de->scaling_factors; + for (i=0; i= bd[i]; i++); // bd[] has num+1 elements; bd[0]=0; see hevc_ps.c + return i-1; +} + +static int ctb_to_slice_w_h (unsigned int ctb, int ctb_size, int width, unsigned int *bd, int num) { + if (ctb < bd[num-1]) return ctb_size; + else if (width % ctb_size) return width % ctb_size; + else return ctb_size; +} + +////////////////////////////////////////////////////////////////////////////// +// Handle PU and COEFF stream overflow + + +// Returns: +// -2 Other error +// -1 Out of coeff space +// 0 OK +// 1 Out of PU space + +static int check_status(const RPI_T * const rpi, dec_env_t * const de) { + uint32_t status; + + // this is the definition of successful completion of phase 1 + // it assures that status register is zero and all blocks in each tile have completed + if (apb_read(rpi, RPI_CFSTATUS) == apb_read(rpi, RPI_CFNUM)) + return 0; + + status = apb_read(rpi, RPI_STATUS); + + if ((status & 8) != 0) + return -1; + + if ((status & 0x10) != 0) + return 1; + + return -2; +} + +////////////////////////////////////////////////////////////////////////////// +// Write STATUS register with expected end CTU address of previous slice + +static void end_previous_slice(dec_env_t * const de, const HEVCContext * const s, const int ctb_addr_ts) { + const HEVCPPS * const pps = s->ps.pps; + int last_x = pps->ctb_addr_ts_to_rs[ctb_addr_ts-1] % de->PicWidthInCtbsY; + int last_y = pps->ctb_addr_ts_to_rs[ctb_addr_ts-1] / de->PicWidthInCtbsY; + p1_apb_write(de, RPI_STATUS, 1 + (last_x<<5) + (last_y<<18)); +} + +static void wpp_pause(dec_env_t * const de, int ctb_row) { + p1_apb_write(de, RPI_STATUS, (ctb_row<<18) + 0x25); + p1_apb_write(de, RPI_TRANSFER, PROB_BACKUP); + p1_apb_write(de, RPI_MODE, ctb_row==de->PicHeightInCtbsY-1 ? 0x70000 : 0x30000); + p1_apb_write(de, RPI_CONTROL, (ctb_row<<16) + 2); +} + +static void wpp_end_previous_slice(dec_env_t * const de, const HEVCContext * const s, int ctb_addr_ts) { + const HEVCPPS *pps = s->ps.pps; + int new_x = s->sh.slice_ctb_addr_rs % de->PicWidthInCtbsY; + int new_y = s->sh.slice_ctb_addr_rs / de->PicWidthInCtbsY; + int last_x = pps->ctb_addr_ts_to_rs[ctb_addr_ts-1] % de->PicWidthInCtbsY; + int last_y = pps->ctb_addr_ts_to_rs[ctb_addr_ts-1] / de->PicWidthInCtbsY; + if (de->wpp_entry_x<2 && (de->wpp_entry_y2) && de->PicWidthInCtbsY>2) + wpp_pause(de, last_y); + p1_apb_write(de, RPI_STATUS, 1 + (last_x<<5) + (last_y<<18)); + if (new_x==2 || de->PicWidthInCtbsY==2 && de->wpp_entry_yps.sps; + const HEVCPPS *pps = s->ps.pps; + + p1_apb_write(de, RPI_SPS0, + (sps->log2_min_cb_size << 0) + + (sps->log2_ctb_size << 4) + + (sps->log2_min_tb_size << 8) + + (sps->log2_max_trafo_size << 12) + + (sps->bit_depth << 16) + + (sps->bit_depth << 20) + + (sps->max_transform_hierarchy_depth_intra << 24) + + (sps->max_transform_hierarchy_depth_inter << 28)); + + p1_apb_write(de, RPI_SPS1, + (sps->pcm.bit_depth << 0) + + (sps->pcm.bit_depth_chroma << 4) + + (sps->pcm.log2_min_pcm_cb_size << 8) + + (sps->pcm.log2_max_pcm_cb_size << 12) + + (sps->separate_colour_plane_flag? 0:sps->chroma_format_idc << 16) + + (sps->amp_enabled_flag << 18) + + (sps->pcm_enabled_flag << 19) + + (sps->scaling_list_enable_flag << 20) + + (sps->sps_strong_intra_smoothing_enable_flag << 21)); + + p1_apb_write(de, RPI_PPS, + (sps->log2_ctb_size - pps->diff_cu_qp_delta_depth << 0) + + (pps->cu_qp_delta_enabled_flag << 4) + + (pps->transquant_bypass_enable_flag << 5) + + (pps->transform_skip_enabled_flag << 6) + + (pps->sign_data_hiding_flag << 7) + + (((pps->cb_qp_offset + s->sh.slice_cb_qp_offset)&255) << 8) + + (((pps->cr_qp_offset + s->sh.slice_cr_qp_offset)&255) << 16) + + (pps->constrained_intra_pred_flag << 24)); + + if (s->ps.sps->scaling_list_enable_flag) WriteScalingFactors(de); + + if (!s->sh.dependent_slice_segment_flag) { + int ctb_col = s->sh.slice_ctb_addr_rs % de->PicWidthInCtbsY; + int ctb_row = s->sh.slice_ctb_addr_rs / de->PicWidthInCtbsY; + de->reg_slicestart = (ctb_col<<0) + (ctb_row<<16); + } + + p1_apb_write(de, RPI_SLICESTART, de->reg_slicestart); +} + +////////////////////////////////////////////////////////////////////////////// + +static void write_slice(dec_env_t * const de, const HEVCContext * const s, + const unsigned int slice_w, const unsigned int slice_h) { + uint32_t u32 = + (s->sh.slice_type << 12) + + (s->sh.slice_sample_adaptive_offset_flag[0] << 14) + + (s->sh.slice_sample_adaptive_offset_flag[1] << 15) + + (slice_w << 17) + + (slice_h << 24); + + if (s->sh.slice_type==HEVC_SLICE_B || s->sh.slice_type==HEVC_SLICE_P) u32 |= + (s->sh.max_num_merge_cand << 0) + + (s->sh.nb_refs[L0] << 4) + + (s->sh.nb_refs[L1] << 8); + + if (s->sh.slice_type==HEVC_SLICE_B) + u32 |= s->sh.mvd_l1_zero_flag<<16; + p1_apb_write(de, RPI_SLICE, u32); +} + +////////////////////////////////////////////////////////////////////////////// +// Wavefront mode + +static void wpp_entry_point(dec_env_t * const de, const HEVCContext * const s, + const int do_bte, const int resetQPY, const int ctb_addr_ts) { + const HEVCSPS * const sps = s->ps.sps; + const HEVCPPS * const pps = s->ps.pps; + + int ctb_size = 1<log2_ctb_size; + int ctb_addr_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts]; + + int ctb_col = de->wpp_entry_x = ctb_addr_rs % de->PicWidthInCtbsY; + int ctb_row = de->wpp_entry_y = ctb_addr_rs / de->PicWidthInCtbsY; + + int endx = de->PicWidthInCtbsY-1; + int endy = ctb_row; + + uint8_t slice_w = ctb_to_slice_w_h(ctb_col, ctb_size, sps->width, pps->col_bd, pps->num_tile_columns); + uint8_t slice_h = ctb_to_slice_w_h(ctb_row, ctb_size, sps->height, pps->row_bd, pps->num_tile_rows); + + p1_apb_write(de, RPI_TILESTART, 0); + p1_apb_write(de, RPI_TILEEND, endx + (endy<<16)); + + if (do_bte) + p1_apb_write(de, RPI_BEGINTILEEND, endx + (endy<<16)); + + write_slice(de, s, slice_w, ctb_row==de->PicHeightInCtbsY-1? slice_h : ctb_size); + + if (resetQPY) p1_apb_write(de, RPI_QP, sps->qp_bd_offset + s->sh.slice_qp); + + p1_apb_write(de, RPI_MODE, ctb_row==de->PicHeightInCtbsY-1? 0x60001 : 0x20001); + p1_apb_write(de, RPI_CONTROL, (ctb_col<<0) + (ctb_row<<16)); +} + +////////////////////////////////////////////////////////////////////////////// +// Tiles mode + +static void new_entry_point(dec_env_t * const de, const HEVCContext * const s, + const int do_bte, const int resetQPY, const int ctb_addr_ts) { + const HEVCSPS * const sps = s->ps.sps; + const HEVCPPS * const pps = s->ps.pps; + + int ctb_col = pps->ctb_addr_ts_to_rs[ctb_addr_ts] % de->PicWidthInCtbsY; + int ctb_row = pps->ctb_addr_ts_to_rs[ctb_addr_ts] / de->PicWidthInCtbsY; + + int tile_x = ctb_to_tile (ctb_col, pps->col_bd, pps->num_tile_columns); + int tile_y = ctb_to_tile (ctb_row, pps->row_bd, pps->num_tile_rows); + + int endx = pps->col_bd[tile_x+1] - 1; + int endy = pps->row_bd[tile_y+1] - 1; + + uint8_t slice_w = ctb_to_slice_w_h(ctb_col, 1<log2_ctb_size, sps->width, pps->col_bd, pps->num_tile_columns); + uint8_t slice_h = ctb_to_slice_w_h(ctb_row, 1<log2_ctb_size, sps->height, pps->row_bd, pps->num_tile_rows); + + p1_apb_write(de, RPI_TILESTART, pps->col_bd[tile_x] + (pps->row_bd[tile_y]<<16)); + p1_apb_write(de, RPI_TILEEND, endx + (endy<<16)); + + if (do_bte) + p1_apb_write(de, RPI_BEGINTILEEND, endx + (endy<<16)); + + write_slice(de, s, slice_w, slice_h); + + if (resetQPY) + p1_apb_write(de, RPI_QP, sps->qp_bd_offset + s->sh.slice_qp); + + p1_apb_write(de, RPI_MODE, (0xFFFF << 0) + + (0x0 << 16) + + ((tile_x==pps->num_tile_columns-1) << 17) + + ((tile_y==pps->num_tile_rows-1) << 18)); + + p1_apb_write(de, RPI_CONTROL, (ctb_col<<0) + (ctb_row<<16)); +} + +////////////////////////////////////////////////////////////////////////////// + +// Doesn't attempt to remove from context as we should only do this at the end +// of time or on create error +static void +dec_env_delete(dec_env_t * const de) +{ +// gpu_free(&de->gbuf); + + av_freep(&de->cmd_fifo); + av_freep(&de->bit_fifo); + + sem_destroy(&de->phase_wait); + av_free(de); +} + +static dec_env_t * +dec_env_new(AVCodecContext * const avctx, RPI_T * const rpi) +{ + dec_env_t * const de = av_mallocz(sizeof(*de)); + int i; + + if (de == NULL) + return NULL; + + de->avctx = avctx; + de->phase_no = RPIVID_PHASE_NEW; + + sem_init(&de->phase_wait, 0, 0); + + if ((de->cmd_fifo = malloc((de->cmd_max=1024)*sizeof(struct RPI_CMD))) == NULL) + goto fail; + + if ((de->bit_fifo = malloc((de->bit_max=1024)*sizeof(struct RPI_BIT))) == NULL) + goto fail; + + pthread_mutex_lock(&rpi->phase_lock); // Abuse - not worth creating a lock just for this + for (i = 0; i != avctx->thread_count; ++i) { + if (rpi->dec_envs[i] == NULL) + { + rpi->dec_envs[i] = de; + break; + } + } + pthread_mutex_unlock(&rpi->phase_lock); + + if (i == avctx->thread_count) { + av_log(avctx, AV_LOG_ERROR, "Failed to find a slot for hw thread context\n"); + goto fail; + } + + return de; + +fail: + dec_env_delete(de); + return NULL; +} + + +static dec_env_t * +dec_env_get(AVCodecContext * const avctx, RPI_T * const rpi) +{ + dec_env_t * de = NULL; + const int ref_count = atomic_fetch_add(&rpi->ref_count, 1); + + if (ref_count <= 0) { + // Already dead + av_log(avctx, AV_LOG_ERROR, "RPIVID called whilst dead\n");; + return NULL; + } + + for (int i = 0; i != avctx->thread_count; ++i) { + if (rpi->dec_envs[i] == NULL) + { + de = dec_env_new(avctx, rpi); + break; + } + if (rpi->dec_envs[i]->avctx == avctx) + { + de = rpi->dec_envs[i]; + break; + } + } + return de; +} + +// Call at end of fn +// Used to ensure we aren't in a worker thead when killed +static void +dec_env_release(RPI_T * const rpi, dec_env_t * const de) +{ + const int n = atomic_fetch_sub(&rpi->ref_count, 1); + if (n == 1) { + sem_post(&rpi->ref_zero); + } +} + +//---------------------------------------------------------------------------- + +// Wait for a slot in the given phase +// Any error return is probably fatal +static int +wait_phase(RPI_T * const rpi, dec_env_t * const de, const int phase_no) +{ + int needs_wait = 0; + phase_wait_env_t *const p = rpi->phase_reqs + phase_no; + + pthread_mutex_lock(&rpi->phase_lock); + if (p->last_order + 1 != de->decode_order) { + de->phase_wait_q_next = p->q; + p->q = de; + needs_wait = 1; + } + pthread_mutex_unlock(&rpi->phase_lock); + + if (needs_wait) { + while (sem_wait(&de->phase_wait) == -1) + { + int err; + if ((err = errno) != EINTR) + return AVERROR(err); + } + } + + de->phase_no = phase_no; + return 0; +} + +static void +post_phase(RPI_T * const rpi, dec_env_t * const de, const int phase_no) +{ + dec_env_t * next_de = NULL; + phase_wait_env_t *const p = rpi->phase_reqs + phase_no; + dec_env_t ** q = &p->q; + + pthread_mutex_lock(&rpi->phase_lock); + + p->last_order = de->decode_order; + while (*q != NULL) { + dec_env_t * const t_de = *q; + + if (t_de->decode_order == p->last_order + 1) { + // This is us - remove from Q + *q = t_de->phase_wait_q_next; + t_de->phase_wait_q_next = NULL; // Tidy + next_de = t_de; + break; + } + q = &t_de->phase_wait_q_next; + } + + pthread_mutex_unlock(&rpi->phase_lock); + + if (next_de != NULL) + sem_post(&next_de->phase_wait); +} + +// Wait & signal stuff s.t. threads in other phases can continue +static void +abort_phases(RPI_T * const rpi, dec_env_t * const de) +{ + for (int i = de->phase_no + 1; i < RPIVID_PHASE_NEW; ++i) { + wait_phase(rpi, de, i); + post_phase(rpi, de, i); + } + de->phase_no = RPIVID_PHASE_NEW; +} + +// Start timing for phase +// Stats only - no actual effect +static inline void tstart_phase(RPI_T * const rpi, const int phase_no) +{ +#if OPT_PHASE_TIMING + phase_wait_env_t *const p = rpi->phase_reqs + phase_no; + const int64_t now = tus64(); + if (p->phase_time != 0) + p->time_out_phase += now - p->phase_time; + p->phase_time = now; +#endif +} + +#if OPT_PHASE_TIMING +static unsigned int tavg_bin_phase(phase_wait_env_t *const p, const unsigned int avg_n) +{ + uint64_t tsum = 0; + unsigned int i; + for (i = 0; i != avg_n; ++i) + tsum += p->time_stash[(p->i3 - i) & 15]; + for (i = 0; i != 9; ++i) { + if (time_thresholds[i] * 1000 * avg_n > tsum) + break; + } + return i; +} +#endif + +// End timing for phase +// Stats only - no actual effect +static inline void tend_phase(RPI_T * const rpi, const int phase_no) +{ +#if OPT_PHASE_TIMING + phase_wait_env_t *const p = rpi->phase_reqs + phase_no; + const uint64_t now = tus64(); + const uint64_t in_time = now - p->phase_time; + + p->time_in_phase += in_time; + p->phase_time = now; + p->time_stash[p->i3] = in_time; + if (in_time > p->max_phase_time) { + p->max_phase_time = in_time; + p->max_time_decode_order = p->last_order; + } + ++p->time_bins[tavg_bin_phase(p, 1)]; + ++p->time_bins3[tavg_bin_phase(p, 3)]; + ++p->time_bins5[tavg_bin_phase(p, 5)]; + + p->i3 = (p->i3 + 1) & 15; +#endif +} + +////////////////////////////////////////////////////////////////////////////// +// Start frame + +static int rpi_hevc_start_frame( + AVCodecContext * avctx, + const uint8_t *buffer, + uint32_t size) { + + RPI_T * const rpi = avctx->internal->hwaccel_priv_data; + dec_env_t * const de = dec_env_get(avctx, rpi); + const HEVCContext * const s = avctx->priv_data; + const HEVCSPS * const sps = s->ps.sps; + const unsigned int CtbSizeY = 1U << sps->log2_ctb_size; + +#if TRACE_ENTRY + printf("<<< %s[%p]\n", __func__, de); +#endif + + if (de == NULL) { + av_log(avctx, AV_LOG_ERROR, "%s: Cannot find find context for thread\n", __func__); + return -1; + } + + de->phase_no = RPIVID_PHASE_START; + de->decode_order = ++rpi->decode_order; // *** atomic? + + ff_thread_finish_setup(avctx); // Allow next thread to enter rpi_hevc_start_frame + + if (de->state != RPIVID_DECODE_NEW && de->state != RPIVID_DECODE_END) { + av_log(avctx, AV_LOG_ERROR, "%s: Unexpected state transition: %d", __func__, de->state); + return -1; + } + de->state = RPIVID_DECODE_START; + + de->PicWidthInCtbsY = (sps->width + CtbSizeY - 1) / CtbSizeY; //7-15 + de->PicHeightInCtbsY = (sps->height + CtbSizeY - 1) / CtbSizeY; //7-17 + de->bit_len = 0; + de->cmd_len = 0; + +#if TRACE_ENTRY + printf(">>> %s[%p]\n", __func__, de); +#endif + + dec_env_release(rpi, de); + return 0; +} + +////////////////////////////////////////////////////////////////////////////// +// Slice messages + +static void msg_slice(dec_env_t * const de, const uint16_t msg) { + de->slice_msgs[de->num_slice_msgs++] = msg; +} + +static void program_slicecmds(dec_env_t * const de, const int sliceid) { + int i; + p1_apb_write(de, RPI_SLICECMDS, de->num_slice_msgs+(sliceid<<8)); + for(i=0; i < de->num_slice_msgs; i++) { + p1_apb_write(de, 0x4000+4*i, de->slice_msgs[i] & 0xffff); + } +} + +static void pre_slice_decode(dec_env_t * const de, const HEVCContext * const s) { + const HEVCSPS * const sps = s->ps.sps; + const HEVCPPS * const pps = s->ps.pps; + const SliceHeader *sh = &s->sh; + + int weightedPredFlag, i, rIdx; + uint16_t cmd_slice; + unsigned int collocated_from_l0_flag; + + de->num_slice_msgs=0; + de->dpbno_col = 0; + cmd_slice = 0; + if (sh->slice_type==HEVC_SLICE_I) cmd_slice = 1; + if (sh->slice_type==HEVC_SLICE_P) cmd_slice = 2; + if (sh->slice_type==HEVC_SLICE_B) cmd_slice = 3; + + if (sh->slice_type!=HEVC_SLICE_I) { + cmd_slice += sh->nb_refs[L0]<<2; + cmd_slice += sh->nb_refs[L1]<<6; + } + + if (sh->slice_type==HEVC_SLICE_P || sh->slice_type==HEVC_SLICE_B) + cmd_slice |= sh->max_num_merge_cand<<11; + + collocated_from_l0_flag = + !sh->slice_temporal_mvp_enabled_flag ? + 0 : + sh->slice_type == HEVC_SLICE_B ? + (sh->collocated_list == L0) : + (sh->slice_type==HEVC_SLICE_P); + cmd_slice |= collocated_from_l0_flag<<14; + + if (sh->slice_type==HEVC_SLICE_P || sh->slice_type==HEVC_SLICE_B) { + + int NoBackwardPredFlag = 1; // Flag to say all reference pictures are from the past + for(i=L0; i<=L1; i++) { + for(rIdx=0; rIdx nb_refs[i]; rIdx++) { + HEVCFrame *f = s->ref->refPicList[i].ref[rIdx]; + HEVCFrame *c = s->ref; // CurrentPicture + if (c->poc < f->poc) NoBackwardPredFlag = 0; + } + } + + if (sps->sps_temporal_mvp_enabled_flag) + { + const RefPicList *rpl = (sh->slice_type != HEVC_SLICE_B || collocated_from_l0_flag) ? + s->ref->refPicList + 0 : + s->ref->refPicList + 1; + de->dpbno_col = rpl->ref[sh->collocated_ref_idx] - s->DPB; + } + + cmd_slice += NoBackwardPredFlag<<10; + msg_slice(de, cmd_slice); + + // Write reference picture descriptions + weightedPredFlag = sh->slice_type==HEVC_SLICE_P? pps->weighted_pred_flag : pps->weighted_bipred_flag; + + for(i=L0; i<=L1; i++) + for(rIdx=0; rIdx nb_refs[i]; rIdx++) { + HEVCFrame *f = s->ref->refPicList[i].ref[rIdx]; + HEVCFrame *c = s->ref; // CurrentPicture + int pic = f - s->DPB; + // Make sure pictures are in range 0 to 15 + int adjusted_pic = fref->refPicList[i].isLongTerm[rIdx]; + msg_slice(de, adjusted_pic+(lt<<4)+(weightedPredFlag<<5)+(weightedPredFlag<<6)); + msg_slice(de, f->poc); + if (weightedPredFlag) { + msg_slice(de, s->sh.luma_log2_weight_denom+(((i?s-> sh.luma_weight_l1: s->sh.luma_weight_l0)[rIdx] &0x1ff)<<3)); + msg_slice(de, (i?s-> sh.luma_offset_l1: s->sh.luma_offset_l0)[rIdx] & 0xff); + msg_slice(de, s->sh.chroma_log2_weight_denom+(((i?s->sh.chroma_weight_l1:s->sh.chroma_weight_l0)[rIdx][0]&0x1ff)<<3)); + msg_slice(de, (i?s->sh.chroma_offset_l1:s->sh.chroma_offset_l0)[rIdx][0]& 0xff); + msg_slice(de, s->sh.chroma_log2_weight_denom+(((i?s->sh.chroma_weight_l1:s->sh.chroma_weight_l0)[rIdx][1]&0x1ff)<<3)); + msg_slice(de, (i?s->sh.chroma_offset_l1:s->sh.chroma_offset_l0)[rIdx][1]& 0xff); + } + } + } + else + msg_slice(de, cmd_slice); + + msg_slice(de, ((sh->beta_offset/2)&15) + + (((sh->tc_offset/2)&15) << 4) + + (sh->disable_deblocking_filter_flag << 8) + + (sh->slice_loop_filter_across_slices_enabled_flag << 9) + + (pps->loop_filter_across_tiles_enabled_flag << 10)); // CMD_DEBLOCK + + msg_slice(de, ((sh->slice_cr_qp_offset&31)<<5) + (sh->slice_cb_qp_offset&31)); // CMD_QPOFF +} + + +////////////////////////////////////////////////////////////////////////////// + +static void rpi_hevc_abort_frame(AVCodecContext * const avctx) { + RPI_T * const rpi = avctx->internal->hwaccel_priv_data; + dec_env_t * const de = dec_env_get(avctx, rpi); + +#if TRACE_ENTRY + printf("<<< %s[%p]\n", __func__, de); +#endif + + if (de == NULL) { + av_log(avctx, AV_LOG_ERROR, "%s: Cannot find find context for thread\n", __func__); + return; + } + + switch (de->state) { + case RPIVID_DECODE_NEW: + case RPIVID_DECODE_END: + // Expected transition + break; + + case RPIVID_DECODE_SLICE: + // Error transition + av_log(avctx, AV_LOG_INFO, "Error in decode - aborting\n"); + break; + + case RPIVID_DECODE_START: + default: + av_log(avctx, AV_LOG_ERROR, "%s: Unexpected state transition: %d", __func__, de->state); + break; + } + + abort_phases(rpi, de); + de->state = RPIVID_DECODE_NEW; + + dec_env_release(rpi, de); +} + +////////////////////////////////////////////////////////////////////////////// +// End frame + +static int rpi_hevc_end_frame(AVCodecContext * const avctx) { + RPI_T * const rpi = avctx->internal->hwaccel_priv_data; + const HEVCContext * const s = avctx->priv_data; + const HEVCPPS * const pps = s->ps.pps; + const HEVCSPS * const sps = s->ps.sps; + dec_env_t * const de = dec_env_get(avctx, rpi); + AVFrame * const f = s->ref->frame; + const unsigned int dpbno_cur = s->ref - s->DPB; + vid_vc_addr_t cmds_vc; + vid_vc_addr_t pu_base_vc; + unsigned int pu_stride; + vid_vc_addr_t coeff_base_vc; + unsigned int coeff_stride; + unsigned int i; + int rv = 0; + int status = 0; + int coeffbuf_sem_claimed = 0; + +#if TRACE_ENTRY + fprintf("<<< %s[%p]\n", __func__, de); +#endif + + if (de == NULL) { + av_log(avctx, AV_LOG_ERROR, "%s: Cannot find find context for thread\n", __func__); + return AVERROR_BUG; // Should never happen + } + + if (de->state != RPIVID_DECODE_SLICE) { + av_log(avctx, AV_LOG_ERROR, "%s: Unexpected state: %d\n", __func__, de->state); + rv = AVERROR_UNKNOWN; + goto fail; + } + de->state = RPIVID_DECODE_END; + + // End of command compilation + { + const unsigned int last_x = pps->col_bd[pps->num_tile_columns]-1; + const unsigned int last_y = pps->row_bd[pps->num_tile_rows]-1; + if (pps->entropy_coding_sync_enabled_flag) { + if (de->wpp_entry_x<2 && de->PicWidthInCtbsY>2) + wpp_pause(de, last_y); + } + p1_apb_write(de, RPI_STATUS, 1 + (last_x<<5) + (last_y<<18)); + } + + // Phase 0 --------------------------------------------------------------- + + wait_phase(rpi, de, 0); + rpi_sem_wait(&rpi->bitbuf_sem); + tstart_phase(rpi, 0); + + // Copy cmds & bits into gpu side buffer + // Layout: CMDS, BITS + { + uint8_t * const armbase = rpi->gbitbufs[rpi->bitbuf_no].arm; + vid_vc_addr_t vcbase = rpi->gbitbufs[rpi->bitbuf_no].vc; + unsigned int cmd_bytes = de->cmd_len * sizeof(struct RPI_CMD); + + uint8_t * p = armbase + rnd64(cmd_bytes); + uint8_t * const eobits = armbase + rpi->gbitbufs[rpi->bitbuf_no].numbytes; + + cmds_vc = vcbase; + + // Copy all the bits & update bitstream cmds to point at the right bits + for (i = 0; i < de->bit_len; ++i) + { + const unsigned int seg_len = de->bit_fifo[i].len; + + if (p + seg_len > eobits) { + status = -1; + break; + } + + memcpy(p, de->bit_fifo[i].ptr, seg_len); + de->cmd_fifo[de->bit_fifo[i].cmd].data = MANGLE64((p - armbase) + vcbase); + + p += rnd64(seg_len); + } + + memcpy(armbase, de->cmd_fifo, cmd_bytes); + } + + if (status == 0) + { + if (++rpi->bitbuf_no >= RPIVID_BITBUFS) + rpi->bitbuf_no = 0; + } + else + { + sem_post(&rpi->bitbuf_sem); + av_log(avctx, AV_LOG_ERROR, "Out of HEVC bit/cmd memory\n"); + rv = AVERROR_BUFFER_TOO_SMALL; + } + + tend_phase(rpi, 0); + post_phase(rpi, de, 0); + + if (status < 0) + goto fail; + + // Phase 1 --------------------------------------------------------------- + + wait_phase(rpi, de, 1); + rpi_sem_wait(&rpi->coeffbuf_sem); + coeffbuf_sem_claimed = 1; + tstart_phase(rpi, 1); + + status = 0; + for (;;) + { + // (Re-)allocate PU/COEFF stream space + const unsigned int total_size = rpi->gcoeffbufs[rpi->coeffbuf_no].numbytes; + unsigned int pu_size; + + pu_base_vc = rpi->gcoeffbufs[rpi->coeffbuf_no].vc; + pu_stride = rnd64(rpi->max_pu_msgs * 2 * de->PicWidthInCtbsY); + pu_size = pu_stride * de->PicHeightInCtbsY; + + if (pu_size >= total_size || status == -1) { + GPU_MEM_PTR_T newbuf; + + if (gpu_malloc_uncached(round_up_size(total_size + 1), &newbuf) != 0) + { + av_log(avctx, AV_LOG_ERROR, "Failed to reallocate coeffbuf\n"); + status = -1; + break; + } + gpu_free(rpi->gcoeffbufs + rpi->coeffbuf_no); + rpi->gcoeffbufs[rpi->coeffbuf_no] = newbuf; + status = 0; + continue; + } + + // Allocate all remaining space to coeff + coeff_base_vc = pu_base_vc + pu_size; + coeff_stride = ((total_size - pu_size) / de->PicHeightInCtbsY) & ~63; // Round down to multiple of 64 + + apb_write_vc_addr(rpi, RPI_PUWBASE, pu_base_vc); + apb_write_vc_len(rpi, RPI_PUWSTRIDE, pu_stride); + apb_write_vc_addr(rpi, RPI_COEFFWBASE, coeff_base_vc); + apb_write_vc_len(rpi, RPI_COEFFWSTRIDE, coeff_stride); + + // Trigger command FIFO + apb_write(rpi, RPI_CFNUM, de->cmd_len); +#if TRACE_DEV && 0 + apb_dump_regs(rpi, 0x0, 32); + apb_dump_regs(rpi, 0x8000, 24); + axi_dump(de, ((uint64_t)a64)<<6, de->cmd_len * sizeof(struct RPI_CMD)); +#endif + apb_write_vc_addr(rpi, RPI_CFBASE, cmds_vc); + + int_wait(rpi, 1); + + status = check_status(rpi, de); + + if (status == -1) + continue; + else if (status != 1) + break; + + // Status 1 means out of PU space so try again with more + // If we ran out of Coeff space then we are out of memory - we could possibly realloc? + rpi->max_pu_msgs += rpi->max_pu_msgs / 2; + } + + // Inc inside the phase 1 lock, but only inc if we succeeded otherwise we + // may reuse a live buffer when we kick the coeff sem + if (status == 0) + { + if (++rpi->coeffbuf_no >= RPIVID_COEFFBUFS) + rpi->coeffbuf_no = 0; + } + else + { + if (status == -1) + { + av_log(avctx, AV_LOG_ERROR, "Out of pu + coeff intermediate memory: pus=%d\n", rpi->max_pu_msgs); + rv = AVERROR_BUFFER_TOO_SMALL; + } + else + { + av_log(avctx, AV_LOG_WARNING, "Phase 1 decode error\n"); + rv = AVERROR_INVALIDDATA; + } + } + + tend_phase(rpi, 1); + sem_post(&rpi->bitbuf_sem); + post_phase(rpi, de, 1); + + if (status != 0) + goto fail; + + // Phase 2 --------------------------------------------------------------- + + wait_phase(rpi, de, 2); + + if ((rv = av_rpi_zc_resolve_frame(f, ZC_RESOLVE_ALLOC)) != 0) + { + // As we are in phase 2 already here we don't need to worry about + // ceoffbuf_no despite the early exit + post_phase(rpi, de, 2); + av_log(avctx, AV_LOG_ERROR, "Failed to allocate output frame\n"); + goto fail; + } + + tstart_phase(rpi, 2); + + apb_write_vc_addr(rpi, RPI_PURBASE, pu_base_vc); + apb_write_vc_len(rpi, RPI_PURSTRIDE, pu_stride); + apb_write_vc_addr(rpi, RPI_COEFFRBASE, coeff_base_vc); + apb_write_vc_len(rpi, RPI_COEFFRSTRIDE, coeff_stride); + + apb_write_vc_addr(rpi, RPI_OUTYBASE, get_vc_address_y(f)); + apb_write_vc_addr(rpi, RPI_OUTCBASE, get_vc_address_u(f)); + apb_write_vc_len(rpi, RPI_OUTYSTRIDE, f->linesize[3] * 128); + apb_write_vc_len(rpi, RPI_OUTCSTRIDE, f->linesize[3] * 128); + + // Keep the last thing we resolved as fallback for any ref we fail to + // resolve. As a final fallback use our current frame. The pels might + // not be there yet but at least the memory is valid. + // + // Attempt to resolve the entire DPB - we could note what we have used + // in ref lists but probably simpler and more reliable to set the whole thing + { + AVFrame * fallback_frame = f; + for (i = 0; i != 16; ++i) { + // Avoid current frame + const HEVCFrame * hevc_fr = (s->DPB + i >= s->ref) ? s->DPB + i + 1 : s->DPB + i; + AVFrame * fr = hevc_fr->frame; + + if (fr != NULL && + av_rpi_zc_resolve_frame(fr, ZC_RESOLVE_FAIL) == 0) + { + fallback_frame = fr; + } + else + { + fr = fallback_frame; + } + + apb_write_vc_addr(rpi, 0x9000+16*i, get_vc_address_y(fr)); + apb_write(rpi, 0x9004+16*i, 0); + apb_write_vc_addr(rpi, 0x9008+16*i, get_vc_address_u(fr)); + apb_write(rpi, 0x900C+16*i, 0); + } + } + + apb_write(rpi, RPI_CONFIG2, + (sps->bit_depth << 0) // BitDepthY + + (sps->bit_depth << 4) // BitDepthC + + ((sps->bit_depth>8) << 8) // BitDepthY + + ((sps->bit_depth>8) << 9) // BitDepthC + + (sps->log2_ctb_size <<10) + + (pps->constrained_intra_pred_flag <<13) + + (sps->sps_strong_intra_smoothing_enable_flag<<14) + + (sps->sps_temporal_mvp_enabled_flag <<15) + + (pps->log2_parallel_merge_level <<16) + + (s->sh.slice_temporal_mvp_enabled_flag <<19) + + (sps->pcm.loop_filter_disable_flag <<20) + + ((pps->cb_qp_offset&31) <<21) + + ((pps->cr_qp_offset&31) <<26)); + + apb_write(rpi, RPI_FRAMESIZE, (sps->height<<16) + sps->width); + apb_write(rpi, RPI_CURRPOC, s->poc); + + // collocated reads/writes + if (sps->sps_temporal_mvp_enabled_flag) { + av_assert0(de->dpbno_col < RPIVID_COL_PICS); + av_assert0(dpbno_cur < RPIVID_COL_PICS); + + apb_write_vc_len(rpi, RPI_COLSTRIDE, rpi->col_stride); + apb_write_vc_len(rpi, RPI_MVSTRIDE, rpi->col_stride); + apb_write_vc_addr(rpi, RPI_MVBASE, rpi->gcolbuf.vc + dpbno_cur * rpi->col_picsize); + apb_write_vc_addr(rpi, RPI_COLBASE, rpi->gcolbuf.vc + de->dpbno_col * rpi->col_picsize); + } + +#if TRACE_DEV && 0 + apb_dump_regs(rpi, 0x0, 32); + apb_dump_regs(rpi, 0x8000, 24); +#endif + + apb_write(rpi, RPI_NUMROWS, de->PicHeightInCtbsY); + apb_read(rpi, RPI_NUMROWS); // Read back to confirm write has reached block + + int_wait(rpi, 2); + + tend_phase(rpi, 2); + coeffbuf_sem_claimed = 0; + sem_post(&rpi->coeffbuf_sem); + // Set valid here to avoid race in resolving in any pending phase 2 + av_rpi_zc_set_valid_frame(f); + + post_phase(rpi, de, 2); + + // Flush frame for CPU access + // Arguably the best place would be at the start of phase 2 but here + // will overlap with the wait + // + // * Even better would be to have better lock/unlock control in ZC for external access + if (rpi->gpu_init_type == GPU_INIT_GPU) // * CMA is currently always uncached + { + rpi_cache_buf_t cbuf; + rpi_cache_flush_env_t * const fe = rpi_cache_flush_init(&cbuf); + rpi_cache_flush_add_frame(fe, f, RPI_CACHE_FLUSH_MODE_INVALIDATE); + rpi_cache_flush_finish(fe); + } + +#if TRACE_ENTRY + printf(">>> %s[%p] OK\n", __func__, de); +#endif + + dec_env_release(rpi, de); + return 0; + +fail: + av_rpi_zc_set_broken_frame(f); + if (coeffbuf_sem_claimed) + sem_post(&rpi->coeffbuf_sem); + abort_phases(rpi, de); // Dummy any unresolved phases + +#if TRACE_ENTRY + printf(">>> %s[%p] FAIL\n", __func__, de); +#endif + + dec_env_release(rpi, de); + return rv; +} + +////////////////////////////////////////////////////////////////////////////// + + +#if TRACE_DEV +static void dump_data(const uint8_t * p, size_t len) +{ + size_t i; + for (i = 0; i < len; i += 16) { + size_t j; + printf("%04x", i); + for (j = 0; j != 16; ++j) { + printf("%c%02x", i == 8 ? '-' : ' ', p[i+j]); + } + printf("\n"); + } +} +#endif + +#if OPT_EMU +static const uint8_t * ptr_from_index(const uint8_t * b, unsigned int idx) +{ + unsigned int z = 0; + while (idx--) { + if (*b++ == 0) { + ++z; + if (z >= 2 && *b == 3) { + ++b; + z = 0; + } + } + else { + z = 0; + } + } + return b; +} +#endif + +static void WriteBitstream(dec_env_t * const de, const HEVCContext * const s) { + const int rpi_use_emu = OPT_EMU; // FFmpeg removes emulation prevention bytes + const int offset = 0; // Always 64-byte aligned in sim, need not be on real hardware + const GetBitContext *gb = &s->HEVClc->gb; + +#if OPT_EMU + const uint8_t *ptr = ptr_from_index(de->nal_buffer, gb->index/8 + 1); + const int len = de->nal_size - (ptr - de->nal_buffer); +#else + const int len = 1 + gb->size_in_bits/8 - gb->index/8; + const void *ptr = &gb->buffer[gb->index/8]; +#endif + +#if TRACE_DEV + printf("Index=%d, /8=%#x\n", gb->index, gb->index/8); + dump_data(de->nal_buffer, 128); +#endif + + p1_axi_write(de, len, ptr, p1_apb_write(de, RPI_BFBASE, 0)); // BFBASE set later + p1_apb_write(de, RPI_BFNUM, len); + p1_apb_write(de, RPI_BFCONTROL, offset + (1<<7)); // Stop + p1_apb_write(de, RPI_BFCONTROL, offset + (rpi_use_emu<<6)); +} + +////////////////////////////////////////////////////////////////////////////// +// Wavefront mode + +static void wpp_decode_slice(dec_env_t * const de, const HEVCContext * const s, int ctb_addr_ts) +{ + const HEVCPPS * const pps = s->ps.pps; + + int i, resetQPY=1; + int indep = !s->sh.dependent_slice_segment_flag; + int ctb_col = s->sh.slice_ctb_addr_rs % de->PicWidthInCtbsY; + + if (ctb_addr_ts) + wpp_end_previous_slice(de, s, ctb_addr_ts); + pre_slice_decode(de, s); + WriteBitstream(de, s); + if (ctb_addr_ts==0 || indep || de->PicWidthInCtbsY==1) + WriteProb(de, s); + else if (ctb_col==0) + p1_apb_write(de, RPI_TRANSFER, PROB_RELOAD); + else + resetQPY=0; + program_slicecmds(de, s->slice_idx); + new_slice_segment(de, s); + wpp_entry_point(de, s, indep, resetQPY, ctb_addr_ts); + for (i=0; ish.num_entry_point_offsets; i++) { + int ctb_addr_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts]; + int ctb_row = ctb_addr_rs / de->PicWidthInCtbsY; + int last_x = de->PicWidthInCtbsY-1; + if (de->PicWidthInCtbsY>2) + wpp_pause(de, ctb_row); + p1_apb_write(de, RPI_STATUS, (ctb_row<<18) + (last_x<<5) + 2); + if (de->PicWidthInCtbsY==2) + p1_apb_write(de, RPI_TRANSFER, PROB_BACKUP); + if (de->PicWidthInCtbsY==1) + WriteProb(de, s); + else + p1_apb_write(de, RPI_TRANSFER, PROB_RELOAD); + ctb_addr_ts += pps->column_width[0]; + wpp_entry_point(de, s, 0, 1, ctb_addr_ts); + } +} + +////////////////////////////////////////////////////////////////////////////// +// Tiles mode + +static void decode_slice(dec_env_t * const de, const HEVCContext * const s, int ctb_addr_ts) { + const HEVCPPS * const pps = s->ps.pps; + int i, resetQPY; + + if (ctb_addr_ts) end_previous_slice(de, s, ctb_addr_ts); + pre_slice_decode(de, s); + WriteBitstream(de, s); + resetQPY = ctb_addr_ts==0 + || pps->tile_id[ctb_addr_ts]!=pps->tile_id[ctb_addr_ts-1] + || !s->sh.dependent_slice_segment_flag; + if (resetQPY) WriteProb(de, s); + program_slicecmds(de, s->slice_idx); + new_slice_segment(de, s); + new_entry_point(de, s, !s->sh.dependent_slice_segment_flag, resetQPY, ctb_addr_ts); + for (i=0; ish.num_entry_point_offsets; i++) { + int ctb_addr_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts]; + int ctb_col = ctb_addr_rs % de->PicWidthInCtbsY; + int ctb_row = ctb_addr_rs / de->PicWidthInCtbsY; + int tile_x = ctb_to_tile (ctb_col, pps->col_bd, pps->num_tile_columns); + int tile_y = ctb_to_tile (ctb_row, pps->row_bd, pps->num_tile_rows); + int last_x = pps->col_bd[tile_x+1]-1; + int last_y = pps->row_bd[tile_y+1]-1; + p1_apb_write(de, RPI_STATUS, 2 + (last_x<<5) + (last_y<<18)); + WriteProb(de, s); + ctb_addr_ts += pps->column_width[tile_x] * pps->row_height[tile_y]; + new_entry_point(de, s, 0, 1, ctb_addr_ts); + } +} + +////////////////////////////////////////////////////////////////////////////// + +static int cabac_start_align(HEVCContext *s) +{ + GetBitContext *gb = &s->HEVClc->gb; + skip_bits(gb, 1); + align_get_bits(gb); + // Should look at getting rid of this + return ff_init_cabac_decoder(&s->HEVClc->cc, + gb->buffer + get_bits_count(gb) / 8, + (get_bits_left(gb) + 7) / 8); +} + +static int rpi_hevc_decode_slice( + AVCodecContext *avctx, + const uint8_t *buffer, + uint32_t size) +{ + RPI_T * const rpi = avctx->internal->hwaccel_priv_data; + HEVCContext * const s = avctx->priv_data; + dec_env_t * const de = dec_env_get(avctx, rpi); + const HEVCPPS *pps = s->ps.pps; + int ctb_addr_ts = pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]; + +#if TRACE_ENTRY + printf("<<< %s[%p]\n", __func__, de); +#endif + if (de == NULL) { + av_log(avctx, AV_LOG_ERROR, "%s: Cannot find find context for thread\n", __func__); + return -1; + } + + if (de->state != RPIVID_DECODE_START && de->state != RPIVID_DECODE_SLICE) { + av_log(avctx, AV_LOG_ERROR, "%s: Unexpected state: %d\n", __func__, de->state); + return -1; + } + de->state = RPIVID_DECODE_SLICE; + + de->nal_buffer = buffer; + de->nal_size = size; + +#if !OPT_EMU +// ff_hevc_cabac_init(s, ctb_addr_ts); + cabac_start_align(s); +#endif + if (s->ps.sps->scaling_list_enable_flag) + populate_scaling_factors(de, s); + pps->entropy_coding_sync_enabled_flag? wpp_decode_slice(de, s, ctb_addr_ts) + : decode_slice(de, s, ctb_addr_ts); +#if TRACE_ENTRY + printf(">>> %s[%p]\n", __func__, de); +#endif + dec_env_release(rpi, de); + return 0; +} + +////////////////////////////////////////////////////////////////////////////// + +static int rpivid_retrieve_data(void *logctx, AVFrame *frame) +{ + int rv; + if ((rv = av_rpi_zc_resolve_frame(frame, ZC_RESOLVE_WAIT_VALID)) != 0) + av_log(logctx, AV_LOG_ERROR, "Unable to resolve output frame\n"); + return rv; +} + +static int rpivid_hevc_alloc_frame(AVCodecContext * avctx, AVFrame *frame) +{ + RPI_T * const rpi = avctx->internal->hwaccel_priv_data; + HEVCContext * const s = avctx->priv_data; + // Frame buffering + 1 output. Would need thread_count extra but we now + // alloc at the start of phase 2 so that is the only thread we need the + // extra buffer for. + const unsigned int pool_req = s->ps.sps->temporal_layer[s->ps.sps->max_sub_layers - 1].max_dec_pic_buffering + 1; + int rv; + + if (av_rpi_zc_in_use(avctx)) + { + const AVZcEnvPtr zc = avctx->opaque; + av_rpi_zc_set_decoder_pool_size(zc, pool_req); + rv = av_rpi_zc_get_buffer(zc, frame); // get_buffer2 would alloc + } + else + { + if (rpi->zc == NULL) { + pthread_mutex_lock(&rpi->phase_lock); // Abuse - not worth creating a lock just for this + // Alloc inside lock to make sure we only ever alloc one + if (rpi->zc == NULL) { + rpi->zc = av_rpi_zc_int_env_alloc(s); + } + pthread_mutex_unlock(&rpi->phase_lock); + } + av_rpi_zc_set_decoder_pool_size(rpi->zc, pool_req); // Ignored by local allocator, but set anyway :-) + rv = (rpi->zc == NULL) ? AVERROR(ENOMEM) : + av_rpi_zc_get_buffer(rpi->zc, frame); + } + + if (rv == 0 && + (rv = ff_attach_decode_data(frame)) < 0) + { + av_frame_unref(frame); + } + + if (rv == 0) + { + FrameDecodeData *fdd = (FrameDecodeData*)frame->private_ref->data; + fdd->post_process = rpivid_retrieve_data; + } + + return rv; +} + +#if OPT_PHASE_TIMING +static void log_bin_phase(AVCodecContext * const avctx, const unsigned int * const bins) +{ + av_log(avctx, AV_LOG_INFO, "%7d %7d %7d %7d %7d %7d %7d %7d %7d\n", + bins[0], bins[1], bins[2], bins[3], + bins[4], bins[5], bins[6], bins[7], bins[8]); +} +#endif + +////////////////////////////////////////////////////////////////////////////// + +static int rpi_hevc_free(AVCodecContext *avctx) { + RPI_T * const rpi = avctx->internal->hwaccel_priv_data; + +#if TRACE_ENTRY + printf("<<< %s\n", __func__); +#endif + + dec_env_release(rpi, NULL); + + // Wait for everything else to stop + { + struct timespec tt; + clock_gettime(CLOCK_REALTIME, &tt); + tt.tv_sec += 2; + while (sem_timedwait(&rpi->ref_zero, &tt) == -1) { + const int err = errno; + if (err == ETIMEDOUT) { + av_log(avctx, AV_LOG_FATAL, "Rpivid worker threads still running\n"); + return -1; + } + if (err != EINTR) { + av_log(avctx, AV_LOG_ERROR, "Unexpected error %d waiting for work thread to stop\n", err); + break; + } + } + } + +#if OPT_PHASE_TIMING + { + unsigned int i; + for (i = 0; i != RPIVID_PHASES; ++i) { + const phase_wait_env_t * const p = rpi->phase_reqs + i; + av_log(avctx, AV_LOG_INFO, "Phase %u: In %3u.%06u, Out %3u.%06u\n", i, + (unsigned int)(p->time_in_phase / 1000000), (unsigned int)(p->time_in_phase % 1000000), + (unsigned int)(p->time_out_phase / 1000000), (unsigned int)(p->time_out_phase % 1000000)); + av_log(avctx, AV_LOG_INFO, "%7d %7d %7d %7d %7d %7d %7d %7d >\n", + time_thresholds[0], time_thresholds[1], time_thresholds[2], time_thresholds[3], + time_thresholds[4], time_thresholds[5], time_thresholds[6], time_thresholds[7]); + log_bin_phase(avctx, p->time_bins); + log_bin_phase(avctx, p->time_bins3); + log_bin_phase(avctx, p->time_bins5); + av_log(avctx, AV_LOG_INFO, "Longest duraction: %ums @ frame %u\n", + (unsigned int)(p->max_phase_time / 1000), + p->max_time_decode_order); + } + av_log(avctx, AV_LOG_INFO, "PU max=%d\n", rpi->max_pu_msgs); + } +#endif + + if (rpi->dec_envs != NULL) + { + for (int i; i < avctx->thread_count && rpi->dec_envs[i] != NULL; ++i) { + dec_env_delete(rpi->dec_envs[i]); + } + av_freep(&rpi->dec_envs); + } + + av_rpi_zc_int_env_freep(&rpi->zc); + + gpu_free(&rpi->gcolbuf); + + for (unsigned int i = 0; i != RPIVID_BITBUFS; ++i) { + gpu_free(rpi->gbitbufs + i); + } + for (unsigned int i = 0; i != RPIVID_COEFFBUFS; ++i) { + gpu_free(rpi->gcoeffbufs + i); + } + + unmap_devp(&rpi->regs, REGS_SIZE); + unmap_devp(&rpi->ints, INTS_SIZE); + + if (rpi->gpu_init_type > 0) + rpi_mem_gpu_uninit(); + + if (rpi->mbox_fd >= 0) { + mbox_release_clock(rpi->mbox_fd); + mbox_close(rpi->mbox_fd); + } + + sem_destroy(&rpi->ref_zero); + sem_destroy(&rpi->coeffbuf_sem); + sem_destroy(&rpi->bitbuf_sem); + +#if TRACE_ENTRY + printf(">>> %s\n", __func__); +#endif + return 0; +} + +////////////////////////////////////////////////////////////////////////////// + +static int rpi_hevc_init(AVCodecContext *avctx) { + RPI_T * const rpi = avctx->internal->hwaccel_priv_data; +// const char *err; + +#if TRACE_ENTRY + printf("<<< %s\n", __func__); +#endif + + if (avctx->width>4096 || avctx->height>4096) { + av_log(NULL, AV_LOG_FATAL, "Picture size %dx%d exceeds 4096x4096 maximum for HWAccel\n", avctx->width, avctx->height); + return AVERROR(ENOTSUP); + } + + memset(rpi, 0, sizeof(*rpi)); + + rpi->mbox_fd = -1; + rpi->decode_order = 0; + + // Initial PU/COEFF stream buffer split chosen as worst case seen so far + rpi->max_pu_msgs = 768; // 7.2 says at most 1611 messages per CTU + + + atomic_store(&rpi->ref_count, 1); + sem_init(&rpi->ref_zero, 0, 0); + + sem_init(&rpi->bitbuf_sem, 0, RPIVID_BITBUFS); + sem_init(&rpi->coeffbuf_sem, 0, RPIVID_COEFFBUFS); + + pthread_mutex_init(&rpi->phase_lock, NULL); + + if ((rpi->mbox_fd = mbox_open()) < 0) + { + av_log(avctx, AV_LOG_ERROR, "Failed to open mailbox\n"); + goto fail; + } + mbox_request_clock(rpi->mbox_fd); + + if ((rpi->regs = map_dev(avctx, REGS_NAME, REGS_SIZE)) == NULL || + (rpi->ints = map_dev(avctx, INTS_NAME, INTS_SIZE)) == NULL) { + av_log(avctx, AV_LOG_ERROR, "Failed to open rpivid devices\n"); + goto fail; + } + + if ((rpi->gpu_init_type = rpi_mem_gpu_init(0)) < 0) { + av_log(avctx, AV_LOG_ERROR, "Failed to init GPU\n"); + goto fail; + } + + if ((rpi->dec_envs = av_mallocz(sizeof(dec_env_t *) * avctx->thread_count)) == NULL) { + av_log(avctx, AV_LOG_ERROR, "Failed to alloc %d dec envs\n", avctx->thread_count); + goto fail; + } + + rpi->col_stride = rnd64(avctx->width); + rpi->col_picsize = rpi->col_stride * (((avctx->height + 63) & ~63) >> 4); + if (gpu_malloc_uncached(rpi->col_picsize * RPIVID_COL_PICS, &rpi->gcolbuf) != 0) + { + av_log(avctx, AV_LOG_ERROR, "Failed to allocate col mv buffer\n"); + goto fail; + } + + for (unsigned int i = 0; i != RPIVID_BITBUFS; ++i) { + if (gpu_malloc_uncached(RPIVID_BITBUF_SIZE, rpi->gbitbufs + i) != 0) + { + av_log(avctx, AV_LOG_ERROR, "Failed to allocate bitbuf %d\n", i); + goto fail; + } + } + + for (unsigned int i = 0; i != RPIVID_COEFFBUFS; ++i) { + if (gpu_malloc_uncached(RPIVID_COEFFBUF_SIZE, rpi->gcoeffbufs + i) != 0) + { + av_log(avctx, AV_LOG_ERROR, "Failed to allocate coeffbuf %d\n", i); + goto fail; + } + } + + av_log(avctx, AV_LOG_INFO, "RPI HEVC h/w accel init OK\n"); + + return 0; + +fail: + rpi_hevc_free(avctx); + return AVERROR_EXTERNAL; +} + +////////////////////////////////////////////////////////////////////////////// + +const AVHWAccel ff_hevc_rpi4_8_hwaccel = { + .name = "hevc_rpi4_8", + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_HEVC, + .pix_fmt = AV_PIX_FMT_RPI4_8, + .alloc_frame = rpivid_hevc_alloc_frame, + .start_frame = rpi_hevc_start_frame, + .end_frame = rpi_hevc_end_frame, + .abort_frame = rpi_hevc_abort_frame, + .decode_slice = rpi_hevc_decode_slice, + .init = rpi_hevc_init, + .uninit = rpi_hevc_free, + .priv_data_size = sizeof(RPI_T), + .caps_internal = HWACCEL_CAP_ASYNC_SAFE | HWACCEL_CAP_MT_SAFE, +}; + +const AVHWAccel ff_hevc_rpi4_10_hwaccel = { + .name = "hevc_rpi4_10", + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_HEVC, + .pix_fmt = AV_PIX_FMT_RPI4_10, + .alloc_frame = rpivid_hevc_alloc_frame, + .start_frame = rpi_hevc_start_frame, + .end_frame = rpi_hevc_end_frame, + .abort_frame = rpi_hevc_abort_frame, + .decode_slice = rpi_hevc_decode_slice, + .init = rpi_hevc_init, + .uninit = rpi_hevc_free, + .priv_data_size = sizeof(RPI_T), + .caps_internal = HWACCEL_CAP_ASYNC_SAFE | HWACCEL_CAP_MT_SAFE, +}; + diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c index 4b2679eb38..8d80d19788 100644 --- a/libavcodec/v4l2_buffers.c +++ b/libavcodec/v4l2_buffers.c @@ -21,6 +21,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include #include @@ -29,57 +30,88 @@ #include #include "libavcodec/avcodec.h" #include "libavcodec/internal.h" +#include "libavutil/avassert.h" #include "libavutil/pixdesc.h" +#include "libavutil/hwcontext.h" #include "v4l2_context.h" #include "v4l2_buffers.h" #include "v4l2_m2m.h" +#include "v4l2_req_dmabufs.h" +#include "weak_link.h" #define USEC_PER_SEC 1000000 -static AVRational v4l2_timebase = { 1, USEC_PER_SEC }; +static const AVRational v4l2_timebase = { 1, USEC_PER_SEC }; -static inline V4L2m2mContext *buf_to_m2mctx(V4L2Buffer *buf) +static inline V4L2m2mContext *ctx_to_m2mctx(const V4L2Context *ctx) { - return V4L2_TYPE_IS_OUTPUT(buf->context->type) ? - container_of(buf->context, V4L2m2mContext, output) : - container_of(buf->context, V4L2m2mContext, capture); + return V4L2_TYPE_IS_OUTPUT(ctx->type) ? + container_of(ctx, V4L2m2mContext, output) : + container_of(ctx, V4L2m2mContext, capture); } -static inline AVCodecContext *logger(V4L2Buffer *buf) +static inline V4L2m2mContext *buf_to_m2mctx(const V4L2Buffer * const buf) { - return buf_to_m2mctx(buf)->avctx; + return ctx_to_m2mctx(buf->context); } -static inline AVRational v4l2_get_timebase(V4L2Buffer *avbuf) +static inline AVCodecContext *logger(const V4L2Buffer * const buf) { - V4L2m2mContext *s = buf_to_m2mctx(avbuf); + return buf_to_m2mctx(buf)->avctx; +} - if (s->avctx->pkt_timebase.num) - return s->avctx->pkt_timebase; - return s->avctx->time_base; +static inline AVRational v4l2_get_timebase(const V4L2Buffer * const avbuf) +{ + const V4L2m2mContext *s = buf_to_m2mctx(avbuf); + const AVRational tb = s->avctx->pkt_timebase.num ? + s->avctx->pkt_timebase : + s->avctx->time_base; + return tb.num && tb.den ? tb : v4l2_timebase; } -static inline void v4l2_set_pts(V4L2Buffer *out, int64_t pts) +static inline struct timeval tv_from_int(const int64_t t) { - int64_t v4l2_pts; + return (struct timeval){ + .tv_usec = t % USEC_PER_SEC, + .tv_sec = t / USEC_PER_SEC + }; +} - if (pts == AV_NOPTS_VALUE) - pts = 0; +static inline int64_t int_from_tv(const struct timeval t) +{ + return (int64_t)t.tv_sec * USEC_PER_SEC + t.tv_usec; +} +static inline void v4l2_set_pts(V4L2Buffer * const out, const int64_t pts) +{ /* convert pts to v4l2 timebase */ - v4l2_pts = av_rescale_q(pts, v4l2_get_timebase(out), v4l2_timebase); - out->buf.timestamp.tv_usec = v4l2_pts % USEC_PER_SEC; - out->buf.timestamp.tv_sec = v4l2_pts / USEC_PER_SEC; + const int64_t v4l2_pts = + pts == AV_NOPTS_VALUE ? 0 : + av_rescale_q(pts, v4l2_get_timebase(out), v4l2_timebase); + out->buf.timestamp = tv_from_int(v4l2_pts); } -static inline int64_t v4l2_get_pts(V4L2Buffer *avbuf) +static inline int64_t v4l2_get_pts(const V4L2Buffer * const avbuf) { - int64_t v4l2_pts; - + const int64_t v4l2_pts = int_from_tv(avbuf->buf.timestamp); + return v4l2_pts != 0 ? v4l2_pts : AV_NOPTS_VALUE; +#if 0 /* convert pts back to encoder timebase */ - v4l2_pts = (int64_t)avbuf->buf.timestamp.tv_sec * USEC_PER_SEC + - avbuf->buf.timestamp.tv_usec; + return + avbuf->context->no_pts_rescale ? v4l2_pts : + v4l2_pts == 0 ? AV_NOPTS_VALUE : + av_rescale_q(v4l2_pts, v4l2_timebase, v4l2_get_timebase(avbuf)); +#endif +} - return av_rescale_q(v4l2_pts, v4l2_timebase, v4l2_get_timebase(avbuf)); +static void set_buf_length(V4L2Buffer *out, unsigned int plane, uint32_t bytesused, uint32_t length) +{ + if (V4L2_TYPE_IS_MULTIPLANAR(out->buf.type)) { + out->planes[plane].bytesused = bytesused; + out->planes[plane].length = length; + } else { + out->buf.bytesused = bytesused; + out->buf.length = length; + } } static enum AVColorPrimaries v4l2_get_color_primaries(V4L2Buffer *buf) @@ -116,6 +148,105 @@ static enum AVColorPrimaries v4l2_get_color_primaries(V4L2Buffer *buf) return AVCOL_PRI_UNSPECIFIED; } +static void v4l2_set_color(V4L2Buffer *buf, + const enum AVColorPrimaries avcp, + const enum AVColorSpace avcs, + const enum AVColorTransferCharacteristic avxc) +{ + enum v4l2_ycbcr_encoding ycbcr = V4L2_YCBCR_ENC_DEFAULT; + enum v4l2_colorspace cs = V4L2_COLORSPACE_DEFAULT; + enum v4l2_xfer_func xfer = V4L2_XFER_FUNC_DEFAULT; + + switch (avcp) { + case AVCOL_PRI_BT709: + cs = V4L2_COLORSPACE_REC709; + ycbcr = V4L2_YCBCR_ENC_709; + break; + case AVCOL_PRI_BT470M: + cs = V4L2_COLORSPACE_470_SYSTEM_M; + ycbcr = V4L2_YCBCR_ENC_601; + break; + case AVCOL_PRI_BT470BG: + cs = V4L2_COLORSPACE_470_SYSTEM_BG; + break; + case AVCOL_PRI_SMPTE170M: + cs = V4L2_COLORSPACE_SMPTE170M; + break; + case AVCOL_PRI_SMPTE240M: + cs = V4L2_COLORSPACE_SMPTE240M; + break; + case AVCOL_PRI_BT2020: + cs = V4L2_COLORSPACE_BT2020; + break; + case AVCOL_PRI_SMPTE428: + case AVCOL_PRI_SMPTE431: + case AVCOL_PRI_SMPTE432: + case AVCOL_PRI_EBU3213: + case AVCOL_PRI_RESERVED: + case AVCOL_PRI_FILM: + case AVCOL_PRI_UNSPECIFIED: + default: + break; + } + + switch (avcs) { + case AVCOL_SPC_RGB: + cs = V4L2_COLORSPACE_SRGB; + break; + case AVCOL_SPC_BT709: + cs = V4L2_COLORSPACE_REC709; + break; + case AVCOL_SPC_FCC: + cs = V4L2_COLORSPACE_470_SYSTEM_M; + break; + case AVCOL_SPC_BT470BG: + cs = V4L2_COLORSPACE_470_SYSTEM_BG; + break; + case AVCOL_SPC_SMPTE170M: + cs = V4L2_COLORSPACE_SMPTE170M; + break; + case AVCOL_SPC_SMPTE240M: + cs = V4L2_COLORSPACE_SMPTE240M; + break; + case AVCOL_SPC_BT2020_CL: + cs = V4L2_COLORSPACE_BT2020; + ycbcr = V4L2_YCBCR_ENC_BT2020_CONST_LUM; + break; + case AVCOL_SPC_BT2020_NCL: + cs = V4L2_COLORSPACE_BT2020; + break; + default: + break; + } + + switch (xfer) { + case AVCOL_TRC_BT709: + xfer = V4L2_XFER_FUNC_709; + break; + case AVCOL_TRC_IEC61966_2_1: + xfer = V4L2_XFER_FUNC_SRGB; + break; + case AVCOL_TRC_SMPTE240M: + xfer = V4L2_XFER_FUNC_SMPTE240M; + break; + case AVCOL_TRC_SMPTE2084: + xfer = V4L2_XFER_FUNC_SMPTE2084; + break; + default: + break; + } + + if (V4L2_TYPE_IS_MULTIPLANAR(buf->buf.type)) { + buf->context->format.fmt.pix_mp.colorspace = cs; + buf->context->format.fmt.pix_mp.ycbcr_enc = ycbcr; + buf->context->format.fmt.pix_mp.xfer_func = xfer; + } else { + buf->context->format.fmt.pix.colorspace = cs; + buf->context->format.fmt.pix.ycbcr_enc = ycbcr; + buf->context->format.fmt.pix.xfer_func = xfer; + } +} + static enum AVColorRange v4l2_get_color_range(V4L2Buffer *buf) { enum v4l2_quantization qt; @@ -134,6 +265,20 @@ static enum AVColorRange v4l2_get_color_range(V4L2Buffer *buf) return AVCOL_RANGE_UNSPECIFIED; } +static void v4l2_set_color_range(V4L2Buffer *buf, const enum AVColorRange avcr) +{ + const enum v4l2_quantization q = + avcr == AVCOL_RANGE_MPEG ? V4L2_QUANTIZATION_LIM_RANGE : + avcr == AVCOL_RANGE_JPEG ? V4L2_QUANTIZATION_FULL_RANGE : + V4L2_QUANTIZATION_DEFAULT; + + if (V4L2_TYPE_IS_MULTIPLANAR(buf->buf.type)) { + buf->context->format.fmt.pix_mp.quantization = q; + } else { + buf->context->format.fmt.pix.quantization = q; + } +} + static enum AVColorSpace v4l2_get_color_space(V4L2Buffer *buf) { enum v4l2_ycbcr_encoding ycbcr; @@ -210,73 +355,178 @@ static enum AVColorTransferCharacteristic v4l2_get_color_trc(V4L2Buffer *buf) return AVCOL_TRC_UNSPECIFIED; } -static void v4l2_free_buffer(void *opaque, uint8_t *unused) +static int v4l2_buf_is_interlaced(const V4L2Buffer * const buf) { - V4L2Buffer* avbuf = opaque; - V4L2m2mContext *s = buf_to_m2mctx(avbuf); + return V4L2_FIELD_IS_INTERLACED(buf->buf.field); +} - if (atomic_fetch_sub(&avbuf->context_refcount, 1) == 1) { - atomic_fetch_sub_explicit(&s->refcount, 1, memory_order_acq_rel); +static int v4l2_buf_is_top_first(const V4L2Buffer * const buf) +{ + return buf->buf.field == V4L2_FIELD_INTERLACED_TB; +} - if (s->reinit) { - if (!atomic_load(&s->refcount)) - sem_post(&s->refsync); - } else { - if (s->draining && V4L2_TYPE_IS_OUTPUT(avbuf->context->type)) { - /* no need to queue more buffers to the driver */ - avbuf->status = V4L2BUF_AVAILABLE; - } - else if (avbuf->context->streamon) - ff_v4l2_buffer_enqueue(avbuf); - } +static void v4l2_set_interlace(V4L2Buffer * const buf, const int is_interlaced, const int is_tff) +{ + buf->buf.field = !is_interlaced ? V4L2_FIELD_NONE : + is_tff ? V4L2_FIELD_INTERLACED_TB : V4L2_FIELD_INTERLACED_BT; +} - av_buffer_unref(&avbuf->context_ref); +static uint8_t * v4l2_get_drm_frame(V4L2Buffer *avbuf) +{ + AVDRMFrameDescriptor *drm_desc = &avbuf->drm_frame; + AVDRMLayerDescriptor *layer; + + /* fill the DRM frame descriptor */ + drm_desc->nb_objects = avbuf->num_planes; + drm_desc->nb_layers = 1; + + layer = &drm_desc->layers[0]; + layer->nb_planes = avbuf->num_planes; + + for (int i = 0; i < avbuf->num_planes; i++) { + layer->planes[i].object_index = i; + layer->planes[i].offset = avbuf->plane_info[i].offset; + layer->planes[i].pitch = avbuf->plane_info[i].bytesperline; } + + switch (avbuf->context->av_pix_fmt) { + case AV_PIX_FMT_YUYV422: + + layer->format = DRM_FORMAT_YUYV; + layer->nb_planes = 1; + + break; + + case AV_PIX_FMT_NV12: + case AV_PIX_FMT_NV21: + + layer->format = avbuf->context->av_pix_fmt == AV_PIX_FMT_NV12 ? + DRM_FORMAT_NV12 : DRM_FORMAT_NV21; + + if (avbuf->num_planes > 1) + break; + + layer->nb_planes = 2; + + layer->planes[1].object_index = 0; + layer->planes[1].offset = avbuf->plane_info[0].bytesperline * + avbuf->context->format.fmt.pix.height; + layer->planes[1].pitch = avbuf->plane_info[0].bytesperline; + break; + + case AV_PIX_FMT_YUV420P: + + layer->format = DRM_FORMAT_YUV420; + + if (avbuf->num_planes > 1) + break; + + layer->nb_planes = 3; + + layer->planes[1].object_index = 0; + layer->planes[1].offset = avbuf->plane_info[0].bytesperline * + avbuf->context->format.fmt.pix.height; + layer->planes[1].pitch = avbuf->plane_info[0].bytesperline >> 1; + + layer->planes[2].object_index = 0; + layer->planes[2].offset = layer->planes[1].offset + + ((avbuf->plane_info[0].bytesperline * + avbuf->context->format.fmt.pix.height) >> 2); + layer->planes[2].pitch = avbuf->plane_info[0].bytesperline >> 1; + break; + + default: + drm_desc->nb_layers = 0; + break; + } + + return (uint8_t *) drm_desc; } -static int v4l2_buf_increase_ref(V4L2Buffer *in) +static void v4l2_free_bufref(void *opaque, uint8_t *data) { - V4L2m2mContext *s = buf_to_m2mctx(in); + AVBufferRef * bufref = (AVBufferRef *)data; + V4L2Buffer *avbuf = (V4L2Buffer *)bufref->data; + struct V4L2Context *ctx = ff_weak_link_lock(&avbuf->context_wl); - if (in->context_ref) - atomic_fetch_add(&in->context_refcount, 1); - else { - in->context_ref = av_buffer_ref(s->self_ref); - if (!in->context_ref) - return AVERROR(ENOMEM); + if (ctx != NULL) { + // Buffer still attached to context + V4L2m2mContext *s = buf_to_m2mctx(avbuf); - in->context_refcount = 1; - } + ff_mutex_lock(&ctx->lock); - in->status = V4L2BUF_RET_USER; - atomic_fetch_add_explicit(&s->refcount, 1, memory_order_relaxed); + ff_v4l2_buffer_set_avail(avbuf); - return 0; + if (s->draining && V4L2_TYPE_IS_OUTPUT(ctx->type)) { + av_log(logger(avbuf), AV_LOG_DEBUG, "%s: Buffer avail\n", ctx->name); + /* no need to queue more buffers to the driver */ + } + else if (ctx->streamon) { + av_log(logger(avbuf), AV_LOG_DEBUG, "%s: Buffer requeue\n", ctx->name); + avbuf->buf.timestamp.tv_sec = 0; + avbuf->buf.timestamp.tv_usec = 0; + ff_v4l2_buffer_enqueue(avbuf); // will set to IN_DRIVER + } + else { + av_log(logger(avbuf), AV_LOG_DEBUG, "%s: Buffer freed but streamoff\n", ctx->name); + } + + ff_mutex_unlock(&ctx->lock); + } + + ff_weak_link_unlock(avbuf->context_wl); + av_buffer_unref(&bufref); } -static int v4l2_buf_to_bufref(V4L2Buffer *in, int plane, AVBufferRef **buf) +static inline uint32_t ff_v4l2_buf_len(const struct v4l2_buffer * b, unsigned int i) { - int ret; + return V4L2_TYPE_IS_MULTIPLANAR(b->type) ? b->m.planes[i].length : b->length; +} - if (plane >= in->num_planes) - return AVERROR(EINVAL); +static int v4l2_buffer_export_drm(V4L2Buffer* avbuf) +{ + int i, ret; + const V4L2m2mContext * const s = buf_to_m2mctx(avbuf); - /* even though most encoders return 0 in data_offset encoding vp8 does require this value */ - *buf = av_buffer_create((char *)in->plane_info[plane].mm_addr + in->planes[plane].data_offset, - in->plane_info[plane].length, v4l2_free_buffer, in, 0); - if (!*buf) - return AVERROR(ENOMEM); + for (i = 0; i < avbuf->num_planes; i++) { + int dma_fd = -1; + const uint32_t blen = ff_v4l2_buf_len(&avbuf->buf, i); + + if (s->db_ctl != NULL) { + if ((avbuf->dmabuf[i] = dmabuf_alloc(s->db_ctl, blen)) == NULL) + return AVERROR(ENOMEM); + dma_fd = dmabuf_fd(avbuf->dmabuf[i]); + if (V4L2_TYPE_IS_MULTIPLANAR(avbuf->buf.type)) + avbuf->buf.m.planes[i].m.fd = dma_fd; + else + avbuf->buf.m.fd = dma_fd; + } + else { + struct v4l2_exportbuffer expbuf; + memset(&expbuf, 0, sizeof(expbuf)); + + expbuf.index = avbuf->buf.index; + expbuf.type = avbuf->buf.type; + expbuf.plane = i; + + ret = ioctl(s->fd, VIDIOC_EXPBUF, &expbuf); + if (ret < 0) + return AVERROR(errno); + dma_fd = expbuf.fd; + } - ret = v4l2_buf_increase_ref(in); - if (ret) - av_buffer_unref(buf); + avbuf->drm_frame.objects[i].size = blen; + avbuf->drm_frame.objects[i].fd = dma_fd; + avbuf->drm_frame.objects[i].format_modifier = DRM_FORMAT_MOD_LINEAR; + } - return ret; + return 0; } static int v4l2_bufref_to_buf(V4L2Buffer *out, int plane, const uint8_t* data, int size, int offset) { unsigned int bytesused, length; + int rv = 0; if (plane >= out->num_planes) return AVERROR(EINVAL); @@ -284,32 +534,57 @@ static int v4l2_bufref_to_buf(V4L2Buffer *out, int plane, const uint8_t* data, i length = out->plane_info[plane].length; bytesused = FFMIN(size+offset, length); - memcpy((uint8_t*)out->plane_info[plane].mm_addr+offset, data, FFMIN(size, length-offset)); - - if (V4L2_TYPE_IS_MULTIPLANAR(out->buf.type)) { - out->planes[plane].bytesused = bytesused; - out->planes[plane].length = length; - } else { - out->buf.bytesused = bytesused; - out->buf.length = length; + if (size > length - offset) { + size = length - offset; + rv = AVERROR(ENOMEM); } - return 0; + memcpy((uint8_t*)out->plane_info[plane].mm_addr+offset, data, size); + + set_buf_length(out, plane, bytesused, length); + + return rv; +} + +static AVBufferRef * wrap_avbuf(V4L2Buffer * const avbuf) +{ + AVBufferRef * bufref = av_buffer_ref(avbuf->context->bufrefs[avbuf->buf.index]); + AVBufferRef * newbuf; + + if (!bufref) + return NULL; + + newbuf = av_buffer_create((uint8_t *)bufref, sizeof(*bufref), v4l2_free_bufref, NULL, 0); + if (newbuf == NULL) + av_buffer_unref(&bufref); + + avbuf->status = V4L2BUF_RET_USER; + return newbuf; } static int v4l2_buffer_buf_to_swframe(AVFrame *frame, V4L2Buffer *avbuf) { - int i, ret; + int i; frame->format = avbuf->context->av_pix_fmt; - for (i = 0; i < avbuf->num_planes; i++) { - ret = v4l2_buf_to_bufref(avbuf, i, &frame->buf[i]); - if (ret) - return ret; + frame->buf[0] = wrap_avbuf(avbuf); + if (frame->buf[0] == NULL) + return AVERROR(ENOMEM); + if (buf_to_m2mctx(avbuf)->output_drm) { + /* 1. get references to the actual data */ + frame->data[0] = (uint8_t *) v4l2_get_drm_frame(avbuf); + frame->format = AV_PIX_FMT_DRM_PRIME; + frame->hw_frames_ctx = av_buffer_ref(avbuf->context->frames_ref); + return 0; + } + + + /* 1. get references to the actual data */ + for (i = 0; i < avbuf->num_planes; i++) { + frame->data[i] = (uint8_t *)avbuf->plane_info[i].mm_addr + avbuf->planes[i].data_offset; frame->linesize[i] = avbuf->plane_info[i].bytesperline; - frame->data[i] = frame->buf[i]->data; } /* fixup special cases */ @@ -318,17 +593,17 @@ static int v4l2_buffer_buf_to_swframe(AVFrame *frame, V4L2Buffer *avbuf) case AV_PIX_FMT_NV21: if (avbuf->num_planes > 1) break; - frame->linesize[1] = avbuf->plane_info[0].bytesperline; - frame->data[1] = frame->buf[0]->data + avbuf->plane_info[0].bytesperline * avbuf->context->format.fmt.pix_mp.height; + frame->linesize[1] = frame->linesize[0]; + frame->data[1] = frame->data[0] + frame->linesize[0] * ff_v4l2_get_format_height(&avbuf->context->format); break; case AV_PIX_FMT_YUV420P: if (avbuf->num_planes > 1) break; - frame->linesize[1] = avbuf->plane_info[0].bytesperline >> 1; - frame->linesize[2] = avbuf->plane_info[0].bytesperline >> 1; - frame->data[1] = frame->buf[0]->data + avbuf->plane_info[0].bytesperline * avbuf->context->format.fmt.pix_mp.height; - frame->data[2] = frame->data[1] + ((avbuf->plane_info[0].bytesperline * avbuf->context->format.fmt.pix_mp.height) >> 2); + frame->linesize[1] = frame->linesize[0] / 2; + frame->linesize[2] = frame->linesize[1]; + frame->data[1] = frame->data[0] + frame->linesize[0] * ff_v4l2_get_format_height(&avbuf->context->format); + frame->data[2] = frame->data[1] + frame->linesize[1] * ff_v4l2_get_format_height(&avbuf->context->format) / 2; break; default: @@ -338,68 +613,127 @@ static int v4l2_buffer_buf_to_swframe(AVFrame *frame, V4L2Buffer *avbuf) return 0; } +static void cpy_2d(uint8_t * dst, int dst_stride, const uint8_t * src, int src_stride, int w, int h) +{ + if (dst_stride == src_stride && w + 32 >= dst_stride) { + memcpy(dst, src, dst_stride * h); + } + else { + while (--h >= 0) { + memcpy(dst, src, w); + dst += dst_stride; + src += src_stride; + } + } +} + +static int is_chroma(const AVPixFmtDescriptor *desc, int i, int num_planes) +{ + return i != 0 && !(i == num_planes - 1 && (desc->flags & AV_PIX_FMT_FLAG_ALPHA)); +} + +static int v4l2_buffer_primeframe_to_buf(const AVFrame *frame, V4L2Buffer *out) +{ + const AVDRMFrameDescriptor *const src = (const AVDRMFrameDescriptor *)frame->data[0]; + + if (frame->format != AV_PIX_FMT_DRM_PRIME || !src) + return AVERROR(EINVAL); + + av_assert0(out->buf.memory == V4L2_MEMORY_DMABUF); + + if (V4L2_TYPE_IS_MULTIPLANAR(out->buf.type)) { + // Only currently cope with single buffer types + if (out->buf.length != 1) + return AVERROR_PATCHWELCOME; + if (src->nb_objects != 1) + return AVERROR(EINVAL); + + out->planes[0].m.fd = src->objects[0].fd; + } + else { + if (src->nb_objects != 1) + return AVERROR(EINVAL); + + out->buf.m.fd = src->objects[0].fd; + } + + // No need to copy src AVDescriptor and if we did then we may confuse + // fd close on free + out->ref_buf = av_buffer_ref(frame->buf[0]); + + return 0; +} + static int v4l2_buffer_swframe_to_buf(const AVFrame *frame, V4L2Buffer *out) { - int i, ret; - struct v4l2_format fmt = out->context->format; - int pixel_format = V4L2_TYPE_IS_MULTIPLANAR(fmt.type) ? - fmt.fmt.pix_mp.pixelformat : fmt.fmt.pix.pixelformat; - int height = V4L2_TYPE_IS_MULTIPLANAR(fmt.type) ? - fmt.fmt.pix_mp.height : fmt.fmt.pix.height; - int is_planar_format = 0; - - switch (pixel_format) { - case V4L2_PIX_FMT_YUV420M: - case V4L2_PIX_FMT_YVU420M: -#ifdef V4L2_PIX_FMT_YUV422M - case V4L2_PIX_FMT_YUV422M: -#endif -#ifdef V4L2_PIX_FMT_YVU422M - case V4L2_PIX_FMT_YVU422M: -#endif -#ifdef V4L2_PIX_FMT_YUV444M - case V4L2_PIX_FMT_YUV444M: -#endif -#ifdef V4L2_PIX_FMT_YVU444M - case V4L2_PIX_FMT_YVU444M: -#endif - case V4L2_PIX_FMT_NV12M: - case V4L2_PIX_FMT_NV21M: - case V4L2_PIX_FMT_NV12MT_16X16: - case V4L2_PIX_FMT_NV12MT: - case V4L2_PIX_FMT_NV16M: - case V4L2_PIX_FMT_NV61M: - is_planar_format = 1; - } - - if (!is_planar_format) { - const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format); - int planes_nb = 0; - int offset = 0; - - for (i = 0; i < desc->nb_components; i++) - planes_nb = FFMAX(planes_nb, desc->comp[i].plane + 1); - - for (i = 0; i < planes_nb; i++) { - int size, h = height; - if (i == 1 || i == 2) { + int i; + int num_planes = 0; + int pel_strides[4] = {0}; + + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format); + + if ((desc->flags & AV_PIX_FMT_FLAG_HWACCEL) != 0) { + av_log(NULL, AV_LOG_ERROR, "%s: HWACCEL cannot be copied\n", __func__); + return -1; + } + + for (i = 0; i != desc->nb_components; ++i) { + if (desc->comp[i].plane >= num_planes) + num_planes = desc->comp[i].plane + 1; + pel_strides[desc->comp[i].plane] = desc->comp[i].step; + } + + if (out->num_planes > 1) { + if (num_planes != out->num_planes) { + av_log(NULL, AV_LOG_ERROR, "%s: Num planes mismatch: %d != %d\n", __func__, num_planes, out->num_planes); + return -1; + } + for (i = 0; i != num_planes; ++i) { + int w = frame->width; + int h = frame->height; + if (is_chroma(desc, i, num_planes)) { + w = AV_CEIL_RSHIFT(w, desc->log2_chroma_w); h = AV_CEIL_RSHIFT(h, desc->log2_chroma_h); } - size = frame->linesize[i] * h; - ret = v4l2_bufref_to_buf(out, 0, frame->data[i], size, offset); - if (ret) - return ret; - offset += size; + + cpy_2d(out->plane_info[i].mm_addr, out->plane_info[i].bytesperline, + frame->data[i], frame->linesize[i], + w * pel_strides[i], h); + set_buf_length(out, i, out->plane_info[i].bytesperline * h, out->plane_info[i].length); } - return 0; } + else + { + unsigned int offset = 0; + + for (i = 0; i != num_planes; ++i) { + int w = frame->width; + int h = frame->height; + int dst_stride = out->plane_info[0].bytesperline; + uint8_t * const dst = (uint8_t *)out->plane_info[0].mm_addr + offset; + + if (is_chroma(desc, i, num_planes)) { + // Is chroma + dst_stride >>= desc->log2_chroma_w; + offset += dst_stride * (out->context->height >> desc->log2_chroma_h); + w = AV_CEIL_RSHIFT(w, desc->log2_chroma_w); + h = AV_CEIL_RSHIFT(h, desc->log2_chroma_h); + } + else { + // Is luma or alpha + offset += dst_stride * out->context->height; + } + if (offset > out->plane_info[0].length) { + av_log(NULL, AV_LOG_ERROR, "%s: Plane total %u > buffer size %zu\n", __func__, offset, out->plane_info[0].length); + return -1; + } - for (i = 0; i < out->num_planes; i++) { - ret = v4l2_bufref_to_buf(out, i, frame->buf[i]->data, frame->buf[i]->size, 0); - if (ret) - return ret; + cpy_2d(dst, dst_stride, + frame->data[i], frame->linesize[i], + w * pel_strides[i], h); + } + set_buf_length(out, 0, offset, out->plane_info[0].length); } - return 0; } @@ -409,16 +743,31 @@ static int v4l2_buffer_swframe_to_buf(const AVFrame *frame, V4L2Buffer *out) * ******************************************************************************/ -int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out) +int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out, const int64_t track_ts) { - v4l2_set_pts(out, frame->pts); - - return v4l2_buffer_swframe_to_buf(frame, out); + out->buf.flags = frame->key_frame ? + (out->buf.flags | V4L2_BUF_FLAG_KEYFRAME) : + (out->buf.flags & ~V4L2_BUF_FLAG_KEYFRAME); + // Beware that colour info is held in format rather than the actual + // v4l2 buffer struct so this may not be as useful as you might hope + v4l2_set_color(out, frame->color_primaries, frame->colorspace, frame->color_trc); + v4l2_set_color_range(out, frame->color_range); + // PTS & interlace are buffer vars + if (track_ts) + out->buf.timestamp = tv_from_int(track_ts); + else + v4l2_set_pts(out, frame->pts); + v4l2_set_interlace(out, frame->interlaced_frame, frame->top_field_first); + + return frame->format == AV_PIX_FMT_DRM_PRIME ? + v4l2_buffer_primeframe_to_buf(frame, out) : + v4l2_buffer_swframe_to_buf(frame, out); } int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf) { int ret; + V4L2Context * const ctx = avbuf->context; av_frame_unref(frame); @@ -429,17 +778,32 @@ int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf) /* 2. get frame information */ frame->key_frame = !!(avbuf->buf.flags & V4L2_BUF_FLAG_KEYFRAME); + frame->pict_type = frame->key_frame ? AV_PICTURE_TYPE_I : + (avbuf->buf.flags & V4L2_BUF_FLAG_PFRAME) != 0 ? AV_PICTURE_TYPE_P : + (avbuf->buf.flags & V4L2_BUF_FLAG_BFRAME) != 0 ? AV_PICTURE_TYPE_B : + AV_PICTURE_TYPE_NONE; frame->color_primaries = v4l2_get_color_primaries(avbuf); frame->colorspace = v4l2_get_color_space(avbuf); frame->color_range = v4l2_get_color_range(avbuf); frame->color_trc = v4l2_get_color_trc(avbuf); frame->pts = v4l2_get_pts(avbuf); frame->pkt_dts = AV_NOPTS_VALUE; + frame->interlaced_frame = v4l2_buf_is_interlaced(avbuf); + frame->top_field_first = v4l2_buf_is_top_first(avbuf); /* these values are updated also during re-init in v4l2_process_driver_event */ - frame->height = avbuf->context->height; - frame->width = avbuf->context->width; - frame->sample_aspect_ratio = avbuf->context->sample_aspect_ratio; + frame->height = ctx->height; + frame->width = ctx->width; + frame->sample_aspect_ratio = ctx->sample_aspect_ratio; + + if (ctx->selection.height && ctx->selection.width) { + frame->crop_left = ctx->selection.left < frame->width ? ctx->selection.left : 0; + frame->crop_top = ctx->selection.top < frame->height ? ctx->selection.top : 0; + frame->crop_right = ctx->selection.left + ctx->selection.width < frame->width ? + frame->width - (ctx->selection.left + ctx->selection.width) : 0; + frame->crop_bottom = ctx->selection.top + ctx->selection.height < frame->height ? + frame->height - (ctx->selection.top + ctx->selection.height) : 0; + } /* 3. report errors upstream */ if (avbuf->buf.flags & V4L2_BUF_FLAG_ERROR) { @@ -452,15 +816,15 @@ int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf) int ff_v4l2_buffer_buf_to_avpkt(AVPacket *pkt, V4L2Buffer *avbuf) { - int ret; - av_packet_unref(pkt); - ret = v4l2_buf_to_bufref(avbuf, 0, &pkt->buf); - if (ret) - return ret; + + pkt->buf = wrap_avbuf(avbuf); + if (pkt->buf == NULL) + return AVERROR(ENOMEM); pkt->size = V4L2_TYPE_IS_MULTIPLANAR(avbuf->buf.type) ? avbuf->buf.m.planes[0].bytesused : avbuf->buf.bytesused; - pkt->data = pkt->buf->data; + pkt->data = (uint8_t*)avbuf->plane_info[0].mm_addr + avbuf->planes[0].data_offset; + pkt->flags = 0; if (avbuf->buf.flags & V4L2_BUF_FLAG_KEYFRAME) pkt->flags |= AV_PKT_FLAG_KEY; @@ -475,39 +839,107 @@ int ff_v4l2_buffer_buf_to_avpkt(AVPacket *pkt, V4L2Buffer *avbuf) return 0; } -int ff_v4l2_buffer_avpkt_to_buf(const AVPacket *pkt, V4L2Buffer *out) +int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket * const pkt, V4L2Buffer * const out, + const void *extdata, size_t extlen, + const int64_t timestamp) { int ret; - ret = v4l2_bufref_to_buf(out, 0, pkt->data, pkt->size, 0); - if (ret) + if (extlen) { + ret = v4l2_bufref_to_buf(out, 0, extdata, extlen, 0); + if (ret) + return ret; + } + + ret = v4l2_bufref_to_buf(out, 0, pkt->data, pkt->size, extlen); + if (ret && ret != AVERROR(ENOMEM)) return ret; - v4l2_set_pts(out, pkt->pts); + if (timestamp) + out->buf.timestamp = tv_from_int(timestamp); + else + v4l2_set_pts(out, pkt->pts); - if (pkt->flags & AV_PKT_FLAG_KEY) - out->flags = V4L2_BUF_FLAG_KEYFRAME; + out->buf.flags = (pkt->flags & AV_PKT_FLAG_KEY) != 0 ? + (out->buf.flags | V4L2_BUF_FLAG_KEYFRAME) : + (out->buf.flags & ~V4L2_BUF_FLAG_KEYFRAME); - return 0; + return ret; +} + +int ff_v4l2_buffer_avpkt_to_buf(const AVPacket *pkt, V4L2Buffer *out) +{ + return ff_v4l2_buffer_avpkt_to_buf_ext(pkt, out, NULL, 0, 0); } -int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index) + +static void v4l2_buffer_buffer_free(void *opaque, uint8_t *data) +{ + V4L2Buffer * const avbuf = (V4L2Buffer *)data; + int i; + + for (i = 0; i != FF_ARRAY_ELEMS(avbuf->plane_info); ++i) { + struct V4L2Plane_info *p = avbuf->plane_info + i; + if (p->mm_addr != NULL) + munmap(p->mm_addr, p->length); + } + + if (avbuf->dmabuf[0] == NULL) { + for (i = 0; i != FF_ARRAY_ELEMS(avbuf->drm_frame.objects); ++i) { + if (avbuf->drm_frame.objects[i].fd != -1) + close(avbuf->drm_frame.objects[i].fd); + } + } + else { + for (i = 0; i != FF_ARRAY_ELEMS(avbuf->dmabuf); ++i) { + dmabuf_free(avbuf->dmabuf[i]); + } + } + + av_buffer_unref(&avbuf->ref_buf); + + ff_weak_link_unref(&avbuf->context_wl); + + av_free(avbuf); +} + + +int ff_v4l2_buffer_initialize(AVBufferRef ** pbufref, int index, V4L2Context *ctx, enum v4l2_memory mem) { - V4L2Context *ctx = avbuf->context; int ret, i; + V4L2Buffer * const avbuf = av_mallocz(sizeof(*avbuf)); + AVBufferRef * bufref; + V4L2m2mContext * const s = ctx_to_m2mctx(ctx); - avbuf->buf.memory = V4L2_MEMORY_MMAP; + *pbufref = NULL; + if (avbuf == NULL) + return AVERROR(ENOMEM); + + bufref = av_buffer_create((uint8_t*)avbuf, sizeof(*avbuf), v4l2_buffer_buffer_free, NULL, 0); + if (bufref == NULL) { + av_free(avbuf); + return AVERROR(ENOMEM); + } + + avbuf->context = ctx; + avbuf->buf.memory = mem; avbuf->buf.type = ctx->type; avbuf->buf.index = index; + for (i = 0; i != FF_ARRAY_ELEMS(avbuf->drm_frame.objects); ++i) { + avbuf->drm_frame.objects[i].fd = -1; + } + + avbuf->context_wl = ff_weak_link_ref(ctx->wl_master); + if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { avbuf->buf.length = VIDEO_MAX_PLANES; avbuf->buf.m.planes = avbuf->planes; } - ret = ioctl(buf_to_m2mctx(avbuf)->fd, VIDIOC_QUERYBUF, &avbuf->buf); + ret = ioctl(s->fd, VIDIOC_QUERYBUF, &avbuf->buf); if (ret < 0) - return AVERROR(errno); + goto fail; if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { avbuf->num_planes = 0; @@ -520,6 +952,8 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index) avbuf->num_planes = 1; for (i = 0; i < avbuf->num_planes; i++) { + const int want_mmap = avbuf->buf.memory == V4L2_MEMORY_MMAP && + (V4L2_TYPE_IS_OUTPUT(ctx->type) || !buf_to_m2mctx(avbuf)->output_drm); avbuf->plane_info[i].bytesperline = V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? ctx->format.fmt.pix_mp.plane_fmt[i].bytesperline : @@ -527,25 +961,31 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index) if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { avbuf->plane_info[i].length = avbuf->buf.m.planes[i].length; - avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.m.planes[i].length, - PROT_READ | PROT_WRITE, MAP_SHARED, - buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.planes[i].m.mem_offset); + avbuf->plane_info[i].offset = avbuf->buf.m.planes[i].data_offset; + + if (want_mmap) + avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.m.planes[i].length, + PROT_READ | PROT_WRITE, MAP_SHARED, + buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.planes[i].m.mem_offset); } else { avbuf->plane_info[i].length = avbuf->buf.length; - avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.length, - PROT_READ | PROT_WRITE, MAP_SHARED, - buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.offset); + avbuf->plane_info[i].offset = 0; + + if (want_mmap) + avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.length, + PROT_READ | PROT_WRITE, MAP_SHARED, + buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.offset); } - if (avbuf->plane_info[i].mm_addr == MAP_FAILED) - return AVERROR(ENOMEM); + if (avbuf->plane_info[i].mm_addr == MAP_FAILED) { + avbuf->plane_info[i].mm_addr = NULL; + ret = AVERROR(ENOMEM); + goto fail; + } } avbuf->status = V4L2BUF_AVAILABLE; - if (V4L2_TYPE_IS_OUTPUT(ctx->type)) - return 0; - if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { avbuf->buf.m.planes = avbuf->planes; avbuf->buf.length = avbuf->num_planes; @@ -555,20 +995,53 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index) avbuf->buf.length = avbuf->planes[0].length; } - return ff_v4l2_buffer_enqueue(avbuf); + if (!V4L2_TYPE_IS_OUTPUT(ctx->type)) { + if (s->output_drm) { + ret = v4l2_buffer_export_drm(avbuf); + if (ret) { + av_log(logger(avbuf), AV_LOG_ERROR, "Failed to get exported drm handles\n"); + goto fail; + } + } + } + + *pbufref = bufref; + return 0; + +fail: + av_buffer_unref(&bufref); + return ret; } int ff_v4l2_buffer_enqueue(V4L2Buffer* avbuf) { int ret; + int qc; - avbuf->buf.flags = avbuf->flags; + if (avbuf->buf.timestamp.tv_sec || avbuf->buf.timestamp.tv_usec) { + av_log(logger(avbuf), AV_LOG_DEBUG, "--- %s pre VIDIOC_QBUF: index %d, ts=%ld.%06ld count=%d\n", + avbuf->context->name, avbuf->buf.index, + avbuf->buf.timestamp.tv_sec, avbuf->buf.timestamp.tv_usec, + avbuf->context->q_count); + } ret = ioctl(buf_to_m2mctx(avbuf)->fd, VIDIOC_QBUF, &avbuf->buf); - if (ret < 0) - return AVERROR(errno); + if (ret < 0) { + int err = errno; + av_log(logger(avbuf), AV_LOG_ERROR, "--- %s VIDIOC_QBUF: index %d FAIL err %d (%s)\n", + avbuf->context->name, avbuf->buf.index, + err, strerror(err)); + return AVERROR(err); + } + // Lock not wanted - if called from buffer free then lock already obtained + qc = atomic_fetch_add(&avbuf->context->q_count, 1) + 1; avbuf->status = V4L2BUF_IN_DRIVER; + pthread_cond_broadcast(&avbuf->context->cond); + + av_log(logger(avbuf), AV_LOG_DEBUG, "--- %s VIDIOC_QBUF: index %d, ts=%ld.%06ld count=%d\n", + avbuf->context->name, avbuf->buf.index, + avbuf->buf.timestamp.tv_sec, avbuf->buf.timestamp.tv_usec, qc); return 0; } diff --git a/libavcodec/v4l2_buffers.h b/libavcodec/v4l2_buffers.h index 8dbc7fc104..0bda4dd06b 100644 --- a/libavcodec/v4l2_buffers.h +++ b/libavcodec/v4l2_buffers.h @@ -27,29 +27,44 @@ #include #include +#include "libavutil/hwcontext_drm.h" #include "avcodec.h" enum V4L2Buffer_status { V4L2BUF_AVAILABLE, V4L2BUF_IN_DRIVER, + V4L2BUF_IN_USE, V4L2BUF_RET_USER, }; /** * V4L2Buffer (wrapper for v4l2_buffer management) */ +struct V4L2Context; +struct ff_weak_link_client; +struct dmabuf_h; + typedef struct V4L2Buffer { - /* each buffer needs to have a reference to its context */ + /* each buffer needs to have a reference to its context + * The pointer is good enough for most operation but once the buffer has + * been passed to the user the buffer may become orphaned so for free ops + * the weak link must be used to ensure that the context is actually + * there + */ struct V4L2Context *context; + struct ff_weak_link_client *context_wl; - /* This object is refcounted per-plane, so we need to keep track - * of how many context-refs we are holding. */ - AVBufferRef *context_ref; - atomic_uint context_refcount; + /* DRM descriptor */ + AVDRMFrameDescriptor drm_frame; + /* For DRM_PRIME encode - need to keep a ref to the source buffer till we + * are done + */ + AVBufferRef * ref_buf; /* keep track of the mmap address and mmap length */ struct V4L2Plane_info { - int bytesperline; + size_t bytesperline; + size_t offset; void * mm_addr; size_t length; } plane_info[VIDEO_MAX_PLANES]; @@ -60,9 +75,9 @@ typedef struct V4L2Buffer { struct v4l2_buffer buf; struct v4l2_plane planes[VIDEO_MAX_PLANES]; - int flags; enum V4L2Buffer_status status; + struct dmabuf_h * dmabuf[VIDEO_MAX_PLANES]; // If externally alloced dmabufs - stash other info here } V4L2Buffer; /** @@ -98,6 +113,10 @@ int ff_v4l2_buffer_buf_to_avpkt(AVPacket *pkt, V4L2Buffer *buf); */ int ff_v4l2_buffer_avpkt_to_buf(const AVPacket *pkt, V4L2Buffer *out); +int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket * const pkt, V4L2Buffer * const out, + const void *extdata, size_t extlen, + const int64_t timestamp); + /** * Extracts the data from an AVFrame to a V4L2Buffer * @@ -106,7 +125,7 @@ int ff_v4l2_buffer_avpkt_to_buf(const AVPacket *pkt, V4L2Buffer *out); * * @returns 0 in case of success, a negative AVERROR code otherwise */ -int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out); +int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out, const int64_t track_ts); /** * Initializes a V4L2Buffer @@ -116,7 +135,7 @@ int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out); * * @returns 0 in case of success, a negative AVERROR code otherwise */ -int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index); +int ff_v4l2_buffer_initialize(AVBufferRef **avbuf, int index, struct V4L2Context *ctx, enum v4l2_memory mem); /** * Enqueues a V4L2Buffer @@ -127,5 +146,12 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index); */ int ff_v4l2_buffer_enqueue(V4L2Buffer* avbuf); +static inline void +ff_v4l2_buffer_set_avail(V4L2Buffer* const avbuf) +{ + avbuf->status = V4L2BUF_AVAILABLE; + av_buffer_unref(&avbuf->ref_buf); +} + #endif // AVCODEC_V4L2_BUFFERS_H diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c index ff1ea8e57b..65b2648557 100644 --- a/libavcodec/v4l2_context.c +++ b/libavcodec/v4l2_context.c @@ -27,11 +27,13 @@ #include #include #include +#include "libavutil/avassert.h" #include "libavcodec/avcodec.h" #include "libavcodec/internal.h" #include "v4l2_buffers.h" #include "v4l2_fmt.h" #include "v4l2_m2m.h" +#include "weak_link.h" struct v4l2_format_update { uint32_t v4l2_fmt; @@ -41,26 +43,168 @@ struct v4l2_format_update { int update_avfmt; }; -static inline V4L2m2mContext *ctx_to_m2mctx(V4L2Context *ctx) + +static inline int64_t track_to_pts(AVCodecContext *avctx, unsigned int n) { - return V4L2_TYPE_IS_OUTPUT(ctx->type) ? - container_of(ctx, V4L2m2mContext, output) : - container_of(ctx, V4L2m2mContext, capture); + return (int64_t)n; } -static inline AVCodecContext *logger(V4L2Context *ctx) +static inline unsigned int pts_to_track(AVCodecContext *avctx, const int64_t pts) { - return ctx_to_m2mctx(ctx)->avctx; + return (unsigned int)pts; } -static inline unsigned int v4l2_get_width(struct v4l2_format *fmt) +// FFmpeg requires us to propagate a number of vars from the coded pkt into +// the decoded frame. The only thing that tracks like that in V4L2 stateful +// is timestamp. PTS maps to timestamp for this decode. FFmpeg makes no +// guarantees about PTS being unique or specified for every frame so replace +// the supplied PTS with a simple incrementing number and keep a circular +// buffer of all the things we want preserved (including the original PTS) +// indexed by the tracking no. +static int64_t +xlat_pts_pkt_in(AVCodecContext *const avctx, xlat_track_t *const x, const AVPacket *const avpkt) { - return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.width : fmt->fmt.pix.width; + int64_t track_pts; + + // Avoid 0 + if (++x->track_no == 0) + x->track_no = 1; + + track_pts = track_to_pts(avctx, x->track_no); + + av_log(avctx, AV_LOG_TRACE, "In pkt PTS=%" PRId64 ", DTS=%" PRId64 ", track=%" PRId64 ", n=%u\n", avpkt->pts, avpkt->dts, track_pts, x->track_no); + x->track_els[x->track_no % FF_V4L2_M2M_TRACK_SIZE] = (V4L2m2mTrackEl){ + .discard = 0, + .pending = 1, + .pkt_size = avpkt->size, + .pts = avpkt->pts, + .dts = avpkt->dts, + .reordered_opaque = avctx->reordered_opaque, + .pkt_pos = avpkt->pos, + .pkt_duration = avpkt->duration, + .track_pts = track_pts + }; + return track_pts; +} + +static int64_t +xlat_pts_frame_in(AVCodecContext *const avctx, xlat_track_t *const x, const AVFrame *const frame) +{ + int64_t track_pts; + + // Avoid 0 + if (++x->track_no == 0) + x->track_no = 1; + + track_pts = track_to_pts(avctx, x->track_no); + + av_log(avctx, AV_LOG_TRACE, "In frame PTS=%" PRId64 ", track=%" PRId64 ", n=%u\n", frame->pts, track_pts, x->track_no); + x->track_els[x->track_no % FF_V4L2_M2M_TRACK_SIZE] = (V4L2m2mTrackEl){ + .discard = 0, + .pending = 1, + .pkt_size = 0, + .pts = frame->pts, + .dts = AV_NOPTS_VALUE, + .reordered_opaque = frame->reordered_opaque, + .pkt_pos = frame->pkt_pos, + .pkt_duration = frame->pkt_duration, + .track_pts = track_pts + }; + return track_pts; } -static inline unsigned int v4l2_get_height(struct v4l2_format *fmt) + +// Returns -1 if we should discard the frame +static int +xlat_pts_frame_out(AVCodecContext *const avctx, + xlat_track_t * const x, + AVFrame *const frame) { - return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.height : fmt->fmt.pix.height; + unsigned int n = pts_to_track(avctx, frame->pts) % FF_V4L2_M2M_TRACK_SIZE; + V4L2m2mTrackEl *const t = x->track_els + n; + if (frame->pts == AV_NOPTS_VALUE || frame->pts != t->track_pts) + { + av_log(avctx, frame->pts == AV_NOPTS_VALUE ? AV_LOG_DEBUG : AV_LOG_WARNING, + "Frame tracking failure: pts=%" PRId64 ", track[%d]=%" PRId64 "\n", frame->pts, n, t->track_pts); + frame->pts = AV_NOPTS_VALUE; + frame->pkt_dts = AV_NOPTS_VALUE; + frame->reordered_opaque = x->last_opaque; + frame->pkt_pos = -1; + frame->pkt_duration = 0; + frame->pkt_size = -1; + } + else if (!t->discard) + { + frame->pts = t->pending ? t->pts : AV_NOPTS_VALUE; + frame->pkt_dts = t->dts; + frame->reordered_opaque = t->reordered_opaque; + frame->pkt_pos = t->pkt_pos; + frame->pkt_duration = t->pkt_duration; + frame->pkt_size = t->pkt_size; + + x->last_opaque = x->track_els[n].reordered_opaque; + if (frame->pts != AV_NOPTS_VALUE) + x->last_pts = frame->pts; + t->pending = 0; + } + else + { + av_log(avctx, AV_LOG_DEBUG, "Discard frame (flushed): pts=%" PRId64 ", track[%d]=%" PRId64 "\n", frame->pts, n, t->track_pts); + return -1; + } + + av_log(avctx, AV_LOG_TRACE, "Out frame PTS=%" PRId64 "/%"PRId64", DTS=%" PRId64 ", track=%"PRId64", n=%d\n", + frame->pts, frame->best_effort_timestamp, frame->pkt_dts, t->track_pts, n); + return 0; +} + +// Returns -1 if we should discard the frame +static int +xlat_pts_pkt_out(AVCodecContext *const avctx, + xlat_track_t * const x, + AVPacket *const pkt) +{ + unsigned int n = pts_to_track(avctx, pkt->pts) % FF_V4L2_M2M_TRACK_SIZE; + V4L2m2mTrackEl *const t = x->track_els + n; + if (pkt->pts == AV_NOPTS_VALUE || pkt->pts != t->track_pts) + { + av_log(avctx, pkt->pts == AV_NOPTS_VALUE ? AV_LOG_DEBUG : AV_LOG_WARNING, + "Pkt tracking failure: pts=%" PRId64 ", track[%d]=%" PRId64 "\n", pkt->pts, n, t->track_pts); + pkt->pts = AV_NOPTS_VALUE; + } + else if (!t->discard) + { + pkt->pts = t->pending ? t->pts : AV_NOPTS_VALUE; + + x->last_opaque = x->track_els[n].reordered_opaque; + if (pkt->pts != AV_NOPTS_VALUE) + x->last_pts = pkt->pts; + t->pending = 0; + } + else + { + av_log(avctx, AV_LOG_DEBUG, "Discard packet (flushed): pts=%" PRId64 ", track[%d]=%" PRId64 "\n", pkt->pts, n, t->track_pts); + return -1; + } + + // * Would like something much better than this...xlat(offset + out_count)? + pkt->dts = pkt->pts; + av_log(avctx, AV_LOG_TRACE, "Out pkt PTS=%" PRId64 ", track=%"PRId64", n=%d\n", + pkt->pts, t->track_pts, n); + return 0; +} + + +static inline V4L2m2mContext *ctx_to_m2mctx(const V4L2Context *ctx) +{ + return V4L2_TYPE_IS_OUTPUT(ctx->type) ? + container_of(ctx, V4L2m2mContext, output) : + container_of(ctx, V4L2m2mContext, capture); +} + +static inline AVCodecContext *logger(const V4L2Context *ctx) +{ + return ctx_to_m2mctx(ctx)->avctx; } static AVRational v4l2_get_sar(V4L2Context *ctx) @@ -81,21 +225,29 @@ static AVRational v4l2_get_sar(V4L2Context *ctx) return sar; } -static inline unsigned int v4l2_resolution_changed(V4L2Context *ctx, struct v4l2_format *fmt2) +static inline int ctx_buffers_alloced(const V4L2Context * const ctx) +{ + return ctx->bufrefs != NULL; +} + +// Width/Height changed or we don't have an alloc in the first place? +static int ctx_resolution_changed(const V4L2Context *ctx, const struct v4l2_format *fmt2) { - struct v4l2_format *fmt1 = &ctx->format; - int ret = V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? - fmt1->fmt.pix_mp.width != fmt2->fmt.pix_mp.width || - fmt1->fmt.pix_mp.height != fmt2->fmt.pix_mp.height - : - fmt1->fmt.pix.width != fmt2->fmt.pix.width || - fmt1->fmt.pix.height != fmt2->fmt.pix.height; + const struct v4l2_format *fmt1 = &ctx->format; + int ret = !ctx_buffers_alloced(ctx) || + (V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? + fmt1->fmt.pix_mp.width != fmt2->fmt.pix_mp.width || + fmt1->fmt.pix_mp.height != fmt2->fmt.pix_mp.height + : + fmt1->fmt.pix.width != fmt2->fmt.pix.width || + fmt1->fmt.pix.height != fmt2->fmt.pix.height); if (ret) - av_log(logger(ctx), AV_LOG_DEBUG, "%s changed (%dx%d) -> (%dx%d)\n", + av_log(logger(ctx), AV_LOG_DEBUG, "V4L2 %s changed: alloc=%d (%dx%d) -> (%dx%d)\n", ctx->name, - v4l2_get_width(fmt1), v4l2_get_height(fmt1), - v4l2_get_width(fmt2), v4l2_get_height(fmt2)); + ctx_buffers_alloced(ctx), + ff_v4l2_get_format_width(fmt1), ff_v4l2_get_format_height(fmt1), + ff_v4l2_get_format_width(fmt2), ff_v4l2_get_format_height(fmt2)); return ret; } @@ -153,90 +305,110 @@ static inline void v4l2_save_to_context(V4L2Context* ctx, struct v4l2_format_upd } } -/** - * handle resolution change event and end of stream event - * returns 1 if reinit was successful, negative if it failed - * returns 0 if reinit was not executed - */ -static int v4l2_handle_event(V4L2Context *ctx) +static int get_default_selection(V4L2Context * const ctx, struct v4l2_rect *r) { - V4L2m2mContext *s = ctx_to_m2mctx(ctx); - struct v4l2_format cap_fmt = s->capture.format; - struct v4l2_format out_fmt = s->output.format; - struct v4l2_event evt = { 0 }; - int full_reinit, reinit, ret; + V4L2m2mContext * const s = ctx_to_m2mctx(ctx); + struct v4l2_selection selection = { + .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, + .target = V4L2_SEL_TGT_COMPOSE + }; - ret = ioctl(s->fd, VIDIOC_DQEVENT, &evt); - if (ret < 0) { - av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_DQEVENT\n", ctx->name); - return 0; - } + memset(r, 0, sizeof(*r)); + if (ioctl(s->fd, VIDIOC_G_SELECTION, &selection)) + return AVERROR(errno); - if (evt.type == V4L2_EVENT_EOS) { - ctx->done = 1; - return 0; - } + *r = selection.r; + return 0; +} - if (evt.type != V4L2_EVENT_SOURCE_CHANGE) - return 0; +static int do_source_change(V4L2m2mContext * const s) +{ + AVCodecContext *const avctx = s->avctx; - ret = ioctl(s->fd, VIDIOC_G_FMT, &out_fmt); - if (ret) { - av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_G_FMT\n", s->output.name); - return 0; - } + int ret; + int reinit; + struct v4l2_format cap_fmt = s->capture.format; + + s->capture.done = 0; ret = ioctl(s->fd, VIDIOC_G_FMT, &cap_fmt); if (ret) { - av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_G_FMT\n", s->capture.name); + av_log(avctx, AV_LOG_ERROR, "%s VIDIOC_G_FMT failed\n", s->capture.name); return 0; } - full_reinit = v4l2_resolution_changed(&s->output, &out_fmt); - if (full_reinit) { - s->output.height = v4l2_get_height(&out_fmt); - s->output.width = v4l2_get_width(&out_fmt); - s->output.sample_aspect_ratio = v4l2_get_sar(&s->output); - } + get_default_selection(&s->capture, &s->capture.selection); + + reinit = ctx_resolution_changed(&s->capture, &cap_fmt); + if ((s->quirks & FF_V4L2_QUIRK_REINIT_ALWAYS) != 0) + reinit = 1; - reinit = v4l2_resolution_changed(&s->capture, &cap_fmt); + s->capture.format = cap_fmt; if (reinit) { - s->capture.height = v4l2_get_height(&cap_fmt); - s->capture.width = v4l2_get_width(&cap_fmt); - s->capture.sample_aspect_ratio = v4l2_get_sar(&s->capture); + s->capture.height = ff_v4l2_get_format_height(&cap_fmt); + s->capture.width = ff_v4l2_get_format_width(&cap_fmt); } - if (full_reinit || reinit) - s->reinit = 1; - - if (full_reinit) { - ret = ff_v4l2_m2m_codec_full_reinit(s); - if (ret) { - av_log(logger(ctx), AV_LOG_ERROR, "v4l2_m2m_codec_full_reinit\n"); - return AVERROR(EINVAL); - } - goto reinit_run; + // If we don't support selection (or it is bust) and we obviously have HD then kludge + if ((s->capture.selection.width == 0 || s->capture.selection.height == 0) && + (s->capture.height == 1088 && s->capture.width == 1920)) { + s->capture.selection = (struct v4l2_rect){.width = 1920, .height = 1080}; } + s->capture.sample_aspect_ratio = v4l2_get_sar(&s->capture); + + av_log(avctx, AV_LOG_DEBUG, "Source change: SAR: %d/%d, wxh %dx%d crop %dx%d @ %d,%d, reinit=%d\n", + s->capture.sample_aspect_ratio.num, s->capture.sample_aspect_ratio.den, + s->capture.width, s->capture.height, + s->capture.selection.width, s->capture.selection.height, + s->capture.selection.left, s->capture.selection.top, reinit); + if (reinit) { - if (s->avctx) - ret = ff_set_dimensions(s->avctx, s->capture.width, s->capture.height); + if (avctx) + ret = ff_set_dimensions(s->avctx, + s->capture.selection.width != 0 ? s->capture.selection.width : s->capture.width, + s->capture.selection.height != 0 ? s->capture.selection.height : s->capture.height); if (ret < 0) - av_log(logger(ctx), AV_LOG_WARNING, "update avcodec height and width\n"); + av_log(avctx, AV_LOG_WARNING, "update avcodec height and width failed\n"); ret = ff_v4l2_m2m_codec_reinit(s); if (ret) { - av_log(logger(ctx), AV_LOG_ERROR, "v4l2_m2m_codec_reinit\n"); + av_log(avctx, AV_LOG_ERROR, "v4l2_m2m_codec_reinit failed\n"); return AVERROR(EINVAL); } + + if (s->capture.width > ff_v4l2_get_format_width(&s->capture.format) || + s->capture.height > ff_v4l2_get_format_height(&s->capture.format)) { + av_log(avctx, AV_LOG_ERROR, "Format post reinit too small: wanted %dx%d > got %dx%d\n", + s->capture.width, s->capture.height, + ff_v4l2_get_format_width(&s->capture.format), ff_v4l2_get_format_height(&s->capture.format)); + return AVERROR(EINVAL); + } + + // Update pixel format - should only actually do something on initial change + s->capture.av_pix_fmt = + ff_v4l2_format_v4l2_to_avfmt(ff_v4l2_get_format_pixelformat(&s->capture.format), AV_CODEC_ID_RAWVIDEO); + if (s->output_drm) { + avctx->pix_fmt = AV_PIX_FMT_DRM_PRIME; + avctx->sw_pix_fmt = s->capture.av_pix_fmt; + } + else + avctx->pix_fmt = s->capture.av_pix_fmt; + goto reinit_run; } - /* dummy event received */ - return 0; + /* Buffers are OK so just stream off to ack */ + av_log(avctx, AV_LOG_DEBUG, "%s: Parameters only - restart decode\n", __func__); + + ret = ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMOFF); + if (ret) + av_log(avctx, AV_LOG_ERROR, "capture VIDIOC_STREAMOFF failed\n"); + s->draining = 0; /* reinit executed */ reinit_run: + ret = ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMON); return 1; } @@ -280,171 +452,293 @@ static int v4l2_stop_encode(V4L2Context *ctx) return 0; } -static V4L2Buffer* v4l2_dequeue_v4l2buf(V4L2Context *ctx, int timeout) +// DQ a buffer +// Amalgamates all the various ways there are of signalling EOS/Event to +// generate a consistant EPIPE. +// +// Sets ctx->flag_last if next dq would produce EPIPE (i.e. stream has stopped) +// +// Returns: +// 0 Success +// AVERROR(EPIPE) Nothing more to read +// AVERROR(ENOSPC) No buffers in Q to put result in +// * AVERROR(..) + + static int +dq_buf(V4L2Context * const ctx, V4L2Buffer ** const ppavbuf) { - struct v4l2_plane planes[VIDEO_MAX_PLANES]; - struct v4l2_buffer buf = { 0 }; - V4L2Buffer *avbuf; - struct pollfd pfd = { - .events = POLLIN | POLLRDNORM | POLLPRI | POLLOUT | POLLWRNORM, /* default blocking capture */ - .fd = ctx_to_m2mctx(ctx)->fd, + V4L2m2mContext * const m = ctx_to_m2mctx(ctx); + AVCodecContext * const avctx = m->avctx; + V4L2Buffer * avbuf; + const int is_mp = V4L2_TYPE_IS_MULTIPLANAR(ctx->type); + + struct v4l2_plane planes[VIDEO_MAX_PLANES] = {{0}}; + + struct v4l2_buffer buf = { + .type = ctx->type, + .memory = V4L2_MEMORY_MMAP, }; - int i, ret; - if (!V4L2_TYPE_IS_OUTPUT(ctx->type) && ctx->buffers) { - for (i = 0; i < ctx->num_buffers; i++) { - if (ctx->buffers[i].status == V4L2BUF_IN_DRIVER) - break; - } - if (i == ctx->num_buffers) - av_log(logger(ctx), AV_LOG_WARNING, "All capture buffers returned to " - "userspace. Increase num_capture_buffers " - "to prevent device deadlock or dropped " - "packets/frames.\n"); - } - - /* if we are draining and there are no more capture buffers queued in the driver we are done */ - if (!V4L2_TYPE_IS_OUTPUT(ctx->type) && ctx_to_m2mctx(ctx)->draining) { - for (i = 0; i < ctx->num_buffers; i++) { - /* capture buffer initialization happens during decode hence - * detection happens at runtime - */ - if (!ctx->buffers) - break; - - if (ctx->buffers[i].status == V4L2BUF_IN_DRIVER) - goto start; + *ppavbuf = NULL; + + if (ctx->flag_last) + return AVERROR(EPIPE); + + if (is_mp) { + buf.length = VIDEO_MAX_PLANES; + buf.m.planes = planes; + } + + while (ioctl(m->fd, VIDIOC_DQBUF, &buf) != 0) { + const int err = errno; + av_assert0(AVERROR(err) < 0); + if (err != EINTR) { + av_log(avctx, AV_LOG_DEBUG, "%s VIDIOC_DQBUF, errno (%s)\n", + ctx->name, av_err2str(AVERROR(err))); + + if (err == EPIPE) + ctx->flag_last = 1; + + return AVERROR(err); } - ctx->done = 1; - return NULL; } + atomic_fetch_sub(&ctx->q_count, 1); + + avbuf = (V4L2Buffer *)ctx->bufrefs[buf.index]->data; + ff_v4l2_buffer_set_avail(avbuf); + avbuf->buf = buf; + if (is_mp) { + memcpy(avbuf->planes, planes, sizeof(planes)); + avbuf->buf.m.planes = avbuf->planes; + } + // Done with any attached buffer + av_buffer_unref(&avbuf->ref_buf); -start: - if (V4L2_TYPE_IS_OUTPUT(ctx->type)) - pfd.events = POLLOUT | POLLWRNORM; - else { - /* no need to listen to requests for more input while draining */ - if (ctx_to_m2mctx(ctx)->draining) - pfd.events = POLLIN | POLLRDNORM | POLLPRI; + if (V4L2_TYPE_IS_CAPTURE(ctx->type)) { + // Zero length cap buffer return == EOS + if ((is_mp ? buf.m.planes[0].bytesused : buf.bytesused) == 0) { + av_log(avctx, AV_LOG_DEBUG, "Buffer empty - reQ\n"); + + // Must reQ so we don't leak + // May not matter if the next thing we do is release all the + // buffers but better to be tidy. + ff_v4l2_buffer_enqueue(avbuf); + + ctx->flag_last = 1; + return AVERROR(EPIPE); + } + +#ifdef V4L2_BUF_FLAG_LAST + // If flag_last set then this contains data but is the last frame + // so remember that but return OK + if ((buf.flags & V4L2_BUF_FLAG_LAST) != 0) + ctx->flag_last = 1; +#endif } - for (;;) { - ret = poll(&pfd, 1, timeout); - if (ret > 0) - break; - if (errno == EINTR) + *ppavbuf = avbuf; + return 0; +} + +/** + * handle resolution change event and end of stream event + * Expects to be called after the stream has stopped + * + * returns 1 if reinit was successful, negative if it failed + * returns 0 if reinit was not executed + */ +static int +get_event(V4L2m2mContext * const m) +{ + AVCodecContext * const avctx = m->avctx; + struct v4l2_event evt = { 0 }; + + while (ioctl(m->fd, VIDIOC_DQEVENT, &evt) != 0) { + const int rv = AVERROR(errno); + if (rv == AVERROR(EINTR)) continue; - return NULL; + if (rv == AVERROR(EAGAIN)) { + av_log(avctx, AV_LOG_WARNING, "V4L2 failed to get expected event - assume EOS\n"); + return AVERROR_EOF; + } + av_log(avctx, AV_LOG_ERROR, "V4L2 VIDIOC_DQEVENT: %s\n", av_err2str(rv)); + return rv; } - /* 0. handle errors */ - if (pfd.revents & POLLERR) { - /* if we are trying to get free buffers but none have been queued yet - no need to raise a warning */ - if (timeout == 0) { - for (i = 0; i < ctx->num_buffers; i++) { - if (ctx->buffers[i].status != V4L2BUF_AVAILABLE) - av_log(logger(ctx), AV_LOG_WARNING, "%s POLLERR\n", ctx->name); - } - } - else - av_log(logger(ctx), AV_LOG_WARNING, "%s POLLERR\n", ctx->name); + av_log(avctx, AV_LOG_DEBUG, "Dq event %d\n", evt.type); - return NULL; + if (evt.type == V4L2_EVENT_EOS) { + av_log(avctx, AV_LOG_TRACE, "V4L2 VIDIOC_EVENT_EOS\n"); + return AVERROR_EOF; } - /* 1. handle resolution changes */ - if (pfd.revents & POLLPRI) { - ret = v4l2_handle_event(ctx); - if (ret < 0) { - /* if re-init failed, abort */ - ctx->done = 1; - return NULL; - } - if (ret) { - /* if re-init was successful drop the buffer (if there was one) - * since we had to reconfigure capture (unmap all buffers) - */ - return NULL; + if (evt.type == V4L2_EVENT_SOURCE_CHANGE) + return do_source_change(m); + + return 0; +} + +static inline int +dq_ok(const V4L2Context * const c) +{ + return c->streamon && atomic_load(&c->q_count) != 0; +} + +// Get a buffer +// If output then just gets the buffer in the expected way +// If capture then runs the capture state m/c to deal with res change etc. +// If return value == 0 then *ppavbuf != NULL + +static int +get_qbuf(V4L2Context * const ctx, V4L2Buffer ** const ppavbuf, const int timeout) +{ + V4L2m2mContext * const m = ctx_to_m2mctx(ctx); + AVCodecContext * const avctx = m->avctx; + const int is_cap = V4L2_TYPE_IS_CAPTURE(ctx->type); + + const unsigned int poll_cap = (POLLIN | POLLRDNORM); + const unsigned int poll_out = (POLLOUT | POLLWRNORM); + const unsigned int poll_event = POLLPRI; + + *ppavbuf = NULL; + + for (;;) { + struct pollfd pfd = { + .fd = m->fd, + // If capture && stream not started then assume we are waiting for the initial event + .events = !is_cap ? poll_out : + !ff_v4l2_ctx_eos(ctx) && ctx->streamon ? poll_cap : + poll_event, + }; + int ret; + + if (ctx->done) { + av_log(avctx, AV_LOG_TRACE, "V4L2 %s already done\n", ctx->name); + return AVERROR_EOF; } - } - /* 2. dequeue the buffer */ - if (pfd.revents & (POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM)) { + // If capture && timeout == -1 then also wait for rx buffer free + if (is_cap && timeout == -1 && dq_ok(&m->output) && !m->draining) + pfd.events |= poll_out; - if (!V4L2_TYPE_IS_OUTPUT(ctx->type)) { - /* there is a capture buffer ready */ - if (pfd.revents & (POLLIN | POLLRDNORM)) - goto dequeue; + // If nothing Qed all we will get is POLLERR - avoid that + if ((pfd.events == poll_out && !dq_ok(&m->output)) || + (pfd.events == poll_cap && !dq_ok(&m->capture)) || + (pfd.events == (poll_cap | poll_out) && !dq_ok(&m->capture) && !dq_ok(&m->output))) { + av_log(avctx, AV_LOG_TRACE, "V4L2 poll %s empty\n", ctx->name); + return AVERROR(ENOSPC); + } - /* the driver is ready to accept more input; instead of waiting for the capture - * buffer to complete we return NULL so input can proceed (we are single threaded) - */ - if (pfd.revents & (POLLOUT | POLLWRNORM)) - return NULL; + // Timeout kludged s.t. "forever" eventually gives up & produces logging + // If waiting for an event when we have seen a last_frame then we expect + // it to be ready already so force a short timeout + ret = poll(&pfd, 1, + ff_v4l2_ctx_eos(ctx) ? 10 : + timeout == -1 ? 3000 : timeout); + if (ret < 0) { + ret = AVERROR(errno); // Remember errno before logging etc. + av_assert0(ret < 0); } -dequeue: - memset(&buf, 0, sizeof(buf)); - buf.memory = V4L2_MEMORY_MMAP; - buf.type = ctx->type; - if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { - memset(planes, 0, sizeof(planes)); - buf.length = VIDEO_MAX_PLANES; - buf.m.planes = planes; + av_log(avctx, AV_LOG_TRACE, "V4L2 poll %s ret=%d, timeout=%d, events=%#x, revents=%#x\n", + ctx->name, ret, timeout, pfd.events, pfd.revents); + + if (ret < 0) { + if (ret == AVERROR(EINTR)) + continue; + av_log(avctx, AV_LOG_ERROR, "V4L2 %s poll error %d (%s)\n", ctx->name, AVUNERROR(ret), av_err2str(ret)); + return ret; } - ret = ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_DQBUF, &buf); - if (ret) { - if (errno != EAGAIN) { - ctx->done = 1; - if (errno != EPIPE) - av_log(logger(ctx), AV_LOG_DEBUG, "%s VIDIOC_DQBUF, errno (%s)\n", - ctx->name, av_err2str(AVERROR(errno))); + if (ret == 0) { + if (timeout == -1) + av_log(avctx, AV_LOG_ERROR, "V4L2 %s poll unexpected timeout: events=%#x\n", ctx->name, pfd.events); + if (ff_v4l2_ctx_eos(ctx)) { + av_log(avctx, AV_LOG_WARNING, "V4L2 %s poll event timeout\n", ctx->name); + ret = get_event(m); + if (ret < 0) { + ctx->done = 1; + return ret; + } } - return NULL; + return AVERROR(EAGAIN); } - if (ctx_to_m2mctx(ctx)->draining && !V4L2_TYPE_IS_OUTPUT(ctx->type)) { - int bytesused = V4L2_TYPE_IS_MULTIPLANAR(buf.type) ? - buf.m.planes[0].bytesused : buf.bytesused; - if (bytesused == 0) { + if ((pfd.revents & POLLERR) != 0) { + av_log(avctx, AV_LOG_WARNING, "V4L2 %s POLLERR\n", ctx->name); + return AVERROR_UNKNOWN; + } + + if ((pfd.revents & poll_event) != 0) { + ret = get_event(m); + if (ret < 0) { ctx->done = 1; - return NULL; + return ret; } -#ifdef V4L2_BUF_FLAG_LAST - if (buf.flags & V4L2_BUF_FLAG_LAST) - ctx->done = 1; -#endif + continue; } - avbuf = &ctx->buffers[buf.index]; - avbuf->status = V4L2BUF_AVAILABLE; - avbuf->buf = buf; - if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { - memcpy(avbuf->planes, planes, sizeof(planes)); - avbuf->buf.m.planes = avbuf->planes; + if ((pfd.revents & poll_cap) != 0) { + ret = dq_buf(ctx, ppavbuf); + if (ret == AVERROR(EPIPE)) + continue; + return ret; } - return avbuf; + + if ((pfd.revents & poll_out) != 0) { + if (is_cap) + return AVERROR(EAGAIN); + return dq_buf(ctx, ppavbuf); + } + + av_log(avctx, AV_LOG_ERROR, "V4L2 poll unexpected events=%#x, revents=%#x\n", pfd.events, pfd.revents); + return AVERROR_UNKNOWN; } +} - return NULL; +// Clear out flags and timestamps that should should be set by the user +// Returns the passed avbuf +static V4L2Buffer * +clean_v4l2_buffer(V4L2Buffer * const avbuf) +{ + struct v4l2_buffer *const buf = &avbuf->buf; + + buf->flags = 0; + buf->field = V4L2_FIELD_ANY; + buf->timestamp = (struct timeval){0}; + buf->timecode = (struct v4l2_timecode){0}; + buf->sequence = 0; + + return avbuf; +} + +int +ff_v4l2_dq_all(V4L2Context *const ctx, int timeout1) +{ + V4L2Buffer * avbuf; + if (timeout1 != 0) { + int rv = get_qbuf(ctx, &avbuf, timeout1); + if (rv != 0) + return rv; + } + do { + get_qbuf(ctx, &avbuf, 0); + } while (avbuf); + return 0; } static V4L2Buffer* v4l2_getfree_v4l2buf(V4L2Context *ctx) { - int timeout = 0; /* return when no more buffers to dequeue */ int i; /* get back as many output buffers as possible */ - if (V4L2_TYPE_IS_OUTPUT(ctx->type)) { - do { - } while (v4l2_dequeue_v4l2buf(ctx, timeout)); - } + if (V4L2_TYPE_IS_OUTPUT(ctx->type)) + ff_v4l2_dq_all(ctx, 0); for (i = 0; i < ctx->num_buffers; i++) { - if (ctx->buffers[i].status == V4L2BUF_AVAILABLE) - return &ctx->buffers[i]; + V4L2Buffer * const avbuf = (V4L2Buffer *)ctx->bufrefs[i]->data; + if (avbuf->status == V4L2BUF_AVAILABLE) + return clean_v4l2_buffer(avbuf); } return NULL; @@ -452,25 +746,45 @@ static V4L2Buffer* v4l2_getfree_v4l2buf(V4L2Context *ctx) static int v4l2_release_buffers(V4L2Context* ctx) { - struct v4l2_requestbuffers req = { - .memory = V4L2_MEMORY_MMAP, - .type = ctx->type, - .count = 0, /* 0 -> unmaps buffers from the driver */ - }; - int i, j; + int i; + int ret = 0; + const int fd = ctx_to_m2mctx(ctx)->fd; - for (i = 0; i < ctx->num_buffers; i++) { - V4L2Buffer *buffer = &ctx->buffers[i]; + // Orphan any buffers in the wild + ff_weak_link_break(&ctx->wl_master); + + if (ctx->bufrefs) { + for (i = 0; i < ctx->num_buffers; i++) + av_buffer_unref(ctx->bufrefs + i); + } + + if (fd != -1) { + struct v4l2_requestbuffers req = { + .memory = V4L2_MEMORY_MMAP, + .type = ctx->type, + .count = 0, /* 0 -> unmap all buffers from the driver */ + }; - for (j = 0; j < buffer->num_planes; j++) { - struct V4L2Plane_info *p = &buffer->plane_info[j]; - if (p->mm_addr && p->length) - if (munmap(p->mm_addr, p->length) < 0) - av_log(logger(ctx), AV_LOG_ERROR, "%s unmap plane (%s))\n", ctx->name, av_err2str(AVERROR(errno))); + while ((ret = ioctl(fd, VIDIOC_REQBUFS, &req)) == -1) { + if (errno == EINTR) + continue; + + ret = AVERROR(errno); + + av_log(logger(ctx), AV_LOG_ERROR, "release all %s buffers (%s)\n", + ctx->name, av_err2str(AVERROR(errno))); + + if (ctx_to_m2mctx(ctx)->output_drm) + av_log(logger(ctx), AV_LOG_ERROR, + "Make sure the DRM client releases all FB/GEM objects before closing the codec (ie):\n" + "for all buffers: \n" + " 1. drmModeRmFB(..)\n" + " 2. drmIoctl(.., DRM_IOCTL_GEM_CLOSE,... )\n"); } } + atomic_store(&ctx->q_count, 0); - return ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_REQBUFS, &req); + return ret; } static inline int v4l2_try_raw_format(V4L2Context* ctx, enum AVPixelFormat pixfmt) @@ -499,6 +813,8 @@ static inline int v4l2_try_raw_format(V4L2Context* ctx, enum AVPixelFormat pixfm static int v4l2_get_raw_format(V4L2Context* ctx, enum AVPixelFormat *p) { + V4L2m2mContext* s = ctx_to_m2mctx(ctx); + V4L2m2mPriv *priv = s->avctx->priv_data; enum AVPixelFormat pixfmt = ctx->av_pix_fmt; struct v4l2_fmtdesc fdesc; int ret; @@ -512,21 +828,22 @@ static int v4l2_get_raw_format(V4L2Context* ctx, enum AVPixelFormat *p) return 0; } - for (;;) { + for (;; ++fdesc.index) { ret = ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_ENUM_FMT, &fdesc); if (ret) return AVERROR(EINVAL); + if (priv->pix_fmt != AV_PIX_FMT_NONE) { + if (fdesc.pixelformat != ff_v4l2_format_avfmt_to_v4l2(priv->pix_fmt)) + continue; + } + pixfmt = ff_v4l2_format_v4l2_to_avfmt(fdesc.pixelformat, AV_CODEC_ID_RAWVIDEO); ret = v4l2_try_raw_format(ctx, pixfmt); - if (ret){ - fdesc.index++; - continue; + if (ret == 0) { + *p = pixfmt; + return 0; } - - *p = pixfmt; - - return 0; } return AVERROR(EINVAL); @@ -569,30 +886,99 @@ static int v4l2_get_coded_format(V4L2Context* ctx, uint32_t *p) * *****************************************************************************/ + +static void flush_all_buffers_status(V4L2Context* const ctx) +{ + int i; + + if (!ctx->bufrefs) + return; + + for (i = 0; i < ctx->num_buffers; ++i) { + struct V4L2Buffer * const buf = (struct V4L2Buffer *)ctx->bufrefs[i]->data; + if (buf->status == V4L2BUF_IN_DRIVER) + ff_v4l2_buffer_set_avail(buf); + } + atomic_store(&ctx->q_count, 0); +} + +static int stuff_all_buffers(AVCodecContext * avctx, V4L2Context* ctx) +{ + int i; + int rv; + + if (!ctx->bufrefs) { + rv = ff_v4l2_context_init(ctx); + if (rv) { + av_log(avctx, AV_LOG_ERROR, "can't request capture buffers\n"); + return rv; + } + } + + for (i = 0; i < ctx->num_buffers; ++i) { + struct V4L2Buffer * const buf = (struct V4L2Buffer *)ctx->bufrefs[i]->data; + if (buf->status == V4L2BUF_AVAILABLE) { + rv = ff_v4l2_buffer_enqueue(buf); + if (rv < 0) + return rv; + } + } + return 0; +} + int ff_v4l2_context_set_status(V4L2Context* ctx, uint32_t cmd) { int type = ctx->type; - int ret; + int ret = 0; + AVCodecContext * const avctx = logger(ctx); - ret = ioctl(ctx_to_m2mctx(ctx)->fd, cmd, &type); - if (ret < 0) - return AVERROR(errno); + // Avoid doing anything if there is nothing we can do + if (cmd == VIDIOC_STREAMOFF && !ctx_buffers_alloced(ctx) && !ctx->streamon) + return 0; - ctx->streamon = (cmd == VIDIOC_STREAMON); + ff_mutex_lock(&ctx->lock); - return 0; + if (cmd == VIDIOC_STREAMON && !V4L2_TYPE_IS_OUTPUT(ctx->type)) + stuff_all_buffers(avctx, ctx); + + if (ioctl(ctx_to_m2mctx(ctx)->fd, cmd, &type) < 0) { + const int err = errno; + av_log(avctx, AV_LOG_ERROR, "%s set status %d (%s) failed: err=%d\n", ctx->name, + cmd, (cmd == VIDIOC_STREAMON) ? "ON" : "OFF", err); + ret = AVERROR(err); + } + else + { + if (cmd == VIDIOC_STREAMOFF) + flush_all_buffers_status(ctx); + else + ctx->first_buf = 1; + + ctx->streamon = (cmd == VIDIOC_STREAMON); + av_log(avctx, AV_LOG_DEBUG, "%s set status %d (%s) OK\n", ctx->name, + cmd, (cmd == VIDIOC_STREAMON) ? "ON" : "OFF"); + } + + // Both stream off & on effectively clear flag_last + ctx->flag_last = 0; + + ff_mutex_unlock(&ctx->lock); + + return ret; } int ff_v4l2_context_enqueue_frame(V4L2Context* ctx, const AVFrame* frame) { - V4L2m2mContext *s = ctx_to_m2mctx(ctx); + V4L2m2mContext *const s = ctx_to_m2mctx(ctx); + AVCodecContext *const avctx = s->avctx; + int64_t track_ts; V4L2Buffer* avbuf; int ret; if (!frame) { ret = v4l2_stop_encode(ctx); if (ret) - av_log(logger(ctx), AV_LOG_ERROR, "%s stop_encode\n", ctx->name); + av_log(avctx, AV_LOG_ERROR, "%s stop_encode\n", ctx->name); s->draining= 1; return 0; } @@ -601,23 +987,29 @@ int ff_v4l2_context_enqueue_frame(V4L2Context* ctx, const AVFrame* frame) if (!avbuf) return AVERROR(EAGAIN); - ret = ff_v4l2_buffer_avframe_to_buf(frame, avbuf); + track_ts = xlat_pts_frame_in(avctx, &s->xlat, frame); + + ret = ff_v4l2_buffer_avframe_to_buf(frame, avbuf, track_ts); if (ret) return ret; return ff_v4l2_buffer_enqueue(avbuf); } -int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt) +int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt, + const void * extdata, size_t extlen) { V4L2m2mContext *s = ctx_to_m2mctx(ctx); + AVCodecContext *const avctx = s->avctx; V4L2Buffer* avbuf; int ret; + int64_t track_ts; if (!pkt->size) { ret = v4l2_stop_decode(ctx); + // Log but otherwise ignore stop failure if (ret) - av_log(logger(ctx), AV_LOG_ERROR, "%s stop_decode\n", ctx->name); + av_log(avctx, AV_LOG_ERROR, "%s stop_decode failed: err=%d\n", ctx->name, ret); s->draining = 1; return 0; } @@ -626,8 +1018,13 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt) if (!avbuf) return AVERROR(EAGAIN); - ret = ff_v4l2_buffer_avpkt_to_buf(pkt, avbuf); - if (ret) + track_ts = xlat_pts_pkt_in(avctx, &s->xlat, pkt); + + ret = ff_v4l2_buffer_avpkt_to_buf_ext(pkt, avbuf, extdata, extlen, track_ts); + if (ret == AVERROR(ENOMEM)) + av_log(logger(ctx), AV_LOG_ERROR, "Buffer overflow in %s: pkt->size=%d > buf->length=%d\n", + __func__, pkt->size, avbuf->planes[0].length); + else if (ret) return ret; return ff_v4l2_buffer_enqueue(avbuf); @@ -635,42 +1032,77 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt) int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame, int timeout) { + V4L2m2mContext *s = ctx_to_m2mctx(ctx); + AVCodecContext *const avctx = s->avctx; V4L2Buffer *avbuf; + int rv; - /* - * timeout=-1 blocks until: - * 1. decoded frame available - * 2. an input buffer is ready to be dequeued - */ - avbuf = v4l2_dequeue_v4l2buf(ctx, timeout); - if (!avbuf) { - if (ctx->done) - return AVERROR_EOF; + do { + if ((rv = get_qbuf(ctx, &avbuf, timeout)) != 0) + return rv; + if ((rv = ff_v4l2_buffer_buf_to_avframe(frame, avbuf)) != 0) + return rv; + } while (xlat_pts_frame_out(avctx, &s->xlat, frame) != 0); - return AVERROR(EAGAIN); - } - - return ff_v4l2_buffer_buf_to_avframe(frame, avbuf); + return 0; } -int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt) +int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt, int timeout) { + V4L2m2mContext *s = ctx_to_m2mctx(ctx); + AVCodecContext *const avctx = s->avctx; V4L2Buffer *avbuf; + int rv; - /* - * blocks until: - * 1. encoded packet available - * 2. an input buffer ready to be dequeued - */ - avbuf = v4l2_dequeue_v4l2buf(ctx, -1); - if (!avbuf) { - if (ctx->done) - return AVERROR_EOF; + do { + if ((rv = get_qbuf(ctx, &avbuf, timeout)) != 0) + return rv == AVERROR(ENOSPC) ? AVERROR(EAGAIN) : rv; // Caller not currently expecting ENOSPC + if ((rv = ff_v4l2_buffer_buf_to_avpkt(pkt, avbuf)) != 0) + return rv; + } while (xlat_pts_pkt_out(avctx, &s->xlat, pkt) != 0); - return AVERROR(EAGAIN); + return 0; +} + +// Return 0 terminated list of drm fourcc video formats for this context +// NULL if none found or error +// Returned list is malloced so must be freed +uint32_t * ff_v4l2_context_enum_drm_formats(V4L2Context *ctx, unsigned int *pN) +{ + unsigned int i; + unsigned int n = 0; + unsigned int size = 0; + uint32_t * e = NULL; + *pN = 0; + + for (i = 0; i < 1024; ++i) { + struct v4l2_fmtdesc fdesc = { + .index = i, + .type = ctx->type + }; + + if (ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_ENUM_FMT, &fdesc)) + return e; + + if (n + 1 >= size) { + unsigned int newsize = (size == 0) ? 16 : size * 2; + uint32_t * t = av_realloc(e, newsize * sizeof(*t)); + if (!t) + return e; + e = t; + size = newsize; + } + + e[n] = fdesc.pixelformat; + e[++n] = 0; + if (pN) + *pN = n; } - return ff_v4l2_buffer_buf_to_avpkt(pkt, avbuf); + // If we've looped 1024 times we are clearly confused + *pN = 0; + av_free(e); + return NULL; } int ff_v4l2_context_get_format(V4L2Context* ctx, int probe) @@ -702,78 +1134,179 @@ int ff_v4l2_context_get_format(V4L2Context* ctx, int probe) int ff_v4l2_context_set_format(V4L2Context* ctx) { - return ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_S_FMT, &ctx->format); + int ret; + + ret = ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_S_FMT, &ctx->format); + if (ret != 0) + return ret; + + // Check returned size against min size and if smaller have another go + // Only worry about plane[0] as this is meant to enforce limits for + // encoded streams where we might know a bit more about the shape + // than the driver + if (V4L2_TYPE_IS_MULTIPLANAR(ctx->format.type)) { + if (ctx->min_buf_size <= ctx->format.fmt.pix_mp.plane_fmt[0].sizeimage) + return 0; + ctx->format.fmt.pix_mp.plane_fmt[0].sizeimage = ctx->min_buf_size; + } + else { + if (ctx->min_buf_size <= ctx->format.fmt.pix.sizeimage) + return 0; + ctx->format.fmt.pix.sizeimage = ctx->min_buf_size; + } + + ret = ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_S_FMT, &ctx->format); + return ret; } void ff_v4l2_context_release(V4L2Context* ctx) { int ret; - if (!ctx->buffers) + if (!ctx->bufrefs) return; ret = v4l2_release_buffers(ctx); if (ret) av_log(logger(ctx), AV_LOG_WARNING, "V4L2 failed to unmap the %s buffers\n", ctx->name); - av_freep(&ctx->buffers); + av_freep(&ctx->bufrefs); + av_buffer_unref(&ctx->frames_ref); + + ff_mutex_destroy(&ctx->lock); + pthread_cond_destroy(&ctx->cond); } -int ff_v4l2_context_init(V4L2Context* ctx) + +static int create_buffers(V4L2Context* const ctx, const unsigned int req_buffers, const enum v4l2_memory mem) { - V4L2m2mContext *s = ctx_to_m2mctx(ctx); + V4L2m2mContext * const s = ctx_to_m2mctx(ctx); struct v4l2_requestbuffers req; - int ret, i; - - if (!v4l2_type_supported(ctx)) { - av_log(logger(ctx), AV_LOG_ERROR, "type %i not supported\n", ctx->type); - return AVERROR_PATCHWELCOME; - } + int ret; + int i; - ret = ioctl(s->fd, VIDIOC_G_FMT, &ctx->format); - if (ret) - av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_G_FMT failed\n", ctx->name); + av_assert0(ctx->bufrefs == NULL); memset(&req, 0, sizeof(req)); - req.count = ctx->num_buffers; - req.memory = V4L2_MEMORY_MMAP; + req.count = req_buffers; + req.memory = mem; req.type = ctx->type; - ret = ioctl(s->fd, VIDIOC_REQBUFS, &req); - if (ret < 0) { - av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_REQBUFS failed: %s\n", ctx->name, strerror(errno)); - return AVERROR(errno); + while ((ret = ioctl(s->fd, VIDIOC_REQBUFS, &req)) == -1) { + if (errno != EINTR) { + ret = AVERROR(errno); + av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_REQBUFS failed: %s\n", ctx->name, av_err2str(ret)); + return ret; + } } ctx->num_buffers = req.count; - ctx->buffers = av_mallocz(ctx->num_buffers * sizeof(V4L2Buffer)); - if (!ctx->buffers) { + ctx->bufrefs = av_mallocz(ctx->num_buffers * sizeof(*ctx->bufrefs)); + if (!ctx->bufrefs) { av_log(logger(ctx), AV_LOG_ERROR, "%s malloc enomem\n", ctx->name); - return AVERROR(ENOMEM); + goto fail_release; } - for (i = 0; i < req.count; i++) { - ctx->buffers[i].context = ctx; - ret = ff_v4l2_buffer_initialize(&ctx->buffers[i], i); - if (ret < 0) { + ctx->wl_master = ff_weak_link_new(ctx); + if (!ctx->wl_master) { + ret = AVERROR(ENOMEM); + goto fail_release; + } + + for (i = 0; i < ctx->num_buffers; i++) { + ret = ff_v4l2_buffer_initialize(&ctx->bufrefs[i], i, ctx, mem); + if (ret) { av_log(logger(ctx), AV_LOG_ERROR, "%s buffer[%d] initialization (%s)\n", ctx->name, i, av_err2str(ret)); - goto error; + goto fail_release; } } av_log(logger(ctx), AV_LOG_DEBUG, "%s: %s %02d buffers initialized: %04ux%04u, sizeimage %08u, bytesperline %08u\n", ctx->name, V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? av_fourcc2str(ctx->format.fmt.pix_mp.pixelformat) : av_fourcc2str(ctx->format.fmt.pix.pixelformat), req.count, - v4l2_get_width(&ctx->format), - v4l2_get_height(&ctx->format), + ff_v4l2_get_format_width(&ctx->format), + ff_v4l2_get_format_height(&ctx->format), V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? ctx->format.fmt.pix_mp.plane_fmt[0].sizeimage : ctx->format.fmt.pix.sizeimage, V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? ctx->format.fmt.pix_mp.plane_fmt[0].bytesperline : ctx->format.fmt.pix.bytesperline); return 0; -error: +fail_release: v4l2_release_buffers(ctx); + av_freep(&ctx->bufrefs); + return ret; +} + +int ff_v4l2_context_init(V4L2Context* ctx) +{ + struct v4l2_queryctrl qctrl; + V4L2m2mContext * const s = ctx_to_m2mctx(ctx); + int ret; + + // It is not valid to reinit a context without a previous release + av_assert0(ctx->bufrefs == NULL); + + if (!v4l2_type_supported(ctx)) { + av_log(logger(ctx), AV_LOG_ERROR, "type %i not supported\n", ctx->type); + return AVERROR_PATCHWELCOME; + } - av_freep(&ctx->buffers); + ff_mutex_init(&ctx->lock, NULL); + pthread_cond_init(&ctx->cond, NULL); + atomic_init(&ctx->q_count, 0); + + if (s->output_drm) { + AVHWFramesContext *hwframes; + + ctx->frames_ref = av_hwframe_ctx_alloc(s->device_ref); + if (!ctx->frames_ref) { + ret = AVERROR(ENOMEM); + goto fail_unlock; + } + + hwframes = (AVHWFramesContext*)ctx->frames_ref->data; + hwframes->format = AV_PIX_FMT_DRM_PRIME; + hwframes->sw_format = ctx->av_pix_fmt; + hwframes->width = ctx->width != 0 ? ctx->width : s->avctx->width; + hwframes->height = ctx->height != 0 ? ctx->height : s->avctx->height; + ret = av_hwframe_ctx_init(ctx->frames_ref); + if (ret < 0) + goto fail_unref_hwframes; + } + + ret = ioctl(s->fd, VIDIOC_G_FMT, &ctx->format); + if (ret) { + ret = AVERROR(errno); + av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_G_FMT failed: %s\n", ctx->name, av_err2str(ret)); + goto fail_unref_hwframes; + } + + memset(&qctrl, 0, sizeof(qctrl)); + qctrl.id = V4L2_CID_MIN_BUFFERS_FOR_OUTPUT; + if (ioctl(s->fd, VIDIOC_QUERYCTRL, &qctrl) != 0) { + ret = AVERROR(errno); + if (ret != AVERROR(EINVAL)) { + av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_QUERCTRL failed: %s\n", ctx->name, av_err2str(ret)); + goto fail_unref_hwframes; + } + // Control unsupported - set default if wanted + if (ctx->num_buffers < 2) + ctx->num_buffers = 4; + } + else { + if (ctx->num_buffers < 2) + ctx->num_buffers = qctrl.minimum + 2; + ctx->num_buffers = av_clip(ctx->num_buffers, qctrl.minimum, qctrl.maximum); + } + + ret = create_buffers(ctx, ctx->num_buffers, ctx->buf_mem); + if (ret < 0) + goto fail_unref_hwframes; + + return 0; +fail_unref_hwframes: + av_buffer_unref(&ctx->frames_ref); +fail_unlock: + ff_mutex_destroy(&ctx->lock); return ret; } diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h index 22a9532444..0c8c020be1 100644 --- a/libavcodec/v4l2_context.h +++ b/libavcodec/v4l2_context.h @@ -31,6 +31,7 @@ #include "libavutil/pixfmt.h" #include "libavutil/frame.h" #include "libavutil/buffer.h" +#include "libavutil/thread.h" #include "v4l2_buffers.h" typedef struct V4L2Context { @@ -70,28 +71,57 @@ typedef struct V4L2Context { */ int width, height; AVRational sample_aspect_ratio; + struct v4l2_rect selection; /** - * Indexed array of V4L2Buffers + * If the default size of buffer is less than this then try to + * set to this. */ - V4L2Buffer *buffers; + uint32_t min_buf_size; + + /** + * Indexed array of pointers to V4L2Buffers + */ + AVBufferRef **bufrefs; /** * Readonly after init. */ int num_buffers; + /** + * Buffer memory type V4L2_MEMORY_MMAP or V4L2_MEMORY_DMABUF + */ + enum v4l2_memory buf_mem; + /** * Whether the stream has been started (VIDIOC_STREAMON has been sent). */ int streamon; + /* 1st buffer after stream on */ + int first_buf; + /** * Either no more buffers available or an unrecoverable error was notified * by the V4L2 kernel driver: once set the context has to be exited. */ int done; + int flag_last; + + /** + * If NZ then when Qing frame/pkt use this rather than the + * "real" PTS + */ + uint64_t track_ts; + + AVBufferRef *frames_ref; + atomic_int q_count; + struct ff_weak_link_master *wl_master; + + AVMutex lock; + pthread_cond_t cond; } V4L2Context; /** @@ -119,6 +149,19 @@ int ff_v4l2_context_set_format(V4L2Context* ctx); */ int ff_v4l2_context_get_format(V4L2Context* ctx, int probe); +/** + * Get the list of drm fourcc pixel formats for this context + * + * @param[in] ctx A pointer to a V4L2Context. See V4L2Context + * description for required variables. + * @param[in] pN A pointer to receive the number of formats + * found. May be NULL if not wanted. + * @return Pointer to malloced list of zero terminated formats, + * NULL if none or error. As list is malloced it must be + * freed. + */ +uint32_t * ff_v4l2_context_enum_drm_formats(V4L2Context *ctx, unsigned int *pN); + /** * Releases a V4L2Context. * @@ -147,7 +190,7 @@ int ff_v4l2_context_set_status(V4L2Context* ctx, uint32_t cmd); * @param[inout] pkt The AVPacket to dequeue to. * @return 0 in case of success, AVERROR(EAGAIN) if no buffer was ready, another negative error in case of error. */ -int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt); +int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt, int timeout); /** * Dequeues a buffer from a V4L2Context to an AVFrame. @@ -156,7 +199,10 @@ int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt); * @param[in] ctx The V4L2Context to dequeue from. * @param[inout] f The AVFrame to dequeue to. * @param[in] timeout The timeout for dequeue (-1 to block, 0 to return immediately, or milliseconds) + * * @return 0 in case of success, AVERROR(EAGAIN) if no buffer was ready, another negative error in case of error. + * AVERROR(ENOSPC) if no buffer availible to put + * the frame in */ int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* f, int timeout); @@ -170,7 +216,7 @@ int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* f, int timeout); * @param[in] pkt A pointer to an AVPacket. * @return 0 in case of success, a negative error otherwise. */ -int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt); +int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt, const void * ext_data, size_t ext_size); /** * Enqueues a buffer to a V4L2Context from an AVFrame @@ -183,4 +229,28 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt); */ int ff_v4l2_context_enqueue_frame(V4L2Context* ctx, const AVFrame* f); +/** + * Dequeue all buffers on this queue + * + * Used to recycle output buffers + * + * @param[in] ctx The V4L2Context to dequeue from. + * @param[in] timeout1 A timeout on dequeuing the 1st buffer, + * all others have a timeout of zero + * @return AVERROR(EAGAIN) if timeout1 non-zero then the return + * of the first dequeue operation, 0 otherwise. + */ +int ff_v4l2_dq_all(V4L2Context *const ctx, int timeout1); + +/** + * Returns the number of buffers currently queued + * + * @param[in] ctx The V4L2Context to evaluate + */ +static inline int +ff_v4l2_context_q_count(const V4L2Context* const ctx) +{ + return atomic_load(&ctx->q_count); +} + #endif // AVCODEC_V4L2_CONTEXT_H diff --git a/libavcodec/v4l2_m2m.c b/libavcodec/v4l2_m2m.c index cdfd579810..143656e792 100644 --- a/libavcodec/v4l2_m2m.c +++ b/libavcodec/v4l2_m2m.c @@ -35,6 +35,15 @@ #include "v4l2_context.h" #include "v4l2_fmt.h" #include "v4l2_m2m.h" +#include "v4l2_req_dmabufs.h" + +static void +xlat_init(xlat_track_t * const x) +{ + memset(x, 0, sizeof(*x)); + x->last_pts = AV_NOPTS_VALUE; +} + static inline int v4l2_splane_video(struct v4l2_capability *cap) { @@ -68,7 +77,9 @@ static int v4l2_prepare_contexts(V4L2m2mContext *s, int probe) s->capture.done = s->output.done = 0; s->capture.name = "capture"; + s->capture.buf_mem = s->db_ctl != NULL ? V4L2_MEMORY_DMABUF : V4L2_MEMORY_MMAP; s->output.name = "output"; + s->output.buf_mem = s->input_drm ? V4L2_MEMORY_DMABUF : V4L2_MEMORY_MMAP; atomic_init(&s->refcount, 0); sem_init(&s->refsync, 0, 0); @@ -85,18 +96,58 @@ static int v4l2_prepare_contexts(V4L2m2mContext *s, int probe) if (v4l2_mplane_video(&cap)) { s->capture.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; s->output.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; + s->output.format.type = s->output.type; return 0; } if (v4l2_splane_video(&cap)) { s->capture.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; s->output.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; + s->output.format.type = s->output.type; return 0; } return AVERROR(EINVAL); } +static int check_size(AVCodecContext * const avctx, V4L2m2mContext * const s) +{ + struct v4l2_format fmt = {.type = s->output.type}; + int rv; + uint32_t pixfmt = ff_v4l2_format_avfmt_to_v4l2(avctx->pix_fmt); + unsigned int w; + unsigned int h; + + if (V4L2_TYPE_IS_MULTIPLANAR(fmt.type)) { + fmt.fmt.pix_mp.pixelformat = pixfmt; + fmt.fmt.pix_mp.width = avctx->width; + fmt.fmt.pix_mp.height = avctx->height; + } + else { + fmt.fmt.pix.pixelformat = pixfmt; + fmt.fmt.pix.width = avctx->width; + fmt.fmt.pix.height = avctx->height; + } + + rv = ioctl(s->fd, VIDIOC_TRY_FMT, &fmt); + + if (rv != 0) { + rv = AVERROR(errno); + av_log(avctx, AV_LOG_ERROR, "%s: Tryfmt failed: %s\n", __func__, av_err2str(rv)); + return rv; + } + + w = ff_v4l2_get_format_width(&fmt); + h = ff_v4l2_get_format_height(&fmt); + + if (w < avctx->width || h < avctx->height) { + av_log(avctx, AV_LOG_WARNING, "%s: Size check failed: asked for %dx%d, got: %dx%d\n", __func__, avctx->width, avctx->height, w, h); + return AVERROR(EINVAL); + } + + return 0; +} + static int v4l2_probe_driver(V4L2m2mContext *s) { void *log_ctx = s->avctx; @@ -116,6 +167,11 @@ static int v4l2_probe_driver(V4L2m2mContext *s) goto done; } + // If being given frames (encode) check that V4L2 can cope with the size + if (s->output.av_codec_id == AV_CODEC_ID_RAWVIDEO && + (ret = check_size(s->avctx, s)) != 0) + goto done; + ret = ff_v4l2_context_get_format(&s->capture, 1); if (ret) { av_log(log_ctx, AV_LOG_DEBUG, "v4l2 capture format not supported\n"); @@ -215,13 +271,7 @@ int ff_v4l2_m2m_codec_reinit(V4L2m2mContext *s) av_log(log_ctx, AV_LOG_ERROR, "capture VIDIOC_STREAMOFF\n"); /* 2. unmap the capture buffers (v4l2 and ffmpeg): - * we must wait for all references to be released before being allowed - * to queue new buffers. */ - av_log(log_ctx, AV_LOG_DEBUG, "waiting for user to release AVBufferRefs\n"); - if (atomic_load(&s->refcount)) - while(sem_wait(&s->refsync) == -1 && errno == EINTR); - ff_v4l2_context_release(&s->capture); /* 3. get the new capture format */ @@ -240,7 +290,6 @@ int ff_v4l2_m2m_codec_reinit(V4L2m2mContext *s) /* 5. complete reinit */ s->draining = 0; - s->reinit = 0; return 0; } @@ -274,7 +323,6 @@ int ff_v4l2_m2m_codec_full_reinit(V4L2m2mContext *s) /* start again now that we know the stream dimensions */ s->draining = 0; - s->reinit = 0; ret = ff_v4l2_context_get_format(&s->output, 0); if (ret) { @@ -328,10 +376,14 @@ static void v4l2_m2m_destroy_context(void *opaque, uint8_t *context) ff_v4l2_context_release(&s->capture); sem_destroy(&s->refsync); - close(s->fd); + if (s->fd != -1) + close(s->fd); av_frame_unref(s->frame); av_frame_free(&s->frame); av_packet_unref(&s->buf_pkt); + av_freep(&s->extdata_data); + + av_log(s->avctx, AV_LOG_DEBUG, "V4L2 Context destroyed\n"); av_free(s); } @@ -344,6 +396,11 @@ int ff_v4l2_m2m_codec_end(V4L2m2mPriv *priv) if (!s) return 0; + av_log(s->avctx, AV_LOG_DEBUG, "V4L2 Codec end\n"); + + if (s->avctx && av_codec_is_decoder(s->avctx->codec)) + av_packet_unref(&s->buf_pkt); + if (s->fd >= 0) { ret = ff_v4l2_context_set_status(&s->output, VIDIOC_STREAMOFF); if (ret) @@ -355,8 +412,20 @@ int ff_v4l2_m2m_codec_end(V4L2m2mPriv *priv) } ff_v4l2_context_release(&s->output); + av_buffer_unref(&s->device_ref); + + dmabufs_ctl_unref(&s->db_ctl); + + if (s->fd != -1) { + close(s->fd); + s->fd = -1; + } s->self_ref = NULL; + // This is only called on avctx close so after this point we don't have that + // Crash sooner if we find we are using it (can still log with avctx = NULL) + s->avctx = NULL; + priv->context = NULL; av_buffer_unref(&priv->context_ref); return 0; @@ -400,35 +469,38 @@ int ff_v4l2_m2m_codec_init(V4L2m2mPriv *priv) return v4l2_configure_contexts(s); } -int ff_v4l2_m2m_create_context(V4L2m2mPriv *priv, V4L2m2mContext **s) +int ff_v4l2_m2m_create_context(V4L2m2mPriv *priv, V4L2m2mContext **pps) { - *s = av_mallocz(sizeof(V4L2m2mContext)); - if (!*s) + V4L2m2mContext * const s = av_mallocz(sizeof(V4L2m2mContext)); + + *pps = NULL; + if (!s) return AVERROR(ENOMEM); - priv->context_ref = av_buffer_create((uint8_t *) *s, sizeof(V4L2m2mContext), + priv->context_ref = av_buffer_create((uint8_t *)s, sizeof(*s), &v4l2_m2m_destroy_context, NULL, 0); if (!priv->context_ref) { - av_freep(s); + av_free(s); return AVERROR(ENOMEM); } /* assign the context */ - priv->context = *s; - (*s)->priv = priv; + priv->context = s; + s->priv = priv; /* populate it */ - priv->context->capture.num_buffers = priv->num_capture_buffers; - priv->context->output.num_buffers = priv->num_output_buffers; - priv->context->self_ref = priv->context_ref; - priv->context->fd = -1; + s->capture.num_buffers = priv->num_capture_buffers; + s->output.num_buffers = priv->num_output_buffers; + s->self_ref = priv->context_ref; + s->fd = -1; + xlat_init(&s->xlat); priv->context->frame = av_frame_alloc(); if (!priv->context->frame) { av_buffer_unref(&priv->context_ref); - *s = NULL; /* freed when unreferencing context_ref */ return AVERROR(ENOMEM); } + *pps = s; return 0; } diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h index b67b216331..a506e69d67 100644 --- a/libavcodec/v4l2_m2m.h +++ b/libavcodec/v4l2_m2m.h @@ -30,6 +30,7 @@ #include #include "libavcodec/avcodec.h" +#include "libavutil/pixfmt.h" #include "v4l2_context.h" #define container_of(ptr, type, member) ({ \ @@ -38,7 +39,39 @@ #define V4L_M2M_DEFAULT_OPTS \ { "num_output_buffers", "Number of buffers in the output context",\ - OFFSET(num_output_buffers), AV_OPT_TYPE_INT, { .i64 = 16 }, 6, INT_MAX, FLAGS } + OFFSET(num_output_buffers), AV_OPT_TYPE_INT, { .i64 = 16 }, 2, INT_MAX, FLAGS } + +#define FF_V4L2_M2M_TRACK_SIZE 128 +typedef struct V4L2m2mTrackEl { + int discard; // If we see this buffer its been flushed, so discard + int pending; + int pkt_size; + int64_t pts; + int64_t dts; + int64_t reordered_opaque; + int64_t pkt_pos; + int64_t pkt_duration; + int64_t track_pts; +} V4L2m2mTrackEl; + +typedef struct pts_stats_s +{ + void * logctx; + const char * name; // For debug + unsigned int last_count; + unsigned int last_interval; + int64_t last_pts; + int64_t guess; +} pts_stats_t; + +typedef struct xlat_track_s { + unsigned int track_no; + int64_t last_pts; // Last valid PTS decoded + int64_t last_opaque; + V4L2m2mTrackEl track_els[FF_V4L2_M2M_TRACK_SIZE]; +} xlat_track_t; + +struct dmabufs_ctl; typedef struct V4L2m2mContext { char devname[PATH_MAX]; @@ -52,10 +85,10 @@ typedef struct V4L2m2mContext { AVCodecContext *avctx; sem_t refsync; atomic_uint refcount; - int reinit; /* null frame/packet received */ int draining; + int running; AVPacket buf_pkt; /* Reference to a frame. Only used during encoding */ @@ -66,6 +99,36 @@ typedef struct V4L2m2mContext { /* reference back to V4L2m2mPriv */ void *priv; + + AVBufferRef *device_ref; + + /* generate DRM frames */ + int output_drm; + + /* input frames are drmprime */ + int input_drm; + + /* Frame tracking */ + xlat_track_t xlat; + + pts_stats_t pts_stat; + + /* req pkt */ + int req_pkt; + int reorder_size; + + /* Ext data sent */ + int extdata_sent; + /* Ext data sent in packet - overrides ctx */ + void * extdata_data; + size_t extdata_size; + +#define FF_V4L2_QUIRK_REINIT_ALWAYS 1 +#define FF_V4L2_QUIRK_ENUM_FRAMESIZES_BROKEN 2 + /* Quirks */ + unsigned int quirks; + + struct dmabufs_ctl * db_ctl; } V4L2m2mContext; typedef struct V4L2m2mPriv { @@ -76,6 +139,8 @@ typedef struct V4L2m2mPriv { int num_output_buffers; int num_capture_buffers; + const char * dmabuf_alloc; + enum AVPixelFormat pix_fmt; } V4L2m2mPriv; /** @@ -129,4 +194,26 @@ int ff_v4l2_m2m_codec_reinit(V4L2m2mContext *ctx); */ int ff_v4l2_m2m_codec_full_reinit(V4L2m2mContext *ctx); + +static inline unsigned int ff_v4l2_get_format_width(const struct v4l2_format * const fmt) +{ + return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.width : fmt->fmt.pix.width; +} + +static inline unsigned int ff_v4l2_get_format_height(const struct v4l2_format * const fmt) +{ + return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.height : fmt->fmt.pix.height; +} + +static inline uint32_t ff_v4l2_get_format_pixelformat(const struct v4l2_format * const fmt) +{ + return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.pixelformat : fmt->fmt.pix.pixelformat; +} + +static inline int ff_v4l2_ctx_eos(const V4L2Context * const ctx) +{ + return ctx->flag_last; +} + + #endif /* AVCODEC_V4L2_M2M_H */ diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c index ab07c0a24a..e7fd8980e5 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -21,8 +21,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "config.h" + #include #include + +#include "libavutil/avassert.h" +#include "libavutil/hwcontext.h" +#include "libavutil/hwcontext_drm.h" #include "libavutil/pixfmt.h" #include "libavutil/pixdesc.h" #include "libavutil/opt.h" @@ -30,75 +36,279 @@ #include "libavcodec/decode.h" #include "libavcodec/internal.h" +#include "libavcodec/hwaccels.h" +#include "libavcodec/internal.h" +#include "libavcodec/hwconfig.h" + #include "v4l2_context.h" #include "v4l2_m2m.h" #include "v4l2_fmt.h" +#include "v4l2_req_dmabufs.h" -static int v4l2_try_start(AVCodecContext *avctx) +#if CONFIG_H264_DECODER +#include "h264_parse.h" +#endif +#if CONFIG_HEVC_DECODER +#include "hevc_parse.h" +#endif + +// Pick 64 for max last count - that is >1sec at 60fps +#define STATS_LAST_COUNT_MAX 64 +#define STATS_INTERVAL_MAX (1 << 30) + +#ifndef FF_API_BUFFER_SIZE_T +#define FF_API_BUFFER_SIZE_T 1 +#endif + +#define DUMP_FAILED_EXTRADATA 0 + +#if DUMP_FAILED_EXTRADATA +static inline char hex1(unsigned int x) { - V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context; - V4L2Context *const capture = &s->capture; - V4L2Context *const output = &s->output; - struct v4l2_selection selection = { 0 }; - int ret; + x &= 0xf; + return x <= 9 ? '0' + x : 'a' + x - 10; +} - /* 1. start the output process */ - if (!output->streamon) { - ret = ff_v4l2_context_set_status(output, VIDIOC_STREAMON); - if (ret < 0) { - av_log(avctx, AV_LOG_DEBUG, "VIDIOC_STREAMON on output context\n"); - return ret; - } +static inline char * hex2(char * s, unsigned int x) +{ + *s++ = hex1(x >> 4); + *s++ = hex1(x); + return s; +} + +static inline char * hex4(char * s, unsigned int x) +{ + s = hex2(s, x >> 8); + s = hex2(s, x); + return s; +} + +static inline char * dash2(char * s) +{ + *s++ = '-'; + *s++ = '-'; + return s; +} + +static void +data16(char * s, const unsigned int offset, const uint8_t * m, const size_t len) +{ + size_t i; + s = hex4(s, offset); + m += offset; + for (i = 0; i != 8; ++i) { + *s++ = ' '; + s = len > i + offset ? hex2(s, *m++) : dash2(s); + } + *s++ = ' '; + *s++ = ':'; + for (; i != 16; ++i) { + *s++ = ' '; + s = len > i + offset ? hex2(s, *m++) : dash2(s); } + *s++ = 0; +} - if (capture->streamon) - return 0; +static void +log_dump(void * logctx, int lvl, const void * const data, const size_t len) +{ + size_t i; + for (i = 0; i < len; i += 16) { + char buf[80]; + data16(buf, i, data, len); + av_log(logctx, lvl, "%s\n", buf); + } +} +#endif - /* 2. get the capture format */ - capture->format.type = capture->type; - ret = ioctl(s->fd, VIDIOC_G_FMT, &capture->format); - if (ret) { - av_log(avctx, AV_LOG_WARNING, "VIDIOC_G_FMT ioctl\n"); - return ret; +static unsigned int pts_stats_interval(const pts_stats_t * const stats) +{ + return stats->last_interval; +} + +static int64_t pts_stats_guess(const pts_stats_t * const stats, const int fail_bad_guess) +{ + if (stats->last_count <= 1) + return stats->last_pts; + if (stats->last_pts == AV_NOPTS_VALUE || + fail_bad_guess && (stats->last_interval == 0 || + stats->last_count >= STATS_LAST_COUNT_MAX)) + return AV_NOPTS_VALUE; + return stats->last_pts + (int64_t)(stats->last_count - 1) * (int64_t)stats->last_interval; +} + +static void pts_stats_add(pts_stats_t * const stats, int64_t pts) +{ + if (pts == AV_NOPTS_VALUE || pts == stats->last_pts) { + if (stats->last_count < STATS_LAST_COUNT_MAX) + ++stats->last_count; + return; } - /* 2.1 update the AVCodecContext */ - avctx->pix_fmt = ff_v4l2_format_v4l2_to_avfmt(capture->format.fmt.pix_mp.pixelformat, AV_CODEC_ID_RAWVIDEO); - capture->av_pix_fmt = avctx->pix_fmt; + if (stats->last_pts != AV_NOPTS_VALUE) { + const int64_t interval = pts - stats->last_pts; - /* 3. set the crop parameters */ - selection.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - selection.r.height = avctx->coded_height; - selection.r.width = avctx->coded_width; - ret = ioctl(s->fd, VIDIOC_S_SELECTION, &selection); - if (!ret) { - ret = ioctl(s->fd, VIDIOC_G_SELECTION, &selection); - if (ret) { - av_log(avctx, AV_LOG_WARNING, "VIDIOC_G_SELECTION ioctl\n"); - } else { - av_log(avctx, AV_LOG_DEBUG, "crop output %dx%d\n", selection.r.width, selection.r.height); - /* update the size of the resulting frame */ - capture->height = selection.r.height; - capture->width = selection.r.width; + if (interval < 0 || interval >= STATS_INTERVAL_MAX || + stats->last_count >= STATS_LAST_COUNT_MAX) { + if (stats->last_interval != 0) + av_log(stats->logctx, AV_LOG_DEBUG, "%s: %s: Bad interval: %" PRId64 "/%d\n", + __func__, stats->name, interval, stats->last_count); + stats->last_interval = 0; + } + else { + const int64_t frame_time = interval / (int64_t)stats->last_count; + + if (frame_time != stats->last_interval) + av_log(stats->logctx, AV_LOG_DEBUG, "%s: %s: New interval: %u->%" PRId64 "/%d=%" PRId64 "\n", + __func__, stats->name, stats->last_interval, interval, stats->last_count, frame_time); + stats->last_interval = frame_time; } } - /* 4. init the capture context now that we have the capture format */ - if (!capture->buffers) { - ret = ff_v4l2_context_init(capture); - if (ret) { - av_log(avctx, AV_LOG_ERROR, "can't request capture buffers\n"); - return AVERROR(ENOMEM); + stats->last_pts = pts; + stats->last_count = 1; +} + +static void pts_stats_init(pts_stats_t * const stats, void * logctx, const char * name) +{ + *stats = (pts_stats_t){ + .logctx = logctx, + .name = name, + .last_count = 1, + .last_interval = 0, + .last_pts = AV_NOPTS_VALUE + }; +} + +// If abdata == NULL then this just counts space required +// Unpacks avcC if detected +static int +h264_xd_copy(const uint8_t * const extradata, const int extrasize, uint8_t * abdata) +{ + const uint8_t * const xdend = extradata + extrasize; + const uint8_t * p = extradata; + uint8_t * d = abdata; + unsigned int n; + unsigned int len; + const unsigned int hdrlen = 4; + unsigned int need_pps = 1; + + if (extrasize < 8) + return AVERROR(EINVAL); + + if (p[0] == 0 && p[1] == 0) { + // Assume a couple of leading zeros are good enough to indicate NAL + if (abdata) + memcpy(d, p, extrasize); + return extrasize; + } + + // avcC starts with a 1 + if (p[0] != 1) + return AVERROR(EINVAL); + + p += 5; + n = *p++ & 0x1f; + +doxps: + while (n--) { + if (xdend - p < 2) + return AVERROR(EINVAL); + len = (p[0] << 8) | p[1]; + p += 2; + if (xdend - p < (ptrdiff_t)len) + return AVERROR(EINVAL); + if (abdata) { + d[0] = 0; + d[1] = 0; + d[2] = 0; + d[3] = 1; + memcpy(d + 4, p, len); } + d += len + hdrlen; + p += len; + } + if (need_pps) { + need_pps = 0; + if (p >= xdend) + return AVERROR(EINVAL); + n = *p++; + goto doxps; } - /* 5. start the capture process */ - ret = ff_v4l2_context_set_status(capture, VIDIOC_STREAMON); - if (ret) { - av_log(avctx, AV_LOG_DEBUG, "VIDIOC_STREAMON, on capture context\n"); + return d - abdata; +} + +static int +copy_extradata(AVCodecContext * const avctx, + const void * const src_data, const int src_len, + void ** const pdst_data, size_t * const pdst_len) +{ + int len; + + *pdst_len = 0; + av_freep(pdst_data); + + if (avctx->codec_id == AV_CODEC_ID_H264) + len = h264_xd_copy(src_data, src_len, NULL); + else + len = src_len < 0 ? AVERROR(EINVAL) : src_len; + + // Zero length is OK but we want to stop - -ve is error val + if (len <= 0) + return len; + + if ((*pdst_data = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE)) == NULL) + return AVERROR(ENOMEM); + + if (avctx->codec_id == AV_CODEC_ID_H264) + h264_xd_copy(src_data, src_len, *pdst_data); + else + memcpy(*pdst_data, src_data, len); + *pdst_len = len; + + return 0; +} + + + +static int check_output_streamon(AVCodecContext *const avctx, V4L2m2mContext *const s) +{ + int ret; + struct v4l2_decoder_cmd cmd = { + .cmd = V4L2_DEC_CMD_START, + .flags = 0, + }; + + if (s->output.streamon) + return 0; + + ret = ff_v4l2_context_set_status(&s->output, VIDIOC_STREAMON); + if (ret != 0) { + av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMON on output context: %s\n", av_err2str(ret)); return ret; } + // STREAMON should do implicit START so this just for those that don't. + // It is optional so don't worry if it fails + if (ioctl(s->fd, VIDIOC_DECODER_CMD, &cmd) < 0) { + ret = AVERROR(errno); + av_log(avctx, AV_LOG_WARNING, "VIDIOC_DECODER_CMD start error: %s\n", av_err2str(ret)); + } + else { + av_log(avctx, AV_LOG_TRACE, "VIDIOC_DECODER_CMD start OK\n"); + } + return 0; +} + +static int v4l2_try_start(AVCodecContext *avctx) +{ + V4L2m2mContext * const s = ((V4L2m2mPriv*)avctx->priv_data)->context; + int ret; + + /* 1. start the output process */ + if ((ret = check_output_streamon(avctx, s)) != 0) + return ret; return 0; } @@ -133,46 +343,822 @@ static int v4l2_prepare_decoder(V4L2m2mContext *s) return 0; } -static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) +static void +set_best_effort_pts(AVCodecContext *const avctx, + pts_stats_t * const ps, + AVFrame *const frame) +{ + pts_stats_add(ps, frame->pts); + +#if FF_API_PKT_PTS +FF_DISABLE_DEPRECATION_WARNINGS + frame->pkt_pts = frame->pts; +FF_ENABLE_DEPRECATION_WARNINGS +#endif + frame->best_effort_timestamp = pts_stats_guess(ps, 1); + // If we can't guess from just PTS - try DTS + if (frame->best_effort_timestamp == AV_NOPTS_VALUE) + frame->best_effort_timestamp = frame->pkt_dts; + + // We can't emulate what s/w does in a useful manner and using the + // "correct" answer seems to just confuse things. + frame->pkt_dts = frame->pts; + av_log(avctx, AV_LOG_TRACE, "Out PTS=%" PRId64 "/%"PRId64", DTS=%" PRId64 "\n", + frame->pts, frame->best_effort_timestamp, frame->pkt_dts); +} + +static void +xlat_flush(xlat_track_t * const x) +{ + unsigned int i; + // Do not reset track_no - this ensures that any frames left in the decoder + // that turn up later get discarded. + + x->last_pts = AV_NOPTS_VALUE; + x->last_opaque = 0; + for (i = 0; i != FF_V4L2_M2M_TRACK_SIZE; ++i) { + x->track_els[i].pending = 0; + x->track_els[i].discard = 1; + } +} + +static void +xlat_init(xlat_track_t * const x) +{ + memset(x, 0, sizeof(*x)); + xlat_flush(x); +} + +static int +xlat_pending(const V4L2m2mContext * const s) +{ + const xlat_track_t *const x = &s->xlat; + unsigned int n = x->track_no % FF_V4L2_M2M_TRACK_SIZE; + int i; + const int64_t now = pts_stats_guess(&s->pts_stat, 0); + int64_t first_dts = AV_NOPTS_VALUE; + int no_dts_count = 0; + unsigned int interval = pts_stats_interval(&s->pts_stat); + + for (i = 0; i < FF_V4L2_M2M_TRACK_SIZE; ++i, n = (n - 1) & (FF_V4L2_M2M_TRACK_SIZE - 1)) { + const V4L2m2mTrackEl * const t = x->track_els + n; + + if (first_dts == AV_NOPTS_VALUE) + if (t->dts == AV_NOPTS_VALUE) + ++no_dts_count; + else + first_dts = t->dts; + + // Discard only set on never-set or flushed entries + // So if we get here we've never successfully decoded a frame so allow + // more frames into the buffer before stalling + if (t->discard) + return i - 16; + + // If we've got this frame out then everything before this point + // must have entered the decoder + if (!t->pending) + break; + + // If we've never seen a pts all we can do is count frames + if (now == AV_NOPTS_VALUE) + continue; + + if (t->dts != AV_NOPTS_VALUE && now >= t->dts) + break; + } + + if (first_dts != AV_NOPTS_VALUE && now != AV_NOPTS_VALUE && interval != 0 && s->reorder_size != 0) { + const int iframes = (first_dts - now) / (int)interval; + const int t = iframes - s->reorder_size + no_dts_count; + +// av_log(s->avctx, AV_LOG_DEBUG, "Last:%"PRId64", Now:%"PRId64", First:%"PRId64", delta=%"PRId64", frames=%d, nodts=%d\n", +// x->last_dts, now, first_dts, first_dts - now, iframes, no_dts_count); + + if (iframes > 0 && iframes < 64 && t < i) { + return t; + } + } + + return i; +} + +static inline int stream_started(const V4L2m2mContext * const s) { + return s->output.streamon; +} + +#define NQ_OK 0 +#define NQ_Q_FULL 1 +#define NQ_SRC_EMPTY 2 +#define NQ_NONE 3 +#define NQ_DRAINING 4 +#define NQ_DEAD 5 + +#define TRY_DQ(nq_status) ((nq_status) >= NQ_OK && (nq_status) <= NQ_DRAINING) +#define RETRY_NQ(nq_status) ((nq_status) == NQ_Q_FULL || (nq_status) == NQ_NONE) + +// do_not_get If true then no new packet will be got but status will +// be set appropriately + +// AVERROR_EOF Flushing an already flushed stream +// -ve Error (all errors except EOF are unexpected) +// NQ_OK (0) OK +// NQ_Q_FULL Dst full (retry if we think V4L2 Q has space now) +// NQ_SRC_EMPTY Src empty (do not retry) +// NQ_NONE Enqueue not attempted +// NQ_DRAINING At EOS, dQ dest until EOS there too +// NQ_DEAD Not running (do not retry, do not attempt capture dQ) + +static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const s, const int do_not_get) { - V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context; - V4L2Context *const capture = &s->capture; - V4L2Context *const output = &s->output; int ret; - if (!s->buf_pkt.size) { - ret = ff_decode_get_packet(avctx, &s->buf_pkt); - if (ret < 0 && ret != AVERROR_EOF) + // If we don't already have a coded packet - get a new one + // We will already have a coded pkt if the output Q was full last time we + // tried to Q it + if (!s->buf_pkt.size && !do_not_get) { + unsigned int i; + + for (i = 0; i < 256; ++i) { + uint8_t * side_data; +#if FF_API_BUFFER_SIZE_T + int side_size; +#else + size_t side_size; +#endif + ret = ff_decode_get_packet(avctx, &s->buf_pkt); + if (ret != 0) + break; + + // New extradata is the only side-data we undertand + side_data = av_packet_get_side_data(&s->buf_pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size); + if (side_data) { + av_log(avctx, AV_LOG_DEBUG, "New extradata\n"); + if ((ret = copy_extradata(avctx, side_data, (int)side_size, &s->extdata_data, &s->extdata_size)) < 0) + av_log(avctx, AV_LOG_WARNING, "Failed to copy new extra data: %s\n", av_err2str(ret)); + s->extdata_sent = 0; + } + + if (s->buf_pkt.size != 0) + break; + + if (s->buf_pkt.side_data_elems == 0) { + av_log(avctx, AV_LOG_WARNING, "Empty pkt from ff_decode_get_packet - treating as EOF\n"); + ret = AVERROR_EOF; + break; + } + + // Retry a side-data only pkt + } + // If i >= 256 something has gone wrong + if (i >= 256) { + av_log(avctx, AV_LOG_ERROR, "Too many side-data only packets\n"); + return AVERROR(EIO); + } + + if (ret == AVERROR(EAGAIN)) { + if (!stream_started(s)) { + av_log(avctx, AV_LOG_TRACE, "%s: receive_frame before 1st coded packet\n", __func__); + return NQ_DEAD; + } + return NQ_SRC_EMPTY; + } + + if (ret == AVERROR_EOF) { + // EOF - enter drain mode + av_log(avctx, AV_LOG_TRACE, "--- EOS req: ret=%d, size=%d, started=%d, drain=%d\n", + ret, s->buf_pkt.size, stream_started(s), s->draining); + if (!stream_started(s)) { + av_log(avctx, AV_LOG_DEBUG, "EOS on flushed stream\n"); + s->draining = 1; + s->capture.done = 1; + return AVERROR_EOF; + } + + if (!s->draining) { + // Calling enqueue with an empty pkt starts drain + av_assert0(s->buf_pkt.size == 0); + ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, NULL, 0); + if (ret) { + av_log(avctx, AV_LOG_ERROR, "Failed to start drain: ret=%d\n", ret); + return ret; + } + } + return NQ_DRAINING; + } + + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "Failed to get coded packet: err=%d\n", ret); return ret; + } + } + + if (s->draining) { + if (s->buf_pkt.size) { + av_log(avctx, AV_LOG_WARNING, "Unexpected input whilst draining\n"); + av_packet_unref(&s->buf_pkt); + } + return NQ_DRAINING; } - if (s->draining) - goto dequeue; + if (!s->buf_pkt.size) + return NQ_NONE; - ret = ff_v4l2_context_enqueue_packet(output, &s->buf_pkt); - if (ret < 0 && ret != AVERROR(EAGAIN)) - goto fail; + if ((ret = check_output_streamon(avctx, s)) != 0) + return ret; + + if (s->extdata_sent) + ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, NULL, 0); + else + ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, s->extdata_data, s->extdata_size); - /* if EAGAIN don't unref packet and try to enqueue in the next iteration */ - if (ret != AVERROR(EAGAIN)) + if (ret == AVERROR(EAGAIN)) { + // Out of input buffers - keep packet + ret = NQ_Q_FULL; + } + else { + // In all other cases we are done with this packet av_packet_unref(&s->buf_pkt); + s->extdata_sent = 1; - if (!s->draining) { - ret = v4l2_try_start(avctx); if (ret) { - /* cant recover */ - if (ret != AVERROR(ENOMEM)) - ret = 0; - goto fail; + av_log(avctx, AV_LOG_ERROR, "Packet enqueue failure: err=%d\n", ret); + return ret; } } -dequeue: - return ff_v4l2_context_dequeue_frame(capture, frame, -1); -fail: - av_packet_unref(&s->buf_pkt); + // Start if we haven't + { + const int ret2 = v4l2_try_start(avctx); + if (ret2) { + av_log(avctx, AV_LOG_DEBUG, "Start failure: err=%d\n", ret2); + ret = (ret2 == AVERROR(ENOMEM)) ? ret2 : NQ_DEAD; + } + } + + return ret; +} + +static int qbuf_wait(AVCodecContext * const avctx, V4L2Context * const ctx) +{ + int rv = 0; + + ff_mutex_lock(&ctx->lock); + + while (atomic_load(&ctx->q_count) == 0 && ctx->streamon) { + if (pthread_cond_wait(&ctx->cond, &ctx->lock) != 0) { + rv = AVERROR(errno); + av_log(avctx, AV_LOG_ERROR, "Cond wait failure: %s\n", av_err2str(rv)); + break; + } + } + + ff_mutex_unlock(&ctx->lock); + return rv; +} + +static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) +{ + V4L2m2mContext *const s = ((V4L2m2mPriv*)avctx->priv_data)->context; + int src_rv = -1; + int dst_rv = 1; // Non-zero (done), non-negative (error) number + unsigned int i = 0; + + do { + const int pending = xlat_pending(s); + const int prefer_dq = (pending > 4); + const int last_src_rv = src_rv; + + av_log(avctx, AV_LOG_TRACE, "Pending=%d, src_rv=%d, req_pkt=%d\n", pending, src_rv, s->req_pkt); + + // Enqueue another pkt for decode if + // (a) We don't have a lot of stuff in the buffer already OR + // (b) ... we (think we) do but we've failed to get a frame already OR + // (c) We've dequeued a lot of frames without asking for input + src_rv = try_enqueue_src(avctx, s, !(!prefer_dq || i != 0 || s->req_pkt > 2)); + + // If we got a frame last time or we've already tried to get a frame and + // we have nothing to enqueue then return now. rv will be AVERROR(EAGAIN) + // indicating that we want more input. + // This should mean that once decode starts we enter a stable state where + // we alternately ask for input and produce output + if ((i != 0 || s->req_pkt) && src_rv == NQ_SRC_EMPTY) + break; + + if (src_rv == NQ_Q_FULL && last_src_rv == NQ_Q_FULL) { + av_log(avctx, AV_LOG_WARNING, "Poll thinks src Q has space; none found\n"); + break; + } + + // Try to get a new frame if + // (a) we haven't already got one AND + // (b) enqueue returned a status indicating that decode should be attempted + if (dst_rv != 0 && TRY_DQ(src_rv)) { + // Pick a timeout depending on state + // The pending count isn't completely reliable so it is good enough + // hint that we want a frame but not good enough to require it in + // all cases; however if it has got > 31 that exceeds its margin of + // error so require a frame to prevent ridiculous levels of latency + const int t = + src_rv == NQ_Q_FULL ? -1 : + src_rv == NQ_DRAINING ? 300 : + prefer_dq ? (s->running && pending > 31 ? 100 : 5) : 0; + + // Dequeue frame will unref any previous contents of frame + // if it returns success so we don't need an explicit unref + // when discarding + // This returns AVERROR(EAGAIN) on timeout or if + // there is room in the input Q and timeout == -1 + dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, t); + + // Failure due to no buffer in Q? + if (dst_rv == AVERROR(ENOSPC)) { + // Wait & retry + if ((dst_rv = qbuf_wait(avctx, &s->capture)) == 0) { + dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, t); + } + } + + if (dst_rv == 0) { + set_best_effort_pts(avctx, &s->pts_stat, frame); + if (!s->running) { + s->running = 1; + av_log(avctx, AV_LOG_VERBOSE, "Decode running\n"); + } + } + + if (dst_rv == AVERROR(EAGAIN) && src_rv == NQ_DRAINING) { + av_log(avctx, AV_LOG_WARNING, "Timeout in drain - assume EOF"); + dst_rv = AVERROR_EOF; + s->capture.done = 1; + } + else if (dst_rv == AVERROR_EOF && (s->draining || s->capture.done)) + av_log(avctx, AV_LOG_DEBUG, "Dequeue EOF: draining=%d, cap.done=%d\n", + s->draining, s->capture.done); + else if (dst_rv && dst_rv != AVERROR(EAGAIN)) + av_log(avctx, AV_LOG_ERROR, "Packet dequeue failure: draining=%d, cap.done=%d, err=%d\n", + s->draining, s->capture.done, dst_rv); + } + + ++i; + if (i >= 256) { + av_log(avctx, AV_LOG_ERROR, "Unexpectedly large retry count: %d\n", i); + src_rv = AVERROR(EIO); + } + + // Continue trying to enqueue packets if either + // (a) we succeeded last time OR + // (b) we didn't ret a frame and we can retry the input + } while (src_rv == NQ_OK || (dst_rv == AVERROR(EAGAIN) && RETRY_NQ(src_rv))); + + // Ensure that the frame contains nothing if we aren't returning a frame + // (might happen when discarding) + if (dst_rv) + av_frame_unref(frame); + + // If we got a frame this time ask for a pkt next time + s->req_pkt = (dst_rv == 0) ? s->req_pkt + 1 : 0; + +#if 0 + if (dst_rv == 0) + { + static int z = 0; + if (++z > 50) { + av_log(avctx, AV_LOG_ERROR, "Streamoff and die?\n"); + ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMOFF); + return -1; + } + } +#endif + + return dst_rv == 0 ? 0 : + src_rv < 0 ? src_rv : + dst_rv < 0 ? dst_rv : + AVERROR(EAGAIN); +} + +#if 0 +#include +static int64_t us_time(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (int64_t)ts.tv_sec * 1000000 + ts.tv_nsec / 1000; +} + +static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) +{ + int ret; + const int64_t now = us_time(); + int64_t done; + av_log(avctx, AV_LOG_TRACE, "<<< %s\n", __func__); + ret = v4l2_receive_frame2(avctx, frame); + done = us_time(); + av_log(avctx, AV_LOG_TRACE, ">>> %s: rx time=%" PRId64 ", rv=%d\n", __func__, done - now, ret); return ret; } +#endif + +static uint32_t +avprofile_to_v4l2(const enum AVCodecID codec_id, const int avprofile) +{ + switch (codec_id) { + case AV_CODEC_ID_H264: + switch (avprofile) { + case FF_PROFILE_H264_BASELINE: + return V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE; + case FF_PROFILE_H264_CONSTRAINED_BASELINE: + return V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE; + case FF_PROFILE_H264_MAIN: + return V4L2_MPEG_VIDEO_H264_PROFILE_MAIN; + case FF_PROFILE_H264_EXTENDED: + return V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED; + case FF_PROFILE_H264_HIGH: + return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH; + case FF_PROFILE_H264_HIGH_10: + return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10; + case FF_PROFILE_H264_HIGH_10_INTRA: + return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10_INTRA; + case FF_PROFILE_H264_MULTIVIEW_HIGH: + case FF_PROFILE_H264_HIGH_422: + return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422; + case FF_PROFILE_H264_HIGH_422_INTRA: + return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422_INTRA; + case FF_PROFILE_H264_STEREO_HIGH: + return V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH; + case FF_PROFILE_H264_HIGH_444_PREDICTIVE: + return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE; + case FF_PROFILE_H264_HIGH_444_INTRA: + return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_INTRA; + case FF_PROFILE_H264_CAVLC_444: + return V4L2_MPEG_VIDEO_H264_PROFILE_CAVLC_444_INTRA; + case FF_PROFILE_H264_HIGH_444: + default: + break; +// V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_BASELINE = 12, +// V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH = 13, +// V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH_INTRA = 14, +// V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH = 16, +// V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH = 17, + } + break; + case AV_CODEC_ID_MPEG2VIDEO: + case AV_CODEC_ID_MPEG4: + case AV_CODEC_ID_VC1: + case AV_CODEC_ID_VP8: + case AV_CODEC_ID_VP9: + case AV_CODEC_ID_AV1: + // Most profiles are a simple number that matches the V4L2 enum + return avprofile; + default: + break; + } + return ~(uint32_t)0; +} + +// This check mirrors Chrome's profile check by testing to see if the profile +// exists as a possible value for the V4L2 profile control +static int +check_profile(AVCodecContext *const avctx, V4L2m2mContext *const s) +{ + struct v4l2_queryctrl query_ctrl; + struct v4l2_querymenu query_menu; + uint32_t profile_id; + + // An unset profile is almost certainly zero or -99 - do not reject + if (avctx->profile <= 0) { + av_log(avctx, AV_LOG_VERBOSE, "Profile %d <= 0 - check skipped\n", avctx->profile); + return 0; + } + + memset(&query_ctrl, 0, sizeof(query_ctrl)); + switch (avctx->codec_id) { + case AV_CODEC_ID_MPEG2VIDEO: + profile_id = V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE; + break; + case AV_CODEC_ID_MPEG4: + profile_id = V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE; + break; + case AV_CODEC_ID_H264: + profile_id = V4L2_CID_MPEG_VIDEO_H264_PROFILE; + break; + case AV_CODEC_ID_VP8: + profile_id = V4L2_CID_MPEG_VIDEO_VP8_PROFILE; + break; + case AV_CODEC_ID_VP9: + profile_id = V4L2_CID_MPEG_VIDEO_VP9_PROFILE; + break; +#ifdef V4L2_CID_MPEG_VIDEO_AV1_PROFILE + case AV_CODEC_ID_AV1: + profile_id = V4L2_CID_MPEG_VIDEO_AV1_PROFILE; + break; +#endif + default: + av_log(avctx, AV_LOG_VERBOSE, "Can't map profile for codec id %d; profile check skipped\n", avctx->codec_id); + return 0; + } + + query_ctrl = (struct v4l2_queryctrl){.id = profile_id}; + if (ioctl(s->fd, VIDIOC_QUERYCTRL, &query_ctrl) != 0) { + av_log(avctx, AV_LOG_VERBOSE, "Query profile ctrl (%#x) not supported: assume OK\n", query_ctrl.id); + } + else { + av_log(avctx, AV_LOG_DEBUG, "%s: Control supported: %#x\n", __func__, query_ctrl.id); + + query_menu = (struct v4l2_querymenu){ + .id = query_ctrl.id, + .index = avprofile_to_v4l2(avctx->codec_id, avctx->profile), + }; + + if (query_menu.index > query_ctrl.maximum || + query_menu.index < query_ctrl.minimum || + ioctl(s->fd, VIDIOC_QUERYMENU, &query_menu) != 0) { + return AVERROR(ENOENT); + } + } + + return 0; +}; + +static int +check_size(AVCodecContext * const avctx, V4L2m2mContext * const s, const uint32_t fcc) +{ + unsigned int i; + const uint32_t w = avctx->coded_width; + const uint32_t h = avctx->coded_height; + + if (w == 0 || h == 0 || fcc == 0) { + av_log(avctx, AV_LOG_TRACE, "%s: Size %dx%d or fcc %s empty\n", __func__, w, h, av_fourcc2str(fcc)); + return 0; + } + if ((s->quirks & FF_V4L2_QUIRK_ENUM_FRAMESIZES_BROKEN) != 0) { + av_log(avctx, AV_LOG_TRACE, "%s: Skipped (quirk): Size %dx%d, fcc %s\n", __func__, w, h, av_fourcc2str(fcc)); + return 0; + } + + for (i = 0;; ++i) { + struct v4l2_frmsizeenum fs = { + .index = i, + .pixel_format = fcc, + }; + + while (ioctl(s->fd, VIDIOC_ENUM_FRAMESIZES, &fs) != 0) { + const int err = AVERROR(errno); + if (err == AVERROR(EINTR)) + continue; + if (i == 0 && err == AVERROR(ENOTTY)) { + av_log(avctx, AV_LOG_DEBUG, "Framesize enum not supported\n"); + return 0; + } + if (err != AVERROR(EINVAL)) { + av_log(avctx, AV_LOG_ERROR, "Failed to enum framesizes: %s", av_err2str(err)); + return err; + } + av_log(avctx, AV_LOG_WARNING, "Failed to find Size=%dx%d, fmt=%s in %u frame size enums\n", + w, h, av_fourcc2str(fcc), i); + return err; + } + + switch (fs.type) { + case V4L2_FRMSIZE_TYPE_DISCRETE: + av_log(avctx, AV_LOG_TRACE, "%s[%d]: Discrete: %dx%d\n", __func__, i, + fs.discrete.width,fs.discrete.height); + if (w == fs.discrete.width && h == fs.discrete.height) + return 0; + break; + case V4L2_FRMSIZE_TYPE_STEPWISE: + av_log(avctx, AV_LOG_TRACE, "%s[%d]: Stepwise: Min: %dx%d Max: %dx%d, Step: %dx%d\n", __func__, i, + fs.stepwise.min_width, fs.stepwise.min_height, + fs.stepwise.max_width, fs.stepwise.max_height, + fs.stepwise.step_width,fs.stepwise.step_height); + if (w >= fs.stepwise.min_width && w <= fs.stepwise.max_width && + h >= fs.stepwise.min_height && h <= fs.stepwise.max_height && + (w - fs.stepwise.min_width) % fs.stepwise.step_width == 0 && + (h - fs.stepwise.min_height) % fs.stepwise.step_height == 0) + return 0; + break; + case V4L2_FRMSIZE_TYPE_CONTINUOUS: + av_log(avctx, AV_LOG_TRACE, "%s[%d]: Continuous: Min: %dx%d Max: %dx%d, Step: %dx%d\n", __func__, i, + fs.stepwise.min_width, fs.stepwise.min_height, + fs.stepwise.max_width, fs.stepwise.max_height, + fs.stepwise.step_width,fs.stepwise.step_height); + if (w >= fs.stepwise.min_width && w <= fs.stepwise.max_width && + h >= fs.stepwise.min_height && h <= fs.stepwise.max_height) + return 0; + break; + default: + av_log(avctx, AV_LOG_ERROR, "Unexpected framesize enum: %d", fs.type); + return AVERROR(EINVAL); + } + } +} + +static int +get_quirks(AVCodecContext * const avctx, V4L2m2mContext * const s) +{ + struct v4l2_capability cap; + + memset(&cap, 0, sizeof(cap)); + while (ioctl(s->fd, VIDIOC_QUERYCAP, &cap) != 0) { + int err = errno; + if (err == EINTR) + continue; + av_log(avctx, AV_LOG_ERROR, "V4L2: Failed to get capabilities: %s\n", strerror(err)); + return AVERROR(err); + } + + // Could be made table driven if we have a few more but right now there + // seems no point + + // Meson (amlogic) always gives a resolution changed event after output + // streamon and userspace must (re)allocate capture buffers and streamon + // capture to clear the event even if the capture buffers were the right + // size in the first place. + if (strcmp(cap.driver, "meson-vdec") == 0) + s->quirks |= FF_V4L2_QUIRK_REINIT_ALWAYS | FF_V4L2_QUIRK_ENUM_FRAMESIZES_BROKEN; + + av_log(avctx, AV_LOG_DEBUG, "Driver '%s': Quirks=%#x\n", cap.driver, s->quirks); + return 0; +} + +// This heuristic is for H264 but use for everything +static uint32_t max_coded_size(const AVCodecContext * const avctx) +{ + uint32_t wxh = avctx->coded_width * avctx->coded_height; + uint32_t size; + + size = wxh * 3 / 2; + // H.264 Annex A table A-1 gives minCR which is either 2 or 4 + // unfortunately that doesn't yield an actually useful limit + // and it should be noted that frame 0 is special cased to allow + // a bigger number which really isn't helpful for us. So just pick + // frame_size / 2 + size /= 2; + // Add 64k to allow for any overheads and/or encoder hopefulness + // with small WxH + return size + (1 << 16); +} + +static void +parse_extradata(AVCodecContext * const avctx, V4L2m2mContext * const s) +{ + s->reorder_size = 0; + + if (!avctx->extradata || !avctx->extradata_size) + return; + + switch (avctx->codec_id) { +#if CONFIG_H264_DECODER + case AV_CODEC_ID_H264: + { + H264ParamSets ps; + int is_avc = 0; + int nal_length_size = 0; + int ret; + + memset(&ps, 0, sizeof(ps)); + + ret = ff_h264_decode_extradata(avctx->extradata, avctx->extradata_size, + &ps, &is_avc, &nal_length_size, + avctx->err_recognition, avctx); + if (ret > 0) { + const SPS * sps = NULL; + unsigned int i; + for (i = 0; i != MAX_SPS_COUNT; ++i) { + if (ps.sps_list[i]) { + sps = (const SPS *)ps.sps_list[i]->data; + break; + } + } + if (sps) { + avctx->profile = ff_h264_get_profile(sps); + avctx->level = sps->level_idc; + s->reorder_size = sps->num_reorder_frames; + } + } + ff_h264_ps_uninit(&ps); + break; + } +#endif +#if CONFIG_HEVC_DECODER + case AV_CODEC_ID_HEVC: + { + HEVCParamSets ps; + HEVCSEI sei; + int is_nalff = 0; + int nal_length_size = 0; + int ret; + + memset(&ps, 0, sizeof(ps)); + memset(&sei, 0, sizeof(sei)); + + ret = ff_hevc_decode_extradata(avctx->extradata, avctx->extradata_size, + &ps, &sei, &is_nalff, &nal_length_size, + avctx->err_recognition, 0, avctx); + if (ret > 0) { + const HEVCSPS * sps = NULL; + unsigned int i; + for (i = 0; i != HEVC_MAX_SPS_COUNT; ++i) { + if (ps.sps_list[i]) { + sps = (const HEVCSPS *)ps.sps_list[i]->data; + break; + } + } + if (sps) { + avctx->profile = sps->ptl.general_ptl.profile_idc; + avctx->level = sps->ptl.general_ptl.level_idc; + s->reorder_size = sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering; + } + } + ff_hevc_ps_uninit(&ps); + ff_hevc_reset_sei(&sei); + break; + } +#endif + default: + break; + } +} + +static int +choose_capture_format(AVCodecContext * const avctx, V4L2m2mContext * const s) +{ + const V4L2m2mPriv * const priv = avctx->priv_data; + unsigned int fmts_n; + uint32_t *fmts = ff_v4l2_context_enum_drm_formats(&s->capture, &fmts_n); + enum AVPixelFormat *fmts2 = NULL; + enum AVPixelFormat t; + enum AVPixelFormat gf_pix_fmt; + unsigned int i; + unsigned int n = 0; + unsigned int pref_n = 1; + int rv = AVERROR(ENOENT); + + if (!fmts) + return AVERROR(ENOENT); + + if ((fmts2 = av_malloc(sizeof(*fmts2) * (fmts_n + 2))) == NULL) { + rv = AVERROR(ENOMEM); + goto error; + } + + // Filter for formats that are supported by ffmpeg and + // can accomodate the stream size + fmts2[n++] = AV_PIX_FMT_DRM_PRIME; + for (i = 0; i != fmts_n; ++i) { + const enum AVPixelFormat f = ff_v4l2_format_v4l2_to_avfmt(fmts[i], AV_CODEC_ID_RAWVIDEO); + if (f == AV_PIX_FMT_NONE) + continue; + + if (check_size(avctx, s, fmts[i]) != 0) + continue; + + if (f == priv->pix_fmt) + pref_n = n; + fmts2[n++] = f; + } + fmts2[n] = AV_PIX_FMT_NONE; + + if (n < 2) { + av_log(avctx, AV_LOG_DEBUG, "%s: No usable formats found\n", __func__); + goto error; + } + + // Put preferred s/w format at the end - ff_get_format will put it in sw_pix_fmt + t = fmts2[n - 1]; + fmts2[n - 1] = fmts2[pref_n]; + fmts2[pref_n] = t; + + gf_pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts); + av_log(avctx, AV_LOG_DEBUG, "avctx requested=%d (%s) %dx%d; get_format requested=%d (%s)\n", + avctx->pix_fmt, av_get_pix_fmt_name(avctx->pix_fmt), + avctx->coded_width, avctx->coded_height, + gf_pix_fmt, av_get_pix_fmt_name(gf_pix_fmt)); + + if (gf_pix_fmt == AV_PIX_FMT_NONE) + goto error; + + if (gf_pix_fmt == AV_PIX_FMT_DRM_PRIME || avctx->pix_fmt == AV_PIX_FMT_DRM_PRIME) { + avctx->pix_fmt = AV_PIX_FMT_DRM_PRIME; + s->capture.av_pix_fmt = avctx->sw_pix_fmt; + s->output_drm = 1; + } + else { + avctx->pix_fmt = gf_pix_fmt; + s->capture.av_pix_fmt = gf_pix_fmt; + s->output_drm = 0; + } + + // Get format converts capture.av_pix_fmt back into a V4L2 format in the context + if ((rv = ff_v4l2_context_get_format(&s->capture, 0)) != 0) + goto error; + rv = ff_v4l2_context_set_format(&s->capture); + +error: + av_free(fmts2); + av_free(fmts); + return rv; +} static av_cold int v4l2_decode_init(AVCodecContext *avctx) { @@ -181,10 +1167,27 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) V4L2m2mPriv *priv = avctx->priv_data; int ret; + av_log(avctx, AV_LOG_TRACE, "<<< %s\n", __func__); + + if (avctx->codec_id == AV_CODEC_ID_H264) { + if (avctx->ticks_per_frame == 1) { + if(avctx->time_base.den < INT_MAX/2) { + avctx->time_base.den *= 2; + } else + avctx->time_base.num /= 2; + } + avctx->ticks_per_frame = 2; + } + ret = ff_v4l2_m2m_create_context(priv, &s); if (ret < 0) return ret; + parse_extradata(avctx, s); + + xlat_init(&s->xlat); + pts_stats_init(&s->pts_stat, avctx, "decoder"); + capture = &s->capture; output = &s->output; @@ -192,14 +1195,45 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) * by the v4l2 driver; this event will trigger a full pipeline reconfig and * the proper values will be retrieved from the kernel driver. */ - output->height = capture->height = avctx->coded_height; - output->width = capture->width = avctx->coded_width; +// output->height = capture->height = avctx->coded_height; +// output->width = capture->width = avctx->coded_width; + output->height = capture->height = 0; + output->width = capture->width = 0; output->av_codec_id = avctx->codec_id; output->av_pix_fmt = AV_PIX_FMT_NONE; + output->min_buf_size = max_coded_size(avctx); capture->av_codec_id = AV_CODEC_ID_RAWVIDEO; capture->av_pix_fmt = avctx->pix_fmt; + capture->min_buf_size = 0; + + capture->av_pix_fmt = AV_PIX_FMT_NONE; + s->output_drm = 0; + + s->db_ctl = NULL; + if (priv->dmabuf_alloc != NULL && strcmp(priv->dmabuf_alloc, "v4l2") != 0) { + if (strcmp(priv->dmabuf_alloc, "cma") == 0) + s->db_ctl = dmabufs_ctl_new(); + else { + av_log(avctx, AV_LOG_ERROR, "Unknown dmabuf alloc method: '%s'\n", priv->dmabuf_alloc); + return AVERROR(EINVAL); + } + if (!s->db_ctl) { + av_log(avctx, AV_LOG_ERROR, "Can't open dmabuf provider '%s'\n", priv->dmabuf_alloc); + return AVERROR(ENOMEM); + } + } + + s->device_ref = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_DRM); + if (!s->device_ref) { + ret = AVERROR(ENOMEM); + return ret; + } + + ret = av_hwdevice_ctx_init(s->device_ref); + if (ret < 0) + return ret; s->avctx = avctx; ret = ff_v4l2_m2m_codec_init(priv); @@ -208,12 +1242,90 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) return ret; } - return v4l2_prepare_decoder(s); + if (avctx->extradata && + (ret = copy_extradata(avctx, avctx->extradata, avctx->extradata_size, &s->extdata_data, &s->extdata_size)) != 0) { + av_log(avctx, AV_LOG_ERROR, "Failed to copy extradata from context: %s\n", av_err2str(ret)); +#if DUMP_FAILED_EXTRADATA + log_dump(avctx, AV_LOG_INFO, avctx->extradata, avctx->extradata_size); +#endif + return ret; + } + + if ((ret = get_quirks(avctx, s)) != 0) + return ret; + + if ((ret = check_profile(avctx, s)) != 0) { + av_log(avctx, AV_LOG_WARNING, "Profile %d not supported by decode\n", avctx->profile); + return ret; + } + + // Size check done as part of format filtering + if ((ret = choose_capture_format(avctx, s)) != 0) + return ret; + + if ((ret = v4l2_prepare_decoder(s)) < 0) + return ret; + + return 0; } static av_cold int v4l2_decode_close(AVCodecContext *avctx) { - return ff_v4l2_m2m_codec_end(avctx->priv_data); + int rv; + av_log(avctx, AV_LOG_TRACE, "<<< %s\n", __func__); + rv = ff_v4l2_m2m_codec_end(avctx->priv_data); + av_log(avctx, AV_LOG_TRACE, ">>> %s: rv=%d\n", __func__, rv); + return rv; +} + +static void v4l2_decode_flush(AVCodecContext *avctx) +{ + // An alternatve and more drastic form of flush is to simply do this: + // v4l2_decode_close(avctx); + // v4l2_decode_init(avctx); + // The downside is that this keeps a decoder open until all the frames + // associated with it have been returned. This is a bit wasteful on + // possibly limited h/w resources and fails on a Pi for this reason unless + // more GPU mem is allocated than is the default. + + V4L2m2mPriv * const priv = avctx->priv_data; + V4L2m2mContext * const s = priv->context; + V4L2Context * const output = &s->output; + V4L2Context * const capture = &s->capture; + + av_log(avctx, AV_LOG_TRACE, "<<< %s: streamon=%d\n", __func__, output->streamon); + + // Reflushing everything is benign, quick and avoids having to worry about + // states like EOS processing so don't try to optimize out (having got it + // wrong once) + + ff_v4l2_context_set_status(output, VIDIOC_STREAMOFF); + + // Clear any buffered input packet + av_packet_unref(&s->buf_pkt); + + // Clear a pending EOS + if (ff_v4l2_ctx_eos(capture)) { + // Arguably we could delay this but this is easy and doesn't require + // thought or extra vars + ff_v4l2_context_set_status(capture, VIDIOC_STREAMOFF); + ff_v4l2_context_set_status(capture, VIDIOC_STREAMON); + } + + // V4L2 makes no guarantees about whether decoded frames are flushed or not + // so mark all frames we are tracking to be discarded if they appear + xlat_flush(&s->xlat); + + // resend extradata + s->extdata_sent = 0; + // clear status vars + s->running = 0; + s->draining = 0; + output->done = 0; + capture->done = 0; + + // Stream on will occur when we actually submit a new frame + av_log(avctx, AV_LOG_TRACE, ">>> %s\n", __func__); } #define OFFSET(x) offsetof(V4L2m2mPriv, x) @@ -222,10 +1334,17 @@ static av_cold int v4l2_decode_close(AVCodecContext *avctx) static const AVOption options[] = { V4L_M2M_DEFAULT_OPTS, { "num_capture_buffers", "Number of buffers in the capture context", - OFFSET(num_capture_buffers), AV_OPT_TYPE_INT, {.i64 = 20}, 20, INT_MAX, FLAGS }, + OFFSET(num_capture_buffers), AV_OPT_TYPE_INT, {.i64 = 20}, 2, INT_MAX, FLAGS }, + { "pixel_format", "Pixel format to be used by the decoder", OFFSET(pix_fmt), AV_OPT_TYPE_PIXEL_FMT, {.i64 = AV_PIX_FMT_NONE}, AV_PIX_FMT_NONE, AV_PIX_FMT_NB, FLAGS }, + { "dmabuf_alloc", "Dmabuf alloc method", OFFSET(dmabuf_alloc), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, FLAGS }, { NULL}, }; +static const AVCodecHWConfigInternal *v4l2_m2m_hw_configs[] = { + HW_CONFIG_INTERNAL(DRM_PRIME), + NULL +}; + #define M2MDEC_CLASS(NAME) \ static const AVClass v4l2_m2m_ ## NAME ## _dec_class = { \ .class_name = #NAME "_v4l2m2m_decoder", \ @@ -246,9 +1365,15 @@ static const AVOption options[] = { .init = v4l2_decode_init, \ .receive_frame = v4l2_receive_frame, \ .close = v4l2_decode_close, \ + .flush = v4l2_decode_flush, \ .bsfs = bsf_name, \ .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, \ .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS | FF_CODEC_CAP_INIT_CLEANUP, \ + .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_DRM_PRIME, \ + AV_PIX_FMT_NV12, \ + AV_PIX_FMT_YUV420P, \ + AV_PIX_FMT_NONE}, \ + .hw_configs = v4l2_m2m_hw_configs, \ .wrapper_name = "v4l2m2m", \ } diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c index f644b50133..6472b56030 100644 --- a/libavcodec/v4l2_m2m_enc.c +++ b/libavcodec/v4l2_m2m_enc.c @@ -24,6 +24,8 @@ #include #include #include +#include + #include "encode.h" #include "libavcodec/avcodec.h" #include "libavcodec/internal.h" @@ -38,6 +40,34 @@ #define MPEG_CID(x) V4L2_CID_MPEG_VIDEO_##x #define MPEG_VIDEO(x) V4L2_MPEG_VIDEO_##x +// P030 should be defined in drm_fourcc.h and hopefully will be sometime +// in the future but until then... +#ifndef DRM_FORMAT_P030 +#define DRM_FORMAT_P030 fourcc_code('P', '0', '3', '0') +#endif + +#ifndef DRM_FORMAT_NV15 +#define DRM_FORMAT_NV15 fourcc_code('N', 'V', '1', '5') +#endif + +#ifndef DRM_FORMAT_NV20 +#define DRM_FORMAT_NV20 fourcc_code('N', 'V', '2', '0') +#endif + +#ifndef V4L2_CID_CODEC_BASE +#define V4L2_CID_CODEC_BASE V4L2_CID_MPEG_BASE +#endif + +// V4L2_PIX_FMT_NV12_10_COL128 and V4L2_PIX_FMT_NV12_COL128 should be defined +// in videodev2.h hopefully will be sometime in the future but until then... +#ifndef V4L2_PIX_FMT_NV12_10_COL128 +#define V4L2_PIX_FMT_NV12_10_COL128 v4l2_fourcc('N', 'C', '3', '0') +#endif + +#ifndef V4L2_PIX_FMT_NV12_COL128 +#define V4L2_PIX_FMT_NV12_COL128 v4l2_fourcc('N', 'C', '1', '2') /* 12 Y/CbCr 4:2:0 128 pixel wide column */ +#endif + static inline void v4l2_set_timeperframe(V4L2m2mContext *s, unsigned int num, unsigned int den) { struct v4l2_streamparm parm = { 0 }; @@ -148,15 +178,14 @@ static inline int v4l2_mpeg4_profile_from_ff(int p) static int v4l2_check_b_frame_support(V4L2m2mContext *s) { if (s->avctx->max_b_frames) - av_log(s->avctx, AV_LOG_WARNING, "Encoder does not support b-frames yet\n"); + av_log(s->avctx, AV_LOG_WARNING, "Encoder does not support %d b-frames yet\n", s->avctx->max_b_frames); - v4l2_set_ext_ctrl(s, MPEG_CID(B_FRAMES), 0, "number of B-frames", 0); + v4l2_set_ext_ctrl(s, MPEG_CID(B_FRAMES), s->avctx->max_b_frames, "number of B-frames", 1); v4l2_get_ext_ctrl(s, MPEG_CID(B_FRAMES), &s->avctx->max_b_frames, "number of B-frames", 0); if (s->avctx->max_b_frames == 0) return 0; avpriv_report_missing_feature(s->avctx, "DTS/PTS calculation for V4L2 encoding"); - return AVERROR_PATCHWELCOME; } @@ -271,17 +300,208 @@ static int v4l2_prepare_encoder(V4L2m2mContext *s) return 0; } +static int avdrm_to_v4l2(struct v4l2_format * const format, const AVFrame * const frame) +{ + const AVDRMFrameDescriptor *const src = (const AVDRMFrameDescriptor *)frame->data[0]; + + const uint32_t drm_fmt = src->layers[0].format; + // Treat INVALID as LINEAR + const uint64_t mod = src->objects[0].format_modifier == DRM_FORMAT_MOD_INVALID ? + DRM_FORMAT_MOD_LINEAR : src->objects[0].format_modifier; + uint32_t pix_fmt = 0; + uint32_t w = 0; + uint32_t h = 0; + uint32_t bpl = src->layers[0].planes[0].pitch; + + // We really don't expect multiple layers + // All formats that we currently cope with are single object + + if (src->nb_layers != 1 || src->nb_objects != 1) + return AVERROR(EINVAL); + + switch (drm_fmt) { + case DRM_FORMAT_YUV420: + if (mod == DRM_FORMAT_MOD_LINEAR) { + if (src->layers[0].nb_planes != 3) + break; + pix_fmt = V4L2_PIX_FMT_YUV420; + h = src->layers[0].planes[1].offset / bpl; + w = bpl; + } + break; + + case DRM_FORMAT_NV12: + if (mod == DRM_FORMAT_MOD_LINEAR) { + if (src->layers[0].nb_planes != 2) + break; + pix_fmt = V4L2_PIX_FMT_NV12; + h = src->layers[0].planes[1].offset / bpl; + w = bpl; + } + else if (fourcc_mod_broadcom_mod(mod) == DRM_FORMAT_MOD_BROADCOM_SAND128) { + if (src->layers[0].nb_planes != 2) + break; + pix_fmt = V4L2_PIX_FMT_NV12_COL128; + w = bpl; + h = src->layers[0].planes[1].offset / 128; + bpl = fourcc_mod_broadcom_param(mod); + } + break; + + case DRM_FORMAT_P030: + if (fourcc_mod_broadcom_mod(mod) == DRM_FORMAT_MOD_BROADCOM_SAND128) { + if (src->layers[0].nb_planes != 2) + break; + pix_fmt = V4L2_PIX_FMT_NV12_10_COL128; + w = bpl / 2; // Matching lie to how we construct this + h = src->layers[0].planes[1].offset / 128; + bpl = fourcc_mod_broadcom_param(mod); + } + break; + + default: + break; + } + + if (!pix_fmt) + return AVERROR(EINVAL); + + if (V4L2_TYPE_IS_MULTIPLANAR(format->type)) { + struct v4l2_pix_format_mplane *const pix = &format->fmt.pix_mp; + + pix->width = w; + pix->height = h; + pix->pixelformat = pix_fmt; + pix->plane_fmt[0].bytesperline = bpl; + pix->num_planes = 1; + } + else { + struct v4l2_pix_format *const pix = &format->fmt.pix; + + pix->width = w; + pix->height = h; + pix->pixelformat = pix_fmt; + pix->bytesperline = bpl; + } + + return 0; +} + +// Do we have similar enough formats to be usable? +static int fmt_eq(const struct v4l2_format * const a, const struct v4l2_format * const b) +{ + if (a->type != b->type) + return 0; + + if (V4L2_TYPE_IS_MULTIPLANAR(a->type)) { + const struct v4l2_pix_format_mplane *const pa = &a->fmt.pix_mp; + const struct v4l2_pix_format_mplane *const pb = &b->fmt.pix_mp; + unsigned int i; + if (pa->pixelformat != pb->pixelformat || + pa->num_planes != pb->num_planes) + return 0; + for (i = 0; i != pa->num_planes; ++i) { + if (pa->plane_fmt[i].bytesperline != pb->plane_fmt[i].bytesperline) + return 0; + } + } + else { + const struct v4l2_pix_format *const pa = &a->fmt.pix; + const struct v4l2_pix_format *const pb = &b->fmt.pix; + if (pa->pixelformat != pb->pixelformat || + pa->bytesperline != pb->bytesperline) + return 0; + } + return 1; +} + +static inline int q_full(const V4L2Context *const output) +{ + return ff_v4l2_context_q_count(output) == output->num_buffers; +} + static int v4l2_send_frame(AVCodecContext *avctx, const AVFrame *frame) { V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context; V4L2Context *const output = &s->output; + int rv; + const int needs_slot = q_full(output); + + av_log(avctx, AV_LOG_TRACE, "<<< %s; needs_slot=%d\n", __func__, needs_slot); + + // Signal EOF if needed (doesn't need q slot) + if (!frame) { + av_log(avctx, AV_LOG_TRACE, "--- %s: EOS\n", __func__); + return ff_v4l2_context_enqueue_frame(output, frame); + } + + if ((rv = ff_v4l2_dq_all(output, needs_slot? 500 : 0)) != 0) { + // We should be able to return AVERROR(EAGAIN) to indicate buffer + // exhaustion, but ffmpeg currently treats that as fatal. + av_log(avctx, AV_LOG_WARNING, "Failed to get buffer for src frame: %s\n", av_err2str(rv)); + return rv; + } + + if (s->input_drm && !output->streamon) { + struct v4l2_format req_format = {.type = output->format.type}; + + // Set format when we first get a buffer + if ((rv = avdrm_to_v4l2(&req_format, frame)) != 0) { + av_log(avctx, AV_LOG_ERROR, "Failed to get V4L2 format from DRM_PRIME frame\n"); + return rv; + } + + ff_v4l2_context_release(output); + + output->format = req_format; + + if ((rv = ff_v4l2_context_set_format(output)) != 0) { + av_log(avctx, AV_LOG_ERROR, "Failed to set V4L2 format\n"); + return rv; + } + + if (!fmt_eq(&req_format, &output->format)) { + av_log(avctx, AV_LOG_ERROR, "Format mismatch after setup\n"); + return AVERROR(EINVAL); + } + + output->selection.top = frame->crop_top; + output->selection.left = frame->crop_left; + output->selection.width = av_frame_cropped_width(frame); + output->selection.height = av_frame_cropped_height(frame); + + if ((rv = ff_v4l2_context_init(output)) != 0) { + av_log(avctx, AV_LOG_ERROR, "Failed to (re)init context\n"); + return rv; + } + + { + struct v4l2_selection selection = { + .type = V4L2_BUF_TYPE_VIDEO_OUTPUT, + .target = V4L2_SEL_TGT_CROP, + .r = output->selection + }; + if (ioctl(s->fd, VIDIOC_S_SELECTION, &selection) != 0) { + av_log(avctx, AV_LOG_WARNING, "S_SELECTION (CROP) %dx%d @ %d,%d failed: %s\n", + selection.r.width, selection.r.height, selection.r.left, selection.r.top, + av_err2str(AVERROR(errno))); + } + av_log(avctx, AV_LOG_TRACE, "S_SELECTION (CROP) %dx%d @ %d,%d OK\n", + selection.r.width, selection.r.height, selection.r.left, selection.r.top); + } + } #ifdef V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME - if (frame && frame->pict_type == AV_PICTURE_TYPE_I) + if (frame->pict_type == AV_PICTURE_TYPE_I) v4l2_set_ext_ctrl(s, MPEG_CID(FORCE_KEY_FRAME), 0, "force key frame", 1); #endif - return ff_v4l2_context_enqueue_frame(output, frame); + rv = ff_v4l2_context_enqueue_frame(output, frame); + if (rv) { + av_log(avctx, AV_LOG_ERROR, "Enqueue frame failed: %s\n", av_err2str(rv)); + } + + return rv; } static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) @@ -292,6 +512,11 @@ static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) AVFrame *frame = s->frame; int ret; + av_log(avctx, AV_LOG_TRACE, "<<< %s: qlen out %d cap %d\n", __func__, + ff_v4l2_context_q_count(output), ff_v4l2_context_q_count(capture)); + + ff_v4l2_dq_all(output, 0); + if (s->draining) goto dequeue; @@ -328,7 +553,115 @@ static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) } dequeue: - return ff_v4l2_context_dequeue_packet(capture, avpkt); + // Dequeue a frame + for (;;) { + int t = q_full(output) ? -1 : s->draining ? 300 : 0; + int rv2; + + // If output is full wait for either a packet or output to become not full + ret = ff_v4l2_context_dequeue_packet(capture, avpkt, t); + + // If output was full retry packet dequeue + t = (ret != AVERROR(EAGAIN) || t != -1) ? 0 : 300; + rv2 = ff_v4l2_dq_all(output, t); + if (t == 0 || rv2 != 0) + break; + } + if (ret) + return (s->draining && ret == AVERROR(EAGAIN)) ? AVERROR_EOF : ret; + + if (capture->first_buf == 1) { + uint8_t * data; + const int len = avpkt->size; + + // 1st buffer after streamon should be SPS/PPS + capture->first_buf = 2; + + // Clear both possible stores so there is no chance of confusion + av_freep(&s->extdata_data); + s->extdata_size = 0; + av_freep(&avctx->extradata); + avctx->extradata_size = 0; + + if ((data = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE)) == NULL) + goto fail_no_mem; + + memcpy(data, avpkt->data, len); + av_packet_unref(avpkt); + + // We need to copy the header, but keep local if not global + if ((avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) != 0) { + avctx->extradata = data; + avctx->extradata_size = len; + } + else { + s->extdata_data = data; + s->extdata_size = len; + } + + ret = ff_v4l2_context_dequeue_packet(capture, avpkt, 0); + ff_v4l2_dq_all(output, 0); + if (ret) + return ret; + } + + // First frame must be key so mark as such even if encoder forgot + if (capture->first_buf == 2) { + avpkt->flags |= AV_PKT_FLAG_KEY; + + // Add any extradata to the 1st packet we emit as we cannot create it at init + if (avctx->extradata_size > 0 && avctx->extradata) { + void * const side = av_packet_new_side_data(avpkt, + AV_PKT_DATA_NEW_EXTRADATA, + avctx->extradata_size); + if (!side) + goto fail_no_mem; + + memcpy(side, avctx->extradata, avctx->extradata_size); + } + } + + // Add SPS/PPS to the start of every key frame if non-global headers + if ((avpkt->flags & AV_PKT_FLAG_KEY) != 0 && s->extdata_size != 0) { + const size_t newlen = s->extdata_size + avpkt->size; + AVBufferRef * const buf = av_buffer_alloc(newlen + AV_INPUT_BUFFER_PADDING_SIZE); + + if (buf == NULL) + goto fail_no_mem; + + memcpy(buf->data, s->extdata_data, s->extdata_size); + memcpy(buf->data + s->extdata_size, avpkt->data, avpkt->size); + + av_buffer_unref(&avpkt->buf); + avpkt->buf = buf; + avpkt->data = buf->data; + avpkt->size = newlen; + } + else if (ff_v4l2_context_q_count(capture) < 2) { + // Avoid running out of capture buffers + // In most cases the buffers will be returned quickly in which case + // we don't copy and can use the v4l2 buffers directly but sometimes + // ffmpeg seems to hold onto all of them for a long time (.mkv + // creation?) so avoid deadlock in those cases. + AVBufferRef * const buf = av_buffer_alloc(avpkt->size + AV_INPUT_BUFFER_PADDING_SIZE); + if (buf == NULL) + goto fail_no_mem; + + memcpy(buf->data, avpkt->data, avpkt->size); + av_buffer_unref(&avpkt->buf); // Will recycle the V4L2 buffer + + avpkt->buf = buf; + avpkt->data = buf->data; + } + + capture->first_buf = 0; + return 0; + +fail_no_mem: + av_log(avctx, AV_LOG_ERROR, "Rx pkt failed: No memory\n"); + ret = AVERROR(ENOMEM); + av_packet_unref(avpkt); + return ret; } static av_cold int v4l2_encode_init(AVCodecContext *avctx) @@ -340,6 +673,8 @@ static av_cold int v4l2_encode_init(AVCodecContext *avctx) uint32_t v4l2_fmt_output; int ret; + av_log(avctx, AV_LOG_INFO, " <<< %s: fmt=%d/%d\n", __func__, avctx->pix_fmt, avctx->sw_pix_fmt); + ret = ff_v4l2_m2m_create_context(priv, &s); if (ret < 0) return ret; @@ -347,13 +682,17 @@ static av_cold int v4l2_encode_init(AVCodecContext *avctx) capture = &s->capture; output = &s->output; + s->input_drm = (avctx->pix_fmt == AV_PIX_FMT_DRM_PRIME); + /* common settings output/capture */ output->height = capture->height = avctx->height; output->width = capture->width = avctx->width; /* output context */ output->av_codec_id = AV_CODEC_ID_RAWVIDEO; - output->av_pix_fmt = avctx->pix_fmt; + output->av_pix_fmt = !s->input_drm ? avctx->pix_fmt : + avctx->sw_pix_fmt != AV_PIX_FMT_NONE ? avctx->sw_pix_fmt : + AV_PIX_FMT_YUV420P; /* capture context */ capture->av_codec_id = avctx->codec_id; @@ -372,7 +711,7 @@ static av_cold int v4l2_encode_init(AVCodecContext *avctx) v4l2_fmt_output = output->format.fmt.pix.pixelformat; pix_fmt_output = ff_v4l2_format_v4l2_to_avfmt(v4l2_fmt_output, AV_CODEC_ID_RAWVIDEO); - if (pix_fmt_output != avctx->pix_fmt) { + if (!s->input_drm && pix_fmt_output != avctx->pix_fmt) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt_output); av_log(avctx, AV_LOG_ERROR, "Encoder requires %s pixel format.\n", desc->name); return AVERROR(EINVAL); @@ -390,9 +729,10 @@ static av_cold int v4l2_encode_close(AVCodecContext *avctx) #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM #define V4L_M2M_CAPTURE_OPTS \ - V4L_M2M_DEFAULT_OPTS,\ + { "num_output_buffers", "Number of buffers in the output context",\ + OFFSET(num_output_buffers), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },\ { "num_capture_buffers", "Number of buffers in the capture context", \ - OFFSET(num_capture_buffers), AV_OPT_TYPE_INT, {.i64 = 4 }, 4, INT_MAX, FLAGS } + OFFSET(num_capture_buffers), AV_OPT_TYPE_INT, {.i64 = 8 }, 8, INT_MAX, FLAGS } static const AVOption mpeg4_options[] = { V4L_M2M_CAPTURE_OPTS, diff --git a/libavcodec/v4l2_req_decode_q.c b/libavcodec/v4l2_req_decode_q.c new file mode 100644 index 0000000000..5b3fb958fa --- /dev/null +++ b/libavcodec/v4l2_req_decode_q.c @@ -0,0 +1,84 @@ +#include +#include +#include + +#include "v4l2_req_decode_q.h" + +int decode_q_in_q(const req_decode_ent * const d) +{ + return d->in_q; +} + +void decode_q_add(req_decode_q * const q, req_decode_ent * const d) +{ + pthread_mutex_lock(&q->q_lock); + if (!q->head) { + q->head = d; + q->tail = d; + d->prev = NULL; + } + else { + q->tail->next = d; + d->prev = q->tail; + q->tail = d; + } + d->next = NULL; + d->in_q = 1; + pthread_mutex_unlock(&q->q_lock); +} + +// Remove entry from Q - if head wake-up anything that was waiting +void decode_q_remove(req_decode_q * const q, req_decode_ent * const d) +{ + int try_signal = 0; + + if (!d->in_q) + return; + + pthread_mutex_lock(&q->q_lock); + if (d->prev) + d->prev->next = d->next; + else { + try_signal = 1; // Only need to signal if we were head + q->head = d->next; + } + + if (d->next) + d->next->prev = d->prev; + else + q->tail = d->prev; + + // Not strictly needed but makes debug easier + d->next = NULL; + d->prev = NULL; + d->in_q = 0; + pthread_mutex_unlock(&q->q_lock); + + if (try_signal) + pthread_cond_broadcast(&q->q_cond); +} + +void decode_q_wait(req_decode_q * const q, req_decode_ent * const d) +{ + pthread_mutex_lock(&q->q_lock); + + while (q->head != d) + pthread_cond_wait(&q->q_cond, &q->q_lock); + + pthread_mutex_unlock(&q->q_lock); +} + +void decode_q_uninit(req_decode_q * const q) +{ + pthread_mutex_destroy(&q->q_lock); + pthread_cond_destroy(&q->q_cond); +} + +void decode_q_init(req_decode_q * const q) +{ + memset(q, 0, sizeof(*q)); + pthread_mutex_init(&q->q_lock, NULL); + pthread_cond_init(&q->q_cond, NULL); +} + + diff --git a/libavcodec/v4l2_req_decode_q.h b/libavcodec/v4l2_req_decode_q.h new file mode 100644 index 0000000000..af7bbe1de4 --- /dev/null +++ b/libavcodec/v4l2_req_decode_q.h @@ -0,0 +1,25 @@ +#ifndef AVCODEC_V4L2_REQ_DECODE_Q_H +#define AVCODEC_V4L2_REQ_DECODE_Q_H + +typedef struct req_decode_ent { + struct req_decode_ent * next; + struct req_decode_ent * prev; + int in_q; +} req_decode_ent; + +typedef struct req_decode_q { + pthread_mutex_t q_lock; + pthread_cond_t q_cond; + req_decode_ent * head; + req_decode_ent * tail; +} req_decode_q; + +int decode_q_in_q(const req_decode_ent * const d); +void decode_q_add(req_decode_q * const q, req_decode_ent * const d); +void decode_q_remove(req_decode_q * const q, req_decode_ent * const d); +void decode_q_wait(req_decode_q * const q, req_decode_ent * const d); +void decode_q_uninit(req_decode_q * const q); +void decode_q_init(req_decode_q * const q); + +#endif + diff --git a/libavcodec/v4l2_req_devscan.c b/libavcodec/v4l2_req_devscan.c new file mode 100644 index 0000000000..ee8527ba1f --- /dev/null +++ b/libavcodec/v4l2_req_devscan.c @@ -0,0 +1,451 @@ +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include "v4l2_req_devscan.h" +#include "v4l2_req_utils.h" + +struct decdev { + enum v4l2_buf_type src_type; + uint32_t src_fmt_v4l2; + const char * vname; + const char * mname; +}; + +struct devscan { + struct decdev env; + unsigned int dev_size; + unsigned int dev_count; + struct decdev *devs; +}; + +static int video_src_pixfmt_supported(uint32_t fmt) +{ + return 1; +} + +static void v4l2_setup_format(struct v4l2_format *format, unsigned int type, + unsigned int width, unsigned int height, + unsigned int pixelformat) +{ + unsigned int sizeimage; + + memset(format, 0, sizeof(*format)); + format->type = type; + + sizeimage = V4L2_TYPE_IS_OUTPUT(type) ? 4 * 1024 * 1024 : 0; + + if (V4L2_TYPE_IS_MULTIPLANAR(type)) { + format->fmt.pix_mp.width = width; + format->fmt.pix_mp.height = height; + format->fmt.pix_mp.plane_fmt[0].sizeimage = sizeimage; + format->fmt.pix_mp.pixelformat = pixelformat; + } else { + format->fmt.pix.width = width; + format->fmt.pix.height = height; + format->fmt.pix.sizeimage = sizeimage; + format->fmt.pix.pixelformat = pixelformat; + } +} + +static int v4l2_set_format(int video_fd, unsigned int type, unsigned int pixelformat, + unsigned int width, unsigned int height) +{ + struct v4l2_format format; + + v4l2_setup_format(&format, type, width, height, pixelformat); + + return ioctl(video_fd, VIDIOC_S_FMT, &format) ? -errno : 0; +} + +static int v4l2_query_capabilities(int video_fd, unsigned int *capabilities) +{ + struct v4l2_capability capability = { 0 }; + int rc; + + rc = ioctl(video_fd, VIDIOC_QUERYCAP, &capability); + if (rc < 0) + return -errno; + + if (capabilities != NULL) { + if ((capability.capabilities & V4L2_CAP_DEVICE_CAPS) != 0) + *capabilities = capability.device_caps; + else + *capabilities = capability.capabilities; + } + + return 0; +} + +static int devscan_add(struct devscan *const scan, + enum v4l2_buf_type src_type, + uint32_t src_fmt_v4l2, + const char * vname, + const char * mname) +{ + struct decdev *d; + + if (scan->dev_size <= scan->dev_count) { + unsigned int n = !scan->dev_size ? 4 : scan->dev_size * 2; + d = realloc(scan->devs, n * sizeof(*d)); + if (!d) + return -ENOMEM; + scan->devs = d; + scan->dev_size = n; + } + + d = scan->devs + scan->dev_count; + d->src_type = src_type; + d->src_fmt_v4l2 = src_fmt_v4l2; + d->vname = strdup(vname); + if (!d->vname) + return -ENOMEM; + d->mname = strdup(mname); + if (!d->mname) { + free((char *)d->vname); + return -ENOMEM; + } + ++scan->dev_count; + return 0; +} + +void devscan_delete(struct devscan **const pScan) +{ + unsigned int i; + struct devscan * const scan = *pScan; + + if (!scan) + return; + *pScan = NULL; + + for (i = 0; i < scan->dev_count; ++i) { + free((char*)scan->devs[i].mname); + free((char*)scan->devs[i].vname); + } + free(scan->devs); + free(scan); +} + +#define REQ_BUF_CAPS (\ + V4L2_BUF_CAP_SUPPORTS_DMABUF |\ + V4L2_BUF_CAP_SUPPORTS_REQUESTS |\ + V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF) + +static void probe_formats(void * const dc, + struct devscan *const scan, + const int fd, + const unsigned int type_v4l2, + const char *const mpath, + const char *const vpath) +{ + unsigned int i; + for (i = 0;; ++i) { + struct v4l2_fmtdesc fmtdesc = { + .index = i, + .type = type_v4l2 + }; + struct v4l2_requestbuffers rbufs = { + .count = 0, + .type = type_v4l2, + .memory = V4L2_MEMORY_MMAP + }; + while (ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc)) { + if (errno == EINTR) + continue; + if (errno != EINVAL) + request_err(dc, "Enum[%d] failed for type=%d\n", i, type_v4l2); + return; + } + if (!video_src_pixfmt_supported(fmtdesc.pixelformat)) + continue; + + if (v4l2_set_format(fd, type_v4l2, fmtdesc.pixelformat, 720, 480)) { + request_debug(dc, "Set failed for type=%d, pf=%.4s\n", type_v4l2, (char*)&fmtdesc.pixelformat); + continue; + } + + while (ioctl(fd, VIDIOC_REQBUFS, &rbufs)) { + if (errno != EINTR) { + request_debug(dc, "%s: Reqbufs failed\n", vpath); + continue; + } + } + + if ((rbufs.capabilities & REQ_BUF_CAPS) != REQ_BUF_CAPS) { + request_debug(dc, "%s: Buf caps %#x insufficient\n", vpath, rbufs.capabilities); + continue; + } + + request_debug(dc, "Adding: %s,%s pix=%#x, type=%d\n", + mpath, vpath, fmtdesc.pixelformat, type_v4l2); + devscan_add(scan, type_v4l2, fmtdesc.pixelformat, vpath, mpath); + } +} + + +static int probe_video_device(void * const dc, + struct udev_device *const device, + struct devscan *const scan, + const char *const mpath) +{ + int ret; + unsigned int capabilities = 0; + int video_fd = -1; + + const char *path = udev_device_get_devnode(device); + if (!path) { + request_err(dc, "%s: get video device devnode failed\n", __func__); + ret = -EINVAL; + goto fail; + } + + video_fd = open(path, O_RDWR, 0); + if (video_fd == -1) { + ret = -errno; + request_err(dc, "%s: opening %s failed, %s (%d)\n", __func__, path, strerror(errno), errno); + goto fail; + } + + ret = v4l2_query_capabilities(video_fd, &capabilities); + if (ret < 0) { + request_err(dc, "%s: get video capability failed, %s (%d)\n", __func__, strerror(-ret), -ret); + goto fail; + } + + request_debug(dc, "%s: path=%s capabilities=%#x\n", __func__, path, capabilities); + + if (!(capabilities & V4L2_CAP_STREAMING)) { + request_debug(dc, "%s: missing required streaming capability\n", __func__); + ret = -EINVAL; + goto fail; + } + + if (!(capabilities & (V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_VIDEO_M2M))) { + request_debug(dc, "%s: missing required mem2mem capability\n", __func__); + ret = -EINVAL; + goto fail; + } + + /* Should check capture formats too... */ + if ((capabilities & V4L2_CAP_VIDEO_M2M) != 0) + probe_formats(dc, scan, video_fd, V4L2_BUF_TYPE_VIDEO_OUTPUT, mpath, path); + if ((capabilities & V4L2_CAP_VIDEO_M2M_MPLANE) != 0) + probe_formats(dc, scan, video_fd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, mpath, path); + + close(video_fd); + return 0; + +fail: + if (video_fd >= 0) + close(video_fd); + return ret; +} + +static int probe_media_device(void * const dc, + struct udev_device *const device, + struct devscan *const scan) +{ + int ret; + int rv; + struct media_device_info device_info = { 0 }; + struct media_v2_topology topology = { 0 }; + struct media_v2_interface *interfaces = NULL; + struct udev *udev = udev_device_get_udev(device); + struct udev_device *video_device; + dev_t devnum; + int media_fd = -1; + + const char *path = udev_device_get_devnode(device); + if (!path) { + request_err(dc, "%s: get media device devnode failed\n", __func__); + ret = -EINVAL; + goto fail; + } + + media_fd = open(path, O_RDWR, 0); + if (media_fd < 0) { + ret = -errno; + request_err(dc, "%s: opening %s failed, %s (%d)\n", __func__, path, strerror(-ret), -ret); + goto fail; + } + + rv = ioctl(media_fd, MEDIA_IOC_DEVICE_INFO, &device_info); + if (rv < 0) { + ret = -errno; + request_err(dc, "%s: get media device info failed, %s (%d)\n", __func__, strerror(-ret), -ret); + goto fail; + } + + rv = ioctl(media_fd, MEDIA_IOC_G_TOPOLOGY, &topology); + if (rv < 0) { + ret = -errno; + request_err(dc, "%s: get media topology failed, %s (%d)\n", __func__, strerror(-ret), -ret); + goto fail; + } + + if (topology.num_interfaces <= 0) { + request_err(dc, "%s: media device has no interfaces\n", __func__); + ret = -EINVAL; + goto fail; + } + + interfaces = calloc(topology.num_interfaces, sizeof(*interfaces)); + if (!interfaces) { + request_err(dc, "%s: allocating media interface struct failed\n", __func__); + ret = -ENOMEM; + goto fail; + } + + topology.ptr_interfaces = (__u64)(uintptr_t)interfaces; + rv = ioctl(media_fd, MEDIA_IOC_G_TOPOLOGY, &topology); + if (rv < 0) { + ret = -errno; + request_err(dc, "%s: get media topology failed, %s (%d)\n", __func__, strerror(-ret), -ret); + goto fail; + } + + for (int i = 0; i < topology.num_interfaces; i++) { + if (interfaces[i].intf_type != MEDIA_INTF_T_V4L_VIDEO) + continue; + + devnum = makedev(interfaces[i].devnode.major, interfaces[i].devnode.minor); + video_device = udev_device_new_from_devnum(udev, 'c', devnum); + if (!video_device) { + ret = -errno; + request_err(dc, "%s: video_device[%d]=%p\n", __func__, i, video_device); + continue; + } + + ret = probe_video_device(dc, video_device, scan, path); + udev_device_unref(video_device); + + if (ret != 0) + goto fail; + } + +fail: + free(interfaces); + if (media_fd != -1) + close(media_fd); + return ret; +} + +const char *decdev_media_path(const struct decdev *const dev) +{ + return !dev ? NULL : dev->mname; +} + +const char *decdev_video_path(const struct decdev *const dev) +{ + return !dev ? NULL : dev->vname; +} + +enum v4l2_buf_type decdev_src_type(const struct decdev *const dev) +{ + return !dev ? 0 : dev->src_type; +} + +uint32_t decdev_src_pixelformat(const struct decdev *const dev) +{ + return !dev ? 0 : dev->src_fmt_v4l2; +} + + +const struct decdev *devscan_find(struct devscan *const scan, + const uint32_t src_fmt_v4l2) +{ + unsigned int i; + + if (scan->env.mname && scan->env.vname) + return &scan->env; + + if (!src_fmt_v4l2) + return scan->dev_count ? scan->devs + 0 : NULL; + + for (i = 0; i != scan->dev_count; ++i) { + if (scan->devs[i].src_fmt_v4l2 == src_fmt_v4l2) + return scan->devs + i; + } + return NULL; +} + +int devscan_build(void * const dc, struct devscan **pscan) +{ + int ret; + struct udev *udev; + struct udev_enumerate *enumerate; + struct udev_list_entry *devices; + struct udev_list_entry *entry; + struct udev_device *device; + struct devscan * scan; + + *pscan = NULL; + + scan = calloc(1, sizeof(*scan)); + if (!scan) { + ret = -ENOMEM; + goto fail; + } + + scan->env.mname = getenv("LIBVA_V4L2_REQUEST_MEDIA_PATH"); + scan->env.vname = getenv("LIBVA_V4L2_REQUEST_VIDEO_PATH"); + if (scan->env.mname && scan->env.vname) { + request_info(dc, "Media/video device env overrides found: %s,%s\n", + scan->env.mname, scan->env.vname); + *pscan = scan; + return 0; + } + + udev = udev_new(); + if (!udev) { + request_err(dc, "%s: allocating udev context failed\n", __func__); + ret = -ENOMEM; + goto fail; + } + + enumerate = udev_enumerate_new(udev); + if (!enumerate) { + request_err(dc, "%s: allocating udev enumerator failed\n", __func__); + ret = -ENOMEM; + goto fail; + } + + udev_enumerate_add_match_subsystem(enumerate, "media"); + udev_enumerate_scan_devices(enumerate); + + devices = udev_enumerate_get_list_entry(enumerate); + udev_list_entry_foreach(entry, devices) { + const char *path = udev_list_entry_get_name(entry); + if (!path) + continue; + + device = udev_device_new_from_syspath(udev, path); + if (!device) + continue; + + probe_media_device(dc, device, scan); + udev_device_unref(device); + } + + udev_enumerate_unref(enumerate); + udev_unref(udev); + + *pscan = scan; + return 0; + +fail: + if (udev) + udev_unref(udev); + devscan_delete(&scan); + return ret; +} + diff --git a/libavcodec/v4l2_req_devscan.h b/libavcodec/v4l2_req_devscan.h new file mode 100644 index 0000000000..956d9234f1 --- /dev/null +++ b/libavcodec/v4l2_req_devscan.h @@ -0,0 +1,23 @@ +#ifndef _DEVSCAN_H_ +#define _DEVSCAN_H_ + +#include + +struct devscan; +struct decdev; +enum v4l2_buf_type; + +/* These return pointers to data in the devscan structure and so are vaild + * for the lifetime of that + */ +const char *decdev_media_path(const struct decdev *const dev); +const char *decdev_video_path(const struct decdev *const dev); +enum v4l2_buf_type decdev_src_type(const struct decdev *const dev); +uint32_t decdev_src_pixelformat(const struct decdev *const dev); + +const struct decdev *devscan_find(struct devscan *const scan, const uint32_t src_fmt_v4l2); + +int devscan_build(void * const dc, struct devscan **pscan); +void devscan_delete(struct devscan **const pScan); + +#endif diff --git a/libavcodec/v4l2_req_dmabufs.c b/libavcodec/v4l2_req_dmabufs.c new file mode 100644 index 0000000000..acc0366e76 --- /dev/null +++ b/libavcodec/v4l2_req_dmabufs.c @@ -0,0 +1,369 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "v4l2_req_dmabufs.h" +#include "v4l2_req_utils.h" + +#define DMABUF_NAME1 "/dev/dma_heap/linux,cma" +#define DMABUF_NAME2 "/dev/dma_heap/reserved" + +#define TRACE_ALLOC 0 + +struct dmabufs_ctl; +struct dmabuf_h; + +struct dmabuf_fns { + int (*buf_alloc)(struct dmabufs_ctl * dbsc, struct dmabuf_h * dh, size_t size); + void (*buf_free)(struct dmabuf_h * dh); + int (*ctl_new)(struct dmabufs_ctl * dbsc); + void (*ctl_free)(struct dmabufs_ctl * dbsc); +}; + +struct dmabufs_ctl { + atomic_int ref_count; + int fd; + size_t page_size; + void * v; + const struct dmabuf_fns * fns; +}; + +struct dmabuf_h { + int fd; + size_t size; + size_t len; + void * mapptr; + void * v; + const struct dmabuf_fns * fns; +}; + +#if TRACE_ALLOC +static unsigned int total_bufs = 0; +static size_t total_size = 0; +#endif + +struct dmabuf_h * dmabuf_import_mmap(void * mapptr, size_t size) +{ + struct dmabuf_h *dh; + + if (mapptr == MAP_FAILED) + return NULL; + + dh = malloc(sizeof(*dh)); + if (!dh) + return NULL; + + *dh = (struct dmabuf_h) { + .fd = -1, + .size = size, + .mapptr = mapptr + }; + + return dh; +} + +struct dmabuf_h * dmabuf_import(int fd, size_t size) +{ + struct dmabuf_h *dh; + + fd = dup(fd); + if (fd < 0 || size == 0) + return NULL; + + dh = malloc(sizeof(*dh)); + if (!dh) { + close(fd); + return NULL; + } + + *dh = (struct dmabuf_h) { + .fd = fd, + .size = size, + .mapptr = MAP_FAILED + }; + +#if TRACE_ALLOC + ++total_bufs; + total_size += dh->size; + request_log("%s: Import: %zd, total=%zd, bufs=%d\n", __func__, dh->size, total_size, total_bufs); +#endif + + return dh; +} + +struct dmabuf_h * dmabuf_realloc(struct dmabufs_ctl * dbsc, struct dmabuf_h * old, size_t size) +{ + struct dmabuf_h * dh; + if (old != NULL) { + if (old->size >= size) { + return old; + } + dmabuf_free(old); + } + + if (size == 0 || + (dh = malloc(sizeof(*dh))) == NULL) + return NULL; + + *dh = (struct dmabuf_h){ + .fd = -1, + .mapptr = MAP_FAILED, + .fns = dbsc->fns + }; + + if (dh->fns->buf_alloc(dbsc, dh, size) != 0) + goto fail; + + +#if TRACE_ALLOC + ++total_bufs; + total_size += dh->size; + request_log("%s: Alloc: %zd, total=%zd, bufs=%d\n", __func__, dh->size, total_size, total_bufs); +#endif + + return dh; + +fail: + free(dh); + return NULL; +} + +int dmabuf_sync(struct dmabuf_h * const dh, unsigned int flags) +{ + struct dma_buf_sync sync = { + .flags = flags + }; + if (dh->fd == -1) + return 0; + while (ioctl(dh->fd, DMA_BUF_IOCTL_SYNC, &sync) == -1) { + const int err = errno; + if (errno == EINTR) + continue; + request_log("%s: ioctl failed: flags=%#x\n", __func__, flags); + return -err; + } + return 0; +} + +int dmabuf_write_start(struct dmabuf_h * const dh) +{ + return dmabuf_sync(dh, DMA_BUF_SYNC_START | DMA_BUF_SYNC_WRITE); +} + +int dmabuf_write_end(struct dmabuf_h * const dh) +{ + return dmabuf_sync(dh, DMA_BUF_SYNC_END | DMA_BUF_SYNC_WRITE); +} + +int dmabuf_read_start(struct dmabuf_h * const dh) +{ + if (!dmabuf_map(dh)) + return -1; + return dmabuf_sync(dh, DMA_BUF_SYNC_START | DMA_BUF_SYNC_READ); +} + +int dmabuf_read_end(struct dmabuf_h * const dh) +{ + return dmabuf_sync(dh, DMA_BUF_SYNC_END | DMA_BUF_SYNC_READ); +} + + +void * dmabuf_map(struct dmabuf_h * const dh) +{ + if (!dh) + return NULL; + if (dh->mapptr != MAP_FAILED) + return dh->mapptr; + dh->mapptr = mmap(NULL, dh->size, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, + dh->fd, 0); + if (dh->mapptr == MAP_FAILED) { + request_log("%s: Map failed\n", __func__); + return NULL; + } + return dh->mapptr; +} + +int dmabuf_fd(const struct dmabuf_h * const dh) +{ + if (!dh) + return -1; + return dh->fd; +} + +size_t dmabuf_size(const struct dmabuf_h * const dh) +{ + if (!dh) + return 0; + return dh->size; +} + +size_t dmabuf_len(const struct dmabuf_h * const dh) +{ + if (!dh) + return 0; + return dh->len; +} + +void dmabuf_len_set(struct dmabuf_h * const dh, const size_t len) +{ + dh->len = len; +} + +void dmabuf_free(struct dmabuf_h * dh) +{ + if (!dh) + return; + +#if TRACE_ALLOC + --total_bufs; + total_size -= dh->size; + request_log("%s: Free: %zd, total=%zd, bufs=%d\n", __func__, dh->size, total_size, total_bufs); +#endif + + dh->fns->buf_free(dh); + + if (dh->mapptr != MAP_FAILED && dh->mapptr != NULL) + munmap(dh->mapptr, dh->size); + if (dh->fd != -1) + while (close(dh->fd) == -1 && errno == EINTR) + /* loop */; + free(dh); +} + +static struct dmabufs_ctl * dmabufs_ctl_new2(const struct dmabuf_fns * const fns) +{ + struct dmabufs_ctl * dbsc = calloc(1, sizeof(*dbsc)); + + if (!dbsc) + return NULL; + + dbsc->fd = -1; + dbsc->fns = fns; + dbsc->page_size = (size_t)sysconf(_SC_PAGE_SIZE); + + if (fns->ctl_new(dbsc) != 0) + goto fail; + + return dbsc; + +fail: + free(dbsc); + return NULL; +} + +static void dmabufs_ctl_free(struct dmabufs_ctl * const dbsc) +{ + request_debug(NULL, "Free dmabuf ctl\n"); + + dbsc->fns->ctl_free(dbsc); + + free(dbsc); +} + +void dmabufs_ctl_unref(struct dmabufs_ctl ** const pDbsc) +{ + struct dmabufs_ctl * const dbsc = *pDbsc; + + if (!dbsc) + return; + *pDbsc = NULL; + + if (atomic_fetch_sub(&dbsc->ref_count, 1) != 0) + return; + + dmabufs_ctl_free(dbsc); +} + +struct dmabufs_ctl * dmabufs_ctl_ref(struct dmabufs_ctl * const dbsc) +{ + atomic_fetch_add(&dbsc->ref_count, 1); + return dbsc; +} + +//----------------------------------------------------------------------------- +// +// Alloc dmabuf via CMA + +static int ctl_cma_new(struct dmabufs_ctl * dbsc) +{ + while ((dbsc->fd = open(DMABUF_NAME1, O_RDWR)) == -1 && + errno == EINTR) + /* Loop */; + + if (dbsc->fd == -1) { + while ((dbsc->fd = open(DMABUF_NAME2, O_RDWR)) == -1 && + errno == EINTR) + /* Loop */; + if (dbsc->fd == -1) { + request_log("Unable to open either %s or %s\n", + DMABUF_NAME1, DMABUF_NAME2); + return -1; + } + } + return 0; +} + +static void ctl_cma_free(struct dmabufs_ctl * dbsc) +{ + if (dbsc->fd != -1) + while (close(dbsc->fd) == -1 && errno == EINTR) + /* loop */; + +} + +static int buf_cma_alloc(struct dmabufs_ctl * const dbsc, struct dmabuf_h * dh, size_t size) +{ + struct dma_heap_allocation_data data = { + .len = (size + dbsc->page_size - 1) & ~(dbsc->page_size - 1), + .fd = 0, + .fd_flags = O_RDWR, + .heap_flags = 0 + }; + + while (ioctl(dbsc->fd, DMA_HEAP_IOCTL_ALLOC, &data)) { + int err = errno; + request_log("Failed to alloc %" PRIu64 " from dma-heap(fd=%d): %d (%s)\n", + (uint64_t)data.len, + dbsc->fd, + err, + strerror(err)); + if (err == EINTR) + continue; + return -err; + } + + dh->fd = data.fd; + dh->size = (size_t)data.len; + return 0; +} + +static void buf_cma_free(struct dmabuf_h * dh) +{ + // Nothing needed +} + +static const struct dmabuf_fns dmabuf_cma_fns = { + .buf_alloc = buf_cma_alloc, + .buf_free = buf_cma_free, + .ctl_new = ctl_cma_new, + .ctl_free = ctl_cma_free, +}; + +struct dmabufs_ctl * dmabufs_ctl_new(void) +{ + request_debug(NULL, "Dmabufs using CMA\n");; + return dmabufs_ctl_new2(&dmabuf_cma_fns); +} + diff --git a/libavcodec/v4l2_req_dmabufs.h b/libavcodec/v4l2_req_dmabufs.h new file mode 100644 index 0000000000..381ba2708d --- /dev/null +++ b/libavcodec/v4l2_req_dmabufs.h @@ -0,0 +1,44 @@ +#ifndef DMABUFS_H +#define DMABUFS_H + +#include + +struct dmabufs_ctl; +struct dmabuf_h; + +struct dmabufs_ctl * dmabufs_ctl_new(void); +void dmabufs_ctl_unref(struct dmabufs_ctl ** const pdbsc); +struct dmabufs_ctl * dmabufs_ctl_ref(struct dmabufs_ctl * const dbsc); + +// Need not preserve old contents +// On NULL return old buffer is freed +struct dmabuf_h * dmabuf_realloc(struct dmabufs_ctl * dbsc, struct dmabuf_h *, size_t size); + +static inline struct dmabuf_h * dmabuf_alloc(struct dmabufs_ctl * dbsc, size_t size) { + return dmabuf_realloc(dbsc, NULL, size); +} +/* Create from existing fd - dups(fd) */ +struct dmabuf_h * dmabuf_import(int fd, size_t size); +/* Import an MMAP - return NULL if mapptr = MAP_FAIL */ +struct dmabuf_h * dmabuf_import_mmap(void * mapptr, size_t size); + +void * dmabuf_map(struct dmabuf_h * const dh); + +/* flags from linux/dmabuf.h DMA_BUF_SYNC_xxx */ +int dmabuf_sync(struct dmabuf_h * const dh, unsigned int flags); + +int dmabuf_write_start(struct dmabuf_h * const dh); +int dmabuf_write_end(struct dmabuf_h * const dh); +int dmabuf_read_start(struct dmabuf_h * const dh); +int dmabuf_read_end(struct dmabuf_h * const dh); + +int dmabuf_fd(const struct dmabuf_h * const dh); +/* Allocated size */ +size_t dmabuf_size(const struct dmabuf_h * const dh); +/* Bytes in use */ +size_t dmabuf_len(const struct dmabuf_h * const dh); +/* Set bytes in use */ +void dmabuf_len_set(struct dmabuf_h * const dh, const size_t len); +void dmabuf_free(struct dmabuf_h * dh); + +#endif diff --git a/libavcodec/v4l2_req_hevc_v1.c b/libavcodec/v4l2_req_hevc_v1.c new file mode 100644 index 0000000000..169b532832 --- /dev/null +++ b/libavcodec/v4l2_req_hevc_v1.c @@ -0,0 +1,3 @@ +#define HEVC_CTRLS_VERSION 1 +#include "v4l2_req_hevc_vx.c" + diff --git a/libavcodec/v4l2_req_hevc_v2.c b/libavcodec/v4l2_req_hevc_v2.c new file mode 100644 index 0000000000..42af98e156 --- /dev/null +++ b/libavcodec/v4l2_req_hevc_v2.c @@ -0,0 +1,3 @@ +#define HEVC_CTRLS_VERSION 2 +#include "v4l2_req_hevc_vx.c" + diff --git a/libavcodec/v4l2_req_hevc_v3.c b/libavcodec/v4l2_req_hevc_v3.c new file mode 100644 index 0000000000..dcc8d95632 --- /dev/null +++ b/libavcodec/v4l2_req_hevc_v3.c @@ -0,0 +1,3 @@ +#define HEVC_CTRLS_VERSION 3 +#include "v4l2_req_hevc_vx.c" + diff --git a/libavcodec/v4l2_req_hevc_v4.c b/libavcodec/v4l2_req_hevc_v4.c new file mode 100644 index 0000000000..c35579d8e0 --- /dev/null +++ b/libavcodec/v4l2_req_hevc_v4.c @@ -0,0 +1,3 @@ +#define HEVC_CTRLS_VERSION 4 +#include "v4l2_req_hevc_vx.c" + diff --git a/libavcodec/v4l2_req_hevc_vx.c b/libavcodec/v4l2_req_hevc_vx.c new file mode 100644 index 0000000000..b98d8464ca --- /dev/null +++ b/libavcodec/v4l2_req_hevc_vx.c @@ -0,0 +1,1360 @@ +// File included by v4l2_req_hevc_v* - not compiled on its own + +#include "decode.h" +#include "hevcdec.h" +#include "hwconfig.h" + +#if HEVC_CTRLS_VERSION == 1 +#include "hevc-ctrls-v1.h" + +// Fixup renamed entries +#define V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT + +#elif HEVC_CTRLS_VERSION == 2 +#include "hevc-ctrls-v2.h" +#elif HEVC_CTRLS_VERSION == 3 +#include "hevc-ctrls-v3.h" +#elif HEVC_CTRLS_VERSION == 4 +#include +#if !defined(V4L2_CID_STATELESS_HEVC_SPS) +#include "hevc-ctrls-v4.h" +#endif +#else +#error Unknown HEVC_CTRLS_VERSION +#endif + +#ifndef V4L2_CID_STATELESS_HEVC_SPS +#define V4L2_CID_STATELESS_HEVC_SPS V4L2_CID_MPEG_VIDEO_HEVC_SPS +#define V4L2_CID_STATELESS_HEVC_PPS V4L2_CID_MPEG_VIDEO_HEVC_PPS +#define V4L2_CID_STATELESS_HEVC_SLICE_PARAMS V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS +#define V4L2_CID_STATELESS_HEVC_SCALING_MATRIX V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX +#define V4L2_CID_STATELESS_HEVC_DECODE_PARAMS V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS +#define V4L2_CID_STATELESS_HEVC_DECODE_MODE V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE +#define V4L2_CID_STATELESS_HEVC_START_CODE V4L2_CID_MPEG_VIDEO_HEVC_START_CODE + +#define V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED +#define V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_FRAME_BASED +#define V4L2_STATELESS_HEVC_START_CODE_NONE V4L2_MPEG_VIDEO_HEVC_START_CODE_NONE +#define V4L2_STATELESS_HEVC_START_CODE_ANNEX_B V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B +#endif + +#include "v4l2_request_hevc.h" + +#include "libavutil/hwcontext_drm.h" + +#include +#include + +#include "v4l2_req_devscan.h" +#include "v4l2_req_dmabufs.h" +#include "v4l2_req_pollqueue.h" +#include "v4l2_req_media.h" +#include "v4l2_req_utils.h" + +// Attached to buf[0] in frame +// Pooled in hwcontext so generally create once - 1/frame +typedef struct V4L2MediaReqDescriptor { + AVDRMFrameDescriptor drm; + + // Media + uint64_t timestamp; + struct qent_dst * qe_dst; + + // Decode only - should be NULL by the time we emit the frame + struct req_decode_ent decode_ent; + + struct media_request *req; + struct qent_src *qe_src; + +#if HEVC_CTRLS_VERSION >= 2 + struct v4l2_ctrl_hevc_decode_params dec; +#endif + + size_t num_slices; + size_t alloced_slices; + struct v4l2_ctrl_hevc_slice_params * slice_params; + struct slice_info * slices; + + size_t num_offsets; + size_t alloced_offsets; + uint32_t *offsets; + +} V4L2MediaReqDescriptor; + +struct slice_info { + const uint8_t * ptr; + size_t len; // bytes + size_t n_offsets; +}; + +// Handy container for accumulating controls before setting +struct req_controls { + int has_scaling; + struct timeval tv; + struct v4l2_ctrl_hevc_sps sps; + struct v4l2_ctrl_hevc_pps pps; + struct v4l2_ctrl_hevc_scaling_matrix scaling_matrix; +}; + +//static uint8_t nalu_slice_start_code[] = { 0x00, 0x00, 0x01 }; + + +// Get an FFmpeg format from the v4l2 format +static enum AVPixelFormat pixel_format_from_format(const struct v4l2_format *const format) +{ + switch (V4L2_TYPE_IS_MULTIPLANAR(format->type) ? + format->fmt.pix_mp.pixelformat : format->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_YUV420: + return AV_PIX_FMT_YUV420P; + case V4L2_PIX_FMT_NV12: + return AV_PIX_FMT_NV12; +#if CONFIG_SAND + case V4L2_PIX_FMT_NV12_COL128: + return AV_PIX_FMT_RPI4_8; + case V4L2_PIX_FMT_NV12_10_COL128: + return AV_PIX_FMT_RPI4_10; +#endif + default: + break; + } + return AV_PIX_FMT_NONE; +} + +static inline uint64_t frame_capture_dpb(const AVFrame * const frame) +{ + const V4L2MediaReqDescriptor *const rd = (V4L2MediaReqDescriptor *)frame->data[0]; + return rd->timestamp; +} + +static inline void frame_set_capture_dpb(AVFrame * const frame, const uint64_t dpb_stamp) +{ + V4L2MediaReqDescriptor *const rd = (V4L2MediaReqDescriptor *)frame->data[0]; + rd->timestamp = dpb_stamp; +} + +static void fill_pred_table(const HEVCContext *h, struct v4l2_hevc_pred_weight_table *table) +{ + int32_t luma_weight_denom, chroma_weight_denom; + const SliceHeader *sh = &h->sh; + + if (sh->slice_type == HEVC_SLICE_I || + (sh->slice_type == HEVC_SLICE_P && !h->ps.pps->weighted_pred_flag) || + (sh->slice_type == HEVC_SLICE_B && !h->ps.pps->weighted_bipred_flag)) + return; + + table->luma_log2_weight_denom = sh->luma_log2_weight_denom; + + if (h->ps.sps->chroma_format_idc) + table->delta_chroma_log2_weight_denom = sh->chroma_log2_weight_denom - sh->luma_log2_weight_denom; + + luma_weight_denom = (1 << sh->luma_log2_weight_denom); + chroma_weight_denom = (1 << sh->chroma_log2_weight_denom); + + for (int i = 0; i < 15 && i < sh->nb_refs[L0]; i++) { + table->delta_luma_weight_l0[i] = sh->luma_weight_l0[i] - luma_weight_denom; + table->luma_offset_l0[i] = sh->luma_offset_l0[i]; + table->delta_chroma_weight_l0[i][0] = sh->chroma_weight_l0[i][0] - chroma_weight_denom; + table->delta_chroma_weight_l0[i][1] = sh->chroma_weight_l0[i][1] - chroma_weight_denom; + table->chroma_offset_l0[i][0] = sh->chroma_offset_l0[i][0]; + table->chroma_offset_l0[i][1] = sh->chroma_offset_l0[i][1]; + } + + if (sh->slice_type != HEVC_SLICE_B) + return; + + for (int i = 0; i < 15 && i < sh->nb_refs[L1]; i++) { + table->delta_luma_weight_l1[i] = sh->luma_weight_l1[i] - luma_weight_denom; + table->luma_offset_l1[i] = sh->luma_offset_l1[i]; + table->delta_chroma_weight_l1[i][0] = sh->chroma_weight_l1[i][0] - chroma_weight_denom; + table->delta_chroma_weight_l1[i][1] = sh->chroma_weight_l1[i][1] - chroma_weight_denom; + table->chroma_offset_l1[i][0] = sh->chroma_offset_l1[i][0]; + table->chroma_offset_l1[i][1] = sh->chroma_offset_l1[i][1]; + } +} + +#if HEVC_CTRLS_VERSION <= 2 +static int find_frame_rps_type(const HEVCContext *h, uint64_t timestamp) +{ + const HEVCFrame *frame; + int i; + + for (i = 0; i < h->rps[ST_CURR_BEF].nb_refs; i++) { + frame = h->rps[ST_CURR_BEF].ref[i]; + if (frame && timestamp == frame_capture_dpb(frame->frame)) + return V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_BEFORE; + } + + for (i = 0; i < h->rps[ST_CURR_AFT].nb_refs; i++) { + frame = h->rps[ST_CURR_AFT].ref[i]; + if (frame && timestamp == frame_capture_dpb(frame->frame)) + return V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_AFTER; + } + + for (i = 0; i < h->rps[LT_CURR].nb_refs; i++) { + frame = h->rps[LT_CURR].ref[i]; + if (frame && timestamp == frame_capture_dpb(frame->frame)) + return V4L2_HEVC_DPB_ENTRY_RPS_LT_CURR; + } + + return 0; +} +#endif + +static unsigned int +get_ref_pic_index(const HEVCContext *h, const HEVCFrame *frame, + const struct v4l2_hevc_dpb_entry * const entries, + const unsigned int num_entries) +{ + uint64_t timestamp; + + if (!frame) + return 0; + + timestamp = frame_capture_dpb(frame->frame); + + for (unsigned int i = 0; i < num_entries; i++) { + if (entries[i].timestamp == timestamp) + return i; + } + + return 0; +} + +static const uint8_t * ptr_from_index(const uint8_t * b, unsigned int idx) +{ + unsigned int z = 0; + while (idx--) { + if (*b++ == 0) { + ++z; + if (z >= 2 && *b == 3) { + ++b; + z = 0; + } + } + else { + z = 0; + } + } + return b; +} + +static int slice_add(V4L2MediaReqDescriptor * const rd) +{ + if (rd->num_slices >= rd->alloced_slices) { + struct v4l2_ctrl_hevc_slice_params * p2; + struct slice_info * s2; + size_t n2 = rd->alloced_slices == 0 ? 8 : rd->alloced_slices * 2; + + p2 = av_realloc_array(rd->slice_params, n2, sizeof(*p2)); + if (p2 == NULL) + return AVERROR(ENOMEM); + rd->slice_params = p2; + + s2 = av_realloc_array(rd->slices, n2, sizeof(*s2)); + if (s2 == NULL) + return AVERROR(ENOMEM); + rd->slices = s2; + + rd->alloced_slices = n2; + } + ++rd->num_slices; + return 0; +} + +static int offsets_add(V4L2MediaReqDescriptor *const rd, const size_t n, const unsigned * const offsets) +{ + if (rd->num_offsets + n > rd->alloced_offsets) { + size_t n2 = rd->alloced_slices == 0 ? 128 : rd->alloced_slices * 2; + void * p2; + while (rd->num_offsets + n > n2) + n2 *= 2; + if ((p2 = av_realloc_array(rd->offsets, n2, sizeof(*rd->offsets))) == NULL) + return AVERROR(ENOMEM); + rd->offsets = p2; + rd->alloced_offsets = n2; + } + for (size_t i = 0; i != n; ++i) + rd->offsets[rd->num_offsets++] = offsets[i] - 1; + return 0; +} + +static unsigned int +fill_dpb_entries(const HEVCContext * const h, struct v4l2_hevc_dpb_entry * const entries) +{ + unsigned int i; + unsigned int n = 0; + const HEVCFrame * const pic = h->ref; + + for (i = 0; i < FF_ARRAY_ELEMS(h->DPB); i++) { + const HEVCFrame * const frame = &h->DPB[i]; + if (frame != pic && (frame->flags & (HEVC_FRAME_FLAG_LONG_REF | HEVC_FRAME_FLAG_SHORT_REF))) { + struct v4l2_hevc_dpb_entry * const entry = entries + n++; + + entry->timestamp = frame_capture_dpb(frame->frame); +#if HEVC_CTRLS_VERSION <= 2 + entry->rps = find_frame_rps_type(h, entry->timestamp); +#else + entry->flags = (frame->flags & HEVC_FRAME_FLAG_LONG_REF) == 0 ? 0 : + V4L2_HEVC_DPB_ENTRY_LONG_TERM_REFERENCE; +#endif + entry->field_pic = frame->frame->interlaced_frame; + +#if HEVC_CTRLS_VERSION <= 3 + /* TODO: Interleaved: Get the POC for each field. */ + entry->pic_order_cnt[0] = frame->poc; + entry->pic_order_cnt[1] = frame->poc; +#else + entry->pic_order_cnt_val = frame->poc; +#endif + } + } + return n; +} + +static void fill_slice_params(const HEVCContext * const h, +#if HEVC_CTRLS_VERSION >= 2 + const struct v4l2_ctrl_hevc_decode_params * const dec, +#endif + struct v4l2_ctrl_hevc_slice_params *slice_params, + uint32_t bit_size, uint32_t bit_offset) +{ + const SliceHeader * const sh = &h->sh; +#if HEVC_CTRLS_VERSION >= 2 + const struct v4l2_hevc_dpb_entry *const dpb = dec->dpb; + const unsigned int dpb_n = dec->num_active_dpb_entries; +#else + struct v4l2_hevc_dpb_entry *const dpb = slice_params->dpb; + unsigned int dpb_n; +#endif + unsigned int i; + RefPicList *rpl; + + *slice_params = (struct v4l2_ctrl_hevc_slice_params) { + .bit_size = bit_size, +#if HEVC_CTRLS_VERSION <= 3 + .data_bit_offset = bit_offset, +#else + .data_byte_offset = bit_offset / 8 + 1, +#endif + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + .slice_segment_addr = sh->slice_segment_addr, + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: NAL unit header */ + .nal_unit_type = h->nal_unit_type, + .nuh_temporal_id_plus1 = h->temporal_id + 1, + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + .slice_type = sh->slice_type, + .colour_plane_id = sh->colour_plane_id, + .slice_pic_order_cnt = h->ref->poc, + .num_ref_idx_l0_active_minus1 = sh->nb_refs[L0] ? sh->nb_refs[L0] - 1 : 0, + .num_ref_idx_l1_active_minus1 = sh->nb_refs[L1] ? sh->nb_refs[L1] - 1 : 0, + .collocated_ref_idx = sh->slice_temporal_mvp_enabled_flag ? sh->collocated_ref_idx : 0, + .five_minus_max_num_merge_cand = sh->slice_type == HEVC_SLICE_I ? 0 : 5 - sh->max_num_merge_cand, + .slice_qp_delta = sh->slice_qp_delta, + .slice_cb_qp_offset = sh->slice_cb_qp_offset, + .slice_cr_qp_offset = sh->slice_cr_qp_offset, + .slice_act_y_qp_offset = 0, + .slice_act_cb_qp_offset = 0, + .slice_act_cr_qp_offset = 0, + .slice_beta_offset_div2 = sh->beta_offset / 2, + .slice_tc_offset_div2 = sh->tc_offset / 2, + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture timing SEI message */ + .pic_struct = h->sei.picture_timing.picture_struct, + +#if HEVC_CTRLS_VERSION < 2 + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + .num_rps_poc_st_curr_before = h->rps[ST_CURR_BEF].nb_refs, + .num_rps_poc_st_curr_after = h->rps[ST_CURR_AFT].nb_refs, + .num_rps_poc_lt_curr = h->rps[LT_CURR].nb_refs, +#endif + }; + + if (sh->slice_sample_adaptive_offset_flag[0]) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_LUMA; + + if (sh->slice_sample_adaptive_offset_flag[1]) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_CHROMA; + + if (sh->slice_temporal_mvp_enabled_flag) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_TEMPORAL_MVP_ENABLED; + + if (sh->mvd_l1_zero_flag) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_MVD_L1_ZERO; + + if (sh->cabac_init_flag) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_CABAC_INIT; + + if (sh->collocated_list == L0) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_COLLOCATED_FROM_L0; + + if (sh->disable_deblocking_filter_flag) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_DEBLOCKING_FILTER_DISABLED; + + if (sh->slice_loop_filter_across_slices_enabled_flag) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED; + + if (sh->dependent_slice_segment_flag) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT; + +#if HEVC_CTRLS_VERSION < 2 + dpb_n = fill_dpb_entries(h, dpb); + slice_params->num_active_dpb_entries = dpb_n; +#endif + + if (sh->slice_type != HEVC_SLICE_I) { + rpl = &h->ref->refPicList[0]; + for (i = 0; i < rpl->nb_refs; i++) + slice_params->ref_idx_l0[i] = get_ref_pic_index(h, rpl->ref[i], dpb, dpb_n); + } + + if (sh->slice_type == HEVC_SLICE_B) { + rpl = &h->ref->refPicList[1]; + for (i = 0; i < rpl->nb_refs; i++) + slice_params->ref_idx_l1[i] = get_ref_pic_index(h, rpl->ref[i], dpb, dpb_n); + } + + fill_pred_table(h, &slice_params->pred_weight_table); + + slice_params->num_entry_point_offsets = sh->num_entry_point_offsets; +#if HEVC_CTRLS_VERSION <= 3 + if (slice_params->num_entry_point_offsets > 256) { + slice_params->num_entry_point_offsets = 256; + av_log(NULL, AV_LOG_ERROR, "%s: Currently only 256 entry points are supported, but slice has %d entry points.\n", __func__, sh->num_entry_point_offsets); + } + + for (i = 0; i < slice_params->num_entry_point_offsets; i++) + slice_params->entry_point_offset_minus1[i] = sh->entry_point_offset[i] - 1; +#endif +} + +#if HEVC_CTRLS_VERSION >= 2 +static void +fill_decode_params(const HEVCContext * const h, + struct v4l2_ctrl_hevc_decode_params * const dec) +{ + unsigned int i; + + *dec = (struct v4l2_ctrl_hevc_decode_params){ + .pic_order_cnt_val = h->poc, + .num_poc_st_curr_before = h->rps[ST_CURR_BEF].nb_refs, + .num_poc_st_curr_after = h->rps[ST_CURR_AFT].nb_refs, + .num_poc_lt_curr = h->rps[LT_CURR].nb_refs, + }; + + dec->num_active_dpb_entries = fill_dpb_entries(h, dec->dpb); + + // The docn does seem to ask that we fit our 32 bit signed POC into + // a U8 so... (To be fair 16 bits would be enough) + // Luckily we (Pi) don't use these fields + for (i = 0; i != h->rps[ST_CURR_BEF].nb_refs; ++i) + dec->poc_st_curr_before[i] = h->rps[ST_CURR_BEF].ref[i]->poc; + for (i = 0; i != h->rps[ST_CURR_AFT].nb_refs; ++i) + dec->poc_st_curr_after[i] = h->rps[ST_CURR_AFT].ref[i]->poc; + for (i = 0; i != h->rps[LT_CURR].nb_refs; ++i) + dec->poc_lt_curr[i] = h->rps[LT_CURR].ref[i]->poc; + + if (IS_IRAP(h)) + dec->flags |= V4L2_HEVC_DECODE_PARAM_FLAG_IRAP_PIC; + if (IS_IDR(h)) + dec->flags |= V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC; + if (h->sh.no_output_of_prior_pics_flag) + dec->flags |= V4L2_HEVC_DECODE_PARAM_FLAG_NO_OUTPUT_OF_PRIOR; + +} +#endif + +static void fill_sps(struct v4l2_ctrl_hevc_sps *ctrl, const HEVCSPS *sps) +{ + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Sequence parameter set */ + *ctrl = (struct v4l2_ctrl_hevc_sps) { + .chroma_format_idc = sps->chroma_format_idc, + .pic_width_in_luma_samples = sps->width, + .pic_height_in_luma_samples = sps->height, + .bit_depth_luma_minus8 = sps->bit_depth - 8, + .bit_depth_chroma_minus8 = sps->bit_depth - 8, + .log2_max_pic_order_cnt_lsb_minus4 = sps->log2_max_poc_lsb - 4, + .sps_max_dec_pic_buffering_minus1 = sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering - 1, + .sps_max_num_reorder_pics = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics, + .sps_max_latency_increase_plus1 = sps->temporal_layer[sps->max_sub_layers - 1].max_latency_increase + 1, + .log2_min_luma_coding_block_size_minus3 = sps->log2_min_cb_size - 3, + .log2_diff_max_min_luma_coding_block_size = sps->log2_diff_max_min_coding_block_size, + .log2_min_luma_transform_block_size_minus2 = sps->log2_min_tb_size - 2, + .log2_diff_max_min_luma_transform_block_size = sps->log2_max_trafo_size - sps->log2_min_tb_size, + .max_transform_hierarchy_depth_inter = sps->max_transform_hierarchy_depth_inter, + .max_transform_hierarchy_depth_intra = sps->max_transform_hierarchy_depth_intra, + .pcm_sample_bit_depth_luma_minus1 = sps->pcm.bit_depth - 1, + .pcm_sample_bit_depth_chroma_minus1 = sps->pcm.bit_depth_chroma - 1, + .log2_min_pcm_luma_coding_block_size_minus3 = sps->pcm.log2_min_pcm_cb_size - 3, + .log2_diff_max_min_pcm_luma_coding_block_size = sps->pcm.log2_max_pcm_cb_size - sps->pcm.log2_min_pcm_cb_size, + .num_short_term_ref_pic_sets = sps->nb_st_rps, + .num_long_term_ref_pics_sps = sps->num_long_term_ref_pics_sps, + .chroma_format_idc = sps->chroma_format_idc, + .sps_max_sub_layers_minus1 = sps->max_sub_layers - 1, + }; + + if (sps->separate_colour_plane_flag) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE; + + if (sps->scaling_list_enable_flag) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED; + + if (sps->amp_enabled_flag) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_AMP_ENABLED; + + if (sps->sao_enabled) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET; + + if (sps->pcm_enabled_flag) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_PCM_ENABLED; + + if (sps->pcm.loop_filter_disable_flag) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED; + + if (sps->long_term_ref_pics_present_flag) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT; + + if (sps->sps_temporal_mvp_enabled_flag) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED; + + if (sps->sps_strong_intra_smoothing_enable_flag) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED; +} + +static void fill_scaling_matrix(const ScalingList * const sl, + struct v4l2_ctrl_hevc_scaling_matrix * const sm) +{ + unsigned int i; + + for (i = 0; i < 6; i++) { + unsigned int j; + + for (j = 0; j < 16; j++) + sm->scaling_list_4x4[i][j] = sl->sl[0][i][j]; + for (j = 0; j < 64; j++) { + sm->scaling_list_8x8[i][j] = sl->sl[1][i][j]; + sm->scaling_list_16x16[i][j] = sl->sl[2][i][j]; + if (i < 2) + sm->scaling_list_32x32[i][j] = sl->sl[3][i * 3][j]; + } + sm->scaling_list_dc_coef_16x16[i] = sl->sl_dc[0][i]; + if (i < 2) + sm->scaling_list_dc_coef_32x32[i] = sl->sl_dc[1][i * 3]; + } +} + +static void fill_pps(struct v4l2_ctrl_hevc_pps * const ctrl, const HEVCPPS * const pps) +{ + uint64_t flags = 0; + + if (pps->dependent_slice_segments_enabled_flag) + flags |= V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED; + + if (pps->output_flag_present_flag) + flags |= V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT; + + if (pps->sign_data_hiding_flag) + flags |= V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED; + + if (pps->cabac_init_present_flag) + flags |= V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT; + + if (pps->constrained_intra_pred_flag) + flags |= V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED; + + if (pps->transform_skip_enabled_flag) + flags |= V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED; + + if (pps->cu_qp_delta_enabled_flag) + flags |= V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED; + + if (pps->pic_slice_level_chroma_qp_offsets_present_flag) + flags |= V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT; + + if (pps->weighted_pred_flag) + flags |= V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED; + + if (pps->weighted_bipred_flag) + flags |= V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED; + + if (pps->transquant_bypass_enable_flag) + flags |= V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED; + + if (pps->tiles_enabled_flag) + flags |= V4L2_HEVC_PPS_FLAG_TILES_ENABLED; + + if (pps->entropy_coding_sync_enabled_flag) + flags |= V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED; + + if (pps->loop_filter_across_tiles_enabled_flag) + flags |= V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED; + + if (pps->seq_loop_filter_across_slices_enabled_flag) + flags |= V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED; + + if (pps->deblocking_filter_override_enabled_flag) + flags |= V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED; + + if (pps->disable_dbf) + flags |= V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER; + + if (pps->lists_modification_present_flag) + flags |= V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT; + + if (pps->slice_header_extension_present_flag) + flags |= V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture parameter set */ + *ctrl = (struct v4l2_ctrl_hevc_pps) { + .num_extra_slice_header_bits = pps->num_extra_slice_header_bits, + .init_qp_minus26 = pps->pic_init_qp_minus26, + .diff_cu_qp_delta_depth = pps->diff_cu_qp_delta_depth, + .pps_cb_qp_offset = pps->cb_qp_offset, + .pps_cr_qp_offset = pps->cr_qp_offset, + .pps_beta_offset_div2 = pps->beta_offset / 2, + .pps_tc_offset_div2 = pps->tc_offset / 2, + .log2_parallel_merge_level_minus2 = pps->log2_parallel_merge_level - 2, + .flags = flags + }; + + + if (pps->tiles_enabled_flag) { + ctrl->num_tile_columns_minus1 = pps->num_tile_columns - 1; + ctrl->num_tile_rows_minus1 = pps->num_tile_rows - 1; + + for (int i = 0; i < pps->num_tile_columns; i++) + ctrl->column_width_minus1[i] = pps->column_width[i] - 1; + + for (int i = 0; i < pps->num_tile_rows; i++) + ctrl->row_height_minus1[i] = pps->row_height[i] - 1; + } +} + +// Called before finally returning the frame to the user +// Set corrupt flag here as this is actually the frame structure that +// is going to the user (in MT land each thread has its own pool) +static int frame_post_process(void *logctx, AVFrame *frame) +{ + V4L2MediaReqDescriptor *rd = (V4L2MediaReqDescriptor*)frame->data[0]; + +// av_log(NULL, AV_LOG_INFO, "%s\n", __func__); + frame->flags &= ~AV_FRAME_FLAG_CORRUPT; + if (rd->qe_dst) { + MediaBufsStatus stat = qent_dst_wait(rd->qe_dst); + if (stat != MEDIABUFS_STATUS_SUCCESS) { + av_log(logctx, AV_LOG_ERROR, "%s: Decode fail\n", __func__); + frame->flags |= AV_FRAME_FLAG_CORRUPT; + } + } + + return 0; +} + +static inline struct timeval cvt_dpb_to_tv(uint64_t t) +{ + t /= 1000; + return (struct timeval){ + .tv_usec = t % 1000000, + .tv_sec = t / 1000000 + }; +} + +static inline uint64_t cvt_timestamp_to_dpb(const unsigned int t) +{ + return (uint64_t)t * 1000; +} + +static int v4l2_request_hevc_start_frame(AVCodecContext *avctx, + av_unused const uint8_t *buffer, + av_unused uint32_t size) +{ + const HEVCContext *h = avctx->priv_data; + V4L2MediaReqDescriptor *const rd = (V4L2MediaReqDescriptor *)h->ref->frame->data[0]; + V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; + +// av_log(NULL, AV_LOG_INFO, "%s\n", __func__); + decode_q_add(&ctx->decode_q, &rd->decode_ent); + + rd->num_slices = 0; + ctx->timestamp++; + rd->timestamp = cvt_timestamp_to_dpb(ctx->timestamp); + + { + FrameDecodeData * const fdd = (FrameDecodeData*)h->ref->frame->private_ref->data; + fdd->post_process = frame_post_process; + } + + // qe_dst needs to be bound to the data buffer and only returned when that is + if (!rd->qe_dst) + { + if ((rd->qe_dst = mediabufs_dst_qent_alloc(ctx->mbufs, ctx->dbufs)) == NULL) { + av_log(avctx, AV_LOG_ERROR, "%s: Failed to get dst buffer\n", __func__); + return AVERROR(ENOMEM); + } + } + + ff_thread_finish_setup(avctx); // Allow next thread to enter rpi_hevc_start_frame + + return 0; +} + +// Object fd & size will be zapped by this & need setting later +static int drm_from_format(AVDRMFrameDescriptor * const desc, const struct v4l2_format * const format) +{ + AVDRMLayerDescriptor *layer = &desc->layers[0]; + unsigned int width; + unsigned int height; + unsigned int bpl; + uint32_t pixelformat; + + if (V4L2_TYPE_IS_MULTIPLANAR(format->type)) { + width = format->fmt.pix_mp.width; + height = format->fmt.pix_mp.height; + pixelformat = format->fmt.pix_mp.pixelformat; + bpl = format->fmt.pix_mp.plane_fmt[0].bytesperline; + } + else { + width = format->fmt.pix.width; + height = format->fmt.pix.height; + pixelformat = format->fmt.pix.pixelformat; + bpl = format->fmt.pix.bytesperline; + } + + switch (pixelformat) { + case V4L2_PIX_FMT_NV12: + layer->format = DRM_FORMAT_NV12; + desc->objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; + break; +#if CONFIG_SAND + case V4L2_PIX_FMT_NV12_COL128: + layer->format = DRM_FORMAT_NV12; + desc->objects[0].format_modifier = DRM_FORMAT_MOD_BROADCOM_SAND128_COL_HEIGHT(bpl); + break; + case V4L2_PIX_FMT_NV12_10_COL128: + layer->format = DRM_FORMAT_P030; + desc->objects[0].format_modifier = DRM_FORMAT_MOD_BROADCOM_SAND128_COL_HEIGHT(bpl); + break; +#endif +#ifdef DRM_FORMAT_MOD_ALLWINNER_TILED + case V4L2_PIX_FMT_SUNXI_TILED_NV12: + layer->format = DRM_FORMAT_NV12; + desc->objects[0].format_modifier = DRM_FORMAT_MOD_ALLWINNER_TILED; + break; +#endif +#if defined(V4L2_PIX_FMT_NV15) && defined(DRM_FORMAT_NV15) + case V4L2_PIX_FMT_NV15: + layer->format = DRM_FORMAT_NV15; + desc->objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; + break; +#endif + case V4L2_PIX_FMT_NV16: + layer->format = DRM_FORMAT_NV16; + desc->objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; + break; +#if defined(V4L2_PIX_FMT_NV20) && defined(DRM_FORMAT_NV20) + case V4L2_PIX_FMT_NV20: + layer->format = DRM_FORMAT_NV20; + desc->objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; + break; +#endif + default: + return -1; + } + + desc->nb_objects = 1; + desc->objects[0].fd = -1; + desc->objects[0].size = 0; + + desc->nb_layers = 1; + layer->nb_planes = 2; + + layer->planes[0].object_index = 0; + layer->planes[0].offset = 0; + layer->planes[0].pitch = bpl; +#if CONFIG_SAND + if (pixelformat == V4L2_PIX_FMT_NV12_COL128) { + layer->planes[1].object_index = 0; + layer->planes[1].offset = height * 128; + layer->planes[0].pitch = width; + layer->planes[1].pitch = width; + } + else if (pixelformat == V4L2_PIX_FMT_NV12_10_COL128) { + layer->planes[1].object_index = 0; + layer->planes[1].offset = height * 128; + layer->planes[0].pitch = width * 2; // Lies but it keeps DRM import happy + layer->planes[1].pitch = width * 2; + } + else +#endif + { + layer->planes[1].object_index = 0; + layer->planes[1].offset = layer->planes[0].pitch * height; + layer->planes[1].pitch = layer->planes[0].pitch; + } + + return 0; +} + +static int +set_req_ctls(V4L2RequestContextHEVC *ctx, struct media_request * const mreq, + struct req_controls *const controls, +#if HEVC_CTRLS_VERSION >= 2 + struct v4l2_ctrl_hevc_decode_params * const dec, +#endif + struct v4l2_ctrl_hevc_slice_params * const slices, const unsigned int slice_count, + void * const offsets, const size_t offset_count) +{ + int rv; +#if HEVC_CTRLS_VERSION >= 2 + unsigned int n = 3; +#else + unsigned int n = 2; +#endif + + struct v4l2_ext_control control[6] = { + { + .id = V4L2_CID_STATELESS_HEVC_SPS, + .ptr = &controls->sps, + .size = sizeof(controls->sps), + }, + { + .id = V4L2_CID_STATELESS_HEVC_PPS, + .ptr = &controls->pps, + .size = sizeof(controls->pps), + }, +#if HEVC_CTRLS_VERSION >= 2 + { + .id = V4L2_CID_STATELESS_HEVC_DECODE_PARAMS, + .ptr = dec, + .size = sizeof(*dec), + }, +#endif + }; + + if (slices) + control[n++] = (struct v4l2_ext_control) { + .id = V4L2_CID_STATELESS_HEVC_SLICE_PARAMS, + .ptr = slices, + .size = sizeof(*slices) * slice_count, + }; + + if (controls->has_scaling) + control[n++] = (struct v4l2_ext_control) { + .id = V4L2_CID_STATELESS_HEVC_SCALING_MATRIX, + .ptr = &controls->scaling_matrix, + .size = sizeof(controls->scaling_matrix), + }; + +#if HEVC_CTRLS_VERSION >= 4 + if (offsets) + control[n++] = (struct v4l2_ext_control) { + .id = V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS, + .ptr = offsets, + .size = sizeof(((struct V4L2MediaReqDescriptor *)0)->offsets[0]) * offset_count, + }; +#endif + + rv = mediabufs_ctl_set_ext_ctrls(ctx->mbufs, mreq, control, n); + + return rv; +} + +// This only works because we started out from a single coded frame buffer +// that will remain intact until after end_frame +static int v4l2_request_hevc_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) +{ + const HEVCContext * const h = avctx->priv_data; + V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; + V4L2MediaReqDescriptor * const rd = (V4L2MediaReqDescriptor*)h->ref->frame->data[0]; + int bcount = get_bits_count(&h->HEVClc->gb); + uint32_t boff = (ptr_from_index(buffer, bcount/8 + 1) - (buffer + bcount/8 + 1)) * 8 + bcount; + + const unsigned int n = rd->num_slices; + const unsigned int block_start = (n / ctx->max_slices) * ctx->max_slices; + + int rv; + struct slice_info * si; + + // This looks dodgy but we know that FFmpeg has parsed this from a buffer + // that contains the entire frame including the start code + if (ctx->start_code == V4L2_STATELESS_HEVC_START_CODE_ANNEX_B) { + buffer -= 3; + size += 3; + boff += 24; + if (buffer[0] != 0 || buffer[1] != 0 || buffer[2] != 1) { + av_log(avctx, AV_LOG_ERROR, "Start code requested but missing %02x:%02x:%02x\n", + buffer[0], buffer[1], buffer[2]); + } + } + + if (ctx->decode_mode == V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED) { + if (rd->slices == NULL) { + if ((rd->slices = av_mallocz(sizeof(*rd->slices))) == NULL) + return AVERROR(ENOMEM); + rd->slices->ptr = buffer; + rd->num_slices = 1; + } + rd->slices->len = buffer - rd->slices->ptr + size; + return 0; + } + + if ((rv = slice_add(rd)) != 0) + return rv; + + si = rd->slices + n; + si->ptr = buffer; + si->len = size; + si->n_offsets = rd->num_offsets; + + if (n != block_start) { + struct slice_info *const si0 = rd->slices + block_start; + const size_t offset = (buffer - si0->ptr); + boff += offset * 8; + size += offset; + si0->len = si->len + offset; + } + +#if HEVC_CTRLS_VERSION >= 2 + if (n == 0) + fill_decode_params(h, &rd->dec); + fill_slice_params(h, &rd->dec, rd->slice_params + n, size * 8, boff); +#else + fill_slice_params(h, rd->slice_params + n, size * 8, boff); +#endif + if (ctx->max_offsets != 0 && + (rv = offsets_add(rd, h->sh.num_entry_point_offsets, h->sh.entry_point_offset)) != 0) + return rv; + + return 0; +} + +static void v4l2_request_hevc_abort_frame(AVCodecContext * const avctx) +{ + const HEVCContext * const h = avctx->priv_data; + if (h->ref != NULL) { + V4L2MediaReqDescriptor *const rd = (V4L2MediaReqDescriptor *)h->ref->frame->data[0]; + V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; + + media_request_abort(&rd->req); + mediabufs_src_qent_abort(ctx->mbufs, &rd->qe_src); + + decode_q_remove(&ctx->decode_q, &rd->decode_ent); + } +} + +static int send_slice(AVCodecContext * const avctx, + V4L2MediaReqDescriptor * const rd, + struct req_controls *const controls, + const unsigned int i, const unsigned int j) +{ + V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; + + const int is_last = (j == rd->num_slices); + struct slice_info *const si = rd->slices + i; + struct media_request * req = NULL; + struct qent_src * src = NULL; + MediaBufsStatus stat; + void * offsets = rd->offsets + rd->slices[i].n_offsets; + size_t n_offsets = (is_last ? rd->num_offsets : rd->slices[j].n_offsets) - rd->slices[i].n_offsets; + + if ((req = media_request_get(ctx->mpool)) == NULL) { + av_log(avctx, AV_LOG_ERROR, "%s: Failed to alloc media request\n", __func__); + return AVERROR(ENOMEM); + } + + if (set_req_ctls(ctx, req, + controls, +#if HEVC_CTRLS_VERSION >= 2 + &rd->dec, +#endif + rd->slice_params + i, j - i, + offsets, n_offsets)) { + av_log(avctx, AV_LOG_ERROR, "%s: Failed to set req ctls\n", __func__); + goto fail1; + } + + if ((src = mediabufs_src_qent_get(ctx->mbufs)) == NULL) { + av_log(avctx, AV_LOG_ERROR, "%s: Failed to get src buffer\n", __func__); + goto fail1; + } + + if (qent_src_data_copy(src, 0, si->ptr, si->len, ctx->dbufs) != 0) { + av_log(avctx, AV_LOG_ERROR, "%s: Failed data copy\n", __func__); + goto fail2; + } + + if (qent_src_params_set(src, &controls->tv)) { + av_log(avctx, AV_LOG_ERROR, "%s: Failed src param set\n", __func__); + goto fail2; + } + + stat = mediabufs_start_request(ctx->mbufs, &req, &src, + i == 0 ? rd->qe_dst : NULL, + is_last); + + if (stat != MEDIABUFS_STATUS_SUCCESS) { + av_log(avctx, AV_LOG_ERROR, "%s: Failed to start request\n", __func__); + return AVERROR_UNKNOWN; + } + return 0; + +fail2: + mediabufs_src_qent_abort(ctx->mbufs, &src); +fail1: + media_request_abort(&req); + return AVERROR_UNKNOWN; +} + +static int v4l2_request_hevc_end_frame(AVCodecContext *avctx) +{ + const HEVCContext * const h = avctx->priv_data; + V4L2MediaReqDescriptor *rd = (V4L2MediaReqDescriptor*)h->ref->frame->data[0]; + V4L2RequestContextHEVC *ctx = avctx->internal->hwaccel_priv_data; + struct req_controls rc; + unsigned int i; + int rv; + + // It is possible, though maybe a bug, to get an end_frame without + // a previous start_frame. If we do then give up. + if (!decode_q_in_q(&rd->decode_ent)) { + av_log(avctx, AV_LOG_DEBUG, "%s: Frame not in decode Q\n", __func__); + return AVERROR_INVALIDDATA; + } + + { + const ScalingList *sl = h->ps.pps->scaling_list_data_present_flag ? + &h->ps.pps->scaling_list : + h->ps.sps->scaling_list_enable_flag ? + &h->ps.sps->scaling_list : NULL; + + + memset(&rc, 0, sizeof(rc)); + rc.tv = cvt_dpb_to_tv(rd->timestamp); + fill_sps(&rc.sps, h->ps.sps); + fill_pps(&rc.pps, h->ps.pps); + if (sl) { + rc.has_scaling = 1; + fill_scaling_matrix(sl, &rc.scaling_matrix); + } + } + + decode_q_wait(&ctx->decode_q, &rd->decode_ent); + + // qe_dst needs to be bound to the data buffer and only returned when that is + // Alloc almost certainly wants to be serialised if there is any chance of blocking + // so we get the next frame to be free in the thread that needs it for decode first. + // + // In our current world this probably isn't a concern but put it here anyway + if (!rd->qe_dst) + { + if ((rd->qe_dst = mediabufs_dst_qent_alloc(ctx->mbufs, ctx->dbufs)) == NULL) { + av_log(avctx, AV_LOG_ERROR, "%s: Failed to get dst buffer\n", __func__); + rv = AVERROR(ENOMEM); + goto fail; + } + } + + // Send as slices + for (i = 0; i < rd->num_slices; i += ctx->max_slices) { + const unsigned int e = FFMIN(rd->num_slices, i + ctx->max_slices); + if ((rv = send_slice(avctx, rd, &rc, i, e)) != 0) + goto fail; + } + + // Set the drm_prime desriptor + drm_from_format(&rd->drm, mediabufs_dst_fmt(ctx->mbufs)); + rd->drm.objects[0].fd = dmabuf_fd(qent_dst_dmabuf(rd->qe_dst, 0)); + rd->drm.objects[0].size = dmabuf_size(qent_dst_dmabuf(rd->qe_dst, 0)); + + decode_q_remove(&ctx->decode_q, &rd->decode_ent); + return 0; + +fail: + decode_q_remove(&ctx->decode_q, &rd->decode_ent); + return rv; +} + +static inline int +ctrl_valid(const struct v4l2_query_ext_ctrl * const c, const int64_t v) +{ + return v >= c->minimum && v <= c->maximum; +} + +// Initial check & init +static int +probe(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) +{ + const HEVCContext *h = avctx->priv_data; + const HEVCSPS * const sps = h->ps.sps; + struct v4l2_ctrl_hevc_sps ctrl_sps; + unsigned int i; + + // Check for var slice array + struct v4l2_query_ext_ctrl qc[] = { + { .id = V4L2_CID_STATELESS_HEVC_SLICE_PARAMS }, + { .id = V4L2_CID_STATELESS_HEVC_DECODE_MODE, }, + { .id = V4L2_CID_STATELESS_HEVC_SPS }, + { .id = V4L2_CID_STATELESS_HEVC_PPS }, + { .id = V4L2_CID_STATELESS_HEVC_SCALING_MATRIX }, +#if HEVC_CTRLS_VERSION >= 2 + { .id = V4L2_CID_STATELESS_HEVC_DECODE_PARAMS }, +#endif + }; + // Order & size must match! + static const size_t ctrl_sizes[] = { + sizeof(struct v4l2_ctrl_hevc_slice_params), + sizeof(int32_t), + sizeof(struct v4l2_ctrl_hevc_sps), + sizeof(struct v4l2_ctrl_hevc_pps), + sizeof(struct v4l2_ctrl_hevc_scaling_matrix), +#if HEVC_CTRLS_VERSION >= 2 + sizeof(struct v4l2_ctrl_hevc_decode_params), +#endif + }; + const unsigned int noof_ctrls = FF_ARRAY_ELEMS(qc); + +#if HEVC_CTRLS_VERSION == 2 + if (mediabufs_ctl_driver_version(ctx->mbufs) >= MEDIABUFS_DRIVER_VERSION(5, 18, 0)) + return AVERROR(EINVAL); +#elif HEVC_CTRLS_VERSION == 3 + if (mediabufs_ctl_driver_version(ctx->mbufs) < MEDIABUFS_DRIVER_VERSION(5, 18, 0)) + return AVERROR(EINVAL); +#endif + + mediabufs_ctl_query_ext_ctrls(ctx->mbufs, qc, noof_ctrls); + i = 0; +#if HEVC_CTRLS_VERSION >= 4 + // Skip slice check if no slice mode + if (qc[1].type != 0 && !ctrl_valid(qc + 1, V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED)) + i = 1; +#else + // Fail frame mode silently for anything prior to V4 + if (qc[1].type == 0 || !ctrl_valid(qc + 1, V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED)) + return AVERROR(EINVAL); +#endif + for (; i != noof_ctrls; ++i) { + if (qc[i].type == 0) { + av_log(avctx, AV_LOG_DEBUG, "Probed V%d control %#x missing\n", HEVC_CTRLS_VERSION, qc[i].id); + return AVERROR(EINVAL); + } + if (ctrl_sizes[i] != (size_t)qc[i].elem_size) { + av_log(avctx, AV_LOG_DEBUG, "Probed V%d control %d size mismatch %zu != %zu\n", + HEVC_CTRLS_VERSION, i, ctrl_sizes[i], (size_t)qc[i].elem_size); + return AVERROR(EINVAL); + } + } + + fill_sps(&ctrl_sps, sps); + + if (mediabufs_set_ext_ctrl(ctx->mbufs, NULL, V4L2_CID_STATELESS_HEVC_SPS, &ctrl_sps, sizeof(ctrl_sps))) { + av_log(avctx, AV_LOG_ERROR, "Failed to set initial SPS\n"); + return AVERROR(EINVAL); + } + + return 0; +} + +// Final init +static int +set_controls(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) +{ + int ret; + + struct v4l2_query_ext_ctrl querys[] = { + { .id = V4L2_CID_STATELESS_HEVC_DECODE_MODE, }, + { .id = V4L2_CID_STATELESS_HEVC_START_CODE, }, + { .id = V4L2_CID_STATELESS_HEVC_SLICE_PARAMS, }, +#if HEVC_CTRLS_VERSION >= 4 + { .id = V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS, }, +#endif + }; + + struct v4l2_ext_control ctrls[] = { + { .id = V4L2_CID_STATELESS_HEVC_DECODE_MODE, }, + { .id = V4L2_CID_STATELESS_HEVC_START_CODE, }, + }; + + mediabufs_ctl_query_ext_ctrls(ctx->mbufs, querys, FF_ARRAY_ELEMS(querys)); + + ctx->max_slices = (!(querys[2].flags & V4L2_CTRL_FLAG_DYNAMIC_ARRAY) || + querys[2].nr_of_dims != 1 || querys[2].dims[0] == 0) ? + 1 : querys[2].dims[0]; + av_log(avctx, AV_LOG_DEBUG, "%s: Max slices %d\n", __func__, ctx->max_slices); + +#if HEVC_CTRLS_VERSION >= 4 + ctx->max_offsets = (querys[3].type == 0 || querys[3].nr_of_dims != 1) ? + 0 : querys[3].dims[0]; + av_log(avctx, AV_LOG_DEBUG, "%s: Entry point offsets %d\n", __func__, ctx->max_offsets); +#else + ctx->max_offsets = 0; +#endif + + if (querys[0].default_value == V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED || + querys[0].default_value == V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED) + ctx->decode_mode = querys[0].default_value; + else if (ctrl_valid(querys + 0, V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED)) + ctx->decode_mode = V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED; + else if (ctrl_valid(querys + 0, V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED)) + ctx->decode_mode = V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED; + else { + av_log(avctx, AV_LOG_ERROR, "%s: unsupported decode mode\n", __func__); + return AVERROR(EINVAL); + } + + if (querys[1].default_value == V4L2_STATELESS_HEVC_START_CODE_NONE || + querys[1].default_value == V4L2_STATELESS_HEVC_START_CODE_ANNEX_B) + ctx->start_code = querys[1].default_value; + else if (ctrl_valid(querys + 1, V4L2_STATELESS_HEVC_START_CODE_ANNEX_B)) + ctx->start_code = V4L2_STATELESS_HEVC_START_CODE_ANNEX_B; + else if (ctrl_valid(querys + 1, V4L2_STATELESS_HEVC_START_CODE_NONE)) + ctx->start_code = V4L2_STATELESS_HEVC_START_CODE_NONE; + else { + av_log(avctx, AV_LOG_ERROR, "%s: unsupported start code\n", __func__); + return AVERROR(EINVAL); + } + + // If we are in slice mode & START_CODE_NONE supported then pick that + // as it doesn't require the slightly dodgy look backwards in our raw buffer + if (ctx->decode_mode == V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED && + ctrl_valid(querys + 1, V4L2_STATELESS_HEVC_START_CODE_NONE)) + ctx->start_code = V4L2_STATELESS_HEVC_START_CODE_NONE; + + ctrls[0].value = ctx->decode_mode; + ctrls[1].value = ctx->start_code; + + ret = mediabufs_ctl_set_ext_ctrls(ctx->mbufs, NULL, ctrls, FF_ARRAY_ELEMS(ctrls)); + return !ret ? 0 : AVERROR(-ret); +} + +static void v4l2_req_frame_free(void *opaque, uint8_t *data) +{ + AVCodecContext *avctx = opaque; + V4L2MediaReqDescriptor * const rd = (V4L2MediaReqDescriptor*)data; + + av_log(NULL, AV_LOG_DEBUG, "%s: avctx=%p data=%p\n", __func__, avctx, data); + + qent_dst_unref(&rd->qe_dst); + + // We don't expect req or qe_src to be set + if (rd->req || rd->qe_src) + av_log(NULL, AV_LOG_ERROR, "%s: qe_src %p or req %p not NULL\n", __func__, rd->req, rd->qe_src); + + av_freep(&rd->slices); + av_freep(&rd->slice_params); + av_freep(&rd->offsets); + + av_free(rd); +} + +static AVBufferRef *v4l2_req_frame_alloc(void *opaque, int size) +{ + AVCodecContext *avctx = opaque; +// V4L2RequestContextHEVC *ctx = avctx->internal->hwaccel_priv_data; +// V4L2MediaReqDescriptor *req; + AVBufferRef *ref; + uint8_t *data; +// int ret; + + data = av_mallocz(size); + if (!data) + return NULL; + + av_log(avctx, AV_LOG_DEBUG, "%s: avctx=%p size=%d data=%p\n", __func__, avctx, size, data); + ref = av_buffer_create(data, size, v4l2_req_frame_free, avctx, 0); + if (!ref) { + av_freep(&data); + return NULL; + } + return ref; +} + +#if 0 +static void v4l2_req_pool_free(void *opaque) +{ + av_log(NULL, AV_LOG_DEBUG, "%s: opaque=%p\n", __func__, opaque); +} + +static void v4l2_req_hwframe_ctx_free(AVHWFramesContext *hwfc) +{ + av_log(NULL, AV_LOG_DEBUG, "%s: hwfc=%p pool=%p\n", __func__, hwfc, hwfc->pool); + + av_buffer_pool_uninit(&hwfc->pool); +} +#endif + +static int frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx) +{ + V4L2RequestContextHEVC *ctx = avctx->internal->hwaccel_priv_data; + AVHWFramesContext *hwfc = (AVHWFramesContext*)hw_frames_ctx->data; + const struct v4l2_format *vfmt = mediabufs_dst_fmt(ctx->mbufs); + + hwfc->format = AV_PIX_FMT_DRM_PRIME; + hwfc->sw_format = pixel_format_from_format(vfmt); + if (V4L2_TYPE_IS_MULTIPLANAR(vfmt->type)) { + hwfc->width = vfmt->fmt.pix_mp.width; + hwfc->height = vfmt->fmt.pix_mp.height; + } else { + hwfc->width = vfmt->fmt.pix.width; + hwfc->height = vfmt->fmt.pix.height; + } +#if 0 + hwfc->pool = av_buffer_pool_init2(sizeof(V4L2MediaReqDescriptor), avctx, v4l2_req_frame_alloc, v4l2_req_pool_free); + if (!hwfc->pool) + return AVERROR(ENOMEM); + + hwfc->free = v4l2_req_hwframe_ctx_free; + + hwfc->initial_pool_size = 1; + + switch (avctx->codec_id) { + case AV_CODEC_ID_VP9: + hwfc->initial_pool_size += 8; + break; + case AV_CODEC_ID_VP8: + hwfc->initial_pool_size += 3; + break; + default: + hwfc->initial_pool_size += 2; + } +#endif + av_log(avctx, AV_LOG_DEBUG, "%s: avctx=%p ctx=%p hw_frames_ctx=%p hwfc=%p pool=%p width=%d height=%d initial_pool_size=%d\n", __func__, avctx, ctx, hw_frames_ctx, hwfc, hwfc->pool, hwfc->width, hwfc->height, hwfc->initial_pool_size); + + return 0; +} + +static int alloc_frame(AVCodecContext * avctx, AVFrame *frame) +{ + int rv; + + frame->buf[0] = v4l2_req_frame_alloc(avctx, sizeof(V4L2MediaReqDescriptor)); + if (!frame->buf[0]) + return AVERROR(ENOMEM); + + frame->data[0] = frame->buf[0]->data; + + frame->hw_frames_ctx = av_buffer_ref(avctx->hw_frames_ctx); + + if ((rv = ff_attach_decode_data(frame)) != 0) { + av_log(avctx, AV_LOG_ERROR, "Failed to attach decode data to frame\n"); + av_frame_unref(frame); + return rv; + } + + return 0; +} + +const v4l2_req_decode_fns V(ff_v4l2_req_hevc) = { + .src_pix_fmt_v4l2 = V4L2_PIX_FMT_HEVC_SLICE, + .name = "V4L2 HEVC stateless V" STR(HEVC_CTRLS_VERSION), + .probe = probe, + .set_controls = set_controls, + + .start_frame = v4l2_request_hevc_start_frame, + .decode_slice = v4l2_request_hevc_decode_slice, + .end_frame = v4l2_request_hevc_end_frame, + .abort_frame = v4l2_request_hevc_abort_frame, + .frame_params = frame_params, + .alloc_frame = alloc_frame, +}; + diff --git a/libavcodec/v4l2_req_media.c b/libavcodec/v4l2_req_media.c new file mode 100644 index 0000000000..1a9944774a --- /dev/null +++ b/libavcodec/v4l2_req_media.c @@ -0,0 +1,1802 @@ +/* + * Copyright (C) 2018 Paul Kocialkowski + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "v4l2_req_dmabufs.h" +#include "v4l2_req_media.h" +#include "v4l2_req_pollqueue.h" +#include "v4l2_req_utils.h" +#include "weak_link.h" + + +/* floor(log2(x)) */ +static unsigned int log2_size(size_t x) +{ + unsigned int n = 0; + + if (x & ~0xffff) { + n += 16; + x >>= 16; + } + if (x & ~0xff) { + n += 8; + x >>= 8; + } + if (x & ~0xf) { + n += 4; + x >>= 4; + } + if (x & ~3) { + n += 2; + x >>= 2; + } + return (x & ~1) ? n + 1 : n; +} + +static size_t round_up_size(const size_t x) +{ + /* Admit no size < 256 */ + const unsigned int n = x < 256 ? 8 : log2_size(x) - 1; + + return x >= (3 << n) ? 4 << n : (3 << n); +} + +struct media_request; + +struct media_pool { + int fd; + sem_t sem; + pthread_mutex_t lock; + struct media_request * free_reqs; + struct pollqueue * pq; +}; + +struct media_request { + struct media_request * next; + struct media_pool * mp; + int fd; + struct polltask * pt; +}; + +static inline enum v4l2_memory +mediabufs_memory_to_v4l2(const enum mediabufs_memory m) +{ + return (enum v4l2_memory)m; +} + +const char * +mediabufs_memory_name(const enum mediabufs_memory m) +{ + switch (m) { + case MEDIABUFS_MEMORY_UNSET: + return "Unset"; + case MEDIABUFS_MEMORY_MMAP: + return "MMap"; + case MEDIABUFS_MEMORY_USERPTR: + return "UserPtr"; + case MEDIABUFS_MEMORY_OVERLAY: + return "Overlay"; + case MEDIABUFS_MEMORY_DMABUF: + return "DMABuf"; + default: + break; + } + return "Unknown"; +} + + +static inline int do_trywait(sem_t *const sem) +{ + while (sem_trywait(sem)) { + if (errno != EINTR) + return -errno; + } + return 0; +} + +static inline int do_wait(sem_t *const sem) +{ + while (sem_wait(sem)) { + if (errno != EINTR) + return -errno; + } + return 0; +} + +static int request_buffers(int video_fd, unsigned int type, + enum mediabufs_memory memory, unsigned int buffers_count) +{ + struct v4l2_requestbuffers buffers; + int rc; + + memset(&buffers, 0, sizeof(buffers)); + buffers.type = type; + buffers.memory = mediabufs_memory_to_v4l2(memory); + buffers.count = buffers_count; + + rc = ioctl(video_fd, VIDIOC_REQBUFS, &buffers); + if (rc < 0) { + rc = -errno; + request_log("Unable to request %d type %d buffers: %s\n", buffers_count, type, strerror(-rc)); + return rc; + } + + return 0; +} + + +static int set_stream(int video_fd, unsigned int type, bool enable) +{ + enum v4l2_buf_type buf_type = type; + int rc; + + rc = ioctl(video_fd, enable ? VIDIOC_STREAMON : VIDIOC_STREAMOFF, + &buf_type); + if (rc < 0) { + rc = -errno; + request_log("Unable to %sable stream: %s\n", + enable ? "en" : "dis", strerror(-rc)); + return rc; + } + + return 0; +} + + + +struct media_request * media_request_get(struct media_pool * const mp) +{ + struct media_request *req = NULL; + + /* Timeout handled by poll code */ + if (do_wait(&mp->sem)) + return NULL; + + pthread_mutex_lock(&mp->lock); + req = mp->free_reqs; + if (req) { + mp->free_reqs = req->next; + req->next = NULL; + } + pthread_mutex_unlock(&mp->lock); + return req; +} + +int media_request_fd(const struct media_request * const req) +{ + return req->fd; +} + +int media_request_start(struct media_request * const req) +{ + while (ioctl(req->fd, MEDIA_REQUEST_IOC_QUEUE, NULL) == -1) + { + const int err = errno; + if (err == EINTR) + continue; + request_log("%s: Failed to Q media: (%d) %s\n", __func__, err, strerror(err)); + return -err; + } + + pollqueue_add_task(req->pt, 2000); + return 0; +} + +static void media_request_done(void *v, short revents) +{ + struct media_request *const req = v; + struct media_pool *const mp = req->mp; + + /* ** Not sure what to do about timeout */ + + if (ioctl(req->fd, MEDIA_REQUEST_IOC_REINIT, NULL) < 0) + request_log("Unable to reinit media request: %s\n", + strerror(errno)); + + pthread_mutex_lock(&mp->lock); + req->next = mp->free_reqs; + mp->free_reqs = req; + pthread_mutex_unlock(&mp->lock); + sem_post(&mp->sem); +} + +int media_request_abort(struct media_request ** const preq) +{ + struct media_request * const req = *preq; + + if (req == NULL) + return 0; + *preq = NULL; + + media_request_done(req, 0); + return 0; +} + +static void delete_req_chain(struct media_request * const chain) +{ + struct media_request * next = chain; + while (next) { + struct media_request * const req = next; + next = req->next; + if (req->pt) + polltask_delete(&req->pt); + if (req->fd != -1) + close(req->fd); + free(req); + } +} + +struct media_pool * media_pool_new(const char * const media_path, + struct pollqueue * const pq, + const unsigned int n) +{ + struct media_pool * const mp = calloc(1, sizeof(*mp)); + unsigned int i; + + if (!mp) + goto fail0; + + mp->pq = pq; + pthread_mutex_init(&mp->lock, NULL); + mp->fd = open(media_path, O_RDWR | O_NONBLOCK); + if (mp->fd == -1) { + request_log("Failed to open '%s': %s\n", media_path, strerror(errno)); + goto fail1; + } + + for (i = 0; i != n; ++i) { + struct media_request * req = malloc(sizeof(*req)); + if (!req) + goto fail4; + + *req = (struct media_request){ + .next = mp->free_reqs, + .mp = mp, + .fd = -1 + }; + mp->free_reqs = req; + + if (ioctl(mp->fd, MEDIA_IOC_REQUEST_ALLOC, &req->fd) == -1) { + request_log("Failed to alloc request %d: %s\n", i, strerror(errno)); + goto fail4; + } + + req->pt = polltask_new(pq, req->fd, POLLPRI, media_request_done, req); + if (!req->pt) + goto fail4; + } + + sem_init(&mp->sem, 0, n); + + return mp; + +fail4: + delete_req_chain(mp->free_reqs); + close(mp->fd); + pthread_mutex_destroy(&mp->lock); +fail1: + free(mp); +fail0: + return NULL; +} + +void media_pool_delete(struct media_pool ** pMp) +{ + struct media_pool * const mp = *pMp; + + if (!mp) + return; + *pMp = NULL; + + delete_req_chain(mp->free_reqs); + close(mp->fd); + sem_destroy(&mp->sem); + pthread_mutex_destroy(&mp->lock); + free(mp); +} + + +#define INDEX_UNSET (~(uint32_t)0) + +enum qent_status { + QENT_NEW = 0, // Initial state - shouldn't last + QENT_FREE, // On free chain + QENT_PENDING, // User has ent + QENT_WAITING, // On inuse + QENT_DONE, // Frame rx + QENT_ERROR, // Error + QENT_IMPORT +}; + +struct qent_base { + atomic_int ref_count; + struct qent_base *next; + struct qent_base *prev; + enum qent_status status; + enum mediabufs_memory memtype; + uint32_t index; + struct dmabuf_h *dh[VIDEO_MAX_PLANES]; + struct timeval timestamp; +}; + +struct qent_src { + struct qent_base base; + int fixed_size; +}; + +struct qent_dst { + struct qent_base base; + bool waiting; + pthread_mutex_t lock; + pthread_cond_t cond; + struct ff_weak_link_client * mbc_wl; +}; + +struct qe_list_head { + struct qent_base *head; + struct qent_base *tail; +}; + +struct buf_pool { + enum mediabufs_memory memtype; + pthread_mutex_t lock; + sem_t free_sem; + struct qe_list_head free; + struct qe_list_head inuse; +}; + + +static inline struct qent_dst *base_to_dst(struct qent_base *be) +{ + return (struct qent_dst *)be; +} + +static inline struct qent_src *base_to_src(struct qent_base *be) +{ + return (struct qent_src *)be; +} + + +#define QENT_BASE_INITIALIZER(mtype) {\ + .ref_count = ATOMIC_VAR_INIT(0),\ + .status = QENT_NEW,\ + .memtype = (mtype),\ + .index = INDEX_UNSET\ +} + +static void qe_base_uninit(struct qent_base *const be) +{ + unsigned int i; + for (i = 0; i != VIDEO_MAX_PLANES; ++i) { + dmabuf_free(be->dh[i]); + be->dh[i] = NULL; + } +} + +static void qe_src_free(struct qent_src *const be_src) +{ + if (!be_src) + return; + qe_base_uninit(&be_src->base); + free(be_src); +} + +static struct qent_src * qe_src_new(enum mediabufs_memory mtype) +{ + struct qent_src *const be_src = malloc(sizeof(*be_src)); + if (!be_src) + return NULL; + *be_src = (struct qent_src){ + .base = QENT_BASE_INITIALIZER(mtype) + }; + return be_src; +} + +static void qe_dst_free(struct qent_dst *const be_dst) +{ + if (!be_dst) + return; + + ff_weak_link_unref(&be_dst->mbc_wl); + pthread_cond_destroy(&be_dst->cond); + pthread_mutex_destroy(&be_dst->lock); + qe_base_uninit(&be_dst->base); + free(be_dst); +} + +static struct qent_dst* qe_dst_new(struct ff_weak_link_master * const wl, const enum mediabufs_memory memtype) +{ + struct qent_dst *const be_dst = malloc(sizeof(*be_dst)); + if (!be_dst) + return NULL; + *be_dst = (struct qent_dst){ + .base = QENT_BASE_INITIALIZER(memtype), + .lock = PTHREAD_MUTEX_INITIALIZER, + .cond = PTHREAD_COND_INITIALIZER, + .mbc_wl = ff_weak_link_ref(wl) + }; + return be_dst; +} + +static void ql_add_tail(struct qe_list_head * const ql, struct qent_base * be) +{ + if (ql->tail) + ql->tail->next = be; + else + ql->head = be; + be->prev = ql->tail; + be->next = NULL; + ql->tail = be; +} + +static struct qent_base * ql_extract(struct qe_list_head * const ql, struct qent_base * be) +{ + if (!be) + return NULL; + + if (be->next) + be->next->prev = be->prev; + else + ql->tail = be->prev; + if (be->prev) + be->prev->next = be->next; + else + ql->head = be->next; + be->next = NULL; + be->prev = NULL; + return be; +} + + +static void bq_put_free(struct buf_pool *const bp, struct qent_base * be) +{ + ql_add_tail(&bp->free, be); +} + +static struct qent_base * bq_get_free(struct buf_pool *const bp) +{ + return ql_extract(&bp->free, bp->free.head); +} + +static struct qent_base * bq_extract_inuse(struct buf_pool *const bp, struct qent_base *const be) +{ + return ql_extract(&bp->inuse, be); +} + +static struct qent_base * bq_get_inuse(struct buf_pool *const bp) +{ + return ql_extract(&bp->inuse, bp->inuse.head); +} + +static void bq_free_all_free_src(struct buf_pool *const bp) +{ + struct qent_base *be; + while ((be = bq_get_free(bp)) != NULL) + qe_src_free(base_to_src(be)); +} + +static void bq_free_all_inuse_src(struct buf_pool *const bp) +{ + struct qent_base *be; + while ((be = bq_get_inuse(bp)) != NULL) + qe_src_free(base_to_src(be)); +} + +static void bq_free_all_free_dst(struct buf_pool *const bp) +{ + struct qent_base *be; + while ((be = bq_get_free(bp)) != NULL) + qe_dst_free(base_to_dst(be)); +} + +static void queue_put_free(struct buf_pool *const bp, struct qent_base *be) +{ + unsigned int i; + + pthread_mutex_lock(&bp->lock); + /* Clear out state vars */ + be->timestamp.tv_sec = 0; + be->timestamp.tv_usec = 0; + be->status = QENT_FREE; + for (i = 0; i < VIDEO_MAX_PLANES && be->dh[i]; ++i) + dmabuf_len_set(be->dh[i], 0); + bq_put_free(bp, be); + pthread_mutex_unlock(&bp->lock); + sem_post(&bp->free_sem); +} + +static bool queue_is_inuse(const struct buf_pool *const bp) +{ + return bp->inuse.tail != NULL; +} + +static void queue_put_inuse(struct buf_pool *const bp, struct qent_base *be) +{ + if (!be) + return; + pthread_mutex_lock(&bp->lock); + ql_add_tail(&bp->inuse, be); + be->status = QENT_WAITING; + pthread_mutex_unlock(&bp->lock); +} + +static struct qent_base *queue_get_free(struct buf_pool *const bp) +{ + struct qent_base *buf; + + if (do_wait(&bp->free_sem)) + return NULL; + pthread_mutex_lock(&bp->lock); + buf = bq_get_free(bp); + pthread_mutex_unlock(&bp->lock); + return buf; +} + +static struct qent_base *queue_tryget_free(struct buf_pool *const bp) +{ + struct qent_base *buf; + + if (do_trywait(&bp->free_sem)) + return NULL; + pthread_mutex_lock(&bp->lock); + buf = bq_get_free(bp); + pthread_mutex_unlock(&bp->lock); + return buf; +} + +static struct qent_base * queue_find_extract_index(struct buf_pool *const bp, const unsigned int index) +{ + struct qent_base *be; + + pthread_mutex_lock(&bp->lock); + /* Expect 1st in Q, but allow anywhere */ + for (be = bp->inuse.head; be; be = be->next) { + if (be->index == index) { + bq_extract_inuse(bp, be); + break; + } + } + pthread_mutex_unlock(&bp->lock); + + return be; +} + +static void queue_delete(struct buf_pool *const bp) +{ + sem_destroy(&bp->free_sem); + pthread_mutex_destroy(&bp->lock); + free(bp); +} + +static struct buf_pool* queue_new(const int vfd) +{ + struct buf_pool *bp = calloc(1, sizeof(*bp)); + if (!bp) + return NULL; + pthread_mutex_init(&bp->lock, NULL); + sem_init(&bp->free_sem, 0, 0); + return bp; +} + + +struct mediabufs_ctl { + atomic_int ref_count; /* 0 is single ref for easier atomics */ + void * dc; + int vfd; + bool stream_on; + bool polling; + bool dst_fixed; // Dst Q is fixed size + pthread_mutex_t lock; + struct buf_pool * src; + struct buf_pool * dst; + struct polltask * pt; + struct pollqueue * pq; + struct ff_weak_link_master * this_wlm; + + enum mediabufs_memory src_memtype; + enum mediabufs_memory dst_memtype; + struct v4l2_format src_fmt; + struct v4l2_format dst_fmt; + struct v4l2_capability capability; +}; + +static int qe_v4l2_queue(struct qent_base *const be, + const int vfd, struct media_request *const mreq, + const struct v4l2_format *const fmt, + const bool is_dst, const bool hold_flag) +{ + struct v4l2_buffer buffer = { + .type = fmt->type, + .memory = mediabufs_memory_to_v4l2(be->memtype), + .index = be->index + }; + struct v4l2_plane planes[VIDEO_MAX_PLANES] = {{0}}; + + if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { + unsigned int i; + for (i = 0; i < VIDEO_MAX_PLANES && be->dh[i]; ++i) { + if (is_dst) + dmabuf_len_set(be->dh[i], 0); + + /* *** Really need a pixdesc rather than a format so we can fill in data_offset */ + planes[i].length = dmabuf_size(be->dh[i]); + planes[i].bytesused = dmabuf_len(be->dh[i]); + if (be->memtype == MEDIABUFS_MEMORY_DMABUF) + planes[i].m.fd = dmabuf_fd(be->dh[i]); + else + planes[i].m.mem_offset = 0; + } + buffer.m.planes = planes; + buffer.length = i; + } + else { + if (is_dst) + dmabuf_len_set(be->dh[0], 0); + + buffer.bytesused = dmabuf_len(be->dh[0]); + buffer.length = dmabuf_size(be->dh[0]); + if (be->memtype == MEDIABUFS_MEMORY_DMABUF) + buffer.m.fd = dmabuf_fd(be->dh[0]); + else + buffer.m.offset = 0; + } + + if (!is_dst && mreq) { + buffer.flags |= V4L2_BUF_FLAG_REQUEST_FD; + buffer.request_fd = media_request_fd(mreq); + if (hold_flag) + buffer.flags |= V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF; + } + + if (is_dst) + be->timestamp = (struct timeval){0,0}; + + buffer.timestamp = be->timestamp; + + while (ioctl(vfd, VIDIOC_QBUF, &buffer)) { + const int err = errno; + if (err != EINTR) { + request_log("%s: Failed to Q buffer: err=%d (%s)\n", __func__, err, strerror(err)); + return -err; + } + } + return 0; +} + +static struct qent_base * qe_dequeue(struct buf_pool *const bp, + const int vfd, + const struct v4l2_format * const f) +{ + struct qent_base *be; + int rc; + const bool mp = V4L2_TYPE_IS_MULTIPLANAR(f->type); + struct v4l2_plane planes[VIDEO_MAX_PLANES] = {{0}}; + struct v4l2_buffer buffer = { + .type = f->type, + .memory = mediabufs_memory_to_v4l2(bp->memtype) + }; + if (mp) { + buffer.length = f->fmt.pix_mp.num_planes; + buffer.m.planes = planes; + } + + while ((rc = ioctl(vfd, VIDIOC_DQBUF, &buffer)) != 0 && + errno == EINTR) + /* Loop */; + if (rc) { + request_log("Error DQing buffer type %d: %s\n", f->type, strerror(errno)); + return NULL; + } + + be = queue_find_extract_index(bp, buffer.index); + if (!be) { + request_log("Failed to find index %d in Q\n", buffer.index); + return NULL; + } + + if (mp) { + unsigned int i; + for (i = 0; i != buffer.length; ++i) + dmabuf_len_set(be->dh[i], V4L2_TYPE_IS_CAPTURE(f->type) ? planes[i].bytesused : 0); + } + else + dmabuf_len_set(be->dh[0], V4L2_TYPE_IS_CAPTURE(f->type) ? buffer.length : 0); + + be->timestamp = buffer.timestamp; + be->status = (buffer.flags & V4L2_BUF_FLAG_ERROR) ? QENT_ERROR : QENT_DONE; + return be; +} + +static void qe_dst_done(struct qent_dst * dst_be) +{ + pthread_mutex_lock(&dst_be->lock); + dst_be->waiting = false; + pthread_cond_broadcast(&dst_be->cond); + pthread_mutex_unlock(&dst_be->lock); + + qent_dst_unref(&dst_be); +} + +static bool qe_dst_waiting(struct qent_dst *const dst_be) +{ + bool waiting; + pthread_mutex_lock(&dst_be->lock); + waiting = dst_be->waiting; + dst_be->waiting = true; + pthread_mutex_unlock(&dst_be->lock); + return waiting; +} + + +static bool mediabufs_wants_poll(const struct mediabufs_ctl *const mbc) +{ + return queue_is_inuse(mbc->src) || queue_is_inuse(mbc->dst); +} + +static void mediabufs_poll_cb(void * v, short revents) +{ + struct mediabufs_ctl *mbc = v; + struct qent_src *src_be = NULL; + struct qent_dst *dst_be = NULL; + + if (!revents) + request_err(mbc->dc, "%s: Timeout\n", __func__); + + pthread_mutex_lock(&mbc->lock); + mbc->polling = false; + + if ((revents & POLLOUT) != 0) + src_be = base_to_src(qe_dequeue(mbc->src, mbc->vfd, &mbc->src_fmt)); + if ((revents & POLLIN) != 0) + dst_be = base_to_dst(qe_dequeue(mbc->dst, mbc->vfd, &mbc->dst_fmt)); + + /* Reschedule */ + if (mediabufs_wants_poll(mbc)) { + mbc->polling = true; + pollqueue_add_task(mbc->pt, 2000); + } + pthread_mutex_unlock(&mbc->lock); + + if (src_be) + queue_put_free(mbc->src, &src_be->base); + if (dst_be) + qe_dst_done(dst_be); +} + +int qent_src_params_set(struct qent_src *const be_src, const struct timeval * timestamp) +{ + struct qent_base *const be = &be_src->base; + + be->timestamp = *timestamp; + return 0; +} + +struct timeval qent_dst_timestamp_get(const struct qent_dst *const be_dst) +{ + return be_dst->base.timestamp; +} + +static int qent_base_realloc(struct qent_base *const be, const size_t len, struct dmabufs_ctl * dbsc) +{ + if (!be->dh[0] || len > dmabuf_size(be->dh[0])) { + size_t newsize = round_up_size(len); + request_log("%s: Overrun %zd > %zd; trying %zd\n", __func__, len, dmabuf_size(be->dh[0]), newsize); + if (!dbsc) { + request_log("%s: No dmbabuf_ctrl for realloc\n", __func__); + return -ENOMEM; + } + if ((be->dh[0] = dmabuf_realloc(dbsc, be->dh[0], newsize)) == NULL) { + request_log("%s: Realloc %zd failed\n", __func__, newsize); + return -ENOMEM; + } + } + return 0; +} + +int qent_src_alloc(struct qent_src *const be_src, const size_t len, struct dmabufs_ctl * dbsc) +{ + struct qent_base *const be = &be_src->base; + return qent_base_realloc(be, len, dbsc); +} + + +int qent_src_data_copy(struct qent_src *const be_src, const size_t offset, const void *const src, const size_t len, struct dmabufs_ctl * dbsc) +{ + void * dst; + struct qent_base *const be = &be_src->base; + int rv; + + // Realloc doesn't copy so don't alloc if offset != 0 + if ((rv = qent_base_realloc(be, offset + len, + be_src->fixed_size || offset ? NULL : dbsc)) != 0) + return rv; + + dmabuf_write_start(be->dh[0]); + dst = dmabuf_map(be->dh[0]); + if (!dst) + return -1; + memcpy((char*)dst + offset, src, len); + dmabuf_len_set(be->dh[0], len); + dmabuf_write_end(be->dh[0]); + return 0; +} + +const struct dmabuf_h * qent_dst_dmabuf(const struct qent_dst *const be_dst, unsigned int plane) +{ + const struct qent_base *const be = &be_dst->base; + + return (plane >= sizeof(be->dh)/sizeof(be->dh[0])) ? NULL : be->dh[plane]; +} + +int qent_dst_dup_fd(const struct qent_dst *const be_dst, unsigned int plane) +{ + return dup(dmabuf_fd(qent_dst_dmabuf(be_dst, plane))); +} + +MediaBufsStatus mediabufs_start_request(struct mediabufs_ctl *const mbc, + struct media_request **const pmreq, + struct qent_src **const psrc_be, + struct qent_dst *const dst_be, + const bool is_final) +{ + struct media_request * mreq = *pmreq; + struct qent_src *const src_be = *psrc_be; + + // Req & src are always both "consumed" + *pmreq = NULL; + *psrc_be = NULL; + + pthread_mutex_lock(&mbc->lock); + + if (!src_be) + goto fail1; + + if (dst_be) { + if (qe_dst_waiting(dst_be)) { + request_info(mbc->dc, "Request buffer already waiting on start\n"); + goto fail1; + } + dst_be->base.timestamp = (struct timeval){0,0}; + if (qe_v4l2_queue(&dst_be->base, mbc->vfd, NULL, &mbc->dst_fmt, true, false)) + goto fail1; + + qent_dst_ref(dst_be); + queue_put_inuse(mbc->dst, &dst_be->base); + } + + if (qe_v4l2_queue(&src_be->base, mbc->vfd, mreq, &mbc->src_fmt, false, !is_final)) + goto fail1; + queue_put_inuse(mbc->src, &src_be->base); + + if (!mbc->polling && mediabufs_wants_poll(mbc)) { + mbc->polling = true; + pollqueue_add_task(mbc->pt, 2000); + } + pthread_mutex_unlock(&mbc->lock); + + if (media_request_start(mreq)) + return MEDIABUFS_ERROR_OPERATION_FAILED; + + return MEDIABUFS_STATUS_SUCCESS; + +fail1: + media_request_abort(&mreq); + if (src_be) + queue_put_free(mbc->src, &src_be->base); + +// *** TODO: If src Q fails this doesnt unwind properly - separate dst Q from src Q + if (dst_be) { + dst_be->base.status = QENT_ERROR; + qe_dst_done(dst_be); + } + pthread_mutex_unlock(&mbc->lock); + return MEDIABUFS_ERROR_OPERATION_FAILED; +} + + +static int qe_alloc_from_fmt(struct qent_base *const be, + struct dmabufs_ctl *const dbsc, + const struct v4l2_format *const fmt) +{ + if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { + unsigned int i; + for (i = 0; i != fmt->fmt.pix_mp.num_planes; ++i) { + be->dh[i] = dmabuf_realloc(dbsc, be->dh[i], + fmt->fmt.pix_mp.plane_fmt[i].sizeimage); + /* On failure tidy up and die */ + if (!be->dh[i]) { + while (i--) { + dmabuf_free(be->dh[i]); + be->dh[i] = NULL; + } + return -1; + } + } + } + else { +// be->dh[0] = dmabuf_alloc(dbsc, fmt->fmt.pix.sizeimage); + size_t size = fmt->fmt.pix.sizeimage; + be->dh[0] = dmabuf_realloc(dbsc, be->dh[0], size); + if (!be->dh[0]) + return -1; + } + return 0; +} + +static MediaBufsStatus fmt_set(struct v4l2_format *const fmt, const int fd, + const enum v4l2_buf_type buftype, + uint32_t pixfmt, + const unsigned int width, const unsigned int height, + const size_t bufsize) +{ + *fmt = (struct v4l2_format){.type = buftype}; + + if (V4L2_TYPE_IS_MULTIPLANAR(buftype)) { + fmt->fmt.pix_mp.width = width; + fmt->fmt.pix_mp.height = height; + fmt->fmt.pix_mp.pixelformat = pixfmt; + if (bufsize) { + fmt->fmt.pix_mp.num_planes = 1; + fmt->fmt.pix_mp.plane_fmt[0].sizeimage = bufsize; + } + } + else { + fmt->fmt.pix.width = width; + fmt->fmt.pix.height = height; + fmt->fmt.pix.pixelformat = pixfmt; + fmt->fmt.pix.sizeimage = bufsize; + } + + while (ioctl(fd, VIDIOC_S_FMT, fmt)) + if (errno != EINTR) + return MEDIABUFS_ERROR_OPERATION_FAILED; + + // Treat anything where we don't get at least what we asked for as a fail + if (V4L2_TYPE_IS_MULTIPLANAR(buftype)) { + if (fmt->fmt.pix_mp.width < width || + fmt->fmt.pix_mp.height < height || + fmt->fmt.pix_mp.pixelformat != pixfmt) { + return MEDIABUFS_ERROR_UNSUPPORTED_BUFFERTYPE; + } + } + else { + if (fmt->fmt.pix.width < width || + fmt->fmt.pix.height < height || + fmt->fmt.pix.pixelformat != pixfmt) { + return MEDIABUFS_ERROR_UNSUPPORTED_BUFFERTYPE; + } + } + + return MEDIABUFS_STATUS_SUCCESS; +} + +static MediaBufsStatus find_fmt_flags(struct v4l2_format *const fmt, + const int fd, + const unsigned int type_v4l2, + const uint32_t flags_must, + const uint32_t flags_not, + const unsigned int width, + const unsigned int height, + mediabufs_dst_fmt_accept_fn *const accept_fn, + void *const accept_v) +{ + unsigned int i; + + for (i = 0;; ++i) { + struct v4l2_fmtdesc fmtdesc = { + .index = i, + .type = type_v4l2 + }; + while (ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc)) { + if (errno != EINTR) + return MEDIABUFS_ERROR_UNSUPPORTED_BUFFERTYPE; + } + if ((fmtdesc.flags & flags_must) != flags_must || + (fmtdesc.flags & flags_not)) + continue; + if (!accept_fn(accept_v, &fmtdesc)) + continue; + + if (fmt_set(fmt, fd, fmtdesc.type, fmtdesc.pixelformat, + width, height, 0) == MEDIABUFS_STATUS_SUCCESS) + return MEDIABUFS_STATUS_SUCCESS; + } + return 0; +} + + +/* Wait for qent done */ + +MediaBufsStatus qent_dst_wait(struct qent_dst *const be_dst) +{ + struct qent_base *const be = &be_dst->base; + enum qent_status estat; + + pthread_mutex_lock(&be_dst->lock); + while (be_dst->waiting && + !pthread_cond_wait(&be_dst->cond, &be_dst->lock)) + /* Loop */; + estat = be->status; + pthread_mutex_unlock(&be_dst->lock); + + return estat == QENT_DONE ? MEDIABUFS_STATUS_SUCCESS : + estat == QENT_ERROR ? MEDIABUFS_ERROR_DECODING_ERROR : + MEDIABUFS_ERROR_OPERATION_FAILED; +} + +const uint8_t * qent_dst_data(struct qent_dst *const be_dst, unsigned int buf_no) +{ + struct qent_base *const be = &be_dst->base; + return dmabuf_map(be->dh[buf_no]); +} + +MediaBufsStatus qent_dst_read_start(struct qent_dst *const be_dst) +{ + struct qent_base *const be = &be_dst->base; + unsigned int i; + for (i = 0; i != VIDEO_MAX_PLANES && be->dh[i]; ++i) { + if (dmabuf_read_start(be->dh[i])) { + while (i--) + dmabuf_read_end(be->dh[i]); + return MEDIABUFS_ERROR_ALLOCATION_FAILED; + } + } + return MEDIABUFS_STATUS_SUCCESS; +} + +MediaBufsStatus qent_dst_read_stop(struct qent_dst *const be_dst) +{ + struct qent_base *const be = &be_dst->base; + unsigned int i; + MediaBufsStatus status = MEDIABUFS_STATUS_SUCCESS; + + for (i = 0; i != VIDEO_MAX_PLANES && be->dh[i]; ++i) { + if (dmabuf_read_end(be->dh[i])) + status = MEDIABUFS_ERROR_OPERATION_FAILED; + } + return status; +} + +struct qent_dst * qent_dst_ref(struct qent_dst * const be_dst) +{ + if (be_dst) + atomic_fetch_add(&be_dst->base.ref_count, 1); + return be_dst; +} + +void qent_dst_unref(struct qent_dst ** const pbe_dst) +{ + struct qent_dst * const be_dst = *pbe_dst; + struct mediabufs_ctl * mbc; + if (!be_dst) + return; + *pbe_dst = NULL; + + if (atomic_fetch_sub(&be_dst->base.ref_count, 1) != 0) + return; + + if ((mbc = ff_weak_link_lock(&be_dst->mbc_wl)) != NULL) { + queue_put_free(mbc->dst, &be_dst->base); + ff_weak_link_unlock(be_dst->mbc_wl); + } + else { + qe_dst_free(be_dst); + } +} + +MediaBufsStatus qent_dst_import_fd(struct qent_dst *const be_dst, + unsigned int plane, + int fd, size_t size) +{ + struct qent_base *const be = &be_dst->base; + struct dmabuf_h * dh; + + if (be->status != QENT_IMPORT || be->dh[plane]) + return MEDIABUFS_ERROR_OPERATION_FAILED; + + dh = dmabuf_import(fd, size); + if (!dh) + return MEDIABUFS_ERROR_ALLOCATION_FAILED; + + be->dh[plane] = dh; + return MEDIABUFS_STATUS_SUCCESS; +} + +// Returns noof buffers created, -ve for error +static int create_dst_bufs(struct mediabufs_ctl *const mbc, unsigned int n, struct qent_dst * const qes[]) +{ + unsigned int i; + + struct v4l2_create_buffers cbuf = { + .count = n, + .memory = mediabufs_memory_to_v4l2(mbc->dst->memtype), + .format = mbc->dst_fmt, + }; + + while (ioctl(mbc->vfd, VIDIOC_CREATE_BUFS, &cbuf)) { + const int err = -errno; + if (err != EINTR) { + request_err(mbc->dc, "%s: Failed to create V4L2 buffer\n", __func__); + return -err; + } + } + + if (cbuf.count != n) + request_warn(mbc->dc, "%s: Created %d of %d V4L2 buffers requested\n", __func__, cbuf.count, n); + + for (i = 0; i != cbuf.count; ++i) + qes[i]->base.index = cbuf.index + i; + + return cbuf.count; +} + +static MediaBufsStatus +qe_import_from_buf(struct mediabufs_ctl *const mbc, struct qent_base * const be, const struct v4l2_format *const fmt, + const unsigned int n, const bool x_dmabuf) +{ + struct v4l2_buffer buf = { + .index = n, + .type = fmt->type, + }; + struct v4l2_plane planes[VIDEO_MAX_PLANES]; + int ret; + + if (be->dh[0]) + return 0; + + if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { + memset(planes, 0, sizeof(planes)); + buf.m.planes = planes; + buf.length = VIDEO_MAX_PLANES; + } + + if ((ret = ioctl(mbc->vfd, VIDIOC_QUERYBUF, &buf)) != 0) { + request_err(mbc->dc, "VIDIOC_QUERYBUF failed"); + return MEDIABUFS_ERROR_OPERATION_FAILED; + } + + if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) + { + unsigned int i; + for (i = 0; i != buf.length; ++i) { + if (x_dmabuf) { + struct v4l2_exportbuffer xbuf = { + .type = buf.type, + .index = buf.index, + .plane = i, + .flags = O_RDWR, // *** Arguably O_RDONLY would be fine + }; + if (ioctl(mbc->vfd, VIDIOC_EXPBUF, &xbuf) == 0) + be->dh[i] = dmabuf_import(xbuf.fd, planes[i].length); + } + else { + be->dh[i] = dmabuf_import_mmap( + mmap(NULL, planes[i].length, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, + mbc->vfd, planes[i].m.mem_offset), + planes[i].length); + } + /* On failure tidy up and die */ + if (!be->dh[i]) { + while (i--) { + dmabuf_free(be->dh[i]); + be->dh[i] = NULL; + } + return MEDIABUFS_ERROR_OPERATION_FAILED; + } + } + } + else + { + if (x_dmabuf) { + struct v4l2_exportbuffer xbuf = { + .type = buf.type, + .index = buf.index, + .flags = O_RDWR, // *** Arguably O_RDONLY would be fine + }; + if (ioctl(mbc->vfd, VIDIOC_EXPBUF, &xbuf) == 0) + be->dh[0] = dmabuf_import(xbuf.fd, buf.length); + } + else { + be->dh[0] = dmabuf_import_mmap( + mmap(NULL, buf.length, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, + mbc->vfd, buf.m.offset), + buf.length); + } + /* On failure tidy up and die */ + if (!be->dh[0]) { + return MEDIABUFS_ERROR_OPERATION_FAILED; + } + } + + return 0; +} + +struct qent_dst* mediabufs_dst_qent_alloc(struct mediabufs_ctl *const mbc, struct dmabufs_ctl *const dbsc) +{ + struct qent_dst * be_dst; + + if (mbc == NULL) { + be_dst = qe_dst_new(NULL, MEDIABUFS_MEMORY_DMABUF); + if (be_dst) + be_dst->base.status = QENT_IMPORT; + return be_dst; + } + + if (mbc->dst_fixed) { + be_dst = base_to_dst(queue_get_free(mbc->dst)); + if (!be_dst) + return NULL; + } + else { + be_dst = base_to_dst(queue_tryget_free(mbc->dst)); + if (!be_dst) { + be_dst = qe_dst_new(mbc->this_wlm, mbc->dst->memtype); + if (!be_dst) + return NULL; + + if (create_dst_bufs(mbc, 1, &be_dst) != 1) { + qe_dst_free(be_dst); + return NULL; + } + } + } + + if (mbc->dst->memtype == MEDIABUFS_MEMORY_MMAP) { + if (qe_import_from_buf(mbc, &be_dst->base, &mbc->dst_fmt, be_dst->base.index, true)) { + request_err(mbc->dc, "Failed to export as dmabuf\n"); + queue_put_free(mbc->dst, &be_dst->base); + return NULL; + } + } + else { + if (qe_alloc_from_fmt(&be_dst->base, dbsc, &mbc->dst_fmt)) { + /* Given how create buf works we can't uncreate it on alloc failure + * all we can do is put it on the free Q + */ + queue_put_free(mbc->dst, &be_dst->base); + return NULL; + } + } + + be_dst->base.status = QENT_PENDING; + atomic_store(&be_dst->base.ref_count, 0); + return be_dst; +} + +const struct v4l2_format *mediabufs_dst_fmt(struct mediabufs_ctl *const mbc) +{ + return &mbc->dst_fmt; +} + +MediaBufsStatus mediabufs_dst_fmt_set(struct mediabufs_ctl *const mbc, + const unsigned int width, + const unsigned int height, + mediabufs_dst_fmt_accept_fn *const accept_fn, + void *const accept_v) +{ + MediaBufsStatus status; + unsigned int i; + const enum v4l2_buf_type buf_type = mbc->dst_fmt.type; + static const struct { + unsigned int flags_must; + unsigned int flags_not; + } trys[] = { + {0, V4L2_FMT_FLAG_EMULATED}, + {V4L2_FMT_FLAG_EMULATED, 0}, + }; + for (i = 0; i != sizeof(trys)/sizeof(trys[0]); ++i) { + status = find_fmt_flags(&mbc->dst_fmt, mbc->vfd, + buf_type, + trys[i].flags_must, + trys[i].flags_not, + width, height, accept_fn, accept_v); + if (status != MEDIABUFS_ERROR_UNSUPPORTED_BUFFERTYPE) + return status; + } + + if (status != MEDIABUFS_STATUS_SUCCESS) + return status; + + /* Try to create a buffer - don't alloc */ + return status; +} + +// ** This is a mess if we get partial alloc but without any way to remove +// individual V4L2 Q members we are somewhat stuffed +MediaBufsStatus mediabufs_dst_slots_create(struct mediabufs_ctl *const mbc, const unsigned int n, const bool fixed, const enum mediabufs_memory memtype) +{ + unsigned int i; + int a = 0; + unsigned int qc; + struct qent_dst * qes[32]; + + if (n > 32) + return MEDIABUFS_ERROR_ALLOCATION_FAILED; + + mbc->dst->memtype = memtype; + + // Create qents first as it is hard to get rid of the V4L2 buffers on error + for (qc = 0; qc != n; ++qc) + { + if ((qes[qc] = qe_dst_new(mbc->this_wlm, mbc->dst->memtype)) == NULL) + goto fail; + } + + if ((a = create_dst_bufs(mbc, n, qes)) < 0) + goto fail; + + for (i = 0; i != a; ++i) + queue_put_free(mbc->dst, &qes[i]->base); + + if (a != n) + goto fail; + + mbc->dst_fixed = fixed; + return MEDIABUFS_STATUS_SUCCESS; + +fail: + for (i = (a < 0 ? 0 : a); i != qc; ++i) + qe_dst_free(qes[i]); + + return MEDIABUFS_ERROR_ALLOCATION_FAILED; +} + +struct qent_src *mediabufs_src_qent_get(struct mediabufs_ctl *const mbc) +{ + struct qent_base * buf = queue_get_free(mbc->src); + buf->status = QENT_PENDING; + return base_to_src(buf); +} + +void mediabufs_src_qent_abort(struct mediabufs_ctl *const mbc, struct qent_src **const pqe_src) +{ + struct qent_src *const qe_src = *pqe_src; + if (!qe_src) + return; + *pqe_src = NULL; + queue_put_free(mbc->src, &qe_src->base); +} + +static MediaBufsStatus +chk_memory_type(struct mediabufs_ctl *const mbc, + const struct v4l2_format * const f, + const enum mediabufs_memory m) +{ + struct v4l2_create_buffers cbuf = { + .count = 0, + .memory = V4L2_MEMORY_MMAP, + .format = *f + }; + + if (ioctl(mbc->vfd, VIDIOC_CREATE_BUFS, &cbuf) != 0) + return MEDIABUFS_ERROR_OPERATION_FAILED; + + switch (m) { + case MEDIABUFS_MEMORY_DMABUF: + // 0 = Unknown but assume not in that case + if ((cbuf.capabilities & V4L2_BUF_CAP_SUPPORTS_DMABUF) == 0) + return MEDIABUFS_ERROR_UNSUPPORTED_MEMORY; + break; + case MEDIABUFS_MEMORY_MMAP: + break; + default: + return MEDIABUFS_ERROR_UNSUPPORTED_MEMORY; + } + + return MEDIABUFS_STATUS_SUCCESS; +} + +MediaBufsStatus +mediabufs_src_chk_memtype(struct mediabufs_ctl *const mbc, const enum mediabufs_memory memtype) +{ + return chk_memory_type(mbc, &mbc->src_fmt, memtype); +} + +MediaBufsStatus +mediabufs_dst_chk_memtype(struct mediabufs_ctl *const mbc, const enum mediabufs_memory memtype) +{ + return chk_memory_type(mbc, &mbc->dst_fmt, memtype); +} + +/* src format must have been set up before this */ +MediaBufsStatus mediabufs_src_pool_create(struct mediabufs_ctl *const mbc, + struct dmabufs_ctl * const dbsc, + unsigned int n, const enum mediabufs_memory memtype) +{ + unsigned int i; + struct v4l2_requestbuffers req = { + .count = n, + .type = mbc->src_fmt.type, + .memory = mediabufs_memory_to_v4l2(memtype) + }; + + bq_free_all_free_src(mbc->src); + + while (ioctl(mbc->vfd, VIDIOC_REQBUFS, &req) == -1) { + if (errno != EINTR) { + request_err(mbc->dc, "%s: Failed to request src bufs\n", __func__); + return MEDIABUFS_ERROR_OPERATION_FAILED; + } + } + + if (n > req.count) { + request_info(mbc->dc, "Only allocated %d of %d src buffers requested\n", req.count, n); + n = req.count; + } + + for (i = 0; i != n; ++i) { + struct qent_src *const be_src = qe_src_new(memtype); + if (!be_src) { + request_err(mbc->dc, "Failed to create src be %d\n", i); + goto fail; + } + switch (memtype) { + case MEDIABUFS_MEMORY_MMAP: + if (qe_import_from_buf(mbc, &be_src->base, &mbc->src_fmt, i, false)) { + qe_src_free(be_src); + goto fail; + } + be_src->fixed_size = 1; + break; + case MEDIABUFS_MEMORY_DMABUF: + if (qe_alloc_from_fmt(&be_src->base, dbsc, &mbc->src_fmt)) { + qe_src_free(be_src); + goto fail; + } + be_src->fixed_size = !mediabufs_src_resizable(mbc); + break; + default: + request_err(mbc->dc, "Unexpected memorty type\n"); + goto fail; + } + be_src->base.index = i; + + queue_put_free(mbc->src, &be_src->base); + } + + mbc->src->memtype = memtype; + return MEDIABUFS_STATUS_SUCCESS; + +fail: + bq_free_all_free_src(mbc->src); + req.count = 0; + while (ioctl(mbc->vfd, VIDIOC_REQBUFS, &req) == -1 && + errno == EINTR) + /* Loop */; + + return MEDIABUFS_ERROR_OPERATION_FAILED; +} + + + +/* + * Set stuff order: + * Set src fmt + * Set parameters (sps) on vfd + * Negotiate dst format (dst_fmt_set) + * Create src buffers + * Alloc a dst buffer or Create dst slots +*/ +MediaBufsStatus mediabufs_stream_on(struct mediabufs_ctl *const mbc) +{ + if (mbc->stream_on) + return MEDIABUFS_STATUS_SUCCESS; + + if (set_stream(mbc->vfd, mbc->src_fmt.type, true) < 0) { + request_log("Failed to set stream on src type %d\n", mbc->src_fmt.type); + return MEDIABUFS_ERROR_OPERATION_FAILED; + } + + if (set_stream(mbc->vfd, mbc->dst_fmt.type, true) < 0) { + request_log("Failed to set stream on dst type %d\n", mbc->dst_fmt.type); + set_stream(mbc->vfd, mbc->src_fmt.type, false); + return MEDIABUFS_ERROR_OPERATION_FAILED; + } + + mbc->stream_on = true; + return MEDIABUFS_STATUS_SUCCESS; +} + +MediaBufsStatus mediabufs_stream_off(struct mediabufs_ctl *const mbc) +{ + MediaBufsStatus status = MEDIABUFS_STATUS_SUCCESS; + + if (!mbc->stream_on) + return MEDIABUFS_STATUS_SUCCESS; + + if (set_stream(mbc->vfd, mbc->dst_fmt.type, false) < 0) { + request_log("Failed to set stream off dst type %d\n", mbc->dst_fmt.type); + status = MEDIABUFS_ERROR_OPERATION_FAILED; + } + + if (set_stream(mbc->vfd, mbc->src_fmt.type, false) < 0) { + request_log("Failed to set stream off src type %d\n", mbc->src_fmt.type); + status = MEDIABUFS_ERROR_OPERATION_FAILED; + } + + mbc->stream_on = false; + return status; +} + +int mediabufs_ctl_set_ext_ctrls(struct mediabufs_ctl * mbc, struct media_request * const mreq, struct v4l2_ext_control control_array[], unsigned int n) +{ + struct v4l2_ext_controls controls = { + .controls = control_array, + .count = n + }; + + if (mreq) { + controls.which = V4L2_CTRL_WHICH_REQUEST_VAL; + controls.request_fd = media_request_fd(mreq); + } + + while (ioctl(mbc->vfd, VIDIOC_S_EXT_CTRLS, &controls)) + { + const int err = errno; + if (err != EINTR) { + request_err(mbc->dc, "Unable to set controls: %s\n", strerror(err)); + return -err; + } + } + + return 0; +} + +MediaBufsStatus mediabufs_set_ext_ctrl(struct mediabufs_ctl *const mbc, + struct media_request * const mreq, + unsigned int id, void *data, + unsigned int size) +{ + struct v4l2_ext_control control = { + .id = id, + .ptr = data, + .size = size + }; + + int rv = mediabufs_ctl_set_ext_ctrls(mbc, mreq, &control, 1); + return !rv ? MEDIABUFS_STATUS_SUCCESS : MEDIABUFS_ERROR_OPERATION_FAILED; +} + +MediaBufsStatus mediabufs_src_fmt_set(struct mediabufs_ctl *const mbc, + enum v4l2_buf_type buf_type, + const uint32_t pixfmt, + const uint32_t width, const uint32_t height, + const size_t bufsize) +{ + MediaBufsStatus rv = fmt_set(&mbc->src_fmt, mbc->vfd, buf_type, pixfmt, width, height, bufsize); + if (rv != MEDIABUFS_STATUS_SUCCESS) + request_err(mbc->dc, "Failed to set src buftype %d, format %#x %dx%d\n", buf_type, pixfmt, width, height); + + return rv; +} + +int mediabufs_ctl_query_ext_ctrls(struct mediabufs_ctl * mbc, struct v4l2_query_ext_ctrl ctrls[], unsigned int n) +{ + int rv = 0; + while (n--) { + while (ioctl(mbc->vfd, VIDIOC_QUERY_EXT_CTRL, ctrls)) { + const int err = errno; + if (err != EINTR) { + // Often used for probing - errors are to be expected + request_debug(mbc->dc, "Failed to query ext id=%#x, err=%d\n", ctrls->id, err); + ctrls->type = 0; // 0 is invalid + rv = -err; + break; + } + } + ++ctrls; + } + return rv; +} + +int mediabufs_src_resizable(const struct mediabufs_ctl *const mbc) +{ +#if 1 + return 0; +#else + // Single planar OUTPUT can only take exact size buffers + // Multiplanar will take larger than negotiated + return V4L2_TYPE_IS_MULTIPLANAR(mbc->src_fmt.type); +#endif +} + +static void mediabufs_ctl_delete(struct mediabufs_ctl *const mbc) +{ + if (!mbc) + return; + + // Break the weak link first + ff_weak_link_break(&mbc->this_wlm); + + polltask_delete(&mbc->pt); + + mediabufs_stream_off(mbc); + + // Empty v4l2 buffer stash + request_buffers(mbc->vfd, mbc->src_fmt.type, V4L2_MEMORY_MMAP, 0); + request_buffers(mbc->vfd, mbc->dst_fmt.type, V4L2_MEMORY_MMAP, 0); + + bq_free_all_free_src(mbc->src); + bq_free_all_inuse_src(mbc->src); + bq_free_all_free_dst(mbc->dst); + + { + struct qent_dst *dst_be; + while ((dst_be = base_to_dst(bq_get_inuse(mbc->dst))) != NULL) { + dst_be->base.timestamp = (struct timeval){0}; + dst_be->base.status = QENT_ERROR; + qe_dst_done(dst_be); + } + } + + queue_delete(mbc->dst); + queue_delete(mbc->src); + close(mbc->vfd); + pthread_mutex_destroy(&mbc->lock); + + free(mbc); +} + +struct mediabufs_ctl * mediabufs_ctl_ref(struct mediabufs_ctl *const mbc) +{ + atomic_fetch_add(&mbc->ref_count, 1); + return mbc; +} + +void mediabufs_ctl_unref(struct mediabufs_ctl **const pmbc) +{ + struct mediabufs_ctl *const mbc = *pmbc; + int n; + + if (!mbc) + return; + *pmbc = NULL; + n = atomic_fetch_sub(&mbc->ref_count, 1); + if (n) + return; + mediabufs_ctl_delete(mbc); +} + +unsigned int mediabufs_ctl_driver_version(struct mediabufs_ctl *const mbc) +{ + return mbc->capability.version; +} + +static int set_capabilities(struct mediabufs_ctl *const mbc) +{ + uint32_t caps; + + if (ioctl(mbc->vfd, VIDIOC_QUERYCAP, &mbc->capability)) { + int err = errno; + request_err(mbc->dc, "Failed to get capabilities: %s\n", strerror(err)); + return -err; + } + + caps = (mbc->capability.capabilities & V4L2_CAP_DEVICE_CAPS) != 0 ? + mbc->capability.device_caps : + mbc->capability.capabilities; + + if ((caps & V4L2_CAP_VIDEO_M2M_MPLANE) != 0) { + mbc->src_fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; + mbc->dst_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; + } + else if ((caps & V4L2_CAP_VIDEO_M2M) != 0) { + mbc->src_fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; + mbc->dst_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + } + else { + request_err(mbc->dc, "No M2M capabilities (%#x)\n", caps); + return -EINVAL; + } + + return 0; +} + +/* One of these per context */ +struct mediabufs_ctl * mediabufs_ctl_new(void * const dc, const char * vpath, struct pollqueue *const pq) +{ + struct mediabufs_ctl *const mbc = calloc(1, sizeof(*mbc)); + + if (!mbc) + return NULL; + + mbc->dc = dc; + // Default mono planar + mbc->pq = pq; + pthread_mutex_init(&mbc->lock, NULL); + + /* Pick a default - could we scan for this? */ + if (vpath == NULL) + vpath = "/dev/media0"; + + while ((mbc->vfd = open(vpath, O_RDWR)) == -1) + { + const int err = errno; + if (err != EINTR) { + request_err(dc, "Failed to open video dev '%s': %s\n", vpath, strerror(err)); + goto fail0; + } + } + + if (set_capabilities(mbc)) { + request_err(dc, "Bad capabilities for video dev '%s'\n", vpath); + goto fail1; + } + + mbc->src = queue_new(mbc->vfd); + if (!mbc->src) + goto fail1; + mbc->dst = queue_new(mbc->vfd); + if (!mbc->dst) + goto fail2; + mbc->pt = polltask_new(pq, mbc->vfd, POLLIN | POLLOUT, mediabufs_poll_cb, mbc); + if (!mbc->pt) + goto fail3; + mbc->this_wlm = ff_weak_link_new(mbc); + if (!mbc->this_wlm) + goto fail4; + + /* Cannot add polltask now - polling with nothing pending + * generates infinite error polls + */ + return mbc; + +fail4: + polltask_delete(&mbc->pt); +fail3: + queue_delete(mbc->dst); +fail2: + queue_delete(mbc->src); +fail1: + close(mbc->vfd); +fail0: + free(mbc); + request_info(dc, "%s: FAILED\n", __func__); + return NULL; +} + + + diff --git a/libavcodec/v4l2_req_media.h b/libavcodec/v4l2_req_media.h new file mode 100644 index 0000000000..890947b2e2 --- /dev/null +++ b/libavcodec/v4l2_req_media.h @@ -0,0 +1,171 @@ +/* +e.h +* + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef _MEDIA_H_ +#define _MEDIA_H_ + +#include +#include + +struct v4l2_format; +struct v4l2_fmtdesc; +struct v4l2_query_ext_ctrl; + +struct pollqueue; +struct media_request; +struct media_pool; + +typedef enum media_buf_status { + MEDIABUFS_STATUS_SUCCESS = 0, + MEDIABUFS_ERROR_OPERATION_FAILED, + MEDIABUFS_ERROR_DECODING_ERROR, + MEDIABUFS_ERROR_UNSUPPORTED_BUFFERTYPE, + MEDIABUFS_ERROR_UNSUPPORTED_RT_FORMAT, + MEDIABUFS_ERROR_ALLOCATION_FAILED, + MEDIABUFS_ERROR_UNSUPPORTED_MEMORY, +} MediaBufsStatus; + +struct media_pool * media_pool_new(const char * const media_path, + struct pollqueue * const pq, + const unsigned int n); +void media_pool_delete(struct media_pool ** pmp); + +// Obtain a media request +// Will block if none availible - has a 2sec timeout +struct media_request * media_request_get(struct media_pool * const mp); +int media_request_fd(const struct media_request * const req); + +// Start this request +// Request structure is returned to pool once done +int media_request_start(struct media_request * const req); + +// Return an *unstarted* media_request to the pool +// May later be upgraded to allow for aborting a started req +int media_request_abort(struct media_request ** const preq); + + +struct mediabufs_ctl; +struct qent_src; +struct qent_dst; +struct dmabuf_h; +struct dmabufs_ctl; + +// 1-1 mammping to V4L2 type - just defined separetely to avoid some include versioning difficulties +enum mediabufs_memory { + MEDIABUFS_MEMORY_UNSET = 0, + MEDIABUFS_MEMORY_MMAP = 1, + MEDIABUFS_MEMORY_USERPTR = 2, + MEDIABUFS_MEMORY_OVERLAY = 3, + MEDIABUFS_MEMORY_DMABUF = 4, +}; + +int qent_src_params_set(struct qent_src *const be, const struct timeval * timestamp); +struct timeval qent_dst_timestamp_get(const struct qent_dst *const be_dst); + +// prealloc +int qent_src_alloc(struct qent_src *const be_src, const size_t len, struct dmabufs_ctl * dbsc); +// dbsc may be NULL if realloc not required +int qent_src_data_copy(struct qent_src *const be_src, const size_t offset, const void *const src, const size_t len, struct dmabufs_ctl * dbsc); +const struct dmabuf_h * qent_dst_dmabuf(const struct qent_dst *const be, unsigned int plane); +int qent_dst_dup_fd(const struct qent_dst *const be, unsigned int plane); +MediaBufsStatus qent_dst_wait(struct qent_dst *const be); +void qent_dst_delete(struct qent_dst *const be); +// Returns a qent_dst to its mbc free Q or deletes it if the mbc is dead +void qent_dst_unref(struct qent_dst ** const pbe_dst); +struct qent_dst * qent_dst_ref(struct qent_dst * const be_dst); + +const uint8_t * qent_dst_data(struct qent_dst *const be, unsigned int buf_no); +MediaBufsStatus qent_dst_read_start(struct qent_dst *const be); +MediaBufsStatus qent_dst_read_stop(struct qent_dst *const be); +/* Import an fd unattached to any mediabuf */ +MediaBufsStatus qent_dst_import_fd(struct qent_dst *const be_dst, + unsigned int plane, + int fd, size_t size); + +const char * mediabufs_memory_name(const enum mediabufs_memory m); + +MediaBufsStatus mediabufs_start_request(struct mediabufs_ctl *const mbc, + struct media_request **const pmreq, + struct qent_src **const psrc_be, + struct qent_dst *const dst_be, + const bool is_final); +// Get / alloc a dst buffer & associate with a slot +// If the dst pool is empty then behaviour depends on the fixed flag passed to +// dst_slots_create. Default is !fixed = unlimited alloc +struct qent_dst* mediabufs_dst_qent_alloc(struct mediabufs_ctl *const mbc, + struct dmabufs_ctl *const dbsc); +// Create dst slots without alloc +// If fixed true then qent_alloc will only get slots from this pool and will +// block until a qent has been unrefed +MediaBufsStatus mediabufs_dst_slots_create(struct mediabufs_ctl *const mbc, const unsigned int n, const bool fixed, const enum mediabufs_memory memtype); + +MediaBufsStatus mediabufs_stream_on(struct mediabufs_ctl *const mbc); +MediaBufsStatus mediabufs_stream_off(struct mediabufs_ctl *const mbc); +const struct v4l2_format *mediabufs_dst_fmt(struct mediabufs_ctl *const mbc); + +typedef int mediabufs_dst_fmt_accept_fn(void * v, const struct v4l2_fmtdesc *fmtdesc); + +MediaBufsStatus mediabufs_dst_fmt_set(struct mediabufs_ctl *const mbc, + const unsigned int width, + const unsigned int height, + mediabufs_dst_fmt_accept_fn *const accept_fn, + void *const accept_v); +struct qent_src *mediabufs_src_qent_get(struct mediabufs_ctl *const mbc); +void mediabufs_src_qent_abort(struct mediabufs_ctl *const mbc, struct qent_src **const pqe_src); + +int mediabufs_ctl_set_ext_ctrls(struct mediabufs_ctl * mbc, struct media_request * const mreq, + struct v4l2_ext_control control_array[], unsigned int n); +MediaBufsStatus mediabufs_set_ext_ctrl(struct mediabufs_ctl *const mbc, + struct media_request * const mreq, + unsigned int id, void *data, + unsigned int size); +int mediabufs_ctl_query_ext_ctrls(struct mediabufs_ctl * mbc, struct v4l2_query_ext_ctrl ctrls[], unsigned int n); + +int mediabufs_src_resizable(const struct mediabufs_ctl *const mbc); + +MediaBufsStatus mediabufs_src_fmt_set(struct mediabufs_ctl *const mbc, + enum v4l2_buf_type buf_type, + const uint32_t pixfmt, + const uint32_t width, const uint32_t height, + const size_t bufsize); + +MediaBufsStatus mediabufs_src_pool_create(struct mediabufs_ctl *const rw, + struct dmabufs_ctl * const dbsc, + unsigned int n, + const enum mediabufs_memory memtype); + +// Want to have appropriate formats set first +MediaBufsStatus mediabufs_src_chk_memtype(struct mediabufs_ctl *const mbc, const enum mediabufs_memory memtype); +MediaBufsStatus mediabufs_dst_chk_memtype(struct mediabufs_ctl *const mbc, const enum mediabufs_memory memtype); + +#define MEDIABUFS_DRIVER_VERSION(a, b, c) (((a) << 16) | ((b) << 8) | (c)) +unsigned int mediabufs_ctl_driver_version(struct mediabufs_ctl *const mbc); + +struct mediabufs_ctl * mediabufs_ctl_new(void * const dc, + const char *vpath, struct pollqueue *const pq); +void mediabufs_ctl_unref(struct mediabufs_ctl **const pmbc); +struct mediabufs_ctl * mediabufs_ctl_ref(struct mediabufs_ctl *const mbc); + + +#endif diff --git a/libavcodec/v4l2_req_pollqueue.c b/libavcodec/v4l2_req_pollqueue.c new file mode 100644 index 0000000000..cc8a5d4001 --- /dev/null +++ b/libavcodec/v4l2_req_pollqueue.c @@ -0,0 +1,361 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "v4l2_req_pollqueue.h" +#include "v4l2_req_utils.h" + + +struct pollqueue; + +enum polltask_state { + POLLTASK_UNQUEUED = 0, + POLLTASK_QUEUED, + POLLTASK_RUNNING, + POLLTASK_Q_KILL, + POLLTASK_RUN_KILL, +}; + +struct polltask { + struct polltask *next; + struct polltask *prev; + struct pollqueue *q; + enum polltask_state state; + + int fd; + short events; + + void (*fn)(void *v, short revents); + void * v; + + uint64_t timeout; /* CLOCK_MONOTONIC time, 0 => never */ + sem_t kill_sem; +}; + +struct pollqueue { + atomic_int ref_count; + pthread_mutex_t lock; + + struct polltask *head; + struct polltask *tail; + + bool kill; + bool no_prod; + int prod_fd; + struct polltask *prod_pt; + pthread_t worker; +}; + +struct polltask *polltask_new(struct pollqueue *const pq, + const int fd, const short events, + void (*const fn)(void *v, short revents), + void *const v) +{ + struct polltask *pt; + + if (!events) + return NULL; + + pt = malloc(sizeof(*pt)); + if (!pt) + return NULL; + + *pt = (struct polltask){ + .next = NULL, + .prev = NULL, + .q = pollqueue_ref(pq), + .fd = fd, + .events = events, + .fn = fn, + .v = v + }; + + sem_init(&pt->kill_sem, 0, 0); + + return pt; +} + +static void pollqueue_rem_task(struct pollqueue *const pq, struct polltask *const pt) +{ + if (pt->prev) + pt->prev->next = pt->next; + else + pq->head = pt->next; + if (pt->next) + pt->next->prev = pt->prev; + else + pq->tail = pt->prev; + pt->next = NULL; + pt->prev = NULL; +} + +static void polltask_free(struct polltask * const pt) +{ + sem_destroy(&pt->kill_sem); + free(pt); +} + +static int pollqueue_prod(const struct pollqueue *const pq) +{ + static const uint64_t one = 1; + return write(pq->prod_fd, &one, sizeof(one)); +} + +void polltask_delete(struct polltask **const ppt) +{ + struct polltask *const pt = *ppt; + struct pollqueue * pq; + enum polltask_state state; + bool prodme; + + if (!pt) + return; + + pq = pt->q; + pthread_mutex_lock(&pq->lock); + state = pt->state; + pt->state = (state == POLLTASK_RUNNING) ? POLLTASK_RUN_KILL : POLLTASK_Q_KILL; + prodme = !pq->no_prod; + pthread_mutex_unlock(&pq->lock); + + if (state != POLLTASK_UNQUEUED) { + if (prodme) + pollqueue_prod(pq); + while (sem_wait(&pt->kill_sem) && errno == EINTR) + /* loop */; + } + + // Leave zapping the ref until we have DQed the PT as might well be + // legitimately used in it + *ppt = NULL; + polltask_free(pt); + pollqueue_unref(&pq); +} + +static uint64_t pollqueue_now(int timeout) +{ + struct timespec now; + uint64_t now_ms; + + if (clock_gettime(CLOCK_MONOTONIC, &now)) + return 0; + now_ms = (now.tv_nsec / 1000000) + (uint64_t)now.tv_sec * 1000 + timeout; + return now_ms ? now_ms : (uint64_t)1; +} + +void pollqueue_add_task(struct polltask *const pt, const int timeout) +{ + bool prodme = false; + struct pollqueue * const pq = pt->q; + + pthread_mutex_lock(&pq->lock); + if (pt->state != POLLTASK_Q_KILL && pt->state != POLLTASK_RUN_KILL) { + if (pq->tail) + pq->tail->next = pt; + else + pq->head = pt; + pt->prev = pq->tail; + pt->next = NULL; + pt->state = POLLTASK_QUEUED; + pt->timeout = timeout < 0 ? 0 : pollqueue_now(timeout); + pq->tail = pt; + prodme = !pq->no_prod; + } + pthread_mutex_unlock(&pq->lock); + if (prodme) + pollqueue_prod(pq); +} + +static void *poll_thread(void *v) +{ + struct pollqueue *const pq = v; + struct pollfd *a = NULL; + size_t asize = 0; + + pthread_mutex_lock(&pq->lock); + do { + unsigned int i; + unsigned int n = 0; + struct polltask *pt; + struct polltask *pt_next; + uint64_t now = pollqueue_now(0); + int timeout = -1; + int rv; + + for (pt = pq->head; pt; pt = pt_next) { + int64_t t; + + pt_next = pt->next; + + if (pt->state == POLLTASK_Q_KILL) { + pollqueue_rem_task(pq, pt); + sem_post(&pt->kill_sem); + continue; + } + + if (n >= asize) { + asize = asize ? asize * 2 : 4; + a = realloc(a, asize * sizeof(*a)); + if (!a) { + request_log("Failed to realloc poll array to %zd\n", asize); + goto fail_locked; + } + } + + a[n++] = (struct pollfd){ + .fd = pt->fd, + .events = pt->events + }; + + t = (int64_t)(pt->timeout - now); + if (pt->timeout && t < INT_MAX && + (timeout < 0 || (int)t < timeout)) + timeout = (t < 0) ? 0 : (int)t; + } + pthread_mutex_unlock(&pq->lock); + + if ((rv = poll(a, n, timeout)) == -1) { + if (errno != EINTR) { + request_log("Poll error: %s\n", strerror(errno)); + goto fail_unlocked; + } + } + + pthread_mutex_lock(&pq->lock); + now = pollqueue_now(0); + + /* Prodding in this loop is pointless and might lead to + * infinite looping + */ + pq->no_prod = true; + for (i = 0, pt = pq->head; i < n; ++i, pt = pt_next) { + pt_next = pt->next; + + /* Pending? */ + if (a[i].revents || + (pt->timeout && (int64_t)(now - pt->timeout) >= 0)) { + pollqueue_rem_task(pq, pt); + if (pt->state == POLLTASK_QUEUED) + pt->state = POLLTASK_RUNNING; + if (pt->state == POLLTASK_Q_KILL) + pt->state = POLLTASK_RUN_KILL; + pthread_mutex_unlock(&pq->lock); + + /* This can add new entries to the Q but as + * those are added to the tail our existing + * chain remains intact + */ + pt->fn(pt->v, a[i].revents); + + pthread_mutex_lock(&pq->lock); + if (pt->state == POLLTASK_RUNNING) + pt->state = POLLTASK_UNQUEUED; + if (pt->state == POLLTASK_RUN_KILL) + sem_post(&pt->kill_sem); + } + } + pq->no_prod = false; + + } while (!pq->kill); + +fail_locked: + pthread_mutex_unlock(&pq->lock); +fail_unlocked: + free(a); + return NULL; +} + +static void prod_fn(void *v, short revents) +{ + struct pollqueue *const pq = v; + char buf[8]; + if (revents) + read(pq->prod_fd, buf, 8); + if (!pq->kill) + pollqueue_add_task(pq->prod_pt, -1); +} + +struct pollqueue * pollqueue_new(void) +{ + struct pollqueue *pq = malloc(sizeof(*pq)); + if (!pq) + return NULL; + *pq = (struct pollqueue){ + .ref_count = ATOMIC_VAR_INIT(0), + .lock = PTHREAD_MUTEX_INITIALIZER, + .head = NULL, + .tail = NULL, + .kill = false, + .prod_fd = -1 + }; + + pq->prod_fd = eventfd(0, EFD_NONBLOCK); + if (pq->prod_fd == 1) + goto fail1; + pq->prod_pt = polltask_new(pq, pq->prod_fd, POLLIN, prod_fn, pq); + if (!pq->prod_pt) + goto fail2; + pollqueue_add_task(pq->prod_pt, -1); + if (pthread_create(&pq->worker, NULL, poll_thread, pq)) + goto fail3; + // Reset ref count which will have been inced by the add_task + atomic_store(&pq->ref_count, 0); + return pq; + +fail3: + polltask_free(pq->prod_pt); +fail2: + close(pq->prod_fd); +fail1: + free(pq); + return NULL; +} + +static void pollqueue_free(struct pollqueue *const pq) +{ + void *rv; + + pthread_mutex_lock(&pq->lock); + pq->kill = true; + pollqueue_prod(pq); + pthread_mutex_unlock(&pq->lock); + + pthread_join(pq->worker, &rv); + polltask_free(pq->prod_pt); + pthread_mutex_destroy(&pq->lock); + close(pq->prod_fd); + free(pq); +} + +struct pollqueue * pollqueue_ref(struct pollqueue *const pq) +{ + atomic_fetch_add(&pq->ref_count, 1); + return pq; +} + +void pollqueue_unref(struct pollqueue **const ppq) +{ + struct pollqueue * const pq = *ppq; + + if (!pq) + return; + *ppq = NULL; + + if (atomic_fetch_sub(&pq->ref_count, 1) != 0) + return; + + pollqueue_free(pq); +} + + + diff --git a/libavcodec/v4l2_req_pollqueue.h b/libavcodec/v4l2_req_pollqueue.h new file mode 100644 index 0000000000..e1182cb2fc --- /dev/null +++ b/libavcodec/v4l2_req_pollqueue.h @@ -0,0 +1,18 @@ +#ifndef POLLQUEUE_H_ +#define POLLQUEUE_H_ + +struct polltask; +struct pollqueue; + +struct polltask *polltask_new(struct pollqueue *const pq, + const int fd, const short events, + void (*const fn)(void *v, short revents), + void *const v); +void polltask_delete(struct polltask **const ppt); + +void pollqueue_add_task(struct polltask *const pt, const int timeout); +struct pollqueue * pollqueue_new(void); +void pollqueue_unref(struct pollqueue **const ppq); +struct pollqueue * pollqueue_ref(struct pollqueue *const pq); + +#endif /* POLLQUEUE_H_ */ diff --git a/libavcodec/v4l2_req_utils.h b/libavcodec/v4l2_req_utils.h new file mode 100644 index 0000000000..a31cc1f4ec --- /dev/null +++ b/libavcodec/v4l2_req_utils.h @@ -0,0 +1,27 @@ +#ifndef AVCODEC_V4L2_REQ_UTILS_H +#define AVCODEC_V4L2_REQ_UTILS_H + +#include +#include "libavutil/log.h" + +#define request_log(...) av_log(NULL, AV_LOG_INFO, __VA_ARGS__) + +#define request_err(_ctx, ...) av_log(_ctx, AV_LOG_ERROR, __VA_ARGS__) +#define request_warn(_ctx, ...) av_log(_ctx, AV_LOG_WARNING, __VA_ARGS__) +#define request_info(_ctx, ...) av_log(_ctx, AV_LOG_INFO, __VA_ARGS__) +#define request_debug(_ctx, ...) av_log(_ctx, AV_LOG_DEBUG, __VA_ARGS__) + +static inline char safechar(char c) { + return c > 0x20 && c < 0x7f ? c : '.'; +} + +static inline const char * strfourcc(char tbuf[5], uint32_t fcc) { + tbuf[0] = safechar((fcc >> 0) & 0xff); + tbuf[1] = safechar((fcc >> 8) & 0xff); + tbuf[2] = safechar((fcc >> 16) & 0xff); + tbuf[3] = safechar((fcc >> 24) & 0xff); + tbuf[4] = '\0'; + return tbuf; +} + +#endif diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c new file mode 100644 index 0000000000..fbec16a93e --- /dev/null +++ b/libavcodec/v4l2_request_hevc.c @@ -0,0 +1,347 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include "config.h" +#include "decode.h" +#include "hevcdec.h" +#include "hwconfig.h" + +#include "v4l2_request_hevc.h" + +#include "libavutil/hwcontext_drm.h" +#include "libavutil/pixdesc.h" + +#include "v4l2_req_devscan.h" +#include "v4l2_req_dmabufs.h" +#include "v4l2_req_pollqueue.h" +#include "v4l2_req_media.h" +#include "v4l2_req_utils.h" + +static size_t bit_buf_size(unsigned int w, unsigned int h, unsigned int bits_minus8) +{ + const size_t wxh = w * h; + size_t bits_alloc; + + /* Annex A gives a min compression of 2 @ lvl 3.1 + * (wxh <= 983040) and min 4 thereafter but avoid + * the odity of 983041 having a lower limit than + * 983040. + * Multiply by 3/2 for 4:2:0 + */ + bits_alloc = wxh < 983040 ? wxh * 3 / 4 : + wxh < 983040 * 2 ? 983040 * 3 / 4 : + wxh * 3 / 8; + /* Allow for bit depth */ + bits_alloc += (bits_alloc * bits_minus8) / 8; + /* Add a few bytes (16k) for overhead */ + bits_alloc += 0x4000; + return bits_alloc; +} + +static int v4l2_req_hevc_start_frame(AVCodecContext *avctx, + av_unused const uint8_t *buffer, + av_unused uint32_t size) +{ + const V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; + return ctx->fns->start_frame(avctx, buffer, size); +} + +static int v4l2_req_hevc_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) +{ + V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; + return ctx->fns->decode_slice(avctx, buffer, size); +} + +static int v4l2_req_hevc_end_frame(AVCodecContext *avctx) +{ + V4L2RequestContextHEVC *ctx = avctx->internal->hwaccel_priv_data; + return ctx->fns->end_frame(avctx); +} + +static void v4l2_req_hevc_abort_frame(AVCodecContext * const avctx) +{ + V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; + ctx->fns->abort_frame(avctx); +} + +static int v4l2_req_hevc_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx) +{ + V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; + return ctx->fns->frame_params(avctx, hw_frames_ctx); +} + +static int v4l2_req_hevc_alloc_frame(AVCodecContext * avctx, AVFrame *frame) +{ + V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; + return ctx->fns->alloc_frame(avctx, frame); +} + + +static int v4l2_request_hevc_uninit(AVCodecContext *avctx) +{ + V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; + + av_log(avctx, AV_LOG_DEBUG, "<<< %s\n", __func__); + + decode_q_wait(&ctx->decode_q, NULL); // Wait for all other threads to be out of decode + + mediabufs_ctl_unref(&ctx->mbufs); + media_pool_delete(&ctx->mpool); + pollqueue_unref(&ctx->pq); + dmabufs_ctl_unref(&ctx->dbufs); + devscan_delete(&ctx->devscan); + + decode_q_uninit(&ctx->decode_q); + +// if (avctx->hw_frames_ctx) { +// AVHWFramesContext *hwfc = (AVHWFramesContext*)avctx->hw_frames_ctx->data; +// av_buffer_pool_flush(hwfc->pool); +// } + return 0; +} + +static int dst_fmt_accept_cb(void * v, const struct v4l2_fmtdesc *fmtdesc) +{ + AVCodecContext *const avctx = v; + const HEVCContext *const h = avctx->priv_data; + + if (h->ps.sps->bit_depth == 8) { + if (fmtdesc->pixelformat == V4L2_PIX_FMT_NV12_COL128 || + fmtdesc->pixelformat == V4L2_PIX_FMT_NV12) { + return 1; + } + } + else if (h->ps.sps->bit_depth == 10) { + if (fmtdesc->pixelformat == V4L2_PIX_FMT_NV12_10_COL128) { + return 1; + } + } + return 0; +} + +static int v4l2_request_hevc_init(AVCodecContext *avctx) +{ + const HEVCContext *h = avctx->priv_data; + V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; + const HEVCSPS * const sps = h->ps.sps; + int ret; + const struct decdev * decdev; + const uint32_t src_pix_fmt = V2(ff_v4l2_req_hevc, 4).src_pix_fmt_v4l2; // Assuming constant for all APIs but avoiding V4L2 includes + size_t src_size; + enum mediabufs_memory src_memtype; + enum mediabufs_memory dst_memtype; + + av_log(avctx, AV_LOG_DEBUG, "<<< %s\n", __func__); + + // Give up immediately if this is something that we have no code to deal with + if (h->ps.sps->chroma_format_idc != 1) { + av_log(avctx, AV_LOG_WARNING, "chroma_format_idc(%d) != 1: Not implemented\n", h->ps.sps->chroma_format_idc); + return AVERROR_PATCHWELCOME; + } + if (!(h->ps.sps->bit_depth == 10 || h->ps.sps->bit_depth == 8) || + h->ps.sps->bit_depth != h->ps.sps->bit_depth_chroma) { + av_log(avctx, AV_LOG_WARNING, "Bit depth Y:%d C:%d: Not implemented\n", h->ps.sps->bit_depth, h->ps.sps->bit_depth_chroma); + return AVERROR_PATCHWELCOME; + } + + if ((ret = devscan_build(avctx, &ctx->devscan)) != 0) { + av_log(avctx, AV_LOG_WARNING, "Failed to find any V4L2 devices\n"); + return (AVERROR(-ret)); + } + ret = AVERROR(ENOMEM); // Assume mem fail by default for these + + if ((decdev = devscan_find(ctx->devscan, src_pix_fmt)) == NULL) + { + av_log(avctx, AV_LOG_WARNING, "Failed to find a V4L2 device for H265\n"); + ret = AVERROR(ENODEV); + goto fail0; + } + av_log(avctx, AV_LOG_DEBUG, "Trying V4L2 devices: %s,%s\n", + decdev_media_path(decdev), decdev_video_path(decdev)); + + if ((ctx->dbufs = dmabufs_ctl_new()) == NULL) { + av_log(avctx, AV_LOG_DEBUG, "Unable to open dmabufs - try mmap buffers\n"); + src_memtype = MEDIABUFS_MEMORY_MMAP; + dst_memtype = MEDIABUFS_MEMORY_MMAP; + } + else { + av_log(avctx, AV_LOG_DEBUG, "Dmabufs opened - try dmabuf buffers\n"); + src_memtype = MEDIABUFS_MEMORY_DMABUF; + dst_memtype = MEDIABUFS_MEMORY_DMABUF; + } + + if ((ctx->pq = pollqueue_new()) == NULL) { + av_log(avctx, AV_LOG_ERROR, "Unable to create pollqueue\n"); + goto fail1; + } + + if ((ctx->mpool = media_pool_new(decdev_media_path(decdev), ctx->pq, 4)) == NULL) { + av_log(avctx, AV_LOG_ERROR, "Unable to create media pool\n"); + goto fail2; + } + + if ((ctx->mbufs = mediabufs_ctl_new(avctx, decdev_video_path(decdev), ctx->pq)) == NULL) { + av_log(avctx, AV_LOG_ERROR, "Unable to create media controls\n"); + goto fail3; + } + + // Ask for an initial bitbuf size of max size / 4 + // We will realloc if we need more + // Must use sps->h/w as avctx contains cropped size +retry_src_memtype: + src_size = bit_buf_size(sps->width, sps->height, sps->bit_depth - 8); + if (src_memtype == MEDIABUFS_MEMORY_DMABUF && mediabufs_src_resizable(ctx->mbufs)) + src_size /= 4; + // Kludge for conformance tests which break Annex A limits + else if (src_size < 0x40000) + src_size = 0x40000; + + if (mediabufs_src_fmt_set(ctx->mbufs, decdev_src_type(decdev), src_pix_fmt, + sps->width, sps->height, src_size)) { + char tbuf1[5]; + av_log(avctx, AV_LOG_ERROR, "Failed to set source format: %s %dx%d\n", strfourcc(tbuf1, src_pix_fmt), sps->width, sps->height); + goto fail4; + } + + if (mediabufs_src_chk_memtype(ctx->mbufs, src_memtype)) { + if (src_memtype == MEDIABUFS_MEMORY_DMABUF) { + src_memtype = MEDIABUFS_MEMORY_MMAP; + goto retry_src_memtype; + } + av_log(avctx, AV_LOG_ERROR, "Failed to get src memory type\n"); + goto fail4; + } + + if (V2(ff_v4l2_req_hevc, 4).probe(avctx, ctx) == 0) { + av_log(avctx, AV_LOG_DEBUG, "HEVC API version 4 probed successfully\n"); + ctx->fns = &V2(ff_v4l2_req_hevc, 4); + } +#if CONFIG_V4L2_REQ_HEVC_VX + else if (V2(ff_v4l2_req_hevc, 3).probe(avctx, ctx) == 0) { + av_log(avctx, AV_LOG_DEBUG, "HEVC API version 3 probed successfully\n"); + ctx->fns = &V2(ff_v4l2_req_hevc, 3); + } + else if (V2(ff_v4l2_req_hevc, 2).probe(avctx, ctx) == 0) { + av_log(avctx, AV_LOG_DEBUG, "HEVC API version 2 probed successfully\n"); + ctx->fns = &V2(ff_v4l2_req_hevc, 2); + } + else if (V2(ff_v4l2_req_hevc, 1).probe(avctx, ctx) == 0) { + av_log(avctx, AV_LOG_DEBUG, "HEVC API version 1 probed successfully\n"); + ctx->fns = &V2(ff_v4l2_req_hevc, 1); + } +#endif + else { + av_log(avctx, AV_LOG_ERROR, "No HEVC version probed successfully\n"); + ret = AVERROR(EINVAL); + goto fail4; + } + + if (mediabufs_dst_fmt_set(ctx->mbufs, sps->width, sps->height, dst_fmt_accept_cb, avctx)) { + char tbuf1[5]; + av_log(avctx, AV_LOG_ERROR, "Failed to set destination format: %s %dx%d\n", strfourcc(tbuf1, src_pix_fmt), sps->width, sps->height); + goto fail4; + } + + if (mediabufs_src_pool_create(ctx->mbufs, ctx->dbufs, 6, src_memtype)) { + av_log(avctx, AV_LOG_ERROR, "Failed to create source pool\n"); + goto fail4; + } + + { + unsigned int dst_slots = sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering + + avctx->thread_count + (avctx->extra_hw_frames > 0 ? avctx->extra_hw_frames : 6); + av_log(avctx, AV_LOG_DEBUG, "Slots=%d: Reordering=%d, threads=%d, hw+=%d\n", dst_slots, + sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering, + avctx->thread_count, avctx->extra_hw_frames); + + if (mediabufs_dst_chk_memtype(ctx->mbufs, dst_memtype)) { + if (dst_memtype != MEDIABUFS_MEMORY_DMABUF) { + av_log(avctx, AV_LOG_ERROR, "Failed to get dst memory type\n"); + goto fail4; + } + av_log(avctx, AV_LOG_DEBUG, "Dst DMABUF not supported - trying mmap\n"); + dst_memtype = MEDIABUFS_MEMORY_MMAP; + } + + // extra_hw_frames is -1 if unset + if (mediabufs_dst_slots_create(ctx->mbufs, dst_slots, (avctx->extra_hw_frames > 0), dst_memtype)) { + av_log(avctx, AV_LOG_ERROR, "Failed to create destination slots\n"); + goto fail4; + } + } + + if (mediabufs_stream_on(ctx->mbufs)) { + av_log(avctx, AV_LOG_ERROR, "Failed stream on\n"); + goto fail4; + } + + if ((ret = ff_decode_get_hw_frames_ctx(avctx, AV_HWDEVICE_TYPE_DRM)) != 0) { + av_log(avctx, AV_LOG_ERROR, "Failed to create frame ctx\n"); + goto fail4; + } + + if ((ret = ctx->fns->set_controls(avctx, ctx)) != 0) { + av_log(avctx, AV_LOG_ERROR, "Failed set controls\n"); + goto fail5; + } + + decode_q_init(&ctx->decode_q); + + // Set our s/w format + avctx->sw_pix_fmt = ((AVHWFramesContext *)avctx->hw_frames_ctx->data)->sw_format; + + av_log(avctx, AV_LOG_INFO, "Hwaccel %s; devices: %s,%s; buffers: src %s, dst %s; swfmt=%s\n", + ctx->fns->name, + decdev_media_path(decdev), decdev_video_path(decdev), + mediabufs_memory_name(src_memtype), mediabufs_memory_name(dst_memtype), + av_get_pix_fmt_name(avctx->sw_pix_fmt)); + + return 0; + +fail5: + av_buffer_unref(&avctx->hw_frames_ctx); +fail4: + mediabufs_ctl_unref(&ctx->mbufs); +fail3: + media_pool_delete(&ctx->mpool); +fail2: + pollqueue_unref(&ctx->pq); +fail1: + dmabufs_ctl_unref(&ctx->dbufs); +fail0: + devscan_delete(&ctx->devscan); + return ret; +} + +const AVHWAccel ff_hevc_v4l2request_hwaccel = { + .name = "hevc_v4l2request", + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_HEVC, + .pix_fmt = AV_PIX_FMT_DRM_PRIME, + .alloc_frame = v4l2_req_hevc_alloc_frame, + .start_frame = v4l2_req_hevc_start_frame, + .decode_slice = v4l2_req_hevc_decode_slice, + .end_frame = v4l2_req_hevc_end_frame, + .abort_frame = v4l2_req_hevc_abort_frame, + .init = v4l2_request_hevc_init, + .uninit = v4l2_request_hevc_uninit, + .priv_data_size = sizeof(V4L2RequestContextHEVC), + .frame_params = v4l2_req_hevc_frame_params, + .caps_internal = HWACCEL_CAP_ASYNC_SAFE | HWACCEL_CAP_MT_SAFE, +}; diff --git a/libavcodec/v4l2_request_hevc.h b/libavcodec/v4l2_request_hevc.h new file mode 100644 index 0000000000..99c90064ea --- /dev/null +++ b/libavcodec/v4l2_request_hevc.h @@ -0,0 +1,102 @@ +#ifndef AVCODEC_V4L2_REQUEST_HEVC_H +#define AVCODEC_V4L2_REQUEST_HEVC_H + +#include +#include +#include "v4l2_req_decode_q.h" + +#ifndef DRM_FORMAT_NV15 +#define DRM_FORMAT_NV15 fourcc_code('N', 'V', '1', '5') +#endif + +#ifndef DRM_FORMAT_NV20 +#define DRM_FORMAT_NV20 fourcc_code('N', 'V', '2', '0') +#endif + +// P030 should be defined in drm_fourcc.h and hopefully will be sometime +// in the future but until then... +#ifndef DRM_FORMAT_P030 +#define DRM_FORMAT_P030 fourcc_code('P', '0', '3', '0') +#endif + +#ifndef DRM_FORMAT_NV15 +#define DRM_FORMAT_NV15 fourcc_code('N', 'V', '1', '5') +#endif + +#ifndef DRM_FORMAT_NV20 +#define DRM_FORMAT_NV20 fourcc_code('N', 'V', '2', '0') +#endif + +#include +#ifndef V4L2_CID_CODEC_BASE +#define V4L2_CID_CODEC_BASE V4L2_CID_MPEG_BASE +#endif + +// V4L2_PIX_FMT_NV12_10_COL128 and V4L2_PIX_FMT_NV12_COL128 should be defined +// in drm_fourcc.h hopefully will be sometime in the future but until then... +#ifndef V4L2_PIX_FMT_NV12_10_COL128 +#define V4L2_PIX_FMT_NV12_10_COL128 v4l2_fourcc('N', 'C', '3', '0') +#endif + +#ifndef V4L2_PIX_FMT_NV12_COL128 +#define V4L2_PIX_FMT_NV12_COL128 v4l2_fourcc('N', 'C', '1', '2') /* 12 Y/CbCr 4:2:0 128 pixel wide column */ +#endif + +#ifndef V4L2_CTRL_FLAG_DYNAMIC_ARRAY +#define V4L2_CTRL_FLAG_DYNAMIC_ARRAY 0x0800 +#endif + +#define VCAT(name, version) name##_v##version +#define V2(n,v) VCAT(n, v) +#define V(n) V2(n, HEVC_CTRLS_VERSION) + +#define S2(x) #x +#define STR(x) S2(x) + +// 1 per decoder +struct v4l2_req_decode_fns; + +typedef struct V4L2RequestContextHEVC { +// V4L2RequestContext base; + const struct v4l2_req_decode_fns * fns; + + unsigned int timestamp; // ?? maybe uint64_t + + int decode_mode; + int start_code; + unsigned int max_slices; // 0 => not wanted (frame mode) + unsigned int max_offsets; // 0 => not wanted + + req_decode_q decode_q; + + struct devscan *devscan; + struct dmabufs_ctl *dbufs; + struct pollqueue *pq; + struct media_pool * mpool; + struct mediabufs_ctl *mbufs; +} V4L2RequestContextHEVC; + +typedef struct v4l2_req_decode_fns { + int src_pix_fmt_v4l2; + const char * name; + + // Init setup + int (*probe)(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx); + int (*set_controls)(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx); + + // Passthrough of hwaccel fns + int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); + int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); + int (*end_frame)(AVCodecContext *avctx); + void (*abort_frame)(AVCodecContext *avctx); + int (*frame_params)(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx); + int (*alloc_frame)(AVCodecContext * avctx, AVFrame *frame); +} v4l2_req_decode_fns; + + +extern const v4l2_req_decode_fns V2(ff_v4l2_req_hevc, 1); +extern const v4l2_req_decode_fns V2(ff_v4l2_req_hevc, 2); +extern const v4l2_req_decode_fns V2(ff_v4l2_req_hevc, 3); +extern const v4l2_req_decode_fns V2(ff_v4l2_req_hevc, 4); + +#endif diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c index d4ceb60791..fb7f839c5e 100644 --- a/libavcodec/vc1dec.c +++ b/libavcodec/vc1dec.c @@ -486,7 +486,7 @@ static av_cold int vc1_decode_init(AVCodecContext *avctx) size = next - start - 4; if (size <= 0) continue; - buf2_size = vc1_unescape_buffer(start + 4, size, buf2); + buf2_size = v->vc1dsp.vc1_unescape_buffer(start + 4, size, buf2); init_get_bits(&gb, buf2, buf2_size * 8); switch (AV_RB32(start)) { case VC1_CODE_SEQHDR: @@ -678,7 +678,7 @@ static int vc1_decode_frame(AVCodecContext *avctx, void *data, case VC1_CODE_FRAME: if (avctx->hwaccel) buf_start = start; - buf_size2 = vc1_unescape_buffer(start + 4, size, buf2); + buf_size2 = v->vc1dsp.vc1_unescape_buffer(start + 4, size, buf2); break; case VC1_CODE_FIELD: { int buf_size3; @@ -695,8 +695,8 @@ static int vc1_decode_frame(AVCodecContext *avctx, void *data, ret = AVERROR(ENOMEM); goto err; } - buf_size3 = vc1_unescape_buffer(start + 4, size, - slices[n_slices].buf); + buf_size3 = v->vc1dsp.vc1_unescape_buffer(start + 4, size, + slices[n_slices].buf); init_get_bits(&slices[n_slices].gb, slices[n_slices].buf, buf_size3 << 3); slices[n_slices].mby_start = avctx->coded_height + 31 >> 5; @@ -707,7 +707,7 @@ static int vc1_decode_frame(AVCodecContext *avctx, void *data, break; } case VC1_CODE_ENTRYPOINT: /* it should be before frame data */ - buf_size2 = vc1_unescape_buffer(start + 4, size, buf2); + buf_size2 = v->vc1dsp.vc1_unescape_buffer(start + 4, size, buf2); init_get_bits(&s->gb, buf2, buf_size2 * 8); ff_vc1_decode_entry_point(avctx, v, &s->gb); break; @@ -724,8 +724,8 @@ static int vc1_decode_frame(AVCodecContext *avctx, void *data, ret = AVERROR(ENOMEM); goto err; } - buf_size3 = vc1_unescape_buffer(start + 4, size, - slices[n_slices].buf); + buf_size3 = v->vc1dsp.vc1_unescape_buffer(start + 4, size, + slices[n_slices].buf); init_get_bits(&slices[n_slices].gb, slices[n_slices].buf, buf_size3 << 3); slices[n_slices].mby_start = get_bits(&slices[n_slices].gb, 9); @@ -759,7 +759,7 @@ static int vc1_decode_frame(AVCodecContext *avctx, void *data, ret = AVERROR(ENOMEM); goto err; } - buf_size3 = vc1_unescape_buffer(divider + 4, buf + buf_size - divider - 4, slices[n_slices].buf); + buf_size3 = v->vc1dsp.vc1_unescape_buffer(divider + 4, buf + buf_size - divider - 4, slices[n_slices].buf); init_get_bits(&slices[n_slices].gb, slices[n_slices].buf, buf_size3 << 3); slices[n_slices].mby_start = s->mb_height + 1 >> 1; @@ -768,9 +768,9 @@ static int vc1_decode_frame(AVCodecContext *avctx, void *data, n_slices1 = n_slices - 1; n_slices++; } - buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2); + buf_size2 = v->vc1dsp.vc1_unescape_buffer(buf, divider - buf, buf2); } else { - buf_size2 = vc1_unescape_buffer(buf, buf_size, buf2); + buf_size2 = v->vc1dsp.vc1_unescape_buffer(buf, buf_size, buf2); } init_get_bits(&s->gb, buf2, buf_size2*8); } else diff --git a/libavcodec/vc1dsp.c b/libavcodec/vc1dsp.c index c25a6f3adf..10182786b3 100644 --- a/libavcodec/vc1dsp.c +++ b/libavcodec/vc1dsp.c @@ -32,6 +32,7 @@ #include "rnd_avg.h" #include "vc1dsp.h" #include "startcode.h" +#include "vc1_common.h" /* Apply overlap transform to horizontal edge */ static void vc1_v_overlap_c(uint8_t *src, int stride) @@ -1028,6 +1029,7 @@ av_cold void ff_vc1dsp_init(VC1DSPContext *dsp) #endif /* CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER */ dsp->startcode_find_candidate = ff_startcode_find_candidate_c; + dsp->vc1_unescape_buffer = vc1_unescape_buffer; if (ARCH_AARCH64) ff_vc1dsp_init_aarch64(dsp); diff --git a/libavcodec/vc1dsp.h b/libavcodec/vc1dsp.h index 75db62b1b4..e192b431be 100644 --- a/libavcodec/vc1dsp.h +++ b/libavcodec/vc1dsp.h @@ -80,6 +80,9 @@ typedef struct VC1DSPContext { * one or more further zero bytes and a one byte. */ int (*startcode_find_candidate)(const uint8_t *buf, int size); + + /* Copy a buffer, removing startcode emulation escape bytes as we go */ + int (*vc1_unescape_buffer)(const uint8_t *src, int size, uint8_t *dst); } VC1DSPContext; void ff_vc1dsp_init(VC1DSPContext* c); diff --git a/libavcodec/weak_link.c b/libavcodec/weak_link.c new file mode 100644 index 0000000000..5a79e89ed7 --- /dev/null +++ b/libavcodec/weak_link.c @@ -0,0 +1,103 @@ +#include +#include +#include +#include "weak_link.h" + +struct ff_weak_link_master { + atomic_int ref_count; /* 0 is single ref for easier atomics */ + pthread_rwlock_t lock; + void * ptr; +}; + +static inline struct ff_weak_link_master * weak_link_x(struct ff_weak_link_client * c) +{ + return (struct ff_weak_link_master *)c; +} + +struct ff_weak_link_master * ff_weak_link_new(void * p) +{ + struct ff_weak_link_master * w = malloc(sizeof(*w)); + if (!w) + return NULL; + atomic_init(&w->ref_count, 0); + w->ptr = p; + if (pthread_rwlock_init(&w->lock, NULL)) { + free(w); + return NULL; + } + return w; +} + +static void weak_link_do_unref(struct ff_weak_link_master * const w) +{ + int n = atomic_fetch_sub(&w->ref_count, 1); + if (n) + return; + + pthread_rwlock_destroy(&w->lock); + free(w); +} + +// Unref & break link +void ff_weak_link_break(struct ff_weak_link_master ** ppLink) +{ + struct ff_weak_link_master * const w = *ppLink; + if (!w) + return; + + *ppLink = NULL; + pthread_rwlock_wrlock(&w->lock); + w->ptr = NULL; + pthread_rwlock_unlock(&w->lock); + + weak_link_do_unref(w); +} + +struct ff_weak_link_client* ff_weak_link_ref(struct ff_weak_link_master * w) +{ + if (!w) + return NULL; + atomic_fetch_add(&w->ref_count, 1); + return (struct ff_weak_link_client*)w; +} + +void ff_weak_link_unref(struct ff_weak_link_client ** ppLink) +{ + struct ff_weak_link_master * const w = weak_link_x(*ppLink); + if (!w) + return; + + *ppLink = NULL; + weak_link_do_unref(w); +} + +void * ff_weak_link_lock(struct ff_weak_link_client ** ppLink) +{ + struct ff_weak_link_master * const w = weak_link_x(*ppLink); + + if (!w) + return NULL; + + if (pthread_rwlock_rdlock(&w->lock)) + goto broken; + + if (w->ptr) + return w->ptr; + + pthread_rwlock_unlock(&w->lock); + +broken: + *ppLink = NULL; + weak_link_do_unref(w); + return NULL; +} + +// Ignores a NULL c (so can be on the return path of both broken & live links) +void ff_weak_link_unlock(struct ff_weak_link_client * c) +{ + struct ff_weak_link_master * const w = weak_link_x(c); + if (w) + pthread_rwlock_unlock(&w->lock); +} + + diff --git a/libavcodec/weak_link.h b/libavcodec/weak_link.h new file mode 100644 index 0000000000..415b6a27a0 --- /dev/null +++ b/libavcodec/weak_link.h @@ -0,0 +1,23 @@ +struct ff_weak_link_master; +struct ff_weak_link_client; + +struct ff_weak_link_master * ff_weak_link_new(void * p); +void ff_weak_link_break(struct ff_weak_link_master ** ppLink); + +struct ff_weak_link_client* ff_weak_link_ref(struct ff_weak_link_master * w); +void ff_weak_link_unref(struct ff_weak_link_client ** ppLink); + +// Returns NULL if link broken - in this case it will also zap +// *ppLink and unref the weak_link. +// Returns NULL if *ppLink is NULL (so a link once broken stays broken) +// +// The above does mean that there is a race if this is called simultainiously +// by two threads using the same weak_link_client (so don't do that) +void * ff_weak_link_lock(struct ff_weak_link_client ** ppLink); +void ff_weak_link_unlock(struct ff_weak_link_client * c); + + + + + + diff --git a/libavdevice/Makefile b/libavdevice/Makefile index 0dfe47a1f4..ec7c7b4147 100644 --- a/libavdevice/Makefile +++ b/libavdevice/Makefile @@ -47,6 +47,9 @@ OBJS-$(CONFIG_SNDIO_OUTDEV) += sndio_enc.o sndio.o OBJS-$(CONFIG_V4L2_INDEV) += v4l2.o v4l2-common.o timefilter.o OBJS-$(CONFIG_V4L2_OUTDEV) += v4l2enc.o v4l2-common.o OBJS-$(CONFIG_VFWCAP_INDEV) += vfwcap.o +OBJS-$(CONFIG_VOUT_DRM_OUTDEV) += drm_vout.o +OBJS-$(CONFIG_VOUT_EGL_OUTDEV) += egl_vout.o +OBJS-$(CONFIG_VOUT_RPI_OUTDEV) += rpi_vout.o OBJS-$(CONFIG_XCBGRAB_INDEV) += xcbgrab.o OBJS-$(CONFIG_XV_OUTDEV) += xv.o diff --git a/libavdevice/alldevices.c b/libavdevice/alldevices.c index 92b27a1d14..19d2a9de55 100644 --- a/libavdevice/alldevices.c +++ b/libavdevice/alldevices.c @@ -53,6 +53,9 @@ extern AVOutputFormat ff_sndio_muxer; extern AVInputFormat ff_v4l2_demuxer; extern AVOutputFormat ff_v4l2_muxer; extern AVInputFormat ff_vfwcap_demuxer; +extern AVOutputFormat ff_vout_drm_muxer; +extern AVOutputFormat ff_vout_egl_muxer; +extern AVOutputFormat ff_vout_rpi_muxer; extern AVInputFormat ff_xcbgrab_demuxer; extern AVOutputFormat ff_xv_muxer; diff --git a/libavdevice/drm_vout.c b/libavdevice/drm_vout.c new file mode 100644 index 0000000000..c7b90e6dd8 --- /dev/null +++ b/libavdevice/drm_vout.c @@ -0,0 +1,680 @@ +/* + * Copyright (c) 2020 John Cox for Raspberry Pi Trading + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +// *** This module is a work in progress and its utility is strictly +// limited to testing. + +#include "libavutil/opt.h" +#include "libavutil/pixdesc.h" +#include "libavutil/hwcontext_drm.h" +#include "libavformat/internal.h" +#include "avdevice.h" + +#include "pthread.h" +#include +#include + +#include +#include +#include + +#define TRACE_ALL 0 + +#define DRM_MODULE "vc4" + +#define ERRSTR strerror(errno) + +struct drm_setup { + int conId; + uint32_t crtcId; + int crtcIdx; + uint32_t planeId; + unsigned int out_fourcc; + struct { + int x, y, width, height; + } compose; +}; + +typedef struct drm_aux_s { + unsigned int fb_handle; + uint32_t bo_handles[AV_DRM_MAX_PLANES]; + AVFrame * frame; +} drm_aux_t; + +// Aux size should only need to be 2, but on a few streams (Hobbit) under FKMS +// we get initial flicker probably due to dodgy drm timing +#define AUX_SIZE 3 +typedef struct drm_display_env_s +{ + AVClass *class; + + int drm_fd; + uint32_t con_id; + struct drm_setup setup; + enum AVPixelFormat avfmt; + + int show_all; + const char * drm_module; + + unsigned int ano; + drm_aux_t aux[AUX_SIZE]; + + pthread_t q_thread; + sem_t q_sem_in; + sem_t q_sem_out; + int q_terminate; + AVFrame * q_next; + +} drm_display_env_t; + + +static int drm_vout_write_trailer(AVFormatContext *s) +{ +#if TRACE_ALL + av_log(s, AV_LOG_DEBUG, "%s\n", __func__); +#endif + + return 0; +} + +static int drm_vout_write_header(AVFormatContext *s) +{ + const AVCodecParameters * const par = s->streams[0]->codecpar; + +#if TRACE_ALL + av_log(s, AV_LOG_DEBUG, "%s\n", __func__); +#endif + if ( s->nb_streams > 1 + || par->codec_type != AVMEDIA_TYPE_VIDEO + || par->codec_id != AV_CODEC_ID_WRAPPED_AVFRAME) { + av_log(s, AV_LOG_ERROR, "Only supports one wrapped avframe stream\n"); + return AVERROR(EINVAL); + } + + return 0; +} + +static int find_plane(struct AVFormatContext * const avctx, + const int drmfd, const int crtcidx, const uint32_t format, + uint32_t * const pplane_id) +{ + drmModePlaneResPtr planes; + drmModePlanePtr plane; + drmModeObjectPropertiesPtr props = NULL; + drmModePropertyPtr prop = NULL; + unsigned int i; + unsigned int j; + int ret = -1; + + planes = drmModeGetPlaneResources(drmfd); + if (!planes) + { + av_log(avctx, AV_LOG_WARNING, "drmModeGetPlaneResources failed: %s\n", ERRSTR); + return -1; + } + + for (i = 0; i < planes->count_planes; ++i) { + plane = drmModeGetPlane(drmfd, planes->planes[i]); + if (!planes) + { + av_log(avctx, AV_LOG_WARNING, "drmModeGetPlane failed: %s\n", ERRSTR); + break; + } + + if (!(plane->possible_crtcs & (1 << crtcidx))) { + drmModeFreePlane(plane); + continue; + } + + for (j = 0; j < plane->count_formats; ++j) { + if (plane->formats[j] == format) + break; + } + + if (j == plane->count_formats) { + drmModeFreePlane(plane); + continue; + } + + *pplane_id = plane->plane_id; + drmModeFreePlane(plane); + break; + } + + if (i == planes->count_planes) { + ret = -1; + goto fail; + } + + props = drmModeObjectGetProperties(drmfd, *pplane_id, DRM_MODE_OBJECT_PLANE); + if (!props) + goto fail; + for (i = 0; i != props->count_props; ++i) { + if (prop) + drmModeFreeProperty(prop); + prop = drmModeGetProperty(drmfd, props->props[i]); + if (!prop) + goto fail; + if (strcmp("zpos", prop->name) == 0) { + if (drmModeObjectSetProperty(drmfd, *pplane_id, DRM_MODE_OBJECT_PLANE, props->props[i], prop->values[1]) == 0) + av_log(avctx, AV_LOG_DEBUG, "ZPOS set to %d\n", (int)prop->values[1]); + else + av_log(avctx, AV_LOG_WARNING, "Failed to set ZPOS on DRM plane\n"); + break; + } + } + + ret = 0; +fail: + if (props) + drmModeFreeObjectProperties(props); + if (prop) + drmModeFreeProperty(prop); + drmModeFreePlaneResources(planes); + return ret; +} + +static void da_uninit(drm_display_env_t * const de, drm_aux_t * da) +{ + if (da->fb_handle != 0) { + drmModeRmFB(de->drm_fd, da->fb_handle); + da->fb_handle = 0; + } + + for (unsigned int i = 0; i != AV_DRM_MAX_PLANES; ++i) { + if (da->bo_handles[i]) { + struct drm_gem_close gem_close = {.handle = da->bo_handles[i]}; + drmIoctl(de->drm_fd, DRM_IOCTL_GEM_CLOSE, &gem_close); + da->bo_handles[i] = 0; + } + } + av_frame_free(&da->frame); +} + +static int do_display(AVFormatContext * const s, drm_display_env_t * const de, AVFrame * frame) +{ + const AVDRMFrameDescriptor *desc = (AVDRMFrameDescriptor*)frame->data[0]; + drm_aux_t * da = de->aux + de->ano; + const uint32_t format = desc->layers[0].format; + int ret = 0; + +#if TRACE_ALL + av_log(s, AV_LOG_DEBUG, "<<< %s: fd=%d\n", __func__, desc->objects[0].fd); +#endif + + if (de->setup.out_fourcc != format) { + if (find_plane(s, de->drm_fd, de->setup.crtcIdx, format, &de->setup.planeId)) { + av_frame_free(&frame); + av_log(s, AV_LOG_WARNING, "No plane for format: %#x\n", format); + return -1; + } + de->setup.out_fourcc = format; + } + + { + drmVBlank vbl = { + .request = { + .type = DRM_VBLANK_RELATIVE, + .sequence = 0 + } + }; + + while (drmWaitVBlank(de->drm_fd, &vbl)) { + if (errno != EINTR) { +// av_log(s, AV_LOG_WARNING, "drmWaitVBlank failed: %s\n", ERRSTR); + break; + } + } + } + + da_uninit(de, da); + + { + uint32_t pitches[4] = {0}; + uint32_t offsets[4] = {0}; + uint64_t modifiers[4] = {0}; + uint32_t bo_handles[4] = {0}; + int has_mods = 0; + int i, j, n; + + da->frame = frame; + + for (i = 0; i < desc->nb_objects; ++i) { + if (drmPrimeFDToHandle(de->drm_fd, desc->objects[i].fd, da->bo_handles + i) != 0) { + av_log(s, AV_LOG_WARNING, "drmPrimeFDToHandle[%d](%d) failed: %s\n", i, desc->objects[i].fd, ERRSTR); + return -1; + } + if (desc->objects[i].format_modifier != DRM_FORMAT_MOD_LINEAR && + desc->objects[i].format_modifier != DRM_FORMAT_MOD_INVALID) + has_mods = 1; + } + + n = 0; + for (i = 0; i < desc->nb_layers; ++i) { + for (j = 0; j < desc->layers[i].nb_planes; ++j) { + const AVDRMPlaneDescriptor * const p = desc->layers[i].planes + j; + const AVDRMObjectDescriptor * const obj = desc->objects + p->object_index; + pitches[n] = p->pitch; + offsets[n] = p->offset; + modifiers[n] = obj->format_modifier; + bo_handles[n] = da->bo_handles[p->object_index]; + ++n; + } + } + +#if 1 && TRACE_ALL + av_log(s, AV_LOG_DEBUG, "%dx%d, fmt: %x, boh=%d,%d,%d,%d, pitch=%d,%d,%d,%d," + " offset=%d,%d,%d,%d, mod=%llx,%llx,%llx,%llx\n", + av_frame_cropped_width(frame), + av_frame_cropped_height(frame), + desc->layers[0].format, + bo_handles[0], + bo_handles[1], + bo_handles[2], + bo_handles[3], + pitches[0], + pitches[1], + pitches[2], + pitches[3], + offsets[0], + offsets[1], + offsets[2], + offsets[3], + (long long)modifiers[0], + (long long)modifiers[1], + (long long)modifiers[2], + (long long)modifiers[3] + ); +#endif + + if (drmModeAddFB2WithModifiers(de->drm_fd, + av_frame_cropped_width(frame), + av_frame_cropped_height(frame), + desc->layers[0].format, bo_handles, + pitches, offsets, + has_mods ? modifiers : NULL, + &da->fb_handle, + has_mods ? DRM_MODE_FB_MODIFIERS : 0) != 0) { + av_log(s, AV_LOG_WARNING, "drmModeAddFB2WithModifiers failed: %s\n", ERRSTR); + return -1; + } + } + + ret = drmModeSetPlane(de->drm_fd, de->setup.planeId, de->setup.crtcId, + da->fb_handle, 0, + de->setup.compose.x, de->setup.compose.y, + de->setup.compose.width, + de->setup.compose.height, + 0, 0, + av_frame_cropped_width(frame) << 16, + av_frame_cropped_height(frame) << 16); + + if (ret != 0) { + av_log(s, AV_LOG_WARNING, "drmModeSetPlane failed: %s\n", ERRSTR); + } + + de->ano = de->ano + 1 >= AUX_SIZE ? 0 : de->ano + 1; + + return ret; +} + +static int do_sem_wait(sem_t * const sem, const int nowait) +{ + while (nowait ? sem_trywait(sem) : sem_wait(sem)) { + if (errno != EINTR) + return -errno; + } + return 0; +} + +static void * display_thread(void * v) +{ + AVFormatContext * const s = v; + drm_display_env_t * const de = s->priv_data; + int i; + +#if TRACE_ALL + av_log(s, AV_LOG_DEBUG, "<<< %s\n", __func__); +#endif + + sem_post(&de->q_sem_out); + + for (;;) { + AVFrame * frame; + + do_sem_wait(&de->q_sem_in, 0); + + if (de->q_terminate) + break; + + frame = de->q_next; + de->q_next = NULL; + sem_post(&de->q_sem_out); + + do_display(s, de, frame); + } + +#if TRACE_ALL + av_log(s, AV_LOG_DEBUG, ">>> %s\n", __func__); +#endif + + for (i = 0; i != AUX_SIZE; ++i) + da_uninit(de, de->aux + i); + + av_frame_free(&de->q_next); + + return NULL; +} + +static int drm_vout_write_packet(AVFormatContext *s, AVPacket *pkt) +{ + const AVFrame * const src_frame = (AVFrame *)pkt->data; + AVFrame * frame; + drm_display_env_t * const de = s->priv_data; + int ret; + +#if TRACE_ALL + av_log(s, AV_LOG_DEBUG, "%s\n", __func__); +#endif + + if ((src_frame->flags & AV_FRAME_FLAG_CORRUPT) != 0) { + av_log(s, AV_LOG_WARNING, "Discard corrupt frame: fmt=%d, ts=%" PRId64 "\n", src_frame->format, src_frame->pts); + return 0; + } + + if (src_frame->format == AV_PIX_FMT_DRM_PRIME) { + frame = av_frame_alloc(); + av_frame_ref(frame, src_frame); + } + else if (src_frame->format == AV_PIX_FMT_VAAPI) { + frame = av_frame_alloc(); + frame->format = AV_PIX_FMT_DRM_PRIME; + if (av_hwframe_map(frame, src_frame, 0) != 0) + { + av_log(s, AV_LOG_WARNING, "Failed to map frame (format=%d) to DRM_PRiME\n", src_frame->format); + av_frame_free(&frame); + return AVERROR(EINVAL); + } + } + else { + av_log(s, AV_LOG_WARNING, "Frame (format=%d) not DRM_PRiME\n", src_frame->format); + return AVERROR(EINVAL); + } + + ret = do_sem_wait(&de->q_sem_out, !de->show_all); + if (ret) { + av_frame_free(&frame); + } + else { + de->q_next = frame; + sem_post(&de->q_sem_in); + } + + return 0; +} + +static int drm_vout_write_frame(AVFormatContext *s, int stream_index, AVFrame **ppframe, + unsigned flags) +{ +#if TRACE_ALL + av_log(s, AV_LOG_DEBUG, "%s: idx=%d, flags=%#x\n", __func__, stream_index, flags); +#endif + + /* drm_vout_write_header() should have accepted only supported formats */ + if ((flags & AV_WRITE_UNCODED_FRAME_QUERY)) + return 0; + + return 0; +} + +static int drm_vout_control_message(AVFormatContext *s, int type, void *data, size_t data_size) +{ +#if TRACE_ALL + av_log(s, AV_LOG_DEBUG, "%s: %d\n", __func__, type); +#endif + switch(type) { + case AV_APP_TO_DEV_WINDOW_REPAINT: + return 0; + default: + break; + } + return AVERROR(ENOSYS); +} + +static int find_crtc(struct AVFormatContext * const avctx, int drmfd, struct drm_setup *s, uint32_t * const pConId) +{ + int ret = -1; + int i; + drmModeRes *res = drmModeGetResources(drmfd); + drmModeConnector *c; + + if(!res) + { + printf( "drmModeGetResources failed: %s\n", ERRSTR); + return -1; + } + + if (res->count_crtcs <= 0) + { + printf( "drm: no crts\n"); + goto fail_res; + } + + if (!s->conId) { + fprintf(stderr, + "No connector ID specified. Choosing default from list:\n"); + + for (i = 0; i < res->count_connectors; i++) { + drmModeConnector *con = + drmModeGetConnector(drmfd, res->connectors[i]); + drmModeEncoder *enc = NULL; + drmModeCrtc *crtc = NULL; + + if (con->encoder_id) { + enc = drmModeGetEncoder(drmfd, con->encoder_id); + if (enc->crtc_id) { + crtc = drmModeGetCrtc(drmfd, enc->crtc_id); + } + } + + if (!s->conId && crtc) { + s->conId = con->connector_id; + s->crtcId = crtc->crtc_id; + } + + av_log(avctx, AV_LOG_DEBUG, "Connector %d (crtc %d): type %d, %dx%d%s\n", + con->connector_id, + crtc ? crtc->crtc_id : 0, + con->connector_type, + crtc ? crtc->width : 0, + crtc ? crtc->height : 0, + (s->conId == (int)con->connector_id ? + " (chosen)" : "")); + } + + if (!s->conId) { + av_log(avctx, AV_LOG_ERROR, + "No suitable enabled connector found.\n"); + return -1;; + } + } + + s->crtcIdx = -1; + + for (i = 0; i < res->count_crtcs; ++i) { + if (s->crtcId == res->crtcs[i]) { + s->crtcIdx = i; + break; + } + } + + if (s->crtcIdx == -1) + { + av_log(avctx, AV_LOG_WARNING, "drm: CRTC %u not found\n", s->crtcId); + goto fail_res; + } + + if (res->count_connectors <= 0) + { + av_log(avctx, AV_LOG_WARNING, "drm: no connectors\n"); + goto fail_res; + } + + c = drmModeGetConnector(drmfd, s->conId); + if (!c) + { + av_log(avctx, AV_LOG_WARNING, "drmModeGetConnector failed: %s\n", ERRSTR); + goto fail_res; + } + + if (!c->count_modes) + { + av_log(avctx, AV_LOG_WARNING, "connector supports no mode\n"); + goto fail_conn; + } + + { + drmModeCrtc *crtc = drmModeGetCrtc(drmfd, s->crtcId); + s->compose.x = crtc->x; + s->compose.y = crtc->y; + s->compose.width = crtc->width; + s->compose.height = crtc->height; + drmModeFreeCrtc(crtc); + } + + if (pConId) + *pConId = c->connector_id; + ret = 0; + +fail_conn: + drmModeFreeConnector(c); + +fail_res: + drmModeFreeResources(res); + + return ret; +} + +// deinit is called if init fails so no need to clean up explicity here +static int drm_vout_init(struct AVFormatContext * s) +{ + drm_display_env_t * const de = s->priv_data; + int rv; + + av_log(s, AV_LOG_DEBUG, "<<< %s\n", __func__); + + de->drm_fd = -1; + de->con_id = 0; + de->setup = (struct drm_setup){0}; + de->q_terminate = 0; + + if ((de->drm_fd = drmOpen(de->drm_module, NULL)) < 0) + { + rv = AVERROR(errno); + av_log(s, AV_LOG_ERROR, "Failed to drmOpen %s: %s\n", de->drm_module, av_err2str(rv)); + return rv; + } + + if (find_crtc(s, de->drm_fd, &de->setup, &de->con_id) != 0) + { + av_log(s, AV_LOG_ERROR, "failed to find valid mode\n"); + rv = AVERROR(EINVAL); + goto fail_close; + } + + sem_init(&de->q_sem_in, 0, 0); + sem_init(&de->q_sem_out, 0, 0); + if (pthread_create(&de->q_thread, NULL, display_thread, s)) { + rv = AVERROR(errno); + av_log(s, AV_LOG_ERROR, "Failed to create display thread: %s\n", av_err2str(rv)); + goto fail_close; + } + + av_log(s, AV_LOG_DEBUG, ">>> %s\n", __func__); + + return 0; + +fail_close: + close(de->drm_fd); + de->drm_fd = -1; + av_log(s, AV_LOG_DEBUG, ">>> %s: FAIL\n", __func__); + + return rv; +} + +static void drm_vout_deinit(struct AVFormatContext * s) +{ + drm_display_env_t * const de = s->priv_data; + + av_log(s, AV_LOG_DEBUG, "<<< %s\n", __func__); + + de->q_terminate = 1; + sem_post(&de->q_sem_in); + pthread_join(de->q_thread, NULL); + sem_destroy(&de->q_sem_in); + sem_destroy(&de->q_sem_out); + + for (unsigned int i = 0; i != AUX_SIZE; ++i) + da_uninit(de, de->aux + i); + + av_frame_free(&de->q_next); + + if (de->drm_fd >= 0) { + close(de->drm_fd); + de->drm_fd = -1; + } + + av_log(s, AV_LOG_DEBUG, ">>> %s\n", __func__); +} + + +#define OFFSET(x) offsetof(drm_display_env_t, x) +static const AVOption options[] = { + { "show_all", "show all frames", OFFSET(show_all), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, + { "drm_module", "drm_module name to use, default=" DRM_MODULE, OFFSET(drm_module), AV_OPT_TYPE_STRING, { .str = DRM_MODULE }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM }, + { NULL } +}; + +static const AVClass drm_vout_class = { + .class_name = "drm vid outdev", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT, +}; + +AVOutputFormat ff_vout_drm_muxer = { + .name = "vout_drm", + .long_name = NULL_IF_CONFIG_SMALL("Drm video output device"), + .priv_data_size = sizeof(drm_display_env_t), + .audio_codec = AV_CODEC_ID_NONE, + .video_codec = AV_CODEC_ID_WRAPPED_AVFRAME, + .write_header = drm_vout_write_header, + .write_packet = drm_vout_write_packet, + .write_uncoded_frame = drm_vout_write_frame, + .write_trailer = drm_vout_write_trailer, + .control_message = drm_vout_control_message, + .flags = AVFMT_NOFILE | AVFMT_VARIABLE_FPS | AVFMT_NOTIMESTAMPS, + .priv_class = &drm_vout_class, + .init = drm_vout_init, + .deinit = drm_vout_deinit, +}; + diff --git a/libavdevice/egl_vout.c b/libavdevice/egl_vout.c new file mode 100644 index 0000000000..cc6e310551 --- /dev/null +++ b/libavdevice/egl_vout.c @@ -0,0 +1,788 @@ +/* + * Copyright (c) 2020 John Cox for Raspberry Pi Trading + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +// *** This module is a work in progress and its utility is strictly +// limited to testing. +// Amongst other issues it doesn't wait for the pic to be displayed before +// returning the buffer so flikering does occur. + +#include +#include + +#include "libavutil/opt.h" +#include "libavutil/avassert.h" +#include "libavutil/pixdesc.h" +#include "libavutil/imgutils.h" +#include "libavutil/hwcontext_drm.h" +#include "libavformat/internal.h" +#include "avdevice.h" + +#include "pthread.h" +#include +#include +#include + +#include +#include + +#include "libavutil/rpi_sand_fns.h" + +#define TRACE_ALL 0 + +struct egl_setup { + int conId; + + Display *dpy; + EGLDisplay egl_dpy; + EGLContext ctx; + EGLSurface surf; + Window win; + + uint32_t crtcId; + int crtcIdx; + uint32_t planeId; + struct { + int x, y, width, height; + } compose; +}; + +typedef struct egl_aux_s { + int fd; + GLuint texture; + +} egl_aux_t; + +typedef struct egl_display_env_s { + AVClass *class; + + struct egl_setup setup; + enum AVPixelFormat avfmt; + + int show_all; + int window_width, window_height; + int window_x, window_y; + int fullscreen; + + egl_aux_t aux[32]; + + pthread_t q_thread; + pthread_mutex_t q_lock; + sem_t display_start_sem; + sem_t q_sem; + int q_terminate; + AVFrame *q_this; + AVFrame *q_next; + +} egl_display_env_t; + + +/** + * Remove window border/decorations. + */ +static void +no_border(Display *dpy, Window w) +{ + static const unsigned MWM_HINTS_DECORATIONS = (1 << 1); + static const int PROP_MOTIF_WM_HINTS_ELEMENTS = 5; + + typedef struct { + unsigned long flags; + unsigned long functions; + unsigned long decorations; + long inputMode; + unsigned long status; + } PropMotifWmHints; + + PropMotifWmHints motif_hints; + Atom prop, proptype; + unsigned long flags = 0; + + /* setup the property */ + motif_hints.flags = MWM_HINTS_DECORATIONS; + motif_hints.decorations = flags; + + /* get the atom for the property */ + prop = XInternAtom(dpy, "_MOTIF_WM_HINTS", True); + if (!prop) { + /* something went wrong! */ + return; + } + + /* not sure this is correct, seems to work, XA_WM_HINTS didn't work */ + proptype = prop; + + XChangeProperty(dpy, w, /* display, window */ + prop, proptype, /* property, type */ + 32, /* format: 32-bit datums */ + PropModeReplace, /* mode */ + (unsigned char *)&motif_hints, /* data */ + PROP_MOTIF_WM_HINTS_ELEMENTS /* nelements */ + ); +} + + +/* + * Create an RGB, double-buffered window. + * Return the window and context handles. + */ +static int +make_window(struct AVFormatContext *const s, + egl_display_env_t *const de, + Display *dpy, EGLDisplay egl_dpy, const char *name, + Window *winRet, EGLContext *ctxRet, EGLSurface *surfRet) +{ + int scrnum = DefaultScreen(dpy); + XSetWindowAttributes attr; + unsigned long mask; + Window root = RootWindow(dpy, scrnum); + Window win; + EGLContext ctx; + const int fullscreen = de->fullscreen; + EGLConfig config; + int x = de->window_x; + int y = de->window_y; + int width = de->window_width ? de->window_width : 1280; + int height = de->window_height ? de->window_height : 720; + + + if (fullscreen) { + int scrnum = DefaultScreen(dpy); + + x = 0; y = 0; + width = DisplayWidth(dpy, scrnum); + height = DisplayHeight(dpy, scrnum); + } + + { + EGLint num_configs; + static const EGLint attribs[] = { + EGL_RED_SIZE, 1, + EGL_GREEN_SIZE, 1, + EGL_BLUE_SIZE, 1, + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_NONE + }; + + if (!eglChooseConfig(egl_dpy, attribs, &config, 1, &num_configs)) { + av_log(s, AV_LOG_ERROR, "Error: couldn't get an EGL visual config\n"); + return -1; + } + } + + { + EGLint vid; + if (!eglGetConfigAttrib(egl_dpy, config, EGL_NATIVE_VISUAL_ID, &vid)) { + av_log(s, AV_LOG_ERROR, "Error: eglGetConfigAttrib() failed\n"); + return -1; + } + + { + XVisualInfo visTemplate = { + .visualid = vid, + }; + int num_visuals; + XVisualInfo *visinfo = XGetVisualInfo(dpy, VisualIDMask, + &visTemplate, &num_visuals); + + /* window attributes */ + attr.background_pixel = 0; + attr.border_pixel = 0; + attr.colormap = XCreateColormap(dpy, root, visinfo->visual, AllocNone); + attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; + /* XXX this is a bad way to get a borderless window! */ + mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; + + win = XCreateWindow(dpy, root, x, y, width, height, + 0, visinfo->depth, InputOutput, + visinfo->visual, mask, &attr); + XFree(visinfo); + } + } + + if (fullscreen) + no_border(dpy, win); + + /* set hints and properties */ + { + XSizeHints sizehints; + sizehints.x = x; + sizehints.y = y; + sizehints.width = width; + sizehints.height = height; + sizehints.flags = USSize | USPosition; + XSetNormalHints(dpy, win, &sizehints); + XSetStandardProperties(dpy, win, name, name, + None, (char **)NULL, 0, &sizehints); + } + + eglBindAPI(EGL_OPENGL_ES_API); + + { + static const EGLint ctx_attribs[] = { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE + }; + ctx = eglCreateContext(egl_dpy, config, EGL_NO_CONTEXT, ctx_attribs); + if (!ctx) { + av_log(s, AV_LOG_ERROR, "Error: eglCreateContext failed\n"); + return -1; + } + } + + + XMapWindow(dpy, win); + + { + EGLSurface surf = eglCreateWindowSurface(egl_dpy, config, (EGLNativeWindowType)win, NULL); + if (!surf) { + av_log(s, AV_LOG_ERROR, "Error: eglCreateWindowSurface failed\n"); + return -1; + } + + if (!eglMakeCurrent(egl_dpy, surf, surf, ctx)) { + av_log(s, AV_LOG_ERROR, "Error: eglCreateContext failed\n"); + return -1; + } + + *winRet = win; + *ctxRet = ctx; + *surfRet = surf; + } + + return 0; +} + +static GLint +compile_shader(struct AVFormatContext *const avctx, GLenum target, const char *source) +{ + GLuint s = glCreateShader(target); + + if (s == 0) { + av_log(avctx, AV_LOG_ERROR, "Failed to create shader\n"); + return 0; + } + + glShaderSource(s, 1, (const GLchar **)&source, NULL); + glCompileShader(s); + + { + GLint ok; + glGetShaderiv(s, GL_COMPILE_STATUS, &ok); + + if (!ok) { + GLchar *info; + GLint size; + + glGetShaderiv(s, GL_INFO_LOG_LENGTH, &size); + info = malloc(size); + + glGetShaderInfoLog(s, size, NULL, info); + av_log(avctx, AV_LOG_ERROR, "Failed to compile shader: %ssource:\n%s\n", info, source); + + return 0; + } + } + + return s; +} + +static GLuint link_program(struct AVFormatContext *const s, GLint vs, GLint fs) +{ + GLuint prog = glCreateProgram(); + + if (prog == 0) { + av_log(s, AV_LOG_ERROR, "Failed to create program\n"); + return 0; + } + + glAttachShader(prog, vs); + glAttachShader(prog, fs); + glLinkProgram(prog); + + { + GLint ok; + glGetProgramiv(prog, GL_LINK_STATUS, &ok); + if (!ok) { + /* Some drivers return a size of 1 for an empty log. This is the size + * of a log that contains only a terminating NUL character. + */ + GLint size; + GLchar *info = NULL; + glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &size); + if (size > 1) { + info = malloc(size); + glGetProgramInfoLog(prog, size, NULL, info); + } + + av_log(s, AV_LOG_ERROR, "Failed to link: %s\n", + (info != NULL) ? info : ""); + return 0; + } + } + + return prog; +} + +static int +gl_setup(struct AVFormatContext *const s) +{ + const char *vs = + "attribute vec4 pos;\n" + "varying vec2 texcoord;\n" + "\n" + "void main() {\n" + " gl_Position = pos;\n" + " texcoord.x = (pos.x + 1.0) / 2.0;\n" + " texcoord.y = (-pos.y + 1.0) / 2.0;\n" + "}\n"; + const char *fs = + "#extension GL_OES_EGL_image_external : enable\n" + "precision mediump float;\n" + "uniform samplerExternalOES s;\n" + "varying vec2 texcoord;\n" + "void main() {\n" + " gl_FragColor = texture2D(s, texcoord);\n" + "}\n"; + + GLuint vs_s; + GLuint fs_s; + GLuint prog; + + if (!(vs_s = compile_shader(s, GL_VERTEX_SHADER, vs)) || + !(fs_s = compile_shader(s, GL_FRAGMENT_SHADER, fs)) || + !(prog = link_program(s, vs_s, fs_s))) + return -1; + + glUseProgram(prog); + + { + static const float verts[] = { + -1, -1, + 1, -1, + 1, 1, + -1, 1, + }; + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, verts); + } + + glEnableVertexAttribArray(0); + return 0; +} + +static int egl_vout_write_trailer(AVFormatContext *s) +{ +#if TRACE_ALL + av_log(s, AV_LOG_INFO, "%s\n", __func__); +#endif + + return 0; +} + +static int egl_vout_write_header(AVFormatContext *s) +{ + const AVCodecParameters *const par = s->streams[0]->codecpar; + +#if TRACE_ALL + av_log(s, AV_LOG_INFO, "%s\n", __func__); +#endif + if (s->nb_streams > 1 + || par->codec_type != AVMEDIA_TYPE_VIDEO + || par->codec_id != AV_CODEC_ID_WRAPPED_AVFRAME) { + av_log(s, AV_LOG_ERROR, "Only supports one wrapped avframe stream\n"); + return AVERROR(EINVAL); + } + + return 0; +} + + +static int do_display(AVFormatContext *const s, egl_display_env_t *const de, AVFrame *const frame) +{ + const AVDRMFrameDescriptor *desc = (AVDRMFrameDescriptor *)frame->data[0]; + egl_aux_t *da = NULL; + unsigned int i; + +#if TRACE_ALL + av_log(s, AV_LOG_INFO, "<<< %s\n", __func__); +#endif + + for (i = 0; i != 32; ++i) { + if (de->aux[i].fd == -1 || de->aux[i].fd == desc->objects[0].fd) { + da = de->aux + i; + break; + } + } + + if (da == NULL) { + av_log(s, AV_LOG_INFO, "%s: Out of handles\n", __func__); + return AVERROR(EINVAL); + } + + if (da->texture == 0) { + EGLint attribs[50]; + EGLint *a = attribs; + int i, j; + static const EGLint anames[] = { + EGL_DMA_BUF_PLANE0_FD_EXT, + EGL_DMA_BUF_PLANE0_OFFSET_EXT, + EGL_DMA_BUF_PLANE0_PITCH_EXT, + EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT, + EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT, + EGL_DMA_BUF_PLANE1_FD_EXT, + EGL_DMA_BUF_PLANE1_OFFSET_EXT, + EGL_DMA_BUF_PLANE1_PITCH_EXT, + EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT, + EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT, + EGL_DMA_BUF_PLANE2_FD_EXT, + EGL_DMA_BUF_PLANE2_OFFSET_EXT, + EGL_DMA_BUF_PLANE2_PITCH_EXT, + EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT, + EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT, + }; + const EGLint *b = anames; + + *a++ = EGL_WIDTH; + *a++ = av_frame_cropped_width(frame); + *a++ = EGL_HEIGHT; + *a++ = av_frame_cropped_height(frame); + *a++ = EGL_LINUX_DRM_FOURCC_EXT; + *a++ = desc->layers[0].format; + + for (i = 0; i < desc->nb_layers; ++i) { + for (j = 0; j < desc->layers[i].nb_planes; ++j) { + const AVDRMPlaneDescriptor *const p = desc->layers[i].planes + j; + const AVDRMObjectDescriptor *const obj = desc->objects + p->object_index; + *a++ = *b++; + *a++ = obj->fd; + *a++ = *b++; + *a++ = p->offset; + *a++ = *b++; + *a++ = p->pitch; + if (obj->format_modifier == 0) { + b += 2; + } + else { + *a++ = *b++; + *a++ = (EGLint)(obj->format_modifier & 0xFFFFFFFF); + *a++ = *b++; + *a++ = (EGLint)(obj->format_modifier >> 32); + } + } + } + + *a = EGL_NONE; + +#if TRACE_ALL + for (a = attribs, i = 0; *a != EGL_NONE; a += 2, ++i) { + av_log(s, AV_LOG_INFO, "[%2d] %4x: %d\n", i, a[0], a[1]); + } +#endif + { + const EGLImage image = eglCreateImageKHR(de->setup.egl_dpy, + EGL_NO_CONTEXT, + EGL_LINUX_DMA_BUF_EXT, + NULL, attribs); + if (!image) { + av_log(s, AV_LOG_ERROR, "Failed to import fd %d\n", desc->objects[0].fd); + return -1; + } + + glGenTextures(1, &da->texture); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, da->texture); + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, image); + + eglDestroyImageKHR(de->setup.egl_dpy, image); + } + + da->fd = desc->objects[0].fd; + } + + glClearColor(0.5, 0.5, 0.5, 0.5); + glClear(GL_COLOR_BUFFER_BIT); + + glBindTexture(GL_TEXTURE_EXTERNAL_OES, da->texture); + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + eglSwapBuffers(de->setup.egl_dpy, de->setup.surf); + + glDeleteTextures(1, &da->texture); + da->texture = 0; + da->fd = -1; + + return 0; +} + +static void* display_thread(void *v) +{ + AVFormatContext *const s = v; + egl_display_env_t *const de = s->priv_data; + +#if TRACE_ALL + av_log(s, AV_LOG_INFO, "<<< %s\n", __func__); +#endif + { + EGLint egl_major, egl_minor; + + de->setup.dpy = XOpenDisplay(NULL); + if (!de->setup.dpy) { + av_log(s, AV_LOG_ERROR, "Couldn't open X display\n"); + goto fail; + } + + de->setup.egl_dpy = eglGetDisplay(de->setup.dpy); + if (!de->setup.egl_dpy) { + av_log(s, AV_LOG_ERROR, "eglGetDisplay() failed\n"); + goto fail; + } + + if (!eglInitialize(de->setup.egl_dpy, &egl_major, &egl_minor)) { + av_log(s, AV_LOG_ERROR, "Error: eglInitialize() failed\n"); + goto fail; + } + + av_log(s, AV_LOG_INFO, "EGL version %d.%d\n", egl_major, egl_minor); + + if (!epoxy_has_egl_extension(de->setup.egl_dpy, "EGL_KHR_image_base")) { + av_log(s, AV_LOG_ERROR, "Missing EGL KHR image extension\n"); + goto fail; + } + } + + if (!de->window_width || !de->window_height) { + de->window_width = 1280; + de->window_height = 720; + } + if (make_window(s, de, de->setup.dpy, de->setup.egl_dpy, "ffmpeg-vout", + &de->setup.win, &de->setup.ctx, &de->setup.surf)) { + av_log(s, AV_LOG_ERROR, "%s: make_window failed\n", __func__); + goto fail; + } + + if (gl_setup(s)) { + av_log(s, AV_LOG_ERROR, "%s: gl_setup failed\n", __func__); + goto fail; + } + +#if TRACE_ALL + av_log(s, AV_LOG_INFO, "--- %s: Start done\n", __func__); +#endif + sem_post(&de->display_start_sem); + + for (;;) { + AVFrame *frame; + + while (sem_wait(&de->q_sem) != 0) { + av_assert0(errno == EINTR); + } + + if (de->q_terminate) + break; + + pthread_mutex_lock(&de->q_lock); + frame = de->q_next; + de->q_next = NULL; + pthread_mutex_unlock(&de->q_lock); + + do_display(s, de, frame); + + av_frame_free(&de->q_this); + de->q_this = frame; + } + +#if TRACE_ALL + av_log(s, AV_LOG_INFO, ">>> %s\n", __func__); +#endif + + return NULL; + +fail: +#if TRACE_ALL + av_log(s, AV_LOG_INFO, ">>> %s: FAIL\n", __func__); +#endif + de->q_terminate = 1; + sem_post(&de->display_start_sem); + + return NULL; +} + +static int egl_vout_write_packet(AVFormatContext *s, AVPacket *pkt) +{ + const AVFrame *const src_frame = (AVFrame *)pkt->data; + AVFrame *frame; + egl_display_env_t *const de = s->priv_data; + +#if TRACE_ALL + av_log(s, AV_LOG_INFO, "%s\n", __func__); +#endif + + if (src_frame->format == AV_PIX_FMT_DRM_PRIME) { + frame = av_frame_alloc(); + av_frame_ref(frame, src_frame); + } + else if (src_frame->format == AV_PIX_FMT_VAAPI) { + frame = av_frame_alloc(); + frame->format = AV_PIX_FMT_DRM_PRIME; + if (av_hwframe_map(frame, src_frame, 0) != 0) { + av_log(s, AV_LOG_WARNING, "Failed to map frame (format=%d) to DRM_PRiME\n", src_frame->format); + av_frame_free(&frame); + return AVERROR(EINVAL); + } + } + else { + av_log(s, AV_LOG_WARNING, "Frame (format=%d) not DRM_PRiME\n", src_frame->format); + return AVERROR(EINVAL); + } + + // Really hacky sync + while (de->show_all && de->q_next) { + usleep(3000); + } + + pthread_mutex_lock(&de->q_lock); + { + AVFrame *const t = de->q_next; + de->q_next = frame; + frame = t; + } + pthread_mutex_unlock(&de->q_lock); + + if (frame == NULL) + sem_post(&de->q_sem); + else + av_frame_free(&frame); + + return 0; +} + +static int egl_vout_write_frame(AVFormatContext *s, int stream_index, AVFrame **ppframe, + unsigned flags) +{ +#if TRACE_ALL + av_log(s, AV_LOG_INFO, "%s: idx=%d, flags=%#x\n", __func__, stream_index, flags); +#endif + + /* egl_vout_write_header() should have accepted only supported formats */ + if ((flags & AV_WRITE_UNCODED_FRAME_QUERY)) + return 0; + + return 0; +} + +static int egl_vout_control_message(AVFormatContext *s, int type, void *data, size_t data_size) +{ +#if TRACE_ALL + av_log(s, AV_LOG_INFO, "%s: %d\n", __func__, type); +#endif + switch (type) { + case AV_APP_TO_DEV_WINDOW_REPAINT: + return 0; + default: + break; + } + return AVERROR(ENOSYS); +} + +// deinit is called if init fails so no need to clean up explicity here +static int egl_vout_init(struct AVFormatContext *s) +{ + egl_display_env_t *const de = s->priv_data; + unsigned int i; + + av_log(s, AV_LOG_DEBUG, "<<< %s\n", __func__); + + de->setup = (struct egl_setup) { 0 }; + + for (i = 0; i != 32; ++i) { + de->aux[i].fd = -1; + } + + de->q_terminate = 0; + pthread_mutex_init(&de->q_lock, NULL); + sem_init(&de->q_sem, 0, 0); + sem_init(&de->display_start_sem, 0, 0); + av_assert0(pthread_create(&de->q_thread, NULL, display_thread, s) == 0); + + sem_wait(&de->display_start_sem); + if (de->q_terminate) { + av_log(s, AV_LOG_ERROR, "%s: Display startup failure\n", __func__); + return -1; + } + + av_log(s, AV_LOG_DEBUG, ">>> %s\n", __func__); + + return 0; +} + +static void egl_vout_deinit(struct AVFormatContext *s) +{ + egl_display_env_t *const de = s->priv_data; + + av_log(s, AV_LOG_DEBUG, "<<< %s\n", __func__); + + de->q_terminate = 1; + sem_post(&de->q_sem); + pthread_join(de->q_thread, NULL); + sem_destroy(&de->q_sem); + pthread_mutex_destroy(&de->q_lock); + + av_frame_free(&de->q_next); + av_frame_free(&de->q_this); + + av_log(s, AV_LOG_DEBUG, ">>> %s\n", __func__); +} + +#define OFFSET(x) offsetof(egl_display_env_t, x) +static const AVOption options[] = { + { "show_all", "show all frames", OFFSET(show_all), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, + { "window_size", "set window forced size", OFFSET(window_width), AV_OPT_TYPE_IMAGE_SIZE, { .str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM }, + { "window_x", "set window x offset", OFFSET(window_x), AV_OPT_TYPE_INT, { .i64 = 0 }, -INT_MAX, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, + { "window_y", "set window y offset", OFFSET(window_y), AV_OPT_TYPE_INT, { .i64 = 0 }, -INT_MAX, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, + { "fullscreen", "set fullscreen display", OFFSET(fullscreen), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, + { NULL } + +}; + +static const AVClass egl_vout_class = { + .class_name = "egl vid outdev", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT, +}; + +AVOutputFormat ff_vout_egl_muxer = { + .name = "vout_egl", + .long_name = NULL_IF_CONFIG_SMALL("Egl video output device"), + .priv_data_size = sizeof(egl_display_env_t), + .audio_codec = AV_CODEC_ID_NONE, + .video_codec = AV_CODEC_ID_WRAPPED_AVFRAME, + .write_header = egl_vout_write_header, + .write_packet = egl_vout_write_packet, + .write_uncoded_frame = egl_vout_write_frame, + .write_trailer = egl_vout_write_trailer, + .control_message = egl_vout_control_message, + .flags = AVFMT_NOFILE | AVFMT_VARIABLE_FPS | AVFMT_NOTIMESTAMPS, + .priv_class = &egl_vout_class, + .init = egl_vout_init, + .deinit = egl_vout_deinit, +}; + diff --git a/libavdevice/rpi_vout.c b/libavdevice/rpi_vout.c new file mode 100644 index 0000000000..84723a34ad --- /dev/null +++ b/libavdevice/rpi_vout.c @@ -0,0 +1,534 @@ +/* + * Copyright (c) 2013 Jeff Moguillansky + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * XVideo output device + * + * TODO: + * - add support to more formats + */ + +#include "libavutil/opt.h" +#include "libavutil/avassert.h" +#include "libavutil/pixdesc.h" +#include "libavutil/imgutils.h" +#include "libavformat/internal.h" +#include "avdevice.h" + +#include +#include + +#pragma GCC diagnostic push +// Many many redundant decls in the header files +#pragma GCC diagnostic ignored "-Wredundant-decls" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#pragma GCC diagnostic pop +#include "libavutil/rpi_sand_fns.h" +#include "libavcodec/rpi_zc.h" + +#define TRACE_ALL 0 + +#define DISPLAY_PORT_DEPTH 4 + +typedef struct rpi_display_env_s +{ + AVClass *class; + + MMAL_COMPONENT_T* display; + MMAL_COMPONENT_T* isp; + MMAL_PORT_T * port_in; // Input port of either isp or display depending on pipe setup + MMAL_CONNECTION_T * conn; + + MMAL_POOL_T *rpi_pool; + volatile int rpi_display_count; + + MMAL_FOURCC_T req_fmt; + MMAL_VIDEO_FORMAT_T req_vfmt; + + AVZcEnvPtr zc; + + int window_width, window_height; + int window_x, window_y; + int layer, fullscreen; + int show_all; +} rpi_display_env_t; + + +static void display_cb_input(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) { + mmal_buffer_header_release(buffer); +} + +static void display_cb_control(MMAL_PORT_T *port,MMAL_BUFFER_HEADER_T *buffer) { + mmal_buffer_header_release(buffer); +} + + +static MMAL_FOURCC_T mmfmt_from_avfmt(const enum AVPixelFormat fmt) +{ + switch (fmt) { + case AV_PIX_FMT_SAND128: + case AV_PIX_FMT_RPI4_8: + return MMAL_ENCODING_YUVUV128; + case AV_PIX_FMT_RPI4_10: + return MMAL_ENCODING_YUV10_COL; + case AV_PIX_FMT_SAND64_10: + return MMAL_ENCODING_YUVUV64_10; + case AV_PIX_FMT_SAND64_16: + return MMAL_ENCODING_YUVUV64_16; + case AV_PIX_FMT_YUV420P: + return MMAL_ENCODING_I420; + + default: + break; + } + return 0; +} + + +static void video_format_from_zc_frame(MMAL_ES_FORMAT_T* const es_fmt, + const AVFrame * const frame, const AVRpiZcRefPtr fr_ref) +{ + MMAL_VIDEO_FORMAT_T *const vfmt = &es_fmt->es->video; + const AVRpiZcFrameGeometry * geo = av_rpi_zc_geometry(fr_ref); + if (av_rpi_is_sand_format(geo->format)) { + // Sand formats are a bit "special" + // stride1 implicit in format + // width = stride2 + vfmt->width = geo->stripe_is_yc ? + geo->height_y + geo->height_c : geo->height_y; +// es->height = geo->video_height; //*** When we get the FLAG this will change + vfmt->height = geo->height_y; + es_fmt->flags = MMAL_ES_FORMAT_FLAG_COL_FMTS_WIDTH_IS_COL_STRIDE; + } + else { + vfmt->width = geo->stride_y / geo->bytes_per_pel; + vfmt->height = geo->height_y; + es_fmt->flags = 0; + } + + es_fmt->type = MMAL_ES_TYPE_VIDEO; + es_fmt->encoding = mmfmt_from_avfmt(geo->format); + es_fmt->encoding_variant = 0; + es_fmt->bitrate = 0; + + vfmt->crop.x = frame->crop_left; + vfmt->crop.y = frame->crop_top; + vfmt->crop.width = av_frame_cropped_width(frame); + vfmt->crop.height = av_frame_cropped_height(frame); + + vfmt->frame_rate.den = 0; // Don't think I know it here + vfmt->frame_rate.num = 0; + + vfmt->par.den = frame->sample_aspect_ratio.den; + vfmt->par.num = frame->sample_aspect_ratio.num; + + vfmt->color_space = 0; // Unknown currently +} + +static MMAL_BOOL_T buf_release_cb(MMAL_BUFFER_HEADER_T * buf, void *userdata) +{ + rpi_display_env_t * const de = userdata; + if (buf->user_data != NULL) { + av_rpi_zc_unref((AVRpiZcRefPtr)buf->user_data); + buf->user_data = NULL; + } + atomic_fetch_add(&de->rpi_display_count, -1); + return MMAL_FALSE; +} + +static inline int avfmt_needs_isp(const enum AVPixelFormat avfmt) +{ + return avfmt == AV_PIX_FMT_SAND64_10; +} + +static void isp_remove(AVFormatContext * const s, rpi_display_env_t * const de) +{ + if (de->isp != NULL) + { + if (de->isp->input[0]->is_enabled) + mmal_port_disable(de->isp->input[0]); + if (de->isp->control->is_enabled) + mmal_port_disable(de->isp->control); + } + if (de->conn != NULL) { + mmal_connection_destroy(de->conn); + de->conn = NULL; + } + if (de->isp != NULL) { + mmal_component_destroy(de->isp); + de->isp = NULL; + } +} + +static void display_frame(AVFormatContext * const s, rpi_display_env_t * const de, const AVFrame* const fr) +{ + MMAL_BUFFER_HEADER_T* buf = NULL; + AVRpiZcRefPtr fr_buf = NULL; + + if (de == NULL) + return; + + if (atomic_load(&de->rpi_display_count) >= DISPLAY_PORT_DEPTH - 1) { + av_log(s, AV_LOG_VERBOSE, "Frame dropped\n"); + return; + } + + if ((fr_buf = av_rpi_zc_ref(s, de->zc, fr, fr->format, 1)) == NULL) { + return; + } + + buf = mmal_queue_get(de->rpi_pool->queue); + if (!buf) { + // Running too fast so drop the frame (unexpected) + goto fail; + } + + buf->cmd = 0; + buf->offset = 0; + buf->flags = 0; + mmal_buffer_header_reset(buf); + + atomic_fetch_add(&de->rpi_display_count, 1); // Deced on release + mmal_buffer_header_pre_release_cb_set(buf, buf_release_cb, de); + + buf->user_data = fr_buf; + buf->data = (uint8_t *)av_rpi_zc_vc_handle(fr_buf); // Cast our handle to a pointer for mmal + buf->offset = av_rpi_zc_offset(fr_buf); + buf->length = av_rpi_zc_length(fr_buf); + buf->alloc_size = av_rpi_zc_numbytes(fr_buf); + + while (de->show_all && atomic_load(&de->rpi_display_count) >= DISPLAY_PORT_DEPTH - 1) { + usleep(5000); + } + + { + MMAL_ES_SPECIFIC_FORMAT_T new_ess = {.video = {0}}; + MMAL_ES_FORMAT_T new_es = {.es = &new_ess}; + MMAL_VIDEO_FORMAT_T * const new_vfmt = &new_ess.video; + + video_format_from_zc_frame(&new_es, fr, fr_buf); + if (de->req_fmt != new_es.encoding || + de->req_vfmt.width != new_vfmt->width || + de->req_vfmt.height != new_vfmt->height || + de->req_vfmt.crop.x != new_vfmt->crop.x || + de->req_vfmt.crop.y != new_vfmt->crop.y || + de->req_vfmt.crop.width != new_vfmt->crop.width || + de->req_vfmt.crop.height != new_vfmt->crop.height) { + // Something has changed + + // If we have an ISP tear it down + isp_remove(s, de); + de->port_in = de->display->input[0]; + + // If we still need an ISP create it now + if (avfmt_needs_isp(fr->format)) + { + if (mmal_component_create("vc.ril.isp", &de->isp) != MMAL_SUCCESS) + { + av_log(s, AV_LOG_ERROR, "ISP creation failed\n"); + goto fail; + } + de->port_in = de->isp->input[0]; + } + + mmal_format_copy(de->port_in->format, &new_es); + + if (mmal_port_format_commit(de->port_in)) { + av_log(s, AV_LOG_ERROR, "Failed to commit input format\n"); + goto fail; + } + + // If we have an ISP then we must want to use it + if (de->isp != NULL) { + MMAL_PORT_T * const port_out = de->isp->output[0]; + MMAL_VIDEO_FORMAT_T* vfmt_in = &de->port_in->format->es->video; + MMAL_VIDEO_FORMAT_T* vfmt_out = &port_out->format->es->video; + + port_out->format->type = MMAL_ES_TYPE_VIDEO; + port_out->format->encoding = MMAL_ENCODING_YUVUV128; + port_out->format->encoding_variant = 0; + port_out->format->bitrate = 0; + port_out->format->flags = 0; + port_out->format->extradata = NULL; + port_out->format->extradata_size = 0; + + vfmt_out->width = (vfmt_in->crop.width + 31) & ~31; + vfmt_out->height = (vfmt_in->crop.height + 15) & ~15; + vfmt_out->crop.x = 0; + vfmt_out->crop.y = 0; + vfmt_out->crop.width = vfmt_in->crop.width; + vfmt_out->crop.height = vfmt_in->crop.height; + vfmt_out->frame_rate = vfmt_in->frame_rate; + vfmt_out->par = vfmt_in->par; + vfmt_out->color_space = vfmt_in->color_space; + + if (mmal_port_format_commit(port_out)) { + av_log(s, AV_LOG_ERROR, "Failed to commit output format\n"); + goto fail; + } + + if (mmal_connection_create(&de->conn, port_out, de->display->input[0], MMAL_CONNECTION_FLAG_TUNNELLING) != MMAL_SUCCESS) { + av_log(s, AV_LOG_ERROR, "Failed to create connection\n"); + goto fail; + } + if (mmal_connection_enable(de->conn) != MMAL_SUCCESS) { + av_log(s, AV_LOG_ERROR, "Failed to enable connection\n"); + goto fail; + } + mmal_port_enable(de->isp->control,display_cb_control); + mmal_component_enable(de->isp); + } + + // Number of slots in my port Q + de->port_in->buffer_num = DISPLAY_PORT_DEPTH; + // Size to keep it happy - isn't used for anything other than error checking + de->port_in->buffer_size = buf->alloc_size; + if (!de->port_in->is_enabled) + { + mmal_port_parameter_set_boolean(de->port_in, MMAL_PARAMETER_ZERO_COPY, MMAL_TRUE); // Does this mark that the buffer contains a vc_handle? Would have expected a vc_image? + if (mmal_port_enable(de->port_in, display_cb_input) != MMAL_SUCCESS) { + av_log(s, AV_LOG_ERROR, "Failed to enable input port\n"); + goto fail; + } + } + + de->req_fmt = new_es.encoding; + de->req_vfmt = *new_vfmt; + } + } + + if (mmal_port_send_buffer(de->port_in, buf) != MMAL_SUCCESS) + { + av_log(s, AV_LOG_ERROR, "mmal_port_send_buffer failed: depth=%d\n", de->rpi_display_count); + goto fail; + } + return; + +fail: + // If we have a buf then fr_buf is held by that + if (buf != NULL) + mmal_buffer_header_release(buf); + else if (fr_buf != NULL) + av_rpi_zc_unref(fr_buf); +} + + +static int xv_write_trailer(AVFormatContext *s) +{ + rpi_display_env_t * const de = s->priv_data; +#if TRACE_ALL + av_log(s, AV_LOG_INFO, "%s\n", __func__); +#endif + if (de->port_in != NULL && de->port_in->is_enabled) { + mmal_port_disable(de->port_in); + } + + // The above disable should kick out all buffers - check that + if (atomic_load(&de->rpi_display_count) != 0) { + av_log(s, AV_LOG_WARNING, "Exiting with display count non-zero:%d\n", atomic_load(&de->rpi_display_count)); + } + + isp_remove(s, de); + if (de->rpi_pool != NULL) { + mmal_pool_destroy(de->rpi_pool); + de->rpi_pool = NULL; + } + if (de->display != NULL) { + mmal_component_destroy(de->display); + de->display = NULL; + } + + return 0; +} + +static int xv_write_header(AVFormatContext *s) +{ + rpi_display_env_t * const de = s->priv_data; + const AVCodecParameters * const par = s->streams[0]->codecpar; + const unsigned int w = de->window_width ? de->window_width : par->width; + const unsigned int h = de->window_height ? de->window_height : par->height; + const unsigned int x = de->window_x; + const unsigned int y = de->window_y; + const int layer = de->layer ? de->layer : 2; + const MMAL_BOOL_T fullscreen = de->fullscreen; + +#if TRACE_ALL + av_log(s, AV_LOG_INFO, "%s: %dx%d\n", __func__, w, h); +#endif + if ( s->nb_streams > 1 + || par->codec_type != AVMEDIA_TYPE_VIDEO + || par->codec_id != AV_CODEC_ID_WRAPPED_AVFRAME) { + av_log(s, AV_LOG_ERROR, "Only supports one wrapped avframe stream\n"); + return AVERROR(EINVAL); + } + + { + MMAL_DISPLAYREGION_T region = + { + .hdr = {MMAL_PARAMETER_DISPLAYREGION, sizeof(region)}, + .set = MMAL_DISPLAY_SET_LAYER | MMAL_DISPLAY_SET_FULLSCREEN | + MMAL_DISPLAY_SET_DEST_RECT | MMAL_DISPLAY_SET_ALPHA, + .layer = layer, + .fullscreen = fullscreen, + .dest_rect = {x, y, w, h}, + .alpha = !fullscreen ? 0xff : 0xff | MMAL_DISPLAY_ALPHA_FLAGS_DISCARD_LOWER_LAYERS, + }; + + bcm_host_init(); // Needs to be done by someone... + + if (mmal_component_create(MMAL_COMPONENT_DEFAULT_VIDEO_RENDERER, &de->display) != MMAL_SUCCESS) + { + av_log(s, AV_LOG_ERROR, "Failed to create display component\n"); + goto fail; + } + de->port_in = de->display->input[0]; + + mmal_port_parameter_set(de->display->input[0], ®ion.hdr); + + if (mmal_component_enable(de->display) != MMAL_SUCCESS) + { + av_log(s, AV_LOG_ERROR, "Failed to enable display component\n"); + goto fail; + } + if (mmal_port_enable(de->display->control,display_cb_control) != MMAL_SUCCESS) + { + av_log(s, AV_LOG_ERROR, "Failed to enable display control port\n"); + goto fail; + } + + if ((de->rpi_pool = mmal_pool_create(DISPLAY_PORT_DEPTH, 0)) == NULL) + { + av_log(s, AV_LOG_ERROR, "Failed to create pool\n"); + goto fail; + } + } + + return 0; + +fail: + xv_write_trailer(s); + return AVERROR_UNKNOWN; +} + +static int xv_write_packet(AVFormatContext *s, AVPacket *pkt) +{ + AVFrame * const frame = (AVFrame *)pkt->data; +#if TRACE_ALL + av_log(s, AV_LOG_INFO, "%s\n", __func__); +#endif + display_frame(s, s->priv_data, frame); + return 0; +} + +static int xv_write_frame(AVFormatContext *s, int stream_index, AVFrame **ppframe, + unsigned flags) +{ +#if TRACE_ALL + av_log(s, AV_LOG_INFO, "%s: idx=%d, flags=%#x\n", __func__, stream_index, flags); +#endif + + /* xv_write_header() should have accepted only supported formats */ + if ((flags & AV_WRITE_UNCODED_FRAME_QUERY)) + return 0; +// return write_picture(s, (*frame)->data, (*frame)->linesize); + + display_frame(s, s->priv_data, *ppframe); + return 0; +} + +static int xv_control_message(AVFormatContext *s, int type, void *data, size_t data_size) +{ +#if TRACE_ALL + av_log(s, AV_LOG_INFO, "%s: %d\n", __func__, type); +#endif + switch(type) { + case AV_APP_TO_DEV_WINDOW_REPAINT: + return 0; + default: + break; + } + return AVERROR(ENOSYS); +} + +// deinit is called if init fails so no need to clean up explicity here +static int rpi_vout_init(struct AVFormatContext * s) +{ + rpi_display_env_t * const de = s->priv_data; + + // Get a ZC context in case we need one - has little overhead if unused + if ((de->zc = av_rpi_zc_int_env_alloc(s)) == NULL) + return 1; + + return 0; +} + +static void rpi_vout_deinit(struct AVFormatContext * s) +{ + rpi_display_env_t * const de = s->priv_data; + + av_rpi_zc_int_env_freep(&de->zc); +} + + +#define OFFSET(x) offsetof(rpi_display_env_t, x) +static const AVOption options[] = { + { "show_all", "show all frames", OFFSET(show_all), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, + { "window_size", "set window forced size", OFFSET(window_width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, AV_OPT_FLAG_ENCODING_PARAM }, + { "window_x", "set window x offset", OFFSET(window_x), AV_OPT_TYPE_INT, {.i64 = 0 }, -INT_MAX, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, + { "window_y", "set window y offset", OFFSET(window_y), AV_OPT_TYPE_INT, {.i64 = 0 }, -INT_MAX, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, + { "display_layer","set display layer", OFFSET(layer), AV_OPT_TYPE_INT, {.i64 = 0 }, -INT_MAX, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, + { "fullscreen", "set fullscreen display", OFFSET(fullscreen), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, + { NULL } + +}; + +static const AVClass xv_class = { + .class_name = "rpi vid outdev", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT, +}; + +AVOutputFormat ff_vout_rpi_muxer = { + .name = "vout_rpi", + .long_name = NULL_IF_CONFIG_SMALL("Rpi (mmal) video output device"), + .priv_data_size = sizeof(rpi_display_env_t), + .audio_codec = AV_CODEC_ID_NONE, + .video_codec = AV_CODEC_ID_WRAPPED_AVFRAME, + .write_header = xv_write_header, + .write_packet = xv_write_packet, + .write_uncoded_frame = xv_write_frame, + .write_trailer = xv_write_trailer, + .control_message = xv_control_message, + .flags = AVFMT_NOFILE | AVFMT_VARIABLE_FPS | AVFMT_NOTIMESTAMPS, + .priv_class = &xv_class, + .init = rpi_vout_init, + .deinit = rpi_vout_deinit, +}; diff --git a/libavfilter/Makefile b/libavfilter/Makefile index b2c254ea67..144fbda652 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -233,6 +233,7 @@ OBJS-$(CONFIG_DEFLATE_FILTER) += vf_neighbor.o OBJS-$(CONFIG_DEFLICKER_FILTER) += vf_deflicker.o OBJS-$(CONFIG_DEINTERLACE_QSV_FILTER) += vf_deinterlace_qsv.o OBJS-$(CONFIG_DEINTERLACE_VAAPI_FILTER) += vf_deinterlace_vaapi.o vaapi_vpp.o +OBJS-$(CONFIG_DEINTERLACE_V4L2M2M_FILTER) += vf_deinterlace_v4l2m2m.o OBJS-$(CONFIG_DEJUDDER_FILTER) += vf_dejudder.o OBJS-$(CONFIG_DELOGO_FILTER) += vf_delogo.o OBJS-$(CONFIG_DENOISE_VAAPI_FILTER) += vf_misc_vaapi.o vaapi_vpp.o @@ -459,6 +460,7 @@ OBJS-$(CONFIG_TRANSPOSE_OPENCL_FILTER) += vf_transpose_opencl.o opencl.o o OBJS-$(CONFIG_TRANSPOSE_VAAPI_FILTER) += vf_transpose_vaapi.o vaapi_vpp.o OBJS-$(CONFIG_TRIM_FILTER) += trim.o OBJS-$(CONFIG_UNPREMULTIPLY_FILTER) += vf_premultiply.o framesync.o +OBJS-$(CONFIG_UNSAND_FILTER) += vf_unsand.o OBJS-$(CONFIG_UNSHARP_FILTER) += vf_unsharp.o OBJS-$(CONFIG_UNSHARP_OPENCL_FILTER) += vf_unsharp_opencl.o opencl.o \ opencl/unsharp.o diff --git a/libavfilter/aarch64/Makefile b/libavfilter/aarch64/Makefile index b58daa3a3f..b68209bc94 100644 --- a/libavfilter/aarch64/Makefile +++ b/libavfilter/aarch64/Makefile @@ -1,3 +1,5 @@ +OBJS-$(CONFIG_BWDIF_FILTER) += aarch64/vf_bwdif_init_aarch64.o OBJS-$(CONFIG_NLMEANS_FILTER) += aarch64/vf_nlmeans_init.o +NEON-OBJS-$(CONFIG_BWDIF_FILTER) += aarch64/vf_bwdif_neon.o NEON-OBJS-$(CONFIG_NLMEANS_FILTER) += aarch64/vf_nlmeans_neon.o diff --git a/libavfilter/aarch64/vf_bwdif_init_aarch64.c b/libavfilter/aarch64/vf_bwdif_init_aarch64.c new file mode 100644 index 0000000000..f52bc4b9b4 --- /dev/null +++ b/libavfilter/aarch64/vf_bwdif_init_aarch64.c @@ -0,0 +1,125 @@ +/* + * bwdif aarch64 NEON optimisations + * + * Copyright (c) 2023 John Cox + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/common.h" +#include "libavfilter/bwdif.h" +#include "libavutil/aarch64/cpu.h" + +void ff_bwdif_filter_edge_neon(void *dst1, void *prev1, void *cur1, void *next1, + int w, int prefs, int mrefs, int prefs2, int mrefs2, + int parity, int clip_max, int spat); + +void ff_bwdif_filter_intra_neon(void *dst1, void *cur1, int w, int prefs, int mrefs, + int prefs3, int mrefs3, int parity, int clip_max); + +void ff_bwdif_filter_line_neon(void *dst1, void *prev1, void *cur1, void *next1, + int w, int prefs, int mrefs, int prefs2, int mrefs2, + int prefs3, int mrefs3, int prefs4, int mrefs4, + int parity, int clip_max); + +void ff_bwdif_filter_line3_neon(void * dst1, int d_stride, + const void * prev1, const void * cur1, const void * next1, int s_stride, + int w, int parity, int clip_max); + + +static void filter_line3_helper(void * dst1, int d_stride, + const void * prev1, const void * cur1, const void * next1, int s_stride, + int w, int parity, int clip_max) +{ + // Asm works on 16 byte chunks + // If w is a multiple of 16 then all is good - if not then if width rounded + // up to nearest 16 will fit in both src & dst strides then allow the asm + // to write over the padding bytes as that is almost certainly faster than + // having to invoke the C version to clean up the tail. + const int w1 = FFALIGN(w, 16); + const int w0 = clip_max != 255 ? 0 : + d_stride <= w1 && s_stride <= w1 ? w : w & ~15; + + ff_bwdif_filter_line3_neon(dst1, d_stride, + prev1, cur1, next1, s_stride, + w0, parity, clip_max); + + if (w0 < w) + ff_bwdif_filter_line3_c((char *)dst1 + w0, d_stride, + (const char *)prev1 + w0, (const char *)cur1 + w0, (const char *)next1 + w0, s_stride, + w - w0, parity, clip_max); +} + +static void filter_line_helper(void *dst1, void *prev1, void *cur1, void *next1, + int w, int prefs, int mrefs, int prefs2, int mrefs2, + int prefs3, int mrefs3, int prefs4, int mrefs4, + int parity, int clip_max) +{ + const int w0 = clip_max != 255 ? 0 : w & ~15; + + ff_bwdif_filter_line_neon(dst1, prev1, cur1, next1, + w0, prefs, mrefs, prefs2, mrefs2, prefs3, mrefs3, prefs4, mrefs4, parity, clip_max); + + if (w0 < w) + ff_bwdif_filter_line_c((char *)dst1 + w0, (char *)prev1 + w0, (char *)cur1 + w0, (char *)next1 + w0, + w - w0, prefs, mrefs, prefs2, mrefs2, prefs3, mrefs3, prefs4, mrefs4, parity, clip_max); +} + +static void filter_edge_helper(void *dst1, void *prev1, void *cur1, void *next1, + int w, int prefs, int mrefs, int prefs2, int mrefs2, + int parity, int clip_max, int spat) +{ + const int w0 = clip_max != 255 ? 0 : w & ~15; + + ff_bwdif_filter_edge_neon(dst1, prev1, cur1, next1, w0, prefs, mrefs, prefs2, mrefs2, + parity, clip_max, spat); + + if (w0 < w) + ff_bwdif_filter_edge_c((char *)dst1 + w0, (char *)prev1 + w0, (char *)cur1 + w0, (char *)next1 + w0, + w - w0, prefs, mrefs, prefs2, mrefs2, + parity, clip_max, spat); +} + +static void filter_intra_helper(void *dst1, void *cur1, int w, int prefs, int mrefs, + int prefs3, int mrefs3, int parity, int clip_max) +{ + const int w0 = clip_max != 255 ? 0 : w & ~15; + + ff_bwdif_filter_intra_neon(dst1, cur1, w0, prefs, mrefs, prefs3, mrefs3, parity, clip_max); + + if (w0 < w) + ff_bwdif_filter_intra_c((char *)dst1 + w0, (char *)cur1 + w0, + w - w0, prefs, mrefs, prefs3, mrefs3, parity, clip_max); +} + +void +ff_bwdif_init_aarch64(BWDIFContext *s, int bit_depth) +{ + const int cpu_flags = av_get_cpu_flags(); + + if (bit_depth != 8) + return; + + if (!have_neon(cpu_flags)) + return; + + s->filter_intra = filter_intra_helper; + s->filter_line = filter_line_helper; + s->filter_edge = filter_edge_helper; + s->filter_line3 = filter_line3_helper; +} + diff --git a/libavfilter/aarch64/vf_bwdif_neon.S b/libavfilter/aarch64/vf_bwdif_neon.S new file mode 100644 index 0000000000..ae9aab20cd --- /dev/null +++ b/libavfilter/aarch64/vf_bwdif_neon.S @@ -0,0 +1,788 @@ +/* + * bwdif aarch64 NEON optimisations + * + * Copyright (c) 2023 John Cox + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include "libavutil/aarch64/asm.S" + +// Space taken on the stack by an int (32-bit) +#ifdef __APPLE__ +.set SP_INT, 4 +#else +.set SP_INT, 8 +#endif + +.macro SQSHRUNN b, s0, s1, s2, s3, n + sqshrun \s0\().4h, \s0\().4s, #\n - 8 + sqshrun2 \s0\().8h, \s1\().4s, #\n - 8 + sqshrun \s1\().4h, \s2\().4s, #\n - 8 + sqshrun2 \s1\().8h, \s3\().4s, #\n - 8 + uzp2 \b\().16b, \s0\().16b, \s1\().16b +.endm + +.macro SMULL4K a0, a1, a2, a3, s0, s1, k + smull \a0\().4s, \s0\().4h, \k + smull2 \a1\().4s, \s0\().8h, \k + smull \a2\().4s, \s1\().4h, \k + smull2 \a3\().4s, \s1\().8h, \k +.endm + +.macro UMULL4K a0, a1, a2, a3, s0, s1, k + umull \a0\().4s, \s0\().4h, \k + umull2 \a1\().4s, \s0\().8h, \k + umull \a2\().4s, \s1\().4h, \k + umull2 \a3\().4s, \s1\().8h, \k +.endm + +.macro UMLAL4K a0, a1, a2, a3, s0, s1, k + umlal \a0\().4s, \s0\().4h, \k + umlal2 \a1\().4s, \s0\().8h, \k + umlal \a2\().4s, \s1\().4h, \k + umlal2 \a3\().4s, \s1\().8h, \k +.endm + +.macro UMLSL4K a0, a1, a2, a3, s0, s1, k + umlsl \a0\().4s, \s0\().4h, \k + umlsl2 \a1\().4s, \s0\().8h, \k + umlsl \a2\().4s, \s1\().4h, \k + umlsl2 \a3\().4s, \s1\().8h, \k +.endm + +// int b = m2s1 - m1; +// int f = p2s1 - p1; +// int dc = c0s1 - m1; +// int de = c0s1 - p1; +// int sp_max = FFMIN(p1 - c0s1, m1 - c0s1); +// sp_max = FFMIN(sp_max, FFMAX(-b,-f)); +// int sp_min = FFMIN(c0s1 - p1, c0s1 - m1); +// sp_min = FFMIN(sp_min, FFMAX(b,f)); +// diff = diff == 0 ? 0 : FFMAX3(diff, sp_min, sp_max); +.macro SPAT_CHECK diff, m2s1, m1, c0s1, p1, p2s1, t0, t1, t2, t3 + uqsub \t0\().16b, \p1\().16b, \c0s1\().16b + uqsub \t2\().16b, \m1\().16b, \c0s1\().16b + umin \t2\().16b, \t0\().16b, \t2\().16b + + uqsub \t1\().16b, \m1\().16b, \m2s1\().16b + uqsub \t3\().16b, \p1\().16b, \p2s1\().16b + umax \t3\().16b, \t3\().16b, \t1\().16b + umin \t3\().16b, \t3\().16b, \t2\().16b + + uqsub \t0\().16b, \c0s1\().16b, \p1\().16b + uqsub \t2\().16b, \c0s1\().16b, \m1\().16b + umin \t2\().16b, \t0\().16b, \t2\().16b + + uqsub \t1\().16b, \m2s1\().16b, \m1\().16b + uqsub \t0\().16b, \p2s1\().16b, \p1\().16b + umax \t0\().16b, \t0\().16b, \t1\().16b + umin \t2\().16b, \t2\().16b, \t0\().16b + + cmeq \t1\().16b, \diff\().16b, #0 + umax \diff\().16b, \diff\().16b, \t3\().16b + umax \diff\().16b, \diff\().16b, \t2\().16b + bic \diff\().16b, \diff\().16b, \t1\().16b +.endm + +// i0 = s0; +// if (i0 > d0 + diff0) +// i0 = d0 + diff0; +// else if (i0 < d0 - diff0) +// i0 = d0 - diff0; +// +// i0 = s0 is safe +.macro DIFF_CLIP i0, s0, d0, diff, t0, t1 + uqadd \t0\().16b, \d0\().16b, \diff\().16b + uqsub \t1\().16b, \d0\().16b, \diff\().16b + umin \i0\().16b, \s0\().16b, \t0\().16b + umax \i0\().16b, \i0\().16b, \t1\().16b +.endm + +// i0 = FFABS(m1 - p1) > td0 ? i1 : i2; +// DIFF_CLIP +// +// i0 = i1 is safe +.macro INTERPOL i0, i1, i2, m1, d0, p1, td0, diff, t0, t1, t2 + uabd \t0\().16b, \m1\().16b, \p1\().16b + cmhi \t0\().16b, \t0\().16b, \td0\().16b + bsl \t0\().16b, \i1\().16b, \i2\().16b + DIFF_CLIP \i0, \t0, \d0, \diff, \t1, \t2 +.endm + +.macro PUSH_VREGS + stp d8, d9, [sp, #-64]! + stp d10, d11, [sp, #16] + stp d12, d13, [sp, #32] + stp d14, d15, [sp, #48] +.endm + +.macro POP_VREGS + ldp d14, d15, [sp, #48] + ldp d12, d13, [sp, #32] + ldp d10, d11, [sp, #16] + ldp d8, d9, [sp], #64 +.endm + +.macro LDR_COEFFS d, t0 + movrel \t0, coeffs, 0 + ld1 {\d\().8h}, [\t0] +.endm + +// static const uint16_t coef_lf[2] = { 4309, 213 }; +// static const uint16_t coef_hf[3] = { 5570, 3801, 1016 }; +// static const uint16_t coef_sp[2] = { 5077, 981 }; + +const coeffs, align=4 // align 4 means align on 2^4 boundry + .hword 4309 * 4, 213 * 4 // lf[0]*4 = v0.h[0] + .hword 5570, 3801, 1016, -3801 // hf[0] = v0.h[2], -hf[1] = v0.h[5] + .hword 5077, 981 // sp[0] = v0.h[6] +endconst + +// =========================================================================== +// +// void ff_bwdif_filter_line3_neon( +// void * dst1, // x0 +// int d_stride, // w1 +// const void * prev1, // x2 +// const void * cur1, // x3 +// const void * next1, // x4 +// int s_stride, // w5 +// int w, // w6 +// int parity, // w7 +// int clip_max); // [sp, #0] (Ignored) + +function ff_bwdif_filter_line3_neon, export=1 + // Sanity check w + cmp w6, #0 + ble 99f + + LDR_COEFFS v0, x17 + +// #define prev2 cur +// const uint8_t * restrict next2 = parity ? prev : next; + cmp w7, #0 + csel x17, x2, x4, ne + + // We want all the V registers - save all the ones we must + PUSH_VREGS + + // Some rearrangement of initial values for nice layout of refs in regs + mov w10, w6 // w10 = loop count + neg w9, w5 // w9 = mref + lsl w8, w9, #1 // w8 = mref2 + add w7, w9, w9, LSL #1 // w7 = mref3 + lsl w6, w9, #2 // w6 = mref4 + mov w11, w5 // w11 = pref + lsl w12, w5, #1 // w12 = pref2 + add w13, w5, w5, LSL #1 // w13 = pref3 + lsl w14, w5, #2 // w14 = pref4 + add w15, w5, w5, LSL #2 // w15 = pref5 + add w16, w14, w12 // w16 = pref6 + + lsl w5, w1, #1 // w5 = d_stride * 2 + +// for (x = 0; x < w; x++) { +// int diff0, diff2; +// int d0, d2; +// int temporal_diff0, temporal_diff2; +// +// int i1, i2; +// int j1, j2; +// int p6, p5, p4, p3, p2, p1, c0, m1, m2, m3, m4; + +10: +// c0 = prev2[0] + next2[0]; // c0 = v20, v21 +// d0 = c0 >> 1; // d0 = v10 +// temporal_diff0 = FFABS(prev2[0] - next2[0]); // td0 = v11 + ldr q31, [x3] + ldr q21, [x17] + uhadd v10.16b, v31.16b, v21.16b + uabd v11.16b, v31.16b, v21.16b + uaddl v20.8h, v21.8b, v31.8b + uaddl2 v21.8h, v21.16b, v31.16b + + ldr q31, [x3, w6, sxtw] + ldr q23, [x17, w6, sxtw] + +// i1 = coef_hf[0] * c0; // i1 = v2-v5 + UMULL4K v2, v3, v4, v5, v20, v21, v0.h[2] + + ldr q30, [x3, w14, sxtw] + ldr q25, [x17, w14, sxtw] + +// m4 = prev2[mrefs4] + next2[mrefs4]; // m4 = v22,v23 + uaddl v22.8h, v23.8b, v31.8b + uaddl2 v23.8h, v23.16b, v31.16b + +// p4 = prev2[prefs4] + next2[prefs4]; // p4 = v24,v25, (p4 >> 1) = v12 + uhadd v12.16b, v25.16b, v30.16b + uaddl v24.8h, v25.8b, v30.8b + uaddl2 v25.8h, v25.16b, v30.16b + +// j1 = -coef_hf[1] * (c0 + p4); // j1 = v6-v9 (-c0:v20,v21) + add v20.8h, v20.8h, v24.8h + add v21.8h, v21.8h, v25.8h + SMULL4K v6, v7, v8, v9, v20, v21, v0.h[5] + +// m3 = cur[mrefs3]; // m3 = v20 + ldr q20, [x3, w7, sxtw] + +// p3 = cur[prefs3]; // p3 = v21 + ldr q21, [x3, w13, sxtw] + +// i1 += coef_hf[2] * (m4 + p4); // (-m4:v22,v23) (-p4:v24,v25) + add v22.8h, v22.8h, v24.8h + add v23.8h, v23.8h, v25.8h + UMLAL4K v2, v3, v4, v5, v22, v23, v0.h[4] + + ldr q29, [x3, w8, sxtw] + ldr q23, [x17, w8, sxtw] + +// i1 -= coef_lf[1] * 4 * (m3 + p3); // - + uaddl v30.8h, v20.8b, v21.8b + uaddl2 v31.8h, v20.16b, v21.16b + + ldr q28, [x3, w16, sxtw] + ldr q25, [x17, w16, sxtw] + + UMLSL4K v2, v3, v4, v5, v30, v31, v0.h[1] + +// m2 = prev2[mrefs2] + next2[mrefs2]; // m2 = v22,v23, (m2 >> 1) = v13 + uhadd v13.16b, v23.16b, v29.16b + uaddl v22.8h, v23.8b, v29.8b + uaddl2 v23.8h, v23.16b, v29.16b + + ldr q31, [x3, w12, sxtw] + ldr q27, [x17, w12, sxtw] + +// p6 = prev2[prefs6] + next2[prefs6]; // p6 = v24,v25 + uaddl v24.8h, v25.8b, v28.8b + uaddl2 v25.8h, v25.16b, v28.16b + +// j1 += coef_hf[2] * (m2 + p6); // (-p6:v24,v25) + add v24.8h, v24.8h, v22.8h + add v25.8h, v25.8h, v23.8h + UMLAL4K v6, v7, v8, v9, v24, v25, v0.h[4] + +// m1 = cur[mrefs]; // m1 = v24 + ldr q24, [x3, w9, sxtw] + +// p5 = cur[prefs5]; // p5 = v25 + ldr q25, [x3, w15, sxtw] + +// p2 = prev2[prefs2] + next2[prefs2]; // p2 = v26, v27 +// temporal_diff2 = FFABS(prev2[prefs2] - next2[prefs2]); // td2 = v14 +// d2 = p2 >> 1; // d2 = v15 + uabd v14.16b, v31.16b, v27.16b + uhadd v15.16b, v31.16b, v27.16b + uaddl v26.8h, v27.8b, v31.8b + uaddl2 v27.8h, v27.16b, v31.16b + +// j1 += coef_hf[0] * p2; // - + UMLAL4K v6, v7, v8, v9, v26, v27, v0.h[2] + +// i1 -= coef_hf[1] * (m2 + p2); // (-m2:v22,v23*) (-p2:v26*,v27*) + add v22.8h, v22.8h, v26.8h + add v23.8h, v23.8h, v27.8h + UMLSL4K v2, v3, v4, v5, v22, v23, v0.h[3] + +// p1 = cur[prefs]; // p1 = v22 + ldr q22, [x3, w11, sxtw] + +// j1 -= coef_lf[1] * 4 * (m1 + p5); // - + uaddl v26.8h, v24.8b, v25.8b + uaddl2 v27.8h, v24.16b, v25.16b + UMLSL4K v6, v7, v8, v9, v26, v27, v0.h[1] + +// j2 = (coef_sp[0] * (p1 + p3) - coef_sp[1] * (m1 + p5)) >> 13; // (-p5:v25*) j2=v16 + uaddl v18.8h, v22.8b, v21.8b + uaddl2 v19.8h, v22.16b, v21.16b + UMULL4K v28, v29, v30, v31, v18, v19, v0.h[6] + + uaddl v18.8h, v24.8b, v25.8b + uaddl2 v19.8h, v24.16b, v25.16b + UMLSL4K v28, v29, v30, v31, v18, v19, v0.h[7] + + SQSHRUNN v16, v28, v29, v30, v31, 13 + +// i2 = (coef_sp[0] * (m1 + p1) - coef_sp[1] * (m3 + p3)) >> 13; // (-m3:v20*) i2=v17 + uaddl v18.8h, v22.8b, v24.8b + uaddl2 v19.8h, v22.16b, v24.16b + UMULL4K v28, v29, v30, v31, v18, v19, v0.h[6] + + uaddl v18.8h, v20.8b, v21.8b + uaddl2 v19.8h, v20.16b, v21.16b + UMLSL4K v28, v29, v30, v31, v18, v19, v0.h[7] + + SQSHRUNN v17, v28, v29, v30, v31, 13 + +// i1 += coef_lf[0] * 4 * (m1 + p1); // p1 = v22, m1 = v24 + uaddl v26.8h, v24.8b, v22.8b + uaddl2 v27.8h, v24.16b, v22.16b + UMLAL4K v2, v3, v4, v5, v26, v27, v0.h[0] + + ldr q31, [x2, w9, sxtw] + ldr q29, [x4, w9, sxtw] + +// j1 += coef_lf[0] * 4 * (p1 + p3); // p1 = v22, p3 = v21 + uaddl v26.8h, v21.8b, v22.8b + uaddl2 v27.8h, v21.16b, v22.16b + UMLAL4K v6, v7, v8, v9, v26, v27, v0.h[0] + + ldr q30, [x2, w11, sxtw] + ldr q28, [x4, w11, sxtw] + +// i1 >>= 15; // i1 = v2, -v3, -v4*, -v5* + SQSHRUNN v2, v2, v3, v4, v5, 15 + +// j1 >>= 15; // j1 = v3, -v6*, -v7*, -v8*, -v9* + SQSHRUNN v3, v6, v7, v8, v9, 15 + +// { +// int t1 =(FFABS(prev[mrefs] - m1) + FFABS(prev[prefs] - p1)) >> 1; +// int t2 =(FFABS(next[mrefs] - m1) + FFABS(next[prefs] - p1)) >> 1; + uabd v30.16b, v22.16b, v30.16b + uabd v31.16b, v24.16b, v31.16b + uabd v28.16b, v22.16b, v28.16b + uabd v29.16b, v24.16b, v29.16b + uhadd v31.16b, v31.16b, v30.16b + uhadd v29.16b, v29.16b, v28.16b + + ldr q27, [x2, w13, sxtw] + ldr q26, [x4, w13, sxtw] + +// diff0 = FFMAX3(temporal_diff0 >> 1, t1, t2); // diff0=v18 + ushr v18.16b, v11.16b, #1 + umax v18.16b, v18.16b, v31.16b + umax v18.16b, v18.16b, v29.16b +// } // v28, v30 preserved for next block +// { // tdiff2 = v14 +// int t1 =(FFABS(prev[prefs] - p1) + FFABS(prev[prefs3] - p3)) >> 1; +// int t2 =(FFABS(next[prefs] - p1) + FFABS(next[prefs3] - p3)) >> 1; + uabd v31.16b, v21.16b, v27.16b + uabd v29.16b, v21.16b, v26.16b + uhadd v31.16b, v31.16b, v30.16b + uhadd v29.16b, v29.16b, v28.16b + +// diff2 = FFMAX3(temporal_diff2 >> 1, t1, t2); // diff2=v19 + ushr v19.16b, v14.16b, #1 + umax v19.16b, v19.16b, v31.16b + umax v19.16b, v19.16b, v29.16b +// } + + // diff0 = v18, (m2 >> 1) = v13, m1 = v24, d0 = v10, p1 = v22, d2 = v15 + SPAT_CHECK v18, v13, v24, v10, v22, v15, v31, v30, v29, v28 + + // diff2 = v19, d0 = v10, p1 = v22, d2 = v15, p3 = v21, (p4 >> 1) = v12 + SPAT_CHECK v19, v10, v22, v15, v21, v12, v31, v30, v29, v28 + + // j1 = v3, j2 = v16, p1 = v22, d2 = v15, p3 = v21, td2 = v14, diff2 = v19 + INTERPOL v3, v3, v16, v22, v15, v21, v14, v19, v31, v30, v29 + +// dst[d_stride * 2] = av_clip_uint8(interpol); + str q3, [x0, w5, sxtw] + +// dst[d_stride] = p1; + str q22, [x0, w1, sxtw] + + // i1 = v2, i2 = v17, m1 = v24, d0 = v10, p1 = v22, td2 = v11, diff2 = v18 + INTERPOL v2, v2, v17, v24, v10, v22, v11, v18, v31, v30, v29 + +// dst[0] = av_clip_uint8(interpol); + str q2, [x0], #16 +// } +// +// dst++; +// cur++; +// prev++; +// prev2++; +// next++; +// } + subs w10, w10, #16 + add x2, x2, #16 + add x3, x3, #16 + add x4, x4, #16 + add x17, x17, #16 + bgt 10b + + POP_VREGS +99: + ret +endfunc + +// =========================================================================== +// +// void filter_line( +// void *dst1, // x0 +// void *prev1, // x1 +// void *cur1, // x2 +// void *next1, // x3 +// int w, // w4 +// int prefs, // w5 +// int mrefs, // w6 +// int prefs2, // w7 +// int mrefs2, // [sp, #0] +// int prefs3, // [sp, #SP_INT] +// int mrefs3, // [sp, #SP_INT*2] +// int prefs4, // [sp, #SP_INT*3] +// int mrefs4, // [sp, #SP_INT*4] +// int parity, // [sp, #SP_INT*5] +// int clip_max) // [sp, #SP_INT*6] + +function ff_bwdif_filter_line_neon, export=1 + // Sanity check w + cmp w4, #0 + ble 99f + + // Rearrange regs to be the same as line3 for ease of debug! + mov w10, w4 // w10 = loop count + mov w9, w6 // w9 = mref + mov w12, w7 // w12 = pref2 + mov w11, w5 // w11 = pref + ldr w8, [sp, #0] // w8 = mref2 + ldr w7, [sp, #SP_INT*2] // w7 = mref3 + ldr w6, [sp, #SP_INT*4] // w6 = mref4 + ldr w13, [sp, #SP_INT] // w13 = pref3 + ldr w14, [sp, #SP_INT*3] // w14 = pref4 + + mov x4, x3 + mov x3, x2 + mov x2, x1 + + LDR_COEFFS v0, x17 + +// #define prev2 cur +// const uint8_t * restrict next2 = parity ? prev : next; + ldr w17, [sp, #SP_INT*5] // parity + cmp w17, #0 + csel x17, x2, x4, ne + + PUSH_VREGS + +// for (x = 0; x < w; x++) { +// int diff0, diff2; +// int d0, d2; +// int temporal_diff0, temporal_diff2; +// +// int i1, i2; +// int j1, j2; +// int p6, p5, p4, p3, p2, p1, c0, m1, m2, m3, m4; + +10: +// c0 = prev2[0] + next2[0]; // c0 = v20, v21 +// d0 = c0 >> 1; // d0 = v10 +// temporal_diff0 = FFABS(prev2[0] - next2[0]); // td0 = v11 + ldr q31, [x3] + ldr q21, [x17] + uhadd v10.16b, v31.16b, v21.16b + uabd v11.16b, v31.16b, v21.16b + uaddl v20.8h, v21.8b, v31.8b + uaddl2 v21.8h, v21.16b, v31.16b + + ldr q31, [x3, w6, sxtw] + ldr q23, [x17, w6, sxtw] + +// i1 = coef_hf[0] * c0; // i1 = v2-v5 + UMULL4K v2, v3, v4, v5, v20, v21, v0.h[2] + + ldr q30, [x3, w14, sxtw] + ldr q25, [x17, w14, sxtw] + +// m4 = prev2[mrefs4] + next2[mrefs4]; // m4 = v22,v23 + uaddl v22.8h, v23.8b, v31.8b + uaddl2 v23.8h, v23.16b, v31.16b + +// p4 = prev2[prefs4] + next2[prefs4]; // p4 = v24,v25, (p4 >> 1) = v12 + uhadd v12.16b, v25.16b, v30.16b + uaddl v24.8h, v25.8b, v30.8b + uaddl2 v25.8h, v25.16b, v30.16b + +// m3 = cur[mrefs3]; // m3 = v20 + ldr q20, [x3, w7, sxtw] + +// p3 = cur[prefs3]; // p3 = v21 + ldr q21, [x3, w13, sxtw] + +// i1 += coef_hf[2] * (m4 + p4); // (-m4:v22,v23) (-p4:v24,v25) + add v22.8h, v22.8h, v24.8h + add v23.8h, v23.8h, v25.8h + UMLAL4K v2, v3, v4, v5, v22, v23, v0.h[4] + + ldr q29, [x3, w8, sxtw] + ldr q23, [x17, w8, sxtw] + +// i1 -= coef_lf[1] * 4 * (m3 + p3); // - + uaddl v30.8h, v20.8b, v21.8b + uaddl2 v31.8h, v20.16b, v21.16b + + UMLSL4K v2, v3, v4, v5, v30, v31, v0.h[1] + + ldr q31, [x3, w12, sxtw] + ldr q27, [x17, w12, sxtw] + +// m2 = prev2[mrefs2] + next2[mrefs2]; // m2 = v22,v23, (m2 >> 1) = v13 + uhadd v13.16b, v23.16b, v29.16b + uaddl v22.8h, v23.8b, v29.8b + uaddl2 v23.8h, v23.16b, v29.16b + +// m1 = cur[mrefs]; // m1 = v24 + ldr q24, [x3, w9, sxtw] + +// p2 = prev2[prefs2] + next2[prefs2]; // p2 = v26, v27 +// temporal_diff2 = FFABS(prev2[prefs2] - next2[prefs2]); // td2 = v14 +// d2 = p2 >> 1; // d2 = v15 + uabd v14.16b, v31.16b, v27.16b + uhadd v15.16b, v31.16b, v27.16b + uaddl v26.8h, v27.8b, v31.8b + uaddl2 v27.8h, v27.16b, v31.16b + +// i1 -= coef_hf[1] * (m2 + p2); // (-m2:v22,v23*) (-p2:v26*,v27*) + add v22.8h, v22.8h, v26.8h + add v23.8h, v23.8h, v27.8h + UMLSL4K v2, v3, v4, v5, v22, v23, v0.h[3] + +// p1 = cur[prefs]; // p1 = v22 + ldr q22, [x3, w11, sxtw] + +// i2 = (coef_sp[0] * (m1 + p1) - coef_sp[1] * (m3 + p3)) >> 13; // (-m3:v20*) i2=v17 + uaddl v18.8h, v22.8b, v24.8b + uaddl2 v19.8h, v22.16b, v24.16b + UMULL4K v28, v29, v30, v31, v18, v19, v0.h[6] + + uaddl v18.8h, v20.8b, v21.8b + uaddl2 v19.8h, v20.16b, v21.16b + UMLSL4K v28, v29, v30, v31, v18, v19, v0.h[7] + + SQSHRUNN v17, v28, v29, v30, v31, 13 + +// i1 += coef_lf[0] * 4 * (m1 + p1); // p1 = v22, m1 = v24 + uaddl v26.8h, v24.8b, v22.8b + uaddl2 v27.8h, v24.16b, v22.16b + UMLAL4K v2, v3, v4, v5, v26, v27, v0.h[0] + + ldr q31, [x2, w9, sxtw] + ldr q29, [x4, w9, sxtw] + + ldr q30, [x2, w11, sxtw] + ldr q28, [x4, w11, sxtw] + +// i1 >>= 15; // i1 = v2, -v3, -v4*, -v5* + SQSHRUNN v2, v2, v3, v4, v5, 15 + +// { +// int t1 =(FFABS(prev[mrefs] - m1) + FFABS(prev[prefs] - p1)) >> 1; +// int t2 =(FFABS(next[mrefs] - m1) + FFABS(next[prefs] - p1)) >> 1; + uabd v30.16b, v22.16b, v30.16b + uabd v31.16b, v24.16b, v31.16b + uabd v28.16b, v22.16b, v28.16b + uabd v29.16b, v24.16b, v29.16b + uhadd v31.16b, v31.16b, v30.16b + uhadd v29.16b, v29.16b, v28.16b + +// diff0 = FFMAX3(temporal_diff0 >> 1, t1, t2); // diff0=v18 + ushr v18.16b, v11.16b, #1 + umax v18.16b, v18.16b, v31.16b + umax v18.16b, v18.16b, v29.16b + + // diff0 = v18, (m2 >> 1) = v13, m1 = v24, d0 = v10, p1 = v22, d2 = v15 + SPAT_CHECK v18, v13, v24, v10, v22, v15, v31, v30, v29, v28 + + // i1 = v2, i2 = v17, m1 = v24, d0 = v10, p1 = v22, td2 = v11, diff2 = v18 + INTERPOL v2, v2, v17, v24, v10, v22, v11, v18, v31, v30, v29 + +// dst[0] = av_clip_uint8(interpol); + str q2, [x0], #16 +// } +// +// dst++; +// cur++; +// prev++; +// prev2++; +// next++; +// } + + subs w10, w10, #16 + add x2, x2, #16 + add x3, x3, #16 + add x4, x4, #16 + add x17, x17, #16 + bgt 10b + + POP_VREGS +99: + ret +endfunc + +// ============================================================================ +// +// void ff_bwdif_filter_edge_neon( +// void *dst1, // x0 +// void *prev1, // x1 +// void *cur1, // x2 +// void *next1, // x3 +// int w, // w4 +// int prefs, // w5 +// int mrefs, // w6 +// int prefs2, // w7 +// int mrefs2, // [sp, #0] +// int parity, // [sp, #SP_INT] +// int clip_max, // [sp, #SP_INT*2] unused +// int spat); // [sp, #SP_INT*3] + +function ff_bwdif_filter_edge_neon, export=1 + // Sanity check w + cmp w4, #0 + ble 99f + +// #define prev2 cur +// const uint8_t * restrict next2 = parity ? prev : next; + + ldr w8, [sp, #0] // mrefs2 + + ldr w17, [sp, #SP_INT] // parity + ldr w16, [sp, #SP_INT*3] // spat + cmp w17, #0 + csel x17, x1, x3, ne + +// for (x = 0; x < w; x++) { + +10: +// int m1 = cur[mrefs]; +// int d = (prev2[0] + next2[0]) >> 1; +// int p1 = cur[prefs]; +// int temporal_diff0 = FFABS(prev2[0] - next2[0]); +// int temporal_diff1 =(FFABS(prev[mrefs] - m1) + FFABS(prev[prefs] - p1)) >> 1; +// int temporal_diff2 =(FFABS(next[mrefs] - m1) + FFABS(next[prefs] - p1)) >> 1; +// int diff = FFMAX3(temporal_diff0 >> 1, temporal_diff1, temporal_diff2); + ldr q31, [x2] + ldr q21, [x17] + uhadd v16.16b, v31.16b, v21.16b // d0 = v16 + uabd v17.16b, v31.16b, v21.16b // td0 = v17 + ldr q24, [x2, w6, sxtw] // m1 = v24 + ldr q22, [x2, w5, sxtw] // p1 = v22 + + ldr q0, [x1, w6, sxtw] // prev[mrefs] + ldr q2, [x1, w5, sxtw] // prev[prefs] + ldr q1, [x3, w6, sxtw] // next[mrefs] + ldr q3, [x3, w5, sxtw] // next[prefs] + + ushr v29.16b, v17.16b, #1 + + uabd v31.16b, v0.16b, v24.16b + uabd v30.16b, v2.16b, v22.16b + uhadd v0.16b, v31.16b, v30.16b // td1 = q0 + + uabd v31.16b, v1.16b, v24.16b + uabd v30.16b, v3.16b, v22.16b + uhadd v1.16b, v31.16b, v30.16b // td2 = q1 + + umax v0.16b, v0.16b, v29.16b + umax v0.16b, v0.16b, v1.16b // diff = v0 + +// if (spat) { +// SPAT_CHECK() +// } +// i0 = (m1 + p1) >> 1; + cbz w16, 1f + + ldr q31, [x2, w8, sxtw] + ldr q18, [x17, w8, sxtw] + ldr q30, [x2, w7, sxtw] + ldr q19, [x17, w7, sxtw] + uhadd v18.16b, v18.16b, v31.16b + uhadd v19.16b, v19.16b, v30.16b + + SPAT_CHECK v0, v18, v24, v16, v22, v19, v31, v30, v29, v28 + +1: + uhadd v2.16b, v22.16b, v24.16b + + // i0 = v2, s0 = v2, d0 = v16, diff = v0, t0 = v31, t1 = v30 + DIFF_CLIP v2, v2, v16, v0, v31, v30 + +// dst[0] = av_clip(interpol, 0, clip_max); + str q2, [x0], #16 + +// dst++; +// cur++; +// } + subs w4, w4, #16 + add x1, x1, #16 + add x2, x2, #16 + add x3, x3, #16 + add x17, x17, #16 + bgt 10b + +99: + ret +endfunc + +// ============================================================================ +// +// void ff_bwdif_filter_intra_neon( +// void *dst1, // x0 +// void *cur1, // x1 +// int w, // w2 +// int prefs, // w3 +// int mrefs, // w4 +// int prefs3, // w5 +// int mrefs3, // w6 +// int parity, // w7 unused +// int clip_max) // [sp, #0] unused + +function ff_bwdif_filter_intra_neon, export=1 + cmp w2, #0 + ble 99f + + LDR_COEFFS v0, x17 + +// for (x = 0; x < w; x++) { +10: + +// interpol = (coef_sp[0] * (cur[mrefs] + cur[prefs]) - coef_sp[1] * (cur[mrefs3] + cur[prefs3])) >> 13; + ldr q31, [x1, w4, sxtw] + ldr q30, [x1, w3, sxtw] + ldr q29, [x1, w6, sxtw] + ldr q28, [x1, w5, sxtw] + + uaddl v20.8h, v31.8b, v30.8b + uaddl2 v21.8h, v31.16b, v30.16b + + UMULL4K v2, v3, v4, v5, v20, v21, v0.h[6] + + uaddl v20.8h, v29.8b, v28.8b + uaddl2 v21.8h, v29.16b, v28.16b + + UMLSL4K v2, v3, v4, v5, v20, v21, v0.h[7] + +// dst[0] = av_clip(interpol, 0, clip_max); + SQSHRUNN v2, v2, v3, v4, v5, 13 + str q2, [x0], #16 + +// dst++; +// cur++; +// } + + subs w2, w2, #16 + add x1, x1, #16 + bgt 10b + +99: + ret +endfunc diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c index 0872c6e0f2..1dd05e4d75 100644 --- a/libavfilter/allfilters.c +++ b/libavfilter/allfilters.c @@ -218,6 +218,7 @@ extern AVFilter ff_vf_dedot; extern AVFilter ff_vf_deflate; extern AVFilter ff_vf_deflicker; extern AVFilter ff_vf_deinterlace_qsv; +extern AVFilter ff_vf_deinterlace_v4l2m2m; extern AVFilter ff_vf_deinterlace_vaapi; extern AVFilter ff_vf_dejudder; extern AVFilter ff_vf_delogo; @@ -377,6 +378,7 @@ extern AVFilter ff_vf_scale; extern AVFilter ff_vf_scale_cuda; extern AVFilter ff_vf_scale_npp; extern AVFilter ff_vf_scale_qsv; +extern AVFilter ff_vf_scale_v4l2m2m; extern AVFilter ff_vf_scale_vaapi; extern AVFilter ff_vf_scale_vulkan; extern AVFilter ff_vf_scale2ref; @@ -438,6 +440,7 @@ extern AVFilter ff_vf_transpose_opencl; extern AVFilter ff_vf_transpose_vaapi; extern AVFilter ff_vf_trim; extern AVFilter ff_vf_unpremultiply; +extern AVFilter ff_vf_unsand; extern AVFilter ff_vf_unsharp; extern AVFilter ff_vf_unsharp_opencl; extern AVFilter ff_vf_untile; diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c index f6b572b3de..44fe8b679c 100644 --- a/libavfilter/avfiltergraph.c +++ b/libavfilter/avfiltergraph.c @@ -32,6 +32,9 @@ #include "libavutil/internal.h" #include "libavutil/opt.h" #include "libavutil/pixdesc.h" +#if CONFIG_UNSAND_FILTER +#include "libavutil/rpi_sand_fns.h" +#endif #define FF_INTERNAL_FIELDS 1 #include "framequeue.h" @@ -422,6 +425,19 @@ static int formats_declared(AVFilterContext *f) return 1; } +#if CONFIG_UNSAND_FILTER +static int has_sand_format(const AVFilterFormats * const ff) +{ + int i; + for (i = 0; i != ff->nb_formats; ++i) { + if (av_rpi_is_sand_format(ff->formats[i])) { + return 1; + } + } + return 0; +} +#endif + /** * Perform one round of query_formats() and merging formats lists on the * filter graph. @@ -462,6 +478,7 @@ static int query_formats(AVFilterGraph *graph, AVClass *log_ctx) for (j = 0; j < filter->nb_inputs; j++) { AVFilterLink *link = filter->inputs[j]; int convert_needed = 0; + unsigned int extra_convert_tried = 0; if (!link) continue; @@ -504,11 +521,14 @@ static int query_formats(AVFilterGraph *graph, AVClass *log_ctx) link->outcfg.formats, link->type) #undef MERGE_DISPATCH - if (convert_needed) { + while (convert_needed) { AVFilterContext *convert; const AVFilter *filter; AVFilterLink *inlink, *outlink; char inst_name[30]; + int can_retry = 0; + + convert_needed = 0; if (graph->disable_auto_convert) { av_log(log_ctx, AV_LOG_ERROR, @@ -521,19 +541,45 @@ static int query_formats(AVFilterGraph *graph, AVClass *log_ctx) /* couldn't merge format lists. auto-insert conversion filter */ switch (link->type) { case AVMEDIA_TYPE_VIDEO: - if (!(filter = avfilter_get_by_name("scale"))) { - av_log(log_ctx, AV_LOG_ERROR, "'scale' filter " - "not present, cannot convert pixel formats.\n"); - return AVERROR(EINVAL); - } - - snprintf(inst_name, sizeof(inst_name), "auto_scaler_%d", - scaler_count++); +#if CONFIG_UNSAND_FILTER + // Only try each extra conversion once + // The unsand output pad should never trigger has_sand_format + // but it is better to be safe + if ((extra_convert_tried & 1) == 0 && has_sand_format(link->incfg.formats)) { + if (!(filter = avfilter_get_by_name("unsand"))) { + av_log(log_ctx, AV_LOG_ERROR, "'unsand' filter " + "not present, cannot convert pixel formats.\n"); + return AVERROR(EINVAL); + } + + snprintf(inst_name, sizeof(inst_name), "auto_unsand_%d", + scaler_count++); + + if ((ret = avfilter_graph_create_filter(&convert, filter, + inst_name, "", NULL, + graph)) < 0) + return ret; - if ((ret = avfilter_graph_create_filter(&convert, filter, - inst_name, graph->scale_sws_opts, NULL, - graph)) < 0) - return ret; + extra_convert_tried |= 1; + can_retry = 1; + } + else +#endif + { + if (!(filter = avfilter_get_by_name("scale"))) { + av_log(log_ctx, AV_LOG_ERROR, "'scale' filter " + "not present, cannot convert pixel formats.\n"); + return AVERROR(EINVAL); + } + + snprintf(inst_name, sizeof(inst_name), "auto_scaler_%d", + scaler_count++); + + if ((ret = avfilter_graph_create_filter(&convert, filter, + inst_name, graph->scale_sws_opts, NULL, + graph)) < 0) + return ret; + } break; case AVMEDIA_TYPE_AUDIO: if (!(filter = avfilter_get_by_name("aresample"))) { @@ -589,6 +635,13 @@ static int query_formats(AVFilterGraph *graph, AVClass *log_ctx) outlink->outcfg.samplerates) || CHECKED_MERGE(channel_layouts, outlink->incfg.channel_layouts, outlink->outcfg.channel_layouts))) { + // Try adding an unsand filter & see if that helps + if (ret < 0 && can_retry) { + link = outlink; + convert_needed = 1; + continue; + } + if (ret < 0) return ret; av_log(log_ctx, AV_LOG_ERROR, diff --git a/libavfilter/buffersink.c b/libavfilter/buffersink.c index 15d897cff6..c134759bbf 100644 --- a/libavfilter/buffersink.c +++ b/libavfilter/buffersink.c @@ -58,6 +58,11 @@ typedef struct BufferSinkContext { int sample_rates_size; AVFrame *peeked_frame; + + union { + av_buffersink_alloc_video_frame * video; + } alloc_cb; + void * alloc_v; } BufferSinkContext; #define NB_ITEMS(list) (list ## _size / sizeof(*list)) @@ -148,6 +153,22 @@ int attribute_align_arg av_buffersink_get_samples(AVFilterContext *ctx, return get_frame_internal(ctx, frame, 0, nb_samples); } +static AVFrame * alloc_video_buffer(AVFilterLink *link, int w, int h) +{ + AVFilterContext * const ctx = link->dst; + BufferSinkContext * const bs = ctx->priv; + return bs->alloc_cb.video ? bs->alloc_cb.video(ctx, bs->alloc_v, w, h) : + ff_default_get_video_buffer(link, w, h); +} + +int av_buffersink_set_alloc_video_frame(AVFilterContext *ctx, av_buffersink_alloc_video_frame * cb, void * v) +{ + BufferSinkContext * const bs = ctx->priv; + bs->alloc_cb.video = cb; + bs->alloc_v = v; + return 0; +} + #if FF_API_BUFFERSINK_ALLOC AVBufferSinkParams *av_buffersink_params_alloc(void) { @@ -331,6 +352,7 @@ static const AVFilterPad avfilter_vsink_buffer_inputs[] = { { .name = "default", .type = AVMEDIA_TYPE_VIDEO, + .get_video_buffer = alloc_video_buffer, }, { NULL } }; diff --git a/libavfilter/buffersink.h b/libavfilter/buffersink.h index 69ed0f29a8..a3aa6fcb3c 100644 --- a/libavfilter/buffersink.h +++ b/libavfilter/buffersink.h @@ -198,6 +198,9 @@ int av_buffersink_get_frame(AVFilterContext *ctx, AVFrame *frame); */ int av_buffersink_get_samples(AVFilterContext *ctx, AVFrame *frame, int nb_samples); +typedef AVFrame * av_buffersink_alloc_video_frame(AVFilterContext * ctx, void * v, int w, int h); +int av_buffersink_set_alloc_video_frame(AVFilterContext *ctx, av_buffersink_alloc_video_frame * cb, void * v); + /** * @} */ diff --git a/libavfilter/buffersrc.c b/libavfilter/buffersrc.c index da1cf9941e..c588ed23cb 100644 --- a/libavfilter/buffersrc.c +++ b/libavfilter/buffersrc.c @@ -188,7 +188,7 @@ int attribute_align_arg av_buffersrc_add_frame_flags(AVFilterContext *ctx, AVFra switch (ctx->outputs[0]->type) { case AVMEDIA_TYPE_VIDEO: - CHECK_VIDEO_PARAM_CHANGE(ctx, s, frame->width, frame->height, + CHECK_VIDEO_PARAM_CHANGE(ctx, s, av_frame_cropped_width(frame), av_frame_cropped_height(frame), frame->format, frame->pts); break; case AVMEDIA_TYPE_AUDIO: diff --git a/libavfilter/bwdif.h b/libavfilter/bwdif.h index 889ff772ed..496cec72ef 100644 --- a/libavfilter/bwdif.h +++ b/libavfilter/bwdif.h @@ -35,8 +35,29 @@ typedef struct BWDIFContext { void (*filter_edge)(void *dst, void *prev, void *cur, void *next, int w, int prefs, int mrefs, int prefs2, int mrefs2, int parity, int clip_max, int spat); + void (*filter_line3)(void *dst, int dstride, + const void *prev, const void *cur, const void *next, int prefs, + int w, int parity, int clip_max); } BWDIFContext; -void ff_bwdif_init_x86(BWDIFContext *bwdif); +void ff_bwdif_init_filter_line(BWDIFContext *bwdif, int bit_depth); +void ff_bwdif_init_x86(BWDIFContext *bwdif, int bit_depth); +void ff_bwdif_init_aarch64(BWDIFContext *bwdif, int bit_depth); + +void ff_bwdif_filter_edge_c(void *dst1, void *prev1, void *cur1, void *next1, + int w, int prefs, int mrefs, int prefs2, int mrefs2, + int parity, int clip_max, int spat); + +void ff_bwdif_filter_intra_c(void *dst1, void *cur1, int w, int prefs, int mrefs, + int prefs3, int mrefs3, int parity, int clip_max); + +void ff_bwdif_filter_line_c(void *dst1, void *prev1, void *cur1, void *next1, + int w, int prefs, int mrefs, int prefs2, int mrefs2, + int prefs3, int mrefs3, int prefs4, int mrefs4, + int parity, int clip_max); + +void ff_bwdif_filter_line3_c(void * dst1, int d_stride, + const void * prev1, const void * cur1, const void * next1, int s_stride, + int w, int parity, int clip_max); #endif /* AVFILTER_BWDIF_H */ diff --git a/libavfilter/vf_bwdif.c b/libavfilter/vf_bwdif.c index b6aed7a450..b268113271 100644 --- a/libavfilter/vf_bwdif.c +++ b/libavfilter/vf_bwdif.c @@ -123,8 +123,8 @@ typedef struct ThreadData { next2++; \ } -static void filter_intra(void *dst1, void *cur1, int w, int prefs, int mrefs, - int prefs3, int mrefs3, int parity, int clip_max) +void ff_bwdif_filter_intra_c(void *dst1, void *cur1, int w, int prefs, int mrefs, + int prefs3, int mrefs3, int parity, int clip_max) { uint8_t *dst = dst1; uint8_t *cur = cur1; @@ -133,10 +133,10 @@ static void filter_intra(void *dst1, void *cur1, int w, int prefs, int mrefs, FILTER_INTRA() } -static void filter_line_c(void *dst1, void *prev1, void *cur1, void *next1, - int w, int prefs, int mrefs, int prefs2, int mrefs2, - int prefs3, int mrefs3, int prefs4, int mrefs4, - int parity, int clip_max) +void ff_bwdif_filter_line_c(void *dst1, void *prev1, void *cur1, void *next1, + int w, int prefs, int mrefs, int prefs2, int mrefs2, + int prefs3, int mrefs3, int prefs4, int mrefs4, + int parity, int clip_max) { uint8_t *dst = dst1; uint8_t *prev = prev1; @@ -151,9 +151,34 @@ static void filter_line_c(void *dst1, void *prev1, void *cur1, void *next1, FILTER2() } -static void filter_edge(void *dst1, void *prev1, void *cur1, void *next1, - int w, int prefs, int mrefs, int prefs2, int mrefs2, - int parity, int clip_max, int spat) +#define NEXT_LINE()\ + dst += d_stride; \ + prev += prefs; \ + cur += prefs; \ + next += prefs; + +void ff_bwdif_filter_line3_c(void * dst1, int d_stride, + const void * prev1, const void * cur1, const void * next1, int s_stride, + int w, int parity, int clip_max) +{ + const int prefs = s_stride; + uint8_t * dst = dst1; + const uint8_t * prev = prev1; + const uint8_t * cur = cur1; + const uint8_t * next = next1; + + ff_bwdif_filter_line_c(dst, (void*)prev, (void*)cur, (void*)next, w, + prefs, -prefs, prefs * 2, - prefs * 2, prefs * 3, -prefs * 3, prefs * 4, -prefs * 4, parity, clip_max); + NEXT_LINE(); + memcpy(dst, cur, w); + NEXT_LINE(); + ff_bwdif_filter_line_c(dst, (void*)prev, (void*)cur, (void*)next, w, + prefs, -prefs, prefs * 2, - prefs * 2, prefs * 3, -prefs * 3, prefs * 4, -prefs * 4, parity, clip_max); +} + +void ff_bwdif_filter_edge_c(void *dst1, void *prev1, void *cur1, void *next1, + int w, int prefs, int mrefs, int prefs2, int mrefs2, + int parity, int clip_max, int spat) { uint8_t *dst = dst1; uint8_t *prev = prev1; @@ -213,6 +238,13 @@ static void filter_edge_16bit(void *dst1, void *prev1, void *cur1, void *next1, FILTER2() } +// Round job start line down to multiple of 4 so that if filter_line3 exists +// and the frame is a multiple of 4 high then filter_line will never be called +static inline int job_start(const int jobnr, const int nb_jobs, const int h) +{ + return jobnr >= nb_jobs ? h : ((h * jobnr) / nb_jobs) & ~3; +} + static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) { BWDIFContext *s = ctx->priv; @@ -222,8 +254,8 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) int clip_max = (1 << (yadif->csp->comp[td->plane].depth)) - 1; int df = (yadif->csp->comp[td->plane].depth + 7) / 8; int refs = linesize / df; - int slice_start = (td->h * jobnr ) / nb_jobs; - int slice_end = (td->h * (jobnr+1)) / nb_jobs; + int slice_start = job_start(jobnr, nb_jobs, td->h); + int slice_end = job_start(jobnr + 1, nb_jobs, td->h); int y; for (y = slice_start; y < slice_end; y++) { @@ -245,6 +277,11 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) refs << 1, -(refs << 1), td->parity ^ td->tff, clip_max, (y < 2) || ((y + 3) > td->h) ? 0 : 1); + } else if (s->filter_line3 && y + 2 < slice_end && y + 6 < td->h) { + s->filter_line3(dst, td->frame->linesize[td->plane], + prev, cur, next, linesize, td->w, + td->parity ^ td->tff, clip_max); + y += 2; } else { s->filter_line(dst, prev, cur, next, td->w, refs, -refs, refs << 1, -(refs << 1), @@ -280,7 +317,8 @@ static void filter(AVFilterContext *ctx, AVFrame *dstpic, td.h = h; td.plane = i; - ctx->internal->execute(ctx, filter_slice, &td, NULL, FFMIN(h, ff_filter_get_nb_threads(ctx))); + ctx->internal->execute(ctx, filter_slice, &td, NULL, + FFMIN((h+3)/4, ff_filter_get_nb_threads(ctx))); } if (yadif->current_field == YADIF_FIELD_END) { yadif->current_field = YADIF_FIELD_NORMAL; @@ -350,20 +388,29 @@ static int config_props(AVFilterLink *link) yadif->csp = av_pix_fmt_desc_get(link->format); yadif->filter = filter; - if (yadif->csp->comp[0].depth > 8) { + ff_bwdif_init_filter_line(s, yadif->csp->comp[0].depth); + + return 0; +} + +av_cold void ff_bwdif_init_filter_line(BWDIFContext *s, int bit_depth) +{ + s->filter_line3 = 0; + if (bit_depth > 8) { s->filter_intra = filter_intra_16bit; s->filter_line = filter_line_c_16bit; s->filter_edge = filter_edge_16bit; } else { - s->filter_intra = filter_intra; - s->filter_line = filter_line_c; - s->filter_edge = filter_edge; + s->filter_intra = ff_bwdif_filter_intra_c; + s->filter_line = ff_bwdif_filter_line_c; + s->filter_edge = ff_bwdif_filter_edge_c; } - if (ARCH_X86) - ff_bwdif_init_x86(s); - - return 0; +#if ARCH_X86 + ff_bwdif_init_x86(s, bit_depth); +#elif ARCH_AARCH64 + ff_bwdif_init_aarch64(s, bit_depth); +#endif } diff --git a/libavfilter/vf_deinterlace_v4l2m2m.c b/libavfilter/vf_deinterlace_v4l2m2m.c new file mode 100644 index 0000000000..d4c11cfc51 --- /dev/null +++ b/libavfilter/vf_deinterlace_v4l2m2m.c @@ -0,0 +1,2115 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * deinterlace video filter - V4L2 M2M + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "config.h" + +#include "libavutil/avassert.h" +#include "libavutil/avstring.h" +#include "libavutil/common.h" +#include "libavutil/hwcontext.h" +#include "libavutil/hwcontext_drm.h" +#include "libavutil/internal.h" +#include "libavutil/mathematics.h" +#include "libavutil/opt.h" +#include "libavutil/pixdesc.h" +#include "libavutil/time.h" + +#define FF_INTERNAL_FIELDS 1 +#include "framequeue.h" +#include "filters.h" +#include "avfilter.h" +#include "formats.h" +#include "internal.h" +#include "scale_eval.h" +#include "video.h" + +#ifndef DRM_FORMAT_P030 +#define DRM_FORMAT_P030 fourcc_code('P', '0', '3', '0') /* 2x2 subsampled Cr:Cb plane 10 bits per channel packed */ +#endif + +// V4L2_PIX_FMT_NV12_10_COL128 and V4L2_PIX_FMT_NV12_COL128 should be defined +// in drm_fourcc.h hopefully will be sometime in the future but until then... +#ifndef V4L2_PIX_FMT_NV12_10_COL128 +#define V4L2_PIX_FMT_NV12_10_COL128 v4l2_fourcc('N', 'C', '3', '0') +#endif + +#ifndef V4L2_PIX_FMT_NV12_COL128 +#define V4L2_PIX_FMT_NV12_COL128 v4l2_fourcc('N', 'C', '1', '2') /* 12 Y/CbCr 4:2:0 128 pixel wide column */ +#endif + +typedef struct V4L2Queue V4L2Queue; +typedef struct DeintV4L2M2MContextShared DeintV4L2M2MContextShared; + +typedef enum filter_type_v4l2_e +{ + FILTER_V4L2_DEINTERLACE = 1, + FILTER_V4L2_SCALE, +} filter_type_v4l2_t; + +typedef struct V4L2Buffer { + int enqueued; + int reenqueue; + struct v4l2_buffer buffer; + AVFrame frame; + struct v4l2_plane planes[VIDEO_MAX_PLANES]; + int num_planes; + AVDRMFrameDescriptor drm_frame; + V4L2Queue *q; +} V4L2Buffer; + +typedef struct V4L2Queue { + struct v4l2_format format; + struct v4l2_selection sel; + int eos; + int num_buffers; + V4L2Buffer *buffers; + const char * name; + DeintV4L2M2MContextShared *ctx; +} V4L2Queue; + +typedef struct pts_stats_s +{ + void * logctx; + const char * name; // For debug + unsigned int last_count; + unsigned int last_interval; + int64_t last_pts; +} pts_stats_t; + +#define PTS_TRACK_SIZE 32 +typedef struct pts_track_el_s +{ + uint32_t n; + unsigned int interval; + AVFrame * props; +} pts_track_el_t; + +typedef struct pts_track_s +{ + uint32_t n; + uint32_t last_n; + int got_2; + void * logctx; + pts_stats_t stats; + pts_track_el_t a[PTS_TRACK_SIZE]; +} pts_track_t; + +typedef enum drain_state_e +{ + DRAIN_NONE = 0, // Not draining + DRAIN_TIMEOUT, // Drain until normal timeout setup yields no frame + DRAIN_LAST, // Drain with long timeout last_frame in received on output expected + DRAIN_EOS, // Drain with long timeout EOS expected + DRAIN_DONE // Drained +} drain_state_t; + +typedef struct DeintV4L2M2MContextShared { + void * logctx; // For logging - will be NULL when done + filter_type_v4l2_t filter_type; + + int fd; + int done; // fd closed - awating all refs dropped + int width; + int height; + + int drain; // EOS received (inlink status) + drain_state_t drain_state; + int64_t drain_pts; // PTS associated with inline status + + unsigned int frames_rx; + unsigned int frames_tx; + + // from options + int output_width; + int output_height; + enum AVPixelFormat output_format; + + int has_enc_stop; + // We expect to get exactly the same number of frames out as we put in + // We can drain by matching input to output + int one_to_one; + + int orig_width; + int orig_height; + atomic_uint refcount; + + AVBufferRef *hw_frames_ctx; + + unsigned int field_order; + + pts_track_t track; + + V4L2Queue output; + V4L2Queue capture; +} DeintV4L2M2MContextShared; + +typedef struct DeintV4L2M2MContext { + const AVClass *class; + + DeintV4L2M2MContextShared *shared; + + char * w_expr; + char * h_expr; + char * output_format_string;; + + int force_original_aspect_ratio; + int force_divisible_by; + + char *colour_primaries_string; + char *colour_transfer_string; + char *colour_matrix_string; + int colour_range; + char *chroma_location_string; + + enum AVColorPrimaries colour_primaries; + enum AVColorTransferCharacteristic colour_transfer; + enum AVColorSpace colour_matrix; + enum AVChromaLocation chroma_location; +} DeintV4L2M2MContext; + + +static inline int drain_frame_expected(const drain_state_t d) +{ + return d == DRAIN_EOS || d == DRAIN_LAST; +} + +// These just list the ones we know we can cope with +static uint32_t +fmt_av_to_v4l2(const enum AVPixelFormat avfmt) +{ + switch (avfmt) { + case AV_PIX_FMT_YUV420P: + return V4L2_PIX_FMT_YUV420; + case AV_PIX_FMT_NV12: + return V4L2_PIX_FMT_NV12; +#if CONFIG_SAND + case AV_PIX_FMT_RPI4_8: + case AV_PIX_FMT_SAND128: + return V4L2_PIX_FMT_NV12_COL128; +#endif + default: + break; + } + return 0; +} + +static enum AVPixelFormat +fmt_v4l2_to_av(const uint32_t pixfmt) +{ + switch (pixfmt) { + case V4L2_PIX_FMT_YUV420: + return AV_PIX_FMT_YUV420P; + case V4L2_PIX_FMT_NV12: + return AV_PIX_FMT_NV12; +#if CONFIG_SAND + case V4L2_PIX_FMT_NV12_COL128: + return AV_PIX_FMT_RPI4_8; +#endif + default: + break; + } + return AV_PIX_FMT_NONE; +} + +static unsigned int pts_stats_interval(const pts_stats_t * const stats) +{ + return stats->last_interval; +} + +// Pick 64 for max last count - that is >1sec at 60fps +#define STATS_LAST_COUNT_MAX 64 +#define STATS_INTERVAL_MAX (1 << 30) +static void pts_stats_add(pts_stats_t * const stats, int64_t pts) +{ + if (pts == AV_NOPTS_VALUE || pts == stats->last_pts) { + if (stats->last_count < STATS_LAST_COUNT_MAX) + ++stats->last_count; + return; + } + + if (stats->last_pts != AV_NOPTS_VALUE) { + const int64_t interval = pts - stats->last_pts; + + if (interval < 0 || interval >= STATS_INTERVAL_MAX || + stats->last_count >= STATS_LAST_COUNT_MAX) { + if (stats->last_interval != 0) + av_log(stats->logctx, AV_LOG_DEBUG, "%s: %s: Bad interval: %" PRId64 "/%d\n", + __func__, stats->name, interval, stats->last_count); + stats->last_interval = 0; + } + else { + const int64_t frame_time = interval / (int64_t)stats->last_count; + + if (frame_time != stats->last_interval) + av_log(stats->logctx, AV_LOG_DEBUG, "%s: %s: New interval: %u->%" PRId64 "/%d=%" PRId64 "\n", + __func__, stats->name, stats->last_interval, interval, stats->last_count, frame_time); + stats->last_interval = frame_time; + } + } + + stats->last_pts = pts; + stats->last_count = 1; +} + +static void pts_stats_init(pts_stats_t * const stats, void * logctx, const char * name) +{ + *stats = (pts_stats_t){ + .logctx = logctx, + .name = name, + .last_count = 1, + .last_interval = 0, + .last_pts = AV_NOPTS_VALUE + }; +} + +static inline uint32_t pts_track_next_n(pts_track_t * const trk) +{ + if (++trk->n == 0) + trk->n = 1; + return trk->n; +} + +static int pts_track_get_frame(pts_track_t * const trk, const struct timeval tv, AVFrame * const dst) +{ + uint32_t n = (uint32_t)(tv.tv_usec / 2 + tv.tv_sec * 500000); + pts_track_el_t * t; + + // As a first guess assume that n==0 means last frame + if (n == 0) { + n = trk->last_n; + if (n == 0) + goto fail; + } + + t = trk->a + (n & (PTS_TRACK_SIZE - 1)); + + if (t->n != n) { + av_log(trk->logctx, AV_LOG_ERROR, "%s: track failure: got %u, expected %u\n", __func__, n, trk->n); + goto fail; + } + + // 1st frame is simple - just believe it + if (n != trk->last_n) { + trk->last_n = n; + trk->got_2 = 0; + return av_frame_copy_props(dst, t->props); + } + + // Only believe in a single interpolated frame + if (trk->got_2) + goto fail; + trk->got_2 = 1; + + av_frame_copy_props(dst, t->props); + + + // If we can't guess - don't + if (t->interval == 0) { + dst->best_effort_timestamp = AV_NOPTS_VALUE; + dst->pts = AV_NOPTS_VALUE; + dst->pkt_dts = AV_NOPTS_VALUE; + } + else { + if (dst->best_effort_timestamp != AV_NOPTS_VALUE) + dst->best_effort_timestamp += t->interval / 2; + if (dst->pts != AV_NOPTS_VALUE) + dst->pts += t->interval / 2; + if (dst->pkt_dts != AV_NOPTS_VALUE) + dst->pkt_dts += t->interval / 2; + } + + return 0; + +fail: + trk->last_n = 0; + trk->got_2 = 0; + dst->pts = AV_NOPTS_VALUE; + dst->pkt_dts = AV_NOPTS_VALUE; + return 0; +} + +// We are only ever expecting in-order frames so nothing more clever is required +static unsigned int +pts_track_count(const pts_track_t * const trk) +{ + return (trk->n - trk->last_n) & (PTS_TRACK_SIZE - 1); +} + +static struct timeval pts_track_add_frame(pts_track_t * const trk, const AVFrame * const src) +{ + const uint32_t n = pts_track_next_n(trk); + pts_track_el_t * const t = trk->a + (n & (PTS_TRACK_SIZE - 1)); + + pts_stats_add(&trk->stats, src->pts); + + t->n = n; + t->interval = pts_stats_interval(&trk->stats); // guess that next interval is the same as the last + av_frame_unref(t->props); + av_frame_copy_props(t->props, src); + + // We now know what the previous interval was, rather than having to guess, + // so set it. There is a better than decent chance that this is before + // we use it. + if (t->interval != 0) { + pts_track_el_t * const prev_t = trk->a + ((n - 1) & (PTS_TRACK_SIZE - 1)); + prev_t->interval = t->interval; + } + + // In case deinterlace interpolates frames use every other usec + return (struct timeval){.tv_sec = n / 500000, .tv_usec = (n % 500000) * 2}; +} + +static void pts_track_uninit(pts_track_t * const trk) +{ + unsigned int i; + for (i = 0; i != PTS_TRACK_SIZE; ++i) { + trk->a[i].n = 0; + av_frame_free(&trk->a[i].props); + } +} + +static int pts_track_init(pts_track_t * const trk, void *logctx) +{ + unsigned int i; + trk->n = 1; + pts_stats_init(&trk->stats, logctx, "track"); + for (i = 0; i != PTS_TRACK_SIZE; ++i) { + trk->a[i].n = 0; + if ((trk->a[i].props = av_frame_alloc()) == NULL) { + pts_track_uninit(trk); + return AVERROR(ENOMEM); + } + } + return 0; +} + +static inline uint32_t +fmt_bpl(const struct v4l2_format * const fmt, const unsigned int plane_n) +{ + return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.plane_fmt[plane_n].bytesperline : fmt->fmt.pix.bytesperline; +} + +static inline uint32_t +fmt_height(const struct v4l2_format * const fmt) +{ + return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.height : fmt->fmt.pix.height; +} + +static inline uint32_t +fmt_width(const struct v4l2_format * const fmt) +{ + return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.width : fmt->fmt.pix.width; +} + +static inline uint32_t +fmt_pixelformat(const struct v4l2_format * const fmt) +{ + return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.pixelformat : fmt->fmt.pix.pixelformat; +} + +static inline uint32_t +buf_bytesused0(const struct v4l2_buffer * const buf) +{ + return V4L2_TYPE_IS_MULTIPLANAR(buf->type) ? buf->m.planes[0].bytesused : buf->bytesused; +} + +static void +init_format(V4L2Queue * const q, const uint32_t format_type) +{ + memset(&q->format, 0, sizeof(q->format)); + memset(&q->sel, 0, sizeof(q->sel)); + q->format.type = format_type; + q->sel.type = format_type; +} + +static int deint_v4l2m2m_prepare_context(DeintV4L2M2MContextShared *ctx) +{ + struct v4l2_capability cap; + int ret; + + memset(&cap, 0, sizeof(cap)); + ret = ioctl(ctx->fd, VIDIOC_QUERYCAP, &cap); + if (ret < 0) + return ret; + + if (ctx->filter_type == FILTER_V4L2_SCALE && + strcmp("bcm2835-codec-isp", cap.card) != 0) + { + av_log(ctx->logctx, AV_LOG_DEBUG, "Not ISP\n"); + return AVERROR(EINVAL); + } + + if (!(cap.capabilities & V4L2_CAP_STREAMING)) { + av_log(ctx->logctx, AV_LOG_DEBUG, "No streaming\n"); + return AVERROR(EINVAL); + } + + if (cap.capabilities & V4L2_CAP_VIDEO_M2M_MPLANE) { + init_format(&ctx->capture, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); + init_format(&ctx->output, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); + } + else if (cap.capabilities & V4L2_CAP_VIDEO_M2M) { + init_format(&ctx->capture, V4L2_BUF_TYPE_VIDEO_CAPTURE); + init_format(&ctx->output, V4L2_BUF_TYPE_VIDEO_OUTPUT); + } + else { + av_log(ctx->logctx, AV_LOG_DEBUG, "Not M2M\n"); + return AVERROR(EINVAL); + } + + return 0; +} + +// Just use for probe - doesn't modify q format +static int deint_v4l2m2m_try_format(V4L2Queue *queue, const uint32_t width, const uint32_t height, const enum AVPixelFormat avfmt) +{ + struct v4l2_format fmt = {.type = queue->format.type}; + DeintV4L2M2MContextShared *ctx = queue->ctx; + int ret, field; + // Pick YUV to test with if not otherwise specified + uint32_t pixelformat = avfmt == AV_PIX_FMT_NONE ? V4L2_PIX_FMT_YUV420 : fmt_av_to_v4l2(avfmt); + enum AVPixelFormat r_avfmt; + + + ret = ioctl(ctx->fd, VIDIOC_G_FMT, &fmt); + if (ret) + av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_G_FMT failed: %d\n", ret); + + if (ctx->filter_type == FILTER_V4L2_DEINTERLACE && V4L2_TYPE_IS_OUTPUT(fmt.type)) + field = V4L2_FIELD_INTERLACED_TB; + else + field = V4L2_FIELD_NONE; + + if (V4L2_TYPE_IS_MULTIPLANAR(fmt.type)) { + fmt.fmt.pix_mp.pixelformat = pixelformat; + fmt.fmt.pix_mp.field = field; + fmt.fmt.pix_mp.width = width; + fmt.fmt.pix_mp.height = height; + } else { + fmt.fmt.pix.pixelformat = pixelformat; + fmt.fmt.pix.field = field; + fmt.fmt.pix.width = width; + fmt.fmt.pix.height = height; + } + + av_log(ctx->logctx, AV_LOG_TRACE, "%s: Trying format for type %d, wxh: %dx%d, fmt: %08x, size %u bpl %u pre\n", __func__, + fmt.type, fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, + fmt.fmt.pix_mp.pixelformat, + fmt.fmt.pix_mp.plane_fmt[0].sizeimage, fmt.fmt.pix_mp.plane_fmt[0].bytesperline); + + ret = ioctl(ctx->fd, VIDIOC_TRY_FMT, &fmt); + if (ret) + return AVERROR(EINVAL); + + av_log(ctx->logctx, AV_LOG_TRACE, "%s: Trying format for type %d, wxh: %dx%d, fmt: %08x, size %u bpl %u post\n", __func__, + fmt.type, fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, + fmt.fmt.pix_mp.pixelformat, + fmt.fmt.pix_mp.plane_fmt[0].sizeimage, fmt.fmt.pix_mp.plane_fmt[0].bytesperline); + + r_avfmt = fmt_v4l2_to_av(fmt_pixelformat(&fmt)); + if (r_avfmt != avfmt && avfmt != AV_PIX_FMT_NONE) { + av_log(ctx->logctx, AV_LOG_DEBUG, "Unable to set format %s on %s port\n", av_get_pix_fmt_name(avfmt), V4L2_TYPE_IS_CAPTURE(fmt.type) ? "dest" : "src"); + return AVERROR(EINVAL); + } + if (r_avfmt == AV_PIX_FMT_NONE) { + av_log(ctx->logctx, AV_LOG_DEBUG, "No supported format on %s port\n", V4L2_TYPE_IS_CAPTURE(fmt.type) ? "dest" : "src"); + return AVERROR(EINVAL); + } + + if (V4L2_TYPE_IS_MULTIPLANAR(fmt.type)) { + if (fmt.fmt.pix_mp.field != field) { + av_log(ctx->logctx, AV_LOG_DEBUG, "format not supported for type %d\n", fmt.type); + + return AVERROR(EINVAL); + } + } else { + if (fmt.fmt.pix.field != field) { + av_log(ctx->logctx, AV_LOG_DEBUG, "format not supported for type %d\n", fmt.type); + + return AVERROR(EINVAL); + } + } + + return 0; +} + +static int +do_s_fmt(V4L2Queue * const q) +{ + DeintV4L2M2MContextShared * const ctx = q->ctx; + const uint32_t pixelformat = fmt_pixelformat(&q->format); + int ret; + + ret = ioctl(ctx->fd, VIDIOC_S_FMT, &q->format); + if (ret) { + ret = AVERROR(errno); + av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_S_FMT failed: %s\n", av_err2str(ret)); + return ret; + } + + if (pixelformat != fmt_pixelformat(&q->format)) { + av_log(ctx->logctx, AV_LOG_ERROR, "Format not supported: %s; S_FMT returned %s\n", av_fourcc2str(pixelformat), av_fourcc2str(fmt_pixelformat(&q->format))); + return AVERROR(EINVAL); + } + + q->sel.target = V4L2_TYPE_IS_OUTPUT(q->sel.type) ? V4L2_SEL_TGT_CROP : V4L2_SEL_TGT_COMPOSE, + q->sel.flags = V4L2_TYPE_IS_OUTPUT(q->sel.type) ? V4L2_SEL_FLAG_LE : V4L2_SEL_FLAG_GE; + + ret = ioctl(ctx->fd, VIDIOC_S_SELECTION, &q->sel); + if (ret) { + ret = AVERROR(errno); + av_log(ctx->logctx, AV_LOG_WARNING, "VIDIOC_S_SELECTION failed: %s\n", av_err2str(ret)); + } + + return 0; +} + +static void +set_fmt_color(struct v4l2_format *const fmt, + const enum AVColorPrimaries avcp, + const enum AVColorSpace avcs, + const enum AVColorTransferCharacteristic avxc) +{ + enum v4l2_ycbcr_encoding ycbcr = V4L2_YCBCR_ENC_DEFAULT; + enum v4l2_colorspace cs = V4L2_COLORSPACE_DEFAULT; + enum v4l2_xfer_func xfer = V4L2_XFER_FUNC_DEFAULT; + + switch (avcp) { + case AVCOL_PRI_BT709: + cs = V4L2_COLORSPACE_REC709; + ycbcr = V4L2_YCBCR_ENC_709; + break; + case AVCOL_PRI_BT470M: + cs = V4L2_COLORSPACE_470_SYSTEM_M; + ycbcr = V4L2_YCBCR_ENC_601; + break; + case AVCOL_PRI_BT470BG: + cs = V4L2_COLORSPACE_470_SYSTEM_BG; + break; + case AVCOL_PRI_SMPTE170M: + cs = V4L2_COLORSPACE_SMPTE170M; + break; + case AVCOL_PRI_SMPTE240M: + cs = V4L2_COLORSPACE_SMPTE240M; + break; + case AVCOL_PRI_BT2020: + cs = V4L2_COLORSPACE_BT2020; + break; + case AVCOL_PRI_SMPTE428: + case AVCOL_PRI_SMPTE431: + case AVCOL_PRI_SMPTE432: + case AVCOL_PRI_EBU3213: + case AVCOL_PRI_RESERVED: + case AVCOL_PRI_FILM: + case AVCOL_PRI_UNSPECIFIED: + default: + break; + } + + switch (avcs) { + case AVCOL_SPC_RGB: + cs = V4L2_COLORSPACE_SRGB; + break; + case AVCOL_SPC_BT709: + cs = V4L2_COLORSPACE_REC709; + break; + case AVCOL_SPC_FCC: + cs = V4L2_COLORSPACE_470_SYSTEM_M; + break; + case AVCOL_SPC_BT470BG: + cs = V4L2_COLORSPACE_470_SYSTEM_BG; + break; + case AVCOL_SPC_SMPTE170M: + cs = V4L2_COLORSPACE_SMPTE170M; + break; + case AVCOL_SPC_SMPTE240M: + cs = V4L2_COLORSPACE_SMPTE240M; + break; + case AVCOL_SPC_BT2020_CL: + cs = V4L2_COLORSPACE_BT2020; + ycbcr = V4L2_YCBCR_ENC_BT2020_CONST_LUM; + break; + case AVCOL_SPC_BT2020_NCL: + cs = V4L2_COLORSPACE_BT2020; + break; + default: + break; + } + + switch (xfer) { + case AVCOL_TRC_BT709: + xfer = V4L2_XFER_FUNC_709; + break; + case AVCOL_TRC_IEC61966_2_1: + xfer = V4L2_XFER_FUNC_SRGB; + break; + case AVCOL_TRC_SMPTE240M: + xfer = V4L2_XFER_FUNC_SMPTE240M; + break; + case AVCOL_TRC_SMPTE2084: + xfer = V4L2_XFER_FUNC_SMPTE2084; + break; + default: + break; + } + + if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { + fmt->fmt.pix_mp.colorspace = cs; + fmt->fmt.pix_mp.ycbcr_enc = ycbcr; + fmt->fmt.pix_mp.xfer_func = xfer; + } else { + fmt->fmt.pix.colorspace = cs; + fmt->fmt.pix.ycbcr_enc = ycbcr; + fmt->fmt.pix.xfer_func = xfer; + } +} + +static void +set_fmt_color_range(struct v4l2_format *const fmt, const enum AVColorRange avcr) +{ + const enum v4l2_quantization q = + avcr == AVCOL_RANGE_MPEG ? V4L2_QUANTIZATION_LIM_RANGE : + avcr == AVCOL_RANGE_JPEG ? V4L2_QUANTIZATION_FULL_RANGE : + V4L2_QUANTIZATION_DEFAULT; + + if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { + fmt->fmt.pix_mp.quantization = q; + } else { + fmt->fmt.pix.quantization = q; + } +} + +static enum AVColorPrimaries get_color_primaries(const struct v4l2_format *const fmt) +{ + enum v4l2_ycbcr_encoding ycbcr; + enum v4l2_colorspace cs; + + cs = V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? + fmt->fmt.pix_mp.colorspace : + fmt->fmt.pix.colorspace; + + ycbcr = V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? + fmt->fmt.pix_mp.ycbcr_enc: + fmt->fmt.pix.ycbcr_enc; + + switch(ycbcr) { + case V4L2_YCBCR_ENC_XV709: + case V4L2_YCBCR_ENC_709: return AVCOL_PRI_BT709; + case V4L2_YCBCR_ENC_XV601: + case V4L2_YCBCR_ENC_601:return AVCOL_PRI_BT470M; + default: + break; + } + + switch(cs) { + case V4L2_COLORSPACE_470_SYSTEM_BG: return AVCOL_PRI_BT470BG; + case V4L2_COLORSPACE_SMPTE170M: return AVCOL_PRI_SMPTE170M; + case V4L2_COLORSPACE_SMPTE240M: return AVCOL_PRI_SMPTE240M; + case V4L2_COLORSPACE_BT2020: return AVCOL_PRI_BT2020; + default: + break; + } + + return AVCOL_PRI_UNSPECIFIED; +} + +static enum AVColorSpace get_color_space(const struct v4l2_format *const fmt) +{ + enum v4l2_ycbcr_encoding ycbcr; + enum v4l2_colorspace cs; + + cs = V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? + fmt->fmt.pix_mp.colorspace : + fmt->fmt.pix.colorspace; + + ycbcr = V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? + fmt->fmt.pix_mp.ycbcr_enc: + fmt->fmt.pix.ycbcr_enc; + + switch(cs) { + case V4L2_COLORSPACE_SRGB: return AVCOL_SPC_RGB; + case V4L2_COLORSPACE_REC709: return AVCOL_SPC_BT709; + case V4L2_COLORSPACE_470_SYSTEM_M: return AVCOL_SPC_FCC; + case V4L2_COLORSPACE_470_SYSTEM_BG: return AVCOL_SPC_BT470BG; + case V4L2_COLORSPACE_SMPTE170M: return AVCOL_SPC_SMPTE170M; + case V4L2_COLORSPACE_SMPTE240M: return AVCOL_SPC_SMPTE240M; + case V4L2_COLORSPACE_BT2020: + if (ycbcr == V4L2_YCBCR_ENC_BT2020_CONST_LUM) + return AVCOL_SPC_BT2020_CL; + else + return AVCOL_SPC_BT2020_NCL; + default: + break; + } + + return AVCOL_SPC_UNSPECIFIED; +} + +static enum AVColorTransferCharacteristic get_color_trc(const struct v4l2_format *const fmt) +{ + enum v4l2_ycbcr_encoding ycbcr; + enum v4l2_xfer_func xfer; + enum v4l2_colorspace cs; + + cs = V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? + fmt->fmt.pix_mp.colorspace : + fmt->fmt.pix.colorspace; + + ycbcr = V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? + fmt->fmt.pix_mp.ycbcr_enc: + fmt->fmt.pix.ycbcr_enc; + + xfer = V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? + fmt->fmt.pix_mp.xfer_func: + fmt->fmt.pix.xfer_func; + + switch (xfer) { + case V4L2_XFER_FUNC_709: return AVCOL_TRC_BT709; + case V4L2_XFER_FUNC_SRGB: return AVCOL_TRC_IEC61966_2_1; + default: + break; + } + + switch (cs) { + case V4L2_COLORSPACE_470_SYSTEM_M: return AVCOL_TRC_GAMMA22; + case V4L2_COLORSPACE_470_SYSTEM_BG: return AVCOL_TRC_GAMMA28; + case V4L2_COLORSPACE_SMPTE170M: return AVCOL_TRC_SMPTE170M; + case V4L2_COLORSPACE_SMPTE240M: return AVCOL_TRC_SMPTE240M; + default: + break; + } + + switch (ycbcr) { + case V4L2_YCBCR_ENC_XV709: + case V4L2_YCBCR_ENC_XV601: return AVCOL_TRC_BT1361_ECG; + default: + break; + } + + return AVCOL_TRC_UNSPECIFIED; +} + +static enum AVColorRange get_color_range(const struct v4l2_format *const fmt) +{ + enum v4l2_quantization qt; + + qt = V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? + fmt->fmt.pix_mp.quantization : + fmt->fmt.pix.quantization; + + switch (qt) { + case V4L2_QUANTIZATION_LIM_RANGE: return AVCOL_RANGE_MPEG; + case V4L2_QUANTIZATION_FULL_RANGE: return AVCOL_RANGE_JPEG; + default: + break; + } + + return AVCOL_RANGE_UNSPECIFIED; +} + +static int set_src_fmt(V4L2Queue * const q, const AVFrame * const frame) +{ + struct v4l2_format *const format = &q->format; + const AVDRMFrameDescriptor *const src = (const AVDRMFrameDescriptor *)frame->data[0]; + + const uint32_t drm_fmt = src->layers[0].format; + // Treat INVALID as LINEAR + const uint64_t mod = src->objects[0].format_modifier == DRM_FORMAT_MOD_INVALID ? + DRM_FORMAT_MOD_LINEAR : src->objects[0].format_modifier; + uint32_t pix_fmt = 0; + uint32_t w = 0; + uint32_t h = 0; + uint32_t bpl = src->layers[0].planes[0].pitch; + + // We really don't expect multiple layers + // All formats that we currently cope with are single object + + if (src->nb_layers != 1 || src->nb_objects != 1) + return AVERROR(EINVAL); + + switch (drm_fmt) { + case DRM_FORMAT_YUV420: + if (mod == DRM_FORMAT_MOD_LINEAR) { + if (src->layers[0].nb_planes != 3) + break; + pix_fmt = V4L2_PIX_FMT_YUV420; + h = src->layers[0].planes[1].offset / bpl; + w = bpl; + } + break; + + case DRM_FORMAT_NV12: + if (mod == DRM_FORMAT_MOD_LINEAR) { + if (src->layers[0].nb_planes != 2) + break; + pix_fmt = V4L2_PIX_FMT_NV12; + h = src->layers[0].planes[1].offset / bpl; + w = bpl; + } +#if CONFIG_SAND + else if (fourcc_mod_broadcom_mod(mod) == DRM_FORMAT_MOD_BROADCOM_SAND128) { + if (src->layers[0].nb_planes != 2) + break; + pix_fmt = V4L2_PIX_FMT_NV12_COL128; + w = bpl; + h = src->layers[0].planes[1].offset / 128; + bpl = fourcc_mod_broadcom_param(mod); + } +#endif + break; + + case DRM_FORMAT_P030: +#if CONFIG_SAND + if (fourcc_mod_broadcom_mod(mod) == DRM_FORMAT_MOD_BROADCOM_SAND128) { + if (src->layers[0].nb_planes != 2) + break; + pix_fmt = V4L2_PIX_FMT_NV12_10_COL128; + w = bpl / 2; // Matching lie to how we construct this + h = src->layers[0].planes[1].offset / 128; + bpl = fourcc_mod_broadcom_param(mod); + } +#endif + break; + + default: + break; + } + + if (!pix_fmt) + return AVERROR(EINVAL); + + if (V4L2_TYPE_IS_MULTIPLANAR(format->type)) { + struct v4l2_pix_format_mplane *const pix = &format->fmt.pix_mp; + + pix->width = w; + pix->height = h; + pix->pixelformat = pix_fmt; + pix->plane_fmt[0].bytesperline = bpl; + pix->num_planes = 1; + } + else { + struct v4l2_pix_format *const pix = &format->fmt.pix; + + pix->width = w; + pix->height = h; + pix->pixelformat = pix_fmt; + pix->bytesperline = bpl; + } + + set_fmt_color(format, frame->color_primaries, frame->colorspace, frame->color_trc); + set_fmt_color_range(format, frame->color_range); + + q->sel.r.width = frame->width - (frame->crop_left + frame->crop_right); + q->sel.r.height = frame->height - (frame->crop_top + frame->crop_bottom); + q->sel.r.left = frame->crop_left; + q->sel.r.top = frame->crop_top; + + return 0; +} + + +static int set_dst_format(DeintV4L2M2MContext * const priv, V4L2Queue *queue, uint32_t pixelformat, uint32_t field, int width, int height) +{ + struct v4l2_format * const fmt = &queue->format; + struct v4l2_selection *const sel = &queue->sel; + + memset(&fmt->fmt, 0, sizeof(fmt->fmt)); + + // Align w/h to 16 here in case there are alignment requirements at the next + // stage of the filter chain (also RPi deinterlace setup is bust and this + // fixes it) + if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { + fmt->fmt.pix_mp.pixelformat = pixelformat; + fmt->fmt.pix_mp.field = field; + fmt->fmt.pix_mp.width = FFALIGN(width, 16); + fmt->fmt.pix_mp.height = FFALIGN(height, 16); + } else { + fmt->fmt.pix.pixelformat = pixelformat; + fmt->fmt.pix.field = field; + fmt->fmt.pix.width = FFALIGN(width, 16); + fmt->fmt.pix.height = FFALIGN(height, 16); + } + + set_fmt_color(fmt, priv->colour_primaries, priv->colour_matrix, priv->colour_transfer); + set_fmt_color_range(fmt, priv->colour_range); + + sel->r.width = width; + sel->r.height = height; + sel->r.left = 0; + sel->r.top = 0; + + return do_s_fmt(queue); +} + +static int deint_v4l2m2m_probe_device(DeintV4L2M2MContextShared *ctx, char *node) +{ + int ret; + + ctx->fd = open(node, O_RDWR | O_NONBLOCK, 0); + if (ctx->fd < 0) + return AVERROR(errno); + + ret = deint_v4l2m2m_prepare_context(ctx); + if (ret) { + av_log(ctx->logctx, AV_LOG_DEBUG, "Failed to prepare context\n"); + goto fail; + } + + ret = deint_v4l2m2m_try_format(&ctx->capture, ctx->output_width, ctx->output_height, ctx->output_format); + if (ret) { + av_log(ctx->logctx, AV_LOG_DEBUG, "Failed to try dst format\n"); + goto fail; + } + + ret = deint_v4l2m2m_try_format(&ctx->output, ctx->width, ctx->height, AV_PIX_FMT_NONE); + if (ret) { + av_log(ctx->logctx, AV_LOG_DEBUG, "Failed to try src format\n"); + goto fail; + } + + return 0; + +fail: + close(ctx->fd); + ctx->fd = -1; + + return ret; +} + +static int deint_v4l2m2m_find_device(DeintV4L2M2MContextShared *ctx) +{ + int ret = AVERROR(EINVAL); + struct dirent *entry; + char node[PATH_MAX]; + DIR *dirp; + + dirp = opendir("/dev"); + if (!dirp) + return AVERROR(errno); + + for (entry = readdir(dirp); entry; entry = readdir(dirp)) { + + if (strncmp(entry->d_name, "video", 5)) + continue; + + snprintf(node, sizeof(node), "/dev/%s", entry->d_name); + av_log(ctx->logctx, AV_LOG_DEBUG, "probing device %s\n", node); + ret = deint_v4l2m2m_probe_device(ctx, node); + if (!ret) + break; + } + + closedir(dirp); + + if (ret) { + av_log(ctx->logctx, AV_LOG_ERROR, "Could not find a valid device\n"); + ctx->fd = -1; + + return ret; + } + + av_log(ctx->logctx, AV_LOG_INFO, "Using device %s\n", node); + + return 0; +} + +static int deint_v4l2m2m_enqueue_buffer(V4L2Buffer *buf) +{ + int ret; + + ret = ioctl(buf->q->ctx->fd, VIDIOC_QBUF, &buf->buffer); + if (ret < 0) + return AVERROR(errno); + + buf->enqueued = 1; + + return 0; +} + +static void +drm_frame_init(AVDRMFrameDescriptor * const d) +{ + unsigned int i; + for (i = 0; i != AV_DRM_MAX_PLANES; ++i) { + d->objects[i].fd = -1; + } +} + +static void +drm_frame_uninit(AVDRMFrameDescriptor * const d) +{ + unsigned int i; + for (i = 0; i != d->nb_objects; ++i) { + if (d->objects[i].fd != -1) { + close(d->objects[i].fd); + d->objects[i].fd = -1; + } + } +} + +static void +avbufs_delete(V4L2Buffer** ppavbufs, const unsigned int n) +{ + unsigned int i; + V4L2Buffer* const avbufs = *ppavbufs; + + if (avbufs == NULL) + return; + *ppavbufs = NULL; + + for (i = 0; i != n; ++i) { + V4L2Buffer* const avbuf = avbufs + i; + drm_frame_uninit(&avbuf->drm_frame); + } + + av_free(avbufs); +} + +static int v4l2_buffer_export_drm(V4L2Queue * const q, V4L2Buffer * const avbuf) +{ + struct v4l2_exportbuffer expbuf; + int i, ret; + uint64_t mod = DRM_FORMAT_MOD_LINEAR; + + AVDRMFrameDescriptor * const drm_desc = &avbuf->drm_frame; + AVDRMLayerDescriptor * const layer = &drm_desc->layers[0]; + const struct v4l2_format *const fmt = &q->format; + const uint32_t height = fmt_height(fmt); + ptrdiff_t bpl0; + + /* fill the DRM frame descriptor */ + drm_desc->nb_layers = 1; + layer->nb_planes = avbuf->num_planes; + + for (int i = 0; i < avbuf->num_planes; i++) { + layer->planes[i].object_index = i; + layer->planes[i].offset = 0; + layer->planes[i].pitch = fmt_bpl(fmt, i); + } + bpl0 = layer->planes[0].pitch; + + switch (fmt_pixelformat(fmt)) { +#if CONFIG_SAND + case V4L2_PIX_FMT_NV12_COL128: + mod = DRM_FORMAT_MOD_BROADCOM_SAND128_COL_HEIGHT(bpl0); + layer->format = V4L2_PIX_FMT_NV12; + + if (avbuf->num_planes > 1) + break; + + layer->nb_planes = 2; + layer->planes[1].object_index = 0; + layer->planes[1].offset = height * 128; + layer->planes[0].pitch = fmt_width(fmt); + layer->planes[1].pitch = layer->planes[0].pitch; + break; +#endif + + case DRM_FORMAT_NV12: + layer->format = V4L2_PIX_FMT_NV12; + + if (avbuf->num_planes > 1) + break; + + layer->nb_planes = 2; + layer->planes[1].object_index = 0; + layer->planes[1].offset = bpl0 * height; + layer->planes[1].pitch = bpl0; + break; + + case V4L2_PIX_FMT_YUV420: + layer->format = DRM_FORMAT_YUV420; + + if (avbuf->num_planes > 1) + break; + + layer->nb_planes = 3; + layer->planes[1].object_index = 0; + layer->planes[1].offset = bpl0 * height; + layer->planes[1].pitch = bpl0 / 2; + layer->planes[2].object_index = 0; + layer->planes[2].offset = layer->planes[1].offset + ((bpl0 * height) / 4); + layer->planes[2].pitch = bpl0 / 2; + break; + + default: + drm_desc->nb_layers = 0; + return AVERROR(EINVAL); + } + + drm_desc->nb_objects = 0; + for (i = 0; i < avbuf->num_planes; i++) { + memset(&expbuf, 0, sizeof(expbuf)); + + expbuf.index = avbuf->buffer.index; + expbuf.type = avbuf->buffer.type; + expbuf.plane = i; + + ret = ioctl(avbuf->q->ctx->fd, VIDIOC_EXPBUF, &expbuf); + if (ret < 0) + return AVERROR(errno); + + drm_desc->objects[i].size = V4L2_TYPE_IS_MULTIPLANAR(avbuf->buffer.type) ? + avbuf->buffer.m.planes[i].length : avbuf->buffer.length; + drm_desc->objects[i].fd = expbuf.fd; + drm_desc->objects[i].format_modifier = mod; + drm_desc->nb_objects = i + 1; + } + + return 0; +} + +static int deint_v4l2m2m_allocate_buffers(V4L2Queue *queue) +{ + struct v4l2_format *fmt = &queue->format; + DeintV4L2M2MContextShared *ctx = queue->ctx; + struct v4l2_requestbuffers req; + int ret, i, multiplanar; + uint32_t memory; + + memory = V4L2_TYPE_IS_OUTPUT(fmt->type) ? + V4L2_MEMORY_DMABUF : V4L2_MEMORY_MMAP; + + multiplanar = V4L2_TYPE_IS_MULTIPLANAR(fmt->type); + + memset(&req, 0, sizeof(req)); + req.count = queue->num_buffers; + req.memory = memory; + req.type = fmt->type; + + ret = ioctl(ctx->fd, VIDIOC_REQBUFS, &req); + if (ret < 0) { + av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_REQBUFS failed: %s\n", strerror(errno)); + + return AVERROR(errno); + } + + queue->num_buffers = req.count; + queue->buffers = av_mallocz(queue->num_buffers * sizeof(V4L2Buffer)); + if (!queue->buffers) { + av_log(ctx->logctx, AV_LOG_ERROR, "malloc enomem\n"); + + return AVERROR(ENOMEM); + } + + for (i = 0; i < queue->num_buffers; i++) { + V4L2Buffer * const buf = &queue->buffers[i]; + + buf->enqueued = 0; + buf->q = queue; + + buf->buffer.type = fmt->type; + buf->buffer.memory = memory; + buf->buffer.index = i; + + if (multiplanar) { + buf->buffer.length = VIDEO_MAX_PLANES; + buf->buffer.m.planes = buf->planes; + } + + drm_frame_init(&buf->drm_frame); + } + + for (i = 0; i < queue->num_buffers; i++) { + V4L2Buffer * const buf = &queue->buffers[i]; + + ret = ioctl(ctx->fd, VIDIOC_QUERYBUF, &buf->buffer); + if (ret < 0) { + ret = AVERROR(errno); + + goto fail; + } + + buf->num_planes = multiplanar ? buf->buffer.length : 1; + + if (!V4L2_TYPE_IS_OUTPUT(fmt->type)) { + ret = deint_v4l2m2m_enqueue_buffer(buf); + if (ret) + goto fail; + + ret = v4l2_buffer_export_drm(queue, buf); + if (ret) + goto fail; + } + } + + return 0; + +fail: + avbufs_delete(&queue->buffers, queue->num_buffers); + queue->num_buffers = 0; + return ret; +} + +static int deint_v4l2m2m_streamon(V4L2Queue *queue) +{ + DeintV4L2M2MContextShared * const ctx = queue->ctx; + int type = queue->format.type; + int ret; + + ret = ioctl(ctx->fd, VIDIOC_STREAMON, &type); + av_log(ctx->logctx, AV_LOG_DEBUG, "%s: type:%d ret:%d errno:%d\n", __func__, type, ret, AVERROR(errno)); + if (ret < 0) + return AVERROR(errno); + + return 0; +} + +static int deint_v4l2m2m_streamoff(V4L2Queue *queue) +{ + DeintV4L2M2MContextShared * const ctx = queue->ctx; + int type = queue->format.type; + int ret; + + ret = ioctl(ctx->fd, VIDIOC_STREAMOFF, &type); + av_log(ctx->logctx, AV_LOG_DEBUG, "%s: type:%d ret:%d errno:%d\n", __func__, type, ret, AVERROR(errno)); + if (ret < 0) + return AVERROR(errno); + + return 0; +} + +// timeout in ms +static V4L2Buffer* deint_v4l2m2m_dequeue_buffer(V4L2Queue *queue, int timeout) +{ + struct v4l2_plane planes[VIDEO_MAX_PLANES]; + DeintV4L2M2MContextShared *ctx = queue->ctx; + struct v4l2_buffer buf = { 0 }; + V4L2Buffer* avbuf = NULL; + struct pollfd pfd; + short events; + int ret; + + if (V4L2_TYPE_IS_OUTPUT(queue->format.type)) + events = POLLOUT | POLLWRNORM; + else + events = POLLIN | POLLRDNORM; + + pfd.events = events; + pfd.fd = ctx->fd; + + for (;;) { + ret = poll(&pfd, 1, timeout); + if (ret > 0) + break; + if (errno == EINTR) + continue; + return NULL; + } + + if (pfd.revents & POLLERR) + return NULL; + + if (pfd.revents & events) { + memset(&buf, 0, sizeof(buf)); + buf.memory = V4L2_MEMORY_MMAP; + buf.type = queue->format.type; + if (V4L2_TYPE_IS_MULTIPLANAR(queue->format.type)) { + memset(planes, 0, sizeof(planes)); + buf.length = VIDEO_MAX_PLANES; + buf.m.planes = planes; + } + + ret = ioctl(ctx->fd, VIDIOC_DQBUF, &buf); + if (ret) { + if (errno != EAGAIN) + av_log(ctx->logctx, AV_LOG_DEBUG, "VIDIOC_DQBUF, errno (%s)\n", + av_err2str(AVERROR(errno))); + return NULL; + } + + avbuf = &queue->buffers[buf.index]; + avbuf->enqueued = 0; + avbuf->buffer = buf; + if (V4L2_TYPE_IS_MULTIPLANAR(queue->format.type)) { + memcpy(avbuf->planes, planes, sizeof(planes)); + avbuf->buffer.m.planes = avbuf->planes; + } + return avbuf; + } + + return NULL; +} + +static V4L2Buffer *deint_v4l2m2m_find_free_buf(V4L2Queue *queue) +{ + int i; + V4L2Buffer *buf = NULL; + + for (i = 0; i < queue->num_buffers; i++) + if (!queue->buffers[i].enqueued) { + buf = &queue->buffers[i]; + break; + } + return buf; +} + +static void deint_v4l2m2m_unref_queued(V4L2Queue *queue) +{ + int i; + V4L2Buffer *buf = NULL; + + if (!queue || !queue->buffers) + return; + for (i = 0; i < queue->num_buffers; i++) { + buf = &queue->buffers[i]; + if (queue->buffers[i].enqueued) + av_frame_unref(&buf->frame); + } +} + +static void recycle_q(V4L2Queue * const queue) +{ + V4L2Buffer* avbuf; + while (avbuf = deint_v4l2m2m_dequeue_buffer(queue, 0), avbuf) { + av_frame_unref(&avbuf->frame); + } +} + +static int count_enqueued(V4L2Queue *queue) +{ + int i; + int n = 0; + + if (queue->buffers == NULL) + return 0; + + for (i = 0; i < queue->num_buffers; i++) + if (queue->buffers[i].enqueued) + ++n; + return n; +} + +static int deint_v4l2m2m_enqueue_frame(V4L2Queue * const queue, AVFrame * const frame) +{ + DeintV4L2M2MContextShared *const ctx = queue->ctx; + AVDRMFrameDescriptor *drm_desc = (AVDRMFrameDescriptor *)frame->data[0]; + V4L2Buffer *buf; + int i; + + if (V4L2_TYPE_IS_OUTPUT(queue->format.type)) + recycle_q(queue); + + buf = deint_v4l2m2m_find_free_buf(queue); + if (!buf) { + av_log(ctx->logctx, AV_LOG_ERROR, "%s: error %d finding free buf\n", __func__, 0); + return AVERROR(EAGAIN); + } + if (V4L2_TYPE_IS_MULTIPLANAR(buf->buffer.type)) + for (i = 0; i < drm_desc->nb_objects; i++) + buf->buffer.m.planes[i].m.fd = drm_desc->objects[i].fd; + else + buf->buffer.m.fd = drm_desc->objects[0].fd; + + buf->buffer.field = !frame->interlaced_frame ? V4L2_FIELD_NONE : + frame->top_field_first ? V4L2_FIELD_INTERLACED_TB : + V4L2_FIELD_INTERLACED_BT; + + if (ctx->field_order != buf->buffer.field) { + av_log(ctx->logctx, AV_LOG_DEBUG, "%s: Field changed: %d->%d\n", __func__, ctx->field_order, buf->buffer.field); + ctx->field_order = buf->buffer.field; + } + + buf->buffer.timestamp = pts_track_add_frame(&ctx->track, frame); + + buf->drm_frame.objects[0].fd = drm_desc->objects[0].fd; + + av_frame_move_ref(&buf->frame, frame); + + return deint_v4l2m2m_enqueue_buffer(buf); +} + +static void deint_v4l2m2m_destroy_context(DeintV4L2M2MContextShared *ctx) +{ + if (atomic_fetch_sub(&ctx->refcount, 1) == 1) { + V4L2Queue *capture = &ctx->capture; + V4L2Queue *output = &ctx->output; + + av_log(NULL, AV_LOG_DEBUG, "%s - destroying context\n", __func__); + + if (ctx->fd >= 0) { + deint_v4l2m2m_streamoff(capture); + deint_v4l2m2m_streamoff(output); + } + + avbufs_delete(&capture->buffers, capture->num_buffers); + + deint_v4l2m2m_unref_queued(output); + + av_buffer_unref(&ctx->hw_frames_ctx); + + if (capture->buffers) + av_free(capture->buffers); + + if (output->buffers) + av_free(output->buffers); + + if (ctx->fd >= 0) { + close(ctx->fd); + ctx->fd = -1; + } + + av_free(ctx); + } +} + +static void v4l2_free_buffer(void *opaque, uint8_t *unused) +{ + V4L2Buffer *buf = opaque; + DeintV4L2M2MContextShared *ctx = buf->q->ctx; + + if (!ctx->done) + deint_v4l2m2m_enqueue_buffer(buf); + + deint_v4l2m2m_destroy_context(ctx); +} + +// timeout in ms +static int deint_v4l2m2m_dequeue_frame(V4L2Queue *queue, AVFrame* frame, int timeout) +{ + DeintV4L2M2MContextShared *ctx = queue->ctx; + V4L2Buffer* avbuf; + enum AVColorPrimaries color_primaries; + enum AVColorSpace colorspace; + enum AVColorTransferCharacteristic color_trc; + enum AVColorRange color_range; + + av_log(ctx->logctx, AV_LOG_TRACE, "<<< %s\n", __func__); + + if (queue->eos) { + av_log(ctx->logctx, AV_LOG_TRACE, ">>> %s: EOS\n", __func__); + return AVERROR_EOF; + } + + avbuf = deint_v4l2m2m_dequeue_buffer(queue, timeout); + if (!avbuf) { + av_log(ctx->logctx, AV_LOG_DEBUG, "%s: No buffer to dequeue (timeout=%d)\n", __func__, timeout); + return AVERROR(EAGAIN); + } + + if (V4L2_TYPE_IS_CAPTURE(avbuf->buffer.type)) { + if ((avbuf->buffer.flags & V4L2_BUF_FLAG_LAST) != 0) + queue->eos = 1; + if (buf_bytesused0(&avbuf->buffer) == 0) + return queue->eos ? AVERROR_EOF : AVERROR(EINVAL); + } + + // Fill in PTS and anciliary info from src frame + pts_track_get_frame(&ctx->track, avbuf->buffer.timestamp, frame); + + frame->buf[0] = av_buffer_create((uint8_t *) &avbuf->drm_frame, + sizeof(avbuf->drm_frame), v4l2_free_buffer, + avbuf, AV_BUFFER_FLAG_READONLY); + if (!frame->buf[0]) { + av_log(ctx->logctx, AV_LOG_ERROR, "%s: error %d creating buffer\n", __func__, 0); + return AVERROR(ENOMEM); + } + + atomic_fetch_add(&ctx->refcount, 1); + + frame->data[0] = (uint8_t *)&avbuf->drm_frame; + frame->format = AV_PIX_FMT_DRM_PRIME; + if (ctx->hw_frames_ctx) + frame->hw_frames_ctx = av_buffer_ref(ctx->hw_frames_ctx); + frame->height = ctx->output_height; + frame->width = ctx->output_width; + + color_primaries = get_color_primaries(&ctx->capture.format); + colorspace = get_color_space(&ctx->capture.format); + color_trc = get_color_trc(&ctx->capture.format); + color_range = get_color_range(&ctx->capture.format); + + // If the color parameters are unspecified by V4L2 then leave alone as they + // will have been copied from src + if (color_primaries != AVCOL_PRI_UNSPECIFIED) + frame->color_primaries = color_primaries; + if (colorspace != AVCOL_SPC_UNSPECIFIED) + frame->colorspace = colorspace; + if (color_trc != AVCOL_TRC_UNSPECIFIED) + frame->color_trc = color_trc; + if (color_range != AVCOL_RANGE_UNSPECIFIED) + frame->color_range = color_range; + + if (ctx->filter_type == FILTER_V4L2_DEINTERLACE) { + // Not interlaced now + frame->interlaced_frame = 0; // *** Fill in from dst buffer? + frame->top_field_first = 0; + // Pkt duration halved + frame->pkt_duration /= 2; + } + + if (avbuf->buffer.flags & V4L2_BUF_FLAG_ERROR) { + av_log(ctx->logctx, AV_LOG_ERROR, "driver decode error\n"); + frame->decode_error_flags |= FF_DECODE_ERROR_INVALID_BITSTREAM; + } + + av_log(ctx->logctx, AV_LOG_TRACE, ">>> %s: PTS=%"PRId64"\n", __func__, frame->pts); + return 0; +} + +static int deint_v4l2m2m_config_props(AVFilterLink *outlink) +{ + AVFilterLink *inlink = outlink->src->inputs[0]; + AVFilterContext *avctx = outlink->src; + DeintV4L2M2MContext *priv = avctx->priv; + DeintV4L2M2MContextShared *ctx = priv->shared; + int ret; + + ctx->height = avctx->inputs[0]->h; + ctx->width = avctx->inputs[0]->w; + + if (ctx->filter_type == FILTER_V4L2_SCALE) { + if ((ret = ff_scale_eval_dimensions(priv, + priv->w_expr, priv->h_expr, + inlink, outlink, + &ctx->output_width, &ctx->output_height)) < 0) + return ret; + + ff_scale_adjust_dimensions(inlink, &ctx->output_width, &ctx->output_height, + priv->force_original_aspect_ratio, priv->force_divisible_by); + } + else { + ctx->output_width = ctx->width; + ctx->output_height = ctx->height; + } + + av_log(priv, AV_LOG_DEBUG, "%s: %dx%d->%dx%d FR: %d/%d->%d/%d\n", __func__, + ctx->width, ctx->height, ctx->output_width, ctx->output_height, + inlink->frame_rate.num, inlink->frame_rate.den, outlink->frame_rate.num, outlink->frame_rate.den); + + outlink->time_base = inlink->time_base; + outlink->w = ctx->output_width; + outlink->h = ctx->output_height; + outlink->format = inlink->format; + if (ctx->filter_type == FILTER_V4L2_DEINTERLACE && inlink->frame_rate.den != 0) + outlink->frame_rate = (AVRational){inlink->frame_rate.num * 2, inlink->frame_rate.den}; + + if (inlink->sample_aspect_ratio.num) + outlink->sample_aspect_ratio = av_mul_q((AVRational){outlink->h * inlink->w, outlink->w * inlink->h}, inlink->sample_aspect_ratio); + else + outlink->sample_aspect_ratio = inlink->sample_aspect_ratio; + + ret = deint_v4l2m2m_find_device(ctx); + if (ret) + return ret; + + if (inlink->hw_frames_ctx) { + ctx->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx); + if (!ctx->hw_frames_ctx) + return AVERROR(ENOMEM); + } + return 0; +} + +static int deint_v4l2m2m_query_formats(AVFilterContext *avctx) +{ + static const enum AVPixelFormat pixel_formats[] = { + AV_PIX_FMT_DRM_PRIME, +// AV_PIX_FMT_YUV420P, + AV_PIX_FMT_NONE, + }; + + return ff_set_common_formats(avctx, ff_make_format_list(pixel_formats)); +} + +static uint32_t desc_pixelformat(const AVDRMFrameDescriptor * const drm_desc) +{ + const uint64_t mod = drm_desc->objects[0].format_modifier; + const int is_linear = (mod == DRM_FORMAT_MOD_LINEAR || mod == DRM_FORMAT_MOD_INVALID); + + // Only currently support single object things + if (drm_desc->nb_objects != 1) + return 0; + + switch (drm_desc->layers[0].format) { + case DRM_FORMAT_YUV420: + return is_linear ? V4L2_PIX_FMT_YUV420 : 0; + case DRM_FORMAT_NV12: + return is_linear ? V4L2_PIX_FMT_NV12 : +#if CONFIG_SAND + fourcc_mod_broadcom_mod(mod) == DRM_FORMAT_MOD_BROADCOM_SAND128 ? V4L2_PIX_FMT_NV12_COL128 : +#endif + 0; + default: + break; + } + return 0; +} + +static int deint_v4l2m2m_filter_frame(AVFilterLink *link, AVFrame *in) +{ + AVFilterContext *avctx = link->dst; + DeintV4L2M2MContext *priv = avctx->priv; + DeintV4L2M2MContextShared *ctx = priv->shared; + V4L2Queue *capture = &ctx->capture; + V4L2Queue *output = &ctx->output; + int ret; + + av_log(priv, AV_LOG_DEBUG, "<<< %s: input pts: %"PRId64" dts: %"PRId64" field :%d interlaced: %d aspect:%d/%d\n", + __func__, in->pts, in->pkt_dts, in->top_field_first, in->interlaced_frame, in->sample_aspect_ratio.num, in->sample_aspect_ratio.den); + av_log(priv, AV_LOG_DEBUG, "--- %s: in status in %d/ot %d; out status in %d/out %d\n", __func__, + avctx->inputs[0]->status_in, avctx->inputs[0]->status_out, avctx->outputs[0]->status_in, avctx->outputs[0]->status_out); + + if (ctx->field_order == V4L2_FIELD_ANY) { + const AVDRMFrameDescriptor * const drm_desc = (AVDRMFrameDescriptor *)in->data[0]; + uint32_t pixelformat = desc_pixelformat(drm_desc); + + if (pixelformat == 0) { + av_log(avctx, AV_LOG_ERROR, "Unsupported DRM format %s in %d objects, modifier %#" PRIx64 "\n", + av_fourcc2str(drm_desc->layers[0].format), + drm_desc->nb_objects, drm_desc->objects[0].format_modifier); + return AVERROR(EINVAL); + } + + ctx->orig_width = drm_desc->layers[0].planes[0].pitch; + ctx->orig_height = drm_desc->layers[0].planes[1].offset / ctx->orig_width; + + av_log(priv, AV_LOG_DEBUG, "%s: %dx%d (%td,%td)\n", __func__, ctx->width, ctx->height, + drm_desc->layers[0].planes[0].pitch, drm_desc->layers[0].planes[1].offset); + + if ((ret = set_src_fmt(output, in)) != 0) { + av_log(avctx, AV_LOG_WARNING, "Unknown input DRM format: %s mod: %#" PRIx64 "\n", + av_fourcc2str(drm_desc->layers[0].format), drm_desc->objects[0].format_modifier); + return ret; + } + + ret = do_s_fmt(output); + if (ret) { + av_log(avctx, AV_LOG_WARNING, "Failed to set source format\n"); + return ret; + } + + if (ctx->output_format != AV_PIX_FMT_NONE) + pixelformat = fmt_av_to_v4l2(ctx->output_format); + ret = set_dst_format(priv, capture, pixelformat, V4L2_FIELD_NONE, ctx->output_width, ctx->output_height); + if (ret) { + av_log(avctx, AV_LOG_WARNING, "Failed to set destination format\n"); + return ret; + } + + ret = deint_v4l2m2m_allocate_buffers(capture); + if (ret) { + av_log(avctx, AV_LOG_WARNING, "Failed to allocate destination buffers\n"); + return ret; + } + + ret = deint_v4l2m2m_streamon(capture); + if (ret) { + av_log(avctx, AV_LOG_WARNING, "Failed set destination streamon: %s\n", av_err2str(ret)); + return ret; + } + + ret = deint_v4l2m2m_allocate_buffers(output); + if (ret) { + av_log(avctx, AV_LOG_WARNING, "Failed to allocate src buffers\n"); + return ret; + } + + ret = deint_v4l2m2m_streamon(output); + if (ret) { + av_log(avctx, AV_LOG_WARNING, "Failed set src streamon: %s\n", av_err2str(ret)); + return ret; + } + + if (in->top_field_first) + ctx->field_order = V4L2_FIELD_INTERLACED_TB; + else + ctx->field_order = V4L2_FIELD_INTERLACED_BT; + + { + struct v4l2_encoder_cmd ecmd = { + .cmd = V4L2_ENC_CMD_STOP + }; + ctx->has_enc_stop = 0; + if (ioctl(ctx->fd, VIDIOC_TRY_ENCODER_CMD, &ecmd) == 0) { + av_log(ctx->logctx, AV_LOG_DEBUG, "Test encode stop succeeded\n"); + ctx->has_enc_stop = 1; + } + else { + av_log(ctx->logctx, AV_LOG_DEBUG, "Test encode stop fail: %s\n", av_err2str(AVERROR(errno))); + } + + } + } + + ret = deint_v4l2m2m_enqueue_frame(output, in); + + av_log(priv, AV_LOG_TRACE, ">>> %s: %s\n", __func__, av_err2str(ret)); + return ret; +} + +static int +ack_inlink(AVFilterContext * const avctx, DeintV4L2M2MContextShared *const s, + AVFilterLink * const inlink) +{ + int instatus; + int64_t inpts; + + if (ff_inlink_acknowledge_status(inlink, &instatus, &inpts) <= 0) + return 0; + + s->drain = instatus; + s->drain_pts = inpts; + s->drain_state = DRAIN_TIMEOUT; + + if (s->field_order == V4L2_FIELD_ANY) { // Not yet started + s->drain_state = DRAIN_DONE; + } + else if (s->one_to_one) { + s->drain_state = DRAIN_LAST; + } + else if (s->has_enc_stop) { + struct v4l2_encoder_cmd ecmd = { + .cmd = V4L2_ENC_CMD_STOP + }; + if (ioctl(s->fd, VIDIOC_ENCODER_CMD, &ecmd) == 0) { + av_log(avctx->priv, AV_LOG_DEBUG, "Do Encode stop\n"); + s->drain_state = DRAIN_EOS; + } + else { + av_log(avctx->priv, AV_LOG_WARNING, "Encode stop fail: %s\n", av_err2str(AVERROR(errno))); + } + } + return 1; +} + +static int deint_v4l2m2m_activate(AVFilterContext *avctx) +{ + DeintV4L2M2MContext * const priv = avctx->priv; + DeintV4L2M2MContextShared *const s = priv->shared; + AVFilterLink * const outlink = avctx->outputs[0]; + AVFilterLink * const inlink = avctx->inputs[0]; + int n = 0; + int cn = 99; + int did_something = 0; + + av_log(priv, AV_LOG_TRACE, "<<< %s\n", __func__); + + FF_FILTER_FORWARD_STATUS_BACK_ALL(outlink, avctx); + + ack_inlink(avctx, s, inlink); + + if (s->field_order != V4L2_FIELD_ANY) // Can't DQ if no setup! + { + AVFrame * frame = av_frame_alloc(); + int rv; + + recycle_q(&s->output); + n = count_enqueued(&s->output); + + if (frame == NULL) { + av_log(priv, AV_LOG_ERROR, "%s: error allocating frame\n", __func__); + return AVERROR(ENOMEM); + } + + rv = deint_v4l2m2m_dequeue_frame(&s->capture, frame, + drain_frame_expected(s->drain_state) || n > 4 ? 300 : 0); + if (rv != 0) { + av_frame_free(&frame); + if (rv == AVERROR_EOF) { + av_log(priv, AV_LOG_DEBUG, "%s: --- DQ EOF\n", __func__); + s->drain_state = DRAIN_DONE; + } + else if (rv == AVERROR(EAGAIN)) { + if (s->drain_state != DRAIN_NONE) { + av_log(priv, AV_LOG_DEBUG, "%s: --- DQ empty - drain done\n", __func__); + s->drain_state = DRAIN_DONE; + } + } + else { + av_log(priv, AV_LOG_ERROR, ">>> %s: DQ fail: %s\n", __func__, av_err2str(rv)); + return rv; + } + } + else { + frame->interlaced_frame = 0; + // frame is always consumed by filter_frame - even on error despite + // a somewhat confusing comment in the header + rv = ff_filter_frame(outlink, frame); + ++s->frames_tx; + + av_log(priv, AV_LOG_TRACE, "%s: Filtered: %s\n", __func__, av_err2str(rv)); + did_something = 1; + + if (s->drain_state != DRAIN_NONE && pts_track_count(&s->track) == 0) { + av_log(priv, AV_LOG_DEBUG, "%s: --- DQ last - drain done\n", __func__); + s->drain_state = DRAIN_DONE; + } + } + + cn = count_enqueued(&s->capture); + } + + if (s->drain_state == DRAIN_DONE) { + ff_outlink_set_status(outlink, s->drain, s->drain_pts); + av_log(priv, AV_LOG_TRACE, ">>> %s: Status done: %s\n", __func__, av_err2str(s->drain)); + return 0; + } + + recycle_q(&s->output); + n = count_enqueued(&s->output); + + while (n < 6 && !s->drain) { + AVFrame * frame; + int rv; + + if ((rv = ff_inlink_consume_frame(inlink, &frame)) < 0) { + av_log(priv, AV_LOG_ERROR, "%s: consume in failed: %s\n", __func__, av_err2str(rv)); + return rv; + } + + if (frame == NULL) { + av_log(priv, AV_LOG_TRACE, "%s: No frame\n", __func__); + if (!ack_inlink(avctx, s, inlink)) { + ff_inlink_request_frame(inlink); + av_log(priv, AV_LOG_TRACE, "%s: req frame\n", __func__); + } + break; + } + ++s->frames_rx; + + rv = deint_v4l2m2m_filter_frame(inlink, frame); + av_frame_free(&frame); + + if (rv != 0) + return rv; + + av_log(priv, AV_LOG_TRACE, "%s: Q frame\n", __func__); + did_something = 1; + ++n; + } + + if ((n > 4 || s->drain) && ff_outlink_frame_wanted(outlink)) { + ff_filter_set_ready(avctx, 1); + did_something = 1; + av_log(priv, AV_LOG_TRACE, "%s: ready\n", __func__); + } + + av_log(priv, AV_LOG_TRACE, ">>> %s: OK (n=%d, cn=%d)\n", __func__, n, cn); + return did_something ? 0 : FFERROR_NOT_READY; +} + +static av_cold int common_v4l2m2m_init(AVFilterContext * const avctx, const filter_type_v4l2_t filter_type) +{ + DeintV4L2M2MContext * const priv = avctx->priv; + DeintV4L2M2MContextShared * const ctx = av_mallocz(sizeof(DeintV4L2M2MContextShared)); + + if (!ctx) { + av_log(priv, AV_LOG_ERROR, "%s: error %d allocating context\n", __func__, 0); + return AVERROR(ENOMEM); + } + priv->shared = ctx; + ctx->logctx = priv; + ctx->filter_type = filter_type; + ctx->fd = -1; + ctx->output.ctx = ctx; + ctx->output.num_buffers = 8; + ctx->output.name = "OUTPUT"; + ctx->capture.ctx = ctx; + ctx->capture.num_buffers = 12; + ctx->capture.name = "CAPTURE"; + ctx->done = 0; + ctx->field_order = V4L2_FIELD_ANY; + + pts_track_init(&ctx->track, priv); + + atomic_init(&ctx->refcount, 1); + + if (priv->output_format_string) { + ctx->output_format = av_get_pix_fmt(priv->output_format_string); + if (ctx->output_format == AV_PIX_FMT_NONE) { + av_log(avctx, AV_LOG_ERROR, "Invalid ffmpeg output format '%s'.\n", priv->output_format_string); + return AVERROR(EINVAL); + } + if (fmt_av_to_v4l2(ctx->output_format) == 0) { + av_log(avctx, AV_LOG_ERROR, "Unsupported output format for V4L2: %s.\n", av_get_pix_fmt_name(ctx->output_format)); + return AVERROR(EINVAL); + } + } else { + // Use the input format once that is configured. + ctx->output_format = AV_PIX_FMT_NONE; + } + +#define STRING_OPTION(var_name, func_name, default_value) do { \ + if (priv->var_name ## _string) { \ + int var = av_ ## func_name ## _from_name(priv->var_name ## _string); \ + if (var < 0) { \ + av_log(avctx, AV_LOG_ERROR, "Invalid %s.\n", #var_name); \ + return AVERROR(EINVAL); \ + } \ + priv->var_name = var; \ + } else { \ + priv->var_name = default_value; \ + } \ + } while (0) + + STRING_OPTION(colour_primaries, color_primaries, AVCOL_PRI_UNSPECIFIED); + STRING_OPTION(colour_transfer, color_transfer, AVCOL_TRC_UNSPECIFIED); + STRING_OPTION(colour_matrix, color_space, AVCOL_SPC_UNSPECIFIED); + STRING_OPTION(chroma_location, chroma_location, AVCHROMA_LOC_UNSPECIFIED); + + return 0; +} + +static av_cold int deint_v4l2m2m_init(AVFilterContext *avctx) +{ + return common_v4l2m2m_init(avctx, FILTER_V4L2_DEINTERLACE); +} + +static av_cold int scale_v4l2m2m_init(AVFilterContext *avctx) +{ + int rv; + DeintV4L2M2MContext * priv; + DeintV4L2M2MContextShared * ctx; + + if ((rv = common_v4l2m2m_init(avctx, FILTER_V4L2_SCALE)) != 0) + return rv; + + priv = avctx->priv; + ctx = priv->shared; + + ctx->one_to_one = 1; + return 0; +} + +static void deint_v4l2m2m_uninit(AVFilterContext *avctx) +{ + DeintV4L2M2MContext *priv = avctx->priv; + DeintV4L2M2MContextShared *ctx = priv->shared; + + av_log(priv, AV_LOG_VERBOSE, "Frames Rx: %u, Frames Tx: %u\n", + ctx->frames_rx, ctx->frames_tx); + ctx->done = 1; + ctx->logctx = NULL; // Log to NULL works, log to missing crashes + pts_track_uninit(&ctx->track); + deint_v4l2m2m_destroy_context(ctx); +} + +static const AVOption deinterlace_v4l2m2m_options[] = { + { NULL }, +}; + +AVFILTER_DEFINE_CLASS(deinterlace_v4l2m2m); + +#define OFFSET(x) offsetof(DeintV4L2M2MContext, x) +#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM) + +static const AVOption scale_v4l2m2m_options[] = { + { "w", "Output video width", + OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, .flags = FLAGS }, + { "h", "Output video height", + OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, .flags = FLAGS }, + { "format", "Output video format (software format of hardware frames)", + OFFSET(output_format_string), AV_OPT_TYPE_STRING, .flags = FLAGS }, + // These colour properties match the ones of the same name in vf_scale. + { "out_color_matrix", "Output colour matrix coefficient set", + OFFSET(colour_matrix_string), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS }, + { "out_range", "Output colour range", + OFFSET(colour_range), AV_OPT_TYPE_INT, { .i64 = AVCOL_RANGE_UNSPECIFIED }, + AVCOL_RANGE_UNSPECIFIED, AVCOL_RANGE_JPEG, FLAGS, "range" }, + { "full", "Full range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" }, + { "limited", "Limited range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" }, + { "jpeg", "Full range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" }, + { "mpeg", "Limited range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" }, + { "tv", "Limited range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" }, + { "pc", "Full range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" }, + // These colour properties match the ones in the VAAPI scaler + { "out_color_primaries", "Output colour primaries", + OFFSET(colour_primaries_string), AV_OPT_TYPE_STRING, + { .str = NULL }, .flags = FLAGS }, + { "out_color_transfer", "Output colour transfer characteristics", + OFFSET(colour_transfer_string), AV_OPT_TYPE_STRING, + { .str = NULL }, .flags = FLAGS }, + { "out_chroma_location", "Output chroma sample location", + OFFSET(chroma_location_string), AV_OPT_TYPE_STRING, + { .str = NULL }, .flags = FLAGS }, + { "force_original_aspect_ratio", "decrease or increase w/h if necessary to keep the original AR", OFFSET(force_original_aspect_ratio), AV_OPT_TYPE_INT, { .i64 = 0}, 0, 2, FLAGS, "force_oar" }, + { "force_divisible_by", "enforce that the output resolution is divisible by a defined integer when force_original_aspect_ratio is used", OFFSET(force_divisible_by), AV_OPT_TYPE_INT, { .i64 = 1}, 1, 256, FLAGS }, + { NULL }, +}; + +AVFILTER_DEFINE_CLASS(scale_v4l2m2m); + +static const AVFilterPad deint_v4l2m2m_inputs[] = { + { + .name = "default", + .type = AVMEDIA_TYPE_VIDEO, + }, + { NULL } +}; + +static const AVFilterPad deint_v4l2m2m_outputs[] = { + { + .name = "default", + .type = AVMEDIA_TYPE_VIDEO, + .config_props = deint_v4l2m2m_config_props, + }, + { NULL } +}; + +AVFilter ff_vf_deinterlace_v4l2m2m = { + .name = "deinterlace_v4l2m2m", + .description = NULL_IF_CONFIG_SMALL("V4L2 M2M deinterlacer"), + .priv_size = sizeof(DeintV4L2M2MContext), + .init = &deint_v4l2m2m_init, + .uninit = &deint_v4l2m2m_uninit, + .query_formats = &deint_v4l2m2m_query_formats, + .inputs = deint_v4l2m2m_inputs, + .outputs = deint_v4l2m2m_outputs, + .priv_class = &deinterlace_v4l2m2m_class, + .activate = deint_v4l2m2m_activate, +}; + +AVFilter ff_vf_scale_v4l2m2m = { + .name = "scale_v4l2m2m", + .description = NULL_IF_CONFIG_SMALL("V4L2 M2M scaler"), + .priv_size = sizeof(DeintV4L2M2MContext), + .init = &scale_v4l2m2m_init, + .uninit = &deint_v4l2m2m_uninit, + .query_formats = &deint_v4l2m2m_query_formats, + .inputs = deint_v4l2m2m_inputs, + .outputs = deint_v4l2m2m_outputs, + .priv_class = &scale_v4l2m2m_class, + .activate = deint_v4l2m2m_activate, +}; + diff --git a/libavfilter/vf_unsand.c b/libavfilter/vf_unsand.c new file mode 100644 index 0000000000..61c03a385c --- /dev/null +++ b/libavfilter/vf_unsand.c @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2007 Bobby Bingham + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * format and noformat video filters + */ + +#include + +#include "libavutil/internal.h" +#include "libavutil/mem.h" +#include "libavutil/pixdesc.h" +#include "libavutil/opt.h" +#include "libavutil/rpi_sand_fns.h" + +#include "avfilter.h" +#include "formats.h" +#include "internal.h" +#include "video.h" + +typedef struct UnsandContext { + const AVClass *class; +} UnsandContext; + +static av_cold void uninit(AVFilterContext *ctx) +{ +// UnsandContext *s = ctx->priv; +} + +static av_cold int init(AVFilterContext *ctx) +{ +// UnsandContext *s = ctx->priv; + + return 0; +} + + +static int filter_frame(AVFilterLink *link, AVFrame *in) +{ + AVFilterLink * const outlink = link->dst->outputs[0]; + AVFrame *out = NULL; + int rv = 0; + + if (outlink->format == in->format) { + // If nothing to do then do nothing + out = in; + } + else + { + if ((out = ff_get_video_buffer(outlink, av_frame_cropped_width(in), av_frame_cropped_height(in))) == NULL) + { + rv = AVERROR(ENOMEM); + goto fail; + } + if (av_rpi_sand_to_planar_frame(out, in) != 0) + { + rv = -1; + goto fail; + } + + av_frame_free(&in); + } + + return ff_filter_frame(outlink, out); + +fail: + av_frame_free(&out); + av_frame_free(&in); + return rv; +} + +#if 0 +static void dump_fmts(const AVFilterFormats * fmts) +{ + int i; + if (fmts== NULL) { + printf("NULL\n"); + return; + } + for (i = 0; i < fmts->nb_formats; ++i) { + printf(" %d", fmts->formats[i]); + } + printf("\n"); +} +#endif + +static int query_formats(AVFilterContext *ctx) +{ +// UnsandContext *s = ctx->priv; + int ret; + + // If we aren't connected at both ends then just do nothing + if (ctx->inputs[0] == NULL || ctx->outputs[0] == NULL) + return 0; + + // Our output formats depend on our input formats and we can't/don't + // want to convert between bit depths so we need to wait for the source + // to have an opinion before we do + if (ctx->inputs[0]->incfg.formats == NULL) + return AVERROR(EAGAIN); + + // Accept anything + if (ctx->inputs[0]->outcfg.formats == NULL && + (ret = ff_formats_ref(ctx->inputs[0]->incfg.formats, &ctx->inputs[0]->outcfg.formats)) < 0) + return ret; + + // Filter out sand formats + + // Generate a container if we don't already have one + if (ctx->outputs[0]->incfg.formats == NULL) + { + // Somewhat rubbish way of ensuring we have a good structure + const static enum AVPixelFormat out_fmts[] = {AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE}; + AVFilterFormats *formats = ff_make_format_list(out_fmts); + + if (formats == NULL) + return AVERROR(ENOMEM); + if ((ret = ff_formats_ref(formats, &ctx->outputs[0]->incfg.formats)) < 0) + return ret; + } + + // Replace old format list with new filtered list derived from what our + // input says it can do + { + const AVFilterFormats * const src_ff = ctx->inputs[0]->outcfg.formats; + AVFilterFormats * const dst_ff = ctx->outputs[0]->incfg.formats; + enum AVPixelFormat *dst_fmts = av_malloc(sizeof(enum AVPixelFormat) * src_ff->nb_formats); + int i; + int n = 0; + int seen_420p = 0; + int seen_420p10 = 0; + + for (i = 0; i < src_ff->nb_formats; ++i) { + const enum AVPixelFormat f = src_ff->formats[i]; + + switch (f){ + case AV_PIX_FMT_YUV420P: + case AV_PIX_FMT_SAND128: + case AV_PIX_FMT_RPI4_8: + if (!seen_420p) { + seen_420p = 1; + dst_fmts[n++] = AV_PIX_FMT_YUV420P; + } + break; + case AV_PIX_FMT_SAND64_10: + case AV_PIX_FMT_YUV420P10: + case AV_PIX_FMT_RPI4_10: + if (!seen_420p10) { + seen_420p10 = 1; + dst_fmts[n++] = AV_PIX_FMT_YUV420P10; + } + break; + default: + dst_fmts[n++] = f; + break; + } + } + + av_freep(&dst_ff->formats); + dst_ff->formats = dst_fmts; + dst_ff->nb_formats = n; + } + +// printf("Unsand: %s calc: ", __func__); +// dump_fmts(ctx->outputs[0]->incfg.formats); + + return 0; +} + + +#define OFFSET(x) offsetof(UnsandContext, x) +static const AVOption unsand_options[] = { + { NULL } +}; + + +AVFILTER_DEFINE_CLASS(unsand); + +static const AVFilterPad avfilter_vf_unsand_inputs[] = { + { + .name = "default", + .type = AVMEDIA_TYPE_VIDEO, + .filter_frame = filter_frame, + }, + { NULL } +}; + +static const AVFilterPad avfilter_vf_unsand_outputs[] = { + { + .name = "default", + .type = AVMEDIA_TYPE_VIDEO + }, + { NULL } +}; + +AVFilter ff_vf_unsand = { + .name = "unsand", + .description = NULL_IF_CONFIG_SMALL("Convert sand pix fmt to yuv"), + + .init = init, + .uninit = uninit, + + .query_formats = query_formats, + + .priv_size = sizeof(UnsandContext), + .priv_class = &unsand_class, + + .inputs = avfilter_vf_unsand_inputs, + .outputs = avfilter_vf_unsand_outputs, +}; + diff --git a/libavfilter/x86/vf_bwdif_init.c b/libavfilter/x86/vf_bwdif_init.c index b1e70b3bc6..b9e3a25921 100644 --- a/libavfilter/x86/vf_bwdif_init.c +++ b/libavfilter/x86/vf_bwdif_init.c @@ -51,11 +51,9 @@ void ff_bwdif_filter_line_12bit_ssse3(void *dst, void *prev, void *cur, void *ne int mrefs2, int prefs3, int mrefs3, int prefs4, int mrefs4, int parity, int clip_max); -av_cold void ff_bwdif_init_x86(BWDIFContext *bwdif) +av_cold void ff_bwdif_init_x86(BWDIFContext *bwdif, int bit_depth) { - YADIFContext *yadif = &bwdif->yadif; int cpu_flags = av_get_cpu_flags(); - int bit_depth = (!yadif->csp) ? 8 : yadif->csp->comp[0].depth; if (bit_depth <= 8) { #if ARCH_X86_32 diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index b4284a8778..692265593c 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -58,6 +58,9 @@ * Info, Tracks, Chapters, Attachments, Tags (potentially twice) and Cues */ #define MAX_SEEKHEAD_ENTRIES 7 +/* Reserved size for H264 headers if not extant at init time */ +#define MAX_H264_HEADER_SIZE 1024 + #define IS_SEEKABLE(pb, mkv) (((pb)->seekable & AVIO_SEEKABLE_NORMAL) && \ !(mkv)->is_live) @@ -721,8 +724,12 @@ static int mkv_write_native_codecprivate(AVFormatContext *s, AVIOContext *pb, case AV_CODEC_ID_WAVPACK: return put_wv_codecpriv(dyn_cp, par); case AV_CODEC_ID_H264: - return ff_isom_write_avcc(dyn_cp, par->extradata, - par->extradata_size); + if (par->extradata_size) + return ff_isom_write_avcc(dyn_cp, par->extradata, + par->extradata_size); + else + put_ebml_void(pb, MAX_H264_HEADER_SIZE); + break; case AV_CODEC_ID_HEVC: return ff_isom_write_hvcc(dyn_cp, par->extradata, par->extradata_size, 0); @@ -2259,7 +2266,9 @@ static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt) break; // FIXME: Remove the following once libaom starts propagating extradata during init() // See https://bugs.chromium.org/p/aomedia/issues/detail?id=2012 + // H264 V4L2 has a similar issue case AV_CODEC_ID_AV1: + case AV_CODEC_ID_H264: if (side_data_size && mkv->track.bc && !par->extradata_size) { AVIOContext *dyn_cp; uint8_t *codecpriv; @@ -2267,7 +2276,10 @@ static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt) ret = avio_open_dyn_buf(&dyn_cp); if (ret < 0) return ret; - ff_isom_write_av1c(dyn_cp, side_data, side_data_size); + if (par->codec_id == AV_CODEC_ID_H264) + ff_isom_write_avcc(dyn_cp, side_data, side_data_size); + else + ff_isom_write_av1c(dyn_cp, side_data, side_data_size); codecpriv_size = avio_get_dyn_buf(dyn_cp, &codecpriv); if ((ret = dyn_cp->error) < 0 || !codecpriv_size && (ret = AVERROR_INVALIDDATA)) { @@ -2275,8 +2287,25 @@ static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt) return ret; } avio_seek(mkv->track.bc, track->codecpriv_offset, SEEK_SET); - // Do not write the OBUs as we don't have space saved for them - put_ebml_binary(mkv->track.bc, MATROSKA_ID_CODECPRIVATE, codecpriv, 4); + if (par->codec_id == AV_CODEC_ID_H264) { + int filler; + // Up to 6 bytes for header and the filler must be at least 2 + if (codecpriv_size > MAX_H264_HEADER_SIZE - 8) { + av_log(s, AV_LOG_ERROR, "H264 header size %d > %d bytes\n", codecpriv_size, MAX_H264_HEADER_SIZE - 8); + return AVERROR_INVALIDDATA; + } + put_ebml_binary(mkv->track.bc, MATROSKA_ID_CODECPRIVATE, codecpriv, codecpriv_size); + filler = MAX_H264_HEADER_SIZE - (avio_tell(mkv->track.bc) - track->codecpriv_offset); + if (filler < 2) { + av_log(s, AV_LOG_ERROR, "Unexpected SPS/PPS filler length: %d\n", filler); + return AVERROR_BUG; + } + put_ebml_void(mkv->track.bc, filler); + } + else { + // Do not write the OBUs as we don't have space saved for them + put_ebml_binary(mkv->track.bc, MATROSKA_ID_CODECPRIVATE, codecpriv, 4); + } ffio_free_dyn_buf(&dyn_cp); ret = ff_alloc_extradata(par, side_data_size); if (ret < 0) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 2cd5773dc5..0cbbc094de 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -5926,6 +5926,7 @@ static int mov_write_single_packet(AVFormatContext *s, AVPacket *pkt) if (trk->par->codec_id == AV_CODEC_ID_MP4ALS || trk->par->codec_id == AV_CODEC_ID_AAC || trk->par->codec_id == AV_CODEC_ID_AV1 || + trk->par->codec_id == AV_CODEC_ID_H264 || trk->par->codec_id == AV_CODEC_ID_FLAC) { buffer_size_t side_size; uint8_t *side = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size); diff --git a/libavformat/rtpenc.c b/libavformat/rtpenc.c index 38e4c65c4e..5e04c1df08 100644 --- a/libavformat/rtpenc.c +++ b/libavformat/rtpenc.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "avc.h" #include "avformat.h" #include "mpegts.h" #include "internal.h" @@ -582,8 +583,25 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt) ff_rtp_send_vc2hq(s1, pkt->data, size, st->codecpar->field_order != AV_FIELD_PROGRESSIVE ? 1 : 0); break; case AV_CODEC_ID_H264: + { + uint8_t *side_data; + int side_data_size = 0; + + side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, + &side_data_size); + + if (side_data_size != 0) { + int ps_size = side_data_size; + uint8_t * ps_buf = NULL; + + ff_avc_write_annexb_extradata(side_data, &ps_buf, &ps_size); + av_log(s1, AV_LOG_TRACE, "H264: write side data=%d\n", ps_size); + ff_rtp_send_h264_hevc(s1, ps_buf ? ps_buf : side_data, ps_size); + av_free(ps_buf); + } ff_rtp_send_h264_hevc(s1, pkt->data, size); break; + } case AV_CODEC_ID_H261: ff_rtp_send_h261(s1, pkt->data, size); break; diff --git a/libavformat/utils.c b/libavformat/utils.c index 75e5350a27..e10b493dae 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -3013,6 +3013,40 @@ static int has_codec_parameters(AVStream *st, const char **errmsg_ptr) return 1; } +#if CONFIG_HEVC_RPI_DECODER && CONFIG_HEVC_DECODER +// This should be quite general purpose but avoid possible conflicts +// by limiting usage to cases wehere we know it works. +static int try_fallback_decoder(AVCodecContext * const avctx, const AVCodec *const old_codec, AVDictionary ** const opts) +{ + // Only try fallback if we know it is supported (HEVC only) + const AVCodec *const new_codec = old_codec->id != AV_CODEC_ID_HEVC ? NULL : + avcodec_find_decoder_by_id_and_fmt(old_codec->id, AV_PIX_FMT_NONE); + int err; + + // Failed to find fallback or we are already at the fallback + if (new_codec == NULL || new_codec == old_codec) + { + return AVERROR_DECODER_NOT_FOUND; + } + + // * This may be dodgy - header says to not use this fn, + // especially if we are going to reopen the context... + // (but it does seem to work for our cases) + if (avcodec_is_open(avctx)) { + avcodec_close(avctx); + } + + if ((err = avcodec_open2(avctx, new_codec, opts)) < 0) + { + return err; + } + + return 0; +} +#else +#define try_fallback_decoder(avctx, old_codec, opts) (AVERROR_DECODER_NOT_FOUND) +#endif + /* returns 1 or 0 if or if not decoded data was returned, or a negative error */ static int try_decode_frame(AVFormatContext *s, AVStream *st, const AVPacket *avpkt, AVDictionary **options) @@ -3051,7 +3085,11 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, av_dict_set(options ? options : &thread_opt, "lowres", "0", 0); if (s->codec_whitelist) av_dict_set(options ? options : &thread_opt, "codec_whitelist", s->codec_whitelist, 0); - ret = avcodec_open2(avctx, codec, options ? options : &thread_opt); + if ((ret = avcodec_open2(avctx, codec, options ? options : &thread_opt)) == AVERROR_DECODER_NOT_FOUND) + { + // Try fallback if if looks worth a try + ret = try_fallback_decoder(avctx, codec, options ? options : &thread_opt); + } if (!options) av_dict_free(&thread_opt); if (ret < 0) { @@ -3082,6 +3120,14 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, if (avctx->codec_type == AVMEDIA_TYPE_VIDEO || avctx->codec_type == AVMEDIA_TYPE_AUDIO) { ret = avcodec_send_packet(avctx, &pkt); + + // If we are going to want to fall back we should know here + if (ret == AVERROR_DECODER_NOT_FOUND) { + if ((ret = try_fallback_decoder(avctx, avctx->codec, options)) < 0) + break; + continue; + } + if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) break; if (ret >= 0) @@ -3710,9 +3756,20 @@ FF_ENABLE_DEPRECATION_WARNINGS // Try to just open decoders, in case this is enough to get parameters. if (!has_codec_parameters(st, NULL) && st->internal->request_probe <= 0) { if (codec && !avctx->codec) - if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0) - av_log(ic, AV_LOG_WARNING, - "Failed to open codec in %s\n",__FUNCTION__); + { + int err; + + if ((err = avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt)) < 0) + { + if (err == AVERROR_DECODER_NOT_FOUND) { + err = try_fallback_decoder(avctx, codec, options ? &options[i] : &thread_opt); + } + if (err < 0) { + av_log(ic, AV_LOG_WARNING, + "Failed to open codec in %s\n",__FUNCTION__); + } + } + } } if (!options) av_dict_free(&thread_opt); diff --git a/libavutil/Makefile b/libavutil/Makefile index 27bafe9e12..c9075ddf8a 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -68,6 +68,7 @@ HEADERS = adler32.h \ rational.h \ replaygain.h \ ripemd.h \ + rpi_sand_fns.h \ samplefmt.h \ sha.h \ sha512.h \ @@ -87,6 +88,7 @@ HEADERS = adler32.h \ film_grain_params.h \ HEADERS-$(CONFIG_LZO) += lzo.h +HEADERS-$(CONFIG-RPI) += rpi_sand_fn_pw.h ARCH_HEADERS = bswap.h \ intmath.h \ @@ -182,6 +184,7 @@ OBJS-$(CONFIG_LZO) += lzo.o OBJS-$(CONFIG_MEDIACODEC) += hwcontext_mediacodec.o OBJS-$(CONFIG_OPENCL) += hwcontext_opencl.o OBJS-$(CONFIG_QSV) += hwcontext_qsv.o +OBJS-$(CONFIG_SAND) += rpi_sand_fns.o OBJS-$(CONFIG_VAAPI) += hwcontext_vaapi.o OBJS-$(CONFIG_VIDEOTOOLBOX) += hwcontext_videotoolbox.o OBJS-$(CONFIG_VDPAU) += hwcontext_vdpau.o diff --git a/libavutil/aarch64/Makefile b/libavutil/aarch64/Makefile index 5613813ba8..ab8bcfcf34 100644 --- a/libavutil/aarch64/Makefile +++ b/libavutil/aarch64/Makefile @@ -1,4 +1,6 @@ OBJS += aarch64/cpu.o \ aarch64/float_dsp_init.o \ -NEON-OBJS += aarch64/float_dsp_neon.o +NEON-OBJS += aarch64/float_dsp_neon.o \ + aarch64/rpi_sand_neon.o \ + diff --git a/libavutil/aarch64/rpi_sand_neon.S b/libavutil/aarch64/rpi_sand_neon.S new file mode 100644 index 0000000000..11658de0c8 --- /dev/null +++ b/libavutil/aarch64/rpi_sand_neon.S @@ -0,0 +1,672 @@ +/* +Copyright (c) 2021 Michael Eiler + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: Michael Eiler +*/ + +#include "asm.S" + +// void ff_rpi_sand8_lines_to_planar_y8( +// uint8_t * dest, : x0 +// unsigned int dst_stride, : w1 +// const uint8_t * src, : x2 +// unsigned int src_stride1, : w3, always 128 +// unsigned int src_stride2, : w4 +// unsigned int _x, : w5 +// unsigned int y, : w6 +// unsigned int _w, : w7 +// unsigned int h); : [sp, #0] + +function ff_rpi_sand8_lines_to_planar_y8, export=1 + // w15 contains the number of rows we need to process + ldr w15, [sp, #0] + + // w8 will contain the number of blocks per row + // w8 = floor(_w/stride1) + // stride1 is assumed to always be 128 + mov w8, w1 + lsr w8, w8, #7 + + // in case the width of the image is not a multiple of 128, there will + // be an incomplete block at the end of every row + // w9 contains the number of pixels stored within this block + // w9 = _w - w8 * 128 + lsl w9, w8, #7 + sub w9, w7, w9 + + // this is the value we have to add to the src pointer after reading a complete block + // it will move the address to the start of the next block + // w10 = stride2 * stride1 - stride1 + mov w10, w4 + lsl w10, w10, #7 + sub w10, w10, #128 + + // w11 is the row offset, meaning the start offset of the first block of every collumn + // this will be increased with stride1 within every iteration of the row_loop + eor w11, w11, w11 + + // w12 = 0, processed row count + eor w12, w12, w12 +row_loop: + // start of the first block within the current row + // x13 = row offset + src + mov x13, x2 + add x13, x13, x11 + + // w14 = 0, processed block count + eor w14, w14, w14 + + cmp w8, #0 + beq no_main_y8 + +block_loop: + // copy 128 bytes (a full block) into the vector registers v0-v7 and increase the src address by 128 + // fortunately these aren't callee saved ones, meaning we don't need to backup them + ld1 { v0.16b, v1.16b, v2.16b, v3.16b}, [x13], #64 + ld1 { v4.16b, v5.16b, v6.16b, v7.16b}, [x13], #64 + + // write these registers back to the destination vector and increase the dst address by 128 + st1 { v0.16b, v1.16b, v2.16b, v3.16b }, [x0], #64 + st1 { v4.16b, v5.16b, v6.16b, v7.16b }, [x0], #64 + + // move the source register to the beginning of the next block (x13 = src + block offset) + add x13, x13, x10 + // increase the block counter + add w14, w14, #1 + + // continue with the block_loop if we haven't copied all full blocks yet + cmp w8, w14 + bgt block_loop + + // handle the last block at the end of each row + // at most 127 byte values copied from src to dst +no_main_y8: + eor w5, w5, w5 // i = 0 +incomplete_block_loop_y8: + cmp w5, w9 + bge incomplete_block_loop_end_y8 + + ldrb w6, [x13] + strb w6, [x0] + add x13, x13, #1 + add x0, x0, #1 + + add w5, w5, #1 + b incomplete_block_loop_y8 +incomplete_block_loop_end_y8: + + + // increase the row offset by 128 (stride1) + add w11, w11, #128 + // increment the row counter + add w12, w12, #1 + + // process the next row if we haven't finished yet + cmp w15, w12 + bgt row_loop + + ret +endfunc + + + +// void ff_rpi_sand8_lines_to_planar_c8( +// uint8_t * dst_u, : x0 +// unsigned int dst_stride_u, : w1 == width +// uint8_t * dst_v, : x2 +// unsigned int dst_stride_v, : w3 == width +// const uint8_t * src, : x4 +// unsigned int stride1, : w5 == 128 +// unsigned int stride2, : w6 +// unsigned int _x, : w7 +// unsigned int y, : [sp, #0] +// unsigned int _w, : [sp, #8] +// unsigned int h); : [sp, #16] + +function ff_rpi_sand8_lines_to_planar_c8, export=1 + // w7 = width + ldr w7, [sp, #8] + + // w15 contains the number of rows we need to process + // counts down + ldr w15, [sp, #16] + + // number of full blocks, w8 = _w / (stride1 >> 1) == _w / 64 == _w >> 6 + mov w8, w7 + lsr w8, w8, #6 + + // number of pixels in block at the end of every row + // w9 = _w - (w8 * 64) + lsl w9, w8, #6 + sub w9, w7, w9 + + // Skip at the end of the line to account for stride + sub w12, w1, w7 + + // address delta to the beginning of the next block + // w10 = (stride2 * stride1 - stride1) = stride2 * 128 - 128 + lsl w10, w6, #7 + sub w10, w10, #128 + + // w11 = row address start offset = 0 + eor w11, w11, w11 + +row_loop_c8: + // start of the first block within the current row + // x13 = row offset + src + mov x13, x4 + add x13, x13, x11 + + // w14 = 0, processed block count + eor w14, w14, w14 + + cmp w8, #0 + beq no_main_c8 + +block_loop_c8: + // load the full block -> 128 bytes, the block contains 64 interleaved U and V values + ld2 { v0.16b, v1.16b }, [x13], #32 + ld2 { v2.16b, v3.16b }, [x13], #32 + ld2 { v4.16b, v5.16b }, [x13], #32 + ld2 { v6.16b, v7.16b }, [x13], #32 + + // swap register so that we can write them out with a single instruction + mov v16.16b, v1.16b + mov v17.16b, v3.16b + mov v18.16b, v5.16b + mov v1.16b, v2.16b + mov v2.16b, v4.16b + mov v3.16b, v6.16b + mov v4.16b, v16.16b + mov v5.16b, v17.16b + mov v6.16b, v18.16b + + st1 { v0.16b, v1.16b, v2.16b, v3.16b }, [x0], #64 + st1 { v4.16b, v5.16b, v6.16b, v7.16b }, [x2], #64 + + // increment row counter and move src to the beginning of the next block + add w14, w14, #1 + add x13, x13, x10 + + // jump to block_loop_c8 iff the block count is smaller than the number of full blocks + cmp w8, w14 + bgt block_loop_c8 + +no_main_c8: + // handle incomplete block at the end of every row + eor w5, w5, w5 // point counter, this might be +incomplete_block_loop_c8: + cmp w5, w9 + bge incomplete_block_loop_end_c8 + + ldrb w1, [x13] + strb w1, [x0] + add x13, x13, #1 + + ldrb w1, [x13] + strb w1, [x2] + add x13, x13, #1 + + add x0, x0, #1 + add x2, x2, #1 + + add w5, w5, #1 + b incomplete_block_loop_c8 +incomplete_block_loop_end_c8: + + // increase row_offset by stride1 + add w11, w11, #128 + add x0, x0, w12, sxtw + add x2, x2, w12, sxtw + + // jump to row_Loop_c8 iff the row count is small than the height + subs w15, w15, #1 + bgt row_loop_c8 + + ret +endfunc + +// Unzip chroma +// +// On entry: +// a0 = V0, U2, ... +// a1 = U0, V1, ... +// a2 = U1, V2, ... +// b0 = V8, U10, ... +// b1 = U8, V9, ... +// b2 = U9, V10, ... +// +// On exit: +// d0 = U0, U3, ... +// ... +// a0 = V0, V3, .. +// ... +// +// Reg order for USAND is a1, a0, a2 (i.e. swap natural order of 1st 2 dest regs) + +.macro UZPH_C d0, d1, d2, a0, a1, a2, b0, b1, b2 + uzp1 \d0\().8h, \a1\().8h, \b1\().8h + uzp1 \d1\().8h, \a2\().8h, \b2\().8h + uzp2 \d2\().8h, \a0\().8h, \b0\().8h + + uzp1 \a0\().8h, \a0\().8h, \b0\().8h + uzp2 \a1\().8h, \a1\().8h, \b1\().8h + uzp2 \a2\().8h, \a2\().8h, \b2\().8h +.endm + +// SAND30 -> 10bit +.macro USAND10 d0, d1, d2, a0, a1 + shrn \d2\().4h, \a0\().4s, #14 + shrn \d1\().4h, \a0\().4s, #10 + + shrn2 \d2\().8h, \a1\().4s, #14 + shrn2 \d1\().8h, \a1\().4s, #10 + uzp1 \d0\().8h, \a0\().8h, \a1\().8h + + ushr \d2\().8h, \d2\().8h, #6 + bic \d0\().8h, #0xfc, lsl #8 + bic \d1\().8h, #0xfc, lsl #8 +.endm + +// SAND30 -> 8bit +.macro USAND8 d0, d1, d2, a0, a1, a2, a3, t0, t1, t2 + shrn \d1\().4h, \a0\().4s, #12 + shrn2 \d1\().8h, \a1\().4s, #12 + uzp1 \d0\().8h, \a0\().8h, \a1\().8h + uzp2 \d2\().8h, \a0\().8h, \a1\().8h + + shrn \t1\().4h, \a2\().4s, #12 + shrn2 \t1\().8h, \a3\().4s, #12 + uzp1 \t0\().8h, \a2\().8h, \a3\().8h + uzp2 \t2\().8h, \a2\().8h, \a3\().8h + + shrn \d0\().8b, \d0\().8h, #2 + shrn2 \d0\().16b, \t0\().8h, #2 + shrn \d2\().8b, \d2\().8h, #6 + shrn2 \d2\().16b, \t2\().8h, #6 + uzp1 \d1\().16b, \d1\().16b, \t1\().16b +.endm + + +// void ff_rpi_sand30_lines_to_planar_c16( +// uint8_t * dst_u, // [x0] +// unsigned int dst_stride_u, // [w1] +// uint8_t * dst_v, // [x2] +// unsigned int dst_stride_v, // [w3] +// const uint8_t * src, // [x4] +// unsigned int stride1, // [w5] 128 +// unsigned int stride2, // [w6] +// unsigned int _x, // [w7] 0 +// unsigned int y, // [sp, #0] +// unsigned int _w, // [sp, #8] w9 +// unsigned int h); // [sp, #16] w10 + +function ff_rpi_sand30_lines_to_planar_c16, export=1 + ldr w7, [sp, #0] // y + ldr w8, [sp, #8] // _w + ldr w10, [sp, #16] // h + lsl w6, w6, #7 // Fixup stride2 + sub w6, w6, #64 + uxtw x6, w6 + sub w1, w1, w8, LSL #1 // Fixup chroma strides + sub w3, w3, w8, LSL #1 + lsl w7, w7, #7 // Add y to src + add x4, x4, w7, UXTW +10: + mov w13, #0 + mov x5, x4 + mov w9, w8 +1: + ld1 {v0.4s-v3.4s}, [x5], #64 + ld1 {v4.4s-v7.4s}, [x5], x6 + subs w9, w9, #48 + + USAND10 v17, v16, v18, v0, v1 + USAND10 v20, v19, v21, v2, v3 + UZPH_C v0, v1, v2, v16, v17, v18, v19, v20, v21 + USAND10 v23, v22, v24, v4, v5 + USAND10 v26, v25, v27, v6, v7 + UZPH_C v4, v5, v6, v22, v23, v24, v25, v26, v27 + + blt 2f + + st3 {v0.8h-v2.8h}, [x0], #48 + st3 {v4.8h-v6.8h}, [x0], #48 + st3 {v16.8h-v18.8h}, [x2], #48 + st3 {v22.8h-v24.8h}, [x2], #48 + + bne 1b +11: + subs w10, w10, #1 + add x4, x4, #128 + add x0, x0, w1, UXTW + add x2, x2, w3, UXTW + bne 10b +99: + ret + +// Partial final write +2: + cmp w9, #24-48 + blt 1f + st3 {v0.8h - v2.8h}, [x0], #48 + st3 {v16.8h - v18.8h}, [x2], #48 + beq 11b + mov v0.16b, v4.16b + mov v1.16b, v5.16b + sub w9, w9, #24 + mov v2.16b, v6.16b + mov v16.16b, v22.16b + mov v17.16b, v23.16b + mov v18.16b, v24.16b +1: + cmp w9, #12-48 + blt 1f + st3 {v0.4h - v2.4h}, [x0], #24 + st3 {v16.4h - v18.4h}, [x2], #24 + beq 11b + mov v0.2d[0], v0.2d[1] + sub w9, w9, #12 + mov v1.2d[0], v1.2d[1] + mov v2.2d[0], v2.2d[1] + mov v16.2d[0], v16.2d[1] + mov v17.2d[0], v17.2d[1] + mov v18.2d[0], v18.2d[1] +1: + cmp w9, #6-48 + blt 1f + st3 {v0.h - v2.h}[0], [x0], #6 + st3 {v0.h - v2.h}[1], [x0], #6 + st3 {v16.h - v18.h}[0], [x2], #6 + st3 {v16.h - v18.h}[1], [x2], #6 + beq 11b + mov v0.s[0], v0.s[1] + sub w9, w9, #6 + mov v1.s[0], v1.s[1] + mov v2.s[0], v2.s[1] + mov v16.s[0], v16.s[1] + mov v17.s[0], v17.s[1] + mov v18.s[0], v18.s[1] +1: + cmp w9, #3-48 + blt 1f + st3 {v0.h - v2.h}[0], [x0], #6 + st3 {v16.h - v18.h}[0], [x2], #6 + beq 11b + mov v0.h[0], v0.h[1] + sub w9, w9, #3 + mov v1.h[0], v1.h[1] + mov v16.h[0], v16.h[1] + mov v17.h[0], v17.h[1] +1: + cmp w9, #2-48 + blt 1f + st2 {v0.h - v1.h}[0], [x0], #4 + st2 {v16.h - v17.h}[0], [x2], #4 + b 11b +1: + st1 {v0.h}[0], [x0], #2 + st1 {v16.h}[0], [x2], #2 + b 11b +endfunc + + +//void ff_rpi_sand30_lines_to_planar_p010( +// uint8_t * dest, +// unsigned int dst_stride, +// const uint8_t * src, +// unsigned int src_stride1, +// unsigned int src_stride2, +// unsigned int _x, +// unsigned int y, +// unsigned int _w, +// unsigned int h); + +// void ff_rpi_sand30_lines_to_planar_y8( +// uint8_t * dest, : x0 +// unsigned int dst_stride, : w1 +// const uint8_t * src, : x2 +// unsigned int src_stride1, : w3, always 128 +// unsigned int src_stride2, : w4 +// unsigned int _x, : w5 +// unsigned int y, : w6 +// unsigned int _w, : w7 +// unsigned int h); : [sp, #0] +// +// Assumes that we are starting on a stripe boundary and that overreading +// within the stripe is OK. However it does respect the dest size for wri + +function ff_rpi_sand30_lines_to_planar_y16, export=1 + lsl w4, w4, #7 + sub w4, w4, #64 + uxtw x4, w4 + sub w1, w1, w7, lsl #1 + uxtw x6, w6 + add x8, x2, x6, lsl #7 + ldr w6, [sp, #0] + +10: + mov x2, x8 + mov w5, w7 +1: + ld1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x2], #64 + ld1 {v4.4s, v5.4s, v6.4s, v7.4s}, [x2], x4 + + subs w5, w5, #96 + + USAND10 v16, v17, v18, v0, v1 + USAND10 v19, v20, v21, v2, v3 + USAND10 v22, v23, v24, v4, v5 + USAND10 v25, v26, v27, v6, v7 + + blt 2f + + st3 {v16.8h, v17.8h, v18.8h}, [x0], #48 + st3 {v19.8h, v20.8h, v21.8h}, [x0], #48 + st3 {v22.8h, v23.8h, v24.8h}, [x0], #48 + st3 {v25.8h, v26.8h, v27.8h}, [x0], #48 + + bne 1b + +11: + subs w6, w6, #1 + add x0, x0, w1, uxtw + add x8, x8, #128 + bne 10b + + ret + +// Partial final write +2: + cmp w5, #48-96 + blt 1f + st3 {v16.8h, v17.8h, v18.8h}, [x0], #48 + st3 {v19.8h, v20.8h, v21.8h}, [x0], #48 + beq 11b + mov v16.16b, v22.16b + mov v17.16b, v23.16b + sub w5, w5, #48 + mov v18.16b, v24.16b + mov v19.16b, v25.16b + mov v20.16b, v26.16b + mov v21.16b, v27.16b +1: + cmp w5, #24-96 + blt 1f + st3 {v16.8h, v17.8h, v18.8h}, [x0], #48 + beq 11b + mov v16.16b, v19.16b + mov v17.16b, v20.16b + sub w5, w5, #24 + mov v18.16b, v21.16b +1: + cmp w5, #12-96 + blt 1f + st3 {v16.4h, v17.4h, v18.4h}, [x0], #24 + beq 11b + mov v16.2d[0], v16.2d[1] + sub w5, w5, #12 + mov v17.2d[0], v17.2d[1] + mov v18.2d[0], v18.2d[1] +1: + cmp w5, #6-96 + blt 1f + st3 {v16.h, v17.h, v18.h}[0], [x0], #6 + st3 {v16.h, v17.h, v18.h}[1], [x0], #6 + beq 11b + mov v16.2s[0], v16.2s[1] + sub w5, w5, #6 + mov v17.2s[0], v17.2s[1] + mov v18.2s[0], v18.2s[1] +1: + cmp w5, #3-96 + blt 1f + st3 {v16.h, v17.h, v18.h}[0], [x0], #6 + beq 11b + mov v16.4h[0], v16.4h[1] + sub w5, w5, #3 + mov v17.4h[0], v17.4h[1] +1: + cmp w5, #2-96 + blt 1f + st2 {v16.h, v17.h}[0], [x0], #4 + b 11b +1: + st1 {v16.h}[0], [x0], #2 + b 11b + +endfunc + +// void ff_rpi_sand30_lines_to_planar_y8( +// uint8_t * dest, : x0 +// unsigned int dst_stride, : w1 +// const uint8_t * src, : x2 +// unsigned int src_stride1, : w3, always 128 +// unsigned int src_stride2, : w4 +// unsigned int _x, : w5 +// unsigned int y, : w6 +// unsigned int _w, : w7 +// unsigned int h); : [sp, #0] +// +// Assumes that we are starting on a stripe boundary and that overreading +// within the stripe is OK. However it does respect the dest size for wri + +function ff_rpi_sand30_lines_to_planar_y8, export=1 + lsl w4, w4, #7 + sub w4, w4, #64 + uxtw x4, w4 + sub w1, w1, w7 + uxtw x6, w6 + add x8, x2, x6, lsl #7 + ldr w6, [sp, #0] + +10: + mov x2, x8 + mov w5, w7 +1: + ld1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x2], #64 + ld1 {v4.4s, v5.4s, v6.4s, v7.4s}, [x2], x4 + + subs w5, w5, #96 + + // v0, v1 + USAND8 v16, v17, v18, v0, v1, v2, v3, v22, v23, v24 + USAND8 v19, v20, v21, v4, v5, v6, v7, v22, v23, v24 + + blt 2f + + st3 {v16.16b, v17.16b, v18.16b}, [x0], #48 + st3 {v19.16b, v20.16b, v21.16b}, [x0], #48 + + bne 1b + +11: + subs w6, w6, #1 + add x0, x0, w1, uxtw + add x8, x8, #128 + bne 10b + + ret + +// Partial final write +2: + cmp w5, #48-96 + blt 1f + st3 {v16.16b, v17.16b, v18.16b}, [x0], #48 + beq 11b + mov v16.16b, v22.16b + mov v17.16b, v23.16b + sub w5, w5, #48 + mov v18.16b, v24.16b +1: + cmp w5, #24-96 + blt 1f + st3 {v16.8b, v17.8b, v18.8b}, [x0], #24 + beq 11b + mov v16.2d[0], v16.2d[1] + sub w5, w5, #24 + mov v17.2d[0], v17.2d[1] + mov v18.2d[0], v18.2d[1] +1: + cmp w5, #12-96 + blt 1f + st3 {v16.b, v17.b, v18.b}[0], [x0], #3 + st3 {v16.b, v17.b, v18.b}[1], [x0], #3 + st3 {v16.b, v17.b, v18.b}[2], [x0], #3 + st3 {v16.b, v17.b, v18.b}[3], [x0], #3 + beq 11b + mov v16.2s[0], v16.2s[1] + sub w5, w5, #12 + mov v17.2s[0], v17.2s[1] + mov v18.2s[0], v18.2s[1] +1: + cmp w5, #6-96 + blt 1f + st3 {v16.b, v17.b, v18.b}[0], [x0], #3 + st3 {v16.b, v17.b, v18.b}[1], [x0], #3 + beq 11b + mov v16.4h[0], v16.4h[1] + sub w5, w5, #6 + mov v17.4h[0], v17.4h[1] + mov v18.4h[0], v18.4h[1] +1: + cmp w5, #3-96 + blt 1f + st3 {v16.b, v17.b, v18.b}[0], [x0], #3 + beq 11b + mov v16.8b[0], v16.8b[1] + sub w5, w5, #3 + mov v17.8b[0], v17.8b[1] +1: + cmp w5, #2-96 + blt 1f + st2 {v16.b, v17.b}[0], [x0], #2 + b 11b +1: + st1 {v16.b}[0], [x0], #1 + b 11b + +endfunc + diff --git a/libavutil/aarch64/rpi_sand_neon.h b/libavutil/aarch64/rpi_sand_neon.h new file mode 100644 index 0000000000..2a56135bc3 --- /dev/null +++ b/libavutil/aarch64/rpi_sand_neon.h @@ -0,0 +1,59 @@ +/* +Copyright (c) 2021 Michael Eiler + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: Michael Eiler +*/ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +void ff_rpi_sand8_lines_to_planar_y8(uint8_t * dest, unsigned int dst_stride, + const uint8_t * src, unsigned int src_stride1, unsigned int src_stride2, + unsigned int _x, unsigned int y, unsigned int _w, unsigned int h); + +void ff_rpi_sand8_lines_to_planar_c8(uint8_t * dst_u, unsigned int dst_stride_u, + uint8_t * dst_v, unsigned int dst_stride_v, const uint8_t * src, + unsigned int stride1, unsigned int stride2, unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h); + +void ff_rpi_sand30_lines_to_planar_y16(uint8_t * dest, unsigned int dst_stride, + const uint8_t * src, unsigned int src_stride1, unsigned int src_stride2, + unsigned int _x, unsigned int y, unsigned int _w, unsigned int h); + +void ff_rpi_sand30_lines_to_planar_c16(uint8_t * dst_u, unsigned int dst_stride_u, + uint8_t * dst_v, unsigned int dst_stride_v, const uint8_t * src, unsigned int stride1, + unsigned int stride2, unsigned int _x, unsigned int y, unsigned int _w, unsigned int h); + +void ff_rpi_sand30_lines_to_planar_y8(uint8_t * dest, unsigned int dst_stride, + const uint8_t * src, unsigned int src_stride1, unsigned int src_stride2, + unsigned int _x, unsigned int y, unsigned int _w, unsigned int h); + +#ifdef __cplusplus +} +#endif + diff --git a/libavutil/arm/Makefile b/libavutil/arm/Makefile index 5da44b0542..b74b7c4e2f 100644 --- a/libavutil/arm/Makefile +++ b/libavutil/arm/Makefile @@ -6,3 +6,4 @@ VFP-OBJS += arm/float_dsp_init_vfp.o \ NEON-OBJS += arm/float_dsp_init_neon.o \ arm/float_dsp_neon.o \ + arm/rpi_sand_neon.o \ diff --git a/libavutil/arm/rpi_sand_neon.S b/libavutil/arm/rpi_sand_neon.S new file mode 100644 index 0000000000..60e697f681 --- /dev/null +++ b/libavutil/arm/rpi_sand_neon.S @@ -0,0 +1,925 @@ +/* +Copyright (c) 2018 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox +*/ + +#include "libavutil/arm/asm.S" + + +@ General notes: +@ Having done some timing on this in sand8->y8 (Pi4) +@ vst1 (680fps) is a bit faster than vstm (660fps) +@ vldm (680fps) is noticably faster than vld1 (480fps) +@ (or it might be that a mix is what is required) +@ +@ At least on a Pi4 it is no more expensive to have a single auto-inc register +@ for dest address than it is to have 2 used alternately (On Pi3 Ben asserted +@ the latter was better) +@ +@ vstm will bus error on unaligned access (so will vldm), vst1 is safe unless +@ the memory is uncached. +@ As these are Sand -> planar we can assume that src is going to be aligned but +@ it is possible that dest isn't (converting to .yuv or other packed format). +@ Luckily vst1 is faster than vstm :-) so all is well +@ vst1 has alignment requirements of el size so maybe splitting vst1.32 into 4 +@ .8 stores would let us do non-word aligned stores into uncached but it +@ probably isn't worth it. + + + + +@ void ff_rpi_sand128b_stripe_to_8_10( +@ uint8_t * dest, // [r0] +@ const uint8_t * src1, // [r1] +@ const uint8_t * src2, // [r2] +@ unsigned int lines); // [r3] + +.macro stripe2_to_8, bit_depth + vpush {q4-q7} +1: + vldm r1!, {q0-q7} + subs r3, #1 + vldm r2!, {q8-q15} + vqrshrn.u16 d0, q0, #\bit_depth - 8 + vqrshrn.u16 d1, q1, #\bit_depth - 8 + vqrshrn.u16 d2, q2, #\bit_depth - 8 + vqrshrn.u16 d3, q3, #\bit_depth - 8 + vqrshrn.u16 d4, q4, #\bit_depth - 8 + vqrshrn.u16 d5, q5, #\bit_depth - 8 + vqrshrn.u16 d6, q6, #\bit_depth - 8 + vqrshrn.u16 d7, q7, #\bit_depth - 8 + vqrshrn.u16 d8, q8, #\bit_depth - 8 + vqrshrn.u16 d9, q9, #\bit_depth - 8 + vqrshrn.u16 d10, q10, #\bit_depth - 8 + vqrshrn.u16 d11, q11, #\bit_depth - 8 + vqrshrn.u16 d12, q12, #\bit_depth - 8 + vqrshrn.u16 d13, q13, #\bit_depth - 8 + vqrshrn.u16 d14, q14, #\bit_depth - 8 + vqrshrn.u16 d15, q15, #\bit_depth - 8 + vstm r0!, {q0-q7} + bne 1b + vpop {q4-q7} + bx lr +.endm + +function ff_rpi_sand128b_stripe_to_8_10, export=1 + stripe2_to_8 10 +endfunc + +@ void ff_rpi_sand8_lines_to_planar_y8( +@ uint8_t * dest, // [r0] +@ unsigned int dst_stride, // [r1] +@ const uint8_t * src, // [r2] +@ unsigned int src_stride1, // [r3] Ignored - assumed 128 +@ unsigned int src_stride2, // [sp, #0] -> r3 +@ unsigned int _x, // [sp, #4] Ignored - 0 +@ unsigned int y, // [sp, #8] (r7 in prefix) +@ unsigned int _w, // [sp, #12] -> r6 (cur r5) +@ unsigned int h); // [sp, #16] -> r7 +@ +@ Assumes that we are starting on a stripe boundary and that overreading +@ within the stripe is OK. However it does respect the dest size for writing + +function ff_rpi_sand8_lines_to_planar_y8, export=1 + push {r4-r8, lr} @ +24 L + ldr r3, [sp, #24] + ldr r6, [sp, #36] + ldr r7, [sp, #32] @ y + lsl r3, #7 + sub r1, r6 + add r8, r2, r7, lsl #7 + ldr r7, [sp, #40] + +10: + mov r2, r8 + add r4, r0, #24 + mov r5, r6 + mov lr, #0 +1: + vldm r2, {q8-q15} + add r2, r3 + subs r5, #128 + blt 2f + vst1.8 {d16, d17, d18, d19}, [r0]! + vst1.8 {d20, d21, d22, d23}, [r0]! + vst1.8 {d24, d25, d26, d27}, [r0]! + vst1.8 {d28, d29, d30, d31}, [r0]! + bne 1b +11: + subs r7, #1 + add r0, r1 + add r8, #128 + bne 10b + + pop {r4-r8, pc} + +@ Partial final write +2: + cmp r5, #64-128 + blt 1f + vst1.8 {d16, d17, d18, d19}, [r0]! + vst1.8 {d20, d21, d22, d23}, [r0]! + beq 11b + vmov q8, q12 + vmov q9, q13 + sub r5, #64 + vmov q10, q14 + vmov q11, q15 +1: + cmp r5, #32-128 + blt 1f + vst1.8 {d16, d17, d18, d19}, [r0]! + beq 11b + vmov q8, q10 + sub r5, #32 + vmov q9, q11 +1: + cmp r5, #16-128 + blt 1f + vst1.8 {d16, d17}, [r0]! + beq 11b + sub r5, #16 + vmov q8, q9 +1: + cmp r5, #8-128 + blt 1f + vst1.8 {d16}, [r0]! + beq 11b + sub r5, #8 + vmov d16, d17 +1: + cmp r5, #4-128 + blt 1f + vst1.32 {d16[0]}, [r0]! + beq 11b + sub r5, #4 + vshr.u64 d16, #32 +1: + cmp r5, #2-128 + blt 1f + vst1.16 {d16[0]}, [r0]! + beq 11b + vst1.8 {d16[2]}, [r0]! + b 11b +1: + vst1.8 {d16[0]}, [r0]! + b 11b +endfunc + +@ void ff_rpi_sand8_lines_to_planar_c8( +@ uint8_t * dst_u, // [r0] +@ unsigned int dst_stride_u, // [r1] +@ uint8_t * dst_v, // [r2] +@ unsigned int dst_stride_v, // [r3] +@ const uint8_t * src, // [sp, #0] -> r4, r5 +@ unsigned int stride1, // [sp, #4] 128 +@ unsigned int stride2, // [sp, #8] -> r8 +@ unsigned int _x, // [sp, #12] 0 +@ unsigned int y, // [sp, #16] (r7 in prefix) +@ unsigned int _w, // [sp, #20] -> r12, r6 +@ unsigned int h); // [sp, #24] -> r7 +@ +@ Assumes that we are starting on a stripe boundary and that overreading +@ within the stripe is OK. However it does respect the dest size for writing + +function ff_rpi_sand8_lines_to_planar_c8, export=1 + push {r4-r8, lr} @ +24 + + ldr r5, [sp, #24] + ldr r8, [sp, #32] + ldr r7, [sp, #40] + ldr r6, [sp, #44] + lsl r8, #7 + add r5, r5, r7, lsl #7 + sub r1, r1, r6 + sub r3, r3, r6 + ldr r7, [sp, #48] + vpush {q4-q7} + +10: + mov r4, r5 + mov r12, r6 +1: + subs r12, #64 + vldm r4, {q0-q7} + add r4, r8 + it gt + vldmgt r4, {q8-q15} + add r4, r8 + + vuzp.8 q0, q1 + vuzp.8 q2, q3 + vuzp.8 q4, q5 + vuzp.8 q6, q7 + + vuzp.8 q8, q9 + vuzp.8 q10, q11 + vuzp.8 q12, q13 + vuzp.8 q14, q15 + subs r12, #64 + + @ Rearrange regs so we can use vst1 with 4 regs + vswp q1, q2 + vswp q5, q6 + vswp q9, q10 + vswp q13, q14 + blt 2f + + vst1.8 {d0, d1, d2, d3 }, [r0]! + vst1.8 {d8, d9, d10, d11}, [r0]! + vst1.8 {d16, d17, d18, d19}, [r0]! + vst1.8 {d24, d25, d26, d27}, [r0]! + + vst1.8 {d4, d5, d6, d7 }, [r2]! + vst1.8 {d12, d13, d14, d15}, [r2]! + vst1.8 {d20, d21, d22, d23}, [r2]! + vst1.8 {d28, d29, d30, d31}, [r2]! + bne 1b +11: + subs r7, #1 + add r5, #128 + add r0, r1 + add r2, r3 + bne 10b + vpop {q4-q7} + pop {r4-r8,pc} + +2: + cmp r12, #64-128 + blt 1f + vst1.8 {d0, d1, d2, d3 }, [r0]! + vst1.8 {d8, d9, d10, d11}, [r0]! + vst1.8 {d4, d5, d6, d7 }, [r2]! + vst1.8 {d12, d13, d14, d15}, [r2]! + beq 11b + sub r12, #64 + vmov q0, q8 + vmov q1, q9 + vmov q2, q10 + vmov q3, q11 + vmov q4, q12 + vmov q5, q13 + vmov q6, q14 + vmov q7, q15 +1: + cmp r12, #32-128 + blt 1f + vst1.8 {d0, d1, d2, d3 }, [r0]! + vst1.8 {d4, d5, d6, d7 }, [r2]! + beq 11b + sub r12, #32 + vmov q0, q4 + vmov q1, q5 + vmov q2, q6 + vmov q3, q7 +1: + cmp r12, #16-128 + blt 1f + vst1.8 {d0, d1 }, [r0]! + vst1.8 {d4, d5 }, [r2]! + beq 11b + sub r12, #16 + vmov q0, q1 + vmov q2, q3 +1: + cmp r12, #8-128 + blt 1f + vst1.8 {d0}, [r0]! + vst1.8 {d4}, [r2]! + beq 11b + sub r12, #8 + vmov d0, d1 + vmov d4, d5 +1: + cmp r12, #4-128 + blt 1f + vst1.32 {d0[0]}, [r0]! + vst1.32 {d4[0]}, [r2]! + beq 11b + sub r12, #4 + vmov s0, s1 + vmov s8, s9 +1: + cmp r12, #2-128 + blt 1f + vst1.16 {d0[0]}, [r0]! + vst1.16 {d4[0]}, [r2]! + beq 11b + vst1.8 {d0[2]}, [r0]! + vst1.8 {d4[2]}, [r2]! + b 11b +1: + vst1.8 {d0[0]}, [r0]! + vst1.8 {d4[0]}, [r2]! + b 11b +endfunc + + + +@ void ff_rpi_sand30_lines_to_planar_y16( +@ uint8_t * dest, // [r0] +@ unsigned int dst_stride, // [r1] +@ const uint8_t * src, // [r2] +@ unsigned int src_stride1, // [r3] Ignored - assumed 128 +@ unsigned int src_stride2, // [sp, #0] -> r3 +@ unsigned int _x, // [sp, #4] Ignored - 0 +@ unsigned int y, // [sp, #8] (r7 in prefix) +@ unsigned int _w, // [sp, #12] -> r6 (cur r5) +@ unsigned int h); // [sp, #16] -> r7 +@ +@ Assumes that we are starting on a stripe boundary and that overreading +@ within the stripe is OK. However it does respect the dest size for writing + +function ff_rpi_sand30_lines_to_planar_y16, export=1 + push {r4-r8, lr} @ +24 + ldr r3, [sp, #24] + ldr r6, [sp, #36] + ldr r7, [sp, #32] @ y + mov r12, #48 + sub r3, #1 + lsl r3, #7 + sub r1, r1, r6, lsl #1 + add r8, r2, r7, lsl #7 + ldr r7, [sp, #40] + +10: + mov r2, r8 + add r4, r0, #24 + mov r5, r6 + mov lr, #0 +1: + vldm r2!, {q10-q13} + add lr, #64 + + vshrn.u32 d4 , q10, #14 @ Cannot vshrn.u32 #20! + ands lr, #127 + vshrn.u32 d2, q10, #10 + vmovn.u32 d0, q10 + + vshrn.u32 d5, q11, #14 + it eq + addeq r2, r3 + vshrn.u32 d3, q11, #10 + vmovn.u32 d1, q11 + + subs r5, #48 + vshr.u16 q2, #6 + vbic.u16 q0, #0xfc00 + vbic.u16 q1, #0xfc00 + + vshrn.u32 d20, q12, #14 + vshrn.u32 d18, q12, #10 + vmovn.u32 d16, q12 + + vshrn.u32 d21, q13, #14 + vshrn.u32 d19, q13, #10 + vmovn.u32 d17, q13 + + vshr.u16 q10, #6 + vbic.u16 q8, #0xfc00 + vbic.u16 q9 , #0xfc00 + blt 2f + + vst3.16 {d0, d2, d4}, [r0], r12 + vst3.16 {d1, d3, d5}, [r4], r12 + vst3.16 {d16, d18, d20}, [r0], r12 + vst3.16 {d17, d19, d21}, [r4], r12 + + bne 1b + +11: + subs r7, #1 + add r0, r1 + add r8, #128 + bne 10b + + pop {r4-r8, pc} + +@ Partial final write +2: + cmp r5, #24-48 + blt 1f + vst3.16 {d0, d2, d4}, [r0], r12 + vst3.16 {d1, d3, d5}, [r4] + beq 11b + vmov q0, q8 + sub r5, #24 + vmov q1, q9 + vmov q2, q10 +1: + cmp r5, #12-48 + blt 1f + vst3.16 {d0, d2, d4}, [r0]! + beq 11b + vmov d0, d1 + sub r5, #12 + vmov d2, d3 + vmov d4, d5 +1: + cmp r5, #6-48 + add r4, r0, #6 @ avoid [r0]! on sequential instructions + blt 1f + vst3.16 {d0[0], d2[0], d4[0]}, [r0] + vst3.16 {d0[1], d2[1], d4[1]}, [r4] + add r0, #12 + beq 11b + vmov s0, s1 + sub r5, #6 + vmov s4, s5 + vmov s8, s9 +1: + cmp r5, #3-48 + blt 1f + vst3.16 {d0[0], d2[0], d4[0]}, [r0]! + beq 11b + sub r5, #3 + vshr.u32 d0, #16 + vshr.u32 d2, #16 +1: + cmp r5, #2-48 + blt 1f + vst2.16 {d0[0], d2[0]}, [r0]! + b 11b +1: + vst1.16 {d0[0]}, [r0]! + b 11b + +endfunc + + +@ void ff_rpi_sand30_lines_to_planar_c16( +@ uint8_t * dst_u, // [r0] +@ unsigned int dst_stride_u, // [r1] +@ uint8_t * dst_v, // [r2] +@ unsigned int dst_stride_v, // [r3] +@ const uint8_t * src, // [sp, #0] -> r4, r5 +@ unsigned int stride1, // [sp, #4] 128 +@ unsigned int stride2, // [sp, #8] -> r8 +@ unsigned int _x, // [sp, #12] 0 +@ unsigned int y, // [sp, #16] (r7 in prefix) +@ unsigned int _w, // [sp, #20] -> r6, r9 +@ unsigned int h); // [sp, #24] -> r7 +@ +@ Assumes that we are starting on a stripe boundary and that overreading +@ within the stripe is OK. However it does respect the dest size for writing + +function ff_rpi_sand30_lines_to_planar_c16, export=1 + push {r4-r10, lr} @ +32 + ldr r5, [sp, #32] + ldr r8, [sp, #40] + ldr r7, [sp, #48] + ldr r9, [sp, #52] + mov r12, #48 + sub r8, #1 + lsl r8, #7 + add r5, r5, r7, lsl #7 + sub r1, r1, r9, lsl #1 + sub r3, r3, r9, lsl #1 + ldr r7, [sp, #56] +10: + mov lr, #0 + mov r4, r5 + mov r6, r9 +1: + vldm r4!, {q0-q3} + add lr, #64 + + @ N.B. unpack [0,1,2] -> (reg order) 1, 0, 2 + vshrn.u32 d20, q0, #14 + vmovn.u32 d18, q0 + vshrn.u32 d0, q0, #10 + ands lr, #127 + + vshrn.u32 d21, q1, #14 + vmovn.u32 d19, q1 + vshrn.u32 d1, q1, #10 + + vshrn.u32 d22, q2, #10 + vmovn.u32 d2, q2 + vshrn.u32 d4, q2, #14 + + add r10, r0, #24 + vshrn.u32 d23, q3, #10 + vmovn.u32 d3, q3 + vshrn.u32 d5, q3, #14 + + it eq + addeq r4, r8 + vuzp.16 q0, q11 + vuzp.16 q9, q1 + vuzp.16 q10, q2 + + @ q0 V0, V3,.. + @ q9 U0, U3... + @ q10 U1, U4... + @ q11 U2, U5,.. + @ q1 V1, V4, + @ q2 V2, V5,.. + + subs r6, #24 + vbic.u16 q11, #0xfc00 + vbic.u16 q9, #0xfc00 + vshr.u16 q10, #6 + vshr.u16 q2, #6 + vbic.u16 q0, #0xfc00 + vbic.u16 q1, #0xfc00 + + blt 2f + + vst3.16 {d18, d20, d22}, [r0], r12 + vst3.16 {d19, d21, d23}, [r10] + add r10, r2, #24 + vst3.16 {d0, d2, d4}, [r2], r12 + vst3.16 {d1, d3, d5}, [r10] + + bne 1b + +11: + subs r7, #1 + add r5, #128 + add r0, r1 + add r2, r3 + bne 10b + + pop {r4-r10, pc} + +@ Partial final write +2: + cmp r6, #-12 + blt 1f + vst3.16 {d18, d20, d22}, [r0]! + vst3.16 {d0, d2, d4}, [r2]! + beq 11b + vmov d18, d19 + vmov d20, d21 + vmov d22, d23 + sub r6, #12 + vmov d0, d1 + vmov d2, d3 + vmov d4, d5 +1: + cmp r6, #-18 + @ Rezip here as it makes the remaining tail handling easier + vzip.16 d0, d18 + vzip.16 d2, d20 + vzip.16 d4, d22 + blt 1f + vst3.16 {d0[1], d2[1], d4[1]}, [r0]! + vst3.16 {d0[0], d2[0], d4[0]}, [r2]! + vst3.16 {d0[3], d2[3], d4[3]}, [r0]! + vst3.16 {d0[2], d2[2], d4[2]}, [r2]! + beq 11b + vmov d0, d18 + vmov d2, d20 + sub r6, #6 + vmov d4, d22 +1: + cmp r6, #-21 + blt 1f + vst3.16 {d0[1], d2[1], d4[1]}, [r0]! + vst3.16 {d0[0], d2[0], d4[0]}, [r2]! + beq 11b + vmov s4, s5 + sub r6, #3 + vmov s0, s1 +1: + cmp r6, #-22 + blt 1f + vst2.16 {d0[1], d2[1]}, [r0]! + vst2.16 {d0[0], d2[0]}, [r2]! + b 11b +1: + vst1.16 {d0[1]}, [r0]! + vst1.16 {d0[0]}, [r2]! + b 11b + +endfunc + +@ void ff_rpi_sand30_lines_to_planar_p010( +@ uint8_t * dest, // [r0] +@ unsigned int dst_stride, // [r1] +@ const uint8_t * src, // [r2] +@ unsigned int src_stride1, // [r3] Ignored - assumed 128 +@ unsigned int src_stride2, // [sp, #0] -> r3 +@ unsigned int _x, // [sp, #4] Ignored - 0 +@ unsigned int y, // [sp, #8] (r7 in prefix) +@ unsigned int _w, // [sp, #12] -> r6 (cur r5) +@ unsigned int h); // [sp, #16] -> r7 +@ +@ Assumes that we are starting on a stripe boundary and that overreading +@ within the stripe is OK. However it does respect the dest size for writing + +function ff_rpi_sand30_lines_to_planar_p010, export=1 + push {r4-r8, lr} @ +24 + ldr r3, [sp, #24] + ldr r6, [sp, #36] + ldr r7, [sp, #32] @ y + mov r12, #48 + vmov.u16 q15, #0xffc0 + sub r3, #1 + lsl r3, #7 + sub r1, r1, r6, lsl #1 + add r8, r2, r7, lsl #7 + ldr r7, [sp, #40] + +10: + mov r2, r8 + add r4, r0, #24 + mov r5, r6 + mov lr, #0 +1: + vldm r2!, {q10-q13} + add lr, #64 + + vshl.u32 q14, q10, #6 + ands lr, #127 + vshrn.u32 d4, q10, #14 + vshrn.u32 d2, q10, #4 + vmovn.u32 d0, q14 + + vshl.u32 q14, q11, #6 + it eq + addeq r2, r3 + vshrn.u32 d5, q11, #14 + vshrn.u32 d3, q11, #4 + vmovn.u32 d1, q14 + + subs r5, #48 + vand q2, q15 + vand q1, q15 + vand q0, q15 + + vshl.u32 q14, q12, #6 + vshrn.u32 d20, q12, #14 + vshrn.u32 d18, q12, #4 + vmovn.u32 d16, q14 + + vshl.u32 q14, q13, #6 + vshrn.u32 d21, q13, #14 + vshrn.u32 d19, q13, #4 + vmovn.u32 d17, q14 + + vand q10, q15 + vand q9, q15 + vand q8, q15 + blt 2f + + vst3.16 {d0, d2, d4}, [r0], r12 + vst3.16 {d1, d3, d5}, [r4], r12 + vst3.16 {d16, d18, d20}, [r0], r12 + vst3.16 {d17, d19, d21}, [r4], r12 + + bne 1b + +11: + subs r7, #1 + add r0, r1 + add r8, #128 + bne 10b + + pop {r4-r8, pc} + +@ Partial final write +2: + cmp r5, #24-48 + blt 1f + vst3.16 {d0, d2, d4}, [r0], r12 + vst3.16 {d1, d3, d5}, [r4] + beq 11b + vmov q0, q8 + sub r5, #24 + vmov q1, q9 + vmov q2, q10 +1: + cmp r5, #12-48 + blt 1f + vst3.16 {d0, d2, d4}, [r0]! + beq 11b + vmov d0, d1 + sub r5, #12 + vmov d2, d3 + vmov d4, d5 +1: + cmp r5, #6-48 + add r4, r0, #6 @ avoid [r0]! on sequential instructions + blt 1f + vst3.16 {d0[0], d2[0], d4[0]}, [r0] + vst3.16 {d0[1], d2[1], d4[1]}, [r4] + add r0, #12 + beq 11b + vmov s0, s1 + sub r5, #6 + vmov s4, s5 + vmov s8, s9 +1: + cmp r5, #3-48 + blt 1f + vst3.16 {d0[0], d2[0], d4[0]}, [r0]! + beq 11b + sub r5, #3 + vshr.u32 d0, #16 + vshr.u32 d2, #16 +1: + cmp r5, #2-48 + blt 1f + vst2.16 {d0[0], d2[0]}, [r0]! + b 11b +1: + vst1.16 {d0[0]}, [r0]! + b 11b + +endfunc + + +@ void ff_rpi_sand30_lines_to_planar_y8( +@ uint8_t * dest, // [r0] +@ unsigned int dst_stride, // [r1] +@ const uint8_t * src, // [r2] +@ unsigned int src_stride1, // [r3] Ignored - assumed 128 +@ unsigned int src_stride2, // [sp, #0] -> r3 +@ unsigned int _x, // [sp, #4] Ignored - 0 +@ unsigned int y, // [sp, #8] (r7 in prefix) +@ unsigned int _w, // [sp, #12] -> r6 (cur r5) +@ unsigned int h); // [sp, #16] -> r7 +@ +@ Assumes that we are starting on a stripe boundary and that overreading +@ within the stripe is OK. However it does respect the dest size for wri + +function ff_rpi_sand30_lines_to_planar_y8, export=1 + push {r4-r8, lr} @ +24 + ldr r3, [sp, #24] + ldr r6, [sp, #36] + ldr r7, [sp, #32] @ y + mov r12, #48 + lsl r3, #7 + sub r1, r1, r6 + add r8, r2, r7, lsl #7 + ldr r7, [sp, #40] + +10: + mov r2, r8 + add r4, r0, #24 + mov r5, r6 +1: + vldm r2, {q8-q15} + + subs r5, #96 + + vmovn.u32 d0, q8 + vshrn.u32 d2, q8, #12 + vshrn.u32 d4, q8, #16 @ Cannot vshrn.u32 #20! + + add r2, r3 + + vmovn.u32 d1, q9 + vshrn.u32 d3, q9, #12 + vshrn.u32 d5, q9, #16 + + pld [r2, #0] + + vshrn.u16 d0, q0, #2 + vmovn.u16 d1, q1 + vshrn.u16 d2, q2, #6 + + vmovn.u32 d16, q10 + vshrn.u32 d18, q10, #12 + vshrn.u32 d20, q10, #16 + + vmovn.u32 d17, q11 + vshrn.u32 d19, q11, #12 + vshrn.u32 d21, q11, #16 + + pld [r2, #64] + + vshrn.u16 d4, q8, #2 + vmovn.u16 d5, q9 + vshrn.u16 d6, q10, #6 + + vmovn.u32 d16, q12 + vshrn.u32 d18, q12, #12 + vshrn.u32 d20, q12, #16 + + vmovn.u32 d17, q13 + vshrn.u32 d19, q13, #12 + vshrn.u32 d21, q13, #16 + + vshrn.u16 d16, q8, #2 + vmovn.u16 d17, q9 + vshrn.u16 d18, q10, #6 + + vmovn.u32 d20, q14 + vshrn.u32 d22, q14, #12 + vshrn.u32 d24, q14, #16 + + vmovn.u32 d21, q15 + vshrn.u32 d23, q15, #12 + vshrn.u32 d25, q15, #16 + + vshrn.u16 d20, q10, #2 + vmovn.u16 d21, q11 + vshrn.u16 d22, q12, #6 + + blt 2f + + vst3.8 {d0, d1, d2}, [r0], r12 + vst3.8 {d4, d5, d6}, [r4], r12 + vst3.8 {d16, d17, d18}, [r0], r12 + vst3.8 {d20, d21, d22}, [r4], r12 + + bne 1b + +11: + subs r7, #1 + add r0, r1 + add r8, #128 + bne 10b + + pop {r4-r8, pc} + +@ Partial final write +2: + cmp r5, #48-96 + blt 1f + vst3.8 {d0, d1, d2}, [r0], r12 + vst3.8 {d4, d5, d6}, [r4], r12 + beq 11b + vmov q0, q8 + vmov q2, q10 + sub r5, #48 + vmov d2, d18 + vmov d6, d22 +1: + cmp r5, #24-96 + blt 1f + vst3.8 {d0, d1, d2}, [r0]! + beq 11b + vmov q0, q2 + sub r5, #24 + vmov d2, d6 +1: + cmp r5, #12-96 + blt 1f + vst3.8 {d0[0], d1[0], d2[0]}, [r0]! + vst3.8 {d0[1], d1[1], d2[1]}, [r0]! + vst3.8 {d0[2], d1[2], d2[2]}, [r0]! + vst3.8 {d0[3], d1[3], d2[3]}, [r0]! + beq 11b + vmov s0, s1 + sub r5, #12 + vmov s2, s3 + vmov s4, s5 +1: + cmp r5, #6-96 + blt 1f + vst3.8 {d0[0], d1[0], d2[0]}, [r0]! + vst3.8 {d0[1], d1[1], d2[1]}, [r0]! + add r0, #12 + beq 11b + vshr.u32 d0, #16 + sub r5, #6 + vshr.u32 d1, #16 + vshr.u32 d2, #16 +1: + cmp r5, #3-96 + blt 1f + vst3.8 {d0[0], d1[0], d2[0]}, [r0]! + beq 11b + sub r5, #3 + vshr.u32 d0, #8 + vshr.u32 d1, #8 +1: + cmp r5, #2-96 + blt 1f + vst2.8 {d0[0], d1[0]}, [r0]! + b 11b +1: + vst1.8 {d0[0]}, [r0]! + b 11b + +endfunc + + diff --git a/libavutil/arm/rpi_sand_neon.h b/libavutil/arm/rpi_sand_neon.h new file mode 100644 index 0000000000..d457c10870 --- /dev/null +++ b/libavutil/arm/rpi_sand_neon.h @@ -0,0 +1,110 @@ +/* +Copyright (c) 2020 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox +*/ + +#ifndef AVUTIL_ARM_SAND_NEON_H +#define AVUTIL_ARM_SAND_NEON_H + +void ff_rpi_sand128b_stripe_to_8_10( + uint8_t * dest, // [r0] + const uint8_t * src1, // [r1] + const uint8_t * src2, // [r2] + unsigned int lines); // [r3] + +void ff_rpi_sand8_lines_to_planar_y8( + uint8_t * dest, // [r0] + unsigned int dst_stride, // [r1] + const uint8_t * src, // [r2] + unsigned int src_stride1, // [r3] Ignored - assumed 128 + unsigned int src_stride2, // [sp, #0] -> r3 + unsigned int _x, // [sp, #4] Ignored - 0 + unsigned int y, // [sp, #8] (r7 in prefix) + unsigned int _w, // [sp, #12] -> r6 (cur r5) + unsigned int h); // [sp, #16] -> r7 + +void ff_rpi_sand8_lines_to_planar_c8( + uint8_t * dst_u, // [r0] + unsigned int dst_stride_u, // [r1] + uint8_t * dst_v, // [r2] + unsigned int dst_stride_v, // [r3] + const uint8_t * src, // [sp, #0] -> r4, r5 + unsigned int stride1, // [sp, #4] 128 + unsigned int stride2, // [sp, #8] -> r8 + unsigned int _x, // [sp, #12] 0 + unsigned int y, // [sp, #16] (r7 in prefix) + unsigned int _w, // [sp, #20] -> r12, r6 + unsigned int h); // [sp, #24] -> r7 + +void ff_rpi_sand30_lines_to_planar_y16( + uint8_t * dest, // [r0] + unsigned int dst_stride, // [r1] + const uint8_t * src, // [r2] + unsigned int src_stride1, // [r3] Ignored - assumed 128 + unsigned int src_stride2, // [sp, #0] -> r3 + unsigned int _x, // [sp, #4] Ignored - 0 + unsigned int y, // [sp, #8] (r7 in prefix) + unsigned int _w, // [sp, #12] -> r6 (cur r5) + unsigned int h); // [sp, #16] -> r7 + +void ff_rpi_sand30_lines_to_planar_c16( + uint8_t * dst_u, // [r0] + unsigned int dst_stride_u, // [r1] + uint8_t * dst_v, // [r2] + unsigned int dst_stride_v, // [r3] + const uint8_t * src, // [sp, #0] -> r4, r5 + unsigned int stride1, // [sp, #4] 128 + unsigned int stride2, // [sp, #8] -> r8 + unsigned int _x, // [sp, #12] 0 + unsigned int y, // [sp, #16] (r7 in prefix) + unsigned int _w, // [sp, #20] -> r6, r9 + unsigned int h); // [sp, #24] -> r7 + +void ff_rpi_sand30_lines_to_planar_p010( + uint8_t * dest, // [r0] + unsigned int dst_stride, // [r1] + const uint8_t * src, // [r2] + unsigned int src_stride1, // [r3] Ignored - assumed 128 + unsigned int src_stride2, // [sp, #0] -> r3 + unsigned int _x, // [sp, #4] Ignored - 0 + unsigned int y, // [sp, #8] (r7 in prefix) + unsigned int _w, // [sp, #12] -> r6 (cur r5) + unsigned int h); // [sp, #16] -> r7 + +void ff_rpi_sand30_lines_to_planar_y8( + uint8_t * dest, // [r0] + unsigned int dst_stride, // [r1] + const uint8_t * src, // [r2] + unsigned int src_stride1, // [r3] Ignored - assumed 128 + unsigned int src_stride2, // [sp, #0] -> r3 + unsigned int _x, // [sp, #4] Ignored - 0 + unsigned int y, // [sp, #8] (r7 in prefix) + unsigned int _w, // [sp, #12] -> r6 (cur r5) + unsigned int h); // [sp, #16] -> r7 + +#endif // AVUTIL_ARM_SAND_NEON_H + diff --git a/libavutil/frame.c b/libavutil/frame.c index 75e347bf2f..daa6477485 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "config.h" + #include "channel_layout.h" #include "avassert.h" #include "buffer.h" @@ -26,6 +28,9 @@ #include "mem.h" #include "samplefmt.h" #include "hwcontext.h" +#if CONFIG_SAND +#include "rpi_sand_fns.h" +#endif #if FF_API_FRAME_GET_SET MAKE_ACCESSORS(AVFrame, frame, int64_t, best_effort_timestamp) @@ -903,6 +908,12 @@ int av_frame_apply_cropping(AVFrame *frame, int flags) (frame->crop_top + frame->crop_bottom) >= frame->height) return AVERROR(ERANGE); +#if CONFIG_SAND + // Sand cannot be cropped - do not try + if (av_rpi_is_sand_format(frame->format)) + return 0; +#endif + desc = av_pix_fmt_desc_get(frame->format); if (!desc) return AVERROR_BUG; diff --git a/libavutil/frame.h b/libavutil/frame.h index 7d1f8e2935..a4e7dc915d 100644 --- a/libavutil/frame.h +++ b/libavutil/frame.h @@ -990,6 +990,16 @@ int av_frame_apply_cropping(AVFrame *frame, int flags); */ const char *av_frame_side_data_name(enum AVFrameSideDataType type); + +static inline int av_frame_cropped_width(const AVFrame * const frame) +{ + return frame->width - (frame->crop_left + frame->crop_right); +} +static inline int av_frame_cropped_height(const AVFrame * const frame) +{ + return frame->height - (frame->crop_top + frame->crop_bottom); +} + /** * @} */ diff --git a/libavutil/hwcontext_drm.c b/libavutil/hwcontext_drm.c index 7a9fdbd263..2f825b7e16 100644 --- a/libavutil/hwcontext_drm.c +++ b/libavutil/hwcontext_drm.c @@ -21,6 +21,7 @@ #include #include #include +#include /* This was introduced in version 4.6. And may not exist all without an * optional package. So to prevent a hard dependency on needing the Linux @@ -31,6 +32,7 @@ #endif #include +#include #include #include "avassert.h" @@ -38,7 +40,9 @@ #include "hwcontext_drm.h" #include "hwcontext_internal.h" #include "imgutils.h" - +#if CONFIG_SAND +#include "libavutil/rpi_sand_fns.h" +#endif static void drm_device_free(AVHWDeviceContext *hwdev) { @@ -53,6 +57,11 @@ static int drm_device_create(AVHWDeviceContext *hwdev, const char *device, AVDRMDeviceContext *hwctx = hwdev->hwctx; drmVersionPtr version; + if (device == NULL) { + hwctx->fd = -1; + return 0; + } + hwctx->fd = open(device, O_RDWR); if (hwctx->fd < 0) return AVERROR(errno); @@ -139,6 +148,8 @@ static int drm_map_frame(AVHWFramesContext *hwfc, if (flags & AV_HWFRAME_MAP_WRITE) mmap_prot |= PROT_WRITE; + if (dst->format == AV_PIX_FMT_NONE) + dst->format = hwfc->sw_format; #if HAVE_LINUX_DMA_BUF_H if (flags & AV_HWFRAME_MAP_READ) map->sync_flags |= DMA_BUF_SYNC_READ; @@ -185,6 +196,23 @@ static int drm_map_frame(AVHWFramesContext *hwfc, dst->width = src->width; dst->height = src->height; + dst->crop_top = src->crop_top; + dst->crop_bottom = src->crop_bottom; + dst->crop_left = src->crop_left; + dst->crop_right = src->crop_right; + +#if CONFIG_SAND + // Rework for sand frames + if (av_rpi_is_sand_frame(dst)) { + // As it stands the sand formats hold stride2 in linesize[3] + // linesize[0] & [1] contain stride1 which is always 128 for everything we do + // * Arguably this should be reworked s.t. stride2 is in linesize[0] & [1] + dst->linesize[3] = fourcc_mod_broadcom_param(desc->objects[0].format_modifier); + dst->linesize[0] = 128; + dst->linesize[1] = 128; + // *** Are we sure src->height is actually what we want ??? + } +#endif err = ff_hwframe_map_create(src->hw_frames_ctx, dst, src, &drm_unmap_frame, map); @@ -206,16 +234,29 @@ static int drm_transfer_get_formats(AVHWFramesContext *ctx, enum AVHWFrameTransferDirection dir, enum AVPixelFormat **formats) { - enum AVPixelFormat *pix_fmts; + enum AVPixelFormat *p; - pix_fmts = av_malloc_array(2, sizeof(*pix_fmts)); - if (!pix_fmts) + p = *formats = av_malloc_array(3, sizeof(*p)); + if (!p) return AVERROR(ENOMEM); - pix_fmts[0] = ctx->sw_format; - pix_fmts[1] = AV_PIX_FMT_NONE; + // **** Offer native sand too ???? + *p++ = +#if CONFIG_SAND + ctx->sw_format == AV_PIX_FMT_RPI4_8 || ctx->sw_format == AV_PIX_FMT_SAND128 ? + AV_PIX_FMT_YUV420P : + ctx->sw_format == AV_PIX_FMT_RPI4_10 ? + AV_PIX_FMT_YUV420P10LE : +#endif + ctx->sw_format; + +#if CONFIG_SAND + if (ctx->sw_format == AV_PIX_FMT_RPI4_10 || + ctx->sw_format == AV_PIX_FMT_RPI4_8 || ctx->sw_format == AV_PIX_FMT_SAND128) + *p++ = AV_PIX_FMT_NV12; +#endif - *formats = pix_fmts; + *p = AV_PIX_FMT_NONE; return 0; } @@ -231,18 +272,63 @@ static int drm_transfer_data_from(AVHWFramesContext *hwfc, map = av_frame_alloc(); if (!map) return AVERROR(ENOMEM); - map->format = dst->format; + // Map to default + map->format = AV_PIX_FMT_NONE; err = drm_map_frame(hwfc, map, src, AV_HWFRAME_MAP_READ); if (err) goto fail; - map->width = dst->width; - map->height = dst->height; +#if 0 + av_log(hwfc, AV_LOG_INFO, "%s: src fmt=%d (%d), dst fmt=%d (%d) s=%dx%d l=%d/%d/%d/%d, d=%dx%d l=%d/%d/%d\n", __func__, + hwfc->sw_format, AV_PIX_FMT_RPI4_8, dst->format, AV_PIX_FMT_YUV420P10LE, + map->width, map->height, + map->linesize[0], + map->linesize[1], + map->linesize[2], + map->linesize[3], + dst->width, dst->height, + dst->linesize[0], + dst->linesize[1], + dst->linesize[2]); +#endif +#if CONFIG_SAND + if (av_rpi_is_sand_frame(map)) { + // Preserve crop - later ffmpeg code assumes that we have in that it + // overwrites any crop that we create with the old values + unsigned int stride2 = map->linesize[3]; + const unsigned int w = FFMIN(dst->width, map->width); + const unsigned int h = FFMIN(dst->height, map->height); + + map->crop_top = 0; + map->crop_bottom = 0; + map->crop_left = 0; + map->crop_right = 0; + + if (av_rpi_sand_to_planar_frame(dst, map) != 0) + { + av_log(hwfc, AV_LOG_ERROR, "%s: Incompatible output pixfmt for sand\n", __func__); + err = AVERROR(EINVAL); + goto fail; + } + + dst->width = w; + dst->height = h; + } + else +#endif + { + // Kludge mapped h/w s.t. frame_copy works + map->width = dst->width; + map->height = dst->height; + err = av_frame_copy(dst, map); + } - err = av_frame_copy(dst, map); if (err) + { + av_log(hwfc, AV_LOG_ERROR, "%s: Copy fail\n", __func__); goto fail; + } err = 0; fail: @@ -257,7 +343,10 @@ static int drm_transfer_data_to(AVHWFramesContext *hwfc, int err; if (src->width > hwfc->width || src->height > hwfc->height) + { + av_log(hwfc, AV_LOG_ERROR, "%s: H/w mismatch: %d/%d, %d/%d\n", __func__, dst->width, hwfc->width, dst->height, hwfc->height); return AVERROR(EINVAL); + } map = av_frame_alloc(); if (!map) diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c index 18c7a0efc8..bab13a4d50 100644 --- a/libavutil/pixdesc.c +++ b/libavutil/pixdesc.c @@ -2395,6 +2395,50 @@ static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { .name = "vulkan", .flags = AV_PIX_FMT_FLAG_HWACCEL, }, + [AV_PIX_FMT_SAND128] = { + .name = "sand128", + .nb_components = 3, + .log2_chroma_w = 1, + .log2_chroma_h = 1, + .comp = { + { 0, 1, 0, 0, 8, 0, 7, 1 }, /* Y */ + { 1, 2, 0, 0, 8, 1, 7, 1 }, /* U */ + { 1, 2, 1, 0, 8, 1, 7, 2 }, /* V */ + }, + .flags = 0, + }, + [AV_PIX_FMT_SAND64_10] = { + .name = "sand64_10", + .nb_components = 3, + .log2_chroma_w = 1, + .log2_chroma_h = 1, + .comp = { + { 0, 2, 0, 0, 10, 0, 9, 1 }, /* Y */ + { 1, 4, 0, 0, 10, 3, 9, 1 }, /* U */ + { 1, 4, 2, 0, 10, 3, 9, 3 }, /* V */ + }, + .flags = 0, + }, + [AV_PIX_FMT_SAND64_16] = { + .name = "sand64_16", + .nb_components = 3, + .log2_chroma_w = 1, + .log2_chroma_h = 1, + .comp = { + { 0, 2, 0, 0, 16, 0, 15, 1 }, /* Y */ + { 1, 4, 0, 0, 16, 3, 15, 1 }, /* U */ + { 1, 4, 2, 0, 16, 3, 15, 3 }, /* V */ + }, + .flags = 0, + }, + [AV_PIX_FMT_RPI4_8] = { + .name = "rpi4_8", + .flags = AV_PIX_FMT_FLAG_HWACCEL, + }, + [AV_PIX_FMT_RPI4_10] = { + .name = "rpi4_10", + .flags = AV_PIX_FMT_FLAG_HWACCEL, + }, }; #if FF_API_PLUS1_MINUS1 FF_ENABLE_DEPRECATION_WARNINGS diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h index 46ef211add..9195ead15f 100644 --- a/libavutil/pixfmt.h +++ b/libavutil/pixfmt.h @@ -357,6 +357,14 @@ enum AVPixelFormat { AV_PIX_FMT_Y210BE, ///< packed YUV 4:2:2 like YUYV422, 20bpp, data in the high bits, big-endian AV_PIX_FMT_Y210LE, ///< packed YUV 4:2:2 like YUYV422, 20bpp, data in the high bits, little-endian +// RPI - not on ifdef so can be got at by calling progs +// #define so code that uses this can know it is there +#define AVUTIL_HAVE_PIX_FMT_SAND 1 + AV_PIX_FMT_SAND128, ///< 4:2:0 8-bit 128x*Y stripe, 64x*UV stripe, then next x stripe, mysterious padding + AV_PIX_FMT_SAND64_10, ///< 4:2:0 10-bit 64x*Y stripe, 32x*UV stripe, then next x stripe, mysterious padding + AV_PIX_FMT_SAND64_16, ///< 4:2:0 16-bit 64x*Y stripe, 32x*UV stripe, then next x stripe, mysterious padding + AV_PIX_FMT_RPI4_8, + AV_PIX_FMT_RPI4_10, AV_PIX_FMT_X2RGB10LE, ///< packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), little-endian, X=unused/undefined AV_PIX_FMT_X2RGB10BE, ///< packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), big-endian, X=unused/undefined diff --git a/libavutil/rpi_sand_fn_pw.h b/libavutil/rpi_sand_fn_pw.h new file mode 100644 index 0000000000..0d5d203dc3 --- /dev/null +++ b/libavutil/rpi_sand_fn_pw.h @@ -0,0 +1,227 @@ +/* +Copyright (c) 2018 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox +*/ + +// * Included twice from rpi_sand_fn with different PW + +#define STRCAT(x,y) x##y + +#if PW == 1 +#define pixel uint8_t +#define FUNC(f) STRCAT(f, 8) +#elif PW == 2 +#define pixel uint16_t +#define FUNC(f) STRCAT(f, 16) +#else +#error Unexpected PW +#endif + +// Fetches a single patch - offscreen fixup not done here +// w <= stride1 +// unclipped +void FUNC(av_rpi_sand_to_planar_y)(uint8_t * dst, const unsigned int dst_stride, + const uint8_t * src, + unsigned int stride1, unsigned int stride2, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h) +{ + const unsigned int x = _x; + const unsigned int w = _w; + const unsigned int mask = stride1 - 1; + +#if PW == 1 && HAVE_SAND_ASM + if (_x == 0) { + ff_rpi_sand8_lines_to_planar_y8(dst, dst_stride, + src, stride1, stride2, _x, y, _w, h); + return; + } +#endif + + if ((x & ~mask) == ((x + w) & ~mask)) { + // All in one sand stripe + const uint8_t * p = src + (x & mask) + y * stride1 + (x & ~mask) * stride2; + for (unsigned int i = 0; i != h; ++i, dst += dst_stride, p += stride1) { + memcpy(dst, p, w); + } + } + else + { + // Two+ stripe + const unsigned int sstride = stride1 * stride2; + const uint8_t * p1 = src + (x & mask) + y * stride1 + (x & ~mask) * stride2; + const uint8_t * p2 = p1 + sstride - (x & mask); + const unsigned int w1 = stride1 - (x & mask); + const unsigned int w3 = (x + w) & mask; + const unsigned int w2 = w - (w1 + w3); + + for (unsigned int i = 0; i != h; ++i, dst += dst_stride, p1 += stride1, p2 += stride1) { + unsigned int j; + const uint8_t * p = p2; + uint8_t * d = dst; + memcpy(d, p1, w1); + d += w1; + for (j = 0; j < w2; j += stride1, d += stride1, p += sstride) { + memcpy(d, p, stride1); + } + memcpy(d, p, w3); + } + } +} + +// x & w in bytes but not of interleave (i.e. offset = x*2 for U&V) + +void FUNC(av_rpi_sand_to_planar_c)(uint8_t * dst_u, const unsigned int dst_stride_u, + uint8_t * dst_v, const unsigned int dst_stride_v, + const uint8_t * src, + unsigned int stride1, unsigned int stride2, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h) +{ + const unsigned int x = _x * 2; + const unsigned int w = _w * 2; + const unsigned int mask = stride1 - 1; + +#if PW == 1 && HAVE_SAND_ASM + if (_x == 0) { + ff_rpi_sand8_lines_to_planar_c8(dst_u, dst_stride_u, dst_v, dst_stride_v, + src, stride1, stride2, _x, y, _w, h); + return; + } +#endif + + if ((x & ~mask) == ((x + w) & ~mask)) { + // All in one sand stripe + const uint8_t * p1 = src + (x & mask) + y * stride1 + (x & ~mask) * stride2; + for (unsigned int i = 0; i != h; ++i, dst_u += dst_stride_u, dst_v += dst_stride_v, p1 += stride1) { + pixel * du = (pixel *)dst_u; + pixel * dv = (pixel *)dst_v; + const pixel * p = (const pixel *)p1; + for (unsigned int k = 0; k < w; k += 2 * PW) { + *du++ = *p++; + *dv++ = *p++; + } + } + } + else + { + // Two+ stripe + const unsigned int sstride = stride1 * stride2; + const unsigned int sstride_p = (sstride - stride1) / PW; + + const uint8_t * p1 = src + (x & mask) + y * stride1 + (x & ~mask) * stride2; + const uint8_t * p2 = p1 + sstride - (x & mask); + const unsigned int w1 = stride1 - (x & mask); + const unsigned int w3 = (x + w) & mask; + const unsigned int w2 = w - (w1 + w3); + + for (unsigned int i = 0; i != h; ++i, dst_u += dst_stride_u, dst_v += dst_stride_v, p1 += stride1, p2 += stride1) { + unsigned int j; + const pixel * p = (const pixel *)p1; + pixel * du = (pixel *)dst_u; + pixel * dv = (pixel *)dst_v; + for (unsigned int k = 0; k < w1; k += 2 * PW) { + *du++ = *p++; + *dv++ = *p++; + } + for (j = 0, p = (const pixel *)p2; j < w2; j += stride1, p += sstride_p) { + for (unsigned int k = 0; k < stride1; k += 2 * PW) { + *du++ = *p++; + *dv++ = *p++; + } + } + for (unsigned int k = 0; k < w3; k += 2 * PW) { + *du++ = *p++; + *dv++ = *p++; + } + } + } +} + +void FUNC(av_rpi_planar_to_sand_c)(uint8_t * dst_c, + unsigned int stride1, unsigned int stride2, + const uint8_t * src_u, const unsigned int src_stride_u, + const uint8_t * src_v, const unsigned int src_stride_v, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h) +{ + const unsigned int x = _x * 2; + const unsigned int w = _w * 2; + const unsigned int mask = stride1 - 1; + if ((x & ~mask) == ((x + w) & ~mask)) { + // All in one sand stripe + uint8_t * p1 = dst_c + (x & mask) + y * stride1 + (x & ~mask) * stride2; + for (unsigned int i = 0; i != h; ++i, src_u += src_stride_u, src_v += src_stride_v, p1 += stride1) { + const pixel * su = (const pixel *)src_u; + const pixel * sv = (const pixel *)src_v; + pixel * p = (pixel *)p1; + for (unsigned int k = 0; k < w; k += 2 * PW) { + *p++ = *su++; + *p++ = *sv++; + } + } + } + else + { + // Two+ stripe + const unsigned int sstride = stride1 * stride2; + const unsigned int sstride_p = (sstride - stride1) / PW; + + const uint8_t * p1 = dst_c + (x & mask) + y * stride1 + (x & ~mask) * stride2; + const uint8_t * p2 = p1 + sstride - (x & mask); + const unsigned int w1 = stride1 - (x & mask); + const unsigned int w3 = (x + w) & mask; + const unsigned int w2 = w - (w1 + w3); + + for (unsigned int i = 0; i != h; ++i, src_u += src_stride_u, src_v += src_stride_v, p1 += stride1, p2 += stride1) { + unsigned int j; + const pixel * su = (const pixel *)src_u; + const pixel * sv = (const pixel *)src_v; + pixel * p = (pixel *)p1; + for (unsigned int k = 0; k < w1; k += 2 * PW) { + *p++ = *su++; + *p++ = *sv++; + } + for (j = 0, p = (pixel *)p2; j < w2; j += stride1, p += sstride_p) { + for (unsigned int k = 0; k < stride1; k += 2 * PW) { + *p++ = *su++; + *p++ = *sv++; + } + } + for (unsigned int k = 0; k < w3; k += 2 * PW) { + *p++ = *su++; + *p++ = *sv++; + } + } + } +} + + +#undef pixel +#undef STRCAT +#undef FUNC + diff --git a/libavutil/rpi_sand_fns.c b/libavutil/rpi_sand_fns.c new file mode 100644 index 0000000000..0626bb06cb --- /dev/null +++ b/libavutil/rpi_sand_fns.c @@ -0,0 +1,447 @@ +/* +Copyright (c) 2018 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox +*/ + +#include "config.h" +#include +#include +#include "rpi_sand_fns.h" +#include "avassert.h" +#include "frame.h" + +#if ARCH_ARM && HAVE_NEON +#include "libavutil/arm/cpu.h" +#include "libavutil/arm/rpi_sand_neon.h" +#define HAVE_SAND_ASM 1 +#elif ARCH_AARCH64 && HAVE_NEON +#include "libavutil/aarch64/cpu.h" +#include "libavutil/aarch64/rpi_sand_neon.h" +#define HAVE_SAND_ASM 1 +#else +#define HAVE_SAND_ASM 0 +#endif + +#define PW 1 +#include "rpi_sand_fn_pw.h" +#undef PW + +#define PW 2 +#include "rpi_sand_fn_pw.h" +#undef PW + +#if 1 +// Simple round +static void cpy16_to_8(uint8_t * dst, const uint8_t * _src, unsigned int n, const unsigned int shr) +{ + const unsigned int rnd = (1 << shr) >> 1; + const uint16_t * src = (const uint16_t *)_src; + + for (; n != 0; --n) { + *dst++ = (*src++ + rnd) >> shr; + } +} +#else +// Dithered variation +static void cpy16_to_8(uint8_t * dst, const uint8_t * _src, unsigned int n, const unsigned int shr) +{ + unsigned int rnd = (1 << shr) >> 1; + const unsigned int mask = ((1 << shr) - 1); + const uint16_t * src = (const uint16_t *)_src; + + for (; n != 0; --n) { + rnd = *src++ + (rnd & mask); + *dst++ = rnd >> shr; + } +} +#endif + +// Fetches a single patch - offscreen fixup not done here +// w <= stride1 +// unclipped +// _x & _w in pixels, strides in bytes +void av_rpi_sand30_to_planar_y16(uint8_t * dst, const unsigned int dst_stride, + const uint8_t * src, + unsigned int stride1, unsigned int stride2, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h) +{ + const unsigned int x0 = (_x / 3) * 4; // Byte offset of the word + const unsigned int xskip0 = _x - (x0 >> 2) * 3; + const unsigned int x1 = ((_x + _w) / 3) * 4; + const unsigned int xrem1 = _x + _w - (x1 >> 2) * 3; + const unsigned int mask = stride1 - 1; + const uint8_t * p0 = src + (x0 & mask) + y * stride1 + (x0 & ~mask) * stride2; + const unsigned int slice_inc = ((stride2 - 1) * stride1) >> 2; // RHS of a stripe to LHS of next in words + +#if HAVE_SAND_ASM + if (_x == 0 && have_neon(av_get_cpu_flags())) { + ff_rpi_sand30_lines_to_planar_y16(dst, dst_stride, src, stride1, stride2, _x, y, _w, h); + return; + } +#endif + + if (x0 == x1) { + // ******************* + // Partial single word xfer + return; + } + + for (unsigned int i = 0; i != h; ++i, dst += dst_stride, p0 += stride1) + { + unsigned int x = x0; + const uint32_t * p = (const uint32_t *)p0; + uint16_t * d = (uint16_t *)dst; + + if (xskip0 != 0) { + const uint32_t p3 = *p++; + + if (xskip0 == 1) + *d++ = (p3 >> 10) & 0x3ff; + *d++ = (p3 >> 20) & 0x3ff; + + if (((x += 4) & mask) == 0) + p += slice_inc; + } + + while (x != x1) { + const uint32_t p3 = *p++; + *d++ = p3 & 0x3ff; + *d++ = (p3 >> 10) & 0x3ff; + *d++ = (p3 >> 20) & 0x3ff; + + if (((x += 4) & mask) == 0) + p += slice_inc; + } + + if (xrem1 != 0) { + const uint32_t p3 = *p; + + *d++ = p3 & 0x3ff; + if (xrem1 == 2) + *d++ = (p3 >> 10) & 0x3ff; + } + } +} + + +void av_rpi_sand30_to_planar_c16(uint8_t * dst_u, const unsigned int dst_stride_u, + uint8_t * dst_v, const unsigned int dst_stride_v, + const uint8_t * src, + unsigned int stride1, unsigned int stride2, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h) +{ + const unsigned int x0 = (_x / 3) * 8; // Byte offset of the word + const unsigned int xskip0 = _x - (x0 >> 3) * 3; + const unsigned int x1 = ((_x + _w) / 3) * 8; + const unsigned int xrem1 = _x + _w - (x1 >> 3) * 3; + const unsigned int mask = stride1 - 1; + const uint8_t * p0 = src + (x0 & mask) + y * stride1 + (x0 & ~mask) * stride2; + const unsigned int slice_inc = ((stride2 - 1) * stride1) >> 2; // RHS of a stripe to LHS of next in words + +#if HAVE_SAND_ASM + if (_x == 0 && have_neon(av_get_cpu_flags())) { + ff_rpi_sand30_lines_to_planar_c16(dst_u, dst_stride_u, dst_v, dst_stride_v, + src, stride1, stride2, _x, y, _w, h); + return; + } +#endif + + if (x0 == x1) { + // ******************* + // Partial single word xfer + return; + } + + for (unsigned int i = 0; i != h; ++i, dst_u += dst_stride_u, dst_v += dst_stride_v, p0 += stride1) + { + unsigned int x = x0; + const uint32_t * p = (const uint32_t *)p0; + uint16_t * du = (uint16_t *)dst_u; + uint16_t * dv = (uint16_t *)dst_v; + + if (xskip0 != 0) { + const uint32_t p3a = *p++; + const uint32_t p3b = *p++; + + if (xskip0 == 1) + { + *du++ = (p3a >> 20) & 0x3ff; + *dv++ = (p3b >> 0) & 0x3ff; + } + *du++ = (p3b >> 10) & 0x3ff; + *dv++ = (p3b >> 20) & 0x3ff; + + if (((x += 8) & mask) == 0) + p += slice_inc; + } + + while (x != x1) { + const uint32_t p3a = *p++; + const uint32_t p3b = *p++; + + *du++ = p3a & 0x3ff; + *dv++ = (p3a >> 10) & 0x3ff; + *du++ = (p3a >> 20) & 0x3ff; + *dv++ = p3b & 0x3ff; + *du++ = (p3b >> 10) & 0x3ff; + *dv++ = (p3b >> 20) & 0x3ff; + + if (((x += 8) & mask) == 0) + p += slice_inc; + } + + if (xrem1 != 0) { + const uint32_t p3a = *p++; + const uint32_t p3b = *p++; + + *du++ = p3a & 0x3ff; + *dv++ = (p3a >> 10) & 0x3ff; + if (xrem1 == 2) + { + *du++ = (p3a >> 20) & 0x3ff; + *dv++ = p3b & 0x3ff; + } + } + } +} + +// Fetches a single patch - offscreen fixup not done here +// w <= stride1 +// single lose bottom 2 bits truncation +// _x & _w in pixels, strides in bytes +void av_rpi_sand30_to_planar_y8(uint8_t * dst, const unsigned int dst_stride, + const uint8_t * src, + unsigned int stride1, unsigned int stride2, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h) +{ + const unsigned int x0 = (_x / 3) * 4; // Byte offset of the word + const unsigned int xskip0 = _x - (x0 >> 2) * 3; + const unsigned int x1 = ((_x + _w) / 3) * 4; + const unsigned int xrem1 = _x + _w - (x1 >> 2) * 3; + const unsigned int mask = stride1 - 1; + const uint8_t * p0 = src + (x0 & mask) + y * stride1 + (x0 & ~mask) * stride2; + const unsigned int slice_inc = ((stride2 - 1) * stride1) >> 2; // RHS of a stripe to LHS of next in words + +#if HAVE_SAND_ASM + if (_x == 0) { + ff_rpi_sand30_lines_to_planar_y8(dst, dst_stride, src, stride1, stride2, _x, y, _w, h); + return; + } +#endif + + if (x0 == x1) { + // ******************* + // Partial single word xfer + return; + } + + for (unsigned int i = 0; i != h; ++i, dst += dst_stride, p0 += stride1) + { + unsigned int x = x0; + const uint32_t * p = (const uint32_t *)p0; + uint8_t * d = dst; + + if (xskip0 != 0) { + const uint32_t p3 = *p++; + + if (xskip0 == 1) + *d++ = (p3 >> 12) & 0xff; + *d++ = (p3 >> 22) & 0xff; + + if (((x += 4) & mask) == 0) + p += slice_inc; + } + + while (x != x1) { + const uint32_t p3 = *p++; + *d++ = (p3 >> 2) & 0xff; + *d++ = (p3 >> 12) & 0xff; + *d++ = (p3 >> 22) & 0xff; + + if (((x += 4) & mask) == 0) + p += slice_inc; + } + + if (xrem1 != 0) { + const uint32_t p3 = *p; + + *d++ = (p3 >> 2) & 0xff; + if (xrem1 == 2) + *d++ = (p3 >> 12) & 0xff; + } + } +} + + + +// w/h in pixels +void av_rpi_sand16_to_sand8(uint8_t * dst, const unsigned int dst_stride1, const unsigned int dst_stride2, + const uint8_t * src, const unsigned int src_stride1, const unsigned int src_stride2, + unsigned int w, unsigned int h, const unsigned int shr) +{ + const unsigned int n = dst_stride1 / 2; + unsigned int j; + + // This is true for our current layouts + av_assert0(dst_stride1 == src_stride1); + + // As we have the same stride1 for src & dest and src is wider than dest + // then if we loop on src we can always write contiguously to dest + // We make no effort to copy an exact width - round up to nearest src stripe + // as we will always have storage in dest for that + +#if ARCH_ARM && HAVE_NEON + if (shr == 3 && src_stride1 == 128) { + for (j = 0; j + n < w; j += dst_stride1) { + uint8_t * d = dst + j * dst_stride2; + const uint8_t * s1 = src + j * 2 * src_stride2; + const uint8_t * s2 = s1 + src_stride1 * src_stride2; + + ff_rpi_sand128b_stripe_to_8_10(d, s1, s2, h); + } + } + else +#endif + { + for (j = 0; j + n < w; j += dst_stride1) { + uint8_t * d = dst + j * dst_stride2; + const uint8_t * s1 = src + j * 2 * src_stride2; + const uint8_t * s2 = s1 + src_stride1 * src_stride2; + + for (unsigned int i = 0; i != h; ++i, s1 += src_stride1, s2 += src_stride1, d += dst_stride1) { + cpy16_to_8(d, s1, n, shr); + cpy16_to_8(d + n, s2, n, shr); + } + } + } + + // Fix up a trailing dest half stripe + if (j < w) { + uint8_t * d = dst + j * dst_stride2; + const uint8_t * s1 = src + j * 2 * src_stride2; + + for (unsigned int i = 0; i != h; ++i, s1 += src_stride1, d += dst_stride1) { + cpy16_to_8(d, s1, n, shr); + } + } +} + +int av_rpi_sand_to_planar_frame(AVFrame * const dst, const AVFrame * const src) +{ + const int w = av_frame_cropped_width(src); + const int h = av_frame_cropped_height(src); + const int x = src->crop_left; + const int y = src->crop_top; + + // We will crop as part of the conversion + dst->crop_top = 0; + dst->crop_left = 0; + dst->crop_bottom = 0; + dst->crop_right = 0; + + switch (src->format){ + case AV_PIX_FMT_SAND128: + case AV_PIX_FMT_RPI4_8: + switch (dst->format){ + case AV_PIX_FMT_YUV420P: + av_rpi_sand_to_planar_y8(dst->data[0], dst->linesize[0], + src->data[0], + av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), + x, y, w, h); + av_rpi_sand_to_planar_c8(dst->data[1], dst->linesize[1], + dst->data[2], dst->linesize[2], + src->data[1], + av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), + x/2, y/2, w/2, h/2); + break; + case AV_PIX_FMT_NV12: + av_rpi_sand_to_planar_y8(dst->data[0], dst->linesize[0], + src->data[0], + av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), + x, y, w, h); + av_rpi_sand_to_planar_y8(dst->data[1], dst->linesize[1], + src->data[1], + av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), + x/2, y/2, w, h/2); + break; + default: + return -1; + } + break; + case AV_PIX_FMT_SAND64_10: + switch (dst->format){ + case AV_PIX_FMT_YUV420P10: + av_rpi_sand_to_planar_y16(dst->data[0], dst->linesize[0], + src->data[0], + av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), + x*2, y, w*2, h); + av_rpi_sand_to_planar_c16(dst->data[1], dst->linesize[1], + dst->data[2], dst->linesize[2], + src->data[1], + av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), + x, y/2, w, h/2); + break; + default: + return -1; + } + break; + case AV_PIX_FMT_RPI4_10: + switch (dst->format){ + case AV_PIX_FMT_YUV420P10: + av_rpi_sand30_to_planar_y16(dst->data[0], dst->linesize[0], + src->data[0], + av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), + x, y, w, h); + av_rpi_sand30_to_planar_c16(dst->data[1], dst->linesize[1], + dst->data[2], dst->linesize[2], + src->data[1], + av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), + x/2, y/2, w/2, h/2); + break; + case AV_PIX_FMT_NV12: + av_rpi_sand30_to_planar_y8(dst->data[0], dst->linesize[0], + src->data[0], + av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), + x, y, w, h); + av_rpi_sand30_to_planar_y8(dst->data[1], dst->linesize[1], + src->data[1], + av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), + x/2, y/2, w, h/2); + break; + default: + return -1; + } + break; + default: + return -1; + } + + return av_frame_copy_props(dst, src); +} diff --git a/libavutil/rpi_sand_fns.h b/libavutil/rpi_sand_fns.h new file mode 100644 index 0000000000..462ccb8abd --- /dev/null +++ b/libavutil/rpi_sand_fns.h @@ -0,0 +1,188 @@ +/* +Copyright (c) 2018 Raspberry Pi (Trading) Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Authors: John Cox +*/ + +#ifndef AVUTIL_RPI_SAND_FNS +#define AVUTIL_RPI_SAND_FNS + +#include "libavutil/frame.h" + +// For all these fns _x & _w are measured as coord * PW +// For the C fns coords are in chroma pels (so luma / 2) +// Strides are in bytes + +void av_rpi_sand_to_planar_y8(uint8_t * dst, const unsigned int dst_stride, + const uint8_t * src, + unsigned int stride1, unsigned int stride2, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h); +void av_rpi_sand_to_planar_y16(uint8_t * dst, const unsigned int dst_stride, + const uint8_t * src, + unsigned int stride1, unsigned int stride2, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h); + +void av_rpi_sand_to_planar_c8(uint8_t * dst_u, const unsigned int dst_stride_u, + uint8_t * dst_v, const unsigned int dst_stride_v, + const uint8_t * src, + unsigned int stride1, unsigned int stride2, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h); +void av_rpi_sand_to_planar_c16(uint8_t * dst_u, const unsigned int dst_stride_u, + uint8_t * dst_v, const unsigned int dst_stride_v, + const uint8_t * src, + unsigned int stride1, unsigned int stride2, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h); + +void av_rpi_planar_to_sand_c8(uint8_t * dst_c, + unsigned int stride1, unsigned int stride2, + const uint8_t * src_u, const unsigned int src_stride_u, + const uint8_t * src_v, const unsigned int src_stride_v, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h); +void av_rpi_planar_to_sand_c16(uint8_t * dst_c, + unsigned int stride1, unsigned int stride2, + const uint8_t * src_u, const unsigned int src_stride_u, + const uint8_t * src_v, const unsigned int src_stride_v, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h); + +void av_rpi_sand30_to_planar_y16(uint8_t * dst, const unsigned int dst_stride, + const uint8_t * src, + unsigned int stride1, unsigned int stride2, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h); +void av_rpi_sand30_to_planar_c16(uint8_t * dst_u, const unsigned int dst_stride_u, + uint8_t * dst_v, const unsigned int dst_stride_v, + const uint8_t * src, + unsigned int stride1, unsigned int stride2, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h); + +void av_rpi_sand30_to_planar_y8(uint8_t * dst, const unsigned int dst_stride, + const uint8_t * src, + unsigned int stride1, unsigned int stride2, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h); + +// w/h in pixels +void av_rpi_sand16_to_sand8(uint8_t * dst, const unsigned int dst_stride1, const unsigned int dst_stride2, + const uint8_t * src, const unsigned int src_stride1, const unsigned int src_stride2, + unsigned int w, unsigned int h, const unsigned int shr); + + +// dst must contain required pixel format & allocated data buffers +// Cropping on the src buffer will be honoured and dst crop will be set to zero +int av_rpi_sand_to_planar_frame(AVFrame * const dst, const AVFrame * const src); + + +static inline unsigned int av_rpi_sand_frame_stride1(const AVFrame * const frame) +{ +#ifdef RPI_ZC_SAND128_ONLY + // If we are sure we only only support 128 byte sand formats replace the + // var with a constant which should allow for better optimisation + return 128; +#else + return frame->linesize[0]; +#endif +} + +static inline unsigned int av_rpi_sand_frame_stride2(const AVFrame * const frame) +{ + return frame->linesize[3]; +} + + +static inline int av_rpi_is_sand_format(const int format) +{ + return (format >= AV_PIX_FMT_SAND128 && format <= AV_PIX_FMT_RPI4_10); +} + +static inline int av_rpi_is_sand_frame(const AVFrame * const frame) +{ + return av_rpi_is_sand_format(frame->format); +} + +static inline int av_rpi_is_sand8_frame(const AVFrame * const frame) +{ + return (frame->format == AV_PIX_FMT_SAND128 || frame->format == AV_PIX_FMT_RPI4_8); +} + +static inline int av_rpi_is_sand16_frame(const AVFrame * const frame) +{ + return (frame->format >= AV_PIX_FMT_SAND64_10 && frame->format <= AV_PIX_FMT_SAND64_16); +} + +static inline int av_rpi_is_sand30_frame(const AVFrame * const frame) +{ + return (frame->format == AV_PIX_FMT_RPI4_10); +} + +static inline int av_rpi_sand_frame_xshl(const AVFrame * const frame) +{ + return av_rpi_is_sand8_frame(frame) ? 0 : 1; +} + +// If x is measured in bytes (not pixels) then this works for sand64_16 as +// well as sand128 - but in the general case we work that out + +static inline unsigned int av_rpi_sand_frame_off_y(const AVFrame * const frame, const unsigned int x_y, const unsigned int y) +{ + const unsigned int stride1 = av_rpi_sand_frame_stride1(frame); + const unsigned int stride2 = av_rpi_sand_frame_stride2(frame); + const unsigned int x = x_y << av_rpi_sand_frame_xshl(frame); + const unsigned int x1 = x & (stride1 - 1); + const unsigned int x2 = x ^ x1; + + return x1 + stride1 * y + stride2 * x2; +} + +static inline unsigned int av_rpi_sand_frame_off_c(const AVFrame * const frame, const unsigned int x_c, const unsigned int y_c) +{ + const unsigned int stride1 = av_rpi_sand_frame_stride1(frame); + const unsigned int stride2 = av_rpi_sand_frame_stride2(frame); + const unsigned int x = x_c << (av_rpi_sand_frame_xshl(frame) + 1); + const unsigned int x1 = x & (stride1 - 1); + const unsigned int x2 = x ^ x1; + + return x1 + stride1 * y_c + stride2 * x2; +} + +static inline uint8_t * av_rpi_sand_frame_pos_y(const AVFrame * const frame, const unsigned int x, const unsigned int y) +{ + return frame->data[0] + av_rpi_sand_frame_off_y(frame, x, y); +} + +static inline uint8_t * av_rpi_sand_frame_pos_c(const AVFrame * const frame, const unsigned int x, const unsigned int y) +{ + return frame->data[1] + av_rpi_sand_frame_off_c(frame, x, y); +} + +#endif + diff --git a/libswscale/aarch64/rgb2rgb.c b/libswscale/aarch64/rgb2rgb.c index a9bf6ff9e0..6a0e2dcc09 100644 --- a/libswscale/aarch64/rgb2rgb.c +++ b/libswscale/aarch64/rgb2rgb.c @@ -30,6 +30,12 @@ void ff_interleave_bytes_neon(const uint8_t *src1, const uint8_t *src2, uint8_t *dest, int width, int height, int src1Stride, int src2Stride, int dstStride); +void ff_bgr24toyv12_aarch64(const uint8_t *src, uint8_t *ydst, uint8_t *udst, + uint8_t *vdst, int width, int height, int lumStride, + int chromStride, int srcStride, int32_t *rgb2yuv); +void ff_rgb24toyv12_aarch64(const uint8_t *src, uint8_t *ydst, uint8_t *udst, + uint8_t *vdst, int width, int height, int lumStride, + int chromStride, int srcStride, int32_t *rgb2yuv); av_cold void rgb2rgb_init_aarch64(void) { @@ -37,5 +43,7 @@ av_cold void rgb2rgb_init_aarch64(void) if (have_neon(cpu_flags)) { interleaveBytes = ff_interleave_bytes_neon; + ff_rgb24toyv12 = ff_rgb24toyv12_aarch64; + ff_bgr24toyv12 = ff_bgr24toyv12_aarch64; } } diff --git a/libswscale/aarch64/rgb2rgb_neon.S b/libswscale/aarch64/rgb2rgb_neon.S index d81110ec57..476ca723a0 100644 --- a/libswscale/aarch64/rgb2rgb_neon.S +++ b/libswscale/aarch64/rgb2rgb_neon.S @@ -77,3 +77,448 @@ function ff_interleave_bytes_neon, export=1 0: ret endfunc + +// void ff_rgb24toyv12_aarch64( +// const uint8_t *src, // x0 +// uint8_t *ydst, // x1 +// uint8_t *udst, // x2 +// uint8_t *vdst, // x3 +// int width, // w4 +// int height, // w5 +// int lumStride, // w6 +// int chromStride, // w7 +// int srcStr, // [sp, #0] +// int32_t *rgb2yuv); // [sp, #8] + +function ff_rgb24toyv12_aarch64, export=1 + ldr x15, [sp, #8] + ld1 {v3.s}[2], [x15], #4 + ld1 {v3.s}[1], [x15], #4 + ld1 {v3.s}[0], [x15], #4 + ld1 {v4.s}[2], [x15], #4 + ld1 {v4.s}[1], [x15], #4 + ld1 {v4.s}[0], [x15], #4 + ld1 {v5.s}[2], [x15], #4 + ld1 {v5.s}[1], [x15], #4 + ld1 {v5.s}[0], [x15] + b 99f +endfunc + +// void ff_bgr24toyv12_aarch64( +// const uint8_t *src, // x0 +// uint8_t *ydst, // x1 +// uint8_t *udst, // x2 +// uint8_t *vdst, // x3 +// int width, // w4 +// int height, // w5 +// int lumStride, // w6 +// int chromStride, // w7 +// int srcStr, // [sp, #0] +// int32_t *rgb2yuv); // [sp, #8] + +// regs +// v0-2 Src bytes - reused as chroma src +// v3-5 Coeffs (packed very inefficiently - could be squashed) +// v6 128b +// v7 128h +// v8-15 Reserved +// v16-18 Lo Src expanded as H +// v19 - +// v20-22 Hi Src expanded as H +// v23 - +// v24 U out +// v25 U tmp +// v26 Y out +// v27-29 Y tmp +// v30 V out +// v31 V tmp + +// Assumes Little Endian in tail stores & conversion matrix + +function ff_bgr24toyv12_aarch64, export=1 + ldr x15, [sp, #8] + ld3 {v3.s, v4.s, v5.s}[0], [x15], #12 + ld3 {v3.s, v4.s, v5.s}[1], [x15], #12 + ld3 {v3.s, v4.s, v5.s}[2], [x15] +99: + ldr w14, [sp, #0] + movi v7.8b, #128 + uxtl v6.8h, v7.8b + // Ensure if nothing to do then we do nothing + cmp w4, #0 + b.le 90f + cmp w5, #0 + b.le 90f + // If w % 16 != 0 then -16 so we do main loop 1 fewer times with + // the remainder done in the tail + tst w4, #15 + b.eq 1f + sub w4, w4, #16 +1: + +// -------------------- Even line body - YUV +11: + subs w9, w4, #0 + mov x10, x0 + mov x11, x1 + mov x12, x2 + mov x13, x3 + b.lt 12f + + ld3 {v0.16b, v1.16b, v2.16b}, [x10], #48 + subs w9, w9, #16 + b.le 13f + +10: + uxtl v16.8h, v0.8b + uxtl v17.8h, v1.8b + uxtl v18.8h, v2.8b + + uxtl2 v20.8h, v0.16b + uxtl2 v21.8h, v1.16b + uxtl2 v22.8h, v2.16b + + bic v0.8h, #0xff, LSL #8 + bic v1.8h, #0xff, LSL #8 + bic v2.8h, #0xff, LSL #8 + + // Testing shows it is faster to stack the smull/smlal ops together + // rather than interleave them between channels and indeed even the + // shift/add sections seem happier not interleaved + + // Y0 + smull v26.4s, v16.4h, v3.h[0] + smlal v26.4s, v17.4h, v4.h[0] + smlal v26.4s, v18.4h, v5.h[0] + smull2 v27.4s, v16.8h, v3.h[0] + smlal2 v27.4s, v17.8h, v4.h[0] + smlal2 v27.4s, v18.8h, v5.h[0] + // Y1 + smull v28.4s, v20.4h, v3.h[0] + smlal v28.4s, v21.4h, v4.h[0] + smlal v28.4s, v22.4h, v5.h[0] + smull2 v29.4s, v20.8h, v3.h[0] + smlal2 v29.4s, v21.8h, v4.h[0] + smlal2 v29.4s, v22.8h, v5.h[0] + shrn v26.4h, v26.4s, #12 + shrn2 v26.8h, v27.4s, #12 + add v26.8h, v26.8h, v6.8h // +128 (>> 3 = 16) + sqrshrun v26.8b, v26.8h, #3 + shrn v28.4h, v28.4s, #12 + shrn2 v28.8h, v29.4s, #12 + add v28.8h, v28.8h, v6.8h + sqrshrun2 v26.16b, v28.8h, #3 + // Y0/Y1 + + // U + // Vector subscript *2 as we loaded into S but are only using H + smull v24.4s, v0.4h, v3.h[2] + smlal v24.4s, v1.4h, v4.h[2] + smlal v24.4s, v2.4h, v5.h[2] + smull2 v25.4s, v0.8h, v3.h[2] + smlal2 v25.4s, v1.8h, v4.h[2] + smlal2 v25.4s, v2.8h, v5.h[2] + + // V + smull v30.4s, v0.4h, v3.h[4] + smlal v30.4s, v1.4h, v4.h[4] + smlal v30.4s, v2.4h, v5.h[4] + smull2 v31.4s, v0.8h, v3.h[4] + smlal2 v31.4s, v1.8h, v4.h[4] + smlal2 v31.4s, v2.8h, v5.h[4] + + ld3 {v0.16b, v1.16b, v2.16b}, [x10], #48 + + shrn v24.4h, v24.4s, #14 + shrn2 v24.8h, v25.4s, #14 + sqrshrn v24.8b, v24.8h, #1 + add v24.8b, v24.8b, v7.8b // +128 + shrn v30.4h, v30.4s, #14 + shrn2 v30.8h, v31.4s, #14 + sqrshrn v30.8b, v30.8h, #1 + add v30.8b, v30.8b, v7.8b // +128 + + subs w9, w9, #16 + + st1 {v26.16b}, [x11], #16 + st1 {v24.8b}, [x12], #8 + st1 {v30.8b}, [x13], #8 + + b.gt 10b + +// -------------------- Even line tail - YUV +// If width % 16 == 0 then simply runs once with preloaded RGB +// If other then deals with preload & then does remaining tail + +13: + // Body is simple copy of main loop body minus preload + + uxtl v16.8h, v0.8b + uxtl v17.8h, v1.8b + uxtl v18.8h, v2.8b + + uxtl2 v20.8h, v0.16b + uxtl2 v21.8h, v1.16b + uxtl2 v22.8h, v2.16b + + bic v0.8h, #0xff, LSL #8 + bic v1.8h, #0xff, LSL #8 + bic v2.8h, #0xff, LSL #8 + + // Y0 + smull v26.4s, v16.4h, v3.h[0] + smlal v26.4s, v17.4h, v4.h[0] + smlal v26.4s, v18.4h, v5.h[0] + smull2 v27.4s, v16.8h, v3.h[0] + smlal2 v27.4s, v17.8h, v4.h[0] + smlal2 v27.4s, v18.8h, v5.h[0] + // Y1 + smull v28.4s, v20.4h, v3.h[0] + smlal v28.4s, v21.4h, v4.h[0] + smlal v28.4s, v22.4h, v5.h[0] + smull2 v29.4s, v20.8h, v3.h[0] + smlal2 v29.4s, v21.8h, v4.h[0] + smlal2 v29.4s, v22.8h, v5.h[0] + shrn v26.4h, v26.4s, #12 + shrn2 v26.8h, v27.4s, #12 + add v26.8h, v26.8h, v6.8h // +128 (>> 3 = 16) + sqrshrun v26.8b, v26.8h, #3 + shrn v28.4h, v28.4s, #12 + shrn2 v28.8h, v29.4s, #12 + add v28.8h, v28.8h, v6.8h + sqrshrun2 v26.16b, v28.8h, #3 + // Y0/Y1 + + // U + // Vector subscript *2 as we loaded into S but are only using H + smull v24.4s, v0.4h, v3.h[2] + smlal v24.4s, v1.4h, v4.h[2] + smlal v24.4s, v2.4h, v5.h[2] + smull2 v25.4s, v0.8h, v3.h[2] + smlal2 v25.4s, v1.8h, v4.h[2] + smlal2 v25.4s, v2.8h, v5.h[2] + + // V + smull v30.4s, v0.4h, v3.h[4] + smlal v30.4s, v1.4h, v4.h[4] + smlal v30.4s, v2.4h, v5.h[4] + smull2 v31.4s, v0.8h, v3.h[4] + smlal2 v31.4s, v1.8h, v4.h[4] + smlal2 v31.4s, v2.8h, v5.h[4] + + cmp w9, #-16 + + shrn v24.4h, v24.4s, #14 + shrn2 v24.8h, v25.4s, #14 + sqrshrn v24.8b, v24.8h, #1 + add v24.8b, v24.8b, v7.8b // +128 + shrn v30.4h, v30.4s, #14 + shrn2 v30.8h, v31.4s, #14 + sqrshrn v30.8b, v30.8h, #1 + add v30.8b, v30.8b, v7.8b // +128 + + // Here: + // w9 == 0 width % 16 == 0, tail done + // w9 > -16 1st tail done (16 pels), remainder still to go + // w9 == -16 shouldn't happen + // w9 > -32 2nd tail done + // w9 <= -32 shouldn't happen + + b.lt 2f + st1 {v26.16b}, [x11], #16 + st1 {v24.8b}, [x12], #8 + st1 {v30.8b}, [x13], #8 + cbz w9, 3f + +12: + sub w9, w9, #16 + + tbz w9, #3, 1f + ld3 {v0.8b, v1.8b, v2.8b}, [x10], #24 +1: tbz w9, #2, 1f + ld3 {v0.b, v1.b, v2.b}[8], [x10], #3 + ld3 {v0.b, v1.b, v2.b}[9], [x10], #3 + ld3 {v0.b, v1.b, v2.b}[10], [x10], #3 + ld3 {v0.b, v1.b, v2.b}[11], [x10], #3 +1: tbz w9, #1, 1f + ld3 {v0.b, v1.b, v2.b}[12], [x10], #3 + ld3 {v0.b, v1.b, v2.b}[13], [x10], #3 +1: tbz w9, #0, 13b + ld3 {v0.b, v1.b, v2.b}[14], [x10], #3 + b 13b + +2: + tbz w9, #3, 1f + st1 {v26.8b}, [x11], #8 + st1 {v24.s}[0], [x12], #4 + st1 {v30.s}[0], [x13], #4 +1: tbz w9, #2, 1f + st1 {v26.s}[2], [x11], #4 + st1 {v24.h}[2], [x12], #2 + st1 {v30.h}[2], [x13], #2 +1: tbz w9, #1, 1f + st1 {v26.h}[6], [x11], #2 + st1 {v24.b}[6], [x12], #1 + st1 {v30.b}[6], [x13], #1 +1: tbz w9, #0, 1f + st1 {v26.b}[14], [x11] + st1 {v24.b}[7], [x12] + st1 {v30.b}[7], [x13] +1: +3: + +// -------------------- Odd line body - Y only + + subs w5, w5, #1 + b.eq 90f + + subs w9, w4, #0 + add x0, x0, w14, SXTX + add x1, x1, w6, SXTX + mov x10, x0 + mov x11, x1 + b.lt 12f + + ld3 {v0.16b, v1.16b, v2.16b}, [x10], #48 + subs w9, w9, #16 + b.le 13f + +10: + uxtl v16.8h, v0.8b + uxtl v17.8h, v1.8b + uxtl v18.8h, v2.8b + + uxtl2 v20.8h, v0.16b + uxtl2 v21.8h, v1.16b + uxtl2 v22.8h, v2.16b + + // Testing shows it is faster to stack the smull/smlal ops together + // rather than interleave them between channels and indeed even the + // shift/add sections seem happier not interleaved + + // Y0 + smull v26.4s, v16.4h, v3.h[0] + smlal v26.4s, v17.4h, v4.h[0] + smlal v26.4s, v18.4h, v5.h[0] + smull2 v27.4s, v16.8h, v3.h[0] + smlal2 v27.4s, v17.8h, v4.h[0] + smlal2 v27.4s, v18.8h, v5.h[0] + // Y1 + smull v28.4s, v20.4h, v3.h[0] + smlal v28.4s, v21.4h, v4.h[0] + smlal v28.4s, v22.4h, v5.h[0] + smull2 v29.4s, v20.8h, v3.h[0] + smlal2 v29.4s, v21.8h, v4.h[0] + smlal2 v29.4s, v22.8h, v5.h[0] + + ld3 {v0.16b, v1.16b, v2.16b}, [x10], #48 + + shrn v26.4h, v26.4s, #12 + shrn2 v26.8h, v27.4s, #12 + add v26.8h, v26.8h, v6.8h // +128 (>> 3 = 16) + sqrshrun v26.8b, v26.8h, #3 + shrn v28.4h, v28.4s, #12 + shrn2 v28.8h, v29.4s, #12 + add v28.8h, v28.8h, v6.8h + sqrshrun2 v26.16b, v28.8h, #3 + // Y0/Y1 + + subs w9, w9, #16 + + st1 {v26.16b}, [x11], #16 + + b.gt 10b + +// -------------------- Odd line tail - Y +// If width % 16 == 0 then simply runs once with preloaded RGB +// If other then deals with preload & then does remaining tail + +13: + // Body is simple copy of main loop body minus preload + + uxtl v16.8h, v0.8b + uxtl v17.8h, v1.8b + uxtl v18.8h, v2.8b + + uxtl2 v20.8h, v0.16b + uxtl2 v21.8h, v1.16b + uxtl2 v22.8h, v2.16b + + // Y0 + smull v26.4s, v16.4h, v3.h[0] + smlal v26.4s, v17.4h, v4.h[0] + smlal v26.4s, v18.4h, v5.h[0] + smull2 v27.4s, v16.8h, v3.h[0] + smlal2 v27.4s, v17.8h, v4.h[0] + smlal2 v27.4s, v18.8h, v5.h[0] + // Y1 + smull v28.4s, v20.4h, v3.h[0] + smlal v28.4s, v21.4h, v4.h[0] + smlal v28.4s, v22.4h, v5.h[0] + smull2 v29.4s, v20.8h, v3.h[0] + smlal2 v29.4s, v21.8h, v4.h[0] + smlal2 v29.4s, v22.8h, v5.h[0] + + cmp w9, #-16 + + shrn v26.4h, v26.4s, #12 + shrn2 v26.8h, v27.4s, #12 + add v26.8h, v26.8h, v6.8h // +128 (>> 3 = 16) + sqrshrun v26.8b, v26.8h, #3 + shrn v28.4h, v28.4s, #12 + shrn2 v28.8h, v29.4s, #12 + add v28.8h, v28.8h, v6.8h + sqrshrun2 v26.16b, v28.8h, #3 + // Y0/Y1 + + // Here: + // w9 == 0 width % 16 == 0, tail done + // w9 > -16 1st tail done (16 pels), remainder still to go + // w9 == -16 shouldn't happen + // w9 > -32 2nd tail done + // w9 <= -32 shouldn't happen + + b.lt 2f + st1 {v26.16b}, [x11], #16 + cbz w9, 3f + +12: + sub w9, w9, #16 + + tbz w9, #3, 1f + ld3 {v0.8b, v1.8b, v2.8b}, [x10], #24 +1: tbz w9, #2, 1f + ld3 {v0.b, v1.b, v2.b}[8], [x10], #3 + ld3 {v0.b, v1.b, v2.b}[9], [x10], #3 + ld3 {v0.b, v1.b, v2.b}[10], [x10], #3 + ld3 {v0.b, v1.b, v2.b}[11], [x10], #3 +1: tbz w9, #1, 1f + ld3 {v0.b, v1.b, v2.b}[12], [x10], #3 + ld3 {v0.b, v1.b, v2.b}[13], [x10], #3 +1: tbz w9, #0, 13b + ld3 {v0.b, v1.b, v2.b}[14], [x10], #3 + b 13b + +2: + tbz w9, #3, 1f + st1 {v26.8b}, [x11], #8 +1: tbz w9, #2, 1f + st1 {v26.s}[2], [x11], #4 +1: tbz w9, #1, 1f + st1 {v26.h}[6], [x11], #2 +1: tbz w9, #0, 1f + st1 {v26.b}[14], [x11] +1: +3: + +// ------------------- Loop to start + + add x0, x0, w14, SXTX + add x1, x1, w6, SXTX + add x2, x2, w7, SXTX + add x3, x3, w7, SXTX + subs w5, w5, #1 + b.gt 11b +90: + ret +endfunc diff --git a/libswscale/rgb2rgb.c b/libswscale/rgb2rgb.c index a7300f3ba4..ba1db155b0 100644 --- a/libswscale/rgb2rgb.c +++ b/libswscale/rgb2rgb.c @@ -83,6 +83,31 @@ void (*ff_rgb24toyv12)(const uint8_t *src, uint8_t *ydst, int width, int height, int lumStride, int chromStride, int srcStride, int32_t *rgb2yuv); +void (*ff_bgr24toyv12)(const uint8_t *src, uint8_t *ydst, + uint8_t *udst, uint8_t *vdst, + int width, int height, + int lumStride, int chromStride, int srcStride, + int32_t *rgb2yuv); +void (*ff_rgbxtoyv12)(const uint8_t *src, uint8_t *ydst, + uint8_t *udst, uint8_t *vdst, + int width, int height, + int lumStride, int chromStride, int srcStride, + int32_t *rgb2yuv); +void (*ff_bgrxtoyv12)(const uint8_t *src, uint8_t *ydst, + uint8_t *udst, uint8_t *vdst, + int width, int height, + int lumStride, int chromStride, int srcStride, + int32_t *rgb2yuv); +void (*ff_xrgbtoyv12)(const uint8_t *src, uint8_t *ydst, + uint8_t *udst, uint8_t *vdst, + int width, int height, + int lumStride, int chromStride, int srcStride, + int32_t *rgb2yuv); +void (*ff_xbgrtoyv12)(const uint8_t *src, uint8_t *ydst, + uint8_t *udst, uint8_t *vdst, + int width, int height, + int lumStride, int chromStride, int srcStride, + int32_t *rgb2yuv); void (*planar2x)(const uint8_t *src, uint8_t *dst, int width, int height, int srcStride, int dstStride); void (*interleaveBytes)(const uint8_t *src1, const uint8_t *src2, uint8_t *dst, diff --git a/libswscale/rgb2rgb.h b/libswscale/rgb2rgb.h index 48bba1586a..6329533f18 100644 --- a/libswscale/rgb2rgb.h +++ b/libswscale/rgb2rgb.h @@ -82,6 +82,9 @@ void rgb12to15(const uint8_t *src, uint8_t *dst, int src_size); void ff_rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, int width, int height, int lumStride, int chromStride, int srcStride, int32_t *rgb2yuv); +void ff_bgr24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, + uint8_t *vdst, int width, int height, int lumStride, + int chromStride, int srcStride, int32_t *rgb2yuv); /** * Height should be a multiple of 2 and width should be a multiple of 16. @@ -131,6 +134,26 @@ extern void (*ff_rgb24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, int width, int height, int lumStride, int chromStride, int srcStride, int32_t *rgb2yuv); +extern void (*ff_bgr24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, + int width, int height, + int lumStride, int chromStride, int srcStride, + int32_t *rgb2yuv); +extern void (*ff_rgbxtoyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, + int width, int height, + int lumStride, int chromStride, int srcStride, + int32_t *rgb2yuv); +extern void (*ff_bgrxtoyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, + int width, int height, + int lumStride, int chromStride, int srcStride, + int32_t *rgb2yuv); +extern void (*ff_xrgbtoyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, + int width, int height, + int lumStride, int chromStride, int srcStride, + int32_t *rgb2yuv); +extern void (*ff_xbgrtoyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, + int width, int height, + int lumStride, int chromStride, int srcStride, + int32_t *rgb2yuv); extern void (*planar2x)(const uint8_t *src, uint8_t *dst, int width, int height, int srcStride, int dstStride); diff --git a/libswscale/rgb2rgb_template.c b/libswscale/rgb2rgb_template.c index 42c69801ba..e711589e1e 100644 --- a/libswscale/rgb2rgb_template.c +++ b/libswscale/rgb2rgb_template.c @@ -646,13 +646,14 @@ static inline void uyvytoyv12_c(const uint8_t *src, uint8_t *ydst, * others are ignored in the C version. * FIXME: Write HQ version. */ -void ff_rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, +static void rgb24toyv12_x(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, int width, int height, int lumStride, - int chromStride, int srcStride, int32_t *rgb2yuv) + int chromStride, int srcStride, int32_t *rgb2yuv, + const uint8_t x[9]) { - int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX]; - int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX]; - int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX]; + int32_t ry = rgb2yuv[x[0]], gy = rgb2yuv[x[1]], by = rgb2yuv[x[2]]; + int32_t ru = rgb2yuv[x[3]], gu = rgb2yuv[x[4]], bu = rgb2yuv[x[5]]; + int32_t rv = rgb2yuv[x[6]], gv = rgb2yuv[x[7]], bv = rgb2yuv[x[8]]; int y; const int chromWidth = width >> 1; @@ -678,6 +679,19 @@ void ff_rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; ydst[2 * i + 1] = Y; } + if ((width & 1) != 0) { + unsigned int b = src[6 * i + 0]; + unsigned int g = src[6 * i + 1]; + unsigned int r = src[6 * i + 2]; + + unsigned int Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; + unsigned int V = ((rv * r + gv * g + bv * b) >> RGB2YUV_SHIFT) + 128; + unsigned int U = ((ru * r + gu * g + bu * b) >> RGB2YUV_SHIFT) + 128; + + udst[i] = U; + vdst[i] = V; + ydst[2 * i] = Y; + } ydst += lumStride; src += srcStride; @@ -700,6 +714,125 @@ void ff_rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; ydst[2 * i + 1] = Y; } + if ((width & 1) != 0) { + unsigned int b = src[6 * i + 0]; + unsigned int g = src[6 * i + 1]; + unsigned int r = src[6 * i + 2]; + + unsigned int Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; + + ydst[2 * i] = Y; + } + udst += chromStride; + vdst += chromStride; + ydst += lumStride; + src += srcStride; + } +} + +static const uint8_t x_rgb[9] = { + RY_IDX, GY_IDX, BY_IDX, + RU_IDX, GU_IDX, BU_IDX, + RV_IDX, GV_IDX, BV_IDX, +}; + +static const uint8_t x_bgr[9] = { + BY_IDX, GY_IDX, RY_IDX, + BU_IDX, GU_IDX, RU_IDX, + BV_IDX, GV_IDX, RV_IDX, +}; + +void ff_rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, + uint8_t *vdst, int width, int height, int lumStride, + int chromStride, int srcStride, int32_t *rgb2yuv) +{ + rgb24toyv12_x(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv, x_rgb); +} + +void ff_bgr24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, + uint8_t *vdst, int width, int height, int lumStride, + int chromStride, int srcStride, int32_t *rgb2yuv) +{ + rgb24toyv12_x(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv, x_bgr); +} + +static void rgbxtoyv12_x(const uint8_t *src, uint8_t *ydst, uint8_t *udst, + uint8_t *vdst, int width, int height, int lumStride, + int chromStride, int srcStride, int32_t *rgb2yuv, + const uint8_t x[9]) +{ + int32_t ry = rgb2yuv[x[0]], gy = rgb2yuv[x[1]], by = rgb2yuv[x[2]]; + int32_t ru = rgb2yuv[x[3]], gu = rgb2yuv[x[4]], bu = rgb2yuv[x[5]]; + int32_t rv = rgb2yuv[x[6]], gv = rgb2yuv[x[7]], bv = rgb2yuv[x[8]]; + int y; + const int chromWidth = width >> 1; + + for (y = 0; y < height; y += 2) { + int i; + for (i = 0; i < chromWidth; i++) { + unsigned int b = src[8 * i + 2]; + unsigned int g = src[8 * i + 1]; + unsigned int r = src[8 * i + 0]; + + unsigned int Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; + unsigned int V = ((rv * r + gv * g + bv * b) >> RGB2YUV_SHIFT) + 128; + unsigned int U = ((ru * r + gu * g + bu * b) >> RGB2YUV_SHIFT) + 128; + + udst[i] = U; + vdst[i] = V; + ydst[2 * i] = Y; + + b = src[8 * i + 6]; + g = src[8 * i + 5]; + r = src[8 * i + 4]; + + Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; + ydst[2 * i + 1] = Y; + } + if ((width & 1) != 0) { + unsigned int b = src[8 * i + 2]; + unsigned int g = src[8 * i + 1]; + unsigned int r = src[8 * i + 0]; + + unsigned int Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; + unsigned int V = ((rv * r + gv * g + bv * b) >> RGB2YUV_SHIFT) + 128; + unsigned int U = ((ru * r + gu * g + bu * b) >> RGB2YUV_SHIFT) + 128; + + udst[i] = U; + vdst[i] = V; + ydst[2 * i] = Y; + } + ydst += lumStride; + src += srcStride; + + if (y+1 == height) + break; + + for (i = 0; i < chromWidth; i++) { + unsigned int b = src[8 * i + 2]; + unsigned int g = src[8 * i + 1]; + unsigned int r = src[8 * i + 0]; + + unsigned int Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; + + ydst[2 * i] = Y; + + b = src[8 * i + 6]; + g = src[8 * i + 5]; + r = src[8 * i + 4]; + + Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; + ydst[2 * i + 1] = Y; + } + if ((width & 1) != 0) { + unsigned int b = src[8 * i + 2]; + unsigned int g = src[8 * i + 1]; + unsigned int r = src[8 * i + 0]; + + unsigned int Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; + + ydst[2 * i] = Y; + } udst += chromStride; vdst += chromStride; ydst += lumStride; @@ -707,6 +840,37 @@ void ff_rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, } } +static void ff_rgbxtoyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, + uint8_t *vdst, int width, int height, int lumStride, + int chromStride, int srcStride, int32_t *rgb2yuv) +{ + rgbxtoyv12_x(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv, x_rgb); +} + +static void ff_bgrxtoyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, + uint8_t *vdst, int width, int height, int lumStride, + int chromStride, int srcStride, int32_t *rgb2yuv) +{ + rgbxtoyv12_x(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv, x_bgr); +} + +// As the general code does no SIMD-like ops simply adding 1 to the src address +// will fix the ignored alpha position +static void ff_xrgbtoyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, + uint8_t *vdst, int width, int height, int lumStride, + int chromStride, int srcStride, int32_t *rgb2yuv) +{ + rgbxtoyv12_x(src + 1, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv, x_rgb); +} + +static void ff_xbgrtoyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, + uint8_t *vdst, int width, int height, int lumStride, + int chromStride, int srcStride, int32_t *rgb2yuv) +{ + rgbxtoyv12_x(src + 1, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv, x_bgr); +} + + static void interleaveBytes_c(const uint8_t *src1, const uint8_t *src2, uint8_t *dest, int width, int height, int src1Stride, int src2Stride, int dstStride) @@ -980,6 +1144,11 @@ static av_cold void rgb2rgb_init_c(void) yuy2toyv12 = yuy2toyv12_c; planar2x = planar2x_c; ff_rgb24toyv12 = ff_rgb24toyv12_c; + ff_bgr24toyv12 = ff_bgr24toyv12_c; + ff_rgbxtoyv12 = ff_rgbxtoyv12_c; + ff_bgrxtoyv12 = ff_bgrxtoyv12_c; + ff_xrgbtoyv12 = ff_xrgbtoyv12_c; + ff_xbgrtoyv12 = ff_xbgrtoyv12_c; interleaveBytes = interleaveBytes_c; deinterleaveBytes = deinterleaveBytes_c; vu9_to_vu12 = vu9_to_vu12_c; diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c index c4dd8a4d83..da38d7f8ac 100644 --- a/libswscale/swscale_unscaled.c +++ b/libswscale/swscale_unscaled.c @@ -1655,6 +1655,91 @@ static int bgr24ToYv12Wrapper(SwsContext *c, const uint8_t *src[], return srcSliceH; } +static int rgb24ToYv12Wrapper(SwsContext *c, const uint8_t *src[], + int srcStride[], int srcSliceY, int srcSliceH, + uint8_t *dst[], int dstStride[]) +{ + ff_bgr24toyv12( + src[0], + dst[0] + srcSliceY * dstStride[0], + dst[1] + (srcSliceY >> 1) * dstStride[1], + dst[2] + (srcSliceY >> 1) * dstStride[2], + c->srcW, srcSliceH, + dstStride[0], dstStride[1], srcStride[0], + c->input_rgb2yuv_table); + if (dst[3]) + fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); + return srcSliceH; +} + +static int bgrxToYv12Wrapper(SwsContext *c, const uint8_t *src[], + int srcStride[], int srcSliceY, int srcSliceH, + uint8_t *dst[], int dstStride[]) +{ + ff_bgrxtoyv12( + src[0], + dst[0] + srcSliceY * dstStride[0], + dst[1] + (srcSliceY >> 1) * dstStride[1], + dst[2] + (srcSliceY >> 1) * dstStride[2], + c->srcW, srcSliceH, + dstStride[0], dstStride[1], srcStride[0], + c->input_rgb2yuv_table); + if (dst[3]) + fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); + return srcSliceH; +} + +static int rgbxToYv12Wrapper(SwsContext *c, const uint8_t *src[], + int srcStride[], int srcSliceY, int srcSliceH, + uint8_t *dst[], int dstStride[]) +{ + ff_rgbxtoyv12( + src[0], + dst[0] + srcSliceY * dstStride[0], + dst[1] + (srcSliceY >> 1) * dstStride[1], + dst[2] + (srcSliceY >> 1) * dstStride[2], + c->srcW, srcSliceH, + dstStride[0], dstStride[1], srcStride[0], + c->input_rgb2yuv_table); + if (dst[3]) + fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); + return srcSliceH; +} + +static int xbgrToYv12Wrapper(SwsContext *c, const uint8_t *src[], + int srcStride[], int srcSliceY, int srcSliceH, + uint8_t *dst[], int dstStride[]) +{ + ff_xbgrtoyv12( + src[0], + dst[0] + srcSliceY * dstStride[0], + dst[1] + (srcSliceY >> 1) * dstStride[1], + dst[2] + (srcSliceY >> 1) * dstStride[2], + c->srcW, srcSliceH, + dstStride[0], dstStride[1], srcStride[0], + c->input_rgb2yuv_table); + if (dst[3]) + fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); + return srcSliceH; +} + +static int xrgbToYv12Wrapper(SwsContext *c, const uint8_t *src[], + int srcStride[], int srcSliceY, int srcSliceH, + uint8_t *dst[], int dstStride[]) +{ + ff_xrgbtoyv12( + src[0], + dst[0] + srcSliceY * dstStride[0], + dst[1] + (srcSliceY >> 1) * dstStride[1], + dst[2] + (srcSliceY >> 1) * dstStride[2], + c->srcW, srcSliceH, + dstStride[0], dstStride[1], srcStride[0], + c->input_rgb2yuv_table); + if (dst[3]) + fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); + return srcSliceH; +} + static int yvu9ToYv12Wrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[]) @@ -2035,6 +2120,32 @@ void ff_get_unscaled_swscale(SwsContext *c) (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P) && !(flags & SWS_ACCURATE_RND)) c->swscale = bgr24ToYv12Wrapper; + /* rgb24toYV12 */ + if (srcFormat == AV_PIX_FMT_RGB24 && + (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P) && + !(flags & SWS_ACCURATE_RND)) + c->swscale = rgb24ToYv12Wrapper; + + /* bgrxtoYV12 */ + if (((srcFormat == AV_PIX_FMT_BGRA && dstFormat == AV_PIX_FMT_YUV420P) || + (srcFormat == AV_PIX_FMT_BGR0 && (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P))) && + !(flags & SWS_ACCURATE_RND)) + c->swscale = bgrxToYv12Wrapper; + /* rgbx24toYV12 */ + if (((srcFormat == AV_PIX_FMT_RGBA && dstFormat == AV_PIX_FMT_YUV420P) || + (srcFormat == AV_PIX_FMT_RGB0 && (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P))) && + !(flags & SWS_ACCURATE_RND)) + c->swscale = rgbxToYv12Wrapper; + /* xbgrtoYV12 */ + if (((srcFormat == AV_PIX_FMT_ABGR && dstFormat == AV_PIX_FMT_YUV420P) || + (srcFormat == AV_PIX_FMT_0BGR && (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P))) && + !(flags & SWS_ACCURATE_RND)) + c->swscale = xbgrToYv12Wrapper; + /* xrgb24toYV12 */ + if (((srcFormat == AV_PIX_FMT_ARGB && dstFormat == AV_PIX_FMT_YUV420P) || + (srcFormat == AV_PIX_FMT_0RGB && (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P))) && + !(flags & SWS_ACCURATE_RND)) + c->swscale = xrgbToYv12Wrapper; /* RGB/BGR -> RGB/BGR (no dither needed forms) */ if (isAnyRGB(srcFormat) && isAnyRGB(dstFormat) && findRgbConvFn(c) diff --git a/libswscale/tests/swscale.c b/libswscale/tests/swscale.c index 6c38041ddb..12776ffec7 100644 --- a/libswscale/tests/swscale.c +++ b/libswscale/tests/swscale.c @@ -23,6 +23,7 @@ #include #include #include +#include #undef HAVE_AV_CONFIG_H #include "libavutil/cpu.h" @@ -78,6 +79,15 @@ struct Results { uint32_t crc; }; +static int time_rep = 0; + +static uint64_t utime(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return ts.tv_nsec / 1000 + (uint64_t)ts.tv_sec * 1000000; +} + // test by ref -> src -> dst -> out & compare out against ref // ref & out are YV12 static int doTest(const uint8_t * const ref[4], int refStride[4], int w, int h, @@ -174,7 +184,7 @@ static int doTest(const uint8_t * const ref[4], int refStride[4], int w, int h, goto end; } - printf(" %s %dx%d -> %s %3dx%3d flags=%2d", + printf(" %s %4dx%4d -> %s %4dx%4d flags=%2d", desc_src->name, srcW, srcH, desc_dst->name, dstW, dstH, flags); @@ -182,6 +192,17 @@ static int doTest(const uint8_t * const ref[4], int refStride[4], int w, int h, sws_scale(dstContext, (const uint8_t * const*)src, srcStride, 0, srcH, dst, dstStride); + if (time_rep != 0) + { + const uint64_t now = utime(); + uint64_t done; + for (i = 1; i != time_rep; ++i) { + sws_scale(dstContext, (const uint8_t * const*)src, srcStride, 0, srcH, dst, dstStride); + } + done = utime(); + printf(" T=%7"PRId64"us ", done-now); + } + for (i = 0; i < 4 && dstStride[i]; i++) crc = av_crc(av_crc_get_table(AV_CRC_32_IEEE), crc, dst[i], dstStride[i] * dstH); @@ -355,56 +376,78 @@ static int fileTest(const uint8_t * const ref[4], int refStride[4], return 0; } -#define W 96 -#define H 96 - int main(int argc, char **argv) { + unsigned int W = 96; + unsigned int H = 96; + unsigned int W2; + unsigned int H2; + unsigned int S; enum AVPixelFormat srcFormat = AV_PIX_FMT_NONE; enum AVPixelFormat dstFormat = AV_PIX_FMT_NONE; - uint8_t *rgb_data = av_malloc(W * H * 4); - const uint8_t * const rgb_src[4] = { rgb_data, NULL, NULL, NULL }; - int rgb_stride[4] = { 4 * W, 0, 0, 0 }; - uint8_t *data = av_malloc(4 * W * H); - const uint8_t * const src[4] = { data, data + W * H, data + W * H * 2, data + W * H * 3 }; - int stride[4] = { W, W, W, W }; int x, y; struct SwsContext *sws; AVLFG rand; int res = -1; int i; FILE *fp = NULL; - - if (!rgb_data || !data) - return -1; + uint8_t *rgb_data; + uint8_t * rgb_src[4] = { NULL }; + int rgb_stride[4] = { 0 }; + uint8_t *data; + uint8_t * src[4] = { NULL }; + int stride[4] = { 0 }; for (i = 1; i < argc; i += 2) { + const char * const arg2 = argv[i+1]; + if (argv[i][0] != '-' || i + 1 == argc) goto bad_option; if (!strcmp(argv[i], "-ref")) { - fp = fopen(argv[i + 1], "r"); + fp = fopen(arg2, "r"); if (!fp) { - fprintf(stderr, "could not open '%s'\n", argv[i + 1]); + fprintf(stderr, "could not open '%s'\n", arg2); goto error; } } else if (!strcmp(argv[i], "-cpuflags")) { unsigned flags = av_get_cpu_flags(); - int ret = av_parse_cpu_caps(&flags, argv[i + 1]); + int ret = av_parse_cpu_caps(&flags, arg2); if (ret < 0) { - fprintf(stderr, "invalid cpu flags %s\n", argv[i + 1]); + fprintf(stderr, "invalid cpu flags %s\n", arg2); return ret; } av_force_cpu_flags(flags); } else if (!strcmp(argv[i], "-src")) { - srcFormat = av_get_pix_fmt(argv[i + 1]); + srcFormat = av_get_pix_fmt(arg2); if (srcFormat == AV_PIX_FMT_NONE) { - fprintf(stderr, "invalid pixel format %s\n", argv[i + 1]); + fprintf(stderr, "invalid pixel format %s\n", arg2); return -1; } } else if (!strcmp(argv[i], "-dst")) { - dstFormat = av_get_pix_fmt(argv[i + 1]); + dstFormat = av_get_pix_fmt(arg2); if (dstFormat == AV_PIX_FMT_NONE) { - fprintf(stderr, "invalid pixel format %s\n", argv[i + 1]); + fprintf(stderr, "invalid pixel format %s\n", arg2); + return -1; + } + } else if (!strcmp(argv[i], "-w")) { + char * p = NULL; + W = strtoul(arg2, &p, 0); + if (!W || *p) { + fprintf(stderr, "bad width %s\n", arg2); + return -1; + } + } else if (!strcmp(argv[i], "-h")) { + char * p = NULL; + H = strtoul(arg2, &p, 0); + if (!H || *p) { + fprintf(stderr, "bad height '%s'\n", arg2); + return -1; + } + } else if (!strcmp(argv[i], "-t")) { + char * p = NULL; + time_rep = (int)strtol(arg2, &p, 0); + if (*p) { + fprintf(stderr, "bad time repetitions '%s'\n", arg2); return -1; } } else { @@ -414,15 +457,34 @@ bad_option: } } - sws = sws_getContext(W / 12, H / 12, AV_PIX_FMT_RGB32, W, H, + S = (W + 15) & ~15; + rgb_data = av_mallocz(S * H * 4); + rgb_src[0] = rgb_data; + rgb_stride[0] = 4 * S; + data = av_mallocz(4 * S * H); + src[0] = data; + src[1] = data + S * H; + src[2] = data + S * H * 2; + src[3] = data + S * H * 3; + stride[0] = S; + stride[1] = S; + stride[2] = S; + stride[3] = S; + H2 = H < 96 ? 8 : H / 12; + W2 = W < 96 ? 8 : W / 12; + + if (!rgb_data || !data) + return -1; + + sws = sws_getContext(W2, H2, AV_PIX_FMT_RGB32, W, H, AV_PIX_FMT_YUVA420P, SWS_BILINEAR, NULL, NULL, NULL); av_lfg_init(&rand, 1); for (y = 0; y < H; y++) for (x = 0; x < W * 4; x++) - rgb_data[ x + y * 4 * W] = av_lfg_get(&rand); - res = sws_scale(sws, rgb_src, rgb_stride, 0, H / 12, (uint8_t * const *) src, stride); + rgb_data[ x + y * 4 * S] = av_lfg_get(&rand); + res = sws_scale(sws, (const uint8_t * const *)rgb_src, rgb_stride, 0, H2, (uint8_t * const *) src, stride); if (res < 0 || res != H) { res = -1; goto error; @@ -431,10 +493,10 @@ bad_option: av_free(rgb_data); if(fp) { - res = fileTest(src, stride, W, H, fp, srcFormat, dstFormat); + res = fileTest((const uint8_t * const *)src, stride, W, H, fp, srcFormat, dstFormat); fclose(fp); } else { - selfTest(src, stride, W, H, srcFormat, dstFormat); + selfTest((const uint8_t * const *)src, stride, W, H, srcFormat, dstFormat); res = 0; } error: diff --git a/pi-util/BUILD.txt b/pi-util/BUILD.txt new file mode 100644 index 0000000000..2b62d660c0 --- /dev/null +++ b/pi-util/BUILD.txt @@ -0,0 +1,67 @@ +Building Pi FFmpeg +================== + +Current only building on a Pi is supported. +This builds ffmpeg the way I've tested it + +Get all dependencies - the current package dependencies are good enough + +$ sudo apt-get build-dep ffmpeg + +Configure using the pi-util/conf_native.sh script +------------------------------------------------- + +This sets the normal release options and creates an ouutput dir to build into +The directory name will depend on system and options but will be under out/ + +There are a few choices here + --mmal build including the legacy mmal-based decoders and zero-copy code + this requires appropriate libraries which currently will exist for + armv7 but not arm64 + --noshared + Build a static image rather than a shared library one. Static is + easier for testing as there is no need to worry about library + paths being confused and therefore running the wrong code, Shared + is what is needed, in most cases, when building for use by other + programs. + --usr Set install dir to /usr (i.e. system default) rather than in + /install + +So for a static build +--------------------- + +$ pi-util/conf_native.sh --noshared + +$ make -j8 -C out/ + +You can now run ffmpeg directly from where it was built + +For a shared build +------------------ + +There are two choices here + +$ pi-util/conf_native.sh +$ make -j8 -C out/ install + +This sets the install prefix to /install and is probably what you +want if you don't want to overwrite the system files. + +You can now set LD_LIBRARY_PATH appropriately and run ffmpeg from where it was +built. You can copy the contents of /install to /usr and that mostly +works. The only downside is that paths in pkgconfig end up being set to the +install directory in your build directory which may be less than ideal when +building other packages. + +The alternative if you just want to replace the system libs is: + +$ pi-util/conf_native.sh --usr +$ make -j8 -C out/ +$ sudo pi-util/clean_usr_libs.sh +$ sudo make -j8 -C out/ install + +The clean_usr_libs.sh step wipes any existing libs & includes (for all +architectures) from the system which helps avoid confusion when running other +progs as you can be sure you're not running old code which is unfortunately +easy to do otherwise. + diff --git a/pi-util/NOTES.txt b/pi-util/NOTES.txt new file mode 100644 index 0000000000..fcce72226a --- /dev/null +++ b/pi-util/NOTES.txt @@ -0,0 +1,69 @@ +Notes on the hevc_rpi decoder & associated support code +------------------------------------------------------- + +There are 3 main parts to the existing code: + +1) The decoder - this is all in libavcodec as rpi_hevc*. + +2) A few filters to deal with Sand frames and a small patch to +automatically select the sand->i420 converter when required. + +3) A kludge in ffmpeg.c to display the decoded video. This could & should +be converted into a proper ffmpeg display module. + + +Decoder +------- + +The decoder is a modified version of the existing ffmpeg hevc decoder. +Generally it is ~100% faster than the existing ffmpeg hevc s/w decoder. +More complex bitstreams can be up to ~200% faster but particularly easy +streams can cut its advantage down to ~50%. This means that a Pi3+ can +display nearly all 8-bit 1080p30 streams and with some overclocking it can +display most lower bitrate 10-bit 1080p30 streams - this latter case is +not helped by the requirement to downsample to 8-bit before display on a +Pi. + +It has had co-processor offload added for inter-pred and large block +residual transform. Various parts have had optimized ARM NEON assembler +added and the existing ARM asm sections have been profiled and +re-optimized for A53. The main C code has been substantially reworked at +its lower levels in an attempt to optimize it and minimize memory +bandwidth. To some extent code paths that deal with frame types that it +doesn't support have been pruned. + +It outputs frames in Broadcom Sand format. This is a somewhat annoying +layout that doesn't fit into ffmpegs standard frame descriptions. It has +vertical stripes of 128 horizontal pixels (64 in 10 bit forms) with Y for +the stripe followed by interleaved U & V, that is then followed by the Y +for the next stripe, etc. The final stripe is always padded to +stripe-width. This is used in an attempt to help with cache locality and +cut down on the number of dram bank switches. It is annoying to use for +inter-pred with conventional processing but the way the Pi QPU (which is +used for inter-pred) works means that it has negligible downsides here and +the improved memory performance exceeds the overhead of the increased +complexity in the rest of the code. + +Frames must be allocated out of GPU memory (as otherwise they can't be +accessed by the co-processors). Utility functions (in rpi_zc.c) have been +written to make this easier. As the frames are already in GPU memory they +can be displayed by the Pi h/w without any further copying. + + +Known non-features +------------------ + +Frame allocation should probably be done in some other way in order to fit +into the standard framework better. + +Sand frames are currently declared as software frames, there is an +argument that they should be hardware frames but they aren't really. + +There must be a better way of auto-selecting the hevc_rpi decoder over the +normal s/w hevc decoder, but I became confused by the existing h/w +acceleration framework and what I wanted to do didn't seem to fit in +neatly. + +Display should be a proper device rather than a kludge in ffmpeg.c + + diff --git a/pi-util/TESTMESA.txt b/pi-util/TESTMESA.txt new file mode 100644 index 0000000000..92bc13a3df --- /dev/null +++ b/pi-util/TESTMESA.txt @@ -0,0 +1,82 @@ +# Setup & Build instructions for testing Argon30 mesa support (on Pi4) + +# These assume that the drm_mmal test for Sand8 has been built on this Pi +# as build relies on many of the same files + +# 1st get everything required to build ffmpeg +# If sources aren't already enabled on your Pi then enable them +sudo su +sed "s/#deb-src/deb-src/" /etc/apt/sources.list > /tmp/sources.list +sed "s/#deb-src/deb-src/" /etc/apt/sources.list.d/raspi.list > /tmp/raspi.list +mv /tmp/sources.list /etc/apt/ +mv /tmp/raspi.list /etc/apt/sources.list.d/ +apt update + +# Get dependancies +sudo apt build-dep ffmpeg + +sudo apt install meson libepoxy-dev libxcb-dri3-dev libxcb1-dev libx11-dev libx11-xcb-dev libdrm-dev + +# Enable H265 V4L2 request decoder +sudo su +echo dtoverlay=rpivid-v4l2 >> /boot/config.txt +# You may also want to add more CMA if you are going to try 4k videos +# Change the dtoverlay=vc4-fkms-v3d line in config.txt to read +# dtoverlay=vc4-fkms-v3d,cma-512 +reboot +# Check it has turned up +ls -la /dev/video* +# This should include video19 +# crw-rw----+ 1 root video 81, 7 Aug 4 17:25 /dev/video19 + +# Currently on the Pi the linux headers from the debian distro don't match +# the kernel that we ship and we need to update them - hopefully this step +# will be unneeded in the future +sudo apt install git bc bison flex libssl-dev make +git clone --depth=1 https://github.com/raspberrypi/linux --branch rpi-5.10.y +cd linux +KERNEL=kernel7l +make bcm2711_defconfig +make headers_install +sudo cp -r usr/include/linux /usr/include +cd .. + +# Config - this builds a staticly linked ffmpeg which is easier for testing +pi-util/conf_native.sh --noshared + +# Build (this is a bit dull) +# If you want to poke the source the libavdevice/egl_vout.c contains the +# output code - +cd out/armv7-static-rel + +# Check that you have actually configured V4L2 request +grep HEVC_V4L2REQUEST config.h +# You are hoping for +# #define CONFIG_HEVC_V4L2REQUEST_HWACCEL 1 +# if you get 0 then the config has failed + +make -j6 + +# Grab test streams +wget http://www.jell.yfish.us/media/jellyfish-3-mbps-hd-h264.mkv +wget http://www.jell.yfish.us/media/jellyfish-3-mbps-hd-hevc.mkv +wget http://www.jell.yfish.us/media/jellyfish-3-mbps-hd-hevc-10bit.mkv + +# Test i420 output (works currently) +./ffmpeg -no_cvt_hw -vcodec h264_v4l2m2m -i jellyfish-3-mbps-hd-h264.mkv -f vout_egl - + +# Test Sand8 output - doesn't currently work but should once you have +# Sand8 working in drm_mmal. I can't guarantee that this will work as +# I can't test this path with a known working format, but the debug looks +# good. If this doesn't work & drm_mmal does with sand8 then come back to me +# The "show_all 1" forces vout to display every frame otherwise it drops any +# frame that would cause it to block +./ffmpeg -no_cvt_hw -hwaccel drm -vcodec hevc -i jellyfish-3-mbps-hd-hevc.mkv -show_all 1 -f vout_egl - + +# Test Sand30 - doesn't currently work +# (Beware that when FFmpeg errors out it often leaves your teminal window +# in a state where you need to reset it) +./ffmpeg -no_cvt_hw -hwaccel drm -vcodec hevc -i jellyfish-3-mbps-hd-hevc-10bit.mkv -f vout_egl - + + + diff --git a/pi-util/clean_usr_libs.sh b/pi-util/clean_usr_libs.sh new file mode 100755 index 0000000000..01bd6a6a22 --- /dev/null +++ b/pi-util/clean_usr_libs.sh @@ -0,0 +1,42 @@ +set -e +U=/usr/include/arm-linux-gnueabihf +rm -rf $U/libavcodec +rm -rf $U/libavdevice +rm -rf $U/libavfilter +rm -rf $U/libavformat +rm -rf $U/libavutil +rm -rf $U/libswresample +rm -rf $U/libswscale +U=/usr/include/aarch64-linux-gnu +rm -rf $U/libavcodec +rm -rf $U/libavdevice +rm -rf $U/libavfilter +rm -rf $U/libavformat +rm -rf $U/libavutil +rm -rf $U/libswresample +rm -rf $U/libswscale +U=/usr/lib/arm-linux-gnueabihf +rm -f $U/libavcodec.* +rm -f $U/libavdevice.* +rm -f $U/libavfilter.* +rm -f $U/libavformat.* +rm -f $U/libavutil.* +rm -f $U/libswresample.* +rm -f $U/libswscale.* +U=/usr/lib/arm-linux-gnueabihf/neon/vfp +rm -f $U/libavcodec.* +rm -f $U/libavdevice.* +rm -f $U/libavfilter.* +rm -f $U/libavformat.* +rm -f $U/libavutil.* +rm -f $U/libswresample.* +rm -f $U/libswscale.* +U=/usr/lib/aarch64-linux-gnu +rm -f $U/libavcodec.* +rm -f $U/libavdevice.* +rm -f $U/libavfilter.* +rm -f $U/libavformat.* +rm -f $U/libavutil.* +rm -f $U/libswresample.* +rm -f $U/libswscale.* + diff --git a/pi-util/conf_arm64_native.sh b/pi-util/conf_arm64_native.sh new file mode 100644 index 0000000000..9e3bbfa190 --- /dev/null +++ b/pi-util/conf_arm64_native.sh @@ -0,0 +1,45 @@ +echo "Configure for ARM64 native build" + +#RPI_KEEPS="-save-temps=obj" + +SHARED_LIBS="--enable-shared" +if [ "$1" == "--noshared" ]; then + SHARED_LIBS="--disable-shared" + echo Static libs + OUT=out/arm64-static-rel +else + echo Shared libs + OUT=out/arm64-shared-rel +fi + +mkdir -p $OUT +cd $OUT + +A=aarch64-linux-gnu +USR_PREFIX=`pwd`/install +LIB_PREFIX=$USR_PREFIX/lib/$A +INC_PREFIX=$USR_PREFIX/include/$A + +../../configure \ + --prefix=$USR_PREFIX\ + --libdir=$LIB_PREFIX\ + --incdir=$INC_PREFIX\ + --disable-stripping\ + --disable-thumb\ + --disable-mmal\ + --enable-sand\ + --enable-v4l2-request\ + --enable-libdrm\ + --enable-epoxy\ + --enable-libudev\ + --enable-vout-drm\ + --enable-vout-egl\ + $SHARED_LIBS\ + --extra-cflags="-ggdb" + +# --enable-decoder=hevc_rpi\ +# --enable-extra-warnings\ +# --arch=armv71\ + +# gcc option for getting asm listing +# -Wa,-ahls diff --git a/pi-util/conf_h265.2016.csv b/pi-util/conf_h265.2016.csv new file mode 100644 index 0000000000..4efd5d1c67 --- /dev/null +++ b/pi-util/conf_h265.2016.csv @@ -0,0 +1,195 @@ +1,HEVC_v1/AMP_A_Samsung_7,AMP_A_Samsung_7.bin,AMP_A_Samsung_7.md5,8 +1,HEVC_v1/AMP_B_Samsung_7,AMP_B_Samsung_7.bin,AMP_B_Samsung_7.md5,8 +1,HEVC_v1/AMP_D_Hisilicon_3,AMP_D_Hisilicon.bit,AMP_D_Hisilicon_3.yuv.md5,8 +1,HEVC_v1/AMP_E_Hisilicon_3,AMP_E_Hisilicon.bit,AMP_E_Hisilicon_3.yuv.md5,8 +1,HEVC_v1/AMP_F_Hisilicon_3,AMP_F_Hisilicon_3.bit,AMP_F_Hisilicon_3.yuv.md5,8 +1,HEVC_v1/AMVP_A_MTK_4,AMVP_A_MTK_4.bit,AMVP_A_MTK_4.md5,8 +1,HEVC_v1/AMVP_B_MTK_4,AMVP_B_MTK_4.bit,AMVP_B_MTK_4.md5,8 +1,HEVC_v1/AMVP_C_Samsung_7,AMVP_C_Samsung_7.bin,AMVP_C_Samsung_7.md5,8 +1,HEVC_v1/BUMPING_A_ericsson_1,BUMPING_A_ericsson_1.bit,BUMPING_A_ericsson_1.md5,8 +1,HEVC_v1/CAINIT_A_SHARP_4,CAINIT_A_SHARP_4.bit,CAINIT_A_SHARP_4.md5,8 +1,HEVC_v1/CAINIT_B_SHARP_4,CAINIT_B_SHARP_4.bit,CAINIT_B_SHARP_4.md5,8 +1,HEVC_v1/CAINIT_C_SHARP_3,CAINIT_C_SHARP_3.bit,CAINIT_C_SHARP_3.md5,8 +1,HEVC_v1/CAINIT_D_SHARP_3,CAINIT_D_SHARP_3.bit,CAINIT_D_SHARP_3.md5,8 +1,HEVC_v1/CAINIT_E_SHARP_3,CAINIT_E_SHARP_3.bit,CAINIT_E_SHARP_3.md5,8 +1,HEVC_v1/CAINIT_F_SHARP_3,CAINIT_F_SHARP_3.bit,CAINIT_F_SHARP_3.md5,8 +1,HEVC_v1/CAINIT_G_SHARP_3,CAINIT_G_SHARP_3.bit,CAINIT_G_SHARP_3.md5,8 +1,HEVC_v1/CAINIT_H_SHARP_3,CAINIT_H_SHARP_3.bit,CAINIT_H_SHARP_3.md5,8 +1,HEVC_v1/CIP_A_Panasonic_3,CIP_A_Panasonic_3.bit,CIP_A_Panasonic_3_yuv.md5,8 +1,HEVC_v1/cip_B_NEC_3,cip_B_NEC_3.bit,cip_B_NEC_3.md5,8 +1,HEVC_v1/CIP_C_Panasonic_2,CIP_C_Panasonic_2.bit,CIP_C_Panasonic_2_yuv.md5,8 +1,HEVC_v1/CONFWIN_A_Sony_1,CONFWIN_A_Sony_1.bit,CONFWIN_A_Sony_1.md5,8 +1,HEVC_v1/DBLK_A_MAIN10_VIXS_4,DBLK_A_MAIN10_VIXS_4.bit,DBLK_A_MAIN10_VIXS_4.md5,10 +1,HEVC_v1/DBLK_A_SONY_3,DBLK_A_SONY_3.bit,DBLK_A_SONY_3.bit.yuv.md5,8 +1,HEVC_v1/DBLK_B_SONY_3,DBLK_B_SONY_3.bit,DBLK_B_SONY_3.bit.yuv.md5,8 +1,HEVC_v1/DBLK_C_SONY_3,DBLK_C_SONY_3.bit,DBLK_C_SONY_3.bit.yuv.md5,8 +1,HEVC_v1/DBLK_D_VIXS_2,DBLK_D_VIXS_2.bit,DBLK_D_VIXS_2_yuv.md5,8 +1,HEVC_v1/DBLK_E_VIXS_2,DBLK_E_VIXS_2.bit,DBLK_E_VIXS_2_yuv.md5,8 +1,HEVC_v1/DBLK_F_VIXS_2,DBLK_F_VIXS_2.bit,DBLK_F_VIXS_2_yuv.md5,8 +1,HEVC_v1/DBLK_G_VIXS_2,DBLK_G_VIXS_2.bit,DBLK_G_VIXS_2_yuv.md5,8 +1,HEVC_v1/DELTAQP_A_BRCM_4,DELTAQP_A_BRCM_4.bit,DELTAQP_A_BRCM_4_yuv.md5,8 +1,HEVC_v1/DELTAQP_B_SONY_3,DELTAQP_B_SONY_3.bit,DELTAQP_B_SONY_3.bit.yuv.md5,8 +1,HEVC_v1/DELTAQP_C_SONY_3,DELTAQP_C_SONY_3.bit,DELTAQP_C_SONY_3.bit.yuv.md5,8 +1,HEVC_v1/DSLICE_A_HHI_5,DSLICE_A_HHI_5.bin,DSLICE_A_HHI_5.md5,8 +1,HEVC_v1/DSLICE_B_HHI_5,DSLICE_B_HHI_5.bin,DSLICE_B_HHI_5.md5,8 +1,HEVC_v1/DSLICE_C_HHI_5,DSLICE_C_HHI_5.bin,DSLICE_C_HHI_5.md5,8 +1,HEVC_v1/ENTP_A_QUALCOMM_1,ENTP_A_Qualcomm_1.bit,ENTP_A_Qualcomm_1.md5,8 +1,HEVC_v1/ENTP_B_Qualcomm_1,ENTP_B_Qualcomm_1.bit,ENTP_B_Qualcomm_1.md5,8 +1,HEVC_v1/ENTP_C_Qualcomm_1,ENTP_C_Qualcomm_1.bit,ENTP_C_Qualcomm_1.md5,8 +1,HEVC_v1/EXT_A_ericsson_4,EXT_A_ericsson_4.bit,EXT_A_ericsson_4.md5,8 +1,HEVC_v1/FILLER_A_Sony_1,FILLER_A_Sony_1.bit,FILLER_A_Sony_1.md5,8 +1,HEVC_v1/HRD_A_Fujitsu_3,HRD_A_Fujitsu_3.bin,HRD_A_Fujitsu_3.md5,8 +1,HEVC_v1/INITQP_A_Sony_1,INITQP_A_Sony_1.bit,INITQP_A_Sony_1.md5,8 +1,HEVC_v1/INITQP_B_Main10_Sony_1,INITQP_B_Main10_Sony_1.bit,INITQP_B_Main10_Sony_1.md5,10 +1,HEVC_v1/ipcm_A_NEC_3,ipcm_A_NEC_3.bit,ipcm_A_NEC_3.md5,8 +1,HEVC_v1/ipcm_B_NEC_3,ipcm_B_NEC_3.bit,ipcm_B_NEC_3.md5,8 +1,HEVC_v1/ipcm_C_NEC_3,ipcm_C_NEC_3.bit,ipcm_C_NEC_3.md5,8 +1,HEVC_v1/ipcm_D_NEC_3,ipcm_D_NEC_3.bit,ipcm_D_NEC_3.md5,8 +1,HEVC_v1/ipcm_E_NEC_2,ipcm_E_NEC_2.bit,ipcm_E_NEC_2.md5,8 +1,HEVC_v1/IPRED_A_docomo_2,IPRED_A_docomo_2.bit,IPRED_A_docomo_2.md5,8 +1,HEVC_v1/IPRED_B_Nokia_3,IPRED_B_Nokia_3.bit,IPRED_B_Nokia_3_yuv.md5,8 +1,HEVC_v1/IPRED_C_Mitsubishi_3,IPRED_C_Mitsubishi_3.bit,IPRED_C_Mitsubishi_3_yuv.md5,8 +1,HEVC_v1/LS_A_Orange_2,LS_A_Orange_2.bit,LS_A_Orange_2_yuv.md5,8 +1,HEVC_v1/LS_B_Orange_4,LS_B_Orange_4.bit,LS_B_Orange_4_yuv.md5,8 +1,HEVC_v1/LTRPSPS_A_Qualcomm_1,LTRPSPS_A_Qualcomm_1.bit,LTRPSPS_A_Qualcomm_1.md5,8 +1,HEVC_v1/MAXBINS_A_TI_5,MAXBINS_A_TI_5.bit,MAXBINS_A_TI_5_yuv.md5,8 +1,HEVC_v1/MAXBINS_B_TI_5,MAXBINS_B_TI_5.bit,MAXBINS_B_TI_5_yuv.md5,8 +1,HEVC_v1/MAXBINS_C_TI_5,MAXBINS_C_TI_5.bit,MAXBINS_C_TI_5_yuv.md5,8 +1,HEVC_v1/MERGE_A_TI_3,MERGE_A_TI_3.bit,MERGE_A_TI_3.md5,8 +1,HEVC_v1/MERGE_B_TI_3,MERGE_B_TI_3.bit,MERGE_B_TI_3.md5,8 +1,HEVC_v1/MERGE_C_TI_3,MERGE_C_TI_3.bit,MERGE_C_TI_3.md5,8 +1,HEVC_v1/MERGE_D_TI_3,MERGE_D_TI_3.bit,MERGE_D_TI_3.md5,8 +1,HEVC_v1/MERGE_E_TI_3,MERGE_E_TI_3.bit,MERGE_E_TI_3.md5,8 +1,HEVC_v1/MERGE_F_MTK_4,MERGE_F_MTK_4.bit,MERGE_F_MTK_4.md5,8 +1,HEVC_v1/MERGE_G_HHI_4,MERGE_G_HHI_4.bit,MERGE_G_HHI_4.md5,8 +1,HEVC_v1/MVCLIP_A_qualcomm_3,MVCLIP_A_qualcomm_3.bit,MVCLIP_A_qualcomm_3.yuv.md5,8 +1,HEVC_v1/MVDL1ZERO_A_docomo_4,MVDL1ZERO_A_docomo_4.bit,MVDL1ZERO_A_docomo_4.md5,8 +1,HEVC_v1/MVEDGE_A_qualcomm_3,MVEDGE_A_qualcomm_3.bit,MVEDGE_A_qualcomm_3.yuv.md5,8 +1,HEVC_v1/NoOutPrior_A_Qualcomm_1,NoOutPrior_A_Qualcomm_1.bit,NoOutPrior_A_Qualcomm_1.md5,8 +1,HEVC_v1/NoOutPrior_B_Qualcomm_1,NoOutPrior_B_Qualcomm_1.bit,NoOutPrior_B_Qualcomm_1.md5,8 +1,HEVC_v1/NUT_A_ericsson_5,NUT_A_ericsson_5.bit,NUT_A_ericsson_5.md5,8 +1,HEVC_v1/OPFLAG_A_Qualcomm_1,OPFLAG_A_Qualcomm_1.bit,OPFLAG_A_Qualcomm_1.md5,8 +1,HEVC_v1/OPFLAG_B_Qualcomm_1,OPFLAG_B_Qualcomm_1.bit,OPFLAG_B_Qualcomm_1.md5,8 +1,HEVC_v1/OPFLAG_C_Qualcomm_1,OPFLAG_C_Qualcomm_1.bit,OPFLAG_C_Qualcomm_1.md5,8 +1,HEVC_v1/PICSIZE_A_Bossen_1,PICSIZE_A_Bossen_1.bin,PICSIZE_A_Bossen_1.md5,8 +1,HEVC_v1/PICSIZE_B_Bossen_1,PICSIZE_B_Bossen_1.bin,PICSIZE_B_Bossen_1.md5,8 +1,HEVC_v1/PICSIZE_C_Bossen_1,PICSIZE_C_Bossen_1.bin,PICSIZE_C_Bossen_1.md5,8 +1,HEVC_v1/PICSIZE_D_Bossen_1,PICSIZE_D_Bossen_1.bin,PICSIZE_D_Bossen_1.md5,8 +1,HEVC_v1/PMERGE_A_TI_3,PMERGE_A_TI_3.bit,PMERGE_A_TI_3.md5,8 +1,HEVC_v1/PMERGE_B_TI_3,PMERGE_B_TI_3.bit,PMERGE_B_TI_3.md5,8 +1,HEVC_v1/PMERGE_C_TI_3,PMERGE_C_TI_3.bit,PMERGE_C_TI_3.md5,8 +1,HEVC_v1/PMERGE_D_TI_3,PMERGE_D_TI_3.bit,PMERGE_D_TI_3.md5,8 +1,HEVC_v1/PMERGE_E_TI_3,PMERGE_E_TI_3.bit,PMERGE_E_TI_3.md5,8 +1,HEVC_v1/POC_A_Bossen_3,POC_A_Bossen_3.bin,POC_A_Bossen_3.md5,8 +1,HEVC_v1/PPS_A_qualcomm_7,PPS_A_qualcomm_7.bit,PPS_A_qualcomm_7.yuv.md5,8 +1,HEVC_v1/PS_B_VIDYO_3,PS_B_VIDYO_3.bit,PS_B_VIDYO_3_yuv.md5,8 +1,HEVC_v1/RAP_A_docomo_6,RAP_A_docomo_6.bit,RAP_A_docomo_6.md5,8 +1,HEVC_v1/RAP_B_Bossen_2,RAP_B_Bossen_2.bit,RAP_B_Bossen_2.md5,8 +1,HEVC_v1/RPLM_A_qualcomm_4,RPLM_A_qualcomm_4.bit,RPLM_A_qualcomm_4.yuv.md5,8 +1,HEVC_v1/RPLM_B_qualcomm_4,RPLM_B_qualcomm_4.bit,RPLM_B_qualcomm_4.yuv.md5,8 +1,HEVC_v1/RPS_A_docomo_5,RPS_A_docomo_5.bit,RPS_A_docomo_5.md5,8 +1,HEVC_v1/RPS_B_qualcomm_5,RPS_B_qualcomm_5.bit,RPS_B_qualcomm_5.yuv.md5,8 +1,HEVC_v1/RPS_C_ericsson_5,RPS_C_ericsson_5.bit,RPS_C_ericsson_5.md5,8 +1,HEVC_v1/RPS_D_ericsson_6,RPS_D_ericsson_6.bit,RPS_D_ericsson_6.md5,8 +1,HEVC_v1/RPS_E_qualcomm_5,RPS_E_qualcomm_5.bit,RPS_E_qualcomm_5.yuv.md5,8 +1,HEVC_v1/RPS_F_docomo_2,RPS_F_docomo_2.bit,RPS_F_docomo_2.md5,8 +1,HEVC_v1/RQT_A_HHI_4,RQT_A_HHI_4.bit,RQT_A_HHI_4.md5,8 +1,HEVC_v1/RQT_B_HHI_4,RQT_B_HHI_4.bit,RQT_B_HHI_4.md5,8 +1,HEVC_v1/RQT_C_HHI_4,RQT_C_HHI_4.bit,RQT_C_HHI_4.md5,8 +1,HEVC_v1/RQT_D_HHI_4,RQT_D_HHI_4.bit,RQT_D_HHI_4.md5,8 +1,HEVC_v1/RQT_E_HHI_4,RQT_E_HHI_4.bit,RQT_E_HHI_4.md5,8 +1,HEVC_v1/RQT_F_HHI_4,RQT_F_HHI_4.bit,RQT_F_HHI_4.md5,8 +1,HEVC_v1/RQT_G_HHI_4,RQT_G_HHI_4.bit,RQT_G_HHI_4.md5,8 +1,HEVC_v1/SAO_A_MediaTek_4,SAO_A_MediaTek_4.bit,SAO_A_MediaTek_4.md5,8 +1,HEVC_v1/SAO_B_MediaTek_5,SAO_B_MediaTek_5.bit,SAO_B_MediaTek_5.md5,8 +1,HEVC_v1/SAO_C_Samsung_5,SAO_C_Samsung_5.bin,SAO_C_Samsung_5.md5,8 +1,HEVC_v1/SAO_D_Samsung_5,SAO_D_Samsung_5.bin,SAO_D_Samsung_5.md5,8 +1,HEVC_v1/SAO_E_Canon_4,SAO_E_Canon_4.bit,SAO_E_Canon_4.md5,8 +1,HEVC_v1/SAO_F_Canon_3,SAO_F_Canon_3.bit,SAO_F_Canon_3.md5,8 +1,HEVC_v1/SAO_G_Canon_3,SAO_G_Canon_3.bit,SAO_G_Canon_3.md5,8 +1,HEVC_v1/SAO_H_Parabola_1,SAO_H_Parabola_1.bit,SAO_H_Parabola_1.md5,8 +1,HEVC_v1/SAODBLK_A_MainConcept_4,SAODBLK_A_MainConcept_4.bin,SAODBLK_A_MainConcept_4_md5.txt,8 +1,HEVC_v1/SAODBLK_B_MainConcept_4,SAODBLK_B_MainConcept_4.bin,SAODBLK_B_MainConcept_4_md5.txt,8 +1,HEVC_v1/SDH_A_Orange_4,SDH_A_Orange_4.bit,SDH_A_Orange_4_yuv.md5,8 +1,HEVC_v1/SLICES_A_Rovi_3,SLICES_A_Rovi_3.bin,SLICES_A_Rovi_3.md5,8 +1,HEVC_v1/SLIST_A_Sony_5,SLIST_A_Sony_5.bin,SLIST_A_Sony_5_yuv.md5,8 +1,HEVC_v1/SLIST_B_Sony_9,SLIST_B_Sony_9.bin,SLIST_B_Sony_9_yuv.md5,8 +1,HEVC_v1/SLIST_C_Sony_4,SLIST_C_Sony_4.bin,SLIST_C_Sony_4_yuv.md5,8 +1,HEVC_v1/SLIST_D_Sony_9,str.bin,SLIST_D_Sony_9_yuv.md5,8 +1,HEVC_v1/SLPPLP_A_VIDYO_2,SLPPLP_A_VIDYO_2.bit,SLPPLP_A_VIDYO_2_yuv.md5,8 +1,HEVC_v1/STRUCT_A_Samsung_7,STRUCT_A_Samsung_7.bin,STRUCT_A_Samsung_7.md5,8 +1,HEVC_v1/STRUCT_B_Samsung_7,STRUCT_B_Samsung_7.bin,STRUCT_B_Samsung_7.md5,8 +1,HEVC_v1/TILES_A_Cisco_2,TILES_A_Cisco_2.bin,TILES_A_Cisco_2_yuv.md5,8 +1,HEVC_v1/TILES_B_Cisco_1,TILES_B_Cisco_1.bin,TILES_B_Cisco_1_yuv.md5,8 +1,HEVC_v1/TMVP_A_MS_3,TMVP_A_MS_3.bit,TMVP_A_MS_3.yuv.md5,8 +1,HEVC_v1/TSCL_A_VIDYO_5,TSCL_A_VIDYO_5.bit,TSCL_A_VIDYO_5_yuv.md5,8 +1,HEVC_v1/TSCL_B_VIDYO_4,TSCL_B_VIDYO_4.bit,TSCL_B_VIDYO_4_yuv.md5,8 +1,HEVC_v1/TSKIP_A_MS_3,TSKIP_A_MS_3.bit,TSKIP_A_MS_3.yuv.md5,8 +3,HEVC_v1/TSUNEQBD_A_MAIN10_Technicolor_2,TSUNEQBD_A_MAIN10_Technicolor_2.bit,TSUNEQBD_A_MAIN10_Technicolor_2_yuv.md5, # unequal bit depth,10 +1,HEVC_v1/TUSIZE_A_Samsung_1,TUSIZE_A_Samsung_1.bin,TUSIZE_A_Samsung_1.md5,8 +1,HEVC_v1/VPSID_A_VIDYO_2,VPSID_A_VIDYO_2.bit,VPSID_A_VIDYO_2_yuv.md5,8 +3,HEVC_v1/VPSSPSPPS_A_MainConcept_1,VPSSPSPPS_A_MainConcept_1.bin,VPSSPSPPS_A_MainConcept_1_md5.txt, # ???,8 +1,HEVC_v1/WP_A_MAIN10_Toshiba_3,WP_A_MAIN10_Toshiba_3.bit,WP_A_MAIN10_Toshiba_3_yuv.md5,10 +1,HEVC_v1/WP_A_Toshiba_3,WP_A_Toshiba_3.bit,WP_A_Toshiba_3_yuv.md5,8 +1,HEVC_v1/WP_B_Toshiba_3,WP_B_Toshiba_3.bit,WP_B_Toshiba_3_yuv.md5,8 +1,HEVC_v1/WP_MAIN10_B_Toshiba_3,WP_MAIN10_B_Toshiba_3.bit,WP_MAIN10_B_Toshiba_3_yuv.md5,10 +1,HEVC_v1/WPP_A_ericsson_MAIN10_2,WPP_A_ericsson_MAIN10_2.bit,WPP_A_ericsson_MAIN10_yuv.md5,10 +1,HEVC_v1/WPP_A_ericsson_MAIN_2,WPP_A_ericsson_MAIN_2.bit,WPP_A_ericsson_MAIN_2_yuv.md5,8 +1,HEVC_v1/WPP_B_ericsson_MAIN10_2,WPP_B_ericsson_MAIN10_2.bit,WPP_B_ericsson_MAIN10_yuv.md5,10 +1,HEVC_v1/WPP_B_ericsson_MAIN_2,WPP_B_ericsson_MAIN_2.bit,WPP_B_ericsson_MAIN_2_yuv.md5,8 +1,HEVC_v1/WPP_C_ericsson_MAIN10_2,WPP_C_ericsson_MAIN10_2.bit,WPP_C_ericsson_MAIN10_yuv.md5,10 +1,HEVC_v1/WPP_C_ericsson_MAIN_2,WPP_C_ericsson_MAIN_2.bit,WPP_C_ericsson_MAIN_2_yuv.md5,8 +1,HEVC_v1/WPP_D_ericsson_MAIN10_2,WPP_D_ericsson_MAIN10_2.bit,WPP_D_ericsson_MAIN10_yuv.md5,10 +1,HEVC_v1/WPP_D_ericsson_MAIN_2,WPP_D_ericsson_MAIN_2.bit,WPP_D_ericsson_MAIN_2_yuv.md5,8 +1,HEVC_v1/WPP_E_ericsson_MAIN10_2,WPP_E_ericsson_MAIN10_2.bit,WPP_E_ericsson_MAIN10_yuv.md5,10 +1,HEVC_v1/WPP_E_ericsson_MAIN_2,WPP_E_ericsson_MAIN_2.bit,WPP_E_ericsson_MAIN_2_yuv.md5,8 +1,HEVC_v1/WPP_F_ericsson_MAIN10_2,WPP_F_ericsson_MAIN10_2.bit,WPP_F_ericsson_MAIN10_yuv.md5,10 +1,HEVC_v1/WPP_F_ericsson_MAIN_2,WPP_F_ericsson_MAIN_2.bit,WPP_F_ericsson_MAIN_2_yuv.md5,8 +1,RExt/ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_2,ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_2.bit,ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_yuv_2.md5,0 +0,RExt/Bitdepth_A_RExt_Sony_1,Bitdepth_A_RExt_Sony_1.bin,md5sum.txt,8 +0,RExt/Bitdepth_B_RExt_Sony_1,Bitdepth_B_RExt_Sony_1.bin,md5sum.txt,8 +0,RExt/CCP_10bit_RExt_QCOM,CCP_10bit_RExt_QCOM.bin,CCP_10bit_RExt_QCOM_md5sum.txt,10 +0,RExt/CCP_12bit_RExt_QCOM,CCP_12bit_RExt_QCOM.bin,CCP_12bit_RExt_QCOM_md5sum.txt,8 +0,RExt/CCP_8bit_RExt_QCOM,CCP_8bit_RExt_QCOM.bin,CCP_8bit_RExt_QCOM_md5sum.txt,8 +1,RExt/ExplicitRdpcm_A_BBC_1,ExplicitRdpcm_A_BBC_1.bit,md5sum.txt,0 +0,RExt/ExplicitRdpcm_B_BBC_2,ExplicitRdpcm_B_BBC_1.bit,md5sum.txt,8 +0,RExt/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_10BIT_RExt_Sony_1,EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_10BIT_RExt_Sony_1.bit,EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_10BIT_RExt_Sony_1.md5,10 +0,RExt/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_12BIT_RExt_Sony_1,EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_12BIT_RExt_Sony_1.bit,EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_12BIT_RExt_Sony_1.md5,8 +0,RExt/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_16BIT_RExt_Sony_1,EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_16BIT_RExt_Sony_1.bit,EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_16BIT_RExt_Sony_1.md5,8 +0,RExt/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_8BIT_RExt_Sony_1,EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_8BIT_RExt_Sony_1.bit,EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_8BIT_RExt_Sony_1.md5,8 +0,RExt/EXTPREC_MAIN_444_16_INTRA_10BIT_RExt_Sony_1,EXTPREC_MAIN_444_16_INTRA_10BIT_RExt_Sony_1.bit,EXTPREC_MAIN_444_16_INTRA_10BIT_RExt_Sony_1.md5,10 +0,RExt/EXTPREC_MAIN_444_16_INTRA_12BIT_RExt_Sony_1,EXTPREC_MAIN_444_16_INTRA_12BIT_RExt_Sony_1.bit,EXTPREC_MAIN_444_16_INTRA_12BIT_RExt_Sony_1.md5,8 +0,RExt/EXTPREC_MAIN_444_16_INTRA_16BIT_RExt_Sony_1,EXTPREC_MAIN_444_16_INTRA_16BIT_RExt_Sony_1.bit,EXTPREC_MAIN_444_16_INTRA_16BIT_RExt_Sony_1.md5,8 +0,RExt/EXTPREC_MAIN_444_16_INTRA_8BIT_RExt_Sony_1,EXTPREC_MAIN_444_16_INTRA_8BIT_RExt_Sony_1.bit,EXTPREC_MAIN_444_16_INTRA_8BIT_RExt_Sony_1.md5,8 +1,RExt/GENERAL_10b_420_RExt_Sony_1,GENERAL_10b_420_RExt_Sony_1.bit,GENERAL_10b_420_RExt_Sony_1.md5,10 +1,RExt/GENERAL_10b_422_RExt_Sony_1,GENERAL_10b_422_RExt_Sony_1.bit,GENERAL_10b_422_RExt_Sony_1.md5,0 +1,RExt/GENERAL_10b_444_RExt_Sony_2,GENERAL_10b_444_RExt_Sony_2.bit,GENERAL_10b_444_RExt_Sony_2.md5,0 +1,RExt/GENERAL_12b_400_RExt_Sony_1,GENERAL_12b_400_RExt_Sony_1.bit,GENERAL_12b_400_RExt_Sony_1.md5,0 +1,RExt/GENERAL_12b_420_RExt_Sony_1,GENERAL_12b_420_RExt_Sony_1.bit,GENERAL_12b_420_RExt_Sony_1.md5,0 +1,RExt/GENERAL_12b_422_RExt_Sony_1,GENERAL_12b_422_RExt_Sony_1.bit,GENERAL_12b_422_RExt_Sony_1.md5,0 +1,RExt/GENERAL_12b_444_RExt_Sony_2,GENERAL_12b_444_RExt_Sony_2.bit,GENERAL_12b_444_RExt_Sony_2.md5,0 +0,RExt/GENERAL_16b_400_RExt_Sony_1,GENERAL_16b_400_RExt_Sony_1.bit,GENERAL_16b_400_RExt_Sony_1.md5,0 +0,RExt/GENERAL_16b_444_highThroughput_RExt_Sony_2,GENERAL_16b_444_highThroughput_RExt_Sony_2.bit,GENERAL_16b_444_highThroughput_RExt_Sony_2.md5,8 +0,RExt/GENERAL_16b_444_RExt_Sony_2,GENERAL_16b_444_RExt_Sony_2.bit,GENERAL_16b_444_RExt_Sony_2.md5,8 +1,RExt/GENERAL_8b_400_RExt_Sony_1,GENERAL_8b_400_RExt_Sony_1.bit,GENERAL_8b_400_RExt_Sony_1.md5,0 +1,RExt/GENERAL_8b_420_RExt_Sony_1,GENERAL_8b_420_RExt_Sony_1.bit,GENERAL_8b_420_RExt_Sony_1.md5,8 +1,RExt/GENERAL_8b_444_RExt_Sony_2,GENERAL_8b_444_RExt_Sony_2.bit,GENERAL_8b_444_RExt_Sony_2.md5,0 +1,RExt/IPCM_A_RExt_NEC_2,IPCM_A_RExt_NEC_2.bit,IPCM_A_RExt_NEC_2_yuv.md5,0 +1,RExt/IPCM_B_RExt_NEC,IPCM_B_RExt_NEC.bit,IPCM_B_RExt_NEC_yuv.md5,0 +1,RExt/Main_422_10_A_RExt_Sony_2,Main_422_10_A_RExt_Sony_2.bin,md5sum.txt,0 +1,RExt/Main_422_10_B_RExt_Sony_2,Main_422_10_B_RExt_Sony_2.bin,md5sum.txt,0 +1,RExt/PERSIST_RPARAM_A_RExt_Sony_3,PERSIST_RPARAM_A_RExt_Sony_3.bit,PERSIST_RPARAM_A_RExt_Sony_3.md5,0 +1,RExt/QMATRIX_A_RExt_Sony_1,QMATRIX_A_RExt_Sony_1.bit,QMATRIX_A_RExt_Sony_1.md5,0 +0,RExt/SAO_A_RExt_MediaTek_1,SAO_A_RExt_MediaTek_1.bit,SAO_A_RExt_MediaTek_1.md5, # Runs out of memory - could be fixed,8 +0,RExt/TSCTX_10bit_I_RExt_SHARP_1,TSCTX_10bit_I_RExt_SHARP_1.bin,TSCTX_10bit_I_RExt_SHARP_1.md5,10 +0,RExt/TSCTX_10bit_RExt_SHARP_1,TSCTX_10bit_RExt_SHARP_1.bin,TSCTX_10bit_RExt_SHARP_1.md5,10 +0,RExt/TSCTX_12bit_I_RExt_SHARP_1,TSCTX_12bit_I_RExt_SHARP_1.bin,TSCTX_12bit_I_RExt_SHARP_1.md5,8 +0,RExt/TSCTX_12bit_RExt_SHARP_1,TSCTX_12bit_RExt_SHARP_1.bin,TSCTX_12bit_RExt_SHARP_1.md5,8 +0,RExt/TSCTX_8bit_I_RExt_SHARP_1,TSCTX_8bit_I_RExt_SHARP_1.bin,TSCTX_8bit_I_RExt_SHARP_1.md5,8 +0,RExt/TSCTX_8bit_RExt_SHARP_1,TSCTX_8bit_RExt_SHARP_1.bin,TSCTX_8bit_RExt_SHARP_1.md5,8 +0,RExt/WAVETILES_RExt_Sony_2,WAVETILES_RExt_Sony_2.bit,WAVETILES_RExt_Sony_2.md5,8 +1,local/sao_cu16_mobile_344x280,sao_cu16_mobile_344x280.265,sao_cu16_mobile_344x280.md5,8 +1,local/dblk_cu16_mobile_344x280,dblk_cu16_mobile_344x280.265,dblk_cu16_mobile_344x280.md5,8 +1,local/dblksao_cu16_mobile_344x280,dblksao_cu16_mobile_344x280.265,dblksao_cu16_mobile_344x280.md5,8 +1,local/dblk_pu32_horses_832x448,dblk_pu32_horses_832x448.265,dblk_pu32_horses_832x448.md5,8 +1,local/intra_pred_21_laps,intra_pred_21_laps.265,intra_pred_21_laps.md5,8 diff --git a/pi-util/conf_h265.2016_HEVC_v1.csv b/pi-util/conf_h265.2016_HEVC_v1.csv new file mode 100644 index 0000000000..6082641271 --- /dev/null +++ b/pi-util/conf_h265.2016_HEVC_v1.csv @@ -0,0 +1,147 @@ +1,AMP_A_Samsung_7,AMP_A_Samsung_7.bin,AMP_A_Samsung_7.md5 +1,AMP_B_Samsung_7,AMP_B_Samsung_7.bin,AMP_B_Samsung_7.md5 +1,AMP_D_Hisilicon_3,AMP_D_Hisilicon.bit,AMP_D_Hisilicon_3.yuv.md5 +1,AMP_E_Hisilicon_3,AMP_E_Hisilicon.bit,AMP_E_Hisilicon_3.yuv.md5 +1,AMP_F_Hisilicon_3,AMP_F_Hisilicon_3.bit,AMP_F_Hisilicon_3.yuv.md5 +1,AMVP_A_MTK_4,AMVP_A_MTK_4.bit,AMVP_A_MTK_4.md5 +1,AMVP_B_MTK_4,AMVP_B_MTK_4.bit,AMVP_B_MTK_4.md5 +1,AMVP_C_Samsung_7,AMVP_C_Samsung_7.bin,AMVP_C_Samsung_7.md5 +1,BUMPING_A_ericsson_1,BUMPING_A_ericsson_1.bit,BUMPING_A_ericsson_1.md5 +1,CAINIT_A_SHARP_4,CAINIT_A_SHARP_4.bit,CAINIT_A_SHARP_4.md5 +1,CAINIT_B_SHARP_4,CAINIT_B_SHARP_4.bit,CAINIT_B_SHARP_4.md5 +1,CAINIT_C_SHARP_3,CAINIT_C_SHARP_3.bit,CAINIT_C_SHARP_3.md5 +1,CAINIT_D_SHARP_3,CAINIT_D_SHARP_3.bit,CAINIT_D_SHARP_3.md5 +1,CAINIT_E_SHARP_3,CAINIT_E_SHARP_3.bit,CAINIT_E_SHARP_3.md5 +1,CAINIT_F_SHARP_3,CAINIT_F_SHARP_3.bit,CAINIT_F_SHARP_3.md5 +1,CAINIT_G_SHARP_3,CAINIT_G_SHARP_3.bit,CAINIT_G_SHARP_3.md5 +1,CAINIT_H_SHARP_3,CAINIT_H_SHARP_3.bit,CAINIT_H_SHARP_3.md5 +1,CIP_A_Panasonic_3,CIP_A_Panasonic_3.bit,CIP_A_Panasonic_3_yuv.md5 +1,cip_B_NEC_3,cip_B_NEC_3.bit,cip_B_NEC_3.md5 +1,CIP_C_Panasonic_2,CIP_C_Panasonic_2.bit,CIP_C_Panasonic_2_yuv.md5 +1,CONFWIN_A_Sony_1,CONFWIN_A_Sony_1.bit,CONFWIN_A_Sony_1.md5 +1,DBLK_A_MAIN10_VIXS_4,DBLK_A_MAIN10_VIXS_4.bit,DBLK_A_MAIN10_VIXS_4.md5 +1,DBLK_A_SONY_3,DBLK_A_SONY_3.bit,DBLK_A_SONY_3.bit.yuv.md5 +1,DBLK_B_SONY_3,DBLK_B_SONY_3.bit,DBLK_B_SONY_3.bit.yuv.md5 +1,DBLK_C_SONY_3,DBLK_C_SONY_3.bit,DBLK_C_SONY_3.bit.yuv.md5 +1,DBLK_D_VIXS_2,DBLK_D_VIXS_2.bit,DBLK_D_VIXS_2_yuv.md5 +1,DBLK_E_VIXS_2,DBLK_E_VIXS_2.bit,DBLK_E_VIXS_2_yuv.md5 +1,DBLK_F_VIXS_2,DBLK_F_VIXS_2.bit,DBLK_F_VIXS_2_yuv.md5 +1,DBLK_G_VIXS_2,DBLK_G_VIXS_2.bit,DBLK_G_VIXS_2_yuv.md5 +1,DELTAQP_A_BRCM_4,DELTAQP_A_BRCM_4.bit,DELTAQP_A_BRCM_4_yuv.md5 +1,DELTAQP_B_SONY_3,DELTAQP_B_SONY_3.bit,DELTAQP_B_SONY_3.bit.yuv.md5 +1,DELTAQP_C_SONY_3,DELTAQP_C_SONY_3.bit,DELTAQP_C_SONY_3.bit.yuv.md5 +1,DSLICE_A_HHI_5,DSLICE_A_HHI_5.bin,DSLICE_A_HHI_5.md5 +1,DSLICE_B_HHI_5,DSLICE_B_HHI_5.bin,DSLICE_B_HHI_5.md5 +1,DSLICE_C_HHI_5,DSLICE_C_HHI_5.bin,DSLICE_C_HHI_5.md5 +1,ENTP_A_QUALCOMM_1,ENTP_A_Qualcomm_1.bit,ENTP_A_Qualcomm_1.md5 +1,ENTP_B_Qualcomm_1,ENTP_B_Qualcomm_1.bit,ENTP_B_Qualcomm_1.md5 +1,ENTP_C_Qualcomm_1,ENTP_C_Qualcomm_1.bit,ENTP_C_Qualcomm_1.md5 +1,EXT_A_ericsson_4,EXT_A_ericsson_4.bit,EXT_A_ericsson_4.md5 +1,FILLER_A_Sony_1,FILLER_A_Sony_1.bit,FILLER_A_Sony_1.md5 +1,HRD_A_Fujitsu_3,HRD_A_Fujitsu_3.bin,HRD_A_Fujitsu_3.md5 +1,INITQP_A_Sony_1,INITQP_A_Sony_1.bit,INITQP_A_Sony_1.md5 +1,INITQP_B_Main10_Sony_1,INITQP_B_Main10_Sony_1.bit,INITQP_B_Main10_Sony_1.md5 +1,ipcm_A_NEC_3,ipcm_A_NEC_3.bit,ipcm_A_NEC_3.md5 +1,ipcm_B_NEC_3,ipcm_B_NEC_3.bit,ipcm_B_NEC_3.md5 +1,ipcm_C_NEC_3,ipcm_C_NEC_3.bit,ipcm_C_NEC_3.md5 +1,ipcm_D_NEC_3,ipcm_D_NEC_3.bit,ipcm_D_NEC_3.md5 +1,ipcm_E_NEC_2,ipcm_E_NEC_2.bit,ipcm_E_NEC_2.md5 +1,IPRED_A_docomo_2,IPRED_A_docomo_2.bit,IPRED_A_docomo_2.md5 +1,IPRED_B_Nokia_3,IPRED_B_Nokia_3.bit,IPRED_B_Nokia_3_yuv.md5 +1,IPRED_C_Mitsubishi_3,IPRED_C_Mitsubishi_3.bit,IPRED_C_Mitsubishi_3_yuv.md5 +1,LS_A_Orange_2,LS_A_Orange_2.bit,LS_A_Orange_2_yuv.md5 +1,LS_B_Orange_4,LS_B_Orange_4.bit,LS_B_Orange_4_yuv.md5 +1,LTRPSPS_A_Qualcomm_1,LTRPSPS_A_Qualcomm_1.bit,LTRPSPS_A_Qualcomm_1.md5 +1,MAXBINS_A_TI_5,MAXBINS_A_TI_5.bit,MAXBINS_A_TI_5_yuv.md5 +1,MAXBINS_B_TI_5,MAXBINS_B_TI_5.bit,MAXBINS_B_TI_5_yuv.md5 +1,MAXBINS_C_TI_5,MAXBINS_C_TI_5.bit,MAXBINS_C_TI_5_yuv.md5 +1,MERGE_A_TI_3,MERGE_A_TI_3.bit,MERGE_A_TI_3.md5 +1,MERGE_B_TI_3,MERGE_B_TI_3.bit,MERGE_B_TI_3.md5 +1,MERGE_C_TI_3,MERGE_C_TI_3.bit,MERGE_C_TI_3.md5 +1,MERGE_D_TI_3,MERGE_D_TI_3.bit,MERGE_D_TI_3.md5 +1,MERGE_E_TI_3,MERGE_E_TI_3.bit,MERGE_E_TI_3.md5 +1,MERGE_F_MTK_4,MERGE_F_MTK_4.bit,MERGE_F_MTK_4.md5 +1,MERGE_G_HHI_4,MERGE_G_HHI_4.bit,MERGE_G_HHI_4.md5 +1,MVCLIP_A_qualcomm_3,MVCLIP_A_qualcomm_3.bit,MVCLIP_A_qualcomm_3.yuv.md5 +1,MVDL1ZERO_A_docomo_4,MVDL1ZERO_A_docomo_4.bit,MVDL1ZERO_A_docomo_4.md5 +1,MVEDGE_A_qualcomm_3,MVEDGE_A_qualcomm_3.bit,MVEDGE_A_qualcomm_3.yuv.md5 +1,NoOutPrior_A_Qualcomm_1,NoOutPrior_A_Qualcomm_1.bit,NoOutPrior_A_Qualcomm_1.md5 +1,NoOutPrior_B_Qualcomm_1,NoOutPrior_B_Qualcomm_1.bit,NoOutPrior_B_Qualcomm_1.md5 +1,NUT_A_ericsson_5,NUT_A_ericsson_5.bit,NUT_A_ericsson_5.md5 +1,OPFLAG_A_Qualcomm_1,OPFLAG_A_Qualcomm_1.bit,OPFLAG_A_Qualcomm_1.md5 +1,OPFLAG_B_Qualcomm_1,OPFLAG_B_Qualcomm_1.bit,OPFLAG_B_Qualcomm_1.md5 +1,OPFLAG_C_Qualcomm_1,OPFLAG_C_Qualcomm_1.bit,OPFLAG_C_Qualcomm_1.md5 +1,PICSIZE_A_Bossen_1,PICSIZE_A_Bossen_1.bin,PICSIZE_A_Bossen_1.md5 +1,PICSIZE_B_Bossen_1,PICSIZE_B_Bossen_1.bin,PICSIZE_B_Bossen_1.md5 +1,PICSIZE_C_Bossen_1,PICSIZE_C_Bossen_1.bin,PICSIZE_C_Bossen_1.md5 +1,PICSIZE_D_Bossen_1,PICSIZE_D_Bossen_1.bin,PICSIZE_D_Bossen_1.md5 +1,PMERGE_A_TI_3,PMERGE_A_TI_3.bit,PMERGE_A_TI_3.md5 +1,PMERGE_B_TI_3,PMERGE_B_TI_3.bit,PMERGE_B_TI_3.md5 +1,PMERGE_C_TI_3,PMERGE_C_TI_3.bit,PMERGE_C_TI_3.md5 +1,PMERGE_D_TI_3,PMERGE_D_TI_3.bit,PMERGE_D_TI_3.md5 +1,PMERGE_E_TI_3,PMERGE_E_TI_3.bit,PMERGE_E_TI_3.md5 +1,POC_A_Bossen_3,POC_A_Bossen_3.bin,POC_A_Bossen_3.md5 +1,PPS_A_qualcomm_7,PPS_A_qualcomm_7.bit,PPS_A_qualcomm_7.yuv.md5 +1,PS_B_VIDYO_3,PS_B_VIDYO_3.bit,PS_B_VIDYO_3_yuv.md5 +1,RAP_A_docomo_6,RAP_A_docomo_6.bit,RAP_A_docomo_6.md5 +1,RAP_B_Bossen_2,RAP_B_Bossen_2.bit,RAP_B_Bossen_2.md5 +1,RPLM_A_qualcomm_4,RPLM_A_qualcomm_4.bit,RPLM_A_qualcomm_4.yuv.md5 +1,RPLM_B_qualcomm_4,RPLM_B_qualcomm_4.bit,RPLM_B_qualcomm_4.yuv.md5 +1,RPS_A_docomo_5,RPS_A_docomo_5.bit,RPS_A_docomo_5.md5 +1,RPS_B_qualcomm_5,RPS_B_qualcomm_5.bit,RPS_B_qualcomm_5.yuv.md5 +1,RPS_C_ericsson_5,RPS_C_ericsson_5.bit,RPS_C_ericsson_5.md5 +1,RPS_D_ericsson_6,RPS_D_ericsson_6.bit,RPS_D_ericsson_6.md5 +1,RPS_E_qualcomm_5,RPS_E_qualcomm_5.bit,RPS_E_qualcomm_5.yuv.md5 +1,RPS_F_docomo_2,RPS_F_docomo_2.bit,RPS_F_docomo_2.md5 +1,RQT_A_HHI_4,RQT_A_HHI_4.bit,RQT_A_HHI_4.md5 +1,RQT_B_HHI_4,RQT_B_HHI_4.bit,RQT_B_HHI_4.md5 +1,RQT_C_HHI_4,RQT_C_HHI_4.bit,RQT_C_HHI_4.md5 +1,RQT_D_HHI_4,RQT_D_HHI_4.bit,RQT_D_HHI_4.md5 +1,RQT_E_HHI_4,RQT_E_HHI_4.bit,RQT_E_HHI_4.md5 +1,RQT_F_HHI_4,RQT_F_HHI_4.bit,RQT_F_HHI_4.md5 +1,RQT_G_HHI_4,RQT_G_HHI_4.bit,RQT_G_HHI_4.md5 +1,SAO_A_MediaTek_4,SAO_A_MediaTek_4.bit,SAO_A_MediaTek_4.md5 +1,SAO_B_MediaTek_5,SAO_B_MediaTek_5.bit,SAO_B_MediaTek_5.md5 +1,SAO_C_Samsung_5,SAO_C_Samsung_5.bin,SAO_C_Samsung_5.md5 +1,SAO_D_Samsung_5,SAO_D_Samsung_5.bin,SAO_D_Samsung_5.md5 +1,SAO_E_Canon_4,SAO_E_Canon_4.bit,SAO_E_Canon_4.md5 +1,SAO_F_Canon_3,SAO_F_Canon_3.bit,SAO_F_Canon_3.md5 +1,SAO_G_Canon_3,SAO_G_Canon_3.bit,SAO_G_Canon_3.md5 +1,SAO_H_Parabola_1,SAO_H_Parabola_1.bit,SAO_H_Parabola_1.md5 +2,SAODBLK_A_MainConcept_4,SAODBLK_A_MainConcept_4.bin,SAODBLK_A_MainConcept_4_md5.txt +2,SAODBLK_B_MainConcept_4,SAODBLK_B_MainConcept_4.bin,SAODBLK_B_MainConcept_4_md5.txt +1,SDH_A_Orange_4,SDH_A_Orange_4.bit,SDH_A_Orange_4_yuv.md5 +1,SLICES_A_Rovi_3,SLICES_A_Rovi_3.bin,SLICES_A_Rovi_3.md5 +1,SLIST_A_Sony_5,SLIST_A_Sony_5.bin,SLIST_A_Sony_5_yuv.md5 +1,SLIST_B_Sony_9,SLIST_B_Sony_9.bin,SLIST_B_Sony_9_yuv.md5 +1,SLIST_C_Sony_4,SLIST_C_Sony_4.bin,SLIST_C_Sony_4_yuv.md5 +1,SLIST_D_Sony_9,str.bin,SLIST_D_Sony_9_yuv.md5 +1,SLPPLP_A_VIDYO_2,SLPPLP_A_VIDYO_2.bit,SLPPLP_A_VIDYO_2_yuv.md5 +1,STRUCT_A_Samsung_7,STRUCT_A_Samsung_7.bin,STRUCT_A_Samsung_7.md5 +1,STRUCT_B_Samsung_7,STRUCT_B_Samsung_7.bin,STRUCT_B_Samsung_7.md5 +1,TILES_A_Cisco_2,TILES_A_Cisco_2.bin,TILES_A_Cisco_2_yuv.md5 +1,TILES_B_Cisco_1,TILES_B_Cisco_1.bin,TILES_B_Cisco_1_yuv.md5 +1,TMVP_A_MS_3,TMVP_A_MS_3.bit,TMVP_A_MS_3.yuv.md5 +1,TSCL_A_VIDYO_5,TSCL_A_VIDYO_5.bit,TSCL_A_VIDYO_5_yuv.md5 +1,TSCL_B_VIDYO_4,TSCL_B_VIDYO_4.bit,TSCL_B_VIDYO_4_yuv.md5 +1,TSKIP_A_MS_3,TSKIP_A_MS_3.bit,TSKIP_A_MS_3.yuv.md5 +3,TSUNEQBD_A_MAIN10_Technicolor_2,TSUNEQBD_A_MAIN10_Technicolor_2.bit,TSUNEQBD_A_MAIN10_Technicolor_2_yuv.md5, # unequal bit depth +1,TUSIZE_A_Samsung_1,TUSIZE_A_Samsung_1.bin,TUSIZE_A_Samsung_1.md5 +1,VPSID_A_VIDYO_2,VPSID_A_VIDYO_2.bit,VPSID_A_VIDYO_2_yuv.md5 +3,VPSSPSPPS_A_MainConcept_1,VPSSPSPPS_A_MainConcept_1.bin,VPSSPSPPS_A_MainConcept_1_md5.txt, # ??? +1,WP_A_MAIN10_Toshiba_3,WP_A_MAIN10_Toshiba_3.bit,WP_A_MAIN10_Toshiba_3_yuv.md5 +1,WP_A_Toshiba_3,WP_A_Toshiba_3.bit,WP_A_Toshiba_3_yuv.md5 +1,WP_B_Toshiba_3,WP_B_Toshiba_3.bit,WP_B_Toshiba_3_yuv.md5 +1,WP_MAIN10_B_Toshiba_3,WP_MAIN10_B_Toshiba_3.bit,WP_MAIN10_B_Toshiba_3_yuv.md5 +1,WPP_A_ericsson_MAIN10_2,WPP_A_ericsson_MAIN10_2.bit,WPP_A_ericsson_MAIN10_yuv.md5 +1,WPP_A_ericsson_MAIN_2,WPP_A_ericsson_MAIN_2.bit,WPP_A_ericsson_MAIN_2_yuv.md5 +1,WPP_B_ericsson_MAIN10_2,WPP_B_ericsson_MAIN10_2.bit,WPP_B_ericsson_MAIN10_yuv.md5 +1,WPP_B_ericsson_MAIN_2,WPP_B_ericsson_MAIN_2.bit,WPP_B_ericsson_MAIN_2_yuv.md5 +1,WPP_C_ericsson_MAIN10_2,WPP_C_ericsson_MAIN10_2.bit,WPP_C_ericsson_MAIN10_yuv.md5 +1,WPP_C_ericsson_MAIN_2,WPP_C_ericsson_MAIN_2.bit,WPP_C_ericsson_MAIN_2_yuv.md5 +1,WPP_D_ericsson_MAIN10_2,WPP_D_ericsson_MAIN10_2.bit,WPP_D_ericsson_MAIN10_yuv.md5 +1,WPP_D_ericsson_MAIN_2,WPP_D_ericsson_MAIN_2.bit,WPP_D_ericsson_MAIN_2_yuv.md5 +1,WPP_E_ericsson_MAIN10_2,WPP_E_ericsson_MAIN10_2.bit,WPP_E_ericsson_MAIN10_yuv.md5 +1,WPP_E_ericsson_MAIN_2,WPP_E_ericsson_MAIN_2.bit,WPP_E_ericsson_MAIN_2_yuv.md5 +1,WPP_F_ericsson_MAIN10_2,WPP_F_ericsson_MAIN10_2.bit,WPP_F_ericsson_MAIN10_yuv.md5 +1,WPP_F_ericsson_MAIN_2,WPP_F_ericsson_MAIN_2.bit,WPP_F_ericsson_MAIN_2_yuv.md5 diff --git a/pi-util/conf_h265.csv b/pi-util/conf_h265.csv new file mode 100644 index 0000000000..fc14f2a3c2 --- /dev/null +++ b/pi-util/conf_h265.csv @@ -0,0 +1,144 @@ +1,ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_1,ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_1.bit,ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_1.md5 +1,AMP_A_Samsung_6,AMP_A_Samsung_6.bin,AMP_A_Samsung_6.md5 +1,AMP_B_Samsung_6,AMP_B_Samsung_6.bin,AMP_B_Samsung_6.md5 +1,AMP_D_Hisilicon_3,AMP_D_Hisilicon.bit,AMP_D_Hisilicon_3.yuv.md5 +1,AMP_E_Hisilicon_3,AMP_E_Hisilicon.bit,AMP_E_Hisilicon_3.yuv.md5 +1,AMP_F_Hisilicon_3,AMP_F_Hisilicon_3.bit,AMP_F_Hisilicon_3.yuv.md5 +1,AMVP_A_MTK_4,AMVP_A_MTK_4.bit,AMVP_A_MTK_4.md5 +1,AMVP_B_MTK_4,AMVP_B_MTK_4.bit,AMVP_B_MTK_4.md5 +1,AMVP_C_Samsung_6,AMVP_C_Samsung_6.bin,AMVP_C_Samsung_6.md5 +1,BUMPING_A_ericsson_1,BUMPING_A_ericsson_1.bit,BUMPING_A_ericsson_1.md5 +1,CAINIT_A_SHARP_4,CAINIT_A_SHARP_4.bit,CAINIT_A_SHARP_4.md5 +1,CAINIT_B_SHARP_4,CAINIT_B_SHARP_4.bit,CAINIT_B_SHARP_4.md5 +1,CAINIT_C_SHARP_3,CAINIT_C_SHARP_3.bit,CAINIT_C_SHARP_3.md5 +1,CAINIT_D_SHARP_3,CAINIT_D_SHARP_3.bit,CAINIT_D_SHARP_3.md5 +1,CAINIT_E_SHARP_3,CAINIT_E_SHARP_3.bit,CAINIT_E_SHARP_3.md5 +1,CAINIT_F_SHARP_3,CAINIT_F_SHARP_3.bit,CAINIT_F_SHARP_3.md5 +1,CAINIT_G_SHARP_3,CAINIT_G_SHARP_3.bit,CAINIT_G_SHARP_3.md5 +1,CAINIT_H_SHARP_3,CAINIT_H_SHARP_3.bit,CAINIT_H_SHARP_3.md5 +1,CIP_A_Panasonic_3,CIP_A_Panasonic_3.bit,CIP_A_Panasonic_3_yuv.md5 +1,cip_B_NEC_3,cip_B_NEC_3.bit,cip_B_NEC_3.md5 +1,CIP_C_Panasonic_2,CIP_C_Panasonic_2.bit,CIP_C_Panasonic_2_yuv.md5 +1,CONFWIN_A_Sony_1,CONFWIN_A_Sony_1.bit,CONFWIN_A_Sony_1.md5 +1,DBLK_A_MAIN10_VIXS_3,DBLK_A_MAIN10_VIXS_3.bit,DBLK_A_MAIN10_VIXS_3.md5 +1,DBLK_A_SONY_3,DBLK_A_SONY_3.bit,DBLK_A_SONY_3.bit.yuv.md5 +1,DBLK_B_SONY_3,DBLK_B_SONY_3.bit,DBLK_B_SONY_3.bit.yuv.md5 +1,DBLK_C_SONY_3,DBLK_C_SONY_3.bit,DBLK_C_SONY_3.bit.yuv.md5 +1,DBLK_D_VIXS_2,DBLK_D_VIXS_2.bit,DBLK_D_VIXS_2_yuv.md5 +1,DBLK_E_VIXS_2,DBLK_E_VIXS_2.bit,DBLK_E_VIXS_2_yuv.md5 +1,DBLK_F_VIXS_2,DBLK_F_VIXS_2.bit,DBLK_F_VIXS_2_yuv.md5 +1,DBLK_G_VIXS_2,DBLK_G_VIXS_2.bit,DBLK_G_VIXS_2_yuv.md5 +1,DELTAQP_A_BRCM_4,DELTAQP_A_BRCM_4.bit,DELTAQP_A_BRCM_4_yuv.md5 +1,DELTAQP_B_SONY_3,DELTAQP_B_SONY_3.bit,DELTAQP_B_SONY_3.bit.yuv.md5 +1,DELTAQP_C_SONY_3,DELTAQP_C_SONY_3.bit,DELTAQP_C_SONY_3.bit.yuv.md5 +1,DSLICE_A_HHI_5,DSLICE_A_HHI_5.bin,DSLICE_A_HHI_5.md5 +1,DSLICE_B_HHI_5,DSLICE_B_HHI_5.bin,DSLICE_B_HHI_5.md5 +1,DSLICE_C_HHI_5,DSLICE_C_HHI_5.bin,DSLICE_C_HHI_5.md5 +1,ENTP_A_QUALCOMM_1,ENTP_A_Qualcomm_1.bit,ENTP_A_Qualcomm_1.md5 +1,ENTP_B_Qualcomm_1,ENTP_B_Qualcomm_1.bit,ENTP_B_Qualcomm_1.md5 +1,ENTP_C_Qualcomm_1,ENTP_C_Qualcomm_1.bit,ENTP_C_Qualcomm_1.md5 +1,EXT_A_ericsson_4,EXT_A_ericsson_4.bit,EXT_A_ericsson_4.md5 +1,FILLER_A_Sony_1,FILLER_A_Sony_1.bit,FILLER_A_Sony_1.md5 +1,HRD_A_Fujitsu_3,HRD_A_Fujitsu_3.bin,HRD_A_Fujitsu_3.md5 +1,INITQP_A_Sony_1,INITQP_A_Sony_1.bit,INITQP_A_Sony_1.md5 +1,INITQP_B_Main10_Sony_1,INITQP_B_Main10_Sony_1.bit,INITQP_B_Main10_Sony_1.md5 +1,ipcm_A_NEC_3,ipcm_A_NEC_3.bit,ipcm_A_NEC_3.md5 +1,ipcm_B_NEC_3,ipcm_B_NEC_3.bit,ipcm_B_NEC_3.md5 +1,ipcm_C_NEC_3,ipcm_C_NEC_3.bit,ipcm_C_NEC_3.md5 +1,ipcm_D_NEC_3,ipcm_D_NEC_3.bit,ipcm_D_NEC_3.md5 +1,ipcm_E_NEC_2,ipcm_E_NEC_2.bit,ipcm_E_NEC_2.md5 +1,IPRED_A_docomo_2,IPRED_A_docomo_2.bit,IPRED_A_docomo_2.md5 +1,IPRED_B_Nokia_3,IPRED_B_Nokia_3.bit,IPRED_B_Nokia_3_yuv.md5 +1,IPRED_C_Mitsubishi_3,IPRED_C_Mitsubishi_3.bit,IPRED_C_Mitsubishi_3_yuv.md5 +1,LS_A_Orange_2,LS_A_Orange_2.bit,LS_A_Orange_2_yuv.md5 +1,LS_B_Orange_4,LS_B_Orange_4.bit,LS_B_Orange_4_yuv.md5 +1,LTRPSPS_A_Qualcomm_1,LTRPSPS_A_Qualcomm_1.bit,LTRPSPS_A_Qualcomm_1.md5 +1,MAXBINS_A_TI_4,MAXBINS_A_TI_4.bit,MAXBINS_A_TI_4.md5 +1,MAXBINS_B_TI_4,MAXBINS_B_TI_4.bit,MAXBINS_B_TI_4.md5 +1,MAXBINS_C_TI_4,MAXBINS_C_TI_4.bit,MAXBINS_C_TI_4.md5 +1,MERGE_A_TI_3,MERGE_A_TI_3.bit,MERGE_A_TI_3.md5 +1,MERGE_B_TI_3,MERGE_B_TI_3.bit,MERGE_B_TI_3.md5 +1,MERGE_C_TI_3,MERGE_C_TI_3.bit,MERGE_C_TI_3.md5 +1,MERGE_D_TI_3,MERGE_D_TI_3.bit,MERGE_D_TI_3.md5 +1,MERGE_E_TI_3,MERGE_E_TI_3.bit,MERGE_E_TI_3.md5 +1,MERGE_F_MTK_4,MERGE_F_MTK_4.bit,MERGE_F_MTK_4.md5 +1,MERGE_G_HHI_4,MERGE_G_HHI_4.bit,MERGE_G_HHI_4.md5 +1,MVCLIP_A_qualcomm_3,MVCLIP_A_qualcomm_3.bit,MVCLIP_A_qualcomm_3.yuv.md5 +1,MVDL1ZERO_A_docomo_4,MVDL1ZERO_A_docomo_4.bit,MVDL1ZERO_A_docomo_4.md5 +1,MVEDGE_A_qualcomm_3,MVEDGE_A_qualcomm_3.bit,MVEDGE_A_qualcomm_3.yuv.md5 +1,NoOutPrior_A_Qualcomm_1,NoOutPrior_A_Qualcomm_1.bit,NoOutPrior_A_Qualcomm_1.md5 +1,NoOutPrior_B_Qualcomm_1,NoOutPrior_B_Qualcomm_1.bit,NoOutPrior_B_Qualcomm_1.md5 +1,NUT_A_ericsson_5,NUT_A_ericsson_5.bit,NUT_A_ericsson_5.md5 +1,OPFLAG_A_Qualcomm_1,OPFLAG_A_Qualcomm_1.bit,OPFLAG_A_Qualcomm_1.md5 +1,OPFLAG_B_Qualcomm_1,OPFLAG_B_Qualcomm_1.bit,OPFLAG_B_Qualcomm_1.md5 +1,OPFLAG_C_Qualcomm_1,OPFLAG_C_Qualcomm_1.bit,OPFLAG_C_Qualcomm_1.md5 +1,PICSIZE_A_Bossen_1,PICSIZE_A_Bossen_1.bin,PICSIZE_A_Bossen_1.md5 +1,PICSIZE_B_Bossen_1,PICSIZE_B_Bossen_1.bin,PICSIZE_B_Bossen_1.md5 +1,PICSIZE_C_Bossen_1,PICSIZE_C_Bossen_1.bin,PICSIZE_C_Bossen_1.md5 +1,PICSIZE_D_Bossen_1,PICSIZE_D_Bossen_1.bin,PICSIZE_D_Bossen_1.md5 +1,PMERGE_A_TI_3,PMERGE_A_TI_3.bit,PMERGE_A_TI_3.md5 +1,PMERGE_B_TI_3,PMERGE_B_TI_3.bit,PMERGE_B_TI_3.md5 +1,PMERGE_C_TI_3,PMERGE_C_TI_3.bit,PMERGE_C_TI_3.md5 +1,PMERGE_D_TI_3,PMERGE_D_TI_3.bit,PMERGE_D_TI_3.md5 +1,PMERGE_E_TI_3,PMERGE_E_TI_3.bit,PMERGE_E_TI_3.md5 +1,POC_A_Bossen_3,POC_A_Bossen_3.bin,POC_A_Bossen_3.md5 +1,PPS_A_qualcomm_7,PPS_A_qualcomm_7.bit,PPS_A_qualcomm_7.yuv.md5 +1,PS_B_VIDYO_3,PS_B_VIDYO_3.bit,PS_B_VIDYO_3_yuv.md5 +1,RAP_A_docomo_6,RAP_A_docomo_6.bit,RAP_A_docomo_6.md5 +1,RAP_B_Bossen_2,RAP_B_Bossen_2.bit,RAP_B_Bossen_2.md5 +1,RPLM_A_qualcomm_4,RPLM_A_qualcomm_4.bit,RPLM_A_qualcomm_4.yuv.md5 +1,RPLM_B_qualcomm_4,RPLM_B_qualcomm_4.bit,RPLM_B_qualcomm_4.yuv.md5 +1,RPS_A_docomo_5,RPS_A_docomo_5.bit,RPS_A_docomo_5.md5 +1,RPS_B_qualcomm_5,RPS_B_qualcomm_5.bit,RPS_B_qualcomm_5.yuv.md5 +1,RPS_C_ericsson_5,RPS_C_ericsson_5.bit,RPS_C_ericsson_5.md5 +1,RPS_D_ericsson_6,RPS_D_ericsson_6.bit,RPS_D_ericsson_6.md5 +1,RPS_E_qualcomm_5,RPS_E_qualcomm_5.bit,RPS_E_qualcomm_5.yuv.md5 +1,RPS_F_docomo_2,RPS_F_docomo_2.bit,RPS_F_docomo_2.md5 +1,RQT_A_HHI_4,RQT_A_HHI_4.bit,RQT_A_HHI_4.md5 +1,RQT_B_HHI_4,RQT_B_HHI_4.bit,RQT_B_HHI_4.md5 +1,RQT_C_HHI_4,RQT_C_HHI_4.bit,RQT_C_HHI_4.md5 +1,RQT_D_HHI_4,RQT_D_HHI_4.bit,RQT_D_HHI_4.md5 +1,RQT_E_HHI_4,RQT_E_HHI_4.bit,RQT_E_HHI_4.md5 +1,RQT_F_HHI_4,RQT_F_HHI_4.bit,RQT_F_HHI_4.md5 +1,RQT_G_HHI_4,RQT_G_HHI_4.bit,RQT_G_HHI_4.md5 +1,SAO_A_MediaTek_4,SAO_A_MediaTek_4.bit,SAO_A_MediaTek_4.md5 +1,SAO_B_MediaTek_5,SAO_B_MediaTek_5.bit,SAO_B_MediaTek_5.md5 +1,SAO_C_Samsung_5,SAO_C_Samsung_5.bin,SAO_C_Samsung_5.md5 +1,SAO_D_Samsung_5,SAO_D_Samsung_5.bin,SAO_D_Samsung_5.md5 +1,SAO_E_Canon_4,SAO_E_Canon_4.bit,SAO_E_Canon_4.md5 +1,SAO_F_Canon_3,SAO_F_Canon_3.bit,SAO_F_Canon_3.md5 +1,SAO_G_Canon_3,SAO_G_Canon_3.bit,SAO_G_Canon_3.md5 +1,SDH_A_Orange_4,SDH_A_Orange_4.bit,SDH_A_Orange_4_yuv.md5 +1,SLICES_A_Rovi_3,SLICES_A_Rovi_3.bin,SLICES_A_Rovi_3.md5 +1,SLIST_A_Sony_4,str.bin,SLIST_A_Sony_4_yuv.md5 +1,SLIST_B_Sony_8,str.bin,SLIST_B_Sony_8_yuv.md5 +1,SLIST_C_Sony_3,str.bin,SLIST_C_Sony_3_yuv.md5 +1,SLIST_D_Sony_9,str.bin,SLIST_D_Sony_9_yuv.md5 +1,SLPPLP_A_VIDYO_2,SLPPLP_A_VIDYO_2.bit,SLPPLP_A_VIDYO_2_yuv.md5 +1,STRUCT_A_Samsung_6,STRUCT_A_Samsung_6.bin,STRUCT_A_Samsung_6.md5 +1,STRUCT_B_Samsung_6,STRUCT_B_Samsung_6.bin,STRUCT_B_Samsung_6.md5 +1,TILES_A_Cisco_2,TILES_A_Cisco_2.bin,TILES_A_Cisco_2_yuv.md5 +1,TILES_B_Cisco_1,TILES_B_Cisco_1.bin,TILES_B_Cisco_1_yuv.md5 +1,TMVP_A_MS_3,TMVP_A_MS_3.bit,TMVP_A_MS_3.yuv.md5 +1,TSCL_A_VIDYO_5,TSCL_A_VIDYO_5.bit,TSCL_A_VIDYO_5_yuv.md5 +1,TSCL_B_VIDYO_4,TSCL_B_VIDYO_4.bit,TSCL_B_VIDYO_4_yuv.md5 +1,TSKIP_A_MS_3,TSKIP_A_MS_3.bit,TSKIP_A_MS_3.yuv.md5 +0,TSUNEQBD_A_MAIN10_Technicolor_2,TSUNEQBD_A_MAIN10_Technicolor_2.bit,TSUNEQBD_A_MAIN10_Technicolor_2_yuv.md5, # Y/C bit depth unmatched +1,TUSIZE_A_Samsung_1,TUSIZE_A_Samsung_1.bin,TUSIZE_A_Samsung_1.md5 +1,VPSID_A_VIDYO_2,VPSID_A_VIDYO_2.bit,VPSID_A_VIDYO_2_yuv.md5 +1,WP_A_MAIN10_Toshiba_3,WP_A_MAIN10_Toshiba_3.bit,WP_A_MAIN10_Toshiba_3_yuv.md5 +1,WP_A_Toshiba_3,WP_A_Toshiba_3.bit,WP_A_Toshiba_3_yuv.md5 +1,WP_B_Toshiba_3,WP_B_Toshiba_3.bit,WP_B_Toshiba_3_yuv.md5 +1,WP_MAIN10_B_Toshiba_3,WP_MAIN10_B_Toshiba_3.bit,WP_MAIN10_B_Toshiba_3_yuv.md5 +1,WPP_A_ericsson_MAIN10_2,WPP_A_ericsson_MAIN10_2.bit,WPP_A_ericsson_MAIN10_yuv.md5 +1,WPP_A_ericsson_MAIN_2,WPP_A_ericsson_MAIN_2.bit,WPP_A_ericsson_MAIN_2_yuv.md5 +1,WPP_B_ericsson_MAIN10_2,WPP_B_ericsson_MAIN10_2.bit,WPP_B_ericsson_MAIN10_yuv.md5 +1,WPP_B_ericsson_MAIN_2,WPP_B_ericsson_MAIN_2.bit,WPP_B_ericsson_MAIN_2_yuv.md5 +1,WPP_C_ericsson_MAIN10_2,WPP_C_ericsson_MAIN10_2.bit,WPP_C_ericsson_MAIN10_yuv.md5 +1,WPP_C_ericsson_MAIN_2,WPP_C_ericsson_MAIN_2.bit,WPP_C_ericsson_MAIN_2_yuv.md5 +1,WPP_D_ericsson_MAIN10_2,WPP_D_ericsson_MAIN10_2.bit,WPP_D_ericsson_MAIN10_yuv.md5 +1,WPP_D_ericsson_MAIN_2,WPP_D_ericsson_MAIN_2.bit,WPP_D_ericsson_MAIN_2_yuv.md5 +1,WPP_E_ericsson_MAIN10_2,WPP_E_ericsson_MAIN10_2.bit,WPP_E_ericsson_MAIN10_yuv.md5 +1,WPP_E_ericsson_MAIN_2,WPP_E_ericsson_MAIN_2.bit,WPP_E_ericsson_MAIN_2_yuv.md5 +1,WPP_F_ericsson_MAIN10_2,WPP_F_ericsson_MAIN10_2.bit,WPP_F_ericsson_MAIN10_yuv.md5 +1,WPP_F_ericsson_MAIN_2,WPP_F_ericsson_MAIN_2.bit,WPP_F_ericsson_MAIN_2_yuv.md5 diff --git a/pi-util/conf_native.sh b/pi-util/conf_native.sh new file mode 100755 index 0000000000..5fb69ccee2 --- /dev/null +++ b/pi-util/conf_native.sh @@ -0,0 +1,127 @@ +echo "Configure for native build" + +FFSRC=`pwd` +MC=`dpkg --print-architecture` +BUILDBASE=$FFSRC/out + +#RPI_KEEPS="-save-temps=obj" +RPI_KEEPS="" + +NOSHARED= +MMAL= +USR_PREFIX= + +while [ "$1" != "" ] ; do + case $1 in + --noshared) + NOSHARED=1 + ;; + --mmal) + MMAL=1 + ;; + --usr) + USR_PREFIX=/usr + ;; + *) + echo "Usage $0: [--noshared] [--mmal] [--usr]" + echo " noshared Build static libs and executable - good for testing" + echo " mmal Build mmal decoders" + echo " usr Set install prefix to /usr [default=/install]" + exit 1 + ;; + esac + shift +done + + +MCOPTS= +RPI_INCLUDES= +RPI_LIBDIRS= +RPI_DEFINES= +RPI_EXTRALIBS= + +# uname -m gives kernel type which may not have the same +# 32/64bitness as userspace :-( getconf shoudl provide the answer +# but use uname to check we are on the right processor +MC=`uname -m` +LB=`getconf LONG_BIT` +if [ "$MC" == "armv7l" ] || [ "$MC" == "aarch64" ]; then + if [ "$LB" == "32" ]; then + echo "M/C armv7" + A=arm-linux-gnueabihf + B=armv7 + MCOPTS="--arch=armv6t2 --cpu=cortex-a7" + RPI_DEFINES=-mfpu=neon-vfpv4 + elif [ "$LB" == "64" ]; then + echo "M/C aarch64" + A=aarch64-linux-gnu + B=arm64 + else + echo "Unknown LONG_BIT name: $LB" + exit 1 + fi +else + echo "Unknown machine name: $MC" + exit 1 +fi + +if [ $MMAL ]; then + RPI_OPT_VC=/opt/vc + RPI_INCLUDES="-I$RPI_OPT_VC/include -I$RPI_OPT_VC/include/interface/vcos/pthreads -I$RPI_OPT_VC/include/interface/vmcs_host/linux" + RPI_LIBDIRS="-L$RPI_OPT_VC/lib" + RPI_DEFINES="$RPI_DEFINES -D__VCCOREVER__=0x4000000" + RPI_EXTRALIBS="-Wl,--start-group -lbcm_host -lmmal -lmmal_util -lmmal_core -lvcos -lvcsm -lvchostif -lvchiq_arm -Wl,--end-group" + RPIOPTS="--enable-mmal --enable-rpi" +else + RPIOPTS="--disable-mmal --enable-sand" +fi + +C=`lsb_release -sc` +V=`cat RELEASE` + +SHARED_LIBS="--enable-shared" +if [ $NOSHARED ]; then + SHARED_LIBS="--disable-shared" + OUT=$BUILDBASE/$B-$C-$V-static-rel + echo Static libs +else + echo Shared libs + OUT=$BUILDBASE/$B-$C-$V-shared-rel +fi + +if [ ! $USR_PREFIX ]; then + USR_PREFIX=$OUT/install +fi +LIB_PREFIX=$USR_PREFIX/lib/$A +INC_PREFIX=$USR_PREFIX/include/$A + +echo Destination directory: $OUT +mkdir -p $OUT +# Nothing under here need worry git - including this .gitignore! +echo "**" > $BUILDBASE/.gitignore +cd $OUT + +$FFSRC/configure \ + --prefix=$USR_PREFIX\ + --libdir=$LIB_PREFIX\ + --incdir=$INC_PREFIX\ + $MCOPTS\ + --disable-stripping\ + --disable-thumb\ + --enable-v4l2-request\ + --enable-libdrm\ + --enable-vout-egl\ + --enable-vout-drm\ + --enable-gpl\ + $SHARED_LIBS\ + $RPIOPTS\ + --extra-cflags="-ggdb $RPI_KEEPS $RPI_DEFINES $RPI_INCLUDES"\ + --extra-cxxflags="$RPI_DEFINES $RPI_INCLUDES"\ + --extra-ldflags="$RPI_LIBDIRS"\ + --extra-libs="$RPI_EXTRALIBS"\ + --extra-version="rpi" + +echo "Configured into $OUT" + +# gcc option for getting asm listing +# -Wa,-ahls diff --git a/pi-util/ffconf.py b/pi-util/ffconf.py new file mode 100755 index 0000000000..657568014e --- /dev/null +++ b/pi-util/ffconf.py @@ -0,0 +1,215 @@ +#!/usr/bin/env python3 + +import string +import os +import subprocess +import re +import argparse +import sys +import csv +from stat import * + +CODEC_HEVC_RPI = 1 +HWACCEL_RPI = 2 +HWACCEL_DRM = 3 +HWACCEL_VAAPI = 4 + +def testone(fileroot, srcname, es_file, md5_file, pix, dectype, vcodec, ffmpeg_exec): + hwaccel = "" + if dectype == HWACCEL_RPI: + hwaccel = "rpi" + elif dectype == HWACCEL_DRM: + hwaccel = "drm" + elif dectype == HWACCEL_VAAPI: + hwaccel = "vaapi" + + pix_fmt = [] + if pix == "8": + pix_fmt = ["-pix_fmt", "yuv420p"] + elif pix == "10": + pix_fmt = ["-pix_fmt", "yuv420p10le"] + elif pix == "12": + pix_fmt = ["-pix_fmt", "yuv420p12le"] + + tmp_root = "/tmp" + + names = srcname.split('/') + while len(names) > 1: + tmp_root = os.path.join(tmp_root, names[0]) + del names[0] + name = names[0] + + if not os.path.exists(tmp_root): + os.makedirs(tmp_root) + + dec_file = os.path.join(tmp_root, name + ".dec.md5") + try: + os.remove(dec_file) + except: + pass + + flog = open(os.path.join(tmp_root, name + ".log"), "wt") + + ffargs = [ffmpeg_exec, "-flags", "unaligned", "-hwaccel", hwaccel, "-vcodec", "hevc", "-i", os.path.join(fileroot, es_file)] + pix_fmt + ["-f", "md5", dec_file] + + # Unaligned needed for cropping conformance + if hwaccel: + rstr = subprocess.call(ffargs, stdout=flog, stderr=subprocess.STDOUT) + else: + rstr = subprocess.call( + [ffmpeg_exec, "-flags", "unaligned", "-vcodec", vcodec, "-i", os.path.join(fileroot, es_file), "-f", "md5", dec_file], + stdout=flog, stderr=subprocess.STDOUT) + + try: + m1 = None + m2 = None + with open(os.path.join(fileroot, md5_file)) as f: + for line in f: + m1 = re.search("[0-9a-f]{32}", line.lower()) + if m1: + break + + with open(dec_file) as f: + m2 = re.search("[0-9a-f]{32}", f.readline()) + except: + pass + + if m1 and m2 and m1.group() == m2.group(): + print("Match: " + m1.group(), file=flog) + rv = 0 + elif not m1: + print("****** Cannot find m1", file=flog) + rv = 3 + elif not m2: + print("****** Cannot find m2", file=flog) + rv = 2 + else: + print("****** Mismatch: " + m1.group() + " != " + m2.group(), file=flog) + rv = 1 + flog.close() + return rv + +def scandir(root): + aconf = [] + ents = os.listdir(root) + ents.sort(key=str.lower) + for name in ents: + test_path = os.path.join(root, name) + if S_ISDIR(os.stat(test_path).st_mode): + files = os.listdir(test_path) + es_file = "?" + md5_file = "?" + for f in files: + (base, ext) = os.path.splitext(f) + if base[0] == '.': + pass + elif ext == ".bit" or ext == ".bin": + es_file = f + elif ext == ".md5" or (ext == ".txt" and (base[-4:] == "_md5" or base[-6:] == "md5sum")): + if md5_file == "?": + md5_file = f + elif base[-3:] == "yuv": + md5_file = f + aconf.append((1, name, es_file, md5_file)) + return aconf + +def runtest(name, tests): + if not tests: + return True + for t in tests: + if name[0:len(t)] == t or name.find("/" + t) != -1: + return True + return False + +def doconf(csva, tests, test_root, vcodec, dectype, ffmpeg_exec): + unx_failures = [] + unx_success = [] + failures = 0 + successes = 0 + for a in csva: + exp_test = int(a[0]) + if (exp_test and runtest(a[1], tests)): + name = a[1] + print ("==== ", name, end="") + sys.stdout.flush() + + rv = testone(os.path.join(test_root, name), name, a[2], a[3], a[4], dectype=dectype, vcodec=vcodec, ffmpeg_exec=ffmpeg_exec) + if (rv == 0): + successes += 1 + else: + failures += 1 + + if (rv == 0): + if exp_test == 2: + print(": * OK *") + unx_success.append(name) + else: + print(": ok") + elif exp_test == 2 and rv == 1: + print(": fail") + elif exp_test == 3 and rv == 2: + # Call an expected "crash" an abort + print(": abort") + else: + unx_failures.append(name) + if rv == 1: + print(": * FAIL *") + elif (rv == 2) : + print(": * CRASH *") + elif (rv == 3) : + print(": * MD5 MISSING *") + else : + print(": * BANG *") + + if unx_failures or unx_success: + print("Unexpected Failures:", unx_failures) + print("Unexpected Success: ", unx_success) + else: + print("All tests normal:", successes, "ok,", failures, "failed") + + +class ConfCSVDialect(csv.Dialect): + delimiter = ',' + doublequote = True + lineterminator = '\n' + quotechar='"' + quoting = csv.QUOTE_MINIMAL + skipinitialspace = True + strict = True + +if __name__ == '__main__': + + argp = argparse.ArgumentParser(description="FFmpeg h265 conformance tester") + argp.add_argument("tests", nargs='*') + argp.add_argument("--pi4", action='store_true', help="Force pi4 cmd line") + argp.add_argument("--drm", action='store_true', help="Force v4l2 drm cmd line") + argp.add_argument("--vaapi", action='store_true', help="Force vaapi cmd line") + argp.add_argument("--test_root", default="/opt/conform/h265.2016", help="Root dir for test") + argp.add_argument("--csvgen", action='store_true', help="Generate CSV file for dir") + argp.add_argument("--csv", default="pi-util/conf_h265.2016.csv", help="CSV filename") + argp.add_argument("--vcodec", default="hevc_rpi", help="vcodec name to use") + argp.add_argument("--ffmpeg", default="./ffmpeg", help="ffmpeg exec name") + args = argp.parse_args() + + if args.csvgen: + csv.writer(sys.stdout).writerows(scandir(args.test_root)) + exit(0) + + with open(args.csv, 'rt') as csvfile: + csva = [a for a in csv.reader(csvfile, ConfCSVDialect())] + + dectype = CODEC_HEVC_RPI + if os.path.exists("/dev/rpivid-hevcmem"): + dectype = HWACCEL_RPI + if args.drm or os.path.exists("/sys/module/rpivid_hevc"): + dectype = HWACCEL_DRM + + if args.pi4: + dectype = HWACCEL_RPI + elif args.drm: + dectype = HWACCEL_DRM + elif args.vaapi: + dectype = HWACCEL_VAAPI + + doconf(csva, args.tests, args.test_root, args.vcodec, dectype, args.ffmpeg) + diff --git a/pi-util/ffperf.py b/pi-util/ffperf.py new file mode 100755 index 0000000000..65c5224cd8 --- /dev/null +++ b/pi-util/ffperf.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python3 + +import time +import string +import os +import tempfile +import subprocess +import re +import argparse +import sys +import csv +from stat import * + +class tstats: + close_threshold = 0.01 + + def __init__(self, stats_dict=None): + if stats_dict != None: + self.name = stats_dict["name"] + self.elapsed = float(stats_dict["elapsed"]) + self.user = float(stats_dict["user"]) + self.sys = float(stats_dict["sys"]) + + def times_str(self): + ctime = self.sys + self.user + return "time=%6.2f, cpu=%6.2f (%4.2f%%)" % (self.elapsed, ctime, (ctime * 100.0) / self.elapsed) + + def dict(self): + return {"name":self.name, "elapsed":self.elapsed, "user":self.user, "sys":self.sys} + + def is_close(self, other): + return abs(self.elapsed - other.elapsed) / self.elapsed < self.close_threshold + + def __lt__(self, other): + return self.elapsed < other.elapsed + def __gt__(self, other): + return self.elapsed > other.elapsed + + def time_file(name, prefix, ffmpeg="./ffmpeg"): + stats = tstats() + stats.name = name + start_time = time.clock_gettime(time.CLOCK_MONOTONIC); + cproc = subprocess.Popen([ffmpeg, "-no_cvt_hw", + "-vcodec", "hevc_rpi", + "-t", "30", "-i", prefix + name, + "-f", "vout_rpi", os.devnull], bufsize=-1, stdout=flog, stderr=flog); + pinfo = os.wait4(cproc.pid, 0) + end_time = time.clock_gettime(time.CLOCK_MONOTONIC); + stats.elapsed = end_time - start_time + stats.user = pinfo[2].ru_utime + stats.sys = pinfo[2].ru_stime + return stats + + +def common_prefix(s1, s2): + for i in range(min(len(s1),len(s2))): + if s1[i] != s2[i]: + return s1[:i] + return s1[:i+1] + +def main(): + global flog + + argp = argparse.ArgumentParser(description="FFmpeg performance tester", epilog=""" +To blank the screen before starting use "xdg-screensaver activate" +(For some reason this doesn't seem to work from within python). +""") + + argp.add_argument("streams", nargs='*') + argp.add_argument("--csv_out", default="ffperf_out.csv", help="CSV output filename") + argp.add_argument("--csv_in", help="CSV input filename") + argp.add_argument("--prefix", help="Filename prefix (include terminal '/' if a directory).") + argp.add_argument("--repeat", default=3, type=int, help="Run repeat count") + argp.add_argument("--ffmpeg", default="./ffmpeg", help="FFmpeg executable") + + args = argp.parse_args() + + csv_out = csv.DictWriter(open(args.csv_out, 'w', newline=''), ["name", "elapsed", "user", "sys"]) + csv_out.writeheader() + + stats_in = {} + if args.csv_in != None: + with open(args.csv_in, 'r', newline='') as f_in: + stats_in = {x["name"]:tstats(x) for x in csv.DictReader(f_in)} + + flog = open(os.path.join(tempfile.gettempdir(), "ffperf.log"), "wt") + + streams = args.streams + if not streams: + if not stats_in: + print ("No source streams specified") + return 1 + prefix = "" if args.prefix == None else args.prefix + streams = [k for k in stats_in] + elif args.prefix != None: + prefix = args.prefix + else: + prefix = streams[0] + for f in streams[1:]: + prefix = common_prefix(prefix, f) + pp = prefix.rpartition(os.sep) + prefix = pp[0] + pp[1] + streams = [s[len(prefix):] for s in streams] + + for f in sorted(streams, key=lambda x : "~" * x.count(os.sep) + x.lower()): + print ("====", f) + + t0 = tstats({"name":f, "elapsed":999, "user":999, "sys":999}) + for i in range(args.repeat): + t = tstats.time_file(f, prefix, args.ffmpeg) + print ("...", t.times_str()) + if t0 > t: + t0 = t + + if t0.name in stats_in: + pstat = stats_in[t0.name] + print("---" if pstat.is_close(t0) else "<<<" if t0 < pstat else ">>>", pstat.times_str()) + + csv_out.writerow(t0.dict()) + + print () + + return 0 + + +if __name__ == '__main__': + exit(main()) + diff --git a/pi-util/genpatch.sh b/pi-util/genpatch.sh new file mode 100755 index 0000000000..0948a68a7a --- /dev/null +++ b/pi-util/genpatch.sh @@ -0,0 +1,35 @@ +set -e + +NOPATCH= +if [ "$1" == "--notag" ]; then + shift + NOPATCH=1 +fi + +if [ "$1" == "" ]; then + echo Usage: $0 [--notag] \ + echo e.g.: $0 mmal_4 + exit 1 +fi + +VERSION=`cat RELEASE` +if [ "$VERSION" == "" ]; then + echo Can\'t find version RELEASE + exit 1 +fi + +PATCHFILE=../ffmpeg-$VERSION-$1.patch + +if [ $NOPATCH ]; then + echo Not tagged +else + # Only continue if we are all comitted + git diff --name-status --exit-code + + PATCHTAG=pi/$VERSION/$1 + echo Tagging: $PATCHTAG + + git tag $PATCHTAG +fi +echo Generating patch: $PATCHFILE +git diff n$VERSION -- > $PATCHFILE diff --git a/pi-util/make_array.py b/pi-util/make_array.py new file mode 100755 index 0000000000..67b22d2d51 --- /dev/null +++ b/pi-util/make_array.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +# Usage +# make_array file.bin +# Produces file.h with array of bytes. +# +import sys +for file in sys.argv[1:]: + prefix,suffix = file.split('.') + assert suffix=='bin' + name=prefix.split('/')[-1] + print 'Converting',file + with open(prefix+'.h','wb') as out: + print >>out, 'static const unsigned char',name,'[] = {' + with open(file,'rb') as fd: + i = 0 + for byte in fd.read(): + print >>out, '0x%02x, ' % ord(byte), + i = i + 1 + if i % 8 == 0: + print >>out, ' // %04x' % (i - 8) + print >>out,'};' + diff --git a/pi-util/mkinst.sh b/pi-util/mkinst.sh new file mode 100755 index 0000000000..271a39e846 --- /dev/null +++ b/pi-util/mkinst.sh @@ -0,0 +1,5 @@ +set -e + +make install + +cp -r install/* ../vlc/sysroot/raspian_stretch_pi1-sysroot/usr diff --git a/pi-util/patkodi.sh b/pi-util/patkodi.sh new file mode 100644 index 0000000000..dcd05a606e --- /dev/null +++ b/pi-util/patkodi.sh @@ -0,0 +1,9 @@ +set -e +KODIBASE=/home/jc/rpi/kodi/xbmc +JOBS=-j20 +make $JOBS +git diff xbmc/release/4.3-kodi > $KODIBASE/tools/depends/target/ffmpeg/pfcd_hevc_optimisations.patch +make -C $KODIBASE/tools/depends/target/ffmpeg $JOBS +make -C $KODIBASE/build install + + diff --git a/pi-util/perfcmp.py b/pi-util/perfcmp.py new file mode 100755 index 0000000000..e44cfa0c3c --- /dev/null +++ b/pi-util/perfcmp.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 + +import time +import string +import os +import tempfile +import subprocess +import re +import argparse +import sys +import csv +from stat import * + +class tstats: + close_threshold = 0.01 + + def __init__(self, stats_dict=None): + if stats_dict != None: + self.name = stats_dict["name"] + self.elapsed = float(stats_dict["elapsed"]) + self.user = float(stats_dict["user"]) + self.sys = float(stats_dict["sys"]) + + def times_str(self): + ctime = self.sys + self.user + return "time=%6.2f, cpu=%6.2f (%4.2f%%)" % (self.elapsed, ctime, (ctime * 100.0) / self.elapsed) + + def dict(self): + return {"name":self.name, "elapsed":self.elapsed, "user":self.user, "sys":self.sys} + + def is_close(self, other): + return abs(self.elapsed - other.elapsed) / self.elapsed < self.close_threshold + + def __lt__(self, other): + return self.elapsed < other.elapsed + def __gt__(self, other): + return self.elapsed > other.elapsed + + def time_file(name, prefix): + stats = tstats() + stats.name = name + start_time = time.clock_gettime(time.CLOCK_MONOTONIC); + cproc = subprocess.Popen(["./ffmpeg", "-t", "30", "-i", prefix + name, + "-f", "null", os.devnull], bufsize=-1, stdout=flog, stderr=flog); + pinfo = os.wait4(cproc.pid, 0) + end_time = time.clock_gettime(time.CLOCK_MONOTONIC); + stats.elapsed = end_time - start_time + stats.user = pinfo[2].ru_utime + stats.sys = pinfo[2].ru_stime + return stats + + +def common_prefix(s1, s2): + for i in range(min(len(s1),len(s2))): + if s1[i] != s2[i]: + return s1[:i] + return s1[:i+1] + +def main(): + argp = argparse.ArgumentParser(description="FFmpeg performance compare") + + argp.add_argument("stream0", help="CSV to compare") + argp.add_argument("stream1", nargs='?', default="ffperf_out.csv", help="CSV to compare") + + args = argp.parse_args() + + with open(args.stream0, 'r', newline='') as f_in: + stats0 = {x["name"]:tstats(x) for x in csv.DictReader(f_in)} + with open(args.stream1, 'r', newline='') as f_in: + stats1 = {x["name"]:tstats(x) for x in csv.DictReader(f_in)} + + print (args.stream0, "<<-->>", args.stream1) + print () + + for f in sorted(stats0.keys() | stats1.keys(), key=lambda x : "~" * x.count(os.sep) + x.lower()): + if not (f in stats0) : + print (" XX :", f) + continue + if not (f in stats1) : + print (" XX :", f) + continue + + s0 = stats0[f] + s1 = stats1[f] + + pcent = ((s0.elapsed - s1.elapsed) / s0.elapsed) * 100.0 + thresh = 0.3 + tc = 6 + + nchar = min(tc - 1, int(abs(pcent) / thresh)) + cc = " -- " if nchar == 0 else "<" * nchar + " " * (tc - nchar) if pcent < 0 else " " * (tc - nchar) + ">" * nchar + + print ("%6.2f %s%6.2f (%+5.2f) : %s" % + (s0.elapsed, cc, s1.elapsed, pcent, f)) + + return 0 + + +if __name__ == '__main__': + exit(main()) + diff --git a/pi-util/qem.sh b/pi-util/qem.sh new file mode 100755 index 0000000000..a4dbb6eacd --- /dev/null +++ b/pi-util/qem.sh @@ -0,0 +1,9 @@ +TARGET_DIR=../src/eupton_vc4dev_2012a/software/vc4/DEV/applications/tutorials/user_shader_example_tex +QASM=python\ ../local/bin/qasm.py +SRC_FILE=libavcodec/rpi_hevc_shader.qasm +DST_BASE=shader + +cp libavcodec/rpi_hevc_shader_cmd.h $TARGET_DIR +$QASM -mc_c:$DST_BASE,$DST_BASE,$DST_BASE $SRC_FILE > $TARGET_DIR/$DST_BASE.c +$QASM -mc_h:$DST_BASE,$DST_BASE,$DST_BASE $SRC_FILE > $TARGET_DIR/$DST_BASE.h + diff --git a/pi-util/testfilt.py b/pi-util/testfilt.py new file mode 100755 index 0000000000..b322dac0c2 --- /dev/null +++ b/pi-util/testfilt.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 + +import string +import os +import subprocess +import re +import argparse +import sys +import csv +from stat import * + +class validator: + def __init__(self): + self.ok = False + + def isok(self): + return self.ok + + def setok(self): + self.ok = True + +class valid_regex(validator): + def __init__(self, regex): + super().__init__() + self.regex = re.compile(regex) + + def scanline(self, line): + if self.isok() or self.regex.search(line): + self.setok() + + +def validate(validators, flog): + for line in flog: + for v in validators: + v.scanline(line) + + ok = True + for v in validators: + if not v.isok(): + ok = False + # complain + print("Test failed") + + if ok: + print("OK") + return ok + +def runtest(name, ffmpeg, args, suffix, validators): + log_root = os.path.join("/tmp", "testfilt", name) + ofilename = os.path.join(log_root, name + suffix) + + if not os.path.exists(log_root): + os.makedirs(log_root) + + try: + os.remove(ofilename) + except: + pass + + flog = open(os.path.join(log_root, name + ".log"), "wb") + ffargs = [ffmpeg] + args + [ofilename] + + subprocess.call(ffargs, stdout=flog, stderr=subprocess.STDOUT, text=False) + flog.close + + flog = open(os.path.join(log_root, name + ".log"), "rt") + return validate(validators, flog) + +def sayok(log_root, flog): + print("Woohoo") + return True + +if __name__ == '__main__': + + argp = argparse.ArgumentParser(description="FFmpeg filter tester") + argp.add_argument("--ffmpeg", default="./ffmpeg", help="ffmpeg exec name") + args = argp.parse_args() + + runtest("ATest", args.ffmpeg, ["-v", "verbose", "-no_cvt_hw", "-an", "-c:v", "h264_v4l2m2m", "-i", + "/home/johncox/server/TestMedia/Sony/jellyfish-10-mbps-hd-h264.mkv", +# "/home/jc/rpi/streams/jellyfish-3-mbps-hd-h264.mkv", + "-c:v", "h264_v4l2m2m", "-b:v", "2M"], ".mkv", + [valid_regex(r'Output stream #0:0 \(video\): 900 frames encoded; 900 packets muxed')]) diff --git a/pi-util/v3dusage.py b/pi-util/v3dusage.py new file mode 100755 index 0000000000..5935a11ca5 --- /dev/null +++ b/pi-util/v3dusage.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python + +import sys +import argparse +import re + +def do_logparse(logname): + + rmatch = re.compile(r'^([0-9]+\.[0-9]{3}): (done )?((vpu0)|(vpu1)|(qpu1)) ([A-Z_]+) cb:([0-9a-f]+) ') + rqcycle = re.compile(r'^([0-9]+\.[0-9]{3}): v3d: QPU Total clock cycles for all QPUs doing vertex/coordinate shading +([0-9]+)$') + rqtscycle = re.compile(r'^([0-9]+\.[0-9]{3}): v3d: QPU Total clock cycles for all QPUs stalled waiting for TMUs +([0-9]+)$') + rl2hits = re.compile(r'^([0-9]+\.[0-9]{3}): v3d: L2C Total Level 2 cache ([a-z]+) +([0-9]+)$') + + ttotal = {'idle':0.0} + tstart = {} + qctotal = {} + qtstotal = {} + l2hits = {} + l2total = {} + time0 = None + idle_start = None + qpu_op_no = 0 + op_count = 0 + + with open(logname, "rt") as infile: + for line in infile: + match = rmatch.match(line) + if match: +# print match.group(1), ":", match.group(2), ":", match.group(3), ":", match.group(7), ":" + time = float(match.group(1)) + unit = match.group(3) + opstart = not match.group(2) + optype = match.group(7) + hascb = match.group(8) != "0" + + if unit == 'qpu1': + unit = unit + "." + str(qpu_op_no) + if not opstart: + if hascb or optype == 'EXECUTE_SYNC': + qpu_op_no = 0 + else: + qpu_op_no += 1 + + # Ignore sync type + if optype == 'EXECUTE_SYNC': + continue + + if not time0: + time0 = time + + if opstart: + tstart[unit] = time; + elif unit in tstart: + op_count += 1 + if not unit in ttotal: + ttotal[unit] = 0.0 + ttotal[unit] += time - tstart[unit] + del tstart[unit] + + if not idle_start and not tstart: + idle_start = time + elif idle_start and tstart: + ttotal['idle'] += time - idle_start + idle_start = None + + match = rqcycle.match(line) + if match: + unit = "qpu1." + str(qpu_op_no) + if not unit in qctotal: + qctotal[unit] = 0 + qctotal[unit] += int(match.group(2)) + + match = rqtscycle.match(line) + if match: + unit = "qpu1." + str(qpu_op_no) + if not unit in qtstotal: + qtstotal[unit] = 0 + qtstotal[unit] += int(match.group(2)) + + match = rl2hits.match(line) + if match: + unit = "qpu1." + str(qpu_op_no) + if not unit in l2total: + l2total[unit] = 0 + l2hits[unit] = 0 + l2total[unit] += int(match.group(3)) + if match.group(2) == "hits": + l2hits[unit] += int(match.group(3)) + + + if not time0: + print "No v3d profile records found" + else: + tlogged = time - time0 + + print "Logged time:", tlogged, " Op count:", op_count + for unit in sorted(ttotal): + print b'%6s: %10.3f %7.3f%%' % (unit, ttotal[unit], ttotal[unit] * 100.0 / tlogged) + print + for unit in sorted(qctotal): + if not unit in qtstotal: + qtstotal[unit] = 0; + print b'%6s: Qcycles: %10d, TMU stall: %10d (%7.3f%%)' % (unit, qctotal[unit], qtstotal[unit], (qtstotal[unit] * 100.0)/qctotal[unit]) + if unit in l2total: + print b' L2Total: %10d, hits: %10d (%7.3f%%)' % (l2total[unit], l2hits[unit], (l2hits[unit] * 100.0)/l2total[unit]) + + + +if __name__ == '__main__': + argp = argparse.ArgumentParser( + formatter_class=argparse.RawDescriptionHelpFormatter, + description="QPU/VPU perf summary from VC logging", + epilog = """ +Will also summarise TMU stalls if logging requests set in qpu noflush param +in the profiled code. + +Example use: + vcgencmd set_logging level=0xc0 + + sudo vcdbg log msg >& t.log + v3dusage.py t.log +""") + + argp.add_argument("logfile") + args = argp.parse_args() + + do_logparse(args.logfile) + diff --git a/tests/checkasm/Makefile b/tests/checkasm/Makefile index 1827a4e134..3c765a5eb1 100644 --- a/tests/checkasm/Makefile +++ b/tests/checkasm/Makefile @@ -9,8 +9,10 @@ AVCODECOBJS-$(CONFIG_G722DSP) += g722dsp.o AVCODECOBJS-$(CONFIG_H264DSP) += h264dsp.o AVCODECOBJS-$(CONFIG_H264PRED) += h264pred.o AVCODECOBJS-$(CONFIG_H264QPEL) += h264qpel.o +AVCODECOBJS-$(CONFIG_IDCTDSP) += idctdsp.o AVCODECOBJS-$(CONFIG_LLVIDDSP) += llviddsp.o AVCODECOBJS-$(CONFIG_LLVIDENCDSP) += llviddspenc.o +AVCODECOBJS-$(CONFIG_VC1DSP) += vc1dsp.o AVCODECOBJS-$(CONFIG_VP8DSP) += vp8dsp.o AVCODECOBJS-$(CONFIG_VIDEODSP) += videodsp.o @@ -35,6 +37,7 @@ CHECKASMOBJS-$(CONFIG_AVCODEC) += $(AVCODECOBJS-yes) # libavfilter tests AVFILTEROBJS-$(CONFIG_AFIR_FILTER) += af_afir.o AVFILTEROBJS-$(CONFIG_BLEND_FILTER) += vf_blend.o +AVFILTEROBJS-$(CONFIG_BWDIF_FILTER) += vf_bwdif.o AVFILTEROBJS-$(CONFIG_COLORSPACE_FILTER) += vf_colorspace.o AVFILTEROBJS-$(CONFIG_EQ_FILTER) += vf_eq.o AVFILTEROBJS-$(CONFIG_GBLUR_FILTER) += vf_gblur.o @@ -52,8 +55,9 @@ CHECKASMOBJS-$(CONFIG_SWSCALE) += $(SWSCALEOBJS) # libavutil tests AVUTILOBJS += fixed_dsp.o AVUTILOBJS += float_dsp.o +AVUTILOBJS-$(CONFIG_SAND) += rpi_sand.o -CHECKASMOBJS-$(CONFIG_AVUTIL) += $(AVUTILOBJS) +CHECKASMOBJS-$(CONFIG_AVUTIL) += $(AVUTILOBJS) $(AVUTILOBJS-yes) CHECKASMOBJS-$(ARCH_AARCH64) += aarch64/checkasm.o CHECKASMOBJS-$(HAVE_ARMV5TE_EXTERNAL) += arm/checkasm.o diff --git a/tests/checkasm/checkasm.c b/tests/checkasm/checkasm.c index 8338e8ff58..c1ee09c72e 100644 --- a/tests/checkasm/checkasm.c +++ b/tests/checkasm/checkasm.c @@ -131,6 +131,9 @@ static const struct { #if CONFIG_HUFFYUV_DECODER { "huffyuvdsp", checkasm_check_huffyuvdsp }, #endif + #if CONFIG_IDCTDSP + { "idctdsp", checkasm_check_idctdsp }, + #endif #if CONFIG_JPEG2000_DECODER { "jpeg2000dsp", checkasm_check_jpeg2000dsp }, #endif @@ -155,6 +158,9 @@ static const struct { #if CONFIG_V210_ENCODER { "v210enc", checkasm_check_v210enc }, #endif + #if CONFIG_VC1DSP + { "vc1dsp", checkasm_check_vc1dsp }, + #endif #if CONFIG_VP8DSP { "vp8dsp", checkasm_check_vp8dsp }, #endif @@ -172,6 +178,9 @@ static const struct { #if CONFIG_BLEND_FILTER { "vf_blend", checkasm_check_blend }, #endif + #if CONFIG_BWDIF_FILTER + { "vf_bwdif", checkasm_check_vf_bwdif }, + #endif #if CONFIG_COLORSPACE_FILTER { "vf_colorspace", checkasm_check_colorspace }, #endif @@ -198,6 +207,9 @@ static const struct { #if CONFIG_AVUTIL { "fixed_dsp", checkasm_check_fixed_dsp }, { "float_dsp", checkasm_check_float_dsp }, + #if CONFIG_SAND + { "rpi_sand", checkasm_check_rpi_sand }, + #endif #endif { NULL } }; diff --git a/tests/checkasm/checkasm.h b/tests/checkasm/checkasm.h index ef6645e3a2..02d3642836 100644 --- a/tests/checkasm/checkasm.h +++ b/tests/checkasm/checkasm.h @@ -70,12 +70,14 @@ void checkasm_check_hevc_epel_bi(void); void checkasm_check_hevc_epel_bi_w(void); void checkasm_check_hevc_sao(void); void checkasm_check_huffyuvdsp(void); +void checkasm_check_idctdsp(void); void checkasm_check_jpeg2000dsp(void); void checkasm_check_llviddsp(void); void checkasm_check_llviddspenc(void); void checkasm_check_nlmeans(void); void checkasm_check_opusdsp(void); void checkasm_check_pixblockdsp(void); +void checkasm_check_rpi_sand(void); void checkasm_check_sbrdsp(void); void checkasm_check_synth_filter(void); void checkasm_check_sw_rgb(void); @@ -83,6 +85,8 @@ void checkasm_check_sw_scale(void); void checkasm_check_utvideodsp(void); void checkasm_check_v210dec(void); void checkasm_check_v210enc(void); +void checkasm_check_vc1dsp(void); +void checkasm_check_vf_bwdif(void); void checkasm_check_vf_eq(void); void checkasm_check_vf_gblur(void); void checkasm_check_vf_hflip(void); diff --git a/tests/checkasm/idctdsp.c b/tests/checkasm/idctdsp.c new file mode 100644 index 0000000000..02724536a7 --- /dev/null +++ b/tests/checkasm/idctdsp.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2022 Ben Avison + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with FFmpeg; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include + +#include "checkasm.h" + +#include "libavcodec/idctdsp.h" + +#include "libavutil/common.h" +#include "libavutil/internal.h" +#include "libavutil/intreadwrite.h" +#include "libavutil/mem_internal.h" + +#define IDCTDSP_TEST(func) { #func, offsetof(IDCTDSPContext, func) }, + +typedef struct { + const char *name; + size_t offset; +} test; + +#define RANDOMIZE_BUFFER16(name, size) \ + do { \ + int i; \ + for (i = 0; i < size; ++i) { \ + uint16_t r = rnd() % 0x201 - 0x100; \ + AV_WN16A(name##0 + i, r); \ + AV_WN16A(name##1 + i, r); \ + } \ + } while (0) + +#define RANDOMIZE_BUFFER8(name, size) \ + do { \ + int i; \ + for (i = 0; i < size; ++i) { \ + uint8_t r = rnd(); \ + name##0[i] = r; \ + name##1[i] = r; \ + } \ + } while (0) + +static void check_add_put_clamped(void) +{ + /* Source buffers are only as big as needed, since any over-read won't affect results */ + LOCAL_ALIGNED_16(int16_t, src0, [64]); + LOCAL_ALIGNED_16(int16_t, src1, [64]); + /* Destination buffers have borders of one row above/below and 8 columns left/right to catch overflows */ + LOCAL_ALIGNED_8(uint8_t, dst0, [10 * 24]); + LOCAL_ALIGNED_8(uint8_t, dst1, [10 * 24]); + + AVCodecContext avctx = { 0 }; + IDCTDSPContext h; + + const test tests[] = { + IDCTDSP_TEST(add_pixels_clamped) + IDCTDSP_TEST(put_pixels_clamped) + IDCTDSP_TEST(put_signed_pixels_clamped) + }; + + ff_idctdsp_init(&h, &avctx); + + for (size_t t = 0; t < FF_ARRAY_ELEMS(tests); ++t) { + void (*func)(const int16_t *, uint8_t * ptrdiff_t) = *(void **)((intptr_t) &h + tests[t].offset); + if (check_func(func, "idctdsp.%s", tests[t].name)) { + declare_func_emms(AV_CPU_FLAG_MMX, void, const int16_t *, uint8_t *, ptrdiff_t); + RANDOMIZE_BUFFER16(src, 64); + RANDOMIZE_BUFFER8(dst, 10 * 24); + call_ref(src0, dst0 + 24 + 8, 24); + call_new(src1, dst1 + 24 + 8, 24); + if (memcmp(dst0, dst1, 10 * 24)) + fail(); + bench_new(src1, dst1 + 24 + 8, 24); + } + } +} + +void checkasm_check_idctdsp(void) +{ + check_add_put_clamped(); + report("idctdsp"); +} diff --git a/tests/checkasm/rpi_sand.c b/tests/checkasm/rpi_sand.c new file mode 100644 index 0000000000..0888714c4c --- /dev/null +++ b/tests/checkasm/rpi_sand.c @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2023 John Cox + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with FFmpeg; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include "checkasm.h" +#include "libavutil/common.h" +#include "libavutil/rpi_sand_fns.h" + +#if ARCH_ARM +#include "libavutil/arm/cpu.h" +#include "libavutil/arm/rpi_sand_neon.h" +#elif ARCH_AARCH64 +#include "libavutil/aarch64/cpu.h" +#include "libavutil/aarch64/rpi_sand_neon.h" +#endif + +static inline uint32_t pack30(unsigned int a, unsigned int b, unsigned int c) +{ + return (a & 0x3ff) | ((b & 0x3ff) << 10) | ((c & 0x3ff) << 20); +} + +void checkasm_check_rpi_sand(void) +{ + const unsigned int w = 1280; + const unsigned int h = 66; + const unsigned int stride1 = 128; + const unsigned int stride2 = h*3/2; + const unsigned int ssize = ((w+95)/96)*128*h*3/2; + const unsigned int ysize = ((w + 32) * (h + 32) * 2); + + uint8_t * sbuf0 = malloc(ssize); + uint8_t * sbuf1 = malloc(ssize); + uint8_t * ybuf0 = malloc(ysize); + uint8_t * ybuf1 = malloc(ysize); + uint8_t * vbuf0 = malloc(ysize); + uint8_t * vbuf1 = malloc(ysize); + uint8_t * yframe0 = (w + 32) * 16 + ybuf0; + uint8_t * yframe1 = (w + 32) * 16 + ybuf1; + uint8_t * vframe0 = (w + 32) * 16 + vbuf0; + uint8_t * vframe1 = (w + 32) * 16 + vbuf1; + unsigned int i; + + for (i = 0; i != ssize; i += 4) + *(uint32_t*)(sbuf0 + i) = rnd(); + memcpy(sbuf1, sbuf0, ssize); + + if (check_func(have_neon(av_get_cpu_flags()) ? ff_rpi_sand30_lines_to_planar_y16 : av_rpi_sand30_to_planar_y16, "rpi_sand30_to_planar_y16")) { + declare_func(void, uint8_t * dst, const unsigned int dst_stride, + const uint8_t * src, + unsigned int stride1, unsigned int stride2, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h); + + memset(ybuf0, 0xbb, ysize); + memset(ybuf1, 0xbb, ysize); + + call_ref(yframe0, (w + 32) * 2, sbuf0, stride1, stride2, 0, 0, w, h); + call_new(yframe1, (w + 32) * 2, sbuf1, stride1, stride2, 0, 0, w, h); + + if (memcmp(sbuf0, sbuf1, ssize) + || memcmp(ybuf0, ybuf1, ysize)) + fail(); + + bench_new(ybuf1, (w + 32) * 2, sbuf1, stride1, stride2, 0, 0, w, h); + } + + if (check_func(have_neon(av_get_cpu_flags()) ? ff_rpi_sand30_lines_to_planar_c16 : av_rpi_sand30_to_planar_c16, "rpi_sand30_to_planar_c16")) { + declare_func(void, uint8_t * u_dst, const unsigned int u_stride, + uint8_t * v_dst, const unsigned int v_stride, + const uint8_t * src, + unsigned int stride1, unsigned int stride2, + unsigned int _x, unsigned int y, + unsigned int _w, unsigned int h); + + memset(ybuf0, 0xbb, ysize); + memset(ybuf1, 0xbb, ysize); + memset(vbuf0, 0xbb, ysize); + memset(vbuf1, 0xbb, ysize); + + call_ref(yframe0, (w + 32), vframe0, (w + 32), sbuf0, stride1, stride2, 0, 0, w/2, h/2); + call_new(yframe1, (w + 32), vframe1, (w + 32), sbuf1, stride1, stride2, 0, 0, w/2, h/2); + + if (memcmp(sbuf0, sbuf1, ssize) + || memcmp(ybuf0, ybuf1, ysize) + || memcmp(vbuf0, vbuf1, ysize)) + fail(); + + bench_new(yframe1, (w + 32), vframe1, (w + 32), sbuf1, stride1, stride2, 0, 0, w/2, h/2); + } + + + report("sand30"); + + free(sbuf0); + free(sbuf1); + free(ybuf0); + free(ybuf1); + free(vbuf0); + free(vbuf1); +} + diff --git a/tests/checkasm/vc1dsp.c b/tests/checkasm/vc1dsp.c new file mode 100644 index 0000000000..52628d15e4 --- /dev/null +++ b/tests/checkasm/vc1dsp.c @@ -0,0 +1,452 @@ +/* + * Copyright (c) 2022 Ben Avison + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with FFmpeg; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include + +#include "checkasm.h" + +#include "libavcodec/vc1dsp.h" + +#include "libavutil/common.h" +#include "libavutil/internal.h" +#include "libavutil/intreadwrite.h" +#include "libavutil/mem_internal.h" + +#define VC1DSP_TEST(func) { #func, offsetof(VC1DSPContext, func) }, +#define VC1DSP_SIZED_TEST(func, width, height) { #func, offsetof(VC1DSPContext, func), width, height }, + +typedef struct { + const char *name; + size_t offset; + int width; + int height; +} test; + +typedef struct matrix { + size_t width; + size_t height; + float d[]; +} matrix; + +static const matrix T8 = { 8, 8, { + 12, 12, 12, 12, 12, 12, 12, 12, + 16, 15, 9, 4, -4, -9, -15, -16, + 16, 6, -6, -16, -16, -6, 6, 16, + 15, -4, -16, -9, 9, 16, 4, -15, + 12, -12, -12, 12, 12, -12, -12, 12, + 9, -16, 4, 15, -15, -4, 16, -9, + 6, -16, 16, -6, -6, 16, -16, 6, + 4, -9, 15, -16, 16, -15, 9, -4 +} }; + +static const matrix T4 = { 4, 4, { + 17, 17, 17, 17, + 22, 10, -10, -22, + 17, -17, -17, 17, + 10, -22, 22, -10 +} }; + +static const matrix T8t = { 8, 8, { + 12, 16, 16, 15, 12, 9, 6, 4, + 12, 15, 6, -4, -12, -16, -16, -9, + 12, 9, -6, -16, -12, 4, 16, 15, + 12, 4, -16, -9, 12, 15, -6, -16, + 12, -4, -16, 9, 12, -15, -6, 16, + 12, -9, -6, 16, -12, -4, 16, -15, + 12, -15, 6, 4, -12, 16, -16, 9, + 12, -16, 16, -15, 12, -9, 6, -4 +} }; + +static const matrix T4t = { 4, 4, { + 17, 22, 17, 10, + 17, 10, -17, -22, + 17, -10, -17, 22, + 17, -22, 17, -10 +} }; + +static matrix *new_matrix(size_t width, size_t height) +{ + matrix *out = av_mallocz(sizeof (matrix) + height * width * sizeof (float)); + if (out == NULL) { + fprintf(stderr, "Memory allocation failure\n"); + exit(EXIT_FAILURE); + } + out->width = width; + out->height = height; + return out; +} + +static matrix *multiply(const matrix *a, const matrix *b) +{ + matrix *out; + if (a->width != b->height) { + fprintf(stderr, "Incompatible multiplication\n"); + exit(EXIT_FAILURE); + } + out = new_matrix(b->width, a->height); + for (int j = 0; j < out->height; ++j) + for (int i = 0; i < out->width; ++i) { + float sum = 0; + for (int k = 0; k < a->width; ++k) + sum += a->d[j * a->width + k] * b->d[k * b->width + i]; + out->d[j * out->width + i] = sum; + } + return out; +} + +static void normalise(matrix *a) +{ + for (int j = 0; j < a->height; ++j) + for (int i = 0; i < a->width; ++i) { + float *p = a->d + j * a->width + i; + *p *= 64; + if (a->height == 4) + *p /= (const unsigned[]) { 289, 292, 289, 292 } [j]; + else + *p /= (const unsigned[]) { 288, 289, 292, 289, 288, 289, 292, 289 } [j]; + if (a->width == 4) + *p /= (const unsigned[]) { 289, 292, 289, 292 } [i]; + else + *p /= (const unsigned[]) { 288, 289, 292, 289, 288, 289, 292, 289 } [i]; + } +} + +static void divide_and_round_nearest(matrix *a, float by) +{ + for (int j = 0; j < a->height; ++j) + for (int i = 0; i < a->width; ++i) { + float *p = a->d + j * a->width + i; + *p = rintf(*p / by); + } +} + +static void tweak(matrix *a) +{ + for (int j = 4; j < a->height; ++j) + for (int i = 0; i < a->width; ++i) { + float *p = a->d + j * a->width + i; + *p += 1; + } +} + +/* The VC-1 spec places restrictions on the values permitted at three + * different stages: + * - D: the input coefficients in frequency domain + * - E: the intermediate coefficients, inverse-transformed only horizontally + * - R: the fully inverse-transformed coefficients + * + * To fully cater for the ranges specified requires various intermediate + * values to be held to 17-bit precision; yet these conditions do not appear + * to be utilised in real-world streams. At least some assembly + * implementations have chosen to restrict these values to 16-bit precision, + * to accelerate the decoding of real-world streams at the cost of strict + * adherence to the spec. To avoid our test marking these as failures, + * reduce our random inputs. + */ +#define ATTENUATION 4 + +static matrix *generate_inverse_quantized_transform_coefficients(size_t width, size_t height) +{ + matrix *raw, *tmp, *D, *E, *R; + raw = new_matrix(width, height); + for (int i = 0; i < width * height; ++i) + raw->d[i] = (int) (rnd() % (1024/ATTENUATION)) - 512/ATTENUATION; + tmp = multiply(height == 8 ? &T8 : &T4, raw); + D = multiply(tmp, width == 8 ? &T8t : &T4t); + normalise(D); + divide_and_round_nearest(D, 1); + for (int i = 0; i < width * height; ++i) { + if (D->d[i] < -2048/ATTENUATION || D->d[i] > 2048/ATTENUATION-1) { + /* Rare, so simply try again */ + av_free(raw); + av_free(tmp); + av_free(D); + return generate_inverse_quantized_transform_coefficients(width, height); + } + } + E = multiply(D, width == 8 ? &T8 : &T4); + divide_and_round_nearest(E, 8); + for (int i = 0; i < width * height; ++i) + if (E->d[i] < -4096/ATTENUATION || E->d[i] > 4096/ATTENUATION-1) { + /* Rare, so simply try again */ + av_free(raw); + av_free(tmp); + av_free(D); + av_free(E); + return generate_inverse_quantized_transform_coefficients(width, height); + } + R = multiply(height == 8 ? &T8t : &T4t, E); + tweak(R); + divide_and_round_nearest(R, 128); + for (int i = 0; i < width * height; ++i) + if (R->d[i] < -512/ATTENUATION || R->d[i] > 512/ATTENUATION-1) { + /* Rare, so simply try again */ + av_free(raw); + av_free(tmp); + av_free(D); + av_free(E); + av_free(R); + return generate_inverse_quantized_transform_coefficients(width, height); + } + av_free(raw); + av_free(tmp); + av_free(E); + av_free(R); + return D; +} + +#define RANDOMIZE_BUFFER16(name, size) \ + do { \ + int i; \ + for (i = 0; i < size; ++i) { \ + uint16_t r = rnd(); \ + AV_WN16A(name##0 + i, r); \ + AV_WN16A(name##1 + i, r); \ + } \ + } while (0) + +#define RANDOMIZE_BUFFER8(name, size) \ + do { \ + int i; \ + for (i = 0; i < size; ++i) { \ + uint8_t r = rnd(); \ + name##0[i] = r; \ + name##1[i] = r; \ + } \ + } while (0) + +#define RANDOMIZE_BUFFER8_MID_WEIGHTED(name, size) \ + do { \ + uint8_t *p##0 = name##0, *p##1 = name##1; \ + int i = (size); \ + while (i-- > 0) { \ + int x = 0x80 | (rnd() & 0x7F); \ + x >>= rnd() % 9; \ + if (rnd() & 1) \ + x = -x; \ + *p##1++ = *p##0++ = 0x80 + x; \ + } \ + } while (0) + +static void check_inv_trans_inplace(void) +{ + /* Inverse transform input coefficients are stored in a 16-bit buffer + * with row stride of 8 coefficients irrespective of transform size. + * vc1_inv_trans_8x8 differs from the others in two ways: coefficients + * are stored in column-major order, and the outputs are written back + * to the input buffer, so we oversize it slightly to catch overruns. */ + LOCAL_ALIGNED_16(int16_t, inv_trans_in0, [10 * 8]); + LOCAL_ALIGNED_16(int16_t, inv_trans_in1, [10 * 8]); + + VC1DSPContext h; + + ff_vc1dsp_init(&h); + + if (check_func(h.vc1_inv_trans_8x8, "vc1dsp.vc1_inv_trans_8x8")) { + matrix *coeffs; + declare_func_emms(AV_CPU_FLAG_MMX, void, int16_t *); + RANDOMIZE_BUFFER16(inv_trans_in, 10 * 8); + coeffs = generate_inverse_quantized_transform_coefficients(8, 8); + for (int j = 0; j < 8; ++j) + for (int i = 0; i < 8; ++i) { + int idx = 8 + i * 8 + j; + inv_trans_in1[idx] = inv_trans_in0[idx] = coeffs->d[j * 8 + i]; + } + call_ref(inv_trans_in0 + 8); + call_new(inv_trans_in1 + 8); + if (memcmp(inv_trans_in0, inv_trans_in1, 10 * 8 * sizeof (int16_t))) + fail(); + bench_new(inv_trans_in1 + 8); + av_free(coeffs); + } +} + +static void check_inv_trans_adding(void) +{ + /* Inverse transform input coefficients are stored in a 16-bit buffer + * with row stride of 8 coefficients irrespective of transform size. */ + LOCAL_ALIGNED_16(int16_t, inv_trans_in0, [8 * 8]); + LOCAL_ALIGNED_16(int16_t, inv_trans_in1, [8 * 8]); + + /* For all but vc1_inv_trans_8x8, the inverse transform is narrowed and + * added with saturation to an array of unsigned 8-bit values. Oversize + * this by 8 samples left and right and one row above and below. */ + LOCAL_ALIGNED_8(uint8_t, inv_trans_out0, [10 * 24]); + LOCAL_ALIGNED_8(uint8_t, inv_trans_out1, [10 * 24]); + + VC1DSPContext h; + + const test tests[] = { + VC1DSP_SIZED_TEST(vc1_inv_trans_8x4, 8, 4) + VC1DSP_SIZED_TEST(vc1_inv_trans_4x8, 4, 8) + VC1DSP_SIZED_TEST(vc1_inv_trans_4x4, 4, 4) + VC1DSP_SIZED_TEST(vc1_inv_trans_8x8_dc, 8, 8) + VC1DSP_SIZED_TEST(vc1_inv_trans_8x4_dc, 8, 4) + VC1DSP_SIZED_TEST(vc1_inv_trans_4x8_dc, 4, 8) + VC1DSP_SIZED_TEST(vc1_inv_trans_4x4_dc, 4, 4) + }; + + ff_vc1dsp_init(&h); + + for (size_t t = 0; t < FF_ARRAY_ELEMS(tests); ++t) { + void (*func)(uint8_t *, ptrdiff_t, int16_t *) = *(void **)((intptr_t) &h + tests[t].offset); + if (check_func(func, "vc1dsp.%s", tests[t].name)) { + matrix *coeffs; + declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *, ptrdiff_t, int16_t *); + RANDOMIZE_BUFFER16(inv_trans_in, 8 * 8); + RANDOMIZE_BUFFER8(inv_trans_out, 10 * 24); + coeffs = generate_inverse_quantized_transform_coefficients(tests[t].width, tests[t].height); + for (int j = 0; j < tests[t].height; ++j) + for (int i = 0; i < tests[t].width; ++i) { + int idx = j * 8 + i; + inv_trans_in1[idx] = inv_trans_in0[idx] = coeffs->d[j * tests[t].width + i]; + } + call_ref(inv_trans_out0 + 24 + 8, 24, inv_trans_in0); + call_new(inv_trans_out1 + 24 + 8, 24, inv_trans_in1); + if (memcmp(inv_trans_out0, inv_trans_out1, 10 * 24)) + fail(); + bench_new(inv_trans_out1 + 24 + 8, 24, inv_trans_in1 + 8); + av_free(coeffs); + } + } +} + +static void check_loop_filter(void) +{ + /* Deblocking filter buffers are big enough to hold a 16x16 block, + * plus 16 columns left and 4 rows above to hold filter inputs + * (depending on whether v or h neighbouring block edge, oversized + * horizontally to maintain 16-byte alignment) plus 16 columns and + * 4 rows below to catch write overflows */ + LOCAL_ALIGNED_16(uint8_t, filter_buf0, [24 * 48]); + LOCAL_ALIGNED_16(uint8_t, filter_buf1, [24 * 48]); + + VC1DSPContext h; + + const test tests[] = { + VC1DSP_TEST(vc1_v_loop_filter4) + VC1DSP_TEST(vc1_h_loop_filter4) + VC1DSP_TEST(vc1_v_loop_filter8) + VC1DSP_TEST(vc1_h_loop_filter8) + VC1DSP_TEST(vc1_v_loop_filter16) + VC1DSP_TEST(vc1_h_loop_filter16) + }; + + ff_vc1dsp_init(&h); + + for (size_t t = 0; t < FF_ARRAY_ELEMS(tests); ++t) { + void (*func)(uint8_t *, ptrdiff_t, int) = *(void **)((intptr_t) &h + tests[t].offset); + declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *, ptrdiff_t, int); + if (check_func(func, "vc1dsp.%s", tests[t].name)) { + for (int count = 1000; count > 0; --count) { + int pq = rnd() % 31 + 1; + RANDOMIZE_BUFFER8_MID_WEIGHTED(filter_buf, 24 * 48); + call_ref(filter_buf0 + 4 * 48 + 16, 48, pq); + call_new(filter_buf1 + 4 * 48 + 16, 48, pq); + if (memcmp(filter_buf0, filter_buf1, 24 * 48)) + fail(); + } + } + for (int j = 0; j < 24; ++j) + for (int i = 0; i < 48; ++i) + filter_buf1[j * 48 + i] = 0x60 + 0x40 * (i >= 16 && j >= 4); + if (check_func(func, "vc1dsp.%s_bestcase", tests[t].name)) + bench_new(filter_buf1 + 4 * 48 + 16, 48, 1); + if (check_func(func, "vc1dsp.%s_worstcase", tests[t].name)) + bench_new(filter_buf1 + 4 * 48 + 16, 48, 31); + } +} + +#define TEST_UNESCAPE \ + do { \ + for (int count = 100; count > 0; --count) { \ + escaped_offset = rnd() & 7; \ + unescaped_offset = rnd() & 7; \ + escaped_len = (1u << (rnd() % 8) + 3) - (rnd() & 7); \ + RANDOMIZE_BUFFER8(unescaped, UNESCAPE_BUF_SIZE); \ + len0 = call_ref(escaped0 + escaped_offset, escaped_len, unescaped0 + unescaped_offset); \ + len1 = call_new(escaped1 + escaped_offset, escaped_len, unescaped1 + unescaped_offset); \ + if (len0 != len1 || memcmp(unescaped0, unescaped1, UNESCAPE_BUF_SIZE)) \ + fail(); \ + } \ + } while (0) + +static void check_unescape(void) +{ + /* This appears to be a typical length of buffer in use */ +#define LOG2_UNESCAPE_BUF_SIZE 17 +#define UNESCAPE_BUF_SIZE (1u< +#include "checkasm.h" +#include "libavcodec/internal.h" +#include "libavfilter/bwdif.h" +#include "libavutil/mem_internal.h" + +#define WIDTH 256 + +#define randomize_buffers(buf0, buf1, mask, count) \ + for (size_t i = 0; i < count; i++) \ + buf0[i] = buf1[i] = rnd() & mask + +#define randomize_overflow_check(buf0, buf1, mask, count) \ + for (size_t i = 0; i < count; i++) \ + buf0[i] = buf1[i] = (rnd() & 1) != 0 ? mask : 0; + +#define BODY(type, depth) \ + do { \ + type prev0[9*WIDTH], prev1[9*WIDTH]; \ + type next0[9*WIDTH], next1[9*WIDTH]; \ + type cur0[9*WIDTH], cur1[9*WIDTH]; \ + type dst0[WIDTH], dst1[WIDTH]; \ + const int stride = WIDTH; \ + const int mask = (1< Date: Tue, 24 Apr 2018 23:00:23 -0700 Subject: [PATCH 1/9] libavcodec: v4l2m2m: output AVDRMFrameDescriptor This allows for a zero-copy output by exporting the v4l2 buffer then wrapping that buffer in the AVDRMFrameDescriptor like it is done in rkmpp. This has been in use for quite some time with great success on many platforms including: - Amlogic S905 - Raspberry Pi - i.MX6 - Dragonboard 410c This was developed in conjunction with Kodi to allow handling the zero-copy buffer rendering. A simply utility for testing is also available here: https://github.com/BayLibre/ffmpeg-drm todo: - allow selecting pixel format output from decoder - allow configuring amount of output and capture buffers V2: - allow selecting AV_PIX_FMT_DRM_PRIME V3: - use get_format to select AV_PIX_FMT_DRM_PRIME - use hw_configs - add handling of AV_PIX_FMT_YUV420P format (for raspberry pi) - add handling of AV_PIX_FMT_YUYV422 format (for i.MX6 coda decoder) V4: - rebased on 4.2.2 V5: - rebased on 4.3 --- libavcodec/v4l2_buffers.c | 155 ++++++++++++++++++++++++++++++++++++-- libavcodec/v4l2_buffers.h | 4 + libavcodec/v4l2_context.c | 40 +++++++++- libavcodec/v4l2_m2m.h | 3 + libavcodec/v4l2_m2m_dec.c | 23 ++++++ 5 files changed, 213 insertions(+), 12 deletions(-) diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c index 4b2679eb38..cbd3e5680d 100644 --- a/libavcodec/v4l2_buffers.c +++ b/libavcodec/v4l2_buffers.c @@ -21,6 +21,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include #include @@ -30,6 +31,7 @@ #include "libavcodec/avcodec.h" #include "libavcodec/internal.h" #include "libavutil/pixdesc.h" +#include "libavutil/hwcontext.h" #include "v4l2_context.h" #include "v4l2_buffers.h" #include "v4l2_m2m.h" @@ -210,7 +212,79 @@ static enum AVColorTransferCharacteristic v4l2_get_color_trc(V4L2Buffer *buf) return AVCOL_TRC_UNSPECIFIED; } -static void v4l2_free_buffer(void *opaque, uint8_t *unused) +static uint8_t * v4l2_get_drm_frame(V4L2Buffer *avbuf) +{ + AVDRMFrameDescriptor *drm_desc = &avbuf->drm_frame; + AVDRMLayerDescriptor *layer; + + /* fill the DRM frame descriptor */ + drm_desc->nb_objects = avbuf->num_planes; + drm_desc->nb_layers = 1; + + layer = &drm_desc->layers[0]; + layer->nb_planes = avbuf->num_planes; + + for (int i = 0; i < avbuf->num_planes; i++) { + layer->planes[i].object_index = i; + layer->planes[i].offset = 0; + layer->planes[i].pitch = avbuf->plane_info[i].bytesperline; + } + + switch (avbuf->context->av_pix_fmt) { + case AV_PIX_FMT_YUYV422: + + layer->format = DRM_FORMAT_YUYV; + layer->nb_planes = 1; + + break; + + case AV_PIX_FMT_NV12: + case AV_PIX_FMT_NV21: + + layer->format = avbuf->context->av_pix_fmt == AV_PIX_FMT_NV12 ? + DRM_FORMAT_NV12 : DRM_FORMAT_NV21; + + if (avbuf->num_planes > 1) + break; + + layer->nb_planes = 2; + + layer->planes[1].object_index = 0; + layer->planes[1].offset = avbuf->plane_info[0].bytesperline * + avbuf->context->format.fmt.pix.height; + layer->planes[1].pitch = avbuf->plane_info[0].bytesperline; + break; + + case AV_PIX_FMT_YUV420P: + + layer->format = DRM_FORMAT_YUV420; + + if (avbuf->num_planes > 1) + break; + + layer->nb_planes = 3; + + layer->planes[1].object_index = 0; + layer->planes[1].offset = avbuf->plane_info[0].bytesperline * + avbuf->context->format.fmt.pix.height; + layer->planes[1].pitch = avbuf->plane_info[0].bytesperline >> 1; + + layer->planes[2].object_index = 0; + layer->planes[2].offset = layer->planes[1].offset + + ((avbuf->plane_info[0].bytesperline * + avbuf->context->format.fmt.pix.height) >> 2); + layer->planes[2].pitch = avbuf->plane_info[0].bytesperline >> 1; + break; + + default: + drm_desc->nb_layers = 0; + break; + } + + return (uint8_t *) drm_desc; +} + +static void v4l2_free_buffer(void *opaque, uint8_t *data) { V4L2Buffer* avbuf = opaque; V4L2m2mContext *s = buf_to_m2mctx(avbuf); @@ -234,6 +308,36 @@ static void v4l2_free_buffer(void *opaque, uint8_t *unused) } } +static int v4l2_buffer_export_drm(V4L2Buffer* avbuf) +{ + struct v4l2_exportbuffer expbuf; + int i, ret; + + for (i = 0; i < avbuf->num_planes; i++) { + memset(&expbuf, 0, sizeof(expbuf)); + + expbuf.index = avbuf->buf.index; + expbuf.type = avbuf->buf.type; + expbuf.plane = i; + + ret = ioctl(buf_to_m2mctx(avbuf)->fd, VIDIOC_EXPBUF, &expbuf); + if (ret < 0) + return AVERROR(errno); + + if (V4L2_TYPE_IS_MULTIPLANAR(avbuf->buf.type)) { + /* drm frame */ + avbuf->drm_frame.objects[i].size = avbuf->buf.m.planes[i].length; + avbuf->drm_frame.objects[i].fd = expbuf.fd; + } else { + /* drm frame */ + avbuf->drm_frame.objects[0].size = avbuf->buf.length; + avbuf->drm_frame.objects[0].fd = expbuf.fd; + } + } + + return 0; +} + static int v4l2_buf_increase_ref(V4L2Buffer *in) { V4L2m2mContext *s = buf_to_m2mctx(in); @@ -254,6 +358,24 @@ static int v4l2_buf_increase_ref(V4L2Buffer *in) return 0; } +static int v4l2_buf_to_bufref_drm(V4L2Buffer *in, AVBufferRef **buf) +{ + int ret; + + *buf = av_buffer_create((uint8_t *) &in->drm_frame, + sizeof(in->drm_frame), + v4l2_free_buffer, + in, AV_BUFFER_FLAG_READONLY); + if (!*buf) + return AVERROR(ENOMEM); + + ret = v4l2_buf_increase_ref(in); + if (ret) + av_buffer_unref(buf); + + return ret; +} + static int v4l2_buf_to_bufref(V4L2Buffer *in, int plane, AVBufferRef **buf) { int ret; @@ -303,13 +425,24 @@ static int v4l2_buffer_buf_to_swframe(AVFrame *frame, V4L2Buffer *avbuf) frame->format = avbuf->context->av_pix_fmt; - for (i = 0; i < avbuf->num_planes; i++) { - ret = v4l2_buf_to_bufref(avbuf, i, &frame->buf[i]); + if (buf_to_m2mctx(avbuf)->output_drm) { + /* 1. get references to the actual data */ + ret = v4l2_buf_to_bufref_drm(avbuf, &frame->buf[0]); if (ret) return ret; - frame->linesize[i] = avbuf->plane_info[i].bytesperline; - frame->data[i] = frame->buf[i]->data; + frame->data[0] = (uint8_t *) v4l2_get_drm_frame(avbuf); + frame->format = AV_PIX_FMT_DRM_PRIME; + } else { + /* 1. get references to the actual data */ + for (i = 0; i < avbuf->num_planes; i++) { + ret = v4l2_buf_to_bufref(avbuf, i, &frame->buf[i]); + if (ret) + return ret; + + frame->linesize[i] = avbuf->plane_info[i].bytesperline; + frame->data[i] = frame->buf[i]->data; + } } /* fixup special cases */ @@ -543,9 +676,6 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index) avbuf->status = V4L2BUF_AVAILABLE; - if (V4L2_TYPE_IS_OUTPUT(ctx->type)) - return 0; - if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { avbuf->buf.m.planes = avbuf->planes; avbuf->buf.length = avbuf->num_planes; @@ -555,6 +685,15 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index) avbuf->buf.length = avbuf->planes[0].length; } + if (V4L2_TYPE_IS_OUTPUT(ctx->type)) + return 0; + + if (buf_to_m2mctx(avbuf)->output_drm) { + ret = v4l2_buffer_export_drm(avbuf); + if (ret) + return ret; + } + return ff_v4l2_buffer_enqueue(avbuf); } diff --git a/libavcodec/v4l2_buffers.h b/libavcodec/v4l2_buffers.h index 8dbc7fc104..037e667997 100644 --- a/libavcodec/v4l2_buffers.h +++ b/libavcodec/v4l2_buffers.h @@ -27,6 +27,7 @@ #include #include +#include "libavutil/hwcontext_drm.h" #include "avcodec.h" enum V4L2Buffer_status { @@ -42,6 +43,9 @@ typedef struct V4L2Buffer { /* each buffer needs to have a reference to its context */ struct V4L2Context *context; + /* DRM descriptor */ + AVDRMFrameDescriptor drm_frame; + /* This object is refcounted per-plane, so we need to keep track * of how many context-refs we are holding. */ AVBufferRef *context_ref; diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c index ff1ea8e57b..e9e8c27a54 100644 --- a/libavcodec/v4l2_context.c +++ b/libavcodec/v4l2_context.c @@ -455,22 +455,54 @@ static int v4l2_release_buffers(V4L2Context* ctx) struct v4l2_requestbuffers req = { .memory = V4L2_MEMORY_MMAP, .type = ctx->type, - .count = 0, /* 0 -> unmaps buffers from the driver */ + .count = 0, /* 0 -> unmap all buffers from the driver */ }; - int i, j; + int ret, i, j; for (i = 0; i < ctx->num_buffers; i++) { V4L2Buffer *buffer = &ctx->buffers[i]; for (j = 0; j < buffer->num_planes; j++) { struct V4L2Plane_info *p = &buffer->plane_info[j]; + + if (V4L2_TYPE_IS_OUTPUT(ctx->type)) { + /* output buffers are not EXPORTED */ + goto unmap; + } + + if (ctx_to_m2mctx(ctx)->output_drm) { + /* use the DRM frame to close */ + if (buffer->drm_frame.objects[j].fd >= 0) { + if (close(buffer->drm_frame.objects[j].fd) < 0) { + av_log(logger(ctx), AV_LOG_ERROR, "%s close drm fd " + "[buffer=%2d, plane=%d, fd=%2d] - %s \n", + ctx->name, i, j, buffer->drm_frame.objects[j].fd, + av_err2str(AVERROR(errno))); + } + } + } +unmap: if (p->mm_addr && p->length) if (munmap(p->mm_addr, p->length) < 0) - av_log(logger(ctx), AV_LOG_ERROR, "%s unmap plane (%s))\n", ctx->name, av_err2str(AVERROR(errno))); + av_log(logger(ctx), AV_LOG_ERROR, "%s unmap plane (%s))\n", + ctx->name, av_err2str(AVERROR(errno))); } } - return ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_REQBUFS, &req); + ret = ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_REQBUFS, &req); + if (ret < 0) { + av_log(logger(ctx), AV_LOG_ERROR, "release all %s buffers (%s)\n", + ctx->name, av_err2str(AVERROR(errno))); + + if (ctx_to_m2mctx(ctx)->output_drm) + av_log(logger(ctx), AV_LOG_ERROR, + "Make sure the DRM client releases all FB/GEM objects before closing the codec (ie):\n" + "for all buffers: \n" + " 1. drmModeRmFB(..)\n" + " 2. drmIoctl(.., DRM_IOCTL_GEM_CLOSE,... )\n"); + } + + return ret; } static inline int v4l2_try_raw_format(V4L2Context* ctx, enum AVPixelFormat pixfmt) diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h index b67b216331..0fbd19a013 100644 --- a/libavcodec/v4l2_m2m.h +++ b/libavcodec/v4l2_m2m.h @@ -66,6 +66,9 @@ typedef struct V4L2m2mContext { /* reference back to V4L2m2mPriv */ void *priv; + + /* generate DRM frames */ + int output_drm; } V4L2m2mContext; typedef struct V4L2m2mPriv { diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c index ab07c0a24a..6bc7442702 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -23,6 +23,9 @@ #include #include + +#include "libavutil/hwcontext.h" +#include "libavutil/hwcontext_drm.h" #include "libavutil/pixfmt.h" #include "libavutil/pixdesc.h" #include "libavutil/opt.h" @@ -30,6 +33,9 @@ #include "libavcodec/decode.h" #include "libavcodec/internal.h" +#include "libavcodec/hwaccels.h" +#include "libavcodec/internal.h" + #include "v4l2_context.h" #include "v4l2_m2m.h" #include "v4l2_fmt.h" @@ -201,6 +207,15 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) capture->av_codec_id = AV_CODEC_ID_RAWVIDEO; capture->av_pix_fmt = avctx->pix_fmt; + /* the client requests the codec to generate DRM frames: + * - data[0] will therefore point to the returned AVDRMFrameDescriptor + * check the ff_v4l2_buffer_to_avframe conversion function. + * - the DRM frame format is passed in the DRM frame descriptor layer. + * check the v4l2_get_drm_frame function. + */ + if (ff_get_format(avctx, avctx->codec->pix_fmts) == AV_PIX_FMT_DRM_PRIME) + s->output_drm = 1; + s->avctx = avctx; ret = ff_v4l2_m2m_codec_init(priv); if (ret) { @@ -226,6 +241,11 @@ static const AVOption options[] = { { NULL}, }; +static const AVCodecHWConfigInternal *v4l2_m2m_hw_configs[] = { + HW_CONFIG_INTERNAL(DRM_PRIME), + NULL +}; + #define M2MDEC_CLASS(NAME) \ static const AVClass v4l2_m2m_ ## NAME ## _dec_class = { \ .class_name = #NAME "_v4l2m2m_decoder", \ @@ -249,6 +269,9 @@ static const AVOption options[] = { .bsfs = bsf_name, \ .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, \ .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS | FF_CODEC_CAP_INIT_CLEANUP, \ + .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_DRM_PRIME, \ + AV_PIX_FMT_NONE}, \ + .hw_configs = v4l2_m2m_hw_configs, \ .wrapper_name = "v4l2m2m", \ } From deb0ba531401f069dc6e4dcf235dfc08bca6577c Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Thu, 16 Aug 2018 21:09:40 -0700 Subject: [PATCH 2/9] libavcodec: v4l2m2m: depends on libdrm --- configure | 1 + libavcodec/v4l2_buffers.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/configure b/configure index 4ba72bf84b..efb065905c 100755 --- a/configure +++ b/configure @@ -3438,6 +3438,7 @@ sndio_indev_deps="sndio" sndio_outdev_deps="sndio" v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h" v4l2_indev_suggest="libv4l2" +v4l2_outdev_deps="libdrm" v4l2_outdev_deps_any="linux_videodev2_h sys_videoio_h" v4l2_outdev_suggest="libv4l2" vfwcap_indev_deps="vfw32 vfwcap_defines" diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c index cbd3e5680d..bebe2c1796 100644 --- a/libavcodec/v4l2_buffers.c +++ b/libavcodec/v4l2_buffers.c @@ -21,7 +21,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include +#include #include #include #include From f89fad11f53110cd6968c83e89bafb0c449f34ec Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Thu, 16 Aug 2018 21:10:13 -0700 Subject: [PATCH 3/9] libavcodec: v4l2m2m: set format_modifier to DRM_FORMAT_MOD_LINEAR --- libavcodec/v4l2_buffers.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c index bebe2c1796..12037d5d66 100644 --- a/libavcodec/v4l2_buffers.c +++ b/libavcodec/v4l2_buffers.c @@ -328,10 +328,12 @@ static int v4l2_buffer_export_drm(V4L2Buffer* avbuf) /* drm frame */ avbuf->drm_frame.objects[i].size = avbuf->buf.m.planes[i].length; avbuf->drm_frame.objects[i].fd = expbuf.fd; + avbuf->drm_frame.objects[i].format_modifier = DRM_FORMAT_MOD_LINEAR; } else { /* drm frame */ avbuf->drm_frame.objects[0].size = avbuf->buf.length; avbuf->drm_frame.objects[0].fd = expbuf.fd; + avbuf->drm_frame.objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; } } From d5a37af1a8fe1ed70428e55286126d241986dd0c Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Thu, 16 Aug 2018 21:10:53 -0700 Subject: [PATCH 4/9] libavcodec: v4l2m2m: only mmap the buffer when it is output type and drm prime is used --- libavcodec/v4l2_buffers.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c index 12037d5d66..1adf518ab9 100644 --- a/libavcodec/v4l2_buffers.c +++ b/libavcodec/v4l2_buffers.c @@ -662,14 +662,22 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index) if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { avbuf->plane_info[i].length = avbuf->buf.m.planes[i].length; - avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.m.planes[i].length, - PROT_READ | PROT_WRITE, MAP_SHARED, - buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.planes[i].m.mem_offset); + + if ((V4L2_TYPE_IS_OUTPUT(ctx->type) && buf_to_m2mctx(avbuf)->output_drm) || + !buf_to_m2mctx(avbuf)->output_drm) { + avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.m.planes[i].length, + PROT_READ | PROT_WRITE, MAP_SHARED, + buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.planes[i].m.mem_offset); + } } else { avbuf->plane_info[i].length = avbuf->buf.length; - avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.length, - PROT_READ | PROT_WRITE, MAP_SHARED, - buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.offset); + + if ((V4L2_TYPE_IS_OUTPUT(ctx->type) && buf_to_m2mctx(avbuf)->output_drm) || + !buf_to_m2mctx(avbuf)->output_drm) { + avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.length, + PROT_READ | PROT_WRITE, MAP_SHARED, + buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.offset); + } } if (avbuf->plane_info[i].mm_addr == MAP_FAILED) From d0be699166cdc413a5dc3e1c087433ac7cf142e7 Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Thu, 16 Aug 2018 21:11:38 -0700 Subject: [PATCH 5/9] libavcodec: v4l2m2m: allow using software pixel formats --- libavcodec/v4l2_m2m_dec.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c index 6bc7442702..4b9baf833c 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -213,8 +213,16 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) * - the DRM frame format is passed in the DRM frame descriptor layer. * check the v4l2_get_drm_frame function. */ - if (ff_get_format(avctx, avctx->codec->pix_fmts) == AV_PIX_FMT_DRM_PRIME) + switch (ff_get_format(avctx, avctx->codec->pix_fmts)) { + case AV_PIX_FMT_DRM_PRIME: s->output_drm = 1; + break; + case AV_PIX_FMT_NONE: + return 0; + break; + default: + break; + } s->avctx = avctx; ret = ff_v4l2_m2m_codec_init(priv); @@ -270,6 +278,7 @@ static const AVCodecHWConfigInternal *v4l2_m2m_hw_configs[] = { .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, \ .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS | FF_CODEC_CAP_INIT_CLEANUP, \ .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_DRM_PRIME, \ + AV_PIX_FMT_NV12, \ AV_PIX_FMT_NONE}, \ .hw_configs = v4l2_m2m_hw_configs, \ .wrapper_name = "v4l2m2m", \ From c4736742883eb2a1965ac65a5c75d5409e3c85a0 Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Mon, 24 Sep 2018 13:39:31 -0700 Subject: [PATCH 6/9] libavcodec: v4l2m2m: implement hwcontext --- libavcodec/v4l2_buffers.c | 22 ++++++++++++++++++++++ libavcodec/v4l2_context.h | 2 ++ libavcodec/v4l2_m2m.h | 2 ++ libavcodec/v4l2_m2m_dec.c | 11 +++++++++++ 4 files changed, 37 insertions(+) diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c index 1adf518ab9..6e2a544394 100644 --- a/libavcodec/v4l2_buffers.c +++ b/libavcodec/v4l2_buffers.c @@ -435,6 +435,7 @@ static int v4l2_buffer_buf_to_swframe(AVFrame *frame, V4L2Buffer *avbuf) frame->data[0] = (uint8_t *) v4l2_get_drm_frame(avbuf); frame->format = AV_PIX_FMT_DRM_PRIME; + frame->hw_frames_ctx = av_buffer_ref(avbuf->context->frames_ref); } else { /* 1. get references to the actual data */ for (i = 0; i < avbuf->num_planes; i++) { @@ -635,6 +636,27 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index) avbuf->buf.type = ctx->type; avbuf->buf.index = index; + if (buf_to_m2mctx(avbuf)->output_drm) { + AVHWFramesContext *hwframes; + + av_buffer_unref(&ctx->frames_ref); + + ctx->frames_ref = av_hwframe_ctx_alloc(buf_to_m2mctx(avbuf)->device_ref); + if (!ctx->frames_ref) { + ret = AVERROR(ENOMEM); + return ret; + } + + hwframes = (AVHWFramesContext*)ctx->frames_ref->data; + hwframes->format = AV_PIX_FMT_DRM_PRIME; + hwframes->sw_format = ctx->av_pix_fmt; + hwframes->width = ctx->width; + hwframes->height = ctx->height; + ret = av_hwframe_ctx_init(ctx->frames_ref); + if (ret < 0) + return ret; + } + if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { avbuf->buf.length = VIDEO_MAX_PLANES; avbuf->buf.m.planes = avbuf->planes; diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h index 22a9532444..e804e94131 100644 --- a/libavcodec/v4l2_context.h +++ b/libavcodec/v4l2_context.h @@ -92,6 +92,8 @@ typedef struct V4L2Context { */ int done; + AVBufferRef *frames_ref; + } V4L2Context; /** diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h index 0fbd19a013..adf5997bb5 100644 --- a/libavcodec/v4l2_m2m.h +++ b/libavcodec/v4l2_m2m.h @@ -67,6 +67,8 @@ typedef struct V4L2m2mContext { /* reference back to V4L2m2mPriv */ void *priv; + AVBufferRef *device_ref; + /* generate DRM frames */ int output_drm; } V4L2m2mContext; diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c index 4b9baf833c..6c23693137 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -35,6 +35,7 @@ #include "libavcodec/hwaccels.h" #include "libavcodec/internal.h" +#include "libavcodec/hwconfig.h" #include "v4l2_context.h" #include "v4l2_m2m.h" @@ -224,6 +225,16 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) break; } + s->device_ref = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_DRM); + if (!s->device_ref) { + ret = AVERROR(ENOMEM); + return ret; + } + + ret = av_hwdevice_ctx_init(s->device_ref); + if (ret < 0) + return ret; + s->avctx = avctx; ret = ff_v4l2_m2m_codec_init(priv); if (ret) { From 0b15c77718900bf60c91217ed1492390022ad6db Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Mon, 4 May 2020 13:01:29 -0700 Subject: [PATCH 7/9] libavcodec: v4l2m2m: allow lower minimum buffer values There is no reason to enforce a high minimum. In the context of streaming only a few output buffers and capture buffers are even needed for continuous playback. This also helps alleviate memory pressure when decoding 4K media. --- libavcodec/v4l2_m2m.h | 2 +- libavcodec/v4l2_m2m_dec.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h index adf5997bb5..1082b9dad2 100644 --- a/libavcodec/v4l2_m2m.h +++ b/libavcodec/v4l2_m2m.h @@ -38,7 +38,7 @@ #define V4L_M2M_DEFAULT_OPTS \ { "num_output_buffers", "Number of buffers in the output context",\ - OFFSET(num_output_buffers), AV_OPT_TYPE_INT, { .i64 = 16 }, 6, INT_MAX, FLAGS } + OFFSET(num_output_buffers), AV_OPT_TYPE_INT, { .i64 = 16 }, 2, INT_MAX, FLAGS } typedef struct V4L2m2mContext { char devname[PATH_MAX]; diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c index 6c23693137..e323c37052 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -256,7 +256,7 @@ static av_cold int v4l2_decode_close(AVCodecContext *avctx) static const AVOption options[] = { V4L_M2M_DEFAULT_OPTS, { "num_capture_buffers", "Number of buffers in the capture context", - OFFSET(num_capture_buffers), AV_OPT_TYPE_INT, {.i64 = 20}, 20, INT_MAX, FLAGS }, + OFFSET(num_capture_buffers), AV_OPT_TYPE_INT, {.i64 = 20}, 2, INT_MAX, FLAGS }, { NULL}, }; From acc86933e5fe3a13aae44cf84c48bab6c717e49b Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Wed, 6 May 2020 11:12:58 -0700 Subject: [PATCH 8/9] libavcodec: v4l2m2m: add option to specify pixel format used by the decoder --- libavcodec/v4l2_context.c | 9 +++++++++ libavcodec/v4l2_m2m.h | 2 ++ libavcodec/v4l2_m2m_dec.c | 1 + 3 files changed, 12 insertions(+) diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c index e9e8c27a54..a97b70e836 100644 --- a/libavcodec/v4l2_context.c +++ b/libavcodec/v4l2_context.c @@ -531,6 +531,8 @@ static inline int v4l2_try_raw_format(V4L2Context* ctx, enum AVPixelFormat pixfm static int v4l2_get_raw_format(V4L2Context* ctx, enum AVPixelFormat *p) { + V4L2m2mContext* s = ctx_to_m2mctx(ctx); + V4L2m2mPriv *priv = s->avctx->priv_data; enum AVPixelFormat pixfmt = ctx->av_pix_fmt; struct v4l2_fmtdesc fdesc; int ret; @@ -549,6 +551,13 @@ static int v4l2_get_raw_format(V4L2Context* ctx, enum AVPixelFormat *p) if (ret) return AVERROR(EINVAL); + if (priv->pix_fmt != AV_PIX_FMT_NONE) { + if (fdesc.pixelformat != ff_v4l2_format_avfmt_to_v4l2(priv->pix_fmt)) { + fdesc.index++; + continue; + } + } + pixfmt = ff_v4l2_format_v4l2_to_avfmt(fdesc.pixelformat, AV_CODEC_ID_RAWVIDEO); ret = v4l2_try_raw_format(ctx, pixfmt); if (ret){ diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h index 1082b9dad2..943a8923c4 100644 --- a/libavcodec/v4l2_m2m.h +++ b/libavcodec/v4l2_m2m.h @@ -30,6 +30,7 @@ #include #include "libavcodec/avcodec.h" +#include "libavutil/pixfmt.h" #include "v4l2_context.h" #define container_of(ptr, type, member) ({ \ @@ -81,6 +82,7 @@ typedef struct V4L2m2mPriv { int num_output_buffers; int num_capture_buffers; + enum AVPixelFormat pix_fmt; } V4L2m2mPriv; /** diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c index e323c37052..363e998142 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -257,6 +257,7 @@ static const AVOption options[] = { V4L_M2M_DEFAULT_OPTS, { "num_capture_buffers", "Number of buffers in the capture context", OFFSET(num_capture_buffers), AV_OPT_TYPE_INT, {.i64 = 20}, 2, INT_MAX, FLAGS }, + { "pixel_format", "Pixel format to be used by the decoder", OFFSET(pix_fmt), AV_OPT_TYPE_PIXEL_FMT, {.i64 = AV_PIX_FMT_NONE}, AV_PIX_FMT_NONE, AV_PIX_FMT_NB, FLAGS }, { NULL}, }; From 909ca6380d9112cc0111266da02a4a8e1e5abc1e Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Mon, 24 Sep 2018 13:39:56 -0700 Subject: [PATCH 9/9] libavcodec: v4l2m2m: implement flush --- libavcodec/v4l2_m2m_dec.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c index 363e998142..52ec67cb59 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -250,6 +250,41 @@ static av_cold int v4l2_decode_close(AVCodecContext *avctx) return ff_v4l2_m2m_codec_end(avctx->priv_data); } +static void v4l2_decode_flush(AVCodecContext *avctx) +{ + V4L2m2mPriv *priv = avctx->priv_data; + V4L2m2mContext* s = priv->context; + V4L2Context* output = &s->output; + V4L2Context* capture = &s->capture; + int ret, i; + + ret = ff_v4l2_context_set_status(output, VIDIOC_STREAMOFF); + if (ret < 0) + av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s error: %d\n", output->name, ret); + + ret = ff_v4l2_context_set_status(output, VIDIOC_STREAMON); + if (ret < 0) + av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMON %s error: %d\n", output->name, ret); + + for (i = 0; i < output->num_buffers; i++) { + if (output->buffers[i].status == V4L2BUF_IN_DRIVER) + output->buffers[i].status = V4L2BUF_AVAILABLE; + } + + struct v4l2_decoder_cmd cmd = { + .cmd = V4L2_DEC_CMD_START, + .flags = 0, + }; + + ret = ioctl(s->fd, VIDIOC_DECODER_CMD, &cmd); + if (ret < 0) + av_log(avctx, AV_LOG_ERROR, "VIDIOC_DECODER_CMD start error: %d\n", errno); + + s->draining = 0; + output->done = 0; + capture->done = 0; +} + #define OFFSET(x) offsetof(V4L2m2mPriv, x) #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM @@ -286,6 +321,7 @@ static const AVCodecHWConfigInternal *v4l2_m2m_hw_configs[] = { .init = v4l2_decode_init, \ .receive_frame = v4l2_receive_frame, \ .close = v4l2_decode_close, \ + .flush = v4l2_decode_flush, \ .bsfs = bsf_name, \ .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, \ .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS | FF_CODEC_CAP_INIT_CLEANUP, \ ================================================ FILE: packages/multimedia/ffmpeg/patches/v4l2-request/ffmpeg-001-v4l2-request.patch ================================================ From 46ce980905101822ca824243635d10d660172570 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Mon, 3 Dec 2018 23:48:04 +0100 Subject: [PATCH 01/12] avutil: add av_buffer_pool_flush() Used by V4L2 request API hwaccel Signed-off-by: Jonas Karlman --- libavutil/buffer.c | 13 +++++++++++++ libavutil/buffer.h | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/libavutil/buffer.c b/libavutil/buffer.c index 858633e8c7..41555d9982 100644 --- a/libavutil/buffer.c +++ b/libavutil/buffer.c @@ -305,6 +305,19 @@ static void buffer_pool_free(AVBufferPool *pool) av_freep(&pool); } +void av_buffer_pool_flush(AVBufferPool *pool) +{ + ff_mutex_lock(&pool->mutex); + while (pool->pool) { + BufferPoolEntry *buf = pool->pool; + pool->pool = buf->next; + + buf->free(buf->opaque, buf->data); + av_freep(&buf); + } + ff_mutex_unlock(&pool->mutex); +} + void av_buffer_pool_uninit(AVBufferPool **ppool) { AVBufferPool *pool; diff --git a/libavutil/buffer.h b/libavutil/buffer.h index 241a80ed67..f41363faf1 100644 --- a/libavutil/buffer.h +++ b/libavutil/buffer.h @@ -315,6 +315,11 @@ AVBufferPool *av_buffer_pool_init2(size_t size, void *opaque, #endif void (*pool_free)(void *opaque)); +/** + * Free all available buffers in a buffer pool. + */ + void av_buffer_pool_flush(AVBufferPool *pool); + /** * Mark the pool as being available for freeing. It will actually be freed only * once all the allocated buffers associated with the pool are released. Thus it From 6f3b6c4d442a9a3322305e5600ce7f84af5971cc Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 15 Dec 2018 22:32:16 +0100 Subject: [PATCH 02/12] Add common V4L2 request API code Signed-off-by: Jonas Karlman Signed-off-by: Alex Bee --- configure | 12 + libavcodec/Makefile | 1 + libavcodec/hwconfig.h | 2 + libavcodec/v4l2_request.c | 1027 +++++++++++++++++++++++++++++++++++++ libavcodec/v4l2_request.h | 77 +++ 5 files changed, 1119 insertions(+) create mode 100644 libavcodec/v4l2_request.c create mode 100644 libavcodec/v4l2_request.h diff --git a/configure b/configure index 4ba72bf84b..4a3a5ae9e0 100755 --- a/configure +++ b/configure @@ -279,6 +279,7 @@ External library support: if openssl, gnutls or mbedtls is not used [no] --enable-libtwolame enable MP2 encoding via libtwolame [no] --enable-libuavs3d enable AVS3 decoding via libuavs3d [no] + --enable-libudev enable libudev [no] --enable-libv4l2 enable libv4l2/v4l-utils [no] --enable-libvidstab enable video stabilization using vid.stab [no] --enable-libvmaf enable vmaf filter via libvmaf [no] @@ -346,6 +347,7 @@ External library support: --enable-omx-rpi enable OpenMAX IL code for Raspberry Pi [no] --enable-rkmpp enable Rockchip Media Process Platform code [no] --disable-v4l2-m2m disable V4L2 mem2mem code [autodetect] + --enable-v4l2-request enable V4L2 request API code [no] --disable-vaapi disable Video Acceleration API (mainly Unix/Intel) code [autodetect] --disable-vdpau disable Nvidia Video Decode and Presentation API for Unix code [autodetect] --disable-videotoolbox disable VideoToolbox code [autodetect] @@ -1814,6 +1816,7 @@ EXTERNAL_LIBRARY_LIST=" libtheora libtwolame libuavs3d + libudev libv4l2 libvmaf libvorbis @@ -1868,6 +1871,7 @@ HWACCEL_LIBRARY_LIST=" mmal omx opencl + v4l2_request vulkan " @@ -2920,6 +2924,7 @@ d3d11va_deps="dxva_h ID3D11VideoDecoder ID3D11VideoContext" dxva2_deps="dxva2api_h DXVA2_ConfigPictureDecode ole32 user32" ffnvcodec_deps_any="libdl LoadLibrary" nvdec_deps="ffnvcodec" +v4l2_request_deps="linux_videodev2_h linux_media_h v4l2_timeval_to_ns libdrm libudev" vaapi_x11_deps="xlib" videotoolbox_hwaccel_deps="videotoolbox pthreads" videotoolbox_hwaccel_extralibs="-framework QuartzCore" @@ -6439,6 +6444,7 @@ enabled libtwolame && require libtwolame twolame.h twolame_init -ltwolame { check_lib libtwolame twolame.h twolame_encode_buffer_float32_interleaved -ltwolame || die "ERROR: libtwolame must be installed and version must be >= 0.3.10"; } enabled libuavs3d && require_pkg_config libuavs3d "uavs3d >= 1.1.41" uavs3d.h uavs3d_decode +enabled libudev && require_pkg_config libudev libudev libudev.h udev_new 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 >= 1.5.2" libvmaf.h compute_vmaf @@ -6537,6 +6543,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"; } enabled vapoursynth && require_pkg_config vapoursynth "vapoursynth-script >= 42" VSScript.h vsscript_init @@ -6618,6 +6628,8 @@ if enabled v4l2_m2m; then check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;" fi +check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns + check_headers sys/videoio.h test_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 33a280cf69..90dfffcb20 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -155,6 +155,7 @@ OBJS-$(CONFIG_VP3DSP) += vp3dsp.o OBJS-$(CONFIG_VP56DSP) += vp56dsp.o OBJS-$(CONFIG_VP8DSP) += vp8dsp.o OBJS-$(CONFIG_V4L2_M2M) += v4l2_m2m.o v4l2_context.o v4l2_buffers.o v4l2_fmt.o +OBJS-$(CONFIG_V4L2_REQUEST) += v4l2_request.o OBJS-$(CONFIG_WMA_FREQS) += wma_freqs.o OBJS-$(CONFIG_WMV2DSP) += wmv2dsp.o diff --git a/libavcodec/hwconfig.h b/libavcodec/hwconfig.h index f421dc909f..ee78d8ab8e 100644 --- a/libavcodec/hwconfig.h +++ b/libavcodec/hwconfig.h @@ -80,6 +80,8 @@ typedef struct AVCodecHWConfigInternal { HW_CONFIG_HWACCEL(0, 0, 1, D3D11VA_VLD, NONE, ff_ ## codec ## _d3d11va_hwaccel) #define HWACCEL_XVMC(codec) \ HW_CONFIG_HWACCEL(0, 0, 1, XVMC, NONE, ff_ ## codec ## _xvmc_hwaccel) +#define HWACCEL_V4L2REQUEST(codec) \ + HW_CONFIG_HWACCEL(1, 0, 0, DRM_PRIME, DRM, ff_ ## codec ## _v4l2request_hwaccel) #define HW_CONFIG_ENCODER(device, frames, ad_hoc, format, device_type_) \ &(const AVCodecHWConfigInternal) { \ diff --git a/libavcodec/v4l2_request.c b/libavcodec/v4l2_request.c new file mode 100644 index 0000000000..b57bbf29bc --- /dev/null +++ b/libavcodec/v4l2_request.c @@ -0,0 +1,1027 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "decode.h" +#include "internal.h" +#include "v4l2_request.h" + +uint64_t ff_v4l2_request_get_capture_timestamp(AVFrame *frame) +{ + V4L2RequestDescriptor *req = (V4L2RequestDescriptor*)frame->data[0]; + return req ? v4l2_timeval_to_ns(&req->capture.buffer.timestamp) : 0; +} + +int ff_v4l2_request_reset_frame(AVCodecContext *avctx, AVFrame *frame) +{ + V4L2RequestDescriptor *req = (V4L2RequestDescriptor*)frame->data[0]; + memset(&req->drm, 0, sizeof(AVDRMFrameDescriptor)); + req->output.used = 0; + return 0; +} + +int ff_v4l2_request_append_output_buffer(AVCodecContext *avctx, AVFrame *frame, const uint8_t *data, uint32_t size) +{ + V4L2RequestDescriptor *req = (V4L2RequestDescriptor*)frame->data[0]; + if (req->output.used + size + (AV_INPUT_BUFFER_PADDING_SIZE * 4) <= req->output.size) { + memcpy(req->output.addr + req->output.used, data, size); + req->output.used += size; + } else { + av_log(avctx, AV_LOG_ERROR, "%s: output.used=%u output.size=%u size=%u\n", __func__, req->output.used, req->output.size, size); + } + return 0; +} + +static int v4l2_request_controls(V4L2RequestContext *ctx, int request_fd, unsigned long type, struct v4l2_ext_control *control, int count) +{ + struct v4l2_ext_controls controls = { + .controls = control, + .count = count, + .request_fd = request_fd, + .which = (request_fd >= 0) ? V4L2_CTRL_WHICH_REQUEST_VAL : 0, + }; + + if (!control || !count) + return 0; + + return ioctl(ctx->video_fd, type, &controls); +} + +static int v4l2_request_set_controls(V4L2RequestContext *ctx, int request_fd, struct v4l2_ext_control *control, int count) +{ + return v4l2_request_controls(ctx, request_fd, VIDIOC_S_EXT_CTRLS, control, count); +} + +int ff_v4l2_request_set_controls(AVCodecContext *avctx, struct v4l2_ext_control *control, int count) +{ + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + int ret; + + ret = v4l2_request_controls(ctx, -1, VIDIOC_S_EXT_CTRLS, control, count); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: set controls failed, %s (%d)\n", __func__, strerror(errno), errno); + return AVERROR(EINVAL); + } + + return ret; +} + +int ff_v4l2_request_get_controls(AVCodecContext *avctx, struct v4l2_ext_control *control, int count) +{ + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + int ret; + + ret = v4l2_request_controls(ctx, -1, VIDIOC_G_EXT_CTRLS, control, count); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: get controls failed, %s (%d)\n", __func__, strerror(errno), errno); + return AVERROR(EINVAL); + } + + return ret; +} + +int ff_v4l2_request_query_control(AVCodecContext *avctx, struct v4l2_query_ext_ctrl *control) +{ + int ret; + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + + ret = ioctl(ctx->video_fd, VIDIOC_QUERY_EXT_CTRL, control); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: query control failed, %s (%d)\n", __func__, strerror(errno), errno); + return AVERROR(EINVAL); + } + + return 0; +} + +int ff_v4l2_request_query_control_default_value(AVCodecContext *avctx, uint32_t id) +{ + int ret; + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + struct v4l2_queryctrl control = { + .id = id, + }; + + ret = ioctl(ctx->video_fd, VIDIOC_QUERYCTRL, &control); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: query control failed, %s (%d)\n", __func__, strerror(errno), errno); + return AVERROR(EINVAL); + } + + return control.default_value; +} + +static int v4l2_request_queue_buffer(V4L2RequestContext *ctx, int request_fd, V4L2RequestBuffer *buf, uint32_t flags) +{ + struct v4l2_plane planes[1] = {}; + struct v4l2_buffer buffer = { + .type = buf->buffer.type, + .memory = buf->buffer.memory, + .index = buf->index, + .timestamp.tv_usec = ctx->timestamp, + .bytesused = buf->used, + .request_fd = request_fd, + .flags = ((request_fd >= 0) ? V4L2_BUF_FLAG_REQUEST_FD : 0) | flags, + }; + + buf->buffer.timestamp = buffer.timestamp; + + if (V4L2_TYPE_IS_MULTIPLANAR(buf->buffer.type)) { + planes[0].bytesused = buf->used; + buffer.bytesused = 0; + buffer.length = 1; + buffer.m.planes = planes; + } + + return ioctl(ctx->video_fd, VIDIOC_QBUF, &buffer); +} + +static int v4l2_request_dequeue_buffer(V4L2RequestContext *ctx, V4L2RequestBuffer *buf) +{ + int ret; + struct v4l2_plane planes[1] = {}; + struct v4l2_buffer buffer = { + .type = buf->buffer.type, + .memory = buf->buffer.memory, + .index = buf->index, + }; + + if (V4L2_TYPE_IS_MULTIPLANAR(buf->buffer.type)) { + buffer.length = 1; + buffer.m.planes = planes; + } + + ret = ioctl(ctx->video_fd, VIDIOC_DQBUF, &buffer); + if (ret < 0) + return ret; + + buf->buffer.timestamp = buffer.timestamp; + return 0; +} + +const uint32_t v4l2_request_capture_pixelformats[] = { + V4L2_PIX_FMT_NV12, +#ifdef DRM_FORMAT_MOD_ALLWINNER_TILED + V4L2_PIX_FMT_SUNXI_TILED_NV12, +#endif +}; + +static int v4l2_request_set_drm_descriptor(V4L2RequestDescriptor *req, struct v4l2_format *format) +{ + AVDRMFrameDescriptor *desc = &req->drm; + AVDRMLayerDescriptor *layer = &desc->layers[0]; + uint32_t pixelformat = V4L2_TYPE_IS_MULTIPLANAR(format->type) ? format->fmt.pix_mp.pixelformat : format->fmt.pix.pixelformat; + + switch (pixelformat) { + case V4L2_PIX_FMT_NV12: + layer->format = DRM_FORMAT_NV12; + desc->objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; + break; +#ifdef DRM_FORMAT_MOD_ALLWINNER_TILED + case V4L2_PIX_FMT_SUNXI_TILED_NV12: + layer->format = DRM_FORMAT_NV12; + desc->objects[0].format_modifier = DRM_FORMAT_MOD_ALLWINNER_TILED; + break; +#endif + default: + return -1; + } + + desc->nb_objects = 1; + desc->objects[0].fd = req->capture.fd; + desc->objects[0].size = req->capture.size; + + desc->nb_layers = 1; + layer->nb_planes = 2; + + layer->planes[0].object_index = 0; + layer->planes[0].offset = 0; + layer->planes[0].pitch = V4L2_TYPE_IS_MULTIPLANAR(format->type) ? format->fmt.pix_mp.plane_fmt[0].bytesperline : format->fmt.pix.bytesperline; + + layer->planes[1].object_index = 0; + layer->planes[1].offset = layer->planes[0].pitch * (V4L2_TYPE_IS_MULTIPLANAR(format->type) ? format->fmt.pix_mp.height : format->fmt.pix.height); + layer->planes[1].pitch = layer->planes[0].pitch; + + return 0; +} + +static int v4l2_request_queue_decode(AVCodecContext *avctx, AVFrame *frame, struct v4l2_ext_control *control, int count, int first_slice, int last_slice) +{ + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + V4L2RequestDescriptor *req = (V4L2RequestDescriptor*)frame->data[0]; + struct timeval tv = { 2, 0 }; + fd_set except_fds; + int ret; + + av_log(avctx, AV_LOG_DEBUG, "%s: avctx=%p used=%u controls=%d index=%d fd=%d request_fd=%d first_slice=%d last_slice=%d\n", __func__, avctx, req->output.used, count, req->capture.index, req->capture.fd, req->request_fd, first_slice, last_slice); + + if (first_slice) + ctx->timestamp++; + + ret = v4l2_request_set_controls(ctx, req->request_fd, control, count); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: set controls failed for request %d, %s (%d)\n", __func__, req->request_fd, strerror(errno), errno); + return -1; + } + + memset(req->output.addr + req->output.used, 0, AV_INPUT_BUFFER_PADDING_SIZE * 4); + + ret = v4l2_request_queue_buffer(ctx, req->request_fd, &req->output, last_slice ? 0 : V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF); + 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); + return -1; + } + + if (first_slice) { + ret = v4l2_request_queue_buffer(ctx, -1, &req->capture, 0); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: queue capture buffer %d failed for request %d, %s (%d)\n", __func__, req->capture.index, req->request_fd, strerror(errno), errno); + return -1; + } + } + + // NOTE: do we need to dequeue when request fails/timeout? + + // 4. queue request and wait + ret = ioctl(req->request_fd, MEDIA_REQUEST_IOC_QUEUE, NULL); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: queue request %d failed, %s (%d)\n", __func__, req->request_fd, strerror(errno), errno); + goto fail; + } + + FD_ZERO(&except_fds); + FD_SET(req->request_fd, &except_fds); + + ret = select(req->request_fd + 1, NULL, NULL, &except_fds, &tv); + if (ret == 0) { + av_log(avctx, AV_LOG_ERROR, "%s: request %d timeout\n", __func__, req->request_fd); + goto fail; + } else if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: select request %d failed, %s (%d)\n", __func__, req->request_fd, strerror(errno), errno); + goto fail; + } + + ret = v4l2_request_dequeue_buffer(ctx, &req->output); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: dequeue output buffer %d failed for request %d, %s (%d)\n", __func__, req->output.index, req->request_fd, strerror(errno), errno); + return -1; + } + + if (last_slice) { + ret = v4l2_request_dequeue_buffer(ctx, &req->capture); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: dequeue capture buffer %d failed for request %d, %s (%d)\n", __func__, req->capture.index, req->request_fd, strerror(errno), errno); + return -1; + } + } + + // TODO: check errors + // buffer.flags & V4L2_BUF_FLAG_ERROR + + ret = ioctl(req->request_fd, MEDIA_REQUEST_IOC_REINIT, NULL); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: reinit request %d failed, %s (%d)\n", __func__, req->request_fd, strerror(errno), errno); + return -1; + } + + if (last_slice) + return v4l2_request_set_drm_descriptor(req, &ctx->format); + + return 0; + +fail: + ret = v4l2_request_dequeue_buffer(ctx, &req->output); + if (ret < 0) + av_log(avctx, AV_LOG_ERROR, "%s: dequeue output buffer %d failed for request %d, %s (%d)\n", __func__, req->output.index, req->request_fd, strerror(errno), errno); + + ret = v4l2_request_dequeue_buffer(ctx, &req->capture); + if (ret < 0) + av_log(avctx, AV_LOG_ERROR, "%s: dequeue capture buffer %d failed for request %d, %s (%d)\n", __func__, req->capture.index, req->request_fd, strerror(errno), errno); + + ret = ioctl(req->request_fd, MEDIA_REQUEST_IOC_REINIT, NULL); + if (ret < 0) + av_log(avctx, AV_LOG_ERROR, "%s: reinit request %d failed, %s (%d)\n", __func__, req->request_fd, strerror(errno), errno); + + return -1; +} + +int ff_v4l2_request_decode_slice(AVCodecContext *avctx, AVFrame *frame, struct v4l2_ext_control *control, int count, int first_slice, int last_slice) +{ + V4L2RequestDescriptor *req = (V4L2RequestDescriptor*)frame->data[0]; + + // fall back to queue each slice as a full frame + if ((req->output.capabilities & V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF) != V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF) + return v4l2_request_queue_decode(avctx, frame, control, count, 1, 1); + + return v4l2_request_queue_decode(avctx, frame, control, count, first_slice, last_slice); +} + +int ff_v4l2_request_decode_frame(AVCodecContext *avctx, AVFrame *frame, struct v4l2_ext_control *control, int count) +{ + return v4l2_request_queue_decode(avctx, frame, control, count, 1, 1); +} + +static int v4l2_request_try_framesize(AVCodecContext *avctx, uint32_t pixelformat) +{ + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + struct v4l2_frmsizeenum frmsize = { + .index = 0, + .pixel_format = pixelformat, + }; + + if (ioctl(ctx->video_fd, VIDIOC_ENUM_FRAMESIZES, &frmsize) < 0) + return 0; + + /* + * We only validate min/max framesize for V4L2_FRMSIZE_TYPE_STEPWISE here, since the alignment + * which is eventually needed will be done driver-side later in VIDIOC_S_FMT and there is no need + * validate step_width/step_height here + */ + + do { + + if (frmsize.type == V4L2_FRMSIZE_TYPE_DISCRETE && frmsize.discrete.width == avctx->coded_width && + frmsize.discrete.height == avctx->coded_height) + return 0; + else if ((frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE || frmsize.type == V4L2_FRMSIZE_TYPE_CONTINUOUS) && + avctx->coded_width >= frmsize.stepwise.min_width && avctx->coded_height >= frmsize.stepwise.min_height && + avctx->coded_width <= frmsize.stepwise.max_width && avctx->coded_height <= frmsize.stepwise.max_height) + return 0; + + frmsize.index++; + + } while (ioctl(ctx->video_fd, VIDIOC_ENUM_FRAMESIZES, &frmsize) >= 0); + + av_log(avctx, AV_LOG_INFO, "%s: pixelformat %u not supported for width %u height %u\n", __func__, pixelformat, avctx->coded_width, avctx->coded_height); + + return -1; +} + +static int v4l2_request_try_format(AVCodecContext *avctx, enum v4l2_buf_type type, uint32_t pixelformat) +{ + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + struct v4l2_fmtdesc fmtdesc = { + .index = 0, + .type = type, + }; + + if (V4L2_TYPE_IS_OUTPUT(type)) { + struct v4l2_create_buffers buffers = { + .count = 0, + .memory = V4L2_MEMORY_MMAP, + .format.type = type, + }; + + if (ioctl(ctx->video_fd, VIDIOC_CREATE_BUFS, &buffers) < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: create buffers failed for type %u, %s (%d)\n", __func__, type, strerror(errno), errno); + return -1; + } + + if ((buffers.capabilities & V4L2_BUF_CAP_SUPPORTS_REQUESTS) != V4L2_BUF_CAP_SUPPORTS_REQUESTS) { + av_log(avctx, AV_LOG_INFO, "%s: output buffer type do not support requests, capabilities %u\n", __func__, buffers.capabilities); + return -1; + } + } + + while (ioctl(ctx->video_fd, VIDIOC_ENUM_FMT, &fmtdesc) >= 0) { + if (fmtdesc.pixelformat == pixelformat) + return 0; + + fmtdesc.index++; + } + + av_log(avctx, AV_LOG_INFO, "%s: pixelformat %u not supported for type %u\n", __func__, pixelformat, type); + return -1; +} + +static int v4l2_request_set_format(AVCodecContext *avctx, enum v4l2_buf_type type, uint32_t pixelformat, uint32_t buffersize) +{ + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + struct v4l2_format format = { + .type = type, + }; + + if (V4L2_TYPE_IS_MULTIPLANAR(type)) { + format.fmt.pix_mp.width = avctx->coded_width; + format.fmt.pix_mp.height = avctx->coded_height; + format.fmt.pix_mp.pixelformat = pixelformat; + format.fmt.pix_mp.plane_fmt[0].sizeimage = buffersize; + format.fmt.pix_mp.num_planes = 1; + } else { + format.fmt.pix.width = avctx->coded_width; + format.fmt.pix.height = avctx->coded_height; + format.fmt.pix.pixelformat = pixelformat; + format.fmt.pix.sizeimage = buffersize; + } + + return ioctl(ctx->video_fd, VIDIOC_S_FMT, &format); +} + +static int v4l2_request_select_capture_format(AVCodecContext *avctx) +{ + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + enum v4l2_buf_type type = ctx->format.type; + +#if 0 + struct v4l2_format format = { + .type = type, + }; + struct v4l2_fmtdesc fmtdesc = { + .index = 0, + .type = type, + }; + uint32_t pixelformat; + int i; + + if (ioctl(ctx->video_fd, VIDIOC_G_FMT, &format) < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: get capture format failed, %s (%d)\n", __func__, strerror(errno), errno); + return -1; + } + + pixelformat = V4L2_TYPE_IS_MULTIPLANAR(type) ? format.fmt.pix_mp.pixelformat : format.fmt.pix.pixelformat; + + for (i = 0; i < FF_ARRAY_ELEMS(v4l2_request_capture_pixelformats); i++) { + if (pixelformat == v4l2_request_capture_pixelformats[i]) + return v4l2_request_set_format(avctx, type, pixelformat, 0); + } + + while (ioctl(ctx->video_fd, VIDIOC_ENUM_FMT, &fmtdesc) >= 0) { + for (i = 0; i < FF_ARRAY_ELEMS(v4l2_request_capture_pixelformats); i++) { + if (fmtdesc.pixelformat == v4l2_request_capture_pixelformats[i]) + return v4l2_request_set_format(avctx, type, fmtdesc.pixelformat, 0); + } + + fmtdesc.index++; + } +#else + for (int i = 0; i < FF_ARRAY_ELEMS(v4l2_request_capture_pixelformats); i++) { + uint32_t pixelformat = v4l2_request_capture_pixelformats[i]; + if (!v4l2_request_try_format(avctx, type, pixelformat)) + return v4l2_request_set_format(avctx, type, pixelformat, 0); + } +#endif + + return -1; +} + +static int v4l2_request_probe_video_device(struct udev_device *device, AVCodecContext *avctx, uint32_t pixelformat, uint32_t buffersize, struct v4l2_ext_control *control, int count) +{ + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + int ret = AVERROR(EINVAL); + struct v4l2_capability capability = {0}; + unsigned int capabilities = 0; + + const char *path = udev_device_get_devnode(device); + if (!path) { + av_log(avctx, AV_LOG_ERROR, "%s: get video device devnode failed\n", __func__); + ret = AVERROR(EINVAL); + goto fail; + } + + ctx->video_fd = open(path, O_RDWR | O_NONBLOCK, 0); + if (ctx->video_fd < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: opening %s failed, %s (%d)\n", __func__, path, strerror(errno), errno); + ret = AVERROR(EINVAL); + goto fail; + } + + ret = ioctl(ctx->video_fd, VIDIOC_QUERYCAP, &capability); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: get video capability failed, %s (%d)\n", __func__, strerror(errno), errno); + ret = AVERROR(EINVAL); + goto fail; + } + + if (capability.capabilities & V4L2_CAP_DEVICE_CAPS) + capabilities = capability.device_caps; + else + capabilities = capability.capabilities; + + av_log(avctx, AV_LOG_DEBUG, "%s: avctx=%p ctx=%p path=%s capabilities=%u\n", __func__, avctx, ctx, path, capabilities); + + if ((capabilities & V4L2_CAP_STREAMING) != V4L2_CAP_STREAMING) { + av_log(avctx, AV_LOG_ERROR, "%s: missing required streaming capability\n", __func__); + ret = AVERROR(EINVAL); + goto fail; + } + + if ((capabilities & V4L2_CAP_VIDEO_M2M_MPLANE) == V4L2_CAP_VIDEO_M2M_MPLANE) { + ctx->output_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; + ctx->format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; + } else if ((capabilities & V4L2_CAP_VIDEO_M2M) == V4L2_CAP_VIDEO_M2M) { + ctx->output_type = V4L2_BUF_TYPE_VIDEO_OUTPUT; + ctx->format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + } else { + av_log(avctx, AV_LOG_ERROR, "%s: missing required mem2mem capability\n", __func__); + ret = AVERROR(EINVAL); + goto fail; + } + + ret = v4l2_request_try_format(avctx, ctx->output_type, pixelformat); + if (ret < 0) { + av_log(avctx, AV_LOG_WARNING, "%s: try output format failed\n", __func__); + ret = AVERROR(EINVAL); + goto fail; + } + + ret = v4l2_request_try_framesize(avctx, pixelformat); + if (ret < 0) { + av_log(avctx, AV_LOG_WARNING, "%s: try framesize failed\n", __func__); + ret = AVERROR(EINVAL); + goto fail; + } + + ret = v4l2_request_set_format(avctx, ctx->output_type, pixelformat, buffersize); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: set output format failed, %s (%d)\n", __func__, strerror(errno), errno); + ret = AVERROR(EINVAL); + goto fail; + } + + ret = v4l2_request_set_controls(ctx, -1, control, count); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: set controls failed, %s (%d)\n", __func__, strerror(errno), errno); + ret = AVERROR(EINVAL); + goto fail; + } + + ret = v4l2_request_select_capture_format(avctx); + if (ret < 0) { + av_log(avctx, AV_LOG_WARNING, "%s: select capture format failed\n", __func__); + ret = AVERROR(EINVAL); + goto fail; + } + + return 0; + +fail: + if (ctx->video_fd >= 0) { + close(ctx->video_fd); + ctx->video_fd = -1; + } + return ret; +} + +static int v4l2_request_init_context(AVCodecContext *avctx) +{ + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + int ret; + + ret = ioctl(ctx->video_fd, VIDIOC_G_FMT, &ctx->format); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: get capture format failed, %s (%d)\n", __func__, strerror(errno), errno); + ret = AVERROR(EINVAL); + goto fail; + } + + if (V4L2_TYPE_IS_MULTIPLANAR(ctx->format.type)) { + av_log(avctx, AV_LOG_DEBUG, "%s: pixelformat=%d width=%u height=%u bytesperline=%u sizeimage=%u num_planes=%u\n", __func__, ctx->format.fmt.pix_mp.pixelformat, ctx->format.fmt.pix_mp.width, ctx->format.fmt.pix_mp.height, ctx->format.fmt.pix_mp.plane_fmt[0].bytesperline, ctx->format.fmt.pix_mp.plane_fmt[0].sizeimage, ctx->format.fmt.pix_mp.num_planes); + } else { + av_log(avctx, AV_LOG_DEBUG, "%s: pixelformat=%d width=%u height=%u bytesperline=%u sizeimage=%u\n", __func__, ctx->format.fmt.pix.pixelformat, ctx->format.fmt.pix.width, ctx->format.fmt.pix.height, ctx->format.fmt.pix.bytesperline, ctx->format.fmt.pix.sizeimage); + } + + ret = ff_decode_get_hw_frames_ctx(avctx, AV_HWDEVICE_TYPE_DRM); + if (ret < 0) + goto fail; + + ret = ioctl(ctx->video_fd, VIDIOC_STREAMON, &ctx->output_type); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: output stream on failed, %s (%d)\n", __func__, strerror(errno), errno); + ret = AVERROR(EINVAL); + goto fail; + } + + ret = ioctl(ctx->video_fd, VIDIOC_STREAMON, &ctx->format.type); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: capture stream on failed, %s (%d)\n", __func__, strerror(errno), errno); + ret = AVERROR(EINVAL); + goto fail; + } + + return 0; + +fail: + ff_v4l2_request_uninit(avctx); + return ret; +} + +static int v4l2_request_probe_media_device(struct udev_device *device, AVCodecContext *avctx, uint32_t pixelformat, uint32_t buffersize, struct v4l2_ext_control *control, int count) +{ + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + int ret; + struct media_device_info device_info = {0}; + struct media_v2_topology topology = {0}; + struct media_v2_interface *interfaces = NULL; + struct udev *udev = udev_device_get_udev(device); + struct udev_device *video_device; + dev_t devnum; + + const char *path = udev_device_get_devnode(device); + if (!path) { + av_log(avctx, AV_LOG_ERROR, "%s: get media device devnode failed\n", __func__); + ret = AVERROR(EINVAL); + goto fail; + } + + ctx->media_fd = open(path, O_RDWR, 0); + if (ctx->media_fd < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: opening %s failed, %s (%d)\n", __func__, path, strerror(errno), errno); + ret = AVERROR(EINVAL); + goto fail; + } + + ret = ioctl(ctx->media_fd, MEDIA_IOC_DEVICE_INFO, &device_info); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: get media device info failed, %s (%d)\n", __func__, strerror(errno), errno); + ret = AVERROR(EINVAL); + goto fail; + } + + av_log(avctx, AV_LOG_DEBUG, "%s: avctx=%p ctx=%p path=%s driver=%s\n", __func__, avctx, ctx, path, device_info.driver); + + ret = ioctl(ctx->media_fd, MEDIA_IOC_G_TOPOLOGY, &topology); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: get media topology failed, %s (%d)\n", __func__, strerror(errno), errno); + ret = AVERROR(EINVAL); + goto fail; + } + + if (topology.num_interfaces <= 0) { + av_log(avctx, AV_LOG_ERROR, "%s: media device has no interfaces\n", __func__); + ret = AVERROR(EINVAL); + goto fail; + } + + interfaces = av_mallocz(topology.num_interfaces * sizeof(struct media_v2_interface)); + if (!interfaces) { + av_log(avctx, AV_LOG_ERROR, "%s: allocating media interface struct failed\n", __func__); + ret = AVERROR(ENOMEM); + goto fail; + } + + topology.ptr_interfaces = (__u64)(uintptr_t)interfaces; + ret = ioctl(ctx->media_fd, MEDIA_IOC_G_TOPOLOGY, &topology); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: get media topology failed, %s (%d)\n", __func__, strerror(errno), errno); + ret = AVERROR(EINVAL); + goto fail; + } + + ret = AVERROR(EINVAL); + for (int i = 0; i < topology.num_interfaces; i++) { + if (interfaces[i].intf_type != MEDIA_INTF_T_V4L_VIDEO) + continue; + + devnum = makedev(interfaces[i].devnode.major, interfaces[i].devnode.minor); + video_device = udev_device_new_from_devnum(udev, 'c', devnum); + if (!video_device) { + av_log(avctx, AV_LOG_ERROR, "%s: video_device=%p\n", __func__, video_device); + continue; + } + + ret = v4l2_request_probe_video_device(video_device, avctx, pixelformat, buffersize, control, count); + udev_device_unref(video_device); + + if (!ret) + break; + } + + av_freep(&interfaces); + return ret; + +fail: + av_freep(&interfaces); + if (ctx->media_fd >= 0) { + close(ctx->media_fd); + ctx->media_fd = -1; + } + return ret; +} + +int ff_v4l2_request_init(AVCodecContext *avctx, uint32_t pixelformat, uint32_t buffersize, struct v4l2_ext_control *control, int count) +{ + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + int ret = AVERROR(EINVAL); + struct udev *udev; + struct udev_enumerate *enumerate; + struct udev_list_entry *devices; + struct udev_list_entry *entry; + struct udev_device *device; + + av_log(avctx, AV_LOG_DEBUG, "%s: avctx=%p hw_device_ctx=%p hw_frames_ctx=%p\n", __func__, avctx, avctx->hw_device_ctx, avctx->hw_frames_ctx); + + ctx->media_fd = -1; + ctx->video_fd = -1; + ctx->timestamp = 0; + + udev = udev_new(); + if (!udev) { + av_log(avctx, AV_LOG_ERROR, "%s: allocating udev context failed\n", __func__); + ret = AVERROR(ENOMEM); + goto fail; + } + + enumerate = udev_enumerate_new(udev); + if (!enumerate) { + av_log(avctx, AV_LOG_ERROR, "%s: allocating udev enumerator failed\n", __func__); + ret = AVERROR(ENOMEM); + goto fail; + } + + udev_enumerate_add_match_subsystem(enumerate, "media"); + udev_enumerate_scan_devices(enumerate); + + devices = udev_enumerate_get_list_entry(enumerate); + udev_list_entry_foreach(entry, devices) { + const char *path = udev_list_entry_get_name(entry); + if (!path) + continue; + + device = udev_device_new_from_syspath(udev, path); + if (!device) + continue; + + ret = v4l2_request_probe_media_device(device, avctx, pixelformat, buffersize, control, count); + udev_device_unref(device); + + if (!ret) + break; + } + + udev_enumerate_unref(enumerate); + + if (!ret) + ret = v4l2_request_init_context(avctx); + +fail: + udev_unref(udev); + return ret; +} + +int ff_v4l2_request_uninit(AVCodecContext *avctx) +{ + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + int ret; + + av_log(avctx, AV_LOG_DEBUG, "%s: avctx=%p ctx=%p\n", __func__, avctx, ctx); + + if (ctx->video_fd >= 0) { + ret = ioctl(ctx->video_fd, VIDIOC_STREAMOFF, &ctx->output_type); + if (ret < 0) + av_log(avctx, AV_LOG_ERROR, "%s: output stream off failed, %s (%d)\n", __func__, strerror(errno), errno); + + ret = ioctl(ctx->video_fd, VIDIOC_STREAMOFF, &ctx->format.type); + if (ret < 0) + av_log(avctx, AV_LOG_ERROR, "%s: capture stream off failed, %s (%d)\n", __func__, strerror(errno), errno); + } + + if (avctx->hw_frames_ctx) { + AVHWFramesContext *hwfc = (AVHWFramesContext*)avctx->hw_frames_ctx->data; + av_buffer_pool_flush(hwfc->pool); + } + + if (ctx->video_fd >= 0) + close(ctx->video_fd); + + if (ctx->media_fd >= 0) + close(ctx->media_fd); + + return 0; +} + +static int v4l2_request_buffer_alloc(AVCodecContext *avctx, V4L2RequestBuffer *buf, enum v4l2_buf_type type) +{ + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + int ret; + struct v4l2_plane planes[1] = {}; + struct v4l2_create_buffers buffers = { + .count = 1, + .memory = V4L2_MEMORY_MMAP, + .format.type = type, + }; + + av_log(avctx, AV_LOG_DEBUG, "%s: avctx=%p buf=%p type=%u\n", __func__, avctx, buf, type); + + ret = ioctl(ctx->video_fd, VIDIOC_G_FMT, &buffers.format); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: get format failed for type %u, %s (%d)\n", __func__, type, strerror(errno), errno); + return ret; + } + + if (V4L2_TYPE_IS_MULTIPLANAR(buffers.format.type)) { + av_log(avctx, AV_LOG_DEBUG, "%s: pixelformat=%d width=%u height=%u bytesperline=%u sizeimage=%u num_planes=%u\n", __func__, buffers.format.fmt.pix_mp.pixelformat, buffers.format.fmt.pix_mp.width, buffers.format.fmt.pix_mp.height, buffers.format.fmt.pix_mp.plane_fmt[0].bytesperline, buffers.format.fmt.pix_mp.plane_fmt[0].sizeimage, buffers.format.fmt.pix_mp.num_planes); + } else { + av_log(avctx, AV_LOG_DEBUG, "%s: pixelformat=%d width=%u height=%u bytesperline=%u sizeimage=%u\n", __func__, buffers.format.fmt.pix.pixelformat, buffers.format.fmt.pix.width, buffers.format.fmt.pix.height, buffers.format.fmt.pix.bytesperline, buffers.format.fmt.pix.sizeimage); + } + + ret = ioctl(ctx->video_fd, VIDIOC_CREATE_BUFS, &buffers); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: create buffers failed for type %u, %s (%d)\n", __func__, type, strerror(errno), errno); + return ret; + } + + if (V4L2_TYPE_IS_MULTIPLANAR(type)) { + buf->width = buffers.format.fmt.pix_mp.width; + buf->height = buffers.format.fmt.pix_mp.height; + buf->size = buffers.format.fmt.pix_mp.plane_fmt[0].sizeimage; + buf->buffer.length = 1; + buf->buffer.m.planes = planes; + } else { + buf->width = buffers.format.fmt.pix.width; + buf->height = buffers.format.fmt.pix.height; + buf->size = buffers.format.fmt.pix.sizeimage; + } + + buf->index = buffers.index; + buf->capabilities = buffers.capabilities; + buf->used = 0; + + buf->buffer.type = type; + buf->buffer.memory = V4L2_MEMORY_MMAP; + buf->buffer.index = buf->index; + + ret = ioctl(ctx->video_fd, VIDIOC_QUERYBUF, &buf->buffer); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: query buffer %d failed, %s (%d)\n", __func__, buf->index, strerror(errno), errno); + return ret; + } + + 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) { + av_log(avctx, AV_LOG_ERROR, "%s: mmap failed, %s (%d)\n", __func__, strerror(errno), errno); + return -1; + } + + buf->addr = (uint8_t*)addr; + } else { + struct v4l2_exportbuffer exportbuffer = { + .type = type, + .index = buf->index, + .flags = O_RDONLY, + }; + + ret = ioctl(ctx->video_fd, VIDIOC_EXPBUF, &exportbuffer); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: export buffer %d failed, %s (%d)\n", __func__, buf->index, strerror(errno), errno); + return ret; + } + + buf->fd = exportbuffer.fd; + } + + av_log(avctx, AV_LOG_DEBUG, "%s: buf=%p index=%d fd=%d addr=%p width=%u height=%u size=%u\n", __func__, buf, buf->index, buf->fd, buf->addr, buf->width, buf->height, buf->size); + return 0; +} + +static void v4l2_request_buffer_free(V4L2RequestBuffer *buf) +{ + av_log(NULL, AV_LOG_DEBUG, "%s: buf=%p index=%d fd=%d addr=%p width=%u height=%u size=%u\n", __func__, buf, buf->index, buf->fd, buf->addr, buf->width, buf->height, buf->size); + + if (buf->addr) + munmap(buf->addr, buf->size); + + if (buf->fd >= 0) + close(buf->fd); +} + +static void v4l2_request_frame_free(void *opaque, uint8_t *data) +{ + AVCodecContext *avctx = opaque; + V4L2RequestDescriptor *req = (V4L2RequestDescriptor*)data; + + av_log(NULL, AV_LOG_DEBUG, "%s: avctx=%p data=%p request_fd=%d\n", __func__, avctx, data, req->request_fd); + + if (req->request_fd >= 0) + close(req->request_fd); + + v4l2_request_buffer_free(&req->capture); + v4l2_request_buffer_free(&req->output); + + av_free(data); +} + +static AVBufferRef *v4l2_request_frame_alloc(void *opaque, int size) +{ + AVCodecContext *avctx = opaque; + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + V4L2RequestDescriptor *req; + AVBufferRef *ref; + uint8_t *data; + int ret; + + data = av_mallocz(size); + if (!data) + return NULL; + + av_log(avctx, AV_LOG_DEBUG, "%s: avctx=%p size=%d data=%p\n", __func__, avctx, size, data); + + ref = av_buffer_create(data, size, v4l2_request_frame_free, avctx, 0); + if (!ref) { + av_freep(&data); + return NULL; + } + + req = (V4L2RequestDescriptor*)data; + req->request_fd = -1; + req->output.fd = -1; + req->capture.fd = -1; + + ret = v4l2_request_buffer_alloc(avctx, &req->output, ctx->output_type); + if (ret < 0) { + av_buffer_unref(&ref); + return NULL; + } + + ret = v4l2_request_buffer_alloc(avctx, &req->capture, ctx->format.type); + if (ret < 0) { + av_buffer_unref(&ref); + return NULL; + } + + ret = ioctl(ctx->media_fd, MEDIA_IOC_REQUEST_ALLOC, &req->request_fd); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: request alloc failed, %s (%d)\n", __func__, strerror(errno), errno); + av_buffer_unref(&ref); + return NULL; + } + + av_log(avctx, AV_LOG_DEBUG, "%s: avctx=%p size=%d data=%p request_fd=%d\n", __func__, avctx, size, data, req->request_fd); + return ref; +} + +static void v4l2_request_pool_free(void *opaque) +{ + av_log(NULL, AV_LOG_DEBUG, "%s: opaque=%p\n", __func__, opaque); +} + +static void v4l2_request_hwframe_ctx_free(AVHWFramesContext *hwfc) +{ + av_log(NULL, AV_LOG_DEBUG, "%s: hwfc=%p pool=%p\n", __func__, hwfc, hwfc->pool); + + av_buffer_pool_flush(hwfc->pool); + av_buffer_pool_uninit(&hwfc->pool); +} + +int ff_v4l2_request_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx) +{ + V4L2RequestContext *ctx = avctx->internal->hwaccel_priv_data; + AVHWFramesContext *hwfc = (AVHWFramesContext*)hw_frames_ctx->data; + + hwfc->format = AV_PIX_FMT_DRM_PRIME; + hwfc->sw_format = AV_PIX_FMT_NV12; + if (V4L2_TYPE_IS_MULTIPLANAR(ctx->format.type)) { + hwfc->width = ctx->format.fmt.pix_mp.width; + hwfc->height = ctx->format.fmt.pix_mp.height; + } else { + hwfc->width = ctx->format.fmt.pix.width; + hwfc->height = ctx->format.fmt.pix.height; + } + + hwfc->pool = av_buffer_pool_init2(sizeof(V4L2RequestDescriptor), avctx, v4l2_request_frame_alloc, v4l2_request_pool_free); + if (!hwfc->pool) + return AVERROR(ENOMEM); + + hwfc->free = v4l2_request_hwframe_ctx_free; + + hwfc->initial_pool_size = 1; + + switch (avctx->codec_id) { + case AV_CODEC_ID_VP9: + hwfc->initial_pool_size += 8; + break; + case AV_CODEC_ID_VP8: + hwfc->initial_pool_size += 3; + break; + default: + hwfc->initial_pool_size += 2; + } + + av_log(avctx, AV_LOG_DEBUG, "%s: avctx=%p ctx=%p hw_frames_ctx=%p hwfc=%p pool=%p width=%d height=%d initial_pool_size=%d\n", __func__, avctx, ctx, hw_frames_ctx, hwfc, hwfc->pool, hwfc->width, hwfc->height, hwfc->initial_pool_size); + + return 0; +} diff --git a/libavcodec/v4l2_request.h b/libavcodec/v4l2_request.h new file mode 100644 index 0000000000..58d2aa70af --- /dev/null +++ b/libavcodec/v4l2_request.h @@ -0,0 +1,77 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_V4L2_REQUEST_H +#define AVCODEC_V4L2_REQUEST_H + +#include + +#include "libavutil/hwcontext_drm.h" + +typedef struct V4L2RequestContext { + int video_fd; + int media_fd; + enum v4l2_buf_type output_type; + struct v4l2_format format; + int timestamp; +} V4L2RequestContext; + +typedef struct V4L2RequestBuffer { + int index; + int fd; + uint8_t *addr; + uint32_t width; + uint32_t height; + uint32_t size; + uint32_t used; + uint32_t capabilities; + struct v4l2_buffer buffer; +} V4L2RequestBuffer; + +typedef struct V4L2RequestDescriptor { + AVDRMFrameDescriptor drm; + int request_fd; + V4L2RequestBuffer output; + V4L2RequestBuffer capture; +} V4L2RequestDescriptor; + +uint64_t ff_v4l2_request_get_capture_timestamp(AVFrame *frame); + +int ff_v4l2_request_reset_frame(AVCodecContext *avctx, AVFrame *frame); + +int ff_v4l2_request_append_output_buffer(AVCodecContext *avctx, AVFrame *frame, const uint8_t *data, uint32_t size); + +int ff_v4l2_request_set_controls(AVCodecContext *avctx, struct v4l2_ext_control *control, int count); + +int ff_v4l2_request_get_controls(AVCodecContext *avctx, struct v4l2_ext_control *control, int count); + +int ff_v4l2_request_query_control(AVCodecContext *avctx, struct v4l2_query_ext_ctrl *control); + +int ff_v4l2_request_query_control_default_value(AVCodecContext *avctx, uint32_t id); + +int ff_v4l2_request_decode_slice(AVCodecContext *avctx, AVFrame *frame, struct v4l2_ext_control *control, int count, int first_slice, int last_slice); + +int ff_v4l2_request_decode_frame(AVCodecContext *avctx, AVFrame *frame, struct v4l2_ext_control *control, int count); + +int ff_v4l2_request_init(AVCodecContext *avctx, uint32_t pixelformat, uint32_t buffersize, struct v4l2_ext_control *control, int count); + +int ff_v4l2_request_uninit(AVCodecContext *avctx); + +int ff_v4l2_request_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx); + +#endif /* AVCODEC_V4L2_REQUEST_H */ From 3a8ac13e041cec840d3cd1e83e6294a1a47ac6df Mon Sep 17 00:00:00 2001 From: Ezequiel Garcia Date: Wed, 20 Feb 2019 11:18:00 -0300 Subject: [PATCH 03/12] h264dec: add idr_pic_id to slice context Used by V4L2 request API h264 hwaccel Signed-off-by: Ezequiel Garcia Signed-off-by: Jonas Karlman --- libavcodec/h264_slice.c | 2 +- libavcodec/h264dec.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index 0b415ada6f..b3e3ef6183 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -1830,7 +1830,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl, } if (nal->type == H264_NAL_IDR_SLICE) - get_ue_golomb_long(&sl->gb); /* idr_pic_id */ + sl->idr_pic_id = get_ue_golomb_long(&sl->gb); sl->poc_lsb = 0; sl->delta_poc_bottom = 0; diff --git a/libavcodec/h264dec.h b/libavcodec/h264dec.h index b7b19ba4f1..0698ab95ba 100644 --- a/libavcodec/h264dec.h +++ b/libavcodec/h264dec.h @@ -336,6 +336,7 @@ typedef struct H264SliceContext { int delta_poc[2]; int curr_pic_num; int max_pic_num; + int idr_pic_id; } H264SliceContext; /** From e7f515597ca5f0900f3bd08ef40bb517703433bc Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Wed, 22 May 2019 14:44:22 +0200 Subject: [PATCH 04/12] h264dec: add ref_pic_marking and pic_order_cnt bit_size to slice context Used by V4L2 request API h264 hwaccel Signed-off-by: Boris Brezillon Signed-off-by: Jonas Karlman --- libavcodec/h264_slice.c | 6 +++++- libavcodec/h264dec.h | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index b3e3ef6183..bcb9f70c0e 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -1748,7 +1748,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl, unsigned int slice_type, tmp, i; int field_pic_flag, bottom_field_flag; int first_slice = sl == h->slice_ctx && !h->current_slice; - int picture_structure; + int picture_structure, pos; if (first_slice) av_assert0(!h->setup_finished); @@ -1834,6 +1834,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl, sl->poc_lsb = 0; sl->delta_poc_bottom = 0; + pos = sl->gb.index; if (sps->poc_type == 0) { sl->poc_lsb = get_bits(&sl->gb, sps->log2_max_poc_lsb); @@ -1848,6 +1849,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl, if (pps->pic_order_present == 1 && picture_structure == PICT_FRAME) sl->delta_poc[1] = get_se_golomb(&sl->gb); } + sl->pic_order_cnt_bit_size = sl->gb.index - pos; sl->redundant_pic_count = 0; if (pps->redundant_pic_cnt_present) @@ -1887,9 +1889,11 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl, sl->explicit_ref_marking = 0; if (nal->ref_idc) { + pos = sl->gb.index; ret = ff_h264_decode_ref_pic_marking(sl, &sl->gb, nal, h->avctx); if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE)) return AVERROR_INVALIDDATA; + sl->ref_pic_marking_bit_size = sl->gb.index - pos; } if (sl->slice_type_nos != AV_PICTURE_TYPE_I && pps->cabac) { diff --git a/libavcodec/h264dec.h b/libavcodec/h264dec.h index 0698ab95ba..2b39e82c3b 100644 --- a/libavcodec/h264dec.h +++ b/libavcodec/h264dec.h @@ -329,6 +329,7 @@ typedef struct H264SliceContext { MMCO mmco[MAX_MMCO_COUNT]; int nb_mmco; int explicit_ref_marking; + int ref_pic_marking_bit_size; int frame_num; int poc_lsb; @@ -337,6 +338,7 @@ typedef struct H264SliceContext { int curr_pic_num; int max_pic_num; int idr_pic_id; + int pic_order_cnt_bit_size; } H264SliceContext; /** From 9f455a7adb8cabb575049204375cc3b8d97b2c86 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Sat, 15 Dec 2018 22:32:16 +0100 Subject: [PATCH 05/12] Add V4L2 request API h264 hwaccel Signed-off-by: Jernej Skrabec Signed-off-by: Jonas Karlman --- configure | 3 + libavcodec/Makefile | 1 + libavcodec/h264_slice.c | 4 + libavcodec/h264dec.c | 3 + libavcodec/hwaccels.h | 1 + libavcodec/v4l2_request_h264.c | 456 +++++++++++++++++++++++++++++++++ 6 files changed, 468 insertions(+) create mode 100644 libavcodec/v4l2_request_h264.c diff --git a/configure b/configure index 4a3a5ae9e0..efd12f1b52 100755 --- a/configure +++ b/configure @@ -2952,6 +2952,8 @@ 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_select="h264_decoder" h264_vaapi_hwaccel_deps="vaapi" h264_vaapi_hwaccel_select="h264_decoder" h264_vdpau_hwaccel_deps="vdpau" @@ -6629,6 +6631,7 @@ if enabled v4l2_m2m; then fi 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;" check_headers sys/videoio.h test_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 90dfffcb20..426c7528e9 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -935,6 +935,7 @@ OBJS-$(CONFIG_H264_D3D11VA_HWACCEL) += dxva2_h264.o OBJS-$(CONFIG_H264_DXVA2_HWACCEL) += dxva2_h264.o OBJS-$(CONFIG_H264_NVDEC_HWACCEL) += nvdec_h264.o OBJS-$(CONFIG_H264_QSV_HWACCEL) += qsvdec.o +OBJS-$(CONFIG_H264_V4L2REQUEST_HWACCEL) += v4l2_request_h264.o OBJS-$(CONFIG_H264_VAAPI_HWACCEL) += vaapi_h264.o OBJS-$(CONFIG_H264_VDPAU_HWACCEL) += vdpau_h264.o OBJS-$(CONFIG_H264_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index bcb9f70c0e..6b7f569da4 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -768,6 +768,7 @@ static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback) #define HWACCEL_MAX (CONFIG_H264_DXVA2_HWACCEL + \ (CONFIG_H264_D3D11VA_HWACCEL * 2) + \ CONFIG_H264_NVDEC_HWACCEL + \ + CONFIG_H264_V4L2REQUEST_HWACCEL + \ CONFIG_H264_VAAPI_HWACCEL + \ CONFIG_H264_VIDEOTOOLBOX_HWACCEL + \ CONFIG_H264_VDPAU_HWACCEL) @@ -852,6 +853,9 @@ static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback) #endif #if CONFIG_H264_VIDEOTOOLBOX_HWACCEL *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX; +#endif +#if CONFIG_H264_V4L2REQUEST_HWACCEL + *fmt++ = AV_PIX_FMT_DRM_PRIME; #endif if (h->avctx->codec->pix_fmts) choices = h->avctx->codec->pix_fmts; diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c index 1705046e29..55046031b2 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -1076,6 +1076,9 @@ AVCodec ff_h264_decoder = { #endif #if CONFIG_H264_VIDEOTOOLBOX_HWACCEL HWACCEL_VIDEOTOOLBOX(h264), +#endif +#if CONFIG_H264_V4L2REQUEST_HWACCEL + HWACCEL_V4L2REQUEST(h264), #endif NULL }, diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h index 8e54cf73f9..969a1da0f4 100644 --- a/libavcodec/hwaccels.h +++ b/libavcodec/hwaccels.h @@ -32,6 +32,7 @@ extern const AVHWAccel ff_h264_d3d11va_hwaccel; extern const AVHWAccel ff_h264_d3d11va2_hwaccel; extern const AVHWAccel ff_h264_dxva2_hwaccel; extern const AVHWAccel ff_h264_nvdec_hwaccel; +extern const AVHWAccel ff_h264_v4l2request_hwaccel; extern const AVHWAccel ff_h264_vaapi_hwaccel; extern const AVHWAccel ff_h264_vdpau_hwaccel; 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..394bae0550 --- /dev/null +++ b/libavcodec/v4l2_request_h264.c @@ -0,0 +1,456 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "h264dec.h" +#include "hwconfig.h" +#include "v4l2_request.h" + +typedef struct V4L2RequestControlsH264 { + struct v4l2_ctrl_h264_sps sps; + struct v4l2_ctrl_h264_pps pps; + struct v4l2_ctrl_h264_scaling_matrix scaling_matrix; + struct v4l2_ctrl_h264_decode_params decode_params; + struct v4l2_ctrl_h264_slice_params slice_params; + struct v4l2_ctrl_h264_pred_weights pred_weights; + int pred_weights_required; + int first_slice; + int num_slices; +} V4L2RequestControlsH264; + +typedef struct V4L2RequestContextH264 { + V4L2RequestContext base; + int decode_mode; + int start_code; +} V4L2RequestContextH264; + +static uint8_t nalu_slice_start_code[] = { 0x00, 0x00, 0x01 }; + +static void fill_weight_factors(struct v4l2_h264_weight_factors *factors, int list, const H264SliceContext *sl) +{ + for (int i = 0; i < sl->ref_count[list]; i++) { + if (sl->pwt.luma_weight_flag[list]) { + factors->luma_weight[i] = sl->pwt.luma_weight[i][list][0]; + factors->luma_offset[i] = sl->pwt.luma_weight[i][list][1]; + } else { + factors->luma_weight[i] = 1 << sl->pwt.luma_log2_weight_denom; + factors->luma_offset[i] = 0; + } + for (int j = 0; j < 2; j++) { + if (sl->pwt.chroma_weight_flag[list]) { + factors->chroma_weight[i][j] = sl->pwt.chroma_weight[i][list][j][0]; + factors->chroma_offset[i][j] = sl->pwt.chroma_weight[i][list][j][1]; + } else { + factors->chroma_weight[i][j] = 1 << sl->pwt.chroma_log2_weight_denom; + factors->chroma_offset[i][j] = 0; + } + } + } +} + +static void fill_dpb_entry(struct v4l2_h264_dpb_entry *entry, const H264Picture *pic) +{ + entry->reference_ts = ff_v4l2_request_get_capture_timestamp(pic->f); + entry->pic_num = pic->pic_id; + entry->frame_num = pic->long_ref ? pic->pic_id : pic->frame_num; + entry->fields = pic->reference & V4L2_H264_FRAME_REF; + entry->flags = V4L2_H264_DPB_ENTRY_FLAG_VALID; + if (entry->fields) + entry->flags |= V4L2_H264_DPB_ENTRY_FLAG_ACTIVE; + if (pic->long_ref) + entry->flags |= V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM; + if (pic->field_picture) + entry->flags |= V4L2_H264_DPB_ENTRY_FLAG_FIELD; + 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) +{ + int entries = 0; + + for (int i = 0; i < h->short_ref_count; i++) { + const H264Picture *pic = h->short_ref[i]; + if (pic && (pic->field_poc[0] != INT_MAX || pic->field_poc[1] != INT_MAX)) + fill_dpb_entry(&decode->dpb[entries++], pic); + } + + if (!h->long_ref_count) + return; + + for (int i = 0; i < FF_ARRAY_ELEMS(h->long_ref); i++) { + const H264Picture *pic = h->long_ref[i]; + if (pic && (pic->field_poc[0] != INT_MAX || pic->field_poc[1] != INT_MAX)) + fill_dpb_entry(&decode->dpb[entries++], pic); + } +} + +static void fill_ref_list(struct v4l2_h264_reference *reference, struct v4l2_ctrl_h264_decode_params *decode, const H264Ref *ref) +{ + uint64_t timestamp; + + if (!ref->parent) + return; + + timestamp = ff_v4l2_request_get_capture_timestamp(ref->parent->f); + + for (uint8_t i = 0; i < FF_ARRAY_ELEMS(decode->dpb); i++) { + struct v4l2_h264_dpb_entry *entry = &decode->dpb[i]; + if ((entry->flags & V4L2_H264_DPB_ENTRY_FLAG_VALID) && + entry->reference_ts == timestamp) { + reference->fields = ref->reference & V4L2_H264_FRAME_REF; + reference->index = i; + return; + } + } +} + +static void fill_sps(struct v4l2_ctrl_h264_sps *ctrl, const H264Context *h) +{ + const SPS *sps = h->ps.sps; + + *ctrl = (struct v4l2_ctrl_h264_sps) { + .profile_idc = sps->profile_idc, + .constraint_set_flags = sps->constraint_set_flags, + .level_idc = sps->level_idc, + .seq_parameter_set_id = sps->sps_id, + .chroma_format_idc = sps->chroma_format_idc, + .bit_depth_luma_minus8 = sps->bit_depth_luma - 8, + .bit_depth_chroma_minus8 = sps->bit_depth_chroma - 8, + .log2_max_frame_num_minus4 = sps->log2_max_frame_num - 4, + .pic_order_cnt_type = sps->poc_type, + .log2_max_pic_order_cnt_lsb_minus4 = sps->log2_max_poc_lsb - 4, + .max_num_ref_frames = sps->ref_frame_count, + .num_ref_frames_in_pic_order_cnt_cycle = sps->poc_cycle_length, + .offset_for_non_ref_pic = sps->offset_for_non_ref_pic, + .offset_for_top_to_bottom_field = sps->offset_for_top_to_bottom_field, + .pic_width_in_mbs_minus1 = h->mb_width - 1, + .pic_height_in_map_units_minus1 = sps->frame_mbs_only_flag ? h->mb_height - 1 : h->mb_height / 2 - 1, + }; + + if (sps->poc_cycle_length > 0 && sps->poc_cycle_length <= 255) + memcpy(ctrl->offset_for_ref_frame, sps->offset_for_ref_frame, sps->poc_cycle_length * sizeof(ctrl->offset_for_ref_frame[0])); + + if (sps->residual_color_transform_flag) + ctrl->flags |= V4L2_H264_SPS_FLAG_SEPARATE_COLOUR_PLANE; + if (sps->transform_bypass) + ctrl->flags |= V4L2_H264_SPS_FLAG_QPPRIME_Y_ZERO_TRANSFORM_BYPASS; + if (sps->delta_pic_order_always_zero_flag) + ctrl->flags |= V4L2_H264_SPS_FLAG_DELTA_PIC_ORDER_ALWAYS_ZERO; + if (sps->gaps_in_frame_num_allowed_flag) + ctrl->flags |= V4L2_H264_SPS_FLAG_GAPS_IN_FRAME_NUM_VALUE_ALLOWED; + if (sps->frame_mbs_only_flag) + ctrl->flags |= V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY; + if (sps->mb_aff) + ctrl->flags |= V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD; + if (sps->direct_8x8_inference_flag) + ctrl->flags |= V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE; +} + +static void fill_pps(struct v4l2_ctrl_h264_pps *ctrl, const H264Context *h) +{ + const SPS *sps = h->ps.sps; + const PPS *pps = h->ps.pps; + const H264SliceContext *sl = &h->slice_ctx[0]; + int qp_bd_offset = 6 * (sps->bit_depth_luma - 8); + + *ctrl = (struct v4l2_ctrl_h264_pps) { + .pic_parameter_set_id = sl->pps_id, + .seq_parameter_set_id = pps->sps_id, + .num_slice_groups_minus1 = pps->slice_group_count - 1, + .num_ref_idx_l0_default_active_minus1 = pps->ref_count[0] - 1, + .num_ref_idx_l1_default_active_minus1 = pps->ref_count[1] - 1, + .weighted_bipred_idc = pps->weighted_bipred_idc, + .pic_init_qp_minus26 = pps->init_qp - 26 - qp_bd_offset, + .pic_init_qs_minus26 = pps->init_qs - 26 - qp_bd_offset, + .chroma_qp_index_offset = pps->chroma_qp_index_offset[0], + .second_chroma_qp_index_offset = pps->chroma_qp_index_offset[1], + }; + + if (pps->cabac) + ctrl->flags |= V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE; + if (pps->pic_order_present) + ctrl->flags |= V4L2_H264_PPS_FLAG_BOTTOM_FIELD_PIC_ORDER_IN_FRAME_PRESENT; + if (pps->weighted_pred) + ctrl->flags |= V4L2_H264_PPS_FLAG_WEIGHTED_PRED; + if (pps->deblocking_filter_parameters_present) + ctrl->flags |= V4L2_H264_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT; + if (pps->constrained_intra_pred) + ctrl->flags |= V4L2_H264_PPS_FLAG_CONSTRAINED_INTRA_PRED; + if (pps->redundant_pic_cnt_present) + ctrl->flags |= V4L2_H264_PPS_FLAG_REDUNDANT_PIC_CNT_PRESENT; + if (pps->transform_8x8_mode) + ctrl->flags |= V4L2_H264_PPS_FLAG_TRANSFORM_8X8_MODE; + + /* FFmpeg always provide a scaling matrix */ + ctrl->flags |= V4L2_H264_PPS_FLAG_SCALING_MATRIX_PRESENT; +} + +static int v4l2_request_h264_start_frame(AVCodecContext *avctx, + av_unused const uint8_t *buffer, + av_unused uint32_t size) +{ + const H264Context *h = avctx->priv_data; + const PPS *pps = h->ps.pps; + const SPS *sps = h->ps.sps; + const H264SliceContext *sl = &h->slice_ctx[0]; + V4L2RequestControlsH264 *controls = h->cur_pic_ptr->hwaccel_picture_private; + + fill_sps(&controls->sps, h); + fill_pps(&controls->pps, h); + + memcpy(controls->scaling_matrix.scaling_list_4x4, pps->scaling_matrix4, sizeof(controls->scaling_matrix.scaling_list_4x4)); + memcpy(controls->scaling_matrix.scaling_list_8x8[0], pps->scaling_matrix8[0], sizeof(controls->scaling_matrix.scaling_list_8x8[0])); + memcpy(controls->scaling_matrix.scaling_list_8x8[1], pps->scaling_matrix8[3], sizeof(controls->scaling_matrix.scaling_list_8x8[1])); + + if (sps->chroma_format_idc == 3) { + memcpy(controls->scaling_matrix.scaling_list_8x8[2], pps->scaling_matrix8[1], sizeof(controls->scaling_matrix.scaling_list_8x8[2])); + memcpy(controls->scaling_matrix.scaling_list_8x8[3], pps->scaling_matrix8[4], sizeof(controls->scaling_matrix.scaling_list_8x8[3])); + memcpy(controls->scaling_matrix.scaling_list_8x8[4], pps->scaling_matrix8[2], sizeof(controls->scaling_matrix.scaling_list_8x8[4])); + memcpy(controls->scaling_matrix.scaling_list_8x8[5], pps->scaling_matrix8[5], sizeof(controls->scaling_matrix.scaling_list_8x8[5])); + } + + controls->decode_params = (struct v4l2_ctrl_h264_decode_params) { + .nal_ref_idc = h->nal_ref_idc, + .frame_num = h->poc.frame_num, + .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, + .idr_pic_id = sl->idr_pic_id, + .pic_order_cnt_lsb = sl->poc_lsb, + .delta_pic_order_cnt_bottom = sl->delta_poc_bottom, + .delta_pic_order_cnt0 = sl->delta_poc[0], + .delta_pic_order_cnt1 = sl->delta_poc[1], + /* Size in bits of dec_ref_pic_marking() syntax element. */ + .dec_ref_pic_marking_bit_size = sl->ref_pic_marking_bit_size, + /* Size in bits of pic order count syntax. */ + .pic_order_cnt_bit_size = sl->pic_order_cnt_bit_size, + .slice_group_change_cycle = 0, /* slice group not supported by FFmpeg */ + }; + + if (h->picture_idr) + controls->decode_params.flags |= V4L2_H264_DECODE_PARAM_FLAG_IDR_PIC; + if (FIELD_PICTURE(h)) + controls->decode_params.flags |= V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC; + if (h->picture_structure == PICT_BOTTOM_FIELD) + controls->decode_params.flags |= V4L2_H264_DECODE_PARAM_FLAG_BOTTOM_FIELD; + + fill_dpb(&controls->decode_params, h); + + controls->first_slice = !FIELD_PICTURE(h) || h->first_field; + controls->num_slices = 0; + + return ff_v4l2_request_reset_frame(avctx, h->cur_pic_ptr->f); +} + +static int v4l2_request_h264_queue_decode(AVCodecContext *avctx, int last_slice) +{ + const H264Context *h = avctx->priv_data; + V4L2RequestControlsH264 *controls = h->cur_pic_ptr->hwaccel_picture_private; + V4L2RequestContextH264 *ctx = avctx->internal->hwaccel_priv_data; + + struct v4l2_ext_control control[] = { + { + .id = V4L2_CID_STATELESS_H264_SPS, + .ptr = &controls->sps, + .size = sizeof(controls->sps), + }, + { + .id = V4L2_CID_STATELESS_H264_PPS, + .ptr = &controls->pps, + .size = sizeof(controls->pps), + }, + { + .id = V4L2_CID_STATELESS_H264_SCALING_MATRIX, + .ptr = &controls->scaling_matrix, + .size = sizeof(controls->scaling_matrix), + }, + { + .id = V4L2_CID_STATELESS_H264_DECODE_PARAMS, + .ptr = &controls->decode_params, + .size = sizeof(controls->decode_params), + }, + { + .id = V4L2_CID_STATELESS_H264_SLICE_PARAMS, + .ptr = &controls->slice_params, + .size = sizeof(controls->slice_params), + }, + { + .id = V4L2_CID_STATELESS_H264_PRED_WEIGHTS, + .ptr = &controls->pred_weights, + .size = sizeof(controls->pred_weights), + }, + }; + + if (ctx->decode_mode == V4L2_STATELESS_H264_DECODE_MODE_SLICE_BASED) { + int count = FF_ARRAY_ELEMS(control) - (controls->pred_weights_required ? 0 : 1); + return ff_v4l2_request_decode_slice(avctx, h->cur_pic_ptr->f, control, count, controls->first_slice, last_slice); + } + + return ff_v4l2_request_decode_frame(avctx, h->cur_pic_ptr->f, control, FF_ARRAY_ELEMS(control) - 2); +} + +static int v4l2_request_h264_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) +{ + const H264Context *h = avctx->priv_data; + const PPS *pps = h->ps.pps; + const H264SliceContext *sl = &h->slice_ctx[0]; + V4L2RequestControlsH264 *controls = h->cur_pic_ptr->hwaccel_picture_private; + V4L2RequestContextH264 *ctx = avctx->internal->hwaccel_priv_data; + int i, ret, count; + + if (ctx->decode_mode == V4L2_STATELESS_H264_DECODE_MODE_SLICE_BASED && controls->num_slices) { + ret = v4l2_request_h264_queue_decode(avctx, 0); + if (ret) + return ret; + + ff_v4l2_request_reset_frame(avctx, h->cur_pic_ptr->f); + controls->first_slice = 0; + } + + if (ctx->start_code == V4L2_STATELESS_H264_START_CODE_ANNEX_B) { + ret = ff_v4l2_request_append_output_buffer(avctx, h->cur_pic_ptr->f, nalu_slice_start_code, 3); + if (ret) + return ret; + } + + ret = ff_v4l2_request_append_output_buffer(avctx, h->cur_pic_ptr->f, buffer, size); + if (ret) + return ret; + + if (ctx->decode_mode != V4L2_STATELESS_H264_DECODE_MODE_SLICE_BASED) + return 0; + + controls->slice_params = (struct v4l2_ctrl_h264_slice_params) { + /* Offset in bits to slice_data() from the beginning of this slice. */ + .header_bit_size = get_bits_count(&sl->gb), + + .first_mb_in_slice = sl->first_mb_addr, + + .slice_type = ff_h264_get_slice_type(sl), + .colour_plane_id = 0, /* separate colour plane not supported by FFmpeg */ + .redundant_pic_cnt = sl->redundant_pic_count, + .cabac_init_idc = sl->cabac_init_idc, + .slice_qp_delta = sl->qscale - pps->init_qp, + .slice_qs_delta = 0, /* not implemented by FFmpeg */ + .disable_deblocking_filter_idc = sl->deblocking_filter < 2 ? !sl->deblocking_filter : sl->deblocking_filter, + .slice_alpha_c0_offset_div2 = sl->slice_alpha_c0_offset / 2, + .slice_beta_offset_div2 = sl->slice_beta_offset / 2, + .num_ref_idx_l0_active_minus1 = sl->list_count > 0 ? sl->ref_count[0] - 1 : 0, + .num_ref_idx_l1_active_minus1 = sl->list_count > 1 ? sl->ref_count[1] - 1 : 0, + }; + + if (sl->slice_type == AV_PICTURE_TYPE_B && sl->direct_spatial_mv_pred) + controls->slice_params.flags |= V4L2_H264_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED; + /* V4L2_H264_SLICE_FLAG_SP_FOR_SWITCH: not implemented by FFmpeg */ + + controls->pred_weights_required = V4L2_H264_CTRL_PRED_WEIGHTS_REQUIRED(&controls->pps, &controls->slice_params); + if (controls->pred_weights_required) { + controls->pred_weights.chroma_log2_weight_denom = sl->pwt.chroma_log2_weight_denom; + controls->pred_weights.luma_log2_weight_denom = sl->pwt.luma_log2_weight_denom; + } + + count = sl->list_count > 0 ? sl->ref_count[0] : 0; + for (i = 0; i < count; i++) + fill_ref_list(&controls->slice_params.ref_pic_list0[i], &controls->decode_params, &sl->ref_list[0][i]); + if (count && controls->pred_weights_required) + fill_weight_factors(&controls->pred_weights.weight_factors[0], 0, sl); + + count = sl->list_count > 1 ? sl->ref_count[1] : 0; + for (i = 0; i < count; i++) + fill_ref_list(&controls->slice_params.ref_pic_list1[i], &controls->decode_params, &sl->ref_list[1][i]); + if (count && controls->pred_weights_required) + fill_weight_factors(&controls->pred_weights.weight_factors[1], 1, sl); + + controls->num_slices++; + return 0; +} + +static int v4l2_request_h264_end_frame(AVCodecContext *avctx) +{ + const H264Context *h = avctx->priv_data; + return v4l2_request_h264_queue_decode(avctx, !FIELD_PICTURE(h) || !h->first_field); +} + +static int v4l2_request_h264_set_controls(AVCodecContext *avctx) +{ + V4L2RequestContextH264 *ctx = avctx->internal->hwaccel_priv_data; + + struct v4l2_ext_control control[] = { + { .id = V4L2_CID_STATELESS_H264_DECODE_MODE, }, + { .id = V4L2_CID_STATELESS_H264_START_CODE, }, + }; + + ctx->decode_mode = ff_v4l2_request_query_control_default_value(avctx, V4L2_CID_STATELESS_H264_DECODE_MODE); + if (ctx->decode_mode != V4L2_STATELESS_H264_DECODE_MODE_SLICE_BASED && + ctx->decode_mode != V4L2_STATELESS_H264_DECODE_MODE_FRAME_BASED) { + av_log(avctx, AV_LOG_ERROR, "%s: unsupported decode mode, %d\n", __func__, ctx->decode_mode); + return AVERROR(EINVAL); + } + + ctx->start_code = ff_v4l2_request_query_control_default_value(avctx, V4L2_CID_STATELESS_H264_START_CODE); + if (ctx->start_code != V4L2_STATELESS_H264_START_CODE_NONE && + ctx->start_code != V4L2_STATELESS_H264_START_CODE_ANNEX_B) { + av_log(avctx, AV_LOG_ERROR, "%s: unsupported start code, %d\n", __func__, ctx->start_code); + return AVERROR(EINVAL); + } + + control[0].value = ctx->decode_mode; + control[1].value = ctx->start_code; + + return ff_v4l2_request_set_controls(avctx, control, FF_ARRAY_ELEMS(control)); +} + +static int v4l2_request_h264_init(AVCodecContext *avctx) +{ + const H264Context *h = avctx->priv_data; + struct v4l2_ctrl_h264_sps sps; + int ret; + + struct v4l2_ext_control control[] = { + { + .id = V4L2_CID_STATELESS_H264_SPS, + .ptr = &sps, + .size = sizeof(sps), + }, + }; + + fill_sps(&sps, h); + + ret = ff_v4l2_request_init(avctx, V4L2_PIX_FMT_H264_SLICE, 4 * 1024 * 1024, control, FF_ARRAY_ELEMS(control)); + if (ret) + return ret; + + return v4l2_request_h264_set_controls(avctx); +} + +const AVHWAccel ff_h264_v4l2request_hwaccel = { + .name = "h264_v4l2request", + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_H264, + .pix_fmt = AV_PIX_FMT_DRM_PRIME, + .start_frame = v4l2_request_h264_start_frame, + .decode_slice = v4l2_request_h264_decode_slice, + .end_frame = v4l2_request_h264_end_frame, + .frame_priv_data_size = sizeof(V4L2RequestControlsH264), + .init = v4l2_request_h264_init, + .uninit = ff_v4l2_request_uninit, + .priv_data_size = sizeof(V4L2RequestContextH264), + .frame_params = ff_v4l2_request_frame_params, + .caps_internal = HWACCEL_CAP_ASYNC_SAFE, +}; From 1ffea498d7e1000acbaa456bb52e26757779622a Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 15 Dec 2018 22:32:16 +0100 Subject: [PATCH 06/12] Add V4L2 request API mpeg2 hwaccel Signed-off-by: Jonas Karlman --- configure | 3 + libavcodec/Makefile | 1 + libavcodec/hwaccels.h | 1 + libavcodec/mpeg12dec.c | 6 ++ libavcodec/v4l2_request_mpeg2.c | 159 ++++++++++++++++++++++++++++++++ 5 files changed, 170 insertions(+) create mode 100644 libavcodec/v4l2_request_mpeg2.c diff --git a/configure b/configure index efd12f1b52..1b70ea65e4 100755 --- a/configure +++ b/configure @@ -2996,6 +2996,8 @@ mpeg2_dxva2_hwaccel_deps="dxva2" mpeg2_dxva2_hwaccel_select="mpeg2video_decoder" mpeg2_nvdec_hwaccel_deps="nvdec" mpeg2_nvdec_hwaccel_select="mpeg2video_decoder" +mpeg2_v4l2request_hwaccel_deps="v4l2_request mpeg2_v4l2_request" +mpeg2_v4l2request_hwaccel_select="mpeg2video_decoder" mpeg2_vaapi_hwaccel_deps="vaapi" mpeg2_vaapi_hwaccel_select="mpeg2video_decoder" mpeg2_vdpau_hwaccel_deps="vdpau" @@ -6632,6 +6634,7 @@ fi 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;" +check_cc mpeg2_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG2_SLICE;" check_headers sys/videoio.h test_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 426c7528e9..02c023a447 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -955,6 +955,7 @@ OBJS-$(CONFIG_MPEG2_D3D11VA_HWACCEL) += dxva2_mpeg2.o OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL) += dxva2_mpeg2.o OBJS-$(CONFIG_MPEG2_NVDEC_HWACCEL) += nvdec_mpeg12.o OBJS-$(CONFIG_MPEG2_QSV_HWACCEL) += qsvdec.o +OBJS-$(CONFIG_MPEG2_V4L2REQUEST_HWACCEL) += v4l2_request_mpeg2.o OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL) += vaapi_mpeg2.o OBJS-$(CONFIG_MPEG2_VDPAU_HWACCEL) += vdpau_mpeg12.o OBJS-$(CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h index 969a1da0f4..a8ae1483d8 100644 --- a/libavcodec/hwaccels.h +++ b/libavcodec/hwaccels.h @@ -53,6 +53,7 @@ extern const AVHWAccel ff_mpeg2_d3d11va_hwaccel; extern const AVHWAccel ff_mpeg2_d3d11va2_hwaccel; extern const AVHWAccel ff_mpeg2_nvdec_hwaccel; extern const AVHWAccel ff_mpeg2_dxva2_hwaccel; +extern const AVHWAccel ff_mpeg2_v4l2request_hwaccel; extern const AVHWAccel ff_mpeg2_vaapi_hwaccel; extern const AVHWAccel ff_mpeg2_vdpau_hwaccel; extern const AVHWAccel ff_mpeg2_videotoolbox_hwaccel; diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index 09bf01247d..bcdf26680a 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -1147,6 +1147,9 @@ static const enum AVPixelFormat mpeg2_hwaccel_pixfmt_list_420[] = { #endif #if CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL AV_PIX_FMT_VIDEOTOOLBOX, +#endif +#if CONFIG_MPEG2_V4L2REQUEST_HWACCEL + AV_PIX_FMT_DRM_PRIME, #endif AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE @@ -2961,6 +2964,9 @@ AVCodec ff_mpeg2video_decoder = { #endif #if CONFIG_MPEG2_XVMC_HWACCEL HWACCEL_XVMC(mpeg2), +#endif +#if CONFIG_MPEG2_V4L2REQUEST_HWACCEL + HWACCEL_V4L2REQUEST(mpeg2), #endif NULL }, diff --git a/libavcodec/v4l2_request_mpeg2.c b/libavcodec/v4l2_request_mpeg2.c new file mode 100644 index 0000000000..84d53209c7 --- /dev/null +++ b/libavcodec/v4l2_request_mpeg2.c @@ -0,0 +1,159 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hwconfig.h" +#include "mpegvideo.h" +#include "v4l2_request.h" + +typedef struct V4L2RequestControlsMPEG2 { + struct v4l2_ctrl_mpeg2_sequence sequence; + struct v4l2_ctrl_mpeg2_picture picture; + struct v4l2_ctrl_mpeg2_quantisation quantisation; +} V4L2RequestControlsMPEG2; + +static int v4l2_request_mpeg2_start_frame(AVCodecContext *avctx, + av_unused const uint8_t *buffer, + av_unused uint32_t size) +{ + const MpegEncContext *s = avctx->priv_data; + V4L2RequestControlsMPEG2 *controls = s->current_picture_ptr->hwaccel_picture_private; + V4L2RequestDescriptor *req = (V4L2RequestDescriptor*)s->current_picture_ptr->f->data[0]; + + controls->sequence = (struct v4l2_ctrl_mpeg2_sequence) { + /* ISO/IEC 13818-2, ITU-T Rec. H.262: Sequence header */ + .horizontal_size = s->width, + .vertical_size = s->height, + .vbv_buffer_size = req->output.size, + + /* ISO/IEC 13818-2, ITU-T Rec. H.262: Sequence extension */ + .profile_and_level_indication = 0, + .chroma_format = s->chroma_format, + }; + + if (s->progressive_sequence) + controls->sequence.flags |= V4L2_MPEG2_SEQ_FLAG_PROGRESSIVE; + + controls->picture = (struct v4l2_ctrl_mpeg2_picture) { + /* ISO/IEC 13818-2, ITU-T Rec. H.262: Picture header */ + .picture_coding_type = s->pict_type, + + /* ISO/IEC 13818-2, ITU-T Rec. H.262: Picture coding extension */ + .f_code[0][0] = s->mpeg_f_code[0][0], + .f_code[0][1] = s->mpeg_f_code[0][1], + .f_code[1][0] = s->mpeg_f_code[1][0], + .f_code[1][1] = s->mpeg_f_code[1][1], + .picture_structure = s->picture_structure, + .intra_dc_precision = s->intra_dc_precision, + }; + + if (s->top_field_first) + controls->picture.flags |= V4L2_MPEG2_PIC_FLAG_TOP_FIELD_FIRST; + + if (s->frame_pred_frame_dct) + controls->picture.flags |= V4L2_MPEG2_PIC_FLAG_FRAME_PRED_DCT; + + if (s->concealment_motion_vectors) + controls->picture.flags |= V4L2_MPEG2_PIC_FLAG_CONCEALMENT_MV; + + if (s->intra_vlc_format) + controls->picture.flags |= V4L2_MPEG2_PIC_FLAG_INTRA_VLC; + + if (s->q_scale_type) + controls->picture.flags |= V4L2_MPEG2_PIC_FLAG_Q_SCALE_TYPE; + + if (s->alternate_scan) + controls->picture.flags |= V4L2_MPEG2_PIC_FLAG_ALT_SCAN; + + if (s->repeat_first_field) + controls->picture.flags |= V4L2_MPEG2_PIC_FLAG_REPEAT_FIRST; + + if (s->progressive_frame) + controls->picture.flags |= V4L2_MPEG2_PIC_FLAG_PROGRESSIVE; + + switch (s->pict_type) { + case AV_PICTURE_TYPE_B: + controls->picture.backward_ref_ts = ff_v4l2_request_get_capture_timestamp(s->next_picture.f); + // fall-through + case AV_PICTURE_TYPE_P: + controls->picture.forward_ref_ts = ff_v4l2_request_get_capture_timestamp(s->last_picture.f); + } + + for (int i = 0; i < 64; i++) { + int n = s->idsp.idct_permutation[ff_zigzag_direct[i]]; + controls->quantisation.intra_quantiser_matrix[i] = s->intra_matrix[n]; + controls->quantisation.non_intra_quantiser_matrix[i] = s->inter_matrix[n]; + controls->quantisation.chroma_intra_quantiser_matrix[i] = s->chroma_intra_matrix[n]; + controls->quantisation.chroma_non_intra_quantiser_matrix[i] = s->chroma_inter_matrix[n]; + } + + return ff_v4l2_request_reset_frame(avctx, s->current_picture_ptr->f); +} + +static int v4l2_request_mpeg2_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) +{ + const MpegEncContext *s = avctx->priv_data; + + return ff_v4l2_request_append_output_buffer(avctx, s->current_picture_ptr->f, buffer, size); +} + +static int v4l2_request_mpeg2_end_frame(AVCodecContext *avctx) +{ + const MpegEncContext *s = avctx->priv_data; + V4L2RequestControlsMPEG2 *controls = s->current_picture_ptr->hwaccel_picture_private; + + struct v4l2_ext_control control[] = { + { + .id = V4L2_CID_STATELESS_MPEG2_SEQUENCE, + .ptr = &controls->sequence, + .size = sizeof(controls->sequence), + }, + { + .id = V4L2_CID_STATELESS_MPEG2_PICTURE, + .ptr = &controls->picture, + .size = sizeof(controls->picture), + }, + { + .id = V4L2_CID_STATELESS_MPEG2_QUANTISATION, + .ptr = &controls->quantisation, + .size = sizeof(controls->quantisation), + }, + }; + + return ff_v4l2_request_decode_frame(avctx, s->current_picture_ptr->f, control, FF_ARRAY_ELEMS(control)); +} + +static int v4l2_request_mpeg2_init(AVCodecContext *avctx) +{ + return ff_v4l2_request_init(avctx, V4L2_PIX_FMT_MPEG2_SLICE, 1024 * 1024, NULL, 0); +} + +const AVHWAccel ff_mpeg2_v4l2request_hwaccel = { + .name = "mpeg2_v4l2request", + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_MPEG2VIDEO, + .pix_fmt = AV_PIX_FMT_DRM_PRIME, + .start_frame = v4l2_request_mpeg2_start_frame, + .decode_slice = v4l2_request_mpeg2_decode_slice, + .end_frame = v4l2_request_mpeg2_end_frame, + .frame_priv_data_size = sizeof(V4L2RequestControlsMPEG2), + .init = v4l2_request_mpeg2_init, + .uninit = ff_v4l2_request_uninit, + .priv_data_size = sizeof(V4L2RequestContext), + .frame_params = ff_v4l2_request_frame_params, + .caps_internal = HWACCEL_CAP_ASYNC_SAFE, +}; From 2190df619ea9d9cedf3d3c7442de0dc863c8b62e Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Wed, 22 May 2019 14:46:58 +0200 Subject: [PATCH 07/12] Add V4L2 request API vp8 hwaccel Signed-off-by: Boris Brezillon Signed-off-by: Ezequiel Garcia Signed-off-by: Jonas Karlman --- configure | 3 + libavcodec/Makefile | 1 + libavcodec/hwaccels.h | 1 + libavcodec/v4l2_request_vp8.c | 180 ++++++++++++++++++++++++++++++++++ libavcodec/vp8.c | 6 ++ 5 files changed, 191 insertions(+) create mode 100644 libavcodec/v4l2_request_vp8.c diff --git a/configure b/configure index 1b70ea65e4..3f8f7b195a 100755 --- a/configure +++ b/configure @@ -3028,6 +3028,8 @@ vc1_vdpau_hwaccel_deps="vdpau" vc1_vdpau_hwaccel_select="vc1_decoder" vp8_nvdec_hwaccel_deps="nvdec" vp8_nvdec_hwaccel_select="vp8_decoder" +vp8_v4l2request_hwaccel_deps="v4l2_request vp8_v4l2_request" +vp8_v4l2request_hwaccel_select="vp8_decoder" vp8_vaapi_hwaccel_deps="vaapi" vp8_vaapi_hwaccel_select="vp8_decoder" vp9_d3d11va_hwaccel_deps="d3d11va DXVA_PicParams_VP9" @@ -6635,6 +6637,7 @@ fi 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;" check_cc mpeg2_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG2_SLICE;" +check_cc vp8_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_VP8_FRAME;" check_headers sys/videoio.h test_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 02c023a447..c79d678eb3 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -971,6 +971,7 @@ OBJS-$(CONFIG_VC1_QSV_HWACCEL) += qsvdec.o OBJS-$(CONFIG_VC1_VAAPI_HWACCEL) += vaapi_vc1.o OBJS-$(CONFIG_VC1_VDPAU_HWACCEL) += vdpau_vc1.o OBJS-$(CONFIG_VP8_NVDEC_HWACCEL) += nvdec_vp8.o +OBJS-$(CONFIG_VP8_V4L2REQUEST_HWACCEL) += v4l2_request_vp8.o OBJS-$(CONFIG_VP8_VAAPI_HWACCEL) += vaapi_vp8.o OBJS-$(CONFIG_VP9_D3D11VA_HWACCEL) += dxva2_vp9.o OBJS-$(CONFIG_VP9_DXVA2_HWACCEL) += dxva2_vp9.o diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h index a8ae1483d8..9f8d41e367 100644 --- a/libavcodec/hwaccels.h +++ b/libavcodec/hwaccels.h @@ -69,6 +69,7 @@ extern const AVHWAccel ff_vc1_nvdec_hwaccel; extern const AVHWAccel ff_vc1_vaapi_hwaccel; extern const AVHWAccel ff_vc1_vdpau_hwaccel; extern const AVHWAccel ff_vp8_nvdec_hwaccel; +extern const AVHWAccel ff_vp8_v4l2request_hwaccel; extern const AVHWAccel ff_vp8_vaapi_hwaccel; extern const AVHWAccel ff_vp9_d3d11va_hwaccel; extern const AVHWAccel ff_vp9_d3d11va2_hwaccel; diff --git a/libavcodec/v4l2_request_vp8.c b/libavcodec/v4l2_request_vp8.c new file mode 100644 index 0000000000..bc0fc40072 --- /dev/null +++ b/libavcodec/v4l2_request_vp8.c @@ -0,0 +1,180 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hwconfig.h" +#include "v4l2_request.h" +#include "vp8.h" + +typedef struct V4L2RequestControlsVP8 { + struct v4l2_ctrl_vp8_frame ctrl; +} V4L2RequestControlsVP8; + +static int v4l2_request_vp8_start_frame(AVCodecContext *avctx, + av_unused const uint8_t *buffer, + av_unused uint32_t size) +{ + const VP8Context *s = avctx->priv_data; + V4L2RequestControlsVP8 *controls = s->framep[VP56_FRAME_CURRENT]->hwaccel_picture_private; + + memset(&controls->ctrl, 0, sizeof(controls->ctrl)); + return ff_v4l2_request_reset_frame(avctx, s->framep[VP56_FRAME_CURRENT]->tf.f); +} + +static int v4l2_request_vp8_end_frame(AVCodecContext *avctx) +{ + const VP8Context *s = avctx->priv_data; + V4L2RequestControlsVP8 *controls = s->framep[VP56_FRAME_CURRENT]->hwaccel_picture_private; + struct v4l2_ext_control control[] = { + { + .id = V4L2_CID_STATELESS_VP8_FRAME, + .ptr = &controls->ctrl, + .size = sizeof(controls->ctrl), + }, + }; + + return ff_v4l2_request_decode_frame(avctx, s->framep[VP56_FRAME_CURRENT]->tf.f, + control, FF_ARRAY_ELEMS(control)); +} + +static int v4l2_request_vp8_decode_slice(AVCodecContext *avctx, + const uint8_t *buffer, + uint32_t size) +{ + const VP8Context *s = avctx->priv_data; + V4L2RequestControlsVP8 *controls = s->framep[VP56_FRAME_CURRENT]->hwaccel_picture_private; + struct v4l2_ctrl_vp8_frame *frame = &controls->ctrl; + const uint8_t *data = buffer + 3 + 7 * s->keyframe; + unsigned int i, j, k; + + frame->version = s->profile & 0x3; + frame->width = avctx->width; + frame->height = avctx->height; + /* FIXME: set ->xx_scale */ + frame->prob_skip_false = s->prob->mbskip; + frame->prob_intra = s->prob->intra; + frame->prob_gf = s->prob->golden; + frame->prob_last = s->prob->last; + frame->first_part_size = s->header_partition_size; + frame->first_part_header_bits = (8 * (s->coder_state_at_header_end.input - data) - + s->coder_state_at_header_end.bit_count - 8); + frame->num_dct_parts = s->num_coeff_partitions; + for (i = 0; i < 8; i++) + frame->dct_part_sizes[i] = s->coeff_partition_size[i]; + + frame->coder_state.range = s->coder_state_at_header_end.range; + frame->coder_state.value = s->coder_state_at_header_end.value; + frame->coder_state.bit_count = s->coder_state_at_header_end.bit_count; + if (s->framep[VP56_FRAME_PREVIOUS]) + frame->last_frame_ts = ff_v4l2_request_get_capture_timestamp(s->framep[VP56_FRAME_PREVIOUS]->tf.f); + if (s->framep[VP56_FRAME_GOLDEN]) + frame->golden_frame_ts = ff_v4l2_request_get_capture_timestamp(s->framep[VP56_FRAME_GOLDEN]->tf.f); + if (s->framep[VP56_FRAME_GOLDEN2]) + frame->alt_frame_ts = ff_v4l2_request_get_capture_timestamp(s->framep[VP56_FRAME_GOLDEN2]->tf.f); + frame->flags |= s->invisible ? 0 : V4L2_VP8_FRAME_FLAG_SHOW_FRAME; + frame->flags |= s->mbskip_enabled ? V4L2_VP8_FRAME_FLAG_MB_NO_SKIP_COEFF : 0; + frame->flags |= (s->profile & 0x4) ? V4L2_VP8_FRAME_FLAG_EXPERIMENTAL : 0; + frame->flags |= s->keyframe ? V4L2_VP8_FRAME_FLAG_KEY_FRAME : 0; + frame->flags |= s->sign_bias[VP56_FRAME_GOLDEN] ? V4L2_VP8_FRAME_FLAG_SIGN_BIAS_GOLDEN : 0; + frame->flags |= s->sign_bias[VP56_FRAME_GOLDEN2] ? V4L2_VP8_FRAME_FLAG_SIGN_BIAS_ALT : 0; + frame->segment.flags |= s->segmentation.enabled ? V4L2_VP8_SEGMENT_FLAG_ENABLED : 0; + frame->segment.flags |= s->segmentation.update_map ? V4L2_VP8_SEGMENT_FLAG_UPDATE_MAP : 0; + frame->segment.flags |= s->segmentation.update_feature_data ? V4L2_VP8_SEGMENT_FLAG_UPDATE_FEATURE_DATA : 0; + frame->segment.flags |= s->segmentation.absolute_vals ? 0 : V4L2_VP8_SEGMENT_FLAG_DELTA_VALUE_MODE; + for (i = 0; i < 4; i++) { + frame->segment.quant_update[i] = s->segmentation.base_quant[i]; + frame->segment.lf_update[i] = s->segmentation.filter_level[i]; + } + + for (i = 0; i < 3; i++) + frame->segment.segment_probs[i] = s->prob->segmentid[i]; + + frame->lf.level = s->filter.level; + frame->lf.sharpness_level = s->filter.sharpness; + frame->lf.flags |= s->lf_delta.enabled ? V4L2_VP8_LF_ADJ_ENABLE : 0; + frame->lf.flags |= s->lf_delta.update ? V4L2_VP8_LF_DELTA_UPDATE : 0; + frame->lf.flags |= s->filter.simple ? V4L2_VP8_LF_FILTER_TYPE_SIMPLE : 0; + for (i = 0; i < 4; i++) { + frame->lf.ref_frm_delta[i] = s->lf_delta.ref[i]; + frame->lf.mb_mode_delta[i] = s->lf_delta.mode[i + MODE_I4x4]; + } + + // Probabilites + if (s->keyframe) { + static const uint8_t keyframe_y_mode_probs[4] = { + 145, 156, 163, 128 + }; + static const uint8_t keyframe_uv_mode_probs[3] = { + 142, 114, 183 + }; + + memcpy(frame->entropy.y_mode_probs, keyframe_y_mode_probs, 4); + memcpy(frame->entropy.uv_mode_probs, keyframe_uv_mode_probs, 3); + } else { + for (i = 0; i < 4; i++) + frame->entropy.y_mode_probs[i] = s->prob->pred16x16[i]; + for (i = 0; i < 3; i++) + frame->entropy.uv_mode_probs[i] = s->prob->pred8x8c[i]; + } + for (i = 0; i < 2; i++) + for (j = 0; j < 19; j++) + frame->entropy.mv_probs[i][j] = s->prob->mvc[i][j]; + + for (i = 0; i < 4; i++) { + for (j = 0; j < 8; j++) { + static const int coeff_bands_inverse[8] = { + 0, 1, 2, 3, 5, 6, 4, 15 + }; + int coeff_pos = coeff_bands_inverse[j]; + + for (k = 0; k < 3; k++) { + memcpy(frame->entropy.coeff_probs[i][j][k], + s->prob->token[i][coeff_pos][k], 11); + } + } + } + + frame->quant.y_ac_qi = s->quant.yac_qi; + frame->quant.y_dc_delta = s->quant.ydc_delta; + frame->quant.y2_dc_delta = s->quant.y2dc_delta; + frame->quant.y2_ac_delta = s->quant.y2ac_delta; + frame->quant.uv_dc_delta = s->quant.uvdc_delta; + frame->quant.uv_ac_delta = s->quant.uvac_delta; + + return ff_v4l2_request_append_output_buffer(avctx, s->framep[VP56_FRAME_CURRENT]->tf.f, buffer, size); +} + +static int v4l2_request_vp8_init(AVCodecContext *avctx) +{ + return ff_v4l2_request_init(avctx, V4L2_PIX_FMT_VP8_FRAME, 2 * 1024 * 1024, NULL, 0); +} + +const AVHWAccel ff_vp8_v4l2request_hwaccel = { + .name = "vp8_v4l2request", + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_VP8, + .pix_fmt = AV_PIX_FMT_DRM_PRIME, + .start_frame = v4l2_request_vp8_start_frame, + .decode_slice = v4l2_request_vp8_decode_slice, + .end_frame = v4l2_request_vp8_end_frame, + .frame_priv_data_size = sizeof(V4L2RequestControlsVP8), + .init = v4l2_request_vp8_init, + .uninit = ff_v4l2_request_uninit, + .priv_data_size = sizeof(V4L2RequestContext), + .frame_params = ff_v4l2_request_frame_params, + .caps_internal = HWACCEL_CAP_ASYNC_SAFE, +}; diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index d16e7b6aa3..8ee768d875 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -176,6 +176,9 @@ static enum AVPixelFormat get_pixel_format(VP8Context *s) #endif #if CONFIG_VP8_NVDEC_HWACCEL AV_PIX_FMT_CUDA, +#endif +#if CONFIG_VP8_V4L2REQUEST_HWACCEL + AV_PIX_FMT_DRM_PRIME, #endif AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE, @@ -2972,6 +2975,9 @@ AVCodec ff_vp8_decoder = { #endif #if CONFIG_VP8_NVDEC_HWACCEL HWACCEL_NVDEC(vp8), +#endif +#if CONFIG_VP8_V4L2REQUEST_HWACCEL + HWACCEL_V4L2REQUEST(vp8), #endif NULL }, From 4886d1e8caeee49c6ca4d92bc1eaebcdb884924c Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Sat, 15 Dec 2018 22:32:16 +0100 Subject: [PATCH 08/12] Add V4L2 request API hevc hwaccel Signed-off-by: Jernej Skrabec Signed-off-by: Jonas Karlman Signed-off-by: Benjamin Gaignard Signed-off-by: Alex Bee --- configure | 3 + libavcodec/Makefile | 1 + libavcodec/hevcdec.c | 10 + libavcodec/hwaccels.h | 1 + libavcodec/v4l2_request_hevc.c | 681 +++++++++++++++++++++++++++++++++ 5 files changed, 696 insertions(+) create mode 100644 libavcodec/v4l2_request_hevc.c diff --git a/configure b/configure index 3f8f7b195a..6192a6c144 100755 --- a/configure +++ b/configure @@ -2968,6 +2968,8 @@ 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_select="hevc_decoder" hevc_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferHEVC" hevc_vaapi_hwaccel_select="hevc_decoder" hevc_vdpau_hwaccel_deps="vdpau VdpPictureInfoHEVC" @@ -6636,6 +6638,7 @@ fi 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;" +check_cc hevc_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_HEVC_SLICE;" check_cc mpeg2_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG2_SLICE;" check_cc vp8_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_VP8_FRAME;" diff --git a/libavcodec/Makefile b/libavcodec/Makefile index c79d678eb3..0059074530 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -943,6 +943,7 @@ OBJS-$(CONFIG_HEVC_D3D11VA_HWACCEL) += dxva2_hevc.o OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL) += dxva2_hevc.o OBJS-$(CONFIG_HEVC_NVDEC_HWACCEL) += nvdec_hevc.o OBJS-$(CONFIG_HEVC_QSV_HWACCEL) += qsvdec.o +OBJS-$(CONFIG_HEVC_V4L2REQUEST_HWACCEL) += v4l2_request_hevc.o OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL) += vaapi_hevc.o h265_profile_level.o OBJS-$(CONFIG_HEVC_VDPAU_HWACCEL) += vdpau_hevc.o h265_profile_level.o OBJS-$(CONFIG_MJPEG_NVDEC_HWACCEL) += nvdec_mjpeg.o diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index 2231aed259..7507966d71 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -392,6 +392,7 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps) #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \ CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \ CONFIG_HEVC_NVDEC_HWACCEL + \ + CONFIG_HEVC_V4L2REQUEST_HWACCEL + \ CONFIG_HEVC_VAAPI_HWACCEL + \ CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \ CONFIG_HEVC_VDPAU_HWACCEL) @@ -418,6 +419,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps) #endif #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX; +#endif +#if CONFIG_HEVC_V4L2REQUEST_HWACCEL + *fmt++ = AV_PIX_FMT_DRM_PRIME; #endif break; case AV_PIX_FMT_YUV420P10: @@ -439,6 +443,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps) #endif #if CONFIG_HEVC_NVDEC_HWACCEL *fmt++ = AV_PIX_FMT_CUDA; +#endif +#if CONFIG_HEVC_V4L2REQUEST_HWACCEL + *fmt++ = AV_PIX_FMT_DRM_PRIME; #endif break; case AV_PIX_FMT_YUV444P: @@ -3705,6 +3712,9 @@ AVCodec ff_hevc_decoder = { #endif #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL HWACCEL_VIDEOTOOLBOX(hevc), +#endif +#if CONFIG_HEVC_V4L2REQUEST_HWACCEL + HWACCEL_V4L2REQUEST(hevc), #endif NULL }, diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h index 9f8d41e367..ffb9fa5087 100644 --- a/libavcodec/hwaccels.h +++ b/libavcodec/hwaccels.h @@ -40,6 +40,7 @@ extern const AVHWAccel ff_hevc_d3d11va_hwaccel; extern const AVHWAccel ff_hevc_d3d11va2_hwaccel; extern const AVHWAccel ff_hevc_dxva2_hwaccel; extern const AVHWAccel ff_hevc_nvdec_hwaccel; +extern const AVHWAccel ff_hevc_v4l2request_hwaccel; extern const AVHWAccel ff_hevc_vaapi_hwaccel; extern const AVHWAccel ff_hevc_vdpau_hwaccel; 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..c12748ed03 --- /dev/null +++ b/libavcodec/v4l2_request_hevc.c @@ -0,0 +1,681 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hevcdec.h" +#include "hwconfig.h" +#include "v4l2_request.h" + +#define MAX_SLICES 600 // as per HEVC spec ? +#define V4L2_HEVC_CONTROLS_MAX 6 + +typedef struct V4L2RequestControlsHEVC { + struct v4l2_ctrl_hevc_sps sps; + struct v4l2_ctrl_hevc_pps pps; + struct v4l2_ctrl_hevc_decode_params dec_params; + struct v4l2_ctrl_hevc_scaling_matrix scaling_matrix; + struct v4l2_ctrl_hevc_slice_params slice_params[MAX_SLICES]; + __u32 *entry_point_offsets; + unsigned int num_entry_point_offsets; + int first_slice; + int num_slices; +} V4L2RequestControlsHEVC; + +typedef struct V4L2RequestContextHEVC { + V4L2RequestContext base; + unsigned int decode_mode; + unsigned int start_code; + __u32 max_slices; + unsigned int supports_entry_point_offsets; + unsigned int supports_slices; + unsigned int supports_scaling_matrix; +} V4L2RequestContextHEVC; + +static uint8_t nalu_slice_start_code[] = { 0x00, 0x00, 0x01 }; + +static void v4l2_request_hevc_fill_pred_table(const HEVCContext *h, struct v4l2_hevc_pred_weight_table *table) +{ + int32_t luma_weight_denom, chroma_weight_denom; + const SliceHeader *sh = &h->sh; + + if (sh->slice_type == HEVC_SLICE_I || + (sh->slice_type == HEVC_SLICE_P && !h->ps.pps->weighted_pred_flag) || + (sh->slice_type == HEVC_SLICE_B && !h->ps.pps->weighted_bipred_flag)) + return; + + table->luma_log2_weight_denom = sh->luma_log2_weight_denom; + + if (h->ps.sps->chroma_format_idc) + table->delta_chroma_log2_weight_denom = sh->chroma_log2_weight_denom - sh->luma_log2_weight_denom; + + luma_weight_denom = (1 << sh->luma_log2_weight_denom); + chroma_weight_denom = (1 << sh->chroma_log2_weight_denom); + + for (int i = 0; i < 15 && i < sh->nb_refs[L0]; i++) { + table->delta_luma_weight_l0[i] = sh->luma_weight_l0[i] - luma_weight_denom; + table->luma_offset_l0[i] = sh->luma_offset_l0[i]; + table->delta_chroma_weight_l0[i][0] = sh->chroma_weight_l0[i][0] - chroma_weight_denom; + table->delta_chroma_weight_l0[i][1] = sh->chroma_weight_l0[i][1] - chroma_weight_denom; + table->chroma_offset_l0[i][0] = sh->chroma_offset_l0[i][0]; + table->chroma_offset_l0[i][1] = sh->chroma_offset_l0[i][1]; + } + + if (sh->slice_type != HEVC_SLICE_B) + return; + + for (int i = 0; i < 15 && i < sh->nb_refs[L1]; i++) { + table->delta_luma_weight_l1[i] = sh->luma_weight_l1[i] - luma_weight_denom; + table->luma_offset_l1[i] = sh->luma_offset_l1[i]; + table->delta_chroma_weight_l1[i][0] = sh->chroma_weight_l1[i][0] - chroma_weight_denom; + table->delta_chroma_weight_l1[i][1] = sh->chroma_weight_l1[i][1] - chroma_weight_denom; + table->chroma_offset_l1[i][0] = sh->chroma_offset_l1[i][0]; + table->chroma_offset_l1[i][1] = sh->chroma_offset_l1[i][1]; + } +} + +static uint8_t get_ref_pic_index(const HEVCContext *h, const HEVCFrame *frame, + struct v4l2_ctrl_hevc_decode_params *dec_params) +{ + uint64_t timestamp; + + if (!frame) + return 0; + + timestamp = ff_v4l2_request_get_capture_timestamp(frame->frame); + + for (uint8_t i = 0; i < dec_params->num_active_dpb_entries; i++) { + struct v4l2_hevc_dpb_entry *entry = &dec_params->dpb[i]; + if (entry->timestamp == timestamp) + return i; + } + + return 0; +} + +static void fill_dec_params(struct v4l2_ctrl_hevc_decode_params *dec_params, const HEVCContext *h) +{ + const HEVCFrame *pic = h->ref; + const SliceHeader *sh = &h->sh; + int i, entries = 0; + + *dec_params = (struct v4l2_ctrl_hevc_decode_params) { + .pic_order_cnt_val = pic->poc, /* FIXME: is this same as slice_params->slice_pic_order_cnt ? */ + .short_term_ref_pic_set_size = sh->short_term_ref_pic_set_size, + .long_term_ref_pic_set_size = sh->long_term_ref_pic_set_size, + .num_poc_st_curr_before = h->rps[ST_CURR_BEF].nb_refs, + .num_poc_st_curr_after = h->rps[ST_CURR_AFT].nb_refs, + .num_poc_lt_curr = h->rps[LT_CURR].nb_refs, + }; + + for (i = 0; i < FF_ARRAY_ELEMS(h->DPB); i++) { + const HEVCFrame *frame = &h->DPB[i]; + if (frame != pic && (frame->flags & (HEVC_FRAME_FLAG_LONG_REF | HEVC_FRAME_FLAG_SHORT_REF))) { + struct v4l2_hevc_dpb_entry *entry = &dec_params->dpb[entries++]; + + entry->timestamp = ff_v4l2_request_get_capture_timestamp(frame->frame); + entry->field_pic = frame->frame->interlaced_frame; + entry->flags = 0; + if (frame->flags & HEVC_FRAME_FLAG_LONG_REF) + entry->flags |= V4L2_HEVC_DPB_ENTRY_LONG_TERM_REFERENCE; + + entry->pic_order_cnt_val = frame->poc; + } + } + + dec_params->num_active_dpb_entries = entries; + + if (IS_IRAP(h)) + dec_params->flags |= V4L2_HEVC_DECODE_PARAM_FLAG_IRAP_PIC; + + if (IS_IDR(h)) + dec_params->flags |= V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC; + + if (sh->no_output_of_prior_pics_flag) + dec_params->flags |= V4L2_HEVC_DECODE_PARAM_FLAG_NO_OUTPUT_OF_PRIOR; + + for (i = 0; i < V4L2_HEVC_DPB_ENTRIES_NUM_MAX; i++) { + dec_params->poc_st_curr_before[i] = get_ref_pic_index(h, h->rps[ST_CURR_BEF].ref[i], dec_params); + dec_params->poc_st_curr_after[i] = get_ref_pic_index(h, h->rps[ST_CURR_AFT].ref[i], dec_params); + dec_params->poc_lt_curr[i] = get_ref_pic_index(h, h->rps[LT_CURR].ref[i], dec_params); + } +} + +static int v4l2_request_hevc_fill_slice_params(const HEVCContext *h, + V4L2RequestControlsHEVC *controls, + int slice) +{ + struct v4l2_ctrl_hevc_slice_params *slice_params = &controls->slice_params[slice]; + struct v4l2_ctrl_hevc_decode_params *dec_params = &controls->dec_params; + const HEVCFrame *pic = h->ref; + const SliceHeader *sh = &h->sh; + RefPicList *rpl; + int i; + + *slice_params = (struct v4l2_ctrl_hevc_slice_params) { + .bit_size = 0, + .data_byte_offset = (get_bits_count(&h->HEVClc->gb) + 1 + 7) / 8, + .num_entry_point_offsets = sh->num_entry_point_offsets, + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: NAL unit header */ + .nal_unit_type = h->nal_unit_type, + .nuh_temporal_id_plus1 = h->temporal_id + 1, + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + .slice_type = sh->slice_type, + .colour_plane_id = sh->colour_plane_id, + .slice_pic_order_cnt = pic->poc, + .num_ref_idx_l0_active_minus1 = sh->nb_refs[L0] ? sh->nb_refs[L0] - 1 : 0, + .num_ref_idx_l1_active_minus1 = sh->nb_refs[L1] ? sh->nb_refs[L1] - 1 : 0, + .collocated_ref_idx = sh->slice_temporal_mvp_enabled_flag ? sh->collocated_ref_idx : 0, + .five_minus_max_num_merge_cand = sh->slice_type == HEVC_SLICE_I ? 0 : 5 - sh->max_num_merge_cand, + .slice_qp_delta = sh->slice_qp_delta, + .slice_cb_qp_offset = sh->slice_cb_qp_offset, + .slice_cr_qp_offset = sh->slice_cr_qp_offset, + .slice_act_y_qp_offset = 0, + .slice_act_cb_qp_offset = 0, + .slice_act_cr_qp_offset = 0, + .slice_beta_offset_div2 = sh->beta_offset / 2, + .slice_tc_offset_div2 = sh->tc_offset / 2, + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture timing SEI message */ + .pic_struct = h->sei.picture_timing.picture_struct, + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + .slice_segment_addr = sh->slice_segment_addr, + .short_term_ref_pic_set_size = sh->short_term_ref_pic_set_size, + .long_term_ref_pic_set_size = sh->long_term_ref_pic_set_size, + }; + + if (sh->slice_sample_adaptive_offset_flag[0]) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_LUMA; + + if (sh->slice_sample_adaptive_offset_flag[1]) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_CHROMA; + + if (sh->slice_temporal_mvp_enabled_flag) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_TEMPORAL_MVP_ENABLED; + + if (sh->mvd_l1_zero_flag) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_MVD_L1_ZERO; + + if (sh->cabac_init_flag) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_CABAC_INIT; + + if (sh->collocated_list == L0) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_COLLOCATED_FROM_L0; + + /* TODO: V4L2_HEVC_SLICE_PARAMS_FLAG_USE_INTEGER_MV */ + + if (sh->disable_deblocking_filter_flag) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_DEBLOCKING_FILTER_DISABLED; + + if (sh->slice_loop_filter_across_slices_enabled_flag) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED; + + if (sh->dependent_slice_segment_flag) + slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT; + + if (sh->slice_type != HEVC_SLICE_I) { + rpl = &h->ref->refPicList[0]; + for (i = 0; i < rpl->nb_refs; i++) + slice_params->ref_idx_l0[i] = get_ref_pic_index(h, rpl->ref[i], dec_params); + } + + if (sh->slice_type == HEVC_SLICE_B) { + rpl = &h->ref->refPicList[1]; + for (i = 0; i < rpl->nb_refs; i++) + slice_params->ref_idx_l1[i] = get_ref_pic_index(h, rpl->ref[i], dec_params); + } + + v4l2_request_hevc_fill_pred_table(h, &slice_params->pred_weight_table); + + if (controls->num_entry_point_offsets < sh->num_entry_point_offsets) { + av_freep(&controls->entry_point_offsets); + controls->entry_point_offsets = av_mallocz(sizeof(*controls->entry_point_offsets) * sh->num_entry_point_offsets); + if (!controls->entry_point_offsets) + return AVERROR(ENOMEM); + controls->num_entry_point_offsets = sh->num_entry_point_offsets; + } + + for (i = 0; i < sh->num_entry_point_offsets; i++) + controls->entry_point_offsets[i] = sh->entry_point_offset[i]; + + return 0; +} + +static void fill_sps(struct v4l2_ctrl_hevc_sps *ctrl, const HEVCContext *h) +{ + const HEVCSPS *sps = h->ps.sps; + const HEVCPPS *pps = h->ps.pps; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Sequence parameter set */ + *ctrl = (struct v4l2_ctrl_hevc_sps) { + .video_parameter_set_id = sps->vps_id, + .seq_parameter_set_id = pps->sps_id, + .pic_width_in_luma_samples = sps->width, + .pic_height_in_luma_samples = sps->height, + .bit_depth_luma_minus8 = sps->bit_depth - 8, + .bit_depth_chroma_minus8 = sps->bit_depth_chroma - 8, + .log2_max_pic_order_cnt_lsb_minus4 = sps->log2_max_poc_lsb - 4, + .sps_max_dec_pic_buffering_minus1 = sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering - 1, + .sps_max_num_reorder_pics = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics, + .sps_max_latency_increase_plus1 = sps->temporal_layer[sps->max_sub_layers - 1].max_latency_increase + 1, + .log2_min_luma_coding_block_size_minus3 = sps->log2_min_cb_size - 3, + .log2_diff_max_min_luma_coding_block_size = sps->log2_diff_max_min_coding_block_size, + .log2_min_luma_transform_block_size_minus2 = sps->log2_min_tb_size - 2, + .log2_diff_max_min_luma_transform_block_size = sps->log2_max_trafo_size - sps->log2_min_tb_size, + .max_transform_hierarchy_depth_inter = sps->max_transform_hierarchy_depth_inter, + .max_transform_hierarchy_depth_intra = sps->max_transform_hierarchy_depth_intra, + .pcm_sample_bit_depth_luma_minus1 = sps->pcm.bit_depth - 1, + .pcm_sample_bit_depth_chroma_minus1 = sps->pcm.bit_depth_chroma - 1, + .log2_min_pcm_luma_coding_block_size_minus3 = sps->pcm.log2_min_pcm_cb_size - 3, + .log2_diff_max_min_pcm_luma_coding_block_size = sps->pcm.log2_max_pcm_cb_size - sps->pcm.log2_min_pcm_cb_size, + .num_short_term_ref_pic_sets = sps->nb_st_rps, + .num_long_term_ref_pics_sps = sps->num_long_term_ref_pics_sps, + .chroma_format_idc = sps->chroma_format_idc, + .sps_max_sub_layers_minus1 = sps->max_sub_layers - 1, + }; + + if (sps->separate_colour_plane_flag) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE; + + if (sps->scaling_list_enable_flag) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED; + + if (sps->amp_enabled_flag) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_AMP_ENABLED; + + if (sps->sao_enabled) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET; + + if (sps->pcm_enabled_flag) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_PCM_ENABLED; + + if (sps->pcm.loop_filter_disable_flag) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED; + + if (sps->long_term_ref_pics_present_flag) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT; + + if (sps->sps_temporal_mvp_enabled_flag) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED; + + if (sps->sps_strong_intra_smoothing_enable_flag) + ctrl->flags |= V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED; +} + +static int v4l2_request_hevc_start_frame(AVCodecContext *avctx, + av_unused const uint8_t *buffer, + av_unused uint32_t size) +{ + const HEVCContext *h = avctx->priv_data; + const HEVCPPS *pps = h->ps.pps; + const HEVCSPS *sps = h->ps.sps; + const ScalingList *sl = pps->scaling_list_data_present_flag ? + &pps->scaling_list : + sps->scaling_list_enable_flag ? + &sps->scaling_list : NULL; + V4L2RequestControlsHEVC *controls = h->ref->hwaccel_picture_private; + const SliceHeader *sh = &h->sh; + + fill_sps(&controls->sps, h); + fill_dec_params(&controls->dec_params, h); + + if (sl) { + for (int i = 0; i < 6; i++) { + for (int j = 0; j < 16; j++) + controls->scaling_matrix.scaling_list_4x4[i][j] = sl->sl[0][i][j]; + for (int j = 0; j < 64; j++) { + controls->scaling_matrix.scaling_list_8x8[i][j] = sl->sl[1][i][j]; + controls->scaling_matrix.scaling_list_16x16[i][j] = sl->sl[2][i][j]; + if (i < 2) + controls->scaling_matrix.scaling_list_32x32[i][j] = sl->sl[3][i * 3][j]; + } + controls->scaling_matrix.scaling_list_dc_coef_16x16[i] = sl->sl_dc[0][i]; + if (i < 2) + controls->scaling_matrix.scaling_list_dc_coef_32x32[i] = sl->sl_dc[1][i * 3]; + } + } + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture parameter set */ + controls->pps = (struct v4l2_ctrl_hevc_pps) { + .pic_parameter_set_id = sh->pps_id, + .num_extra_slice_header_bits = pps->num_extra_slice_header_bits, + .num_ref_idx_l0_default_active_minus1 = pps->num_ref_idx_l0_default_active - 1, + .num_ref_idx_l1_default_active_minus1 = pps->num_ref_idx_l1_default_active - 1, + .init_qp_minus26 = pps->pic_init_qp_minus26, + .diff_cu_qp_delta_depth = pps->diff_cu_qp_delta_depth, + .pps_cb_qp_offset = pps->cb_qp_offset, + .pps_cr_qp_offset = pps->cr_qp_offset, + .pps_beta_offset_div2 = pps->beta_offset / 2, + .pps_tc_offset_div2 = pps->tc_offset / 2, + .log2_parallel_merge_level_minus2 = pps->log2_parallel_merge_level - 2, + }; + + if (pps->dependent_slice_segments_enabled_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED; + + if (pps->output_flag_present_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT; + + if (pps->sign_data_hiding_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED; + + if (pps->cabac_init_present_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT; + + if (pps->constrained_intra_pred_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED; + + if (pps->transform_skip_enabled_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED; + + if (pps->cu_qp_delta_enabled_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED; + + if (pps->pic_slice_level_chroma_qp_offsets_present_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT; + + if (pps->weighted_pred_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED; + + if (pps->weighted_bipred_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED; + + if (pps->transquant_bypass_enable_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED; + + if (pps->tiles_enabled_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_TILES_ENABLED; + + if (pps->entropy_coding_sync_enabled_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED; + + if (pps->loop_filter_across_tiles_enabled_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED; + + if (pps->seq_loop_filter_across_slices_enabled_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED; + + if (pps->deblocking_filter_override_enabled_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED; + + if (pps->disable_dbf) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER; + + if (pps->lists_modification_present_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT; + + if (pps->slice_header_extension_present_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT; + + if (pps->deblocking_filter_control_present_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT; + + if (pps->uniform_spacing_flag) + controls->pps.flags |= V4L2_HEVC_PPS_FLAG_UNIFORM_SPACING; + + if (pps->tiles_enabled_flag) { + controls->pps.num_tile_columns_minus1 = pps->num_tile_columns - 1; + controls->pps.num_tile_rows_minus1 = pps->num_tile_rows - 1; + + for (int i = 0; i < pps->num_tile_columns; i++) + controls->pps.column_width_minus1[i] = pps->column_width[i] - 1; + + for (int i = 0; i < pps->num_tile_rows; i++) + controls->pps.row_height_minus1[i] = pps->row_height[i] - 1; + } + + controls->first_slice = 1; + controls->num_slices = 0; + controls->num_entry_point_offsets = 0; + + return ff_v4l2_request_reset_frame(avctx, h->ref->frame); +} + +static int v4l2_request_hevc_queue_decode(AVCodecContext *avctx, int last_slice) +{ + const HEVCContext *h = avctx->priv_data; + V4L2RequestControlsHEVC *controls = h->ref->hwaccel_picture_private; + struct v4l2_ctrl_hevc_slice_params *first_slice_params = &controls->slice_params[0]; + V4L2RequestContextHEVC *ctx = avctx->internal->hwaccel_priv_data; + int num_controls = 0; + + struct v4l2_ext_control control[V4L2_HEVC_CONTROLS_MAX] = {}; + + control[num_controls++] = (struct v4l2_ext_control) { + .id = V4L2_CID_STATELESS_HEVC_SPS, + .ptr = &controls->sps, + .size = sizeof(controls->sps), + }; + + control[num_controls++] = (struct v4l2_ext_control) { + .id = V4L2_CID_STATELESS_HEVC_PPS, + .ptr = &controls->pps, + .size = sizeof(controls->pps), + }; + + control[num_controls++] = (struct v4l2_ext_control) { + .id = V4L2_CID_STATELESS_HEVC_DECODE_PARAMS, + .ptr = &controls->dec_params, + .size = sizeof(controls->dec_params), + }; + + if (ctx->supports_scaling_matrix) { + control[num_controls++] = (struct v4l2_ext_control) { + .id = V4L2_CID_STATELESS_HEVC_SCALING_MATRIX, + .ptr = &controls->scaling_matrix, + .size = sizeof(controls->scaling_matrix), + }; + } + + if (ctx->supports_slices) { + control[num_controls++] = (struct v4l2_ext_control) { + .id = V4L2_CID_STATELESS_HEVC_SLICE_PARAMS, + .ptr = &controls->slice_params, + .size = sizeof(*first_slice_params) * controls->num_slices, + }; + } + //this assumes that decoders supporting entry_point_offsets submit a single slice per request + if (ctx->supports_entry_point_offsets && first_slice_params->num_entry_point_offsets > 0) { + control[num_controls++] = (struct v4l2_ext_control) { + .id = V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS, + .ptr = controls->entry_point_offsets, + .size = sizeof(*controls->entry_point_offsets) * first_slice_params->num_entry_point_offsets, + }; + } + + if (ctx->decode_mode == V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED) + return ff_v4l2_request_decode_slice(avctx, h->ref->frame, control, num_controls, controls->first_slice, last_slice); + + return ff_v4l2_request_decode_frame(avctx, h->ref->frame, control, num_controls); +} + +static int v4l2_request_hevc_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) +{ + const HEVCContext *h = avctx->priv_data; + V4L2RequestControlsHEVC *controls = h->ref->hwaccel_picture_private; + V4L2RequestContextHEVC *ctx = avctx->internal->hwaccel_priv_data; + V4L2RequestDescriptor *req = (V4L2RequestDescriptor*)h->ref->frame->data[0]; + int ret, slice = FFMIN(controls->num_slices, MAX_SLICES - 1); + + if (ctx->decode_mode == V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED && slice) { + ret = v4l2_request_hevc_queue_decode(avctx, 0); + if (ret) + return ret; + + ff_v4l2_request_reset_frame(avctx, h->ref->frame); + slice = controls->num_slices = 0; + controls->first_slice = 0; + } + + ret = v4l2_request_hevc_fill_slice_params(h, controls, slice); + if (ret) + return ret; + + if (ctx->start_code == V4L2_STATELESS_HEVC_START_CODE_ANNEX_B) { + ret = ff_v4l2_request_append_output_buffer(avctx, h->ref->frame, nalu_slice_start_code, 3); + if (ret) + return ret; + } + + ret = ff_v4l2_request_append_output_buffer(avctx, h->ref->frame, buffer, size); + if (ret) + return ret; + + controls->slice_params[slice].bit_size = req->output.used * 8; //FIXME + controls->num_slices++; + return 0; +} + +static int v4l2_request_hevc_end_frame(AVCodecContext *avctx) +{ + const HEVCContext *h = avctx->priv_data; + V4L2RequestControlsHEVC *controls = h->ref->hwaccel_picture_private; + int ret; + + ret = v4l2_request_hevc_queue_decode(avctx, 1); + + av_freep(&controls->entry_point_offsets); + + return ret; +} + +static int v4l2_request_hevc_set_controls(AVCodecContext *avctx) +{ + V4L2RequestContextHEVC *ctx = avctx->internal->hwaccel_priv_data; + int ret; + + struct v4l2_ext_control control[] = { + { .id = V4L2_CID_STATELESS_HEVC_DECODE_MODE, }, + { .id = V4L2_CID_STATELESS_HEVC_START_CODE, }, + }; + struct v4l2_query_ext_ctrl entry_point_offsets = { + .id = V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS, + }; + struct v4l2_query_ext_ctrl slice_params = { + .id = V4L2_CID_STATELESS_HEVC_SLICE_PARAMS, + }; + struct v4l2_query_ext_ctrl scaling_matrix = { + .id = V4L2_CID_STATELESS_HEVC_SCALING_MATRIX, + }; + + ctx->decode_mode = ff_v4l2_request_query_control_default_value(avctx, V4L2_CID_STATELESS_HEVC_DECODE_MODE); + if (ctx->decode_mode != V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED && + ctx->decode_mode != V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED) { + av_log(avctx, AV_LOG_ERROR, "%s: unsupported decode mode, %d\n", __func__, ctx->decode_mode); + return AVERROR(EINVAL); + } + + ctx->start_code = ff_v4l2_request_query_control_default_value(avctx, V4L2_CID_STATELESS_HEVC_START_CODE); + if (ctx->start_code != V4L2_STATELESS_HEVC_START_CODE_NONE && + ctx->start_code != V4L2_STATELESS_HEVC_START_CODE_ANNEX_B) { + av_log(avctx, AV_LOG_ERROR, "%s: unsupported start code, %d\n", __func__, ctx->start_code); + return AVERROR(EINVAL); + } + + ret = ff_v4l2_request_query_control(avctx, &entry_point_offsets); + if (ret) { + ctx->supports_entry_point_offsets = 0; + } else { + ctx->supports_entry_point_offsets = 1; + } + + ret = ff_v4l2_request_query_control(avctx, &slice_params); + if (ret) { + ctx->supports_slices = 0; + ctx->max_slices = 0; + if (ctx->decode_mode == V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED) { + av_log(avctx, AV_LOG_ERROR, "%s: decoder is slice-based, \ + but doesn't support V4L2_CID_STATELESS_HEVC_SLICE_PARAMS control \n", __func__); + return AVERROR(EINVAL); + } + + if (ctx->supports_entry_point_offsets) { + av_log(avctx, AV_LOG_ERROR, "%s: decoder supports entry_point_offsets, \ + but doesn't support V4L2_CID_STATELESS_HEVC_SLICE_PARAMS control \n", __func__); + return AVERROR(EINVAL); + } + } else { + ctx->supports_slices = 1; + ctx->max_slices = slice_params.dims[0]; + if (ctx->max_slices > MAX_SLICES) { + av_log(avctx, AV_LOG_ERROR, "%s: unsupported max slices, %u\n", __func__, ctx->max_slices); + return AVERROR(EINVAL); + } + } + + ret = ff_v4l2_request_query_control(avctx, &scaling_matrix); + if (ret) { + ctx->supports_scaling_matrix = 0; + } else { + ctx->supports_scaling_matrix = 1; + } + + av_log(avctx, AV_LOG_DEBUG, "%s: decoder is %s and supports slices %d, supports entry_point_offsets: %d supports scaling_matrix: %d max slices: %u\n", + __func__, + ctx->decode_mode == V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED ? "slice based" : "frame based", + ctx->supports_slices, + ctx->supports_entry_point_offsets, + ctx->supports_scaling_matrix, + ctx->max_slices + ); + + control[0].value = ctx->decode_mode; + control[1].value = ctx->start_code; + + return ff_v4l2_request_set_controls(avctx, control, FF_ARRAY_ELEMS(control)); +} + +static int v4l2_request_hevc_init(AVCodecContext *avctx) +{ + const HEVCContext *h = avctx->priv_data; + struct v4l2_ctrl_hevc_sps sps; + int ret; + + struct v4l2_ext_control control[] = { + { + .id = V4L2_CID_STATELESS_HEVC_SPS, + .ptr = &sps, + .size = sizeof(sps), + }, + }; + + fill_sps(&sps, h); + + ret = ff_v4l2_request_init(avctx, V4L2_PIX_FMT_HEVC_SLICE, 4 * 1024 * 1024, control, FF_ARRAY_ELEMS(control)); + if (ret) + return ret; + + return v4l2_request_hevc_set_controls(avctx); +} + +const AVHWAccel ff_hevc_v4l2request_hwaccel = { + .name = "hevc_v4l2request", + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_HEVC, + .pix_fmt = AV_PIX_FMT_DRM_PRIME, + .start_frame = v4l2_request_hevc_start_frame, + .decode_slice = v4l2_request_hevc_decode_slice, + .end_frame = v4l2_request_hevc_end_frame, + .frame_priv_data_size = sizeof(V4L2RequestControlsHEVC), + .init = v4l2_request_hevc_init, + .uninit = ff_v4l2_request_uninit, + .priv_data_size = sizeof(V4L2RequestContextHEVC), + .frame_params = ff_v4l2_request_frame_params, + .caps_internal = HWACCEL_CAP_ASYNC_SAFE, +}; From 44f20a53f2ef6ad0ecfb413ebcc95f92fc17377f Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Thu, 12 Dec 2019 16:13:55 +0100 Subject: [PATCH 09/12] Add V4L2 request API VP9 hwaccel Signed-off-by: Boris Brezillon Signed-off-by: Jernej Skrabec --- configure | 3 + libavcodec/Makefile | 1 + libavcodec/hwaccels.h | 1 + libavcodec/v4l2_request_vp9.c | 282 ++++++++++++++++++++++++++++++++++ libavcodec/vp9.c | 192 ++++++++++++++++------- libavcodec/vp9dec.h | 4 + libavcodec/vp9shared.h | 1 + 7 files changed, 429 insertions(+), 55 deletions(-) create mode 100644 libavcodec/v4l2_request_vp9.c diff --git a/configure b/configure index 6192a6c144..36a1271a6c 100755 --- a/configure +++ b/configure @@ -3042,6 +3042,8 @@ vp9_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_VP9" vp9_dxva2_hwaccel_select="vp9_decoder" vp9_nvdec_hwaccel_deps="nvdec" vp9_nvdec_hwaccel_select="vp9_decoder" +vp9_v4l2request_hwaccel_deps="v4l2_request" +vp9_v4l2request_hwaccel_select="vp9_decoder" vp9_vaapi_hwaccel_deps="vaapi VADecPictureParameterBufferVP9_bit_depth" vp9_vaapi_hwaccel_select="vp9_decoder" vp9_vdpau_hwaccel_deps="vdpau VdpPictureInfoVP9" @@ -6641,6 +6643,7 @@ check_cc h264_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_H264_SLICE;" check_cc hevc_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_HEVC_SLICE;" check_cc mpeg2_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG2_SLICE;" check_cc vp8_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_VP8_FRAME;" +check_cc vp9_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_VP9_FRAME;" check_headers sys/videoio.h test_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 0059074530..38edf1cfe5 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -977,6 +977,7 @@ OBJS-$(CONFIG_VP8_VAAPI_HWACCEL) += vaapi_vp8.o OBJS-$(CONFIG_VP9_D3D11VA_HWACCEL) += dxva2_vp9.o OBJS-$(CONFIG_VP9_DXVA2_HWACCEL) += dxva2_vp9.o OBJS-$(CONFIG_VP9_NVDEC_HWACCEL) += nvdec_vp9.o +OBJS-$(CONFIG_VP9_V4L2REQUEST_HWACCEL) += v4l2_request_vp9.o OBJS-$(CONFIG_VP9_VAAPI_HWACCEL) += vaapi_vp9.o OBJS-$(CONFIG_VP9_VDPAU_HWACCEL) += vdpau_vp9.o OBJS-$(CONFIG_VP8_QSV_HWACCEL) += qsvdec.o diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h index ffb9fa5087..fc5d0b0479 100644 --- a/libavcodec/hwaccels.h +++ b/libavcodec/hwaccels.h @@ -76,6 +76,7 @@ extern const AVHWAccel ff_vp9_d3d11va_hwaccel; extern const AVHWAccel ff_vp9_d3d11va2_hwaccel; extern const AVHWAccel ff_vp9_dxva2_hwaccel; extern const AVHWAccel ff_vp9_nvdec_hwaccel; +extern const AVHWAccel ff_vp9_v4l2request_hwaccel; extern const AVHWAccel ff_vp9_vaapi_hwaccel; extern const AVHWAccel ff_vp9_vdpau_hwaccel; extern const AVHWAccel ff_wmv3_d3d11va_hwaccel; diff --git a/libavcodec/v4l2_request_vp9.c b/libavcodec/v4l2_request_vp9.c new file mode 100644 index 0000000000..ec0300f66d --- /dev/null +++ b/libavcodec/v4l2_request_vp9.c @@ -0,0 +1,282 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hwconfig.h" +#include "v4l2_request.h" +#include "vp9dec.h" + +typedef struct V4L2RequestControlsVP9 { + struct v4l2_ctrl_vp9_frame decode_params; + struct v4l2_ctrl_vp9_compressed_hdr chp; +} V4L2RequestControlsVP9; + +static void v4l2_request_vp9_set_frame_ctx(AVCodecContext *avctx) +{ + VP9Context *s = avctx->priv_data; + const VP9Frame *f = &s->s.frames[CUR_FRAME]; + V4L2RequestControlsVP9 *controls = f->hwaccel_picture_private; + struct v4l2_ctrl_vp9_compressed_hdr *chp = &controls->chp; + + memset(chp, 0, sizeof(&chp)); + + chp->tx_mode = s->s.h.txfmmode; + memcpy(chp->tx8, s->prob_raw.p.tx8p, sizeof(s->prob_raw.p.tx8p)); + memcpy(chp->tx16, s->prob_raw.p.tx16p, sizeof(s->prob_raw.p.tx16p)); + memcpy(chp->tx32, s->prob_raw.p.tx32p, sizeof(s->prob_raw.p.tx32p)); + for (unsigned i = 0; i < 4; i++) { + for (unsigned j = 0; j < 2; j++) { + for (unsigned k = 0; k < 2; k++) { + for (unsigned l = 0; l < 6; l++) { + for (unsigned m = 0; m < 6; m++) { + memcpy(chp->coef[i][j][k][l][m], s->prob_raw.coef[i][j][k][l][m], sizeof(chp->coef[0][0][0][0][0])); + } + } + } + } + } + memcpy(chp->skip, s->prob_raw.p.skip, sizeof(s->prob_raw.p.skip)); + memcpy(chp->inter_mode, s->prob_raw.p.mv_mode, sizeof(s->prob_raw.p.mv_mode)); + memcpy(chp->interp_filter, s->prob_raw.p.filter, sizeof(s->prob_raw.p.filter)); + memcpy(chp->is_inter, s->prob_raw.p.intra, sizeof(s->prob_raw.p.intra)); + memcpy(chp->comp_mode, s->prob_raw.p.comp, sizeof(s->prob_raw.p.comp)); + memcpy(chp->single_ref, s->prob_raw.p.single_ref, sizeof(s->prob_raw.p.single_ref)); + memcpy(chp->comp_ref, s->prob_raw.p.comp_ref, sizeof(s->prob_raw.p.comp_ref)); + memcpy(chp->y_mode, s->prob_raw.p.y_mode, sizeof(s->prob_raw.p.y_mode)); + for (unsigned i = 0; i < 10; i++) + memcpy(chp->uv_mode[i], s->prob.p.uv_mode[i], sizeof(s->prob.p.uv_mode[0])); + for (unsigned i = 0; i < 4; i++) + memcpy(chp->partition[i * 4], s->prob_raw.p.partition[i], sizeof(s->prob_raw.p.partition[0])); + memcpy(chp->mv.joint, s->prob_raw.p.mv_joint, sizeof(s->prob_raw.p.mv_joint)); + for (unsigned i = 0; i < 2; i++) { + chp->mv.sign[i] = s->prob_raw.p.mv_comp[i].sign; + memcpy(chp->mv.classes[i], s->prob_raw.p.mv_comp[i].classes, sizeof(s->prob_raw.p.mv_comp[0].classes)); + chp->mv.class0_bit[i] = s->prob_raw.p.mv_comp[i].class0; + memcpy(chp->mv.bits[i], s->prob_raw.p.mv_comp[i].bits, sizeof(s->prob_raw.p.mv_comp[0].bits)); + memcpy(chp->mv.class0_fr[i], s->prob_raw.p.mv_comp[i].class0_fp, sizeof(s->prob_raw.p.mv_comp[0].class0_fp)); + memcpy(chp->mv.fr[i], s->prob_raw.p.mv_comp[i].fp, sizeof(s->prob_raw.p.mv_comp[0].fp)); + chp->mv.class0_hp[i] = s->prob_raw.p.mv_comp[i].class0_hp; + chp->mv.hp[i] = s->prob_raw.p.mv_comp[i].hp; + } +} + +static void fill_frame(struct v4l2_ctrl_vp9_frame *dec_params, AVCodecContext *avctx) +{ + const VP9Context *s = avctx->priv_data; + const ThreadFrame *ref; + + memset(dec_params, 0, sizeof(*dec_params)); + + if (s->s.h.keyframe) + dec_params->flags |= V4L2_VP9_FRAME_FLAG_KEY_FRAME; + if (!s->s.h.invisible) + dec_params->flags |= V4L2_VP9_FRAME_FLAG_SHOW_FRAME; + if (s->s.h.errorres) + dec_params->flags |= V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT; + if (s->s.h.intraonly) + dec_params->flags |= V4L2_VP9_FRAME_FLAG_INTRA_ONLY; + if (!s->s.h.keyframe && s->s.h.highprecisionmvs) + dec_params->flags |= V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV; + if (s->s.h.refreshctx) + dec_params->flags |= V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX; + if (s->s.h.parallelmode) + dec_params->flags |= V4L2_VP9_FRAME_FLAG_PARALLEL_DEC_MODE; + if (s->ss_h) + dec_params->flags |= V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING; + if (s->ss_v) + dec_params->flags |= V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING; + if (avctx->color_range == AVCOL_RANGE_JPEG) + dec_params->flags |= V4L2_VP9_FRAME_FLAG_COLOR_RANGE_FULL_SWING; + + dec_params->compressed_header_size = s->s.h.compressed_header_size; + dec_params->uncompressed_header_size = s->s.h.uncompressed_header_size; + dec_params->profile = s->s.h.profile; + dec_params->reset_frame_context = s->s.h.resetctx > 0 ? s->s.h.resetctx - 1 : 0; + dec_params->frame_context_idx = s->s.h.framectxid; + dec_params->bit_depth = s->s.h.bpp; + + dec_params->interpolation_filter = s->s.h.filtermode ^ (s->s.h.filtermode <= 1); + dec_params->tile_cols_log2 = s->s.h.tiling.log2_tile_cols; + dec_params->tile_rows_log2 = s->s.h.tiling.log2_tile_rows; + dec_params->reference_mode = s->s.h.comppredmode; + dec_params->frame_width_minus_1 = s->w - 1; + dec_params->frame_height_minus_1 = s->h - 1; + //dec_params->render_width_minus_1 = avctx->width - 1; + //dec_params->render_height_minus_1 = avctx->height - 1; + + ref = &s->s.refs[s->s.h.refidx[0]]; + if (ref->f && ref->f->buf[0]) + dec_params->last_frame_ts = ff_v4l2_request_get_capture_timestamp(ref->f); + ref = &s->s.refs[s->s.h.refidx[1]]; + if (ref->f && ref->f->buf[0]) + dec_params->golden_frame_ts = ff_v4l2_request_get_capture_timestamp(ref->f); + ref = &s->s.refs[s->s.h.refidx[2]]; + if (ref->f && ref->f->buf[0]) + dec_params->alt_frame_ts = ff_v4l2_request_get_capture_timestamp(ref->f); + + if (s->s.h.signbias[0]) + dec_params->ref_frame_sign_bias |= V4L2_VP9_SIGN_BIAS_LAST; + if (s->s.h.signbias[1]) + dec_params->ref_frame_sign_bias |= V4L2_VP9_SIGN_BIAS_GOLDEN; + if (s->s.h.signbias[2]) + dec_params->ref_frame_sign_bias |= V4L2_VP9_SIGN_BIAS_ALT; + + if (s->s.h.lf_delta.enabled) + dec_params->lf.flags |= V4L2_VP9_LOOP_FILTER_FLAG_DELTA_ENABLED; + if (s->s.h.lf_delta.updated) + dec_params->lf.flags |= V4L2_VP9_LOOP_FILTER_FLAG_DELTA_UPDATE; + + dec_params->lf.level = s->s.h.filter.level; + dec_params->lf.sharpness = s->s.h.filter.sharpness; + for (unsigned i = 0; i < 4; i++) + dec_params->lf.ref_deltas[i] = s->s.h.lf_delta.ref[i]; + for (unsigned i = 0; i < 2; i++) + dec_params->lf.mode_deltas[i] = s->s.h.lf_delta.mode[i]; + + dec_params->quant.base_q_idx = s->s.h.yac_qi; + dec_params->quant.delta_q_y_dc = s->s.h.ydc_qdelta; + dec_params->quant.delta_q_uv_dc = s->s.h.uvdc_qdelta; + dec_params->quant.delta_q_uv_ac = s->s.h.uvac_qdelta; + + if (s->s.h.segmentation.enabled) + dec_params->seg.flags |= V4L2_VP9_SEGMENTATION_FLAG_ENABLED; + if (s->s.h.segmentation.update_map) + dec_params->seg.flags |= V4L2_VP9_SEGMENTATION_FLAG_UPDATE_MAP; + if (s->s.h.segmentation.temporal) + dec_params->seg.flags |= V4L2_VP9_SEGMENTATION_FLAG_TEMPORAL_UPDATE; + if (s->s.h.segmentation.update_data) + dec_params->seg.flags |= V4L2_VP9_SEGMENTATION_FLAG_UPDATE_DATA; + if (s->s.h.segmentation.absolute_vals) + dec_params->seg.flags |= V4L2_VP9_SEGMENTATION_FLAG_ABS_OR_DELTA_UPDATE; + + for (unsigned i = 0; i < 7; i++) + dec_params->seg.tree_probs[i] = s->s.h.segmentation.prob[i]; + + if (s->s.h.segmentation.temporal) { + for (unsigned i = 0; i < 3; i++) + dec_params->seg.pred_probs[i] = s->s.h.segmentation.pred_prob[i]; + } else { + memset(dec_params->seg.pred_probs, 255, sizeof(dec_params->seg.pred_probs)); + } + + for (unsigned i = 0; i < 8; i++) { + if (s->s.h.segmentation.feat[i].q_enabled) { + dec_params->seg.feature_enabled[i] |= 1 << V4L2_VP9_SEG_LVL_ALT_Q; + dec_params->seg.feature_data[i][V4L2_VP9_SEG_LVL_ALT_Q] = s->s.h.segmentation.feat[i].q_val; + } + + if (s->s.h.segmentation.feat[i].lf_enabled) { + dec_params->seg.feature_enabled[i] |= 1 << V4L2_VP9_SEG_LVL_ALT_L; + dec_params->seg.feature_data[i][V4L2_VP9_SEG_LVL_ALT_L] = s->s.h.segmentation.feat[i].lf_val; + } + + if (s->s.h.segmentation.feat[i].ref_enabled) { + dec_params->seg.feature_enabled[i] |= 1 << V4L2_VP9_SEG_LVL_REF_FRAME; + dec_params->seg.feature_data[i][V4L2_VP9_SEG_LVL_REF_FRAME] = s->s.h.segmentation.feat[i].ref_val; + } + + if (s->s.h.segmentation.feat[i].skip_enabled) + dec_params->seg.feature_enabled[i] |= 1 << V4L2_VP9_SEG_LVL_SKIP; + } +} + +static int v4l2_request_vp9_start_frame(AVCodecContext *avctx, + av_unused const uint8_t *buffer, + av_unused uint32_t size) +{ + const VP9Context *s = avctx->priv_data; + const VP9Frame *f = &s->s.frames[CUR_FRAME]; + V4L2RequestControlsVP9 *controls = f->hwaccel_picture_private; + + v4l2_request_vp9_set_frame_ctx(avctx); + + fill_frame(&controls->decode_params, avctx); + + return ff_v4l2_request_reset_frame(avctx, f->tf.f); +} + +static int v4l2_request_vp9_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) +{ + const VP9Context *s = avctx->priv_data; + const VP9Frame *f = &s->s.frames[CUR_FRAME]; + + return ff_v4l2_request_append_output_buffer(avctx, f->tf.f, buffer, size); +} + +static int v4l2_request_vp9_end_frame(AVCodecContext *avctx) +{ + const VP9Context *s = avctx->priv_data; + const VP9Frame *f = &s->s.frames[CUR_FRAME]; + V4L2RequestControlsVP9 *controls = f->hwaccel_picture_private; + int ret; + + struct v4l2_ext_control control[] = { + { + .id = V4L2_CID_STATELESS_VP9_FRAME, + .ptr = &controls->decode_params, + .size = sizeof(controls->decode_params), + }, + { + .id = V4L2_CID_STATELESS_VP9_COMPRESSED_HDR, + .ptr = &controls->chp, + .size = sizeof(controls->chp), + }, + }; + + ret = ff_v4l2_request_decode_frame(avctx, f->tf.f, control, FF_ARRAY_ELEMS(control)); + if (ret) + return ret; + + if (!s->s.h.refreshctx) + return 0; + + return 0; +} + +static int v4l2_request_vp9_init(AVCodecContext *avctx) +{ + struct v4l2_ctrl_vp9_frame frame; + + struct v4l2_ext_control control[] = { + { + .id = V4L2_CID_STATELESS_VP9_FRAME, + .ptr = &frame, + .size = sizeof(frame), + }, + }; + + fill_frame(&frame, avctx); + + // TODO: check V4L2_CID_MPEG_VIDEO_VP9_PROFILE + return ff_v4l2_request_init(avctx, V4L2_PIX_FMT_VP9_FRAME, 3 * 1024 * 1024, control, FF_ARRAY_ELEMS(control)); +} + +const AVHWAccel ff_vp9_v4l2request_hwaccel = { + .name = "vp9_v4l2request", + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_VP9, + .pix_fmt = AV_PIX_FMT_DRM_PRIME, + .start_frame = v4l2_request_vp9_start_frame, + .decode_slice = v4l2_request_vp9_decode_slice, + .end_frame = v4l2_request_vp9_end_frame, + .frame_priv_data_size = sizeof(V4L2RequestControlsVP9), + .init = v4l2_request_vp9_init, + .uninit = ff_v4l2_request_uninit, + .priv_data_size = sizeof(V4L2RequestContext), + .frame_params = ff_v4l2_request_frame_params, + .caps_internal = HWACCEL_CAP_ASYNC_SAFE, +}; diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c index 4659f94ee8..1b2f1eeaf6 100644 --- a/libavcodec/vp9.c +++ b/libavcodec/vp9.c @@ -191,6 +191,7 @@ static int update_size(AVCodecContext *avctx, int w, int h) #define HWACCEL_MAX (CONFIG_VP9_DXVA2_HWACCEL + \ CONFIG_VP9_D3D11VA_HWACCEL * 2 + \ CONFIG_VP9_NVDEC_HWACCEL + \ + CONFIG_VP9_V4L2REQUEST_HWACCEL + \ CONFIG_VP9_VAAPI_HWACCEL + \ CONFIG_VP9_VDPAU_HWACCEL) enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmtp = pix_fmts; @@ -223,6 +224,9 @@ static int update_size(AVCodecContext *avctx, int w, int h) #endif #if CONFIG_VP9_VDPAU_HWACCEL *fmtp++ = AV_PIX_FMT_VDPAU; +#endif +#if CONFIG_VP9_V4L2REQUEST_HWACCEL + *fmtp++ = AV_PIX_FMT_DRM_PRIME; #endif break; case AV_PIX_FMT_YUV420P12: @@ -234,6 +238,9 @@ static int update_size(AVCodecContext *avctx, int w, int h) #endif #if CONFIG_VP9_VDPAU_HWACCEL *fmtp++ = AV_PIX_FMT_VDPAU; +#endif +#if CONFIG_VP9_V4L2REQUEST_HWACCEL + *fmtp++ = AV_PIX_FMT_DRM_PRIME; #endif break; } @@ -382,7 +389,7 @@ static av_always_inline int inv_recenter_nonneg(int v, int m) } // differential forward probability updates -static int update_prob(VP56RangeCoder *c, int p) +static int read_prob_delta(VP56RangeCoder *c) { static const uint8_t inv_map_table[255] = { 7, 20, 33, 46, 59, 72, 85, 98, 111, 124, 137, 150, 163, 176, @@ -436,8 +443,13 @@ static int update_prob(VP56RangeCoder *c, int p) av_assert2(d < FF_ARRAY_ELEMS(inv_map_table)); } - return p <= 128 ? 1 + inv_recenter_nonneg(inv_map_table[d], p - 1) : - 255 - inv_recenter_nonneg(inv_map_table[d], 255 - p); + return inv_map_table[d]; +} + +static int update_prob(int p, int d) +{ + return p <= 128 ? 1 + inv_recenter_nonneg(d, p - 1) : + 255 - inv_recenter_nonneg(d, 255 - p); } static int read_colorspace_details(AVCodecContext *avctx) @@ -703,7 +715,8 @@ static int decode_frame_header(AVCodecContext *avctx, get_bits(&s->gb, 8) : 255; } - if (get_bits1(&s->gb)) { + s->s.h.segmentation.update_data = get_bits1(&s->gb); + if (s->s.h.segmentation.update_data) { s->s.h.segmentation.absolute_vals = get_bits1(&s->gb); for (i = 0; i < 8; i++) { if ((s->s.h.segmentation.feat[i].q_enabled = get_bits1(&s->gb))) @@ -904,6 +917,8 @@ static int decode_frame_header(AVCodecContext *avctx, * as explicit copies if the fw update is missing (and skip the copy upon * fw update)? */ s->prob.p = s->prob_ctx[c].p; + memset(&s->prob_raw.p, 0, sizeof(s->prob_raw.p)); + memset(&s->prob_raw.coef, 0, sizeof(s->prob_raw.coef)); // txfm updates if (s->s.h.lossless) { @@ -915,18 +930,25 @@ static int decode_frame_header(AVCodecContext *avctx, if (s->s.h.txfmmode == TX_SWITCHABLE) { for (i = 0; i < 2; i++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) - s->prob.p.tx8p[i] = update_prob(&s->c, s->prob.p.tx8p[i]); + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.tx8p[i] = read_prob_delta(&s->c); + s->prob.p.tx8p[i] = update_prob(s->prob.p.tx8p[i], + s->prob_raw.p.tx8p[i]); + } for (i = 0; i < 2; i++) for (j = 0; j < 2; j++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) - s->prob.p.tx16p[i][j] = - update_prob(&s->c, s->prob.p.tx16p[i][j]); + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.tx16p[i][j] = read_prob_delta(&s->c); + s->prob.p.tx16p[i][j] = update_prob(s->prob.p.tx16p[i][j], + s->prob_raw.p.tx16p[i][j]); + } for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) - s->prob.p.tx32p[i][j] = - update_prob(&s->c, s->prob.p.tx32p[i][j]); + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.tx32p[i][j] = read_prob_delta(&s->c); + s->prob.p.tx32p[i][j] = update_prob(s->prob.p.tx32p[i][j], + s->prob_raw.p.tx32p[i][j]); + } } } @@ -938,15 +960,18 @@ static int decode_frame_header(AVCodecContext *avctx, for (k = 0; k < 2; k++) for (l = 0; l < 6; l++) for (m = 0; m < 6; m++) { + uint8_t *pd = s->prob_raw.coef[i][j][k][l][m]; uint8_t *p = s->prob.coef[i][j][k][l][m]; uint8_t *r = ref[j][k][l][m]; if (m >= 3 && l == 0) // dc only has 3 pt break; for (n = 0; n < 3; n++) { - if (vp56_rac_get_prob_branchy(&s->c, 252)) - p[n] = update_prob(&s->c, r[n]); - else + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + pd[n] = read_prob_delta(&s->c); + p[n] = update_prob(r[n], pd[n]); + } else { p[n] = r[n]; + } } memcpy(&p[3], ff_vp9_model_pareto8[p[2]], 8); } @@ -961,7 +986,7 @@ static int decode_frame_header(AVCodecContext *avctx, break; memcpy(p, r, 3); memcpy(&p[3], ff_vp9_model_pareto8[p[2]], 8); - } + } } if (s->s.h.txfmmode == i) break; @@ -969,25 +994,37 @@ static int decode_frame_header(AVCodecContext *avctx, // mode updates for (i = 0; i < 3; i++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) - s->prob.p.skip[i] = update_prob(&s->c, s->prob.p.skip[i]); + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.skip[i] = read_prob_delta(&s->c); + s->prob.p.skip[i] = update_prob(s->prob.p.skip[i], + s->prob_raw.p.skip[i]); + } if (!s->s.h.keyframe && !s->s.h.intraonly) { for (i = 0; i < 7; i++) for (j = 0; j < 3; j++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.mv_mode[i][j] = read_prob_delta(&s->c); s->prob.p.mv_mode[i][j] = - update_prob(&s->c, s->prob.p.mv_mode[i][j]); + update_prob(s->prob.p.mv_mode[i][j], + s->prob_raw.p.mv_mode[i][j]); + } if (s->s.h.filtermode == FILTER_SWITCHABLE) for (i = 0; i < 4; i++) for (j = 0; j < 2; j++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.filter[i][j] = read_prob_delta(&s->c); s->prob.p.filter[i][j] = - update_prob(&s->c, s->prob.p.filter[i][j]); + update_prob(s->prob.p.filter[i][j], + s->prob_raw.p.filter[i][j]); + } for (i = 0; i < 4; i++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) - s->prob.p.intra[i] = update_prob(&s->c, s->prob.p.intra[i]); + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.intra[i] = read_prob_delta(&s->c); + s->prob.p.intra[i] = update_prob(s->prob.p.intra[i], + s->prob_raw.p.intra[i]); + } if (s->s.h.allowcompinter) { s->s.h.comppredmode = vp8_rac_get(&s->c); @@ -995,92 +1032,134 @@ static int decode_frame_header(AVCodecContext *avctx, s->s.h.comppredmode += vp8_rac_get(&s->c); if (s->s.h.comppredmode == PRED_SWITCHABLE) for (i = 0; i < 5; i++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.comp[i] = read_prob_delta(&s->c); s->prob.p.comp[i] = - update_prob(&s->c, s->prob.p.comp[i]); + update_prob(s->prob.p.comp[i], s->prob_raw.p.comp[i]); + } } else { s->s.h.comppredmode = PRED_SINGLEREF; } if (s->s.h.comppredmode != PRED_COMPREF) { for (i = 0; i < 5; i++) { - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.single_ref[i][0] = read_prob_delta(&s->c); s->prob.p.single_ref[i][0] = - update_prob(&s->c, s->prob.p.single_ref[i][0]); - if (vp56_rac_get_prob_branchy(&s->c, 252)) + update_prob(s->prob.p.single_ref[i][0], + s->prob_raw.p.single_ref[i][0]); + } + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.single_ref[i][1] = read_prob_delta(&s->c); s->prob.p.single_ref[i][1] = - update_prob(&s->c, s->prob.p.single_ref[i][1]); + update_prob(s->prob.p.single_ref[i][1], + s->prob_raw.p.single_ref[i][1]); + } } } if (s->s.h.comppredmode != PRED_SINGLEREF) { for (i = 0; i < 5; i++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.comp_ref[i] = read_prob_delta(&s->c); s->prob.p.comp_ref[i] = - update_prob(&s->c, s->prob.p.comp_ref[i]); + update_prob(s->prob.p.comp_ref[i], + s->prob_raw.p.comp_ref[i]); + } } for (i = 0; i < 4; i++) for (j = 0; j < 9; j++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.y_mode[i][j] = read_prob_delta(&s->c); s->prob.p.y_mode[i][j] = - update_prob(&s->c, s->prob.p.y_mode[i][j]); + update_prob(s->prob.p.y_mode[i][j], + s->prob_raw.p.y_mode[i][j]); + } for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) for (k = 0; k < 3; k++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.partition[i][j][k] = read_prob_delta(&s->c); s->prob.p.partition[3 - i][j][k] = - update_prob(&s->c, - s->prob.p.partition[3 - i][j][k]); + update_prob(s->prob.p.partition[3 - i][j][k], + s->prob_raw.p.partition[i][j][k]); + } // mv fields don't use the update_prob subexp model for some reason for (i = 0; i < 3; i++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) - s->prob.p.mv_joint[i] = (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.mv_joint[i] = (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + s->prob.p.mv_joint[i] = s->prob_raw.p.mv_joint[i]; + } for (i = 0; i < 2; i++) { - if (vp56_rac_get_prob_branchy(&s->c, 252)) - s->prob.p.mv_comp[i].sign = + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.mv_comp[i].sign = (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + s->prob.p.mv_comp[i].sign = + s->prob_raw.p.mv_comp[i].sign; + } for (j = 0; j < 10; j++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) - s->prob.p.mv_comp[i].classes[j] = + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.mv_comp[i].classes[j] = (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + s->prob.p.mv_comp[i].classes[j] = + s->prob_raw.p.mv_comp[i].classes[j]; + } - if (vp56_rac_get_prob_branchy(&s->c, 252)) - s->prob.p.mv_comp[i].class0 = + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.mv_comp[i].class0 = (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + s->prob.p.mv_comp[i].class0 = + s->prob_raw.p.mv_comp[i].class0; + } for (j = 0; j < 10; j++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) - s->prob.p.mv_comp[i].bits[j] = + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.mv_comp[i].bits[j] = (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + s->prob.p.mv_comp[i].bits[j] = + s->prob_raw.p.mv_comp[i].bits[j]; + } } for (i = 0; i < 2; i++) { for (j = 0; j < 2; j++) for (k = 0; k < 3; k++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) - s->prob.p.mv_comp[i].class0_fp[j][k] = + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.mv_comp[i].class0_fp[j][k] = (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + s->prob.p.mv_comp[i].class0_fp[j][k] = + s->prob_raw.p.mv_comp[i].class0_fp[j][k]; + } for (j = 0; j < 3; j++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) - s->prob.p.mv_comp[i].fp[j] = + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.mv_comp[i].fp[j] = (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + s->prob.p.mv_comp[i].fp[j] = + s->prob_raw.p.mv_comp[i].fp[j]; + } } if (s->s.h.highprecisionmvs) { for (i = 0; i < 2; i++) { - if (vp56_rac_get_prob_branchy(&s->c, 252)) - s->prob.p.mv_comp[i].class0_hp = + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.mv_comp[i].class0_hp = (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + s->prob.p.mv_comp[i].class0_hp = + s->prob_raw.p.mv_comp[i].class0_hp; + } - if (vp56_rac_get_prob_branchy(&s->c, 252)) - s->prob.p.mv_comp[i].hp = + if (vp56_rac_get_prob_branchy(&s->c, 252)) { + s->prob_raw.p.mv_comp[i].hp = (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + s->prob.p.mv_comp[i].hp = + s->prob_raw.p.mv_comp[i].hp; + } } } } @@ -1912,6 +1991,9 @@ AVCodec ff_vp9_decoder = { #endif #if CONFIG_VP9_VDPAU_HWACCEL HWACCEL_VDPAU(vp9), +#endif +#if CONFIG_VP9_V4L2REQUEST_HWACCEL + HWACCEL_V4L2REQUEST(vp9), #endif NULL }, diff --git a/libavcodec/vp9dec.h b/libavcodec/vp9dec.h index d82b258a3d..8d2c341e0b 100644 --- a/libavcodec/vp9dec.h +++ b/libavcodec/vp9dec.h @@ -131,6 +131,10 @@ typedef struct VP9Context { ProbContext p; uint8_t coef[4][2][2][6][6][11]; } prob; + struct { + ProbContext p; + uint8_t coef[4][2][2][6][6][11]; + } prob_raw; // contextual (above) cache uint8_t *above_partition_ctx; diff --git a/libavcodec/vp9shared.h b/libavcodec/vp9shared.h index 54726df742..fee3568736 100644 --- a/libavcodec/vp9shared.h +++ b/libavcodec/vp9shared.h @@ -131,6 +131,7 @@ typedef struct VP9BitstreamHeader { uint8_t temporal; uint8_t absolute_vals; uint8_t update_map; + uint8_t update_data; uint8_t prob[7]; uint8_t pred_prob[3]; struct { From 0a7d6808383a5c88a690b7ba6c634970dcd33548 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Mon, 29 Apr 2019 22:08:59 +0000 Subject: [PATCH 10/12] HACK: hwcontext_drm: do not require drm device Signed-off-by: Jonas Karlman --- libavutil/hwcontext_drm.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libavutil/hwcontext_drm.c b/libavutil/hwcontext_drm.c index 7a9fdbd263..6297d1f9b6 100644 --- a/libavutil/hwcontext_drm.c +++ b/libavutil/hwcontext_drm.c @@ -53,6 +53,11 @@ static int drm_device_create(AVHWDeviceContext *hwdev, const char *device, AVDRMDeviceContext *hwctx = hwdev->hwctx; drmVersionPtr version; + if (device == NULL) { + hwctx->fd = -1; + return 0; + } + hwctx->fd = open(device, O_RDWR); if (hwctx->fd < 0) return AVERROR(errno); From d82c704c262fea62250c5989d8e97cdd769d8359 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Fri, 15 May 2020 16:54:05 +0000 Subject: [PATCH 11/12] WIP: add NV15 and NV20 support Signed-off-by: Jonas Karlman --- libavcodec/h264_slice.c | 14 ++++++++++++-- libavcodec/v4l2_request.c | 23 +++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index 6b7f569da4..ee4c76cf41 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -794,10 +794,17 @@ static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback) *fmt++ = AV_PIX_FMT_GBRP10; } else *fmt++ = AV_PIX_FMT_YUV444P10; - } else if (CHROMA422(h)) + } else if (CHROMA422(h)) { +#if CONFIG_H264_V4L2REQUEST_HWACCEL + *fmt++ = AV_PIX_FMT_DRM_PRIME; +#endif *fmt++ = AV_PIX_FMT_YUV422P10; - else + } else { +#if CONFIG_H264_V4L2REQUEST_HWACCEL + *fmt++ = AV_PIX_FMT_DRM_PRIME; +#endif *fmt++ = AV_PIX_FMT_YUV420P10; + } break; case 12: if (CHROMA444(h)) { @@ -836,6 +843,9 @@ static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback) else *fmt++ = AV_PIX_FMT_YUV444P; } else if (CHROMA422(h)) { +#if CONFIG_H264_V4L2REQUEST_HWACCEL + *fmt++ = AV_PIX_FMT_DRM_PRIME; +#endif if (h->avctx->color_range == AVCOL_RANGE_JPEG) *fmt++ = AV_PIX_FMT_YUVJ422P; else diff --git a/libavcodec/v4l2_request.c b/libavcodec/v4l2_request.c index b57bbf29bc..349ed67cb2 100644 --- a/libavcodec/v4l2_request.c +++ b/libavcodec/v4l2_request.c @@ -188,6 +188,13 @@ const uint32_t v4l2_request_capture_pixelformats[] = { #ifdef DRM_FORMAT_MOD_ALLWINNER_TILED V4L2_PIX_FMT_SUNXI_TILED_NV12, #endif +#if defined(V4L2_PIX_FMT_NV15) && defined(DRM_FORMAT_NV15) + V4L2_PIX_FMT_NV15, +#endif + V4L2_PIX_FMT_NV16, +#if defined(V4L2_PIX_FMT_NV20) && defined(DRM_FORMAT_NV20) + V4L2_PIX_FMT_NV20, +#endif }; static int v4l2_request_set_drm_descriptor(V4L2RequestDescriptor *req, struct v4l2_format *format) @@ -206,6 +213,22 @@ static int v4l2_request_set_drm_descriptor(V4L2RequestDescriptor *req, struct v4 layer->format = DRM_FORMAT_NV12; desc->objects[0].format_modifier = DRM_FORMAT_MOD_ALLWINNER_TILED; break; +#endif +#if defined(V4L2_PIX_FMT_NV15) && defined(DRM_FORMAT_NV15) + case V4L2_PIX_FMT_NV15: + layer->format = DRM_FORMAT_NV15; + desc->objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; + break; +#endif + case V4L2_PIX_FMT_NV16: + layer->format = DRM_FORMAT_NV16; + desc->objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; + break; +#if defined(V4L2_PIX_FMT_NV20) && defined(DRM_FORMAT_NV20) + case V4L2_PIX_FMT_NV20: + layer->format = DRM_FORMAT_NV20; + desc->objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; + break; #endif default: return -1; From 0b8eff40d910669ea03417f76468fcf2518d293e Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Mon, 27 Jul 2020 23:15:45 +0000 Subject: [PATCH 12/12] HACK: define drm NV15 and NV20 format --- libavcodec/v4l2_request.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libavcodec/v4l2_request.c b/libavcodec/v4l2_request.c index 349ed67cb2..824dcaa8e9 100644 --- a/libavcodec/v4l2_request.c +++ b/libavcodec/v4l2_request.c @@ -30,6 +30,14 @@ #include "internal.h" #include "v4l2_request.h" +#ifndef DRM_FORMAT_NV15 +#define DRM_FORMAT_NV15 fourcc_code('N', 'V', '1', '5') +#endif + +#ifndef DRM_FORMAT_NV20 +#define DRM_FORMAT_NV20 fourcc_code('N', 'V', '2', '0') +#endif + uint64_t ff_v4l2_request_get_capture_timestamp(AVFrame *frame) { V4L2RequestDescriptor *req = (V4L2RequestDescriptor*)frame->data[0]; ================================================ FILE: packages/multimedia/gmmlib/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="gmmlib" PKG_VERSION="22.3.3" PKG_SHA256="86651bd2803c9f0afd82471bec784e65d2b418dee315a053d22215eb2a679be7" PKG_ARCH="x86_64" PKG_LICENSE="MIT" PKG_SITE="https://01.org/linuxmedia" PKG_URL="https://github.com/intel/gmmlib/archive/intel-gmmlib-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="gmmlib: The Intel(R) Graphics Memory Management Library provides device specific and buffer management for the Intel(R) Graphics Compute Runtime for OpenCL(TM) and the Intel(R) Media Driver for VAAPI." PKG_CMAKE_OPTS_TARGET="-DBUILD_TYPE=release \ -DRUN_TEST_SUITE=OFF" ================================================ FILE: packages/multimedia/gstreamer/gst-plugins-bad/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="gst-plugins-bad" PKG_VERSION="1.22.0" PKG_SHA256="3c9d9300f5f4fb3e3d36009379d1fb6d9ecd79c1a135df742b8a68417dd663a1" PKG_LICENSE="LGPL-2.1-or-later" PKG_SITE="https://gstreamer.freedesktop.org/modules/gst-plugins-bad.html" PKG_URL="https://gstreamer.freedesktop.org/src/gst-plugins-bad/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain gst-plugins-base" PKG_LONGDESC="GStreamer Bad Plug-ins is a set of plug-ins that aren't up to par compared to the rest." pre_configure_target() { PKG_MESON_OPTS_TARGET="-Dgst_play_tests=false \ -Daccurip=disabled \ -Dadpcmdec=disabled \ -Dadpcmenc=disabled \ -Daiff=disabled \ -Dasfmux=disabled \ -Daudiobuffersplit=disabled \ -Daudiofxbad=disabled \ -Daudiolatency=disabled \ -Daudiomixmatrix=disabled \ -Daudiovisualizers=disabled \ -Dautoconvert=disabled \ -Dbayer=disabled \ -Dcamerabin2=disabled \ -Dcoloreffects=disabled \ -Ddebugutils=disabled \ -Ddvbsubenc=disabled \ -Ddvbsuboverlay=disabled \ -Ddvdspu=disabled \ -Dfaceoverlay=disabled \ -Dfestival=disabled \ -Dfieldanalysis=disabled \ -Dfreeverb=disabled \ -Dfrei0r=disabled \ -Dgaudieffects=disabled \ -Dgdp=disabled \ -Dgeometrictransform=disabled \ -Did3tag=disabled \ -Dinter=disabled \ -Dinterlace=disabled \ -Divfparse=disabled \ -Divtc=disabled \ -Djp2kdecimator=disabled \ -Djpegformat=disabled \ -Dlibrfb=disabled \ -Dmidi=disabled \ -Dmpegdemux=disabled \ -Dmpegpsmux=disabled \ -Dmpegtsdemux=disabled \ -Dmpegtsmux=disabled \ -Dmxf=disabled \ -Dnetsim=disabled \ -Donvif=disabled \ -Dpcapparse=disabled \ -Dpnm=disabled \ -Dproxy=disabled \ -Drawparse=disabled \ -Dremovesilence=disabled \ -Drist=disabled \ -Drtmp2=disabled \ -Drtp=disabled \ -Dsdp=disabled \ -Dsegmentclip=disabled \ -Dsiren=disabled \ -Dsmooth=disabled \ -Dspeed=disabled \ -Dsubenc=disabled \ -Dswitchbin=disabled \ -Dtimecode=disabled \ -Dvideofilters=disabled \ -Dvideoframe_audiolevel=disabled \ -Dvideoparsers=enabled \ -Dvideosignal=disabled \ -Dvmnc=disabled \ -Dy4m=disabled \ -Dopencv=disabled \ -Dwayland=disabled \ -Dx11=disabled \ -Daom=disabled \ -Davtp=disabled \ -Dandroidmedia=disabled \ -Dapplemedia=disabled \ -Dassrender=disabled \ -Dbluez=disabled \ -Dbs2b=disabled \ -Dbz2=disabled \ -Dchromaprint=disabled \ -Dclosedcaption=disabled \ -Dcolormanagement=disabled \ -Dcurl=disabled \ -Dcurl-ssh2=disabled \ -Dd3dvideosink=disabled \ -Dd3d11=disabled \ -Ddash=disabled \ -Ddc1394=disabled \ -Ddecklink=disabled \ -Ddirectfb=disabled \ -Ddirectsound=disabled \ -Ddtls=disabled \ -Ddts=disabled \ -Ddvb=disabled \ -Dfaac=disabled \ -Dfaad=disabled \ -Dfbdev=disabled \ -Dfdkaac=disabled \ -Dflite=disabled \ -Dfluidsynth=disabled \ -Dgl=disabled \ -Dgme=disabled \ -Dgsm=disabled \ -Dipcpipeline=disabled \ -Diqa=disabled \ -Dkate=disabled \ -Dkms=disabled \ -Dladspa=disabled \ -Dlibde265=disabled \ -Dlv2=disabled \ -Dmediafoundation=disabled \ -Dmicrodns=disabled \ -Dmodplug=disabled \ -Dmpeg2enc=disabled \ -Dmplex=disabled \ -Dmsdk=disabled \ -Dmusepack=disabled \ -Dneon=disabled \ -Dnvcodec=disabled \ -Dopenal=disabled \ -Dopenexr=disabled \ -Dopenh264=disabled \ -Dopenjpeg=disabled \ -Dopenmpt=disabled \ -Dopenni2=disabled \ -Dopensles=disabled \ -Dopus=disabled \ -Dresindvd=disabled \ -Drsvg=disabled \ -Drtmp=disabled \ -Dsbc=disabled \ -Dsctp=disabled \ -Dshm=disabled \ -Dsmoothstreaming=disabled \ -Dsndfile=disabled \ -Dsoundtouch=disabled \ -Dspandsp=disabled \ -Dsrt=disabled \ -Dsrtp=disabled \ -Dsvthevcenc=disabled \ -Dteletext=disabled \ -Dtinyalsa=disabled \ -Dtranscode=disabled \ -Dttml=disabled \ -Duvch264=disabled \ -Dva=disabled \ -Dvoaacenc=disabled \ -Dvoamrwbenc=disabled \ -Dvulkan=disabled \ -Dwasapi=disabled \ -Dwasapi2=disabled \ -Dwebp=disabled \ -Dwebrtc=disabled \ -Dwebrtcdsp=disabled \ -Dwildmidi=disabled \ -Dwinks=disabled \ -Dwinscreencap=disabled \ -Dx265=disabled \ -Dzbar=disabled \ -Dzxing=disabled \ -Dwpe=disabled \ -Dmagicleap=disabled \ -Dv4l2codecs=disabled \ -Dhls=disabled \ -Dsctp-internal-usrsctp=disabled \ -Dexamples=disabled \ -Dtests=disabled \ -Dintrospection=disabled \ -Dnls=disabled \ -Dorc=disabled \ -Dgobject-cast-checks=disabled \ -Dglib-asserts=disabled \ -Dglib-checks=disabled \ -Dpackage-name=gst-plugins-bad \ -Dpackage-origin=LibreELEC.tv \ -Ddoc=disabled" } post_makeinstall_target() { # clean up safe_remove ${INSTALL}/usr/bin for PKG_GST_PLUGINS_BAD in \ libgstadaptivedemux libgstbadaudio libgstbasecamerabinsrc libgstcodecs \ libgstinsertbin libgstisoff libgstmpegts libgstphotography libgstplayer \ libgstsctp libgsttranscoder libgsturidownloader libgstwebrtc do safe_remove ${INSTALL}/usr/lib/${PKG_GST_PLUGINS_BAD}-1.0* done safe_remove ${INSTALL}/usr/share } ================================================ FILE: packages/multimedia/gstreamer/gst-plugins-base/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="gst-plugins-base" PKG_VERSION="1.22.0" PKG_SHA256="f53672294f3985d56355c8b1df8f6b49c8c8721106563e19f53be3507ff2229d" PKG_LICENSE="GPL-2.1-or-later" PKG_SITE="https://gstreamer.freedesktop.org/modules/gst-plugins-base.html" PKG_URL="https://gstreamer.freedesktop.org/src/gst-plugins-base/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain gstreamer" PKG_LONGDESC="Base GStreamer plugins and helper libraries" PKG_BUILD_FLAGS="-gold" pre_configure_target() { PKG_MESON_OPTS_TARGET="-Dgl=disabled \ -Dadder=disabled \ -Dapp=disabled \ -Daudioconvert=disabled \ -Daudiomixer=disabled \ -Daudiorate=disabled \ -Daudioresample=disabled \ -Daudiotestsrc=disabled \ -Dcompositor=disabled \ -Dencoding=disabled \ -Dgio=disabled \ -Dgio-typefinder=disabled \ -Doverlaycomposition=disabled \ -Dpbtypes=disabled \ -Dplayback=disabled \ -Drawparse=enabled \ -Dsubparse=enabled \ -Dtcp=disabled \ -Dtypefind=disabled \ -Dvideoconvertscale=disabled \ -Dvideorate=disabled \ -Dvideotestsrc=disabled \ -Dvolume=disabled \ -Dalsa=disabled \ -Dcdparanoia=disabled \ -Dlibvisual=disabled \ -Dogg=disabled \ -Dopus=disabled \ -Dpango=disabled \ -Dtheora=disabled \ -Dtremor=disabled \ -Dvorbis=disabled \ -Dx11=disabled \ -Dxshm=disabled \ -Dxi=disabled \ -Dxvideo=disabled \ -Dexamples=disabled \ -Dtests=disabled \ -Dtools=disabled \ -Dintrospection=disabled \ -Dnls=disabled \ -Dorc=disabled \ -Dgobject-cast-checks=disabled \ -Dglib-asserts=disabled \ -Dglib-checks=disabled \ -Dpackage-name=gst-plugins-base \ -Dpackage-origin=LibreELEC.tv \ -Ddoc=disabled" } post_makeinstall_target() { # clean up safe_remove ${INSTALL} } ================================================ FILE: packages/multimedia/gstreamer/gstreamer/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="gstreamer" PKG_VERSION="1.22.0" PKG_SHA256="78d21b5469ac93edafc6d8ceb63bc82f6cbbee94d2f866cca6b9252157ee0a09" PKG_LICENSE="GPL-2.1-or-later" PKG_SITE="https://gstreamer.freedesktop.org" PKG_URL="https://gstreamer.freedesktop.org/src/gstreamer/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain glib glib:host" PKG_LONGDESC="GStreamer open-source multimedia framework core library" pre_configure_target() { PKG_MESON_OPTS_TARGET="-Dgst_debug=false \ -Dgst_parse=true \ -Dregistry=false \ -Dtracer_hooks=false \ -Doption-parsing=true \ -Dpoisoning=false \ -Dcheck=disabled \ -Dlibunwind=disabled \ -Dlibdw=disabled \ -Ddbghelp=disabled \ -Dbash-completion=disabled \ -Dcoretracers=disabled \ -Dexamples=disabled \ -Dtests=disabled \ -Dbenchmarks=disabled \ -Dtools=disabled \ -Ddoc=disabled \ -Dintrospection=disabled \ -Dnls=disabled \ -Dgobject-cast-checks=disabled \ -Dglib-asserts=disabled \ -Dglib-checks=disabled \ -Dextra-checks=disabled \ -Dpackage-name="gstreamer" -Dpackage-origin="LibreELEC.tv" -Ddoc=disabled" } post_makeinstall_target() { # clean up safe_remove ${INSTALL}/usr/share safe_remove ${INSTALL}/usr/lib/{libgstcontroller-1.0*,libgstnet-1.0*} } ================================================ FILE: packages/multimedia/intel-vaapi-driver/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="intel-vaapi-driver" PKG_VERSION="2.4.1" PKG_SHA256="03cd7e16acc94f828b6e7f3087863d8ca06e99ffa3385588005b1984bdd56157" PKG_ARCH="x86_64" PKG_LICENSE="GPL" PKG_SITE="https://01.org/linuxmedia" PKG_URL="https://github.com/intel/intel-vaapi-driver/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libva libdrm" PKG_LONGDESC="intel-vaapi-driver: VA-API user mode driver for Intel GEN Graphics family" if [ "${DISPLAYSERVER}" = "x11" ]; then DISPLAYSERVER_LIBVA="-Dwith_x11=yes -Dwith_wayland=no" elif [ "${DISPLAYSERVER}" = "wl" ]; then DISPLAYSERVER_LIBVA="-Dwith_x11=no -Dwith_wayland=yes" else DISPLAYSERVER_LIBVA="-Dwith_x11=no -Dwith_wayland=no" fi PKG_MESON_OPTS_TARGET="-Denable_hybrid_codec=false \ -Denable_tests=false \ ${DISPLAYSERVER_LIBVA}" ================================================ FILE: packages/multimedia/intel-vaapi-driver/patches/0001-intel-vaapi-driver-2.4.1-Handle-odd-resolution.patch ================================================ From d87db2111a33b157d1913415f15d201cc5182850 Mon Sep 17 00:00:00 2001 From: Haihao Xiang Date: Wed, 12 Aug 2020 14:24:55 +0800 Subject: [PATCH] Handle odd resolution This fixes https://github.com/intel/intel-vaapi-driver/issues/516 Signed-off-by: Haihao Xiang --- src/gen8_post_processing.c | 24 +++++++++---------- src/gen9_post_processing.c | 24 +++++++++---------- src/i965_drv_video.c | 48 +++++++++++++++++++------------------- 3 files changed, 48 insertions(+), 48 deletions(-) diff --git a/src/gen8_post_processing.c b/src/gen8_post_processing.c index abddcd078..2163300ac 100644 --- a/src/gen8_post_processing.c +++ b/src/gen8_post_processing.c @@ -1909,17 +1909,17 @@ gen8_pp_context_get_surface_conf(VADriverContextP ctx, fourcc == VA_FOURCC_BGRA) { /* nothing to do here */ } else if (fourcc == VA_FOURCC_P010 || fourcc == VA_FOURCC_NV12) { - width[1] = width[0] / 2; - height[1] = height[0] / 2; + width[1] = ALIGN(width[0], 2) / 2; + height[1] = ALIGN(height[0], 2) / 2; pitch[1] = obj_surface->cb_cr_pitch; bo_offset[1] = obj_surface->width * obj_surface->y_cb_offset; } else { - width[1] = width[0] / 2; - height[1] = height[0] / 2; + width[1] = ALIGN(width[0], 2) / 2; + height[1] = ALIGN(height[0], 2) / 2; pitch[1] = obj_surface->cb_cr_pitch; bo_offset[1] = obj_surface->width * obj_surface->y_cb_offset; - width[2] = width[0] / 2; - height[2] = height[0] / 2; + width[2] = ALIGN(width[0], 2) / 2; + height[2] = ALIGN(height[0], 2) / 2; pitch[2] = obj_surface->cb_cr_pitch; bo_offset[2] = obj_surface->width * obj_surface->y_cr_offset; } @@ -1940,8 +1940,8 @@ gen8_pp_context_get_surface_conf(VADriverContextP ctx, fourcc == VA_FOURCC_BGRA) { /* nothing to do here */ } else if (fourcc == VA_FOURCC_P010 || fourcc == VA_FOURCC_NV12) { - width[1] = width[0] / 2; - height[1] = height[0] / 2; + width[1] = ALIGN(width[0], 2) / 2; + height[1] = ALIGN(height[0], 2) / 2; pitch[1] = obj_image->image.pitches[1]; bo_offset[1] = obj_image->image.offsets[1]; } else { @@ -1950,12 +1950,12 @@ gen8_pp_context_get_surface_conf(VADriverContextP ctx, if (fourcc == VA_FOURCC_YV12 || fourcc == VA_FOURCC_IMC1) u = 2, v = 1; - width[1] = width[0] / 2; - height[1] = height[0] / 2; + width[1] = ALIGN(width[0], 2) / 2; + height[1] = ALIGN(height[0], 2) / 2; pitch[1] = obj_image->image.pitches[u]; bo_offset[1] = obj_image->image.offsets[u]; - width[2] = width[0] / 2; - height[2] = height[0] / 2; + width[2] = ALIGN(width[0], 2) / 2; + height[2] = ALIGN(height[0], 2) / 2; pitch[2] = obj_image->image.pitches[v]; bo_offset[2] = obj_image->image.offsets[v]; } diff --git a/src/gen9_post_processing.c b/src/gen9_post_processing.c index eede36f7f..da36f2abc 100644 --- a/src/gen9_post_processing.c +++ b/src/gen9_post_processing.c @@ -731,19 +731,19 @@ gen9_pp_context_get_surface_conf(VADriverContextP ctx, fourcc == VA_FOURCC_BGRA) { /* nothing to do here */ } else if (fourcc == VA_FOURCC_P010 || fourcc == VA_FOURCC_NV12) { - width[1] = width[0] / 2; - height[1] = height[0] / 2; + width[1] = ALIGN(width[0], 2) / 2; + height[1] = ALIGN(height[0], 2) / 2; pitch[1] = obj_surface->cb_cr_pitch; bo_offset[1] = obj_surface->width * obj_surface->y_cb_offset; } else if (fourcc == VA_FOURCC_YUY2 || fourcc == VA_FOURCC_UYVY) { /* nothing to do here */ } else { - width[1] = width[0] / 2; - height[1] = height[0] / 2; + width[1] = ALIGN(width[0], 2) / 2; + height[1] = ALIGN(height[0], 2) / 2; pitch[1] = obj_surface->cb_cr_pitch; bo_offset[1] = obj_surface->width * obj_surface->y_cb_offset; - width[2] = width[0] / 2; - height[2] = height[0] / 2; + width[2] = ALIGN(width[0], 2) / 2; + height[2] = ALIGN(height[0], 2) / 2; pitch[2] = obj_surface->cb_cr_pitch; bo_offset[2] = obj_surface->width * obj_surface->y_cr_offset; } @@ -764,8 +764,8 @@ gen9_pp_context_get_surface_conf(VADriverContextP ctx, fourcc == VA_FOURCC_BGRA) { /* nothing to do here */ } else if (fourcc == VA_FOURCC_P010 || fourcc == VA_FOURCC_NV12) { - width[1] = width[0] / 2; - height[1] = height[0] / 2; + width[1] = ALIGN(width[0], 2) / 2; + height[1] = ALIGN(height[0], 2) / 2; pitch[1] = obj_image->image.pitches[1]; bo_offset[1] = obj_image->image.offsets[1]; } else if (fourcc == VA_FOURCC_YUY2 || fourcc == VA_FOURCC_UYVY) { @@ -776,12 +776,12 @@ gen9_pp_context_get_surface_conf(VADriverContextP ctx, if (fourcc == VA_FOURCC_YV12 || fourcc == VA_FOURCC_IMC1) u = 2, v = 1; - width[1] = width[0] / 2; - height[1] = height[0] / 2; + width[1] = ALIGN(width[0], 2) / 2; + height[1] = ALIGN(height[0], 2) / 2; pitch[1] = obj_image->image.pitches[u]; bo_offset[1] = obj_image->image.offsets[u]; - width[2] = width[0] / 2; - height[2] = height[0] / 2; + width[2] = ALIGN(width[0], 2) / 2; + height[2] = ALIGN(height[0], 2) / 2; pitch[2] = obj_image->image.pitches[v]; bo_offset[2] = obj_image->image.offsets[v]; } diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c index ff163887e..80278bb70 100644 --- a/src/i965_drv_video.c +++ b/src/i965_drv_video.c @@ -1725,8 +1725,8 @@ i965_suface_external_memory(VADriverContextP ctx, obj_surface->subsampling = SUBSAMPLE_YUV420; obj_surface->y_cb_offset = obj_surface->height; obj_surface->y_cr_offset = obj_surface->height; - obj_surface->cb_cr_width = obj_surface->orig_width / 2; - obj_surface->cb_cr_height = obj_surface->orig_height / 2; + obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2; + obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2; obj_surface->cb_cr_pitch = memory_attibute->pitches[1]; if (tiling) ASSERT_RET(IS_ALIGNED(obj_surface->cb_cr_pitch, 128), VA_STATUS_ERROR_INVALID_PARAMETER); @@ -1743,8 +1743,8 @@ i965_suface_external_memory(VADriverContextP ctx, obj_surface->subsampling = SUBSAMPLE_YUV420; obj_surface->y_cr_offset = obj_surface->height; obj_surface->y_cb_offset = memory_attibute->offsets[2] / obj_surface->width; - obj_surface->cb_cr_width = obj_surface->orig_width / 2; - obj_surface->cb_cr_height = obj_surface->orig_height / 2; + obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2; + obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2; obj_surface->cb_cr_pitch = memory_attibute->pitches[1]; if (tiling) @@ -1764,8 +1764,8 @@ i965_suface_external_memory(VADriverContextP ctx, obj_surface->subsampling = SUBSAMPLE_YUV420; obj_surface->y_cb_offset = obj_surface->height; obj_surface->y_cr_offset = memory_attibute->offsets[2] / obj_surface->width; - obj_surface->cb_cr_width = obj_surface->orig_width / 2; - obj_surface->cb_cr_height = obj_surface->orig_height / 2; + obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2; + obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2; obj_surface->cb_cr_pitch = memory_attibute->pitches[1]; if (tiling) ASSERT_RET(IS_ALIGNED(obj_surface->cb_cr_pitch, 128), VA_STATUS_ERROR_INVALID_PARAMETER); @@ -1837,7 +1837,7 @@ i965_suface_external_memory(VADriverContextP ctx, obj_surface->subsampling = SUBSAMPLE_YUV422H; obj_surface->y_cb_offset = obj_surface->height; obj_surface->y_cr_offset = memory_attibute->offsets[2] / obj_surface->width; - obj_surface->cb_cr_width = obj_surface->orig_width / 2; + obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2; obj_surface->cb_cr_height = obj_surface->orig_height; obj_surface->cb_cr_pitch = memory_attibute->pitches[1]; if (tiling) @@ -1854,7 +1854,7 @@ i965_suface_external_memory(VADriverContextP ctx, obj_surface->subsampling = SUBSAMPLE_YUV422H; obj_surface->y_cr_offset = memory_attibute->offsets[1] / obj_surface->width; obj_surface->y_cb_offset = memory_attibute->offsets[2] / obj_surface->width; - obj_surface->cb_cr_width = obj_surface->orig_width / 2; + obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2; obj_surface->cb_cr_height = obj_surface->orig_height; obj_surface->cb_cr_pitch = memory_attibute->pitches[1]; ASSERT_RET(IS_ALIGNED(obj_surface->cb_cr_pitch, i965->codec_info->min_linear_wpitch), VA_STATUS_ERROR_INVALID_PARAMETER); @@ -1869,7 +1869,7 @@ i965_suface_external_memory(VADriverContextP ctx, obj_surface->y_cb_offset = obj_surface->height; obj_surface->y_cr_offset = memory_attibute->offsets[2] / obj_surface->width; obj_surface->cb_cr_width = obj_surface->orig_width; - obj_surface->cb_cr_height = obj_surface->orig_height / 2; + obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2; obj_surface->cb_cr_pitch = memory_attibute->pitches[1]; if (tiling) ASSERT_RET(IS_ALIGNED(obj_surface->cb_cr_pitch, 128), VA_STATUS_ERROR_INVALID_PARAMETER); @@ -4526,8 +4526,8 @@ i965_check_alloc_surface_bo(VADriverContextP ctx, case VA_FOURCC_P010: assert(subsampling == SUBSAMPLE_YUV420); obj_surface->cb_cr_pitch = obj_surface->width; - obj_surface->cb_cr_width = obj_surface->orig_width / 2; - obj_surface->cb_cr_height = obj_surface->orig_height / 2; + obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2; + obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2; obj_surface->y_cb_offset = obj_surface->height; obj_surface->y_cr_offset = obj_surface->height; region_width = obj_surface->width; @@ -4538,8 +4538,8 @@ i965_check_alloc_surface_bo(VADriverContextP ctx, case VA_FOURCC_IMC1: assert(subsampling == SUBSAMPLE_YUV420); obj_surface->cb_cr_pitch = obj_surface->width; - obj_surface->cb_cr_width = obj_surface->orig_width / 2; - obj_surface->cb_cr_height = obj_surface->orig_height / 2; + obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2; + obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2; obj_surface->y_cr_offset = obj_surface->height; obj_surface->y_cb_offset = obj_surface->y_cr_offset + ALIGN(obj_surface->cb_cr_height, 32); region_width = obj_surface->width; @@ -4550,8 +4550,8 @@ i965_check_alloc_surface_bo(VADriverContextP ctx, case VA_FOURCC_IMC3: assert(subsampling == SUBSAMPLE_YUV420); obj_surface->cb_cr_pitch = obj_surface->width; - obj_surface->cb_cr_width = obj_surface->orig_width / 2; - obj_surface->cb_cr_height = obj_surface->orig_height / 2; + obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2; + obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2; obj_surface->y_cb_offset = obj_surface->height; obj_surface->y_cr_offset = obj_surface->y_cb_offset + ALIGN(obj_surface->cb_cr_height, 32); region_width = obj_surface->width; @@ -4562,7 +4562,7 @@ i965_check_alloc_surface_bo(VADriverContextP ctx, case VA_FOURCC_422H: assert(subsampling == SUBSAMPLE_YUV422H); obj_surface->cb_cr_pitch = obj_surface->width; - obj_surface->cb_cr_width = obj_surface->orig_width / 2; + obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2; obj_surface->cb_cr_height = obj_surface->orig_height; obj_surface->y_cb_offset = obj_surface->height; obj_surface->y_cr_offset = obj_surface->y_cb_offset + ALIGN(obj_surface->cb_cr_height, 32); @@ -4575,7 +4575,7 @@ i965_check_alloc_surface_bo(VADriverContextP ctx, assert(subsampling == SUBSAMPLE_YUV422V); obj_surface->cb_cr_pitch = obj_surface->width; obj_surface->cb_cr_width = obj_surface->orig_width; - obj_surface->cb_cr_height = obj_surface->orig_height / 2; + obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2; obj_surface->y_cb_offset = obj_surface->height; obj_surface->y_cr_offset = obj_surface->y_cb_offset + ALIGN(obj_surface->cb_cr_height, 32); region_width = obj_surface->width; @@ -4663,17 +4663,17 @@ i965_check_alloc_surface_bo(VADriverContextP ctx, case VA_FOURCC_P010: obj_surface->y_cb_offset = obj_surface->height; obj_surface->y_cr_offset = obj_surface->height; - obj_surface->cb_cr_width = obj_surface->orig_width / 2; + obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2; obj_surface->width = ALIGN(obj_surface->cb_cr_width * 2, i965->codec_info->min_linear_wpitch) * bpp_1stplane; - obj_surface->cb_cr_height = obj_surface->orig_height / 2; + obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2; obj_surface->cb_cr_pitch = obj_surface->width; region_width = obj_surface->width; region_height = obj_surface->height + obj_surface->height / 2; break; case VA_FOURCC_YV16: - obj_surface->cb_cr_width = obj_surface->orig_width / 2; + obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2; obj_surface->width = ALIGN(obj_surface->cb_cr_width, i965->codec_info->min_linear_wpitch) * 2; obj_surface->cb_cr_height = obj_surface->orig_height; obj_surface->y_cr_offset = obj_surface->height; @@ -4694,9 +4694,9 @@ i965_check_alloc_surface_bo(VADriverContextP ctx, obj_surface->y_cr_offset = obj_surface->height + obj_surface->height / 4; } - obj_surface->cb_cr_width = obj_surface->orig_width / 2; + obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2; obj_surface->width = ALIGN(obj_surface->cb_cr_width, i965->codec_info->min_linear_wpitch) * 2; - obj_surface->cb_cr_height = obj_surface->orig_height / 2; + obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2; obj_surface->cb_cr_pitch = obj_surface->width / 2; region_width = obj_surface->width; region_height = obj_surface->height + obj_surface->height / 2; @@ -4705,9 +4705,9 @@ i965_check_alloc_surface_bo(VADriverContextP ctx, case VA_FOURCC_I010: obj_surface->y_cb_offset = obj_surface->height; obj_surface->y_cr_offset = obj_surface->height + obj_surface->height / 4; - obj_surface->cb_cr_width = obj_surface->orig_width / 2; + obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2; obj_surface->width = ALIGN(obj_surface->cb_cr_width * 2, i965->codec_info->min_linear_wpitch) * 2; - obj_surface->cb_cr_height = obj_surface->orig_height / 2; + obj_surface->cb_cr_height =ALIGN(obj_surface->orig_height, 2) / 2; obj_surface->cb_cr_pitch = obj_surface->width / 2; region_width = obj_surface->width; region_height = obj_surface->height + obj_surface->height / 2; ================================================ FILE: packages/multimedia/libaacs/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="libaacs" PKG_VERSION="0.11.1" PKG_SHA256="a88aa0ebe4c98a77f7aeffd92ab3ef64ac548c6b822e8248a8b926725bea0a39" PKG_LICENSE="GPL" PKG_SITE="http://www.videolan.org/developers/libaacs.html" PKG_URL="https://download.videolan.org/pub/videolan/libaacs/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libgcrypt" PKG_LONGDESC="Open implementation of the AACS (Advanced Access Content System) specification." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--disable-werror \ --disable-extra-warnings \ --disable-optimizations \ --with-libgcrypt-prefix=${SYSROOT_PREFIX}/usr \ --with-libgpg-error-prefix=${SYSROOT_PREFIX}/usr \ --with-gnu-ld" post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { mkdir -p ${INSTALL}/usr/config/aacs cp -P ../KEYDB.cfg ${INSTALL}/usr/config/aacs } ================================================ FILE: packages/multimedia/libass/package.mk ================================================ # 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) PKG_NAME="libass" PKG_VERSION="0.17.0" PKG_SHA256="971e2e1db59d440f88516dcd1187108419a370e64863f70687da599fdf66cc1a" PKG_LICENSE="BSD" PKG_SITE="https://github.com/libass/libass" PKG_URL="https://github.com/libass/libass/releases/download/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain freetype fontconfig fribidi harfbuzz" PKG_LONGDESC="A portable subtitle renderer for the ASS/SSA (Advanced Substation Alpha/Substation Alpha) subtitle format." PKG_CONFIGURE_OPTS_TARGET="--disable-test \ --enable-fontconfig \ --disable-libunibreak \ --disable-silent-rules \ --with-gnu-ld" if [ ${TARGET_ARCH} = "x86_64" ]; then PKG_DEPENDS_TARGET+=" nasm:host" PKG_CONFIGURE_OPTS_TARGET+=" --enable-asm" fi post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/multimedia/libbdplus/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="libbdplus" PKG_VERSION="0.2.0" PKG_SHA256="b93eea3eaef33d6e9155d2c34b068c505493aa5a4936e63274f4342ab0f40a58" PKG_LICENSE="GPL" PKG_SITE="https://www.videolan.org/developers/libbdplus.html" PKG_URL="http://download.videolan.org/pub/videolan/${PKG_NAME}/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libgcrypt libgpg-error" PKG_LONGDESC="libbdplus is a research project to implement the BD+ System Specifications." PKG_CONFIGURE_OPTS_TARGET="--disable-werror \ --disable-extra-warnings \ --disable-optimizations \ --with-libgcrypt-prefix=${SYSROOT_PREFIX}/usr \ --with-gpg-error-prefix=${SYSROOT_PREFIX}/usr \ --with-gnu-ld" if [ "${BLURAY_AACS_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" libaacs" PKG_CONFIGURE_OPTS_TARGET+=" --with-libaacs" else PKG_CONFIGURE_OPTS_TARGET+=" --without-libaacs" fi post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/multimedia/libbluray/package.mk ================================================ # 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) PKG_NAME="libbluray" PKG_VERSION="1.3.4" PKG_SHA256="478ffd68a0f5dde8ef6ca989b7f035b5a0a22c599142e5cd3ff7b03bbebe5f2b" PKG_LICENSE="LGPL" PKG_SITE="https://www.videolan.org/developers/libbluray.html" PKG_URL="http://download.videolan.org/pub/videolan/libbluray/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain fontconfig freetype libxml2 libudfread" PKG_LONGDESC="libbluray is an open-source library designed for Blu-Ray Discs playback for media players." PKG_TOOLCHAIN="autotools" if [ "${BLURAY_AACS_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" libaacs" fi if [ "${BLURAY_BDPLUS_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" libbdplus" fi PKG_CONFIGURE_OPTS_TARGET="--disable-werror \ --disable-extra-warnings \ --disable-optimizations \ --disable-examples \ --disable-bdjava-jar \ --disable-doxygen-doc \ --disable-doxygen-dot \ --disable-doxygen-man \ --disable-doxygen-rtf \ --disable-doxygen-xml \ --disable-doxygen-chm \ --disable-doxygen-chi \ --disable-doxygen-html \ --disable-doxygen-ps \ --disable-doxygen-pdf \ --with-freetype \ --with-fontconfig \ --with-libxml2 \ --with-gnu-ld" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/multimedia/libbluray/patches/libbluray-00-fix-build-with-autoconf-archive-2016-or-later.patch ================================================ From bc746413e07c504535873cf860a8f2c38862896e Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Thu, 1 Feb 2018 08:15:27 +0000 Subject: [PATCH] Fix build failure with recent ax_prog_doxygen.m4 Recent autotool-archives doxygen macros breaks the current build, so this patch updates to the method of the latest autoconf-archive version. The required autoconf-archive macro has been committed to their repository in November 2015, so anything later should work. Ref: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=837020 --- Makefile.am | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,5 @@ -include $(top_srcdir)/doxygen-include.am +# include Doxygen rules (requires autoconf-archive >2016-03-20) +@DX_RULES@ ACLOCAL_AMFLAGS = -I m4 ================================================ FILE: packages/multimedia/libbluray/patches/libbluray-03-set-headless-false.patch ================================================ From 29be28f8062baca2856742a8f7ad2594981cf128 Mon Sep 17 00:00:00 2001 From: Peter Vicman Date: Mon, 27 Sep 2021 19:59:20 +0200 Subject: [PATCH] disable X11 check because it will not run in headless mode https://github.com/fandangos/libbluray/commit/47726b99922899bb9c4ea688356199f2068d156a https://github.com/PojavLauncherTeam/PojavLauncher/issues/713#issuecomment-769816262 --- src/libbluray/bdj/bdj.c | 2 ++ 1 file changed, 2 insertions(+) --- a/src/libbluray/bdj/bdj.c +++ b/src/libbluray/bdj/bdj.c @@ -903,6 +903,8 @@ static int _create_jvm(void *jvm_lib, co option[n++].optionString = str_dup ("-Xms256M"); option[n++].optionString = str_dup ("-Xmx256M"); option[n++].optionString = str_dup ("-Xss2048k"); + option[n++].optionString = str_dup ("-Djava.awt.headless=false"); + BD_DEBUG(DBG_CRIT | DBG_BDJ, "Disable X11 check\n"); #ifdef HAVE_BDJ_J2ME option[n++].optionString = str_printf("-Djava.home=%s", java_home); option[n++].optionString = str_printf("-Xbootclasspath/a:%s/lib/xmlparser.jar", java_home); ================================================ FILE: packages/multimedia/libdvdcss/package.mk ================================================ # 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) PKG_NAME="libdvdcss" PKG_VERSION="1.4.3-Next-Nexus-Alpha2-2" PKG_SHA256="f38c4a4e7a4f4da6d8e83b8852489aa3bb6588a915dc41f5ee89d9aad305a06e" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/libdvdcss" PKG_URL="https://github.com/xbmc/${PKG_NAME}/archive/refs/tags/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="libdvdcss is a simple library designed for accessing DVDs as a block device without having to bother about the decryption." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/multimedia/libdvdnav/package.mk ================================================ # 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) PKG_NAME="libdvdnav" PKG_VERSION="6.1.1-Next-Nexus-Alpha2-2" PKG_SHA256="584f62a3896794408d46368e2ecf2c6217ab9c676ce85921b2d68b8961f49dfc" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/libdvdnav" PKG_URL="https://github.com/xbmc/${PKG_NAME}/archive/refs/tags/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libdvdread" PKG_LONGDESC="libdvdnav is a library that allows easy use of sophisticated DVD navigation features such as DVD menus, multiangle playback and even interactive DVD games." PKG_TOOLCHAIN="manual" ================================================ FILE: packages/multimedia/libdvdread/package.mk ================================================ # 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) PKG_NAME="libdvdread" PKG_VERSION="6.1.3-Next-Nexus-Alpha2-2" PKG_SHA256="719130091e3adc9725ba72df808f24a14737a009dca5a4c38c601c0c76449b62" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/libdvdread" PKG_URL="https://github.com/xbmc/${PKG_NAME}/archive/refs/tags/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="libdvdread is a library which provides a simple foundation for reading DVDs." PKG_TOOLCHAIN="manual" if [ "${KODI_DVDCSS_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libdvdcss" fi ================================================ FILE: packages/multimedia/libmpeg2/package.mk ================================================ # 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) PKG_NAME="libmpeg2" PKG_VERSION="0.5.1" PKG_SHA256="dee22e893cb5fc2b2b6ebd60b88478ab8556cb3b93f9a0d7ce8f3b61851871d4" PKG_LICENSE="GPLv2" PKG_SITE="http://libmpeg2.sourceforge.net/" PKG_URL="http://libmpeg2.sourceforge.net/files/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="The MPEG Library is a collection of C routines to decode MPEG-1 and MPEG-2 movies." PKG_CONFIGURE_OPTS_TARGET="--disable-sdl \ --without-x" post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/multimedia/libudfread/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libudfread" PKG_VERSION="1.1.2" PKG_SHA256="2bf16726ac98d093156195bb049a663e07d3323e079c26912546f4e05c77bac5" PKG_LICENSE="LGPLv2.1" PKG_SITE="https://code.videolan.org/videolan/libudfread" PKG_URL="https://code.videolan.org/videolan/${PKG_NAME}/-/archive/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="UDF reader" PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-static --disable-shared" ================================================ FILE: packages/multimedia/libva/package.mk ================================================ # 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) PKG_NAME="libva" PKG_VERSION="2.17.0" PKG_SHA256="8940541980ef998a36cd8f6ad905e81838ea4ddf56dc479ed2bebd12711e6001" PKG_ARCH="x86_64" PKG_LICENSE="GPL" PKG_SITE="https://01.org/linuxmedia" PKG_URL="https://github.com/intel/libva/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="Libva is an implementation for VA-API (VIdeo Acceleration API)." if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET="toolchain libX11 libXext libXfixes libdrm" DISPLAYSERVER_LIBVA="-Dwith_x11=yes -Dwith_glx=no -Dwith_wayland=no" elif [ "${DISPLAYSERVER}" = "wl" ]; then DISPLAYSERVER_LIBVA="-Dwith_x11=no -Dwith_glx=no -Dwith_wayland=yes" PKG_DEPENDS_TARGET="toolchain libdrm wayland" else PKG_DEPENDS_TARGET="toolchain libdrm" DISPLAYSERVER_LIBVA="-Dwith_x11=no -Dwith_glx=no -Dwith_wayland=no" fi PKG_MESON_OPTS_TARGET="-Ddisable_drm=false \ -Denable_docs=false \ -Denable_va_messaging=true \ ${DISPLAYSERVER_LIBVA}" ================================================ FILE: packages/multimedia/libvdpau/package.mk ================================================ # 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) PKG_NAME="libvdpau" PKG_VERSION="1.5" PKG_SHA256="a5d50a42b8c288febc07151ab643ac8de06a18446965c7241f89b4e810821913" PKG_LICENSE="MIT" PKG_SITE="https://wiki.freedesktop.org/www/Software/VDPAU/" PKG_URL="https://gitlab.freedesktop.org/vdpau/libvdpau/-/archive/${PKG_VERSION}/libvdpau-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libX11 xorgproto libXext" PKG_LONGDESC="VDPAU is the Video Decode and Presentation API for UNIX." PKG_MESON_OPTS_TARGET="-Ddocumentation=false \ -Ddri2=true \ -Dmoduledir=/usr/lib/vdpau" ================================================ FILE: packages/multimedia/media-driver/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="media-driver" PKG_VERSION="22.6.6" PKG_SHA256="b553290e829dfd824eb62295c9f07dbe8062ce7998f7c527cc92856d0792562d" PKG_ARCH="x86_64" PKG_LICENSE="MIT" PKG_SITE="https://01.org/linuxmedia" PKG_URL="https://github.com/intel/media-driver/archive/intel-media-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libva libdrm gmmlib" PKG_LONGDESC="media-driver: The Intel(R) Media Driver for VAAPI is a new VA-API (Video Acceleration API) user mode driver supporting hardware accelerated decoding, encoding, and video post processing for GEN based graphics hardware." PKG_CMAKE_OPTS_TARGET="-DBUILD_CMRTLIB=OFF \ -DBUILD_KERNELS=ON \ -DBUILD_TYPE=release \ -DENABLE_NONFREE_KERNELS=ON \ -DMEDIA_BUILD_FATAL_WARNINGS=ON \ -DMEDIA_RUN_TEST_SUITE=OFF" ================================================ FILE: packages/multimedia/media-driver/patches/media-driver-999.01-PR1162-use-forward_references-as-the-reference-for-ADI.patch ================================================ From 1e79d58e7af77453e55ce40fe01c1cc8ca84461b Mon Sep 17 00:00:00 2001 From: Jason Chen Date: Thu, 18 Mar 2021 11:52:11 +0800 Subject: [PATCH] [VP] Use forward_references as the reference for ADI VAAPI define forward_references as past referene frame, but vphal regart forward reference as future reference frame. This change will only correct the behavior in DDI level to map forward_references to VPHAL_SURFACE.pBwdRef, and backward_references to VPHAL_SURFACE.pFwdRef --- media_driver/linux/common/ddi/media_libva.cpp | 17 ++++++++ .../linux/common/vp/ddi/media_libva_vp.c | 42 ++++++++++--------- 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/media_driver/linux/common/ddi/media_libva.cpp b/media_driver/linux/common/ddi/media_libva.cpp index 63f1659ed..efa0c08cc 100755 --- a/media_driver/linux/common/ddi/media_libva.cpp +++ b/media_driver/linux/common/ddi/media_libva.cpp @@ -6525,6 +6525,23 @@ DdiMedia_QueryVideoProcPipelineCaps( pipeline_caps->min_output_width = VP_MIN_PIC_WIDTH; pipeline_caps->min_output_height = VP_MIN_PIC_WIDTH; } + + for (int i = 0; i < num_filters; i++) { + void *pData; + DdiMedia_MapBuffer(ctx, filters[i], &pData); + DDI_CHK_NULL(pData, "nullptr pData", VA_STATUS_ERROR_INVALID_PARAMETER); + VAProcFilterParameterBufferBase* base_param = (VAProcFilterParameterBufferBase*) pData; + if (base_param->type == VAProcFilterDeinterlacing) + { + VAProcFilterParameterBufferDeinterlacing *di_param = (VAProcFilterParameterBufferDeinterlacing *)base_param; + if (di_param->algorithm == VAProcDeinterlacingMotionAdaptive || + di_param->algorithm == VAProcDeinterlacingMotionCompensated) + { + pipeline_caps->num_forward_references = 1; + } + } + } + return VA_STATUS_SUCCESS; } diff --git a/media_driver/linux/common/vp/ddi/media_libva_vp.c b/media_driver/linux/common/vp/ddi/media_libva_vp.c index 1f544749b..7d5b95b4e 100644 --- a/media_driver/linux/common/vp/ddi/media_libva_vp.c +++ b/media_driver/linux/common/vp/ddi/media_libva_vp.c @@ -90,8 +90,8 @@ VAStatus DdiVp_SetProcFilterTotalColorCorrectionParams(PDDI_VP_CONTEXT, uint VAStatus DdiVp_SetProcFilterHdrTmParams(PDDI_VP_CONTEXT, uint32_t, VAProcFilterParameterBufferHDRToneMapping*); VAStatus DdiVp_SetProcPipelineBlendingParams(PDDI_VP_CONTEXT pVpCtx, uint32_t uiSurfIndex, VAProcPipelineParameterBuffer* pPipelineParam); VAStatus DdiVp_ConvertSurface (VADriverContextP ctx, DDI_MEDIA_SURFACE *srcSurface, int16_t srcx, int16_t srcy, uint16_t srcw, uint16_t srch, DDI_MEDIA_SURFACE *dstSurface, int16_t destx, int16_t desty, uint16_t destw, uint16_t desth ); -VAStatus DdiVp_UpdateProcPipelineForwardReferenceFrames(PDDI_VP_CONTEXT pVpCtx, VADriverContextP pVaDrvCtx, PVPHAL_SURFACE pVpHalSrcSurf, VAProcPipelineParameterBuffer* pPipelineParam); -VAStatus DdiVp_UpdateProcPipelineBackwardReferenceFrames(PDDI_VP_CONTEXT pVpCtx, VADriverContextP pVaDrvCtx, PVPHAL_SURFACE pVpHalSrcSurf, VAProcPipelineParameterBuffer* pPipelineParam); +VAStatus DdiVp_UpdateProcPipelineFutureReferenceFrames(PDDI_VP_CONTEXT pVpCtx, VADriverContextP pVaDrvCtx, PVPHAL_SURFACE pVpHalSrcSurf, VAProcPipelineParameterBuffer* pPipelineParam); +VAStatus DdiVp_UpdateProcPipelinePastReferenceFrames(PDDI_VP_CONTEXT pVpCtx, VADriverContextP pVaDrvCtx, PVPHAL_SURFACE pVpHalSrcSurf, VAProcPipelineParameterBuffer* pPipelineParam); VAStatus DdiVp_UpdateVphalTargetSurfColorSpace(VADriverContextP, PDDI_VP_CONTEXT, VAProcPipelineParameterBuffer*, uint32_t targetIndex); VAStatus DdiVp_BeginPictureInt(VADriverContextP pVaDrvCtx, PDDI_VP_CONTEXT pVpCtx, VASurfaceID vaSurfID); @@ -1174,15 +1174,15 @@ DdiVp_SetProcPipelineParams( // Update fwd and bkward ref frames: Required for Advanced processing - will be supported in the future - pVpHalSrcSurf->uFwdRefCount = pPipelineParam->num_forward_references; + pVpHalSrcSurf->uFwdRefCount = pPipelineParam->num_backward_references; - vaStatus = DdiVp_UpdateProcPipelineForwardReferenceFrames(pVpCtx, pVaDrvCtx, pVpHalSrcSurf, pPipelineParam); - DDI_CHK_RET(vaStatus, "Failed to update forward reference frames!"); + vaStatus = DdiVp_UpdateProcPipelineFutureReferenceFrames(pVpCtx, pVaDrvCtx, pVpHalSrcSurf, pPipelineParam); + DDI_CHK_RET(vaStatus, "Failed to update future reference frames!"); - pVpHalSrcSurf->uBwdRefCount = pPipelineParam->num_backward_references; + pVpHalSrcSurf->uBwdRefCount = pPipelineParam->num_forward_references; - vaStatus = DdiVp_UpdateProcPipelineBackwardReferenceFrames(pVpCtx, pVaDrvCtx, pVpHalSrcSurf, pPipelineParam); - DDI_CHK_RET(vaStatus, "Failed to update backward reference frames!"); + vaStatus = DdiVp_UpdateProcPipelinePastReferenceFrames(pVpCtx, pVaDrvCtx, pVpHalSrcSurf, pPipelineParam); + DDI_CHK_RET(vaStatus, "Failed to update past reference frames!"); // Check if filter values changed,if yes, then reset all filters for this surface @@ -3890,7 +3890,7 @@ DdiVp_SetProcPipelineBlendingParams( } //////////////////////////////////////////////////////////////////////////////// -//! \purpose Update the forward reference frames for VPHAL input surface +//! \purpose Update the future reference frames for VPHAL input surface //! \params //! [in] pVpCtx : VP context //! [in] pVaDrvCtx : VA Driver context @@ -3900,7 +3900,7 @@ DdiVp_SetProcPipelineBlendingParams( //! \returns VA_STATUS_SUCCESS if call succeeds //////////////////////////////////////////////////////////////////////////////// VAStatus -DdiVp_UpdateProcPipelineForwardReferenceFrames( +DdiVp_UpdateProcPipelineFutureReferenceFrames( PDDI_VP_CONTEXT pVpCtx, VADriverContextP pVaDrvCtx, PVPHAL_SURFACE pVpHalSrcSurf, @@ -3930,9 +3930,10 @@ DdiVp_UpdateProcPipelineForwardReferenceFrames( pSurface = pVpHalSrcSurf; - if (pPipelineParam->forward_references != nullptr) + // DDI regard backward_references as future frame, but VPHAL regard pFwdRef as future frame + if (pPipelineParam->backward_references != nullptr) { - for (i = 0;i < pPipelineParam->num_forward_references; i++) + for (i = 0;i < pPipelineParam->num_backward_references; i++) { PDDI_MEDIA_SURFACE pRefSurfBuffObj = nullptr; if(pSurface->pFwdRef == nullptr) @@ -3952,9 +3953,9 @@ DdiVp_UpdateProcPipelineForwardReferenceFrames( pSurface->pFwdRef->dwWidth = pVpHalSrcSurf->dwWidth; pSurface->pFwdRef->dwHeight = pVpHalSrcSurf->dwHeight; pSurface->pFwdRef->dwPitch = pVpHalSrcSurf->dwPitch; - pSurface->uFwdRefCount = pPipelineParam->num_forward_references - i; + pSurface->uFwdRefCount = pPipelineParam->num_backward_references - i; } - pRefSurfBuffObj = DdiMedia_GetSurfaceFromVASurfaceID(pMediaCtx, pPipelineParam->forward_references[i]); + pRefSurfBuffObj = DdiMedia_GetSurfaceFromVASurfaceID(pMediaCtx, pPipelineParam->backward_references[i]); DDI_CHK_NULL(pRefSurfBuffObj, "Null pRefSurfBuffObj!", VA_STATUS_ERROR_INVALID_SURFACE); @@ -3979,7 +3980,7 @@ DdiVp_UpdateProcPipelineForwardReferenceFrames( } //////////////////////////////////////////////////////////////////////////////// -//! \purpose Update the backward reference frames for VPHAL input surface +//! \purpose Update the past reference frames for VPHAL input surface //! \params //! [in] pVpCtx : VP context //! [in] pVaDrvCtx : VA Driver context @@ -3989,7 +3990,7 @@ DdiVp_UpdateProcPipelineForwardReferenceFrames( //! \returns VA_STATUS_SUCCESS if call succeeds //////////////////////////////////////////////////////////////////////////////// VAStatus -DdiVp_UpdateProcPipelineBackwardReferenceFrames( +DdiVp_UpdateProcPipelinePastReferenceFrames( PDDI_VP_CONTEXT pVpCtx, VADriverContextP pVaDrvCtx, PVPHAL_SURFACE pVpHalSrcSurf, @@ -4019,9 +4020,10 @@ DdiVp_UpdateProcPipelineBackwardReferenceFrames( pSurface = pVpHalSrcSurf; - if (pPipelineParam->backward_references != nullptr) + // DDI regard forward_references as past frame, but VPHAL regard pBwdRef as past frame + if (pPipelineParam->forward_references != nullptr) { - for (i = 0;i < pPipelineParam->num_backward_references; i++) + for (i = 0;i < pPipelineParam->num_forward_references; i++) { PDDI_MEDIA_SURFACE pRefSurfBuffObj = nullptr; if(pSurface->pBwdRef == nullptr) @@ -4041,9 +4043,9 @@ DdiVp_UpdateProcPipelineBackwardReferenceFrames( pSurface->pBwdRef->dwWidth = pVpHalSrcSurf->dwWidth; pSurface->pBwdRef->dwHeight = pVpHalSrcSurf->dwHeight; pSurface->pBwdRef->dwPitch = pVpHalSrcSurf->dwPitch; - pSurface->uBwdRefCount = pPipelineParam->num_backward_references - i;; + pSurface->uBwdRefCount = pPipelineParam->num_forward_references - i;; } - pRefSurfBuffObj = DdiMedia_GetSurfaceFromVASurfaceID(pMediaCtx, pPipelineParam->backward_references[i]); + pRefSurfBuffObj = DdiMedia_GetSurfaceFromVASurfaceID(pMediaCtx, pPipelineParam->forward_references[i]); DDI_CHK_NULL(pRefSurfBuffObj, "Null pRefSurfBuffObj!", VA_STATUS_ERROR_INVALID_SURFACE); ================================================ FILE: packages/multimedia/nv-codec-headers/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nv-codec-headers" PKG_VERSION="11.1.5.2" PKG_SHA256="576df78bad704e2854991100bea99e974759304ac1411c02707ebc95a425191b" PKG_LICENSE="MIT" PKG_SITE="https://github.com/FFmpeg/nv-codec-headers" PKG_URL="https://github.com/FFmpeg/nv-codec-headers/archive/n${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="FFmpeg version of headers required to interface with Nvidias codec APIs." makeinstall_target(){ make DESTDIR=${SYSROOT_PREFIX} PREFIX=/usr install } ================================================ FILE: packages/multimedia/nvidia-vaapi-driver/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nvidia-vaapi-driver" PKG_VERSION="0.0.8" PKG_SHA256="a396e8b48ec9bc58cec50d5b049e401ddc59083195edf2b8669e9788f4d44293" PKG_LICENSE="MIT" PKG_SITE="https://github.com/elFarto/nvidia-vaapi-driver" PKG_URL="https://github.com/elFarto/nvidia-vaapi-driver/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libva nv-codec-headers gst-plugins-bad" PKG_LONGDESC="A VA-API implemention using NVIDIA's NVDEC" ================================================ FILE: packages/multimedia/rtmpdump/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rtmpdump" PKG_VERSION="c5f04a58fc2aeea6296ca7c44ee4734c18401aa3" PKG_SHA256="fd8c21263d93fbde8bee8aa6c5f6a657789674bb0f9e74f050651504d5f43b46" PKG_LICENSE="GPL" PKG_SITE="http://rtmpdump.mplayerhq.hu/" PKG_URL="http://repo.or.cz/rtmpdump.git/snapshot/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain zlib openssl" PKG_LONGDESC="rtmpdump is a toolkit for RTMP streams." PKG_BUILD_FLAGS="+pic" make_target() { make prefix=/usr \ incdir=/usr/include/librtmp \ libdir=/usr/lib \ mandir=/usr/share/man \ CC="${CC}" \ LD="${LD}" \ AR="${AR}" \ SHARED=no \ CRYPTO="OPENSSL" \ OPT="" \ XCFLAGS="${CFLAGS}" \ XCFLAGS="${CFLAGS} -Wno-unused-but-set-variable -Wno-unused-const-variable" \ XLDFLAGS="${LDFLAGS}" \ XLIBS="-lm" } makeinstall_target() { make DESTDIR=${SYSROOT_PREFIX} \ prefix=/usr \ incdir=/usr/include/librtmp \ libdir=/usr/lib \ mandir=/usr/share/man \ CC="${CC}" \ LD="${LD}" \ AR="${AR}" \ SHARED=no \ CRYPTO="OPENSSL" \ OPT="" \ XCFLAGS="${CFLAGS}" \ XLDFLAGS="${LDFLAGS}" \ XLIBS="-lm" \ install make DESTDIR=${INSTALL} \ prefix=/usr \ incdir=/usr/include/librtmp \ libdir=/usr/lib \ mandir=/usr/share/man \ CC="${CC}" \ LD="${LD}" \ AR="${AR}" \ SHARED=no \ CRYPTO="OPENSSL" \ OPT="" \ XCFLAGS="${CFLAGS}" \ XLDFLAGS="${LDFLAGS}" \ XLIBS="-lm" \ install } post_makeinstall_target() { rm -rf ${INSTALL}/usr/sbin # # to be removed: hack for "compatibility" # mkdir -p ${INSTALL}/usr/lib # ln -sf librtmp.so.1 ${INSTALL}/usr/lib/librtmp.so.0 } ================================================ FILE: packages/multimedia/rtmpdump/patches/001_fix-racing-build-issue.patch ================================================ --- a/librtmp/Makefile 2018-02-01 18:38:52.866867721 +0100 +++ b/librtmp/Makefile 2018-02-01 18:39:23.315007740 +0100 @@ -115,6 +115,7 @@ cp librtmp.3 $(MANDIR)/man3 install_so: librtmp$(SO_EXT) + -mkdir -p $(SODIR) cp librtmp$(SO_EXT) $(SODIR) $(INSTALL_IMPLIB) cd $(SODIR); ln -sf librtmp$(SO_EXT) librtmp.$(SOX) ================================================ FILE: packages/multimedia/rtmpdump/patches/002_build-with-openssl11.patch ================================================ --- a/librtmp/dh.h +++ b/librtmp/dh.h @@ -253,20 +253,42 @@ if (!dh) goto failed; +#if !defined(USE_OPENSSL) || !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L MP_new(dh->g); if (!dh->g) goto failed; +#else + BIGNUM *g = NULL; + MP_new(g); + if (!g) + goto failed; +#endif +#if !defined(USE_OPENSSL) || !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L MP_gethex(dh->p, P1024, res); /* prime P1024, see dhgroups.h */ +#else + BIGNUM* p = NULL; + DH_get0_pqg(dh, (BIGNUM const**)&p, NULL, NULL); + MP_gethex(p, P1024, res); /* prime P1024, see dhgroups.h */ +#endif if (!res) { goto failed; } +#if !defined(USE_OPENSSL) || !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L MP_set_w(dh->g, 2); /* base 2 */ +#else + MP_set_w(g, 2); /* base 2 */ + DH_set0_pqg(dh, p, NULL, g); +#endif +#if !defined(USE_OPENSSL) || !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L dh->length = nKeyBits; +#else + DH_set_length(dh, nKeyBits); +#endif return dh; failed: @@ -293,12 +315,24 @@ MP_gethex(q1, Q1024, res); assert(res); +#if !defined(USE_OPENSSL) || !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L res = isValidPublicKey(dh->pub_key, dh->p, q1); +#else + BIGNUM const* pub_key = NULL; + BIGNUM const* p = NULL; + DH_get0_key(dh, &pub_key, NULL); + DH_get0_pqg(dh, &p, NULL, NULL); + res = isValidPublicKey((BIGNUM*)pub_key, (BIGNUM*)p, q1); +#endif if (!res) { +#if !defined(USE_OPENSSL) || !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L MP_free(dh->pub_key); MP_free(dh->priv_key); dh->pub_key = dh->priv_key = 0; +#else + DH_free(dh); +#endif } MP_free(q1); @@ -314,15 +348,29 @@ DHGetPublicKey(MDH *dh, uint8_t *pubkey, size_t nPubkeyLen) { int len; +#if !defined(USE_OPENSSL) || !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L if (!dh || !dh->pub_key) +#else + BIGNUM const* pub_key = NULL; + DH_get0_key(dh, &pub_key, NULL); + if (!dh || !pub_key) +#endif return 0; +#if !defined(USE_OPENSSL) || !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L len = MP_bytes(dh->pub_key); +#else + len = MP_bytes(pub_key); +#endif if (len <= 0 || len > (int) nPubkeyLen) return 0; memset(pubkey, 0, nPubkeyLen); +#if !defined(USE_OPENSSL) || !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L MP_setbin(dh->pub_key, pubkey + (nPubkeyLen - len), len); +#else + MP_setbin(pub_key, pubkey + (nPubkeyLen - len), len); +#endif return 1; } @@ -364,7 +412,13 @@ MP_gethex(q1, Q1024, len); assert(len); +#if !defined(USE_OPENSSL) || !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L if (isValidPublicKey(pubkeyBn, dh->p, q1)) +#else + BIGNUM const* p = NULL; + DH_get0_pqg(dh, &p, NULL, NULL); + if (isValidPublicKey(pubkeyBn, (BIGNUM*)p, q1)) +#endif res = MDH_compute_key(secret, nPubkeyLen, pubkeyBn, dh); else res = -1; --- a/librtmp/handshake.h +++ b/librtmp/handshake.h @@ -31,9 +31,9 @@ #define SHA256_DIGEST_LENGTH 32 #endif #define HMAC_CTX sha2_context -#define HMAC_setup(ctx, key, len) sha2_hmac_starts(&ctx, (unsigned char *)key, len, 0) -#define HMAC_crunch(ctx, buf, len) sha2_hmac_update(&ctx, buf, len) -#define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; sha2_hmac_finish(&ctx, dig) +#define HMAC_setup(ctx, key, len) sha2_hmac_starts(ctx, (unsigned char *)key, len, 0) +#define HMAC_crunch(ctx, buf, len) sha2_hmac_update(ctx, buf, len) +#define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; sha2_hmac_finish(ctx, dig) typedef arc4_context * RC4_handle; #define RC4_alloc(h) *h = malloc(sizeof(arc4_context)) @@ -50,9 +50,9 @@ #endif #undef HMAC_CTX #define HMAC_CTX struct hmac_sha256_ctx -#define HMAC_setup(ctx, key, len) hmac_sha256_set_key(&ctx, len, key) -#define HMAC_crunch(ctx, buf, len) hmac_sha256_update(&ctx, len, buf) -#define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; hmac_sha256_digest(&ctx, SHA256_DIGEST_LENGTH, dig) +#define HMAC_setup(ctx, key, len) hmac_sha256_set_key(ctx, len, key) +#define HMAC_crunch(ctx, buf, len) hmac_sha256_update(ctx, len, buf) +#define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; hmac_sha256_digest(ctx, SHA256_DIGEST_LENGTH, dig) #define HMAC_close(ctx) typedef struct arcfour_ctx* RC4_handle; @@ -64,14 +64,23 @@ #else /* USE_OPENSSL */ #include +#include #include #include #if OPENSSL_VERSION_NUMBER < 0x0090800 || !defined(SHA256_DIGEST_LENGTH) #error Your OpenSSL is too old, need 0.9.8 or newer with SHA256 #endif -#define HMAC_setup(ctx, key, len) HMAC_CTX_init(&ctx); HMAC_Init_ex(&ctx, key, len, EVP_sha256(), 0) -#define HMAC_crunch(ctx, buf, len) HMAC_Update(&ctx, buf, len) -#define HMAC_finish(ctx, dig, dlen) HMAC_Final(&ctx, dig, &dlen); HMAC_CTX_cleanup(&ctx) +#if OPENSSL_VERSION_NUMBER < 0x10100000L +#define HMAC_setup(ctx, key, len) HMAC_CTX_init(ctx); HMAC_Init_ex(ctx, key, len, EVP_sha256(), 0) +#else +#define HMAC_setup(ctx, key, len) ctx = HMAC_CTX_new(); HMAC_CTX_reset(ctx); HMAC_Init_ex(ctx, key, len, EVP_sha256(), 0) +#endif +#define HMAC_crunch(ctx, buf, len) HMAC_Update(ctx, buf, len) +#if OPENSSL_VERSION_NUMBER < 0x10100000L +#define HMAC_finish(ctx, dig, dlen) HMAC_Final(ctx, dig, &dlen); HMAC_CTX_cleanup(ctx) +#else +#define HMAC_finish(ctx, dig, dlen) HMAC_Final(ctx, dig, &dlen); HMAC_CTX_free(ctx) +#endif typedef RC4_KEY * RC4_handle; #define RC4_alloc(h) *h = malloc(sizeof(RC4_KEY)) @@ -117,7 +126,7 @@ { uint8_t digest[SHA256_DIGEST_LENGTH]; unsigned int digestLen = 0; - HMAC_CTX ctx; + HMAC_CTX* ctx = NULL; RC4_alloc(rc4keyIn); RC4_alloc(rc4keyOut); @@ -266,7 +275,7 @@ size_t keylen, uint8_t *digest) { unsigned int digestLen; - HMAC_CTX ctx; + HMAC_CTX* ctx = NULL; HMAC_setup(ctx, key, keylen); HMAC_crunch(ctx, message, messageLen); --- a/librtmp/hashswf.c +++ b/librtmp/hashswf.c @@ -37,9 +37,9 @@ #define SHA256_DIGEST_LENGTH 32 #endif #define HMAC_CTX sha2_context -#define HMAC_setup(ctx, key, len) sha2_hmac_starts(&ctx, (unsigned char *)key, len, 0) -#define HMAC_crunch(ctx, buf, len) sha2_hmac_update(&ctx, buf, len) -#define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; sha2_hmac_finish(&ctx, dig) +#define HMAC_setup(ctx, key, len) sha2_hmac_starts(ctx, (unsigned char *)key, len, 0) +#define HMAC_crunch(ctx, buf, len) sha2_hmac_update(ctx, buf, len) +#define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; sha2_hmac_finish(ctx, dig) #define HMAC_close(ctx) #elif defined(USE_GNUTLS) #include @@ -48,19 +48,27 @@ #endif #undef HMAC_CTX #define HMAC_CTX struct hmac_sha256_ctx -#define HMAC_setup(ctx, key, len) hmac_sha256_set_key(&ctx, len, key) -#define HMAC_crunch(ctx, buf, len) hmac_sha256_update(&ctx, len, buf) -#define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; hmac_sha256_digest(&ctx, SHA256_DIGEST_LENGTH, dig) +#define HMAC_setup(ctx, key, len) hmac_sha256_set_key(ctx, len, key) +#define HMAC_crunch(ctx, buf, len) hmac_sha256_update(ctx, len, buf) +#define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; hmac_sha256_digest(ctx, SHA256_DIGEST_LENGTH, dig) #define HMAC_close(ctx) #else /* USE_OPENSSL */ #include #include #include #include -#define HMAC_setup(ctx, key, len) HMAC_CTX_init(&ctx); HMAC_Init_ex(&ctx, (unsigned char *)key, len, EVP_sha256(), 0) -#define HMAC_crunch(ctx, buf, len) HMAC_Update(&ctx, (unsigned char *)buf, len) -#define HMAC_finish(ctx, dig, dlen) HMAC_Final(&ctx, (unsigned char *)dig, &dlen); -#define HMAC_close(ctx) HMAC_CTX_cleanup(&ctx) +#if OPENSSL_VERSION_NUMBER < 0x10100000L +#define HMAC_setup(ctx, key, len) HMAC_CTX_init(ctx); HMAC_Init_ex(ctx, (unsigned char *)key, len, EVP_sha256(), 0) +#else +#define HMAC_setup(ctx, key, len) ctx = HMAC_CTX_new(); HMAC_CTX_reset(ctx); HMAC_Init_ex(ctx, key, len, EVP_sha256(), 0) +#endif +#define HMAC_crunch(ctx, buf, len) HMAC_Update(ctx, (unsigned char *)buf, len) +#define HMAC_finish(ctx, dig, dlen) HMAC_Final(ctx, (unsigned char *)dig, &dlen); +#if OPENSSL_VERSION_NUMBER < 0x10100000L +#define HMAC_close(ctx) HMAC_CTX_cleanup(ctx) +#else +#define HMAC_close(ctx) HMAC_CTX_reset(ctx); HMAC_CTX_free(ctx) +#endif #endif extern void RTMP_TLS_Init(); @@ -289,7 +297,7 @@ struct info { z_stream *zs; - HMAC_CTX ctx; + HMAC_CTX *ctx; int first; int zlib; int size; ================================================ FILE: packages/multimedia/zvbi/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="zvbi" PKG_VERSION="0.2.35" PKG_SHA256="fc883c34111a487c4a783f91b1b2bb5610d8d8e58dcba80c7ab31e67e4765318" PKG_LICENSE="GPL2" PKG_SITE="http://zapping.sourceforge.net/ZVBI" PKG_URL="https://downloads.sourceforge.net/sourceforge/zapping/zvbi-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libpng zlib" PKG_LONGDESC="Library to provide functions to capture and decode VBI data." PKG_CONFIGURE_OPTS_TARGET="--disable-dvb \ --disable-bktr \ --disable-nls \ --disable-proxy \ --without-doxygen \ --without-x" ================================================ FILE: packages/multimedia/zvbi/patches/zvbi-0010-fix-static-linking.patch ================================================ --- a/configure +++ b/configure @@ -16515,7 +16515,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_destroy_write_struct" >&5 $as_echo "$ac_cv_lib_png_png_destroy_write_struct" >&6; } if test "x$ac_cv_lib_png_png_destroy_write_struct" = x""yes; then : - LIBS="$LIBS -lpng -lz" + LIBS="-lpng -lz $LIBS" else HAVE_PNG="no" fi --- a/configure.in +++ b/configure.in @@ -244,7 +244,7 @@ dnl (PNG page export) dnl HAVE_PNG="yes" AC_CHECK_LIB(png, png_destroy_write_struct, - LIBS="$LIBS -lpng -lz", HAVE_PNG="no", -lz -lm) + LIBS="-lpng $LIBS -lz -lm", HAVE_PNG="no", -lz -lm) if test "x$HAVE_PNG" = xyes; then AC_DEFINE(HAVE_LIBPNG, 1, [Define if you have libpng]) fi --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -19,4 +19,4 @@ EXTRA_DIST = \ INCLUDES = -I$(top_srcdir)/src LDADD = $(top_builddir)/src/libzvbi.la \ - $(PTHREAD_LIB) -lm $(PNG_LIB) + $(PTHREAD_LIB) $(PNG_LIB) -lm --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -262,7 +262,7 @@ EXTRA_DIST = \ INCLUDES = -I$(top_srcdir)/src LDADD = $(top_builddir)/src/libzvbi.la \ - $(PTHREAD_LIB) -lm $(PNG_LIB) + $(PTHREAD_LIB) $(PNG_LIB) -lm all: all-am ================================================ FILE: packages/multimedia/zvbi/patches/zvbi-0020-ioctl.patch ================================================ --- a/contrib/ntsc-cc.c +++ b/contrib/ntsc-cc.c @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include @@ -45,6 +44,7 @@ #include "src/libzvbi.h" #ifdef ENABLE_V4L2 +# include # include # include "src/videodev2k.h" #endif ================================================ FILE: packages/multimedia/zvbi/patches/zvbi-0030-ssize_max.patch ================================================ Linear memory extents over SSIZE_MAX are undefined, so there is no point in protecting against them. --- a/src/export.c +++ b/src/export.c @@ -1056,8 +1056,6 @@ size_t count; count = src_size; - if (unlikely (src_size > SSIZE_MAX)) - count = SSIZE_MAX & -4096; for (retry = 10;; --retry) { actual = write (e->_handle.fd, src, count); @@ -1614,12 +1612,7 @@ free (e->buffer.data); } - if (unlikely (e->buffer.offset > (size_t) SSIZE_MAX)) { - errno = EOVERFLOW; - actual = -1; /* failed */ - } else { - actual = e->buffer.offset; - } + actual = e->buffer.offset; } else { if (VBI_EXPORT_TARGET_ALLOC == e->target) free (e->buffer.data); ================================================ FILE: packages/multimedia/zvbi/patches/zvbi-0040-fix-clang-support.patch ================================================ --- a/src/misc.h +++ b/src/misc.h @@ -52,17 +52,6 @@ # define unlikely(expr) __builtin_expect(expr, 0) #endif -#undef __i386__ -#undef __i686__ -/* FIXME #cpu is deprecated -#if #cpu (i386) -# define __i386__ 1 -#endif -#if #cpu (i686) -# define __i686__ 1 -#endif -*/ - /* &x == PARENT (&x.tm_min, struct tm, tm_min), safer than &x == (struct tm *) &x.tm_min. A NULL _ptr is safe and will return NULL, not -offsetof(_member). */ @@ -156,8 +145,6 @@ #define likely(expr) (expr) #define unlikely(expr) (expr) -#undef __i386__ -#undef __i686__ static char * PARENT_HELPER (char *p, unsigned int offset) ================================================ FILE: packages/multimedia/zvbi/patches/zvbi-0050-prevent-test.patch ================================================ --- a/Makefile.am +++ b/Makefile.am @@ -22,8 +22,6 @@ SUBDIRS = \ src \ $(proxy_dirs) \ contrib \ - examples \ - test \ po \ doc --- a/Makefile.in +++ b/Makefile.in @@ -78,7 +78,7 @@ pkgconfigDATA_INSTALL = $(INSTALL_DATA) DATA = $(pkgconfig_DATA) ETAGS = etags CTAGS = ctags -DIST_SUBDIRS = m4 src daemon contrib examples test po doc +DIST_SUBDIRS = m4 src daemon contrib po doc DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -268,8 +268,6 @@ SUBDIRS = \ src \ $(proxy_dirs) \ contrib \ - examples \ - test \ po \ doc --- a/configure +++ b/configure @@ -18591,7 +18591,7 @@ else fi -ac_config_files="$ac_config_files Makefile contrib/Makefile examples/Makefile daemon/Makefile daemon/zvbid.init doc/Doxyfile doc/Makefile m4/Makefile src/Makefile src/dvb/Makefile test/Makefile po/Makefile.in zvbi.spec zvbi-0.2.pc" +ac_config_files="$ac_config_files Makefile contrib/Makefile daemon/Makefile daemon/zvbid.init doc/Doxyfile doc/Makefile m4/Makefile src/Makefile src/dvb/Makefile po/Makefile.in zvbi.spec zvbi-0.2.pc" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -19726,7 +19726,6 @@ do "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "contrib/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/Makefile" ;; - "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; "daemon/Makefile") CONFIG_FILES="$CONFIG_FILES daemon/Makefile" ;; "daemon/zvbid.init") CONFIG_FILES="$CONFIG_FILES daemon/zvbid.init" ;; "doc/Doxyfile") CONFIG_FILES="$CONFIG_FILES doc/Doxyfile" ;; @@ -19734,7 +19733,6 @@ do "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/dvb/Makefile") CONFIG_FILES="$CONFIG_FILES src/dvb/Makefile" ;; - "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "zvbi.spec") CONFIG_FILES="$CONFIG_FILES zvbi.spec" ;; "zvbi-0.2.pc") CONFIG_FILES="$CONFIG_FILES zvbi-0.2.pc" ;; --- a/configure.in +++ b/configure.in @@ -384,7 +384,6 @@ AM_CONDITIONAL(BUILD_STATIC_LIB, [test "x$enable_static" = xyes]) AC_OUTPUT([ Makefile contrib/Makefile - examples/Makefile daemon/Makefile daemon/zvbid.init doc/Doxyfile @@ -392,7 +391,6 @@ AC_OUTPUT([ m4/Makefile src/Makefile src/dvb/Makefile - test/Makefile po/Makefile.in zvbi.spec zvbi-0.2.pc ================================================ FILE: packages/network/avahi/debug.d/avahi.conf ================================================ AVAHI_DEBUG="--debug" ================================================ FILE: packages/network/avahi/default.d/avahi.conf ================================================ ================================================ FILE: packages/network/avahi/package.mk ================================================ # 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) PKG_NAME="avahi" PKG_VERSION="0.8" PKG_SHA256="c15e750ef7c6df595fb5f2ce10cac0fee2353649600e6919ad08ae8871e4945f" PKG_LICENSE="GPL" PKG_SITE="http://avahi.org/" PKG_URL="https://github.com/lathiat/avahi/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain expat libdaemon dbus connman gettext" PKG_LONGDESC="Service Discovery for Linux using mDNS/DNS-SD, compatible with Bonjour." PKG_TOOLCHAIN="configure" PKG_CONFIGURE_OPTS_TARGET="py_cv_mod_gtk_=yes \ py_cv_mod_dbus_=yes \ ac_cv_func_chroot=no \ --with-distro=none \ --enable-static \ --disable-glib \ --disable-gobject \ --disable-qt3 \ --disable-qt4 \ --disable-qt5 \ --disable-gtk \ --disable-gtk3 \ --enable-dbus \ --disable-dbm \ --disable-gdbm \ --enable-libdaemon \ --disable-python \ --disable-python-dbus \ --disable-mono \ --disable-monodoc \ --disable-autoipd \ --disable-doxygen-doc \ --disable-doxygen-dot \ --disable-doxygen-man \ --disable-doxygen-rtf \ --disable-doxygen-xml \ --disable-doxygen-chm \ --disable-doxygen-chi \ --disable-doxygen-html \ --disable-doxygen-ps \ --disable-doxygen-pdf \ --disable-core-docs \ --disable-manpages \ --disable-xmltoman \ --disable-tests \ --disable-libevent \ --enable-compat-libdns_sd \ --disable-compat-howl \ --disable-rpath \ --with-xml=expat \ --with-avahi-user=avahi \ --with-avahi-group=avahi \ --disable-nls" pre_configure_target() { NOCONFIGURE=1 ./autogen.sh } post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { # disable wide-area sed -e "s,^.*enable-wide-area=.*$,enable-wide-area=no,g" -i ${INSTALL}/etc/avahi/avahi-daemon.conf # publish-hinfo sed -e "s,^.*publish-hinfo=.*$,publish-hinfo=no,g" -i ${INSTALL}/etc/avahi/avahi-daemon.conf # publish-workstation sed -e "s,^.*publish-workstation=.*$,publish-workstation=no,g" -i ${INSTALL}/etc/avahi/avahi-daemon.conf # browse domains? sed -e "s,^.*browse-domains=.*$,# browse-domains=,g" -i ${INSTALL}/etc/avahi/avahi-daemon.conf # set root user as default sed -e "s,22,22\n path=/storage\n u=root,g" -i ${INSTALL}/etc/avahi/services/sftp-ssh.service rm -rf ${INSTALL}/etc/avahi/avahi-dnsconfd.action if [ ! ${SFTP_SERVER} = "yes" ]; then rm -rf ${INSTALL}/etc/avahi/services/ssh.service rm -rf ${INSTALL}/etc/avahi/services/sftp-ssh.service fi rm -rf ${INSTALL}/usr/lib/systemd rm -f ${INSTALL}/usr/share/dbus-1/system-services/org.freedesktop.Avahi.service rm -f ${INSTALL}/usr/sbin/avahi-dnsconfd rm -f ${INSTALL}/usr/bin/avahi-bookmarks rm -f ${INSTALL}/usr/bin/avahi-publish* rm -f ${INSTALL}/usr/bin/avahi-resolve* rm -f ${INSTALL}/usr/lib/libdns_sd* mkdir -p ${INSTALL}/usr/share/services cp -P ${PKG_DIR}/default.d/*.conf ${INSTALL}/usr/share/services } post_install() { add_user avahi x 495 495 "avahi-daemon" "/var/run/avahi-daemon" "/bin/sh" add_group avahi 495 enable_service avahi-defaults.service enable_service avahi-daemon.service } ================================================ FILE: packages/network/avahi/system.d/avahi-daemon.service ================================================ [Unit] Description=Avahi Daemon After=network.target avahi-defaults.service Requires=avahi-defaults.service ConditionPathExists=/storage/.cache/services/avahi.conf [Service] Restart=on-failure EnvironmentFile=-/run/libreelec/debug/avahi.conf ExecStart=/usr/sbin/avahi-daemon -s $AVAHI_DEBUG ExecReload=/usr/sbin/avahi-daemon -r TimeoutStopSec=1s RestartSec=2 StartLimitInterval=60 StartLimitBurst=10 [Install] WantedBy=multi-user.target ================================================ FILE: packages/network/avahi/system.d/avahi-defaults.service ================================================ [Unit] Description=Avahi defaults After=local-fs.target ConditionPathExists=!/storage/.cache/services/avahi.conf ConditionPathExists=!/storage/.cache/services/avahi.disabled [Service] Type=oneshot ExecStart=/bin/sh -c 'cp /usr/share/services/avahi.conf /storage/.cache/services/' RemainAfterExit=yes ================================================ FILE: packages/network/bluez/debug.d/bluez.conf ================================================ BLUEZ_DEBUG="--debug" ================================================ FILE: packages/network/bluez/debug.d/obexd.conf ================================================ OBEXD_DEBUG="--debug" ================================================ FILE: packages/network/bluez/default.d/bluez.conf ================================================ ================================================ FILE: packages/network/bluez/package.mk ================================================ # 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="bluez" PKG_VERSION="5.72" PKG_SHA256="499d7fa345a996c1bb650f5c6749e1d929111fa6ece0be0e98687fee6124536e" PKG_LICENSE="GPL" PKG_SITE="http://www.bluez.org/" PKG_URL="https://www.kernel.org/pub/linux/bluetooth/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain dbus glib readline systemd" PKG_LONGDESC="Bluetooth Tools and System Daemons for Linux." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+lto" if build_with_debug; then BLUEZ_CONFIG="--enable-debug" else BLUEZ_CONFIG="--disable-debug" fi BLUEZ_CONFIG+=" --enable-monitor --enable-test" PKG_CONFIGURE_OPTS_TARGET="--disable-dependency-tracking \ --disable-silent-rules \ --enable-library \ --enable-udev \ --disable-cups \ --disable-obex \ --enable-client \ --enable-systemd \ --enable-tools \ --enable-deprecated \ --enable-datafiles \ --disable-manpages \ --disable-experimental \ --enable-sixaxis \ --with-gnu-ld \ ${BLUEZ_CONFIG} \ storagedir=/storage/.cache/bluetooth" pre_configure_target() { # bluez fails to build in subdirs cd ${PKG_BUILD} rm -rf .${TARGET_NAME} export LIBS="-lncurses" } post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { safe_remove ${INSTALL}/usr/lib/systemd safe_remove ${INSTALL}/usr/bin/bluemoon safe_remove ${INSTALL}/usr/bin/ciptool mkdir -p ${INSTALL}/etc/bluetooth cp src/main.conf ${INSTALL}/etc/bluetooth sed -i ${INSTALL}/etc/bluetooth/main.conf \ -e "s|^#\[Policy\]|\[Policy\]|g" \ -e "s|^#AutoEnable.*|AutoEnable=true|g" \ -e "s|^#JustWorksRepairing.*|JustWorksRepairing=always|g" echo "[General]" > ${INSTALL}/etc/bluetooth/input.conf echo "ClassicBondedOnly=false" >> ${INSTALL}/etc/bluetooth/input.conf mkdir -p ${INSTALL}/usr/share/services cp -P ${PKG_DIR}/default.d/*.conf ${INSTALL}/usr/share/services # bluez looks in /etc/firmware/ ln -sf /usr/lib/firmware ${INSTALL}/etc/firmware # pulseaudio checks for bluez via pkgconfig but lib is not actually needed sed -i 's/-lbluetooth//g' ${PKG_BUILD}/lib/bluez.pc cp -P ${PKG_BUILD}/lib/bluez.pc ${SYSROOT_PREFIX}/usr/lib/pkgconfig # copy bluezutils.py mkdir -p ${INSTALL}/usr/lib/${PKG_PYTHON_VERSION} cp -rf ${INSTALL}/usr/lib/bluez/test/bluezutils.py ${INSTALL}/usr/lib/${PKG_PYTHON_VERSION} rm -rf ${INSTALL}/usr/lib/bluez/test } post_install() { enable_service bluetooth-defaults.service enable_service bluetooth.service enable_service obex.service } ================================================ FILE: packages/network/bluez/patches/bluez-01_add-obexd-policy.patch ================================================ diff --git a/src/bluetooth.conf b/src/bluetooth.conf index 8a1e258..31b7542 100644 --- a/src/bluetooth.conf +++ b/src/bluetooth.conf @@ -20,10 +20,24 @@ + + + + + + + + + + + + + + ================================================ FILE: packages/network/bluez/patches/bluez-02_obexd-use-system-bus.patch ================================================ From 20dfa1079c088236bcd63f1a986956b488177ebf Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 6 Aug 2013 11:18:09 +0300 Subject: [PATCH] obexd: use system bus --- obexd/src/manager.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/obexd/src/manager.c b/obexd/src/manager.c index dbfbef8..9a29f8c 100644 --- a/obexd/src/manager.c +++ b/obexd/src/manager.c @@ -569,7 +569,7 @@ gboolean manager_init(void) dbus_error_init(&err); - connection = g_dbus_setup_bus(DBUS_BUS_SESSION, OBEXD_SERVICE, &err); + connection = g_dbus_setup_bus(DBUS_BUS_SYSTEM, OBEXD_SERVICE, &err); if (connection == NULL) { if (dbus_error_is_set(&err) == TRUE) { fprintf(stderr, "%s\n", err.message); -- 1.7.2.5 ================================================ FILE: packages/network/bluez/patches/bluez-03_storagedir.patch ================================================ diff -Naur bluez-5.7/configure.ac bluez-5.7.patch/configure.ac --- bluez-5.7/configure.ac 2013-06-26 18:17:07.000000000 +0200 +++ bluez-5.7.patch/configure.ac 2013-07-12 20:21:17.000000000 +0200 @@ -238,10 +238,13 @@ prefix="${ac_default_prefix}" fi -if (test "$localstatedir" = '${prefix}/var'); then - storagedir="${prefix}/var/lib/bluetooth" -else - storagedir="${localstatedir}/lib/bluetooth" + +if (test "x$storagedir" = 'x'); then + if (test "$localstatedir" = '${prefix}/var'); then + storagedir="${prefix}/var/lib/bluetooth" + else + storagedir="${localstatedir}/lib/bluetooth" + fi fi AC_DEFINE_UNQUOTED(STORAGEDIR, "${storagedir}", [Directory for the storage files]) ================================================ FILE: packages/network/bluez/patches/bluez-04_work-around-Logitech-diNovo-Edge-keyboard-firmware-i.patch ================================================ From aa73bf5039dfd2cf0a52dd6fd22501d955cc1a00 Mon Sep 17 00:00:00 2001 From: Tommy Date: Thu, 10 Jan 2013 09:18:43 +0100 Subject: [PATCH] work around Logitech diNovo Edge keyboard firmware issue https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/269851 --- tools/hid2hci.rules | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/tools/hid2hci.rules b/tools/hid2hci.rules index db6bb03..7db4572 100644 --- a/tools/hid2hci.rules +++ b/tools/hid2hci.rules @@ -11,7 +11,10 @@ ATTR{bInterfaceClass}=="03", ATTR{bInterfaceSubClass}=="01", ATTR{bInterfaceProt RUN+="hid2hci --method=dell --devpath=%p", ENV{HID2HCI_SWITCH}="1" # Logitech devices -KERNEL=="hiddev*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c70[345abce]|c71[34bc]", \ +KERNEL=="hiddev*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c70[345abce]|c71[3bc]", \ + RUN+="hid2hci --method=logitech-hid --devpath=%p" +# Logitech, Inc. diNovo Edge Keyboard +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c714", \ RUN+="hid2hci --method=logitech-hid --devpath=%p" ENV{DEVTYPE}!="usb_device", GOTO="hid2hci_end" -- 1.8.0.1 ================================================ FILE: packages/network/bluez/patches/bluez-05-046d-c52b-Logitech-Inc.-Unifying-Receiver.patch ================================================ From 50f34d1b65c2fb6c557e2b802e908986e8ec0b74 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Fri, 7 Feb 2014 12:50:29 +0200 Subject: [PATCH] 046d:c52b Logitech, Inc. Unifying Receiver --- tools/hid2hci.rules | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/tools/hid2hci.rules b/tools/hid2hci.rules index 7db4572..1feca6e 100644 --- a/tools/hid2hci.rules +++ b/tools/hid2hci.rules @@ -16,6 +16,9 @@ KERNEL=="hiddev*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c70[345abce]|c71[ # Logitech, Inc. diNovo Edge Keyboard KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c714", \ RUN+="hid2hci --method=logitech-hid --devpath=%p" +# Logitech, Inc. Unifying Receiver +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c52b", \ + RUN+="hid2hci --method=logitech-hid --devpath=%p" ENV{DEVTYPE}!="usb_device", GOTO="hid2hci_end" -- 1.7.2.5 ================================================ FILE: packages/network/bluez/patches/bluez-06-raspberry-pi-mods.patch ================================================ Description: Patches for compatibility with on-board Bluetooth on RPi 3 Author: Simon Long Last-Update: 2017-04-05 --- a/tools/hciattach.c +++ b/tools/hciattach.c @@ -1091,6 +1091,9 @@ { "bcm43xx", 0x0000, 0x0000, HCI_UART_H4, 115200, 3000000, FLOW_CTL, DISABLE_PM, NULL, bcm43xx, NULL }, + { "bcm43xx-3wire", 0x0000, 0x0000, HCI_UART_3WIRE, 115200, 3000000, + 0, DISABLE_PM, NULL, bcm43xx, NULL }, + { "ath3k", 0x0000, 0x0000, HCI_UART_ATH3K, 115200, 115200, FLOW_CTL, DISABLE_PM, NULL, ath3k_ps, ath3k_pm }, @@ -1237,7 +1240,7 @@ { struct uart_t *u = NULL; int detach, printpid, raw, opt, i, n, ld, err; - int to = 10; + int to = 30; int init_speed = 0; int send_break = 0; pid_t pid; --- a/tools/hciattach.h +++ b/tools/hciattach.h @@ -44,7 +45,7 @@ #define HCI_UART_VND_DETECT 5 #ifndef FIRMWARE_DIR -#define FIRMWARE_DIR "/etc/firmware" +#define FIRMWARE_DIR "/lib/firmware" #endif int read_hci_event(int fd, unsigned char *buf, int size); --- a/tools/hciattach_bcm43xx.c +++ b/tools/hciattach_bcm43xx.c @@ -36,6 +36,7 @@ #include #include #include +#include #include "lib/bluetooth.h" #include "lib/hci.h" @@ -303,9 +304,23 @@ static int bcm43xx_locate_patch(const char *dir_name, const char *chip_name, char *location) { + struct stat statbuf; + char path[PATH_MAX]; DIR *dir; int ret = -1; + /* Try an exact match before scanning, otherwise a board without a specific + * firmware/link may end up loading a specific firmware for another board + * just because it is encountered first. + */ + if (snprintf(path, PATH_MAX, "%s/%s%s", dir_name, chip_name, FW_EXT) < 0) + return -1; + if ((stat(path, &statbuf) == 0) && S_ISREG(statbuf.st_mode)) { + strcpy(location, path); + return 0; + } + + /* Now search subdirectories and files with suffixes */ dir = opendir(dir_name); if (!dir) { fprintf(stderr, "Cannot open directory '%s': %s\n", @@ -320,8 +335,6 @@ break; if (entry->d_type & DT_DIR) { - char path[PATH_MAX]; - if (!strcmp(entry->d_name, "..") || !strcmp(entry->d_name, ".")) continue; @@ -341,8 +354,10 @@ break; /* found */ - snprintf(location, PATH_MAX, "%s/%s", dir_name, entry->d_name); - ret = 0; + if (snprintf(location, PATH_MAX, "%s/%s", dir_name, entry->d_name) < 0) + ret = -1; + else + ret = 0; break; } } @@ -352,11 +367,32 @@ return ret; } +static int get_board_type(char *buf, int buf_size) +{ + int bytes_read; + int len; + int fd; + + fd = open("/sys/firmware/devicetree/base/compatible", O_RDONLY); + if (fd < 0) + return -1; + + bytes_read = read(fd, buf, buf_size); + close(fd); + if (bytes_read < 0) + return -1; + + len = strnlen(buf, buf_size); + return (len < buf_size) ? len : -1; +} + int bcm43xx_init(int fd, int def_speed, int speed, struct termios *ti, const char *bdaddr) { char chip_name[20]; + char board_specific_name[sizeof(chip_name) + 64]; char fw_path[PATH_MAX]; + int chip_name_len; printf("bcm43xx_init\n"); @@ -366,12 +402,17 @@ if (bcm43xx_read_local_name(fd, chip_name, sizeof(chip_name))) return -1; - if (bcm43xx_locate_patch(FIRMWARE_DIR, chip_name, fw_path)) { - fprintf(stderr, "Patch not found, continue anyway\n"); + /* Grab the board compatible string from Device Tree */ + chip_name_len = strlen(chip_name); + memcpy(board_specific_name, chip_name, chip_name_len); + board_specific_name[chip_name_len++] = '.'; + + if (((get_board_type(board_specific_name + chip_name_len, + sizeof(board_specific_name) - chip_name_len) < 0) || + bcm43xx_locate_patch(FIRMWARE_DIR, board_specific_name, fw_path)) && + bcm43xx_locate_patch(FIRMWARE_DIR, chip_name, fw_path)) { + fprintf(stderr, "Patch not found for %s, continue anyway\n", chip_name); } else { - if (bcm43xx_set_speed(fd, ti, speed)) - return -1; - if (bcm43xx_load_firmware(fd, fw_path)) return -1; @@ -381,6 +422,7 @@ return -1; } + sleep(1); if (bcm43xx_reset(fd)) return -1; } ================================================ FILE: packages/network/bluez/patches/bluez-08-hciattach-retry-device-reset-when-no-response.patch ================================================ From 57f7aead147b138109709bbef9d4c674a3a6dc9b Mon Sep 17 00:00:00 2001 From: meijjaa Date: Mon, 23 Jan 2017 22:35:33 +0100 Subject: [PATCH] hciattach: retry device reset when no response Some bcm chips need a couple of retries to reset. Currently init will just timeout after a failed reset. Signed-off-by: meijjaa --- tools/hciattach_bcm43xx.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tools/hciattach_bcm43xx.c b/tools/hciattach_bcm43xx.c index bb24483..ad89161 100644 --- a/tools/hciattach_bcm43xx.c +++ b/tools/hciattach_bcm43xx.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "lib/bluetooth.h" #include "lib/hci.h" @@ -82,21 +83,31 @@ fail: return -1; } +int _fd; +void expired(int sig) +{ + unsigned char cmd[] = { HCI_COMMAND_PKT, 0x03, 0x0C, 0x00 }; + write(_fd, cmd, sizeof(cmd)) != sizeof(cmd); + alarm(4); +} + static int bcm43xx_reset(int fd) { unsigned char cmd[] = { HCI_COMMAND_PKT, 0x03, 0x0C, 0x00 }; unsigned char resp[CC_MIN_SIZE]; + _fd = fd; + signal(SIGALRM, expired); if (write(fd, cmd, sizeof(cmd)) != sizeof(cmd)) { fprintf(stderr, "Failed to write reset command\n"); return -1; } - + alarm(4); if (read_hci_event(fd, resp, sizeof(resp)) < CC_MIN_SIZE) { fprintf(stderr, "Failed to reset chip, invalid HCI event\n"); return -1; } - + alarm(0); if (resp[4] != cmd[1] || resp[5] != cmd[2] || resp[6] != CMD_SUCCESS) { fprintf(stderr, "Failed to reset chip, command failure\n"); return -1; -- 2.38.1 ================================================ FILE: packages/network/bluez/patches/bluez-11_sixaxis-fix-PID-navigation-controller.patch ================================================ From ccc0a0cba8a2fdb8cfb148276e7c9413a3e22dc8 Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Thu, 19 Sep 2019 22:48:19 +0100 Subject: [PATCH] sixaxis: Fix PID for Navigation Controller Newsgroups: gmane.linux.bluez.kernel Date: 2015-06-15 18:28:26 GMT (36 weeks, 4 days, 21 hours and 32 minutes ago) Navigation Controller is using PID 0x042f over USB but PID 0x0268 (same as Dualshock 3) over BT. --- plugins/sixaxis.c | 8 +++++++- profiles/input/sixaxis.h | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins/sixaxis.c b/plugins/sixaxis.c index 939fed7..f6baea7 100644 --- a/plugins/sixaxis.c +++ b/plugins/sixaxis.c @@ -364,7 +364,13 @@ static bool setup_device(int fd, const char *sysfs_path, info("sixaxis: setting up new device"); btd_device_device_set_name(device, cp->name); - btd_device_set_pnpid(device, cp->source, cp->vid, cp->pid, cp->version); + + /* if device reports different pid/vid on BT prefer those over USB */ + if (cp->bt_pid) + btd_device_set_pnpid(device, cp->source, cp->vid, cp->bt_pid, cp->version); + else + btd_device_set_pnpid(device, cp->source, cp->vid, cp->pid, cp->version); + btd_device_set_temporary(device, true); closure = g_new0(struct authentication_closure, 1); diff --git a/profiles/input/sixaxis.h b/profiles/input/sixaxis.h index 8e6f3cc..321a918 100644 --- a/profiles/input/sixaxis.h +++ b/profiles/input/sixaxis.h @@ -38,6 +38,7 @@ struct cable_pairing { uint16_t vid; uint16_t pid; uint16_t version; + uint16_t bt_pid; CablePairingType type; }; @@ -59,6 +60,7 @@ get_pairing(uint16_t vid, uint16_t pid) .vid = 0x054c, .pid = 0x042f, .version = 0x0000, + .bt_pid = 0x0268, .type = CABLE_PAIRING_SIXAXIS, }, { -- 2.7.4 ================================================ FILE: packages/network/bluez/patches/bluez-12-fix-obexd-after-5_50.patch ================================================ diff --git a/Makefile.obexd b/Makefile.obexd index cd3ace4..89f1609 100644 --- a/Makefile.obexd +++ b/Makefile.obexd @@ -8,8 +8,6 @@ endif EXTRA_DIST += obexd/src/obex.service.in obexd/src/org.bluez.obex.service -if OBEX - obex_plugindir = $(libdir)/obex/plugins obexd_builtin_modules = @@ -33,6 +31,8 @@ obexd_builtin_sources += obexd/plugins/opp.c obexd_builtin_modules += ftp obexd_builtin_sources += obexd/plugins/ftp.c obexd/plugins/ftp.h +if OBEX + obexd_builtin_modules += irmc obexd_builtin_sources += obexd/plugins/irmc.c @@ -47,6 +47,8 @@ obexd_builtin_sources += obexd/plugins/mas.c obexd/src/map_ap.h \ obexd/plugins/messages.h \ obexd/plugins/messages-dummy.c +endif + obexd_builtin_modules += mns obexd_builtin_sources += obexd/client/mns.c obexd/src/map_ap.h \ obexd/client/map-event.h @@ -90,8 +92,6 @@ obexd_src_obexd_CFLAGS = $(AM_CFLAGS) @GLIB_CFLAGS@ @DBUS_CFLAGS@ \ obexd_src_obexd_CPPFLAGS = -I$(builddir)/lib -I$(builddir)/obexd/src -endif - obexd_src_obexd_SHORTNAME = obexd obexd_builtin_files = obexd/src/builtin.h $(obexd_builtin_nodist) ================================================ FILE: packages/network/bluez/patches/bluez-21-hciattach-add-QCA9377-Tuffello-support.patch ================================================ From b42a087411199d7f480f1683bddd3206c5fd17b1 Mon Sep 17 00:00:00 2001 From: Gary Bisson Date: Wed, 17 Aug 2016 11:36:28 +0200 Subject: [PATCH] hciattach: add QCA9377 Tuffello support From CodeAurora repository: https://source.codeaurora.org/quic/la/platform/external/bluetooth/bluez/ Modifications: - code indentation - remove verbose traces - use H4 protocol instead of IBS Also squashed: hciattach_rome: simplify baudrate setting hciattach_rome: do not override module internal MAC address hciattach_rome: force IBS to disabled in NVM hciattach_rome: display ROM and TLV info by default Signed-off-by: Gary Bisson --- Makefile.tools | 1 + android/Android.mk | 1 + tools/hciattach.c | 12 + tools/hciattach.h | 1 + tools/hciattach_rome.c | 1872 ++++++++++++++++++++++++++++++++++++++++ tools/hciattach_rome.h | 388 +++++++++ 6 files changed, 2275 insertions(+) create mode 100644 tools/hciattach_rome.c create mode 100644 tools/hciattach_rome.h diff --git a/Makefile.tools b/Makefile.tools index b7b422506..e0e995089 100644 --- a/Makefile.tools +++ b/Makefile.tools @@ -304,6 +304,7 @@ tools_hciattach_SOURCES = tools/hciattach.c tools/hciattach.h \ tools/hciattach_ti.c \ tools/hciattach_tialt.c \ tools/hciattach_ath3k.c \ + tools/hciattach_rome.c \ tools/hciattach_qualcomm.c \ tools/hciattach_intel.c \ tools/hciattach_bcm43xx.c diff --git a/android/Android.mk b/android/Android.mk index 76a826b47..01599c04b 100644 --- a/android/Android.mk +++ b/android/Android.mk @@ -696,6 +696,7 @@ LOCAL_SRC_FILES := \ bluez/tools/hciattach_ti.c \ bluez/tools/hciattach_tialt.c \ bluez/tools/hciattach_ath3k.c \ + bluez/tools/hciattach_rome.c \ bluez/tools/hciattach_qualcomm.c \ bluez/tools/hciattach_intel.c \ bluez/tools/hciattach_bcm43xx.c \ diff --git a/tools/hciattach.c b/tools/hciattach.c index fad176c9b..02a65c692 100644 --- a/tools/hciattach.c +++ b/tools/hciattach.c @@ -263,6 +263,11 @@ static int ath3k_pm(int fd, struct uart_t *u, struct termios *ti) return ath3k_post(fd, u->pm); } +static int qca(int fd, struct uart_t *u, struct termios *ti) +{ + return qca_soc_init(fd, u->speed, u->bdaddr); +} + static int qualcomm(int fd, struct uart_t *u, struct termios *ti) { return qualcomm_init(fd, u->speed, ti, u->bdaddr); @@ -1093,6 +1098,10 @@ struct uart_t uart[] = { { "ath3k", 0x0000, 0x0000, HCI_UART_ATH3K, 115200, 115200, FLOW_CTL, DISABLE_PM, NULL, ath3k_ps, ath3k_pm }, + /* QCA ROME */ + { "qca", 0x0000, 0x0000, HCI_UART_H4, 115200, 115200, + FLOW_CTL, DISABLE_PM, NULL, qca, NULL }, + /* QUALCOMM BTS */ { "qualcomm", 0x0000, 0x0000, HCI_UART_H4, 115200, 115200, FLOW_CTL, DISABLE_PM, NULL, qualcomm, NULL }, @@ -1145,6 +1154,9 @@ static int init_uart(char *dev, struct uart_t *u, int send_break, int raw) if (u->flags & AMP_DEV) flags |= 1 << HCI_UART_CREATE_AMP; + if (!strncmp(u->type, "qca", 3)) + flags |= 1 << HCI_UART_RESET_ON_INIT; + fd = open(dev, O_RDWR | O_NOCTTY); if (fd < 0) { perror("Can't open serial port"); diff --git a/tools/hciattach.h b/tools/hciattach.h index 249aab49e..85c801ccf 100644 --- a/tools/hciattach.h +++ b/tools/hciattach.h @@ -65,6 +65,7 @@ int bgb2xx_init(int dd, bdaddr_t *bdaddr); int ath3k_init(int fd, int speed, int init_speed, char *bdaddr, struct termios *ti); int ath3k_post(int fd, int pm); +int qca_soc_init(int fd, int speed, char *bdaddr); int qualcomm_init(int fd, int speed, struct termios *ti, const char *bdaddr); int intel_init(int fd, int init_speed, int *speed, struct termios *ti); int bcm43xx_init(int fd, int def_speed, int speed, struct termios *ti, diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c new file mode 100644 index 000000000..9a7f222c4 --- /dev/null +++ b/tools/hciattach_rome.c @@ -0,0 +1,1872 @@ +/* + * + * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Not a Contribution. + * + * Copyright 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you + * may not use this file except in compliance with the License. You may + * obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. + * + */ + +/****************************************************************************** + * + * Filename: hciattach_rome.c + * + * Description: Contains controller-specific functions, like + * firmware patch download + * low power mode operations + * + ******************************************************************************/ + +#define MODULE_HAS_MAC_ADDR +#define LOG_TAG "bt_vendor" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "hciattach_rome.h" +#include "hciattach.h" + +/****************************************************************************** + ** Variables + ******************************************************************************/ +FILE *file; +unsigned char *phdr_buffer; +unsigned char *pdata_buffer = NULL; +patch_info rampatch_patch_info; +int rome_ver = ROME_VER_UNKNOWN; +unsigned char gTlv_type; +unsigned char gtlv_dwndcfg; +char *rampatch_file_path; +char *nvm_file_path; +vnd_userial_cb_t vnd_userial; +unsigned char wait_vsc_evt = TRUE; + +/***************************************************************************** + ** Functions + *****************************************************************************/ + +/******************************************************************************* + ** + ** Function userial_to_tcio_baud + ** + ** Description helper function converts USERIAL baud rates into TCIO + ** conforming baud rates + ** + ** Returns TRUE/FALSE + ** + *******************************************************************************/ +unsigned char userial_to_tcio_baud(unsigned char cfg_baud, unsigned int *baud) +{ + if (cfg_baud == USERIAL_BAUD_115200) + *baud = B115200; + else if (cfg_baud == USERIAL_BAUD_4M) + *baud = B4000000; + else if (cfg_baud == USERIAL_BAUD_3M) + *baud = B3000000; + else if (cfg_baud == USERIAL_BAUD_2M) + *baud = B2000000; + else if (cfg_baud == USERIAL_BAUD_1M) + *baud = B1000000; + else if (cfg_baud == USERIAL_BAUD_921600) + *baud = B921600; + else if (cfg_baud == USERIAL_BAUD_460800) + *baud = B460800; + else if (cfg_baud == USERIAL_BAUD_230400) + *baud = B230400; + else if (cfg_baud == USERIAL_BAUD_57600) + *baud = B57600; + else if (cfg_baud == USERIAL_BAUD_19200) + *baud = B19200; + else if (cfg_baud == USERIAL_BAUD_9600) + *baud = B9600; + else if (cfg_baud == USERIAL_BAUD_1200) + *baud = B1200; + else if (cfg_baud == USERIAL_BAUD_600) + *baud = B600; + else { + fprintf(stderr, "userial vendor open: unsupported baud idx %i\n", cfg_baud); + *baud = B115200; + return FALSE; + } + + return TRUE; +} + + +/******************************************************************************* + ** + ** Function userial_vendor_set_baud + ** + ** Description Set new baud rate + ** + ** Returns None + ** + *******************************************************************************/ +void userial_vendor_set_baud(unsigned char userial_baud) +{ + unsigned int tcio_baud; + + if (tcgetattr(vnd_userial.fd, &vnd_userial.termios) < 0) { + perror("Can't get port settings"); + return; + } + cfmakeraw(&vnd_userial.termios); + vnd_userial.termios.c_cflag |= CLOCAL; + vnd_userial.termios.c_cflag |= CREAD; + vnd_userial.termios.c_cflag |= CS8; + tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios); + + userial_to_tcio_baud(userial_baud, &tcio_baud); + + cfsetospeed(&vnd_userial.termios, tcio_baud); + cfsetispeed(&vnd_userial.termios, tcio_baud); + tcsetattr(vnd_userial.fd, TCSADRAIN, &vnd_userial.termios); /* don't change speed until last write done */ + +} + + +/******************************************************************************* + ** + ** Function userial_vendor_ioctl + ** + ** Description ioctl inteface + ** + ** Returns None + ** + *******************************************************************************/ +int userial_vendor_ioctl(int fd, userial_vendor_ioctl_op_t op, int *p_data) +{ + int err = -1; + struct termios ti; + + if (tcgetattr(fd, &ti) < 0) { + perror("Can't get port settings"); + return -1; + } + cfmakeraw(&ti); + ti.c_cflag |= CLOCAL; + ti.c_cflag |= CREAD; + ti.c_cflag |= CS8; + + switch(op) { +#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) + case USERIAL_OP_ASSERT_BT_WAKE: + VNDUSERIALDBG("## userial_vendor_ioctl: Asserting BT_Wake ##"); + err = ioctl(fd, USERIAL_IOCTL_BT_WAKE_ASSERT, NULL); + break; + + case USERIAL_OP_DEASSERT_BT_WAKE: + VNDUSERIALDBG("## userial_vendor_ioctl: De-asserting BT_Wake ##"); + err = ioctl(fd, USERIAL_IOCTL_BT_WAKE_DEASSERT, NULL); + break; + + case USERIAL_OP_GET_BT_WAKE_STATE: + err = ioctl(fd, USERIAL_IOCTL_BT_WAKE_GET_ST, p_data); + break; +#endif // (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) + case USERIAL_OP_FLOW_ON: + ti.c_cflag |= CRTSCTS; + if (err = tcsetattr(fd, TCSANOW, &ti) < 0) { + perror("Can't set port settings"); + return -1; + } + + break; + + case USERIAL_OP_FLOW_OFF: + ti.c_cflag &= ~CRTSCTS; + if (err = tcsetattr(fd, TCSANOW, &ti) < 0) { + fprintf(stderr, "Can't set port settings"); + return -1; + } + break; + + default: + break; + } + + return err; +} + + +int get_vs_hci_event(unsigned char *rsp) +{ + int err = 0, soc_id =0; + unsigned char paramlen = 0; + + if ( (rsp[EVENTCODE_OFFSET] == VSEVENT_CODE) || (rsp[EVENTCODE_OFFSET] == EVT_CMD_COMPLETE)) + PR_DBG("%s: Received HCI-Vendor Specific event\n", __FUNCTION__); + else { + fprintf(stderr, "%s: Failed to receive HCI-Vendor Specific event\n", __FUNCTION__); + err = -EIO; + goto failed; + } + + /* Check the status of the operation */ + switch ( rsp[CMD_RSP_OFFSET] ) { + case EDL_CMD_REQ_RES_EVT: + switch(rsp[RSP_TYPE_OFFSET]) { + case EDL_PATCH_VER_RES_EVT: + case EDL_APP_VER_RES_EVT: + PR_INFO("Current Product ID\t\t: 0x%08x\n", + (unsigned int)(rsp[PATCH_PROD_ID_OFFSET +3] << 24 | + rsp[PATCH_PROD_ID_OFFSET+2] << 16 | + rsp[PATCH_PROD_ID_OFFSET+1] << 8 | + rsp[PATCH_PROD_ID_OFFSET] )); + + /* Patch Version indicates FW patch version */ + PR_INFO("Current Patch Version\t\t: 0x%04x\n", + (unsigned short)(rsp[PATCH_PATCH_VER_OFFSET + 1] << 8 | + rsp[PATCH_PATCH_VER_OFFSET] )); + + /* ROM Build Version indicates ROM build version like 1.0/1.1/2.0 */ + rome_ver = (int)(rsp[PATCH_ROM_BUILD_VER_OFFSET + 1] << 8 | + rsp[PATCH_ROM_BUILD_VER_OFFSET]); + PR_INFO("Current ROM Build Version\t: 0x%04x\n", rome_ver); + + /* In case rome 1.0/1.1, there is no SOC ID version available */ + if (paramlen - 10) { + soc_id = (unsigned int)(rsp[PATCH_SOC_VER_OFFSET +3] << 24 | + rsp[PATCH_SOC_VER_OFFSET+2] << 16 | + rsp[PATCH_SOC_VER_OFFSET+1] << 8 | + rsp[PATCH_SOC_VER_OFFSET]); + PR_INFO("Current SOC Version\t\t: 0x%08x\n", soc_id); + } + + /* Rome Chipset Version can be decided by Patch version and SOC version, + Upper 2 bytes will be used for Patch version and Lower 2 bytes will be + used for SOC as combination for BT host driver */ + rome_ver = (rome_ver << 16) | (soc_id & 0x0000ffff); + break; + case EDL_TVL_DNLD_RES_EVT: + case EDL_CMD_EXE_STATUS_EVT: + switch (err = rsp[CMD_STATUS_OFFSET]) { + case HCI_CMD_SUCCESS: + PR_DBG("%s: Download Packet successfully!\n", __FUNCTION__); + break; + case PATCH_LEN_ERROR: + fprintf(stderr, "%s: Invalid patch length argument passed for EDL PATCH " + "SET REQ cmd\n", __FUNCTION__); + break; + case PATCH_VER_ERROR: + fprintf(stderr, "%s: Invalid patch version argument passed for EDL PATCH " + "SET REQ cmd\n", __FUNCTION__); + break; + case PATCH_CRC_ERROR: + fprintf(stderr, "%s: CRC check of patch failed!!!\n", __FUNCTION__); + break; + case PATCH_NOT_FOUND: + fprintf(stderr, "%s: Invalid patch data!!!\n", __FUNCTION__); + break; + case TLV_TYPE_ERROR: + fprintf(stderr, "%s: TLV Type Error !!!\n", __FUNCTION__); + break; + default: + fprintf(stderr, "%s: Undefined error (0x%x)", __FUNCTION__, err); + break; + } + break; + } + break; + + case NVM_ACCESS_CODE: + PR_DBG("%s: NVM Access Code!!!\n", __FUNCTION__); + err = HCI_CMD_SUCCESS; + break; + case EDL_SET_BAUDRATE_RSP_EVT: + /* Rome 1.1 has bug with the response, so it should ignore it. */ + if (rsp[BAUDRATE_RSP_STATUS_OFFSET] != BAUDRATE_CHANGE_SUCCESS) { + fprintf(stderr, "%s: Set Baudrate request failed - 0x%x\n", __FUNCTION__, + rsp[CMD_STATUS_OFFSET]); + err = -1; + } + break; + default: + fprintf(stderr, "%s: Not a valid status!!!\n", __FUNCTION__); + err = -1; + break; + } + +failed: + return err; +} + + +int wait_for_data(int fd, int maxTimeOut) +{ + fd_set infids; + struct timeval timeout; + + if (maxTimeOut <= 0) { + fprintf(stderr, "%s: Invalid timeout value specified", __func__); + return -EINVAL; + } + + FD_ZERO (&infids); + FD_SET (fd, &infids); + timeout.tv_sec = maxTimeOut; + timeout.tv_usec = 0; + + /* Check whether data is available in TTY buffer before calling read() */ + if (select (fd + 1, &infids, NULL, NULL, &timeout) < 1) { + fprintf(stderr, "%s: Timing out on select for %d secs.\n", __FUNCTION__, maxTimeOut); + return -1; + } + + return 1; +} + +/* + * Read an VS HCI event from the given file descriptor. + */ +int read_vs_hci_event(int fd, unsigned char* buf, int size) +{ + int remain, r, retry = 0; + int count = 0; + + if (size <= 0) { + fprintf(stderr, "Invalid size arguement!\n"); + return -1; + } + + /* Check whether data is available in TTY buffer before calling read() */ + if (wait_for_data(fd, SELECT_TIMEOUT) < 1) + return -1; + + /* The first byte identifies the packet type. For HCI event packets, it + * should be 0x04, so we read until we get to the 0x04. */ + /* It will keep reading until find 0x04 byte */ + while (1) { + /* Read UART Buffer for HCI-DATA */ + r = read(fd, buf, 1); + if (r <= 0) { + fprintf(stderr, "%s: read() failed. error: %d\n", + __FUNCTION__, r); + return -1; + } + + /* Check if received data is HCI-DATA or not. + * If not HCI-DATA, then retry reading the UART Buffer once. + * Sometimes there could be corruption on the UART lines and to + * avoid that retry once reading the UART Buffer for HCI-DATA. + */ + if (buf[0] == 0x04) { /* Recvd. HCI DATA */ + retry = 0; + break; + } + else if (retry < MAX_RETRY_CNT) { /* Retry mechanism */ + retry++; + fprintf(stderr, "%s: Not an HCI-VS-Event! buf[0]: %d", + __FUNCTION__, buf[0]); + if (wait_for_data(fd, SELECT_TIMEOUT) < 1) + return -1; + else /* Data available in UART Buffer: Continue to read */ + continue; + } + else { /* RETRY failed : Exiting with failure */ + fprintf(stderr, "%s: RETRY failed!", __FUNCTION__); + return -1; + } + } + count++; + + /* The next two bytes are the event code and parameter total length. */ + while (count < 3) { + r = read(fd, buf + count, 3 - count); + if ((r <= 0) || (buf[1] != 0xFF )) { + fprintf(stderr, "It is not VS event !!\n"); + return -1; + } + count += r; + } + + /* Now we read the parameters. */ + if (buf[2] < (size - 3)) + remain = buf[2]; + else + remain = size - 3; + + while ((count - 3) < remain) { + r = read(fd, buf + count, remain - (count - 3)); + if (r <= 0) + return -1; + count += r; + } + + /* Check if the set patch command is successful or not */ + if (get_vs_hci_event(buf) != HCI_CMD_SUCCESS) + return -1; + + return count; +} + + +int hci_send_vs_cmd(int fd, unsigned char *cmd, unsigned char *rsp, int size) +{ + int ret = 0; + + /* Send the HCI command packet to UART for transmission */ + ret = write(fd, cmd, size); + if (ret != size) { + fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, ret); + goto failed; + } + + if (wait_vsc_evt) { + /* Check for response from the Controller */ + if (read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE) < 0) { + ret = -ETIMEDOUT; + fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); + goto failed; + } + } + +failed: + return ret; +} + +void frame_hci_cmd_pkt( + unsigned char *cmd, + int edl_cmd, unsigned int p_base_addr, + int segtNo, int size + ) +{ + int offset = 0; + hci_command_hdr *cmd_hdr; + + memset(cmd, 0x0, HCI_MAX_CMD_SIZE); + + cmd_hdr = (void *) (cmd + 1); + + cmd[0] = HCI_COMMAND_PKT; + cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, HCI_PATCH_CMD_OCF); + cmd_hdr->plen = size; + cmd[4] = edl_cmd; + + switch (edl_cmd) { + case EDL_PATCH_SET_REQ_CMD: + /* Copy the patch header info as CMD params */ + memcpy(&cmd[5], phdr_buffer, PATCH_HDR_LEN); + PR_DBG("%s: Sending EDL_PATCH_SET_REQ_CMD\n", __FUNCTION__); + PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", + segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); + break; + case EDL_PATCH_DLD_REQ_CMD: + offset = ((segtNo - 1) * MAX_DATA_PER_SEGMENT); + p_base_addr += offset; + cmd_hdr->plen = (size + 6); + cmd[5] = (size + 4); + cmd[6] = EXTRACT_BYTE(p_base_addr, 0); + cmd[7] = EXTRACT_BYTE(p_base_addr, 1); + cmd[8] = EXTRACT_BYTE(p_base_addr, 2); + cmd[9] = EXTRACT_BYTE(p_base_addr, 3); + memcpy(&cmd[10], (pdata_buffer + offset), size); + + PR_DBG("%s: Sending EDL_PATCH_DLD_REQ_CMD: size: %d bytes\n", + __FUNCTION__, size); + PR_DBG("HCI-CMD %d:\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t" + "0x%x\t0x%x\t0x%x\t\n", segtNo, cmd[0], cmd[1], cmd[2], + cmd[3], cmd[4], cmd[5], cmd[6], cmd[7], cmd[8], cmd[9]); + break; + case EDL_PATCH_ATCH_REQ_CMD: + PR_DBG("%s: Sending EDL_PATCH_ATTACH_REQ_CMD\n", __FUNCTION__); + PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", + segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); + break; + case EDL_PATCH_RST_REQ_CMD: + PR_DBG("%s: Sending EDL_PATCH_RESET_REQ_CMD\n", __FUNCTION__); + PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", + segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); + break; + case EDL_PATCH_VER_REQ_CMD: + PR_DBG("%s: Sending EDL_PATCH_VER_REQ_CMD\n", __FUNCTION__); + PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", + segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); + break; + case EDL_PATCH_TLV_REQ_CMD: + PR_DBG("%s: Sending EDL_PATCH_TLV_REQ_CMD\n", __FUNCTION__); + /* Parameter Total Length */ + cmd[3] = size +2; + + /* TLV Segment Length */ + cmd[5] = size; + PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", + segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4], cmd[5]); + offset = (segtNo * MAX_SIZE_PER_TLV_SEGMENT); + memcpy(&cmd[6], (pdata_buffer + offset), size); + break; + default: + fprintf(stderr, "%s: Unknown EDL CMD !!!\n", __FUNCTION__); + } +} + +void rome_extract_patch_header_info(unsigned char *buf) +{ + int index; + + /* Extract patch id */ + for (index = 0; index < 4; index++) + rampatch_patch_info.patch_id |= + (LSH(buf[index + P_ID_OFFSET], (index * 8))); + + /* Extract (ROM and BUILD) version information */ + for (index = 0; index < 2; index++) + rampatch_patch_info.patch_ver.rom_version |= + (LSH(buf[index + P_ROME_VER_OFFSET], (index * 8))); + + for (index = 0; index < 2; index++) + rampatch_patch_info.patch_ver.build_version |= + (LSH(buf[index + P_BUILD_VER_OFFSET], (index * 8))); + + /* Extract patch base and entry addresses */ + for (index = 0; index < 4; index++) + rampatch_patch_info.patch_base_addr |= + (LSH(buf[index + P_BASE_ADDR_OFFSET], (index * 8))); + + /* Patch BASE & ENTRY addresses are same */ + rampatch_patch_info.patch_entry_addr = rampatch_patch_info.patch_base_addr; + + /* Extract total length of the patch payload */ + for (index = 0; index < 4; index++) + rampatch_patch_info.patch_length |= + (LSH(buf[index + P_LEN_OFFSET], (index * 8))); + + /* Extract the CRC checksum of the patch payload */ + for (index = 0; index < 4; index++) + rampatch_patch_info.patch_crc |= + (LSH(buf[index + P_CRC_OFFSET], (index * 8))); + + /* Extract patch control value */ + for (index = 0; index < 4; index++) + rampatch_patch_info.patch_ctrl |= + (LSH(buf[index + P_CONTROL_OFFSET], (index * 8))); + + fprintf(stderr, "PATCH_ID\t : 0x%x\n", rampatch_patch_info.patch_id); + fprintf(stderr, "ROM_VERSION\t : 0x%x\n", rampatch_patch_info.patch_ver.rom_version); + fprintf(stderr, "BUILD_VERSION\t : 0x%x\n", rampatch_patch_info.patch_ver.build_version); + fprintf(stderr, "PATCH_LENGTH\t : 0x%x\n", rampatch_patch_info.patch_length); + fprintf(stderr, "PATCH_CRC\t : 0x%x\n", rampatch_patch_info.patch_crc); + fprintf(stderr, "PATCH_CONTROL\t : 0x%x\n", rampatch_patch_info.patch_ctrl); + fprintf(stderr, "PATCH_BASE_ADDR\t : 0x%x\n", rampatch_patch_info.patch_base_addr); + +} + +int rome_edl_set_patch_request(int fd) +{ + int size, err; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + + /* Frame the HCI CMD to be sent to the Controller */ + frame_hci_cmd_pkt(cmd, EDL_PATCH_SET_REQ_CMD, 0, + -1, PATCH_HDR_LEN + 1); + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); + if (err != size) { + fprintf(stderr, "Failed to set the patch info to the Controller!\n"); + goto error; + } + + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__); + goto error; + } +error: + return err; +} + +int rome_edl_patch_download_request(int fd) +{ + int no_of_patch_segment; + int index = 1, err = 0, size = 0; + unsigned int p_base_addr; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + + no_of_patch_segment = (rampatch_patch_info.patch_length / + MAX_DATA_PER_SEGMENT); + + /* Initialize the patch base address from the one read from bin file */ + p_base_addr = rampatch_patch_info.patch_base_addr; + + /* + * Depending upon size of the patch payload, download the patches in + * segments with a max. size of 239 bytes + */ + for (index = 1; index <= no_of_patch_segment; index++) { + /* Frame the HCI CMD PKT to be sent to Controller*/ + frame_hci_cmd_pkt(cmd, EDL_PATCH_DLD_REQ_CMD, p_base_addr, + index, MAX_DATA_PER_SEGMENT); + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Initialize the RSP packet everytime to 0 */ + memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); + if (err != size) { + fprintf(stderr, "Failed to send the patch payload to the Controller!\n"); + goto error; + } + + /* Read Command Complete Event */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to downlaod patch segment: %d!\n", + __FUNCTION__, index); + goto error; + } + } + + /* Check if any pending patch data to be sent */ + size = (rampatch_patch_info.patch_length < MAX_DATA_PER_SEGMENT) ? + rampatch_patch_info.patch_length : + (rampatch_patch_info.patch_length % MAX_DATA_PER_SEGMENT); + + if (size) { + /* Frame the HCI CMD PKT to be sent to Controller*/ + frame_hci_cmd_pkt(cmd, EDL_PATCH_DLD_REQ_CMD, p_base_addr, index, size); + + /* Initialize the RSP packet everytime to 0 */ + memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); + if (err != size) { + fprintf(stderr, "Failed to send the patch payload to the Controller!\n"); + goto error; + } + + /* Read Command Complete Event */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to downlaod patch segment: %d!\n", + __FUNCTION__, index); + goto error; + } + } + +error: + return err; +} + +static int rome_download_rampatch(int fd) +{ + int c, size, index, ret = -1; + + /* Get handle to the RAMPATCH binary file */ + fprintf(stderr, "%s: Getting handle to the RAMPATCH binary file from %s\n", __FUNCTION__, ROME_FW_PATH); + file = fopen(ROME_FW_PATH, "r"); + if (file == NULL) { + fprintf(stderr, "%s: Failed to get handle to the RAMPATCH bin file!\n", + __FUNCTION__); + return -ENFILE; + } + + /* Allocate memory for the patch headder info */ + fprintf(stderr, "%s: Allocating memory for the patch header\n", __FUNCTION__); + phdr_buffer = (unsigned char *) malloc(PATCH_HDR_LEN + 1); + if (phdr_buffer == NULL) { + fprintf(stderr, "%s: Failed to allocate memory for patch header\n", + __FUNCTION__); + goto phdr_alloc_failed; + } + for (index = 0; index < PATCH_HDR_LEN + 1; index++) + phdr_buffer[index] = 0x0; + + /* Read 28 bytes of patch header information */ + fprintf(stderr, "%s: Reading patch header info\n", __FUNCTION__); + index = 0; + do { + c = fgetc (file); + phdr_buffer[index++] = (unsigned char)c; + } while (index != PATCH_HDR_LEN); + + /* Save the patch header info into local structure */ + fprintf(stderr, "%s: Saving patch hdr. info\n", __FUNCTION__); + rome_extract_patch_header_info((unsigned char *)phdr_buffer); + + /* Set the patch header info onto the Controller */ + ret = rome_edl_set_patch_request(fd); + if (ret < 0) { + fprintf(stderr, "%s: Error setting the patchheader info!\n", __FUNCTION__); + goto pdata_alloc_failed; + } + + /* Allocate memory for the patch payload */ + fprintf(stderr, "%s: Allocating memory for patch payload\n", __FUNCTION__); + size = rampatch_patch_info.patch_length; + pdata_buffer = (unsigned char *) malloc(size+1); + if (pdata_buffer == NULL) { + fprintf(stderr, "%s: Failed to allocate memory for patch payload\n", + __FUNCTION__); + goto pdata_alloc_failed; + } + for (index = 0; index < size+1; index++) + pdata_buffer[index] = 0x0; + + /* Read the patch data from Rampatch binary image */ + fprintf(stderr, "%s: Reading patch payload from RAMPATCH file\n", __FUNCTION__); + index = 0; + do { + c = fgetc (file); + pdata_buffer[index++] = (unsigned char)c; + } while (c != EOF); + + /* Downloading patches in segments to controller */ + ret = rome_edl_patch_download_request(fd); + if (ret < 0) { + fprintf(stderr, "%s: Error downloading patch segments!\n", __FUNCTION__); + goto cleanup; + } +cleanup: + free(pdata_buffer); +pdata_alloc_failed: + free(phdr_buffer); +phdr_alloc_failed: + fclose(file); + + return ret; +} + +int rome_attach_rampatch(int fd) +{ + int size, err; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + + /* Frame the HCI CMD to be sent to the Controller */ + frame_hci_cmd_pkt(cmd, EDL_PATCH_ATCH_REQ_CMD, 0, + -1, EDL_PATCH_CMD_LEN); + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); + if (err != size) { + fprintf(stderr, "Failed to attach the patch payload to the Controller!\n"); + goto error; + } + + /* Read Command Complete Event */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to attach the patch segment(s)\n", __FUNCTION__); + goto error; + } +error: + return err; +} + +int rome_rampatch_reset(int fd) +{ + int size, err = 0; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + struct timespec tm = { 0, 100*1000*1000 }; /* 100 ms */ + + /* Frame the HCI CMD to be sent to the Controller */ + frame_hci_cmd_pkt(cmd, EDL_PATCH_RST_REQ_CMD, 0, + -1, EDL_PATCH_CMD_LEN); + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); + + /* Send HCI Command packet to Controller */ + err = write(fd, cmd, size); + if (err != size) { + fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); + goto error; + } + + /* + * Controller doesn't sends any response for the patch reset + * command. HOST has to wait for 100ms before proceeding. + */ + nanosleep(&tm, NULL); + +error: + return err; +} + +int get_value_from_config(char *file_path,char *param) +{ + FILE *pfile = NULL; + char *line = NULL; + char *pch = NULL; + char param_str[20]; + int bytes_read = 0, position; + int ret = -1; + + if (!file_path || !param) { + fprintf(stderr,"Invalid arguments\n"); + return -EINVAL; + } + + pfile = fopen(file_path, "r" ); + if (!pfile) { + fprintf(stderr, "Failed to open %s\n", file_path); + return ret; + } + + while (getline(&line, &bytes_read, pfile) > 0 ) { + if (line[0] != '#' && line[0] != '\n') { + pch = memchr(line, '=', strlen(line)); + if (pch != NULL) { + position = pch - line; + strncpy(param_str, line, position); + if (strncmp(param_str, param, position) == 0) { + ret = atoi(pch + 1); + break; + } + } + } + } + free(line); + fclose(pfile); + return ret; +} + +int read_bd_address(unsigned char *bdaddr) +{ + int fd = -1; + int readPtr = 0; + unsigned char data[BD_ADDR_LEN]; + + /* Open the persist file for reading device address*/ + fd = open("/etc/bluetooth/.bt_nv.bin", O_RDONLY); + if (fd < 0) { + fprintf(stderr, "%s: Open failed: Programming default BD ADDR\n", __func__); + return -1; + } + + /* Read the NVM Header : fp will be advanced by readPtr number of bytes */ + readPtr = read(fd, data, PERSIST_HEADER_LEN); + if (readPtr > 0) + fprintf(stderr, "%s: Persist header data: %02x \t %02x \t %02x\n", __func__, + data[NVITEM], data[RDWR_PROT], data[NVITEM_SIZE]); + else { + fprintf(stderr, "%s: Read from persist memory failed : Programming default" + " BD ADDR\n"); + close(fd); + return -1; + } + + /* Check for BD ADDR length before programming */ + if (data[NVITEM_SIZE] != BD_ADDR_LEN) { + fprintf(stderr, "Invalid BD ADDR: Programming default BD ADDR!\n"); + close(fd); + return -1; + } + + /* Read the BD ADDR info */ + readPtr = read(fd, data, BD_ADDR_LEN); + if (readPtr > 0) + fprintf(stderr, "BD-ADDR: ==> %02x:%02x:%02x:%02x:%02x:%02x\n", data[0], + data[1], data[2], data[3], data[4], data[5]); + else { + fprintf(stderr, "%s: Read from persist memory failed : Programming default" + " BD ADDR\n"); + close(fd); + return -1; + } + memcpy(bdaddr, data, BD_ADDR_LEN); + close(fd); + return 0; +} + +int isSpeedValid(int speed, unsigned char *baud_rate) +{ + switch(speed) { + case 9600: + *baud_rate = BAUDRATE_9600; + break; + case 19200: + *baud_rate = BAUDRATE_19200; + break; + case 57600: + *baud_rate = BAUDRATE_57600; + break; + case 115200: + *baud_rate = BAUDRATE_115200; + break; + case 230400: + *baud_rate = BAUDRATE_230400; + break; + case 460800: + *baud_rate = BAUDRATE_460800; + break; + case 921600: + *baud_rate = BAUDRATE_921600; + break; + case 1000000: + *baud_rate = BAUDRATE_1000000; + break; + case 2000000: + *baud_rate = BAUDRATE_2000000; + break; + case 3000000: + *baud_rate = BAUDRATE_3000000; + break; + case 4000000: + *baud_rate = BAUDRATE_4000000; + break; + case 300: + case 600: + case 1200: + case 2400: + default: + fprintf(stderr, "Invalid baudrate, default to 115200!\n"); + *baud_rate = BAUDRATE_115200; + break; + } + return -1; +} + +int rome_get_tlv_file(char *file_path, unsigned char baud_rate) +{ + FILE * pFile; + long fileSize; + int readSize, nvm_length, nvm_index, i; + unsigned short nvm_tag_len; + tlv_patch_info *ptlv_header; + tlv_nvm_hdr *nvm_ptr; + unsigned char data_buf[PRINT_BUF_SIZE]={0,}; + unsigned char *nvm_byte_ptr; + unsigned char bdaddr[6]; + unsigned short pcm_value, ibs_value; + unsigned short deep_sleep_value; + + pFile = fopen ( file_path , "r" ); + if (pFile==NULL) { + fprintf(stderr, "%s File Open Fail\n", file_path); + return -1; + } + + /* Get File Size */ + fseek (pFile , 0 , SEEK_END); + + if ((fileSize = ftell(pFile)) < 0) { + fprintf(stderr, "%s: fail to get current file position\n", file_path); + fclose(pFile); + return -1; + } + + if (fileSize == 0) { + fprintf(stderr, "%s: no content in the file\n", file_path); + fclose(pFile); + return -1; + } + + rewind (pFile); + + pdata_buffer = (unsigned char*) malloc (sizeof(char)*fileSize); + if (pdata_buffer == NULL) { + fprintf(stderr, "Allocated Memory failed\n"); + fclose (pFile); + return -1; + } + + /* Copy file into allocated buffer */ + readSize = fread (pdata_buffer,1,fileSize,pFile); + + /* File Close */ + fclose (pFile); + + if (readSize != fileSize) { + fprintf(stderr, "Read file size(%d) not matched with actual file size (%ld bytes)\n",readSize,fileSize); + return -1; + } + + ptlv_header = (tlv_patch_info *) pdata_buffer; + + /* To handle different event between rampatch and NVM */ + gTlv_type = ptlv_header->tlv_type; + gtlv_dwndcfg = ptlv_header->tlv.patch.dwnd_cfg; + + if (ptlv_header->tlv_type == TLV_TYPE_PATCH) { + PR_INFO("====================================================\n"); + PR_INFO("TLV Type : 0x%x\n", ptlv_header->tlv_type); + PR_INFO("Length : %d bytes\n", (ptlv_header->tlv_length1) | + (ptlv_header->tlv_length2 << 8) | + (ptlv_header->tlv_length3 << 16)); + PR_INFO("Total Length : %d bytes\n", ptlv_header->tlv.patch.tlv_data_len); + PR_INFO("Patch Data Length : %d bytes\n",ptlv_header->tlv.patch.tlv_patch_data_len); + PR_INFO("Signing Format Version : 0x%x\n", ptlv_header->tlv.patch.sign_ver); + PR_INFO("Signature Algorithm : 0x%x\n", ptlv_header->tlv.patch.sign_algorithm); + PR_INFO("Event Handling : 0x%x\n", ptlv_header->tlv.patch.dwnd_cfg); + PR_INFO("Reserved : 0x%x\n", ptlv_header->tlv.patch.reserved1); + PR_INFO("Product ID : 0x%04x\n", ptlv_header->tlv.patch.prod_id); + PR_INFO("Rom Build Version : 0x%04x\n", ptlv_header->tlv.patch.build_ver); + PR_INFO("Patch Version : 0x%04x\n", ptlv_header->tlv.patch.patch_ver); + PR_INFO("Reserved : 0x%x\n", ptlv_header->tlv.patch.reserved2); + PR_INFO("Patch Entry Address : 0x%x\n", (ptlv_header->tlv.patch.patch_entry_addr)); + PR_INFO("====================================================\n"); + + } else if (ptlv_header->tlv_type == TLV_TYPE_NVM) { + PR_INFO("====================================================\n"); + PR_INFO("TLV Type : 0x%x\n", ptlv_header->tlv_type); + PR_INFO("Length : %d bytes\n", nvm_length = + (ptlv_header->tlv_length1) | + (ptlv_header->tlv_length2 << 8) | + (ptlv_header->tlv_length3 << 16)); + + if (nvm_length <= 0) + return readSize; + + for(nvm_byte_ptr=(unsigned char *)(nvm_ptr = &(ptlv_header->tlv.nvm)), nvm_index=0; + nvm_index < nvm_length ; nvm_ptr = (tlv_nvm_hdr *) nvm_byte_ptr) { + PR_DBG("TAG ID\t\t\t : %d\n", nvm_ptr->tag_id); + PR_DBG("TAG Length\t\t\t : %d\n", nvm_tag_len = nvm_ptr->tag_len); + PR_DBG("TAG Pointer\t\t\t : %d\n", nvm_ptr->tag_ptr); + PR_DBG("TAG Extended Flag\t\t : %d\n", nvm_ptr->tag_ex_flag); + + /* Increase nvm_index to NVM data */ + nvm_index+=sizeof(tlv_nvm_hdr); + nvm_byte_ptr+=sizeof(tlv_nvm_hdr); + +#ifndef MODULE_HAS_MAC_ADDR + /* Write BD Address */ + if (nvm_ptr->tag_id == TAG_NUM_2 && read_bd_address(bdaddr) == 0) { + memcpy(nvm_byte_ptr, bdaddr, 6); + PR_INFO("Overriding default BD ADDR with user" + " programmed BD Address: %02x:%02x:%02x:%02x:%02x:%02x\n", + *nvm_byte_ptr, *(nvm_byte_ptr+1), *(nvm_byte_ptr+2), + *(nvm_byte_ptr+3), *(nvm_byte_ptr+4), *(nvm_byte_ptr+5)); + } +#else + /* Remove it from NVM data */ + if (nvm_ptr->tag_id == TAG_NUM_2) { + int nvm_size = nvm_ptr->tag_len + sizeof(tlv_nvm_hdr); + PR_INFO("Skip BD Address from NVM\n"); + nvm_index += nvm_ptr->tag_len; + nvm_byte_ptr += nvm_ptr->tag_len; + memmove(nvm_ptr, nvm_byte_ptr, nvm_length - nvm_index); + nvm_length -= nvm_size; + nvm_byte_ptr -= nvm_size; + readSize -= nvm_size; + nvm_index -= nvm_size; + continue; + } +#endif + + if (nvm_ptr->tag_id == TAG_NUM_17) { + PR_DBG("Forcing IBS to be disabled\n"); + nvm_byte_ptr[FWCONF_IBS_VAL_OFFSET] &= + (~(FWCONF_IBS_ENABLE << FWCONF_IBS_VAL_BIT)); + if (baud_rate != nvm_byte_ptr[FWCONF_BAUD_VAL_OFFSET]) { + PR_INFO("Change Vendor Baud from 0x%02x to 0x%02x\n", + nvm_byte_ptr[FWCONF_BAUD_VAL_OFFSET], baud_rate); + nvm_byte_ptr[FWCONF_BAUD_VAL_OFFSET] = baud_rate; + } + } + + if (nvm_ptr->tag_id == TAG_NUM_27) { + if ((deep_sleep_value = + get_value_from_config(FW_CONFIG_FILE_PATH, "DEEP_SLEEP")) >= 0) { + if (deep_sleep_value == FWCONF_DEEP_SLEEP_DISABLE) { + nvm_byte_ptr[FWCONF_DEEP_SLEEP_BYTE_OFFSET] &= + (~(1 << FWCONF_DEEP_SLEEP_BIT_OFFSET)); + } else if (deep_sleep_value == FWCONF_DEEP_SLEEP_ENABLE) { + nvm_byte_ptr[FWCONF_DEEP_SLEEP_BYTE_OFFSET] |= + (1 << FWCONF_DEEP_SLEEP_BIT_OFFSET); + } else { + fprintf(stderr, "Ignoring invalid deep sleep config value\n"); + } + } + } + + /* Read from file and check what PCM Configuration is required: + * Master = 0 /Slave = 1 */ + /* Override PCM configuration */ + if (nvm_ptr->tag_id == TAG_NUM_44) { + if ((pcm_value = + get_value_from_config(FW_CONFIG_FILE_PATH, "PCM")) >= 0) { + + if (pcm_value == FWCONF_PCM_SLAVE) { + nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_1] |= + (1 << FWCONF_PCM_ROLE_BIT_OFFSET); + nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_2] |= + (1 << FWCONF_PCM_ROLE_BIT_OFFSET); + } else if (pcm_value == FWCONF_PCM_MASTER) { + nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_1] &= + (~(1 << FWCONF_PCM_ROLE_BIT_OFFSET)); + nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_2] &= + (~(1 << FWCONF_PCM_ROLE_BIT_OFFSET)); + } + } + } + + for(i =0;(itag_len && (i*3 + 2) < PRINT_BUF_SIZE);i++) + snprintf((char *) data_buf, PRINT_BUF_SIZE, "%s%.02x ", + (char *)data_buf, *(nvm_byte_ptr + i)); + + PR_DBG("TAG Data\t\t\t : %s\n", data_buf); + + /* Clear buffer */ + memset(data_buf, 0x0, PRINT_BUF_SIZE); + + /* increased by tag_len */ + nvm_index+=nvm_ptr->tag_len; + nvm_byte_ptr +=nvm_ptr->tag_len; + } + + PR_INFO("====================================================\n"); + + } else { + fprintf(stderr, "TLV Header type is unknown (%d) \n", ptlv_header->tlv_type); + } + + return readSize; +} + +int rome_tlv_dnld_segment(int fd, int index, int seg_size, unsigned char wait_cc_evt) +{ + int size=0, err = -1; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + + /* Frame the HCI CMD PKT to be sent to Controller*/ + frame_hci_cmd_pkt(cmd, EDL_PATCH_TLV_REQ_CMD, 0, index, seg_size); + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Initialize the RSP packet everytime to 0 */ + memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); + if (err != size) { + fprintf(stderr, "Failed to send the patch payload to the Controller! 0x%x\n", err); + return err; + } + + if (wait_cc_evt) { + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to downlaod patch segment: %d!\n", __FUNCTION__, index); + return err; + } + } + + return err; +} + +int rome_tlv_dnld_req(int fd, int tlv_size) +{ + int total_segment, remain_size, i, err = -1; + unsigned char wait_cc_evt = FALSE; + unsigned int rom = rome_ver >> 16; + + total_segment = tlv_size/MAX_SIZE_PER_TLV_SEGMENT; + remain_size = (tlv_size < MAX_SIZE_PER_TLV_SEGMENT)?\ + tlv_size: (tlv_size%MAX_SIZE_PER_TLV_SEGMENT); + + if (gTlv_type == TLV_TYPE_PATCH) { + /* Prior to Rome version 3.2(including inital few rampatch release of + * Rome 3.2), the event handling mechanism is ROME_SKIP_EVT_NONE. After + * few release of rampatch for Rome 3.2, the mechamism is changed to + * ROME_SKIP_EVT_VSE_CC. Rest of the mechanism is not used for now + */ + switch (gtlv_dwndcfg) + { + case ROME_SKIP_EVT_NONE: + wait_vsc_evt = TRUE; + wait_cc_evt = TRUE; + PR_DBG("%s: Event handling type: ROME_SKIP_EVT_NONE", __func__); + break; + case ROME_SKIP_EVT_VSE_CC: + wait_vsc_evt = FALSE; + wait_cc_evt = FALSE; + PR_DBG("%s: Event handling type: ROME_SKIP_EVT_VSE_CC", __func__); + break; + /* Not handled for now */ + case ROME_SKIP_EVT_VSE: + case ROME_SKIP_EVT_CC: + default: + fprintf(stderr, "%s: Unsupported Event handling: %d", __func__, gtlv_dwndcfg); + break; + } + } else { + wait_vsc_evt = TRUE; + wait_cc_evt = TRUE; + } + + for(i = 0; i < total_segment; i++) { + if ((i+1) == total_segment) { + if ((rom >= ROME_PATCH_VER_0100) && (rom < ROME_PATCH_VER_0302) && + (gTlv_type == TLV_TYPE_PATCH)) { + /* If the Rome version is from 1.1 to 3.1 + * 1. No CCE for the last command segment but all other segment + * 2. All the command segments get VSE including the last one + */ + wait_cc_evt = !remain_size ? FALSE: TRUE; + } else if ((rom == ROME_PATCH_VER_0302) && + (gTlv_type == TLV_TYPE_PATCH)) { + /* If the Rome version is 3.2 + * 1. None of the command segments receive CCE + * 2. No command segments receive VSE except the last one + * 3. If gtlv_dwndcfg is ROME_SKIP_EVT_NONE then the logic is + * same as Rome 2.1, 2.2, 3.0 + */ + if (gtlv_dwndcfg == ROME_SKIP_EVT_NONE) { + wait_cc_evt = !remain_size ? FALSE: TRUE; + } else if (gtlv_dwndcfg == ROME_SKIP_EVT_VSE_CC) { + wait_vsc_evt = !remain_size ? TRUE: FALSE; + } + } + } + + if ((err = rome_tlv_dnld_segment(fd, i, MAX_SIZE_PER_TLV_SEGMENT, wait_cc_evt )) < 0) + goto error; + } + + if ((rom >= ROME_PATCH_VER_0100) && (rom < ROME_PATCH_VER_0302) && + (gTlv_type == TLV_TYPE_PATCH)) { + /* If the Rome version is from 1.1 to 3.1 + * 1. No CCE for the last command segment but all other segment + * 2. All the command segments get VSE including the last one + */ + wait_cc_evt = remain_size ? FALSE: TRUE; + } else if ((rom == ROME_PATCH_VER_0302) && (gTlv_type == TLV_TYPE_PATCH)) { + /* If the Rome version is 3.2 + * 1. None of the command segments receive CCE + * 2. No command segments receive VSE except the last one + * 3. If gtlv_dwndcfg is ROME_SKIP_EVT_NONE then the logic is + * same as Rome 2.1, 2.2, 3.0 + */ + if (gtlv_dwndcfg == ROME_SKIP_EVT_NONE) { + wait_cc_evt = remain_size ? FALSE: TRUE; + } else if (gtlv_dwndcfg == ROME_SKIP_EVT_VSE_CC) { + wait_vsc_evt = remain_size ? TRUE: FALSE; + } + } + + if (remain_size) err =rome_tlv_dnld_segment(fd, i, remain_size, wait_cc_evt); + +error: + return err; +} + +int rome_download_tlv_file(int fd, unsigned char baud_rate) +{ + int tlv_size, err = -1; + + /* Rampatch TLV file Downloading */ + pdata_buffer = NULL; + + if ((tlv_size = rome_get_tlv_file(rampatch_file_path, baud_rate)) < 0) + goto error; + + if ((err = rome_tlv_dnld_req(fd, tlv_size)) < 0) + goto error; + + if (pdata_buffer != NULL) { + free (pdata_buffer); + pdata_buffer = NULL; + } + + /* NVM TLV file Downloading */ + if ((tlv_size = rome_get_tlv_file(nvm_file_path, baud_rate)) < 0) + goto error; + + if ((err = rome_tlv_dnld_req(fd, tlv_size)) < 0) + goto error; + +error: + if (pdata_buffer != NULL) + free (pdata_buffer); + + return err; +} + +int rome_1_0_nvm_tag_dnld(int fd) +{ + int i, size, err = 0; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + +#if (NVM_VERSION >= ROME_1_0_100019) + unsigned char cmds[MAX_TAG_CMD][HCI_MAX_CMD_SIZE] = + { + /* Tag 2 */ /* BD Address */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 9, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 2, + /* Tag Len */ 6, + /* Tag Value */ 0x77,0x78,0x23,0x01,0x56,0x22 + }, + /* Tag 6 */ /* Bluetooth Support Features */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 11, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 6, + /* Tag Len */ 8, + /* Tag Value */ 0xFF,0xFE,0x8B,0xFE,0xD8,0x3F,0x5B,0x8B + }, + /* Tag 17 */ /* HCI Transport Layer Setting */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 11, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 17, + /* Tag Len */ 8, + /* Tag Value */ 0x82,0x01,0x0E,0x08,0x04,0x32,0x0A,0x00 + }, + /* Tag 35 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 58, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 35, + /* Tag Len */ 55, + /* Tag Value */ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x58, 0x59, + 0x0E, 0x0E, 0x16, 0x16, 0x16, 0x1E, 0x26, 0x5F, 0x2F, 0x5F, + 0x0E, 0x0E, 0x16, 0x16, 0x16, 0x1E, 0x26, 0x5F, 0x2F, 0x5F, + 0x0C, 0x18, 0x14, 0x24, 0x40, 0x4C, 0x70, 0x80, 0x80, 0x80, + 0x0C, 0x18, 0x14, 0x24, 0x40, 0x4C, 0x70, 0x80, 0x80, 0x80, + 0x1B, 0x14, 0x01, 0x04, 0x48 + }, + /* Tag 36 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 15, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 36, + /* Tag Len */ 12, + /* Tag Value */ 0x0F,0x00,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x00 + }, + /* Tag 39 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 7, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 39, + /* Tag Len */ 4, + /* Tag Value */ 0x12,0x00,0x00,0x00 + }, + /* Tag 41 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 91, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 41, + /* Tag Len */ 88, + /* Tag Value */ 0x15, 0x00, 0x00, 0x00, 0xF6, 0x02, 0x00, 0x00, 0x76, 0x00, + 0x1E, 0x00, 0x29, 0x02, 0x1F, 0x00, 0x61, 0x00, 0x1A, 0x00, + 0x76, 0x00, 0x1E, 0x00, 0x7D, 0x00, 0x40, 0x00, 0x91, 0x00, + 0x06, 0x00, 0x92, 0x00, 0x03, 0x00, 0xA6, 0x01, 0x50, 0x00, + 0xAA, 0x01, 0x15, 0x00, 0xAB, 0x01, 0x0A, 0x00, 0xAC, 0x01, + 0x00, 0x00, 0xB0, 0x01, 0xC5, 0x00, 0xB3, 0x01, 0x03, 0x00, + 0xB4, 0x01, 0x13, 0x00, 0xB5, 0x01, 0x0C, 0x00, 0xC5, 0x01, + 0x0D, 0x00, 0xC6, 0x01, 0x10, 0x00, 0xCA, 0x01, 0x2B, 0x00, + 0xCB, 0x01, 0x5F, 0x00, 0xCC, 0x01, 0x48, 0x00 + }, + /* Tag 42 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 63, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 42, + /* Tag Len */ 60, + /* Tag Value */ 0xD7, 0xC0, 0x00, 0x00, 0x8F, 0x5C, 0x02, 0x00, 0x80, 0x47, + 0x60, 0x0C, 0x70, 0x4C, 0x00, 0x00, 0x00, 0x01, 0x1F, 0x01, + 0x42, 0x01, 0x69, 0x01, 0x95, 0x01, 0xC7, 0x01, 0xFE, 0x01, + 0x3D, 0x02, 0x83, 0x02, 0xD1, 0x02, 0x29, 0x03, 0x00, 0x0A, + 0x10, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x7F, 0x00, 0xFD, 0x00, + 0xF9, 0x01, 0xF1, 0x03, 0xDE, 0x07, 0x00, 0x00, 0x9A, 0x01 + }, + /* Tag 84 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 153, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 84, + /* Tag Len */ 150, + /* Tag Value */ 0x7C, 0x6A, 0x59, 0x47, 0x19, 0x36, 0x35, 0x25, 0x25, 0x28, + 0x2C, 0x2B, 0x2B, 0x28, 0x2C, 0x28, 0x29, 0x28, 0x29, 0x28, + 0x29, 0x29, 0x2C, 0x29, 0x2C, 0x29, 0x2C, 0x28, 0x29, 0x28, + 0x29, 0x28, 0x29, 0x2A, 0x00, 0x00, 0x2C, 0x2A, 0x2C, 0x18, + 0x98, 0x98, 0x98, 0x98, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, + 0x1E, 0x13, 0x1E, 0x1E, 0x1E, 0x1E, 0x13, 0x13, 0x11, 0x13, + 0x1E, 0x1E, 0x13, 0x12, 0x12, 0x12, 0x11, 0x12, 0x1F, 0x12, + 0x12, 0x12, 0x10, 0x0C, 0x18, 0x0D, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x0C, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x0D, + 0x0E, 0x0D, 0x01, 0x01, 0x0D, 0x0D, 0x0D, 0x0D, 0x0F, 0x0D, + 0x10, 0x0D, 0x0D, 0x0D, 0x0D, 0x10, 0x05, 0x10, 0x03, 0x00, + 0x7E, 0x7B, 0x7B, 0x72, 0x71, 0x50, 0x50, 0x50, 0x00, 0x40, + 0x60, 0x60, 0x30, 0x08, 0x02, 0x0F, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x16, 0x16, 0x08, 0x08, 0x00, + 0x00, 0x00, 0x1E, 0x34, 0x2B, 0x1B, 0x23, 0x2B, 0x15, 0x0D + }, + /* Tag 85 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 119, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 85, + /* Tag Len */ 116, + /* Tag Value */ 0x03, 0x00, 0x38, 0x00, 0x45, 0x77, 0x00, 0xE8, 0x00, 0x59, + 0x01, 0xCA, 0x01, 0x3B, 0x02, 0xAC, 0x02, 0x1D, 0x03, 0x8E, + 0x03, 0x00, 0x89, 0x01, 0x0E, 0x02, 0x5C, 0x02, 0xD7, 0x02, + 0xF8, 0x08, 0x01, 0x00, 0x1F, 0x00, 0x0A, 0x02, 0x55, 0x02, + 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xD7, 0x00, 0x00, + 0x00, 0x1E, 0xDE, 0x00, 0x00, 0x00, 0x14, 0x0F, 0x0A, 0x0F, + 0x0A, 0x0C, 0x0C, 0x0C, 0x0C, 0x04, 0x04, 0x04, 0x0C, 0x0C, + 0x0C, 0x0C, 0x06, 0x06, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x01, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, + 0x06, 0x0F, 0x14, 0x05, 0x47, 0xCF, 0x77, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xAC, 0x7C, 0xFF, 0x40, 0x00, 0x00, 0x00, + 0x12, 0x04, 0x04, 0x01, 0x04, 0x03 + }, + {TAG_END} + }; +#elif (NVM_VERSION == ROME_1_0_6002) + unsigned char cmds[MAX_TAG_CMD][HCI_MAX_CMD_SIZE] = + { + /* Tag 2 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 9, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 2, + /* Tag Len */ 6, + /* Tag Value */ 0x77,0x78,0x23,0x01,0x56,0x22 /* BD Address */ + }, + /* Tag 6 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 11, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 6, + /* Tag Len */ 8, + /* Tag Value */ 0xFF,0xFE,0x8B,0xFE,0xD8,0x3F,0x5B,0x8B + }, + /* Tag 17 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 11, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 17, + /* Tag Len */ 8, + /* Tag Value */ 0x82,0x01,0x0E,0x08,0x04,0x32,0x0A,0x00 + }, + /* Tag 36 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 15, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 36, + /* Tag Len */ 12, + /* Tag Value */ 0x0F,0x00,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x00 + }, + + /* Tag 39 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 7, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 39, + /* Tag Len */ 4, + /* Tag Value */ 0x12,0x00,0x00,0x00 + }, + + /* Tag 41 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 199, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 41, + /* Tag Len */ 196, + /* Tag Value */ 0x30,0x00,0x00,0x00,0xD5,0x00,0x0E,0x00,0xD6,0x00,0x0E,0x00, + 0xD7,0x00,0x16,0x00,0xD8,0x00,0x16,0x00,0xD9,0x00,0x16,0x00, + 0xDA,0x00,0x1E,0x00,0xDB,0x00,0x26,0x00,0xDC,0x00,0x5F,0x00, + 0xDD,0x00,0x2F,0x00,0xDE,0x00,0x5F,0x00,0xE0,0x00,0x0E,0x00, + 0xE1,0x00,0x0E,0x00,0xE2,0x00,0x16,0x00,0xE3,0x00,0x16,0x00, + 0xE4,0x00,0x16,0x00,0xE5,0x00,0x1E,0x00,0xE6,0x00,0x26,0x00, + 0xE7,0x00,0x5F,0x00,0xE8,0x00,0x2F,0x00,0xE9,0x00,0x5F,0x00, + 0xEC,0x00,0x0C,0x00,0xED,0x00,0x08,0x00,0xEE,0x00,0x14,0x00, + 0xEF,0x00,0x24,0x00,0xF0,0x00,0x40,0x00,0xF1,0x00,0x4C,0x00, + 0xF2,0x00,0x70,0x00,0xF3,0x00,0x80,0x00,0xF4,0x00,0x80,0x00, + 0xF5,0x00,0x80,0x00,0xF8,0x00,0x0C,0x00,0xF9,0x00,0x18,0x00, + 0xFA,0x00,0x14,0x00,0xFB,0x00,0x24,0x00,0xFC,0x00,0x40,0x00, + 0xFD,0x00,0x4C,0x00,0xFE,0x00,0x70,0x00,0xFF,0x00,0x80,0x00, + 0x00,0x01,0x80,0x00,0x01,0x01,0x80,0x00,0x04,0x01,0x1B,0x00, + 0x05,0x01,0x14,0x00,0x06,0x01,0x01,0x00,0x07,0x01,0x04,0x00, + 0x08,0x01,0x00,0x00,0x09,0x01,0x00,0x00,0x0A,0x01,0x03,0x00, + 0x0B,0x01,0x03,0x00 + }, + + /* Tag 44 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 44, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 44, + /* Tag Len */ 41, + /* Tag Value */ 0x6F,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0xFF,0x10,0x02,0x02, + 0x01,0x00,0x14,0x01,0x06,0x28,0xA0,0x62,0x03,0x64,0x01,0x01, + 0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0xFF,0x10,0x02,0x01, + 0x00,0x14,0x01,0x02,0x03 + }, + {TAG_END} + }; +#endif + + for (i=0; (i < MAX_TAG_CMD) && (cmds[i][0] != TAG_END); i++) { + /* Write BD Address */ + if (cmds[i][TAG_NUM_OFFSET] == TAG_NUM_2){ + memcpy(&cmds[i][TAG_BDADDR_OFFSET], vnd_local_bd_addr, 6); + fprintf(stderr, "BD Address: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", + cmds[i][TAG_BDADDR_OFFSET ], cmds[i][TAG_BDADDR_OFFSET + 1], + cmds[i][TAG_BDADDR_OFFSET + 2], cmds[i][TAG_BDADDR_OFFSET + 3], + cmds[i][TAG_BDADDR_OFFSET + 4], cmds[i][TAG_BDADDR_OFFSET + 5]); + } + size = cmds[i][3] + HCI_COMMAND_HDR_SIZE + 1; + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)&cmds[i][0], rsp, size); + if (err != size) { + fprintf(stderr, "Failed to attach the patch payload to the Controller!\n"); + goto error; + } + + /* Read Command Complete Event - This is extra routine for ROME 1.0. From ROM 2.0, it should be removed. */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to get patch version(s)\n", __FUNCTION__); + goto error; + } + } + +error: + return err; +} + + + +int rome_patch_ver_req(int fd) +{ + int size, err = 0; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + + /* Frame the HCI CMD to be sent to the Controller */ + frame_hci_cmd_pkt(cmd, EDL_PATCH_VER_REQ_CMD, 0, + -1, EDL_PATCH_CMD_LEN); + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); + if (err != size) { + fprintf(stderr, "Failed to attach the patch payload to the Controller!\n"); + goto error; + } + + /* Read Command Complete Event - This is extra routine for ROME 1.0. From ROM 2.0, it should be removed. */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to get patch version(s)\n", __FUNCTION__); + goto error; + } +error: + return err; + +} + +static void flow_control(int fd, int opt) +{ + struct termios c_opt; + + ioctl(fd, TIOCMGET, &c_opt); + c_opt.c_cc[VTIME] = 0; /* inter-character timer unused */ + c_opt.c_cc[VMIN] = 0; /* blocking read until 8 chars received */ + c_opt.c_cflag &= ~CSIZE; + c_opt.c_cflag |= (CS8 | CLOCAL | CREAD); + if (opt == MSM_ENABLE_FLOW_CTRL) + c_opt.c_cflag |= CRTSCTS; + else if (opt == MSM_DISABLE_FLOW_CTRL) + c_opt.c_cflag &= ~CRTSCTS; + else { + fprintf(stderr, "%s: Incorrect option passed for TIOCMSET\n", __func__); + return; + } + c_opt.c_iflag = IGNPAR; + c_opt.c_oflag = 0; + c_opt.c_lflag = 0; + ioctl(fd, TIOCMSET, &c_opt); +} + + +int rome_set_baudrate_req(int fd, unsigned char baud_rate) +{ + int size, err = 0; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + hci_command_hdr *cmd_hdr; + int flags; + + memset(cmd, 0x0, HCI_MAX_CMD_SIZE); + + cmd_hdr = (void *) (cmd + 1); + cmd[0] = HCI_COMMAND_PKT; + cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, EDL_SET_BAUDRATE_CMD_OCF); + cmd_hdr->plen = VSC_SET_BAUDRATE_REQ_LEN; + cmd[4] = baud_rate; + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_SET_BAUDRATE_REQ_LEN); + + /* Flow off during baudrate change */ + flow_control(fd, MSM_DISABLE_FLOW_CTRL); + + /* Send the HCI command packet to UART for transmission */ + err = write(fd, cmd, size); + if (err != size) { + fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); + goto error; + } + /* Change Local UART baudrate to high speed UART */ + userial_vendor_set_baud(baud_rate); + + /* Flow on after changing local uart baudrate */ + flow_control(fd, MSM_ENABLE_FLOW_CTRL); + + /* Check for response from the Controller */ + if ((err = read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE)) < 0) { + fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); + goto error; + } + + /* Wait for command complete event */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__); + goto error; + } +error: + return err; + +} + + +int rome_hci_reset_req(int fd, char baud) +{ + int size, err = 0; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + hci_command_hdr *cmd_hdr; + int flags; + + memset(cmd, 0x0, HCI_MAX_CMD_SIZE); + + cmd_hdr = (void *) (cmd + 1); + cmd[0] = HCI_COMMAND_PKT; + cmd_hdr->opcode = HCI_RESET; + cmd_hdr->plen = 0; + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE); + + /* Flow off during baudrate change */ + flow_control(fd, MSM_DISABLE_FLOW_CTRL); + + /* Send the HCI command packet to UART for transmission */ + err = write(fd, cmd, size); + if (err != size) { + fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); + goto error; + } + + /* Change Local UART baudrate to high speed UART */ + userial_vendor_set_baud(baud); + + /* Flow on after changing local uart baudrate */ + flow_control(fd, MSM_ENABLE_FLOW_CTRL); + + /* Wait for command complete event */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__); + goto error; + } + +error: + return err; + +} + +int qca_soc_init(int fd, int speed, char *bdaddr) +{ + int err = -1; + int ret = 0; + int size; + unsigned char baud_rate = 0; + + vnd_userial.fd = fd; + + /* Get Rome version information */ + if ((err = rome_patch_ver_req(fd)) < 0) { + fprintf(stderr, "%s: Fail to get Rome Version (0x%x)\n", __FUNCTION__, err); + ret = -1; + goto error; + } + + fprintf(stderr, "%s: Rome Version (0x%08x)\n", __FUNCTION__, rome_ver); + + switch (rome_ver){ + case ROME_VER_1_0: + /* Set and Download the RAMPATCH */ + fprintf(stderr, "%s: Setting Patch Header & Downloading Patches\n", __FUNCTION__); + err = rome_download_rampatch(fd); + if (err < 0) { + fprintf(stderr, "%s: DOWNLOAD RAMPATCH failed!\n", __FUNCTION__); + ret = -1; + goto error; + } + + /* Attach the RAMPATCH */ + fprintf(stderr, "%s: Attaching the patches\n", __FUNCTION__); + err = rome_attach_rampatch(fd); + if (err < 0) { + fprintf(stderr, "%s: ATTACH RAMPATCH failed!\n", __FUNCTION__); + ret = -1; + goto error; + } + + /* Send Reset */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); + err = rome_rampatch_reset(fd); + if (err < 0) { + fprintf(stderr, "Failed to RESET after RAMPATCH upgrade!\n"); + ret = -1; + goto error; + } + + /* NVM download */ + fprintf(stderr, "%s: Downloading NVM\n", __FUNCTION__); + err = rome_1_0_nvm_tag_dnld(fd); + if (err < 0) { + fprintf(stderr, "Downloading NVM Failed !!\n"); + ret = -1; + goto error; + } + + /* Change baud rate 115.2 kbps to 3Mbps*/ + err = rome_hci_reset_req(fd, baud_rate); + if (err < 0) { + fprintf(stderr, "HCI Reset Failed !!\n"); + ret = -1; + goto error; + } + break; + case ROME_VER_1_1: + rampatch_file_path = ROME_RAMPATCH_TLV_PATH; + nvm_file_path = ROME_NVM_TLV_PATH; + goto download; + case ROME_VER_1_3: + rampatch_file_path = ROME_RAMPATCH_TLV_1_0_3_PATH; + nvm_file_path = ROME_NVM_TLV_1_0_3_PATH; + goto download; + case ROME_VER_2_1: + rampatch_file_path = ROME_RAMPATCH_TLV_2_0_1_PATH; + nvm_file_path = ROME_NVM_TLV_2_0_1_PATH; + goto download; + case ROME_VER_3_0: + rampatch_file_path = ROME_RAMPATCH_TLV_3_0_0_PATH; + nvm_file_path = ROME_NVM_TLV_3_0_0_PATH; + goto download; + case ROME_VER_3_2: + rampatch_file_path = ROME_RAMPATCH_TLV_3_0_2_PATH; + nvm_file_path = ROME_NVM_TLV_3_0_2_PATH; + goto download; + case TUFELLO_VER_1_0: + rampatch_file_path = TF_RAMPATCH_TLV_1_0_0_PATH; + nvm_file_path = TF_NVM_TLV_1_0_0_PATH; + goto download; + case TUFELLO_VER_1_1: + rampatch_file_path = TF_RAMPATCH_TLV_1_0_1_PATH; + nvm_file_path = TF_NVM_TLV_1_0_1_PATH; +download: + isSpeedValid(speed, &baud_rate); + if (baud_rate < 0) { + ret = -1; + goto error; + } + + /* Donwload TLV files (rampatch, NVM) */ + err = rome_download_tlv_file(fd, baud_rate); + if (err < 0) { + fprintf(stderr, "%s: Download TLV file failed!\n", __FUNCTION__); + ret = -1; + goto error; + } + + /* + * Overriding the baud rate value in NVM file with the user + * requested baud rate, since default baud rate in NVM file is 3M. + */ + err = rome_set_baudrate_req(fd, baud_rate); + if (err < 0) { + fprintf(stderr, "%s: Baud rate change failed!\n", __FUNCTION__); + ret = -1; + goto error; + } + + /* Perform HCI reset here*/ + err = rome_hci_reset_req(fd, baud_rate); + if (err < 0) { + fprintf(stderr, "HCI Reset Failed !!!\n"); + ret = -1; + goto error; + } + + break; + case ROME_VER_UNKNOWN: + default: + fprintf(stderr, "%s: Detected unknown ROME version\n", __FUNCTION__); + ret = -1; + break; + } + +error: + return ret; +} diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h new file mode 100644 index 000000000..597743e0b --- /dev/null +++ b/tools/hciattach_rome.h @@ -0,0 +1,388 @@ +/* + * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. + * Not a Contribution. + * Copyright 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef HW_ROME_H +#define HW_ROME_H + +/****************************************************************************** +** Constants & Macros +******************************************************************************/ +#define HCI_MAX_CMD_SIZE 260 +#define HCI_MAX_EVENT_SIZE 260 +#define PRINT_BUF_SIZE ((HCI_MAX_CMD_SIZE * 3) + 2) +/* HCI Command/Event Opcode */ +#define HCI_RESET 0x0C03 +#define EVT_CMD_COMPLETE 0x0E +/* HCI Packet types */ +#define HCI_COMMAND_PKT 0x01 +#define HCI_ACLDATA_PKT 0x02 +#define HCI_SCODATA_PKT 0x03 +#define HCI_EVENT_PKT 0x04 +#define HCI_VENDOR_PKT 0xff +#define cmd_opcode_pack(ogf, ocf) (unsigned short)((ocf & 0x03ff)|(ogf << 10)) + +#define NVITEM 0 +#define RDWR_PROT 1 +#define NVITEM_SIZE 2 +#define PERSIST_HEADER_LEN 3 +#define BD_ADDR_LEN 6 +#define MSM_DISABLE_FLOW_CTRL 0 +#define MSM_ENABLE_FLOW_CTRL 1 + +#ifdef _PLATFORM_MDM_ +#define USERIAL_OP_CLK_ON 0x5441 +#define USERIAL_OP_CLK_OFF 0x5442 +#endif + +#define PR_INFO(fmt, arg...) printf(fmt, ## arg) +#ifdef DEBUG + #define PR_DBG(fmt, arg...) printf(fmt, ## arg) +#else + #define PR_DBG(fmt, arg...) +#endif + +unsigned char vnd_local_bd_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +typedef enum { + USERIAL_OP_FLOW_ON, + USERIAL_OP_FLOW_OFF, + USERIAL_OP_NOP, +} userial_vendor_ioctl_op_t; + + +/* vendor serial control block */ +typedef struct +{ + int fd; /* fd to Bluetooth device */ + struct termios termios; /* serial terminal of BT port */ + char port_name[256]; +} vnd_userial_cb_t; + +/**** baud rates ****/ +#define USERIAL_BAUD_300 0 +#define USERIAL_BAUD_600 1 +#define USERIAL_BAUD_1200 2 +#define USERIAL_BAUD_2400 3 +#define USERIAL_BAUD_9600 4 +#define USERIAL_BAUD_19200 5 +#define USERIAL_BAUD_57600 6 +#define USERIAL_BAUD_115200 7 +#define USERIAL_BAUD_230400 8 +#define USERIAL_BAUD_460800 9 +#define USERIAL_BAUD_921600 10 +#define USERIAL_BAUD_1M 11 +#define USERIAL_BAUD_1_5M 12 +#define USERIAL_BAUD_2M 13 +#define USERIAL_BAUD_3M 14 +#define USERIAL_BAUD_4M 15 +#define USERIAL_BAUD_AUTO 16 + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +#define HCI_CHG_BAUD_CMD_OCF 0x0C +#define HCI_VENDOR_CMD_OGF 0x3F +#define WRITE_BDADDR_CMD_LEN 14 +#define WRITE_BAUD_CMD_LEN 6 +#define MAX_CMD_LEN WRITE_BDADDR_CMD_LEN +#define GET_VERSION_OCF 0x1E + +#define PS_HDR_LEN 4 +#define HCI_VENDOR_CMD_OGF 0x3F +#define HCI_PS_CMD_OCF 0x0B + +#define HCI_COMMAND_HDR_SIZE 3 +#define EVT_CMD_COMPLETE_SIZE 3 +#define EVT_CMD_STATUS 0x0F +#define EVT_CMD_STATUS_SIZE 4 +#define HCI_EVENT_HDR_SIZE 2 +#define HCI_EV_SUCCESS 0x00 +/* HCI Socket options */ +#define HCI_DATA_DIR 1 +#define HCI_FILTER 2 +#define HCI_TIME_STAMP 3 + +#define P_ID_OFFSET (0) +#define HCI_CMD_IND (1) +#define EVENTCODE_OFFSET (1) +#define EVT_PLEN (2) +#define PLEN (3) +#define CMD_RSP_OFFSET (3) +#define RSP_TYPE_OFFSET (4) +#define BAUDRATE_RSP_STATUS_OFFSET (4) +#define CMD_STATUS_OFFSET (5) +#define P_ROME_VER_OFFSET (4) +#define P_BUILD_VER_OFFSET (6) +#define P_BASE_ADDR_OFFSET (8) +#define P_ENTRY_ADDR_OFFSET (12) +#define P_LEN_OFFSET (16) +#define P_CRC_OFFSET (20) +#define P_CONTROL_OFFSET (24) +#define PATCH_HDR_LEN (28) +#define MAX_DATA_PER_SEGMENT (239) +#define VSEVENT_CODE (0xFF) +#define HC_VS_MAX_CMD_EVENT (0xFF) +#define PATCH_PROD_ID_OFFSET (5) +#define PATCH_PATCH_VER_OFFSET (9) +#define PATCH_ROM_BUILD_VER_OFFSET (11) +#define PATCH_SOC_VER_OFFSET (13) +#define MAX_SIZE_PER_TLV_SEGMENT (243) + +/* VS Opcode */ +#define HCI_PATCH_CMD_OCF (0) +#define EDL_SET_BAUDRATE_CMD_OCF (0x48) + +/* VS Commands */ +#define VSC_SET_BAUDRATE_REQ_LEN (1) +#define EDL_PATCH_CMD_LEN (1) +#define EDL_PATCH_CMD_REQ_LEN (1) +#define EDL_PATCH_DLD_REQ_CMD (0x01) +#define EDL_PATCH_RST_REQ_CMD (0x05) +#define EDL_PATCH_SET_REQ_CMD (0x16) +#define EDL_PATCH_ATCH_REQ_CMD (0x17) +#define EDL_PATCH_VER_REQ_CMD (0x19) +#define EDL_PATCH_TLV_REQ_CMD (0x1E) +#define VSC_DISABLE_IBS_LEN (0x04) + +/* VS Event */ +#define EDL_CMD_REQ_RES_EVT (0x00) +#define EDL_CMD_EXE_STATUS_EVT (0x00) +#define EDL_SET_BAUDRATE_RSP_EVT (0x92) +#define EDL_PATCH_VER_RES_EVT (0x19) +#define EDL_TVL_DNLD_RES_EVT (0x04) +#define EDL_APP_VER_RES_EVT (0x02) + +/* Status Codes of HCI CMD execution*/ +#define HCI_CMD_SUCCESS (0x0) +#define PATCH_LEN_ERROR (0x1) +#define PATCH_VER_ERROR (0x2) +#define PATCH_CRC_ERROR (0x3) +#define PATCH_NOT_FOUND (0x4) +#define TLV_TYPE_ERROR (0x10) +#define NVM_ACCESS_CODE (0x0B) +#define BAUDRATE_CHANGE_SUCCESS (1) + +/* TLV_TYPE */ +#define TLV_TYPE_PATCH (1) +#define TLV_TYPE_NVM (2) + +/* NVM */ +#define MAX_TAG_CMD 30 +#define TAG_END 0xFF +#define NVM_ACCESS_SET 0x01 +#define TAG_NUM_OFFSET 5 +#define TAG_NUM_2 2 +#define TAG_NUM_17 (17) +#define TAG_NUM_27 27 +#define TAG_NUM_44 44 +#define TAG_BDADDR_OFFSET 7 + +/* FW PCM Configuration */ +#define FWCONF_PCM_MS_OFFSET_1 9 +#define FWCONF_PCM_MS_OFFSET_2 33 +#define FWCONF_PCM_SLAVE 1 +#define FWCONF_PCM_MASTER 0 +#define FWCONF_PCM_ROLE_BIT_OFFSET 4 + +/* FW HCI Transport Layer Configuration */ +#define FWCONF_IBS_DISABLE (0) +#define FWCONF_IBS_ENABLE (1) +#define FWCONF_IBS_VAL_BIT (7) +#define FWCONF_IBS_VAL_OFFSET (0) +#define FWCONF_BAUD_VAL_OFFSET (2) + +/* FW DEEP SLEEP Configuration */ +#define FWCONF_DEEP_SLEEP_DISABLE 0 +#define FWCONF_DEEP_SLEEP_ENABLE 1 +#define FWCONF_DEEP_SLEEP_BYTE_OFFSET 0 +#define FWCONF_DEEP_SLEEP_BIT_OFFSET 0 + +#define MAX_RETRY_CNT 1 +#define SELECT_TIMEOUT 3 + +/* NVM Tags specifically used for ROME 1.0 */ +#define ROME_1_0_100022_1 0x101000221 +#define ROME_1_0_100019 0x101000190 +#define ROME_1_0_6002 0x100600200 + +/* Default NVM Version setting for ROME 1.0 */ +#define NVM_VERSION ROME_1_0_100022_1 + + +#define LSH(val, n) ((unsigned int)(val) << (n)) +#define EXTRACT_BYTE(val, pos) (char) (((val) >> (8 * (pos))) & 0xFF) +#define CALC_SEG_SIZE(len, max) ((plen) % (max))?((plen/max)+1) : ((plen) / (max)) + +#define ROME_FW_PATH "/lib/firmware/rampatch.img" +#define ROME_RAMPATCH_TLV_PATH "/lib/firmware/rampatch_tlv.img" +#define ROME_NVM_TLV_PATH "/lib/firmware/nvm_tlv.bin" +#define ROME_RAMPATCH_TLV_1_0_3_PATH "/lib/firmware/rampatch_tlv_1.3.tlv" +#define ROME_NVM_TLV_1_0_3_PATH "/lib/firmware/nvm_tlv_1.3.bin" +#define ROME_RAMPATCH_TLV_2_0_1_PATH "/lib/firmware/rampatch_tlv_2.1.tlv" +#define ROME_NVM_TLV_2_0_1_PATH "/lib/firmware/nvm_tlv_2.1.bin" +#define ROME_RAMPATCH_TLV_3_0_0_PATH "/lib/firmware/rampatch_tlv_3.0.tlv" +#define ROME_NVM_TLV_3_0_0_PATH "/lib/firmware/nvm_tlv_3.0.bin" +#define ROME_RAMPATCH_TLV_3_0_2_PATH "/lib/firmware/btfw32.tlv" +#define ROME_NVM_TLV_3_0_2_PATH "/lib/firmware/btnv32.bin" +#ifdef _PLATFORM_MDM_ +#define TF_RAMPATCH_TLV_1_0_0_PATH "/lib/firmware/rampatch_tlv_tf_1.0.tlv" +#define TF_NVM_TLV_1_0_0_PATH "/lib/firmware/nvm_tlv_tf_1.0.bin" +#define TF_RAMPATCH_TLV_1_0_1_PATH "/lib/firmware/tfbtfw11.tlv" +#define TF_NVM_TLV_1_0_1_PATH "/lib/firmware/tfbtnv11.bin" +#else +#define TF_RAMPATCH_TLV_1_0_0_PATH "/lib/firmware/qca/rampatch_tlv_tf_1.0.tlv" +#define TF_NVM_TLV_1_0_0_PATH "/lib/firmware/qca/nvm_tlv_tf_1.0.bin" +#define TF_RAMPATCH_TLV_1_0_1_PATH "/lib/firmware/qca/tfbtfw11.tlv" +#define TF_NVM_TLV_1_0_1_PATH "/lib/firmware/qca/tfbtnv11.bin" +#endif + +/* This header value in rampatch file decides event handling mechanism in the HOST */ +#define ROME_SKIP_EVT_NONE 0x00 +#define ROME_SKIP_EVT_VSE 0x01 +#define ROME_SKIP_EVT_CC 0x02 +#define ROME_SKIP_EVT_VSE_CC 0x03 + +#define FW_CONFIG_FILE_PATH "/etc/bluetooth/firmware.conf" +/****************************************************************************** +** Local type definitions +******************************************************************************/ + +typedef struct { + unsigned char ncmd; + unsigned short opcode; +} __attribute__ ((packed)) evt_cmd_complete; + +typedef struct { + unsigned char status; + unsigned char ncmd; + unsigned short opcode; +} __attribute__ ((packed)) evt_cmd_status; + +typedef struct { + unsigned short opcode; + unsigned char plen; +} __attribute__ ((packed)) hci_command_hdr; + +typedef struct { + unsigned char evt; + unsigned char plen; +} __attribute__ ((packed)) hci_event_hdr; +typedef struct { + unsigned short rom_version; + unsigned short build_version; +} __attribute__ ((packed)) patch_version; + +typedef struct { + unsigned int patch_id; + patch_version patch_ver; + unsigned int patch_base_addr; + unsigned int patch_entry_addr; + unsigned short patch_length; + int patch_crc; + unsigned short patch_ctrl; +} __attribute__ ((packed)) patch_info; + +typedef struct { + unsigned int tlv_data_len; + unsigned int tlv_patch_data_len; + unsigned char sign_ver; + unsigned char sign_algorithm; + unsigned char dwnd_cfg; + unsigned char reserved1; + unsigned short prod_id; + unsigned short build_ver; + unsigned short patch_ver; + unsigned short reserved2; + unsigned int patch_entry_addr; +} __attribute__ ((packed)) tlv_patch_hdr; + +typedef struct { + unsigned short tag_id; + unsigned short tag_len; + unsigned int tag_ptr; + unsigned int tag_ex_flag; +} __attribute__ ((packed)) tlv_nvm_hdr; + +typedef struct { + unsigned char tlv_type; + unsigned char tlv_length1; + unsigned char tlv_length2; + unsigned char tlv_length3; + + union{ + tlv_patch_hdr patch; + tlv_nvm_hdr nvm; + }tlv; +} __attribute__ ((packed)) tlv_patch_info; + +enum{ + BAUDRATE_115200 = 0x00, + BAUDRATE_57600 = 0x01, + BAUDRATE_38400 = 0x02, + BAUDRATE_19200 = 0x03, + BAUDRATE_9600 = 0x04, + BAUDRATE_230400 = 0x05, + BAUDRATE_250000 = 0x06, + BAUDRATE_460800 = 0x07, + BAUDRATE_500000 = 0x08, + BAUDRATE_720000 = 0x09, + BAUDRATE_921600 = 0x0A, + BAUDRATE_1000000 = 0x0B, + BAUDRATE_1250000 = 0x0C, + BAUDRATE_2000000 = 0x0D, + BAUDRATE_3000000 = 0x0E, + BAUDRATE_4000000 = 0x0F, + BAUDRATE_1600000 = 0x10, + BAUDRATE_3200000 = 0x11, + BAUDRATE_3500000 = 0x12, + BAUDRATE_AUTO = 0xFE, + BAUDRATE_Reserved = 0xFF +}; + +enum{ + ROME_PATCH_VER_0100 = 0x0100, + ROME_PATCH_VER_0101 = 0x0101, + ROME_PATCH_VER_0200 = 0x0200, + ROME_PATCH_VER_0300 = 0x0300, + ROME_PATCH_VER_0302 = 0x0302 + }; + +enum{ + ROME_SOC_ID_00 = 0x00000000, + ROME_SOC_ID_11 = 0x00000011, + ROME_SOC_ID_13 = 0x00000013, + ROME_SOC_ID_22 = 0x00000022, + ROME_SOC_ID_23 = 0x00000023, + ROME_SOC_ID_44 = 0x00000044 +}; + +enum{ + ROME_VER_UNKNOWN = 0, + ROME_VER_1_0 = ((ROME_PATCH_VER_0100 << 16 ) | ROME_SOC_ID_00 ), + ROME_VER_1_1 = ((ROME_PATCH_VER_0101 << 16 ) | ROME_SOC_ID_00 ), + ROME_VER_1_3 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_00 ), + ROME_VER_2_1 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_11 ), + ROME_VER_3_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_22 ), + ROME_VER_3_2 = ((ROME_PATCH_VER_0302 << 16 ) | ROME_SOC_ID_44 ), + TUFELLO_VER_1_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_13 ), + TUFELLO_VER_1_1 = ((ROME_PATCH_VER_0302 << 16 ) | ROME_SOC_ID_23 ) +}; +#endif /* HW_ROME_H */ ================================================ FILE: packages/network/bluez/patches/bluez-40-Add-support-for-sprd-type-in-hciattach.patch ================================================ From 8db209b20b58ce1915b1366d29ae85c79dc1c4ea Mon Sep 17 00:00:00 2001 From: Peter Vicman Date: Tue, 28 Jun 2022 10:10:12 +0200 Subject: [PATCH] Add support for sprd type in hciattach /usr/bin/hciattach -s 1500000 /dev/ttyBT0 sprd hciattach_sprd.c file come from https://github.com/orangepi-xunlong/orangepi-build/commit/cbface3801e14c3f99cdabb53f57a0baff4319a1 https://github.com/orangepi-xunlong/orangepi-build/blob/main/external/cache/sources/hcitools/hciattach_sprd.c BT_CONFIG_PATH changed to "/lib/firmware/unisoc" --- Makefile.tools | 3 +- tools/hciattach.c | 30 +- tools/hciattach.h | 18 + tools/hciattach_sprd.c | 832 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 868 insertions(+), 15 deletions(-) create mode 100644 tools/hciattach_sprd.c diff --git a/Makefile.tools b/Makefile.tools index 4b513366f..1842e6285 100644 --- a/Makefile.tools +++ b/Makefile.tools @@ -378,7 +378,8 @@ tools_hciattach_SOURCES = tools/hciattach.c tools/hciattach.h \ tools/hciattach_ath3k.c \ tools/hciattach_qualcomm.c \ tools/hciattach_intel.c \ - tools/hciattach_bcm43xx.c + tools/hciattach_bcm43xx.c \ + tools/hciattach_sprd.c tools_hciattach_LDADD = lib/libbluetooth-internal.la tools_hciconfig_SOURCES = tools/hciconfig.c diff --git a/tools/hciattach.c b/tools/hciattach.c index 276a4e56e..a3267a962 100644 --- a/tools/hciattach.c +++ b/tools/hciattach.c @@ -38,20 +38,6 @@ #include "hciattach.h" -struct uart_t { - char *type; - int m_id; - int p_id; - int proto; - int init_speed; - int speed; - int flags; - int pm; - char *bdaddr; - int (*init) (int fd, struct uart_t *u, struct termios *ti); - int (*post) (int fd, struct uart_t *u, struct termios *ti); -}; - #define FLOW_CTL 0x0001 #define AMP_DEV 0x0002 #define ENABLE_PM 1 @@ -266,6 +252,19 @@ static int bcm43xx(int fd, struct uart_t *u, struct termios *ti) return bcm43xx_init(fd, u->init_speed, u->speed, ti, u->bdaddr); } +/* add sprd init and post function */ +static int sprd_init(int fd, struct uart_t *u, struct termios *ti) +{ + fprintf(stderr, "SPRD Bluetooth init uart with init speed:%d, final_speed:%d, type:HCI UART %s\n", u->init_speed, u->speed, (u->proto == HCI_UART_H4)? "H4":"H5" ); + return sprd_config_init(fd, u, ti); +} + +static int sprd_post(int fd, struct uart_t *u, struct termios *ti) +{ + fprintf(stderr, "SPRD Bluetooth post process\n"); + return sprd_config_post(fd, u, ti); +} + static int read_check(int fd, void *buf, int count) { int res; @@ -1097,6 +1096,9 @@ struct uart_t uart[] = { { "amp", 0x0000, 0x0000, HCI_UART_H4, 115200, 115200, AMP_DEV, DISABLE_PM, NULL, NULL, NULL }, + /* Bluetooth chip (UWE5622)*/ + { "sprd", 0x0000, 0x0000, NULL, 115200, 1500000, + FLOW_CTL, DISABLE_PM, NULL, sprd_init, sprd_post}, { NULL, 0 } }; diff --git a/tools/hciattach.h b/tools/hciattach.h index 26c0d5424..69bc0ccef 100644 --- a/tools/hciattach.h +++ b/tools/hciattach.h @@ -40,6 +40,20 @@ #define HCI_UART_EXT_CONFIG 4 #define HCI_UART_VND_DETECT 5 +struct uart_t { + char *type; + int m_id; + int p_id; + int proto; + int init_speed; + int speed; + int flags; + int pm; + char *bdaddr; + int (*init) (int fd, struct uart_t *u, struct termios *ti); + int (*post) (int fd, struct uart_t *u, struct termios *ti); +}; + int read_hci_event(int fd, unsigned char *buf, int size); int set_speed(int fd, struct termios *ti, int speed); int uart_speed(int speed); @@ -56,3 +70,7 @@ int qualcomm_init(int fd, int speed, struct termios *ti, const char *bdaddr); int intel_init(int fd, int init_speed, int *speed, struct termios *ti); int bcm43xx_init(int fd, int def_speed, int speed, struct termios *ti, const char *bdaddr); + +/* add sprd init and post process for sprd Bluetooth chip (UWE5622) */ +int sprd_config_init(int fd, struct uart_t *u, struct termios *ti); +int sprd_config_post(int fd, struct uart_t *u, struct termios *ti); diff --git a/tools/hciattach_sprd.c b/tools/hciattach_sprd.c new file mode 100644 index 000000000..12b4795de --- /dev/null +++ b/tools/hciattach_sprd.c @@ -0,0 +1,832 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "lib/bluetooth.h" +#include "hciattach.h" + +/****************************************************************************** +** Constants & Macros +******************************************************************************/ +#define LOG_STR "SPRD Bluetooth" +#define DBG_ON 1 + +#define SPRD_DBG(fmt, arg...) \ + do { \ + if (DBG_ON) \ + fprintf(stderr, "%s: " fmt "\n" , LOG_STR, ##arg); \ + } while(0) + +#define SPRD_ERR(fmt, arg...) \ + do { \ + fprintf(stderr, "%s ERROR: " fmt "\n", LOG_STR, ##arg);\ + perror(LOG_STR" ERROR reason"); \ + } while(0) + +#define SPRD_DUMP(buffer, len) \ + fprintf(stderr, "%s: ", LOG_STR); \ + do { \ + int i = 0; \ + for (i = 0; i < len; i++) { \ + if (i && !(i % 16)) { \ + fprintf(stderr, "\n"); \ + fprintf(stderr, "%s: ", LOG_STR); \ + } \ + fprintf(stderr, "%02x ", buffer[i]); \ + } \ + fprintf(stderr, "\n"); \ + } while (0) + +#define CONF_ITEM_TABLE(ITEM, ACTION, BUF, LEN) \ + { #ITEM, ACTION, &(BUF.ITEM), LEN, (sizeof(BUF.ITEM) / LEN) } + +#define UINT8_TO_STREAM(p, u8) \ + { *(p)++ = (uint8_t)(u8); } + +#define STREAM_TO_UINT8(u8, p) \ + { \ + (u8) = (uint8_t)(*(p)); \ + (p) += 1; \ + } + +#define UINT16_TO_STREAM(p, u16) \ + { \ + *(p)++ = (uint8_t)(u16); \ + *(p)++ = (uint8_t)((u16) >> 8); \ + } + +#define STREAM_TO_UINT16(u16, p) \ + { \ + (u16) = ((uint16_t)(*(p)) + (((uint16_t)(*((p) + 1))) << 8)); \ + (p) += 2; \ + } + +#define UINT32_TO_STREAM(p, u32) \ + { \ + *(p)++ = (uint8_t)(u32); \ + *(p)++ = (uint8_t)((u32) >> 8); \ + *(p)++ = (uint8_t)((u32) >> 16); \ + *(p)++ = (uint8_t)((u32) >> 24); \ + } + +#define CONF_COMMENT '#' +#define CONF_DELIMITERS " =\n\r\t" +#define CONF_VALUES_DELIMITERS "=\n\r\t#" +#define CONF_VALUES_PARTITION " ,=\n\r\t#" +#define CONF_MAX_LINE_LEN 255 + +#define HCI_PSKEY 0xFCA0 +#define HCI_VSC_ENABLE_COMMMAND 0xFCA1 +#define HCI_RF_PARA 0xFCA2 + +#define RESPONSE_LENGTH 100 +#define HCI_CMD_MAX_LEN 258 +#define HCI_EVT_CMD_CMPL_OPCODE 3 +#define HCI_PACKET_TYPE_COMMAND 1 +#define HCI_CMD_PREAMBLE_SIZE 3 + +#define FW_NODE_BYTE 6 +#define FW_DATE_D_BYTE 8 +#define FW_DATE_M_BYTE 9 +#define FW_DATE_Y_BYTE 10 + +//#define BT_CONFIG_PATH "/lib/firmware" +#define BT_CONFIG_PATH "/lib/firmware/unisoc" +#define BT_HC_HDR_SIZE (sizeof(HC_BT_HDR)) +#define BT_VND_OP_RESULT_SUCCESS 0 +#define BT_VND_OP_RESULT_FAIL 1 +#define MSG_STACK_TO_HC_HCI_CMD 0x2000 +#define START_STOP_CMD_SIZE 3 +#define DUAL_MODE 0 +#define DISABLE_BT 0 +#define ENABLE_BT 1 + +typedef void (*hci_cback)(void *); +typedef int (conf_action_t)(char *p_conf_name, char *p_conf_value, void *buf, int len, int size); + +typedef struct { + uint16_t event; + uint16_t len; + uint16_t offset; + uint16_t layer_specific; + uint8_t data[]; +} HC_BT_HDR; + +typedef struct { + uint32_t device_class; + uint8_t feature_set[16]; + uint8_t device_addr[6]; + uint16_t comp_id; + uint8_t g_sys_uart0_communication_supported; + uint8_t cp2_log_mode; + uint8_t LogLevel; + uint8_t g_central_or_perpheral; + uint16_t Log_BitMask; + uint8_t super_ssp_enable; + uint8_t common_rfu_b3; + uint32_t common_rfu_w[2]; + uint32_t le_rfu_w[2]; + uint32_t lmp_rfu_w[2]; + uint32_t lc_rfu_w[2]; + uint16_t g_wbs_nv_117; + uint16_t g_wbs_nv_118; + uint16_t g_nbv_nv_117; + uint16_t g_nbv_nv_118; + uint8_t g_sys_sco_transmit_mode; + uint8_t audio_rfu_b1; + uint8_t audio_rfu_b2; + uint8_t audio_rfu_b3; + uint32_t audio_rfu_w[2]; + uint8_t g_sys_sleep_in_standby_supported; + uint8_t g_sys_sleep_master_supported; + uint8_t g_sys_sleep_slave_supported; + uint8_t power_rfu_b1; + uint32_t power_rfu_w[2]; + uint32_t win_ext; + uint8_t edr_tx_edr_delay; + uint8_t edr_rx_edr_delay; + uint8_t tx_delay; + uint8_t rx_delay; + uint32_t bb_rfu_w[2]; + uint8_t agc_mode; + uint8_t diff_or_eq; + uint8_t ramp_mode; + uint8_t modem_rfu_b1; + uint32_t modem_rfu_w[2]; + uint32_t BQB_BitMask_1; + uint32_t BQB_BitMask_2; + uint16_t bt_coex_threshold[8]; + uint32_t other_rfu_w[6]; +} pskey_config_t; + +typedef struct { + uint16_t g_GainValue_A[6]; + uint16_t g_ClassicPowerValue_A[10]; + uint16_t g_LEPowerValue_A[16]; + uint16_t g_BRChannelpwrvalue_A[8]; + uint16_t g_EDRChannelpwrvalue_A[8]; + uint16_t g_LEChannelpwrvalue_A[8]; + uint16_t g_GainValue_B[6]; + uint16_t g_ClassicPowerValue_B[10]; + uint16_t g_LEPowerValue_B[16]; + uint16_t g_BRChannelpwrvalue_B[8]; + uint16_t g_EDRChannelpwrvalue_B[8]; + uint16_t g_LEChannelpwrvalue_B[8]; + uint16_t LE_fix_powerword; + uint8_t Classic_pc_by_channel; + uint8_t LE_pc_by_channel; + uint8_t RF_switch_mode; + uint8_t Data_Capture_Mode; + uint8_t Analog_IQ_Debug_Mode; + uint8_t RF_common_rfu_b3; + uint32_t RF_common_rfu_w[5]; +} rf_config_t; + +typedef struct { + const char *conf_entry; + conf_action_t *p_action; + void *buf; + int len; + int size; +} conf_entry_t; + +static uint8_t local_bdaddr[6]={0x10, 0x11, 0x12, 0x13, 0x14, 0x15}; +static pskey_config_t marlin3_pskey; +static rf_config_t marlin3_rf_config; +static int s_bt_fd = -1; + +static const conf_entry_t marlin3_pksey_table[] = { + CONF_ITEM_TABLE(device_class, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(feature_set, 0, marlin3_pskey, 16), + CONF_ITEM_TABLE(device_addr, 0, marlin3_pskey, 6), + CONF_ITEM_TABLE(comp_id, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(g_sys_uart0_communication_supported, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(cp2_log_mode, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(LogLevel, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(g_central_or_perpheral, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(Log_BitMask, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(super_ssp_enable, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(common_rfu_b3, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(common_rfu_w, 0, marlin3_pskey, 2), + CONF_ITEM_TABLE(le_rfu_w, 0, marlin3_pskey, 2), + CONF_ITEM_TABLE(lmp_rfu_w, 0, marlin3_pskey, 2), + CONF_ITEM_TABLE(lc_rfu_w, 0, marlin3_pskey, 2), + CONF_ITEM_TABLE(g_wbs_nv_117, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(g_wbs_nv_118, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(g_nbv_nv_117, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(g_nbv_nv_118, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(g_sys_sco_transmit_mode, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(audio_rfu_b1, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(audio_rfu_b2, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(audio_rfu_b3, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(audio_rfu_w, 0, marlin3_pskey, 2), + CONF_ITEM_TABLE(g_sys_sleep_in_standby_supported, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(g_sys_sleep_master_supported, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(g_sys_sleep_slave_supported, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(power_rfu_b1, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(power_rfu_w, 0, marlin3_pskey, 2), + CONF_ITEM_TABLE(win_ext, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(edr_tx_edr_delay, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(edr_rx_edr_delay, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(tx_delay, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(rx_delay, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(bb_rfu_w, 0, marlin3_pskey, 2), + CONF_ITEM_TABLE(agc_mode, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(diff_or_eq, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(ramp_mode, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(modem_rfu_b1, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(modem_rfu_w, 0, marlin3_pskey, 2), + CONF_ITEM_TABLE(BQB_BitMask_1, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(BQB_BitMask_2, 0, marlin3_pskey, 1), + CONF_ITEM_TABLE(bt_coex_threshold, 0, marlin3_pskey, 8), + CONF_ITEM_TABLE(other_rfu_w, 0, marlin3_pskey, 6), + {0, 0, 0, 0, 0} +}; + +static const conf_entry_t marlin3_rf_table[] = { + CONF_ITEM_TABLE(g_GainValue_A, 0, marlin3_rf_config, 6), + CONF_ITEM_TABLE(g_ClassicPowerValue_A, 0, marlin3_rf_config, 10), + CONF_ITEM_TABLE(g_LEPowerValue_A, 0, marlin3_rf_config, 16), + CONF_ITEM_TABLE(g_BRChannelpwrvalue_A, 0, marlin3_rf_config, 8), + CONF_ITEM_TABLE(g_EDRChannelpwrvalue_A, 0, marlin3_rf_config, 8), + CONF_ITEM_TABLE(g_LEChannelpwrvalue_A, 0, marlin3_rf_config, 8), + CONF_ITEM_TABLE(g_GainValue_B, 0, marlin3_rf_config, 6), + CONF_ITEM_TABLE(g_ClassicPowerValue_B, 0, marlin3_rf_config, 10), + CONF_ITEM_TABLE(g_LEPowerValue_B, 0, marlin3_rf_config, 16), + CONF_ITEM_TABLE(g_BRChannelpwrvalue_B, 0, marlin3_rf_config, 8), + CONF_ITEM_TABLE(g_EDRChannelpwrvalue_B, 0, marlin3_rf_config, 8), + CONF_ITEM_TABLE(g_LEChannelpwrvalue_B, 0, marlin3_rf_config, 8), + CONF_ITEM_TABLE(LE_fix_powerword, 0, marlin3_rf_config, 1), + CONF_ITEM_TABLE(Classic_pc_by_channel, 0, marlin3_rf_config, 1), + CONF_ITEM_TABLE(LE_pc_by_channel, 0, marlin3_rf_config, 1), + CONF_ITEM_TABLE(RF_switch_mode, 0, marlin3_rf_config, 1), + CONF_ITEM_TABLE(Data_Capture_Mode, 0, marlin3_rf_config, 1), + CONF_ITEM_TABLE(Analog_IQ_Debug_Mode, 0, marlin3_rf_config, 1), + CONF_ITEM_TABLE(RF_common_rfu_b3, 0, marlin3_rf_config, 1), + CONF_ITEM_TABLE(RF_common_rfu_w, 0, marlin3_rf_config, 5), + {0, 0, 0, 0, 0} +}; + +static void log_bin_to_hexstr(uint8_t *bin, uint8_t binsz, const char *log_tag) +{ + SPRD_DBG("%s", log_tag); + SPRD_DUMP(bin, binsz); +} + +static void parse_number(char *p_conf_name, char *p_conf_value, void *buf, int len, int size) +{ + uint8_t *dest = (uint8_t *)buf; + char *sub_value, *p; + uint32_t value; + (void)p_conf_name; + sub_value = strtok_r(p_conf_value, CONF_VALUES_PARTITION, &p); + do { + if (sub_value == NULL) + break; + + if (sub_value[0] == '0' && (sub_value[1] == 'x' || sub_value[1] == 'X')) + value = strtoul(sub_value, 0, 16) & 0xFFFFFFFF; + else + value = strtoul(sub_value, 0, 10) & 0xFFFFFFFF; + + switch (size) { + case sizeof(uint8_t): + *dest = value & 0xFF; + dest += size; + break; + + case sizeof(uint16_t): + *((uint16_t *)dest) = value & 0xFFFF; + dest += size; + break; + + case sizeof(uint32_t): + *((uint32_t *)dest) = value & 0xFFFFFFFF; + dest += size; + break; + + default: + break; + } + sub_value = strtok_r(NULL, CONF_VALUES_PARTITION, &p); + } while (--len); +} + +static unsigned char compare_char(unsigned char ch) +{ + unsigned char data = 0x0; + + switch(ch) + { + case 0: + case '0': + data = 0x0; + break; + case 1: + case '1': + data = 0x1; + break; + case 2: + case '2': + data = 0x2; + break; + case 3: + case '3': + data = 0x3; + break; + case 4: + case '4': + data = 0x4; + break; + case 5: + case '5': + data = 0x5; + break; + case 6: + case '6': + data = 0x6; + break; + case 7: + case '7': + data = 0x7; + break; + case 8: + case '8': + data = 0x8; + break; + case 9: + case '9': + data = 0x9; + break; + case 10: + case 'a': + case 'A': + data = 0xA; + break; + case 11: + case 'b': + case 'B': + data = 0xB; + break; + case 12: + case 'c': + case 'C': + data = 0xC; + break; + case 13: + case 'd': + case 'D': + data = 0xD; + break; + case 14: + case 'e': + case 'E': + data = 0xE; + break; + case 15: + case 'f': + case 'F': + data = 0xF; + break; + } + return data; +} + +static void set_mac_address(uint8_t *addr) +{ + int i = 0; + SPRD_DBG("%s", __func__); + //for (i = 0; i < 6; i++) + // addr[5-i] = (unsigned char)local_bdaddr[i]; + + FILE *fp = fopen("/sys/class/addr_mgt/addr_bt", "r+"); + unsigned char buff[255]; + fscanf(fp, "%s", buff); + fclose(fp); + int k = 0; + + unsigned char tmp[5]; + sprintf(tmp, "%c%c", buff[0], buff[1]); + unsigned char str = compare_char(tmp[0]); + unsigned char str2 = compare_char(tmp[1]); + local_bdaddr[0] = (str << 4) | str2; + + sprintf(tmp, "%c%c", buff[3], buff[4]); + str = compare_char(tmp[0]); + str2 = compare_char(tmp[1]); + local_bdaddr[1] = (str << 4) | str2; + + sprintf(tmp, "%c%c", buff[6], buff[7]); + str = compare_char(tmp[0]); + str2 = compare_char(tmp[1]); + local_bdaddr[2] = (str << 4) | str2; + + sprintf(tmp, "%c%c", buff[9], buff[10]); + str = compare_char(tmp[0]); + str2 = compare_char(tmp[1]); + local_bdaddr[3] = (str << 4) | str2; + + sprintf(tmp, "%c%c", buff[12], buff[13]); + str = compare_char(tmp[0]); + str2 = compare_char(tmp[1]); + local_bdaddr[4] = (str << 4) | str2; + + sprintf(tmp, "%c%c", buff[15], buff[16]); + str = compare_char(tmp[0]); + str2 = compare_char(tmp[1]); + local_bdaddr[5] = (str << 4) | str2; + + { + for (i = 0; i < 6; i++) + addr[5-i] = (unsigned char)local_bdaddr[i]; + } + +} + +static void vnd_load_configure(const char *p_path, const conf_entry_t *entry) +{ + FILE *p_file; + char *p_name, *p_value, *p; + conf_entry_t *p_entry; + char line[CONF_MAX_LINE_LEN + 1]; /* add 1 for \0 char */ + + SPRD_DBG("Attempt to load conf from %s", p_path); + + if ((p_file = fopen(p_path, "r")) != NULL) { + /* read line by line */ + while (fgets(line, CONF_MAX_LINE_LEN + 1, p_file) != NULL) { + if (line[0] == CONF_COMMENT) continue; + + p_name = strtok_r(line, CONF_DELIMITERS, &p); + + if (NULL == p_name) { + continue; + } + + p_value = strtok_r(NULL, CONF_VALUES_DELIMITERS, &p); + + if (NULL == p_value) { + SPRD_DBG("vnd_load_conf: missing value for name: %s", p_name); + continue; + } + + p_entry = (conf_entry_t*)entry; + + while (p_entry->conf_entry != NULL) { + if (strcmp(p_entry->conf_entry, (const char *)p_name) == 0) { + if (p_entry->p_action) { + p_entry->p_action(p_name, p_value, p_entry->buf, p_entry->len, + p_entry->size); + } else { + SPRD_DBG("%s -> %s", p_name, p_value); + parse_number(p_name, p_value, p_entry->buf, p_entry->len, + p_entry->size); + } + break; + } + + p_entry++; + } + } + + fclose(p_file); + } else { + SPRD_DBG("vnd_load_conf file >%s< not found", p_path); + } +} + +static size_t H4Protocol_Send(uint8_t type, const uint8_t* data, size_t length) +{ + struct iovec iov[] = { + {&type, sizeof(type)}, + {(uint8_t *)data, length}}; + + ssize_t ret = 0; + do { + ret = writev(s_bt_fd, iov, sizeof(iov) / sizeof(iov[0])); + } while (-1 == ret && EAGAIN == errno); + + if (ret == -1) { + SPRD_ERR("%s error writing to UART (%s)", __func__, strerror(errno)); + } else if (ret < length + 1) { + SPRD_ERR("%s: %d / %d bytes written - something went wrong...", __func__, ret, length + 1); + } + + return ret; +} + +static void *bt_vendor_alloc(int size) +{ + void *p = (uint8_t *)malloc(size); + return p; +} + +static void bt_vendor_free(void *buffer) +{ + free(buffer); +} + +static uint8_t bt_vendor_xmit(uint16_t opcode, void* buffer, hci_cback callback) +{ + uint8_t type = HCI_PACKET_TYPE_COMMAND; + (void)opcode; + HC_BT_HDR* bt_hdr = (HC_BT_HDR *)buffer; + H4Protocol_Send(type, bt_hdr->data, bt_hdr->len); + return BT_VND_OP_RESULT_SUCCESS; +} + +static uint8_t sprd_vnd_send_hci_vsc(uint16_t cmd, uint8_t *payload, uint8_t len, hci_cback cback) +{ + HC_BT_HDR *p_buf; + uint8_t *p, ret; + + p_buf = (HC_BT_HDR *)bt_vendor_alloc( + BT_HC_HDR_SIZE + HCI_CMD_PREAMBLE_SIZE + len); + if (p_buf) { + p_buf->event = MSG_STACK_TO_HC_HCI_CMD; + p_buf->offset = 0; + p_buf->layer_specific = 0; + p_buf->len = HCI_CMD_PREAMBLE_SIZE + len; + p = (uint8_t *)(p_buf + 1); + + UINT16_TO_STREAM(p, cmd); + *p++ = len; + memcpy(p, payload, len); + log_bin_to_hexstr((uint8_t *)(p_buf + 1), HCI_CMD_PREAMBLE_SIZE + len, __FUNCTION__); + ret = bt_vendor_xmit(cmd, p_buf, cback); + bt_vendor_free(p_buf); + return ret; + } + return BT_VND_OP_RESULT_FAIL; +} + +static void hw_core_cback(void *p_mem) +{ + uint8_t *p_evt_buf = (uint8_t *)p_mem; + uint8_t *p, status; + uint16_t opcode, mode; + + p = (uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OPCODE; + STREAM_TO_UINT16(opcode,p); + STREAM_TO_UINT16(mode,p); + STREAM_TO_UINT8(status,p); + SPRD_DBG("%s hw_core_cback response: [0x%04X, 0x%04X, 0x%02X]", __func__, opcode, mode, status); + bt_vendor_free(p_evt_buf); +} + +static void hw_core_enable(unsigned char enable) +{ + uint8_t *p, msg_req[HCI_CMD_MAX_LEN]; + p = msg_req; + UINT16_TO_STREAM(p, DUAL_MODE); + UINT8_TO_STREAM(p, enable ? ENABLE_BT : DISABLE_BT); + sprd_vnd_send_hci_vsc(HCI_VSC_ENABLE_COMMMAND, msg_req, (uint8_t)(p - msg_req), NULL); +} + +static void hw_rf_cback(void *p_mem) +{ + uint8_t *p_evt_buf = (uint8_t *)p_mem, len; + uint8_t *p, status; + uint16_t opcode, mode = 0; + + p = (uint8_t *)(p_evt_buf + 1) + 1; + STREAM_TO_UINT8(len, p); + + p = (uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OPCODE; + STREAM_TO_UINT16(opcode, p); + if (len == 6) + STREAM_TO_UINT16(mode, p); + + STREAM_TO_UINT8(status, p); + + SPRD_DBG("%s hw_rf_cback response: [0x%04X, 0x%04X, 0x%02X]", __func__, opcode, mode, status); + /* Must free the RX event buffer */ + bt_vendor_free(p_evt_buf); +} + +static int marlin3_rf_preload() +{ + uint8_t *p, msg_req[HCI_CMD_MAX_LEN]; + int i; + + SPRD_DBG("yujian.qin %s", __FUNCTION__); + p = msg_req; + + for (i = 0; i < 6; i++) + UINT16_TO_STREAM(p, marlin3_rf_config.g_GainValue_A[i]); + + for (i = 0; i < 10; i++) + UINT16_TO_STREAM(p, marlin3_rf_config.g_ClassicPowerValue_A[i]); + + for (i = 0; i < 16; i++) + UINT16_TO_STREAM(p, marlin3_rf_config.g_LEPowerValue_A[i]); + + for (i = 0; i < 8; i++) + UINT16_TO_STREAM(p, marlin3_rf_config.g_BRChannelpwrvalue_A[i]); + + for (i = 0; i < 8; i++) + UINT16_TO_STREAM(p, marlin3_rf_config.g_EDRChannelpwrvalue_A[i]); + + for (i = 0; i < 8; i++) + UINT16_TO_STREAM(p, marlin3_rf_config.g_LEChannelpwrvalue_A[i]); + + for (i = 0; i < 6; i++) + UINT16_TO_STREAM(p, marlin3_rf_config.g_GainValue_B[i]); + + for (i = 0; i < 10; i++) + UINT16_TO_STREAM(p, marlin3_rf_config.g_ClassicPowerValue_B[i]); + + for (i = 0; i < 16; i++) + UINT16_TO_STREAM(p, marlin3_rf_config.g_LEPowerValue_B[i]); + + for (i = 0; i < 8; i++) + UINT16_TO_STREAM(p, marlin3_rf_config.g_BRChannelpwrvalue_B[i]); + + for (i = 0; i < 8; i++) + UINT16_TO_STREAM(p, marlin3_rf_config.g_EDRChannelpwrvalue_B[i]); + + for (i = 0; i < 8; i++) + UINT16_TO_STREAM(p, marlin3_rf_config.g_LEChannelpwrvalue_B[i]); + + UINT16_TO_STREAM(p, marlin3_rf_config.LE_fix_powerword); + + UINT8_TO_STREAM(p, marlin3_rf_config.Classic_pc_by_channel); + UINT8_TO_STREAM(p, marlin3_rf_config.LE_pc_by_channel); + UINT8_TO_STREAM(p, marlin3_rf_config.RF_switch_mode); + UINT8_TO_STREAM(p, marlin3_rf_config.Data_Capture_Mode); + UINT8_TO_STREAM(p, marlin3_rf_config.Analog_IQ_Debug_Mode); + UINT8_TO_STREAM(p, marlin3_rf_config.RF_common_rfu_b3); + + for (i = 0; i < 5; i++) + UINT32_TO_STREAM(p, marlin3_rf_config.RF_common_rfu_w[i]); + + sprd_vnd_send_hci_vsc(HCI_RF_PARA, msg_req, (uint8_t)(p - msg_req), NULL); + return 0; +} + +static void marlin3_pskey_cback(void *p_mem) +{ + uint8_t *p_evt_buf = (uint8_t *)p_mem; + + uint16_t opcode, node, year; + uint8_t *p, month, day; + (void)opcode; + + p = (uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OPCODE; + STREAM_TO_UINT16(opcode, p); + + p = (uint8_t *)(p_evt_buf + 1) + FW_NODE_BYTE; + STREAM_TO_UINT16(node, p); + p = (uint8_t *)(p_evt_buf + 1) + FW_DATE_Y_BYTE; + STREAM_TO_UINT16(year, p); + p = (uint8_t *)(p_evt_buf + 1) + FW_DATE_M_BYTE; + STREAM_TO_UINT8(month, p); + p = (uint8_t *)(p_evt_buf + 1) + FW_DATE_D_BYTE; + STREAM_TO_UINT8(day, p); + + SPRD_DBG("Bluetooth Firmware Node: %04X Date: %04x-%02x-%02x", node, year, month, day); + + /* Must free the RX event buffer */ + bt_vendor_free(p_evt_buf); +} + +static int marlin3_pskey_preload(void *arg) +{ + uint8_t *p, msg_req[HCI_CMD_MAX_LEN]; + int i; + (void)arg; + + SPRD_DBG("%s", __FUNCTION__); + p = msg_req; + UINT32_TO_STREAM(p, marlin3_pskey.device_class); + + for (i = 0; i < 16; i++) + UINT8_TO_STREAM(p, marlin3_pskey.feature_set[i]); + + for (i = 0; i < 6; i++) + UINT8_TO_STREAM(p, marlin3_pskey.device_addr[i]); + + UINT16_TO_STREAM(p, marlin3_pskey.comp_id); + UINT8_TO_STREAM(p, marlin3_pskey.g_sys_uart0_communication_supported); + UINT8_TO_STREAM(p, marlin3_pskey.cp2_log_mode); + UINT8_TO_STREAM(p, marlin3_pskey.LogLevel); + UINT8_TO_STREAM(p, marlin3_pskey.g_central_or_perpheral); + + UINT16_TO_STREAM(p, marlin3_pskey.Log_BitMask); + UINT8_TO_STREAM(p, marlin3_pskey.super_ssp_enable); + UINT8_TO_STREAM(p, marlin3_pskey.common_rfu_b3); + + for (i = 0; i < 2; i++) + UINT32_TO_STREAM(p, marlin3_pskey.common_rfu_w[i]); + + for (i = 0; i < 2; i++) + UINT32_TO_STREAM(p, marlin3_pskey.le_rfu_w[i]); + + for (i = 0; i < 2; i++) + UINT32_TO_STREAM(p, marlin3_pskey.lmp_rfu_w[i]); + + for (i = 0; i < 2; i++) + UINT32_TO_STREAM(p, marlin3_pskey.lc_rfu_w[i]); + + UINT16_TO_STREAM(p, marlin3_pskey.g_wbs_nv_117); + UINT16_TO_STREAM(p, marlin3_pskey.g_wbs_nv_118); + UINT16_TO_STREAM(p, marlin3_pskey.g_nbv_nv_117); + UINT16_TO_STREAM(p, marlin3_pskey.g_nbv_nv_118); + + UINT8_TO_STREAM(p, marlin3_pskey.g_sys_sco_transmit_mode); + UINT8_TO_STREAM(p, marlin3_pskey.audio_rfu_b1); + UINT8_TO_STREAM(p, marlin3_pskey.audio_rfu_b2); + UINT8_TO_STREAM(p, marlin3_pskey.audio_rfu_b3); + + for (i = 0; i < 2; i++) + UINT32_TO_STREAM(p, marlin3_pskey.audio_rfu_w[i]); + + UINT8_TO_STREAM(p, marlin3_pskey.g_sys_sleep_in_standby_supported); + UINT8_TO_STREAM(p, marlin3_pskey.g_sys_sleep_master_supported); + UINT8_TO_STREAM(p, marlin3_pskey.g_sys_sleep_slave_supported); + UINT8_TO_STREAM(p, marlin3_pskey.power_rfu_b1); + + for (i = 0; i < 2; i++) + UINT32_TO_STREAM(p, marlin3_pskey.power_rfu_w[i]); + + UINT32_TO_STREAM(p, marlin3_pskey.win_ext); + + UINT8_TO_STREAM(p, marlin3_pskey.edr_tx_edr_delay); + UINT8_TO_STREAM(p, marlin3_pskey.edr_rx_edr_delay); + UINT8_TO_STREAM(p, marlin3_pskey.tx_delay); + UINT8_TO_STREAM(p, marlin3_pskey.rx_delay); + + for (i = 0; i < 2; i++) + UINT32_TO_STREAM(p, marlin3_pskey.bb_rfu_w[i]); + + UINT8_TO_STREAM(p, marlin3_pskey.agc_mode); + UINT8_TO_STREAM(p, marlin3_pskey.diff_or_eq); + UINT8_TO_STREAM(p, marlin3_pskey.ramp_mode); + UINT8_TO_STREAM(p, marlin3_pskey.modem_rfu_b1); + + for (i = 0; i < 2; i++) + UINT32_TO_STREAM(p, marlin3_pskey.modem_rfu_w[i]); + + UINT32_TO_STREAM(p, marlin3_pskey.BQB_BitMask_1); + UINT32_TO_STREAM(p, marlin3_pskey.BQB_BitMask_2); + for (i = 0; i < 8; i++) + UINT16_TO_STREAM(p, marlin3_pskey.bt_coex_threshold[i]); + + for (i = 0; i < 6; i++) + UINT32_TO_STREAM(p, marlin3_pskey.other_rfu_w[i]); + + sprd_vnd_send_hci_vsc(HCI_PSKEY, msg_req, (uint8_t)(p - msg_req), NULL); + return 0; +} + + +int sprd_config_init(int fd, struct uart_t *u, struct termios *ti) +{ + uint8_t *recv = NULL; + int len = 0; + + s_bt_fd = fd; + + memset(&marlin3_pskey, 0, sizeof(marlin3_pskey)); + memset(&marlin3_rf_config, 0, sizeof(marlin3_rf_config)); + vnd_load_configure(BT_CONFIG_PATH "/bt_configure_pskey.ini", &marlin3_pksey_table[0]); + vnd_load_configure(BT_CONFIG_PATH "/bt_configure_rf.ini", &marlin3_rf_table[0]); + //set_mac_address(marlin3_pskey.device_addr); + + marlin3_pskey_preload(NULL); + recv = bt_vendor_alloc(RESPONSE_LENGTH); + len = read_hci_event(s_bt_fd, recv, RESPONSE_LENGTH); + SPRD_DBG("Received event, len: %d", len); + SPRD_DUMP(recv, len); + marlin3_pskey_cback(recv); + + marlin3_rf_preload(); + recv = bt_vendor_alloc(RESPONSE_LENGTH); + len = read_hci_event(s_bt_fd, recv, RESPONSE_LENGTH); + SPRD_DBG("Received event, len: %d", len); + SPRD_DUMP(recv, len); + hw_rf_cback(recv); + + hw_core_enable(1); + recv = bt_vendor_alloc(RESPONSE_LENGTH); + len = read_hci_event(s_bt_fd, recv, RESPONSE_LENGTH); + SPRD_DBG("Received event, len: %d", len); + SPRD_DUMP(recv, len); + hw_core_cback(recv); + + return 0; +} + +int sprd_config_post(int fd, struct uart_t *u, struct termios *ti) +{ + SPRD_DBG("Done setting line discpline"); + return 0; +} -- 2.30.2 ================================================ FILE: packages/network/bluez/patches/fake-ps3.patch ================================================ diff --unified --recursive --text --color bluez-5.61.org/profiles/input/sixaxis.h bluez-5.61.new/profiles/input/sixaxis.h --- bluez-5.61.org/profiles/input/sixaxis.h 2021-02-23 04:26:59.000000000 +0800 +++ bluez-5.61.new/profiles/input/sixaxis.h 2021-08-29 16:30:07.102346000 +0800 @@ -87,6 +87,10 @@ return &devices[i]; } + if ( vid == 0x054c && pid == 0x0268 ) + + return &devices[1]; + return NULL; } ================================================ FILE: packages/network/bluez/system.d/bluetooth-defaults.service ================================================ [Unit] Description=Bluetooth defaults After=local-fs.target ConditionPathExists=!/storage/.cache/services/bluez.conf ConditionPathExists=!/storage/.cache/services/bluez.disabled [Service] Type=oneshot ExecStart=/bin/sh -c 'cp /usr/share/services/bluez.conf /storage/.cache/services/' RemainAfterExit=yes ================================================ FILE: packages/network/bluez/system.d/bluetooth.service ================================================ [Unit] Description=Bluetooth service After=syslog.target bluetooth-defaults.service Requires=bluetooth-defaults.service ConditionPathExists=/storage/.cache/services/bluez.conf [Service] Type=dbus BusName=org.bluez NotifyAccess=main EnvironmentFile=/storage/.cache/services/bluez.conf EnvironmentFile=-/run/libreelec/debug/bluez.conf ExecStart=/usr/lib/bluetooth/bluetoothd $BLUEZ_ARGS $BLUEZ_DEBUG CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_FOWNER LimitNPROC=1 TimeoutStopSec=1s Restart=on-failure RestartSec=2 StartLimitInterval=0 [Install] WantedBy=bluetooth.target Alias=dbus-org.bluez.service ================================================ FILE: packages/network/bluez/system.d/obex.service ================================================ [Unit] Description=Bluetooth service Requires=bluetooth.target bluetooth.service After=bluetooth.service ConditionPathExists=/storage/.cache/services/obexd.conf ConditionPathExists=/storage/.cache/services/bluez.conf [Service] EnvironmentFile=/storage/.cache/services/obexd.conf EnvironmentFile=-/run/libreelec/debug/obexd.conf ExecStartPre=/bin/sh -c 'mkdir -p $OBEXD_ROOT' ExecStart=/usr/lib/bluetooth/obexd -r $OBEXD_ROOT $OBEXD_DEBUG TimeoutStopSec=1s [Install] WantedBy=bluetooth.target ================================================ FILE: packages/network/bluez/tmpfiles.d/z_05_bluez.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) d /storage/.cache/bluetooth 0755 root root - - ================================================ FILE: packages/network/connman/config/settings ================================================ [global] OfflineMode=false [Wired] Enable=true [WiFi] Enable=true ================================================ FILE: packages/network/connman/debug.d/connman.conf ================================================ CONNMAN_DEBUG="--debug" CONNMANVPN_DEBUG="--debug" ================================================ FILE: packages/network/connman/package.mk ================================================ # 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="connman" PKG_VERSION="1.42" PKG_LICENSE="GPL" PKG_SITE="http://www.connman.net" PKG_URL="https://git.kernel.org/pub/scm/network/connman/connman.git/snapshot/connman-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain glib readline dbus iptables" PKG_LONGDESC="A modular network connection manager." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--srcdir=.. \ --disable-debug \ --disable-hh2serial-gps \ --disable-openconnect \ --disable-openvpn \ --disable-vpnc \ --disable-l2tp \ --disable-pptp \ --disable-iospm \ --disable-tist \ --disable-session-policy-local \ --disable-test \ --disable-nmcompat \ --disable-polkit \ --disable-selinux \ --enable-loopback \ --enable-ethernet \ --disable-gadget \ --disable-bluetooth \ --disable-ofono \ --disable-dundee \ --disable-pacrunner \ --disable-neard \ --disable-wispr \ --disable-tools \ --disable-stats \ --enable-client \ --enable-datafiles \ --with-dbusconfdir=/etc \ --with-systemdunitdir=/usr/lib/systemd/system \ --disable-silent-rules" if [ "${WIREGUARD_SUPPORT}" = "yes" ]; then PKG_CONFIGURE_OPTS_TARGET+=" --enable-wireguard=builtin" else PKG_CONFIGURE_OPTS_TARGET+=" --disable-wireguard" fi case "${WIRELESS_DAEMON}" in wpa_supplicant) PKG_DEPENDS_TARGET+=" wpa_supplicant" PKG_CONFIGURE_OPTS_TARGET+=" WPASUPPLICANT=/usr/bin/wpa_supplicant \ --enable-wifi \ --disable-iwd" ;; iwd) PKG_DEPENDS_TARGET+=" iwd" PKG_CONFIGURE_OPTS_TARGET+=" --disable-wifi \ --enable-iwd" ;; esac PKG_MAKE_OPTS_TARGET="storagedir=/storage/.cache/connman \ vpn_storagedir=/storage/.config/wireguard \ statedir=/run/connman" post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { rm -rf ${INSTALL}/usr/lib/systemd rm -rf ${INSTALL}/usr/lib/tmpfiles.d/connman_resolvconf.conf mkdir -p ${INSTALL}/usr/bin cp -P client/connmanctl ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/lib/connman cp -P ${PKG_DIR}/scripts/connman-setup ${INSTALL}/usr/lib/connman mkdir -p ${INSTALL}/etc/connman cp ../src/main.conf ${INSTALL}/etc/connman sed -i ${INSTALL}/etc/connman/main.conf \ -e "s|^# BackgroundScanning.*|BackgroundScanning = true|g" \ -e "s|^# UseGatewaysAsTimeservers.*|UseGatewaysAsTimeservers = false|g" \ -e "s|^# FallbackNameservers.*|FallbackNameservers = 8.8.8.8,8.8.4.4|g" \ -e "s|^# FallbackTimeservers.*|FallbackTimeservers = 0.pool.ntp.org,1.pool.ntp.org,2.pool.ntp.org,3.pool.ntp.org|g" \ -e "s|^# PreferredTechnologies.*|PreferredTechnologies = ethernet,wifi,cellular|g" \ -e "s|^# TetheringTechnologies.*|TetheringTechnologies = ethernet,wifi|g" \ -e "s|^# AllowHostnameUpdates.*|AllowHostnameUpdates = false|g" \ -e "s|^# PersistentTetheringMode.*|PersistentTetheringMode = true|g" \ -e "s|^# NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb|NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb,docker,veth,zt|g" mkdir -p ${INSTALL}/usr/share/connman/ cp ${PKG_DIR}/config/settings ${INSTALL}/usr/share/connman/ } post_install() { add_user system x 430 430 "service" "/var/run/connman" "/bin/sh" add_group system 430 enable_service connman.service if [ "${WIREGUARD_SUPPORT}" = "yes" ]; then enable_service connman-vpn.service fi } ================================================ FILE: packages/network/connman/patches/connman-01-do-not-cleanup-routes.patch ================================================ diff --git a/src/device.c b/src/device.c index 0fda950..eb09e53 100644 --- a/src/device.c +++ b/src/device.c @@ -1490,8 +1490,6 @@ int __connman_device_init(const char *device, const char *nodevice) if (nodevice) nodevice_filter = g_strsplit(nodevice, ",", -1); - cleanup_devices(); - return 0; } ================================================ FILE: packages/network/connman/patches/connman-04-ipv6-disabled-by-default.patch ================================================ commit 707a0d73d7231b1821072712a7771c7aef140e21 Author: Stefan Saraev Date: Tue Jul 23 11:28:10 2013 +0300 ipv6 disabled by default diff --git a/src/ipconfig.c b/src/ipconfig.c index fbeff8f..3eb61c4 100644 --- a/src/ipconfig.c +++ b/src/ipconfig.c @@ -1243,10 +1243,7 @@ static struct connman_ipconfig *create_ipv6config(int index) ipv6config->index = index; ipv6config->type = CONNMAN_IPCONFIG_TYPE_IPV6; - if (!is_ipv6_supported) - ipv6config->method = CONNMAN_IPCONFIG_METHOD_OFF; - else - ipv6config->method = CONNMAN_IPCONFIG_METHOD_AUTO; + ipv6config->method = CONNMAN_IPCONFIG_METHOD_OFF; ipdevice = g_hash_table_lookup(ipdevice_hash, GINT_TO_POINTER(index)); if (ipdevice) ================================================ FILE: packages/network/connman/patches/connman-05_link-against-ncurses.patch ================================================ From 59bd0267cc8a581ff6f3388756a5524159a75b3b Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Sat, 13 Dec 2014 14:36:57 +0200 Subject: [PATCH 5/5] link against ncurses --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 41efc1f..d1d3ddc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -312,7 +312,7 @@ client_connmanctl_SOURCES = client/dbus_helpers.h client/dbus_helpers.c \ client/main.c client_connmanctl_LDADD = gdbus/libgdbus-internal.la @DBUS_LIBS@ @GLIB_LIBS@ \ - -lreadline -ldl + -lreadline -lncurses -ldl endif noinst_PROGRAMS += unit/test-ippool -- 1.7.10.4 ================================================ FILE: packages/network/connman/scripts/connman-setup ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # creating initial settings file if [ ! -f /storage/.cache/connman/settings ]; then mkdir -p /storage/.cache/connman cp /usr/share/connman/settings /storage/.cache/connman fi # set variable for connman main.conf location if [ -f /storage/.config/connman_main.conf ]; then export CONNMAN_MAIN="--config=/storage/.config/connman_main.conf" else export CONNMAN_MAIN="--config=/etc/connman/main.conf" fi # switch resolv.conf management to connman and use current contents # as a fallback if [ -f /run/libreelec/resolv.conf ]; then cat /run/libreelec/resolv.conf > /run/connman/resolv.conf fi rm -f /run/libreelec/resolv.conf ln -s /run/connman/resolv.conf /run/libreelec/resolv.conf ================================================ FILE: packages/network/connman/system.d/connman-vpn.service ================================================ [Unit] Description=ConnMan VPN service [Service] Type=dbus BusName=net.connman.vpn ExecStart=/usr/sbin/connman-vpnd -n StandardOutput=null CapabilityBoundingSet=CAP_KILL CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID ProtectHome=read-only ProtectSystem=full [Install] WantedBy=multi-user.target ================================================ FILE: packages/network/connman/system.d/connman.service ================================================ [Unit] Description=Connection service DefaultDependencies=false Conflicts=shutdown.target Before=network.target multi-user.target shutdown.target After=dbus.service network-base.service Wants=network.target ConditionPathExists=!/dev/.kernel_ipconfig [Service] Type=dbus BusName=net.connman Restart=on-failure EnvironmentFile=-/run/libreelec/debug/connman.conf ExecStart=/bin/sh -c ". /usr/lib/connman/connman-setup; exec /usr/sbin/connmand -nr $CONNMAN_MAIN $CONNMAN_DEBUG" StandardOutput=null RestartSec=2 StartLimitInterval=0 [Install] WantedBy=multi-user.target ================================================ FILE: packages/network/connman/system.d/network-online.service ================================================ [Unit] Description=Wait for network to be configured by ConnMan After=connman.service Before=network-online.target DefaultDependencies=no Conflicts=shutdown.target ConditionPathExists=!/dev/.kernel_ipconfig [Service] Type=oneshot ExecStartPre=/bin/sh -c 'echo "waiting on Network to come online ..."' ExecStart=/usr/sbin/connmand-wait-online --timeout=30 StandardOutput=tty RemainAfterExit=yes [Install] WantedBy=network-online.target ================================================ FILE: packages/network/connman/tmpfiles.d/z_03_connman.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) d /run/connman 0755 root root - - d /storage/.cache/connman 0755 root root - - ================================================ FILE: packages/network/ethtool/package.mk ================================================ # 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="ethtool" PKG_LICENSE="GPL" PKG_SITE="https://www.kernel.org/pub/software/network/ethtool/" PKG_DEPENDS_TARGET="toolchain libmnl" PKG_LONGDESC="Ethtool is used for querying settings of an ethernet device and changing them." case "$LINUX" in rockchip-4.4|odroid-go-a-4.4|gameforce-4.4) PKG_VERSION="6.0" PKG_SHA256="d5446c93de570ce68f3b1ea69dbfa12fcfd67fc19897f655d3f18231e2b818d6" PKG_URL="https://www.kernel.org/pub/software/network/ethtool/${PKG_NAME}-${PKG_VERSION}.tar.xz" ;; *) PKG_VERSION="6.1" PKG_SHA256="c41fc881ffa5a40432d2dd829eb44c64a49dee482e716baacf9262c64daa8f90" PKG_URL="https://www.kernel.org/pub/software/network/ethtool/${PKG_NAME}-${PKG_VERSION}.tar.xz" ;; esac ================================================ FILE: packages/network/ethtool/udev.d/99-wakeup-eth.rules ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2010-2011 Roman Weber (roman@openelec.tv) # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) ACTION!="add|change", GOTO="end" SUBSYSTEM!="net", GOTO="end" ENV{INTERFACE}!="eth*", GOTO="end" TEST=="/sys/class/net/$env{INTERFACE}/device/power/wakeup", RUN+="/bin/sh -c 'echo enabled >/sys/class/net/$env{INTERFACE}/device/power/wakeup'" RUN+="/usr/sbin/ethtool -s $env{INTERFACE} wol g" LABEL="end" ================================================ FILE: packages/network/iptables/config/README ================================================ To create your own set of Netfilters you can save your rules in: /storage/.config/iptables/rules.v4 for ipv4 /storage/.config/iptables/rules.v6 for ipv6 To modify tables, edit with nano then save with: iptables-save >/storage/.config/iptables/rules.v4 ip6tables-save >/storage/.config/iptables/rules.v6 To disable iptables use the following command: systemctl mask iptables To enable iptables again: systemctl unmask iptables ================================================ FILE: packages/network/iptables/config/home.v4 ================================================ *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] :DOCKER-USER - [0:0] :private-subnets - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i tether -p udp -m conntrack --ctstate NEW -j ACCEPT -A INPUT -j private-subnets -A FORWARD -i tether -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT -A FORWARD -o tether -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A DOCKER-USER -j private-subnets -A private-subnets -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A private-subnets -s 10.0.0.0/8 -i eth+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 172.16.0.0/12 -i eth+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 192.168.0.0/16 -i eth+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 10.0.0.0/8 -i en+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 172.16.0.0/12 -i en+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 192.168.0.0/16 -i en+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 10.0.0.0/8 -i wl+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 172.16.0.0/12 -i wl+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 192.168.0.0/16 -i wl+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 10.0.0.0/8 -i tether -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 172.16.0.0/12 -i tether -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 192.168.0.0/16 -i tether -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 10.0.0.0/8 -i docker+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 172.16.0.0/12 -i docker+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 192.168.0.0/16 -i docker+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -j REJECT --reject-with icmp-port-unreachable COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT ================================================ FILE: packages/network/iptables/config/home.v6 ================================================ *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] :DOCKER-USER - [0:0] :private-subnets - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i tether -p udp -m conntrack --ctstate NEW -j ACCEPT -A INPUT -j private-subnets -A FORWARD -i tether -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT -A FORWARD -o tether -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A DOCKER-USER -j private-subnets -A private-subnets -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A private-subnets -s fc00::/7 -i eth+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s fc00::/7 -i en+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s fc00::/7 -i wl+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s fc00::/7 -i tether -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s fc00::/7 -i docker+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -j REJECT --reject-with icmp6-port-unreachable COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT ================================================ FILE: packages/network/iptables/config/public.v4 ================================================ # Netfilter rules for public "untrusted" networks *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] :DOCKER-USER - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Allow tethered Wifi AP -A INPUT -i tether -p udp -m conntrack --ctstate NEW -j ACCEPT -A INPUT -i tether -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i tether -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i tether -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -o tether -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Block DOCKER -A DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j RETURN -A DOCKER-USER -j REJECT --reject-with icmp-port-unreachable COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT ================================================ FILE: packages/network/iptables/config/public.v6 ================================================ # Netfilter Rules for trusted home networks. *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] :DOCKER-USER - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Allow tethered Wifi AP -A INPUT -i tether -p udp -m conntrack --ctstate NEW -j ACCEPT -A INPUT -i tether -s fc00::/7 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i tether -s fc00::/7 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i tether -s fc00::/7 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -o tether -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A DOCKER-USER -j REJECT --reject-with icmp6-port-unreachable COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT ================================================ FILE: packages/network/iptables/package.mk ================================================ # 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) PKG_NAME="iptables" PKG_VERSION="1.8.9" PKG_SHA256="ef6639a43be8325a4f8ea68123ffac236cb696e8c78501b64e8106afb008c87f" PKG_LICENSE="GPL" PKG_SITE="https://www.netfilter.org/" PKG_URL="https://www.netfilter.org/projects/iptables/files/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain linux:host libmnl libnftnl" PKG_LONGDESC="IP packet filter administration." PKG_TOOLCHAIN="autotools" post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { mkdir -p ${INSTALL}/usr/config/iptables/ cp -PR ${PKG_DIR}/config/README ${INSTALL}/usr/config/iptables/ mkdir -p ${INSTALL}/etc/iptables/ cp -PR ${PKG_DIR}/config/* ${INSTALL}/etc/iptables/ mkdir -p ${INSTALL}/usr/lib/libreelec cp ${PKG_DIR}/scripts/iptables_helper ${INSTALL}/usr/lib/libreelec } post_install() { enable_service iptables.service } ================================================ FILE: packages/network/iptables/patches/iptables-0002-xshared-fix-for-build-in-sub-directory.patch ================================================ --- a/libxtables/xtables.c 2022-05-13 13:26:26.000000000 +0000 +++ b/libxtables/xtables.c 2022-05-14 09:53:20.593250503 +0000 @@ -49,7 +49,7 @@ #include #include #include -#include +#include "../libiptc/linux_list.h" #ifndef NO_SHARED_LIBS #include ================================================ FILE: packages/network/iptables/scripts/iptables_helper ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) IPTABLES4="/usr/sbin/iptables" IPTABLES6="/usr/sbin/ip6tables" IPTABLES_CMDS="$IPTABLES4 $IPTABLES6" PUBLIC_RULES="/etc/iptables/public.v" HOME_RULES="/etc/iptables/home.v" CUSTOM_RULES="/storage/.config/iptables/rules.v" DOCKER="service.system.docker.service" SYSTEMCTL="/usr/bin/systemctl" CONNMANCTL="/usr/bin/connmanctl" check_docker() { $SYSTEMCTL is-active --quiet $DOCKER && $SYSTEMCTL restart $DOCKER } get_technology_config() { $CONNMANCTL technologies | awk -v pattern="^/.*/technology/$1$" -e 'BEGIN {S=0}; /^\/.*/ {S=0}; $0 ~ pattern {S=1}; S==1 {print $0}' } check_tether() { for technology in wifi ethernet; do if get_technology_config $technology | grep -q 'Tethering = True'; then $CONNMANCTL tether $technology off sleep 1 $CONNMANCTL tether $technology on break fi done } flush() { for cmd in $IPTABLES_CMDS; do $cmd -F $cmd -X $cmd -t nat -F $cmd -t nat -X $cmd -t mangle -F $cmd -t mangle -X $cmd -P INPUT ACCEPT $cmd -P FORWARD ACCEPT $cmd -P OUTPUT ACCEPT done check_docker check_tether } enable() { for cmd in $IPTABLES_CMDS; do case "$cmd" in *6*) rules="$RULES6" ipv="6" ;; *) rules="$RULES4" ipv="4" ;; esac if [ -e "$rules" ]; then "$cmd-restore" "$rules" fi done check_docker check_tether } if [ "$1" = "enable" ]; then case "${RULES}" in "none") flush ;; "public") RULES4="${PUBLIC_RULES}4" RULES6="${PUBLIC_RULES}6" ;; "home") RULES4="${HOME_RULES}4" RULES6="${HOME_RULES}6" ;; "custom") RULES4="${CUSTOM_RULES}4" RULES6="${CUSTOM_RULES}6" ;; *) exit 1 ;; esac enable elif [ "$1" = "disable" ]; then flush else exit 1 fi exit 0 ================================================ FILE: packages/network/iptables/system.d/iptables.service ================================================ [Unit] Description=IPTABLES Packet Filtering ConditionPathExists=/usr/lib/libreelec/iptables_helper ConditionPathExists=|/storage/.cache/services/iptables.conf Before=network.target Wants=network.target [Service] Type=oneshot EnvironmentFile=-/storage/.cache/services/iptables.conf ExecStart=/usr/lib/libreelec/iptables_helper enable ExecReload=/usr/lib/libreelec/iptables_helper enable ExecStop=/usr/lib/libreelec/iptables_helper disable RemainAfterExit=yes [Install] WantedBy=multi-user.target ================================================ FILE: packages/network/iw/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="iw" PKG_VERSION="5.19" PKG_SHA256="f167bbe947dd53bb9ebc0c1dcef5db6ad73ac1d6084f2c6f9376c5c360cc4d4e" PKG_LICENSE="PUBLIC_DOMAIN" PKG_SITE="http://wireless.kernel.org/en/users/Documentation/iw" PKG_URL="https://www.kernel.org/pub/software/network/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libnl" PKG_LONGDESC="A new nl80211 based CLI configuration utility for wireless devices." # iw fails at runtime with lto enabled pre_configure_target() { export LDFLAGS="${LDFLAGS} -pthread" } post_makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/iw cp ${PKG_DIR}/scripts/setregdomain ${INSTALL}/usr/lib/iw } ================================================ FILE: packages/network/iw/scripts/setregdomain ================================================ #!/bin/sh REGDOMAIN= REGDOMAIN_CONF="/storage/.cache/regdomain.conf" [ -r "$REGDOMAIN_CONF" ] && . "$REGDOMAIN_CONF" [ -z "$REGDOMAIN" ] && exit 0 exec /usr/sbin/iw reg set "$REGDOMAIN" ================================================ FILE: packages/network/iw/udev.d/60-iw-regdomain.rules ================================================ SUBSYSTEM=="ieee80211", ACTION=="add", RUN+="/usr/lib/iw/setregdomain" ================================================ FILE: packages/network/iwd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="iwd" PKG_VERSION="2.6" PKG_SHA256="f7ac93aeef672604f5b5194ca038035ae222925be392c4345873c9742f477797" PKG_LICENSE="GPL" PKG_SITE="https://git.kernel.org/cgit/network/wireless/iwd.git/about/" PKG_URL="https://www.kernel.org/pub/linux/network/wireless/iwd-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain readline dbus" PKG_LONGDESC="Wireless daemon for Linux" PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--enable-client \ --enable-monitor \ --enable-systemd-service \ --enable-dbus-policy \ --disable-manual-pages" pre_configure_target() { export LIBS="-lncurses" } post_makeinstall_target() { # ProtectSystem et al seems to break the service when systemd isn't built with seccomp. # investigate this more as it might be a systemd problem or kernel problem sed -e 's|^\(PrivateTmp=.*\)$|#\1|g' \ -e 's|^\(NoNewPrivileges=.*\)$|#\1|g' \ -e 's|^\(PrivateDevices=.*\)$|#\1|g' \ -e 's|^\(ProtectHome=.*\)$|#\1|g' \ -e 's|^\(ProtectSystem=.*\)$|#\1|g' \ -e 's|^\(ReadWritePaths=.*\)$|#\1|g' \ -e 's|^\(ProtectControlGroups=.*\)$|#\1|g' \ -e 's|^\(ProtectKernelModules=.*\)$|#\1|g' \ -e 's|^\(ConfigurationDirectory=.*\)$|#\1|g' \ -i ${INSTALL}/usr/lib/systemd/system/iwd.service } post_install() { enable_service iwd.service } ================================================ FILE: packages/network/libdnet/package.mk ================================================ # 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) PKG_NAME="libdnet" PKG_VERSION="1.14" PKG_SHA256="592599c54a57102a177270f3a2caabda2c2ac7768b977d7458feba97da923dfe" PKG_LICENSE="BSD" PKG_SITE="https://github.com/ofalk/libdnet" PKG_URL="https://github.com/ofalk/libdnet/archive/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A simplified, portable interface to several low-level networking routines" PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="ac_cv_func_strlcat=no \ ac_cv_func_strlcpy=no \ --enable-static \ --disable-shared \ --disable-python" pre_configure_target() { export CFLAGS+=" -I${PKG_BUILD}/include" } post_makeinstall_target() { cp ${SYSROOT_PREFIX}/usr/bin/dnet-config \ ${TOOLCHAIN}/bin/dnet-config } ================================================ FILE: packages/network/libmnl/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libmnl" PKG_VERSION="1.0.5" PKG_SHA256="274b9b919ef3152bfb3da3a13c950dd60d6e2bcd54230ffeca298d03b40d0525" PKG_LICENSE="GPL" PKG_SITE="http://netfilter.org/projects/libmnl" PKG_URL="http://netfilter.org/projects/libmnl/files/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A minimalistic user-space library oriented to Netlink developers." ================================================ FILE: packages/network/libnfs/package.mk ================================================ # 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) PKG_NAME="libnfs" PKG_VERSION="5.0.2" PKG_SHA256="637e56643b19da9fba98f06847788c4dad308b723156a64748041035dcdf9bd3" PKG_LICENSE="LGPL2.1+" PKG_SITE="https://github.com/sahlberg/libnfs" PKG_URL="https://github.com/sahlberg/libnfs/archive/libnfs-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A client library for accessing NFS shares over a network." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--disable-examples" pre_configure_target() { export CFLAGS="${CFLAGS} -D_FILE_OFFSET_BITS=64" } ================================================ FILE: packages/network/libnftnl/package.mk ================================================ # 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) PKG_NAME="libnftnl" PKG_VERSION="1.2.4" PKG_SHA256="c0fe233be4cdfd703e7d5977ef8eb63fcbf1d0052b6044e1b23d47ca3562477f" PKG_LICENSE="GPL" PKG_SITE="https://netfilter.org/projects/libnftnl" PKG_URL="https://netfilter.org/projects/libnftnl/files/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libmnl" PKG_LONGDESC="A userspace library providing a low-level netlink programming interface (API) to the in-kernel nf_tables subsystem." PKG_CONFIGURE_OPTS_TARGET="--disable-shared --enable-static" ================================================ FILE: packages/network/libnl/package.mk ================================================ # 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) PKG_NAME="libnl" PKG_VERSION="3.7.0" PKG_SHA256="9fe43ccbeeea72c653bdcf8c93332583135cda46a79507bfd0a483bb57f65939" PKG_LICENSE="LGPL" PKG_SITE="https://github.com/thom311/libnl" PKG_URL="https://github.com/thom311/libnl/releases/download/libnl${PKG_VERSION//./_}/libnl-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A library for applications dealing with netlink socket." PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared \ --disable-cli" ================================================ FILE: packages/network/libshairplay/package.mk ================================================ # 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) PKG_NAME="libshairplay" PKG_VERSION="096b61ad14c90169f438e690d096e3fcf87e504e" PKG_SHA256="7e2b013ffe75ea2f13fb12b1aa38b8e2e8b1899ac292d57f05d7b352a3a181cf" PKG_LICENSE="MIT" PKG_SITE="https://github.com/juhovh/shairplay" PKG_URL="https://github.com/juhovh/shairplay/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain avahi" PKG_LONGDESC="Apple airplay and raop protocol server" PKG_TOOLCHAIN="autotools" pre_configure_target() { CFLAGS+=" -I${SYSROOT_PREFIX}/usr/include/avahi-compat-libdns_sd" } post_makeinstall_target() { mkdir -p ${INSTALL}/etc/shairplay cp -P ../airport.key ${INSTALL}/etc/shairplay } ================================================ FILE: packages/network/libshairplay/patches/libshairplay-read_airportkey_from_etc.patch ================================================ --- shairplay-0.9.0.orig/src/shairplay.c +++ shairplay-0.9.0/src/shairplay.c @@ -313,9 +313,12 @@ main(int argc, char *argv[]) raop = raop_init_from_keyfile(10, &raop_cbs, "airport.key", NULL); if (raop == NULL) { - fprintf(stderr, "Could not initialize the RAOP service\n"); - fprintf(stderr, "Please make sure the airport.key file is in the current directory.\n"); - return -1; + raop = raop_init_from_keyfile(10, &raop_cbs, "/etc/shairplay/airport.key", NULL); + if (raop == NULL) { + fprintf(stderr, "Could not initialize the RAOP service\n"); + fprintf(stderr, "Please make sure the airport.key file is in the current directory.\n"); + return -1; + } } if (strlen(options.password)) { ================================================ FILE: packages/network/libssh/package.mk ================================================ # 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) PKG_NAME="libssh" PKG_VERSION="0.10.4" PKG_SHA256="07392c54ab61476288d1c1f0a7c557b50211797ad00c34c3af2bbc4dbc4bd97d" PKG_LICENSE="LGPL" PKG_SITE="http://www.libssh.org/" PKG_URL="https://www.libssh.org/files/$(get_pkg_version_maj_min)/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain zlib openssl" PKG_LONGDESC="Library for accessing ssh client services through C libraries." PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=OFF \ -DWITH_SERVER=OFF \ -DWITH_GCRYPT=OFF \ -DWITH_EXAMPLES=OFF \ -DWITH_GSSAPI=OFF \ -DWITH_GEX=OFF \ -DWITH_INTERNAL_DOC=OFF" makeinstall_target() { # install static library only mkdir -p ${SYSROOT_PREFIX}/usr/lib cp ${PKG_BUILD}/.${TARGET_NAME}/src/libssh.a ${SYSROOT_PREFIX}/usr/lib mkdir -p ${SYSROOT_PREFIX}/usr/lib/pkgconfig cp ${PKG_BUILD}/.${TARGET_NAME}/libssh.pc ${SYSROOT_PREFIX}/usr/lib/pkgconfig mkdir -p ${SYSROOT_PREFIX}/usr/include/libssh cp ${PKG_BUILD}/include/libssh/{callbacks.h,legacy.h,libssh.h,server.h,sftp.h,ssh2.h} \ ${PKG_BUILD}/.${TARGET_NAME}/include/libssh/libssh_version.h \ ${SYSROOT_PREFIX}/usr/include/libssh } ================================================ FILE: packages/network/libtirpc/package.mk ================================================ # 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="libtirpc" PKG_VERSION="1.3.3" PKG_SHA256="6474e98851d9f6f33871957ddee9714fdcd9d8a5ee9abb5a98d63ea2e60e12f3" PKG_LICENSE="GPL" PKG_SITE="https://sourceforge.net/projects/libtirpc/" PKG_URL="https://downloads.sourceforge.net/project/libtirpc/libtirpc/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A port of Suns Transport-Independent RPC library to Linux." PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-static --disable-shared \ --disable-silent-rules \ --enable-ipv6 \ --disable-gssapi \ --with-gnu-ld" ================================================ FILE: packages/network/netbase/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="netbase" PKG_VERSION="6.4" PKG_SHA256="fa6621826ff1150e581bd90bc3c8a4ecafe5df90404f207db6dcdf2c75f26ad7" PKG_LICENSE="GPL" PKG_SITE="https://salsa.debian.org/md/netbase" PKG_URL="http://ftp.debian.org/debian/pool/main/n/netbase/netbase_${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="The netbase package provides data for network services and protocols from the iana db." PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/etc cp etc/protocols ${INSTALL}/etc cp etc/services ${INSTALL}/etc } ================================================ FILE: packages/network/nfs-utils/config/exports.sample ================================================ /media *(rw,no_root_squash,insecure,no_subtree_check,fsid=0,crossmnt) ================================================ FILE: packages/network/nfs-utils/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="nfs-utils" PKG_VERSION="2.6.4" PKG_SHA256="c0ae376ac056011ed0954deba2362d7d8193c653b500b68a543aec512cd2ecfa" PKG_LICENSE="GPL-2.0+" PKG_SITE="http://nfs.sourceforge.net/" PKG_URL="${SOURCEFORGE_SRC}/nfs/nfs-utils/$PKG_VERSION/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS_HOST="toolchain" PKG_DEPENDS_TARGET="toolchain nfs-utils:host systemd sqlite libtirpc rpcsvc-proto libevent libdevmapper" PKG_LONGDESC="The NFS Utilities package contains the userspace server and client tools necessary to use the kernel NFS abilities." post_unpack() { # we use own proc-fs-nfsd.mount file to also load nfsd module cp $PKG_DIR/system.d/* $PKG_BUILD/systemd # move path /var/lib/nfs -> /run/nfs # nfsdcld[3268]: cld_inotify_setup: inotify_add_watch failed: No such file or directory find $PKG_BUILD -type f -exec sed -i \ -e 's|/var/lib/nfs|/run/nfs|g' \ -e 's|var-lib-nfs|run-nfs|g' {} \; mv $PKG_BUILD/systemd/var-lib-nfs-rpc_pipefs.mount \ $PKG_BUILD/systemd/run-nfs-rpc_pipefs.mount mv $PKG_BUILD/systemd/var-lib-nfs-rpc_pipefs.mount.in \ $PKG_BUILD/systemd/run-nfs-rpc_pipefs.mount.in } pre_configure_host() { cd $PKG_BUILD rm -rf .$HOST_NAME [ -f /etc/lsb-release ] && ( grep -q "22.04" /etc/lsb-release ) && CFLAGS+=" -I/usr/include/tirpc" PKG_CONFIGURE_OPTS_HOST=" \ --with-statedir=/run/nfs \ --with-rpcgen=internal \ libsqlite3_cv_is_recent=unknown \ ac_cv_header_rpc_rpc_h=yes \ ac_cv_header_event2_event_h=yes \ ac_cv_lib_event_core_event_base_dispatch=yes \ --disable-nfsdcld \ --disable-nfsv4 \ --disable-nfsv41 \ --disable-gss \ --disable-uuid \ --disable-ipv6 \ --disable-caps \ --disable-tirpc \ --without-systemd \ --without-tcp-wrappers" } pre_configure_target() { cd $PKG_BUILD rm -rf .$TARGET_NAME PKG_CONFIGURE_OPTS_TARGET=" \ --with-systemd=/usr/lib/systemd/system \ --with-nfsconfig=/storage/.config/nfs.conf \ --with-statduser=$(whoami) \ --with-statedir=/run/nfs \ --with-rpcgen=$PKG_BUILD/tools/rpcgen/rpcgen \ --enable-nfsv4 \ --enable-nfsv41 \ --enable-tirpc \ --enable-uuid \ --disable-gss \ --disable-ipv6 \ --without-tcp-wrappers" # use different paths /etc -> /storage/.config # /etc/exports CFLAGS+=" -D_PATH_EXPORTS=\\\"/storage/.config/exports\\\"" # /etc/exports.d CFLAGS+=" -D_PATH_EXPORTS_D=\\\"/storage/.config/exports.d\\\"" # /etc/idmapd.conf CFLAGS+=" -D_PATH_IDMAPDCONF=\\\"/storage/.config/idmapd.conf\\\"" # we don't have nobody user and group CFLAGS+=" -DNFS4NOBODY_USER=\\\"root\\\"" CFLAGS+=" -DNFS4NOBODY_GROUP=\\\"root\\\"" } make_host() { make rpcgen -C tools/rpcgen } makeinstall_host() { : # } post_makeinstall_target() { mkdir -p $INSTALL/usr/config cp nfs.conf $INSTALL/usr/config cp support/nfsidmap/idmapd.conf $INSTALL/usr/config cp $PKG_DIR/config/* $INSTALL/usr/config # we use tmpfs for it rm -fr "$INSTALL/run" # we have symbolic link to /usr/sbin mkdir -p $INSTALL/usr/sbin chmod 755 $INSTALL/sbin/* mv $INSTALL/sbin/* $INSTALL/usr/sbin rmdir $INSTALL/sbin } post_install() { enable_service nfs-server.service } ================================================ FILE: packages/network/nfs-utils/patches/nfs-utils-01-ce-specific.patch ================================================ diff -aurNp a/systemd/nfs-server.service b/systemd/nfs-server.service --- a/systemd/nfs-server.service 2020-02-09 20:41:19.000000000 +0100 +++ b/systemd/nfs-server.service 2020-08-03 11:43:44.697756700 +0200 @@ -18,6 +18,8 @@ Before= rpc-statd-notify.service Wants=auth-rpcgss-module.service After=rpc-gssd.service gssproxy.service rpc-svcgssd.service +ConditionPathExists=/storage/.config/exports + [Service] Type=oneshot RemainAfterExit=yes diff -aurNp a/systemd/proc-fs-nfsd.mount b/systemd/proc-fs-nfsd.mount --- a/systemd/proc-fs-nfsd.mount 2020-02-09 20:41:19.000000000 +0100 +++ b/systemd/proc-fs-nfsd.mount 2020-08-03 11:44:12.913697307 +0200 @@ -1,5 +1,7 @@ [Unit] Description=NFSD configuration filesystem +Requires=load-module-nfsd.service +After=load-module-nfsd.service [Mount] What=nfsd ================================================ FILE: packages/network/nfs-utils/system.d/load-module-nfsd.service ================================================ [Unit] Description=Load module nfsd service [Service] Type=oneshot ExecStart=/usr/sbin/modprobe nfsd RemainAfterExit=true ================================================ FILE: packages/network/nfs-utils/tmpfiles.d/nfs-utils.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) d /run/nfs/sm 0700 root root - d /run/nfs/sm.bak 0700 root root - f /run/nfs/rmtab 0644 root root - f /run/nfs/etab 0644 root root - ================================================ FILE: packages/network/nss-mdns/config/nsswitch.conf ================================================ # /etc/nsswitch.conf # # Example configuration of GNU Name Service Switch functionality. # passwd: files group: files shadow: files gshadow: files hosts: files mdns_minimal [NOTFOUND=return] dns networks: files dns protocols: files services: files ethers: files rpc: files netgroup: files ================================================ FILE: packages/network/nss-mdns/package.mk ================================================ # 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="0.15.1" PKG_SHA256="2d1b8de2e9ed5526f51c8bb627b719c07668465b5315787e7cfeed776ab90b9a" PKG_LICENSE="GPL" PKG_SITE="https://github.com/lathiat/nss-mdns" 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" post_makeinstall_target() { mkdir -p ${INSTALL}/etc cp ${PKG_DIR}/config/nsswitch.conf ${INSTALL}/etc/nsswitch.conf } ================================================ FILE: packages/network/openssh/package.mk ================================================ # 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) PKG_NAME="openssh" PKG_VERSION="9.2p1" PKG_SHA256="3f66dbf1655fb45f50e1c56da62ab01218c228807b21338d634ebcdf9d71cf46" PKG_LICENSE="OSS" PKG_SITE="https://www.openssh.com/" PKG_URL="https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain openssl zlib" PKG_LONGDESC="An open re-implementation of the SSH package." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+lto" PKG_CONFIGURE_OPTS_TARGET="ac_cv_header_rpc_types_h=no \ --sysconfdir=/etc/ssh \ --libexecdir=/usr/lib/openssh \ --disable-strip \ --disable-lastlog \ --with-sandbox=no \ --disable-utmp \ --disable-utmpx \ --disable-wtmp \ --disable-wtmpx \ --without-rpath \ --with-ssl-engine \ --with-privsep-user=nobody \ --disable-pututline \ --disable-pututxline \ --disable-etc-default-login \ --with-keydir=/storage/.cache/ssh \ --without-pam" pre_configure_target() { export LD="${CC}" export LDFLAGS="${TARGET_CFLAGS} ${TARGET_LDFLAGS}" } post_makeinstall_target() { rm -rf ${INSTALL}/usr/lib/openssh/ssh-keysign rm -rf ${INSTALL}/usr/lib/openssh/ssh-pkcs11-helper if [ ! ${SFTP_SERVER} = "yes" ]; then rm -rf ${INSTALL}/usr/lib/openssh/sftp-server fi rm -rf ${INSTALL}/usr/bin/ssh-add rm -rf ${INSTALL}/usr/bin/ssh-agent rm -rf ${INSTALL}/usr/bin/ssh-keyscan sed -e "s|^#PermitRootLogin.*|PermitRootLogin yes|g" \ -e "s|^#StrictModes.*|StrictModes no|g" \ -i ${INSTALL}/etc/ssh/sshd_config debug_strip ${INSTALL}/usr } post_install() { enable_service sshd.service } ================================================ FILE: packages/network/openssh/patches/openssh-8.9p1-keydir.patch ================================================ diff -u a/configure.ac b/configure.ac --- a/configure.ac 2018-10-16 20:01:20.000000000 -0400 +++ b/configure.ac 2018-12-06 04:08:42.718993760 -0500 @@ -5185,6 +5185,19 @@ ) +# Set keydir +AC_ARG_WITH([keydir], + [ --with-keydir= Specify different path for storing keys], + [ + if test -n "$withval" && test "x$withval" != "xno" && \ + test "x${withval}" != "xyes"; then + KEYDIR=$withval + fi + ] +) +AC_SUBST([KEYDIR]) + + AC_MSG_CHECKING([if we need to convert IPv4 in IPv6-mapped addresses]) IPV4_IN6_HACK_MSG="no" AC_ARG_WITH(4in6, @@ -5565,6 +5578,7 @@ H=`eval echo ${PRIVSEP_PATH}` ; H=`eval echo ${H}` I=`eval echo ${user_path}` ; I=`eval echo ${I}` J=`eval echo ${superuser_path}` ; J=`eval echo ${J}` +K=`eval echo ${KEYDIR}` ; K=`eval echo ${K}` echo "" echo "OpenSSH has been configured with the following options:" @@ -5588,6 +5602,9 @@ if test ! -z "$superuser_path" ; then echo " sshd superuser user PATH: $J" fi +if test ! -z "$KEYDIR" ; then +echo " sshd keydir: $K" +fi echo " Manpage format: $MANTYPE" echo " PAM support: $PAM_MSG" echo " OSF SIA support: $SIA_MSG" Common subdirectories: a/contrib and b/contrib diff -u a/Makefile.in b/Makefile.in --- a/Makefile.in 2018-10-16 20:01:20.000000000 -0400 +++ b/Makefile.in 2018-12-06 04:00:04.301968236 -0500 @@ -32,8 +32,10 @@ STRIP_OPT=@STRIP_OPT@ TEST_SHELL=@TEST_SHELL@ BUILDDIR=@abs_top_builddir@ +KEYDIR=@KEYDIR@ PATHS= -DSSHDIR=\"$(sysconfdir)\" \ + -DKEYDIR=\"$(KEYDIR)\" \ -D_PATH_SSH_PROGRAM=\"$(SSH_PROGRAM)\" \ -D_PATH_SSH_ASKPASS_DEFAULT=\"$(ASKPASS_PROGRAM)\" \ -D_PATH_SFTP_SERVER=\"$(SFTP_SERVER)\" \ @@ -168,11 +170,11 @@ -e 's|/etc/ssh/sshd_config|$(sysconfdir)/sshd_config|g' \ -e 's|/usr/libexec|$(libexecdir)|g' \ -e 's|/etc/shosts.equiv|$(sysconfdir)/shosts.equiv|g' \ - -e 's|/etc/ssh/ssh_host_key|$(sysconfdir)/ssh_host_key|g' \ - -e 's|/etc/ssh/ssh_host_ecdsa_key|$(sysconfdir)/ssh_host_ecdsa_key|g' \ - -e 's|/etc/ssh/ssh_host_dsa_key|$(sysconfdir)/ssh_host_dsa_key|g' \ - -e 's|/etc/ssh/ssh_host_rsa_key|$(sysconfdir)/ssh_host_rsa_key|g' \ - -e 's|/etc/ssh/ssh_host_ed25519_key|$(sysconfdir)/ssh_host_ed25519_key|g' \ + -e 's|/etc/ssh/ssh_host_key|$(KEYDIR)/ssh_host_key|g' \ + -e 's|/etc/ssh/ssh_host_ecdsa_key|$(KEYDIR)/ssh_host_ecdsa_key|g' \ + -e 's|/etc/ssh/ssh_host_dsa_key|$(KEYDIR)/ssh_host_dsa_key|g' \ + -e 's|/etc/ssh/ssh_host_rsa_key|$(KEYDIR)/ssh_host_rsa_key|g' \ + -e 's|/etc/ssh/ssh_host_ed25519_key|$(KEYDIR)/ssh_host_ed25519_key|g' \ -e 's|/var/run/sshd.pid|$(piddir)/sshd.pid|g' \ -e 's|/etc/moduli|$(sysconfdir)/moduli|g' \ -e 's|/etc/ssh/moduli|$(sysconfdir)/moduli|g' \ Common subdirectories: a/openbsd-compat and b/openbsd-compat diff -u a/pathnames.h b/pathnames.h --- a/pathnames.h 2018-10-16 20:01:20.000000000 -0400 +++ b/pathnames.h 2018-12-06 04:15:01.286012398 -0500 @@ -18,6 +18,10 @@ #define SSHDIR ETCDIR "/ssh" #endif +#ifndef KEYDIR +#define KEYDIR SSHDIR +#endif + #ifndef _PATH_SSH_PIDDIR #define _PATH_SSH_PIDDIR "/var/run" #endif @@ -26,9 +30,9 @@ * System-wide file containing host keys of known hosts. This file should be * world-readable. */ -#define _PATH_SSH_SYSTEM_HOSTFILE SSHDIR "/ssh_known_hosts" +#define _PATH_SSH_SYSTEM_HOSTFILE KEYDIR "/ssh_known_hosts" /* backward compat for protocol 2 */ -#define _PATH_SSH_SYSTEM_HOSTFILE2 SSHDIR "/ssh_known_hosts2" +#define _PATH_SSH_SYSTEM_HOSTFILE2 KEYDIR "/ssh_known_hosts2" /* * Of these, ssh_host_key must be readable only by root, whereas ssh_config @@ -36,12 +40,12 @@ */ #define _PATH_SERVER_CONFIG_FILE SSHDIR "/sshd_config" #define _PATH_HOST_CONFIG_FILE SSHDIR "/ssh_config" -#define _PATH_HOST_DSA_KEY_FILE SSHDIR "/ssh_host_dsa_key" -#define _PATH_HOST_ECDSA_KEY_FILE SSHDIR "/ssh_host_ecdsa_key" -#define _PATH_HOST_ED25519_KEY_FILE SSHDIR "/ssh_host_ed25519_key" -#define _PATH_HOST_XMSS_KEY_FILE SSHDIR "/ssh_host_xmss_key" -#define _PATH_HOST_RSA_KEY_FILE SSHDIR "/ssh_host_rsa_key" -#define _PATH_DH_MODULI SSHDIR "/moduli" +#define _PATH_HOST_DSA_KEY_FILE KEYDIR "/ssh_host_dsa_key" +#define _PATH_HOST_ECDSA_KEY_FILE KEYDIR "/ssh_host_ecdsa_key" +#define _PATH_HOST_ED25519_KEY_FILE KEYDIR "/ssh_host_ed25519_key" +#define _PATH_HOST_XMSS_KEY_FILE KEYDIR "/ssh_host_xmss_key" +#define _PATH_HOST_RSA_KEY_FILE KEYDIR "/ssh_host_rsa_key" +#define _PATH_DH_MODULI KEYDIR "/moduli" #ifndef _PATH_SSH_PROGRAM #define _PATH_SSH_PROGRAM "/usr/bin/ssh" ================================================ FILE: packages/network/openssh/patches/openssh-motd-add-device-info.patch ================================================ Using username "root". root@192.168.1.8's password: Send automatic password ############################################## # CoreELEC # # https://coreelec.org # ############################################## CoreELEC (community): 20.0-Nexus_devel_20220926082903 (Amlogic-ne.arm) Machine model: Khadas VIM4 CoreELEC dt-id: t7_a311d2_khadas_vim4 CoreELEC:~ # --- a/session.c 2022-09-24 17:07:26.675597500 +0200 +++ b/session.c 2022-09-26 11:06:59.549512600 +0200 @@ -792,6 +792,9 @@ do_motd(void) { FILE *f; char buf[256]; + char *p; + ssize_t len_pretty = 0; + ssize_t len; if (options.print_motd) { #ifdef HAVE_LOGIN_CAP @@ -805,6 +808,73 @@ do_motd(void) fputs(buf, stdout); fclose(f); } + + /* get os pretty name length */ + f = fopen("/etc/os-release", "r"); + if (f) { + while (fgets(buf, sizeof(buf), f)) { + if (strncmp(buf, "PRETTY_NAME=", 12) == 0) { + p = strchr(&buf[12], ':'); + if (p) + len_pretty = p - &buf[12]; + + break; + } + } + + fclose(f); + } + + /* display machine model */ + f = fopen("/proc/device-tree/model", "r"); + if (f) { + len = len_pretty - 14; + if (len < 0) + len = 0; + + memset(buf, ' ', sizeof(buf)); + snprintf(&buf[len], sizeof(buf) - len, "Machine model: "); + fputs(buf, stdout); + fgets(buf, sizeof(buf), f); + fputs(buf, stdout); + fputs("\n", stdout); + fclose(f); + } + + /* display coreelec dt-id */ + f = fopen("/proc/device-tree/coreelec-dt-id", "r"); + if (f) { + len = len_pretty - 15; + if (len < 0) + len = 0; + + memset(buf, ' ', sizeof(buf)); + snprintf(&buf[len], sizeof(buf) - len, "CoreELEC dt-id: "); + fputs(buf, stdout); + fgets(buf, sizeof(buf), f); + fputs(buf, stdout); + fputs("\n", stdout); + fclose(f); + } + + /* display amlogic dt-id */ + f = fopen("/proc/device-tree/amlogic-dt-id", "r"); + if (f) { + len = len_pretty - 14; + if (len < 0) + len = 0; + + memset(buf, ' ', sizeof(buf)); + snprintf(&buf[len], sizeof(buf) - len, "Amlogic dt-id: "); + fputs(buf, stdout); + fgets(buf, sizeof(buf), f); + fputs(buf, stdout); + fputs("\n", stdout); + fclose(f); + } + + /* put empty line before prompt */ + fputs("\n", stdout); } } ================================================ FILE: packages/network/openssh/patches/openssh-silence-missing-identity-error.patch ================================================ diff --git a/sshconnect2.c b/sshconnect2.c index d6af0b9..22c0aa6 100644 --- a/sshconnect2.c +++ b/sshconnect2.c @@ -1524,9 +1524,7 @@ struct stat st; if (stat(id->filename, &st) == -1) { - do_log2(id->userprovided ? - SYSLOG_LEVEL_INFO : SYSLOG_LEVEL_DEBUG3, - "no such identity: %s: %s", id->filename, strerror(errno)); + debug3("no such identity: %s", id->filename); return NULL; } snprintf(prompt, sizeof prompt, ================================================ FILE: packages/network/openssh/patches/openssh-source-etc-environment.patch ================================================ From c05ee9208db5e25d550ec6dd4b5ff54a199959fd Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Mon, 16 Dec 2019 20:34:22 +0000 Subject: [PATCH] openssh: source /etc/environment --- session.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/session.c b/session.c index ac06b08..0a1c59a 100644 --- a/session.c +++ b/session.c @@ -1080,7 +1080,6 @@ do_setup_env(struct ssh *ssh, Session *s, const char *shell) child_set_env(&env, &envsize, "KRB5CCNAME", cp); } -#ifdef _AIX { char *cp; @@ -1089,7 +1088,6 @@ do_setup_env(struct ssh *ssh, Session *s, const char *shell) read_environment_file(&env, &envsize, "/etc/environment", options.permit_user_env_whitelist); } -#endif #ifdef KRB5 if (s->authctxt->krb5_ccname) child_set_env(&env, &envsize, "KRB5CCNAME", -- 2.7.4 ================================================ FILE: packages/network/openssh/system.d/sshd.service ================================================ [Unit] Description=OpenSSH server daemon After=network.target ConditionKernelCommandLine=|ssh ConditionPathExists=|/storage/.cache/services/sshd.conf [Service] Restart=on-failure EnvironmentFile=-/storage/.cache/services/sshd.conf ExecStartPre=-/bin/sh -c 'mkdir -p /storage/.cache/ssh' ExecStartPre=/usr/bin/ssh-keygen -A ExecStartPre=-/bin/sh -c 'chmod 600 /storage/.cache/ssh/ssh_host_*' ExecStartPre=-/bin/sh -c 'chmod 644 /storage/.cache/ssh/ssh_host_*.pub' ExecStart=/usr/sbin/sshd -D $SSH_ARGS ExecReload=/bin/kill -HUP $MAINPID TimeoutStopSec=1s RestartSec=2 StartLimitInterval=0 [Install] WantedBy=multi-user.target ================================================ FILE: packages/network/openssh/tmpfiles.d/z_04_openssh.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) d /var/empty 0600 root root - - d /storage/.cache/ssh 0755 root root - - d /storage/.ssh 0700 root root - - ================================================ FILE: packages/network/openvpn/package.mk ================================================ # 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) PKG_NAME="openvpn" PKG_VERSION="2.5.8" PKG_SHA256="a6f315b7231d44527e65901ff646f87d7f07862c87f33531daa109fb48c53db2" PKG_LICENSE="GPL" PKG_SITE="https://openvpn.net" PKG_URL="https://swupdate.openvpn.org/community/releases/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain lzo openssl" PKG_LONGDESC="A full featured SSL VPN software solution that integrates OpenVPN server capabilities." PKG_CONFIGURE_OPTS_TARGET="ac_cv_have_decl_TUNSETPERSIST=no \ --disable-server \ --disable-plugins \ --enable-iproute2 IPROUTE=/sbin/ip \ --enable-management \ --enable-fragment \ --disable-multihome \ --disable-port-share \ --disable-debug" post_makeinstall_target() { mkdir -p ${INSTALL}/usr/bin ln -sf ../sbin/openvpn ${INSTALL}/usr/bin/openvpn } ================================================ FILE: packages/network/rpcbind/package.mk ================================================ # 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) PKG_NAME="rpcbind" PKG_VERSION="1.2.6" PKG_SHA256="5613746489cae5ae23a443bb85c05a11741a5f12c8f55d2bb5e83b9defeee8de" PKG_LICENSE="OSS" PKG_SITE="http://rpcbind.sourceforge.net/" PKG_URL="${SOURCEFORGE_SRC}/rpcbind/rpcbind/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libtirpc systemd" PKG_LONGDESC="The rpcbind utility is a server that converts RPC program numbers into universal addresses." PKG_CONFIGURE_OPTS_TARGET="ac_cv_header_rpcsvc_mount_h=no \ --disable-warmstarts \ --disable-libwrap \ --enable-rmtcalls \ --with-statedir=/tmp \ --with-rpcuser=root" post_install() { enable_service rpcbind.service } ================================================ FILE: packages/network/rpcbind/patches/rpcbind-01-drop-warm-start-as-it-fails.patch ================================================ diff -Naur a/systemd/rpcbind.service.in b/systemd/rpcbind.service.in --- a/systemd/rpcbind.service.in 2016-12-20 03:18:51.839794796 +0000 +++ b/systemd/rpcbind.service.in 2016-12-20 03:21:30.476854474 +0000 @@ -8,11 +8,12 @@ # rpcbind.socket, no matter how this unit is started. Requires=rpcbind.socket Wants=rpcbind.target +After=rpcbind.socket systemd-tmpfiles-setup.service [Service] Type=notify # distro can provide a drop-in adding EnvironmentFile=-/??? if needed. -ExecStart=@_sbindir@/rpcbind $RPCBIND_OPTIONS -w -f +ExecStart=@_sbindir@/rpcbind $RPCBIND_OPTIONS -f [Install] WantedBy=multi-user.target ================================================ FILE: packages/network/rpcbind/patches/rpcbind-1.2.6-vulnerability_fixes-1.patch ================================================ Submitted By: Ken Moffat Date: 2017-05-29 Initial Package Version: 0.2.4 (also affects earlier versions) Upstream Status: Unknown Origin: Guido Vranken Description: Fixes CVE-2017-8779 (DOS by remote attackers - memory consumption without subsequent free). diff --git a/src/rpcb_svc_com.c b/src/rpcb_svc_com.c index 5862c26..e11f61b 100644 --- a/src/rpcb_svc_com.c +++ b/src/rpcb_svc_com.c @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -432,7 +433,7 @@ rpcbproc_taddr2uaddr_com(void *arg, struct svc_req *rqstp /*__unused*/, static bool_t xdr_encap_parms(XDR *xdrs, struct encap_parms *epp) { - return (xdr_bytes(xdrs, &(epp->args), (u_int *) &(epp->arglen), ~0)); + return (xdr_bytes(xdrs, &(epp->args), (u_int *) &(epp->arglen), RPC_MAXDATASIZE)); } /* ================================================ FILE: packages/network/rpcsvc-proto/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="rpcsvc-proto" PKG_VERSION="1.4.1" PKG_SHA256="9429e143bb8dd33d34bf0663f571d4d4a1103e1afd7c49791b367b7ae1ef7f35" PKG_LICENSE="BSD" PKG_SITE="http://nfs.sourceforge.net/" PKG_URL="https://github.com/thkukuk/rpcsvc-proto/releases/download/v$PKG_VERSION/$PKG_NAME-$PKG_VERSION.tar.xz" PKG_DEPENDS_HOST="toolchain" PKG_DEPENDS_TARGET="toolchain rpcsvc-proto:host" PKG_LONGDESC="The rpcsvc-proto package contains the rcpsvc protocol.x files and headers." pre_configure_host() { cd $PKG_BUILD rm -rf .$HOST_NAME } pre_configure_target() { cd $PKG_BUILD rm -rf .$TARGET_NAME } make_host() { make rpcgen -C rpcgen } makeinstall_target() { : # } ================================================ FILE: packages/network/rsync/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rsync" PKG_VERSION="3.2.7" PKG_SHA256="4e7d9d3f6ed10878c58c5fb724a67dacf4b6aac7340b13e488fb2dc41346f2bb" PKG_LICENSE="GPLv3" PKG_SITE="https://rsync.samba.org" PKG_URL="https://download.samba.org/pub/rsync/src/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="autotools:host zlib:host" PKG_DEPENDS_TARGET="toolchain zlib openssl" PKG_LONGDESC="A very fast method for bringing remote files into sync." PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_HOST="--disable-md2man \ --disable-ipv6 \ --disable-openssl \ --disable-xxhash \ --disable-zstd \ --disable-lz4 \ --disable-iconv \ --with-included-popt \ --without-included-zlib" PKG_CONFIGURE_OPTS_TARGET="--disable-acl-support \ --disable-md5-asm \ --enable-openssl \ --disable-lz4 \ --disable-md2man \ --disable-roll-simd \ --disable-xattr-support \ --disable-xxhash \ --disable-zstd \ --with-included-popt \ --without-included-zlib" pre_configure_host() { HOST_CONFIGURE_OPTS=$(echo ${HOST_CONFIGURE_OPTS} | sed -e "s|--disable-static||" -e "s|--enable-shared||") } pre_configure_target() { TARGET_CONFIGURE_OPTS=$(echo ${TARGET_CONFIGURE_OPTS} | sed -e "s|--disable-static||" -e "s|--enable-shared||") } pre_make_host() { # do not detect LE git version echo "#define RSYNC_GITVER \"${PKG_VERSION}\"" >git-version.h } pre_make_target() { pre_make_host } ================================================ FILE: packages/network/samba/config/samba4-cache.txt ================================================ Checking simple C program: OK rpath library support: OK -Wl,--version-script support: OK Checking getconf LFS_CFLAGS: NO Checking for large file support without additional flags: OK Checking for -D_LARGE_FILES: OK Checking correct behavior of strtoll: NO Checking for working strptime: OK Checking for C99 vsnprintf: OK Checking for HAVE_SHARED_MMAP: OK Checking for HAVE_MREMAP: OK Checking for HAVE_INCOHERENT_MMAP: NO Checking for HAVE_SECURE_MKSTEMP: OK Checking for HAVE_IFACE_GETIFADDRS: OK Checking for kernel change notify support: OK Checking for Linux kernel oplocks: OK Checking for kernel share modes: OK Checking if can we convert from CP850 to UCS-2LE: OK Checking if can we convert from UTF-8 to UCS-2LE: OK Checking whether we can use Linux thread-specific credentials with 32-bit system calls: OK Checking whether we can use Linux thread-specific credentials: OK Checking whether setreuid is available: OK Checking whether setresuid is available: OK Checking whether seteuid is available: OK Checking whether fcntl locking is available: OK Checking whether fcntl lock supports open file description locks: OK Checking for the maximum value of the 'time_t' type: OK Checking whether the realpath function allows a NULL argument: OK Checking whether POSIX capabilities are available: OK Checking for ftruncate extend: OK vfs_fileid checking for statfs() and struct statfs.f_fsid: OK getcwd takes a NULL argument: OK Checking uname sysname type: "Linux" Checking uname release type: "3.0.0" Checking uname version type: "#1 Tue Nov 1 12:34:56 UTC 2013" Checking value of NSIG: "32" Checking value of _NSIG: "64" Checking value of SIGRTMAX: "64" Checking value of SIGRTMIN: "32" Checking errno of iconv for illegal multibyte sequence: "0" Checking for a 64-bit host to support lmdb: NO Checking value of GNUTLS_CIPHER_AES_128_CFB8: OK Checking value of GNUTLS_MAC_AES_CMAC_128: OK Checking whether fcntl supports flags to send direct I/O availability signals: OK Checking whether fcntl supports setting/geting hints: OK Checking for gnutls fips mode support: NO Checking for readlink breakage: NO ================================================ FILE: packages/network/samba/config/smb.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-2019 Team LibreELEC (https://libreelec.tv) # samba.conf v4 (do not remove) # This configuration file allows you to customize the samba shares # available from your machine [global] server string = EmuELEC browseable = yes writeable = yes printable = no deadtime = 30 mangled names = no name resolve order = host bcast printcap name = /dev/null load printers = no enable core files = no passdb backend = smbpasswd smb encrypt = disabled fruit:model = Xserve # samba share options map to guest = Bad User guest account = root security = user # samba tuning options socket options = TCP_NODELAY IPTOS_LOWDELAY min receivefile size = 16384 aio read size = 16384 aio write size = 16384 use sendfile = yes # The following are default values for the master selection process # local master = yes # preferred master = auto # domain master = auto # os level = 20 # "strict allocate = yes" breaks large network transfers to external hdd # Force this to "no" in case "yes" becomes the default in future strict allocate = no # Using the following configurations as a template allows you to add # writeable shares of disks and paths under /storage [Update] path = /storage/.update available = yes browseable = yes public = yes writeable = yes root preexec = mkdir -p /storage/.update [Downloads] path = /storage/downloads available = yes browseable = yes public = yes writeable = yes root preexec = mkdir -p /storage/downloads [USB Media] path = /var/media available = yes browseable = yes public = yes writeable = yes [EmuELEC] path = /emuelec available = yes browseable = yes public = yes writeable = yes root preexec = mkdir -p /storage/.config/emuelec [Configfiles] path = /storage/.config available = yes browseable = yes public = yes writeable = yes root preexec = mkdir -p /storage/.config [Logfiles] path = /emuelec/logs available = yes browseable = yes public = yes writeable = yes root preexec = mkdir -p /emuelec/logs [ROMS] path = /storage/roms available = yes browseable = yes public = yes writeable = yes root preexec = mkdir -p /storage/roms [Emulationstation Config] path = /storage/.emulationstation available = yes browseable = yes public = yes writeable = yes root preexec = mkdir -p /storage/.emulationstation [Storage] path = /storage available = yes browseable = yes public = yes writeable = yes [Assets] path = /tmp/assets available = yes browsable = yes public = yes writable = yes root preexec = mkdir -p /tmp/assets [Overlays] path = /tmp/overlays available = yes browsable = yes public = yes writable = yes root preexec = mkdir -p /tmp/overlays [Bezels] path = /storage/roms/bezels available = yes browsable = yes public = yes writable = yes root preexec = mkdir -p /storage/roms/bezels [Splash] path = /storage/roms/splash available = yes browsable = yes public = yes writable = yes root preexec = mkdir -p /storage/roms/splash [Cores] path = /tmp/cores available = yes browsable = yes public = yes writable = yes root preexec = mkdir -p /tmp/cores [Playlists] path = /tmp/playlists available = yes browsable = yes public = yes writable = yes root preexec = mkdir -p /storage/playlists [Screenshots] path = /storage/roms/screenshots available = yes browsable = yes public = yes writable = yes root preexec = mkdir -p /storage/roms/screenshots [Shaders] path = /tmp/shaders available = yes browsable = yes public = yes writable = yes root preexec = mkdir -p /tmp/shaders [Joypads] path = /tmp/joypads available = yes browsable = yes public = yes writable = yes root preexec = mkdir -p /tmp/joypads [Cheats] path = /tmp/database/cht available = yes browsable = yes public = yes writable = yes root preexec = mkdir -p /tmp/database/cht [SaveStates] path = /storage/roms/savestates available = yes browsable = yes public = yes writable = yes root preexec = mkdir -p /storage/roms/savestates ================================================ FILE: packages/network/samba/default.d/samba.conf ================================================ SAMBA_AUTOSHARE="true" SAMBA_USERNAME="coreelec" SAMBA_PASSWORD="coreelec" SAMBA_SECURE="false" SAMBA_MINPROTOCOL="SMB2" SAMBA_MAXPROTOCOL="SMB3" SAMBA_WORKGROUP="WORKGROUP" ================================================ FILE: packages/network/samba/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="samba" PKG_VERSION="4.17.12" PKG_SHA256="6129a7f967b822b308c57152326e7302711c2d0b9830a82d0c21832b648741f4" PKG_LICENSE="GPLv3+" PKG_SITE="https://www.samba.org" PKG_URL="https://download.samba.org/pub/samba/stable/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain attr heimdal:host e2fsprogs Python3 libunwind zlib readline popt libaio connman gnutls" PKG_NEED_UNPACK="$(get_pkg_directory heimdal) $(get_pkg_directory e2fsprogs)" PKG_LONGDESC="A free SMB / CIFS fileserver and client." [[ "${DEVICE}" != "Amlogic-old" ]] && PKG_DEPENDS_TARGET+=" wsdd2" configure_package() { #PKG_WAF_VERBOSE="-v" if [ "${AVAHI_DAEMON}" = yes ]; then PKG_DEPENDS_TARGET+=" avahi" SMB_AVAHI="--enable-avahi" else SMB_AVAHI="--disable-avahi" fi if [ "${TARGET_ARCH}" = x86_64 ]; then SMB_AESNI="--accel-aes=intelaesni" else SMB_AESNI="--accel-aes=none" fi PKG_CONFIGURE_OPTS="--prefix=/usr \ --sysconfdir=/etc \ --localstatedir=/var \ --with-lockdir=/var/lock-samba \ --with-logfilebase=/var/log \ --with-piddir=/run/samba \ --with-privatedir=/run/samba \ --with-modulesdir=/usr/lib \ --with-privatelibdir=/usr/lib \ --with-sockets-dir=/run/samba \ --with-configdir=/run/samba \ --with-libiconv=${SYSROOT_PREFIX}/usr \ --cross-compile \ --cross-answers=${PKG_BUILD}/cache.txt \ --hostcc=gcc \ --enable-fhs \ --without-dmapi \ --disable-glusterfs \ --disable-rpath \ --disable-rpath-install \ --disable-rpath-private-install \ ${SMB_AVAHI} \ ${SMB_AESNI} \ --disable-cups \ --disable-iprint \ --with-relro \ --with-sendfile-support \ --without-acl-support \ --without-ads \ --without-ad-dc \ --without-automount \ --without-cluster-support \ --without-fam \ --without-gettext \ --without-gpgme \ --without-iconv \ --without-ldap \ --without-libarchive \ --without-pam \ --without-pie \ --without-regedit \ --without-systemd \ --without-utmp \ --without-winbind \ --enable-auto-reconfigure \ --bundled-libraries='ALL,!asn1_compile,!compile_et,!zlib' \ --without-quotas \ --with-syslog \ --without-json \ --without-ldb-lmdb \ --nopyc --nopyo" PKG_SAMBA_TARGET="smbclient,client/smbclient,smbtree,nmblookup,testparm" if [ "${SAMBA_SERVER}" = "yes" ]; then PKG_SAMBA_TARGET+=",nmbd,rpcd_classic,rpcd_epmapper,rpcd_winreg,samba-dcerpcd,smbpasswd,smbd/smbd" fi } pre_configure_target() { # samba uses its own build directory cd ${PKG_BUILD} rm -rf .${TARGET_NAME} # work around link issues export LDFLAGS="${LDFLAGS} -lreadline -lncurses" # support 64-bit offsets and seeks on 32-bit platforms if [ "${TARGET_ARCH}" = "arm" ]; then export CFLAGS+=" -D_FILE_OFFSET_BITS=64 -D_OFF_T_DEFINED_ -Doff_t=off64_t -Dlseek=lseek64" fi } configure_target() { cp ${PKG_DIR}/config/samba4-cache.txt ${PKG_BUILD}/cache.txt echo "Checking uname machine type: \"${TARGET_ARCH}\"" >> ${PKG_BUILD}/cache.txt export COMPILE_ET=${TOOLCHAIN}/bin/heimdal_compile_et export ASN1_COMPILE=${TOOLCHAIN}/bin/heimdal_asn1_compile PYTHON_CONFIG="${SYSROOT_PREFIX}/usr/bin/python3-config" \ python_LDFLAGS="" python_LIBDIR="" \ PYTHON=${TOOLCHAIN}/bin/python3 ./configure ${PKG_CONFIGURE_OPTS} } # disable icu, there is no buildswitch to disable pre_make_target() { sed -e '/#define HAVE_ICU_I18N 1/d' \ -e '/#define HAVE_LIBICUI.* 1/d' \ -i bin/default/include/config.h } make_target() { make ${PKG_SAMBA_TARGET} -j${CONCURRENCY_MAKE_LEVEL} } makeinstall_target() { PYTHONHASHSEED=1 WAF_MAKE=1 ./buildtools/bin/waf install ${PKG_WAF_VERBOSE} --destdir=${SYSROOT_PREFIX} --targets=smbclient -j${CONCURRENCY_MAKE_LEVEL} PYTHONHASHSEED=1 WAF_MAKE=1 ./buildtools/bin/waf install ${PKG_WAF_VERBOSE} --destdir=${INSTALL} --targets=${PKG_SAMBA_TARGET} -j${CONCURRENCY_MAKE_LEVEL} } copy_directory_of_links() { local _tmp link for link in "${1}/"*.so*; do if [ -L ${link} ]; then _tmp="$(readlink -m "${link}")" cp -P ${_tmp} ${2} cp -P ${_tmp}.* ${2} 2>/dev/null || true else cp -P ${link} ${2} fi done } perform_manual_install() { mkdir -p ${SYSROOT_PREFIX}/usr/lib copy_directory_of_links ${PKG_BUILD}/bin/shared ${SYSROOT_PREFIX}/usr/lib mkdir -p ${INSTALL}/usr/lib copy_directory_of_links ${PKG_BUILD}/bin/shared ${INSTALL}/usr/lib copy_directory_of_links ${PKG_BUILD}/bin/shared/private ${INSTALL}/usr/lib if [ "${SAMBA_SERVER}" = "yes" ]; then mkdir -p ${INSTALL}/usr/sbin cp -L ${PKG_BUILD}/bin/smbd ${INSTALL}/usr/sbin cp -L ${PKG_BUILD}/bin/nmbd ${INSTALL}/usr/sbin mkdir -p ${INSTALL}/usr/libexec/samba cp -PR bin/default/source3/rpc_server/samba-dcerpcd ${INSTALL}/usr/libexec/samba cp -PR bin/default/source3/rpc_server/rpcd_classic ${INSTALL}/usr/libexec/samba cp -PR bin/default/source3/rpc_server/rpcd_epmapper ${INSTALL}/usr/libexec/samba cp -PR bin/default/source3/rpc_server/rpcd_winreg ${INSTALL}/usr/libexec/samba fi } post_makeinstall_target() { perform_manual_install rm -rf ${INSTALL}/usr/bin rm -rf ${INSTALL}/usr/lib/python* rm -rf ${INSTALL}/usr/share/perl* rm -rf ${INSTALL}/usr/lib64 mkdir -p ${INSTALL}/usr/lib/samba cp ${PKG_DIR}/scripts/samba-config ${INSTALL}/usr/lib/samba cp ${PKG_DIR}/scripts/samba-autoshare ${INSTALL}/usr/lib/samba cp ${PKG_DIR}/scripts/smbpasswd ${INSTALL}/usr/lib/samba if find_file_path config/smb.conf; then mkdir -p ${INSTALL}/etc/samba cp ${FOUND_PATH} ${INSTALL}/etc/samba mkdir -p ${INSTALL}/usr/config cp ${INSTALL}/etc/samba/smb.conf ${INSTALL}/usr/config/samba.conf.sample fi mkdir -p ${INSTALL}/usr/bin cp -PR bin/default/source3/client/smbclient ${INSTALL}/usr/bin cp -PR bin/default/source3/utils/smbtree ${INSTALL}/usr/bin cp -PR bin/default/source3/utils/nmblookup ${INSTALL}/usr/bin cp -PR bin/default/source3/utils/testparm ${INSTALL}/usr/bin if [ "${SAMBA_SERVER}" = "yes" ]; then mkdir -p ${INSTALL}/usr/bin cp -PR bin/default/source3/utils/smbpasswd ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/lib/systemd/system cp ${PKG_DIR}/system.d.opt/* ${INSTALL}/usr/lib/systemd/system mkdir -p ${INSTALL}/usr/share/services cp -P ${PKG_DIR}/default.d/*.conf ${INSTALL}/usr/share/services fi chmod +x ${INSTALL}/usr/sbin/* chmod +x ${INSTALL}/usr/bin/* chmod +x ${INSTALL}/usr/sbin/* chmod +x ${INSTALL}/usr/lib/samba/* chmod +x ${INSTALL}/usr/libexec/samba/* } post_install() { enable_service samba-config.service if [ "${SAMBA_SERVER}" = "yes" ]; then enable_service nmbd.service enable_service smbd.service fi } ================================================ FILE: packages/network/samba/patches/samba-200-4.11-fix-ASN1-bso14164.patch ================================================ From 2e53f331104b29db7caf1641a30d3e9316b57184 Mon Sep 17 00:00:00 2001 From: Uri Simchoni Date: Sun, 20 Oct 2019 00:03:14 +0300 Subject: [PATCH] build: find pre-built heimdal build tools in case of embedded heimdal This patch fixes the case of finding asn1_compile and compile_et for building embedded heimdal, by setting --bundled-libraries='!asn1_compile,!compile_et' as configure flags. The Heimdal build tools compile_et and asn1_compile are needed *only* if we use the embedded heimdal (otherwise we don't build heimdal and use headers that have been generated by those tools elsewhere). For cross-compilation with embedded heimdal, it is vital to use host build tools, and so asn1_compile and compile_et must be supplied and not built. One way of doing this would be to set the COMPILE_ET and ASN1_COMPILE env vars to the location of supplied binaries. Another way, which is more commonly used, is to exclude asn1_compile and compile_et from bundled packages via the switch -bundled-libraries='!asn1_compile,!compile_et'. When this is done, the build script searches the path for those tools and sets the ASN1_COMPILE and COMPILE_ET vars accordingly. (this is admittedly kind of a round-about way of doing things but this has become the de-facto standard amongst embedded distro builders). In commit 8061983d4882f3ba3f12da71443b035d7b672eec, this process of finding the binaris has been moved to be carried out only in the system heimdal case. As explained above, we only need these tools, and hence the check, in bundled mode. BUG: https://bugzilla.samba.org/show_bug.cgi?id=14164 Signed-off-by: Uri Simchoni --- wscript_configure_embedded_heimdal | 11 +++++++++++ wscript_configure_system_heimdal | 11 ----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/wscript_configure_embedded_heimdal b/wscript_configure_embedded_heimdal index 8c55ae2..4fdae80 100644 --- a/wscript_configure_embedded_heimdal +++ b/wscript_configure_embedded_heimdal @@ -6,3 +6,14 @@ conf.define('USING_EMBEDDED_HEIMDAL', 1) conf.RECURSE('third_party/heimdal_build') + +def check_system_heimdal_binary(name): + if conf.LIB_MAY_BE_BUNDLED(name): + return False + if not conf.find_program(name, var=name.upper()): + return False + conf.define('USING_SYSTEM_%s' % name.upper(), 1) + return True + +check_system_heimdal_binary("compile_et") +check_system_heimdal_binary("asn1_compile") diff --git a/wscript_configure_system_heimdal b/wscript_configure_system_heimdal index 235fa19..4f4a83cd 100644 --- a/wscript_configure_system_heimdal +++ b/wscript_configure_system_heimdal @@ -37,14 +37,6 @@ def check_system_heimdal_lib(name, functions='', headers='', onlyif=None): conf.define('USING_SYSTEM_%s' % name.upper(), 1) return True -def check_system_heimdal_binary(name): - if conf.LIB_MAY_BE_BUNDLED(name): - return False - if not conf.find_program(name, var=name.upper()): - return False - conf.define('USING_SYSTEM_%s' % name.upper(), 1) - return True - check_system_heimdal_lib("com_err", "com_right_r com_err", "com_err.h") if check_system_heimdal_lib("roken", "rk_socket_set_reuseaddr", "roken.h"): @@ -86,7 +78,4 @@ finally: #if conf.CHECK_BUNDLED_SYSTEM('tommath', checkfunctions='mp_init', headers='tommath.h'): # conf.define('USING_SYSTEM_TOMMATH', 1) -check_system_heimdal_binary("compile_et") -check_system_heimdal_binary("asn1_compile") - conf.env.KRB5_VENDOR = 'heimdal' -- 2.20.1 ================================================ FILE: packages/network/samba/patches/samba-950-no-man.patch ================================================ From 0cb025d911dd3e2f9a9184293f571214192e3a54 Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Tue, 19 Mar 2019 12:39:41 +0000 Subject: [PATCH] disable man pages --- buildtools/wafsamba/wafsamba.py | 8 -------- docs-xml/wscript_build | 22 ---------------------- 2 files changed, 30 deletions(-) diff --git a/buildtools/wafsamba/wafsamba.py b/buildtools/wafsamba/wafsamba.py index a077026..2a897d0 100644 --- a/buildtools/wafsamba/wafsamba.py +++ b/buildtools/wafsamba/wafsamba.py @@ -328,11 +328,6 @@ def SAMBA_LIBRARY(bld, libname, source, else: bld.PKG_CONFIG_FILES(pc_files, vnum=vnum) - if (manpages is not None and 'XSLTPROC_MANPAGES' in bld.env and - bld.env['XSLTPROC_MANPAGES']): - bld.MANPAGES(manpages, install) - - Build.BuildContext.SAMBA_LIBRARY = SAMBA_LIBRARY @@ -437,9 +432,6 @@ def SAMBA_BINARY(bld, binname, source, samba_ldflags = pie_ldflags ) - if manpages is not None and 'XSLTPROC_MANPAGES' in bld.env and bld.env['XSLTPROC_MANPAGES']: - bld.MANPAGES(manpages, install) - Build.BuildContext.SAMBA_BINARY = SAMBA_BINARY -- 2.7.4 ================================================ FILE: packages/network/samba/patches/samba-951-no-man-4.16.patch ================================================ diff --git a/docs-xml/wscript_build b/docs-xml/wscript_build --- a/docs-xml/wscript_build 2020-12-05 09:01:19.652459634 +0000 +++ b/docs-xml/wscript_build 2020-12-05 09:10:10.639446971 +0000 @@ -175,32 +175,3 @@ target=path_entities, rule=generate_path_entity_file, dep_vars=bld.dynconfig_varnames()) - - -def SMBDOTCONF_MANPAGE(bld, target): - ''' assemble and build smb.conf.5 manual page''' - bld.SAMBAMANPAGES(target, parameter_all) - -if ('XSLTPROC_MANPAGES' in bld.env and bld.env['XSLTPROC_MANPAGES']): - - SMBDOTCONF_MANPAGE(bld, 'manpages/smb.conf.5') - bld.SAMBAMANPAGES(manpages) - - if bld.CONFIG_SET('WITH_PAM_MODULES') and bld.CONFIG_SET('HAVE_PAM_START'): - bld.SAMBAMANPAGES(pam_winbind_manpages) - - if bld.CONFIG_SET('HAVE_KRB5_LOCATE_PLUGIN_H'): - bld.SAMBAMANPAGES(krb5_locator_manpages) - - if bld.CONFIG_SET('HAVE_KRB5_LOCALAUTH_PLUGIN_H'): - bld.SAMBAMANPAGES(krb5_localauth_manpages) - - if conf.env.build_winexe == True: - bld.SAMBAMANPAGES(winexe_manpages) - - if bld.CONFIG_SET('ENABLE_SELFTEST'): - bld.SAMBAMANPAGES('manpages/vfstest.1') - - for manpage in vfs_module_manpages: - if bld.SAMBA3_IS_ENABLED_MODULE(manpage): - bld.SAMBAMANPAGES('manpages/%s.8' % manpage) ================================================ FILE: packages/network/samba/scripts/samba-autoshare ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2017 Stephan Raue (stephan@openelec.tv) if [ -f /storage/.cache/services/samba.conf ]; then . /storage/.cache/services/samba.conf if [ "$SAMBA_AUTOSHARE" == "true" ] ; then /usr/lib/samba/samba-config [ -f /run/samba/smbd.pid ] && pkill -HUP smbd fi fi ================================================ FILE: packages/network/samba/scripts/samba-config ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2017 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) SMB_USERCONF="/storage/.config/samba.conf" SMB_DEFCONF="/etc/samba/smb.conf" SMB_CONF="/run/samba/smb.conf" SMB_DIR=$(dirname ${SMB_CONF}) mkdir -p ${SMB_DIR} # exclusive access SMB_LOCK="${SMB_DIR}/samba-config.lock" exec 200>"${SMB_LOCK}" flock 200 SMB_TMP=$(mktemp -p ${SMB_DIR}) SMB_USERCONF_IS_VALID=no SMB_CONFIG_VERSION=4 # If user config is based on legacy OpenELEC, or old version (or no version) # then don't use it, and log a warning. if [ -f ${SMB_USERCONF} ]; then SMB_IS_LEGACY="$(awk 'NR <= 2 && /This file is part of OpenELEC/{ print }' ${SMB_USERCONF})" SMB_THIS_VER="$(awk '/^# samba.conf v[0-9\.]*/{ print substr($3,2); exit }' ${SMB_USERCONF})" if [ -n "${SMB_IS_LEGACY}" ]; then echo "WARNING: Ignoring user config ${SMB_USERCONF} due to incompatibility [Old style OpenELEC]" elif [ -z "${SMB_THIS_VER}" ]; then echo "WARNING: Ignoring user config ${SMB_USERCONF} due to incompatibility [version is unknown or invalid]" elif [ ${SMB_THIS_VER} != ${SMB_CONFIG_VERSION} ]; then echo "WARNING: Ignoring user config ${SMB_USERCONF} due to incompatibility [version ${SMB_THIS_VER} is not the required version ${SMB_CONFIG_VERSION}]" else SMB_USERCONF_IS_VALID=yes fi fi if [ ${SMB_USERCONF_IS_VALID} = yes ]; then cp ${SMB_USERCONF} ${SMB_TMP} else cp ${SMB_DEFCONF} ${SMB_TMP} fi echo >>${SMB_TMP} if [ ! -f /storage/.cache/services/samba.disabled ]; then ### Generate smb.conf if [ ! -f /storage/.cache/services/samba.conf ]; then cp /usr/share/services/samba.conf /storage/.cache/services fi # Specify defaults here, in case these new properties not yet added in .cache SAMBA_WORKGROUP=WORKGROUP SAMBA_MINPROTOCOL=SMB2 SAMBA_MAXPROTOCOL=SMB3 . /storage/.cache/services/samba.conf # fixup synonyms sed -i 's/browsable/browseable/g; s/writable/writeable/g' ${SMB_TMP} # handle external drives if [ "${SAMBA_AUTOSHARE}" = "true" ] ; then for dir in /media/* ; do if [ -d "$dir" ] ; then name=$(basename "$dir") echo -e "[$name]\n path = $dir\n available = yes\n browseable = yes\n public = yes\n writeable = yes\n" >> ${SMB_TMP} fi done fi # Allow access to a "failed" (safe mode) Kodi installation if [ -d /storage/.kodi.FAILED ]; then echo -e "[Kodi-Failed]\n path = /storage/.kodi.FAILED\n available = yes\n browseable = yes\n public = yes\n writeable = yes\n" >> ${SMB_TMP} fi ADD_CONFIG= # If workgroup is not set, don't set it - who knows, user may know better. if [ -n "$SAMBA_WORKGROUP" ]; then # Remove any existing workgroup setting sed -E '/^[[:space:]]*workgroup[[:space:]]*=/d' -i ${SMB_TMP} ADD_CONFIG="${ADD_CONFIG} workgroup = ${SAMBA_WORKGROUP:-WORKGROUP}\n" fi ADD_CONFIG="${ADD_CONFIG} server min protocol = ${SAMBA_MINPROTOCOL/SMB1/NT1}\n" ADD_CONFIG="${ADD_CONFIG} server max protocol = ${SAMBA_MAXPROTOCOL/SMB1/NT1}\n" # Add extra config after [global], escaping spaces so that all are retained by sed sed -e "/\[global\]/ a ${ADD_CONFIG// /\\ }" -i ${SMB_TMP} if [ "${SAMBA_SECURE}" = "true" -a -n "${SAMBA_USERNAME}" -a -n "${SAMBA_PASSWORD}" ] ; then # username map: first line makes sure plain root does not work all the time # processing continues, so if user chooses root as username, second line overrides the first # this is done always in case user uses passwords in userconf. # many thanks to viljoviitanen for this sed -e 's|^.[ \t]*.public.=.*| public = no |' \ -e 's|^.[ \t]*.username map.=.*||' \ -e 's|^.[ \t]*.security.=.*| security = user\n username map = /run/samba/samba.map|' \ -e 's|^.[ \t]*.map.to.guest.=.*| map to guest = Never|' \ -i ${SMB_TMP} printf "%s\n%s" "${SAMBA_PASSWORD}" "${SAMBA_PASSWORD}" | smbpasswd -c ${SMB_TMP} -s -a root printf 'nobody = root\nroot = "%s"\n' "${SAMBA_USERNAME}" > /run/samba/samba.map else sed -e 's|^.[ \t]*.public.=.*| public = yes |' \ -e 's|^.[ \t]*.username map.=.*||' \ -e 's|^.[ \t]*.security.=.*| security = user|' \ -e 's|^.[ \t]*.map.to.guest.=.*| map to guest = Bad User|' \ -i ${SMB_TMP} fi fi mv -f ${SMB_TMP} ${SMB_CONF} #win11 superior only with password. root:123, previous version does not need password, enter anonymously. #copy authenticated password cp -f /usr/lib/samba/smbpasswd /run/samba/smbpasswd exit 0 ================================================ FILE: packages/network/samba/scripts/smbpasswd ================================================ root:0:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:FBB6A560CD4342ED657CB01F01087236:[U ]:LCT-68312268: ================================================ FILE: packages/network/samba/system.d/samba-config.service ================================================ [Unit] Description=Samba Configuration DefaultDependencies=false After=basic.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/lib/samba/samba-config StartLimitInterval=0 ================================================ FILE: packages/network/samba/system.d.opt/nmbd.service ================================================ [Unit] Description=Samba NMB Daemon Wants=network-online.target samba-config.service After=network-online.target samba-config.service ConditionPathExists=!/storage/.cache/services/samba.disabled ConditionPathExists=/run/samba/smb.conf [Service] Type=forking PIDFile=/run/samba/nmbd.pid ExecStart=/usr/sbin/nmbd ExecReload=/bin/kill -HUP $MAINPID TimeoutStopSec=1s Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=multi-user.target ================================================ FILE: packages/network/samba/system.d.opt/smbd.service ================================================ [Unit] Description=Samba SMB Daemon Wants=network-online.target nmbd.service After=network-online.target nmbd.service ConditionPathExists=!/storage/.cache/services/samba.disabled ConditionPathExists=/run/samba/smb.conf [Service] Type=forking PIDFile=/run/samba/smbd.pid LimitNOFILE=16384 ExecStart=/usr/sbin/smbd ExecReload=/bin/kill -HUP $MAINPID TimeoutStopSec=1s Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=multi-user.target ================================================ FILE: packages/network/sshpass/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="sshpass" PKG_VERSION="1.09" PKG_SHA256="71746e5e057ffe9b00b44ac40453bf47091930cba96bbea8dc48717dedc49fb7" PKG_LICENSE="GPLv2" PKG_SITE="https://sourceforge.net/p/sshpass" PKG_URL="https://downloads.sourceforge.net/sshpass/sshpass-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="sshpass: a tool for non-interactive ssh password auth" pre_configure_target(){ export ac_cv_func_malloc_0_nonnull=yes export ac_cv_func_realloc_0_nonnull=yes } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp sshpass ${INSTALL}/usr/bin } ================================================ FILE: packages/network/wireguard-linux-compat/modules-load.d/wireguard.conf ================================================ wireguard ================================================ FILE: packages/network/wireguard-linux-compat/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="wireguard-linux-compat" PKG_VERSION="v1.0.20210219" PKG_SHA256="11a75cf2387b6bb227c96241c911b5f48475def1ac84d0e758793cf9e677a6f0" PKG_LICENSE="GPLv2" PKG_SITE="https://www.wireguard.com" PKG_URL="https://git.zx2c4.com/wireguard-linux-compat/snapshot/wireguard-linux-compat-$PKG_VERSION.tar.xz" PKG_DEPENDS_TARGET="toolchain linux libmnl" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="WireGuard VPN kernel module" PKG_TOOLCHAIN="manual" PKG_IS_KERNEL_PKG="yes" pre_make_target() { unset LDFLAGS } make_target() { kernel_make KERNELDIR=$(kernel_path) -C src/ module } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME cp src/*.ko $INSTALL/$(get_full_module_dir)/$PKG_NAME } ================================================ FILE: packages/network/wireguard-tools/config/system.d/wireguard.service.sample ================================================ [Unit] Description=WireGuard VPN Service After=network-online.target nss-lookup.target connman-vpn.service time-sync.target Wants=network-online.target nss-lookup.target connman-vpn.service time-sync.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/connmanctl connect vpn_service_name_goes_here ExecStop=/usr/bin/connmanctl disconnect vpn_service_name_goes_here [Install] WantedBy=multi-user.target ================================================ FILE: packages/network/wireguard-tools/config/wireguard/wireguard.config.sample ================================================ [provider_wireguard] Type = WireGuard Name = WireGuard VPN Tunnel Host = 3.2.5.6 WireGuard.Address = 10.2.0.2/24 WireGuard.ListenPort = 51820 WireGuard.PrivateKey = qKIj010hDdWSjQQyVCnEgthLXusBgm3I6HWrJUaJymc= WireGuard.PublicKey = zzqUfWGIil6QxrAGz77HE5BGUEdD2PgHYnCg3CDKagE= WireGuard.PresharedKey = DfEYeVs04HS9XhKGM4/ZXHG3Qc4MFK2AJd8XouYDbRQ= WireGuard.DNS = 8.8.8.8, 1.1.1.1 WireGuard.AllowedIPs = 0.0.0.0/0 WireGuard.EndpointPort = 51820 WireGuard.PersistentKeepalive = 25 ================================================ FILE: packages/network/wireguard-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="wireguard-tools" PKG_VERSION="1.0.20210914" PKG_SHA256="69de713458a887cddb46b2fd1d43bf20548f693136af95792e65ec925538c770" PKG_LICENSE="GPLv2" PKG_SITE="https://www.wireguard.com" PKG_URL="https://git.zx2c4.com/wireguard-tools/snapshot/wireguard-tools-v${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="WireGuard VPN userspace tools" PKG_TOOLCHAIN="manual" PKG_IS_KERNEL_PKG="yes" pre_make_target() { unset LDFLAGS } make_target() { kernel_make KERNELDIR=$(kernel_path) -C src/ wg } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/wg-keygen ${INSTALL}/usr/bin cp ${PKG_BUILD}/src/wg ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr cp -R ${PKG_DIR}/config ${INSTALL}/usr } ================================================ FILE: packages/network/wireguard-tools/scripts/wg-keygen ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) if [ -x /usr/bin/wg ]; then umask 077 mkdir -p /storage/.cache/wireguard if [ ! -f /storage/.cache/wireguard/privatekey ]; then wg genkey > /storage/.cache/wireguard/privatekey echo "created /storage/.cache/wireguard/privatekey" else echo "error, /storage/.cache/wireguard/privatekey already exists" fi if [ ! -f /storage/.cache/wireguard/publickey ]; then wg pubkey < /storage/.cache/wireguard/privatekey > /storage/.cache/wireguard/publickey echo "created /storage/.cache/wireguard/publickey" else echo "error, /storage/.cache/wireguard/publickey already exists" fi if [ ! -f /storage/.cache/wireguard/preshared ]; then wg genpsk > /storage/.cache/wireguard/preshared echo "created /storage/.cache/wireguard/preshared" else echo "error, /storage/.cache/wireguard/preshared already exists" fi fi exit ================================================ FILE: packages/network/wireguard-tools/tmpfiles.d/z_03_wireguard.conf ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) d /storage/.cache/wireguard 0755 root root - - ================================================ FILE: packages/network/wireless-regdb/package.mk ================================================ # 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) PKG_NAME="wireless-regdb" PKG_VERSION="2023.09.01" PKG_SHA256="26d4c2a727cc59239b84735aad856b7c7d0b04e30aa5c235c4f7f47f5f053491" PKG_LICENSE="GPL" PKG_SITE="https://wireless.wiki.kernel.org/en/developers/regulatory/wireless-regdb" PKG_URL="https://www.kernel.org/pub/software/network/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_LONGDESC="wireless-regdb is a regulatory database" PKG_TOOLCHAIN="manual" makeinstall_target() { FW_TARGET_DIR=${INSTALL}/$(get_full_firmware_dir) mkdir -p ${FW_TARGET_DIR} cp ${PKG_BUILD}/regulatory.db ${PKG_BUILD}/regulatory.db.p7s ${FW_TARGET_DIR} } ================================================ FILE: packages/network/wpa_supplicant/config/makefile.config ================================================ CONFIG_CTRL_IFACE=y CONFIG_CTRL_IFACE_DBUS=y CONFIG_CTRL_IFACE_DBUS_NEW=y CONFIG_CTRL_IFACE_DBUS_INTRO=y CONFIG_DRIVER_WEXT=y CONFIG_LIBNL32=y CONFIG_DRIVER_NL80211=y CONFIG_DRIVER_WIRED=y CONFIG_IEEE8021X_EAPOL=y CONFIG_EAP_MD5=y CONFIG_EAP_MSCHAPV2=y CONFIG_EAP_TLS=y CONFIG_EAP_PEAP=y CONFIG_EAP_TTLS=y CONFIG_EAP_PSK=y CONFIG_EAP_FAST=y CONFIG_EAP_GTC=y CONFIG_EAP_OTP=y CONFIG_EAP_AKA=y CONFIG_EAP_PAX=y CONFIG_EAP_LEAP=y CONFIG_EAP_SAKE=y CONFIG_EAP_GPSK=y CONFIG_EAP_GPSK_SHA256=y CONFIG_EAP_TNC=y CONFIG_WPS=y CONFIG_EAP_IKEV2=y CONFIG_PKCS12=y CONFIG_SMARTCARD=y CONFIG_DEBUG_FILE=y CONFIG_BACKEND=file CONFIG_PEERKEY=y CONFIG_BGSCAN_SIMPLE=y CONFIG_AP=y #CONFIG_FIPS=y ================================================ FILE: packages/network/wpa_supplicant/package.mk ================================================ # 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="wpa_supplicant" PKG_VERSION="2.10" PKG_SHA256="20df7ae5154b3830355f8ab4269123a87affdea59fe74fe9292a91d0d7e17b2f" PKG_LICENSE="GPL" PKG_SITE="https://w1.fi/wpa_supplicant/" PKG_URL="https://w1.fi/releases/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain dbus libnl openssl" PKG_LONGDESC="A free software implementation of an IEEE 802.11i supplicant." PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="+lto-parallel" PKG_MAKE_OPTS_TARGET="-C wpa_supplicant V=1 LIBDIR=/usr/lib BINDIR=/usr/bin" PKG_MAKEINSTALL_OPTS_TARGET="-C wpa_supplicant V=1 LIBDIR=/usr/lib BINDIR=/usr/bin" configure_target() { LDFLAGS+=" -lpthread -lm" cp ${PKG_DIR}/config/makefile.config wpa_supplicant/.config } post_makeinstall_target() { rm -r ${INSTALL}/usr/bin/wpa_cli mkdir -p ${INSTALL}/etc/dbus-1/system.d cp wpa_supplicant/dbus/dbus-wpa_supplicant.conf ${INSTALL}/etc/dbus-1/system.d mkdir -p ${INSTALL}/usr/lib/systemd/system cp wpa_supplicant/systemd/wpa_supplicant.service ${INSTALL}/usr/lib/systemd/system mkdir -p ${INSTALL}/usr/share/dbus-1/system-services cp wpa_supplicant/dbus/fi.w1.wpa_supplicant1.service ${INSTALL}/usr/share/dbus-1/system-services } ================================================ FILE: packages/network/wpa_supplicant/patches/wpa_supplicant-2.4-libnl3-includes.patch ================================================ diff -Naur wpa_supplicant-2.4/src/drivers/drivers.mk wpa_supplicant-2.4.patch/src/drivers/drivers.mk --- wpa_supplicant-2.4/src/drivers/drivers.mk 2015-03-15 18:30:39.000000000 +0100 +++ wpa_supplicant-2.4.patch/src/drivers/drivers.mk 2015-03-17 13:16:01.390789977 +0100 @@ -35,7 +35,7 @@ ifdef CONFIG_LIBNL32 DRV_LIBS += -lnl-3 DRV_LIBS += -lnl-genl-3 - DRV_CFLAGS += -I/usr/include/libnl3 + DRV_CFLAGS += `pkg-config --cflags libnl-3.0` ifdef CONFIG_LIBNL3_ROUTE DRV_LIBS += -lnl-route-3 DRV_CFLAGS += -DCONFIG_LIBNL3_ROUTE ================================================ FILE: packages/network/wsdd2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="wsdd2" PKG_VERSION="1.8.7" PKG_SHA256="b0b6b31522f4a5e39d075b31d59d57af9a567f543e0b39b2fbdfec324d30310a" PKG_LICENSE="GPL 3.0" PKG_SITE="https://github.com/Netgear/wsdd2/" PKG_URL="https://github.com/Netgear/wsdd2/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="WSD/LLMNR Discovery/Name Service Daemon" PKG_BUILD_FLAGS="+size" post_install() { enable_service wsdd2.service } ================================================ FILE: packages/oem/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="oem" PKG_VERSION="" PKG_LICENSE="various" PKG_SITE="http://www.libreelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain ${PROJECT}" PKG_SECTION="virtual" PKG_LONGDESC="OEM: Metapackage for various OEM packages" ================================================ FILE: packages/packages.mk.addon_template ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="[package name]" PKG_VERSION="[package version identifier or unique githash]" PKG_REV="100" PKG_SHA256="[sha256 hash of the source file, downloaded from PKG_URL]" PKG_ARCH="any" PKG_LICENSE="[license of the upstream project]" PKG_SITE="[url to the upstream project, e.g. http://example.com/libexample" PKG_URL="[download url, e.g. https://github.com/example/libexample/archive/$PKG_VERSION.tar.gz]" # PKG_MAINTAINER="John Doe" # Full name or forum/GitHub nickname, if you want to be identified as the addon maintainer PKG_DEPENDS_TARGET="[build system dependencies, e.g. toolchain zlib openssl]" PKG_SECTION="[location under packages, e.g. database]" PKG_SHORTDESC="[short description of the package, e.g. libexample: library to calculate examples]" PKG_LONGDESC="[long description of the package, often taken from the package/project website, e.g. libexample: this project is created to calculate examples for x and y, with maximum efficiency and fewer errors]" # PKG_TOOLCHAIN="auto" or one of meson, cmake, cmake-make, configure, make, ninja, autotools, manual PKG_IS_ADDON="yes" PKG_ADDON_NAME="[proper name of the addon that is shown at the repo]" PKG_ADDON_TYPE="[type]" # PKG_ADDON_PROJECTS="[project, only set when not any]" # PKG_ADDON_PROVIDES="executable" # PKG_ADDON_REQUIRES="some.addon:0.0.0" #PKG_CMAKE_OPTS_TARGET="-DWITH_EXAMPLE_PATH=/storage/.example # " #pre_configure_target() { # do something, or drop it #} addon() { # copy needed files from other packages (which are not in the image) } # see https://github.com/LibreELEC/LibreELEC.tv/blob/master/packages/readme.md for more # take a look to other packages, for inspiration ================================================ FILE: packages/packages.mk.template ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="[package name]" PKG_VERSION="[package version identifier or unique githash]" PKG_SHA256="[sha256 hash of the source file, downloaded from PKG_URL]" PKG_ARCH="any" PKG_LICENSE="[license of the upstream project]" PKG_SITE="[url to the upstream project, e.g. http://example.com/libexample" PKG_URL="[download url, e.g. https://github.com/example/libexample/archive/$PKG_VERSION.tar.gz]" # PKG_MAINTAINER="John Doe" # Full name or forum/GitHub nickname, if you want to be identified as the addon maintainer PKG_DEPENDS_TARGET="[build system dependencies, e.g. toolchain zlib openssl]" PKG_SECTION="[location under packages, e.g. database]" PKG_SHORTDESC="[short description of the package, e.g. libexample: library to calculate examples]" PKG_LONGDESC="[long description of the package, often taken from the package/project website, e.g. libexample: this project is created to calculate examples for x and y, with maximum efficiency and fewer errors]" # PKG_TOOLCHAIN="auto" #PKG_CMAKE_OPTS_TARGET="-DWITH_EXAMPLE_PATH=/storage/.example # " #pre_configure_target() { # do something, or drop it #} # see https://github.com/LibreELEC/LibreELEC.tv/blob/master/packages/readme.md for more # take a look to other packages, for inspiration ================================================ FILE: packages/print/freetype/package.mk ================================================ # 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) PKG_NAME="freetype" PKG_VERSION="2.12.1" PKG_SHA256="4766f20157cc4cf0cd292f80bf917f92d1c439b243ac3018debf6b9140c41a7f" PKG_LICENSE="GPL" PKG_SITE="https://freetype.org" PKG_URL="https://download.savannah.gnu.org/releases/freetype/freetype-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain zlib libpng" PKG_LONGDESC="The FreeType engine is a free and portable TrueType font rendering engine." PKG_TOOLCHAIN="configure" # package specific configure options PKG_CONFIGURE_OPTS_TARGET="LIBPNG_CFLAGS=-I${SYSROOT_PREFIX}/usr/include \ LIBPNG_LDFLAGS=-L${SYSROOT_PREFIX}/usr/lib \ --with-zlib" pre_configure_target() { # unset LIBTOOL because freetype uses its own ( cd .. unset LIBTOOL sh autogen.sh ) } post_makeinstall_target() { sed -e "s#prefix=/usr#prefix=${SYSROOT_PREFIX}/usr#" -i "${SYSROOT_PREFIX}/usr/lib/pkgconfig/freetype2.pc" cp -P "${PKG_BUILD}/.${TARGET_NAME}/freetype-config" "${SYSROOT_PREFIX}/usr/bin" } ================================================ FILE: packages/print/freetype/patches/freetype-01-fix-pkgconf.patch ================================================ diff -Naur freetype-2.6.1/builds/unix/freetype2.in freetype-2.6.1.patch/builds/unix/freetype2.in --- freetype-2.6.1/builds/unix/freetype2.in 2015-09-25 07:58:57.000000000 +0200 +++ freetype-2.6.1.patch/builds/unix/freetype2.in 2015-10-12 21:58:50.736816464 +0200 @@ -1,7 +1,7 @@ prefix=%prefix% -exec_prefix=%exec_prefix% -libdir=%libdir% -includedir=%includedir% +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include Name: FreeType 2 URL: https://freetype.org ================================================ FILE: packages/python/devel/Jinja2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Jinja2" PKG_VERSION="3.1.2" PKG_SHA256="31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852" PKG_LICENSE="BSD" PKG_SITE="https://pypi.org/project/Jinja2/" PKG_URL="https://files.pythonhosted.org/packages/source/${PKG_NAME:0:1}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="Python3:host setuptools:host MarkupSafe:host" PKG_LONGDESC="Jinja is a fast, expressive, extensible templating engine." PKG_TOOLCHAIN="manual" make_host() { python3 setup.py build } makeinstall_host() { exec_thread_safe python3 setup.py install --prefix=${TOOLCHAIN} } ================================================ FILE: packages/python/devel/Mako/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Mako" PKG_VERSION="1.2.4" PKG_SHA256="d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34" 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" PKG_DEPENDS_HOST="Python3:host setuptools:host MarkupSafe:host" PKG_LONGDESC="Mako is a super-fast templating language that borrows the best ideas from the existing templating languages." PKG_TOOLCHAIN="manual" makeinstall_host() { exec_thread_safe python3 setup.py install --prefix=${TOOLCHAIN} } ================================================ FILE: packages/python/devel/MarkupSafe/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="MarkupSafe" PKG_VERSION="2.1.1" PKG_SHA256="7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b" PKG_LICENSE="GPL" PKG_SITE="https://pypi.org/project/MarkupSafe/" PKG_URL="https://files.pythonhosted.org/packages/source/${PKG_NAME:0:1}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="Python3:host setuptools:host" PKG_LONGDESC="MarkupSafe implements a XML/HTML/XHTML Markup safe string for Python" PKG_TOOLCHAIN="manual" makeinstall_host() { exec_thread_safe python3 setup.py install --prefix=${TOOLCHAIN} } ================================================ FILE: packages/python/devel/distutilscross/package.mk ================================================ # 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="distutilscross" PKG_VERSION="0.1" PKG_SHA256="4ed3fb427708c8a3ed5fe9c599532480f581078a1e0aec0e50f40eb58e9f0015" PKG_LICENSE="GPL" PKG_SITE="https://pypi.org/project/distutilscross/" PKG_URL="https://files.pythonhosted.org/packages/source/${PKG_NAME:0:1}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="Python3:host setuptools:host" PKG_LONGDESC="distutilscross enhances distutils to support Cross Compile of Python extensions" PKG_TOOLCHAIN="manual" makeinstall_host() { exec_thread_safe python setup.py install --prefix=${TOOLCHAIN} } ================================================ FILE: packages/python/devel/distutilscross/patches/distutilscross-0000-fix-python3.patch ================================================ diff --git a/distutilscross/crosscompile.py b/distutilscross/crosscompile.py index 31dfd6c..16b683e 100644 --- a/distutilscross/crosscompile.py +++ b/distutilscross/crosscompile.py @@ -13,7 +13,7 @@ class build(_build): self.cross_compile = 0 def finalize_options(self): - if self.cross_compile and os.environ.has_key('PYTHONXCPREFIX'): + if self.cross_compile and 'PYTHONXCPREFIX' in os.environ: prefix = os.environ['PYTHONXCPREFIX'] sysconfig.get_python_lib = get_python_lib sysconfig.PREFIX = prefix @@ -31,8 +31,8 @@ class build(_build): _get_python_lib = sysconfig.get_python_lib def get_python_lib(plat_specific=0, standard_lib=0, prefix=None): - if os.environ.has_key('PYTHONXCPREFIX'): - print "Setting prefix" + if 'PYTHONXCPREFIX' in os.environ: + print("Setting prefix") prefix = os.environ['PYTHONXCPREFIX'] return _get_python_lib(plat_specific, standard_lib, prefix) @@ -50,24 +50,24 @@ def customize_compiler(compiler): sysconfig.get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS', 'CCSHARED', 'LDSHARED', 'SO') - if os.environ.has_key('CC'): + if 'CC' in os.environ: cc = os.environ['CC'] - if os.environ.has_key('CXX'): + if 'CXX' in os.environ: cxx = os.environ['CXX'] - if os.environ.has_key('LDSHARED'): + if 'LDSHARED' in os.environ: ldshared = os.environ['LDSHARED'] - if os.environ.has_key('CPP'): + if 'CPP' in os.environ: cpp = os.environ['CPP'] else: cpp = cc + " -E" # not always - if os.environ.has_key('LDFLAGS'): + if 'LDFLAGS' in os.environ: ldshared = ldshared + ' ' + os.environ['LDFLAGS'] - if os.environ.has_key('OPT'): + if 'OPT' in os.environ: opt = os.environ['OPT'] - if os.environ.has_key('CFLAGS'): + if 'CFLAGS' in os.environ: cflags = opt + ' ' + os.environ['CFLAGS'] ldshared = ldshared + ' ' + os.environ['CFLAGS'] - if os.environ.has_key('CPPFLAGS'): + if 'CPPFLAGS' in os.environ: cpp = cpp + ' ' + os.environ['CPPFLAGS'] cflags = cflags + ' ' + os.environ['CPPFLAGS'] ldshared = ldshared + ' ' + os.environ['CPPFLAGS'] ================================================ FILE: packages/python/devel/meson/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="meson" PKG_VERSION="0.64.1" PKG_SHA256="3a8e030c2334f782085f81627062cc6d4a6771edf31e055ffe374f9e6b089ab9" PKG_LICENSE="Apache" PKG_SITE="http://mesonbuild.com" PKG_URL="https://github.com/mesonbuild/meson/releases/download/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="Python3:host setuptools:host" PKG_LONGDESC="High productivity build system" PKG_TOOLCHAIN="manual" make_host() { python3 setup.py build } makeinstall_host() { exec_thread_safe python3 setup.py install --prefix=${TOOLCHAIN} --skip-build # Avoid using full path to python3 that may exceed 128 byte limit. # Instead use PATH as we know our toolchain is first. sed -e '1 s/^#!.*$/#!\/usr\/bin\/env python3/' -i ${TOOLCHAIN}/bin/meson } ================================================ FILE: packages/python/devel/ninja/package.mk ================================================ # 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) PKG_NAME="ninja" PKG_VERSION="1.11.1" PKG_SHA256="31747ae633213f1eda3842686f83c2aa1412e0f5691d1c14dbbcc67fe7400cea" PKG_LICENSE="Apache" PKG_SITE="https://ninja-build.org/" PKG_URL="https://github.com/ninja-build/ninja/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="Python3:host" PKG_LONGDESC="Small build system with a focus on speed" PKG_TOOLCHAIN="cmake-make" makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp ninja ${TOOLCHAIN}/bin } ================================================ FILE: packages/python/devel/pgi/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) PKG_NAME="pgi" PKG_VERSION="0.0.11.2" PKG_SHA256="7a1ca8ac4e8bee6b663e6d556ecda8032584de753acd76ab3fc21c4f874fa738" PKG_ARCH="any" PKG_LICENSE="LGPL" PKG_SITE="https://github.com/pygobject/pgi" PKG_URL="https://github.com/pygobject/pgi/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3" PKG_SECTION="python/devel" PKG_SHORTDESC="PGI - Pure Python GObject Introspection Bindings" PKG_LONGDESC="GObject Introspection bindings written in pure Python using ctypes and cffi (optional). API compatible with PyGObject." PKG_TOOLCHAIN="manual" pre_make_target() { export PYTHONXCPREFIX="$SYSROOT_PREFIX/usr" } make_target() { exec_thread_safe python3 setup.py build } makeinstall_target() { exec_thread_safe python3 setup.py install --root=$INSTALL --prefix=/usr } post_makeinstall_target() { find $INSTALL/usr/lib -name "*.py" -exec rm -rf "{}" ";" rm -rf $INSTALL/usr/lib/python*/site-packages/*/tests } ================================================ FILE: packages/python/devel/pgi/patches/pgi-0001-remove-type-as-it-s-not-Python-3-compatible.patch ================================================ From 40f45d7f4a49ec1e66acec5d5ff1ce10c94a99ce Mon Sep 17 00:00:00 2001 From: Portisch Date: Wed, 25 Nov 2020 13:41:14 +0100 Subject: [PATCH] remove 'type' as it's not Python 3 compatible --- pgi/clib/_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgi/clib/_utils.py b/pgi/clib/_utils.py index b45d901..bd0f416 100644 --- a/pgi/clib/_utils.py +++ b/pgi/clib/_utils.py @@ -31,7 +31,7 @@ class _BaseFinalizer(object): self.ptr = ptr def delete(self, deadweakproxy): - type(self)._objects.remove(self) + self._objects.remove(self) self.destructor(deadweakproxy, self.ptr) -- 2.29.2 ================================================ FILE: packages/python/devel/pygobject/package.mk ================================================ # 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) # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="pygobject" PKG_VERSION="3.42.2" PKG_SHA256="ade8695e2a7073849dd0316d31d8728e15e1e0bc71d9ff6d1c09e86be52bc957" PKG_ARCH="any" PKG_LICENSE="LGPL" PKG_SITE="http://www.pygtk.org/" PKG_URL="http://ftp.gnome.org/pub/GNOME/sources/pygobject/$(get_pkg_version_maj_min)/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain Python3 glib libffi gobject-introspection pgi" PKG_LONGDESC="A convenient wrapper for the GObject+ library for use in Python programs." PKG_TOOLCHAIN="meson" pre_configure_target() { PKG_CONFIG_PATH="${SYSROOT_PREFIX}/usr/lib/pkgconfig" PKG_MESON_OPTS_TARGET=" \ -Dpython=${TOOLCHAIN}/bin/${PKG_PYTHON_VERSION} \ -Dpycairo=disabled \ -Dtests=false" } post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin rm -rf ${INSTALL}/usr/share/pygobject } ================================================ FILE: packages/python/devel/setuptools/package.mk ================================================ # 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) PKG_NAME="setuptools" PKG_VERSION="52.0.0" PKG_SHA256="ff0c74d1b905a224d647f99c6135eacbec2620219992186b81aa20012bc7f882" PKG_LICENSE="OSS" PKG_SITE="https://pypi.org/project/setuptools" PKG_URL="https://github.com/pypa/setuptools/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="Python3:host" PKG_LONGDESC="Replaces Setuptools as the standard method for working with Python module distributions." PKG_TOOLCHAIN="manual" make_host() { python3 bootstrap.py } makeinstall_host() { exec_thread_safe python3 setup.py install --prefix=${TOOLCHAIN} } ================================================ FILE: packages/python/devel/waf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="waf" PKG_VERSION="2.0.25" PKG_SHA256="66cff7beed0e77db874e9232cc08874abb3e866c7f0f1f34ba2f959fde44fdd4" PKG_LICENSE="MIT" PKG_SITE="https://waf.io" PKG_URL="https://waf.io/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_LONGDESC="The Waf build system" PKG_TOOLCHAIN="manual" makeinstall_host() { cp -pf ${PKG_BUILD}/waf ${TOOLCHAIN}/bin/ } ================================================ FILE: packages/python/graphics/Pillow/package.mk ================================================ # 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="Pillow" PKG_VERSION="9.3.0" PKG_SHA256="188b2a5fd445b2afa05bc0c1318ce49d4335ebbb69417fbb79acaf0a0784709e" PKG_LICENSE="BSD" PKG_SITE="https://python-pillow.org/" PKG_URL="https://github.com/python-pillow/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host zlib freetype libjpeg-turbo tiff" PKG_LONGDESC="The Python Imaging Library adds image processing capabilities to your Python interpreter." PKG_TOOLCHAIN="manual" pre_make_target() { export PYTHONXCPREFIX="${SYSROOT_PREFIX}/usr" export LDSHARED="${CC} -shared" } make_target() { python3 setup.py build --cross-compile } makeinstall_target() { python3 setup.py install --root=${INSTALL} --prefix=/usr } post_makeinstall_target() { python_remove_source rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/python/graphics/Pillow/patches/Pillow-0001-crosscompiling.patch ================================================ diff --git a/setup.py b/setup.py index 8eb0b3c..277e44a 100755 --- a/setup.py +++ b/setup.py @@ -253,7 +253,7 @@ class pil_build_ext(build_ext): ] + [('add-imaging-libs=', None, 'Add libs to _imaging build')] def initialize_options(self): - self.disable_platform_guessing = None + self.disable_platform_guessing = True self.add_imaging_libs = "" build_ext.initialize_options(self) for x in self.feature: ================================================ FILE: packages/python/python-uinput/package.mk ================================================ PKG_NAME="python-uinput" PKG_VERSION="master" PKG_LICENSE="GPL" PKG_SITE="https://github.com/tuomasjjrasanen/python-uinput" PKG_URL="https://github.com/tuomasjjrasanen/python-uinput/archive/refs/heads/master.tar.gz" PKG_DEPENDS_TARGET="toolchain systemd Python3" PKG_SECTION="python" PKG_LONGDESC="Pythonic API to create virtual input devices via uinput kernel module." PKG_TOOLCHAIN="manual" pre_configure_target() { export LDSHARED="${CC} -shared" export PYTHONPATH="${SYSROOT_PREFIX}/usr/lib/${PKG_PYTHON_VERSION}/site-packages:${PYTHONPATH}" export PYTHON_CPPFLAGS="-I${SYSROOT_PREFIX}/usr/include/${PKG_PYTHON_VERSION}" export PYTHON_LDFLAGS="-L${SYSROOT_PREFIX}/usr/lib -l${PKG_PYTHON_VERSION}" export PYTHON_SITE_PKG="${SYSROOT_PREFIX}/usr/lib/${PKG_PYTHON_VERSION}/site-packages" export _python_sysroot="${SYSROOT_PREFIX}" export _python_prefix="/usr" export _python_exec_prefix="/usr" } make_target() { python3 setup.py build_ext --include-dirs=${SYSROOT_PREFIX}/usr/include python3 setup.py build } makeinstall_target() { python3 setup.py install \ --root=${INSTALL} \ --prefix=/usr } post_makeinstall_target() { python_compile ${INSTALL}/usr/lib/python*/site-packages/ python_remove_source ${INSTALL}/usr/lib/python*/site-packages/ } ================================================ FILE: packages/python/security/pycryptodome/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pycryptodome" PKG_VERSION="3.16.0" PKG_SHA256="c8f6878f11e6164b663058246d2c3ecc3c445f9cbff03dea97cee80c4223b9ff" PKG_LICENSE="BSD" PKG_SITE="https://pypi.org/project/pycryptodome" PKG_URL="https://github.com/Legrandin/${PKG_NAME}/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="PyCryptodome is a self-contained Python package of low-level cryptographic primitives." PKG_TOOLCHAIN="manual" pre_configure_target() { cd ${PKG_BUILD} rm -rf .${TARGET_NAME} export PYTHONXCPREFIX="${SYSROOT_PREFIX}/usr" export LDSHARED="${CC} -shared" } make_target() { python3 setup.py build --cross-compile } makeinstall_target() { python3 setup.py install --root=${INSTALL} --prefix=/usr # Remove SelfTest bloat find ${INSTALL} -type d -name SelfTest -exec rm -fr "{}" \; 2>/dev/null || true find ${INSTALL} -name SOURCES.txt -exec sed -i "/\/SelfTest\//d;" "{}" \; # Create Cryptodome as an alternative namespace to Crypto (Kodi addons may use either) ln -sf /usr/lib/${PKG_PYTHON_VERSION}/site-packages/Crypto ${INSTALL}/usr/lib/${PKG_PYTHON_VERSION}/site-packages/Cryptodome } post_makeinstall_target() { python_remove_source } ================================================ FILE: packages/python/system/dbus-python/package.mk ================================================ # 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) # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="dbus-python" PKG_VERSION="1.3.2" PKG_SHA256="ad67819308618b5069537be237f8e68ca1c7fcc95ee4a121fe6845b1418248f8" PKG_LICENSE="GPL" PKG_SITE="https://freedesktop.org/wiki/Software/dbus" PKG_URL="https://dbus.freedesktop.org/releases/dbus-python/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 dbus dbus-glib" PKG_LONGDESC="D-BUS is a message bus, used for sending messages between applications." PKG_BUILD_FLAGS="+lto" PKG_TOOLCHAIN="autotools" pre_configure_target() { export PKG_CONFIG_PATH="${SYSROOT_PREFIX}/usr/lib/pkgconfig" export PYTHON_CONFIG="${SYSROOT_PREFIX}/usr/bin/python3-config" export PYTHON_INCLUDES="$(${SYSROOT_PREFIX}/usr/bin/python3-config --includes)" export PYTHON_LIBS="$(${SYSROOT_PREFIX}/usr/bin/python3-config --ldflags --embed)" } post_makeinstall_target() { python_remove_source } ================================================ FILE: packages/python/system/dbussy/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="dbussy" PKG_VERSION="691a8a8a1914416b7ea1545fb931d74f2e381f09" PKG_SHA256="857104ef2fd1978323d7c87b32c753d2d178b79adbd13f52cea23511f5195ded" PKG_LICENSE="LGPLv2.1+" PKG_SITE="https://gitlab.com/ldo/dbussy" PKG_URL="https://github.com/ldo/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 dbus" PKG_LONGDESC="DBussy is a wrapper around libdbus, written in pure Python" PKG_TOOLCHAIN="manual" make_target() { python3 setup.py build } makeinstall_target() { python3 setup.py install --root=${INSTALL} --prefix=/usr } post_makeinstall_target() { python_remove_source } ================================================ FILE: packages/python/system/simplejson/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2017 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="simplejson" PKG_VERSION="3.18.1" PKG_SHA256="746086e3ef6d74b53599df31b491d88a355abf2e31c837137dd90f8c4561cafa" PKG_LICENSE="OSS" PKG_SITE="http://pypi.org/project/simplejson" PKG_URL="https://files.pythonhosted.org/packages/source/${PKG_NAME:0:1}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="A simple, fast, complete, correct and extensible JSON encoder and decoder for Python 2.5+." PKG_TOOLCHAIN="manual" pre_make_target() { export PYTHONXCPREFIX="${SYSROOT_PREFIX}/usr" } make_target() { python3 setup.py build --cross-compile } makeinstall_target() { python3 setup.py install --root=${INSTALL} --prefix=/usr } post_makeinstall_target() { python_remove_source rm -rf ${INSTALL}/usr/lib/python*/site-packages/*/tests } ================================================ FILE: packages/rust/cargo/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="cargo" PKG_VERSION="$(get_pkg_version rust)" PKG_LICENSE="MIT" PKG_SITE="https://www.rust-lang.org" PKG_DEPENDS_HOST="openssl:host rust:host" PKG_DEPENDS_UNPACK="cargo-snapshot rust" PKG_LONGDESC="Cargo is the Rust package manager" PKG_TOOLCHAIN="manual" pre_configure_host() { "$(get_build_dir cargo-snapshot)/install.sh" --prefix="${PKG_BUILD}/cargo-snapshot" --disable-ldconfig } configure_host() { cd ${PKG_BUILD} } make_host() { cd ${PKG_BUILD} export RUSTC_BOOTSTRAP="1" ./cargo-snapshot/bin/cargo build -v --target ${RUST_HOST} --release --manifest-path="$(get_build_dir rust)/src/tools/cargo/Cargo.toml" } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp -a ${PKG_BUILD}/.${RUST_HOST}/target/${RUST_HOST}/release/cargo ${TOOLCHAIN}/bin/ } ================================================ FILE: packages/rust/cargo-c/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) PKG_NAME="cargo-c" PKG_VERSION="v0.9.17" PKG_SHA256="95fcf50505516dfa6a941e666d1388810da9d7a9e1c623c09068faef5d50b3b9" PKG_LICENSE="MIT" PKG_SITE="https://github.com/lu-zero/cargo-c" PKG_URL="https://github.com/lu-zero/cargo-c/archive/refs/tags/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="cargo:host" PKG_LONGDESC="Use Cargo-c to build and install C-compatible libraries" PKG_TOOLCHAIN="manual" make_host() { cargo build --release --manifest-path ${PKG_BUILD}/Cargo.toml } makeinstall_host() { cargo install --profile release --path ${PKG_BUILD} } ================================================ FILE: packages/rust/cargo-snapshot/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="cargo-snapshot" PKG_VERSION="$(get_pkg_version rust)" PKG_SHA256="e744dad75de8419e7fea530c29bd56cf931b4d4de62eb4bd442bfac7b54e61ed" PKG_LICENSE="MIT" PKG_SITE="https://www.rust-lang.org" PKG_URL="https://static.rust-lang.org/dist/cargo-${PKG_VERSION}-${MACHINE_HARDWARE_NAME}-unknown-linux-gnu.tar.xz" PKG_LONGDESC="cargo bootstrap package" PKG_TOOLCHAIN="manual" ================================================ FILE: packages/rust/rust/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rust" PKG_VERSION="1.67.1" PKG_SHA256="46483d3e5de85a3bd46f8e7a3ae1837496391067dbe713a25d3cf051b3d9ff6e" PKG_LICENSE="MIT" PKG_SITE="https://www.rust-lang.org" PKG_URL="https://static.rust-lang.org/dist/rustc-${PKG_VERSION}-src.tar.gz" PKG_DEPENDS_HOST="toolchain llvm:host" PKG_DEPENDS_UNPACK="rustc-snapshot rust-std-snapshot cargo-snapshot" PKG_LONGDESC="A systems programming language that prevents segfaults, and guarantees thread safety." PKG_TOOLCHAIN="manual" pre_configure_host() { "$(get_build_dir rustc-snapshot)/install.sh" --prefix="${PKG_BUILD}/rust-snapshot" --disable-ldconfig "$(get_build_dir rust-std-snapshot)/install.sh" --prefix="${PKG_BUILD}/rust-snapshot" --disable-ldconfig "$(get_build_dir cargo-snapshot)/install.sh" --prefix="${PKG_BUILD}/rust-snapshot" --disable-ldconfig } configure_host() { mkdir -p ${PKG_BUILD}/targets case "${TARGET_ARCH}" in "arm") # the arm target is special because we specify the subarch. ie armv8a cp -a ${PKG_DIR}/targets/arm-libreelec-linux-gnueabihf.json ${PKG_BUILD}/targets/${TARGET_NAME}.json ;; "aarch64"|"x86_64") cp -a ${PKG_DIR}/targets/${TARGET_NAME}.json ${PKG_BUILD}/targets/${TARGET_NAME}.json ;; esac cat > ${PKG_BUILD}/config.toml < ${CARGO_HOME}/config << END [target.${TARGET_NAME}] linker = "${TARGET_PREFIX}gcc" [target.${RUST_HOST}] linker = "${CC}" rustflags = ["-C", "link-arg=-Wl,-rpath,${TOOLCHAIN}/lib"] [build] target-dir = "${PKG_BUILD}/target" [term] progress.when = 'always' progress.width = 80 END } make_host() { cd ${PKG_BUILD} unset CFLAGS unset CXXFLAGS unset CPPFLAGS unset LDFLAGS export RUST_TARGET_PATH="${PKG_BUILD}/targets/" python3 src/bootstrap/bootstrap.py -j ${CONCURRENCY_MAKE_LEVEL} build --stage 2 --verbose } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp -a build/${RUST_HOST}/stage2/bin/* ${TOOLCHAIN}/bin mkdir -p ${TOOLCHAIN}/lib/rustlib cp -a build/${RUST_HOST}/stage2/lib/* ${TOOLCHAIN}/lib cp -a ${PKG_BUILD}/targets/*.json ${TOOLCHAIN}/lib/rustlib/ } ================================================ FILE: packages/rust/rust/targets/aarch64-libreelec-linux-gnu.json ================================================ { "arch": "aarch64", "crt-static-respected": true, "data-layout": "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128", "dynamic-linking": true, "env": "gnu", "executables": true, "features": "+outline-atomics", "has-rpath": true, "has-thread-local": true, "is-builtin": false, "llvm-target": "aarch64-unknown-linux-gnu", "max-atomic-width": 128, "os": "linux", "position-independent-executables": true, "relro-level": "full", "supported-sanitizers": [ "address", "cfi", "leak", "memory", "memtag", "thread", "hwaddress" ], "target-family": [ "unix" ], "target-mcount": "\u0001_mcount", "target-pointer-width": "64" } ================================================ FILE: packages/rust/rust/targets/arm-libreelec-linux-gnueabihf.json ================================================ { "abi": "eabihf", "arch": "arm", "crt-static-respected": true, "data-layout": "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64", "dynamic-linking": true, "env": "gnu", "executables": true, "features": "+strict-align,+v6,+vfp2,-d32", "has-rpath": true, "has-thread-local": true, "is-builtin": false, "llvm-target": "arm-unknown-linux-gnueabihf", "max-atomic-width": 64, "os": "linux", "position-independent-executables": true, "relro-level": "full", "target-family": [ "unix" ], "target-mcount": "\u0001__gnu_mcount_nc", "target-pointer-width": "32" } ================================================ FILE: packages/rust/rust/targets/x86_64-libreelec-linux-gnu.json ================================================ { "arch": "x86_64", "cpu": "x86-64", "crt-static-respected": true, "data-layout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128", "dynamic-linking": true, "env": "gnu", "executables": true, "has-rpath": true, "has-thread-local": true, "is-builtin": false, "llvm-target": "x86_64-unknown-linux-gnu", "max-atomic-width": 64, "os": "linux", "position-independent-executables": true, "pre-link-args": { "gcc": [ "-m64" ] }, "relro-level": "full", "stack-probes": { "kind": "call" }, "static-position-independent-executables": true, "supported-sanitizers": [ "address", "cfi", "leak", "memory", "thread" ], "target-family": [ "unix" ], "target-pointer-width": "64" } ================================================ FILE: packages/rust/rust-std-snapshot/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rust-std-snapshot" PKG_VERSION="$(get_pkg_version rust)" PKG_SHA256="f4dc8468dfc1dbd86f865b10f06e0e4b4e76f5a3a1cc27317a520ab1660844e9" PKG_LICENSE="MIT" PKG_SITE="https://www.rust-lang.org" PKG_URL="https://static.rust-lang.org/dist/rust-std-${PKG_VERSION}-${MACHINE_HARDWARE_NAME}-unknown-linux-gnu.tar.xz" PKG_LONGDESC="rust std library bootstrap package" PKG_TOOLCHAIN="manual" ================================================ FILE: packages/rust/rustc-snapshot/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rustc-snapshot" PKG_VERSION="$(get_pkg_version rust)" PKG_SHA256="e27ec0c6d1a2b2b38e5258904c3741ddb246bff5715aa95e595f818aa77f7bee" PKG_LICENSE="MIT" PKG_SITE="https://www.rust-lang.org" PKG_URL="https://static.rust-lang.org/dist/rustc-${PKG_VERSION}-${MACHINE_HARDWARE_NAME}-unknown-linux-gnu.tar.xz" PKG_LONGDESC="rustc bootstrap compiler" PKG_TOOLCHAIN="manual" ================================================ FILE: packages/security/gnutls/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="gnutls" PKG_VERSION="3.7.8" PKG_SHA256="c58ad39af0670efe6a8aee5e3a8b2331a1200418b64b7c51977fb396d4617114" PKG_LICENSE="LGPL2.1" PKG_SITE="https://gnutls.org" PKG_URL="https://www.gnupg.org/ftp/gcrypt/gnutls/v${PKG_VERSION:0:3}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libidn2 nettle zlib" PKG_LONGDESC="A library which provides a secure layer over a reliable transport layer." PKG_CONFIGURE_OPTS_TARGET="--disable-doc \ --disable-full-test-suite \ --disable-guile \ --disable-libdane \ --disable-padlock \ --disable-rpath \ --disable-tests \ --disable-tools \ --disable-valgrind-tests \ --with-idn \ --with-included-libtasn1 \ --with-included-unistring \ --without-p11-kit \ --without-tpm" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/security/libgcrypt/package.mk ================================================ # 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) PKG_NAME="libgcrypt" PKG_VERSION="1.8.7" PKG_SHA256="03b70f028299561b7034b8966d7dd77ef16ed139c43440925fe8782561974748" PKG_LICENSE="GPLv2" PKG_SITE="https://www.gnupg.org/" PKG_URL="https://www.gnupg.org/ftp/gcrypt/libgcrypt/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libgpg-error" PKG_LONGDESC="A General purpose cryptographic library." PKG_TOOLCHAIN="autotools" # libgcrypt-1.7.x fails to build with LTO support # see for example https://bugs.gentoo.org/show_bug.cgi?id=581114 pre_configure_target() { PKG_CONFIGURE_OPTS_TARGET="CC_FOR_BUILD=${HOST_CC} \ ac_cv_sys_symbol_underscore=no \ --enable-asm \ --with-gnu-ld \ --with-libgpg-error-prefix=${SYSROOT_PREFIX}/usr \ --disable-doc" } post_makeinstall_target() { sed -e "s:\(['= ]\)\"/usr:\\1\"${SYSROOT_PREFIX}/usr:g" -i src/${PKG_NAME}-config cp src/${PKG_NAME}-config ${SYSROOT_PREFIX}/usr/bin rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/security/libgcrypt/patches/libgcrypt-01-dont_replace_parts_of_path-0.1.patch ================================================ diff -Naur libgcrypt-1.4.6/cipher/Makefile.am libgcrypt-1.4.6.patch/cipher/Makefile.am --- libgcrypt-1.4.6/cipher/Makefile.am 2009-12-11 16:31:38.000000000 +0100 +++ libgcrypt-1.4.6.patch/cipher/Makefile.am 2011-05-08 03:21:56.463021968 +0200 @@ -68,7 +68,7 @@ camellia.c camellia.h camellia-glue.c if ENABLE_O_FLAG_MUNGING -o_flag_munging = sed -e 's/-O\([2-9s][2-9s]*\)/-O1/' -e 's/-Ofast/-O1/g' +o_flag_munging = sed -e 's/-O\([2-9s][2-9s]\)/-O1/' -e 's/-Ofast/-O1/g' else o_flag_munging = cat endif diff -Naur libgcrypt-1.4.6/cipher/Makefile.in libgcrypt-1.4.6.patch/cipher/Makefile.in --- libgcrypt-1.4.6/cipher/Makefile.in 2010-07-13 17:42:20.000000000 +0200 +++ libgcrypt-1.4.6.patch/cipher/Makefile.in 2011-05-08 03:22:12.059208971 +0200 @@ -274,7 +274,7 @@ camellia.c camellia.h camellia-glue.c @ENABLE_O_FLAG_MUNGING_FALSE@o_flag_munging = cat -@ENABLE_O_FLAG_MUNGING_TRUE@o_flag_munging = sed -e 's/-O\([2-9s][2-9s]*\)/-O1/' -e 's/-Ofast/-O1/g' +@ENABLE_O_FLAG_MUNGING_TRUE@o_flag_munging = sed -e 's/-O\([2-9s][2-9s]\)/-O1/' -e 's/-Ofast/-O1/g' all: all-am .SUFFIXES: ================================================ FILE: packages/security/libgcrypt/patches/libgcrypt-ac_cv_sys_symbol_underscore.patch ================================================ diff --git a/acinclude.m4 b/acinclude.m4 index a7bc0fa..1a5bffc 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -76,13 +76,14 @@ case "${host}" in i386-emx-os2 | i[3456]86-pc-os2*emx | i386-pc-msdosdjgpp) ac_cv_sys_symbol_underscore=yes ;; - *) - if test "$cross_compiling" = yes; then - if test "x$ac_cv_sys_symbol_underscore" = x ; then - ac_cv_sys_symbol_underscore=yes - fi - else - tmp_do_check="yes" + *) if test -z "$ac_cv_sys_symbol_underscore"; then + if test "$cross_compiling" = yes; then + if test "x$ac_cv_sys_symbol_underscore" = x ; then + ac_cv_sys_symbol_underscore=yes + fi + else + tmp_do_check="yes" + fi fi ;; esac ================================================ FILE: packages/security/libgpg-error/package.mk ================================================ # 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) PKG_NAME="libgpg-error" PKG_VERSION="1.46" PKG_SHA256="b7e11a64246bbe5ef37748de43b245abd72cfcd53c9ae5e7fc5ca59f1c81268d" PKG_LICENSE="GPLv2" PKG_SITE="https://www.gnupg.org" PKG_URL="https://www.gnupg.org/ftp/gcrypt/libgpg-error/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A library that defines common error values for all GnuPG components." pre_configure_target() { PKG_CONFIGURE_OPTS_TARGET="CC_FOR_BUILD=${HOST_CC} --enable-static --disable-shared --disable-nls --disable-rpath --with-gnu-ld --with-pic" # inspired by openembedded case ${TARGET_ARCH} in aarch64) GPGERROR_TUPLE=aarch64-unknown-linux-gnu GPGERROR_TARGET=linux-gnu${TARGET_ABI} ;; arm) GPGERROR_TUPLE=arm-unknown-linux-gnueabi GPGERROR_TARGET=linux-gnu${TARGET_ABI} ;; x86_64) GPGERROR_TUPLE=x86_64-unknown-linux-gnu GPGERROR_TARGET=linux-gnu ;; esac cp ${PKG_BUILD}/src/syscfg/lock-obj-pub.${GPGERROR_TUPLE}.h ${PKG_BUILD}/src/syscfg/lock-obj-pub.${GPGERROR_TARGET}.h } post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin rm -rf ${INSTALL}/usr/share sed -e "s:\(['= ]\)/usr:\\1${SYSROOT_PREFIX}/usr:g" -i src/gpg-error-config cp src/gpg-error-config ${SYSROOT_PREFIX}/usr/bin } ================================================ FILE: packages/security/nettle/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nettle" PKG_VERSION="3.8.1" PKG_SHA256="364f3e2b77cd7dcde83fd7c45219c834e54b0c75e428b6f894a23d12dd41cbfe" PKG_LICENSE="GPL2" PKG_SITE="http://www.lysator.liu.se/~nisse/nettle" PKG_URL="https://ftp.gnu.org/gnu/nettle/nettle-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain gmp" PKG_LONGDESC="A low-level cryptographic library." PKG_CONFIGURE_OPTS_TARGET="--disable-documentation \ --disable-openssl" if target_has_feature neon; then PKG_CONFIGURE_OPTS_TARGET+=" --enable-arm-neon" fi post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/security/nspr/package.mk ================================================ # 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="nspr" PKG_VERSION="4.35" PKG_LICENSE="Mozilla Public License" PKG_SITE="http://www.linuxfromscratch.org/blfs/view/svn/general/nspr.html" PKG_DEPENDS_HOST="ccache:host" PKG_DEPENDS_TARGET="toolchain nss:host nspr:host" PKG_DEPENDS_UNPACK="nss" PKG_LONGDESC="Netscape Portable Runtime (NSPR) provides a platform-neutral API for system level and libc like functions" PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="-parallel" if [ "${TARGET_ARCH}" = "x86_64" ]; then TARGET_USE_64="--enable-64bit" fi PKG_CONFIGURE_OPTS_TARGET="--with-pthreads ${TARGET_USE_64}" PKG_MAKE_OPTS_TARGET="NSINSTALL=${TOOLCHAIN}/bin/nsinstall" PKG_MAKEINSTALL_OPTS_TARGET="NSINSTALL=${TOOLCHAIN}/bin/nsinstall" configure_host() { cd $(get_build_dir nss)/nspr ./configure --with-pthreads --enable-64bit --with-pthreads --prefix=${TOOLCHAIN} } pre_make_host() { cd $(get_build_dir nss)/nspr make clean } configure_target() { cd $(get_build_dir nss)/nspr ./configure --with-pthreads ${TARGET_USE_64} ${TARGET_CONFIGURE_OPTS} } pre_make_target() { cd $(get_build_dir nss)/nspr make clean } ================================================ FILE: packages/security/nss/package.mk ================================================ # 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.87" PKG_SHA256="eb70ea0b58dce69aa490e9e9fecd132a7d644e1da3d631e163376a0dcc11a022" PKG_LICENSE="Mozilla Public License" PKG_SITE="http://ftp.mozilla.org/" PKG_URL="https://ftp.mozilla.org/pub/security/nss/releases/NSS_${PKG_VERSION//./_}_RTM/src/nss-${PKG_VERSION}-with-nspr-$(get_pkg_version nspr).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" PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="-parallel" make_host() { cd ${PKG_BUILD}/nss make clean || true rm -rf ${PKG_BUILD}/dist INCLUDES="-I${TOOLCHAIN}/include" \ make BUILD_OPT=1 USE_64=1 NSS_ENABLE_WERROR=0 \ PREFIX=${TOOLCHAIN} \ NSPR_INCLUDE_DIR=${TOOLCHAIN}/include/nspr \ USE_SYSTEM_ZLIB=1 ZLIB_LIBS="-lz -L${TOOLCHAIN}/lib" \ SKIP_SHLIBSIGN=1 \ NSS_TESTS="dummy" \ CC=${CC} LDFLAGS="${LDFLAGS} -L${TOOLCHAIN}/lib" \ V=1 } makeinstall_host() { cd ${PKG_BUILD} ${STRIP} dist/Linux*/lib/*.so cp -L dist/Linux*/lib/*.so ${TOOLCHAIN}/lib mkdir -p ${TOOLCHAIN}/include/nss cp -RL dist/{public,private}/nss/* ${TOOLCHAIN}/include/nss cp -L dist/Linux*/lib/pkgconfig/nss.pc ${TOOLCHAIN}/lib/pkgconfig cp -L nss/coreconf/nsinstall/*/nsinstall ${TOOLCHAIN}/bin } make_target() { cd ${PKG_BUILD}/nss local TARGET_USE_64="" [ "${TARGET_ARCH}" = "x86_64" -o "${TARGET_ARCH}" = "aarch64" ] && TARGET_USE_64="USE_64=1" local TARGET_x86_64="" [ "${TARGET_ARCH}" != "x86_64" ] && TARGET_x86_64="NSS_DISABLE_AVX2=1" make ${TARGET_x86_64} clean || true rm -rf ${PKG_BUILD}/dist make BUILD_OPT=1 ${TARGET_USE_64} ${TARGET_x86_64} \ NSS_USE_SYSTEM_SQLITE=1 \ NSPR_INCLUDE_DIR=${SYSROOT_PREFIX}/usr/include/nspr \ NSS_USE_SYSTEM_SQLITE=1 \ USE_SYSTEM_ZLIB=1 ZLIB_LIBS=-lz \ SKIP_SHLIBSIGN=1 \ OS_TEST=${TARGET_ARCH} \ NSS_TESTS="dummy" \ NSINSTALL=${TOOLCHAIN}/bin/nsinstall \ CPU_ARCH_TAG=${TARGET_ARCH} \ CC=${CC} \ LDFLAGS="${LDFLAGS} -L${SYSROOT_PREFIX}/usr/lib" \ V=1 } makeinstall_target() { cd ${PKG_BUILD} ${STRIP} dist/Linux*/lib/*.so cp -L dist/Linux*/lib/*.so ${SYSROOT_PREFIX}/usr/lib mkdir -p ${SYSROOT_PREFIX}/usr/include/nss cp -RL dist/{public,private}/nss/* ${SYSROOT_PREFIX}/usr/include/nss cp -L dist/Linux*/lib/pkgconfig/nss.pc ${SYSROOT_PREFIX}/usr/lib/pkgconfig mkdir -p ${PKG_INSTALL}/usr/lib cp -PL dist/Linux*/lib/*.so ${PKG_INSTALL}/usr/lib } ================================================ FILE: packages/security/nss/patches/nss-02_3.15.5-standalone-1.patch ================================================ Submitted By: Armin K. Date: 2013-07-02 Initial Package Version: 3.15 Upstream Status: Not applicable Origin: Based on dj's original patch, rediffed and modified for 3.15 Description: Adds auto-generated nss.pc and nss-config script, and allows building without nspr in the source tree. --- a/nss/config/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ b/nss/config/Makefile 2013-07-02 14:53:56.684750636 +0200 @@ -0,0 +1,40 @@ +CORE_DEPTH = .. +DEPTH = .. + +include $(CORE_DEPTH)/coreconf/config.mk + +NSS_MAJOR_VERSION = `grep "NSS_VMAJOR" ../lib/nss/nss.h | awk '{print $$3}'` +NSS_MINOR_VERSION = `grep "NSS_VMINOR" ../lib/nss/nss.h | awk '{print $$3}'` +NSS_PATCH_VERSION = `grep "NSS_VPATCH" ../lib/nss/nss.h | awk '{print $$3}'` +PREFIX = /usr + +all: export libs + +export: + # Create the nss.pc file + mkdir -p $(DIST)/lib/pkgconfig + sed -e "s,@prefix@,$(PREFIX)," \ + -e "s,@exec_prefix@,\$${prefix}," \ + -e "s,@libdir@,\$${prefix}/lib," \ + -e "s,@includedir@,\$${prefix}/include/nss," \ + -e "s,@NSS_MAJOR_VERSION@,$(NSS_MAJOR_VERSION),g" \ + -e "s,@NSS_MINOR_VERSION@,$(NSS_MINOR_VERSION)," \ + -e "s,@NSS_PATCH_VERSION@,$(NSS_PATCH_VERSION)," \ + nss.pc.in > nss.pc + chmod 0644 nss.pc + ln -sf ../../../../nss/config/nss.pc $(DIST)/lib/pkgconfig + + # Create the nss-config script + mkdir -p $(DIST)/bin + sed -e "s,@prefix@,$(PREFIX)," \ + -e "s,@NSS_MAJOR_VERSION@,$(NSS_MAJOR_VERSION)," \ + -e "s,@NSS_MINOR_VERSION@,$(NSS_MINOR_VERSION)," \ + -e "s,@NSS_PATCH_VERSION@,$(NSS_PATCH_VERSION)," \ + nss-config.in > nss-config + chmod 0755 nss-config + ln -sf ../../../nss/config/nss-config $(DIST)/bin + +libs: + +dummy: all export libs + --- a/nss/config/nss-config.in 1970-01-01 01:00:00.000000000 +0100 +++ b/nss/config/nss-config.in 2013-07-02 14:52:58.328084334 +0200 @@ -0,0 +1,153 @@ +#!/bin/sh + +prefix=@prefix@ + +major_version=@NSS_MAJOR_VERSION@ +minor_version=@NSS_MINOR_VERSION@ +patch_version=@NSS_PATCH_VERSION@ + +usage() +{ + cat <&2 +fi + +lib_nss=yes +lib_nssutil=yes +lib_smime=yes +lib_ssl=yes +lib_softokn=yes + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + case $1 in + --prefix=*) + prefix=$optarg + ;; + --prefix) + echo_prefix=yes + ;; + --exec-prefix=*) + exec_prefix=$optarg + ;; + --exec-prefix) + echo_exec_prefix=yes + ;; + --includedir=*) + includedir=$optarg + ;; + --includedir) + echo_includedir=yes + ;; + --libdir=*) + libdir=$optarg + ;; + --libdir) + echo_libdir=yes + ;; + --version) + echo ${major_version}.${minor_version}.${patch_version} + ;; + --cflags) + echo_cflags=yes + ;; + --libs) + echo_libs=yes + ;; + nss) + lib_nss=yes + ;; + nssutil) + lib_nssutil=yes + ;; + smime) + lib_smime=yes + ;; + ssl) + lib_ssl=yes + ;; + softokn) + lib_softokn=yes + ;; + *) + usage 1 1>&2 + ;; + esac + shift +done + +# Set variables that may be dependent upon other variables +if test -z "$exec_prefix"; then + exec_prefix=`pkg-config --variable=exec_prefix nss` +fi +if test -z "$includedir"; then + includedir=`pkg-config --variable=includedir nss` +fi +if test -z "$libdir"; then + libdir=`pkg-config --variable=libdir nss` +fi + +if test "$echo_prefix" = "yes"; then + echo $prefix +fi + +if test "$echo_exec_prefix" = "yes"; then + echo $exec_prefix +fi + +if test "$echo_includedir" = "yes"; then + echo $includedir +fi + +if test "$echo_libdir" = "yes"; then + echo $libdir +fi + +if test "$echo_cflags" = "yes"; then + echo -I$includedir +fi + +if test "$echo_libs" = "yes"; then + libdirs="-L$libdir" + if test -n "$lib_nss"; then + libdirs="$libdirs -lnss${major_version}" + fi + if test -n "$lib_nssutil"; then + libdirs="$libdirs -lnssutil${major_version}" + fi + if test -n "$lib_smime"; then + libdirs="$libdirs -lsmime${major_version}" + fi + if test -n "$lib_ssl"; then + libdirs="$libdirs -lssl${major_version}" + fi + if test -n "$lib_softokn"; then + libdirs="$libdirs -lsoftokn${major_version}" + fi + echo $libdirs +fi + --- a/nss/config/nss.pc.in 1970-01-01 01:00:00.000000000 +0100 +++ b/nss/config/nss.pc.in 2013-07-02 14:52:58.328084334 +0200 @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: NSS +Description: Network Security Services +Version: @NSS_MAJOR_VERSION@.@NSS_MINOR_VERSION@.@NSS_PATCH_VERSION@ +Requires: nspr >= 4.8 +Libs: -L@libdir@ -lnss@NSS_MAJOR_VERSION@ -lnssutil@NSS_MAJOR_VERSION@ -lsmime@NSS_MAJOR_VERSION@ -lssl@NSS_MAJOR_VERSION@ -lsoftokn@NSS_MAJOR_VERSION@ +Cflags: -I${includedir} + --- a/nss/Makefile.orig 2020-12-19 09:07:22.015285016 +0000 +++ a/nss/Makefile 2020-12-19 09:17:06.966350898 +0000 @@ -48,7 +48,6 @@ ####################################################################### nss_build_all: - $(MAKE) build_nspr $(MAKE) all $(MAKE) latest --- a/nss/manifest.mn 2013-05-28 23:43:24.000000000 +0200 +++ b/nss/manifest.mn 2013-07-02 14:52:58.331417666 +0200 @@ -10,7 +10,7 @@ RELEASE = nss -DIRS = coreconf lib cmd cpputil gtests +DIRS = coreconf lib cmd config HAVE_ALL_TARGET := 1 ================================================ FILE: packages/security/nss/patches/nss-04-skip_shlibsign.patch ================================================ diff -Naur nss-3.29.5.orig/nss/cmd/shlibsign/Makefile nss-3.29.5/nss/cmd/shlibsign/Makefile --- nss-3.29.5.orig/nss/cmd/shlibsign/Makefile 2017-09-08 10:56:01.663876686 +0200 +++ nss-3.29.5/nss/cmd/shlibsign/Makefile 2017-09-08 10:57:19.659306831 +0200 @@ -95,7 +95,9 @@ endif endif +ifndef SKIP_SHLIBSIGN libs: install ifdef CHECKLOC $(MAKE) $(CHECKLOC) endif +endif ================================================ FILE: packages/security/nss/patches/nss-05-disable_host_cflags.patch ================================================ diff -Naur nss-3.29.5.orig/nspr/config/autoconf.mk.in nss-3.29.5/nspr/config/autoconf.mk.in --- nss-3.29.5.orig/nspr/config/autoconf.mk.in 2017-09-08 11:03:27.572619156 +0200 +++ nss-3.29.5/nspr/config/autoconf.mk.in 2017-09-08 11:03:41.100520343 +0200 @@ -104,7 +104,7 @@ RESOLVE_LINK_SYMBOLS = @RESOLVE_LINK_SYMBOLS@ HOST_CC = @HOST_CC@ -HOST_CFLAGS = @HOST_CFLAGS@ +#HOST_CFLAGS = @HOST_CFLAGS@ HOST_LDFLAGS = @HOST_LDFLAGS@ DEFINES = @DEFINES@ @DEFS@ ================================================ FILE: packages/security/nss/patches/nss-09-gcc-warning-workaround.patch ================================================ diff -r ab04fd73fd6d coreconf/nsinstall/nsinstall.c --- a/nss/coreconf/nsinstall/nsinstall.c Mon Aug 24 22:52:43 2020 +0000 +++ b/nss/coreconf/nsinstall/nsinstall.c Wed Aug 26 13:04:16 2020 +0200 @@ -50,6 +50,7 @@ extern int fchmod(int fildes, mode_t mode); #endif +#define GETCWD_CANT_MALLOC 1 #ifdef GETCWD_CANT_MALLOC /* ================================================ FILE: packages/security/openssl/cert/cacert.pem ================================================ ## ## Bundle of CA Root Certificates ## ## Certificate data from Mozilla as of: Sat Nov 18 22:59:13 2023 GMT ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates ## file (certdata.txt). This file can be found in the mozilla source tree: ## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt ## ## It contains the certificates in PEM format and therefore ## can be directly used with curl / libcurl / php_curl, or with ## an Apache+mod_ssl webserver for SSL client authentication. ## Just configure this file as the SSLCACertificateFile. ## ## Conversion done with mk-ca-bundle.pl version 1.29. ## SHA256: 1970dd65858925d68498d2356aea6d03f764422523c5887deca8ce3ba9e1f845 ## GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= -----END CERTIFICATE----- Baltimore CyberTrust Root ========================= -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- Entrust Root Certification Authority ==================================== -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- QuoVadis Root CA 3 ================== -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- Go Daddy Class 2 CA =================== -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b vZ8= -----END CERTIFICATE----- Starfield Class 2 CA ==================== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- DigiCert Global Root CA ======================= -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- DigiCert High Assurance EV Root CA ================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- SwissSign Silver CA - G2 ======================== -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- SecureTrust CA ============== -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- Secure Global CA ================ -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- COMODO Certification Authority ============================== -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- Certigna ======== -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány ======================================== -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- SecureSign RootCA11 =================== -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- Izenpe.com ========== -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 -----END CERTIFICATE----- Starfield Root Certificate Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- Starfield Services Root Certificate Authority - G2 ================================================== -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 -----END CERTIFICATE----- AffirmTrust Commercial ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- AffirmTrust Networking ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- AffirmTrust Premium =================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== -----END CERTIFICATE----- AffirmTrust Premium ECC ======================= -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM eQ== -----END CERTIFICATE----- Certum Trusted Network CA ========================= -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- Security Communication RootCA2 ============================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN rJgWVqA= -----END CERTIFICATE----- Buypass Class 3 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi Cp/HuZc= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 3 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 2009 ============================== -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 EV 2009 ================================= -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv w9y4AyHqnxbxLFS1 -----END CERTIFICATE----- CA Disig Root R2 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV 7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- ACCVRAIZ1 ========= -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p EfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- TWCA Global Root CA =================== -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= -----END CERTIFICATE----- TeliaSonera Root CA v1 ====================== -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== -----END CERTIFICATE----- Atos TrustedRoot 2011 ===================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed -----END CERTIFICATE----- QuoVadis Root CA 1 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV hMJKzRwuJIczYOXD -----END CERTIFICATE----- QuoVadis Root CA 2 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr O3jtZsSOeWmD3n+M -----END CERTIFICATE----- QuoVadis Root CA 3 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 PpxxVJkES/1Y+Zj0 -----END CERTIFICATE----- DigiCert Assured ID Root G2 =========================== -----BEGIN CERTIFICATE----- MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo IhNzbM8m9Yop5w== -----END CERTIFICATE----- DigiCert Assured ID Root G3 =========================== -----BEGIN CERTIFICATE----- MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy 1vUhZscv6pZjamVFkpUBtA== -----END CERTIFICATE----- DigiCert Global Root G2 ======================= -----BEGIN CERTIFICATE----- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl MrY= -----END CERTIFICATE----- DigiCert Global Root G3 ======================= -----BEGIN CERTIFICATE----- MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 VOKa5Vt8sycX -----END CERTIFICATE----- DigiCert Trusted Root G4 ======================== -----BEGIN CERTIFICATE----- MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP 82Z+ -----END CERTIFICATE----- COMODO RSA Certification Authority ================================== -----BEGIN CERTIFICATE----- MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ 5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX 2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I LaZRfyHBNVOFBkpdn627G190 -----END CERTIFICATE----- USERTrust RSA Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz 0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O +T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq /nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ 7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 -----END CERTIFICATE----- USERTrust ECC Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= -----END CERTIFICATE----- GlobalSign ECC Root CA - R5 =========================== -----BEGIN CERTIFICATE----- MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- IdenTrust Commercial Root CA 1 ============================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi 1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl 3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe 2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R cGzM7vRX+Bi6hG6H -----END CERTIFICATE----- IdenTrust Public Sector Root CA 1 ================================= -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL 4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ 3Wl9af0AVqW3rLatt8o+Ae+c -----END CERTIFICATE----- Entrust Root Certification Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO e4pIb4tF9g== -----END CERTIFICATE----- Entrust Root Certification Authority - EC1 ========================================== -----BEGIN CERTIFICATE----- MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G -----END CERTIFICATE----- CFCA EV ROOT ============ -----BEGIN CERTIFICATE----- MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD 7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua 4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- OISTE WISeKey Global Root GB CA =============================== -----BEGIN CERTIFICATE----- MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= -----END CERTIFICATE----- SZAFIR ROOT CA2 =============== -----BEGIN CERTIFICATE----- MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== -----END CERTIFICATE----- Certum Trusted Network CA 2 =========================== -----BEGIN CERTIFICATE----- MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 zAYspsbiDrW5viSP -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2015 ======================================================= -----BEGIN CERTIFICATE----- MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q p/UsQu0yrbYhnr68 -----END CERTIFICATE----- Hellenic Academic and Research Institutions ECC RootCA 2015 =========================================================== -----BEGIN CERTIFICATE----- MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR -----END CERTIFICATE----- ISRG Root X1 ============ -----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ 4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf 1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY 9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV 0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ m+kXQ99b21/+jh5Xos1AnX5iItreGCc= -----END CERTIFICATE----- AC RAIZ FNMT-RCM ================ -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou 08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ 47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW +YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d 8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm 5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= -----END CERTIFICATE----- Amazon Root CA 1 ================ -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 -----END CERTIFICATE----- Amazon Root CA 2 ================ -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= -----END CERTIFICATE----- Amazon Root CA 3 ================ -----BEGIN CERTIFICATE----- MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== -----END CERTIFICATE----- Amazon Root CA 4 ================ -----BEGIN CERTIFICATE----- MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== -----END CERTIFICATE----- TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 ============================================= -----BEGIN CERTIFICATE----- MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= -----END CERTIFICATE----- GDCA TrustAUTH R5 ROOT ====================== -----BEGIN CERTIFICATE----- MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ 9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx 9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd +PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ 8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv /EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== -----END CERTIFICATE----- SSL.com Root Certification Authority RSA ======================================== -----BEGIN CERTIFICATE----- MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= -----END CERTIFICATE----- SSL.com Root Certification Authority ECC ======================================== -----BEGIN CERTIFICATE----- MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ 8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z 5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl -----END CERTIFICATE----- SSL.com EV Root Certification Authority RSA R2 ============================================== -----BEGIN CERTIFICATE----- MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim 9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 +qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 ++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX 9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== -----END CERTIFICATE----- SSL.com EV Root Certification Authority ECC =========================================== -----BEGIN CERTIFICATE----- MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy 3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe 5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== -----END CERTIFICATE----- GlobalSign Root CA - R6 ======================= -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE 3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP 0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr 3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= -----END CERTIFICATE----- OISTE WISeKey Global Root GC CA =============================== -----BEGIN CERTIFICATE----- MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 -----END CERTIFICATE----- UCA Global G2 Root ================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV 8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa 4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo 5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== -----END CERTIFICATE----- UCA Extended Validation Root ============================ -----BEGIN CERTIFICATE----- MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR 59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH 0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS 3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb +7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr dhh2n1ax -----END CERTIFICATE----- Certigna Root CA ================ -----BEGIN CERTIFICATE----- MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq 4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ /TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of 1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq 7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd 8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS 6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= -----END CERTIFICATE----- emSign Root CA - G1 =================== -----BEGIN CERTIFICATE----- MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ 6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q +Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx iN66zB+Afko= -----END CERTIFICATE----- emSign ECC Root CA - G3 ======================= -----BEGIN CERTIFICATE----- MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc 58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj -----END CERTIFICATE----- emSign Root CA - C1 =================== -----BEGIN CERTIFICATE----- MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp /6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= -----END CERTIFICATE----- emSign ECC Root CA - C3 ======================= -----BEGIN CERTIFICATE----- MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd 6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== -----END CERTIFICATE----- Hongkong Post Root CA 3 ======================= -----BEGIN CERTIFICATE----- MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2 MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim 5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj 0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/ JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h +bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov +BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw 9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7 nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB 60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq dBb9HxEGmpv0 -----END CERTIFICATE----- Entrust Root Certification Authority - G4 ========================================= -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1 dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV 3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds 8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7 ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV 7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht 7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+ m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G +TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT kcpG2om3PVODLAgfi49T3f+sHw== -----END CERTIFICATE----- Microsoft ECC Root Certificate Authority 2017 ============================================= -----BEGIN CERTIFICATE----- MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM +Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= -----END CERTIFICATE----- Microsoft RSA Root Certificate Authority 2017 ============================================= -----BEGIN CERTIFICATE----- MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml 7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ 0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og 6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk +ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex /2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE 7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D 5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E -----END CERTIFICATE----- e-Szigno Root CA 2017 ===================== -----BEGIN CERTIFICATE----- MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO svxyqltZ+efcMQ== -----END CERTIFICATE----- certSIGN Root CA G2 =================== -----BEGIN CERTIFICATE----- MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf 95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB /AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N 0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= -----END CERTIFICATE----- Trustwave Global Certification Authority ======================================== -----BEGIN CERTIFICATE----- MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTAeFw0xNzA4MjMxOTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJV UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALldUShLPDeS0YLOvR29 zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0XznswuvCAAJWX/NKSqIk4cXGIDtiLK0thAf LdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4Bq stTnoApTAbqOl5F2brz81Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9o WN0EACyW80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotPJqX+ OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1lRtzuzWniTY+HKE40 Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfwhI0Vcnyh78zyiGG69Gm7DIwLdVcE uE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm +9jaJXLE9gCxInm943xZYkqcBW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqj ifLJS3tBEW1ntwiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1UdDwEB/wQEAwIB BjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W0OhUKDtkLSGm+J1WE2pIPU/H PinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfeuyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0H ZJDmHvUqoai7PF35owgLEQzxPy0QlG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla 4gt5kNdXElE1GYhBaCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5R vbbEsLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPTMaCm/zjd zyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qequ5AvzSxnI9O4fKSTx+O 856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxhVicGaeVyQYHTtgGJoC86cnn+OjC/QezH Yj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu 3R3y4G5OBVixwJAWKqQ9EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP 29FpHOTKyeC2nOnOcXHebD8WpHk= -----END CERTIFICATE----- Trustwave Global ECC P256 Certification Authority ================================================= -----BEGIN CERTIFICATE----- MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1 NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj 43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt 0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 -----END CERTIFICATE----- Trustwave Global ECC P384 Certification Authority ================================================= -----BEGIN CERTIFICATE----- MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4 NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr /TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw== -----END CERTIFICATE----- NAVER Global Root Certification Authority ========================================= -----BEGIN CERTIFICATE----- MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4 NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW +j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7 XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2 aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4 Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK 21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg kpzNNIaRkPpkUZ3+/uul9XXeifdy -----END CERTIFICATE----- AC RAIZ FNMT-RCM SERVIDORES SEGUROS =================================== -----BEGIN CERTIFICATE----- MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4 MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2 LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c= -----END CERTIFICATE----- GlobalSign Root R46 =================== -----BEGIN CERTIFICATE----- MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/ r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje 2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4 12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9 vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92 CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7 DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3 QEUxeCp6 -----END CERTIFICATE----- GlobalSign Root E46 =================== -----BEGIN CERTIFICATE----- MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+ CAezNIm8BZ/3Hobui3A= -----END CERTIFICATE----- GLOBALTRUST 2020 ================ -----BEGIN CERTIFICATE----- MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw 4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9 iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS 8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2 HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918 oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== -----END CERTIFICATE----- ANF Secure Server Root CA ========================= -----BEGIN CERTIFICATE----- MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNVBAUTCUc2MzI4 NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lv bjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNVBAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3Qg Q0EwHhcNMTkwOTA0MTAwMDM4WhcNMzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEw MQswCQYDVQQGEwJFUzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQw EgYDVQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQTCC AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCjcqQZAZ2cC4Ffc0m6p6zz BE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9qyGFOtibBTI3/TO80sh9l2Ll49a2pcbnv T1gdpd50IJeh7WhM3pIXS7yr/2WanvtH2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcv B2VSAKduyK9o7PQUlrZXH1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXse zx76W0OLzc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyRp1RM VwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQzW7i1o0TJrH93PB0j 7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/SiOL9V8BY9KHcyi1Swr1+KuCLH5z JTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJnLNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe 8TZBAQIvfXOn3kLMTOmJDVb3n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVO Hj1tyRRM4y5Bu8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAOBgNVHQ8BAf8E BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEATh65isagmD9uw2nAalxJ UqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzx j6ptBZNscsdW699QIyjlRRA96Gejrw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDt dD+4E5UGUcjohybKpFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM 5gf0vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjqOknkJjCb 5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ/zo1PqVUSlJZS2Db7v54 EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ92zg/LFis6ELhDtjTO0wugumDLmsx2d1H hk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGy g77FGr8H6lnco4g175x2MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3 r5+qPeoott7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= -----END CERTIFICATE----- Certum EC-384 CA ================ -----BEGIN CERTIFICATE----- MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2 MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0 QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= -----END CERTIFICATE----- Certum Trusted Root CA ====================== -----BEGIN CERTIFICATE----- MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6MQswCQYDVQQG EwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0g Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0Ew HhcNMTgwMzE2MTIxMDEzWhcNNDMwMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMY QXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEB AQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZn0EGze2jusDbCSzBfN8p fktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/qp1x4EaTByIVcJdPTsuclzxFUl6s1wB52 HO8AU5853BSlLCIls3Jy/I2z5T4IHhQqNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2 fJmItdUDmj0VDT06qKhF8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGt g/BKEiJ3HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGamqi4 NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi7VdNIuJGmj8PkTQk fVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSFytKAQd8FqKPVhJBPC/PgP5sZ0jeJ P/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0PqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSY njYJdmZm/Bo/6khUHL4wvYBQv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHK HRzQ+8S1h9E6Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAEii1QAL LtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4WxmB82M+w85bj/UvXgF2Ez8s ALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvozMrnadyHncI013nR03e4qllY/p0m+jiGPp2K h2RX5Rc64vmNueMzeMGQ2Ljdt4NR5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8 CYyqOhNf6DR5UMEQGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA 4kZf5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq0Uc9Nneo WWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7DP78v3DSk+yshzWePS/Tj 6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTMqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmT OPQD8rv7gmsHINFSH5pkAnuYZttcTVoP0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZck bxJF0WddCajJFdr60qZfE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb -----END CERTIFICATE----- TunTrust Root CA ================ -----BEGIN CERTIFICATE----- MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQELBQAwYTELMAkG A1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUgQ2VydGlmaWNhdGlvbiBFbGVj dHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJvb3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQw NDI2MDg1NzU2WjBhMQswCQYDVQQGEwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBD ZXJ0aWZpY2F0aW9uIEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZn56eY+hz 2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd2JQDoOw05TDENX37Jk0b bjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgFVwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7 NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZGoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAd gjH8KcwAWJeRTIAAHDOFli/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViW VSHbhlnUr8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2eY8f Tpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIbMlEsPvLfe/ZdeikZ juXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISgjwBUFfyRbVinljvrS5YnzWuioYas DXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwS VXAkPcvCFDVDXSdOvsC9qnyW5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI 04Y+oXNZtPdEITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+zxiD2BkewhpMl 0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYuQEkHDVneixCwSQXi/5E/S7fd Ao74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRY YdZ2vyJ/0Adqp2RT8JeNnYA/u8EH22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJp adbGNjHh/PqAulxPxOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65x xBzndFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5Xc0yGYuP jCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7bnV2UqL1g52KAdoGDDIzM MEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQCvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9z ZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZHu/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3r AZ3r2OvEhJn7wAzMMujjd9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= -----END CERTIFICATE----- HARICA TLS RSA Root CA 2021 =========================== -----BEGIN CERTIFICATE----- MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K 5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR 0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5 vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0 qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6 Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/ PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn kf3/W9b3raYvAwtt41dU63ZTGI0RmLo= -----END CERTIFICATE----- HARICA TLS ECC Root CA 2021 =========================== -----BEGIN CERTIFICATE----- MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW 0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL 4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH 9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE ZycPvEJdvSRUDewdcAZfpLz6IHxV -----END CERTIFICATE----- vTrus ECC Root CA ================= -----BEGIN CERTIFICATE----- MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL YgmRWAD5Tfs0aNoJrSEGGJTO -----END CERTIFICATE----- vTrus Root CA ============= -----BEGIN CERTIFICATE----- MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70 kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2 AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu /9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu 1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO 9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4 8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4 sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H l3s= -----END CERTIFICATE----- ISRG Root X2 ============ -----BEGIN CERTIFICATE----- MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5 U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn -----END CERTIFICATE----- HiPKI Root CA - G1 ================== -----BEGIN CERTIFICATE----- MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0 o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj 1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4 9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/ Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF 8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi 7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv 5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/ yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== -----END CERTIFICATE----- GlobalSign ECC Root CA - R4 =========================== -----BEGIN CERTIFICATE----- MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm -----END CERTIFICATE----- GTS Root R1 =========== -----BEGIN CERTIFICATE----- MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0 xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk 9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+ 7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3 FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3 gm3c -----END CERTIFICATE----- GTS Root R2 =========== -----BEGIN CERTIFICATE----- MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS +LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel /FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5 9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M 7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8 0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW HYbL -----END CERTIFICATE----- GTS Root R3 =========== -----BEGIN CERTIFICATE----- MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout 736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV 11RZt+cRLInUue4X -----END CERTIFICATE----- GTS Root R4 =========== -----BEGIN CERTIFICATE----- MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1 PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh 4rsUecrNIdSUtUlD -----END CERTIFICATE----- Telia Root CA v2 ================ -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2 MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7 6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q 9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW 5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4 M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ 8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5 tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15 h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70 sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9 xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc= -----END CERTIFICATE----- D-TRUST BR Root CA 1 2020 ========================= -----BEGIN CERTIFICATE----- MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7 dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87 -----END CERTIFICATE----- D-TRUST EV Root CA 1 2020 ========================= -----BEGIN CERTIFICATE----- MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8 ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW -----END CERTIFICATE----- DigiCert TLS ECC P384 Root G5 ============================= -----BEGIN CERTIFICATE----- MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4 NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB /wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA== -----END CERTIFICATE----- DigiCert TLS RSA4096 Root G5 ============================ -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0 MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2 IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8 7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/ MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/ u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh 47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP bEtoL8pU9ozaMv7Da4M/OMZ+ -----END CERTIFICATE----- Certainly Root R1 ================= -----BEGIN CERTIFICATE----- MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O 5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl 8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1 VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d 8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+ gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7 fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8= -----END CERTIFICATE----- Certainly Root E1 ================= -----BEGIN CERTIFICATE----- MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0 MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4 fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9 YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8 rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR -----END CERTIFICATE----- Security Communication RootCA3 ============================== -----BEGIN CERTIFICATE----- MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNVBAYTAkpQMSUw IwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScwJQYDVQQDEx5TZWN1cml0eSBD b21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQsw CQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UE AxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4rCmDvu20r hvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzAlrenfna84xtSGc4RHwsE NPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MGTfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2 /D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF79+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGm npjKIG58u4iFW/vAEGK78vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtY XLVqAvO4g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3weGVPK p7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst+3A7caoreyYn8xrC 3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M0V9hvqG8OmpI6iZVIhZdXw3/JzOf GAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0Vcw CBEF/VfR2ccCAwEAAaNCMEAwHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB /wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PAFNr0Y/Dq9HHu Tofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd9XbXv8S2gVj/yP9kaWJ5rW4O H3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQIUYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASx YfQAW0q3nHE3GYV5v4GwxxMOdnE+OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZ XSEIx2C/pHF7uNkegr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml +LLfiAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUVnuiZIesn KwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD2NCcnWXL0CsnMQMeNuE9 dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm 6Vwdp6POXiUyK+OVrCoHzrQoeIY8LaadTdJ0MN1kURXbg4NR16/9M51NZg== -----END CERTIFICATE----- Security Communication ECC RootCA1 ================================== -----BEGIN CERTIFICATE----- MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo 5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e N9k= -----END CERTIFICATE----- BJCA Global Root CA1 ==================== -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8 60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW 4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx 4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps 3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI= -----END CERTIFICATE----- BJCA Global Root CA2 ==================== -----BEGIN CERTIFICATE----- MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK /eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI 1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8 W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== -----END CERTIFICATE----- Sectigo Public Server Authentication Root E46 ============================================= -----BEGIN CERTIFICATE----- MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQswCQYDVQQGEwJH QjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBTZXJ2 ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5 WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0 aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUr gQQAIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccCWvkEN/U0 NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+6xnOQ6OjQjBAMB0GA1Ud DgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAKBggqhkjOPQQDAwNnADBkAjAn7qRaqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RH lAFWovgzJQxC36oCMB3q4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21U SAGKcw== -----END CERTIFICATE----- Sectigo Public Server Authentication Root R46 ============================================= -----BEGIN CERTIFICATE----- MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQG EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1 OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3 DQEBAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDaef0rty2k 1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnzSDBh+oF8HqcIStw+Kxwf GExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xfiOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMP FF1bFOdLvt30yNoDN9HWOaEhUTCDsG3XME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vu ZDCQOc2TZYEhMbUjUDM3IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5Qaz Yw6A3OASVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgESJ/A wSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu+Zd4KKTIRJLpfSYF plhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt8uaZFURww3y8nDnAtOFr94MlI1fZ EoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+LHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW 6aWWrL3DkJiy4Pmi1KZHQ3xtzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWI IUkwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQYKlJfp/imTYp E0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52gDY9hAaLMyZlbcp+nv4fjFg4 exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZAFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M 0ejf5lG5Nkc/kLnHvALcWxxPDkjBJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI 84HxZmduTILA7rpXDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9m pFuiTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5dHn5Hrwd Vw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65LvKRRFHQV80MNNVIIb/b E/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmm J1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAYQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL -----END CERTIFICATE----- SSL.com TLS RSA Root CA 2022 ============================ -----BEGIN CERTIFICATE----- MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQG EwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBSU0Eg Um9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloXDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMC VVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJv b3QgQ0EgMjAyMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u 9nTPL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OYt6/wNr/y 7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0insS657Lb85/bRi3pZ7Qcac oOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3PnxEX4MN8/HdIGkWCVDi1FW24IBydm5M R7d1VVm0U3TZlMZBrViKMWYPHqIbKUBOL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDG D6C1vBdOSHtRwvzpXGk3R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEW TO6Af77wdr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS+YCk 8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYSd66UNHsef8JmAOSq g+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoGAtUjHBPW6dvbxrB6y3snm/vg1UYk 7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2fgTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1Ud EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsu N+7jhHonLs0ZNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsMQtfhWsSWTVTN j8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvfR4iyrT7gJ4eLSYwfqUdYe5by iB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjU o3KUQyxi4U5cMj29TH0ZR6LDSeeWP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqo ENjwuSfr98t67wVylrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7Egkaib MOlqbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2wAgDHbICi vRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3qr5nsLFR+jM4uElZI7xc7 P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sjiMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB0 9+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= -----END CERTIFICATE----- SSL.com TLS ECC Root CA 2022 ============================ -----BEGIN CERTIFICATE----- MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV UzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBFQ0MgUm9v dCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMx GDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3Qg Q0EgMjAyMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWy JGYmacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFNSeR7T5v1 5wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSJjy+j6CugFFR7 81a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NWuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGG MAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w 7deedWo1dlJF4AIxAMeNb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5 Zn6g6g== -----END CERTIFICATE----- Atos TrustedRoot Root CA ECC TLS 2021 ===================================== -----BEGIN CERTIFICATE----- MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4wLAYDVQQDDCVB dG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQswCQYD VQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3Mg VHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYT AkRFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6K DP/XtXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4AjJn8ZQS b+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2KCXWfeBmmnoJsmo7jjPX NtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwW5kp85wxtolrbNa9d+F851F+ uDrNozZffPc8dz7kUK2o59JZDCaOMDtuCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGY a3cpetskz2VAv9LcjBHo9H1/IISpQuQo -----END CERTIFICATE----- Atos TrustedRoot Root CA RSA TLS 2021 ===================================== -----BEGIN CERTIFICATE----- MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBMMS4wLAYDVQQD DCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQsw CQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0 b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNV BAYTAkRFMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BB l01Z4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYvYe+W/CBG vevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZkmGbzSoXfduP9LVq6hdK ZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDsGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt 0xU6kGpn8bRrZtkh68rZYnxGEFzedUlnnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVK PNe0OwANwI8f4UDErmwh3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMY sluMWuPD0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzygeBY Br3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8ANSbhqRAvNncTFd+ rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezBc6eUWsuSZIKmAMFwoW4sKeFYV+xa fJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lIpw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUdEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0G CSqGSIb3DQEBDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS 4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPso0UvFJ/1TCpl Q3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJqM7F78PRreBrAwA0JrRUITWX AdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuywxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9G slA9hGCZcbUztVdF5kJHdWoOsAgMrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2Vkt afcxBPTy+av5EzH4AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9q TFsR0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuYo7Ey7Nmj 1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5dDTedk+SKlOxJTnbPP/l PqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W HYMfRsCbvUOZ58SWLs5fyQ== -----END CERTIFICATE----- TrustAsia Global Root CA G3 =========================== -----BEGIN CERTIFICATE----- MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEMBQAwWjELMAkG A1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMM G1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAeFw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEw MTlaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMu MSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNST1QY4Sxz lZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqKAtCWHwDNBSHvBm3dIZwZ Q0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/V P68czH5GX6zfZBCK70bwkPAPLfSIC7Epqq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1Ag dB4SQXMeJNnKziyhWTXAyB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm 9WAPzJMshH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gXzhqc D0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAvkV34PmVACxmZySYg WmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msTf9FkPz2ccEblooV7WIQn3MSAPmea mseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jAuPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCF TIcQcf+eQxuulXUtgQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj 7zjKsK5Xf/IhMBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4wM8zAQLpw6o1 D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2XFNFV1pF1AWZLy4jVe5jaN/T G3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNj duMNhXJEIlU/HHzp/LgV6FL6qj6jITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstl cHboCoWASzY9M/eVVHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys +TIxxHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1onAX1daBli 2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d7XB4tmBZrOFdRWOPyN9y aFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2NtjjgKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsAS ZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFR JQJ6+N1rZdVtTTDIZbpoFGWsJwt0ivKH -----END CERTIFICATE----- TrustAsia Global Root CA G4 =========================== -----BEGIN CERTIFICATE----- MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMwWjELMAkGA1UE BhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMMG1Ry dXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0yMTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJa MFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQw IgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi AATxs8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbwLxYI+hW8 m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJijYzBhMA8GA1UdEwEB/wQF MAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mDpm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/ pDHel4NZg6ZvccveMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AA bbd+NvBNEU/zy4k6LHiRUKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xk dUfFVZDj/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== -----END CERTIFICATE----- CommScope Public Trust ECC Root-01 ================================== -----BEGIN CERTIFICATE----- MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMwTjELMAkGA1UE BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz dCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNaFw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYT AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg RUNDIFJvb3QtMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLx eP0CflfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJEhRGnSjot 6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G A1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggqhkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2 Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liW pDVfG2XqYZpwI7UNo5uSUm9poIyNStDuiw7LR47QjRE= -----END CERTIFICATE----- CommScope Public Trust ECC Root-02 ================================== -----BEGIN CERTIFICATE----- MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMwTjELMAkGA1UE BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz dCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRaFw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYT AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg RUNDIFJvb3QtMDIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/M MDALj2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmUv4RDsNuE SgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G A1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggqhkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9 Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/nich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs7 3u1Z/GtMMH9ZzkXpc2AVmkzw5l4lIhVtwodZ0LKOag== -----END CERTIFICATE----- CommScope Public Trust RSA Root-01 ================================== -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQELBQAwTjELMAkG A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU cnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNV BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1 c3QgUlNBIFJvb3QtMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45Ft nYSkYZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslhsuitQDy6 uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0alDrJLpA6lfO741GIDuZNq ihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3OjWiE260f6GBfZumbCk6SP/F2krfxQapWs vCQz0b2If4b19bJzKo98rwjyGpg/qYFlP8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/c Zip8UlF1y5mO6D1cv547KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTif BSeolz7pUcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/kQO9 lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JOHg9O5j9ZpSPcPYeo KFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkBEa801M/XrmLTBQe0MXXgDW1XT2mH +VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6UCBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm4 5P3luG0wDQYJKoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6 NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQnmhUQo8mUuJM 3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+QgvfKNmwrZggvkN80V4aCRck jXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2vtrV0KnahP/t1MJ+UXjulYPPLXAziDslg+Mkf Foom3ecnf+slpoq9uC02EJqxWE2aaE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/W NyVntHKLr4W96ioDj8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+ o/E4Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0wlREQKC6/ oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHnYfkUyq+Dj7+vsQpZXdxc 1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVocicCMb3SgazNNtQEo/a2tiRc7ppqEvOuM 6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw -----END CERTIFICATE----- CommScope Public Trust RSA Root-02 ================================== -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQELBQAwTjELMAkG A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU cnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNV BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1 c3QgUlNBIFJvb3QtMDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3V rCLENQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0kyI9p+Kx 7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1CrWDaSWqVcN3SAOLMV2MC e5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxzhkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2W Wy09X6GDRl224yW4fKcZgBzqZUPckXk2LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rp M9kzXzehxfCrPfp4sOcsn/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIf hs1w/tkuFT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5kQMr eyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3wNemKfrb3vOTlycE VS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6vwQcQeKwRoi9C8DfF8rhW3Q5iLc4t Vn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7Gx cJXvYXowDQYJKoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3+VGXu6TwYofF 1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbymeAPnCKfWxkxlSaRosTKCL4BWa MS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3NyqpgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xd gSGn2rtO/+YHqP65DSdsu3BaVXoT6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2O HG1QAk8mGEPej1WFsQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+Nm YWvtPjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2dlklyALKr dVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670v64fG9PiO/yzcnMcmyiQ iRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17Org3bhzjlP1v9mxnhMUF6cKojawHhRUzN lM47ni3niAIi9G7oyOzWPPO5std3eqx7 -----END CERTIFICATE----- ================================================ FILE: packages/security/openssl/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="openssl" PKG_VERSION="3.0.12" PKG_SHA256="f93c9e8edde5e9166119de31755fc87b4aa34863662f67ddfcba14d0b6b69b61" PKG_LICENSE="Apache-2.0" PKG_SITE="https://www.openssl.org" PKG_URL="https://www.openssl.org/source/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="The Open Source toolkit for Secure Sockets Layer and Transport Layer Security" PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="+local-cc" PKG_CONFIGURE_OPTS_SHARED="--libdir=lib \ shared \ threads \ no-ec2m \ no-md2 \ no-rc5 \ no-rfc3779 \ no-sctp \ no-ssl-trace \ no-ssl3 \ no-unit-test \ no-weak-ssl-ciphers \ no-zlib \ no-zlib-dynamic \ no-static-engine" PKG_CONFIGURE_OPTS_HOST="--prefix=${TOOLCHAIN} \ --openssldir=${TOOLCHAIN}/etc/ssl" PKG_CONFIGURE_OPTS_TARGET="--prefix=/usr \ --openssldir=/etc/ssl" post_unpack() { find ${PKG_BUILD}/apps -type f | xargs -n 1 -t sed 's|./demoCA|/etc/ssl|' -i } pre_configure_host() { mkdir -p ${PKG_BUILD}/.${HOST_NAME} cp -a ${PKG_BUILD}/* ${PKG_BUILD}/.${HOST_NAME}/ } configure_host() { cd ${PKG_BUILD}/.${HOST_NAME} ./Configure ${PKG_CONFIGURE_OPTS_HOST} ${PKG_CONFIGURE_OPTS_SHARED} linux-${MACHINE_HARDWARE_NAME} ${CFLAGS} ${LDFLAGS} } makeinstall_host() { make install_sw } pre_configure_target() { mkdir -p ${PKG_BUILD}/.${TARGET_NAME} cp -a ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME}/ case ${TARGET_ARCH} in x86_64) OPENSSL_TARGET=linux-x86_64 PLATFORM_FLAGS=enable-ec_nistp_64_gcc_128 ;; arm) OPENSSL_TARGET=linux-armv4 ;; aarch64) OPENSSL_TARGET=linux-aarch64 ;; esac } configure_target() { cd ${PKG_BUILD}/.${TARGET_NAME} ./Configure ${PKG_CONFIGURE_OPTS_TARGET} ${PKG_CONFIGURE_OPTS_SHARED} ${PLATFORM_FLAGS} ${OPENSSL_TARGET} ${CFLAGS} ${LDFLAGS} } makeinstall_target() { make DESTDIR=${INSTALL} install_sw make DESTDIR=${SYSROOT_PREFIX} install_sw } post_makeinstall_target() { rm -rf ${INSTALL}/etc/ssl/misc rm -rf ${INSTALL}/usr/bin/c_rehash debug_strip ${INSTALL}/usr/bin/openssl # cert from https://curl.haxx.se/docs/caextract.html mkdir -p ${INSTALL}/etc/ssl cp ${PKG_DIR}/cert/cacert.pem ${INSTALL}/etc/ssl/cacert.pem.system # give user the chance to include their own CA mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/openssl-config ${INSTALL}/usr/bin ln -sf /run/libreelec/cacert.pem ${INSTALL}/etc/ssl/cacert.pem ln -sf /run/libreelec/cacert.pem ${INSTALL}/etc/ssl/cert.pem # backwards comatibility mkdir -p ${INSTALL}/etc/pki/tls ln -sf /run/libreelec/cacert.pem ${INSTALL}/etc/pki/tls/cacert.pem mkdir -p ${INSTALL}/etc/pki/tls/certs ln -sf /run/libreelec/cacert.pem ${INSTALL}/etc/pki/tls/certs/ca-bundle.crt mkdir -p ${INSTALL}/usr/lib/ssl ln -sf /run/libreelec/cacert.pem ${INSTALL}/usr/lib/ssl/cert.pem } post_install() { enable_service openssl-config.service } ================================================ FILE: packages/security/openssl/scripts/openssl-config ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) cp /etc/ssl/cacert.pem.system /run/libreelec/cacert.pem [ -f /storage/.config/cacert.pem ] && cat /storage/.config/cacert.pem >>/run/libreelec/cacert.pem exit 0 ================================================ FILE: packages/security/openssl/system.d/openssl-config.service ================================================ [Unit] Description=OpenSSL configuration service DefaultDependencies=no After=systemd-tmpfiles-setup.service [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/openssl-config [Install] WantedBy=sysinit.target ================================================ FILE: packages/sx05re/Amlogic/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="Amlogic" PKG_VERSION="" PKG_LICENSE="various" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain emuelec" PKG_SECTION="virtual" ================================================ FILE: packages/sx05re/Amlogic-ng/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="Amlogic-ng" PKG_VERSION="" PKG_LICENSE="various" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain emuelec" PKG_SECTION="virtual" ================================================ FILE: packages/sx05re/Amlogic-no/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="Amlogic-no" PKG_VERSION="" PKG_LICENSE="various" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain emuelec" PKG_SECTION="virtual" ================================================ FILE: packages/sx05re/emuelec/bin/batocera/batocera-bluetooth ================================================ #!/bin/bash . /etc/profile ACTION=$1 shift do_help() { echo "${1} list" >&2 echo "${1} trust" >&2 echo "${1} remove " >&2 } do_list() { find /storage/.cache/bluetooth -type f -name info | while read FILE do if grep -qE '^Trusted=true$' "${FILE}" then DEVNAME=$(grep -E '^Name=' "${FILE}" | sed -e s+"^Name="++) DEVADDR=$(basename $(dirname "${FILE}")) echo "${DEVADDR} ${DEVNAME}" fi done } do_remove() { DEV="${1}" # output is never nice if ! (echo "untrust ${DEV}" ; echo "remove ${DEV}") | /usr/bin/bluetoothctl >> /emuelec/logs/bluetooth.log 2>&1 then return 1 fi return 0 } do_trust() { local LEGACY=$(get_ee_setting ee_bluetooth_legacy.enabled) if [[ "$LEGACY" == "1" ]]; then emuelec-bluetooth-legacy else emuelec-bluetooth fi } case "${ACTION}" in "list") do_list ;; "trust") do_trust ;; "remove") do_remove "${1}" || exit 1 ;; *) do_help "${0}" exit 1 esac exit 0 ================================================ FILE: packages/sx05re/emuelec/bin/batocera/batocera-bluetooth-agent ================================================ #!/usr/bin/python from __future__ import absolute_import, print_function from optparse import OptionParser, make_option import dbus import dbus.service import dbus.mainloop.glib from bluetool import bluezutils import time import os import logging import signal import pgi pgi.install_as_gi() from gi.repository import GLib AGENT_INTERFACE = 'org.bluez.Agent1' gadapter = None gdiscovering = False gdevices = {} g_devices_seen = {} logging.basicConfig(filename='/emuelec/logs/bluetooth-agent.log', level=logging.DEBUG, format='%(asctime)s %(message)s') def bool2str(val, valiftrue, valiffalse): if val: return valiftrue else: return valiffalse def logging_status(msg): with open("/var/run/bt_status", "w") as file: file.write(msg + "\n") def connect_device(path, address, properties, forceConnect, typeInput, typeAudio): global gdiscovering devName = "" trusted = False connected = False # avoid devices without interesting information if "Trusted" not in properties: return if "Connected" not in properties: return rproperties = {} # Get the adapter name and bt mac for key, value in properties.items(): if type(value) is dbus.String: value = value.encode('ascii', 'replace') rproperties[key] = value trusted = rproperties["Trusted"] paired = rproperties["Paired"] devName = getDevName(rproperties) shortDevName = getShortDevName(rproperties) connected = rproperties["Connected"] # skip non input devices if "Icon" not in properties: logging.info("Skipping device {} (no type)".format(getDevName(rproperties))); return if not ( (typeInput and properties["Icon"].startswith("input")) or (typeAudio and properties["Icon"].startswith("audio-card")) ): logging.info("Skipping device {} because of type {}".format(getDevName(rproperties), properties["Icon"])); return blacklistAddr, blacklistName = getBlacklistAddrAndName(properties) # add device to the seen list if blacklistAddr not in g_devices_seen: g_devices_seen[blacklistAddr] = { "name": blacklistName } updateKnownDevicesList(g_devices_seen) # skip blacklisted devices if blacklistAddr is not None and isDeviceBlacklisted(blacklistAddr): logging.info("Skipping blacklisted device {}".format(blacklistName)) return logging.info("event for " + devName + "(paired=" + bool2str(paired, "paired", "not paired") + ", trusted=" + bool2str(trusted, "trusted", "untrusted") + ", connected=" + bool2str(connected, "connected", "disconnected") + ")") # skipping connected devices if paired and trusted and connected: logging.info("Skipping already connected device {}".format(getDevName(rproperties))); return if not paired: if connected == False and gdiscovering: doParing(address, devName, shortDevName) return # now it is paired if not trusted and (gdiscovering or forceConnect): logging.info("Trusting (" + devName + ")") logging_status("Trusting " + shortDevName + "...") bluezProps = dbus.Interface(bus.get_object("org.bluez", path), "org.freedesktop.DBus.Properties") bluezProps.Set("org.bluez.Device1", "Trusted", True) # now it is paired and trusted # Connect if Trusted and paired if not connected or forceConnect: doConnect(address, devName, shortDevName) def doParing(address, devName, shortDevName): logging.info("Pairing... (" + devName + ")") logging_status("Pairing " + shortDevName + "...") device = bluezutils.find_device(address) try: device.Pair() except Exception as e: logging.info("Pairing failed (" + devName + ")") logging_status("Pairing failed (" + shortDevName + ")") def doConnect(address, devName, shortDevName): global gadapter global gdiscovering try: # discovery stopped during connection to help some devices if gdiscovering: logging.info("Stop discovery") gadapter.StopDiscovery() device = bluezutils.find_device(address) ntry=5 while ntry > 0: ntry = ntry -1 try: logging.info("Connecting... (" + devName + ")") logging_status("Connecting " + shortDevName + "...") device.Connect() logging.info("Connected successfully (" + devName + ")") logging_status("Connected successfully (" + shortDevName + ")") if gdiscovering: logging.info("Start discovery") gadapter.StartDiscovery() return except dbus.exceptions.DBusException as err: logging.info("dbus: " + err.get_dbus_message()) time.sleep(1) except Exception as err: logging.info("Connection failed (" + devName + ")") time.sleep(1) logging.info("Connection failed. Give up. (" + devName + ")") logging_status("Connection failed. Give up. (" + shortDevName + ")") if gdiscovering: logging.info("Start discovery") gadapter.StartDiscovery() except Exception as e: if gdiscovering: logging.info("Start discovery") gadapter.StartDiscovery() # don't raise, while startdiscovery doesn't like it #raise e def getDevName(properties): #devName = properties["Name"] + " (" + properties["Address"] + ", " + properties["Icon"] + ")" #devStatus = "Trusted=" + str(properties["Trusted"]) + ", paired=" + str(properties["Paired"]) + ", connected=" + str(properties["Connected"]), ", blocked=" + str(properties["Blocked"]) #devTech = "legacyPairing: " + str(properties["LegacyPairing"]) # + ", RSSI: " + properties["RSSI"] if "Name" in properties and "Address" in properties and "Icon" in properties: return str(properties["Name"]) + " (" + str(properties["Address"]) + ", " + str(properties["Icon"]) + ")" if "Name" in properties and "Address" in properties: return str(properties["Name"]) + " (" + str(properties["Address"]) + ")" if "Name" in properties and "Icon" in properties: return str(properties["Name"]) + " (" + str(properties["Icon"]) + ")" if "Name" in properties: return str(properties["Name"]) if "Address" in properties and "Icon" in properties: return str(properties["Address"]) + " (" + str(properties["Icon"]) + ")" if "Address" in properties: return str(properties["Address"]) if "Icon" in properties: return str(properties["Icon"]) return "unknown" def updateKnownDevicesList(g_devices_seen): f = open("/var/run/bluetooth_seen", "w") for key in g_devices_seen: f.write("{} {}\n".format(key, g_devices_seen[key]["name"])) f.close() def isDeviceBlacklisted(blacklistAddr): datafile = "/var/lib/bluetooth/bluetooth_blacklisted" # reread the file each time in case somebody changed it if not os.path.isfile(datafile): return False with open(datafile) as file: lines = file.readlines() for line in lines: if line[0:len(blacklistAddr)] == blacklistAddr: return True return False def getBlacklistAddrAndName(properties): if "Address" not in properties: return None address = str(properties["Address"]) name = "" if "Name" in properties: name = str(properties["Name"]) elif "Icon" in properties: name = str(properties["Icon"]) else: name = "unknown" return address, name def getShortDevName(properties): if "Name" in properties: return str(properties["Name"]) if "Address" in properties: return str(properties["Address"]) if "Icon" in properties: return str(properties["Icon"]) return "unknown" def getBluetoothWantedTypes(): if not os.path.isfile("/var/run/bt_types"): logging.info("no bt_types file") return True, True btype = "" with open("/var/run/bt_types", "r") as file: btype = file.read().strip() logging.info("bt_type: {}".format(btype)) if btype == "": return True, True if btype == "pad": return True, False if btype == "audio": return False, True return False, False def interfaces_added(path, interfaces): global gdevices if "org.bluez.Device1" not in interfaces: return if not interfaces["org.bluez.Device1"]: return properties = interfaces["org.bluez.Device1"] if path in gdevices: gdevices[path] = merge2dicts(gdevices[path], properties) else: gdevices[path] = properties if "Address" in gdevices[path]: typeInput, typeAudio = getBluetoothWantedTypes() connect_device(path, properties["Address"], gdevices[path], False, typeInput, typeAudio) def properties_changed(interface, changed, invalidated, path): global gdevices if interface != "org.bluez.Device1": return if path in gdevices: gdevices[path] = merge2dicts(gdevices[path], changed) else: gdevices[path] = changed #logging.info("Properties changed:") #logging.info(changed) #logging.info(invalidated) if "Paired" in changed and changed["Paired"] == True: # ok, do as in simple-agent, trust and connect typeInput, typeAudio = getBluetoothWantedTypes() connect_device(path, gdevices[path]["Address"], gdevices[path], True, typeInput, typeAudio) return # ok, it is now connected, what else ? if "Connected" in changed and changed["Connected"] == True: return if "Connected" in changed and changed["Connected"] == False: logging.info("Skipping (property Connected changed to False)"); return if "Address" in gdevices[path]: typeInput, typeAudio = getBluetoothWantedTypes() connect_device(path, gdevices[path]["Address"], gdevices[path], False, typeInput, typeAudio) def merge2dicts(d1, d2): res = d1.copy() res.update(d2) return res def user_signal_start_discovery(signum, frame): global gdiscovering global gadapter try: if gdiscovering == False: gdiscovering = True logging.info("Start discovery (signal)") gadapter.StartDiscovery() except: pass def user_signal_stop_discovery(signum, frame): global gdiscovering global gadapter try: if gdiscovering: gdiscovering = False logging.info("Stop discovery (signal)") gadapter.StopDiscovery() except: pass class Agent(dbus.service.Object): exit_on_release = True def set_exit_on_release(self, exit_on_release): self.exit_on_release = exit_on_release @dbus.service.method(AGENT_INTERFACE, in_signature="", out_signature="") def Release(self): logging.info("agent: Release") if self.exit_on_release: mainloop.quit() @dbus.service.method(AGENT_INTERFACE, in_signature="os", out_signature="") def AuthorizeService(self, device, uuid): logging.info("agent: AuthorizeService") return @dbus.service.method(AGENT_INTERFACE, in_signature="o", out_signature="s") def RequestPinCode(self, device): logging.info("RequestPinCode (%s)" % (device)) return "0000" @dbus.service.method(AGENT_INTERFACE, in_signature="o", out_signature="u") def RequestPasskey(self, device): logging.info("RequestPasskey (%s)" % (device)) return 0 @dbus.service.method(AGENT_INTERFACE, in_signature="ouq", out_signature="") def DisplayPasskey(self, device, passkey, entered): logging.info("agent: DisplayPasskey (%s, %06u entered %u)" % (device, passkey, entered)) @dbus.service.method(AGENT_INTERFACE, in_signature="os", out_signature="") def DisplayPinCode(self, device, pincode): logging.info("agent: DisplayPinCode (%s, %s)" % (device, pincode)) @dbus.service.method(AGENT_INTERFACE, in_signature="ou", out_signature="") def RequestConfirmation(self, device, passkey): logging.info("agent: RequestConfirmation") return @dbus.service.method(AGENT_INTERFACE, in_signature="o", out_signature="") def RequestAuthorization(self, device): logging.info("agent: RequestAuthorization") return @dbus.service.method(AGENT_INTERFACE, in_signature="", out_signature="") def Cancel(self): logging.info("agent: Cancel") def do_main_loop(dev_id): global gadapter # adapter try: adapter = bluezutils.find_adapter(dev_id) except: # try to find any adapter adapter = bluezutils.find_adapter(None) logging.info("adapter found") gadapter = adapter adapters = {} om = dbus.Interface(bus.get_object("org.bluez", "/"), "org.freedesktop.DBus.ObjectManager") objects = om.GetManagedObjects() for path, interfaces in objects.items(): if "org.bluez.Device1" in interfaces: gdevices[path] = interfaces["org.bluez.Device1"] if "org.bluez.Adapter1" in interfaces: adapters[path] = interfaces["org.bluez.Adapter1"] adapter_props = adapters[adapter.object_path] logging.info(adapter_props["Name"] + "(" + adapter_props["Address"] + "), powered=" + str(adapter_props["Powered"])) # power on adapter if needed if adapter_props["Powered"] == 0: try: logging.info("powering on adapter ("+ adapter_props["Address"] +")") adapterSetter = dbus.Interface(bus.get_object("org.bluez", adapter.object_path), "org.freedesktop.DBus.Properties") adapterSetter.Set("org.bluez.Adapter1", "Powered", True) except: pass # hum, not nice gdiscovering = False # events # use events while i manage to stop discovery only from the process having started it signal.signal(signal.SIGUSR1, user_signal_start_discovery) signal.signal(signal.SIGUSR2, user_signal_stop_discovery) mainloop = GLib.MainLoop() mainloop.run() if __name__ == '__main__': # options option_list = [ make_option("-i", "--device", action="store", type="string", dest="dev_id") ] parser = OptionParser(option_list=option_list) (options, args) = parser.parse_args() # initialize the seen devices file updateKnownDevicesList(g_devices_seen) # register dbus dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SystemBus() bus.add_signal_receiver(interfaces_added, dbus_interface = "org.freedesktop.DBus.ObjectManager", signal_name = "InterfacesAdded") bus.add_signal_receiver(properties_changed, dbus_interface = "org.freedesktop.DBus.Properties", signal_name = "PropertiesChanged", arg0 = "org.bluez.Device1", path_keyword = "path") # register the agent agentpath = "/emuelec/agent" obj = bus.get_object("org.bluez", "/org/bluez") manager = dbus.Interface(obj, "org.bluez.AgentManager1") manager.RegisterAgent(agentpath, "NoInputNoOutput") manager.RequestDefaultAgent(agentpath) agent = Agent(bus, agentpath) logging.info("agent registered") # run the agent, allows some tries while hardware can take time to initiate time.sleep(5) try: do_main_loop(options.dev_id) except Exception as e: logging.error("agent fails") logging.error(e, exc_info=True) raise logging.error("agent gave up") ================================================ FILE: packages/sx05re/emuelec/bin/batocera/batocera-brightness ================================================ #!/bin/bash if test ! -e /sys/class/backlight/backlight/brightness then echo "no brightness found" >&2 exit 1 fi setValue() { NEWVAL=$1 XMAX=$2 test "${NEWVAL}" -lt 0 && NEWVAL=0 test "${NEWVAL}" -gt "${XMAX}" && NEWVAL="${XMAX}" echo "${NEWVAL}" > /sys/class/backlight/backlight/brightness } # get if test $# = 0 then X=$(cat /sys/class/backlight/backlight/brightness) XMAX=$(cat /sys/class/backlight/backlight/max_brightness) echo $(expr "${X}" "*" "100" / "${XMAX}") exit 0 fi # set if test $# = 1 then XMAX=$(cat /sys/class/backlight/backlight/max_brightness) NEWVAL=$(expr "${1}" "*" "${XMAX}" / 100) setValue "${NEWVAL}" "${XMAX}" exit 0 fi # set + if test $# = 2 then X=$(cat /sys/class/backlight/backlight/brightness) XMAX=$(cat /sys/class/backlight/backlight/max_brightness) DELTA=$(expr "${2}" '*' ${XMAX} / 100) NEWVAL=$(expr "${X}" "${1}" "${DELTA}") setValue "${NEWVAL}" "${XMAX}" exit 0 fi # help echo "${0}" >&2 echo "${0} + 10" >&2 echo "${0} - 20" >&2 exit 1 ================================================ FILE: packages/sx05re/emuelec/bin/batocera/batocera-bt-list-devices ================================================ #!/usr/bin/python from __future__ import absolute_import, print_function, unicode_literals import dbus bus = dbus.SystemBus() manager = dbus.Interface(bus.get_object("org.bluez", "/"), "org.freedesktop.DBus.ObjectManager") def extract_objects(object_list): list = "" for object in object_list: val = str(object) list = list + val[val.rfind("/") + 1:] + " " return list def extract_uuids(uuid_list): list = "" for uuid in uuid_list: if (uuid.endswith("-0000-1000-8000-00805f9b34fb")): if (uuid.startswith("0000")): val = "0x" + uuid[4:8] else: val = "0x" + uuid[0:8] else: val = str(uuid) list = list + val + " " return list objects = manager.GetManagedObjects() all_devices = (str(path) for path, interfaces in objects.iteritems() if "org.bluez.Device1" in interfaces.keys()) for path, interfaces in objects.iteritems(): if "org.bluez.Adapter1" not in interfaces.keys(): continue print("[ " + path + " ]") properties = interfaces["org.bluez.Adapter1"] for key in properties.keys(): value = properties[key] if (key == "UUIDs"): list = extract_uuids(value) #print(" %s = %s" % (key, list)) else: if key not in ["Class", "Alias", "Modalias", "DiscoverableTimeout", "PairableTimeout", "Discoverable"]: print(" %s = %s" % (key, value)) device_list = [d for d in all_devices if d.startswith(path + "/")] for dev_path in device_list: print(" [ " + dev_path + " ]") dev = objects[dev_path] properties = dev["org.bluez.Device1"] for key in properties.keys(): if key not in ["UUIDs", "Class", "ServicesResolved", "Adapter"]: value = properties[key] if (key == "UUIDs"): list = extract_uuids(value) print(" %s = %s" % (key, list)) elif (key == "Class"): print(" %s = 0x%06x" % (key, value)) elif (key == "Vendor"): print(" %s = 0x%04x" % (key, value)) elif (key == "Product"): print(" %s = 0x%04x" % (key, value)) elif (key == "Version"): print(" %s = 0x%04x" % (key, value)) else: print(" %s = %s" % (key, value)) print("") ================================================ FILE: packages/sx05re/emuelec/bin/batocera/batocera-bt-test-device ================================================ #!/usr/bin/python from __future__ import absolute_import, print_function, unicode_literals from optparse import OptionParser, make_option import re import sys import dbus import dbus.mainloop.glib try: from gi.repository import GObject except ImportError: import gobject as GObject import bluezutils dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SystemBus() mainloop = GObject.MainLoop() option_list = [ make_option("-i", "--device", action="store", type="string", dest="dev_id"), ] parser = OptionParser(option_list=option_list) (options, args) = parser.parse_args() if (len(args) < 1): print("Usage: %s " % (sys.argv[0])) print("") print(" list") print(" create

") print(" remove ") print(" connect
[profile]") print(" disconnect
[profile]") print(" class
") print(" name
") print(" alias
[alias]") print(" trusted
[yes/no]") print(" blocked
[yes/no]") sys.exit(1) if (args[0] == "list"): adapter = bluezutils.find_adapter(options.dev_id) adapter_path = adapter.object_path om = dbus.Interface(bus.get_object("org.bluez", "/"), "org.freedesktop.DBus.ObjectManager") objects = om.GetManagedObjects() for path, interfaces in objects.iteritems(): if "org.bluez.Device1" not in interfaces: continue properties = interfaces["org.bluez.Device1"] if properties["Adapter"] != adapter_path: continue; print("%s %s" % (properties["Address"], properties["Alias"])) sys.exit(0) def create_device_reply(device): print("New device (%s)" % device) mainloop.quit() sys.exit(0) def create_device_error(error): print("Creating device failed: %s" % error) mainloop.quit() sys.exit(1) if (args[0] == "create"): if (len(args) < 2): print("Need address parameter") else: adapter = bluezutils.find_adapter(options.dev_id) adapter.CreateDevice(args[1], reply_handler=create_device_reply, error_handler=create_device_error) mainloop.run() if (args[0] == "remove"): if (len(args) < 2): print("Need address or object path parameter") else: managed_objects = bluezutils.get_managed_objects() adapter = bluezutils.find_adapter_in_objects(managed_objects, options.dev_id) try: dev = bluezutils.find_device_in_objects(managed_objects, args[1], options.dev_id) path = dev.object_path except: path = args[1] adapter.RemoveDevice(path) sys.exit(0) if (args[0] == "connect"): if (len(args) < 2): print("Need address parameter") else: device = bluezutils.find_device(args[1], options.dev_id) if (len(args) > 2): device.ConnectProfile(args[2]) else: device.Connect() sys.exit(0) if (args[0] == "disconnect"): if (len(args) < 2): print("Need address parameter") else: device = bluezutils.find_device(args[1], options.dev_id) if (len(args) > 2): device.DisconnectProfile(args[2]) else: device.Disconnect() sys.exit(0) if (args[0] == "class"): if (len(args) < 2): print("Need address parameter") else: device = bluezutils.find_device(args[1], options.dev_id) path = device.object_path props = dbus.Interface(bus.get_object("org.bluez", path), "org.freedesktop.DBus.Properties") cls = props.Get("org.bluez.Device1", "Class") print("0x%06x" % cls) sys.exit(0) if (args[0] == "name"): if (len(args) < 2): print("Need address parameter") else: device = bluezutils.find_device(args[1], options.dev_id) path = device.object_path props = dbus.Interface(bus.get_object("org.bluez", path), "org.freedesktop.DBus.Properties") name = props.Get("org.bluez.Device1", "Name") print(name) sys.exit(0) if (args[0] == "alias"): if (len(args) < 2): print("Need address parameter") else: device = bluezutils.find_device(args[1], options.dev_id) path = device.object_path props = dbus.Interface(bus.get_object("org.bluez", path), "org.freedesktop.DBus.Properties") if (len(args) < 3): alias = props.Get("org.bluez.Device1", "Alias") print(alias) else: props.Set("org.bluez.Device1", "Alias", args[2]) sys.exit(0) if (args[0] == "trusted"): if (len(args) < 2): print("Need address parameter") else: device = bluezutils.find_device(args[1], options.dev_id) path = device.object_path props = dbus.Interface(bus.get_object("org.bluez", path), "org.freedesktop.DBus.Properties") if (len(args) < 3): trusted = props.Get("org.bluez.Device1", "Trusted") print(trusted) else: if (args[2] == "yes"): value = dbus.Boolean(1) elif (args[2] == "no"): value = dbus.Boolean(0) else: value = dbus.Boolean(args[2]) props.Set("org.bluez.Device1", "Trusted", value) sys.exit(0) if (args[0] == "blocked"): if (len(args) < 2): print("Need address parameter") else: device = bluezutils.find_device(args[1], options.dev_id) path = device.object_path props = dbus.Interface(bus.get_object("org.bluez", path), "org.freedesktop.DBus.Properties") if (len(args) < 3): blocked = props.Get("org.bluez.Device1", "Blocked") print(blocked) else: if (args[2] == "yes"): value = dbus.Boolean(1) elif (args[2] == "no"): value = dbus.Boolean(0) else: value = dbus.Boolean(args[2]) props.Set("org.bluez.Device1", "Blocked", value) sys.exit(0) print("Unknown command") sys.exit(1) ================================================ FILE: packages/sx05re/emuelec/bin/batocera/batocera-btDaemon ================================================ #!/usr/bin/python from __future__ import absolute_import, print_function, unicode_literals from optparse import OptionParser, make_option import dbus import dbus.mainloop.glib try: from gi.repository import GObject except ImportError: import gobject as GObject import bluezutils compact = False devices = {} def connect_device(address, properties): # Get the adapter name and bt mac for key, value in properties.iteritems(): if type(value) is dbus.String: value = unicode(value).encode('ascii', 'replace') if (key == "Trusted"): trusted = value elif (key == "Connected"): connected = value # Get the device device = bluezutils.find_device(address) # Connect if Trusted if trusted and not connected: print("Connecting {} ...".format(address)) device.Connect() else: print("{} is either not trusted, either already connected".format(address)) def print_compact(address, properties): name = "" address = "" for key, value in properties.iteritems(): if type(value) is dbus.String: value = unicode(value).encode('ascii', 'replace') if (key == "Name"): name = value elif (key == "Address"): address = value if "Logged" in properties: flag = "*" else: flag = " " print("%s%s %s" % (flag, address, name)) properties["Logged"] = True def print_normal(address, properties): print("[ " + address + " ]") for key in properties.keys(): value = properties[key] if type(value) is dbus.String: value = unicode(value).encode('ascii', 'replace') if (key == "Class"): print(" %s = 0x%06x" % (key, value)) else: print(" %s = %s" % (key, value)) print() properties["Logged"] = True def skip_dev(old_dev, new_dev): if not "Logged" in old_dev: return False if "Name" in old_dev: return True if not "Name" in new_dev: return True return False def interfaces_added(path, interfaces): properties = interfaces["org.bluez.Device1"] if not properties: return if path in devices: dev = devices[path] if compact and skip_dev(dev, properties): return devices[path] = dict(devices[path].items() + properties.items()) else: devices[path] = properties if "Address" in devices[path]: address = properties["Address"] else: address = "" print("Interface added {}".format(address)) if compact: print_compact(address, devices[path]) else: print_normal(address, devices[path]) connect_device(address, devices[path]) def properties_changed(interface, changed, invalidated, path): if interface != "org.bluez.Device1": return if path in devices: dev = devices[path] if compact and skip_dev(dev, changed): return devices[path] = dict(devices[path].items() + changed.items()) else: devices[path] = changed if "Address" in devices[path]: address = devices[path]["Address"] else: address = "" print("Properties changed {}".format(address)) if compact: print_compact(address, devices[path]) else: print_normal(address, devices[path]) connect_device(address, devices[path]) if __name__ == '__main__': dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SystemBus() option_list = [ make_option("-i", "--device", action="store", type="string", dest="dev_id"), make_option("-c", "--compact", action="store_true", dest="compact"), ] parser = OptionParser(option_list=option_list) (options, args) = parser.parse_args() adapter = bluezutils.find_adapter(options.dev_id) if options.compact: compact = True; bus.add_signal_receiver(interfaces_added, dbus_interface = "org.freedesktop.DBus.ObjectManager", signal_name = "InterfacesAdded") bus.add_signal_receiver(properties_changed, dbus_interface = "org.freedesktop.DBus.Properties", signal_name = "PropertiesChanged", arg0 = "org.bluez.Device1", path_keyword = "path") om = dbus.Interface(bus.get_object("org.bluez", "/"), "org.freedesktop.DBus.ObjectManager") objects = om.GetManagedObjects() for path, interfaces in objects.iteritems(): if "org.bluez.Device1" in interfaces: devices[path] = interfaces["org.bluez.Device1"] mainloop = GObject.MainLoop() mainloop.run() ================================================ FILE: packages/sx05re/emuelec/bin/batocera/batocera-config ================================================ #!/bin/bash . /etc/profile if [ ! "$1" ];then echo -e "usage : batocera-config [command] [args]\nWith command in\n\toverscan [enable|disable]\n\tlsaudio\n\tgetaudio\n\taudio [hdmi|jack|auto|custom|x,y]\n\tcanupdate\n\tupdate\n\twifi [enable|disable] ssid key\n\tstorage [current|list|INTERNAL|ANYEXTERNAL|RAM|DEV UUID]\n\tsetRootPassword [password]\n\tgetRootPassword\n\ttz [|tz]" exit 1 fi configFile="/storage/.config/emuelec/configs/config.txt" command="$1" mode="$2" extra1="$3" extra2="$4" extra3="$5" extra4="$6" arch=$(cat /ee_arch) updateurl="https://127.0.0.1" preBootConfig() { mount -o remount,rw /boot } postBootConfig() { mount -o remount,ro /boot } bato_config_set_value () { key=$1 value=$2 [ -z "$value" ] && value=0 cat "$configFile" | grep "$key" valPresent=$? if [ "$valPresent" != "0" ];then echo "$key=$value" >> "$configFile" else sed -i "s/#\?$key=.*/$key=$value/g" "$configFile" fi } if [ "$(get_es_setting string LogLevel)" == "minimal" ]; then log="/dev/null" else log=/emuelec/logs/systemsettings.log fi systemsetting="/usr/bin/batocera/batocera-settings" #echo "----config ----" >> $log if [ "$command" == "volume" ];then if [ "$mode" != "" ];then echo "setting audio volume : $mode" >> $log # on my pc, the master is turned off at boot # i don't know what are the rules to set here. amixer set Master unmute || exit 1 amixer set Master -- ${mode}% || exit 1 # maximize the sound to be sure it's not 0, allow errors amixer set PCM -- 100% #|| exit 1 amixer set Headphone -- 100% #|| exit 1 exit 0 fi exit 12 fi if [ "$command" == "canupdate" ];then available=$(updatecheck.sh canupdate) if [[ "$available" != "no" ]]; then echo "$available" exit 0 fi exit 12 fi if [ "$command" == "update" ];then emuelec-upgrade exit $? fi if [[ "$command" == "wifi" ]]; then ssid="$3" psk="$4" if [[ "$mode" == "enable" ]]; then echo "configure wifi" >> $log mkdir -p "/storage/.cache/connman" || exit 1 cat > "/storage/.cache/connman/emuelec_wifi.config" <> "/storage/.cache/connman/emuelec_wifi.config" fi connmanctl enable wifi || exit 1 connmanctl scan wifi || exit 1 exit 0 fi if [[ "$mode" =~ "start" ]]; then if [[ "$mode" != "forcestart" ]]; then settingsWlan="`$systemsetting -command load -key wifi.enabled`" if [ "$settingsWlan" != "1" ];then exit 1 fi fi connmanctl enable wifi || exit 1 connmanctl scan wifi || exit 1 exit 0 fi if [[ "$mode" == "disable" ]]; then connmanctl disable wifi exit $? fi if [[ "$mode" == "list" ]]; then WAVAILABLE=$(connmanctl services | cut -b 5- | sed -e s+'^\([^ ]*\).*$'+'\1'+ | grep -vE '^Wired$|^$') if test -n "${ssid}" then echo "${WAVAILABLE}" | grep -qE '^'"${ssid}"'$' || echo "${ssid}" fi echo "${WAVAILABLE}" exit 0 fi fi if [[ "$command" == "storage" ]]; then exit 0; fi if [[ "$command" == "forgetBT" ]]; then killall -9 hcitool systemctl stop bluetooth rm -rf /storage/.cache/bluetooth/* systemctl start bluetooth exit 0 fi if [ "$command" == "tz" ];then if test "$mode" == "" then cat /emuelec/configs/tz else if test -f "/usr/share/zoneinfo/${mode}" then echo "TIMEZONE=${mode}" > /storage/.cache/timezone systemctl restart tz-data.service fi fi exit $? fi exit 10 ================================================ FILE: packages/sx05re/emuelec/bin/batocera/batocera-es-thebezelproject ================================================ #! /bin/bash # # Download and install The Bezel Project for Batocera # # @evoflash and @lbrpdx on Batocera Forums and Discord # # Usage: # batocera-es-thebezelproject 'list', 'install or remove ' # # DECODIR="/storage/roms/" ROMSDIR="/storage/roms/" DEFAULTBEZELDIR="default/systems/" BEZELPROJECTDIR="bezels/" BEZELPROJECTGAMESDIR="${BEZELPROJECTDIR}" BEZELPROJECTSYSTEMDIR="${BEZELPROJECTDIR}" BEZELSLIST="https://raw.githubusercontent.com/EmuELEC/emuelec.github.io/master/settings/bezelproject" LOCALBEZELSLIST="/storage/.config/emuelec/configs/bezels.txt" # bezels.txt must be a plain file with the format 'bezel_name https://githubURL' (spaces or tabs) # Example of a bezels.txt file: # fba https://github.com/thebezelproject/bezelproject-MAME # snes https://github.com/thebezelproject/bezelproject-SNES DEBUG=0 EE_TMP="/tmp/overlays" ############################### # function usage() { echo "$(basename $0) - downloads and installs The Bezel Project for Batocera" echo " " echo "It accepts three modes: 'list', 'install' and 'remove' '" echo "- 'list' for the list of systems installed on the system, and available within TheBezelProject, and if they are" echo " [A]vailable to install, [I]nstalled or [?]unknown." echo "- 'install ' to install the bezels for this ." echo "- 'remove ' to remove the bezels for this ." echo "- 'remove all' to remove all the bezels." echo " " echo "If you have a local $LOCALBEZELSLIST file," echo "it will override the one hosted on Batocera website." return 1 } ############################### # check if url format is valid function check_url() { [[ "$1" =~ ^(https?|ftp)://.*$ ]] && echo "[A]" || echo "[?]" } ############################### # return the git name function git_name() { echo "$1" | sed "s,.*/\(.*\),\1," } ############################### # return the number of files in a directory function files_count() { echo `find "$1" -maxdepth 1 -type f -name "[!.]*" | wc -l` } ############################### # function list() { local count=0 local fn=$(date +"%s") local tmp="$EE_TMP/bezels_$fn" local filescount local systemname local url [ $DEBUG -eq 1 ] && echo "DEBUG: path to bezels ${DECODIR}${BEZELPROJECTGAMESDIR}" echo "* EmuELEC bezels *" # create temporary files in /tmp if [ -f $LOCALBEZELSLIST ]; then cp -f "$LOCALBEZELSLIST" "${tmp}" else curl -sfL "$BEZELSLIST" -o "${tmp}" || return 1 sed -i 's/\r$//' "${tmp}" fi # reading bezels list from configuration file while IFS=$' \t' read systemname url ; do [ -z "${systemname}" ] && continue let count+=1 [ $DEBUG -eq 1 ] && echo "DEBUG: bezels for system ${systemname} (from bezels list)" # check if roms/ directory exist if [ ! -d "${ROMSDIR}${systemname}" ]; then continue; fi # there is at least one file in each roms/ directory (i.e. _info.txt) filescount=$(files_count "${ROMSDIR}${systemname}") if [ "${filescount}" -le 1 ]; then continue; fi # check if url is valid and return [A] else [?] ia=$(check_url "${url}") if [ "${systemname}" == "mame" ] || [ "${systemname}" == "arcade" ] || [ "${systemname}" == "fbneo" ] || [ "${systemname}" == "neogeo" ]; then rsystemname="arcade" else rsystemname="${systemname}" fi # if games/ directory exist we assume the bezels are already installed if [ -d "${DECODIR}${BEZELPROJECTGAMESDIR}${rsystemname}" ]; then ia="[I]"; fi echo "$ia ${systemname} - ${url}" done < "${tmp}" [ $DEBUG -eq 1 ] && echo "DEBUG: there are $count systems (from bezels list)" rm "${tmp}" } ############################### # function install() { local count=0 local installed_count=0 local fn=$(date +"%s") local tmp="$EE_TMP/bezels_$fn" local gitname local gitsystem local filescount local filename local romname local systemname local url local systemtoinstall="$1" local systemfound=0 local realsystemtoinstall="${systemtoinstall}" case "${systemtoinstall}" in "arcade"|"fbneo"|"fbn"|"neogeo"|"mame"|cps*) systemtoinstall="arcade" ;; esac [ $DEBUG -eq 1 ] && echo "DEBUG: path to bezels ${DECODIR}${BEZELPROJECTGAMESDIR}" # create temporary files in /tmp if [ -f $LOCALBEZELSLIST ]; then cp -f "$LOCALBEZELSLIST" "${tmp}" else curl -sfL "$BEZELSLIST" -o "${tmp}" || return 1 sed -i 's/\r$//' "${tmp}" fi # reading bezels list from configuration file while IFS=$' \t' read systemname url ; do [ -z "${systemname}" ] && continue [ $DEBUG -eq 1 ] && echo "DEBUG: bezels for system ${systemname} (from bezels list)" [ "${systemname}" != "${systemtoinstall}" ] && continue # check if url is valid and return [A] else [?] ia=$(check_url "${url}") if [ "$ia" != "[A]" ]; then echo "Error - invalid bezels URL ${url}" return 1 else systemfound=1 break fi done < "${tmp}" rm "${tmp}" # in case of TheBezelProject does not own the system we want to install if [ "$systemfound" -eq 0 ]; then echo -n "Error - system ${systemtoinstall} could not be found in " [ -f $LOCALBEZELSLIST ] && echo "$LOCALBEZELSLIST" || echo "$BEZELSLIST" return 1 fi # check if roms/ directory exists if [ ! -d "${ROMSDIR}${realsystemtoinstall}" ]; then echo "Error - ROMs directory for system ${systemtoinstall} could not be found" return 1 fi # there is at least one file in each roms/ directory (i.e. _info.txt) filescount=$(files_count "${ROMSDIR}${realsystemtoinstall}") [ $DEBUG -eq 1 ] && echo "DEBUG: roms files count ${filescount}" if [ "${filescount}" -le 1 ]; then echo "Error - ROMs directory for system ${realsystemtoinstall} is empty" return 1 fi # create temporary directory in /tmp fn=$(date +"%s") tmp="$EE_TMP/dl_$fn" [ $DEBUG -eq 1 ] && echo "DEBUG: path to roms ${ROMSDIR}${realsystemtoinstall}" [ $DEBUG -eq 1 ] && echo "DEBUG: path for downloading ${tmp}" # extract gitname from the url gitname=$(git_name "${url}") # keep only the final word for searching sub-folders of /retroarch/overlay/GameBezels/ gitsystem=${gitname#bezelproject-} mkdir -p "${tmp}" cd "${tmp}" echo "Downloading bezels for system ${realsystemtoinstall}" [[ "${systemtoinstall}" == "arcade" ]] && echo "they will be installed to ${systemtoinstall}" [ $DEBUG -eq 1 ] && echo "DEBUG: URL: ${url} OUT: ${gitname}.zip GITNAME: $gitname GITSYSTEM: $gitsystem" curl -sfL "${url}/archive/master.zip" -o "${gitname}.zip" # error while downloading ? if [[ "$?" -ne 0 || ! -f "${gitname}.zip" ]]; then echo "Error - ${gitname} zip file could not be downloaded from ${url}" # leave current directory and remove all downloads cd rm -r "${tmp}" return 1 fi # if it doesn't already exist, create the games bezels directory if [ ! -d "${DECODIR}${BEZELPROJECTGAMESDIR}${systemtoinstall}" ]; then [ $DEBUG -eq 1 ] && echo "DEBUG: creating ${DECODIR}${BEZELPROJECTGAMESDIR}${systemtoinstall}" mkdir -p "${DECODIR}${BEZELPROJECTGAMESDIR}${systemtoinstall}" else [ $DEBUG -eq 1 ] && echo "DEBUG: directory ${DECODIR}${BEZELPROJECTGAMESDIR}${systemtoinstall} already exist" fi # if it doesn't already exist, create the systems bezels directory if [ ! -d "${DECODIR}${BEZELPROJECTSYSTEMDIR}" ]; then [ $DEBUG -eq 1 ] && echo "DEBUG: creating ${DECODIR}${BEZELPROJECTSYSTEMDIR}" mkdir -p "${DECODIR}${BEZELPROJECTSYSTEMDIR}" else [ $DEBUG -eq 1 ] && echo "DEBUG: directory ${DECODIR}${BEZELPROJECTSYSTEMDIR} already exist" fi # unzip archive for working on and remove the zip file echo "Installing/Updating bezels for system ${realsystemtoinstall}..." [[ "${systemtoinstall}" == "arcade" ]] && echo "removing from ${systemtoinstall}" unzip -q "${gitname}.zip" mv "${gitname}-master" "${gitname}" rm "${gitname}.zip" # install games bezels if provided by TheBezelProject echo "installing games bezels" echo 0 > "/tmp/bcount" echo 0 > "/tmp/bicount" find "${ROMSDIR}${realsystemtoinstall}" -maxdepth 1 -type f -iname "[!.]*" | sort -V | while read filename; do filename=$(basename "$filename") romname=${filename%%.*} [ -z "${romname}" ] && continue count=$((count + 1)) echo $count > "/tmp/bcount" [ $DEBUG -eq 1 ] && echo "DEBUG: count -> $count" [ $DEBUG -eq 1 ] && echo "DEBUG: rom -> ${romname}" if [ "${systemtoinstall}" == "mame" ] || [ "${systemtoinstall}" == "arcade" ] || [ "${systemtoinstall}" == "fbneo" ] || [ "${systemtoinstall}" == "neogeo" ]; then # is there a matching PNG for arcade rom name ? EE_REALSYSTEM="ArcadeBezels" else EE_REALSYSTEM="GameBezels/${gitsystem}" fi if [ -f "${tmp}/${gitname}/retroarch/overlay/$EE_REALSYSTEM/${romname}.png" ]; then [ $DEBUG -eq 1 ] && echo "DEBUG: found PNG for ${romname}" # copy the matching PNG cp "${tmp}/${gitname}/retroarch/overlay/$EE_REALSYSTEM/${romname}.png" "${DECODIR}${BEZELPROJECTGAMESDIR}${systemtoinstall}" cp "${tmp}/${gitname}/retroarch/overlay/$EE_REALSYSTEM/${romname}.cfg" "${DECODIR}${BEZELPROJECTGAMESDIR}${systemtoinstall}" sed -i '/overlay0_overlay/d' "${DECODIR}${BEZELPROJECTGAMESDIR}${systemtoinstall}/${romname}.cfg" echo "overlay0_overlay = \"${romname}.png\"" >> "${DECODIR}${BEZELPROJECTGAMESDIR}${systemtoinstall}/${romname}.cfg" installed_count=$((installed_count + 1)) echo $installed_count > "/tmp/bicount" [ $DEBUG -eq 1 ] && echo "DEBUG: installed_count -> $installed_count" fi done echo "Bezels found" $(cat /tmp/bcount) "Bezels installed" $(cat /tmp/bicount) rm /tmp/bcount rm /tmp/bicount # install system bezel if provided by TheBezelProject echo "installing system bezel" # * Arcade * if [ "${systemtoinstall}" == "mame" ] || [ "${systemtoinstall}" == "arcade" ] || [ "${systemtoinstall}" == "fbneo" ] || [ "${systemtoinstall}" == "neogeo" ]; then # copy the HORIZONTAL system bezel to the correct directory and rename it cp "${tmp}/${gitname}/retroarch/overlay/MAME-Horizontal.png" "${DECODIR}${BEZELPROJECTSYSTEMDIR}${systemtoinstall}.png" else # * Other * filescount=$(find "${tmp}/${gitname}/retroarch/overlay" -maxdepth 1 -type f -name "*.png" | wc -l) if [ "${filescount}" -eq 1 ]; then rm -f "${DECODIR}${BEZELPROJECTSYSTEMDIR}${systemname}.png" rm -f "${DECODIR}${BEZELPROJECTSYSTEMDIR}${systemname}.info" # copy the system bezel to the correct directory and rename it filename=$(ls -1 "${tmp}/${gitname}"/retroarch/overlay/*.png) [ $DEBUG -eq 1 ] && echo "DEBUG: $filename ${DECODIR}${BEZELPROJECTSYSTEMDIR}${systemtoinstall}/default.png" cp "$filename" "${DECODIR}${BEZELPROJECTSYSTEMDIR}${systemtoinstall}/default.png" filename=${filename%.*} [ $DEBUG -eq 1 ] && echo "DEBUG: ${filename}.cfg ${DECODIR}${BEZELPROJECTSYSTEMDIR}${systemtoinstall}/default.cfg" cp "${filename}.cfg" "${DECODIR}${BEZELPROJECTSYSTEMDIR}${systemtoinstall}/default.cfg" sed -i '/overlay0_overlay/d' "${DECODIR}${BEZELPROJECTSYSTEMDIR}${systemtoinstall}/default.cfg" echo "overlay0_overlay = \"default.png\"" >> "${DECODIR}${BEZELPROJECTSYSTEMDIR}${systemtoinstall}/default.cfg" else # make a symbolic link to the Batocera's bezel default system pack ln -fs "${DECODIR}${DEFAULTBEZELDIR}${systemtoinstall}.png" "${DECODIR}${BEZELPROJECTSYSTEMDIR}${systemtoinstall}.png" ln -fs "${DECODIR}${DEFAULTBEZELDIR}${systemtoinstall}.info" "${DECODIR}${BEZELPROJECTSYSTEMDIR}${systemtoinstall}.info" fi fi # # install default bezel (i.e. system not supported in TheBezelProject) # echo "installing default bezels" # if [ -d "${DECODIR}${BEZELPROJECTDIR}" ]; then # echo "TODO : install the @fery65's default.png bezel" # fi # leave current directory and remove all downloads echo "Bezels for system ${realsystemtoinstall} are now installed" cd rm -r "${tmp}" } ############################### # function remove() { systemname="$1" # do we want to remove all TheBezelProject ? if [ "${systemname}" == "all" ]; then if [ -d "${DECODIR}${BEZELPROJECTDIR}" ]; then read -p "Do you wish to remove all bezels ? " yn if [[ "$yn" = "y" || "$yn" = "Y" ]]; then rm -rf "${DECODIR}${BEZELPROJECTDIR}" fi else echo "Error - bezels directory ${DECODIR}${BEZELPROJECTDIR} is not valid" return 1 fi else # check if games/ directory exist if [ ! -d "${DECODIR}${BEZELPROJECTGAMESDIR}${systemname}" ]; then echo "Error - bezels for system ${systemname} could not be found" return 1 else rm -rf "${DECODIR}${BEZELPROJECTGAMESDIR}${systemname}" rm -f "${DECODIR}${BEZELPROJECTSYSTEMDIR}${systemname}.png" rm -f "${DECODIR}${BEZELPROJECTSYSTEMDIR}${systemname}.info" fi fi } ############################### #### Main loop # command="$1" system="$2" count=1 installed_count=1 if [ ! -d "${DECODIR}" ]; then echo "Error - decorations directory ${DECODIR} is not valid" exit 1 fi if [[ "$command" == "list" ]]; then list elif [[ "$command" == "install" && -n "$system" ]]; then install "$system" elif [[ "$command" == "remove" && -n "$system" ]]; then remove "$system" else usage fi ================================================ FILE: packages/sx05re/emuelec/bin/batocera/batocera-es-theme ================================================ #!/bin/bash # # Download and install EmulationStation themes for Batocera # # @lbrpdx on Batocera Forums and Discord # # Usage: # batocera-es-theme 'list' or 'install ' # # If you don't provide a , the list of themes available online will be returned back to you # DEFAULTTHEME="Crystal" CONFIGDIR="/storage/.emulationstation/themes" if mountpoint -q /emuelec/themes; then CONFIGDIR="/emuelec/themes" elif mountpoint -q /var/media/EEROMS; then [[ -d "/var/media/EEROMS/themes" ]] && CONFIGDIR="/var/media/EEROMS/themes" elif mountpoint -q /storage/roms; then [[ -d "/storage/roms/themes" ]] && CONFIGDIR="/storage/roms/themes" fi #echo $CONFIGDIR THEMESLIST="https://raw.githubusercontent.com/EmuELEC/emuelec.github.io/master/settings/EE_themes" LOCALTHEMESLIST="/storage/.config/emuelec/configs/themes.txt" # themes.txt must be a plain file with the format 'theme_name https://githubURL' (spaces or tabs) # Example of a themes.txt file: # fundamental https://github.com/jdorigao/es-theme-fundamental # Zoid https://github.com/RetroPie/es-theme-zoid ############################### # function usage() { echo "$0 - downloads and installs EmulationStation themes for Batocera" echo " " echo "It accepts two modes: 'list' and 'install '" echo "- 'list' for the list of themes available online, and if they are" echo " [A]vailable to install, [I]nstalled or [?]unknown." echo "- 'install ' to install the theme, from its theme name." echo "- 'remove ' to delete an installed theme." echo " " echo "If you have a local $LOCALTHEMESLIST file," echo "it will override the one hosted on Batocera website." exit 1 } ############################### # function check_url() { [[ "$1" =~ ^(https?|ftp)://.*$ ]] && echo "[A]" || echo "[?]" } ############################### # function git_name() { echo "$1" | sed "s,.*/\(.*\),\1," } ############################### # function repo_name() { echo "$1" | sed "s,.*github.com/\([A-Za-z0-9_-]*\)/.*,\1," } ############################### # function list_themes() { fn=$(date +"%s") tmp="/tmp/themes_$fn" echo "* Batocera themes *" if [ -f $LOCALTHEMESLIST ]; then cp -f "$LOCALTHEMESLIST" "$tmp" else curl -sfL "$THEMESLIST" -o "$tmp" || exit 1 sed -i 's/\r$//' "${tmp}" fi while IFS=$' \t' read name url ; do [ x"$name" == "x" ] && continue ia=$(check_url "$url") gitname=$(git_name "$url") [[ "$gitname" == "$DEFAULTTHEME" ]] && CONFIGDIR="/storage/.emulationstation/themes" [ -d "$CONFIGDIR"/"$gitname" ] && ia="[I]" echo "$ia $name - $url" done < "$tmp" [[ -e "$tmp" ]] && rm "$tmp" } ############################### # function getPer() { TARFILE="$1" TARVAL="$2" [ -z ${TARVAL} ] && TARVAL=0 while true; do CURVAL=$(stat "$TARFILE" | grep -E '^[ ]*Size:' | sed -e s+'^[ ]*Size: \([0-9][0-9]*\) .*$'+'\1'+) CURVAL=$((CURVAL / 1024 / 1024)) PER=$((${CURVAL} * 100 / ${TARVAL})) echo "${PER}% - ${theme^^} - [${TARVAL}MB]" sleep 1 done } ############################### # function install_theme() { theme="$1" success_installed=0 fn=$(date +"%s") tmp="/tmp/themes_$fn" if [ -f $LOCALTHEMESLIST ]; then cp -f "$LOCALTHEMESLIST" "$tmp" else curl -sfL "$THEMESLIST" -o "$tmp" || exit 1 sed -i 's/\r$//' "${tmp}" fi while IFS=$' \t' read name url ; do [ x"$name" != x"$theme" ] && continue ia=$(check_url "$url") if [ x"$ia" != x"[A]" ]; then echo "Error - invalid theme URL $url" exit 1 else reponame=$(repo_name "$url") gitname=$(git_name "$url") [[ "$gitname" == "$DEFAULTTHEME" ]] && CONFIGDIR="/storage/.emulationstation/themes" cd "$CONFIGDIR" filezip="${url}/archive/master.zip" # get size to download (hack to get it from github) # size=$(curl -sfL https://api.github.com/repos/"$reponame"/"$gitname" | grep size | head -1 | tr -dc '[:digit:]') #echo "https://codeload.github.com/${reponame}/${gitname}/zip/master" for i in {0..9}; do size=$(curl -Is "https://codeload.github.com/${reponame}/${gitname}/zip/master" | grep Content-Length | tail -1 | cut -d ' ' -f2 | tr -d '\r') [[ -z $size ]] && sleep 1 || { size=$((size / 1024 / 1024 )); break; } done #size=$((size / 1024 )) test $? -eq 0 || exit 1 touch "$gitname.zip" getPer "$CONFIGDIR"/"$gitname.zip" "${size}" & GETPERPID=$! curl -sfL "${filezip}" -o "$gitname.zip" || exit 1 kill -9 "${GETPERPID}" >/dev/null 2>/dev/null GETPERPID= if [ -f "$gitname.zip" ]; then echo "Unzipping $gitname theme files >>> 99%" [ -d "$CONFIGDIR"/"$gitname" ] && rm -rf "$CONFIGDIR"/"$gitname" unzip "$gitname.zip" >/dev/null mv "$gitname-master" "$gitname" rm "$gitname.zip" success_installed=1 else echo "Error - $theme zip file could not be downloaded from $url" exit 1 fi fi done < "$tmp" [[ -e "$tmp" ]] && rm "$tmp" if [ "$success_installed" == 1 ]; then echo "Theme $theme is now installed >>> 100%" exit 0 else echo "Error - theme $theme could not be found" exit 1 fi } ############################### # function remove_theme() { theme="$1" success_removed=0 gitname=$theme if [ -d "${CONFIGDIR}/${gitname}" ]; then rm -rf "$CONFIGDIR"/"$gitname" && success_removed=1 else echo "Theme $theme doesn't appear to be in $CONFIGDIR/$gitname" fi if [ "$success_removed" == 1 ]; then [ $TERMINAL = 1 ] && echo -e "Theme $theme removed from:\t$CONFIGDIR/$gitname" [ $TERMINAL = 0 ] && echo "Theme ${theme^^} is now removed >>>100" exit 0 else echo "Error - theme $theme could not be removed" exit 1 fi } #### Main loop # command="$1" theme="$2" if ! [ -d "$CONFIGDIR" ]; then echo "Error - theme directory $CONFIGDIR is not valid." exit 1 fi if [ x"$command" == "xlist" ]; then list_themes elif [ x"$command" == "xinstall" ]; then [ x"$theme" != "x" ] && install_theme $theme || usage elif [ x"$command" == "xremove" ]; then [ x"$theme" != "x" ] && remove_theme $theme || usage else usage fi ================================================ FILE: packages/sx05re/emuelec/bin/batocera/batocera-info ================================================ #!/bin/bash ### short version (for osd) if test "$1" = "--short" then BATT=$(cat /sys/class/power_supply/{BAT,bat}*/uevent 2>/dev/null | grep -E "^POWER_SUPPLY_CAPACITY=" | sed -e s+'^POWER_SUPPLY_CAPACITY='++ | sort -rn | head -1) DT=$(date +%H:%M) if test -n "${BATT}" then echo "Battery: ${BATT}% - ${DT}" else echo "${DT}" fi exit 0 fi ### V_ARCH=EmuELEC V_CPUNB=$(grep -E $'^processor\t:' /proc/cpuinfo | wc -l) V_CPUMODEL1=$(grep -E $'^model name\t:' /proc/cpuinfo | head -1 | sed -e s+'^model name\t: '++) V_SYSTEM=$(uname -rs) # battery BATT=$(cat /sys/class/power_supply/{BAT,bat}*/uevent 2>/dev/null | grep -E "^POWER_SUPPLY_CAPACITY=" | sed -e s+'^POWER_SUPPLY_CAPACITY='++ | sort -rn | head -1) if test -n "${BATT}" then echo "Battery: ${BATT}%" fi # PAD Battery for PADBAT in /sys/class/power_supply/*/device/uevent do # HID devices only PADNAME=$(grep -E '^HID_NAME=' "${PADBAT}" | sed -e s+'^HID_NAME='++) if test -n "${PADNAME}" then # parent of parent / uevent BATTUEVENT=$(dirname "${PADBAT}") BATTUEVENT=$(dirname "${BATTUEVENT}")/uevent BATT=$(grep -E "^POWER_SUPPLY_CAPACITY=" "${BATTUEVENT}" | sed -e s+'^POWER_SUPPLY_CAPACITY='++ | sort -rn | head -1) echo "${PADNAME}: ${BATT}%" fi done # temperature # Unit: millidegree Celsius TEMPE=$(cat /sys/devices/virtual/thermal/thermal_zone*/temp 2>/dev/null | sort -rn | head -1 | sed -e s+"[0-9][0-9][0-9]$"++) if test -n "${TEMPE}" then echo "Temperature: ${TEMPE}°" fi echo "Architecture: ${V_ARCH}" echo "System: ${V_SYSTEM}" if test "${V_ARCH}" = "x86" -o "${V_ARCH}" = "x86_64" then V_OPENGLVERSION=$(DISPLAY=:0.0 glxinfo | grep -E '^OpenGL core profile version string:' | sed -e s+'^OpenGL core profile version string:[ ]*'++) if test -z "${V_OPENGLVERSION}" then V_OPENGLVERSION=$(DISPLAY=:0.0 glxinfo | grep -E '^OpenGL version string:' | sed -e s+'^OpenGL version string:[ ]*'++) fi echo "OpenGL: ${V_OPENGLVERSION}" fi echo "Cpu model: ${V_CPUMODEL1}" echo "Cpu number: ${V_CPUNB}" if grep -q " avx2" /proc/cpuinfo then echo "Cpu feature: avx2" fi ================================================ FILE: packages/sx05re/emuelec/bin/batocera/batocera-resolution ================================================ #!/bin/bash ACTION=$1 shift FILEMODES="/sys/class/graphics/fb0/modes" case "${ACTION}" in "listModes") ;; "setMode") ;; "currentMode"|"currentResolution") # mode can be different from resolution (ie on rpi) test -e "${FILEMODES}" && head -1 "${FILEMODES}" | sed -e s+'^[^:]:\([0-9]*\)x\([0-9]*\)[a-z]*.*$'+'\1x\2'+ ;; esac exit 0 ================================================ FILE: packages/sx05re/emuelec/bin/batocera/batocera-retroachievements-info ================================================ #!/bin/bash # # Get RetroAchievements information for Batocera # # @lbrpdx on Batocera Forums and Discord # # 20191124 - v2 with now outputs in XML format (for Batocera 5.25+) # 20200113 - updated for retroachievements.org HTML changes # 20200124 - added badges for each game played # 20200304 - fixed a bug in rare cases where a RA game has no success icons # 20200410 - updated for retroachievements.org HTML changes, again # 20200625 - retroachievements.org HTML changes, again # 20201104 - retroachievements.org HTML changes, again, again # # Usage: # batocera-retroachievements-info # CONFIGFILE="/storage/.config/emuelec/configs/emuelec.conf" TIMEOUT=4 # seconds before timeout (>2 sec) USER="" ############################### # function usage() { echo "$0 username" echo " - where username is the RetroAchievements username you want to check out" exit 1 } ############################### # function process() { fn=$(date +"%s") tmpfile=/tmp/ra_$fn curl -m "$TIMEOUT" -o $tmpfile https://retroachievements.org/user/$USER 2>/dev/null if [ x"$?" != x0 ]; then echo "" echo "" echo " $fn" echo " RetroAchievements website is too slow to respond" echo "" exit 1; fi cat "$tmpfile" | awk -v FS="(
|
)" '{print $2}' | uniq > "$tmpfile"_2 idcard=$(cat "$tmpfile" | sed -e "/^[[:blank:]]*$/d" | awk -v FS="(

Member Since: |
Account Type:)" '{print $2}' | uniq) parsedid=$(echo "$idcard" | sed -e "/^[[:blank:]]*$/d" | sed -e "s;\(.*\)
Last Activity: \(.*\);\1@\2;") avcompletion=$(cat "$tmpfile" | sed -e "/^[[:blank:]]*$/d" | awk -v FS="(
Average Completion: |
Site Rank:)" '{print $2}' | sed -e "/^[[:blank:]]*$/d" | uniq) points=$(cat "$tmpfile"_2 | sed -e "/^[[:blank:]]*$/d" | awk -v FS="( |)" '{print $2}' | sed -e "s;(\([0-9]*\) points);\1;") if [ x"$points" != x ] && [ "$points" -ge 1 ]; then rank=$(cat "$tmpfile"_2 | sed -e "/^[[:blank:]]*$/d" | awk -v FS="(globalRanking.php|

)" '{print $3}' | sed -e "s/\?[a-zA-Z0-9=&;']*>//" -e "s;;;" -e "s;%).*;%);") ## For future use: UserPic is RetroAchievements' user avatar - however the S3 bucket is protected. # UserPic=$(cat $tmpfile | grep 'meta property=.og:image. content=' | cut -d= -f3 | awk -F\' '{print $2}') # Workaround: use the line below UserPic="https://retroachievements.org/UserPic/$USER".png pic="" curl -m "$TIMEOUT" -f -s "$UserPic" >/dev/null 2>/dev/null if [ x"$?" == x0 ]; then pic=" $UserPic\n" fi echo "" echo "" echo " $fn" echo " $USER" echo " $points" echo " $rank" echo " $avcompletion" echo -ne "$pic" echo "$parsedid" | sed -e "s;\(.*\)@\(.*\); \1\n \2;" xmllint --html "$tmpfile" 2>/dev/null | grep '.*points.' | sed -e "/^[[:blank:]]*$/d" | sed -e 's:\(.*\)points\.
:\1points\@\\\n:g;' > "$tmpfile"_2 cat "$tmpfile"_2 | awk -v FS="(href=\"/[gG]ame/[0-9]*\">|@)" '{print $2}' | sed -e "s;

\(Last played[ 0-9:-]*\)
\(.*\);@\2@\1;" | sed -e "s;achievements, ;achievements@;" | sed -e "s;Earned ;;" | sed -e "/^[[:blank:]]*$/d" > "$tmpfile"_st cat "$tmpfile"_2 | grep -e 'div class="bb_inline" onmouseover' -e '^$' | sed "s:.*src=\"\(.*/Badge/.*\.png\)\".*:\1:" | sed "s;^$;https://batocera.org/favicon-64.png;" > "$tmpfile"_ba i=0 if [ $(cat "$tmpfile"_ba | wc -l) -eq $(cat "$tmpfile"_st | wc -l) ]; then while IFS= read -r line || [[ -n "$line" ]]; do i=$((i+1)) echo "$line" | sed -e "s;\(.*\)@\(.*\) achievements@\(.*\) points@Last played \(.*\); \n \1\n \2\n \3\n \4;" cat "$tmpfile"_ba | head -n "$i" | tail -n 1 | sed "s:^: :;s:$::" echo " " done < "$tmpfile"_st else echo "$res" | sed -e "s;\(.*\)@\(.*\) achievements@\(.*\) points@Last played \(.*\); \n \1\n \2\n \3\n \4\n ;" fi echo "
" else echo "" echo "" echo " $fn" echo " Player $USER hasn't unlocked any RetroAchievement yet" echo "" fi rm "$tmpfile" "$tmpfile"_2 "$tmpfile"_st "$tmpfile"_ba 2>/dev/null } #### Main loop # if [ $# -lt 1 ]; then [ -f "$CONFIGFILE" ] && USER=$(grep -E "^[ \t]*global.retroachievements.username=" "$CONFIGFILE" | cut -d= -f2 | uniq) else tmp="$1" [ x"${tmp::1}" == "x-" ] && usage || USER="$1" fi [ x"$USER" == x ] && usage || process ================================================ FILE: packages/sx05re/emuelec/bin/batocera/batocera-scraper ================================================ #!/bin/bash systemsetting="/usr/bin/batocera/batocera-settings" syslang=$($systemsetting -command load -key system.language) IMGSTYLE=$($systemsetting -command load -key scrapper.style) if test $# = 1 then DOSYS=$1 fi # supported languages : en, fr, es, de, pt case "${syslang}" in fr_FR) sslang=fr,en ;; es_ES) sslang=es,en ;; de_DE) sslang=de,en ;; pt_PT) sslang=pt,en ;; pt_BR) sslang=pt,en ;; *) sslang=en esac if test -z "${IMGSTYLE}" then IMGSTYLE="b,f,a,l,3b,s" fi do_scrap() { LRDIR=$1 NF=$(ls "${LRDIR}" | grep -vE '\.txt$|\.xml$' | wc -l) if test "${NF}" -gt 0 then BASEDIR=$(basename "${LRDIR}") echo "GAME: system ${BASEDIR}" EXTRAOPT= for x in "mame" "fba" "fba_libretro" "neogeo" do test "${LRDIR}" = "/storage/roms/${x}" && EXTRAOPT="-mame" done (cd "${LRDIR}" && sselph-scraper -console_src ss,gdb,ovgdb -lang "${sslang}" -console_img "${IMGSTYLE}" -download_videos -workers 5 ${EXTRAOPT}) 2>&1 fi } # find system to scrape (if test -n "${DOSYS}" then test -d "/storage/roms/${DOSYS}" && echo "/storage/roms/${DOSYS}" else find /storage/roms -maxdepth 1 -mindepth 1 -type d fi) | while read RDIR1 do # read the 2 next dir read RDIR2 read RDIR3 read RDIR4 do_scrap "${RDIR1}" & test -n "${RDIR2}" && do_scrap "${RDIR2}" & test -n "${RDIR3}" && do_scrap "${RDIR3}" & test -n "${RDIR4}" && do_scrap "${RDIR4}" & wait done # synchronize to not make the usb/sdcard slowing down once finnished sync ================================================ FILE: packages/sx05re/emuelec/bin/batocera/batocera-settings ================================================ #!/bin/bash # batocera-settings can mimic batoceraSettings.py # goal: abolish this python script, it's useless for the sake of the load feature only # get a more user friendly environment for setting, getting and saving keys # # Usage of BASE COMMAND: # longform: --command --key --value # # shortform: # # --command load write enable disable status # --key any key in emuelec.conf (kodi.enabled...) # --value any alphanumerical string # use quotation marks to avoid globbing use slashes escape special characters # This script reads only 1st occurrence if string and writes only to this first hit # # This script uses #-Character to comment values # # If there is a boolean value (0,1) then then enable and disable command will set the corresponding # boolean value. # Examples: # 'batocera-settings --command load --key wifi.enabled' will print out 0 or 1 # 'batocera-settings --command write --key wifi.ssid -value "This is my NET"' will set 'wlan.ssid=This is my NET' # 'batocera-settings enable wifi.ssid' will remove # from configfile (activate) # 'batocera-settings disable wifi.enabled' will set key wifi.enabled=0 # 'botocera-settings /myown/config.file --command status --key my.key' will output status of own config.file and my.key # by cyperghost - 2019/12/30 ##### INITS ##### BATOCERA_CONFIGFILE="/storage/.config/emuelec/configs/emuelec.conf" COMMENT_CHAR_SEARCH="[#|;]" COMMENT_CHAR="#" ##### INITS ##### ##### Function Calls ##### function get_config() { #Will search for key.value and #key.value for only one occurrence #If the character is the COMMENT CHAR then set value to it #Otherwise strip till the equal-char to obtain value local val local ret val="$(grep -E -m1 "^\s*$1\s*=" $BATOCERA_CONFIGFILE)" ret=$? if [[ $ret -eq 1 ]]; then val="$(grep -E -m1 "^$COMMENT_CHAR_SEARCH\s*$1\s*=" $BATOCERA_CONFIGFILE)" ret=$? [[ $ret -eq 0 ]] && val=$COMMENT_CHAR else #Maybe here some finetuning to catch key.value = ENTRY without blanks val="${val#*=}" fi echo "$val" return $ret } function set_config() { #Will search for first key.name at beginning of line and write value to it sed -i "1,/^\(\s*$1\s*=\).*/s//\1$2/" "$BATOCERA_CONFIGFILE" } function uncomment_config() { #Will search for first Comment Char at beginning of line and remove it sed -i "1,/^$COMMENT_CHAR_SEARCH\(\s*$1\)/s//\1/" "$BATOCERA_CONFIGFILE" } function comment_config() { #Will search for first key.name at beginning of line and add a comment char to it sed -i "1,/^\(\s*$1\)/s//$COMMENT_CHAR\1/" "$BATOCERA_CONFIGFILE" } function check_argument() { # This method does not accept arguments starting with '-'. if [[ -z "$2" || "$2" =~ ^- ]]; then echo >&2 echo "ERROR: '$1' is missing an argument." >&2 echo >&2 echo "Just type '$0' to see usage page." >&2 echo >&2 return 1 fi } function dash_style() { #This function is needed to "simulate" the python script with single dash #commands. It will also accept the more common posix double dashes #Accept dashes and double dashes and build new array ii with parameter set #The else-branch can be used for the shortform for i in --command --key --value; do if [[ -z "$1" ]]; then continue elif [[ "$i" =~ ^-{0,1}"${1,,}" ]]; then check_argument $1 $2 [[ $? -eq 0 ]] || exit 1 ii+=("$2") shift 2 else ii+=("$1") shift 1 fi done } function usage() { val=" Usage of BASE COMMAND: --command --key --value shortform: --command load write enable disable status --key any key in emuelec.conf (kodi.enabled...) --value any alphanumerical string use quotation marks to avoid globbing For write command --value must be provided exit codes: exit 0 = value is available, proper exit exit 1 = general error exit 2 = file error exit 10 = value found, but empty exit 11 = value found, but not activated exit 12 = value not found If you don't set a filename then default is '~/emuelec.conf'" echo "$val" } ##### Function Calls ##### ##### MAIN FUNCTION ##### function main() { #Filename parsed? if [[ -f "$1" ]]; then BATOCERA_CONFIGFILE="$1" shift else [[ -f "$BATOCERA_CONFIGFILE" ]] || { echo "not found: $BATOCERA_CONFIGFILE" >&2; exit 2; } fi #How much arguments are parsed, up to 6 then it is the long format #up to 3 then it is the short format if [[ ${#@} -eq 0 || ${#@} -gt 6 ]]; then usage exit 1 else dash_style "$@" command="${ii[0]}" keyvalue="${ii[1]}" newvalue="${ii[2]}" unset ii fi [[ -z $keyvalue ]] && { echo "error: Please provide a proper keyvalue" >&2; exit 1; } # value processing, switch case case "${command,,}" in "read"|"get"|"load") val="$(get_config $keyvalue)" ret=$? [[ "$val" == "$COMMENT_CHAR" ]] && exit 11 [[ -z "$val" && $ret -eq 0 ]] && exit 10 [[ -z "$val" && $ret -eq 1 ]] && exit 12 [[ -n "$val" ]] && echo "$val" && exit 0 ;; "stat"|"status") val="$(get_config $keyvalue)" ret=$? [[ -f "$BATOCERA_CONFIGFILE" ]] && echo "ok: found '$BATOCERA_CONFIGFILE'" >&2 || echo "error: not found '$BATOCERA_CONFIGFILE'" >&2 [[ -w "$BATOCERA_CONFIGFILE" ]] && echo "ok: r/w file '$BATOCERA_CONFIGFILE'" >&2 || echo "error: r/o file '$BATOCERA_CONFIGFILE'" >&2 [[ -z "$val" && $ret -eq 1 ]] && echo "error: '$keyvalue' not found!" >&2 [[ -z "$val" && $ret -eq 0 ]] && echo "error: '$keyvalue' is empty - use 'comment' command to retrieve" >&2 [[ "$val" == "$COMMENT_CHAR" ]] && echo "error: '$keyvalue' is commented $COMMENT_CHAR!" >&2 && val= [[ -n "$val" ]] && echo "ok: '$keyvalue' $val" exit 0 ;; "set"|"write"|"save") #Is file write protected? [[ -w "$BATOCERA_CONFIGFILE" ]] || { echo "r/o file: $BATOCERA_CONFIGFILE" >&2; exit 2; } #We can comment line above to erase keys, it's much saver to check if a value is setted [[ -z "$newvalue" ]] && echo "error: '$keyvalue' needs value to be setted" >&2 && exit 1 val="$(get_config $keyvalue)" ret=$? if [[ "$val" == "$COMMENT_CHAR" ]]; then echo "$keyvalue: hashed out!" >&2 uncomment_config "$keyvalue" set_config "$keyvalue" "$newvalue" echo "$keyvalue: set from '$val' to '$newvalue'" >&2 exit 0 elif [[ -z "$val" && $ret -eq 1 ]]; then echo "$keyvalue: not found!" >&2 exit 12 elif [[ "$val" != "$newvalue" ]]; then set_config "$keyvalue" "$newvalue" exit 0 fi ;; "uncomment"|"enable"|"activate") val="$(get_config $keyvalue)" ret=$? # Boolean if [[ "$val" == "$COMMENT_CHAR" ]]; then uncomment_config "$keyvalue" echo "$keyvalue: removed '$COMMENT_CHAR', key is active" >&2 elif [[ "$val" == "0" ]]; then set_config "$keyvalue" "1" echo "$keyvalue: boolean set '1'" >&2 elif [[ -z "$val" && $ret -eq 1 ]]; then echo "$keyvalue: not found!" && exit 2 fi ;; "comment"|"disable"|"remark") val="$(get_config $keyvalue)" ret=$? # Boolean [[ "$val" == "$COMMENT_CHAR" || "$val" == "0" ]] && exit 0 if [[ -z "$val" && $ret -eq 1 ]]; then echo "$keyvalue: not found!" >&2 && exit 12 elif [[ "$val" == "1" ]]; then set_config "$keyvalue" "0" echo "$keyvalue: boolean set to '0'" >&2 else comment_config "$keyvalue" echo "$keyvalue: added '$COMMENT_CHAR', key is not active" >&2 fi ;; *) echo "ERROR: invalid command '$command'" >&2 exit 1 ;; esac } ##### MAIN FUNCTION ##### ##### MAIN CALL ##### # Prepare arrays from fob python script # Keyword for python call is mimic_python # Attention the unset is needed to eliminate first argument (python basefile) if [[ "${#@}" -eq 1 && "$1" =~ "mimic_python" ]]; then #batoceraSettings.py fob readarray -t arr <<< "$1" unset arr[0] else #regular call by shell arr=("$@") fi main "${arr[@]}" ##### MAIN CALL ##### ================================================ FILE: packages/sx05re/emuelec/bin/batocera/batocera-systems ================================================ #!/usr/bin/env python from __future__ import print_function from hashlib import md5 from os.path import isfile from collections import OrderedDict import sys systems = { # Atari "atari5200": { "name": "Atari 5200", "biosFiles": [ { "md5": "281f20ea4320404ec820fb7ec0693b38", "file": "bios/5200.rom" } ] }, "atari800": { "name": "Atari 800", "biosFiles": [ { "md5": "06daac977823773a3eea3422fd26a703", "file": "bios/ATARIXL.ROM" }, { "md5": "0bac0c6a50104045d902df4503a4c30b", "file": "bios/ATARIBAS.ROM" }, { "md5": "eb1f32f5d9f382db1bbfb8d7f9cb343a", "file": "bios/ATARIOSA.ROM" }, { "md5": "a3e8d617c95d08031fe1b20d541434b2", "file": "bios/ATARIOSB.ROM" } ] }, "atari7800": { "name": "Atari 7800", "biosFiles": [ { "md5": "0763f1ffb006ddbe32e52d497ee848ae", "file": "bios/7800 BIOS (U).rom" } ] }, "atarist": { "name": "Atari ST", "biosFiles": [ { "md5": "b2a8570de2e850c5acf81cb80512d9f6", "file": "bios/tos.img" } ] }, "atarilynx": { "name": "Lynx", "biosFiles": [ { "md5": "fcd403db69f54290b51035d82f835e7b", "file": "bios/lynxboot.img" } ] }, # Colecovision "colecovision": { "name": "Colecovision", "biosFiles": [ { "md5": "", "file": "bios/Machines/COL - Bit Corporation Dina/config.ini" }, { "md5": "2c66f5911e5b42b8ebe113403548eee7 ", "file": "bios/colecovision.rom" }, { "md5": "1de922acdd742d31349c2801e9768c35", "file": "bios/Machines/COL - Bit Corporation Dina/czz50-1.rom" }, { "md5": "72b089dc55b7fe7ffb5028f365e8c045", "file": "bios/Machines/COL - Bit Corporation Dina/czz50-2.rom" }, { "md5": "2c66f5911e5b42b8ebe113403548eee7", "file": "bios/Machines/COL - ColecoVision/coleco.rom" }, { "md5": "", "file": "bios/Machines/COL - ColecoVision/config.ini" }, { "md5": "2c66f5911e5b42b8ebe113403548eee7", "file": "bios/Machines/COL - ColecoVision with Opcode Memory Extension/coleco.rom" }, { "md5": "", "file": "bios/Machines/COL - ColecoVision with Opcode Memory Extension/config.ini" }, { "md5": "", "file": "bios/Machines/COL - Spectravideo SVI-603 Coleco/config.ini" }, { "md5": "c60a2e85572c0ccb69505a7646d5c1b6", "file": "bios/Machines/COL - Spectravideo SVI-603 Coleco/SVI603.ROM" }, { "md5": "", "file": "bios/Databases/colecodb.xml" }, ] }, # Commodore "amiga": { "name": "Amiga/CD32", "biosFiles": [ { "md5": "89da1838a24460e4b93f4f0c5d92d48d", "file": "bios/CDTV Extended-ROM v1.0 (1991)(Commodore)(CDTV)[!].rom" }, { "md5": "85ad74194e87c08904327de1a9443b7a", "file": "bios/Kickstart v1.2 r33.180 (1986)(Commodore)(A500-A1000-A2000)[!].rom" }, { "md5": "68c9c0826f6c0ca20546d588ee77391c", "file": "bios/Kickstart v1.2 rev 33.166 (1986)(Commodore)(A1000).rom" }, { "md5": "192d6d950d0ed3df8040b788502831c2", "file": "bios/Kickstart v1.3 r34.5 (1987)(Commodore)(A500-A1000-A2000-CDTV)[o].rom" }, { "md5": "82a21c1890cae844b3df741f2762d48d", "file": "bios/Kickstart v1.3 r34.5 (1987)(Commodore)(A500-A1000-A2000-CDTV)[!].rom" }, { "md5": "dc10d7bdd1b6f450773dfb558477c230", "file": "bios/Kickstart v2.04 r37.175 (1991)(Commodore)(A500+)[!].rom" }, { "md5": "465646c9b6729f77eea5314d1f057951", "file": "bios/Kickstart v2.05 r37.350 (1992)(Commodore)(A600HD)[!].rom" }, { "md5": "5f8924d013dd57a89cf349f4cdedc6b1", "file": "bios/Kickstart v3.1 r40.60 (1993)(Commodore)(CD32).rom" }, { "md5": "646773759326fbac3b2311fd8c8793ee", "file": "bios/Kickstart v3.1 r40.68 (1993)(Commodore)(A1200)[!].rom" }, { "md5": "413590e50098a056cfec418d3df0212d", "file": "bios/Kickstart v3.1 r40.68 (1993)(Commodore)(A3000).rom" }, { "md5": "9bdedde6a4f33555b4a270c8ca53297d", "file": "bios/Kickstart v3.1 r40.68 (1993)(Commodore)(A4000).rom" }, { "md5": "85ad74194e87c08904327de1a9443b7a", "file": "bios/kick33180.A500" }, { "md5": "82a21c1890cae844b3df741f2762d48d", "file": "bios/kick34005.A500" }, { "md5": "dc10d7bdd1b6f450773dfb558477c230", "file": "bios/kick37175.A500" }, { "md5": "5f8924d013dd57a89cf349f4cdedc6b1", "file": "bios/kick40060.CD32" }, { "md5": "bb72565701b1b6faece07d68ea5da639", "file": "bios/kick40060.CD32.ext" }, { "md5": "e40a5dfb3d017ba8779faba30cbd1c8e", "file": "bios/kick40063.A600" }, { "md5": "646773759326fbac3b2311fd8c8793ee", "file": "bios/kick40068.A1200" }, { "md5": "9bdedde6a4f33555b4a270c8ca53297d", "file": "bios/kick40068.A4000" }, { "md5": "bb72565701b1b6faece07d68ea5da639", "file": "bios/CD32 Extended-ROM r40.60 (1993)(Commodore)(CD32).rom" } ] }, # ---------- Fujistu FM-Towns ---------- # # https://github.com/captainys/TOWNSEMU "fmtowns": { "name": "Fujistu FM-Towns", "biosFiles": [ { "md5": "8fa4e553f28cfc0c30a0a1e589799942", "file": "bios/fmtowns/FMT_DIC.ROM" }, { "md5": "0585b19930d4a7f4c71bcc8a33746588", "file": "bios/fmtowns/FMT_DOS.ROM" }, { "md5": "ac0c7021e9bf48ca84b51ab651169a88", "file": "bios/fmtowns/FMT_F20.ROM" }, { "md5": "b91300e55b70227ce98b59c5f02fa8dd", "file": "bios/fmtowns/FMT_FNT.ROM" }, { "md5": "86fb6f7280689259f0ca839dd3dd6cde", "file": "bios/fmtowns/FMT_SYS.ROM" }, { "md5": "", "file": "bios/fmtmarty.zip" }, { "md5": "6618519b2c104cf9b7e71a48381b44a9", "zippedFile": "mrom.m36", "file": "bios/fmtmarty.zip"}, { "md5": "75a5c7afb4bc8221bab8cf24db417950", "zippedFile": "mrom.m37", "file": "bios/fmtmarty.zip"}, { "md5": "", "file": "bios/fmtowns.zip" }, { "md5": "34847786d7de94b5d1133c956ab1d75d", "zippedFile": "fmt_dic.rom", "file": "bios/fmtowns.zip"}, { "md5": "0585b19930d4a7f4c71bcc8a33746588", "zippedFile": "fmt_dos.rom", "file": "bios/fmtowns.zip"}, { "md5": "eb44f2093f51eb7159f03e170b13af76", "zippedFile": "fmt_fnt.rom", "file": "bios/fmtowns.zip"}, { "md5": "feaf8c5675151e00cfe3ad27673bff29", "zippedFile": "fmt_sys.rom", "file": "bios/fmtowns.zip"}, { "md5": "", "file": "bios/fmtownsux.zip" }, { "md5": "8fa4e553f28cfc0c30a0a1e589799942", "zippedFile": "fmt_dic.rom", "file": "bios/fmtownsux.zip"}, { "md5": "03c8fac9a5f5f5f35fb5de5a5d0d018f", "zippedFile": "fmt_dos_a.rom", "file": "bios/fmtownsux.zip"}, { "md5": "b91300e55b70227ce98b59c5f02fa8dd", "zippedFile": "fmt_fnt.rom", "file": "bios/fmtownsux.zip"}, { "md5": "90b5e01d42aaa93e8f4503a5e94e120b", "zippedFile": "fmt_sys_a.rom", "file": "bios/fmtownsux.zip"}, { "md5": "1a15f6c1b58ec7e5f850118610a787a7", "zippedFile": "mytownsux.rom", "file": "bios/fmtownsux.zip"} ] }, # Magnavox and Philips "o2em": { "name": "Odyssey 2", "biosFiles": [ { "md5": "562d5ebf9e030a40d6fabfc2f33139fd", "file": "bios/o2rom.bin" }, { "md5": "f1071cdb0b6b10dde94d3bc8a6146387", "file": "bios/c52.bin" }, { "md5": "c500ff71236068e0dc0d0603d265ae76", "file": "bios/g7400.bin" }, { "md5": "279008e4a0db2dc5f1c048853b033828", "file": "bios/jopac.bin" } ] }, # Mattel "intellivision": { "name": "Mattel Intellivision", "biosFiles": [ { "md5": "62e761035cb657903761800f4437b8af", "file": "bios/exec.bin" }, { "md5": "0cd5946c6473e42e8e4c2137785e427f", "file": "bios/grom.bin" }, { "md5": "2e72a9a2b897d330a35c8b07a6146c52", "file": "bios/ECS.bin" }, { "md5": "d5530f74681ec6e0f282dab42e6b1c5f", "file": "bios/IVOICE.bin" } ] }, # Microsoft "msx": { "name": "MSX", "biosFiles": [ { "md5": "", "file": "bios/Machines/Forte II Games - Pesadelo/config.ini" }, { "md5": "", "file": "bios/Machines/Forte II Games - Pesadelo/pesadelo.rom" }, { "md5": "", "file": "bios/Machines/MSX/config.ini" }, { "md5": "", "file": "bios/Machines/MSX/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX/MSX.ROM" }, { "md5": "", "file": "bios/Machines/MSX/MSX2.ROM" }, { "md5": "", "file": "bios/Machines/MSX/MSX2EXT.ROM" }, { "md5": "", "file": "bios/Machines/MSX/MSX2P.ROM" }, { "md5": "", "file": "bios/Machines/MSX/MSX2PEXT.ROM" }, { "md5": "", "file": "bios/Machines/MSX/MSXDOS2.ROM" }, { "md5": "", "file": "bios/Machines/MSX - Al Alamiah AX-170/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Arabic/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Brazilian/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Brazilian/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX - C-BIOS/cbios.txt" }, { "md5": "", "file": "bios/Machines/MSX - C-BIOS/cbios_logo_msx1.rom" }, { "md5": "", "file": "bios/Machines/MSX - C-BIOS/cbios_main_msx1.rom" }, { "md5": "", "file": "bios/Machines/MSX - C-BIOS/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Canon V-10/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Canon V-20/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Daewoo DPC-100/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Daewoo DPC-180/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Daewoo DPC-200/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Estonian/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Frael Bruc 100-1/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - French/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - German/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - German/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX - Goldstar FC-200/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Gradiente Expert 1.0/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Gradiente Expert 1.1/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Gradiente Expert 1.3/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Gradiente Expert DDPlus/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Gradiente Expert Plus/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Japanese/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Japanese/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX - JVC HC-7GB/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Korean/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Korean/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX - Mitsubishi ML-F80/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Mitsubishi ML-FX1/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - National CF-1200/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Panasonic FS-A1/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Panasonic FS-A1 (a)/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Panasonic FS-A1F/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Panasonic FS-A1FM/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Panasonic FS-A1MK2/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Philips NMS-8220/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Philips NMS-8220 (a)/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Philips NMS-8245/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Philips NMS-8245F/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Philips NMS-8250/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Philips NMS-8255/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Philips NMS-8280/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Philips NMS-8280G/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Philips VG-8230/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Philips VG-8235/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sharp Epcom HotBit 1.2/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sharp Epcom HotBit 1.3b/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sharp Epcom HotBit 1.3p/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sony HB-10P/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sony HB-201/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sony HB-201P/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sony HB-20P/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sony HB-501P/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sony HB-55D/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sony HB-55P/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sony HB-75D/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sony HB-75P/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Spanish/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Spectravideo SVI-728/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Spectravideo SVI-738/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Spectravideo SVI-738-2 CUC/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Spectravideo SVI-738-2 JP Grobler/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Spectravideo SVI-738-2 LC Grosso/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Swedish/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Talent TPC-310/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Toshiba HX-23/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Toshiba HX-23F/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Virtual Haesung Console/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Yamaha CX7M/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Yamaha CX7M-128/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX2+/MSX.ROM" }, { "md5": "", "file": "bios/Machines/MSX2+/MSX2.ROM" }, { "md5": "", "file": "bios/Machines/MSX2+/MSX2EXT.ROM" }, { "md5": "", "file": "bios/Machines/MSX2+/MSX2P.ROM" }, { "md5": "", "file": "bios/Machines/MSX2+/MSX2PEXT.ROM" }, { "md5": "", "file": "bios/Machines/MSX2+/MSXDOS2.ROM" }, { "md5": "", "file": "bios/Machines/MSX2+ - Brazilian/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+ - C-BIOS/cbios.txt" }, { "md5": "", "file": "bios/Machines/MSX2+ - C-BIOS/cbios_logo_msx2+.rom" }, { "md5": "", "file": "bios/Machines/MSX2+ - C-BIOS/cbios_main_msx2+.rom" }, { "md5": "", "file": "bios/Machines/MSX2+ - C-BIOS/cbios_music.rom" }, { "md5": "", "file": "bios/Machines/MSX2+ - C-BIOS/cbios_sub.rom" }, { "md5": "", "file": "bios/Machines/MSX2+ - C-BIOS/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+ - Ciel Expert 3 IDE/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+ - Ciel Expert 3 Turbo/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Spectravideo SVI-738 Swedish/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Swedish/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Swedish/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX - Talent DPC-200/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Talent DPC-200A/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Toshiba HX-10/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Toshiba HX-10S/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Toshiba HX-20/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Yamaha CX5M-1/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Yamaha CX5M-128/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Yamaha CX5M-2/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Yamaha CX5MII/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Yamaha YIS303/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Yamaha YIS503/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Yamaha YIS503F/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Yamaha YIS503II/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Yamaha YIS503IIR/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Yamaha YIS503M/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Yashica YC-64/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Yeno DPC-64/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Yeno MX64/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX2/MSX.ROM" }, { "md5": "", "file": "bios/Machines/MSX2/MSX2.ROM" }, { "md5": "", "file": "bios/Machines/MSX2/MSX2EXT.ROM" }, { "md5": "", "file": "bios/Machines/MSX2/MSX2P.ROM" }, { "md5": "", "file": "bios/Machines/MSX2/MSX2PEXT.ROM" }, { "md5": "", "file": "bios/Machines/MSX2/MSXDOS2.ROM" }, { "md5": "", "file": "bios/Machines/MSX2 - Al Alamiah AX-350/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Al Alamiah AX-370/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Arabic/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Arabic/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX2 - Brazilian/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Brazilian/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX2 - C-BIOS/cbios.txt" }, { "md5": "", "file": "bios/Machines/MSX2 - C-BIOS/cbios_logo_msx2.rom" }, { "md5": "", "file": "bios/Machines/MSX2 - C-BIOS/cbios_main_msx2.rom" }, { "md5": "", "file": "bios/Machines/MSX2 - C-BIOS/cbios_sub.rom" }, { "md5": "", "file": "bios/Machines/MSX2 - C-BIOS/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Daewoo CPC-300/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Daewoo CPC-300E/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Daewoo CPC-400/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Daewoo CPC-400S/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Estonian/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - French/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - French/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX2 - German/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - German/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX2 - Gradiente Expert 2.0/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Japanese/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Japanese/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX2 - Korean/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Korean/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX2 - National FS-4500/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - National FS-4600/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - National FS-4700/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - National FS-5000/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - National FS-5500F1/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - National FS-5500F2/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Daewoo DPC-200E/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - National CF-2000/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sharp Epcom HotBit 1.1/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Spectravideo SVI-738 Henrik Gilvad/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Yamaha YIS503IIR Estonian/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Only PSG/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Only PSG/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX2 - Philips VG-8235F/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Spanish/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Spanish/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX2+ - European/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - National CF-2700/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - National CF-3000/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - National CF-3300/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - National FS-1300/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - National FS-4000/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Olympia PHC-2/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Olympia PHC-28/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Panasonic CF-2700G/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Philips NMS-801/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Philips VG-8000/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Philips VG-8010/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Philips VG-8010F/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Philips VG-8020-00/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Philips VG-8020-20/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Philips VG-8020F/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Pioneer PX-7/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Pioneer PX-V60/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Russian/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sanyo MPC-100/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sanyo MPC-64/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sanyo PHC-28L/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sanyo PHC-28S/config.ini" }, { "md5": "", "file": "bios/Machines/MSX - Sanyo Wavy MPC-10/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+ - Gradiente Expert AC88+/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+ - Gradiente Expert DDX+/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+ - MSXPLAYer 2003/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+ - Panasonic FS-A1FX/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+ - Panasonic FS-A1WSX/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+ - Panasonic FS-A1WX/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+ - Panasonic FS-A1WX (a)/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+ - Sanyo Wavy PHC-35J/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+ - Sanyo Wavy PHC-70FD1/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+ - Sanyo Wavy PHC-70FD2/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+ - Sony HB-F1XDJ/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+ - Sony HB-F1XV/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2+ - Sony HB-F9S+/config.ini" }, { "md5": "", "file": "bios/Machines/MSXturboR/config.ini" }, { "md5": "", "file": "bios/Machines/MSXturboR - European/config.ini" }, { "md5": "", "file": "bios/Machines/MSXturboR - Panasonic FS-A1GT/config.ini" }, { "md5": "", "file": "bios/Machines/MSXturboR - Panasonic FS-A1ST/config.ini" }, { "md5": "", "file": "bios/Machines/MSXturboR - Panasonic FS-A1ST (a)/config.ini" }, { "md5": "", "file": "bios/Machines/MSXturboR - Panasonic FS-A1ST (b)/config.ini" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2G.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXDOS23.ROM" }, { "md5": "", "file": "bios/Machines/Shared Roms/ARAB1.ROM" }, { "md5": "", "file": "bios/Machines/Shared Roms/ARABIC.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/BEERIDE.ROM" }, { "md5": "", "file": "bios/Machines/Shared Roms/FMPAC.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/GCVMX80.ROM" }, { "md5": "", "file": "bios/Machines/Shared Roms/HANGUL.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/KANJI.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MICROSOLDISK.ROM" }, { "md5": "", "file": "bios/Machines/Shared Roms/MOONSOUND.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2AR.ROM" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2AREXT.ROM" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2BR.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2BREXT.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2EXT.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2FR.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2FREXT.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2GEXT.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2HAN.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2J.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2JEXT.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2KR.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2KREXT.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2P.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2PEXT.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2PMUS.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2R.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2R2.ROM" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2REXT.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2SE.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2SP.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSX2SPEXT.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXAR.ROM" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXBR.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXDOS2.ROM" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXFR.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXG.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXHAN.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXJ.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXKANJI.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXKR.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXR.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXR2.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXSE.ROM" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXSP.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXTR.ROM" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXTREXT.ROM" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXTRMUS.ROM" }, { "md5": "", "file": "bios/Machines/Shared Roms/MSXTROPT.ROM" }, { "md5": "", "file": "bios/Machines/Shared Roms/NATIONALDISK.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/NOVAXIS.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/nowindDos1.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/nowindDos2.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/PAINT.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/PANASONICDISK.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/PHILIPSDISK.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/RS232.ROM" }, { "md5": "", "file": "bios/Machines/Shared Roms/Shared.txt" }, { "md5": "", "file": "bios/Machines/Shared Roms/SUNRISEIDE.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/SWP.rom" }, { "md5": "", "file": "bios/Machines/Shared Roms/XBASIC2.rom" }, { "md5": "", "file": "bios/Machines/SVI - Spectravideo SVI-318/config.ini" }, { "md5": "", "file": "bios/Machines/SVI - Spectravideo SVI-318/svi318.rom" }, { "md5": "", "file": "bios/Machines/SVI - Spectravideo SVI-328/config.ini" }, { "md5": "", "file": "bios/Machines/SVI - Spectravideo SVI-328/svi328.rom" }, { "md5": "", "file": "bios/Machines/SVI - Spectravideo SVI-328 80 Column/config.ini" }, { "md5": "", "file": "bios/Machines/SVI - Spectravideo SVI-328 80 Column/svi328a.rom" }, { "md5": "", "file": "bios/Machines/SVI - Spectravideo SVI-328 80 Column/svi806.rom" }, { "md5": "", "file": "bios/Machines/SVI - Spectravideo SVI-328 80 Swedish/config.ini" }, { "md5": "", "file": "bios/Machines/SVI - Spectravideo SVI-328 80 Swedish/svi328a.rom" }, { "md5": "", "file": "bios/Machines/SVI - Spectravideo SVI-328 80 Swedish/svi806se.rom" }, { "md5": "", "file": "bios/Machines/SVI - Spectravideo SVI-328 MK2/config.ini" }, { "md5": "", "file": "bios/Machines/SVI - Spectravideo SVI-328 MK2/svi328a.rom" }, { "md5": "", "file": "bios/Machines/SVI - Spectravideo SVI-328 MK2/svi806.rom" }, { "md5": "", "file": "bios/Machines/Turbo-R/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX2 - Philips VG-8240/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Russian/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Russian/hardwareconfig.xml" }, { "md5": "", "file": "bios/Machines/MSX2 - Sanyo Wavy MPC-25FD/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sanyo Wavy PHC-23/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sharp Epcom HotBit 2.0/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-F1/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-F1II/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-F1XD/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-F1XDMK2/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-F500/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-F500P/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-F700D/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-F700F/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-F700P/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-F700S/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-F900/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-F900 (a)/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-F9P/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-F9P Russian/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-F9S/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-G900AP/config.ini" }, { "md5": "", "file": "bios/Machines/MSX2 - Sony HB-G900P/config.ini" } ] }, # NEC "pcengine": { "name": "PC Engine", "biosFiles": [ { "md5": "ff1a674273fe3540ccef576376407d1d", "file": "bios/syscard3.pce" } ] }, "pcfx": { "name": "PC-FX", "biosFiles": [ { "md5": "08e36edbea28a017f79f8d4f7ff9b6d7", "file": "bios/pcfx.rom" } ] }, "supergrafx": { "name": "Supergrafx", "biosFiles": [ { "md5": "ff1a674273fe3540ccef576376407d1d", "file": "bios/syscard3.pce" }, { "md5": "", "file": "bios/syscard2.pce" }, { "md5": "", "file": "bios/syscard1.pce" }, { "md5": "", "file": "bios/gexpress.pce" } ] }, # Nintendo "fds": { "name": "Nintendo Family Computer Disk System", "biosFiles": [ { "md5": "7bfe8c0540ed4bd6a0f1e2a0f0118ced", "file": "bios/NstDatabase.xml" }, { "md5": "ca30b50f880eb660a320674ed365ef7a", "file": "bios/disksys.rom" } ] }, "gb": { "name": "Game Boy", "biosFiles": [ { "md5": "32fbbd84168d3482956eb3c5051637f5", "file": "bios/gb_bios.bin" }, { "md5": "dbfce9db9deaa2567f6a84fde55f9680", "file": "bios/gbc_bios.bin" } ] }, "gbc": { "name": "Game Boy Color", "biosFiles": [ { "md5": "32fbbd84168d3482956eb3c5051637f5", "file": "bios/gb_bios.bin" }, { "md5": "dbfce9db9deaa2567f6a84fde55f9680", "file": "bios/gbc_bios.bin" } ] }, "gba": { "name": "Game Boy Advance", "biosFiles": [ { "md5": "a860e8c0b6d573d191e4ec7db1b1e4f6", "file": "bios/gba_bios.bin" }, { "md5": "32fbbd84168d3482956eb3c5051637f5", "file": "bios/gb_bios.bin" }, { "md5": "dbfce9db9deaa2567f6a84fde55f9680", "file": "bios/gbc_bios.bin" }, { "md5": "d574d4f9c12f305074798f54c091a8b4", "file": "bios/sgb_bios.bin" } ] }, "n64": { "name": "Nintendo 64", "biosFiles": [ { "md5": "8d3d9f294b6e174bc7b1d2fd1c727530", "file": "bios/64DD_IPL.bin" } ] }, "nds": { "name": "Nintendo DS", "biosFiles": [ { "md5": "145eaef5bd3037cbc247c213bb3da1b3", "file": "bios/firmware.bin" }, { "md5": "df692a80a5b1bc90728bc3dfc76cd948", "file": "bios/bios7.bin" }, { "md5": "a392174eb3e572fed6447e956bde4b25", "file": "bios/bios9.bin" } ] }, "satellaview": { "name": "Satellaview", "biosFiles": [ { "md5": "fed4d8242cfbed61343d53d48432aced", "file": "bios/BS-X.bin" } ] }, "sufami": { "name": "Sufami", "biosFiles": [ { "md5": "d3a44ba7d42a74d3ac58cb9c14c6a5ca", "file": "bios/STBIOS.bin" } ] }, # Panasonic, Sanyo and Goldstar "3do": { "name": "3DO", "biosFiles": [ { "md5": "f47264dd47fe30f73ab3c010015c155b", "file": "bios/panafz1.bin" }, { "md5": "51f2f43ae2f3508a14d9f56597e2d3ce", "file": "bios/panafz10.bin" }, { "md5": "8639fd5e549bd6238cfee79e3e749114", "file": "bios/goldstar.bin" }, { "md5": "35fa1a1ebaaeea286dc5cd15487c13ea", "file": "bios/sanyotry.bin" }, { "md5": "8970fc987ab89a7f64da9f8a8c4333ff", "file": "bios/3do_arcade_saot.bin" } ] }, # Sega "naomi": { "name": "Naomi", "biosFiles": [ { "md5": "e63d892cdb8b532351dc7020bb60b6f4", "file": "bios/dc/naomi.zip" } ] }, "atomiswave": { "name": "Atomiswave", "biosFiles": [ { "md5": "0ec5ae5b5a5c4959fa8b43fcf8687f7c", "file": "bios/dc/awbios.zip" } ] }, "dreamcast": { "name": "Dreamcast", "biosFiles": [ { "md5": "e10c53c2f8b90bab96ead2d368858623", "file": "bios/dc/dc_boot.bin" }, { "md5": "0a93f7940c455905bea6e392dfde92a4", "file": "bios/dc/dc_flash.bin" } ] }, "gamegear": { "name": "Game Gear", "biosFiles": [ { "md5": "672e104c3be3a238301aceffc3b23fd6", "file": "bios/bios.gg" } ] }, "mastersystem": { "name": "MasterSystem", "biosFiles": [ { "md5": "840481177270d5642a14ca71ee72844c", "file": "bios/bios_E.sms" }, { "md5": "840481177270d5642a14ca71ee72844c", "file": "bios/bios_U.sms" }, { "md5": "24a519c53f67b00640d0048ef7089105", "file": "bios/bios_J.sms" } ] }, "saturn": { "name": "Sega Saturn", "biosFiles": [ { "md5": "af5828fdff51384f99b3c4926be27762", "file": "bios/saturn_bios.bin" }, { "md5": "85ec9ca47d8f6807718151cbcca8b964", "file": "bios/sega_101.bin" }, { "md5": "3240872c70984b6cbfda1586cab68dbe", "file": "bios/mpr-17933.bin" }, { "md5": "255113ba943c92a54facd25a10fd780c", "file": "bios/mpr-18811-mx.ic1" }, { "md5": "1cd19988d1d72a3e7caa0b73234c96b4", "file": "bios/mpr-19367-mx.ic1" }, { "md5": "53a094ad3a188f86de4e64624fe9b3ca", "file": "bios/stvbios.zip" } ] }, "segacd": { "name": "Sega CD", "biosFiles": [ { "md5": "e66fa1dc5820d254611fdcdba0662372", "file": "bios/bios_CD_E.bin" }, { "md5": "854b9150240a198070150e4566ae1290", "file": "bios/bios_CD_U.bin" }, { "md5": "278a9397d192149e84e820ac621a8edd", "file": "bios/bios_CD_J.bin" } ] }, "naomi": { "name": "Naomi", "biosFiles": [ { "md5": "3bffafac42a7767d8dcecf771f5552ba", "file": "bios/dc/naomi_boot.bin" }, { "md5": "e63d892cdb8b532351dc7020bb60b6f4", "file": "bios/dc/naomi.zip" } ] }, "sc-3000": { "name": "SC-3000", "biosFiles": [ { "md5": "", "file": "bios/Machines/SEGA - SC-3000/config.ini" } ] }, # Sharp "x68000": { "name": "Sharp x68000", "biosFiles": [ { "md5": "", "file": "bios/keropi/iplrom.dat" }, { "md5": "", "file": "bios/keropi/iplrom30.dat" }, { "md5": "", "file": "bios/keropi/iplromco.dat" }, { "md5": "", "file": "bios/keropi/iplromxv.dat" }, { "md5": "", "file": "bios/keropi/cgrom.dat" } ] }, # SNK "neogeo": { "name": "NeoGeo", "biosFiles": [ { "md5": "", "file": "neogeo/neogeo.zip" } ] }, "neogeocd": { "name": "NeoGeo CD", "biosFiles": [ { "md5": "", "file": "neogeo/neogeo.zip" }, { "md5": "f39572af7584cb5b3f70ae8cc848aba2", "file": "bios/neocd/neocd_z.rom"} ] }, # Sony Computer Entertainment "psx": { "name": "PSX", "biosFiles": [ { "md5": "8dd7d5296a650fac7319bce665a6a53c", "file": "bios/scph5500.bin" }, { "md5": "490f666e1afb15b7362b406ed1cea246", "file": "bios/scph5501.bin" }, { "md5": "32736f17079d0b2b7024407c39bd3050", "file": "bios/scph5502.bin" } ] }, # Ports "Diablo": { "name": "Diablo 1 (devilutionx) ", "biosFiles": [ { "md5": "68f049866b44688a7af65ba766bef75a", "file": "ports/diablo/diabdat.mpq" } ] }, "Hellfire": { "name": "Diablo 1: Hellfire (devilutionx) ", "biosFiles": [ { "md5": "", "file": "ports/diablo/hellfire.mpq" }, { "md5": "", "file": "ports/diablo/hfmonk.mpq" }, { "md5": "", "file": "ports/diablo/hfmusic.mpq" }, { "md5": "", "file": "ports/diablo/hfvoice.mpq" }, { "md5": "68f049866b44688a7af65ba766bef75a", "file": "ports/diablo/diabdat.mpq" }, ] }, "Dinothawr": { "name": "Dinothawr", "biosFiles": [ { "md5": "", "file": "ports/dinothawr/level_3-3.tmx" }, { "md5": "", "file": "ports/dinothawr/level_7-2.tmx" }, { "md5": "", "file": "ports/dinothawr/assets/dino_right_walk2.png" }, { "md5": "", "file": "ports/dinothawr/assets/.directory" }, { "md5": "", "file": "ports/dinothawr/assets/bg/bg1.ogg" }, { "md5": "", "file": "ports/dinothawr/assets/bg/bg2.ogg" }, { "md5": "", "file": "ports/dinothawr/assets/bg/bg3.ogg" }, { "md5": "", "file": "ports/dinothawr/assets/bg/bg4.ogg" }, { "md5": "", "file": "ports/dinothawr/assets/bg/bg5.ogg" }, { "md5": "", "file": "ports/dinothawr/assets/bg/bg8.ogg" }, { "md5": "", "file": "ports/dinothawr/assets/bg/theme.ogg" }, { "md5": "", "file": "ports/dinothawr/assets/bg.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino.sprite" }, { "md5": "", "file": "ports/dinothawr/assets/dinopush_down.png" }, { "md5": "", "file": "ports/dinothawr/assets/dinopush_left.png" }, { "md5": "", "file": "ports/dinothawr/assets/dinopush_right.png" }, { "md5": "", "file": "ports/dinothawr/assets/dinopush_up.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_cheer.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_down.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_down_slide1.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_down_slide2.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_down_walk1.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_down_walk2.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_down_walk3.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_down_walk4.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_left.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_left_slide1.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_left_slide2.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_left_walk1.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_left_walk2.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_left_walk3.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_left_walk4.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_right.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_right_slide1.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_right_slide2.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_right_walk1.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_right_walk3.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_right_walk4.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_up.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_up_slide1.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_up_slide2.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_up_walk1.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_up_walk2.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_up_walk3.png" }, { "md5": "", "file": "ports/dinothawr/assets/dino_up_walk4.png" }, { "md5": "", "file": "ports/dinothawr/assets/ending.png" }, { "md5": "", "file": "ports/dinothawr/assets/finished.png" }, { "md5": "", "file": "ports/dinothawr/assets/font.png" }, { "md5": "", "file": "ports/dinothawr/assets/frozen.sprite" }, { "md5": "", "file": "ports/dinothawr/assets/frozen_dino_block.png" }, { "md5": "", "file": "ports/dinothawr/assets/frozen_dino_cheer.png" }, { "md5": "", "file": "ports/dinothawr/assets/frozen_dino_defrost1.png" }, { "md5": "", "file": "ports/dinothawr/assets/frozen_dino_defrost2.png" }, { "md5": "", "file": "ports/dinothawr/assets/frozen_dino_down.png" }, { "md5": "", "file": "ports/dinothawr/assets/level_select_bg.png" }, { "md5": "", "file": "ports/dinothawr/assets/lock.png" }, { "md5": "", "file": "ports/dinothawr/assets/nav.sprite" }, { "md5": "", "file": "ports/dinothawr/assets/sfx/chapter_locked.wav" }, { "md5": "", "file": "ports/dinothawr/assets/sfx/dino_jump.wav" }, { "md5": "", "file": "ports/dinothawr/assets/sfx/dino_push.wav" }, { "md5": "", "file": "ports/dinothawr/assets/sfx/frozen_dino_melt.wav" }, { "md5": "", "file": "ports/dinothawr/assets/sfx/ice_bump.wav" }, { "md5": "", "file": "ports/dinothawr/assets/sfx/level_next.wav" }, { "md5": "", "file": "ports/dinothawr/assets/sfxr/block_slide.sfs" }, { "md5": "", "file": "ports/dinothawr/assets/sfxr/chapter_locked.sfs" }, { "md5": "", "file": "ports/dinothawr/assets/sfxr/dino_bump.sfs" }, { "md5": "", "file": "ports/dinothawr/assets/sfxr/dino_jump.sfs" }, { "md5": "", "file": "ports/dinothawr/assets/sfxr/dino_push.sfs" }, { "md5": "", "file": "ports/dinothawr/assets/sfxr/frozen_dino_melt.sfs" }, { "md5": "", "file": "ports/dinothawr/assets/sfxr/ice_bump.sfs" }, { "md5": "", "file": "ports/dinothawr/assets/sfxr/level_complete.sfs" }, { "md5": "", "file": "ports/dinothawr/assets/sfxr/level_failed.sfs" }, { "md5": "", "file": "ports/dinothawr/assets/sfxr/level_next.sfs" }, { "md5": "", "file": "ports/dinothawr/assets/sfxr/level_select.sfs" }, { "md5": "", "file": "ports/dinothawr/assets/sfxr/rock_bump.sfs" }, { "md5": "", "file": "ports/dinothawr/assets/sfxr/slide_ice.sfs" }, { "md5": "", "file": "ports/dinothawr/assets/sfxr/slide_snow.sfs" }, { "md5": "", "file": "ports/dinothawr/assets/tileset-ground.png" }, { "md5": "", "file": "ports/dinothawr/assets/tileset-misc.png" }, { "md5": "", "file": "ports/dinothawr/assets/tileset-pushblocks.png" }, { "md5": "", "file": "ports/dinothawr/assets/tileset-rocks.png" }, { "md5": "", "file": "ports/dinothawr/assets/tileset-slippery.png" }, { "md5": "", "file": "ports/dinothawr/assets/titlescreen.png" }, { "md5": "", "file": "ports/dinothawr/dino.font" }, { "md5": "", "file": "ports/dinothawr/dinothawr.game" }, { "md5": "", "file": "ports/dinothawr/hq2x.glsl" }, { "md5": "", "file": "ports/dinothawr/hq2x.glslp" }, { "md5": "", "file": "ports/dinothawr/level_1-1.tmx" }, { "md5": "", "file": "ports/dinothawr/level_1-2.tmx" }, { "md5": "", "file": "ports/dinothawr/level_1-3.tmx" }, { "md5": "", "file": "ports/dinothawr/level_1-4.tmx" }, { "md5": "", "file": "ports/dinothawr/level_1-5.tmx" }, { "md5": "", "file": "ports/dinothawr/level_10-1.tmx" }, { "md5": "", "file": "ports/dinothawr/level_10-2.tmx" }, { "md5": "", "file": "ports/dinothawr/level_10-3.tmx" }, { "md5": "", "file": "ports/dinothawr/level_10-4.tmx" }, { "md5": "", "file": "ports/dinothawr/level_10-5.tmx" }, { "md5": "", "file": "ports/dinothawr/level_2-1.tmx" }, { "md5": "", "file": "ports/dinothawr/level_2-2.tmx" }, { "md5": "", "file": "ports/dinothawr/level_2-3.tmx" }, { "md5": "", "file": "ports/dinothawr/level_2-4.tmx" }, { "md5": "", "file": "ports/dinothawr/level_2-5.tmx" }, { "md5": "", "file": "ports/dinothawr/level_3-1.tmx" }, { "md5": "", "file": "ports/dinothawr/level_3-2.tmx" }, { "md5": "", "file": "ports/dinothawr/level_3-4.tmx" }, { "md5": "", "file": "ports/dinothawr/level_3-5.tmx" }, { "md5": "", "file": "ports/dinothawr/level_4-1.tmx" }, { "md5": "", "file": "ports/dinothawr/level_4-2.tmx" }, { "md5": "", "file": "ports/dinothawr/level_4-3.tmx" }, { "md5": "", "file": "ports/dinothawr/level_4-4.tmx" }, { "md5": "", "file": "ports/dinothawr/level_4-5.tmx" }, { "md5": "", "file": "ports/dinothawr/level_5-1.tmx" }, { "md5": "", "file": "ports/dinothawr/level_5-2.tmx" }, { "md5": "", "file": "ports/dinothawr/level_5-3.tmx" }, { "md5": "", "file": "ports/dinothawr/level_5-4.tmx" }, { "md5": "", "file": "ports/dinothawr/level_5-5.tmx" }, { "md5": "", "file": "ports/dinothawr/level_6-1.tmx" }, { "md5": "", "file": "ports/dinothawr/level_6-2.tmx" }, { "md5": "", "file": "ports/dinothawr/level_6-3.tmx" }, { "md5": "", "file": "ports/dinothawr/level_6-4.tmx" }, { "md5": "", "file": "ports/dinothawr/level_6-5.tmx" }, { "md5": "", "file": "ports/dinothawr/level_7-1.tmx" }, { "md5": "", "file": "ports/dinothawr/level_7-3.tmx" }, { "md5": "", "file": "ports/dinothawr/level_7-4.tmx" }, { "md5": "", "file": "ports/dinothawr/level_7-5.tmx" }, { "md5": "", "file": "ports/dinothawr/level_8-1.tmx" }, { "md5": "", "file": "ports/dinothawr/level_8-2.tmx" }, { "md5": "", "file": "ports/dinothawr/level_8-3.tmx" }, { "md5": "", "file": "ports/dinothawr/level_8-4.tmx" }, { "md5": "", "file": "ports/dinothawr/level_8-5.tmx" }, { "md5": "", "file": "ports/dinothawr/level_9-1.tmx" }, { "md5": "", "file": "ports/dinothawr/level_9-2.tmx" }, { "md5": "", "file": "ports/dinothawr/level_9-3.tmx" }, { "md5": "", "file": "ports/dinothawr/level_9-4.tmx" }, { "md5": "", "file": "ports/dinothawr/level_9-5.tmx" }, { "md5": "", "file": "ports/dinothawr/overlay.cfg" }, { "md5": "", "file": "ports/dinothawr/overlay.png" }, { "md5": "", "file": "ports/dinothawr/overlay_big.cfg" }, { "md5": "", "file": "ports/dinothawr/overlay_big.png" }, { "md5": "", "file": "ports/dinothawr/RetroArch-0916-233002.png" }, { "md5": "", "file": "ports/dinothawr/RetroArch-0916-233008.png" }, { "md5": "", "file": "ports/dinothawr/scanline.glsl" }, { "md5": "", "file": "ports/dinothawr/stock.glsl" }, { "md5": "", "file": "ports/dinothawr/xbr-lv2-a-pass0.glsl" }, { "md5": "", "file": "ports/dinothawr/xbr-lv2-a.glslp" }, { "md5": "", "file": "ports/dinothawr/xbr-lv2-pass1.glsl" } ] }, "DOOM1": { "name": "DOOM1 (PrBoom)", "biosFiles": [ { "md5": "", "file": "ports/doom/doom1.wad" } ] }, "DOOM2": { "name": "DOOM2 (PrBoom)", "biosFiles": [ { "md5": "", "file": "ports/doom2/doom2.wad" } ] }, "OpenTyrian": { "name": "OpenTyrian", "biosFiles": [ { "md5": "", "file": "ports/opentyrian/cubetxt1.dat" }, { "md5": "", "file": "ports/opentyrian/cubetxt2.dat" }, { "md5": "", "file": "ports/opentyrian/cubetxt3.dat" }, { "md5": "", "file": "ports/opentyrian/cubetxt4.dat" }, { "md5": "", "file": "ports/opentyrian/demo.1" }, { "md5": "", "file": "ports/opentyrian/demo.2" }, { "md5": "", "file": "ports/opentyrian/demo.3" }, { "md5": "", "file": "ports/opentyrian/demo.4" }, { "md5": "", "file": "ports/opentyrian/demo.5" }, { "md5": "", "file": "ports/opentyrian/dpmi16bi.ovl" }, { "md5": "", "file": "ports/opentyrian/estsc.shp" }, { "md5": "", "file": "ports/opentyrian/exitmsg.bin" }, { "md5": "", "file": "ports/opentyrian/levels1.dat" }, { "md5": "", "file": "ports/opentyrian/levels2.dat" }, { "md5": "", "file": "ports/opentyrian/levels3.dat" }, { "md5": "", "file": "ports/opentyrian/levels4.dat" }, { "md5": "", "file": "ports/opentyrian/loudness.awe" }, { "md5": "", "file": "ports/opentyrian/modems.txt" }, { "md5": "", "file": "ports/opentyrian/music.mus" }, { "md5": "", "file": "ports/opentyrian/netarena.pcx" }, { "md5": "", "file": "ports/opentyrian/netfont1.pcx" }, { "md5": "", "file": "ports/opentyrian/netfont2.pcx" }, { "md5": "", "file": "ports/opentyrian/netmega.pcx" }, { "md5": "", "file": "ports/opentyrian/netset.pcx" }, { "md5": "", "file": "ports/opentyrian/newsh#.shp" }, { "md5": "", "file": "ports/opentyrian/newsh0.shp" }, { "md5": "", "file": "ports/opentyrian/newsh1.shp" }, { "md5": "", "file": "ports/opentyrian/newsh2.shp" }, { "md5": "", "file": "ports/opentyrian/newsh3.shp" }, { "md5": "", "file": "ports/opentyrian/newsh4.shp" }, { "md5": "", "file": "ports/opentyrian/newsh5.shp" }, { "md5": "", "file": "ports/opentyrian/newsh6.shp" }, { "md5": "", "file": "ports/opentyrian/newsh7.shp" }, { "md5": "", "file": "ports/opentyrian/newsh8.shp" }, { "md5": "", "file": "ports/opentyrian/newsh9.shp" }, { "md5": "", "file": "ports/opentyrian/newsha.shp" }, { "md5": "", "file": "ports/opentyrian/newshb.shp" }, { "md5": "", "file": "ports/opentyrian/newshc.shp" }, { "md5": "", "file": "ports/opentyrian/newshd.shp" }, { "md5": "", "file": "ports/opentyrian/newshe.shp" }, { "md5": "", "file": "ports/opentyrian/newshf.shp" }, { "md5": "", "file": "ports/opentyrian/newshg.shp" }, { "md5": "", "file": "ports/opentyrian/newshh.shp" }, { "md5": "", "file": "ports/opentyrian/newshj.shp" }, { "md5": "", "file": "ports/opentyrian/newshk.shp" }, { "md5": "", "file": "ports/opentyrian/newshl.shp" }, { "md5": "", "file": "ports/opentyrian/newshm.shp" }, { "md5": "", "file": "ports/opentyrian/newshn.shp" }, { "md5": "", "file": "ports/opentyrian/newsho.shp" }, { "md5": "", "file": "ports/opentyrian/newshp.shp" }, { "md5": "", "file": "ports/opentyrian/newshr.shp" }, { "md5": "", "file": "ports/opentyrian/newshs.shp" }, { "md5": "", "file": "ports/opentyrian/newsht.shp" }, { "md5": "", "file": "ports/opentyrian/newshu.shp" }, { "md5": "", "file": "ports/opentyrian/newshv.shp" }, { "md5": "", "file": "ports/opentyrian/newsh^.shp" }, { "md5": "", "file": "ports/opentyrian/newsh~.shp" }, { "md5": "", "file": "ports/opentyrian/order.tfp" }, { "md5": "", "file": "ports/opentyrian/palette.dat" }, { "md5": "", "file": "ports/opentyrian/setup.box" }, { "md5": "", "file": "ports/opentyrian/setup.ini" }, { "md5": "", "file": "ports/opentyrian/setup.int" }, { "md5": "", "file": "ports/opentyrian/shapesw.dat" }, { "md5": "", "file": "ports/opentyrian/shapesx.dat" }, { "md5": "", "file": "ports/opentyrian/shapesy.dat" }, { "md5": "", "file": "ports/opentyrian/shapesz.dat" }, { "md5": "", "file": "ports/opentyrian/shipedit.pcx" }, { "md5": "", "file": "ports/opentyrian/tshp2.pcx" }, { "md5": "", "file": "ports/opentyrian/tyrend.anm" }, { "md5": "", "file": "ports/opentyrian/tyrian.cdt" }, { "md5": "", "file": "ports/opentyrian/tyrian.hdt" }, { "md5": "", "file": "ports/opentyrian/tyrian.ico" }, { "md5": "", "file": "ports/opentyrian/tyrian.pic" }, { "md5": "", "file": "ports/opentyrian/tyrian.shp" }, { "md5": "", "file": "ports/opentyrian/tyrian.snd" }, { "md5": "", "file": "ports/opentyrian/tyrian1.lvl" }, { "md5": "", "file": "ports/opentyrian/tyrian2.lvl" }, { "md5": "", "file": "ports/opentyrian/tyrian3.lvl" }, { "md5": "", "file": "ports/opentyrian/tyrian4.lvl" }, { "md5": "", "file": "ports/opentyrian/tyrianc.shp" }, { "md5": "", "file": "ports/opentyrian/tyrset.pcx" }, { "md5": "", "file": "ports/opentyrian/user1.shp" }, { "md5": "", "file": "ports/opentyrian/user2.shp" }, { "md5": "", "file": "ports/opentyrian/voices.snd" }, { "md5": "", "file": "ports/opentyrian/voicesc.snd" }, { "md5": "", "file": "ports/opentyrian/netterm.int" }, { "md5": "", "file": "ports/opentyrian/newshi.shp" }, { "md5": "", "file": "ports/opentyrian/shapes).dat" } ] }, "Cannonball": { "name": "Cannonball", "biosFiles": [ { "md5": "", "file": "ports/cannonball/epr-10187.88" }, { "md5": "", "file": "ports/cannonball/epr-10327.76" }, { "md5": "", "file": "ports/cannonball/epr-10327a.76" }, { "md5": "", "file": "ports/cannonball/epr-10328.75" }, { "md5": "", "file": "ports/cannonball/epr-10328a.75" }, { "md5": "", "file": "ports/cannonball/epr-10329.58" }, { "md5": "", "file": "ports/cannonball/epr-10329a.58" }, { "md5": "", "file": "ports/cannonball/epr-10330.57" }, { "md5": "", "file": "ports/cannonball/epr-10330a.57" }, { "md5": "", "file": "ports/cannonball/epr-10380.133" }, { "md5": "", "file": "ports/cannonball/epr-10380b.133" }, { "md5": "", "file": "ports/cannonball/epr-10381.132" }, { "md5": "", "file": "ports/cannonball/epr-10381b.132" }, { "md5": "", "file": "ports/cannonball/epr-10382.118" }, { "md5": "", "file": "ports/cannonball/epr-10382b.118" }, { "md5": "", "file": "ports/cannonball/epr-10383.117" }, { "md5": "", "file": "ports/cannonball/epr-10383b.117" }, { "md5": "", "file": "ports/cannonball/mpr-10371.9" }, { "md5": "", "file": "ports/cannonball/mpr-10372.13" }, { "md5": "", "file": "ports/cannonball/mpr-10373.10" }, { "md5": "", "file": "ports/cannonball/mpr-10374.14" }, { "md5": "", "file": "ports/cannonball/mpr-10375.11" }, { "md5": "", "file": "ports/cannonball/mpr-10376.15" }, { "md5": "", "file": "ports/cannonball/mpr-10377.12" }, { "md5": "", "file": "ports/cannonball/mpr-10378.16" }, { "md5": "", "file": "ports/cannonball/opr-10185.11" }, { "md5": "", "file": "ports/cannonball/opr-10186.47" }, { "md5": "", "file": "ports/cannonball/opr-10188.71" }, { "md5": "", "file": "ports/cannonball/opr-10189.70" }, { "md5": "", "file": "ports/cannonball/opr-10190.69" }, { "md5": "", "file": "ports/cannonball/opr-10191.68" }, { "md5": "", "file": "ports/cannonball/opr-10192.67" }, { "md5": "", "file": "ports/cannonball/opr-10193.66" }, { "md5": "", "file": "ports/cannonball/opr-10230.104" }, { "md5": "", "file": "ports/cannonball/opr-10231.103" }, { "md5": "", "file": "ports/cannonball/opr-10232.102" }, { "md5": "", "file": "ports/cannonball/opr-10266.101" }, { "md5": "", "file": "ports/cannonball/opr-10267.100" }, { "md5": "", "file": "ports/cannonball/opr-10268.99" } ] }, "CaveStory": { "name": "Cave Story (nxengine)", "biosFiles": [ { "md5": "", "file": "ports/CaveStory/Doukutsu.exe" } ] }, "Dinothawr": { "name": "Dinothawr", "biosFiles": [ { "md5": "", "file": "ports/dinothawr/dinothawr.game" } ] }, "Quake": { "name": "Quake (tryquake)", "biosFiles": [ { "md5": "", "file": "ports/quake/id1/pak0.pak" } ] }, "REminiscence": { "name": "Flashback (REminiscence)", "biosFiles": [ { "md5": "", "file": "ports/reminiscence/level1.map" } ] }, "RickDangerous": { "name": "Rick Dangerous (xrick)", "biosFiles": [ { "md5": "", "file": "ports/xrick/data.zip" } ] }, "VVVVVV": { "name": "VVVVVV", "biosFiles": [ { "md5": "", "file": "ports/VVVVVV/data.zip" } ] }, "eduke32": { "name": "Duke Nukem 3D", "biosFiles": [ { "md5": "", "file": "ports/eduke/duke3d.grp" } ] }, "sonic1": { "name": "Sonic 1", "biosFiles": [ { "md5": "", "file": "ports/sonic1/Data.rsdk" } ] }, "sonic2": { "name": "Sonic 2", "biosFiles": [ { "md5": "", "file": "ports/sonic2/Data.rsdk" } ] }, "soniccd": { "name": "Sonic CD", "biosFiles": [ { "md5": "", "file": "ports/soniccd/Data.rsdk" } ] }, "sonicmania": { "name": "Sonic Mania", "biosFiles": [ { "md5": "", "file": "ports/sonicmania/Data.rsdk" } ] }, "RigelEngine": { "name": "Duke Nukem 2", "biosFiles": [ { "md5": "", "file": "ports/rigelengine/NUKEM2.CMP" }, { "md5": "", "file": "ports/rigelengine/NUKEM2.F1" }, { "md5": "", "file": "ports/rigelengine/NUKEM2.F2" }, { "md5": "", "file": "ports/rigelengine/NUKEM2.F3" }, { "md5": "", "file": "ports/rigelengine/NUKEM2.F4" }, { "md5": "", "file": "ports/rigelengine/NUKEM2.F5" } ] }, # Philips CDI "cdi": { "name": "Philips CDI", "biosFiles": [ { "md5": "", "file": "bios/same_cdi/bios/cdimono1.zip" }, { "md5": "", "file": "bios/same_cdi/bios/cdimono2.zip" }, { "md5": "", "file": "bios/same_cdi/bios/cdibios.zip" } ] }, } class BiosStatus: MISSING = "MISSING" UNTESTED = "UNTESTED" def md5sum(filename, blocksize=65536): hash = md5() with open(filename, "rb") as f: for block in iter(lambda: f.read(blocksize), b""): hash.update(block) return hash.hexdigest() def checkBios(systems, prefix): missingBios = {} for system in systems.keys(): for file in systems[system]["biosFiles"]: filepath = prefix + "/" + file["file"] if isfile(filepath): md5 = md5sum(filepath) if md5 != file["md5"] and file["md5"] != "": if system not in missingBios: missingBios[system] = {} missingBios[system][file["file"]] = { "status": BiosStatus.UNTESTED, "md5": file["md5"], "file": file["file"] } else: if system not in missingBios: missingBios[system] = {} missingBios[system][file["file"]] = { "status": BiosStatus.MISSING, "md5": file["md5"], "file": file["file"] } return missingBios # Returns True if missing, False if nothing is missing def displayMissingBios(systems, missingBios): sortedMissingBios = OrderedDict(sorted(missingBios.items())) if sortedMissingBios: for system in sortedMissingBios: print("> {}".format(systems[system]["name"])) for file in sortedMissingBios[system].keys(): md5str = "-" if sortedMissingBios[system][file]["md5"] != "": md5str = sortedMissingBios[system][file]["md5"] print("{} {} {}".format(sortedMissingBios[system][file]["status"], md5str, sortedMissingBios[system][file]["file"])) return True else: print("No missing bios") return False def createReadme(systems): for system in sorted(systems): print("{}:".format(systems[system]["name"])) for bios in systems[system]["biosFiles"]: print("{} {}".format(bios["md5"], "/storage/roms/" + bios["file"])) print("") if __name__ == '__main__': if len(sys.argv) == 1: prefix = "/storage/roms/" if displayMissingBios(systems, checkBios(systems, prefix)): exit(2) elif sys.argv[1] == "--createReadme": createReadme(systems) elif len(sys.argv) == 3 and sys.argv[1] in ["--filter", "--strictfilter"]: prefix = "/storage/roms/" lowered_name = sys.argv[2].lower() filtered_systems = {} for system in systems: lowered_system = system.lower() lowered_system_name = systems[system]['name'].lower() if ((lowered_name == lowered_system or lowered_name == lowered_system_name) or (sys.argv[1] == "--filter" and (lowered_name in lowered_system or lowered_name in lowered_system_name))): filtered_systems[system] = systems[system] if len(filtered_systems) == 0: print("No system named {} found".format(sys.argv[2])) exit(1) if displayMissingBios(filtered_systems, checkBios(filtered_systems, prefix)): exit(2) ================================================ FILE: packages/sx05re/emuelec/bin/batocera/batocera-wifi ================================================ #!/bin/bash ACTION=$1 shift do_help() { echo "${1} scanlist" >&2 echo "${1} list" >&2 } remove_last_word() { echo "${@:1:$#-1}" } do_list() { connmanctl services | while read; do if [[ $REPLY == *'wifi_'* ]]; then WITHOUT_PREFIX=${REPLY:4} echo $(remove_last_word $WITHOUT_PREFIX) fi done } do_scanlist() { connmanctl scan wifi >/dev/null 2>/dev/null do_list } case "${ACTION}" in "list") do_list ;; "scanlist") do_scanlist ;; *) do_help "${0}" esac ================================================ FILE: packages/sx05re/emuelec/bin/batocera/emuelec-bluetooth ================================================ #!/usr/bin/python -u ################################################################################ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present ebeem (https://github.com/ebeem) # Modifications made by: # Langerz82 (https://github.com/Langerz82) # wang80919 (https://github.com/wang80919) # Testing done by: # junm6802030 (https://github.com/junm6802030) # Special thanks to everyone who worked on this. ################################################################################ from subprocess import Popen, PIPE, STDOUT from dataclasses import dataclass import time import sys import os from multiprocessing import Process DEBUG = False @dataclass class BluetoothDevice: mac: str name: str alias: str clas: str icon: str paired: bool bounded: bool trusted: bool blocked: bool connected: bool wake_allowed: bool legacy_pairing: bool rssi: int class ShellIO: @staticmethod def execute(cmd: list[str], debug=DEBUG) -> list[str]: if debug: print("> " + " ".join(x for x in cmd)) out: list[str] = [] with Popen(cmd, stdout=PIPE, bufsize=1, universal_newlines=True, encoding="latin-1") as p: for line in p.stdout: out.append(line) if debug: print(line) return out @staticmethod def execute_lookup(cmd: list[str], match: str, debug=DEBUG) -> str: out = ShellIO.execute(cmd, debug=debug) for o in out: if match in o: return o return "" @staticmethod def execute_async(cmd: list[str]): Popen(cmd, stdout=PIPE, bufsize=1, universal_newlines=True, encoding="latin-1") class BluetoothCTL: async_bluetooth_process: "Popen | None" def __init__(self): self.async_bluetooth_process = None def _parse_device_info(self, mac: str): info = ShellIO.execute(["bluetoothctl", "info", mac], debug=False) dev = BluetoothDevice( mac=mac, name="", alias="", clas="", icon="", paired=False, bounded=False, trusted=False, blocked=False, connected=False, wake_allowed=False, legacy_pairing=False, rssi=0, ) for i in info: i = i.strip() if i.startswith("Name:"): dev.name = i.split(":")[1].strip() if i.startswith("Alias:"): dev.alias = i.split(":")[1].strip() if i.startswith("Class:"): dev.clas = i.split(":")[1].strip() if i.startswith("Icon:"): dev.icon = i.split(":")[1].strip() if i.startswith("Paired:"): dev.paired = i.split(":")[1].strip() == "yes" if i.startswith("Bounded:"): dev.bounded = i.split(":")[1].strip() == "yes" if i.startswith("Trusted:"): dev.trusted = i.split(":")[1].strip() == "yes" if i.startswith("Blocked:"): dev.blocked = i.split(":")[1].strip() == "yes" if i.startswith("Connected:"): dev.connected = i.split(":")[1].strip() == "yes" if i.startswith("WakeAllowed:"): dev.wake_allowed = i.split(":")[1].strip() == "yes" if i.startswith("LegacyPairing:"): dev.legacy_pairing = i.split(":")[1].strip() == "yes" if i.startswith("RSSI:"): # Following code tested on bluez 5.66, and should work with 5.72 too. dev.rssi = int(i.split(" ")[-1].replace("(","").replace(")","").strip()) return dev @property def power(self) -> bool: return "yes" in ShellIO.execute_lookup(["bluetoothctl", "show"], "Pairable", debug=False) @property def discoverable(self) -> bool: return "yes" in ShellIO.execute_lookup(["bluetoothctl", "show"], "Discoverable", debug=False) @property def pairable(self) -> bool: return "yes" in ShellIO.execute_lookup(["bluetoothctl", "show"], "Pairable", debug=False) @power.setter def power(self, value): ShellIO.execute(["bluetoothctl", "power", "on" if value else "off"]) @discoverable.setter def discoverable(self, value): ShellIO.execute(["bluetoothctl", "discoverable", "on" if value else "off"]) @pairable.setter def pairable(self, value): ShellIO.execute(["bluetoothctl", "pairable", "on" if value else "off"]) @pairable.setter def agent(self, value): ShellIO.execute(["bluetoothctl", "agent", "on" if value else "off"]) def scan(self, timeout=10): ShellIO.execute(["bluetoothctl", "--timeout", str(timeout), "scan", "on"]) def scan_async(self, timeout=10): # using stdbuf to flush buffer and get output immediately (bluetoothctl issue) cmd = ( "stdbuf -oL bluetoothctl --timeout " + str(timeout) + " scan on" if timeout > 0 else "stdbuf -oL bluetoothctl -- scan on" ) process = Popen(cmd.split(), stdout=PIPE, universal_newlines=True) while True: line = process.stdout.readline() if line == "" and process.poll() is not None: break if line: line = line.strip().rstrip() if DEBUG: print("< ", line) if ( len(line.split()) >= 3 and len(line.split()[2]) == 17 and ( "NEW" in line.split()[0] or "CHG" in line.split()[0] or "DEL" in line.split()[0] ) ): if DEBUG: print(bt.devices) devs = [x for x in bt.devices if x.mac == line.split()[2]] if len(devs) > 0: if "DEL" in line.split()[0]: on_device_removed(devs[0]) elif "NEW" in line.split()[0] or ( "CHG" in line.split()[0] and "RSSI:" in line ): if DEBUG: print(devs) if not on_device_discovered(devs[0]): print("stopping thread") break def scan_stop(self): ShellIO.execute_async(["pkill", "-f", "bluetoothctl"]) @property def scanning(self) -> bool: return "yes" in ShellIO.execute_lookup(["bluetoothctl", "show"], "Discovering", debug=False) @property def controllers(self) -> list[str]: controllers = ShellIO.execute(["bluetoothctl", "list"], debug=False) return [ctrl.split()[1] for ctrl in controllers] @property def devices(self) -> list[BluetoothDevice]: devs = ShellIO.execute(["bluetoothctl", "devices"], debug=False) return [self._parse_device_info(dev.split()[1]) for dev in devs] def trust(self, dev: BluetoothDevice) -> bool: return "succeeded" in ShellIO.execute_lookup( ["bluetoothctl", "trust", dev.mac], "trust succeeded" ) def untrust(self, dev: BluetoothDevice) -> bool: return "succeeded" in ShellIO.execute_lookup( ["bluetoothctl", "untrust", dev.mac], "untrust succeeded" ) def pair(self, dev: BluetoothDevice) -> bool: return "successful" in ShellIO.execute_lookup( ["bluetoothctl", "pair", dev.mac], "Pairing successful" ) def disconnect(self, dev: BluetoothDevice) -> bool: return "successful" in ShellIO.execute_lookup( ["bluetoothctl", "disconnect", dev.mac], "Disconnection successful" ) def connect(self, dev: BluetoothDevice) -> bool: return "successful" in ShellIO.execute_lookup( ["bluetoothctl", "connect", dev.mac], "Connection successful" ) def forget(self, dev: BluetoothDevice) -> bool: return "removed" in ShellIO.execute_lookup( ["bluetoothctl", "remove", dev.mac], "Device has been removed" ) # returns true if a game is running via the emuelecRunEmu script def is_in_game(): return os.path.isfile("/tmp/game.running") # returns true if another process (not current) is running infinite scan def is_bluetooth_running(): out = ShellIO.execute(["ps", "-ef"], debug=False) for o in out: if "emuelec-bluetooth -1" in o: return False if str(os.getpid()) in o else True return False def on_device_discovered(dev: BluetoothDevice) -> bool: if DEBUG: print(dev) if dev.blocked: return True if (dev.trusted and dev.paired and not dev.connected and bt.connect(dev)): return True if ( not dev.connected # exclude already connected devices and dev.rssi != 0 # exclude inactive devices (saved) and "input-" in dev.icon # exclude any non-input device ): print( "found device {}, mac: {}, icon: {}, paired: {}".format( dev.name, dev.mac, dev.icon, dev.paired ) ) if bt.trust(dev) and bt.pair(dev) and bt.connect(dev): print("connected device {}".format(dev.name)) return False else: bt.forget(dev) print("forgot device {}".format(dev.name)) elif ( dev.connected and not dev.trusted # and dev.rssi == 0 # and "input-" in dev.icon ): print( "trusting and pairing device {}, mac: {}, icon: {}, paired: {}".format( dev.name, dev.mac, dev.icon, dev.paired ) ) if bt.trust(dev): bt.pair(dev) print("connect cable.") return True def on_device_removed(dev: BluetoothDevice): pass SCAN_TIME = 60 # ELAPSED_TIME = 0 UPDATE_INTERVAL = 1 BEEN_IN_GAME = False BT_THREAD: Process = None if __name__ == "__main__": if len(sys.argv) >= 2: SCAN_TIME = int(sys.argv[1]) print("running scan for " + str(SCAN_TIME) + " seconds.") bt = BluetoothCTL() if is_bluetooth_running(): print("bluetooth is already running, exiting.") exit() if len(bt.controllers) == 0: print("no controller found, exiting.") exit() bt.power = True bt.agent = True bt.discoverable = True bt.pairable = True start_time = time.perf_counter() while True: diff_time = time.perf_counter() - start_time if SCAN_TIME != -1 and diff_time > SCAN_TIME: exit() IS_IN_GAME = is_in_game() connected_devs = [dev for dev in bt.devices if dev.connected] if not bt.scanning and ( not IS_IN_GAME or len(connected_devs) == 0 ): print("resuming scan") BT_THREAD = Process(target=bt.scan_async, args=(SCAN_TIME,)) BT_THREAD.start() elif ( bt.scanning and IS_IN_GAME and (len(connected_devs) > 0) ): print("stopping scan") if BT_THREAD is not None: BT_THREAD.terminate() bt.scan_stop() time.sleep(UPDATE_INTERVAL) ================================================ FILE: packages/sx05re/emuelec/bin/batocera/emuelec-bluetooth-legacy ================================================ #!/usr/bin/python -u ################################################################################ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present Shanti Gilbert (https://github.com/shantigilbert) # Modifications made by: # Langerz82 (https://github.com/Langerz82) ################################################################################ #!/usr/bin/env python import time from bluetool import Bluetooth if __name__ == "__main__": bt = Bluetooth() print('Scanning for available devices for 60 seconds, please wait...') bt.make_discoverable(); bt.start_scanning(60) print('Getting pairable devices, please wait...') for x in range(0,10): time.sleep(3) devices = bt.get_available_devices() for device in devices: mac = device['mac_address'].decode('utf-8') name = device['name'].decode('utf-8') print("Icon:"+ str(bt.get_device_property(mac,'Icon'))) if ((not bt.get_device_property(mac,'Icon') and bt.get_device_property(mac,'Connected') == 1) or bt.get_device_property(mac,'Icon') == 'input-gaming'): print('Found MAC: {}\tName: {}'.format(mac,name)) if bt.get_device_property(mac,'Trusted') == 1: continue print('Found controller {} Name: {}, trusting...'.format(mac,name)) bt.trust(mac) if bt.get_device_property(mac,'Trusted') == 1: print('Trusted {}, quick pause, then pairing...'.format(name)) time.sleep(5) bt.pair(mac) if bt.get_device_property(mac,'Paired') == 1: print('Paired {}, quick pause, then connecting...'.format(name)) time.sleep(5) bt.connect(mac) if bt.get_device_property(mac,'Connected') == 1: print('Connected {}, exiting...'.format(name)) ================================================ FILE: packages/sx05re/emuelec/bin/batocera/emuelec-upgrade ================================================ #!/bin/bash do_clean() { test -n "${GETPERPID}" && kill -9 "${GETPERPID}" rm -f "/storage/.update/*" } trap do_clean EXIT getPer() { TARVAL=$1 while true do touch "/storage/.update/${UFILE}" CURVAL=$(stat "/storage/.update/${UFILE}" | grep -E '^[ ]*Size:' | sed -e s+'^[ ]*Size: \([0-9][0-9]*\) .*$'+'\1'+) CURVAL=$((${CURVAL} / 1024 / 1024)) PER=$((${CURVAL}*100/${TARVAL})) echo "downloading >>> ${PER}%" sleep 5 done } if [ "$1" == "canupdate" ]; then available=$(updatecheck.sh canupdate) echo "$available" if [[ "$available" == "no" ]]; then exit 12 else exit 0 fi fi #Started from Terminal/SSH or from Emulationstation? [ -t 1 ] && TERMINAL=1 || TERMINAL=0 echo "starting the upgrade..." # download directory mkdir -p /storage/.update || exit 1 # get size to download url=$(updatecheck.sh geturl) UFILE=${url##*/} echo "url: ${url}" size=$(updatecheck.sh getsize) size=$((size / 1024 / 1024)) echo "need to download ${size}mB" # check free space on fs freespace=$(df -m "/storage/.update/" | tail -1 | awk '{print $4}') test $? -eq 0 || exit 1 if test "${size}" -gt "${freespace}"; then echo "Not enough space on ${fs} to download the update" exit 1 fi # download if [ $TERMINAL = 0 ]; then # Download by EMULATIONSTATION getPer "${size}" & GETPERPID=$! curl -sfL "${url}" -o "/storage/.update/${UFILE}" || exit 1 kill -9 "${GETPERPID}" GETPERPID= else # Download inside SSH/TERMINAL wget -q "${url}" -O "/storage/.update/${UFILE}" || exit 1 fi # try to download an sha256 checksum curl -sfL "${url}.sha256" -o "/storage/.update/${UFILE}.sha256" if test -e "/storage/.update/${UFILE}.sha256" then DISTMD5=$(cat "/storage/.update/${UFILE}.sha256" | cut -d ' ' -f 1) CURRMD5=$(sha256sum "/storage/.update/${UFILE}" | cut -d ' ' -f 1) if test "${DISTMD5}" = "${CURRMD5}" then echo "valid checksum." else echo "invalid checksum. Got +${DISTMD5}+. Attempted +${CURRMD5}+." exit 1 fi else echo "no checksum found. don't check the file." fi # a sync sync echo "Done. Please reboot EmuELEC so that the changes take effect!" exit 0 ================================================ FILE: packages/sx05re/emuelec/bin/bezels.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present SumavisionQ5 (https://github.com/SumavisionQ5) # Modifications by Shanti Gilbert (https://github.com/shantigilbert) . /etc/profile PLATFORM="${1}" if [ "${2}" != "default" ]; then ROMNAME=$(basename "${2%.*}") fi RACONFIG="/storage/.config/retroarch/retroarch.cfg" OPACITY="1.000000" BEZELDIR="/storage/roms/bezels" DEFAULT_BEZEL="false" DEFAULT_SCALE="true" DEFAULT_RATIO="22" [ "${3}" != "true" ] && DEFAULT_SCALE="false" [ ! -z "${4}" ] && DEFAULT_RATIO="${4}" case ${PLATFORM} in "arcade"|"fbneo"|"fbn"|"neogeo"|"mame"|cps*) PLATFORM="ARCADE" ;; "none") if [ -f "/storage/.config/bezels_enabled" ]; then clear_bezel sed -i '/input_overlay = "/d' ${RACONFIG} sed -i '/input_overlay_enable = "/d' ${RACONFIG} rm "/storage/.config/bezels_enabled" fi exit 0 ;; "SETUP") # fbterm does not need bezels exit 0 ;; esac if [ ! -f "/storage/.config/bezels_enabled" ]; then touch /storage/.config/bezels_enabled fi # we make sure the platform is all lowercase PLATFORM=${PLATFORM,,} # bezelmap.cfg in ${BEZELDIR}/ is to share bezels between arcade clones and parent. BEZELMAP="/emuelec/configs/bezels/arcademap.cfg" BZLNAME=$(sed -n "/"${PLATFORM}"_"${ROMNAME}" = /p" "${BEZELMAP}" 2>/dev/null) BZLNAME="${BZLNAME#*\"}" BZLNAME="${BZLNAME%\"*}" OVERLAYDIR1=$(find ${BEZELDIR}/${PLATFORM} -maxdepth 1 -iname "${ROMNAME}*.cfg" | sort -V | head -n 1) [ ! -z "${BZLNAME}" ] && OVERLAYDIR2=$(find ${BEZELDIR}/${PLATFORM} -maxdepth 1 -iname "${BZLNAME}*.cfg" | sort -V | head -n 1) OVERLAYDIR3="${BEZELDIR}/${PLATFORM}/default.cfg" OVERLAYDIR_ROM="/storage/roms/${PLATFORM}/images/${ROMNAME}-bezel.png" OVERLAYDIR_ROM_CFG="/storage/roms/${PLATFORM}/images/${ROMNAME}-bezel.cfg" clear_bezel() { sed -i '/aspect_ratio_index = "/d' ${RACONFIG} sed -i '/custom_viewport_width = "/d' ${RACONFIG} sed -i '/custom_viewport_height = "/d' ${RACONFIG} sed -i '/custom_viewport_x = "/d' ${RACONFIG} sed -i '/custom_viewport_y = "/d' ${RACONFIG} sed -i '/video_scale_integer = "/d' ${RACONFIG} sed -i '/input_overlay_opacity = "/d' ${RACONFIG} sed -i '/input_overlay_enable = "/d' ${RACONFIG} echo "video_scale_integer = \"${DEFAULT_SCALE}\"" >> ${RACONFIG} echo "aspect_ratio_index = \"${DEFAULT_RATIO}\"" >> ${RACONFIG} echo 'input_overlay_opacity = "0.150000"' >> ${RACONFIG} } set_bezel() { # ${OPACITY}: input_overlay_opacity # ${1}: custom_viewport_width # ${2}: custom_viewport_height # ${3}: ustom_viewport_x # ${4}: custom_viewport_y # ${5}: video_scale_integer # ${6}: aspect_ratio_index clear_bezel sed -i '/input_overlay_opacity = "/d' ${RACONFIG} sed -i "1i input_overlay_opacity = \"${OPACITY}\"" ${RACONFIG} sed -i "2i aspect_ratio_index = \"${6}\"" ${RACONFIG} sed -i "3i custom_viewport_width = \"${1}\"" ${RACONFIG} sed -i "4i custom_viewport_height = \"${2}\"" ${RACONFIG} sed -i "5i custom_viewport_x = \"${3}\"" ${RACONFIG} sed -i "6i custom_viewport_y = \"${4}\"" ${RACONFIG} sed -i "7i video_scale_integer = \"${5}\"" ${RACONFIG} sed -i "8i input_overlay_enable = \"true\"" ${RACONFIG} } check_overlay_dir() { # The bezel will be searched and used in following order: # 1.${OVERLAYDIR1} will be used, if it does not exist, then # 2.${OVERLAYDIR2} will be used, if it does not exist, then # 3.${OVERLAYDIR2} platform default bezel as "${BEZELDIR}/"${PLATFORM}"/default.cfg\" will be used. # 4.Default bezel at "${BEZELDIR}/default.cfg\" will be used. sed -i '/input_overlay = "/d' ${RACONFIG} if [ -f "${OVERLAYDIR_ROM}" ]; then if [ ! -f "${OVERLAYDIR_ROM_CFG}" ]; then echo "overlays = 1" > "${OVERLAYDIR_ROM_CFG}" echo "overlay0_full_screen = true" >> "${OVERLAYDIR_ROM_CFG}" echo "overlay0_descs = 0">> "${OVERLAYDIR_ROM_CFG}" echo "overlay0_overlay = \"${OVERLAYDIR_ROM}\"" >> "${OVERLAYDIR_ROM_CFG}" fi echo -e "input_overlay = \""${OVERLAYDIR_ROM_CFG}"\"\n" >> ${RACONFIG} elif [ -f "${OVERLAYDIR1}" ]; then echo -e "input_overlay = \""${OVERLAYDIR1}"\"\n" >> ${RACONFIG} elif [ -f "${OVERLAYDIR2}" ]; then echo -e "input_overlay = \""${OVERLAYDIR2}"\"\n" >> ${RACONFIG} elif [ -f "${OVERLAYDIR3}" ]; then echo -e "input_overlay = \""${OVERLAYDIR3}"\"\n" >> ${RACONFIG} else echo -e "input_overlay = \"${BEZELDIR}/default.cfg\"\n" >> ${RACONFIG} DEFAULT_BEZEL="true" fi } # Only 720P and 1080P can use bezels. For 480p/i and 576p/i we just delete bezel config. hdmimode=$(get_resolution) OGA_VER=$(oga_ver) # This whole section needs to be reworked, specially for Odroid-GO Super, but for now we just force bezels at 720p if [ "${OGA_VER}" == "OGS" ]; then hdmimode="OGS" fi case ${hdmimode} in *480) sed -i '/input_overlay = "/d' ${RACONFIG} clear_bezel ;; *576) sed -i '/input_overlay = "/d' ${RACONFIG} clear_bezel ;; "OGS"|*720) check_overlay_dir "${PLATFORM}" case "${PLATFORM}" in "gamegear") set_bezel "780" "580" "245" "70" "${DEFAULT_SCALE}" "${DEFAULT_RATIO}" ;; "gb") set_bezel "429" "380" "420" "155" "${DEFAULT_SCALE}" "${DEFAULT_RATIO}" ;; "gbc") set_bezel "430" "380" "425" "155" "${DEFAULT_SCALE}" "${DEFAULT_RATIO}" ;; "ngp") set_bezel "461" "428" "407" "145" "${DEFAULT_SCALE}" "${DEFAULT_RATIO}" ;; "ngpc") set_bezel "460" "428" "407" "145" "${DEFAULT_SCALE}" "${DEFAULT_RATIO}" ;; "wonderswan") set_bezel "645" "407" "325" "150" "${DEFAULT_SCALE}" "${DEFAULT_RATIO}" ;; "wonderswancolor") set_bezel "643" "405" "325" "150" "${DEFAULT_SCALE}" "${DEFAULT_RATIO}" ;; *) # delete aspect_ratio_index to make sure video is expanded fullscreen. Only certain handheld platforms need custom_viewport. clear_bezel sed -i '/input_overlay_opacity = "/d' ${RACONFIG} sed -i "1i input_overlay_opacity = \"${OPACITY}\"" ${RACONFIG} ;; esac ;; *) check_overlay_dir "${PLATFORM}" clear_bezel sed -i '/input_overlay_opacity = "/d' ${RACONFIG} sed -i "1i input_overlay_opacity = \"${OPACITY}\"" ${RACONFIG} ;; esac if [ "${DEFAULT_BEZEL}" = "true" ] && [ $(oga_ver) != "OGS" ]; then set_bezel "1427" "1070" "247" "10" "${DEFAULT_SCALE}" "${DEFAULT_RATIO}" elif [ "${OGA_VER}" != "OGS" ]; then set_bezel "1427" "1070" "247" "10" "${DEFAULT_SCALE}" "${DEFAULT_RATIO}" fi ================================================ FILE: packages/sx05re/emuelec/bin/check_res.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present Langerz82 (https://github.com/Langerz82) # Source predefined functions and variables . /etc/profile # DO NOT modify this file. # It seems some slow SDcards have a problem creating the symlink on time :/ CONFIG_FLASH="/flash/config.ini" VIDEO_FILE="/storage/.config/EE_VIDEO_MODE" VIDEO_MODE="/sys/class/display/mode" # If the video-mode is contained in flash config. DEFE="" # FLASH CONFIG hdmimode takes priority 1. if [ -z "${DEFE}" ]; then CFG_VAL=$(get_config_value "${CONFIG_FLASH}" "vout") if [[ ! -z "${CFG_VAL}" ]]; then DEFE="${CFG_VAL}" fi fi # Check for EE_VIDEO_MODE override 2nd. if [[ -z "${DEFE}" && -f "${VIDEO_FILE}" ]]; then DEFE=$(cat ${VIDEO_FILE}) fi # 3rd check ES for it's preferred resolution. if [ -z "${DEFE}" ]; then DEFE=$(get_ee_setting ee_videomode) if [ "${DEFE}" == "Custom" ]; then DEFE=$(cat ${VIDEO_MODE}) fi fi # Set video mode, this has to be done before starting ES # finally we correct the FB according to video mode [[ ! -z "${DEFE}" ]] && [[ -f "${VIDEO_MODE}" ]] && setres.sh ${DEFE} ================================================ FILE: packages/sx05re/emuelec/bin/connectbtwii.sh ================================================ # /emuelec/bin/connectbtwii.sh #!/bin/sh # Wiimote connect for EmuELEC (bluetoothctl-only, multi-scan with re-arm prompts) # Copyright (C) 2025 worstcase_scenario (https://github.com/worstcase-scenario) . /etc/profile BTCTL="$(command -v bluetoothctl || echo /usr/bin/bluetoothctl)" # Tunables SCAN_TIMEOUT="${SCAN_TIMEOUT:-25}" # seconds per scan round SCAN_ROUNDS="${SCAN_ROUNDS:-4}" # how many scan rounds REARM_PROMPT="${REARM_PROMPT:-1}" # prompt to press 1+2 before next round REARM_PAUSE="${REARM_PAUSE:-3}" # seconds to wait after prompt CONNECT_TRIES="${CONNECT_TRIES:-30}" # connect attempts while scan is ON SLEEP_STEP=1 log(){ printf '%s\n' "$*" >&2; } # Prep /usr/bin/systemctl stop eventlircd 2>/dev/null || true modprobe uhid 2>/dev/null || true modprobe hid-wiimote 2>/dev/null || true modprobe hid-nintendo 2>/dev/null || true $BTCTL power on >/dev/null 2>&1 || true $BTCTL pairable on >/dev/null 2>&1 || true $BTCTL agent NoInputNoOutput >/dev/null 2>&1 || $BTCTL agent on >/dev/null 2>&1 || true $BTCTL default-agent >/dev/null 2>&1 || true TMP="/tmp/btscan_$$.log"; rm -f "$TMP" pick_mac_round() { # one scan round, append raw output to $TMP, return MAC or empty $BTCTL --timeout "$SCAN_TIMEOUT" scan on 2>&1 | tee -a "$TMP" >/dev/null awk 'BEGIN{IGNORECASE=1} /Device/ && /(nintendo|wiimote|rvl-cnt)/ { for (i=1;i<=NF;i++) if ($i ~ /^[0-9A-F]{2}(:[0-9A-F]{2}){5}$/) { print $i; exit } }' "$TMP" | head -n1 } # Multi-scan with re-arm hints MAC="" round=1 while [ $round -le "$SCAN_ROUNDS" ] && [ -z "$MAC" ]; do if [ $round -eq 1 ]; then log "Scanning… hold 1+2 on the Wiimote (round $round/$SCAN_ROUNDS)" else [ "$REARM_PROMPT" = "1" ] && log "Press 1+2 again now… (round $round/$SCAN_ROUNDS)" && sleep "$REARM_PAUSE" fi MAC="$(pick_mac_round)" round=$((round+1)) done [ -n "$MAC" ] || { log "No Wiimote seen by BlueZ."; rm -f "$TMP"; exit 1; } log "Target: $MAC" # Keep scan ON during connect attempts $BTCTL scan on >/dev/null 2>&1 || true # Clean stale state but keep object if BlueZ just learned it $BTCTL disconnect "$MAC" >/dev/null 2>&1 || true # Ensure BlueZ keeps the device object for i in $(seq 1 10); do $BTCTL info "$MAC" >/dev/null 2>&1 || true $BTCTL devices | grep -qi "$MAC" && break sleep "$SLEEP_STEP" done # Connect loop $BTCTL trust "$MAC" >/dev/null 2>&1 || true ok=1 for i in $(seq 1 "$CONNECT_TRIES"); do $BTCTL connect "$MAC" >/dev/null 2>&1 || true sleep "$SLEEP_STEP" if $BTCTL info "$MAC" | grep -q "Connected: yes"; then ok=0; break; fi done $BTCTL scan off >/dev/null 2>&1 || true if [ $ok -ne 0 ]; then log "Connect failed." [ -s "$TMP" ] && { log "Scan summary:"; grep -E 'Device|(\[NEW\])' "$TMP" | tail -n 20 >&2; } rm -f "$TMP" exit 1 fi # Finalize $BTCTL pair "$MAC" >/dev/null 2>&1 || true $BTCTL trust "$MAC" >/dev/null 2>&1 || true $BTCTL info "$MAC" | sed -n '1,60p' rm -f "$TMP" log "Wiimote connected." exit 0 ================================================ FILE: packages/sx05re/emuelec/bin/emuelec-utils ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile function set_rotation() { local rotate=$1 local emulator=$2 if [[ "${emulator}" == "libretro" ]]; then set_ra_setting "video_rotation" "${rotate}" return fi if [[ "${emulator}" == "retrorun" ]]; then if [[ "${rotate}" == "0" ]]; then set_rr_setting "retrorun_tate_mode" "disabled" set_rr_setting "retrorun_swap_sticks" "false" echo " " else set_rr_setting "retrorun_tate_mode" "enabled" set_rr_setting "retrorun_swap_sticks" "true" echo " -z " fi return fi } function rotation_output() { local emulator=$1 local core=$2 if [[ "${emulator}" == "libretro" ]]; then echo "90 Degrees,180 Degrees,270 Degrees" fi if [[ "${emulator}" == "retrorun" ]]; then echo "Tate Mode" fi } function killall_midi() { pkill -9 timidity pkill -9 mt32d pkill -9 fluidsynth } function set_midi_source() { local midi_source=$1 local midi_emulator=$2 killall_midi [[ "${midi_emulator}" == "retrorun" ]] && return local midi_output=OFF case ${midi_source} in fluidsynth) fluidsynth -is /storage/roms/bios/sc/SC-55.sf2 & sleep 6 midi_output=$(cat /proc/asound/seq/clients | grep "Port 0 : \"S" | cut -d'"' -f2) ;; timidity) timidity -iA --module 1 & midi_output="TiMidity port 0" ;; cm32l) mt32d -o 1 -i 24 -f /roms/bios & midi_output=Standard ;; mt32) mt32d -o 2 -i 24 -f /roms/bios & midi_output=Standard ;; esac if [[ "${midi_emulator}" == "libretro" ]]; then set_ra_setting "midi_output" "${midi_output}" fi } function get_filenames_no_ext() { local FN=($( ls -1 $1 | sed -e 's/\.[^.]*$//' )) IFS="," echo "${FN[*]}" } function test() { echo "success" exit 1 } function error() { # Displays emuelec.log if there was an error. text_viewer /emuelec/logs/emuelec.log -w -t "Error! ${2}" -f 24 show_splash.sh exit } function setauddev() { #set audio device out according to emuelec.conf AUDIO_DEVICE="${1}" [ -z "${AUDIO_DEVICE}" ] && AUDIO_DEVICE="$(get_ee_setting ee_audio_device)" [[ "${AUDIO_DEVICE}" = "auto" || -z "${AUDIO_DEVICE}" ]] && AUDIO_DEVICE="0,0" sed -i "s|pcm \"hw:.*|pcm \"hw:${AUDIO_DEVICE}\"|" /storage/.config/asound.conf } function audio() { setauddev; # This has to be expanded to check for new GLX devices running on Amlogic-ng, # but right now its mostly used on ES to change audio to alsa before launching or else ES hangs on GXL devices. if [[ "$1" == "alsa" ]]; then set_audio alsa elif [[ "$1" == "pulse"* ]]; then set_audio pulseaudio else set_audio default fi } function clearconfig() { # This function resets configurations based on argument 1 case "${1}" in "EMUS") unmount_all systemctl stop emustation ee_backup backup no find /storage -mindepth 1 \( ! -regex '^/storage/.config/emuelec/themes.*' -a ! -regex '^/storage/.config/emulationstation/themes.*' -a ! -regex '^/storage/.update.*' -a ! -regex '^/storage/download.*' -a ! -regex '^/storage/roms.*' -a ! -regex '^/storage/.cache/bluetooth.*' \) -delete mkdir /storage/.config/ sync small-cores enable systemctl reboot ;; "retroarch") rm -f /storage/.config/retroarch/retroarch.cfg cp -rf /usr/config/retroarch/retroarch.cfg /storage/.config/retroarch/retroarch.cfg ;; "ALL") unmount_all systemctl stop emustation find /storage -mindepth 1 \( ! -regex '^/storage/.config/emuelec/themes.*' -a ! -regex '^/storage/.update.*' -a ! -regex '^/storage/roms.*' -a ! -regex '^/storage/.cache/bluetooth.*' \) -delete mkdir /storage/.config/ sync small-cores enable systemctl reboot ;; esac } function ee_backup() { # Creates a backup of current configurations BACKUPDIR="/storage/roms/backup" BACKUPTAR="ee_backup_config.tar.gz" BACKUPFILE="${BACKUPDIR}/${BACKUPTAR}" mkdir -p "${BACKUPDIR}" case "${1}" in "restore") [ -z "${2}" ] && systemctl stop emustation cd / tar xvf "${BACKUPFILE}" sync sleep 3 RESTOREDATE="$(date +'%m-%d-%Y')_$(uuidgen)" # Move the backup file instead of deleting it mv "${BACKUPFILE}" "${BACKUPDIR}/restored_${RESTOREDATE}_${BACKUPTAR}" & [ -z "${2}" ] && systemctl start emustation ;; "backup") [ -f "${BACKUPFILE}" ] && rm "${BACKUPFILE}" [ -z "${2}" ] && systemctl stop emustation tar -zcvf "${BACKUPFILE}" /storage/.local/share/VVVVVV/* \ /storage/.cache/bluetooth/* \ /storage/.cache/timezone \ /storage/.cache/hostname \ /storage/.config/scummvm/* \ /storage/.config/emuelec/configs/* \ /storage/.emulationstation/es_*.cfg \ /storage/.emulationstation/themesettings \ /tmp/joypads/* \ /storage/.config/retroarch/*.cfg \ /storage/.config/ppsspp/* \ /storage/.config/retroarch/config/* \ /storage/.config/supertux* \ /storage/.emulationstation/scripts/drastic/config/* \ /storage/.emulationstation/scripts/drastic/backup/* \ /storage/.emulationstation/scripts/drastic/savestates/* \ /storage/.config/emuelec/bin/pico-8/* \ sync sleep 3 [ -z "${2}" ] && systemctl start emustation ;; esac } function ee_cloud_backup() { # Creates a cloud backup of current configurations using rclone RCLONECONF="/emuelec/configs/rclone/rclone.conf" EESYNCCFG="/emuelec/configs/rclone/ee_cloud_sync.cfg" if [ -e "${EESYNCCFG}" ]; then . "${EESYNCCFG}" fi [ -z "${EE_SYNC_REMOTE}" ] && EE_SYNC_REMOTE="EmuELEC_Remote" [ -z "${EE_SYNC_PATH}" ] && EE_SYNC_PATH="EmuELEC_Backup" [ -z "${2}" ] && systemctl stop emustation # We need to check if rclone.conf exists and its configured correctly, else show error if [ -e "${RCLONECONF}" ]; then # in case this file was created in windows, we need to convert it dos2unix ${RCLONECONF} if ! grep -Fxq "[${EE_SYNC_REMOTE}]" ${RCLONECONF}; then text_viewer -e -w -t "rclone.conf error!" -f 24 -m "rclone.conf exist but it does not contain a remote named ${EE_SYNC_REMOTE}, please read https://rclone.org/remote_setup/ name your remote ${EE_SYNC_REMOTE} and copy resulting rclone.conf to /emuelec/configs/rclone/" systemctl start emustation exit 1; fi else text_viewer -e -w -t "rclone.conf does not exist!" -f 24 -m "rclone.conf does not exist and its required for cloud sync to function! please read https://rclone.org/remote_setup/ and copy resulting rclone.conf to /emuelec/configs/rclone/" systemctl start emustation exit 1; fi case "${1}" in "backup") # we first create a regular backup echo "emuelec-utils ee_backup backup no" > /tmp/cloud.sh # We sync to EmuELEC_Remote specified in /emuelec/configs/rclone/rclone.conf to EmuELEC_Backup in the remote server echo "rclone sync /storage/roms/ ${EE_SYNC_REMOTE}:/${EE_SYNC_PATH}/ --filter-from /emuelec/configs/rclone/emuelec-cloud-filter.cfg -P -v --config ${RCLONECONF} 2>&1 | tee /emuelec/logs/cloud-backup.log" >> /tmp/cloud.sh ;; "restore") # We first sync to /storage/roms from EmuELEC_Remote specified in /emuelec/configs/rclone/rclone.conf echo "rclone sync ${EE_SYNC_REMOTE}:/${EE_SYNC_PATH}/ /storage/roms/ --filter-from /emuelec/configs/rclone/emuelec-cloud-filter.cfg -P -v --config ${RCLONECONF} 2>&1 | tee /emuelec/logs/cloud-backup.log" > /tmp/cloud.sh # We then restore the backup file (if it exists) echo "emuelec-utils ee_backup restore no" >> /tmp/cloud.sh ;; esac echo "echo \"Done!...Press 'Select' or choose 'Close' to continue!\"" >> /tmp/cloud.sh chmod +x /tmp/cloud.sh text_viewer -s /tmp/cloud.sh -t "EmuELEC cloud sync, please wait!..." rm /tmp/cloud.sh > /dev/null 2>&1 if [ "${1}" == "restore" ]; then systemctl reboot else [ -z "${2}" ] && systemctl start emustation fi } function filemanager() { # runs the file manager script, might be outdated. /usr/bin/scripts/setup/file_manager.sh } function getshaders() { # Returns a list of available shaders, mostly used in Emulationstation. find /tmp/shaders -name '*.glslp' -print0 | while IFS= read -r -d '' line; do echo ${line#/tmp/shaders/}, done } function getip() { # returns current IP Address IP="$(ifconfig wlan0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}')" if [ -z "$IP" ]; then IP="$(ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}')" fi if [ -z "$IP" ]; then echo "No Internet" else echo "${IP}" echo "${IP}" > /emuelec/ip.txt fi } function dimensions() { DIMENSIONS=() local FILEPATH="/emuelec/configs/dimensions.conf" [[ ! -f "$FILEPATH" ]] && cp /usr/config/emuelec/configs/dimensions.conf /emuelec/configs # Screen supported dimensions SCREEN_DIMENSIONS=`/usr/bin/cat "$FILEPATH"` for SD in $SCREEN_DIMENSIONS do DIMENSIONS+=($SD) done DIMENSIONS=($(printf "%s\n" "${DIMENSIONS[@]}" | sort -u)) IFS="," echo "${DIMENSIONS[*]}" } function midi_output() { local emulator=$1 local core=$2 echo "fluidsynth,mt32,cm32l,timidity" } function resolutions() { # Returns a list of supported resolutions depending on device RESOLUTIONS=() if [ -f "/storage/LEGACY_RESOLUTIONS" ]; then # N2 supported resolutions source : https://wiki.odroid.com/odroid-n2/application_note/software/set_display_mode N2_SUPPORTED_RESOLUTIONS="480x320p60hz 640x480p60hz 720x480p60hz 720x576p50hz 800x480p60hz 1024x600p60hz 1024x768p60hz 1280x1024p60hz 1280x720p50hz 1280x720p60hz 1280x800p60hz 1360x768p60hz 1440x900p60hz 1600x1200p60hz 1600x900p60hz 1680x1050p60hz 1920x1080p24hz 1920x1080p30hz 1920x1080p50hz 1920x1080p60hz 1920x1200p60hz 2560x1080p60hz 2560x1440p60hz 2560x1600p60hz 3440x1440p60hz 3840x2160p24hz 3840x2160p25hz 3840x2160p30hz 3840x2160p50hz 3840x2160p60hz" # Screen supported resolutions SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/amhdmitx/amhdmitx0/rawedid | /usr/bin/edid-decode |/usr/bin/grep "@" | sed -E "s| {0,9}VIC {0,9}[0-9]{1,2}||" | /usr/bin/awk '{print $1}' | /usr/bin/sed 's/@/p/g'|/usr/bin/tr '[:upper:]' '[:lower:]'` for N2SP in $N2_SUPPORTED_RESOLUTIONS do for SSR in $SCREEN_SUPPORTED_RESOLUTIONS do if [ "$N2SP" = "$SSR" ] then RESOLUTIONS+=($N2SP) fi done done fi if [[ "$EE_PROJECT" == "Rockchip" ]]; then SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/display/display0.HDMI/modes | sort -u` for SSR in $SCREEN_SUPPORTED_RESOLUTIONS do RESOLUTIONS+=($SSR) done else # Screen supported resolutions SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/display/cap | sed '/smpte/d' | sed '/pal/d' | sed '/ntsc/d' | sed 's/\*//' | grep -E '[0-9x]+[pi][56]0hz|cvbs'` for SSR in $SCREEN_SUPPORTED_RESOLUTIONS do RESOLUTIONS+=($SSR) done fi if [ "$EE_DEVICE" == "OdroidGoAdvance" ]; then RESOLUTIONS+=("480x320p60hz") fi [[ ! ${RESOLUTIONS[@]} == *"640x480p60hz"* ]] && RESOLUTIONS+=("640x480p60hz") [[ ! ${RESOLUTIONS[@]} == *"480i60hz"* ]] && RESOLUTIONS+=("480i60hz") local FILEPATH="/emuelec/configs/resolutions_amlogic.conf" if [[ "$DEVICE" == "Rockchip" ]]; then FILEPATH="/emuelec/configs/resolutions_rockchip.conf" fi if [[ -f "$FILEPATH" ]]; then SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat "$FILEPATH"` for SSR in $SCREEN_SUPPORTED_RESOLUTIONS do RESOLUTIONS+=($SSR) done fi RESOLUTIONS=($(printf "%s\n" "${RESOLUTIONS[@]}" | sort -u)) IFS="," echo "${RESOLUTIONS[*]}" } function current_timezone() { # Returns the current timezone readlink -f /etc/localtime | sed 's;/usr/share/zoneinfo/;;' } function timezones() { # Returns a list of timezones, used in ES cat /usr/share/zoneinfo/zone1970.tab | grep -v "^#" | awk '{ print $3"," }' | sort -u } function small-cores() { SCF=$(get_ee_setting ee_scf) [ "${SCF}" != "1" ] && return 0 # Switch the small cores on the N2 on and off, we mostly have them off as the small cores are slower. if grep -q "g12b" /proc/device-tree/compatible; then case "$1" in "enable") echo "1" > /sys/devices/system/cpu/cpu0/online echo "1" > /sys/devices/system/cpu/cpu1/online ;; "disable") echo "0" > /sys/devices/system/cpu/cpu0/online echo "0" > /sys/devices/system/cpu/cpu1/online ;; esac fi } function unmount_all () { if /usr/bin/busybox mountpoint -q /emuelec/themes ; then umount /emuelec/themes > /dev/null 2>&1 fi if /usr/bin/busybox mountpoint -q /storage/roms ; then umount /storage/roms > /dev/null 2>&1 fi if /usr/bin/busybox mountpoint -q /storage/roms/ports_scripts ; then umount /storage/roms/ports_scripts > /dev/null 2>&1 fi } function createMultidisc() { # Creates a multidisc m3u file, used in ES. local ROMNAME="$1" local BASEROMNAME="${ROMNAME##*/}" local BASEFOLDER="$(dirname "${ROMNAME}")" local ROMEXT="${BASEROMNAME##*.}" local ROMNAME_NOEXT="${BASEROMNAME%.*}" [[ "$ROMEXT" == "m3u" ]] && echo -e "\n" && return if [[ "${ROMNAME_NOEXT,,}" =~ ^.*disc[[:space:]]*1.*$ ]]; then local M3U_FILE=$(echo "${ROMNAME_NOEXT}" | sed -nE "s/(.*)(disc *)1(.*)/\1 DISCS \3/pi") M3U_FILE=$(echo "${BASEFOLDER}/${M3U_FILE}.m3u") [[ -f "${M3U_FILE}" ]] && echo -e "\n" && return touch "${M3U_FILE}" local HAS_SEQ=0 local REGEX=$( echo "${ROMNAME_NOEXT}" | sed -nE "s/(.*)(disc*)\s*[0-9](.*)/\1\2\3/pi" \ | sed -e 's/\[[^][]*\]//g' | sed -e 's/([^()]*)//g' | sed -e 's/\s+/ /' \ | awk '{$1=$1};1' ) REGEX=$( echo ".*${REGEX}.*" ) local FILES=$( ls "${BASEFOLDER}/"* | grep ".${ROMEXT}" | grep -E "${REGEX}" | sort ) IFS=$'\n' local ITER=0 for item in $FILES do echo "${item}" >> "$M3U_FILE" ((ITER++)) done if [[ "$ITER" -gt "1" ]]; then echo -e "${M3U_FILE}" else rm "${M3U_FILE}" fi fi echo -e "\n" } function blank_buffer() { # Clears screen buffer # Blank the buffer. dd if=/dev/zero of=/dev/fb0 bs=256K conv=sync,noerror,notrunc > /dev/null 2>&1 dd if=/dev/zero of=/dev/fb1 bs=256K conv=sync,noerror,notrunc > /dev/null 2>&1 } function init_app_video() { local PLATFORM=$1 local ROMNAME=$2 local BASEROMNAME=${ROMNAME##*/} [[ -f "/tmp/EE_LASTVIDEO" ]] && return blank_buffer if [[ "${PLATFORM}" == "ports" ]] && [[ "${BASEROMNAME}" == "PortMaster.sh" ]]; then return fi if [[ "${PLATFORM}" == "setup" ]]; then return fi echo "$(cat /sys/class/display/mode)" > /tmp/EE_LASTVIDEO local VIDEO_EMU=$(get_ee_setting nativevideo "${PLATFORM}" "${BASEROMNAME}") [[ -z "$VIDEO_EMU" ]] && VIDEO_EMU=$(cat /tmp/EE_LASTVIDEO) # Set the display video to that of the emulator setting. [ ! -z "${VIDEO_EMU}" ] && ${TBASH} setres.sh "${VIDEO_EMU}" "${PLATFORM}" "${BASEROMNAME}" # set display # Show splash screen if enabled local SPL=$(get_ee_setting ee_splash.enabled) [ "${SPL}" -eq "1" ] && ${TBASH} show_splash.sh gameloading "${PLATFORM}" "${ROMNAME}" if [[ "${PLATFORM}" == "ports" ]]; then fbfix $( emuelec-utils getmainfb ) fi } function end_app_video() { local PLATFORM=$1 local ROMNAME=$2 local BASEROMNAME=${ROMNAME##*/} [[ ! -f "/tmp/EE_LASTVIDEO" ]] && return if [[ "${PLATFORM}" == "ports" ]] && [[ "${BASEROMNAME}" == "PortMaster.sh" ]]; then return fi if [[ "${PLATFORM}" == "setup" ]]; then return fi blank_buffer local LAST_VIDEO="$(cat /tmp/EE_LASTVIDEO)" # Return to default mode ${TBASH} setres.sh ${LAST_VIDEO} # Show exit splash ${TBASH} show_splash.sh exit blank_buffer [[ -f "/tmp/EE_LASTVIDEO" ]] && rm /tmp/EE_LASTVIDEO } function getmainfb() { local max_area=0 local max_fb=0 for fb in /sys/class/graphics/fb*/virtual_size; do if [ -f "$fb" ]; then local fb_num=$(echo "$fb" | grep -o 'fb[0-9]*' | sed 's/fb//') local size=$(cat "$fb") local width=$(echo "$size" | cut -d',' -f1) local height=$(echo "$size" | cut -d',' -f2) local area=$((width * height)) if [ $area -gt $max_area ]; then max_area=$area max_fb=$fb_num fi fi done echo $max_fb } function set_gptokeyb() { local default=$1 local gptokeyb=$2 [[ -z "${gptokeyb}" ]] && gptokeyb=$default local kbfile="/emuelec/configs/gptokeyb/${gptokeyb}.gptk" if [[ ! -f "$kbfile" ]]; then echo -e "\n" && return fi echo "-c ${kbfile}" } cmd=${1} shift $cmd "$@" exit 0 ================================================ FILE: packages/sx05re/emuelec/bin/emuelecRunApp.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2024-present Langerz82 (https://github.com/Langerz82) # Source predefined functions and variables . /etc/profile arguments="$@" # Extract the platform name from the arguments PLATFORM="${arguments##*-P}" # read from -P onwards PLATFORM="${PLATFORM%% *}" # until a space is found ROMNAME="${1}" RUNEMU=$(echo "${1}" | grep "^emuelecRunEmu.sh") init_game [[ -z "${RUNEMU}" ]] && emuelec-utils init_app_video "${PLATFORM}" "${ROMNAME}" "$@" [[ -z "${RUNEMU}" ]] && emuelec-utils end_app_video "${PLATFORM}" "${ROMNAME}" end_game ================================================ FILE: packages/sx05re/emuelec/bin/emuelecRunEmu.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile # This whole file has become very hacky, I am sure there is a better way to do all of this, but for now, this works. if [ -f "/usr/bin/odroidgoa_utils.sh" ]; then DEFBRIGHT=$(get_ee_setting brightness.level) RACONF=/storage/.config/retroarch/retroarch.cfg sed -i "/screen_brightness/d" ${RACONF} echo "screen_brightness = \"${DEFBRIGHT}\"" >> ${RACONF} fi BTENABLED=$(get_ee_setting ee_bluetooth.enabled) if [[ "${BTENABLED}" == "1" ]]; then # We don't need the BT agent while running games systemctl stop bluetooth-agent fi # clear terminal window clear > /dev/tty < /dev/null 2>&1 clear > /dev/tty0 < /dev/null 2>&1 clear > /dev/tty1 < /dev/null 2>&1 clear > /dev/console < /dev/null 2>&1 arguments="$@" emuelec-utils setauddev # set audio to alsa set_audio alsa # Set the variables CFG="/storage/.emulationstation/es_settings.cfg" LOGEMU="No" VERBOSE="" LOGSDIR="/emuelec/logs" TBASH="/usr/bin/bash" RACONF="/storage/.config/retroarch/retroarch.cfg" NETPLAY="No" RABIN="retroarch" init_game # Make sure the /emuelec/logs directory exists if [[ ! -d "${LOGSDIR}" ]]; then mkdir -p "${LOGSDIR}" fi USELOG="1" LOGLEVEL=$(get_ee_setting "retroarchLogging" "global") if [[ ${arguments} == *"--NOLOG"* ]] || [[ "${LOGLEVEL}" == "0" ]]; then USELOG="0" fi if [ "${USELOG}" == "0" ]; then EMUELECLOG="/dev/null" cat /etc/motd > "${LOGSDIR}/emuelec.log" echo "Logging has been disabled, enable it in Main Menu > System Settings > Developer > Log Level" >> "${LOGSDIR}/emuelec.log" else EMUELECLOG="${LOGSDIR}/emuelec.log" fi set_kill_keys() { # If gptokeyb is running we kill it first. kill_video_controls KILLTHIS=${1} KILLSIGNAL=${2} } # Extract the platform name from the arguments PLATFORM="${arguments##*-P}" # read from -P onwards PLATFORM="${PLATFORM%% *}" # until a space is found CORE="${arguments##*--core=}" # read from --core= onwards CORE="${CORE%% *}" # until a space is found EMULATOR="${arguments##*--emulator=}" # read from --emulator= onwards EMULATOR="${EMULATOR%% *}" # until a space is found ROMNAME="${1}" BASEROMNAME="${ROMNAME##*/}" GAMEFOLDER="${ROMNAME//${BASEROMNAME}}" KILLTHIS="none" KILLSIGNAL="15" if [[ "${CORE}" == *"_32b"* ]]; then BIT32="yes" #LD_LIBRARY_PATH="/emuelec/lib32:${LD_LIBRARY_PATH}" RABIN="retroarch32" else BIT32="No" fi if [[ "${EMULATOR}" = "libretro" ]]; then [[ -f "/storage/.config/RA_KILL_KEYS" ]] && set_kill_keys "${RABIN}" EMU="${CORE}_libretro" LIBRETRO="yes" RETRORUN="" else EMU="${CORE}" fi if [[ "${EMULATOR}" = "retrorun" ]]; then RR_EXE="retrorun" [[ "${BIT32}" == "yes" ]] && RR_EXE="retrorun32" set_kill_keys "${RR_EXE}" EMU="${CORE}_libretro" RETRORUN="yes" LIBRETRO="" fi ROTATION_OUTPUT=$(get_ee_setting "${EMULATOR}.rotation_output" "${PLATFORM}" "${BASEROMNAME}") [[ -z "${ROTATION_OUTPUT}" ]] && ROTATION_OUTPUT=0 CMD_ROTATE=$(emuelec-utils set_rotation "${ROTATION_OUTPUT}" "${EMULATOR}") MIDI_OUTPUT=$(get_ee_setting "ra_midi_output" "${PLATFORM}" "${BASEROMNAME}") if [[ ! -z "${MIDI_OUTPUT}" ]]; then emuelec-utils set_midi_source "${MIDI_OUTPUT}" "${EMULATOR}" fi # freej2me needs the JDK to be downloaded on the first run if [ ${EMU} == "freej2me_libretro" ]; then freej2me.sh JAVA_HOME='/storage/roms/bios/jdk' export JAVA_HOME PATH="${JAVA_HOME}/bin:${PATH}" export PATH fi # Ports that use this file are all Libretro, so lets set it [[ ${PLATFORM} = "ports" ]] && LIBRETRO="yes" # if there wasn't a --NOLOG included in the arguments, enable the emulator log output. TODO: this should be handled in ES menu if [ "${USELOG}" == "1" ]; then LOGEMU="Yes" VERBOSE="-v" fi # Get the latest save files if there is any CLOUD_SYNC=$(get_ee_setting "${PLATFORM}.cloudsave") [[ "${CLOUD_SYNC}" == "1" ]] && ra_rclone.sh get "${PLATFORM}" "${ROMNAME}" & CLOUD_PID=$! emuelec-utils init_app_video "${PLATFORM}" "${ROMNAME}" CONTROLLERCONFIG="${arguments#*--controllers=*}" echo "${CONTROLLERCONFIG}" | tr -d '"' > "/tmp/controllerconfig.txt" # .bighard files always go to BigInstinct, regardless of platform/emu choice if [[ "${ROMNAME,,}" == *.bighard ]]; then set_kill_keys "biginstinct" RUNTHIS='${TBASH} biginstinctstart.sh "${ROMNAME}"' elif [ -z ${LIBRETRO} ] && [ -z ${RETRORUN} ]; then GPTOKEYB=$(get_ee_setting "gptokeyb" "${PLATFORM}" "${BASEROMNAME}") VIRTUAL_KB= # Read the first argument in order to set the right emulator case ${PLATFORM} in "atari2600") if [ "${EMU}" = "STELLASA" ]; then set_kill_keys "stella" RUNTHIS='${TBASH} stella.sh "${ROMNAME}"' fi ;; "atarist") if [ "${EMU}" = "HATARISA" ]; then set_kill_keys "hatari" RUNTHIS='${TBASH} hatari.start "${ROMNAME}"' fi ;; "atarijaguar") if [ "${EMU}" = "bigpemu" ]; then set_kill_keys "bigpemu" RUNTHIS='${TBASH} bigpemustart.sh "${ROMNAME}"' fi ;; "atarijaguarcd") if [ "${EMU}" = "bigpemu" ]; then set_kill_keys "bigpemu" RUNTHIS='${TBASH} bigpemustart.sh "${ROMNAME}"' fi ;; "openbor") VIRTUAL_KB=$(emuelec-utils set_gptokeyb "${PLATFORM}" "${GPTOKEYB}") set_kill_keys "${EMU}" RUNTHIS='${TBASH} openbor.sh "${ROMNAME}" "${EMU}"' ;; "ikemen") if [ "$EMU" = "ikemen" ]; then set_kill_keys "Ikemen_Go" RUNTHIS='${TBASH} Ikemen_Go.sh "${ROMNAME}"' fi ;; "setup") if [ "${EE_DEVICE}" == "OdroidGoAdvance" ] || [ "${EE_DEVICE}" == "GameForce" ]; then set_kill_keys "kmscon" else set_kill_keys "fbterm" fi RUNTHIS='${TBASH} fbterm.sh "${ROMNAME}"' EMUELECLOG="${LOGSDIR}/ee_script.log" ;; "dreamcast"|"naomi"|"atomiswave") if [ "${EMU}" = "flycastsa" ]; then set_kill_keys "flycast" RUNTHIS='${TBASH} flycast.sh "${ROMNAME}"' elif [ "${EMU}" = "flycast_dojo" ]; then set_kill_keys "flycastdojo" RUNTHIS='flycastdojo.sh "${ROMNAME}"' fi ;; "psx") if [ "${EMU}" = "duckstation" ]; then set_kill_keys "duckstation-nogui" RUNTHIS='${TBASH} duckstation.sh "${ROMNAME}"' fi ;; "mame"|"arcade"|"cps1"|"cps2"|"cps3") if [ "${EMU}" = "AdvanceMame" ]; then set_kill_keys "advmame" 3 RUNTHIS='${TBASH} advmame.sh "${PLATFORM}" "${ROMNAME}"' elif [ "${EMU}" = "FbneoSA" ]; then set_kill_keys "fbneo" RUNTHIS='fbneo.sh "${ROMNAME}"' fi ;; "fbn"|"neogeo") if [ "${EMU}" = "FbneoSA" ]; then set_kill_keys "fbneo" RUNTHIS='fbneo.sh "${ROMNAME}"' fi ;; "nds") set_kill_keys "drastic" RUNTHIS='${TBASH} /storage/.emulationstation/scripts/drastic.sh "${ROMNAME}"' ;; "n64") if [ "${EMU}" = "rice" ]; then set_kill_keys "mupen64plus" RUNTHIS='${TBASH} m64p.sh "${ROMNAME}"' elif [ "${EMU}" = "glide64mk2" ]; then set_kill_keys "mupen64plus" RUNTHIS='${TBASH} m64p.sh "${ROMNAME}" m64p_gl64mk2' fi ;; "amiga"|"amigacd32") if [ "${EMU}" = "AMIBERRY-LITE" ] || [ "${EMU}" = "AMIBERRY" ]; then RUNTHIS='${TBASH} amiberry.start "${ROMNAME}" "${EMU}"' fi ;; "scummvm") if [[ "${ROMNAME}" == *".sh" ]]; then set_kill_keys "fbterm" RUNTHIS='${TBASH} fbterm.sh "${ROMNAME}"' EMUELECLOG="${LOGSDIR}/ee_script.log" else if [ "${EMU}" = "SCUMMVMSA" ]; then set_kill_keys "scummvm" RUNTHIS='${TBASH} scummvm.start sa "${ROMNAME}"' else RUNTHIS='${TBASH} scummvm.start libretro' fi fi ;; "solarus") set_kill_keys "solarus-run" RUNTHIS='${TBASH} solarus.sh "${ROMNAME}"' ;; "ti99") if [ "${EMU}" = "ti99sim" ]; then set_kill_keys "ti99sim-sdl" RUNTHIS='${TBASH} ti99sdlstart.sh "${ROMNAME}"' fi ;; "samcoupe") if [ "${EMU}" = "simcoupe" ]; then set_kill_keys "simcoupe" RUNTHIS='${TBASH} simcoupestart.sh "${ROMNAME}"' fi ;; "daphne") if [ "${EMU}" = "HYPSEUS" ]; then set_kill_keys "hypseus" RUNTHIS='${TBASH} hypseus.start.sh "${ROMNAME}"' fi ;; "wii"|"gamecube") if [ "${EMU}" = "dolphin" ]; then set_kill_keys "dolphin-emu-nogui" RUNTHIS='${TBASH} dolphin.sh "${ROMNAME}"' fi ;; "pc") if [ "${EMU}" = "DOSBOXSDL2" ]; then set_kill_keys "dosbox" RUNTHIS='${TBASH} dosbox.start "${ROMNAME}"' #RUNTHIS='${TBASH} dosbox.start -conf "${GAMEFOLDER}dosbox-SDL2.conf"' fi if [ "${EMU}" = "DOSBOX-X" ]; then set_kill_keys "dosbox-x" RUNTHIS='${TBASH} dosbox-x.start "${ROMNAME}"' #RUNTHIS='${TBASH} dosbox-x.start -conf "${GAMEFOLDER}dosbox-SDL2.conf"' fi ;; "psp"|"pspminis") if [ "${EMU}" = "PPSSPPSDL" ]; then set_kill_keys "PPSSPPSDL" RUNTHIS='${TBASH} ppsspp.sh "${ROMNAME}"' fi ;; "ngage") if [ "$EMU" = "eka2l1" ]; then set_kill_keys "eka2l1" RUNTHIS='${TBASH} ekastart.sh "${ROMNAME}"' fi ;; "neocd") if [ "${EMU}" = "fbneo" ]; then RUNTHIS='${RABIN} ${VERBOSE} -L /tmp/cores/fbneo_libretro.so --subsystem neocd --config ${RACONF} "${ROMNAME}"' elif [ "${EMU}" = "FbneoSA" ]; then set_kill_keys "fbneo" RUNTHIS='fbneo.sh "${ROMNAME}" NCD' fi ;; "mplayer") set_kill_keys "${EMU}" RUNTHIS='${TBASH} fbterm.sh mplayer_video "${ROMNAME}" "${EMU}"' ;; "pico8") set_kill_keys "pico8_dyn" RUNTHIS='${TBASH} pico8.sh "${ROMNAME}"' ;; "prboom") if [ "${EMU}" = "Chocolate-Doom" ]; then set_kill_keys "chocolate-doom" CONTROLLERCONFIG="${arguments#*--controllers=*}" RUNTHIS='${TBASH} chocodoom.sh "${ROMNAME}" --controllers="${CONTROLLERCONFIG}"' elif [ "${EMU}" = "LZDoom" ]; then set_kill_keys "lzdoom" CONTROLLERCONFIG="${arguments#*--controllers=*}" RUNTHIS='${TBASH} lzdoom.sh "${ROMNAME}" --controllers="${CONTROLLERCONFIG}"' elif [ "${EMU}" = "GZDoom" ]; then set_kill_keys "gzdoom" CONTROLLERCONFIG="${arguments#*--controllers=*}" RUNTHIS='${TBASH} gzdoom.sh "${ROMNAME}" --controllers="${CONTROLLERCONFIG}"' fi ;; "ecwolf") if [ "${EMU}" = "ecwolf" ]; then set_kill_keys "ecwolf" CONTROLLERCONFIG="${arguments#*--controllers=*}" RUNTHIS='${TBASH} ecwolf.sh "${ROMNAME}" --controllers="${CONTROLLERCONFIG}"' fi ;; "gmloader") set_kill_keys "gmloader" CONTROLLERCONFIG="${arguments#*--controllers=*}" RUNTHIS='${TBASH} gmloader.sh "${ROMNAME}" --controllers="${CONTROLLERCONFIG}"' ;; "intellivision") if [ "${EMU}" = "jzintv" ]; then set_kill_keys "jzintv" RUNTHIS='jzintv.sh "${ROMNAME}"' fi ;; "x16") if [ "${EMU}" = "x16emu" ]; then set_kill_keys "x16emu" RUNTHIS='${TBASH} x16emustart.sh "${ROMNAME}"' fi ;; "oricatmos") if [ "${EMU}" = "oricutron" ]; then set_kill_keys "oricutron" RUNTHIS='${TBASH} oricutronstart.sh "${ROMNAME}"' fi ;; "dragon32"|"dragon64") if [ "${EMU}" = "xroar" ]; then set_kill_keys "xroar.aarch64" RUNTHIS='${TBASH} /usr/bin/xroar.sh "${ROMNAME}"' fi ;; "coco") if [ "${EMU}" = "xroar" ]; then set_kill_keys "xroar.aarch64" RUNTHIS='${TBASH} /usr/bin/xroar.sh "${ROMNAME}"' fi ;; "coco3") if [ "${EMU}" = "xroar" ]; then set_kill_keys "xroar.aarch64" RUNTHIS='${TBASH} /usr/bin/xroar.sh "${ROMNAME}"' fi ;; "mc10") if [ "${EMU}" = "xroar" ]; then set_kill_keys "xroar.aarch64" RUNTHIS='${TBASH} /usr/bin/xroar.sh "${ROMNAME}"' fi ;; "saturn") if [ "${EMU}" = "yabasanshiroSA" ]; then set_kill_keys "yabasanshiro" RUNTHIS='yabasanshiro.sh "${ROMNAME}"' elif [ "${EMU}" = "yabasanshiroSA1_5" ]; then set_kill_keys "yabasanshiro1_5" RUNTHIS='yabasanshiro1_5.sh "${ROMNAME}"' fi ;; esac elif [ ${LIBRETRO} == "yes" ]; then # We are running a Libretro emulator set all the settings that we chose on ES case ${PLATFORM} in "arcade"|"mame"|"fmtmarty"|"pgm2"|"apple2") if [ "$EMU" = "mame_libretro" ]; then mame.sh fi ;; esac if [ "$EMU" = "mednafen_supafaust_libretro" ]; then emuelec-utils small-cores enable fi if [[ ${PLATFORM} == "ports" ]]; then PORTCORE="${arguments##*-C}" # read from -C onwards EMU="${PORTCORE%% *}_libretro" # until a space is found PORTSCRIPT="${arguments##*-SC}" # read from -SC onwards ROMNAME_SHADER=${PORTSCRIPT} else ROMNAME_SHADER=${ROMNAME} fi if [ -s "/emuelec/configs/RA_ARGS" ]; then RA_ARGS = $(cat "/emuelec/configs/RA_ARGS") fi RUNTHIS='${RABIN} ${VERBOSE} ${RA_ARGS} -L /tmp/cores/${EMU}.so --config ${RACONF} "${ROMNAME}"' CONTROLLERCONFIG="${arguments#*--controllers=*}" if [[ "${arguments}" == *"-state_slot"* ]]; then CONTROLLERCONFIG="${CONTROLLERCONFIG%% -state_slot*}" # until -state_slot is found SNAPSHOT="${arguments#*-state_slot *}" # -state_slot x ... SNAPSHOT="${SNAPSHOT%% -*}" # we only need the state_slot else SNAPSHOT="" fi if [[ "${arguments}" == *"-autosave"* ]]; then CONTROLLERCONFIG="${CONTROLLERCONFIG%% -autosave*}" # until -autosave is found AUTOSAVE="${arguments#*-autosave *}" # -autosave x ... AUTOSAVE="${AUTOSAVE%% -*}" # we only need autosave else AUTOSAVE="0" fi CORE=${EMU%%_*} # Netplay # make sure the ip and port are blank set_ee_setting "netplay.server.ip" "disable" set_ee_setting "netplay.server.port" "disable" set_ee_setting "netplay.mode" "disable" # check if we started as host for a game if [[ "${arguments}" == *"--host"* ]]; then NETPLAY="${arguments##*--host}" # read from --host onwards NETPLAY="${NETPLAY%%--nick*}" # until --nick is found NETPLAY="--host ${NETPLAY} --nick" fi # check if we are trying to connect to a client on netplay if [[ "${arguments}" == *"--connect"* ]]; then NETPLAY="${arguments##*--connect}" # read from --connect onwards NETPLAY="${NETPLAY%%--nick*}" # until --nick is found NETPLAY="--connect ${NETPLAY} --nick" set_ee_setting "netplay.mode" "client" fi # check if we are trying to connect as spectator on netplay if [[ "${arguments}" == *"--netplaymode spectator"* ]]; then set_ee_setting "netplay.mode" "spectator" fi if [[ ${NETPLAY} != "No" ]]; then NETPLAY_NICK=$(get_ee_setting netplay.nickname) [[ -z "${NETPLAY_NICK}" ]] && NETPLAY_NICK="Anonymous" NETPLAY="$(echo ${NETPLAY} | sed "s|--nick|--nick \"${NETPLAY_NICK}\"|")" RUNTHIS=$(echo ${RUNTHIS} | sed "s|--config|${NETPLAY} --config|") if [[ "${NETPLAY}" == *"connect"* ]]; then NETPLAY_PORT="${arguments##*--port }" # read from -netplayport onwards NETPLAY_PORT="${NETPLAY_PORT%% *}" # until a space is found NETPLAY_IP="${arguments##*--connect }" # read from -netplayip onwards NETPLAY_IP="${NETPLAY_IP%% *}" # until a space is found set_ee_setting "netplay.server.ip" "${NETPLAY_IP}" set_ee_setting "netplay.server.port" "${NETPLAY_PORT}" fi fi # End netplay SHADERSET=$(setsettings.sh "${PLATFORM}" "${ROMNAME_SHADER}" "${CORE}" --controllers="${CONTROLLERCONFIG}" --autosave="${AUTOSAVE}" --snapshot="${SNAPSHOT}") #echo ${SHADERSET} # Only needed for debug if [[ ${SHADERSET} != 0 ]]; then RUNTHIS=$(echo ${RUNTHIS} | sed "s|--config|${SHADERSET} --config|") fi # we check is maxperf is set only if OGA OC is off OGAOC=$(get_ee_setting ee_oga_oc) [ -z "${OGAOC}" ] && OGAOC="Off" if [[ "${OGAOC}" == "Off" ]]; then if [ $(get_ee_setting "maxperf" "${PLATFORM}" "${BASEROMNAME}") == "0" ]; then normperf else maxperf fi fi else # Retrorun was selected # Retrotun does not support settings RUNTHIS="retrorun" if [ "${BIT32}" == "yes" ]; then RUNTHIS+="32" fi JOY_FILE=$(ls "/dev/input/by-path/*-event-joystick" ) if [[ -f "${JOY_FILE}" ]]; then ln -s /dev/input/event2 ${JOY_FILE} fi RUNTHIS+=' ${CMD_ROTATE} --triggers -g -d /storage/roms/bios /tmp/cores/${EMU}.so "${ROMNAME}"' fi # end Libretro/retrorun or standalone emu logic if [ "${USELOG}" == "1" ]; then # No need to do all this if log is disabled # Clear the log file echo "EmuELEC Run Log" > ${EMUELECLOG} cat /etc/motd >> ${EMUELECLOG} [[ "${NETPLAY}" == *"connect"* ]] && echo "Netplay client!" >> ${EMUELECLOG} # Write the command to the log file. echo "PLATFORM: ${PLATFORM}" >> ${EMUELECLOG} echo "ROM NAME: ${ROMNAME}" >> ${EMUELECLOG} echo "BASE ROM NAME: ${ROMNAME##*/}" >> ${EMUELECLOG} echo "USING CONFIG: ${RACONF}" >> ${EMUELECLOG} echo "1st Argument: ${1}" >> ${EMUELECLOG} echo "2nd Argument: ${2}" >> ${EMUELECLOG} echo "3rd Argument: ${3}" >> ${EMUELECLOG} echo "4th Argument: ${4}" >> ${EMUELECLOG} echo "Full arguments: ${arguments}" >> ${EMUELECLOG} echo "Run Command is:" >> ${EMUELECLOG} eval echo ${RUNTHIS} >> ${EMUELECLOG} fi [[ "${KILLTHIS}" != "none" ]] && gptokeyb 1 ${KILLTHIS} ${VIRTUAL_KB} -killsignal ${KILLSIGNAL} & [[ "${CLOUD_SYNC}" == "1" ]] && wait ${CLOUD_PID} # Execute the command and try to output the results to the log file if it was not disabled. if [[ ${LOGEMU} == "Yes" ]]; then echo "Emulator Output is:" >> ${EMUELECLOG} eval ${RUNTHIS} >> ${EMUELECLOG} 2>&1 ret_error=${?} else echo "Emulator log was dissabled" >> ${EMUELECLOG} eval ${RUNTHIS} > /dev/null 2>&1 ret_error=${?} fi # clear terminal window reset > /dev/tty < /dev/null 2>&1 reset > /dev/tty0 < /dev/null 2>&1 reset > /dev/tty1 < /dev/null 2>&1 reset > /dev/console < /dev/null 2>&1 # END loading emuelec-utils end_app_video "${PLATFORM}" "${ROMNAME}" emuelec-utils set_rotation "0" "${EMULATOR}" # Kill MIDI Processes emuelec-utils set_midi_source "None" "${EMULATOR}" [[ "${CLOUD_SYNC}" == "1" ]] && ra_rclone.sh set "${PLATFORM}" "${ROMNAME}" & # Just in case kill_video_controls # Just for good measure lets make a symlink to Retroarch logs if it exists if [[ -f "/storage/.config/retroarch/retroarch.log" ]] && [[ ! -e "${LOGSDIR}/retroarch.log" ]]; then ln -sf /storage/.config/retroarch/retroarch.log ${LOGSDIR}/retroarch.log fi #{log_addon}# # reset audio to default set_audio default if [[ "${BTENABLED}" == "1" ]]; then # Restart the bluetooth agent systemctl start bluetooth-agent fi if [ "${EE_DEVICE}" == "OdroidGoAdvance" ]; then # To avoid screwing up the gamepad configuration after setting vertical mode we return the config to horizontal case "$(oga_ver)" in "OGA") if [ -f "/tmp/joypads/GO-Advance Gamepad_horizontal.cfg" ]; then mv "/tmp/joypads/GO-Advance Gamepad.cfg" "/tmp/joypads/GO-Advance Gamepad_vertical.cfg" mv "/tmp/joypads/GO-Advance Gamepad_horizontal.cfg" "/tmp/joypads/GO-Advance Gamepad.cfg" fi ;; "OGABE") if [ -f "/tmp/joypads/GO-Advance Gamepad (rev 1.1)_horizontal.cfg" ]; then mv "/tmp/joypads/GO-Advance Gamepad (rev 1.1).cfg" "/tmp/joypads/GO-Advance Gamepad (rev 1.1)_vertical.cfg" mv "/tmp/joypads/GO-Advance Gamepad (rev 1.1)_horizontal.cfg" "/tmp/joypads/GO-Advance Gamepad (rev 1.1).cfg" fi ;; "OGS") if [ -f "/tmp/joypads/GO-Super Gamepad_horizontal.cfg" ]; then mv "/tmp/joypads/GO-Super Gamepad.cfg" "/tmp/joypads/GO-Super Gamepad_vertical.cfg" mv "/tmp/joypads/GO-Super Gamepad_horizontal.cfg" "/tmp/joypads/GO-Super Gamepad.cfg" fi ;; esac fi # These emus do not like to be killed by gptokeyb case "${EMU}" in "dolphin" | "Chocolate-Doom" | "yabasanshiroSA" | "yabasanshiroSA1_5" | *"scummvm_libretro"* | *"ikemen"* | *"jzintv"*) ret_error="0" ;; esac [[ "${RETRORUN}" == "yes" ]] && ret_error=0 [[ "${CLOUD_SYNC}" == "1" ]] && wait ${CLOUD_PID} end_game if [ "$EMU" = "mednafen_supafaust_libretro" ]; then emuelec-utils small-cores disable fi if [[ "${ret_error}" != "0" ]]; then echo "exit ${ret_error}" >> ${EMUELECLOG} ret_bios=0 # Check for missing bios if needed REQUIRESBIOS=(atari5200 atari800 atari7800 atarilynx colecovision amiga amigacd32 o2em intellivision pcengine pcenginecd pcfx fds segacd saturn dreamcast naomi atomiswave x68000 neogeo neogeocd msx msx2 sc-3000) (for e in "${REQUIRESBIOS[@]}"; do [[ "${e}" == "${PLATFORM}" ]] && exit 0; done) && RB=0 || RB=1 if [ ${RB} == 0 ]; then CBPLATFORM="${PLATFORM}" [[ "${CBPLATFORM}" == "msx2" ]] && CBPLATFORM="msx" [[ "${CBPLATFORM}" == "pcenginecd" ]] && CBPLATFORM="pcengine" [[ "${CBPLATFORM}" == "amigacd32" ]] && CBPLATFORM="amiga" ee_check_bios "${CBPLATFORM}" "${CORE}" "${EMULATOR}" "${ROMNAME}" "${EMUELECLOG}" ret_bios=${?} echo "exit bios ${ret_bios}" >> ${EMUELECLOG} fi #require bios ends # Since the error was not because of missing BIOS but we did get an error, display the log to find out [[ "${ret_bios}" == "0" ]] && text_viewer -e -w -t "Error! ${PLATFORM}-${EMULATOR}-${CORE}-${ROMNAME}" -f 24 ${EMUELECLOG} emuelec-utils blank_buffer exit 1 else echo "exit 0" >> ${EMUELECLOG} echo "return_from_game" > /tmp/es_return_from_game emuelec-utils blank_buffer exit 0 fi ================================================ FILE: packages/sx05re/emuelec/bin/emuelec_autostart.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile # DO NOT modify this file, if you need to use autostart please use /storage/.config/custom_start.sh # It seems some slow SDcards have a problem creating the symlink on time :/ CONFIG_DIR="/storage/.emulationstation" CONFIG_DIR2="/storage/.config/emulationstation" if [ ! -L "${CONFIG_DIR}" ]; then ln -sf ${CONFIG_DIR2} ${CONFIG_DIR} fi if [ "${EE_DEVICE}" == "Amlogic" ]; then rm "/storage/.config/asound.conf" > /dev/null 2>&1 cp "/storage/.config/asound.conf-amlogic" "/storage/.config/asound.conf" if [ "$(get_ee_setting bool StopMusicOnScreenSaver)" != "false" ]; then sed -i "/| \n|g" "${ES_CONF}" fi elif [ "${EE_DEVICE}" == "Amlogic-ng" ] || [ "${EE_DEVICE}" == "OdroidM1" ]; then rm "/storage/.config/asound.conf" > /dev/null 2>&1 cp "/storage/.config/asound.conf-amlogic-ng" "/storage/.config/asound.conf" elif [ "${EE_DEVICE}" == "Amlogic-no" ]; then rm "/storage/.config/asound.conf" > /dev/null 2>&1 cp "/storage/.config/asound.conf-amlogic-ng" "/storage/.config/asound.conf" AUDIO_DEVICE_NO=$(get_ee_setting ee_audio_device) if [ "${AUDIO_DEVICE_NO,,}" = "auto" ] || [ -z "${AUDIO_DEVICE_NO}" ]; then set_ee_setting "ee_audio_device" "0,2" fi fi HOSTNAME=$(get_ee_setting system.hostname) if [ ! -z "${HOSTNAME}" ];then echo "${HOSTNAME}" > /storage/.cache/hostname else echo "EMUELEC" > /storage/.cache/hostname fi cat /storage/.cache/hostname > /proc/sys/kernel/hostname if [[ "${EE_DEVICE}" == "GameForce" ]]; then LED=$(get_ee_setting bl_rgb) [ -z "${LED}" ] && LED="Off" odroidgoa_utils.sh bl "${LED}" LED=$(get_ee_setting gf_statusled) [ -z "${LED}" ] && LED="heartbeat" odroidgoa_utils.sh pl "${LED}" rk_wifi_init /dev/ttyS1 fi if [[ "${EE_DEVICE}" == "GameForce" ]] || [[ "${EE_DEVICE}" == "OdroidGoAdvance" ]]; then if [ -e "/flash/no_oc.oga" ]; then set_ee_setting ee_oga_oc disable OGAOC="" else OGAOC=$(get_ee_setting ee_oga_oc) fi [ -z "${OGAOC}" ] && OGAOC="Off" odroidgoa_utils.sh oga_oc "${OGAOC}" fi # Mounts /storage/roms MOUNT_HANDLER=$(get_ee_setting ee_mount.handler) if [ -z "${MOUNT_HANDLER}" ]; then MOUNT_HANDLER="eemount" fi ${MOUNT_HANDLER} &> /emuelec/logs/eemount.log # copy default bezel to /storage/roms/bezel if it doesn't exists if [ ! -f "/storage/roms/bezels/default.cfg" ]; then mkdir -p /storage/roms/bezels/ cp -rf /usr/share/retroarch-overlays/bezels/* /storage/roms/bezels/ & fi # Restore config if backup exists BACKUPTAR="ee_backup_config.tar.gz" BACKUPFILE="/storage/roms/backup/${BACKUPTAR}" [[ ! -f "${BACKUPFILE}" ]] && BACKUPFILE="/var/media/EEROMS/backup/${BACKUPTAR}" if [ -f "${BACKUPFILE}" ]; then emuelec-utils ee_backup restore no > /emuelec/logs/last-restore.log 2>&1 fi # Clean cache garbage when boot up. rm -rf /storage/.cache/cores/* & # handle SSH DEFE=$(get_ee_setting ee_ssh.enabled) case "${DEFE}" in "0") systemctl stop sshd rm /storage/.cache/services/sshd.conf ;; *) mkdir -p /storage/.cache/services/ touch /storage/.cache/services/sshd.conf systemctl start sshd ;; esac # Checks and sets the resolution for starting ES. check_res.sh # Show splash creen show_splash.sh intro # run custom_start before FE scripts /storage/.config/custom_start.sh before & # Just make sure all the subshells are finished before starting front-end wait # Start Scanning for Bluetooth Controllers BTENABLED=$(get_ee_setting ee_bluetooth.enabled) BTSCANTIME=$(get_ee_setting ee_bluetooth.scantime) if [[ "${BTENABLED}" != "1" ]]; then systemctl stop bluetooth rm /storage/.cache/services/bluez.conf & else systemctl restart bluetooth emuelec-bluetooth ${BTSCANTIME} & fi # Auto shutdown will persist between reboots as long as ee_auto_shutdown_timeout is > 0 ASHD=$(get_ee_setting ee_auto_shutdown_persistent) if [ "${ASHD}" != "1" ]; then set_ee_setting ee_auto_shutdown_timeout 0 set_ee_setting ee_auto_shutdown_persistent 0 # Paranoia fi killall ee_asd > /dev/null 2>&1 # Paranoia ee_asd # What to start at boot? DEFE=$(get_ee_setting ee_boot) case "${DEFE}" in "Retroarch") rm -rf /var/lock/start.retro touch /var/lock/start.retro systemctl start retroarch ;; *) rm /var/lock/start.games touch /var/lock/start.games systemctl start emustation ;; esac # run custom_start ending scripts /storage/.config/custom_start.sh after ================================================ FILE: packages/sx05re/emuelec/bin/emueleclogs.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # create logfile DATE=`date -u +%Y-%m-%d-%H.%M.%S` BASEDIR="/tmp" LOGDIR="log-${DATE}" RELEASE="`cat /etc/release`" GIT="`cat /etc/issue | grep git`" getlog_cmd() { if command -v ${1} >/dev/null; then echo "################################################################################" >> ${BASEDIR}/${LOGDIR}/${LOGFILE} echo "# ... output of $@" >> ${BASEDIR}/${LOGDIR}/${LOGFILE} echo "# EmuELEC release: ${RELEASE}" >> ${BASEDIR}/${LOGDIR}/${LOGFILE} echo "# ${GIT}" >> ${BASEDIR}/${LOGDIR}/${LOGFILE} echo "################################################################################" >> ${BASEDIR}/${LOGDIR}/${LOGFILE} "$@" >> ${BASEDIR}/${LOGDIR}/${LOGFILE} 2>/dev/null echo "" >> ${BASEDIR}/${LOGDIR}/${LOGFILE} fi } get_governor_details() { ( cat_all_files /sys/devices/system/cpu cat_all_files /sys/devices/system/cpu/cpufreq for cpun in /sys/devices/system/cpu/cpu[0-9]*; do cat_all_files ${cpun}/cpufreq done ) } cat_all_files() { local adir=${1} local afile var [ -d ${adir} ] || return 0 echo "${adir}" cd ${adir} for afile in $(find . -maxdepth 1 -print | sort); do afile=${afile:2} if [ -n "${afile}" ]; then if [ -d ${afile} ]; then var="" else var="$(cat ${afile} 2>/dev/null)" fi [ -n "${var}" ] && printf " %-30s : %s\n" "${afile}" "${var}" fi done } rm -rf ${BASEDIR}/${LOGDIR} mkdir -p ${BASEDIR}/${LOGDIR} # emuelec.conf EE_LOG_DIR=/emuelec/configs LOGFILE="00_EMUELEC_CONF.log" for i in emuelec.conf; do [ -f ${EE_LOG_DIR}/${i} ] && getlog_cmd cat ${EE_LOG_DIR}/${i} done # es_log.txt EE_LOG_DIR=/storage LOGFILE="01_EE_VERSION.log" for i in EE_VERSION; do [ -f ${EE_LOG_DIR}/.config/${i} ] && getlog_cmd cat ${EE_LOG_DIR}/.config/${i} getlog_cmd cat /usr/config/EE_VERSION done LOGFILE="02_JOYPADS.log" find /tmp/joypads -type f -name "*.cfg" -print0 | while IFS= read -r -d '' file; do getlog_cmd cat "${file}" done EE_LOG_DIR=/emuelec/logs LOGFILE="03_EE_LOGS.LOG" for i in emuelec.log sx05re.log emulationstation.log es_log.txt es_log.txt.bak retroarch.log hatari.log dosbox.log amiberry.log; do if [ ${i} = "es_log.txt" ] || [ ${i} = "es_log.txt.bak" ]; then getlog_cmd grep -e lvl2 -e Error ${EE_LOG_DIR}/${i} else [ -f ${EE_LOG_DIR}/${i} ] && getlog_cmd cat ${EE_LOG_DIR}/${i} fi done EE_LOG_DIR=/storage/.config/retroarch LOGFILE="04_RETROARCH.log" for i in retroarch.cfg; do [ -f ${EE_LOG_DIR}/${i} ] && getlog_cmd cat ${EE_LOG_DIR}/${i} done EE_LOG_DIR=/storage/ LOGFILE="05_ES.LOG" for i in es_input.cfg es_settings.cfg es_systems.cfg; do [ -f ${EE_LOG_DIR}/.emulationstation/${i} ] && getlog_cmd cat ${EE_LOG_DIR}/.emulationstation/${i} done # System.log LOGFILE="06_System.log" echo "****** dmseg ******" >> ${BASEDIR}/${LOGDIR}/${LOGFILE} 2>/dev/null dmesg | grep -v cectx >> ${BASEDIR}/${LOGDIR}/${LOGFILE} 2>/dev/null echo "****** end dmseg ******" >> ${BASEDIR}/${LOGDIR}/${LOGFILE} 2>/dev/null getlog_cmd lsmod getlog_cmd ps xa for i in /storage/.config/hwdb.d/*.hwdb \ /storage/.config/modprobe.d/*.conf \ /storage/.config/modules-load.d/*.conf \ /storage/.config/sleep.d/*.power \ /storage/.config/sysctl.d/*.conf \ /storage/.config/udev.rules.d/.rules \ ; do if [ -f "${i}" ] ; then getlog_cmd cat ${i} fi done if [ -f "/storage/.config/autostart.sh" ] ; then getlog_cmd cat /storage/.config/autostart.sh fi if [ -f "/storage/.config/shutdown.sh" ] ; then getlog_cmd cat /storage/.config/shutdown.sh fi getlog_cmd ls -laR /storage/.config/system.d # note: we dont add .mount units here as they may contan # login credentials for i in /storage/.config/system.d/*.service ; do if [ -f "${i}" -a ! -L "${i}" ] ; then getlog_cmd cat ${i} fi done # Hardware.log LOGFILE="07_Hardware.log" getlog_cmd lspci -vvvvnn getlog_cmd lsusb -vvv getlog_cmd lsusb -t getlog_cmd cat /proc/cpuinfo getlog_cmd get_governor_details getlog_cmd cat /proc/meminfo # Audio.log LOGFILE="08_Audio.log" getlog_cmd aplay -l getlog_cmd aplay -L getlog_cmd amixer # Network.log LOGFILE="09_Network.log" getlog_cmd ifconfig -a getlog_cmd netstat -rn getlog_cmd netstat -nalp getlog_cmd connmanctl services getlog_cmd cat /etc/resolv.conf # varlog.log LOGFILE="10_varlog.log" for i in `find /var/log -type f`; do getlog_cmd cat ${i} done # Input.log LOGFILE="11_input.log" getlog_cmd cat /proc/bus/input/devices # make RPi users happy if [ -e /proc/acpi/wakeup ] ; then getlog_cmd cat /proc/acpi/wakeup fi # Filesystem.log LOGFILE="12_Filesystem.log" getlog_cmd cat /proc/mounts getlog_cmd df -h getlog_cmd blkid # Journal (current) LOGFILE="13_Journal-cur.log" echo "****** journalctl --no-pager -b -0 ******" >> ${BASEDIR}/${LOGDIR}/${LOGFILE} 2>/dev/null journalctl --no-pager -b -0 | grep -v "cectx" >> ${BASEDIR}/${LOGDIR}/${LOGFILE} 2>/dev/null echo "****** end journalctl --no-pager -b -0 ******" >> ${BASEDIR}/${LOGDIR}/${LOGFILE} 2>/dev/null # Journal (prev) LOGFILE="14_Journal-prev.log" getlog_cmd journalctl --no-pager -b -1 | grep -v "cectx" # pack logfiles mkdir -p /emuelec/logs find ${BASEDIR}/${LOGDIR} -type f -exec sed -i "s|.*password.*||g" {} \; find ${BASEDIR}/${LOGDIR} -type f -exec sed -i "s|.*username.*||g" {} \; find ${BASEDIR}/${LOGDIR} -type f -exec sed -i "s|.*ssid=.*||g" {} \; find ${BASEDIR}/${LOGDIR} -type f -exec sed -i "s|.*ukey=.*||g" {} \; find ${BASEDIR}/${LOGDIR} -type f -exec sed -i "s|.*Attempting to login.*||g" {} \; find ${BASEDIR}/${LOGDIR} -type f -exec sed -i "s|.*logged in successfully.*||g" {} \; zip -jq /emuelec/logs/log-${DATE}.zip ${BASEDIR}/${LOGDIR}/* cat ${BASEDIR}/${LOGDIR}/* > /emuelec/logs/FULL_EMUELEC.LOG pastebinit /emuelec/logs/FULL_EMUELEC.LOG # remove logdir rm -rf ${BASEDIR}/${LOGDIR} ================================================ FILE: packages/sx05re/emuelec/bin/emustation-config ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile # odroidgoa function check_pwd() { ESSETTINGS="/storage/.config/emulationstation/es_settings.cfg" PWDFILE="${1}" while read line; do # Extract the first part (usually username) FIRST="${line#*=}" # read from = onwards FIRST="${FIRST%%:\{#\}:*}" # until a :{#}: is found # Extract the second part (usually password) SECOND="${line##*:\{#\}:}" # read from :{#}: onwards SECOND=$(echo "${SECOND}" | tr -d '[:space:]') case "$line" in WIFI=*) if [[ ! -z "${FIRST}" ]] && [[ ! -z "${SECOND}" ]]; then set_ee_setting wifi.ssid "${FIRST}" set_ee_setting wifi.key "${SECOND}" set_ee_setting wifi.enabled 1 #echo "WiFi information added" # Connect to WiFi if [[ ! -f "/storage/.cache/connman/emuelec_wifi.config" ]]; then batocera-config wifi enable "${FIRST}" "${SECOND}" fi fi ;; RAC=*) if [[ ! -z "${FIRST}" ]] && [[ ! -z "${SECOND}" ]]; then set_ee_setting global.retroachievements 1 set_ee_setting global.retroachievements.username "${FIRST}" set_ee_setting global.retroachievements.password "${SECOND}" # echo "Retroachievements information added" fi ;; SS=*) if [[ ! -z "${FIRST}" ]] && [[ ! -z "${SECOND}" ]]; then sed -i '/<\/config>/d' "${ESSETTINGS}" sed -i '/" >> "${ESSETTINGS}" echo " " >> "${ESSETTINGS}" echo '' >> "${ESSETTINGS}" # echo "screenscraper information added" fi ;; LANG=*) if [[ ! -z "${FIRST}" ]]; then set_ee_setting system.language "${FIRST}" fi ;; TZ=*) if [[ ! -z "${FIRST}" ]]; then set_ee_setting system.timezone "${FIRST}" fi ;; esac done < "${PWDFILE}" } # Make sure retroarch is not running before starting emulationstation to avoid sound conflicts while pgrep -x /usr/bin/retroarch >/dev/null; do systemctl stop retroarch sleep 1 done # We look for themes umount /emuelec/themes > /dev/null 2>&1 mkdir -p /emuelec/themes > /dev/null 2>&1 if [[ -d "/var/media/EEROMS/themes" ]]; then mount --bind /var/media/EEROMS/themes /emuelec/themes elif [[ -d "/storage/roms/themes" ]]; then mount --bind /storage/roms/themes /emuelec/themes fi systemctl start smbd # Set audio to alsa if we are starting retroarch or default otherwise [[ "$1" == "retroarch" ]] && set_audio alsa || set_audio default TZ=$(get_ee_setting system.timezone) echo "TIMEZONE=$TZ"|tr -d '\n' > /storage/.cache/timezone systemctl restart tz-data.service # create charmap used for translations locale=$(get_ee_setting system.language) charmap="UTF-8" lang="${locale}.${charmap}" locpath="/emuelec/configs/locale" i18npath="$locpath/i18n" localepath="$locpath/$lang" if [ $locale != "en_US" ]; then if [ ! -d $localepath ]; then export I18NPATH=$i18npath /usr/bin/localedef -f $charmap -i $locale $localepath fi fi export LOCPATH=$locpat export LANG=$lang export LANGUAGE=$lang systemctl import-environment LANG systemctl import-environment LOCPATH systemctl import-environment I18NPATH systemctl import-environment LANGUAGE if [ "$EE_DEVICE" == "OdroidGoAdvance" ] || [ "$EE_DEVICE" == "GameForce" ]; then # For some reason the audio is being reseted to 100 at boot, so we reaply the saved settings here odroidgoa_utils.sh vol $(get_ee_setting "audio.volume") # Workaround for theme not displaying correctly CONDIR="/storage/.config/emulationstation/themesettings" CONFILE="${CONDIR}/Crystal.cfg" ESSETTINGS="/storage/.config/emulationstation/es_settings.cfg" if [ ! -e "${CONFILE}" ]; then mkdir -p "${CONDIR}" touch "${CONFILE}" sed -i '//d' "${ESSETTINGS}" echo '' >> "${ESSETTINGS}" if [ -e "/dev/input/by-path/platform-odroidgo2-joypad-joystick" ]; then echo "subset.ratio=43" > "${CONFILE}" echo '' >> "${ESSETTINGS}" else echo "subset.ratio=169" > "${CONFILE}" echo '' >> "${ESSETTINGS}" fi echo '' >> "${ESSETTINGS}" fi else # Use stored volume instead of system default, this is only for Amlogic devices using AV as output AUDIO_DEVICE="hw:$(get_ee_setting ee_audio_device)" VOLUME=98 STORED_VOLUME=$(get_ee_setting audio.volume) [[ ! -z "$STORED_VOLUME" ]] && VOLUME=$STORED_VOLUME amixer set Master "$VOLUME%" fi # We need to always use the newest es_systems.cfg if there was a recent update, we also need to update the ports gamelist.xml and es_features.cfg CVER=$(cat /storage/.config/EE_VERSION) NVER=$(cat /usr/config/EE_VERSION) BUILDATE=$(cat /usr/buildate) ESDIR="/storage/.config/emulationstation" OLDCFG="${ESDIR}/es_systems.cfg.${BUILDATE}.bak" CFG="${ESDIR}/es_systems.cfg" if [[ "${CVER}" != "${NVER}" ]]; then #mv "/storage/.config/emuelec/ports/gamelist.xml" "/storage/.config/emuelec/ports/gamelist.xml.${BUILDATE}.bak" #cp -rf "/usr/bin/ports/gamelist.xml" "/storage/.config/emuelec/ports/gamelist.xml" mv "${ESDIR}/es_features.cfg" "${ESDIR}/es_features.cfg.${BUILDATE}.bak" cp -rf "/usr/config/emulationstation/es_features.cfg" "${ESDIR}/es_features.cfg" cp -f "${CFG}" "${OLDCFG}" cp -f "/usr/config/emulationstation/es_systems.cfg" "${CFG}" echo "${NVER}" > /storage/.config/EE_VERSION ( if grep -q 'nds' "${OLDCFG}"; then xmlstarlet ed --omit-decl --inplace \ -s '//systemList' -t elem -n 'system' \ -s '//systemList/system[last()]' -t elem -n 'name' -v 'nds'\ -s '//systemList/system[last()]' -t elem -n 'fullname' -v 'Nintendo DS'\ -s '//systemList/system[last()]' -t elem -n 'manufacturer' -v 'Nintendo'\ -s '//systemList/system[last()]' -t elem -n 'release' -v '2004'\ -s '//systemList/system[last()]' -t elem -n 'hardware' -v 'portable'\ -s '//systemList/system[last()]' -t elem -n 'path' -v '/storage/roms/nds'\ -s '//systemList/system[last()]' -t elem -n 'extension' -v '.nds .zip .NDS .ZIP'\ -s '//systemList/system[last()]' -t elem -n 'command' -v "emuelecRunEmu.sh %ROM% -P%SYSTEM% --core=%CORE% --emulator=%EMULATOR% --controllers=\"%CONTROLLERSCONFIG%\""\ -s '//systemList/system[last()]' -t elem -n 'platform' -v 'nds'\ -s '//systemList/system[last()]' -t elem -n 'theme' -v 'nds'\ ${CFG} fi ) & fi ( # Pico-8 check # If there is a new version copy the files if [[ -e "/storage/roms/bios/pico-8" ]]; then mkdir -p /emuelec/bin/pico-8 cp -rf /storage/roms/bios/pico-8/* /emuelec/bin/pico-8 rm -rf /storage/roms/bios/pico-8 chmod +x /emuelec/bin/pico-8/pico8_dyn touch /storage/roms/pico-8/splore.p8 fi # If Pico-8 binary does not exist remove the splore.p8 if [[ ! -e "/emuelec/bin/pico-8/pico8_dyn" ]]; then rm /storage/roms/pico-8/splore.p8 > /dev/null 2>&1 else touch /storage/roms/pico-8/splore.p8 > /dev/null 2>&1 fi ) & #check if we have ecwolf data installed ecwolfdir="/storage/roms/ports/ecwolf" mkdir -p ${ecwolfdir}/games for ecwolf in SOD sod WL6 wl6 N3D n3d SD2 sd2 SD3 sd3; do if find ${ecwolfdir} -name *.${ecwolf} -maxdepth 1 | read; then case ${ecwolf} in "SOD"|"sod") touch "${ecwolfdir}/games/Spear of Destiny.${ecwolf}" > /dev/null 2>&1 ;; "SD2"|"sd2") touch "${ecwolfdir}/games/Spear of Destiny SD2.${ecwolf}" > /dev/null 2>&1 ;; "SD3"|"sd3") touch "${ecwolfdir}/games/Spear of Destiny SD3.${ecwolf}" > /dev/null 2>&1 ;; "WL6"|"wl6") touch "${ecwolfdir}/games/Wolfenstein 3D.${ecwolf}" > /dev/null 2>&1 ;; "N3D"|"n3d") touch "${ecwolfdir}/games/Super 3D Noah's Ark.${ecwolf}" > /dev/null 2>&1 ;; esac else rm ${ecwolfdir}/games/*.${ecwolf} > /dev/null 2>&1 fi done # Check if we have a ee_defaults.txt file and if true process it PWDFILE="/flash/ee_defaults.txt" [ ! -f "${PWDFILE}" ] && PWDFILE="/emuelec/configs/ee_defaults.txt" [ ! -f "${PWDFILE}" ] && PWDFILE="/storage/roms/ee_defaults.txt" [ -f "${PWDFILE}" ] && check_pwd ${PWDFILE} # The mounting logic for ports_scripts is now handled in the mount handler # # Find and mount the ports directory # if [ -L "/storage/roms" ]; then # LINK=$(readlink /storage/roms) # else # LINK="/storage/roms" # fi # # Just in case # mkdir -p "${LINK}/ports_scripts" # mkdir -p "/emuelec/ports" # mkdir -p "/storage/.tmp/ports-workdir" # umount "/storage/roms/ports_scripts" > /dev/null 2>&1 # umount "/var/media/EEROMS/roms/ports_scripts" > /dev/null 2>&1 # mount -t overlay ports -o lowerdir=/usr/bin/ports,upperdir=/emuelec/ports,workdir=/storage/.tmp/ports-workdir "${LINK}/ports_scripts" # wait for all the subshells to finish wait # We do not care if BT scanning finishes before ES starts BTENABLED=$(get_ee_setting ee_bluetooth.enabled) if [[ "$BTENABLED" == "1" ]]; then # Search for bluetooth gamepads while ES loads. ( batocera-bluetooth trust ) & fi emuelec-utils setauddev # Checks and sets the resolution for starting ES. check_res.sh # START - SECTIONS TO WIPE PREVIOUS VERSION CONFIG DATA REMAP_VERSION="/emuelec/configs/JOY_REMAP_VERSION" if [[ ! -f "$REMAP_VERSION" ]]; then grep -Ev "^.*\.joy_btn.*=.*$" /emuelec/configs/emuelec.conf > /tmp/emuelec.conf.bak && mv /tmp/emuelec.conf.bak /emuelec/configs/emuelec.conf echo "2" > "${REMAP_VERSION}" fi FRAMEBUFFER_VERSION="/emuelec/configs/FRAMEBUFFER_VERSION" if [[ ! -f "$FRAMEBUFFER_VERSION" ]]; then grep -Ev "^.*\framebuffer.*=.*$" /emuelec/configs/emuelec.conf > /tmp/emuelec.conf.bak && mv /tmp/emuelec.conf.bak /emuelec/configs/emuelec.conf echo "2" > "${FRAMEBUFFER_VERSION}" fi # END - SECTIONS TO WIPE PREVIOUS VERSION CONFIG DATA RA_CORE_OPTION="/storage/.config/retroarch/retroarch-core-options.cfg" HAS_RA_CORE_OPTION_X68K_FDD_FIX=$(cat "${RA_CORE_OPTION}" | grep px68k_save_fdd_path) [[ -z "${HAS_RA_CORE_OPTION_X68K_FDD_FIX}" ]] && echo "px68k_save_fdd_path = \"disabled\"" >> "${RA_CORE_OPTION}" HAS_RA_CORE_OPTION_X68K_HDD_FIX=$(cat "${RA_CORE_OPTION}" | grep px68k_save_hdd_path) [[ -z "${HAS_RA_CORE_OPTION_X68K_HDD_FIX}" ]] && echo "px68k_save_hdd_path = \"disabled\"" >> "${RA_CORE_OPTION}" exit 0 ================================================ FILE: packages/sx05re/emuelec/bin/env.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) export TERM="xterm" export TERMINFO="/usr/share/terminfo" export TERMINFO_DIRS=${TERMINFO} export LANG="C.UTF-8" export HOME="/storage" export romdir="/storage/roms/" # export configdir="/usr/bin/scripts" export scriptdir="/usr/bin/scripts" #export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/emuelec/lib export PATH=${PATH}:/emuelec/bin:/emuelec/scripts user="root" rootdir="/emuelec" home="/storage" romdir="${home}/roms" biosdir="${romdir}/BIOS" datadir="${home}/.config/emuelec/RetroPie" emudir="${rootdir}/emulators" configdir="${rootdir}/configs" __logdir="${scriptdir}/logs" __tmpdir="/tmp" __builddir="${__tmpdir}/build" __swapdir="${__tmpdir}" __backtitle="EmuELEC - Configuration" source "${scriptdir}/scriptmodules/system.sh" source "${scriptdir}/scriptmodules/helpers.sh" source "${scriptdir}/scriptmodules/inifuncs.sh" source "${scriptdir}/scriptmodules/packages.sh" cat /etc/motd echo "Loading...Please Wait!" ================================================ FILE: packages/sx05re/emuelec/bin/fbterm.sh ================================================ #!/usr/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) . /etc/profile EE_DEVICE=$(cat /ee_arch) ee_console enable if [[ "${1}" == *"launch_terminal_(kb).sh"* ]]; then ee_console disable if [ "${EE_DEVICE}" == "OdroidGoAdvance" ] || [ "${EE_DEVICE}" == "GameForce" ]; then #kmscon kmscon --font-size 8 --login /usr/bin/login -- -p -f root else tmpsh=/tmp/tmp.$$.sh echo "/usr/bin/login -p -f root" > ${tmpsh} chmod +x ${tmpsh} fbterm "${tmpsh}" -s 24 < /dev/tty1 rm ${tmpsh} fi elif [[ "${1}" == *"file_manager.sh"* ]]; then if [ "${EE_DEVICE}" == "OdroidGoAdvance" ] || [ "${EE_DEVICE}" == "GameForce" ]; then bash "${1}" else fbterm "${1}" -s 24 < /dev/tty1 fi else case ${1} in "mplayer_video") bash playvideo.sh "${2}" "${3}" < /dev/tty0 ;; *) bash "${1}" > /dev/tty0 ;; esac fi ee_console disable ================================================ FILE: packages/sx05re/emuelec/bin/find.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) find / -type d \( -path /var/media -o -path /storage/roms \) -prune -o -iname *${1}* -print ================================================ FILE: packages/sx05re/emuelec/bin/gamelist-cleaner.sh ================================================ #!/bin/bash - # gamelist-cleaner.sh ##################### # # This script gets a gamelist.xml as input and check if the path for the games # leads to an existing file. If the file doesn't exist, the entry will # be deleted from the resulting gamelist.xml. # # Run the script with '--help' to get more info. # # meleu - 2017/Jun # kaltinril - 2017-08-19 - Added -r option to replace the existing gameslist # shantigilbert - 2019-02-18 - Fix for filenames with '&' not being removed # Global Variables REPLACE_GAMELIST=false DO_ALL=false LISTS_DIR="${HOME}/.emulationstation/gamelists" ROMS_DIR="${HOME}/roms" ELIMINATE_BACKUPS=false # Read only Variables readonly SCRIPT_DIR="$(dirname "${0}")" readonly SCRIPT_NAME="$(basename "${0}")" readonly SCRIPT_FULL="${SCRIPT_DIR}/${SCRIPT_NAME}" readonly SCRIPT_URL="https://raw.githubusercontent.com/meleu/share/master/gamelist-cleaner.sh" readonly USAGE="Usage: ${0} [OPTIONS] [gamelist.xml]... " readonly EXAMPLE="Example: ${0} ~/.emulationstation/gamelists/nes/gamelist.xml " readonly HELP=" This script gets a gamelist.xml as input and checks if the path for the games leads to an existing file. If the file doesn't exist, the entry will be deleted and a cleaner gamelist.xml file will be generated. The resulting file will be named \"gamelist.xml-clean\" and will be in the same folder as the original file. Nothing changes in the original gamelist.xml. ${USAGE} ${EXAMPLE} The OPTIONS are: -h|--help print this message and exit. -u|--update update the script and exit. -s|--system SYSTEM specifies to which system the gamelist.xml file belongs, e.g.: nes, megadrive. Default: name of the directory where the file is located. -d|--directory DIR specifies the ROMs directory. Default: ${ROMS_DIR} -r|--replace Force replace the gamelist.xml file (Creates backup of original) -a|--all Automatically clean all gamelists that exist in lists folder -l|--gamelist DIR specifies the gamelist directory. Default: ${LISTS_DIR} " function update_script() { local err_flag=0 local err_msg if err_msg=$(wget "${SCRIPT_URL}" -O "/tmp/${SCRIPT_NAME}" 2>&1); then if diff -q "${SCRIPT_FULL}" "/tmp/${SCRIPT_NAME}" >/dev/null; then echo "You already have the latest version. Nothing changed." rm -f "/tmp/${SCRIPT_NAME}" exit 0 fi err_msg=$(mv "/tmp/${SCRIPT_NAME}" "${SCRIPT_FULL}" 2>&1) \ || err_flag=1 else err_flag=1 fi if [[ ${err_flag} -ne 0 ]]; then err_msg=$(echo "${err_msg}" | tail -1) echo "Failed to update \"${SCRIPT_NAME}\": ${err_msg}" >&2 exit 1 fi chmod a+x "${SCRIPT_FULL}" echo "The script has been successfully updated. You can run it again." exit 0 } function eliminate_backup_files() { backups=$(ls ${LISTS_DIR}/*/gamelist.xml-orig*) for file in ${backups}; do echo "Removing: ${file}" rm ${file} done } while [[ -n "${1}" ]]; do case "${1}" in -h|--help) echo "${HELP}" >&2 exit 0 ;; -u|--update) update_script ;; -s|--system) shift CUSTOM_SYSTEM="${1}" shift ;; -d|--directory) shift ROMS_DIR="${1}" shift ;; -r|--replace) shift REPLACE_GAMELIST=true echo "Using replace option" echo ;; -a|--all) shift DO_ALL=true echo "Cleaning all gamelists!" echo ;; -l|--list) shift LISTS_DIR="${1}" shift ;; -e|--eliminate) shift ELIMINATE_BACKUPS=true echo "Using eliminate option" echo ;; '') echo "ERROR: missing gamelist.xml parameter" >&2 echo "${HELP}" >&2 exit 1 ;; -*) # yes, files starting with '-' don't work in this script echo "ERROR: \"${1}\": invalid option" >&2 echo "${HELP}" >&2 exit 1 ;; *) break ;; esac done # Verify there is at least 1 file after all parameters if [ "$#" -eq 0 ] && [ "${DO_ALL}" = false ]; then echo "ERROR: missing gamelist.xml parameter" >&2 echo "${HELP}" >&2 exit 1 fi # Get list of files to use gamelist_files="$@" if [ "${DO_ALL}" = true ]; then gamelist_files=$(ls ${LISTS_DIR}/*/gamelist.xml) fi for file in ${gamelist_files}; do original_gamelist="$(readlink -f "${file}")" clean_gamelist="${original_gamelist}-clean" gamelist_dir="$(dirname "${original_gamelist}")" backup_gamelist="${original_gamelist}-orig-$(date +%s)" if [[ ! -s "${original_gamelist}" ]]; then [[ -z "${original_gamelist}" ]] && original_gamelist="${file}" # Make sure we print the name if the readlink failed to find a file echo "\"${original_gamelist}\": file not found or is zero-length. Ignoring..." continue fi system="${CUSTOM_SYSTEM}" [[ -z "${system}" ]] && system=$(basename "${gamelist_dir}") if [[ ! -d "${ROMS_DIR}/${system}" ]]; then echo "WARNING: \"${ROMS_DIR}/${system}\": directory not found." >&2 echo "You don't have a ROMs folder for a system named \"${system}\"." >&2 echo "Ignoring \"${original_gamelist}\"..." >&2 continue fi # What file are we working on? echo "Working on: ${original_gamelist}" # Make backup of gamelist and replace original if [ "${REPLACE_GAMELIST}" = true ]; then cat "${original_gamelist}" > "${backup_gamelist}" clean_gamelist="${original_gamelist}" original_gamelist="${backup_gamelist}" fi # use a temp file to convert "&" to "&: on the whole gamelist.xml even if the file has both "&" and "&" temp_gamelist="/tmp/gamelist-${system}.xml" sed "s/\&/&/g; s/;amp;/;/g; s/&#39;/'/g" "${original_gamelist}" > "${temp_gamelist}" original_gamelist=$(readlink -f "${temp_gamelist}") cat "${original_gamelist}" > "${clean_gamelist}" # Check to see if we have any entries before we try to loop over them. xml_entries=$(xmlstarlet sel -t -v "/gameList/game/path" "${original_gamelist}") if [[ -z ${xml_entries} ]]; then echo "No entries found, file is empty." echo echo continue fi while read -r path; do #it seems xmlstarlet will convert '&' internally, so remove it from the path or else the node will not be found path="${path//&/&}" full_path="${path}" [[ "${path}" == ./* ]] && full_path="${ROMS_DIR}/${system}/${path}" [[ -f "${full_path}" ]] && continue xmlstarlet ed -L -d "/gameList/game[path=\"${path}\"]" "${clean_gamelist}" echo "The game with = \"${path}\" has been removed from xml." done < <(xmlstarlet sel -t -v "/gameList/game/path" "${original_gamelist}"; echo) echo echo "The \"${clean_gamelist}\" is ready!" echo echo "See the difference between file sizes:" du -h "${original_gamelist}" "${clean_gamelist}" rm "${temp_gamelist}" echo echo done if [ "${ELIMINATE_BACKUPS}" = true ];then echo "Removing backups...." eliminate_backup_files fi ================================================ FILE: packages/sx05re/emuelec/bin/hypseus.start.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) dir="${1}" name=${dir##*/} name=${name%.*} config="/storage/.config/emuelec/configs/hypseus" configfile="${config}/hypinput.ini" export AUDIODEV=hw:0,0 if [[ ! -f "${config}/ee_updated" ]]; then cp "/usr/config/emuelec/configs/hypseus/hypinput_gamepad.ini" "${configfile}" fi touch "${config}/ee_updated" if [[ -f "${dir}/${name}.commands" ]]; then params=$(<"${dir}/${name}.commands") fi # Not all gamepads use a trigger. sed -i 's|AXIS_TRIGGER_RIGHT|BUTTON_X AXIS_TRIGGER_RIGHT|' ${configfile} cd "${config}" if [[ -f "${dir}/${name}.singe" ]]; then hypseus singe vldp -gamepad -manymouse -framefile "${dir}/${name}.txt" -script "${dir}/${name}.singe" -fullscreen -useoverlaysb 2 ${params} else hypseus "${name}" vldp -gamepad -manymouse -framefile "${dir}/${name}.txt" -fullscreen -useoverlaysb 2 ${params} fi ================================================ FILE: packages/sx05re/emuelec/bin/joy2key.py ================================================ #!/usr/bin/python # This file is part of The RetroPie Project # # The RetroPie Project is the legal property of its developers, whose names are # too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source. # # See the LICENSE.md file at the top-level directory of this distribution and # at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md # import os, sys, struct, time, fcntl, termios, signal import curses, errno, re from pyudev import Context # struct js_event { # __u32 time; /* event timestamp in milliseconds */ # __s16 value; /* value */ # __u8 type; /* event type */ # __u8 number; /* axis/button number */ # }; JS_MIN = -32768 JS_MAX = 32768 JS_REP = 0.20 JS_THRESH = 0.75 JS_EVENT_BUTTON = 0x01 JS_EVENT_AXIS = 0x02 JS_EVENT_INIT = 0x80 CONFIG_DIR = '/storage/.config/' RETROARCH_CFG = CONFIG_DIR + 'retroarch/retroarch.cfg' BUTTON_CFG = CONFIG_DIR + 'emuelec/configs/buttonmapping.cfg' def ini_get(key, cfg_file): pattern = r'[ |\t]*' + key + r'[ |\t]*=[ |\t]*' value_m = r'"*([^"\|\r]*)"*' value = '' with open(cfg_file, 'r') as ini_file: for line in ini_file: if re.match(pattern, line): value = re.sub(pattern + value_m + '.*\n', r'\1', line) break return value def get_btn_num(btn, cfg): num = ini_get('input_' + btn + '_btn', cfg) if num: return num num = ini_get('input_player1_' + btn + '_btn', cfg) if num: return num return '' def sysdev_get(key, sysdev_path): value = '' for line in open(sysdev_path + key, 'r'): value = line.rstrip('\n') break return value def get_button_codes(dev_path): js_cfg_dir = '/tmp/joypads/' js_cfg = '' dev_name = '' dev_button_codes = list(default_button_codes) for device in Context().list_devices(DEVNAME=dev_path): sysdev_path = os.path.normpath('/sys' + device.get('DEVPATH')) + '/' if not os.path.isfile(sysdev_path + 'name'): sysdev_path = os.path.normpath(sysdev_path + '/../') + '/' # getting joystick name dev_name = sysdev_get('name', sysdev_path) # getting joystick vendor ID dev_vendor_id = int(sysdev_get('id/vendor', sysdev_path), 16) # getting joystick product ID dev_product_id = int(sysdev_get('id/product', sysdev_path), 16) if not dev_name: return dev_button_codes # getting retroarch config file for joystick for f in os.listdir(js_cfg_dir): if f.endswith('.cfg'): input_device = ini_get('input_device', js_cfg_dir + f) input_vendor_id = ini_get('input_vendor_id', js_cfg_dir + f) input_product_id = ini_get('input_product_id', js_cfg_dir + f) if (input_device == dev_name and (input_vendor_id == '' or int(input_vendor_id) == dev_vendor_id) and (input_product_id == '' or int(input_product_id) == dev_product_id)): js_cfg = js_cfg_dir + f break if not js_cfg: js_cfg = RETROARCH_CFG # getting configs for dpad from second line of BUTTON_CFG btn_map = [] with open(BUTTON_CFG,'r') as f: for button in f.readlines()[1].rstrip().split(' '): btn_map.append(button) btn_num = {} biggest_num = 0 i = 0 for btn in list(btn_map): if i >= len(dev_button_codes): break try: btn_num[btn] = int(get_btn_num(btn, js_cfg)) except ValueError: btn_map.pop(i) dev_button_codes.pop(i) btn_num.pop(btn, None) continue if btn_num[btn] > biggest_num: biggest_num = btn_num[btn] i += 1 # building the button codes list btn_codes = [''] * (biggest_num + 1) i = 0 for btn in btn_map: if i >= len(dev_button_codes): break btn_codes[btn_num[btn]] = dev_button_codes[i] i += 1 try: # if button A is and menu_swap_ok_cancel_buttons is true, swap buttons A and B functions if (ini_get('menu_swap_ok_cancel_buttons', RETROARCH_CFG) == 'true' and 'a' in btn_num and 'b' in btn_num and btn_codes[btn_num['a']] == '\n'): btn_codes[btn_num['a']] = btn_codes[btn_num['b']] btn_codes[btn_num['b']] = '\n' except (IOError, ValueError): pass return btn_codes def signal_handler(signum, frame): signal.signal(signal.SIGINT, signal.SIG_IGN) signal.signal(signal.SIGTERM, signal.SIG_IGN) if (js_fds): close_fds(js_fds) if (tty_fd): tty_fd.close() sys.exit(0) def get_hex_chars(key_str): if (key_str.startswith("0x")): return key_str[2:].decode('hex') else: return curses.tigetstr(key_str) def get_devices(): devs = [] if sys.argv[1] == '/dev/input/jsX': for dev in os.listdir('/dev/input'): if dev.startswith('js'): devs.append('/dev/input/' + dev) else: devs.append(sys.argv[1]) return devs def open_devices(): devs = get_devices() fds = [] for dev in devs: try: fds.append(os.open(dev, os.O_RDONLY | os.O_NONBLOCK )) js_button_codes[fds[-1]] = get_button_codes(dev) except (OSError, ValueError): pass return devs, fds def close_fds(fds): for fd in fds: os.close(fd) def read_event(fd): while True: try: event = os.read(fd, event_size) except OSError, e: if e.errno == errno.EWOULDBLOCK: return None return False else: return event def process_event(event): (js_time, js_value, js_type, js_number) = struct.unpack(event_format, event) # ignore init events if js_type & JS_EVENT_INIT: return False hex_chars = "" if js_type == JS_EVENT_BUTTON: if js_number < len(button_codes) and js_value == 1: hex_chars = button_codes[js_number] if js_type == JS_EVENT_AXIS and js_number <= 7: if js_number % 2 == 0: if js_value <= JS_MIN * JS_THRESH: hex_chars = axis_codes[0] if js_value >= JS_MAX * JS_THRESH: hex_chars = axis_codes[1] if js_number % 2 == 1: if js_value <= JS_MIN * JS_THRESH: hex_chars = axis_codes[2] if js_value >= JS_MAX * JS_THRESH: hex_chars = axis_codes[3] if hex_chars: for c in hex_chars: fcntl.ioctl(tty_fd, termios.TIOCSTI, c) return True return False js_fds = [] tty_fd = [] signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) # daemonize when signal handlers are registered if os.fork(): os._exit(0) js_button_codes = {} button_codes = [] default_button_codes = [] axis_codes = [] curses.setupterm() i = 0 # Read mapped buttons from first line of BUTTON_CFG args = [] with open(BUTTON_CFG,'r') as f: for mapping in f.readlines()[0].rstrip().split(' '): args.append(mapping) for arg in args: chars = get_hex_chars(arg) if i < 4: axis_codes.append(chars) default_button_codes.append(chars) i += 1 event_format = 'IhBB' event_size = struct.calcsize(event_format) tty_device = sys.argv[2] if len(sys.argv) >= 3 else '/dev/tty' try: tty_fd = open(tty_device, 'a') except IOError: print 'Unable to open {}'.format(tty_device) sys.exit(1) rescan_time = time.time() while True: do_sleep = True if not js_fds: js_devs, js_fds = open_devices() if js_fds: i = 0 current = time.time() js_last = [None] * len(js_fds) for js in js_fds: js_last[i] = current i += 1 else: time.sleep(1) else: i = 0 for fd in js_fds: event = read_event(fd) if event: do_sleep = False if time.time() - js_last[i] > JS_REP: if fd in js_button_codes: button_codes = js_button_codes[fd] else: button_codes = default_button_codes if process_event(event): js_last[i] = time.time() elif event == False: close_fds(js_fds) js_fds = [] break i += 1 if time.time() - rescan_time > 2: rescan_time = time.time() if cmp(js_devs, get_devices()): close_fds(js_fds) js_fds = [] if do_sleep: time.sleep(0.01) ================================================ FILE: packages/sx05re/emuelec/bin/joy_common.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present Joshua L (https://github.com/Langerz82) # 08/01/23 - Joshua L - Modified get GUID thanks to shantigilbert. # 16/10/25 - Joshua L - Modified uses sdljoytest. # 22/02/26 - Joshua L - Added js instance ID. # 23/02/26 - Pablo S - Added ES Ordering fixes. (https://github.com/pmsobrado) # Source predefined functions and variables . /etc/profile GCDB="${SDL_GAMECONTROLLERCONFIG_FILE}" EMULATOR="${1}" FIXED_ORDER=0 [[ "${2}" == "fixed_order" ]] && FIXED_ORDER=1 mkdir -p "/tmp/jc" GAMEPAD_INFO_ALL="/tmp/jc/gamepad_info.txt" CONTROLLERS_PRIORITY_DATA= [[ -f "/tmp/controllerconfig.txt" ]] && CONTROLLERS_PRIORITY_DATA=$(cat "/tmp/controllerconfig.txt") jc_wipe_config_sub_heading() { local config_file="$1" local sub_heading="$2" local tmp_file="$3" shift shift shift declare -a array_ref=("$@") [[ -f "${tmp_file}" ]] && rm "${tmp_file}" local LN=1 local START_LN=-1 [[ ! -f "${config_file}" ]] && return local REGEX_SUB_HEADING='^\[.+\]$' local SUB_HEADING_ACTIVE=0 while read -r line; do if [[ "${line}" =~ $REGEX_SUB_HEADING ]]; then if [[ "${line}" == "${sub_heading}" ]]; then START_LN=${LN} SUB_HEADING_ACTIVE=1 else [[ ${START_LN} != -1 ]] && break fi fi LN=$(( LN + 1 )) if [[ "${SUB_HEADING_ACTIVE}" == 1 ]]; then for item in "${array_ref[@]}"; do local rx="^${item}\ *\=.+$" [[ "${line}" =~ ${rx} ]] && echo "${line}" >> ${tmp_file} done fi done < ${config_file} if [[ ${START_LN} != -1 ]]; then sed -i "${START_LN},$(( LN-1 ))d" "${config_file}" fi } jc_set_record() { local FILE=$1 local HEADER=$2 local KEY=$3 local VALUE=$4 local rec=$( cat "${FILE}" | grep -e "^${KEY} *= *.*$" ) if [[ -z "${rec}" ]]; then sed -i "/${HEADER}/a ${KEY} = ${RUMBLE}" "${EMU_FILE}" else sed -i "s/^${KEY} *= *.*$/${KEY} = ${VALUE}/g" "${EMU_FILE}" fi } jc_get_config() { local GAMEPAD_DATA=$(cat ${GAMEPAD_INFO_ALL} | grep -E -A6 "^Gamepad ${1}$") [[ -z "${GAMEPAD_DATA}" ]] && echo '' && return mapfile -t GAMEPAD_INFO < <(echo "${GAMEPAD_DATA}") local JOY_UDEV_NAME="$( echo "${GAMEPAD_INFO[1]}" | cut -c18- )" local JOY_SDL_NAME="$( echo "${GAMEPAD_INFO[2]}" | cut -c18- )" local DEVICE_GUID="$( echo "${GAMEPAD_INFO[3]}" | cut -c18- )" local JOYMAPPING="$( echo "${GAMEPAD_INFO[4]}" | cut -c18- )" local INSTANCE_ID="$( echo "${GAMEPAD_INFO[5]}" | cut -c18- )" local JS_INDEX="$( echo "${GAMEPAD_INFO[6]}" | cut -c18- )" echo js${JS_INDEX} ${DEVICE_GUID} \"${JOY_UDEV_NAME}\" \"${JOYMAPPING}\" \"${JOY_SDL_NAME}\" } jc_get_order_indexes() { local MAX_VALUE=$1 shift local GUIDS=(${@}) local PLAYER_ORDER=() for i in {0..3}; do local CURRENT_GUID=${GUIDS[${i}]} local PINDEX= # 1. Get player for this physical index (jci) if [[ ! -z "${CURRENT_GUID}" ]] && [[ ! -z "${CONTROLLERS_PRIORITY_DATA}" ]]; then local priority_record=$( echo "${CONTROLLERS_PRIORITY_DATA}" | grep -o "\-p[1-4]index [0-9] -p[1-4]guid ${CURRENT_GUID}" | head -n1 ) if [[ ! -z "${priority_record}" ]]; then CONTROLLERS_PRIORITY_DATA=$( echo $CONTROLLERS_PRIORITY_DATA | sed "s/${priority_record}//g" ) PINDEX=$(echo "${priority_record}" | cut -c3 ) [[ -n "${PINDEX}" ]] && PINDEX=$(( PINDEX - 1 )) fi fi # 2. If it does not exist on the priority settings, assign default one but respecting reserved joypad slots if [[ ! -n "${PINDEX}" ]]; then for (( i = 0; i < MAX_VALUE; i++ )) do PINDEX=$i [[ ! " ${PLAYER_ORDER[@]} " =~ " ${PINDEX} " ]] && break done fi PLAYER_ORDER+=("${PINDEX}") done echo "${PLAYER_ORDER[@]}" } jc_get_players() { gamepad_info -more > ${GAMEPAD_INFO_ALL} declare -a player_cfgs=() declare -a player_guids=() for i in {0..3}; do local CFG=$( jc_get_config "${i}" ) local GUID=$(echo "${CFG}" | awk '{print $2}') [[ ! -z "${GUID}" ]] && player_guids+=("${GUID}") player_cfgs+=("${CFG}") done local player_order=(0 1 2 3) if [[ "${FIXED_ORDER}" == "0" ]]; then player_order=($( jc_get_order_indexes 4 "${player_guids[@]}")) fi for i in {0..3}; do local pi=$(( i + 1 )) clean_pad ${pi} local order=${player_order[${i}]} local cfg=${player_cfgs[${order}]} [[ ! -z "${cfg}" ]] && eval set_pad ${pi} ${cfg} ${order} done } ================================================ FILE: packages/sx05re/emuelec/bin/killes.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) if pgrep -x "/usr/bin/emulationstation" > /dev/null then killall -9 emulationstation fi exit 0 ================================================ FILE: packages/sx05re/emuelec/bin/ldd_32 ================================================ #! /bin/sh # Copyright (C) 1996-2019 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # The GNU C Library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # You should have received a copy of the GNU Lesser General Public # License along with the GNU C Library; if not, see # . # This is the `ldd' command, which lists what shared libraries are # used by given dynamically-linked executables. It works by invoking the # run-time dynamic linker as a command and setting the environment # variable LD_TRACE_LOADED_OBJECTS to a non-empty value. # We should be able to find the translation right at the beginning. TEXTDOMAIN=libc TEXTDOMAINDIR=/usr/share/locale RTLDLIST=/usr/lib/ld-linux-armhf.so.3 warn= bind_now= verbose= while test $# -gt 0; do case "$1" in --vers | --versi | --versio | --version) echo 'ldd (GNU libc) 2.29' printf $"Copyright (C) %s Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. " "2019" printf $"Written by %s and %s. " "Roland McGrath" "Ulrich Drepper" exit 0 ;; --h | --he | --hel | --help) echo $"Usage: ldd [OPTION]... FILE... --help print this help and exit --version print version information and exit -d, --data-relocs process data relocations -r, --function-relocs process data and function relocations -u, --unused print unused direct dependencies -v, --verbose print all information " printf $"For bug reporting instructions, please see:\\n%s.\\n" \ "" exit 0 ;; -d | --d | --da | --dat | --data | --data- | --data-r | --data-re | \ --data-rel | --data-relo | --data-reloc | --data-relocs) warn=yes shift ;; -r | --f | --fu | --fun | --func | --funct | --functi | --functio | \ --function | --function- | --function-r | --function-re | --function-rel | \ --function-relo | --function-reloc | --function-relocs) warn=yes bind_now=yes shift ;; -v | --verb | --verbo | --verbos | --verbose) verbose=yes shift ;; -u | --u | --un | --unu | --unus | --unuse | --unused) unused=yes shift ;; --v | --ve | --ver) echo >&2 $"ldd: option \`$1' is ambiguous" exit 1 ;; --) # Stop option processing. shift; break ;; -*) echo >&2 'ldd:' $"unrecognized option" "\`$1'" echo >&2 $"Try \`ldd --help' for more information." exit 1 ;; *) break ;; esac done nonelf () { # Maybe extra code for non-ELF binaries. return 1; } add_env="LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now" add_env="$add_env LD_VERBOSE=$verbose" if test "$unused" = yes; then add_env="$add_env LD_DEBUG=\"$LD_DEBUG${LD_DEBUG:+,}unused\"" fi # The following command substitution is needed to make ldd work in SELinux # environments where the RTLD might not have permission to write to the # terminal. The extra "x" character prevents the shell from trimming trailing # newlines from command substitution results. This function is defined as a # subshell compound list (using "(...)") to prevent parameter assignments from # affecting the calling shell execution environment. try_trace() ( output=$(eval $add_env '"$@"' 2>&1; rc=$?; printf 'x'; exit $rc) rc=$? printf '%s' "${output%x}" return $rc ) case $# in 0) echo >&2 'ldd:' $"missing file arguments" echo >&2 $"Try \`ldd --help' for more information." exit 1 ;; 1) single_file=t ;; *) single_file=f ;; esac result=0 for file do # We don't list the file name when there is only one. test $single_file = t || echo "${file}:" case $file in */*) : ;; *) file=./$file ;; esac if test ! -e "$file"; then echo "ldd: ${file}:" $"No such file or directory" >&2 result=1 elif test ! -f "$file"; then echo "ldd: ${file}:" $"not regular file" >&2 result=1 elif test -r "$file"; then test -x "$file" || echo 'ldd:' $"\ warning: you do not have execution permission for" "\`$file'" >&2 RTLD= ret=1 for rtld in ${RTLDLIST}; do if test -x $rtld; then verify_out=`${rtld} --verify "$file"` ret=$? case $ret in [02]) RTLD=${rtld}; break;; esac fi done case $ret in 1) # This can be a non-ELF binary or no binary at all. nonelf "$file" || { echo $" not a dynamic executable" result=1 } ;; 0|2) try_trace "$RTLD" "$file" || result=1 ;; *) echo 'ldd:' ${RTLD} $"exited with unknown exit code" "($ret)" >&2 exit 1 ;; esac else echo 'ldd:' $"error: you do not have read permission for" "\`$file'" >&2 result=1 fi done exit $result # Local Variables: # mode:ksh # End: ================================================ FILE: packages/sx05re/emuelec/bin/mount_romfs.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) # Source predefined functions and variables . /etc/profile ROMS_PART_LABEL='EEROMS' ROMS_PART_FS_CONFIG='/flash/ee_fstype' ROMS_FILE_MARK='emuelecroms' ROMS_DIR_NAME='roms' ROMS_DIR_ACTUAL="/storage/${ROMS_DIR_NAME}" UPDATE_DIR='/storage/.update' ROMS_DIR_BACKUP="${ROMS_DIR_ACTUAL}_backup" MEDIA_DIR='/var/media' ROMS_DIR_MEDIA="${MEDIA_DIR}/${ROMS_PART_LABEL}" if [ "${1}" == 'yes' ]; then ACTION_ES_RESTART='yes' echo 'Note: restart of EmulattionStation is requested, it will be restarted after roms is correctly mounted' else ACTION_ES_RESTART='' fi if [ "${2}" ]; then ROMS_PART_MATCHER="${2}" else ROMS_PART_MATCHER="$(get_ee_setting global.externalmount)" if [[ "${ROMS_PART_MATCHER}" == 'auto' || -z "${ROMS_PART_MATCHER}" ]]; then echo 'Note: no specific externalmount defined in config or argument, will try to scan all possible external drives' ROMS_PART_MATCHER='*' fi fi get_mount_list() { # MOUNTPOINT should be set/gotten by outer functions local IFS=$'\n' MOUNTLIST=($(printf "$(cat /proc/mounts | cut -d ' ' -f 2)")) # Use printf to convert \040, \134, etc back to ' ', '\', etc } umount_recursively() { # ${1}: start point, e.g. /storage. This is a replica of umount -r from standard Linux distros [ -z "${1}" ] && return 1 local TARGET="$(readlink -f "${1}")" [ -z "${TARGET}" ] && TARGET="$(pwd -P)/${1}" echo "WARNING: unmounting '${TARGET}', recursively" local IFS=$'\n' UMOUNTLIST=($(printf "$(cat /proc/mounts | cut -d ' ' -f 2)" | grep ^"${TARGET}"'\(/\|$\)' | sort -r )) unset IFS local MOUNTPOINT local TRY for MOUNTPOINT in "${UMOUNTLIST[@]}"; do for TRY in {0..2}; do # Brute force, hope we only run once sync if umount -f "${MOUNTPOINT}"; then echo "Successfully umounted '${MOUNTPOINT}'" break fi sleep 1 done done } move_merge() { #${1} source dir, ${2} target dir # e.g. move_merge /storage/roms_backup /storage/roms [ -z "${1}" ] || [ -z "${2}" ] && return 1 local SOURCE="$(readlink -f "${1}")" local TARGET="$(readlink -f "${2}")" local PWD_SECURE="$(pwd -P)" [ -z "${SOURCE}" ] && SOURCE="${PWD_SECURE}/${1}" [ -z "${TARGET}" ] && TARGET="${PWD_SECURE}/${2}" echo "WARNING: Merging '${SOURCE}' into '${TARGET}'" pushd "${SOURCE}" &>/dev/null find . -type d -exec mkdir -p "${TARGET}/"\{} \; find . -type f -exec mv \{} "${TARGET}/"\{} \; find . -type d -empty -delete popd &>/dev/null } # Check if (multiple) EEROMS exists. By calling blkid we also force all drives to wake up scan_eeroms() { BOOL_EEROMS_EXIST='' # ='yes' if EEROMS exist, ='' if not ROMS_PART_PATH='' # The dev path for the EEROMS partition, shouldn't be empty if EEROMS_EXIST ROMS_PART_TOKEN='' # What we should use to mount eeroms, shouldn't be empty if EEROMS_EXIST, default is LABEL=EEROMS # Get EEROMS filetype, vfat is default (considering capacity, it is most likely fat32) if [ -e "${ROMS_PART_FS_CONFIG}" ]; then ROMS_PART_FS="$(cat "${ROMS_PART_FS_CONFIG}")" case "${ROMS_PART_FS}" in 'ntfs'|'ext4'|'exfat'|'vfat') : # Do nothing ;; *) # Always downgrade to vfat in case it's messed up ROMS_PART_FS="vfat" ;; esac else ROMS_PART_FS='vfat' fi LINE_EEROMS="$(blkid | grep "LABEL=\"${ROMS_PART_LABEL}\"")" &>/dev/null if [ "${LINE_EEROMS}" ]; then ROMS_PART_FS_ACTUAL='' roms_part_fs_from_line(){ ROMS_PART_FS_ACTUAL="$(sed -e 's/.* TYPE="\([a-z0-9]\+\)".*/\1/' <<< "${LINE_EEROMS}")" } if [ "$(wc -l <<< "${LINE_EEROMS}")" == 1 ]; then # Only one EEROMS, good ROMS_PART_PATH="${LINE_EEROMS%%:*}" roms_part_fs_from_line else # Multiple EEROMS LINES_EEROMS="${LINE_EEROMS}" while read LINE_EEROMS; do LINE_PART_PATH="${LINE_EEROMS%%:*}" if [ -z "${ROMS_PART_PATH}" ] || grep -q "^${LINE_PART_PATH} ${ROMS_DIR_ACTUAL} " '/proc/mounts'; then # At least use the first EEROMS. We prefer the one already mounted ROMS_PART_PATH="${LINE_PART_PATH}" roms_part_fs_from_line fi done <<< "${LINES_EEROMS}" fi if [ "${ROMS_PART_PATH}" ]; then ROMS_PART_TOKEN="${ROMS_PART_PATH}" else # Failsafe, this shouldn't happen ROMS_PART_TOKEN="LABEL=${ROMS_PART_LABEL}" fi case "${ROMS_PART_FS_ACTUAL}" in # Update roms part fs in case it's different from the config 'ntfs'|'ext4'|'exfat'|'vfat') if [ "${ROMS_PART_FS_ACTUAL}" != "${ROMS_PART_FS}" ]; then echo "WARNING: Actual EEROMS partition fs type different from configured fs type ('${ROMS_PART_FS_ACTUAL}' != '${ROMS_PART_FS}'), fixing '${ROMS_PART_FS_CONFIG}'" mount -o rw,remount /flash echo "${ROMS_PART_FS_ACTUAL}" > "${ROMS_PART_FS_CONFIG}" mount -o ro,remount /flash fi BOOL_EEROMS_EXIST='yes' ROMS_PART_FS="${ROMS_PART_FS_ACTUAL}" ;; # If fs is not supported, then consider EEROMS does not exist *) echo "ERROR: EEROMS partition fs not supported (${ROMS_PART_FS_ACTUAL}), please re-format it to one of the following fs: fat32, exfat, ext4, ntfs" ;; esac fi } is_storage_roms_mounted() { if mountpoint -q "${ROMS_DIR_ACTUAL}" &>/dev/null; then return 0 else return 1 fi } mount_eeroms() { # ${1} where to mount if [[ -L "${1}" || ! -d "${1}" ]]; then rm -f "${1}" &>/dev/null mkdir -p "${1}" &>/dev/null fi mount -t "${ROMS_PART_FS}" "${ROMS_PART_TOKEN}" "${1}" &>/dev/null ROMS_PART_MOUNTPOINT="${1}" } umount_eeroms() { if [ "${ROMS_PART_PATH}" ]; then local i local MOUNTPOINT_RAW local MOUNTPOINT for MOUNTPOINT_RAW in $(grep "^${ROMS_PART_PATH} " '/proc/mounts' | cut -d ' ' -f 2); do MOUNTPOINT="$(printf ${MOUNTPOINT_RAW})" if [ "${MOUNTPOINT}" != "${UPDATE_DIR}" ]; then # Don't umount /storage/.update for i in {0..2}; do if grep -q "^${ROMS_PART_PATH} ${MOUNTPOINT_RAW} " '/proc/mounts' &>/dev/null; then sync umount -f "${MOUNTPOINT}" && break else break fi sleep 1 done fi done else echo 'ERROR: Failed to find valid EEROMS partition, impossible to umount it' return 1 fi } mount_eeroms_to_media() { if [ "${BOOL_EEROMS_EXIST}" ]; then if [ -d "${ROMS_DIR_MEDIA}" ]; then if grep -q "^${ROMS_PART_PATH} ${ROMS_DIR_MEDIA} " '/proc/mounts' &>/dev/null; then return else umount_recursively "${ROMS_DIR_MEDIA}" &>/dev/null fi fi umount_eeroms mount_eeroms "${ROMS_DIR_MEDIA}" echo "Note: Moved EEROMS partition to '${ROMS_DIR_MEDIA}', you can still access your roms from there, but the roms inside it can't be scanned and used by EmulationStation" fi } migrate_roms() { # ${1} source, ${2} target echo "Migrating roms: '${1}' => '${2}'" if mountpoint -q "${1}" &>/dev/null || mountpoint -q "${2}" &>/dev/null; then echo 'ERROR: Refuse to migrate as one of the source/target folder is a mountpoint!' return elif [[ -L "${2}" || ! -d "${2}" ]]; then # Easy, just move it rm -f "${2}" &>/dev/null mv "${1}" "${2}" else # We need to move-merge roms_backup into roms move_merge "${1}" "${2}" rm -rf "${1}" &>/dev/null fi } backup_roms() { echo 'Preparing to backup roms...' umount_recursively "${ROMS_DIR_ACTUAL}" umount_recursively "${ROMS_DIR_BACKUP}" # Usually /storage/roms_backup shouldn't be mounted, but we do this in case something wrong happened if is_storage_roms_mounted; then echo "ERROR: refuse to backup roms since '${ROMS_DIR_ACTUAL}' is a mountpoint, we will only backup roms if '${ROMS_DIR_ACTUAL}' is an folder directly stored on the underlying disk" return 1 elif [ -d "${ROMS_DIR_ACTUAL}" ]; then echo 'Backing up roms...' migrate_roms "${ROMS_DIR_ACTUAL}" "${ROMS_DIR_BACKUP}" elif [ -e "${ROMS_DIR_ACTUAL}" ]; then # Don't mess up with our intended layout echo "WARNING: '${ROMS_DIR_BACKUP}' exists but is not a folder. No roms are backed up" return 1 else echo 'Note: no roms need to be backed up' fi } restore_roms() { echo 'Preparing to restore roms...' umount_recursively "${ROMS_DIR_ACTUAL}" umount_recursively "${ROMS_DIR_BACKUP}" # Usually /storage/roms_backup shouldn't be mounted, but we do this in case something wrong happened if is_storage_roms_mounted; then echo "ERROR: refuse to restore roms since '${ROMS_DIR_ACTUAL}' is a mountpoint, we will only restore roms if '${ROMS_DIR_ACTUAL}' is an folder directly stored on the underlying disk" return 1 elif [ -d "${ROMS_DIR_BACKUP}" ]; then echo 'Restoring roms...' migrate_roms "${ROMS_DIR_BACKUP}" "${ROMS_DIR_ACTUAL}" elif [ -e "${ROMS_DIR_BACKUP}" ]; then # Don't mess up with our intended layout echo "WARNING: '${ROMS_DIR_BACKUP}' exists but is not a folder. No roms are restored" return 1 else echo 'Note: no roms need to be restored' fi } prepare_scan() { ROMS_PART_MOUNTPOINT='' echo "Preparing to scan for roms mounts..." echo "Stopping samba to avoid I/O conflicts..." systemctl stop smbd.service # Stop samba to avoid I/O conflicts LOAD_DELAY="$(get_ee_setting ee_load.delay)" # The delay is waited before we check for EEROMS [ "${LOAD_DELAY}" ] && sleep "${LOAD_DELAY}" scan_eeroms } ensure_dir_update_mounted() { if [[ -L "${UPDATE_DIR}" || ! -d "${UPDATE_DIR}" ]]; then rm -rf "${UPDATE_DIR}" &>/dev/null mkdir -p "${UPDATE_DIR}" &>/dev/null fi # This should only be useful for the very first boot after a user re-format EEROMS yet forgot to update ee_fstype if [ "${BOOL_EEROMS_EXIST}" ] && ! mountpoint -q "${UPDATE_DIR}" &>/dev/null; then if [ -z "${ROMS_PART_MOUNTPOINT}" ]; then ROMS_PART_MOUNTPOINT="$(mktemp -d)" mount_eeroms "${ROMS_PART_MOUNTPOINT}" BOOL_ROMS_TEMP='yes' else BOOL_ROMS_TEMP='' fi ROMS_DIR_UPDATE="${ROMS_PART_MOUNTPOINT}/.update" if [[ -L "${ROMS_DIR_UPDATE}" || ! -d "${ROMS_DIR_UPDATE}" ]]; then rm -rf "${ROMS_DIR_UPDATE}" &>/dev/null mkdir -p "${ROMS_DIR_UPDATE}" &>/dev/null fi mount --bind "${ROMS_DIR_UPDATE}" "${UPDATE_DIR}" &>/dev/null if [ "${BOOL_ROMS_TEMP}" ]; then umount_recursively "${ROMS_PART_MOUNTPOINT}" rm -rf "${ROMS_PART_MOUNTPOINT}" &>/dev/null fi fi } finish_scan() { ensure_dir_update_mounted echo "Finished scanning for roms mounts..." echo "Bringing back samba..." systemctl start smbd.service #echo "Mounting ports_scripts..." #if [ -L "/storage/roms" ]; then # local LINK=$(readlink /storage/roms) #else # local LINK="/storage/roms" #fi # Just in case #mkdir -p "${LINK}/ports_scripts" #mkdir -p "/emuelec/ports" #mkdir -p "/storage/.tmp/ports-workdir" #umount "/storage/roms/ports_scripts" &>/dev/null #umount "/var/media/EEROMS/roms/ports_scripts" &>/dev/null #mount -t overlay ports -o lowerdir=/usr/bin/ports,upperdir=/emuelec/ports,workdir=/storage/.tmp/ports-workdir "${LINK}/ports_scripts" } if compgen -G /storage/.config/system.d/storage-roms*.mount &>/dev/null; then prepare_scan echo 'Note: mount unit starts with storage-roms found under /storage/.config/system.d, we will only try to mount these units and will not scan for external drives' # User defined mount units, most likely samba mounts BOOL_DAEMON_RELOADED='' SYSTEMD_UNIT_NAME='storage-roms.mount' SYSTEMD_UNIT_PATH="/storage/.config/system.d/${SYSTEMD_UNIT_NAME}" mount_samba_and_notice() { if [ -z "${BOOL_DAEMON_RELOAD}" ]; then # Only reload once, to save time BOOL_DAEMON_RELOADED='yes' systemctl daemon-reload fi systemctl start "${SYSTEMD_UNIT_NAME}" &>/dev/null systemctl is-active --quiet "${SYSTEMD_UNIT_NAME}" && echo "Mounted '${SYSTEMD_UNIT_PATH}' from samba roms" } # Only try to mount /storage/roms according to systemd if it's not mounted yet if [ -f "${SYSTEMD_UNIT_PATH}" ]; then echo "Note: Systemd mount unit '${SYSTEMD_UNIT_NAME}' found, will try to mount the whole roms folder" # backup_roms No need to backup roms umount_recursively "${ROMS_DIR_ACTUAL}" mount_eeroms_to_media if [[ -L "${ROMS_DIR_ACTUAL}" || ! -d "${ROMS_DIR_ACTUAL}" ]]; then rm -f "${ROMS_DIR_ACTUAL}" &>/dev/null mkdir -p "${ROMS_DIR_ACTUAL}" fi mount_samba_and_notice fi if ! is_storage_roms_mounted && [ "${BOOL_EEROMS_EXIST}" ]; then # If systemd mount units fail, then try to bring EEROMS back umount_eeroms mount_eeroms "${ROMS_DIR_ACTUAL}" fi is_storage_roms_mounted || restore_roms # If for some wierd reasons rom can't be mounted from the systemd unit and can't be brought back, then at least restore backed up roms IFS=$'\n' SYSTEMD_UNIT_PATHS=($(ls -d /storage/.config/system.d/storage-roms-*.mount 2>/dev/null | sort)) unset IFS if [ "${#SYSTEMD_UNIT_PATHS[@]}" -gt 0 ]; then echo "Note: Multiple systemd mount units for folders under '${ROMS_DIR_ACTUAL}' found, will try to mount the roms folders for specific systems" for SYSTEMD_UNIT_PATH in "${SYSTEMD_UNIT_PATHS[@]}"; do [ ! -f "${SYSTEMD_UNIT_PATH}" ] && continue # Note: systemd unit names need specific escape rules, which should be done by systemd-escape, and I really don't think users would make themselves suffer and create units with name like that SYSTEMD_UNIT_NAME="$(basename ${SYSTEMD_UNIT_PATH})" MOUNTPOINT="$(grep ^Where= "${SYSTEMD_UNIT_PATH}")" umount_recursively "${MOUNTPOINT:6}" mount_samba_and_notice done fi finish_scan elif [[ ! -f "${ROMS_DIR_ACTUAL}/${ROMS_FILE_MARK}" || "${ACTION_ES_RESTART}" ]]; then prepare_scan echo "Note: current '${ROMS_DIR_ACTUAL}' is not linked from external drives or es_restart requested, we'll try to scan for external roms" find_roms_mark() { echo "Finding roms mark (${ROMS_FILE_MARK})..." if ! compgen -G "${MEDIA_DIR}/${ROMS_PART_MATCHER}/${ROMS_DIR_NAME}" &>/dev/null; then echo "ERROR: no folders under '${MEDIA_DIR}' match the matcher '${ROMS_PART_MATCHER}' and contain roms folder, maybe you should adjust some settings?" ROMS_PATH_MARK='' return 1 elif [ "${ROMS_PART_MATCHER}" == '*' ]; then ROMS_PATH_MARK="$(find "${MEDIA_DIR}/"*"/${ROMS_DIR_NAME}" -maxdepth 1 -name ${ROMS_FILE_MARK}* -not -path "${MEDIA_DIR}/${ROMS_PART_LABEL}/*" 2>/dev/null | head -n 1)" # Even we said the mark file should have no extension, but we still accept that, just in case else ROMS_PATH_MARK="$(find "${MEDIA_DIR}/${ROMS_PART_MATCHER}/${ROMS_DIR_NAME}" -maxdepth 1 -name ${ROMS_FILE_MARK}* -not -path "${MEDIA_DIR}/${ROMS_PART_LABEL}/*" 2>/dev/null | head -n 1)" fi } find_roms_mark if [ -z "${ROMS_PATH_MARK}" ]; then TRY=1 RETRY="$(get_ee_setting ee_mount.retry)" if [ "${RETRY}" -ge 1 ]; then while [ "${TRY}" -le "${RETRY}" ] ; do echo "WARNING: Roms mark not found (${ROMS_FILE_MARK}), retrying (${TRY}/${RETRY})" find_roms_mark [ "${EE_ROMS_PATH_MARK}" ] && break let TRY++ sleep 1 done fi fi if [ -z "${ROMS_PATH_MARK}" ]; then echo "WARNING: No external mount mark found (${ROMS_FILE_MARK}), if you want to use external roms, make sure you set it correctly" # No external roms could be found, if EEROMS exists, make sure it's mounted, otherwise restore backed up roms if possible if [ "${BOOL_EEROMS_EXIST}" ]; then if ! is_storage_roms_mounted; then echo "Note: Remounting EEROMS to '${ROMS_DIR_ACTUAL}'" umount_eeroms mount_eeroms "${ROMS_DIR_ACTUAL}" fi fi if ! is_storage_roms_mounted; then echo "WARNING: '${ROMS_DIR_ACTUAL}' is not a mountpoint, checking if we should restore backed up roms" restore_roms # If for some wierd reason EEROMS can't be mounted, then at least restore backed up roms fi else echo "Note: External mount mark found (${ROMS_PATH_MARK})" if [[ -f "${ROMS_DIR_ACTUAL}/${ROMS_FILE_MARK}" && "$(readlink -f "${ROMS_DIR_ACTUAL}/${ROMS_FILE_MARK}")" == "$(readlink -f "${ROMS_PATH_MARK}")" ]]; then echo 'Note: This is the same external drive as we are using, no need to update' else echo "Trying to create a symbol link at '${ROMS_DIR_ACTUAL}' to it" umount_recursively "${ROMS_DIR_ACTUAL}" mount_eeroms_to_media backup_roms ROMS_DIR_EXTERNAL="$(dirname "${ROMS_PATH_MARK}")" echo "Using '${ROMS_DIR_EXTERNAL}' as the external roms dir" rm -rf "${ROMS_DIR_ACTUAL}" &>/dev/null if ln -sTf "${ROMS_DIR_EXTERNAL}" "${ROMS_DIR_ACTUAL}" &>/dev/null; then echo "Successfully create symbol link '${ROMS_DIR_ACTUAL}' pointing to '${ROMS_DIR_EXTERNAL}'" else echo "WARNING: Failed to create symbol link, restoring backed up roms if possible" restore_roms fi fi fi finish_scan else echo 'Note: no need to scan external roms, mount_romfs skipped' fi find "${ROMS_DIR_BACKUP}" -maxdepth 0 -empty -exec rm -rf \{} \; if [ "${ACTION_ES_RESTART}" ]; then echo 'Restarting EmulationStation as requested...' systemctl restart emustation.service fi ================================================ FILE: packages/sx05re/emuelec/bin/pico8.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) . /etc/profile # If there is a new version copy the files if [[ -e "/storage/roms/bios/pico-8" ]]; then mkdir -p /emuelec/bin/pico-8 cp -rf /storage/roms/bios/pico-8/* /emuelec/bin/pico-8 rm -rf /storage/roms/bios/pico-8 chmod +x /emuelec/bin/pico-8/pico8_dyn touch /storage/roms/pico-8/splore.p8 fi if [ ! -L "/storage/.config/emuelec/configs/pico-8/bbs/carts" ]; then mkdir -p /storage/.config/emuelec/configs/pico-8/bbs/ ln -sf /storage/roms/pico-8 /storage/.config/emuelec/configs/pico-8/bbs/carts fi if [[ "${EE_DEVICE}" == "Amlogic-old" ]]; then set_audio alsa mv /storage/.config/asound.conf /storage/.config/asound.conf2 fi mkdir -p /emuelec/configs/pico-8 if [[ ! -L "/emuelec/configs/pico-8/sdl_controllers.txt" ]]; then rm /emuelec/configs/pico-8/sdl_controllers.txt ln -sf /storage/.config/SDL-GameControllerDB/gamecontrollerdb.txt /emuelec/configs/pico-8/sdl_controllers.txt fi #LD_LIBRARY_PATH="/emuelec/lib32:${LD_LIBRARY_PATH}" CART="${1}" if [[ "${CART}" == *"/splore"* ]]; then /emuelec/bin/pico-8/pico8_dyn -splore -home /emuelec/configs/pico-8 -root_path /storage/roms/pico-8 -joystick 0 else /emuelec/bin/pico-8/pico8_dyn -run "${CART}" -home /emuelec/configs/pico-8 -root_path /storage/roms/pico-8 -joystick 0 fi if [[ "${EE_DEVICE}" == "Amlogic-old" ]]; then set_audio default mv /storage/.config/asound.conf2 /storage/.config/asound.conf fi ================================================ FILE: packages/sx05re/emuelec/bin/playvideo.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile clear > /dev/console clear > /dev/tty1 clear > /dev/tty0 ee_console disable set_video_controls romdir="/storage/roms/" PLAYER="${2}" case ${PLAYER} in "ffplay") MODE=`get_resolution`; declare -a RES=( ${MODE} ) SIZE=" -x ${RES[0]} -y ${RES[1]}" player="ffplay -fs -autoexit -loglevel warning -hide_banner ${SIZE}" ;; "vlc") # does not work... /usr/bin/vlc -I "dummy" --aout=alsa "${1}" vlc://quit < /dev/tty1 > /dev/null 2>&1 ;; "mpv") player="mpv -fs --volume-max=200 --really-quiet" ;; esac cd /tmp VIDEO_MODE=general IS_YOUTUBE=$(cat "${1}" | grep -E "^https://www.youtube.com/.*") [[ ! -z "${IS_YOUTUBE}" ]] && VIDEO_MODE=youtube IS_TWITCH=$(cat "${1}" | grep -E "^https://www.twitch.tv/.*") [[ ! -z "${IS_TWITCH}" ]] && VIDEO_MODE=twitch [[ "${1}" == *".ytb" ]] && VIDEO_MODE=youtube [[ "${1}" == *".twi" ]] && VIDEO_MODE=twitch case ${VIDEO_MODE} in youtube) #Youtube Video ${player} "/storage/.config/splash/youtube-1080.png" youtube-dl --quiet --no-warnings -o - -a "${1}" | ${player} - > /dev/tty1 2>&1 ;; twitch) # Twitch Video ${player} "/storage/.config/splash/twitch-1080.png" youtube-dl --quiet --no-warnings -o - -a "${1}" | ${player} - > /dev/tty1 2>&1 ;; general) # Regular video ${player} "${1}" #> /dev/tty1 2>&1 ;; esac clear > /dev/console clear > /dev/tty1 clear > /dev/tty0 kill_video_controls ================================================ FILE: packages/sx05re/emuelec/bin/romconf.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile # Make sure ES is not running to prevent file corruption. if pgrep -x "emulationstation" > /dev/null then echo "ERROR: This script should not be run if emulationstation is running" exit 1 fi state="${1}" romconf="/storage/roms/emuelec.conf" conf="/emuelec/configs/emuelec.conf" [[ -z "${state}" ]] && state=$(get_ee_setting ee_romconf_enable) if [[ "${state}" != "1" ]] ; then if [[ -L "${conf}" ]]; then cp --remove-destination $(readlink ${conf}) ${conf} elif [[ -f "${romconf}" ]] && [[ ! -f "${conf}" ]]; then cp -rf "${romconf}" "${conf}" fi set_ee_setting ee_romconf_enable "0" elif [[ "${state}" == "1" ]]; then if [[ ! -f "${romconf}" ]]; then cp -f "${conf}" "${conf}.bak" mv -- "${conf}" "${romconf}" else mv -- "${conf}" "${conf}.bak" fi ln -s -- "${romconf}" "${conf}" set_ee_setting ee_romconf_enable "1" fi exit 0 ================================================ FILE: packages/sx05re/emuelec/bin/rr_audio.sh ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Frank Hartung (supervisedthinking@gmail.com) # Modifications by Shanti Gilbert (shantic@gmail.com) to work on EmuELEC Copyright (C) 2019-present . /etc/profile AUDIO_LOG="/emuelec/logs/rr_audio.log" echo "Set Audio: Log" > ${AUDIO_LOG} 2>&1 # Set common paths and defaults export PULSE_RUNTIME_PATH=/run/pulse RR_AUDIO_DEVICE="hw:$(get_ee_setting ee_audio_device)" [ ${RR_AUDIO_DEVICE} = "hw:" ] && RR_AUDIO_DEVICE="hw:0" echo "Set-Audio: Using audio device ${RR_AUDIO_DEVICE}" >> ${AUDIO_LOG} 2>&1 RR_PA_UDEV="false" RR_PA_TSCHED="true" RR_AUDIO_VOLUME="$(get_ee_setting audio.volume)" RR_AUDIO_BACKEND="PulseAudio" [[ -z "${RR_AUDIO_VOLUME}" ]] && RR_AUDIO_VOLUME="100" pulseaudio_sink_load() { if [ ${RR_AUDIO_BACKEND} = "PulseAudio" ];then systemctl restart pulseaudio if [ "${RR_PA_TSCHED}" = "false" ]; then TSCHED="tsched=0" echo "Set-Audio: PulseAudio will disable timer-based audio scheduling" >> ${AUDIO_LOG} 2>&1 else TSCHED="tsched=1" echo "Set-Audio: PulseAudio will enable timer-based audio scheduling" >> ${AUDIO_LOG} 2>&1 fi if [ ! -z "$(pactl list modules short | grep module-null-sink)" ];then if [ "${RR_PA_UDEV}" = "true" ]; then pactl load-module module-udev-detect ${TSCHED} > /dev/null pactl set-sink-volume "$(pactl info | grep 'Default Sink:' | cut -d ' ' -f 3)" ${RR_AUDIO_VOLUME}% >> ${AUDIO_LOG} 2>&1 if [ ! -z "$(pactl list modules short | grep module-alsa-card)" ];then echo "Set-Audio: PulseAudio module-udev-detect loaded, setting a volume of "${RR_AUDIO_VOLUME}"%" >> ${AUDIO_LOG} 2>&1 echo "Set-Audio: PulseAudio will use sink "$(pactl list sinks short) >> ${AUDIO_LOG} 2>&1 else echo "Set-Audio: PulseAudio module-udev-detect failed to load" >> ${AUDIO_LOG} 2>&1 fi else pactl load-module module-alsa-sink device="${RR_AUDIO_DEVICE}" name="temp_sink" ${TSCHED} > /dev/null pactl set-sink-volume alsa_output.temp_sink ${RR_AUDIO_VOLUME}% >> ${AUDIO_LOG} 2>&1 if [ ! -z "$(pactl list modules short | grep module-alsa-sink)" ];then echo "Set-Audio: PulseAudio module-alsa-sink loaded, setting a volume of "${RR_AUDIO_VOLUME}"%" >> ${AUDIO_LOG} 2>&1 echo "Set-Audio: PulseAudio will use sink "$(pactl list sinks short) >> ${AUDIO_LOG} 2>&1 else echo "Set-Audio: PulseAudio module-alsa-sink failed to load" >> ${AUDIO_LOG} 2>&1 fi fi fi fi } # Unload PulseAudio sink pulseaudio_sink_unload() { if [ ${RR_AUDIO_BACKEND} = "PulseAudio" ]; then if [ "${RR_PA_UDEV}" = "true" ] && [ ! -z "$(pactl list modules short | grep module-alsa-card)" ]; then pactl set-sink-volume "$(pactl info | grep 'Default Sink:' | cut -d ' ' -f 3)" 100% >> ${AUDIO_LOG} 2>&1 pactl unload-module module-udev-detect >> ${AUDIO_LOG} 2>&1 pactl unload-module module-alsa-card >> ${AUDIO_LOG} 2>&1 echo "Set-Audio: PulseAudio module-udev-detect unloaded" >> ${AUDIO_LOG} 2>&1 elif [ "${RR_PA_UDEV}" = "false" ] && [ ! -z "$(pactl list modules short | grep module-alsa-sink)" ]; then pactl set-sink-volume alsa_output.temp_sink 100% >> ${AUDIO_LOG} 2>&1 NUMBER="$(pactl list modules short | grep "name=temp_sink" | awk '{print ${1};}')" if [ -n "${NUMBER}" ]; then pactl unload-module "${NUMBER}" >> ${AUDIO_LOG} 2>&1 fi echo "Set-Audio: PulseAudio module-alsa-sink unloaded" >> ${AUDIO_LOG} 2>&1 else echo "Set-Audio: neither the PulseAudio module module-alsa-card or module-alsa-sink was found. Nothing to unload" >> ${AUDIO_LOG} 2>&1 fi # Restore ALSA Master volume to 100% if [ ! -z "$(amixer | grep "'Master',0")" ] && [ ! $(amixer get Master | awk '${0}~/%/{print ${4}}' | tr -d '[]%') = "100" ]; then amixer -q set Master,0 100% unmute echo "Set-Audio: ALSA mixer restore volume to 100%" >> ${AUDIO_LOG} 2>&1 fi fi systemctl stop pulseaudio } # Start FluidSynth fluidsynth_service_start() { if [ ${RR_AUDIO_BACKEND} = "PulseAudio" ] && [ ! "$(systemctl is-active fluidsynth)" = "active" ]; then systemctl start fluidsynth if [ "$(systemctl is-active fluidsynth)" = "active" ]; then echo "Set-Audio: FluidSynth service loaded successfully" >> ${AUDIO_LOG} 2>&1 else echo "Set-Audio: FluidSynth service failed to load" >> ${AUDIO_LOG} 2>&1 fi fi } # Stop FluidSynth fluidsynth_service_stop() { if [ "$(systemctl is-active fluidsynth)" = "active" ]; then systemctl stop fluidsynth if [ ! "$(systemctl is-active fluidsynth)" = "active" ]; then echo "Set-Audio: FluidSynth service successfully stopped" >> ${AUDIO_LOG} 2>&1 else echo "Set-Audio: FluidSynth service failed to stop" >> ${AUDIO_LOG} 2>&1 fi fi } # SDL2: Set audio driver to Pulseaudio or ALSA set_SDL_audiodriver() { if [ ${RR_AUDIO_BACKEND} = "PulseAudio" ]; then export SDL_AUDIODRIVER=pulseaudio else export SDL_AUDIODRIVER=alsa fi echo "Set-Audio: SDL2 set environment variable SDL_AUDIODRIVER="${SDL_AUDIODRIVER} >> ${AUDIO_LOG} 2>&1 } # RETROARCH: Set audio & midi driver set_RA_audiodriver() { RETROARCH_HOME=/storage/.config/retroarch RETROARCH_CONFIG=${RETROARCH_HOME}/retroarch.cfg if [ -f ${RETROARCH_CONFIG} ]; then if [ ${RR_AUDIO_BACKEND} = "PulseAudio" ]; then sed -e "s/audio_driver = \"alsathread\"/audio_driver = \"pulse\"/" -i ${RETROARCH_CONFIG} sed -e "s/midi_driver = \"null\"/midi_driver = \"alsa\"/" -i ${RETROARCH_CONFIG} sed -e "s/midi_output = \"Off\"/midi_output = \"FluidSynth\"/" -i ${RETROARCH_CONFIG} echo "Set-Audio: Retroarch force audio driver to PulseAudio & MIDI output to FluidSynth" else sed -e "s/audio_driver = \"pulse\"/audio_driver = \"alsathread\"/" -i ${RETROARCH_CONFIG} sed -e "s/midi_driver = \"alsa\"/midi_driver = \"null\"/" -i ${RETROARCH_CONFIG} sed -e "s/midi_output = \"FluidSynth\"/midi_output = \"Off\"/" -i ${RETROARCH_CONFIG} echo "Set-Audio: Retroarch force audio driver to ALSA & disable MIDI output" fi fi } case "${1}" in "pulseaudio") pulseaudio_sink_unload fluidsynth_service_stop pulseaudio_sink_load ;; "fluidsynth") pulseaudio_sink_unload pulseaudio_sink_load fluidsynth_service_stop fluidsynth_service_start ;; "alsa") pulseaudio_sink_unload fluidsynth_service_stop RR_AUDIO_BACKEND="alsa" ;; esac set_SDL_audiodriver if [ "$EE_DEVICE" == "OdroidGoAdvance" ] || [ "$EE_DEVICE" == "GameForce" ]; then # For some reason the audio is being reseted to 100 at boot, so we reaply the saved settings here odroidgoa_utils.sh vol ${RR_AUDIO_VOLUME} else #amixer set 'DAC Digital' "${RR_AUDIO_VOLUME}%" amixer set Master "${RR_AUDIO_VOLUME}%" >> ${AUDIO_LOG} 2>&1 fi ================================================ FILE: packages/sx05re/emuelec/bin/runwiimote.sh ================================================ #!/bin/sh """:" /usr/bin/systemctl stop eventlircd exec python3 "$0" "$@" """ import sysconfig if sysconfig.get_config_var("SO") is None: import sys sysconfig._CONFIG_VARS["SO"] = ".so" import evdev import uinput SCREEN_WIDTH = 1920 SCREEN_HEIGHT = 1080 MAX_IR_X = 1023 MAX_IR_Y = 767 IR_DEVICE_NAME = "Nintendo Wii Remote IR" def normalize(val, max_val, screen_size): return int((val / max_val) * screen_size) def find_ir_device(): devices = [evdev.InputDevice(path) for path in evdev.list_devices()] for dev in devices: if IR_DEVICE_NAME in dev.name: print(f"✔ Found IR device: {dev.name} ({dev.path})") return dev raise RuntimeError("❌ Wiimote IR device not found") def main(): ir_dev = find_ir_device() ui = uinput.Device([ uinput.ABS_X + (0, SCREEN_WIDTH, 0, 0), uinput.ABS_Y + (0, SCREEN_HEIGHT, 0, 0), uinput.BTN_LEFT ], name="Wiimote IR") x = SCREEN_WIDTH // 2 y = SCREEN_HEIGHT // 2 for event in ir_dev.read_loop(): if event.type == evdev.ecodes.EV_ABS: if event.code == evdev.ecodes.ABS_HAT0X: x = SCREEN_WIDTH - normalize(event.value, MAX_IR_X, SCREEN_WIDTH) elif event.code == evdev.ecodes.ABS_HAT0Y: y = normalize(event.value, MAX_IR_Y, SCREEN_HEIGHT) ui.emit(uinput.ABS_X, x, syn=False) ui.emit(uinput.ABS_Y, y) if __name__ == "__main__": try: main() except KeyboardInterrupt: print("Exit.") ================================================ FILE: packages/sx05re/emuelec/bin/scripts/scriptmodules/archivefuncs.sh ================================================ #!/bin/bash # This file is part of The RetroPie Project # # The RetroPie Project is the legal property of its developers, whose names are # too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source. # # See the LICENSE.md file at the top-level directory of this distribution and # at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md # ## @file archivefuncs.sh ## @brief RetroPie archivefuncs library ## @copyright GPLv3 readonly arch_dir="/tmp/retropie-archive" ## @fn archiveExtract() ## @param src_file Full path to archive file to extract ## @param disk_exts Space separated list of supported disk extensions (e.g. ".d64 .t64") ## @brief Extracts an archive to a temporary directory ## @details After calling this the variable arch_dir will contain the directory that was used ## for extraction. Also the variable arch_files will contain an array of filenames that are ## considered as game disks according to parameter disk_exts. function archiveExtract() { local src_file="$1" local disk_exts="$2" # clean temp directory if needed archiveCleanup mkdir "$arch_dir" local ext="${src_file##*.}" case "${ext,,}" in zip) unzip "$src_file" -d "$arch_dir" ;; *) echo "Unsupported archive: $src_file" return 1 ;; esac # build a regex portion from the passed extensions local regex="${disk_exts// /\\|}" IFS=$'\n' read -d '' -r -a arch_files < <(find "$arch_dir" -iregex ".*.\(${regex}\)$" | sort) if [[ ${#arch_files[@]} -eq 0 ]]; then return 2 fi } ## @fn archiveCleanup() ## @brief Purges archive temp directory from previous calls to archiveExtract function archiveCleanup() { [[ -d "$arch_dir" ]] && rm -rf "$arch_dir" } ================================================ FILE: packages/sx05re/emuelec/bin/scripts/scriptmodules/helpers.sh ================================================ #!/bin/bash # This file is part of The RetroPie Project # # The RetroPie Project is the legal property of its developers, whose names are # too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source. # # See the LICENSE.md file at the top-level directory of this distribution and # at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md # # Source predefined functions and variables . /etc/profile ## @file helpers.sh ## @brief RetroPie helpers library ## @copyright GPLv3 ## @fn printMsgs() ## @param type style of display to use - dialog, console or heading ## @param message string or array of messages to display ## @brief Prints messages in a variety of ways. function printMsgs() { local type="$1" shift if [[ "$__nodialog" == "1" && "$type" == "dialog" ]]; then type="console" fi for msg in "$@"; do [[ "$type" == "dialog" ]] && dialog --ascii-lines --backtitle "$__backtitle" --cr-wrap --no-collapse --msgbox "$msg" 20 60 >/dev/tty0 [[ "$type" == "console" ]] && echo -e "$msg" >/dev/tty0 [[ "$type" == "heading" ]] && echo -e "\n= = = = = = = = = = = = = = = = = = = = =\n$msg\n= = = = = = = = = = = = = = = = = = = = =\n" >/dev/tty0 done return 0 } ## @fn printHeading() ## @param message string or array of messages to display ## @brief Calls PrintMsgs with "heading" type. function printHeading() { printMsgs "heading" "$@" } ## @fn fatalError() ## @param message string or array of messages to display ## @brief Calls PrintMsgs with "heading" type, and exits immediately. function fatalError() { printHeading "Error" echo -e "$1" joy2keyStop exit 1 } # @fn fnExists() # @param name name of function to check for # @brief Checks if function name exists. # @retval 0 if the function name exists # @retval 1 if the function name does not exist function fnExists() { declare -f "$1" > /dev/null return $? } function ask() { echo -e -n "$@" '[y/n] ' ; read ans case "$ans" in y*|Y*) return 0 ;; *) return 1 ;; esac } ## @fn runCmd() ## @param command command to run ## @brief Calls command and record any non zero return codes for later printing. ## @return whatever the command returns. function runCmd() { local ret "$@" ret=$? if [[ "$ret" -ne 0 ]]; then md_ret_errors+=("Error running '$*' - returned $ret") fi return $ret } ## @fn hasFlag() ## @param string string to search in ## @param flag flag to search for ## @brief Checks for a flag in a string (consisting of space separated flags). ## @retval 0 if the flag was found ## @retval 1 if the flag was not found function hasFlag() { local string="$1" local flag="$2" [[ -z "$string" || -z "$flag" ]] && return 1 if [[ "$string" =~ (^| )$flag($| ) ]]; then return 0 else return 1 fi } ## @fn isPlatform() ## @param platform ## @brief Test for current platform / platform flags. function isPlatform() { local flag="$1" if hasFlag "$__platform $__platform_flags" "$flag"; then return 0 fi return 1 } ## @fn addLineToFile() ## @param line line to add ## @param file file to add line to ## @brief Adds a new line of text to a file. function addLineToFile() { if [[ -f "$2" ]]; then cp -p "$2" "$2.bak" else sed -i '$a\' "$2" fi echo "$1" >> "$2" } ## @fn editFile() ## @param file file to edit ## @brief Opens an editing dialog for specified file. function editFile() { local file="$1" local cmd=(dialog --ascii-lines --backtitle "$__backtitle" --editbox "$file" 22 76) local choice=$("${cmd[@]}" 2>&1 >/dev/tty) [[ -n "$choice" ]] && echo "$choice" >"$file" } ## @fn hasPackage() ## @param package name of Debian package ## @param version requested version (optional) ## @param comparison type of comparison - defaults to `ge` (greater than or equal) if a version parameter is provided. ## @brief Test for an installed Debian package / package version. ## @retval 0 if the requested package / version was installed ## @retval 1 if the requested package / version was not installed function hasPackage() { local pkg="$1" local req_ver="$2" local comp="$3" [[ -z "$comp" ]] && comp="ge" local status=$(dpkg-query -W --showformat='${Status} ${Version}' $1 2>/dev/null) if [[ $? -eq 0 ]]; then local ver="${status##* }" local status="${status% *}" # if status doesn't contain "ok installed" package is not installed if [[ "$status" == *"ok installed" ]]; then # if we didn't request a version number, be happy with any [[ -z "$req_ver" ]] && return 0 compareVersions "$ver" "$comp" "$req_ver" && return 0 fi fi return 1 } ## @fn aptUpdate() ## @brief Calls apt-get update (if it has not been called before). function aptUpdate() { if [[ "$__apt_update" != "1" ]]; then apt-get update __apt_update="1" fi } ## @fn aptInstall() ## @param packages package / space separated list of packages to install ## @brief Calls apt-get install with the packages provided. function aptInstall() { aptUpdate apt-get install -y "$@" return $? } ## @fn aptRemove() ## @param packages package / space separated list of packages to install ## @brief Calls apt-get remove with the packages provided. function aptRemove() { aptUpdate apt-get remove -y "$@" return $? } ## @fn getDepends() ## @param packages package / space separated list of packages to install ## @brief Installs packages if they are not installed. ## @retval 0 on success ## @retval 1 on failure function getDepends() { return 0 local required local packages=() local failed=() # check whether to use our own sdl2 - can be disabled to resolve issues with # mixing custom 64bit sdl2 and os distributed i386 version on multiarch local own_sdl2=1 iniConfig " = " '"' "$configdir/all/retropie.cfg" iniGet "own_sdl2" [[ "$ini_value" == "0" ]] && own_sdl2=0 for required in $@; do # workaround for different package names on osmc / xbian if [[ "$required" == "libraspberrypi-bin" ]]; then isPlatform "osmc" && required="rbp-userland-osmc" isPlatform "xbian" && required="xbian-package-firmware" fi if [[ "$required" == "libraspberrypi-dev" ]]; then isPlatform "osmc" && required="rbp-userland-dev-osmc" isPlatform "xbian" && required="xbian-package-firmware" fi # map libpng12-dev to libpng-dev for Stretch+ if [[ "$required" == "libpng12-dev" ]] && compareVersions "$__os_debian_ver" ge 9; then required="libpng-dev" printMsgs "console" "RetroPie module references libpng12-dev and should be changed to libpng-dev" fi # map libpng-dev to libpng12-dev for Jessie if [[ "$required" == "libpng-dev" ]] && compareVersions "$__os_debian_ver" lt 9; then required="libpng12-dev" fi if [[ "$md_mode" == "install" ]]; then # make sure we have our sdl1 / sdl2 installed if ! isPlatform "x11" && [[ "$required" == "libsdl1.2-dev" ]] && hasPackage libsdl1.2-dev $(get_pkg_ver_sdl1) "ne"; then packages+=("$required") continue fi if [[ "$own_sdl2" -eq 1 && "$required" == "libsdl2-dev" ]] && hasPackage libsdl2-dev $(get_pkg_ver_sdl2) "ne"; then packages+=("$required") continue fi # make sure libraspberrypi-dev/libraspberrypi0 is up to date. if [[ "$required" == "libraspberrypi-dev" ]] && hasPackage libraspberrypi-dev 1.20170703-1 "lt"; then packages+=("$required") continue fi fi if [[ "$md_mode" == "remove" ]]; then hasPackage "$required" && packages+=("$required") else hasPackage "$required" || packages+=("$required") fi done if [[ ${#packages[@]} -ne 0 ]]; then if [[ "$md_mode" == "remove" ]]; then apt-get remove --purge -y "${packages[@]}" apt-get autoremove --purge -y return 0 fi echo "Did not find needed package(s): ${packages[@]}. I am trying to install them now." # workaround to force installation of our fixed libsdl1.2 and custom compiled libsdl2 local temp=() for required in ${packages[@]}; do if isPlatform "rpi" && [[ "$required" == "libsdl1.2-dev" ]]; then if [[ "$__has_binaries" -eq 1 ]]; then rp_callModule sdl1 install_bin else rp_callModule sdl1 fi elif [[ "$required" == "libsdl2-dev" && "$own_sdl2" == "1" ]]; then if [[ "$__has_binaries" -eq 1 ]]; then rp_callModule sdl2 install_bin else rp_callModule sdl2 fi else temp+=("$required") fi done packages=("${temp[@]}") aptInstall --no-install-recommends "${packages[@]}" # check the required packages again rather than return code of apt-get, # as apt-get might fail for other reasons (eg other half installed packages) for required in ${packages[@]}; do if ! hasPackage "$required"; then # workaround for installing samba in a chroot (fails due to failed smbd service restart) # we replace the init.d script with an empty script so the install completes if [[ "$required" == "samba" && "$__chroot" -eq 1 ]]; then mv /etc/init.d/smbd /etc/init.d/smbd.old echo "#!/bin/sh" >/etc/init.d/smbd chmod u+x /etc/init.d/smbd apt-get -f install mv /etc/init.d/smbd.old /etc/init.d/smbd else failed+=("$required") fi fi done if [[ ${#failed[@]} -eq 0 ]]; then printMsgs "console" "Successfully installed package(s): ${packages[*]}." else md_ret_errors+=("Could not install package(s): ${failed[*]}.") return 1 fi fi return 0 } ## @fn rpSwap() ## @param command *on* to add swap if needed and *off* to remove later ## @param memory total memory needed (swap added = memory needed - available memory) ## @brief Adds additional swap to the system if needed. function rpSwap() { local command=$1 local swapfile="$__swapdir/swap" case $command in on) rpSwap off local memory=$(free -t -m | awk '/^Total:/{print $2}') local needed=$2 local size=$((needed - memory)) mkdir -p "$__swapdir/" if [[ $size -ge 0 ]]; then echo "Adding $size MB of additional swap" fallocate -l ${size}M "$swapfile" chmod 600 "$swapfile" mkswap "$swapfile" swapon "$swapfile" fi ;; off) echo "Removing additional swap" swapoff "$swapfile" 2>/dev/null rm -f "$swapfile" ;; esac } ## @fn gitPullOrClone() ## @param dest destination directory ## @param repo repository to clone or pull from ## @param branch branch to clone or pull from (optional) ## @param commit specific commit to checkout (optional - requires branch to be set) ## @brief Git clones or pulls a repository. function gitPullOrClone() { local dir="$1" local repo="$2" local branch="$3" [[ -z "$branch" ]] && branch="master" local commit="$4" if [[ -d "$dir/.git" ]]; then pushd "$dir" > /dev/null runCmd git checkout "$branch" runCmd git pull runCmd git submodule update --init --recursive popd > /dev/null else local git="git clone --recursive" if [[ "$__persistent_repos" -ne 1 && "$repo" == *github* && -z "$commit" ]]; then git+=" --depth 1" fi [[ "$branch" != "master" ]] && git+=" --branch $branch" printMsgs "console" "$git \"$repo\" \"$dir\"" runCmd $git "$repo" "$dir" fi if [[ -n "$commit" ]]; then printMsgs "console" "Winding back $repo->$branch to commit: #$commit" git -C "$dir" branch -D "$commit" &>/dev/null runCmd git -C "$dir" checkout -f "$commit" -b "$commit" fi branch=$(runCmd git -C "$dir" rev-parse --abbrev-ref HEAD) commit=$(runCmd git -C "$dir" rev-parse HEAD) printMsgs "console" "HEAD is now in branch '$branch' at commit '$commit'" } # @fn setupDirectories() # @brief Makes sure some required retropie directories and files are created. function setupDirectories() { mkdir -p "$rootdir" mkUserDir "$datadir" mkUserDir "$romdir" mkUserDir "$biosdir" mkUserDir "$configdir" mkUserDir "$configdir/all" # some home folders for configs that modules rely on mkUserDir "$home/.cache" mkUserDir "$home/.config" mkUserDir "$home/.local" mkUserDir "$home/.local/share" # make sure we have inifuncs.sh in place and that it is up to date mkdir -p "$rootdir/lib" local helper_libs=(inifuncs.sh archivefuncs.sh) for helper in "${helper_libs[@]}"; do if [[ ! -f "$rootdir/lib/$helper" || "$rootdir/lib/$helper" -ot "$scriptdir/scriptmodules/$helper" ]]; then cp --preserve=timestamps "$scriptdir/scriptmodules/$helper" "$rootdir/lib/$helper" fi done # create template for autoconf.cfg and make sure it is owned by $user local config="$configdir/all/autoconf.cfg" if [[ ! -f "$config" ]]; then echo "# this file can be used to enable/disable retropie autoconfiguration features" >"$config" fi chown $user:$user "$config" } ## @fn rmDirExists() ## @param dir directory to remove ## @brief Removes a directory and all contents if it exists. function rmDirExists() { if [[ -d "$1" ]]; then rm -rf "$1" fi } ## @fn mkUserDir() ## @param dir directory to create ## @brief Creates a directory owned by the current user. function mkUserDir() { mkdir -p "$1" chown $user:$user "$1" } ## @fn mkRomDir() ## @param dir rom directory to create ## @brief Creates a directory under $romdir owned by the current user. function mkRomDir() { mkUserDir "$romdir/$1" if [[ "$1" == "megadrive" ]]; then pushd "$romdir" ln -snf "$1" "genesis" popd fi } ## @fn moveConfigDir() ## @param from source directory ## @param to destination directory ## @brief Moves the contents of a folder and symlinks to the new location. function moveConfigDir() { local from="$1" local to="$2" # if we are in remove mode - remove the symlink if [[ "$md_mode" == "remove" ]]; then [[ -h "$from" ]] && rm -f "$from" return fi mkUserDir "$to" # move any old configs to the new location if [[ -d "$from" && ! -h "$from" ]]; then cp -a "$from/." "$to/" rm -rf "$from" fi ln -snf "$to" "$from" # set ownership of the actual link to $user chown -h $user:$user "$from" } ## @fn moveConfigFile() ## @param from source file ## @param to destination file ## @brief Moves the file and symlinks to the new location. function moveConfigFile() { local from="$1" local to="$2" # if we are in remove mode - remove the symlink if [[ "$md_mode" == "remove" && -h "$from" ]]; then rm -f "$from" return fi # move old file if [[ -f "$from" && ! -h "$from" ]]; then mv "$from" "$to" fi ln -sf "$to" "$from" # set ownership of the actual link to $user chown -h $user:$user "$from" } ## @fn diffFiles() ## @param file1 file to compare ## @param file2 file to compare ## @brief Compares two files using diff. ## @retval 0 if the files were the same ## @retval 1 if they were not ## @retval >1 an error occurred function diffFiles() { diff -q "$1" "$2" >/dev/null return $? } ## @fn compareVersions() ## @param version first version to compare ## @param operator operator to use (lt le eq ne ge gt) ## @brief version second version to compare ## @retval 0 if the comparison was true ## @retval 1 if the comparison was false function compareVersions() { dpkg --compare-versions "$1" "$2" "$3" >/dev/null return $? } ## @fn dirIsEmpty() ## @param path path to directory ## @param files_only set to 1 to ignore sub directories ## @retval 0 if the directory is empty ## @retval 1 if the directory is not empty function dirIsEmpty() { if [[ "$2" -eq 1 ]]; then [[ -z "$(ls -lA1 "$1" | grep "^-")" ]] && return 0 else [[ -z "$(ls -A "$1")" ]] && return 0 fi return 1 } ## @fn copyDefaultConfig() ## @param from source file ## @param to destination file ## @brief Copies a default configuration. ## @details Copies from the source file to the destination file if the destination ## file doesn't exist. If the destination is the same nothing is done. If different ## the source is copied to `$destination.rp-dist`. function copyDefaultConfig() { local from="$1" local to="$2" # if the destination exists, and is different then copy the config as name.rp-dist if [[ -f "$to" ]]; then if ! diffFiles "$from" "$to"; then to+=".rp-dist" printMsgs "console" "Copying new default configuration to $to" cp "$from" "$to" fi else printMsgs "console" "Copying default configuration to $to" cp "$from" "$to" fi chown $user:$user "$to" } ## @fn renameModule() ## @param from source file ## @param to destination file ## @brief Renames an existing module. ## @details Renames an existing module, moving it's install folder to the new location ## and changing any references to it in `emulators.cfg`. function renameModule() { local from="$1" local to="$2" # move from old location and update emulators.cfg if [[ -d "$rootdir/$md_type/$from" ]]; then rm -rf "$rootdir/$md_type/$to" mv "$rootdir/$md_type/$from" "$rootdir/$md_type/$to" # replace any default = "$from" sed -i "s/\"$from\"/\"$to\"/g" "$configdir"/*/emulators.cfg # replace any $from = "cmdline" sed -i "s/^$from\([ =]\)/$to\1/g" "$configdir"/*/emulators.cfg # replace any paths with /$from/ sed -i "s|/$from/|/$to/|g" "$configdir"/*/emulators.cfg fi } ## @fn addUdevInputRules() ## @brief Creates a udev rule to adjust input device permissions. ## @details Creates a udev rule in `/etc/udev/rules.d/99-input.rules` to ## make everything in `/dev/input` it writable by any user in group `input`. function addUdevInputRules() { if [[ ! -f /etc/udev/rules.d/99-input.rules ]]; then echo 'SUBSYSTEM=="input", GROUP="input", MODE="0660"' > /etc/udev/rules.d/99-input.rules fi # remove old 99-evdev.rules rm -f /etc/udev/rules.d/99-evdev.rules } ## @fn setDispmanx() ## @param module_id name of module to add dispmanx flag for ## @param status initial status of flag (0 or 1) ## @brief Sets a dispmanx flag for a module. ## @details Set a dispmanx flag for a module as to whether it should use the ## sdl1 dispmanx backend by default or not (0 for framebuffer, 1 for dispmanx). function setDispmanx() { isPlatform "rpi" || return local mod_id="$1" local status="$2" iniConfig "=" "\"" "$configdir/all/dispmanx.cfg" iniSet $mod_id "$status" chown $user:$user "$configdir/all/dispmanx.cfg" } ## @fn iniFileEditor() ## @param delim ini file delimiter eg. ' = ' ## @param quote ini file quoting character eg. '"' ## @param config ini file to edit ## @brief Allows editing of ini files with a user friendly dialog based gui. ## @details Some arrays need to be configured before calling this, which are ## used to display what can be edited and the options available. ## ## The first array is `$ini_titles` which provides the titles for each ## entry.. ## ## The second array is `$ini_descs` which contains a help description for each ## entry. ## ## The third array is `$ini_options` which contains multiple space separated ## strings in each element to control how each entry should be managed. ## ## The `$ini_options` array is constructed as follows: ## ## If the first string is `_function_` then the next string should be a function ## name that will handle that entry. The function will be called with a parameter ## `get` or `set`. The function should return the value for get via `echo` ## and should handle any gui functionality when called with `set`. This can be ## used for example to build custom dialogs. ## ## If the first option is anything else, it is assumed to be a key name, followed ## by a control type and a list of parameters. ## ## Control types are: ## * `_id_` map the following values to an id ## * `_string_` allow the value to be inputted by the user ## * `_file_` select from a list of files. The following values are wildcard, ## then file path. ## ## If none of the above, then the rest of the array element should be a list of ## possible values for the key. ## ## Some examples for ini_options: ## ## ini_options=('video_smooth true false') ## Allow setting of the key `video_smooth` with the values of *true* or *false* ## ## ini_options=('aspect_ratio_index _id_ 4:3 16:9 16:10) ## Allow setting of the key `aspect_ratio_index` with the values 0 1 or 2 which ## correspond to the ratios. The user is shown the ratios, but the ini configuration ## is set to the id (4:3 = 0, 16:9 = 1, 16:10 = 2). ## ## ini_options=('_function_ _video_fullscreen_configedit') ## The function `_video_fullscreen_configedit` is called with *get* or *set* ## to manage this entry. ## ## ini_options=("video_shader _file_ *.*p $rootdir/emulators/retroarch/shader") ## The key `video_shader` will be able to be set to a list of files in ## `$rootdir/emulators/retroarch/shader` that match the wildcard `*.*p` ## ## For more examples you can check out the code in supplementary/configedit.sh function iniFileEditor() { local delim="$1" local quote="$2" local config="$3" [[ ! -f "$config" ]] && return iniConfig "$delim" "$quote" "$config" local sel local value local option local title while true; do local options=() local params=() local values=() local keys=() local i=0 # generate menu from options for option in "${ini_options[@]}"; do # split into new array (globbing safe) read -ra option <<<"$option" key="${option[0]}" keys+=("$key") params+=("${option[*]:1}") # if the first parameter is _function_ we call the second parameter as a function # so we can handle some options with a custom menu etc if [[ "$key" == "_function_" ]]; then value="$(${option[1]} get)" else # get current value iniGet "$key" if [[ -n "$ini_value" ]]; then value="$ini_value" else value="unset" fi fi values+=("$value") # add the matching value to our id in _id_ lists if [[ "${option[1]}" == "_id_" && "$value" != "unset" ]]; then value+=" - ${option[value+2]}" fi # use custom title if provided if [[ -n "${ini_titles[i]}" ]]; then title="${ini_titles[i]}" else title="$key" fi options+=("$i" "$title ($value)" "${ini_descs[i]}") ((i++)) done local cmd=(dialog --ascii-lines --backtitle "$__backtitle" --default-item "$sel" --item-help --help-button --menu "Please choose the setting to modify in $config" 22 76 16) sel=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) if [[ "${sel[@]:0:4}" == "HELP" ]]; then printMsgs "dialog" "${sel[@]:5}" continue fi [[ -z "$sel" ]] && break # if the key is _function_ we handle the option with a custom function if [[ "${keys[sel]}" == "_function_" ]]; then "${params[sel]}" set "${values[sel]}" continue fi # process the editing of the option i=0 options=("U" "unset") local default="" # split into new array (globbing safe) read -ra params <<<"${params[sel]}" local mode="${params[0]}" case "$mode" in _string_) options+=("E" "Edit (Currently ${values[sel]})") ;; _file_) local match="${params[1]}" local path="${params[*]:2}" local file while read file; do [[ "${values[sel]}" == "$file" ]] && default="$i" file="${file//$path\//}" options+=("$i" "$file") ((i++)) done < <(find -L "$path" -type f -name "$match" | sort) ;; _id_|*) [[ "$mode" == "_id_" ]] && params=("${params[@]:1}") for option in "${params[@]}"; do if [[ "$mode" == "_id_" ]]; then [[ "${values[sel]}" == "$i" ]] && default="$i" else [[ "${values[sel]}" == "$option" ]] && default="$i" fi options+=("$i" "$option") ((i++)) done ;; esac [[ -z "$default" ]] && default="U" # display values cmd=(dialog --ascii-lines --backtitle "$__backtitle" --default-item "$default" --menu "Please choose the value for ${keys[sel]}" 22 76 16) local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) # if it is a _string_ type we will open an inputbox dialog to get a manual value if [[ -z "$choice" ]]; then continue elif [[ "$choice" == "E" ]]; then [[ "${values[sel]}" == "unset" ]] && values[sel]="" cmd=(dialog --ascii-lines --backtitle "$__backtitle" --inputbox "Please enter the value for ${keys[sel]}" 10 60 "${values[sel]}") value=$("${cmd[@]}" 2>&1 >/dev/tty) elif [[ "$choice" == "U" ]]; then value="" else if [[ "$mode" == "_id_" ]]; then value="$choice" else # get the actual value from the options array local index=$((choice*2+3)) if [[ "$mode" == "_file_" ]]; then value="$path/${options[index]}" else value="${options[index]}" fi fi fi if [[ "$choice" == "U" ]]; then iniUnset "${keys[sel]}" "$value" else iniSet "${keys[sel]}" "$value" fi done } ## @fn setESSystem() ## @param fullname full name of system ## @param name short name of system ## @param path rom path ## @param extension file extensions to show ## @param command command to run ## @param platform name of platform (used by es for scraping) ## @param theme name of theme to use ## @brief Adds a system entry for Emulation Station (to /etc/emulationstation/es_systems.cfg). function setESSystem() { local function for function in $(compgen -A function _add_system_); do "$function" "$@" done } ## @fn ensureSystemretroconfig() ## @param system system to create retroarch.cfg for ## @param shader set a default shader to use (deprecated) ## @brief Creates a default retroarch.cfg for specified system in `/opt/retropie/configs/$system/retroarch.cfg`. function ensureSystemretroconfig() { local system="$1" local shader="$2" if [[ ! -d "$configdir/$system" ]]; then mkUserDir "$configdir/$system" fi local config="$(mktemp)" # add the initial comment regarding include order echo -e "# Settings made here will only override settings in the global retroarch.cfg if placed above the #include line\n" >"$config" # add the per system default settings iniConfig " = " '"' "$config" iniSet "input_remapping_directory" "$configdir/$system/" if [[ -n "$shader" ]]; then iniUnset "video_smooth" "false" iniSet "video_shader" "$emudir/retroarch/shader/$shader" iniUnset "video_shader_enable" "true" fi # include the main retroarch config echo -e "\n#include \"$configdir/all/retroarch.cfg\"" >>"$config" copyDefaultConfig "$config" "$configdir/$system/retroarch.cfg" rm "$config" } ## @fn setRetroArchCoreOption() ## @param option option to set ## @param value value to set ## @brief Sets a retroarch core option in `$configdir/all/retroarch-core-options.cfg`. function setRetroArchCoreOption() { local option="$1" local value="$2" iniConfig " = " "\"" "$configdir/all/retroarch-core-options.cfg" iniGet "$option" if [[ -z "$ini_value" ]]; then iniSet "$option" "$value" fi chown $user:$user "$configdir/all/retroarch-core-options.cfg" } ## @fn setConfigRoot() ## @param dir directory under $configdir to use ## @brief Sets module config root `$md_conf_root` to subfolder from `$configdir` ## @details This is used for ports that are not actually in scriptmodules/ports ## as they would get the wrong config root otherwise. function setConfigRoot() { local dir="$1" md_conf_root="$configdir" [[ -n "$dir" ]] && md_conf_root+="/$dir" mkUserDir "$md_conf_root" } ## @fn loadModuleConfig() ## @param params space separated list of key=value parameters ## @brief Load the settings for a module. ## @details This allows modules to quickly load some settings from an ini file. ## It can provide a shortcut way to load a set of keys from an ini file into ## variables. ## ## It requires iniConfig to be called first to specify the format and file. ## eg. ## ## iniConfig " = " '"' "$configdir/all/mymodule.cfg" ## eval $(loadModuleConfig \ ## 'some_option=1' \ ## 'another_option=2' ## ## This would load the keys `some_option` and `another_option` into local ## variables `some_option` and `another_option`. If the keys did not exist ## in mymodule.cfg the variables would be initialised to 1 and 2. function loadModuleConfig() { local options=("$@") local option local key local value for option in "${options[@]}"; do option=(${option/=/ }) key="${option[0]}" value="${option[@]:1}" iniGet "$key" if [[ -z "$ini_value" ]]; then iniSet "$key" "$value" echo "local $key=\"$value\"" else echo "local $key=\"$ini_value\"" fi done } ## @fn applyPatch() ## @param patch filename of patch to apply ## @brief Apply a patch if it has not already been applied to current folder. ## @details This is used for applying patches against upstream code. ## @retval 0 on success ## @retval 1 on failure function applyPatch() { local patch="$1" local patch_applied="${patch##*/}.applied" if [[ ! -f "$patch_applied" ]]; then if patch -f -p1 <"$patch"; then touch "$patch_applied" printMsgs "console" "Successfully applied patch: $patch" else md_ret_errors+=("$md_id patch $patch failed to apply") return 1 fi fi return 0 } ## @fn downloadAndExtract() ## @param url url of archive ## @param dest destination folder for the archive ## @param optional additional parameters to pass to the decompression tool. ## @brief Download and extract an archive ## @details Download and extract an archive. ## @retval 0 on success function downloadAndExtract() { local url="$1" local dest="$2" shift 2 local opts=("$@") local ext="${url##*.}" local cmd=(tar -xv) local is_tar=1 local ret case "$ext" in gz|tgz) cmd+=(-z) ;; bz2) cmd+=(-j) ;; xz) cmd+=(-J) ;; exe|zip) is_tar=0 local tmp="$(mktemp -d)" local file="${url##*/}" runCmd wget -q -O"$tmp/$file" "$url" runCmd unzip "${opts[@]}" -o "$tmp/$file" -d "$dest" rm -rf "$tmp" ret=$? esac if [[ "$is_tar" -eq 1 ]]; then mkdir -p "$dest" cmd+=(-C "$dest" "${opts[@]}") runCmd "${cmd[@]}" < <(wget -q -O- "$url") ret=$? fi return $ret } ## @fn ensureFBMode() ## @param res_x width of mode ## @param res_y height of mode ## @brief Add a framebuffer mode to /etc/fb.modes ## @details Useful for adding specific resolutions used by emulators so SDL1 can ## use them and utilise the RPI hardware scaling. Without for example a 320x240 ## mode in fb.modes many of the emulators that output to the framebuffer and ## were not set to use the dispmanx SDL1 backend would just show in a small ## area of the screen. function ensureFBMode() { [[ ! -f /etc/fb.modes ]] && return local res_x="$1" local res_y="$2" local res="${res_x}x${res_y}" sed -i "/$res mode/,/endmode/d" /etc/fb.modes cat >> /etc/fb.modes <<_EOF_ # added by RetroPie-Setup - $res mode for emulators mode "$res" geometry $res_x $res_y $res_x $res_y 16 timings 0 0 0 0 0 0 0 endmode _EOF_ } ## @fn joy2keyStart() ## @brief Start joy2key.py process in background to map joystick presses to keyboard function joy2keyStart() { gptokeyb & } ## @fn joy2keyStop() ## @brief Stop previously started joy2key.py process. function joy2keyStop() { killall gptokeyb } ## @fn getPlatformConfig() ## @param key key to look up ## @brief gets a config from a platforms.cfg ini ## @details gets a config from a platforms.cfg ini first looking in ## `$configdir/all/platforms.cfg` then `$scriptdir/platforms.cfg` ## allowing users to override any parts of `$scriptdir/platforms.cfg` function getPlatformConfig() { local key="$1" local conf for conf in "$configdir/all/platforms.cfg" "$scriptdir/platforms.cfg"; do [[ ! -f "$conf" ]] && continue iniConfig "=" '"' "$conf" iniGet "$key" [[ -n "$ini_value" ]] && break done # workaround for RetroPie platform [[ "$key" == "retropie_fullname" ]] && ini_value="RetroPie" echo "$ini_value" } ## @fn addSystem() ## @param system system to add ## @brief adds an emulator entry / system ## @param fullname optional fullname for the frontend (if not present in platforms.cfg) ## @param exts optional extensions for the frontend (if not present in platforms.cfg) ## @details Adds a system to one of the frontend launchers function addSystem() { # backward compatibility for old addSystem functionality if [[ $# > 3 ]]; then addEmulator "$@" addSystem "$3" return fi local system="$1" local fullname="$2" local exts=($3) local platform="$system" local theme="$system" local cmd local path # check if we are removing the system if [[ "$md_mode" == "remove" ]]; then delSystem "$id" "$system" return fi # set system / platform / theme for configuration based on data in names field if [[ "$system" == "ports" ]]; then cmd="bash %ROM%" path="$romdir/ports" else cmd="$rootdir/supplementary/runcommand/runcommand.sh 0 _SYS_ $system %ROM%" path="$romdir/$system" fi exts+=("$(getPlatformConfig "${system}_exts")") local temp temp="$(getPlatformConfig "${system}_theme")" if [[ -n "$temp" ]]; then theme="$temp" else theme="$system" fi temp="$(getPlatformConfig "${system}_platform")" if [[ -n "$temp" ]]; then platform="$temp" else platform="$system" fi temp="$(getPlatformConfig "${system}_fullname")" [[ -n "$temp" ]] && fullname="$temp" exts="${exts[*]}" # add the extensions again as uppercase exts+=" ${exts^^}" setESSystem "$fullname" "$system" "$path" "$exts" "$cmd" "$platform" "$theme" } ## @fn delSystem() ## @param system system to delete ## @brief Deletes a system ## @details deletes a system from all frontends. function delSystem() { local system="$1" local fullname="$(getPlatformConfig "${system}_fullname")" local function for function in $(compgen -A function _del_system_); do "$function" "$fullname" "$system" done } ## @fn addPort() ## @param id id of the module / command ## @param port name of the port ## @param name display name for the launch script ## @param cmd commandline to launch ## @param game rom/game parameter (optional) ## @brief Adds a port to the emulationstation ports menu. ## @details Adds an emulators.cfg entry as with addSystem but also creates a launch script in `$datadir/ports/$name.sh`. ## ## Can also optionally take a game parameter which can be used to create multiple launch ## scripts for different games using the same engine - eg for quake ## ## addPort "lr-tyrquake" "quake" "Quake" "$emudir/retroarch/bin/retroarch -L $md_inst/tyrquake_libretro.so --config $md_conf_root/quake/retroarch.cfg %ROM%" "$romdir/ports/quake/id1/pak0.pak" ## addPort "lr-tyrquake" "quake" "Quake Mission Pack 2 (rogue)" "$emudir/retroarch/bin/retroarch -L $md_inst/tyrquake_libretro.so --config $md_conf_root/quake/retroarch.cfg %ROM%" "$romdir/ports/quake/id1/rogue/pak0.pak" ## ## Would add an entry in $configdir/ports/quake/emulators.cfg for lr-tyrquake (setting it to default if no default set) ## and create a launch script in $romdir/ports for each game. function addPort() { local id="$1" local port="$2" local file="$romdir/ports/$3.sh" local cmd="$4" local game="$5" # move configurations from old ports location if [[ -d "$configdir/$port" ]]; then mv "$configdir/$port" "$md_conf_root/" fi # remove the ports launch script if in remove mode if [[ "$md_mode" == "remove" ]]; then rm -f "$file" delEmulator "$id" "$port" # if there are no more port launch scripts we can remove ports from emulation station if [[ "$(find "$romdir/ports" -maxdepth 1 -name "*.sh" | wc -l)" -eq 0 ]]; then delSystem "$id" "ports" fi return fi mkUserDir "$romdir/ports" cat >"$file" << _EOF_ #!/bin/bash "$rootdir/supplementary/runcommand/runcommand.sh" 0 _PORT_ "$port" "$game" _EOF_ chown $user:$user "$file" chmod +x "$file" [[ -n "$cmd" ]] && addEmulator 1 "$id" "$port" "$cmd" addSystem "ports" } ## @fn addEmulator() ## @param default 1 to make the emulator / command default for the system if no default already set ## @param id unique id of the module / command ## @param name name of the system to add the emulator to ## @param cmd commandline to launch ## @brief Adds a new emulator for a system. ## @details This is the primary function for adding emulators to a system which can be ## switched between via the runcommand launch menu ## ## addEmulator 1 "vice-x64" "c64" "$md_inst/bin/x64 %ROM%" ## addEmulator 0 "vice-xvic" "c64" "$md_inst/bin/xvic %ROM%" ## ## Would add two optional emulators for the c64 - with vice-x64 being the default if no default ## was already set. This adds entries to `$configdir/$system/emulators.cfg` with ## ## id = "cmd" ## default = id ## ## Which are then selectable from runcommand when launching roms ## ## For libretro emulators, cmd needs to only contain the path to the libretro library. ## ## eg. for the lr-fcuemm module ## ## addEmulator 1 "$md_id" "nes" "$md_inst/fceumm_libretro.so" function addEmulator() { local default="$1" local id="$2" local system="$3" local cmd="$4" # check if we are removing the system if [[ "$md_mode" == "remove" ]]; then delEmulator "$id" "$system" return fi # automatically add parameters for libretro modules if [[ "$id" == lr-* && "$cmd" =~ ^"$md_inst"[^[:space:]]*\.so ]]; then cmd="$emudir/retroarch/bin/retroarch -L $cmd --config $md_conf_root/$system/retroarch.cfg %ROM%" fi # create a config folder for the system / port mkUserDir "$md_conf_root/$system" # add the emulator to the $conf_dir/emulators.cfg if a commandline exists (not used for some ports) if [[ -n "$cmd" ]]; then iniConfig " = " '"' "$md_conf_root/$system/emulators.cfg" iniSet "$id" "$cmd" # set a default unless there is one already set iniGet "default" if [[ -z "$ini_value" && "$default" -eq 1 ]]; then iniSet "default" "$id" fi chown $user:$user "$md_conf_root/$system/emulators.cfg" fi } ## @fn delEmulator() ## @param id id of emulator to delete ## @param system system to delete from ## @brief Deletes an emulator entry / system ## @details Delete the entry for the id from `$configdir/$system/emulators.cfg`. ## If there are no more emulators for the system present, it will also ## delete the system entry from the installed frontends. function delEmulator() { local id="$1" local system="$2" local config="$md_conf_root/$system/emulators.cfg" # remove from apps list for system if [[ -f "$config" && -n "$id" ]]; then # delete emulator entry iniConfig " = " '"' "$config" iniDel "$id" # if it is the default - remove it - runcommand will prompt to select a new default iniGet "default" [[ "$ini_value" == "$id" ]] && iniDel "default" # if we no longer have any entries in the emulators.cfg file we can remove it grep -q "=" "$config" || rm -f "$config" fi # if we don't have an emulators.cfg we can remove the system from the frontends if [[ ! -f "$md_conf_root/$system/emulators.cfg" ]]; then local function for function in $(compgen -A function _del_system_); do "$function" "$fullname" "$system" done fi } ## @fn patchVendorGraphics() ## @param filename file to patch ## @details replace declared dependencies of old vendor graphics libraries with new names ## Temporary compatibility workaround for legacy software to work on new Raspberry Pi firmwares. function patchVendorGraphics() { local filename="$1" # patchelf is not available on Raspbian Jessie compareVersions "$__os_debian_ver" lt 9 && return getDepends patchelf printMsgs "console" "Applying vendor graphics patch: $filename" patchelf --replace-needed libEGL.so libbrcmEGL.so \ --replace-needed libGLES_CM.so libbrcmGLESv2.so \ --replace-needed libGLESv1_CM.so libbrcmGLESv2.so \ --replace-needed libGLESv2.so libbrcmGLESv2.so \ --replace-needed libOpenVG.so libbrcmOpenVG.so \ --replace-needed libWFC.so libbrcmWFC.so "$filename" } ## @fn dkmsManager() ## @param mode dkms operation type ## @module_name name of dkms module ## @module_ver version of dkms module ## Helper function to manage DKMS modules installed by RetroPie function dkmsManager() { local mode="$1" local module_name="$2" local module_ver="$3" local kernel="$(uname -r)" local ver case "$mode" in install) if dkms status | grep -q "^$module_name"; then dkmsManager remove "$module_name" "$module_ver" fi if [[ "$__chroot" -eq 1 ]]; then kernel="$(ls -1 /lib/modules | tail -n -1)" fi ln -sf "$md_inst" "/usr/src/${module_name}-${module_ver}" dkms install --force -m "$module_name" -v "$module_ver" -k "$kernel" if dkms status | grep -q "^$module_name"; then md_ret_error+=("Failed to install $md_id") return 1 fi ;; remove) for ver in $(dkms status "$module_name" | cut -d"," -f2 | cut -d":" -f1); do dkms remove -m "$module_name" -v "$ver" --all rm -f "/usr/src/${module_name}-${ver}" done dkmsManager unload "$module_name" "$module_ver" ;; reload) dkmsManager unload "$module_name" "$module_ver" modprobe "$module_name" ;; unload) if [[ -n "$(lsmod | grep ${module_name/-/_})" ]]; then rmmod "$module_name" fi ;; esac } ================================================ FILE: packages/sx05re/emuelec/bin/scripts/scriptmodules/inifuncs.sh ================================================ #!/bin/bash # This file is part of The RetroPie Project # # The RetroPie Project is the legal property of its developers, whose names are # too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source. # # See the LICENSE.md file at the top-level directory of this distribution and # at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md # ## @file inifuncs.sh ## @brief RetroPie inifuncs library ## @copyright GPLv3 # @fn fatalError() # @param message string or array of messages to display # @brief echos message, and exits immediately. function fatalError() { echo -e "$1" exit 1 } # arg 1: delimiter, arg 2: quote, arg 3: file ## @fn iniConfig() ## @param delim ini file delimiter eg. ' = ' ## @param quote ini file quoting character eg. '"' ## @param config ini file to edit ## @brief Configure an ini file for getting/setting values with `iniGet` and `iniSet` function iniConfig() { __ini_cfg_delim="$1" __ini_cfg_quote="$2" __ini_cfg_file="$3" } # arg 1: command, arg 2: key, arg 2: value, arg 3: file (optional - uses file from iniConfig if not used) # @fn iniProcess() # @param command `set`, `unset` or `del` # @param key ini key to operate on # @param value to set # @param file optional file to use another file than the one configured with iniConfig # @brief The main function for setting and deleting from ini files - usually # not called directly but via iniSet iniUnset and iniDel function iniProcess() { local cmd="$1" local key="$2" local value="$3" local file="$4" [[ -z "$file" ]] && file="$__ini_cfg_file" local delim="$__ini_cfg_delim" local quote="$__ini_cfg_quote" [[ -z "$file" ]] && fatalError "No file provided for ini/config change" [[ -z "$key" ]] && fatalError "No key provided for ini/config change on $file" # we strip the delimiter of spaces, so we can "fussy" match existing entries that have the wrong spacing local delim_strip=${delim// /} # if the stripped delimiter is empty - such as in the case of a space, just use the delimiter instead [[ -z "$delim_strip" ]] && delim_strip="$delim" local match_re="^[[:space:]#]*$key[[:space:]]*$delim_strip.*$" local match if [[ -f "$file" ]]; then match=$(grep -E -i "$match_re" "$file" | tail -1) else touch "$file" fi if [[ "$cmd" == "del" ]]; then [[ -n "$match" ]] && sed -i "\|$(sedQuote "$match")|d" "$file" return 0 fi [[ "$cmd" == "unset" ]] && key="# $key" local replace="$key$delim$quote$value$quote" if [[ -z "$match" ]]; then # make sure there is a newline then add the key-value pair sed -i '$a\' "$file" echo "$replace" >> "$file" else # replace existing key-value pair sed -i "s|$(sedQuote "$match")|$(sedQuote "$replace")|g" "$file" fi [[ "$file" =~ retroarch\.cfg$ ]] && retroarchIncludeToEnd "$file" return 0 } ## @fn iniUnset() ## @param key ini key to operate on ## @param value to Unset (key will be commented out, but the value can be changed also) ## @param file optional file to use another file than the one configured with iniConfig ## @brief Unset (comment out) a key / value pair in an ini file. ## @details The key does not have to exist - if it doesn't exist a new line will ## be added - eg. `# key = "value"` ## ## This function is useful for creating example configuration entries for users ## to manually enable later or if a configuration is to be disabled but left ## as an example. function iniUnset() { iniProcess "unset" "$1" "$2" "$3" } ## @fn iniSet() ## @param key ini key to operate on ## @param value to set ## @param file optional file to use another file than the one configured with iniConfig ## @brief Set a key / value pair in an ini file. ## @details If the key already exists the existing line will be changed. If not ## a new line will be created. function iniSet() { iniProcess "set" "$1" "$2" "$3" } ## @fn iniDel() ## @param key ini key to operate on ## @param file optional file to use another file than the one configured with iniConfig ## @brief Delete a key / value pair in an ini file. function iniDel() { iniProcess "del" "$1" "" "$2" } ## @fn iniGet() ## @param key ini key to get the value of ## @param file optional file to use another file than the one configured with iniConfig ## @brief Get the value of a key from an ini file. ## @details The value of the key will end up in the global ini_value variable. function iniGet() { local key="$1" local file="$2" [[ -z "$file" ]] && file="$__ini_cfg_file" if [[ ! -f "$file" ]]; then ini_value="" return 1 fi local delim="$__ini_cfg_delim" local quote="$__ini_cfg_quote" # we strip the delimiter of spaces, so we can "fussy" match existing entries that have the wrong spacing local delim_strip=${delim// /} # if the stripped delimiter is empty - such as in the case of a space, just use the delimiter instead [[ -z "$delim_strip" ]] && delim_strip="$delim" # create a regexp to match the value based on whether we are looking for quotes or not local value_m if [[ -n "$quote" ]]; then value_m="$quote*\([^$quote|\r]*\)$quote*" else value_m="\([^\r]*\)" fi ini_value="$(sed -n "s/^[ |\t]*$key[ |\t]*$delim_strip[ |\t]*$value_m.*/\1/p" "$file" | tail -1)" } # @fn retroarchIncludeToEnd() # @param file config file to process # @brief Makes sure a `retroarch.cfg` file has the `#include` line at the end. # @details Used in runcommand.sh and iniProcess to ensure the #include for the # main retroarch.cfg is always at the end of a system `retroarch.cfg`. This # is because when processing its config RetroArch will take the first value it # finds, so any overrides need to be above the `#include` line where the global # retroarch.cfg is included. function retroarchIncludeToEnd() { local config="$1" [[ ! -f "$config" ]] && return local re="^#include.*retroarch\.cfg" # extract the include line (unless it is the last line in the file) # (remove blank lines, the last line and search for an include line in remaining lines) local include=$(sed '/^$/d;$d' "$config" | grep "$re") # if matched remove it and re-add it at the end if [[ -n "$include" ]]; then sed -i "/$re/d" "$config" # add newline if missing and the #include line sed -i '$a\' "$config" echo "$include" >>"$config" fi } # arg 1: key, arg 2: default value (optional - is 1 if not used) function addAutoConf() { local key="$1" local default="$2" local file="$configdir/all/autoconf.cfg" if [[ -z "$default" ]]; then default="1" fi iniConfig " = " '"' "$file" iniGet "$key" ini_value="${ini_value// /}" if [[ -z "$ini_value" ]]; then iniSet "$key" "$default" fi } # arg 1: key, arg 2: value function setAutoConf() { local key="$1" local value="$2" local file="$configdir/all/autoconf.cfg" iniConfig " = " '"' "$file" iniSet "$key" "$value" } # arg 1: key function getAutoConf(){ local key="$1" iniConfig " = " '"' "$configdir/all/autoconf.cfg" iniGet "$key" [[ "$ini_value" == "1" ]] && return 0 return 1 } # escape backslashes and pipes for sed function sedQuote() { local string="$1" string="${string//\\/\\\\}" string="${string//|/\\|}" echo "$string" } ================================================ FILE: packages/sx05re/emuelec/bin/scripts/scriptmodules/packages.sh ================================================ #!/usr/bin/env bash # This file is part of The RetroPie Project # # The RetroPie Project is the legal property of its developers, whose names are # too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source. # # See the LICENSE.md file at the top-level directory of this distribution and # at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md # declare -A __mod_id_to_idx __mod_idx=() __mod_id=() __mod_type=() __mod_desc=() __mod_help=() __mod_licence=() __mod_section=() __mod_flags=() declare -A __sections __sections[core]="core" __sections[main]="main" __sections[opt]="optional" __sections[exp]="experimental" __sections[driver]="driver" __sections[config]="configuration" function rp_listFunctions() { local idx local mod_id local desc local mode local func echo -e "Index/ID: Description: List of available actions" echo "-----------------------------------------------------------------------------------------------------------------------------------" for idx in ${__mod_idx[@]}; do mod_id=${__mod_id[$idx]}; printf "%d/%-20s: %-42s :" "$idx" "$mod_id" "${__mod_desc[$idx]}" while read mode; do # skip private module functions (start with an underscore) [[ "$mode" = _* ]] && continue mode=${mode//_$mod_id/} echo -n " $mode" done < <(compgen -A function -X \!*_$mod_id) fnExists "install_${mod_id}" || fnExists "install_bin_${mod_id}" && ! fnExists "remove_${mod_id}" && echo -n " remove" echo -n " help" echo "" done echo "===================================================================================================================================" } function rp_printUsageinfo() { echo -e "Usage:\n$0 \nThis will run the actions depends, sources, build, install, configure and clean automatically.\n" echo -e "Alternatively, $0 can be called as\n$0 /dev/null pushed=$? ;; install|install_bin) action="Installing" # remove any previous install folder before installing if ! hasFlag "${__mod_flags[$md_idx]}" "noinstclean"; then rmDirExists "$md_inst" fi mkdir -p "$md_inst" pushd "$md_build" 2>/dev/null pushed=$? ;; configure) action="Configuring" pushd "$md_inst" 2>/dev/null pushed=$? ;; remove) action="Removing" ;; _update_hook) ;; *) action="Running action '$mode' for" ;; esac # print an action and a description if [[ -n "$action" ]]; then printHeading "$action '$md_id' : $md_desc" fi case "$mode" in remove) fnExists "$function" && "$function" "$@" md_mode="remove" if fnExists "configure_${md_id}"; then pushd "$md_inst" 2>/dev/null pushed=$? "configure_${md_id}" fi rm -rf "$md_inst" printMsgs "console" "Removed directory $md_inst" ;; install) if fnExists "$function"; then "$function" "$@" elif fnExists "install_bin_${md_id}"; then "install_bin_${md_id}" "$@" fi ;; install_bin) if fnExists "install_bin_${md_id}"; then if ! "$function" "$@"; then md_ret_errors+=("Unable to install binary for $md_id") fi else if rp_hasBinary "$md_idx"; then rp_installBin else md_ret_errors+=("Could not find a binary for $md_id") fi fi ;; *) # call the function with parameters fnExists "$function" && "$function" "$@" ;; esac # check if any required files are found if [[ -n "$md_ret_require" ]]; then for file in "${md_ret_require[@]}"; do if [[ ! -e "$file" ]]; then md_ret_errors+=("Could not successfully $mode $md_id - $md_desc ($file not found).") break fi done fi if [[ "${#md_ret_errors}" -eq 0 && -n "$md_ret_files" ]]; then # check for existence and copy any files/directories returned local file for file in "${md_ret_files[@]}"; do if [[ ! -e "$md_build/$file" ]]; then md_ret_errors+=("Could not successfully install $md_desc ($md_build/$file not found).") break fi cp -Rvf "$md_build/$file" "$md_inst" done fi # remove build folder if empty [[ -d "$md_build" ]] && find "$md_build" -maxdepth 0 -empty -exec rmdir {} \; [[ "$pushed" -eq 0 ]] && popd # some errors were returned. if [[ "${#md_ret_errors[@]}" -gt 0 ]]; then __ERRMSGS+=("${md_ret_errors[@]}") printMsgs "console" "${md_ret_errors[@]}" >&2 # if sources fails make sure we clean up if [[ "$mode" == "sources" ]]; then rp_callModule "$md_idx" clean fi # remove install folder if there is an error (and it is empty) [[ -d "$md_inst" ]] && find "$md_inst" -maxdepth 0 -empty -exec rmdir {} \; return 1 fi # some information messages were returned if [[ "${#md_ret_info[@]}" -gt 0 ]]; then __INFMSGS+=("${md_ret_info[@]}") fi return 0 } function rp_hasBinaries() { [[ "$__has_binaries" -eq 1 ]] && return 0 return 1 } function rp_hasBinary() { local idx="$1" local id="${__mod_id[$idx]}" fnExists "install_bin_${__mod_id[$idx]}" && return 0 # binary blacklist for armv7 Debian/OSMC due to GCC ABI incompatibility with # threaded C++ apps on Raspbian (armv6 userland) if [[ "$__os_id" != "Raspbian" ]] && ! isPlatform "armv6"; then case "$id" in emulationstation|zdoom|lr-dinothawr|lr-ppsspp|ppsspp) return 1 ;; esac fi if rp_hasBinaries; then wget --spider -q "$__binary_url/${__mod_type[$idx]}/${__mod_id[$idx]}.tar.gz" return $? fi return 1 } function rp_installBin() { rp_hasBinaries || fatalError "There are no binary archives for platform $__platform" local archive="$md_type/$md_id.tar.gz"; local dest="$rootdir/$md_type" mkdir -p "$dest" wget -O- -q "$__binary_url/$archive" | tar -xvz -C "$dest" } function rp_createBin() { printHeading "Creating binary archive for $md_desc" if [[ ! -d "$rootdir/$md_type/$md_id" ]]; then printMsgs "console" "No install directory $rootdir/$md_type/$md_id - no archive created" return 1 fi if dirIsEmpty "$rootdir/$md_type/$md_id"; then printMsgs "console" "Empty install directory $rootdir/$md_type/$md_id - no archive created" return 1 fi local archive="$md_id.tar.gz" local dest="$__tmpdir/archives/$__os_codename/$__platform/$md_type" rm -f "$dest/$archive" mkdir -p "$dest" tar cvzf "$dest/$archive" -C "$rootdir/$md_type" "$md_id" chown $user:$user "$dest/$archive" } function rp_installModule() { local idx="$1" local mode if rp_hasBinary "$idx"; then for mode in depends install_bin configure; do rp_callModule "$idx" "$mode" || return 1 done else rp_callModule "$idx" clean rp_callModule "$idx" || return 1 fi return 0 } function rp_registerModule() { local module_idx="$1" local module_path="$2" local module_type="$3" local rp_module_id="" local rp_module_desc="" local rp_module_help="" local rp_module_licence="" local rp_module_section="" local rp_module_flags="" local var local error=0 source "$module_path" for var in rp_module_id rp_module_desc; do if [[ -z "${!var}" ]]; then echo "Module $module_path is missing valid $var" error=1 fi done [[ $error -eq 1 ]] && exit 1 local flags=($rp_module_flags) local flag local valid=1 for flag in "${flags[@]}"; do if [[ "$flag" =~ ^\!(.+) ]] && isPlatform "${BASH_REMATCH[1]}"; then valid=0 break fi done if [[ "$valid" -eq 1 ]]; then __mod_idx+=("$module_idx") __mod_id["$module_idx"]="$rp_module_id" __mod_type["$module_idx"]="$module_type" __mod_desc["$module_idx"]="$rp_module_desc" __mod_help["$module_idx"]="$rp_module_help" __mod_licence["$module_idx"]="$rp_module_licence" __mod_section["$module_idx"]="$rp_module_section" __mod_flags["$module_idx"]="$rp_module_flags" # id to idx mapping via associative array __mod_id_to_idx["$rp_module_id"]="$module_idx" fi } function rp_registerModuleDir() { local module_idx="$1" local module_dir="$2" for module in $(find "$scriptdir/scriptmodules/$2" -maxdepth 1 -name "*.sh" | sort); do rp_registerModule $module_idx "$module" "$module_dir" ((module_idx++)) done } function rp_registerAllModules() { # rp_registerModuleDir 100 "emulators" # rp_registerModuleDir 200 "libretrocores" rp_registerModuleDir 300 "ports" rp_registerModuleDir 800 "supplementary" # rp_registerModuleDir 900 "admin" } function rp_getIdxFromId() { echo "${__mod_id_to_idx[$1]}" } function rp_getIdFromIdx() { echo "${__mod_id[$1]}" } function rp_getSectionIds() { local section local id local ids=() for id in "${__mod_idx[@]}"; do for section in "$@"; do [[ "${__mod_section[$id]}" == "$section" ]] && ids+=("$id") done done echo "${ids[@]}" } function rp_isInstalled() { local md_idx="$1" local md_inst="$rootdir/${__mod_type[$md_idx]}/${__mod_id[$md_idx]}" [[ -d "$md_inst" ]] && return 0 return 1 } function rp_updateHooks() { local function local mod_idx for function in $(compgen -A function _update_hook_); do mod_idx="$(rp_getIdxFromId "${function/_update_hook_/}")" [[ -n "$mod_idx" ]] && rp_callModule "$mod_idx" _update_hook done } ================================================ FILE: packages/sx05re/emuelec/bin/scripts/scriptmodules/supplementary/bluetoothcontroller.py ================================================ #!/usr/bin/env python # - "curses" menu based on https://stackoverflow.com/a/14205494 import curses,sys,time from bluetool import Bluetooth from curses import panel class Menu(object): def __init__(self, items, stdscreen): self.window = stdscreen.subwin(0, 0) self.window.keypad(1) self.panel = panel.new_panel(self.window) self.panel.hide() panel.update_panels() self.position = 0 self.items = items self.items.append(("Back / Exit", "exit")) def navigate(self, n): self.position += n if self.position < 0: self.position = 0 elif self.position >= len(self.items): self.position = len(self.items) - 1 def display(self): self.panel.top() self.panel.show() self.window.clear() while True: self.window.refresh() curses.doupdate() for index, item in enumerate(self.items): if index == self.position: mode = curses.A_REVERSE else: mode = curses.A_NORMAL msg = "%d. %s" % (index, item[0]) self.window.addstr(1 + index, 1, msg, mode) key = self.window.getch() if key in [curses.KEY_ENTER, ord("\n")]: if self.position == len(self.items) - 1: break else: self.items[self.position][1]() elif key == curses.KEY_UP: self.navigate(-1) elif key == curses.KEY_DOWN: self.navigate(1) self.window.clear() self.panel.hide() panel.update_panels() curses.doupdate() class MyApp(object): def __init__(self, stdscreen): self.scan_timeout = 90 self.bt = Bluetooth() self.bt.start_scanning(self.scan_timeout) self.screen = stdscreen curses.curs_set(0) mainMenu = [ ('Rescan devices\t\t(scans for {} seconds in background, system bus will be processed every 10 seconds)'.format(self.scan_timeout), self.rescan_devices), ('Trust controller\t\t(shows only untrusted pairable controllers)', self.trust_controller_menu), ('Pair controller\t\t(shows only unpaired pairable controllers)', self.pair_controller_menu), ('Connect controller\t\t(shows only paired and trusted connectable controllers)', self.connect_device_menu), ('Disconnect controller\t(shows only connected controllers)', self.disconnect_device_menu), ('Remove controller\t\t(shows only trusted, paired OR connected controllers)', self.remove_device_menu), ] self.make_menu(mainMenu) self.menu.display() def make_menu(self, menulist): self.menu = Menu(menulist, self.screen) def trust_controller_menu(self): properties = [ 'Icon', 'RSSI', 'Trusted', ] menu = [] for device in self.bt.get_available_devices(): mac_address = device['mac_address'].decode('utf-8') for property in properties: device[property] = self.bt.get_device_property(mac_address,property) if ((device['Icon'] == 'input-gaming') and (device['Trusted'] == 0)): menu.append(('{}\t{}\tRSSI: {}'.format(device['mac_address'].decode('utf-8'),device['name'].decode('utf-8'),device['RSSI']),self.trust_controller)) self.make_menu(menu) self.menu.display() def trust_controller(self): mac = self.get_selected_device()[0] self.bt.trust(mac) if self.bt.get_device_property(mac,'Trusted') == 1: self.menu.items[self.menu.position] = ('MAC {} ({}) trusted!\n'.format(mac,self.get_selected_device()[1]),self.navigate_to_back) else: self.menu.items[self.menu.position] = ('Error trusting MAC {} ({})!\n'.format(mac,self.get_selected_device()[1]),self.navigate_to_back) def pair_controller_menu(self): properties = [ 'Icon', 'Paired', 'RSSI', 'Trusted', ] menu = [] for device in self.bt.get_devices_to_pair(): mac_address = device['mac_address'].decode('utf-8') for property in properties: device[property] = self.bt.get_device_property(mac_address,property) if ((device['Icon'] == 'input-gaming') and (device['Trusted'] == 1) and device['Paired'] == 0): menu.append(('{}\t{}\tRSSI: {}'.format(device['mac_address'].decode('utf-8'),device['name'].decode('utf-8'),device['RSSI']),self.pair_controller)) self.make_menu(menu) self.menu.display() def pair_controller(self): mac = self.get_selected_device()[0] self.bt.pair(mac) if self.bt.get_device_property(mac,'Paired') == 1: self.menu.items[self.menu.position] = ('MAC {} ({}) paired!\n'.format(mac,self.get_selected_device()[1]),self.navigate_to_back) else: self.menu.items[self.menu.position] = ('Error paring MAC {} ({})!\n'.format(mac,self.get_selected_device()[1]),self.navigate_to_back) def connect_device_menu(self): properties = [ 'Icon', 'RSSI', 'Connected', 'Paired', 'Trusted', ] menu = [] for device in self.bt.get_available_devices(): mac_address = device['mac_address'].decode('utf-8') for property in properties: device[property] = self.bt.get_device_property(mac_address,property) if ((device['Icon'] == 'input-gaming') and (device['Paired'] == 1) and (device['Trusted'] == 1) and (device['Connected'] == 0)): menu.append(('{}\t{}\tRSSI: {}'.format(device['mac_address'].decode('utf-8'),device['name'].decode('utf-8'),device['RSSI']),self.connect_device)) self.make_menu(menu) self.menu.display() def connect_device(self): mac = self.get_selected_device()[0] self.bt.connect(mac) if self.bt.get_device_property(mac,'Connected') == 1: self.menu.items[self.menu.position] = ('MAC {} ({}) connected!\n'.format(mac,self.get_selected_device()[1]),self.navigate_to_back) else: self.menu.items[self.menu.position] = ('Error connecting MAC {} ({})!\n'.format(mac,self.get_selected_device()[1]),self.navigate_to_back) def disconnect_device_menu(self): properties = [ 'Icon', 'Connected', 'RSSI', ] menu = [] for device in self.bt.get_connected_devices(): mac_address = device['mac_address'].decode('utf-8') for property in properties: device[property] = self.bt.get_device_property(mac_address,property) if ((device['Icon'] == 'input-gaming') and (device['Connected'] == 1)): menu.append(('{}\t{}\tRSSI: {}'.format(device['mac_address'].decode('utf-8'),device['name'].decode('utf-8'),device['RSSI']),self.disconnect_device)) self.make_menu(menu) self.menu.display() def disconnect_device(self): mac = self.get_selected_device()[0] self.bt.disconnect(mac) if self.bt.get_device_property(mac,'Connected') == 0: self.menu.items[self.menu.position] = ('MAC {} ({}) disconnected!\n'.format(mac,self.get_selected_device()[1]),self.navigate_to_back) else: self.menu.items[self.menu.position] = ('Error disconnecting MAC {} ({})!\n'.format(mac,self.get_selected_device()[1]),self.navigate_to_back) def remove_device_menu(self): properties = [ 'Icon', 'Paired', 'Trusted', 'RSSI', 'Blocked', 'Connected', ] menu = [] for device in self.bt.get_available_devices(): mac_address = device['mac_address'].decode('utf-8') for property in properties: device[property] = self.bt.get_device_property(mac_address,property) if ((device['Icon'] == 'input-gaming') and ((device['Paired'] == 1) or (device['Trusted'] == 1) or (device['Blocked'] == 1))): menu.append(('{}\t{}\tRSSI: {}\tTrusted: {}\tPaired: {}\tConnected: {}\tBlocked: {}'.format(device['mac_address'].decode('utf-8'),device['name'].decode('utf-8'),device['RSSI'],device['Trusted'],device['Paired'],device['Connected'],device['Blocked']),self.remove_device)) self.make_menu(menu) self.menu.display() def remove_device(self): mac = self.get_selected_device()[0] self.bt.remove(mac) self.menu.items[self.menu.position] = ('MAC {} ({}) removed!\n'.format(mac,self.get_selected_device()[1]),self.navigate_to_back) def rescan_devices(self): self.menu.window.addstr(9, 1, 'Scanning for device for {} seconds in background now, please refresh views...'.format(self.scan_timeout), curses.A_NORMAL) self.bt.start_scanning(self.scan_timeout) def get_selected_device(self): return(self.menu.items[self.menu.position][0].split('\t')) def navigate_to_back(self): self.menu.navigate(len(self.menu.items) -1) if __name__ == "__main__": if (len(sys.argv) == 1): bt = Bluetooth() print('Scanning for available devices for 90 seconds, please wait...') bt.start_scanning(90) time.sleep(15) print('Getting pairable devices, please wait...') devices = bt.get_devices_to_pair() print(devices) for device in devices: mac = device['mac_address'].decode('utf-8') name = device['name'].decode('utf-8') print('Found MAC: {}\tName: {}'.format(mac,name)) if bt.get_device_property(mac,'Icon') == 'input-gaming': print('Found controller {} Name: {}, trusting...'.format(mac,name)) bt.trust(mac) if bt.get_device_property(mac,'Trusted') == 1: print('Trusted {}, quick pause, then pairing...'.format(name)) time.sleep(5) bt.pair(mac) if bt.get_device_property(mac,'Paired') == 1: print('Paired {}, quick pause, then connecting...'.format(name)) time.sleep(5) bt.connect(mac) if bt.get_device_property(mac,'Connected') == 1: print('Connected {}, exiting...'.format(name)) else: curses.wrapper(MyApp) ================================================ FILE: packages/sx05re/emuelec/bin/scripts/scriptmodules/supplementary/esthemes.sh ================================================ #!/usr/bin/env bash # This file is part of The RetroPie Project # # The RetroPie Project is the legal property of its developers, whose names are # too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source. # # See the LICENSE.md file at the top-level directory of this distribution and # at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md # rp_module_id="esthemes" rp_module_desc="Install themes for Emulation Station" rp_module_section="config" function install_theme_esthemes() { local theme="$1" local repo="$2" if [[ -z "$repo" ]]; then repo="RetroPie" fi if [[ -z "$theme" ]]; then theme="carbon" repo="RetroPie" fi if [ -d "/storage/.emulationstation/themes/$theme" ]; then rm -rf "/storage/.emulationstation/themes/$theme" else mkdir -p /storage/.emulationstation/themes/$theme fi #gitPullOrClone "/storage/.emulationstation/themes/$theme" "https://github.com/$repo/es-theme-$theme.git" wget https://github.com/$repo/es-theme-$theme/archive/master.zip -O /tmp/$theme.zip zip=/tmp/$theme.zip dest=/storage/.emulationstation/themes/$theme unzip -d "$dest" -o "$zip" && f=("$dest"/*) && cp -rf "$dest"/*/* "$dest" && rm -rf "${f[@]}" rm /tmp/$theme.zip } function uninstall_theme_esthemes() { local theme="$1" if [[ -d "/storage/.emulationstation/themes/$theme" ]]; then rm -rf "/storage/.emulationstation/themes/$theme" fi } function gui_esthemes() { local themes=( 'RetroPie carbon' 'RetroPie carbon-centered' 'RetroPie carbon-nometa' 'RetroPie simple' 'RetroPie simple-dark' 'RetroPie clean-look' 'RetroPie color-pi' 'RetroPie nbba' 'RetroPie simplified-static-canela' 'RetroPie turtle-pi' 'RetroPie zoid' 'ehettervik pixel' 'ehettervik pixel-metadata' 'ehettervik pixel-tft' 'ehettervik luminous' 'ehettervik minilumi' 'ehettervik workbench' 'AmadhiX eudora' 'AmadhiX eudora-bigshot' 'AmadhiX eudora-concise' 'InsecureSpike retroplay-clean-canela' 'InsecureSpike retroplay-clean-detail-canela' 'Omnija simpler-turtlepi' 'Omnija simpler-turtlemini' 'Omnija metro' 'lilbud material' 'mattrixk io' 'mattrixk metapixel' 'mattrixk spare' 'robertybob space' 'robertybob simplebigart' 'robertybob tv' 'HerbFargus tronkyfran' 'lilbud flat' 'lilbud flat-dark' 'lilbud minimal' 'lilbud switch' 'FlyingTomahawk futura-V' 'FlyingTomahawk futura-dark-V' 'G-rila fundamental' 'ruckage nes-mini' 'ruckage famicom-mini' 'ruckage snes-mini' 'anthonycaccese crt' 'anthonycaccese crt-centered' 'anthonycaccese art-book' 'anthonycaccese art-book-4-3' 'anthonycaccese art-book-pocket' 'anthonycaccese art-book-micro' 'anthonycaccese tft' 'anthonycaccese picade' 'TMNTturtleguy ComicBook' 'TMNTturtleguy ComicBook_4-3' 'TMNTturtleguy ComicBook_SE-Wheelart' 'TMNTturtleguy ComicBook_4-3_SE-Wheelart' 'ChoccyHobNob cygnus' 'dmmarti steampunk' 'dmmarti hurstyblue' 'dmmarti maximuspie' 'dmmarti showcase' 'dmmarti kidz' 'dmmarti unified' 'rxbrad freeplay' 'rxbrad gbz35' 'rxbrad gbz35-dark' 'garaine marioblue' 'garaine bigwood' 'MrTomixf Royal_Primicia' 'lostless playstation' 'mrharias superdisplay' 'coinjunkie synthwave' 'RetroHursty69 magazinemadness' 'RetroHursty69 stirling' 'RetroHursty69 boxalloyred' 'RetroHursty69 boxalloyblue' 'RetroHursty69 greenilicious' 'RetroHursty69 retroroid' 'RetroHursty69 merryxmas' 'RetroHursty69 cardcrazy' 'RetroHursty69 license2game' 'RetroHursty69 comiccrazy' 'RetroHursty69 snazzy' 'RetroHursty69 tributeGoT' 'RetroHursty69 tributeSTrek' 'RetroHursty69 tributeSWars' 'RetroHursty69 crisp' 'RetroHursty69 crisp_light' 'RetroHursty69 primo' 'RetroHursty69 primo_light' 'RetroHursty69 back2basics' 'RetroHursty69 retrogamenews' 'RetroHursty69 bluray' 'RetroHursty69 soda' 'RetroHursty69 lightswitch' 'RetroHursty69 darkswitch' 'RetroHursty69 whiteslide' 'RetroHursty69 graffiti' 'RetroHursty69 whitewood' 'RetroHursty69 sublime' 'RetroHursty69 infinity' 'RetroHursty69 neogeo_only' 'RetroHursty69 boxcity' 'RetroHursty69 vertical_arcade' 'RetroHursty69 cabsnazzy' 'RetroHursty69 garfieldism' 'RetroHursty69 halloweenspecial' 'RetroHursty69 heychromey' 'RetroHursty69 homerism' 'RetroHursty69 spaceinvaders' 'RetroHursty69 disenchantment' 'RetroHursty69 minions' 'RetroHursty69 tmnt' 'RetroHursty69 pacman' 'RetroHursty69 dragonballz' 'RetroHursty69 minecraft' 'RetroHursty69 incredibles' 'RetroHursty69 mario_melee' 'RetroHursty69 evilresident' 'RetroHursty69 hurstyspin' 'RetroHursty69 cyber' 'RetroHursty69 supersweet' 'RetroHursty69 donkeykonkey' 'RetroHursty69 snapback' 'RetroHursty69 heman' 'RetroHursty69 pitube' 'RetroHursty69 batmanburton' 'RetroHursty69 NegativeColor' 'RetroHursty69 NegativeSepia' 'RetroHursty69 corg' 'RetroHursty69 mysticorb' 'RetroHursty69 joysticks' 'RetroHursty69 orbpilot' 'RetroHursty69 bitfit' 'RetroHursty69 circuit' 'RetroHursty69 retroboy' 'RetroHursty69 retroboy2' 'RetroHursty69 hurstybluetake2' 'RetroHursty69 fabuloso' 'RetroHursty69 arcade1up_aspectratio54' 'RetroHursty69 supersweet_aspectratio54' 'RetroHursty69 heychromey_aspectratio54' 'RetroHursty69 mariobrosiii' 'RetroHursty69 vertical_limit_verticaltheme' 'Saracade scv720' 'chicueloarcade Chicuelo' 'SuperMagicom nostalgic' 'lipebello retrorama' 'lipebello strangerstuff' 'lipebello spaceoddity' 'lipebello swineapple' 'waweedman pii-wii' 'waweedman Blade-360' 'waweedman Venom' 'waweedman Spider-Man' 'blowfinger77 locomotion' ) while true; do local theme local installed_themes=() local repo local options=() local status=() local default options+=(U "Update all installed themes") local i=1 for theme in "${themes[@]}"; do theme=($theme) repo="${theme[0]}" theme="${theme[1]}" if [[ -d "/storage/.emulationstation/themes/$theme" ]]; then status+=("i") options+=("$i" "Update or Uninstall $repo/$theme (installed)") installed_themes+=("$theme $repo") else status+=("n") options+=("$i" "Install $repo/$theme") fi ((i++)) done local cmd=(dialog --ascii-lines --default-item "$default" --backtitle "$__backtitle" --menu "Choose an option" 22 76 16) local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) default="$choice" [[ -z "$choice" ]] && break case "$choice" in U) for theme in "${installed_themes[@]}"; do theme=($theme) rp_callModule esthemes install_theme "${theme[0]}" "${theme[1]}" done ;; *) theme=(${themes[choice-1]}) repo="${theme[0]}" theme="${theme[1]}" if [[ -d "/storage/.emulationstation/themes/$theme" ]]; then options=(1 "Update $repo/$theme" 2 "Uninstall $repo/$theme") cmd=(dialog --ascii-lines --backtitle "$__backtitle" --menu "Choose an option for theme" 12 40 06) local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) case "$choice" in 1) rp_callModule esthemes install_theme "$theme" "$repo" ;; 2) rp_callModule esthemes uninstall_theme "$theme" ;; esac else rp_callModule esthemes install_theme "$theme" "$repo" fi ;; esac done } ================================================ FILE: packages/sx05re/emuelec/bin/scripts/scriptmodules/supplementary/reicast.sh ================================================ #!/usr/bin/env bash # This file is part of The RetroPie Project # # The RetroPie Project is the legal property of its developers, whose names are # too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source. # # See the LICENSE.md file at the top-level directory of this distribution and # at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md # rp_module_id="reicast" rp_module_desc="Dreamcast emulator Reicast" rp_module_help="ROM Extensions: .cdi .gdi\n\nCopy your Dreamcast roms to $romdir/dreamcast\n\nCopy the required BIOS files dc_boot.bin and dc_flash.bin to $biosdir/dc" rp_module_licence="GPL2 https://raw.githubusercontent.com/reicast/reicast-emulator/master/LICENSE" rp_module_section="opt" function input_reicast() { local temp_file="$(mktemp)" cd "/usr/bin" ./reicast-joyconfig.py -f "$temp_file" >/dev/tty iniConfig " = " "" "$temp_file" iniGet "mapping_name" local mapping_file="/storage/.config/reicast/mappings/controller_${ini_value// /}.cfg" mv "$temp_file" "$mapping_file" chown $user:$user "$mapping_file" } function gui_reicast() { while true; do local options=( 1 "Configure input devices for Reicast" ) local cmd=(dialog --ascii-lines --backtitle "$__backtitle" --menu "Choose an option" 22 76 16) local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) [[ -z "$choice" ]] && break case "$choice" in 1) clear input_reicast ;; esac done } ================================================ FILE: packages/sx05re/emuelec/bin/scripts/scriptmodules/supplementary/scraper.sh ================================================ #!/usr/bin/env bash # This file is part of The RetroPie Project # # The RetroPie Project is the legal property of its developers, whose names are # too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source. # # See the LICENSE.md file at the top-level directory of this distribution and # at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md # rp_module_id="scraper" rp_module_desc="Scraper for EmulationStation by Steven Selph" rp_module_licence="MIT https://raw.githubusercontent.com/sselph/scraper/master/LICENSE" rp_module_section="opt" rp_module_flags="nobin" function list_systems_scraper() { find -L "$romdir" -mindepth 1 -maxdepth 1 -type d | sort } function scrape_scraper() { local system="$1" [[ -z "$system" ]] && return iniConfig " = " '"' "$configdir/all/scraper.cfg" eval $(_load_config_scraper) local gamelist local img_dir local img_path if [[ "$use_rom_folder" -eq 1 ]]; then gamelist="$romdir/$system/gamelist.xml" img_dir="$romdir/$system/images" img_path="./images" else gamelist="$home/.emulationstation/gamelists/$system/gamelist.xml" img_dir="$home/.emulationstation/downloaded_images/$system" img_path="~/.emulationstation/downloaded_images/$system" fi local params=() params+=(-image_dir "$img_dir") params+=(-image_path "$img_path") params+=(-video_dir "$img_dir") params+=(-video_path "$img_path") params+=(-marquee_dir "$img_dir") params+=(-marquee_path "$img_path") params+=(-output_file "$gamelist") params+=(-rom_dir "$romdir/$system") params+=(-workers "4") params+=(-skip_check) [[ "$system" =~ ^mame-|arcade|fba|neogeo ]] && params+=(-mame) if [[ "$use_thumbs" -eq 1 ]]; then params+=(-thumb_only) fi if [[ "$screenshots" -eq 1 ]]; then if [[ "$system" =~ ^mame-|arcade|fba|neogeo ]]; then params+=(-mame_img "s,m,t") else params+=(-console_img "s,b,3b,l,f") fi fi if [[ "$download_videos" -eq 1 ]]; then params+=(-download_videos) fi if [[ "$download_marquees" -eq 1 ]]; then params+=(-download_marquees) fi if [[ -n "$max_width" ]]; then params+=(-max_width "$max_width") fi if [[ -n "$max_height" ]]; then params+=(-max_height "$max_height") fi if [[ "$console_src" -eq 0 ]]; then params+=(-console_src="ovgdb") elif [[ "$console_src" -eq 1 ]]; then params+=(-console_src="gdb") else params+=(-console_src="ss") fi if [[ "$mame_src" -eq 0 ]]; then params+=(-mame_src="mamedb") elif [[ "$mame_src" -eq 1 ]]; then params+=(-mame_src="ss") else params+=(-mame_src="adb") fi if [[ "$rom_name" -eq 1 ]]; then params+=(-use_nointro_name=false) elif [[ "$rom_name" -eq 2 ]]; then params+=(-use_filename=true) fi if [[ "$append_only" -eq 1 ]]; then params+=(-append) fi # trap ctrl+c and return if pressed (rather than exiting retropie-setup etc) trap 'trap 2; return 1' INT "/usr/bin/scraper" ${params[@]} trap 2 } function scrape_all_scraper() { local system while read system; do system=$(basename $system) scrape_scraper "$system" "$@" || return 1 done < <(list_systems_scraper) } function scrape_chosen_scraper() { local options=() local system local i=1 while read system; do system=$(basename $system) options+=($i "$system" OFF) ((i++)) done < <(list_systems_scraper) if [[ ${#options[@]} -eq 0 ]] ; then printMsgs "dialog" "No populated rom folders were found in $romdir." return fi local cmd=(dialog --ascii-lines --backtitle "$__backtitle" --checklist "Select ROM Folders" 22 76 16) local choice=($("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty0)) [[ ${#choice[@]} -eq 0 ]] && return local choice for choice in "${choice[@]}"; do choice=${options[choice*3-2]} scrape_scraper "$choice" "$@" done } function _load_config_scraper() { echo "$(loadModuleConfig \ 'use_thumbs=1' \ 'screenshots=0' \ 'max_width=400' \ 'max_height=400' \ 'console_src=1' \ 'mame_src=2' \ 'rom_name=0' \ 'append_only=0' \ 'use_rom_folder=0' \ 'download_videos=0' \ 'download_marquees=0' \ )" } function gui_scraper() { ee_console enable echo "Success!" > /dev/tty0 sleep 1 if pgrep "emulationstation" >/dev/null; then printMsgs "dialog" "This scraper must not be run while Emulation Station is running or the scraped data will be overwritten. \n\nPlease quit from Emulation Station, and run RetroPie-Setup from the terminal" return fi iniConfig " = " '"' "$configdir/all/scraper.cfg" eval $(_load_config_scraper) chown $user:$user "$configdir/all/scraper.cfg" local default while true; do local ver=$(get_ver_scraper) [[ -z "$ver" ]] && ver="v(Git)" local cmd=(dialog --ascii-lines --backtitle "$__backtitle" --default-item "$default" --menu "Scraper $ver by Steven Selph" 22 76 16) local options=( 1 "Scrape all systems" 2 "Scrape chosen systems" ) if [[ "$use_thumbs" -eq 1 ]]; then options+=(3 "Thumbnails only (Enabled)") else options+=(3 "Thumbnails only (Disabled)") fi if [[ "$screenshots" -eq 1 ]]; then options+=(4 "Prefer screenshots (Enabled)") else options+=(4 "Prefer screenshots (Disabled)") fi if [[ "$mame_src" -eq 0 ]]; then options+=(5 "Arcade Source (MameDB)") elif [[ "$mame_src" -eq 1 ]]; then options+=(5 "Arcade Source (ScreenScraper)") else options+=(5 "Arcade Source (ArcadeItalia)") fi if [[ "$console_src" -eq 0 ]]; then options+=(6 "Console Source (OpenVGDB)") elif [[ "$console_src" -eq 1 ]]; then options+=(6 "Console Source (thegamesdb)") else options+=(6 "Console Source (ScreenScraper)") fi if [[ "$rom_name" -eq 0 ]]; then options+=(7 "ROM Names (No-Intro)") elif [[ "$rom_name" -eq 1 ]]; then options+=(7 "ROM Names (theGamesDB)") else options+=(7 "ROM Names (Filename)") fi if [[ "$append_only" -eq 1 ]]; then options+=(8 "Gamelist (Append)") else options+=(8 "Gamelist (Overwrite)") fi if [[ "$use_rom_folder" -eq 1 ]]; then options+=(9 "Use rom folder for gamelist & images (Enabled)") else options+=(9 "Use rom folder for gamelist & images (Disabled)") fi if [[ "$download_videos" -eq 1 ]]; then options+=(V "Download Videos (Enabled)") else options+=(V "Download Videos (Disabled)") fi if [[ "$download_marquees" -eq 1 ]]; then options+=(M "Download Marquees (Enabled)") else options+=(M "Download Marquees (Disabled)") fi options+=(W "Max image width ($max_width)") options+=(H "Max image height ($max_height)") local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty0) if [[ -n "$choice" ]]; then default="$choice" case "$choice" in 1) if scrape_all_scraper; then printMsgs "dialog" "ROMS have been scraped." else printMsgs "dialog" "Scraping was aborted" fi ;; 2) if scrape_chosen_scraper; then printMsgs "dialog" "ROMS have been scraped." else printMsgs "dialog" "Scraping was aborted" fi ;; 3) use_thumbs="$((use_thumbs ^ 1))" iniSet "use_thumbs" "$use_thumbs" ;; 4) screenshots="$((screenshots ^ 1))" iniSet "screenshots" "$screenshots" ;; 5) mame_src="$((( mame_src + 1) % 3))" iniSet "mame_src" "$mame_src" ;; 6) console_src="$((( console_src + 1) % 3))" iniSet "console_src" "$console_src" ;; 7) rom_name="$((( rom_name + 1 ) % 3))" iniSet "rom_name" "$rom_name" ;; 8) append_only="$((append_only ^ 1))" iniSet "append_only" "$append_only" ;; 9) use_rom_folder="$((use_rom_folder ^ 1))" iniSet "use_rom_folder" "$use_rom_folder" ;; V) download_videos="$((download_videos ^ 1))" iniSet "download_videos" "$download_videos" ;; M) download_marquees="$((download_marquees ^ 1))" iniSet "download_marquees" "$download_marquees" ;; H) cmd=(dialog --ascii-lines --backtitle "$__backtitle" --inputbox "Please enter the max image height in pixels" 10 60 "$max_height") max_height=$("${cmd[@]}" 2>&1 >/dev/tty0) iniSet "max_height" "$max_height" ;; W) cmd=(dialog --ascii-lines --backtitle "$__backtitle" --inputbox "Please enter the max image width in pixels" 10 60 "$max_width") max_width=$("${cmd[@]}" 2>&1 >/dev/tty0) iniSet "max_width" "$max_width" ;; U) rp_callModule "$md_id" ;; esac else break fi done } ================================================ FILE: packages/sx05re/emuelec/bin/scripts/scriptmodules/supplementary/skyscraper.sh ================================================ #!/usr/bin/env bash # This file is part of The RetroPie Project # # The RetroPie Project is the legal property of its developers, whose names are # too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source. # # See the LICENSE.md file at the top-level directory of this distribution and # at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md # rp_module_id="skyscraper" rp_module_desc="Scraper for EmulationStation by Lars Muldjord" rp_module_licence="GPLv3.0 https://raw.githubusercontent.com/muldjord/skyscraper/master/LICENSE" rp_module_section="exp" # Get the location of the cached resources folder. In v3+, this changed to 'cache'. # Note: the cache folder might be unavailable during first time installations function _cache_folder_skyscraper() { if [[ -d "$configdir/all/skyscraper/dbs" ]]; then echo "dbs" else echo "cache" fi } # Purge all Skyscraper caches function _purge_skyscraper() { local platform local cache_folder=$(_cache_folder_skyscraper) while read platform; do # Find any sub-folders of the cache folder and clear them _clear_platform_skyscraper "$platform" done < <(find "$configdir/all/skyscraper/$cache_folder" -maxdepth 1 -mindepth 1 -type d -exec basename {} \;) } function _clear_platform_skyscraper() { local platform="$1" local mode="$2" local cache_folder=$(_cache_folder_skyscraper) [[ ! -d "$configdir/all/skyscraper/$cache_folder/$platform" ]] && return if [[ $mode == "vacuum" ]]; then sudo -u "$user" stdbuf -o0 $md_inst/Skyscraper --unattend -p "$platform" --cache vacuum else sudo -u "$user" stdbuf -o0 $md_inst/Skyscraper --unattend -p "$platform" --cache purge:all fi sleep 5 } function _purge_platform_skyscraper() { local options=() local cache_folder=$(_cache_folder_skyscraper) local system while read system; do # If there is no 'db.xml' file underneath the folder, skip it, it means folder is empty [[ ! -f "$configdir/all/skyscraper/$cache_folder/$system/db.xml" ]] && continue # Get the size on disk of the system and show it in the select list local size=$(du -sh "$configdir/all/skyscraper/$cache_folder/$system" | cut -f1) options+=("$system" "$size" OFF) done < <(find "$configdir/all/skyscraper/$cache_folder" -maxdepth 1 -mindepth 1 -type d -exec basename {} \;) # If not folders are found, show an info message instead of the selection list if [[ ${#options[@]} -eq 0 ]] ; then printMsgs "dialog" "Nothing to delete ! No cached platforms found in \n$configdir/all/skyscraper/$cache_folder." return fi local mode="$1" [[ -z "$mode" ]] && mode="purge" local cmd=(dialog --ascii-lines --backtitle "$__backtitle" --radiolist "Select platform to $mode" 20 60 12) local platform=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty0) # Exit if no platform chosen [[ -z "$platform" ]] && return _clear_platform_skyscraper "$platform" "$@" } function _get_ver_skyscraper() { if [[ -f "$md_inst/Skyscraper" ]]; then echo $("$md_inst/Skyscraper" -h | grep 'Running Skyscraper' | cut -d' ' -f 3 | tr -d v 2>/dev/null) fi } function _latest_ver_skyscraper() { wget -qO- https://api.github.com/repos/muldjord/skyscraper/releases/latest | grep -m 1 tag_name | cut -d\" -f4 } # List any non-empty systems found in the ROM folder function _list_systems_skyscraper() { find -L "$romdir" -mindepth 1 -maxdepth 1 -type d | sort } function remove_skyscraper() { # On removal of the package, purge the cache _purge_skyscraper } function configure_skyscraper() { if [[ "$md_mode" == "remove" ]]; then return fi # Check if this a first time install local local_config local_config=$(readlink -qn "$home/.skyscraper") # Handle the cases where the user has an existing Skyscraper installation. if [[ -d "$home/.skyscraper" && "$local_config" != "$configdir/all/skyscraper" ]]; then # We have an existing Skyscraper installation, but not handled by this scriptmodule. # Since the $HOME/.skyscraper folder will be moved, make sure the 'cache' and 'import' folders are moved separately local f_size local cache_folder="dbs" [[ -d "$home/.skyscraper/cache" ]] && cache_folder="cache" f_size=$(du --total -sm "$home/.skyscraper/$cache_folder" "$home/.skyscraper/import" 2>/dev/null | tail -n 1 | cut -f 1 ) printMsgs "console" "INFO: Moving the Cache and Import folders to new configuration folder (total: $f_size Mb)" local folder for folder in $cache_folder import; do mv "$home/.skyscraper/$folder" "$home/.skyscraper-$folder" && \ printMsgs "console" "INFO: Moved "$home/.skyscraper/$folder" to "$home/.skyscraper-$folder"" done # When having an existing installation, chances are the gamelist is generated in the ROMs folder # Create a GUI config file with this setting pre-set. iniConfig " = " '"' "$configdir/all/skyscraper.cfg" iniSet "use_rom_folder" 1 fi moveConfigDir "$home/.skyscraper" "$configdir/all/skyscraper" # Move the Cache and Import folders back the new conf folder for folder in $cache_folder import; do if [[ -d "$home/.skyscraper-$folder" ]]; then printMsgs "console" "INFO: Moving "$home/.skyscraper-$folder" back to configuration folder" mv "$home/.skyscraper-$folder" "$configdir/all/skyscraper/$folder" fi done _init_config_skyscraper chown -R $user:$user "$configdir/all/skyscraper" } function _init_config_skyscraper() { local md_conf_dir="/storage/.skyscraper" # Make sure the `artwork.xml` and other conf file(s) are present, but don't overwrite them on upgrades local f_conf for f_conf in artwork.xml aliasMap.csv; do if [[ -f "$md_conf_dir/$f_conf" ]]; then cp -f "$md_inst/$f_conf" "$md_conf_dir/$f_conf.default" else cp "$md_inst/$f_conf" "$md_conf_dir" fi done # If we don't have a previous config.ini file, copy the example one [[ ! -f "$md_conf_dir/config.ini" ]] && cp "$md_inst/config.ini.example" "$md_conf_dir/config.ini" # Try to find the rest of the necesary files from the qmake build file # They should be listed in the `unix:examples.file` configuration line if [[ $(grep unix:examples.files "$md_build/skyscraper.pro" 2>/dev/null | cut -d= -f2-) ]]; then local files=$(grep unix:examples.files "$md_build/skyscraper.pro" | cut -d= -f2-) local file for file in $files; do # Copy the files to the configuration folder. Skip config.ini, artwork.xml and aliasMap.csv if [[ $file != "artwork.xml" && $file != "config.ini" && $file != "aliasMap.csv" ]]; then cp -f "$md_build/$file" "$md_conf_dir" fi done else # Fallback to the known resource files list cp -f "$md_inst/artwork.xml.example"* "$md_conf_dir" # Copy resources and readme local resource_file for resource_file in README.md mameMap.csv tgdb_developers.json tgdb_publishers.json hints.txt; do cp -f "$md_inst/$resource_file" "$md_conf_dir" done fi # Copy the rest of the folders cp -rf "$md_inst/resources" "$md_conf_dir" # Create the import folders and add the sample files. local folder for folder in covers marquees screenshots textual videos wheels; do mkUserDir "$md_conf_dir/import/$folder" done cp -rf "$md_inst/import" "$md_conf_dir" } # Scrape one system, passed as parameter function _scrape_skyscraper() { local system="$1" [[ -z "$system" ]] && return iniConfig " = " '"' "$configdir/all/skyscraper.cfg" eval $(_load_config_skyscraper) local -a params=("--unattend" "--skipped") if [[ "$use_rom_folder" -eq 1 ]]; then params+=(-g "$romdir/$system") params+=(-o "$romdir/$system/media") # If we're saving to the ROM folder, then use relative paths in the gamelist params+=(--relative) else params+=(-g "$home/.emulationstation/gamelists/$system") params+=(-o "$home/.emulationstation/downloaded_media/$system") fi # If 2nd parameter is unset, use the configured scraping source, otherwise scrape from cache. # Scraping from cache means we can omit '-s' from the parameter list. if [[ -z "$2" ]]; then params+=(-s "$scrape_source") fi params+=(-p "$system") [[ "$download_videos" -eq 1 ]] && params+=(--videos) [[ "$cache_marquees" -eq 0 ]] && params+=(--nomarquees) [[ "$cache_covers" -eq 0 ]] && params+=(--nocovers) [[ "$cache_screenshots" -eq 0 ]] && params+=(--noscreenshots) [[ "$cache_wheels" -eq 0 ]] && params+=(--nowheels) [[ "$rom_name" -eq 1 ]] && params+=(--forcefilename) [[ "$remove_brackets" -eq 1 ]] && params+=(--nobrackets) [[ "$force_refresh" -eq 1 ]] && params+=(--refresh) # trap ctrl+c and return if pressed (rather than exiting retropie-setup etc) trap 'trap 2; return 1' INT "/usr/bin/Skyscraper" "${params[@]}" echo -e "\nCOMMAND LINE USED:\n $md_inst/Skyscraper" "${params[@]}" sleep 2 trap 2 } # Scrape a list of systems, chosen by the user function _scrape_chosen_skyscraper() { local options=() local system local i=1 while read system; do system=$(basename $system) options+=($i "$system" OFF) ((i++)) done < <(_list_systems_skyscraper) if [[ ${#options[@]} -eq 0 ]] ; then printMsgs "dialog" "No populated ROM folders were found in $romdir." return fi local choices local cmd=(dialog --ascii-lines --backtitle "$__backtitle" --ok-label "Start" --cancel-label "Back" --checklist " Select platforms for resource gathering\n\n" 22 60 16) choices=($("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty0)) # Exit if nothing was chosen or Cancel was used [[ ${#choices[@]} -eq 0 || $? -eq 1 ]] && return 1 # Confirm with the user that scraping can start dialog --ascii-lines --clear --colors --yes-label "Proceed" --no-label "Abort" --yesno "This will start the gathering process, which can take a long time if you have a large game collection.\n\nYou can interrupt this process anytime by pressing \ZbCtrl+C\Zn.\nProceed ?" 12 70 2>&1 >/dev/tty0 [[ ! $? -eq 0 ]] && return 1 local choice for choice in "${choices[@]}"; do choice="${options[choice*3-2]}" _scrape_skyscraper "$choice" "$@" done } # Generate gamelists for a list of systems, chosen by the user function _generate_chosen_skyscraper() { local options=() local system local i=1 while read system; do system=$(basename $system) options+=($i "$system" OFF) ((i++)) done < <(_list_systems_skyscraper) if [[ ${#options[@]} -eq 0 ]] ; then printMsgs "dialog" "No populated ROM folders were found in $romdir." return fi local choices local cmd=(dialog --ascii-lines --backtitle "$__backtitle" --ok-label "Start" --cancel-label "Back" --checklist " Select platforms for gamelist(s) generation\n\n" 22 60 16) choices=($("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty0)) # Exit if nothing was chosen or Cancel was used [[ ${#choices[@]} -eq 0 || $? -eq 1 ]] && return 1 for choice in "${choices[@]}"; do choice="${options[choice*3-2]}" _scrape_skyscraper "$choice" "cache" "$@" done } function _load_config_skyscraper() { echo "$(loadModuleConfig \ 'rom_name=0' \ 'use_rom_folder=1' \ 'download_videos=0' \ 'cache_marquees=1' \ 'cache_covers=1' \ 'cache_wheels=1' \ 'cache_screenshots=1' \ 'scrape_source=screenscraper' \ 'remove_brackets=0' \ 'force_refresh=0' )" } # Try to guess the most appropriate editor. On Debian derivatives, we have `sensible-editor` for that. function _open_editor_skyscraper() { local editor nano "$1" > /dev/tty0 < /dev/tty0 } function _gui_advanced_skyscraper() { declare -A help_strings_adv iniConfig " = " '"' "$configdir/all/skyscraper.cfg" eval $(_load_config_skyscraper) help_strings_adv=( [E]="Opens the configuration file \Zbconfig.ini\Zn in an editor." [F]="Opens the artwork definition file \Zbartwork.xml\Zn in an editor." [G]="Opens the game alias configuration file \ZbaliasMap.csv\Zn in an editor." ) while true; do local cmd=(dialog --ascii-lines --backtitle "$__backtitle" --help-button --colors --no-collapse --default-item "$default" --ok-label "Ok" --cancel-label "Back" --title "Advanced options" --menu " EXPERT - edit configurations\n" 14 50 5) local options=() options+=(E "Edit 'config.ini'") options+=(F "Edit 'artwork.xml'") options+=(G "Edit 'aliasMap.csv'") local choice=$("${cmd[@]}" "${options[@]}" 2>&1 > /dev/tty0) if [[ -n "$choice" ]]; then local default="$choice" case "$choice" in E) _open_editor_skyscraper "/storage/.skyscraper/config.ini" ;; F) _open_editor_skyscraper "/storage/.skyscraper/artwork.xml" ;; G) _open_editor_skyscraper "/storage/.skyscraper/aliasMap.csv" ;; HELP*) # Retain choice default="${choice/HELP /}" if [[ ! -z "${help_strings_adv[${default}]}" ]]; then dialog --ascii-lines --colors --no-collapse --ok-label "Close" --msgbox "${help_strings_adv[${default}]}" 22 65 >&1 fi esac else break fi done } function gui_skyscraper() { ee_console enable echo "Success!" > /dev/tty0 sleep 1 if pgrep "emulationstatio" >/dev/null; then printMsgs "dialog" "This scraper must not be run while EmulationStation is running or the scraped data will be overwritten.\n\nPlease quit EmulationStation and run RetroPie-Setup from the terminal:\n\n sudo \$HOME/RetroPie-Setup/retropie_setup.sh" return fi iniConfig " = " '"' "$configdir/all/skyscraper.cfg" eval $(_load_config_skyscraper) chown "$user":"$user" "$configdir/all/skyscraper.cfg" local -a s_source local -a s_source_names declare -A help_strings s_source=( [1]=screenscraper [2]=arcadedb [3]=thegamesdb [4]=openretro [5]=worldofspectrum ) s_source+=( [10]=esgamelist [11]=import ) s_source_names=( [1]=ScreenScraper [2]=ArcadeDB [3]=TheGamesDB [4]=OpenRetro [5]="World of Spectrum" ) s_source_names+=( [10]="EmulationStation Gamelist" [11]="Import Folder" ) local ver local lastest_ver # Help strings for this GUI help_strings=( [1]="Gather resources and cache them for the platforms found in \Zb$romdir\Zn.\nRuns the scraper to download the information and media from the selected gathering source." [2]="Select the source for ROM scraping. Supported sources:\n\ZbONLINE\Zn\n * ScreenScraper (screenscraper.fr)\n * TheGamesDB (thegamesdb.net)\n * OpenRetro (openretro.org)\n * ArcadeDB (adb.arcadeitalia.net)\n * World of Spectrum (worldofspectrum.org)\n\ZbLOCAL\Zn\n * EmulationStation Gamelist (imports data from ES gamelist)\n * Import (imports resources in the local cache)\n\n\Zb\ZrNOTE\Zn: Some sources require a username and password for access. These can be set per source in the \Zbconfig.ini\Zn configuration file.\n\n Skyscraper parameter: \Zb-s \Zn" [3]="Options for resource gathering and caching sub-menu.\nClick to open it." [4]="Generate EmulationStation game lists.\nRuns the scraper to incorporate downloaded information and media from the local cache and write them to \Zbgamelist.xml\Zn files to be used by EmulationStation." [5]="Options for EmulationStation game list generation sub-menu.\nClick to open it and change the options." [V]="Toggle the download and caching of videos.\nThis also toggles whether the videos will be included in the resulting gamelist.\n\nSkyscraper option: \Zb--videos\Zn" [A]="Advanced options sub-menu." [U]="Check for an update to Skyscraper\nIf there is a new release, you'll have the option to update." ) ver=$(_get_ver_skyscraper) while true; do [[ -z "$ver" ]] && ver="v(Git)" local cmd=(dialog --ascii-lines --backtitle "$__backtitle" --colors --cancel-label "Exit" --help-button --no-collapse --cr-wrap --default-item "$default" --menu " Skyscraper: game scraper by Lars Muldjord ($ver)\\n \\n" 22 60 12) local options=( "-" "GATHER and cache resources" ) local source_found=0 local online="Online" local i options+=( 1 "Gather resources" ) for i in "${!s_source[@]}"; do if [[ "$scrape_source" == "${s_source[$i]}" ]]; then [[ $i -ge 10 ]] && online="Local" options+=(2 "Gather source - ${s_source_names[$i]} ($online) -->") source_found=1 fi done if [[ $source_found -ne 1 ]]; then options+=(2 "Gather from - Screenscraper (Online) -->") scrape_source="screenscraper" # default scraping source if none found iniSet "scrape_source" "$scrape_source" fi options+=(3 "Cache options and commands -->") options+=("-" "GAME LIST generation") options+=(4 "Generate game list(s)") options+=(5 "Generate options -->") options+=("-" "OTHER options") if [[ "$download_videos" -eq 1 ]]; then options+=(V "Download videos (Enabled)") else options+=(V "Download videos (Disabled)") fi options+=(A "Advanced options -->") # Show different options, depending on the previous check action if [[ -n "$latest_ver" ]] && compareVersions "$latest_ver" gt "$ver" ; then options+=(U "Update to $latest_ver") else options+=(U "Check for Updates") fi # Run the GUI local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty0) if [[ -n "$choice" ]]; then local default="$choice" case "$choice" in 1) if _scrape_chosen_skyscraper; then printMsgs "dialog" "ROMs information gathered.\nDon't forget to use 'Generate Game list(s)' to add this information to EmulationStation." elif [[ $? -eq 2 ]]; then printMsgs "dialog" "Gathering was aborted" fi ;; 2) # Scrape source options have a separate dialog local s_options=() local i for i in "${!s_source[@]}"; do online="Online:" [[ i -ge 10 ]] && online="Local:" if [[ "$scrape_source" == "${s_source[$i]}" ]]; then s_default="$online ${s_source_names[$i]}" fi s_options+=("$online ${s_source_names[$i]}" "") done if [[ -z "$s_default" ]]; then s_default="Online: ${s_source_names[1]}" fi local s_cmd=(dialog --ascii-lines --title "Select Scraping source" --default-item "$s_default" \ --menu "Choose one of the available scraping sources" 18 50 9) # Run the Scraper source selection dialog local scrape_source_name=$("${s_cmd[@]}" "${s_options[@]}" 2>&1 >/dev/tty0) # If Cancel was chosen, don't do anything [[ -z "$scrape_source_name" ]] && continue # Strip the "XYZ:" prefix from the chosen scraper source, then compare to our list local src=$(echo "$scrape_source_name" | cut -d' ' -f2-) for i in "${!s_source_names[@]}"; do [[ "${s_source_names[$i]}" == "$src" ]] && scrape_source=${s_source[$i]} done iniSet "scrape_source" "$scrape_source" ;; 3) _gui_cache_skyscraper ;; 4) if _generate_chosen_skyscraper "cache"; then printMsgs "dialog" "Game list(s) generated." elif [[ $? -eq 2 ]]; then printMsgs "dialog" "Game list generation aborted" fi ;; 5) _gui_generate_skyscraper ;; V) download_videos="$((download_videos ^ 1))" iniSet "download_videos" "$download_videos" ;; A) _gui_advanced_skyscraper ;; HELP*) # Retain choice when the Help button is selected default="${choice/HELP /}" if [[ ! -z "${help_strings[$default]}" ]]; then dialog --ascii-lines --colors --no-collapse --ok-label "Close" --msgbox "${help_strings[$default]}" 22 65 >&1 fi ;; esac else break fi done } function _gui_cache_skyscraper() { local db_size local cache_folder=$(_cache_folder_skyscraper) declare -A help_strings_cache iniConfig " = " '"' "$configdir/all/skyscraper.cfg" eval $(_load_config_skyscraper) help_strings_cache=( [1]="Toggle whether screenshots are cached locally when scraping.\n\nSkyscraper option: \Zb--noscreenshots\Zn" [2]="Toggle whether covers are cached locally when scraping.\n\nSkyscraper option: \Zb--nocovers\Zn" [3]="Toggle whether wheels are cached locally when scraping.\n\nSkyscraper option: \Zb--nowheels\Zn" [4]="Toggle whether marquees are cached locally when scraping.\n\nSkyscraper option: \Zb--nomarquees\Zn" [5]="Force the refresh of resources in the local cache when scraping.\n\nSkyscraper option: \Zb--cache refresh\Zn" [P]="Purge \ZbALL\Zn all cached resources for all platforms." [S]="Purge all cached resources for a chosen platform.\n\nSkyscraper option: \Zb--cache purge:all\Zn" [V]="Removes all non-used cached resources for a chosen platform (vacuum).\n\nSkyscraper option: \Zb--cache vacuum\Zn" ) while true; do db_size=$(du -sh "$configdir/all/skyscraper/$cache_folder" 2>/dev/null | cut -f 1 || echo 0m) [[ -z "$db_size" ]] && db_size="0Mb" local cmd=(dialog --ascii-lines --backtitle "$__backtitle" --help-button --colors --no-collapse --default-item "$default" --ok-label "Ok" --cancel-label "Back" --title "Cache options and commands" --menu "\n Current cache size: $db_size\n\n" 21 60 12) local options=("-" "OPTIONS for gathering and caching") if [[ "$cache_screenshots" -eq 1 ]]; then options+=(1 "Cache screenshots (Enabled)") else options+=(1 "Cache screenshots (Disabled)") fi if [[ "$cache_covers" -eq 1 ]]; then options+=(2 "Cache covers (Enabled)") else options+=(2 "Cache covers (Disabled)") fi if [[ "$cache_wheels" -eq 1 ]]; then options+=(3 "Cache wheels (Enabled)") else options+=(3 "Cache wheels (Disabled)") fi if [[ "$cache_marquees" -eq 1 ]]; then options+=(4 "Cache marquees (Enabled)") else options+=(4 "Cache marquees (Disabled)") fi if [[ "$force_refresh" -eq 0 ]]; then options+=(5 "Force cache refresh (Disabled)") else options+=(5 "Force cache refresh (Enabled)") fi options+=("-" "PURGE cache commands") options+=(V "Vacuum chosen platform") options+=(S "Purge chosen platform") options+=(P "Purge all platforms(!)") local choice=$("${cmd[@]}" "${options[@]}" 2>&1 > /dev/tty0) if [[ -n "$choice" ]]; then local default="$choice" case "$choice" in 1) cache_screenshots="$((cache_screenshots ^ 1))" iniSet "cache_screenshots" "$cache_screenshots" ;; 2) cache_covers="$((cache_covers ^ 1))" iniSet "cache_covers" "$cache_covers" ;; 3) cache_wheels="$((cache_wheels ^ 1))" iniSet "cache_wheels" "$cache_wheels" ;; 4) cache_marquees="$((cache_marquees ^ 1))" iniSet "cache_marquees" "$cache_marquees" ;; 5) force_refresh="$((force_refresh ^ 1))" iniSet "force_refresh" "$force_refresh" ;; V) _purge_platform_skyscraper "vacuum" ;; S) _purge_platform_skyscraper ;; P) dialog --ascii-lines --clear --defaultno --colors --yesno "\Z1\ZbAre you sure ?\Zn\nThis will \Zb\ZuERASE\Zn all locally cached scraped resources" 8 60 2>&1 >/dev/tty0 if [[ $? == 0 ]]; then _purge_skyscraper fi ;; HELP*) # Retain choice default="${choice/HELP /}" if [[ ! -z "${help_strings_cache[${default}]}" ]]; then dialog --ascii-lines --colors --no-collapse --ok-label "Close" --msgbox "${help_strings_cache[${default}]}" 22 65 >&1 fi esac else break fi done } function _gui_generate_skyscraper() { declare -A help_strings_gen iniConfig " = " '"' "$configdir/all/skyscraper.cfg" eval $(_load_config_skyscraper) help_strings_gen=( [1]="Game name format used in the EmulationStation game list. Available options:\n\n\ZbSource name\Zn: use the name returned by the scraper\n\ZbFilename\Zn: use the filename of the ROM as game name\n\nSkyscraper option: \Zb--forcefilename\Z0" [2]="Game name option to remove/keep the text found between '()' and '[]' in the ROMs filename.\n\nSkyscraper option: \Zb--nobrackets\Zn" [3]="Choose to save the generated 'gamelist.xml' and media in the ROMs folder. Supported options:\n\n\ZbEnabled\Zn saves the 'gamelist.xml' in the ROMs folder and the media in the 'media' sub-folder.\n\n\ZbDisabled\Zn saves the 'gamelist.xml' in \Zu\$HOME/.emulationstation/gamelists/\Zn and the media in \Zu\$HOME/.emulationstation/downloaded_media\Zn.\n\n\Zb\ZrNOTE\Zn: changing this option will not automatically copy the 'gamelist.xml' file and the media to the new location or remove the ones in the old location. You must do this manually.\n\nSkyscraper parameters: \Zb-g \Zn / \Zb-o \Zn" ) while true; do local cmd=(dialog --ascii-lines --backtitle "$__backtitle" --help-button --colors --no-collapse --default-item "$default" --ok-label "Ok" --cancel-label "Back" --title "Game list generation options" --menu "\n\n" 13 60 5) local -a options if [[ "$rom_name" -eq 0 ]]; then options=(1 "ROM Names (Source name)") else options=(1 "ROM Names (Filename)") fi if [[ "$remove_brackets" -eq 1 ]]; then options+=(2 "Remove bracket info (Enabled)") else options+=(2 "Remove bracket info (Disabled)") fi if [[ "$use_rom_folder" -eq 1 ]]; then options+=(3 "Use ROM folders for game list & media (Enabled)") else options+=(3 "Use ROM folders for game list & media (Disabled)") fi local choice=$("${cmd[@]}" "${options[@]}" 2>&1 > /dev/tty0) if [[ -n "$choice" ]]; then local default="$choice" case "$choice" in 1) rom_name="$((rom_name ^ 1))" iniSet "rom_name" "$rom_name" ;; 2) remove_brackets="$((remove_brackets ^ 1))" iniSet "remove_brackets" "$remove_brackets" ;; 3) use_rom_folder="$((use_rom_folder ^ 1))" iniSet "use_rom_folder" "$use_rom_folder" ;; HELP*) # Retain choice default="${choice/HELP /}" if [[ ! -z "${help_strings_gen[${default}]}" ]]; then dialog --ascii-lines --colors --no-collapse --ok-label "Close" --msgbox "${help_strings_gen[${default}]}" 22 65 >&1 fi esac else break fi done } ================================================ FILE: packages/sx05re/emuelec/bin/scripts/scriptmodules/supplementary/systeminfo.sh ================================================ #!/bin/bash # This file is part of The RetroArena (TheRA) # # The RetroArena (TheRA) is the legal property of its developers, whose names are # too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source. # # See the LICENSE.md file at the top-level directory of this distribution and # at https://raw.githubusercontent.com/Retro-Arena/RetroArena-Setup/master/LICENSE.md # rp_module_id="systeminfo" rp_module_desc="View your CPU temps, IP connectivity, and storage to include external storage addons." rp_module_section="config" function gui_systeminfo() { echo " Storage System" > /tmp/line1 echo " " > /tmp/free df -h | tail -n +4 > /tmp/temp-disk3 sed '1 i "Name Total Used Free Load Mountpoint"' /tmp/temp-disk3 > /tmp/temp-disk2 sed '/^tmpfs/ d' /tmp/temp-disk2 > /tmp/temp-disk4 sed '/^none/ d' /tmp/temp-disk4 > /tmp/temp-disk sed -i 's,'"/dev/data "',/dev/data,' /tmp/temp-disk > /tmp/tt sed -i 's,'"/dev/loop0 "',/dev/loop0,' /tmp/temp-disk > /tmp/tt sed -i 's,'"/dev/sda1 "',USB,' /tmp/temp-disk > /tmp/tt sed -i 's,'"/var"',,' /tmp/temp-disk > /tmp/tt echo " Temperature Monitoring" > /tmp/temph cpuTempC=$(($(cat /sys/class/thermal/thermal_zone0/temp)/1000)) && cpuTempF=$((cpuTempC*9/5+32)) echo $cpuTempC > /tmp/tempc sed 's/^/Cpu Temperature in Celcius degree : /' /tmp/tempc > /tmp/tempC echo $cpuTempF > /tmp/tempf sed 's/^/Cpu Temperature in Farenheit degree : /' /tmp/tempf > /tmp/tempF echo " Network Info" > /tmp/net ip route get 8.8.8.8 2>/dev/null | awk '{print $NF; exit}' > /tmp/ip sed 's/^/Local Ip address : /' /tmp/ip > /tmp/IP wget -qO- http://ipecho.net/plain > /tmp/wan sed 's/^/Public Ip address : /' /tmp/wan > /tmp/WAN cat /sys/class/net/eth0/operstate > /tmp/wired sed 's/^/Ethernet Connection status : /' /tmp/wired > /tmp/WIRED cat /sys/class/net/lo/operstate > /tmp/loop sed 's/^/Loopback interface status : /' /tmp/loop > /tmp/LOOP cat /sys/class/net/wlan0/operstate > /tmp/wlan sed 's/^/Wireless Connection status : /' /tmp/wlan > /tmp/WLAN sed h /tmp/line1 /tmp/free /tmp/temp-disk /tmp/free /tmp/free /tmp/temph /tmp/free /tmp/tempC /tmp/tempF /tmp/free /tmp/free /tmp/net /tmp/free /tmp/IP /tmp/WAN /tmp/LOOP /tmp/WIRED /tmp/WLAN > /tmp/display rm /tmp/free /tmp/tt /tmp/line1 /tmp/temp* /tmp/ip /tmp/loop /tmp/wan /tmp/wired /tmp/wlan /tmp/net /tmp/IP /tmp/WAN /tmp/LOOP /tmp/WIRED /tmp/WLAN dialog --ascii-lines --backtitle "emuELEC System Information" --title "emuELEC System Information" --textbox /tmp/display 27 72 rm /tmp/display } ================================================ FILE: packages/sx05re/emuelec/bin/scripts/scriptmodules/supplementary/wifi.sh ================================================ #!/usr/bin/env bash # This file is part of The RetroPie Project # # The RetroPie Project is the legal property of its developers, whose names are # too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source. # # See the LICENSE.md file at the top-level directory of this distribution and # at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md # rp_module_id="wifi" rp_module_desc="Configure Wifi" rp_module_section="config" rp_module_flags="!x11" function _set_interface_wifi() { local state="$1" if [[ "$state" == "up" ]]; then if ! ifup wlan0; then ip link set wlan0 up fi elif [[ "$state" == "down" ]]; then if ! ifdown wlan0; then ip link set wlan0 down fi fi } function remove_wifi() { sed -i '/RETROPIE CONFIG START/,/RETROPIE CONFIG END/d' "/etc/wpa_supplicant/wpa_supplicant.conf" _set_interface_wifi down 2>/dev/null } function list_wifi() { local line local essid local type while read line; do [[ "$line" =~ ^Cell && -n "$essid" ]] && echo -e "$essid\n$type" [[ "$line" =~ ^ESSID ]] && essid=$(echo "$line" | cut -d\" -f2) [[ "$line" == "Encryption key:off" ]] && type="open" [[ "$line" == "Encryption key:on" ]] && type="wep" [[ "$line" =~ ^IE:.*WPA ]] && type="wpa" done < <(iwlist wlan0 scan | grep -o "Cell .*\|ESSID:\".*\"\|IE: .*WPA\|Encryption key:.*") echo -e "$essid\n$type" } function connect_wifi() { if [[ ! -d "/sys/class/net/wlan0/" ]]; then printMsgs "dialog" "No wlan0 interface detected" return 1 fi local essids=() local essid local types=() local type local options=() i=0 _set_interface_wifi up 2>/dev/null sleep 1 while read essid; read type; do essids+=("$essid") types+=("$type") options+=("$i" "$essid") ((i++)) done < <(list_wifi) options+=("H" "Hidden ESSID") local cmd=(dialog --ascii-lines --backtitle "$__backtitle" --menu "Please choose the network you would like to connect to" 22 76 16) choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) [[ -z "$choice" ]] && return local hidden=0 if [[ "$choice" == "H" ]]; then cmd=(dialog --ascii-lines --backtitle "$__backtitle" --inputbox "Please enter the ESSID" 10 60) essid=$("${cmd[@]}" 2>&1 >/dev/tty) [[ -z "$essid" ]] && return cmd=(dialog --ascii-lines --backtitle "$__backtitle" --nocancel --menu "Please choose the WiFi type" 12 40 6) options=( wpa "WPA/WPA2" wep "WEP" open "Open" ) type=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) hidden=1 else essid=${essids[choice]} type=${types[choice]} fi if [[ "$type" == "wpa" || "$type" == "wep" ]]; then local key="" cmd=(dialog --ascii-lines --backtitle "$__backtitle" --insecure --passwordbox "Please enter the WiFi key/password for $essid" 10 63) local key_ok=0 while [[ $key_ok -eq 0 ]]; do key=$("${cmd[@]}" 2>&1 >/dev/tty) || return key_ok=1 if [[ ${#key} -lt 8 || ${#key} -gt 63 ]] && [[ "$type" == "wpa" ]]; then printMsgs "dialog" "Password must be between 8 and 63 characters" key_ok=0 fi if [[ -z "$key" && $type == "wep" ]]; then printMsgs "dialog" "Password cannot be empty" key_ok=0 fi done fi create_config_wifi "$type" "$essid" "$key" gui_connect_wifi } function create_config_wifi() { local type="$1" local essid="$2" local key="$3" local wpa_config wpa_config+="\tssid=\"$essid\"\n" case $type in wpa) wpa_config+="\tpsk=\"$key\"\n" ;; wep) wpa_config+="\tkey_mgmt=NONE\n" wpa_config+="\twep_tx_keyidx=0\n" wpa_config+="\twep_key0=$key\n" ;; open) wpa_config+="\tkey_mgmt=NONE\n" ;; esac [[ $hidden -eq 1 ]] && wpa_config+="\tscan_ssid=1\n" remove_wifi wpa_config=$(echo -e "$wpa_config") cat >> "/etc/wpa_supplicant/wpa_supplicant.conf" <<_EOF_ # RETROPIE CONFIG START network={ $wpa_config } # RETROPIE CONFIG END _EOF_ } function gui_connect_wifi() { _set_interface_wifi down 2>/dev/null _set_interface_wifi up 2>/dev/null # BEGIN workaround for dhcpcd trigger failure on Raspbian stretch systemctl restart dhcpcd &>/dev/null # END workaround dialog --ascii-lines --backtitle "$__backtitle" --infobox "\nConnecting ..." 5 40 >/dev/tty local id="" i=0 while [[ -z "$id" && $i -lt 30 ]]; do sleep 1 id=$(iwgetid -r) ((i++)) done if [[ -z "$id" ]]; then printMsgs "dialog" "Unable to connect to network $essid" _set_interface_wifi down 2>/dev/null fi } function _check_country_wifi() { [[ ! -f /etc/wpa_supplicant/wpa_supplicant.conf ]] && return iniConfig "=" "" /etc/wpa_supplicant/wpa_supplicant.conf iniGet "country" if [[ -z "$ini_value" ]]; then if dialog --ascii-lines --defaultno --yesno "You don't currently have your WiFi country set in /etc/wpa_supplicant/wpa_supplicant.conf\n\nOn a Raspberry Pi 3 Model B+ your WiFI will be disabled until the country is set. You can do this via raspi-config which is available from the RetroPie menu in Emulation Station. Once in raspi-config you can set your country via menu 4 (Localisation Options)\n\nDo you want me to launch raspi-config for you now ?" 22 76 2>&1 >/dev/tty; then raspi-config fi fi } function gui_wifi() { isPlatform "rpi" && _check_country_wifi local default while true; do local ip_current=$(ip route get 8.8.8.8 2>/dev/null | awk '{print $NF; exit}') local ip_wlan=$(ip route ls dev wlan0 2>/dev/null | awk 'END {print $7}') local cmd=(dialog --ascii-lines --backtitle "$__backtitle" --cancel-label "Exit" --item-help --help-button --default-item "$default" --menu "Configure WiFi\nCurrent IP: $ip_current\nWireless IP: $ip_wlan\nWireless ESSID: $(iwgetid -r)" 22 76 16) local options=( 1 "Connect to WiFi network" "1 Connect to your WiFi network" 2 "Disconnect/Remove WiFi config" "2 Disconnect and remove any Wifi configuration" 3 "Import wifi credentials from /boot/wifikeyfile.txt" "3 Will import the ssid (name) and psk (password) from a file /boot/wifikeyfile.txt The file should contain two lines as follows\n\nssid = \"YOUR WIFI SSID\"\npsk = \"YOUR PASSWORD\"" ) local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) if [[ "${choice[@]:0:4}" == "HELP" ]]; then choice="${choice[@]:5}" default="${choice/%\ */}" choice="${choice#* }" printMsgs "dialog" "$choice" continue fi default="$choice" if [[ -n "$choice" ]]; then case "$choice" in 1) connect_wifi ;; 2) remove_wifi ;; 3) if [[ -f "/boot/wifikeyfile.txt" ]]; then iniConfig " = " "\"" "/boot/wifikeyfile.txt" iniGet "ssid" local ssid="$ini_value" iniGet "psk" local psk="$ini_value" create_config_wifi "wpa" "$ssid" "$psk" gui_connect_wifi else printMsgs "dialog" "No /boot/wifikeyfile.txt found" fi ;; esac else break fi done } ================================================ FILE: packages/sx05re/emuelec/bin/scripts/scriptmodules/system.sh ================================================ #!/usr/bin/env bash # This file is part of The RetroPie Project # # The RetroPie Project is the legal property of its developers, whose names are # too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source. # # See the LICENSE.md file at the top-level directory of this distribution and # at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md # function setup_env() { __ERRMSGS=() __INFMSGS=() # if no apt-get we need to fail [[ -z "$(which apt-get)" ]] && fatalError "Unsupported OS - No apt-get command found" __memory_phys=$(free -m | awk '/^Mem:/{print $2}') __memory_total=$(free -m -t | awk '/^Total:/{print $2}') __has_binaries=0 get_platform get_os_version get_retropie_depends __gcc_version=$(gcc -dumpversion) # workaround for GCC ABI incompatibility with threaded armv7+ C++ apps built # on Raspbian's armv6 userland https://github.com/raspberrypi/firmware/issues/491 if [[ "$__os_id" == "Raspbian" ]] && compareVersions $__gcc_version lt 5.0.0; then __default_cxxflags+=" -U__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2" fi # set location of binary downloads __binary_host="files.retropie.org.uk" [[ "$__has_binaries" -eq 1 ]] && __binary_url="https://$__binary_host/binaries/$__os_codename/$__platform" __archive_url="https://files.retropie.org.uk/archives" # -pipe is faster but will use more memory - so let's only add it if we have more thans 256M free ram. [[ $__memory_phys -ge 512 ]] && __default_cflags+=" -pipe" [[ -z "${CFLAGS}" ]] && export CFLAGS="${__default_cflags}" [[ -z "${CXXFLAGS}" ]] && export CXXFLAGS="${__default_cxxflags}" [[ -z "${ASFLAGS}" ]] && export ASFLAGS="${__default_asflags}" [[ -z "${MAKEFLAGS}" ]] && export MAKEFLAGS="${__default_makeflags}" # test if we are in a chroot if [[ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]]; then [[ -z "$QEMU_CPU" && -n "$__qemu_cpu" ]] && export QEMU_CPU=$__qemu_cpu __chroot=1 else __chroot=0 fi if [[ -z "$__nodialog" ]]; then __nodialog=0 fi } function get_os_version() { # make sure lsb_release is installed # getDepends lsb-release # get os distributor id, description, release number and codename local os mapfile -t os < <(lsb_release -sidrc) __os_id="${os[0]}" __os_desc="${os[1]}" __os_release="${os[2]}" __os_codename="${os[3]}" local error="" __os_id="Ubuntu" __os_release="16.10" case "$__os_id" in Raspbian|Debian) # Debian unstable is not officially supported though if [[ "$__os_release" == "unstable" ]]; then __os_release=10 fi if compareVersions "$__os_release" lt 8; then error="You need Raspbian/Debian Jessie or newer" fi # set a platform flag for osmc if grep -q "ID=osmc" /etc/os-release; then __platform_flags+=" osmc" fi # and for xbian if grep -q "NAME=XBian" /etc/os-release; then __platform_flags+=" xbian" fi # we provide binaries for RPI on Raspbian < 10 only if isPlatform "rpi" && compareVersions "$__os_release" lt 10; then __has_binaries=1 fi # get major version (8 instead of 8.0 etc) __os_debian_ver="${__os_release%%.*}" ;; Devuan) if isPlatform "rpi"; then error="We do not support Devuan on the Raspberry Pi. We recommend you use Raspbian to run RetroPie." fi # devuan lsb-release version numbers don't match jessie case "$__os_codename" in jessie) __os_debian_ver="8" ;; ascii) __os_debian_ver="9" ;; beowolf) __os_debian_ver="10" ;; ceres) __os_debian_ver="11" ;; esac ;; LinuxMint) if [[ "$__os_desc" != LMDE* ]]; then if compareVersions "$__os_release" lt 17; then error="You need Linux Mint 17 or newer" elif compareVersions "$__os_release" lt 18; then __os_ubuntu_ver="14.04" __os_debian_ver="8" elif compareVersions "$__os_release" lt 19; then __os_ubuntu_ver="16.04" __os_debian_ver="8" else __os_ubuntu_ver="18.04" __os_debian_ver="9" fi fi ;; Ubuntu) if compareVersions "$__os_release" lt 14.04; then error="You need Ubuntu 14.04 or newer" elif compareVersions "$__os_release" lt 16.10; then __os_debian_ver="8" else __os_debian_ver="9" fi __os_ubuntu_ver="$__os_release" ;; Deepin) if compareVersions "$__os_release" lt 15.5; then error="You need Deepin OS 15.5 or newer" fi __os_debian_ver="9" ;; elementary) if compareVersions "$__os_release" lt 0.3; then error="You need Elementary OS 0.3 or newer" elif compareVersions "$__os_release" lt 0.4; then __os_ubuntu_ver="14.04" else __os_ubuntu_ver="16.04" fi __os_debian_ver="8" ;; neon) __os_ubuntu_ver="$__os_release" if compareVersions "$__os_release" lt 16.10; then __os_debian_ver="8" else __os_debian_ver="9" fi ;; *) error="Unsupported OS" ;; esac [[ -n "$error" ]] && fatalError "$error\n\n$(lsb_release -idrc)" # add 32bit/64bit to platform flags __platform_flags+=" 32bit" # configure Raspberry Pi graphics stack isPlatform "rpi" && get_rpi_video } function get_retropie_depends() { local depends=(git dialog wget gcc g++ build-essential unzip xmlstarlet python-pyudev ca-certificates) if ! getDepends "${depends[@]}"; then fatalError "Unable to install packages required by $0 - ${md_ret_errors[@]}" fi # make sure we don't have xserver-xorg-legacy installed as it breaks launching x11 apps from ES if ! isPlatform "x11" && hasPackage "xserver-xorg-legacy"; then aptRemove xserver-xorg-legacy fi } function get_rpi_video() { local pkgconfig="/opt/vc/lib/pkgconfig" # detect driver via inserted module / platform driver setup if [[ -d "/sys/module/vc4" ]]; then __platform_flags+=" mesa kms" [[ "$(ls -A /sys/bus/platform/drivers/vc4_firmware_kms/*.firmwarekms 2>/dev/null)" ]] && __platform_flags+=" dispmanx" else __platform_flags+=" videocore dispmanx" fi # use our supplied fallback pkgconfig if necessary [[ ! -d "$pkgconfig" ]] && pkgconfig="$scriptdir/pkgconfig" # set pkgconfig path for vendor libraries export PKG_CONFIG_PATH="$pkgconfig" } function get_platform() { local architecture="$(uname --machine)" if [[ -z "$__platform" ]]; then case "$(sed -n '/^Hardware/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo)" in BCM*) # calculated based on information from https://github.com/AndrewFromMelbourne/raspberry_pi_revision local rev="0x$(sed -n '/^Revision/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo)" # if bit 23 is not set, we are on a rpi1 (bit 23 means the revision is a bitfield) if [[ $((($rev >> 23) & 1)) -eq 0 ]]; then __platform="rpi1" else # if bit 23 is set, get the cpu from bits 12-15 local cpu=$((($rev >> 12) & 15)) case $cpu in 0) __platform="rpi1" ;; 1) __platform="rpi2" ;; 2) __platform="rpi3" ;; esac fi ;; ODROIDC) __platform="odroid-c1" ;; ODROID-C2) __platform="odroid-c2" ;; "Freescale i.MX6 Quad/DualLite (Device Tree)") __platform="imx6" ;; ODROID-XU[34]) __platform="odroid-xu" ;; "Rockchip (Device Tree)") __platform="tinker" ;; Vero4K) __platform="vero4k" ;; "Allwinner sun8i Family") __platform="armv7-mali" ;; *) case $architecture in i686|x86_64|amd64) __platform="x86" ;; esac ;; esac fi __platform="odroid-c2" if ! fnExists "platform_${__platform}"; then fatalError "Unknown platform - please manually set the __platform variable to one of the following: $(compgen -A function platform_ | cut -b10- | paste -s -d' ')" fi platform_${__platform} [[ -z "$__default_cxxflags" ]] && __default_cxxflags="$__default_cflags" } function platform_rpi1() { # values to be used for configure/make __default_cflags="-O2 -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard" __default_asflags="" __default_makeflags="" __platform_flags="arm armv6 rpi gles" # if building in a chroot, what cpu should be set by qemu # make chroot identify as arm6l __qemu_cpu=arm1176 } function platform_rpi2() { __default_cflags="-O2 -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations" __default_asflags="" __default_makeflags="-j2" __platform_flags="arm armv7 neon rpi gles" __qemu_cpu=cortex-a7 } # note the rpi3 currently uses the rpi2 binaries - for ease of maintenance - rebuilding from source # could improve performance with the compiler options below but needs further testing function platform_rpi3() { __default_cflags="-O2 -march=armv8-a+crc -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations" __default_asflags="" __default_makeflags="-j2" __platform_flags="arm armv8 neon rpi gles" } function platform_odroid-c1() { __default_cflags="-O2 -mcpu=cortex-a5 -mfpu=neon-vfpv4 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations" __default_asflags="" __default_makeflags="-j2" __platform_flags="arm armv7 neon mali gles" __qemu_cpu=cortex-a9 } function platform_odroid-c2() { if [[ "32" -eq 32 ]]; then __default_cflags="-O2 -march=armv8-a+crc -mtune=cortex-a53 -mfpu=neon-fp-armv8" __platform_flags="arm armv8 neon mali gles" else __default_cflags="-O2 -march=native" __platform_flags="aarch64 mali gles" fi __default_cflags+=" -ftree-vectorize -funsafe-math-optimizations" __default_asflags="" __default_makeflags="-j2" } function platform_odroid-xu() { __default_cflags="-O2 -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations" # required for mali-fbdev headers to define GL functions __default_cflags+=" -DGL_GLEXT_PROTOTYPES" __default_asflags="" __default_makeflags="-j2" __platform_flags="arm armv7 neon mali gles" } function platform_tinker() { __default_cflags="-O2 -marm -march=armv7-a -mtune=cortex-a17 -mfpu=neon-vfpv4 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations" # required for mali headers to define GL functions __default_cflags+=" -DGL_GLEXT_PROTOTYPES" __default_asflags="" __default_makeflags="-j2" __platform_flags="arm armv7 neon kms gles" } function platform_x86() { __default_cflags="-O2 -march=native" __default_asflags="" __default_makeflags="-j$(nproc)" __platform_flags="x11 gl" } function platform_generic-x11() { __default_cflags="-O2" __default_asflags="" __default_makeflags="-j$(nproc)" __platform_flags="x11 gl" } function platform_armv7-mali() { __default_cflags="-O2 -march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations" __default_asflags="" __default_makeflags="-j$(nproc)" __platform_flags="arm armv7 neon mali gles" } function platform_imx6() { __default_cflags="-O2 -march=armv7-a -mfpu=neon -mtune=cortex-a9 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations" __default_asflags="" __default_makeflags="-j2" __platform_flags="arm armv7 neon" } function platform_vero4k() { __default_cflags="-I/opt/vero3/include -L/opt/vero3/lib -O2 -march=armv8-a+crc -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations" __default_asflags="" __default_makeflags="-j4" __platform_flags="arm armv8 neon vero4k gles" } ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/CMD_MAKER.py ================================================ #!/usr/bin/env python3 """EmuELEC MAME .cmd batch generator (controller UI).""" # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2026-present worstcase_scenario (https://github.com/worstcase-scenario) import os import glob import re import shutil import xml.etree.ElementTree as ET from typing import Dict, List, Tuple, Optional import sys import struct import select import time from evdev import InputDevice, list_devices, ecodes as e class MediaEntry: def __init__(self, system: str, media_name: str, brief: str, exts: List[str]): self.system = system self.media_name = media_name self.brief = brief self.exts = exts DEFAULT_LISTMEDIA_FILE = "/storage/roms/listmedia.txt" SYSTEM_LISTMEDIA_FILE = "/usr/bin/scripts/setup/listmedia.txt" ROM_PLACEHOLDER = "" # Linux input event codes EV_KEY = 1 EV_ABS = 3 # Button codes (common gamepad mapping) BTN_SOUTH = 304 # A/Cross BTN_EAST = 305 # B/Circle BTN_WEST = 306 # X/Square BTN_NORTH = 307 # Y/Triangle BTN_TL = 308 # L1 BTN_TR = 309 # R1 BTN_SELECT = 314 # Select/Back BTN_START = 315 # Start BTN_MODE = 316 # Home/Guide # D-Pad absolute axes ABS_HAT0X = 16 ABS_HAT0Y = 17 # Keyboard codes KEY_UP = 103 KEY_DOWN = 108 KEY_LEFT = 105 KEY_RIGHT = 106 KEY_ENTER = 28 KEY_ESC = 1 KEY_BACKSPACE = 14 KEY_Q = 16 # Character set for command line editor CMD_ALPHABET = list("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 -_./\\()[]{}\"'=:,;") MAX_CMD_LEN = 256 class UserQuit(Exception): pass class GoBack(Exception): pass def find_controller_device() -> str: patterns = re.compile(r"(pad|controller|joystick|xbox|playstation|ps[0-9]|dualshock|dualsense|8bitdo)", re.I) # Collect candidates: (priority, path, name) candidates = [] for path in sorted(glob.glob("/dev/input/event*")): base = os.path.basename(path) name_path = f"/sys/class/input/{base}/device/name" devname = "" try: with open(name_path, "r", encoding="utf-8", errors="ignore") as f: devname = f.read().strip() except Exception: devname = "" priority = 0 if (devname and patterns.search(devname)) else 1 candidates.append((priority, path, devname)) # Try preferred candidates first for _, path, devname in sorted(candidates, key=lambda t: (t[0], t[1])): try: with open(path, "rb") as _f: pass if devname: print(f"Auto-detected controller: {devname} ({path})", flush=True) else: print(f"Auto-detected input device: {path}", flush=True) return path except Exception: continue print("Warning: No /dev/input/event* device could be opened; falling back to /dev/input/event0", flush=True) return "/dev/input/event0" # --------------------------------------------------------------------------- # Controller Input Handling # --------------------------------------------------------------------------- class ControllerInput: def __init__(self, preferred_path: Optional[str] = None): self.dev = wait_for_controller(preferred_path) self.last_hat_x = 0 self.last_hat_y = 0 def wait_for_input(self) -> str: for event in self.dev.read_loop(): # Button presses if event.type == e.EV_KEY and event.value == 1: code = event.code # D-Pad (digital) if code == e.BTN_DPAD_UP: return 'up' if code == e.BTN_DPAD_DOWN: return 'down' if code == e.BTN_DPAD_LEFT: return 'left' if code == e.BTN_DPAD_RIGHT: return 'right' # Confirm / Back if code in (e.BTN_SOUTH, e.BTN_START): return 'a' if code == e.BTN_EAST: return 'b' # Additional buttons if code == e.BTN_NORTH: return 'y' if code == e.BTN_WEST: return 'x' if code == e.BTN_TL: return 'l1' if code == e.BTN_TR: return 'r1' # Quit / special if code in (e.BTN_SELECT, e.BTN_MODE): return 'select' # Some controllers map D-pad to face buttons/keys; keep a small fallback if code in (e.KEY_UP,): return 'up' if code in (e.KEY_DOWN,): return 'down' if code in (e.KEY_LEFT,): return 'left' if code in (e.KEY_RIGHT,): return 'right' if code in (e.KEY_ENTER,): return 'a' if code in (e.KEY_ESC, e.KEY_BACKSPACE): return 'b' # D-Pad (hat axes) if event.type == e.EV_ABS: if event.code == e.ABS_HAT0Y: if event.value < 0 and self.last_hat_y >= 0: self.last_hat_y = event.value return 'up' if event.value > 0 and self.last_hat_y <= 0: self.last_hat_y = event.value return 'down' if event.value == 0: self.last_hat_y = 0 if event.code == e.ABS_HAT0X: if event.value < 0 and self.last_hat_x >= 0: self.last_hat_x = event.value return 'left' if event.value > 0 and self.last_hat_x <= 0: self.last_hat_x = event.value return 'right' if event.value == 0: self.last_hat_x = 0 def close(self): try: self.dev.close() except Exception: pass def wait_for_controller(preferred_path: Optional[str] = None) -> InputDevice: print("\nWaiting for controller...", flush=True) if preferred_path: try: dev = InputDevice(preferred_path) print(f"Controller found: {dev.name} ({dev.path})", flush=True) return dev except OSError: pass while True: for path in list_devices(): try: dev = InputDevice(path) except OSError: continue caps = dev.capabilities() keys = caps.get(e.EV_KEY, []) abs_caps = caps.get(e.EV_ABS, []) # Heuristic: real gamepad usually has face buttons and/or dpad has_face = any(btn in keys for btn in (e.BTN_SOUTH, e.BTN_EAST, e.BTN_NORTH, e.BTN_WEST)) has_dpad = any(btn in keys for btn in (e.BTN_DPAD_UP, e.BTN_DPAD_DOWN, e.BTN_DPAD_LEFT, e.BTN_DPAD_RIGHT)) has_hat = any(ax in abs_caps for ax in (e.ABS_HAT0X, e.ABS_HAT0Y)) if has_face or has_dpad or has_hat: print(f"Controller found: {dev.name} ({dev.path})", flush=True) return dev time.sleep(1.0) def init_controller(preferred_path: Optional[str] = None): global controller controller = ControllerInput(preferred_path) def unblank_framebuffer() -> None: for p in ("/sys/class/graphics/fb0/blank", "/sys/class/graphics/fb1/blank"): try: with open(p, "w", encoding="utf-8") as f: f.write("0") except Exception: pass def clear_screen(): unblank_framebuffer() print("\033[2J\033[H", end='', flush=True) def show_menu( title: str, options: List[str], selected: int = 0, info: str = "", offset: int = 0, visible: int = 20, show_items: bool = False, ) -> None: """Render the menu.""" clear_screen() print("=" * 98) print(f" {title}") print("=" * 98) total = len(options) if visible <= 0: visible = total # Clamp offset if offset < 0: offset = 0 if offset > max(0, total - 1): offset = max(0, total - 1) start = offset end = min(offset + visible, total) if info: print(f"\n\n\n{info}\n") for i in range(start, end): option = options[i] if i == selected: print(f" > {option}") else: print(f" {option}") if end < total: print(" ...") print("\n" + "-" * 98) print("D-Pad: Navigate | A: Select | B: Back | Select: Quit | Left/Right: Page up/down") print("-" * 98) sys.stdout.flush() def select_from_list(title: str, items: List[str], info: str = "", visible: int = 20, show_items: bool = False) -> Optional[int]: if not items: return None total = len(items) selected = 0 offset = 0 # Ensure sensible visible window if visible <= 0: visible = total while True: # Keep selected visible if selected < offset: offset = selected elif selected >= offset + visible: offset = selected - visible + 1 # Clamp offset to valid range if total > visible: max_off = max(0, total - visible) if offset > max_off: offset = max_off else: offset = 0 show_menu(title, items, selected, info, offset=offset, visible=visible) key = controller.wait_for_input() if key == 'select': raise UserQuit() elif key == 'up': if selected > 0: selected -= 1 elif key == 'down': if selected < total - 1: selected += 1 elif key == 'left': # Page up selected = max(0, selected - visible) elif key == 'right': # Page down selected = min(total - 1, selected + visible) elif key == 'a': return selected elif key == 'b': raise GoBack() def confirm_dialog(title: str, message: str, default_yes: bool = True) -> bool: options = ["Yes", "No"] selected = 0 if default_yes else 1 while True: show_menu(title, options, selected, message) key = controller.wait_for_input() if key == 'select': raise UserQuit() elif key in ['up', 'down']: selected = 1 - selected elif key == 'a': return selected == 0 elif key == 'b': return False def ok_dialog(title: str, message: str) -> None: options = ["OK"] selected = 0 while True: show_menu(title, options, selected, message, 0, 20, False) key = controller.wait_for_input() if key == 'select': raise UserQuit() if key in ['a', 'b', 'start']: return def back_exit_dialog(title: str, message: str) -> str: options = ["B A C K", "E X I T"] selected = 0 while True: show_menu(title, options, selected, message, 0, 20, False) key = controller.wait_for_input() if key == 'select': raise UserQuit() if key in ['up', 'down']: selected = 1 - selected if key in ['b']: return "back" if key in ['a', 'start']: return "back" if selected == 0 else "exit" # --------------------------------------------------------------------------- # Custom Command Line Editor # --------------------------------------------------------------------------- def edit_command_line(default_cmd: str) -> Optional[str]: # Prepare the command as a list of characters cmd = list(default_cmd[:MAX_CMD_LEN]) if not cmd: cmd = list("mame ") # Pad to minimum length for easier editing while len(cmd) < 20: cmd.append(" ") position = 0 view_offset = 0 # For horizontal scrolling view_width = 80 # Visible characters at once while True: clear_screen() print("=" * 98) print(" Edit Command Line") print("=" * 98) print() print("LEFT/RIGHT: Move cursor | UP/DOWN: Change character") print("L1/R1: Jump 10 chars | X: Insert space | Y: Delete char") print("A: Accept | B: Cancel") print() print("-" * 98) # Adjust view offset to keep cursor visible if position < view_offset: view_offset = position elif position >= view_offset + view_width: view_offset = position - view_width + 1 # Create visible window visible_start = view_offset visible_end = min(view_offset + view_width, len(cmd)) # Build display with cursor display = [] for idx in range(visible_start, visible_end): char = cmd[idx] if idx < len(cmd) else " " if idx == position: display.append(f"[{char}]") else: display.append(f" {char} ") # Show scroll indicators left_indicator = "<" if view_offset > 0 else " " right_indicator = ">" if visible_end < len(cmd) else " " print(f"{left_indicator}{''.join(display)}{right_indicator}") print() print(f"Position: {position + 1}/{len(cmd)} | Length: {len(cmd)}/{MAX_CMD_LEN}") print("-" * 98) # Get current command preview current_cmd = ''.join(cmd).rstrip() if len(current_cmd) > 90: preview = current_cmd[:87] + "..." else: preview = current_cmd print(f"Preview: {preview}") print("=" * 98) sys.stdout.flush() key = controller.wait_for_input() if key == 'select': raise UserQuit() elif key == 'right': if position < len(cmd) - 1: position += 1 elif key == 'left': if position > 0: position -= 1 elif key == 'r1': # Jump right position = min(position + 10, len(cmd) - 1) elif key == 'l1': # Jump left position = max(position - 10, 0) elif key == 'up': # Next character in alphabet current = cmd[position] try: idx = CMD_ALPHABET.index(current) except ValueError: idx = 0 cmd[position] = CMD_ALPHABET[(idx + 1) % len(CMD_ALPHABET)] elif key == 'down': # Previous character in alphabet current = cmd[position] try: idx = CMD_ALPHABET.index(current) except ValueError: idx = 0 cmd[position] = CMD_ALPHABET[(idx - 1) % len(CMD_ALPHABET)] elif key == 'x': # Insert space at current position if len(cmd) < MAX_CMD_LEN: cmd.insert(position, ' ') elif key == 'y': # Delete character at current position if len(cmd) > 1: cmd.pop(position) if position >= len(cmd): position = len(cmd) - 1 elif key == 'a': # Accept final_cmd = ''.join(cmd).strip() if not final_cmd: continue # Ensure ROM placeholder is present if ROM_PLACEHOLDER not in final_cmd: ok_dialog("Missing Placeholder", f"Command must contain {ROM_PLACEHOLDER}\n\nThis will be replaced with the ROM path.") continue return final_cmd elif key == 'b': # Cancel return None def ask_file_filter(default_exts: List[str]) -> List[str]: exts = [e.lower() for e in (default_exts or [])] if ".zip" not in exts: exts.append(".zip") if not exts: return [] ext_str = " ".join(exts[:8]) if len(exts) > 8: ext_str += f" ... (+{len(exts)-8})" use_filter = confirm_dialog( "File Filter", f"Filter by these file types?\n\n{ext_str}", True ) if use_filter: return exts options = ["All files (no filter)"] + exts choice = select_from_list("Pick one file type", options, visible=20) if choice is None: raise GoBack() if choice == 0: return [] return [exts[choice - 1]] def _read_listmedia_text(path: str) -> str: with open(path, "rb") as bf: data = bf.read() if b"\x00" in data[:4096]: try: return data.decode("utf-16") except UnicodeError: return data.decode("utf-16-le", errors="ignore") else: return data.decode("utf-8", errors="ignore") def parse_listmedia(path: str) -> Dict[str, List[MediaEntry]]: if not os.path.isfile(path): raise FileNotFoundError(f"Listmedia file not found: {path}") text = _read_listmedia_text(path) systems: Dict[str, List[MediaEntry]] = {} current_system: Optional[str] = None for line in text.splitlines(): original = line.rstrip("\r\n") stripped = original.strip() if not stripped: continue tokens = stripped.split() if len(tokens) == 2 and tokens[1].startswith("(none"): continue if len(tokens) < 3: continue brief_idx = None for i, t in enumerate(tokens): if t.startswith("(") and t.endswith(")"): brief_idx = i break if brief_idx is None or brief_idx == 0: continue is_continuation = bool(original) and original[0].isspace() if is_continuation: if current_system is None: continue system = current_system media_name = tokens[0] else: system = tokens[0] current_system = system if brief_idx >= 2: media_name = tokens[1] else: continue brief = tokens[brief_idx].strip("()") exts = [t for t in tokens[brief_idx + 1:] if t.startswith(".")] entry = MediaEntry(system, media_name, brief, exts) systems.setdefault(system, []).append(entry) return systems # --------------------------------------------------------------------------- # System selection # --------------------------------------------------------------------------- def browse_systems_paged(all_systems: List[str], page_size: int = 20) -> Optional[str]: if not all_systems: return None info = f"Total systems: {len(all_systems)}" idx = select_from_list("Select System", all_systems, info, visible=page_size, show_items=True) if idx is None: return None return all_systems[idx] def choose_system(systems: Dict[str, List[MediaEntry]]) -> str: all_systems = sorted(systems.keys()) while True: options = [ "Browse System List", "Back to Main Menu" ] try: idx = select_from_list( "System Selection", options, f"{len(all_systems)} systems available" ) if idx is None or idx == 1: raise GoBack() if idx == 0: selected = browse_systems_paged(all_systems) if selected: return selected except GoBack: raise def choose_media(entries: List[MediaEntry]) -> MediaEntry: options = [] for e in entries: exts_str = " ".join(e.exts[:3]) if e.exts else "" options.append(f"{e.media_name} ({e.brief}) {exts_str}") idx = select_from_list("Select Media Type", options) if idx is None: raise GoBack() return entries[idx] # --------------------------------------------------------------------------- # Directory selection # --------------------------------------------------------------------------- def choose_directory_interactive(prompt: str, start_dir: str = "/storage/roms") -> str: current = os.path.abspath(start_dir) while True: try: entries = os.listdir(current) subdirs = sorted( d for d in entries if os.path.isdir(os.path.join(current, d)) and not d.startswith('.') ) except Exception: subdirs = [] options: List[str] = ["[Use This Directory]"] if current != "/": options.append("[.. Parent Directory]") options.extend(subdirs) info = f"Current: {current}" idx = select_from_list(prompt, options, info, visible=20, show_items=True) if idx is None: raise GoBack() selected = options[idx] if selected == "[Use This Directory]": return current elif selected == "[.. Parent Directory]": parent = os.path.dirname(current) if parent and parent != current: current = parent else: current = os.path.join(current, selected) def ask_directory_and_filter(default_exts: List[str]) -> Tuple[str, List[str]]: rom_dir = choose_directory_interactive("Select ROM Directory", "/storage/roms") exts = [e.lower() for e in (default_exts or [])] if ".zip" not in exts: exts.append(".zip") if exts: ext_str = " ".join(exts[:8]) if len(exts) > 8: ext_str += f" ... (+{len(exts)-8})" use_filter = confirm_dialog( "File Filter", f"Filter by these file types?\n\n{ext_str}", True ) if use_filter: return rom_dir, exts options = ["All files (no filter)"] + exts choice = select_from_list("Pick one file type", options, visible=20) if choice is None or choice == 0: return rom_dir, [] return rom_dir, [exts[choice - 1]] return rom_dir, [] def find_rom_files(rom_dir: str, exts: List[str]) -> List[str]: files: List[str] = [] try: for name in os.listdir(rom_dir): full = os.path.join(rom_dir, name) if not os.path.isfile(full): continue if exts: _, ext = os.path.splitext(name) if ext.lower() not in exts: continue if name.lower().endswith(".cmd"): continue files.append(name) except: pass return sorted(files) # --------------------------------------------------------------------------- # Templates # --------------------------------------------------------------------------- def build_default_template_preset(system: str, media: MediaEntry, extra_options: str) -> str: parts = [system, "-rp /storage/roms/bios"] extra_options = extra_options.strip() if extra_options: parts.append(extra_options) parts.append(f"-{media.brief} \"{ROM_PLACEHOLDER}\"") return " ".join(parts) def apply_template(template: str, rom_path: str) -> str: return template.replace(ROM_PLACEHOLDER, rom_path) # --------------------------------------------------------------------------- # Per-file review # --------------------------------------------------------------------------- def review_cmd(cmd_path: str, cmd_line: str, accept_all: bool) -> Tuple[Optional[str], bool, bool]: if accept_all: return cmd_line, True, True options = [ "CREATE .CMD-FILE FOR THIS ROM", "SKIP THIS ROM", "CREATE .CMD-FILES FOR ALL SELECTED ROMS", "BACK" ] display_path = cmd_path if len(display_path) > 65: display_path = "..." + display_path[-62:] display_cmd = cmd_line if len(display_cmd) > 68: display_cmd = display_cmd[:65] + "..." info = f"File: {display_path}\n\nThe command line in the .cmd files will be:\n{display_cmd}" try: idx = select_from_list("Create .cmd File", options, info) if idx is None or idx == 3: raise GoBack() if idx == 0: return cmd_line, True, False if idx == 2: return cmd_line, True, True # idx == 1: Skip return None, False, False except GoBack: raise # --------------------------------------------------------------------------- # Write .cmd # --------------------------------------------------------------------------- def write_cmd_file(cmd_path: str, cmd_line: str) -> None: os.makedirs(os.path.dirname(cmd_path), exist_ok=True) with open(cmd_path, "w", encoding="utf-8") as f: f.write(cmd_line) f.write("\n") # --------------------------------------------------------------------------- # gamelist.xml update # --------------------------------------------------------------------------- def update_gamelist_paths(gamelist_path: str, rom_dir: str, rom_files: List[str]) -> int: if not os.path.isfile(gamelist_path): return 0 base_names = {os.path.splitext(name)[0] for name in rom_files} try: tree = ET.parse(gamelist_path) root = tree.getroot() except: return 0 changed = 0 for path_elem in root.iter("path"): text = path_elem.text or "" original = text.strip() if not original: continue old_basename = os.path.basename(original) base, ext = os.path.splitext(old_basename) if base not in base_names: continue if ext.lower() == ".cmd": continue new_basename = base + ".cmd" new_text = original[:-len(old_basename)] + new_basename path_elem.text = new_text changed += 1 if changed > 0: backup_path = gamelist_path + ".bak" try: shutil.copy2(gamelist_path, backup_path) tree.write(gamelist_path, encoding="utf-8", xml_declaration=True) except: return 0 return changed def maybe_update_gamelist(rom_dir: str, rom_files: List[str]) -> None: if not rom_files: return update = confirm_dialog( "Update gamelist.xml", "Update gamelist.xml paths to use .cmd files?", False ) default_gamelist = os.path.join(rom_dir, "gamelist.xml") if not update: ok_dialog("Gamelist.xml", "Gamelist.xml update was skipped.") return if not os.path.isfile(default_gamelist): ok_dialog("Gamelist.xml", "gamelist.xml not found; no changes made.") return changed = update_gamelist_paths(default_gamelist, rom_dir, rom_files) if changed > 0: ok_dialog("Success", f"Updated {changed} entries in gamelist.xml") else: ok_dialog("Gamelist.xml", "No matching entries were updated.") # --------------------------------------------------------------------------- # Preset Mode # --------------------------------------------------------------------------- def run_preset_mode(systems: Dict[str, List[MediaEntry]]) -> None: system: Optional[str] = None media: Optional[MediaEntry] = None rom_dir: Optional[str] = None exts: List[str] = [] rom_files: List[str] = [] step = 0 # 0=system, 1=media, 2=dir, 3=filter, 4=process while True: if step == 0: system = choose_system(systems) media = None rom_dir = None exts = [] rom_files = [] step = 1 continue if step == 1: try: media = choose_media(systems[system]) # type: ignore[index] step = 2 except GoBack: step = 0 continue if step == 2: try: rom_dir = choose_directory_interactive("Select ROM Directory", "/storage/roms") step = 3 except GoBack: step = 1 continue if step == 3: try: while True: exts = ask_file_filter(media.exts if media else []) # type: ignore[union-attr] rom_files = find_rom_files(rom_dir, exts) # type: ignore[arg-type] if rom_files: break action = back_exit_dialog( "No Files Found", f"No ROM files found in:\n{rom_dir}\n\nSelect BACK to adjust the file filter, or EXIT to quit." ) if action == "exit": raise UserQuit() # BACK: loop back to filter selection ok_dialog("Files Found", f"Found {len(rom_files)} ROM file(s) that will be processed.") step = 4 except GoBack: step = 2 continue # step == 4: Process files with preset template template = build_default_template_preset(system, media, "") # type: ignore[arg-type] accept_all = False created_for_gamelist: List[str] = [] i = 0 while i < len(rom_files): name = rom_files[i] rom_path = os.path.join(rom_dir, name) # type: ignore[arg-type] cmd_line = apply_template(template, rom_path) cmd_path = os.path.join(rom_dir, os.path.splitext(name)[0] + ".cmd") # type: ignore[arg-type] try: selected_cmd, accepted, accept_all = review_cmd(cmd_path, cmd_line, accept_all) except GoBack: # Go back to file filter selection step = 3 break if not accepted or not selected_cmd: i += 1 continue try: write_cmd_file(cmd_path, selected_cmd) created_for_gamelist.append(name) except Exception as e: ok_dialog("Write Error", f"Failed to write:\n{cmd_path}\n\n{e}") i += 1 if step == 3: continue if created_for_gamelist: maybe_update_gamelist(rom_dir, created_for_gamelist) # type: ignore[arg-type] ok_dialog("Completed", f"Created {len(created_for_gamelist)} .cmd files") return def run_custom_mode() -> None: rom_dir: Optional[str] = None exts: List[str] = [] rom_files: List[str] = [] custom_template: Optional[str] = None step = 0 # 0=create_command, 1=dir, 2=filter, 3=process while True: if step == 0: # Create custom command try: default_cmd = f"mame -rp /storage/roms/bios -cdrom \"{ROM_PLACEHOLDER}\"" options = [ "Create Custom Command", "Back to Main Menu" ] info = "Create a custom command line for your ROM files.\n\nThe command will be used for all selected ROMs." idx = select_from_list("Custom Mode", options, info) if idx is None or idx == 1: raise GoBack() if idx == 0: edited = edit_command_line(default_cmd) if edited is None: continue # Show confirmation preview = edited if len(edited) <= 80 else edited[:77] + "..." confirm = confirm_dialog( "Confirm Custom Command", f"Use this command for all ROMs?\n\n{preview}", True ) if confirm: custom_template = edited step = 1 else: continue except GoBack: raise continue if step == 1: try: rom_dir = choose_directory_interactive("Select ROM Directory", "/storage/roms") step = 2 except GoBack: step = 0 continue if step == 2: try: while True: # Scan directory for available file extensions available_exts = set() try: for name in os.listdir(rom_dir): # type: ignore[arg-type] full = os.path.join(rom_dir, name) # type: ignore[arg-type] if not os.path.isfile(full): continue if name.lower().endswith(".cmd"): continue _, ext = os.path.splitext(name) if ext: available_exts.add(ext.lower()) except Exception: available_exts = {".zip", ".chd", ".cue", ".iso", ".bin"} # Build options list options = ["All files (no filter)"] sorted_exts = sorted(available_exts) options.extend(sorted_exts) info = f"Found {len(available_exts)} file types in directory" choice = select_from_list("Pick file type filter", options, info, visible=20) if choice is None: raise GoBack() if choice == 0: exts = [] else: exts = [sorted_exts[choice - 1]] rom_files = find_rom_files(rom_dir, exts) # type: ignore[arg-type] if rom_files: break action = back_exit_dialog( "No Files Found", f"No ROM files found in:\n{rom_dir}\n\nSelect BACK to adjust the file filter, or EXIT to quit." ) if action == "exit": raise UserQuit() ok_dialog("Files Found", f"Found {len(rom_files)} ROM file(s) that will be processed.") step = 3 except GoBack: step = 1 continue # step == 3: Process files with custom template if not custom_template: step = 0 continue accept_all = False created_for_gamelist: List[str] = [] i = 0 while i < len(rom_files): name = rom_files[i] rom_path = os.path.join(rom_dir, name) # type: ignore[arg-type] cmd_line = apply_template(custom_template, rom_path) cmd_path = os.path.join(rom_dir, os.path.splitext(name)[0] + ".cmd") # type: ignore[arg-type] try: selected_cmd, accepted, accept_all = review_cmd(cmd_path, cmd_line, accept_all) except GoBack: step = 2 break if not accepted or not selected_cmd: i += 1 continue try: write_cmd_file(cmd_path, selected_cmd) created_for_gamelist.append(name) except Exception as e: ok_dialog("Write Error", f"Failed to write:\n{cmd_path}\n\n{e}") i += 1 if step == 2: continue if created_for_gamelist: maybe_update_gamelist(rom_dir, created_for_gamelist) # type: ignore[arg-type] ok_dialog("Completed", f"Created {len(created_for_gamelist)} .cmd files") return def main() -> None: # EmulationStation may launch this script without a real TTY on stdin. # Only enable raw terminal mode when stdin is a TTY (e.g. when run via SSH). try: # Initialize controller (auto-detect; no argument required) preferred_path = sys.argv[1] if len(sys.argv) > 1 else None init_controller(preferred_path) clear_screen() print("Initializing CMD Maker...", flush=True) time.sleep(0.5) systems: Dict[str, List[MediaEntry]] = {} # Check which listmedia files are available user_listmedia_exists = os.path.exists(DEFAULT_LISTMEDIA_FILE) system_listmedia_exists = os.path.exists(SYSTEM_LISTMEDIA_FILE) list_path = None # If both exist, let user choose if user_listmedia_exists and system_listmedia_exists: try: options = [ f"User listmedia.txt ({DEFAULT_LISTMEDIA_FILE})", f"System listmedia.txt ({SYSTEM_LISTMEDIA_FILE})" ] idx = select_from_list( "Choose listmedia.txt", options, "Multiple listmedia.txt files found" ) if idx == 0: list_path = DEFAULT_LISTMEDIA_FILE elif idx == 1: list_path = SYSTEM_LISTMEDIA_FILE except (GoBack, UserQuit): pass # Otherwise use whichever exists elif user_listmedia_exists: list_path = DEFAULT_LISTMEDIA_FILE print(f"Using user listmedia.txt", flush=True) time.sleep(0.3) elif system_listmedia_exists: list_path = SYSTEM_LISTMEDIA_FILE print(f"Using system listmedia.txt", flush=True) time.sleep(0.3) # Try to load listmedia.txt if list_path: try: systems = parse_listmedia(list_path) print(f"Loaded {len(systems)} systems from {os.path.basename(list_path)}", flush=True) time.sleep(0.5) except Exception as e: print(f"Warning: Could not load listmedia.txt: {e}", flush=True) time.sleep(1) try: while True: try: options = [ f"Preset Mode ({len(systems)} systems)", "Custom Mode", "Exit" ] idx = select_from_list( "C M D M A K E R", options, "Create .cmd files for MAME ROMs" ) if idx is None or idx == 2: break if idx == 0: if not systems: ok_dialog( "No Presets", f"No listmedia.txt found in:\n{DEFAULT_LISTMEDIA_FILE}\nor\n{SYSTEM_LISTMEDIA_FILE}" ) else: try: run_preset_mode(systems) except GoBack: continue elif idx == 1: try: run_custom_mode() except GoBack: continue except GoBack: continue except UserQuit: pass except KeyboardInterrupt: pass finally: clear_screen() print("Exiting CMD Maker...", flush=True) time.sleep(0.5) if controller: controller.close() finally: pass if __name__ == "__main__": main() ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/EKA_INSTALL.py ================================================ #!/usr/bin/env python3 """EmuELEC eka2l1 firmware, SIS installer, device selector, UID creator & lowercase converter (controller UI).""" # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2026-present worstcase_scenario (https://github.com/worstcase-scenario) import os import glob import sys import time import subprocess import shutil import re from typing import List, Optional, Tuple from evdev import InputDevice, list_devices, ecodes as e # --------------------------------------------------------------------------- # Paths # --------------------------------------------------------------------------- EKA_EXE = "/usr/bin/eka2l1/eka2l1_sdl2" EKA_CONFIG = "/storage/.config/eka2l1" EKA_BIOS_DIR = "/storage/roms/bios/eka2l1" EKA_ROMS_DIR = "/storage/roms/ngage" EKA_LOG = "/emuelec/logs/eka2l1-install.log" EKA_CONFIG_YML = os.path.join(EKA_CONFIG, "config.yml") EKA_Z_DRIVES = os.path.join(EKA_CONFIG, "data", "drives", "z") # --------------------------------------------------------------------------- # Exceptions # --------------------------------------------------------------------------- class UserQuit(Exception): pass class GoBack(Exception): pass # --------------------------------------------------------------------------- # Controller # --------------------------------------------------------------------------- controller = None class ControllerInput: def __init__(self, preferred_path: Optional[str] = None): self.preferred_path = preferred_path self.dev = wait_for_controller(preferred_path) self.preferred_path = getattr(self.dev, "path", preferred_path) self.last_hat_x = 0 self.last_hat_y = 0 def reconnect(self): old_path = getattr(self.dev, "path", self.preferred_path) self.close() self.last_hat_x = 0 self.last_hat_y = 0 log(f"Controller disconnected, waiting for reconnect (last path: {old_path})") print("\nController disconnected. Waiting for reconnect...", flush=True) self.dev = wait_for_controller(old_path) self.preferred_path = getattr(self.dev, "path", old_path) log(f"Controller reconnected: {self.dev.name} ({self.dev.path})") def wait_for_input(self) -> str: while True: try: for event in self.dev.read_loop(): if event.type == e.EV_KEY and event.value == 1: code = event.code if code == e.BTN_DPAD_UP: return 'up' if code == e.BTN_DPAD_DOWN: return 'down' if code == e.BTN_DPAD_LEFT: return 'left' if code == e.BTN_DPAD_RIGHT: return 'right' if code in (e.BTN_SOUTH, e.BTN_START): return 'a' if code == e.BTN_EAST: return 'b' if code == e.BTN_NORTH: return 'y' if code == e.BTN_WEST: return 'x' if code in (e.BTN_SELECT, e.BTN_MODE): return 'select' if code == e.KEY_UP: return 'up' if code == e.KEY_DOWN: return 'down' if code == e.KEY_LEFT: return 'left' if code == e.KEY_RIGHT: return 'right' if code == e.KEY_ENTER: return 'a' if code in (e.KEY_ESC, e.KEY_BACKSPACE): return 'b' if event.type == e.EV_ABS: if event.code == e.ABS_HAT0Y: if event.value < 0 and self.last_hat_y >= 0: self.last_hat_y = event.value return 'up' if event.value > 0 and self.last_hat_y <= 0: self.last_hat_y = event.value return 'down' if event.value == 0: self.last_hat_y = 0 if event.code == e.ABS_HAT0X: if event.value < 0 and self.last_hat_x >= 0: self.last_hat_x = event.value return 'left' if event.value > 0 and self.last_hat_x <= 0: self.last_hat_x = event.value return 'right' if event.value == 0: self.last_hat_x = 0 except OSError as ex: if getattr(ex, "errno", None) == 19: self.reconnect() continue raise def close(self): try: self.dev.close() except Exception: pass def wait_for_controller(preferred_path: Optional[str] = None) -> InputDevice: print("\nWaiting for controller...", flush=True) if preferred_path: try: dev = InputDevice(preferred_path) print(f"Controller found: {dev.name} ({dev.path})", flush=True) return dev except OSError: pass while True: for path in list_devices(): try: dev = InputDevice(path) except OSError: continue caps = dev.capabilities() keys = caps.get(e.EV_KEY, []) abs_caps = caps.get(e.EV_ABS, []) has_face = any(btn in keys for btn in ( e.BTN_SOUTH, e.BTN_EAST, e.BTN_NORTH, e.BTN_WEST )) has_dpad = any(btn in keys for btn in ( e.BTN_DPAD_UP, e.BTN_DPAD_DOWN, e.BTN_DPAD_LEFT, e.BTN_DPAD_RIGHT )) has_hat = any(ax in abs_caps for ax in (e.ABS_HAT0X, e.ABS_HAT0Y)) if has_face or has_dpad or has_hat: print(f"Controller found: {dev.name} ({dev.path})", flush=True) return dev time.sleep(1.0) def init_controller(preferred_path: Optional[str] = None): global controller controller = ControllerInput(preferred_path) # --------------------------------------------------------------------------- # Screen # --------------------------------------------------------------------------- def unblank_framebuffer(): for p in ("/sys/class/graphics/fb0/blank", "/sys/class/graphics/fb1/blank"): try: with open(p, "w") as f: f.write("0") except Exception: pass def clear_screen(): unblank_framebuffer() print("\033[2J\033[H", end='', flush=True) # --------------------------------------------------------------------------- # UI Primitives # --------------------------------------------------------------------------- def show_menu(title: str, options: List[str], selected: int = 0, info: str = "", offset: int = 0, visible: int = 20) -> None: clear_screen() print("=" * 72) print(f" E K A 2 L 1 C O M M A N D E R - {title}") print("=" * 72) if info: print(f"\n{info}\n") total = len(options) end = min(offset + visible, total) for i in range(offset, end): marker = " > " if i == selected else " " print(f"{marker}{options[i]}") if end < total: print(" ...") print("\n" + "-" * 72) print("D-Pad: Navigate | A: Select | B: Back | Select: Quit") print("-" * 72) sys.stdout.flush() def select_from_list(title: str, items: List[str], info: str = "", visible: int = 20) -> Optional[int]: if not items: return None total = len(items) selected = 0 offset = 0 while True: if selected < offset: offset = selected elif selected >= offset + visible: offset = selected - visible + 1 offset = max(0, min(offset, max(0, total - visible))) show_menu(title, items, selected, info, offset, visible) key = controller.wait_for_input() if key == 'select': raise UserQuit() elif key == 'up': selected = max(0, selected - 1) elif key == 'down': selected = min(total - 1, selected + 1) elif key == 'left': selected = max(0, selected - visible) elif key == 'right': selected = min(total - 1, selected + visible) elif key == 'a': return selected elif key == 'b': raise GoBack() def ok_dialog(title: str, message: str) -> None: while True: show_menu(title, ["OK"], 0, message) key = controller.wait_for_input() if key == 'select': raise UserQuit() if key in ('a', 'b'): return def confirm_dialog(title: str, message: str, default_yes: bool = True) -> bool: options = ["Yes", "No"] selected = 0 if default_yes else 1 while True: show_menu(title, options, selected, message) key = controller.wait_for_input() if key == 'select': raise UserQuit() elif key in ('up', 'down'): selected = 1 - selected elif key == 'a': return selected == 0 elif key == 'b': return False # --------------------------------------------------------------------------- # Directory browser # --------------------------------------------------------------------------- def choose_directory_interactive(prompt: str, start_dir: str) -> str: current = os.path.abspath(start_dir) while True: try: entries = os.listdir(current) subdirs = sorted( d for d in entries if os.path.isdir(os.path.join(current, d)) and not d.startswith('.') ) except Exception: subdirs = [] options: List[str] = ["[Use This Directory]"] if current != "/": options.append("[.. Parent Directory]") options.extend(subdirs) idx = select_from_list(prompt, options, f"Current: {current}") if idx is None: raise GoBack() selected = options[idx] if selected == "[Use This Directory]": return current elif selected == "[.. Parent Directory]": parent = os.path.dirname(current) if parent and parent != current: current = parent else: current = os.path.join(current, selected) # --------------------------------------------------------------------------- # Log / run helper # --------------------------------------------------------------------------- def log(msg: str): try: with open(EKA_LOG, "a") as f: f.write(msg + "\n") except Exception: pass def run_eka(args: List[str], timeout: int = 120) -> int: cmd = [EKA_EXE] + args log("Running: " + " ".join(cmd)) print("", flush=True) try: result = subprocess.run(cmd, cwd=EKA_CONFIG, timeout=timeout) return result.returncode except subprocess.TimeoutExpired: log("Process timed out") return 0 except Exception as ex: log(f"Exception: {ex}") return 1 def run_eka_capture(args: List[str], timeout: int = 120) -> Tuple[int, str]: cmd = [EKA_EXE] + args log("Running (capture): " + " ".join(cmd)) try: result = subprocess.run( cmd, cwd=EKA_CONFIG, timeout=timeout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, errors="replace", ) output = result.stdout or "" if output: log(output.rstrip()) return result.returncode, output except subprocess.TimeoutExpired as ex: output = (ex.stdout or "") if isinstance(ex.stdout, str) else "" if output: log(output.rstrip()) log("Process timed out") return 124, output except Exception as ex: log(f"Exception: {ex}") return 1, "" def eka_success(ret: int) -> bool: """eka2l1 often segfaults (exit -11 / 245) after install - treat as success.""" return ret in (0, -11, 245) # --------------------------------------------------------------------------- # Device handling # --------------------------------------------------------------------------- def parse_listdevices_output(output: str) -> List[Tuple[int, str]]: devices: List[Tuple[int, str]] = [] for raw_line in output.splitlines(): line = raw_line.strip() match = re.match(r'^(\d+)\s*:\s*(.+)$', line) if match: devices.append((int(match.group(1)), match.group(2).strip())) return devices def get_current_device_index() -> Optional[int]: if not os.path.exists(EKA_CONFIG_YML): return None try: with open(EKA_CONFIG_YML, "r", encoding="utf-8") as f: for line in f: match = re.match(r'^\s*device\s*:\s*([0-9]+)\s*$', line) if match: return int(match.group(1)) except Exception as ex: log(f"Failed to read config.yml: {ex}") return None def set_device_index(index: int) -> None: os.makedirs(EKA_CONFIG, exist_ok=True) lines: List[str] = [] if os.path.exists(EKA_CONFIG_YML): try: with open(EKA_CONFIG_YML, "r", encoding="utf-8") as f: lines = f.readlines() except Exception as ex: log(f"Failed to read existing config.yml: {ex}") lines = [] replaced = False new_lines: List[str] = [] for line in lines: if re.match(r'^\s*device\s*:\s*[0-9]+\s*$', line): new_lines.append(f"device: {index}\n") replaced = True else: new_lines.append(line) if not replaced: if new_lines and not new_lines[-1].endswith("\n"): new_lines[-1] += "\n" new_lines.append(f"device: {index}\n") with open(EKA_CONFIG_YML, "w", encoding="utf-8") as f: f.writelines(new_lines) log(f"Set device to {index} in {EKA_CONFIG_YML}") def change_device(): clear_screen() print("Loading device list...", flush=True) ret, output = run_eka_capture(["--listdevices"]) devices = parse_listdevices_output(output) if ret != 0 and not devices: ok_dialog("Error", f"Could not get device list.\n\nSee log: {EKA_LOG}") return if not devices: ok_dialog("Error", "No devices found.") return current_device = get_current_device_index() options: List[str] = [] for device_num, device_name in devices: label = f"{device_num} : {device_name}" if current_device is not None and device_num == current_device: label += " [CURRENT]" options.append(label) info = "Select device to write into config.yml" try: idx = select_from_list("Change Device", options, info, visible=16) except GoBack: return if idx is None: return device_num, device_name = devices[idx] warning = "" if "Don't Select this Rom" in device_name or "brick EKA2L1" in device_name: warning = "\n\nWARNING:\nThis device is marked as unsafe in EKA2L1." if not confirm_dialog( "Confirm Device", f"Set this device?\n\n{device_num} : {device_name}{warning}" ): return try: set_device_index(device_num) ok_dialog("Done", f"Device changed successfully.\n\ndevice: {device_num}") except Exception as ex: log(f"Failed to write config.yml: {ex}") ok_dialog("Error", f"Could not write config.yml\n\nSee log: {EKA_LOG}") # --------------------------------------------------------------------------- # Uppercase-to-lowercase converter for device trees # --------------------------------------------------------------------------- def is_within_path(path: str, base: str) -> bool: try: return os.path.commonpath([os.path.abspath(path), os.path.abspath(base)]) == os.path.abspath(base) except Exception: return False def compute_lowercase_path(path: str) -> str: parent = os.path.dirname(path) base = os.path.basename(path) return os.path.join(parent, base.lower()) def collect_lowercase_rename_ops(root: str) -> Tuple[List[Tuple[str, str]], List[str]]: ops: List[Tuple[str, str]] = [] errors: List[str] = [] for current_root, dirs, files in os.walk(root, topdown=False): for name in sorted(files): if name != name.lower(): old_path = os.path.join(current_root, name) new_path = os.path.join(current_root, name.lower()) ops.append((old_path, new_path)) for name in sorted(dirs): if name != name.lower(): old_path = os.path.join(current_root, name) new_path = os.path.join(current_root, name.lower()) ops.append((old_path, new_path)) root_base = os.path.basename(root) if root_base and root_base != root_base.lower(): ops.append((root, compute_lowercase_path(root))) target_to_source: dict = {} for old_path, new_path in ops: if new_path in target_to_source and target_to_source[new_path] != old_path: errors.append( f'Collision: both\n{target_to_source[new_path]}\nand\n{old_path}\nwould become\n{new_path}' ) continue target_to_source[new_path] = old_path if os.path.exists(new_path) and os.path.abspath(new_path) != os.path.abspath(old_path): errors.append(f'Collision: target already exists\n{new_path}') return ops, errors def convert_tree_to_lowercase(root_path): renamed = [] errors = [] root_path = os.path.abspath(root_path) final_root = root_path def unique_temp_name(path): base = path + ".__tmp_lowercase__" candidate = base idx = 1 while os.path.exists(candidate): candidate = f"{base}{idx}" idx += 1 return candidate def safe_case_rename(src, dst): if src == dst: return src src_abs = os.path.abspath(src) dst_abs = os.path.abspath(dst) if src_abs.lower() == dst_abs.lower(): tmp = unique_temp_name(src_abs) os.rename(src_abs, tmp) os.rename(tmp, dst_abs) return dst_abs if os.path.exists(dst_abs): raise FileExistsError(f"Target already exists: {dst_abs}") os.rename(src_abs, dst_abs) return dst_abs for current_root, dirs, files in os.walk(root_path, topdown=False): for name in files: src = os.path.join(current_root, name) dst = os.path.join(current_root, name.lower()) if src == dst: continue try: new_path = safe_case_rename(src, dst) renamed.append((src, new_path)) log(f"Renamed file: {src} -> {new_path}") except Exception as ex: errors.append(f"Failed to rename\n{src}\n->\n{dst}\n{ex}") log(f"ERROR renaming file: {src} -> {dst} ({ex})") for name in dirs: src = os.path.join(current_root, name) dst = os.path.join(current_root, name.lower()) if src == dst: continue try: new_path = safe_case_rename(src, dst) renamed.append((src, new_path)) log(f"Renamed dir: {src} -> {new_path}") except Exception as ex: errors.append(f"Failed to rename\n{src}\n->\n{dst}\n{ex}") log(f"ERROR renaming dir: {src} -> {dst} ({ex})") parent = os.path.dirname(root_path) base = os.path.basename(root_path) lower_base = base.lower() if base != lower_base: src = root_path dst = os.path.join(parent, lower_base) try: final_root = safe_case_rename(src, dst) renamed.append((src, final_root)) log(f"Renamed root dir: {src} -> {final_root}") except Exception as ex: errors.append(f"Failed to rename\n{src}\n->\n{dst}\n{ex}") log(f"ERROR renaming root dir: {src} -> {dst} ({ex})") return renamed, errors, final_root def convert_device_paths_to_lowercase(): start_dir = "/storage/.config/eka2l1/data" try: target_dir = choose_directory_interactive( "Lowercase Converter: Select Folder", start_dir ) except GoBack: return warning = "" abs_target = os.path.abspath(target_dir) if abs_target == "/": warning = "\n\nWARNING:\nThis will rename files and folders recursively from the root directory." elif abs_target == "/storage": warning = "\n\nWARNING:\nThis will rename the complete contents of /storage recursively." if not confirm_dialog( "Confirm Lowercase Conversion", "Convert folder names and file names to lowercase recursively?\n\n" f"Selected folder:\n{target_dir}{warning}" ): return clear_screen() print("Converting names to lowercase...", flush=True) renamed, errors, final_root = convert_tree_to_lowercase(target_dir) if errors: preview = "\n\n".join(errors[:3]) more = "" if len(errors) > 3: more = f"\n\n... and {len(errors) - 3} more error(s)." ok_dialog( "Conversion Result", f"Conversion stopped with errors.\n\n" f"Renamed: {len(renamed)}\n" f"Errors: {len(errors)}\n\n" f"{preview}{more}\n\nSee log: {EKA_LOG}" ) return if not renamed: ok_dialog( "Conversion Result", f"Nothing to rename.\n\nAll names are already lowercase in:\n{target_dir}" ) return renamed_sorted = sorted(renamed, key=lambda item: item[1].lower()) options = [f"{os.path.basename(new)} <= {os.path.basename(old)}" for old, new in renamed_sorted] selected = 0 offset = 0 visible = 14 while True: if selected < offset: offset = selected elif selected >= offset + visible: offset = selected - visible + 1 offset = max(0, min(offset, max(0, len(options) - visible))) show_menu( "Lowercase Conversion Result", options, selected, f"Converted: {len(renamed)}\nFinal folder: {final_root}\n\nPress A or B to return.", offset, visible ) key = controller.wait_for_input() if key == "select": raise UserQuit() elif key == "up": selected = max(0, selected - 1) elif key == "down": selected = min(len(options) - 1, selected + 1) elif key == "left": selected = max(0, selected - visible) elif key == "right": selected = min(len(options) - 1, selected + visible) elif key in ("a", "b"): return # --------------------------------------------------------------------------- # Mode 1: Install firmware # --------------------------------------------------------------------------- def install_firmware(): try: bios_dir = choose_directory_interactive( "Firmware: Select Directory", EKA_BIOS_DIR) except GoBack: return rpkg_files = sorted(glob.glob(os.path.join(bios_dir, "*.rpkg")) + glob.glob(os.path.join(bios_dir, "*.RPKG"))) rom_files = sorted(glob.glob(os.path.join(bios_dir, "*.rom")) + glob.glob(os.path.join(bios_dir, "*.ROM"))) if not rpkg_files: ok_dialog("Error", f"No .rpkg file found in:\n{bios_dir}") return if not rom_files: ok_dialog("Error", f"No .rom file found in:\n{bios_dir}") return rpkg = rpkg_files[0] if len(rpkg_files) > 1: try: idx = select_from_list("Select RPKG", [os.path.basename(f) for f in rpkg_files]) if idx is None: return rpkg = rpkg_files[idx] except GoBack: return rom = rom_files[0] if len(rom_files) > 1: try: idx = select_from_list("Select ROM", [os.path.basename(f) for f in rom_files]) if idx is None: return rom = rom_files[idx] except GoBack: return info = ( f"RPKG: {os.path.basename(rpkg)}\n" f"ROM: {os.path.basename(rom)}\n\n" f"Install firmware?" ) if not confirm_dialog("Install Firmware", info): return seed_dir = os.path.join(EKA_CONFIG, "data", "roms", "rm-409") os.makedirs(seed_dir, exist_ok=True) try: shutil.copy2(rom, os.path.join(seed_dir, os.path.basename(rom))) except Exception: pass clear_screen() print("Installing firmware...", flush=True) print(f" {os.path.basename(rpkg)}", flush=True) print(f" {os.path.basename(rom)}", flush=True) print("\nThis may take a few minutes...", flush=True) ret = run_eka(["--installdevice", rpkg, rom]) if eka_success(ret): ok_dialog("Done", "Firmware installed successfully!\n\n(Non-zero exit after install is normal)") else: ok_dialog("Error", f"Installation failed (code {ret})\n\nSee log: {EKA_LOG}") # --------------------------------------------------------------------------- # Mode 2: Install SIS games # --------------------------------------------------------------------------- def find_sis_files_recursive(root_dir: str) -> List[str]: sis_files: List[str] = [] valid_exts = (".sis", ".sisx") for current_root, _, files in os.walk(root_dir): for name in files: if name.lower().endswith(valid_exts): sis_files.append(os.path.join(current_root, name)) return sorted(sis_files, key=lambda p: p.lower()) def get_relative_path(path: str, base: str) -> str: try: rel = os.path.relpath(path, base) return rel.replace("\\", "/") except Exception: return os.path.basename(path) def parse_listapp_to_map(output: str) -> dict: app_map = {} for name, uid in parse_listapp_output(output): app_map[uid.lower()] = name.strip() return app_map def get_installed_apps_map() -> dict: ret, output = run_eka_capture(["--listapp"]) if ret != 0 and not output.strip(): return {} return parse_listapp_to_map(output) def find_new_app_after_install(before_apps: dict, after_apps: dict) -> Optional[Tuple[str, str]]: new_uids = [uid for uid in after_apps if uid not in before_apps] if len(new_uids) == 1: uid = new_uids[0] return after_apps[uid], uid candidates = [] for uid in new_uids: name = after_apps[uid] if not is_system_app(name): candidates.append((name, uid)) if len(candidates) == 1: return candidates[0] if candidates: return candidates[0] return None def find_graphic_in_same_folder(folder: str) -> Optional[str]: exts = (".png", ".jpg", ".jpeg", ".bmp", ".gif", ".webp") candidates = [] try: for name in os.listdir(folder): full = os.path.join(folder, name) if os.path.isfile(full) and name.lower().endswith(exts): candidates.append(full) except Exception: return None if not candidates: return None return sorted(candidates, key=lambda p: os.path.basename(p).lower())[0] def copy_matching_image_for_uid(source_folder: str, app_name: str, uid_output_dir: str) -> Optional[str]: image_src = find_graphic_in_same_folder(source_folder) if not image_src: return None os.makedirs(uid_output_dir, exist_ok=True) safe_name = sanitize_uid_name(app_name) ext = os.path.splitext(image_src)[1].lower() target_name = f"{safe_name}{ext}" target_path = os.path.join(uid_output_dir, target_name) try: shutil.copy2(image_src, target_path) log(f"Copied artwork: {image_src} -> {target_path}") return target_name except Exception as ex: log(f"Failed to copy artwork {image_src} -> {target_path}: {ex}") return None def install_sis(): try: sis_dir = choose_directory_interactive( "SIS/SISX: Select Directory", EKA_ROMS_DIR) except GoBack: return sis_files = find_sis_files_recursive(sis_dir) if not sis_files: ok_dialog("Error", f"No .sis or .sisx files found in:\n{sis_dir}") return image_out_dir = os.path.join(sis_dir, "media", "images") try: mode_idx = select_from_list( "SIS/SISX Installer Mode", [ "Install all SIS/SISX files (recursive)", "Select SIS/SISX files individually (recursive)", ], f"{len(sis_files)} file(s) found recursively in:\n{sis_dir}" ) except GoBack: return if mode_idx is None: return selected_files = [] if mode_idx == 0: if not confirm_dialog( "Install All", f"Install all {len(sis_files)} SIS/SISX files recursively?\n\nDirectory:\n{sis_dir}" ): return selected_files = sis_files else: sis_options = [get_relative_path(f, sis_dir) for f in sis_files] try: selected_indexes = select_multiple_from_list( "Select SIS/SISX Files", sis_options, f"Directory:\n{sis_dir}\n\nToggle files with A, press Y to install.", visible=14 ) except GoBack: return if not selected_indexes: ok_dialog("SIS/SISX Installer", "No SIS/SISX files selected.") return selected_files = [sis_files[i] for i in selected_indexes] if not confirm_dialog( "Install Selected", f"Install {len(selected_files)} selected SIS/SISX file(s)?" ): return success = 0 fail = 0 failed_files = [] artwork_copied = 0 artwork_failed = 0 for pos, sis_file in enumerate(selected_files, start=1): clear_screen() rel_name = get_relative_path(sis_file, sis_dir) print(f"Installing {pos}/{len(selected_files)}:") print(f" {rel_name}") before_apps = get_installed_apps_map() ret = run_eka(["--install", sis_file]) after_apps = get_installed_apps_map() if eka_success(ret): success += 1 log(f"SIS/SISX installed successfully: {sis_file}") new_app = find_new_app_after_install(before_apps, after_apps) if new_app: app_name, uid = new_app copied_name = copy_matching_image_for_uid( os.path.dirname(sis_file), app_name, image_out_dir ) if copied_name: artwork_copied += 1 log(f"Matched artwork for app '{app_name}' ({uid}): {copied_name}") else: artwork_failed += 1 log(f"No artwork copied for app '{app_name}' ({uid}) from folder {os.path.dirname(sis_file)}") else: artwork_failed += 1 log(f"Could not determine new app UID/name after install: {sis_file}") else: fail += 1 failed_files.append(rel_name) log(f"SIS/SISX install failed ({ret}): {sis_file}") if fail == 0: ok_dialog( "Done", f"Installation completed successfully.\n\n" f"Installed: {success}\n" f"Failed: {fail}\n" f"Artwork copied: {artwork_copied}\n" f"Artwork unresolved: {artwork_failed}\n\n" f"Artwork target:\n{image_out_dir}" ) else: preview = "\n".join(failed_files[:8]) more = "" if len(failed_files) > 8: more = f"\n... and {len(failed_files) - 8} more" ok_dialog( "Installation Result", f"Completed.\n\n" f"Installed: {success}\n" f"Failed: {fail}\n" f"Artwork copied: {artwork_copied}\n" f"Artwork unresolved: {artwork_failed}\n\n" f"Failed files:\n{preview}{more}\n\nSee log:\n{EKA_LOG}" ) # --------------------------------------------------------------------------- # UID launcher creator # --------------------------------------------------------------------------- def parse_listapp_output(output: str) -> List[Tuple[str, str]]: apps: List[Tuple[str, str]] = [] for raw_line in output.splitlines(): line = raw_line.strip() match = re.match(r'^\d+\s*:\s*(.*?)\s*\(UID:\s*(0x[0-9a-fA-F]+)\)\s*$', line) if match: name = match.group(1).strip() uid = match.group(2).strip().lower() apps.append((name, uid)) return apps def sanitize_uid_name(name: str) -> str: name = re.sub(r'[\\/:*?"<>|]', '_', name) name = name.replace("'", "_") name = re.sub(r'\s+', ' ', name).strip() while name.startswith('.'): name = '_' + name[1:] if not name: name = 'unnamed' return name def is_system_app(name: str) -> bool: name_lc = name.lower().strip() system_names = { '', 'installer', 'applications', 'help', 'screensaver', 'telephone', 'app. manager', 'messaging', 'recorder', 'multimedia', 'settings', 'call divert', 'sysap', 'startup', 'voice mailbox', 'profiles', 'to-do', 'calendar', 'calculator', 'clock', 'notes', 'speed dial', 'favourites', 'bluetooth', 'ussd', 'composer', 'fixed dialling', 'autolock', 'save certificate', 'info message', 'bounce', 'about product', 'services', 'pushviewer', 'download', 'realone player', 'screen shot', 'memory card', 'converter', 'videoui', 'contacts', 'images', 'menu', 'cell broadcast', 'log', 'e-mail', 'sim services', 'service nos.', 'sim directory', 'radio', 'music player', 'unlockmmc' } return name_lc in system_names def build_uid_candidates(apps: List[Tuple[str, str]]) -> Tuple[List[Tuple[str, str]], int, int, int]: candidates: List[Tuple[str, str]] = [] seen_uids = set() skipped_system = 0 skipped_blank = 0 skipped_dup = 0 for name, uid in apps: name = name.strip() uid = uid.strip().lower() if not name: skipped_blank += 1 continue if uid in seen_uids: skipped_dup += 1 continue if is_system_app(name): seen_uids.add(uid) skipped_system += 1 continue seen_uids.add(uid) candidates.append((name, uid)) return candidates, skipped_system, skipped_blank, skipped_dup def show_multi_select_menu(title: str, options: List[str], checked: set, selected: int = 0, info: str = "", offset: int = 0, visible: int = 16) -> None: clear_screen() print("=" * 72) print(f" E K A 2 L 1 I N S T A L L E R - {title}") print("=" * 72) if info: print(f"\n{info}\n") total = len(options) end = min(offset + visible, total) for i in range(offset, end): cursor = " > " if i == selected else " " mark = "[x]" if i in checked else "[ ]" print(f"{cursor}{mark} {options[i]}") if end < total: print(" ...") print("\n" + "-" * 72) print("D-Pad: Navigate | A: Toggle | Y: Create Selected | B: Back | Select: Quit") print("-" * 72) sys.stdout.flush() def select_multiple_from_list(title: str, items: List[str], info: str = "", visible: int = 16) -> Optional[List[int]]: if not items: return [] total = len(items) selected = 0 offset = 0 checked = set() while True: if selected < offset: offset = selected elif selected >= offset + visible: offset = selected - visible + 1 offset = max(0, min(offset, max(0, total - visible))) show_multi_select_menu(title, items, checked, selected, info, offset, visible) key = controller.wait_for_input() if key == 'select': raise UserQuit() elif key == 'up': selected = max(0, selected - 1) elif key == 'down': selected = min(total - 1, selected + 1) elif key == 'left': selected = max(0, selected - visible) elif key == 'right': selected = min(total - 1, selected + visible) elif key == 'a': if selected in checked: checked.remove(selected) else: checked.add(selected) elif key == 'y': return sorted(checked) elif key == 'b': raise GoBack() def show_available_uid_apps(candidates: List[Tuple[str, str]]) -> None: if not candidates: ok_dialog('Available Apps', 'No launchable non-system apps found.') return options = [f'{name} ({uid})' for name, uid in candidates] selected = 0 offset = 0 visible = 14 while True: if selected < offset: offset = selected elif selected >= offset + visible: offset = selected - visible + 1 offset = max(0, min(offset, max(0, len(options) - visible))) show_menu( 'Available Apps', options, selected, f'Available launchable apps: {len(candidates)}\n\nPress A to continue or B to go back.', offset, visible ) key = controller.wait_for_input() if key == 'select': raise UserQuit() elif key == 'up': selected = max(0, selected - 1) elif key == 'down': selected = min(len(options) - 1, selected + 1) elif key == 'left': selected = max(0, selected - visible) elif key == 'right': selected = min(len(options) - 1, selected + visible) elif key == 'a': return elif key == 'b': raise GoBack() def show_generated_uid_list(created_entries: List[Tuple[str, str, str]], out_dir: str) -> None: if not created_entries: ok_dialog('Generated UID Files', f'No UID files were created.\n\nOutput: {out_dir}') return options = [f"{name} -> {uid} [{filename}]" for name, uid, filename in created_entries] selected = 0 offset = 0 visible = 14 while True: if selected < offset: offset = selected elif selected >= offset + visible: offset = selected - visible + 1 offset = max(0, min(offset, max(0, len(options) - visible))) show_menu( 'Generated UID Files', options, selected, f'Output: {out_dir}\nCreated: {len(created_entries)}\n\nPress A or B to return.', offset, visible ) key = controller.wait_for_input() if key == 'select': raise UserQuit() elif key == 'up': selected = max(0, selected - 1) elif key == 'down': selected = min(len(options) - 1, selected + 1) elif key == 'left': selected = max(0, selected - visible) elif key == 'right': selected = min(len(options) - 1, selected + visible) elif key in ('a', 'b'): return def write_uid_files(selected_apps: List[Tuple[str, str]], out_dir: str) -> List[Tuple[str, str, str]]: created_entries: List[Tuple[str, str, str]] = [] os.makedirs(out_dir, exist_ok=True) for name, uid in selected_apps: safe_name = sanitize_uid_name(name) target = os.path.join(out_dir, f'{safe_name}.uid') if os.path.exists(target): target = os.path.join(out_dir, f'{safe_name}_{uid}.uid') try: with open(target, 'w', encoding='utf-8') as f: f.write(uid + '\n') log(f'Created UID launcher: {target} -> {uid}') created_entries.append((name, uid, os.path.basename(target))) except Exception as ex: log(f'Failed to create UID launcher {target}: {ex}') return created_entries def xml_escape(text: str) -> str: return (text.replace("&", "&") .replace("<", "<") .replace(">", ">") .replace('"', """) .replace("'", "'")) def create_uid_gamelist(): try: uid_dir = choose_directory_interactive( "Gamelist: Select UID Directory", EKA_ROMS_DIR) except GoBack: return uid_files = sorted(glob.glob(os.path.join(uid_dir, "*.uid")) + glob.glob(os.path.join(uid_dir, "*.UID"))) if not uid_files: ok_dialog("Error", f"No .uid files found in:\n{uid_dir}") return out_file = os.path.join(uid_dir, "gamelist.xml") image_dir = os.path.join(uid_dir, "media", "images") if os.path.exists(out_file): if not confirm_dialog( "Overwrite?", f"gamelist.xml already exists in:\n{uid_dir}\n\nOverwrite it?" ): return lines = ['', ''] for uid_file in uid_files: base = os.path.basename(uid_file) name = os.path.splitext(base)[0] image_tag = "./media/images/ngage.png" for ext in (".png", ".jpg", ".jpeg", ".bmp", ".gif", ".webp"): candidate = os.path.join(image_dir, name + ext) if os.path.exists(candidate): image_tag = f"./media/images/{xml_escape(name + ext)}" break lines.append('\t') lines.append(f'\t\t./{xml_escape(base)}') lines.append(f'\t\t{xml_escape(name)}') lines.append(f'\t\t{xml_escape(name)}') lines.append(f'\t\t{image_tag}') lines.append('\t\t') lines.append('\t') lines.append('') try: with open(out_file, "w", encoding="utf-8", newline="\n") as f: f.write("\n".join(lines) + "\n") except Exception as ex: log(f"Failed to write gamelist.xml {out_file}: {ex}") ok_dialog("Error", f"Failed to write gamelist.xml:\n{ex}") return ok_dialog( "Done", f"gamelist.xml created successfully.\n\n" f"UID files: {len(uid_files)}\n" f"Output:\n{out_file}" ) def create_uid_launchers(): try: out_dir = choose_directory_interactive( 'UID Creator: Select Output Directory', '/storage/roms') except GoBack: return clear_screen() print('Loading installed app list...', flush=True) ret, output = run_eka_capture(['--listapp']) apps = parse_listapp_output(output) if ret != 0 and not apps: ok_dialog('Error', f'Could not get app list.\n\nSee log: {EKA_LOG}') return if not apps: ok_dialog('Error', 'No installed apps found.') return candidates, skipped_system, skipped_blank, skipped_dup = build_uid_candidates(apps) candidates = sorted(candidates, key=lambda item: (item[0].lower(), item[1])) if not candidates: ok_dialog('Error', 'No launchable non-system apps found.') return try: show_available_uid_apps(candidates) mode_idx = select_from_list( 'UID Creator Mode', ['Create all UID launcher files', 'Select apps individually'], f'Output: {out_dir}\n\nAvailable apps: {len(candidates)}' ) except GoBack: return if mode_idx is None: return selected_apps: List[Tuple[str, str]] = [] if mode_idx == 0: if not confirm_dialog( 'Create All UID Files', f'Create {len(candidates)} UID launcher files in:\n\n{out_dir}' ): return selected_apps = candidates else: app_options = [f'{name} ({uid})' for name, uid in candidates] try: selected_indexes = select_multiple_from_list( 'Select Apps For UID', app_options, f'Output: {out_dir}\n\nToggle apps with A, then press Y to create.', visible=14 ) except GoBack: return if not selected_indexes: ok_dialog('UID Creator', 'No apps selected.') return selected_apps = [candidates[i] for i in selected_indexes] if not confirm_dialog( 'Create Selected UID Files', f'Create {len(selected_apps)} selected UID launcher files in:\n\n{out_dir}' ): return created_entries = write_uid_files(selected_apps, out_dir) ok_dialog( 'Done', f'UID launcher creation finished.\n\n' f'Output: {out_dir}\n\n' f'Requested: {len(selected_apps)}\n' f'Created: {len(created_entries)}\n' f'Skipped system apps: {skipped_system}\n' f'Skipped blank names: {skipped_blank}\n' f'Skipped duplicate UIDs: {skipped_dup}' ) show_generated_uid_list(created_entries, out_dir) # --------------------------------------------------------------------------- # Main # --------------------------------------------------------------------------- DEFAULT_CONFIG_YML = """bkg-path: "" font: "" log-read: false log-write: false log-ipc: false log-svc: false log-passed: false log-exports: false cpu: dynarmic device: 0 language: 1 emulator-language: -1 enable-gdb-stub: false data-storage: data gdb-port: 24689 internet-bluetooth-port: 35689 enable-srv-rights: true enable-srv-sa: true enable-srv-drm: true fbs-enable-compression-queue: false enable-btrace: false stop-warn-touchscreen-disabled: false dump-imb-range-code: false hide-mouse-in-screen-space: false enable-nearest-neighbor-filter: true integer-scaling: true cpu-load-save: true mime-detection: true rtos-level: "" ui-new-style: true svg-icon-cache-reset: true imei: 540806859904945 mmc-id: 00000000-00000000-00000000-00000000 audio-master-volume: 100 current-keybind-profile: default screen-buffer-sync: preferred report-mmfdev-underflow: false disable-display-content-scale: false device-display-name: EKA2L1 midi-backend: tsf hsb-bank-path: resources/defaultbank.hsb sf2-bank-path: resources/defaultbank.sf2 bt-central-server-url: btnetplay.12z1.com background-image: "" background-image-opacity: 255 enable-hw-gles1: true log-filter: "*:trace" hide-system-apps: true btnet-port-offset: 15000 btnet-password: "" btnet-discovery-mode: 0 enable-upnp: true extensive-logging: false internet-bluetooth-friends: [] """ def _create_default_config(): cfg_path = os.path.join(EKA_CONFIG, "config.yml") if not os.path.exists(cfg_path): try: with open(cfg_path, "w") as f: f.write(DEFAULT_CONFIG_YML) log("Created default config.yml") return True except Exception as ex: log(f"Failed to create config.yml: {ex}") return False def _seed_bundled_files(): install_dir = "/usr/bin/eka2l1" if not os.path.isdir(install_dir): ok_dialog("Error", f"eka2l1 install directory not found:\n{install_dir}") return clear_screen() print("Seeding bundled data...", flush=True) seeded = [] for item in os.listdir(install_dir): src = os.path.join(install_dir, item) dst = os.path.join(EKA_CONFIG, item) if not os.path.exists(dst): try: if os.path.isdir(src): shutil.copytree(src, dst) else: shutil.copy2(src, dst) seeded.append(item) log(f"Seeded: {item}") print(f" {item}", flush=True) except Exception as ex: log(f"Seed failed for {item}: {ex}") cfg_created = _create_default_config() if cfg_created: seeded.append("config.yml (default)") print(" config.yml (default)", flush=True) if seeded: ok_dialog("Seed Bundled Files", f"Done!\n\nCopied {len(seeded)} item(s) into:\n{EKA_CONFIG}\n\nYou can now install firmware and games.") else: ok_dialog("Seed Bundled Files", "Nothing to seed - all files already present.") def _autoset_device_from_zdrive(): devices_yml = os.path.join(EKA_CONFIG, "data", "devices.yml") z_drives_dir = os.path.join(EKA_CONFIG, "data", "drives", "z") cfg_path = os.path.join(EKA_CONFIG, "config.yml") if not os.path.isfile(devices_yml) or not os.path.isdir(z_drives_dir): return device_keys = [] try: with open(devices_yml, "r") as f: for line in f: stripped = line.rstrip() if stripped and not stripped.startswith(" ") and stripped.endswith(":"): device_keys.append(stripped[:-1]) except Exception as ex: log(f"_autoset_device_from_zdrive: could not read devices.yml: {ex}") return available_z = { d.lower(): d for d in os.listdir(z_drives_dir) if os.path.isdir(os.path.join(z_drives_dir, d)) } match_index = None for i, key in enumerate(device_keys): if key.lower() in available_z: match_index = i log(f"_autoset_device_from_zdrive: matched device {key} at index {i}") break if match_index is None: log("_autoset_device_from_zdrive: no matching Z-drive found") return if not os.path.isfile(cfg_path): _create_default_config() try: with open(cfg_path, "r") as f: lines = f.readlines() new_lines = [] for line in lines: if line.startswith("device:"): new_lines.append(f"device: {match_index}\n") else: new_lines.append(line) with open(cfg_path, "w") as f: f.writelines(new_lines) log(f"_autoset_device_from_zdrive: set device: {match_index}") except Exception as ex: log(f"_autoset_device_from_zdrive: failed to update config.yml: {ex}") def _import_preconfigured(): try: src_dir = choose_directory_interactive( "Select source directory (must contain a 'data' folder)", "/storage/roms/bios/eka2l1" ) except GoBack: return data_src = os.path.join(src_dir, "data") if not os.path.isdir(data_src): ok_dialog("Error", f"No 'data' folder found in:\n{src_dir}\n\nPlease select a directory that contains a pre-configured eka2l1 'data' folder.") return data_dst = os.path.join(EKA_CONFIG, "data") os.makedirs(data_dst, exist_ok=True) clear_screen() print(f"Importing data from:\n {data_src}", flush=True) print("Only adding new files - existing files will not be overwritten.", flush=True) log(f"Importing pre-configured data from: {data_src}") added = 0 skipped = 0 for root, dirs, files in os.walk(data_src): rel = os.path.relpath(root, data_src) dst_root = os.path.join(data_dst, rel) if rel != "." else data_dst os.makedirs(dst_root, exist_ok=True) for fname in files: src_file = os.path.join(root, fname) dst_file = os.path.join(dst_root, fname) if fname == "devices.yml" and os.path.exists(dst_file): backup = dst_file + ".bak" try: shutil.copy2(dst_file, backup) shutil.copy2(src_file, dst_file) log(f"Overwritten with backup: {dst_file}") added += 1 except Exception as ex: log(f"Failed to overwrite devices.yml: {ex}") skipped += 1 continue if not os.path.exists(dst_file): try: shutil.copy2(src_file, dst_file) log(f"Added: {dst_file}") added += 1 except Exception as ex: log(f"Failed to copy {src_file}: {ex}") skipped += 1 else: skipped += 1 _autoset_device_from_zdrive() ok_dialog("Import Complete", f"Import finished!\n\n" f"Added: {added} file(s)\n" f"Skipped (already exist): {skipped} file(s)\n\n" f"devices.yml overwritten (backup: devices.yml.bak)\n" f"Device index auto-set to match available firmware.") def first_run_setup(): _seed_bundled_files() def main(): preferred = sys.argv[1] if len(sys.argv) > 1 else None init_controller(preferred) os.makedirs(EKA_CONFIG, exist_ok=True) try: with open(EKA_LOG, "w") as f: f.write("EmuELEC eka2l1 Commander Log\n") except Exception: pass clear_screen() print("Starting eka2l1 Commander...", flush=True) time.sleep(0.5) try: while True: try: idx = select_from_list( "Main Menu", [ "[ RUN THIS FIRST ! ] : Setup eka2l1 (copy needed files to EmuELEC)", "Import pre-configured devices-collection", "Install firmware (.rpkg + .rom)", "Install games and apps (.sis/.sisx)", "Create UID launcher-files from installed games and apps (.uid)", "Create gamelist.xml from .uid launcher-files", "Show / change current device", "Convert uppercase device paths and files to lowercase", "Exit", ], "What would you like to do?" ) if idx is None or idx == 8: break if idx == 0: try: first_run_setup() except GoBack: continue elif idx == 1: try: _import_preconfigured() except GoBack: continue elif idx == 2: try: install_firmware() except GoBack: continue elif idx == 3: try: install_sis() except GoBack: continue elif idx == 4: try: create_uid_launchers() except GoBack: continue elif idx == 5: try: create_uid_gamelist() except GoBack: continue elif idx == 6: try: change_device() except GoBack: continue elif idx == 7: try: convert_device_paths_to_lowercase() except GoBack: continue except GoBack: continue except UserQuit: pass except KeyboardInterrupt: pass finally: clear_screen() print("Exiting eka2l1 Commander...", flush=True) time.sleep(0.5) if controller: controller.close() if __name__ == "__main__": main() ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/Skyscraper.start ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile ee_console enable while pgrep -f emulationstation; do clear /dev/tty0 echo "Waiting for Emulationstation to quit" > /dev/tty0 sleep 1 done source /usr/bin/env.sh source "$scriptdir/scriptmodules/supplementary/skyscraper.sh" rp_registerAllModules joy2keyStart romdir="/storage/roms/" gui_skyscraper ee_console disable systemctl start emustation ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/btconnect.sh ================================================ #!/bin/bash # Bluetooth connect: ES overlays, audio devices only set -euo pipefail . /etc/profile LOG="/tmp/btconnect.log" RESTART=1 [ "${NO_ES_RESTART:-}" = "1" ] && RESTART=0 if [ "${1:-}" = "--no-restart" ]; then RESTART=0; shift; fi overlay_yes() { ee_console disable text_viewer -y -w -t "$1" -f 24 -m "$2" rc=$?; rm -f /tmp/display [ "$rc" -eq 21 ] || [ "$rc" -eq 0 ] } overlay_msg() { ee_console disable; text_viewer -w -t "$1" -f 24 -m "$2"; rm -f /tmp/display; } overlay_err() { ee_console disable; text_viewer -e -w -t "$1" -f 24 -m "$2"; rm -f /tmp/display; } is_audio_mac() { local mac="$1" info info="$(bluetoothctl info "$mac" 2>/dev/null || true)" echo "$info" | grep -qiE 'Icon:\s*audio-' && return 0 echo "$info" | grep -qiE 'UUID.*(A2DP|Audio Sink|Headset|Handsfree)' && return 0 return 1 } run_connect() { local MAC_IN="${1:-}" [ -z "$MAC_IN" ] && [ -f /storage/.config/btaudio.last ] && MAC_IN="$(cat /storage/.config/btaudio.last)" [ -z "$MAC_IN" ] && { overlay_err "MISSING" "Usage: btconnect.sh [--no-restart] AA:BB:CC:DD:EE:FF"; exit 1; } local BTMAC BTID CARD SINK BTMAC="$(echo "$MAC_IN" | tr '[:lower:]' '[:upper:]')" is_audio_mac "$BTMAC" || { overlay_err "CANCEL" "Not an audio device."; exit 2; } BTID="${BTMAC//:/_}" CARD="bluez_card.$BTID" pgrep -f "pulseaudio.*--system" >/dev/null || { pulseaudio --system --disallow-exit --disable-shm --log-level=error &>>"$LOG" & sleep 2 } if ! bluetoothctl info "$BTMAC" 2>/dev/null | grep -q "Paired: yes"; then bluetoothctl power on >>"$LOG" 2>&1 || true bluetoothctl pairable on >>"$LOG" 2>&1 || true bluetoothctl pair "$BTMAC" >>"$LOG" 2>&1 || true bluetoothctl trust "$BTMAC" >>"$LOG" 2>&1 || true else bluetoothctl trust "$BTMAC" >>"$LOG" 2>&1 || true fi local connected=0 for i in {1..6}; do bluetoothctl connect "$BTMAC" >>"$LOG" 2>&1 || true bluetoothctl info "$BTMAC" 2>/dev/null | grep -q "Connected: yes" && { connected=1; break; } sleep 2 done [ "$connected" -eq 1 ] || { overlay_err "ERROR" "Connect failed. See $LOG"; exit 1; } for _ in {1..12}; do pactl list cards short | grep -q "$CARD" && break; sleep 1; done pactl set-card-profile "$CARD" a2dp_sink >/dev/null 2>&1 || true SINK="" for _ in {1..12}; do SINK=$(pactl list short sinks | awk '{print $2}' | grep -E "bluez_sink\.${BTID}(\.a2dp_sink)?") || true [ -n "$SINK" ] && break; sleep 1 done [ -n "$SINK" ] || { overlay_err "ERROR" "No A2DP sink found."; exit 1; } pactl set-default-sink "$SINK" >/dev/null 2>&1 || true pactl set-sink-mute "$SINK" 0 >/dev/null 2>&1 || true pactl set-sink-volume "$SINK" 100% >/dev/null 2>&1 || true for id in $(pactl list short sink-inputs | awk '{print $1}'); do pactl move-sink-input "$id" "$SINK" >/dev/null 2>&1 || true; done pactl list modules short | grep -q module-switch-on-connect || pactl load-module module-switch-on-connect >/dev/null 2>&1 || true echo "$BTMAC" > /storage/.config/btaudio.last overlay_msg "STATUS" "Active sink: $SINK\n" [ "$RESTART" -eq 1 ] && systemctl restart emustation } if overlay_yes "CONNECT LAST BLUETOOTH AUDIO DEVICE" "Audio devices only. A2DP enforced.\n\n\n[YES]=Continue and exit to Emulationstation\n\n\n[No]=Cancel"; then run_connect "${1:-}" fi ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/btsetup.sh ================================================ #!/bin/bash # ES Bluetooth setup (audio devices only) with Yes/Exit selection set -euo pipefail . /etc/profile LOG="/tmp/btsetup.log" ee_console enable cleanup() { ee_console disable rm -f /tmp/display [ -n "${BTCTL_PID:-}" ] && kill "$BTCTL_PID" >/dev/null 2>&1 || true } trap cleanup EXIT ask_yes() { text_viewer -y -w -t "$1" -f 24 -m "$2" rc=$? case "$rc" in 21) # A button return 0 # Yes ;; 0) # B button return 1 # No/Exit ;; *) return 1 # any other keys treated as No ;; esac } ensure_pa() { pgrep -f "pulseaudio.*--system" >/dev/null || { pulseaudio --system --disallow-exit --disable-shm --log-level=error &>>"$LOG" & sleep 2 } } # Persistent bluetoothctl session for stable pairing coproc BTCTL { bluetoothctl >>"$LOG" 2>&1; } BTFD="${BTCTL[1]}" # write fd bt() { printf '%s\n' "$*" >&"$BTFD"; } bt_init() { bt "power on" bt "pairable on" bt "agent NoInputNoOutput" bt "default-agent" } scan_start() { bt "scan on"; } scan_stop() { bt "scan off"; } is_audio_mac() { local mac="$1" info info="$(bluetoothctl info "$mac" 2>/dev/null || true)" echo "$info" | grep -qiE 'Icon:\s*audio-' && return 0 echo "$info" | grep -qiE 'UUID.*(A2DP|Audio Sink|Headset|Handsfree)' && return 0 return 1 } scan_audio_devices() { scan_start; sleep 10 bluetoothctl devices \ | awk '/^Device/ { mac=$2; $1=$2=""; sub(/^ /,""); print mac "|" $0 }' \ | while IFS='|' read -r mac name; do [ -z "$mac" ] && continue is_audio_mac "$mac" && echo "${mac}|${name}" done scan_stop } pair_trust_connect() { local mac="$1" bluetoothctl info "$mac" >/dev/null 2>&1 || bt "remove $mac" if ! bluetoothctl info "$mac" 2>/dev/null | grep -q "Paired: yes"; then bt "pair $mac" for i in {1..10}; do bluetoothctl info "$mac" 2>/dev/null | grep -q "Paired: yes" && break sleep 1 done fi bt "trust $mac" scan_stop for i in {1..8}; do bt "connect $mac" bluetoothctl info "$mac" 2>/dev/null | grep -q "Connected: yes" && return 0 sleep 2 done # Fallback: re-pair bt "remove $mac"; sleep 1 bt "pair $mac"; sleep 2 bt "trust $mac" for i in {1..6}; do bt "connect $mac" bluetoothctl info "$mac" 2>/dev/null | grep -q "Connected: yes" && return 0 sleep 2 done return 1 } main() { ensure_pa bt_init ask_yes "BLUETOOTH SETUP" \ "Put the audio device in pairing mode, then press YES to start scan.\n\nBe patient until the scan is done, it takes some seconds.\n\n\n[Yes]=Scan [No]=Exit" || return 0 while true; do mapfile -t DEVLIST < <(scan_audio_devices) if [ ${#DEVLIST[@]} -eq 0 ]; then ask_yes "NO AUDIO DEVICES" \ "Nothing found.\n\n[Yes]=Scan again [No]=Exit" \ && continue || return 1 fi LAST_MAC="" for entry in "${DEVLIST[@]}"; do mac="${entry%%|*}" name="${entry#*|}" if ask_yes "AUDIO DEVICE" \ "Name: ${name}\nMAC: ${mac}\n\n[Yes]=Connect [No]=Cancel"; then if pair_trust_connect "$mac"; then echo "$mac" > /storage/.config/btaudio.last LAST_MAC="$mac" text_viewer -w -t "SUCCESS" -f 24 -m "Connected: ${name}" else text_viewer -w -t "ERROR" -f 24 -m "Pair/connect failed." fi break # stop after first attempt else break 2 # B button: abort entire scan cycle fi done ask_yes "CONNECTION COMPLETED" \ "Scan again (YES) or exit to Emulationstation (NO)?\n" \ && continue || break done } main ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/cmdmaker.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2026-present worstcase_scenario (https://github.com/worstcase-scenario) # Source predefined functions and variables . /etc/profile CMD_MAKER_SCRIPT="/usr/bin/scripts/setup/CMD_MAKER.py" function cmdmaker_confirm() { text_viewer -y -w -t "C M D M A K E R" -f 24 -m "Welcome to the .cmd Maker.\n\nThis script will guide you through creating .cmd files for MAME ROMs.\n\nController Navigation:\n\n- D-Pad: Navigate menus\n- A/Start: Confirm selection\n- B: Go back\n- Select: Exit program\n\nContinue?" if [[ $? == 21 ]]; then if cmdmaker_start; then text_viewer -w -t "CMD MAKER" -f 24 -m "\nIf you have created your .cmd-files, they are now ready to use.\n\nCheck your ROM directories for the generated files.\n\nIn case you have chosen to also update your gamelist.xml, refresh the gamelists via the menu or restart Emulationstation.\n\nIMPORTANT:\n\nMake sure that the file extension .cmd is available in the extension tag inside es_systems.cfg for the system you have created the cmd files for, otherwise the newly generated .cmd files will not show up on the game list." else text_viewer -e -w -t "CMD MAKER FAILED!" -f 24 -m "Failed to complete CMD Maker setup!\n\nCheck /tmp/cmdmaker.log for details." fi fi ee_console disable } function cmdmaker_start() { ee_console enable # Prefer a real VT device for output TTY="/dev/tty1" [[ -w "$TTY" ]] || TTY="/dev/tty0" [[ -w "$TTY" ]] || TTY="/dev/console" # Redirect this script's stdio to the VT so output is always visible on-screen exec <"$TTY" >"$TTY" 2>&1 # Unblank framebuffer (screensaver/DPMS can leave it black) for b in /sys/class/graphics/fb0/blank /sys/class/graphics/fb1/blank; do [[ -w "$b" ]] && echo 0 >"$b" done # Disable console blanking/powersave if setterm exists if command -v setterm >/dev/null 2>&1; then setterm -blank 0 -powerdown 0 -powersave off >"$TTY" 2>/dev/null || true fi clear echo "==========================================" echo " E m u E L E C ' s C M D M A K E R " echo "==========================================" echo "" echo "Starting CMD Maker..." echo "Follow the instructions that will appear below:" echo "" if [[ ! -f "$CMD_MAKER_SCRIPT" ]]; then echo "ERROR: CMD_MAKER.py not found at $CMD_MAKER_SCRIPT" echo "" ee_console disable return 1 fi chmod +x "$CMD_MAKER_SCRIPT" echo "" echo "Starting interactive mode..." echo "" sleep 1 rm -f /tmp/cmdmaker.ret >/dev/null 2>&1 if command -v openvt >/dev/null 2>&1; then # Run inside a real VT; keeps output visible even after screensaver openvt -c 1 -s -f -- /bin/sh -c "/usr/bin/python3 -u '$CMD_MAKER_SCRIPT' 2>&1 | tee /tmp/cmdmaker.log; echo \$? >/tmp/cmdmaker.ret" setup_result=$(cat /tmp/cmdmaker.ret 2>/dev/null || echo 1) else /usr/bin/python3 -u "$CMD_MAKER_SCRIPT" 2>&1 | tee /tmp/cmdmaker.log setup_result=${PIPESTATUS[0]} fi echo "" if [[ $setup_result == 0 ]]; then echo "CMD Maker completed successfully" echo "" ee_console disable rm /tmp/display > /dev/null 2>&1 return 0 else echo "CMD Maker exited with code: $setup_result" echo "" ee_console disable rm /tmp/display > /dev/null 2>&1 return 1 fi } # Start CMD Maker cmdmaker_confirm ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/copy_usb_roms_to_device.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile ROMFILE="emuelec_copy_roms_from_here" function copy_from_where() { FULLPATHTOROMS="$(find /media/*/roms/ -name ${ROMFILE} -maxdepth 1 | head -n 1)" if [[ -z "${FULLPATHTOROMS}" ]]; then ROMSNOTFOUND="yes" else ROMSNOTFOUND="no" PATHTOROMS="${FULLPATHTOROMS%${ROMFILE}}" fi echo ${PATHTOROMS} } ROMFOLDER="$(copy_from_where)" function copy_confirm() { if [ -z "${ROMFOLDER}" ]; then text_viewer -e -w -t "ERROR!" -f 24 -m "No USB media with the file \"${ROMFILE}\" is connected! Did you create the file?\n\nYou need to create a file (NOT A FOLDER/DIRECTORY!) named\n\n\"${ROMFILE}\" (WITH NO EXTENSION!)\n\nin the USB:/roms folder before runing this script! " exit 1 fi text_viewer -y -w -t "Copy roms from USB to SD" -f 24 -m "This will copy all files from \"${ROMFOLDER}\", to \"/storage/roms\" on the device.\n\nMAKE SURE YOU HAVE ENOUGH SPACE IN YOUR DEVICE!\n\nWARNING: Existing files in \"/storage/roms\" with the same name will be overwriten\nNO BACKUP WILL BE CREATED!\n\nare you sure you want to continue?" [[ $? == 21 ]] && copy_roms || exit 0; } function copy_roms() { # Sanity checks [[ -L "/storage/roms" ]] && rm /storage/roms [[ -d /storage/roms2 ]] && mv /storage/roms2 /storage/roms [[ ! -d /storage/roms ]] && mkdir -p /storage/roms # End sanity ee_console enable echo "Copying, please wait!..." > /dev/tty0 rsync -ahI --progress "${ROMFOLDER}"* /storage/roms > /dev/tty0 COPY=$(cat /tmp/copy) ee_console disable # Clean up [[ -f /storage/roms/${ROMFILE} ]] && rm /storage/roms/${ROMFILE} [[ -f /storage/roms/emuelecroms ]] && rm /storage/roms/emuelecroms echo -en "Copy finished!\n\n" >> /tmp/display echo -en "Remove the USB media from the device and press YES to restart ES\n\nPressing NO will return to ES without restarting!" >> /tmp/display echo -en "\n\n\n${COPY}" >> /tmp/display text_viewer -y -w -t "Copy roms from USB to SD" -f 24 /tmp/display if [[ $? == 21 ]]; then rm /tmp/display ee_console disable systemctl restart emustation else exit 0; fi } copy_confirm ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/create_rom_dirs.sh ================================================ #!/bin/bash ES_SYSTEMS="/storage/.config/emulationstation/es_systems.cfg" # Extract path elements from XML and filter out those not containing "/storage/roms" PATHS=$(grep -oP '(?<=).*?(?=)' "${ES_SYSTEMS}" | grep '/storage/roms') # Loop through each path and create directories while IFS= read -r path; do #echo "${path}" mkdir -p "${path}" chmod +x 0777 "${path}" done <<< "${PATHS}" ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/eka-install.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2025-present EmuELEC Team (https://github.com/EmuELEC/EmuELEC) . /etc/profile EKA_INSTALL_SCRIPT="/usr/bin/scripts/setup/EKA_INSTALL.py" function ekainstall_confirm() { text_viewer -y -w -t "E K A 2 L 1 C O M M A N D E R" -f 24 -m "Welcome to the eka2l1 Commander.\n\nUse this tool to setup eka2l1, install firmware and .sis/.sisx apps, import pre-configured device folders, change the active device, create `.uid` launcher files for installed applications, and convert selected device folders and their contents to lowercase so EKA2L1 can access case-sensitive paths correctly.\n\nController Navigation:\n\n- D-Pad: Navigate menus\n- A / Start: Confirm selection\n- B: Go back\n- Select: Exit program\n\nContinue?" if [[ $? == 21 ]]; then if ekainstall_start; then text_viewer -w -t "EKA2L1 COMMANDER" -f 24 -m "\n\nLaunch eka2l1 via EmulationStation." else text_viewer -e -w -t "EKA2L1 COMMANDER FAILED" -f 24 -m "There has been an error!\n\nCheck /emuelec/logs/eka2l1-install.log for details." fi fi ee_console disable } function ekainstall_start() { ee_console enable TTY="/dev/tty1" [[ -w "$TTY" ]] || TTY="/dev/tty0" [[ -w "$TTY" ]] || TTY="/dev/console" exec <"$TTY" >"$TTY" 2>&1 for b in /sys/class/graphics/fb0/blank /sys/class/graphics/fb1/blank; do [[ -w "$b" ]] && echo 0 >"$b" done if command -v setterm >/dev/null 2>&1; then setterm -blank 0 -powerdown 0 -powersave off >"$TTY" 2>/dev/null || true fi clear echo "======================================" echo " E K A 2 L 1 C O M M A N D E R " echo "======================================" echo "" echo "Starting..." echo "" if [[ ! -f "$EKA_INSTALL_SCRIPT" ]]; then echo "ERROR: EKA_INSTALL.py not found at $EKA_INSTALL_SCRIPT" echo "" ee_console disable return 1 fi chmod +x "$EKA_INSTALL_SCRIPT" sleep 1 rm -f /tmp/ekainstall.ret >/dev/null 2>&1 if command -v openvt >/dev/null 2>&1; then openvt -c 1 -s -f -- /bin/sh -c "/usr/bin/python3 -u '$EKA_INSTALL_SCRIPT' 2>&1 | tee /emuelec/logs/eka2l1-install.log; echo \$? >/tmp/ekainstall.ret" setup_result=$(cat /tmp/ekainstall.ret 2>/dev/null || echo 1) else /usr/bin/python3 -u "$EKA_INSTALL_SCRIPT" 2>&1 | tee /emuelec/logs/eka2l1-install.log setup_result=${PIPESTATUS[0]} fi if [[ $setup_result == 0 ]]; then echo "EKA2L1 Commander completed successfully." ee_console disable rm -f /tmp/display >/dev/null 2>&1 return 0 else echo "EKA2L1 Commander exited with code: $setup_result" ee_console disable rm -f /tmp/display >/dev/null 2>&1 return 1 fi } ekainstall_confirm ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/file_manager.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) . /etc/profile BIN="351Files" init_port ${BIN} "default" gptokeyb -c "/emuelec/configs/gptokeyb/${BIN}.gptk" & clear >/dev/console ee_console disable if [ "${EE_DEVICE}" == "OdroidGoAdvance" ] || [ "${EE_DEVICE}" == "GameForce" ]; then clear >/dev/console case "$(oga_ver)" in "OGA"*) ${BIN} 480 320 14 24 24 ;; "OGS") ${BIN} 854 480 14 24 24 ;; "GF") ${BIN} 640 480 14 24 24 ;; esac else ${BIN} fi end_port ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/gamelist.xml ================================================ ./btsetup.sh Setup Bluetooth Audio device Scan and pair bluetooth audio devices (like speakers and headphones or earbuds) to EmuELEC (via pulseaudio). After the setup, you must run the "Connect Bluetooth Audio device"-script. Make sure to switch the audio device in the retroarch menu from alsa to pulseaudio in order to hear the in-game sound. worstcase_scenario script ./setup_images/btsetup.png ./btconnect.sh Connect Bluetooth Audio device Connect last paired bluetooth audio device. Make sure to switch the audio device in retroarch menu from alsa to pulseaudio in order to hear the in-game sound. worstcase_scenario script ./setup_images/btconnect.png ./create_rom_dirs.sh Create ROM Dirs Small script to create all the dirs in /storage/roms based on es_systems.cfg shantigilbert Emuelec script ./setup_images/create_dirs.png ./install_portmaster.sh Install PortMaster Install latest PortMaster shantigilbert Emuelec script ./setup_images/portmaster.png ./eka-install.sh EKA2L1 Commander Use this tool to setup eka2l1, install SIS/SISX apps and install/import firmware. You can also show and change the active device, create `.uid` launcher files for installed applications, and convert selected device folders and their contents to lowercase so EKA2L1 can access case-sensitive paths correctly. For the firmware installation, you WILL need both a .rpkg and a .rom file (for example sym.rpkg and sym.rom) in one of the folders on your device (for example /storage/bios). In order to run N-GAGE 2.0 games, you need to install the N-Gage Installer, which must be a .sis-file. Afterwards you need to copy your .ngage files to /storage/.config/eka2l1/data/drives/e/n-gage. Then create an empty "Launch.ngage" file in /storage/roms/ngage and start it in Emulationstation. The N-GAGE-Games-app will start up and list all the ngage files that you then can install and start via the menu. If you have created .uid files, each game or app can be started individually through the gamelist. worstcase_scenario script ./setup_images/ekainstall.png ./macrosetup.sh Macro Setup Define a trigger button on your controller that executes a macro of button presses. When you are finished recording the button input, wait three seconds. The configuration is being saved in macro_config.json worstcase_scenario script ./setup_images/macrosetup.png ./macrorun.sh Macro Enabler Runs the pre-defined macro when the trigger button is pressed. To stop and remove the macro from memory, press the trigger button for 3-5 seconds. worstcase_scenario script ./setup_images/macrorun.png ./cmdmaker.sh .cmd maker for MAME systems This script automates the creation of .cmd files for MAME ROMs in EmuELEC. What it does: - Reads MAME's listmedia.txt to detect available systems and their media types (floppy, cartridge, CD-ROM, etc.) - Lets you browse and select a MAME system (e.g., apple2gs, fmtownsux) - Choose the media type with correct extensions - Select your ROM directory - Generates .cmd files for each ROM with the proper MAME command line - Optionally updates gamelist.xml to point to the new .cmd files instead of original ROMs. worstcase_scenario script ./setup_images/cmdmaker.png ./file_manager.sh File Manager MC File Manager. NO keyboard required shantigilbert Emuelec script ./setup_images/File Manager.png ./wifi.sh Alternate WiFi method Connect to WiFi using wifi.txt in /storage/.config/wifi.txt shantigilbert Emuelec script ./setup_images/wifi.png ./install_drastic.sh Install Drastic Download and install Drastic, internet is required! shantigilbert Emuelec script ./setup_images/drastic.png ./install_pixelcade.sh Install Pixelcade Download and install software for Pixelcade - LED Marquee for Arcade Machines! pixelcade pixelcade.org script ./setup_images/pixelcade.png ./install_cheats.sh Install Libretro Cheats Download and install Libretro Cheats Hector Calvarro Emuelec script ./setup_images/cheats.png ./sselphs_scraper.sh Sselphs scraper Alternative ROM Scraper. Configuration is required! shantigilbert Emuelec script ./setup_images/help.png ./skyscraper.sh Skyscraper Alternative ROM Scraper. Configuration is required! shantigilbert Emuelec script ./setup_images/sh.png ./send_logs.sh Send logs Use this to get a URL that you can share when asking for help shantigilbert Emuelec script ./setup_images/logs.png ./system_info.sh System info Display System info shantigilbert Emuelec script ./setup_images/info.png ./copy_usb_roms_to_device.sh Copy USB roms to device Easily copy ROMS from any external device to the SD/MMC where EmuELEC is installed shantigilbert Emuelec script ./setup_images/usb.png ./show_last_emuelec.log.sh Show last emuelec Display the last emuelec.log on screen to debug game launching problems shantigilbert Emuelec script ./setup_images/last.png ./launch_terminal_(kb).sh Launch Terminal Start a terminal, a keybord is required! shantigilbert Emuelec script ./setup_images/terminal.png ./youtube_search.sh YouTube Search Do a quick youtube search based on the word predefined in the EmuELEC settings menu shantigilbert Emuelec script ./setup_images/youtube.png ./scan_scummVM_games.sh Scan ScummVM Games Scan Scummvm and add them to the gamelist! shantigilbert Emuelec script ./setup_images/scummvm.png ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/install_cheats.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Source predefined functions and variables . /etc/profile function cheats_confirm() { text_viewer -y -w -t "Install Cheats" -f 24 -m "This will install Retroarch Cheats\n\nNOTE: You need to have an active internet connection and you will need to restart ES after this script ends, continue?" if [[ $? == 21 ]]; then if cheats; then text_viewer -w -t "Install Retroarch Cheats Complete!" -f 24 -m "Retroarch Cheats installation is done!" else text_viewer -e -w -t "Install Cheats FAILED!" -f 24 -m "Retroarch Cheats installation was not completed!, Are you sure you are connected to the internet?" fi fi ee_console disable } function cheats() { ee_console enable LINK="http://buildbot.libretro.com/assets/frontend/cheats.zip" LINKDEST="/tmp/database/cht/cheats.zip" wget -O ${LINKDEST} ${LINK} [[ ! -f ${LINKDEST} ]] && return 1 unzip -o "${LINKDEST}" -d "/tmp/database/cht" rm -rf ${LINKDEST} echo "Done, restart ES" ee_console disable rm /tmp/display > /dev/null 2>&1 return 0 } cheats_confirm ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/install_drastic.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile function drastic_confirm() { text_viewer -y -w -t "Install Drastic" -f 24 -m "This will install Drastic and enable it on Emulationstation\n\nNOTE: You need to have an active internet connection and you will need to restart ES after this script ends, continue?" if [[ $? == 21 ]]; then if drastic_install; then text_viewer -w -t "Install Drastic Complete!" -f 24 -m "Drastic installation is done!, don't forget to install roms to /storage/roms/nds and restart Emulationstation!" else text_viewer -e -w -t "Install Drastic FAILED!" -f 24 -m "Drastic installation was not completed!, Are you sure you are connected to the internet?" fi fi ee_console disable } function drastic_install() { ee_console enable if grep -q "aarch64" /etc/motd; then LINK="https://raw.githubusercontent.com/shantigilbert/binaries-1/master/drastic.tar.gz" else LINK="https://raw.githubusercontent.com/shantigilbert/binaries/master/odroid-xu4/drastic.tar.gz" fi ES_FOLDER="/storage/.emulationstation" LINKDEST="${ES_FOLDER}/scripts/drastic.tar.gz" CFG="${ES_FOLDER}/es_systems.cfg" mkdir -p "${ES_FOLDER}/scripts/" wget -O ${LINKDEST} ${LINK} [[ ! -f ${LINKDEST} ]] && return 1 tar xvf ${LINKDEST} -C "${ES_FOLDER}/scripts" rm ${LINKDEST} if grep -q 'nds' "${CFG}" then echo 'Drastic is already setup in your es_systems.cfg file' echo 'deleting...nd from es_system.cfg' xmlstarlet ed -L -P -d "/systemList/system[name='nds']" ${CFG} fi echo 'Adding Drastic to systems list' xmlstarlet ed --omit-decl --inplace \ -s '//systemList' -t elem -n 'system' \ -s '//systemList/system[last()]' -t elem -n 'name' -v 'nds'\ -s '//systemList/system[last()]' -t elem -n 'fullname' -v 'Nintendo DS'\ -s '//systemList/system[last()]' -t elem -n 'manufacturer' -v 'Nintendo'\ -s '//systemList/system[last()]' -t elem -n 'release' -v '2004'\ -s '//systemList/system[last()]' -t elem -n 'hardware' -v 'portable'\ -s '//systemList/system[last()]' -t elem -n 'path' -v '/storage/roms/nds'\ -s '//systemList/system[last()]' -t elem -n 'extension' -v '.nds .NDS .zip .ZIP .7z .7Z'\ -s '//systemList/system[last()]' -t elem -n 'command' -v "emuelecRunEmu.sh %ROM% -P%SYSTEM% --core=%CORE% --emulator=%EMULATOR% --controllers=\"%CONTROLLERSCONFIG%\""\ -s '//systemList/system[last()]' -t elem -n 'platform' -v 'nds'\ -s '//systemList/system[last()]' -t elem -n 'theme' -v 'nds'\ ${CFG} read -d '' content < /dev/null 2>&1 EOF echo "${content}" > ${ES_FOLDER}/scripts/drastic.sh chmod +x ${ES_FOLDER}/scripts/drastic.sh if [ "${EE_DEVICE}" == "OdroidGoAdvance" ] || [ "${EE_DEVICE}" == "GameForce" ]; then # copy the correct config file depending on what OGA DEVICE=$(oga_ver) cd "/storage/.emulationstation/scripts/drastic/config" case "${DEVICE}" in "OGS") cp -rf drastic_ogs.cfg drastic.cfg ;; "OGABE") cp -rf drastic_ogabe.cfg drastic.cfg ;; "OGA1") cp -rf drastic_oga.cfg drastic.cfg ;; "GF") cp -rf drastic_ogs.cfg drastic.cfg ;; esac fi echo "Done, restart ES" ee_console disable rm /tmp/display > /dev/null 2>&1 return 0 } drastic_confirm ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/install_pixelcade.sh ================================================ #!/bin/bash . /etc/profile install_succesful=false version=10 #increment this as the script is updated INSTALLPATH="/storage/roms/" cat > /tmp/pixelcade.txt << "EOF" _ _ _ _ __ (_)_ _____| | ___ __ _ __| | ___ | '_ \| \ \/ / _ \ |/ __/ _` |/ _` |/ _ \ | |_) | |> < __/ | (_| (_| | (_| | __/ | .__/|_/_/\_\___|_|\___\__,_|\__,_|\___| |_| EOF cat >> /tmp/pixelcade.txt < /tmp/pixelcade_install.rc <> /tmp/pixelcade_install.rc << "EOF" if [[ -f "${INSTALLPATH}master.zip" ]]; then #if the user killed the installer mid-stream,it's possible this file is still there so let's remove it to be sure before downloading, otherwise wget will download and rename to .1 rm "${INSTALLPATH}master.zip" fi echo "Stopping Pixelcade (if running...)" # let's make sure pixelweb is not already running killall java >/dev/null 2>&1 #in the case user has java pixelweb running curl localhost:8080/quit >/dev/null 2>&1 mkdir -p ${INSTALLPATH}pixelcade cd ${INSTALLPATH}pixelcade wget -O ${INSTALLPATH}pixelcade/pixelweb https://github.com/alinke/pixelcade-linux-builds/raw/main/linux_${machine_arch}/pixelweb chmod +x pixelweb #install the artwork echo "Installing artwork, this can take a few minutes, please be patient even if it looks like it's stuck!" ./pixelweb -install-artwork if [[ $? == 2 ]]; then #this means artwork is already installed so let's check for updates and get if so echo "Checking for new Pixelcade artwork..." cd ${INSTALLPATH}pixelcade && ./pixelweb -update-artwork fi echo "Artwork installation done!" if [[ -d ${INSTALLPATH}ptemp ]]; then rm -r ${INSTALLPATH}ptemp fi #creating a temp dir for the Pixelcade common system files & scripts mkdir -p ${INSTALLPATH}ptemp cd ${INSTALLPATH}ptemp #get the Pixelcade system files wget -O ${INSTALLPATH}ptemp/main.zip https://github.com/alinke/pixelcade-linux/archive/refs/heads/main.zip unzip main.zip mkdir -p /storage/.emulationstation/scripts #copy over the custom scripts echo "${yellow}Installing Pixelcade EmulationStation Scripts...${white}" cp -r -f ${INSTALLPATH}ptemp/pixelcade-linux-main/emuelec/scripts /storage/.emulationstation #note this will overwrite existing scripts find /storage/.emulationstation/scripts -type f -iname "*.sh" -exec chmod +x {} \; #make all the scripts executble #hi2txt for high score scrolling echo "${yellow}Installing hi2txt for High Scores...${white}" cp -r -f ${INSTALLPATH}ptemp/pixelcade-linux-main/hi2txt ${INSTALLPATH} #for high scores sed -i '/all,mame/d' ${INSTALLPATH}pixelcade/console.csv sed -i '/favorites,mame/d' ${INSTALLPATH}pixelcade/console.csv sed -i '/recent,mame/d' ${INSTALLPATH}pixelcade/console.csv sed -i '/fbn,mame/d' ${INSTALLPATH}pixelcade/console.csv if cat /storage/.config/custom_start.sh | grep "^[^#;]" | grep -q 'java'; then #ignore any comment line, user has the old java pixelweb, we need to comment out this line and replace echo "Backing up custom.sh to custom.bak" cp /storage/.config/custom_start.sh /storage/.config/custom_start.bak echo "Replacing old java pixelweb with new pixelweb" sed -i "/java -jar pixelweb.jar/c\cd ${INSTALLPATH}pixelcade && ./pixelweb -image "system/emuelec.png" -startup &" /storage/.config/custom_start.sh #comment out the line sed -i "s|pixelweb.jar|pixelweb|" /storage/.config/custom_start.sh fi if cat /storage/.config/custom_start.sh | grep -q 'pixelweb -image'; then echo "Pixelcade was already added to custom_start.sh, skipping..." else echo "Adding Pixelcade Listener auto start to custom_start.sh ..." sed -i "/^"before")/a cd ${INSTALLPATH}pixelcade && ./pixelweb -image "system/emuelec.png" -startup &" /storage/.config/custom_start.sh #insert this line after "before" fi chmod +x /storage/.config/custom_start.sh echo "Cleaning up..." rm -r ${INSTALLPATH}ptemp >/dev/null 2>&1 exit 0 EOF chmod +x /tmp/pixelcade_install.rc killall java >/dev/null 2>&1 # Lets check if java is installed and up to date, called from profile install_java # Install Pixelcade software progressor --log "/emuelec/logs/install_pixelcade.log" --title "Installing Pixelcade, please wait..." "/tmp/pixelcade_install.rc" --font "dummy.ttf" if [[ $? == 0 && -f ${INSTALLPATH}pixelcade/pixelweb && -d ${INSTALLPATH}pixelcade ]]; then cd ${INSTALLPATH}pixelcade && ./pixelweb -image "system/emuelec.png" -startup >/dev/null 2>&1 & pixelcade_version="$(cd ${INSTALLPATH}pixelcade && ./pixelweb -version)" text_viewer -y -w -t "Installation complete!" -f 24 -m "PixelCade Version: ${pixelcade_version} INSTALLATION COMPLETE, The EmuELEC logo should now be displayed. If you don't see the logo, please reboot and then Pixelcade will be controlled by EmuELEC, would you like to reboot now?" if [[ $? == 21 ]]; then systemctl reboot fi else text_viewer -e -w -t "ERROR: Installation incomplete!" -f 24 -m "Something went wrong! Please make sure you have enough disk space and are connnected to the internet!" fi # Delete temporary files rm -rf /tmp/pixelcade* >/dev/null 2>&1 exit 0 ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/install_portmaster.sh ================================================ #!/bin/bash # Source predefined functions and variables . /etc/profile function portmaster_confirm() { text_viewer -y -w -t "Install Portmaster" -f 24 -m "This will install Portmaster and enable it on Emulationstation\n\nNOTE: You need to have an active internet connection and you will need to restart ES after this script ends, continue?" if [[ $? == 21 ]]; then if portmaster_install; then text_viewer -y -w -t "Install Portmaster Complete!" -f 24 -m "Portmaster installation is done!.\n\n Don't forget to restart Emulationstation! Would you like to restart it now?" if [[ $? == 21 ]]; then systemctl restart emustation fi else text_viewer -e -w -t "Install Portmaster FAILED!" -f 24 -m "Portmaster installation was not completed!, Are you sure you are connected to the internet?" fi fi ee_console disable } function portmaster_install() { ee_console enable LINK="https://github.com/PortsMaster/PortMaster-GUI/releases/latest/download/PortMaster.zip" LINKTMP=$(mktemp -d); LINKDEST="${LINKTMP}/PortMaster.zip" wget -O ${LINKDEST} ${LINK} [[ ! -f ${LINKDEST} ]] && return 1 unzip -o "${LINKDEST}" -d "/storage/roms/ports" mkdir -p "/storage/roms/ports_scripts" cp "/storage/roms/ports/PortMaster/PortMaster.sh" "/storage/roms/ports_scripts" rm -rf ${LINKTMP} XML_FILE="/storage/roms/ports_scripts/gamelist.xml" if xmlstarlet sel -t -v "count(/gameList/game[name='PortMaster'])" "${XML_FILE}" | grep -qv '^0$'; then echo "PortMaster already in ${XML_FILE}" #nothing need to be done PortMaster Exists in gamelist else echo "Adding PortMaster to ${XML_FILE}" # create xml file if it doesn't exist if [ ! -f "${XML_FILE}" ]; then echo "${XML_FILE} does not exists, creating..." echo '' > "${XML_FILE}" echo '' >> "${XML_FILE}" else # Check if exists if ! xmlstarlet sel -t -c "/gameList" "${XML_FILE}" >/dev/null 2>&1; then echo '' > "$XML_FILE" echo '' >> "${XML_FILE}" fi fi # 3. Add new entry using xmlstarlet xmlstarlet ed --inplace \ -s "/gameList" -t elem -n "gameTMP" -v "" \ -s "/gameList/gameTMP" -t elem -n "path" -v "./PortMaster.sh" \ -s "/gameList/gameTMP" -t elem -n "name" -v "PortMaster" \ -s "/gameList/gameTMP" -t elem -n "image" -v "/usr/bin/scripts/setup/setup_images/LaunchPortMaster.png" \ -s "/gameList/gameTMP" -t elem -n "rating" -v "10" \ -r "//gameTMP" -v "game" \ "${XML_FILE}" fi echo "Done, restart ES" ee_console disable rm /tmp/display > /dev/null 2>&1 return 0 } portmaster_confirm ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/launch_terminal_(kb).sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) source /usr/bin/env.sh ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/listmedia.txt ================================================ 1292apvs quickload (quik) .pgm .tvc 1292apvs cartridge (cart) .bin .rom 1392apvs quickload (quik) .pgm .tvc 1392apvs cartridge (cart) .bin .rom 32x cartridge (cart) .32x .bin 32x_mcd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr 32x_mcd cartridge (cart) .32x .bin 32x_mcdj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr 32x_mcdj cartridge (cart) .32x .bin 32x_scd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr 32x_scd cartridge (cart) .32x .bin 32xe cartridge (cart) .32x .bin 32xj cartridge (cart) .32x .bin 386i floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk 386i harddisk (hard) .chd .hd .hdv .2mg .hdi 386sc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 386sc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 386sc harddisk (hard) .chd .hd .hdv .2mg .hdi 386sc printout (prin) .prn 386sc2c floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 386sc2c floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 386sc2c harddisk (hard) .chd .hd .hdv .2mg .hdi 386sc2c printout (prin) .prn 386schg floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 386schg floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 386schg harddisk (hard) .chd .hd .hdv .2mg .hdi 386schg printout (prin) .prn 386sxvhcom floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 386sxvhcom floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 386sxvhcom harddisk (hard) .chd .hd .hdv .2mg .hdi 3b1 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk 3b1 harddisk (hard) .chd .hd .hdv .2mg .hdi 3do cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr 3do_pal cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr 3dobios cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr 3siud floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 3siud floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 3siud harddisk (hard) .chd .hd .hdv .2mg .hdi 486apio floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 486apio floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 486apio harddisk (hard) .chd .hd .hdv .2mg .hdi 486apio printout (prin) .prn 486ccv floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 486ccv floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 486ccv harddisk (hard) .chd .hd .hdv .2mg .hdi 486ccv printout (prin) .prn 486igb21 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 486igb21 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 486igb21 harddisk (hard) .chd .hd .hdv .2mg .hdi 486igb21 printout (prin) .prn 486wb6a3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 486wb6a3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 486wb6a3 harddisk (hard) .chd .hd .hdv .2mg .hdi 486wb6a3 printout (prin) .prn 4dmshl3g floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 4dmshl3g floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 4dmshl3g harddisk (hard) .chd .hd .hdv .2mg .hdi 4dmshl3g printout (prin) .prn 4dmuhl3s floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 4dmuhl3s floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 4dmuhl3s harddisk (hard) .chd .hd .hdv .2mg .hdi 4dmuhl3s printout (prin) .prn 4nd04a floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 4nd04a floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf 4nd04a harddisk (hard) .chd .hd .hdv .2mg .hdi 4nd04a printout (prin) .prn 705p3prg romimage1 (rom1) .bin .rom 705p3prg romimage2 (rom2) .bin .rom 705p5prg romimage1 (rom1) .bin .rom 705p5prg romimage2 (rom2) .bin .rom 705r3prg romimage1 (rom1) .bin .rom 705r3prg romimage2 (rom2) .bin .rom 705u3prg romimage1 (rom1) .bin .rom 705u3prg romimage2 (rom2) .bin .rom 990189 cassette (cass) .wav .flac 990189 serial (serl) . 990189v cassette (cass) .wav .flac 990189v serial (serl) . 99bottles cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr 99bottles floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf 99bottles floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf 99bottles printout (prin) .prn a1000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a1000 printout (prin) .prn a1000n floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a1000n printout (prin) .prn a1200 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a1200 printout (prin) .prn a1200 harddisk (hard) .chd .hd .hdv .2mg .hdi a1200n floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a1200n printout (prin) .prn a1200n harddisk (hard) .chd .hd .hdv .2mg .hdi a1200xl floppydisk1 (flop1) .atr .dsk .xfd a1200xl floppydisk2 (flop2) .atr .dsk .xfd a1200xl floppydisk3 (flop3) .atr .dsk .xfd a1200xl floppydisk4 (flop4) .atr .dsk .xfd a1200xl cartridge (cart) .bin .rom .car a130xe floppydisk1 (flop1) .atr .dsk .xfd a130xe floppydisk2 (flop2) .atr .dsk .xfd a130xe floppydisk3 (flop3) .atr .dsk .xfd a130xe floppydisk4 (flop4) .atr .dsk .xfd a130xe cartridge (cart) .bin .rom .car a2000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a2000 printout (prin) .prn a2000n floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a2000n printout (prin) .prn a2600 cartridge (cart) .bin .a26 a2600p cartridge (cart) .bin .a26 a3000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a3000 printout (prin) .prn a3000n floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a3000n printout (prin) .prn a400 floppydisk1 (flop1) .atr .dsk .xfd a400 floppydisk2 (flop2) .atr .dsk .xfd a400 floppydisk3 (flop3) .atr .dsk .xfd a400 floppydisk4 (flop4) .atr .dsk .xfd a400 cartridge (cart) .bin .rom .car a4000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a4000 printout (prin) .prn a4000 harddisk (hard) .chd .hd .hdv .2mg .hdi a400030 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a400030 printout (prin) .prn a400030 harddisk (hard) .chd .hd .hdv .2mg .hdi a400030n floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a400030n printout (prin) .prn a400030n harddisk (hard) .chd .hd .hdv .2mg .hdi a4000n floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a4000n printout (prin) .prn a4000n harddisk (hard) .chd .hd .hdv .2mg .hdi a4000t floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a4000t printout (prin) .prn a4000t harddisk (hard) .chd .hd .hdv .2mg .hdi a4000tn floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a4000tn printout (prin) .prn a4000tn harddisk (hard) .chd .hd .hdv .2mg .hdi a400pal floppydisk1 (flop1) .atr .dsk .xfd a400pal floppydisk2 (flop2) .atr .dsk .xfd a400pal floppydisk3 (flop3) .atr .dsk .xfd a400pal floppydisk4 (flop4) .atr .dsk .xfd a400pal cartridge (cart) .bin .rom .car a433cc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf a433cc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf a433cc harddisk (hard) .chd .hd .hdv .2mg .hdi a433cc printout (prin) .prn a486ap4 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf a486ap4 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf a486ap4 harddisk (hard) .chd .hd .hdv .2mg .hdi a486ap4 printout (prin) .prn a486isa floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf a486isa floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf a486isa harddisk (hard) .chd .hd .hdv .2mg .hdi a486isa printout (prin) .prn a486sio floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf a486sio floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf a486sio harddisk (hard) .chd .hd .hdv .2mg .hdi a486sio printout (prin) .prn a486sp3 harddisk (hard) .chd .hd .hdv .2mg .hdi a486sp3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr a486sp3 printout (prin) .prn a486sp3g floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf a486sp3g floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf a486sp3g harddisk (hard) .chd .hd .hdv .2mg .hdi a486sp3g printout (prin) .prn a486sv1 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf a486sv1 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf a486sv1 harddisk (hard) .chd .hd .hdv .2mg .hdi a486sv1 printout (prin) .prn a486sv2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf a486sv2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf a486sv2 harddisk (hard) .chd .hd .hdv .2mg .hdi a486sv2 printout (prin) .prn a486sv2g floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf a486sv2g floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf a486sv2g harddisk (hard) .chd .hd .hdv .2mg .hdi a486sv2g printout (prin) .prn a500 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a500 printout (prin) .prn a500n floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a500n printout (prin) .prn a500p floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a500p printout (prin) .prn a500pn floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a500pn printout (prin) .prn a5105 cassette (cass) .wav .flac a5105 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img a5105 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img a5105 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img a5105 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img a51mxr3k harddisk (hard) .chd .hd .hdv .2mg .hdi a51mxr3ka harddisk (hard) .chd .hd .hdv .2mg .hdi a51site4 printout (prin) .prn a51site4 harddisk (hard) .chd .hd .hdv .2mg .hdi a51site4a printout (prin) .prn a51site4a harddisk (hard) .chd .hd .hdv .2mg .hdi a5200 cartridge (cart) .bin .rom .car .a52 a5200a cartridge (cart) .bin .rom .car .a52 a600 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a600 printout (prin) .prn a600 harddisk (hard) .chd .hd .hdv .2mg .hdi a600n floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf a600n printout (prin) .prn a600n harddisk (hard) .chd .hd .hdv .2mg .hdi a600xl floppydisk1 (flop1) .atr .dsk .xfd a600xl floppydisk2 (flop2) .atr .dsk .xfd a600xl floppydisk3 (flop3) .atr .dsk .xfd a600xl floppydisk4 (flop4) .atr .dsk .xfd a600xl cartridge (cart) .bin .rom .car a65xe floppydisk1 (flop1) .atr .dsk .xfd a65xe floppydisk2 (flop2) .atr .dsk .xfd a65xe floppydisk3 (flop3) .atr .dsk .xfd a65xe floppydisk4 (flop4) .atr .dsk .xfd a65xe cartridge (cart) .bin .rom .car a65xea floppydisk1 (flop1) .atr .dsk .xfd a65xea floppydisk2 (flop2) .atr .dsk .xfd a65xea floppydisk3 (flop3) .atr .dsk .xfd a65xea floppydisk4 (flop4) .atr .dsk .xfd a65xea cartridge (cart) .bin .rom .car a7150 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi a7150 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi a7150 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf a7800 cartridge (cart) .a78 a7800p cartridge (cart) .a78 a800 floppydisk1 (flop1) .atr .dsk .xfd a800 floppydisk2 (flop2) .atr .dsk .xfd a800 floppydisk3 (flop3) .atr .dsk .xfd a800 floppydisk4 (flop4) .atr .dsk .xfd a800 cartridge1 (cart1) .bin .rom .car a800 cartridge2 (cart2) .bin .rom .car a800pal floppydisk1 (flop1) .atr .dsk .xfd a800pal floppydisk2 (flop2) .atr .dsk .xfd a800pal floppydisk3 (flop3) .atr .dsk .xfd a800pal floppydisk4 (flop4) .atr .dsk .xfd a800pal cartridge1 (cart1) .bin .rom .car a800pal cartridge2 (cart2) .bin .rom .car a800xe floppydisk1 (flop1) .atr .dsk .xfd a800xe floppydisk2 (flop2) .atr .dsk .xfd a800xe floppydisk3 (flop3) .atr .dsk .xfd a800xe floppydisk4 (flop4) .atr .dsk .xfd a800xe cartridge (cart) .bin .rom .car a800xl floppydisk1 (flop1) .atr .dsk .xfd a800xl floppydisk2 (flop2) .atr .dsk .xfd a800xl floppydisk3 (flop3) .atr .dsk .xfd a800xl floppydisk4 (flop4) .atr .dsk .xfd a800xl cartridge (cart) .bin .rom .car a800xlp floppydisk1 (flop1) .atr .dsk .xfd a800xlp floppydisk2 (flop2) .atr .dsk .xfd a800xlp floppydisk3 (flop3) .atr .dsk .xfd a800xlp floppydisk4 (flop4) .atr .dsk .xfd a800xlp cartridge (cart) .bin .rom .car aa3000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa3010 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa3010 printout (prin) .prn aa3010_de floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa3010_de printout (prin) .prn aa3020 harddisk (hard) .chd .hd .hdv .2mg .hdi aa3020 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa3020 printout (prin) .prn aa305 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa310 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa4 harddisk (hard) .chd .hd .hdv .2mg .hdi aa4 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa4 printout (prin) .prn aa4 romimage (rom) .bin .rom aa4000 harddisk (hard) .chd .hd .hdv .2mg .hdi aa4000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa4000 printout (prin) .prn aa4101 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa4201 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa440 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa4401 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa486s harddisk (hard) .chd .hd .hdv .2mg .hdi aa486s cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr aa486s printout (prin) .prn aa500 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa5000 harddisk (hard) .chd .hd .hdv .2mg .hdi aa5000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa5000 printout (prin) .prn aa5000 romimage (rom) .bin .rom aa5000a harddisk (hard) .chd .hd .hdv .2mg .hdi aa5000a floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa5000a printout (prin) .prn aa5000a romimage (rom) .bin .rom aa500d floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa540 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa680 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa aa680 harddisk (hard) .chd .hd .hdv .2mg .hdi abae4 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf abae4 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf abae4 harddisk (hard) .chd .hd .hdv .2mg .hdi abae4 printout (prin) .prn abah4 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf abah4 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf abah4 harddisk (hard) .chd .hd .hdv .2mg .hdi abah4 printout (prin) .prn abav4 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf abav4 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf abav4 harddisk (hard) .chd .hd .hdv .2mg .hdi abav4 printout (prin) .prn abax4 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf abax4 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf abax4 harddisk (hard) .chd .hd .hdv .2mg .hdi abax4 printout (prin) .prn abc110 cassette (cass) .wav .flac .csw .uef abc110 printout (prin) .prn abc110 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd abc110 harddisk (hard) .chd .hd .hdv .2mg .hdi abc110 romimage1 (rom1) .rom .bin abc110 romimage2 (rom2) .rom .bin abc110 romimage3 (rom3) .rom .bin abc110 romimage4 (rom4) .rom .bin abc110 romimage5 (rom5) .rom .bin abc1600 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img abc1600 harddisk (hard) .chd .hd .hdv .2mg .hdi abc310 cassette (cass) .wav .flac .csw .uef abc310 printout (prin) .prn abc310 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd abc310 harddisk (hard) .chd .hd .hdv .2mg .hdi abc310 romimage1 (rom1) .rom .bin abc310 romimage2 (rom2) .rom .bin abc310 romimage3 (rom3) .rom .bin abc310 romimage4 (rom4) .rom .bin abc310 romimage5 (rom5) .rom .bin abc80 cassette (cass) .wav .flac abc80 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img abc80 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img abc80 romimage1 (rom1) .bin abc80 romimage2 (rom2) .bin abc80 romimage3 (rom3) .bin abc80 romimage4 (rom4) .bin abc80 quickload (quik) .bac abc800c cassette (cass) .wav .flac abc800c floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img abc800c floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img abc800c quickload (quik) .bac abc800m cassette (cass) .wav .flac abc800m floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img abc800m floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img abc800m quickload (quik) .bac abc802 cassette (cass) .wav .flac abc802 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img abc802 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img abc802 quickload (quik) .bac abc806 cassette (cass) .wav .flac abc806 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img abc806 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img abc806 quickload (quik) .bac abc80l cassette (cass) .wav .flac abc80l floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img abc80l floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img abc80l romimage1 (rom1) .bin abc80l romimage2 (rom2) .bin abc80l romimage3 (rom3) .bin abc80l romimage4 (rom4) .bin abc80l quickload (quik) .bac abpb4 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf abpb4 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf abpb4 harddisk (hard) .chd .hd .hdv .2mg .hdi abpb4 printout (prin) .prn abpi4 harddisk (hard) .chd .hd .hdv .2mg .hdi abpi4 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr abpi4 printout (prin) .prn abpm4 harddisk (hard) .chd .hd .hdv .2mg .hdi abpm4 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr abpm4 printout (prin) .prn abpv4 harddisk (hard) .chd .hd .hdv .2mg .hdi abpv4 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr abpv4 printout (prin) .prn abpw4 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf abpw4 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf abpw4 harddisk (hard) .chd .hd .hdv .2mg .hdi abpw4 printout (prin) .prn ac1 cassette (cass) .wav .flac ac1_32 cassette (cass) .wav .flac ac1scch cassette (cass) .wav .flac ace100 floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib ace100 floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib ace100 cassette (cass) .wav .flac ace1000 floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib ace1000 floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib ace1000 cassette (cass) .wav .flac ace2200 cassette (cass) .wav .flac ace2200 floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib ace2200 floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib ace2200 printout (prin) .prn ace500 printout (prin) .prn ace500 floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib ace500 floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib acrnsys1 cassette (cass) .wav .flac acrnsys2 romimage1 (rom1) .bin .rom acrnsys2 romimage2 (rom2) .bin .rom acrnsys2 cassette (cass) .wav .flac acrnsys3 romimage1 (rom1) .bin .rom acrnsys3 romimage2 (rom2) .bin .rom acrnsys3 romimage3 (rom3) .bin .rom acrnsys3 romimage4 (rom4) .bin .rom acrnsys3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ssd .bbc .img acrnsys3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ssd .bbc .img acrnsys3_6809 printout (prin) .prn acrnsys3_6809 romimage1 (rom1) .bin .rom acrnsys3_6809 romimage2 (rom2) .bin .rom acrnsys3_6809 romimage3 (rom3) .bin .rom acrnsys3_6809 romimage4 (rom4) .bin .rom acrnsys3_6809 romimage5 (rom5) .bin .rom acrnsys3_6809 romimage6 (rom6) .bin .rom acrnsys3_6809 cassette (cass) .wav .flac acrnsys3_6809 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ssd .bbc .img acrnsys3_6809 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ssd .bbc .img acrnsys4 romimage1 (rom1) .bin .rom acrnsys4 romimage2 (rom2) .bin .rom acrnsys4 romimage3 (rom3) .bin .rom acrnsys4 romimage4 (rom4) .bin .rom acrnsys4 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ssd .bbc .img acrnsys4 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ssd .bbc .img acrnsys5 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ssd .bbc .img acrnsys5 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ssd .bbc .img acw443 cassette (cass) .wav .flac .csw .uef acw443 printout (prin) .prn acw443 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd acw443 harddisk (hard) .chd .hd .hdv .2mg .hdi acw443 romimage1 (rom1) .rom .bin acw443 romimage2 (rom2) .rom .bin acw443 romimage3 (rom3) .rom .bin acw443 romimage4 (rom4) .rom .bin acw443 romimage5 (rom5) .rom .bin adam cassette1 (cass1) .wav .flac .ddp adam cassette2 (cass2) .wav .flac .ddp adam floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk adam floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk adam cartridge1 (cart1) .rom .col .bin adam cartridge2 (cart2) .bin .rom adam cartridge3 (cart3) .bin .rom adam cartridge4 (cart4) .bin .rom advision cartridge (cart) .bin advsnha cartridge (cart) .bin aerofgtsg harddisk (hard) .chd .hd .hdv .2mg .hdi aes memcard (memc) .neo aes cartridge (cart) .bin agat7 floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib agat7 floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib agat7 printout (prin) .prn agat7 cassette (cass) .wav .flac agat9 floppydisk1 (flop1) .mfi .dfi .ds9 .aim agat9 floppydisk2 (flop2) .mfi .dfi .ds9 .aim agat9 floppydisk3 (flop3) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib agat9 floppydisk4 (flop4) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib agat9 cassette (cass) .wav .flac ai1000 cartridge1 (cart1) .bin ai1000 cartridge2 (cart2) .bin aim65 cassette1 (cass1) .wav .flac aim65 cassette2 (cass2) .wav .flac aim65 romimage1 (rom1) .z26 aim65 romimage2 (rom2) .z25 aim65 romimage3 (rom3) .z24 aim65 romimage4 (rom4) .z12 aim65 romimage5 (rom5) .z13 aim65 romimage6 (rom6) .z14 aim65 romimage7 (rom7) .z15 aimode cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr aiwamcd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr al486vd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf al486vd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf al486vd harddisk (hard) .chd .hd .hdv .2mg .hdi al486vd printout (prin) .prn al520ex printout (prin) .prn al520ex snapshot (dump) .sna al520ex cassette (cass) .wav .flac .cdt al520ex floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk al520ex floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk al8800bt quickload (quik) .bin alacou floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alacou floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alacou harddisk (hard) .chd .hd .hdv .2mg .hdi alacou printout (prin) .prn alaleolx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alaleolx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alaleolx harddisk (hard) .chd .hd .hdv .2mg .hdi alator2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alator2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alator2 harddisk (hard) .chd .hd .hdv .2mg .hdi alator2 printout (prin) .prn albert floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib albert floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib albert cassette (cass) .wav .flac alfa cassette (cass) .wav .flac .pmd .tap .ptp alg3do cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr alice cassette (cass) .wav .flac .cas .c10 .k7 alice printout (prin) .prn alice cartridge (cart) .mcc .rom alice32 cassette (cass) .wav .flac .cas .c10 .k7 alice32 printout (prin) .prn alice32 cartridge (cart) .mcc .rom alice90 cassette (cass) .wav .flac .cas .c10 .k7 alice90 printout (prin) .prn alice90 cartridge (cart) .mcc .rom alien harddisk (hard) .chd .hd .hdv .2mg .hdi alim1217 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alim1217 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alim1217 harddisk (hard) .chd .hd .hdv .2mg .hdi alim1419 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alim1419 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alim1419 harddisk (hard) .chd .hd .hdv .2mg .hdi alim1419 printout (prin) .prn alim1429 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alim1429 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alim1429 harddisk (hard) .chd .hd .hdv .2mg .hdi alim1429 printout (prin) .prn alim1489 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alim1489 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alim1489 harddisk (hard) .chd .hd .hdv .2mg .hdi alim1489 printout (prin) .prn alphatan printout (prin) .prn alphatan cassette (cass) .wav .flac alphatp1 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk alphatp1 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk alphatp10 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alphatp10 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alphatp10 printout (prin) .prn alphatp2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk alphatp2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk alphatp2u floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk alphatp2u floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk alphatp3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk alphatp3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk alphatp30 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk alphatp30 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk alphatp50 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alphatp50 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf alphatp50 printout (prin) .prn alphatpc16 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk alphatpc16 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk alphatpc16 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk alphatpc16 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk alphatro floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf alphatro floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf alphatro cassette (cass) .wav .flac alphatro cartridge (cart) .bin alphatrob floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf alphatrob floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf alphatrob cassette (cass) .wav .flac alphatrob cartridge (cart) .bin alphatron floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf alphatron floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf alphatron cassette (cass) .wav .flac alphatron cartridge (cart) .bin alto2 harddisk1 (hard1) .chd .dsk alto2 harddisk2 (hard2) .chd .dsk altos486 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk altos5 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk altos5 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk altos5 quickload (quik) .com .cpm altos586 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk altos586 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk altos586 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi altos586 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi altos8600 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk altos8600 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk altos8600 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk altos8600 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk altos8600 harddisk (hard) .chd .hd .hdv .2mg .hdi am100 floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib am100 floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib am100 cassette (cass) .wav .flac am4 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa am4 harddisk (hard) .chd .hd .hdv .2mg .hdi am64 floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib am64 floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib am64 cassette (cass) .wav .flac amibaby floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf amibaby floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf amibaby harddisk (hard) .chd .hd .hdv .2mg .hdi amibaby printout (prin) .prn amient2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf amient2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf amient2 harddisk (hard) .chd .hd .hdv .2mg .hdi amient2 printout (prin) .prn amient3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf amient3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf amient3 harddisk (hard) .chd .hd .hdv .2mg .hdi amient3 printout (prin) .prn amient4 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf amient4 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf amient4 harddisk (hard) .chd .hd .hdv .2mg .hdi amient4 printout (prin) .prn amisvpci2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf amisvpci2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf amisvpci2 harddisk (hard) .chd .hd .hdv .2mg .hdi amisvpci2 printout (prin) .prn amisvvlb floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf amisvvlb floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf amisvvlb harddisk (hard) .chd .hd .hdv .2mg .hdi amisvvlb printout (prin) .prn amisvvlb2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf amisvvlb2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf amisvvlb2 harddisk (hard) .chd .hd .hdv .2mg .hdi amisvvlb2 printout (prin) .prn amisvvlb3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf amisvvlb3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf amisvvlb3 harddisk (hard) .chd .hd .hdv .2mg .hdi amisvvlb3 printout (prin) .prn ampro floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ampro floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ampro floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ampro floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk amu880 cassette (cass) .wav .flac amust floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk amust floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk anakonda cassette (cass) .wav .flac .rks anch386s floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf anch386s floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf anch386s harddisk (hard) .chd .hd .hdv .2mg .hdi aoap43 harddisk (hard) .chd .hd .hdv .2mg .hdi aoap43 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr aoap43 printout (prin) .prn aovi15g floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf aovi15g floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf aovi15g harddisk (hard) .chd .hd .hdv .2mg .hdi aovi15g printout (prin) .prn apc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f apc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f apfimag cartridge (cart) .bin apfimag cassette (cass) .wav .flac .cas .cpf .apt apfimag floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk apfimag floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk apfm1000 cartridge (cart) .bin aplannb floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf aplannb floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf aplannb harddisk (hard) .chd .hd .hdv .2mg .hdi aplannb printout (prin) .prn aplanst floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf aplanst floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf aplanst harddisk (hard) .chd .hd .hdv .2mg .hdi aplanst printout (prin) .prn aplsbon floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf aplsbon floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf aplsbon harddisk (hard) .chd .hd .hdv .2mg .hdi aplsbon printout (prin) .prn aplscar floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf aplscar floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf aplscar harddisk (hard) .chd .hd .hdv .2mg .hdi aplscar printout (prin) .prn apogee cassette (cass) .wav .flac .rka apollo80 cartridge (cart) .st2 .bin .rom apple1 cassette (cass) .wav .flac apple1 snapshot (dump) .snp apple2 floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2 floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2 cassette (cass) .wav .flac apple2c floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2c floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2c0 floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c0 floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c0de floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c0de floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c0fr floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c0fr floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c0se floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c0se floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c0uk floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c0uk floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c3 floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c3 floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c3de floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c3de floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c3fr floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c3fr floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c3se floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c3se floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c3uk floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c3uk floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c4 floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c4 floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c4de floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c4de floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c4fr floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c4fr floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c4se floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c4se floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c4uk floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2c4uk floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2cde floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2cde floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2cfr floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2cfr floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2cp floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2cp floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2cp floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg apple2cp floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg apple2cse floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2cse floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2cuk floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2cuk floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2e floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2e floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2e cassette (cass) .wav .flac apple2ede floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2ede floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2ede cassette (cass) .wav .flac apple2ee floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2ee floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2ee cassette (cass) .wav .flac apple2eede floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2eede floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2eede cassette (cass) .wav .flac apple2eefr floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2eefr floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2eefr cassette (cass) .wav .flac apple2ees floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2ees floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2ees cassette (cass) .wav .flac apple2eese floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2eese floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2eese cassette (cass) .wav .flac apple2eeuk floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2eeuk floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2eeuk cassette (cass) .wav .flac apple2efr floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2efr floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2efr cassette (cass) .wav .flac apple2ep floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2ep floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2ep cassette (cass) .wav .flac apple2epde floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2epde floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2epde cassette (cass) .wav .flac apple2epfr floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2epfr floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2epfr cassette (cass) .wav .flac apple2epse floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2epse floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2epse cassette (cass) .wav .flac apple2epuk floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2epuk floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2epuk cassette (cass) .wav .flac apple2ese floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2ese floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2ese cassette (cass) .wav .flac apple2euk floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2euk floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2euk cassette (cass) .wav .flac apple2gs floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2gs floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2gs floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg apple2gs floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg apple2gsmt floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2gsmt floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2gsmt floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg apple2gsmt floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg apple2gsr0 floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2gsr0 floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2gsr0 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg apple2gsr0 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg apple2gsr0p floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2gsr0p floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2gsr0p floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg apple2gsr0p floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg apple2gsr0p2 floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2gsr0p2 floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2gsr0p2 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg apple2gsr0p2 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg apple2gsr1 floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2gsr1 floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2gsr1 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg apple2gsr1 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg apple2gsr3p floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple2gsr3p floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple2gsr3p floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg apple2gsr3p floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg apple2jp floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2jp floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2jp cassette (cass) .wav .flac apple2p floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2p floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2p cassette (cass) .wav .flac apple2pe floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2pe floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib apple2pe cassette (cass) .wav .flac apple3 floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib apple3 floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib apple3 floppydisk3 (flop3) .mfi .dfi .dsk .do .po .edd .woz .nib apple3 floppydisk4 (flop4) .mfi .dfi .dsk .do .po .edd .woz .nib applix printout (prin) .prn applix cassette (cass) .wav .flac applix floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .raw applix floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .raw aprfte floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf aprfte floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf aprfte harddisk (hard) .chd .hd .hdv .2mg .hdi aprfte printout (prin) .prn apricot printout (prin) .prn apricot floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk apricot floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk apricotxi printout (prin) .prn apricotxi floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk apricotxi floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk aprpand floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf aprpand floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf aprpand harddisk (hard) .chd .hd .hdv .2mg .hdi aprpand printout (prin) .prn apvxft floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf apvxft floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf apvxft harddisk (hard) .chd .hd .hdv .2mg .hdi apvxft printout (prin) .prn apxen floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk apxen floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk apxena1 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf apxena1 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf apxena1 harddisk (hard) .chd .hd .hdv .2mg .hdi apxena1 printout (prin) .prn apxeni floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf apxeni floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf apxeni harddisk (hard) .chd .hd .hdv .2mg .hdi apxeni printout (prin) .prn apxenls3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf apxenls3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf apxenls3 harddisk (hard) .chd .hd .hdv .2mg .hdi apxenls3 printout (prin) .prn apxenp2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf apxenp2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf apxenp2 harddisk (hard) .chd .hd .hdv .2mg .hdi apxenp2 printout (prin) .prn apxlsam floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf apxlsam floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf apxlsam harddisk (hard) .chd .hd .hdv .2mg .hdi apxlsam printout (prin) .prn aquarius cassette (cass) .wav .flac .caq aquarius printout (prin) .prn aquarius cartridge1 (cart1) .rom .bin aquarius cartridge2 (cart2) .rom .bin aquarius cartridge3 (cart3) .rom .bin aquarius2 cassette (cass) .wav .flac .caq aquarius2 printout (prin) .prn aquarius2 cartridge1 (cart1) .rom .bin aquarius2 cartridge2 (cart2) .rom .bin aquarius2 cartridge3 (cart3) .rom .bin aquarius_ar cassette (cass) .wav .flac .caq aquarius_ar printout (prin) .prn aquarius_ar cartridge1 (cart1) .rom .bin aquarius_ar cartridge2 (cart2) .rom .bin aquarius_ar cartridge3 (cart3) .rom .bin aquariusp cassette (cass) .wav .flac .caq aquariusp printout (prin) .prn aquariusp cartridge1 (cart1) .rom .bin aquariusp cartridge2 (cart2) .rom .bin aquariusp cartridge3 (cart3) .rom .bin ar140 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa ar225 romimage1 (rom1) .bin .rom ar225 romimage2 (rom2) .bin .rom ar225 romimage3 (rom3) .bin .rom ar225 romimage4 (rom4) .bin .rom ar225 romimage5 (rom5) .bin .rom ar225 romimage6 (rom6) .bin .rom ar260 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa ar4glx3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ar4glx3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ar4glx3 harddisk (hard) .chd .hd .hdv .2mg .hdi ar4glx3 printout (prin) .prn arb cartridge (cart) .bin arcadia cartridge (cart) .bin area51 harddisk (hard) .chd .hd .hdv .2mg .hdi area51a harddisk (hard) .chd .hd .hdv .2mg .hdi area51mx harddisk (hard) .chd .hd .hdv .2mg .hdi area51t harddisk (hard) .chd .hd .hdv .2mg .hdi area51ta harddisk (hard) .chd .hd .hdv .2mg .hdi argo cassette (cass) .wav .flac as496 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf as496 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf as496 harddisk (hard) .chd .hd .hdv .2mg .hdi as496 printout (prin) .prn asc486slc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf asc486slc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf asc486slc harddisk (hard) .chd .hd .hdv .2mg .hdi asi100b0 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf asi100b0 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf asi100b0 harddisk (hard) .chd .hd .hdv .2mg .hdi asst128 cassette (cass) .wav .flac asst128 printout (prin) .prn asst128 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img asst128 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img ast6000 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ast6000 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ast6000 harddisk (hard) .chd .hd .hdv .2mg .hdi ast6000 printout (prin) .prn ast611 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ast611 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ast611 harddisk (hard) .chd .hd .hdv .2mg .hdi ast611 printout (prin) .prn astrocde cartridge (cart) .bin astrocdl cartridge (cart) .bin astrocdw cartridge (cart) .bin asuscubx harddisk (hard) .chd .hd .hdv .2mg .hdi asuscubx cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr asuscubx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf asuscubx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf asuscubx printout (prin) .prn asuscusc harddisk (hard) .chd .hd .hdv .2mg .hdi asuscusc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr asuscusc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf asuscusc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf asuscusc printout (prin) .prn asuspolo harddisk (hard) .chd .hd .hdv .2mg .hdi asuspolo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr asuspolo floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf asuspolo floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf asuspolo printout (prin) .prn at floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf at floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf at harddisk (hard) .chd .hd .hdv .2mg .hdi at386 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf at386 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf at386 harddisk (hard) .chd .hd .hdv .2mg .hdi at386 printout (prin) .prn at386sx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf at386sx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf at386sx harddisk (hard) .chd .hd .hdv .2mg .hdi at486 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf at486 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf at486 harddisk (hard) .chd .hd .hdv .2mg .hdi at486 printout (prin) .prn at586 harddisk (hard) .chd .hd .hdv .2mg .hdi at586 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr at586 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf at586 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf at586 printout (prin) .prn at586x3 harddisk (hard) .chd .hd .hdv .2mg .hdi at586x3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr atariabc286 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf atariabc286 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf atariabc286 harddisk (hard) .chd .hd .hdv .2mg .hdi ataripc1 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ataripc1 printout (prin) .prn ataripc3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ataripc3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ataripc3 printout (prin) .prn ataripc4 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ataripc4 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ataripc4 harddisk (hard) .chd .hd .hdv .2mg .hdi ataripc5 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ataripc5 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ataripc5 harddisk (hard) .chd .hd .hdv .2mg .hdi ataripc5 printout (prin) .prn atc1415 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf atc1415 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf atc1415 harddisk (hard) .chd .hd .hdv .2mg .hdi atc1415 printout (prin) .prn atc1425a harddisk (hard) .chd .hd .hdv .2mg .hdi atc1425a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr atc1425a printout (prin) .prn atc1425b harddisk (hard) .chd .hd .hdv .2mg .hdi atc1425b cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr atc1425b printout (prin) .prn atm snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx atm quickload (quik) .raw .scr atm cassette (cass) .wav .flac .tzx .tap .blk atm floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd atm floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd atm floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd atm floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd atmtb2 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx atmtb2 quickload (quik) .raw .scr atmtb2 cassette (cass) .wav .flac .tzx .tap .blk atmtb2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd atmtb2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd atmtb2 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd atmtb2 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd atmtb2plus snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx atmtb2plus quickload (quik) .raw .scr atmtb2plus cassette (cass) .wav .flac .tzx .tap .blk atmtb2plus floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd atmtb2plus floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd atmtb2plus floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd atmtb2plus floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd atom cassette (cass) .wav .flac .tap .csw .uef atom printout (prin) .prn atom quickload (quik) .atm atom floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .40t atom romimage (rom) .bin .rom atombbc cassette (cass) .wav .flac .tap .csw .uef atombbc printout (prin) .prn atombbc quickload (quik) .atm atombbc floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .40t atombbc romimage (rom) .bin .rom atomes cassette (cass) .wav .flac .tap .csw .uef atomrr cassette (cass) .wav .flac .tap .csw .uef atomrr printout (prin) .prn atomrr quickload (quik) .atm atomrr romimage (rom) .bin .rom att6300p floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf att6300p floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf att6300p printout (prin) .prn att6300p harddisk1 (hard1) .chd .hd .hdv .2mg .hdi att6300p harddisk2 (hard2) .chd .hd .hdv .2mg .hdi attache floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk attache floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk attache816 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk attache816 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk atturbo floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf atturbo floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf atturbo harddisk (hard) .chd .hd .hdv .2mg .hdi aubam12s2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf aubam12s2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf aubam12s2 harddisk (hard) .chd .hd .hdv .2mg .hdi aussieby printout (prin) .prn aussieby floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk aussieby floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk aussieby quickload (quik) .com .cpm autoc15 printout (prin) .prn autoc15 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd autoc15 romimage1 (rom1) .rom .bin autoc15 romimage2 (rom2) .rom .bin autoc15 romimage3 (rom3) .rom .bin autoc15 romimage4 (rom4) .rom .bin auvip800 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf auvip800 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf auvip800 printout (prin) .prn av20dev floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .adf .apd .jfd .ads .adm .adl .ssd .bbc .dsd .st .msa avalnc12 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avalnc13 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avalnc25 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avalnc25a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avalns12 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avalns13 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avalns25 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avalns25a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avalon20 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avalonc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avalonca cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avaloncc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avalonce cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avaloncf cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avalons cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avalonsa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avalonsc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avalonse cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avalonsf cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr avigo quickload (quik) .app avigo_de quickload (quik) .app avigo_es quickload (quik) .app avigo_fr quickload (quik) .app avigo_it quickload (quik) .app aviion_4600 harddisk (hard) .chd .hd .hdv .2mg .hdi ax150 cartridge1 (cart1) .mx1 .bin .rom ax150 cartridge2 (cart2) .mx1 .bin .rom ax150 printout (prin) .prn ax150 cassette (cass) .wav .flac .tap .cas .tsx ax170 cartridge1 (cart1) .mx1 .bin .rom ax170 cartridge2 (cart2) .mx1 .bin .rom ax170 printout (prin) .prn ax170 cassette (cass) .wav .flac .tap .cas .tsx ax20 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ax200 cartridge1 (cart1) .mx1 .bin .rom ax200 cartridge2 (cart2) .mx1 .bin .rom ax200 cartridge60pin (cart60p) .mx1 .bin .rom ax200 printout (prin) .prn ax200 cassette (cass) .wav .flac .tap .cas .tsx ax200m cartridge1 (cart1) .mx1 .bin .rom ax200m cartridge2 (cart2) .mx1 .bin .rom ax200m cartridge60pin (cart60p) .mx1 .bin .rom ax200m midiout (mout) .mid ax200m midiin (min) .mid .syx ax200m printout (prin) .prn ax200m cassette (cass) .wav .flac .tap .cas .tsx ax230 cartridge (cart) .mx1 .bin .rom ax230 printout (prin) .prn ax230 cassette (cass) .wav .flac .tap .cas .tsx ax350 cartridge1 (cart1) .mx1 .bin .rom ax350 cartridge2 (cart2) .mx1 .bin .rom ax350 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk ax350 printout (prin) .prn ax350 cassette (cass) .wav .flac .tap .cas .tsx ax350ii cartridge1 (cart1) .mx1 .bin .rom ax350ii cartridge2 (cart2) .mx1 .bin .rom ax350ii floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk ax350ii printout (prin) .prn ax350ii cassette (cass) .wav .flac .tap .cas .tsx ax350iif cartridge1 (cart1) .mx1 .bin .rom ax350iif cartridge2 (cart2) .mx1 .bin .rom ax350iif floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk ax350iif printout (prin) .prn ax350iif cassette (cass) .wav .flac .tap .cas .tsx ax370 cartridge1 (cart1) .mx1 .bin .rom ax370 cartridge2 (cart2) .mx1 .bin .rom ax370 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk ax370 printout (prin) .prn ax370 cassette (cass) .wav .flac .tap .cas .tsx ax500 cartridge1 (cart1) .mx1 .bin .rom ax500 cartridge2 (cart2) .mx1 .bin .rom ax500 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk ax500 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk ax500 cartridge60pin (cart60p) .mx1 .bin .rom ax500 printout (prin) .prn ax500 cassette (cass) .wav .flac .tap .cas .tsx azumanga cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr b128 floppydisk1 (flop1) .mfi .dfi .d80 b128 floppydisk2 (flop2) .mfi .dfi .d80 b128 cartridge (cart) .20 .40 .60 b128 quickload (quik) .p00 .prg .t64 b128hp floppydisk1 (flop1) .mfi .dfi .d80 b128hp floppydisk2 (flop2) .mfi .dfi .d80 b128hp cartridge (cart) .20 .40 .60 b128hp quickload (quik) .p00 .prg .t64 b16 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk b16 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk b16ex2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk b16ex2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk b256 floppydisk1 (flop1) .mfi .dfi .d80 b256 floppydisk2 (flop2) .mfi .dfi .d80 b256 cartridge (cart) .20 .40 .60 b256 quickload (quik) .p00 .prg .t64 b256hp floppydisk1 (flop1) .mfi .dfi .d80 b256hp floppydisk2 (flop2) .mfi .dfi .d80 b256hp cartridge (cart) .20 .40 .60 b256hp quickload (quik) .p00 .prg .t64 b2m floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img b2m floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img b2mrom floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img b2mrom floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img b500 floppydisk1 (flop1) .mfi .dfi .d80 b500 floppydisk2 (flop2) .mfi .dfi .d80 b500 cartridge (cart) .20 .40 .60 b500 quickload (quik) .p00 .prg .t64 ballpom cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bam16a0 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf bam16a0 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf bam16a0 harddisk (hard) .chd .hd .hdv .2mg .hdi bam2 harddisk (hard) .chd .hd .hdv .2mg .hdi bam2a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr basf7120 printout (prin) .prn basf7120 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk basf7120 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk basf7120 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk basis108 floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib basis108 floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib basis108 cassette (cass) .wav .flac bassang2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bassangl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr batlgear harddisk (hard) .chd .hd .hdv .2mg .hdi batlgr2 harddisk (hard) .chd .hd .hdv .2mg .hdi batlgr2a harddisk (hard) .chd .hd .hdv .2mg .hdi bay1000c floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf bay1000c floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf bay1000c harddisk (hard) .chd .hd .hdv .2mg .hdi bbca cassette (cass) .wav .flac .csw .uef bbca romimage1 (rom1) .rom .bin bbca romimage2 (rom2) .rom .bin bbca romimage3 (rom3) .rom .bin bbca romimage4 (rom4) .rom .bin bbcb cassette (cass) .wav .flac .csw .uef bbcb romimage1 (rom1) .rom .bin bbcb romimage2 (rom2) .rom .bin bbcb romimage3 (rom3) .rom .bin bbcb romimage4 (rom4) .rom .bin bbcb romimage5 (rom5) .bin .rom bbcb printout (prin) .prn bbcb floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd bbcb floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd bbcb_de cassette (cass) .wav .flac .csw .uef bbcb_de romimage1 (rom1) .rom .bin bbcb_de romimage2 (rom2) .rom .bin bbcb_de romimage3 (rom3) .rom .bin bbcb_de romimage4 (rom4) .rom .bin bbcb_de romimage5 (rom5) .bin .rom bbcb_de printout (prin) .prn bbcb_de floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd bbcb_de floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd bbcb_no cassette (cass) .wav .flac .csw .uef bbcb_no romimage1 (rom1) .rom .bin bbcb_no romimage2 (rom2) .rom .bin bbcb_no romimage3 (rom3) .rom .bin bbcb_no romimage4 (rom4) .rom .bin bbcb_no romimage5 (rom5) .bin .rom bbcb_no printout (prin) .prn bbcb_no floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd bbcb_no floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd bbcb_us cassette (cass) .wav .flac .csw .uef bbcb_us romimage1 (rom1) .rom .bin bbcb_us romimage2 (rom2) .rom .bin bbcb_us romimage3 (rom3) .rom .bin bbcb_us romimage4 (rom4) .rom .bin bbcb_us romimage5 (rom5) .bin .rom bbcb_us printout (prin) .prn bbcb_us floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd bbcb_us floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd bbcbc cartridge (cart) .bin bbcbp cassette (cass) .wav .flac .csw .uef bbcbp printout (prin) .prn bbcbp floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd bbcbp floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd bbcbp romimage1 (rom1) .rom .bin bbcbp romimage2 (rom2) .rom .bin bbcbp romimage3 (rom3) .rom .bin bbcbp romimage4 (rom4) .rom .bin bbcbp romimage5 (rom5) .rom .bin bbcbp128 cassette (cass) .wav .flac .csw .uef bbcbp128 printout (prin) .prn bbcbp128 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd bbcbp128 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd bbcbp128 romimage1 (rom1) .rom .bin bbcbp128 romimage2 (rom2) .rom .bin bbcbp128 romimage3 (rom3) .rom .bin bbcbp128 romimage4 (rom4) .rom .bin bbcbp128 romimage5 (rom5) .rom .bin bbcm cartridge1 (cart1) .rom .bin bbcm cartridge2 (cart2) .rom .bin bbcm romimage1 (rom1) .rom .bin bbcm cassette (cass) .wav .flac .csw .uef bbcm printout (prin) .prn bbcm floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd bbcm floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd bbcm512 cartridge1 (cart1) .rom .bin bbcm512 cartridge2 (cart2) .rom .bin bbcm512 romimage1 (rom1) .rom .bin bbcm512 cassette (cass) .wav .flac .csw .uef bbcm512 printout (prin) .prn bbcm512 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd bbcm512 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd bbcmaiv cartridge1 (cart1) .rom .bin bbcmaiv cartridge2 (cart2) .rom .bin bbcmaiv romimage1 (rom1) .rom .bin bbcmaiv cassette (cass) .wav .flac .csw .uef bbcmaiv printout (prin) .prn bbcmaiv floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd bbcmaiv floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd bbcmarm cartridge1 (cart1) .rom .bin bbcmarm cartridge2 (cart2) .rom .bin bbcmarm romimage1 (rom1) .rom .bin bbcmarm cassette (cass) .wav .flac .csw .uef bbcmarm printout (prin) .prn bbcmarm floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd bbcmarm floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd bbcmarm harddisk (hard) .chd .hd .hdv .2mg .hdi bbcmc printout (prin) .prn bbcmc floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd bbcmc romimage1 (rom1) .rom .bin bbcmc romimage2 (rom2) .rom .bin bbcmc romimage3 (rom3) .rom .bin bbcmc romimage4 (rom4) .rom .bin bbcmc_ar printout (prin) .prn bbcmc_ar floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd bbcmc_ar romimage1 (rom1) .rom .bin bbcmc_ar romimage2 (rom2) .rom .bin bbcmc_ar romimage3 (rom3) .rom .bin bbcmc_ar romimage4 (rom4) .rom .bin bbcmet cartridge1 (cart1) .rom .bin bbcmet cartridge2 (cart2) .rom .bin bbcmet romimage (rom) .rom .bin bbcmt cartridge1 (cart1) .rom .bin bbcmt cartridge2 (cart2) .rom .bin bbcmt romimage1 (rom1) .rom .bin bbcmt cassette (cass) .wav .flac .csw .uef bbcmt printout (prin) .prn bbcmt floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd bbcmt floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd bbear cartridge (cart) .vsm .bin bbh harddisk1 (hard1) .chd .hd .hdv .2mg .hdi bbh cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr bbh harddisk2 (hard2) .chd .hd .hdv .2mg .hdi bbh cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr bbh2sp harddisk1 (hard1) .chd .hd .hdv .2mg .hdi bbh2sp cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr bbh2sp harddisk2 (hard2) .chd .hd .hdv .2mg .hdi bbh2sp cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr bbh2spa harddisk1 (hard1) .chd .hd .hdv .2mg .hdi bbh2spa cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr bbh2spa harddisk2 (hard2) .chd .hd .hdv .2mg .hdi bbh2spa cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr bbh2spb harddisk1 (hard1) .chd .hd .hdv .2mg .hdi bbh2spb cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr bbh2spb harddisk2 (hard2) .chd .hd .hdv .2mg .hdi bbh2spb cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr bbhcotw harddisk1 (hard1) .chd .hd .hdv .2mg .hdi bbhcotw cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr bbhcotw harddisk2 (hard2) .chd .hd .hdv .2mg .hdi bbhcotw cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr bbhsc harddisk1 (hard1) .chd .hd .hdv .2mg .hdi bbhsc cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr bbhsc harddisk2 (hard2) .chd .hd .hdv .2mg .hdi bbhsc cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr bbhsca harddisk1 (hard1) .chd .hd .hdv .2mg .hdi bbhsca cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr bbhsca harddisk2 (hard2) .chd .hd .hdv .2mg .hdi bbhsca cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr bcs3a cassette (cass) .wav .flac bcs3b cassette (cass) .wav .flac bcs3c cassette (cass) .wav .flac bcs3d cassette (cass) .wav .flac bdesignm cartridge (cart) .bin bdrdown cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr beachspi cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bebox harddisk1 (hard1) .chd .hd .hdv .2mg .hdi bebox cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bebox harddisk2 (hard2) .chd .hd .hdv .2mg .hdi bebox floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf bebox2 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi bebox2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bebox2 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi bebox2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf beena cartridge (cart) .bin beena card (crd) .png .jpg .bmp bestzx snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx bestzx quickload (quik) .raw .scr bestzx cassette (cass) .wav .flac .tzx .tap .blk bestzx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd bestzx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd bestzx floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd bestzx floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd beta cartridge (cart) .bin .rom bi025c floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf bi025c floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf bi025c harddisk (hard) .chd .hd .hdv .2mg .hdi bigboard floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk bigboard floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk bigboard quickload (quik) .com .cpm bigbord2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk bigbord2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk bikiniko cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr binbug cassette (cass) .wav .flac binbug quickload (quik) .pgm biofreak harddisk1 (hard1) .chd .hd .hdv .2mg .hdi biofreak cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr biofreak harddisk2 (hard2) .chd .hd .hdv .2mg .hdi biofreak cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr bit90 cartridge (cart) .rom .col .bin bk0010 cassette (cass) .wav .flac bk0010 quickload (quik) .bin bk001001 cassette (cass) .wav .flac bk001001 quickload (quik) .bin bk0010fd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .bkd bk0010fd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .bkd bk0010fd cassette (cass) .wav .flac bk0010fd quickload (quik) .bin bk0011 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .bkd bk0011 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .bkd bk0011 cassette (cass) .wav .flac bk0011 quickload (quik) .bin bk0011m floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .bkd bk0011m floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .bkd bk0011m cassette (cass) .wav .flac bk0011m quickload (quik) .bin bk08 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx bk08 quickload (quik) .raw .scr bk08 cassette (cass) .wav .flac .tzx .tap .blk bk8t floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi bk8t floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi bk8t floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi bk8t floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi bk8t cassette (cass) .wav .flac bkrankp cartridge (cart) .bin blackbd harddisk (hard) .chd .hd .hdv .2mg .hdi blackbd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr blackbda harddisk (hard) .chd .hd .hdv .2mg .hdi blackbda cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr blackbdb harddisk (hard) .chd .hd .hdv .2mg .hdi blackbdb cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr blackbdu harddisk (hard) .chd .hd .hdv .2mg .hdi blackbdu cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr blitz harddisk1 (hard1) .chd .hd .hdv .2mg .hdi blitz cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr blitz harddisk2 (hard2) .chd .hd .hdv .2mg .hdi blitz cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr blitz2k harddisk1 (hard1) .chd .hd .hdv .2mg .hdi blitz2k cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr blitz2k harddisk2 (hard2) .chd .hd .hdv .2mg .hdi blitz2k cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr blitz99 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi blitz99 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr blitz99 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi blitz99 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr blitz99a harddisk1 (hard1) .chd .hd .hdv .2mg .hdi blitz99a cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr blitz99a harddisk2 (hard2) .chd .hd .hdv .2mg .hdi blitz99a cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr blitzs snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx blitzs quickload (quik) .raw .scr blitzs cassette (cass) .wav .flac .tzx .tap .blk bluenote floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf bluenote floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf bluenote harddisk (hard) .chd .hd .hdv .2mg .hdi bluenote printout (prin) .prn bm1stmix harddisk (hard) .chd .hd .hdv .2mg .hdi bm2ndmix harddisk (hard) .chd .hd .hdv .2mg .hdi bm2ndmixa harddisk (hard) .chd .hd .hdv .2mg .hdi bm3 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr bm3 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr bm3 harddisk (hard) .chd .hd .hdv .2mg .hdi bm3 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf bm3 printout (prin) .prn bm36th cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr bm36th cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr bm36th harddisk (hard) .chd .hd .hdv .2mg .hdi bm36th floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf bm36th printout (prin) .prn bm37th cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr bm37th cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr bm37th harddisk (hard) .chd .hd .hdv .2mg .hdi bm37th floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf bm37th printout (prin) .prn bm3core cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr bm3core cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr bm3core harddisk (hard) .chd .hd .hdv .2mg .hdi bm3core floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf bm3core printout (prin) .prn bm3final cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr bm3final cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr bm3final harddisk (hard) .chd .hd .hdv .2mg .hdi bm3final floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf bm3final printout (prin) .prn bm3rdmix harddisk (hard) .chd .hd .hdv .2mg .hdi bm3rdmixa harddisk (hard) .chd .hd .hdv .2mg .hdi bm3rdmixe harddisk (hard) .chd .hd .hdv .2mg .hdi bm4thmix harddisk (hard) .chd .hd .hdv .2mg .hdi bm5thmix harddisk (hard) .chd .hd .hdv .2mg .hdi bm6thmix harddisk (hard) .chd .hd .hdv .2mg .hdi bm7thmix harddisk (hard) .chd .hd .hdv .2mg .hdi bmclubmx harddisk (hard) .chd .hd .hdv .2mg .hdi bmcmxaac harddisk (hard) .chd .hd .hdv .2mg .hdi bmcompm2 harddisk (hard) .chd .hd .hdv .2mg .hdi bmcompmx harddisk (hard) .chd .hd .hdv .2mg .hdi bmcompmxb harddisk (hard) .chd .hd .hdv .2mg .hdi bmcorerm harddisk (hard) .chd .hd .hdv .2mg .hdi bmdct harddisk (hard) .chd .hd .hdv .2mg .hdi bmfinal harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidx cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidx harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidx printout (prin) .prn bmiidx2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidx2 harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidx2 printout (prin) .prn bmiidx3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidx3 harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidx3 printout (prin) .prn bmiidx3a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidx3a harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidx3a printout (prin) .prn bmiidx3b cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidx3b harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidx3b printout (prin) .prn bmiidx4 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidx4 harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidx4 printout (prin) .prn bmiidx5 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidx5 harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidx5 printout (prin) .prn bmiidx6 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidx6 harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidx6 printout (prin) .prn bmiidx6a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidx6a harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidx6a printout (prin) .prn bmiidx7 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidx7 harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidx7 printout (prin) .prn bmiidx7a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidx7a harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidx7a printout (prin) .prn bmiidx8 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidx8 harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidx8 printout (prin) .prn bmiidxa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidxa harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidxa printout (prin) .prn bmiidxc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidxc harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidxc printout (prin) .prn bmiidxc2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidxc2 harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidxc2 printout (prin) .prn bmiidxca cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidxca harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidxca printout (prin) .prn bmiidxs cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidxs harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidxs printout (prin) .prn bmiidxsa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr bmiidxsa harddisk (hard) .chd .hd .hdv .2mg .hdi bmiidxsa printout (prin) .prn bmjr cassette (cass) .wav .flac bml3 cassette (cass) .wav .flac bml3mk2 cassette (cass) .wav .flac bml3mk5 cassette (cass) .wav .flac bndarc cartridge (cart) .bin bob85 cassette (cass) .wav .flac bossa85 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk bossa85 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk bossb85 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk bossb85 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk boxingm harddisk (hard) .chd .hd .hdv .2mg .hdi brailab4 cassette (cass) .wav .flac brailab4 quickload (quik) .htp bruc100 printout (prin) .prn bruc100 cassette (cass) .wav .flac .tap .cas .tsx bruc100a cartridge (cart) .mx1 .bin .rom bruc100a printout (prin) .prn bruc100a cassette (cass) .wav .flac .tap .cas .tsx brvbladeg harddisk (hard) .chd .hd .hdv .2mg .hdi bs4thmix harddisk (hard) .chd .hd .hdv .2mg .hdi bscompmx harddisk (hard) .chd .hd .hdv .2mg .hdi btchamp cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr btltryst cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr btm2105 cassette (cass) .wav .flac .csw .uef btm2105 bitbanger (bitb) . btm2105 printout (prin) .prn bujutsu harddisk (hard) .chd .hd .hdv .2mg .hdi bup25 cartridge (cart) .bin buzztime cartridge (cart) .bin bw12 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk bw12 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk bw12 printout (prin) .prn bw14 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk bw14 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk bw14 printout (prin) .prn bw14d floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk bw14d floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk bw14d printout (prin) .prn bw2 printout (prin) .prn bw2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk bw230 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf bw230 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf bw230 printout (prin) .prn bx256hp floppydisk1 (flop1) .mfi .dfi .d80 bx256hp floppydisk2 (flop2) .mfi .dfi .d80 bx256hp cartridge (cart) .20 .40 .60 bx256hp quickload (quik) .p00 .prg .t64 byte snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx byte quickload (quik) .raw .scr byte cassette (cass) .wav .flac .tzx .tap .blk c116 cassette (cass) .wav .flac .tap c116 floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 c116 cartridge (cart) .rom .bin c116 quickload (quik) .p00 .prg c128 cassette (cass) .wav .flac .tap c128 cartridge (cart) .80 .a0 .e0 .crt c128 quickload (quik) .p00 .prg c128 romimage (rom) .bin .rom c128 floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 .d71 c128_de cassette (cass) .wav .flac .tap c128_de cartridge (cart) .80 .a0 .e0 .crt c128_de quickload (quik) .p00 .prg c128_de romimage (rom) .bin .rom c128_de floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 .d71 c128_se cassette (cass) .wav .flac .tap c128_se cartridge (cart) .80 .a0 .e0 .crt c128_se quickload (quik) .p00 .prg c128_se romimage (rom) .bin .rom c128_se floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 .d71 c128cr cassette (cass) .wav .flac .tap c128cr cartridge (cart) .80 .a0 .e0 .crt c128cr quickload (quik) .p00 .prg c128cr romimage (rom) .bin .rom c128cr floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 .d71 c128d cassette (cass) .wav .flac .tap c128d cartridge (cart) .80 .a0 .e0 .crt c128d quickload (quik) .p00 .prg c128d romimage (rom) .bin .rom c128d floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 .d71 c128d81 cassette (cass) .wav .flac .tap c128d81 cartridge (cart) .80 .a0 .e0 .crt c128d81 quickload (quik) .p00 .prg c128d81 romimage (rom) .bin .rom c128d81 floppydisk (flop) .mfi .dfi .d81 c128dcr cassette (cass) .wav .flac .tap c128dcr cartridge (cart) .80 .a0 .e0 .crt c128dcr quickload (quik) .p00 .prg c128dcr romimage (rom) .bin .rom c128dcr floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 .d71 c128dcr_de cassette (cass) .wav .flac .tap c128dcr_de cartridge (cart) .80 .a0 .e0 .crt c128dcr_de quickload (quik) .p00 .prg c128dcr_de romimage (rom) .bin .rom c128dcr_de floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 .d71 c128dcr_se cassette (cass) .wav .flac .tap c128dcr_se cartridge (cart) .80 .a0 .e0 .crt c128dcr_se quickload (quik) .p00 .prg c128dcr_se romimage (rom) .bin .rom c128dcr_se floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 .d71 c128dcrp cassette (cass) .wav .flac .tap c128dcrp cartridge (cart) .80 .a0 .e0 .crt c128dcrp quickload (quik) .p00 .prg c128dcrp romimage (rom) .bin .rom c128dcrp floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 .d71 c128dp cassette (cass) .wav .flac .tap c128dp cartridge (cart) .80 .a0 .e0 .crt c128dp quickload (quik) .p00 .prg c128dp romimage (rom) .bin .rom c128dp floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 .d71 c128p cassette (cass) .wav .flac .tap c128p cartridge (cart) .80 .a0 .e0 .crt c128p quickload (quik) .p00 .prg c128p romimage (rom) .bin .rom c128p floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 .d71 c16 cassette (cass) .wav .flac .tap c16 floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 c16 cartridge (cart) .rom .bin c16 quickload (quik) .p00 .prg c16_hu cassette (cass) .wav .flac .tap c16_hu floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 c16_hu cartridge (cart) .rom .bin c16_hu quickload (quik) .p00 .prg c16p cassette (cass) .wav .flac .tap c16p floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 c16p cartridge (cart) .rom .bin c16p quickload (quik) .p00 .prg c1p cassette (cass) .wav .flac c1pmf cassette (cass) .wav .flac c1pmf floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk c232 cassette (cass) .wav .flac .tap c232 floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 c232 cartridge (cart) .rom .bin c232 quickload (quik) .p00 .prg c264 cassette (cass) .wav .flac .tap c264 floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 c264 cartridge (cart) .rom .bin c264 quickload (quik) .p00 .prg c2717 cassette (cass) .wav .flac .pmd .tap .ptp c2717pmd cassette (cass) .wav .flac .pmd .tap .ptp c286lt floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf c286lt floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf c286lt harddisk (hard) .chd .hd .hdv .2mg .hdi c2color cartridge (cart) .bin c386sx16 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf c386sx16 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf c386sx16 harddisk (hard) .chd .hd .hdv .2mg .hdi c386sx25 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf c386sx25 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf c386sx25 harddisk (hard) .chd .hd .hdv .2mg .hdi c386sxlt floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf c386sxlt floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf c386sxlt harddisk (hard) .chd .hd .hdv .2mg .hdi c64 cassette (cass) .wav .flac .tap c64 floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 c64 cartridge (cart) .80 .a0 .e0 .crt c64 quickload (quik) .p00 .prg .t64 c64_jp cassette (cass) .wav .flac .tap c64_jp floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 c64_jp cartridge (cart) .80 .a0 .e0 .crt c64_jp quickload (quik) .p00 .prg .t64 c64_se cassette (cass) .wav .flac .tap c64_se floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 c64_se cartridge (cart) .80 .a0 .e0 .crt c64_se quickload (quik) .p00 .prg .t64 c64c cassette (cass) .wav .flac .tap c64c floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 c64c cartridge (cart) .80 .a0 .e0 .crt c64c quickload (quik) .p00 .prg .t64 c64c_es cassette (cass) .wav .flac .tap c64c_es floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 c64c_es cartridge (cart) .80 .a0 .e0 .crt c64c_es quickload (quik) .p00 .prg .t64 c64c_se cassette (cass) .wav .flac .tap c64c_se floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 c64c_se cartridge (cart) .80 .a0 .e0 .crt c64c_se quickload (quik) .p00 .prg .t64 c64cp cassette (cass) .wav .flac .tap c64cp floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 c64cp cartridge (cart) .80 .a0 .e0 .crt c64cp quickload (quik) .p00 .prg .t64 c64dx cartridge (cart) .bin c64g cassette (cass) .wav .flac .tap c64g floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 c64g cartridge (cart) .80 .a0 .e0 .crt c64g quickload (quik) .p00 .prg .t64 c64gs cartridge (cart) .80 .a0 .e0 .crt c64gs quickload (quik) .p00 .prg .t64 c64p cassette (cass) .wav .flac .tap c64p floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 c64p cartridge (cart) .80 .a0 .e0 .crt c64p quickload (quik) .p00 .prg .t64 c65 cartridge (cart) .bin c80 cassette (cass) .wav .flac cadd810 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf cadd810 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf cadd810 printout (prin) .prn calchase harddisk (hard) .chd .hd .hdv .2mg .hdi calspeed harddisk1 (hard1) .chd .hd .hdv .2mg .hdi calspeed cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr calspeed harddisk2 (hard2) .chd .hd .hdv .2mg .hdi calspeed cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr calspeeda harddisk1 (hard1) .chd .hd .hdv .2mg .hdi calspeeda cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr calspeeda harddisk2 (hard2) .chd .hd .hdv .2mg .hdi calspeeda cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr calspeedb harddisk1 (hard1) .chd .hd .hdv .2mg .hdi calspeedb cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr calspeedb harddisk2 (hard2) .chd .hd .hdv .2mg .hdi calspeedb cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr can09t cassette (cass) .wav .flac canonv10 cartridge1 (cart1) .mx1 .bin .rom canonv10 cartridge2 (cart2) .mx1 .bin .rom canonv10 printout (prin) .prn canonv10 cassette (cass) .wav .flac .tap .cas .tsx canonv20 cartridge1 (cart1) .mx1 .bin .rom canonv20 cartridge2 (cart2) .mx1 .bin .rom canonv20 printout (prin) .prn canonv20 cassette (cass) .wav .flac .tap .cas .tsx canonv20e cartridge1 (cart1) .mx1 .bin .rom canonv20e cartridge2 (cart2) .mx1 .bin .rom canonv20e printout (prin) .prn canonv20e cassette (cass) .wav .flac .tap .cas .tsx canonv20f cartridge1 (cart1) .mx1 .bin .rom canonv20f cartridge2 (cart2) .mx1 .bin .rom canonv20f printout (prin) .prn canonv20f cassette (cass) .wav .flac .tap .cas .tsx canonv20g cartridge1 (cart1) .mx1 .bin .rom canonv20g cartridge2 (cart2) .mx1 .bin .rom canonv20g printout (prin) .prn canonv20g cassette (cass) .wav .flac .tap .cas .tsx canonv20s cartridge1 (cart1) .mx1 .bin .rom canonv20s cartridge2 (cart2) .mx1 .bin .rom canonv20s printout (prin) .prn canonv20s cassette (cass) .wav .flac .tap .cas .tsx canonv25 cartridge1 (cart1) .mx1 .bin .rom canonv25 cartridge2 (cart2) .mx1 .bin .rom canonv25 printout (prin) .prn canonv25 cassette (cass) .wav .flac .tap .cas .tsx canonv30f cartridge1 (cart1) .mx1 .bin .rom canonv30f cartridge2 (cart2) .mx1 .bin .rom canonv30f floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk canonv30f printout (prin) .prn canonv30f cassette (cass) .wav .flac .tap .cas .tsx canonv8 cartridge (cart) .mx1 .bin .rom canonv8 cassette (cass) .wav .flac .tap .cas .tsx carbeena cartridge (cart) .bin carmarty floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin carmarty cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr carmarty memcard (memc) .icm carnevil harddisk1 (hard1) .chd .hd .hdv .2mg .hdi carnevil cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr carnevil harddisk2 (hard2) .chd .hd .hdv .2mg .hdi carnevil cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr carnevil1 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi carnevil1 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr carnevil1 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi carnevil1 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr carnivac harddisk (hard) .chd .hd .hdv .2mg .hdi carnivac cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr carnking harddisk1 (hard1) .chd .hd .hdv .2mg .hdi carnking cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr carnking harddisk2 (hard2) .chd .hd .hdv .2mg .hdi carnking cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr cartfury harddisk1 (hard1) .chd .hd .hdv .2mg .hdi cartfury cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr cartfury harddisk2 (hard2) .chd .hd .hdv .2mg .hdi cartfury cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr casiorom cartridge (cart) .bin casloopy cartridge (cart) .bin cassvisn cartridge (cart) .bin cbm3008 floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 cbm3008 floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 cbm3008 cassette (cass) .wav .flac .tap cbm3008 quickload (quik) .p00 .prg cbm3008 cartridge1 (cart1) .bin .rom cbm3008 cartridge2 (cart2) .bin .rom cbm3016 floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 cbm3016 floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 cbm3016 cassette (cass) .wav .flac .tap cbm3016 quickload (quik) .p00 .prg cbm3016 cartridge1 (cart1) .bin .rom cbm3016 cartridge2 (cart2) .bin .rom cbm3032 floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 cbm3032 floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 cbm3032 cassette (cass) .wav .flac .tap cbm3032 quickload (quik) .p00 .prg cbm3032 cartridge1 (cart1) .bin .rom cbm3032 cartridge2 (cart2) .bin .rom cbm3032b floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 cbm3032b floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 cbm3032b cassette (cass) .wav .flac .tap cbm3032b quickload (quik) .p00 .prg cbm3032b cartridge1 (cart1) .bin .rom cbm3032b cartridge2 (cart2) .bin .rom cbm3032b cartridge3 (cart3) .bin .rom cbm4016 floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 cbm4016 floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 cbm4016 cassette (cass) .wav .flac .tap cbm4016 quickload (quik) .p00 .prg cbm4016 cartridge1 (cart1) .bin .rom cbm4016 cartridge2 (cart2) .bin .rom cbm4032 floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 cbm4032 floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 cbm4032 cassette (cass) .wav .flac .tap cbm4032 quickload (quik) .p00 .prg cbm4032 cartridge1 (cart1) .bin .rom cbm4032 cartridge2 (cart2) .bin .rom cbm4032b floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 cbm4032b floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 cbm4032b cassette (cass) .wav .flac .tap cbm4032b quickload (quik) .p00 .prg cbm4032b cartridge1 (cart1) .bin .rom cbm4032b cartridge2 (cart2) .bin .rom cbm4032f floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 cbm4032f floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 cbm4032f cassette (cass) .wav .flac .tap cbm4032f quickload (quik) .p00 .prg cbm4032f cartridge1 (cart1) .bin .rom cbm4032f cartridge2 (cart2) .bin .rom cbm610 floppydisk1 (flop1) .mfi .dfi .d80 cbm610 floppydisk2 (flop2) .mfi .dfi .d80 cbm610 cartridge (cart) .20 .40 .60 cbm610 quickload (quik) .p00 .prg .t64 cbm620 floppydisk1 (flop1) .mfi .dfi .d80 cbm620 floppydisk2 (flop2) .mfi .dfi .d80 cbm620 cartridge (cart) .20 .40 .60 cbm620 quickload (quik) .p00 .prg .t64 cbm620_hu floppydisk1 (flop1) .mfi .dfi .d80 cbm620_hu floppydisk2 (flop2) .mfi .dfi .d80 cbm620_hu cartridge (cart) .20 .40 .60 cbm620_hu quickload (quik) .p00 .prg .t64 cbm710 floppydisk1 (flop1) .mfi .dfi .d80 cbm710 floppydisk2 (flop2) .mfi .dfi .d80 cbm710 cartridge (cart) .20 .40 .60 cbm710 quickload (quik) .p00 .prg .t64 cbm720 floppydisk1 (flop1) .mfi .dfi .d80 cbm720 floppydisk2 (flop2) .mfi .dfi .d80 cbm720 cartridge (cart) .20 .40 .60 cbm720 quickload (quik) .p00 .prg .t64 cbm720_de floppydisk1 (flop1) .mfi .dfi .d80 cbm720_de floppydisk2 (flop2) .mfi .dfi .d80 cbm720_de cartridge (cart) .20 .40 .60 cbm720_de quickload (quik) .p00 .prg .t64 cbm720_se floppydisk1 (flop1) .mfi .dfi .d80 cbm720_se floppydisk2 (flop2) .mfi .dfi .d80 cbm720_se cartridge (cart) .20 .40 .60 cbm720_se quickload (quik) .p00 .prg .t64 cbm730 floppydisk1 (flop1) .mfi .dfi .d80 cbm730 floppydisk2 (flop2) .mfi .dfi .d80 cbm730 cartridge (cart) .20 .40 .60 cbm730 quickload (quik) .p00 .prg .t64 cbm8032 floppydisk1 (flop1) .mfi .dfi .d80 cbm8032 floppydisk2 (flop2) .mfi .dfi .d80 cbm8032 cassette (cass) .wav .flac .tap cbm8032 quickload (quik) .p00 .prg cbm8032 cartridge1 (cart1) .bin .rom cbm8032 cartridge2 (cart2) .bin .rom cbm8032_de floppydisk1 (flop1) .mfi .dfi .d80 cbm8032_de floppydisk2 (flop2) .mfi .dfi .d80 cbm8032_de cassette (cass) .wav .flac .tap cbm8032_de quickload (quik) .p00 .prg cbm8032_de cartridge1 (cart1) .bin .rom cbm8032_de cartridge2 (cart2) .bin .rom cbm8032_fr floppydisk1 (flop1) .mfi .dfi .d80 cbm8032_fr floppydisk2 (flop2) .mfi .dfi .d80 cbm8032_fr cassette (cass) .wav .flac .tap cbm8032_fr quickload (quik) .p00 .prg cbm8032_fr cartridge1 (cart1) .bin .rom cbm8032_fr cartridge2 (cart2) .bin .rom cbm8032_se floppydisk1 (flop1) .mfi .dfi .d80 cbm8032_se floppydisk2 (flop2) .mfi .dfi .d80 cbm8032_se cassette (cass) .wav .flac .tap cbm8032_se quickload (quik) .p00 .prg cbm8032_se cartridge1 (cart1) .bin .rom cbm8032_se cartridge2 (cart2) .bin .rom cbm8096 floppydisk1 (flop1) .mfi .dfi .d80 cbm8096 floppydisk2 (flop2) .mfi .dfi .d80 cbm8096 cassette (cass) .wav .flac .tap cbm8096 quickload (quik) .p00 .prg cbm8096 cartridge1 (cart1) .bin .rom cbm8096 cartridge2 (cart2) .bin .rom cbm8296 floppydisk1 (flop1) .mfi .dfi .d80 .d82 cbm8296 floppydisk2 (flop2) .mfi .dfi .d80 .d82 cbm8296 cassette (cass) .wav .flac .tap cbm8296 quickload (quik) .p00 .prg cbm8296 cartridge1 (cart1) .bin .rom cbm8296 cartridge2 (cart2) .bin .rom cbm8296d floppydisk1 (flop1) .mfi .dfi .d80 .d82 cbm8296d floppydisk2 (flop2) .mfi .dfi .d80 .d82 cbm8296d cassette (cass) .wav .flac .tap cbm8296d quickload (quik) .p00 .prg cbm8296d cartridge1 (cart1) .bin .rom cbm8296d cartridge2 (cart2) .bin .rom cbm8296d_de floppydisk1 (flop1) .mfi .dfi .d80 .d82 cbm8296d_de floppydisk2 (flop2) .mfi .dfi .d80 .d82 cbm8296d_de cassette (cass) .wav .flac .tap cbm8296d_de quickload (quik) .p00 .prg cbm8296d_de cartridge1 (cart1) .bin .rom cbm8296d_de cartridge2 (cart2) .bin .rom cbm8296dgv_de floppydisk1 (flop1) .mfi .dfi .d80 .d82 cbm8296dgv_de floppydisk2 (flop2) .mfi .dfi .d80 .d82 cbm8296dgv_de cassette (cass) .wav .flac .tap cbm8296dgv_de quickload (quik) .p00 .prg cbm8296dgv_de cartridge1 (cart1) .bin .rom cbm8296dgv_de cartridge2 (cart2) .bin .rom cbm8296ed floppydisk1 (flop1) .mfi .dfi .d80 .d82 cbm8296ed floppydisk2 (flop2) .mfi .dfi .d80 .d82 cbm8296ed cassette (cass) .wav .flac .tap cbm8296ed quickload (quik) .p00 .prg cbm8296ed cartridge1 (cart1) .bin .rom cbm8296ed cartridge2 (cart2) .bin .rom cbm8296gd floppydisk1 (flop1) .mfi .dfi .d80 .d82 cbm8296gd floppydisk2 (flop2) .mfi .dfi .d80 .d82 cbm8296gd cassette (cass) .wav .flac .tap cbm8296gd quickload (quik) .p00 .prg cbm8296gd cartridge1 (cart1) .bin .rom cbm8296gd cartridge2 (cart2) .bin .rom cc40 cartridge (cart) .bin .rom .256 cc40p cartridge (cart) .bin .rom .256 cc40p cassette (cass) .wav .flac ccfboxa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ccs2422 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ccs300 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk cd2650 quickload (quik) .pgm cd2650 cassette (cass) .wav .flac cd3000i floppydisk (flop) .mfi .dfi .mfm .td0 .imd .dsk .ima .img .ufi .360 .ipf .hfe cd3000i midiin (min) .mid .syx cd3000i midiout (mout) .mid cd3000i cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cd3000i harddisk (hard) .chd .hd .hdv .2mg .hdi cd3000xl floppydisk (flop) .mfi .dfi .mfm .td0 .imd .dsk .ima .img .ufi .360 .ipf .hfe cd3000xl midiin (min) .mid .syx cd3000xl midiout (mout) .mid cd3000xl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cd3000xl harddisk (hard) .chd .hd .hdv .2mg .hdi cd32 printout (prin) .prn cd32 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cd32n printout (prin) .prn cd32n cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cd6809 cassette (cass) .wav .flac .cas cd6809 printout (prin) .prn cd6809 cartridge (cart) .ccc .rom cd6809 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 cd6809 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 cd6809 harddisk1 (hard1) .vhd cd6809 harddisk2 (hard2) .vhd cdi490a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cdi910 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cdibios cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cdimono1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cdimono2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cdtekg2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf cdtekg2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf cdtekg2 harddisk (hard) .chd .hd .hdv .2mg .hdi cdtv floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf cdtv printout (prin) .prn cdtv cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cdtvn floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .adf .ipf cdtvn printout (prin) .prn cdtvn cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cdx cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cec2000 cassette (cass) .wav .flac cec2000 floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib cec2000 floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib cece cassette (cass) .wav .flac cece floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib cece floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib cecg cassette (cass) .wav .flac cecg floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib cecg floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib ceci cassette (cass) .wav .flac ceci floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib ceci floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib cecm cassette (cass) .wav .flac cecm floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib cecm floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib ceres1 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi ceres1 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi ceres1 harddisk3 (hard3) .chd .hd .hdv .2mg .hdi ceres1 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk cf1200 cartridge1 (cart1) .mx1 .bin .rom cf1200 cartridge2 (cart2) .mx1 .bin .rom cf1200 printout (prin) .prn cf1200 cassette (cass) .wav .flac .tap .cas .tsx cf2000 cartridge1 (cart1) .mx1 .bin .rom cf2000 cartridge2 (cart2) .mx1 .bin .rom cf2000 printout (prin) .prn cf2000 cassette (cass) .wav .flac .tap .cas .tsx cf2700 cartridge1 (cart1) .mx1 .bin .rom cf2700 cartridge2 (cart2) .mx1 .bin .rom cf2700 printout (prin) .prn cf2700 cassette (cass) .wav .flac .tap .cas .tsx cf2700g cartridge1 (cart1) .mx1 .bin .rom cf2700g cartridge2 (cart2) .mx1 .bin .rom cf2700g printout (prin) .prn cf2700g cassette (cass) .wav .flac .tap .cas .tsx cf2700uk cartridge1 (cart1) .mx1 .bin .rom cf2700uk cartridge2 (cart2) .mx1 .bin .rom cf2700uk printout (prin) .prn cf2700uk cassette (cass) .wav .flac .tap .cas .tsx cf3000 cartridge1 (cart1) .mx1 .bin .rom cf3000 cartridge2 (cart2) .mx1 .bin .rom cf3000 printout (prin) .prn cf3000 cassette (cass) .wav .flac .tap .cas .tsx cf3300 cartridge1 (cart1) .mx1 .bin .rom cf3300 cartridge2 (cart2) .mx1 .bin .rom cf3300 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk cf3300 printout (prin) .prn cf3300 cassette (cass) .wav .flac .tap .cas .tsx cfa3000 cartridge1 (cart1) .rom .bin cfa3000 cartridge2 (cart2) .rom .bin cfa3000 romimage1 (rom1) .rom .bin cfa3000 cassette (cass) .wav .flac .csw .uef cfa3000 printout (prin) .prn cfa3000bp cassette (cass) .wav .flac .csw .uef cfa3000bp printout (prin) .prn cfa3000bp romimage1 (rom1) .rom .bin cfa3000bp romimage2 (rom2) .rom .bin cfa3000bp romimage3 (rom3) .rom .bin cfa3000bp romimage4 (rom4) .rom .bin cfa3000bp romimage5 (rom5) .rom .bin cfield cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cgenie cassette (cass) .wav .flac .cas cgenienz cassette (cass) .wav .flac .cas ch48633c floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ch48633c floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ch48633c harddisk (hard) .chd .hd .hdv .2mg .hdi ch48633c printout (prin) .prn ch486spm harddisk (hard) .chd .hd .hdv .2mg .hdi ch486spm cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ch486spm printout (prin) .prn ch491e floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ch491e floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ch491e harddisk (hard) .chd .hd .hdv .2mg .hdi ch491e printout (prin) .prn ch4slez1 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ch4slez1 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ch4slez1 harddisk (hard) .chd .hd .hdv .2mg .hdi ch4slez1 printout (prin) .prn ch4spi harddisk (hard) .chd .hd .hdv .2mg .hdi ch4spi cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ch4spi printout (prin) .prn chalgear cartridge (cart) .bin channelf cartridge (cart) .bin .chf channlf2 cartridge (cart) .bin .chf chaoshea harddisk (hard) .chd .hd .hdv .2mg .hdi chaosheaj harddisk (hard) .chd .hd .hdv .2mg .hdi chesskng cartridge (cart) .bin chessmstdm cartridge (cart) .bin chloe snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx chloe quickload (quik) .raw .scr chloe cassette (cass) .wav .flac .tzx .tap .blk chloe harddisk (hard) .chd .hd .hdv .2mg .hdi chn333sc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf chn333sc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf chn333sc harddisk (hard) .chd .hd .hdv .2mg .hdi chn333sc printout (prin) .prn chocomk cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr chocovdr cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cip01 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx cip01 quickload (quik) .raw .scr cip01 cassette (cass) .wav .flac .tzx .tap .blk cip03 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx cip03 quickload (quik) .raw .scr cip03 cassette (cass) .wav .flac .tzx .tap .blk ckz80 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk cl28612s floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf cl28612s floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf cl28612s harddisk (hard) .chd .hd .hdv .2mg .hdi cleoftp cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr clikstrt cartridge (cart) .bin clipper cassette (cass) .wav .flac .tap clipper floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 clipper cartridge (cart) .80 .a0 .e0 .crt clipper quickload (quik) .p00 .prg .t64 clubkcyc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr clubkcyco cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cm1200 cartridge (cart) .st2 .bin .rom cm32p cartridge (cart) .bin cmi2x midiout1 (mout1) .mid cmi2x midiout2 (mout2) .mid cmi2x midiout3 (mout3) .mid cmi2x midiout4 (mout4) .mid cmi2x midiin1 (min1) .mid .syx cmi2x midiin2 (min2) .mid .syx cmi2x midiin3 (min3) .mid .syx cmi2x floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk cmi2x floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk cmpa286 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf cmpa286 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf cmpa286 harddisk (hard) .chd .hd .hdv .2mg .hdi cms6502 printout (prin) .prn cms6502 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ssd .bbc .img .dsd cms6502 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ssd .bbc .img .dsd cndypuzl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cobra80 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx cobra80 quickload (quik) .raw .scr cobra80 cassette (cass) .wav .flac .tzx .tap .blk cobrasp snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx cobrasp quickload (quik) .raw .scr cobrasp cassette (cass) .wav .flac .tzx .tap .blk coco cassette (cass) .wav .flac .cas coco printout (prin) .prn coco cartridge (cart) .ccc .rom coco floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 coco floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 coco harddisk1 (hard1) .vhd coco harddisk2 (hard2) .vhd coco2b cassette (cass) .wav .flac .cas coco2b printout (prin) .prn coco2b cartridge (cart) .ccc .rom coco2b floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 coco2b floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 coco2b harddisk1 (hard1) .vhd coco2b harddisk2 (hard2) .vhd coco2bh cassette (cass) .wav .flac .cas coco2bh printout (prin) .prn coco2bh cartridge (cart) .ccc .rom coco2bh floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 coco2bh floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 coco2bh harddisk1 (hard1) .vhd coco2bh harddisk2 (hard2) .vhd coco3 cassette (cass) .wav .flac .cas coco3 printout (prin) .prn coco3 harddisk1 (hard1) .vhd coco3 harddisk2 (hard2) .vhd coco3 cartridge (cart) .ccc .rom coco3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 coco3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 coco3h cassette (cass) .wav .flac .cas coco3h printout (prin) .prn coco3h harddisk1 (hard1) .vhd coco3h harddisk2 (hard2) .vhd coco3h cartridge (cart) .ccc .rom coco3h floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 coco3h floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 coco3p cassette (cass) .wav .flac .cas coco3p printout (prin) .prn coco3p harddisk1 (hard1) .vhd coco3p harddisk2 (hard2) .vhd coco3p cartridge (cart) .ccc .rom coco3p floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 coco3p floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 cocoh cassette (cass) .wav .flac .cas cocoh printout (prin) .prn cocoh cartridge (cart) .ccc .rom cocoh floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 cocoh floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 cocoh harddisk1 (hard1) .vhd cocoh harddisk2 (hard2) .vhd code1d harddisk (hard) .chd .hd .hdv .2mg .hdi code1db harddisk (hard) .chd .hd .hdv .2mg .hdi coh1000w harddisk (hard) .chd .hd .hdv .2mg .hdi coleco cartridge (cart) .rom .col .bin colecop cartridge (cart) .rom .col .bin comdesk floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf comdesk floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf comdesk printout (prin) .prn comebaby harddisk (hard) .chd .hd .hdv .2mg .hdi comebaby cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr comebaby floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf comebaby floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf comebaby printout (prin) .prn compani1 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx compani1 quickload (quik) .raw .scr compani1 cassette (cass) .wav .flac .tzx .tap .blk compc1 printout1 (prin1) .prn compc1 printout2 (prin2) .prn compc1 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf compc1 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf compc10 printout1 (prin1) .prn compc10 printout2 (prin2) .prn compc10 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf compc10 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf compclr2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .ccvf compis cassette (cass) .wav .flac compis printout (prin) .prn compis floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img compis floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img compis2 cassette (cass) .wav .flac compis2 printout (prin) .prn compis2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img compis2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img comport floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf comport floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf comport printout (prin) .prn comportii floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf comportii harddisk1 (hard1) .chd .hd .hdv .2mg .hdi comportii harddisk2 (hard2) .chd .hd .hdv .2mg .hdi comportiii floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf comportiii harddisk1 (hard1) .chd .hd .hdv .2mg .hdi comportiii harddisk2 (hard2) .chd .hd .hdv .2mg .hdi comslt286 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf comslt286 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf comslt286 harddisk (hard) .chd .hd .hdv .2mg .hdi comt386 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf comt386 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf comt386 harddisk (hard) .chd .hd .hdv .2mg .hdi comt386 printout (prin) .prn comt486 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf comt486 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf comt486 harddisk (hard) .chd .hd .hdv .2mg .hdi comt486 printout (prin) .prn comx35n quickload (quik) .comx comx35n cassette (cass) .wav .flac comx35n floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img comx35p quickload (quik) .comx comx35p cassette (cass) .wav .flac comx35p floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img conc cartridge (cart) .bin conca cartridge (cart) .bin concams cartridge (cart) .bin concams5 cartridge (cart) .bin concept floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f concept floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f concept floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f concept floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f concgla cartridge (cart) .bin concglap cartridge (cart) .bin concglapa cartridge (cart) .bin concvicp cartridge (cart) .bin confmiss cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr copera cartridge (cart) .bin .md coppc21 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf coppc21 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf coppc21 printout (prin) .prn coppc400 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf coppc400 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf coppc400 printout (prin) .prn corona romimage (rom) .bin coronaa romimage (rom) .bin coronab romimage (rom) .bin cosmicos quickload (quik) .bin cosmicos cassette (cass) .wav .flac cp1 cassette (cass) .wav .flac cp1 quickload (quik) .obj cp400 cassette (cass) .wav .flac .cas cp400 printout (prin) .prn cp400 cartridge (cart) .ccc .rom cp400 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 cp400 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 cp400 harddisk1 (hard1) .vhd cp400 harddisk2 (hard2) .vhd cp400c2 cassette (cass) .wav .flac .cas cp400c2 printout (prin) .prn cp400c2 cartridge (cart) .ccc .rom cp400c2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 cp400c2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 cp400c2 harddisk1 (hard1) .vhd cp400c2 harddisk2 (hard2) .vhd cp500 cassette (cass) .wav .flac .cas cp500 quickload (quik) .cmd cp500 floppydisk1 (flop1) .mfi .dfi .imd .jv3 .dsk .dmk .jv1 cp500 floppydisk2 (flop2) .mfi .dfi .imd .jv3 .dsk .dmk .jv1 cp500 printout (prin) .prn cpc300 cartridge (cart) .mx1 .bin .rom cpc300 printout (prin) .prn cpc300 cassette (cass) .wav .flac .tap .cas .tsx cpc300e cartridge (cart) .mx1 .bin .rom cpc300e printout (prin) .prn cpc300e cassette (cass) .wav .flac .tap .cas .tsx cpc330k cartridge (cart) .mx1 .bin .rom cpc330k printout (prin) .prn cpc330k cassette (cass) .wav .flac .tap .cas .tsx cpc400 cartridge (cart) .mx1 .bin .rom cpc400 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk cpc400 printout (prin) .prn cpc400 cassette (cass) .wav .flac .tap .cas .tsx cpc400s cartridge (cart) .mx1 .bin .rom cpc400s floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk cpc400s printout (prin) .prn cpc400s cassette (cass) .wav .flac .tap .cas .tsx cpc464 printout (prin) .prn cpc464 snapshot (dump) .sna cpc464 cassette (cass) .wav .flac .cdt cpc464p printout (prin) .prn cpc464p snapshot (dump) .sna cpc464p cassette (cass) .wav .flac .cdt cpc464p floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf cpc464p floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf cpc464p cartridge (cart) .bin .cpr cpc50a cartridge (cart) .mx1 .bin .rom cpc50b cartridge (cart) .mx1 .bin .rom cpc51 cartridge (cart) .mx1 .bin .rom cpc61 cartridge (cart) .mx1 .bin .rom cpc6128 printout (prin) .prn cpc6128 snapshot (dump) .sna cpc6128 cassette (cass) .wav .flac .cdt cpc6128 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf cpc6128 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf cpc6128f printout (prin) .prn cpc6128f snapshot (dump) .sna cpc6128f cassette (cass) .wav .flac .cdt cpc6128f floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf cpc6128f floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf cpc6128p printout (prin) .prn cpc6128p snapshot (dump) .sna cpc6128p cassette (cass) .wav .flac .cdt cpc6128p floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf cpc6128p floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf cpc6128p cartridge (cart) .bin .cpr cpc6128s printout (prin) .prn cpc6128s snapshot (dump) .sna cpc6128s cassette (cass) .wav .flac .cdt cpc6128s floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf cpc6128s floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf cpc6128sp printout (prin) .prn cpc6128sp snapshot (dump) .sna cpc6128sp cassette (cass) .wav .flac .cdt cpc6128sp floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf cpc6128sp floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf cpc664 printout (prin) .prn cpc664 snapshot (dump) .sna cpc664 cassette (cass) .wav .flac .cdt cpc664 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf cpc664 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf cpc88 cassette (cass) .wav .flac .tap .cas .tsx cpg120 cartridge1 (cart1) .mx1 .bin .rom cpg120 cartridge2 (cart2) .mx1 .bin .rom cpg120 cassette (cass) .wav .flac .tap .cas .tsx cps3boot cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cps3boota cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cps3bootao cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cps3bootao2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cps3booto cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cps3booto2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cps3bs32 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cps3bs32a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cpu09 cassette (cass) .wav .flac cr589fw cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cr589fwa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr craft2p floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib craft2p floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib craft2p cassette (cass) .wav .flac cregchg cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr crei680 cassette (cass) .wav .flac crisscrs floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk crtaxihr cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr crvisio2 cassette (cass) .wav .flac crvisio2 printout (prin) .prn crvisio2 cartridge (cart) .bin .rom crvisioj cassette (cass) .wav .flac crvisioj printout (prin) .prn crvisioj cartridge (cart) .bin .rom crvision cassette (cass) .wav .flac crvision printout (prin) .prn crvision cartridge (cart) .bin .rom cryptklr harddisk (hard) .chd .hd .hdv .2mg .hdi cs113 cassette (cass) .wav .flac cs113 romimage (rom) .bin .rom cs8230 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf cs8230 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf cs8230 harddisk (hard) .chd .hd .hdv .2mg .hdi cs8230 printout (prin) .prn csl286 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf csl286 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf csl286 harddisk (hard) .chd .hd .hdv .2mg .hdi csplayh1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr csplayh5 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr csplayh6 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr csplayh7 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ct386sx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ct386sx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ct386sx harddisk (hard) .chd .hd .hdv .2mg .hdi ct486 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ct486 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ct486 harddisk (hard) .chd .hd .hdv .2mg .hdi ct486 printout (prin) .prn ctcc386mx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ctcc386mx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ctcc386mx harddisk (hard) .chd .hd .hdv .2mg .hdi ctcc386mx printout (prin) .prn ctvboy cartridge (cart) .bin cubibrd4 cartridge1 (cart1) .bin cubibrd4 cartridge2 (cart2) .bin cubo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cvs2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cvs2mf cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cvsgd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr cx3000tc quickload (quik) .pgm .tvc cx3000tc cartridge (cart) .bin .rom cx5f cartridge (cart) .mx1 .bin .rom cx5f cartridge60pin (cart60p) .mx1 .bin .rom cx5f midiout (mout) .mid cx5f midiin (min) .mid .syx cx5f printout (prin) .prn cx5f cassette (cass) .wav .flac .tap .cas .tsx cx5f1 cartridge (cart) .mx1 .bin .rom cx5f1 cartridge60pin (cart60p) .mx1 .bin .rom cx5f1 midiout (mout) .mid cx5f1 midiin (min) .mid .syx cx5f1 printout (prin) .prn cx5f1 cassette (cass) .wav .flac .tap .cas .tsx cx5m128 cartridge1 (cart1) .mx1 .bin .rom cx5m128 cartridge2 (cart2) .mx1 .bin .rom cx5m128 yamahaminicart (mini) .mx1 .bin .rom cx5m128 cartridge60pin (cart60p) .mx1 .bin .rom cx5m128 midiout (mout) .mid cx5m128 midiin (min) .mid .syx cx5m128 printout (prin) .prn cx5m128 cassette (cass) .wav .flac .tap .cas .tsx cx5miib cartridge1 (cart1) .mx1 .bin .rom cx5miib cartridge2 (cart2) .mx1 .bin .rom cx5miib yamahaminicart (mini) .mx1 .bin .rom cx5miib cartridge60pin (cart60p) .mx1 .bin .rom cx5miib midiout (mout) .mid cx5miib midiin (min) .mid .syx cx5miib printout (prin) .prn cx5miib cassette (cass) .wav .flac .tap .cas .tsx cx5mu cartridge (cart) .mx1 .bin .rom cx5mu cartridge60pin (cart60p) .mx1 .bin .rom cx5mu midiout (mout) .mid cx5mu midiin (min) .mid .syx cx5mu printout (prin) .prn cx5mu cassette (cass) .wav .flac .tap .cas .tsx cx7128 cartridge1 (cart1) .mx1 .bin .rom cx7128 cartridge2 (cart2) .mx1 .bin .rom cx7128 yamahaminicart (mini) .mx1 .bin .rom cx7128 cartridge60pin (cart60p) .mx1 .bin .rom cx7128 printout (prin) .prn cx7128 cassette (cass) .wav .flac .tap .cas .tsx cx7m128 cartridge1 (cart1) .mx1 .bin .rom cx7m128 cartridge2 (cart2) .mx1 .bin .rom cx7m128 yamahaminicart (mini) .mx1 .bin .rom cx7m128 cartridge60pin (cart60p) .mx1 .bin .rom cx7m128 midiout (mout) .mid cx7m128 midiin (min) .mid .syx cx7m128 printout (prin) .prn cx7m128 cassette (cass) .wav .flac .tap .cas .tsx cxsxd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf cxsxd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf cxsxd harddisk (hard) .chd .hd .hdv .2mg .hdi cybikov1 quickload (quik) .bin .nv cybikov2 quickload (quik) .bin .nv cybikoxt quickload (quik) .bin .nv cz1 cartridge (cart) .bin cz1 midiin (min) .mid .syx cz1 midiout1 (mout1) .mid cz1 midiout2 (mout2) .mid cz101 cartridge (cart) .bin cz101 midiin (min) .mid .syx cz101 midiout (mout) .mid cz230s midiin (min) .mid .syx cz230s midiout1 (mout1) .mid cz230s midiout2 (mout2) .mid cz230s cassette (cass) .wav .flac czz50 cartridge (cart) .rom .col .bin d64plus cassette (cass) .wav .flac .cas d64plus printout (prin) .prn d64plus cartridge (cart) .ccc .rom d64plus floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 d64plus floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 d6800 cassette (cass) .wav .flac d6800 quickload (quik) .bin .c8 d6809 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk dai cassette (cass) .wav .flac daisy cartridge1 (cart1) .rom .bin daisy cartridge2 (cart2) .rom .bin daisy romimage1 (rom1) .rom .bin daisy cassette (cass) .wav .flac .csw .uef daisy printout (prin) .prn daisy floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd daisy floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd darkhleg cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr database quickload (quik) .pgm .tvc database cartridge (cart) .bin .rom dauphin cassette (cass) .wav .flac dawg harddisk (hard) .chd .hd .hdv .2mg .hdi dawg cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr db32016 cassette (cass) .wav .flac dc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dcdev cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dceu cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dcfish cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dcjp cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dctream cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr2m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr2mc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr2mc2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr2mc2 memcard1 (memc1) .mc ddr2mc2 memcard2 (memc2) .mc ddr2ml cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr2ml memcard1 (memc1) .mc ddr2ml memcard2 (memc2) .mc ddr2mla cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr2mla memcard1 (memc1) .mc ddr2mla memcard2 (memc2) .mc ddr2mlb cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr2mlb memcard1 (memc1) .mc ddr2mlb memcard2 (memc2) .mc ddr3ma cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr3ma memcard1 (memc1) .mc ddr3ma memcard2 (memc2) .mc ddr3mj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr3mj memcard1 (memc1) .mc ddr3mj memcard2 (memc2) .mc ddr3mk cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr3mk memcard1 (memc1) .mc ddr3mk memcard2 (memc2) .mc ddr3mka cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr3mka memcard1 (memc1) .mc ddr3mka memcard2 (memc2) .mc ddr3mp cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr3mp memcard1 (memc1) .mc ddr3mp memcard2 (memc2) .mc ddr4m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr4m memcard1 (memc1) .mc ddr4m memcard2 (memc2) .mc ddr4mj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr4mj memcard1 (memc1) .mc ddr4mj memcard2 (memc2) .mc ddr4mp cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr4mp memcard1 (memc1) .mc ddr4mp memcard2 (memc2) .mc ddr4mps cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr4mps memcard1 (memc1) .mc ddr4mps memcard2 (memc2) .mc ddr4ms cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr4ms memcard1 (memc1) .mc ddr4ms memcard2 (memc2) .mc ddr4msj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr4msj memcard1 (memc1) .mc ddr4msj memcard2 (memc2) .mc ddr5m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddr5m memcard1 (memc1) .mc ddr5m memcard2 (memc2) .mc ddra cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddrbocd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddrextrm cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddrextrm memcard1 (memc1) .mc ddrextrm memcard2 (memc2) .mc ddrfammt cartridge (cart) .bin .u1 ddrj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddrja cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddrjb cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddrkara cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddrkara2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddrkids harddisk (hard) .chd .hd .hdv .2mg .hdi ddrmax cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddrmax memcard1 (memc1) .mc ddrmax memcard2 (memc2) .mc ddrmax2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddrmax2 memcard1 (memc1) .mc ddrmax2 memcard2 (memc2) .mc ddrs2k cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddrs2kj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddrsbm cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddru cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ddrusa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr decmate2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk decmate3 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk deluxecoco cassette (cass) .wav .flac .cas deluxecoco printout (prin) .prn deluxecoco cartridge (cart) .ccc .rom deluxecoco floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 deluxecoco floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 deluxecoco harddisk1 (hard1) .vhd deluxecoco harddisk2 (hard2) .vhd dendego3 harddisk (hard) .chd .hd .hdv .2mg .hdi dendy cartridge (cart) .nes .unf .unif dendy2 cartridge (cart) .nes .unf .unif dfi386 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf dfi386 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf dfi386 harddisk (hard) .chd .hd .hdv .2mg .hdi dfi386 printout (prin) .prn dfi386sx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf dfi386sx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf dfi386sx harddisk (hard) .chd .hd .hdv .2mg .hdi dfs500 picture1 (pic1) .png .jpg .jpeg .jfif .bmp .dib dfs500 picture2 (pic2) .png .jpg .jpeg .jfif .bmp .dib dfs500 picture3 (pic3) .png .jpg .jpeg .jfif .bmp .dib dfs500 picture4 (pic4) .png .jpg .jpeg .jfif .bmp .dib dg680 cassette (cass) .wav .flac dgama87 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx dgama87 quickload (quik) .raw .scr dgama87 cassette (cass) .wav .flac .tzx .tap .blk dgama88 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx dgama88 quickload (quik) .raw .scr dgama88 cassette (cass) .wav .flac .tzx .tap .blk dgama89 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx dgama89 quickload (quik) .raw .scr dgama89 cassette (cass) .wav .flac .tzx .tap .blk dgnalpha cassette (cass) .wav .flac .cas dgnalpha printout (prin) .prn dgnalpha cartridge (cart) .ccc .rom dgnalpha floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .vdk .dmk .sdf dgnalpha floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .vdk .dmk .sdf dgnbeta floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .vdk .dmk dgnbeta floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .vdk .dmk dgnmsx cartridge1 (cart1) .mx1 .bin .rom dgnmsx cartridge2 (cart2) .mx1 .bin .rom dgnmsx printout (prin) .prn dgnmsx cassette (cass) .wav .flac .tap .cas .tsx dgone floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf dgone floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf dgone printout (prin) .prn didakm91 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx didakm91 quickload (quik) .raw .scr didakm91 cassette (cass) .wav .flac .tzx .tap .blk didakm92 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx didakm92 quickload (quik) .raw .scr didakm92 cassette (cass) .wav .flac .tzx .tap .blk didakm93 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx didakm93 quickload (quik) .raw .scr didakm93 cassette (cass) .wav .flac .tzx .tap .blk didakt90 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx didakt90 quickload (quik) .raw .scr didakt90 cassette (cass) .wav .flac .tzx .tap .blk didaktk snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx didaktk quickload (quik) .raw .scr didaktk cassette (cass) .wav .flac .tzx .tap .blk didj cartridge (cart) .bin digiblst cartridge (cart) .bin digilog320 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk dim68k floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk dim68k floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk dina cartridge (cart) .rom .col .bin discmate cartridge1 (cart1) .rom .bin discmate cartridge2 (cart2) .rom .bin discmate romimage1 (rom1) .rom .bin discmate cassette (cass) .wav .flac .csw .uef discmate printout (prin) .prn discmate floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd discmate floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd discmon cartridge1 (cart1) .rom .bin discmon cartridge2 (cart2) .rom .bin discmon romimage1 (rom1) .rom .bin discmon cassette (cass) .wav .flac .csw .uef discmon printout (prin) .prn discmon floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd discmon floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd dkbanana harddisk (hard) .chd .hd .hdv .2mg .hdi dkbanans harddisk (hard) .chd .hd .hdv .2mg .hdi dkjfever harddisk (hard) .chd .hd .hdv .2mg .hdi dks7000c cartridge (cart) .bin dks7000p cartridge (cart) .bin dmax8000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk dmv floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img dmv floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img dmv quickload (quik) .com .cpm dmx cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dmx2m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dmx2majp cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dmxa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dn3000 node_id (ni) .ani .bin dn3000 winchester1 (disk1) .awd dn3000 winchester2 (disk2) .awd dn3000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .afd dn3000 ctape (ct) .act .ct dn3000_19i node_id (ni) .ani .bin dn3000_19i winchester1 (disk1) .awd dn3000_19i winchester2 (disk2) .awd dn3000_19i floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .afd dn3000_19i ctape (ct) .act .ct dn3500 node_id (ni) .ani .bin dn3500 winchester1 (disk1) .awd dn3500 winchester2 (disk2) .awd dn3500 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .afd dn3500 ctape (ct) .act .ct dn3500_19i node_id (ni) .ani .bin dn3500_19i winchester1 (disk1) .awd dn3500_19i winchester2 (disk2) .awd dn3500_19i floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .afd dn3500_19i ctape (ct) .act .ct dn5500 node_id (ni) .ani .bin dn5500 winchester1 (disk1) .awd dn5500 winchester2 (disk2) .awd dn5500 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .afd dn5500 ctape (ct) .act .ct dn5500_19i node_id (ni) .ani .bin dn5500_19i winchester1 (disk1) .awd dn5500_19i winchester2 (disk2) .awd dn5500_19i floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .afd dn5500_19i ctape (ct) .act .ct dncfrks cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dodo floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib dodo floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib dodo cassette (cass) .wav .flac dokodemo harddisk (hard) .chd .hd .hdv .2mg .hdi dolphinm cassette (cass) .wav .flac .csw .uef dolphinm romimage1 (rom1) .rom .bin dolphinm romimage2 (rom2) .rom .bin dolphinm printout (prin) .prn dolphinm floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd dolphinm floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd dpb7000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk dpb7000 harddisk (hard) .chd .hd .hdv .2mg .hdi dpc100 cartridge (cart) .mx1 .bin .rom dpc100 printout (prin) .prn dpc100 cassette (cass) .wav .flac .tap .cas .tsx dpc180 cartridge (cart) .mx1 .bin .rom dpc180 printout (prin) .prn dpc180 cassette (cass) .wav .flac .tap .cas .tsx dpc200 cartridge (cart) .mx1 .bin .rom dpc200 printout (prin) .prn dpc200 cassette (cass) .wav .flac .tap .cas .tsx dpc200e cartridge (cart) .mx1 .bin .rom dpc200e printout (prin) .prn dpc200e cassette (cass) .wav .flac .tap .cas .tsx dps1 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk dragntr cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dragntr2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dragntr3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dragntra cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dragon200 cassette (cass) .wav .flac .cas dragon200 printout (prin) .prn dragon200 cartridge (cart) .ccc .rom dragon200 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 dragon200 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 dragon200e cassette (cass) .wav .flac .cas dragon200e printout (prin) .prn dragon200e cartridge (cart) .ccc .rom dragon200e floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 dragon200e floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 dragon32 cassette (cass) .wav .flac .cas dragon32 printout (prin) .prn dragon32 cartridge (cart) .ccc .rom dragon32 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 dragon32 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 dragon64 cassette (cass) .wav .flac .cas dragon64 printout (prin) .prn dragon64 cartridge (cart) .ccc .rom dragon64 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 dragon64 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 dragon64h cassette (cass) .wav .flac .cas dragon64h printout (prin) .prn dragon64h cartridge (cart) .ccc .rom dragon64h floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 dragon64h floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 drmn cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr drmn10m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr drmn2m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr drmn2mpu cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr drmn3m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr drmn4m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr drmn5m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr drmn6m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr drmn7m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr drmn7ma cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr drmn8m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr drmn9m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr drmn9ma cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr drmna cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr drmnu cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr drpcjr cartridge (cart) .nes .unf .unif ds2 quickload (quik) .rex .ds2 ds2100 harddisk (hard) .chd .hd .hdv .2mg .hdi ds2100 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ds3100 harddisk (hard) .chd .hd .hdv .2mg .hdi ds3100 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ds5k133 harddisk (hard) .chd .hd .hdv .2mg .hdi ds5k133 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ds8 cartridge (cart) .ds8_card dsem cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dsem2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dsfdct cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dsfdcta cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dsfdr cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dsftkd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dslayrr harddisk (hard) .chd .hd .hdv .2mg .hdi dslayrr cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dslayrra harddisk (hard) .chd .hd .hdv .2mg .hdi dslayrra cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dsp3000 node_id (ni) .ani .bin dsp3000 winchester1 (disk1) .awd dsp3000 winchester2 (disk2) .awd dsp3000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .afd dsp3000 ctape (ct) .act .ct dsp3500 node_id (ni) .ani .bin dsp3500 winchester1 (disk1) .awd dsp3500 winchester2 (disk2) .awd dsp3500 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .afd dsp3500 ctape (ct) .act .ct dsp5500 node_id (ni) .ani .bin dsp5500 winchester1 (disk1) .awd dsp5500 winchester2 (disk2) .awd dsp5500 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .afd dsp5500 ctape (ct) .act .ct dss1 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk dss1 midiin (min) .mid .syx dss1 midiout (mout) .mid dssmsrk floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk dssmsrk midiin (min) .mid .syx dssmsrk midiout (mout) .mid dstage cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dstagea cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dsys200 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf dsys200 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf dsys200 harddisk (hard) .chd .hd .hdv .2mg .hdi dt386 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf dt386 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf dt386 harddisk (hard) .chd .hd .hdv .2mg .hdi dt386 printout (prin) .prn dt486 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf dt486 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf dt486 harddisk (hard) .chd .hd .hdv .2mg .hdi dt486 printout (prin) .prn dtc cassette (cass) .wav .flac dtc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img dtc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img dtc quickload (quik) .bac dtkerso floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf dtkerso floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf dtkerso printout (prin) .prn duelmast cartridge (cart) .bin .u1 duet16 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk duet16 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk dvbslan floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf dvbslan floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf dvbslan harddisk (hard) .chd .hd .hdv .2mg .hdi dx100 midiin (min) .mid .syx dx100 midiout (mout) .mid dx100 cassette (cass) .wav .flac dx64 cassette (cass) .wav .flac .tap dx64 floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 dx64 floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 dx64 cartridge (cart) .80 .a0 .e0 .crt dx64 quickload (quik) .p00 .prg .t64 dygolf cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr dynavisn cartridge (cart) .bin e100 cassette (cass) .wav .flac eagle1600 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf eagle1600 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf eagle1600 printout (prin) .prn eaglepc2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf eaglepc2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf eaglepc2 printout (prin) .prn eaglespirit floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf eaglespirit floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf eaglespirit printout (prin) .prn easykara cartridge (cart) .bin ec1840 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ec1840 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ec1840 printout (prin) .prn ec1841 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ec1841 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ec1841 printout (prin) .prn ec1841 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi ec1841 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi ec1842 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ec1842 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ec1842 harddisk (hard) .chd .hd .hdv .2mg .hdi ec1845 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ec1845 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ec1845 printout (prin) .prn ec1845 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi ec1845 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi ec1847 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ec1847 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ec1847 printout (prin) .prn ec1849 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ec1849 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ec1849 harddisk (hard) .chd .hd .hdv .2mg .hdi ec4913 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ec4913 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ec4913 harddisk (hard) .chd .hd .hdv .2mg .hdi ec4913 printout (prin) .prn ec4915aio floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ec4915aio floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ec4915aio harddisk (hard) .chd .hd .hdv .2mg .hdi ec4915aio printout (prin) .prn ecm6032 cassette (cass) .wav .flac ecm6032 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ecm6032 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ecm6127 cassette (cass) .wav .flac ecm6127 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ecm6127 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk econx25 cassette (cass) .wav .flac .csw .uef econx25 romimage1 (rom1) .rom .bin econx25 romimage2 (rom2) .rom .bin econx25 romimage3 (rom3) .rom .bin econx25 romimage4 (rom4) .rom .bin econx25 romimage5 (rom5) .rom .bin ecs38632 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ecs38632 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ecs38632 harddisk (hard) .chd .hd .hdv .2mg .hdi ecs38632 printout (prin) .prn ecs386a floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ecs386a floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ecs386a harddisk (hard) .chd .hd .hdv .2mg .hdi ecs386a printout (prin) .prn ecs8517 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ecs8517 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ecs8517 harddisk (hard) .chd .hd .hdv .2mg .hdi ecsfx3000 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ecsfx3000 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ecsfx3000 harddisk (hard) .chd .hd .hdv .2mg .hdi ecsfx3000 printout (prin) .prn ecssi5pi harddisk (hard) .chd .hd .hdv .2mg .hdi ecssi5pi cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ecssi5pi floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ecssi5pi floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ecssi5pi printout (prin) .prn ecsum386 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ecsum386 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ecsum386 harddisk (hard) .chd .hd .hdv .2mg .hdi ecsum386 printout (prin) .prn ed486vl3h floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ed486vl3h floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ed486vl3h harddisk (hard) .chd .hd .hdv .2mg .hdi ed486vl3h printout (prin) .prn edmv035f floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf edmv035f floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf edmv035f harddisk (hard) .chd .hd .hdv .2mg .hdi edmv035f printout (prin) .prn edu64 cassette (cass) .wav .flac .tap edu64 floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 edu64 cartridge (cart) .80 .a0 .e0 .crt edu64 quickload (quik) .p00 .prg .t64 eg3003 cassette (cass) .wav .flac .cas eg3003 quickload (quik) .cmd eg3003 floppydisk1 (flop1) .mfi .dfi .dmk .jv1 .dsk eg3003 floppydisk2 (flop2) .mfi .dfi .dmk .jv1 .dsk eg3003 printout (prin) .prn eggsplc harddisk (hard) .chd .hd .hdv .2mg .hdi ehx20 cassette (cass) .wav .flac ehx20 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ehx20 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ehx20 romimage (rom) .bin .rom ehx20e cassette (cass) .wav .flac ehx20e floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ehx20e floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ehx20e romimage (rom) .bin .rom einst256 printout (prin) .prn einst256 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk einst256 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk einst256 quickload (quik) .com einst256 cassette (cass) .wav .flac einstein printout (prin) .prn einstein floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk einstein floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk einstein floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk einstein floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk einstein romimage (rom) .bin .rom einstein quickload (quik) .com ekara cartridge (cart) .bin .u1 ekaraa cartridge (cart) .bin .u1 ekarag cartridge (cart) .bin .u1 ekaraj cartridge (cart) .bin .u1 ekaramix cartridge (cart) .bin .u1 ekaraphs cartridge (cart) .bin .u1 ekaras cartridge (cart) .bin .u1 ekusera cartridge (cart) .bin elanht286 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf elanht286 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf elanht286 harddisk (hard) .chd .hd .hdv .2mg .hdi eldoralg cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr electron cassette (cass) .wav .flac .csw .uef electron floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ssd .bbc .img .dsd .adf .ads .adm .adl electron printout (prin) .prn electron cartridge1 (cart1) .rom .bin electron cartridge2 (cart2) .rom .bin electron64 cassette (cass) .wav .flac .csw .uef electron64 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ssd .bbc .img .dsd .adf .ads .adm .adl electron64 printout (prin) .prn electron64 cartridge1 (cart1) .rom .bin electron64 cartridge2 (cart2) .rom .bin electronsp cassette (cass) .wav .flac .csw .uef electronsp floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ssd .bbc .img .dsd .adf .ads .adm .adl electronsp printout (prin) .prn electronsp cartridge1 (cart1) .rom .bin electronsp cartridge2 (cart2) .rom .bin electronsp romimage1 (rom1) .bin .rom electronsp romimage2 (rom2) .bin .rom electront cassette (cass) .wav .flac .csw .uef electront floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ssd .bbc .img .dsd .adf .ads .adm .adl electront printout (prin) .prn electront cartridge1 (cart1) .rom .bin electront cartridge2 (cart2) .rom .bin elekscmp cassette (cass) .wav .flac elektor quickload (quik) .pgm .tvc elektor cartridge (cart) .bin .rom elektor cassette (cass) .wav .flac elf2 cassette (cass) .wav .flac elf2 quickload (quik) .bin elppa floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib elppa floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib elppa cassette (cass) .wav .flac elt286b floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf elt286b floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf elt286b harddisk (hard) .chd .hd .hdv .2mg .hdi elt386sx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf elt386sx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf elt386sx harddisk (hard) .chd .hd .hdv .2mg .hdi eltp9 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf eltp9 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf eltp9 harddisk (hard) .chd .hd .hdv .2mg .hdi elwro800 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk elwro800 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk elwro800 printout (prin) .prn elwro800 cassette (cass) .wav .flac .tzx .tap .blk elzet80k floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk elzet80k floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk elzet80p floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk elzet80p floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk emax2 harddisk (hard) .chd .hd .hdv .2mg .hdi emaxp harddisk (hard) .chd .hd .hdv .2mg .hdi emma2 cassette (cass) .wav .flac emu3 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk emu3 harddisk (hard) .chd .hd .hdv .2mg .hdi enmirage cassette (cass) .wav .flac enmirage midiin (min) .mid .syx enmirage midiout (mout) .mid enmirage floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img ep128 printout (prin) .prn ep128 cassette1 (cass1) .wav .flac ep128 cassette2 (cass2) .wav .flac ep128 cartridge (cart) .bin .rom ep64 printout (prin) .prn ep64 cassette1 (cass1) .wav .flac ep64 cassette2 (cass2) .wav .flac ep64 cartridge (cart) .bin .rom epc printout (prin) .prn epc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf epc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf epitch cartridge (cart) .bin .u1 eppc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf eppc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf eppc printout (prin) .prn eps midiin (min) .mid .syx eps midiout (mout) .mid eps floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .hfe eps16p midiin (min) .mid .syx eps16p midiout (mout) .mid eps16p floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .hfe epsax floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf epsax floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf epsax harddisk (hard) .chd .hd .hdv .2mg .hdi epsax2e floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf epsax2e floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf epsax2e harddisk (hard) .chd .hd .hdv .2mg .hdi epsax3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf epsax3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf epsax3 harddisk (hard) .chd .hd .hdv .2mg .hdi erik cassette (cass) .wav .flac .rks erik floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img erik floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img et3400 cassette (cass) .wav .flac eti660 cassette (cass) .wav .flac eti660 quickload (quik) .bin .c8 .ch8 euroat floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf euroat harddisk (hard) .chd .hd .hdv .2mg .hdi eurocom2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .wta eurocom2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .wta europc printout (prin) .prn europc floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf europc2 printout (prin) .prn europc2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf euroxt floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf euroxt harddisk (hard) .chd .hd .hdv .2mg .hdi euroxt printout (prin) .prn ev1806 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ev1806 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ev1806 harddisk (hard) .chd .hd .hdv .2mg .hdi ev1815 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ev1815 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ev1815 harddisk (hard) .chd .hd .hdv .2mg .hdi evilngt cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr evio cartridge (cart) .bin .u1 ews286 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ews286 harddisk (hard) .chd .hd .hdv .2mg .hdi ews4800_310 harddisk (hard) .chd .hd .hdv .2mg .hdi excali64 cassette (cass) .wav .flac excali64 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .raw excali64 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .raw excali64 printout (prin) .prn executel cassette (cass) .wav .flac .cas exl100 cartridge (cart) .bin .rom exl100 cassette (cass) .wav .flac exorciser printout1 (prin1) .prn exorciser printout2 (prin2) .prn exorciser floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .dsk exorciser floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .dsk exorciser floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .dsk exorciser floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .dsk exp4044 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf exp4044 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf exp4044 harddisk (hard) .chd .hd .hdv .2mg .hdi exp4044 printout (prin) .prn exp85 cassette (cass) .wav .flac expert10 cartridge1 (cart1) .mx1 .bin .rom expert10 cartridge2 (cart2) .mx1 .bin .rom expert10 printout (prin) .prn expert10 cassette (cass) .wav .flac .tap .cas .tsx expert11 cartridge1 (cart1) .mx1 .bin .rom expert11 cartridge2 (cart2) .mx1 .bin .rom expert11 printout (prin) .prn expert11 cassette (cass) .wav .flac .tap .cas .tsx expert13 cartridge1 (cart1) .mx1 .bin .rom expert13 cartridge2 (cart2) .mx1 .bin .rom expert13 printout (prin) .prn expert13 cassette (cass) .wav .flac .tap .cas .tsx expert20 cartridge1 (cart1) .mx1 .bin .rom expert20 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk expert20 cartridge2 (cart2) .mx1 .bin .rom expert20 printout (prin) .prn expert20 cassette (cass) .wav .flac .tap .cas .tsx expert3i cartridge1 (cart1) .mx1 .bin .rom expert3i floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk expert3i cartridge2 (cart2) .mx1 .bin .rom expert3i printout (prin) .prn expert3i cassette (cass) .wav .flac .tap .cas .tsx expert3t cartridge1 (cart1) .mx1 .bin .rom expert3t floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk expert3t cartridge2 (cart2) .mx1 .bin .rom expert3t printout (prin) .prn expert3t cassette (cass) .wav .flac .tap .cas .tsx expertac cartridge1 (cart1) .mx1 .bin .rom expertac cartridge2 (cart2) .mx1 .bin .rom expertac floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk expertac printout (prin) .prn expertac cassette (cass) .wav .flac .tap .cas .tsx expertdp cartridge1 (cart1) .mx1 .bin .rom expertdp cartridge2 (cart2) .mx1 .bin .rom expertdp floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk expertdp printout (prin) .prn expertdp cassette (cass) .wav .flac .tap .cas .tsx expertdx cartridge1 (cart1) .mx1 .bin .rom expertdx floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk expertdx cartridge2 (cart2) .mx1 .bin .rom expertdx printout (prin) .prn expertdx cassette (cass) .wav .flac .tap .cas .tsx expertpl cartridge1 (cart1) .mx1 .bin .rom expertpl cartridge2 (cart2) .mx1 .bin .rom expertpl printout (prin) .prn expertpl cassette (cass) .wav .flac .tap .cas .tsx ez2d2m harddisk (hard) .chd .hd .hdv .2mg .hdi ez2d2m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ez2d2m floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf ez2d2m floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf ez2d2m printout (prin) .prn f1 printout (prin) .prn f1 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk f1 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk f10 printout (prin) .prn f10 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk f10 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk f1392 quickload (quik) .pgm .tvc f1392 cartridge (cart) .bin .rom f1e printout (prin) .prn f1e floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk f1e floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk f2 printout (prin) .prn f2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk f2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk f4dxluc4 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf f4dxluc4 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf f4dxluc4 harddisk (hard) .chd .hd .hdv .2mg .hdi f4dxluc4 printout (prin) .prn falcon30 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf falcon30 printout (prin) .prn falcon30 midiin (min) .mid .syx falcon30 midiout (mout) .mid falcon30 romimage (rom) .bin .rom .stc falcon40 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf falcon40 printout (prin) .prn falcon40 midiin (min) .mid .syx falcon40 midiout (mout) .mid falcon40 romimage (rom) .bin .rom .stc famicom cartridge (cart) .nes .unf .unif famicomo cartridge (cart) .nes .unf .unif famitvc1 cartridge (cart) .nes .unf .unif famitwin cartridge (cart) .nes .unf .unif famitwin floppydisk (flop) .fds fanucspg floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fanucspg floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fanucspgm floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fanucspgm floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fbait2bc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fbaitbc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fbaitmc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fbaitmca cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fbaitmcj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fbaitmcu cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fbcrazy cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fc100 cassette (cass) .wav .flac .cas fc100 cartridge (cart) .bin fc100 printout (prin) .prn fctitler cartridge (cart) .nes .unf .unif fdpc200 cartridge (cart) .mx1 .bin .rom fdpc200 printout (prin) .prn fdpc200 cassette (cass) .wav .flac .tap .cas .tsx fds floppydisk (flop) .fds feag cartridge (cart) .bin feag2100 cartridge (cart) .bin feag2100a cartridge (cart) .bin feagpriv cartridge (cart) .bin feagv10 cartridge (cart) .bin feagv11 cartridge (cart) .bin feagv4 cartridge (cart) .bin feagv4a cartridge (cart) .bin feagv4b cartridge (cart) .bin feagv5 cartridge (cart) .bin feagv7 cartridge (cart) .bin feagv7a cartridge (cart) .bin feagv7b cartridge (cart) .bin feagv7c cartridge (cart) .bin feagv9 cartridge (cart) .bin feagv9a cartridge (cart) .bin feagv9b cartridge (cart) .bin feagv9c cartridge (cart) .bin feas cartridge (cart) .bin feasbu cartridge (cart) .bin feasbua cartridge (cart) .bin feasgla cartridge (cart) .bin feasglaa cartridge (cart) .bin feasglab cartridge (cart) .bin feasx cartridge (cart) .bin feleg cartridge (cart) .bin felega cartridge (cart) .bin felega1 cartridge (cart) .bin felega2 cartridge (cart) .bin felega3 cartridge (cart) .bin fellow snapshot (dump) .vz fellow cassette (cass) .wav .flac .cas fforce2 quickload (quik) .pgm .tvc fforce2 cartridge (cart) .bin .rom fghtmn cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fghtmna cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fghtmnk cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fghtmnu cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fic4386vchd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf fic4386vchd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf fic4386vchd harddisk (hard) .chd .hd .hdv .2mg .hdi fic4386vchd printout (prin) .prn fic4386vcv floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf fic4386vcv floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf fic4386vcv harddisk (hard) .chd .hd .hdv .2mg .hdi fic4386vcv printout (prin) .prn fic486gvt floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf fic486gvt floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf fic486gvt harddisk (hard) .chd .hd .hdv .2mg .hdi fic486gvt printout (prin) .prn fic486kvd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf fic486kvd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf fic486kvd harddisk (hard) .chd .hd .hdv .2mg .hdi fic486kvd printout (prin) .prn fic486vchd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf fic486vchd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf fic486vchd harddisk (hard) .chd .hd .hdv .2mg .hdi fic486vchd printout (prin) .prn ficeli6ii floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ficeli6ii floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ficeli6ii harddisk (hard) .chd .hd .hdv .2mg .hdi ficeli6ii printout (prin) .prn ficgiovt2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ficgiovt2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ficgiovt2 harddisk (hard) .chd .hd .hdv .2mg .hdi ficgiovt2 printout (prin) .prn ficpio2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ficpio2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ficpio2 printout (prin) .prn ficpio2 harddisk (hard) .chd .hd .hdv .2mg .hdi ficpio2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ficvipio floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ficvipio floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ficvipio harddisk (hard) .chd .hd .hdv .2mg .hdi ficvipio printout (prin) .prn ficvipio2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ficvipio2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ficvipio2 harddisk (hard) .chd .hd .hdv .2mg .hdi ficvipio2 printout (prin) .prn ficvt503 harddisk (hard) .chd .hd .hdv .2mg .hdi ficvt503 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ficvt503 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ficvt503 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ficvt503 printout (prin) .prn fl100 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fl100 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk flamegung harddisk (hard) .chd .hd .hdv .2mg .hdi flipmaze harddisk (hard) .chd .hd .hdv .2mg .hdi fm11 cassette (cass) .wav .flac .t77 fm11 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fm11 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fm11 printout (prin) .prn fm16beta cassette (cass) .wav .flac .t77 fm16beta floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fm16beta floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fm16beta printout (prin) .prn fm7 cassette (cass) .wav .flac .t77 fm7 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fm7 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fm7 printout (prin) .prn fm7740sx cassette (cass) .wav .flac .t77 fm7740sx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fm7740sx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fm7740sx printout (prin) .prn fm77av cassette (cass) .wav .flac .t77 fm77av floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fm77av floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fm77av printout (prin) .prn fm8 cassette (cass) .wav .flac .t77 fm8 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fm8 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fm8 printout (prin) .prn fmnew7 cassette (cass) .wav .flac .t77 fmnew7 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fmnew7 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fmnew7 printout (prin) .prn fmtmarty floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin fmtmarty cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fmtmarty memcard (memc) .icm fmtmarty2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin fmtmarty2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fmtmarty2 memcard (memc) .icm fmtowns floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin fmtowns floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin fmtowns cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fmtowns memcard (memc) .icm fmtownsftv floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin fmtownsftv floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin fmtownsftv cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fmtownsftv memcard (memc) .icm fmtownsftv harddisk1 (hard1) .chd .hd .hdv .2mg .hdi fmtownsftv harddisk2 (hard2) .chd .hd .hdv .2mg .hdi fmtownsftv harddisk3 (hard3) .chd .hd .hdv .2mg .hdi fmtownsftv harddisk4 (hard4) .chd .hd .hdv .2mg .hdi fmtownsftv harddisk5 (hard5) .chd .hd .hdv .2mg .hdi fmtownshr floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin fmtownshr floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin fmtownshr cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fmtownshr memcard (memc) .icm fmtownshr harddisk1 (hard1) .chd .hd .hdv .2mg .hdi fmtownshr harddisk2 (hard2) .chd .hd .hdv .2mg .hdi fmtownshr harddisk3 (hard3) .chd .hd .hdv .2mg .hdi fmtownshr harddisk4 (hard4) .chd .hd .hdv .2mg .hdi fmtownshr harddisk5 (hard5) .chd .hd .hdv .2mg .hdi fmtownsmx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin fmtownsmx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin fmtownsmx cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fmtownsmx memcard (memc) .icm fmtownsmx harddisk1 (hard1) .chd .hd .hdv .2mg .hdi fmtownsmx harddisk2 (hard2) .chd .hd .hdv .2mg .hdi fmtownsmx harddisk3 (hard3) .chd .hd .hdv .2mg .hdi fmtownsmx harddisk4 (hard4) .chd .hd .hdv .2mg .hdi fmtownsmx harddisk5 (hard5) .chd .hd .hdv .2mg .hdi fmtownssj floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin fmtownssj floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin fmtownssj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fmtownssj memcard (memc) .icm fmtownssj harddisk1 (hard1) .chd .hd .hdv .2mg .hdi fmtownssj harddisk2 (hard2) .chd .hd .hdv .2mg .hdi fmtownssj harddisk3 (hard3) .chd .hd .hdv .2mg .hdi fmtownssj harddisk4 (hard4) .chd .hd .hdv .2mg .hdi fmtownssj harddisk5 (hard5) .chd .hd .hdv .2mg .hdi fmtownsux floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin fmtownsux floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin fmtownsux cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fmtownsux memcard (memc) .icm fmtownsux harddisk1 (hard1) .chd .hd .hdv .2mg .hdi fmtownsux harddisk2 (hard2) .chd .hd .hdv .2mg .hdi fmtownsux harddisk3 (hard3) .chd .hd .hdv .2mg .hdi fmtownsux harddisk4 (hard4) .chd .hd .hdv .2mg .hdi fmtownsux harddisk5 (hard5) .chd .hd .hdv .2mg .hdi fmtownsv03 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin fmtownsv03 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .bin fmtownsv03 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fmtownsv03 memcard (memc) .icm fmx cartridge (cart) .mx1 .bin .rom fmx cassette (cass) .wav .flac .tap .cas .tsx fnvision cassette (cass) .wav .flac fnvision printout (prin) .prn fnvision cartridge (cart) .bin .rom fp floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fp printout (prin) .prn fp1000 printout (prin) .prn fp1000 cassette (cass) .wav .flac fp1100 printout (prin) .prn fp1100 cassette (cass) .wav .flac fp6000 cassette (cass) .wav .flac fp6000 printout (prin) .prn fpc500 cartridge1 (cart1) .mx1 .bin .rom fpc500 cartridge2 (cart2) .mx1 .bin .rom fpc500 printout (prin) .prn fpc500 cassette (cass) .wav .flac .tap .cas .tsx fpc900 cartridge1 (cart1) .mx1 .bin .rom fpc900 cartridge2 (cart2) .mx1 .bin .rom fpc900 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk fpc900 printout (prin) .prn fpc900 cassette (cass) .wav .flac .tap .cas .tsx fpres cartridge (cart) .bin fpresa cartridge (cart) .bin fpresb cartridge (cart) .bin fpresbu cartridge (cart) .bin fpresc cartridge (cart) .bin fpresd cartridge (cart) .bin fprese cartridge (cart) .bin fpresgla cartridge (cart) .bin fraking floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf fruitpc harddisk (hard) .chd .hd .hdv .2mg .hdi fruitpc midiin (min) .mid .syx fruitpc midiout (mout) .mid frx386c floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf frx386c floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf frx386c harddisk (hard) .chd .hd .hdv .2mg .hdi frx386c printout (prin) .prn frxc402 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf frxc402 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf frxc402 harddisk (hard) .chd .hd .hdv .2mg .hdi frxc402 printout (prin) .prn fs1300 cartridge1 (cart1) .mx1 .bin .rom fs1300 cartridge2 (cart2) .mx1 .bin .rom fs1300 printout (prin) .prn fs1300 cassette (cass) .wav .flac .tap .cas .tsx fs3216 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk fs4000 cartridge1 (cart1) .mx1 .bin .rom fs4000 cartridge2 (cart2) .mx1 .bin .rom fs4000 printout (prin) .prn fs4000 cassette (cass) .wav .flac .tap .cas .tsx fs4000a cartridge1 (cart1) .mx1 .bin .rom fs4000a cartridge2 (cart2) .mx1 .bin .rom fs4000a printout (prin) .prn fs4000a cassette (cass) .wav .flac .tap .cas .tsx fs4500 cartridge1 (cart1) .mx1 .bin .rom fs4500 cartridge2 (cart2) .mx1 .bin .rom fs4500 printout (prin) .prn fs4500 cassette (cass) .wav .flac .tap .cas .tsx fs4600f cartridge1 (cart1) .mx1 .bin .rom fs4600f cartridge2 (cart2) .mx1 .bin .rom fs4600f floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk fs4600f printout (prin) .prn fs4600f cassette (cass) .wav .flac .tap .cas .tsx fs4700f cartridge1 (cart1) .mx1 .bin .rom fs4700f cartridge2 (cart2) .mx1 .bin .rom fs4700f floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk fs4700f printout (prin) .prn fs4700f cassette (cass) .wav .flac .tap .cas .tsx fs5000f2 cartridge1 (cart1) .mx1 .bin .rom fs5000f2 cartridge2 (cart2) .mx1 .bin .rom fs5000f2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk fs5000f2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk fs5000f2 printout (prin) .prn fs5000f2 cassette (cass) .wav .flac .tap .cas .tsx fs5500f1 cartridge1 (cart1) .mx1 .bin .rom fs5500f1 cartridge2 (cart2) .mx1 .bin .rom fs5500f1 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk fs5500f1 printout (prin) .prn fs5500f1 cassette (cass) .wav .flac .tap .cas .tsx fs5500f2 cartridge1 (cart1) .mx1 .bin .rom fs5500f2 cartridge2 (cart2) .mx1 .bin .rom fs5500f2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk fs5500f2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk fs5500f2 printout (prin) .prn fs5500f2 cassette (cass) .wav .flac .tap .cas .tsx fsa1 cartridge1 (cart1) .mx1 .bin .rom fsa1 cartridge2 (cart2) .mx1 .bin .rom fsa1 printout (prin) .prn fsa1 cassette (cass) .wav .flac .tap .cas .tsx fsa1a cartridge1 (cart1) .mx1 .bin .rom fsa1a cartridge2 (cart2) .mx1 .bin .rom fsa1a printout (prin) .prn fsa1a cassette (cass) .wav .flac .tap .cas .tsx fsa1f cartridge1 (cart1) .mx1 .bin .rom fsa1f cartridge2 (cart2) .mx1 .bin .rom fsa1f floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk fsa1f printout (prin) .prn fsa1f cassette (cass) .wav .flac .tap .cas .tsx fsa1fm cartridge1 (cart1) .mx1 .bin .rom fsa1fm cartridge2 (cart2) .mx1 .bin .rom fsa1fm floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk fsa1fm printout (prin) .prn fsa1fm cassette (cass) .wav .flac .tap .cas .tsx fsa1fx cartridge1 (cart1) .mx1 .bin .rom fsa1fx cartridge2 (cart2) .mx1 .bin .rom fsa1fx floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk fsa1fx printout (prin) .prn fsa1fx cassette (cass) .wav .flac .tap .cas .tsx fsa1gt cartridge1 (cart1) .mx1 .bin .rom fsa1gt cartridge2 (cart2) .mx1 .bin .rom fsa1gt floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk fsa1gt printout (prin) .prn fsa1gt midiin (min) .mid .syx fsa1gt midiout (mout) .mid fsa1mk2 cartridge1 (cart1) .mx1 .bin .rom fsa1mk2 cartridge2 (cart2) .mx1 .bin .rom fsa1mk2 printout (prin) .prn fsa1mk2 cassette (cass) .wav .flac .tap .cas .tsx fsa1st cartridge1 (cart1) .mx1 .bin .rom fsa1st cartridge2 (cart2) .mx1 .bin .rom fsa1st floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk fsa1st printout (prin) .prn fsa1wsx cartridge1 (cart1) .mx1 .bin .rom fsa1wsx cartridge2 (cart2) .mx1 .bin .rom fsa1wsx floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk fsa1wsx printout (prin) .prn fsa1wsx cassette (cass) .wav .flac .tap .cas .tsx fsa1wx cartridge1 (cart1) .mx1 .bin .rom fsa1wx cartridge2 (cart2) .mx1 .bin .rom fsa1wx floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk fsa1wx printout (prin) .prn fsa1wx cassette (cass) .wav .flac .tap .cas .tsx fsa1wxa cartridge1 (cart1) .mx1 .bin .rom fsa1wxa cartridge2 (cart2) .mx1 .bin .rom fsa1wxa floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk fsa1wxa printout (prin) .prn fsa1wxa cassette (cass) .wav .flac .tap .cas .tsx fscc12 cartridge (cart) .bin fscc12a cartridge (cart) .bin fscc6 cartridge (cart) .bin fscc9 cartridge (cart) .bin fscc9b cartridge (cart) .bin fscc9c cartridge (cart) .bin fscc9ps cartridge (cart) .bin fspc800 cartridge1 (cart1) .mx1 .bin .rom fspc800 cartridge2 (cart2) .mx1 .bin .rom fspc800 printout (prin) .prn fspc800 cassette (cass) .wav .flac .tap .cas .tsx fstm1 cartridge1 (cart1) .mx1 .bin .rom fstm1 cartridge2 (cart2) .mx1 .bin .rom fstm1 printout (prin) .prn fstm1 cassette (cass) .wav .flac .tap .cas .tsx ft486f55 harddisk (hard) .chd .hd .hdv .2mg .hdi ft486f55 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ft486f55 printout (prin) .prn ftimpactg harddisk (hard) .chd .hd .hdv .2mg .hdi ftsserv floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ftsserv floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ftsserv harddisk (hard) .chd .hd .hdv .2mg .hdi ftsserv printout (prin) .prn fu340 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf fu340 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf fu340 harddisk (hard) .chd .hd .hdv .2mg .hdi fu340 printout (prin) .prn funkball harddisk (hard) .chd .hd .hdv .2mg .hdi future32a floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk future32a harddisk (hard) .chd .hd .hdv .2mg .hdi fuudol cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fz1 midiin (min) .mid .syx fz1 midiout1 (mout1) .mid fz1 midiout2 (mout2) .mid fz1 floppydisk (flop) .mfi .dfi .img .hfe fz10m midiin (min) .mid .syx fz10m midiout1 (mout1) .mid fz10m midiout2 (mout2) .mid fz10m floppydisk (flop) .mfi .dfi .img .hfe fz20m midiin (min) .mid .syx fz20m midiout1 (mout1) .mid fz20m midiout2 (mout2) .mid fz20m floppydisk (flop) .mfi .dfi .img .hfe fz20m harddisk (hard) .chd .hd .hdv .2mg .hdi fzeroax cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fzeroaxc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr fzeroaxd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr g13jnr cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ga486am floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ga486am floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ga486am harddisk (hard) .chd .hd .hdv .2mg .hdi ga486am printout (prin) .prn ga486vf floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ga486vf floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ga486vf harddisk (hard) .chd .hd .hdv .2mg .hdi ga486vf printout (prin) .prn ga486vs floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ga486vs floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ga486vs harddisk (hard) .chd .hd .hdv .2mg .hdi ga486vs printout (prin) .prn ga6la7 harddisk (hard) .chd .hd .hdv .2mg .hdi ga6la7 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ga6la7 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf ga6la7 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf ga6la7 printout (prin) .prn gaelcods cartridge (cart) .bin gahaha cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gahaha2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr galaxy snapshot (dump) .gal galaxy cassette (cass) .wav .flac .gtp galaxyp snapshot (dump) .gal galaxyp cassette (cass) .wav .flac .gtp galeb cassette (cass) .wav .flac gamate cartridge (cart) .bin gameboy cartridge (cart) .bin .gb .gbc .gbx gamecom cartridge1 (cart1) .bin .tgc gamecom cartridge2 (cart2) .bin .tgc gamecst2 harddisk (hard) .chd .hd .hdv .2mg .hdi gamecst2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gamecst2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf gamecst2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf gamecst2 printout (prin) .prn gamecstl harddisk (hard) .chd .hd .hdv .2mg .hdi gamecstl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gamecstl floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf gamecstl floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf gamecstl printout (prin) .prn gamefgtr cartridge (cart) .bin .gb .gbc .gbx gamegeaj cartridge (cart) .bin .gg gamegear cartridge (cart) .bin .gg gamekin3 cartridge (cart) .bin gameking cartridge (cart) .bin gamepock cartridge (cart) .bin gammagic cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gammagic floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf gammagic floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf gammagic printout (prin) .prn gamshara cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gamsharao cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gauntdl harddisk1 (hard1) .chd .hd .hdv .2mg .hdi gauntdl cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr gauntdl harddisk2 (hard2) .chd .hd .hdv .2mg .hdi gauntdl cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr gauntdl24 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi gauntdl24 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr gauntdl24 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi gauntdl24 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr gauntleg harddisk1 (hard1) .chd .hd .hdv .2mg .hdi gauntleg cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr gauntleg harddisk2 (hard2) .chd .hd .hdv .2mg .hdi gauntleg cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr gauntleg12 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi gauntleg12 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr gauntleg12 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi gauntleg12 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr gauntleg14 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi gauntleg14 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr gauntleg14 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi gauntleg14 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr gba cartridge (cart) .gba .bin gbcolor cartridge (cart) .bin .gb .gbc .gbx gbpocket cartridge (cart) .bin .gb .gbc .gbx gbs5505x cartridge (cart) .bin gc10a floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf gc10a floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf gc10a harddisk (hard) .chd .hd .hdv .2mg .hdi gc10a printout (prin) .prn gchinatv cartridge (cart) .nes .unf .unif gcslottv cartridge (cart) .bin .u1 gdariusg harddisk (hard) .chd .hd .hdv .2mg .hdi gegemdb cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gekimaka harddisk (hard) .chd .hd .hdv .2mg .hdi gekpurya cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gekpuryb cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gen_nomd cartridge (cart) .smd .bin .md .gen genesis cartridge (cart) .smd .bin .md .gen genesis_tmss cartridge (cart) .smd .bin .md .gen ges9051n floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ges9051n floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ges9051n harddisk (hard) .chd .hd .hdv .2mg .hdi ges9051n printout (prin) .prn gete486vl floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf gete486vl floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf gete486vl harddisk (hard) .chd .hd .hdv .2mg .hdi gete486vl printout (prin) .prn gfc1080 cartridge (cart) .mx1 .bin .rom gfc1080 printout (prin) .prn gfc1080 cassette (cass) .wav .flac .tap .cas .tsx gfc1080a cartridge (cart) .mx1 .bin .rom gfc1080a printout (prin) .prn gfc1080a cassette (cass) .wav .flac .tap .cas .tsx ggm cartridge (cart) .bin ggxx cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ggxxac cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ggxxrl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ggxxrlo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ggxxsla cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ghostsqo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ghostsqu cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr giglnrdo cartridge (cart) .bin gimix floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 gimix floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 gimix floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 gimix floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 gjspace cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gl2000 cartridge (cart) .bin gl2000c cartridge (cart) .bin gl2000p cartridge (cart) .bin gl3000s cartridge (cart) .bin gl4000 cartridge (cart) .bin gl4004 cartridge (cart) .bin gl5000 cartridge (cart) .bin gl5005x cartridge (cart) .bin gl6000sl cartridge (cart) .bin gl7007sl cartridge (cart) .bin glcolor cartridge (cart) .bin glmcolor cartridge (cart) .bin glpn cartridge (cart) .bin glscolor cartridge (cart) .bin gmaster cartridge (cart) .bin gmb486sg floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf gmb486sg floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf gmb486sg harddisk (hard) .chd .hd .hdv .2mg .hdi gmb486sg printout (prin) .prn gmb486unp floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf gmb486unp floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf gmb486unp harddisk (hard) .chd .hd .hdv .2mg .hdi gmb486unp printout (prin) .prn gmfamily harddisk (hard) .chd .hd .hdv .2mg .hdi gmfamily cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gmfamily floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf gmfamily floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf gmfamily printout (prin) .prn gmmc cartridge (cart) .bin gmtt cartridge (cart) .bin gnat10 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk gnat10 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk gobyrc harddisk (hard) .chd .hd .hdv .2mg .hdi gogostrk harddisk (hard) .chd .hd .hdv .2mg .hdi goupilg1 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk goupilg1 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk goupilg2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk goupilg2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk gpi1200 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gq863 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gq863 harddisk (hard) .chd .hd .hdv .2mg .hdi gq863 printout (prin) .prn gr700 cartridge (cart) .mks30_cart gs611606a floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf gs611606a floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf gs611606a harddisk (hard) .chd .hd .hdv .2mg .hdi gs611606a printout (prin) .prn gscpm harddisk (hard) .chd .hd .hdv .2mg .hdi gsfc200 cartridge (cart) .mx1 .bin .rom gsfc200 printout (prin) .prn gsfc200 cassette (cass) .wav .flac .tap .cas .tsx gsfc80u cartridge (cart) .mx1 .bin .rom gsfc80u printout (prin) .prn gsfc80u cassette (cass) .wav .flac .tap .cas .tsx gtfore01 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi gtfore01 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr gtfore01 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi gtfore01 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr gtfore02 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi gtfore02 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr gtfore02 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi gtfore02 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr gtfore03 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi gtfore03 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr gtfore03 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi gtfore03 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr gtfore03a harddisk1 (hard1) .chd .hd .hdv .2mg .hdi gtfore03a cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr gtfore03a harddisk2 (hard2) .chd .hd .hdv .2mg .hdi gtfore03a cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr gtfore04 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi gtfore04 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr gtfore04 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi gtfore04 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr gtfore04a harddisk1 (hard1) .chd .hd .hdv .2mg .hdi gtfore04a cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr gtfore04a harddisk2 (hard2) .chd .hd .hdv .2mg .hdi gtfore04a cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr gtfore05 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi gtfore05 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr gtfore05 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi gtfore05 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr gtfore05a harddisk1 (hard1) .chd .hd .hdv .2mg .hdi gtfore05a cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr gtfore05a harddisk2 (hard2) .chd .hd .hdv .2mg .hdi gtfore05a cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr gtfore05b harddisk1 (hard1) .chd .hd .hdv .2mg .hdi gtfore05b cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr gtfore05b harddisk2 (hard2) .chd .hd .hdv .2mg .hdi gtfore05b cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr gtfore05c harddisk1 (hard1) .chd .hd .hdv .2mg .hdi gtfore05c cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr gtfore05c harddisk2 (hard2) .chd .hd .hdv .2mg .hdi gtfore05c cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr gtfore06 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi gtfore06 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr gtfore06 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi gtfore06 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr gtfrk10m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtfrk10ma cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtfrk11m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtfrk3ma cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtfrk3ma memcard1 (memc1) .mc gtfrk3ma memcard2 (memc2) .mc gtfrk3mb cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gticlub2 harddisk (hard) .chd .hd .hdv .2mg .hdi gticlub2ea harddisk (hard) .chd .hd .hdv .2mg .hdi gtrfrk2m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrk2ma cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrk2maa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrk2mja cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrk2mka cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrk2ml1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrk2ml1 memcard1 (memc1) .mc gtrfrk2ml1 memcard2 (memc2) .mc gtrfrk2ml2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrk2ml2 memcard1 (memc1) .mc gtrfrk2ml2 memcard2 (memc2) .mc gtrfrk2mua cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrk3m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrk3m memcard1 (memc1) .mc gtrfrk3m memcard2 (memc2) .mc gtrfrk4m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrk4m memcard1 (memc1) .mc gtrfrk4m memcard2 (memc2) .mc gtrfrk5m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrk5ma cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrk6m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrk7m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrk8m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrk8ma cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrk9m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrks cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrksa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrksaa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrksac cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrksc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrksea cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrksj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrksja cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrksjc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrksu cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrksua cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gtrfrksuc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr guab floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk gunbalina cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gundamos cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gundcb79 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gundcb79a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gundcb83 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gundcb83a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gundcb83b cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gundmgd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gundmxgd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr gwnf cartridge (cart) .bin gx4000 cartridge (cart) .bin .cpr h01b cassette (cass) .wav .flac h01jce cassette (cass) .wav .flac h21 quickload (quik) .pgm .tvc h21 cartridge (cart) .bin .rom h8 cassette1 (cass1) .wav .flac .h8t h8 cassette2 (cass2) .wav .flac .h8t h88 cassette1 (cass1) .wav .flac .h8t h88 cassette2 (cass2) .wav .flac .h8t h88 printout (prin) .prn h89 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk h89 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk h89 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk h89 printout (prin) .prn h89_cdr floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk h89_cdr floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk h89_cdr floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk h89_cdr floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk h89_cdr printout (prin) .prn h89_mms floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk h89_mms floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk h89_mms floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk h89_mms floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk h89_mms floppydisk5 (flop5) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk h89_mms floppydisk6 (flop6) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk h89_mms floppydisk7 (flop7) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk h89_mms floppydisk8 (flop8) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk h89_mms printout (prin) .prn hanihac cartridge (cart) .bin haremchl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hawaii harddisk (hard) .chd .hd .hdv .2mg .hdi hawaii cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hb10 cartridge1 (cart1) .mx1 .bin .rom hb10 cartridge2 (cart2) .mx1 .bin .rom hb10 printout (prin) .prn hb10 cassette (cass) .wav .flac .tap .cas .tsx hb101 cartridge1 (cart1) .mx1 .bin .rom hb101 cartridge2 (cart2) .mx1 .bin .rom hb101 printout (prin) .prn hb101 cassette (cass) .wav .flac .tap .cas .tsx hb101p cartridge1 (cart1) .mx1 .bin .rom hb101p cartridge2 (cart2) .mx1 .bin .rom hb101p printout (prin) .prn hb101p cassette (cass) .wav .flac .tap .cas .tsx hb10p cartridge1 (cart1) .mx1 .bin .rom hb10p cartridge2 (cart2) .mx1 .bin .rom hb10p printout (prin) .prn hb10p cassette (cass) .wav .flac .tap .cas .tsx hb201 cartridge1 (cart1) .mx1 .bin .rom hb201 cartridge2 (cart2) .mx1 .bin .rom hb201 printout (prin) .prn hb201 cassette (cass) .wav .flac .tap .cas .tsx hb201p cartridge1 (cart1) .mx1 .bin .rom hb201p cartridge2 (cart2) .mx1 .bin .rom hb201p printout (prin) .prn hb201p cassette (cass) .wav .flac .tap .cas .tsx hb20p cartridge1 (cart1) .mx1 .bin .rom hb20p cartridge2 (cart2) .mx1 .bin .rom hb20p printout (prin) .prn hb20p cassette (cass) .wav .flac .tap .cas .tsx hb501p cartridge1 (cart1) .mx1 .bin .rom hb501p cartridge2 (cart2) .mx1 .bin .rom hb501p printout (prin) .prn hb501p cassette (cass) .wav .flac .tap .cas .tsx hb55 cartridge (cart) .mx1 .bin .rom hb55 printout (prin) .prn hb55 cassette (cass) .wav .flac .tap .cas .tsx hb55d cartridge1 (cart1) .mx1 .bin .rom hb55d cartridge2 (cart2) .mx1 .bin .rom hb55d printout (prin) .prn hb55d cassette (cass) .wav .flac .tap .cas .tsx hb55p cartridge1 (cart1) .mx1 .bin .rom hb55p cartridge2 (cart2) .mx1 .bin .rom hb55p printout (prin) .prn hb55p cassette (cass) .wav .flac .tap .cas .tsx hb701fd cartridge1 (cart1) .mx1 .bin .rom hb701fd cartridge2 (cart2) .mx1 .bin .rom hb701fd floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hb701fd printout (prin) .prn hb701fd cassette (cass) .wav .flac .tap .cas .tsx hb75 cartridge (cart) .mx1 .bin .rom hb75 printout (prin) .prn hb75 cassette (cass) .wav .flac .tap .cas .tsx hb75d cartridge1 (cart1) .mx1 .bin .rom hb75d cartridge2 (cart2) .mx1 .bin .rom hb75d printout (prin) .prn hb75d cassette (cass) .wav .flac .tap .cas .tsx hb75p cartridge1 (cart1) .mx1 .bin .rom hb75p cartridge2 (cart2) .mx1 .bin .rom hb75p printout (prin) .prn hb75p cassette (cass) .wav .flac .tap .cas .tsx hb8000 cartridge1 (cart1) .mx1 .bin .rom hb8000 cartridge2 (cart2) .mx1 .bin .rom hb8000 printout (prin) .prn hb8000 cassette (cass) .wav .flac .tap .cas .tsx hbf1 cartridge1 (cart1) .mx1 .bin .rom hbf1 cartridge2 (cart2) .mx1 .bin .rom hbf1 printout (prin) .prn hbf1 cassette (cass) .wav .flac .tap .cas .tsx hbf1ii cartridge1 (cart1) .mx1 .bin .rom hbf1ii cartridge2 (cart2) .mx1 .bin .rom hbf1ii printout (prin) .prn hbf1ii cassette (cass) .wav .flac .tap .cas .tsx hbf1xd cartridge1 (cart1) .mx1 .bin .rom hbf1xd cartridge2 (cart2) .mx1 .bin .rom hbf1xd floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbf1xd printout (prin) .prn hbf1xd cassette (cass) .wav .flac .tap .cas .tsx hbf1xdj cartridge1 (cart1) .mx1 .bin .rom hbf1xdj cartridge2 (cart2) .mx1 .bin .rom hbf1xdj floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbf1xdj printout (prin) .prn hbf1xdj cassette (cass) .wav .flac .tap .cas .tsx hbf1xv cartridge1 (cart1) .mx1 .bin .rom hbf1xv cartridge2 (cart2) .mx1 .bin .rom hbf1xv floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbf1xv printout (prin) .prn hbf1xv cassette (cass) .wav .flac .tap .cas .tsx hbf5 cartridge1 (cart1) .mx1 .bin .rom hbf5 cartridge2 (cart2) .mx1 .bin .rom hbf5 printout (prin) .prn hbf5 cassette (cass) .wav .flac .tap .cas .tsx hbf500 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbf500 cartridge1 (cart1) .mx1 .bin .rom hbf500 cartridge2 (cart2) .mx1 .bin .rom hbf500 printout (prin) .prn hbf500 cassette (cass) .wav .flac .tap .cas .tsx hbf500_2 cartridge1 (cart1) .mx1 .bin .rom hbf500_2 cartridge2 (cart2) .mx1 .bin .rom hbf500_2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbf500_2 printout (prin) .prn hbf500_2 cassette (cass) .wav .flac .tap .cas .tsx hbf500f floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbf500f cartridge1 (cart1) .mx1 .bin .rom hbf500f cartridge2 (cart2) .mx1 .bin .rom hbf500f cartridge3 (cart3) .mx1 .bin .rom hbf500f printout (prin) .prn hbf500f cassette (cass) .wav .flac .tap .cas .tsx hbf500p floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbf500p cartridge1 (cart1) .mx1 .bin .rom hbf500p cartridge2 (cart2) .mx1 .bin .rom hbf500p cartridge3 (cart3) .mx1 .bin .rom hbf500p printout (prin) .prn hbf500p cassette (cass) .wav .flac .tap .cas .tsx hbf700d cartridge1 (cart1) .mx1 .bin .rom hbf700d cartridge2 (cart2) .mx1 .bin .rom hbf700d floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbf700d printout (prin) .prn hbf700d cassette (cass) .wav .flac .tap .cas .tsx hbf700f cartridge1 (cart1) .mx1 .bin .rom hbf700f cartridge2 (cart2) .mx1 .bin .rom hbf700f floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbf700f printout (prin) .prn hbf700f cassette (cass) .wav .flac .tap .cas .tsx hbf700p cartridge1 (cart1) .mx1 .bin .rom hbf700p cartridge2 (cart2) .mx1 .bin .rom hbf700p floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbf700p printout (prin) .prn hbf700p cassette (cass) .wav .flac .tap .cas .tsx hbf700s cartridge1 (cart1) .mx1 .bin .rom hbf700s cartridge2 (cart2) .mx1 .bin .rom hbf700s floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbf700s printout (prin) .prn hbf700s cassette (cass) .wav .flac .tap .cas .tsx hbf900 cartridge1 (cart1) .mx1 .bin .rom hbf900 cartridge2 (cart2) .mx1 .bin .rom hbf900 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbf900 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbf900 printout (prin) .prn hbf900 cassette (cass) .wav .flac .tap .cas .tsx hbf900a cartridge1 (cart1) .mx1 .bin .rom hbf900a cartridge2 (cart2) .mx1 .bin .rom hbf900a floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbf900a floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbf900a printout (prin) .prn hbf900a cassette (cass) .wav .flac .tap .cas .tsx hbf9p cartridge1 (cart1) .mx1 .bin .rom hbf9p cartridge2 (cart2) .mx1 .bin .rom hbf9p printout (prin) .prn hbf9p cassette (cass) .wav .flac .tap .cas .tsx hbf9pr cartridge1 (cart1) .mx1 .bin .rom hbf9pr cartridge2 (cart2) .mx1 .bin .rom hbf9pr printout (prin) .prn hbf9pr cassette (cass) .wav .flac .tap .cas .tsx hbf9s cartridge1 (cart1) .mx1 .bin .rom hbf9s cartridge2 (cart2) .mx1 .bin .rom hbf9s printout (prin) .prn hbf9s cassette (cass) .wav .flac .tap .cas .tsx hbg900ap floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbg900ap cartridge1 (cart1) .mx1 .bin .rom hbg900ap cartridge2 (cart2) .mx1 .bin .rom hbg900ap printout (prin) .prn hbg900ap cassette (cass) .wav .flac .tap .cas .tsx hbg900p floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hbg900p cartridge1 (cart1) .mx1 .bin .rom hbg900p cartridge2 (cart2) .mx1 .bin .rom hbg900p printout (prin) .prn hbg900p cassette (cass) .wav .flac .tap .cas .tsx hc128 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx hc128 quickload (quik) .raw .scr hc128 cassette (cass) .wav .flac .tzx .tap .blk hc2000 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx hc2000 quickload (quik) .raw .scr hc2000 cassette (cass) .wav .flac .tzx .tap .blk hc5 cartridge (cart) .mx1 .bin .rom hc5 printout (prin) .prn hc5 cassette (cass) .wav .flac .tap .cas .tsx hc6 cartridge (cart) .mx1 .bin .rom hc6 printout (prin) .prn hc6 cassette (cass) .wav .flac .tap .cas .tsx hc7 cartridge1 (cart1) .mx1 .bin .rom hc7 cartridge2 (cart2) .mx1 .bin .rom hc7 printout (prin) .prn hc7 cassette (cass) .wav .flac .tap .cas .tsx hc85 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx hc85 quickload (quik) .raw .scr hc85 cassette (cass) .wav .flac .tzx .tap .blk hc88 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx hc88 quickload (quik) .raw .scr hc88 cassette (cass) .wav .flac .tzx .tap .blk hc90 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx hc90 quickload (quik) .raw .scr hc90 cassette (cass) .wav .flac .tzx .tap .blk hc91 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx hc91 quickload (quik) .raw .scr hc91 cassette (cass) .wav .flac .tzx .tap .blk headg2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf headg2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf headg2 harddisk (hard) .chd .hd .hdv .2mg .hdi heatof11 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hec2hr cassette (cass) .wav .flac .k7 .cin .for hec2hr printout (prin) .prn hec2hrp cassette (cass) .wav .flac .k7 .cin .for hec2hrp printout (prin) .prn hec2hrx cassette (cass) .wav .flac .k7 .cin .for hec2hrx printout (prin) .prn hec2hrx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hec2hrx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hec2mdhrx cassette (cass) .wav .flac .k7 .cin .for hec2mdhrx printout (prin) .prn hec2mdhrx floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .hmd hec2mx40 cassette (cass) .wav .flac .k7 .cin .for hec2mx40 printout (prin) .prn hec2mx40 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hec2mx40 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hec2mx80 cassette (cass) .wav .flac .k7 .cin .for hec2mx80 printout (prin) .prn hec2mx80 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hec2mx80 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hector1 cassette (cass) .wav .flac .k7 .cin .for hector1 printout (prin) .prn hektor cassette (cass) .wav .flac hektor2 cassette (cass) .wav .flac hektor3 cassette (cass) .wav .flac hellngt cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hhtiger floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hhtiger floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hhtiger printout (prin) .prn hhtiger cassette (cass) .wav .flac hikara cartridge (cart) .bin .u1 hisaturn cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hisaturn cartridge (cart) .bin hkc8800a floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib hkc8800a floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib hkc8800a cassette (cass) .wav .flac hmcompm2 harddisk (hard) .chd .hd .hdv .2mg .hdi hmcompmx harddisk (hard) .chd .hd .hdv .2mg .hdi hmg1292 quickload (quik) .pgm .tvc hmg1292 cartridge (cart) .bin .rom hmg1392 quickload (quik) .pgm .tvc hmg1392 cartridge (cart) .bin .rom hmg2650 cartridge (cart) .bin hobby cassette (cass) .wav .flac .tap .cas .tsx homelab2 cassette (cass) .wav .flac homelab2 quickload (quik) .htp homelab3 cassette (cass) .wav .flac homelab3 quickload (quik) .htp homelab4 cassette (cass) .wav .flac homelab4 quickload (quik) .htp hostinv cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hot304 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hot304 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hot304 harddisk (hard) .chd .hd .hdv .2mg .hdi hot304 printout (prin) .prn hot307h floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hot307h floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hot307h harddisk (hard) .chd .hd .hdv .2mg .hdi hot307h printout (prin) .prn hot409 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hot409 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hot409 harddisk (hard) .chd .hd .hdv .2mg .hdi hot409 printout (prin) .prn hot419 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hot419 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hot419 harddisk (hard) .chd .hd .hdv .2mg .hdi hot419 printout (prin) .prn hot433 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hot433 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hot433 harddisk (hard) .chd .hd .hdv .2mg .hdi hot433 printout (prin) .prn hotbi13b cartridge1 (cart1) .mx1 .bin .rom hotbi13b cartridge2 (cart2) .mx1 .bin .rom hotbi13b printout (prin) .prn hotbi13b cassette (cass) .wav .flac .tap .cas .tsx hotbi13p cartridge1 (cart1) .mx1 .bin .rom hotbi13p cartridge2 (cart2) .mx1 .bin .rom hotbi13p printout (prin) .prn hotbi13p cassette (cass) .wav .flac .tap .cas .tsx hotbit20 cartridge1 (cart1) .mx1 .bin .rom hotbit20 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hotbit20 cartridge2 (cart2) .mx1 .bin .rom hotbit20 printout (prin) .prn hotbit20 cassette (cass) .wav .flac .tap .cas .tsx hotd3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hp2641 microtape1 (utap1) .hti hp2641 microtape2 (utap2) .hti hp2645 microtape1 (utap1) .hti hp2645 microtape2 (utap2) .hti hp64k floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp64k floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp85 romimage1 (rom1) .bin hp85 romimage2 (rom2) .bin hp85 romimage3 (rom3) .bin hp85 romimage4 (rom4) .bin hp85 romimage5 (rom5) .bin hp85 romimage6 (rom6) .bin hp85 microtape (utap) .hti hp85 bitbanger1 (bitb1) . hp85 bitbanger2 (bitb2) . hp86b romimage1 (rom1) .bin hp86b romimage2 (rom2) .bin hp86b romimage3 (rom3) .bin hp86b romimage4 (rom4) .bin hp86b romimage5 (rom5) .bin hp86b romimage6 (rom6) .bin hp86b_001 romimage1 (rom1) .bin hp86b_001 romimage2 (rom2) .bin hp86b_001 romimage3 (rom3) .bin hp86b_001 romimage4 (rom4) .bin hp86b_001 romimage5 (rom5) .bin hp86b_001 romimage6 (rom6) .bin hp86b_004 romimage1 (rom1) .bin hp86b_004 romimage2 (rom2) .bin hp86b_004 romimage3 (rom3) .bin hp86b_004 romimage4 (rom4) .bin hp86b_004 romimage5 (rom5) .bin hp86b_004 romimage6 (rom6) .bin hp9808a floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img hp9808a romimage1 (rom1) .bin hp9808a romimage2 (rom2) .bin hp9816a romimage1 (rom1) .bin hp9816a romimage2 (rom2) .bin hp9825a microtape (utap) .hti hp9825a romimage1 (rom1) .bin hp9825a romimage2 (rom2) .bin hp9825a romimage3 (rom3) .bin hp9825a romimage4 (rom4) .bin hp9825a bitbanger1 (bitb1) . hp9825a bitbanger2 (bitb2) . hp9825b microtape (utap) .hti hp9825b romimage1 (rom1) .bin hp9825b romimage2 (rom2) .bin hp9825b romimage3 (rom3) .bin hp9825b romimage4 (rom4) .bin hp9825b bitbanger1 (bitb1) . hp9825b bitbanger2 (bitb2) . hp9825t microtape (utap) .hti hp9825t romimage1 (rom1) .bin hp9825t romimage2 (rom2) .bin hp9825t romimage3 (rom3) .bin hp9825t romimage4 (rom4) .bin hp9825t bitbanger1 (bitb1) . hp9825t bitbanger2 (bitb2) . hp9826a romimage1 (rom1) .bin hp9826a romimage2 (rom2) .bin hp9826a floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9831 microtape (utap) .hti hp9831 romimage1 (rom1) .bin hp9831 romimage2 (rom2) .bin hp9831 romimage3 (rom3) .bin hp9831 romimage4 (rom4) .bin hp9836a romimage1 (rom1) .bin hp9836a romimage2 (rom2) .bin hp9836a floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9836a floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9836c romimage1 (rom1) .bin hp9836c romimage2 (rom2) .bin hp9836c floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9836c floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9845b microtape1 (utap1) .hti hp9845b microtape2 (utap2) .hti hp9845b romimage1 (rom1) .bin hp9845b romimage2 (rom2) .bin hp9845b romimage3 (rom3) .bin hp9845b romimage4 (rom4) .bin hp9845b romimage5 (rom5) .bin hp9845b romimage6 (rom6) .bin hp9845b romimage7 (rom7) .bin hp9845b romimage8 (rom8) .bin hp9845b bitbanger1 (bitb1) . hp9845b bitbanger2 (bitb2) . hp9845b_de microtape1 (utap1) .hti hp9845b_de microtape2 (utap2) .hti hp9845b_de romimage1 (rom1) .bin hp9845b_de romimage2 (rom2) .bin hp9845b_de romimage3 (rom3) .bin hp9845b_de romimage4 (rom4) .bin hp9845b_de romimage5 (rom5) .bin hp9845b_de romimage6 (rom6) .bin hp9845b_de romimage7 (rom7) .bin hp9845b_de romimage8 (rom8) .bin hp9845b_de bitbanger1 (bitb1) . hp9845b_de bitbanger2 (bitb2) . hp9845c microtape1 (utap1) .hti hp9845c microtape2 (utap2) .hti hp9845c romimage1 (rom1) .bin hp9845c romimage2 (rom2) .bin hp9845c romimage3 (rom3) .bin hp9845c romimage4 (rom4) .bin hp9845c romimage5 (rom5) .bin hp9845c romimage6 (rom6) .bin hp9845c romimage7 (rom7) .bin hp9845c romimage8 (rom8) .bin hp9845c bitbanger1 (bitb1) . hp9845c bitbanger2 (bitb2) . hp9845c_de microtape1 (utap1) .hti hp9845c_de microtape2 (utap2) .hti hp9845c_de romimage1 (rom1) .bin hp9845c_de romimage2 (rom2) .bin hp9845c_de romimage3 (rom3) .bin hp9845c_de romimage4 (rom4) .bin hp9845c_de romimage5 (rom5) .bin hp9845c_de romimage6 (rom6) .bin hp9845c_de romimage7 (rom7) .bin hp9845c_de romimage8 (rom8) .bin hp9845c_de bitbanger1 (bitb1) . hp9845c_de bitbanger2 (bitb2) . hp9845t microtape1 (utap1) .hti hp9845t microtape2 (utap2) .hti hp9845t romimage1 (rom1) .bin hp9845t romimage2 (rom2) .bin hp9845t romimage3 (rom3) .bin hp9845t romimage4 (rom4) .bin hp9845t romimage5 (rom5) .bin hp9845t romimage6 (rom6) .bin hp9845t romimage7 (rom7) .bin hp9845t romimage8 (rom8) .bin hp9845t bitbanger1 (bitb1) . hp9845t bitbanger2 (bitb2) . hp9845t_de microtape1 (utap1) .hti hp9845t_de microtape2 (utap2) .hti hp9845t_de romimage1 (rom1) .bin hp9845t_de romimage2 (rom2) .bin hp9845t_de romimage3 (rom3) .bin hp9845t_de romimage4 (rom4) .bin hp9845t_de romimage5 (rom5) .bin hp9845t_de romimage6 (rom6) .bin hp9845t_de romimage7 (rom7) .bin hp9845t_de romimage8 (rom8) .bin hp9845t_de bitbanger1 (bitb1) . hp9845t_de bitbanger2 (bitb2) . hp9k310 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k310 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k320 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k320 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k320 harddisk (hard) .chd .hd .hdv .2mg .hdi hp9k320 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hp9k330 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k330 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k332 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k332 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k340 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k340 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k340 harddisk (hard) .chd .hd .hdv .2mg .hdi hp9k340 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hp9k360 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k360 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k360 harddisk (hard) .chd .hd .hdv .2mg .hdi hp9k360 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hp9k370 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k370 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k370 harddisk (hard) .chd .hd .hdv .2mg .hdi hp9k370 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hp9k380 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k380 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k380 harddisk (hard) .chd .hd .hdv .2mg .hdi hp9k380 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hp9k382 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k382 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hp9k382 harddisk (hard) .chd .hd .hdv .2mg .hdi hp9k382 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hp_ipc floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img hp_ipc romimage1 (rom1) .bin hp_ipc romimage2 (rom2) .bin hr16 cassette (cass) .wav .flac hr16b cassette (cass) .wav .flac hr84 cassette (cass) .wav .flac hstrtpls floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hstrtpls floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hstrtpls printout (prin) .prn ht108064 cassette (cass) .wav .flac .cas ht108064 quickload (quik) .cmd ht108064 floppydisk1 (flop1) .mfi .dfi .dmk .jv1 .dsk ht108064 floppydisk2 (flop2) .mfi .dfi .dmk .jv1 .dsk ht108064 printout (prin) .prn ht1080z cassette (cass) .wav .flac .cas ht1080z quickload (quik) .cmd ht1080z floppydisk1 (flop1) .mfi .dfi .dmk .jv1 .dsk ht1080z floppydisk2 (flop2) .mfi .dfi .dmk .jv1 .dsk ht1080z printout (prin) .prn ht1080z2 cassette (cass) .wav .flac .cas ht1080z2 quickload (quik) .cmd ht1080z2 floppydisk1 (flop1) .mfi .dfi .dmk .jv1 .dsk ht1080z2 floppydisk2 (flop2) .mfi .dfi .dmk .jv1 .dsk ht1080z2 printout (prin) .prn ht12a floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ht12a floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ht12a harddisk (hard) .chd .hd .hdv .2mg .hdi ht18c floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ht18c floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ht18c harddisk (hard) .chd .hd .hdv .2mg .hdi ht280 romimage1 (rom1) .rom .bin ht280 cassette (cass) .wav .flac .csw .uef ht280 printout (prin) .prn ht280 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd ht280 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd ht68k floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk hwparty harddisk (hard) .chd .hd .hdv .2mg .hdi hwparty cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hx10 cartridge (cart) .mx1 .bin .rom hx10 printout (prin) .prn hx10 cassette (cass) .wav .flac .tap .cas .tsx hx10d cartridge (cart) .mx1 .bin .rom hx10d cassette (cass) .wav .flac .tap .cas .tsx hx10dp cartridge (cart) .mx1 .bin .rom hx10dp printout (prin) .prn hx10dp cassette (cass) .wav .flac .tap .cas .tsx hx10e cartridge (cart) .mx1 .bin .rom hx10e printout (prin) .prn hx10e cassette (cass) .wav .flac .tap .cas .tsx hx10f cartridge (cart) .mx1 .bin .rom hx10f printout (prin) .prn hx10f cassette (cass) .wav .flac .tap .cas .tsx hx10s cartridge (cart) .mx1 .bin .rom hx10s cassette (cass) .wav .flac .tap .cas .tsx hx10sa cartridge (cart) .mx1 .bin .rom hx10sa cassette (cass) .wav .flac .tap .cas .tsx hx20 cartridge1 (cart1) .mx1 .bin .rom hx20 cartridge2 (cart2) .mx1 .bin .rom hx20 printout (prin) .prn hx20 cassette (cass) .wav .flac .tap .cas .tsx hx20e cartridge1 (cart1) .mx1 .bin .rom hx20e cartridge2 (cart2) .mx1 .bin .rom hx20e printout (prin) .prn hx20e cassette (cass) .wav .flac .tap .cas .tsx hx20i cartridge1 (cart1) .mx1 .bin .rom hx20i cartridge2 (cart2) .mx1 .bin .rom hx20i printout (prin) .prn hx20i cassette (cass) .wav .flac .tap .cas .tsx hx21 cartridge1 (cart1) .mx1 .bin .rom hx21 cartridge2 (cart2) .mx1 .bin .rom hx21 printout (prin) .prn hx21 cassette (cass) .wav .flac .tap .cas .tsx hx21f cartridge1 (cart1) .mx1 .bin .rom hx21f cartridge2 (cart2) .mx1 .bin .rom hx21f printout (prin) .prn hx21f cassette (cass) .wav .flac .tap .cas .tsx hx22 cartridge1 (cart1) .mx1 .bin .rom hx22 cartridge2 (cart2) .mx1 .bin .rom hx22 printout (prin) .prn hx22 cassette (cass) .wav .flac .tap .cas .tsx hx22i cartridge1 (cart1) .mx1 .bin .rom hx22i cartridge2 (cart2) .mx1 .bin .rom hx22i printout (prin) .prn hx22i cassette (cass) .wav .flac .tap .cas .tsx hx23 cartridge1 (cart1) .mx1 .bin .rom hx23 cartridge2 (cart2) .mx1 .bin .rom hx23 printout (prin) .prn hx23 cassette (cass) .wav .flac .tap .cas .tsx hx23f cartridge1 (cart1) .mx1 .bin .rom hx23f cartridge2 (cart2) .mx1 .bin .rom hx23f printout (prin) .prn hx23f cassette (cass) .wav .flac .tap .cas .tsx hx32 cartridge1 (cart1) .mx1 .bin .rom hx32 cartridge2 (cart2) .mx1 .bin .rom hx32 printout (prin) .prn hx32 cassette (cass) .wav .flac .tap .cas .tsx hx33 cartridge1 (cart1) .mx1 .bin .rom hx33 cartridge2 (cart2) .mx1 .bin .rom hx33 printout (prin) .prn hx33 cassette (cass) .wav .flac .tap .cas .tsx hx34 cartridge1 (cart1) .mx1 .bin .rom hx34 cartridge2 (cart2) .mx1 .bin .rom hx34 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk hx34 printout (prin) .prn hx34 cassette (cass) .wav .flac .tap .cas .tsx hx51i cartridge1 (cart1) .mx1 .bin .rom hx51i cartridge2 (cart2) .mx1 .bin .rom hx51i printout (prin) .prn hx51i cassette (cass) .wav .flac .tap .cas .tsx hydrthnd harddisk (hard) .chd .hd .hdv .2mg .hdi hydrthnd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hydrthnd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf hydrthnd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf hydrthnd printout (prin) .prn hydrthnd100d harddisk (hard) .chd .hd .hdv .2mg .hdi hydrthnd100d cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hydrthnd100d floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf hydrthnd100d floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf hydrthnd100d printout (prin) .prn hydrthnd101b harddisk (hard) .chd .hd .hdv .2mg .hdi hydrthnd101b cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hydrthnd101b floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf hydrthnd101b floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf hydrthnd101b printout (prin) .prn hyo88t floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hyo88t floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hyo88t printout (prin) .prn hypbbc2p cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hypbbc2pk cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hyperath cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hyprdriv harddisk1 (hard1) .chd .hd .hdv .2mg .hdi hyprdriv cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr hyprdriv harddisk2 (hard2) .chd .hd .hdv .2mg .hdi hyprdriv cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr hyprdriv131 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi hyprdriv131 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr hyprdriv131 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi hyprdriv131 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr hyprscan cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr hyprscan memcard (memc) .bin hyprscan quickload (quik) .exe hyu16t floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hyu16t floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hyu16t printout (prin) .prn hyu16te floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hyu16te floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf hyu16te printout (prin) .prn i7000 cartridge (cart) .rom i8530286 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf i8530286 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf i8530286 harddisk (hard) .chd .hd .hdv .2mg .hdi i8530h31 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf i8530h31 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf i8530h31 harddisk (hard) .chd .hd .hdv .2mg .hdi i8535043 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf i8535043 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf i8535043 harddisk (hard) .chd .hd .hdv .2mg .hdi i8535043 printout (prin) .prn i8550021 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf i8550021 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf i8550021 harddisk (hard) .chd .hd .hdv .2mg .hdi i8550061 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf i8550061 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf i8550061 harddisk (hard) .chd .hd .hdv .2mg .hdi i8555081 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf i8555081 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf i8555081 harddisk (hard) .chd .hd .hdv .2mg .hdi i8555081 printout (prin) .prn i8580071 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf i8580071 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf i8580071 harddisk (hard) .chd .hd .hdv .2mg .hdi i8580071 printout (prin) .prn i8580111 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf i8580111 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf i8580111 harddisk (hard) .chd .hd .hdv .2mg .hdi i8580111 printout (prin) .prn ibm2011 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm2011 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm2011 harddisk (hard) .chd .hd .hdv .2mg .hdi ibm2011rd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm2011rd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm2011rd harddisk (hard) .chd .hd .hdv .2mg .hdi ibm2121 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm2121 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm2121 harddisk (hard) .chd .hd .hdv .2mg .hdi ibm2121rd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm2121rd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm2121rd harddisk (hard) .chd .hd .hdv .2mg .hdi ibm2123 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm2123 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm2123 harddisk (hard) .chd .hd .hdv .2mg .hdi ibm2133 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm2133 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm2133 harddisk (hard) .chd .hd .hdv .2mg .hdi ibm2133 printout (prin) .prn ibm5140 cassette (cass) .wav .flac ibm5140 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm5140 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm5140 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi ibm5140 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi ibm5150 cassette (cass) .wav .flac ibm5150 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm5150 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm5150 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi ibm5150 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi ibm5155 cassette (cass) .wav .flac ibm5155 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm5155 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm5155 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi ibm5155 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi ibm5160 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm5160 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm5160 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi ibm5160 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi ibm5162 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm5162 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm5162 harddisk (hard) .chd .hd .hdv .2mg .hdi ibm5170 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm5170 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm5170 harddisk (hard) .chd .hd .hdv .2mg .hdi ibm5170a floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm5170a floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibm5170a harddisk (hard) .chd .hd .hdv .2mg .hdi ibm6580 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ibm6580 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ibmpcjr printout (prin) .prn ibmpcjr cassette (cass) .wav .flac ibmpcjr floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibmpcjr cartridge1 (cart1) .bin .jrc ibmpcjr cartridge2 (cart2) .bin .jrc ibmpcjx printout (prin) .prn ibmpcjx cassette (cass) .wav .flac ibmpcjx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibmpcjx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ibmpcjx cartridge1 (cart1) .bin .jrc ibmpcjx cartridge2 (cart2) .bin .jrc icanguit cartridge (cart) .bin icanpian cartridge (cart) .bin icebox floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk icebox floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk icldrsm40 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf icldrsm40 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf icldrsm40 harddisk (hard) .chd .hd .hdv .2mg .hdi ikaruga cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ilm396b floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ilm396b floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ilm396b harddisk (hard) .chd .hd .hdv .2mg .hdi imac floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg imds2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .img imds2 printout (prin) .prn impuls03 cassette (cass) .wav .flac .rk .rkr .gam .g16 .pki indiana floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf indiana floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf indiana harddisk (hard) .chd .hd .hdv .2mg .hdi indigo harddisk (hard) .chd .hd .hdv .2mg .hdi indigo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr indigo2_4415 harddisk (hard) .chd .hd .hdv .2mg .hdi indigo2_4415 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr indigo2_4415 printout (prin) .prn indigo_r4000 harddisk (hard) .chd .hd .hdv .2mg .hdi indigo_r4000 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr indigo_r4400 harddisk (hard) .chd .hd .hdv .2mg .hdi indigo_r4400 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr indy_4610 harddisk (hard) .chd .hd .hdv .2mg .hdi indy_4610 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr indy_4610 printout (prin) .prn indy_4610 picture (pic) .png .jpg .jpeg .jfif .bmp .dib indy_4610 vidfile (vid) .avi indy_4613 harddisk (hard) .chd .hd .hdv .2mg .hdi indy_4613 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr indy_4613 printout (prin) .prn indy_4613 picture (pic) .png .jpg .jpeg .jfif .bmp .dib indy_4613 vidfile (vid) .avi indy_5015 harddisk (hard) .chd .hd .hdv .2mg .hdi indy_5015 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr indy_5015 printout (prin) .prn indy_5015 picture (pic) .png .jpg .jpeg .jfif .bmp .dib indy_5015 vidfile (vid) .avi ingtelma cartridge (cart) .bin .chf inidv3ca cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr inidv3cy cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr initd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr initdexp cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr initdexpo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr initdo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr initdv2e cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr initdv2j cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr initdv2ja cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr initdv2jo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr initdv3e cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr initdv3j cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr initdv3jb cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr innotab2 cartridge (cart) .bin innotv cartridge (cart) .bin instruct quickload (quik) .pgm instruct cassette (cass) .wav .flac intchess cassette (cass) .wav .flac intel02 cartridge (cart) .bin interact cassette (cass) .wav .flac .k7 .cin .for interact printout (prin) .prn intervsn cartridge (cart) .bin intlc44 promimage1 (prom1) .rom .bin intlc44 punchtape (ptap) .bnpf .hex .lst .txt intlc44 promimage2 (prom2) .rom .bin intlc440 promimage1 (prom1) .rom .bin intlc440 punchtape (ptap) .bnpf .hex .lst .txt intlc440 promimage2 (prom2) .rom .bin intmpt03 cartridge (cart) .bin intv cartridge (cart) .bin .int .rom .itv intv2 cartridge (cart) .bin .int .rom .itv intvecs cartridge (cart) .bin .int .rom .itv intvkbd cartridge1 (cart1) .bin .int .rom .itv intvkbd cartridge2 (cart2) .bin intvkbd cartridge3 (cart3) .bin intvoice cartridge (cart) .bin .int .rom .itv intvsrs cartridge (cart) .bin .int .rom .itv inves snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx inves quickload (quik) .raw .scr inves cassette (cass) .wav .flac .tzx .tap .blk ip2000 harddisk (hard) .chd .hd .hdv .2mg .hdi ip2000 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ip2000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf ip2400 harddisk (hard) .chd .hd .hdv .2mg .hdi ip2400 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ip2400 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf ip2500 harddisk (hard) .chd .hd .hdv .2mg .hdi ip2500 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ip2500 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf ip2700 harddisk (hard) .chd .hd .hdv .2mg .hdi ip2700 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ip2700 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf ip2800 harddisk (hard) .chd .hd .hdv .2mg .hdi ip2800 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ip2800 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf ip6000 harddisk (hard) .chd .hd .hdv .2mg .hdi ip6000 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ip6000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf ip6400 harddisk (hard) .chd .hd .hdv .2mg .hdi ip6400 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ip6400 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf ip6700 harddisk (hard) .chd .hd .hdv .2mg .hdi ip6700 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ip6700 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf ip6800 harddisk (hard) .chd .hd .hdv .2mg .hdi ip6800 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ip6800 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf ippo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ippo2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr iq128 cartridge (cart) .bin iq128_fr cartridge (cart) .bin iq151 cassette (cass) .wav .flac iq151 cartridge1 (cart1) .bin .rom iq151 cartridge2 (cart2) .bin .rom iq151 cartridge3 (cart3) .bin .rom iq151 cartridge4 (cart4) .bin .rom iq151 cartridge5 (cart5) .bin .rom iq501 cartridge (cart) .nes .unf .unif iq502 cartridge (cart) .nes .unf .unif iq7000 cartridge (cart) .bin iqtv512 cartridge (cart) .bin iquest cartridge (cart) .bin iqunlim cartridge (cart) .bin iqunlimgr cartridge (cart) .bin iqunlimz cartridge (cart) .bin iris3130 quickload (quik) . isa386c floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf isa386c floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf isa386c harddisk (hard) .chd .hd .hdv .2mg .hdi isa386c printout (prin) .prn isa386u30 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf isa386u30 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf isa386u30 harddisk (hard) .chd .hd .hdv .2mg .hdi isa386u30 printout (prin) .prn isbc286 printout (prin) .prn isbc286 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi isbc286 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi isbc286 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf isbc2861 printout (prin) .prn isbc2861 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi isbc2861 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi isbc2861 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf isbc28612 printout (prin) .prn isbc28612 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi isbc28612 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi isbc28612 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf isbc8605 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf isbc8605 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf isbc8630 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi isbc8630 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi isbc8630 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf isinger cartridge (cart) .bin .u1 iskr1030m floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf iskr1030m floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf iskr1031 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf iskr1031 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf iskr3104 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf iskr3104 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf iskr3104 printout (prin) .prn iteagle harddisk1 (hard1) .chd .hd .hdv .2mg .hdi iteagle cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr iteagle harddisk2 (hard2) .chd .hd .hdv .2mg .hdi iteagle cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr itmcmtp3 cartridge (cart) .bin itt3030 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk itt3030 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk itt3030 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk itttelma cartridge (cart) .bin .chf ittxtra floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ittxtra floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ittxtra printout (prin) .prn itunlim cartridge (cart) .bin ivelultr floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib ivelultr floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib ivelultr cassette (cass) .wav .flac ivg09 cassette (cass) .wav .flac ivg09 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ixl2000 cartridge (cart) .bin jaguar quickload (quik) .abs .bin .cof .jag .prg .rom jaguar cartridge (cart) .j64 jaguarcd quickload (quik) .abs .bin .cof .jag .prg .rom jaguarcd cartridge (cart) .j64 jaguarcd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jak_capc cartridge (cart) .bin .u1 jak_care cartridge (cart) .bin .u1 jak_dbz cartridge (cart) .bin .u1 jak_disf cartridge (cart) .bin .u1 jak_disn cartridge (cart) .bin .u1 jak_dora cartridge (cart) .bin .u1 jak_dorr cartridge (cart) .bin .u1 jak_dpr cartridge (cart) .bin .u1 jak_dprs cartridge (cart) .bin .u1 jak_fan4 cartridge (cart) .bin .u1 jak_just cartridge (cart) .bin .u1 jak_mpac cartridge (cart) .bin .u1 jak_nick cartridge (cart) .bin .u1 jak_pooh cartridge (cart) .bin .u1 jak_sbfc cartridge (cart) .bin .u1 jak_sdoo cartridge (cart) .bin .u1 jak_sith cartridge (cart) .bin .u1 jak_sithp cartridge (cart) .bin .u1 jak_spdm cartridge (cart) .bin .u1 jak_swot cartridge (cart) .bin .u1 jak_wof cartridge (cart) .bin .u1 jak_wwe cartridge (cart) .bin .u1 jakms41 harddisk (hard) .chd .hd .hdv .2mg .hdi jakms41 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jakms41 printout (prin) .prn jaminator cartridge (cart) .bin jb3000 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf jb3000 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf jb3000 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf jb3000 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf jb3000 printout (prin) .prn jdredd harddisk (hard) .chd .hd .hdv .2mg .hdi jdreddb harddisk (hard) .chd .hd .hdv .2mg .hdi jet snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx jet quickload (quik) .raw .scr jet cassette (cass) .wav .flac .tzx .tap .blk jingystm cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jnero harddisk (hard) .chd .hd .hdv .2mg .hdi jojo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojoa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojoar1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojoar2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojoba cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojobajr1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojobajr2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojoban cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojobaner1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojobaner2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojobanr1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojobanr2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojobar1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojobar2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojoj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojojr1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojojr2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojon cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojonr1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojonr2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojor1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojor2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojou cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojour1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jojour2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jopac cartridge (cart) .bin .rom jpark3 harddisk (hard) .chd .hd .hdv .2mg .hdi jpark3u harddisk (hard) .chd .hd .hdv .2mg .hdi jpopira cartridge (cart) .bin .u1 jppyex98 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jr100 cassette (cass) .wav .flac jr100 quickload (quik) .prg jr100u cassette (cass) .wav .flac jr100u quickload (quik) .prg jtc cassette (cass) .wav .flac jtc printout (prin) .prn jtc quickload (quik) .jtc .bin jtces23 cassette (cass) .wav .flac jtces23 printout (prin) .prn jtces23 quickload (quik) .jtc .bin jtces40 cassette (cass) .wav .flac jtces40 printout (prin) .prn jtces40 quickload (quik) .jtc .bin jtces88 cassette (cass) .wav .flac jtces88 printout (prin) .prn jtces88 quickload (quik) .jtc .bin juko16 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf juko16 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf juko16 printout (prin) .prn juko8 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf juko8 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf juko8 printout (prin) .prn juku floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .juk juku floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .juk junai cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr junai2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr junior80 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk junior80 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk jupace cassette (cass) .wav .flac .tap jupace printout (prin) .prn jupace snapshot (dump) .ace jupiter2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk jupiter3 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk jvchc7gb cartridge1 (cart1) .mx1 .bin .rom jvchc7gb cartridge2 (cart2) .mx1 .bin .rom jvchc7gb printout (prin) .prn jvchc7gb cassette (cass) .wav .flac .tap .cas .tsx jwj403tg floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf jwj403tg floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf jwj403tg harddisk (hard) .chd .hd .hdv .2mg .hdi jwj403tg printout (prin) .prn jwj446a harddisk (hard) .chd .hd .hdv .2mg .hdi jwj446a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr jwj446a printout (prin) .prn jx10 cartridge (cart) .jx8p_cart jx8p cartridge (cart) .jx8p_cart jx8po cartridge (cart) .jx8p_cart k28 cartridge (cart) .vsm .bin k286i floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf k286i floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf k286i harddisk (hard) .chd .hd .hdv .2mg .hdi karams cartridge (cart) .bin karamsg cartridge (cart) .bin karous cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr katochan harddisk (hard) .chd .hd .hdv .2mg .hdi kay1024 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx kay1024 quickload (quik) .raw .scr kay1024 cassette (cass) .wav .flac .tzx .tap .blk kay1024 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd kay1024 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd kay1024 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd kay1024 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd kaypro1 quickload (quik) .com .cpm kaypro1 printout (prin) .prn kaypro1 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kaypro1 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kaypro10 quickload (quik) .com .cpm kaypro10 printout (prin) .prn kaypro10 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kaypro1084 quickload (quik) .com .cpm kaypro1084 printout (prin) .prn kaypro1084 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kaypro16 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf kaypro16 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf kaypro16 printout (prin) .prn kaypro284 quickload (quik) .com .cpm kaypro284 printout (prin) .prn kaypro284 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kaypro284 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kaypro2x quickload (quik) .com .cpm kaypro2x printout (prin) .prn kaypro2x floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kaypro2x floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kaypro484 quickload (quik) .com .cpm kaypro484 printout (prin) .prn kaypro484 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kaypro484 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kaypro484p88 quickload (quik) .com .cpm kaypro484p88 printout (prin) .prn kaypro484p88 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kaypro484p88 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kaypro4x quickload (quik) .com .cpm kaypro4x printout (prin) .prn kaypro4x floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kaypro4x floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kayproii quickload (quik) .com .cpm kayproii printout (prin) .prn kayproii floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kayproii floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kayproiip88 quickload (quik) .com .cpm kayproiip88 printout (prin) .prn kayproiip88 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kayproiip88 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kayproiv quickload (quik) .com .cpm kayproiv printout (prin) .prn kayproiv floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kayproiv floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kaypronew2 quickload (quik) .com .cpm kaypronew2 printout (prin) .prn kaypronew2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay kaypropc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf kaypropc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf kaypropc printout (prin) .prn kbh cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr kbh cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr kbm cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr kbm cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr kbm2nd cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr kbm2nd cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr kbm3rd cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr kbm3rd cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr kc85 printout (prin) .prn kc85 cassette (cass) .wav .flac kc85 cartridge (cart) .bin .rom kc85_111 cassette (cass) .wav .flac kc85_2 quickload (quik) .kcc kc85_2 cassette (cass) .wav .flac .kcc .kcb .tap .853 .854 .855 .tp2 .kcm .sss kc85_2 cartridge1 (cart1) .bin kc85_2 cartridge2 (cart2) .bin kc85_3 quickload (quik) .kcc kc85_3 cassette (cass) .wav .flac .kcc .kcb .tap .853 .854 .855 .tp2 .kcm .sss kc85_3 cartridge1 (cart1) .bin kc85_3 cartridge2 (cart2) .bin kc85_4 quickload (quik) .kcc kc85_4 cassette (cass) .wav .flac .kcc .kcb .tap .853 .854 .855 .tp2 .kcm .sss kc85_4 cartridge1 (cart1) .bin kc85_4 cartridge2 (cart2) .bin kc85_5 quickload (quik) .kcc kc85_5 cassette (cass) .wav .flac .kcc .kcb .tap .853 .854 .855 .tp2 .kcm .sss kc85_5 cartridge1 (cart1) .bin kc85_5 cartridge2 (cart2) .bin kc87_10 cassette (cass) .wav .flac kc87_11 cassette (cass) .wav .flac kc87_20 cassette (cass) .wav .flac kc87_21 cassette (cass) .wav .flac kccomp printout (prin) .prn kccomp snapshot (dump) .sna kccomp cassette (cass) .wav .flac .cdt kccomp floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf kccomp floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf kd2001 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr kdeadeye cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr keroro cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr keyboard cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr kharkovsky cassette (cass) .wav .flac .rks kim1 cassette (cass) .wav .flac .kim .kim1 kinst harddisk (hard) .chd .hd .hdv .2mg .hdi kinst2 harddisk (hard) .chd .hd .hdv .2mg .hdi kinst2uk harddisk (hard) .chd .hd .hdv .2mg .hdi kisssite cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr kma202f floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf kma202f floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf kma202f harddisk (hard) .chd .hd .hdv .2mg .hdi kma300g floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf kma300g floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf kma300g harddisk (hard) .chd .hd .hdv .2mg .hdi kma300g printout (prin) .prn kmc5000 cartridge1 (cart1) .mx1 .bin .rom kmc5000 cartridge2 (cart2) .mx1 .bin .rom kmc5000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk kmc5000 printout (prin) .prn kmc5000 cassette (cass) .wav .flac .tap .cas .tsx kminus floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk kminus floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk kn5000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk knpuzzle cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr kokoroj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr kokoroj2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr kokoroja cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr kollon harddisk (hard) .chd .hd .hdv .2mg .hdi kollonc harddisk (hard) .chd .hd .hdv .2mg .hdi konam80a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr konam80j cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr konam80k cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr konam80s cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr konam80u cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr konamigv cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr konhaji cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr konotako cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr kontiki harddisk1 (hard1) .chd .hd .hdv .2mg .hdi kontiki harddisk2 (hard2) .chd .hd .hdv .2mg .hdi kontiki floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk kontiki floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk kontiki printout (prin) .prn kontiki cassette (cass) .wav .flac kontur floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi kontur floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi kontur floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi kontur floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi kontur cassette (cass) .wav .flac korg707 cartridge (cart) .ds8_card korvet floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi korvet floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi korvet floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi korvet floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi korvet cassette (cass) .wav .flac kr03 cassette (cass) .wav .flac .rk .rkr .gam .g16 .pki krista2 cassette (cass) .wav .flac krista2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .fdd krista2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .fdd krista2 cartridge (cart) .bin .emr kristall2 cassette (cass) .wav .flac .rk8 krvnjvtv quickload (quik) .pgm .tvc krvnjvtv cartridge (cart) .bin .rom ks32 midiin (min) .mid .syx ks32 midiout (mout) .mid ks32 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .hfe kt216wb5 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf kt216wb5 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf kt216wb5 harddisk (hard) .chd .hd .hdv .2mg .hdi ktx20t02 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ktx20t02 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ktx20t02 harddisk (hard) .chd .hd .hdv .2mg .hdi kurucham cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr kviper harddisk (hard) .chd .hd .hdv .2mg .hdi kyoxt floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf kyoxt floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf kyoxt printout (prin) .prn labtam floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk lacrazyc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr lambda cassette (cass) .wav .flac .p .81 .tzx landhigh harddisk (hard) .chd .hd .hdv .2mg .hdi landhigha harddisk (hard) .chd .hd .hdv .2mg .hdi lanteach cartridge (cart) .vsm .bin lantrans cartridge (cart) .vsm .bin lantransp cartridge (cart) .vsm .bin las128e2 floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib las128e2 floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib las128e2 printout (prin) .prn las128ex floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib las128ex floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib las128ex printout (prin) .prn laser110 snapshot (dump) .vz laser110 cassette (cass) .wav .flac .cas laser128 floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib laser128 floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib laser128 printout (prin) .prn laser128o floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib laser128o floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib laser128o printout (prin) .prn laser200 snapshot (dump) .vz laser200 cassette (cass) .wav .flac .cas laser210 snapshot (dump) .vz laser210 cassette (cass) .wav .flac .cas laser2c floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib laser2c floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib laser2c cassette (cass) .wav .flac laser310 snapshot (dump) .vz laser310 cassette (cass) .wav .flac .cas laser310h snapshot (dump) .vz laser310h cassette (cass) .wav .flac .cas laser350 cassette (cass) .wav .flac .cas laser350 cartridge (cart) .rom .bin laser350 floppydisk (flop) .fdi .td0 .imd .cqm .dsk .d77 .d88 .1dd laser3k floppydisk1 (flop1) .mfi .dfi .dsk .do .po .edd .woz .nib laser3k floppydisk2 (flop2) .mfi .dfi .dsk .do .po .edd .woz .nib laser3k floppydisk3 (flop3) .mfi .dfi .dsk .do .po .edd .woz .nib laser3k floppydisk4 (flop4) .mfi .dfi .dsk .do .po .edd .woz .nib laser3k cassette (cass) .wav .flac laser3k printout (prin) .prn laser500 cassette (cass) .wav .flac .cas laser500 cartridge (cart) .rom .bin laser500 floppydisk (flop) .fdi .td0 .imd .cqm .dsk .d77 .d88 .1dd laser700 cassette (cass) .wav .flac .cas laser700 cartridge (cart) .rom .bin laser700 floppydisk1 (flop1) .fdi .td0 .imd .cqm .dsk .d77 .d88 .1dd laser700 floppydisk2 (flop2) .fdi .td0 .imd .cqm .dsk .d77 .d88 .1dd laser_turbo_xt floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf laser_turbo_xt floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf laser_turbo_xt printout (prin) .prn laser_xt3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf laser_xt3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf laser_xt3 printout (prin) .prn laseract cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr laseractj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr lasr2001 cassette (cass) .wav .flac lasr2001 printout (prin) .prn lasr2001 cartridge (cart) .bin .rom lasstixx cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr lb186 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf lb186 harddisk (hard) .chd .hd .hdv .2mg .hdi lbpc floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf lc80 cassette (cass) .wav .flac lc80_2 cassette (cass) .wav .flac lc80a cassette (cass) .wav .flac lc80e cassette (cass) .wav .flac leapexpr cartridge (cart) .bin leappad cartridge (cart) .bin leappadmic cartridge (cart) .bin leapster cartridge (cart) .bin leapster2 cartridge (cart) .bin leapsterlmx cartridge (cart) .bin leapstertv cartridge (cart) .bin ledgmodd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ledgmodd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ledgmodd printout (prin) .prn ledgmodm cassette (cass) .wav .flac ledgmodm printout1 (prin1) .prn ledgmodm floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ledgmodm floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ledgmodm printout2 (prin2) .prn ledgmodm harddisk1 (hard1) .chd .hd .hdv .2mg .hdi ledgmodm harddisk2 (hard2) .chd .hd .hdv .2mg .hdi lexipcm cartridge (cart) .bin lik cassette (cass) .wav .flac .rks lion3500 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf lion3500 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf lion3500 harddisk (hard) .chd .hd .hdv .2mg .hdi lion3500 printout (prin) .prn lisa floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg lisa floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg lisa2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg lisa2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg lisa210 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg lisa210 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg lk3000 cartridge (cart) .bin llc2 cassette (cass) .wav .flac lm103s floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf lm103s floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf lm103s harddisk (hard) .chd .hd .hdv .2mg .hdi lnsy1392 quickload (quik) .pgm .tvc lnsy1392 cartridge (cart) .bin .rom lnux4004 harddisk (hard) .chd .hd .hdv .2mg .hdi lnw80 cassette (cass) .wav .flac .cas lnw80 quickload (quik) .cmd lnw80 floppydisk1 (flop1) .mfi .dfi .jv1 .dsk .td0 lnw80 floppydisk2 (flop2) .mfi .dfi .jv1 .dsk .td0 lnw80 printout (prin) .prn lola8 cassette (cass) .wav .flac lola8a cassette (cass) .wav .flac lola8nk cassette (cass) .wav .flac ls486e harddisk (hard) .chd .hd .hdv .2mg .hdi ls486e cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ls486e printout (prin) .prn lsrquiz cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr lsrquiz2i cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr lsrquizg cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr lsucm486v30 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf lsucm486v30 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf lsucm486v30 harddisk (hard) .chd .hd .hdv .2mg .hdi lsucm486v30 printout (prin) .prn ltleappad cartridge (cart) .bin ltmpbp cassette (cass) .wav .flac .csw .uef ltmpbp printout (prin) .prn ltmpbp floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd ltmpbp floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd ltmpbp romimage1 (rom1) .rom .bin ltmpbp romimage2 (rom2) .rom .bin ltmpbp romimage3 (rom3) .rom .bin ltmpbp romimage4 (rom4) .rom .bin ltmpbp romimage5 (rom5) .rom .bin ltmpm cartridge1 (cart1) .rom .bin ltmpm cartridge2 (cart2) .rom .bin ltmpm romimage1 (rom1) .rom .bin ltmpm cassette (cass) .wav .flac .csw .uef ltmpm printout (prin) .prn ltmpm floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd ltmpm floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd luna harddisk (hard) .chd .hd .hdv .2mg .hdi luna floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk luna88k harddisk (hard) .chd .hd .hdv .2mg .hdi luna88k2 harddisk (hard) .chd .hd .hdv .2mg .hdi lupinsho cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr lupinshoo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr luptype cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr luxorvec cartridge (cart) .bin .chf luxorves cartridge (cart) .bin .chf lvision cartridge (cart) .bin lviv snapshot (dump) .sav lviv cassette (cass) .wav .flac .lvt .lvr .lv0 .lv1 .lv2 .lv3 lw30 floppydisk (flop) .mfi .dfi .img lw350 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf lw450 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf lw700i floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf lw840 floppydisk (flop) .mfi .dfi .dsk .ima .img .ufi .360 lx_jg7420 harddisk (hard) .chd .hd .hdv .2mg .hdi lynx quickload (quik) .o lynx cartridge (cart) .lnx .lyx lynx128k cassette (cass) .wav .flac .tap lynx128k floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ldf lynx128k floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ldf lynx48k cassette (cass) .wav .flac .tap lynx96k cassette (cass) .wav .flac .tap lynx96k floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ldf lynx96k floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ldf lzcolor64 cassette (cass) .wav .flac .cas lzcolor64 printout (prin) .prn lzcolor64 cartridge (cart) .ccc .rom lzcolor64 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 lzcolor64 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 lzcolor64 harddisk1 (hard1) .vhd lzcolor64 harddisk2 (hard2) .vhd m10 printout (prin) .prn m10 cassette (cass) .wav .flac m10 cartridge (cart) .bin .rom m20 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf m20 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf m21 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf m21 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf m21 printout (prin) .prn m21 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi m21 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi m24 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf m24 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf m24 printout (prin) .prn m24 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi m24 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi m240 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf m240 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf m240 printout (prin) .prn m240 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi m240 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi m250e floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf m250e floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf m250e harddisk (hard) .chd .hd .hdv .2mg .hdi m290 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf m290 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf m290 harddisk (hard) .chd .hd .hdv .2mg .hdi m3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk m3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk m40 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf m40 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf m44 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf m44 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf m5 printout (prin) .prn m5 cassette (cass) .wav .flac .cas m5 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk m5 cartridge1 (cart1) .bin .rom m5 cartridge2 (cart2) .bin .rom m55hipl harddisk (hard) .chd .hd .hdv .2mg .hdi m55hipl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr m55hipl floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf m55hipl floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf m55hipl printout (prin) .prn m5p printout (prin) .prn m5p cassette (cass) .wav .flac .cas m5p floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk m5p cartridge1 (cart1) .bin .rom m5p cartridge2 (cart2) .bin .rom m5p_brno printout (prin) .prn m5p_brno cassette (cass) .wav .flac .cas m5p_brno cartridge1 (cart1) .bin .rom m5p_brno cartridge2 (cart2) .bin .rom m5p_brno floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk m5p_brno floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk m86rk cassette (cass) .wav .flac .rkm m86rk cartridge (cart) .bin .rom mac128k floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg mac128k floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg mac2fdhd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg mac2fdhd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg mac2fdhd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mac2fdhd harddisk (hard) .chd .hd .hdv .2mg .hdi mac3 cassette (cass) .wav .flac mac512k floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg mac512k floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg mac512ke floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg mac512ke floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maccclas cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maccclas harddisk (hard) .chd .hd .hdv .2mg .hdi maccclas floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macclas2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macclas2 harddisk (hard) .chd .hd .hdv .2mg .hdi macclas2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macclasc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macclasc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macclasc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macclasc harddisk (hard) .chd .hd .hdv .2mg .hdi macct610 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macct610 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macct610 harddisk (hard) .chd .hd .hdv .2mg .hdi macct650 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macct650 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macct650 harddisk (hard) .chd .hd .hdv .2mg .hdi mace harddisk1 (hard1) .chd .hd .hdv .2mg .hdi mace cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr mace harddisk2 (hard2) .chd .hd .hdv .2mg .hdi mace cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr macea harddisk1 (hard1) .chd .hd .hdv .2mg .hdi macea cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr macea harddisk2 (hard2) .chd .hd .hdv .2mg .hdi macea cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr macii floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macii cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macii harddisk (hard) .chd .hd .hdv .2mg .hdi maciici floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maciici cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maciici harddisk (hard) .chd .hd .hdv .2mg .hdi maciicx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maciicx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maciicx cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maciicx harddisk (hard) .chd .hd .hdv .2mg .hdi maciifx floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maciifx cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maciifx harddisk (hard) .chd .hd .hdv .2mg .hdi maciihmu floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maciihmu cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maciihmu harddisk (hard) .chd .hd .hdv .2mg .hdi maciisi floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maciisi cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maciisi harddisk (hard) .chd .hd .hdv .2mg .hdi maciivi cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maciivi harddisk (hard) .chd .hd .hdv .2mg .hdi maciivi floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maciivx cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maciivx harddisk (hard) .chd .hd .hdv .2mg .hdi maciivx floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maciix floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maciix floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maciix cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maciix harddisk (hard) .chd .hd .hdv .2mg .hdi maclc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maclc harddisk (hard) .chd .hd .hdv .2mg .hdi maclc floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maclc2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maclc2 harddisk (hard) .chd .hd .hdv .2mg .hdi maclc2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maclc3 harddisk (hard) .chd .hd .hdv .2mg .hdi maclc3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maclc3 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maclc3p harddisk (hard) .chd .hd .hdv .2mg .hdi maclc3p cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maclc3p floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maclc475 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maclc475 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maclc475 harddisk (hard) .chd .hd .hdv .2mg .hdi maclc520 harddisk (hard) .chd .hd .hdv .2mg .hdi maclc520 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maclc520 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maclc550 harddisk (hard) .chd .hd .hdv .2mg .hdi maclc550 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maclc550 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maclc575 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg maclc575 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maclc575 harddisk (hard) .chd .hd .hdv .2mg .hdi maclc580 harddisk (hard) .chd .hd .hdv .2mg .hdi maclc580 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr maclc580 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macpb100 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macpb100 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macpb100 harddisk (hard) .chd .hd .hdv .2mg .hdi macpb140 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macpb140 harddisk (hard) .chd .hd .hdv .2mg .hdi macpb140 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macpb145 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macpb145 harddisk (hard) .chd .hd .hdv .2mg .hdi macpb145 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macpb145b floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macpb145b harddisk (hard) .chd .hd .hdv .2mg .hdi macpb145b cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macpb160 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macpb160 harddisk (hard) .chd .hd .hdv .2mg .hdi macpb160 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macpb165 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macpb165 harddisk (hard) .chd .hd .hdv .2mg .hdi macpb165 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macpb165c floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macpb165c harddisk (hard) .chd .hd .hdv .2mg .hdi macpb165c cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macpb170 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macpb170 harddisk (hard) .chd .hd .hdv .2mg .hdi macpb170 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macpb180 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macpb180 harddisk (hard) .chd .hd .hdv .2mg .hdi macpb180 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macpb180c floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macpb180c harddisk (hard) .chd .hd .hdv .2mg .hdi macpb180c cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macpd210 harddisk (hard) .chd .hd .hdv .2mg .hdi macpd210 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macpd230 harddisk (hard) .chd .hd .hdv .2mg .hdi macpd230 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macpd250 harddisk (hard) .chd .hd .hdv .2mg .hdi macpd250 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macpd270c harddisk (hard) .chd .hd .hdv .2mg .hdi macpd270c cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macpd280 harddisk (hard) .chd .hd .hdv .2mg .hdi macpd280 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macpd280c harddisk (hard) .chd .hd .hdv .2mg .hdi macpd280c cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macplus floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macplus floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macplus cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macplus harddisk (hard) .chd .hd .hdv .2mg .hdi macplusj floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macplusj floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macplusj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macplusj harddisk (hard) .chd .hd .hdv .2mg .hdi macprtb floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macprtb cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macprtb harddisk (hard) .chd .hd .hdv .2mg .hdi macqd605 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macqd605 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macqd605 harddisk (hard) .chd .hd .hdv .2mg .hdi macqd610 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macqd610 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macqd610 harddisk (hard) .chd .hd .hdv .2mg .hdi macqd630 harddisk (hard) .chd .hd .hdv .2mg .hdi macqd630 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macqd630 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macqd650 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macqd650 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macqd650 harddisk (hard) .chd .hd .hdv .2mg .hdi macqd700 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macqd700 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macqd700 harddisk (hard) .chd .hd .hdv .2mg .hdi macqd800 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macqd800 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macqd800 harddisk (hard) .chd .hd .hdv .2mg .hdi macqd900 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macqd900 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macqd900 harddisk (hard) .chd .hd .hdv .2mg .hdi macqd950 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macqd950 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macqd950 harddisk (hard) .chd .hd .hdv .2mg .hdi macse floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macse floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macse cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macse harddisk (hard) .chd .hd .hdv .2mg .hdi macse30 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macse30 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macse30 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macse30 harddisk (hard) .chd .hd .hdv .2mg .hdi macsefd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macsefd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macsefd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr macsefd harddisk (hard) .chd .hd .hdv .2mg .hdi mactv cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mactv harddisk (hard) .chd .hd .hdv .2mg .hdi mactv floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macxl floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg macxl floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg magb233 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf magb233 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf magb233 harddisk (hard) .chd .hd .hdv .2mg .hdi magb236 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf magb236 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf magb236 harddisk (hard) .chd .hd .hdv .2mg .hdi magic6 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx magic6 quickload (quik) .raw .scr magic6 cassette (cass) .wav .flac .tzx .tap .blk magistr16 cartridge (cart) .smd .bin .md .gen magistr16 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf magistr16 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf magistr16 printout (prin) .prn mahjngoh harddisk (hard) .chd .hd .hdv .2mg .hdi mamboagg cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mamboagga cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr manager cassette (cass) .wav .flac manager printout (prin) .prn manager cartridge (cart) .bin .rom map1010 cassette (cass) .wav .flac .phc map1010 printout (prin) .prn mariojjl harddisk (hard) .chd .hd .hdv .2mg .hdi masmario harddisk (hard) .chd .hd .hdv .2mg .hdi masmario2 harddisk (hard) .chd .hd .hdv .2mg .hdi masmarios harddisk (hard) .chd .hd .hdv .2mg .hdi mat286 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mat286 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mat286 harddisk (hard) .chd .hd .hdv .2mg .hdi mathsmag cartridge (cart) .vsm .bin mato cassette (cass) .wav .flac .pmd .tap .ptp matrix harddisk (hard) .chd .hd .hdv .2mg .hdi matrix cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mawasunda harddisk (hard) .chd .hd .hdv .2mg .hdi max80 floppydisk (flop) .mfi .dfi .imd maxf_102 harddisk (hard) .chd .hd .hdv .2mg .hdi maxf_ng harddisk (hard) .chd .hd .hdv .2mg .hdi maxforce harddisk (hard) .chd .hd .hdv .2mg .hdi maxxi floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib maxxi floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib maxxi cassette (cass) .wav .flac mb1212c floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mb1212c floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mb1212c harddisk (hard) .chd .hd .hdv .2mg .hdi mb133340 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mb133340 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mb133340 harddisk (hard) .chd .hd .hdv .2mg .hdi mb133340 printout (prin) .prn mb1433aeap floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mb1433aeap floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mb1433aeap harddisk (hard) .chd .hd .hdv .2mg .hdi mb1433aeap printout (prin) .prn mb1433ucv floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mb1433ucv floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mb1433ucv harddisk (hard) .chd .hd .hdv .2mg .hdi mb1433ucv printout (prin) .prn mb1433uiv floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mb1433uiv floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mb1433uiv harddisk (hard) .chd .hd .hdv .2mg .hdi mb1433uiv printout (prin) .prn mb4d33 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mb4d33 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mb4d33 harddisk (hard) .chd .hd .hdv .2mg .hdi mb4d33 printout (prin) .prn mb8433uud floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mb8433uud floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mb8433uud harddisk (hard) .chd .hd .hdv .2mg .hdi mb8433uud printout (prin) .prn mba009 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mba009 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mba009 harddisk (hard) .chd .hd .hdv .2mg .hdi mba029 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mba029 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mba029 harddisk (hard) .chd .hd .hdv .2mg .hdi mba029 printout (prin) .prn mba032q floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mba032q floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mba032q harddisk (hard) .chd .hd .hdv .2mg .hdi mba032q printout (prin) .prn mbc16 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mbc16 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mbc16 printout (prin) .prn mbc16lt printout1 (prin1) .prn mbc16lt floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mbc16lt floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mbc16lt printout2 (prin2) .prn mbc18nb floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mbc18nb floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mbc18nb harddisk (hard) .chd .hd .hdv .2mg .hdi mbc200 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mbc200 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mbc200 printout (prin) .prn mbc28 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mbc28 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mbc28 harddisk (hard) .chd .hd .hdv .2mg .hdi mbc55x floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf mbc55x floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf mbee quickload (quik) .mwb .com .bee .bin mbee cassette (cass) .wav .flac .tap mbee romimage1 (rom1) .mbn mbee romimage2 (rom2) .mbp mbee128 printout (prin) .prn mbee128 cassette (cass) .wav .flac .tap mbee128 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mbee128 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mbee128p printout (prin) .prn mbee128p cassette (cass) .wav .flac .tap mbee128p floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mbee128p floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mbee256 printout (prin) .prn mbee256 cassette (cass) .wav .flac .tap mbee256 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mbee256 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mbee56 printout (prin) .prn mbee56 cassette (cass) .wav .flac .tap mbee56 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mbee56 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mbeeic quickload (quik) .mwb .com .bee .bin mbeeic printout (prin) .prn mbeeic cassette (cass) .wav .flac .tap mbeeic romimage1 (rom1) .mbn mbeeic romimage2 (rom2) .mbp mbeeic romimage3 (rom3) .mbp mbeeic romimage4 (rom4) .mbp mbeeic romimage5 (rom5) .mbp mbeeic romimage6 (rom6) .mbp mbeeic romimage7 (rom7) .mbp mbeepc quickload (quik) .mwb .com .bee .bin mbeepc printout (prin) .prn mbeepc cassette (cass) .wav .flac .tap mbeepc romimage1 (rom1) .mbn mbeepc romimage2 (rom2) .mbp mbeepc romimage3 (rom3) .mbp mbeepc romimage4 (rom4) .mbp mbeepc romimage5 (rom5) .mbp mbeepc romimage6 (rom6) .mbp mbeepc romimage7 (rom7) .mbp mbeepc85 quickload (quik) .mwb .com .bee .bin mbeepc85 printout (prin) .prn mbeepc85 cassette (cass) .wav .flac .tap mbeepc85 romimage1 (rom1) .mbn mbeepc85 romimage2 (rom2) .mbp mbeepc85 romimage3 (rom3) .mbp mbeepc85 romimage4 (rom4) .mbp mbeepc85 romimage5 (rom5) .mbp mbeepc85 romimage6 (rom6) .mbp mbeepc85 romimage7 (rom7) .mbp mbeepc85b quickload (quik) .mwb .com .bee .bin mbeepc85b printout (prin) .prn mbeepc85b cassette (cass) .wav .flac .tap mbeepc85b romimage1 (rom1) .mbn mbeepc85b romimage2 (rom2) .mbp mbeepc85b romimage3 (rom3) .mbp mbeepc85b romimage4 (rom4) .mbp mbeepc85b romimage5 (rom5) .mbp mbeepc85b romimage6 (rom6) .mbp mbeepc85b romimage7 (rom7) .mbp mbeepc85s quickload (quik) .mwb .com .bee .bin mbeepc85s printout (prin) .prn mbeepc85s cassette (cass) .wav .flac .tap mbeepc85s romimage1 (rom1) .mbn mbeepc85s romimage2 (rom2) .mbp mbeepc85s romimage3 (rom3) .mbp mbeepc85s romimage4 (rom4) .mbp mbeepc85s romimage5 (rom5) .mbp mbeepc85s romimage6 (rom6) .mbp mbeepc85s romimage7 (rom7) .mbp mbeepp printout (prin) .prn mbeepp cassette (cass) .wav .flac .tap mbeepp floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mbeepp floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mbeeppc quickload (quik) .mwb .com .bee .bin mbeeppc printout (prin) .prn mbeeppc cassette (cass) .wav .flac .tap mbeeppc romimage1 (rom1) .mbn mbeeppc romimage2 (rom2) .mbp mbeeppc romimage3 (rom3) .mbp mbeeppc romimage4 (rom4) .mbp mbeeppc romimage5 (rom5) .mbp mbeeppc romimage6 (rom6) .mbp mbeeppc romimage7 (rom7) .mbp mbeett printout (prin) .prn mbeett cassette (cass) .wav .flac .tap mbeett romimage1 (rom1) .mbn mbeett romimage2 (rom2) .mbp mbh1 cartridge1 (cart1) .mx1 .bin .rom mbh1 cartridge2 (cart2) .mx1 .bin .rom mbh1 printout (prin) .prn mbh1 cassette (cass) .wav .flac .tap .cas .tsx mbh1e cartridge1 (cart1) .mx1 .bin .rom mbh1e cartridge2 (cart2) .mx1 .bin .rom mbh1e printout (prin) .prn mbh1e cassette (cass) .wav .flac .tap .cas .tsx mbh2 cartridge1 (cart1) .mx1 .bin .rom mbh2 cartridge2 (cart2) .mx1 .bin .rom mbh2 printout (prin) .prn mbh2 cassette (cass) .wav .flac .tap .cas .tsx mbh25 cartridge1 (cart1) .mx1 .bin .rom mbh25 cartridge2 (cart2) .mx1 .bin .rom mbh25 printout (prin) .prn mbh25 cassette (cass) .wav .flac .tap .cas .tsx mbh3 cartridge1 (cart1) .mx1 .bin .rom mbh3 cartridge2 (cart2) .mx1 .bin .rom mbh3 printout (prin) .prn mbh3 cassette (cass) .wav .flac .tap .cas .tsx mbh50 cartridge1 (cart1) .mx1 .bin .rom mbh50 cartridge2 (cart2) .mx1 .bin .rom mbh50 printout (prin) .prn mbh50 cassette (cass) .wav .flac .tap .cas .tsx mbh70 cartridge1 (cart1) .mx1 .bin .rom mbh70 cartridge2 (cart2) .mx1 .bin .rom mbh70 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk mbh70 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk mbh70 printout (prin) .prn mbh70 cassette (cass) .wav .flac .tap .cas .tsx mbs1 cassette (cass) .wav .flac mc10 cassette (cass) .wav .flac .cas .c10 .k7 mc10 printout (prin) .prn mc10 cartridge (cart) .mcc .rom mc1000 cassette (cass) .wav .flac mc1000 printout (prin) .prn mc1502 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf mc1502 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf mc1502 printout (prin) .prn mc1502 cassette (cass) .wav .flac mc1702 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mc1702 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mc1702 printout (prin) .prn mc200 ssd1 (ssd1) .rom .bin mc200 ssd2 (ssd2) .rom .bin mc200 ssd3 (ssd3) .rom .bin mc200 ssd4 (ssd4) .rom .bin mc200 printout (prin) .prn mc300 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mc400 ssd1 (ssd1) .rom .bin mc400 ssd2 (ssd2) .rom .bin mc400 ssd3 (ssd3) .rom .bin mc400 ssd4 (ssd4) .rom .bin mc400 printout (prin) .prn mc50 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mc50mk2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mc600 printout (prin) .prn mc600 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf mc600 ssd1 (ssd1) .rom .bin mc600 ssd2 (ssd2) .rom .bin mc600 ssd3 (ssd3) .rom .bin mc600 ssd4 (ssd4) .rom .bin mccpm floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mccpm floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mcword ssd1 (ssd1) .rom .bin mcword ssd2 (ssd2) .rom .bin mcword ssd3 (ssd3) .rom .bin mcword ssd4 (ssd4) .rom .bin mcword printout (prin) .prn mcword_de ssd1 (ssd1) .rom .bin mcword_de ssd2 (ssd2) .rom .bin mcword_de ssd3 (ssd3) .rom .bin mcword_de ssd4 (ssd4) .rom .bin mcword_de printout (prin) .prn md2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk md23do cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr md3 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk md4duvc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf md4duvc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf md4duvc harddisk (hard) .chd .hd .hdv .2mg .hdi md4duvc printout (prin) .prn mdisk floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mdisk floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mduckspa cartridge (cart) .bin medalnt cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr medalnt2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr medalnta cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr megacd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr megacd2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr megacd2j cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr megacda cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr megacdj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr megadrij cartridge (cart) .smd .bin .md .gen megadriv cartridge (cart) .smd .bin .md .gen megaduck cartridge (cart) .bin megajet cartridge (cart) .smd .bin .md .gen megapc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf megapc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf megapc harddisk (hard) .chd .hd .hdv .2mg .hdi megapc printout (prin) .prn megapcpl floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf megapcpl floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf megapcpl harddisk (hard) .chd .hd .hdv .2mg .hdi megapcpl printout (prin) .prn megapcpla floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf megapcpla floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf megapcpla harddisk (hard) .chd .hd .hdv .2mg .hdi megapcpla printout (prin) .prn megast floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf megast printout (prin) .prn megast midiin (min) .mid .syx megast midiout (mout) .mid megast romimage (rom) .bin .rom .stc megast_de floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf megast_de printout (prin) .prn megast_de midiin (min) .mid .syx megast_de midiout (mout) .mid megast_de romimage (rom) .bin .rom .stc megast_fr floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf megast_fr printout (prin) .prn megast_fr midiin (min) .mid .syx megast_fr midiout (mout) .mid megast_fr romimage (rom) .bin .rom .stc megast_se floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf megast_se printout (prin) .prn megast_se midiin (min) .mid .syx megast_se midiout (mout) .mid megast_se romimage (rom) .bin .rom .stc megast_sg floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf megast_sg printout (prin) .prn megast_sg midiin (min) .mid .syx megast_sg midiout (mout) .mid megast_sg romimage (rom) .bin .rom .stc megast_uk floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf megast_uk printout (prin) .prn megast_uk midiin (min) .mid .syx megast_uk midiout (mout) .mid megast_uk romimage (rom) .bin .rom .stc megaste floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf megaste printout (prin) .prn megaste midiin (min) .mid .syx megaste midiout (mout) .mid megaste romimage (rom) .bin .rom .stc megaste_de floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf megaste_de printout (prin) .prn megaste_de midiin (min) .mid .syx megaste_de midiout (mout) .mid megaste_de romimage (rom) .bin .rom .stc megaste_es floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf megaste_es printout (prin) .prn megaste_es midiin (min) .mid .syx megaste_es midiout (mout) .mid megaste_es romimage (rom) .bin .rom .stc megaste_fr floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf megaste_fr printout (prin) .prn megaste_fr midiin (min) .mid .syx megaste_fr midiout (mout) .mid megaste_fr romimage (rom) .bin .rom .stc megaste_it floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf megaste_it printout (prin) .prn megaste_it midiin (min) .mid .syx megaste_it midiout (mout) .mid megaste_it romimage (rom) .bin .rom .stc megaste_se floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf megaste_se printout (prin) .prn megaste_se midiin (min) .mid .syx megaste_se midiout (mout) .mid megaste_se romimage (rom) .bin .rom .stc megaste_uk floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf megaste_uk printout (prin) .prn megaste_uk midiin (min) .mid .syx megaste_uk midiout (mout) .mid megaste_uk romimage (rom) .bin .rom .stc megatech cartridge1 (cart1) .bin megatech cartridge2 (cart2) .bin megatech cartridge3 (cart3) .bin megatech cartridge4 (cart4) .bin megatech cartridge5 (cart5) .bin megatech cartridge6 (cart6) .bin megatech cartridge7 (cart7) .bin megatech cartridge8 (cart8) .bin mekd2 cassette (cass) .wav .flac mekd2 quickload (quik) .d2 mekd3 cassette (cass) .wav .flac mekd4 cassette (cass) .wav .flac mekd5 cassette (cass) .wav .flac meltyb cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr meltybld cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr meltyblo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr meltybo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr meritum1 printout (prin) .prn meritum1 cassette (cass) .wav .flac meritum1 quickload (quik) .cmd meritum2 printout (prin) .prn meritum2 cassette (cass) .wav .flac meritum2 quickload (quik) .cmd meritum_net printout (prin) .prn meritum_net cassette (cass) .wav .flac meritum_net quickload (quik) .cmd mfabfz cassette (cass) .wav .flac mfabfz85 cassette (cass) .wav .flac mfightc harddisk (hard) .chd .hd .hdv .2mg .hdi mfightcc harddisk (hard) .chd .hd .hdv .2mg .hdi mfleappad cartridge (cart) .bin mg1 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi mg1 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi mg1 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .raw mgnumber cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mgprem11 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr micral45 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf micral45 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf micral45 harddisk (hard) .chd .hd .hdv .2mg .hdi micro88 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf micro88 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf micro88 printout (prin) .prn micro88 harddisk (hard) .chd .hd .hdv .2mg .hdi microbx2 printout (prin) .prn microbx2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk microbx2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk microeng floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib microeng floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib microeng cassette (cass) .wav .flac micron cassette (cass) .wav .flac micron romimage1 (rom1) .bin .rom micron romimage2 (rom2) .bin .rom micron romimage3 (rom3) .bin .rom micron romimage4 (rom4) .bin .rom micron romimage5 (rom5) .bin .rom micron snapshot (dump) .dmp .m65 micron quickload (quik) .hex microtrol floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .wta microtrol floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .wta microvsn cartridge (cart) .bin mijx30gp floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mijx30gp floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mijx30gp harddisk (hard) .chd .hd .hdv .2mg .hdi mijx30gp printout (prin) .prn mikro80 cassette (cass) .wav .flac .rk8 mikron2 cassette (cass) .wav .flac .rk .rkr .gam .g16 .pki mikrosha cassette (cass) .wav .flac .rkm mikrosha cartridge (cart) .bin .rom mindset floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf mindset floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf mini5sx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd mini5sx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd minifram floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk miniscc cartridge (cart) .bin miniscco cartridge (cart) .bin minisys2k floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf minisys2k floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf minisys2k harddisk (hard) .chd .hd .hdv .2mg .hdi minitel2 romimage (rom) .bin .rom misterx cartridge (cart) .bin mistrum snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx mistrum quickload (quik) .raw .scr mistrum cassette (cass) .wav .flac .tzx .tap .blk mj1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mj1a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mj1b cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mj1c cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mj1d cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mj1e cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mj2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mj2c cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mj2f cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mj3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mj3c cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mj3d cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mj3evo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mj3evoa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mj3evoup cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mj3up cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mjgalpri cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mjmania cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mk14 cassette (cass) .wav .flac mk14 quickload (quik) .bin mk14vdu cassette (cass) .wav .flac mk14vdu quickload (quik) .bin mk82 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mk82 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mk82 quickload (quik) .com .cpm mk83 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mk83 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mk83 quickload (quik) .com .cpm mk88 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mk88 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mk88 printout (prin) .prn mkit09 cassette (cass) .wav .flac mkit09a cassette (cass) .wav .flac mkp286 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mkp286 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mkp286 harddisk (hard) .chd .hd .hdv .2mg .hdi mks30 cartridge (cart) .mks30_cart mks70 cartridge (cart) .jx8p_cart ml8000 cartridge (cart) .mx1 .bin .rom ml8000 printout (prin) .prn ml8000 cassette (cass) .wav .flac .tap .cas .tsx mlf110 cartridge1 (cart1) .mx1 .bin .rom mlf110 cartridge2 (cart2) .mx1 .bin .rom mlf110 printout (prin) .prn mlf110 cassette (cass) .wav .flac .tap .cas .tsx mlf120 cartridge1 (cart1) .mx1 .bin .rom mlf120 cartridge2 (cart2) .mx1 .bin .rom mlf120 printout (prin) .prn mlf120 cassette (cass) .wav .flac .tap .cas .tsx mlf48 cartridge1 (cart1) .mx1 .bin .rom mlf48 cartridge2 (cart2) .mx1 .bin .rom mlf48 printout (prin) .prn mlf48 cassette (cass) .wav .flac .tap .cas .tsx mlf80 cartridge1 (cart1) .mx1 .bin .rom mlf80 cartridge2 (cart2) .mx1 .bin .rom mlf80 printout (prin) .prn mlf80 cassette (cass) .wav .flac .tap .cas .tsx mlfx1 cartridge1 (cart1) .mx1 .bin .rom mlfx1 cartridge2 (cart2) .mx1 .bin .rom mlfx1 printout (prin) .prn mlfx1 cassette (cass) .wav .flac .tap .cas .tsx mlg1 cartridge1 (cart1) .mx1 .bin .rom mlg1 cartridge2 (cart2) .mx1 .bin .rom mlg1 printout (prin) .prn mlg1 cassette (cass) .wav .flac .tap .cas .tsx mlg10 cartridge1 (cart1) .mx1 .bin .rom mlg10 cartridge2 (cart2) .mx1 .bin .rom mlg10 printout (prin) .prn mlg10 cassette (cass) .wav .flac .tap .cas .tsx mlg3 cartridge1 (cart1) .mx1 .bin .rom mlg3 cartridge2 (cart2) .mx1 .bin .rom mlg3 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk mlg3 cartridge3 (cart3) .mx1 .bin .rom mlg3 printout (prin) .prn mlg3 cassette (cass) .wav .flac .tap .cas .tsx mlg30 cartridge1 (cart1) .mx1 .bin .rom mlg30 cartridge2 (cart2) .mx1 .bin .rom mlg30 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk mlg30 cartridge3 (cart3) .mx1 .bin .rom mlg30 cartridge4 (cart4) .mx1 .bin .rom mlg30 printout (prin) .prn mlg30 cassette (cass) .wav .flac .tap .cas .tsx mlg30_2 cartridge1 (cart1) .mx1 .bin .rom mlg30_2 cartridge2 (cart2) .mx1 .bin .rom mlg30_2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk mlg30_2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk mlg30_2 cartridge3 (cart3) .mx1 .bin .rom mlg30_2 printout (prin) .prn mlg30_2 cassette (cass) .wav .flac .tap .cas .tsx mm1 cartridge (cart) .bin mm1a cartridge (cart) .bin mm1m4 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mm1m4 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mm1m4g floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mm1m4g floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mm1m6 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mm1m6 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mm1m6g floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mm1m6g floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mm1m7 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mm1m7 harddisk (hard) .chd .hd .hdv .2mg .hdi mm1m7g floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mm1m7g harddisk (hard) .chd .hd .hdv .2mg .hdi mm2 cartridge (cart) .bin mm2a cartridge (cart) .bin mm2b cartridge (cart) .bin mm2c cartridge (cart) .bin mm2d cartridge (cart) .bin mm2e cartridge (cart) .bin mm2f cartridge (cart) .bin mm2m35d floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mm2m35d harddisk (hard) .chd .hd .hdv .2mg .hdi mm4 cartridge (cart) .bin mm4a cartridge (cart) .bin mm4b cartridge (cart) .bin mm4tk cartridge (cart) .bin mm5 cartridge (cart) .bin mm5a cartridge (cart) .bin mmaruchan harddisk (hard) .chd .hd .hdv .2mg .hdi mmaruchana harddisk (hard) .chd .hd .hdv .2mg .hdi mmbo4088 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mmbo4088 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mmbo4088 harddisk (hard) .chd .hd .hdv .2mg .hdi mmd1 cassette (cass) .wav .flac mmd2 cassette (cass) .wav .flac mmf9000 floppydisk1 (flop1) .mfi .dfi .d80 mmf9000 floppydisk2 (flop2) .mfi .dfi .d80 mmf9000 cassette (cass) .wav .flac .tap mmf9000 quickload (quik) .p00 .prg mmf9000 cartridge1 (cart1) .bin .rom mmf9000 cartridge2 (cart2) .bin .rom mmf9000_se floppydisk1 (flop1) .mfi .dfi .d80 mmf9000_se floppydisk2 (flop2) .mfi .dfi .d80 mmf9000_se cassette (cass) .wav .flac .tap mmf9000_se quickload (quik) .p00 .prg mmf9000_se cartridge1 (cart1) .bin .rom mmf9000_se cartridge2 (cart2) .bin .rom mmr4000be harddisk (hard) .chd .hd .hdv .2mg .hdi mmr4000be cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mmr4000be floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf mmr4000be printout (prin) .prn mmr4000le harddisk (hard) .chd .hd .hdv .2mg .hdi mmr4000le cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mmr4000le floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf mmr4000le printout (prin) .prn mmt8 cassette (cass) .wav .flac mo5 cassette (cass) .wav .k5 .k7 mo5 cartridge (cart) .m5 .rom mo5e cassette (cass) .wav .k5 .k7 mo5e cartridge (cart) .m5 .rom mo5nr cassette (cass) .wav .k5 .k7 mo5nr cartridge (cart) .m5 .rom mo6 cassette (cass) .wav .k5 .k7 mo6 cartridge (cart) .m5 .rom mo6 printout (prin) .prn mobigo cartridge (cart) .bin mobigo2 cartridge (cart) .bin mobigos cartridge (cart) .bin mocapb harddisk (hard) .chd .hd .hdv .2mg .hdi mocapbj harddisk (hard) .chd .hd .hdv .2mg .hdi mocapglf harddisk (hard) .chd .hd .hdv .2mg .hdi moeru cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mogitate cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mojmikro floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mojmikro floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mojmikro quickload (quik) .com .cpm mok cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mokp386 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mokp386 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mokp386 harddisk (hard) .chd .hd .hdv .2mg .hdi mokp386 printout (prin) .prn mokp386sx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mokp386sx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mokp386sx harddisk (hard) .chd .hd .hdv .2mg .hdi mom3v3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mom3v3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mom3v3 harddisk (hard) .chd .hd .hdv .2mg .hdi mom3v3 printout (prin) .prn monkeyba cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr monkmonk cartridge (cart) .vsm .bin monkyjmp cartridge1 (cart1) .bin monkyjmp cartridge2 (cart2) .bin mononcol cartridge (cart) .bin mononuxt floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mononuxt floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mononuxt printout (prin) .prn mononuxt harddisk (hard) .chd .hd .hdv .2mg .hdi mononuxt2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mononuxt2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mononuxt2 printout (prin) .prn mononuxt2 harddisk (hard) .chd .hd .hdv .2mg .hdi mp68a cassette (cass) .wav .flac mpc10 cartridge (cart) .mx1 .bin .rom mpc10 printout (prin) .prn mpc10 cassette (cass) .wav .flac .tap .cas .tsx mpc100 cartridge1 (cart1) .mx1 .bin .rom mpc100 cartridge2 (cart2) .mx1 .bin .rom mpc100 printout (prin) .prn mpc100 cassette (cass) .wav .flac .tap .cas .tsx mpc1600 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mpc1600 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mpc1600 printout (prin) .prn mpc200 cartridge1 (cart1) .mx1 .bin .rom mpc200 cartridge2 (cart2) .mx1 .bin .rom mpc200 printout (prin) .prn mpc200 cassette (cass) .wav .flac .tap .cas .tsx mpc2000xl floppydisk (flop) .mfi .dfi .mfm .td0 .imd .dsk .ima .img .ufi .360 .ipf .hfe mpc2000xl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mpc2000xl midiin1 (min1) .mid .syx mpc2000xl midiin2 (min2) .mid .syx mpc2000xl midiout1 (mout1) .mid mpc2000xl midiout2 (mout2) .mid mpc200sp cartridge1 (cart1) .mx1 .bin .rom mpc200sp cartridge2 (cart2) .mx1 .bin .rom mpc200sp printout (prin) .prn mpc200sp cassette (cass) .wav .flac .tap .cas .tsx mpc2300 cartridge1 (cart1) .mx1 .bin .rom mpc2300 cartridge2 (cart2) .mx1 .bin .rom mpc2300 printout (prin) .prn mpc2300 cassette (cass) .wav .flac .tap .cas .tsx mpc2500f cartridge (cart) .mx1 .bin .rom mpc2500f floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk mpc2500f printout (prin) .prn mpc2500f cassette (cass) .wav .flac .tap .cas .tsx mpc25fd cartridge (cart) .mx1 .bin .rom mpc25fd floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk mpc25fd printout (prin) .prn mpc25fd cassette (cass) .wav .flac .tap .cas .tsx mpc25fs cartridge (cart) .mx1 .bin .rom mpc25fs floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk mpc25fs printout (prin) .prn mpc25fs cassette (cass) .wav .flac .tap .cas .tsx mpc27 cartridge1 (cart1) .mx1 .bin .rom mpc27 cartridge2 (cart2) .mx1 .bin .rom mpc27 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk mpc27 printout (prin) .prn mpc27 cassette (cass) .wav .flac .tap .cas .tsx mpc3000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .dsk .ima .img .ufi .360 .ipf .hfe mpc3000 midiin (min) .mid .syx mpc3000 midiout (mout) .mid mpc60 midiin1 (min1) .mid .syx mpc60 midiin2 (min2) .mid .syx mpc60 midiout1 (mout1) .mid mpc60 midiout2 (mout2) .mid mpc60 midiout3 (mout3) .mid mpc60 midiout4 (mout4) .mid mpc60 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .dsk .ima .img .ufi .360 .ipf .hfe mpc64 cartridge1 (cart1) .mx1 .bin .rom mpc64 cartridge2 (cart2) .mx1 .bin .rom mpc64 printout (prin) .prn mpc64 cassette (cass) .wav .flac .tap .cas .tsx mpc800 romimage1 (rom1) .rom .bin mpc800 cassette (cass) .wav .flac .csw .uef mpc800 printout (prin) .prn mpc800 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd mpc800 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd mpc900 romimage1 (rom1) .rom .bin mpc900 cassette (cass) .wav .flac .csw .uef mpc900 printout (prin) .prn mpc900 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd mpc900 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd mpc900gx romimage1 (rom1) .rom .bin mpc900gx cassette (cass) .wav .flac .csw .uef mpc900gx printout (prin) .prn mpc900gx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd mpc900gx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd mpf1 cassette (cass) .wav .flac mpf1 romimage (rom) .bin .rom mpf1_88 cassette (cass) .wav .flac mpf1_88 printout (prin) .prn mpf1_88 romimage1 (rom1) .bin .rom mpf1_88 romimage2 (rom2) .bin .rom mpf1b cassette (cass) .wav .flac mpf1b romimage (rom) .bin .rom mpf1p cassette (cass) .wav .flac mpf1p romimage (rom) .bin .rom mpf2 cassette (cass) .wav .flac mprof3 floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib mprof3 floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib mprof3 cassette (cass) .wav .flac mpt02 cartridge (cart) .st2 .bin .rom mpt02h cartridge (cart) .st2 .bin .rom mpt05 quickload (quik) .pgm .tvc mpt05 cartridge (cart) .bin .rom mpu1000 quickload (quik) .pgm .tvc mpu1000 cartridge (cart) .bin .rom mpu2000 quickload (quik) .pgm .tvc mpu2000 cartridge (cart) .bin .rom mpu9088vf floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mpu9088vf floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mpu9088vf printout (prin) .prn mpx16 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mpx16 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mpx16 printout (prin) .prn mpz80 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mratlus cartridge (cart) .bin mrdrilr2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mrdrilr2j cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mrdrilr2u cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mrdrilrg cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mrtlbeat cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mrtlbeat memcard1 (memc1) .mc mrtlbeat memcard2 (memc2) .mc mrtlbeata cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mrtlbeata memcard1 (memc1) .mc mrtlbeata memcard2 (memc2) .mc ms0515 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img ms0515 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img ms1600 cassette (cass) .wav .flac .cas ms1600 printout (prin) .prn ms1600 cartridge (cart) .ccc .rom ms1600 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 ms1600 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 ms1600 harddisk1 (hard1) .vhd ms1600 harddisk2 (hard2) .vhd ms4125 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ms4125 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ms4125 harddisk (hard) .chd .hd .hdv .2mg .hdi ms4125 printout (prin) .prn ms4132 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ms4132 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ms4132 harddisk (hard) .chd .hd .hdv .2mg .hdi ms4132 printout (prin) .prn ms4134 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ms4134 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ms4134 harddisk (hard) .chd .hd .hdv .2mg .hdi ms4134 printout (prin) .prn ms4138 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ms4138 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ms4138 harddisk (hard) .chd .hd .hdv .2mg .hdi ms4138 printout (prin) .prn ms4144 harddisk (hard) .chd .hd .hdv .2mg .hdi ms4144 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ms4144 printout (prin) .prn ms4145 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ms4145 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ms4145 harddisk (hard) .chd .hd .hdv .2mg .hdi ms4145 printout (prin) .prn ms68k harddisk (hard) .chd .hd .hdv .2mg .hdi ms68k floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ms68k floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ms68k printout (prin) .prn msm3 cassette (cass) .wav .flac .cas msm3 printout (prin) .prn msm3 harddisk1 (hard1) .vhd msm3 harddisk2 (hard2) .vhd msm3 cartridge (cart) .ccc .rom msm3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 msm3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 mt65 cassette (cass) .wav .flac mt65 romimage1 (rom1) .bin .rom mt65 romimage2 (rom2) .bin .rom mt65 romimage3 (rom3) .bin .rom mt65 romimage4 (rom4) .bin .rom mt65 romimage5 (rom5) .bin .rom mt65 snapshot (dump) .dmp .m65 mt65 quickload (quik) .hex mt6809 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ssd .bbc .img mt6809 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ssd .bbc .img mt80z cassette (cass) .wav .flac mt80z romimage (rom) .bin .rom mtc9016 cartridge (cart) .st2 .bin .rom mtchxl5k cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mtchxl5ko cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mtchxl5ko2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mtchxl6k cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mtchxl6ko cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mtchxl6ko4 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mtchxlgld cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mtchxlgldo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mtchxlti harddisk (hard) .chd .hd .hdv .2mg .hdi mtouchxl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr mtu130 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mtu130 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mtu130 romimage1 (rom1) .rom .bin mtu130 romimage2 (rom2) .rom .bin mtu130 romimage3 (rom3) .rom .bin mtu130 romimage4 (rom4) .rom .bin mtx500 printout (prin) .prn mtx500 snapshot (dump) .mtx mtx500 quickload (quik) .run mtx500 cassette (cass) .wav .flac mtx500 romimage (rom) .bin .rom mtx500 cartridge1 (cart1) .bin .rom mtx500 cartridge2 (cart2) .bin .rom mtx512 printout (prin) .prn mtx512 snapshot (dump) .mtx mtx512 quickload (quik) .run mtx512 cassette (cass) .wav .flac mtx512 romimage (rom) .bin .rom mtx512 cartridge1 (cart1) .bin .rom mtx512 cartridge2 (cart2) .bin .rom multi16 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk multi8 cassette (cass) .wav .flac multmega cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr musclhit harddisk (hard) .chd .hd .hdv .2mg .hdi mwskins harddisk1 (hard1) .chd .hd .hdv .2mg .hdi mwskins cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr mwskins harddisk2 (hard2) .chd .hd .hdv .2mg .hdi mwskins cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr mwskinsa harddisk1 (hard1) .chd .hd .hdv .2mg .hdi mwskinsa cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr mwskinsa harddisk2 (hard2) .chd .hd .hdv .2mg .hdi mwskinsa cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr mwskinso harddisk1 (hard1) .chd .hd .hdv .2mg .hdi mwskinso cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr mwskinso harddisk2 (hard2) .chd .hd .hdv .2mg .hdi mwskinso cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr mwskinst harddisk1 (hard1) .chd .hd .hdv .2mg .hdi mwskinst cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr mwskinst harddisk2 (hard2) .chd .hd .hdv .2mg .hdi mwskinst cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr mx10 cartridge (cart) .mx1 .bin .rom mx101 cartridge (cart) .mx1 .bin .rom mx15 cartridge (cart) .mx1 .bin .rom mx15 cassette (cass) .wav .flac .tap .cas .tsx mx1600 cassette (cass) .wav .flac .cas mx1600 printout (prin) .prn mx1600 cartridge (cart) .ccc .rom mx1600 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 mx1600 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 mx1600 harddisk1 (hard1) .vhd mx1600 harddisk2 (hard2) .vhd mx64 cartridge1 (cart1) .mx1 .bin .rom mx64 cartridge2 (cart2) .mx1 .bin .rom mx64 printout (prin) .prn mx64 cassette (cass) .wav .flac .tap .cas .tsx mx83c305 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mx83c305 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf mx83c305 harddisk (hard) .chd .hd .hdv .2mg .hdi mx83c305 printout (prin) .prn myb3k floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf myb3k floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf myb3k floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf myb3k floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf myb3k printout (prin) .prn mycom cassette (cass) .wav .flac mycom floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mycom floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk myvision cartridge (cart) .bin mz1 cartridge (cart) .bin mz1 midiin (min) .mid .syx mz1 midiout1 (mout1) .mid mz1 midiout2 (mout2) .mid mz1500 cassette (cass) .wav .flac .m12 .mzf .mzt mz1500 printout (prin) .prn mz2000 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d mz2000 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d mz2000 cassette (cass) .wav .flac .m12 .mzf .mzt mz2000 snapshot (dump) .bin .dat mz2200 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d mz2200 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d mz2200 cassette (cass) .wav .flac .m12 .mzf .mzt mz2200 snapshot (dump) .bin .dat mz2500 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mz2500 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mz2520 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mz2520 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mz3500 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mz3500 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mz3500 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mz3500 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mz5500 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mz5500 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mz6500 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mz6500 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mz6550 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mz6550 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk mz700 cassette (cass) .wav .flac .m12 .mzf .mzt mz700j cassette (cass) .wav .flac .m12 .mzf .mzt mz800 cassette (cass) .wav .flac .m12 .mzf .mzt mz800 printout (prin) .prn mz80a cassette (cass) .wav .flac .m12 .mzf .mzt mz80b floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d mz80b floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d mz80b cassette (cass) .wav .flac .m12 .mzf .mzt mz80b snapshot (dump) .bin .dat mz80k cassette (cass) .wav .flac .m12 .mzf .mzt mz80kj cassette (cass) .wav .flac .m12 .mzf .mzt n64 cartridge (cart) .v64 .z64 .rom .n64 .bin n64_lodgenet cartridge (cart) .v64 .z64 .rom .n64 .bin n64dd cartridge (cart) .v64 .z64 .rom .n64 .bin n64dd harddisk (hard) .chd .hd .hdv .2mg .hdi n64pal cartridge (cart) .v64 .z64 .rom .n64 .bin n8810m15 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf n8810m15 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf n8810m15 harddisk (hard) .chd .hd .hdv .2mg .hdi n8810m16c floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf n8810m16c floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf n8810m16c harddisk (hard) .chd .hd .hdv .2mg .hdi n8810m16v floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf n8810m16v floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf n8810m16v harddisk (hard) .chd .hd .hdv .2mg .hdi n8810m20 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf n8810m20 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf n8810m20 harddisk (hard) .chd .hd .hdv .2mg .hdi n8810m20 printout (prin) .prn n8810m30 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf n8810m30 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf n8810m30 harddisk (hard) .chd .hd .hdv .2mg .hdi n8810m55 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf n8810m55 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf n8810m55 harddisk (hard) .chd .hd .hdv .2mg .hdi nagano98 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr naganoj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr nano quickload (quik) .bin nano cassette (cass) .wav .flac nanos floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img nascom1 cassette (cass) .wav .flac nascom1 snapshot1 (dump1) .nas nascom1 snapshot2 (dump2) .chr nascom2 cassette (cass) .wav .flac nascom2 snapshot1 (dump1) .nas nascom2 snapshot2 (dump2) .chr nascom2 romimage1 (rom1) .bin .rom nascom2 romimage2 (rom2) .bin .rom nascom2c cassette (cass) .wav .flac nascom2c snapshot1 (dump1) .nas nascom2c snapshot2 (dump2) .chr nascom2c romimage1 (rom1) .bin .rom nascom2c romimage2 (rom2) .bin .rom nascom2c floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk nascom2c floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk nat48pv floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf nat48pv floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf nat48pv harddisk (hard) .chd .hd .hdv .2mg .hdi nat48pv printout (prin) .prn nbagold harddisk1 (hard1) .chd .hd .hdv .2mg .hdi nbagold cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr nbagold harddisk2 (hard2) .chd .hd .hdv .2mg .hdi nbagold cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr nbanfl harddisk1 (hard1) .chd .hd .hdv .2mg .hdi nbanfl cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr nbanfl harddisk2 (hard2) .chd .hd .hdv .2mg .hdi nbanfl cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr nbashowt harddisk1 (hard1) .chd .hd .hdv .2mg .hdi nbashowt cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr nbashowt harddisk2 (hard2) .chd .hd .hdv .2mg .hdi nbashowt cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr nc200 printout (prin) .prn nc200 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf ncr3302 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ncr3302 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ncr3302 harddisk (hard) .chd .hd .hdv .2mg .hdi ncr3433 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ncr3433 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ncr3433 harddisk (hard) .chd .hd .hdv .2mg .hdi ncr3433 printout (prin) .prn ncrpc4i floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ncrpc4i floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ncrpc4i printout (prin) .prn ncrpc6 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ncrpc6 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ncrpc6 printout (prin) .prn ncrpc8 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ncrpc8 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ncrpc8 harddisk (hard) .chd .hd .hdv .2mg .hdi ndcfboxa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr neat floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf neat floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf neat harddisk (hard) .chd .hd .hdv .2mg .hdi necapciv floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf necapciv floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf necapciv harddisk (hard) .chd .hd .hdv .2mg .hdi neiva floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi neiva floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi neiva floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi neiva floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi neiva cassette (cass) .wav .flac neocd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr neocdz cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr neocdzj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr neogeo memcard (memc) .neo neogeo cartridge1 (cart1) .bin neogeo cartridge2 (cart2) .bin neogeo cartridge3 (cart3) .bin neogeo cartridge4 (cart4) .bin neogeo cartridge5 (cart5) .bin neogeo cartridge6 (cart6) .bin nes cartridge (cart) .nes .unf .unif nespal cartridge (cart) .nes .unf .unif newbrain floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk newbrain floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk newbrain cassette1 (cass1) .wav .flac newbrain cassette2 (cass2) .wav .flac newbraina floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk newbraina floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk newbraina cassette1 (cass1) .wav .flac newbraina cassette2 (cass2) .wav .flac newbrainmd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk newbrainmd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk newbrainmd cassette1 (cass1) .wav .flac newbrainmd cassette2 (cass2) .wav .flac next harddisk (hard) .chd .hd .hdv .2mg .hdi next cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr nextc harddisk (hard) .chd .hd .hdv .2mg .hdi nextc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr nextct harddisk (hard) .chd .hd .hdv .2mg .hdi nextct cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr nextct floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nextctc harddisk (hard) .chd .hd .hdv .2mg .hdi nextctc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr nextctc floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nexts harddisk (hard) .chd .hd .hdv .2mg .hdi nexts cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr nexts floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nexts2 harddisk (hard) .chd .hd .hdv .2mg .hdi nexts2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr nexts2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nextsc harddisk (hard) .chd .hd .hdv .2mg .hdi nextsc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr nextsc floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nextst harddisk (hard) .chd .hd .hdv .2mg .hdi nextst cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr nextst floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nextstc harddisk (hard) .chd .hd .hdv .2mg .hdi nextstc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr nextstc floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nf500a cassette (cass) .wav .flac nflclsfb cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr nforcepc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nforcepc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nforcepc printout (prin) .prn nforcepc harddisk (hard) .chd .hd .hdv .2mg .hdi nforcepc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ng_mv1 memcard (memc) .neo ng_mv1 cartridge (cart) .bin ng_mv1f cartridge (cart) .bin ng_mv1fz cartridge (cart) .bin ng_mv2f memcard (memc) .neo ng_mv2f cartridge1 (cart1) .bin ng_mv2f cartridge2 (cart2) .bin ng_mv4f memcard (memc) .neo ng_mv4f cartridge1 (cart1) .bin ng_mv4f cartridge2 (cart2) .bin ng_mv4f cartridge3 (cart3) .bin ng_mv4f cartridge4 (cart4) .bin ngdup23a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ngdup23c cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ngdup23e cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ngen floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ngen harddisk (hard) .chd .hd .hdv .2mg .hdi ngen386 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ngen386 harddisk (hard) .chd .hd .hdv .2mg .hdi ngenb38 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ngenb38 harddisk (hard) .chd .hd .hdv .2mg .hdi ngp cartridge (cart) .bin .ngp .npc .ngc ngpc cartridge (cart) .bin .ngp .npc .ngc nicetsuk cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr nichidvd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr nichisel cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr nightrai harddisk (hard) .chd .hd .hdv .2mg .hdi nimbus floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf nimbus floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf nimbus harddisk1 (hard1) .chd .hd .hdv .2mg .hdi nimbus harddisk2 (hard2) .chd .hd .hdv .2mg .hdi nimbus harddisk3 (hard3) .chd .hd .hdv .2mg .hdi nimbus harddisk4 (hard4) .chd .hd .hdv .2mg .hdi nimbus printout (prin) .prn nixpc01 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf nixpc01 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf nixpc01 printout (prin) .prn nms801 cassette (cass) .wav .flac .tap .cas .tsx nms8220 cartridge1 (cart1) .mx1 .bin .rom nms8220 cartridge2 (cart2) .mx1 .bin .rom nms8220 printout (prin) .prn nms8220 cassette (cass) .wav .flac .tap .cas .tsx nms8245 cartridge1 (cart1) .mx1 .bin .rom nms8245 cartridge2 (cart2) .mx1 .bin .rom nms8245 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk nms8245 printout (prin) .prn nms8245 cassette (cass) .wav .flac .tap .cas .tsx nms8245f cartridge1 (cart1) .mx1 .bin .rom nms8245f cartridge2 (cart2) .mx1 .bin .rom nms8245f floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk nms8245f printout (prin) .prn nms8245f cassette (cass) .wav .flac .tap .cas .tsx nms8250 cartridge1 (cart1) .mx1 .bin .rom nms8250 cartridge2 (cart2) .mx1 .bin .rom nms8250 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk nms8250 printout (prin) .prn nms8250 cassette (cass) .wav .flac .tap .cas .tsx nms8250_16 cartridge1 (cart1) .mx1 .bin .rom nms8250_16 cartridge2 (cart2) .mx1 .bin .rom nms8250_16 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk nms8250_16 printout (prin) .prn nms8250_16 cassette (cass) .wav .flac .tap .cas .tsx nms8250_19 cartridge1 (cart1) .mx1 .bin .rom nms8250_19 cartridge2 (cart2) .mx1 .bin .rom nms8250_19 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk nms8250_19 printout (prin) .prn nms8250_19 cassette (cass) .wav .flac .tap .cas .tsx nms8255 cartridge1 (cart1) .mx1 .bin .rom nms8255 cartridge2 (cart2) .mx1 .bin .rom nms8255 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk nms8255 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk nms8255 printout (prin) .prn nms8255 cassette (cass) .wav .flac .tap .cas .tsx nms8255f cartridge1 (cart1) .mx1 .bin .rom nms8255f cartridge2 (cart2) .mx1 .bin .rom nms8255f floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk nms8255f floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk nms8255f printout (prin) .prn nms8255f cassette (cass) .wav .flac .tap .cas .tsx nms8260 cartridge (cart) .mx1 .bin .rom nms8260 printout (prin) .prn nms8260 cassette (cass) .wav .flac .tap .cas .tsx nms8280 cartridge1 (cart1) .mx1 .bin .rom nms8280 cartridge2 (cart2) .mx1 .bin .rom nms8280 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk nms8280 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk nms8280 printout (prin) .prn nms8280 cassette (cass) .wav .flac .tap .cas .tsx nms8280f cartridge1 (cart1) .mx1 .bin .rom nms8280f cartridge2 (cart2) .mx1 .bin .rom nms8280f floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk nms8280f floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk nms8280f printout (prin) .prn nms8280f cassette (cass) .wav .flac .tap .cas .tsx nms8280g cartridge1 (cart1) .mx1 .bin .rom nms8280g cartridge2 (cart2) .mx1 .bin .rom nms8280g floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk nms8280g floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk nms8280g printout (prin) .prn nms8280g cassette (cass) .wav .flac .tap .cas .tsx nms9100 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf nms9100 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf nms9100 printout (prin) .prn notetakr floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk npc8300 printout (prin) .prn npc8300 cassette (cass) .wav .flac npc8300 cartridge1 (cart1) .bin .rom npc8300 cartridge2 (cart2) .bin .rom nshrz floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk nshrz floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk nshrz2mhz floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk nshrz2mhz floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk nuretemi cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr nws1250 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nws1250 harddisk (hard) .chd .hd .hdv .2mg .hdi nws1580 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nws1580 harddisk (hard) .chd .hd .hdv .2mg .hdi nws3260 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nws3260 harddisk (hard) .chd .hd .hdv .2mg .hdi nws3410 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nws3410 harddisk (hard) .chd .hd .hdv .2mg .hdi nws3720 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nws3720 harddisk (hard) .chd .hd .hdv .2mg .hdi nws3860 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nws3860 harddisk (hard) .chd .hd .hdv .2mg .hdi nws3860 tape (tap) .tap nws5000x floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nws5000x harddisk (hard) .chd .hd .hdv .2mg .hdi nws5000x cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr nws831 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf nws831 harddisk (hard) .chd .hd .hdv .2mg .hdi o286foxii floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf o286foxii floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf o286foxii harddisk (hard) .chd .hd .hdv .2mg .hdi oc2000 quickload (quik) .pgm .tvc oc2000 cartridge (cart) .bin .rom ocfoxm floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ocfoxm floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ocfoxm harddisk (hard) .chd .hd .hdv .2mg .hdi ochawk floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ochawk floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ochawk harddisk (hard) .chd .hd .hdv .2mg .hdi ochawk printout (prin) .prn ochipcom floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ochipcom floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ochipcom harddisk (hard) .chd .hd .hdv .2mg .hdi ochipcom printout (prin) .prn ochipdca2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ochipdca2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ochipdca2 harddisk (hard) .chd .hd .hdv .2mg .hdi ochipdca2 printout (prin) .prn ochipvlp floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ochipvlp floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ochipvlp harddisk (hard) .chd .hd .hdv .2mg .hdi ochipvlp printout (prin) .prn ocjagii floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ocjagii floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ocjagii harddisk (hard) .chd .hd .hdv .2mg .hdi ocjagii printout (prin) .prn ocjagv floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ocjagv floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ocjagv harddisk (hard) .chd .hd .hdv .2mg .hdi ocjagv printout (prin) .prn ocpanii floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ocpanii floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ocpanii harddisk (hard) .chd .hd .hdv .2mg .hdi octekg2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf octekg2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf octekg2 harddisk (hard) .chd .hd .hdv .2mg .hdi octopus floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk octopus floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk octopus printout (prin) .prn ocxt286 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ocxt286 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ocxt286 harddisk (hard) .chd .hd .hdv .2mg .hdi odeontw cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr odeontw2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr odyssey harddisk (hard) .chd .hd .hdv .2mg .hdi odyssey cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr odyssey printout (prin) .prn odyssey2 cartridge (cart) .bin .rom odyssey3 cartridge (cart) .bin .rom offrthnd harddisk (hard) .chd .hd .hdv .2mg .hdi offrthnd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr offrthnd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf offrthnd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf offrthnd printout (prin) .prn oligam harddisk (hard) .chd .hd .hdv .2mg .hdi oligam cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr olim203 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf olim203 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf olim203 harddisk (hard) .chd .hd .hdv .2mg .hdi olivm15 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf olivm15 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf olivm15 printout (prin) .prn olivpc1 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ollie cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr olybossb floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk olybossb floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk olybossc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk olybossc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk olybossd floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk olypeopl floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk olypeopl floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk olyport40 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf olyport40 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf olyport40 harddisk (hard) .chd .hd .hdv .2mg .hdi olystar20f floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf olystar20f harddisk1 (hard1) .chd .hd .hdv .2mg .hdi olystar20f harddisk2 (hard2) .chd .hd .hdv .2mg .hdi olytext floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk olytext floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk olytext30 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf olytext30 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi olytext30 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi omni2 quickload (quik) .com .cpm omni2 printout (prin) .prn omni2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay omni2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay omni4 quickload (quik) .com .cpm omni4 printout (prin) .prn omni4 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay omni4 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay omv1000 cartridge (cart) .bin .sg omv2000 cartridge (cart) .bin .sg ondrat cassette (cass) .wav .flac ondrav cassette (cass) .wav .flac onyx cartridge (cart) .rom .col .bin op386wb floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf op386wb floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf op386wb harddisk (hard) .chd .hd .hdv .2mg .hdi op386wb printout (prin) .prn op82c283 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf op82c283 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf op82c283 harddisk (hard) .chd .hd .hdv .2mg .hdi op82c291 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf op82c291 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf op82c291 harddisk (hard) .chd .hd .hdv .2mg .hdi op82c381 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf op82c381 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf op82c381 harddisk (hard) .chd .hd .hdv .2mg .hdi op82c381 printout (prin) .prn op82c391 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf op82c391 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf op82c391 harddisk (hard) .chd .hd .hdv .2mg .hdi op82c391 printout (prin) .prn op82c392 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf op82c392 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf op82c392 harddisk (hard) .chd .hd .hdv .2mg .hdi op82c392 printout (prin) .prn opti495slc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf opti495slc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf opti495slc harddisk (hard) .chd .hd .hdv .2mg .hdi opti495slc printout (prin) .prn opti495xlc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf opti495xlc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf opti495xlc harddisk (hard) .chd .hd .hdv .2mg .hdi opti495xlc printout (prin) .prn orao cassette (cass) .wav .flac .tap orao103 cassette (cass) .wav .flac .tap orbatak cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr orbituvi cartridge (cart) .bin ordisava cartridge (cart) .bin oric1 printout (prin) .prn oric1 cassette (cass) .wav .flac .tap orica printout (prin) .prn orica cassette (cass) .wav .flac .tap orinasp cartridge (cart) .bin orion128 cassette (cass) .wav .flac .rko orion128 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orion128 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orion128 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orion128 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orion128 cartridge (cart) .bin orionide cassette (cass) .wav .flac .rko orionide floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionide floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionide floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionide floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionide cartridge (cart) .bin orionidm cassette (cass) .wav .flac .rko orionidm floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionidm floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionidm floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionidm floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionidm cartridge (cart) .bin orionms cassette (cass) .wav .flac .rko orionms floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionms floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionms floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionms floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionms cartridge (cart) .bin orionpro cassette (cass) .wav .flac .rko orionpro floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionpro floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionpro floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionpro floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionpro cartridge (cart) .bin orionz80 cassette (cass) .wav .flac .rko orionz80 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionz80 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionz80 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionz80 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionz80 cartridge (cart) .bin orionzms cassette (cass) .wav .flac .rko orionzms floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionzms floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionzms floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionzms floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img orionzms cartridge (cart) .bin orizon snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx orizon quickload (quik) .raw .scr orizon cassette (cass) .wav .flac .tzx .tap .blk ormatu cartridge (cart) .bin osbexec floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk osbexec floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk osborne1 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk osborne1 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk osborne1nv floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk osborne1nv floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk osborne1sp floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk osborne1sp floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk osc1000b quickload (quik) .bin osc1000b cassette (cass) .wav .flac otenamhf harddisk (hard) .chd .hd .hdv .2mg .hdi otenamih harddisk (hard) .chd .hd .hdv .2mg .hdi otenki harddisk (hard) .chd .hd .hdv .2mg .hdi outr2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr outr2st cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr outr2stj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr outr2stjo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr outr2sto cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr oz750 quickload (quik) .wzd p2000m cassette (cass) .wav .flac .cas p2000t cassette (cass) .wav .flac .cas p386dx40 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf p386dx40 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf p386dx40 harddisk (hard) .chd .hd .hdv .2mg .hdi p386dx40 printout (prin) .prn p386sx25pw floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf p386sx25pw floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf p386sx25pw harddisk (hard) .chd .hd .hdv .2mg .hdi p500 floppydisk1 (flop1) .mfi .dfi .d80 p500 floppydisk2 (flop2) .mfi .dfi .d80 p500 cartridge (cart) .20 .40 .60 p500 quickload (quik) .p00 .prg p500p floppydisk1 (flop1) .mfi .dfi .d80 p500p floppydisk2 (flop2) .mfi .dfi .d80 p500p cartridge (cart) .20 .40 .60 p500p quickload (quik) .p00 .prg p5txla harddisk (hard) .chd .hd .hdv .2mg .hdi p5txla cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr p8000 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk p8000 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk p911 harddisk (hard) .chd .hd .hdv .2mg .hdi p9112 harddisk (hard) .chd .hd .hdv .2mg .hdi p911ac harddisk (hard) .chd .hd .hdv .2mg .hdi p911ed harddisk (hard) .chd .hd .hdv .2mg .hdi p911j harddisk (hard) .chd .hd .hdv .2mg .hdi p911k harddisk (hard) .chd .hd .hdv .2mg .hdi p911kc harddisk (hard) .chd .hd .hdv .2mg .hdi p911ud harddisk (hard) .chd .hd .hdv .2mg .hdi pacmball cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr panikuru cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr partner cassette (cass) .wav .flac .rkp partner floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img partner floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img partner1fg floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img partnerw floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img partnerw harddisk (hard) .chd .hd .hdv .2mg .hdi partnerwfg floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img partnerwfg harddisk (hard) .chd .hd .hdv .2mg .hdi pasogo cartridge (cart) .bin pasopia cassette (cass) .wav .flac pasopia7 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pasopia7 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pasopia7 cassette (cass) .wav .flac pasopia7lcd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pasopia7lcd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pasopia7lcd cassette (cass) .wav .flac patinho cartridge (cart) .bin pb2000c cartridge1 (cart1) .bin pb2000c cartridge2 (cart2) .bin pbo floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pbo harddisk (hard) .chd .hd .hdv .2mg .hdi pc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc harddisk1 (hard1) .chd .hd .hdv .2mg .hdi pc harddisk2 (hard2) .chd .hd .hdv .2mg .hdi pc100 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pc100 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pc1000 cartridge (cart) .bin pc10iii printout1 (prin1) .prn pc10iii printout2 (prin2) .prn pc10iii floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc10iii floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc1512 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pc1512 printout (prin) .prn pc1512dd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pc1512dd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pc1512dd printout (prin) .prn pc1512hd10 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pc1512hd10 printout (prin) .prn pc1512hd10 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi pc1512hd10 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi pc1512hd20 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pc1512hd20 printout (prin) .prn pc1512hd20 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi pc1512hd20 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi pc1640 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pc1640 printout (prin) .prn pc1640dd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pc1640dd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pc1640dd printout (prin) .prn pc1640hd20 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pc1640hd20 printout (prin) .prn pc1640hd20 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi pc1640hd20 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi pc1640hd30 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pc1640hd30 printout (prin) .prn pc1640hd30 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi pc1640hd30 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi pc20 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc20 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc20 printout1 (prin1) .prn pc20 printout2 (prin2) .prn pc20 printout3 (prin3) .prn pc200 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc200 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc200 printout1 (prin1) .prn pc200 printout2 (prin2) .prn pc200 printout3 (prin3) .prn pc2000 cartridge (cart) .bin pc2000s cartridge (cart) .bin pc2086 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc2086 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc2086 printout1 (prin1) .prn pc2086 printout2 (prin2) .prn pc2086 printout3 (prin3) .prn pc2386 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc2386 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc2386 harddisk (hard) .chd .hd .hdv .2mg .hdi pc2386 printout (prin) .prn pc286u floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc286u floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc286vs floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc286vs floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc3086 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc3086 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc3086 printout1 (prin1) .prn pc3086 printout2 (prin2) .prn pc3086 printout3 (prin3) .prn pc30iii floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc30iii floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc30iii harddisk (hard) .chd .hd .hdv .2mg .hdi pc386m floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc386m floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc386m harddisk (hard) .chd .hd .hdv .2mg .hdi pc386m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc40iii floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc40iii floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc40iii harddisk (hard) .chd .hd .hdv .2mg .hdi pc45iii floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc45iii floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc45iii harddisk (hard) .chd .hd .hdv .2mg .hdi pc486mu floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc486mu floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc486mu harddisk (hard) .chd .hd .hdv .2mg .hdi pc486mu cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc486se floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc486se floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc486se harddisk (hard) .chd .hd .hdv .2mg .hdi pc486se cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc5086 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc5086 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc5086 printout1 (prin1) .prn pc5086 printout2 (prin2) .prn pc5086 printout3 (prin3) .prn pc50ii floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc50ii floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc50ii harddisk (hard) .chd .hd .hdv .2mg .hdi pc532 harddisk (hard) .chd .hd .hdv .2mg .hdi pc6001 cartridge1 (cart1) .bin pc6001 cartridge2 (cart2) .cas .p6 pc6001a cartridge1 (cart1) .bin pc6001a cartridge2 (cart2) .cas .p6 pc6001mk2 cartridge1 (cart1) .bin pc6001mk2 cartridge2 (cart2) .cas .p6 pc6001mk2sr cartridge1 (cart1) .bin pc6001mk2sr cartridge2 (cart2) .cas .p6 pc6001mk2sr floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pc6001mk2sr floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc6001mk2sr floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc60iii floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc60iii floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc60iii harddisk (hard) .chd .hd .hdv .2mg .hdi pc60iii printout (prin) .prn pc6601 cartridge1 (cart1) .bin pc6601 cartridge2 (cart2) .cas .p6 pc6601 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pc6601 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc6601 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc6601sr cartridge1 (cart1) .bin pc6601sr cartridge2 (cart2) .cas .p6 pc6601sr floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pc6601sr floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc6601sr floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc7000 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc7000 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc7000 printout (prin) .prn pc70iii floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc70iii floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc70iii harddisk (hard) .chd .hd .hdv .2mg .hdi pc70iii printout (prin) .prn pc8001 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8001 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8001 printout (prin) .prn pc8001 cassette (cass) .wav .flac pc8001 snapshot (dump) .bin .n80 pc8001mk2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8001mk2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8001mk2 printout (prin) .prn pc8001mk2 cassette (cass) .wav .flac pc8001mk2 snapshot (dump) .bin .n80 pc8001mk2sr floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8001mk2sr floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8001mk2sr printout (prin) .prn pc8001mk2sr cassette (cass) .wav .flac pc8001mk2sr snapshot (dump) .bin .n80 pc8201 printout (prin) .prn pc8201 cassette (cass) .wav .flac pc8201 cartridge1 (cart1) .bin .rom pc8201 cartridge2 (cart2) .bin .rom pc8201a printout (prin) .prn pc8201a cassette (cass) .wav .flac pc8201a cartridge1 (cart1) .bin .rom pc8201a cartridge2 (cart2) .bin .rom pc8300 cassette (cass) .wav .flac .p .81 .tzx pc8401bd cartridge1 (cart1) .bin .rom pc8401bd cartridge2 (cart2) .bin .rom pc8500 cartridge1 (cart1) .bin .rom pc8500 cartridge2 (cart2) .bin .rom pc8801 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801 printout (prin) .prn pc8801 cassette (cass) .wav .flac pc8801fa floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801fa floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801fa printout (prin) .prn pc8801fa cassette (cass) .wav .flac pc8801ma floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801ma floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801ma printout (prin) .prn pc8801ma cassette (cass) .wav .flac pc8801ma2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801ma2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801ma2 printout (prin) .prn pc8801ma2 cassette (cass) .wav .flac pc8801mc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801mc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801mc printout (prin) .prn pc8801mc cassette (cass) .wav .flac pc8801mc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc8801mh floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801mh floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801mh printout (prin) .prn pc8801mh cassette (cass) .wav .flac pc8801mk2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801mk2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801mk2 printout (prin) .prn pc8801mk2 cassette (cass) .wav .flac pc8801mk2fr floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801mk2fr floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801mk2fr printout (prin) .prn pc8801mk2fr cassette (cass) .wav .flac pc8801mk2mr floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801mk2mr floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801mk2mr printout (prin) .prn pc8801mk2mr cassette (cass) .wav .flac pc8801mk2sr floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801mk2sr floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc8801mk2sr printout (prin) .prn pc8801mk2sr cassette (cass) .wav .flac pc88va floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc88va floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc88va2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc88va2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc9486 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc9486 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pc9486 harddisk (hard) .chd .hd .hdv .2mg .hdi pc9486 printout (prin) .prn pc9801 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc9801 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc9801bx2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801bx2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801bx2 harddisk (hard) .chd .hd .hdv .2mg .hdi pc9801bx2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9801dx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801dx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801f floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801f floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801f floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801f floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801f floppydisk5 (flop5) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc9801f floppydisk6 (flop6) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc9801fs floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801fs floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801fs harddisk (hard) .chd .hd .hdv .2mg .hdi pc9801fs cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9801m2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801m2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801m2 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc9801m2 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .fdi pc9801rs floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801rs floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801rs harddisk (hard) .chd .hd .hdv .2mg .hdi pc9801rs cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9801rx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801rx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801rx harddisk (hard) .chd .hd .hdv .2mg .hdi pc9801rx cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9801us floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801us floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801us harddisk (hard) .chd .hd .hdv .2mg .hdi pc9801us cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9801uv2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801uv2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801ux floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801ux floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801vm floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801vm floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801vx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9801vx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821 harddisk (hard) .chd .hd .hdv .2mg .hdi pc9821 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9821ap2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821ap2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821ap2 harddisk (hard) .chd .hd .hdv .2mg .hdi pc9821ap2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9821as floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821as floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821as harddisk (hard) .chd .hd .hdv .2mg .hdi pc9821as cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9821ce floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821ce floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821ce harddisk (hard) .chd .hd .hdv .2mg .hdi pc9821ce cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9821cx3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821cx3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821cx3 harddisk (hard) .chd .hd .hdv .2mg .hdi pc9821cx3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9821nr15 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821nr15 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821nr15 harddisk (hard) .chd .hd .hdv .2mg .hdi pc9821nr15 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9821nr166 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821nr166 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821nr166 harddisk (hard) .chd .hd .hdv .2mg .hdi pc9821nr166 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9821nw150 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821nw150 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821nw150 harddisk (hard) .chd .hd .hdv .2mg .hdi pc9821nw150 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9821ra20 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821ra20 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821ra20 harddisk (hard) .chd .hd .hdv .2mg .hdi pc9821ra20 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9821ra266 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821ra266 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821ra266 harddisk (hard) .chd .hd .hdv .2mg .hdi pc9821ra266 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9821ra333 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821ra333 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821ra333 harddisk (hard) .chd .hd .hdv .2mg .hdi pc9821ra333 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9821xa16 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821xa16 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821xa16 harddisk (hard) .chd .hd .hdv .2mg .hdi pc9821xa16 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc9821xv13 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821xv13 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc9821xv13 harddisk (hard) .chd .hd .hdv .2mg .hdi pc9821xv13 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pc98ha floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc98ha floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc98lt floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc98lt floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc_h98s floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc_h98s floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .hdm .fdi .fdd .dcp .dcu .dip .nfd pc_h98s harddisk (hard) .chd .hd .hdv .2mg .hdi pc_h98s cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcb303 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcb303 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcb303 harddisk (hard) .chd .hd .hdv .2mg .hdi pccm205 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm205 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm205 harddisk (hard) .chd .hd .hdv .2mg .hdi pccm209 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm209 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm209 harddisk (hard) .chd .hd .hdv .2mg .hdi pccm216 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm216 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm216 harddisk (hard) .chd .hd .hdv .2mg .hdi pccm317 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm317 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm317 harddisk (hard) .chd .hd .hdv .2mg .hdi pccm317 printout (prin) .prn pccm321 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm321 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm321 harddisk (hard) .chd .hd .hdv .2mg .hdi pccm321 printout (prin) .prn pccm326 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm326 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm326 harddisk (hard) .chd .hd .hdv .2mg .hdi pccm326 printout (prin) .prn pccm396f floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm396f floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm396f harddisk (hard) .chd .hd .hdv .2mg .hdi pccm912 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm912 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm912 harddisk (hard) .chd .hd .hdv .2mg .hdi pccm912 printout (prin) .prn pccm915i floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm915i floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm915i harddisk (hard) .chd .hd .hdv .2mg .hdi pccm915i printout (prin) .prn pccm919 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm919 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pccm919 harddisk (hard) .chd .hd .hdv .2mg .hdi pccm919 printout (prin) .prn pcd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pcd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pcd harddisk1 (hard1) .chd .hd .hdv .2mg .hdi pcd harddisk2 (hard2) .chd .hd .hdv .2mg .hdi pcd2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcd2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcd2 harddisk (hard) .chd .hd .hdv .2mg .hdi pcd204 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcd204 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcd204 harddisk (hard) .chd .hd .hdv .2mg .hdi pcd2m floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcd2m floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcd2m harddisk (hard) .chd .hd .hdv .2mg .hdi pcd3nsl floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcd3nsl floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcd3nsl harddisk (hard) .chd .hd .hdv .2mg .hdi pcd3nsx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcd3nsx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcd3nsx harddisk (hard) .chd .hd .hdv .2mg .hdi pcd4nd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcd4nd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcd4nd harddisk (hard) .chd .hd .hdv .2mg .hdi pcd4nd printout (prin) .prn pcd4nl floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcd4nl floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcd4nl harddisk (hard) .chd .hd .hdv .2mg .hdi pcd4nl printout (prin) .prn pcd4x floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcd4x floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcd4x harddisk (hard) .chd .hd .hdv .2mg .hdi pcd4x printout (prin) .prn pce cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pce cartridge (cart) .pce .bin pcega floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcega floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcega harddisk1 (hard1) .chd .hd .hdv .2mg .hdi pcega harddisk2 (hard2) .chd .hd .hdv .2mg .hdi pcfx cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcfxga cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcherc printout (prin) .prn pcherc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcherc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcherc harddisk1 (hard1) .chd .hd .hdv .2mg .hdi pcherc harddisk2 (hard2) .chd .hd .hdv .2mg .hdi pci48af floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pci48af floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pci48af harddisk (hard) .chd .hd .hdv .2mg .hdi pci48af printout (prin) .prn pciagp harddisk (hard) .chd .hd .hdv .2mg .hdi pciagp cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pciagp floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pciagp floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pciagp printout (prin) .prn pcipc harddisk (hard) .chd .hd .hdv .2mg .hdi pcipc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcipc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pcipc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pcipc printout (prin) .prn pcipcs7 harddisk (hard) .chd .hd .hdv .2mg .hdi pcipcs7 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcipcs7 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pcipcs7 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pcipcs7 printout (prin) .prn pck486dx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pck486dx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pck486dx harddisk (hard) .chd .hd .hdv .2mg .hdi pck486dx printout (prin) .prn pcm cassette (cass) .wav .flac pcmda printout (prin) .prn pcmda floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcmda floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcmda harddisk1 (hard1) .chd .hd .hdv .2mg .hdi pcmda harddisk2 (hard2) .chd .hd .hdv .2mg .hdi pcnfrk cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcnfrk10m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcnfrk2m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcnfrk2mk cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcnfrk3m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcnfrk3mk cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcnfrk4m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcnfrk4mk cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcnfrk5m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcnfrk5mk cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcnfrk6m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcnfrk7m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcnfrk8m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcnfrk9m cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcnfrka cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcnfrkk cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pcscolor cartridge (cart) .bin pcunlim cartridge (cart) .bin pcv20 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcv20 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcv20 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi pcv20 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi pcvga floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcvga floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pcvga harddisk1 (hard1) .chd .hd .hdv .2mg .hdi pcvga harddisk2 (hard2) .chd .hd .hdv .2mg .hdi pcw10 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pcw16 printout (prin) .prn pcw16 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pcw16 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pcw8256 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pcw8512 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pcw8512 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pcw9256 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pcw9512 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pcw9512p floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pcx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pcx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pcx harddisk1 (hard1) .chd .hd .hdv .2mg .hdi pcx harddisk2 (hard2) .chd .hd .hdv .2mg .hdi pda600 cartridge (cart) .bin pda600 printout (prin) .prn pdp11qb floppydisk1 (flop1) .img .fdi .td0 .imd .cqm .dsk .d77 .d88 .1dd pdp11qb floppydisk2 (flop2) .img .fdi .td0 .imd .cqm .dsk .d77 .d88 .1dd pdp11qb punchtape (ptap) .bin .bim .lda pdp11ub floppydisk1 (flop1) .img .fdi .td0 .imd .cqm .dsk .d77 .d88 .1dd pdp11ub floppydisk2 (flop2) .img .fdi .td0 .imd .cqm .dsk .d77 .d88 .1dd pdp11ub punchtape (ptap) .bin .bim .lda pdp11ub2 floppydisk1 (flop1) .img .fdi .td0 .imd .cqm .dsk .d77 .d88 .1dd pdp11ub2 floppydisk2 (flop2) .img .fdi .td0 .imd .cqm .dsk .d77 .d88 .1dd pdp11ub2 punchtape (ptap) .bin .bim .lda peas286 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf peas286 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf peas286 harddisk (hard) .chd .hd .hdv .2mg .hdi pecom32 cassette (cass) .wav .flac pecom64 cassette (cass) .wav .flac pegasus romimage1 (rom1) .bin pegasus romimage2 (rom2) .bin pegasus romimage3 (rom3) .bin pegasus romimage4 (rom4) .bin pegasus romimage5 (rom5) .bin pegasus cassette (cass) .wav .flac pegasusm romimage1 (rom1) .bin pegasusm romimage2 (rom2) .bin pegasusm romimage3 (rom3) .bin pegasusm romimage4 (rom4) .bin pegasusm romimage5 (rom5) .bin pegasusm cassette (cass) .wav .flac pem2530 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pem2530 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pem2530 harddisk (hard) .chd .hd .hdv .2mg .hdi pem2530 printout (prin) .prn pencil2 cassette (cass) .wav .flac pencil2 cartridge (cart) .bin pencil2 printout (prin) .prn pent1024 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx pent1024 quickload (quik) .raw .scr pent1024 cassette (cass) .wav .flac .tzx .tap .blk pent1024 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd pent1024 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd pent1024 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd pent1024 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd pentagon snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx pentagon quickload (quik) .raw .scr pentagon cassette (cass) .wav .flac .tzx .tap .blk pentagon floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd pentagon floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd pentagon floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd pentagon floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd pentevo snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx pentevo quickload (quik) .raw .scr pentevo cassette (cass) .wav .flac .tzx .tap .blk pentevo floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd pentevo floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd pentevo floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd pentevo floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd pentevo harddisk (hard) .chd .hd .hdv .2mg .hdi perfect1 cartridge (cart) .mx1 .bin .rom perfect1 printout (prin) .prn perfect1 cassette (cass) .wav .flac .tap .cas .tsx pet2001 floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 pet2001 floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 pet2001 cassette (cass) .wav .flac .tap pet2001 quickload (quik) .p00 .prg pet20018 floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 pet20018 floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 pet20018 cassette (cass) .wav .flac .tap pet20018 quickload (quik) .p00 .prg pet2001b floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 pet2001b floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 pet2001b cassette (cass) .wav .flac .tap pet2001b quickload (quik) .p00 .prg pet2001b cartridge1 (cart1) .bin .rom pet2001b cartridge2 (cart2) .bin .rom pet2001b cartridge3 (cart3) .bin .rom pet2001b16 floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 pet2001b16 floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 pet2001b16 cassette (cass) .wav .flac .tap pet2001b16 quickload (quik) .p00 .prg pet2001b16 cartridge1 (cart1) .bin .rom pet2001b16 cartridge2 (cart2) .bin .rom pet2001b16 cartridge3 (cart3) .bin .rom pet2001b32 floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 pet2001b32 floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 pet2001b32 cassette (cass) .wav .flac .tap pet2001b32 quickload (quik) .p00 .prg pet2001b32 cartridge1 (cart1) .bin .rom pet2001b32 cartridge2 (cart2) .bin .rom pet2001b32 cartridge3 (cart3) .bin .rom pet2001n floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 pet2001n floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 pet2001n cassette (cass) .wav .flac .tap pet2001n quickload (quik) .p00 .prg pet2001n cartridge1 (cart1) .bin .rom pet2001n cartridge2 (cart2) .bin .rom pet2001n cartridge3 (cart3) .bin .rom pet2001n16 floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 pet2001n16 floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 pet2001n16 cassette (cass) .wav .flac .tap pet2001n16 quickload (quik) .p00 .prg pet2001n16 cartridge1 (cart1) .bin .rom pet2001n16 cartridge2 (cart2) .bin .rom pet2001n16 cartridge3 (cart3) .bin .rom pet2001n32 floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 pet2001n32 floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 pet2001n32 cassette (cass) .wav .flac .tap pet2001n32 quickload (quik) .p00 .prg pet2001n32 cartridge1 (cart1) .bin .rom pet2001n32 cartridge2 (cart2) .bin .rom pet2001n32 cartridge3 (cart3) .bin .rom pet4016 floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 pet4016 floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 pet4016 cassette (cass) .wav .flac .tap pet4016 quickload (quik) .p00 .prg pet4016 cartridge1 (cart1) .bin .rom pet4016 cartridge2 (cart2) .bin .rom pet4032 floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 pet4032 floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 pet4032 cassette (cass) .wav .flac .tap pet4032 quickload (quik) .p00 .prg pet4032 cartridge1 (cart1) .bin .rom pet4032 cartridge2 (cart2) .bin .rom pet4032b floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 pet4032b floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 pet4032b cassette (cass) .wav .flac .tap pet4032b quickload (quik) .p00 .prg pet4032b cartridge1 (cart1) .bin .rom pet4032b cartridge2 (cart2) .bin .rom pet4032f floppydisk1 (flop1) .mfi .dfi .d64 .g64 .g41 .g71 pet4032f floppydisk2 (flop2) .mfi .dfi .d64 .g64 .g41 .g71 pet4032f cassette (cass) .wav .flac .tap pet4032f quickload (quik) .p00 .prg pet4032f cartridge1 (cart1) .bin .rom pet4032f cartridge2 (cart2) .bin .rom pet64 cassette (cass) .wav .flac .tap pet64 floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 pet64 cartridge (cart) .80 .a0 .e0 .crt pet64 quickload (quik) .p00 .prg .t64 pet8032 floppydisk1 (flop1) .mfi .dfi .d80 pet8032 floppydisk2 (flop2) .mfi .dfi .d80 pet8032 cassette (cass) .wav .flac .tap pet8032 quickload (quik) .p00 .prg pet8032 cartridge1 (cart1) .bin .rom pet8032 cartridge2 (cart2) .bin .rom pf2012 harddisk (hard) .chd .hd .hdv .2mg .hdi pf2012 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pg675 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pg675 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pg685 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pg685oua12 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pg750 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pg750 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pg750 printout (prin) .prn pg750 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi pg750 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi pg750eisa floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pg750eisa floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pg750eisa harddisk (hard) .chd .hd .hdv .2mg .hdi pg750eisa printout (prin) .prn phc2 cartridge (cart) .mx1 .bin .rom phc2 printout (prin) .prn phc2 cassette (cass) .wav .flac .tap .cas .tsx phc20 cassette (cass) .wav .flac phc23 cartridge1 (cart1) .mx1 .bin .rom phc23 cartridge2 (cart2) .mx1 .bin .rom phc23 printout (prin) .prn phc23 cassette (cass) .wav .flac .tap .cas .tsx phc23jb cartridge1 (cart1) .mx1 .bin .rom phc23jb cartridge2 (cart2) .mx1 .bin .rom phc23jb printout (prin) .prn phc23jb cassette (cass) .wav .flac .tap .cas .tsx phc25 cassette (cass) .wav .flac .phc phc25 printout (prin) .prn phc25j cassette (cass) .wav .flac .phc phc25j printout (prin) .prn phc28 cartridge1 (cart1) .mx1 .bin .rom phc28 cartridge2 (cart2) .mx1 .bin .rom phc28 printout (prin) .prn phc28 cassette (cass) .wav .flac .tap .cas .tsx phc28l cartridge1 (cart1) .mx1 .bin .rom phc28l cartridge2 (cart2) .mx1 .bin .rom phc28l printout (prin) .prn phc28l cassette (cass) .wav .flac .tap .cas .tsx phc28s cartridge1 (cart1) .mx1 .bin .rom phc28s cartridge2 (cart2) .mx1 .bin .rom phc28s printout (prin) .prn phc28s cassette (cass) .wav .flac .tap .cas .tsx phc35j cartridge1 (cart1) .mx1 .bin .rom phc35j cartridge2 (cart2) .mx1 .bin .rom phc35j printout (prin) .prn phc35j cassette (cass) .wav .flac .tap .cas .tsx phc55fd2 cartridge1 (cart1) .mx1 .bin .rom phc55fd2 cartridge2 (cart2) .mx1 .bin .rom phc55fd2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk phc55fd2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk phc55fd2 printout (prin) .prn phc55fd2 cassette (cass) .wav .flac .tap .cas .tsx phc64 printout (prin) .prn phc64 cassette1 (cass1) .wav .flac phc64 cassette2 (cass2) .wav .flac phc64 cartridge (cart) .bin .rom phc70fd cartridge1 (cart1) .mx1 .bin .rom phc70fd cartridge2 (cart2) .mx1 .bin .rom phc70fd floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk phc70fd printout (prin) .prn phc70fd cassette (cass) .wav .flac .tap .cas .tsx phc70fd2 cartridge1 (cart1) .mx1 .bin .rom phc70fd2 cartridge2 (cart2) .mx1 .bin .rom phc70fd2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk phc70fd2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk phc70fd2 printout (prin) .prn phc70fd2 cassette (cass) .wav .flac .tap .cas .tsx phc77 cartridge1 (cart1) .mx1 .bin .rom phc77 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk phc77 cartridge2 (cart2) .mx1 .bin .rom phc77 printout (prin) .prn phc77 cassette (cass) .wav .flac .tap .cas .tsx photoply2k harddisk (hard) .chd .hd .hdv .2mg .hdi photoply2k cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr photoply2k printout (prin) .prn photoply2k1it harddisk (hard) .chd .hd .hdv .2mg .hdi photoply2k1it cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr photoply2k1it printout (prin) .prn photoply2k1mtnl harddisk (hard) .chd .hd .hdv .2mg .hdi photoply2k1mtnl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr photoply2k1mtnl printout (prin) .prn photoply2k1nl harddisk (hard) .chd .hd .hdv .2mg .hdi photoply2k1nl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr photoply2k1nl printout (prin) .prn photoply2k2be harddisk (hard) .chd .hd .hdv .2mg .hdi photoply2k2be cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr photoply2k2be printout (prin) .prn photoply2k4 harddisk (hard) .chd .hd .hdv .2mg .hdi photoply2k4 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr photoply2k4 printout (prin) .prn photoply2knl harddisk (hard) .chd .hd .hdv .2mg .hdi photoply2knl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr photoply2knl printout (prin) .prn photoply2ksp harddisk (hard) .chd .hd .hdv .2mg .hdi photoply2ksp cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr photoply2ksp printout (prin) .prn photoply98sp harddisk (hard) .chd .hd .hdv .2mg .hdi photoply98sp cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr photoply98sp printout (prin) .prn photoply99nl harddisk (hard) .chd .hd .hdv .2mg .hdi photoply99nl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr photoply99nl printout (prin) .prn photoply99sp harddisk (hard) .chd .hd .hdv .2mg .hdi photoply99sp cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr photoply99sp printout (prin) .prn php3239 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf php3239 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf php3239 harddisk (hard) .chd .hd .hdv .2mg .hdi phunsy cassette (cass) .wav .flac phunsy quickload (quik) .bin pi4d20 harddisk (hard) .chd .hd .hdv .2mg .hdi pi4d20 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pi4d25 harddisk (hard) .chd .hd .hdv .2mg .hdi pi4d25 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pi4d30 harddisk (hard) .chd .hd .hdv .2mg .hdi pi4d30 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pi4d35 harddisk (hard) .chd .hd .hdv .2mg .hdi pi4d35 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pi4d50 harddisk (hard) .chd .hd .hdv .2mg .hdi pi4d50 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pi4d50 tape (tap) .tap pi4d70 harddisk (hard) .chd .hd .hdv .2mg .hdi pi4d70 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pi4d70 tape (tap) .tap pi_stry cartridge (cart) .bin pi_stry2 cartridge (cart) .bin picno cartridge (cart) .bin picno2 cartridge (cart) .bin pico cartridge (cart) .bin .md picoj cartridge (cart) .bin .md picou cartridge (cart) .bin .md pingu harddisk (hard) .chd .hd .hdv .2mg .hdi pioner cassette (cass) .wav .flac .rks piopx7 cartridge1 (cart1) .mx1 .bin .rom piopx7 cartridge2 (cart2) .mx1 .bin .rom piopx7 printout (prin) .prn piopx7 cassette (cass) .wav .flac .tap .cas .tsx piopx7uk cartridge1 (cart1) .mx1 .bin .rom piopx7uk cartridge2 (cart2) .mx1 .bin .rom piopx7uk printout (prin) .prn piopx7uk cassette (cass) .wav .flac .tap .cas .tsx piopxv60 cartridge1 (cart1) .mx1 .bin .rom piopxv60 cartridge2 (cart2) .mx1 .bin .rom piopxv60 printout (prin) .prn piopxv60 cassette (cass) .wav .flac .tap .cas .tsx pipbug quickload (quik) .pgm pipbug cassette (cass) .wav .flac pippin floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg pippin cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pixtermu cartridge (cart) .bin pk6128c cassette (cass) .wav .flac pk6128c floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .fdd pk6128c floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .fdd pk6128c cartridge (cart) .bin .emr pk8002 cassette (cass) .wav .flac .tap .cas .tsx pk88 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pk88 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pk88 printout (prin) .prn pk88 cassette (cass) .wav .flac pkm0038s floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pkm0038s floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pkm0038s harddisk (hard) .chd .hd .hdv .2mg .hdi pkm0038s printout (prin) .prn pl6_cm harddisk (hard) .chd .hd .hdv .2mg .hdi pl6_demo harddisk (hard) .chd .hd .hdv .2mg .hdi pl6_kfp harddisk (hard) .chd .hd .hdv .2mg .hdi pl6_lgk harddisk (hard) .chd .hd .hdv .2mg .hdi playmaker cartridge (cart) .bin plldium cartridge (cart) .bin pls1000 cartridge (cart) .bin plus4 cassette (cass) .wav .flac .tap plus4 floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 plus4 cartridge (cart) .rom .bin plus4 quickload (quik) .p00 .prg plus4p cassette (cass) .wav .flac .tap plus4p floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 plus4p cartridge (cart) .rom .bin plus4p quickload (quik) .p00 .prg pm486pu floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pm486pu floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pm486pu harddisk (hard) .chd .hd .hdv .2mg .hdi pm486pu printout (prin) .prn pmac6100 harddisk (hard) .chd .hd .hdv .2mg .hdi pmac6100 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pmac6100 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg pmd851 cassette (cass) .wav .flac .pmd .tap .ptp pmd852 cassette (cass) .wav .flac .pmd .tap .ptp pmd852a cassette (cass) .wav .flac .pmd .tap .ptp pmd852b cassette (cass) .wav .flac .pmd .tap .ptp pmd853 cassette (cass) .wav .flac .pmd .tap .ptp pmi80 cassette (cass) .wav .flac pn8800 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf pnchmn cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pnchmn2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pnchmna cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pockchal cartridge (cart) .bin pockchv2 cartridge (cart) .ws .wsc .bin pocketbk ssd1 (ssd1) .rom .bin pocketbk ssd2 (ssd2) .rom .bin pocketbk2 ssd1 (ssd1) .rom .bin pocketbk2 ssd2 (ssd2) .rom .bin pockstat cartridge (cart) .gme poisk1 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf poisk1 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf poisk1 cassette (cass) .wav .flac poisk2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf poisk2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf poisk2 printout (prin) .prn pokegac2 cartridge (cart) .bin pokegac2y cartridge (cart) .bin pokegach cartridge (cart) .bin pokemini cartridge (cart) .bin .min pokoachu cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr poly88 cassette (cass) .wav .flac poly88 snapshot (dump) .img poly880 cassette (cass) .wav .flac poly880s cassette (cass) .wav .flac poly8813 cassette (cass) .wav .flac poly8813 snapshot (dump) .img polydev floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .dsk polysix cassette (cass) .wav .flac polystar cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr polyvcg cartridge (cart) .bin popira cartridge (cart) .bin .u1 popira2 cartridge (cart) .bin .u1 popirak cartridge (cart) .bin .u1 popn1 harddisk (hard) .chd .hd .hdv .2mg .hdi popn1a harddisk (hard) .chd .hd .hdv .2mg .hdi popn1j harddisk (hard) .chd .hd .hdv .2mg .hdi popn1k harddisk (hard) .chd .hd .hdv .2mg .hdi popn2 harddisk (hard) .chd .hd .hdv .2mg .hdi popn3 harddisk (hard) .chd .hd .hdv .2mg .hdi popn4 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr popn4 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr popn4 cdrom3 (cdrm3) .chd .cue .toc .nrg .gdi .iso .cdr popn5 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr popn5 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr popn5 cdrom3 (cdrm3) .chd .cue .toc .nrg .gdi .iso .cdr popn6 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr popn6 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr popn6 cdrom3 (cdrm3) .chd .cue .toc .nrg .gdi .iso .cdr popn7 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr popn7 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr popn7 cdrom3 (cdrm3) .chd .cue .toc .nrg .gdi .iso .cdr popn8 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr popn8 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr popn8 cdrom3 (cdrm3) .chd .cue .toc .nrg .gdi .iso .cdr popnanm cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr popnanm cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr popnanm cdrom3 (cdrm3) .chd .cue .toc .nrg .gdi .iso .cdr popnanm2 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr popnanm2 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr popnanm2 cdrom3 (cdrm3) .chd .cue .toc .nrg .gdi .iso .cdr popnanm2a cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr popnanm2a cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr popnanm2a cdrom3 (cdrm3) .chd .cue .toc .nrg .gdi .iso .cdr popnanm2ja cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr popnanm2ja cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr popnanm2ja cdrom3 (cdrm3) .chd .cue .toc .nrg .gdi .iso .cdr popnanm2jaa cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr popnanm2jaa cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr popnanm2jaa cdrom3 (cdrm3) .chd .cue .toc .nrg .gdi .iso .cdr popnanma cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr popnanma cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr popnanma cdrom3 (cdrm3) .chd .cue .toc .nrg .gdi .iso .cdr popnmt cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr popnmt cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr popnmt cdrom3 (cdrm3) .chd .cue .toc .nrg .gdi .iso .cdr popnmt2 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr popnmt2 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr popnmt2 cdrom3 (cdrm3) .chd .cue .toc .nrg .gdi .iso .cdr popnstex harddisk (hard) .chd .hd .hdv .2mg .hdi poppympt cartridge (cart) .bin positron cassette (cass) .wav .flac pow3000 cassette (cass) .wav .flac .p .81 .tzx powyak96 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr powyakex cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pp floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pp01 cassette (cass) .wav .flac pp1292 quickload (quik) .pgm .tvc pp1292 cartridge (cart) .bin .rom pp1392 quickload (quik) .pgm .tvc pp1392 cartridge (cart) .bin .rom ppc512 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ppc512 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ppc512 printout1 (prin1) .prn ppc512 printout2 (prin2) .prn ppc512 printout3 (prin3) .prn ppc640 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ppc640 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ppc640 printout1 (prin1) .prn ppc640 printout2 (prin2) .prn ppc640 printout3 (prin3) .prn ppd cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr ppd cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr ppm3333p floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ppm3333p floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ppm3333p harddisk (hard) .chd .hd .hdv .2mg .hdi ppp cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr ppp cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr ppp11 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr ppp11 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr ppp1mp cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr ppp1mp cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr ppp2nd harddisk (hard) .chd .hd .hdv .2mg .hdi ppp2nda harddisk (hard) .chd .hd .hdv .2mg .hdi prav82 floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib prav82 floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib prav82 cassette (cass) .wav .flac prav8c floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib prav8c floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib prav8c cassette (cass) .wav .flac prav8d printout (prin) .prn prav8d cassette (cass) .wav .flac .tap prav8dd printout (prin) .prn prav8dd cassette (cass) .wav .flac .tap prav8m floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib prav8m floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib prav8m cassette (cass) .wav .flac prestige cartridge (cart) .bin prestmpt cartridge (cart) .bin primoa32 snapshot (dump) .pss primoa32 quickload (quik) .pp primoa32 cassette (cass) .wav .flac .ptp primoa32 cartridge1 (cart1) .bin .rom primoa32 cartridge2 (cart2) .bin .rom primoa48 snapshot (dump) .pss primoa48 quickload (quik) .pp primoa48 cassette (cass) .wav .flac .ptp primoa48 cartridge1 (cart1) .bin .rom primoa48 cartridge2 (cart2) .bin .rom primoa64 snapshot (dump) .pss primoa64 quickload (quik) .pp primoa64 cassette (cass) .wav .flac .ptp primoa64 cartridge1 (cart1) .bin .rom primoa64 cartridge2 (cart2) .bin .rom primob32 snapshot (dump) .pss primob32 quickload (quik) .pp primob32 cassette (cass) .wav .flac .ptp primob32 cartridge1 (cart1) .bin .rom primob32 cartridge2 (cart2) .bin .rom primob48 snapshot (dump) .pss primob48 quickload (quik) .pp primob48 cassette (cass) .wav .flac .ptp primob48 cartridge1 (cart1) .bin .rom primob48 cartridge2 (cart2) .bin .rom primob64 snapshot (dump) .pss primob64 quickload (quik) .pp primob64 cassette (cass) .wav .flac .ptp primob64 cartridge1 (cart1) .bin .rom primob64 cartridge2 (cart2) .bin .rom primoc64 snapshot (dump) .pss primoc64 quickload (quik) .pp primoc64 cassette (cass) .wav .flac .ptp primoc64 cartridge1 (cart1) .bin .rom primoc64 cartridge2 (cart2) .bin .rom primrag2 harddisk (hard) .chd .hd .hdv .2mg .hdi princ cartridge (cart) .bin princnt cartridge (cart) .bin princnt3 cartridge (cart) .bin pro128 cassette (cass) .wav .k5 .k7 pro128 cartridge (cart) .m5 .rom pro128 printout (prin) .prn pro128s printout (prin) .prn pro128s floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd pro128s romimage1 (rom1) .rom .bin pro128s romimage2 (rom2) .rom .bin pro128s romimage3 (rom3) .rom .bin pro128s romimage4 (rom4) .rom .bin pro80 cassette (cass) .wav .flac prof180x floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk prof180x floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk prof180x floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk prof180x floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk prof180x printout (prin) .prn prof181x floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk prof181x floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk prof181x floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk prof181x floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk prof181x printout (prin) .prn prof80 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk prof80 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk prof80 printout (prin) .prn profi snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx profi quickload (quik) .raw .scr profi cassette (cass) .wav .flac .tzx .tap .blk profi floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd profi floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd profi floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd profi floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd profpc33 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf profpc33 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf profpc33 harddisk (hard) .chd .hd .hdv .2mg .hdi profweis cartridge (cart) .bin prolite286 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf prolite286 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf prolite286 harddisk (hard) .chd .hd .hdv .2mg .hdi prophet2 cassette (cass) .wav .flac .tap .csw .uef prophet2 printout (prin) .prn prophet2 quickload (quik) .atm prophet2 romimage (rom) .bin .rom proteus floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .dsk .cpm proteus floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .dsk .cpm proteus printout (prin) .prn proteus3 cassette (cass) .wav .flac prsarcde cartridge (cart) .rom .col .bin przonegd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr przonegd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf przonegd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf przonegd printout (prin) .prn przonegd midiin (min) .mid .syx przonegd midiout (mout) .mid psa memcard1 (memc1) .mc psa memcard2 (memc2) .mc psa quickload (quik) .cpe .exe .psf .psx psa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr psattack harddisk (hard) .chd .hd .hdv .2mg .hdi pse memcard1 (memc1) .mc pse memcard2 (memc2) .mc pse quickload (quik) .cpe .exe .psf .psx pse cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr psi98 printout (prin) .prn psi98 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk psi98 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk psion3 ssd1 (ssd1) .rom .bin psion3 ssd2 (ssd2) .rom .bin psion3a ssd1 (ssd1) .rom .bin psion3a ssd2 (ssd2) .rom .bin psion3a2 ssd1 (ssd1) .rom .bin psion3a2 ssd2 (ssd2) .rom .bin psion3a2_de ssd1 (ssd1) .rom .bin psion3a2_de ssd2 (ssd2) .rom .bin psion3a2_it ssd1 (ssd1) .rom .bin psion3a2_it ssd2 (ssd2) .rom .bin psion3a2_ru ssd1 (ssd1) .rom .bin psion3a2_ru ssd2 (ssd2) .rom .bin psion3a2_us ssd1 (ssd1) .rom .bin psion3a2_us ssd2 (ssd2) .rom .bin psion3c ssd1 (ssd1) .rom .bin psion3c ssd2 (ssd2) .rom .bin psion3mx ssd1 (ssd1) .rom .bin psion3mx ssd2 (ssd2) .rom .bin psion3mx_fr ssd1 (ssd1) .rom .bin psion3mx_fr ssd2 (ssd2) .rom .bin psion3mx_nl ssd1 (ssd1) .rom .bin psion3mx_nl ssd2 (ssd2) .rom .bin psion3s ssd1 (ssd1) .rom .bin psion3s ssd2 (ssd2) .rom .bin psionhc100 ssd1 (ssd1) .rom .bin psionhc100 ssd2 (ssd2) .rom .bin psionhc110 ssd1 (ssd1) .rom .bin psionhc110 ssd2 (ssd2) .rom .bin psionhc120 ssd1 (ssd1) .rom .bin psionhc120 ssd2 (ssd2) .rom .bin psionwa ssd1 (ssd1) .rom .bin psionwa ssd2 (ssd2) .rom .bin psionwamx ssd1 (ssd1) .rom .bin psionwamx ssd2 (ssd2) .rom .bin psj memcard1 (memc1) .mc psj memcard2 (memc2) .mc psj quickload (quik) .cpe .exe .psf .psx psj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr psr540 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf psr540 midiin (min) .mid .syx psr540 midiout (mout) .mid psu memcard1 (memc1) .mc psu memcard2 (memc2) .mc psu quickload (quik) .cpe .exe .psf .psx psu cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr psyvar2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr psyvaria harddisk (hard) .chd .hd .hdv .2mg .hdi psyvarij harddisk (hard) .chd .hd .hdv .2mg .hdi psyvarrv harddisk (hard) .chd .hd .hdv .2mg .hdi pt319a floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pt319a floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pt319a harddisk (hard) .chd .hd .hdv .2mg .hdi pt430 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pt430 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pt430 harddisk (hard) .chd .hd .hdv .2mg .hdi pt430 printout (prin) .prn pt432b floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pt432b floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pt432b harddisk (hard) .chd .hd .hdv .2mg .hdi pt432b printout (prin) .prn pt581392 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pt581392 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pt581392 harddisk (hard) .chd .hd .hdv .2mg .hdi pt581392 printout (prin) .prn pt68k2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pt68k2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pt68k4 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pt68k4 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ptblank3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ptmb457 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ptmb457 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ptmb457 harddisk (hard) .chd .hd .hdv .2mg .hdi ptmb457 printout (prin) .prn pulsarlb floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pulsarlb floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pumpipx2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpipx2p cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpipx3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpipx3a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpipx3b cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpit1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpit2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpit2a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpit3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpit3a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpit8 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpitc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpite cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpitea cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpito cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpitp2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpitp3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpitp3a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpitpc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpitpr cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpitpru cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpitpx cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pumpitup cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr puyofev cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr puyofevj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr puzzball cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr puzzballa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr pv1000 cartridge (cart) .bin pv16 cartridge (cart) .mx1 .bin .rom pv16 cassette (cass) .wav .flac .tap .cas .tsx pv2000 cassette (cass) .wav .flac pv2000 cartridge (cart) .bin .rom .col pv7 cartridge (cart) .mx1 .bin .rom pv7 cassette (cass) .wav .flac .tap .cas .tsx pwaih4077c floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pwaih4077c floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pwaih4077c harddisk (hard) .chd .hd .hdv .2mg .hdi pwaih4077c printout (prin) .prn pwaih4077d floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pwaih4077d floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pwaih4077d harddisk (hard) .chd .hd .hdv .2mg .hdi pwaih4077d printout (prin) .prn pwb7270e floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pwb7270e floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf pwb7270e harddisk (hard) .chd .hd .hdv .2mg .hdi pwrmacg3 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg pwrshovl harddisk (hard) .chd .hd .hdv .2mg .hdi pwrview floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk pwrview floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk px4 printout (prin) .prn px4 cassette (cass) .wav .flac px4 cartridge1 (cart1) .bin px4 cartridge2 (cart2) .bin px486p3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf px486p3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf px486p3 harddisk (hard) .chd .hd .hdv .2mg .hdi px486p3 printout (prin) .prn px4p printout (prin) .prn px4p cassette (cass) .wav .flac px4p cartridge1 (cart1) .bin px4p cartridge2 (cart2) .bin px4p cartridge3 (cart3) .bin px8 cartridge1 (cart1) .bin .rom px8 cartridge2 (cart2) .bin .rom px8 cassette (cass) .wav .flac pyl601 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img pyl601 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img pyl601a floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img pyl601a floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img pyuuta printout (prin) .prn pyuuta cassette (cass) .wav .flac pyuuta cartridge (cart) .bin pyuutajr printout (prin) .prn pyuutajr cassette (cass) .wav .flac pyuutajr cartridge (cart) .bin qdrmfgp harddisk (hard) .chd .hd .hdv .2mg .hdi qdrmfgp2 harddisk (hard) .chd .hd .hdv .2mg .hdi qdu386dx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf qdu386dx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf qdu386dx harddisk (hard) .chd .hd .hdv .2mg .hdi qdu386dx printout (prin) .prn qi600 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf qi600 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf qi600 harddisk (hard) .chd .hd .hdv .2mg .hdi qi600 printout (prin) .prn qi900 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf qi900 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf qi900 harddisk (hard) .chd .hd .hdv .2mg .hdi qi900 printout (prin) .prn ql microtape1 (utap1) .mdv .mdr ql microtape2 (utap2) .mdv .mdr ql cartridge (cart) .rom .bin ql_de microtape1 (utap1) .mdv .mdr ql_de microtape2 (utap2) .mdv .mdr ql_de cartridge (cart) .rom .bin ql_dk microtape1 (utap1) .mdv .mdr ql_dk microtape2 (utap2) .mdv .mdr ql_dk cartridge (cart) .rom .bin ql_es microtape1 (utap1) .mdv .mdr ql_es microtape2 (utap2) .mdv .mdr ql_es cartridge (cart) .rom .bin ql_fr microtape1 (utap1) .mdv .mdr ql_fr microtape2 (utap2) .mdv .mdr ql_fr cartridge (cart) .rom .bin ql_gr microtape1 (utap1) .mdv .mdr ql_gr microtape2 (utap2) .mdv .mdr ql_gr cartridge (cart) .rom .bin ql_it microtape1 (utap1) .mdv .mdr ql_it microtape2 (utap2) .mdv .mdr ql_it cartridge (cart) .rom .bin ql_se microtape1 (utap1) .mdv .mdr ql_se microtape2 (utap2) .mdv .mdr ql_se cartridge (cart) .rom .bin ql_us microtape1 (utap1) .mdv .mdr ql_us microtape2 (utap2) .mdv .mdr ql_us cartridge (cart) .rom .bin qofd3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr qofdtbk cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quake harddisk (hard) .chd .hd .hdv .2mg .hdi quake cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quake floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf quake floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf quake printout (prin) .prn queen harddisk (hard) .chd .hd .hdv .2mg .hdi questofd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizard cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizard2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizard2_22 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizard3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizard3_32 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizard3a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizard4 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizard4_40 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizard4_41 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizard4cz cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizard_10 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizard_12 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizard_17 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizardff cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizardi cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizardi_12 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizardi_17 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizqgd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr quizshow cassette (cass) .wav .flac quizwizc cartridge (cart) .bin quorum snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx quorum quickload (quik) .raw .scr quorum cassette (cass) .wav .flac .tzx .tap .blk quorum floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd quorum floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd quorum floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd quorum floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd quorum48 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx quorum48 quickload (quik) .raw .scr quorum48 cassette (cass) .wav .flac .tzx .tap .blk qx10 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk qx10 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk qx10 quickload (quik) .com .cpm r8 cartridge (cart) .bin r8m cartridge1 (cart1) .bin r8m cartridge2 (cart2) .bin r8m cartridge3 (cart3) .bin r8mk2 cartridge (cart) .bin r9751 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf r9751 harddisk (hard) .chd .hd .hdv .2mg .hdi r9751 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr racjamdx harddisk (hard) .chd .hd .hdv .2mg .hdi radio16 cassette (cass) .wav .flac .rk .rkr .gam .g16 .pki radio4k cassette (cass) .wav .flac .rk .rkr .gam .g16 .pki radio86 cassette (cass) .wav .flac .rk .rkr .gam .g16 .pki radio99 cassette (cass) .wav .flac .rk8 radionic cassette (cass) .wav .flac .cas radionic quickload (quik) .cmd radionic floppydisk1 (flop1) .mfi .dfi .jv1 .dsk radionic floppydisk2 (flop2) .mfi .dfi .jv1 .dsk radionic printout (prin) .prn radioram cassette (cass) .wav .flac .rk .rkr .gam .g16 .pki radiorom cassette (cass) .wav .flac .rk .rkr .gam .g16 .pki radiorom cartridge (cart) .bin .rom radirgy cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr radirgyo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr rainbow floppydisk1 (flop1) .mfi .dfi .img .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .ufi .360 .ipf rainbow floppydisk2 (flop2) .mfi .dfi .img .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .ufi .360 .ipf rainbow floppydisk3 (flop3) .mfi .dfi .img .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .ufi .360 .ipf rainbow floppydisk4 (flop4) .mfi .dfi .img .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .ufi .360 .ipf rainbow harddisk1 (hard1) .chd .hd .hdv .2mg .hdi rainbow harddisk2 (hard2) .chd .hd .hdv .2mg .hdi rainbow harddisk3 (hard3) .chd .hd .hdv .2mg .hdi rainbow harddisk4 (hard4) .chd .hd .hdv .2mg .hdi rainbow harddisk5 (hard5) .chd .hd .hdv .2mg .hdi rainbow printout (prin) .prn rainbow100a floppydisk1 (flop1) .mfi .dfi .img .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .ufi .360 .ipf rainbow100a floppydisk2 (flop2) .mfi .dfi .img .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .ufi .360 .ipf rainbow100a floppydisk3 (flop3) .mfi .dfi .img .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .ufi .360 .ipf rainbow100a floppydisk4 (flop4) .mfi .dfi .img .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .ufi .360 .ipf rainbow100a harddisk1 (hard1) .chd .hd .hdv .2mg .hdi rainbow100a harddisk2 (hard2) .chd .hd .hdv .2mg .hdi rainbow100a harddisk3 (hard3) .chd .hd .hdv .2mg .hdi rainbow100a harddisk4 (hard4) .chd .hd .hdv .2mg .hdi rainbow100a harddisk5 (hard5) .chd .hd .hdv .2mg .hdi rainbow100a printout (prin) .prn rainbow190 floppydisk1 (flop1) .mfi .dfi .img .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .ufi .360 .ipf rainbow190 floppydisk2 (flop2) .mfi .dfi .img .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .ufi .360 .ipf rainbow190 floppydisk3 (flop3) .mfi .dfi .img .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .ufi .360 .ipf rainbow190 floppydisk4 (flop4) .mfi .dfi .img .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .ufi .360 .ipf rainbow190 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi rainbow190 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi rainbow190 harddisk3 (hard3) .chd .hd .hdv .2mg .hdi rainbow190 harddisk4 (hard4) .chd .hd .hdv .2mg .hdi rainbow190 harddisk5 (hard5) .chd .hd .hdv .2mg .hdi rainbow190 printout (prin) .prn raizpin harddisk (hard) .chd .hd .hdv .2mg .hdi raizpinj harddisk (hard) .chd .hd .hdv .2mg .hdi rameses cassette (cass) .wav .flac rameses printout (prin) .prn rameses cartridge (cart) .bin .rom rasce harddisk (hard) .chd .hd .hdv .2mg .hdi rasce cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ravens quickload (quik) .pgm ravens cassette (cass) .wav .flac ravens2 quickload (quik) .pgm ravens2 cassette (cass) .wav .flac raycris harddisk (hard) .chd .hd .hdv .2mg .hdi raycrisj harddisk (hard) .chd .hd .hdv .2mg .hdi raystormg harddisk (hard) .chd .hd .hdv .2mg .hdi rc2014minicpm harddisk (hard) .chd .hd .hdv .2mg .hdi rc2014pro harddisk (hard) .chd .hd .hdv .2mg .hdi rc2030 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf rc2030 harddisk (hard) .chd .hd .hdv .2mg .hdi rc3230 harddisk (hard) .chd .hd .hdv .2mg .hdi rc3230 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf rc702 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk rc759 printout (prin) .prn rc759 cassette (cass) .wav .flac rc759 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img rc759 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img rcdego harddisk (hard) .chd .hd .hdv .2mg .hdi redearth cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr redearthn cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr redearthnr1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr redearthr1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr renaimj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr rex6000 quickload (quik) .rex .ds2 rfmpb harddisk (hard) .chd .hd .hdv .2mg .hdi rfmpbr2 harddisk (hard) .chd .hd .hdv .2mg .hdi rhnation harddisk (hard) .chd .hd .hdv .2mg .hdi ringo470 cassette (cass) .wav .flac .p .81 .tzx rizstals harddisk (hard) .chd .hd .hdv .2mg .hdi rk7007 cassette (cass) .wav .flac .rk .rkr .gam .g16 .pki rk700716 cassette (cass) .wav .flac .rk .rkr .gam .g16 .pki rlndtnsc1 cartridge (cart) .bin rlndtnsc2 cartridge (cart) .bin rm380z floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk rm380z floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk rm380z34d floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk rm380z34d floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk rm380z34d cassette (cass) .wav .flac rm380z34e floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk rm380z34e floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk rm380z34e cassette (cass) .wav .flac rm380zf floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk rm380zf floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk rm380zfhrg floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk rm380zfhrg floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk rm380zhrg floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk rm380zhrg floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk rm480z floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk rm480z floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk rm480za floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk rm480za floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk roadburn harddisk1 (hard1) .chd .hd .hdv .2mg .hdi roadburn cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr roadburn harddisk2 (hard2) .chd .hd .hdv .2mg .hdi roadburn cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr roadburn1 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi roadburn1 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr roadburn1 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi roadburn1 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr robie quickload (quik) .com .cpm robie printout (prin) .prn robie floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay robie floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kay rockmanbc harddisk (hard) .chd .hd .hdv .2mg .hdi rockmanmdl harddisk (hard) .chd .hd .hdv .2mg .hdi rotr harddisk (hard) .chd .hd .hdv .2mg .hdi rotra harddisk (hard) .chd .hd .hdv .2mg .hdi rowtrn2k cartridge (cart) .bin rs128 printout (prin) .prn rs128 snapshot (dump) .mtx rs128 quickload (quik) .run rs128 cassette (cass) .wav .flac rs128 romimage (rom) .bin .rom rs128 cartridge1 (cart1) .bin .rom rs128 cartridge2 (cart2) .bin .rom rs2030 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf rs2030 harddisk (hard) .chd .hd .hdv .2mg .hdi rs3230 harddisk (hard) .chd .hd .hdv .2mg .hdi rs3230 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf rt1715w printout (prin) .prn rt1715w bitbanger (bitb) . rt1715w floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi rt1715w floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .kdi rtpc010 printout (prin) .prn rtpc010 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf rtpc010 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf rtpc015 printout (prin) .prn rtpc015 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf rtpc015 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf rtpc020 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf rtpc020 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf rtpc020 printout (prin) .prn rtpc025 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf rtpc025 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf rtpc025 printout (prin) .prn rtpca25 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf rtpca25 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf rtpca25 printout (prin) .prn runpuppy harddisk (hard) .chd .hd .hdv .2mg .hdi rwtrntcs quickload (quik) .pgm .tvc rwtrntcs cartridge (cart) .bin .rom rx78 cartridge (cart) .bin .rom rx78 cassette (cass) .wav .flac rz1 midiin (min) .mid .syx rz1 midiout1 (mout1) .mid rz1 midiout2 (mout2) .mid rz1 cassette1 (cass1) .wav .flac .cas rz1 cassette2 (cass2) .wav .flac s2000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .dsk .ima .img .ufi .360 .ipf .hfe s2000 midiin (min) .mid .syx s2000 midiout (mout) .mid s2000 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr s2000 harddisk (hard) .chd .hd .hdv .2mg .hdi s3000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .dsk .ima .img .ufi .360 .ipf .hfe s3000 midiin (min) .mid .syx s3000 midiout (mout) .mid s3000 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr s3000 harddisk (hard) .chd .hd .hdv .2mg .hdi s3000xl floppydisk (flop) .mfi .dfi .mfm .td0 .imd .dsk .ima .img .ufi .360 .ipf .hfe s3000xl midiin (min) .mid .syx s3000xl midiout (mout) .mid s3000xl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr s3000xl harddisk (hard) .chd .hd .hdv .2mg .hdi s50 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .out .w30 s550 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .out .w30 sabavdpl cartridge (cart) .bin .chf sabavpl2 cartridge (cart) .bin .chf sag cartridge (cart) .bin sagafox floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sagafox floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sagafoxf80 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sagafoxf80 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sage2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sage2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sage2 printout (prin) .prn salarymc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr samcoupe cassette (cass) .wav .flac .tzx .tap .blk samcoupe floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .mgt samcoupe floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .mgt samdm286 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf samdm286 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf samdm286 harddisk (hard) .chd .hd .hdv .2mg .hdi santacl harddisk (hard) .chd .hd .hdv .2mg .hdi santacl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr santaka2 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx santaka2 quickload (quik) .raw .scr santaka2 cassette (cass) .wav .flac .tzx .tap .blk sapi1 cassette (cass) .wav .flac sapizps2 cassette (cass) .wav .flac sarcpc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sarcpc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sarcpc harddisk (hard) .chd .hd .hdv .2mg .hdi saturn cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr saturn cartridge (cart) .bin saturneu cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr saturneu cartridge (cart) .bin saturnjp cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr saturnjp cartridge (cart) .bin saturnkr cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr saturnkr cartridge (cart) .bin savquest harddisk (hard) .chd .hd .hdv .2mg .hdi savquest cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr savquest floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf savquest floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf savquest midiin (min) .mid .syx savquest midiout (mout) .mid sawatte cartridge (cart) .bin sb180 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sb180 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sb180 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sb180 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sb2m600b cassette (cass) .wav .flac sb486 cartridge (cart) .nes .unf .unif sbrain floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sbrain floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sc3000 cassette (cass) .wav .flac .bit .tzx sc3000 cartridge (cart) .bin .sg .sc sc3000pal cassette (cass) .wav .flac .bit .tzx sc3000pal cartridge (cart) .bin .sg .sc scamp386sx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf scamp386sx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf scamp386sx harddisk (hard) .chd .hd .hdv .2mg .hdi scg05nt cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr scg05ntb cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr scg06nt cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr schess cartridge (cart) .bin scorpio snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx scorpio quickload (quik) .raw .scr scorpio cassette (cass) .wav .flac .tzx .tap .blk scorpio floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd scorpio floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd scorpio floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd scorpio floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd scorpiongmx snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx scorpiongmx quickload (quik) .raw .scr scorpiongmx cassette (cass) .wav .flac .tzx .tap .blk scorpiongmx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd scorpiongmx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd scorpiongmx floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd scorpiongmx floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd scorpiontb snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx scorpiontb quickload (quik) .raw .scr scorpiontb cassette (cass) .wav .flac .tzx .tap .blk scorpiontb floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd scorpiontb floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd scorpiontb floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd scorpiontb floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd scsxaio floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf scsxaio floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf scsxaio harddisk (hard) .chd .hd .hdv .2mg .hdi scv cartridge (cart) .bin scv_pal cartridge (cart) .bin sd1 midiin (min) .mid .syx sd1 midiout (mout) .mid sd1 cartridge (cart) .rom .cart .eeprom.sc32 sd1 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .hfe sd132 midiin (min) .mid .syx sd132 midiout (mout) .mid sd132 cartridge (cart) .rom .cart .eeprom.sc32 sd132 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .hfe sdk85 romimage (rom) .bin se3010 romimage1 (rom1) .rom .bin se3010 cassette (cass) .wav .flac .csw .uef se3010 printout (prin) .prn se3010 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd se3010 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .hfe .ssd .bbc .dsd .adf .ads .adm .adl .dds .fsd segaai card (card) .aic .bin segaai cassette (cass) .wav .flac segacd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr segacd2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sekaikh cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sekaikha cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sengomjk cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr senko cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr senkoo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr senkosp cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sergeysxt floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sergeysxt floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sergeysxt printout (prin) .prn sergeysxt harddisk (hard) .chd .hd .hdv .2mg .hdi sf2049 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi sf2049 cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr sf2049 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi sf2049 cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr sf2049se harddisk1 (hard1) .chd .hd .hdv .2mg .hdi sf2049se cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr sf2049se harddisk2 (hard2) .chd .hd .hdv .2mg .hdi sf2049se cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr sf2049te harddisk1 (hard1) .chd .hd .hdv .2mg .hdi sf2049te cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr sf2049te harddisk2 (hard2) .chd .hd .hdv .2mg .hdi sf2049te cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr sf2049tea harddisk1 (hard1) .chd .hd .hdv .2mg .hdi sf2049tea cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr sf2049tea harddisk2 (hard2) .chd .hd .hdv .2mg .hdi sf2049tea cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr sf7000 cassette (cass) .wav .flac .bit .tzx sf7000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .sf7 sf7000 printout (prin) .prn sfiii cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiii2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiii2h cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiii2j cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiii2n cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiii3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiii3j cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiii3jr1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiii3n cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiii3na cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiii3nar1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiii3nr1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiii3r1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiii3u cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiii3ur1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiiia cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiiih cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiiij cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiiin cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiiina cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfiiiu cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfish2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfish2j cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sfrush harddisk1 (hard1) .chd .hd .hdv .2mg .hdi sfrush cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr sfrush harddisk2 (hard2) .chd .hd .hdv .2mg .hdi sfrush cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr sfrushrk harddisk1 (hard1) .chd .hd .hdv .2mg .hdi sfrushrk cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr sfrushrk harddisk2 (hard2) .chd .hd .hdv .2mg .hdi sfrushrk cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr sfrushrkw harddisk1 (hard1) .chd .hd .hdv .2mg .hdi sfrushrkw cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr sfrushrkw harddisk2 (hard2) .chd .hd .hdv .2mg .hdi sfrushrkw cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr sfrushrkwo harddisk1 (hard1) .chd .hd .hdv .2mg .hdi sfrushrkwo cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr sfrushrkwo harddisk2 (hard2) .chd .hd .hdv .2mg .hdi sfrushrkwo cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr sfz3ugd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sg1000 cartridge (cart) .bin .sg sg1000m2 cassette (cass) .wav .flac .bit .tzx sg1000m2 cartridge (cart) .bin .sg .sc sg1000m3 cartridge (cart) .bin .sms .sg sg1000m3 card (card) .bin sgx cartridge (cart) .pce .bin sgx cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sh386sx20 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sh386sx20 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sh386sx20 harddisk (hard) .chd .hd .hdv .2mg .hdi shaktam cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr shaktamb cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr shaktmsp cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr shambros cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr shanghss harddisk (hard) .chd .hd .hdv .2mg .hdi shangtou harddisk (hard) .chd .hd .hdv .2mg .hdi sheenhvc cartridge (cart) .bin shikgam2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr shikigam harddisk (hard) .chd .hd .hdv .2mg .hdi shikigama harddisk (hard) .chd .hd .hdv .2mg .hdi shine printout (prin) .prn shine floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk shine cassette (cass) .wav .flac shmc1200 cartridge (cart) .st2 .bin .rom shngmtkbg harddisk (hard) .chd .hd .hdv .2mg .hdi sht3do cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr shtzone cartridge1 (cart1) .bin .sms shtzone cartridge2 (cart2) .bin .sms shtzone cartridge3 (cart3) .bin .sms shtzone cartridge4 (cart4) .bin .sms shtzone cartridge5 (cart5) .bin .sms shutms11 harddisk (hard) .chd .hd .hdv .2mg .hdi shutms11 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr shutms11 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf shutms11 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf shutms11 printout (prin) .prn sianniv harddisk (hard) .chd .hd .hdv .2mg .hdi sicpc1605 cassette (cass) .wav .flac sicpc1605 printout1 (prin1) .prn sicpc1605 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sicpc1605 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sicpc1605 printout2 (prin2) .prn sicpc1605 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi sicpc1605 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi siena ssd (ssd) .rom .bin siena_fr ssd (ssd) .rom .bin simpbowl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr simultano romimage (rom) .bin simultanoa romimage (rom) .bin sintez2 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx sintez2 quickload (quik) .raw .scr sintez2 cassette (cass) .wav .flac .tzx .tap .blk sis85c471 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sis85c471 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sis85c471 harddisk (hard) .chd .hd .hdv .2mg .hdi sis85c471 printout (prin) .prn sis85c496 harddisk (hard) .chd .hd .hdv .2mg .hdi sis85c496 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sis85c496 printout (prin) .prn sisrabb floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sisrabb floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sisrabb harddisk (hard) .chd .hd .hdv .2mg .hdi sisrabb printout (prin) .prn sist1 cassette (cass) .wav .flac .csw .uef sist1 romimage1 (rom1) .rom .bin sist1 romimage2 (rom2) .rom .bin sist1 romimage3 (rom3) .rom .bin sist1 romimage4 (rom4) .rom .bin sist1 romimage5 (rom5) .bin .rom sist1 printout (prin) .prn sist1 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd sist1 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd slashout cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr slicer floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk slotouji cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr slotoujia cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr slvrball632 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr slvrball632 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf slvrball632 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf slvrball632 printout (prin) .prn slvrball720 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr slvrball720 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf slvrball720 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf slvrball720 printout (prin) .prn slvrball806 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr slvrball806 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf slvrball806 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf slvrball806 printout (prin) .prn slvrballbu409 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr slvrballbu409 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf slvrballbu409 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf slvrballbu409 printout (prin) .prn slvrballbu409b cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr slvrballbu409b floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf slvrballbu409b floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf slvrballbu409b printout (prin) .prn sm1810 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi sm1810 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi sm1810 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf sm38640f floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sm38640f floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sm38640f harddisk (hard) .chd .hd .hdv .2mg .hdi sm38640f printout (prin) .prn sm48650usc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sm48650usc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sm48650usc harddisk (hard) .chd .hd .hdv .2mg .hdi sm48650usc printout (prin) .prn smartcyc cartridge (cart) .bin smartvad cartridge (cart) .bin smc777 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk smc777 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk smc777 quickload (quik) .com .cpm smih0107 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf smih0107 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf smih0107 harddisk (hard) .chd .hd .hdv .2mg .hdi smih0107 printout (prin) .prn smondial2 cartridge (cart) .bin sms cartridge (cart) .bin .sms sms1 cartridge (cart) .bin .sms sms1 card (card) .bin sms1000 floppydisk1 (flop1) .img .fdi .td0 .imd .cqm .dsk .d77 .d88 .1dd sms1000 floppydisk2 (flop2) .img .fdi .td0 .imd .cqm .dsk .d77 .d88 .1dd sms1000 punchtape (ptap) .bin .bim .lda sms1br cartridge (cart) .bin .sms sms1br card (card) .bin sms1kr cartridge (cart) .bin .sms .sg sms1kr card (card) .bin sms1krfm cartridge (cart) .bin .sms .sg sms1krfm card (card) .bin sms1pal cartridge (cart) .bin .sms sms1pal card (card) .bin sms1paln cartridge (cart) .bin .sms sms1paln card (card) .bin sms2br cartridge (cart) .bin .sms sms2br card (card) .bin sms2paln cartridge (cart) .bin .sms sms2paln card (card) .bin smsbr cartridge (cart) .bin .sms smsj cartridge (cart) .bin .sms .sg smsj card (card) .bin smskr cartridge (cart) .bin .sms .sg smspal cartridge (cart) .bin .sms smspaln cartridge (cart) .bin .sms smssdisp cartridge1 (cart1) .bin .sms smssdisp cartridge2 (cart2) .bin .sms smssdisp cartridge3 (cart3) .bin .sms smssdisp cartridge4 (cart4) .bin .sms smssdisp cartridge5 (cart5) .bin .sms smssdisp cartridge6 (cart6) .bin .sms smssdisp cartridge7 (cart7) .bin .sms smssdisp cartridge8 (cart8) .bin .sms smssdisp cartridge9 (cart9) .bin .sms smssdisp cartridge10 (cart10) .bin .sms smssdisp cartridge11 (cart11) .bin .sms smssdisp cartridge12 (cart12) .bin .sms smssdisp cartridge13 (cart13) .bin .sms smssdisp cartridge14 (cart14) .bin .sms smssdisp cartridge15 (cart15) .bin .sms smssdisp cartridge16 (cart16) .bin .sms smssdisp card1 (card1) .bin smssdisp card2 (card2) .bin smssdisp card3 (card3) .bin smssdisp card4 (card4) .bin smssdisp card5 (card5) .bin smssdisp card6 (card6) .bin smssdisp card7 (card7) .bin smssdisp card8 (card8) .bin smssdisp card9 (card9) .bin smssdisp card10 (card10) .bin smssdisp card11 (card11) .bin smssdisp card12 (card12) .bin smssdisp card13 (card13) .bin smssdisp card14 (card14) .bin smssdisp card15 (card15) .bin smssdisp card16 (card16) .bin snes cartridge (cart) .sfc snespal cartridge (cart) .sfc snomi286 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf snomi286 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf snomi286 harddisk (hard) .chd .hd .hdv .2mg .hdi snotec cartridge (cart) .bin snotecex cartridge (cart) .bin snotecu cartridge (cart) .bin snotecug cartridge (cart) .bin snotecut cartridge (cart) .bin snread cartridge (cart) .vsm .bin snspell cartridge (cart) .vsm .bin snspellc cartridge (cart) .vsm .bin snspellca cartridge (cart) .vsm .bin snspellfr cartridge (cart) .vsm .bin snspellit cartridge (cart) .vsm .bin snspelljp cartridge (cart) .vsm .bin snspellp cartridge (cart) .vsm .bin snspellsp cartridge (cart) .vsm .bin snspellua cartridge (cart) .vsm .bin snspellub cartridge (cart) .vsm .bin snspelluk cartridge (cart) .vsm .bin snspelluka cartridge (cart) .vsm .bin snwrite cartridge (cart) .vsm .bin so025d2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf so025d2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf so025d2 harddisk (hard) .chd .hd .hdv .2mg .hdi so025d2 printout (prin) .prn so025k2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf so025k2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf so025k2 harddisk (hard) .chd .hd .hdv .2mg .hdi so025k2 printout (prin) .prn so025r2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf so025r2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf so025r2 harddisk (hard) .chd .hd .hdv .2mg .hdi so025r2 printout (prin) .prn so30h harddisk (hard) .chd .hd .hdv .2mg .hdi so30h cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr so30h printout (prin) .prn so4saw2 harddisk (hard) .chd .hd .hdv .2mg .hdi so4saw2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr so4saw2 printout (prin) .prn socrates cartridge (cart) .bin socratfc cartridge (cart) .bin softbox floppydisk1 (flop1) .mfi .dfi .d80 softbox floppydisk2 (flop2) .mfi .dfi .d80 softbox harddisk1 (hard1) .chd .hd .hdv .2mg .hdi softbox harddisk2 (hard2) .chd .hd .hdv .2mg .hdi softbox harddisk3 (hard3) .chd .hd .hdv .2mg .hdi softbox harddisk4 (hard4) .chd .hd .hdv .2mg .hdi sogeki harddisk (hard) .chd .hd .hdv .2mg .hdi sol20 cassette1 (cass1) .wav .flac .svt sol20 cassette2 (cass2) .wav .flac .svt sorcerer bitbanger (bitb) . sorcerer quickload (quik) .bin .snp sorcerer cassette1 (cass1) .wav .flac .tape sorcerer cassette2 (cass2) .wav .flac .tape sorcerer cartridge (cart) .bin .rom sorcerer2 bitbanger (bitb) . sorcerer2 quickload (quik) .bin .snp sorcerer2 cassette1 (cass1) .wav .flac .tape sorcerer2 cassette2 (cass2) .wav .flac .tape sorcerer2 cartridge (cart) .bin .rom sorcerera bitbanger (bitb) . sorcerera quickload (quik) .bin .snp sorcerera cassette1 (cass1) .wav .flac .tape sorcerera cassette2 (cass2) .wav .flac .tape sorcerera cartridge (cart) .bin .rom sorcerera floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sorcerera floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sorcerera floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sorcerera floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sorcererb bitbanger (bitb) . sorcererb quickload (quik) .bin .snp sorcererb cassette1 (cass1) .wav .flac .tape sorcererb cassette2 (cass2) .wav .flac .tape sorcererb floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sorcererb floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sorcererb floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sorcererb floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sorcererd bitbanger (bitb) . sorcererd quickload (quik) .bin .snp sorcererd cassette1 (cass1) .wav .flac .tape sorcererd cassette2 (cass2) .wav .flac .tape sorcererd cartridge (cart) .bin .rom sorcererd floppydisk1 (flop1) .dsk .fdi .td0 .imd .cqm .d77 .d88 .1dd sorcererd floppydisk2 (flop2) .dsk .fdi .td0 .imd .cqm .d77 .d88 .1dd sorcererd floppydisk3 (flop3) .dsk .fdi .td0 .imd .cqm .d77 .d88 .1dd sorcererd floppydisk4 (flop4) .dsk .fdi .td0 .imd .cqm .d77 .d88 .1dd sorcererd floppydisk5 (flop5) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sorcererd floppydisk6 (flop6) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk soundic cartridge (cart) .bin soutenry harddisk (hard) .chd .hd .hdv .2mg .hdi sp3e8bit snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx sp3e8bit quickload (quik) .raw .scr sp3e8bit cassette (cass) .wav .flac .tzx .tap .blk sp3e8bit floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf sp3eata snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx sp3eata quickload (quik) .raw .scr sp3eata cassette (cass) .wav .flac .tzx .tap .blk sp3eata floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf sp3ezcf snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx sp3ezcf quickload (quik) .raw .scr sp3ezcf cassette (cass) .wav .flac .tzx .tap .blk sp3ezcf floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf space84 floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib space84 floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib space84 cassette (cass) .wav .flac spc1000 printout (prin) .prn spc1000 cassette (cass) .wav .flac .tap .cas spc1500 printout (prin) .prn spc1500 cassette (cass) .wav .flac .tap .cas spc4000 quickload (quik) .pgm .tvc spc4000 cartridge (cart) .bin .rom spc400d floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf spc400d floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf spc400d printout (prin) .prn spc800 cartridge (cart) .mx1 .bin .rom spc800 printout (prin) .prn spc800 cassette (cass) .wav .flac .tap .cas .tsx spec128 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx spec128 quickload (quik) .raw .scr spec128 cassette (cass) .wav .flac .tzx .tap .blk spec80k snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx spec80k quickload (quik) .raw .scr spec80k cassette (cass) .wav .flac .tzx .tap .blk specfrce harddisk (hard) .chd .hd .hdv .2mg .hdi specfrceo harddisk (hard) .chd .hd .hdv .2mg .hdi special cassette (cass) .wav .flac .rks specialm cassette (cass) .wav .flac .rks specialp cassette (cass) .wav .flac .rks specide snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx specide quickload (quik) .raw .scr specide cassette (cass) .wav .flac .tzx .tap .blk specimx cassette (cass) .wav .flac .rks specimx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img specimx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .odi .cpm .img specpl2a snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx specpl2a quickload (quik) .raw .scr specpl2a cassette (cass) .wav .flac .tzx .tap .blk specpl3e snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx specpl3e quickload (quik) .raw .scr specpl3e cassette (cass) .wav .flac .tzx .tap .blk specpl3e floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf specpls2 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx specpls2 quickload (quik) .raw .scr specpls2 cassette (cass) .wav .flac .tzx .tap .blk specpls3 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx specpls3 quickload (quik) .raw .scr specpls3 cassette (cass) .wav .flac .tzx .tap .blk specpls3 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ipf spectred floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib spectred floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib spectred cassette (cass) .wav .flac spectrum snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx spectrum quickload (quik) .raw .scr spectrum cassette (cass) .wav .flac .tzx .tap .blk spektr01 cassette (cass) .wav .flac .rk .rkr .gam .g16 .pki spektrbk snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx spektrbk quickload (quik) .raw .scr spektrbk cassette (cass) .wav .flac .tzx .tap .blk spkrbtl cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sprachmg cartridge (cart) .bin sprinter snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx sprinter quickload (quik) .raw .scr sprinter cassette (cass) .wav .flac .tzx .tap .blk sprinter harddisk1 (hard1) .chd .hd .hdv .2mg .hdi sprinter cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sprinter harddisk2 (hard2) .chd .hd .hdv .2mg .hdi sprinter harddisk3 (hard3) .chd .hd .hdv .2mg .hdi sprinter floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd sprinter floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd sprinter floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd sprinter floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd sprtjam cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr spuzbobl harddisk (hard) .chd .hd .hdv .2mg .hdi spuzboblj harddisk (hard) .chd .hd .hdv .2mg .hdi sq2 midiin (min) .mid .syx sq2 midiout (mout) .mid sq2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .hfe squale printout (prin) .prn squale floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk squale floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk squale cartridge (cart) .bin squizchs cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sr16 cassette (cass) .wav .flac ss2005 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ss2005o cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ssam88s floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ssam88s floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ssam88s printout (prin) .prn sscopefh harddisk (hard) .chd .hd .hdv .2mg .hdi sscopex harddisk (hard) .chd .hd .hdv .2mg .hdi sscopexu harddisk (hard) .chd .hd .hdv .2mg .hdi ssem quickload (quik) .snp .asm ssensor4 romimage (rom) .bin sstarkar cartridge (cart) .bin st floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf st printout (prin) .prn st midiin (min) .mid .syx st midiout (mout) .mid st romimage (rom) .bin .rom .stc st_de floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf st_de printout (prin) .prn st_de midiin (min) .mid .syx st_de midiout (mout) .mid st_de romimage (rom) .bin .rom .stc st_es floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf st_es printout (prin) .prn st_es midiin (min) .mid .syx st_es midiout (mout) .mid st_es romimage (rom) .bin .rom .stc st_fr floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf st_fr printout (prin) .prn st_fr midiin (min) .mid .syx st_fr midiout (mout) .mid st_fr romimage (rom) .bin .rom .stc st_nl floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf st_nl printout (prin) .prn st_nl midiin (min) .mid .syx st_nl midiout (mout) .mid st_nl romimage (rom) .bin .rom .stc st_se floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf st_se printout (prin) .prn st_se midiin (min) .mid .syx st_se midiout (mout) .mid st_se romimage (rom) .bin .rom .stc st_sg floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf st_sg printout (prin) .prn st_sg midiin (min) .mid .syx st_sg midiout (mout) .mid st_sg romimage (rom) .bin .rom .stc st_uk floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf st_uk printout (prin) .prn st_uk midiin (min) .mid .syx st_uk midiout (mout) .mid st_uk romimage (rom) .bin .rom .stc starseek cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr startrgn cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ste floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf ste printout (prin) .prn ste midiin (min) .mid .syx ste midiout (mout) .mid ste romimage (rom) .bin .rom .stc ste_de floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf ste_de printout (prin) .prn ste_de midiin (min) .mid .syx ste_de midiout (mout) .mid ste_de romimage (rom) .bin .rom .stc ste_es floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf ste_es printout (prin) .prn ste_es midiin (min) .mid .syx ste_es midiout (mout) .mid ste_es romimage (rom) .bin .rom .stc ste_fr floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf ste_fr printout (prin) .prn ste_fr midiin (min) .mid .syx ste_fr midiout (mout) .mid ste_fr romimage (rom) .bin .rom .stc ste_it floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf ste_it printout (prin) .prn ste_it midiin (min) .mid .syx ste_it midiout (mout) .mid ste_it romimage (rom) .bin .rom .stc ste_se floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf ste_se printout (prin) .prn ste_se midiin (min) .mid .syx ste_se midiout (mout) .mid ste_se romimage (rom) .bin .rom .stc ste_sg floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf ste_sg printout (prin) .prn ste_sg midiin (min) .mid .syx ste_sg midiout (mout) .mid ste_sg romimage (rom) .bin .rom .stc ste_uk floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf ste_uk printout (prin) .prn ste_uk midiin (min) .mid .syx ste_uk midiout (mout) .mid ste_uk romimage (rom) .bin .rom .stc step3 harddisk (hard) .chd .hd .hdv .2mg .hdi step3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr step3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf step3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf step3 printout (prin) .prn stepone floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf stepone floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf stepone floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf stepone floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf stepone printout (prin) .prn stepstag harddisk (hard) .chd .hd .hdv .2mg .hdi stepstag cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr stepstag floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf stepstag floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf stepstag printout (prin) .prn sto486wb floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sto486wb floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sto486wb harddisk (hard) .chd .hd .hdv .2mg .hdi sto486wb printout (prin) .prn storio cartridge (cart) .bin storiode cartridge (cart) .bin storioes cartridge (cart) .bin storioesa cartridge (cart) .bin storiofr cartridge (cart) .bin storionl cartridge (cart) .bin stratos romimage (rom) .bin stratosa romimage (rom) .bin studio2 cartridge (cart) .st2 .bin .rom stvbios cartridge1 (cart1) .bin stvbios cartridge2 (cart2) .bin stvbios cartridge3 (cart3) .bin stvbios cartridge4 (cart4) .bin styphp harddisk (hard) .chd .hd .hdv .2mg .hdi sugorotc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sugorotca cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sugorotcb cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun3_110 harddisk (hard) .chd .hd .hdv .2mg .hdi sun3_110 tape (tap) .tap sun3_110 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun3_150 harddisk (hard) .chd .hd .hdv .2mg .hdi sun3_150 tape (tap) .tap sun3_150 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun3_260 harddisk (hard) .chd .hd .hdv .2mg .hdi sun3_260 tape (tap) .tap sun3_260 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun3_50 harddisk (hard) .chd .hd .hdv .2mg .hdi sun3_50 tape (tap) .tap sun3_50 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun3_60 harddisk (hard) .chd .hd .hdv .2mg .hdi sun3_60 tape (tap) .tap sun3_60 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun3_80 harddisk (hard) .chd .hd .hdv .2mg .hdi sun3_80 tape (tap) .tap sun3_80 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun3_80 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf sun3_e harddisk (hard) .chd .hd .hdv .2mg .hdi sun3_e tape (tap) .tap sun3_e cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun4_110 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf sun4_110 harddisk (hard) .chd .hd .hdv .2mg .hdi sun4_110 tape (tap) .tap sun4_110 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun4_20 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf sun4_20 harddisk (hard) .chd .hd .hdv .2mg .hdi sun4_20 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun4_25 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf sun4_25 harddisk (hard) .chd .hd .hdv .2mg .hdi sun4_25 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun4_300 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf sun4_300 harddisk (hard) .chd .hd .hdv .2mg .hdi sun4_300 tape (tap) .tap sun4_300 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun4_40 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf sun4_40 harddisk (hard) .chd .hd .hdv .2mg .hdi sun4_40 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun4_400 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf sun4_400 harddisk (hard) .chd .hd .hdv .2mg .hdi sun4_400 tape (tap) .tap sun4_400 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun4_50 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf sun4_50 harddisk (hard) .chd .hd .hdv .2mg .hdi sun4_50 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun4_60 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf sun4_60 harddisk (hard) .chd .hd .hdv .2mg .hdi sun4_60 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun4_65 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf sun4_65 harddisk (hard) .chd .hd .hdv .2mg .hdi sun4_65 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun4_75 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf sun4_75 harddisk (hard) .chd .hd .hdv .2mg .hdi sun4_75 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun_s10 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf sun_s10 harddisk (hard) .chd .hd .hdv .2mg .hdi sun_s10 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sun_s20 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf sun_s20 harddisk (hard) .chd .hd .hdv .2mg .hdi sun_s20 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr suntac303 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf suntac303 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf suntac303 harddisk (hard) .chd .hd .hdv .2mg .hdi suntac6 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf suntac6 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf suntac6 harddisk (hard) .chd .hd .hdv .2mg .hdi super6 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk super80 printout (prin) .prn super80 quickload (quik) .bin super80 cassette (cass) .wav .flac super80d printout (prin) .prn super80d quickload (quik) .bin super80d cassette (cass) .wav .flac super80e printout (prin) .prn super80e quickload (quik) .bin super80e cassette (cass) .wav .flac super80m printout (prin) .prn super80m quickload (quik) .bin super80m cassette (cass) .wav .flac super80r printout (prin) .prn super80r quickload (quik) .bin super80r cassette (cass) .wav .flac super80r floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk super80r floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk super80r floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk super80r floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk super80v printout (prin) .prn super80v quickload (quik) .bin super80v cassette (cass) .wav .flac super80v floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk super80v floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk super80v floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk super80v floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk supergb cartridge (cart) .bin .gb .gbc .gbx supergb2 cartridge (cart) .bin .gb .gbc .gbx superpet floppydisk1 (flop1) .mfi .dfi .d80 superpet floppydisk2 (flop2) .mfi .dfi .d80 superpet cassette (cass) .wav .flac .tap superpet quickload (quik) .p00 .prg superpet cartridge1 (cart1) .bin .rom superpet cartridge2 (cart2) .bin .rom supracan cartridge (cart) .bin suprtvpc cartridge (cart) .bin suprtvpcdo cartridge (cart) .bin suprtvpchk cartridge (cart) .bin suprtvpcln cartridge (cart) .bin susume cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr sv8000 cartridge (cart) .bin svi318 cassette (cass) .wav .flac .cas svi318 cartridge (cart) .bin .rom svi318n cassette (cass) .wav .flac .cas svi318n cartridge (cart) .bin .rom svi328 cassette (cass) .wav .flac .cas svi328 cartridge (cart) .bin .rom svi328n cassette (cass) .wav .flac .cas svi328n cartridge (cart) .bin .rom svi728 cartridge (cart) .mx1 .bin .rom svi728 printout (prin) .prn svi728 cassette (cass) .wav .flac .tap .cas .tsx svi728es cartridge (cart) .mx1 .bin .rom svi728es printout (prin) .prn svi728es cassette (cass) .wav .flac .tap .cas .tsx svi738 cartridge (cart) .mx1 .bin .rom svi738 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk svi738 printout (prin) .prn svi738 cassette (cass) .wav .flac .tap .cas .tsx svi738ar cartridge (cart) .mx1 .bin .rom svi738ar floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk svi738ar printout (prin) .prn svi738ar cassette (cass) .wav .flac .tap .cas .tsx svi738dk cartridge (cart) .mx1 .bin .rom svi738dk floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk svi738dk printout (prin) .prn svi738dk cassette (cass) .wav .flac .tap .cas .tsx svi738pl cartridge (cart) .mx1 .bin .rom svi738pl floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk svi738pl printout (prin) .prn svi738pl cassette (cass) .wav .flac .tap .cas .tsx svi738sp cartridge (cart) .mx1 .bin .rom svi738sp floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk svi738sp printout (prin) .prn svi738sp cassette (cass) .wav .flac .tap .cas .tsx svi738sw cartridge (cart) .mx1 .bin .rom svi738sw floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk svi738sw printout (prin) .prn svi738sw cassette (cass) .wav .flac .tap .cas .tsx svision cartridge (cart) .bin .ws .sv svisionn cartridge (cart) .bin .ws .sv svisionp cartridge (cart) .bin .ws .sv svisions cartridge (cart) .bin .ws .sv svmu quickload (quik) .vms .bin swe1pb harddisk (hard) .chd .hd .hdv .2mg .hdi swtpc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 swtpc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 swtpc floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 swtpc floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 swtpc09 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .dsk swtpc09 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .dsk swtpc09 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .dsk swtpc09 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .dsk swtpc09d3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .dsk swtpc09d3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .dsk swtpc09d3 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .dsk swtpc09d3 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .dsk swtpc09d3 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi swtpc09d3 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi swtpc09d3 harddisk3 (hard3) .chd .hd .hdv .2mg .hdi swtpc09d3 harddisk4 (hard4) .chd .hd .hdv .2mg .hdi swtpc09i floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 swtpc09i floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 swtpc09i floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 swtpc09i floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 swtpc09i harddisk (hard) .chd .hd .hdv .2mg .hdi swtpc09o floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 swtpc09o floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 swtpc09o floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 swtpc09o floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 swtpc09u floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .dsk swtpc09u floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .dsk swtpc09u floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .dsk swtpc09u floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .dsk swtpcm floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 swtpcm floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 swtpcm floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 swtpcm floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .os9 sx100 cartridge (cart) .mx1 .bin .rom sx100 printout (prin) .prn sx100 cassette (cass) .wav .flac .tap .cas .tsx sx16 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sx16 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sx16 printout (prin) .prn sx64 cassette (cass) .wav .flac .tap sx64 floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 sx64 cartridge (cart) .80 .a0 .e0 .crt sx64 quickload (quik) .p00 .prg .t64 sx64p cassette (cass) .wav .flac .tap sx64p floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 sx64p cartridge (cart) .80 .a0 .e0 .crt sx64p quickload (quik) .p00 .prg .t64 sy012 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sy012 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sy012 harddisk (hard) .chd .hd .hdv .2mg .hdi sy012 printout (prin) .prn sy019hi floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sy019hi floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sy019hi harddisk (hard) .chd .hd .hdv .2mg .hdi sy019hi printout (prin) .prn sybaby386 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sybaby386 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf sybaby386 harddisk (hard) .chd .hd .hdv .2mg .hdi sybaby386 printout (prin) .prn sym1 cassette (cass) .wav .flac sys80 cassette (cass) .wav .flac .cas sys80 quickload (quik) .cmd sys80 floppydisk1 (flop1) .mfi .dfi .dmk .jv1 .dsk sys80 floppydisk2 (flop2) .mfi .dfi .dmk .jv1 .dsk sys80 printout (prin) .prn sys80p cassette (cass) .wav .flac .cas sys80p quickload (quik) .cmd sys80p floppydisk1 (flop1) .mfi .dfi .dmk .jv1 .dsk sys80p floppydisk2 (flop2) .mfi .dfi .dmk .jv1 .dsk sys80p printout (prin) .prn systel100 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk sz1 midiin (min) .mid .syx sz1 midiout (mout) .mid sz1 cassette (cass) .wav .flac sz1 cartridge (cart) .bin t1000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf t1000 printout (prin) .prn t1000hx floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf t1000hx printout (prin) .prn t1000rl floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf t1000rl printout (prin) .prn t1000sl2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf t1000sl2 printout (prin) .prn t1000sx floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf t1000sx printout (prin) .prn t1000tl floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf t1000tl printout (prin) .prn t1000tl2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf t1000tl2 printout (prin) .prn t1000tx floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf t1000tx printout (prin) .prn t2000sx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf t2000sx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf t2000sx harddisk (hard) .chd .hd .hdv .2mg .hdi t4000 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf t4000 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf t4000 harddisk (hard) .chd .hd .hdv .2mg .hdi t4000 printout (prin) .prn t4426 cassette (cass) .wav .flac .cas t4426 printout (prin) .prn t4426 cartridge (cart) .ccc .rom t4426 harddisk1 (hard1) .vhd t4426 harddisk2 (hard2) .vhd t9000 cassette (cass) .wav .k7 t9000 cartridge (cart) .m7 .rom ta1700pc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ta1700pc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ta1700pc printout (prin) .prn tadpc200 cartridge (cart) .mx1 .bin .rom tadpc200 printout (prin) .prn tadpc200 cassette (cass) .wav .flac .tap .cas .tsx tadpc200a cartridge (cart) .mx1 .bin .rom tadpc200a printout (prin) .prn tadpc200a cassette (cass) .wav .flac .tap .cas .tsx tadpc200b cartridge (cart) .mx1 .bin .rom tadpc200b printout (prin) .prn tadpc200b cassette (cass) .wav .flac .tap .cas .tsx taiko2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr taiko3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr taiko4 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr taiko5 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr taiko6 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr taikodp cartridge (cart) .bin .u1 taikort cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr taitotz harddisk (hard) .chd .hd .hdv .2mg .hdi tak_daig cartridge (cart) .bin .u1 takoron cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr tam25p2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf tam25p2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf tam25p2 harddisk (hard) .chd .hd .hdv .2mg .hdi tam25p2 printout (prin) .prn tam3340ma0 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf tam3340ma0 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf tam3340ma0 harddisk (hard) .chd .hd .hdv .2mg .hdi tam3340ma0 printout (prin) .prn tandy102 printout (prin) .prn tandy102 cassette (cass) .wav .flac tandy102 cartridge (cart) .bin .rom tandy200 printout (prin) .prn tandy200 cassette (cass) .wav .flac tandy200 cartridge (cart) .bin .rom tandy2k floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk tandy2k floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk tandy2k printout (prin) .prn tandy2khd floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk tandy2khd floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk tandy2khd printout (prin) .prn tandy2khd harddisk (hard) .chd .hd .hdv .2mg .hdi tanodr64 cassette (cass) .wav .flac .cas tanodr64 printout (prin) .prn tanodr64 cartridge (cart) .ccc .rom tanodr64 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 tanodr64 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 tanodr64h cassette (cass) .wav .flac .cas tanodr64h printout (prin) .prn tanodr64h cartridge (cart) .ccc .rom tanodr64h floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 tanodr64h floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk .sdf .jvc .vdk .os9 tbblue quickload (quik) .raw .scr tbblue cassette (cass) .wav .flac .tzx .tap .blk tbblue harddisk1 (hard1) .chd .hd .hdv .2mg .hdi tbblue harddisk2 (hard2) .chd .hd .hdv .2mg .hdi tbbympt3 cartridge (cart) .bin tblkkuzug harddisk (hard) .chd .hd .hdv .2mg .hdi tc2048 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx tc2048 quickload (quik) .raw .scr tc2048 cassette (cass) .wav .flac .tzx .tap .blk tc4 cartridge (cart) .bin tccosmos cartridge (cart) .bin tcfboxa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr td4ipaio floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf td4ipaio floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf td4ipaio harddisk (hard) .chd .hd .hdv .2mg .hdi td4ipaio printout (prin) .prn td60c floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf td60c floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf td60c harddisk (hard) .chd .hd .hdv .2mg .hdi td70a floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf td70a floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf td70a harddisk (hard) .chd .hd .hdv .2mg .hdi td70n floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf td70n floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf td70n harddisk (hard) .chd .hd .hdv .2mg .hdi tdv2324 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk tdv2324 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk tecjmon cassette (cass) .wav .flac tek4051 cartridge1 (cart1) .bin tek4051 cartridge2 (cart2) .bin tek4052a cartridge1 (cart1) .bin tek4052a cartridge2 (cart2) .bin tek4132 harddisk (hard) .chd .hd .hdv .2mg .hdi tek4404 harddisk (hard) .chd .hd .hdv .2mg .hdi tek4404 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk tek6130 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk tek6130 harddisk (hard) .chd .hd .hdv .2mg .hdi telefevr cartridge (cart) .bin telestry cartridge (cart) .bin telngtcs quickload (quik) .pgm .tvc telngtcs cartridge (cart) .bin .rom telstrat printout (prin) .prn telstrat cassette (cass) .wav .flac .tap telstrat floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk tempestm cartridge (cart) .bin tenthdeg harddisk1 (hard1) .chd .hd .hdv .2mg .hdi tenthdeg cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr tenthdeg harddisk2 (hard2) .chd .hd .hdv .2mg .hdi tenthdeg cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr tenup floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk teradrive floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf teradrive floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf teradrive harddisk (hard) .chd .hd .hdv .2mg .hdi teradrive printout (prin) .prn teradrive cartridge (cart) .smd .bin .md .gen teradrive3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf teradrive3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf teradrive3 harddisk (hard) .chd .hd .hdv .2mg .hdi teradrive3 printout (prin) .prn teradrive3 cartridge (cart) .smd .bin .md .gen tesa6240 cassette (cass) .wav .flac .tap tesa6240 floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 tesa6240 cartridge (cart) .80 .a0 .e0 .crt tesa6240 quickload (quik) .p00 .prg .t64 tetkiwam cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr tfupdate cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr tg16 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr tg16 cartridge (cart) .pce .bin thenanpa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr thrild2 harddisk (hard) .chd .hd .hdv .2mg .hdi thrild2a harddisk (hard) .chd .hd .hdv .2mg .hdi thrild2c harddisk (hard) .chd .hd .hdv .2mg .hdi thrild2j harddisk (hard) .chd .hd .hdv .2mg .hdi ti74 cartridge (cart) .bin .rom .256 ti74a cartridge (cart) .bin .rom .256 ti95 cartridge (cart) .bin .rom .256 ti990_10 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi ti990_10 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi ti990_10 harddisk3 (hard3) .chd .hd .hdv .2mg .hdi ti990_10 harddisk4 (hard4) .chd .hd .hdv .2mg .hdi ti990_10 magtape1 (mtap1) .tap ti990_10 magtape2 (mtap2) .tap ti990_10 magtape3 (mtap3) .tap ti990_10 magtape4 (mtap4) .tap ti99_224 cassette (cass) .wav .flac ti99_232 cassette (cass) .wav .flac ti99_4 cartridge (cart) .rpk ti99_4 cassette1 (cass1) .wav .flac ti99_4 cassette2 (cass2) .wav .flac ti99_4a cartridge (cart) .rpk ti99_4a cassette1 (cass1) .wav .flac ti99_4a cassette2 (cass2) .wav .flac ti99_4ae cartridge (cart) .rpk ti99_4ae cassette1 (cass1) .wav .flac ti99_4ae cassette2 (cass2) .wav .flac ti99_4e cartridge (cart) .rpk ti99_4e cassette1 (cass1) .wav .flac ti99_4e cassette2 (cass2) .wav .flac ti99_4ev cartridge (cart) .rpk ti99_4ev cassette1 (cass1) .wav .flac ti99_4ev cassette2 (cass2) .wav .flac ti99_4p cassette (cass) .wav .flac ti99_4qi cartridge (cart) .rpk ti99_4qi cassette1 (cass1) .wav .flac ti99_4qi cassette2 (cass2) .wav .flac ti99_8 cartridge (cart) .rpk ti99_8 cassette (cass) .wav .flac ti99_8e cartridge (cart) .rpk ti99_8e cassette (cass) .wav .flac tijkpots harddisk (hard) .chd .hd .hdv .2mg .hdi tiki100 harddisk1 (hard1) .chd .hd .hdv .2mg .hdi tiki100 harddisk2 (hard2) .chd .hd .hdv .2mg .hdi tiki100 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk tiki100 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk tiki100 printout (prin) .prn tiki100 cassette (cass) .wav .flac tim011 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img timetp25 cartridge (cart) .bin tk2000 cassette (cass) .wav .flac tk3000 floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib tk3000 floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib tk3000 cassette (cass) .wav .flac tk85 cassette (cass) .wav .flac .p .81 .tzx tk90x snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx tk90x quickload (quik) .raw .scr tk90x cassette (cass) .wav .flac .tzx .tap .blk tk95 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx tk95 quickload (quik) .raw .scr tk95 cassette (cass) .wav .flac .tzx .tap .blk tking romimage (rom) .bin tkinga romimage (rom) .bin tkingb romimage (rom) .bin tkn80 cassette (cass) .wav .flac tkn80 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img tkn80 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img tkn80 romimage1 (rom1) .bin tkn80 romimage2 (rom2) .bin tkn80 romimage3 (rom3) .bin tkn80 romimage4 (rom4) .bin tkn80 quickload (quik) .bac tmc1800 quickload (quik) .bin tmc1800 cassette (cass) .wav .flac tmc2000 quickload (quik) .bin tmc2000 cassette (cass) .wav .flac tmc2000e cassette (cass) .wav .flac tmc600s2 printout (prin) .prn tmc600s2 cassette (cass) .wav .flac tmc600s2 quickload (quik) .tmc600 tmosh cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr tmoshs cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr tmoshsp cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr tmoshspa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr tmpat48av floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf tmpat48av floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf tmpat48av harddisk (hard) .chd .hd .hdv .2mg .hdi tmpat48av printout (prin) .prn tmpat48pg4 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf tmpat48pg4 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf tmpat48pg4 harddisk (hard) .chd .hd .hdv .2mg .hdi tmpat48pg4 printout (prin) .prn tntell cartridge (cart) .vsm .bin tntellfr cartridge (cart) .vsm .bin tntellp cartridge (cart) .vsm .bin tntelluk cartridge (cart) .vsm .bin to16 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf to16 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf to16 printout (prin) .prn to7 cassette (cass) .wav .k7 to7 cartridge (cart) .m7 .rom to770 cassette (cass) .wav .k7 to770 cartridge (cart) .m7 .rom to770a cassette (cass) .wav .k7 to770a cartridge (cart) .m7 .rom to8 cassette (cass) .wav .k7 to8 cartridge (cart) .m7 .rom to8 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .fd .sap to8 printout (prin) .prn to8d cassette (cass) .wav .k7 to8d cartridge (cart) .m7 .rom to8d floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .fd .sap to8d printout (prin) .prn to9 cassette (cass) .wav .k7 to9 cartridge (cart) .m7 .rom to9 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .fd .sap to9 printout (prin) .prn to9p cassette (cass) .wav .k7 to9p cartridge (cart) .m7 .rom to9p floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .fd .sap to9p printout (prin) .prn tonto microtape1 (utap1) .mdv .mdr tonto microtape2 (utap2) .mdv .mdr tonto cartridge (cart) .rom .bin toptek286 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf toptek286 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf toptek286 harddisk (hard) .chd .hd .hdv .2mg .hdi torarech cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr torch301 cassette (cass) .wav .flac .csw .uef torch301 romimage1 (rom1) .rom .bin torch301 romimage2 (rom2) .rom .bin torch301 romimage3 (rom3) .rom .bin torch301 romimage4 (rom4) .rom .bin torch301 romimage5 (rom5) .bin .rom torch301 printout (prin) .prn torch301 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd torch301 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd torch301 harddisk (hard) .chd .hd .hdv .2mg .hdi torch725 cassette (cass) .wav .flac .csw .uef torch725 romimage1 (rom1) .rom .bin torch725 romimage2 (rom2) .rom .bin torch725 romimage3 (rom3) .rom .bin torch725 romimage4 (rom4) .rom .bin torch725 romimage5 (rom5) .bin .rom torch725 printout (prin) .prn torch725 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd torch725 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd torch725 harddisk (hard) .chd .hd .hdv .2mg .hdi torchf cassette (cass) .wav .flac .csw .uef torchf romimage1 (rom1) .rom .bin torchf romimage2 (rom2) .rom .bin torchf romimage3 (rom3) .rom .bin torchf romimage4 (rom4) .rom .bin torchf romimage5 (rom5) .bin .rom torchf printout (prin) .prn torchf floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd torchf floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd torchh cassette (cass) .wav .flac .csw .uef torchh romimage1 (rom1) .rom .bin torchh romimage2 (rom2) .rom .bin torchh romimage3 (rom3) .rom .bin torchh romimage4 (rom4) .rom .bin torchh romimage5 (rom5) .bin .rom torchh printout (prin) .prn torchh floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd torchh floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .ssd .bbc .dsd .adf .ads .adm .adl .fsd torchh harddisk (hard) .chd .hd .hdv .2mg .hdi tosh1000 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf tosh1000 printout (prin) .prn tot3200sxc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf tot3200sxc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf tot3200sxc harddisk (hard) .chd .hd .hdv .2mg .hdi totlvica cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr totlvice cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr totlvicj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr totlvicu cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr tourvis cartridge (cart) .bin tower386sx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf tower386sx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf tower386sx harddisk (hard) .chd .hd .hdv .2mg .hdi towerat2xx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf towerat2xx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf towerat2xx harddisk (hard) .chd .hd .hdv .2mg .hdi tpad600e harddisk (hard) .chd .hd .hdv .2mg .hdi tpad600e cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr tpad600e printout (prin) .prn tpc310 cartridge (cart) .mx1 .bin .rom tpc310 printout (prin) .prn tpc310 cassette (cass) .wav .flac .tap .cas .tsx tpp311 printout (prin) .prn tpp311 cassette (cass) .wav .flac .tap .cas .tsx tps312 cartridge (cart) .mx1 .bin .rom tps312 printout (prin) .prn tps312 cassette (cass) .wav .flac .tap .cas .tsx tr707 midiin (min) .mid .syx tr707 midiout (mout) .mid tr707 cartridge (cart) .m64c_cart tr727 midiin (min) .mid .syx tr727 midiout (mout) .mid tr727 cartridge (cart) .m64c_cart tr909 cartridge (cart) .bin trakcvg cartridge (cart) .bin treasurh harddisk (hard) .chd .hd .hdv .2mg .hdi treasurh cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr trgheart cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr trghearto cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr triplex harddisk (hard) .chd .hd .hdv .2mg .hdi triplex printout (prin) .prn triton41 cassette (cass) .wav .flac triton41 romimage1 (rom1) .rom .bin triton41 romimage2 (rom2) .rom .bin triton41 printout (prin) .prn triton51 cassette (cass) .wav .flac triton51 romimage1 (rom1) .rom .bin triton51 romimage2 (rom2) .rom .bin triton51 printout (prin) .prn triton52 cassette (cass) .wav .flac triton52 romimage1 (rom1) .rom .bin triton52 romimage2 (rom2) .rom .bin triton52 printout (prin) .prn triton72 cassette (cass) .wav .flac triton72 romimage1 (rom1) .rom .bin triton72 romimage2 (rom2) .rom .bin triton72 printout (prin) .prn trizeal cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr tropchnc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr trs80 cassette (cass) .wav .flac .cas trs80l2 cassette (cass) .wav .flac .cas trs80l2 quickload (quik) .cmd trs80l2 floppydisk1 (flop1) .mfi .dfi .dmk .jv1 .dsk trs80l2 floppydisk2 (flop2) .mfi .dfi .dmk .jv1 .dsk trs80l2 printout (prin) .prn trs80m16 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk trs80m16 printout (prin) .prn trs80m2 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk trs80m2 printout (prin) .prn trs80m3 cassette (cass) .wav .flac .cas trs80m3 quickload (quik) .cmd trs80m3 floppydisk1 (flop1) .mfi .dfi .imd .jv3 .dsk .dmk .jv1 trs80m3 floppydisk2 (flop2) .mfi .dfi .imd .jv3 .dsk .dmk .jv1 trs80m3 printout (prin) .prn trs80m4 cassette (cass) .wav .flac .cas trs80m4 floppydisk1 (flop1) .mfi .dfi .imd .jv3 .dsk .dmk .jv1 trs80m4 floppydisk2 (flop2) .mfi .dfi .imd .jv3 .dsk .dmk .jv1 trs80m4 printout (prin) .prn trs80m4p floppydisk1 (flop1) .mfi .dfi .imd .jv3 .dsk .dmk .jv1 trs80m4p floppydisk2 (flop2) .mfi .dfi .imd .jv3 .dsk .dmk .jv1 trs80m4p printout (prin) .prn trsm100 printout (prin) .prn trsm100 cassette (cass) .wav .flac trsm100 cartridge (cart) .bin .rom truckk cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr tryomvgc cartridge (cart) .bin ts1000 cassette (cass) .wav .flac .p .81 .tzx ts1500 cassette (cass) .wav .flac .p .81 .tzx ts2068 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx ts2068 quickload (quik) .raw .scr ts2068 cassette (cass) .wav .flac .tzx .tap .blk ts2068 cartridge (cart) .dck .bin ts34t25 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ts34t25 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf ts34t25 harddisk (hard) .chd .hd .hdv .2mg .hdi ts34t25 printout (prin) .prn ts802 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ts802h floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ts803h floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ts803h floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk tsconf snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx tsconf quickload (quik) .raw .scr tsconf cassette (cass) .wav .flac .tzx .tap .blk tsconf harddisk (hard) .chd .hd .hdv .2mg .hdi tsconf floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd tsconf floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd tsconf floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd tsconf floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd tsconf2 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx tsconf2 quickload (quik) .raw .scr tsconf2 cassette (cass) .wav .flac .tzx .tap .blk tsconf2 harddisk (hard) .chd .hd .hdv .2mg .hdi tsconf2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd tsconf2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd tsconf2 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd tsconf2 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .trd tstar432 romimage (rom) .bin tstar432a romimage (rom) .bin tstar432b romimage (rom) .bin tsurugi harddisk (hard) .chd .hd .hdv .2mg .hdi tsurugij harddisk (hard) .chd .hd .hdv .2mg .hdi tsuwaku cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr tt030 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf tt030 printout (prin) .prn tt030 midiin (min) .mid .syx tt030 midiout (mout) .mid tt030 romimage (rom) .bin .rom .stc tt030_de floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf tt030_de printout (prin) .prn tt030_de midiin (min) .mid .syx tt030_de midiout (mout) .mid tt030_de romimage (rom) .bin .rom .stc tt030_fr floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf tt030_fr printout (prin) .prn tt030_fr midiin (min) .mid .syx tt030_fr midiout (mout) .mid tt030_fr romimage (rom) .bin .rom .stc tt030_pl floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf tt030_pl printout (prin) .prn tt030_pl midiin (min) .mid .syx tt030_pl midiout (mout) .mid tt030_pl romimage (rom) .bin .rom .stc tt030_uk floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .st .msa .stx .ipf tt030_uk printout (prin) .prn tt030_uk midiin (min) .mid .syx tt030_uk midiout (mout) .mid tt030_uk romimage (rom) .bin .rom .stc ttrail floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk ttwistbq cartridge (cart) .bin ttwistfb cartridge (cart) .bin ttwistm cartridge (cart) .bin ttwistsp cartridge (cart) .bin ttwistvc cartridge (cart) .bin tulip1 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk tulip1 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk tunixha cartridge (cart) .bin turboex cartridge (cart) .bin turfwld3 harddisk (hard) .chd .hd .hdv .2mg .hdi turrett harddisk (hard) .chd .hd .hdv .2mg .hdi tutor printout (prin) .prn tutor cassette (cass) .wav .flac tutor cartridge (cart) .bin tvc4000 quickload (quik) .pgm .tvc tvc4000 cartridge (cart) .bin .rom tvc64 printout (prin) .prn tvc64 cartridge (cart) .bin .rom .crt tvc64 cassette (cass) .wav .flac .cas tvc64 quickload (quik) .cas tvc64p printout (prin) .prn tvc64p cartridge (cart) .bin .rom .crt tvc64p cassette (cass) .wav .flac .cas tvc64p quickload (quik) .cas tvc64pru printout (prin) .prn tvc64pru cartridge (cart) .bin .rom .crt tvc64pru cassette (cass) .wav .flac .cas tvc64pru quickload (quik) .cas tvdear cartridge (cart) .bin tvg2000 cartridge (cart) .bin tvgogo cartridge (cart) .bin tvlinkp cartridge (cart) .bin .ws .sv twinnet floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf twinnet floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf twinnet harddisk (hard) .chd .hd .hdv .2mg .hdi tx8000 snapshot (dump) .vz tx8000 cassette (cass) .wav .flac .cas u3911v3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf u3911v3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf u3911v3 harddisk (hard) .chd .hd .hdv .2mg .hdi uchroma68 cassette (cass) .wav .flac ucv102 cartridge (cart) .mx1 .bin .rom ucv102 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk ucv102 printout (prin) .prn ujlnow cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr uk101 cassette (cass) .wav .flac uk2086 snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx uk2086 quickload (quik) .raw .scr uk2086 cassette (cass) .wav .flac .tzx .tap .blk uk2086 cartridge (cart) .dck .bin uknc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .bkd uknc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .bkd uknc floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .bkd uknc floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .bkd uknc cassette (cass) .wav .flac um486 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf um486 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf um486 harddisk (hard) .chd .hd .hdv .2mg .hdi um486 printout (prin) .prn um486v floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf um486v floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf um486v harddisk (hard) .chd .hd .hdv .2mg .hdi um486v printout (prin) .prn um82c481af floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf um82c481af floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf um82c481af harddisk (hard) .chd .hd .hdv .2mg .hdi um82c481af printout (prin) .prn um82c491f floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf um82c491f floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf um82c491f harddisk (hard) .chd .hd .hdv .2mg .hdi um82c491f printout (prin) .prn um82c493f floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf um82c493f floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf um82c493f harddisk (hard) .chd .hd .hdv .2mg .hdi um82c493f printout (prin) .prn um8498f floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf um8498f floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf um8498f harddisk (hard) .chd .hd .hdv .2mg .hdi um8498f printout (prin) .prn um8810paio floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf um8810paio floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf um8810paio harddisk (hard) .chd .hd .hdv .2mg .hdi um8810paio printout (prin) .prn um8886 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf um8886 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf um8886 harddisk (hard) .chd .hd .hdv .2mg .hdi um8886 printout (prin) .prn undefeat cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr unga cassette (cass) .wav .flac .rks uni386w floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf uni386w floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf uni386w harddisk (hard) .chd .hd .hdv .2mg .hdi uni386w printout (prin) .prn uni4800 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf uni4800 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf uni4800 harddisk (hard) .chd .hd .hdv .2mg .hdi uni4800 printout (prin) .prn uniap2en floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib uniap2en floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib uniap2en cassette (cass) .wav .flac uniap2pt floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib uniap2pt floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib uniap2pt cassette (cass) .wav .flac unichamp cartridge (cart) .bin .rom unior cassette (cass) .wav .flac unitron floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg unitron floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg uniwb4407 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf uniwb4407 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf uniwb4407 harddisk (hard) .chd .hd .hdv .2mg .hdi uniwb4407 printout (prin) .prn usagi harddisk (hard) .chd .hd .hdv .2mg .hdi usagiym cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr ut88 cassette (cass) .wav .flac .rku ut88mini cassette (cass) .wav .flac .rku utrn1024 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg utrn1024 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .dc42 .woz .moof .2mg utrn1024 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr utrn1024 harddisk (hard) .chd .hd .hdv .2mg .hdi uzebox cartridge (cart) .bin .uze v1050 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk v1050 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk v1050 harddisk (hard) .chd .hd .hdv .2mg .hdi v1050 printout (prin) .prn v286c floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf v286c floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf v286c harddisk (hard) .chd .hd .hdv .2mg .hdi v364 cassette (cass) .wav .flac .tap v364 floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 v364 cartridge (cart) .rom .bin v364 quickload (quik) .p00 .prg v4p895p3 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf v4p895p3 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf v4p895p3 harddisk (hard) .chd .hd .hdv .2mg .hdi v4p895p3 printout (prin) .prn v6809 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk v6809 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk vaportrx harddisk1 (hard1) .chd .hd .hdv .2mg .hdi vaportrx cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr vaportrx harddisk2 (hard2) .chd .hd .hdv .2mg .hdi vaportrx cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr vaportrxp harddisk1 (hard1) .chd .hd .hdv .2mg .hdi vaportrxp cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr vaportrxp harddisk2 (hard2) .chd .hd .hdv .2mg .hdi vaportrxp cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr vathlete cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vax785 floppydisk1 (flop1) .img .fdi .td0 .imd .cqm .dsk .d77 .d88 .1dd vax785 floppydisk2 (flop2) .img .fdi .td0 .imd .cqm .dsk .d77 .d88 .1dd vbaby cartridge (cart) .bin vboy cartridge (cart) .vb .bin vc4000 quickload (quik) .pgm .tvc vc4000 cartridge (cart) .bin .rom vc6000 quickload (quik) .pgm .tvc vc6000 cartridge (cart) .bin .rom vcircle harddisk (hard) .chd .hd .hdv .2mg .hdi vcop3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vcop3a cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vdmaster cartridge (cart) .bin vec1200 cassette (cass) .wav .flac vec1200 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .fdd vec1200 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .fdd vec1200 cartridge (cart) .bin .emr vector06 cassette (cass) .wav .flac vector06 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .fdd vector06 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .fdd vector06 cartridge (cart) .bin .emr vector1 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk vector1 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk vector4 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .vgi vector4 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .vgi vector4 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .vgi vector4 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .vgi vectrex cartridge (cart) .bin .gam .vec vesta cassette (cass) .wav .flac .tap .cas .tsx vf4 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vf4b cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vf4evo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vf4evoa cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vf4evob cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vf4o cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vf4tuned cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vf4tuneda cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vf4tunedd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vfx midiin (min) .mid .syx vfx midiout (mout) .mid vfx cartridge (cart) .rom .cart .eeprom.sc32 vfxsd midiin (min) .mid .syx vfxsd midiout (mout) .mid vfxsd cartridge (cart) .rom .cart .eeprom.sc32 vfxsd floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img .hfe vg5k cassette (cass) .wav .flac .k7 vg5k printout (prin) .prn vg8000 cartridge1 (cart1) .mx1 .bin .rom vg8000 cartridge2 (cart2) .mx1 .bin .rom vg8000 cassette (cass) .wav .flac .tap .cas .tsx vg8010 cartridge1 (cart1) .mx1 .bin .rom vg8010 cartridge2 (cart2) .mx1 .bin .rom vg8010 cassette (cass) .wav .flac .tap .cas .tsx vg8010f cartridge1 (cart1) .mx1 .bin .rom vg8010f cartridge2 (cart2) .mx1 .bin .rom vg8010f cassette (cass) .wav .flac .tap .cas .tsx vg802000 cartridge1 (cart1) .mx1 .bin .rom vg802000 cartridge2 (cart2) .mx1 .bin .rom vg802000 printout (prin) .prn vg802000 cassette (cass) .wav .flac .tap .cas .tsx vg802020 cartridge1 (cart1) .mx1 .bin .rom vg802020 cartridge2 (cart2) .mx1 .bin .rom vg802020 printout (prin) .prn vg802020 cassette (cass) .wav .flac .tap .cas .tsx vg8020f cartridge1 (cart1) .mx1 .bin .rom vg8020f cartridge2 (cart2) .mx1 .bin .rom vg8020f printout (prin) .prn vg8020f cassette (cass) .wav .flac .tap .cas .tsx vg8230 cartridge1 (cart1) .mx1 .bin .rom vg8230 cartridge2 (cart2) .mx1 .bin .rom vg8230 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk vg8230 printout (prin) .prn vg8230 cassette (cass) .wav .flac .tap .cas .tsx vg8235 cartridge1 (cart1) .mx1 .bin .rom vg8235 cartridge2 (cart2) .mx1 .bin .rom vg8235 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk vg8235 printout (prin) .prn vg8235 cassette (cass) .wav .flac .tap .cas .tsx vg8235f cartridge1 (cart1) .mx1 .bin .rom vg8235f cartridge2 (cart2) .mx1 .bin .rom vg8235f floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk vg8235f printout (prin) .prn vg8235f cassette (cass) .wav .flac .tap .cas .tsx vg8240 cartridge1 (cart1) .mx1 .bin .rom vg8240 cartridge2 (cart2) .mx1 .bin .rom vg8240 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk vg8240 printout (prin) .prn vg8240 cassette (cass) .wav .flac .tap .cas .tsx vgmplay quickload (quik) .vgm .vgz via4386vio floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf via4386vio floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf via4386vio harddisk (hard) .chd .hd .hdv .2mg .hdi via4386vio printout (prin) .prn vic10 cassette (cass) .wav .flac .tap vic10 cartridge (cart) .80 .e0 vic1001 cartridge (cart) .20 .40 .60 .70 .a0 .b0 .crt vic1001 cassette (cass) .wav .flac .tap vic1001 floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 vic1001 quickload (quik) .p00 .prg vic20 cartridge (cart) .20 .40 .60 .70 .a0 .b0 .crt vic20 cassette (cass) .wav .flac .tap vic20 floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 vic20 quickload (quik) .p00 .prg vic20_se cartridge (cart) .20 .40 .60 .70 .a0 .b0 .crt vic20_se cassette (cass) .wav .flac .tap vic20_se floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 vic20_se quickload (quik) .p00 .prg vic20p cartridge (cart) .20 .40 .60 .70 .a0 .b0 .crt vic20p cassette (cass) .wav .flac .tap vic20p floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 vic20p quickload (quik) .p00 .prg victhc80 cartridge1 (cart1) .mx1 .bin .rom victhc80 cartridge2 (cart2) .mx1 .bin .rom victhc80 printout (prin) .prn victhc80 cassette (cass) .wav .flac .tap .cas .tsx victhc90 cartridge (cart) .mx1 .bin .rom victhc90 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk victhc90 printout (prin) .prn victhc90 cassette (cass) .wav .flac .tap .cas .tsx victhc90a cartridge (cart) .mx1 .bin .rom victhc90a floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk victhc90a printout (prin) .prn victhc90a cassette (cass) .wav .flac .tap .cas .tsx victhc95 cartridge (cart) .mx1 .bin .rom victhc95 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk victhc95 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk victhc95 printout (prin) .prn victhc95 cassette (cass) .wav .flac .tap .cas .tsx victhc95a cartridge (cart) .mx1 .bin .rom victhc95a floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk victhc95a floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk victhc95a printout (prin) .prn victhc95a cassette (cass) .wav .flac .tap .cas .tsx victor cassette (cass) .wav .flac .k7 .cin .for victor printout (prin) .prn victor9k printout (prin) .prn victor9k floppydisk1 (flop1) .mfi .dfi .img victor9k floppydisk2 (flop2) .mfi .dfi .img victor9k harddisk (hard) .chd .hd .hdv .2mg .hdi vidbrain cartridge (cart) .bin videoart cartridge (cart) .bin videopac cartridge (cart) .bin .rom videopacf cartridge (cart) .bin .rom videopacp cartridge (cart) .bin .rom vii cartridge (cart) .bin vip quickload (quik) .bin .c8 vip cassette (cass) .wav .flac vip64 cassette (cass) .wav .flac .tap vip64 floppydisk (flop) .mfi .dfi .d64 .g64 .g41 .g71 vip64 cartridge (cart) .80 .a0 .e0 .crt vip64 quickload (quik) .p00 .prg .t64 virtpool harddisk1 (hard1) .chd .hd .hdv .2mg .hdi virtpool cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr virtpool harddisk2 (hard2) .chd .hd .hdv .2mg .hdi virtpool cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr vis cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vis memcard (memc) .bin visicom cartridge (cart) .bin .rom vixen floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk vixen floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk vjdash harddisk (hard) .chd .hd .hdv .2mg .hdi vjdash cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vjdash floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf vjdash floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf vjdash printout (prin) .prn vjdasha harddisk (hard) .chd .hd .hdv .2mg .hdi vjdasha cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vjdasha floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf vjdasha floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf vjdasha printout (prin) .prn vjslap harddisk (hard) .chd .hd .hdv .2mg .hdi vjslap cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vjslap floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf vjslap floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf vjslap printout (prin) .prn vl1 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf vlsi5 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf vlsi5 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf vlsi5 harddisk (hard) .chd .hd .hdv .2mg .hdi vmdtbase quickload (quik) .pgm .tvc vmdtbase cartridge (cart) .bin .rom vp111 quickload (quik) .bin .c8 vp111 cassette (cass) .wav .flac vpcii floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf vpcii floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf vpcii printout (prin) .prn vreader cartridge (cart) .bin vreadercaen cartridge (cart) .bin vreadercafr cartridge (cart) .bin vs2002ex cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vs2002j cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vs2002t3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vs4 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vs42006 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vs42006b cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vs42k6ex cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vs4e cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vs4eo cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vs4j cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vs4jc cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vs4o cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vsaturn cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vsaturn cartridge (cart) .bin vsmile cartridge (cart) .u1 .u3 .bin vsmileb cartridge (cart) .u1 .u3 .bin vsmilebf cartridge (cart) .u1 .u3 .bin vsmilebfp cartridge (cart) .u1 .u3 .bin vsmilebg cartridge (cart) .u1 .u3 .bin vsmilebs cartridge (cart) .u1 .u3 .bin vsmilebsw cartridge (cart) .u1 .u3 .bin vsmilem cartridge (cart) .u1 .u3 .bin vsmilpro cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vstrik3 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vtennis2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vtennisg cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr vz200 snapshot (dump) .vz vz200 cassette (cass) .wav .flac .cas vz2000 cassette (cass) .wav .flac vz2000 printout (prin) .prn vz2000 cartridge (cart) .bin .rom vz200de snapshot (dump) .vz vz200de cassette (cass) .wav .flac .cas vz300 snapshot (dump) .vz vz300 cassette (cass) .wav .flac .cas w30 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .out .w30 walk386dx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf walk386dx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf walk386dx harddisk (hard) .chd .hd .hdv .2mg .hdi walk386dx printout (prin) .prn walk386sx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf walk386sx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf walk386sx harddisk (hard) .chd .hd .hdv .2mg .hdi wangmid cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wangmid2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wangmid2j cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wangmid2ja cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wangmid2o cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wangmidj cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wangpc floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf wangpc floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf wangpc printout (prin) .prn warfa harddisk1 (hard1) .chd .hd .hdv .2mg .hdi warfa cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr warfa harddisk2 (hard2) .chd .hd .hdv .2mg .hdi warfa cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr warfaa harddisk1 (hard1) .chd .hd .hdv .2mg .hdi warfaa cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr warfaa harddisk2 (hard2) .chd .hd .hdv .2mg .hdi warfaa cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr warfab harddisk1 (hard1) .chd .hd .hdv .2mg .hdi warfab cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr warfab harddisk2 (hard2) .chd .hd .hdv .2mg .hdi warfab cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr wargods harddisk (hard) .chd .hd .hdv .2mg .hdi wargodsa harddisk (hard) .chd .hd .hdv .2mg .hdi wargodsb harddisk (hard) .chd .hd .hdv .2mg .hdi warzard cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr warzardr1 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr waveterm floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .wta waveterm floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .wta wccf116 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wccf1dup cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wccf212e cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wccf234j cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wccf2chk cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wccf310j cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wccf322e cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wccf331e cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wccf331j cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wccf341j cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wccf400j cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wccf420e cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wcombat harddisk (hard) .chd .hd .hdv .2mg .hdi wcombatj harddisk (hard) .chd .hd .hdv .2mg .hdi wcombatk harddisk (hard) .chd .hd .hdv .2mg .hdi wcombatu harddisk (hard) .chd .hd .hdv .2mg .hdi weddingr cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wg3dh harddisk1 (hard1) .chd .hd .hdv .2mg .hdi wg3dh cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr wg3dh harddisk2 (hard2) .chd .hd .hdv .2mg .hdi wg3dh cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr wg3dhfe harddisk1 (hard1) .chd .hd .hdv .2mg .hdi wg3dhfe cdrom1 (cdrm1) .chd .cue .toc .nrg .gdi .iso .cdr wg3dhfe harddisk2 (hard2) .chd .hd .hdv .2mg .hdi wg3dhfe cdrom2 (cdrm2) .chd .cue .toc .nrg .gdi .iso .cdr wicat floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk wizzard cassette (cass) .wav .flac wizzard printout (prin) .prn wizzard cartridge (cart) .bin .rom wmbullet floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk wmbullet printout (prin) .prn wmbulletf floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk wmbulletf printout (prin) .prn wmbulletf harddisk (hard) .chd .hd .hdv .2mg .hdi wmega cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wmegam2 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wontame harddisk (hard) .chd .hd .hdv .2mg .hdi wpc250 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf wpc250 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf wpc250 harddisk (hard) .chd .hd .hdv .2mg .hdi wren floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .hfe .img wren floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .hfe .img wsbbgd cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr wscolor cartridge (cart) .ws .wsc .bin wswan cartridge (cart) .ws .wsc .bin wy220001 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf wy220001 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf wy220001 harddisk (hard) .chd .hd .hdv .2mg .hdi x07 printout (prin) .prn x07 cartridge (cart) .rom .bin x07 cassette (cass) .wav .flac .k7 .lst .cas x1 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d x1 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d x1 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d x1 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d x1 cartridge (cart) .bin .rom x1 cassette (cass) .wav .flac .tap x168 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk x168 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk x168 harddisk (hard) .chd .hd .hdv .2mg .hdi x168 quickload (quik) .com .cpm x1turbo floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d x1turbo floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d x1turbo floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d x1turbo floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d x1turbo cartridge (cart) .bin .rom x1turbo cassette (cass) .wav .flac .tap x1turbo40 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d x1turbo40 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d x1turbo40 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d x1turbo40 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d x1turbo40 cartridge (cart) .bin .rom x1turbo40 cassette (cass) .wav .flac .tap x1twin floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d x1twin floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d x1twin floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d x1twin floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .2d x1twin cartridge (cart) .bin .rom x1twin cassette (cass) .wav .flac .tap x37 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .img x37 harddisk (hard) .chd .hd .hdv .2mg .hdi x68000 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .dim x68000 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .dim x68000 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .dim x68000 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .dim x68000 sasihd (sasi) .hdf x68030 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .dim x68030 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .dim x68030 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .dim x68030 floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .dim x68030 harddisk (hard) .chd .hd .hdv .2mg .hdi x68030 cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr x68ksupr floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .dim x68ksupr floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .dim x68ksupr floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .dim x68ksupr floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .dim x68ksupr harddisk (hard) .chd .hd .hdv .2mg .hdi x68ksupr cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr x68kxvi floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .dim x68kxvi floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .dim x68kxvi floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .dim x68kxvi floppydisk4 (flop4) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .xdf .hdm .2hd .dim x68kxvi harddisk (hard) .chd .hd .hdv .2mg .hdi x68kxvi cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr x820 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk x820 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk x820 quickload (quik) .com .cpm x820ii floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk x820ii floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk x820ii harddisk (hard) .chd .hd .hdv .2mg .hdi x820ii quickload (quik) .com .cpm xb42639 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf xb42639 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf xb42639 harddisk (hard) .chd .hd .hdv .2mg .hdi xb42639a floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf xb42639a floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf xb42639a harddisk (hard) .chd .hd .hdv .2mg .hdi xb42663 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf xb42663 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf xb42663 harddisk (hard) .chd .hd .hdv .2mg .hdi xb42663 printout (prin) .prn xb42664 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf xb42664 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf xb42664 harddisk (hard) .chd .hd .hdv .2mg .hdi xb42664 printout (prin) .prn xb42664a floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf xb42664a floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf xb42664a harddisk (hard) .chd .hd .hdv .2mg .hdi xb42664a printout (prin) .prn xbox harddisk (hard) .chd .hd .hdv .2mg .hdi xbox cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr xegs floppydisk1 (flop1) .atr .dsk .xfd xegs floppydisk2 (flop2) .atr .dsk .xfd xegs floppydisk3 (flop3) .atr .dsk .xfd xegs floppydisk4 (flop4) .atr .dsk .xfd xegs cartridge (cart) .bin .rom .car xeye cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr xiistag harddisk (hard) .chd .hd .hdv .2mg .hdi xiprocessor floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf xiprocessor floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf xiprocessor printout (prin) .prn xiprocessor harddisk (hard) .chd .hd .hdv .2mg .hdi xor100 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk xor100 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk xor100 printout (prin) .prn xtrial harddisk (hard) .chd .hd .hdv .2mg .hdi y503iiir cartridge1 (cart1) .mx1 .bin .rom y503iiir cartridge2 (cart2) .mx1 .bin .rom y503iiir printout (prin) .prn y503iiir cassette (cass) .wav .flac .tap .cas .tsx y503iiire cartridge1 (cart1) .mx1 .bin .rom y503iiire cartridge2 (cart2) .mx1 .bin .rom y503iiire printout (prin) .prn y503iiire cassette (cass) .wav .flac .tap .cas .tsx y503iir cartridge1 (cart1) .mx1 .bin .rom y503iir cartridge2 (cart2) .mx1 .bin .rom y503iir yamahaminicart (mini) .mx1 .bin .rom y503iir cartridge60pin (cart60p) .mx1 .bin .rom y503iir printout (prin) .prn y503iir cassette (cass) .wav .flac .tap .cas .tsx y503iir2 cartridge1 (cart1) .mx1 .bin .rom y503iir2 cartridge2 (cart2) .mx1 .bin .rom y503iir2 yamahaminicart (mini) .mx1 .bin .rom y503iir2 cartridge60pin (cart60p) .mx1 .bin .rom y503iir2 printout (prin) .prn y503iir2 cassette (cass) .wav .flac .tap .cas .tsx y805128 cartridge1 (cart1) .mx1 .bin .rom y805128 cartridge2 (cart2) .mx1 .bin .rom y805128 floppydisk (flop) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk y805128 cartridge60pin (cart60p) .mx1 .bin .rom y805128 printout (prin) .prn y805128 cassette (cass) .wav .flac .tap .cas .tsx y805128r2 cartridge1 (cart1) .mx1 .bin .rom y805128r2 cartridge2 (cart2) .mx1 .bin .rom y805128r2 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk y805128r2 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk y805128r2 printout (prin) .prn y805128r2 cassette (cass) .wav .flac .tap .cas .tsx y805128r2e cartridge1 (cart1) .mx1 .bin .rom y805128r2e cartridge2 (cart2) .mx1 .bin .rom y805128r2e floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk y805128r2e floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk y805128r2e printout (prin) .prn y805128r2e cassette (cass) .wav .flac .tap .cas .tsx y805256 cartridge1 (cart1) .mx1 .bin .rom y805256 cartridge2 (cart2) .mx1 .bin .rom y805256 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk y805256 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .dmk y805256 cartridge60pin (cart60p) .mx1 .bin .rom y805256 printout (prin) .prn y805256 cassette (cass) .wav .flac .tap .cas .tsx yc64 cartridge (cart) .mx1 .bin .rom yc64 printout (prin) .prn yc64 cassette (cass) .wav .flac .tap .cas .tsx yis303 cartridge (cart) .mx1 .bin .rom yis303 cartridge60pin (cart60p) .mx1 .bin .rom yis303 cassette (cass) .wav .flac .tap .cas .tsx yis503 cartridge (cart) .mx1 .bin .rom yis503 cartridge60pin (cart60p) .mx1 .bin .rom yis503 printout (prin) .prn yis503 cassette (cass) .wav .flac .tap .cas .tsx yis503f cartridge (cart) .mx1 .bin .rom yis503f cartridge60pin (cart60p) .mx1 .bin .rom yis503f printout (prin) .prn yis503f cassette (cass) .wav .flac .tap .cas .tsx yis503ii cartridge1 (cart1) .mx1 .bin .rom yis503ii cartridge2 (cart2) .mx1 .bin .rom yis503ii cartridge60pin (cart60p) .mx1 .bin .rom yis503ii printout (prin) .prn yis503ii cassette (cass) .wav .flac .tap .cas .tsx yis604 cartridge1 (cart1) .mx1 .bin .rom yis604 cartridge2 (cart2) .mx1 .bin .rom yis604 yamahaminicart (mini) .mx1 .bin .rom yis604 cartridge60pin (cart60p) .mx1 .bin .rom yis604 printout (prin) .prn yis604 cassette (cass) .wav .flac .tap .cas .tsx z100 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk z100 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk z1013 cassette (cass) .wav .flac z1013 snapshot (dump) .z80 z1013a2 cassette (cass) .wav .flac z1013a2 snapshot (dump) .z80 z1013k69 cassette (cass) .wav .flac z1013k69 snapshot (dump) .z80 z1013k76 cassette (cass) .wav .flac z1013k76 snapshot (dump) .z80 z1013s60 cassette (cass) .wav .flac z1013s60 snapshot (dump) .z80 z80clock cartridge1 (cart1) .bin z80clock cartridge2 (cart2) .bin z80clock cartridge3 (cart3) .bin z80clock quickload (quik) .rom z80ne cassette1 (cass1) .wav .flac z80ne cassette2 (cass2) .wav .flac z80net cassette1 (cass1) .wav .flac z80net cassette2 (cass2) .wav .flac z80netb cassette1 (cass1) .wav .flac z80netb cassette2 (cass2) .wav .flac z80netf cassette1 (cass1) .wav .flac z80netf cassette2 (cass2) .wav .flac z80netf floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .dmk z80netf floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .dmk z88 serial (serl) . z88 cartridge1 (cart1) .epr .bin z88 cartridge2 (cart2) .epr .bin z88 cartridge3 (cart3) .epr .bin z88ch serial (serl) . z88ch cartridge1 (cart1) .epr .bin z88ch cartridge2 (cart2) .epr .bin z88ch cartridge3 (cart3) .epr .bin z88de serial (serl) . z88de cartridge1 (cart1) .epr .bin z88de cartridge2 (cart2) .epr .bin z88de cartridge3 (cart3) .epr .bin z88dk serial (serl) . z88dk cartridge1 (cart1) .epr .bin z88dk cartridge2 (cart2) .epr .bin z88dk cartridge3 (cart3) .epr .bin z88es serial (serl) . z88es cartridge1 (cart1) .epr .bin z88es cartridge2 (cart2) .epr .bin z88es cartridge3 (cart3) .epr .bin z88fi serial (serl) . z88fi cartridge1 (cart1) .epr .bin z88fi cartridge2 (cart2) .epr .bin z88fi cartridge3 (cart3) .epr .bin z88fr serial (serl) . z88fr cartridge1 (cart1) .epr .bin z88fr cartridge2 (cart2) .epr .bin z88fr cartridge3 (cart3) .epr .bin z88it serial (serl) . z88it cartridge1 (cart1) .epr .bin z88it cartridge2 (cart2) .epr .bin z88it cartridge3 (cart3) .epr .bin z88no serial (serl) . z88no cartridge1 (cart1) .epr .bin z88no cartridge2 (cart2) .epr .bin z88no cartridge3 (cart3) .epr .bin z88se serial (serl) . z88se cartridge1 (cart1) .epr .bin z88se cartridge2 (cart2) .epr .bin z88se cartridge3 (cart3) .epr .bin z88tr serial (serl) . z88tr cartridge1 (cart1) .epr .bin z88tr cartridge2 (cart2) .epr .bin z88tr cartridge3 (cart3) .epr .bin z90 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk z90 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk z90 floppydisk3 (flop3) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk z90 printout (prin) .prn z9001 cassette (cass) .wav .flac zdsupers cassette (cass) .wav .flac zdsupers floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf zdsupers floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf zdsupers printout (prin) .prn zdz150 cassette (cass) .wav .flac zdz150 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf zdz150 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf zdz150 printout (prin) .prn zdz160 cassette (cass) .wav .flac zdz160 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf zdz160 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf zdz160 printout (prin) .prn zdz180 cassette (cass) .wav .flac zdz180 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf zdz180 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf zdz180 printout (prin) .prn zdz248 floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf zdz248 floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf zdz248 harddisk (hard) .chd .hd .hdv .2mg .hdi zeos386sx floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf zeos386sx floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf zeos386sx harddisk (hard) .chd .hd .hdv .2mg .hdi zi4dvs floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf zi4dvs floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf .xdf zi4dvs harddisk (hard) .chd .hd .hdv .2mg .hdi zi4dvs printout (prin) .prn zidav630e harddisk (hard) .chd .hd .hdv .2mg .hdi zidav630e cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr zidav630e floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf zidav630e floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk .ima .img .ufi .360 .ipf zidav630e printout (prin) .prn zijini cassette (cass) .wav .flac zijini floppydisk1 (flop1) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib zijini floppydisk2 (flop2) .mfi .dfi .d13 .dsk .do .po .edd .woz .nib zippity cartridge (cart) .bin zippityuk cartridge (cart) .bin zito4dps harddisk (hard) .chd .hd .hdv .2mg .hdi zito4dps cdrom (cdrm) .chd .cue .toc .nrg .gdi .iso .cdr zito4dps printout (prin) .prn zokuoten harddisk (hard) .chd .hd .hdv .2mg .hdi zokuotena harddisk (hard) .chd .hd .hdv .2mg .hdi zoofari harddisk (hard) .chd .hd .hdv .2mg .hdi zooo harddisk (hard) .chd .hd .hdv .2mg .hdi zorba floppydisk1 (flop1) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk zorba floppydisk2 (flop2) .mfi .dfi .mfm .td0 .imd .86f .d77 .d88 .1dd .cqm .cqi .dsk zorba printout (prin) .prn zvezda snapshot (dump) .ach .frz .plusd.prg .sem .sit .sna .snp .snx .sp .z80 .zx zvezda quickload (quik) .raw .scr zvezda cassette (cass) .wav .flac .tzx .tap .blk zx80 cassette (cass) .wav .flac .o .80 zx81 cassette (cass) .wav .flac .p .81 .tzx zx97 cassette (cass) .wav .flac .p .81 .tzx ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/macrorun.py ================================================ #!/usr/bin/env python3 import sys, os, json, time, stat from evdev import InputDevice, list_devices, ecodes as e from evdev import UInput CONFIG_FILE = "/storage/.config/emuelec/scripts/macro_config.json" PID_FILE = "/tmp/macrorun.pid" LOG_FILE = "/tmp/macrorun.log" def load_config(): if not os.path.exists(CONFIG_FILE): print("No saved configuration found. Please run Setup first!") sys.exit(1) with open(CONFIG_FILE, "r") as f: data = json.load(f) if "macros" not in data: data = { "device_path": data.get("device_path"), "macros": [ { "name": "DEFAULT MACRO", "trigger_code": data.get("trigger_code"), "macro_keys": data.get("macro_keys", []), } ], } macros = [m for m in data.get("macros", []) if m.get("macro_keys")] if not macros: print("No macros stored in configuration file. Please create one first with Setup!") sys.exit(1) data["macros"] = macros return data def wait_for_controller(preferred_path=None): print("\nWaiting for controller...") if preferred_path: try: dev = InputDevice(preferred_path) print(f"Controller found: {dev.name} ({dev.path})") return dev except OSError: pass while True: for path in list_devices(): dev = InputDevice(path) if dev.capabilities().get(e.EV_KEY): keys = dev.capabilities()[e.EV_KEY] if any(btn in keys for btn in [e.BTN_SOUTH, e.BTN_EAST, e.BTN_NORTH, e.BTN_WEST]): print(f"Controller found: {dev.name} ({dev.path})") return dev time.sleep(1) def clear_console(): print("\033[2J\033[H", end="") def controller_menu(dev, title, options): index = 0 while True: clear_console() print(title) print("\nUse D-Pad to choose a macro and press (A) to confirm.") print("Press (B) to cancel and exit.\n") for i, option in enumerate(options): prefix = "->" if i == index else " " print(f"{prefix} {option}") for event in dev.read_loop(): if event.type != e.EV_KEY or event.value != 1: continue if event.code == e.BTN_DPAD_DOWN: index = (index + 1) % len(options); break if event.code == e.BTN_DPAD_UP: index = (index - 1) % len(options); break if event.code == e.BTN_SOUTH: return index if event.code == e.BTN_EAST: print("\nMacro activation cancelled.") sys.exit(0) def run_macro_mode(dev, macro): trigger_code = macro["trigger_code"] macro_keys = macro["macro_keys"] ui = UInput({e.EV_KEY: list(set(macro_keys))}, name="Virtual-Macro", bustype=e.BUS_USB) trigger_pressed = False macro_executed = False press_start = 0 print("\nMacro active! Press the trigger to execute. Hold for 3 seconds to disable Macro again.") for event in dev.read_loop(): if event.type == e.EV_KEY and event.code == trigger_code: if event.value == 1: trigger_pressed = True macro_executed = False press_start = time.time() elif event.value == 0 and trigger_pressed: hold_time = time.time() - press_start trigger_pressed = False if hold_time >= 3: print("Exiting...") ui.close() return elif not macro_executed: print("Executing macro...") for key in macro_keys: ui.write(e.EV_KEY, key, 1); ui.syn(); time.sleep(0.05) ui.write(e.EV_KEY, key, 0); ui.syn() if trigger_pressed and not macro_executed and time.time() - press_start >= 0.1: macro_executed = True print("Executing macro...") for key in macro_keys: ui.write(e.EV_KEY, key, 1); ui.syn(); time.sleep(0.05) ui.write(e.EV_KEY, key, 0); ui.syn() def already_running(): try: with open(PID_FILE) as f: pid = int(f.read().strip()) os.kill(pid, 0) return True except Exception: return False def daemonize(dev_path, macro): try: if os.fork() > 0: return 0 os.setsid() if os.fork() > 0: os._exit(0) except OSError: return 2 try: sys.stdin.close() except Exception: pass try: log = open(LOG_FILE, "ab", buffering=0) except OSError: log = open("/dev/null", "ab", buffering=0) for fd in (1, 2): try: os.dup2(log.fileno(), fd) except OSError: pass try: with open(PID_FILE, "w") as pf: pf.write(str(os.getpid())) except OSError: pass try: dev = InputDevice(dev_path) run_macro_mode(dev, macro) finally: try: os.remove(PID_FILE) except OSError: pass os._exit(0) def main(): if already_running(): print("Macro already running. Aborting.") return 0 cfg = load_config() macros = cfg["macros"] dev = wait_for_controller(cfg.get("device_path")) option_labels = [f"{m['name']} (Trigger {m['trigger_code']})" for m in macros] selection = controller_menu(dev, "Select macro to activate", option_labels) chosen_macro = macros[selection] print("\nStarting macro in background...") rc = daemonize(dev.path, chosen_macro) if rc == 0: print("Macro is now running in the background. Exiting to Emulationstation...") return 0 else: print("Macro could not be started in the background.") return 1 if __name__ == "__main__": sys.exit(main()) ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/macrorun.sh ================================================ #!/bin/bash . /etc/profile macro_confirm() { text_viewer -y -w -t "ACTIVATE MACRO" -f 24 -m "This will activate the macro mode in the background.\n\nThe macro will be active while you continue using EmulationStation.\n\nContinue?" if [[ $? == 21 ]]; then if macro_start; then text_viewer -w -t "MACRO ACTIVATED!" -f 24 -m "Macro mode is now active in the background!\n\nATTENTION: DO NOT press the trigger button as long as you are in Emulationstation, otherwise the new controller-setup screen will pop up.\n\nIn this case, just press the hotkey button to exit the routine.\n\nTo DISABLE the macro again, press the macro button for around 3-5 seconds." else text_viewer -e -w -t "MACRO ACTIVATION FAILED!" -f 24 -m "Failed to activate macro mode! Check /tmp/macrorun.log for details." fi fi ee_console disable } macro_start() { ee_console enable echo "Starting macro run (foreground menu, then daemonize)..." /usr/bin/python3 -u /usr/bin/scripts/setup/macrorun.py rc=$? sleep 1 if [[ -f /tmp/macrorun.pid ]] && ps -p "$(cat /tmp/macrorun.pid)" >/dev/null 2>&1; then echo "Macro daemon running with PID $(cat /tmp/macrorun.pid)" ee_console disable rm /tmp/display >/dev/null 2>&1 return 0 fi if pgrep -f "Virtual-Macro" >/dev/null 2>&1 || pgrep -f "/usr/bin/scripts/setup/macrorun.py" >/dev/null 2>&1; then ee_console disable rm /tmp/display >/dev/null 2>&1 return 0 fi echo "Macro daemon not detected (rc=${rc})" ee_console disable rm /tmp/display >/dev/null 2>&1 return 1 } macro_confirm ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/macrosetup.py ================================================ #!/usr/bin/env python3 from evdev import InputDevice, list_devices, ecodes as e import json import os import time import builtins import functools import sys CONFIG_FILE = "/storage/.config/emuelec/scripts/macro_config.json" MAX_NAME_LEN = 16 NAME_ALPHABET = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 -_") if hasattr(sys.stdout, "reconfigure"): try: sys.stdout.reconfigure(line_buffering=True, write_through=True) except (ValueError, OSError): pass # Every print call should flush immediately so prompts appear on the EmuELEC # console even when the script runs through a tee pipeline. print = functools.partial(builtins.print, flush=True) def map_controller_to_key(code): mapping = { e.BTN_DPAD_UP: e.KEY_UP, e.BTN_DPAD_DOWN: e.KEY_DOWN, e.BTN_DPAD_LEFT: e.KEY_LEFT, e.BTN_DPAD_RIGHT: e.KEY_RIGHT, e.BTN_SOUTH: e.KEY_Z, e.BTN_EAST: e.KEY_X, e.BTN_NORTH: e.KEY_A, e.BTN_WEST: e.KEY_S, e.BTN_TL: e.KEY_Q, e.BTN_TR: e.KEY_W, e.BTN_TL2: e.KEY_E, e.BTN_TR2: e.KEY_R, } return mapping.get(code) def ensure_config_dir(): os.makedirs(os.path.dirname(CONFIG_FILE), exist_ok=True) def load_config(): if not os.path.exists(CONFIG_FILE): return {"macros": []} with open(CONFIG_FILE, "r") as f: data = json.load(f) # migrate old single-macro configuration if "macros" not in data: macro = { "name": "DEFAULT MACRO", "trigger_code": data.get("trigger_code"), "macro_keys": data.get("macro_keys", []), } return { "device_path": data.get("device_path"), "macros": [macro], } return data def save_config(data): ensure_config_dir() with open(CONFIG_FILE, "w") as f: json.dump(data, f, indent=2) print(f"\nConfiguration saved to {CONFIG_FILE}.") def wait_for_controller(preferred_path=None): print("\nWaiting for controller...") if preferred_path: try: dev = InputDevice(preferred_path) print(f"Controller found: {dev.name} ({dev.path})") return dev except OSError: pass while True: devices = [InputDevice(path) for path in list_devices()] for dev in devices: if dev.capabilities().get(e.EV_KEY): keys = dev.capabilities()[e.EV_KEY] if any(btn in keys for btn in [e.BTN_SOUTH, e.BTN_EAST, e.BTN_NORTH, e.BTN_WEST]): print(f"Controller found: {dev.name} ({dev.path})") return dev time.sleep(1) def clear_console(): print("\033[2J\033[H", end="") def controller_menu(dev, title, options, allow_cancel=False): index = 0 if options else -1 while True: clear_console() print(title) print("\nUse D-Pad to choose and press (A) to confirm." ) if allow_cancel: print("Press (B) to cancel.") print() for i, option in enumerate(options): prefix = "-" if i == index else " " print(f"{prefix} {option}") if not options: print("\nNo options available.") for event in dev.read_loop(): if event.type != e.EV_KEY or event.value != 1: continue if event.code == e.BTN_DPAD_DOWN and options: index = (index + 1) % len(options) break if event.code == e.BTN_DPAD_UP and options: index = (index - 1) % len(options) break if event.code == e.BTN_SOUTH and options: return index if allow_cancel and event.code == e.BTN_EAST: return None # loop will refresh display after handling navigation def enter_macro_name(dev, default_name): name = list(default_name.upper()[:MAX_NAME_LEN]) if not name: name = list("MACRO") while len(name) < MAX_NAME_LEN: name.append(" ") position = 0 while True: clear_console() print("Name your macro") print("\nUse LEFT/RIGHT to move, UP/DOWN to change character.") print("Press (A) to accept, (Y) to erase character, (B) to cancel.") print() display = [] for idx, char in enumerate(name): if idx == position: display.append(f"[{char}]") else: display.append(f" {char} ") print("".join(display)) for event in dev.read_loop(): if event.type != e.EV_KEY or event.value != 1: continue if event.code == e.BTN_DPAD_RIGHT: position = min(position + 1, MAX_NAME_LEN - 1) break if event.code == e.BTN_DPAD_LEFT: position = max(position - 1, 0) break if event.code == e.BTN_DPAD_UP: current = name[position] try: idx = NAME_ALPHABET.index(current) except ValueError: idx = 0 name[position] = NAME_ALPHABET[(idx + 1) % len(NAME_ALPHABET)] break if event.code == e.BTN_DPAD_DOWN: current = name[position] try: idx = NAME_ALPHABET.index(current) except ValueError: idx = 0 name[position] = NAME_ALPHABET[(idx - 1) % len(NAME_ALPHABET)] break if event.code == e.BTN_WEST: # Y button to clear character name[position] = " " break if event.code == e.BTN_SOUTH: final_name = "".join(name).strip() return final_name or default_name.upper() if event.code == e.BTN_EAST: return None def record_trigger_button(dev): print("\nPress the button that will later trigger the macro...") while True: for event in dev.read_loop(): if event.type == e.EV_KEY and event.value == 1 and event.code != e.BTN_MODE: print(f"Trigger button: Code {event.code}") time.sleep(0.5) return event.code def record_macro_sequence(dev, trigger_code): print("\nPress the buttons for your macro. When you are finished, wait three seconds and then press any button to save and exit.") macro_keys = [] last_press_time = time.time() for event in dev.read_loop(): if event.type == e.EV_KEY and event.value == 1: if event.code != trigger_code: macro_keys.append(event.code) last_press_time = time.time() print(f"→ Button added: Code {event.code}") if time.time() - last_press_time > 3: break if not macro_keys: print("No buttons recorded!") return None mapped = [map_controller_to_key(c) for c in macro_keys if map_controller_to_key(c)] if not mapped: print("None of the recorded buttons can be mapped to keyboard keys!") return None print(f"Macro recorded: {len(mapped)} valid keys") return mapped def main(): config = load_config() dev = wait_for_controller(config.get("device_path")) macros = config.setdefault("macros", []) options = [f"Overwrite: {macro['name']}" for macro in macros] options.append("Create new macro") selection = controller_menu(dev, "🎛 Choose macro slot", options, allow_cancel=True) if selection is None: print("\nSetup cancelled.") return creating_new = selection == len(macros) if creating_new: default_name = f"MACRO {len(macros) + 1}" macro_name = enter_macro_name(dev, default_name) if macro_name is None: print("\nSetup cancelled.") return else: macro_name = macros[selection]["name"] print(f"\nOverwriting macro '{macro_name}'. Press the trigger to re-record.") trigger_code = record_trigger_button(dev) macro_keys = record_macro_sequence(dev, trigger_code) if macro_keys: new_macro = { "name": macro_name, "trigger_code": trigger_code, "macro_keys": macro_keys, } if creating_new: macros.append(new_macro) else: macros[selection] = new_macro config["device_path"] = dev.path save_config(config) print("\nSetup complete! You can choose and activate your recorded macros with Macro Enabler.") else: print("\nMacro recording aborted.") if __name__ == "__main__": main() ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/macrosetup.sh ================================================ #!/bin/bash # Source predefined functions and variables . /etc/profile function macrosetup_confirm() { text_viewer -y -w -t "SETUP MACRO" -f 24 -m "This will start the macro setup configuration.\n\nThe setup will guide you through configuring your macro settings.\n\nContinue?" if [[ $? == 21 ]]; then if macrosetup_start; then text_viewer -w -t "MACRO SETUP COMPLETED!" -f 24 -m "Macro setup has been completed successfully!\n\nYour macro configuration has been saved and is ready to use.\n\nYou can now select and activate macros using the macro activation script." else text_viewer -e -w -t "MACRO SETUP FAILED!" -f 24 -m "Failed to complete macro setup! Check /tmp/macrosetup.log for details." fi fi ee_console disable } function macrosetup_start() { ee_console enable echo "Starting macro setup..." echo "Follow the instructions that will appear below:" echo "" # Run Python setup script with logging (but keep interactive output) /usr/bin/python3 -u /usr/bin/scripts/setup/macrosetup.py 2>&1 | tee /tmp/macrosetup.log setup_result=${PIPESTATUS[0]} echo "" # Check if setup completed successfully if [[ $setup_result == 0 ]]; then echo "Macro setup completed successfully" ee_console disable rm /tmp/display > /dev/null 2>&1 return 0 else echo "Failed to complete macro setup" ee_console disable rm /tmp/display > /dev/null 2>&1 return 1 fi } macrosetup_confirm ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/scan_scummVM_games.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile function restart_confirm() { text_viewer -y -w -t "ScummVM scan completed" -f 24 -m "ScummVM scan completed, if any games were found they will appear next time you restart Emulationstation!\n\nDo you wish to restart now?" [[ $? == 21 ]] && systemctl restart emustation || exit 0; } sdlterm --title "Adding Scummvm games, please be patient..." --run "/usr/bin/scummvm.start" --runargs "add" sdlterm --title "Creating Scummvm game files, please be patient..." --run "/usr/bin/scummvm.start " --runargs "create" restart_confirm ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/scraper.start ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile ee_console enable while pgrep -f emulationstation; do clear /dev/tty0 echo "Waiting for Emulationstation to quit" > /dev/tty0 sleep 1 done source /usr/bin/env.sh source "$scriptdir/scriptmodules/supplementary/scraper.sh" rp_registerAllModules joy2keyStart romdir="/storage/roms/" gui_scraper ee_console disable systemctl start emustation ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/send_logs.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile LOGLINK=$(emueleclogs.sh) text_viewer -w -t "EmuELEC Send Logs" -f 24 -m "Use this link to ask for help:\n\n${LOGLINK}" ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/show_last_emuelec.log.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) text_viewer -t "Last EmuELEC Log!" -f 24 /emuelec/logs/emuelec.log ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/skyscraper.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile if [ ! -L "/storage/.skyscraper" ]; then ln -sTf /storage/.config/skyscraper /storage/.skyscraper fi function scrape_confirm() { text_viewer -y -w -t "Skyscraper Launcher" -f 24 -m "This will Kill Emulationstation and will start Skyscraper, do you want to continue?\n\nYou will need a keyboard to be able to use the scraping menu" [[ $? == 21 ]] && start_skyscraper || exit 0; } function start_skyscraper() { ee_console enable systemd-run bash /usr/bin/scripts/setup/Skyscraper.start systemctl stop emustation } ee_console disable scrape_confirm ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/sselphs_scraper.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile ee_console enable function scrape_confirm() { text_viewer -y -w -t "Sselph's Scraper" -f 24 -m "This will Kill Emulationstation and will start Sselph's Scraper, do you want to continue?\n\nYou will need a keyboard to be able to use the scraping menu" [[ $? == 21 ]] && start_scraper || exit 0; } function start_scraper() { ee_console enable systemd-run bash /usr/bin/scripts/setup/scraper.start systemctl stop emustation } ee_console disable scrape_confirm ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/system_info.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) echo " Storage System" > /tmp/line1 echo " " > /tmp/free df -h | tail -n +4 > /tmp/temp-disk3 sed '1 i Name Total Used Free Load Mountpoint' /tmp/temp-disk3 > /tmp/temp-disk2 sed '/^tmpfs/ d' /tmp/temp-disk2 > /tmp/temp-disk4 sed '/^none/ d' /tmp/temp-disk4 > /tmp/temp-disk sed -i 's,'"/dev/data "',/dev/data,' /tmp/temp-disk > /tmp/tt sed -i 's,'"/dev/loop0 "',/dev/loop0,' /tmp/temp-disk > /tmp/tt sed -i 's,'"/dev/sda1 "',USB,' /tmp/temp-disk > /tmp/tt sed -i 's,'"/var"',,' /tmp/temp-disk > /tmp/tt echo " Temperature Monitoring" > /tmp/temph cpuTempC=$(($(cat /sys/class/thermal/thermal_zone0/temp)/1000)) && cpuTempF=$((cpuTempC*9/5+32)) echo ${cpuTempC} > /tmp/tempc sed 's/^/Cpu Temperature in Celcius degree : /' /tmp/tempc > /tmp/tempC echo ${cpuTempF} > /tmp/tempf sed 's/^/Cpu Temperature in Farenheit degree : /' /tmp/tempf > /tmp/tempF echo " Network Info" > /tmp/net ip route get 8.8.8.8 2>/dev/null | awk '{print $NF; exit}' > /tmp/ip sed 's/^/Local Ip address : /' /tmp/ip > /tmp/IP wget -qO- http://ipecho.net/plain > /tmp/wan sed 's/^/Public Ip address : /' /tmp/wan > /tmp/WAN cat /sys/class/net/eth0/operstate > /tmp/wired sed 's/^/Ethernet Connection status : /' /tmp/wired > /tmp/WIRED cat /sys/class/net/lo/operstate > /tmp/loop sed 's/^/Loopback interface status : /' /tmp/loop > /tmp/LOOP cat /sys/class/net/wlan0/operstate > /tmp/wlan sed 's/^/Wireless Connection status : /' /tmp/wlan > /tmp/WLAN sed h /tmp/line1 /tmp/free /tmp/temp-disk /tmp/free /tmp/free /tmp/temph /tmp/free /tmp/tempC /tmp/tempF /tmp/free /tmp/free /tmp/net /tmp/free /tmp/IP /tmp/WAN /tmp/LOOP /tmp/WIRED /tmp/WLAN > /tmp/display rm /tmp/free /tmp/tt /tmp/line1 /tmp/temp* /tmp/ip /tmp/loop /tmp/wan /tmp/wired /tmp/wlan /tmp/net /tmp/IP /tmp/WAN /tmp/LOOP /tmp/WIRED /tmp/WLAN text_viewer -w -t "EmuELEC System Information" -f 24 /tmp/display rm /tmp/display ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/wifi.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Helper script to activate/desactivate WLAN from command line # Usage : # wifi connect # wifi disconnect # wifi scan # wifi status ##################################################### # downloaded from : https://jira.automotivelinux.org/secure/attachment/10300/wifi ### global vars ### source /usr/bin/env.sh joy2keyStart CONNMAN=/usr/bin/connmanctl script=$(basename "${0}") configpath=/storage/.cache/connman # connman config directory ssid="" # ssid of wifi network to reach passphrase="" # passphrase of wifi network to reach service="" # service identifier of the network service to reach fullservice="" # function error() { echo ERROR: "$@" >&2 cat << EOF >&2 Usage: ${script} connect [passphrase] ${script} disconnect [ssid] ${script} scan ${script} status EOF exit 1 } function wifi_enable() { command=$(${CONNMAN} technologies | grep -A 4 wifi | sed -n '4p') if [[ ${command} == *True ]]; then echo ">>> Wifi is already enabled ... Ok" else echo ">>> Enabling wifi ..." command=$(${CONNMAN} enable wifi) if [[ ${command} == Enabled* ]]; then echo ${command} else echo ">>> Cannot enable wifi !" exit 1 fi fi } function wifi_disable() { ${CONNMAN} disable wifi } function wifi_scan() { echo -e "\n>>> Scanning for available wifi networks..." ${CONNMAN} scan wifi } function wifi_connected() { command=$(${CONNMAN} technologies | grep -A 4 wifi | sed -n '5p') if [[ ${command} == *True ]];then echo -e "\n>>> Already connected to a wifi network" return 0 fi return 1 } function wifi_status() { echo -e "\n>>> Wifi status:" ${CONNMAN} technologies | grep -A 4 wifi echo -e "\n>>> Available SSIDs:" ${CONNMAN} services | grep wifi_ } function wifi_config() { echo -e "\n>>> Setting up wifi connection..." retries=5 while [ 1 ]; do ${CONNMAN} scan wifi echo -e "\n>>> Available SSIDs:" ${CONNMAN} services | grep wifi_ fullservice=$(${CONNMAN} services | cut -c 5- | sed 's/ \+ /:/g' | grep "${ssid}:") if [[ -n ${fullservice} ]]; then break fi retries=$(( retries - 1 )) if [[ ${retries} -gt 0 ]]; then echo "waiting for ${ssid} to appear..." sleep 5 continue fi echo "Target ssid not found !" exit 1 done ssid=$(echo "${fullservice}" | awk -F: '{print ${1}}') service=$(echo "${fullservice}" | awk -F: '{print ${2}}') echo "Target ssid found - config is :" echo "SSID : ${ssid}" echo "Service Id : ${service}" echo "Passphrase : ${passphrase}" cat <"${configpath}/${ssid}.config" [service_${service}] Name = ${ssid} Type = wifi Passphrase = ${passphrase} EOF echo "Configuration written" } function wifi_connect() { echo -e "\n>>> Performing connection ..." output=$(${CONNMAN} connect ${service}) if [[ ${output} == Connected* ]];then echo "...Ok." echo ${output} else echo "...connection failed !" echo ${output} wifi_disconnect echo "Check your SSID or your passphrase" read -n 1 -s -r -p "Press any key to continue" exit 1 fi } function wifi_disconnect() { if [[ -z "${ssid}" ]]; then ${CONNMAN} services | cut -c5- | sed 's/ \+ /:/g' | ( while read line; do ssid=$(cut -f1 -d':' <<<${line}) serv=$(cut -f2 -d':' <<<${line}) if [[ "${serv}" =~ ^wifi_ && -f "${configpath}/${ssid}.config" ]]; then echo "Disconnecting ${serv}" ${CONNMAN} disconnect ${serv} echo "Cleaning config ${ssid}.config" rm -rf "${configpath}/${ssid}.config" fi done ) return 0 fi service=$(${CONNMAN} services | cut -c 5- | sed 's/ \+ /:/g' | grep "^${ssid}:" | awk -F: '{print ${2}}') if [[ -z "${service}" ]]; then echo "... unknown service" rm -rf "${configpath}/${ssid}.config" # clear config in all cases return 1 fi output=$(${CONNMAN} disconnect ${service}) rm -rf "${configpath}/${ssid}.config" # clear config in all cases if [[ ${output} == Disconnected* ]];then echo "...Ok." echo ${output} else echo "...disconnection failed !" echo ${output} return 1 fi } # changes made by emuELEC COPTION=${1} CSSID=${2} CPASS=${3} # check for a file named wifi.txt on /storage/.config or /flash # read the content ssid:password and pass it as parameters to the script if [ -f "/storage/.config/wifi.txt" ]; then str=$(cat /storage/.config/wifi.txt) elif [ -f "/flash/wifi.txt" ]; then str=$(cat /flash/wifi.txt) else echo "no wifi.txt found. Make sure you create one in /storage/.config/wifi.txt and add your ssid:password inside" read -n 1 -s -r -p "Press any key to continue" fi IFS=':' # space is set as delimiter read -ra WIFI <<< "${str}" # str is read into an array as tokens separated by IFS [ -z "${COPTION}" ] && COPTION="connect" [ -z "${CSSID}" ] && CSSID=${WIFI[0]} [ -z "${CPASS}" ] && CPASS=${WIFI[1]} if wifi_connected; then ssid=${CSSID} wifi_disconnect echo "WiFi disconnected" read -n 1 -s -r -p "Press any key to continue" exit 0 fi case ${COPTION} in connect) ssid=${CSSID} passphrase=${CPASS} [ -z "${ssid}" ] && error "No ssid defined !" wifi_disconnect wifi_enable wifi_connected && exit 0 wifi_config wifi_connect ;; disconnect) ssid=${CSSID} wifi_disconnect wifi_disable ;; scan) wifi_enable wifi_scan wifi_status ;; status) wifi_status ;; connected) wifi_connected && exit 0 exit 1 ;; *) error "Command line doesn't have any option !" esac read -n 1 -s -r -p "Press any key to continue" ================================================ FILE: packages/sx05re/emuelec/bin/scripts/setup/youtube_search.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present KenshinX and Shanti Gilbert (https://github.com/emuelec) source /usr/bin/env.sh joy2keyStart romdir="/storage/roms/" [[ "${EE_DEVICE}" == "OdroidGoAdvance" ]] && TTY="/dev/tty1" || TTY="/dev/tty" [[ "${EE_DEVICE}" == "GameForce" ]] && TTY="/dev/tty1" || TTY="/dev/tty" function buscarVideo { local f=0 local f2=0 local t=0 local v=0 local ytstreams local yttitles local yttitles2 local ytthumbs #for t in $(seq 0 10 100) ; do sleep 1; echo ${t} | dialog --ascii-lines --backtitle "YouTube Video para EmuElec" --gauge "Generando resultados de la búsqueda..." 10 70 0; done mpv -fs "/storage/.config/splash/youtube-1080.png" --really-quiet ytresults=$(youtube-dl --restrict-filenames -j ytsearchdate10:"${ytSearchMode}") rm /tmp/ytresults echo ${ytresults} > /tmp/ytresults losid=$(grep -o '"webpage_url": *"[^"]*"' /tmp/ytresults | grep -o '"[^"]*"$' | sed 's/"//g') lostitulos=$(grep -o '"fulltitle": *"[^"]*"' /tmp/ytresults | grep -o '"[^"]*"$' | sed 's/"//g'| cut -c 1-50 | sed 's/|/-/g') duracionvideos=$(grep -o ', "duration": *[^,]*' /tmp/ytresults | grep -o '[^ ]*$') videopreview=$(grep -o '"thumbnail": *"[^"]*"' /tmp/ytresults | grep -o '"[^"]*"$' | sed 's/"//g' | sed 's/maxresdefault/hqdefault/g') for f in ${losid}; do ytstreams+=("${f}") done for v in ${videopreview}; do ytthumbs+=("${v}") done let i=0 while read t; do yttitles+=("${t}") let i=${i}+1 done <<< "${duracionvideos}" let i2=0 while read f2; do yttitles2+=(${i2} "${f2} | $(date -d@${yttitles[i2]} -u +%H:%M:%S)") let i2=${i2}+1 done <<< "${lostitulos}" playYTVideo } function playYTVideo { clear selectedstream=$(dialog --ascii-lines --backtitle "YouTube Video for EmuElec" --ok-label "Play" --column-separator "|" --title "${ytResultsLabel}" --menu "Select a video to play" 0 0 0 "${yttitles2[@]}" 3>&2 2>&1 1>&3 > ${TTY}) return_value=$? case ${return_value} in 0) clear mpv -fs "/storage/.config/splash/youtube-1080.png" --really-quiet #mpv -fs "${ytthumbs[selectedstream]}" yt="${ytstreams[selectedstream]}" youtube-dl --quiet --no-warnings -o - ${yt} | mpv - -fs --quiet --really-quiet #playYTVideo playYTVideo ;; 1) menuPrincipal ;; esac } function listarPorYTBfile { clear ytbfilelist=$(cat "/storage/roms/mplayer/youtube.ytb") ytSearchMode=${ytbfilelist} ytResultsLabel="Videos found on local youtube.ytb file:" buscarVideo } function listarPorInput { clear palabra=$(get_ee_setting youtube.searchword) [[ -z "${palabra}" ]] && palabra="emuelec" palabra=$(dialog --stdout --ascii-lines --backtitle "YouTube Video for EmuElec" --title "Search videos from Youtube" --inputbox "Type any term to search for videos" 0 0 "${palabra}" > ${TTY}) retval=$? case ${retval} in 0) [[ -z "${palabra}" ]] && palabra="emuelec" #clear ytSearchMode="${palabra}" ytResultsLabel="Results for: '${palabra}'" buscarVideo ;; 1) menuPrincipal ;; esac } function menuPrincipal { clear opcionmenu=$(dialog --ascii-lines --backtitle "YouTube Video for EmuElec" --title "Play videos from YouTube" --menu "Choose an option" 0 0 0 "1" "Search videos from YouTube" "2" "Play videos from local youtube.ytb file" 3>&2 2>&1 1>&3 > ${TTY}) case ${opcionmenu} in 1) listarPorInput ;; 2) listarPorYTBfile ;; esac } menuPrincipal ================================================ FILE: packages/sx05re/emuelec/bin/setres.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present Joshua L (https://github.com/Langerz82) # 2025-present DiegroSan (https://github.com/Diegrosan) # Read the video output mode and set it for emuelec to avoid video flicking. # This file sets the hdmi output and frame buffer to the argument in pixel width. # Allowed argument example ./setres.sh 1080p60hz <-- For height 1080 pixels. # set -x #echo on # Source predefined functions and variables . /etc/profile FILE_MODE="/sys/class/display/mode" PLATFORM="" #here we look for the best framebuffer; the default is fb0, but on some devices it is fb1. Here we choose the best available, #thus achieving the best video performance. max_area=0 max_fb="" for fb in /sys/class/graphics/fb*/virtual_size; do if [ -f "$fb" ]; then fb_num=$(echo "$fb" | grep -o 'fb[0-9]*' | sed 's/fb//') size=$(cat "$fb") width=$(echo "$size" | cut -d',' -f1) height=$(echo "$size" | cut -d',' -f2) area=$((width * height)) if [ $area -gt $max_area ]; then max_area=$area max_fb=$fb_num fi fi done switch_resolution() { local MODE=${1} # Here we first clear the primary display buffer of leftover artifacts then set # the secondary small buffers flag to stop copying across. echo 1 > /sys/class/graphics/fb${max_fb}/blank case ${MODE} in 480cvbs|576cvbs|480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*|*x*) echo null > "${FILE_MODE}" sleep 1 echo ${MODE} > "${FILE_MODE}" esac echo 0 > /sys/class/graphics/fb${max_fb}/blank NEW_MODE=$( cat ${FILE_MODE} ) [[ "${NEW_MODE}" != "${MODE}" ]] && exit 1 } get_resolution_size() { local MODE=${1} # Here we set the Height and Width of the particular resolution. # FBW - Frame Buffer Width, PSW - Physical Screen Width. # FBH - Frame Buffer Height, PSH - Physical Screen Height. local FBW=${2} local FBH=${3} local PSW=0 local PSH=0 case ${MODE} in 480cvbs) PSW=720 PSH=480 [[ -z "${FBW}" ]] && FBW=1024 [[ -z "${FBH}" ]] && FBH=768 ;; 576cvbs) PSW=720 PSH=576 [[ -z "${FBW}" ]] && FBW=1024 [[ -z "${FBH}" ]] && FBH=768 ;; 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) # For resolution with 2 width and height resolution numbers extract the Height. # *p* stand for progressive and *i* stand for interlaced. case ${MODE} in *p*) PSH=$(echo ${MODE} | cut -d'p' -f 1) ;; *i*) PSH=$(echo ${MODE} | cut -d'i' -f 1) ;; esac PSW=$(( ${PSH}*16/9 )) [[ "${MODE}" == "480"* ]] && PSW=640 [[ -z "${FBW}" || ${FBW} == 0 ]] && FBW=${PSW} [[ -z "${FBH}" || ${FBH} == 0 ]] && FBH=${PSH} ;; *x*) PSW=$(echo ${MODE} | cut -d'x' -f 1) PSH=$(echo ${MODE} | cut -d'x' -f 2 | cut -d'p' -f 1) [ ! -n "${PSH}" ] && PSH=$(echo ${MODE} | cut -d'x' -f 2 | cut -d'i' -f 1) [[ -z "${FBW}" || ${FBW} == 0 ]] && FBW=${PSW} [[ -z "${FBH}" || ${FBH} == 0 ]] && FBH=${PSH} ;; esac echo "${FBW} ${FBH} ${PSW} ${PSH}" } set_main_framebuffer() { local FBW=${1} local FBH=${2} local BPP=32 if [[ -n "${FBW}" && "${FBW}" > 0 && -n "${FBH}" && "${FBH}" > 0 ]]; then MFBH=$(( FBH*2 )) fbset -fb /dev/fb$max_fb -g ${FBW} ${FBH} ${FBW} ${MFBH} ${BPP} [[ -f "/sys/class/graphics/fb$max_fb/free_scale_axis" ]] && echo 0 0 $(( FBW-1 )) $(( FBH-1 )) > /sys/class/graphics/fb$max_fb/free_scale_axis [[ -f "/sys/class/graphics/fb$max_fb/free_scale" ]] && echo 0 > /sys/class/graphics/fb$max_fb/free_scale [[ -f "/sys/class/graphics/fb$max_fb/freescale_mode" ]] && echo 0 > /sys/class/graphics/fb$max_fb/freescale_mode fi } set_fb_borders() { local CUSTOM_OFFSETS=( ${1} ${2} ${3} ${4} ) local COUNT_ARGS=${#CUSTOM_OFFSETS[@]} if [[ "${COUNT_ARGS}" == "4" ]]; then echo ${CUSTOM_OFFSETS[@]} > /sys/class/graphics/fb$max_fb/window_axis echo 1 > /sys/class/graphics/fb$max_fb/freescale_mode echo 0x10001 > /sys/class/graphics/fb$max_fb/free_scale fi } # Here we initialize any arguments and variables to be used in the script. # The Mode we want the display to change too. MODE=$( cat ${FILE_MODE} ) BPP=32 ES_MODE="" if [[ $# == 1 ]]; then MODE=${1} ES_MODE="ee_es." fi if [[ $# == 2 ]]; then MODE=${1} PLATFORM=${2} fi if [[ $# == 3 ]]; then MODE=${1} PLATFORM=${2} ROMNAME=${3} fi FBW=0 FBH=0 # The current display mode before it may get changed below. OLD_MODE=$( cat ${FILE_MODE} ) BORDER_VALS=$(get_ee_setting ee_videowindow) # Legacy code, we use to set the buffer that is used for small parts of graphics # like Cursors and Fonts but setting default 32 made ES Fonts dissappear. BUFF=$(get_ee_setting ee_video_fb1_size) [[ -z "${BUFF}" ]] && BUFF=32 if [[ -n "${BUFF}" ]] && [[ ${BUFF} > 0 ]]; then [[ "${max_fb}" == 0 ]] && fbset -fb /dev/fb1 -g ${BUFF} ${BUFF} ${BUFF} ${BUFF} ${BPP} [[ "${max_fb}" == 1 ]] && fbset -fb /dev/fb0 -g ${BUFF} ${BUFF} ${BUFF} ${BUFF} ${BPP} fi # This is needed to reset scaling. [[ -f "/sys/class/ppmgr/ppscaler" ]] && echo 0 > /sys/class/ppmgr/ppscaler # Option too Custom set the CVBS Resolution by creating a cvbs_resolution.txt file. # File contents must just 2 different integers seperated by a space. e.g. 800 600. CVBS_RES_FILE="/storage/.config/cvbs_resolution.txt" if [[ "${MODE}" == *"cvbs" ]]; then if [[ -f "${CVBS_RES_FILE}" ]]; then declare -a CVBS_RES=($(cat "${CVBS_RES_FILE}")) if [[ ! -z "${CVBS_RES[@]}" ]]; then FBW=${CVBS_RES[0]} FBH=${CVBS_RES[1]} fi fi fi CUSTOM_RES=$(get_ee_setting ${ES_MODE}framebuffer "${PLATFORM}" "${ROMNAME}") #[[ -z "${CUSTOM_RES}" ]] && CUSTOM_RES=$(get_ee_setting ee_framebuffer.${MODE}) if [[ ! -z "${CUSTOM_RES}" ]]; then declare -a RES=($(echo "${CUSTOM_RES}")) if [[ ! -z "${RES[@]}" ]]; then FBW=${RES[0]} FBH=${RES[1]} fi fi if [[ ${OLD_MODE} != ${MODE} ]]; then switch_resolution ${MODE} fi MODE=$( cat ${FILE_MODE} ) declare -a SIZE=($( get_resolution_size ${MODE} ${FBW} ${FBH})) FBW=${SIZE[0]} FBH=${SIZE[1]} PSW=${SIZE[2]} PSH=${SIZE[3]} if [[ "${EE_DEVICE}" == "Amlogic" ]]; then FBW=1920 FBH=1080 fi # Once we know the Width and Height is valid numbers we set the primary display # buffer, and we multiply the 2nd height by a factor of 2 I assume for interlaced # support. CURRENT_SIZE="$( fbset -fb /dev/fb${max_fb} | grep geometry | cut -d' ' -f2-3 )" NEW_SIZE="${FBW} ${FBH}" if [[ "${CURRENT_SIZE}" != "${NEW_SIZE}" ]]; then emuelec-utils blank_buffer echo "SET MAIN FRAME BUFFER" set_main_framebuffer ${FBW} ${FBH} fi # Now that the primary buffer has been acquired we blank it again because the new # memory allocated, may contain garbage artifact data. # Legacy code - I have no idea about these values but apparently they should # make cvbs display properly. The values go over the real values which leads me # to believe that cvbs uses longer pixel ranges because of overscanning. declare -a CUSTOM_OFFSETS if [[ -f "/storage/.config/${MODE}_offsets" ]]; then CUSTOM_OFFSETS=( $( cat "/storage/.config/${MODE}_offsets" ) ) fi OFFSET_SETTING=$(get_ee_setting ${ES_MODE}framebuffer_border "${PLATFORM}" "${ROMNAME}") #[[ -z "${OFFSET_SETTING}" ]] && OFFSET_SETTING="$(get_ee_setting ${MODE}.ee_offsets)" if [[ ! -z "${OFFSET_SETTING}" ]]; then CUSTOM_OFFSETS=( ${OFFSET_SETTING} ) CUSTOM_OFFSETS[2]=$(( ${PSW} - CUSTOM_OFFSETS[2] - 1 )) CUSTOM_OFFSETS[3]=$(( ${PSH} - CUSTOM_OFFSETS[3] - 1 )) fi # Now that the primary buffer has been acquired we blank it again because the new # memory allocated, may contain garbage artifact data. COUNT_ARGS=${#CUSTOM_OFFSETS[@]} if [[ -z "${OFFSET_SETTING}" ]] && [[ "${MODE}" == *"cvbs" ]]; then if [[ "${COUNT_ARGS}" == "0" ]]; then [[ "${MODE}" == "480cvbs" ]] && CUSTOM_OFFSETS="30 10 669 469" [[ "${MODE}" == "576cvbs" ]] && CUSTOM_OFFSETS="35 20 680 565" fi fi COUNT_ARGS=${#CUSTOM_OFFSETS[@]} if [[ "${COUNT_ARGS}" == "0" ]] && [[ ${FBW} != ${PSW} || ${FBH} != ${PSH} ]]; then CUSTOM_OFFSETS=(0 0 $(( PSW - 1 )) $(( PSH - 1 ))) elif [[ "${COUNT_ARGS}" == "2" ]]; then TMP="${CUSTOM_OFFSETS[0]}" CUSTOM_OFFSETS[2]=$(( ${PSW} - ${TMP} - 1 )) TMP="${CUSTOM_OFFSETS[1]}" CUSTOM_OFFSETS[3]=$(( ${PSH} - ${TMP} - 1 )) fi if [[ "${#CUSTOM_OFFSETS[@]}" == "4" ]]; then set_fb_borders ${CUSTOM_OFFSETS[@]} exit 0 fi # Gets the default X, and Y position offsets for cvbs so the display can fit # inside the actual analog diplay resolution which is a bit smaller than the # resolution it's usually transmitted as. declare -a BORDERS BORDER_VALS=$(get_ee_setting ee_videowindow) if [[ ! -z "${BORDER_VALS}" ]]; then BORDERS=(${BORDER_VALS}) COUNT_ARGS=${#BORDERS[@]} if [[ ${COUNT_ARGS} != 4 && ${COUNT_ARGS} != 2 ]]; then exit 0 fi A1=${BORDERS[0]} A2=${BORDERS[1]} A3=${BORDERS[2]} [[ -z "${A3}" ]] && A3=${PSW} A4=${BORDERS[3]} [[ -z "${A4}" ]] && A4=${PSH} if [[ ! -n "${A1}" || ! -n "${A2}" || ! -n "${A3}" || ! -n "${A4}" ]]; then exit 0 fi A3=$(( PSW-A1-1 )) A4=$(( PSH-A2-1 )) set_fb_borders ${A1} ${A2} ${A3} ${A4} fi # End Legacy code ================================================ FILE: packages/sx05re/emuelec/bin/setsettings.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # I use ${} for easier reading # IMPORTANT: This script should not return (echo) anything other than the shader if its set . /etc/profile LOGGING=0 [[ "$(get_es_setting string LogLevel)" == "debug" ]] && LOGGING=1 LOG=/emuelec/logs/setsettings.log RETROARCHIVEMENTS=(3do arcade atari2600 atari7800 atarilynx coleco colecovision famicom fbn fbneo fds gamegear gb gba gbc lynx mame genesis mastersystem megadrive megadrive-japan msx n64 neogeo nes ngp pcengine pcfx pokemini psx saturn sega32x segacd sfc sg-1000 snes tg16 vectrex virtualboy wonderswan) NOREWIND=(sega32x zxspectrum odyssey2 mame n64 dreamcast atomiswave naomi neogeocd saturn psp pspminis) NORUNAHEAD=(psp sega32x n64 dreamcast atomiswave naomi neogeocd saturn) INDEXRATIOS=(4/3 16/9 16/10 16/15 21/9 1/1 2/1 3/2 3/4 4/1 9/16 5/4 6/5 7/9 8/3 8/7 19/12 19/14 30/17 32/9 config squarepixel core custom full) CONF="/storage/.config/emuelec/configs/emuelec.conf" export RA_CONF="/storage/.config/retroarch/retroarch.cfg" RACORECONF="/storage/.config/retroarch/retroarch-core-options.cfg" TMP_RACONF="/tmp/ra_merge_settings.cfg" RACONF="${TMP_RACONF}" if [ "${LOGGING}" ]; then echo "Setsettings Log ${RACONF}" > "${LOG}" fi PLATFORM=${1,,} CORE=${3,,} ROM="${2##*/}" ROM="$(printf '%s' "${ROM}" | sed 's/\([][]\)/\\\1/g')" SETF=0 SHADERSET=0 AUTOLOAD="false" #bezels ISBEZEL="false" IRBEZEL="22" #Autosave AUTOSAVE="$@" AUTOSAVE="${AUTOSAVE#*--autosave=*}" AUTOSAVE="${AUTOSAVE% --*}" #Snapshot SNAPSHOT="$@" SNAPSHOT="${SNAPSHOT#*--snapshot=*}" SNAPSHOT="${SNAPSHOT% --*}" write_log() { local timestamp timestamp="$(date '+%Y-%m-%d %H:%M:%S')" [[ "${LOGGING}" ]] && echo "${timestamp} : ${1}" >> "${LOG}" } # Helper function: check if array contains value array_contains() { local seeking=$1; shift local element for element; do [[ "$element" == "$seeking" ]] && return 0 done return 1 } # Helper function: write boolean setting write_bool() { local key=$1 local value=$2 [ "$value" == "1" ] && echo "${key} = \"true\"" >> ${RACONF} || echo "${key} = \"false\"" >> ${RACONF} } #Self language retroarch EE_LANG=$(get_ee_setting system.language) case "${EE_LANG}" in pt_BR|pt_PT) LANGEMUELEC="7" ;; en_US|en_GB) LANGEMUELEC="0" ;; fr_FR) LANGEMUELEC="2" ;; es_ES|es_MX|eu_ES) LANGEMUELEC="3" ;; de_DE) LANGEMUELEC="4" ;; it_IT) LANGEMUELEC="5" ;; tr_TR) LANGEMUELEC="18" ;; zh_CN) LANGEMUELEC="12" ;; zh_TW) LANGEMUELEC="11" ;; ko_KR) LANGEMUELEC="10" ;; ja_JP) LANGEMUELEC="1" ;; ru_RU) LANGEMUELEC="9" ;; nl_NL) LANGEMUELEC="6" ;; pl_PL) LANGEMUELEC="14" ;; sv_SE) LANGEMUELEC="25" ;; hu_HU) LANGEMUELEC="31" ;; cs_CZ) LANGEMUELEC="27" ;; *) LANGEMUELEC="0" ;; esac echo "user_language = ${LANGEMUELEC}" >> ${TMP_RACONF} write_log "Set Language to ${EE_LANG} Retroarch: ${LANGEMUELEC}" EE_RUMBLE=$(get_ee_setting ee_rumble_strength) [[ -z "${EE_RUMBLE}" ]] && EE_RUMBLE=0 EE_RUMBLE_VAL=0 [[ "${EE_RUMBLE}" -gt 0 ]] && EE_RUMBLE_VAL=1 write_bool "input_enable_vibration" "${EE_RUMBLE_VAL}" echo "input_vibration_vibe_strength = \"${EE_RUMBLE}\"" >> ${TMP_RACONF} write_log "Set Input Vibration Strength to ${EE_RUMBLE}" # For the new snapshot save state manager we need to set the path to be /storage/roms/savestates/[PLATFORM] mkdir -p "/storage/roms/savestates/${PLATFORM}" cat >> ${RACONF} << EOF savestates_in_content_dir = "false" sort_savefiles_by_content_enable = "false" sort_savefiles_enable = "false" sort_savestates_by_content_enable = "false" sort_savestates_enable = "false" savestate_directory = "/storage/roms/savestates/${PLATFORM}" EOF function default_settings() { # IMPORTANT: Every setting we change should have a default value here cat >> ${RACONF} << EOF video_scale_integer = "false" video_scale_integer_overscale = "false" video_shader = "" video_shader_enable = "false" video_smooth = "false" aspect_ratio_index = "22" rewind_enable = "false" run_ahead_enabled = "false" run_ahead_frames = "1" run_ahead_secondary_instance = "false" savestate_auto_save = "false" savestate_auto_load = "false" cheevos_enable = "false" cheevos_username = "" cheevos_password = "" cheevos_hardcore_mode_enable = "false" cheevos_start_active = "false" cheevos_leaderboards_enable = "false" cheevos_verbose_enable = "false" cheevos_auto_screenshot = "false" ai_service_mode = "0" ai_service_enable = "false" ai_service_source_lang = "0" ai_service_url = "" input_libretro_device_p1 = "1" fps_show = "false" netplay = "false" video_oga_vertical_enable = "false" video_ogs_vertical_enable = "false" video_ctx_scaling = "false" video_frame_delay_auto = "false" EOF } function set_setting() { # we set the setting on the configuration file write_log "Called \"${1}\" with \"${2}\"" case ${1} in "ratio") if [[ -z "${2}" || "${2}" == "none" || "${2}" == "0" ]]; then # 22 is the "Core Provided" aspect ratio and its set by default if no other is selected echo 'aspect_ratio_index = "22"' >> ${RACONF} else for i in "${!INDEXRATIOS[@]}"; do if [[ "${INDEXRATIOS[${i}]}" = "${2}" ]]; then break fi done echo "aspect_ratio_index = \"${i}\"" >> ${RACONF} IRBEZEL="${i}" fi ;; "smooth") write_bool "video_smooth" "${2}" ;; "rewind") if array_contains "${PLATFORM}" "${NOREWIND[@]}"; then echo 'rewind_enable = "false"' >> ${RACONF} else write_bool "rewind_enable" "${2}" fi ;; "autosave") if [[ -z "${AUTOSAVE}" || "${AUTOSAVE}" == "0" ]]; then echo 'savestate_auto_save = "false"' >> ${RACONF} echo 'savestate_auto_load = "false"' >> ${RACONF} else write_log "Autosave ${AUTOSAVE}" echo 'savestate_auto_save = "true"' >> ${RACONF} echo 'savestate_auto_load = "true"' >> ${RACONF} AUTOLOAD="true" fi ;; "snapshot") if [[ ! -z "${SNAPSHOT}" ]]; then echo "state_slot = \"${SNAPSHOT}\"" >> ${RACONF} else if [[ "${AUTOLOAD}" == "false" ]]; then echo 'savestate_auto_save = "false"' >> ${RACONF} echo 'savestate_auto_load = "false"' >> ${RACONF} fi echo 'state_slot = "0"' >> ${RACONF} fi ;; "integerscale") write_bool "video_scale_integer" "${2}" [ "${2}" == "1" ] && ISBEZEL="true" || ISBEZEL="false" ;; "integerscaleoverscale") case "${2}" in "1") echo 'video_scale_integer_scaling = "1"' >> "${RACONF}" echo 'video_scale_integer_axis = "1"' >> "${RACONF}" ;; "2") echo 'video_scale_integer_scaling = "2"' >> "${RACONF}" echo 'video_scale_integer_axis = "1"' >> "${RACONF}" ;; *) echo 'video_scale_integer_overscale = "0"' >> "${RACONF}" echo 'video_scale_integer_axis = "0"' >> "${RACONF}" ;; esac ;; "rgascale") write_bool "video_ctx_scaling" "${2}" ;; "shaderset") if [[ -z "${2}" || "${2}" == "none" || "${2}" == "0" ]]; then echo 'video_shader_enable = "false"' >> ${RACONF} echo 'video_shader = ""' >> ${RACONF} else echo "video_shader = \"${2}\"" >> ${RACONF} echo 'video_shader_enable = "true"' >> ${RACONF} echo "--set-shader /tmp/shaders/${2}" fi ;; "runahead") if ! array_contains "${PLATFORM}" "${NORUNAHEAD[@]}"; then if [[ -z "${2}" || "${2}" == "none" || "${2}" == "0" ]]; then echo 'run_ahead_enabled = "false"' >> ${RACONF} echo 'run_ahead_frames = "1"' >> ${RACONF} else echo 'run_ahead_enabled = "true"' >> ${RACONF} echo "run_ahead_frames = \"${2}\"" >> ${RACONF} fi fi ;; "secondinstance") if ! array_contains "${PLATFORM}" "${NORUNAHEAD[@]}"; then write_bool "run_ahead_secondary_instance" "${2}" fi ;; "video_frame_delay_auto") write_bool "video_frame_delay_auto" "${2}" ;; "ai_service_enabled") if [[ -z "${2}" || "${2}" == "none" || "${2}" == "0" ]]; then echo 'ai_service_enable = "false"' >> ${RACONF} else echo 'ai_service_enable = "true"' >> ${RACONF} AI_LANG=$(get_setting "ai_target_lang") AI_URL=$(get_setting "ai_service_url") [[ -z "${AI_LANG}" ]] && AI_LANG="0" echo "ai_service_source_lang = \"${AI_LANG}\"" >> ${RACONF} if [[ -z "${AI_URL}" || "${AI_URL}" == "auto" || "${AI_URL}" == "none" ]]; then echo "ai_service_url = \"http://ztranslate.net/service?api_key=BATOCERA&mode=Fast&output=png&target_lang=${AI_LANG}\"" >> ${RACONF} else echo "ai_service_url = \"${AI_URL}&mode=Fast&output=png&target_lang=${AI_LANG}\"" >> ${RACONF} fi fi ;; "retroachievements") if [[ $(array_contains "${PLATFORM}" "${RETROARCHIVEMENTS[@]}") && "${2}" == "1" ]]; then # Batch read all retroachievements settings at once local RA_USER=$(get_setting "retroachievements.username") local RA_PASS=$(get_setting "retroachievements.password") local RA_HARD=$(get_setting "retroachievements.hardcore") local RA_ENCORE=$(get_setting "retroachievements.encore") local RA_LEAD=$(get_setting "retroachievements.leaderboards") local RA_VERB=$(get_setting "retroachievements.verbose") local RA_SCREEN=$(get_setting "retroachievements.screenshot") echo 'cheevos_enable = "true"' >> ${RACONF} echo "cheevos_username = \"${RA_USER}\"" >> ${RACONF} echo "cheevos_password = \"${RA_PASS}\"" >> ${RACONF} # retroachievements_hardcore_mode write_bool "cheevos_hardcore_mode_enable" "${RA_HARD}" # retroachievements_encore_mode write_bool "cheevos_start_active" "${RA_ENCORE}" # retroachievements_leaderboards write_bool "cheevos_leaderboards_enable" "${RA_LEAD}" # retroachievements_verbose_mode write_bool "cheevos_verbose_enable" "${RA_VERB}" # retroachievements_automatic_screenshot write_bool "cheevos_auto_screenshot" "${RA_SCREEN}" if [ "${RA_SCREEN}" == "1" ]; then echo 'cheevos_auto_screenshot = "true"' >> ${RACONF} echo 'screenshot_directory = "/roms/screenshots"' >> ${RACONF} mkdir -p "/roms/screenshots" else echo 'cheevos_auto_screenshot = "false"' >> ${RACONF} fi else cat >> ${RACONF} << EOF cheevos_enable = "false" cheevos_username = "" cheevos_password = "" cheevos_hardcore_mode_enable = "false" cheevos_start_active = "false" cheevos_leaderboards_enable = "false" cheevos_verbose_enable = "false" cheevos_auto_screenshot = "false" EOF fi ;; "netplay") if [[ -z "${2}" || "${2}" == "none" || "${2}" == "0" ]]; then echo 'netplay = "false"' >> ${RACONF} else echo 'netplay = "true"' >> ${RACONF} # Batch read netplay settings local NP_MODE=$(get_setting "netplay.mode") local NP_PORT=$(get_setting "netplay.port") local NP_IP=$(get_setting "netplay.server.ip") local NP_SPORT=$(get_setting "netplay.server.port") local NP_PASS=$(get_setting "netplay.password") local NP_SPASS=$(get_setting "netplay.spectatepassword") local NP_PUBLIC=$(get_setting "netplay_public_announce") local NP_RELAY=$(get_setting "netplay.relay") local NP_FRAMES=$(get_setting "netplay.frames") local NP_NICK=$(get_setting "netplay.nickname") # Security : hardcore mode disables save states, which would kill netplay # double check if this is not a duplicated entry when it echo 'cheevos_hardcore_mode_enable = "false"' >> ${RACONF} if [[ "${NP_MODE}" == "host" ]]; then # Quite strangely, host mode requires netplay_mode to be set to false when launched from command line echo 'netplay_mode = "false"' >> ${RACONF} echo 'netplay_client_swap_input = "false"' >> ${RACONF} echo "netplay_ip_port = \"${NP_PORT}\"" >> ${RACONF} elif [[ "${NP_MODE}" == "client" || "${NP_MODE}" == "spectator" ]]; then # But client needs netplay_mode = true ... bug ? echo 'netplay_mode = "true"' >> ${RACONF} echo "netplay_ip_address = \"${NP_IP}\"" >> ${RACONF} echo "netplay_ip_port = \"${NP_SPORT}\"" >> ${RACONF} echo 'netplay_client_swap_input = "true"' >> ${RACONF} fi [[ "${NP_MODE}" == "spectator" ]] && echo 'netplay_start_as_spectator = "true"' >> ${RACONF} if [[ -n "${NP_PASS}" && "${NP_PASS}" != "none" && "${NP_PASS}" != "false" ]]; then echo "netplay_password = \"${NP_PASS}\"" >> ${RACONF} fi if [[ -n "${NP_SPASS}" && "${NP_SPASS}" != "none" && "${NP_SPASS}" != "false" ]]; then echo "netplay_spectate_password = \"${NP_SPASS}\"" >> ${RACONF} fi # Netplay hide the gameplay if [[ -n "${NP_PUBLIC}" && "${NP_PUBLIC}" != "none" && "${NP_PUBLIC}" != "false" ]]; then echo 'netplay_public_announce = "true"' >> ${RACONF} else echo 'netplay_public_announce = "false"' >> ${RACONF} fi if [[ -n "${NP_RELAY}" && "${NP_RELAY}" != "none" && "${NP_RELAY}" != "false" ]]; then echo 'netplay_use_mitm_server = "true"' >> ${RACONF} echo "netplay_mitm_server = \"${NP_RELAY}\"" >> ${RACONF} else echo 'netplay_use_mitm_server = "false"' >> ${RACONF} fi echo "netplay_delay_frames = \"${NP_FRAMES}\"" >> ${RACONF} echo "netplay_nickname = \"${NP_NICK}\"" >> ${RACONF} fi ;; "fps") # Display FPS in Retroarch local SHOWFPS=$(get_setting "showFPS") write_bool "fps_show" "${SHOWFPS}" ;; "vertical") # Vertical orientation game if [ "${2}" == "1" ]; then echo 'video_oga_vertical_enable = "true"' >> ${RACONF} local VERT_ASP=$(get_setting "vert_aspect") if [[ -z "${VERT_ASP}" || "${VERT_ASP}" == "none" || "${VERT_ASP}" == "0" || "${VERT_ASP}" == "1" ]]; then echo 'aspect_ratio_index = "1"' >> ${RACONF} IRBEZEL="1" else echo "aspect_ratio_index = \"${VERT_ASP}\"" >> ${RACONF} IRBEZEL="${VERT_ASP}" fi case "$(oga_ver)" in "OGA") [ -f "/tmp/joypads/GO-Advance Gamepad_vertical.cfg" ] && { mv "/tmp/joypads/GO-Advance Gamepad.cfg" "/tmp/joypads/GO-Advance Gamepad_horizontal.cfg" mv "/tmp/joypads/GO-Advance Gamepad_vertical.cfg" "/tmp/joypads/GO-Advance Gamepad.cfg" } ;; "OGABE") [ -f "/tmp/joypads/GO-Advance Gamepad (rev 1.1)_vertical.cfg" ] && { mv "/tmp/joypads/GO-Advance Gamepad (rev 1.1).cfg" "/tmp/joypads/GO-Advance Gamepad (rev 1.1)_horizontal.cfg" mv "/tmp/joypads/GO-Advance Gamepad (rev 1.1)_vertical.cfg" "/tmp/joypads/GO-Advance Gamepad (rev 1.1).cfg" } ;; "OGS") echo 'video_ogs_vertical_enable = "true"' >> ${RACONF} [ -f "/tmp/joypads/GO-Super Gamepad_vertical.cfg" ] && { mv "/tmp/joypads/GO-Super Gamepad.cfg" "/tmp/joypads/GO-Super Gamepad_horizontal.cfg" mv "/tmp/joypads/GO-Super Gamepad_vertical.cfg" "/tmp/joypads/GO-Super Gamepad.cfg" } ;; esac else echo 'video_oga_vertical_enable = "false"' >> ${RACONF} echo 'video_ogs_vertical_enable = "false"' >> ${RACONF} case "$(oga_ver)" in "OGA") [ -f "/tmp/joypads/GO-Advance Gamepad_horizontal.cfg" ] && { mv "/tmp/joypads/GO-Advance Gamepad.cfg" "/tmp/joypads/GO-Advance Gamepad_vertical.cfg" mv "/tmp/joypads/GO-Advance Gamepad_horizontal.cfg" "/tmp/joypads/GO-Advance Gamepad.cfg" } ;; "OGABE") [ -f "/tmp/joypads/GO-Advance Gamepad (rev 1.1)_horizontal.cfg" ] && { mv "/tmp/joypads/GO-Advance Gamepad (rev 1.1).cfg" "/tmp/joypads/GO-Advance Gamepad (rev 1.1)_vertical.cfg" mv "/tmp/joypads/GO-Advance Gamepad (rev 1.1)_horizontal.cfg" "/tmp/joypads/GO-Advance Gamepad (rev 1.1).cfg" } ;; "OGS") [ -f "/tmp/joypads/GO-Super Gamepad_horizontal.cfg" ] && { mv "/tmp/joypads/GO-Super Gamepad.cfg" "/tmp/joypads/GO-Super Gamepad_vertical.cfg" mv "/tmp/joypads/GO-Super Gamepad_horizontal.cfg" "/tmp/joypads/GO-Super Gamepad.cfg" } ;; esac fi ;; esac } function get_setting() { ees -e -r "${1}" -p "${PLATFORM}" -m "${ROM}" } for s in ratio smooth shaderset rewind autosave integerscale integerscaleoverscale runahead secondinstance video_frame_delay_auto retroachievements ai_service_enabled netplay fps vertical rgascale snapshot; do EES=$(get_setting ${s}) set_setting "${s}" "${EES}" [ -z "${EES}" ] || SETF=1 done # If no setting was changed, set all options to default on the configuration files [ ${SETF} == 0 ] && default_settings # Core-specific configurations, these settings should probably be moved to other file or script # TODO: Need to check if file exists first, it may contain other settings that we do not want to remove. if [ "${CORE}" == "atari800" ]; then ATARICONF="/storage/.config/emuelec/configs/atari800.cfg" ATARI800CONF="/storage/.config/retroarch/config/Atari800/Atari800.opt" if [ "${PLATFORM}" == "atari5200" ]; then cat > "${ATARI800CONF}" << EOF atari800_system = "5200" EOF cat > "${ATARICONF}" << EOF RAM_SIZE=16 STEREO_POKEY=0 BUILTIN_BASIC=0 EOF echo 'atari800_system = "5200"' >> ${RACORECONF} else cat > "${ATARI800CONF}" << EOF atari800_system = "800XL (64K)" EOF cat > "${ATARICONF}" << EOF RAM_SIZE=64 STEREO_POKEY=1 BUILTIN_BASIC=1 EOF echo 'atari800_system = "800XL (64K)"' >> ${RACORECONF} fi fi if [ "${PLATFORM}" == "amstradgx4000" ]; then # Make sure cap32_model is set to "6128+ (experimental)" CAP32CONF="/storage/.config/retroarch/config/cap32/cap32.opt" cat > "${CAP32CONF}" << EOF cap32_model = "6128+ (experimental)" cap32_gfx_colors = "24bit" EOF fi if [ "${PLATFORM}" == "amstradcpc" ]; then # But amstradcpc wants cap32_model set to "6128" CAP32CONF="/storage/.config/retroarch/config/cap32/cap32.opt" cat > "${CAP32CONF}" << EOF cap32_model = "6128" cap32_gfx_colors = "16bit" EOF fi if [ "${CORE}" == "gambatte" ]; then GAMBATTECONF="/storage/.config/retroarch/config/Gambatte/Gambatte.opt" COLORIZE=$(get_setting "renderer.colorization") write_log "Gambatte Colorization: ${COLORIZE}" if [[ -z "${COLORIZE}" || "${COLORIZE}" == "auto" || "${COLORIZE}" == "none" ]]; then cat > "${GAMBATTECONF}" << EOF gambatte_gb_colorization = "disabled" gambatte_gb_internal_palette = "" EOF cat >> ${RACORECONF} << EOF gambatte_gb_colorization = "disabled" gambatte_gb_internal_palette = "" EOF elif [ "${COLORIZE}" == "GBC" ]; then cat > "${GAMBATTECONF}" << EOF gambatte_gb_colorization = "GBC" gambatte_gb_internal_palette = "" EOF cat >> ${RACORECONF} << EOF gambatte_gb_colorization = "GBC" gambatte_gb_internal_palette = "" EOF elif [ "${COLORIZE}" == "SGB" ]; then cat > "${GAMBATTECONF}" << EOF gambatte_gb_colorization = "SGB" gambatte_gb_internal_palette = "" EOF cat >> ${RACORECONF} << EOF gambatte_gb_colorization = "SGB" gambatte_gb_internal_palette = "" EOF elif [ "${COLORIZE}" == "Best Guess" ]; then cat > "${GAMBATTECONF}" << EOF gambatte_gb_colorization = "auto" gambatte_gb_internal_palette = "" EOF cat >> ${RACORECONF} << EOF gambatte_gb_colorization = "auto" gambatte_gb_internal_palette = "" EOF else cat > "${GAMBATTECONF}" << EOF gambatte_gb_colorization = "internal" gambatte_gb_internal_palette = "${COLORIZE}" EOF cat >> ${RACORECONF} << EOF gambatte_gb_colorization = "internal" gambatte_gb_internal_palette = "${COLORIZE}" EOF fi fi # We set up the controller index CONTROLLERS="$@" CONTROLLERS="${CONTROLLERS#*--controllers=*}" CONTROLLERS="${CONTROLLERS%% --autosave*}" # until --autosave is found for i in 1 2 3 4 5; do if [[ "${CONTROLLERS}" == *p${i}* ]]; then PINDEX="${CONTROLLERS#*-p${i}index }" PINDEX="${PINDEX%% -p${i}guid*}" PINDEX_UDEV=$(sdl_ra_joystick_map "${PINDEX}") [[ -n "${PINDEX_UDEV}" ]] && PINDEX=${PINDEX_UDEV} echo "input_player${i}_joypad_index = \"${PINDEX}\"" >> ${RACONF} # Setting controller type for different cores [ "${PLATFORM}" == "atari5200" ] && echo "input_libretro_device_p${i} = \"513\"" >> ${RACONF} fi done # EE Device detection read -r EE_DEVICE < /ee_arch MENU_DRV=$(get_setting "retroarch.menu_driver") write_log "Menu driver ${MENU_DRV} for ${EE_DEVICE}" if [[ -z "${MENU_DRV}" || "${MENU_DRV}" == "auto" || "${MENU_DRV}" == "none" || "${MENU_DRV}" == "0" ]]; then if [ "${EE_DEVICE}" == "OdroidGoAdvance" ] || [ "${EE_DEVICE}" == "GameForce" ]; then MENU_DRV="xmb" else MENU_DRV="ozone" fi fi [[ -z "${MENU_DRV}" ]] && MENU_DRV="ozone" echo "menu_driver = \"${MENU_DRV}\"" >> ${RACONF} # Show bezel if enabled BEZEL_SET=$(get_setting "bezel") if [[ -z "${BEZEL_SET}" || "${BEZEL_SET}" == "none" || "${BEZEL_SET}" == "0" ]]; then ${TBASH} bezels.sh "none" "default" "${ISBEZEL}" "${IRBEZEL}" else ${TBASH} bezels.sh "${PLATFORM}" "${ROM}" "${ISBEZEL}" "${IRBEZEL}" fi inverted_ok_cancel=$(get_es_setting bool InvertButtons) [[ ${inverted_ok_cancel} == "true" ]] || inverted_ok_cancel="false" echo "menu_swap_ok_cancel_buttons = \"${inverted_ok_cancel}\"" >> ${RACONF} echo "cheevos_unsupported_notification = \"false\"" >> ${RACONF} # Merge the changes to: /storage/.config/retroarch/retroarch.cfg ees -i ${RACONF} if [[ "${LOGGING}" == "1" ]]; then write_log "- merged settings to retroarch.cfg -" cat "${RACONF}" >> "${LOG}" fi rm ${RACONF} RA_CONF_OVERRIDES="/storage/.config/retroarch/retroarch_overrides.cfg" if [[ -f "${RA_CONF_OVERRIDES}" ]]; then ees -i ${RA_CONF_OVERRIDES} if [[ "${LOGGING}" == "1" ]]; then write_log "- merged ${RA_CONF_OVERRIDES} settings to retroarch.cfg -" cat "${RA_CONF_OVERRIDES}" >> "${LOG}" fi fi ================================================ FILE: packages/sx05re/emuelec/bin/show_splash.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present SumavisionQ5 (https://github.com/SumavisionQ5) # Modifications by Shanti Gilbert (https://github.com/shantigilbert) # 2025-present Mod by DiegroSan # 2025-present Mod by WorstcaseSecenario (https://github.com/worstcase-scenario) # 2025-present Mod by Langerz82 (https://github.com/Langerz82) # 12/07/2019 use mpv for all splash # 19/01/2020 use ffplay for all splash # 06/02/2020 move splash to roms folder and add global splash support # 22/09/2025 various updates. . /etc/profile ENABLE_LOGGING=0 [[ "$(get_es_setting string LogLevel)" == "debug" ]] && ENABLE_LOGGING=1 SPLASH_LOG="/emuelec/logs/splash.log" function write_log() { [[ "${ENABLE_LOGGING}" == 1 ]] && echo "${1}" >> "${SPLASH_LOG}" } ACTION_TYPE="${1}" # Initialize log for each run [[ "${ACTION_TYPE}" != "exit" ]] && echo "Splash log for Platorm ${PLATFORM} and game ${ROMNAME}" > ${SPLASH_LOG} PLATFORM="${2}" ROMNAME="$(printf '%s' "${3}" | sed 's/\([][]\)/\\\1/g')" BASEROMNAME="${ROMNAME##*/}" BASEROMNAME_NOEXT="${BASEROMNAME%.*}" GAMELOADINGSPLASH="/storage/.config/splash/loading-game.png" BLANKSPLASH="/storage/.config/splash/blank.png" DEFAULTSPLASH="/storage/.config/splash/splash-1080.png" VIDEOSPLASH="/usr/config/splash/emuelec_intro_1080p.mp4" RANDOMVIDEO="/storage/roms/splash/introvideos" [ -f "/storage/roms/splash/intro.mp4" ] && VIDEOSPLASH="/storage/roms/splash/intro.mp4" PLATFORM=${PLATFORM,,} PLAYER_VID="ffplay" PLAYER_IMG="mpv" have_mpv=0 case ${PLATFORM} in arcade|fba|fbn|neogeo|mame|cps*) PLATFORM="arcade" ;; retropie|setup) exit 0 ;; esac MODE="$(get_resolution)" SPLASHDIR="/storage/roms/splash" PLATFORMDIR="/storage/roms/${PLATFORM}" IMAGE_EXT=(png jpg jpeg bmp gif) VIDEO_EXT=(mp4 mkv webm avi mov mpg mpeg) #FIND_IMAGE_EXT=$( echo ${IMAGE_EXT[@]} | sed 's/ /\\|/g') #FIND_VIDEO_EXT=$( echo ${VIDEO_EXT[@]} | sed 's/ /\\|/g') COMBINED_EXT=($( echo ${VIDEO_EXT[@]} ${IMAGE_EXT[@]} )) FIND_COMBINED_EXT=$( echo ${COMBINED_EXT[@]} | sed 's/ /\\|/g') mkdir -p /tmp/splash make_absolute_path() { local PATH="${1}" local BASE="${2}" [[ "${PATH}" == ./* ]] && echo "${BASE}/${PATH#./}" || echo "${PATH}" } function get_file_ext() { if [ "${ENABLE_LOGGING}" == 1 ]; then local start_time=$(date +%s%3N) local end_time= fi local MEDIA_FILES=() if [[ -d "${1}" ]]; then MEDIA_FILES=("$(find ${1} -maxdepth 1 -type f -name "${2}.*" -regex ".*\.\(${FIND_COMBINED_EXT}\)$")") fi if [[ ! -z "${MEDIA_FILES[@]}" ]]; then for CEXT in "${COMBINED_EXT[@]}"; do local FILE=$(echo "${MEDIA_FILES[@]}" | grep -e "^.*\.${CEXT}$" ) local FILE_EXT="${FILE##*.}" if [[ "${CEXT}" == "${FILE_EXT}" ]]; then end_time=$(date +%s%3N) duration_ms=$(( end_time - start_time )) write_log "get_file_ext execution time in ms: $duration_ms" echo "${FILE}" && return fi done fi if [ "${ENABLE_LOGGING}" == 1 ]; then end_time=$(date +%s%3N) duration_ms=$(( end_time - start_time )) write_log "get_file_ext execution time in ms: $duration_ms" fi } if [ "${ACTION_TYPE}" = "intro" ] || [ "${ACTION_TYPE}" = "exit" ]; then SPLASH="${DEFAULTSPLASH}" [[ "${MODE}" == *"x"* ]] && SPLASH="/storage/.config/splash/splash-std.png" if [ "${ACTION_TYPE}" = "exit" ]; then EE_SPLASH_EXIT="$(get_ee_setting ee_splashexit)" [[ -z "${EE_SPLASH_EXIT}" ]] && EE_SPLASH_EXIT=0 CUSTOM_EXIT="$(get_ee_setting ee_customexitsplash)" if [ "${EE_SPLASH_EXIT}" = "1" ] && [ -n "${CUSTOM_EXIT}" ] && [ -f "${CUSTOM_EXIT}" ]; then SPLASH="${CUSTOM_EXIT}" fi [[ ! -f "${SPLASH}" ]] && SPLASH="${DEFAULTSPLASH}" fi elif [ "${ACTION_TYPE}" = "blank" ]; then SPLASH="${BLANKSPLASH}" elif [ "${ACTION_TYPE}" = "gameloading" ]; then [[ "${MODE}" == *"x"* ]] && GAMELOADINGSPLASH="/storage/.config/splash/loading-game-std.png" EE_SPLASH_LOADING="$(get_ee_setting ee_splashloading)" [[ -z "${EE_SPLASH_LOADING}" ]] && EE_SPLASH_LOADING=0 CUSTOM_SPLASH="$(get_ee_setting ee_customsplash)" EE_SPLASH_PLATFORM_ROMS="$(get_ee_setting ee_splash_loading_platform_roms)" if [[ "${EE_SPLASH_PLATFORM_ROMS}" != 0 ]]; then SPLASH=$(get_file_ext "${SPLASHDIR}/${PLATFORM}" "${BASEROMNAME_NOEXT}") [[ -z "${SPLASH}" ]] && SPLASH=$(get_file_ext "${SPLASHDIR}/${PLATFORM}" "${PLATFORM}") [[ -z "${SPLASH}" ]] && SPLASH=$(get_file_ext "${SPLASHDIR}/${PLATFORM}" "launching") fi if [ "${EE_SPLASH_LOADING}" = "0" ]; then [[ -z "${SPLASH}" ]] && SPLASH=${GAMELOADINGSPLASH} elif [ "${EE_SPLASH_LOADING}" = "1" ] && [ -n "${CUSTOM_SPLASH}" ] && [ -f "${CUSTOM_SPLASH}" ]; then [[ -z "${SPLASH}" ]] && SPLASH="${CUSTOM_SPLASH}" elif [ "${EE_SPLASH_LOADING}" = "2" ]; then EE_SPLASH_RANDOM_PATH="$(get_ee_setting ee_randomsplashpath)" [[ ! -d "${EE_SPLASH_RANDOM_PATH}" ]] && EE_SPLASH_RANDOM_PATH="${SPLASHDIR}/random" [[ -z "${SPLASH}" ]] && SPLASH="$(find "${EE_SPLASH_RANDOM_PATH}" -maxdepth 1 -type f -regex ".*\.\(${FIND_COMBINED_EXT}\)$" 2>/dev/null | sort -R | head -n 1)" elif [ "${EE_SPLASH_LOADING}" = "3" ]; then if [ -z "${SPLASH}" ]; then PLATFORM_GAMELIST="${PLATFORMDIR}/gamelist.xml" if [ -s "${PLATFORM_GAMELIST}" ]; then write_log "Gamelist.xml found: ${PLATFORM_GAMELIST}" EE_SPLASH_SCRAPED_PATH="$(get_ee_setting ee_scrapedsplashpath)" case "${EE_SPLASH_SCRAPED_PATH}" in image|thumbnail|video|marquee|fanart) write_log "Scraped media: ${EE_SPLASH_SCRAPED_PATH}" SCRAPED_VIDEO=$(xmlstarlet sel -t -v "//game[contains(path, \"${BASEROMNAME}\")]/${EE_SPLASH_SCRAPED_PATH}" "${PLATFORM_GAMELIST}") SCRAPED_VIDEO=$(make_absolute_path "${SCRAPED_VIDEO}" "${PLATFORMDIR}") ;; random) options=(image thumbnail video marquee fanart) # allowed options to search random_index=("${options[@]}") # While we still have options left and haven't found a file, keep trying while [[ ${#random_index[@]} -gt 0 ]]; do idx=$(( RANDOM % ${#random_index[@]} )) value="${random_index[$idx]}" write_log "[Random] Trying xml path: ${value}" SCRAPED_VIDEO=$(xmlstarlet sel -t -v "//game[contains(path, \"${BASEROMNAME}\")]/${value}" "${PLATFORM_GAMELIST}") SCRAPED_VIDEO=$(make_absolute_path "${SCRAPED_VIDEO}" "${PLATFORMDIR}") # If media exists, we're done and we break out of the loop if [[ -f "${SCRAPED_VIDEO}" ]]; then write_log "Found media: ${value} = ${SCRAPED_VIDEO}" break fi # Remove this option from the list unset 'random_index[idx]' # Rebuild the array (important to eliminate gaps in the index) random_index=("${random_index[@]}") done ;; *) SCRAPED_VIDEO=$(xmlstarlet sel -t -v "//game[contains(path, \"${BASEROMNAME}\")]/video" "${PLATFORM_GAMELIST}") SCRAPED_VIDEO=$(make_absolute_path "${SCRAPED_VIDEO}" "${PLATFORMDIR}") if [ -z "${SCRAPED_VIDEO}" ] && [ "${SCRAPED_VIDEO}" != "${PLATFORMDIR}" ]; then SCRAPED_IMAGE=$(xmlstarlet sel -t -v "//game[contains(path, \"${BASEROMNAME}\")]/image" "${PLATFORM_GAMELIST}") SCRAPED_IMAGE=$(make_absolute_path "${SCRAPED_IMAGE}" "${PLATFORMDIR}") fi ;; esac [[ -f "${SCRAPED_IMAGE}" ]] && SPLASH="${SCRAPED_IMAGE}" # We don't care if image was found as videos take priority, so if a video is found we set that instead to SPLASH [[ -f "${SCRAPED_VIDEO}" ]] && SPLASH="${SCRAPED_VIDEO}" else write_log "Gamelist.xml NOT found: ${PLATFORM_GAMELIST}" [[ -z "${SPLASH}" ]] && SPLASH=$(get_file_ext "${PLATFORMDIR}/snap" "${BASEROMNAME_NOEXT}") [[ -z "${SPLASH}" ]] && SPLASH=$(get_file_ext "${PLATFORMDIR}/images" "${BASEROMNAME_NOEXT}-image") fi fi else SPLASH="${GAMELOADINGSPLASH}" fi [[ ! -f "${SPLASH}" ]] && SPLASH="${GAMELOADINGSPLASH}" fi write_log "will show SPLASH: ${SPLASH}" # OGA/GameForce -> mpv SS_DEVICE=0 if [[ "${EE_DEVICE}" == "OdroidGoAdvance" ]] || [[ "${EE_DEVICE}" == "GameForce" ]]; then SS_DEVICE=1 clear > /dev/console echo "Loading ..." > /dev/console PLAYER_VID="mpv" PLAYER_IMG="mpv" have_mpv=1 fi if [[ "${EE_DEVICE}" == "OdroidM1" ]]; then PLAYER_IMG="mpv" have_mpv=1 fi declare -a RES=( ${MODE} ) SCALE="${RES[0]}:${RES[1]}" FILTER_FILL="scale=${SCALE}:force_original_aspect_ratio=increase,crop=${RES[0]}:${RES[1]},setsar=1" MPV_VF="${FILTER_FILL}" [[ "${ACTION_TYPE}" != "intro" ]] && VIDEO=0 || VIDEO="$(get_ee_setting ee_bootvideo.enabled)" is_video() { case "${1,,}" in *.mp4|*.mkv|*.webm|*.avi|*.mov|*.mpg|*.mpeg) return 0;; *) return 1;; esac; } is_image() { case "${1,,}" in *.png|*.jpg|*.jpeg|*.bmp|*.gif) return 0;; *) return 1;; esac; } if [[ -f "/storage/.config/emuelec/configs/novideo" ]] && [[ ${VIDEO} != "1" ]]; then if [ "${ACTION_TYPE}" != "intro" ]; then DURATION="$(get_ee_setting ee_splash_loading_duration)" FALLBACK_SPLASH="${GAMELOADINGSPLASH}" write_log "DURATION is ${DURATION}" if [ "${ACTION_TYPE}" = "exit" ]; then EXIT_DURATION="$(get_ee_setting ee_splash_exit_duration)" DURATION="${EXIT_DURATION}" FALLBACK_SPLASH="/storage/roms/splash/exitsplash.png" fi if [ -z "${DURATION}" ] || [ ! -n ${DURATION} ]; then DURATION=0 fi # if no is_image and no is_video. if is_image "${SPLASH}" == 1 && is_video "${SPLASH}" == 1; then SPLASH="${FALLBACK_SPLASH}" fi if is_image "${SPLASH}"; then if [ "${have_mpv}" -eq 1 ]; then ${PLAYER_IMG} --fullscreen --no-keepaspect --vf="${MPV_VF}" --image-display-duration=${DURATION} "${SPLASH}" >/dev/null 2>&1 else ffplay -fs -loglevel error -nostats -vf "${FILTER_FILL}" -i "${SPLASH}" -autoexit >/dev/null 2>&1 sleep ${DURATION} fi elif is_video "${SPLASH}"; then # get video lenght VID_DURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "${SPLASH}") write_log "Video duration: ${VID_DURATION}" DURATION_INT=${DURATION%.*} VID_DURATION_INT=${VID_DURATION%.*} # compare durations and set the one that is lower if [ "$VID_DURATION_INT" -lt "$DURATION_INT" ]; then DURATION=${VID_DURATION} write_log "Setting Duration to video duration: ${VID_DURATION}" fi if [ "${DURATION}" -le 3 ]; then DURATION=3 fi write_log "FINAL DURATION ${DURATION}" if [ "${PLAYER_VID}" = "ffplay" ]; then ${PLAYER_VID} -fs -autoexit -loglevel error -nostats -vf "${FILTER_FILL}" -t ${DURATION} -i "${SPLASH}" >/dev/null 2>&1 else ${PLAYER_VID} --fullscreen --no-keepaspect --vf="${MPV_VF}" --length=${DURATION} "${SPLASH}" -t 1 >/dev/null 2>&1 fi fi fi else RND="$(get_ee_setting ee_randombootvideo.enabled)" if [ "${RND}" = "1" ]; then SPLASH="$(ls ${RANDOMVIDEO}/*.mp4 2>/dev/null | sort -R | tail -1)" [[ -z "${SPLASH}" ]] && SPLASH="${VIDEOSPLASH}" else SPLASH="${VIDEOSPLASH}" fi set_audio alsa if [ ${SS_DEVICE} -eq 1 ]; then ${PLAYER_VID} --fullscreen --no-keepaspect --vf="${MPV_VF}" "${SPLASH}" >/dev/null 2>&1 else ${PLAYER_VID} -fs -autoexit -vf "${FILTER_FILL}" -i "${SPLASH}" >/dev/null 2>&1 fi touch "/storage/.config/emuelec/configs/novideo" fi SPLASHTIME="$(get_ee_setting ee_splash.delay)" [ -n "${SPLASHTIME}" ] && sleep "${SPLASHTIME}" ================================================ FILE: packages/sx05re/emuelec/bin/updatecheck.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) . /etc/profile UPDINFO="https://raw.githubusercontent.com/EmuELEC/emuelec.github.io/master/settings/EE_update" UPDURL="https://github.com/EmuELEC/EmuELEC/releases/download/v" TEST_UPDURL="https://github.com/EmuELEC/EmuELEC-tests/releases/download/v" BUILDATE=$(cat /usr/buildate) arguments="$@" if [[ "${arguments}" == *"forceupdate"* ]]; then systemctl stop emustation ee_console enable clear /dev/tty0 while pgrep -f emulationstation; do clear /dev/tty0 echo "Waiting for Emulationstation to quit..." > /dev/tty0 sleep 1 done fi UPDTYPE=$(get_ee_setting updates.type) [[ -z "${UPDTYPE}" ]] && UPDTYPE="stable" [[ "${UPDTYPE}" != "stable" ]] && UPDURL="${TEST_UPDURL}" function do_cleanup() { rm -rf /storage/.update/* > /dev/null 2>&1 } function no_update() { echo "no" do_cleanup if [[ "${arguments}" == *"forceupdate"* ]]; then ee_console disable systemctl start emustation fi exit 1 } function forced_update() { ee_console enable echo "Downloadinng ${UPDURL} to /storage/.update/${UFILE}" > /dev/tty0 touch "/storage/.update/${UFILE}" wget "${UPDURL}" -O "/storage/.update/${UFILE}" || echo "Exit code: $?" > /dev/tty0 # Try to download an sha256 checksum echo "Trying to download sha256 checksum" > /dev/tty0 wget -q "${UPDURL}.sha256" -O "/storage/.update/${UFILE}.sha256" if test -e "/storage/.update/${UFILE}.sha256"; then echo "Doing checksum..." > /dev/tty0 DISTMD5=$(cat "/storage/.update/${UFILE}.sha256" | cut -d ' ' -f 1) CURRMD5=$(sha256sum "/storage/.update/${UFILE}" | cut -d ' ' -f 1) if test "${DISTMD5}" = "${CURRMD5}"; then echo "Valid checksum...continuing" > /dev/tty0 else text_viewer -e -w -t "Invalid Checksum!" -f 24 -m "invalid checksum. Got +${DISTMD5}+. Attempted +${CURRMD5}+.\n\n FORCE UPDATE ABORTED!" no_update exit 1 fi else echo "No checksum found. Won't check the file." > /dev/tty0 fi echo "Aplying update" > /dev/tty0 sync systemctl stop emustation while pgrep -f emulationstation; do clear /dev/tty0 echo "Waiting for Emulationstation to quit..." > /dev/tty0 sleep 1 done emuelec-utils clearconfig EMUS systemctl reboot exit 0 } function check_update() { if [[ "${arguments}" == *"canupdate"* ]]; then echo "${UPDATEVERP}" elif [[ "${arguments}" == *"geturl"* ]]; then echo "${UPDURL}" elif [[ "${arguments}" == *"getsize"* ]]; then USIZE=$(wget "${UPDURL}" --spider --server-response -O - 2>&1 | sed -ne '/Content-Length:/{s/.*: //;p}' | tail -1) echo "${USIZE}" fi } #make sure there is no old update do_cleanup # To avoid curl error "(23) Failed writing body", we download the full page to /tmp/eeupd and use cat to read it then delete it curl -s ${UPDINFO} -o /tmp/eeupd UPDDATA=$(cat /tmp/eeupd | grep "${UPDTYPE}") rm /tmp/eeupd [ -z "${UPDDATA}" ] && no_update OLDIFS=${IFS} IFS=';' read -r -a updinfo <<< "${UPDDATA}" IFS=${OLDIFS} UVER="${updinfo[0]}" UFILE="EmuELEC-${EE_DEVICE}.aarch64-${UVER}" if [[ "${EE_DEVICE}" == "OdroidGoAdvance" ]]; then UFILE+="-odroidgo2.tar" elif [[ "${EE_DEVICE}" == "GameForce" ]]; then UFILE+="-chi.tar" elif [[ "${EE_DEVICE}" == "RK356x" ]]; then UFILE+="-rk356x.tar" else UFILE+=".tar" fi UPDURL+="${UVER}/${UFILE}" #check if file exists if ! curl --head --fail --silent "${UPDURL}" >/dev/null; then if [[ "${arguments}" == *"forceupdate"* ]]; then text_viewer -e -w -t "ERROR!" -f 24 -m "The update file either does not exists or you are not connected to the internet! FORCE UPDATE ABORTED!\n\nEmulationstation will now restart!" no_update fi no_update fi CVER=$(cat /usr/config/EE_VERSION) [[ -z "${CVER}" ]] && no_update if $(echo "${CVER}" | grep -q "TEST"); then CVER=$(echo "${CVER}" | sed "s|-TEST-||") fi UVER=$(echo "${UVER}" | sed "s|-TEST-||") [[ -z "${UVER}" ]] && no_update CURRENTVER="${CVER%%.*}${CVER#*.}" UPDATEVER="${UVER%%.*}${UVER#*.}" UPDATEVERP="${UVER}" CURRENTVER="${CURRENTVER%%-*}" UPDATEVER="${UPDATEVER%%-*}" # If current or update version is only 2 digits, then we add 99999999 to allow updating from beta to stable and viceversa [ ${#CURRENTVER} == 2 ] && CURRENTVER="${CURRENTVER}99999999" [ ${#UPDATEVER} == 2 ] && UPDATEVER="${UPDATEVER}99999999" # if you use forceupdate as an argument you can forcibly download the latest STABLE release and call an update if [[ "${arguments}" == *"forceupdate"* ]]; then text_viewer -y -w -t "Force update!" -f 24 -m "A forced update has been called, this will download the latest release depending on your type settings (stable or test/beta)\n\nThe system will reboot if the update file is downloaded succesfully.\n\nAre you sure you want to continue?" if [[ $? == 21 ]]; then forced_update else echo "Force update canceled." no_update exit 1 fi else if [ "${UPDATEVER}" -gt "${CURRENTVER}" ] ; then check_update else no_update fi fi ================================================ FILE: packages/sx05re/emuelec/config/EE_VERSION ================================================ 4.8 ================================================ FILE: packages/sx05re/emuelec/config/asound.conf-amlogic ================================================ ## not needed #pcm.!default { #type plug #slave { #pcm "hw:0,0" #} #} ================================================ FILE: packages/sx05re/emuelec/config/asound.conf-amlogic-ng ================================================ pcm.!default { type plug slave.pcm "softvol" } pcm.softvol { type softvol slave { pcm "dmixer" } control { name "Master" card 0 } min_dB -50.0 max_dB 0.0 } pcm.dmixer { type dmix ipc_key 1024 slave { pcm "hw:0,0" period_time 0 period_size 1024 buffer_size 4096 rate 44100 } bindings { 0 0 1 1 } } ================================================ FILE: packages/sx05re/emuelec/config/asound.conf-amlogic-no ================================================ pcm.!default { type plug slave.pcm "softvol" } pcm.softvol { type softvol slave { pcm "dmixer" } control { name "Master" card 0 } min_dB -50.0 max_dB 0.0 } pcm.dmixer { type dmix ipc_key 1024 slave { pcm "hw:0,0" period_time 0 period_size 1024 buffer_size 4096 rate 44100 } bindings { 0 0 1 1 } } ================================================ FILE: packages/sx05re/emuelec/config/autostart.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # WARNING DO NOT modify this file it will do nothing, if you need to use autostart please use /storage/.config/custom_start.sh ================================================ FILE: packages/sx05re/emuelec/config/custom_start.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile # Place any scripts you need to run at boot on this file case "${1}" in "before") # Any commands that you want to run before the frontend begins should go here # example BT config, use only as a last resort # Bluetooth, Make sure you change your BT MAC address, you need to do this by SSH the first time # by running # hcitool scan # bluetoothctl pair yourmac # bluetoothctl trust yourmac # If you want to use bluetooth, uncomment every line after this one # BTMAC="E4:17:D8:8B:F1:80" # ( # echo "agent on" | bluetoothctl # echo "default-agent" | bluetoothctl # echo "power on" | bluetoothctl # echo "discoverable on" | bluetoothctl # echo "pairable on" | bluetoothctl # echo "scan on" | bluetoothctl # echo "trust ${BTMAC}" | bluetoothctl # echo "connect ${BTMAC}" | bluetoothctl # )& exit 0 ;; *) # Any commands that you want to run after the frontend has started goes here exit 0 ;; esac ## nothing was called so exit exit 0 ================================================ FILE: packages/sx05re/emuelec/config/emuelec/bin/put_user_bins_here ================================================ Place user bins here, they will take priority over /usr Please take care of the added binaries by yourself and remember to clean/update them if neccessary for each update as they may be outdated and break some other programs ================================================ FILE: packages/sx05re/emuelec/config/emuelec/configs/all/autoconf.cfg ================================================ 8bitdo_hack = "0" ================================================ FILE: packages/sx05re/emuelec/config/emuelec/configs/all/bluetooth.cfg ================================================ connect_mode="default" ================================================ FILE: packages/sx05re/emuelec/config/emuelec/configs/all/scraper.cfg ================================================ use_thumbs = "1" screenshots = "0" max_width = "400" max_height = "400" console_src = "2" mame_src = "2" rom_name = "0" append_only = "0" use_rom_folder = "1" download_videos = "1" download_marquees = "0" ================================================ FILE: packages/sx05re/emuelec/config/emuelec/configs/all/skyscraper.cfg ================================================ rom_name = "0" use_rom_folder = "1" download_videos = "0" cache_marquees = "1" cache_covers = "1" cache_wheels = "1" cache_screenshots = "1" scrape_source = "thegamesdb" remove_brackets = "0" force_refresh = "0" ================================================ FILE: packages/sx05re/emuelec/config/emuelec/configs/atari800.cfg ================================================ Atari 800 Emulator, Version 3.1.0 ROM_OS_A_NTSC= ROM_OS_A_PAL=/storage/roms/bios/ATARIOSA.ROM ROM_OS_B_NTSC= ROM_OS_AA00R10= ROM_OS_AA00R11= ROM_OS_BB00R1= ROM_OS_BB01R2=/storage/roms/bios/ATARIXL.ROM ROM_OS_BB02R3= ROM_OS_BB02R3V4= ROM_OS_CC01R4= ROM_OS_BB01R3= ROM_OS_BB01R4= ROM_OS_BB01R59= ROM_OS_BB01R59A= ROM_5200=/storage/roms/bios/5200.rom ROM_5200_A=/storage/roms/bios/5200a.rom ROM_BASIC_A=/storage/roms/bios/BASIC_Rev_A.rom ROM_BASIC_B=/storage/roms/bios/BASIC_Rev_B.rom ROM_BASIC_C=/storage/roms/bios/ATARIBAS.ROM ROM_XEGAME= ROM_400/800_CUSTOM=/storage/roms/bios/ATARIOSB.ROM ROM_XL/XE_CUSTOM= ROM_5200_CUSTOM= ROM_BASIC_CUSTOM= ROM_XEGAME_CUSTOM= OS_400/800_VERSION=AUTO OS_XL/XE_VERSION=AUTO OS_5200_VERSION=AUTO BASIC_VERSION=AUTO XEGS_GAME_VERSION=AUTO H1_DIR= H2_DIR= H3_DIR= H4_DIR= HD_READ_ONLY=1 PRINT_COMMAND=lpr %s SCREEN_REFRESH_RATIO=1 MACHINE_TYPE=Atari 5200 DEFAULT_TV_MODE=NTSC MOSAIC_RAM_NUM_BANKS=0 AXLON_RAM_NUM_BANKS=0 ENABLE_MAPRAM=0 DISABLE_BASIC=1 ENABLE_SIO_PATCH=0 ENABLE_SLOW_XEX_LOADING=0 ENABLE_H_PATCH=0 ENABLE_P_PATCH=0 ENABLE_NEW_POKEY=1 KEYBOARD_LEDS=0 F_KEYS=0 BUILTIN_GAME=0 KEYBOARD_DETACHED=0 1200XL_JUMPER=0 CFG_SAVE_ON_EXIT=0 MIO_ROM= BLACK_BOX_ROM= PROTO80_ROM= CARTRIDGE_FILENAME= CARTRIDGE_TYPE=0 CARTRIDGE_PIGGYBACK_FILENAME= CARTRIDGE_PIGGYBACK_TYPE=0 CARTRIDGE_AUTOREBOOT=1 CASSETTE_FILENAME= CASSETTE_LOADED=0 CASSETTE_WRITE_PROTECT=0 RTIME=1 XEP80_CHARSET= AF80_ROM= AF80_CHARSET= COLOURS_NTSC_SATURATION=0 COLOURS_NTSC_CONTRAST=0 COLOURS_NTSC_BRIGHTNESS=0 COLOURS_NTSC_GAMMA=2.35 COLOURS_NTSC_HUE=0 COLOURS_NTSC_GTIA_DELAY=26.8 COLOURS_NTSC_EXTERNAL_PALETTE= COLOURS_NTSC_EXTERNAL_PALETTE_LOADED=0 COLOURS_NTSC_ADJUST_EXTERNAL_PALETTE=0 COLOURS_PAL_SATURATION=0 COLOURS_PAL_CONTRAST=0 COLOURS_PAL_BRIGHTNESS=0 COLOURS_PAL_GAMMA=2.35 COLOURS_PAL_HUE=0 COLOURS_PAL_GTIA_DELAY=23.2 COLOURS_PAL_EXTERNAL_PALETTE= COLOURS_PAL_EXTERNAL_PALETTE_LOADED=0 COLOURS_PAL_ADJUST_EXTERNAL_PALETTE=0 ARTIFACT_NTSC=NONE ARTIFACT_PAL=NONE ARTIFACT_NTSC_MODE=0 SCREEN_SHOW_SPEED=0 SCREEN_SHOW_IO_ACTIVITY=1 SCREEN_SHOW_IO_COUNTER=0 SCREEN_SHOW_1200XL_LEDS=1 FILTER_NTSC_SHARPNESS=-0.5 FILTER_NTSC_RESOLUTION=-0.1 FILTER_NTSC_ARTIFACTS=0 FILTER_NTSC_FRINGING=0 FILTER_NTSC_BLEED=0 FILTER_NTSC_BURST_PHASE=0 SOUND_ENABLED=1 SOUND_RATE=44100 SOUND_BITS=16 SOUND_BUFFER_MS=0 SOUND_LATENCY=20 RAM_SIZE=16 STEREO_POKEY=0 BUILTIN_BASIC=0 ================================================ FILE: packages/sx05re/emuelec/config/emuelec/configs/bezels/arcademap.cfg ================================================ arcade_1941 = "1941" arcade_1941j = "1941" arcade_1941r1 = "1941" arcade_1941u = "1941" arcade_1942 = "1942" arcade_1942a = "1942" arcade_1942abl = "1942" arcade_1942b = "1942" arcade_1942c64 = "1942" arcade_1942h = "1942" arcade_1942w = "1942" arcade_1943 = "1943" arcade_1943b = "1943" arcade_1943b2 = "1943" arcade_1943bj = "1943" arcade_1943j = "1943" arcade_1943ja = "1943" arcade_1943jah = "1943" arcade_1943kai = "1943kai" arcade_1943mii = "1943mii" arcade_1943u = "1943" arcade_1943ua = "1943" arcade_1944 = "1944" arcade_1944ad = "1944" arcade_1944d = "1944" arcade_1944j = "1944" arcade_1945kiii = "1945kiii" arcade_1945kiiin = "1945kiii" arcade_1945kiiio = "1945kiii" arcade_19xx = "19xx" arcade_19xxa = "19xx" arcade_19xxar1 = "19xx" arcade_19xxb = "19xx" arcade_19xxd = "19xx" arcade_19xxh = "19xx" arcade_19xxj = "19xx" arcade_19xxjr1 = "19xx" arcade_19xxjr2 = "19xx" arcade_2020bb = "2020bb" arcade_2020bba = "2020bb" arcade_2020bbh = "2020bb" arcade_20pacgal = "20pacgal" arcade_20pacgalr0 = "20pacgal" arcade_20pacgalr1 = "20pacgal" arcade_20pacgalr2 = "20pacgal" arcade_20pacgalr3 = "20pacgal" arcade_20pacgalr4 = "20pacgal" arcade_25pacman = "25pacman" arcade_25pacmano = "25pacman" arcade_280zzzap = "280zzzap" arcade_3countb = "3countb" arcade_3countba = "3countb" arcade_3in1semi = "3in1semi" arcade_3kokushi = "3kokushi" arcade_3stooges = "3stooges" arcade_3wonders = "3wonders" arcade_3wondersb = "3wonders" arcade_3wondersh = "3wonders" arcade_3wondersha = "3wonders" arcade_3wondersr1 = "3wonders" arcade_3wondersu = "3wonders" arcade_3wonderu = "3wonders" arcade_3x3puzzl = "3x3puzzl" arcade_3x3puzzla = "3x3puzzl" arcade_40love = "40love" arcade_47pie2 = "47pie2" arcade_47pie2o = "47pie2" arcade_4dwarrio = "4dwarrio" arcade_4enraya = "4enraya" arcade_4enrayaa = "4enraya" arcade_4in1 = "4in1" arcade_4in1boot = "4in1boot" arcade_4play = "4play" arcade_5 = "5" arcade_600 = "turtles" arcade_64streej = "64street" arcade_64street = "64street" arcade_64streetj = "64street" arcade_64streetja = "64street" arcade_720 = "720" arcade_720g = "720" arcade_720gr1 = "720" arcade_720r1 = "720" arcade_720r2 = "720" arcade_720r3 = "720" arcade_7jigen = "7jigen" arcade_7ordi = "7ordi" arcade_7toitsu = "mgakuen" arcade_800fath = "mariner" arcade_88games = "88games" arcade_8ball = "8ball" arcade_8ball1 = "8ball" arcade_8ballact = "8ballact" arcade_8ballat2 = "8ballact" arcade_8bpm = "8ballact" arcade_99lstwar = "repulse" arcade_99lstwara = "repulse" arcade_99lstwarb = "repulse" arcade_99lstwark = "repulse" arcade_99lstwra = "sonofphx" arcade_9ballsh2 = "coolpool" arcade_9ballsh3 = "coolpool" arcade_9ballsht = "coolpool" arcade_a51mxr3k = "area51mx" arcade_aafb = "aafb" arcade_aafbb = "aafb" arcade_aafbc = "aafb" arcade_aafbd2p = "aafb" arcade_abaseb = "abaseb" arcade_abaseb2 = "abaseb" arcade_abcop = "abcop" arcade_abcopd = "abcop" arcade_abcopj = "abcop" arcade_abcopjd = "abcop" arcade_ablast = "penbros" arcade_abscam = "puckman" arcade_aburner = "aburner2" arcade_aburner2 = "aburner2" arcade_aburner2g = "aburner2" arcade_ace = "ace" arcade_aceattac = "aceattac" arcade_aceattaca = "aceattac" arcade_acedrvrw = "acedrvrw" arcade_acitya = "bwcasino" arcade_acrobatm = "acrobatm" arcade_actfanc1 = "actfancr" arcade_actfancj = "actfancr" arcade_actfancr = "actfancr" arcade_actfancr1 = "actfancr" arcade_actfancr2 = "actfancr" arcade_actfancrj = "actfancr" arcade_ad2083 = "ad2083" arcade_aeroboto = "formatz" arcade_aerofgt = "aerofgt" arcade_aerofgtb = "aerofgt" arcade_aerofgtc = "aerofgt" arcade_afighter = "afighter" arcade_afightera = "afighter" arcade_afighterb = "afighter" arcade_agallet = "agallet" arcade_agalleta = "agallet" arcade_agalletah = "agallet" arcade_agalletaj = "agallet" arcade_agalletak = "agallet" arcade_agalletat = "agallet" arcade_agalletau = "agallet" arcade_agalleth = "agallet" arcade_agalletj = "agallet" arcade_agalletk = "agallet" arcade_agallett = "agallet" arcade_agalletu = "agallet" arcade_agentx1 = "cloak" arcade_agentx2 = "cloak" arcade_agentx3 = "cloak" arcade_agentx4 = "cloak" arcade_agress = "agress" arcade_agressb = "agress" arcade_ainferno = "ainferno" arcade_airass = "airass" arcade_airattck = "airattck" arcade_airattcka = "airattck" arcade_airbustj = "airbustr" arcade_airbustr = "airbustr" arcade_airbustrb = "airbustr" arcade_airbustrj = "airbustr" arcade_airco22b = "airco22b" arcade_aircombj = "aircombj" arcade_aircombu = "aircombj" arcade_airduel = "airduel" arcade_airduelm72 = "airduel" arcade_airraid = "cshooter" arcade_airwolf = "airwolf" arcade_airwolfa = "airwolf" arcade_ajax = "ajax" arcade_ajaxj = "ajax" arcade_akiss = "akiss" arcade_akkanvdr = "spcinv95" arcade_akumajou = "hcastle" arcade_akumajoun = "hcastle" arcade_alcon = "alcon" arcade_alexkida = "alexkidd" arcade_alexkidd = "alexkidd" arcade_alexkidd1 = "alexkidd" arcade_alibaba = "alibaba" arcade_alibabab = "alibaba" arcade_alien3 = "alien3" arcade_alienar = "alienar" arcade_alienaru = "alienaru" arcade_aliencha = "aliencha" arcade_alienchac = "aliencha" arcade_alieninv = "invaders" arcade_aliens = "aliens" arcade_aliens2 = "aliens" arcade_aliens3 = "aliens" arcade_aliensa = "aliens" arcade_aliensec = "aliensec" arcade_aliensj = "aliens" arcade_aliensj2 = "aliens" arcade_aliensu = "aliens" arcade_aliensya = "aliensyn" arcade_aliensyb = "aliensyn" arcade_aliensyj = "aliensyn" arcade_aliensyn = "aliensyn" arcade_aliensyn2 = "aliensyn" arcade_aliensyn3 = "aliensyn" arcade_aliensyn5 = "aliensyn" arcade_aliensyn7 = "aliensyn" arcade_aliensynj = "aliensyn" arcade_aliensynjo = "aliensyn" arcade_aligator = "aligator" arcade_aligators = "aligator" arcade_aligatorun = "aligator" arcade_aligatoruna = "aligator" arcade_aligatun = "aligator" arcade_alinvade = "alinvade" arcade_alleymas = "alleymas" arcade_alphaho = "alphaho" arcade_alpham2 = "alpham2" arcade_alpham2p = "alpham2" arcade_alphamis = "aso" arcade_alphaona = "mhavoc" arcade_alphaone = "mhavoc" arcade_alphaxz = "m660" arcade_alpine = "alpine" arcade_alpinea = "alpine" arcade_alpinerc = "alpinerd" arcade_alpinerd = "alpinerd" arcade_altbeas2 = "altbeast" arcade_altbeast = "altbeast" arcade_altbeast2 = "altbeast" arcade_altbeast4 = "altbeast" arcade_altbeast5 = "altbeast" arcade_altbeast5d = "altbeast" arcade_altbeast6 = "altbeast" arcade_altbeastbl = "altbeast" arcade_altbeastj = "altbeast" arcade_altbeastj1 = "altbeast" arcade_altbeastj3 = "altbeast" arcade_altbeastj3d = "altbeast" arcade_amatelas = "amazon" arcade_amazon = "amazon" arcade_ambush = "ambush" arcade_ambushh = "ambush" arcade_ambushj = "ambush" arcade_ambusht = "ambush" arcade_ambushv = "ambush" arcade_amerdart = "amerdart" arcade_amidar = "amidar" arcade_amidar1 = "amidar" arcade_amidarb = "amidar" arcade_amidaro = "amidar" arcade_amidars = "amidar" arcade_amidaru = "amidar" arcade_amigo = "amidar" arcade_amspdwy = "amspdwy" arcade_amspdwya = "amspdwy" arcade_androdun = "androdun" arcade_androidp = "androidp" arcade_androidpo = "androidp" arcade_andromed = "andromed" arcade_angelkds = "angelkds" arcade_anteater = "anteater" arcade_anteaterg = "anteater" arcade_anteateruk = "anteater" arcade_aodk = "aodk" arcade_aof = "aof" arcade_aof2 = "aof2" arcade_aof2a = "aof2" arcade_aof3 = "aof3" arcade_aof3k = "aof3" arcade_apb = "apb" arcade_apb1 = "apb" arcade_apb2 = "apb" arcade_apb3 = "apb" arcade_apb4 = "apb" arcade_apb5 = "apb" arcade_apb6 = "apb" arcade_apbf = "apb" arcade_apbg = "apb" arcade_aponow = "rescue" arcade_apparel = "apparel" arcade_appoooh = "appoooh" arcade_aquajack = "aquajack" arcade_aquajackj = "aquajack" arcade_aquajacku = "aquajack" arcade_aquajckj = "aquajack" arcade_aquarium = "aquarium" arcade_aquariumj = "aquarium" arcade_aquarush = "aquarush" arcade_arabfgt = "arabfgt" arcade_arabiamj = "arabianm" arcade_arabiamu = "arabianm" arcade_arabian = "arabian" arcade_arabiana = "arabian" arcade_arabianm = "arabianm" arcade_arabianmj = "arabianm" arcade_arabianmu = "arabianm" arcade_aracnis = "scorpion" arcade_arbalest = "arbalest" arcade_arcadecl = "arcadecl" arcade_arcadia = "nyny" arcade_arcadian = "arcadian" arcade_archriv2 = "archrivl" arcade_archrivl = "archrivl" arcade_area51 = "area51" arcade_area51mx = "area51mx" arcade_area88 = "unsquad" arcade_area88r = "unsquad" arcade_arescue = "arescue" arcade_argus = "argus" arcade_arian = "aso" arcade_ark1ball = "arkanoid" arcade_ark1balla = "arkanoid" arcade_arkangc = "arkanoid" arcade_arkangc2 = "arkanoid" arcade_arkanoid = "arkanoid" arcade_arkanoidj = "arkanoid" arcade_arkanoidja = "arkanoid" arcade_arkanoidjb = "arkanoid" arcade_arkanoidjbl = "arkanoid" arcade_arkanoidjbl2 = "arkanoid" arcade_arkanoidjbla = "arkanoid" arcade_arkanoidu = "arkanoid" arcade_arkanoiduo = "arkanoid" arcade_arkarea = "arkarea" arcade_arkatayt = "arkanoid" arcade_arkatour = "arkatour" arcade_arkbl2 = "arkanoid" arcade_arkbl3 = "arkanoid" arcade_arkbloc2 = "arkanoid" arcade_arkblock = "arkanoid" arcade_arkgcbl = "arkanoid" arcade_arknid2j = "arknoid2" arcade_arknid2u = "arknoid2" arcade_arknoid2 = "arknoid2" arcade_arknoid2b = "arknoid2" arcade_arknoid2j = "arknoid2" arcade_arknoid2u = "arknoid2" arcade_arknoidj = "arkanoid" arcade_arknoidu = "arkanoid" arcade_arknoiuo = "arkanoid" arcade_arkretrn = "arkretrn" arcade_arkretrnj = "arkretrn" arcade_arkretrnu = "arkretrn" arcade_arktayt2 = "arkanoid" arcade_arlingtn = "arlingtn" arcade_armedf = "armedf" arcade_armedff = "armedf" arcade_armora = "armora" arcade_armorap = "armora" arcade_armorar = "armora" arcade_armorca2 = "armorcar" arcade_armorcar = "armorcar" arcade_armorcar2 = "armorcar" arcade_armwar = "armwar" arcade_armwar1d = "armwar" arcade_armwara = "armwar" arcade_armwarar1 = "armwar" arcade_armwarr1 = "armwar" arcade_armwaru = "armwar" arcade_armwaru1 = "armwar" arcade_armwrest = "armwrest" arcade_ashnojoe = "scessjoe" arcade_ashura = "ashura" arcade_ashuraj = "ashura" arcade_ashurau = "ashura" arcade_asideral = "uniwars" arcade_aso = "aso" arcade_assault = "assault" arcade_assaultj = "assault" arcade_assaultp = "assault" arcade_astdelu1 = "astdelux" arcade_astdelux = "astdelux" arcade_asterix = "asterix" arcade_asterixaad = "asterix" arcade_asterixeaa = "asterix" arcade_asterixeac = "asterix" arcade_asterixj = "asterix" arcade_asterock = "asteroid" arcade_asteroi1 = "asteroid" arcade_asteroib = "asteroid" arcade_asteroid = "asteroid" arcade_astinvad = "astinvad" arcade_astorm = "astorm" arcade_astorm2p = "astorm" arcade_astorm3 = "astorm" arcade_astorm3d = "astorm" arcade_astormbl = "astorm" arcade_astormj = "astorm" arcade_astormjd = "astorm" arcade_astormu = "astorm" arcade_astormud = "astorm" arcade_astrass = "astrass" arcade_astrians = "galaxian" arcade_astrob = "astrob" arcade_astrob1 = "astrob" arcade_astrob2 = "astrob" arcade_astrof = "astrof" arcade_astrof2 = "astrof" arcade_astrof3 = "astrof" arcade_astrofl = "transfrm" arcade_astrxeaa = "asterix" arcade_astrxeac = "asterix" arcade_astyanax = "astyanax" arcade_asuka = "asuka" arcade_asukaj = "asuka" arcade_asurabld = "asurabld" arcade_asurabus = "asurabus" arcade_asurabusa = "asurabus" arcade_asylum = "asylum" arcade_atarifb = "atarifb" arcade_atarifb1 = "atarifb" arcade_atarifb4 = "atarifb" arcade_ataxx = "ataxx" arcade_ataxxa = "ataxx" arcade_ataxxj = "ataxx" arcade_atehate = "atehate" arcade_atetckt2 = "atetris" arcade_atetcktl = "atetris" arcade_atetris = "atetris" arcade_atetrisa = "atetris" arcade_atetrisb = "atetris" arcade_atetrisb2 = "atetris" arcade_atetrisc = "atetris" arcade_atetrisc2 = "atetris" arcade_athena = "athena" arcade_athenab = "athena" arcade_atlantis = "atlantis" arcade_atlantis2 = "atlantis" arcade_atlantisb = "atlantis" arcade_atlantol = "trackfld" arcade_atlants2 = "atlantis" arcade_atomboy = "wilytowr" arcade_atomboya = "wilytowr" arcade_atomicp = "atomicp" arcade_atompunk = "dynablst" arcade_aurail = "aurail" arcade_aurail1 = "aurail" arcade_aurail1d = "aurail" arcade_auraila = "aurail" arcade_aurailj = "aurail" arcade_aurailjd = "aurail" arcade_av2mj1bb = "av2mj1bb" arcade_av2mj2rg = "av2mj2rg" arcade_avalnche = "avalnche" arcade_avefenix = "phoenix" arcade_avefenixl = "phoenix" arcade_avefenixrf = "phoenix" arcade_avenger2 = "avengers" arcade_avengers = "avengers" arcade_avengers2 = "avengers" arcade_avengrgs = "avengrgs" arcade_avengrgsj = "avengrgs" arcade_avsp = "avsp" arcade_avspa = "avsp" arcade_avspd = "avsp" arcade_avsph = "avsp" arcade_avspirit = "avspirit" arcade_avspj = "avsp" arcade_avspu = "avsp" arcade_aztarac = "aztarac" arcade_azurian = "azurian" arcade_b2b = "b2b" arcade_backfire = "backfire" arcade_backfirea = "backfire" arcade_backfirt = "backfirt" arcade_baddudes = "baddudes" arcade_badlands = "badlands" arcade_bagman = "bagman" arcade_bagmanm2 = "bagman" arcade_bagmanmc = "bagman" arcade_bagmans = "bagman" arcade_bagmans2 = "bagman" arcade_bagnard = "bagman" arcade_bakatono = "bakatono" arcade_bakubaku = "bakubaku" arcade_bakubrkr = "explbrkr" arcade_bakuhatu = "mjgottsu" arcade_bakutotu = "bakutotu" arcade_balcube = "balcube" arcade_ballbomb = "ballbomb" arcade_ballboy = "snowbro3" arcade_ballbros = "ballbros" arcade_balonfgt = "balonfgt" arcade_baluba = "baluba" arcade_bananadr = "bananadr" arcade_bandido = "sheriff" arcade_bang = "bang" arcade_bangball = "bangball" arcade_bangbead = "bangbead" arcade_bangbedp = "bangbead" arcade_bangj = "bang" arcade_bankp = "bankp" arcade_baraduka = "baraduke" arcade_baraduke = "aliensec" arcade_barricad = "barricad" arcade_barrier = "barrier" arcade_baryon = "baryon" arcade_baryona = "baryon" arcade_basebal2 = "basebal2" arcade_batcir = "batcir" arcade_batcira = "batcir" arcade_batcird = "batcir" arcade_batcirj = "batcir" arcade_batlbubl = "bangball" arcade_batman = "batman" arcade_batman2 = "phoenix" arcade_batmanfr = "batmanfr" arcade_batrider = "batrider" arcade_batriderc = "batrider" arcade_batriderhk = "batrider" arcade_batriderj = "batrider" arcade_batriderja = "batrider" arcade_batriderk = "batrider" arcade_batridert = "batrider" arcade_batrideru = "batrider" arcade_batridra = "batrider" arcade_batridrk = "batrider" arcade_batsugun = "batsugun" arcade_batsuguna = "batsugun" arcade_batsugunb = "batsugun" arcade_batsugunsp = "batsugun" arcade_battlan2 = "battlane" arcade_battlan3 = "battlane" arcade_battlane = "battlane" arcade_battlane2 = "battlane" arcade_battlane3 = "battlane" arcade_battlcry = "battlcry" arcade_battleg = "battleg" arcade_battlega = "battleg" arcade_battlegb = "battleg" arcade_battlera = "battlera" arcade_battles = "xevious" arcade_battlex = "battlex" arcade_battlntj = "battlnts" arcade_battlnts = "battlnts" arcade_battlntsa = "battlnts" arcade_battlntsj = "battlnts" arcade_battroad = "battroad" arcade_batugnsp = "batsugun" arcade_batwings = "bwing" arcade_bayrouta = "bayroute" arcade_bayroute = "bayroute" arcade_bayroute1 = "bayroute" arcade_bayrouted = "bayroute" arcade_bayroutej = "bayroute" arcade_bayroutejd = "bayroute" arcade_bayrtbl1 = "bayroute" arcade_bayrtbl2 = "bayroute" arcade_bbakradu = "bbakraid" arcade_bbakraid = "bbakraid" arcade_bbakraidc = "bbakraid" arcade_bbakraidj = "bbakraid" arcade_bbakraidja = "bbakraid" arcade_bballs = "bballs" arcade_bballsa = "bballs" arcade_bbbuster = "bbbuster" arcade_bbbxing = "bbbxing" arcade_bbmanw = "bbmanw" arcade_bbmanwj = "bbmanw" arcade_bbmanwja = "bbmanw" arcade_bbonk = "bbonk" arcade_bbprot = "bbprot" arcade_bbredux = "bublbobl" arcade_bbros = "pang" arcade_bbusters = "bbusters" arcade_bbustersj = "bbusters" arcade_bbustersja = "bbusters" arcade_bbustersu = "bbusters" arcade_bbustersua = "bbusters" arcade_bchopper = "bchopper" arcade_bcrusher = "kncljoe" arcade_bcruzm12 = "bcruzm12" arcade_bcstry = "bcstry" arcade_bcstrya = "bcstry" arcade_beaminv = "beaminv" arcade_beast = "beast" arcade_beastf = "suprglob" arcade_beastfp = "suprglob" arcade_beastrzb = "beastrzb" arcade_beastrzr = "beastrzr" arcade_beathead = "beathead" arcade_beezer = "beezer" arcade_beezer1 = "beezer" arcade_benberob = "benberob" arcade_berabohm = "berabohm" arcade_berabohmb = "berabohm" arcade_beraboho = "berabohm" arcade_berlwall = "berlwall" arcade_berlwallk = "berlwall" arcade_berlwallt = "berlwall" arcade_berlwalt = "berlwall" arcade_bermudaa = "bermudat" arcade_bermudao = "bermudat" arcade_bermudat = "bermudat" arcade_bermudata = "worldwar" arcade_bermudatj = "bermudat" arcade_berzerk = "berzerk" arcade_berzerk1 = "berzerk" arcade_bestbest = "bestbest" arcade_bestleag = "bigstrik" arcade_bestleaw = "bigstrik" arcade_bestri = "bestri" arcade_bgaregga = "bgaregga" arcade_bgareggabl = "bgaregga" arcade_bgareggabla = "bgaregga" arcade_bgareggacn = "bgaregga" arcade_bgareggahk = "bgaregga" arcade_bgaregganv = "bgaregga" arcade_bgareggat2 = "bgaregga" arcade_bgareggatw = "bgaregga" arcade_bgareggaz = "bgaregga" arcade_bigbang = "tdragon2" arcade_bigbucks = "bigbucks" arcade_bigevglf = "bigevglf" arcade_bigfghtr = "skyrobo" arcade_bigkarnk = "bigkarnk" arcade_bigprowr = "bigprowr" arcade_bigrun = "bigrun" arcade_bigstrik = "bigstrik" arcade_bigstrkb = "bigstrik" arcade_bigstrkba = "bigstrik" arcade_bigtwin = "bigtwin" arcade_bijokkog = "bijokkog" arcade_bijokkoy = "bijokkoy" arcade_bikkuric = "bikkuric" arcade_billiard = "hustler" arcade_bioatack = "bioatack" arcade_biofreak = "biofreak" arcade_biomtoy = "biomtoy" arcade_biomtoya = "biomtoy" arcade_biomtoyb = "biomtoy" arcade_bionicc = "bionicc" arcade_bionicc1 = "bionicc" arcade_bionicc2 = "bionicc" arcade_bioniccbl = "bionicc" arcade_bioniccbl2 = "bionicc" arcade_bioplayc = "biomtoy" arcade_bioship = "bioship" arcade_birdiy = "birdiy" arcade_birdtry = "birdtry" arcade_bishi = "bishi" arcade_bjourney = "bjourney" arcade_bjourneyh = "bjourney" arcade_bjtwin = "bjtwin" arcade_bjtwina = "bjtwin" arcade_bking = "bking" arcade_bking2 = "bking2" arcade_bking3 = "bking3" arcade_bkrtmaq = "bkrtmaq" arcade_bktigerb = "blktiger" arcade_bladestl = "bladestl" arcade_bladestle = "bladestl" arcade_bladestll = "bladestl" arcade_bladstle = "bladestl" arcade_blandia = "blandia" arcade_blandiap = "blandia" arcade_blasted = "blasted" arcade_blaster = "blaster" arcade_blastkit = "blaster" arcade_blasto = "blasto" arcade_blastoff = "blastoff" arcade_blazeon = "blazeon" arcade_blazer = "blazer" arcade_blazstar = "blazstar" arcade_blckgalb = "blockgal" arcade_blckout2 = "blockout" arcade_blckoutj = "blockout" arcade_bldwolf = "battlera" arcade_blitz = "blitz" arcade_blitz2k = "blitz2k" arcade_blitz99 = "blitz99" arcade_blkbustr = "mrjong" arcade_blkdrgnb = "blktiger" arcade_blkdrgon = "blktiger" arcade_blkdrgonb = "blktiger" arcade_blkhearj = "blkheart" arcade_blkheart = "blkheart" arcade_blkheartj = "blkheart" arcade_blkhole = "blkhole" arcade_blkpnthr = "blkpnthr" arcade_blktiger = "blktiger" arcade_blktigera = "blktiger" arcade_blktigerb1 = "blktiger" arcade_blktigerb2 = "blktiger" arcade_blktigerb3 = "blktiger" arcade_blmbycar = "blmbycar" arcade_blmbycaru = "blmbycar" arcade_blmbycau = "blmbycar" arcade_block = "block" arcade_blocka = "block" arcade_blockade = "blockade" arcade_blockbl = "block" arcade_blockcar = "blockcar" arcade_blocken = "blocken" arcade_blockgal = "blockgal" arcade_blockhl = "blockhl" arcade_blockj = "block" arcade_blockout = "blockout" arcade_blockout2 = "blockout" arcade_blockoutj = "blockout" arcade_blockr1 = "block" arcade_blockr2 = "block" arcade_bloodbro = "bloodbro" arcade_bloodbroj = "bloodbro" arcade_bloodbroja = "bloodbro" arcade_bloodbrou = "bloodbro" arcade_bloods11 = "bloodstm" arcade_bloods21 = "bloodstm" arcade_bloods22 = "bloodstm" arcade_bloodstm = "bloodstm" arcade_bloodwar = "bloodwar" arcade_blox16b = "bloxeed" arcade_bloxeed = "bloxeed" arcade_bloxeedc = "bloxeed" arcade_bloxeedd = "bloxeed" arcade_blsthead = "blstroid" arcade_blstroi2 = "blstroid" arcade_blstroi3 = "blstroid" arcade_blstroid = "blstroid" arcade_blstroig = "blstroid" arcade_blswhstl = "blswhstl" arcade_blswhstla = "blswhstl" arcade_bluehawk = "bluehawk" arcade_bluehawkn = "bluehawk" arcade_bluehawn = "bluehawk" arcade_blueprnj = "blueprnt" arcade_blueprnt = "blueprnt" arcade_blueprntj = "blueprnt" arcade_blueshrk = "blueshrk" arcade_blzntrnd = "blzntrnd" arcade_bm1stmix = "bm1stmix" arcade_bm2ndmix = "bm2ndmix" arcade_bm2ndmxa = "bm2ndmix" arcade_bm4thmix = "bm4thmix" arcade_bmaster = "bmaster" arcade_bmcompmx = "bmcompmx" arcade_bmcorerm = "bmcorerm" arcade_bmdct = "bmdct" arcade_bnglngby = "bnglngby" arcade_bnj = "brubber" arcade_bnzabros = "bnzabros" arcade_boblbobl = "bublbobl" arcade_boblcave = "bublbobl" arcade_bodyslam = "bodyslam" arcade_bogeyman = "bogeyman" arcade_boggy84 = "boggy84" arcade_boggy84b = "boggy84" arcade_bombbee = "bombbee" arcade_bomber = "scramble" arcade_bombjac2 = "bombjack" arcade_bombjack = "bombjack" arcade_bombjack2 = "bombjack" arcade_bombjackt = "bombjack" arcade_bombkick = "bombkick" arcade_bombkicka = "bombkick" arcade_bombrman = "dynablst" arcade_bongo = "bongo" arcade_bonkadv = "bonkadv" arcade_bonzeadu = "bonzeadv" arcade_bonzeadv = "bonzeadv" arcade_bonzeadvo = "bonzeadv" arcade_bonzeadvp = "bonzeadv" arcade_bonzeadvu = "bonzeadv" arcade_boobhack = "horekid" arcade_boogwing = "boogwing" arcade_boogwinga = "boogwing" arcade_boogwingu = "boogwing" arcade_boomrang = "boomrang" arcade_bootcamp = "combasc" arcade_boothill = "boothill" arcade_borench = "borench" arcade_bosco = "bosco" arcade_boscomd = "bosco" arcade_boscomdo = "bosco" arcade_boscoo = "bosco" arcade_boscoo2 = "bosco" arcade_botanic = "botanic" arcade_bottom9 = "bottom9" arcade_bottom9n = "bottom9" arcade_bouldash = "bouldash" arcade_bouldashj = "bouldash" arcade_bouldshj = "bouldash" arcade_bounty = "bounty" arcade_bowler = "bowler" arcade_bowlrama = "bowlrama" arcade_boxer = "boxer" arcade_boxingb = "boxingb" arcade_boxyboy = "boxyboy" arcade_bradley = "bradley" arcade_brain = "brain" arcade_brapboys = "brapboys" arcade_brapboysj = "brapboys" arcade_brapboysp = "brapboys" arcade_brapboyspj = "brapboys" arcade_brapboyspu = "brapboys" arcade_brdrlinb = "brdrline" arcade_brdrline = "brdrline" arcade_brdrlinet = "brdrline" arcade_brdrlins = "brdrline" arcade_breakers = "breakers" arcade_breakrev = "breakrev" arcade_breywood = "shackled" arcade_brickyrd = "barricad" arcade_brickzn = "brickzn" arcade_brickzn3 = "brickzn" arcade_brival = "brival" arcade_brix = "zzyzzyxx" arcade_brkthru = "brkthru" arcade_brkthruj = "brkthru" arcade_brubber = "brubber" arcade_brutforc = "brutforc" arcade_brvblade = "brvblade" arcade_bshark = "bshark" arcade_bsharkj = "bshark" arcade_bsharkjjs = "bshark" arcade_bsharku = "bshark" arcade_bsktball = "bsktball" arcade_bssoccer = "bssoccer" arcade_bstars = "bstars" arcade_bstars2 = "bstars2" arcade_bstarsh = "bstars" arcade_btime = "btime" arcade_btime2 = "btime" arcade_btime3 = "btime" arcade_btimem = "btime" arcade_btlecity = "btlecity" arcade_btlfield = "timesold" arcade_btlfieldb = "timesold" arcade_btlkroad = "btlkroad" arcade_btlkroadk = "btlkroad" arcade_btoads = "btoads" arcade_bub68705 = "bublbobl" arcade_bub68705a = "bublbobl" arcade_bubblem = "bubblem" arcade_bubblemj = "bubblem" arcade_bubbles = "bubbles" arcade_bubblesp = "bubbles" arcade_bubblesr = "bubbles" arcade_bubbletr = "bubbletr" arcade_bubbletrj = "bubbletr" arcade_bubbobr1 = "bublbobl" arcade_bubl2000 = "bubl2000" arcade_bublbob1 = "bublbobl" arcade_bublbob2 = "bublbob2" arcade_bublbob2o = "bublbob2" arcade_bublbob2p = "bublbob2" arcade_bublbobl = "bublbobl" arcade_bublbobl1 = "bublbobl" arcade_bublboblb = "bublbobl" arcade_bublboblp = "bublbobl" arcade_bublboblr = "bublbobl" arcade_bublboblr1 = "bublbobl" arcade_bublboblu = "bublbobl" arcade_bublbobr = "bublbobl" arcade_bublcave = "bublbobl" arcade_bublcave10 = "bublbobl" arcade_bublcave11 = "bublbobl" arcade_bubsympe = "bublbob2" arcade_bubsymph = "bublbob2" arcade_bubsymphb = "bublbob2" arcade_bubsymphe = "bublbob2" arcade_bubsymphj = "bublbob2" arcade_bubsymphu = "bublbob2" arcade_bubsympu = "bublbob2" arcade_bucaner = "puckman" arcade_buccanrs = "buccanrs" arcade_buccanrsa = "buccanrs" arcade_buccanrsb = "buccanrs" arcade_buckrog = "buckrog" arcade_buckrogn = "buckrog" arcade_bucky = "bucky" arcade_buckyaa = "bucky" arcade_buckyaab = "bucky" arcade_buckyea = "bucky" arcade_buckyjaa = "bucky" arcade_buckyua = "bucky" arcade_buckyuab = "bucky" arcade_buggychl = "buggychl" arcade_buggycht = "buggychl" arcade_bullet = "bullet" arcade_bulletd = "bullet" arcade_bullfgt = "bullfgt" arcade_bullfgtr = "bullfgtr" arcade_buraiken = "avengers" arcade_burglarx = "burglarx" arcade_burnforc = "burnforc" arcade_burnforco = "burnforc" arcade_burningf = "burningf" arcade_burningfh = "burningf" arcade_burningfp = "burningf" arcade_burningfpa = "burningf" arcade_burningh = "burningf" arcade_butasan = "butasan" arcade_buzzard = "gyrodine" arcade_bwcasino = "bwcasino" arcade_bwidow = "bwidow" arcade_bwing = "bwing" arcade_bwings = "bwings" arcade_bwingsa = "bwings" arcade_bwingso = "bwings" arcade_bygone = "bygone" arcade_bzone = "bzone" arcade_bzone2 = "bzone" arcade_bzonec = "bzone" arcade_cabal = "cabal" arcade_cabala = "cabal" arcade_cabalbl = "cabal" arcade_cabaluk = "cabal" arcade_cabalukj = "cabal" arcade_cabalus = "cabal" arcade_cabalus2 = "cabal" arcade_cabaret = "cabaret" arcade_cachat = "cachat" arcade_cactus = "sabotenb" arcade_cadanglr = "cadanglr" arcade_cadash = "cadash" arcade_cadashf = "cadash" arcade_cadashg = "cadash" arcade_cadashi = "cadash" arcade_cadashj = "cadash" arcade_cadashj1 = "cadash" arcade_cadashjo = "cadash" arcade_cadashp = "cadash" arcade_cadashs = "cadash" arcade_cadashu = "cadash" arcade_cairblad = "cairblad" arcade_calibr50 = "calibr50" arcade_calipso = "calipso" arcade_calorie = "calorie" arcade_calorieb = "calorie" arcade_calspeed = "calspeed" arcade_cameltrj = "cameltry" arcade_cameltry = "cameltry" arcade_cameltrya = "cameltry" arcade_cameltryau = "cameltry" arcade_cameltryj = "cameltry" arcade_camltrua = "cameltry" arcade_candance = "osman" arcade_candory = "ponpoko" arcade_cannball = "cannball" arcade_cannballv = "cannball" arcade_cannonb = "cannonb" arcade_cannonbp = "cannonbp" arcade_canvas = "canvas" arcade_canyon = "canyon" arcade_canyonp = "canyon" arcade_capbowl = "capbowl" arcade_capbowl2 = "capbowl" arcade_capbowl3 = "capbowl" arcade_capbowl4 = "capbowl" arcade_capitol = "pleiads" arcade_captaven = "captaven" arcade_captavena = "captaven" arcade_captavene = "captaven" arcade_captavenj = "captaven" arcade_captavenu = "captaven" arcade_captavenua = "captaven" arcade_captavenuu = "captaven" arcade_captavna = "captaven" arcade_captavne = "captaven" arcade_captavnj = "captaven" arcade_captavnu = "captaven" arcade_captavuu = "captaven" arcade_captcomj = "captcomm" arcade_captcomm = "captcomm" arcade_captcommb = "captcomm" arcade_captcommb2 = "captcomm" arcade_captcommj = "captcomm" arcade_captcommjr1 = "captcomm" arcade_captcommr1 = "captcomm" arcade_captcommu = "captcomm" arcade_captcomu = "captcomm" arcade_car2 = "headon2" arcade_caractn = "brubber" arcade_carhntds = "carhntds" arcade_carjmbre = "carjmbre" arcade_carnevil = "carnevil" arcade_carnival = "carnival" arcade_carnivalc = "carnival" arcade_carnivalh = "carnival" arcade_carnivalha = "carnival" arcade_carnvckt = "carnival" arcade_carpolo = "carpolo" arcade_casanova = "casanova" arcade_cashquiz = "cashquiz" arcade_castfant = "castfant" arcade_catacomb = "catacomb" arcade_catapult = "catapult" arcade_catch22 = "combat" arcade_catt = "mcatadv" arcade_cavelon = "cavelon" arcade_cavenger = "cavenger" arcade_cawing = "cawing" arcade_cawingb2 = "cawing" arcade_cawingbl = "cawing" arcade_cawingj = "cawing" arcade_cawingr1 = "cawing" arcade_cawingu = "cawing" arcade_cawingur1 = "cawing" arcade_cbasebal = "cbasebal" arcade_cbdash = "cbdash" arcade_cbnj = "cburnrub" arcade_cbtime = "cbtime" arcade_cburnrb2 = "cburnrub" arcade_cburnrub = "cburnrub" arcade_cburnrub2 = "cburnrub" arcade_cbuster = "cbuster" arcade_cbusterj = "cbuster" arcade_cbusterw = "cbuster" arcade_ccasino = "ccasino" arcade_ccastle2 = "ccastles" arcade_ccastle3 = "ccastles" arcade_ccastlej = "ccastles" arcade_ccastles = "ccastles" arcade_ccboot = "cclimber" arcade_ccboot2 = "cclimber" arcade_cchasm = "cchasm" arcade_cchasm1 = "cchasm" arcade_cclimber = "cclimber" arcade_cclimbera = "cclimber" arcade_cclimberj = "cclimber" arcade_cclimbr2 = "cclimbr2" arcade_cclimbr2a = "cclimbr2" arcade_cclimbrj = "cclimber" arcade_cdiscon1 = "cdiscon1" arcade_cdsteljn = "cdsteljn" arcade_cencourt = "passsht" arcade_centipb2 = "centiped" arcade_centipd2 = "centiped" arcade_centipdb = "centiped" arcade_centiped = "centiped" arcade_centiped3 = "centiped" arcade_centtime = "centiped" arcade_cerberus = "cerberus" arcade_cexplore = "cexplore" arcade_cfboy0a1 = "cfboy0a1" arcade_cfghtice = "cfghtice" arcade_cfishing = "cadanglr" arcade_cflyball = "cflyball" arcade_cgangpzj = "cgangpzl" arcade_cgangpzl = "cgangpzl" arcade_cgraplop = "cgraplop" arcade_cgraplop2 = "cgraplop" arcade_cgraplp2 = "cgraplop" arcade_chainrec = "chainrec" arcade_chaknpop = "chaknpop" arcade_challeng = "challeng" arcade_chamburger = "cbtime" arcade_chameleo = "chameleo" arcade_champbas = "champbas" arcade_champbb2 = "champbb2" arcade_champbbj = "champbas" arcade_champbja = "champbas" arcade_champwr = "champwr" arcade_champwrj = "champwr" arcade_champwru = "champwr" arcade_chanbara = "chanbara" arcade_changes = "changes" arcade_changesa = "changes" arcade_charlien = "charlien" arcade_chasehq = "chasehq" arcade_chasehqj = "chasehq" arcade_chasehqju = "chasehq" arcade_chasehqu = "chasehq" arcade_chboxing = "chboxing" arcade_checkmaj = "checkman" arcade_checkman = "checkman" arcade_checkmanj = "checkman" arcade_checkmat = "checkmat" arcade_cheekyms = "cheekyms" arcade_cheesech = "cheesech" arcade_chelnov = "chelnov" arcade_chelnovj = "chelnov" arcade_chelnovu = "chelnov" arcade_chewing = "luctoday" arcade_cheyenne = "cheyenne" arcade_chikij = "mtwins" arcade_chiller = "chiller" arcade_chimerab = "chimerab" arcade_chinagat = "chinagat" arcade_chinatwn = "chinatwn" arcade_chinher2 = "chinhero" arcade_chinhero = "chinhero" arcade_chinmoku = "chinmoku" arcade_chkun = "chkun" arcade_chokchok = "chokchok" arcade_choko = "choko" arcade_choplift = "choplift" arcade_chopliftbl = "choplift" arcade_chopliftu = "choplift" arcade_chopper = "chopper" arcade_choppera = "chopper" arcade_chopperb = "chopper" arcade_chplft = "chplft" arcade_chplftb = "chplft" arcade_chplftbl = "chplft" arcade_chqflag = "chqflag" arcade_chqflagj = "chqflag" arcade_chukatai = "chukatai" arcade_chukataij = "chukatai" arcade_chukataija = "chukatai" arcade_chukataiu = "chukatai" arcade_chukataj = "chukatai" arcade_chukatau = "chukatai" arcade_chwrestl = "chwrestl" arcade_chwy = "chwy" arcade_circus = "circus" arcade_circusc = "circusc" arcade_circusc2 = "circusc" arcade_circusc3 = "circusc" arcade_circusc4 = "circusc" arcade_circuscc = "circusc" arcade_circusce = "circusc" arcade_cischeat = "cischeat" arcade_citybmrj = "citybomb" arcade_citybomb = "citybomb" arcade_citybombj = "citybomb" arcade_citycon = "citycon" arcade_citycona = "citycon" arcade_citylove = "citylove" arcade_ckong = "ckong" arcade_ckonga = "ckong" arcade_ckongalc = "ckong" arcade_ckongg = "ckong" arcade_ckongjeu = "ckong" arcade_ckongmc = "ckong" arcade_ckongo = "ckong" arcade_ckongpt2 = "ckongpt2" arcade_ckongs = "ckong" arcade_clapapa = "clapapa" arcade_clapapa2 = "clapapa" arcade_claypign = "claypign" arcade_clayshoo = "clayshoo" arcade_clbowl = "capbowl" arcade_cleopatr = "cleopatr" arcade_cloak = "cloak" arcade_cloakfr = "cloak" arcade_cloakgr = "cloak" arcade_cloaksp = "cloak" arcade_clocknch = "clocknch" arcade_clocknchj = "clocknch" arcade_cloud9 = "cloud9" arcade_clowns = "clowns" arcade_clowns1 = "clowns" arcade_clshroad = "clshroad" arcade_clshroadd = "clshroad" arcade_clshroads = "clshroad" arcade_cltchitr = "cltchitr" arcade_cltchitrd = "cltchitr" arcade_cltchitrj = "cltchitr" arcade_cltchitrjd = "cltchitr" arcade_club90s = "club90s" arcade_club90sa = "club90s" arcade_cluckypo = "cluckypo" arcade_cluclu = "cluclu" arcade_cmanhat = "cmanhat" arcade_cmehyou = "cmehyou" arcade_cmissnx = "cmissnx" arcade_cnbe = "cnbe" arcade_cndi = "cndi" arcade_cnights2 = "cnightst" arcade_cnightst = "cnightst" arcade_cnightst2 = "cnightst" arcade_cninja = "cninja" arcade_cninja0 = "cninja" arcade_cninja1 = "cninja" arcade_cninjabl = "cninja" arcade_cninjau = "cninja" arcade_cobracmj = "cobracom" arcade_cobracom = "cobracom" arcade_cobracoma = "cobracom" arcade_cobracomb = "cobracom" arcade_cobracomj = "cobracom" arcade_cobracomja = "cobracom" arcade_cobracomjb = "cobracom" arcade_cocean1a = "cocean1a" arcade_cocean6b = "cocean1a" arcade_colmns97 = "colmns97" arcade_colony7 = "colony7" arcade_colony7a = "colony7" arcade_columns = "columns" arcade_columns2 = "columns2" arcade_columnsj = "columns" arcade_columnsn = "columnsn" arcade_combasc = "combasc" arcade_combascb = "combasc" arcade_combascj = "combasc" arcade_combasct = "combasc" arcade_combat = "combat" arcade_combatsc = "combatsc" arcade_combh = "combh" arcade_commandj = "commando" arcade_commando = "commando" arcade_commandob = "commando" arcade_commandob2 = "commando" arcade_commandoj = "commando" arcade_commandou = "commando" arcade_commandou2 = "commando" arcade_commandu = "commando" arcade_commandw = "commandw" arcade_commsega = "commsega" arcade_comotion = "comotion" arcade_compgolf = "compgolf" arcade_complexx = "complexx" arcade_condor = "phoenix" arcade_condorn = "phoenix" arcade_congo = "congo" arcade_congoa = "congo" arcade_conquer = "conquer" arcade_contcirc = "contcirc" arcade_contcircj = "contcirc" arcade_contcircu = "contcirc" arcade_contcircua = "contcirc" arcade_contcrcu = "contcirc" arcade_contra = "contra" arcade_contra1 = "contra" arcade_contrab = "contra" arcade_contrabj = "contra" arcade_contrabj1 = "contra" arcade_contrae = "contra" arcade_contraj = "contra" arcade_contraj1 = "contra" arcade_contrajb = "contra" arcade_cookbib = "cookbib" arcade_cookbib2 = "cookbib2" arcade_cookbib2a = "cookbib2" arcade_cookbib3 = "cookbib3" arcade_cookbiba = "cookbib" arcade_cookrace = "btime" arcade_coolpool = "coolpool" arcade_coozumou = "coozumou" arcade_cop01 = "cop01" arcade_cop01a = "cop01" arcade_copsnrob = "copsnrob" arcade_cosmccop = "cosmccop" arcade_cosmica = "cosmica" arcade_cosmica2 = "cosmica" arcade_cosmicg = "cosmicg" arcade_cosmicmo = "invaders" arcade_cosmo = "cosmo" arcade_cosmogng = "cosmogng" arcade_cosmognj = "cosmogng" arcade_cosmos = "cosmos" arcade_cotton = "cotton" arcade_cotton2 = "cotton2" arcade_cottona = "cotton" arcade_cottonbm = "cottonbm" arcade_cottond = "cotton" arcade_cottong = "locomotn" arcade_cottonj = "cotton" arcade_cottonja = "cotton" arcade_cottonjad = "cotton" arcade_cottonjd = "cotton" arcade_cottonu = "cotton" arcade_cottonud = "cotton" arcade_countrb2 = "countrun" arcade_countrnb = "countrun" arcade_countrun = "countrun" arcade_countrunb = "countrun" arcade_countryc = "countryc" arcade_cphd = "cphd" arcade_cppicf = "cppicf" arcade_cppicf2 = "cppicf" arcade_cprobowl = "cprobowl" arcade_cprogolf = "cprogolf" arcade_cprogolf18 = "cprogolf" arcade_cprogolfj = "cprogolf" arcade_cprosocc = "cprosocc" arcade_cps1demo = "cps1demo" arcade_cps1frog = "cps1frog" arcade_cpsoccer = "cpsoccer" arcade_cpsoccerj = "cpsoccer" arcade_cptennis = "cptennis" arcade_cptennisj = "cptennis" arcade_cracksht = "cracksht" arcade_crash = "crash" arcade_crater = "crater" arcade_crazyblk = "mrjong" arcade_crazycop = "gbusters" arcade_crazyfgt = "crazyfgt" arcade_crbalon2 = "crbaloon" arcade_crbaloon = "crbaloon" arcade_crbaloon2 = "crbaloon" arcade_crgolf = "crgolf" arcade_crgolfa = "crgolf" arcade_crgolfb = "crgolf" arcade_crgolfc = "crgolf" arcade_crimec = "crimec" arcade_crimecj = "crimec" arcade_crimecu = "crimec" arcade_crimfght = "crimfght" arcade_crimfghtj = "crimfght" arcade_crimfghtu = "crimfght" arcade_crimfgt2 = "crimfght" arcade_crimfgtj = "crimfght" arcade_crkdown = "crkdown" arcade_crockman = "puckman" arcade_croquis = "logicpro" arcade_crospang = "crospang" arcade_crossbld = "bmaster" arcade_crossbow = "crossbow" arcade_crshrac2 = "crshrace" arcade_crshrace = "crshrace" arcade_crshrace2 = "crshrace" arcade_crswd2bl = "crswd2bl" arcade_crsword = "crsword" arcade_cruisin = "citycon" arcade_crush = "crush" arcade_crush2 = "crush" arcade_crush3 = "crush" arcade_crush4 = "crush" arcade_crush5 = "crush" arcade_crushbl = "crush" arcade_crushbl2 = "crush" arcade_crushbl3 = "crush" arcade_crusherm = "crusherm" arcade_crushs = "crush" arcade_crusnu21 = "crusnusa" arcade_crusnu40 = "crusnusa" arcade_crusnusa = "crusnusa" arcade_crusnw13 = "crusnwld" arcade_crusnw20 = "crusnwld" arcade_crusnwld = "crusnwld" arcade_cryptklr = "cryptklr" arcade_crystal2 = "crystal2" arcade_crystalg = "crystalg" arcade_crzrally = "crzrally" arcade_csclub = "csclub" arcade_csclub1 = "csclub" arcade_csclub1d = "csclub" arcade_cscluba = "csclub" arcade_csclubh = "csclub" arcade_csclubj = "csclub" arcade_csclubjy = "csclub" arcade_cscrtry = "cscrtry" arcade_cscrtry2 = "cscrtry" arcade_csdtenis = "csdtenis" arcade_cshift = "cshift" arcade_cshooter = "cshooter" arcade_cshootre = "cshooter" arcade_csilver = "csilver" arcade_csilverj = "csilver" arcade_csilverja = "csilver" arcade_cskater = "cskater" arcade_cspring1 = "csprint" arcade_csprins1 = "csprint" arcade_csprint = "csprint" arcade_csprint1 = "csprint" arcade_csprint2 = "csprint" arcade_csprintf = "csprint" arcade_csprintg = "csprint" arcade_csprints = "csprint" arcade_cstlevna = "cstlevna" arcade_csuperas = "csuperas" arcade_csweetht = "cdiscon1" arcade_ct2k3sa = "kof2001" arcade_ct2k3sp = "kof2001" arcade_cterrani = "cterrani" arcade_cthd2003 = "kof2001" arcade_cthd2k3a = "kof2001" arcade_ctisland = "ctisland" arcade_ctisland2 = "ctisland" arcade_ctisland3 = "ctisland" arcade_ctislnd2 = "ctisland" arcade_ctislnd3 = "ctisland" arcade_ctomaday = "ctomaday" arcade_ctornado = "ctornado" arcade_ctribe = "ctribe" arcade_ctribe1 = "ctribe" arcade_ctribeb = "ctribe" arcade_ctribeb2 = "ctribe" arcade_ctribej = "ctribe" arcade_ctribeo = "ctribe" arcade_ctrpllrp = "puckman" arcade_ctsttape = "ctsttape" arcade_cubybop = "cubybop" arcade_cuebrckj = "cuebrick" arcade_cuebrick = "cuebrick" arcade_cuebrickj = "cuebrick" arcade_cultures = "cultures" arcade_cupfinal = "cupfinal" arcade_cupsoc = "cupsoc" arcade_cupsoc2 = "cupsoc" arcade_cupsocbl = "cupsoc" arcade_curvebal = "curvebal" arcade_cutefght = "cutefght" arcade_cutieq = "cutieq" arcade_cv_1on1 = "cv_1on1" arcade_cv_2010 = "cv_2010" arcade_cv_2010p = "cv_2010" arcade_cv_2010p1 = "cv_2010" arcade_cv_alcazar = "cv_alcazar" arcade_cv_alphazoo = "cv_alphazoo" arcade_cv_amazing = "cv_amazing" arcade_cv_antarct = "cv_antarct" arcade_cv_apshai = "cv_apshai" arcade_cv_aquatack = "cv_aquatack" arcade_cv_aquatacka = "cv_aquatack" arcade_cv_artduel = "cv_artduel" arcade_cv_bbears = "cv_bbears" arcade_cv_bcquest = "cv_bcquest" arcade_cv_bcquest2 = "cv_bcquest2" arcade_cv_bcquest2ca = "cv_bcquest2" arcade_cv_bdash = "cv_bdash" arcade_cv_beamridr = "cv_beamridr" arcade_cv_blockrun = "cv_blockrun" arcade_cv_bnj = "cv_bnj" arcade_cv_brainstr = "cv_brainstr" arcade_cv_btime = "cv_btime" arcade_cv_btimem = "cv_btime" arcade_cv_buckrog = "cv_buckrog" arcade_cv_cabbage = "cv_cabbage" arcade_cv_cabbagep1 = "cv_cabbage" arcade_cv_cabbagep2 = "cv_cabbage" arcade_cv_cabbshow = "cv_cabbshow" arcade_cv_campaign = "cv_campaign" arcade_cv_carnival = "cv_carnival" arcade_cv_castelo = "cv_castelo" arcade_cv_cavenger = "cv_cavenger" arcade_cv_cavengera = "cv_cavenger" arcade_cv_cbsmon = "cv_cbsmon" arcade_cv_ccrisis = "cv_ccrisis" arcade_cv_centiped = "cv_centiped" arcade_cv_choplift = "cv_choplift" arcade_cv_chucknor = "cv_chucknor" arcade_cv_coleco = "cv_coleco" arcade_cv_congo = "cv_congo" arcade_cv_dambust = "cv_dambust" arcade_cv_danslither = "cv_slither" arcade_cv_decathln = "cv_decathln" arcade_cv_defender = "cv_defender" arcade_cv_destruct = "cv_destruct" arcade_cv_digdug = "cv_digdug" arcade_cv_digger = "cv_digger" arcade_cv_dkong = "cv_dkong" arcade_cv_dkonga = "cv_dkong" arcade_cv_dkongjr = "cv_dkongjr" arcade_cv_dlair = "cv_dlair" arcade_cv_dncfntsy = "cv_dncfntsy" arcade_cv_docastle = "cv_docastle" arcade_cv_drgnfire = "cv_drgnfire" arcade_cv_drseuss = "cv_drseuss" arcade_cv_evolutio = "cv_evolutio" arcade_cv_facemakr = "cv_facemakr" arcade_cv_fallguy = "cv_fallguy" arcade_cv_fathom = "cv_fathom" arcade_cv_ffreddy = "cv_ffreddy" arcade_cv_finaltst = "cv_finaltst" arcade_cv_flipslip = "cv_flipslip" arcade_cv_fortune = "cv_fortune" arcade_cv_fracfevr = "cv_fracfevr" arcade_cv_frenzy = "cv_frenzy" arcade_cv_frenzya = "cv_frenzy" arcade_cv_frenzya2 = "cv_frenzy" arcade_cv_frogger = "cv_frogger" arcade_cv_frogger2 = "cv_frogger2" arcade_cv_frontlin = "cv_frontlin" arcade_cv_frontlina = "cv_frontlin" arcade_cv_galaxian = "cv_galaxian" arcade_cv_galaxiana = "cv_galaxian" arcade_cv_gorf = "cv_gorf" arcade_cv_gustbust = "cv_gustbust" arcade_cv_gyruss = "cv_gyruss" arcade_cv_hazzard = "cv_hazzard" arcade_cv_heist = "cv_heist" arcade_cv_heista = "cv_heist" arcade_cv_hero = "cv_hero" arcade_cv_hustler = "cv_hustler" arcade_cv_hustler1 = "cv_hustler" arcade_cv_illusion = "cv_illusion" arcade_cv_jbond = "cv_jbond" arcade_cv_jmpmanjr = "cv_jmpmanjr" arcade_cv_jmpmanjra = "cv_jmpmanjr" arcade_cv_joust = "cv_joust" arcade_cv_jukebox = "cv_jukebox" arcade_cv_jungleh = "cv_jungleh" arcade_cv_keykaper = "cv_keykaper" arcade_cv_kubjpok = "cv_kubjpok" arcade_cv_ladybug = "cv_ladybug" arcade_cv_lancelot = "cv_lancelot" arcade_cv_leeper = "cv_leeper" arcade_cv_linklogc = "cv_linklogc" arcade_cv_logiclvl = "cv_logiclvl" arcade_cv_looping = "cv_looping" arcade_cv_mash = "cv_mash" arcade_cv_memmanor = "cv_memmanor" arcade_cv_meteosho = "cv_meteosho" arcade_cv_mindmstr = "cv_mindmstr" arcade_cv_mine2049 = "cv_mine2049" arcade_cv_mine2049a = "cv_mine2049" arcade_cv_mking = "cv_mking" arcade_cv_mkinga = "cv_mking" arcade_cv_monkey = "cv_monkey" arcade_cv_montezum = "cv_montezum" arcade_cv_moonswpr = "cv_moonswpr" arcade_cv_moonswpra = "cv_moonswpr" arcade_cv_mrdo = "cv_mrdo" arcade_cv_mrdoa = "cv_mrdo" arcade_cv_mtcracer = "cv_mtcracer" arcade_cv_mtcracera = "cv_mtcracer" arcade_cv_mtrap = "cv_mtrap" arcade_cv_mtrapa = "cv_mtrap" arcade_cv_musicbox = "cv_musicbox" arcade_cv_novablst = "cv_novablst" arcade_cv_numbump = "cv_amazing" arcade_cv_oilswell = "cv_oilswell" arcade_cv_oilswella = "cv_oilswell" arcade_cv_omegrace = "cv_omegrace" arcade_cv_onlyrock = "cv_onlyrock" arcade_cv_orbit = "cv_orbit" arcade_cv_pacman = "cv_pacman" arcade_cv_panic = "cv_panic" arcade_cv_pepper2 = "cv_pepper2" arcade_cv_pitfall = "cv_pitfall" arcade_cv_pitfall2 = "cv_pitfall2" arcade_cv_pitstop = "cv_pitstop" arcade_cv_pitstopa = "cv_pitstop" arcade_cv_popeye = "cv_popeye" arcade_cv_popeyea = "cv_popeye" arcade_cv_porkys = "cv_porkys" arcade_cv_power = "cv_power" arcade_cv_pquest = "cv_pquest" arcade_cv_qbert = "cv_qbert" arcade_cv_qberta = "cv_qbert" arcade_cv_qbertqub = "cv_qbertqub" arcade_cv_questgc = "cv_questgc" arcade_cv_quintana = "cv_quintana" arcade_cv_quintanaa = "cv_quintana" arcade_cv_riveraid = "cv_riveraid" arcade_cv_robinh = "cv_robinh" arcade_cv_robinha = "cv_robinh" arcade_cv_rockbolt = "cv_rockbolt" arcade_cv_rockbolta = "cv_rockbolt" arcade_cv_rocky = "cv_rocky" arcade_cv_rocnrope = "cv_rocnrope" arcade_cv_rollover = "cv_rollover" arcade_cv_sabaseb = "cv_sabaseb" arcade_cv_safootb = "cv_safootb" arcade_cv_saftsocc = "cv_sasoccer" arcade_cv_sammylf = "cv_sammylf" arcade_cv_sammylfa = "cv_sammylf" arcade_cv_sasoccer = "cv_sasoccer" arcade_cv_scobra = "cv_scobra" arcade_cv_scobraa = "cv_scobra" arcade_cv_secalpha = "cv_secalpha" arcade_cv_sewersam = "cv_sewersam" arcade_cv_skiing = "cv_skiing" arcade_cv_slither = "cv_slither" arcade_cv_slurpy = "cv_slurpy" arcade_cv_smurf = "cv_smurf" arcade_cv_smurfa = "cv_smurf" arcade_cv_smurfply = "cv_smurfply" arcade_cv_smurfpnt = "cv_smurfpnt" arcade_cv_spacfury = "cv_spacfury" arcade_cv_spectron = "cv_spectron" arcade_cv_sprcross = "cv_sprcross" arcade_cv_sprcrossa = "cv_sprcross" arcade_cv_spyhunt = "cv_spyhunt" arcade_cv_spyhuntp = "cv_spyhunt" arcade_cv_spyhuntp1 = "cv_spyhunt" arcade_cv_squishem = "cv_squishem" arcade_cv_ssketch = "cv_ssketch" arcade_cv_startrek = "cv_startrek" arcade_cv_starwars = "cv_starwars" arcade_cv_steam = "cv_steam" arcade_cv_strikeit = "cv_strikeit" arcade_cv_subroc = "cv_subroc" arcade_cv_superdk = "cv_superdk" arcade_cv_suprdkjr = "cv_suprdkjr" arcade_cv_suprtest = "cv_suprtest" arcade_cv_sword = "cv_sword" arcade_cv_tankwars = "cv_tankwars" arcade_cv_tapper = "cv_tapper" arcade_cv_tarzan = "cv_tarzan" arcade_cv_telly = "cv_telly" arcade_cv_threshld = "cv_threshld" arcade_cv_timeplt = "cv_timeplt" arcade_cv_tomarc = "cv_tomarc" arcade_cv_ttennis = "cv_ttennis" arcade_cv_tunnels = "cv_tunnels" arcade_cv_turbo = "cv_turbo" arcade_cv_tutankhm = "cv_tutankhm" arcade_cv_tutankhma = "cv_tutankhm" arcade_cv_upndown = "cv_upndown" arcade_cv_venture = "cv_venture" arcade_cv_victory = "cv_victory" arcade_cv_wargames = "cv_wargames" arcade_cv_wargamesp = "cv_wargames" arcade_cv_warroom = "cv_warroom" arcade_cv_wingwar = "cv_wingwar" arcade_cv_wizmath = "cv_wizmath" arcade_cv_wordfeud = "cv_wordfeud" arcade_cv_yolk = "cv_yolk" arcade_cv_zaxxon = "cv_zaxxon" arcade_cv_zenji = "cv_zenji" arcade_cworld = "cworld" arcade_cworld2j = "cworld2j" arcade_cworld2ja = "cworld2j" arcade_cworld2jb = "cworld2j" arcade_cybattlr = "cybattlr" arcade_cyberb21 = "cyberbal" arcade_cyberb22 = "cyberbal" arcade_cyberb23 = "cyberbal" arcade_cyberb2p = "cyberbal" arcade_cyberba2 = "cyberbal" arcade_cyberbal = "cyberbal" arcade_cyberbap = "cyberbal" arcade_cyberbt = "cyberbal" arcade_cyberbt1 = "cyberbal" arcade_cyberlip = "cyberlip" arcade_cybertnk = "cybertnk" arcade_cybots = "cybots" arcade_cybotsj = "cybots" arcade_cybotsjd = "cybots" arcade_cybotsu = "cybots" arcade_cybotsud = "cybots" arcade_cybrcomm = "cybrcomm" arcade_cybrcycc = "cybrcycc" arcade_cybsled = "cybsled" arcade_cyclshtg = "cyclshtg" arcade_cyvern = "cyvern" arcade_cyvernj = "cyvern" arcade_czeroize = "czeroize" arcade_dacholer = "dacholer" arcade_dadandrn = "mmaulers" arcade_daimakai = "ghouls" arcade_daimakaib = "ghouls" arcade_daimakair = "ghouls" arcade_daioh = "daioh" arcade_daioha = "daioh" arcade_daiohc = "daioh" arcade_daiohp = "daioh" arcade_daireika = "daireika" arcade_dairesya = "ironhors" arcade_daisenpu = "twinhawk" arcade_daiskiss = "daiskiss" arcade_daitorid = "daitorid" arcade_daitorida = "daitorid" arcade_daiyogen = "daiyogen" arcade_dakkochn = "dakkochn" arcade_dambustr = "dambustr" arcade_dambustra = "dambustr" arcade_dambustruk = "dambustr" arcade_danceyes = "danceyes" arcade_danchih = "danchih" arcade_dangar = "dangar" arcade_dangar2 = "dangar" arcade_dangara = "dangar" arcade_dangarb = "dangar" arcade_dangarbt = "dangar" arcade_dangarj = "dangar" arcade_dangerz = "dangerz" arcade_dangseed = "dangseed" arcade_dankuga = "dankuga" arcade_daraku = "daraku" arcade_darius = "darius" arcade_darius2 = "darius2" arcade_darius2d = "darius2" arcade_darius2do = "darius2" arcade_dariuse = "darius" arcade_dariusg = "dariusg" arcade_dariusgj = "dariusg" arcade_dariusgu = "dariusg" arcade_dariusgx = "dariusgx" arcade_dariusj = "darius" arcade_dariuso = "darius" arcade_dariusu = "darius" arcade_darkadv = "devilw" arcade_darkedge = "darkedge" arcade_darkmist = "darkmist" arcade_darkplnt = "darkplnt" arcade_darksea1 = "darkseal" arcade_darkseaj = "darkseal" arcade_darkseal = "darkseal" arcade_darkseal1 = "darkseal" arcade_darkseal2 = "wizdfire" arcade_darksealj = "darkseal" arcade_darksel2 = "wizdfire" arcade_darktowr = "darktowr" arcade_darkwar = "darkwar" arcade_darwin = "darwin" arcade_dassaul4 = "thndzone" arcade_dassault = "thndzone" arcade_dassault4 = "thndzone" arcade_dazzler = "dazzler" arcade_dblaxle = "dblaxle" arcade_dblaxleu = "dblaxle" arcade_dbldyn = "dynduke" arcade_dbldynj = "dbldynj" arcade_dbldynu = "dbldynj" arcade_dblewing = "dblewing" arcade_dblplay = "dblplay" arcade_dblpoint = "dblpoint" arcade_dblpointd = "dblpoint" arcade_dbreed = "dbreed" arcade_dbreedm72 = "dbreed" arcade_dbz = "dbz" arcade_dbz2 = "dbz2" arcade_dbza = "dbz" arcade_dbzvrvs = "dbzvrvs" arcade_dcclub = "dcclub" arcade_dcon = "dcon" arcade_dday = "dday" arcade_ddayc = "dday" arcade_ddaydoo = "lastday" arcade_ddcrew = "ddcrew" arcade_ddcrew1 = "ddcrew" arcade_ddcrew1d = "ddcrew" arcade_ddcrew2 = "ddcrew" arcade_ddcrew2d = "ddcrew" arcade_ddcrewd = "ddcrew" arcade_ddcrewj = "ddcrew" arcade_ddcrewj2 = "ddcrew" arcade_ddcrewj2d = "ddcrew" arcade_ddcrewjd = "ddcrew" arcade_ddcrewu = "ddcrew" arcade_ddcrewud = "ddcrew" arcade_ddenlovr = "ddenlovr" arcade_ddonpach = "ddonpach" arcade_ddonpacha = "ddonpach" arcade_ddonpachj = "ddonpach" arcade_ddonpchj = "ddonpach" arcade_ddp2 = "ddp2" arcade_ddp2100 = "ddp2" arcade_ddp2100c = "ddp2" arcade_ddp2100hk = "ddp2" arcade_ddp2100j = "ddp2" arcade_ddp2100k = "ddp2" arcade_ddp2100t = "ddp2" arcade_ddp2101 = "ddp2" arcade_ddp2101c = "ddp2" arcade_ddp2101hk = "ddp2" arcade_ddp2101j = "ddp2" arcade_ddp2101k = "ddp2" arcade_ddp2101t = "ddp2" arcade_ddp2c = "ddp2" arcade_ddp2hk = "ddp2" arcade_ddp2j = "ddp2" arcade_ddp2k = "ddp2" arcade_ddp2t = "ddp2" arcade_ddp3 = "ddp3" arcade_ddp3a = "ddp3" arcade_ddp3b = "ddp3" arcade_ddp3blk = "ddp3" arcade_ddpdoj = "ddp3" arcade_ddpdoja = "ddp3" arcade_ddpdojb = "ddp3" arcade_ddpdojblk = "ddp3" arcade_ddpdojblka = "ddp3" arcade_ddpdojblkbl = "ddp3" arcade_ddragn2u = "ddragon2" arcade_ddrago3b = "ddragon3" arcade_ddragon = "ddragon" arcade_ddragon2 = "ddragon2" arcade_ddragon2b = "ddragon2" arcade_ddragon2b2 = "ddragon2" arcade_ddragon2u = "ddragon2" arcade_ddragon3 = "ddragon3" arcade_ddragon3b = "ddragon3" arcade_ddragon3j = "ddragon3" arcade_ddragon3p = "ddragon3" arcade_ddragonb = "ddragon" arcade_ddragonb2 = "ddragon" arcade_ddragonba = "ddragon" arcade_ddragonu = "ddragon" arcade_ddragonua = "ddragon" arcade_ddragonub = "ddragon" arcade_ddragonw = "ddragon" arcade_ddragonw1 = "ddragon" arcade_ddream95 = "hoops96" arcade_ddribble = "ddribble" arcade_ddribblep = "ddribble" arcade_ddsom = "ddsom" arcade_ddsoma = "ddsom" arcade_ddsomar1 = "ddsom" arcade_ddsomb = "ddsom" arcade_ddsomh = "ddsom" arcade_ddsomj = "ddsom" arcade_ddsomjr1 = "ddsom" arcade_ddsomjr2 = "ddsom" arcade_ddsomr1 = "ddsom" arcade_ddsomr2 = "ddsom" arcade_ddsomr3 = "ddsom" arcade_ddsomu = "ddsom" arcade_ddsomud = "ddsom" arcade_ddsomur1 = "ddsom" arcade_ddtod = "ddtod" arcade_ddtoda = "ddtod" arcade_ddtodar1 = "ddtod" arcade_ddtodd = "ddtod" arcade_ddtodh = "ddtod" arcade_ddtodhr1 = "ddtod" arcade_ddtodhr2 = "ddtod" arcade_ddtodj = "ddtod" arcade_ddtodjr1 = "ddtod" arcade_ddtodjr2 = "ddtod" arcade_ddtodr1 = "ddtod" arcade_ddtodu = "ddtod" arcade_ddtodur1 = "ddtod" arcade_ddungeon = "ddungeon" arcade_ddux = "ddux" arcade_ddux1 = "ddux" arcade_dduxbl = "ddux" arcade_dduxd = "ddux" arcade_dduxj = "ddux" arcade_dduxjd = "ddux" arcade_deadang = "deadang" arcade_deadconj = "deadconx" arcade_deadconx = "deadconx" arcade_deadconxj = "deadconx" arcade_deadeye = "deadeye" arcade_dealer = "dealer" arcade_deathbrd = "mutantf" arcade_decathlt = "decathlt" arcade_decocass = "decocass" arcade_decomult = "decomult" arcade_deerhunt = "deerhunt" arcade_deerhunta = "deerhunt" arcade_deerhuntb = "deerhunt" arcade_deerhuntc = "deerhunt" arcade_deerhuntd = "deerhunt" arcade_deerhunte = "deerhunt" arcade_defcmnd = "defender" arcade_defence = "defender" arcade_defender = "defender" arcade_defendg = "defender" arcade_defendw = "defender" arcade_defense = "sdi" arcade_defndjeu = "defender" arcade_deltrace = "omegrace" arcade_deluxe4u = "deluxe5" arcade_deluxe5 = "deluxe5" arcade_deluxe5a = "deluxe5" arcade_deluxe5b = "deluxe5" arcade_demoderb = "demoderb" arcade_demoderm = "demoderb" arcade_demon = "demon" arcade_demoneye = "demoneye" arcade_demonwl1 = "demonwld" arcade_demonwld = "demonwld" arcade_demonwld1 = "demonwld" arcade_demonwld2 = "demonwld" arcade_demonwld3 = "demonwld" arcade_demonwld4 = "demonwld" arcade_denjinmk = "denjinmk" arcade_depthch = "depthch" arcade_depthcho = "depthch" arcade_depthv1 = "depthch" arcade_deroon = "deroon" arcade_deroona = "deroon" arcade_desertbr = "desertbr" arcade_desertbrd = "desertbr" arcade_desertbrj = "desertbr" arcade_desertbrjd = "desertbr" arcade_desertdn = "desertdn" arcade_desertgu = "desertgu" arcade_desertwr = "desertwr" arcade_desterth = "lrescue" arcade_destroyr = "destroyr" arcade_detatwin = "blswhstl" arcade_devilfsg = "devilfsh" arcade_devilfsh = "devilfsh" arcade_devilw = "devilw" arcade_devstor2 = "devstors" arcade_devstor3 = "devstors" arcade_devstors = "devstors" arcade_devstors2 = "devstors" arcade_devstors3 = "devstors" arcade_devzone = "devzone" arcade_devzone2 = "devzone" arcade_dfeveron = "feversos" arcade_dharma = "dharma" arcade_dharmaj = "dharma" arcade_dharmak = "dharma" arcade_diamond = "diamond" arcade_diehard = "diehard" arcade_dietgo = "dietgo" arcade_dietgoe = "dietgo" arcade_dietgoj = "dietgo" arcade_dietgou = "dietgo" arcade_digdug = "digdug" arcade_digdug2 = "digdug2" arcade_digdug2o = "digdug2" arcade_digduga1 = "digdug" arcade_digdugat = "digdug" arcade_digdugb = "digdug" arcade_digger = "digger" arcade_diggerma = "diggerma" arcade_dimahoo = "dimahoo" arcade_dimahoou = "dimahoo" arcade_dimahoud = "dimahoo" arcade_dingo = "dingo" arcade_dingoe = "dingo" arcade_dino = "dino" arcade_dinoa = "dino" arcade_dinoeh = "dino" arcade_dinoh = "dino" arcade_dinohc = "dino" arcade_dinohunt = "dino" arcade_dinoj = "dino" arcade_dinopic = "dino" arcade_dinopic2 = "dino" arcade_dinopic3 = "dino" arcade_dinopic4 = "dino" arcade_dinorex = "dinorex" arcade_dinorexj = "dinorex" arcade_dinorexu = "dinorex" arcade_dinot = "dino" arcade_dinotpic = "dino" arcade_dinou = "dino" arcade_dirtfoxj = "dirtfoxj" arcade_disco = "disco" arcade_discof = "disco" arcade_diverboy = "diverboy" arcade_djboy = "djboy" arcade_djboya = "djboy" arcade_djboyj = "djboy" arcade_dkgenm72 = "hharry" arcade_dkgensan = "hharry" arcade_dkgensanm72 = "hharry" arcade_dkingjr = "dkongjr" arcade_dkngjnrb = "dkongjr" arcade_dkngjnrj = "dkongjr" arcade_dkong = "dkong" arcade_dkong3 = "dkong3" arcade_dkong3b = "dkong3" arcade_dkong3j = "dkong3" arcade_dkongf = "dkong" arcade_dkonghrd = "dkong" arcade_dkongj = "dkong" arcade_dkongjnrj = "dkongjr" arcade_dkongjo = "dkong" arcade_dkongjo1 = "dkong" arcade_dkongjp = "dkong" arcade_dkongjr = "dkongjr" arcade_dkongjr2 = "dkongjr" arcade_dkongjrb = "dkongjr" arcade_dkongjre = "dkongjr" arcade_dkongjrj = "dkongjr" arcade_dkongjrm = "dkongjr" arcade_dkongjrpb = "dkongjr" arcade_dkongo = "dkong" arcade_dkongpe = "dkong" arcade_dkongx = "dkong" arcade_dkongx11 = "dkong" arcade_dkrainbow = "dkong" arcade_dkrdemo = "dkong" arcade_dlair = "dlair" arcade_dland = "bublbobl" arcade_dleague = "dleague" arcade_dleaguej = "dleague" arcade_dmnfrnt = "dmnfrnt" arcade_dmnfrnta = "dmnfrnt" arcade_dmnfrntb = "dmnfrnt" arcade_dmnfrntpcb = "dmnfrnt" arcade_dngrtrck = "rallyx" arcade_dnmtdeka = "diehard" arcade_doapp = "doapp" arcade_docastl2 = "docastle" arcade_docastle = "docastle" arcade_docastlo = "docastle" arcade_dockman = "dockman" arcade_dodgem = "dodgem" arcade_dodgeman = "dodgeman" arcade_dogfgt = "dogfgt" arcade_dogfgtj = "dogfgt" arcade_dogfgtu = "dogfgt" arcade_dogfight = "dogfight" arcade_dogosokb = "victroad" arcade_dogosoke = "victroad" arcade_dogosokj = "victroad" arcade_dogpatch = "dogpatch" arcade_dogyuun = "dogyuun" arcade_dogyuuna = "dogyuun" arcade_dogyuunt = "dogyuun" arcade_dokaben = "dokaben" arcade_dokidoki = "dokidoki" arcade_dokyusei = "dokyusei" arcade_dokyusp = "dokyusp" arcade_dolmen = "dolmen" arcade_domino = "domino" arcade_dominos = "dominos" arcade_dommy = "dommy" arcade_dondenmj = "dondenmj" arcade_dondokdj = "dondokod" arcade_dondokdu = "dondokod" arcade_dondokod = "dondokod" arcade_dondokodj = "dondokod" arcade_dondokodu = "dondokod" arcade_donight = "donight" arcade_donpachi = "donpachi" arcade_donpachihk = "donpachi" arcade_donpachij = "donpachi" arcade_donpachikr = "donpachi" arcade_donpachj = "donpachi" arcade_donpachk = "donpachi" arcade_dorachan = "dorachan" arcade_dorodon = "dorodon" arcade_dorodon2 = "dorodon" arcade_dorunru2 = "dorunrun" arcade_dorunruc = "dorunrun" arcade_dorunrun = "dorunrun" arcade_dotriku2 = "dotrikun" arcade_dotrikun = "dotrikun" arcade_dotrikun2 = "dotrikun" arcade_dotriman = "dotrikun" arcade_dotron = "dotron" arcade_dotrona = "dotron" arcade_dotrone = "dotron" arcade_doubledr = "doubledr" arcade_douni = "docastle" arcade_dowild = "dowild" arcade_downtowj = "downtown" arcade_downtown = "downtown" arcade_downtown2 = "downtown" arcade_downtownj = "downtown" arcade_downtownp = "downtown" arcade_dplay = "einnings" arcade_dquizgo = "dquizgo" arcade_dragnblz = "dragnblz" arcade_dragngun = "dragngun" arcade_dragngunj = "dragngun" arcade_dragonsh = "dragonsh" arcade_dragoonj = "dragoonj" arcade_dragrace = "dragrace" arcade_dragwld2 = "dragwld2" arcade_drakton = "drakton" arcade_dreambal = "dreambal" arcade_dreamwld = "dreamwld" arcade_dremshpr = "dremshpr" arcade_drgnbowl = "drgnbowl" arcade_drgnbowla = "drgnbowl" arcade_drgnbstr = "drgnbstr" arcade_drgninja = "baddudes" arcade_drgninjab = "baddudes" arcade_drgninjab2 = "baddudes" arcade_drgnmst = "drgnmst" arcade_drgnunit = "drgnunit" arcade_drgnwrld = "drgnwrld" arcade_drgpunch = "drgpunch" arcade_drgw2 = "drgw2" arcade_drgw2c = "drgw2" arcade_drgw2hk = "drgw2" arcade_drgw2j = "drgw2" arcade_drgw3 = "drgw3" arcade_drgw3100 = "drgw3" arcade_drgw3103 = "drgw3" arcade_drgw3105 = "drgw3" arcade_dribling = "dribling" arcade_driblingbr = "dribling" arcade_driblingo = "dribling" arcade_driblino = "dribling" arcade_drifto94 = "drifto94" arcade_driftout = "driftout" arcade_driftoutj = "driftout" arcade_drius2do = "darius2" arcade_drivedge = "drivedge" arcade_driveout = "driftout" arcade_drivfrcb = "drivfrcp" arcade_drivfrcg = "drivfrcp" arcade_drivfrcp = "drivfrcp" arcade_drivfrct = "drivfrcp" arcade_drktnjr = "drakton" arcade_drmario = "drmario" arcade_drmicro = "drmicro" arcade_drtomy = "drtomy" arcade_drtoppel = "drtoppel" arcade_drtoppela = "drtoppel" arcade_drtoppelj = "drtoppel" arcade_drtoppelu = "drtoppel" arcade_drtopplj = "drtoppel" arcade_drtopplu = "drtoppel" arcade_dsaber = "dsaber" arcade_dsabera = "dsaber" arcade_dsaberj = "dsaber" arcade_dsccr94j = "dsoccr94" arcade_dsoccr94 = "dsoccr94" arcade_dsoccr94j = "dsoccr94" arcade_dsoccr94k = "dsoccr94" arcade_dspirit = "dspirit" arcade_dspirit1 = "dspirit" arcade_dspirit2 = "dspirit" arcade_dspirito = "dspirit" arcade_dstlk = "dstlk" arcade_dstlka = "dstlk" arcade_dstlkh = "dstlk" arcade_dstlku = "dstlk" arcade_dstlku1d = "dstlk" arcade_dstlkur1 = "dstlk" arcade_duckhunt = "duckhunt" arcade_ducki = "ducki" arcade_dumpmtmt = "bodyslam" arcade_dungenmu = "dungeonm" arcade_dungeonm = "lightbr" arcade_dungeonmu = "lightbr" arcade_dunkmnia = "dunkmnia" arcade_dunkshot = "dunkshot" arcade_dunkshota = "dunkshot" arcade_dunkshoto = "dunkshot" arcade_dw = "dw" arcade_dw2001 = "dw2001" arcade_dw2v100x = "drgw2" arcade_dwex = "dwex" arcade_dwi = "dwi" arcade_dwia = "dwi" arcade_dwj = "dw" arcade_dwpc = "dwpc" arcade_dyger = "dyger" arcade_dygera = "dyger" arcade_dynablsb = "dynablst" arcade_dynablst = "dynablst" arcade_dynagear = "dynagear" arcade_dynamski = "dynamski" arcade_dynduke = "dynduke" arcade_dyndukea = "dynduke" arcade_dyndukej = "dynduke" arcade_dyndukeja = "dynduke" arcade_dyndukeu = "dynduke" arcade_dynobop = "dynobop" arcade_dynwar = "dynwar" arcade_dynwara = "dynwar" arcade_dynwarj = "dynwar" arcade_dynwarjr = "dynwar" arcade_dzigzag = "digdug" arcade_eagle = "mooncrst" arcade_eagle2 = "mooncrst" arcade_eagle3 = "mooncrst" arcade_eaglshot = "eaglshot" arcade_eaglshta = "eaglshot" arcade_earthinv = "invaders" arcade_earthjkr = "earthjkr" arcade_earthjkrp = "earthjkr" arcade_ebases = "ebases" arcade_ecofghta = "ecofghtr" arcade_ecofghtr = "ecofghtr" arcade_ecofghtra = "ecofghtr" arcade_ecofghtrd = "ecofghtr" arcade_ecofghtrh = "ecofghtr" arcade_ecofghtru = "ecofghtr" arcade_ecofghtru1 = "ecofghtr" arcade_edf = "edf" arcade_edfa = "edf" arcade_edfbl = "edf" arcade_edfu = "edf" arcade_edrandy = "edrandy" arcade_edrandy1 = "edrandy" arcade_edrandy2 = "edrandy" arcade_edrandyj = "edrandy" arcade_eeekk = "eeekk" arcade_egghunt = "egghunt" arcade_eggor = "eggor" arcade_eggs = "scregg" arcade_eggventr = "eggventr" arcade_eggvntdx = "eggventr" arcade_ehrgeiz = "ehrgeiz" arcade_eightfrc = "eightfrc" arcade_eightman = "eightman" arcade_einnings = "einnings" arcade_ejihon = "ejihon" arcade_elandore = "elandore" arcade_elecyoy2 = "elecyoyo" arcade_elecyoyo = "elecyoyo" arcade_elevatob = "elevator" arcade_elevator = "elevator" arcade_elim2 = "elim2" arcade_elim2a = "elim2" arcade_elim4 = "elim2" arcade_elvact2u = "elvactr" arcade_elvactr = "elvactr" arcade_elvactrj = "elvactr" arcade_embargo = "embargo" arcade_emeralda = "emeralda" arcade_emerldaa = "emeralda" arcade_empcity = "empcity" arcade_empcityj = "empcity" arcade_endurob2 = "enduror" arcade_endurobl = "enduror" arcade_enduror = "enduror" arcade_enduror1 = "enduror" arcade_endurora = "enduror" arcade_enforce = "enforce" arcade_enforcej = "enforce" arcade_enforceja = "enforce" arcade_enigma2 = "enigma2" arcade_enigma2a = "enigma2" arcade_eprom = "eprom" arcade_eprom2 = "eprom" arcade_equites = "equites" arcade_equitess = "equites" arcade_esb = "esb" arcade_esckids = "esckids" arcade_esckidsj = "esckids" arcade_espgal = "espgal" arcade_espgalbl = "espgal" arcade_espial = "espial" arcade_espiale = "espial" arcade_esprade = "esprade" arcade_espradej = "esprade" arcade_espradejo = "esprade" arcade_espradeo = "esprade" arcade_eswat = "eswat" arcade_eswatbl = "eswat" arcade_eswatd = "eswat" arcade_eswatj = "eswat" arcade_eswatj1 = "eswat" arcade_eswatj1d = "eswat" arcade_eswatjd = "eswat" arcade_eswatu = "eswat" arcade_eswatud = "eswat" arcade_eto = "eto" arcade_euroch92 = "euroch92" arcade_evilston = "evilston" arcade_excelsr = "excelsr" arcade_excelsra = "excelsr" arcade_excitbkj = "excitebk" arcade_excitebk = "excitebk" arcade_excthour = "matmania" arcade_exctleag = "exctleag" arcade_exctleagd = "exctleag" arcade_exctscc2 = "exctsccr" arcade_exctscca = "exctsccr" arcade_exctsccb = "exctsccr" arcade_exctsccr = "exctsccr" arcade_exedexes = "exedexes" arcade_exerion = "exerion" arcade_exerionb = "exerion" arcade_exeriont = "exerion" arcade_exerizerb = "skyfox" arcade_exerizrb = "skyfox" arcade_exodus = "redufo" arcade_explbrkr = "explbrkr" arcade_explbrkrk = "explbrkr" arcade_explorer = "scramble" arcade_exprraid = "exprraid" arcade_extdwnhl = "extdwnhl" arcade_exterm = "exterm" arcade_extrmatn = "extrmatn" arcade_extrmatnj = "extrmatn" arcade_extrmatnu = "extrmatn" arcade_extrmatnur = "extrmatn" arcade_exvania = "exvania" arcade_exzisus = "exzisus" arcade_exzisusa = "exzisus" arcade_exzisust = "exzisus" arcade_eyes = "eyes" arcade_eyes2 = "eyes" arcade_eyesb = "eyes" arcade_eyeszacb = "eyes" arcade_f1dream = "f1dream" arcade_f1dreamb = "f1dream" arcade_f1dreamba = "f1dream" arcade_f1en = "f1en" arcade_f1gp = "f1gp" arcade_f1gp2 = "f1gp2" arcade_f1gpb = "f1gp" arcade_f1gpstar = "f1gpstar" arcade_f1gpstr2 = "f1gpstr2" arcade_f1lap = "f1lap" arcade_f1superb = "f1superb" arcade_fa = "fghtatck" arcade_faceoff = "faceoff" arcade_falcon = "phoenix" arcade_falconz = "phoenix" arcade_fantasia = "fantasia" arcade_fantasiaa = "fantasia" arcade_fantasiab = "fantasia" arcade_fantasian = "fantasia" arcade_fantastc = "fantastc" arcade_fantasy = "fantasy" arcade_fantasyg = "fantasyu" arcade_fantasyg2 = "fantasyu" arcade_fantasyj = "fantasyu" arcade_fantasyu = "fantasyu" arcade_fantazia = "mooncrst" arcade_fantjour = "gokuparo" arcade_fantland = "fantland" arcade_fantlanda = "fantland" arcade_fantsia2 = "fantsia2" arcade_fantsia2a = "fantsia2" arcade_fantsia2n = "fantsia2" arcade_fantsy95 = "newfant" arcade_fantzn2 = "fantzn2" arcade_fantzn2x = "fantzn2x" arcade_fantzn2xp = "fantzn2x" arcade_fantzn2xps2 = "fantzn2x" arcade_fantznta = "fantzn2x" arcade_fantzone = "fantzone" arcade_fantzone1 = "fantzone" arcade_fantzonep = "fantzone" arcade_fantzoneta = "fantzone" arcade_fantzono = "fantzone" arcade_farmer = "ikki" arcade_farwest = "ironhors" arcade_fastfred = "flyboy" arcade_fastlane = "fastlane" arcade_fatfursa = "fatfursp" arcade_fatfursp = "fatfursp" arcade_fatfurspa = "fatfursp" arcade_fatfury1 = "fatfury1" arcade_fatfury2 = "fatfury2" arcade_fatfury2a = "fatfury2" arcade_fatfury3 = "fatfury3" arcade_fatfury3a = "fatfury3" arcade_fax = "fax" arcade_fball = "fball" arcade_fbfrenzy = "fbfrenzy" arcade_fcombat = "fcombat" arcade_fcrash = "ffight" arcade_fenix = "phoenix" arcade_feversos = "feversos" arcade_ffantasa = "hippodrm" arcade_ffantasy = "hippodrm" arcade_ffantasya = "hippodrm" arcade_ffantasyb = "hippodrm" arcade_ffantasyj = "hippodrm" arcade_ffight = "ffight" arcade_ffighta = "ffight" arcade_ffightbl = "ffight" arcade_ffightbla = "ffight" arcade_ffightj = "ffight" arcade_ffightj1 = "ffight" arcade_ffightj2 = "ffight" arcade_ffightj3 = "ffight" arcade_ffightj4 = "ffight" arcade_ffightjh = "ffight" arcade_ffightu = "ffight" arcade_ffightu1 = "ffight" arcade_ffightu2 = "ffight" arcade_ffightua = "ffight" arcade_ffightub = "ffight" arcade_ffightuc = "ffight" arcade_ffreveng = "ffreveng" arcade_fghtatck = "fghtatck" arcade_fghtbskt = "fghtbskt" arcade_fghthist = "fghthist" arcade_fghthista = "fghthist" arcade_fghthistb = "fghthist" arcade_fghthistj = "fghthist" arcade_fghthistja = "fghthist" arcade_fghthistjb = "fghthist" arcade_fghthistu = "fghthist" arcade_fghthistua = "fghthist" arcade_fghthistub = "fghthist" arcade_fghthistuc = "fghthist" arcade_fgtlayer = "fgtlayer" arcade_fhawk = "fhawk" arcade_fhawkj = "fhawk" arcade_fhboxers = "fhboxers" arcade_fieldday = "fieldday" arcade_fightfev = "fightfev" arcade_fightfeva = "fightfev" arcade_fightfva = "fightfev" arcade_fightrol = "fightrol" arcade_finalap2 = "finalap2" arcade_finalap2j = "finalap2" arcade_finalap3 = "finalap3" arcade_finalap3a = "finalap3" arcade_finalap3bl = "finalap3" arcade_finalap3j = "finalap3" arcade_finalap3jc = "finalap3" arcade_finalapc = "finallap" arcade_finalapd = "finallap" arcade_finalb = "finalb" arcade_finalbj = "finalb" arcade_finalbny = "vanilla" arcade_finalbu = "finalb" arcade_finalizb = "finalizr" arcade_finalizr = "finalizr" arcade_finalizrb = "finalizr" arcade_finallap = "finallap" arcade_finallapc = "finallap" arcade_finallapd = "finallap" arcade_finallapjb = "finallap" arcade_finallapjc = "finallap" arcade_finalp2j = "finalap2" arcade_finalp3a = "finalap3" arcade_finalttr = "finalttr" arcade_findlove = "findlove" arcade_findout = "findout" arcade_finehour = "finehour" arcade_finlapjb = "finallap" arcade_finlapjc = "finallap" arcade_finlarch = "sleague" arcade_firebarr = "airass" arcade_firebatl = "firebatl" arcade_firehawk = "spec2k" arcade_fireone = "fireone" arcade_fireshrk = "fireshrk" arcade_fireshrka = "fireshrk" arcade_fireshrkd = "fireshrk" arcade_fireshrkdh = "fireshrk" arcade_firetpbl = "firetrap" arcade_firetrap = "firetrap" arcade_firetrapa = "firetrap" arcade_firetrapbl = "firetrap" arcade_firetrapj = "firetrap" arcade_firetrk = "firetrk" arcade_fitegol2 = "fitegolf" arcade_fitegolf = "fitegolf" arcade_fitegolf2 = "fitegolf" arcade_fitegolfu = "fitegolf" arcade_fitfight = "fitfight" arcade_fitter = "roundup" arcade_fitterbl = "roundup" arcade_fixeighb = "fixeight" arcade_fixeight = "fixeight" arcade_fixeightj = "fixeight" arcade_fixeighttw = "fixeight" arcade_fixeighttwt = "fixeight" arcade_fjbuster = "shogwarr" arcade_flagrall = "flagrall" arcade_flashgal = "flashgal" arcade_flashgala = "flashgal" arcade_flashgalk = "flashgal" arcade_flicky = "flicky" arcade_flickya = "flicky" arcade_flickyg = "flicky" arcade_flickyo = "flicky" arcade_flickys1 = "flicky" arcade_flickys2 = "flicky" arcade_flickys2g = "flicky" arcade_flipshot = "flipshot" arcade_flipull = "plotting" arcade_flkatck = "mx5000" arcade_flkatcka = "mx5000" arcade_flower = "flower" arcade_flowerj = "flower" arcade_flstory = "flstory" arcade_flstoryj = "flstory" arcade_flyball = "flyball" arcade_flyboy = "flyboy" arcade_flyboyb = "flyboy" arcade_flytiger = "flytiger" arcade_flytigera = "flytiger" arcade_fncywld = "fncywld" arcade_fnkyfish = "fnkyfish" arcade_fnshark = "fshark" arcade_foodf = "foodf" arcade_foodf1 = "foodf" arcade_foodf2 = "foodf" arcade_foodfc = "foodf" arcade_footchmp = "footchmp" arcade_forcebrk = "brkthru" arcade_forgottn = "forgottn" arcade_forgottna = "forgottn" arcade_forgottnu = "forgottn" arcade_forgottnua = "forgottn" arcade_forgottnuaa = "forgottn" arcade_forgottnuc = "forgottn" arcade_forgottnue = "forgottn" arcade_formatz = "formatz" arcade_fourtrax = "fourtrax" arcade_fourtraxa = "fourtrax" arcade_fpoint = "fpoint" arcade_fpoint1 = "fpoint" arcade_fpoint1d = "fpoint" arcade_fpointbj = "fpoint" arcade_fpointbl = "fpoint" arcade_fpointd = "fpoint" arcade_freekckb = "freekick" arcade_freekick = "freekick" arcade_freekicka = "freekick" arcade_freekickb1 = "freekick" arcade_freekickb3 = "freekick" arcade_freeze = "freeze" arcade_frenzy = "frenzy" arcade_friskyt = "friskyt" arcade_friskyta = "friskyt" arcade_friskytb = "friskyt" arcade_frogf = "frogger" arcade_frogg = "frogger" arcade_frogger = "frogger" arcade_froggermc = "frogger" arcade_froggers = "frogger" arcade_froggers1 = "frogger" arcade_froggers2 = "frogger" arcade_froggers3 = "frogger" arcade_froggrmc = "frogger" arcade_froggrs = "frogger" arcade_frogs = "frogs" arcade_frogseg1 = "frogger" arcade_frogseg2 = "frogger" arcade_froman2b = "froman2b" arcade_fromanc2 = "fromanc2" arcade_fromanc4 = "fromanc4" arcade_fromance = "fromance" arcade_fromancr = "fromancr" arcade_frontlin = "frontlin" arcade_fround = "fround" arcade_froundl = "fround" arcade_fshark = "fshark" arcade_fsharkbt = "fshark" arcade_fsoccer = "fsoccer" arcade_fsoccerb = "fsoccer" arcade_fsoccerba = "fsoccer" arcade_fsoccerj = "fsoccer" arcade_fstarfrc = "fstarfrc" arcade_fstarfrcj = "fstarfrc" arcade_fswords = "samsho3" arcade_ftimpcta = "ftimpcta" arcade_ftsoccer = "ftsoccer" arcade_fullthrl = "topspeed" arcade_funcube2 = "funcube2" arcade_funcube4 = "funcube4" arcade_funkybee = "funkybee" arcade_funkybeeb = "funkybee" arcade_funkyjet = "funkyjet" arcade_funkyjeta = "funkyjet" arcade_funkyjetj = "funkyjet" arcade_funnymou = "suprmous" arcade_funybubl = "funybubl" arcade_funybublc = "funybubl" arcade_futspy = "futspy" arcade_fx = "srdmissn" arcade_fxa = "srdmissn" arcade_ga2 = "ga2" arcade_ga2j = "ga2" arcade_gaia = "gaia" arcade_gaialast = "gaialast" arcade_gaiapols = "gaiapols" arcade_gaiapolsj = "gaiapols" arcade_gaiapolsu = "gaiapols" arcade_gaiden = "shadoww" arcade_gakupara = "gakupara" arcade_gakusai = "gakusai" arcade_gakusai2 = "gakusai2" arcade_gal10ren = "gal10ren" arcade_galag88b = "galaga88" arcade_galag88j = "galaga88" arcade_galaga = "galaga" arcade_galaga3 = "gaplus" arcade_galaga3a = "gaplus" arcade_galaga3b = "gaplus" arcade_galaga3c = "gaplus" arcade_galaga3m = "gaplus" arcade_galaga88 = "galaga88" arcade_galaga88a = "galaga88" arcade_galaga88j = "galaga88" arcade_galagamf = "galaga" arcade_galagamk = "galaga" arcade_galagamw = "galaga" arcade_galagao = "galaga" arcade_galap1 = "galaxian" arcade_galap4 = "galaxian" arcade_galapx = "galaxian" arcade_galaxbsf = "galaxian" arcade_galaxiaj = "galaxian" arcade_galaxian = "galaxian" arcade_galaxiana = "galaxian" arcade_galaxianbl = "galaxian" arcade_galaxiani = "galaxian" arcade_galaxianm = "galaxian" arcade_galaxianmo = "galaxian" arcade_galaxiant = "galaxian" arcade_galaxrcgg = "galaxian" arcade_galaxrf = "galaxian" arcade_galaxrfgg = "galaxian" arcade_galaxyfg = "galaxyfg" arcade_galaxygn = "galaxygn" arcade_galemp = "uniwars" arcade_galhustl = "pgalvip" arcade_galivan = "galivan" arcade_galivan2 = "galivan" arcade_galivan3 = "galivan" arcade_galkaika = "galkaika" arcade_galkoku = "galkoku" arcade_gallag = "galaga" arcade_gallop = "cosmccop" arcade_galmedes = "galmedes" arcade_galmidw = "galaxian" arcade_galmidwo = "galaxian" arcade_galpandx = "galpandx" arcade_galpani2 = "galpani2" arcade_galpani4 = "galpani4" arcade_galpani4k = "galpani4" arcade_galpanib = "galpanic" arcade_galpanic = "galpanic" arcade_galpanidx = "galpani4" arcade_galpanis = "galpanis" arcade_galpanisj = "galpanis" arcade_galpanisk = "galpanis" arcade_galpans2 = "galpans2" arcade_galpans2a = "galpans2" arcade_galpans2j = "galpans2" arcade_galpans3 = "galpans3" arcade_galpansu = "galpans2" arcade_galspnbl = "galspnbl" arcade_galturbo = "galaxian" arcade_galxwar2 = "galxwars" arcade_galxwars = "galxwars" arcade_galxwart = "galxwars" arcade_gametngk = "gametngk" arcade_ganbare = "ganbare" arcade_gangonta = "prtytime" arcade_gangwarb = "gangwars" arcade_gangwars = "gangwars" arcade_gangwarsb = "gangwars" arcade_gangwarsj = "gangwars" arcade_gangwarsu = "gangwars" arcade_ganryu = "ganryu" arcade_gaplus = "gaplus" arcade_gaplusa = "gaplus" arcade_gaplusd = "gaplus" arcade_gapluso = "gaplus" arcade_gaplust = "gaplus" arcade_gardia = "gardia" arcade_gardiab = "gardia" arcade_gardiaj = "gardia" arcade_garogun = "garogun" arcade_garou = "garou" arcade_garoubl = "garou" arcade_garouh = "garou" arcade_garouha = "garou" arcade_garouo = "garou" arcade_garoup = "garou" arcade_garuka = "devstors" arcade_garyoret = "garyoret" arcade_gatedom1 = "darkseal" arcade_gatedoom = "darkseal" arcade_gatedoom1 = "darkseal" arcade_gatsbee = "galaga" arcade_gaun22p1 = "gaunt2" arcade_gaun22pg = "gaunt2" arcade_gaun2pg1 = "gauntlet" arcade_gaun2pj2 = "gauntlet" arcade_gaun2pr3 = "gauntlet" arcade_gaunt2 = "gaunt2" arcade_gaunt22p = "gaunt2" arcade_gaunt22p1 = "gaunt2" arcade_gaunt22pg = "gaunt2" arcade_gaunt2g = "gaunt2" arcade_gaunt2p = "gauntlet" arcade_gaunt2pg = "gauntlet" arcade_gaunt2pj = "gauntlet" arcade_gauntg = "gauntlet" arcade_gauntgr3 = "gauntlet" arcade_gauntgr6 = "gauntlet" arcade_gauntgr8 = "gauntlet" arcade_gauntj = "gauntlet" arcade_gauntj12 = "gauntlet" arcade_gauntlet = "gauntlet" arcade_gauntlet2p = "gauntlet" arcade_gauntlet2pg = "gauntlet" arcade_gauntlet2pg1 = "gauntlet" arcade_gauntlet2pj = "gauntlet" arcade_gauntlet2pj2 = "gauntlet" arcade_gauntlet2pr3 = "gauntlet" arcade_gauntletg = "gauntlet" arcade_gauntletgr3 = "gauntlet" arcade_gauntletgr6 = "gauntlet" arcade_gauntletgr8 = "gauntlet" arcade_gauntletj = "gauntlet" arcade_gauntletj12 = "gauntlet" arcade_gauntletr1 = "gauntlet" arcade_gauntletr2 = "gauntlet" arcade_gauntletr4 = "gauntlet" arcade_gauntletr5 = "gauntlet" arcade_gauntletr7 = "gauntlet" arcade_gauntletr9 = "gauntlet" arcade_gauntlets = "gauntlet" arcade_gauntr1 = "gauntlet" arcade_gauntr2 = "gauntlet" arcade_gauntr4 = "gauntlet" arcade_gauntr5 = "gauntlet" arcade_gauntr7 = "gauntlet" arcade_gauntr9 = "gauntlet" arcade_gaunts = "gauntlet" arcade_gaxeduel = "gaxeduel" arcade_gberet = "gberet" arcade_gberetb = "gberet" arcade_gblchmp = "kaiserkn" arcade_gbusters = "gbusters" arcade_gbustersa = "gbusters" arcade_gcpinbal = "gcpinbal" arcade_gdarius = "gdarius" arcade_gdarius2 = "gdarius" arcade_gdfs = "gdfs" arcade_geebee = "geebee" arcade_geebeea = "geebee" arcade_geebeeb = "geebee" arcade_geebeeg = "geebee" arcade_gekiretu = "gekiretu" arcade_gekiridn = "gekiridn" arcade_gekiridnj = "gekiridn" arcade_gekirido = "gekirido" arcade_gemini = "gemini" arcade_geminib = "gemini" arcade_genix = "genix" arcade_genpeitd = "genpeitd" arcade_gensitou = "prehisle" arcade_geostorm = "gunforc2" arcade_getstar = "getstar" arcade_getstarb = "getstar" arcade_getstarj = "getstar" arcade_gfire2 = "gfire2" arcade_gforce2 = "gforce2" arcade_gforce2j = "gforce2" arcade_gforce2ja = "gforce2" arcade_gforce2sd = "gforce2" arcade_gg_5in1fun = "gg_5in1fun" arcade_gg_aaharima = "gg_aaharima" arcade_gg_addfam = "gg_addfam" arcade_gg_advbatmr = "gg_advbatmr" arcade_gg_aerialas = "gg_aerialas" arcade_gg_aerialasj = "gg_aerialas" arcade_gg_agassi = "gg_agassi" arcade_gg_aladdin = "gg_aladdin" arcade_gg_aladdinj = "gg_aladdin" arcade_gg_aladdinp1 = "gg_aladdin" arcade_gg_aladdinp2 = "gg_aladdin" arcade_gg_aladdinp3 = "gg_aladdin" arcade_gg_alexkidd = "gg_alexkidd" arcade_gg_alien3 = "gg_alien3" arcade_gg_alien3j = "gg_alien3" arcade_gg_aliensyn = "gg_aliensyn" arcade_gg_aliensynj = "gg_aliensyn" arcade_gg_arcadecl = "gg_arcadecl" arcade_gg_archrivl = "gg_archrivl" arcade_gg_arena = "gg_arena" arcade_gg_ariel = "gg_ariel" arcade_gg_arliel = "gg_crystalw" arcade_gg_astergre = "gg_astergre" arcade_gg_astergrep1 = "gg_astergre" arcade_gg_astergrep2 = "gg_astergre" arcade_gg_astergrep3 = "gg_astergre" arcade_gg_astergrep4 = "gg_astergre" arcade_gg_astergrep5 = "gg_astergre" arcade_gg_astergreu = "gg_astergre" arcade_gg_astermis = "gg_astermis" arcade_gg_axbattlr = "gg_axbattlr" arcade_gg_axbattlrj = "gg_axbattlr" arcade_gg_axbattlrp = "gg_axbattlr" arcade_gg_bakubaku = "gg_bakubaku" arcade_gg_bakubakuj = "gg_bakubaku" arcade_gg_bakubakuu = "gg_bakubaku" arcade_gg_bam = "gg_bam" arcade_gg_barbie = "gg_barbie" arcade_gg_bartman = "gg_bartman" arcade_gg_bartvssm = "gg_bartvssm" arcade_gg_bartvswd = "gg_bartvswd" arcade_gg_batmanf = "gg_batmanf" arcade_gg_batmanrn = "gg_batmanrn" arcade_gg_batterup = "gg_batterup" arcade_gg_beavis = "gg_beavis" arcade_gg_beavisp = "gg_beavis" arcade_gg_berens = "gg_berens" arcade_gg_berensp01 = "gg_berens" arcade_gg_berensp02 = "gg_berens" arcade_gg_berensp03 = "gg_berens" arcade_gg_berensp04 = "gg_berens" arcade_gg_berensp05 = "gg_berens" arcade_gg_berensp06 = "gg_berens" arcade_gg_berensp07 = "gg_berens" arcade_gg_berensp08 = "gg_berens" arcade_gg_berensp09 = "gg_berens" arcade_gg_berensp10 = "gg_berens" arcade_gg_berensp11 = "gg_berens" arcade_gg_berensp12 = "gg_berens" arcade_gg_berensp13 = "gg_berens" arcade_gg_berensp14 = "gg_berens" arcade_gg_berensp15 = "gg_berens" arcade_gg_berensp16 = "gg_berens" arcade_gg_berensp17 = "gg_berens" arcade_gg_berlin = "gg_berlin" arcade_gg_bighurt = "gg_bighurt" arcade_gg_bonkers = "gg_bonkers" arcade_gg_bonkersp01 = "gg_bonkers" arcade_gg_bonkersp02 = "gg_bonkers" arcade_gg_bonkersp03 = "gg_bonkers" arcade_gg_bonkersp04 = "gg_bonkers" arcade_gg_bonkersp05 = "gg_bonkers" arcade_gg_bonkersp06 = "gg_bonkers" arcade_gg_bonkersp07 = "gg_bonkers" arcade_gg_bonkersp08 = "gg_bonkers" arcade_gg_bonkersp09 = "gg_bonkers" arcade_gg_bonkersp10 = "gg_bonkers" arcade_gg_bonkersp11 = "gg_bonkers" arcade_gg_bonkersp12 = "gg_bonkers" arcade_gg_bonkersp13 = "gg_bonkers" arcade_gg_bship = "gg_bship" arcade_gg_btoads = "gg_btoads" arcade_gg_btoadsu = "gg_btoads" arcade_gg_bublbobl = "gg_bublbobl" arcade_gg_bugsbun = "gg_bugsbun" arcade_gg_busterb = "gg_busterb" arcade_gg_busterf = "gg_busterf" arcade_gg_caesars = "gg_caesars" arcade_gg_captaven = "gg_captaven" arcade_gg_carlicen = "gg_carlicen" arcade_gg_casinofn = "gg_casinofn" arcade_gg_castlill = "gg_castlill" arcade_gg_castlillj = "gg_castlill" arcade_gg_chakan = "gg_chakan" arcade_gg_champhck = "gg_champhck" arcade_gg_chasehq = "gg_chasehq" arcade_gg_chasehqj = "gg_chasehq" arcade_gg_cheese = "gg_cheese" arcade_gg_chessmst = "gg_chessmst" arcade_gg_chicago = "gg_chicago" arcade_gg_chicagop01 = "gg_chicago" arcade_gg_chicagop02 = "gg_chicago" arcade_gg_chicagop03 = "gg_chicago" arcade_gg_chicagop04 = "gg_chicago" arcade_gg_chicagop05 = "gg_chicago" arcade_gg_chicagop06 = "gg_chicago" arcade_gg_chicagop07 = "gg_chicago" arcade_gg_chicagop08 = "gg_chicago" arcade_gg_chicagop09 = "gg_chicago" arcade_gg_chicagop10 = "gg_chicago" arcade_gg_chicagop11 = "gg_chicago" arcade_gg_chicagop12 = "gg_chicago" arcade_gg_chicagop13 = "gg_chicago" arcade_gg_chicagop14 = "gg_chicago" arcade_gg_chicagop15 = "gg_chicago" arcade_gg_chicagop16 = "gg_chicago" arcade_gg_chicagop17 = "gg_chicago" arcade_gg_chicagop18 = "gg_chicago" arcade_gg_chicagop19 = "gg_chicago" arcade_gg_chicagop20 = "gg_chicago" arcade_gg_chicagop21 = "gg_chicago" arcade_gg_chicagop22 = "gg_chicago" arcade_gg_chicagop23 = "gg_chicago" arcade_gg_chicagop24 = "gg_chicago" arcade_gg_choplft3 = "gg_choplft3" arcade_gg_chuckrck = "gg_chuckrck" arcade_gg_chuckrckp = "gg_chuckrck" arcade_gg_chukrck2 = "gg_chukrck2" arcade_gg_chukrck2u = "gg_chukrck2" arcade_gg_cj = "gg_cj" arcade_gg_cliffh = "gg_cliffh" arcade_gg_clutchit = "gg_clutchit" arcade_gg_cocakid = "gg_cocakid" arcade_gg_columns = "gg_columns" arcade_gg_columnsj = "gg_columns" arcade_gg_columnsj1 = "gg_columns" arcade_gg_coolspot = "gg_coolspot" arcade_gg_coolspotu = "gg_coolspot" arcade_gg_cosmic = "gg_cosmic" arcade_gg_crashdum = "gg_crashdum" arcade_gg_crayon = "gg_crayon" arcade_gg_crazyfac = "gg_crazyfac" arcade_gg_crystalw = "gg_crystalw" arcade_gg_cutthr = "gg_cutthr" arcade_gg_cutthrp = "gg_cutthr" arcade_gg_daffy = "gg_daffy" arcade_gg_daisenrg = "gg_daisenrg" arcade_gg_dcrystal = "gg_dcrystal" arcade_gg_dcrystalj = "gg_dcrystal" arcade_gg_ddanpei = "gg_ddanpei" arcade_gg_ddragon = "gg_ddragon" arcade_gg_ddragonp = "gg_ddragon" arcade_gg_deepduck = "gg_deepduck" arcade_gg_defoasis = "gg_defoasis" arcade_gg_defoasisp = "gg_defoasis" arcade_gg_desert = "gg_desert" arcade_gg_desertu = "gg_desert" arcade_gg_devilish = "gg_devilish" arcade_gg_devilishj = "gg_devilish" arcade_gg_devilishu = "gg_devilish" arcade_gg_dhead = "gg_dhead" arcade_gg_dheadj = "gg_dhead" arcade_gg_dheadp1 = "gg_dhead" arcade_gg_dheadp2 = "gg_dhead" arcade_gg_dheadp3 = "gg_dhead" arcade_gg_donald42 = "gg_deepduck" arcade_gg_donaldld = "gg_luckydim" arcade_gg_donaldmw = "gg_donaldmw" arcade_gg_doraemon = "gg_doraemon" arcade_gg_dracula = "gg_dracula" arcade_gg_draculau = "gg_dracula" arcade_gg_dragon = "gg_dragon" arcade_gg_dragonu = "gg_dragon" arcade_gg_drfrankn = "gg_drfrankn" arcade_gg_dropzone = "gg_dropzone" arcade_gg_drrobotn = "gg_drrobotn" arcade_gg_dstrike = "gg_dstrike" arcade_gg_dstrikeu = "gg_dstrike" arcade_gg_dunkkids = "gg_dunkkids" arcade_gg_ecco = "gg_ecco" arcade_gg_ecco2 = "gg_ecco2" arcade_gg_ecco2j = "gg_ecco2" arcade_gg_eccoj = "gg_ecco" arcade_gg_ejim = "gg_ejim" arcade_gg_ejimu = "gg_ejim" arcade_gg_ernieeg = "gg_ernieeg" arcade_gg_eternleg = "gg_eternleg" arcade_gg_evander = "gg_evander" arcade_gg_excdizzy = "gg_excdizzy" arcade_gg_excdizzyp = "gg_excdizzy" arcade_gg_f1 = "gg_f1" arcade_gg_f15se = "gg_f15se" arcade_gg_f1wce = "gg_f1wce" arcade_gg_faceball = "gg_faceball" arcade_gg_factoryp = "gg_factoryp" arcade_gg_fantdizz = "gg_fantdizz" arcade_gg_fantzone = "gg_fantzone" arcade_gg_fantzoneu = "gg_fantzone" arcade_gg_fatfursp = "gg_fatfursp" arcade_gg_fatfurspu = "gg_fatfursp" arcade_gg_fifa = "gg_fifa" arcade_gg_fifa96 = "gg_fifa96" arcade_gg_fifaj = "gg_fifa" arcade_gg_foreman = "gg_foreman" arcade_gg_fray = "gg_fray" arcade_gg_fredcoup = "gg_fredcoup" arcade_gg_fredcoupj = "gg_fredcoup" arcade_gg_frogger = "gg_frogger" arcade_gg_galaga2 = "gg_galaga2" arcade_gg_galaga91 = "gg_galaga2" arcade_gg_gamble = "gg_gamble" arcade_gg_gambler = "gg_gambler" arcade_gg_garfield = "gg_garfield" arcade_gg_garousp = "gg_fatfursp" arcade_gg_gearstad = "gg_batterup" arcade_gg_gearstah = "gg_gearstah" arcade_gg_gearwork = "gg_gearwork" arcade_gg_georgeko = "gg_georgeko" arcade_gg_ggaleste = "gg_ggaleste" arcade_gg_ggdora = "gg_ggdora" arcade_gg_ggorby = "gg_factoryp" arcade_gg_ggport = "gg_ggport" arcade_gg_ggport1 = "gg_ggport1" arcade_gg_gloc = "gg_gloc" arcade_gg_glocj = "gg_gloc" arcade_gg_glocj1 = "gg_gloc" arcade_gg_godzilla = "gg_godzilla" arcade_gg_gprider = "gg_gprider" arcade_gg_gpriderj = "gg_gprider" arcade_gg_gpriderp = "gg_gprider" arcade_gg_greendog = "gg_greendog" arcade_gg_griffin = "gg_griffin" arcade_gg_gunstar = "gg_gunstar" arcade_gg_halleyw = "gg_halleyw" arcade_gg_halleywj = "gg_halleyw" arcade_gg_headbust = "gg_headbust" arcade_gg_heavyw = "gg_heavyw" arcade_gg_homea = "gg_homea" arcade_gg_hook = "gg_hook" arcade_gg_hooku = "gg_hook" arcade_gg_hulk = "gg_hulk" arcade_gg_hurrican = "gg_hurrican" arcade_gg_hyokkohj = "gg_hyokkohj" arcade_gg_hypyak92 = "gg_hypyak92" arcade_gg_ichirgg = "gg_ichirgg" arcade_gg_indycrus = "gg_indycrus" arcade_gg_inudais = "gg_inudais" arcade_gg_ironman = "gg_ironman" arcade_gg_ironman1 = "gg_ironman" arcade_gg_itchy = "gg_itchy" arcade_gg_jangpun2 = "gg_jangpun2" arcade_gg_jb007 = "gg_jb007" arcade_gg_jdredd = "gg_jdredd" arcade_gg_jeopards = "gg_jeopards" arcade_gg_jeopardy = "gg_jeopardy" arcade_gg_jleagu94 = "gg_jleagu94" arcade_gg_jleague = "gg_jleague" arcade_gg_joemont = "gg_joemont" arcade_gg_joemontj = "gg_joemont" arcade_gg_jpark = "gg_jpark" arcade_gg_jparkj = "gg_jpark" arcade_gg_jpond3 = "gg_jpond3" arcade_gg_jstrike = "gg_jstrike" arcade_gg_junction = "gg_junction" arcade_gg_junctionj = "gg_junction" arcade_gg_jungle = "gg_jungle" arcade_gg_jungleu = "gg_jungle" arcade_gg_kawasaki = "gg_kawasaki" arcade_gg_kickrush = "gg_tengenwc" arcade_gg_kineticc = "gg_kineticc" arcade_gg_klax = "gg_klax" arcade_gg_krustyfh = "gg_krustyfh" arcade_gg_kunichan = "gg_kunichan" arcade_gg_kunichn2 = "gg_kunichn2" arcade_gg_landill = "gg_landill" arcade_gg_landillj = "gg_landill" arcade_gg_lastact = "gg_lastact" arcade_gg_lastbibl = "gg_lastbibl" arcade_gg_lastbibs = "gg_lastbibs" arcade_gg_lastbibse = "gg_lastbibs" arcade_gg_legndill = "gg_legndill" arcade_gg_legndillj = "gg_legndill" arcade_gg_legndillp1 = "gg_legndill" arcade_gg_legndillp2 = "gg_legndill" arcade_gg_legndillp3 = "gg_legndill" arcade_gg_legndillp4 = "gg_legndill" arcade_gg_legndillp5 = "gg_legndill" arcade_gg_legndillp6 = "gg_legndill" arcade_gg_lemming2 = "gg_lemming2" arcade_gg_lemmings = "gg_lemmings" arcade_gg_lemmingsp = "gg_lemmings" arcade_gg_lionking = "gg_lionking" arcade_gg_lionkingj = "gg_lionking" arcade_gg_lionkingp1 = "gg_lionking" arcade_gg_lionkingp2 = "gg_lionking" arcade_gg_lionkingp3 = "gg_lionking" arcade_gg_lionkingp4 = "gg_lionking" arcade_gg_lionkingp5 = "gg_lionking" arcade_gg_lionkingp6 = "gg_lionking" arcade_gg_lionkingp7 = "gg_lionking" arcade_gg_lionkingp8 = "gg_lionking" arcade_gg_lionkingp9 = "gg_lionking" arcade_gg_lionkingu = "gg_lionking" arcade_gg_lostwrld = "gg_lostwrld" arcade_gg_luckydim = "gg_luckydim" arcade_gg_lunar = "gg_lunar" arcade_gg_lunare = "gg_lunar" arcade_gg_madden95 = "gg_madden95" arcade_gg_madden96 = "gg_madden96" arcade_gg_madoumn2 = "gg_madoumn2" arcade_gg_madoumn3 = "gg_madoumn3" arcade_gg_madoumn3a = "gg_madoumn3" arcade_gg_madoumna = "gg_madoumna" arcade_gg_madoumon = "gg_madoumon" arcade_gg_madoumone = "gg_madoumon" arcade_gg_magiclpp = "gg_magiclpp" arcade_gg_majors = "gg_majors" arcade_gg_mappy = "gg_mappy" arcade_gg_marble = "gg_marble" arcade_gg_marko = "gg_marko" arcade_gg_mastdark = "gg_mastdark" arcade_gg_megaman = "gg_megaman" arcade_gg_mickeyuc = "gg_mickeyuc" arcade_gg_mickmack = "gg_mickmack" arcade_gg_micromac = "gg_micromac" arcade_gg_micromc2 = "gg_micromc2" arcade_gg_mk = "gg_mk" arcade_gg_mk2 = "gg_mk2" arcade_gg_mk3 = "gg_mk3" arcade_gg_mkj = "gg_mk" arcade_gg_mlbpa = "gg_mlbpa" arcade_gg_mmpr = "gg_mmpr" arcade_gg_mmprp = "gg_mmpr" arcade_gg_mmprtm = "gg_mmprtm" arcade_gg_mmprtmp = "gg_mmprtm" arcade_gg_moldoran = "gg_moldoran" arcade_gg_monstwar = "gg_monstwar" arcade_gg_mspacman = "gg_mspacman" arcade_gg_mtaruru = "gg_mtaruru" arcade_gg_mworld2 = "gg_wboydtrp" arcade_gg_nazopuyo = "gg_nazopuyo" arcade_gg_nazopuyo1 = "gg_nazopuyo" arcade_gg_nazpuyo2 = "gg_nazpuyo2" arcade_gg_nazpyoar = "gg_nazpyoar" arcade_gg_nazpyoarp = "gg_nazpyoar" arcade_gg_nbaact = "gg_nbaact" arcade_gg_nbaactp01 = "gg_nbaact" arcade_gg_nbaactp02 = "gg_nbaact" arcade_gg_nbaactp03 = "gg_nbaact" arcade_gg_nbaactp04 = "gg_nbaact" arcade_gg_nbaactp05 = "gg_nbaact" arcade_gg_nbaactp06 = "gg_nbaact" arcade_gg_nbaactp07 = "gg_nbaact" arcade_gg_nbaactp08 = "gg_nbaact" arcade_gg_nbaactp09 = "gg_nbaact" arcade_gg_nbaactp10 = "gg_nbaact" arcade_gg_nbaactp11 = "gg_nbaact" arcade_gg_nbaactp12 = "gg_nbaact" arcade_gg_nbaactp13 = "gg_nbaact" arcade_gg_nbaactp14 = "gg_nbaact" arcade_gg_nbaactp15 = "gg_nbaact" arcade_gg_nbaactp16 = "gg_nbaact" arcade_gg_nbaactp17 = "gg_nbaact" arcade_gg_nbaactp18 = "gg_nbaact" arcade_gg_nbaactp19 = "gg_nbaact" arcade_gg_nbaactp20 = "gg_nbaact" arcade_gg_nbaactp21 = "gg_nbaact" arcade_gg_nbaactp22 = "gg_nbaact" arcade_gg_nbaactp23 = "gg_nbaact" arcade_gg_nbaactp24 = "gg_nbaact" arcade_gg_nbaactp25 = "gg_nbaact" arcade_gg_nbaactp26 = "gg_nbaact" arcade_gg_nbaactp27 = "gg_nbaact" arcade_gg_nbaactp28 = "gg_nbaact" arcade_gg_nbaactp29 = "gg_nbaact" arcade_gg_nbaactp30 = "gg_nbaact" arcade_gg_nbajam = "gg_nbajam" arcade_gg_nbajam1 = "gg_nbajam" arcade_gg_nbajamj = "gg_nbajam" arcade_gg_nbajamte = "gg_nbajamte" arcade_gg_nekodais = "gg_nekodais" arcade_gg_nfl95 = "gg_nfl95" arcade_gg_nfl95p01 = "gg_nfl95" arcade_gg_nfl95p02 = "gg_nfl95" arcade_gg_nfl95p03 = "gg_nfl95" arcade_gg_nfl95p04 = "gg_nfl95" arcade_gg_nfl95p05 = "gg_nfl95" arcade_gg_nfl95p06 = "gg_nfl95" arcade_gg_nfl95p07 = "gg_nfl95" arcade_gg_nfl95p08 = "gg_nfl95" arcade_gg_nfl95p09 = "gg_nfl95" arcade_gg_nfl95p10 = "gg_nfl95" arcade_gg_nfl95p11 = "gg_nfl95" arcade_gg_nfl95p12 = "gg_nfl95" arcade_gg_nfl95p13 = "gg_nfl95" arcade_gg_nflqb = "gg_nflqb" arcade_gg_nflqb96 = "gg_nflqb96" arcade_gg_ngaiden = "gg_ngaiden" arcade_gg_ngaidenj = "gg_ngaiden" arcade_gg_nhl = "gg_nhl" arcade_gg_nhlas = "gg_nhlas" arcade_gg_nhlasp01 = "gg_nhlas" arcade_gg_nhlasp02 = "gg_nhlas" arcade_gg_nhlasp03 = "gg_nhlas" arcade_gg_nhlasp04 = "gg_nhlas" arcade_gg_nhlasp05 = "gg_nhlas" arcade_gg_nhlasp06 = "gg_nhlas" arcade_gg_nhlasp07 = "gg_nhlas" arcade_gg_nhlasp08 = "gg_nhlas" arcade_gg_nhlasp09 = "gg_nhlas" arcade_gg_nhlasp10 = "gg_nhlas" arcade_gg_nhlasp11 = "gg_nhlas" arcade_gg_nhlasp12 = "gg_nhlas" arcade_gg_nhlasp13 = "gg_nhlas" arcade_gg_nhlasp14 = "gg_nhlas" arcade_gg_nhlasp15 = "gg_nhlas" arcade_gg_nhlasp16 = "gg_nhlas" arcade_gg_nhlasp17 = "gg_nhlas" arcade_gg_ninku = "gg_ninku" arcade_gg_ninku2 = "gg_ninku2" arcade_gg_ninkug = "gg_ninkug" arcade_gg_nomowsb = "gg_nomowsb" arcade_gg_olympgld = "gg_olympgld" arcade_gg_olympglda = "gg_olympgld" arcade_gg_ottifant = "gg_ottifant" arcade_gg_outrneur = "gg_outrneur" arcade_gg_outrneuru = "gg_outrneur" arcade_gg_outrun = "gg_outrun" arcade_gg_outrunj = "gg_outrun" arcade_gg_pacattak = "gg_pacattak" arcade_gg_pacintim = "gg_pacintim" arcade_gg_pacman = "gg_pacman" arcade_gg_pacmanj = "gg_pacman" arcade_gg_panzer = "gg_panzer" arcade_gg_paperbo2 = "gg_paperbo2" arcade_gg_paperboy = "gg_paperboy" arcade_gg_pbdreams = "gg_pbdreams" arcade_gg_pbobble = "gg_bam" arcade_gg_pdrive = "gg_pdrive" arcade_gg_pengo = "gg_pengo" arcade_gg_pengoj = "gg_pengo" arcade_gg_pga96 = "gg_pga96" arcade_gg_pgatour = "gg_pgatour" arcade_gg_pgatour2 = "gg_pgatour2" arcade_gg_pgatourt = "gg_pgatourt" arcade_gg_phantom = "gg_phantom" arcade_gg_pocketj = "gg_pocketj" arcade_gg_pokerfbj = "gg_pokerfbj" arcade_gg_pokerfg = "gg_pokerfg" arcade_gg_pokerfp = "gg_pokerfp" arcade_gg_pokerfs = "gg_pokerfs" arcade_gg_popbreak = "gg_popbreak" arcade_gg_popeye = "gg_popeye" arcade_gg_ppersia = "gg_ppersia" arcade_gg_ppersiau = "gg_ppersia" arcade_gg_predatr2 = "gg_predatr2" arcade_gg_primal = "gg_primal" arcade_gg_proyak91 = "gg_proyak91" arcade_gg_proyak94 = "gg_proyak94" arcade_gg_proyakgg = "gg_proyakgg" arcade_gg_proyaktl = "gg_proyaktl" arcade_gg_pstaradv = "gg_pstaradv" arcade_gg_pstargdn = "gg_pstargdn" arcade_gg_pstargdne = "gg_pstargdn" arcade_gg_pstrike2 = "gg_pstrike2" arcade_gg_psychicw = "gg_psychicw" arcade_gg_psychicwj = "gg_psychicw" arcade_gg_puttputt = "gg_puttputt" arcade_gg_puttputtj = "gg_puttputt" arcade_gg_puyopuy2 = "gg_puyopuy2" arcade_gg_puyopuyo = "gg_puyopuyo" arcade_gg_quizgear = "gg_quizgear" arcade_gg_rastan = "gg_rastan" arcade_gg_rayeart2 = "gg_rayeart2" arcade_gg_rayearth = "gg_rayearth" arcade_gg_rbibb94 = "gg_rbibb94" arcade_gg_rcgp = "gg_rcgp" arcade_gg_revenged = "gg_wboy" arcade_gg_riddick = "gg_riddick" arcade_gg_riddickj = "gg_riddick" arcade_gg_riserobo = "gg_riserobo" arcade_gg_ristar = "gg_ristar" arcade_gg_ristarp1 = "gg_ristar" arcade_gg_ristarp2 = "gg_ristar" arcade_gg_ristarp3 = "gg_ristar" arcade_gg_ristarp4 = "gg_ristar" arcade_gg_ristarp5 = "gg_ristar" arcade_gg_roadrash = "gg_roadrash" arcade_gg_roadrashu = "gg_roadrash" arcade_gg_robocod = "gg_robocod" arcade_gg_robocodu = "gg_robocod" arcade_gg_robocop3 = "gg_robocop3" arcade_gg_roboterm = "gg_roboterm" arcade_gg_royalstn = "gg_royalstn" arcade_gg_royalstne = "gg_royalstn" arcade_gg_ryukyu = "gg_solitarp" arcade_gg_sailorms = "gg_sailorms" arcade_gg_sainttal = "gg_sainttal" arcade_gg_sampras = "gg_sampras" arcade_gg_samsho = "gg_samsho" arcade_gg_samspir = "gg_samsho" arcade_gg_sbtank = "gg_sbtank" arcade_gg_scratchg = "gg_scratchg" arcade_gg_scratchgj = "gg_scratchg" arcade_gg_sdgundam = "gg_sdgundam" arcade_gg_sega4in1 = "gg_sega4in1" arcade_gg_sega4in1p = "gg_sega4in1" arcade_gg_sensible = "gg_sensible" arcade_gg_shadam = "gg_defoasis" arcade_gg_shangh2 = "gg_shangh2" arcade_gg_shangh2a = "gg_shangh2" arcade_gg_shaqfu = "gg_shaqfu" arcade_gg_sharrier = "gg_sharrier" arcade_gg_shavnyak = "gg_shavnyak" arcade_gg_shero = "gg_shero" arcade_gg_sheroa = "gg_shero" arcade_gg_shikinjo = "gg_shikinjo" arcade_gg_shinfrc2 = "gg_shinfrc2" arcade_gg_shinfrc2p1 = "gg_shinfrc2" arcade_gg_shinfrc2p2 = "gg_shinfrc2" arcade_gg_shinfrc2p3 = "gg_shinfrc2" arcade_gg_shinfrc2p4 = "gg_shinfrc2" arcade_gg_shinfrcg = "gg_shinfrcg" arcade_gg_shinfrg2 = "gg_shinfrc2" arcade_gg_shinfrgf = "gg_shinfrgf" arcade_gg_shinfrgfe = "gg_shinfrgf" arcade_gg_shinobi = "gg_shinobi" arcade_gg_shinobi2 = "gg_shinobi2" arcade_gg_shinobij = "gg_shinobi" arcade_gg_sidepock = "gg_sidepock" arcade_gg_skickoff = "gg_skickoff" arcade_gg_skweek = "gg_slider" arcade_gg_slamdunk = "gg_slamdunk" arcade_gg_slider = "gg_slider" arcade_gg_smashtv = "gg_smashtv" arcade_gg_smgp = "gg_smgp" arcade_gg_smgp2 = "gg_smgp2" arcade_gg_smgp2j = "gg_smgp2" arcade_gg_smgp2p = "gg_smgp2" arcade_gg_smgpj = "gg_smgp" arcade_gg_smomo3 = "gg_smomo3" arcade_gg_smurfs = "gg_smurfs" arcade_gg_smurfs2 = "gg_smurfs2" arcade_gg_sokoban = "gg_sokoban" arcade_gg_solitair = "gg_solitair" arcade_gg_solitarp = "gg_solitarp" arcade_gg_sonic = "gg_sonic" arcade_gg_sonic2 = "gg_sonic2" arcade_gg_sonic2d = "gg_sonic2" arcade_gg_sonicbls = "gg_sonicbls" arcade_gg_sonicblsp1 = "gg_sonicbls" arcade_gg_sonicblsp2 = "gg_sonicbls" arcade_gg_sonicblsp3 = "gg_sonicbls" arcade_gg_sonicblsp4 = "gg_sonicbls" arcade_gg_sonicblsp5 = "gg_sonicbls" arcade_gg_sonicblsp6 = "gg_sonicbls" arcade_gg_sonicc = "gg_sonicc" arcade_gg_sonicdr = "gg_sonicdr" arcade_gg_sonicdr2 = "gg_sonicdr2" arcade_gg_sonicdrs = "gg_sonicdr" arcade_gg_sonicj = "gg_sonic" arcade_gg_soniclab = "gg_soniclab" arcade_gg_sonicp = "gg_sonic" arcade_gg_sonictl2 = "gg_sonictri" arcade_gg_sonictls = "gg_sonicc" arcade_gg_sonictlss = "gg_sonicc" arcade_gg_sonictri = "gg_sonictri" arcade_gg_sonictrip = "gg_sonictri" arcade_gg_sor = "gg_sor" arcade_gg_sor2 = "gg_sor2" arcade_gg_spidermn = "gg_spidermn" arcade_gg_spidking = "gg_spidking" arcade_gg_spidxmen = "gg_spidxmen" arcade_gg_spirou = "gg_spirou" arcade_gg_sportill = "gg_sportill" arcade_gg_sporttrv = "gg_sporttrv" arcade_gg_sporttrvp01 = "gg_sprtrvce" arcade_gg_sporttrvp02 = "gg_sprtrvce" arcade_gg_sporttrvp03 = "gg_sprtrvce" arcade_gg_sporttrvp04 = "gg_sprtrvce" arcade_gg_sporttrvp05 = "gg_sporttrv" arcade_gg_sporttrvp06 = "gg_sporttrv" arcade_gg_sporttrvp07 = "gg_sporttrv" arcade_gg_sporttrvp08 = "gg_sporttrv" arcade_gg_sporttrvp09 = "gg_sporttrv" arcade_gg_sporttrvp10 = "gg_sporttrv" arcade_gg_sporttrvp11 = "gg_sporttrv" arcade_gg_sporttrvp12 = "gg_sporttrv" arcade_gg_sprtrvce = "gg_sprtrvce" arcade_gg_sprtrvcep01 = "gg_sprtrvce" arcade_gg_sprtrvcep02 = "gg_sprtrvce" arcade_gg_sprtrvcep03 = "gg_sprtrvce" arcade_gg_sprtrvcep04 = "gg_sprtrvce" arcade_gg_sprtrvcep05 = "gg_sprtrvce" arcade_gg_sprtrvcep06 = "gg_sprtrvce" arcade_gg_sprtrvcep07 = "gg_sprtrvce" arcade_gg_sprtrvcep08 = "gg_sprtrvce" arcade_gg_sprtrvcep09 = "gg_sprtrvce" arcade_gg_sprtrvcep10 = "gg_sprtrvce" arcade_gg_sprtrvcep11 = "gg_sprtrvce" arcade_gg_sprtrvcep12 = "gg_sprtrvce" arcade_gg_sprtrvcep13 = "gg_sprtrvce" arcade_gg_sprtrvcep14 = "gg_sprtrvce" arcade_gg_sprtrvcep15 = "gg_sprtrvce" arcade_gg_sprtrvcep16 = "gg_sprtrvce" arcade_gg_sprtrvcep17 = "gg_sprtrvce" arcade_gg_sprtrvcep18 = "gg_sprtrvce" arcade_gg_sprtrvcep19 = "gg_sprtrvce" arcade_gg_sprtrvcep20 = "gg_sprtrvce" arcade_gg_sprtrvcep21 = "gg_sprtrvce" arcade_gg_sprtrvcep22 = "gg_sprtrvce" arcade_gg_sprtrvcep23 = "gg_sprtrvce" arcade_gg_sprtrvcep24 = "gg_sprtrvce" arcade_gg_ssinv = "gg_ssinv" arcade_gg_sslucifr = "gg_sslucifr" arcade_gg_sspin = "gg_sspin" arcade_gg_sspinp01 = "gg_sspin" arcade_gg_sspinp02 = "gg_sspin" arcade_gg_sspinp03 = "gg_sspin" arcade_gg_sspinp04 = "gg_sspin" arcade_gg_sspinp05 = "gg_sspin" arcade_gg_sspinp06 = "gg_sspin" arcade_gg_sspinp07 = "gg_sspin" arcade_gg_sspinp08 = "gg_sspin" arcade_gg_sspinp09 = "gg_sspin" arcade_gg_sspinp10 = "gg_sspin" arcade_gg_sspinp11 = "gg_sspin" arcade_gg_sspinp12 = "gg_sspin" arcade_gg_sspinp13 = "gg_sspin" arcade_gg_sspinp14 = "gg_sspin" arcade_gg_sspinp15 = "gg_sspin" arcade_gg_sspinp16 = "gg_sspin" arcade_gg_sspinp17 = "gg_sspin" arcade_gg_sspinp18 = "gg_sspin" arcade_gg_sspinp19 = "gg_sspin" arcade_gg_sspinp20 = "gg_sspin" arcade_gg_stargate = "gg_stargate" arcade_gg_starwars = "gg_starwars" arcade_gg_starwarsu = "gg_starwars" arcade_gg_stetris = "gg_stetris" arcade_gg_stgbeyn = "gg_stgbeyn" arcade_gg_stng = "gg_stng" arcade_gg_striderr = "gg_striderr" arcade_gg_striker = "gg_striker" arcade_gg_supercol = "gg_supercol" arcade_gg_supercolj = "gg_supercol" arcade_gg_supercolp1 = "gg_supercol" arcade_gg_supercolp2 = "gg_supercol" arcade_gg_supercolp3 = "gg_supercol" arcade_gg_supercolp4 = "gg_supercol" arcade_gg_supercolp5 = "gg_supercol" arcade_gg_supercolp6 = "gg_supercol" arcade_gg_supercolp7 = "gg_supercol" arcade_gg_superman = "gg_superman" arcade_gg_supermanp = "gg_superman" arcade_gg_superoff = "gg_superoff" arcade_gg_supgolf = "gg_supgolf" arcade_gg_supgolfj = "gg_supgolf" arcade_gg_suprjedi = "gg_suprjedi" arcade_gg_surfninj = "gg_surfninj" arcade_gg_sylvan = "gg_sylvan" arcade_gg_sylvane = "gg_sylvan" arcade_gg_t2ag = "gg_t2ag" arcade_gg_t2agj = "gg_t2ag" arcade_gg_tailsadv = "gg_tailsadv" arcade_gg_tailskyp = "gg_tailskyp" arcade_gg_taisnmj = "gg_taisnmj" arcade_gg_taisnmj2 = "gg_taisnmj2" arcade_gg_talespin = "gg_talespin" arcade_gg_tamalymp = "gg_tamalymp" arcade_gg_tantr = "gg_tantr" arcade_gg_tarot = "gg_tarot" arcade_gg_tarzan = "gg_tarzan" arcade_gg_tazmania = "gg_tazmania" arcade_gg_tazmars = "gg_tazmars" arcade_gg_tazmarsp01 = "gg_tazmars" arcade_gg_tazmarsp02 = "gg_tazmars" arcade_gg_tazmarsp03 = "gg_tazmars" arcade_gg_tazmarsp04 = "gg_tazmars" arcade_gg_tazmarsp05 = "gg_tazmars" arcade_gg_tazmarsp06 = "gg_tazmars" arcade_gg_tazmarsp07 = "gg_tazmars" arcade_gg_tazmarsp08 = "gg_tazmars" arcade_gg_tazmarsp09 = "gg_tazmars" arcade_gg_tazmarsp10 = "gg_tazmars" arcade_gg_tazmarsp11 = "gg_tazmars" arcade_gg_tazmarsp12 = "gg_tazmars" arcade_gg_tazmarsp13 = "gg_tazmars" arcade_gg_tazmarsp14 = "gg_tazmars" arcade_gg_tempojr = "gg_tempojr" arcade_gg_tempojrp1 = "gg_tempojr" arcade_gg_tempojrp2 = "gg_tempojr" arcade_gg_tempojrp3 = "gg_tempojr" arcade_gg_tempojrp4 = "gg_tempojr" arcade_gg_tempojrp5 = "gg_tempojr" arcade_gg_tempojrp6 = "gg_tempojr" arcade_gg_tempojrp7 = "gg_tempojr" arcade_gg_tempojrp8 = "gg_tempojr" arcade_gg_tempojrp9 = "gg_tempojr" arcade_gg_tengenwc = "gg_tengenwc" arcade_gg_term2 = "gg_term2" arcade_gg_termntr = "gg_termntr" arcade_gg_tesserae = "gg_tesserae" arcade_gg_tintin = "gg_tintin" arcade_gg_tomjermv = "gg_tomjermv" arcade_gg_tomjermvj = "gg_tomjermv" arcade_gg_torarete = "gg_torarete" arcade_gg_truelies = "gg_truelies" arcade_gg_ultsoccr = "gg_ultsoccr" arcade_gg_ustrike = "gg_ustrike" arcade_gg_vampire = "gg_mastdark" arcade_gg_vfa = "gg_vfa" arcade_gg_vfmini = "gg_vfa" arcade_gg_vrtroop = "gg_vrtroop" arcade_gg_wagyan = "gg_wagyan" arcade_gg_wagyana = "gg_wagyan" arcade_gg_wakevamp = "gg_mastdark" arcade_gg_wboy = "gg_wboy" arcade_gg_wboydtrp = "gg_wboydtrp" arcade_gg_wboydtrpp = "gg_wboydtrp" arcade_gg_wboyj = "gg_wboy" arcade_gg_wclead = "gg_wclead" arcade_gg_wcup94 = "gg_wcup94" arcade_gg_wderby = "gg_wderby" arcade_gg_wheelof = "gg_wheelof" arcade_gg_wildsnake = "gg_wildsnake" arcade_gg_wimbled = "gg_wimbled" arcade_gg_wintol = "gg_wintol" arcade_gg_wintolj = "gg_wintol" arcade_gg_wizard = "gg_wizard" arcade_gg_wolfchld = "gg_wolfchld" arcade_gg_woodypop = "gg_woodypop" arcade_gg_woodypop1 = "gg_woodypop" arcade_gg_wwfraw = "gg_wwfraw" arcade_gg_wwfsteel = "gg_wwfsteel" arcade_gg_xmen = "gg_xmen" arcade_gg_xmengl = "gg_xmengl" arcade_gg_xmenglp1 = "gg_xmengl" arcade_gg_xmenglp2 = "gg_xmengl" arcade_gg_xmenglp3 = "gg_xmengl" arcade_gg_xmenmojo = "gg_xmenmojo" arcade_gg_xmenmojop1 = "gg_xmenmojo" arcade_gg_xmenmojop2 = "gg_xmenmojo" arcade_gg_xmenmojop3 = "gg_xmenmojo" arcade_gg_xmenmojop4 = "gg_xmenmojo" arcade_gg_xmenmojop5 = "gg_xmenmojo" arcade_gg_xmenmojop6 = "gg_xmenmojo" arcade_gg_xmenmojop7 = "gg_xmenmojo" arcade_gg_yaiba = "gg_yaiba" arcade_gg_yogibear = "gg_yogibear" arcade_gg_yuyu = "gg_yuyu" arcade_gg_yuyu2 = "gg_yuyu2" arcade_gg_zangear = "gg_zangear" arcade_gg_zenki = "gg_zenki" arcade_gg_zool = "gg_zool" arcade_gg_zoolj = "gg_zool" arcade_gg_zoolu = "gg_zool" arcade_gg_zoop = "gg_zoop" arcade_gg_zoopp = "gg_zoop" arcade_gghost = "gghost" arcade_ggreats2 = "opengolf" arcade_gground = "gground" arcade_ghostb = "ghostb" arcade_ghostb2a = "ghostb" arcade_ghostb3 = "ghostb" arcade_ghostb3a = "ghostb" arcade_ghostbi = "ghostbi" arcade_ghostlop = "ghostlop" arcade_ghostmun = "puckman" arcade_ghouls = "ghouls" arcade_ghoulsu = "ghouls" arcade_ghox = "ghox" arcade_ghoxj = "ghox" arcade_ghunter = "deadang" arcade_gigaman2 = "megaman2" arcade_gigandes = "gigandes" arcade_gigandesa = "gigandes" arcade_gigas = "gigas" arcade_gigasb = "gigas" arcade_gigasm2 = "gigasm2" arcade_gigasm2b = "gigasm2" arcade_gigawing = "gigawing" arcade_gigawinga = "gigawing" arcade_gigawingb = "gigawing" arcade_gigawingd = "gigawing" arcade_gigawingh = "gigawing" arcade_gigawingj = "gigawing" arcade_gigawingjd = "gigawing" arcade_gijoe = "gijoe" arcade_gijoea = "gijoe" arcade_gijoeea = "gijoe" arcade_gijoej = "gijoe" arcade_gijoeu = "gijoe" arcade_gimeabrk = "gimeabrk" arcade_ginganin = "ginganin" arcade_ginganina = "ginganin" arcade_ginkun = "ginkun" arcade_gionbana = "gionbana" arcade_gladiatr = "gladiatr" arcade_glass = "glass" arcade_glass10 = "glass" arcade_glass10a = "glass" arcade_glasskr = "glass" arcade_glfgreat = "glfgreat" arcade_glfgretj = "glfgreat" arcade_gloc = "gloc" arcade_glocr360 = "gloc" arcade_glocu = "gloc" arcade_glprac2j = "glpracr2" arcade_glprac2l = "glpracr2" arcade_glpracr = "glpracr" arcade_glpracr2 = "glpracr2" arcade_gmahou = "dimahoo" arcade_gmgalax = "gmgalax" arcade_gmissile = "gmissile" arcade_gnbarich = "gnbarich" arcade_gng = "gng" arcade_gnga = "gng" arcade_gngbl = "gng" arcade_gngbla = "gng" arcade_gngblita = "gng" arcade_gngc = "gng" arcade_gngprot = "gng" arcade_gngt = "gng" arcade_goal92 = "cupsoc" arcade_goalx3 = "goalx3" arcade_godzilla = "godzilla" arcade_gogold = "recordbr" arcade_gogomile = "gogomile" arcade_gogomileo = "gogomile" arcade_gogomilj = "gogomile" arcade_goindol = "goindol" arcade_goindolj = "goindol" arcade_goindolu = "goindol" arcade_gokuparo = "gokuparo" arcade_goldbug = "goldbug" arcade_goldmedb = "goldmedl" arcade_goldmedl = "goldmedl" arcade_goldmedla = "goldmedl" arcade_goldmedlb = "goldmedl" arcade_goldnabl = "goldnaxe" arcade_goldnaxa = "goldnaxe" arcade_goldnaxb = "goldnaxe" arcade_goldnaxc = "goldnaxe" arcade_goldnaxe = "goldnaxe" arcade_goldnaxe1 = "goldnaxe" arcade_goldnaxe1d = "goldnaxe" arcade_goldnaxe2 = "goldnaxe" arcade_goldnaxe3 = "goldnaxe" arcade_goldnaxe3d = "goldnaxe" arcade_goldnaxej = "goldnaxe" arcade_goldnaxejd = "goldnaxe" arcade_goldnaxeu = "goldnaxe" arcade_goldnaxeud = "goldnaxe" arcade_goldnaxj = "goldnaxe" arcade_golgo13 = "golgo13" arcade_gollygho = "gollygho" arcade_gomoku = "gomoku" arcade_gondo = "gondo" arcade_goonies = "goonies" arcade_gorf = "gorf" arcade_gorfpgm1 = "gorf" arcade_gorkans = "mrtnt" arcade_gotcha = "gotcha" arcade_gotya = "thehand" arcade_gowcaizr = "gowcaizr" arcade_gpilots = "gpilots" arcade_gpilotsh = "gpilots" arcade_gprider = "gprider" arcade_gpriderj = "gprider" arcade_gpriderjs = "gprider" arcade_gpriders = "gprider" arcade_gprideru = "gprider" arcade_gpriderus = "gprider" arcade_gradius = "nemesis" arcade_gradius2 = "vulcan" arcade_gradius2a = "vulcan" arcade_gradius2b = "vulcan" arcade_gradius3 = "gradius3" arcade_gradius3a = "gradius3" arcade_gradius3j = "gradius3" arcade_gradius3js = "gradius3" arcade_grasspin = "grasspin" arcade_gratia = "gratia" arcade_gratiaa = "gratia" arcade_gravitar = "gravitar" arcade_gravitr2 = "gravitar" arcade_gravp = "gravitar" arcade_grchamp = "grchamp" arcade_grdforce = "grdforce" arcade_grdian = "grdian" arcade_grdians = "grdians" arcade_grdius2a = "vulcan" arcade_grdius2b = "vulcan" arcade_grdius3a = "gradius3" arcade_grdius3e = "gradius3" arcade_grdnstrm = "grdnstrm" arcade_grdnstrmg = "grdnstrm" arcade_grdnstrmj = "grdnstrm" arcade_grdnstrmk = "grdnstrm" arcade_grdnstrmv = "grdnstrm" arcade_greatgun = "greatgun" arcade_greenber = "greenber" arcade_grescue = "lrescue" arcade_gridiron = "gridiron" arcade_gridlee = "gridlee" arcade_griffon = "phoenix" arcade_grindsta = "vfive" arcade_grindstm = "grindstm" arcade_grindstma = "grindstm" arcade_grndtour = "grndtour" arcade_grobda = "grobda" arcade_grobda2 = "grobda" arcade_grobda3 = "grobda" arcade_groovef = "groovef" arcade_groundfx = "groundfx" arcade_growl = "growl" arcade_growla = "growl" arcade_growlu = "growl" arcade_grtwall = "grtwall" arcade_grudge = "grudge" arcade_gryzor = "contra" arcade_gryzor1 = "contra" arcade_gseeker = "gseeker" arcade_gseekerj = "gseeker" arcade_gseekeru = "gseeker" arcade_gslgr94u = "gslgr94u" arcade_gstrik2 = "gstrik2" arcade_gstrik2j = "gstrik2" arcade_gstriker = "gstriker" arcade_gsword = "gsword" arcade_gteikob2 = "uniwars" arcade_gteikokb = "uniwars" arcade_gteikoku = "uniwars" arcade_gteikokub = "uniwars" arcade_gteikokub2 = "uniwars" arcade_gtg = "gtg" arcade_gtg2 = "gtg2" arcade_gtg2j = "gtg2" arcade_gtg2t = "gtg2" arcade_gtmr = "gtmr" arcade_gtmr2 = "gtmr2" arcade_gtmr2a = "gtmr2" arcade_gtmr2u = "gtmr2" arcade_gtmra = "gtmr" arcade_gtmrb = "gtmr" arcade_gtmre = "gtmr" arcade_gtmro = "gtmr" arcade_gtmrusa = "gtmr" arcade_guardian = "guardian" arcade_guiness = "strnskil" arcade_gulfstr2 = "gulfstrm" arcade_gulfstrm = "gulfstrm" arcade_gulfstrma = "gulfstrm" arcade_gulfstrmb = "gulfstrm" arcade_gulfstrmk = "gulfstrm" arcade_gulfstrmm = "gulfstrm" arcade_gulfwar2 = "gulfwar2" arcade_gulfwar2a = "gulfwar2" arcade_gumbo = "gumbo" arcade_gunball = "nitrobal" arcade_gunbird = "gunbird" arcade_gunbird2 = "gunbird2" arcade_gunbird2a = "gunbird2" arcade_gunbirdj = "gunbird" arcade_gunbirdk = "gunbird" arcade_gunbulet = "ptblank" arcade_gunbustr = "gunbustr" arcade_gundamex = "gundamex" arcade_gundeala = "gundealr" arcade_gundealr = "gundealr" arcade_gundealt = "gundealr" arcade_gundhara = "gundhara" arcade_gundharac = "gundhara" arcade_gundl94 = "gundl94" arcade_gunfight = "gunfight" arcade_gunforc2 = "gunforc2" arcade_gunforce = "gunforce" arcade_gunforcej = "gunforce" arcade_gunforceu = "gunforce" arcade_gunforcj = "gunforce" arcade_gunforcu = "gunforce" arcade_gunfronj = "gunfront" arcade_gunfront = "gunfront" arcade_gunfrontj = "gunfront" arcade_gunhohki = "mysticri" arcade_gunlock = "gunlock" arcade_gunmast = "gunmast" arcade_gunnail = "gunnail" arcade_gunsmoka = "gunsmoke" arcade_gunsmoke = "gunsmoke" arcade_gunsmokeb = "gunsmoke" arcade_gunsmokej = "gunsmoke" arcade_gunsmokeu = "gunsmoke" arcade_gunsmokeua = "gunsmoke" arcade_gunsmokeub = "gunsmoke" arcade_gunsmokj = "gunsmoke" arcade_gunsmoku = "gunsmoke" arcade_gururin = "gururin" arcade_gussun = "riskchal" arcade_gutangtn = "locomotn" arcade_gutsn = "gutsn" arcade_guwange = "guwange" arcade_guwanges = "guwange" arcade_guzzler = "guzzler" arcade_gwar = "gwar" arcade_gwara = "gwar" arcade_gwarb = "gwar" arcade_gwarj = "gwar" arcade_gwarrior = "gwarrior" arcade_gwingj = "gigawing" arcade_gypsyjug = "gypsyjug" arcade_gyrodine = "gyrodine" arcade_gyrodinet = "gyrodine" arcade_gyruss = "gyruss" arcade_gyrussb = "gyruss" arcade_gyrussce = "gyruss" arcade_hachamf = "hachamf" arcade_hachamfb = "hachamf" arcade_hachoo = "hachoo" arcade_hal21 = "hal21" arcade_hal21j = "hal21" arcade_halfway = "progear" arcade_halleycj = "halleys" arcade_halleys = "halleys" arcade_halleysc = "halleys" arcade_hamaway = "hamaway" arcade_hanaawas = "hanaawas" arcade_hanagumi = "hanagumi" arcade_hanakanz = "hanakanz" arcade_hanamai = "hanamai" arcade_hanamomo = "hanamomo" arcade_hanaoji = "hanaoji" arcade_hanaroku = "hanaroku" arcade_hangly = "puckman" arcade_hangly2 = "puckman" arcade_hangly3 = "puckman" arcade_hangon = "hangon" arcade_hangon1 = "hangon" arcade_hangon2 = "hangon" arcade_hangonjr = "hangonjr" arcade_hangzo = "hangzo" arcade_happy6 = "happy6" arcade_happy6101 = "happy6" arcade_harddrb5 = "harddriv" arcade_harddrb6 = "harddriv" arcade_harddrc1 = "harddriv" arcade_harddrcb = "harddriv" arcade_harddrcg = "harddriv" arcade_harddrg4 = "harddriv" arcade_harddriv = "harddriv" arcade_harddrj6 = "harddriv" arcade_harddrv1 = "harddriv" arcade_harddrv2 = "harddriv" arcade_harddrv3 = "harddriv" arcade_harddrvb = "harddriv" arcade_harddrvc = "harddriv" arcade_harddrvg = "harddriv" arcade_harddrvj = "harddriv" arcade_harddunj = "harddunk" arcade_harddunk = "harddunk" arcade_hardhat = "hardhat" arcade_hardhea2 = "hardhea2" arcade_hardhead = "hardhead" arcade_hardhedb = "hardhead" arcade_hardyard = "hardyard" arcade_hardyd10 = "hardyard" arcade_hasamu = "hasamu" arcade_hatena = "hatena" arcade_hatris = "hatris" arcade_hatrisj = "hatris" arcade_hattrick = "hattrick" arcade_hayaosi1 = "hayaosi1" arcade_hbarrel = "hbarrel" arcade_hbarrelw = "hbarrel" arcade_hcastle = "hcastle" arcade_hcastlee = "hcastle" arcade_hcastlej = "hcastle" arcade_hcastlek = "hcastle" arcade_hcastleo = "hcastle" arcade_hcastljo = "hcastle" arcade_hcrash = "hcrash" arcade_hcrashc = "hcrash" arcade_hdrivaip = "hdrivair" arcade_hdrivair = "hdrivair" arcade_headon = "headon" arcade_headon1 = "headon" arcade_headon2 = "headon2" arcade_headon2s = "headon2" arcade_headonb = "headon" arcade_headonmz = "headon" arcade_headonn = "headon" arcade_headons = "headon" arcade_headonsa = "headon" arcade_heartatk = "heartatk" arcade_heatbrl = "heatbrl" arcade_heatbrlo = "heatbrl" arcade_heatbrlu = "heatbrl" arcade_heberpop = "heberpop" arcade_hedpanic = "hedpanic" arcade_hedpanica = "hedpanic" arcade_hedpanicf = "hedpanic" arcade_hedpanico = "hedpanic" arcade_heiankyo = "heiankyo" arcade_helifira = "helifire" arcade_helifire = "helifire" arcade_hellfir1 = "hellfire" arcade_hellfire = "hellfire" arcade_herbiedk = "huncholy" arcade_hero = "hero" arcade_herodk = "hero" arcade_herodku = "hero" arcade_heuksun = "heuksun" arcade_hexa = "hexa" arcade_hexion = "hexion" arcade_hexionb = "hexion" arcade_hexpool = "racknrol" arcade_hexpoola = "racknrol" arcade_hgkairak = "hgkairak" arcade_hharry = "hharry" arcade_hharryu = "hharry" arcade_hidnctch = "hidnctch" arcade_higemaru = "higemaru" arcade_hiimpact = "hiimpact" arcade_himesiki = "himesiki" arcade_hipoly = "trackfld" arcade_hippodrm = "hippodrm" arcade_hiryuken = "shangkid" arcade_hishouza = "fshark" arcade_histryma = "histryma" arcade_hitice = "hitice" arcade_hiticej = "hitice" arcade_hitme = "hitme" arcade_hitnmis2 = "hitnmiss" arcade_hitnmiss = "hitnmiss" arcade_hmcompm2 = "hmcompm2" arcade_hmcompmx = "bmcompmx" arcade_hnayayoi = "hnayayoi" arcade_hncholms = "huncholy" arcade_hnfubuki = "hnayayoi" arcade_hnkochou = "hanamai" arcade_hnoridur = "hnoridur" arcade_hoccer = "hoccer" arcade_hoccer2 = "hoccer" arcade_hocrash = "headon" arcade_hogalley = "hogalley" arcade_holeland = "holeland" arcade_holo = "holo" arcade_homerun = "homerun" arcade_homo = "goindol" arcade_honeydol = "honeydol" arcade_hook = "hook" arcade_hookj = "hook" arcade_hooku = "hook" arcade_hoops95 = "hoops96" arcade_hoops96 = "hoops96" arcade_hopmappy = "hopmappy" arcade_hopprobo = "hopprobo" arcade_horekid = "horekid" arcade_horekidb = "horekid" arcade_horizon = "horizon" arcade_horshoes = "horshoes" arcade_hotbubl = "bubl2000" arcade_hotbubla = "bubl2000" arcade_hotchase = "hotchase" arcade_hotdebut = "hotdebut" arcade_hotdogst = "hotdogst" arcade_hotgm4ev = "hotgm4ev" arcade_hotgmck = "hotgmck" arcade_hotgmck3 = "hotgmck3" arcade_hotgmcki = "hotgmcki" arcade_hotmind = "hotmind" arcade_hotpinbl = "hotpinbl" arcade_hotrod = "hotrod" arcade_hotshock = "hotshock" arcade_hotshockb = "hotshock" arcade_hotsmash = "hotsmash" arcade_hourouki = "hourouki" arcade_housemn2 = "housemn2" arcade_housemnq = "housemnq" arcade_hpolym84 = "hyperspt" arcade_hpuncher = "fround" arcade_hsf2 = "hsf2" arcade_hsf2a = "hsf2" arcade_hsf2d = "hsf2" arcade_hsf2da = "hsf2" arcade_hsf2j = "hsf2" arcade_hsf2j1 = "hsf2" arcade_hstenn10 = "hstennis" arcade_hstennis = "hstennis" arcade_htchctch = "htchctch" arcade_hthero = "footchmp" arcade_hthero93 = "cupfinal" arcade_hthero93u = "cupfinal" arcade_hthero94 = "intcup94" arcade_hthero95 = "pwrgoal" arcade_hthero95u = "pwrgoal" arcade_hthro95u = "pwrgoal" arcade_hunchbak = "hunchbak" arcade_hunchbkd = "hunchbak" arcade_hunchbkg = "hunchbak" arcade_hunchbks = "hunchbak" arcade_huncholy = "huncholy" arcade_hustle = "hustle" arcade_hustler = "hustler" arcade_hustlerb = "hustler" arcade_hvoltage = "hvoltage" arcade_hvymetal = "hvymetal" arcade_hvysmsh = "hvysmsh" arcade_hvysmsha = "hvysmsh" arcade_hvysmshj = "hvysmsh" arcade_hvyunit = "hvyunit" arcade_hvyunitj = "hvyunit" arcade_hvyunitjo = "hvyunit" arcade_hvyunitu = "hvyunit" arcade_hwchamp = "hwchamp" arcade_hwchampj = "hwchamp" arcade_hwchampjd = "hwchamp" arcade_hwrace = "hwrace" arcade_hydra = "hydra" arcade_hydrap = "hydra" arcade_hydrap2 = "hydra" arcade_hyhoo = "hyhoo" arcade_hyhoo2 = "hyhoo2" arcade_hyouban = "galkoku" arcade_hyperpac = "hyperpac" arcade_hyperpacb = "hyperpac" arcade_hyperpcb = "hyperpac" arcade_hyperspt = "hyperspt" arcade_hypersptb = "hyperspt" arcade_hyprdelj = "hyprduel" arcade_hyprduel = "hyprduel" arcade_hypreac2 = "hypreac2" arcade_hypreact = "hypreact" arcade_hyprolyb = "trackfld" arcade_hyprolym = "trackfld" arcade_hyprolymb = "trackfld" arcade_hyprolymba = "trackfld" arcade_hypsptsp = "88games" arcade_iceclimb = "iceclimb" arcade_iceclmbj = "iceclimb" arcade_iceclmrj = "iceclmrj" arcade_ichidant = "ichidant" arcade_ichidntb = "ichidant" arcade_ichidnte = "ichidant" arcade_idhimitu = "idhimitu" arcade_idolmj = "idolmj" arcade_idsoccer = "idsoccer" arcade_iemoto = "iemoto" arcade_iganinju = "kazan" arcade_igmo = "igmo" arcade_ikari = "ikari" arcade_ikari3 = "ikari3" arcade_ikari3j = "ikari3" arcade_ikari3k = "ikari3" arcade_ikari3nr = "ikari3" arcade_ikari3u = "ikari3" arcade_ikaria = "ikari" arcade_ikarijp = "ikari" arcade_ikarijpb = "ikari" arcade_ikarinc = "ikari" arcade_ikariram = "ikari" arcade_ikki = "ikki" arcade_imago = "imago" arcade_imagoa = "imago" arcade_imekura = "imekura" arcade_imgfight = "imgfight" arcade_imgfightj = "imgfight" arcade_imsorry = "imsorry" arcade_imsorryj = "imsorry" arcade_indyheat = "indyheat" arcade_indytem2 = "indytemp" arcade_indytem3 = "indytemp" arcade_indytem4 = "indytemp" arcade_indytemd = "indytemp" arcade_indytemp = "indytemp" arcade_inferno = "inferno" arcade_insector = "insector" arcade_insectx = "insectx" arcade_insectxj = "insectx" arcade_intcup94 = "intcup94" arcade_inthunt = "inthunt" arcade_inthuntu = "inthunt" arcade_intrepi2 = "intrepid" arcade_intrepid = "intrepid" arcade_intrepid2 = "intrepid" arcade_intrepidb = "intrepid" arcade_intrepidb2 = "intrepid" arcade_intrepidb3 = "intrepid" arcade_introdon = "introdon" arcade_inttoote = "jockeyc" arcade_inttootea = "jockeyc" arcade_inufuku = "inufuku" arcade_invad2ct = "invad2ct" arcade_invaddlx = "invadpt2" arcade_invaderl = "invaders" arcade_invaders = "invaders" arcade_invadpt2 = "invadpt2" arcade_invds = "invds" arcade_invho2 = "invho2" arcade_invinco = "invinco" arcade_invrvnga = "invrvnge" arcade_invrvnge = "invrvnge" arcade_inyourfa = "inyourfa" arcade_ipminvad = "ipminvad" arcade_iqblock = "iqblock" arcade_irobot = "irobot" arcade_ironclad = "ironclad" arcade_ironclado = "ironclad" arcade_ironhors = "ironhors" arcade_irrmaze = "irrmaze" arcade_isgsm = "isgsm" arcade_itaten = "itaten" arcade_ixion = "ixion" arcade_jack = "jack" arcade_jack2 = "jack" arcade_jack3 = "jack" arcade_jackal = "jackal" arcade_jackalbl = "jackal" arcade_jackalj = "jackal" arcade_jackalr = "jackal" arcade_jackrab2 = "jackrabt" arcade_jackrabs = "jackrabt" arcade_jackrabt = "jackrabt" arcade_jailbrek = "jailbrek" arcade_jailbrekb = "jailbrek" arcade_jajamaru = "jajamaru" arcade_janjans1 = "janjans1" arcade_janjans2 = "janjans2" arcade_janshin = "janshin" arcade_jchan = "jchan" arcade_jchan2 = "jchan2" arcade_jcross = "jcross" arcade_jdredd = "jdredd" arcade_jdreddb = "jdredd" arcade_jdreddp = "jdreddp" arcade_jedi = "jedi" arcade_jgakuen = "rvschool" arcade_jigkmgri = "bonzeadv" arcade_jigkmgria = "bonzeadv" arcade_jitsupro = "jitsupro" arcade_jjack = "jjack" arcade_jjparad2 = "jjparad2" arcade_jjparads = "jjparads" arcade_jjsquawk = "jjsquawk" arcade_jjsquawkb = "jjsquawk" arcade_jjsquawkb2 = "jjsquawk" arcade_jjsquawko = "jjsquawk" arcade_jleague = "svf" arcade_jockeyc = "jockeyc" arcade_jockeygp = "jockeygp" arcade_jockeygpa = "jockeygp" arcade_joemac = "cninja" arcade_joemacr = "joemacr" arcade_joemacra = "joemacr" arcade_joemacrj = "joemacr" arcade_jogakuen = "jogakuen" arcade_joinem = "joinem" arcade_jojo = "jojo" arcade_jojoba = "jojoba" arcade_jojoban = "jojoba" arcade_jojobane = "jojoba" arcade_jojobaner1 = "jojoba" arcade_jojobanr1 = "jojoba" arcade_jojobar1 = "jojoba" arcade_jojoj = "jojo" arcade_jojojr1 = "jojo" arcade_jojojr2 = "jojo" arcade_jojon = "jojo" arcade_jojonr1 = "jojo" arcade_jojonr2 = "jojo" arcade_jojor1 = "jojo" arcade_jojor2 = "jojo" arcade_josvolly = "josvolly" arcade_journey = "journey" arcade_joust = "joust" arcade_joust2 = "joust2" arcade_joustr = "joust" arcade_joustwr = "joust" arcade_joyfulr = "joyfulr" arcade_joyjoy = "joyjoy" arcade_joyman = "puckman" arcade_jpark = "jpark" arcade_jpopnics = "jpopnics" arcade_jrking = "dkongjr" arcade_jrpacman = "jrpacman" arcade_jrpacmanf = "jrpacman" arcade_jsk = "jsk" arcade_jspecter = "invaders" arcade_jspectr2 = "invaders" arcade_jt104 = "ninjakd2" arcade_juju = "toki" arcade_jujub = "toki" arcade_jujuba = "toki" arcade_jumpbug = "jumpbug" arcade_jumpbugb = "jumpbug" arcade_jumpcoas = "jumpcoas" arcade_jumpcoast = "jumpcoas" arcade_jumping = "rbisland" arcade_jumpinga = "rbisland" arcade_jumpingi = "rbisland" arcade_jumpkids = "jumpkids" arcade_jumpkun = "jumpkun" arcade_jumppop = "jumppop" arcade_jumppope = "jumppop" arcade_jumpshot = "jumpshot" arcade_jumpshotp = "jumpshot" arcade_jungleh = "junglek" arcade_junglek = "junglek" arcade_jungler = "jungler" arcade_junglers = "jungler" arcade_junglhbr = "junglek" arcade_junglkj2 = "junglek" arcade_junofrst = "junofrst" arcade_junofrstg = "junofrst" arcade_junofstg = "junofrst" arcade_jyangoku = "jyangoku" arcade_jyuohki = "altbeast" arcade_kabukikl = "kabukikl" arcade_kabukiz = "kabukiz" arcade_kabukizj = "kabukiz" arcade_kageki = "kageki" arcade_kagekih = "kageki" arcade_kagekij = "kageki" arcade_kagekiu = "kageki" arcade_kaguya = "kaguya" arcade_kaiserkj = "kaiserkn" arcade_kaiserkn = "kaiserkn" arcade_kaiserknj = "kaiserkn" arcade_kaitei = "kaitei" arcade_kaiteids = "inthunt" arcade_kaitein = "kaitei" arcade_kakumei = "kakumei" arcade_kakumei2 = "kakumei2" arcade_kamakazi3 = "galaxian" arcade_kamenrid = "kamenrid" arcade_kamikaze = "astinvad" arcade_kamikcab = "kamikcab" arcade_kanatuen = "kanatuen" arcade_kangaroa = "kangaroo" arcade_kangarob = "kangaroo" arcade_kangaroo = "kangaroo" arcade_kangarooa = "kangaroo" arcade_kangaroob = "kangaroo" arcade_kaos = "kaos" arcade_karatblu = "karatblz" arcade_karatblz = "karatblz" arcade_karatblza = "karatblz" arcade_karatblzj = "karatblz" arcade_karatblzu = "karatblz" arcade_karatedo = "kchamp" arcade_karatevs = "kchamp" arcade_karatour = "karatour" arcade_karatourj = "karatour" arcade_karianx = "karianx" arcade_karnov = "karnov" arcade_karnova = "karnov" arcade_karnovj = "karnov" arcade_karnovr = "karnovr" arcade_kazan = "kazan" arcade_kbash = "kbash" arcade_kbash2 = "kbash2" arcade_kbashk = "kbash" arcade_kchamp = "kchamp" arcade_kchampvs = "kchamp" arcade_kchampvs2 = "kchamp" arcade_keithlcy = "keithlcy" arcade_kengo = "ltswords" arcade_kengoa = "ltswords" arcade_kenseim = "kenseim" arcade_keroppi = "keroppi" arcade_keroppij = "keroppi" arcade_ket = "ket" arcade_ket1 = "ket" arcade_keta = "ket" arcade_ketarr = "ket" arcade_ketarr10 = "ket" arcade_ketarr15 = "ket" arcade_ketarr151 = "ket" arcade_ketarrf = "ket" arcade_ketarrs15 = "ket" arcade_ketarrs151 = "ket" arcade_ketb = "ket" arcade_ketbl = "ket" arcade_kf10thep = "kof2002" arcade_kf2k1pa = "kof2001" arcade_kf2k1pls = "kof2001" arcade_kf2k2mp = "kof2002" arcade_kf2k2mp2 = "kof2002" arcade_kf2k2pla = "kof2002" arcade_kf2k2plb = "kof2002" arcade_kf2k2plc = "kof2002" arcade_kf2k2pls = "kof2002" arcade_kf2k2ps2 = "kof2002" arcade_kf2k3bl = "kof2003" arcade_kf2k3bla = "kof2003" arcade_kf2k3pcb = "kf2k3pcb" arcade_kf2k3pl = "kof2003" arcade_kf2k3upl = "kof2003" arcade_kf2k4pls = "kof2002" arcade_kf2k5uni = "kof2002" arcade_kftgoal = "wpksoc" arcade_kick = "kick" arcade_kicka = "kick" arcade_kickboy = "kickboy" arcade_kicker = "kicker" arcade_kickgoal = "kickgoal" arcade_kicknrun = "kicknrun" arcade_kickoff = "kickoff" arcade_kickridr = "kickridr" arcade_kidniki = "kidniki" arcade_kidnikiu = "kidniki" arcade_kikaioh = "techromn" arcade_kikcubic = "kikcubic" arcade_kikcubicb = "kikcubic" arcade_kikikai = "kikikai" arcade_kikstart = "kikstart" arcade_killbld = "killbld" arcade_killbld104 = "killbld" arcade_killbldp = "killbldp" arcade_killcom = "killcom" arcade_kingbalj = "kingball" arcade_kingball = "kingball" arcade_kingballj = "kingball" arcade_kingdmgp = "kingdmgp" arcade_kingofb = "kingofb" arcade_kinst = "kinst" arcade_kinst2 = "kinst2" arcade_kirameki = "kirameki" arcade_kirarast = "kirarast" arcade_kittenk = "kittenk" arcade_kiwame = "kiwame" arcade_kiwames = "kiwames" arcade_kizuna = "kizuna" arcade_klax = "klax" arcade_klax2 = "klax" arcade_klax3 = "klax" arcade_klaxd = "klax" arcade_klaxj = "klax" arcade_klaxp1 = "klax" arcade_klaxp2 = "klax" arcade_knckhead = "knckhead" arcade_knckhedj = "knckhead" arcade_kncljoe = "kncljoe" arcade_kncljoea = "kncljoe" arcade_knights = "knights" arcade_knightsb = "knights" arcade_knightsb2 = "knights" arcade_knightsb3 = "knights" arcade_knightsb4 = "knights" arcade_knightsh = "knights" arcade_knightsh2 = "knights" arcade_knightsj = "knights" arcade_knightsja = "knights" arcade_knightsu = "knights" arcade_knockout = "triplep" arcade_kod = "kod" arcade_kodb = "kod" arcade_kodda = "kod" arcade_kodh = "kod" arcade_kodj = "kod" arcade_kodja = "kod" arcade_kodr1 = "kod" arcade_kodr2 = "kod" arcade_kodu = "kod" arcade_kodure = "kodure" arcade_kof10th = "kof2002" arcade_kof2000 = "kof2000" arcade_kof2000n = "kof2000" arcade_kof2000ps2 = "kof2000" arcade_kof2001 = "kof2001" arcade_kof2001h = "kof2001" arcade_kof2002 = "kof2002" arcade_kof2002b = "kof2002" arcade_kof2003 = "kof2003" arcade_kof2003d = "kof2003d" arcade_kof2003h = "kof2003" arcade_kof2k2omg = "kof2002" arcade_kof2k2omg8 = "kof2002" arcade_kof2k2omg9 = "kof2002" arcade_kof2k2omg9b = "kof2002" arcade_kof2k4se = "kof2002" arcade_kof94 = "kof94" arcade_kof95 = "kof95" arcade_kof95a = "kof95" arcade_kof95h = "kof95" arcade_kof96 = "kof96" arcade_kof96a = "kof96" arcade_kof96ae = "kof96" arcade_kof96ae20 = "kof96" arcade_kof96cn = "kof96" arcade_kof96ep = "kof96" arcade_kof96h = "kof96" arcade_kof97 = "kof97" arcade_kof97a = "kof97" arcade_kof97cn = "kof97" arcade_kof97h = "kof97" arcade_kof97k = "kof97" arcade_kof97oro = "kof97" arcade_kof97pla = "kof97" arcade_kof97pls = "kof97" arcade_kof97xt = "kof97" arcade_kof98 = "kof98" arcade_kof98a = "kof98" arcade_kof98ae = "kof98" arcade_kof98ae2016 = "kof98" arcade_kof98cb = "kof98" arcade_kof98h = "kof98" arcade_kof98k = "kof98" arcade_kof98ka = "kof98" arcade_kof98mix = "kof98" arcade_kof98n = "kof98" arcade_kof99 = "kof99" arcade_kof99a = "kof99" arcade_kof99ae = "kof99" arcade_kof99e = "kof99" arcade_kof99h = "kof99" arcade_kof99k = "kof99" arcade_kof99ka = "kof99" arcade_kof99n = "kof99" arcade_kof99p = "kof99" arcade_kog = "kof97" arcade_kogplus = "kof97" arcade_koikois2 = "koikois2" arcade_koinomp = "koinomp" arcade_konami88 = "88games" arcade_konamigt = "konamigt" arcade_kong = "kong" arcade_kontest = "kontest" arcade_kopunch = "kopunch" arcade_korinai = "korinai" arcade_korokoro = "korokoro" arcade_korosuke = "crush" arcade_koshien = "koshien" arcade_kotm = "kotm" arcade_kotm2 = "kotm2" arcade_kotm2a = "kotm2" arcade_kotm2p = "kotm2" arcade_kotmh = "kotm" arcade_kouyakyu = "kouyakyu" arcade_kov = "kov" arcade_kov111 = "kov" arcade_kov114 = "kov" arcade_kov115 = "kov" arcade_kov2 = "kov2" arcade_kov2100 = "kov2" arcade_kov2101 = "kov2" arcade_kov2102 = "kov2" arcade_kov2103 = "kov2" arcade_kov2104 = "kov2" arcade_kov2106 = "kov2" arcade_kov2p = "kov2p" arcade_kov2p202 = "kov2p" arcade_kov2p204 = "kov2p" arcade_kovassg = "kovshp" arcade_kovlsjb = "kovshp" arcade_kovlsjba = "kovshp" arcade_kovlsqh = "kovshp" arcade_kovlsqh2 = "kovshp" arcade_kovlsqh2d = "kovshp" arcade_kovlsqhd = "kovshp" arcade_kovplus = "kovplus" arcade_kovplusa = "kovplus" arcade_kovqhsgs = "kovsh" arcade_kovqhsgsa = "kovsh" arcade_kovsgqyz = "kovplus" arcade_kovsgqyza = "kovplus" arcade_kovsgqyzb = "kovplus" arcade_kovsgqyzc = "kovplus" arcade_kovsh = "kovsh" arcade_kovsh100 = "kovsh" arcade_kovsh101 = "kovsh" arcade_kovsh102 = "kovsh" arcade_kovsh103 = "kovsh" arcade_kovshb = "kovsh" arcade_kovshp = "kovshp" arcade_kovshpa = "kovshp" arcade_kovshxas = "kovshp" arcade_kovytzy = "kovytzy" arcade_kozure = "kozure" arcade_kram = "kram" arcade_kram2 = "kram" arcade_kram3 = "kram" arcade_kroozr = "kroozr" arcade_krull = "krull" arcade_krzybowl = "krzybowl" arcade_ksayakyu = "ksayakyu" arcade_ktiger = "twincobr" arcade_ktiger2 = "tcobra2" arcade_kuhga = "vaportra" arcade_kungfub = "kungfum" arcade_kungfub2 = "kungfum" arcade_kungfub3 = "kungfum" arcade_kungfud = "kungfum" arcade_kungfum = "kungfum" arcade_kungfumd = "kungfum" arcade_kungfut = "kungfut" arcade_kungfuta = "kungfut" arcade_kuniokub = "renegade" arcade_kuniokun = "renegade" arcade_kuniokunb = "renegade" arcade_kurikina = "kurikint" arcade_kurikinj = "kurikint" arcade_kurikint = "kurikint" arcade_kurikinta = "kurikint" arcade_kurikintj = "kurikint" arcade_kurikintu = "kurikint" arcade_kurikinu = "kurikint" arcade_kyros = "kyros" arcade_kyrosj = "kyros" arcade_kyukaidk = "kyukaidk" arcade_kyukaidko = "kyukaidk" arcade_kyukaido = "kyukaidk" arcade_kyustrkr = "kyustrkr" arcade_labyrunk = "tricktrp" arcade_labyrunr = "tricktrp" arcade_labyrunrk = "tricktrp" arcade_ladybug = "ladybug" arcade_ladybugb = "ladybug" arcade_ladybugb2 = "ladybug" arcade_ladybugg = "ladybug" arcade_ladyfrog = "ladyfrog" arcade_ladygolf = "ladygolf" arcade_ladykill = "ladykill" arcade_ladymstr = "ladymstr" arcade_ladymstr2 = "ladymstr" arcade_lagirl = "plgirls" arcade_lagunar = "lagunar" arcade_landbrk = "landbrk" arcade_landmakr = "landmakr" arcade_landmakrp = "landmakr" arcade_landmkrp = "landmakr" arcade_lans2004 = "shocktr2" arcade_laser = "spclaser" arcade_lasso = "lasso" arcade_lastblad = "lastblad" arcade_lastblada = "lastblad" arcade_lastbladh = "lastblad" arcade_lastbld2 = "lastbld2" arcade_lastbld2eh = "lastbld2" arcade_lastblda = "lastblad" arcade_lastday = "lastday" arcade_lastdaya = "lastday" arcade_lastduel = "lastduel" arcade_lastduelb = "lastduel" arcade_lastduelj = "lastduel" arcade_lastduelo = "lastduel" arcade_lastfero = "lastfort" arcade_lastfort = "lastfort" arcade_lastforte = "lastfort" arcade_lastfortea = "lastfort" arcade_lastfortg = "lastfort" arcade_lastfortk = "lastfort" arcade_lasthope = "lasthope" arcade_lastkm = "lastkm" arcade_lastmisn = "lastmisn" arcade_lastmisnj = "lastmisn" arcade_lastmisno = "lastmisn" arcade_lastmsnj = "lastmisn" arcade_lastmsno = "lastmisn" arcade_lastsold = "lastblad" arcade_lastsurv = "lastsurv" arcade_lastsurvd = "lastsurv" arcade_lazercmd = "lazercmd" arcade_lbowling = "lbowling" arcade_ldrun = "ldrun" arcade_ldrun2 = "ldrun2" arcade_ldrun3 = "ldrun3" arcade_ldrun3j = "ldrun3" arcade_ldrun3jp = "ldrun3" arcade_ldrun4 = "ldrun4" arcade_ldruna = "ldrun" arcade_le2 = "le2" arcade_le2u = "le2" arcade_leaguemn = "nbbatman" arcade_leds2011 = "leds2011" arcade_leds2011u = "leds2011" arcade_ledstorm = "madgear" arcade_legend = "legend" arcade_legendos = "legendos" arcade_legion = "legion" arcade_legionj = "legion" arcade_legionjb = "legion" arcade_legionna = "legionna" arcade_legionnu = "legionna" arcade_legiono = "legion" arcade_legofair = "chopper" arcade_lemmings = "lemmings" arcade_lemnangl = "lemnangl" arcade_leprechn = "leprechn" arcade_lethalen = "lethalen" arcade_lethaleneaa = "lethalen" arcade_lethaleneab = "lethalen" arcade_lethaleneae = "lethalen" arcade_lethalenj = "lethalen" arcade_lethalenua = "lethalen" arcade_lethalenub = "lethalen" arcade_lethalenux = "lethalen" arcade_lethalj = "lethalj" arcade_lethalth = "lethalth" arcade_levers = "levers" arcade_lghost = "lghost" arcade_lghostd = "lghost" arcade_lghostu = "lghost" arcade_lghostud = "lghost" arcade_lgtnfght = "lgtnfght" arcade_lgtnfghta = "lgtnfght" arcade_lgtnfghtu = "lgtnfght" arcade_lhcdb = "lhcdb" arcade_liberat2 = "liberatr" arcade_liberatb = "liberate" arcade_liberate = "liberate" arcade_liberatr = "liberatr" arcade_liblrabl = "liblrabl" arcade_lifefrce = "salamand" arcade_lifefrcej = "salamand" arcade_lifefrcj = "salamand" arcade_lightbr = "lightbr" arcade_lightbrj = "lightbr" arcade_liquidk = "liquidk" arcade_liquidku = "liquidk" arcade_lithero = "kidniki" arcade_livequiz = "livequiz" arcade_lizwiz = "lizwiz" arcade_lkage = "lkage" arcade_lkageb = "lkage" arcade_lkageb2 = "lkage" arcade_lkageb3 = "lkage" arcade_lkageo = "lkage" arcade_lkageoo = "lkage" arcade_llander = "llander" arcade_llander1 = "llander" arcade_lnc = "lnc" arcade_lockload = "lockload" arcade_lockonph = "lockonph" arcade_locoboot = "locomotn" arcade_locomotn = "locomotn" arcade_loderdfa = "loderndf" arcade_loderndf = "loderndf" arcade_loderndfa = "loderndf" arcade_loffire = "loffire" arcade_loffired = "loffire" arcade_loffirej = "loffire" arcade_loffirejd = "loffire" arcade_loffireu = "loffire" arcade_loffireud = "loffire" arcade_logger = "logger" arcade_logicpr2 = "logicpr2" arcade_logicpro = "logicpro" arcade_loht = "loht" arcade_lohtb = "loht" arcade_lohtb2 = "loht" arcade_lohtj = "loht" arcade_lomakai = "lomakai" arcade_looper = "changes" arcade_looping = "looping" arcade_loopinga = "looping" arcade_lordgun = "lordgun" arcade_lordofk = "astyanax" arcade_losttmbh = "losttomb" arcade_losttomb = "losttomb" arcade_losttombh = "losttomb" arcade_lostwrld = "forgottn" arcade_lostwrldo = "forgottn" arcade_lotlot = "lotlot" arcade_lottofun = "lottofun" arcade_loverboy = "loverboy" arcade_lrescue = "lrescue" arcade_lresort = "lresort" arcade_lresortp = "lresort" arcade_lsasquad = "lsasquad" arcade_lstduela = "lastduel" arcade_lstduelb = "lastduel" arcade_ltcasin2 = "ltcasin2" arcade_ltcasino = "ltcasino" arcade_ltorb1 = "ltorb1" arcade_ltswords = "ltswords" arcade_luckywld = "luckywld" arcade_luckywldj = "luckywld" arcade_luctoday = "luctoday" arcade_lunarba1 = "gravitar" arcade_lunarbat = "gravitar" arcade_lupin3 = "lupin3" arcade_lvgirl94 = "lvgirl94" arcade_lwings = "lwings" arcade_lwings2 = "lwings" arcade_lwingsb = "lwings" arcade_lwingsj = "lwings" arcade_lwingsja = "lwings" arcade_lwingsjp = "lwings" arcade_m4 = "m4" arcade_m660 = "m660" arcade_m660b = "m660" arcade_m660j = "m660" arcade_m79amb = "m79amb" arcade_mace = "mace" arcade_mach3 = "mach3" arcade_mach9 = "vulgus" arcade_machbrkr = "machbrkr" arcade_machomou = "machomou" arcade_machridj = "machridr" arcade_machridr = "machridr" arcade_macross = "macross" arcade_macross2 = "macross2" arcade_macross2g = "macross2" arcade_macross2k = "macross2" arcade_macrossp = "macrossp" arcade_madalien = "madalien" arcade_madcrash = "madcrash" arcade_madcrush = "madcrash" arcade_maddonna = "maddonna" arcade_maddonnb = "maddonna" arcade_madgear = "madgear" arcade_madgearj = "madgear" arcade_madmotor = "madmotor" arcade_madshark = "madshark" arcade_magdrop = "chainrec" arcade_magdrop2 = "magdrop2" arcade_magdrop3 = "magdrop3" arcade_magdropp = "chainrec" arcade_magicbub = "magicbub" arcade_magicbuba = "magicbub" arcade_magicbubb = "magicbub" arcade_magix = "magix" arcade_magixb = "magix" arcade_maglord = "maglord" arcade_maglordh = "maglord" arcade_magmax = "magmax" arcade_magspot = "magspot" arcade_magspot2 = "magspot2" arcade_magworm = "centiped" arcade_mahmajn = "mahmajn" arcade_mahmajn2 = "mahmajn2" arcade_mahoudai = "sstriker" arcade_mahretsu = "mahretsu" arcade_maiko = "maiko" arcade_mainev2p = "mainevt" arcade_mainevt = "mainevt" arcade_mainevt2p = "mainevt" arcade_mainevto = "mainevt" arcade_mainsnk = "mainsnk" arcade_majest12 = "ssi" arcade_majest12j = "ssi" arcade_majest12u = "ssi" arcade_majs101b = "majs101b" arcade_majtitl2 = "majtitl2" arcade_majtitl2a = "majtitl2" arcade_majtitl2b = "majtitl2" arcade_majtitl2j = "majtitl2" arcade_majtitle = "majtitle" arcade_majtitlej = "majtitle" arcade_majuu = "devilw" arcade_makaiden = "lomakai" arcade_makaimuc = "gng" arcade_makaimug = "gng" arcade_makaimur = "gng" arcade_makaimurc = "gng" arcade_makaimurg = "gng" arcade_maketrax = "crush" arcade_maketrxb = "crush" arcade_makyosen = "gondo" arcade_malzak = "malzak" arcade_mangchi = "mangchi" arcade_manhatan = "jailbrek" arcade_maniach = "maniach" arcade_maniach2 = "maniach" arcade_maniacsp = "maniacsq" arcade_maniacsq = "maniacsq" arcade_maniacsqa = "maniacsq" arcade_maniacsqu = "maniacsq" arcade_manybloc = "manybloc" arcade_mappy = "mappy" arcade_mappyj = "mappy" arcade_marble = "marble" arcade_marble2 = "marble" arcade_marble3 = "marble" arcade_marble4 = "marble" arcade_marineb = "marineb" arcade_marinedt = "marinedt" arcade_mariner = "mariner" arcade_mario = "mario" arcade_marioe = "mario" arcade_mariof = "mario" arcade_marioj = "mario" arcade_mariojp = "mario" arcade_marioo = "mario" arcade_markham = "markham" arcade_mars = "mars" arcade_martmast = "martmast" arcade_martmastc = "martmast" arcade_martmastc102 = "martmast" arcade_martmastc103 = "martmast" arcade_martmasttw = "martmast" arcade_maruchan = "maruchan" arcade_marukin = "marukin" arcade_marukodq = "marukodq" arcade_marvins = "marvins" arcade_marvland = "marvland" arcade_marvlandj = "marvland" arcade_marvlanj = "marvland" arcade_masao = "mario" arcade_mastboyo = "mastboyo" arcade_masterw = "masterw" arcade_masterwj = "masterw" arcade_masterwu = "masterw" arcade_mastkin = "mastkin" arcade_matchit = "sichuan2" arcade_matchit2 = "matchit2" arcade_matmania = "matmania" arcade_matrim = "matrim" arcade_matrimbl = "matrim" arcade_mausuke = "mausuke" arcade_maxf_102 = "maxforce" arcade_maxforce = "maxforce" arcade_maxrpm = "maxrpm" arcade_maya = "maya" arcade_mayday = "mayday" arcade_maydaya = "mayday" arcade_maydayb = "mayday" arcade_mayhem = "mayhem" arcade_mayumi = "mayumi" arcade_maze = "maze" arcade_mazerbla = "mazerbla" arcade_mazinger = "mazinger" arcade_mazingerj = "mazinger" arcade_mblkjack = "hitme" arcade_mbombdje = "mbombrd" arcade_mbomberj = "slammast" arcade_mbombrd = "mbombrd" arcade_mbombrda = "mbombrd" arcade_mbombrdh = "mbombrd" arcade_mbombrdj = "mbombrd" arcade_mbombrdu = "mbombrd" arcade_mbrush = "crush" arcade_mcatadv = "mcatadv" arcade_mcatadvj = "mcatadv" arcade_mchampdx = "mchampdx" arcade_mchampdxa = "mchampdx" arcade_mcnpshnt = "mcnpshnt" arcade_mcontest = "mcontest" arcade_md_12in1 = "md_12in1" arcade_md_13mahjan = "md_13mahjan" arcade_md_16ton = "md_16ton" arcade_md_16tongnk = "md_16ton" arcade_md_16zhan = "md_16zhan" arcade_md_2020bb = "md_2020bb" arcade_md_2020bbj = "md_2020bb" arcade_md_2psymmac = "md_2psymmac" arcade_md_3in1fwt = "md_3in1fwt" arcade_md_3in1rmb = "md_3in1rmb" arcade_md_3ninja = "md_3ninja" arcade_md_4in1pb = "md_4in1pb" arcade_md_688atsub = "md_688atsub" arcade_md_6pak = "md_6pak" arcade_md_aaahhrm = "md_aaahhrm" arcade_md_aaahhrmu = "md_aaahhrm" arcade_md_aaharima = "md_aaharima" arcade_md_aburner2 = "md_aburner2" arcade_md_aburner2j = "md_aburner2" arcade_md_action52 = "md_action52" arcade_md_action52a = "md_action52" arcade_md_addfam = "md_addfam" arcade_md_addfamp1 = "md_addfam" arcade_md_addfamp2 = "md_addfam" arcade_md_addfamv = "md_addfamv" arcade_md_advbatr = "md_advbatr" arcade_md_advbatrp01 = "md_advbatr" arcade_md_advbatrp02 = "md_advbatr" arcade_md_advbatrp03 = "md_advbatr" arcade_md_advbatrp04 = "md_advbatr" arcade_md_advbatrp05 = "md_advbatr" arcade_md_advbatrp06 = "md_advbatr" arcade_md_advbatrp07 = "md_advbatr" arcade_md_advbatrp08 = "md_advbatr" arcade_md_advbatrp09 = "md_advbatr" arcade_md_advbatrp10 = "md_advbatr" arcade_md_advbatrp11 = "md_advbatr" arcade_md_advbatrp12 = "md_advbatr" arcade_md_advbatru = "md_advbatr" arcade_md_advdaisn = "md_advdaisn" arcade_md_adveboy = "md_adveboy" arcade_md_aero = "md_aero" arcade_md_aero2 = "md_aero2" arcade_md_aero2u = "md_aero2" arcade_md_aerobiz = "md_aerobiz" arcade_md_aerobizs = "md_aerobizs" arcade_md_aeroblst = "md_airbustr" arcade_md_aerop = "md_aero" arcade_md_aerou = "md_aero" arcade_md_agassi = "md_agassi" arcade_md_agassiu = "md_agassi" arcade_md_agassiup = "md_agassi" arcade_md_airbustr = "md_airbustr" arcade_md_airdiver = "md_airdiver" arcade_md_airdiverj = "md_airdiver" arcade_md_airmanag = "md_aerobiz" arcade_md_airmang2 = "md_aerobizs" arcade_md_akumajo = "md_cvania" arcade_md_aladdin = "md_aladdin" arcade_md_aladdin2 = "md_aladdin2" arcade_md_aladdinj = "md_aladdin" arcade_md_aladdinu = "md_aladdin" arcade_md_aladdinup = "md_aladdin" arcade_md_alexkidd = "md_alexkidd" arcade_md_alexkidd1 = "md_alexkidd" arcade_md_alexkiddj = "md_alexkidd" arcade_md_alexkiddk = "md_alexkidd" arcade_md_alexkiddu = "md_alexkidd" arcade_md_alien3 = "md_alien3" arcade_md_alien3a = "md_alien3" arcade_md_aliensol = "md_aliensol" arcade_md_aliensolj = "md_aliensol" arcade_md_alisiad = "md_alisiad" arcade_md_alisiadj = "md_alisiad" arcade_md_alisiadu = "md_alisiad" arcade_md_altbeast = "md_altbeast" arcade_md_amaznten = "md_amaznten" arcade_md_amerglad = "md_amerglad" arcade_md_andretti = "md_andretti" arcade_md_animania = "md_animania" arcade_md_animaniau = "md_animania" arcade_md_anotherw = "md_anotherw" arcade_md_aof = "md_aof" arcade_md_aofp = "md_aof" arcade_md_aofu = "md_aof" arcade_md_aqrenk = "md_aqrenk" arcade_md_aquagame = "md_aquagame" arcade_md_ar = "md_ar" arcade_md_arcadecl = "md_arcadecl" arcade_md_arcadegh = "md_arcadegh" arcade_md_arcadeghu = "md_arcadegh" arcade_md_archrivl = "md_archrivl" arcade_md_arcus = "md_arcus" arcade_md_arcusj = "md_arcus" arcade_md_aresshmd = "md_aresshmd" arcade_md_ariel = "md_ariel" arcade_md_arnoldp = "md_arnoldp" arcade_md_arrow = "md_arrow" arcade_md_arrowp = "md_arrow" arcade_md_artalive = "md_artalive" arcade_md_arttool = "md_arttool" arcade_md_asscreed = "md_dlair" arcade_md_astergre = "md_astergre" arcade_md_astergreu = "md_astergre" arcade_md_asterpg = "md_asterpg" arcade_md_asterpgp = "md_asterpg" arcade_md_astorm = "md_astorm" arcade_md_atomrobo = "md_atomrobo" arcade_md_atomroboj = "md_atomrobo" arcade_md_atomrun = "md_atomrun" arcade_md_atomrunu = "md_atomrun" arcade_md_atptour = "md_atptour" arcade_md_atptourp1 = "md_atptour" arcade_md_atptourp2 = "md_atptour" arcade_md_atptourp3 = "md_atptour" arcade_md_atptourp4 = "md_atptour" arcade_md_atptourp5 = "md_atptour" arcade_md_atptourp6 = "md_atptour" arcade_md_atptourp7 = "md_atptour" arcade_md_atptouru = "md_atptour" arcade_md_austrarl = "md_austrarl" arcade_md_avatar = "md_jimpower" arcade_md_awepossm = "md_awepossm" arcade_md_awepossmp = "md_awepossm" arcade_md_aworg = "md_aworg" arcade_md_awspro = "md_awspro" arcade_md_babyboom = "md_babyboom" arcade_md_babyboom1 = "md_babyboom" arcade_md_babyboom2 = "md_babyboom" arcade_md_babyd = "md_babyd" arcade_md_babydo = "md_babyd" arcade_md_backtof3 = "md_backtof3" arcade_md_backtof3u = "md_backtof3" arcade_md_badomen = "md_devilish" arcade_md_bahamuts = "md_bahamuts" arcade_md_balljack = "md_balljack" arcade_md_ballz3d = "md_ballz3d" arcade_md_barbiesm = "md_barbiesm" arcade_md_barbvac = "md_barbvac" arcade_md_barkley = "md_barkley" arcade_md_barkley2 = "md_barkley2" arcade_md_barkley2p = "md_barkley2" arcade_md_barney = "md_barney" arcade_md_bartnigh = "md_bartnigh" arcade_md_bartvssm = "md_bartvssm" arcade_md_bartvssm1 = "md_bartvssm" arcade_md_barver = "md_barver" arcade_md_bassmc = "md_bassmc" arcade_md_bassmpro = "md_bassmpro" arcade_md_batman = "md_batman" arcade_md_batmanf = "md_batmanf" arcade_md_batmanj = "md_batman" arcade_md_batmanrj = "md_batmanrj" arcade_md_batmanrn = "md_batmanrn" arcade_md_batmanu = "md_batman" arcade_md_battlems = "md_battlems" arcade_md_battlesq = "md_battlesq" arcade_md_battlyui = "md_battlyui" arcade_md_battlyuie = "md_battlyui" arcade_md_bcdverifier = "md_bcdverifier" arcade_md_beast = "md_beast" arcade_md_beast2 = "md_beast2" arcade_md_beastbal = "md_beastbal" arcade_md_beastj = "md_beast" arcade_md_beastw = "md_beastw" arcade_md_beastwj = "md_beastw" arcade_md_beauty = "md_beauty" arcade_md_beautyrb = "md_beautyrb" arcade_md_beavis = "md_beavis" arcade_md_beavisu = "md_beavis" arcade_md_beavisup = "md_beavis" arcade_md_ben10 = "md_ben10" arcade_md_berens = "md_berens" arcade_md_berensp01 = "md_berens" arcade_md_berensp02 = "md_berens" arcade_md_berensp03 = "md_berens" arcade_md_berensp04 = "md_berens" arcade_md_berensp05 = "md_berens" arcade_md_berensp06 = "md_berens" arcade_md_berensp07 = "md_berens" arcade_md_berensp08 = "md_berens" arcade_md_berensp09 = "md_berens" arcade_md_berensp10 = "md_berens" arcade_md_berensp11 = "md_berens" arcade_md_berensp12 = "md_berens" arcade_md_berensp13 = "md_berens" arcade_md_berensp14 = "md_berens" arcade_md_berensp15 = "md_berens" arcade_md_berensp16 = "md_berens" arcade_md_berensp17 = "md_berens" arcade_md_berensp18 = "md_berens" arcade_md_berensp19 = "md_berens" arcade_md_berensp20 = "md_berens" arcade_md_bestof = "md_bestof" arcade_md_bestofp = "md_bestof" arcade_md_beyoasis = "md_thor" arcade_md_beyoasisp = "md_thor" arcade_md_beyondzt = "md_beyondzt" arcade_md_bibleadv = "md_bibleadv" arcade_md_bigfd = "md_bigfd" arcade_md_bighurt = "md_bighurt" arcade_md_billwl95 = "md_billwl95" arcade_md_billwlsh = "md_billwlsh" arcade_md_bimini = "md_bimini" arcade_md_biohazrb = "md_biohazrb" arcade_md_biohazrbp = "md_biohazrb" arcade_md_bk2p = "md_sor2" arcade_md_bk3 = "md_sor3" arcade_md_bk3p = "md_sor3" arcade_md_bladeven = "md_bladeven" arcade_md_blockb = "md_blockb" arcade_md_blockout = "md_blockout" arcade_md_bloodsht = "md_bloodsht" arcade_md_bluealma = "md_bluealma" arcade_md_bmaster2 = "md_bmaster2" arcade_md_bmaster2p = "md_bmaster2" arcade_md_bnzabros = "md_bnzabros" arcade_md_bnzabros1 = "md_bnzabros" arcade_md_bnzabrosu = "md_bnzabros" arcade_md_bob = "md_bob" arcade_md_bobc206 = "md_bobc206" arcade_md_bobp = "md_bob" arcade_md_bodyco = "md_bodyco" arcade_md_bodycob = "md_bodyco" arcade_md_bodycop = "md_bodyco" arcade_md_bodycop2 = "md_bodyco" arcade_md_bodycop3 = "md_bodyco" arcade_md_bodycop4 = "md_bodyco" arcade_md_bodycop5 = "md_bodyco" arcade_md_bomber = "md_bomber" arcade_md_bomboy = "md_bomboy" arcade_md_bonkers = "md_bonkers" arcade_md_bonkersp1 = "md_bonkers" arcade_md_bonkersp2 = "md_bonkers" arcade_md_bonkersp3 = "md_bonkers" arcade_md_bonkersp4 = "md_bonkers" arcade_md_bonkersp5 = "md_bonkers" arcade_md_booger = "md_booger" arcade_md_boogeru = "md_booger" arcade_md_boogie = "md_champbwl" arcade_md_boxinglg = "md_boxinglg" arcade_md_bretth = "md_bretth" arcade_md_brianl96 = "md_brianl96" arcade_md_brianl96a = "md_brianl96" arcade_md_brianlar = "md_brianlar" arcade_md_brianlar1 = "md_brianlar" arcade_md_brutal = "md_brutal" arcade_md_brutalu = "md_brutal" arcade_md_bsteam3 = "md_tecmocup" arcade_md_btech = "md_btech" arcade_md_btlmania = "md_troubsht" arcade_md_btlmanid = "md_btlmanid" arcade_md_btlmanide = "md_btlmanid" arcade_md_btoads = "md_btoads" arcade_md_btoadsdd = "md_btoadsdd" arcade_md_bubba = "md_bubba" arcade_md_bubbap = "md_bubba" arcade_md_bubbau = "md_bubba" arcade_md_bubblesq = "md_bubblesq" arcade_md_bubblesqu = "md_bubblesq" arcade_md_bubsy = "md_bubsy" arcade_md_bubsy2 = "md_bubsy2" arcade_md_buckrog = "md_buckrog" arcade_md_budokan = "md_budokan" arcade_md_budokanu = "md_budokan" arcade_md_bugsbun = "md_bugsbun" arcade_md_bugsbunu = "md_bugsbun" arcade_md_bugslife = "md_bugslife" arcade_md_bugslifea = "md_bugslife" arcade_md_bullvsbl = "md_bullvsbl" arcade_md_bullvsblj = "md_bullvsbl" arcade_md_bullvsblj1 = "md_bullvsbl" arcade_md_bullvsla = "md_bullvsla" arcade_md_bullvslaj = "md_bullvsla" arcade_md_burnforc = "md_burnforc" arcade_md_burnforcj = "md_burnforc" arcade_md_burnforcu = "md_burnforc" arcade_md_cadash = "md_cadash" arcade_md_caesar = "md_warrior" arcade_md_caesar2 = "md_warrior2" arcade_md_caesars = "md_caesars" arcade_md_cal50 = "md_cal50" arcade_md_calgames = "md_calgames" arcade_md_calripkn = "md_calripkn" arcade_md_captaven = "md_captaven" arcade_md_captavenu = "md_captaven" arcade_md_captavenup = "md_captaven" arcade_md_captlang = "md_havoc" arcade_md_captplan = "md_captplan" arcade_md_captplanu = "md_captplan" arcade_md_carmntim = "md_carmntim" arcade_md_carmntimb = "md_carmntim" arcade_md_carmnwld = "md_carmnwld" arcade_md_carmnwldb = "md_carmnwld" arcade_md_cars = "md_sskid" arcade_md_cars2 = "md_cproam" arcade_md_castlill = "md_castlill" arcade_md_castlillj = "md_castlill" arcade_md_centur = "md_centur" arcade_md_cfodder = "md_cfodder" arcade_md_chakan = "md_chakan" arcade_md_champbwl = "md_champbwl" arcade_md_champool = "md_champool" arcade_md_champwcs = "md_champwcs" arcade_md_chaosen2 = "md_chaosen2" arcade_md_chaoseng = "md_chaoseng" arcade_md_chase = "md_chase" arcade_md_chasehq2 = "md_chasehq2" arcade_md_chavez2 = "md_boxinglg" arcade_md_cheese = "md_cheese" arcade_md_chelnov = "md_atomrun" arcade_md_chess = "md_chess" arcade_md_chessa = "md_chess" arcade_md_chessb = "md_chess" arcade_md_chester = "md_chester" arcade_md_chesterw = "md_chesterw" arcade_md_chibim = "md_chibim" arcade_md_chichi = "md_chichi" arcade_md_chiki = "md_chiki" arcade_md_chikij = "md_chiki" arcade_md_chinesec = "md_chinesec" arcade_md_chinf3 = "md_chinf3" arcade_md_chinf3a = "md_chinf3" arcade_md_chuckrck = "md_chuckrck" arcade_md_chuckrcku = "md_chuckrck" arcade_md_chukrck2 = "md_chukrck2" arcade_md_chukrck2j = "md_chukrck2" arcade_md_chukrck2u = "md_chukrck2" arcade_md_chukrck2up = "md_chukrck2" arcade_md_cjfuweng = "md_cjfuweng" arcade_md_classicc = "md_classicc" arcade_md_clayfght = "md_clayfght" arcade_md_clayfghtu = "md_clayfght" arcade_md_cliffh = "md_cliffh" arcade_md_cliffhp = "md_cliffh" arcade_md_cliffhu = "md_cliffh" arcade_md_clue = "md_clue" arcade_md_coachk = "md_coachk" arcade_md_colleg96 = "md_colleg96" arcade_md_colleg97 = "md_colleg97" arcade_md_collnc = "md_collnc" arcade_md_collnc2 = "md_collnc2" arcade_md_collncp01 = "md_collnc" arcade_md_collncp02 = "md_collnc" arcade_md_collncp03 = "md_collnc" arcade_md_collncp04 = "md_collnc" arcade_md_collncp05 = "md_collnc" arcade_md_collncp06 = "md_collnc" arcade_md_collncp07 = "md_collnc" arcade_md_collncp08 = "md_collnc" arcade_md_collncp09 = "md_collnc" arcade_md_collncp10 = "md_collnc" arcade_md_collncp11 = "md_collnc" arcade_md_collncp12 = "md_collnc" arcade_md_collncp13 = "md_collnc" arcade_md_collncp14 = "md_collnc" arcade_md_collncp15 = "md_collnc" arcade_md_collncp16 = "md_collnc" arcade_md_collncp17 = "md_collnc" arcade_md_collncp18 = "md_collnc" arcade_md_collncp19 = "md_collnc" arcade_md_collslam = "md_collslam" arcade_md_columns = "md_columns" arcade_md_columns1 = "md_columns" arcade_md_columns3 = "md_columns3" arcade_md_columns3j = "md_columns3" arcade_md_combat = "md_combat" arcade_md_combatca = "md_combatca" arcade_md_comix = "md_comix" arcade_md_comixj = "md_comix" arcade_md_comixkp = "md_comix" arcade_md_comixp = "md_comix" arcade_md_comixsc = "md_comix" arcade_md_comixu = "md_comix" arcade_md_comixup = "md_comix" arcade_md_comixup01 = "md_comix" arcade_md_comixup02 = "md_comix" arcade_md_comixup03 = "md_comix" arcade_md_comixup04 = "md_comix" arcade_md_comixup05 = "md_comix" arcade_md_comixup06 = "md_comix" arcade_md_comixup07 = "md_comix" arcade_md_comixup08 = "md_comix" arcade_md_comixup09 = "md_comix" arcade_md_comixup10 = "md_comix" arcade_md_commands = "md_commands" arcade_md_commconq = "md_commconq" arcade_md_congo = "md_congo" arcade_md_contra = "md_contra" arcade_md_contraj = "md_contra" arcade_md_coolspot = "md_coolspot" arcade_md_coolspotj = "md_coolspot" arcade_md_coolspotu = "md_coolspot" arcade_md_coolspotup = "md_coolspot" arcade_md_corporat = "md_corporat" arcade_md_cosmic = "md_cosmic" arcade_md_cperils = "md_cperils" arcade_md_cproam = "md_cproam" arcade_md_crash = "md_zero" arcade_md_crashdum = "md_crashdum" arcade_md_crashdump = "md_crashdum" arcade_md_crayon = "md_crayon" arcade_md_crkdown = "md_crkdown" arcade_md_crkdown1 = "md_crkdown" arcade_md_crkdownu = "md_crkdown" arcade_md_crudeb = "md_twocrude" arcade_md_crueball = "md_crueball" arcade_md_crueballj = "md_crueball" arcade_md_crusader = "md_soleil" arcade_md_crying = "md_biohazrb" arcade_md_crystlpt = "md_crystlpt" arcade_md_crystlptp01 = "md_crystlpt" arcade_md_crystlptp02 = "md_crystlpt" arcade_md_crystlptp03 = "md_crystlpt" arcade_md_crystlptp04 = "md_crystlpt" arcade_md_crystlptp05 = "md_crystlpt" arcade_md_crystlptp06 = "md_crystlpt" arcade_md_crystlptp07 = "md_crystlpt" arcade_md_crystlptp08 = "md_crystlpt" arcade_md_crystlptp09 = "md_crystlpt" arcade_md_crystlptp10 = "md_crystlpt" arcade_md_crystlptp11 = "md_crystlpt" arcade_md_crystlptp12 = "md_crystlpt" arcade_md_crystlptp13 = "md_crystlpt" arcade_md_crystlptp14 = "md_crystlpt" arcade_md_crystlptp15 = "md_crystlpt" arcade_md_cstrike = "md_lethalen" arcade_md_curse = "md_curse" arcade_md_cutiesuz = "md_cutiesuz" arcade_md_cutthr = "md_cutthr" arcade_md_cutthrp = "md_cutthr" arcade_md_cvania = "md_cvania" arcade_md_cvaniap = "md_cvania" arcade_md_cvaniau = "md_cvania" arcade_md_cyberbal = "md_cyberbal" arcade_md_cybercop = "md_corporat" arcade_md_cyborgj = "md_cyborgj" arcade_md_cyborgjp = "md_cyborgj" arcade_md_daffy = "md_daffy" arcade_md_daffyp = "md_daffy" arcade_md_dahnagb = "md_dahnam" arcade_md_dahnam = "md_dahnam" arcade_md_dahnamk = "md_dahnam" arcade_md_daikok2 = "md_newhoriz" arcade_md_daikokai = "md_unchartd" arcade_md_daimakai = "md_ghouls" arcade_md_dangseed = "md_dangseed" arcade_md_darius2 = "md_sagaia" arcade_md_darkcast = "md_darkcast" arcade_md_darwin = "md_darwin" arcade_md_dashdes = "md_dashdes" arcade_md_dashdesp1 = "md_dashdes" arcade_md_dashdesp2 = "md_dashdes" arcade_md_daviscp2 = "md_daviscp2" arcade_md_daviscp2a = "md_daviscp2" arcade_md_daviscup = "md_daviscup" arcade_md_daviscupa = "md_daviscup" arcade_md_dazexmas = "md_dazexmas" arcade_md_dazexmasp = "md_dazexmas" arcade_md_dbz = "md_dbz" arcade_md_dbzf = "md_dbz" arcade_md_ddanpei = "md_ddanpei" arcade_md_ddragon = "md_ddragon" arcade_md_ddragon2 = "md_ddragon2" arcade_md_ddragon3 = "md_ddragon3" arcade_md_ddragon5 = "md_ddragon5" arcade_md_ddribble = "md_hyperdnk" arcade_md_ddwares = "md_ddwares" arcade_md_deadlymv = "md_deadlymv" arcade_md_deathcal = "md_deathcal" arcade_md_deathdl = "md_deathdl" arcade_md_deathret = "md_deathret" arcade_md_decapatt = "md_decapatt" arcade_md_deerhunt = "md_deerhunt" arcade_md_demoman = "md_demoman" arcade_md_demomanp = "md_demoman" arcade_md_desrtdem = "md_desrtdem" arcade_md_desrtdemp1 = "md_desrtdem" arcade_md_desrtdemp2 = "md_desrtdem" arcade_md_desrtdemp3 = "md_desrtdem" arcade_md_desrtdemp4 = "md_desrtdem" arcade_md_desrtdemp5 = "md_desrtdem" arcade_md_desrtdemp6 = "md_desrtdem" arcade_md_desrtdemp7 = "md_desrtdem" arcade_md_desrtdemp8 = "md_desrtdem" arcade_md_desrtdemp9 = "md_desrtdem" arcade_md_devilish = "md_devilish" arcade_md_devlcrsh = "md_dfury" arcade_md_dfury = "md_dfury" arcade_md_dhead = "md_dhead" arcade_md_dheade = "md_dhead" arcade_md_dheadj = "md_dhead" arcade_md_dheadjp = "md_dhead" arcade_md_dheadp1 = "md_dhead" arcade_md_dheadp2 = "md_dhead" arcade_md_dheadp3 = "md_dhead" arcade_md_diablo = "md_fatallab" arcade_md_dialqo = "md_dialqo" arcade_md_dicktr = "md_dicktr" arcade_md_dickvitl = "md_dickvitl" arcade_md_dinho98 = "md_issdx" arcade_md_dinodini = "md_dinodini" arcade_md_dinohire = "md_dinohire" arcade_md_dinohirep1 = "md_dinohire" arcade_md_dinohirep2 = "md_dinohire" arcade_md_dinohirep3 = "md_dinohire" arcade_md_dinoland = "md_dinoland" arcade_md_dinolandj = "md_dinoland" arcade_md_dinotale = "md_dinotale" arcade_md_disneycl = "md_disneycl" arcade_md_ditkapf = "md_ditkapf" arcade_md_ditkapf1 = "md_ditkapf" arcade_md_divine = "md_divine" arcade_md_djboy = "md_djboy" arcade_md_djboyj = "md_djboy" arcade_md_djboyu = "md_djboy" arcade_md_dlair = "md_dlair" arcade_md_dokidoki = "md_dokidoki" arcade_md_dokidokignk = "md_dokidoki" arcade_md_domino = "md_domino" arcade_md_dominus = "md_dominus" arcade_md_dongguri = "md_drrobotn" arcade_md_doomtrop = "md_doomtrop" arcade_md_doraemon = "md_doraemon" arcade_md_doublecl = "md_doublecl" arcade_md_dracula = "md_dracula" arcade_md_draculau = "md_dracula" arcade_md_dragnrev = "md_dragnrev" arcade_md_dragnrevj = "md_dragnrev" arcade_md_dragon = "md_dragon" arcade_md_dragonu = "md_dragon" arcade_md_draxos = "md_riskyw" arcade_md_dreamteam = "md_teamusa" arcade_md_drrobotn = "md_drrobotn" arcade_md_drrobotnu = "md_drrobotn" arcade_md_drrobotnup = "md_drrobotn" arcade_md_drsc = "md_drsc" arcade_md_drscj = "md_drsc" arcade_md_dslayed = "md_dslayed" arcade_md_dslayed2 = "md_dslayed2" arcade_md_dstrike = "md_dstrike" arcade_md_dstrikej = "md_dstrike" arcade_md_dukenk3d = "md_dukenk3d" arcade_md_dukenk3da = "md_dukenk3d" arcade_md_dune2 = "md_dune2" arcade_md_dune2g = "md_dune2" arcade_md_duneu = "md_dune2" arcade_md_dynabr = "md_dynabr" arcade_md_dynabr2 = "md_dynabr2" arcade_md_dynabr2sp = "md_dynabr2" arcade_md_dynduke = "md_dynduke" arcade_md_dynduke1 = "md_dynduke" arcade_md_dynoblaz = "md_dynoblaz" arcade_md_eahockey = "md_eahockey" arcade_md_eahockeyj = "md_eahockey" arcade_md_earnest = "md_earnest" arcade_md_earthdef = "md_earthdef" arcade_md_easports = "md_easports" arcade_md_ecco = "md_ecco" arcade_md_ecco2 = "md_ecco2" arcade_md_ecco2j = "md_ecco2" arcade_md_ecco2p = "md_ecco2" arcade_md_ecco2p1 = "md_ecco2" arcade_md_ecco2p2 = "md_ecco2" arcade_md_ecco2px11 = "md_ecco2" arcade_md_ecco2u = "md_ecco2" arcade_md_eccoj = "md_ecco" arcade_md_eccojr = "md_eccojr" arcade_md_eccojr1 = "md_eccojr" arcade_md_ejim = "md_ejim" arcade_md_ejim2 = "md_ejim2" arcade_md_ejim2u = "md_ejim2" arcade_md_ejimu = "md_ejim" arcade_md_elemast = "md_elemast" arcade_md_elemastj = "md_elemast" arcade_md_elimdown = "md_elimdown" arcade_md_elit95 = "md_elit95" arcade_md_elit96 = "md_elit96" arcade_md_elviento = "md_elviento" arcade_md_elvientoj = "md_elviento" arcade_md_empsteel = "md_empsteel" arcade_md_espnbb = "md_espnbb" arcade_md_espnhn = "md_espnhn" arcade_md_espnhnp = "md_espnhn" arcade_md_espnnfl = "md_espnnfl" arcade_md_espnnflp = "md_espnnfl" arcade_md_espnsped = "md_espnsped" arcade_md_espnspedp = "md_espnsped" arcade_md_eswat = "md_eswat" arcade_md_eswatj = "md_eswat" arcade_md_eternalc = "md_eternalc" arcade_md_eternalcj = "md_eternalc" arcade_md_eternalcjp = "md_eternalc" arcade_md_eternalcp = "md_eternalc" arcade_md_eternalcu = "md_eternalc" arcade_md_Euro2004 = "md_issdx" arcade_md_euroclub = "md_euroclub" arcade_md_eurosens = "md_opeurope" arcade_md_evander = "md_evander" arcade_md_excelart = "md_excelart" arcade_md_exile = "md_exile" arcade_md_exilej = "md_exile" arcade_md_exmutant = "md_exmutant" arcade_md_exodus = "md_exodus" arcade_md_exosquad = "md_exosquad" arcade_md_exosquadu = "md_exosquad" arcade_md_exosquadup = "md_exosquad" arcade_md_exranza = "md_rangerx" arcade_md_exranzap = "md_rangerx" arcade_md_f1 = "md_f1" arcade_md_f117 = "md_f117" arcade_md_f117j = "md_f117" arcade_md_f15se2 = "md_f15se2" arcade_md_f15se2u = "md_f15se2" arcade_md_f15se2up = "md_f15se2" arcade_md_f1circus = "md_f1circus" arcade_md_f1heromd = "md_f1heromd" arcade_md_f1wc = "md_f1wc" arcade_md_f1wcp = "md_f1wc" arcade_md_f22 = "md_f22" arcade_md_f22a = "md_f22" arcade_md_f22j = "md_f22" arcade_md_f22p = "md_f22" arcade_md_faerytal = "md_faerytal" arcade_md_famfeud = "md_famfeud" arcade_md_fantasia = "md_fantasia" arcade_md_fantasia1 = "md_fantasia" arcade_md_fantdizz = "md_fantdizz" arcade_md_fantdizz1 = "md_fantdizz" arcade_md_fastest1 = "md_fastest1" arcade_md_fastfur5 = "md_combatca" arcade_md_fatallab = "md_fatallab" arcade_md_fatalrew = "md_fatalrew" arcade_md_fatalsmarties = "md_fatalsmarties" arcade_md_fatfury = "md_fatfury" arcade_md_fatfury2 = "md_fatfury2" arcade_md_fatfuryu = "md_fatfury" arcade_md_fatman = "md_slaughtr" arcade_md_fengkuan = "md_fengkuan" arcade_md_fengshen = "md_fengshen" arcade_md_fengshena = "md_fengshen" arcade_md_ferias = "md_ferias" arcade_md_ferrari = "md_ferrari" arcade_md_ferrarip = "md_ferrari" arcade_md_ferrariu = "md_ferrari" arcade_md_feverpit = "md_feverpit" arcade_md_fidodido = "md_fidodido" arcade_md_fifa = "md_fifa" arcade_md_fifa2k = "md_fifa97" arcade_md_fifa2k10 = "md_fifa" arcade_md_fifa2k2 = "md_wcs2" arcade_md_fifa2k3 = "md_fifa95" arcade_md_fifa95 = "md_fifa95" arcade_md_fifa95k = "md_fifa95" arcade_md_fifa96 = "md_fifa96" arcade_md_fifa97 = "md_fifa97" arcade_md_fifa98 = "md_fifa98" arcade_md_fifa99 = "md_fifa96" arcade_md_fightmas = "md_fightmas" arcade_md_fightmasj = "md_fightmas" arcade_md_finalb = "md_jbdougko" arcade_md_firemust = "md_firemust" arcade_md_fireshrk = "md_fireshrk" arcade_md_fireshrku = "md_fireshrk" arcade_md_fireshrku1 = "md_fireshrk" arcade_md_fixitfelixjr = "md_fixitfelixjr" arcade_md_flashb = "md_flashb" arcade_md_flashbj = "md_flashb" arcade_md_flashbu = "md_flashb" arcade_md_flashbu1 = "md_flashb" arcade_md_flashp = "md_flashp" arcade_md_flicky = "md_flicky" arcade_md_flink = "md_flink" arcade_md_flint = "md_flint" arcade_md_flintj = "md_flint" arcade_md_flintu = "md_flint" arcade_md_flux = "md_flux" arcade_md_foreman = "md_foreman" arcade_md_forgottn = "md_forgottn" arcade_md_forgottn1 = "md_forgottn" arcade_md_formula1 = "md_f1" arcade_md_franken = "md_franken" arcade_md_frogger = "md_frogger" arcade_md_funcar = "md_funcar" arcade_md_funngame = "md_funngame" arcade_md_funngameu = "md_funngame" arcade_md_funnywld = "md_funnywld" arcade_md_futbol = "md_fifa95" arcade_md_fzone = "md_fzone" arcade_md_gadget = "md_gadget" arcade_md_gaiares = "md_gaiares" arcade_md_galahad = "md_galahad" arcade_md_gambler = "md_gambler" arcade_md_gamenko = "md_gamenko" arcade_md_gameto = "md_gameto" arcade_md_garfield = "md_garfield" arcade_md_gargoyle = "md_gargoyle" arcade_md_garou = "md_fatfury" arcade_md_garou2 = "md_fatfury2" arcade_md_gauntlt4 = "md_gauntlt4" arcade_md_gauntlt4a = "md_gauntlt4" arcade_md_gauntlt4j = "md_gauntlt4" arcade_md_gemfire = "md_gemfire" arcade_md_gems = "md_gems" arcade_md_genchaos = "md_genchaos" arcade_md_genchaosj = "md_genchaos" arcade_md_genchohi = "md_genghis2" arcade_md_genelost = "md_genelost" arcade_md_genghis2 = "md_genghis2" arcade_md_georgeko = "md_georgeko" arcade_md_georgekou = "md_georgeko" arcade_md_gforce2 = "md_gforce2" arcade_md_gforce2a = "md_gforce2" arcade_md_ggenie = "md_ggenie" arcade_md_ggenie1 = "md_ggenie" arcade_md_gground = "md_gground" arcade_md_gground1p = "md_gground" arcade_md_ghostbst = "md_ghostbst" arcade_md_ghostbst1 = "md_ghostbst" arcade_md_ghouls = "md_ghouls" arcade_md_ghouls1 = "md_ghouls" arcade_md_ghw = "md_ghw" arcade_md_ghwj = "md_ghw" arcade_md_ghwu = "md_ghw" arcade_md_gleylanc = "md_gleylanc" arcade_md_gleylance = "md_gleylanc" arcade_md_gloc = "md_gloc" arcade_md_glocp = "md_gloc" arcade_md_gods = "md_gods" arcade_md_godsj = "md_gods" arcade_md_godsu = "md_gods" arcade_md_godsup = "md_gods" arcade_md_golden10 = "md_golden10" arcade_md_goldnax2 = "md_goldnax2" arcade_md_goldnax2p = "md_goldnax2" arcade_md_goldnax3 = "md_goldnax3" arcade_md_goldnax3nc = "md_goldnax3" arcade_md_goldnaxe = "md_goldnaxe" arcade_md_goldnaxe1 = "md_goldnaxe" arcade_md_gomora = "md_gomora" arcade_md_goofy = "md_goofy" arcade_md_gouketsu = "md_gouketsu" arcade_md_granada = "md_granada" arcade_md_granada1 = "md_granada" arcade_md_grandsl = "md_grandsl" arcade_md_grandslj = "md_grandsl" arcade_md_greatcirj = "md_mickeycm" arcade_md_greendog = "md_greendog" arcade_md_grindst = "md_grindst" arcade_md_growl = "md_growl" arcade_md_gt5 = "md_funcar" arcade_md_gunship = "md_gunship" arcade_md_gunstar = "md_gunstar" arcade_md_gunstarj = "md_gunstar" arcade_md_gunstarjs = "md_gunstar" arcade_md_gunstaru = "md_gunstar" arcade_md_gynoug = "md_gynoug" arcade_md_gynougj = "md_gynoug" arcade_md_hardbal3 = "md_hardbal3" arcade_md_hardball = "md_hardball" arcade_md_hardbl94 = "md_hardbl94" arcade_md_hardbl95 = "md_hardbl95" arcade_md_harddriv = "md_harddriv" arcade_md_haunting = "md_haunting" arcade_md_havoc = "md_havoc" arcade_md_havocu = "md_havoc" arcade_md_headon = "md_feverpit" arcade_md_heavynov = "md_heavynov" arcade_md_heitao = "md_heitao" arcade_md_hellfire = "md_hellfire" arcade_md_hellfirej = "md_hellfire" arcade_md_hellfireu = "md_hellfire" arcade_md_hercules = "md_dahnam" arcade_md_herculs2 = "md_herculs2" arcade_md_herzog = "md_herzog" arcade_md_herzogj = "md_herzog" arcade_md_hitice = "md_hitice" arcade_md_hokuto = "md_lastbtle" arcade_md_homea = "md_homea" arcade_md_homea2 = "md_homea2" arcade_md_homeap = "md_homea" arcade_md_hook = "md_hook" arcade_md_hooku = "md_hook" arcade_md_hpotter = "md_hpotter" arcade_md_hpotter2 = "md_mickmack" arcade_md_huamul = "md_huamul" arcade_md_huanle = "md_huanle" arcade_md_hulk = "md_hulk" arcade_md_humans = "md_humans" arcade_md_hurrican = "md_hurrican" arcade_md_hvyunit = "md_hvyunit" arcade_md_hybridf = "md_hybridf" arcade_md_hybridfp = "md_hybridf" arcade_md_hyokkohj = "md_hyokkohj" arcade_md_hyperdnk = "md_hyperdnk" arcade_md_hyperdnkj = "md_hyperdnk" arcade_md_hyperdnkjp = "md_hyperdnk" arcade_md_hyperm = "md_hyperm" arcade_md_hypermgnk = "md_hyperm" arcade_md_iceage = "md_awepossm" arcade_md_iceage3 = "md_chuckrck" arcade_md_iceage4 = "md_chuckrck" arcade_md_ichir = "md_ichir" arcade_md_imgitt = "md_imgitt" arcade_md_immortal = "md_immortal" arcade_md_immortalj = "md_immortal" arcade_md_incredib = "md_tick" arcade_md_indycrus = "md_indycrus" arcade_md_indycrusu = "md_indycrus" arcade_md_indyrus = "md_rickdang" arcade_md_insectx = "md_insectx" arcade_md_insectxj = "md_insectx" arcade_md_instch = "md_instch" arcade_md_instchp1 = "md_instch" arcade_md_instchp2 = "md_instch" arcade_md_instchp3 = "md_instch" arcade_md_instchp4 = "md_instch" arcade_md_instchp5 = "md_instch" arcade_md_instchp6 = "md_instch" arcade_md_instchp7 = "md_instch" arcade_md_instchp8 = "md_instch" arcade_md_instchp9 = "md_instch" arcade_md_intrugby = "md_intrugby" arcade_md_iraqwar = "md_iraqwar" arcade_md_iraqwara = "md_iraqwar" arcade_md_ishido = "md_ishido" arcade_md_issdx = "md_issdx" arcade_md_issdxrne = "md_issdx" arcade_md_itcame = "md_itcame" arcade_md_itchy = "md_itchy" arcade_md_izzyqst = "md_izzyqst" arcade_md_jammit = "md_jammit" arcade_md_janout = "md_janout" arcade_md_jantei = "md_jantei" arcade_md_jb007 = "md_jb007" arcade_md_jb007j = "md_jb007" arcade_md_jb007u = "md_jb007" arcade_md_jbdougko = "md_jbdougko" arcade_md_jdredd = "md_jdredd" arcade_md_jdreddp1 = "md_jdredd" arcade_md_jdreddp2 = "md_jdredd" arcade_md_jellyboy = "md_jellyboy" arcade_md_jennifct = "md_grandsl" arcade_md_jeopardd = "md_jeopardd" arcade_md_jeopards = "md_jeopards" arcade_md_jeopardy = "md_jeopardy" arcade_md_jewelms = "md_jewelms" arcade_md_jewelmsj = "md_jewelms" arcade_md_jimmywws = "md_jimmywws" arcade_md_jimpower = "md_jimpower" arcade_md_jiujim = "md_jiujim" arcade_md_jlcs = "md_euroclub" arcade_md_jleague = "md_jleague" arcade_md_jlps = "md_jlps" arcade_md_jlps2 = "md_jlps2" arcade_md_jlpsa = "md_jlps" arcade_md_jlpsp = "md_jlpsp" arcade_md_joemac = "md_joemac" arcade_md_joemont = "md_joemont" arcade_md_joemont2 = "md_joemont2" arcade_md_joemont2a = "md_joemont2" arcade_md_jordanb = "md_jordanb" arcade_md_jordanb1 = "md_jordanb" arcade_md_jordanbj = "md_jordanb" arcade_md_joshua = "md_joshua" arcade_md_jpark = "md_jpark" arcade_md_jparkj = "md_jpark" arcade_md_jparkre = "md_jparkre" arcade_md_jparkrep1 = "md_jparkre" arcade_md_jparkrep2 = "md_jparkre" arcade_md_jparkrep3 = "md_jparkre" arcade_md_jparkrep4 = "md_jparkre" arcade_md_jparkrep5 = "md_jparkre" arcade_md_jparkrep6 = "md_jparkre" arcade_md_jparkrep7 = "md_jparkre" arcade_md_jparkrep8 = "md_jparkre" arcade_md_jparkrep9 = "md_jparkre" arcade_md_jparku = "md_jpark" arcade_md_jparkup = "md_jpark" arcade_md_jpond = "md_jpond" arcade_md_jpond3 = "md_jpond3" arcade_md_jstrike = "md_jstrike" arcade_md_jstrikej = "md_jstrike" arcade_md_jstrikep = "md_jstrike" arcade_md_junction = "md_junction" arcade_md_jungle = "md_jungle" arcade_md_jungleu = "md_jungle" arcade_md_junker = "md_outr2019" arcade_md_juuouki = "md_altbeast" arcade_md_juuouki1 = "md_altbeast" arcade_md_kageki = "md_kageki" arcade_md_kagekij = "md_kageki" arcade_md_kawasaki = "md_kawasaki" arcade_md_kawasakip = "md_kawasaki" arcade_md_kfpanda2 = "md_brutal" arcade_md_kickbox = "md_bestof" arcade_md_kickoff3 = "md_kickoff3" arcade_md_kidcham = "md_kidcham" arcade_md_kidchamj = "md_kidcham" arcade_md_killshow = "md_fatalrew" arcade_md_kingcol = "md_kingcol" arcade_md_kingcole = "md_kingcol" arcade_md_kingsal = "md_kingsal" arcade_md_kingsalj = "md_kingsal" arcade_md_kingsbty = "md_kingsbty" arcade_md_kishiden = "md_kishiden" arcade_md_kissshot = "md_kissshot" arcade_md_klax = "md_klax" arcade_md_klaxj = "md_klax" arcade_md_knucklp = "md_knucklp" arcade_md_kof2k = "md_kof98" arcade_md_kof98 = "md_kof98" arcade_md_kof98a = "md_kof98" arcade_md_kof99 = "md_kof99" arcade_md_kof99a = "md_kof99" arcade_md_kolobok = "md_kolobok" arcade_md_koteteik = "md_empsteel" arcade_md_kotm = "md_kotm" arcade_md_kotm2 = "md_kotm2" arcade_md_kotmj = "md_kotm" arcade_md_kotmu = "md_kotm" arcade_md_krusty = "md_krusty" arcade_md_krusty1 = "md_krusty" arcade_md_ktesonic = "md_sonic" arcade_md_ktiger = "md_twincobr" arcade_md_kujaku2 = "md_mystdef" arcade_md_kuuga = "md_vaportr" arcade_md_kuzyaeo = "md_chukrck2" arcade_md_kuzyamd = "md_chukrck2" arcade_md_kyukaidk = "md_kyukaidk" arcade_md_labdeath = "md_fatallab" arcade_md_labdeathgnk = "md_fatallab" arcade_md_lakers = "md_lakers" arcade_md_landstlk = "md_landstlk" arcade_md_landstlkf = "md_landstlk" arcade_md_landstlkg = "md_landstlk" arcade_md_landstlkj = "md_landstlk" arcade_md_landstlku = "md_landstlk" arcade_md_landstlkup = "md_landstlk" arcade_md_langris2 = "md_langris2" arcade_md_langris2a = "md_langris2" arcade_md_langris2b = "md_langris2" arcade_md_langris2e = "md_langris2" arcade_md_langriss = "md_warsong" arcade_md_laruss95 = "md_laruss95" arcade_md_larussa = "md_larussa" arcade_md_lasorda = "md_suprleag" arcade_md_lastact = "md_lastact" arcade_md_lastbtle = "md_lastbtle" arcade_md_lawnmowr = "md_lawnmowr" arcade_md_le2 = "md_le2" arcade_md_le2u = "md_le2" arcade_md_legobatman = "md_legobatman" arcade_md_lemming2 = "md_lemming2" arcade_md_lemming2u = "md_lemming2" arcade_md_lemmings = "md_lemmings" arcade_md_lemmingsju = "md_lemmings" arcade_md_lemmingsju1 = "md_lemmings" arcade_md_lethalen = "md_lethalen" arcade_md_lethalenj = "md_lethalen" arcade_md_lethalenu = "md_lethalen" arcade_md_leynos = "md_trgearth" arcade_md_lhx = "md_lhx" arcade_md_lhxj = "md_lhx" arcade_md_liberty = "md_liberty" arcade_md_lightc = "md_lightc" arcade_md_lightcj = "md_lightc" arcade_md_lightck = "md_lightc" arcade_md_lightcp = "md_lightc" arcade_md_lightcu = "md_lightc" arcade_md_lightfor = "md_tf4" arcade_md_lionkin2 = "md_lionkin2" arcade_md_lionkin2a = "md_lionkin2" arcade_md_lionkin3 = "md_lionkin3" arcade_md_lionkin3a = "md_lionkin3" arcade_md_lionkin3b = "md_lionkin3" arcade_md_lionking = "md_lionking" arcade_md_lobo = "md_lobo" arcade_md_long = "md_long" arcade_md_lordmon = "md_lordmon" arcade_md_lostvik = "md_lostvik" arcade_md_lostvikp = "md_lostvik" arcade_md_lostviku = "md_lostvik" arcade_md_lostwrld = "md_lostwrld" arcade_md_lotr = "md_strmlord" arcade_md_lotrgs = "md_lotrgs" arcade_md_lotus2 = "md_lotus2" arcade_md_lotus2p = "md_lotus2" arcade_md_lotust = "md_lotust" arcade_md_m1abrams = "md_m1abrams" arcade_md_madagopp = "md_magichat" arcade_md_madagsc3 = "md_dinotale" arcade_md_madd93ce = "md_madd93ce" arcade_md_madden = "md_madden" arcade_md_madden92 = "md_madden92" arcade_md_madden93 = "md_madden93" arcade_md_madden94 = "md_madden94" arcade_md_madden95 = "md_madden95" arcade_md_madden96 = "md_madden96" arcade_md_madden97 = "md_madden97" arcade_md_madden98 = "md_madden98" arcade_md_maddenj = "md_madden" arcade_md_madoumon = "md_madoumon" arcade_md_mafia = "md_dicktr" arcade_md_magichat = "md_magichat" arcade_md_magist16 = "md_magist16" arcade_md_mahjongc = "md_mahjongc" arcade_md_majian = "md_majian" arcade_md_majiana = "md_majian" arcade_md_mamono = "md_mamono" arcade_md_manover = "md_manover" arcade_md_mansell = "md_mansell" arcade_md_mansellu = "md_mansell" arcade_md_maouren = "md_mysticf" arcade_md_maqiao = "md_maqiao" arcade_md_marble = "md_marble" arcade_md_mario3 = "md_mario3" arcade_md_mario4 = "md_mario4" arcade_md_mariolh = "md_mariolh" arcade_md_marko = "md_marko" arcade_md_markop = "md_marko" arcade_md_markou = "md_marko" arcade_md_marsup = "md_marsup" arcade_md_marsupu = "md_marsup" arcade_md_marvland = "md_talmit" arcade_md_marvlandj = "md_talmit" arcade_md_masiaka = "md_masiaka" arcade_md_masterm = "md_masterm" arcade_md_mastermj = "md_masterm" arcade_md_maten = "md_maten" arcade_md_mathblst = "md_mathblst" arcade_md_mauimall = "md_mauimall" arcade_md_mauimallb = "md_mauimall" arcade_md_mazinsaga = "md_mazinwar" arcade_md_mazinsagj = "md_mazinwar" arcade_md_mazinsagu = "md_mazinwar" arcade_md_mazinwar = "md_mazinwar" arcade_md_mbubble = "md_mbubble" arcade_md_mcdonald = "md_mcdonald" arcade_md_mcdonaldj = "md_mcdonald" arcade_md_mcdonaldjp = "md_mcdonald" arcade_md_mcdonaldu = "md_mcdonald" arcade_md_medalc = "md_medalc" arcade_md_megabm8 = "md_megabm8" arcade_md_megabomb = "md_megabomb" arcade_md_megabombu = "md_megabomb" arcade_md_megaga1 = "md_megaga1" arcade_md_megaga10 = "md_megaga10" arcade_md_megaga2 = "md_megaga2" arcade_md_megaga3 = "md_megaga3" arcade_md_megaga61 = "md_megaga61" arcade_md_megaga62 = "md_megaga62" arcade_md_megaga63 = "md_megaga63" arcade_md_megalo = "md_megalo" arcade_md_megalo1 = "md_megalo" arcade_md_megalof = "md_megalo" arcade_md_megaloj = "md_megalo" arcade_md_megaman = "md_megaman" arcade_md_megamind = "md_megamind" arcade_md_meganet = "md_meganet" arcade_md_meganser = "md_meganser" arcade_md_megapanl = "md_megapanl" arcade_md_megaqbert11 = "md_megaqbert11" arcade_md_megaswiv = "md_megaswiv" arcade_md_megaswivb = "md_megaswiv" arcade_md_megatrax = "md_quadchal" arcade_md_megaturr = "md_megaturr" arcade_md_megaturru = "md_megaturr" arcade_md_menacer = "md_menacer" arcade_md_menghu = "md_menghu" arcade_md_mercs = "md_mercs" arcade_md_metalfng = "md_metalfng" arcade_md_mevo = "md_sonic" arcade_md_mfpool = "md_mfpool" arcade_md_mgs = "md_crkdown" arcade_md_mickeycm = "md_mickeycm" arcade_md_mickeyuc = "md_mickeyuc" arcade_md_mickmack = "md_mickmack" arcade_md_mickmacku = "md_mickmack" arcade_md_mickmackup = "md_mickmack" arcade_md_microm96 = "md_microm96" arcade_md_microm96a = "md_microm96" arcade_md_micromac = "md_micromac" arcade_md_micromaca = "md_micromac" arcade_md_micromacb = "md_micromac" arcade_md_micromacc = "md_micromac" arcade_md_micromc2 = "md_micromc2" arcade_md_micromc2a = "md_micromc2" arcade_md_micromm = "md_micromm" arcade_md_midres = "md_midres" arcade_md_midresj = "md_midres" arcade_md_mig29 = "md_mig29" arcade_md_mig29j = "md_mig29" arcade_md_mig29u = "md_mig29" arcade_md_mightmag = "md_mightmag" arcade_md_mightmax = "md_mightmax" arcade_md_mightmaxu = "md_mightmax" arcade_md_mightmg3 = "md_mightmg3" arcade_md_miniplanets = "md_miniplanets" arcade_md_miracle9 = "md_miracle9" arcade_md_miraclep = "md_miraclep" arcade_md_mk = "md_mk" arcade_md_mk2 = "md_mk2" arcade_md_mk2wu = "md_mk2" arcade_md_mk3 = "md_mk3" arcade_md_mk3m = "md_mk3" arcade_md_mk3u = "md_mk3" arcade_md_mk5 = "md_mk5" arcade_md_mk5a = "md_mk5" arcade_md_mka = "md_mk" arcade_md_mkr = "md_umk3t" arcade_md_mlbpa = "md_mlbpa" arcade_md_mlfootb = "md_mlfootb" arcade_md_mlfootbj = "md_mlfootb" arcade_md_mlhockey = "md_mlhockey" arcade_md_mmania = "md_mmania" arcade_md_mmaniaj = "md_mmania" arcade_md_mmaniau = "md_mmania" arcade_md_mmaniaup = "md_mmania" arcade_md_mmpr = "md_mmpr" arcade_md_mmprfe = "md_mmprfe" arcade_md_mmprp1 = "md_mmpr" arcade_md_mmprp2 = "md_mmpr" arcade_md_mmprp3 = "md_mmpr" arcade_md_mmprp4 = "md_mmpr" arcade_md_mmprp5 = "md_mmpr" arcade_md_mmprp6 = "md_mmpr" arcade_md_mmprtm = "md_mmprtm" arcade_md_mmprtmp1 = "md_mmprtm" arcade_md_mmprtmp2 = "md_mmprtm" arcade_md_mmprtmp3 = "md_mmprtm" arcade_md_mmprtmp4 = "md_mmprtm" arcade_md_mmprtmu = "md_mmprtm" arcade_md_mmpru = "md_mmpr" arcade_md_monopoly = "md_monopoly" arcade_md_monopolyp = "md_monopoly" arcade_md_monstinc = "md_decapatt" arcade_md_mrnutz = "md_mrnutz" arcade_md_mrnutz2 = "md_mrnutz2" arcade_md_msb = "md_msb" arcade_md_msbp01 = "md_msb" arcade_md_msbp02 = "md_msb" arcade_md_msbp03 = "md_msb" arcade_md_msbp04 = "md_msb" arcade_md_msbp05 = "md_msb" arcade_md_msbp06 = "md_msb" arcade_md_msbp07 = "md_msb" arcade_md_msbp08 = "md_msb" arcade_md_msbp09 = "md_msb" arcade_md_msbp10 = "md_msb" arcade_md_msbp11 = "md_msb" arcade_md_msbp12 = "md_msb" arcade_md_msonichd = "md_sonic" arcade_md_mspacman = "md_mspacman" arcade_md_mspacmanpir = "md_mspacman" arcade_md_mtaruru = "md_mtaruru" arcade_md_muhammad = "md_muhammad" arcade_md_muhammadu = "md_muhammad" arcade_md_muhammadup = "md_muhammad" arcade_md_musha = "md_musha" arcade_md_mushaj = "md_musha" arcade_md_mvpbb = "md_mvpbb" arcade_md_mwalk = "md_mwalk" arcade_md_mwalk1 = "md_mwalk" arcade_md_mweapon = "md_mweapon" arcade_md_mworld4 = "md_mworld4" arcade_md_mworld4eng = "md_mworld4" arcade_md_mworld4eng2 = "md_mworld4" arcade_md_mystdef = "md_mystdef" arcade_md_mystdefa = "md_mystdef" arcade_md_mysticf = "md_mysticf" arcade_md_n3dgaugu = "md_n3dgaugu" arcade_md_n3dgdevi = "md_n3dgdevi" arcade_md_n3dgpebb = "md_pebble" arcade_md_n3dgwaia = "md_n3dgwaia" arcade_md_nadia = "md_nadia" arcade_md_nadiae = "md_nadia" arcade_md_nakaf1gp = "md_nakaf1gp" arcade_md_nakaf1sl = "md_nakaf1sl" arcade_md_narnia3 = "md_galahad" arcade_md_naruto = "md_3ninja" arcade_md_nba2k = "md_nbaact" arcade_md_nba2k5 = "md_nbaact95" arcade_md_nbaact = "md_nbaact" arcade_md_nbaact95 = "md_nbaact95" arcade_md_nbaact95p01 = "md_nbaact95" arcade_md_nbaact95p02 = "md_nbaact95" arcade_md_nbaact95p03 = "md_nbaact95" arcade_md_nbaact95p04 = "md_nbaact95" arcade_md_nbaact95p05 = "md_nbaact95" arcade_md_nbaact95p06 = "md_nbaact95" arcade_md_nbaact95p07 = "md_nbaact95" arcade_md_nbaact95p08 = "md_nbaact95" arcade_md_nbaact95p09 = "md_nbaact95" arcade_md_nbaact95p10 = "md_nbaact95" arcade_md_nbaact95p11 = "md_nbaact95" arcade_md_nbaact95p12 = "md_nbaact95" arcade_md_nbaact95p13 = "md_nbaact95" arcade_md_nbaact95p14 = "md_nbaact95" arcade_md_nbaact95p15 = "md_nbaact95" arcade_md_nbaact95p16 = "md_nbaact95" arcade_md_nbaact95p17 = "md_nbaact95" arcade_md_nbaact95p18 = "md_nbaact95" arcade_md_nbaact95p19 = "md_nbaact95" arcade_md_nbaact95p20 = "md_nbaact95" arcade_md_nbaact95p21 = "md_nbaact95" arcade_md_nbaact95p22 = "md_nbaact95" arcade_md_nbaact95p23 = "md_nbaact95" arcade_md_nbaact95p24 = "md_nbaact95" arcade_md_nbaact95p25 = "md_nbaact95" arcade_md_nbaactp1 = "md_nbaact" arcade_md_nbaactp2 = "md_nbaact" arcade_md_nbaactp3 = "md_nbaact" arcade_md_nbaallst = "md_nbaallst" arcade_md_nbahang = "md_nbahang" arcade_md_nbahangu = "md_nbahang" arcade_md_nbajam = "md_nbajam" arcade_md_nbajam1 = "md_nbajam" arcade_md_nbajamj = "md_nbajam" arcade_md_nbajamjp = "md_nbajam" arcade_md_nbajamte = "md_nbajamte" arcade_md_nbajamtef = "md_nbajamte" arcade_md_nbaliv95 = "md_nbaliv95" arcade_md_nbaliv95k = "md_nbaliv95" arcade_md_nbaliv96 = "md_nbaliv96" arcade_md_nbaliv97 = "md_nbaliv97" arcade_md_nbaliv98 = "md_nbaliv98" arcade_md_nbapro94 = "md_nbapro94" arcade_md_nbashow = "md_nbashow" arcade_md_nbashowp = "md_nbashow" arcade_md_ncaabask = "md_ncaabask" arcade_md_ncaafoot = "md_ncaafoot" arcade_md_ncirc = "md_ncirc" arcade_md_ncirc1 = "md_ncirc" arcade_md_ncircp = "md_ncirc" arcade_md_neksoccr = "md_neksoccr" arcade_md_nemo = "md_jpond" arcade_md_newhoriz = "md_newhoriz" arcade_md_newmanh = "md_newmanh" arcade_md_nfl94 = "md_nfl94" arcade_md_nfl94j = "md_nfl94" arcade_md_nfl95 = "md_nfl95" arcade_md_nfl95p01 = "md_nfl95" arcade_md_nfl95p02 = "md_nfl95" arcade_md_nfl95p03 = "md_nfl95" arcade_md_nfl95p04 = "md_nfl95" arcade_md_nfl95p05 = "md_nfl95" arcade_md_nfl95p06 = "md_nfl95" arcade_md_nfl95p07 = "md_nfl95" arcade_md_nfl95p08 = "md_nfl95" arcade_md_nfl95p09 = "md_nfl95" arcade_md_nfl95p10 = "md_nfl95" arcade_md_nfl95p11 = "md_nfl95" arcade_md_nfl95p12 = "md_nfl95" arcade_md_nfl95p13 = "md_nfl95" arcade_md_nfl95p14 = "md_nfl95" arcade_md_nfl95p15 = "md_nfl95" arcade_md_nfl95p16 = "md_nfl95" arcade_md_nfl95p17 = "md_nfl95" arcade_md_nfl95p18 = "md_nfl95" arcade_md_nfl95p19 = "md_nfl95" arcade_md_nfl95p20 = "md_nfl95" arcade_md_nfl95p21 = "md_nfl95" arcade_md_nfl98 = "md_nfl98" arcade_md_nflqb = "md_nflqb" arcade_md_nflqb96 = "md_nflqb96" arcade_md_nflsport = "md_nflsport" arcade_md_nfsu = "md_toutrun" arcade_md_ngaiden = "md_ngaiden" arcade_md_nhktaidr = "md_nhktaidr" arcade_md_nhl = "md_nhl" arcade_md_nhl94 = "md_nhl94" arcade_md_nhl95 = "md_nhl95" arcade_md_nhl96 = "md_nhl96" arcade_md_nhl97 = "md_nhl97" arcade_md_nhl98 = "md_nhl98" arcade_md_nhlas = "md_nhlas" arcade_md_nhlasp01 = "md_nhlas" arcade_md_nhlasp02 = "md_nhlas" arcade_md_nhlasp03 = "md_nhlas" arcade_md_nhlasp04 = "md_nhlas" arcade_md_nhlasp05 = "md_nhlas" arcade_md_nhlasp06 = "md_nhlas" arcade_md_nhlasp07 = "md_nhlas" arcade_md_nhlasp08 = "md_nhlas" arcade_md_nhlasp09 = "md_nhlas" arcade_md_nhlasp10 = "md_nhlas" arcade_md_nhlasp11 = "md_nhlas" arcade_md_nhlasp12 = "md_nhlas" arcade_md_nhlasp13 = "md_nhlas" arcade_md_nhlasp14 = "md_nhlas" arcade_md_nhlasp15 = "md_nhlas" arcade_md_nhlasp16 = "md_nhlas" arcade_md_nhlpa2k3 = "md_nhl98" arcade_md_nhlpa93 = "md_nhlpa93" arcade_md_nhlpa93a = "md_nhlpa93" arcade_md_nicklaus = "md_nicklaus" arcade_md_nikkan = "md_nikkan" arcade_md_ninjab = "md_ninjab" arcade_md_nobuamb = "md_nobuamb" arcade_md_nobubufu = "md_nobubufu" arcade_md_nobuhao = "md_nobuhao" arcade_md_nobuzenk = "md_nobuamb" arcade_md_noescape = "md_noescape" arcade_md_normy = "md_normy" arcade_md_ohmummy = "md_ohmummy" arcade_md_olympgld = "md_olympgld" arcade_md_olympgldj = "md_olympgld" arcade_md_olympgldu = "md_olympgld" arcade_md_olympgldu1 = "md_olympgld" arcade_md_olympsum = "md_olympsum" arcade_md_ondal = "md_mystdef" arcade_md_onslau = "md_onslau" arcade_md_ootw = "md_anotherw" arcade_md_ootwp = "md_anotherw" arcade_md_ooze = "md_ooze" arcade_md_oozeju = "md_ooze" arcade_md_oozep01 = "md_ooze" arcade_md_oozep02 = "md_ooze" arcade_md_oozep03 = "md_ooze" arcade_md_oozep04 = "md_ooze" arcade_md_oozep05 = "md_ooze" arcade_md_oozep06 = "md_ooze" arcade_md_oozep07 = "md_ooze" arcade_md_opensea = "md_rolo" arcade_md_opensea3 = "md_rolo" arcade_md_opeurope = "md_opeurope" arcade_md_orunners = "md_orunners" arcade_md_orunnersj = "md_orunners" arcade_md_osomatsu = "md_osomatsu" arcade_md_ottifant = "md_ottifant" arcade_md_ottifantg = "md_ottifant" arcade_md_outlandr = "md_outlandr" arcade_md_outlandru = "md_outlandr" arcade_md_outr2019 = "md_outr2019" arcade_md_outr2019j = "md_outr2019" arcade_md_outr2019u = "md_outr2019" arcade_md_outr2019up = "md_outr2019" arcade_md_outrun = "md_outrun" arcade_md_outrunj = "md_outrun" arcade_md_pacattak = "md_pacpanic" arcade_md_pachinko = "md_pachinko" arcade_md_pacman2 = "md_pacman2" arcade_md_pacmania = "md_pacmania" arcade_md_pacpanic = "md_pacpanic" arcade_md_paddle = "md_paddle" arcade_md_paddlegnk = "md_paddle" arcade_md_pagemstr = "md_pagemstr" arcade_md_pagemstru = "md_pagemstr" arcade_md_pagemstrup = "md_pagemstr" arcade_md_paperbo2 = "md_paperbo2" arcade_md_paperboy = "md_paperboy" arcade_md_paperboyj = "md_paperboy" arcade_md_papicommandomd = "md_papicommandomd" arcade_md_par = "md_par" arcade_md_par2 = "md_par2" arcade_md_par2a = "md_par2" arcade_md_partyq = "md_partyq" arcade_md_patlabor = "md_patlabor" arcade_md_patriley = "md_srealbas" arcade_md_pcarib = "md_unchartd" arcade_md_pcarib2 = "md_pcarib2" arcade_md_pcotton = "md_pcotton" arcade_md_pdrive = "md_pdrive" arcade_md_pebble = "md_pebble" arcade_md_pebbleu = "md_pebble" arcade_md_pele = "md_pele" arcade_md_pele2 = "md_pele2" arcade_md_pga = "md_pga" arcade_md_pga2 = "md_pga2" arcade_md_pga2a = "md_pga2" arcade_md_pga2j = "md_pga2" arcade_md_pga3 = "md_pga3" arcade_md_pga96 = "md_pga96" arcade_md_pgaa = "md_pga" arcade_md_pgaeuro = "md_pgaeuro" arcade_md_phantom = "md_phantom" arcade_md_phantomu = "md_phantom" arcade_md_phelios = "md_phelios" arcade_md_pheliosj = "md_phelios" arcade_md_pheliosu = "md_phelios" arcade_md_pigskinf = "md_pigskinf" arcade_md_pink = "md_pink" arcade_md_pinkp = "md_pink" arcade_md_pinoc = "md_pinoc" arcade_md_pinocu = "md_pinoc" arcade_md_piratedw = "md_piratedw" arcade_md_piratedw1 = "md_piratedw" arcade_md_pirates = "md_pirates" arcade_md_piratesp = "md_pirates" arcade_md_pitfall = "md_pitfall" arcade_md_pitfallu = "md_pitfall" arcade_md_pitfight = "md_pitfight" arcade_md_pitfight1 = "md_pitfight" arcade_md_pmonger = "md_pmonger" arcade_md_pmongerj = "md_pmonger" arcade_md_pocahont = "md_pocahont" arcade_md_pocahontu = "md_pocahont" arcade_md_pokecd = "md_pokecd" arcade_md_pokecda = "md_pokecd" arcade_md_pokemon = "md_pokemon" arcade_md_pokemon2 = "md_pokemon2" arcade_md_pokemona = "md_pokemon" arcade_md_pokestad = "md_pokestad" arcade_md_populous = "md_populous" arcade_md_populousj = "md_populous" arcade_md_populousu = "md_populous" arcade_md_powerath = "md_deadlymv" arcade_md_powerbal = "md_powerbal" arcade_md_ppengo = "md_ppengo" arcade_md_ppersia = "md_ppersia" arcade_md_ppersia2 = "md_ppersia2" arcade_md_ppersiap = "md_ppersia" arcade_md_ppersiap1 = "md_ppersia" arcade_md_ppersiau = "md_ppersia" arcade_md_predatr2 = "md_predatr2" arcade_md_premierm = "md_premierm" arcade_md_premrm97 = "md_premrm97" arcade_md_primal = "md_primal" arcade_md_primetim = "md_primetim" arcade_md_probot = "md_contra" arcade_md_proqb = "md_proqb" arcade_md_prostrfs = "md_prostrfs" arcade_md_proyakyu = "md_proyakyu" arcade_md_ps2aa = "md_ps2aa" arcade_md_ps2aae = "md_ps2aa" arcade_md_ps2ab = "md_ps2ab" arcade_md_ps2abe = "md_ps2ab" arcade_md_ps2ac = "md_ps2ac" arcade_md_ps2ace = "md_ps2ac" arcade_md_ps2ad = "md_ps2ad" arcade_md_ps2ade = "md_ps2ad" arcade_md_ps2ae = "md_ps2ae" arcade_md_ps2aee = "md_ps2ae" arcade_md_ps2af = "md_ps2af" arcade_md_ps2afe = "md_ps2af" arcade_md_ps2ag = "md_ps2ag" arcade_md_ps2age = "md_ps2ag" arcade_md_ps2ah = "md_ps2ah" arcade_md_ps2ahe = "md_ps2ah" arcade_md_psolar = "md_psolar" arcade_md_pstar2 = "md_pstar2" arcade_md_pstar2a = "md_pstar2" arcade_md_pstar2br = "md_pstar2" arcade_md_pstar2j = "md_pstar2" arcade_md_pstar3 = "md_pstar3" arcade_md_pstar3br = "md_pstar3" arcade_md_pstar3j = "md_pstar3" arcade_md_pstar4 = "md_pstar4" arcade_md_pstar4j = "md_pstar4" arcade_md_pstar4p1 = "md_pstar4" arcade_md_pstar4p2 = "md_pstar4" arcade_md_pstar4p3 = "md_pstar4" arcade_md_pstar4p4 = "md_pstar4" arcade_md_pstar4p5 = "md_pstar4" arcade_md_pstar4u = "md_pstar4" arcade_md_psycho = "md_psycho" arcade_md_psycho1 = "md_psycho" arcade_md_psyoblad = "md_psyoblad" arcade_md_psyoblade = "md_psyoblad" arcade_md_pto = "md_pto" arcade_md_puggsy = "md_puggsy" arcade_md_puggsyp = "md_puggsy" arcade_md_puggsyu = "md_puggsy" arcade_md_pulseman = "md_pulseman" arcade_md_pulsemane = "md_pulseman" arcade_md_punisher = "md_punisher" arcade_md_punisheru = "md_punisher" arcade_md_putter = "md_putter" arcade_md_puttergnk = "md_putter" arcade_md_puyopuy2 = "md_puyopuy2" arcade_md_puyopuy2a = "md_puyopuy2" arcade_md_puyopuyo = "md_puyopuyo" arcade_md_pyramid = "md_pyramid" arcade_md_pyramid2 = "md_pyramid2" arcade_md_pyramid3 = "md_pyramid3" arcade_md_pyramidgnk = "md_pyramid" arcade_md_pyramids = "md_pyramids" arcade_md_qpoker = "md_qpoker" arcade_md_quacksht = "md_quacksht" arcade_md_quacksht1 = "md_quacksht" arcade_md_quadchal = "md_quadchal" arcade_md_racedriv = "md_racedriv" arcade_md_radicasf = "md_radicasf" arcade_md_radicav1 = "md_radicav1" arcade_md_radrex = "md_radrex" arcade_md_radrexu = "md_radrex" arcade_md_ragnacen = "md_soleil" arcade_md_ragnacenk = "md_soleil" arcade_md_ragnacenp = "md_soleil" arcade_md_raiden = "md_raiden" arcade_md_rambo3 = "md_rambo3" arcade_md_rambo3a = "md_rambo3" arcade_md_rampart = "md_rampart" arcade_md_rampartj = "md_rampart" arcade_md_rangerx = "md_rangerx" arcade_md_rangerxu = "md_rangerx" arcade_md_ransei = "md_ransei" arcade_md_rastan2 = "md_rastan2" arcade_md_rastan2j = "md_rastan2" arcade_md_rbibb3 = "md_rbibb3" arcade_md_rbibb4 = "md_rbibb4" arcade_md_rbibb4j = "md_rbibb4" arcade_md_rbibb4p = "md_rbibb4" arcade_md_rbibb93 = "md_rbibb93" arcade_md_rbibb94 = "md_rbibb94" arcade_md_rbisland = "md_rbisland" arcade_md_redcliff = "md_redcliff" arcade_md_redcliffa = "md_redcliff" arcade_md_redzone = "md_redzone" arcade_md_renstim = "md_renstim" arcade_md_renstimu = "md_renstim" arcade_md_renstimup = "md_renstim" arcade_md_renthero = "md_renthero" arcade_md_rentheroe = "md_renthero" arcade_md_resq = "md_resq" arcade_md_revshin = "md_revshin" arcade_md_revshin1 = "md_revshin" arcade_md_revshin2 = "md_revshin" arcade_md_revx = "md_revx" arcade_md_rhl2k7 = "md_nhlpa93" arcade_md_rickdang = "md_rickdang" arcade_md_riddle = "md_riddle" arcade_md_ringspow = "md_ringspow" arcade_md_riserobo = "md_riserobo" arcade_md_risk = "md_risk" arcade_md_riskyw = "md_riskyw" arcade_md_ristar = "md_ristar" arcade_md_ristar1 = "md_ristar" arcade_md_ristarj = "md_ristar" arcade_md_ristarp1 = "md_ristar" arcade_md_ristarp2 = "md_ristar" arcade_md_ristarp3 = "md_ristar" arcade_md_ristarp4 = "md_ristar" arcade_md_rnrracin = "md_rnrracin" arcade_md_rnrracinh = "md_rnrracin" arcade_md_rnrracinu = "md_rnrracin" arcade_md_roadblst = "md_roadblst" arcade_md_roadblstj = "md_roadblst" arcade_md_roadrash = "md_roadrash" arcade_md_robocod = "md_robocod" arcade_md_robocodj = "md_robocod" arcade_md_robocop3 = "md_robocop3" arcade_md_robotbat = "md_robotbat" arcade_md_roboterm = "md_roboterm" arcade_md_robotermj = "md_roboterm" arcade_md_robotermp = "md_roboterm" arcade_md_robotermp1 = "md_roboterm" arcade_md_robotermu = "md_roboterm" arcade_md_robowrek = "md_robowrek" arcade_md_rocket = "md_rocket" arcade_md_rocketj = "md_rocket" arcade_md_rocketu = "md_rocket" arcade_md_rockman = "md_megaman" arcade_md_rockman1 = "md_megaman" arcade_md_rockmnx3 = "md_rockmnx3" arcade_md_rockybw = "md_rockybw" arcade_md_rolo = "md_rolo" arcade_md_roman3k2 = "md_roman3k2" arcade_md_roman3k3 = "md_roman3k3" arcade_md_royalbld = "md_gemfire" arcade_md_rrash2 = "md_rrash2" arcade_md_rrash2a = "md_rrash2" arcade_md_rrash2j = "md_rrash2" arcade_md_rrash3 = "md_rrash3" arcade_md_rrash3p = "md_rrash3" arcade_md_rsbt = "md_rsbt" arcade_md_rsbtp1 = "md_rsbt" arcade_md_rsbtp2 = "md_rsbt" arcade_md_rsbtp3 = "md_rsbt" arcade_md_rsbtp4 = "md_rsbt" arcade_md_rsbtp5 = "md_rsbt" arcade_md_rsbtp6 = "md_rsbt" arcade_md_rsbtp7 = "md_rsbt" arcade_md_rthun2 = "md_rthun2" arcade_md_rthun2j = "md_rthun2" arcade_md_rthun2u = "md_rthun2" arcade_md_rthun3 = "md_rthun3" arcade_md_rugbywc = "md_rugbywc" arcade_md_runark = "md_growl" arcade_md_ryukoken = "md_aof" arcade_md_s15in1 = "md_s15in1" arcade_md_s19in1 = "md_s19in1" arcade_md_s2delta = "md_sonic2" arcade_md_s2rpt1 = "md_sonic2" arcade_md_s2smtp = "md_sonic2" arcade_md_s3comp = "md_s3comp" arcade_md_s3ktc = "md_s3ktc" arcade_md_sagaia = "md_sagaia" arcade_md_sailormn = "md_sailormn" arcade_md_sailormne = "md_sailormn" arcade_md_samesame = "md_fireshrk" arcade_md_sampra96 = "md_sampra96" arcade_md_sampras = "md_sampras" arcade_md_sampras1 = "md_sampras" arcade_md_sampras2 = "md_sampras" arcade_md_samsho = "md_samsho" arcade_md_samshou = "md_samsho" arcade_md_samspir = "md_samsho" arcade_md_sangoku2 = "md_roman3k2" arcade_md_sangoku3 = "md_roman3k3" arcade_md_sangoret = "md_sangoret" arcade_md_sanguo = "md_sangoret" arcade_md_sanguo5 = "md_sanguo5" arcade_md_sansan = "md_sansan" arcade_md_sbash = "md_sonic2" arcade_md_sboom = "md_sonic2" arcade_md_sbship = "md_sbship" arcade_md_sbtank = "md_sbtank" arcade_md_scheroes = "md_sonic2" arcade_md_scooby = "md_scooby" arcade_md_scrabble = "md_scrabble" arcade_md_scrack = "md_scrack" arcade_md_sdkong99 = "md_sdkong99" arcade_md_sdkong99a = "md_sdkong99" arcade_md_sdmilha2 = "md_sdmilha2" arcade_md_sdmilha2a = "md_sdmilha2" arcade_md_sdmilhao = "md_sdmilhao" arcade_md_sdvalis = "md_sydvalis" arcade_md_seaquest = "md_seaquest" arcade_md_seaquestu = "md_seaquest" arcade_md_seconds = "md_seconds" arcade_md_segachd = "md_segachd" arcade_md_segachnl = "md_segachnl" arcade_md_segachnla = "md_segachnl" arcade_md_segasprt = "md_segasprt" arcade_md_segatop = "md_segatop" arcade_md_sensibie = "md_sensibie" arcade_md_sensible = "md_sensible" arcade_md_sensiblep = "md_sensible" arcade_md_sesame = "md_sesame" arcade_md_sf2 = "md_sf2" arcade_md_sf2ics = "md_sf2" arcade_md_sf2j = "md_sf2" arcade_md_sf2pir = "md_sf2" arcade_md_sf2u = "md_sf2" arcade_md_sfzone = "md_sfzone" arcade_md_sfzonej = "md_sfzone" arcade_md_shadow = "md_shadow" arcade_md_shadowrn = "md_shadowrn" arcade_md_shadowrnj = "md_shadowrn" arcade_md_shadowrnp1 = "md_shadowrn" arcade_md_shadowrnp2 = "md_shadowrn" arcade_md_shadowrnp3 = "md_shadowrn" arcade_md_shadowrnp4 = "md_shadowrn" arcade_md_shanewar = "md_shanewar" arcade_md_shangh2 = "md_shangh2" arcade_md_shangh2p = "md_shangh2" arcade_md_shangh2p1 = "md_shangh2" arcade_md_shangh3 = "md_shangh3" arcade_md_shangon = "md_shangon" arcade_md_shangon1 = "md_shangon" arcade_md_shaqfu = "md_shaqfu" arcade_md_sharrier = "md_sharrier" arcade_md_sharrierj = "md_sharrier" arcade_md_shdancer = "md_shdancer" arcade_md_shijie = "md_shijie" arcade_md_shikinjo = "md_shikinjo" arcade_md_shimpact = "md_shimpact" arcade_md_shindark = "md_shindark" arcade_md_shindarkbr = "md_shindark" arcade_md_shindarkj = "md_shindark" arcade_md_shinfrc2 = "md_shinfrc2" arcade_md_shinfrc2j = "md_shinfrc2" arcade_md_shinfrc2p1 = "md_shinfrc2" arcade_md_shinfrc2p2 = "md_shinfrc2" arcade_md_shinfrc2t = "md_shinfrc2" arcade_md_shinfrc2u = "md_shinfrc2" arcade_md_shinfrce = "md_shinfrce" arcade_md_shinfrcej = "md_shinfrce" arcade_md_shinfrcep = "md_shinfrce" arcade_md_shinobi3 = "md_shinobi3" arcade_md_shinobi3u = "md_shinobi3" arcade_md_shinobi3umj = "md_shinobi3" arcade_md_ship = "md_ship" arcade_md_shiten = "md_shadow" arcade_md_shougi = "md_shougi" arcade_md_shoveit = "md_shoveit" arcade_md_shrek = "md_yogibear" arcade_md_shrek2 = "md_ottifant" arcade_md_shuihu = "md_shuihu" arcade_md_shuihuzh = "md_shuihuzh" arcade_md_shuramon = "md_shuramon" arcade_md_sidepock = "md_sidepock" arcade_md_sidepockj = "md_sidepock" arcade_md_sidepocku = "md_sidepock" arcade_md_sinv90 = "md_sinv91" arcade_md_sinv91 = "md_sinv91" arcade_md_sk = "md_sk" arcade_md_skelkrew = "md_skelkrew" arcade_md_skelkrewu = "md_skelkrew" arcade_md_skickoff = "md_skickoff" arcade_md_skitchin = "md_skitchin" arcade_md_skkong99 = "md_sdkong99" arcade_md_skp01 = "md_sk" arcade_md_skp02 = "md_sk" arcade_md_skp03 = "md_sk" arcade_md_skp04 = "md_sk" arcade_md_skp05 = "md_sk" arcade_md_skp06 = "md_sk" arcade_md_skp07 = "md_sk" arcade_md_skp08 = "md_sk" arcade_md_skp09 = "md_sk" arcade_md_skp10 = "md_sk" arcade_md_skp11 = "md_sk" arcade_md_skp12 = "md_sk" arcade_md_sks1 = "md_sks1" arcade_md_sks2 = "md_sks2" arcade_md_sks3 = "md_sks3" arcade_md_slamdunk = "md_slamdunk" arcade_md_slammast = "md_slammast" arcade_md_slammastu = "md_slammast" arcade_md_slamshaq = "md_slamshaq" arcade_md_slapfigh = "md_slapfigh" arcade_md_slaughtr = "md_slaughtr" arcade_md_slimew = "md_slimew" arcade_md_slimewj = "md_slimew" arcade_md_smario2 = "md_smario2" arcade_md_smario2a = "md_smario2" arcade_md_smario64 = "md_smario64" arcade_md_smario64h = "md_smario64" arcade_md_smasters = "md_arnoldp" arcade_md_smb = "md_smb" arcade_md_smb4md = "md_smb4md" arcade_md_smba = "md_smb" arcade_md_smbb = "md_smb" arcade_md_smbbc = "md_smbbc" arcade_md_smgp = "md_smgp" arcade_md_smgp2 = "md_smgp2" arcade_md_smgp2u = "md_smgp2" arcade_md_smgpa = "md_smgp" arcade_md_smgpj = "md_smgp" arcade_md_smgpu = "md_smgp" arcade_md_smsbrawl = "md_smsbrawl" arcade_md_smurfs = "md_smurfs" arcade_md_smurfstw = "md_smurfstw" arcade_md_snakernr = "md_snakernr" arcade_md_sndtool = "md_sndtool" arcade_md_snezkoro = "md_mickmack" arcade_md_snowbros = "md_snowbros" arcade_md_socket = "md_socket" arcade_md_sokoban = "md_shoveit" arcade_md_soldeace = "md_soldeace" arcade_md_soldfort = "md_chaoseng" arcade_md_soleil = "md_soleil" arcade_md_soleilf = "md_soleil" arcade_md_soleilg = "md_soleil" arcade_md_soleils = "md_soleil" arcade_md_somarita = "md_sonic" arcade_md_sonic = "md_sonic" arcade_md_sonic2 = "md_sonic2" arcade_md_sonic2a = "md_sonic2" arcade_md_sonic2b = "md_sonic2" arcade_md_sonic2brc = "md_sonic2" arcade_md_sonic2c = "md_sonic2" arcade_md_sonic2p1 = "md_sonic2" arcade_md_sonic2p2 = "md_sonic2" arcade_md_sonic2p3 = "md_sonic2" arcade_md_sonic2p4 = "md_sonic2" arcade_md_sonic2p5 = "md_sonic2" arcade_md_sonic2p6 = "md_sonic2" arcade_md_sonic2p7 = "md_sonic2" arcade_md_sonic2p8 = "md_sonic2" arcade_md_sonic3 = "md_sonic3" arcade_md_sonic31 = "md_sonic31" arcade_md_sonic3c = "md_sonic3c" arcade_md_sonic3ca = "md_sonic3ca" arcade_md_sonic3d = "md_sonic3d" arcade_md_sonic3ddx = "md_sonic3d" arcade_md_sonic3dp1 = "md_sonic3d" arcade_md_sonic3dp2 = "md_sonic3d" arcade_md_sonic3dp3 = "md_sonic3d" arcade_md_sonic3dp4 = "md_sonic3d" arcade_md_sonic3dp5 = "md_sonic3d" arcade_md_sonic3dp6 = "md_sonic3d" arcade_md_sonic3dp7 = "md_sonic3d" arcade_md_sonic3dp8 = "md_sonic3d" arcade_md_sonic3j = "md_sonic3" arcade_md_sonic3pir = "md_sonic3" arcade_md_sonic3u = "md_sonic3" arcade_md_soniccmp = "md_soniccmp" arcade_md_soniccmp1 = "md_soniccmp" arcade_md_sonicer = "md_sonicer" arcade_md_sonicj = "md_sonic" arcade_md_sonicjam = "md_sonicjam" arcade_md_sonicjam1 = "md_sonicjam" arcade_md_sonicjam2 = "md_sonicjam" arcade_md_sonicmmix = "md_sonic" arcade_md_sonicpir = "md_sonic" arcade_md_sonicppu = "md_sonic" arcade_md_sonictlw = "md_sonic" arcade_md_sonicwa = "md_sonic" arcade_md_sor = "md_sor" arcade_md_sor2 = "md_sor2" arcade_md_sor2bk3b = "md_sor2" arcade_md_sor2tmnt = "md_sor2" arcade_md_sor2u = "md_sor2" arcade_md_sor2upw = "md_sor2" arcade_md_sor2usw = "md_sor2" arcade_md_sor3 = "md_sor3" arcade_md_sor3bk3p = "md_sor3" arcade_md_sor3ex = "md_sor3" arcade_md_sor3k = "md_sor3" arcade_md_sor3p1 = "md_sor3" arcade_md_sor3p2 = "md_sor3" arcade_md_sor3p3 = "md_sor3" arcade_md_sor3p4 = "md_sor3" arcade_md_sor3p5 = "md_sor3" arcade_md_sor3u = "md_sor3" arcade_md_sor3up01 = "md_sor3" arcade_md_sor3up02 = "md_sor3" arcade_md_sor3up03 = "md_sor3" arcade_md_sor3up04 = "md_sor3" arcade_md_sor3up05 = "md_sor3" arcade_md_sor3up06 = "md_sor3" arcade_md_sor3up07 = "md_sor3" arcade_md_sor3up08 = "md_sor3" arcade_md_sor3up09 = "md_sor3" arcade_md_sor3up10 = "md_sor3" arcade_md_sora = "md_sor" arcade_md_sorcer = "md_sorcer" arcade_md_sorcerk = "md_sorcerk" arcade_md_sorcerk1 = "md_sorcerk" arcade_md_sorcerkj = "md_sorcerk" arcade_md_soulblad = "md_soulblad" arcade_md_soulblada = "md_soulblad" arcade_md_souledge = "md_souledge" arcade_md_souledgea = "md_souledge" arcade_md_southia = "md_sonic" arcade_md_spacebob = "md_bob" arcade_md_sparkstr = "md_sparkstr" arcade_md_sparkstrj = "md_sparkstr" arcade_md_sparkstru = "md_sparkstr" arcade_md_speedbl2 = "md_speedbl2" arcade_md_speedbl2j = "md_speedbl2" arcade_md_speedbl2u = "md_speedbl2" arcade_md_spidermn = "md_spidermn" arcade_md_spidermnp1 = "md_spidermn" arcade_md_spidermnp2 = "md_spidermn" arcade_md_spidking = "md_spidking" arcade_md_spidmaxc = "md_spidmaxc" arcade_md_spidxmen = "md_spidxmen" arcade_md_spiritwf = "md_spiritwf" arcade_md_spirou = "md_spirou" arcade_md_splatth2 = "md_splatth2" arcade_md_splatth2j = "md_splatth2" arcade_md_splatth2u = "md_splatth2" arcade_md_splatth3 = "md_splatth3" arcade_md_splatth3j = "md_splatth3" arcade_md_spongbob = "md_coolspot" arcade_md_sportg = "md_sportg" arcade_md_sporttbb = "md_sporttbb" arcade_md_spotgo = "md_spotgo" arcade_md_spotgou = "md_spotgo" arcade_md_spykids4 = "md_dinotale" arcade_md_squirrel = "md_squirrel" arcade_md_sracer = "md_sracer" arcade_md_srealbas = "md_srealbas" arcade_md_srealbasj = "md_srealbas" arcade_md_srobowrs = "md_trgearth" arcade_md_ssf2 = "md_ssf2" arcade_md_ssf2ics = "md_ssf2" arcade_md_ssf2j = "md_ssf2" arcade_md_ssf2u = "md_ssf2" arcade_md_sskid = "md_sskid" arcade_md_sskidp = "md_sskid" arcade_md_ssmart = "md_ssmart" arcade_md_ssmashtv = "md_ssmashtv" arcade_md_sspin = "md_sspin" arcade_md_sspinj = "md_sspin" arcade_md_sspinp = "md_sspin" arcade_md_sspinu = "md_sspin" arcade_md_sspinua = "md_sspin" arcade_md_ssriders = "md_ssriders" arcade_md_ssridersu = "md_ssriders" arcade_md_ssword = "md_ssword" arcade_md_sswordj = "md_ssword" arcade_md_starchaser = "md_starchaser" arcade_md_starcrus = "md_starcrus" arcade_md_starcruse = "md_starcrus" arcade_md_starctrl = "md_starctrl" arcade_md_starfl = "md_starfl" arcade_md_starfl1 = "md_starfl" arcade_md_stargate = "md_stargate" arcade_md_stargatep = "md_stargate" arcade_md_starjedi = "md_wolfchld" arcade_md_starwars = "md_elimdown" arcade_md_stblad = "md_stblad" arcade_md_stbladj = "md_stblad" arcade_md_stds9 = "md_stds9" arcade_md_stds9u = "md_stds9" arcade_md_steelemp = "md_empsteel" arcade_md_steeltal = "md_steeltal" arcade_md_steeltalj = "md_steeltal" arcade_md_steeltalp = "md_steeltal" arcade_md_stonprot = "md_stonprot" arcade_md_strider = "md_strider" arcade_md_strider2 = "md_strider2" arcade_md_strider2u = "md_strider2" arcade_md_striderj = "md_strider" arcade_md_striker = "md_striker" arcade_md_strikerp = "md_striker" arcade_md_strmlord = "md_strmlord" arcade_md_strmlordj = "md_strmlord" arcade_md_sttng = "md_sttng" arcade_md_sttnga = "md_sttng" arcade_md_sttngp01 = "md_sttng" arcade_md_sttngp02 = "md_sttng" arcade_md_sttngp03 = "md_sttng" arcade_md_sttngp04 = "md_sttng" arcade_md_sttngp05 = "md_sttng" arcade_md_sttngp06 = "md_sttng" arcade_md_subterr = "md_subterr" arcade_md_subterrj = "md_subterr" arcade_md_subterrp1 = "md_subterr" arcade_md_subterrp2 = "md_subterr" arcade_md_subterrp3 = "md_subterr" arcade_md_subterru = "md_subterr" arcade_md_summer = "md_summer" arcade_md_supdaisn = "md_supdaisn" arcade_md_supdaisna = "md_supdaisn" arcade_md_superair = "md_xfire" arcade_md_superhq = "md_chasehq2" arcade_md_superman = "md_superman" arcade_md_supermanp = "md_superman" arcade_md_supermanu = "md_superman" arcade_md_superoff = "md_superoff" arcade_md_suphydl = "md_suphydl" arcade_md_suphydlj = "md_suphydl" arcade_md_suphydlu = "md_suphydl" arcade_md_supmagic = "md_supmagic" arcade_md_suprbubl = "md_suprbubl" arcade_md_suprleag = "md_suprleag" arcade_md_suprleagj = "md_suprleag" arcade_md_supshin = "md_revshin" arcade_md_supshin2 = "md_shinobi3" arcade_md_supshin2p1 = "md_shinobi3" arcade_md_supshin2p2 = "md_shinobi3" arcade_md_surging = "md_surging" arcade_md_svolley = "md_svolley" arcade_md_svolley1 = "md_svolley" arcade_md_svolleyj = "md_svolley" arcade_md_swamp = "md_swamp" arcade_md_swordsod = "md_swordsod" arcade_md_swordsodj = "md_swordsod" arcade_md_sydvalis = "md_sydvalis" arcade_md_sylvestr = "md_sylvestr" arcade_md_sylvestru = "md_sylvestr" arcade_md_syndicat = "md_syndicat" arcade_md_t2ag = "md_t2ag" arcade_md_t2agj = "md_t2ag" arcade_md_t2agp = "md_t2ag" arcade_md_t3ag = "md_t2ag" arcade_md_taikoris = "md_taikoris" arcade_md_taiwan = "md_taiwan" arcade_md_talespin = "md_talespin" arcade_md_talmit = "md_talmit" arcade_md_tank2011 = "md_tank2011" arcade_md_tantr = "md_tantr" arcade_md_taskfhex = "md_taskfhex" arcade_md_taskfhexj = "md_taskfhex" arcade_md_tazmania = "md_tazmania" arcade_md_tazmars = "md_tazmars" arcade_md_tazmarsp01 = "md_tazmars" arcade_md_tazmarsp02 = "md_tazmars" arcade_md_tazmarsp03 = "md_tazmars" arcade_md_tazmarsp04 = "md_tazmars" arcade_md_tazmarsp05 = "md_tazmars" arcade_md_tazmarsp06 = "md_tazmars" arcade_md_tazmarsp07 = "md_tazmars" arcade_md_tazmarsp08 = "md_tazmars" arcade_md_tazmarsp09 = "md_tazmars" arcade_md_tazmarsp10 = "md_tazmars" arcade_md_tazmarsp11 = "md_tazmars" arcade_md_tazmarsu = "md_tazmars" arcade_md_tbolt2 = "md_tbolt2" arcade_md_tbolt2a = "md_tbolt2a" arcade_md_tc2000 = "md_tc2000" arcade_md_td2 = "md_td2" arcade_md_teamusa = "md_teamusa" arcade_md_technocl = "md_technocl" arcade_md_tecmobb = "md_tecmobb" arcade_md_tecmocup = "md_tecmocup" arcade_md_tecmohck = "md_tecmohck" arcade_md_tecmonba = "md_tecmonba" arcade_md_tecmonbaj = "md_tecmonba" arcade_md_tecmosb2 = "md_tecmosb2" arcade_md_tecmosb2j = "md_tecmosb2" arcade_md_tecmosb3 = "md_tecmosb3" arcade_md_tecmosbw = "md_tecmosbw" arcade_md_tecmosbwa = "md_tecmosbw" arcade_md_tecmosbwj = "md_tecmosbw" arcade_md_tecmow92 = "md_tecmow92" arcade_md_tecmowc = "md_tecmowc" arcade_md_tecnocop = "md_tecnocop" arcade_md_teddyboy = "md_teddyboy" arcade_md_teiketsu = "md_pto" arcade_md_tekkn3sp = "md_tekkn3sp" arcade_md_telebrad = "md_telebrad" arcade_md_telmah = "md_telmah" arcade_md_telstad = "md_telstad" arcade_md_term2 = "md_term2" arcade_md_termintr = "md_termintr" arcade_md_termintru = "md_termintr" arcade_md_tetris = "md_tetris" arcade_md_tetris1 = "md_tetris1" arcade_md_tf2 = "md_tf2" arcade_md_tf2j = "md_tf2" arcade_md_tf3 = "md_tf3" arcade_md_tf4 = "md_tf4" arcade_md_tf4j = "md_tf4" arcade_md_tfox = "md_tfox" arcade_md_tfoxj = "md_tfox" arcade_md_tgunii = "md_tgunii" arcade_md_themeprk = "md_themeprk" arcade_md_thomas = "md_thomas" arcade_md_thor = "md_thor" arcade_md_thorf = "md_thor" arcade_md_thorg = "md_thor" arcade_md_thorj = "md_thor" arcade_md_thorjp = "md_thor" arcade_md_thork = "md_thor" arcade_md_thorp1 = "md_thor" arcade_md_thorp2 = "md_thor" arcade_md_thors = "md_thor" arcade_md_tick = "md_tick" arcade_md_timedom = "md_socket" arcade_md_timekill = "md_timekill" arcade_md_timekillu = "md_timekill" arcade_md_tinhead = "md_tinhead" arcade_md_tintin = "md_tintin" arcade_md_tmhthh = "md_tmhthh" arcade_md_tmhttf = "md_tmhttf" arcade_md_tmnthh = "md_tmhthh" arcade_md_tmntru = "md_tmntru" arcade_md_tmntshj = "md_tmhthh" arcade_md_tmnttficb = "md_tmhttf" arcade_md_tmnttfj = "md_tmhttf" arcade_md_tmnttfu = "md_tmhttf" arcade_md_tnnbass = "md_tnnbass" arcade_md_tnnout = "md_tnnout" arcade_md_tnzs = "md_tnzs" arcade_md_toejam = "md_toejam" arcade_md_toejam2 = "md_toejam2" arcade_md_toejam2g = "md_toejam2" arcade_md_toejam2j = "md_toejam2" arcade_md_toejam2u = "md_toejam2" arcade_md_toejama = "md_toejam" arcade_md_toki = "md_toki" arcade_md_toki1 = "md_toki" arcade_md_tomjerry = "md_tomjerry" arcade_md_tomjerry1 = "md_tomjerry" arcade_md_topf2k5 = "md_topf2k5" arcade_md_topfight = "md_topfight" arcade_md_topgear2 = "md_topgear2" arcade_md_topgolf = "md_topgolf" arcade_md_topgolf2 = "md_chichi" arcade_md_totlfoot = "md_totlfoot" arcade_md_toughman = "md_toughman" arcade_md_toutrun = "md_toutrun" arcade_md_toxicc = "md_toxicc" arcade_md_toys = "md_toys" arcade_md_toystory = "md_toystory" arcade_md_toystoryu = "md_toystory" arcade_md_tplay96 = "md_tplay96" arcade_md_tplaygld = "md_tplaygld" arcade_md_tplayglda = "md_tplaygld" arcade_md_tpwres = "md_tpwres" arcade_md_trampter = "md_trampter" arcade_md_transf3 = "md_mazinwar" arcade_md_traysia = "md_traysia" arcade_md_traysiaj = "md_traysia" arcade_md_trgearth = "md_trgearth" arcade_md_troubsht = "md_troubsht" arcade_md_troyaik = "md_troyaik" arcade_md_truco96 = "md_truco96" arcade_md_truelies = "md_truelies" arcade_md_truxton = "md_truxton" arcade_md_tsfss = "md_sonic" arcade_md_ttacme = "md_ttacme" arcade_md_ttacmeu = "md_ttacme" arcade_md_ttoon3 = "md_ttoon3" arcade_md_ttoonbht = "md_ttoonbht" arcade_md_ttoonbhtk = "md_ttoonbht" arcade_md_ttoonbhtu = "md_ttoonbht" arcade_md_tunshi = "md_tunshi" arcade_md_tunshi1 = "md_tunshi" arcade_md_turmamon = "md_wboymw" arcade_md_turrican = "md_turrican" arcade_md_turricanf = "md_turrican" arcade_md_twincobr = "md_twincobr" arcade_md_twinhawk = "md_twinhawk" arcade_md_twinklet = "md_twinklet" arcade_md_twinklete = "md_twinklet" arcade_md_twistedf = "md_crueball" arcade_md_twocrude = "md_twocrude" arcade_md_twocrudeu = "md_twocrude" arcade_md_twotribe = "md_twotribe" arcade_md_tyrant = "md_megalo" arcade_md_ultqix = "md_ultqix" arcade_md_ultraman = "md_ultraman" arcade_md_ultsoccr = "md_ultsoccr" arcade_md_ultsoccrp = "md_ultsoccr" arcade_md_umk3 = "md_umk3" arcade_md_umk3h = "md_umk3" arcade_md_umk3mh = "md_umk3" arcade_md_umk3t = "md_umk3t" arcade_md_umk3u = "md_umk3" arcade_md_unchartd = "md_unchartd" arcade_md_undead = "md_undead" arcade_md_undeade = "md_undead" arcade_md_univsold = "md_univsold" arcade_md_unknown2 = "md_unknown2" arcade_md_unnecess = "md_unnecess" arcade_md_ustrike = "md_ustrike" arcade_md_uwol = "md_uwol" arcade_md_uzukeo = "md_uzukeo" arcade_md_valis = "md_valis" arcade_md_valis3 = "md_valis3" arcade_md_valis3j = "md_valis3" arcade_md_valisj = "md_valis" arcade_md_vaportr = "md_vaportr" arcade_md_vbart = "md_vbart" arcade_md_vecman = "md_vecman" arcade_md_vecman2 = "md_vecman2" arcade_md_vecman2p1 = "md_vecman2" arcade_md_vecman2p2 = "md_vecman2" arcade_md_vecman2p3 = "md_vecman2" arcade_md_vecman2p4 = "md_vecman2" arcade_md_vecman2p5 = "md_vecman2" arcade_md_vecman2p6 = "md_vecman2" arcade_md_vecmanp1 = "md_vecman" arcade_md_vecmanp2 = "md_vecman" arcade_md_vecmanp3 = "md_vecman" arcade_md_venom = "md_venom" arcade_md_vermil = "md_vermil" arcade_md_vermilj = "md_vermil" arcade_md_verytex = "md_verytex" arcade_md_vf2 = "md_vf2" arcade_md_vf2k = "md_vf2" arcade_md_vf2p1 = "md_vf2" arcade_md_vf2p2 = "md_vf2" arcade_md_vf2p3 = "md_vf2" arcade_md_vf2p4 = "md_vf2" arcade_md_vf2p5 = "md_vf2" arcade_md_vf2tek = "md_vf2tek" arcade_md_vfive = "md_grindst" arcade_md_viewpoin = "md_viewpoin" arcade_md_viewpoinp = "md_viewpoin" arcade_md_virak = "md_virak" arcade_md_vixen357 = "md_vixen357" arcade_md_vixen357e = "md_vixen357" arcade_md_volfied = "md_ultqix" arcade_md_vpinball = "md_vpinball" arcade_md_vr = "md_vr" arcade_md_vrj = "md_vr" arcade_md_vrtroop = "md_vrtroop" arcade_md_vru = "md_vr" arcade_md_wackyrac = "md_wackyrac" arcade_md_waldo = "md_waldo" arcade_md_waniwani = "md_waniwani" arcade_md_wardner = "md_wardner" arcade_md_wardnerj = "md_wardner" arcade_md_wario3 = "md_puggsy" arcade_md_warlock = "md_warlock" arcade_md_warlockp = "md_warlock" arcade_md_warpsped = "md_warpsped" arcade_md_warrior = "md_warrior" arcade_md_warrior2 = "md_warrior2" arcade_md_warsong = "md_warsong" arcade_md_waterwld = "md_waterwld" arcade_md_wayneg = "md_wayneg" arcade_md_waynewld = "md_waynewld" arcade_md_wboy3 = "md_wboy3" arcade_md_wboy5 = "md_wboymw" arcade_md_wboymw = "md_wboymw" arcade_md_wclead = "md_wclead" arcade_md_wcleadu = "md_wclead" arcade_md_wcs = "md_wcup90" arcade_md_wcs2 = "md_wcs2" arcade_md_wcs2p01 = "md_wcs2" arcade_md_wcs2p02 = "md_wcs2" arcade_md_wcs2p03 = "md_wcs2" arcade_md_wcs2p04 = "md_wcs2" arcade_md_wcs2p05 = "md_wcs2" arcade_md_wcs2p06 = "md_wcs2" arcade_md_wcs2p07 = "md_wcs2" arcade_md_wcs2p08 = "md_wcs2" arcade_md_wcs2p09 = "md_wcs2" arcade_md_wcs2p10 = "md_wcs2" arcade_md_wcs2p11 = "md_wcs2" arcade_md_wcs2p12 = "md_wcs2" arcade_md_wcs2p13 = "md_wcs2" arcade_md_wcs2p14 = "md_wcs2" arcade_md_wcs2p15 = "md_wcs2" arcade_md_wcs2p16 = "md_wcs2" arcade_md_wcs2p17 = "md_wcs2" arcade_md_wcs2p18 = "md_wcs2" arcade_md_wcs2u = "md_wcs2" arcade_md_wcs2up = "md_wcs2" arcade_md_wcsa = "md_wcup90" arcade_md_wcsb = "md_wcup90" arcade_md_wcup90 = "md_wcup90" arcade_md_wcup94 = "md_wcup94" arcade_md_weaponld = "md_weaponld" arcade_md_wh = "md_wh" arcade_md_whacacri = "md_whacacri" arcade_md_wheelfor = "md_wheelfor" arcade_md_whiprush = "md_whiprush" arcade_md_whiprushj = "md_whiprush" arcade_md_whj = "md_wh" arcade_md_whjp1 = "md_wh" arcade_md_whjp2 = "md_wh" arcade_md_whjp3 = "md_wh" arcade_md_whjp4 = "md_wh" arcade_md_whjp5 = "md_wh" arcade_md_whp01 = "md_wh" arcade_md_whp02 = "md_wh" arcade_md_whp03 = "md_wh" arcade_md_whp04 = "md_wh" arcade_md_whp05 = "md_wh" arcade_md_whp06 = "md_wh" arcade_md_whp07 = "md_wh" arcade_md_whp08 = "md_wh" arcade_md_whp09 = "md_wh" arcade_md_whp10 = "md_wh" arcade_md_whp11 = "md_wh" arcade_md_whp12 = "md_wh" arcade_md_whp13 = "md_wh" arcade_md_wildsnak = "md_wildsnak" arcade_md_wimbled = "md_wimbled" arcade_md_wimbledj = "md_wimbled" arcade_md_wimbledu = "md_wimbled" arcade_md_wimbledup = "md_wimbled" arcade_md_wingswor = "md_gynoug" arcade_md_wintchal = "md_wintchal" arcade_md_wintchal1 = "md_wintchal" arcade_md_wintchalp = "md_wintchal" arcade_md_wintol = "md_wintol" arcade_md_wintolj = "md_wintol" arcade_md_wintolu = "md_wintol" arcade_md_winx = "md_valis" arcade_md_winx3d = "md_valis3" arcade_md_wiznliz = "md_wiznliz" arcade_md_wiznlizu = "md_wiznliz" arcade_md_wolfchld = "md_wolfchld" arcade_md_wolverin = "md_wolverin" arcade_md_wondlib = "md_wondlib" arcade_md_worldill = "md_worldill" arcade_md_worldillj = "md_worldill" arcade_md_worldilljp = "md_worldill" arcade_md_worldillu = "md_worldill" arcade_md_worldts = "md_euroclub" arcade_md_worms = "md_worms" arcade_md_wormsp = "md_worms" arcade_md_wrestwar = "md_wrestwar" arcade_md_wrestwarp = "md_wrestwar" arcade_md_wrstball = "md_powerbal" arcade_md_wsb = "md_wsb" arcade_md_wsb95 = "md_wsb95" arcade_md_wsb95p01 = "md_wsb95" arcade_md_wsb95p02 = "md_wsb95" arcade_md_wsb95p03 = "md_wsb95" arcade_md_wsb95p04 = "md_wsb95" arcade_md_wsb95p05 = "md_wsb95" arcade_md_wsb95p06 = "md_wsb95" arcade_md_wsb95p07 = "md_wsb95" arcade_md_wsb95p08 = "md_wsb95" arcade_md_wsb95p09 = "md_wsb95" arcade_md_wsb95p10 = "md_wsb95" arcade_md_wsb95p11 = "md_wsb95" arcade_md_wsb95p12 = "md_wsb95" arcade_md_wsb95p13 = "md_wsb95" arcade_md_wsb95p14 = "md_wsb95" arcade_md_wsb95p15 = "md_wsb95" arcade_md_wsb95p16 = "md_wsb95" arcade_md_wsb95p17 = "md_wsb95" arcade_md_wsb95p18 = "md_wsb95" arcade_md_wsb95p19 = "md_wsb95" arcade_md_wsb95p20 = "md_wsb95" arcade_md_wsb95p21 = "md_wsb95" arcade_md_wsb95p22 = "md_wsb95" arcade_md_wsb95p23 = "md_wsb95" arcade_md_wsb96 = "md_wsb96" arcade_md_wsb98 = "md_wsb98" arcade_md_wsbp01 = "md_wsb" arcade_md_wsbp02 = "md_wsb" arcade_md_wsbp03 = "md_wsb" arcade_md_wsbp04 = "md_wsb" arcade_md_wsbp05 = "md_wsb" arcade_md_wsbp06 = "md_wsb" arcade_md_wsbp07 = "md_wsb" arcade_md_wsbp08 = "md_wsb" arcade_md_wsbp09 = "md_wsb" arcade_md_wsbp10 = "md_wsb" arcade_md_wukong = "md_wukong" arcade_md_wwfag = "md_wwfag" arcade_md_wwfagp = "md_wwfag" arcade_md_wwfraw = "md_wwfraw" arcade_md_wwfroyal = "md_wwfroyal" arcade_md_wwfsup = "md_wwfsup" arcade_md_wworlds = "md_wworlds" arcade_md_wworldsp1 = "md_wworlds" arcade_md_wworldsp2 = "md_wworlds" arcade_md_wworldsp3 = "md_wworlds" arcade_md_xdr = "md_xdr" arcade_md_xenon2 = "md_xenon2" arcade_md_xfire = "md_xfire" arcade_md_xiaomo = "md_xiaomo" arcade_md_xinqig = "md_xinqig" arcade_md_xinqig1 = "md_xinqig" arcade_md_xmen = "md_xmen" arcade_md_xmen2 = "md_xmen2" arcade_md_xmen2p01 = "md_xmen2" arcade_md_xmen2p02 = "md_xmen2" arcade_md_xmen2p03 = "md_xmen2" arcade_md_xmen2p04 = "md_xmen2" arcade_md_xmen2p05 = "md_xmen2" arcade_md_xmen2p06 = "md_xmen2" arcade_md_xmen2p07 = "md_xmen2" arcade_md_xmen2p08 = "md_xmen2" arcade_md_xmen2p09 = "md_xmen2" arcade_md_xmen2p10 = "md_xmen2" arcade_md_xmen2p11 = "md_xmen2" arcade_md_xmen2p12 = "md_xmen2" arcade_md_xmen2p13 = "md_xmen2" arcade_md_xmen2p14 = "md_xmen2" arcade_md_xmen2p15 = "md_xmen2" arcade_md_xmen2p16 = "md_xmen2" arcade_md_xmen2p17 = "md_xmen2" arcade_md_xmen2p18 = "md_xmen2" arcade_md_xmen2p19 = "md_xmen2" arcade_md_xmenu = "md_xmen" arcade_md_xperts = "md_xperts" arcade_md_xpertsp = "md_xperts" arcade_md_yangji = "md_yangji" arcade_md_yasech = "md_yasech" arcade_md_yogibear = "md_yogibear" arcade_md_youngind = "md_youngind" arcade_md_ys3 = "md_ys3" arcade_md_ys3j = "md_ys3" arcade_md_ysonic2 = "md_sonic2" arcade_md_yuyug = "md_yuyug" arcade_md_yuyumt = "md_yuyusf" arcade_md_yuyumte = "md_yuyusf" arcade_md_yuyusf = "md_yuyusf" arcade_md_zanyasha = "md_zanyasha" arcade_md_zanygolf = "md_zanygolf" arcade_md_zanygolf1 = "md_zanygolf" arcade_md_zero = "md_zero" arcade_md_zerotol = "md_zerotol" arcade_md_zerou = "md_zero" arcade_md_zerowing = "md_zerowing" arcade_md_zerowingj = "md_zerowing" arcade_md_zhuogu = "md_zhuogu" arcade_md_zombhigh = "md_zombhigh" arcade_md_zombies = "md_zombies" arcade_md_zombiesu = "md_zombies" arcade_md_zool = "md_zool" arcade_md_zoolu = "md_zool" arcade_md_zoom = "md_zoom" arcade_md_zoop = "md_zoop" arcade_md_zoopu = "md_zoop" arcade_md_zouzou = "md_rolo" arcade_mdhorse = "mdhorse" arcade_mechatt = "mechatt" arcade_mechattj = "mechatt" arcade_mechattu = "mechatt" arcade_mechattu1 = "mechatt" arcade_medlanes = "medlanes" arcade_megab = "megab" arcade_megabj = "megab" arcade_megablst = "megablst" arcade_megablstj = "megablst" arcade_megablstu = "megablst" arcade_megadon = "megadon" arcade_megaforc = "starforc" arcade_megaman = "megaman" arcade_megaman2 = "megaman2" arcade_megaman2a = "megaman2" arcade_megaman2h = "megaman2" arcade_megamana = "megaman" arcade_megamn2a = "megaman2" arcade_megamn2d = "megaman2" arcade_megatack = "megatack" arcade_megaznik = "megazone" arcade_megazone = "megazone" arcade_megazonea = "megazone" arcade_megazoneb = "megazone" arcade_megazoneh = "megazone" arcade_megazonei = "megazone" arcade_megazonej = "megazone" arcade_meijinsn = "meijinsn" arcade_meikyuh = "ghostb" arcade_meikyuha = "ghostb" arcade_meosism = "meosism" arcade_mercenario = "commando" arcade_mercs = "mercs" arcade_mercsj = "mercs" arcade_mercsu = "mercs" arcade_mercsua = "mercs" arcade_mercsur1 = "mercs" arcade_merlinmm = "merlinmm" arcade_mermaid = "mermaid" arcade_metafox = "metafox" arcade_metalb = "metalb" arcade_metalbj = "metalb" arcade_metamrph = "metamrph" arcade_metamrpha = "metamrph" arcade_metamrphe = "metamrph" arcade_metamrphj = "metamrph" arcade_metamrphu = "metamrph" arcade_metamrpj = "metamrph" arcade_meteor = "spcforce" arcade_metlclsh = "metlclsh" arcade_metlfrzr = "metlfrzr" arcade_metlhawk = "metlhawk" arcade_metlhawkj = "metlhawk" arcade_metlsavr = "metlsavr" arcade_metmqstr = "metmqstr" arcade_metrocra = "metrocrs" arcade_metrocrs = "metrocrs" arcade_metrocrsa = "metrocrs" arcade_mexico86 = "kicknrun" arcade_mfunclub = "mfunclub" arcade_mgakuen = "mgakuen" arcade_mgakuen2 = "mgakuen2" arcade_mgcldate = "mgcldate" arcade_mgcldtea = "mgcldate" arcade_mgcrystj = "mgcrystl" arcade_mgcrystl = "mgcrystl" arcade_mgcrystlj = "mgcrystl" arcade_mgcrystlo = "mgcrystl" arcade_mgmen89 = "mgmen89" arcade_mhavoc = "mhavoc" arcade_mhavoc2 = "mhavoc" arcade_mhavocp = "mhavoc" arcade_mhavocrv = "mhavoc" arcade_mhgaiden = "mhgaiden" arcade_mia = "mia" arcade_mia2 = "mia" arcade_miaj = "mia" arcade_midres = "midres" arcade_midresbj = "midres" arcade_midresj = "midres" arcade_midresu = "midres" arcade_miexchng = "miexchng" arcade_mightguy = "mightguy" arcade_mightybj = "mightybj" arcade_mikie = "mikie" arcade_mikiehs = "mikie" arcade_mikiej = "mikie" arcade_milliped = "milliped" arcade_millpac = "centiped" arcade_mimonkey = "mimonkey" arcade_mimonsco = "mimonkey" arcade_mimonscr = "mimonkey" arcade_mimonscra = "mimonkey" arcade_minasan = "minasan" arcade_minefld = "minefld" arcade_mineswpr = "mineswpr" arcade_minferno = "minferno" arcade_minigol2 = "minigolf" arcade_minigolf = "minigolf" arcade_minivadr = "minivadr" arcade_mirax = "mirax" arcade_miraxa = "mirax" arcade_mirninja = "mirninja" arcade_missb2 = "bublbobl" arcade_missile = "missile" arcade_missile2 = "missile" arcade_missmw96 = "missw96" arcade_missw02 = "missw02" arcade_missw96 = "missw96" arcade_missw96a = "missw96" arcade_missw96b = "missw96" arcade_missw96c = "missw96" arcade_mizubaku = "liquidk" arcade_mj4simai = "mj4simai" arcade_mjanbari = "mjanbari" arcade_mjangels = "mjangels" arcade_mjcamera = "mjcamera" arcade_mjclinic = "mjclinic" arcade_mjderngr = "mjderngr" arcade_mjdialq2 = "mjdialq2" arcade_mjdiplob = "mjdiplob" arcade_mjegolf = "mjegolf" arcade_mjfocus = "mjfocus" arcade_mjfocusm = "mjfocus" arcade_mjfriday = "mjfriday" arcade_mjgottsu = "mjgottsu" arcade_mjgtaste = "mjgtaste" arcade_mjhokite = "mjhokite" arcade_mjifb = "mjifb" arcade_mjikaga = "mjikaga" arcade_mjkinjas = "mjkinjas" arcade_mjkjidai = "mjkjidai" arcade_mjkoiura = "mjkoiura" arcade_mjkojink = "mjkojink" arcade_mjlaman = "mjlaman" arcade_mjleague = "mjleague" arcade_mjlstory = "mjlstory" arcade_mjnanpaa = "mjnanpas" arcade_mjnanpas = "mjnanpas" arcade_mjnanpau = "mjnanpas" arcade_mjnatsu = "mjnatsu" arcade_mjnquesb = "mjnquest" arcade_mjnquest = "mjnquest" arcade_mjnquestb = "mjnquest" arcade_mjsikakb = "mjsikaku" arcade_mjsikaku = "mjsikaku" arcade_mjsister = "mjsister" arcade_mjuraden = "mjuraden" arcade_mjyougo = "mjyougo" arcade_mjyuugi = "mjyuugi" arcade_mjyuugia = "mjyuugi" arcade_mjzoomin = "mjzoomin" arcade_mk = "mk" arcade_mk2 = "mk2" arcade_mk2chal = "mk2" arcade_mk2r14 = "mk2" arcade_mk2r21 = "mk2" arcade_mk2r32 = "mk2" arcade_mk2r42 = "mk2" arcade_mk2r91 = "mk2" arcade_mk3 = "mk3" arcade_mk3r10 = "mk3" arcade_mk3r20 = "mk3" arcade_mkeibaou = "mkeibaou" arcade_mkla1 = "mk" arcade_mkla2 = "mk" arcade_mkla3 = "mk" arcade_mkla4 = "mk" arcade_mkprot9 = "mk" arcade_mkr4 = "mk" arcade_mladyhtr = "mladyhtr" arcade_mltiwars = "uniwars" arcade_mmagic = "mmagic" arcade_mmancp2u = "megaman" arcade_mmancp2ur1 = "megaman" arcade_mmatrix = "mmatrix" arcade_mmatrixd = "mmatrix" arcade_mmatrixj = "mmatrix" arcade_mmaulers = "mmaulers" arcade_mmaze = "mmaze" arcade_mmaze2 = "mmaze" arcade_mmcamera = "mjcamera" arcade_mmehyou = "mmehyou" arcade_mmonkey = "mmonkey" arcade_mmpanic = "mmpanic" arcade_mnchmobl = "joyfulr" arcade_mnight = "mnight" arcade_mnightj = "mnight" arcade_moegonta = "ladykill" arcade_mofflott = "mofflott" arcade_moguchan = "moguchan" arcade_mogura = "mogura" arcade_mole = "mole" arcade_momoko = "momoko" arcade_momokob = "momoko" arcade_momokoe = "momoko" arcade_monkelf = "avspirit" arcade_monkeyd = "ckong" arcade_monsterb = "monsterb" arcade_monsterz = "monsterz" arcade_montecar = "montecar" arcade_monymony = "monymony" arcade_moo = "moo" arcade_moobl = "moo" arcade_moomesa = "moomesa" arcade_moomesaaab = "moomesa" arcade_moomesabl = "moomesa" arcade_moomesauab = "moomesa" arcade_moomesauac = "moomesa" arcade_moonal2 = "moonal2" arcade_moonal2b = "moonal2" arcade_moonaln = "galaxian" arcade_moonbase = "invadpt2" arcade_mooncmw = "mooncrst" arcade_mooncptc = "mooncrst" arcade_mooncreg = "mooncrst" arcade_mooncrgx = "mooncrst" arcade_mooncrs2 = "mooncrst" arcade_mooncrs3 = "mooncrst" arcade_mooncrs4 = "mooncrst" arcade_mooncrsa = "mooncrst" arcade_mooncrsb = "mooncrst" arcade_mooncrsg = "mooncrst" arcade_mooncrsl = "mooncrst" arcade_mooncrst = "mooncrst" arcade_mooncrstg = "mooncrst" arcade_mooncrsto = "mooncrst" arcade_mooncrstso = "mooncrst" arcade_mooncrstu = "mooncrst" arcade_mooncrstuk = "mooncrst" arcade_mooncrstuku = "mooncrst" arcade_mooncrsu = "mooncrst" arcade_moonqsr = "moonqsr" arcade_moonwalk = "moonwalk" arcade_moonwar = "moonwar" arcade_moonwara = "moonwar" arcade_moonwlka = "moonwalk" arcade_moonwlkb = "moonwalk" arcade_mooua = "moo" arcade_moremore = "moremore" arcade_moremorp = "moremorp" arcade_mosaic = "mosaic" arcade_mosaica = "mosaic" arcade_moshougi = "moshougi" arcade_mosyougi = "mosyougi" arcade_motofren = "motofren" arcade_motorace = "travrusa" arcade_motos = "motos" arcade_mototour = "travrusa" arcade_mouja = "mouja" arcade_mouser = "mouser" arcade_mouserc = "mouser" arcade_mp_gaxe2 = "mp_gaxe2" arcade_mp_sonic = "mp_sonic" arcade_mpang = "mpang" arcade_mpangj = "mpang" arcade_mpangjd = "mpang" arcade_mpangr1 = "mpang" arcade_mpangu = "mpang" arcade_mpatrol = "mpatrol" arcade_mpatrolw = "mpatrol" arcade_mplanets = "mplanets" arcade_mplanetsuk = "mplanets" arcade_mplanuk = "mplanets" arcade_mrdo = "mrdo" arcade_mrdofix = "mrdo" arcade_mrdot = "mrdo" arcade_mrdoy = "mrdo" arcade_mrdrillr = "mrdrillr" arcade_mrdrilr2 = "mrdrilr2" arcade_mrdu = "mrdo" arcade_mrflea = "mrflea" arcade_mrgoemon = "mrgoemon" arcade_mrheli = "bchopper" arcade_mrjong = "mrjong" arcade_mrkougar = "mrkougar" arcade_mrkougar2 = "mrkougar" arcade_mrkougb = "mrkougar" arcade_mrkougb2 = "mrkougar" arcade_mrkougr2 = "mrkougar" arcade_mrlo = "mrdo" arcade_mrokumei = "mrokumei" arcade_mrtnt = "mrtnt" arcade_mrviking = "mrviking" arcade_mrvikingj = "mrviking" arcade_mrvikngj = "mrviking" arcade_ms4plus = "mslug4" arcade_ms5pcb = "ms5pcb" arcade_ms5plus = "mslug5" arcade_msbingo = "msbingo" arcade_mschamp = "mspacman" arcade_mschamps = "mspacman" arcade_mscoutm = "mscoutm" arcade_msgogo = "msgogo" arcade_msgunda1 = "msgundam" arcade_msgundam = "msgundam" arcade_msgundam1 = "msgundam" arcade_msh = "msh" arcade_msha = "msh" arcade_mshb = "msh" arcade_mshbr1 = "msh" arcade_msheartb = "mspacman" arcade_mshh = "msh" arcade_mshj = "msh" arcade_mshjr1 = "msh" arcade_mshu = "msh" arcade_mshud = "msh" arcade_mshuttle = "mshuttle" arcade_mshuttle2 = "mshuttle" arcade_mshuttlea = "mshuttle" arcade_mshuttlej = "mshuttle" arcade_mshuttlej2 = "mshuttle" arcade_mshuttlj = "mshuttle" arcade_mshvsf = "mshvsf" arcade_mshvsfa = "mshvsf" arcade_mshvsfa1 = "mshvsf" arcade_mshvsfb = "mshvsf" arcade_mshvsfb1 = "mshvsf" arcade_mshvsfh = "mshvsf" arcade_mshvsfj = "mshvsf" arcade_mshvsfj1 = "mshvsf" arcade_mshvsfj2 = "mshvsf" arcade_mshvsfu = "mshvsf" arcade_mshvsfu1 = "mshvsf" arcade_mshvsfu1d = "mshvsf" arcade_msisaac = "msisaac" arcade_msjiken = "msjiken" arcade_mslider = "mslider" arcade_mslug = "mslug" arcade_mslug2 = "mslug2" arcade_mslug2t = "mslug2" arcade_mslug3 = "mslug3" arcade_mslug3b6 = "mslug3" arcade_mslug3h = "mslug3" arcade_mslug3n = "mslug3" arcade_mslug3v = "mslug3" arcade_mslug4 = "mslug4" arcade_mslug4h = "mslug4" arcade_mslug5 = "mslug5" arcade_mslug5b = "mslug5" arcade_mslug5h = "mslug5" arcade_mslug5w = "mslug5" arcade_mslugx = "mslugx" arcade_mspacmab = "mspacman" arcade_mspacman = "mspacman" arcade_mspacmanbcc = "mspacman" arcade_mspacmanbg = "mspacman" arcade_mspacmanbgd = "mspacman" arcade_mspacmanbhe = "mspacman" arcade_mspacmanblt = "mspacman" arcade_mspacmat = "mspacman" arcade_mspacmbe = "mspacman" arcade_mspacmnf = "mspacman" arcade_mspacpls = "mspacman" arcade_mspuzzle = "mspuzzle" arcade_mspuzzleg = "gumbo" arcade_mspuzzlen = "mspuzzle" arcade_mstadium = "bottom9" arcade_mstworld = "mstworld" arcade_msword = "msword" arcade_mswordj = "msword" arcade_mswordr1 = "msword" arcade_mswordu = "msword" arcade_msx_007tld = "msx_007tld" arcade_msx_10yard = "msx_10yard" arcade_msx_10yarda = "msx_10yard" arcade_msx_180 = "msx_180" arcade_msx_1942 = "msx_1942" arcade_msx_1942a = "msx_1942" arcade_msx_1942k = "msx_1942" arcade_msx_3dragon = "msx_3dragon" arcade_msx_a1spirit = "msx_f1spirit" arcade_msx_aaargh = "msx_aaargh" arcade_msx_abadcrim = "msx_abadcrim" arcade_msx_abusimbel = "msx_abusimbel" arcade_msx_actman = "msx_actman" arcade_msx_actmana = "msx_actman" arcade_msx_addictbl = "msx_addictbl" arcade_msx_adel = "msx_adel" arcade_msx_ae = "msx_ae" arcade_msx_afteroids = "msx_afteroids" arcade_msx_albatros = "msx_albatros" arcade_msx_albatrosa = "msx_albatros" arcade_msx_alehop = "msx_alehop" arcade_msx_alibaba = "msx_alibaba" arcade_msx_alibabaa = "msx_alibaba" arcade_msx_alibabab = "msx_alibaba" arcade_msx_alien8 = "msx_alien8" arcade_msx_alien8h = "msx_alien8" arcade_msx_aliens = "msx_aliens" arcade_msx_aliensa = "msx_aliens" arcade_msx_aliensb = "msx_aliens" arcade_msx_alphablaster = "msx_alphablaster" arcade_msx_alpineski = "msx_alpineski" arcade_msx_alteredbeast = "msx_alteredbeast" arcade_msx_alterego = "msx_alterego" arcade_msx_amc = "msx_amc" arcade_msx_amomundo = "msx_amomundo" arcade_msx_amotopuf = "msx_amotopuf" arcade_msx_amtrucka = "msx_amtrucka" arcade_msx_amurisus = "msx_amurisus" arcade_msx_anaza = "msx_anaza" arcade_msx_angelo = "msx_angelo" arcade_msx_angeloa = "msx_angelo" arcade_msx_antarct = "msx_antarct" arcade_msx_antarcta = "msx_antarct" arcade_msx_antarctj = "msx_antarct" arcade_msx_antarctk = "msx_antarct" arcade_msx_anty = "msx_anty" arcade_msx_antya = "msx_anty" arcade_msx_apeman = "msx_apeman" arcade_msx_aquasos = "msx_aquasos" arcade_msx_aquatack = "msx_aquatack" arcade_msx_aramo = "msx_aramo" arcade_msx_arkanoid = "msx_arkanoid" arcade_msx_arkanoida = "msx_arkanoid" arcade_msx_arkanoidj = "msx_arkanoid" arcade_msx_arkanoidja = "msx_arkanoid" arcade_msx_arkanoidk = "msx_arkanoid" arcade_msx_armymove = "msx_armymove" arcade_msx_aroid = "msx_aroid" arcade_msx_aroida = "msx_aroid" arcade_msx_astrobls = "msx_astrobls" arcade_msx_astroplm = "msx_astroplm" arcade_msx_athland = "msx_athland" arcade_msx_athlanda = "msx_athland" arcade_msx_athlandp = "msx_athland" arcade_msx_athlball = "msx_athlball" arcade_msx_atsarias = "msx_atsarias" arcade_msx_awmonty = "msx_awmonty" arcade_msx_backgamj = "msx_backgamj" arcade_msx_backgamja = "msx_backgamj" arcade_msx_backtof = "msx_backtof" arcade_msx_backtofa = "msx_backtof" arcade_msx_baduk = "msx_baduk" arcade_msx_balance = "msx_balance" arcade_msx_balance1 = "msx_balance" arcade_msx_balance2 = "msx_balance" arcade_msx_ballblzr = "msx_ballblzr" arcade_msx_balloonpunch = "msx_balloonpunch" arcade_msx_banana = "msx_banana" arcade_msx_bankp = "msx_bankp" arcade_msx_bankpa = "msx_bankp" arcade_msx_bankpk = "msx_bankp" arcade_msx_barb = "msx_barb" arcade_msx_barb2 = "msx_barb2" arcade_msx_barnstrm = "msx_barnstrm" arcade_msx_batman = "msx_batman" arcade_msx_batman10 = "msx_batman" arcade_msx_batmanmv = "msx_batmanmv" arcade_msx_battlex = "msx_battlex" arcade_msx_bcquest = "msx_bcquest" arcade_msx_bcquesta = "msx_bcquest" arcade_msx_bdash = "msx_bdash" arcade_msx_bdash2 = "msx_bdash2" arcade_msx_beachead = "msx_beachead" arcade_msx_beamridr = "msx_beamridr" arcade_msx_becky = "msx_becky" arcade_msx_beckya = "msx_becky" arcade_msx_beckyb = "msx_becky" arcade_msx_beeflowr = "msx_beeflowr" arcade_msx_beeflowra = "msx_beeflowr" arcade_msx_beeflowrb = "msx_beeflowr" arcade_msx_bestwarr = "msx_bestwarr" arcade_msx_betiled = "msx_betiled" arcade_msx_binarylnd = "msx_binarylnd" arcade_msx_bitlogic = "msx_bitlogic" arcade_msx_blackbeard = "msx_blackbeard" arcade_msx_blagger = "msx_blagger" arcade_msx_blaggerenh = "msx_blaggerenh" arcade_msx_blckony2 = "msx_blckony2" arcade_msx_blckonyx = "msx_blckonyx" arcade_msx_blockhol = "msx_blockhol" arcade_msx_blockrun = "msx_blockrun" arcade_msx_bloody = "msx_bloody" arcade_msx_blowup = "msx_blowup" arcade_msx_bmxsim = "msx_bmxsim" arcade_msx_boggy84 = "msx_boggy84" arcade_msx_boggy84a = "msx_boggy84" arcade_msx_boggy84b = "msx_boggy84" arcade_msx_boing2 = "msx_boing2" arcade_msx_bokosuka = "msx_bokosuka" arcade_msx_bokosukaa = "msx_bokosuka" arcade_msx_bold = "msx_bold" arcade_msx_bombking = "msx_bombking" arcade_msx_bombman = "msx_bombman" arcade_msx_bombmank1 = "msx_bombman" arcade_msx_bombmank2 = "msx_bombman" arcade_msx_bombmnsp = "msx_bombmnsp" arcade_msx_boogie = "msx_boogie" arcade_msx_boogie1 = "msx_boogie" arcade_msx_boogie2 = "msx_boogie" arcade_msx_boomrang = "msx_boomrang" arcade_msx_boomranga = "msx_boomrang" arcade_msx_booty = "msx_booty" arcade_msx_bop = "msx_bop" arcade_msx_borfes = "msx_borfes" arcade_msx_bosco = "msx_bosco" arcade_msx_boscoa = "msx_bosco" arcade_msx_boscob = "msx_bosco" arcade_msx_bounce = "msx_bounce" arcade_msx_bounder = "msx_bounder" arcade_msx_bousousos = "msx_bousousos" arcade_msx_bousousosa = "msx_bousousos" arcade_msx_breaker = "msx_breaker" arcade_msx_breakinj = "msx_breakinj" arcade_msx_breakout = "msx_breakout" arcade_msx_breakoutt = "msx_breakoutt" arcade_msx_britishbob = "msx_britishbob" arcade_msx_bronx = "msx_bronx" arcade_msx_brosadv = "msx_brosadv" arcade_msx_brosadva = "msx_brosadv" arcade_msx_brucelee = "msx_brucelee" arcade_msx_btanuki = "msx_btanuki" arcade_msx_btanukia = "msx_btanuki" arcade_msx_btanukib = "msx_btanuki" arcade_msx_btime = "msx_btime" arcade_msx_bubbler = "msx_bubbler" arcade_msx_buckrog = "msx_buckrog" arcade_msx_bullmigt = "msx_bullmigt" arcade_msx_bumpy = "msx_bumpy" arcade_msx_butampan = "msx_butampan" arcade_msx_butampana = "msx_butampan" arcade_msx_butampanb = "msx_butampan" arcade_msx_buzzoff = "msx_buzzoff" arcade_msx_cabbagep = "msx_cabbagep" arcade_msx_cabbagepa = "msx_cabbagep" arcade_msx_cabbagepk = "msx_cabbagep" arcade_msx_camelotw = "msx_camelotw" arcade_msx_candoon = "msx_candoon" arcade_msx_candoona = "msx_candoon" arcade_msx_cannonbl = "msx_cannonbl" arcade_msx_cannonbla = "msx_cannonbl" arcade_msx_cannonfgt = "msx_cannonfgt" arcade_msx_cannont = "msx_cannont" arcade_msx_caos = "msx_caos" arcade_msx_captchef = "msx_captchef" arcade_msx_carfight = "msx_carfight" arcade_msx_carjamb = "msx_carjamb" arcade_msx_carjamba = "msx_carjamb" arcade_msx_carrace = "msx_carrace" arcade_msx_carracea = "msx_carrace" arcade_msx_carraceb = "msx_carrace" arcade_msx_castle = "msx_castle" arcade_msx_castlek = "msx_castle" arcade_msx_castlex = "msx_castlex" arcade_msx_castlexa = "msx_castlex" arcade_msx_caverns = "msx_caverns" arcade_msx_cbilliar = "msx_cbilliar" arcade_msx_chackn = "msx_chackn" arcade_msx_chackna = "msx_chackn" arcade_msx_champbox = "msx_champbox" arcade_msx_champice = "msx_champice" arcade_msx_champken = "msx_champken" arcade_msx_champkena = "msx_champken" arcade_msx_champpwr = "msx_champpwr" arcade_msx_champpwra = "msx_champpwr" arcade_msx_champpwrb = "msx_champpwr" arcade_msx_champscr = "msx_champscr" arcade_msx_chess = "msx_chess" arcade_msx_chicken = "msx_chicken" arcade_msx_chickfighter = "msx_chickfighter" arcade_msx_chiller = "msx_chiller" arcade_msx_chima = "msx_chima" arcade_msx_choplift = "msx_choplift" arcade_msx_choplifta = "msx_choplift" arcade_msx_chopliftb = "msx_choplift" arcade_msx_chopper1 = "msx_chopper1" arcade_msx_choroq = "msx_choroq" arcade_msx_choroqa = "msx_choroq" arcade_msx_choroqk = "msx_choroq" arcade_msx_chubbygristle = "msx_chubbygristle" arcade_msx_chuckie = "msx_chuckie" arcade_msx_chuheib1 = "msx_chuheib1" arcade_msx_circusc = "msx_circusc" arcade_msx_citycon = "msx_citycon" arcade_msx_citycona = "msx_citycon" arcade_msx_clapton2 = "msx_clapton2" arcade_msx_clapton2a = "msx_clapton2" arcade_msx_cloderun = "msx_cloderun" arcade_msx_cnyumon = "msx_cnyumon" arcade_msx_coastrac = "msx_coastrac" arcade_msx_coastraca = "msx_coastrac" arcade_msx_coastracb = "msx_coastrac" arcade_msx_colball = "msx_colball" arcade_msx_colballa = "msx_colball" arcade_msx_colballb = "msx_colball" arcade_msx_colony = "msx_colony" arcade_msx_colt36 = "msx_colt36" arcade_msx_cometail = "msx_cometail" arcade_msx_comicbak = "msx_comicbak" arcade_msx_comicbaka = "msx_comicbak" arcade_msx_comicbakb = "msx_comicbak" arcade_msx_condori = "msx_condori" arcade_msx_condoria = "msx_condori" arcade_msx_condorib = "msx_condori" arcade_msx_confused = "msx_confused" arcade_msx_congobongo = "msx_congobongo" arcade_msx_corsarios = "msx_corsarios" arcade_msx_cosanost = "msx_cosanost" arcade_msx_cosmo = "msx_cosmo" arcade_msx_cosmoa = "msx_cosmo" arcade_msx_cosmoexp = "msx_cosmoexp" arcade_msx_cosmoexpa = "msx_cosmoexp" arcade_msx_cow = "msx_cow" arcade_msx_cpachi = "msx_cpachi" arcade_msx_craze = "msx_craze" arcade_msx_crazy = "msx_crazy" arcade_msx_crazybul = "msx_crazybul" arcade_msx_crazycar = "msx_crazycar" arcade_msx_crazytrn = "msx_crazytrn" arcade_msx_crazytrna = "msx_crazytrn" arcade_msx_crossblm = "msx_crossblm" arcade_msx_crusader = "msx_crusader" arcade_msx_crusadera = "msx_crusader" arcade_msx_crusaderb = "msx_crusader" arcade_msx_crusaderk = "msx_crusader" arcade_msx_csainz = "msx_csainz" arcade_msx_csheriff = "msx_csheriff" arcade_msx_cso = "msx_cso" arcade_msx_csok = "msx_cso" arcade_msx_ctrueno = "msx_ctrueno" arcade_msx_cyberbig = "msx_cyberbig" arcade_msx_cyberun = "msx_cyberun" arcade_msx_cyborgz = "msx_cyborgz" arcade_msx_daidasso = "msx_daidasso" arcade_msx_daiva4 = "msx_daiva4" arcade_msx_dambustr = "msx_dambustr" arcade_msx_dambustra = "msx_dambustr" arcade_msx_dangerx4 = "msx_dangerx4" arcade_msx_dangerx4a = "msx_dangerx4" arcade_msx_dangerx4b = "msx_dangerx4" arcade_msx_dawnpatr = "msx_dawnpatr" arcade_msx_dcrystal = "msx_dcrystal" arcade_msx_dday = "msx_dday" arcade_msx_ddaya = "msx_dday" arcade_msx_ddayb = "msx_dday" arcade_msx_ddayc = "msx_dday" arcade_msx_ddayk = "msx_dday" arcade_msx_ddragon = "msx_ddragon" arcade_msx_deathwish3 = "msx_deathwish3" arcade_msx_decathln = "msx_decathln" arcade_msx_deepdng = "msx_deepdng" arcade_msx_deepdng2 = "msx_deepdng2" arcade_msx_deepdun = "msx_deepdun" arcade_msx_demoncrystl = "msx_demoncrystl" arcade_msx_demonia = "msx_demonia" arcade_msx_desolatr = "msx_desolatr" arcade_msx_destroyr = "msx_destroyr" arcade_msx_devilhvn = "msx_devilhvn" arcade_msx_digdug = "msx_digdug" arcade_msx_digduga = "msx_digdug" arcade_msx_dinosour = "msx_dinosour" arcade_msx_dipdip = "msx_dipdip" arcade_msx_discwarr = "msx_discwarr" arcade_msx_dngnhntr = "msx_dngnhntr" arcade_msx_dninja = "msx_dninja" arcade_msx_dogfight = "msx_dogfight" arcade_msx_dokidoki = "msx_dokidoki" arcade_msx_dokidokia = "msx_dokidoki" arcade_msx_dooly = "msx_dooly" arcade_msx_doordoor = "msx_doordoor" arcade_msx_dorodon = "msx_dorodon" arcade_msx_dota = "msx_dota" arcade_msx_dotaa = "msx_dota" arcade_msx_dquest = "msx_dquest" arcade_msx_dquest2 = "msx_dquest2" arcade_msx_dquest2a = "msx_dquest" arcade_msx_drainer = "msx_drainer" arcade_msx_drgnatck = "msx_drgnatck" arcade_msx_drgnatcka = "msx_drgnatck" arcade_msx_drillertnk = "msx_drillertnk" arcade_msx_drome = "msx_drome" arcade_msx_druaga = "msx_druaga" arcade_msx_dskeiba = "msx_dskeiba" arcade_msx_dslayer = "msx_dslayer" arcade_msx_dslayer4 = "msx_dslayer4" arcade_msx_dunkshot = "msx_dunkshot" arcade_msx_dunkshota = "msx_dunkshot" arcade_msx_dynabowl = "msx_dynabowl" arcade_msx_dynadan = "msx_dynadan" arcade_msx_eagle5 = "msx_eagle5" arcade_msx_eaglefgt = "msx_eaglefgt" arcade_msx_eaglefgta = "msx_eaglefgt" arcade_msx_eatblue = "msx_eatblue" arcade_msx_eatit = "msx_eatit" arcade_msx_eggerlnd = "msx_eggerlnd" arcade_msx_elevator = "msx_elevator" arcade_msx_empcity = "msx_empcity" arcade_msx_empcitya = "msx_empcity" arcade_msx_exainnov = "msx_exainnov" arcade_msx_exainnov1 = "msx_exainnov" arcade_msx_exchangr = "msx_exchangr" arcade_msx_exchangra = "msx_exchangr" arcade_msx_exerion = "msx_exerion" arcade_msx_exerion2 = "msx_exerion2" arcade_msx_exerion2a = "msx_exerion2" arcade_msx_exeriona = "msx_exerion" arcade_msx_exerionb = "msx_exerion" arcade_msx_exerionk = "msx_exerion" arcade_msx_exoidez = "msx_exoidez" arcade_msx_exoidez5 = "msx_exoidez5" arcade_msx_exoidez5k = "msx_exoidez5" arcade_msx_exoideza = "msx_exoidez" arcade_msx_exoidezb = "msx_exoidez" arcade_msx_extermin = "msx_extermin" arcade_msx_f1spirit = "msx_f1spirit" arcade_msx_f1spirita = "msx_f1spirit" arcade_msx_f1spiritk = "msx_f1spirit" arcade_msx_factory = "msx_factory" arcade_msx_fairy = "msx_fairy" arcade_msx_fantzone = "msx_fantzone" arcade_msx_fantzonek = "msx_fantzone" arcade_msx_fatetris = "msx_fatetris" arcade_msx_fatetrisa = "msx_fatetris" arcade_msx_fatetrisb = "msx_fatetris" arcade_msx_fathom = "msx_fathom" arcade_msx_feud = "msx_feud" arcade_msx_ffruit = "msx_ffruit" arcade_msx_findkeep = "msx_findkeep" arcade_msx_firehawk = "msx_firehawk" arcade_msx_fireresc = "msx_fireresc" arcade_msx_fireresca = "msx_fireresc" arcade_msx_fjustice = "msx_fjustice" arcade_msx_fjusticea = "msx_fjustice" arcade_msx_fjusticeb = "msx_fjustice" arcade_msx_flappy = "msx_flappy" arcade_msx_flappy85 = "msx_flappy85" arcade_msx_flappya = "msx_flappy" arcade_msx_flashgor = "msx_flashgor" arcade_msx_flicky = "msx_flicky" arcade_msx_flideck = "msx_flideck" arcade_msx_flidecka = "msx_flideck" arcade_msx_flipper = "msx_flipper" arcade_msx_flippera = "msx_flipper" arcade_msx_flstory = "msx_flstory" arcade_msx_flstorya = "msx_flstory" arcade_msx_formatz = "msx_formatz" arcade_msx_formatza = "msx_formatz" arcade_msx_fpoint = "msx_fpoint" arcade_msx_fpointa = "msx_fpoint" arcade_msx_frogger = "msx_frogger" arcade_msx_froggera = "msx_frogger" arcade_msx_frontlin = "msx_frontlin" arcade_msx_frontlina = "msx_frontlin" arcade_msx_frontlinb = "msx_frontlin" arcade_msx_fruitpanic = "msx_fruitpanic" arcade_msx_fruitsrc = "msx_fruitsrc" arcade_msx_fruitsrca = "msx_fruitsrc" arcade_msx_fsim = "msx_fsim" arcade_msx_fsplash = "msx_fsplash" arcade_msx_funmouse = "msx_funmouse" arcade_msx_fzone = "msx_fzone" arcade_msx_fzonek = "msx_fzone" arcade_msx_gabalin = "msx_gabalin" arcade_msx_gabalina = "msx_gabalin" arcade_msx_galaga = "msx_galaga" arcade_msx_galaxia = "msx_galaxia" arcade_msx_galaxian = "msx_galaxian" arcade_msx_galaxiana = "msx_galaxian" arcade_msx_galaxianb = "msx_galaxian" arcade_msx_galforce = "msx_galforce" arcade_msx_galforcea = "msx_galforce" arcade_msx_gambler = "msx_gambler" arcade_msx_gameover = "msx_gameover" arcade_msx_gameovr2 = "msx_gameovr2" arcade_msx_gangman = "msx_gangman" arcade_msx_gangmanj = "msx_gangman" arcade_msx_gauntlet = "msx_gauntlet" arcade_msx_gberet = "msx_gberet" arcade_msx_gbereta = "msx_gberet" arcade_msx_gberetk = "msx_gberet" arcade_msx_genesis = "msx_genesis" arcade_msx_ggeftsdp = "msx_ggeftsdp" arcade_msx_ghost = "msx_ghost" arcade_msx_ghostbs2 = "msx_ghostbs2" arcade_msx_ghostbst = "msx_ghostbst" arcade_msx_glass = "msx_glass" arcade_msx_glider = "msx_glider" arcade_msx_glidera = "msx_glider" arcade_msx_godzikun = "msx_godzikun" arcade_msx_godzikuna = "msx_godzikun" arcade_msx_godzilla = "msx_godzilla" arcade_msx_godzillaa = "msx_godzilla" arcade_msx_gokiburi = "msx_gokiburi" arcade_msx_golfgame = "msx_golfgame" arcade_msx_golvell = "msx_golvell" arcade_msx_gommy = "msx_gommy" arcade_msx_gomokuna = "msx_gomokuna" arcade_msx_gomokunaa = "msx_gomokuna" arcade_msx_gonzzalezz = "msx_gonzzalezz" arcade_msx_goody = "msx_goody" arcade_msx_goonies = "msx_goonies" arcade_msx_gooniesa = "msx_goonies" arcade_msx_gooniesb = "msx_goonies" arcade_msx_gpworld = "msx_gpworld" arcade_msx_gradius = "msx_gradius" arcade_msx_gradius2 = "msx_gradius2" arcade_msx_gradius2a = "msx_gradius2" arcade_msx_gradius2d = "msx_gradius2" arcade_msx_gradius2p = "msx_gradius2" arcade_msx_gradiusa = "msx_gradius" arcade_msx_gridtrap = "msx_gridtrap" arcade_msx_gridwars = "msx_gridwars" arcade_msx_griel = "msx_griel" arcade_msx_grielex = "msx_griel" arcade_msx_grogrev = "msx_grogrev" arcade_msx_grogreva = "msx_grogrev" arcade_msx_guardic = "msx_guardic" arcade_msx_guardica = "msx_guardic" arcade_msx_gulkave = "msx_gulkave" arcade_msx_gulkavea = "msx_gulkave" arcade_msx_gulkavek = "msx_gulkave" arcade_msx_gundam = "msx_gundam" arcade_msx_gundama = "msx_gundam" arcade_msx_gundamk = "msx_gundam" arcade_msx_gunfrght = "msx_gunfrght" arcade_msx_gunfrghta = "msx_gunfrght" arcade_msx_gunsmoke = "msx_gunsmoke" arcade_msx_guttblst = "msx_guttblst" arcade_msx_gyroadv = "msx_gyroadv" arcade_msx_gyrodine = "msx_gyrodine" arcade_msx_gyrodinek = "msx_gyrodine" arcade_msx_gyruss = "msx_gyruss" arcade_msx_habilit = "msx_habilit" arcade_msx_hades = "msx_hades" arcade_msx_hadesa = "msx_hades" arcade_msx_hammboy = "msx_hammboy" arcade_msx_hangon = "msx_hangon" arcade_msx_hangona = "msx_hangon" arcade_msx_hangonb = "msx_hangon" arcade_msx_happyfret = "msx_happyfret" arcade_msx_harapeko = "msx_harapeko" arcade_msx_hardboil = "msx_hardboil" arcade_msx_headheels = "msx_headheels" arcade_msx_heatseek = "msx_heatseek" arcade_msx_heist = "msx_heist" arcade_msx_helitank = "msx_helitank" arcade_msx_hercules = "msx_hercules" arcade_msx_hero = "msx_hero" arcade_msx_heroesarena = "msx_heroesarena" arcade_msx_hfox = "msx_hfox" arcade_msx_hhouse = "msx_hhouse" arcade_msx_highway = "msx_highway" arcade_msx_highwayen = "msx_highwayen" arcade_msx_highwayk = "msx_highway" arcade_msx_hitsuji = "msx_hitsuji" arcade_msx_hnchback = "msx_hnchback" arcade_msx_holein1 = "msx_holein1" arcade_msx_holein1a = "msx_holein1" arcade_msx_holein1b = "msx_holein1" arcade_msx_holein1c = "msx_holein1" arcade_msx_holein1p = "msx_holein1p" arcade_msx_holein1pa = "msx_holein1p" arcade_msx_hopper = "msx_hopper" arcade_msx_hostages = "msx_hostages" arcade_msx_hotshoe = "msx_hotshoe" arcade_msx_hundra = "msx_hundra" arcade_msx_hustle = "msx_hustle" arcade_msx_hustlea = "msx_hustle" arcade_msx_hustler = "msx_konbill" arcade_msx_hustlera = "msx_konbill" arcade_msx_hydlide = "msx_hydlide" arcade_msx_hydlide2 = "msx_hydlide2" arcade_msx_hydlide2a = "msx_hydlide2" arcade_msx_hydlide3 = "msx_hydlide3" arcade_msx_hype = "msx_hype" arcade_msx_hyperol1 = "msx_trackfld" arcade_msx_hyperol1k = "msx_trackfld" arcade_msx_hyperol2 = "msx_trackfl2" arcade_msx_hypersp2 = "msx_hypersp2" arcade_msx_hypersp2k = "msx_hypersp2" arcade_msx_hypersp3 = "msx_hypersp3" arcade_msx_hypersp3a = "msx_hypersp3" arcade_msx_hypersp3b = "msx_hypersp3" arcade_msx_hyperspt = "msx_hyperspt" arcade_msx_hyperspta = "msx_hyperspt" arcade_msx_hyperviper = "msx_hyperviper" arcade_msx_hyprally = "msx_hyprally" arcade_msx_hyprallya = "msx_hyprally" arcade_msx_hyprallyb = "msx_hyprally" arcade_msx_hyprallyc = "msx_hyprally" arcade_msx_icebreak = "msx_icebreak" arcade_msx_iceking = "msx_iceking" arcade_msx_iceworld = "msx_iceworld" arcade_msx_iganinp2 = "msx_iganinp2" arcade_msx_iganinpo = "msx_iganinpo" arcade_msx_ik = "msx_ik" arcade_msx_ilevan = "msx_ilevan" arcade_msx_inca = "msx_inca" arcade_msx_indianb = "msx_indianb" arcade_msx_indy = "msx_indy" arcade_msx_infernalminer = "msx_infernalminer" arcade_msx_inspecteurz = "msx_inspecteurz" arcade_msx_invasion = "msx_invasion" arcade_msx_invazm = "msx_invazm" arcade_msx_invrevenge = "msx_invrevenge" arcade_msx_issun = "msx_issun" arcade_msx_issuna = "msx_issun" arcade_msx_issunh = "msx_issun" arcade_msx_jackcity = "msx_jackcity" arcade_msx_jagur = "msx_jagur" arcade_msx_jagura = "msx_jagur" arcade_msx_jaws = "msx_jaws" arcade_msx_jetfight = "msx_jetfight" arcade_msx_jetpac = "msx_jetpac" arcade_msx_jetsetw = "msx_jetsetw" arcade_msx_jetsetwa = "msx_jetsetw" arcade_msx_jinj2 = "msx_jinj2" arcade_msx_joeblade = "msx_joeblade" arcade_msx_jpwinkle = "msx_jpwinkle" arcade_msx_jpwinklek = "msx_jpwinkle" arcade_msx_jrabbit = "msx_jrabbit" arcade_msx_jump = "msx_jump" arcade_msx_jumpcstr = "msx_jumpcstr" arcade_msx_jumping = "msx_jumping" arcade_msx_jumpjack = "msx_jumpjack" arcade_msx_jumpland = "msx_jumpland" arcade_msx_jungwarr = "msx_jungwarr" arcade_msx_junofrst = "msx_junofrst" arcade_msx_karamaru = "msx_karamaru" arcade_msx_keykaper = "msx_keykaper" arcade_msx_khazzad = "msx_khazzad" arcade_msx_kickit = "msx_kickit" arcade_msx_kickita = "msx_kickit" arcade_msx_killmice = "msx_killmice" arcade_msx_kingball = "msx_kingball" arcade_msx_kingballa = "msx_kingball" arcade_msx_kingkngt = "msx_kingkngt" arcade_msx_kingkngta = "msx_kingkngt" arcade_msx_kingkngtb = "msx_kingkngt" arcade_msx_kingleon = "msx_kingleon" arcade_msx_kingval = "msx_kingval" arcade_msx_kingval2 = "msx_kingval2" arcade_msx_kingvala = "msx_kingval" arcade_msx_kingvalb = "msx_kingval" arcade_msx_kingvalc = "msx_kingval" arcade_msx_kingvald = "msx_kingval" arcade_msx_kinnikum = "msx_kinnikum" arcade_msx_kinnikuma = "msx_kinnikum" arcade_msx_kinnikumk = "msx_kinnikum" arcade_msx_klax = "msx_klax" arcade_msx_knightlr = "msx_knightlr" arcade_msx_knightm2 = "msx_knightm2" arcade_msx_knightm2k = "msx_knightm2" arcade_msx_knightm3 = "msx_knightm3" arcade_msx_knightmr = "msx_knightmr" arcade_msx_knightmra = "msx_knightmr" arcade_msx_knightmrb = "msx_knightmr" arcade_msx_knightmrk = "msx_knightmr" arcade_msx_knithers = "msx_knithers" arcade_msx_knucklej = "msx_knucklej" arcade_msx_kobashi = "msx_kobashi" arcade_msx_koedoli = "msx_koedoli" arcade_msx_konbball = "msx_konbball" arcade_msx_konbballa = "msx_konbball" arcade_msx_konbill = "msx_konbill" arcade_msx_konboxin = "msx_konboxin" arcade_msx_konboxina = "msx_konboxin" arcade_msx_konboxinb = "msx_konboxin" arcade_msx_koneko = "msx_koneko" arcade_msx_konfootb = "msx_konfootb" arcade_msx_konfootba = "msx_konfootb" arcade_msx_konfootbb = "msx_konfootb" arcade_msx_kongolf = "msx_kongolf" arcade_msx_kongolfa = "msx_kongolf" arcade_msx_kongolfb = "msx_kongolf" arcade_msx_konsoccr = "msx_konfootb" arcade_msx_konsoccra = "msx_konfootb" arcade_msx_konsoccrb = "msx_konfootb" arcade_msx_konsoccrc = "msx_konfootb" arcade_msx_kontenn = "msx_kontenn" arcade_msx_kontenna = "msx_kontenn" arcade_msx_kontennk = "msx_kontenn" arcade_msx_krakout = "msx_krakout" arcade_msx_kungfum = "msx_kungfum" arcade_msx_kungfuma = "msx_kungfum" arcade_msx_kungfumb = "msx_kungfum" arcade_msx_kungfut = "msx_kungfut" arcade_msx_kungfuta = "msx_kungfut" arcade_msx_kungfutk = "msx_kungfut" arcade_msx_lacorona = "msx_lacorona" arcade_msx_laptick2 = "msx_laptick2" arcade_msx_lastmission = "msx_lastmission" arcade_msx_lazyjones = "msx_lazyjones" arcade_msx_ldrun = "msx_ldrun" arcade_msx_ldrun2 = "msx_ldrun2" arcade_msx_ldruna = "msx_ldrun" arcade_msx_legendk = "msx_legendk" arcade_msx_legendka = "msx_legendk" arcade_msx_legkage = "msx_legkage" arcade_msx_lic2kill = "msx_lic2kill" arcade_msx_lifefastln = "msx_lifefastln" arcade_msx_livingstone = "msx_livingstone" arcade_msx_livingstone2 = "msx_livingstone2" arcade_msx_lordover = "msx_lordover" arcade_msx_lorna = "msx_lorna" arcade_msx_lotlot = "msx_lotlot" arcade_msx_lotusf3 = "msx_lotusf3" arcade_msx_lunarbal = "msx_lunarbal" arcade_msx_m36 = "msx_m36" arcade_msx_macross = "msx_macross" arcade_msx_macrossa = "msx_macross" arcade_msx_magical = "msx_magical" arcade_msx_magtree = "msx_magtree" arcade_msx_magtreea = "msx_magtree" arcade_msx_malaika12 = "msx_malaika12" arcade_msx_malaikapq13 = "msx_malaikapq13" arcade_msx_manes = "msx_manes" arcade_msx_manesa = "msx_manes" arcade_msx_manesb = "msx_manes" arcade_msx_manicminer = "msx_manicminer" arcade_msx_mappy = "msx_mappy" arcade_msx_mappya = "msx_mappy" arcade_msx_mappyb = "msx_mappy" arcade_msx_marchen = "msx_marchen" arcade_msx_marinbat = "msx_marinbat" arcade_msx_mars2 = "msx_mars2" arcade_msx_martianoids = "msx_martianoids" arcade_msx_mask2 = "msx_mask2" arcade_msx_mask3 = "msx_mask3" arcade_msx_mastlamp = "msx_mastlamp" arcade_msx_maxima = "msx_maxima" arcade_msx_mayhem = "msx_mayhem" arcade_msx_mdroid = "msx_mdroid" arcade_msx_mecha8 = "msx_mecha8" arcade_msx_megalsos = "msx_megalsos" arcade_msx_megalsosa = "msx_megalsos" arcade_msx_megalsosb = "msx_megalsos" arcade_msx_megamit = "msx_megamit" arcade_msx_megamita = "msx_megamit" arcade_msx_meganova = "msx_meganova" arcade_msx_meikyusha = "msx_meikyusha" arcade_msx_menace = "msx_menace" arcade_msx_mgunjoe = "msx_mgunjoe" arcade_msx_midbros = "msx_midbros" arcade_msx_midbrosa = "msx_midbros" arcade_msx_midbuild = "msx_midbuild" arcade_msx_midway = "msx_midway" arcade_msx_mikie = "msx_mikie" arcade_msx_milkrace = "msx_milkrace" arcade_msx_mirai = "msx_mirai" arcade_msx_mitsumgt = "msx_mitsumgt" arcade_msx_mjdojo = "msx_mjdojo" arcade_msx_mkidwiz = "msx_mkidwiz" arcade_msx_mkidwiza = "msx_mkidwiz" arcade_msx_mkidwizb = "msx_mkidwiz" arcade_msx_mnstfair = "msx_mnstfair" arcade_msx_moaihiho = "msx_moaihiho" arcade_msx_moaihihok = "msx_moaihiho" arcade_msx_mokarima = "msx_mokarima" arcade_msx_molemol = "msx_molemol" arcade_msx_molemol2 = "msx_molemol2" arcade_msx_monkeyac = "msx_monkeyac" arcade_msx_monkeyaca = "msx_monkeyac" arcade_msx_monkeyacb = "msx_monkeyac" arcade_msx_monkeyacc = "msx_monkeyac" arcade_msx_monsterhunter = "msx_monsterhunter" arcade_msx_montanajohn = "msx_montanajohn" arcade_msx_moonridr = "msx_starbugg" arcade_msx_moonswep = "msx_moonswep" arcade_msx_mopirang = "msx_mopirang" arcade_msx_mopiranga = "msx_mopirang" arcade_msx_mopirangb = "msx_mopirang" arcade_msx_mopirangc = "msx_mopirang" arcade_msx_mopirangd = "msx_mopirang" arcade_msx_mopirangk = "msx_mopirang" arcade_msx_moritaot = "msx_moritaot" arcade_msx_mortadelo = "msx_mortadelo" arcade_msx_mortadelo2 = "msx_mortadelo2" arcade_msx_mosquiton = "msx_mosquiton" arcade_msx_mouser = "msx_mouser" arcade_msx_mpatrol = "msx_mpatrol" arcade_msx_mpatrolk = "msx_mpatrol" arcade_msx_mrchin = "msx_mrchin" arcade_msx_mrchink = "msx_mrchin" arcade_msx_mrcrack = "msx_mrcrack" arcade_msx_mrdo = "msx_mrdo" arcade_msx_mrdok = "msx_mrdo" arcade_msx_mrdovsun = "msx_mrdovsun" arcade_msx_mrdowild = "msx_mrdowild" arcade_msx_mrdowildh = "msx_mrdowild" arcade_msx_mrmole = "msx_mrmole" arcade_msx_mrwong = "msx_mrwong" arcade_msx_msx = "msx_msx" arcade_msx_msxbasic = "msx_msxbasic" arcade_msx_msxbbal2 = "msx_msxbbal2" arcade_msx_msxbball = "msx_msxbball" arcade_msx_msxbballa = "msx_msxbball" arcade_msx_msxrugby = "msx_msxrugby" arcade_msx_msxsoccr = "msx_msxsoccr" arcade_msx_msxsoccra = "msx_msxsoccr" arcade_msx_msxsoccrk = "msx_msxsoccr" arcade_msx_mtanks = "msx_mtanks" arcade_msx_mumonty = "msx_mumonty" arcade_msx_mundoper = "msx_mundoper" arcade_msx_mythos = "msx_mythos" arcade_msx_namake = "msx_namake" arcade_msx_nausicaa = "msx_nausicaa" arcade_msx_navymove = "msx_navymove" arcade_msx_nayade = "msx_nayade" arcade_msx_nemesis3 = "msx_nemesis3" arcade_msx_nemesis3a = "msx_nemesis3" arcade_msx_nemesis3b = "msx_nemesis3" arcade_msx_nightcity = "msx_nightcity" arcade_msx_nightshd = "msx_nightshd" arcade_msx_ninja2 = "msx_iganinp2" arcade_msx_ninjajaj = "msx_ninjajaj" arcade_msx_ninjajajk = "msx_ninjajaj" arcade_msx_ninjakag = "msx_ninjakag" arcade_msx_ninjakaga = "msx_ninjakag" arcade_msx_ninjakmb = "msx_ninjakmb" arcade_msx_ninjakun = "msx_ninjakun" arcade_msx_ninjapri = "msx_ninjapri" arcade_msx_ninjapria = "msx_ninjapri" arcade_msx_ninjasav = "msx_ninjasav" arcade_msx_nipper = "msx_nipper" arcade_msx_nipper2 = "msx_nipper2" arcade_msx_nkoshien = "msx_nkoshien" arcade_msx_nutsmilk = "msx_nutsmilk" arcade_msx_obliter = "msx_obliter" arcade_msx_oilswell = "msx_oilswell" arcade_msx_oilswella = "msx_oilswell" arcade_msx_omacfarm = "msx_omacfarm" arcade_msx_opwolf = "msx_opwolf" arcade_msx_othello = "msx_othello" arcade_msx_outroyd = "msx_outroyd" arcade_msx_oyotango = "msx_oyotango" arcade_msx_pachicom = "msx_pachicom" arcade_msx_pachicomk = "msx_pachicom" arcade_msx_pachiufo = "msx_pachiufo" arcade_msx_pacman = "msx_pacman" arcade_msx_pacmana = "msx_pacman" arcade_msx_pacmanb = "msx_pacman" arcade_msx_pacmania = "msx_pacmania" arcade_msx_paipanic = "msx_paipanic" arcade_msx_pairs = "msx_pairs" arcade_msx_pairsa = "msx_pairs" arcade_msx_panther = "msx_panther" arcade_msx_parodius = "msx_parodius" arcade_msx_parodiusa = "msx_parodius" arcade_msx_parodiuse = "msx_parodius" arcade_msx_pastfind = "msx_pastfind" arcade_msx_payload = "msx_payload" arcade_msx_peetan = "msx_peetan" arcade_msx_pegasus = "msx_pegasus" arcade_msx_pengadv = "msx_pengadv" arcade_msx_pengadvk1 = "msx_pengadv" arcade_msx_pengadvk2 = "msx_pengadv" arcade_msx_pengmind = "msx_pengmind" arcade_msx_penguincafe = "msx_penguincafe" arcade_msx_penguinw = "msx_penguinw" arcade_msx_penguinwk = "msx_penguinw" arcade_msx_pentagram = "msx_pentagram" arcade_msx_perezthemouse = "msx_perezthemouse" arcade_msx_perspective = "msx_perspective" arcade_msx_pharaoh = "msx_pharaoh" arcade_msx_picopico = "msx_picopico" arcade_msx_picot = "msx_picot" arcade_msx_pillbox = "msx_pillbox" arcade_msx_pillboxa = "msx_pillbox" arcade_msx_pinblast = "msx_pinblast" arcade_msx_pineappl = "msx_pineappl" arcade_msx_pineappla = "msx_pineappl" arcade_msx_pingpong = "msx_pingpong" arcade_msx_pingponga = "msx_pingpong" arcade_msx_pingpongb = "msx_pingpong" arcade_msx_pingpongc = "msx_pingpong" arcade_msx_pingpongk = "msx_pingpong" arcade_msx_pinkychs = "msx_pinkychs" arcade_msx_pipi = "msx_pipi" arcade_msx_pippols = "msx_pippols" arcade_msx_pippolsa = "msx_pippols" arcade_msx_pippolsb = "msx_pippols" arcade_msx_pippolsc = "msx_pippols" arcade_msx_pitfall = "msx_pitfall" arcade_msx_pitfall2 = "msx_pitfall2" arcade_msx_pitfall2a = "msx_pitfall2" arcade_msx_pitfalla = "msx_pitfall" arcade_msx_pitfallb = "msx_pitfall" arcade_msx_pjoe = "msx_pjoe" arcade_msx_playball = "msx_playball" arcade_msx_podero = "msx_podero" arcade_msx_policest = "msx_policest" arcade_msx_policesta = "msx_policest" arcade_msx_polstar = "msx_polstar" arcade_msx_pooyan = "msx_pooyan" arcade_msx_poppaq = "msx_poppaq" arcade_msx_poppaqk = "msx_poppaq" arcade_msx_prettykngdm = "msx_prettykngdm" arcade_msx_pricemag = "msx_pricemag" arcade_msx_princessquest = "msx_princessquest" arcade_msx_profbb = "msx_profbb" arcade_msx_protectr = "msx_protectr" arcade_msx_psyched = "msx_psyched" arcade_msx_psychpig = "msx_psychpig" arcade_msx_punchy = "msx_punchy" arcade_msx_puznic = "msx_puznic" arcade_msx_puzpanic = "msx_puzpanic" arcade_msx_pyramidw = "msx_pyramidw" arcade_msx_qbert = "msx_qbert" arcade_msx_qberta = "msx_qbert" arcade_msx_quebert = "msx_quebert" arcade_msx_queenglf = "msx_queenglf" arcade_msx_queenglfa = "msx_queenglf" arcade_msx_queenglfb = "msx_queenglf" arcade_msx_raidbung = "msx_raidbung" arcade_msx_rallyx = "msx_rallyx" arcade_msx_rallyxa = "msx_rallyx" arcade_msx_rallyxb = "msx_rallyx" arcade_msx_rallyxk = "msx_rallyx" arcade_msx_ram = "msx_ram" arcade_msx_rambo = "msx_rambo" arcade_msx_rambo3 = "msx_rambo3" arcade_msx_ramboa = "msx_rambo" arcade_msx_rambob = "msx_rambo" arcade_msx_ramboc = "msx_rambo" arcade_msx_raththa = "msx_raththa" arcade_msx_realtenn = "msx_realtenn" arcade_msx_redzone = "msx_redzone" arcade_msx_redzonea = "msx_redzone" arcade_msx_relics = "msx_relics" arcade_msx_renegad3 = "msx_renegad3" arcade_msx_rescatl = "msx_rescatl" arcade_msx_risedung = "msx_risedung" arcade_msx_risedunga = "msx_risedung" arcade_msx_riveraid = "msx_riveraid" arcade_msx_riyadh = "msx_riyadh" arcade_msx_roadfght = "msx_roadfght" arcade_msx_roadfghta = "msx_roadfght" arcade_msx_robocop = "msx_robocop" arcade_msx_robofrog = "msx_robofrog" arcade_msx_robofroga = "msx_robofrog" arcade_msx_robotwar = "msx_robotwar" arcade_msx_roboy = "msx_roboy" arcade_msx_rockbolt = "msx_rockbolt" arcade_msx_rocknroller = "msx_rocknroller" arcade_msx_rockroll = "msx_rockroll" arcade_msx_rogerrub = "msx_rogerrub" arcade_msx_rogerruba = "msx_rogerrub" arcade_msx_rollerbl = "msx_rollerbl" arcade_msx_rollerbla = "msx_rollerbl" arcade_msx_romancia = "msx_romancia" arcade_msx_rotors = "msx_rotors" arcade_msx_rtype = "msx_rtype" arcade_msx_rtypea = "msx_rtype" arcade_msx_runner = "msx_runner" arcade_msx_salamand = "msx_salamand" arcade_msx_salamandk = "msx_salamand" arcade_msx_sasa = "msx_sasa" arcade_msx_sasaa = "msx_sasa" arcade_msx_satan = "msx_satan" arcade_msx_saurus = "msx_saurus" arcade_msx_sbillard = "msx_sbillard" arcade_msx_sbioman4 = "msx_sbioman4" arcade_msx_sboy1 = "msx_sboy1" arcade_msx_sboy2 = "msx_sboy2" arcade_msx_sboy2a = "msx_sboy2" arcade_msx_sboy3 = "msx_sboy3" arcade_msx_sboy3a = "msx_sboy3" arcade_msx_sbracer = "msx_sbracer" arcade_msx_scarlet7 = "msx_scarlet7" arcade_msx_scentipede = "msx_scentipede" arcade_msx_scifi = "msx_scifi" arcade_msx_scion = "msx_scion" arcade_msx_scobra = "msx_scobra" arcade_msx_scobraa = "msx_scobra" arcade_msx_scramegg = "msx_scramegg" arcade_msx_seahuntr = "msx_seahuntr" arcade_msx_seaking = "msx_seaking" arcade_msx_searchformum = "msx_searchformum" arcade_msx_seicorobocop = "msx_seicorobocop" arcade_msx_seikacho = "msx_seikacho" arcade_msx_seikachoa = "msx_seikacho" arcade_msx_seikachok = "msx_seikacho" arcade_msx_seleniak = "msx_seleniak" arcade_msx_senjokam = "msx_senjokam" arcade_msx_senjyo = "msx_senjyo" arcade_msx_senjyoa = "msx_senjyo" arcade_msx_sewersam = "msx_sewersam" arcade_msx_sharkh = "msx_sharkh" arcade_msx_shmup11 = "msx_shmup11" arcade_msx_shnax = "msx_shnax" arcade_msx_shogun = "msx_shogun" arcade_msx_shouganai11 = "msx_shouganai11" arcade_msx_shoutmat = "msx_shoutmat" arcade_msx_showjumph = "msx_showjumph" arcade_msx_sideral = "msx_sideral" arcade_msx_sinbad = "msx_sinbad" arcade_msx_sinkking = "msx_sinkking" arcade_msx_skateair = "msx_skateair" arcade_msx_skicomm = "msx_skicomm" arcade_msx_skicommk1 = "msx_skicomm" arcade_msx_skicommk2 = "msx_skicomm" arcade_msx_skooter = "msx_skooter" arcade_msx_skootera = "msx_skooter" arcade_msx_skulexil = "msx_skulexil" arcade_msx_skydiver = "msx_skydiver" arcade_msx_skygaldo = "msx_skygaldo" arcade_msx_skyjag = "msx_skyjag" arcade_msx_skyjagk = "msx_skyjag" arcade_msx_slaydock = "msx_slaydock" arcade_msx_slaydockk = "msx_slaydock" arcade_msx_smackwac = "msx_smackwac" arcade_msx_smzoom = "msx_smzoom" arcade_msx_snakeit = "msx_snakeit" arcade_msx_sofia = "msx_sofia" arcade_msx_sokoban = "msx_sokoban" arcade_msx_sokobana = "msx_sokoban" arcade_msx_sokobanb = "msx_sokoban" arcade_msx_sokobank = "msx_sokoban" arcade_msx_sorcery = "msx_sorcery" arcade_msx_spacecmp = "msx_spacecmp" arcade_msx_spacecmpa = "msx_spacecmp" arcade_msx_spaceinv = "msx_spaceinv" arcade_msx_spacemouse = "msx_spacemouse" arcade_msx_spacetrb = "msx_spacetrb" arcade_msx_spacewlk = "msx_spacewlk" arcade_msx_spacmaze = "msx_spacmaze" arcade_msx_spacmazea = "msx_spacmaze" arcade_msx_spacmazeb = "msx_spacmaze" arcade_msx_sparkie = "msx_sparkie" arcade_msx_spelunkr = "msx_spelunkr" arcade_msx_spelunkra = "msx_spelunkr" arcade_msx_spenguin = "msx_spenguin" arcade_msx_spider = "msx_spider" arcade_msx_splash = "msx_splash" arcade_msx_spooksl = "msx_spooksl" arcade_msx_spyvssp2 = "msx_spyvssp2" arcade_msx_squardan = "msx_squardan" arcade_msx_squishem = "msx_squishem" arcade_msx_squishema = "msx_squishem" arcade_msx_srescue = "msx_srescue" arcade_msx_sshadow = "msx_sshadow" arcade_msx_staravng = "msx_staravng" arcade_msx_starblaz = "msx_starblaz" arcade_msx_starblaza = "msx_starblaz" arcade_msx_starblazb = "msx_starblaz" arcade_msx_starbugg = "msx_starbugg" arcade_msx_starfrce = "msx_starfrce" arcade_msx_starfrcea = "msx_starfrce" arcade_msx_starquak = "msx_starquak" arcade_msx_starship = "msx_starship" arcade_msx_starshipa = "msx_starship" arcade_msx_starsold = "msx_starsold" arcade_msx_starsolda = "msx_starsold" arcade_msx_stepper = "msx_stepper" arcade_msx_stepup = "msx_stepup" arcade_msx_stepupa = "msx_stepup" arcade_msx_stepupk = "msx_stepup" arcade_msx_stonewis = "msx_stonewis" arcade_msx_stranglp = "msx_stranglp" arcade_msx_stratos2 = "msx_stratos2" arcade_msx_straycat = "msx_straycat" arcade_msx_strtmast = "msx_strtmast" arcade_msx_subacuatic = "msx_subacuatic" arcade_msx_suparobo = "msx_suparobo" arcade_msx_supdrink = "msx_supdrink" arcade_msx_supercol = "msx_supercol" arcade_msx_superglf = "msx_superglf" arcade_msx_superxf = "msx_superxf" arcade_msx_suppachi = "msx_suppachi" arcade_msx_supsnake = "msx_supsnake" arcade_msx_supsnakea = "msx_supsnake" arcade_msx_supsnakeb = "msx_supsnake" arcade_msx_supsoccr = "msx_supsoccr" arcade_msx_suptenn = "msx_suptenn" arcade_msx_suptrip = "msx_suptrip" arcade_msx_suthir = "msx_suthir" arcade_msx_suwanggi = "msx_suwanggi" arcade_msx_sweetacr = "msx_sweetacr" arcade_msx_sweetacra = "msx_sweetacr" arcade_msx_swing = "msx_swing" arcade_msx_swinga = "msx_swing" arcade_msx_takameij = "msx_takameij" arcade_msx_takameija = "msx_takameij" arcade_msx_takameijk1 = "msx_takameij" arcade_msx_takameijk2 = "msx_takameij" arcade_msx_takeru = "msx_takeru" arcade_msx_tankbatt = "msx_tankbatt" arcade_msx_tantan = "msx_tantan" arcade_msx_tatica = "msx_tatica" arcade_msx_tawarakn = "msx_tawarakn" arcade_msx_tawarakna = "msx_tawarakn" arcade_msx_tawaraknb = "msx_tawarakn" arcade_msx_tbirds1a = "msx_tbirds1a" arcade_msx_tbirdst1b = "msx_tbirds1a" arcade_msx_tbirdst2a = "msx_tbirds1a" arcade_msx_tbirdst2b = "msx_tbirds1a" arcade_msx_tearnile = "msx_tearnile" arcade_msx_telebunn = "msx_telebunn" arcade_msx_telebunna = "msx_telebunn" arcade_msx_temptations = "msx_temptations" arcade_msx_tensaird = "msx_tensaird" arcade_msx_tension = "msx_tension" arcade_msx_teodoro = "msx_teodoro" arcade_msx_terminus = "msx_terminus" arcade_msx_terramex = "msx_terramex" arcade_msx_tetrahor = "msx_tetrahor" arcade_msx_tetrahora = "msx_tetrahor" arcade_msx_tetris = "msx_tetris" arcade_msx_tetris2 = "msx_tetris2" arcade_msx_tetrisa = "msx_tetris" arcade_msx_tetsuman = "msx_tetsuman" arcade_msx_tetsumana = "msx_tetsuman" arcade_msx_thecure = "msx_thecure" arcade_msx_theghost = "msx_theghost" arcade_msx_theseus = "msx_theseus" arcade_msx_theseusa = "msx_theseus" arcade_msx_theseusk = "msx_theseus" arcade_msx_thexder = "msx_thexder" arcade_msx_thexdera = "msx_thexder" arcade_msx_thexderb = "msx_thexder" arcade_msx_thndbolt = "msx_thndbolt" arcade_msx_thndbolta = "msx_thndbolt" arcade_msx_thndboltb = "msx_thndbolt" arcade_msx_thndrbal = "msx_thndrbal" arcade_msx_thndrbala = "msx_thndrbal" arcade_msx_timebomb = "msx_timebomb" arcade_msx_timeplt = "msx_timeplt" arcade_msx_timeplta = "msx_timeplt" arcade_msx_timetrax = "msx_timetrax" arcade_msx_titanic = "msx_titanic" arcade_msx_titipang = "msx_titipang" arcade_msx_togk = "msx_togk" arcade_msx_toobin = "msx_toobin" arcade_msx_toprollr = "msx_toprollr" arcade_msx_topzip = "msx_topzip" arcade_msx_trackfl2 = "msx_trackfl2" arcade_msx_trackfld = "msx_trackfld" arcade_msx_traffic = "msx_traffic" arcade_msx_traffica = "msx_traffic" arcade_msx_trailblz = "msx_trailblz" arcade_msx_transball = "msx_transball" arcade_msx_trantor = "msx_trantor" arcade_msx_trialski = "msx_trialski" arcade_msx_triton = "msx_triton" arcade_msx_tuma7 = "msx_tuma7" arcade_msx_turboat = "msx_turboat" arcade_msx_turbogirl = "msx_turbogirl" arcade_msx_turmoil = "msx_turmoil" arcade_msx_turmoilk = "msx_turmoil" arcade_msx_tvirus = "msx_tvirus" arcade_msx_twinbee = "msx_twinbee" arcade_msx_twinbeea = "msx_twinbee" arcade_msx_twinbeeb = "msx_twinbee" arcade_msx_twinbeec = "msx_twinbee" arcade_msx_twinhamm = "msx_twinhamm" arcade_msx_txupi = "msx_txupi" arcade_msx_tzr = "msx_tzr" arcade_msx_ultraman = "msx_ultraman" arcade_msx_undergnd = "msx_undergnd" arcade_msx_univunk = "msx_univunk" arcade_msx_unleashed = "msx_unleashed" arcade_msx_uridium = "msx_uridium" arcade_msx_valis = "msx_valis" arcade_msx_valisk = "msx_valis" arcade_msx_valkyr = "msx_valkyr" arcade_msx_vaxol = "msx_vaxol" arcade_msx_vesikauhu = "msx_vesikauhu" arcade_msx_vestron = "msx_vestron" arcade_msx_vigilant = "msx_vigilant" arcade_msx_voidrun = "msx_voidrun" arcade_msx_volguard = "msx_volguard" arcade_msx_vortraid = "msx_vortraid" arcade_msx_wampcola = "msx_wampcola" arcade_msx_warpwarp = "msx_warpwarp" arcade_msx_warroid = "msx_warroid" arcade_msx_warroida = "msx_warroid" arcade_msx_waterdrv = "msx_waterdrv" arcade_msx_wbells = "msx_wbells" arcade_msx_wbellsa = "msx_wbells" arcade_msx_wecleman = "msx_wecleman" arcade_msx_whodares = "msx_whodares" arcade_msx_whopper = "msx_whopper" arcade_msx_wingman2 = "msx_wingman2" arcade_msx_wingwarr = "msx_wingwarr" arcade_msx_winthawk = "msx_winthawk" arcade_msx_wizlair = "msx_wizlair" arcade_msx_wondkid = "msx_wondkid" arcade_msx_wonsiin = "msx_wonsiin" arcade_msx_wrangler = "msx_wrangler" arcade_msx_wreck = "msx_wreck" arcade_msx_wrldopen = "msx_wrldopen" arcade_msx_wrldopenk = "msx_wrldopen" arcade_msx_xanadu = "msx_xanadu" arcade_msx_xenon = "msx_xenon" arcade_msx_xyzolog = "msx_xyzolog" arcade_msx_xyzologa = "msx_xyzolog" arcade_msx_yakyukyo = "msx_yakyukyo" arcade_msx_yellowsb = "msx_yellowsb" arcade_msx_yiear = "msx_yiear" arcade_msx_yiear2 = "msx_yiear2" arcade_msx_yiear2a = "msx_yiear2" arcade_msx_yiear2b = "msx_yiear2" arcade_msx_yieara = "msx_yiear" arcade_msx_yieark = "msx_yiear" arcade_msx_youkaiya = "msx_youkaiya" arcade_msx_zaider = "msx_zaider" arcade_msx_zaidera = "msx_zaider" arcade_msx_zambeze = "msx_zambeze" arcade_msx_zanac = "msx_zanac" arcade_msx_zanac2 = "msx_zanac2" arcade_msx_zanac2a = "msx_zanac2" arcade_msx_zanaca = "msx_zanac" arcade_msx_zaxxon = "msx_zaxxon" arcade_msx_zaxxona = "msx_zaxxon" arcade_msx_zaxxones = "msx_zaxxones" arcade_msx_zenji = "msx_zenji" arcade_msx_zexasltd = "msx_zexasltd" arcade_msx_zexasltda = "msx_zexasltd" arcade_msx_zexasltdb = "msx_zexasltd" arcade_msx_zombieinc12 = "msx_zombieinc12" arcade_msx_zombienear11 = "msx_zombienear11" arcade_msx_zona0 = "msx_zona0" arcade_msx_zoom909 = "msx_zoom909" arcade_msx_zoom909k = "msx_zoom909" arcade_mt_aftrb = "mt_aftrb" arcade_mt_astro = "mt_astro" arcade_mt_bbros = "mt_bbros" arcade_mt_beast = "mt_beast" arcade_mt_eswat = "mt_eswat" arcade_mt_fshrk = "mt_fshrk" arcade_mt_gaxe = "mt_gaxe" arcade_mt_gaxe2 = "mt_gaxe2" arcade_mt_ggolf = "mt_ggolf" arcade_mt_gng = "mt_gng" arcade_mt_gsocr = "mt_gsocr" arcade_mt_kcham = "mt_kcham" arcade_mt_lastb = "mt_lastb" arcade_mt_mwalk = "mt_mwalk" arcade_mt_mystd = "mt_mystd" arcade_mt_parlg = "mt_parlg" arcade_mt_revsh = "mt_revsh" arcade_mt_shar2 = "mt_shar2" arcade_mt_shnbi = "mt_shnbi" arcade_mt_smgp = "mt_smgp" arcade_mt_sonic = "mt_sonic" arcade_mt_stbld = "mt_stbld" arcade_mt_tetri = "mt_tetri" arcade_mt_tfor2 = "mt_tfor2" arcade_mt_tgolf = "mt_tgolf" arcade_mt_tlbba = "mt_tlbba" arcade_mt_wcsoc = "mt_wcsoc" arcade_mtlchamp = "mtlchamp" arcade_mtlchamp1 = "mtlchamp" arcade_mtlchampa = "mtlchamp" arcade_mtlchampj = "mtlchamp" arcade_mtlchampu = "mtlchamp" arcade_mtlchampu1 = "mtlchamp" arcade_mtlchmpj = "mtlchamp" arcade_mtrap = "mtrap" arcade_mtrap3 = "mtrap" arcade_mtrap4 = "mtrap" arcade_mtwins = "mtwins" arcade_mugsmash = "mugsmash" arcade_multchmp = "multchmp" arcade_multchmpa = "multchmp" arcade_multchmpk = "multchmp" arcade_multi96 = "twinadv" arcade_mustache = "mustache" arcade_mustachei = "mustache" arcade_mustang = "mustang" arcade_mustangb = "mustang" arcade_mustangb2 = "mustang" arcade_mustangs = "mustang" arcade_mutantf = "mutantf" arcade_mutantf2 = "mutantf" arcade_mutantf3 = "mutantf" arcade_mutantf4 = "mutantf" arcade_mutantfa = "mutantf" arcade_mutantwarr = "altbeast" arcade_mutnat = "mutnat" arcade_mvp = "mvp" arcade_mvpd = "mvp" arcade_mvpj = "mvp" arcade_mvpjd = "mvp" arcade_mvsc = "mvsc" arcade_mvsca = "mvsc" arcade_mvscar1 = "mvsc" arcade_mvscb = "mvsc" arcade_mvsch = "mvsc" arcade_mvscj = "mvsc" arcade_mvscjr1 = "mvsc" arcade_mvscjsing = "mvsc" arcade_mvscr1 = "mvsc" arcade_mvscu = "mvsc" arcade_mvscud = "mvsc" arcade_mvscur1 = "mvsc" arcade_mwalk = "mwalk" arcade_mwalkbl2 = "mwalk" arcade_mwalkd = "mwalk" arcade_mwalkj = "mwalk" arcade_mwalkjd = "mwalk" arcade_mwalku = "mwalk" arcade_mwalkud = "mwalk" arcade_mwarr = "mwarr" arcade_mx5000 = "mx5000" arcade_myangel = "myangel" arcade_myangel2 = "myangel2" arcade_myangel3 = "myangel3" arcade_myfairld = "myfairld" arcade_myhero = "myhero" arcade_myherobl = "myhero" arcade_myherok = "myhero" arcade_myqbert = "qbert" arcade_mysticm = "mysticm" arcade_mysticri = "mysticri" arcade_mysticrib = "mysticri" arcade_myststno = "mystston" arcade_mystston = "mystston" arcade_myststono = "mystston" arcade_myststonoi = "mystston" arcade_mystwarr = "mystwarr" arcade_mystwarra = "mystwarr" arcade_mystwarraa = "mystwarr" arcade_mystwarrj = "mystwarr" arcade_mystwarru = "mystwarr" arcade_mystwaru = "mystwarr" arcade_nam1975 = "nam1975" arcade_nametune = "nametune" arcade_naname = "naname" arcade_narc = "narc" arcade_narc3 = "narc" arcade_nastar = "nastar" arcade_nastarw = "nastar" arcade_natodef = "natodef" arcade_natodefa = "natodef" arcade_natsuiro = "mjnatsu" arcade_naughtya = "naughtyb" arcade_naughtyb = "naughtyb" arcade_naughtyba = "naughtyb" arcade_naughtybc = "naughtyb" arcade_naughtyc = "naughtyb" arcade_navalone = "navalone" arcade_navarone = "navarone" arcade_nbahangt = "nbahangt" arcade_nbajam = "nbajam" arcade_nbajamex = "nbajamex" arcade_nbajamr2 = "nbajam" arcade_nbajamt1 = "nbajam" arcade_nbajamt2 = "nbajam" arcade_nbajamt3 = "nbajam" arcade_nbajamte = "nbajam" arcade_nbamaxht = "nbahangt" arcade_nbbatman = "nbbatman" arcade_nbbatmanu = "nbbatman" arcade_ncombat = "ncombat" arcade_ncombath = "ncombat" arcade_ncommand = "ncommand" arcade_ncv1 = "ncv1" arcade_ncv1j = "ncv1" arcade_ncv1j2 = "ncv1" arcade_ncv2 = "ncv2" arcade_ncv2j = "ncv2" arcade_nebulbee = "galaga" arcade_nebulray = "nebulray" arcade_nebulryj = "nebulray" arcade_neckneck = "neckneck" arcade_nekkyoku = "nekkyoku" arcade_nemesis = "nemesis" arcade_nemesisuk = "nemesis" arcade_nemesuk = "nemesis" arcade_nemo = "nemo" arcade_nemoj = "nemo" arcade_nemor1 = "nemo" arcade_neo2500 = "neo2500" arcade_neo3ddmo = "neo3ddmo" arcade_neobattl = "neobattl" arcade_neobombe = "neobombe" arcade_neocdz = "neocdz" arcade_neocstlv = "neocstlv" arcade_neocup98 = "neocup98" arcade_neodemo = "neodemo" arcade_neodrift = "neodrift" arcade_neogalag = "neogalag" arcade_neogalaga = "neogalag" arcade_neogeo = "neogeo" arcade_neomrdo = "neomrdo" arcade_neonopon = "neonopon" arcade_neopong = "neopong" arcade_neoponga = "neopong" arcade_neoprimo = "neoprimo" arcade_neotet = "neotet" arcade_neothndr = "neothndr" arcade_neoww2 = "neoww2" arcade_nettoqc = "nettoqc" arcade_netwars = "netwars" arcade_newapunk = "bbmanw" arcade_newfant = "newfant" arcade_newfanta = "newfant" arcade_newpuc2 = "puckman" arcade_newpuc2b = "puckman" arcade_newpuckx = "puckman" arcade_news = "news" arcade_newsa = "news" arcade_newsin7 = "newsin7" arcade_nextfase = "phoenix" arcade_ngem2k = "ngem2k" arcade_ngfrog = "ngfrog" arcade_ngftdemo = "ngftdemo" arcade_ngpgal = "ngpgal" arcade_nibbler = "nibbler" arcade_nibbler6 = "nibbler" arcade_nibbler7 = "nibbler" arcade_nibbler8 = "nibbler" arcade_nibblera = "nibbler" arcade_nibblero = "nibbler" arcade_nibblerp = "nibbler" arcade_nightstr = "nightstr" arcade_nightstrj = "nightstr" arcade_nightstru = "nightstr" arcade_ninclown = "ninclown" arcade_ninja = "seganinj" arcade_ninjak = "ninjak" arcade_ninjak2a = "ninjakd2" arcade_ninjak2b = "ninjakd2" arcade_ninjakd2 = "ninjakd2" arcade_ninjakd2a = "ninjakd2" arcade_ninjakd2b = "ninjakd2" arcade_ninjakd2c = "ninjakd2" arcade_ninjakj = "ninjak" arcade_ninjaku = "ninjak" arcade_ninjakun = "ninjakun" arcade_ninjamas = "ninjamas" arcade_ninjaw = "ninjaw" arcade_ninjaw1 = "ninjaw" arcade_ninjawj = "ninjaw" arcade_ninjawu = "ninjaw" arcade_ninjemak = "ninjemak" arcade_nitd = "nitd" arcade_nitdbl = "nitd" arcade_nitedrvr = "nitedrvr" arcade_nitrobal = "nitrobal" arcade_nitrobala = "nitrobal" arcade_niyanpai = "niyanpai" arcade_nkdodgeb = "spdodgeb" arcade_nmaster = "metmqstr" arcade_nmg5 = "nmg5" arcade_nmg5a = "nmg5" arcade_nmg5e = "nmg5" arcade_nmk004 = "nmk004" arcade_nmouse = "nmouse" arcade_nmouseb = "nmouse" arcade_nmsengen = "nmsengen" arcade_nndmseal = "nndmseal" arcade_nndmseala = "nndmseal" arcade_nob = "nob" arcade_nobb = "nob" arcade_noboranb = "noboranb" arcade_nomnlnd = "nomnlnd" arcade_nomnlndg = "nomnlnd" arcade_nost = "nost" arcade_nostj = "nost" arcade_nostk = "nost" arcade_nouryoku = "nouryoku" arcade_nov2001u = "nova2001" arcade_nova2001 = "nova2001" arcade_nova2001h = "nova2001" arcade_nova2001u = "nova2001" arcade_nprinces = "seganinj" arcade_nprincesb = "seganinj" arcade_nprinceso = "seganinj" arcade_nprincesu = "seganinj" arcade_nprincsb = "seganinj" arcade_nprincso = "seganinj" arcade_nprincsu = "seganinj" arcade_nrallyx = "nrallyx" arcade_nslasher = "nslasher" arcade_nslasherj = "nslasher" arcade_nslashers = "nslasher" arcade_nslasheru = "nslasher" arcade_nspirit = "nspirit" arcade_nspiritj = "nspirit" arcade_nss_actr = "nss_actr" arcade_nss_adam = "nss_adam" arcade_nss_aten = "nss_aten" arcade_nss_con3 = "nss_con3" arcade_nss_fzer = "nss_fzer" arcade_nss_lwep = "nss_lwep" arcade_nss_ncaa = "nss_ncaa" arcade_nss_rob3 = "nss_rob3" arcade_nss_skin = "nss_skin" arcade_nss_smw = "nss_smw" arcade_nss_ssoc = "nss_ssoc" arcade_nss_sten = "nss_sten" arcade_nstocker = "nstocker" arcade_nsub = "nsub" arcade_ntopstar = "ntopstar" arcade_numanath = "numanath" arcade_numanatj = "numanath" arcade_nunchaku = "ladymstr" arcade_nwarr = "nwarr" arcade_nwarra = "nwarr" arcade_nwarrb = "nwarr" arcade_nwarrh = "nwarr" arcade_nwarru = "nwarr" arcade_nwarrud = "nwarr" arcade_nyanpani = "kittenk" arcade_nycaptor = "nycaptor" arcade_nyny = "nyny" arcade_nynyg = "nyny" arcade_nzeroteam = "zeroteam" arcade_nzeroteama = "zeroteam" arcade_oedfight = "bloodwar" arcade_offensiv = "scramble" arcade_offroad = "offroad" arcade_offroadc = "offroadc" arcade_offroadt = "offroadt" arcade_offtwalc = "offtwall" arcade_offtwall = "offtwall" arcade_ogonsiro = "gladiatr" arcade_ohmygod = "ohmygod" arcade_oigas = "gigasb" arcade_oisipuzl = "oisipuzl" arcade_ojanko2 = "ojanko2" arcade_ojankoc = "ojankoc" arcade_ojankohs = "ojankohs" arcade_ojankoy = "ojankoy" arcade_ojousan = "ojousan" arcade_olds = "olds" arcade_olds100 = "olds" arcade_olds100a = "olds" arcade_olds103t = "olds" arcade_oldsplus = "oldsplus" arcade_olibochu = "olibochu" arcade_olysoc92 = "cupsoc" arcade_omega = "omega" arcade_omegab = "theend" arcade_omegaf = "omegaf" arcade_omegafs = "omegaf" arcade_omegrace = "omegrace" arcade_omni = "pisces" arcade_oneshot = "oneshot" arcade_onetwo = "onetwo" arcade_onetwoe = "onetwo" arcade_onna34ra = "onna34ro" arcade_onna34ro = "onna34ro" arcade_onna34roa = "onna34ro" arcade_opaopa = "opaopa" arcade_opaopan = "opaopa" arcade_opengolf = "opengolf" arcade_openice = "openice" arcade_opwolf = "opwolf" arcade_opwolf3 = "opwolf3" arcade_opwolf3u = "opwolf3" arcade_opwolfa = "opwolf" arcade_opwolfb = "opwolf" arcade_opwolfj = "opwolf" arcade_opwolfjsc = "opwolf" arcade_opwolfu = "opwolf" arcade_orangec = "orangec" arcade_orbit = "orbit" arcade_orbitron = "orbitron" arcade_orbs = "orbs" arcade_ordyne = "ordyne" arcade_ordynej = "ordyne" arcade_ordyneje = "ordyne" arcade_orius = "xexex" arcade_orlegend = "orlegend" arcade_orlegend105k = "orlegend" arcade_orlegend111c = "orlegend" arcade_orlegend111k = "orlegend" arcade_orlegend111t = "orlegend" arcade_orlegendc = "orlegend" arcade_orlegendca = "orlegend" arcade_orlegende = "orlegend" arcade_orlegndc = "orlegend" arcade_orlegnde = "orlegend" arcade_orunners = "orunners" arcade_oscar = "oscar" arcade_oscarj = "oscar" arcade_oscarj0 = "oscar" arcade_oscarj1 = "oscar" arcade_oscarj2 = "oscar" arcade_oscaru = "oscar" arcade_osman = "osman" arcade_otatidai = "otatidai" arcade_othellos = "othellos" arcade_othldrby = "othldrby" arcade_othunder = "othunder" arcade_othunderj = "othunder" arcade_othunderjsc = "othunder" arcade_othundero = "othunder" arcade_othunderu = "othunder" arcade_othunderuo = "othunder" arcade_othundu = "othunder" arcade_otonano = "otonano" arcade_otwalls = "otwalls" arcade_outfxesj = "outfxies" arcade_outfxies = "outfxies" arcade_outline = "radarzon" arcade_outrun = "outrun" arcade_outruna = "outrun" arcade_outrunb = "outrun" arcade_outrundx = "outrun" arcade_outrundxa = "outrun" arcade_outrundxeh = "outrun" arcade_outrundxj = "outrun" arcade_outruneh = "outrun" arcade_outrunra = "outrun" arcade_outzone = "outzone" arcade_outzonea = "outzone" arcade_outzoneb = "outzone" arcade_outzonec = "outzone" arcade_outzonecv = "outzone" arcade_outzoneh = "outzone" arcade_overdriv = "overdriv" arcade_overtop = "overtop" arcade_ozmawar2 = "ozmawars" arcade_ozmawars = "ozmawars" arcade_ozmawars2 = "ozmawars" arcade_ozon1 = "ozon1" arcade_p47 = "p47" arcade_p47aces = "p47aces" arcade_p47j = "p47" arcade_p47je = "p47" arcade_pacapp = "pacapp" arcade_pacgal = "mspacman" arcade_pacheart = "puckman" arcade_pachiten = "pachiten" arcade_packbang = "packbang" arcade_packetman = "puckman" arcade_pacland = "pacland" arcade_pacland2 = "pacland" arcade_pacland3 = "pacland" arcade_paclandj = "pacland" arcade_paclandjo = "pacland" arcade_paclandjo2 = "pacland" arcade_paclandm = "pacland" arcade_paclandm2 = "pacland" arcade_pacman = "puckman" arcade_pacmanbl = "puckman" arcade_pacmanbla = "puckman" arcade_pacmanf = "puckman" arcade_pacmania = "pacmania" arcade_pacmaniaj = "pacmania" arcade_pacmaniao = "pacmania" arcade_pacmanij = "pacmania" arcade_pacmanpe = "puckman" arcade_pacmanso = "puckman" arcade_pacmansp = "puckman" arcade_pacmanvg = "puckman" arcade_pacmod = "puckman" arcade_pacnchmp = "pacnpal" arcade_pacnpal = "pacnpal" arcade_pacnpal2 = "pacnpal" arcade_pacominv = "beaminv" arcade_pacplus = "pacplus" arcade_pacuman = "puckman" arcade_paddle2 = "arkanoid" arcade_paddlema = "paddlema" arcade_paintrlr = "crush" arcade_pairlove = "pairlove" arcade_pairs = "pairs" arcade_pairsa = "pairs" arcade_pairsten = "pairsten" arcade_pajaroes = "uniwars" arcade_palamed = "palamed" arcade_palamedj = "palamed" arcade_pandoras = "pandoras" arcade_pang = "pang" arcade_pang3 = "pang3" arcade_pang3b = "pang3" arcade_pang3b2 = "pang3" arcade_pang3b3 = "pang3" arcade_pang3j = "pang3" arcade_pang3r1 = "pang3" arcade_pang3r1a = "pang3" arcade_pangb = "pang" arcade_pangb2 = "pang" arcade_pangbold = "pang" arcade_pangbold2 = "pang" arcade_pangbold3 = "pang" arcade_pangpang = "pangpang" arcade_pangpomm = "pangpoms" arcade_pangpoms = "pangpoms" arcade_pangpomsm = "pangpoms" arcade_panic = "panic" arcade_panic2 = "panic" arcade_panic3 = "panic" arcade_panicbom = "panicbom" arcade_panicger = "panic" arcade_panich = "panic" arcade_panicstr = "panicstr" arcade_paperboy = "paperboy" arcade_paperbr1 = "paperboy" arcade_paperbr2 = "paperboy" arcade_paprazzi = "paprazzi" arcade_paradise = "paradise" arcade_parodisj = "parodius" arcade_parodius = "parodius" arcade_parodiusa = "parodius" arcade_parodiuse = "parodius" arcade_parodiusj = "parodius" arcade_pass = "pass" arcade_passht4b = "passsht" arcade_passsht = "passsht" arcade_passsht16a = "passsht" arcade_passshta = "passsht" arcade_passshtad = "passsht" arcade_passshtb = "passsht" arcade_passshtd = "passsht" arcade_passshtj = "passsht" arcade_passshtjd = "passsht" arcade_pastelgl = "pastelgl" arcade_patapata = "patapata" arcade_patimono = "patimono" arcade_pbactio2 = "pbaction" arcade_pbaction = "pbaction" arcade_pballoon = "pballoon" arcade_pballoonr = "pballoon" arcade_pbancho = "pbancho" arcade_pbillian = "pbillian" arcade_pbillrd = "pbillrd" arcade_pbillrds = "pbillrd" arcade_pbillrdsa = "pbillrd" arcade_pblbeach = "pblbeach" arcade_pbobbl2j = "pbobble2" arcade_pbobbl2n = "pbobbl2n" arcade_pbobbl2u = "pbobble2" arcade_pbobbl2x = "pbobble2" arcade_pbobbl3j = "pbobble3" arcade_pbobbl3u = "pbobble3" arcade_pbobbl4j = "pbobble4" arcade_pbobbl4u = "pbobble4" arcade_pbobble = "pbobble" arcade_pbobble2 = "pbobble2" arcade_pbobble2j = "pbobble2" arcade_pbobble2o = "pbobble2" arcade_pbobble2u = "pbobble2" arcade_pbobble2x = "pbobble2" arcade_pbobble3 = "pbobble3" arcade_pbobble3j = "pbobble3" arcade_pbobble3u = "pbobble3" arcade_pbobble4 = "pbobble4" arcade_pbobble4j = "pbobble4" arcade_pbobble4u = "pbobble4" arcade_pbobblen = "pbobblen" arcade_pbobblenb = "pbobblen" arcade_pbobblna = "pbobblen" arcade_pc_1942 = "pc_1942" arcade_pc_bball = "pc_bball" arcade_pc_bfght = "pc_bfght" arcade_pc_bstar = "pc_bstar" arcade_pc_cntra = "pc_cntra" arcade_pc_cshwk = "pc_cshwk" arcade_pc_cvnia = "pc_cvnia" arcade_pc_dbldr = "pc_dbldr" arcade_pc_ddrgn = "pc_ddrgn" arcade_pc_drmro = "pc_drmro" arcade_pc_duckh = "pc_duckh" arcade_pc_ebike = "pc_ebike" arcade_pc_ftqst = "pc_ftqst" arcade_pc_gntlt = "pc_gntlt" arcade_pc_golf = "pc_golf" arcade_pc_goons = "pc_goons" arcade_pc_grdue = "pc_grdus" arcade_pc_grdus = "pc_grdus" arcade_pc_hgaly = "pc_hgaly" arcade_pc_kngfu = "pc_kngfu" arcade_pc_mario = "pc_mario" arcade_pc_miket = "pc_miket" arcade_pc_mman3 = "pc_mman3" arcade_pc_moglf = "pc_moglf" arcade_pc_mtoid = "pc_mtoid" arcade_pc_ngai2 = "pc_ngai2" arcade_pc_ngai3 = "pc_ngai3" arcade_pc_ngaid = "pc_ngaid" arcade_pc_pinbt = "pc_pinbt" arcade_pc_pwbld = "pc_pwbld" arcade_pc_pwrst = "pc_pwrst" arcade_pc_radr2 = "pc_radr2" arcade_pc_radrc = "pc_radrc" arcade_pc_rcpam = "pc_rcpam" arcade_pc_rkats = "pc_rkats" arcade_pc_rnatk = "pc_rnatk" arcade_pc_rrngr = "pc_rrngr" arcade_pc_rygar = "pc_rygar" arcade_pc_sjetm = "pc_sjetm" arcade_pc_smb = "pc_smb" arcade_pc_smb2 = "pc_smb2" arcade_pc_smb3 = "pc_smb3" arcade_pc_suprc = "pc_suprc" arcade_pc_tbowl = "pc_tbowl" arcade_pc_tenis = "pc_tenis" arcade_pc_tkfld = "pc_tkfld" arcade_pc_tmnt = "pc_tmnt" arcade_pc_tmnt2 = "pc_tmnt2" arcade_pc_trjan = "pc_trjan" arcade_pc_vball = "pc_vball" arcade_pc_wcup = "pc_wcup" arcade_pc_wgnmn = "pc_wgnmn" arcade_pc_ynoid = "pc_ynoid" arcade_pce_1943kai = "pce_1943kai" arcade_pce_21emon = "pce_21emon" arcade_pce_aburner2 = "pce_aburner2" arcade_pce_acrush = "pce_acrush" arcade_pce_advislnd = "pce_advislnd" arcade_pce_aeroblst = "pce_aeroblst" arcade_pce_alice = "pce_alice" arcade_pce_ankoku = "pce_ankoku" arcade_pce_aoiblink = "pce_aoiblink" arcade_pce_appgateb = "pce_appgateb" arcade_pce_armedf = "pce_armedf" arcade_pce_arttool = "pce_arttool" arcade_pce_atomrobo = "pce_atomrobo" arcade_pce_avpoker = "pce_avpoker" arcade_pce_baibai = "pce_baibai" arcade_pce_ballistx = "pce_ballistx" arcade_pce_baribari = "pce_baribari" arcade_pce_barunba = "pce_barunba" arcade_pce_batloder = "pce_batloder" arcade_pce_batman = "pce_batman" arcade_pce_beball = "pce_beball" arcade_pce_benkei = "pce_benkei" arcade_pce_benkei1 = "pce_benkei" arcade_pce_bikkuri = "pce_bikkuri" arcade_pce_bikkuri1 = "pce_bikkuri" arcade_pce_blodia = "pce_blodia" arcade_pce_blodwolf = "pce_blodwolf" arcade_pce_bodycon2 = "pce_bodycon2" arcade_pce_bombman = "pce_bombman" arcade_pce_bombmn93 = "pce_bombmn93" arcade_pce_bombmn93s = "pce_bombmn93" arcade_pce_bombmn94 = "pce_bombmn94" arcade_pce_bombmnub = "pce_bombmnub" arcade_pce_bravoman = "pce_bravoman" arcade_pce_breakin = "pce_breakin" arcade_pce_bubblegm = "pce_bubblegm" arcade_pce_bullfght = "pce_bullfght" arcade_pce_burnangl = "pce_burnangl" arcade_pce_cadash = "pce_cadash" arcade_pce_cdsys = "pce_cdsys" arcade_pce_cdsysa = "pce_cdsys" arcade_pce_cdsysb = "pce_cdsys" arcade_pce_champwrs = "pce_champwrs" arcade_pce_chasehq = "pce_chasehq" arcade_pce_chibim = "pce_chibim" arcade_pce_chikuden = "pce_chikuden" arcade_pce_chikuden1 = "pce_chikuden" arcade_pce_chukatai = "pce_chukatai" arcade_pce_circusld = "pce_circusld" arcade_pce_cityhunt = "pce_cityhunt" arcade_pce_columns = "pce_columns" arcade_pce_contranes = "pce_contranes" arcade_pce_coryoon = "pce_coryoon" arcade_pce_coryoon1 = "pce_coryoon" arcade_pce_cyberdod = "pce_cyberdod" arcade_pce_cyberx = "pce_cyberx" arcade_pce_cybrcore = "pce_cybrcore" arcade_pce_cyknight = "pce_cyknight" arcade_pce_daisenpu = "pce_daisenpu" arcade_pce_dariusa = "pce_dariusa" arcade_pce_dariusp = "pce_dariusp" arcade_pce_ddanpei = "pce_ddanpei" arcade_pce_ddungw = "pce_ddungw" arcade_pce_deadmoon = "pce_deadmoon" arcade_pce_deepblue = "pce_deepblue" arcade_pce_devlcrsh = "pce_devlcrsh" arcade_pce_diehard = "pce_diehard" arcade_pce_digichmp = "pce_digichmp" arcade_pce_donaturl = "pce_donaturl" arcade_pce_dondoko = "pce_dondoko" arcade_pce_dorams = "pce_dorams" arcade_pce_dorandn = "pce_dorandn" arcade_pce_download = "pce_download" arcade_pce_download1 = "pce_download" arcade_pce_dragnegg = "pce_dragnegg" arcade_pce_droprock = "pce_droprock" arcade_pce_droprock1 = "pce_droprock" arcade_pce_druaga = "pce_druaga" arcade_pce_dsaber = "pce_dsaber" arcade_pce_dsaber1 = "pce_dsaber" arcade_pce_dspirit = "pce_dspirit" arcade_pce_dungexpl = "pce_dungexpl" arcade_pce_energy = "pce_energy" arcade_pce_etercity = "pce_etercity" arcade_pce_f1circ91 = "pce_f1circ91" arcade_pce_f1circ92 = "pce_f1circ92" arcade_pce_f1circus = "pce_f1circus" arcade_pce_f1circus1 = "pce_f1circus" arcade_pce_f1dream = "pce_f1dream" arcade_pce_f1pilot = "pce_f1pilot" arcade_pce_f1tb = "pce_f1tb" arcade_pce_fantzone = "pce_fantzone" arcade_pce_fightrun = "pce_fightrun" arcade_pce_finallap = "pce_finallap" arcade_pce_finalmt = "pce_finalmt" arcade_pce_finalsol = "pce_finalsol" arcade_pce_finalsols = "pce_finalsol" arcade_pce_finlblst = "pce_finlblst" arcade_pce_fireprow = "pce_fireprow" arcade_pce_fireprw2 = "pce_fireprw2" arcade_pce_fireprw3 = "pce_fireprw3" arcade_pce_fsoccer = "pce_fsoccer" arcade_pce_fsoccr90 = "pce_fsoccr90" arcade_pce_gaiamons = "pce_gaiamons" arcade_pce_gaiflame = "pce_gaiflame" arcade_pce_galaga88 = "pce_galaga88" arcade_pce_ganbgolf = "pce_ganbgolf" arcade_pce_gecd = "pce_gecd" arcade_pce_gekisboy = "pce_gekisboy" arcade_pce_genjitsu = "pce_genjitsu" arcade_pce_genpei = "pce_genpei" arcade_pce_genpemak = "pce_genpemak" arcade_pce_gomola = "pce_gomola" arcade_pce_gradius = "pce_gradius" arcade_pce_gunhed = "pce_gunhed" arcade_pce_gunhedht = "pce_gunhedht" arcade_pce_hanataka = "pce_hanataka" arcade_pce_haniirod = "pce_haniirod" arcade_pce_haniisky = "pce_haniisky" arcade_pce_hatris = "pce_hatris" arcade_pce_hitice = "pce_hitice" arcade_pce_hvyunit = "pce_hvyunit" arcade_pce_idolhana = "pce_idolhana" arcade_pce_imagefgt = "pce_imagefgt" arcade_pce_jchan = "pce_jchan" arcade_pce_jigomegu = "pce_jigomegu" arcade_pce_jinmu = "pce_jinmu" arcade_pce_jinmu1 = "pce_jinmu" arcade_pce_jleag11 = "pce_jleag11" arcade_pce_juuouki = "pce_juuouki" arcade_pce_juuouki1 = "pce_juuouki" arcade_pce_katochan = "pce_katochan" arcade_pce_kattobi = "pce_kattobi" arcade_pce_kickball = "pce_kickball" arcade_pce_kikikai = "pce_kikikai" arcade_pce_kingcasn = "pce_kingcasn" arcade_pce_klax = "pce_klax" arcade_pce_knightrs = "pce_knightrs" arcade_pce_ktiger = "pce_ktiger" arcade_pce_kungfu = "pce_kungfu" arcade_pce_kyukyom2 = "pce_kyukyom2" arcade_pce_kyukyomj = "pce_kyukyomj" arcade_pce_ladyswrd = "pce_ladyswrd" arcade_pce_ladyswrd1 = "pce_ladyswrd" arcade_pce_ldrun = "pce_ldrun" arcade_pce_loht = "pce_loht" arcade_pce_lostsunh = "pce_lostsunh" arcade_pce_magchase = "pce_magchase" arcade_pce_makaihak = "pce_makaihak" arcade_pce_makaipri = "pce_makaipri" arcade_pce_makyoden = "pce_makyoden" arcade_pce_maniacpw = "pce_maniacpw" arcade_pce_marchen = "pce_marchen" arcade_pce_mesopot = "pce_mesopot" arcade_pce_metlstok = "pce_metlstok" arcade_pce_mikkoku = "pce_mikkoku" arcade_pce_mizubaku = "pce_mizubaku" arcade_pce_mjgakmld = "pce_mjgakmld" arcade_pce_mjgakmld1 = "pce_mjgakmld" arcade_pce_mjgakuen = "pce_mjgakuen" arcade_pce_mjgokusp = "pce_mjgokusp" arcade_pce_mjkaiser = "pce_mjkaiser" arcade_pce_mjwars = "pce_mjwars" arcade_pce_mnstprow = "pce_mnstprow" arcade_pce_momo2 = "pce_momo2" arcade_pce_momogdn = "pce_momogdn" arcade_pce_momoktsg = "pce_momoktsg" arcade_pce_momotrbo = "pce_momotrbo" arcade_pce_moritash = "pce_moritash" arcade_pce_motoroad = "pce_motoroad" arcade_pce_motorod2 = "pce_motorod2" arcade_pce_motorod2a = "pce_motorod2" arcade_pce_mrheli = "pce_mrheli" arcade_pce_mrheli1 = "pce_mrheli" arcade_pce_naxopen = "pce_naxopen" arcade_pce_naxstad = "pce_naxstad" arcade_pce_nazomasq = "pce_nazomasq" arcade_pce_necromcr = "pce_necromcr" arcade_pce_necros = "pce_necros" arcade_pce_nectaris = "pce_nectaris" arcade_pce_nekdodge = "pce_nekdodge" arcade_pce_neksoccr = "pce_neksoccr" arcade_pce_neutopi2 = "pce_neutopi2" arcade_pce_neutopia = "pce_neutopia" arcade_pce_nhktaidr = "pce_nhktaidr" arcade_pce_nicklaus = "pce_nicklaus" arcade_pce_nikopun = "pce_nikopun" arcade_pce_ninjawar = "pce_ninjawar" arcade_pce_nryukend = "pce_nryukend" arcade_pce_oboccha = "pce_oboccha" arcade_pce_opwolf = "pce_opwolf" arcade_pce_ordyne = "pce_ordyne" arcade_pce_outlive = "pce_outlive" arcade_pce_outrun = "pce_outrun" arcade_pce_override = "pce_override" arcade_pce_p47 = "pce_p47" arcade_pce_pachikun = "pce_pachikun" arcade_pce_pacland = "pce_pacland" arcade_pce_paranoia = "pce_paranoia" arcade_pce_parasol = "pce_parasol" arcade_pce_parodius = "pce_parodius" arcade_pce_pcdenj = "pce_pcdenj" arcade_pce_pcdenja = "pce_pcdenj" arcade_pce_pcgenj = "pce_pcgenj" arcade_pce_pcgenj2 = "pce_pcgenj2" arcade_pce_pcgenj3 = "pce_pcgenj3" arcade_pce_pcgenj3t = "pce_pcgenj3t" arcade_pce_pcgenja = "pce_pcgenj" arcade_pce_pcpachi = "pce_pcpachi" arcade_pce_pdrift = "pce_pdrift" arcade_pce_pdrift1 = "pce_pdrift" arcade_pce_pgolf = "pce_pgolf" arcade_pce_pleag2 = "pce_pleag2" arcade_pce_pleag3 = "pce_pleag3" arcade_pce_pleag4 = "pce_pleag4" arcade_pce_pleag5 = "pce_pleag5" arcade_pce_pleag93 = "pce_pleag93" arcade_pce_pleagas = "pce_pleagas" arcade_pce_pleague = "pce_pleague" arcade_pce_populous = "pce_populous" arcade_pce_populous1 = "pce_populous" arcade_pce_power11 = "pce_power11" arcade_pce_powergat = "pce_powergat" arcade_pce_proyak = "pce_proyak" arcade_pce_proyak89 = "pce_proyak89" arcade_pce_proyak90 = "pce_proyak90" arcade_pce_proyak91 = "pce_proyak91" arcade_pce_psports = "pce_psports" arcade_pce_psychas = "pce_psychas" arcade_pce_ptennis = "pce_ptennis" arcade_pce_ptennwc = "pce_ptennwc" arcade_pce_puzzlboy = "pce_puzzlboy" arcade_pce_puzznic = "pce_puzznic" arcade_pce_quizts = "pce_quizts" arcade_pce_rabiolep = "pce_rabiolep" arcade_pce_racindam = "pce_racindam" arcade_pce_raiden = "pce_raiden" arcade_pce_rastan2 = "pce_rastan2" arcade_pce_reflectron = "pce_reflectron" arcade_pce_rockon = "pce_rockon" arcade_pce_rtypep1 = "pce_rtypep1" arcade_pce_rtypep2 = "pce_rtypep2" arcade_pce_ryukyu = "pce_ryukyu" arcade_pce_sadaki7 = "pce_sadaki7" arcade_pce_saigonin = "pce_saigonin" arcade_pce_salamand = "pce_salamand" arcade_pce_santatlantean = "pce_santatlantean" arcade_pce_scdsys = "pce_scdsys" arcade_pce_sci = "pce_sci" arcade_pce_sdragon = "pce_sdragon" arcade_pce_sekigaha = "pce_sekigaha" arcade_pce_sengokmj = "pce_sengokmj" arcade_pce_sf2ce = "pce_sf2ce" arcade_pce_shanghai = "pce_shanghai" arcade_pce_sharrier = "pce_sharrier" arcade_pce_shingen = "pce_shingen" arcade_pce_shingen1 = "pce_shingen" arcade_pce_shinobi = "pce_shinobi" arcade_pce_shiryo = "pce_shiryo" arcade_pce_shogisi = "pce_shogisi" arcade_pce_shogism = "pce_shogism" arcade_pce_shubibi = "pce_shubibi" arcade_pce_shubibi2 = "pce_shubibi2" arcade_pce_sidearms = "pce_sidearms" arcade_pce_silentd = "pce_silentd" arcade_pce_sindibad = "pce_sindibad" arcade_pce_skweek = "pce_skweek" arcade_pce_smcrush = "pce_smcrush" arcade_pce_smomo = "pce_smomo" arcade_pce_smomo2 = "pce_smomo2" arcade_pce_sokoban = "pce_sokoban" arcade_pce_soldblad = "pce_soldblad" arcade_pce_soldblas = "pce_soldblas" arcade_pce_sonson2 = "pce_sonson2" arcade_pce_spaceinv = "pce_spaceinv" arcade_pce_spinpair = "pce_spinpair" arcade_pce_spirwave = "pce_spirwave" arcade_pce_splatth = "pce_splatth" arcade_pce_sssoldr = "pce_sssoldr" arcade_pce_stratego = "pce_stratego" arcade_pce_stripf2 = "pce_stripf2" arcade_pce_susano = "pce_susano" arcade_pce_svolley = "pce_svolley" arcade_pce_takameib = "pce_takameib" arcade_pce_tatsujin = "pce_tatsujin" arcade_pce_tatsujinp = "pce_tatsujin" arcade_pce_tatsunok = "pce_tatsunok" arcade_pce_tblade = "pce_tblade" arcade_pce_tennokoe = "pce_tennokoe" arcade_pce_terracr2 = "pce_terracr2" arcade_pce_timcrus2 = "pce_timcrus2" arcade_pce_titan = "pce_titan" arcade_pce_tnzs = "pce_tnzs" arcade_pce_toiletk = "pce_toiletk" arcade_pce_toramich = "pce_toramich" arcade_pce_toyshopb = "pce_toyshopb" arcade_pce_tricky = "pce_tricky" arcade_pce_tsuppari = "pce_tsuppari" arcade_pce_tvbasket = "pce_tvbasket" arcade_pce_tvfootbl = "pce_tvfootbl" arcade_pce_tvhockey = "pce_tvhockey" arcade_pce_twinbee = "pce_twinbee" arcade_pce_usaprobs = "pce_usaprobs" arcade_pce_valkyrie = "pce_valkyrie" arcade_pce_veigues = "pce_veigues" arcade_pce_victoryr = "pce_victoryr" arcade_pce_vigilant = "pce_vigilant" arcade_pce_violents = "pce_violents" arcade_pce_volfied = "pce_volfied" arcade_pce_waiwaimj = "pce_waiwaimj" arcade_pce_wallaby = "pce_wallaby" arcade_pce_wataru = "pce_wataru" arcade_pce_wbeach = "pce_wbeach" arcade_pce_wcircuit = "pce_wcircuit" arcade_pce_winshot = "pce_winshot" arcade_pce_wjockey = "pce_wjockey" arcade_pce_wonderm = "pce_wonderm" arcade_pce_wring = "pce_wring" arcade_pce_xevious = "pce_xevious" arcade_pce_xserd = "pce_xserd" arcade_pce_xwiber = "pce_xwiber" arcade_pce_youkaid = "pce_youkaid" arcade_pce_yuyu = "pce_yuyu" arcade_pce_zero4c = "pce_zero4c" arcade_pce_zero4ca = "pce_zero4c" arcade_pce_zipang = "pce_zipang" arcade_pcktgal = "pcktgal" arcade_pcktgal2 = "pcktgal" arcade_pcktgalb = "pcktgal" arcade_pclubj = "pclubj" arcade_pclubjv2 = "pclubj" arcade_pclubjv4 = "pclubj" arcade_pclubjv5 = "pclubj" arcade_pclubys = "pclubys" arcade_pclubysa = "pclubys" arcade_pdrift = "pdrift" arcade_pdrifta = "pdrift" arcade_pdrifte = "pdrift" arcade_pdriftj = "pdrift" arcade_peekaboo = "peekaboo" arcade_peekaboou = "peekaboo" arcade_peepshow = "mjfocus" arcade_peggle = "peggle" arcade_pegglet = "peggle" arcade_penbros = "penbros" arcade_pengadvb = "pengadvb" arcade_pengo = "pengo" arcade_pengo2 = "pengo" arcade_pengo2u = "pengo" arcade_pengo3u = "pengo" arcade_pengo4 = "pengo" arcade_pengo5 = "pengo" arcade_pengob = "pengo" arcade_penta = "pengo" arcade_pepper2 = "pepper2" arcade_percuss = "percuss" arcade_perestro = "perestro" arcade_perfrman = "perfrman" arcade_perfrmanu = "perfrman" arcade_perfrmau = "perfrman" arcade_pestplce = "mario" arcade_peterpak = "peterpak" arcade_pettanp = "pettanp" arcade_pfghtj = "sgemf" arcade_pgalvip = "pgalvip" arcade_pgalvipa = "pgalvip" arcade_pgear = "armwar" arcade_pgearr1 = "armwar" arcade_pgemeni = "pgemeni" arcade_pgm = "pgm" arcade_pgm3in1 = "pgm3in1" arcade_pgmdemo = "pgmdemo" arcade_pgmfrog = "pgmfrog" arcade_pgoal = "pgoal" arcade_phantasm = "avspirit" arcade_phantom2 = "phantom2" arcade_phantoma = "spectar" arcade_phelios = "phelios" arcade_pheliosj = "phelios" arcade_phoenix = "phoenix" arcade_phoenix2 = "phoenix" arcade_phoenix3 = "phoenix" arcade_phoenixa = "phoenix" arcade_phoenixass = "phoenix" arcade_phoenixb = "phoenix" arcade_phoenixc = "phoenix" arcade_phoenixc2 = "phoenix" arcade_phoenixc3 = "phoenix" arcade_phoenixc4 = "phoenix" arcade_phoenixdal = "phoenix" arcade_phoenixi = "phoenix" arcade_phoenixj = "phoenix" arcade_phoenixs = "phoenix" arcade_phoenixt = "phoenix" arcade_phoenxp2 = "phoenix" arcade_photof = "wwjgtin" arcade_photoy2k = "photoy2k" arcade_photoy2k102 = "photoy2k" arcade_photoy2k104 = "photoy2k" arcade_phozon = "phozon" arcade_phozons = "phozon" arcade_pickin = "pickin" arcade_pignewt = "pignewt" arcade_pignewta = "pignewt" arcade_pigout = "pigout" arcade_pigouta = "pigout" arcade_pigskin = "pigskin" arcade_pinbo = "pinbo" arcade_pinbos = "pinbo" arcade_pingpong = "pingpong" arcade_pipedrm = "pipedrm" arcade_pipedrmj = "pipedrm" arcade_pipedrmt = "pipedrm" arcade_pipedrmu = "pipedrm" arcade_pipibibi = "pipibibs" arcade_pipibibs = "pipibibs" arcade_pipibibsa = "pipibibs" arcade_pipibibsp = "pipibibs" arcade_piranha = "puckman" arcade_piranhah = "puckman" arcade_piranhao = "puckman" arcade_pirates = "pirates" arcade_piratesb = "pirates" arcade_piratpet = "junglek" arcade_pisces = "pisces" arcade_piscesb = "pisces" arcade_pistoldm = "pistoldm" arcade_pitfall2 = "pitfall2" arcade_pitfall2a = "pitfall2" arcade_pitfall2u = "pitfall2" arcade_pitfallu = "pitfall2" arcade_pitfigh3 = "pitfight" arcade_pitfighb = "pitfight" arcade_pitfighj = "pitfight" arcade_pitfight = "pitfight" arcade_pitnrun = "pitnrun" arcade_pitnruna = "pitnrun" arcade_pkladiel = "pkladies" arcade_pkladies = "pkladies" arcade_pkladiesl = "pkladies" arcade_pkladiesla = "pkladies" arcade_pkscram = "pkscram" arcade_pktgaldj = "pktgaldx" arcade_pktgaldx = "pktgaldx" arcade_pktgaldxb = "pktgaldx" arcade_pktgaldxj = "pktgaldx" arcade_pkunwar = "pkunwar" arcade_pkunwarj = "pkunwar" arcade_platoon = "platoon" arcade_playball = "playball" arcade_plctr13b = "policetr" arcade_plegends = "plegends" arcade_plegendsj = "plegends" arcade_pleiadbl = "pleiads" arcade_pleiadce = "pleiads" arcade_pleiads = "pleiads" arcade_pleiadsb2 = "pleiads" arcade_pleiadsi = "pleiads" arcade_pleiadsn = "pleiads" arcade_pleiadss = "pleiads" arcade_plgirls = "plgirls" arcade_plgirls2 = "plgirls2" arcade_plgirls2b = "plgirls2" arcade_plotting = "plotting" arcade_plottinga = "plotting" arcade_plottingb = "plotting" arcade_plottingu = "plotting" arcade_plumppop = "plumppop" arcade_plusalph = "plusalph" arcade_plygonet = "plygonet" arcade_pnickj = "pnickj" arcade_pnicku = "pnickj" arcade_pnyaa = "pnyaa" arcade_pnyaaa = "pnyaa" arcade_poitto = "poitto" arcade_poknight = "poknight" arcade_pokonyan = "pokonyan" arcade_polaris = "polaris" arcade_polarisa = "polaris" arcade_polepos = "polepos" arcade_polepos1 = "polepos" arcade_polepos2 = "polepos2" arcade_poleposa = "polepos" arcade_poleps2a = "polepos2" arcade_poleps2b = "polepos2" arcade_policeto = "policetr" arcade_policetr = "policetr" arcade_pollux = "pollux" arcade_polluxa = "pollux" arcade_polluxa2 = "pollux" arcade_polluxn = "pollux" arcade_polyplay = "polyplay" arcade_pompingw = "pang" arcade_ponchin = "ponchin" arcade_ponchina = "ponchin" arcade_ponpoko = "ponpoko" arcade_ponpokov = "ponpoko" arcade_poolshrk = "poolshrk" arcade_pootan = "pooyan" arcade_pooyan = "pooyan" arcade_pooyans = "pooyan" arcade_popbingo = "popbingo" arcade_popbounc = "popbounc" arcade_popeye = "popeye" arcade_popeyebl = "popeye" arcade_popeyef = "popeye" arcade_popeyej = "popeye" arcade_popeyejo = "popeye" arcade_popeyeman = "puckman" arcade_popeyeu = "popeye" arcade_popflama = "popflame" arcade_popflamb = "popflame" arcade_popflame = "popflame" arcade_popflamea = "popflame" arcade_popflameb = "popflame" arcade_popflamen = "popflame" arcade_popnpop = "popnpop" arcade_popnpopj = "popnpop" arcade_popnpopu = "popnpop" arcade_popper = "popper" arcade_popspops = "popspops" arcade_porky = "porky" arcade_porter = "dockman" arcade_portman = "dockman" arcade_portmanj = "dockman" arcade_portrait = "portrait" arcade_potogold = "leprechn" arcade_potopoto = "potopoto" arcade_poundfor = "poundfor" arcade_poundforj = "poundfor" arcade_poundforu = "poundfor" arcade_poundfou = "poundfor" arcade_pow = "pow" arcade_powerdrv = "powerdrv" arcade_powerina = "powerins" arcade_powerins = "powerins" arcade_powerinsa = "powerins" arcade_powerinsb = "powerins" arcade_powerinsj = "powerins" arcade_powj = "pow" arcade_powrplay = "powrplay" arcade_ppan = "hook" arcade_ppchamp = "gotcha" arcade_pprobe = "pprobe" arcade_prehisle = "prehisle" arcade_prehisleb = "prehisle" arcade_prehislek = "prehisle" arcade_prehisleu = "prehisle" arcade_prehislu = "prehisle" arcade_preisle2 = "preisle2" arcade_prikura = "prikura" arcade_primella = "gundl94" arcade_primglex = "primglex" arcade_primrag2 = "primrag2" arcade_primraga = "primrage" arcade_primrage = "primrage" arcade_prmrsocj = "prmrsocr" arcade_prmrsocr = "prmrsocr" arcade_prmtmfgo = "trstar" arcade_prmtmfgt = "trstar" arcade_prmtmfgto = "trstar" arcade_profpac = "profpac" arcade_progear = "progear" arcade_progeara = "progear" arcade_progearj = "progear" arcade_progearjbl = "progear" arcade_progearjd = "progear" arcade_progearud = "progear" arcade_progolf = "progolf" arcade_progolfa = "progolf" arcade_progress = "progress" arcade_propcycl = "propcycl" arcade_prosoccr = "prosoccr" arcade_prosport = "prosport" arcade_prtytime = "prtytime" arcade_psailor1 = "psailor1" arcade_psailor2 = "psailor2" arcade_psoldier = "ssoldier" arcade_pspikes = "pspikes" arcade_pspikes2 = "pspikes2" arcade_pspikesk = "pspikes" arcade_pspikesu = "pspikes" arcade_pstadium = "pstadium" arcade_psurge = "psurge" arcade_psychic5 = "psychic5" arcade_psychic5j = "psychic5" arcade_psychos = "psychos" arcade_psychosj = "psychos" arcade_psyforce = "psyforce" arcade_ptblank = "ptblank" arcade_pturn = "pturn" arcade_puchicar = "puchicar" arcade_puchicarj = "puchicar" arcade_puckman = "puckman" arcade_puckmana = "puckman" arcade_puckmanb = "puckman" arcade_puckmanf = "puckman" arcade_puckmanh = "puckman" arcade_puckmod = "puckman" arcade_puckpkmn = "puckpkmn" arcade_pulirula = "pulirula" arcade_pulirulaj = "pulirula" arcade_pulirulj = "pulirula" arcade_pulsar = "pulsar" arcade_pulstar = "pulstar" arcade_punchita = "punchout" arcade_punchout = "punchout" arcade_punchouta = "punchout" arcade_punchoutj = "punchout" arcade_punipic = "punisher" arcade_punipic2 = "punisher" arcade_punipic3 = "punisher" arcade_punisher = "punisher" arcade_punisherb = "punisher" arcade_punisherbz = "punisher" arcade_punisherh = "punisher" arcade_punisherj = "punisher" arcade_punisheru = "punisher" arcade_punishrj = "punisher" arcade_punishru = "punisher" arcade_punkshot = "punkshot" arcade_punkshot2 = "punkshot" arcade_punkshotj = "punkshot" arcade_punksht2 = "punkshot" arcade_punkshtj = "punkshot" arcade_pururun = "pururun" arcade_pushman = "pushman" arcade_pushmana = "pushman" arcade_pushmans = "pushman" arcade_puyopuy2 = "puyopuy2" arcade_puyopuya = "puyopuyo" arcade_puyopuyb = "puyopuyo" arcade_puyopuyo = "puyopuyo" arcade_puyosun = "puyosun" arcade_puzlclub = "puzlclub" arcade_puzldama = "puzldama" arcade_puzloopj = "puzzloop" arcade_puzloopu = "puzzloop" arcade_puzlstar = "puzlstar" arcade_puzzldpr = "puzzledp" arcade_puzzledp = "puzzledp" arcade_puzzli = "puzzli" arcade_puzzli2 = "puzzli2" arcade_puzzli2s = "puzzli2" arcade_puzzloop = "puzzloop" arcade_puzzloopa = "puzzloop" arcade_puzzloope = "puzzloop" arcade_puzzloopj = "puzzloop" arcade_puzzloopk = "puzzloop" arcade_puzzloopu = "puzzloop" arcade_puzzlove = "puzzlove" arcade_puzzlovek = "puzzlove" arcade_puzznic = "puzznic" arcade_puzznicb = "puzznic" arcade_puzznicba = "puzznic" arcade_puzznici = "puzznic" arcade_puzznicj = "puzznic" arcade_puzznicu = "puzznic" arcade_pwheelsj = "dblaxle" arcade_pwrgoal = "pwrgoal" arcade_pwrinst2 = "pwrinst2" arcade_pwrinst2j = "pwrinst2" arcade_py2k2 = "py2k2" arcade_pyros = "wardner" arcade_pzlbowl = "pzlbowl" arcade_pzlbreak = "pzlbreak" arcade_pzloop2 = "pzloop2" arcade_pzloop2j = "pzloop2" arcade_pzloop2jr1 = "pzloop2" arcade_qad = "qad" arcade_qadj = "qad" arcade_qadjr = "qad" arcade_qbert = "qbert" arcade_qberta = "qbert" arcade_qbertj = "qbert" arcade_qbertjp = "qbert" arcade_qbertqub = "qbertqub" arcade_qberttst = "qbert" arcade_qcrayon = "qcrayon" arcade_qcrayon2 = "qcrayon2" arcade_qgakumon = "qgakumon" arcade_qgh = "qgh" arcade_qix = "qix" arcade_qix2 = "qix" arcade_qixa = "qix" arcade_qixb = "qix" arcade_qjinsei = "qjinsei" arcade_qmhayaku = "qmhayaku" arcade_qndream = "qndream" arcade_qrouka = "qrouka" arcade_qsangoku = "qsangoku" arcade_qsww = "qsww" arcade_qtheater = "qtheater" arcade_qtono1 = "qtono1" arcade_qtono2 = "qtono2" arcade_qtono2j = "qtono2j" arcade_qtorimon = "qtorimon" arcade_quantum = "quantum" arcade_quantum1 = "quantum" arcade_quantump = "quantum" arcade_quarterb = "quarterb" arcade_quartet = "quartet" arcade_quartet2 = "quartet" arcade_quartet2a = "quartet" arcade_quarteta = "quartet" arcade_quartetj = "quartet" arcade_quarth = "blockhl" arcade_quartrba = "quarterb" arcade_quartt2j = "quartet" arcade_quester = "quester" arcade_questers = "quester" arcade_quiz18k = "quiz18k" arcade_quiz365 = "quiz365" arcade_quizchq = "quizchq" arcade_quizchql = "quizchq" arcade_quizdai2 = "quizdai2" arcade_quizdais = "quizdais" arcade_quizdaisk = "quizdais" arcade_quizdna = "quizdna" arcade_quizf1 = "quizf1" arcade_quizhq = "quizhq" arcade_quizhuhu = "quizhuhu" arcade_quizkof = "quizkof" arcade_quizkofk = "quizkof" arcade_quizmeku = "quizmeku" arcade_quizmoon = "quizmoon" arcade_quizo = "quizo" arcade_quizoa = "quizo" arcade_quizpani = "quizpani" arcade_quiztou = "quiztou" arcade_quiztvqq = "quiztvqq" arcade_qwak = "qwak" arcade_qzchikyu = "qzchikyu" arcade_qzkklgy2 = "qzkklgy2" arcade_qzkklogy = "qzkklogy" arcade_qzquest = "qzquest" arcade_qzshowby = "qzshowby" arcade_r2dtank = "r2dtank" arcade_r2dx_v33 = "r2dx_v33" arcade_r2dx_v33_r2 = "r2dx_v33" arcade_rabbit = "rabbit" arcade_rabiolep = "rabiolep" arcade_racedcb4 = "racedriv" arcade_racedcg4 = "racedriv" arcade_racedrb1 = "racedriv" arcade_racedrb4 = "racedriv" arcade_racedrc1 = "racedriv" arcade_racedrc2 = "racedriv" arcade_racedrc4 = "racedriv" arcade_racedrcb = "racedriv" arcade_racedrcg = "racedriv" arcade_racedrg1 = "racedriv" arcade_racedrg4 = "racedriv" arcade_racedriv = "racedriv" arcade_racedrv1 = "racedriv" arcade_racedrv2 = "racedriv" arcade_racedrv3 = "racedriv" arcade_racedrv4 = "racedriv" arcade_racedrvb = "racedriv" arcade_racedrvc = "racedriv" arcade_racedrvg = "racedriv" arcade_rachero = "rachero" arcade_racherod = "rachero" arcade_racinfrc = "racinfrc" arcade_racingb = "racingb" arcade_racingbj = "racingb" arcade_rackemup = "rackemup" arcade_racknrol = "racknrol" arcade_racoon = "racoon" arcade_radarscp = "radarscp" arcade_radarscp1 = "radarscp" arcade_radarzn1 = "radarzon" arcade_radarznt = "radarzon" arcade_radarzon = "radarzon" arcade_radm = "radm" arcade_radr = "radr" arcade_radrad = "radrad" arcade_radradj = "radrad" arcade_raflesia = "raflesia" arcade_ragnagrd = "ragnagrd" arcade_ragtime = "boogwing" arcade_ragtimea = "boogwing" arcade_raiden = "raiden" arcade_raiden2 = "raiden2" arcade_raiden2dx = "raiden2" arcade_raiden2e = "raiden2" arcade_raiden2ea = "raiden2" arcade_raiden2eg = "raiden2" arcade_raiden2eu = "raiden2" arcade_raiden2eua = "raiden2" arcade_raiden2f = "raiden2" arcade_raiden2g = "raiden2" arcade_raiden2hk = "raiden2" arcade_raiden2i = "raiden2" arcade_raiden2j = "raiden2" arcade_raiden2nl = "raiden2" arcade_raiden2sw = "raiden2" arcade_raiden2u = "raiden2" arcade_raidena = "raiden" arcade_raidenb = "raiden" arcade_raidendx = "raidendx" arcade_raidendxa1 = "raidendx" arcade_raidendxa2 = "raidendx" arcade_raidendxch = "raidendx" arcade_raidendxg = "raidendx" arcade_raidendxj = "raidendx" arcade_raidendxk = "raidendx" arcade_raidendxnl = "raidendx" arcade_raidendxu = "raidendx" arcade_raidenk = "raiden" arcade_raidenkb = "raiden" arcade_raident = "raiden" arcade_raidenu = "raiden" arcade_raidenua = "raiden" arcade_raiders5 = "raiders5" arcade_raiders5t = "raiders5" arcade_raidrs5t = "raiders5" arcade_raiga = "stratof" arcade_raimais = "raimais" arcade_raimaisj = "raimais" arcade_raimaisjo = "raimais" arcade_rainbow = "rainbow" arcade_rainbowe = "rainbow" arcade_rainbowo = "rainbow" arcade_rallybik = "rallybik" arcade_rallys = "spectar" arcade_rallyx = "rallyx" arcade_rallyxa = "rallyx" arcade_rallyxm = "rallyx" arcade_rallyxmr = "rallyx" arcade_rambo3 = "rambo3" arcade_rambo3a = "rambo3" arcade_rambo3ae = "rambo3" arcade_rambo3p = "rambo3" arcade_rambo3u = "rambo3" arcade_rampage = "rampage" arcade_rampage2 = "rampage" arcade_rampart = "rampart" arcade_rampartj = "rampart" arcade_ramprt2p = "rampart" arcade_raphero = "arcadian" arcade_rascot = "rascot" arcade_rastan = "rastan" arcade_rastana = "rastan" arcade_rastanb = "rastan" arcade_rastanu = "rastan" arcade_rastanu2 = "rastan" arcade_rastanua = "rastan" arcade_rastanub = "rastan" arcade_rastsag2 = "nastar" arcade_rastsaga = "rastan" arcade_rastsagaa = "rastan" arcade_rastsagab = "rastan" arcade_raveracw = "raveracw" arcade_rayforce = "gunlock" arcade_rayforcej = "gunlock" arcade_rayforcj = "gunlock" arcade_raystorm = "raystorm" arcade_razmataz = "razmataz" arcade_rbff1 = "rbff1" arcade_rbff1a = "rbff1" arcade_rbff1k = "rbff1" arcade_rbff2 = "rbff2" arcade_rbff2a = "rbff2" arcade_rbff2h = "rbff2" arcade_rbff2k = "rbff2" arcade_rbffspec = "rbffspec" arcade_rbffspeck = "rbffspec" arcade_rbibb = "rbibb" arcade_rbibba = "rbibb" arcade_rbisland = "rbisland" arcade_rbislande = "rbislande" arcade_rbislando = "rbisland" arcade_rbtapper = "tapper" arcade_rchase = "rchase" arcade_rchasej = "rchase" arcade_rckman2j = "megaman2" arcade_rdaction = "ninjakd2" arcade_reactor = "reactor" arcade_reaktor = "reaktor" arcade_realbrk = "realbrk" arcade_recalh = "recalh" arcade_recordbr = "recordbr" arcade_redalert = "redalert" arcade_redbaron = "redbaron" arcade_redclash = "redclash" arcade_redclask = "redclash" arcade_redearth = "redearth" arcade_redearthr1 = "redearth" arcade_redfoxwp2 = "grdnstrm" arcade_redfoxwp2a = "grdnstrm" arcade_redhawk = "stagger1" arcade_redhawkb = "stagger1" arcade_redhawke = "stagger1" arcade_redhawkg = "stagger1" arcade_redhawki = "stagger1" arcade_redhawkk = "stagger1" arcade_redlin2p = "redlin2p" arcade_redrobin = "redrobin" arcade_redufo = "redufo" arcade_redufob = "redufo" arcade_regulus = "regulus" arcade_reguluso = "regulus" arcade_regulusu = "regulus" arcade_reikaids = "reikaids" arcade_relief = "relief" arcade_relief2 = "relief" arcade_renaiclb = "renaiclb" arcade_renegade = "renegade" arcade_repulse = "repulse" arcade_rescraid = "rescraid" arcade_rescrdsa = "rescraid" arcade_rescue = "rescue" arcade_retofin1 = "retofinv" arcade_retofin2 = "retofinv" arcade_retofinv = "retofinv" arcade_retofinvb = "retofinv" arcade_retofinvb1 = "retofinv" arcade_retofinvb2 = "retofinv" arcade_retofinvb3 = "retofinv" arcade_revenger = "revngr84" arcade_revngr84 = "revngr84" arcade_revx = "revx" arcade_rezon = "rezon" arcade_rezont = "rezon" arcade_rf2 = "konamigt" arcade_ribbit = "ribbit" arcade_ridefgtj = "ridingf" arcade_ridefgtu = "ridingf" arcade_ridger2j = "ridger2j" arcade_ridgeraj = "ridgeraj" arcade_ridhero = "ridhero" arcade_ridheroh = "ridhero" arcade_ridingf = "ridingf" arcade_ridingfj = "ridingf" arcade_ridingfu = "ridingf" arcade_ridleofp = "ridleofp" arcade_rimrck12 = "rimrockn" arcade_rimrck16 = "rimrockn" arcade_rimrck20 = "rimrockn" arcade_rimrockn = "rimrockn" arcade_ringdest = "ringdest" arcade_ringdesta = "ringdest" arcade_ringdesth = "ringdest" arcade_ringdstd = "ringdest" arcade_ringfgt = "vsgongf" arcade_ringfgt2 = "vsgongf" arcade_ringkin2 = "kingofb" arcade_ringkin3 = "kingofb" arcade_ringking = "kingofb" arcade_ringohja = "mainevt" arcade_ringrage = "ringrage" arcade_ringragej = "ringrage" arcade_ringrageu = "ringrage" arcade_ringragj = "ringrage" arcade_ringragu = "ringrage" arcade_riot = "riot" arcade_riotcity = "riotcity" arcade_ripcord = "ripcord" arcade_ripoff = "ripoff" arcade_riskchal = "riskchal" arcade_rittam = "rodland" arcade_rjammer = "rjammer" arcade_rmancp2j = "megaman" arcade_rmhaihai = "rmhaihai" arcade_rmhaihib = "rmhaihai" arcade_rmhaijin = "rmhaijin" arcade_rmhaisei = "rmhaisei" arcade_rmpgwt = "rmpgwt" arcade_rmpgwt11 = "rmpgwt" arcade_roadblc1 = "roadblst" arcade_roadblcg = "roadblst" arcade_roadblg1 = "roadblst" arcade_roadblg2 = "roadblst" arcade_roadbls1 = "roadblst" arcade_roadbls2 = "roadblst" arcade_roadbls3 = "roadblst" arcade_roadblsc = "roadblst" arcade_roadblsg = "roadblst" arcade_roadblst = "roadblst" arcade_roadf = "roadf" arcade_roadf2 = "roadf" arcade_roadf3 = "roadf" arcade_roadriot = "roadriot" arcade_roadrun1 = "roadrunn" arcade_roadrun2 = "roadrunn" arcade_roadrunn = "roadrunn" arcade_robby = "robby" arcade_roboarma = "roboarmy" arcade_roboarmy = "roboarmy" arcade_robocop = "robocop" arcade_robocop2 = "robocop2" arcade_robocop2j = "robocop2" arcade_robocop2u = "robocop2" arcade_robocop2ua = "robocop2" arcade_robocopb = "robocop" arcade_robocopb2 = "robocop" arcade_robocopi = "robocopi" arcade_robocopj = "robocop" arcade_robocopu = "robocop" arcade_robocopu0 = "robocop" arcade_robocopw = "robocop" arcade_robocp2j = "robocop2" arcade_robocp2u = "robocop2" arcade_robocpu0 = "robocop" arcade_robokid = "robokid" arcade_robokidj = "robokid" arcade_robokidj2 = "robokid" arcade_robokidj3 = "robokid" arcade_robotbwl = "robotbwl" arcade_robotron = "robotron" arcade_robotryo = "robotron" arcade_robowres = "robowres" arcade_rockclim = "rockclim" arcade_rockduck = "rockduck" arcade_rockman2j = "megaman2" arcade_rockmanj = "megaman" arcade_rockn = "rockn" arcade_rockn2 = "rockn2" arcade_rockn3 = "rockn3" arcade_rockn4 = "rockn4" arcade_rockna = "rockn" arcade_rockrage = "rockrage" arcade_rockragea = "rockrage" arcade_rockragej = "rockrage" arcade_rockragj = "rockrage" arcade_rocktris = "rocktris" arcade_rocktrv2 = "rocktrv2" arcade_rocnrope = "rocnrope" arcade_rocnropek = "rocnrope" arcade_rocnropk = "rocnrope" arcade_rodland = "rodland" arcade_rodlanda = "rodland" arcade_rodlandj = "rodland" arcade_rodlandjb = "rodland" arcade_rodlndjb = "rodland" arcade_rohga = "rohga" arcade_rohga1 = "rohga" arcade_rohga2 = "rohga" arcade_rohgah = "rohga" arcade_rohgau = "rohga" arcade_roishtar = "roishtar" arcade_rolcrush = "rolcrush" arcade_rolcrusha = "rolcrush" arcade_roldfrga = "roldfrog" arcade_roldfrog = "roldfrog" arcade_rollace = "fightrol" arcade_rollace2 = "fightrol" arcade_rollerg = "rollerg" arcade_rollergj = "rollerg" arcade_rollingc = "rollingc" arcade_rompers = "rompers" arcade_romperso = "rompers" arcade_rongrong = "rongrong" arcade_ropeman = "rocnrope" arcade_rotaryf = "rotaryf" arcade_rotd = "rotd" arcade_rotdh = "rotd" arcade_rougien = "rougien" arcade_roundup = "roundup" arcade_route16 = "route16" arcade_route16a = "route16" arcade_route16b = "route16" arcade_route16bl = "route16" arcade_route16c = "route16" arcade_routex = "route16" arcade_royalmah = "royalmah" arcade_rpatrol = "rpatrol" arcade_rpatrolb = "rpatrol" arcade_rpunch = "rabiolep" arcade_rranger = "rranger" arcade_rrreveng = "rrreveng" arcade_rrrevenp = "rrreveng" arcade_rsgun = "rsgun" arcade_rshark = "rshark" arcade_rthun2 = "rthun2" arcade_rthun2j = "rthun2" arcade_rthunder = "rthunder" arcade_rthunder0 = "rthunder" arcade_rthunder1 = "rthunder" arcade_rthunder2 = "rthunder" arcade_rthundera = "rthunder" arcade_rthundro = "rthunder" arcade_rtriv = "rtriv" arcade_rtype = "rtype" arcade_rtype2 = "rtype2" arcade_rtype2j = "rtype2" arcade_rtype2jc = "rtype2" arcade_rtypeb = "rtype" arcade_rtypej = "rtype" arcade_rtypejp = "rtype" arcade_rtypelej = "rtypeleo" arcade_rtypeleo = "rtypeleo" arcade_rtypeleoj = "rtypeleo" arcade_rtypepj = "rtype" arcade_rtypeu = "rtype" arcade_rugrats = "wiping" arcade_rumba = "rumba" arcade_runark = "growl" arcade_runaway = "runaway" arcade_rundeep = "thedeep" arcade_rungun = "rungun" arcade_rungun2 = "rungun2" arcade_rungunu = "rungun" arcade_rushatck = "gberet" arcade_rushcrsh = "srumbler" arcade_rushhero = "rushhero" arcade_rvschool = "rvschool" arcade_rygar = "rygar" arcade_rygar2 = "rygar" arcade_rygar3 = "rygar" arcade_rygarb = "rygar" arcade_rygarj = "rygar" arcade_ryorioh = "ryorioh" arcade_ryouran = "ryouran" arcade_ryujin = "ryujin" arcade_ryukendn = "shadoww" arcade_ryukendna = "shadoww" arcade_ryukyu = "ryukyu" arcade_ryukyud = "ryukyu" arcade_s1945 = "s1945" arcade_s1945a = "s1945" arcade_s1945ii = "s1945ii" arcade_s1945iii = "s1945iii" arcade_s1945j = "s1945" arcade_s1945jn = "s1945" arcade_s1945k = "s1945" arcade_s1945p = "s1945p" arcade_sabotenb = "sabotenb" arcade_sabotenba = "sabotenb" arcade_sabotnba = "sabotenb" arcade_sadari = "sadari" arcade_safari = "safari" arcade_safaria = "safari" arcade_safarir = "safarir" arcade_safarirj = "safarir" arcade_sailormn = "sailormn" arcade_sailormnh = "sailormn" arcade_sailormnj = "sailormn" arcade_sailormnk = "sailormn" arcade_sailormnn = "sailormn" arcade_sailormnnh = "sailormn" arcade_sailormnnj = "sailormn" arcade_sailormnnk = "sailormn" arcade_sailormnnt = "sailormn" arcade_sailormnnu = "sailormn" arcade_sailormno = "sailormn" arcade_sailormnoh = "sailormn" arcade_sailormnoj = "sailormn" arcade_sailormnok = "sailormn" arcade_sailormnot = "sailormn" arcade_sailormnou = "sailormn" arcade_sailormnt = "sailormn" arcade_sailormnu = "sailormn" arcade_sailormo = "sailormn" arcade_sailorwr = "sailorws" arcade_sailorws = "sailorws" arcade_saiyugb1 = "chinagat" arcade_saiyugb2 = "chinagat" arcade_saiyugou = "chinagat" arcade_saiyugoub1 = "chinagat" arcade_saiyugoub2 = "chinagat" arcade_salamand = "salamand" arcade_salamandj = "salamand" arcade_salamanj = "salamand" arcade_salmndr2 = "salmndr2" arcade_samesam2 = "fireshrk" arcade_samesame = "fireshrk" arcade_samesame2 = "fireshrk" arcade_samesamenh = "fireshrk" arcade_samsh5sp = "samsh5sp" arcade_samsh5sph = "samsh5sp" arcade_samsh5spho = "samsh5sp" arcade_samsho = "samsho" arcade_samsho2 = "samsho2" arcade_samsho2k = "samsho2" arcade_samsho2ka = "samsho2" arcade_samsho3 = "samsho3" arcade_samsho3h = "samsho3" arcade_samsho4 = "samsho4" arcade_samsho4k = "samsho4" arcade_samsho5 = "samsho5" arcade_samsho5a = "samsho5" arcade_samsho5b = "samsho5" arcade_samsho5h = "samsho5" arcade_samsho5x = "samsho5" arcade_samshoa = "samsho" arcade_samshoh = "samsho" arcade_samurai = "samurai" arcade_samuraia = "samuraia" arcade_sandor = "sandor" arcade_sandscrp = "sandscrp" arcade_sandscrpa = "sandscrp" arcade_sandscrpb = "sandscrp" arcade_sarge = "sarge" arcade_sarukani = "vblokbrk" arcade_sassisu = "sassisu" arcade_sasuke = "sasuke" arcade_satansat = "satansat" arcade_satansata = "satansat" arcade_satansatind = "satansat" arcade_sathena = "athena" arcade_saturn = "saturn" arcade_saturnzi = "saturnzi" arcade_sauro = "sauro" arcade_saurob = "sauro" arcade_saurop = "sauro" arcade_saurorr = "sauro" arcade_savagere = "savagere" arcade_savgbees = "exedexes" arcade_sbagman = "sbagman" arcade_sbagmans = "sbagman" arcade_sbasebal = "sbasebal" arcade_sbasebalj = "sbasebal" arcade_sbasketb = "sbasketb" arcade_sbaskete = "sbasketb" arcade_sbasketg = "sbasketb" arcade_sbasketh = "sbasketb" arcade_sbasketo = "sbasketb" arcade_sbasketu = "sbasketb" arcade_sbbros = "spang" arcade_sbdk = "superbik" arcade_sbishi = "sbishi" arcade_sbishik = "sbishi" arcade_sbishika = "sbishi" arcade_sbm = "sbm" arcade_sbmj = "sbm" arcade_sboblbob = "bublbobl" arcade_sboblbobl = "bublbobl" arcade_sboblbobla = "bublbobl" arcade_sboblboblb = "bublbobl" arcade_sboblboblc = "bublbobl" arcade_sboblbobld = "bublbobl" arcade_sbomber = "sbomber" arcade_sbombera = "sbomber" arcade_sbomberb = "sbomberb" arcade_sbowling = "sbowling" arcade_sbp = "sbp" arcade_sbrkout = "sbrkout" arcade_sbsgomo = "bioship" arcade_sbugger = "sbugger" arcade_scandal = "scandal" arcade_scandalm = "scandal" arcade_scessjoe = "scessjoe" arcade_scfinals = "scfinals" arcade_scfinalso = "scfinals" arcade_schaser = "schaser" arcade_schasrcv = "schaser" arcade_schmeisr = "schmeisr" arcade_sci = "sci" arcade_scia = "sci" arcade_scij = "sci" arcade_scinegro = "sci" arcade_scion = "scion" arcade_scionc = "scion" arcade_sciu = "sci" arcade_scobra = "scobra" arcade_scobrab = "scobra" arcade_scobrae = "scobra" arcade_scobrag = "scobra" arcade_scobras = "scobra" arcade_scobrase = "scobra" arcade_scontra = "scontra" arcade_scontraj = "scontra" arcade_scorpion = "scorpion" arcade_scorpiona = "scorpion" arcade_scorpionb = "scorpion" arcade_scorpionmc = "scorpion" arcade_scorpnmc = "scorpnmc" arcade_scotrsht = "scotrsht" arcade_scramb2 = "scramble" arcade_scramblb = "scramble" arcade_scramble = "scramble" arcade_scramblebb = "scramble" arcade_scramblebf = "scramble" arcade_scrambler = "scramble" arcade_scrambles = "scramble" arcade_scrambls = "scramble" arcade_scrambp = "scramble" arcade_scramce = "scramble" arcade_scrampt = "scramble" arcade_scramrf = "scramble" arcade_scregg = "scregg" arcade_screwloo = "screwloo" arcade_scross = "scross" arcade_sctionza = "sectionz" arcade_scudhamm = "scudhamm" arcade_sdfight = "sdfight" arcade_sdgndmps = "sdgndmps" arcade_sdgndmrb = "sdgndmrb" arcade_sdi = "sdi" arcade_sdia = "sdi" arcade_sdib = "sdi" arcade_sdibl = "sdi" arcade_sdibl2 = "sdi" arcade_sdibl3 = "sdi" arcade_sdibl4 = "sdi" arcade_sdibl5 = "sdi" arcade_sdibl6 = "sdi" arcade_sdioj = "sdi" arcade_sdodgeb = "sdodgeb" arcade_sdtennis = "sdtennis" arcade_sdungeon = "sdungeon" arcade_seabass = "seabass" arcade_searchar = "searchar" arcade_searcharj = "searchar" arcade_searcharu = "searchar" arcade_searchey = "searchey" arcade_searcheya = "searchey" arcade_searchp2 = "searchp2" arcade_seawolf = "seawolf" arcade_seawolf2 = "seawolf2" arcade_secolove = "secolove" arcade_secretab = "slyspy" arcade_secretag = "secretag" arcade_secretagj = "secretag" arcade_sectionz = "sectionz" arcade_sectionza = "sectionz" arcade_sectrzon = "seicross" arcade_seganinj = "seganinj" arcade_seganinja = "seganinj" arcade_seganinju = "seganinj" arcade_seganinu = "seganinj" arcade_seicross = "seicross" arcade_seiha = "seiha" arcade_seiham = "seiha" arcade_selfeena = "selfeena" arcade_semibase = "semibase" arcade_sengekij = "sengekis" arcade_sengekis = "sengekis" arcade_sengekisj = "sengekis" arcade_sengokh = "sengoku" arcade_sengokmj = "sengokmj" arcade_sengoku = "sengoku" arcade_sengoku2 = "sengoku2" arcade_sengoku3 = "sengoku3" arcade_sengoku3s = "sengoku3" arcade_sengokuh = "sengoku" arcade_senjyo = "senjyo" arcade_senknow = "senknow" arcade_sentetst = "sentetst" arcade_sercharu = "searchar" arcade_setaroul = "setaroul" arcade_sexyparo = "sexyparo" arcade_sf = "sf" arcade_sf1 = "sf1" arcade_sf1jp = "sf1" arcade_sf1p = "sf1" arcade_sf1us = "sf1" arcade_sf2 = "sf2" arcade_sf2acc = "sf2ce" arcade_sf2acca = "sf2ce" arcade_sf2accp2 = "sf2ce" arcade_sf2amf = "sf2ce" arcade_sf2amf2 = "sf2ce" arcade_sf2amf3 = "sf2ce" arcade_sf2amf4 = "sf2ce" arcade_sf2amf5 = "sf2ce" arcade_sf2amf6 = "sf2ce" arcade_sf2amf7 = "sf2ce" arcade_sf2amf8 = "sf2ce" arcade_sf2b = "sf2" arcade_sf2b2 = "sf2" arcade_sf2b3 = "sf2" arcade_sf2b4 = "sf2" arcade_sf2bhh = "sf2ce" arcade_sf2ce = "sf2ce" arcade_sf2ceb = "sf2ce" arcade_sf2cebltw = "sf2ce" arcade_sf2cebr = "sf2ce" arcade_sf2ceea = "sf2ce" arcade_sf2ceeab2 = "sf2ce" arcade_sf2ceeab3 = "sf2ce" arcade_sf2ceeab4 = "sf2ce" arcade_sf2ceeab5 = "sf2ce" arcade_sf2ceeabl = "sf2ce" arcade_sf2ceh = "sf2ce" arcade_sf2cej = "sf2ce" arcade_sf2ceja = "sf2ce" arcade_sf2cejab2 = "sf2ce" arcade_sf2cejabl = "sf2ce" arcade_sf2cejb = "sf2ce" arcade_sf2cejc = "sf2ce" arcade_sf2cet = "sf2ce" arcade_sf2ceua = "sf2ce" arcade_sf2ceuab10 = "sf2ce" arcade_sf2ceuab2 = "sf2ce" arcade_sf2ceuab3 = "sf2ce" arcade_sf2ceuab4 = "sf2ce" arcade_sf2ceuab5 = "sf2ce" arcade_sf2ceuab6 = "sf2ce" arcade_sf2ceuab7 = "sf2ce" arcade_sf2ceuab8 = "sf2ce" arcade_sf2ceuab9 = "sf2ce" arcade_sf2ceuabl = "sf2ce" arcade_sf2ceub = "sf2ce" arcade_sf2ceuc = "sf2ce" arcade_sf2ceucbl = "sf2ce" arcade_sf2ceupl = "sf2ce" arcade_sf2dkot2 = "sf2ce" arcade_sf2dongb = "sf2ce" arcade_sf2eb = "sf2" arcade_sf2ebbl = "sf2" arcade_sf2ebbl2 = "sf2" arcade_sf2ebbl3 = "sf2" arcade_sf2ed = "sf2" arcade_sf2ee = "sf2" arcade_sf2em = "sf2" arcade_sf2hf = "sf2hf" arcade_sf2hfj = "sf2hf" arcade_sf2hfjb = "sf2hf" arcade_sf2hfjb2 = "sf2hf" arcade_sf2hfu = "sf2hf" arcade_sf2hfub = "sf2hf" arcade_sf2j = "sf2" arcade_sf2j17 = "sf2" arcade_sf2ja = "sf2" arcade_sf2jc = "sf2" arcade_sf2jf = "sf2" arcade_sf2jh = "sf2" arcade_sf2jl = "sf2" arcade_sf2jla = "sf2" arcade_sf2koryu = "sf2ce" arcade_sf2koryu2 = "sf2ce" arcade_sf2koryu3 = "sf2ce" arcade_sf2level = "sf2ce" arcade_sf2m1 = "sf2ce" arcade_sf2m2 = "sf2ce" arcade_sf2m3 = "sf2ce" arcade_sf2m4 = "sf2ce" arcade_sf2m5 = "sf2ce" arcade_sf2m6 = "sf2ce" arcade_sf2m7 = "sf2ce" arcade_sf2md = "sf2ce" arcade_sf2mdt = "sf2ce" arcade_sf2mdta = "sf2ce" arcade_sf2mdtb = "sf2ce" arcade_sf2mdtc = "sf2ce" arcade_sf2mega = "sf2ce" arcade_sf2mega2 = "sf2ce" arcade_sf2qp1 = "sf2" arcade_sf2qp2 = "sf2" arcade_sf2rb = "sf2ce" arcade_sf2rb2 = "sf2ce" arcade_sf2rb3 = "sf2ce" arcade_sf2rb4 = "sf2ce" arcade_sf2rb5 = "sf2ce" arcade_sf2rb6 = "sf2ce" arcade_sf2red = "sf2ce" arcade_sf2red2 = "sf2ce" arcade_sf2rules = "sf2" arcade_sf2sl73a = "sf2ce" arcade_sf2stt = "sf2" arcade_sf2t = "sf2ce" arcade_sf2thndr = "sf2" arcade_sf2thndr2 = "sf2" arcade_sf2tj = "sf2ce" arcade_sf2tlona = "sf2ce" arcade_sf2tlonb = "sf2ce" arcade_sf2tlonc = "sf2ce" arcade_sf2ua = "sf2" arcade_sf2ub = "sf2" arcade_sf2uc = "sf2" arcade_sf2ud = "sf2" arcade_sf2ue = "sf2" arcade_sf2uf = "sf2" arcade_sf2ug = "sf2" arcade_sf2ui = "sf2" arcade_sf2uk = "sf2" arcade_sf2v004 = "sf2ce" arcade_sf2v0042 = "sf2ce" arcade_sf2v0043 = "sf2ce" arcade_sf2yyc = "sf2ce" arcade_sf2yyc2 = "sf2ce" arcade_sfa = "sfa" arcade_sfa2 = "sfa2" arcade_sfa2u = "sfa2" arcade_sfa2ur1 = "sfa2" arcade_sfa3 = "sfa3" arcade_sfa3b = "sfa3" arcade_sfa3h = "sfa3" arcade_sfa3hr1 = "sfa3" arcade_sfa3r1 = "sfa3" arcade_sfa3u = "sfa3" arcade_sfa3ud = "sfa3" arcade_sfa3ur1 = "sfa3" arcade_sfa3us = "sfa3" arcade_sfach = "sfzch" arcade_sfad = "sfa" arcade_sfan = "sf" arcade_sfar1 = "sfa" arcade_sfar2 = "sfa" arcade_sfar3 = "sfa" arcade_sfau = "sfa" arcade_sfaud = "sfa" arcade_sfchamp = "sfchamp" arcade_sfeverbw = "spacefev" arcade_sfex = "sfex" arcade_sfex2 = "sfex2" arcade_sfex2p = "sfex2" arcade_sfexj = "sfex" arcade_sfexp = "sfexp" arcade_sfexpj = "sfexp" arcade_sfiii = "sfiii" arcade_sfiii2 = "sfiii2" arcade_sfiii2j = "sfiii2" arcade_sfiii2n = "sfiii2" arcade_sfiii3 = "sfiii3" arcade_sfiii3j = "sfiii3" arcade_sfiii3jr1 = "sfiii3" arcade_sfiii3n = "sfiii3" arcade_sfiii3nr1 = "sfiii3" arcade_sfiii3r1 = "sfiii3" arcade_sfiii3u = "sfiii3" arcade_sfiii3ur1 = "sfiii3" arcade_sfiiia = "sfiii" arcade_sfiiih = "sfiii" arcade_sfiiij = "sfiii" arcade_sfiiin = "sfiii" arcade_sfiiina = "sfiii" arcade_sfiiiu = "sfiii" arcade_sfish2 = "sfish2" arcade_sfish2j = "sfish2" arcade_sfj = "sf" arcade_sfjan = "sf" arcade_sflush = "sflush" arcade_sfootbal = "sfootbal" arcade_sformula = "tail2nos" arcade_sfp = "sf" arcade_sfposeid = "sfposeid" arcade_sfrush = "sfrush" arcade_sftm = "sftm" arcade_sftm110 = "sftm" arcade_sftm111 = "sftm" arcade_sftmj = "sftm" arcade_sfua = "sf" arcade_sfw = "sf" arcade_sfx = "sfx" arcade_sfz2a = "sfa2" arcade_sfz2aa = "sfa2" arcade_sfz2ab = "sfa2" arcade_sfz2ad = "sfa2" arcade_sfz2ah = "sfa2" arcade_sfz2aj = "sfa2" arcade_sfz2al = "sfz2al" arcade_sfz2alb = "sfz2al" arcade_sfz2ald = "sfz2al" arcade_sfz2alh = "sfz2al" arcade_sfz2alj = "sfz2al" arcade_sfz2b = "sfa2" arcade_sfz2br1 = "sfa2" arcade_sfz2h = "sfa2" arcade_sfz2j = "sfa2" arcade_sfz2jd = "sfa2" arcade_sfz2jr1 = "sfa2" arcade_sfz2n = "sfa2" arcade_sfz3a = "sfa3" arcade_sfz3ar1 = "sfa3" arcade_sfz3j = "sfa3" arcade_sfz3jr1 = "sfa3" arcade_sfz3jr2 = "sfa3" arcade_sfz3jr2d = "sfa3" arcade_sfza = "sfa" arcade_sfzach = "sfzch" arcade_sfzar1 = "sfa" arcade_sfzb = "sfa" arcade_sfzbch = "sfzch" arcade_sfzbr1 = "sfa" arcade_sfzch = "sfzch" arcade_sfzech = "sfzch" arcade_sfzh = "sfa" arcade_sfzhch = "sfzch" arcade_sfzhr1 = "sfa" arcade_sfzj = "sfa" arcade_sfzjr1 = "sfa" arcade_sfzjr2 = "sfa" arcade_sg1k_3ninmj = "sg1k_mahjong" arcade_sg1k_3ninmjt = "sg1k_mahjong" arcade_sg1k_bankp = "sg1k_bankp" arcade_sg1k_bilidada = "sg1k_bankp" arcade_sg1k_blckonyx = "sg1k_blckonyx" arcade_sg1k_bombjack = "sg1k_bombjack" arcade_sg1k_bombjackk1 = "sg1k_bombjack" arcade_sg1k_bombjackk2 = "sg1k_bombjack" arcade_sg1k_bombjackt1 = "sg1k_bombjack" arcade_sg1k_bombjackt2 = "sg1k_bombjack" arcade_sg1k_bombmnsp = "sg1k_bombmnsp" arcade_sg1k_bordrlin = "sg1k_bordrlin" arcade_sg1k_cabkids = "sg1k_cabkids" arcade_sg1k_castle = "sg1k_castle" arcade_sg1k_castlet = "sg1k_castle" arcade_sg1k_chackn = "sg1k_chackn" arcade_sg1k_chaldrby = "sg1k_chaldrby" arcade_sg1k_chaldrbya = "sg1k_chaldrby" arcade_sg1k_chaldrbyb = "sg1k_chaldrby" arcade_sg1k_champbas = "sg1k_champbas" arcade_sg1k_champbasa = "sg1k_champbas" arcade_sg1k_champbast = "sg1k_champbas" arcade_sg1k_champbil = "sg1k_champbil" arcade_sg1k_champbox = "sg1k_champbox" arcade_sg1k_champbox1 = "sg1k_champbox" arcade_sg1k_champboxt = "sg1k_champbox" arcade_sg1k_champglf = "sg1k_champglf" arcade_sg1k_champglf1 = "sg1k_champglf" arcade_sg1k_champglfk = "sg1k_champglf" arcade_sg1k_champice = "sg1k_champice" arcade_sg1k_champicek = "sg1k_champice" arcade_sg1k_champicet = "sg1k_champice" arcade_sg1k_champken = "sg1k_champken" arcade_sg1k_champkent = "sg1k_champken" arcade_sg1k_champpwr = "sg1k_champpwr" arcade_sg1k_champscr = "sg1k_champscr" arcade_sg1k_champscrt = "sg1k_champscr" arcade_sg1k_champtns = "sg1k_champtns" arcade_sg1k_choplift = "sg1k_choplift" arcade_sg1k_chopliftk = "sg1k_choplift" arcade_sg1k_chopliftp = "sg1k_choplift" arcade_sg1k_chopliftt = "sg1k_choplift" arcade_sg1k_circusc = "sg1k_circusc" arcade_sg1k_circusck = "sg1k_circusc" arcade_sg1k_cloderun = "sg1k_cloderun" arcade_sg1k_cloderunt = "sg1k_cloderun" arcade_sg1k_congo = "sg1k_congo" arcade_sg1k_congoa = "sg1k_congo" arcade_sg1k_congob = "sg1k_congo" arcade_sg1k_congot = "sg1k_congo" arcade_sg1k_cso = "sg1k_cso" arcade_sg1k_csot = "sg1k_cso" arcade_sg1k_dacike = "sg1k_dacike" arcade_sg1k_dayu = "sg1k_chackn" arcade_sg1k_dokidoki = "sg1k_dokidoki" arcade_sg1k_dragwang = "sg1k_dragwang" arcade_sg1k_dragwang1 = "sg1k_dragwang" arcade_sg1k_drol = "sg1k_drol" arcade_sg1k_drolk = "sg1k_drol" arcade_sg1k_drolt = "sg1k_drol" arcade_sg1k_elevator = "sg1k_elevator" arcade_sg1k_elevatort = "sg1k_elevator" arcade_sg1k_exerion = "sg1k_exerion" arcade_sg1k_exerionk = "sg1k_exerion" arcade_sg1k_exeriont = "sg1k_exerion" arcade_sg1k_faguiqib = "sg1k_pitfall2" arcade_sg1k_faguiqiba = "sg1k_pitfall2" arcade_sg1k_feilang = "sg1k_choplift" arcade_sg1k_feilanga = "sg1k_choplift" arcade_sg1k_flicky = "sg1k_flicky" arcade_sg1k_flickya = "sg1k_flicky" arcade_sg1k_flickyt = "sg1k_flicky" arcade_sg1k_galaga = "sg1k_segagala" arcade_sg1k_girlgard = "sg1k_girlgard" arcade_sg1k_girlgardt = "sg1k_girlgard" arcade_sg1k_golgo13 = "sg1k_golgo13" arcade_sg1k_gpworld = "sg1k_gpworld" arcade_sg1k_gpworlda = "sg1k_gpworld" arcade_sg1k_gpworldt = "sg1k_gpworld" arcade_sg1k_gulkave = "sg1k_gulkave" arcade_sg1k_gulkavek = "sg1k_gulkave" arcade_sg1k_guzzler = "sg1k_guzzler" arcade_sg1k_guzzlert = "sg1k_guzzler" arcade_sg1k_hangon2 = "sg1k_hangon2" arcade_sg1k_hangon2t1 = "sg1k_hangon2" arcade_sg1k_hangon2t2 = "sg1k_hangon2" arcade_sg1k_heibaiqi = "sg1k_othello" arcade_sg1k_hero = "sg1k_hero" arcade_sg1k_herot = "sg1k_hero" arcade_sg1k_homemj = "sg1k_mahjong" arcade_sg1k_homemj1 = "sg1k_mahjong" arcade_sg1k_homemjt = "sg1k_mahjong" arcade_sg1k_huohuli = "sg1k_zoom909" arcade_sg1k_huojiche = "sg1k_roadfght" arcade_sg1k_hustle = "sg1k_hustle" arcade_sg1k_hypersp2 = "sg1k_hypersp2" arcade_sg1k_hyperspt = "sg1k_hyperspt" arcade_sg1k_hypersptk = "sg1k_hyperspt" arcade_sg1k_hypersptt = "sg1k_hyperspt" arcade_sg1k_iq = "sg1k_sokoban" arcade_sg1k_jb007 = "sg1k_jb007" arcade_sg1k_jb007a = "sg1k_jb007" arcade_sg1k_jb007t = "sg1k_jb007" arcade_sg1k_jingwumn = "sg1k_dragwang" arcade_sg1k_jingwumna = "sg1k_dragwang" arcade_sg1k_jinzita = "sg1k_jinzita" arcade_sg1k_ldrun = "sg1k_ldrun" arcade_sg1k_ldrunk = "sg1k_ldrun" arcade_sg1k_ldrunt = "sg1k_ldrun" arcade_sg1k_m2cp = "sg1k_m2cp" arcade_sg1k_magtree = "sg1k_magtree" arcade_sg1k_mahjong = "sg1k_mahjong" arcade_sg1k_mahjonga = "sg1k_mahjong" arcade_sg1k_mahjongt = "sg1k_mahjong" arcade_sg1k_matchpg = "sg1k_matchpg" arcade_sg1k_matchpga = "sg1k_matchpg" arcade_sg1k_matchpgt = "sg1k_matchpg" arcade_sg1k_mkidwiz = "sg1k_mkidwiz" arcade_sg1k_monacogp = "sg1k_monacogp" arcade_sg1k_monacogpa = "sg1k_monacogp" arcade_sg1k_monacogpb = "sg1k_monacogp" arcade_sg1k_monacogpt = "sg1k_monacogp" arcade_sg1k_motianda = "sg1k_rocknbol" arcade_sg1k_moyuchua = "sg1k_moyuchua" arcade_sg1k_music = "sg1k_music" arcade_sg1k_musicj = "sg1k_musicj" arcade_sg1k_ninjapri = "sg1k_ninjapri" arcade_sg1k_ninjaprit = "sg1k_ninjapri" arcade_sg1k_nsub = "sg1k_nsub" arcade_sg1k_nsuba = "sg1k_nsub" arcade_sg1k_nsubb = "sg1k_nsub" arcade_sg1k_nsubt = "sg1k_nsub" arcade_sg1k_orguss = "sg1k_orguss" arcade_sg1k_othello = "sg1k_othello" arcade_sg1k_pacar = "sg1k_pacar" arcade_sg1k_pacara = "sg1k_pacar" arcade_sg1k_pacart = "sg1k_pacar" arcade_sg1k_pachink2 = "sg1k_pachink2" arcade_sg1k_pachink2t = "sg1k_pachink2" arcade_sg1k_pachinko = "sg1k_pachinko" arcade_sg1k_pingpong = "sg1k_pingpong" arcade_sg1k_pitfall2 = "sg1k_pitfall2" arcade_sg1k_pitfall2a = "sg1k_pitfall2" arcade_sg1k_popflame = "sg1k_popflame" arcade_sg1k_popflamet = "sg1k_popflame" arcade_sg1k_qbert = "sg1k_qbert" arcade_sg1k_qie = "sg1k_dokidoki" arcade_sg1k_rallyx = "sg1k_rallyx" arcade_sg1k_roadfght = "sg1k_roadfght" arcade_sg1k_rocknbol = "sg1k_rocknbol" arcade_sg1k_safarihu = "sg1k_safarihu" arcade_sg1k_safarihut = "sg1k_safarihu" arcade_sg1k_safarirc = "sg1k_safarirc" arcade_sg1k_safarircj = "sg1k_safarirc" arcade_sg1k_safarirct = "sg1k_safarirc" arcade_sg1k_segaflip = "sg1k_segaflip" arcade_sg1k_segaflipa = "sg1k_segaflip" arcade_sg1k_segaflipt = "sg1k_segaflip" arcade_sg1k_segagala = "sg1k_segagala" arcade_sg1k_segagala1 = "sg1k_segagala" arcade_sg1k_serizawa = "sg1k_serizawa" arcade_sg1k_shinnyus = "sg1k_shinnyus" arcade_sg1k_shinnyust = "sg1k_shinnyus" arcade_sg1k_sindbadm = "sg1k_sindbadm" arcade_sg1k_sindbadmt = "sg1k_sindbadm" arcade_sg1k_sokoban = "sg1k_sokoban" arcade_sg1k_sokobank = "sg1k_sokoban" arcade_sg1k_sokobant = "sg1k_sokoban" arcade_sg1k_spacearm = "sg1k_spacearm" arcade_sg1k_spacearma = "sg1k_spacearm" arcade_sg1k_spacearmb = "sg1k_spacearm" arcade_sg1k_spaceinv = "sg1k_spaceinv" arcade_sg1k_spaceinvt = "sg1k_spaceinv" arcade_sg1k_spacemnt = "sg1k_spacemnt" arcade_sg1k_spacesla = "sg1k_spacesla" arcade_sg1k_starfrce = "sg1k_starfrce" arcade_sg1k_starfrcet = "sg1k_starfrce" arcade_sg1k_starfrceta = "sg1k_starfrce" arcade_sg1k_starjack = "sg1k_starjack" arcade_sg1k_starjack1 = "sg1k_starjack" arcade_sg1k_starjack2 = "sg1k_starjack" arcade_sg1k_starjackt = "sg1k_starjack" arcade_sg1k_supertnk = "sg1k_supertnk" arcade_sg1k_supertnkk = "sg1k_supertnk" arcade_sg1k_supertnkt = "sg1k_supertnk" arcade_sg1k_superuwol = "sg1k_superuwol" arcade_sg1k_sxpao = "sg1k_sxpao" arcade_sg1k_terebioe = "sg1k_terebioe" arcade_sg1k_wboy = "sg1k_wboy" arcade_sg1k_wboya = "sg1k_wboy" arcade_sg1k_wboyt = "sg1k_wboy" arcade_sg1k_yamato = "sg1k_yamato" arcade_sg1k_yamatoa = "sg1k_yamato" arcade_sg1k_yamatot = "sg1k_yamato" arcade_sg1k_yiear = "sg1k_yiear" arcade_sg1k_zaxxon = "sg1k_zaxxon" arcade_sg1k_zaxxont = "sg1k_zaxxon" arcade_sg1k_zippyrac = "sg1k_zippyrac" arcade_sg1k_zippyract = "sg1k_zippyrac" arcade_sg1k_zoom909 = "sg1k_zoom909" arcade_sg2j = "sg2j" arcade_sgemf = "sgemf" arcade_sgemfa = "sgemf" arcade_sgemfd = "sgemf" arcade_sgemfh = "sgemf" arcade_sgladiat = "sgladiat" arcade_sgmast = "sgmast" arcade_sgunner = "sgunner" arcade_sgunner2 = "sgunner2" arcade_sgunner2j = "sgunner2" arcade_sgunnerj = "sgunner" arcade_sgunnr2j = "sgunner2" arcade_sgx_1941 = "sgx_1941" arcade_sgx_aldynes = "sgx_aldynes" arcade_sgx_battlace = "sgx_battlace" arcade_sgx_daimakai = "sgx_daimakai" arcade_sgx_daimakai1 = "sgx_daimakai" arcade_sgx_daimakaid = "sgx_daimakai" arcade_sgx_granzort = "sgx_granzort" arcade_sgyxz = "wof" arcade_shackled = "shackled" arcade_shadfrce = "shadfrce" arcade_shadfrcej = "shadfrce" arcade_shadfrceu = "shadfrce" arcade_shadowld = "shadowld" arcade_shadoww = "shadoww" arcade_shadowwa = "shadoww" arcade_shangha2 = "shangha2" arcade_shangha3 = "shangha3" arcade_shanghai = "shanghai" arcade_shangkid = "shangkid" arcade_shangon = "shangon" arcade_shangon1 = "shangon" arcade_shangon2 = "shangon" arcade_shangon3 = "shangon" arcade_shangon3d = "shangon" arcade_shangonb = "shangon" arcade_shangonho = "shangon" arcade_shangonle = "shangon" arcade_shangonrb = "shangon" arcade_shangonrb2 = "shangon" arcade_shangonro = "shangon" arcade_shanhigw = "shanhigw" arcade_shaolinb = "kicker" arcade_shaolins = "kicker" arcade_sharkatt = "sharkatt" arcade_sharrier = "sharrier" arcade_sharrier1 = "sharrier" arcade_shdancbl = "shdancer" arcade_shdancer = "shdancer" arcade_shdancer1 = "shdancer" arcade_shdancerj = "shdancer" arcade_shdancrb = "shdancer" arcade_shdancrj = "shdancer" arcade_sheriff = "sheriff" arcade_shienryu = "shienryu" arcade_shimpacp = "shimpact" arcade_shimpact = "shimpact" arcade_shinfz = "shinfz" arcade_shinobi = "shinobi" arcade_shinobi1 = "shinobi" arcade_shinobi1d = "shinobi" arcade_shinobi2 = "shinobi" arcade_shinobi2d = "shinobi" arcade_shinobi3 = "shinobi" arcade_shinobi4 = "shinobi" arcade_shinobi5 = "shinobi" arcade_shinobia = "shinobi" arcade_shinobib = "shinobi" arcade_shinobl = "shinobi" arcade_shinoblb = "shinobi" arcade_shinobls = "shinobi" arcade_shippumd = "kingdmgp" arcade_shiryu2 = "strider2" arcade_shisen = "sichuan2" arcade_shisen2 = "matchit2" arcade_shocking = "shocking" arcade_shocktr2 = "shocktr2" arcade_shocktra = "shocktro" arcade_shocktro = "shocktro" arcade_shocktroa = "shocktro" arcade_shogwarr = "shogwarr" arcade_shogwarrk = "shogwarr" arcade_shogwarru = "shogwarr" arcade_shollow = "shollow" arcade_shollow2 = "shollow" arcade_shootbul = "shootbul" arcade_shootgal = "shootgal" arcade_shootoub = "shootout" arcade_shootouj = "shootout" arcade_shootout = "shootout" arcade_shootoutb = "shootout" arcade_shootoutj = "shootout" arcade_shougi = "shougi" arcade_shougi2 = "shougi" arcade_showdown = "showdown" arcade_shrike = "shrike" arcade_shtngmst = "shtngmst" arcade_shtrider = "shtrider" arcade_shtridera = "shtrider" arcade_shtriderb = "shtrider" arcade_shuffle = "shuffle" arcade_shufshot = "shufshot" arcade_shuuz = "shuuz" arcade_shuuz2 = "shuuz" arcade_sia2650 = "sia2650" arcade_sichuan2 = "sichuan2" arcade_sichuana = "sichuan2" arcade_sicv = "invaders" arcade_sidearjp = "sidearms" arcade_sidearmr = "sidearms" arcade_sidearms = "sidearms" arcade_sidearmsj = "sidearms" arcade_sidearmsu = "sidearms" arcade_sidearmsur1 = "sidearms" arcade_sidepckt = "sidepckt" arcade_sidepcktb = "sidepckt" arcade_sidepcktb2 = "sidepckt" arcade_sidepcktj = "sidepckt" arcade_sidepctb = "sidepckt" arcade_sidepctj = "sidepckt" arcade_sidetrac = "sidetrac" arcade_silentd = "silentd" arcade_silentdj = "silentd" arcade_silentdu = "silentd" arcade_silkroad = "silkroad" arcade_silkroada = "silkroad" arcade_silkworm = "silkworm" arcade_silkwormb = "silkworm" arcade_silkwormj = "silkworm" arcade_silkwormp = "silkworm" arcade_silkwrm2 = "silkworm" arcade_silvland = "rpatrol" arcade_silvmil = "silvmil" arcade_simps2pa = "simpsons" arcade_simps2pj = "simpsons" arcade_simpsn2p = "simpsons" arcade_simpsons = "simpsons" arcade_simpsons2p = "simpsons" arcade_simpsons2p2 = "simpsons" arcade_simpsons2p3 = "simpsons" arcade_simpsons2pa = "simpsons" arcade_simpsons2pj = "simpsons" arcade_simpsons4pa = "simpsons" arcade_sindbadm = "sindbadm" arcade_sinista1 = "sinistar" arcade_sinista2 = "sinistar" arcade_sinistar = "sinistar" arcade_sinvasn = "commando" arcade_sinvasnb = "commando" arcade_sinvemag = "invaders" arcade_sinvzen = "invaders" arcade_sisv = "invaders" arcade_sisv1 = "invaders" arcade_sisv2 = "invaders" arcade_sisv3 = "invaders" arcade_sitv = "invaders" arcade_sitv1 = "invaders" arcade_sjryuko = "sjryuko" arcade_sjryuko1 = "sjryuko" arcade_skelagon = "sfx" arcade_skingam2 = "majtitl2" arcade_skingame = "majtitl2" arcade_skingame2 = "majtitl2" arcade_skns = "skns" arcade_skullfng = "skullfng" arcade_skullfnga = "skullfng" arcade_skullfngj = "skullfng" arcade_skullxb1 = "skullxbo" arcade_skullxb2 = "skullxbo" arcade_skullxb3 = "skullxbo" arcade_skullxb4 = "skullxbo" arcade_skullxbo = "skullxbo" arcade_skyadvnj = "skyadvnt" arcade_skyadvnt = "skyadvnt" arcade_skyadvntj = "skyadvnt" arcade_skyadvntu = "skyadvnt" arcade_skyadvnu = "skyadvnt" arcade_skyalert = "skyalert" arcade_skyarmy = "skyarmy" arcade_skybase = "skybase" arcade_skybump = "skybump" arcade_skychut = "skychut" arcade_skydiver = "skydiver" arcade_skyfox = "skyfox" arcade_skykid = "skykid" arcade_skykidd = "skykid" arcade_skykiddo = "skykiddx" arcade_skykiddx = "skykiddx" arcade_skykiddxo = "skykiddx" arcade_skykido = "skykid" arcade_skykids = "skykid" arcade_skylancr = "skylancr" arcade_skylancre = "skylancr" arcade_skyraid = "skyraid" arcade_skyraidr = "uniwars" arcade_skyrobo = "skyrobo" arcade_skyshark = "fshark" arcade_skysharka = "fshark" arcade_skyskipr = "skyskipr" arcade_skysmash = "skysmash" arcade_skysoldr = "skysoldr" arcade_skysoldrbl = "skysoldr" arcade_skywolf = "airwolf" arcade_skywolf2 = "airwolf" arcade_skywolf3 = "airwolf" arcade_slamdnk2 = "rungun2" arcade_slammasa = "slammast" arcade_slammash = "slammast" arcade_slammast = "slammast" arcade_slammastu = "slammast" arcade_slammasu = "slammast" arcade_slampic = "slammast" arcade_slapbtjp = "slapfigh" arcade_slapbtuk = "slapfigh" arcade_slapfigh = "alcon" arcade_slapfighb1 = "alcon" arcade_slapfighb2 = "alcon" arcade_slapfighb3 = "alcon" arcade_slapshot = "slapshot" arcade_slapshtr = "slapshtr" arcade_sleague = "sleague" arcade_sliksh17 = "slikshot" arcade_slikshot = "slikshot" arcade_slipstrm = "slipstrm" arcade_slither = "slither" arcade_slithera = "slither" arcade_slmdunkj = "rungun" arcade_slyspy = "secretag" arcade_slyspy2 = "secretag" arcade_slyspy3 = "secretag" arcade_smashtv = "smashtv" arcade_smashtv4 = "smashtv" arcade_smashtv5 = "smashtv" arcade_smashtv6 = "smashtv" arcade_smbomb = "ringdest" arcade_smbombr1 = "ringdest" arcade_smgolf = "smgolf" arcade_smgolfb = "smgolf" arcade_smgolfj = "smgolf" arcade_smgp = "smgp" arcade_smgp5 = "smgp" arcade_smgp5d = "smgp" arcade_smgp6 = "smgp" arcade_smgp6d = "smgp" arcade_smgpd = "smgp" arcade_smgpj = "smgp" arcade_smgpja = "smgp" arcade_smgpjd = "smgp" arcade_smgpu = "smgp" arcade_smgpu1 = "smgp" arcade_smgpu1d = "smgp" arcade_smgpu2 = "smgp" arcade_smgpu2d = "smgp" arcade_smgpud = "smgp" arcade_smooncrs = "mooncrst" arcade_sms_20em1 = "sms_20em1" arcade_sms_3dragon = "sms_3dragon" arcade_sms_4pak = "sms_4pak" arcade_sms_94swc = "sms_94swc" arcade_sms_aburner = "sms_aburner" arcade_sms_aceoface = "sms_aceoface" arcade_sms_actionfg = "sms_actionfg" arcade_sms_actionfg1 = "sms_actionfg" arcade_sms_addfam = "sms_addfam" arcade_sms_aerialas = "sms_aerialas" arcade_sms_aerialasu = "sms_aerialas" arcade_sms_agassi = "sms_agassi" arcade_sms_agidooly = "sms_dinodool" arcade_sms_airresc = "sms_airresc" arcade_sms_akrr102e = "sms_alexkidd" arcade_sms_aladdin = "sms_aladdin" arcade_sms_aleste = "sms_pstrike" arcade_sms_alesteiigg2sms = "sms_alesteiigg2sms" arcade_sms_alexbmx = "sms_alexbmx" arcade_sms_alexhitw = "sms_alexhitw" arcade_sms_alexkidd = "sms_alexkidd" arcade_sms_alexkidd1 = "sms_alexkidd" arcade_sms_alexkidd2 = "sms_alexkidd2" arcade_sms_alexkiddb = "sms_alexkidd" arcade_sms_alexkiddj = "sms_alexkidd" arcade_sms_alexlost = "sms_alexlost" arcade_sms_alexshin = "sms_alexshin" arcade_sms_alf = "sms_alf" arcade_sms_alibaba = "sms_alibaba" arcade_sms_alien3 = "sms_alien3" arcade_sms_aliensyn = "sms_aliensyn" arcade_sms_aliensynj = "sms_aliensyn" arcade_sms_aliensynp = "sms_aliensyn" arcade_sms_altbeast = "sms_altbeast" arcade_sms_ameribb = "sms_ameribb" arcade_sms_ameripf = "sms_ameripf" arcade_sms_anmitsu = "sms_alexhitw" arcade_sms_arcadesh = "sms_arcadesh" arcade_sms_argosnj = "sms_argosnj" arcade_sms_argosnj1 = "sms_argosnj" arcade_sms_ariel = "sms_ariel" arcade_sms_ashura = "sms_secret" arcade_sms_assaultc = "sms_assaultc" arcade_sms_assaultc1 = "sms_assaultc" arcade_sms_astergre = "sms_astergre" arcade_sms_asterix = "sms_asterix" arcade_sms_asterix1 = "sms_asterix" arcade_sms_astermis = "sms_astermis" arcade_sms_astorm = "sms_astorm" arcade_sms_astrofl = "sms_transbot" arcade_sms_astrofl1 = "sms_transbot" arcade_sms_astropit = "sms_astropit" arcade_sms_astrow = "sms_astrow" arcade_sms_aztecadv = "sms_aztecadv" arcade_sms_backtof2 = "sms_backtof2" arcade_sms_backtof3 = "sms_backtof3" arcade_sms_bakabon = "sms_bakabon" arcade_sms_bakubaku = "sms_bakubaku" arcade_sms_bankp = "sms_bankp" arcade_sms_bankpc = "sms_bankp" arcade_sms_baraburu10 = "sms_baraburu10" arcade_sms_bartvssm = "sms_bartvssm" arcade_sms_bartvsw = "sms_bartvsw" arcade_sms_basketn = "sms_basketn" arcade_sms_batmanrn = "sms_batmanrn" arcade_sms_battleor = "sms_battleor" arcade_sms_beast = "sms_beast" arcade_sms_blackblt = "sms_blackblt" arcade_sms_bladeag = "sms_bladeag" arcade_sms_bladeag1 = "sms_bladeag" arcade_sms_blockhol = "sms_blockhol" arcade_sms_bmaniacs = "sms_bmaniacs" arcade_sms_bnzabros = "sms_bnzabros" arcade_sms_bombraid = "sms_bombraid" arcade_sms_bonkers = "sms_bonkers" arcade_sms_borgman = "sms_cyborgh" arcade_sms_borgmanp = "sms_cyborgh" arcade_sms_brucelee10 = "sms_brucelee10" arcade_sms_bublbobl = "sms_bublbobl" arcade_sms_bublbokc = "sms_bublbobl" arcade_sms_bublboky = "sms_bublbobl" arcade_sms_buggyrun = "sms_buggyrun" arcade_sms_calgame2 = "sms_calgame2" arcade_sms_calgame2b = "sms_calgame2" arcade_sms_calgames = "sms_calgames" arcade_sms_captsilv = "sms_captsilv" arcade_sms_captsilvu = "sms_captsilv" arcade_sms_carmnwld = "sms_carmnwld" arcade_sms_carmnwldb = "sms_carmnwld" arcade_sms_casino = "sms_casino" arcade_sms_castelo = "sms_castelo" arcade_sms_castlill = "sms_castlill" arcade_sms_castlills = "sms_castlill" arcade_sms_castlillu = "sms_castlill" arcade_sms_champeur = "sms_champeur" arcade_sms_champhck = "sms_champhck" arcade_sms_chapolim = "sms_ghosth" arcade_sms_chasehq = "sms_chasehq" arcade_sms_cheese = "sms_cheese" arcade_sms_choplift = "sms_choplift" arcade_sms_chopliftj = "sms_choplift" arcade_sms_chopliftp = "sms_choplift" arcade_sms_chuckrck = "sms_chuckrck" arcade_sms_chukrck2 = "sms_chukrck2" arcade_sms_chukrck2b = "sms_chukrck2" arcade_sms_circuit = "sms_worldgp" arcade_sms_cloudmst = "sms_cloudmst" arcade_sms_colors = "sms_colors" arcade_sms_columns = "sms_columns" arcade_sms_columnsp = "sms_columns" arcade_sms_comical = "sms_comical" arcade_sms_comicalk = "sms_comical" arcade_sms_comicaltw = "sms_comical" arcade_sms_comicbak = "sms_comicbak" arcade_sms_coolspot = "sms_coolspot" arcade_sms_cosmic = "sms_cosmic" arcade_sms_crashdum = "sms_crashdum" arcade_sms_cso = "sms_cso" arcade_sms_cybers = "sms_cybers" arcade_sms_cybersp = "sms_cybers" arcade_sms_cyborgh = "sms_cyborgh" arcade_sms_cyborgz = "sms_cyborgz" arcade_sms_daffy = "sms_daffy" arcade_sms_dallye = "sms_dallye" arcade_sms_danan = "sms_danan" arcade_sms_darc10 = "sms_darc10" arcade_sms_datastorm10 = "sms_datastorm10" arcade_sms_dcrystal = "sms_dcrystal" arcade_sms_ddragon = "sms_ddragon" arcade_sms_ddragonk = "sms_ddragon" arcade_sms_ddux = "sms_ddux" arcade_sms_deadang = "sms_deadang" arcade_sms_deepduck = "sms_deepduck" arcade_sms_desert = "sms_desert" arcade_sms_dhead = "sms_dhead" arcade_sms_dicktr = "sms_dicktr" arcade_sms_dinobash = "sms_dinobash" arcade_sms_dinodool = "sms_dinodool" arcade_sms_dokidoki = "sms_pengland" arcade_sms_dokidokip = "sms_pengland" arcade_sms_doublhwk = "sms_doublhwk" arcade_sms_doublhwkp = "sms_doublhwk" arcade_sms_doubltgt = "sms_quartet" arcade_sms_dracula = "sms_dracula" arcade_sms_dragon = "sms_dragon" arcade_sms_drhello = "sms_drhello" arcade_sms_drrobotn = "sms_drrobotn" arcade_sms_dstrike = "sms_dstrike" arcade_sms_dumpmats = "sms_prowres" arcade_sms_dynduke = "sms_dynduke" arcade_sms_eagles5 = "sms_eagles5" arcade_sms_ecco = "sms_ecco" arcade_sms_ecco2 = "sms_ecco2" arcade_sms_ejim = "sms_ejim" arcade_sms_enduro = "sms_enduro" arcade_sms_enduroj = "sms_enduro" arcade_sms_eswatc = "sms_eswatc" arcade_sms_eswatc1 = "sms_eswatc" arcade_sms_exainnov = "sms_exainnov" arcade_sms_excdizzy = "sms_excdizzy" arcade_sms_f1 = "sms_f1" arcade_sms_f16falc = "sms_f16fight" arcade_sms_f16falcc = "sms_f16fight" arcade_sms_f16falcjc = "sms_f16fight" arcade_sms_f16falctw = "sms_f16fight" arcade_sms_f16fight = "sms_f16fight" arcade_sms_f16fightc = "sms_f16fight" arcade_sms_f1spirit = "sms_f1spirit" arcade_sms_family = "sms_parlour" arcade_sms_fantdizz = "sms_fantdizz" arcade_sms_fantzon2 = "sms_fantzon2" arcade_sms_fantzon2j = "sms_fantzon2" arcade_sms_fantzone = "sms_fantzone" arcade_sms_fantzone1 = "sms_fantzone" arcade_sms_fantzonej = "sms_fantzone" arcade_sms_fantzonetw = "sms_fantzone" arcade_sms_fantzonm = "sms_fantzonm" arcade_sms_fatetris = "sms_fatetris" arcade_sms_felipe = "sms_teddyboy" arcade_sms_ferias = "sms_ferias" arcade_sms_fifa = "sms_fifa" arcade_sms_finalbb = "sms_bublbobl" arcade_sms_fireforg = "sms_fireforg" arcade_sms_fireice = "sms_fireice" arcade_sms_flash = "sms_flash" arcade_sms_flint = "sms_flint" arcade_sms_forgottn = "sms_forgottn" arcade_sms_fpoint = "sms_fpoint" arcade_sms_gaegujan = "sms_gaegujan" arcade_sms_galactpr = "sms_galactpr" arcade_sms_galaxian = "sms_galaxian" arcade_sms_gamebox = "sms_gamebox" arcade_sms_gangster = "sms_gangster" arcade_sms_gauntlet = "sms_gauntlet" arcade_sms_gaxewarr = "sms_gaxewarr" arcade_sms_georgeko = "sms_georgeko" arcade_sms_gerald = "sms_teddyboy" arcade_sms_gforce = "sms_gforce" arcade_sms_gforceu = "sms_gforce" arcade_sms_gground = "sms_gground" arcade_sms_ggroundp = "sms_gground" arcade_sms_ghostbst = "sms_ghostbst" arcade_sms_ghosth = "sms_ghosth" arcade_sms_ghosthc = "sms_ghosth" arcade_sms_ghosthcp = "sms_ghosth" arcade_sms_ghosthj = "sms_ghosth" arcade_sms_ghosthj1 = "sms_ghosth" arcade_sms_ghosthk = "sms_ghosth" arcade_sms_ghouls = "sms_ghouls" arcade_sms_ghoulsd = "sms_ghouls" arcade_sms_globald = "sms_globald" arcade_sms_globaldp = "sms_globald" arcade_sms_gloc = "sms_gloc" arcade_sms_goldnaxe = "sms_goldnaxe" arcade_sms_golfaman = "sms_golfaman" arcade_sms_golfamanp = "sms_golfaman" arcade_sms_golvell = "sms_golvell" arcade_sms_gprider = "sms_gprider" arcade_sms_greatbas = "sms_greatbas" arcade_sms_greatbasj = "sms_greatbas" arcade_sms_greatbasj1 = "sms_greatbas" arcade_sms_greatbsk = "sms_greatbsk" arcade_sms_greatftb = "sms_greatftb" arcade_sms_greatglf = "sms_greatglf" arcade_sms_greatglf1 = "sms_greatglf" arcade_sms_greatglfp = "sms_greatglf" arcade_sms_greatglj = "sms_greatglj" arcade_sms_greatglk = "sms_greatglj" arcade_sms_greatice = "sms_greatice" arcade_sms_greatscr = "sms_greatscr" arcade_sms_greatscrc = "sms_greatscr" arcade_sms_greatscrj = "sms_greatscr" arcade_sms_greatscrtw = "sms_greatscr" arcade_sms_greattns = "sms_stennis" arcade_sms_greatvol = "sms_greatvol" arcade_sms_greatvolj = "sms_greatvol" arcade_sms_gunsmoke = "sms_gunsmoke" arcade_sms_hajafuin = "sms_miracle" arcade_sms_hangon = "sms_hangon" arcade_sms_hangonaw = "sms_hangonaw" arcade_sms_hangonc = "sms_hangon" arcade_sms_hangonj = "sms_hangon" arcade_sms_hangonsh = "sms_hangonsh" arcade_sms_hangonshp = "sms_hangonsh" arcade_sms_heavyw = "sms_heavyw" arcade_sms_herolanc = "sms_herolanc" arcade_sms_hicom3a = "sms_hicom3a" arcade_sms_hicom3b = "sms_hicom3a" arcade_sms_hicom3c = "sms_hicom3a" arcade_sms_hicom3d = "sms_hicom3a" arcade_sms_hicom3e = "sms_hicom3a" arcade_sms_hicom3f = "sms_hicom3a" arcade_sms_hicom8a = "sms_hicom3a" arcade_sms_hicom8b = "sms_hicom3a" arcade_sms_hicom8c = "sms_hicom3a" arcade_sms_highsc = "sms_highsc" arcade_sms_hokuto = "sms_blackblt" arcade_sms_hokutotw = "sms_blackblt" arcade_sms_homea = "sms_homea" arcade_sms_hongkildong = "sms_hongkildong" arcade_sms_hook = "sms_hook" arcade_sms_hoshiw = "sms_hoshiw" arcade_sms_hulk = "sms_hulk" arcade_sms_hwaran = "sms_kenseid" arcade_sms_impmiss = "sms_impmiss" arcade_sms_impmissp = "sms_impmiss" arcade_sms_indycrus = "sms_indycrus" arcade_sms_indycrusp = "sms_indycrus" arcade_sms_janggun = "sms_janggun" arcade_sms_jangpun3 = "sms_jangpun3" arcade_sms_jb007 = "sms_jb007" arcade_sms_jb007b = "sms_jb007" arcade_sms_jbdougko = "sms_heavyw" arcade_sms_jbdougkop = "sms_heavyw" arcade_sms_joemont = "sms_joemont" arcade_sms_jpark = "sms_jpark" arcade_sms_jungle = "sms_jungle" arcade_sms_kenseid = "sms_kenseid" arcade_sms_kenseidj = "sms_kenseid" arcade_sms_kingball = "sms_kingball" arcade_sms_kingqst = "sms_kingqst" arcade_sms_kingqstp = "sms_kingqst" arcade_sms_klax = "sms_klax" arcade_sms_knightm2 = "sms_knightm2" arcade_sms_krustyfh = "sms_krustyfh" arcade_sms_kujaku = "sms_spellcst" arcade_sms_kungfuk = "sms_kungfuk" arcade_sms_lambo = "sms_lambo" arcade_sms_landill = "sms_landill" arcade_sms_legndill = "sms_legndill" arcade_sms_lemming2 = "sms_lemming2" arcade_sms_lemmings = "sms_lemmings" arcade_sms_lemmingsp = "sms_lemmings" arcade_sms_lghost = "sms_lghost" arcade_sms_lionking = "sms_lionking" arcade_sms_loffire = "sms_loffire" arcade_sms_lordswrd = "sms_lordswrd" arcade_sms_lordswrdj = "sms_lordswrd" arcade_sms_loretta = "sms_loretta" arcade_sms_lostraider101 = "sms_lostraider101" arcade_sms_luckydim = "sms_luckydim" arcade_sms_luckydimp = "sms_luckydim" arcade_sms_makairet = "sms_kungfuk" arcade_sms_maougolv = "sms_golvell" arcade_sms_maougolvp = "sms_golvell" arcade_sms_marble = "sms_marble" arcade_sms_marksman = "sms_marksman" arcade_sms_marksmanu = "sms_marksman" arcade_sms_mastcomb = "sms_mastcomb" arcade_sms_mastdark = "sms_mastdark" arcade_sms_mazehunt = "sms_mazehunt" arcade_sms_mazewalk = "sms_mazehunt" arcade_sms_megumi = "sms_megumi" arcade_sms_mercs = "sms_mercs" arcade_sms_mickeyuc = "sms_mickeyuc" arcade_sms_mickmack = "sms_mickmack" arcade_sms_micromac = "sms_micromac" arcade_sms_miracle = "sms_miracle" arcade_sms_miraclep = "sms_miracle" arcade_sms_missil3d = "sms_missil3d" arcade_sms_mjsengok = "sms_mjsengok" arcade_sms_mjsengokp = "sms_mjsengok" arcade_sms_mk = "sms_mk" arcade_sms_mk2 = "sms_mk2" arcade_sms_mk3 = "sms_mk3" arcade_sms_moggym100 = "sms_moggym100" arcade_sms_monica = "sms_wboymlnd" arcade_sms_monopoly = "sms_monopoly" arcade_sms_monopolyp = "sms_monopoly" arcade_sms_monopolyu = "sms_monopoly" arcade_sms_montezum = "sms_montezum" arcade_sms_montezump = "sms_montezum" arcade_sms_mopirang = "sms_mopirang" arcade_sms_mspacman = "sms_mspacman" arcade_sms_mwalk = "sms_mwalk" arcade_sms_mwalkp = "sms_mwalk" arcade_sms_myhero = "sms_myhero" arcade_sms_myheroc = "sms_myhero" arcade_sms_nbajam = "sms_nbajam" arcade_sms_nekkyu = "sms_nekkyu" arcade_sms_nemesis = "sms_nemesis" arcade_sms_nemesis2 = "sms_nemesis2" arcade_sms_newbogl2 = "sms_bublbobl" arcade_sms_ngaiden = "sms_ngaiden" arcade_sms_ngaidenp = "sms_ngaiden" arcade_sms_ninja = "sms_ninja" arcade_sms_ninjaj = "sms_ninja" arcade_sms_olympgld = "sms_olympgld" arcade_sms_olympgldk = "sms_olympgld" arcade_sms_opaopa = "sms_fantzonm" arcade_sms_opwolf = "sms_opwolf" arcade_sms_ottifant = "sms_ottifant" arcade_sms_outrneur = "sms_outrneur" arcade_sms_outrun = "sms_outrun" arcade_sms_outrun3d = "sms_outrun3d" arcade_sms_pacmania = "sms_pacmania" arcade_sms_paperboy = "sms_paperboy" arcade_sms_paperboyu = "sms_paperboy" arcade_sms_parlour = "sms_parlour" arcade_sms_patriley = "sms_patriley" arcade_sms_pengadv = "sms_pengadv" arcade_sms_pengland = "sms_pengland" arcade_sms_pgatour = "sms_pgatour" arcade_sms_pitfight = "sms_pitfight" arcade_sms_pitfightb = "sms_pitfight" arcade_sms_pitpot = "sms_pitpot" arcade_sms_pitpot1 = "sms_pitpot" arcade_sms_pooyan = "sms_pooyan" arcade_sms_populous = "sms_populous" arcade_sms_poseidon = "sms_poseidon" arcade_sms_ppersia = "sms_ppersia" arcade_sms_predatr2 = "sms_predatr2" arcade_sms_predatr2b = "sms_predatr2" arcade_sms_prowres = "sms_prowres" arcade_sms_proyakyu = "sms_proyakyu" arcade_sms_pstar = "sms_pstar" arcade_sms_pstar1 = "sms_pstar" arcade_sms_pstarb = "sms_pstar" arcade_sms_pstarj = "sms_pstar" arcade_sms_pstarjmd = "sms_pstar" arcade_sms_pstark = "sms_pstar" arcade_sms_pstrike = "sms_pstrike" arcade_sms_pstrike2 = "sms_pstrike2" arcade_sms_psychicw = "sms_psychicw" arcade_sms_psychof = "sms_psychof" arcade_sms_punpun = "sms_punpun" arcade_sms_puttputt = "sms_puttputt" arcade_sms_puttputtp = "sms_puttputt" arcade_sms_puznic = "sms_puznic" arcade_sms_quartet = "sms_quartet" arcade_sms_rambo2 = "sms_secret" arcade_sms_rambo3 = "sms_rambo3" arcade_sms_rampage = "sms_rampage" arcade_sms_rampart = "sms_rampart" arcade_sms_rastan = "sms_rastan" arcade_sms_rbisland = "sms_rbisland" arcade_sms_rbislandb = "sms_rbisland" arcade_sms_rcgp = "sms_rcgp" arcade_sms_rcgpp = "sms_rcgp" arcade_sms_regjacks = "sms_ameribb" arcade_sms_renegade = "sms_renegade" arcade_sms_rescuems = "sms_rescuems" arcade_sms_roadfght = "sms_roadfght" arcade_sms_roadrash = "sms_roadrash" arcade_sms_robocod = "sms_robocod" arcade_sms_robocop = "sms_robocop" arcade_sms_robocop3 = "sms_robocop3" arcade_sms_roboterm = "sms_roboterm" arcade_sms_rocky = "sms_rocky" arcade_sms_rtype = "sms_rtype" arcade_sms_rtypep = "sms_rtype" arcade_sms_running = "sms_running" arcade_sms_sagaia = "sms_sagaia" arcade_sms_sangoku3 = "sms_sangoku3" arcade_sms_sapomestr = "sms_kungfuk" arcade_sms_saposos = "sms_astrow" arcade_sms_sapoxule = "sms_psychof" arcade_sms_satell7 = "sms_satell7" arcade_sms_satell7a = "sms_satell7" arcade_sms_sbioman1 = "sms_sbioman1" arcade_sms_sboy1 = "sms_sboy1" arcade_sms_sboy2 = "sms_sboy2" arcade_sms_sboy3 = "sms_sboy3" arcade_sms_sboy4 = "sms_sboy4" arcade_sms_sci = "sms_sci" arcade_sms_scip = "sms_sci" arcade_sms_sdi = "sms_globald" arcade_sms_sdmilhao = "sms_sdmilhao" arcade_sms_secret = "sms_secret" arcade_sms_segachss = "sms_segachss" arcade_sms_segagfx = "sms_segagfx" arcade_sms_segawtg = "sms_segawtg" arcade_sms_seishun = "sms_myhero" arcade_sms_seishun1 = "sms_myhero" arcade_sms_sensible = "sms_sensible" arcade_sms_sf2 = "sms_sf2" arcade_sms_shanghai = "sms_shanghai" arcade_sms_shanghaip = "sms_shanghai" arcade_sms_sharr3d = "sms_sharr3d" arcade_sms_sharr3dj = "sms_sharr3d" arcade_sms_sharrier = "sms_sharrier" arcade_sms_sharrierju = "sms_sharrier" arcade_sms_shavnyak = "sms_shavnyak" arcade_sms_shdancer = "sms_shdancer" arcade_sms_shinobi = "sms_shinobi" arcade_sms_shinobij = "sms_shinobi" arcade_sms_shooting = "sms_shooting" arcade_sms_silvervalley = "sms_silvervalley" arcade_sms_sitio = "sms_sitio" arcade_sms_skickoff = "sms_skickoff" arcade_sms_skyjag = "sms_skyjag" arcade_sms_slapshot = "sms_slapshot" arcade_sms_slapshota = "sms_slapshot" arcade_sms_slapshotb = "sms_slapshot" arcade_sms_slapshotp = "sms_slapshot" arcade_sms_smashtv = "sms_smashtv" arcade_sms_smgp = "sms_smgp" arcade_sms_smgp2 = "sms_smgp2" arcade_sms_smgpp1 = "sms_smgp" arcade_sms_smgpp2 = "sms_smgp" arcade_sms_smgpu = "sms_smgp" arcade_sms_sms3samp = "sms_sms3samp" arcade_sms_smurfs = "sms_smurfs" arcade_sms_smurfs2 = "sms_smurfs2" arcade_sms_smurfs2p = "sms_smurfs2" arcade_sms_sn_ateam = "sms_sn_ateam" arcade_sms_sn_lwep3 = "sms_sn_lwep3" arcade_sms_solomon = "sms_solomon" arcade_sms_sonic = "sms_sonic" arcade_sms_sonic2 = "sms_sonic2" arcade_sms_sonic2a = "sms_sonic2" arcade_sms_sonicbls = "sms_sonicbls" arcade_sms_sonicc = "sms_sonicc" arcade_sms_sonicedu = "sms_sonicedu" arcade_sms_sonicfm102 = "sms_sonic" arcade_sms_sor = "sms_sor" arcade_sms_sor2 = "sms_sor2" arcade_sms_spacegun = "sms_spacegun" arcade_sms_speedbl = "sms_speedbl" arcade_sms_speedbl2 = "sms_speedbl2" arcade_sms_speedblv = "sms_speedblv" arcade_sms_spellcst = "sms_spellcst" arcade_sms_spidermn = "sms_spidermn" arcade_sms_spidking = "sms_spidking" arcade_sms_sportsft = "sms_sportsft" arcade_sms_sportssc = "sms_worldsoc" arcade_sms_spyvsspy = "sms_spyvsspy" arcade_sms_spyvsspyc = "sms_spyvsspy" arcade_sms_spyvsspyj = "sms_spyvsspy" arcade_sms_spyvsspyj1 = "sms_spyvsspy" arcade_sms_spyvsspyk = "sms_spyvsspy" arcade_sms_spyvsspys = "sms_spyvsspy" arcade_sms_spyvsspytw = "sms_spyvsspy" arcade_sms_ssinv = "sms_ssinv" arcade_sms_sspin = "sms_sspin" arcade_sms_sspirits = "sms_sspirits" arcade_sms_starwars = "sms_starwars" arcade_sms_stennis = "sms_stennis" arcade_sms_stennisc = "sms_stennis" arcade_sms_strider = "sms_strider" arcade_sms_strider2 = "sms_strider2" arcade_sms_striderd = "sms_strider" arcade_sms_strtmast = "sms_strtmast" arcade_sms_submarin = "sms_submarin" arcade_sms_suhocheo = "sms_suhocheo" arcade_sms_sukeban = "sms_sukeban" arcade_sms_sumgames = "sms_sumgames" arcade_sms_sumgamesp = "sms_sumgames" arcade_sms_superark = "sms_woodypop" arcade_sms_superman = "sms_superman" arcade_sms_superoff = "sms_superoff" arcade_sms_superrac = "sms_superrac" arcade_sms_supgolf = "sms_golfaman" arcade_sms_suprbskt = "sms_suprbskt" arcade_sms_suprbubl = "sms_bublbobl" arcade_sms_t2ag = "sms_t2ag" arcade_sms_tazmania = "sms_tazmania" arcade_sms_tazmaniap = "sms_tazmania" arcade_sms_tazmars = "sms_tazmars" arcade_sms_tblade = "sms_tblade" arcade_sms_tbladej = "sms_tblade" arcade_sms_tecmow92 = "sms_tecmow92" arcade_sms_tecmow93 = "sms_tecmow93" arcade_sms_teddyboy = "sms_teddyboy" arcade_sms_teddyboyc = "sms_teddyboy" arcade_sms_teddyboyj = "sms_teddyboy" arcade_sms_teddyboyj1 = "sms_teddyboy" arcade_sms_teddyboyjp = "sms_teddyboy" arcade_sms_tennis = "sms_tennis" arcade_sms_term2 = "sms_term2" arcade_sms_termntr = "sms_termntr" arcade_sms_termntrb = "sms_termntr" arcade_sms_timesold = "sms_timesold" arcade_sms_tnzs = "sms_tnzs" arcade_sms_tomjermv = "sms_tomjermv" arcade_sms_tomjerry = "sms_tomjermv" arcade_sms_totowld3 = "sms_totowld3" arcade_sms_transbot = "sms_transbot" arcade_sms_transbotc = "sms_transbot" arcade_sms_transbotp = "sms_transbot" arcade_sms_treinam = "sms_treinam" arcade_sms_trivial = "sms_trivial" arcade_sms_ttoriui = "sms_myhero" arcade_sms_turmamon = "sms_wboy3" arcade_sms_tvcolos = "sms_asterix" arcade_sms_ultima4 = "sms_ultima4" arcade_sms_ultima4p = "sms_ultima4" arcade_sms_ultsoccr = "sms_ultsoccr" arcade_sms_vampire = "sms_mastdark" arcade_sms_vfa = "sms_vfa" arcade_sms_vigilant = "sms_vigilant" arcade_sms_WaimanuSMS = "sms_WaimanuSMS" arcade_sms_wanted = "sms_wanted" arcade_sms_wboy = "sms_wboy" arcade_sms_wboy3 = "sms_wboy3" arcade_sms_wboya = "sms_wboy" arcade_sms_wboymlnd = "sms_wboymlnd" arcade_sms_wboymlnda = "sms_wboymlnd" arcade_sms_wboymlndj = "sms_wboymlnd" arcade_sms_wboymlndp = "sms_wboymlnd" arcade_sms_wboymwld = "sms_wboymwld" arcade_sms_wboymwldp = "sms_wboymwld" arcade_sms_wclead = "sms_wclead" arcade_sms_wcup90 = "sms_wcup90" arcade_sms_wcup90d = "sms_wcup90" arcade_sms_wcup94 = "sms_wcup94" arcade_sms_wekainvaders10 = "sms_wekainvaders10" arcade_sms_wimbled = "sms_wimbled" arcade_sms_wimbled2 = "sms_wimbled2" arcade_sms_wintol = "sms_wintol" arcade_sms_wintolb = "sms_wintol" arcade_sms_wldgames = "sms_wldgames" arcade_sms_wldgamesp = "sms_wldgames" arcade_sms_wolfchld = "sms_wolfchld" arcade_sms_wonsiin = "sms_wonsiin" arcade_sms_woodypop = "sms_woodypop" arcade_sms_worldgp = "sms_worldgp" arcade_sms_worldgpp = "sms_worldgp" arcade_sms_worldgpu = "sms_worldgp" arcade_sms_worldsoc = "sms_worldsoc" arcade_sms_wpayton = "sms_ameripf" arcade_sms_wwfsteel = "sms_wwfsteel" arcade_sms_xenon2 = "sms_xenon2" arcade_sms_xenon2v = "sms_xenon2" arcade_sms_xevious = "sms_xevious" arcade_sms_xmenmojo = "sms_xmenmojo" arcade_sms_xyzolog = "sms_xyzolog" arcade_sms_ys = "sms_ys" arcade_sms_ysd = "sms_ys" arcade_sms_ysj = "sms_ys" arcade_sms_zaxxon3d = "sms_zaxxon3d" arcade_sms_zaxxon3dp = "sms_zaxxon3d" arcade_sms_zillion = "sms_zillion" arcade_sms_zillion2 = "sms_zillion2" arcade_sms_zilliona = "sms_zillion" arcade_sms_zillionb = "sms_zillion" arcade_sms_zool = "sms_zool" arcade_smw = "smw" arcade_smwa = "smwa" arcade_smwj = "smwj" arcade_smwu = "smwu" arcade_snakepit = "snakepit" arcade_snakjack = "snakjack" arcade_snapjack = "snapjack" arcade_snapper = "snapper" arcade_sncwgltd = "sncwgltd" arcade_sngkace = "samuraia" arcade_sngkacea = "samuraia" arcade_snowbalt = "snowboar" arcade_snowboar = "snowboar" arcade_snowboara = "snowboar" arcade_snowbro2 = "snowbro2" arcade_snowbro3 = "snowbro3" arcade_snowbroa = "snowbros" arcade_snowbrob = "snowbros" arcade_snowbroj = "snowbros" arcade_snowbros = "snowbros" arcade_snowbrosa = "snowbros" arcade_snowbrosb = "snowbros" arcade_snowbrosc = "snowbros" arcade_snowbrosd = "snowbros" arcade_snowbrosj = "snowbros" arcade_snowbroswb = "snowbros" arcade_socbrawl = "socbrawl" arcade_socbrawlh = "socbrawl" arcade_soccer = "soccer" arcade_soccerss = "soccerss" arcade_sokonuke = "sokonuke" arcade_sokyugrt = "sokyugrt" arcade_solarfox = "solarfox" arcade_solarq = "solarq" arcade_solarwar = "xsleena" arcade_soldam = "soldam" arcade_soldamj = "soldam" arcade_soldivid = "soldivid" arcade_soldividk = "soldivid" arcade_solfight = "ozmawars" arcade_solfigtr = "solfigtr" arcade_solomon = "solomon" arcade_solomonj = "solomon" arcade_solrwarr = "xsleena" arcade_solvalou = "solvalou" arcade_sonic = "sonic" arcade_sonicbom = "sonicbom" arcade_sonicbomd = "sonicbom" arcade_sonicp = "sonic" arcade_sonicwi = "aerofgt" arcade_sonicwi2 = "sonicwi2" arcade_sonicwi3 = "sonicwi3" arcade_sonofphx = "repulse" arcade_sonson = "sonson" arcade_sonsonj = "sonson" arcade_sos = "sos" arcade_sotsugyo = "sotsugyo" arcade_soukobdx = "boxyboy" arcade_soulclbr = "soulclbr" arcade_souledga = "souledge" arcade_souledgb = "souledge" arcade_souledge = "souledge" arcade_spacbat2 = "uniwars" arcade_spacbatt = "uniwars" arcade_spacbeam = "spacbeam" arcade_spacduel = "spacduel" arcade_spaceat2 = "invaders" arcade_spaceatt = "invaders" arcade_spacebrd = "spacefb" arcade_spacecho = "speakres" arcade_spacecho2 = "speakres" arcade_spacecr = "spacecr" arcade_spacedem = "spacefb" arcade_spacedx = "spacedx" arcade_spacedxj = "spacedx" arcade_spacedxo = "spacedx" arcade_spacefb = "spacefb" arcade_spacefbb = "spacefb" arcade_spacefbg = "spacefb" arcade_spacefev = "spacefev" arcade_spacefrt = "spacefrt" arcade_spacegun = "spacegun" arcade_spacegunj = "spacegun" arcade_spacegunu = "spacegun" arcade_spaceint = "spaceint" arcade_spacempr = "uniwars" arcade_spaceod = "spaceod" arcade_spaceph = "ozmawars" arcade_spaceplt = "timeplt" arcade_spaceskr = "spaceskr" arcade_spacetrk = "spacetrk" arcade_spacetrkc = "spacetrk" arcade_spacewar = "spacewar" arcade_spacewr3 = "invaders" arcade_spacezap = "spacezap" arcade_spacfura = "spacfury" arcade_spacfury = "spacfury" arcade_spang = "spang" arcade_spangj = "spang" arcade_sparkman = "sparkman" arcade_sparkz = "sparkz" arcade_spartanx = "kungfum" arcade_spatter = "spatter" arcade_spbactn = "spbactn" arcade_spbactnj = "spbactn" arcade_spcdrag = "mooncrst" arcade_spcdraga = "mooncrst" arcade_spceking = "invaders" arcade_spcenctr = "spcenctr" arcade_spcewarl = "spclaser" arcade_spcewars = "invaders" arcade_spcforc2 = "spcforce" arcade_spcforce = "spcforce" arcade_spcfrcii = "spcfrcii" arcade_spcinv95 = "spcinv95" arcade_spcinv95u = "spcinv95" arcade_spcinvdj = "spacedx" arcade_spcking2 = "spcking2" arcade_spclaser = "spclaser" arcade_spclforc = "spclforc" arcade_spclorda = "spclords" arcade_spclords = "spclords" arcade_spcnv95u = "spcinv95" arcade_spcpostn = "spcpostn" arcade_spctbird = "mooncrst" arcade_spdball = "spdball" arcade_spdbuggy = "spdbuggy" arcade_spdcoin = "spdcoin" arcade_spdodgeb = "spdodgeb" arcade_speakres = "speakres" arcade_speakresb = "speakres" arcade_spec2k = "spec2k" arcade_spec2kh = "spec2k" arcade_spectar = "spectar" arcade_spectar1 = "spectar" arcade_speedatk = "speedatk" arcade_speedbal = "speedbal" arcade_speedfrk = "speedfrk" arcade_speedspn = "speedspn" arcade_spelnkrj = "spelunkr" arcade_spelunk2 = "spelunk2" arcade_spelunkr = "spelunkr" arcade_spelunkrj = "spelunkr" arcade_spf2t = "spf2t" arcade_spf2ta = "spf2t" arcade_spf2td = "spf2t" arcade_spf2th = "spf2t" arcade_spf2tu = "spf2t" arcade_spf2xj = "spf2t" arcade_spf2xjd = "spf2t" arcade_spidermi = "spidermi" arcade_spiders = "spiders" arcade_spiders2 = "spiders" arcade_spidey = "spidey" arcade_spideyj = "spidey" arcade_spiero = "dorunrun" arcade_spiker = "spiker" arcade_spinlbrj = "spinlbrk" arcade_spinlbrk = "spinlbrk" arcade_spinlbrkj = "spinlbrk" arcade_spinlbrku = "spinlbrk" arcade_spinlbru = "spinlbrk" arcade_spinmast = "spinmast" arcade_splash = "splash" arcade_splat = "splat" arcade_splatter = "splatter" arcade_splatter2 = "splatter" arcade_splatterj = "splatter" arcade_splndrbt = "splndrbt" arcade_spnchotj = "spnchout" arcade_spnchout = "spnchout" arcade_spnchouta = "spnchout" arcade_spnchoutj = "spnchout" arcade_spool3 = "pcktgal" arcade_spool3i = "pcktgal" arcade_sprcros2 = "sprcros2" arcade_sprcros2a = "sprcros2" arcade_sprglbpg = "suprglob" arcade_sprglobp = "suprglob" arcade_springer = "springer" arcade_sprint1 = "sprint1" arcade_sprint2 = "sprint1" arcade_sprint2a = "sprint1" arcade_sprint4 = "sprint4" arcade_sprint4a = "sprint4" arcade_sprint8 = "sprint8" arcade_sprint8a = "sprint8" arcade_sprtmtch = "drgpunch" arcade_sptrekct = "spacetrk" arcade_spy = "spy" arcade_spyhnt2a = "spyhunt2" arcade_spyhunt = "spyhunt" arcade_spyhunt2 = "spyhunt2" arcade_spyu = "spy" arcade_sqbert = "sqbert" arcade_sqixbl = "superqix" arcade_squash = "squash" arcade_sraider = "sraider" arcade_sranger = "sranger" arcade_srangerb = "rranger" arcade_srangerw = "rranger" arcade_srdarwin = "srdarwin" arcade_srdarwinj = "srdarwin" arcade_srdarwnj = "srdarwin" arcade_srdmissn = "srdmissn" arcade_srmp2 = "srmp2" arcade_srmp3 = "srmp3" arcade_srmp4 = "srmp4" arcade_srmp4o = "srmp4" arcade_srmp7 = "srmp7" arcade_srumbler = "srumbler" arcade_srumbler2 = "srumbler" arcade_srumbler3 = "srumbler" arcade_srumblr2 = "srumbler" arcade_ssanchan = "spatter" arcade_sscandal = "myhero" arcade_ssf2 = "ssf2" arcade_ssf2a = "ssf2" arcade_ssf2ar1 = "ssf2" arcade_ssf2d = "ssf2" arcade_ssf2h = "ssf2" arcade_ssf2j = "ssf2" arcade_ssf2jr1 = "ssf2" arcade_ssf2jr2 = "ssf2" arcade_ssf2r1 = "ssf2" arcade_ssf2t = "ssf2t" arcade_ssf2ta = "ssf2t" arcade_ssf2tad = "ssf2t" arcade_ssf2tb = "ssf2" arcade_ssf2tba = "ssf2" arcade_ssf2tbd = "ssf2" arcade_ssf2tbh = "ssf2" arcade_ssf2tbj = "ssf2" arcade_ssf2tbj1 = "ssf2" arcade_ssf2tbr1 = "ssf2" arcade_ssf2td = "ssf2t" arcade_ssf2th = "ssf2t" arcade_ssf2tu = "ssf2t" arcade_ssf2tur1 = "ssf2t" arcade_ssf2u = "ssf2" arcade_ssf2ud = "ssf2" arcade_ssf2xj = "ssf2t" arcade_ssf2xjr1 = "ssf2t" arcade_ssf2xjr1d = "ssf2t" arcade_ssf2xjr1r = "ssf2t" arcade_sshangha = "sshangha" arcade_sshanghb = "sshangha" arcade_sshooter = "sshooter" arcade_sshot137 = "shufshot" arcade_ssi = "ssi" arcade_ssideki = "ssideki" arcade_ssideki2 = "ssideki2" arcade_ssideki3 = "ssideki3" arcade_ssideki4 = "ssideki4" arcade_sslam = "sslam" arcade_ssmissin = "ssmissin" arcade_ssoldier = "ssoldier" arcade_ssonicbr = "ssonicbr" arcade_ssozumo = "ssozumo" arcade_sspacaho = "sspacaho" arcade_sspacat2 = "sspaceat" arcade_sspacatc = "sspaceat" arcade_sspaceat = "sspaceat" arcade_sspaceat2 = "sspaceat" arcade_sspaceat3 = "sspaceat" arcade_sspaceatc = "sspaceat" arcade_sspeedr = "sspeedr" arcade_sspirits = "sspirits" arcade_sspring1 = "ssprint" arcade_ssprint = "ssprint" arcade_ssprint1 = "ssprint" arcade_ssprint3 = "ssprint" arcade_ssprintf = "ssprint" arcade_ssprintg = "ssprint" arcade_ssprints = "ssprint" arcade_ssrdrabd = "ssriders" arcade_ssrdrebc = "ssriders" arcade_ssrdrebd = "ssriders" arcade_ssrdrjbd = "ssriders" arcade_ssrdruac = "ssriders" arcade_ssrdrubc = "ssriders" arcade_ssrdruda = "ssriders" arcade_ssriders = "ssriders" arcade_ssridersabd = "ssriders" arcade_ssridersadd = "ssriders" arcade_ssridersb = "ssriders" arcade_ssriderseaa = "ssriders" arcade_ssridersebc = "ssriders" arcade_ssridersebd = "ssriders" arcade_ssridersjac = "ssriders" arcade_ssridersjad = "ssriders" arcade_ssridersjbd = "ssriders" arcade_ssridersuab = "ssriders" arcade_ssridersuac = "ssriders" arcade_ssridersubc = "ssriders" arcade_ssridersuda = "ssriders" arcade_ssrj = "ssrj" arcade_sss = "sss" arcade_sstarcrs = "mooncrst" arcade_sstingry = "sstingry" arcade_sstrangr = "sstrangr" arcade_sstrangr2 = "sstrangr" arcade_sstrike = "sstrike" arcade_sstriker = "sstriker" arcade_sstrikerk = "sstriker" arcade_sstrngr2 = "sstrngr2" arcade_stactics = "stactics" arcade_stadhero = "stadhero" arcade_stadhr96 = "stadhr96" arcade_stadhr96j = "stadhr96" arcade_stadhr96u = "stadhr96" arcade_stagger1 = "stagger1" arcade_stakwin = "stakwin" arcade_stakwin2 = "stakwin2" arcade_starblad = "starblad" arcade_starcas = "starcas" arcade_starcas1 = "starcas" arcade_starcase = "starcas" arcade_starcasp = "starcas" arcade_starcrus = "starcrus" arcade_starfght = "galaxian" arcade_starfgmc = "mooncrst" arcade_starfigh = "starfigh" arcade_starfira = "starfire" arcade_starfire = "starfire" arcade_starforc = "starforc" arcade_starfore = "starforc" arcade_stargate = "stargate" arcade_starglad = "starglad" arcade_stargrds = "stargrds" arcade_starhawk = "starhawk" arcade_starjack = "starjack" arcade_starjacks = "starjack" arcade_starjacs = "starjack" arcade_starlstr = "starlstr" arcade_starrkr = "brdrline" arcade_starshp1 = "starshp1" arcade_starshpp = "starshp1" arcade_starswep = "starswep" arcade_startrek = "startrek" arcade_startrks = "startrks" arcade_starw = "galxwars" arcade_starwar1 = "starwars" arcade_starwars = "starwars" arcade_statriv2 = "statriv2" arcade_stdragon = "stdragon" arcade_stdragona = "stdragon" arcade_stdragonb = "stdragon" arcade_steelta1 = "steeltal" arcade_steeltag = "steeltal" arcade_steeltal = "steeltal" arcade_steeltap = "steeltal" arcade_stellcas = "starcas" arcade_stera = "mooncrst" arcade_stfight = "empcity" arcade_stg = "stg" arcade_stinger = "stinger" arcade_stinger2 = "stinger" arcade_stkclmns = "stkclmns" arcade_stlforce = "stlforce" arcade_stmblade = "stmblade" arcade_stmbladej = "stmblade" arcade_stocker = "stocker" arcade_stoffy = "stoffy" arcade_stompin = "stompin" arcade_stoneage = "cninja" arcade_stoneba2 = "stonebal" arcade_stonebal = "stonebal" arcade_storming = "lsasquad" arcade_strahl = "strahl" arcade_strahla = "strahl" arcade_stratab = "stratab" arcade_stratab1 = "stratab" arcade_stratgys = "stratgyx" arcade_stratgyx = "stratgyx" arcade_stratof = "stratof" arcade_stratvox = "speakres" arcade_stratvoxb = "speakres" arcade_streakng = "streakng" arcade_streaknga = "streakng" arcade_streets1 = "streetsm" arcade_streetsj = "streetsm" arcade_streetsm = "streetsm" arcade_streetsm1 = "streetsm" arcade_streetsmj = "streetsm" arcade_streetsmw = "streetsm" arcade_streetsw = "streetsm" arcade_strfbomb = "scramble" arcade_strhoop = "strhoop" arcade_strider = "strider" arcade_strider2 = "strider2" arcade_striderj = "strider" arcade_striderjr = "strider" arcade_striderua = "strider" arcade_strideruc = "strider" arcade_stridr2a = "strider2" arcade_stridrja = "strider" arcade_stridrua = "strider" arcade_striv = "striv" arcade_strivf = "striv" arcade_strkfgtr = "strkfgtr" arcade_strkfgtrj = "strkfgtr" arcade_strkforc = "strkforc" arcade_strkzone = "strkzone" arcade_strnskil = "strnskil" arcade_strongx = "stratgyx" arcade_strtheat = "strtheat" arcade_strvmstr = "strvmstr" arcade_stunrn2e = "stunrun" arcade_stunrn3e = "stunrun" arcade_stunrun = "stunrun" arcade_stunrun0 = "stunrun" arcade_stunrun2 = "stunrun" arcade_stunrun3 = "stunrun" arcade_stunrun4 = "stunrun" arcade_stunrun5 = "stunrun" arcade_stunrune = "stunrun" arcade_stunrunj = "stunrun" arcade_stunrunp = "stunrun" arcade_sub = "sub" arcade_subhunt = "depthch" arcade_subroc3d = "subroc3d" arcade_subs = "subs" arcade_sucasino = "sucasino" arcade_suikoenb = "suikoenb" arcade_sunaq = "sunaq" arcade_sundance = "sundance" arcade_sunsetbl = "ssriders" arcade_supbtime = "supbtime" arcade_supbtimea = "supbtime" arcade_supbtimej = "supbtime" arcade_supbtimj = "supbtime" arcade_supcrash = "headon" arcade_supdrapo = "supdrapo" arcade_superbar = "wiggie" arcade_superbik = "superbik" arcade_superbon = "superbon" arcade_superbug = "superbug" arcade_superchs = "superchs" arcade_superchsj = "superchs" arcade_superchsu = "superchs" arcade_superg = "galaxian" arcade_supergx = "galaxian" arcade_superinv = "invaders" arcade_superman = "superman" arcade_supermanj = "superman" arcade_supermanu = "superman" arcade_superpac = "superpac" arcade_superpacm = "superpac" arcade_superpcm = "superpac" arcade_superqix = "superqix" arcade_superspy = "superspy" arcade_superten = "superten" arcade_supertnk = "supertnk" arcade_supertr2 = "supertr2" arcade_superx = "superx" arcade_superxm = "superx" arcade_supmodel = "supmodel" arcade_suprglob = "suprglob" arcade_suprheli = "scobra" arcade_suprleag = "suprleag" arcade_suprloco = "suprloco" arcade_suprlocoo = "suprloco" arcade_suprmatk = "missile" arcade_suprmous = "suprmous" arcade_suprmrio = "suprmrio" arcade_suprridr = "suprridr" arcade_suprslam = "suprslam" arcade_suprtrio = "suprtrio" arcade_supxevs = "supxevs" arcade_suratk = "suratk" arcade_suratka = "suratk" arcade_suratkj = "suratk" arcade_surpratk = "surpratk" arcade_survarts = "survarts" arcade_survartsj = "survarts" arcade_survartsu = "survarts" arcade_survival = "survival" arcade_sutapper = "tapper" arcade_suzuk8h2 = "suzuk8h2" arcade_suzuk8h2j = "suzuk8h2" arcade_suzuk8hj = "suzuka8h" arcade_suzuka8h = "suzuka8h" arcade_suzuka8hj = "suzuka8h" arcade_suzume = "suzume" arcade_svc = "svc" arcade_svcboot = "svc" arcade_svcpcb = "svcpcb" arcade_svcpcba = "svcpcb" arcade_svcplus = "svc" arcade_svcplusa = "svc" arcade_svcsplus = "svc" arcade_svf = "svf" arcade_svg = "svg" arcade_svgpcb = "svg" arcade_svgtw = "svg" arcade_svolley = "svolley" arcade_svolleyk = "svolley" arcade_svolleyu = "svolley" arcade_svolly91 = "pspikes" arcade_svs = "svf" arcade_swarm = "galaxian" arcade_swat = "swat" arcade_swatpolc = "swatpolc" arcade_swcourt = "swcourt" arcade_swimmer = "swimmer" arcade_swimmera = "swimmer" arcade_swimmerb = "swimmer" arcade_sws = "sws" arcade_sws92 = "sws92" arcade_sws92g = "sws92" arcade_sws93 = "sws93" arcade_sws95 = "sws95" arcade_sws96 = "sws96" arcade_sws97 = "sws97" arcade_sws99 = "sws99" arcade_sxevious = "xevious" arcade_sxyreac2 = "sxyreac2" arcade_sxyreact = "sxyreact" arcade_syscheck = "syscheck" arcade_syvalion = "syvalion" arcade_syvalionp = "syvalion" arcade_syvalionu = "syvalion" arcade_syvalionw = "syvalion" arcade_szaxxon = "szaxxon" arcade_tacscan = "tacscan" arcade_tactcan2 = "tactcian" arcade_tactcian = "tactcian" arcade_tactcian2 = "tactcian" arcade_tagteam = "bigprowr" arcade_tail2nos = "tail2nos" arcade_tailg = "tailg" arcade_tangtang = "tangtang" arcade_tankbatt = "tankbatt" arcade_tankbust = "tankbust" arcade_tankfrce = "tankfrce" arcade_tankfrce4 = "tankfrce" arcade_tankfrcej = "tankfrce" arcade_tankfrcj = "tankfrce" arcade_tantr = "tantr" arcade_tantrbl = "tantr" arcade_tantrbl2 = "tantr" arcade_taotaida = "taotaido" arcade_taotaido = "taotaido" arcade_taotaidoa = "taotaido" arcade_tapper = "tapper" arcade_tappera = "tapper" arcade_targ = "targ" arcade_targc = "targ" arcade_targeth = "targeth" arcade_tattass = "tattass" arcade_tattassa = "tattass" arcade_taxidrvr = "taxidrvr" arcade_tazmani2 = "tazmania" arcade_tazmania = "tazmania" arcade_tazzmang = "tazmania" arcade_tazzmang2 = "tazmania" arcade_tbowl = "tbowl" arcade_tbowla = "tbowl" arcade_tbowlj = "tbowl" arcade_tbowlp = "tbowl" arcade_tbyahhoo = "tbyahhoo" arcade_tceptor = "tceptor" arcade_tceptor2 = "tceptor" arcade_tcobra2 = "tcobra2" arcade_tcobra2u = "tcobra2" arcade_tdfever = "tdfever" arcade_tdfever2 = "tdfever" arcade_tdfeverj = "tdfever" arcade_tdpgal = "tdpgal" arcade_tdragon = "tdragon" arcade_tdragon1 = "tdragon" arcade_tdragon2 = "tdragon2" arcade_tdragon2a = "tdragon2" arcade_tdragon3h = "tdragon2" arcade_tdragonb = "tdragon" arcade_teamqb = "teamqb" arcade_teamqb2 = "teamqb" arcade_techromn = "techromn" arcade_teddybb = "teddybb" arcade_teddybbo = "teddybb" arcade_teddybbobl = "teddybb" arcade_teedoff = "teedoff" arcade_teetert = "teetert" arcade_tehkanwc = "tehkanwc" arcade_tekipaki = "tekipaki" arcade_tekipakit = "tekipaki" arcade_tekken = "tekken" arcade_tekken2 = "tekken2" arcade_tekken2a = "tekken2" arcade_tekken2b = "tekken2" arcade_tekken3 = "tekken3" arcade_tekkena = "tekken" arcade_tekkenb = "tekken" arcade_tekkentt = "tekkentt" arcade_teljan = "teljan" arcade_telmahjn = "telmahjn" arcade_tempest = "tempest" arcade_tempest1 = "tempest" arcade_tempest2 = "tempest" arcade_tempest3 = "tempest" arcade_temptube = "tempest" arcade_tengai = "tengai" arcade_tengaij = "tengai" arcade_teplus2j = "tetrisp2" arcade_term2 = "term2" arcade_term2la1 = "term2" arcade_term2la2 = "term2" arcade_terracra = "terracre" arcade_terracrb = "terracre" arcade_terracre = "terracre" arcade_terracrea = "terracre" arcade_terracren = "terracre" arcade_terracreo = "terracre" arcade_terraf = "terraf" arcade_terrafb = "terraf" arcade_terrafj = "terraf" arcade_terrafjb = "terraf" arcade_terrafu = "terraf" arcade_tetrbx = "tetrbx" arcade_tetris = "tetris" arcade_tetris1 = "tetris" arcade_tetris1d = "tetris" arcade_tetris2 = "tetris" arcade_tetris2d = "tetris" arcade_tetris3 = "tetris" arcade_tetris3d = "tetris" arcade_tetrisa = "tetris" arcade_tetrisbl = "tetris" arcade_tetrisd = "tetris" arcade_tetrisp = "tetrisp" arcade_tetrisp2 = "tetrisp2" arcade_tetrisp2j = "tetrisp2" arcade_tetrisp2ja = "tetrisp2" arcade_tetrisse = "tetrisse" arcade_tetrist = "tetris" arcade_tetrista = "tetris" arcade_tetristh = "tetris" arcade_tetrsark = "tetrsark" arcade_tfrceac = "tfrceac" arcade_tfrceacb = "tfrceac" arcade_tfrceacj = "tfrceac" arcade_tg_acrush = "tg_acrush" arcade_tg_advislnd = "tg_advislnd" arcade_tg_aeroblst = "tg_aeroblst" arcade_tg_airzonk = "tg_airzonk" arcade_tg_ballistx = "tg_ballistx" arcade_tg_batlroyl = "tg_batlroyl" arcade_tg_blazlazr = "tg_blazlazr" arcade_tg_blodwolf = "tg_blodwolf" arcade_tg_bombman = "tg_bombman" arcade_tg_bombmn93 = "tg_bombmn93" arcade_tg_bonk = "tg_bonk" arcade_tg_bonk2 = "tg_bonk2" arcade_tg_bonk3 = "tg_bonk3" arcade_tg_boxyboy = "tg_boxyboy" arcade_tg_bravoman = "tg_bravoman" arcade_tg_cadash = "tg_cadash" arcade_tg_cdsys = "tg_cdsys" arcade_tg_chasehq = "tg_chasehq" arcade_tg_chewman = "tg_chewman" arcade_tg_chinawar = "tg_chinawar" arcade_tg_cratermz = "tg_cratermz" arcade_tg_cybrcore = "tg_cybrcore" arcade_tg_darkwing = "tg_darkwing" arcade_tg_daviscup = "tg_daviscup" arcade_tg_ddungw = "tg_ddungw" arcade_tg_deadmoon = "tg_deadmoon" arcade_tg_deepblue = "tg_deepblue" arcade_tg_devlcrsh = "tg_devlcrsh" arcade_tg_dragcrse = "tg_dragcrse" arcade_tg_dropoff = "tg_dropoff" arcade_tg_dspirit = "tg_dspirit" arcade_tg_dungexpl = "tg_dungexpl" arcade_tg_falcon = "tg_falcon" arcade_tg_fantzone = "tg_fantzone" arcade_tg_finallap = "tg_finallap" arcade_tg_forevbox = "tg_forevbox" arcade_tg_galaga90 = "tg_galaga90" arcade_tg_ghostman = "tg_ghostman" arcade_tg_griffon = "tg_griffon" arcade_tg_gunboat = "tg_gunboat" arcade_tg_hitice = "tg_hitice" arcade_tg_impossam = "tg_impossam" arcade_tg_jchan = "tg_jchan" arcade_tg_jjnjeff = "tg_jjnjeff" arcade_tg_keithcor = "tg_keithcor" arcade_tg_kingcasn = "tg_kingcasn" arcade_tg_klax = "tg_klax" arcade_tg_legaxe = "tg_legaxe" arcade_tg_legaxe2 = "tg_legaxe2" arcade_tg_loht = "tg_loht" arcade_tg_magchase = "tg_magchase" arcade_tg_miltrymd = "tg_miltrymd" arcade_tg_motoroad = "tg_motoroad" arcade_tg_neutopi2 = "tg_neutopi2" arcade_tg_neutopia = "tg_neutopia" arcade_tg_nicklaus = "tg_nicklaus" arcade_tg_nightcr = "tg_nightcr" arcade_tg_nspirit = "tg_nspirit" arcade_tg_ordyne = "tg_ordyne" arcade_tg_pacland = "tg_pacland" arcade_tg_panzakb = "tg_panzakb" arcade_tg_parasol = "tg_parasol" arcade_tg_pgolf = "tg_pgolf" arcade_tg_psychos = "tg_psychos" arcade_tg_raiden = "tg_raiden" arcade_tg_rtype = "tg_rtype" arcade_tg_samuraig = "tg_samuraig" arcade_tg_scdsys = "tg_scdsys" arcade_tg_sharrier = "tg_sharrier" arcade_tg_shockman = "tg_shockman" arcade_tg_sidearms = "tg_sidearms" arcade_tg_silentd = "tg_silentd" arcade_tg_sinistrn = "tg_sinistrn" arcade_tg_soldblad = "tg_soldblad" arcade_tg_somerass = "tg_somerass" arcade_tg_splatth = "tg_splatth" arcade_tg_sssoldr = "tg_sssoldr" arcade_tg_svolley = "tg_svolley" arcade_tg_taknhoop = "tg_taknhoop" arcade_tg_talespin = "tg_talespin" arcade_tg_tigerrod = "tg_tigerrod" arcade_tg_timcrus = "tg_timcrus" arcade_tg_timeball = "tg_timeball" arcade_tg_tricky = "tg_tricky" arcade_tg_turrican = "tg_turrican" arcade_tg_tvbasket = "tg_tvbasket" arcade_tg_tvfootbl = "tg_tvfootbl" arcade_tg_tvhockey = "tg_tvhockey" arcade_tg_veigues = "tg_veigues" arcade_tg_victoryr = "tg_victoryr" arcade_tg_vigilant = "tg_vigilant" arcade_tg_wbeach = "tg_wbeach" arcade_tg_wcbasebl = "tg_wcbasebl" arcade_tg_wctennis = "tg_wctennis" arcade_tg_wscomp = "tg_wscomp" arcade_tg_yobro = "tg_yobro" arcade_tgm2 = "tgm2" arcade_tgm2p = "tgm2" arcade_tgmj = "tgmj" arcade_tgtball = "tgtball" arcade_tharierj = "tharrier" arcade_tharrier = "tharrier" arcade_tharrieru = "tharrier" arcade_thedeep = "thedeep" arcade_theend = "theend" arcade_theends = "theend" arcade_theglad = "theglad" arcade_theglad100 = "theglad" arcade_theglad101 = "theglad" arcade_thegladpcb = "theglad" arcade_theglob = "suprglob" arcade_theglob2 = "suprglob" arcade_theglob3 = "suprglob" arcade_theglobp = "suprglob" arcade_thehand = "thehand" arcade_thehustj = "thehustl" arcade_thehustl = "rackemup" arcade_thehustlj = "rackemup" arcade_themj = "themj" arcade_thepit = "thepit" arcade_thepitj = "thepit" arcade_thepitm = "thepit" arcade_thepitu1 = "thepit" arcade_thepitu2 = "thepit" arcade_theroes = "theroes" arcade_thetogyu = "bullfgt" arcade_thief = "thief" arcade_thndblst = "lethalth" arcade_thnderxj = "thunderx" arcade_thndfoxj = "thundfox" arcade_thndfoxu = "thundfox" arcade_thndrbdj = "thndrbld" arcade_thndrbld = "thndrbld" arcade_thndrbld1 = "thndrbld" arcade_thndrbldd = "thndrbld" arcade_thndrx2 = "thndrx2" arcade_thndrx2a = "thndrx2" arcade_thndrx2j = "thndrx2" arcade_thndzone = "thndzone" arcade_thndzone4 = "thndzone" arcade_thndzonea = "thndzone" arcade_thndzonej = "thndzone" arcade_thoop = "thoop" arcade_thoop2 = "thoop2" arcade_thoop2a = "thoop2" arcade_thunderj = "thunderj" arcade_thunderl = "thunderl" arcade_thunderx = "thunderx" arcade_thunderxa = "thunderx" arcade_thunderxb = "thunderx" arcade_thunderxj = "thunderx" arcade_thundfox = "thundfox" arcade_thundfoxj = "thundfox" arcade_thundfoxu = "thundfox" arcade_thunt = "sandor" arcade_tickee = "tickee" arcade_tigerh = "tigerh" arcade_tigerh2 = "tigerh" arcade_tigerhb1 = "tigerh" arcade_tigerhb2 = "tigerh" arcade_tigerhb3 = "tigerh" arcade_tigerhj = "tigerh" arcade_tigeroad = "tigeroad" arcade_tigeroadb = "tigeroad" arcade_tigeroadb2 = "tigeroad" arcade_tigeroadu = "tigeroad" arcade_timber = "timber" arcade_timecrsa = "timecrsa" arcade_timefgtr = "timefgtr" arcade_timek131 = "timekill" arcade_timekill = "timekill" arcade_timelimt = "timelimt" arcade_timeplt = "timeplt" arcade_timeplta = "timeplt" arcade_timepltc = "timeplt" arcade_timescan = "timescan" arcade_timescan1 = "timescan" arcade_timesol1 = "timesold" arcade_timesold = "timesold" arcade_timesold1 = "timesold" arcade_timesupd = "timesupd" arcade_timetunl = "timetunl" arcade_timscanr = "timscanr" arcade_tinklpit = "tinklpit" arcade_tinstar = "tinstar" arcade_tinv2650 = "sia2650" arcade_tiptop = "congo" arcade_titlef = "titlef" arcade_tjumpman = "tjumpman" arcade_tkdensho = "tkdensho" arcade_tkdenshoa = "tkdensho" arcade_tkmmpzdm = "tkmmpzdm" arcade_tknight = "wildfang" arcade_tkoboxng = "tkoboxng" arcade_tmek = "tmek" arcade_tmekprot = "tmek" arcade_tmht = "tmnt" arcade_tmht22pe = "tmnt2" arcade_tmht24pe = "tmnt2" arcade_tmht2p = "tmnt" arcade_tmht2pa = "tmnt" arcade_tmhta = "tmnt" arcade_tmhtb = "tmnt" arcade_tmmjprd = "tmmjprd" arcade_tmnt = "tmnt" arcade_tmnt2 = "tmnt2" arcade_tmnt22p = "tmnt2" arcade_tmnt22pu = "tmnt2" arcade_tmnt2a = "tmnt2" arcade_tmnt2pj = "tmnt" arcade_tmnt2po = "tmnt" arcade_tmnta = "tmnt" arcade_tmnti = "tmnti" arcade_tmntia = "tmnti" arcade_tmntj = "tmnt" arcade_tmntu = "tmnt" arcade_tmntua = "tmnt" arcade_tmntub = "tmnt" arcade_tndrcade = "tndrcade" arcade_tndrcadej = "tndrcade" arcade_tndrcadj = "tndrcade" arcade_tnexspce = "tnexspce" arcade_tnextspc = "tnextspc" arcade_tnextspc2 = "tnextspc" arcade_tnextspcj = "tnextspc" arcade_tnk3 = "tnk3" arcade_tnk3j = "tnk3" arcade_tnzs = "tnzs" arcade_tnzs2 = "tnzs" arcade_tnzsb = "tnzs" arcade_tnzsj = "tnzs" arcade_tnzsjo = "tnzs" arcade_tnzso = "tnzs" arcade_tnzsoa = "tnzs" arcade_tnzsop = "tnzs" arcade_tnzsuo = "tnzs" arcade_todruaga = "todruaga" arcade_todruagao = "todruaga" arcade_todruagas = "todruaga" arcade_todruago = "todruaga" arcade_toffy = "toffy" arcade_toggle = "toggle" arcade_toki = "toki" arcade_tokia = "toki" arcade_tokib = "toki" arcade_tokij = "toki" arcade_tokimbsj = "tokyogal" arcade_tokio = "tokio" arcade_tokiob = "tokio" arcade_tokioo = "tokio" arcade_tokiou = "tokio" arcade_tokip = "toki" arcade_tokisens = "tokisens" arcade_tokiu = "toki" arcade_tokiua = "toki" arcade_tokkae = "tokkae" arcade_tokyogal = "tokyogal" arcade_tomahaw5 = "tomahawk" arcade_tomahawk = "tomahawk" arcade_tondemo = "tondemo" arcade_tontonb = "tontonb" arcade_toobin = "toobin" arcade_toobin1 = "toobin" arcade_toobin2 = "toobin" arcade_toobin2e = "toobin" arcade_toobine = "toobin" arcade_toobing = "toobin" arcade_topgun = "topgun" arcade_topgunbl = "jackal" arcade_topgunr = "jackal" arcade_tophuntr = "tophuntr" arcade_tophuntrh = "tophuntr" arcade_topland = "topland" arcade_toppyrap = "toppyrap" arcade_topracer = "polepos" arcade_topsecex = "topsecex" arcade_topsecrt = "bionicc" arcade_topspedu = "topspeed" arcade_topspeed = "topspeed" arcade_topspeedu = "topspeed" arcade_toramich = "tigeroad" arcade_toratora = "toratora" arcade_toride2g = "toride2g" arcade_toride2gg = "toride2g" arcade_toride2gk = "toride2g" arcade_toride2j = "toride2g" arcade_tornbase = "tornbase" arcade_toryumon = "toryumon" arcade_totc = "totc" arcade_totcarn = "totcarn" arcade_totcarnp = "totcarn" arcade_toto = "toto" arcade_touchgo = "touchgo" arcade_touchgoe = "touchgo" arcade_touchgok = "touchgo" arcade_touchgon = "touchgo" arcade_tourtab2 = "tourtabl" arcade_tourtabl = "tourtabl" arcade_toutrun = "toutrun" arcade_toutrun1 = "toutrun" arcade_toutrun2 = "toutrun" arcade_toutrun2d = "toutrun" arcade_toutrun3 = "toutrun" arcade_toutrun3d = "toutrun" arcade_toutruna = "toutrun" arcade_toutrund = "toutrun" arcade_toutrunj = "toutrun" arcade_toutrunj1 = "toutrun" arcade_toutrunj1d = "toutrun" arcade_toutrunjd = "toutrun" arcade_toypop = "toypop" arcade_tp2m32 = "tetrisp2" arcade_tp84 = "tp84" arcade_tp84a = "tp84" arcade_tp84b = "tp84" arcade_tpgolf = "tpgolf" arcade_trackflc = "trackfld" arcade_trackfld = "trackfld" arcade_trackfldc = "trackfld" arcade_trackfldnz = "trackfld" arcade_trally = "trally" arcade_tranqgun = "tranqgun" arcade_transfrm = "transfrm" arcade_travrusa = "travrusa" arcade_travrusab = "travrusa" arcade_trckydoc = "trckydoc" arcade_trckydoca = "trckydoc" arcade_treahunt = "jack" arcade_tricktrp = "tricktrp" arcade_trigon = "lgtnfght" arcade_trikitri = "loverboy" arcade_triothep = "triothep" arcade_triothepj = "triothep" arcade_triplep = "triplep" arcade_triplepa = "triplep" arcade_triplew1 = "triplew1" arcade_triplew2 = "triplew2" arcade_triplfun = "oisipuzl" arcade_triplhnt = "triplhnt" arcade_tripool = "tripool" arcade_tripoola = "tripool" arcade_trisport = "trisport" arcade_triviabb = "triviabb" arcade_triviag1 = "triviag1" arcade_triviag2 = "triviag2" arcade_triviasp = "triviasp" arcade_triviayp = "triviayp" arcade_trivquiz = "trivquiz" arcade_troangel = "troangel" arcade_trog = "trog" arcade_trog3 = "trog" arcade_trogp = "trog" arcade_trogpa6 = "trog" arcade_trojan = "trojan" arcade_trojana = "trojan" arcade_trojanb = "trojan" arcade_trojanj = "trojan" arcade_trojanr = "trojan" arcade_tron = "tron" arcade_tron2 = "tron" arcade_trophyh = "trophyh" arcade_trstar = "trstar" arcade_trstarj = "trstar" arcade_trstaro = "trstar" arcade_trstaroj = "trstar" arcade_truco = "truco" arcade_truxton = "truxton" arcade_truxton2 = "truxton2" arcade_trvgns = "trvmstr" arcade_trvmstr = "trvmstr" arcade_trvmstra = "trvmstr" arcade_trvmstrb = "trvmstr" arcade_trvmstrc = "trvmstr" arcade_tryout = "tryout" arcade_ts2 = "ts2" arcade_ts2j = "ts2" arcade_tsamura2 = "tsamurai" arcade_tsamurai = "tsamurai" arcade_tsamurai2 = "tsamurai" arcade_tsamuraih = "tsamurai" arcade_tshingen = "tshingen" arcade_tshingena = "tshingen" arcade_tshingna = "tshingen" arcade_tshoot = "tshoot" arcade_tst_galx = "galaxian" arcade_tst_invd = "invaders" arcade_tstrike = "tstrike" arcade_ttfitter = "roundup" arcade_ttmahjng = "ttmahjng" arcade_tturf = "tturf" arcade_tturfbl = "tturf" arcade_tturfu = "tturf" arcade_tubeit = "cachat" arcade_tubep = "tubep" arcade_tugboat = "tugboat" arcade_tumbleb = "tumblep" arcade_tumbleb2 = "tumblep" arcade_tumblep = "tumblep" arcade_tumblep2 = "tumblep" arcade_tumblepb = "tumblep" arcade_tumblepj = "tumblep" arcade_tunhunt = "tunhunt" arcade_tunhuntc = "tunhunt" arcade_turbo = "turbo" arcade_turboa = "turbo" arcade_turbob = "turbo" arcade_turbofrc = "turbofrc" arcade_turbotag = "turbotag" arcade_turfmast = "turfmast" arcade_turkhunt = "turkhunt" arcade_turpin = "turtles" arcade_turpins = "turtles" arcade_turtles = "turtles" arcade_turtship = "turtship" arcade_turtshipj = "turtship" arcade_turtshipk = "turtship" arcade_turtshipkn = "turtship" arcade_turtshipko = "turtship" arcade_tutankhm = "tutankhm" arcade_tutankhms = "tutankhm" arcade_tutankst = "tutankhm" arcade_twcup90 = "twcup90" arcade_twcup90a = "twcup90" arcade_twcup90b = "twcup90" arcade_twcup90b1 = "twcup90" arcade_twcup90b2 = "twcup90" arcade_twcup90b3 = "twcup90" arcade_twcup90b4 = "twcup90" arcade_twcup90ba = "twcup90" arcade_twcup90t = "twcup90" arcade_twcup98 = "twcup98" arcade_twinactn = "twinactn" arcade_twinadv = "twinadv" arcade_twinadvk = "twinadv" arcade_twinbee = "twinbee" arcade_twinbrat = "twinbrat" arcade_twinbrata = "twinbrat" arcade_twinbratb = "twinbrat" arcade_twincobr = "twincobr" arcade_twincobru = "twincobr" arcade_twincobu = "twincobr" arcade_twineag2 = "twineag2" arcade_twineagl = "twineagl" arcade_twinfalc = "twinfalc" arcade_twinhawk = "twinhawk" arcade_twinhawku = "twinhawk" arcade_twinhwku = "twinhawk" arcade_twinkle = "twinkle" arcade_twinqix = "twinqix" arcade_twinspri = "twinspri" arcade_twocrude = "cbuster" arcade_twocrudea = "cbuster" arcade_twotiger = "twotiger" arcade_twotigra = "twotiger" arcade_tws96 = "tws96" arcade_twsoc96 = "twsoc96" arcade_typhoon = "ajax" arcade_uballoon = "uballoon" arcade_uccops = "uccops" arcade_uccopsar = "uccops" arcade_uccopsj = "uccops" arcade_uccopsu = "uccops" arcade_uchuuai = "uchuuai" arcade_uecology = "ecofghtr" arcade_ufosensi = "ufosensi" arcade_ultennis = "ultennis" arcade_ultraman = "ultraman" arcade_ultramhm = "ultramhm" arcade_ultratnk = "ultratnk" arcade_ultrax = "ultrax" arcade_ultraxg = "ultrax" arcade_umanclub = "umanclub" arcade_umk3 = "mk3" arcade_umk3r11 = "mk3" arcade_unclepoo = "unclepoo" arcade_undoukai = "fieldday" arcade_undrfire = "undrfire" arcade_undrfirj = "undrfire" arcade_undrfiru = "undrfire" arcade_uniwars = "uniwars" arcade_uniwarsa = "uniwars" arcade_unkpacg = "unkpacg" arcade_unsquad = "unsquad" arcade_untoucha = "untoucha" arcade_uopoko = "uopoko" arcade_uopokoj = "uopoko" arcade_upndown = "upndown" arcade_upndownu = "upndown" arcade_usclssic = "usclssic" arcade_usg182 = "usgames" arcade_usg185 = "usgames" arcade_usg187c = "usgames" arcade_usg252 = "usg252" arcade_usg32 = "usg32" arcade_usg82 = "superten" arcade_usg83 = "usg83" arcade_usg83x = "superten" arcade_usgames = "usgames" arcade_usvsthem = "usvsthem" arcade_utoukond = "utoukond" arcade_valkyrie = "valkyrie" arcade_valtric = "valtric" arcade_vamphalf = "vamphalf" arcade_vampj = "dstlk" arcade_vampja = "dstlk" arcade_vampjr1 = "dstlk" arcade_vandyjal = "vandyke" arcade_vandyke = "vandyke" arcade_vandykeb = "vandyke" arcade_vandykejal = "vandyke" arcade_vandykejal2 = "vandyke" arcade_vangrd2 = "vangrd2" arcade_vangrdce = "vanguard" arcade_vanguard = "vanguard" arcade_vanguardc = "vanguard" arcade_vanguardj = "vanguard" arcade_vanilla = "vanilla" arcade_vanvan = "vanvan" arcade_vanvanb = "vanvan" arcade_vanvank = "vanvan" arcade_vaportra = "vaportra" arcade_vaportra3 = "vaportra" arcade_vaportrau = "vaportra" arcade_vaportru = "vaportra" arcade_varth = "varth" arcade_varthb = "varth" arcade_varthj = "varth" arcade_varthjr = "varth" arcade_varthr1 = "varth" arcade_varthu = "varth" arcade_vasara = "vasara" arcade_vasara2 = "vasara2" arcade_vasara2a = "vasara2" arcade_vastar = "vastar" arcade_vastar2 = "vastar" arcade_vastar3 = "vastar" arcade_vastar4 = "vastar" arcade_vautour = "phoenix" arcade_vautourz = "phoenix" arcade_vautourza = "phoenix" arcade_vball = "vball" arcade_vball2pj = "vball" arcade_vball2pjb = "vball" arcade_vballb = "vball" arcade_vblokbrk = "vblokbrk" arcade_vblokbrka = "vblokbrk" arcade_vbowl = "vbowl" arcade_vbowlj = "vbowl" arcade_vcircle = "vcircle" arcade_vendet2p = "vendetta" arcade_vendetao = "vendetta" arcade_vendetas = "vendetta" arcade_vendetta = "vendetta" arcade_vendetta2pd = "vendetta" arcade_vendetta2peba = "vendetta" arcade_vendetta2pp = "vendetta" arcade_vendetta2pu = "vendetta" arcade_vendetta2pun = "vendetta" arcade_vendetta2pw = "vendetta" arcade_vendettan = "vendetta" arcade_vendettar = "vendetta" arcade_vendettaz = "vendetta" arcade_vendettj = "vendetta" arcade_vendtaso = "vendetta" arcade_venture = "venture" arcade_venture2 = "venture" arcade_venture4 = "venture" arcade_venus = "gyruss" arcade_vf = "vf" arcade_vfive = "grindstm" arcade_vfkids = "vfkids" arcade_vfremix = "vfremix" arcade_vgoalsca = "vgoalsoc" arcade_vgoalsoc = "vgoalsoc" arcade_vhunt2 = "vhunt2" arcade_vhunt2d = "vhunt2" arcade_vhunt2r1 = "vhunt2" arcade_vhuntj = "nwarr" arcade_vhuntjr1 = "nwarr" arcade_vhuntjr1s = "nwarr" arcade_vhuntjr2 = "nwarr" arcade_victlapw = "victlapw" arcade_victnine = "victnine" arcade_victorba = "victory" arcade_victory = "victory" arcade_victroad = "victroad" arcade_videopin = "videopin" arcade_viewpoin = "viewpoin" arcade_vigilant = "vigilant" arcade_vigilanta = "vigilant" arcade_vigilantb = "vigilant" arcade_vigilantbl = "vigilant" arcade_vigilantc = "vigilant" arcade_vigilantd = "vigilant" arcade_vigilantg = "vigilant" arcade_vigilanto = "vigilant" arcade_vigilntj = "vigilant" arcade_vigilntu = "vigilant" arcade_vimana = "vimana" arcade_vimana1 = "vimana" arcade_vimanan = "vimana" arcade_vindc2r1 = "vindctr2" arcade_vindc2r2 = "vindctr2" arcade_vindctr2 = "vindctr2" arcade_vindice3 = "vindictr" arcade_vindice4 = "vindictr" arcade_vindict1 = "vindictr" arcade_vindict2 = "vindictr" arcade_vindict4 = "vindictr" arcade_vindicte = "vindictr" arcade_vindictg = "vindictr" arcade_vindictr = "vindictr" arcade_viofight = "viofight" arcade_viofightj = "viofight" arcade_viofightu = "viofight" arcade_viostorm = "viostorm" arcade_viostorma = "viostorm" arcade_viostormab = "viostorm" arcade_viostormeb = "viostorm" arcade_viostormj = "viostorm" arcade_viostormu = "viostorm" arcade_viostormub = "viostorm" arcade_viostrma = "viostorm" arcade_viostrmj = "viostorm" arcade_viostrmu = "viostorm" arcade_vipclub = "orangec" arcade_viper = "viper" arcade_vitaminc = "vitaminc" arcade_vliner = "vliner" arcade_vlinero = "vliner" arcade_vmahjong = "vmahjong" arcade_vmetal = "vmetal" arcade_vmetaln = "vmetal" arcade_volfied = "volfied" arcade_volfiedj = "volfied" arcade_volfiedjo = "volfied" arcade_volfiedu = "volfied" arcade_vpool = "hustler" arcade_vsav = "vsav" arcade_vsav2 = "vsav2" arcade_vsav2d = "vsav2" arcade_vsava = "vsav" arcade_vsavd = "vsav" arcade_vsavh = "vsav" arcade_vsavj = "vsav" arcade_vsavu = "vsav" arcade_vsbbalja = "vsbball" arcade_vsbbaljb = "vsbball" arcade_vsbball = "vsbball" arcade_vsbballj = "vsbball" arcade_vsfdf = "vsfdf" arcade_vsgongf = "vsgongf" arcade_vsgradus = "vsgradus" arcade_vsgshoe = "vsgshoe" arcade_vshoot = "vshoot" arcade_vsmahjng = "vsmahjng" arcade_vsnetscr = "vsnetscr" arcade_vspinbal = "vspinbal" arcade_vspinblj = "vspinbal" arcade_vsskykid = "vsskykid" arcade_vsslalom = "vsslalom" arcade_vssoccer = "vssoccer" arcade_vstennis = "vstennis" arcade_vstetris = "vstetris" arcade_vsyard = "yard" arcade_vsyard2 = "yard" arcade_vulcan = "vulcan" arcade_vulcana = "vulcan" arcade_vulcanb = "vulcan" arcade_vulgus = "vulgus" arcade_vulgus2 = "vulgus" arcade_vulgusa = "vulgus" arcade_vulgusj = "vulgus" arcade_wacko = "wacko" arcade_wakuwak7 = "wakuwak7" arcade_wallc = "wallc" arcade_wallca = "wallc" arcade_wallst = "wallst" arcade_wanted = "wanted" arcade_wardner = "wardner" arcade_wardnerj = "wardner" arcade_wargods = "wargods" arcade_warlords = "warlords" arcade_warofbug = "warofbug" arcade_warofbugg = "warofbug" arcade_warofbugu = "warofbug" arcade_warpsped = "warpsped" arcade_warpwar2 = "warpwarp" arcade_warpwarp = "warpwarp" arcade_warpwarpr = "warpwarp" arcade_warpwarpr2 = "warpwarp" arcade_warpwarr = "warpwarp" arcade_warrior = "warrior" arcade_warriorb = "warriorb" arcade_warzard = "redearth" arcade_warzardr1 = "redearth" arcade_waterski = "waterski" arcade_watrball = "watrball" arcade_wb3 = "wb3" arcade_wb31 = "wb3" arcade_wb31d = "wb3" arcade_wb32 = "wb3" arcade_wb32d = "wb3" arcade_wb33 = "wb3" arcade_wb33d = "wb3" arcade_wb34 = "wb3" arcade_wb34d = "wb3" arcade_wb35 = "wb3" arcade_wb35d = "wb3" arcade_wb3a = "wb3" arcade_wb3bbl = "wb3" arcade_wb3bl = "wb3" arcade_wbdeluxe = "wboy" arcade_wbeachvl = "wbeachvl" arcade_wbml = "wbml" arcade_wbmlb = "wbml" arcade_wbmljb = "wbml" arcade_wbmljo = "wbml" arcade_wbmlvc = "wbml" arcade_wboy = "wboy" arcade_wboy2 = "wboy" arcade_wboy2u = "wboy" arcade_wboy3 = "wboy" arcade_wboy4 = "wboy" arcade_wboy5 = "wboy" arcade_wboyo = "wboy" arcade_wboyu = "wboy" arcade_wc90 = "wc90" arcade_wc90a = "wc90" arcade_wc90b = "wc90" arcade_wc90t = "wc90" arcade_wcbowl = "wcbowl" arcade_wcbwl12 = "wcbowl" arcade_wcbwl161 = "wcbowl" arcade_wcbwl165 = "wcbowl" arcade_wcvol95 = "wcvol95" arcade_wcvol95x = "wcvol95" arcade_wecleman = "wecleman" arcade_welltris = "welltris" arcade_welltrisj = "welltris" arcade_weststry = "bloodbro" arcade_weststrya = "bloodbro" arcade_wexpresb = "exprraid" arcade_wexpresc = "exprraid" arcade_wexpress = "exprraid" arcade_wfortuna = "wfortune" arcade_wfortune = "wfortune" arcade_wg3dh = "wg3dh" arcade_wgp = "wgp" arcade_wgp2 = "wgp" arcade_wgpj = "wgp" arcade_wgpjoy = "wgp" arcade_wgpjoya = "wgp" arcade_wh1 = "wh1" arcade_wh1h = "wh1" arcade_wh1ha = "wh1" arcade_wh2 = "wh2" arcade_wh2j = "wh2j" arcade_wh2ja = "wh2j" arcade_wheelrun = "wheelrun" arcade_whizquiz = "whizquiz" arcade_whizz = "twinfalc" arcade_whodunit = "whodunit" arcade_whoopee = "pipibibs" arcade_whp = "whp" arcade_wiggie = "wiggie" arcade_wildfang = "wildfang" arcade_willow = "willow" arcade_willowj = "willow" arcade_willowje = "willow" arcade_willowu = "willow" arcade_willowuo = "willow" arcade_wilytowr = "wilytowr" arcade_wingforc = "wingforc" arcade_winrun91 = "winrun91" arcade_winspike = "winspike" arcade_wintbob = "snowbros" arcade_winterht = "winterht" arcade_wiping = "wiping" arcade_wiseguy = "yamyam" arcade_wits = "wits" arcade_wiz = "wiz" arcade_wizdfire = "wizdfire" arcade_wizdfireu = "wizdfire" arcade_wizt = "wiz" arcade_wizta = "wiz" arcade_wizzquiz = "wizzquiz" arcade_wizzquiza = "wizzquiz" arcade_wjammers = "wjammers" arcade_wldcourt = "wldcourt" arcade_wlstar = "wlstar" arcade_wmatch = "wmatch" arcade_wndrmomo = "wndrmomo" arcade_wndrplnt = "wndrplnt" arcade_wof = "wof" arcade_wof3js = "wof" arcade_wof3jsa = "wof" arcade_wof3sj = "wof" arcade_wof3sja = "wof" arcade_wofa = "wof" arcade_wofah = "wof" arcade_wofaha = "wof" arcade_wofahb = "wof" arcade_wofb = "wof" arcade_wofch = "wofch" arcade_wofchdx = "wofch" arcade_woffr = "wof" arcade_wofh = "wof" arcade_wofha = "wof" arcade_wofhfh = "wof" arcade_wofj = "wof" arcade_wofjh = "wof" arcade_wofr1 = "wof" arcade_wofsj = "wof" arcade_wofsja = "wof" arcade_wofsjb = "wof" arcade_wofsjc = "wof" arcade_wofu = "wof" arcade_wolffang = "rohga" arcade_wolfpack = "wolfpack" arcade_wonder3 = "3wonders" arcade_wondl96 = "wondl96" arcade_wondstck = "wondstck" arcade_wondstcka = "wondstck" arcade_woodpeca = "woodpeck" arcade_woodpeck = "woodpeck" arcade_worldc94 = "worldc94" arcade_worldwar = "worldwar" arcade_wotw = "wotw" arcade_wow = "wow" arcade_wownfant = "wownfant" arcade_wpksoc = "wpksoc" arcade_wrally = "wrally" arcade_wrally2 = "wrally2" arcade_wrally2a = "wrally2" arcade_wrallya = "wrally" arcade_wrallyat = "wrally" arcade_wrallyb = "wrally" arcade_wrecking = "wrecking" arcade_wrestwar = "wrestwar" arcade_wrestwar1 = "wrestwar" arcade_wrestwar1d = "wrestwar" arcade_wrestwar2 = "wrestwar" arcade_wrestwar2d = "wrestwar" arcade_wrofaero = "wrofaero" arcade_ws = "ws" arcade_ws89 = "ws" arcade_ws90 = "ws" arcade_wschamp = "wschamp" arcade_wschampa = "wschamp" arcade_wschampb = "wschamp" arcade_wseries = "wseries" arcade_wsf = "wsf" arcade_wtennis = "wtennis" arcade_wwallyj = "wwallyj" arcade_wwallyja = "wwallyj" arcade_wwallyjad = "wwallyj" arcade_wwallyjd = "wwallyj" arcade_wwester1 = "wwestern" arcade_wwestern = "wwestern" arcade_wwfmania = "wwfmania" arcade_wwfsstar = "wwfsstar" arcade_wwfsstarb = "wwfsstar" arcade_wwfsstarj = "wwfsstar" arcade_wwfsstaru4 = "wwfsstar" arcade_wwfsstaru6 = "wwfsstar" arcade_wwfsstaru7 = "wwfsstar" arcade_wwfwfest = "wwfwfest" arcade_wwfwfestb = "wwfwfest" arcade_wwfwfestj = "wwfwfest" arcade_wwfwfestk = "wwfwfest" arcade_wwfwfestu = "wwfwfest" arcade_wwfwfsta = "wwfwfest" arcade_wwfwfstj = "wwfwfest" arcade_wwjgtin = "wwjgtin" arcade_wyvernf0 = "wyvernf0" arcade_xday2 = "xday2" arcade_xenophob = "xenophob" arcade_xevi3dg = "xevi3dg" arcade_xevios = "xevious" arcade_xevious = "xevious" arcade_xeviousa = "xevious" arcade_xeviousb = "xevious" arcade_xeviousc = "xevious" arcade_xexex = "xexex" arcade_xexexa = "xexex" arcade_xexexj = "xexex" arcade_xfiles = "xfiles" arcade_xmcota = "xmcota" arcade_xmcotaa = "xmcota" arcade_xmcotaar1 = "xmcota" arcade_xmcotab = "xmcota" arcade_xmcotah = "xmcota" arcade_xmcotahr1 = "xmcota" arcade_xmcotaj = "xmcota" arcade_xmcotaj1 = "xmcota" arcade_xmcotaj2 = "xmcota" arcade_xmcotaj3 = "xmcota" arcade_xmcotajr = "xmcota" arcade_xmcotar1 = "xmcota" arcade_xmcotar1d = "xmcota" arcade_xmcotau = "xmcota" arcade_xmen = "xmen" arcade_xmen2p = "xmen" arcade_xmen2pa = "xmen" arcade_xmen2pe = "xmen" arcade_xmen2pj = "xmen" arcade_xmen2pu = "xmen" arcade_xmen6p = "xmen" arcade_xmen6pu = "xmen" arcade_xmena = "xmen" arcade_xmenaa = "xmen" arcade_xmene = "xmen" arcade_xmenj = "xmen" arcade_xmultipl = "xmultipl" arcade_xmultiplm72 = "xmultipl" arcade_xmvsf = "xmvsf" arcade_xmvsfa = "xmvsf" arcade_xmvsfar1 = "xmvsf" arcade_xmvsfar2 = "xmvsf" arcade_xmvsfar3 = "xmvsf" arcade_xmvsfb = "xmvsf" arcade_xmvsfh = "xmvsf" arcade_xmvsfj = "xmvsf" arcade_xmvsfjr1 = "xmvsf" arcade_xmvsfjr2 = "xmvsf" arcade_xmvsfjr3 = "xmvsf" arcade_xmvsfr1 = "xmvsf" arcade_xmvsfu = "xmvsf" arcade_xmvsfu1d = "xmvsf" arcade_xmvsfur1 = "xmvsf" arcade_xmvsfur2 = "xmvsf" arcade_xorworld = "xorworld" arcade_xsedae = "xsedae" arcade_xsleena = "xsleena" arcade_xsleenab = "xsleena" arcade_xsleenaba = "xsleena" arcade_xsleenaj = "xsleena" arcade_xxmissio = "xxmissio" arcade_xybots = "xybots" arcade_xybots0 = "xybots" arcade_xybots1 = "xybots" arcade_xybotsf = "xybots" arcade_xybotsg = "xybots" arcade_xyonix = "xyonix" arcade_yamagchi = "yamagchi" arcade_yamato = "yamato" arcade_yamato2 = "yamato" arcade_yamyam = "yamyam" arcade_yanchamr = "kidniki" arcade_yankeedo = "mrdo" arcade_yard = "yard" arcade_yarunara = "yarunara" arcade_yesnoj = "yesnoj" arcade_yiear = "yiear" arcade_yiear2 = "yiear" arcade_yieartf = "yiear" arcade_ym2608 = "ym2608" arcade_yokaidko = "shadowld" arcade_yosakdon = "yosakdon" arcade_youjyudn = "youjyudn" arcade_youkaidk = "shadowld" arcade_youkaidk1 = "shadowld" arcade_youkaidk2 = "shadowld" arcade_youma = "ninjemak" arcade_youma2 = "ninjemak" arcade_youmab = "ninjemak" arcade_youmab2 = "ninjemak" arcade_yukiwo = "masterw" arcade_yumefuda = "yumefuda" arcade_yuyugogo = "yuyugogo" arcade_zaryavos = "zaryavos" arcade_zarzon = "satansat" arcade_zaviga = "zaviga" arcade_zavigaj = "zaviga" arcade_zaxxon = "zaxxon" arcade_zaxxon2 = "zaxxon" arcade_zaxxon3 = "zaxxon" arcade_zaxxonb = "zaxxon" arcade_zaxxonj = "zaxxon" arcade_zedblade = "zedblade" arcade_zektor = "zektor" arcade_zerohour = "zerohour" arcade_zeropnt = "zeropnt" arcade_zeropnt2 = "zeropnt2" arcade_zeropnta = "zeropnt" arcade_zeropntj = "zeropnt" arcade_zeroteam = "zeroteam" arcade_zeroteama = "zeroteam" arcade_zeroteamb = "zeroteam" arcade_zeroteamc = "zeroteam" arcade_zeroteamd = "zeroteam" arcade_zeroteams = "zeroteam" arcade_zeroteamsr = "zeroteam" arcade_zerotime = "galaxian" arcade_zerotimed = "galaxian" arcade_zerotm2k = "zeroteam" arcade_zerowing = "zerowing" arcade_zerozone = "zerozone" arcade_zigzag = "zigzag" arcade_zigzag2 = "zigzag" arcade_zigzagb = "zigzagb" arcade_zigzagb2 = "zigzagb" arcade_zingzip = "zingzip" arcade_zintrckb = "zintrckb" arcade_zintrkcd = "zintrckb" arcade_zipzap = "zipzap" arcade_znpwfv = "znpwfv" arcade_zoar = "zoar" arcade_zodiack = "zodiack" arcade_zombraid = "zombraid" arcade_zookeep = "zookeep" arcade_zookeep2 = "zookeep" arcade_zookeep3 = "zookeep" arcade_zunkyou = "zunkyou" arcade_zupapa = "zupapa" arcade_zwackery = "zwackery" arcade_zzyzzyx2 = "zzyzzyxx" arcade_zzyzzyxx = "zzyzzyxx" arcade_zzyzzyxx2 = "zzyzzyxx" arcade_tengaijs = "tengai" arcade_dinoxa = "dino" arcade_dinowszh = "dino" arcade_dinotfzn = "dino" arcade_dinoslicews = "dino" arcade_dinolbws = "dino" arcade_dino2015ws = "dino" arcade_dino2011ws = "dino" arcade_kov2ppws2016 = "kov2p" arcade_kov2pfwly = "kov2p" arcade_killbldqy = "killbld" arcade_nbbatmanx2x = "nbbatman" arcade_kovshpwsb = "kovshp" arcade_kovshptx = "kovshp" arcade_kovshptplscs = "kovshp" arcade_kovshpqszltw = "kovshp" arcade_kovshpd19 = "kovshp" arcade_kovshpd3tw = "kovshp" arcade_kovshp1v4x = "kovshp" arcade_kf2k1bs = "kof2001" arcade_kovytzyftxq = "kov" arcade_kovshwsgl = "kovsh" arcade_kovshsjcs = "kovsh" arcade_kovshpdx = "kovshp" arcade_kovshpd3x = "kovshp" arcade_kovshp1v4s = "kovshp" arcade_kovshp1v4 = "kovshp" arcade_kovplus2012st = "kovplus" arcade_kovplus2012m = "kovplus" arcade_kovplus2012em = "kovplus" arcade_kovplus2012dw = "kovplus" arcade_kov2ppws = "kov3p" arcade_kov2pplus = "kov2p" arcade_orlegndcmm = "orlegnd" arcade_oldsplushmf = "oldsplus" arcade_kovshpqszltw = "kovshp" arcade_kovshpqszl = "kovshp" arcade_kovshpd3tw = "kovshp" arcade_kovshpd3 = "kovshp" arcade_kovshpb = "kovshp" arcade_kovplusxt = "kovplus" arcade_kovplusdszl = "kovplus" arcade_kovplusdjjz = "kovplus" arcade_kov2pfwll = "kov2p" arcade_snowbrosbs = "snowbros" arcade_olds100asrp = "olds100a" arcade_olds100aem2016 = "olds100a" arcade_kov2pjlcq = "kov2p" arcade_kof99rpg = "kof99" arcade_kof97rugal = "kof97" arcade_mslug3sd = "mslug3" arcade_mslug2dg = "mslug2" arcade_mslug2gs = "mslug2" arcade_mslugdg = "mslug" arcade_mslug4sp = "mslug4" arcade_mslug4lw = "mslug4" arcade_mslug4ammor = "mslug4" arcade_mslug4d = "mslug4" arcade_avspp = "avsp" arcade_mslug3n6zp = "mslug3" arcade_mslug3nzj = "mslug3" arcade_mslug3v2 = "mslug3" arcade_mslug3ntk = "mslug3" arcade_mslug3eb = "mslug3" arcade_mslug3ngw = "mslug3" arcade_mslug3nsj = "mslug3" arcade_mslug3nd = "mslug3" arcade_mslug5g = "mslug5" arcade_punisherly = "punisher" arcade_punisherhr = "punisher" arcade_punisherdw = "punisher" arcade_punisherbs = "punisher" arcade_punisher1v2 = "punisher" arcade_mslug5dzh = "mslug5" arcade_mslug5dg3 = "mslug5" arcade_mslug5dg2 = "mslug5" arcade_mslug5d = "mslug5" arcade_mslug5wn = "mslug5" arcade_ms5f = "mslug5" arcade_kovshpb = "kovsh" arcade_kovshpd19 = "kovsh" arcade_olds100aem2015 = "olds100a" arcade_kovplus2017 = "kovplus" arcade_kov2pmess = "kov2p" arcade_olds100aem = "olds100a" arcade_mslug2r = "mslug2" arcade_mslug2p = "mslug2" arcade_mslug2h = "mslug2" arcade_mslug2ct = "mslug2" arcade_mslugxplus = "mslugx" arcade_mslugxjdkj = "mslugx" arcade_mslugxh = "mslugx" arcade_mslugxeb = "mslugx" arcade_mslugxc2 = "mslugx" arcade_mslugxc1 = "mslugx" arcade_kof97ru = "kof97" arcade_kof98eckp = "kof98" arcade_kovshpwsb = "kovsh" arcade_kovshptplscs = "kovsh" arcade_kov8 = "kovplus" arcade_kovshp1v4xtw = "kovsh" arcade_kovshp1v4x = "kovsh" arcade_nbbatmanx2x = "nbbatman" arcade_wofdr = "wof" arcade_knightsp = "knights" arcade_knightsc = "knights" arcade_ddtodp = "ddtod" arcade_ddsoma4pp = "ddsom" arcade_grdianssy = "grdians" arcade_grdiansplus = "grdians" arcade_dinoyz = "dino" arcade_dinoplus = "dino" arcade_dinodw = "dino" arcade_dino1v3 = "dino" arcade_captcommr1v4 = "captcomm" arcade_captcommp = "captcomm" arcade_ffight1v2 = "ffight" arcade_ffightj2u = "ffight" arcade_wofzl = "wof" arcade_wofmz = "wof" arcade_wofdwp = "wof" arcade_wof3m = "wof" arcade_wof1v3 = "wof" arcade_koddw = "kod" arcade_kodbs = "kod" arcade_kod1v3 = "kod" arcade_kof98eck = "kof98" arcade_kof97orh = "kof97" arcade_nbbatmanx2 = "nbbatman" arcade_nbbatmanbh = "nbbatman" arcade_nbbatman1v4 = "nbbatman" arcade_hookxr = "hook" arcade_hookx2 = "hook" arcade_hookus = "hook" arcade_hookj1v4 = "hook" arcade_kof97p = "kof97" arcade_kof97u = "kof97" arcade_wofdr = "wof" arcade_olds100aylzx = "olds100a" arcade_mslug4dr = "mslug4" arcade_mslug3n6p = "mslug3" arcade_mslug3c = "mslug3" arcade_kovytzyp = "kovytzy" arcade_kovshzlzymy = "kovsh" arcade_kovshpqxzqj = "kovshp" arcade_kovshp1v4xtw = "kovshp" arcade_kovshp1v4x = "kovshp" arcade_kof2knd = "kof2000" arcade_kof02ic = "kof2002" arcade_kf2k1cm = "kof2001" arcade_kf2k1bs = "kof2001" arcade_kof2000t = "kof2000" arcade_kof2000p = "kof2000" arcade_kof99pr = "kof99" arcade_kof99ae = "kof99" arcade_kof96p = "kof96" arcade_kof96c = "kof96" arcade_kof96ae20 = "kof96" arcade_kof94p = "kof94" arcade_kof97ys = "kof97" arcade_kof97xlb = "kof97" arcade_kof97tsb = "kof97" arcade_kof97plss20 = "kof97" arcade_kof97m = "kof97" arcade_kof97c = "kof97" arcade_mslug2r = "mslug2" arcade_kof97st = "kof97" arcade_kof99t = "kof99" arcade_kof99nd = "kof99" arcade_olds100afybh = "olds100a" arcade_kovshzlzywj = "kovsh" arcade_kovshzlzyjz = "kovsh" arcade_kovshzlzy = "kovsh" arcade_kovplusxb2wj = "kovplus" arcade_kovplusxb2ds = "kovplus" arcade_kovplusxb2 = "kovplus" arcade_kovplusxb1 = "kovplus" arcade_kf2k2tt = "kof2002" arcade_kof2k2c2 = "kof2002" arcade_wofchdx = "wofch" arcade_captcommr1dw = "captcomm" arcade_wofjps = "wof" arcade_dinows2019 = "dino" arcade_wofr19 = "wof" arcade_kof97sw2s = "kof97" arcade_kof97sw2 = "kof97" arcade_kof98eckp = "kof98" arcade_kof98eck = "kof98" arcade_kf2k2mp3s = "kof2002" arcade_kf2k2mp3 = "kof2002" arcade_olds100adsgl = "olds100a" arcade_kovshpqxzqj = "kovshp" arcade_kovshpp19 = "kovshp" arcade_kovshpqxzq = "kovshp" arcade_kovshp1v4x = "kovshp" arcade_kovshp1v4x = "kovshp" arcade_kov2pswcq = "kov2p" arcade_kov2pcthl = "kov2p" arcade_mslug5dg3 = "mslug5" arcade_mslug5dg2 = "mslug5" arcade_mslug4dr = "mslug4" arcade_wofdr = "wof" arcade_captcommpzs = "captcomm" arcade_captcommpwx = "captcomm" arcade_captcommpjy = "captcomm" arcade_captcommr1bs = "captcomm" arcade_captcommrds = "captcomm" arcade_dinoxzb = "dino" arcade_dinowtw = "dino" arcade_dinowj = "dino" arcade_dinojps = "dino" arcade_dinojds = "dino" arcade_mslug3g = "mslug3" arcade_mslug3c = "mslug3" arcade_grdianslbs = "grdians" arcade_kof97orh = "kof97" ================================================ FILE: packages/sx05re/emuelec/config/emuelec/configs/buttonmapping.cfg ================================================ kcub1 kcuf1 kcuu1 kcud1 0x0a 0x20 knp kpp knp kpp left right up down a b x y l r # First line contains mapped curses capability names (https://pubs.opengroup.org/onlinepubs/7908799/xcurses/terminfo.html) or hex values starting with '0x' # Second line contains corresponding buttons (from /tmp/joypads/.cfg) ================================================ FILE: packages/sx05re/emuelec/config/emuelec/configs/dimensions.conf ================================================ 3840x2160 2560x1440 1920x1080 1280x720 720x480 768x576 1680x1050 1440x900 1280x1024 1280x960 1280x800 1024x768 800x600 640x480 320x240 ================================================ FILE: packages/sx05re/emuelec/config/emuelec/configs/emuelec.conf ================================================ ## ------------ A - EmuELEC configuration ------------ # ## Enable SSH at boot ee_ssh.enabled=1 ## Enable Bluetooth at boot ee_bluetooth.enabled=1 ## Use maxperf, enable max settings for GPU and performance governer, this setting can be set globally, per platform or per game on the ES menu global.maxperf=1 ## Auto shutdown timer (in minutes, 0 is OFF) ee_auto_shutdown_timeout=0 ## Auto shutdown will persist between reboots as long as ee_auto_shutdown_timeout is > 0 (0 = one time or 1 = persistent) ee_auto_shutdown_persistent=0 ## Always show boot video #ee_bootvideo.enabled=0 ## Which type of splash loading, ## 0, Default - Legacy option, will load the default splash. ## 1, Custom - Select your own image/video! set in ee_customsplash= ## 2, Random - automatically selects video/image from the defined path by default /storage/roms/splash/random set in ee_randomsplashpath= ## 3, Scraped media - This option will read your platform gamelist.xml for a predefined tag and use any media you have scraped. set in ee_scrapedsplashpath= ee_splashloading=3 ## Show a custom splash image/video ee_customsplash= ## Which type of splash exit. ee_splashexit=0 ## Enable custom exit splash image/video ee_customexitsplash= ## Random splash loading path ee_randomsplashpath=/storage/roms/splash/random ## Scraped section to show as splash, accepted values image,thumbnail,video,marquee, fanart or random. leave empty for default ee_scrapedsplashpath=random ## Duration of loading splash ee_splash_loading_duration=0 ## Duration of exit splash ee_splash_exit_duration=0 ## Splash loading platforms and roms ## Enable Platform/Rom loading: Legacy option, will look for a file in /storage/splash/{platform}/{rom_name}.png if not found it will look for /storage/splash/{platform}/launching.png ee_splash_loading_platform_roms=1 ## Set video mode ee_videomode=1080p60hz ## What to start at boot Emulationstation or Retroarch ee_boot=Emulationstation ## Always show Retroarch FPS global.showFPS=0 ## Enable retroarch bezels global.bezel=0 ## Enable splash screens ee_splash.enabled=1 ## set to 1 if you have long loading times after quitting a game, you will lose sound mixing in ES, this only affects S905 devices as all others use alsa. #ee_alsa.always=0 ## Force splash screens to display for X seconds #ee_splash.delay=0 ## Some external HDDs take longer to mount than ES to load, if your external ROMS do not mount in time, increase this timer. If you have multiple external drives to scan, you must set this according to the slowest drive, as eemount will not rescan external drives as long as at least 1 external drive that provides ROMs is found. #ee_load.delay=0 ## Mount handler. There're two existing mount handler: eemount (newer and the default, written in C) and mount_romfs.sh (older, written in Bash), and you can write your own. Since it's called in a bash script (emuelec_autostart.sh), setting it to : can disable the whole mounting logic (which is not suggested) if you want to squeeze every last second of booting time. #ee_mount.handler=eemount ## Retry mounting this many times, note this is retry, not try, actual try count will +1 (and it can't be disabled even you set it to -1, you must set ee_mount.handler=: if you don't want eemount to work at all). The retry count only affects external drive scanning and does not affect systemd mount units scanning at all. ee_mount.retry=1 # Audio device to use, comment for auto, other options 0,0 (default) 0,1 (for some AV outputs) #ee_audio_device=auto # Use emuelec.conf from roms folder (/storage/roms)? 0 or 1 (default 0) #ee_romconf_enable=0 # Enable Advance mame auto gamepad configuration 1,0 (default 1) advmame_auto_gamepad=1 dolphin_auto_gamepad=1 flycast_auto_gamepad=1 mupen64plus_auto_gamepad=1 advmame_invert_axis=0 # Enable Advance mame config buttom remapping 1,0 (default 0) advmame_joy_remap=1 AdvanceMame.joy_btns=input a button,input b button,input x button,input y button,input r button,input l button,input r2 button,input l2 button AdvanceMame.joy_btn_indexes=1,2 AdvanceMame.joy_btn_names=mk,sf AdvanceMame.joy_btn_order0=0 1 2 3 4 5 6 7 AdvanceMame.joy_btn_order1=3 4 2 1 0 5 6 7 AdvanceMame.joy_btn_order2=3 2 5 1 0 4 6 7 # OdroidGoAdvance Brightness Level brightness.level=100 ## EmulationStation menu style ## default -> default all options menu ## none -> no menu except the game search menu ## bartop -> less menu, only needed for bartops #system.es.menu=default # ------------ B - Network ------------ # ## Set system hostname system.hostname=EMUELEC ## Activate wifi (0,1) wifi.enabled=0 ## Wifi SSID (string) #wifi.ssid= ## Wifi KEY (string) ## after rebooting the "new key" is replace by a hidden value "enc:xxxxx" ## you can edit the "enc:xxxxx" value to replace by a clear value, it will be updated again at the following reboot ## Escape your special chars (# ; $) with a backslash : $ => \$ #wifi.key= # secondary wifi (not configurable via the user interface) #wifi2.ssid=new ssid #wifi2.key=new key # third wifi (not configurable via the user interface) #wifi3.ssid=new ssid #wifi3.key=new key # ------------ C - Audio ------------ # ## Set the audio device (auto, hdmi, jack, speakers, headphones) mostly for OdroidGoAdvance audio.device=auto ## Set system volume (0..100) audio.volume=100 ## Enable or disable system sounds in ES (0,1) audio.bgmusic=1 ## Custom menu scroll sound (.ogg-file) ee_menuscrollsound= # -------------- D - Controllers ----------------- # # Enable support for standard bluetooth controllers controllers.bluetooth.enabled=1 # ------------ F - Language and keyboard ------------ # ## Set the language of the system (fr_FR,en_US,en_GB,de_DE,pt_BR,es_ES,it_IT,eu_ES,tr_TR,zh_CN) system.language=en_US ## Set you local time ## Select your timezone from : ls /usr/share/zoneinfo/ (string) system.timezone=America/Mexico_City # ------------ G - UPDATES ------------ # ## Automatically check for updates at start (0,1) updates.enabled=1 # default : stable ; set to beta to get the next version currently being tested. updates.type=stable # ------------ H - HERE IT IS - GLOBAL EMULATOR CONFIGURATION ------------ # ## The global value will be used for all emulators, except if the value ## is redefined in the emulator ## Retroarch menu driver, ozone (default), rgui or xmb #global.retroarch.menu_driver= ## Shader set ## Automatically select shaders for all systems ## (none, retro, scanlines) #global.shaderset=none ## Once enabled, your screen will be cropped, and you will have a pixel perfect image (0,1) #global.integerscale=0 ## Set gpslp shader for all emulators (prefer shadersets above). Absolute path (string) #global.shaders= ## Set ratio for all emulators (auto,4/3,16/9,16/10,custom) #global.ratio=4/3 ## Set smooth for all emulators (0,1) #global.smooth=1 ## Set rewind for all emulators (0,1) #global.rewind=1 ## Set autosave/load savestate for all emulators (0,1) #global.autosave=0 ## Set runahead frames for all emulators (0,1,2,3,4,5,6) global.runahead=0 ## Set secondinstance for runahead for all emulators (0,1) global.secondinstance=0 ## Enable retroarchievements (0,1) ## Set your www.retroachievements.org username/password ## Escape your special chars (# ; $) with a backslash : $ => \$ global.retroachievements=0 global.retroachievements.hardcore=0 global.retroachievements.leaderboards=0 global.retroachievements.verbose=0 global.retroachievements.screenshot=0 global.retroachievements.username= global.retroachievements.password= ## Enable RetroArch AI game translation service #global.ai_service_enabled=0 #global.ai_service_url= #global.ai_target_lang= ## Netplay #global.netplay=0 #global.netplay.port=55435 #global.netplay_public_announce=1 global.netplay.nickname=EmuElec Player # scrapper # Comma seperated order to prefer images, s=snapshot, b=boxart, f=fanart, a=banner, l=logo, 3b=3D boxart #scrapper.style=s,b,f,a,l,3b ## Configurations generated by Emulationstation audio.display_titles=1 audio.display_titles_time=10 audio.persystem=0 ================================================ FILE: packages/sx05re/emuelec/config/emuelec/configs/emuoptions.conf ================================================ # THIS FILE IS NO LONGER USED, USE emuelec.conf INSTEAD ================================================ FILE: packages/sx05re/emuelec/config/emuelec/configs/gptokeyb/fallout.gptk ================================================ back = esc start = enter guide = enter a = mouse_right b = mouse_left x = i y = s l1 = b l2 = home l3 = mouse_right r1 = s r2 = end r3 = shift up = c down = space left = a right = space left_analog_up = mouse_movement_up left_analog_down = mouse_movement_down left_analog_left = mouse_movement_left left_analog_right = mouse_movement_right right_analog_up = up right_analog_down = down right_analog_left = left right_analog_right = right mouse_scale = 4000 mouse_delay = 16 ================================================ FILE: packages/sx05re/emuelec/config/emuelec/configs/gptokeyb/sorr.gptk ================================================ back = esc start = enter guide = enter # Special x = x # Attack b = c # Jump a = v # Series y = a # Combo l1 = s # back attack l2 = d # Police r1 = b up = up down = down left = left right = right left_analog_up = up left_analog_down = down left_analog_left = left left_analog_right = right right_analog_up = up right_analog_down = down right_analog_left = left right_analog_right = right # Unused in game but made available in case of remap r2 = y r3 = e l3 = z ================================================ FILE: packages/sx05re/emuelec/config/emuelec/configs/jslisten.cfg ================================================ [Generic] program="" button1= button2= ee_evdev="auto" # ******** Do not edit anything above this line, in fact not even this comment! ******** ================================================ FILE: packages/sx05re/emuelec/config/emuelec/configs/pico-8/sdl_controllers.txt ================================================ // add SDL2 game controller mappings to this file 19000000010000000100000001010000,odroidgo2_joypad,a:b1,b:b0,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,leftx:a0,lefty:a1,guide:b10,leftstick:b12,lefttrigger:b11,rightstick:b13,righttrigger:b14,start:b15,platform:Linux, 19000000010000000200000011000000,odroidgo2_joypad_v11",a:b1,b:b0,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftx:a0,lefty:a1,guide:b12,leftstick:b14,lefttrigger:b13,rightstick:b15,righttrigger:b16,start:b17,platform:Linux, ================================================ FILE: packages/sx05re/emuelec/config/emuelec/configs/tz ================================================ Africa/Abidjan Africa/Accra Africa/Addis_Ababa Africa/Algiers Africa/Asmara Africa/Asmera Africa/Bamako Africa/Bangui Africa/Banjul Africa/Bissau Africa/Blantyre Africa/Brazzaville Africa/Bujumbura Africa/Cairo Africa/Casablanca Africa/Ceuta Africa/Conakry Africa/Dakar Africa/Dar_es_Salaam Africa/Djibouti Africa/Douala Africa/El_Aaiun Africa/Freetown Africa/Gaborone Africa/Harare Africa/Johannesburg Africa/Juba Africa/Kampala Africa/Khartoum Africa/Kigali Africa/Kinshasa Africa/Lagos Africa/Libreville Africa/Lome Africa/Luanda Africa/Lubumbashi Africa/Lusaka Africa/Malabo Africa/Maputo Africa/Maseru Africa/Mbabane Africa/Mogadishu Africa/Monrovia Africa/Nairobi Africa/Ndjamena Africa/Niamey Africa/Nouakchott Africa/Ouagadougou Africa/Porto-Novo Africa/Sao_Tome Africa/Timbuktu Africa/Tripoli Africa/Tunis Africa/Windhoek America/Adak America/Anchorage America/Anguilla America/Antigua America/Araguaina America/Argentina/Buenos_Aires America/Argentina/Catamarca America/Argentina/ComodRivadavia America/Argentina/Cordoba America/Argentina/Jujuy America/Argentina/La_Rioja America/Argentina/Mendoza America/Argentina/Rio_Gallegos America/Argentina/Salta America/Argentina/San_Juan America/Argentina/San_Luis America/Argentina/Tucuman America/Argentina/Ushuaia America/Aruba America/Asuncion America/Atikokan America/Atka America/Bahia America/Bahia_Banderas America/Barbados America/Belem America/Belize America/Blanc-Sablon America/Boa_Vista America/Bogota America/Boise America/Buenos_Aires America/Cambridge_Bay America/Campo_Grande America/Cancun America/Caracas America/Catamarca America/Cayenne America/Cayman America/Chicago America/Chihuahua America/Coral_Harbour America/Cordoba America/Costa_Rica America/Creston America/Cuiaba America/Curacao America/Danmarkshavn America/Dawson America/Dawson_Creek America/Denver America/Detroit America/Dominica America/Edmonton America/Eirunepe America/El_Salvador America/Ensenada America/Fort_Nelson America/Fort_Wayne America/Fortaleza America/Glace_Bay America/Godthab America/Goose_Bay America/Grand_Turk America/Grenada America/Guadeloupe America/Guatemala America/Guayaquil America/Guyana America/Halifax America/Havana America/Hermosillo America/Indiana/Indianapolis America/Indiana/Knox America/Indiana/Marengo America/Indiana/Petersburg America/Indiana/Tell_City America/Indiana/Vevay America/Indiana/Vincennes America/Indiana/Winamac America/Indianapolis America/Inuvik America/Iqaluit America/Jamaica America/Jujuy America/Juneau America/Kentucky/Louisville America/Kentucky/Monticello America/Knox_IN America/Kralendijk America/La_Paz America/Lima America/Los_Angeles America/Louisville America/Lower_Princes America/Maceio America/Managua America/Manaus America/Marigot America/Martinique America/Matamoros America/Mazatlan America/Mendoza America/Menominee America/Merida America/Metlakatla America/Mexico_City America/Miquelon America/Moncton America/Monterrey America/Montevideo America/Montreal America/Montserrat America/Nassau America/New_York America/Nipigon America/Nome America/Noronha America/North_Dakota/Beulah America/North_Dakota/Center America/North_Dakota/New_Salem America/Ojinaga America/Panama America/Pangnirtung America/Paramaribo America/Phoenix America/Port-au-Prince America/Port_of_Spain America/Porto_Acre America/Porto_Velho America/Puerto_Rico America/Punta_Arenas America/Rainy_River America/Rankin_Inlet America/Recife America/Regina America/Resolute America/Rio_Branco America/Rosario America/Santa_Isabel America/Santarem America/Santiago America/Santo_Domingo America/Sao_Paulo America/Scoresbysund America/Shiprock America/Sitka America/St_Barthelemy America/St_Johns America/St_Kitts America/St_Lucia America/St_Thomas America/St_Vincent America/Swift_Current America/Tegucigalpa America/Thule America/Thunder_Bay America/Tijuana America/Toronto America/Tortola America/Vancouver America/Virgin America/Whitehorse America/Winnipeg America/Yakutat America/Yellowknife Antarctica/Casey Antarctica/Davis Antarctica/DumontDUrville Antarctica/Macquarie Antarctica/Mawson Antarctica/McMurdo Antarctica/Palmer Antarctica/Rothera Antarctica/South_Pole Antarctica/Syowa Antarctica/Troll Antarctica/Vostok Arctic/Longyearbyen Asia/Aden Asia/Almaty Asia/Amman Asia/Anadyr Asia/Aqtau Asia/Aqtobe Asia/Ashgabat Asia/Ashkhabad Asia/Atyrau Asia/Baghdad Asia/Bahrain Asia/Baku Asia/Bangkok Asia/Barnaul Asia/Beirut Asia/Bishkek Asia/Brunei Asia/Calcutta Asia/Chita Asia/Choibalsan Asia/Chongqing Asia/Chungking Asia/Colombo Asia/Dacca Asia/Damascus Asia/Dhaka Asia/Dili Asia/Dubai Asia/Dushanbe Asia/Famagusta Asia/Gaza Asia/Harbin Asia/Hebron Asia/Ho_Chi_Minh Asia/Hong_Kong Asia/Hovd Asia/Irkutsk Asia/Istanbul Asia/Jakarta Asia/Jayapura Asia/Jerusalem Asia/Kabul Asia/Kamchatka Asia/Karachi Asia/Kashgar Asia/Kathmandu Asia/Katmandu Asia/Khandyga Asia/Kolkata Asia/Krasnoyarsk Asia/Kuala_Lumpur Asia/Kuching Asia/Kuwait Asia/Macao Asia/Macau Asia/Magadan Asia/Makassar Asia/Manila Asia/Muscat Asia/Nicosia Asia/Novokuznetsk Asia/Novosibirsk Asia/Omsk Asia/Oral Asia/Phnom_Penh Asia/Pontianak Asia/Pyongyang Asia/Qatar Asia/Qostanay Asia/Qyzylorda Asia/Rangoon Asia/Riyadh Asia/Saigon Asia/Sakhalin Asia/Samarkand Asia/Seoul Asia/Shanghai Asia/Singapore Asia/Srednekolymsk Asia/Taipei Asia/Tashkent Asia/Tbilisi Asia/Tehran Asia/Tel_Aviv Asia/Thimbu Asia/Thimphu Asia/Tokyo Asia/Tomsk Asia/Ujung_Pandang Asia/Ulaanbaatar Asia/Ulan_Bator Asia/Urumqi Asia/Ust-Nera Asia/Vientiane Asia/Vladivostok Asia/Yakutsk Asia/Yangon Asia/Yekaterinburg Asia/Yerevan Atlantic/Azores Atlantic/Bermuda Atlantic/Canary Atlantic/Cape_Verde Atlantic/Faeroe Atlantic/Faroe Atlantic/Jan_Mayen Atlantic/Madeira Atlantic/Reykjavik Atlantic/South_Georgia Atlantic/St_Helena Atlantic/Stanley Australia/ACT Australia/Adelaide Australia/Brisbane Australia/Broken_Hill Australia/Canberra Australia/Currie Australia/Darwin Australia/Eucla Australia/Hobart Australia/LHI Australia/Lindeman Australia/Lord_Howe Australia/Melbourne Australia/NSW Australia/North Australia/Perth Australia/Queensland Australia/South Australia/Sydney Australia/Tasmania Australia/Victoria Australia/West Australia/Yancowinna Brazil/Acre Brazil/DeNoronha Brazil/East Brazil/West CET CST6CDT Canada/Atlantic Canada/Central Canada/Eastern Canada/Mountain Canada/Newfoundland Canada/Pacific Canada/Saskatchewan Canada/Yukon Chile/Continental Chile/EasterIsland Cuba EET EST EST5EDT Egypt Eire Etc/GMT Etc/GMT+0 Etc/GMT+1 Etc/GMT+10 Etc/GMT+11 Etc/GMT+12 Etc/GMT+2 Etc/GMT+3 Etc/GMT+4 Etc/GMT+5 Etc/GMT+6 Etc/GMT+7 Etc/GMT+8 Etc/GMT+9 Etc/GMT-0 Etc/GMT-1 Etc/GMT-10 Etc/GMT-11 Etc/GMT-12 Etc/GMT-13 Etc/GMT-14 Etc/GMT-2 Etc/GMT-3 Etc/GMT-4 Etc/GMT-5 Etc/GMT-6 Etc/GMT-7 Etc/GMT-8 Etc/GMT-9 Etc/GMT0 Etc/Greenwich Etc/UCT Etc/UTC Etc/Universal Etc/Zulu Europe/Amsterdam Europe/Andorra Europe/Astrakhan Europe/Athens Europe/Belfast Europe/Belgrade Europe/Berlin Europe/Bratislava Europe/Brussels Europe/Bucharest Europe/Budapest Europe/Busingen Europe/Chisinau Europe/Copenhagen Europe/Dublin Europe/Gibraltar Europe/Guernsey Europe/Helsinki Europe/Isle_of_Man Europe/Istanbul Europe/Jersey Europe/Kaliningrad Europe/Kiev Europe/Kirov Europe/Lisbon Europe/Ljubljana Europe/London Europe/Luxembourg Europe/Madrid Europe/Malta Europe/Mariehamn Europe/Minsk Europe/Monaco Europe/Moscow Europe/Nicosia Europe/Oslo Europe/Paris Europe/Podgorica Europe/Prague Europe/Riga Europe/Rome Europe/Samara Europe/San_Marino Europe/Sarajevo Europe/Saratov Europe/Simferopol Europe/Skopje Europe/Sofia Europe/Stockholm Europe/Tallinn Europe/Tirane Europe/Tiraspol Europe/Ulyanovsk Europe/Uzhgorod Europe/Vaduz Europe/Vatican Europe/Vienna Europe/Vilnius Europe/Volgograd Europe/Warsaw Europe/Zagreb Europe/Zaporozhye Europe/Zurich GB GB-Eire GMT GMT+0 GMT-0 GMT0 Greenwich HST Hongkong Iceland Indian/Antananarivo Indian/Chagos Indian/Christmas Indian/Cocos Indian/Comoro Indian/Kerguelen Indian/Mahe Indian/Maldives Indian/Mauritius Indian/Mayotte Indian/Reunion Iran Israel Jamaica Japan Kwajalein Libya MET MST MST7MDT Mexico/BajaNorte Mexico/BajaSur Mexico/General NZ NZ-CHAT Navajo PRC PST8PDT Pacific/Apia Pacific/Auckland Pacific/Bougainville Pacific/Chatham Pacific/Chuuk Pacific/Easter Pacific/Efate Pacific/Enderbury Pacific/Fakaofo Pacific/Fiji Pacific/Funafuti Pacific/Galapagos Pacific/Gambier Pacific/Guadalcanal Pacific/Guam Pacific/Honolulu Pacific/Johnston Pacific/Kiritimati Pacific/Kosrae Pacific/Kwajalein Pacific/Majuro Pacific/Marquesas Pacific/Midway Pacific/Nauru Pacific/Niue Pacific/Norfolk Pacific/Noumea Pacific/Pago_Pago Pacific/Palau Pacific/Pitcairn Pacific/Pohnpei Pacific/Ponape Pacific/Port_Moresby Pacific/Rarotonga Pacific/Saipan Pacific/Samoa Pacific/Tahiti Pacific/Tarawa Pacific/Tongatapu Pacific/Truk Pacific/Wake Pacific/Wallis Pacific/Yap Poland Portugal ROC ROK Singapore Turkey UCT US/Alaska US/Aleutian US/Arizona US/Central US/East-Indiana US/Eastern US/Hawaii US/Indiana-Starke US/Michigan US/Mountain US/Pacific US/Pacific-New US/Samoa UTC Universal W-SU WET Zulu ================================================ FILE: packages/sx05re/emuelec/config/emuelec/lib/put_user_libs_here ================================================ Place user libs here, they will take priority over /usr Please take care of the added libraries by yourself and remember to clean/update them if neccessary for each update as they may be outdated and break some programs ================================================ FILE: packages/sx05re/emuelec/config/emuelec/lib32/put_32b_user_libs_here ================================================ Place 32bit user libs here, they will take priority over /usr Please take care of the added libraries by yourself and remember to clean/update them if neccessary for each update as they may be outdated and break some programs ================================================ FILE: packages/sx05re/emuelec/config/emuelec/scripts/put_user_scripts_here ================================================ pleace user scripts here, they will show up in "Setup" section in ES ================================================ FILE: packages/sx05re/emuelec/config/emulationstation/scripts/es_env.sh ================================================ HOME=/storage #LD_LIBRARY_PATH=/emuelec/lib:/usr/lib:/usr/lib/pulseaudio PATH=/emuelec/scripts:/emuelec/bin:/usr/bin:/usr/sbin:/storage/.config/emulationstation/scripts:/usr/bin/batocera #SDL_AUDIODRIVER=alsa ================================================ FILE: packages/sx05re/emuelec/config/emulationstation/scripts/inputconfiguration.sh ================================================ #!/usr/bin/bash # This file is part of The RetroPie Project # # The RetroPie Project is the legal property of its developers, whose names are # too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source. # # See the LICENSE.md file at the top-level directory of this distribution and # at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md # ## @file scriptmodules/supplementary/emulationstation/inputconfiguration.sh ## @brief input configuration script ## @copyright GPLv3 ## @details ## @par global variables ## ## There are 3 global variables which are set to the current device being processed ## ## `DEVICE_TYPE` = device type is currently either joystick, keyboard or cec ## `DEVICE_NAME` = name of the device ## `DEVICE_GUID` = SDL2 joystick GUID of the device (-1 for keyboard, -2 for cec) ## ## @par Interface functions ## ## each input configuration module can have an optional function ## `check_`. If this function returns 1, the module is ## skipped. This can be used to skip input configurations in some cases - eg ## to skip configuration when an existing config file is not installed. ## ## There are 3 main interface functions for each of the input types (joystick/keyboard) ## ## function `onstart__()` ## is run at the start of the input configuration ## ## function `onend__()` ## is run at the end of the input configuration ## ## Returns: ## None ## ## function map__() ## is run for each of the inputs - with the following arguments ## ## Arguments: ## * ${1} - input name is one of the following ## * up, down, left, right ## * a, b, x, y ## * leftshoulder, rightshoulder, lefttrigger, righttrigger ## * leftthumb. rightthumb ## * start, select ## * leftanalogup, leftanalogdown, leftanalogleft, leftanalogright ## * rightanalogup, rightanalogdown, rightanalogleft, rightanalogright ## * ${2} - input type is button, axis or hat for joysticks, key for keyboard and button for cec. ## * ${3} - button id of the input for a joystick, SDL2 keycode for a keyboard, or button id for cec. ## * ${4} - value of the joystick input or 1 for keyboard and cec. ## ## Returns: ## None # Modified 2019 by Shanti Gilbert for EmuELEC/CoreELEC (https//www.coreelec.org) function inputconfiguration() { local es_conf="${home}/.emulationstation/es_temporaryinput.cfg" declare -A mapping # check if we have the temporary input file [[ ! -f "${es_conf}" ]] && return # EmuELEC: ES is doing something weird to es_temp so we try to clean it up if cat "${es_conf}" | grep "<>"; then sed -i '3d;4d;5d' "${es_conf}" fi # EmuELEC local line while read line; do if [[ -n "${line}" ]]; then local input=(${line}) mapping["${input[0]}"]=${input[@]:1} fi done < <(xmlstarlet sel --text -t -m "/inputList/inputConfig/input" -v "concat(@name,' ',@type,' ',@id,' ',@value)" -n "${es_conf}") local inputscriptdir=$(dirname "${0}") local inputscriptdir=$(cd "${inputscriptdir}" && pwd) DEVICE_TYPE=$(xmlstarlet sel --text -t -v "/inputList/inputConfig/@type" "${es_conf}") DEVICE_NAME=$(xmlstarlet sel --text -t -v "/inputList/inputConfig/@deviceName" "${es_conf}") DEVICE_GUID=$(xmlstarlet sel --text -t -v "/inputList/inputConfig/@deviceGUID" "${es_conf}") echo "Input type is '${DEVICE_TYPE}'." local module # call all configuration modules with the for module in $(find "${inputscriptdir}/configscripts/" -maxdepth 1 -name "*.sh" | sort); do source "${module}" # register functions from emulatorconfigs folder local module_id=${module##*/} local module_id=${module_id%.sh} local funcname="check_${module_id}" # call check_module to check if we should run it if fn_exists "${funcname}"; then "${funcname}" || continue fi echo "Configuring '${module_id}'" # at the start, the onstart_module function is called. funcname="onstart_${module_id}_${DEVICE_TYPE}" fn_exists "${funcname}" && "${funcname}" local input_name # loop through all buttons and use corresponding config function if it exists for input_name in "${!mapping[@]}"; do funcname="map_${module_id}_${DEVICE_TYPE}" if fn_exists "${funcname}"; then local params=(${mapping[${input_name}]}) local input_type=${params[0]} local input_id=${params[1]} local input_value=${params[2]} "${funcname}" "${input_name}" "${input_type}" "${input_id}" "${input_value}" fi done # at the end, the onend_module function is called funcname="onend_${module_id}_${DEVICE_TYPE}" fn_exists "${funcname}" && "${funcname}" done } function fn_exists() { declare -f "${1}" > /dev/null return $? } function sdl1_map() { # check if sdl1_map already exists [[ -v sdl1_map[@] ]] && return # SDL codes from https://wiki.libsdl.org/SDLKeycodeLookup mapped to /usr/include/SDL/SDL_keysym.h declare -Ag sdl1_map local i for i in {0..127}; do sdl1_map["${i}"]="${i}" done sdl1_map["1073741881"]="301" # SDLK SDLK_CAPSLOCK sdl1_map["1073741882"]="282" # SDLK SDLK_F1 sdl1_map["1073741883"]="283" # SDLK SDLK_F2 sdl1_map["1073741884"]="284" # SDLK SDLK_F3 sdl1_map["1073741885"]="285" # SDLK SDLK_F4 sdl1_map["1073741886"]="286" # SDLK SDLK_F5 sdl1_map["1073741887"]="287" # SDLK SDLK_F6 sdl1_map["1073741888"]="288" # SDLK SDLK_F7 sdl1_map["1073741889"]="289" # SDLK SDLK_F8 sdl1_map["1073741890"]="290" # SDLK SDLK_F9 sdl1_map["1073741891"]="291" # SDLK SDLK_F10 sdl1_map["1073741892"]="292" # SDLK SDLK_F11 sdl1_map["1073741893"]="293" # SDLK SDLK_F12 sdl1_map["1073741894"]="316" # SDLK SDLK_PRINTSCREEN sdl1_map["1073741895"]="302" # SDLK SDLK_SCROLLLOCK sdl1_map["1073741896"]="19" # SDLK SDLK_PAUSE sdl1_map["1073741897"]="277" # SDLK SDLK_INSERT sdl1_map["1073741898"]="278" # SDLK SDLK_HOME sdl1_map["1073741899"]="280" # SDLK SDLK_PAGEUP sdl1_map["1073741901"]="279" # SDLK SDLK_END sdl1_map["1073741902"]="281" # SDLK SDLK_PAGEDOWN sdl1_map["1073741903"]="275" # SDLK SDLK_RIGHT sdl1_map["1073741904"]="276" # SDLK SDLK_LEFT sdl1_map["1073741905"]="274" # SDLK SDLK_DOWN sdl1_map["1073741906"]="273" # SDLK SDLK_UP sdl1_map["1073741908"]="267" # SDLK SDLK_KP_DIVIDE sdl1_map["1073741909"]="268" # SDLK SDLK_KP_MULTIPLY sdl1_map["1073741910"]="269" # SDLK SDLK_KP_MINUS sdl1_map["1073741911"]="270" # SDLK SDLK_KP_PLUS sdl1_map["1073741912"]="271" # SDLK SDLK_KP_ENTER sdl1_map["1073741913"]="257" # SDLK SDLK_KP_1 sdl1_map["1073741914"]="258" # SDLK SDLK_KP_2 sdl1_map["1073741915"]="259" # SDLK SDLK_KP_3 sdl1_map["1073741916"]="260" # SDLK SDLK_KP_4 sdl1_map["1073741917"]="261" # SDLK SDLK_KP_5 sdl1_map["1073741918"]="262" # SDLK SDLK_KP_6 sdl1_map["1073741919"]="263" # SDLK SDLK_KP_7 sdl1_map["1073741920"]="264" # SDLK SDLK_KP_8 sdl1_map["1073741921"]="265" # SDLK SDLK_KP_9 sdl1_map["1073741922"]="256" # SDLK SDLK_KP_0 sdl1_map["1073741923"]="266" # SDLK SDLK_KP_PERIOD sdl1_map["1073741926"]="320" # SDLK SDLK_POWER sdl1_map["1073741927"]="272" # SDLK SDLK_KP_EQUALS sdl1_map["1073741928"]="294" # SDLK SDLK_F13 sdl1_map["1073741929"]="295" # SDLK SDLK_F14 sdl1_map["1073741930"]="296" # SDLK SDLK_F15 sdl1_map["1073741941"]="315" # SDLK SDLK_HELP sdl1_map["1073741942"]="319" # SDLK SDLK_MENU sdl1_map["1073741946"]="322" # SDLK SDLK_UNDO sdl1_map["1073741978"]="317" # SDLK SDLK_SYSREQ sdl1_map["1073742048"]="306" # SDLK SDLK_LCTRL sdl1_map["1073742049"]="304" # SDLK SDLK_LSHIFT sdl1_map["1073742050"]="308" # SDLK SDLK_LALT sdl1_map["1073742051"]="311" # SDLK SDLK_LGUI sdl1_map["1073742052"]="305" # SDLK SDLK_RCTRL sdl1_map["1073742053"]="303" # SDLK SDLK_RSHIFT sdl1_map["1073742054"]="307" # SDLK SDLK_RALT sdl1_map["1073742055"]="312" # SDLK SDLK_RGUI sdl1_map["1073742081"]="313" # SDLK SDLK_MODE } ###### main ###### home="/storage" rootdir="/storage" configdir="${rootdir}/.config" source "/usr/bin/scripts/scriptmodules/inifuncs.sh" getAutoConf "disable" || inputconfiguration ================================================ FILE: packages/sx05re/emuelec/config/emulationstation/scripts/pixel.sh ================================================ #!/bin/bash fbdev=/dev/fb0 ; width=1280 ; bpp=4 color="\x00\x00\x00\x00" #black colored function pixel() { xx=${1} ; yy=${2} printf "${color}" | dd bs=${bpp} seek=$((${yy} * ${width} + ${xx})) \ of=${fbdev} &>/dev/null } x=0 ; y=0 ; clear for i in {1..500}; do pixel $((x++)) $((y++)) done ================================================ FILE: packages/sx05re/emuelec/config/emulationstation/scripts/setvolume.sh ================================================ #!/bin/bash # Argument ${1} is the program name ${2} is the volume value (without "%") CURRENTVOL=$(pactl list sink-inputs | grep ${1} -B 20 | grep "front-left:" | cut -d "/" -f 2) pactl set-sink-input-volume $(pactl list sink-inputs | grep ${1} -B 20 | grep "#" | cut -d \# -f 2) "${2}"% ================================================ FILE: packages/sx05re/emuelec/config/emulationstation/scripts/wifi.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Helper script to activate/desactivate WLAN from command line # Usage : # wifi connect # wifi disconnect # wifi scan # wifi status ##################################################### # downloaded from : https://jira.automotivelinux.org/secure/attachment/10300/wifi ### global vars ### CONNMAN=/usr/bin/connmanctl script=$(basename "${0}") configpath=/storage/.cache/connman # connman config directory ssid="" # ssid of wifi network to reach passphrase="" # passphrase of wifi network to reach service="" # service identifier of the network service to reach fullservice="" # function error() { echo ERROR: "$@" >&2 cat << EOF >&2 Usage: ${script} connect [passphrase] ${script} disconnect [ssid] ${script} scan ${script} status EOF exit 1 } function wifi_enable() { command=$(${CONNMAN} technologies | grep -A 4 wifi | sed -n '4p') if [[ ${command} == *True ]]; then echo ">>> Wifi is already enabled ... Ok" else echo ">>> Enabling wifi ..." command=$(${CONNMAN} enable wifi) if [[ ${command} == Enabled* ]]; then echo ${command} else echo ">>> Cannot enable wifi !" exit 1 fi fi } function wifi_disable() { ${CONNMAN} disable wifi } function wifi_scan() { echo -e "\n>>> Scanning for available wifi networks..." ${CONNMAN} scan wifi } function wifi_connected() { command=$(${CONNMAN} technologies | grep -A 4 wifi | sed -n '5p') if [[ ${command} == *True ]];then echo -e "\n>>> Already connected to a wifi network" return 0 fi return 1 } function wifi_status() { echo -e "\n>>> Wifi status:" ${CONNMAN} technologies | grep -A 4 wifi echo -e "\n>>> Available SSIDs:" ${CONNMAN} services | grep wifi_ } function wifi_config() { echo -e "\n>>> Setting up wifi connection..." retries=5 while [ 1 ]; do ${CONNMAN} scan wifi echo -e "\n>>> Available SSIDs:" ${CONNMAN} services | grep wifi_ fullservice=$(${CONNMAN} services | cut -c 5- | sed 's/ \+ /:/g' | grep "${ssid}:") if [[ -n ${fullservice} ]]; then break fi retries=$(( retries - 1 )) if [[ ${retries} -gt 0 ]]; then echo "waiting for ${ssid} to appear..." sleep 5 continue fi echo "Target ssid not found !" exit 1 done ssid=$(echo "${fullservice}" | awk -F: '{print ${1}}') service=$(echo "${fullservice}" | awk -F: '{print ${2}}') echo "Target ssid found - config is :" echo "SSID : ${ssid}" echo "Service Id : ${service}" echo "Passphrase : ${passphrase}" cat <"${configpath}/${ssid}.config" [service_${service}] Name = ${ssid} Type = wifi Passphrase = ${passphrase} EOF echo "Configuration written" } function wifi_connect() { echo -e "\n>>> Performing connection ..." output=$(${CONNMAN} connect ${service}) if [[ ${output} == Connected* ]];then echo "...Ok." echo ${output} else echo "...connection failed !" echo ${output} wifi_disconnect echo "Check your SSID or your passphrase" #read -n 1 -s -r -p "Press any key to continue" exit 1 fi } function wifi_disconnect() { if [[ -z "${ssid}" ]]; then ${CONNMAN} services | cut -c5- | sed 's/ \+ /:/g' | ( while read line; do ssid=$(cut -f1 -d':' <<<${line}) serv=$(cut -f2 -d':' <<<${line}) if [[ "${serv}" =~ ^wifi_ && -f "${configpath}/${ssid}.config" ]]; then echo "Disconnecting ${serv}" ${CONNMAN} disconnect ${serv} echo "Cleaning config ${ssid}.config" rm -rf "${configpath}/${ssid}.config" fi done ) return 0 fi service=$(${CONNMAN} services | cut -c 5- | sed 's/ \+ /:/g' | grep "^${ssid}:" | awk -F: '{print ${2}}') if [[ -z "${service}" ]]; then echo "... unknown service" rm -rf "${configpath}/${ssid}.config" # clear config in all cases return 1 fi output=$(${CONNMAN} disconnect ${service}) rm -rf "${configpath}/${ssid}.config" # clear config in all cases if [[ ${output} == Disconnected* ]];then echo "...Ok." echo ${output} else echo "...disconnection failed !" echo ${output} return 1 fi } # changes made by emuELEC COPTION=${1} CSSID=${2} CPASS=${3} if [ -z "${CSSID}" ]; then # check for a file named wifi.txt on /storage/.config or /flash # read the content ssid:password and pass it as parameters to the script if [ -f "/storage/.config/wifi.txt" ]; then str=$(cat /storage/.config/wifi.txt) elif [ -f "/flash/wifi.txt" ]; then str=$(cat /flash/wifi.txt) else echo "no wifi.txt found. Make sure you create one in /storage/.config/wifi.txt and add your ssid:password inside" #read -n 1 -s -r -p "Press any key to continue" fi IFS=':' # space is set as delimiter read -ra WIFI <<< "${str}" # str is read into an array as tokens separated by IFS fi [ -z "${COPTION}" ] && COPTION="connect" [ -z "${CSSID}" ] && CSSID=${WIFI[0]} [ -z "${CPASS}" ] && CPASS=${WIFI[1]} if wifi_connected; then ssid=${CSSID} wifi_disconnect echo "WiFi disconnected" #read -n 1 -s -r -p "Press any key to continue" exit 0 fi case ${COPTION} in connect) ssid=${CSSID} passphrase=${CPASS} [ -z "${ssid}" ] && error "No ssid defined !" wifi_disconnect wifi_enable wifi_connected && exit 0 wifi_config wifi_connect ;; disconnect) ssid=${CSSID} wifi_disconnect wifi_disable ;; scan) wifi_enable wifi_scan wifi_status ;; status) wifi_status ;; connected) wifi_connected && exit 0 exit 1 ;; *) error "Command line doesn't have any option !" esac #read -n 1 -s -r -p "Press any key to continue" ================================================ FILE: packages/sx05re/emuelec/config/profile.d/99-emuelec_functions.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # you can insert any functions you want to be loaded at boot here ================================================ FILE: packages/sx05re/emuelec/config/retroarch/config/DuckStation/DuckStation.opt ================================================ duckstation_GPU.Renderer = "Software" ================================================ FILE: packages/sx05re/emuelec/config/retroarch/config/MAME/MAME.opt ================================================ mame_alternate_renderer = "disabled" mame_altres = "640x480" mame_auto_save = "disabled" mame_autoloadfastforward = "disabled" mame_boot_to_bios = "disabled" mame_boot_to_osd = "disabled" mame_buttons_profiles = "disabled" mame_cheats_enable = "disabled" mame_cpu_overclock = "default" mame_joystick_deadzone = "0.15" mame_joystick_saturation = "0.85" mame_joystick_threshold = "0.30" mame_lightgun_mode = "none" mame_lightgun_offscreen_mode = "free" mame_mame_4way_enable = "disabled" mame_mame_paths_enable = "enabled" mame_media_type = "rom" mame_mouse_enable = "enabled" mame_read_config = "enabled" mame_rotation_mode = "libretro" mame_saves = "game" mame_softlists_auto_media = "enabled" mame_softlists_enable = "enabled" mame_thread_mode = "enabled" mame_throttle = "disabled" mame_write_config = "enabled" ================================================ FILE: packages/sx05re/emuelec/config/retroarch/config/Mupen64Plus-Next GLES2/Mupen64Plus-Next GLES2.opt ================================================ mupen64plus-169screensize = "640x360" mupen64plus-43screensize = "640x480" mupen64plus-alt-map = "False" mupen64plus-aspect = "4:3" ================================================ FILE: packages/sx05re/emuelec/config/retroarch/config/Neko Project II/Neko_Project_II.opt ================================================ np2_BEEP_vol = "3" np2_clk_base = "2.4576 MHz" np2_clk_mult = "14" np2_ExMemory = "8" np2_GUI_controller = "MOUSE" np2_GUIJOY_PAS = "3" np2_jast_snd = "ON" np2_model = "VX" np2_Seek_Snd = "OFF" np2_Seek_Vol = "80" np2_skipline = "Full 255 lines" np2_SNDboard = "PC9801-86 + Chibi-Oto" np2_volume_A = "64" np2_volume_F = "64" np2_volume_P = "64" np2_volume_R = "64" np2_volume_S = "64" ================================================ FILE: packages/sx05re/emuelec/config/retroarch/config/Neko Project II kai/Neko_Project_II_kai.opt ================================================ np2kai_118ROM = "ON" np2kai_BEEP_vol = "3" np2kai_CLGD_en = "OFF" np2kai_CLGD_fc = "OFF" np2kai_CLGD_type = "PC-9821Xe10,Xa7e,Xb10 built-in" np2kai_clk_base = "2.4576 MHz" np2kai_clk_mult = "20" np2kai_cpu_feature = "Intel Pentium" np2kai_drive = "FDD2" np2kai_ExMemory = "16" np2kai_FastMC = "ON" np2kai_gdc = "uPD7220" np2kai_inputmouse = "ON" np2kai_jast_snd = "ON" np2kai_joymode = "Arrows 3button" np2kai_joynp2menu = "L2" np2kai_keyboard = "Ja" np2kai_lcd = "OFF" np2kai_model = "PC-9801VX" np2kai_PCI_bios32 = "OFF" np2kai_PCI_en = "OFF" np2kai_PCI_type = "Intel 82434LX" np2kai_PEGC = "ON" np2kai_realpal = "OFF" np2kai_Seek_Snd = "OFF" np2kai_Seek_Vol = "0" np2kai_skipline = "Full 255 lines" np2kai_SNDboard = "PC9801-86 + Mate-X PCM(B460) + Sound Blaster 16" np2kai_stick2mouse = "R-stick" np2kai_stick2mouse_shift = "R1" np2kai_usecdecc = "ON" np2kai_usefmgen = "fmgen" np2kai_uselasthddmount = "OFF" np2kai_vf1 = "OFF" np2kai_volume_A = "64" np2kai_volume_C = "128" np2kai_volume_F = "64" np2kai_volume_M = "100" np2kai_volume_P = "92" np2kai_volume_R = "64" np2kai_volume_S = "28" np2kai_xroll = "ON" ================================================ FILE: packages/sx05re/emuelec/config/retroarch/config/SwanStation/SwanStation.opt ================================================ duckstation_GPU.Renderer = "Software" ================================================ FILE: packages/sx05re/emuelec/config/retroarch/config/remappings/Flycast/Flycast.rmp ================================================ input_player1_analog_dpad_mode = "0" input_player2_analog_dpad_mode = "0" input_player3_analog_dpad_mode = "0" input_player4_analog_dpad_mode = "0" input_player5_analog_dpad_mode = "0" ================================================ FILE: packages/sx05re/emuelec/config/retroarch/config/remappings/Mupen64Plus/Mupen64Plus.rmp ================================================ input_player1_analog_dpad_mode = "0" input_player2_analog_dpad_mode = "0" input_player3_analog_dpad_mode = "0" input_player4_analog_dpad_mode = "0" ================================================ FILE: packages/sx05re/emuelec/config/retroarch/config/remappings/Mupen64Plus GLES2/Mupen64Plus GLES2.rmp ================================================ input_player1_analog_dpad_mode = "0" input_player2_analog_dpad_mode = "0" input_player3_analog_dpad_mode = "0" input_player4_analog_dpad_mode = "0" ================================================ FILE: packages/sx05re/emuelec/config/retroarch/config/remappings/Mupen64Plus-Next/Mupen64Plus-Next.rmp ================================================ input_player1_analog_dpad_mode = "0" input_player2_analog_dpad_mode = "0" input_player3_analog_dpad_mode = "0" input_player4_analog_dpad_mode = "0" ================================================ FILE: packages/sx05re/emuelec/config/retroarch/config/remappings/Mupen64Plus-Next GLES2/Mupen64Plus-Next GLES2.rmp ================================================ input_player1_analog_dpad_mode = "0" input_player2_analog_dpad_mode = "0" input_player3_analog_dpad_mode = "0" input_player4_analog_dpad_mode = "0" input_player5_analog_dpad_mode = "0" ================================================ FILE: packages/sx05re/emuelec/config/retroarch/config/remappings/ParaLLEl N64/ParaLLEl N64.rmp ================================================ input_player1_analog_dpad_mode = "0" input_player2_analog_dpad_mode = "0" input_player3_analog_dpad_mode = "0" input_player4_analog_dpad_mode = "0" input_player5_analog_dpad_mode = "0" ================================================ FILE: packages/sx05re/emuelec/config/retroarch/retroarch-core-options.cfg ================================================ reicast_threaded_rendering = "enabled" parallel-n64-gfxplugin = "rice" parallel-n64-gfxplugin-accuracy = "high" parallel-n64-screensize = "320x240" mame2003-plus_analog = "digital" px68k_save_fdd_path = "disabled" px68k_save_hdd_path = "disabled" ================================================ FILE: packages/sx05re/emuelec/config/system.d/storage-roms.mount.sample ================================================ [Unit] Description=Mounting EmuELEC ROMS on samba Requires=network-online.service After=network-online.service Before=emustation.service [Mount] What=//DOMAIN_OR_IP/roms/ Where=/storage/roms # The following option might not be required if your CIFS/SAMBA share is shared publicly without requiring any credentials) # NOTE: if you are using windows 10 and have problems accessing your shares try adding ,vers=3.0 after the password Options=username=YOURUSERNAME,password=YOURPASSWORD # NOTE 2: You could also try this if you are using a guest account and can't mount: #Options=rw,vers=3.0,iocharset=utf8,username=guest Type=cifs [Install] WantedBy=multi-user.target ================================================ FILE: packages/sx05re/emuelec/config/system.d/storage-roms.mount.sample.nfs ================================================ # This is a sample service script to mount NFS shares. # Please read carefully the comments in this file. For production usage # you can remove all comments (lines beginning with "#") from this file. [Unit] # The description should be used to explain what this servicefile is for Description=test nfs mount script # if we do network mounts like here we *require* 'network-online.service' # which checks if the network is online Requires=network-online.service # our scripts must start *after* 'network-online.service', on timeout and if # 'network-online.service' fails we can not mount and this scripts fails too After=network-online.service # usually we mount networks shares because we want they avaible *before* XBMC starts. # so XBMC has access to this mounts from beginning. Note: this slows down the boot! Before=emustation.service [Mount] # The share we want mount What=192.168.0.31:/roms # Where we want mount this share Where=/storage/roms # Any options you usually use with the "-o" parameter in the mount command Options= # filesystem type Type=nfs [Install] # The target is used by 'systemctl enable ' to link # this service to a runlevel for starting on boot. usually 'multi-user.target' # is ok here. WantedBy=multi-user.target # Important: # this file must be renamed to .mount where , is the FULL path # where the share will be mounted but slashes "/" MUST BE REPLACED with dashes "-" with .mount # as extension. # This means, if we want mount to "/storage/roms" (see above "Where=/storage/roms") # then this file must be renamed to 'storage-roms.mount' and can be enabled via ssh with the # command 'systemctl enable storage-roms.mount' ================================================ FILE: packages/sx05re/emuelec/gamepads/8BitDo SN30 pro.cfg ================================================ input_device = "8BitDo SN30 pro" input_driver = "udev" input_vendor_id = "1406" input_product_id = "8201" input_r_y_plus_axis = "+3" input_l3_btn = "10" input_r_x_minus_axis = "-2" input_l_btn = "4" input_load_state_btn = "4" input_start_btn = "9" input_exit_emulator_btn = "9" input_l_y_minus_axis = "-1" input_up_btn = "h0up" input_volume_up_btn = "h0up" input_r_y_minus_axis = "-3" input_a_btn = "1" input_b_btn = "0" input_reset_btn = "0" input_enable_hotkey_btn = "13" input_down_btn = "h0down" input_volume_down_btn = "h0down" input_l_x_plus_axis = "+0" input_l_y_plus_axis = "+1" input_r_btn = "5" input_save_state_btn = "5" input_r2_btn = "7" input_hold_fast_forward_btn = "7" input_r3_btn = "11" input_fps_toggle_btn = "11" input_right_btn = "h0right" input_state_slot_increase_btn = "h0right" input_x_btn = "3" input_menu_toggle_btn = "3" input_select_btn = "8" input_l_x_minus_axis = "-0" input_y_btn = "2" input_left_btn = "h0left" input_state_slot_decrease_btn = "h0left" input_r_x_plus_axis = "+2" input_l2_btn = "6" input_rewind_btn = "6" ================================================ FILE: packages/sx05re/emuelec/gamepads/GO-Advance Gamepad (rev 1.1).cfg ================================================ input_device = "GO-Advance Gamepad (rev 1.1)" input_driver = "udev" input_l3_btn = "13" input_l_btn = "4" input_load_state_btn = "4" input_start_btn = "17" input_exit_emulator_btn = "17" input_l_y_minus_axis = "-1" input_up_btn = "8" input_volume_up_btn = "8" input_a_btn = "1" input_b_btn = "0" input_reset_btn = "0" input_enable_hotkey_btn = "12" input_down_btn = "9" input_volume_down_btn = "9" input_l_x_plus_axis = "+0" input_l_y_plus_axis = "+1" input_r_btn = "5" input_save_state_btn = "5" input_r2_btn = "7" input_toggle_fast_forward_btn = "7" input_r3_btn = "16" input_fps_toggle_btn = "16" input_right_btn = "11" input_state_slot_increase_btn = "11" input_x_btn = "2" input_menu_toggle_btn = "2" input_select_btn = "12" input_l_x_minus_axis = "-0" input_y_btn = "3" input_left_btn = "10" input_state_slot_decrease_btn = "10" input_l2_btn = "6" input_rewind_btn = "6" ================================================ FILE: packages/sx05re/emuelec/gamepads/GO-Advance Gamepad (rev 1.1)_vertical.cfg ================================================ input_device = "GO-Advance Gamepad (rev 1.1)" input_driver = "udev" input_l3_btn = "13" input_l_btn = "4" input_load_state_btn = "4" input_start_btn = "17" input_exit_emulator_btn = "17" input_l_y_minus_axis = "+0" input_up_btn = "11" input_volume_up_btn = "8" input_a_btn = "1" input_b_btn = "0" input_reset_btn = "0" input_enable_hotkey_btn = "12" input_down_btn = "10" input_volume_down_btn = "9" input_l_x_plus_axis = "+1" input_l_y_plus_axis = "-0" input_r_btn = "5" input_save_state_btn = "5" input_r2_btn = "7" input_toggle_fast_forward_btn = "7" input_r3_btn = "16" input_fps_toggle_btn = "16" input_right_btn = "9" input_state_slot_increase_btn = "11" input_x_btn = "2" input_menu_toggle_btn = "2" input_select_btn = "12" input_l_x_minus_axis = "-1" input_y_btn = "3" input_left_btn = "8" input_state_slot_decrease_btn = "10" input_l2_btn = "6" input_rewind_btn = "6" ================================================ FILE: packages/sx05re/emuelec/gamepads/GO-Advance Gamepad.cfg ================================================ input_device = "GO-Advance Gamepad" input_driver = "udev" input_l3_btn = "12" input_l_btn = "4" input_load_state_btn = "4" input_start_btn = "15" input_exit_emulator_btn = "15" input_l_y_minus_axis = "-1" input_up_btn = "6" input_volume_up_btn = "6" input_a_btn = "1" input_b_btn = "0" input_reset_btn = "0" input_enable_hotkey_btn = "10" input_down_btn = "7" input_volume_down_btn = "7" input_l_x_plus_axis = "+0" input_l_y_plus_axis = "+1" input_r_btn = "5" input_save_state_btn = "5" input_r2_btn = "14" input_toggle_fast_forward_btn = "14" input_r3_btn = "13" input_fps_toggle_btn = "13" input_right_btn = "9" input_state_slot_increase_btn = "9" input_x_btn = "2" input_menu_toggle_btn = "2" input_select_btn = "10" input_l_x_minus_axis = "-0" input_y_btn = "3" input_left_btn = "8" input_state_slot_decrease_btn = "8" input_l2_btn = "11" input_rewind_btn = "11" ================================================ FILE: packages/sx05re/emuelec/gamepads/GO-Advance Gamepad_vertical.cfg ================================================ input_device = "GO-Advance Gamepad" input_driver = "udev" input_l3_btn = "12" input_l_btn = "4" input_load_state_btn = "4" input_start_btn = "15" input_exit_emulator_btn = "15" input_l_y_minus_axis = "+0" input_up_btn = "9" input_volume_up_btn = "6" input_a_btn = "1" input_b_btn = "0" input_reset_btn = "0" input_enable_hotkey_btn = "10" input_down_btn = "8" input_volume_down_btn = "7" input_l_x_plus_axis = "+1" input_l_y_plus_axis = "-0" input_r_btn = "5" input_save_state_btn = "5" input_r2_btn = "14" input_toggle_fast_forward_btn = "14" input_r3_btn = "13" input_fps_toggle_btn = "13" input_right_btn = "7" input_state_slot_increase_btn = "9" input_x_btn = "2" input_menu_toggle_btn = "2" input_select_btn = "10" input_l_x_minus_axis = "-1" input_y_btn = "3" input_left_btn = "6" input_state_slot_decrease_btn = "8" input_l2_btn = "11" input_rewind_btn = "11" ================================================ FILE: packages/sx05re/emuelec/gamepads/GO-Super Gamepad.cfg ================================================ input_device = "GO-Super Gamepad" input_driver = "udev" input_vendor_id = "0" input_product_id = "0" input_r_y_plus_axis = "+3" input_l3_btn = "14" input_r_x_minus_axis = "-2" input_l_btn = "4" input_load_state_btn = "4" input_start_btn = "13" input_exit_emulator_btn = "13" input_l_y_minus_axis = "-1" input_up_btn = "8" input_volume_up_btn = "8" input_r_y_minus_axis = "-3" input_a_btn = "1" input_b_btn = "0" input_reset_btn = "0" input_enable_hotkey_btn = "15" input_down_btn = "9" input_volume_down_btn = "9" input_l_x_plus_axis = "+0" input_l_y_plus_axis = "+1" input_r_btn = "5" input_save_state_btn = "5" input_r2_btn = "7" input_toggle_fast_forward_btn = "7" input_r3_btn = "17" input_fps_toggle_btn = "17" input_right_btn = "11" input_state_slot_increase_btn = "11" input_x_btn = "2" input_menu_toggle_btn = "2" input_select_btn = "12" input_l_x_minus_axis = "-0" input_y_btn = "3" input_left_btn = "10" input_state_slot_decrease_btn = "10" input_r_x_plus_axis = "+2" input_l2_btn = "6" input_rewind_btn = "6" ================================================ FILE: packages/sx05re/emuelec/gamepads/GO-Super Gamepad_vertical.cfg ================================================ input_device = "GO-Super Gamepad" input_driver = "udev" input_vendor_id = "0" input_product_id = "0" input_r_y_plus_axis = "-0" input_r_y_minus_axis = "+0" input_r_x_minus_axis = "+1" input_r_x_plus_axis = "-1" input_l_x_plus_axis = "-3" input_l_y_plus_axis = "+2" input_l_y_minus_axis = "-2" input_l_x_minus_axis = "+3" input_l3_btn = "14" input_l_btn = "4" input_load_state_btn = "4" input_start_btn = "13" input_exit_emulator_btn = "13" input_up_btn = "8" input_volume_up_btn = "8" input_a_btn = "2" input_b_btn = "1" input_reset_btn = "0" input_enable_hotkey_btn = "15" input_down_btn = "9" input_volume_down_btn = "9" input_r_btn = "5" input_save_state_btn = "5" input_r2_btn = "7" input_toggle_fast_forward_btn = "7" input_r3_btn = "17" input_fps_toggle_btn = "17" input_right_btn = "11" input_state_slot_increase_btn = "11" input_x_btn = "3" input_menu_toggle_btn = "2" input_select_btn = "12" input_y_btn = "0" input_left_btn = "10" input_state_slot_decrease_btn = "10" input_l2_btn = "6" input_rewind_btn = "6" ================================================ FILE: packages/sx05re/emuelec/gamepads/GZ RX CO.,LTD. RX Gamepad.cfg ================================================ input_device = "GZ RX CO.,LTD. RX Gamepad" input_driver = "udev" input_l_btn = "3" input_load_state_btn = "3" input_start_btn = "9" input_exit_emulator_btn = "9" input_up_btn = "h0up" input_volume_up_btn_btn = "h0up" input_a_btn = "4" input_b_btn = "0" input_reset_btn = "0" input_enable_hotkey_btn = "11" input_down_btn = "h0down" input_volume_down_btn_btn = "h0down" input_r_btn = "6" input_save_state_btn = "6" input_right_btn = "h0right" input_state_slot_increase_btn = "h0right" input_x_btn = "1" input_menu_toggle_btn = "1" input_select_btn = "10" input_y_btn = "2" input_left_btn = "h0left" input_state_slot_decrease_btn = "h0left" ================================================ FILE: packages/sx05re/emuelec/gamepads/Google LLC Stadia Controller rev. A.cfg ================================================ input_device = "Google LLC Stadia Controller rev. A" input_driver = "udev" input_vendor_id = "6353" input_product_id = "37888" input_r_y_plus_axis = "+3" input_l3_btn = "9" input_r_x_minus_axis = "-2" input_l_btn = "4" input_load_state_btn = "4" input_start_btn = "7" input_exit_emulator_btn = "7" input_l_y_minus_axis = "-1" input_up_btn = "h0up" input_volume_up_btn = "h0up" input_r_y_minus_axis = "-3" input_a_btn = "1" input_b_btn = "0" input_reset_btn = "0" input_enable_hotkey_btn = "8" input_down_btn = "h0down" input_volume_down_btn = "h0down" input_l_x_plus_axis = "+0" input_l_y_plus_axis = "+1" input_r_btn = "5" input_save_state_btn = "5" input_r2_btn = "13" input_toggle_fast_forward_btn = "13" input_r3_btn = "10" input_fps_toggle_btn = "10" input_right_btn = "h0right" input_state_slot_increase_btn = "h0right" input_x_btn = "3" input_menu_toggle_btn = "3" input_select_btn = "6" input_l_x_minus_axis = "-0" input_y_btn = "2" input_left_btn = "h0left" input_state_slot_decrease_btn = "h0left" input_r_x_plus_axis = "+2" input_l2_btn = "14" input_rewind_btn = "14" ================================================ FILE: packages/sx05re/emuelec/gamepads/HORI CO.,LTD. HORIPAD S.cfg ================================================ input_device = "HORI CO.,LTD. HORIPAD S" input_driver = "udev" input_vendor_id = "3853" input_product_id = "193" input_r_y_plus_axis = "+3" input_l3_btn = "10" input_r_x_minus_axis = "-2" input_l_btn = "4" input_load_state_btn = "4" input_start_btn = "9" input_exit_emulator_btn = "9" input_l_y_minus_axis = "-1" input_up_btn = "h0up" input_volume_up_btn = "h0up" input_r_y_minus_axis = "-3" input_a_btn = "2" input_b_btn = "1" input_reset_btn = "1" input_enable_hotkey_btn = "13" input_down_btn = "h0down" input_volume_down_btn = "h0down" input_l_x_plus_axis = "+0" input_l_y_plus_axis = "+1" input_r_btn = "5" input_save_state_btn = "5" input_r2_btn = "7" input_toggle_fast_forward_btn = "7" input_r3_btn = "11" input_fps_toggle_btn = "11" input_right_btn = "h0right" input_state_slot_increase_btn = "h0right" input_x_btn = "3" input_menu_toggle_btn = "3" input_select_btn = "8" input_l_x_minus_axis = "-0" input_y_btn = "0" input_left_btn = "h0left" input_state_slot_decrease_btn = "h0left" input_r_x_plus_axis = "+2" input_l2_btn = "6" input_rewind_btn = "6" ================================================ FILE: packages/sx05re/emuelec/gamepads/Logitech Gamepad F310.cfg ================================================ input_device = "Logitech Gamepad F310" input_driver = "udev" input_r_y_plus_axis = "+4" input_l3_btn = "9" input_r_x_minus_axis = "-3" input_l_btn = "4" input_load_state_btn = "4" input_start_btn = "7" input_exit_emulator_btn = "7" input_l_y_minus_axis = "-1" input_up_btn = "h0up" input_volume_up_btn = "h0up" input_r_y_minus_axis = "-4" input_a_btn = "1" input_b_btn = "0" input_reset_btn = "0" input_enable_hotkey_btn = "8" input_down_btn = "h0down" input_volume_down_btn = "h0down" input_l_x_plus_axis = "+0" input_l_y_plus_axis = "+1" input_r_btn = "5" input_save_state_btn = "5" input_r2_axis = "+5" input_toggle_fast_forward_axis = "+5" input_r3_btn = "10" input_fps_toggle_btn = "10" input_right_btn = "h0right" input_state_slot_increase_btn = "h0right" input_x_btn = "3" input_menu_toggle_btn = "3" input_select_btn = "6" input_l_x_minus_axis = "-0" input_y_btn = "2" input_left_btn = "h0left" input_state_slot_decrease_btn = "h0left" input_r_x_plus_axis = "+3" input_l2_axis = "+2" input_rewind_axis = "+2" ================================================ FILE: packages/sx05re/emuelec/gamepads/PlayGame PS2.cfg ================================================ input_device - "PlayGame PS2-like Controller" input_driver = "udev" input_vendor_id = "2064" input_product_id = "1" input_r_y_plus_axis = "+2" input_l3_btn = "10" input_r_x_minus_axis = "-3" input_l_btn = "4" input_load_state_btn = "4" input_start_btn = "9" input_exit_emulator_btn = "9" input_l_y_minus_axis = "-1" input_up_btn = "h0up" input_volume_up_btn = "h0up" input_r_y_minus_axis = "-2" input_a_btn = "1" input_b_btn = "2" input_reset_btn = "2" input_enable_hotkey_btn = "8" input_down_btn = "h0down" input_volume_down_btn = "h0down" input_l_x_plus_axis = "+0" input_l_y_plus_axis = "+1" input_r_btn = "5" input_save_state_btn = "5" input_r2_btn = "7" input_hold_fast_forward_btn = "7" input_r3_btn = "11" input_fps_toggle_btn = "11" input_right_btn = "h0right" input_state_slot_increase_btn = "h0right" input_x_btn = "0" input_menu_toggle_btn = "0" input_select_btn = "8" input_l_x_minus_axis = "-0" input_y_btn = "3" input_left_btn = "h0left" input_state_slot_decrease_btn = "h0left" input_r_x_plus_axis = "+3" input_l2_btn = "6" input_rewind_btn = "6" ================================================ FILE: packages/sx05re/emuelec/gamepads/Sony Interactive Entertainment Wireless Controller.cfg ================================================ input_device = "Sony Interactive Entertainment Wireless Controller" input_driver = "udev" input_r_y_plus_axis = "+5" input_l3_btn = "10" input_r_x_minus_axis = "-2" input_l_btn = "4" input_load_state_btn = "4" input_start_btn = "9" input_exit_emulator_btn = "9" input_l_y_minus_axis = "-1" input_up_btn = "h0up" input_volume_up_btn_btn = "h0up" input_r_y_minus_axis = "-5" input_a_btn = "2" input_b_btn = "1" input_reset_btn = "1" input_enable_hotkey_btn = "12" input_down_btn = "h0down" input_volume_down_btn_btn = "h0down" input_l_x_plus_axis = "+0" input_l_y_plus_axis = "+1" input_r_btn = "5" input_save_state_btn = "5" input_r2_btn = "7" input_toggle_fast_forward_btn = "7" input_r3_btn = "11" input_fps_toggle_btn = "11" input_right_btn = "h0right" input_state_slot_increase_btn = "h0right" input_x_btn = "3" input_menu_toggle_btn = "3" input_select_btn = "8" input_l_x_minus_axis = "-0" input_y_btn = "0" input_left_btn = "h0left" input_state_slot_decrease_btn = "h0left" input_r_x_plus_axis = "+2" input_l2_btn = "6" input_rewind_btn = "6" ================================================ FILE: packages/sx05re/emuelec/gamepads/Sony PLAYSTATION(R)3 Controller.cfg ================================================ input_device = "Sony PLAYSTATION(R)3 Controller" input_driver = "udev" input_vendor_id = "1356" input_product_id = "616" input_r_y_plus_axis = "+4" input_left_btn = "15" input_state_slot_decrease_btn = "15" input_r_x_minus_axis = "-3" input_right_btn = "16" input_state_slot_increase_btn = "16" input_r_btn = "5" input_save_state_btn = "5" input_down_btn = "14" input_volume_down_btn = "14" input_r_y_minus_axis = "-4" input_l_btn = "4" input_load_state_btn = "4" input_r_x_plus_axis = "+3" input_y_btn = "3" input_x_btn = "2" input_menu_toggle_btn = "2" input_b_btn = "0" input_reset_btn = "0" input_a_btn = "1" input_up_btn = "13" input_volume_up_btn = "13" input_select_btn = "8" input_l3_btn = "11" input_start_btn = "9" input_exit_emulator_btn = "9" input_l_x_plus_axis = "+0" input_l_y_minus_axis = "-1" input_enable_hotkey_btn = "8" input_l2_axis = "+2" input_rewind_axis = "+2" input_r2_axis = "+5" input_toggle_fast_forward_axis = "+5" input_l_y_plus_axis = "+1" input_r3_btn = "12" input_fps_toggle_btn = "12" input_l_x_minus_axis = "-0" ================================================ FILE: packages/sx05re/emuelec/gamepads/Xbox 360 Controller.cfg ================================================ input_device = "Xbox 360 Controller" input_driver = "udev" input_vendor_id = "1118" input_product_id = "654" input_r_y_plus_axis = "+4" input_left_btn = "h0left" input_state_slot_decrease_btn = "h0left" input_r_x_minus_axis = "-3" input_right_btn = "h0right" input_state_slot_increase_btn = "h0right" input_r_btn = "5" input_save_state_btn = "5" input_down_btn = "h0down" input_volume_down_btn = "h0down" input_r_y_minus_axis = "-4" input_l_btn = "4" input_load_state_btn = "4" input_r_x_plus_axis = "+3" input_y_btn = "2" input_x_btn = "3" input_menu_toggle_btn = "3" input_b_btn = "0" input_reset_btn = "0" input_a_btn = "1" input_up_btn = "h0up" input_volume_up_btn = "h0up" input_select_btn = "6" input_l3_btn = "9" input_start_btn = "7" input_exit_emulator_btn = "7" input_l_x_plus_axis = "+0" input_l_y_minus_axis = "-1" input_enable_hotkey_btn = "8" input_l2_axis = "+2" input_rewind_axis = "+2" input_r2_axis = "+5" input_toggle_fast_forward_axis = "+5" input_l_y_plus_axis = "+1" input_r3_btn = "10" input_fps_toggle_btn = "10" input_l_x_minus_axis = "-0" ================================================ FILE: packages/sx05re/emuelec/gamepads/gameforce_gamepad.cfg ================================================ # GameForce Handheld # Configuration for the built-in controller. # # How to: https://gameforce.fun/pages/how-to-use ### Controls # General input_driver = "udev" input_device = "gameforce_gamepad" input_device_display_name="GameForce Handheld Controller" input_vendor_id = "3" input_product_id = "3" # D-Pad input_up_btn = "10" input_down_btn = "11" input_left_btn = "12" input_right_btn = "13" # Face buttons input_a_btn = "1" input_b_btn = "0" input_x_btn = "2" input_y_btn = "3" # Shoulders & triggers input_l_btn = "4" input_r_btn = "5" input_l2_btn = "6" input_r2_btn = "7" # Analog sticks input_l_y_minus_axis = "-0" input_l_y_plus_axis = "+0" input_l_x_minus_axis = "-1" input_l_x_plus_axis = "+1" input_r_y_minus_axis = "-2" input_r_y_plus_axis = "+2" input_r_x_minus_axis = "-3" input_r_x_plus_axis = "+3" # Bottom row input_l3_btn = "14" input_r3_btn = "15" input_select_btn = "8" input_start_btn = "9" # Hotkey actions input_enable_hotkey_btn = "16" input_reset_btn = "0" input_menu_toggle_btn = "2" input_exit_emulator_btn = "9" input_load_state_btn = "4" input_save_state_btn = "5" input_rewind_btn = "6" input_toggle_fast_forward_btn = "7" input_volume_up_btn = "10" input_volume_down_btn = "11" input_state_slot_decrease_btn = "12" input_state_slot_increase_btn = "13" input_fps_toggle_btn = "15" ### Labels # D-Pad input_up_btn_label = "D-Pad Up" input_down_btn_label = "D-Pad Down" input_left_btn_label = "D-Pad Left" input_right_btn_label = "D-Pad Right" # Face buttons input_a_btn_label = "A" input_b_btn_label = "B" input_x_btn_label = "X" input_y_btn_label = "Y" # Shoulders & triggers input_l_btn_label = "L1" input_r_btn_label = "R1" input_l2_btn_label = "L2" input_r2_btn_label = "R2" # Analog sticks input_l_y_minus_axis_label = "Left Analog Up" input_l_y_plus_axis_label = "Left Analog Down" input_l_x_minus_axis_label = "Left Analog Left" input_l_x_plus_axis_label = "Left Analog Right" input_r_y_minus_axis_label = "Right Analog Up" input_r_y_plus_axis_label = "Right Analog Down" input_r_x_minus_axis_label = "Right Analog Left" input_r_x_plus_axis_label = "Right Analog Right" # Bottom row input_l3_btn_label = "G1" input_r3_btn_label = "G2" input_start_btn_label = "Start" input_select_btn_label = "Select" # Hotkey actions input_enable_hotkey_btn_label = "HK" input_reset_btn_label = "B" input_menu_toggle_btn_label = "X" input_exit_emulator_btn_label = "Start" input_load_state_btn_label = "L1" input_save_state_btn_label = "R1" input_rewind_btn_label = "L2" input_toggle_fast_forward_btn_label = "R2" input_volume_up_btn_label = "D-Pad Up" input_volume_down_btn_label = "D-Pad Down" input_state_slot_decrease_btn_label = "D-Pad Left" input_state_slot_increase_btn_label = "D-Pad Right" input_fps_toggle_btn_label = "G2" ================================================ FILE: packages/sx05re/emuelec/gamepads/iNNEXT SNES.cfg ================================================ input_device = "iNNEXT SNES Retro USB Controller" input_driver = "udev" input_vendor_id = "121" input_product_id = "17" input_l_btn = "4" input_load_state_btn = "4" input_start_btn = "9" input_exit_emulator_btn = "9" input_up_axis = "-1" input_volume_up_axis = "-1" input_a_btn = "1" input_b_btn = "2" input_reset_btn = "2" input_enable_hotkey_btn = "8" input_down_axis = "+1" input_volume_down_axis = "+1" input_r_btn = "5" input_save_state_btn = "5" input_right_axis = "+0" input_state_slot_increase_axis = "+0" input_x_btn = "0" input_menu_toggle_btn = "0" input_select_btn = "8" input_y_btn = "3" input_left_axis = "-0" input_state_slot_decrease_axis = "-0" ================================================ FILE: packages/sx05re/emuelec/overlay/bezels/default.cfg ================================================ overlays = 1 overlay0_overlay = EmuELEC-1080.png overlay0_full_screen = true overlay0_descs = 0 ================================================ FILE: packages/sx05re/emuelec/overlay/emuelec/scanlines_single_1920x1080.cfg ================================================ overlays = 1 overlay0_overlay = scanlines_single_1920x1080.png overlay0_full_screen = true overlay0_descs = 0 ================================================ FILE: packages/sx05re/emuelec/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="emuelec" PKG_LICENSE="GPLv2" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain ${OPENGLES} emuelec-emulationstation retroarch" PKG_SECTION="emuelec" PKG_LONGDESC="EmuELEC Meta Package" PKG_TOOLCHAIN="manual" PKG_EXPERIMENTAL="nestopiaCV quasi88 xmil np2kai hypseus-singe yabasanshiroSA_1_11 yabasanshiroSA_1_5 fbneoSA same_cdi ikemen-go" PKG_EMUS="${LIBRETRO_CORES} desmume melonds advancemame PPSSPPSDL amiberry amiberry-lite hatarisa openbor dosbox-staging mupen64plus-nx mupen64plus-nx-alt scummvmsa stellasa solarus dosbox-pure pcsx_rearmed ecwolf potator freej2me duckstation flycastsa fmsx-libretro jzintv mupen64plussa xroar x16 simcoupe ti99sim oricutron eka2l1 bigpemu biginstinct" PKG_DEPENDS_TARGET+=" emuelec-tools ${PKG_EMUS} ${PKG_EXPERIMENTAL}" # These packages are only meant for S922x, S905x2 and A311D devices as they run poorly on S905" if [ "${DEVICE}" == "Amlogic-ng" ] || [ "${DEVICE}" == "Amlogic-no" ] || [ "${DEVICE}" == "RK356x" ] || [ "${DEVICE}" == "OdroidM1" ]; then PKG_DEPENDS_TARGET+=" ${LIBRETRO_S922X_CORES}" fi if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then PKG_DEPENDS_TARGET+=" kmscon odroidgoa-utils" #we disable some cores that are not working or work poorly on OGA for discore in duckstation mesen-s virtualjaguar quicknes MC; do PKG_DEPENDS_TARGET=$(echo ${PKG_DEPENDS_TARGET} | sed "s|${discore} | |") done PKG_DEPENDS_TARGET+=" yabasanshiro" else PKG_DEPENDS_TARGET+=" fbterm" fi # These cores do not work, or are not needed on aarch64, this package needs cleanup :) if [ "${ARCH}" == "aarch64" ]; then for discore in quicknes parallel-n64 pcsx_rearmed; do PKG_DEPENDS_TARGET=$(echo ${PKG_DEPENDS_TARGET} | sed "s|${discore}| |") done PKG_DEPENDS_TARGET+=" swanstation \ lib32-essential \ lib32-retroarch \ emuelec-32bit-info \ lib32-flycast \ lib32-mupen64plus \ lib32-pcsx_rearmed \ lib32-uae4arm \ lib32-parallel-n64 \ lib32-bennugd-monolithic \ lib32-droidports \ lib32-box86 \ lib32-libusb" if [ "${DEVICE}" == "Amlogic-ng" ] || [ "${DEVICE}" == "Amlogic-no" ] || [ "${DEVICE}" == "RK356x" ] || [ "${DEVICE}" == "OdroidM1" ]; then PKG_DEPENDS_TARGET+=" dolphinSA" fi if [ "${DEVICE}" == "Amlogic-old" ]; then #we disable some cores that are not working or work poorly on Amlogic-old for discore in yabasanshiroSA_1_11 yabasanshiroSA_1_5 yabasanshiro same_cdi duckstation; do PKG_DEPENDS_TARGET=$(echo ${PKG_DEPENDS_TARGET} | sed "s|${discore} | |") done fi fi # We make sure MAME is the last package from EE to be built. if [ "${DEVICE}" == "Amlogic-ng" ] || [ "${DEVICE}" == "Amlogic-no" ] || [ "${DEVICE}" == "RK356x" ] || [ "${DEVICE}" == "OdroidM1" ]; then PKG_DEPENDS_TARGET+=" mame" fi # These packages do not yet compile for OdroidM1 if [ "${DEVICE}" == "RK356x" ] || [ "${DEVICE}" == "OdroidM1" ]; then for discore in flycast-dojo; do PKG_DEPENDS_TARGET=$(echo ${PKG_DEPENDS_TARGET} | sed "s|${discore}| |") done fi makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -rf ${PKG_DIR}/bin ${INSTALL}/usr mkdir -p ${INSTALL}/usr/config/ cp -rf ${PKG_DIR}/config/* ${INSTALL}/usr/config/ ln -sf /storage/.config/emuelec ${INSTALL}/emuelec # Added for compatibility with portmaster ln -sf /storage/roms ${INSTALL}/roms ln -sf /storage/roms/ports/PortMaster ${INSTALL}/PortMaster mkdir -p ${INSTALL}/usr/bin/ports touch ${INSTALL}/usr/bin/ports/.ports_here find ${INSTALL}/usr/config/emuelec/ -type f -exec chmod o+x {} \; mkdir -p ${INSTALL}/usr/config/emuelec/logs ln -sf /var/log ${INSTALL}/usr/config/emuelec/logs/var-log # leave for compatibility if [ "${DEVICE}" == "Amlogic-old" ]; then echo "s905" > ${INSTALL}/ee_s905 fi echo "${DEVICE}" > ${INSTALL}/ee_arch mkdir -p ${INSTALL}/usr/share/retroarch-overlays cp -r ${PKG_DIR}/overlay/* ${INSTALL}/usr/share/retroarch-overlays mkdir -p ${INSTALL}/usr/share/common-shaders cp -r ${PKG_DIR}/shaders/* ${INSTALL}/usr/share/common-shaders mkdir -p ${INSTALL}/usr/share/libretro-database touch ${INSTALL}/usr/share/libretro-database/dummy } post_install() { for i in borders effects gamepads ipad keyboards misc; do rm -rf "${INSTALL}/usr/share/retroarch-overlays/${i}" done mkdir -p ${INSTALL}/etc/retroarch-joypad-autoconfig cp -r ${PKG_DIR}/gamepads/* ${INSTALL}/etc/retroarch-joypad-autoconfig # link default.target to emuelec.target ln -sf emuelec.target ${INSTALL}/usr/lib/systemd/system/default.target enable_service emuelec-autostart.service enable_service emuelec-disable_small_cores.service enable_service emuelec-reboot.service enable_service emuelec-shutdown.service # Remove scripts from OdroidGoAdvance build if [[ ${DEVICE} == "OdroidGoAdvance" || "${DEVICE}" == "GameForce" ]]; then for i in "wifi" "sselphs_scraper" "skyscraper" "system_info"; do xmlstarlet ed -L -P -d "/gameList/game[name='${i}']" ${INSTALL}/usr/bin/scripts/setup/gamelist.xml rm "${INSTALL}/usr/bin/scripts/setup/${i}.sh" done fi # For automatic updates we use the buildate date +"%m%d%Y" > ${INSTALL}/usr/buildate ln -sf /storage/roms ${INSTALL}/roms # We make sure all files in /usr/bin are executables find ${INSTALL}/usr/bin -type f -exec chmod +x {} \; } ================================================ FILE: packages/sx05re/emuelec/profile.d/99-emuelec.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) export LD_LIBRARY_PATH="/emuelec/lib:/emuelec/lib32:${LD_LIBRARY_PATH}" export PATH="/emuelec/scripts:/emuelec/bin:/usr/bin/batocera:/storage/roms/bios/jdk/bin/:${PATH}" export JAVA_HOME="/storage/roms/bios/jdk/bin/java" export SDL_GAMECONTROLLERCONFIG_FILE="/storage/.config/SDL-GameControllerDB/gamecontrollerdb.txt" export EMUELEC="【ツ】" EE_DIR="/storage/.config/emuelec" EE_CONF="${EE_DIR}/configs/emuelec.conf" ES_CONF="/storage/.emulationstation/es_settings.cfg" EE_DEVICE=$(cat /ee_arch) EE_LOG="/emuelec/logs/emuelec.log" RA_CONF="/storage/.config/retroarch/retroarch.cfg" RR_CONF="/emuelec/configs/retrorun.cfg" set_ra_setting() { ees -s "${1}" -v "${2}" } get_ra_setting() { ees -r "${1}" } set_rr_setting() { ees -s "${1}" -v "${2}" -o ${RR_CONF} } get_rr_setting() { ees -r "${1}" -o ${RR_CONF} } shutdown() { echo "enabling small cores" /usr/bin/emuelec-utils small-cores enable command shutdown $@ } reboot() { echo "enabling small cores" /usr/bin/emuelec-utils small-cores enable command reboot $@ } get_resolution() { # This will return the current video resolution echo $( fbset | grep geometry | cut -d$' ' -f2-3 ) } aml_ver() { # Returns the Amlogic SOC version if grep -q "Gxl" /proc/device-tree/compatible; then echo "Amlogic" elif grep -q "s4" /proc/device-tree/compatible; then echo "Amlogic-no" else echo "Amlogic-ng" fi } if [ "${EE_DEVICE}" == "Amlogic-ng" ]; then EE_DEVICE=$(aml_ver) fi get_config_value() { # Argument ${1} is the config file name. # Argument ${2} is the config name for the value you want. # Returns config value for the specified name. # Example: get_config_value "/flash/config.ini" "hdmimode" CFG_FILE="${1}" CFG_NAME="${2}" [[ ! -s "${CFG_FILE}" ]] && return CFG_PAT="^${CFG_NAME}='(.*)'" CFG_TMP=$(cat "${CFG_FILE}" | grep -oE "${CFG_PAT}") CFG_TMP="${CFG_TMP##*=}" if [ ! -z "${CFG_TMP}" ]; then # Strips the config value of single and double quotes. CFG_VAL=$(echo ${CFG_TMP} | sed -e "s/^['\"]//" -e "s/['\"]$//") echo ${CFG_VAL} fi } get_ee_setting() { # Argument ${1} is the setting name, EmuELEC settings alway start with ee_ e.g. ee_novideo # Usage: get_ee_setting setting [platform] [rom] # Only the setting argument is required # Priority is: GAME, PLATFORM, GLOBAL, EE_SETTING if at any point one returns 0 it means its dissabled, if it returns empty it will continue onto the next one. SETTING="${1}" PLATFORM="${2}" ROM="${3}" EES=$(ees -e -r "${SETTING}" -p "${PLATFORM}" -m "${ROM}") echo "${EES}" } set_ee_setting() { # argument ${1} is the setting name e.g. nes.integerscale. ${2} is the value, e.g "1" ees -e -s "${1}" -v "${2}" } set_audio() { # sets up audio output, options are, default, alsa or pulseaudio if [ "${1}" == "default" ]; then if [ "${EE_DEVICE}" == "Amlogic-old" ] || [[ $(tr -d '\0' |\1|p" ${ES_CONF}) } init_game() { echo 1 > /tmp/game.running } end_game() { rm /tmp/game.running } init_port() { # Initialize port settings, this gets called by the ports scripts, or should. # ${1} is the binary to kill # ${2} is the kill signal to send if pgrep gptokeyb -f; then killall gptokeyb fi local VIRTUAL_KB GPTOKEYB=$(get_ee_setting "gptokeyb" "ports" "${1}") [[ -z "${GPTOKEYB}" ]] && GPTOKEYB=${4} [[ ! -z "${4}" ]] && VIRTUAL_KB=$(emuelec-utils set_gptokeyb "ports" "${GPTOKEYB}") if [ "${3}" ]; then gptokeyb 1 ${1} ${VIRTUAL_KB} -killsignal ${3} & else gptokeyb 1 ${1} ${VIRTUAL_KB} & fi set_audio ${2} cat /etc/motd > "${EE_LOG}" emuelec-utils init_app_video "ports" "${1}" } end_port() { # End the port execution and set/kill anything that is needed set_audio default emuelec-utils end_app_video kill_video_controls # for some reason head sometimes does not exit killall head } # maxperf and normpef are used to change gov to performance or return to ondemand maxperf() { if [ "${EE_DEVICE}" == "OdroidGoAdvance" ] || [ "${EE_DEVICE}" == "GameForce" ]; then echo performance > /sys/devices/platform/ff400000.gpu/devfreq/ff400000.gpu/governor echo performance > /sys/devices/platform/dmc/devfreq/dmc/governor echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor else echo "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo "performance" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor echo 5 > /sys/class/mpgpu/cur_freq fi } normperf() { if [ "${EE_DEVICE}" == "OdroidGoAdvance" ] || [ "${EE_DEVICE}" == "GameForce" ]; then echo simple_ondemand > /sys/devices/platform/ff400000.gpu/devfreq/ff400000.gpu/governor echo dmc_ondemand > /sys/devices/platform/dmc/devfreq/dmc/governor echo interactive > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor else echo "ondemand" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo "ondemand" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor echo 1 > /sys/class/mpgpu/cur_freq fi } ee_check_bios() { # Checks that all required bios files are present, will error out if anything is missing. PLATFORM="${1}" CORE="${2}" EMULATOR="${3}" ROMNAME="${4}" LOG="${5}" if [[ -z "${LOG}" ]]; then LOG="${EE_LOG}" fi MISSINGBIOS="$(batocera-systems --strictfilter ${PLATFORM})" if [ "$?" == "2" ]; then # formating so it looks nice :) PLATFORMNAME="${MISSINGBIOS##*>}" # read from -P onwards PLATFORMNAME="${PLATFORMNAME%%MISSING*}" # until a space is found PLATFORMNAME=$(echo ${PLATFORMNAME} | sed -e 's/\\n//g') if [[ -f "${LOG}" ]]; then echo "${CORE} ${EMULATOR} ${ROMNAME}" >> ${LOG} echo "${PLATFORMNAME} missing BIOS - Could not find all BIOS: " >> ${LOG} echo "please make sure you copied the files into the corresponding folder " >> ${LOG} echo "${MISSINGBIOS}" >> ${LOG} fi text_viewer -w -e -t "Error! ${2}" -f 24 ${LOG} return 1 else return 0 fi } ee_console() { # enable or disable the terminal console case "${1}" in "enable") echo 0 > /sys/class/vtconsole/vtcon1/bind echo 1 > /sys/class/vtconsole/vtcon1/bind clear /dev/tty0 ;; "disable") clear /dev/tty0 echo 0 > /sys/class/vtconsole/vtcon1/bind ;; esac } oga_ver() { DEVICE=$(tr -d '\0' < /proc/device-tree/compatible) case "${DEVICE}" in *"odroidgo3-linux"*) echo "OGS" ;; *"odroidgo2-linux-v11"*) echo "OGABE" ;; *"odroidgo2-linuxrockchip"*) echo "OGA" ;; *"gameforce"*) echo "GF" ;; esac } set_video_controls() { #gptokeyb is supposed to be presetup for video controls (keyboard) but this might need to be rechecked gptokeyb & > /dev/null 2>&1 } kill_video_controls() { killall gptokeyb > /dev/null 2>&1 } dot_delete() { # We hates MAC hidden files find "/storage/roms" \( -name ".DS_Store" -o -name "._.DS_Store" -o -name "._*" \) -type f -delete } install_java() { # ${1} is optional but you can define the package name, e.g install_java zulu21.32.17-ca-jdk21.0.2 JDKINSTALLED="yes" JDKDEST="/storage/roms/bios/jdk" [[ -z "${1}" ]] && JDKNAME="zulu21.32.17-ca-jdk21.0.2" || JDKNAME="${1}" CDN="https://cdn.azul.com/zulu/bin" # Alternate just for reference #CDN="https://cdn.azul.com/zulu-embedded/bin" OLDVERSION="$(cat ${JDKDEST}/eeversion 2>/dev/null)" if [ "${JDKNAME}" != "${OLDVERSION}" ]; then JDKINSTALLED="no" rm -rf "${JDKDEST}" fi mkdir -p "${JDKDEST}" if [ "${JDKINSTALLED}" == "no" ]; then echo -e "GET http://google.com HTTP/1.0\n\n" | nc google.com 80 > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "No internet connection, exiting..." > /dev/console text_viewer -e -w -t "No Internet!" -m "You need to be connected to the internet to download the JDK\nNo internet connection, exiting..."; exit 1 #No internet fi cat >> /tmp/java_install.rc < "${JDKDEST}/eeversion" EOF chmod +x /tmp/java_install.rc progressor --log "/emuelec/logs/jdk_install.log" --title "Installing JDK, please wait..." "/tmp/java_install.rc" --font "dummy.ttf" rm /tmp/java_install.rc fi } playvideolink() { [[ -z "${1}" ]] && echo "provide the link." && return local VIDEO_FILE="/tmp/video/video.m3u" mkdir -p /tmp/video echo "${1}" > "${VIDEO_FILE}" playvideo.sh "${VIDEO_FILE}" mpv rm "${VIDEO_FILE}" } # do not edit below this line # reads other config files from /storage/.config/profile.d for config in /storage/.config/profile.d/*; do if [ -f "${config}" ] ; then . ${config} fi done ================================================ FILE: packages/sx05re/emuelec/shaders/crt/crt-nes-mini.glslp ================================================ shaders = 1 shader0 = shaders/crt-nes-mini.glsl ================================================ FILE: packages/sx05re/emuelec/shaders/crt/crt-pi-vertical.glslp ================================================ shaders = "1" shader0 = "shaders/crt-pi-vertical.glsl" filter_linear0 = "true" wrap_mode0 = "clamp_to_border" mipmap_input0 = "false" alias0 = "" float_framebuffer0 = "false" srgb_framebuffer0 = "false" ================================================ FILE: packages/sx05re/emuelec/shaders/crt/crt-pi.glslp ================================================ shaders = "1" shader0 = "shaders/crt-pi.glsl" filter_linear0 = "true" wrap_mode0 = "clamp_to_border" mipmap_input0 = "false" alias0 = "" float_framebuffer0 = "false" srgb_framebuffer0 = "false" ================================================ FILE: packages/sx05re/emuelec/shaders/crt/fakelottes.glslp ================================================ shaders = 1 shader0 = shaders/fakelottes.glsl filter_linear0 = true ================================================ FILE: packages/sx05re/emuelec/shaders/crt/scanline.glslp ================================================ shaders = 1 shader0 = shaders/scanlines.glsl filter_linear0 = true ================================================ FILE: packages/sx05re/emuelec/shaders/crt/shaders/crt-nes-mini.glsl ================================================ // Parameter lines go here: #pragma parameter SCANTHICK "Scanline Thickness" 2.0 2.0 4.0 2.0 #pragma parameter INTENSITY "Scanline Intensity" 0.15 0.0 1.0 0.01 #pragma parameter BRIGHTBOOST "Luminance Boost" 0.15 0.0 1.0 0.01 #if defined(VERTEX) #if __VERSION__ >= 130 #define COMPAT_VARYING out #define COMPAT_ATTRIBUTE in #define COMPAT_TEXTURE texture #else #define COMPAT_VARYING varying #define COMPAT_ATTRIBUTE attribute #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif COMPAT_ATTRIBUTE vec4 VertexCoord; COMPAT_ATTRIBUTE vec4 COLOR; COMPAT_ATTRIBUTE vec4 TexCoord; COMPAT_VARYING vec4 COL0; COMPAT_VARYING vec4 TEX0; vec4 _oPosition1; uniform mat4 MVPMatrix; uniform COMPAT_PRECISION int FrameDirection; uniform COMPAT_PRECISION int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; void main() { gl_Position = MVPMatrix * VertexCoord; COL0 = COLOR; TEX0.xy = TexCoord.xy * 1.00001; } #elif defined(FRAGMENT) #if __VERSION__ >= 130 #define COMPAT_VARYING in #define COMPAT_TEXTURE texture out vec4 FragColor; #else #define COMPAT_VARYING varying #define FragColor gl_FragColor #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif uniform COMPAT_PRECISION int FrameDirection; uniform COMPAT_PRECISION int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; uniform sampler2D Texture; COMPAT_VARYING vec4 TEX0; // compatibility #defines #define Source Texture #define vTexCoord TEX0.xy #define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize #define OutputSize vec4(OutputSize, 1.0 / OutputSize) #ifdef PARAMETER_UNIFORM // All parameter floats need to have COMPAT_PRECISION in front of them uniform COMPAT_PRECISION float SCANTHICK; uniform COMPAT_PRECISION float INTENSITY; uniform COMPAT_PRECISION float BRIGHTBOOST; #else #define SCANTHICK 2.0 #define INTENSITY 0.15 #define BRIGHTBOOST 0.15 #endif void main() { vec3 texel = COMPAT_TEXTURE(Texture, TEX0.xy).rgb; vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel; vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * texel)) * texel; float selectY = mod(TEX0.y * SCANTHICK * TextureSize.y, 2.0); float selectHigh = step(1.0, selectY); float selectLow = 1.0 - selectHigh; vec3 pixelColor = (selectLow * pixelLow) + (selectHigh * pixelHigh); FragColor = vec4(pixelColor, 1.0); } #endif ================================================ FILE: packages/sx05re/emuelec/shaders/crt/shaders/crt-pi-vertical.glsl ================================================ /* crt-pi-vertical - A Raspberry Pi friendly CRT shader. For use with portrait mode games on landscape mode screens (or landscape mode games on portrait mode sreens). Copyright (C) 2015-2016 davej This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Notes: This shader is designed to work well on Raspberry Pi GPUs (i.e. 1080P @ 60Hz on a game with a 4:3 aspect ratio). It pushes the Pi's GPU hard and enabling some features will slow it down so that it is no longer able to match 1080P @ 60Hz. You will need to overclock your Pi to the fastest setting in raspi-config to get the best results from this shader: 'Pi2' for Pi2 and 'Turbo' for original Pi and Pi Zero. Note: Pi2s are slower at running the shader than other Pis, this seems to be down to Pi2s lower maximum memory speed. Pi2s don't quite manage 1080P @ 60Hz - they drop about 1 in 1000 frames. You probably won't notice this, but if you do, try enabling FAKE_GAMMA. SCANLINES enables scanlines. You'll almost certainly want to use it with MULTISAMPLE to reduce moire effects. SCANLINE_WEIGHT defines how wide scanlines are (it is an inverse value so a higher number = thinner lines). SCANLINE_GAP_BRIGHTNESS defines how dark the gaps between the scan lines are. Darker gaps between scan lines make moire effects more likely. GAMMA enables gamma correction using the values in INPUT_GAMMA and OUTPUT_GAMMA. FAKE_GAMMA causes it to ignore the values in INPUT_GAMMA and OUTPUT_GAMMA and approximate gamma correction in a way which is faster than true gamma whilst still looking better than having none. You must have GAMMA defined to enable FAKE_GAMMA. CURVATURE distorts the screen by CURVATURE_X and CURVATURE_Y. Curvature slows things down a lot. By default the shader uses linear blending horizontally. If you find this too blury, enable SHARPER. BLOOM_FACTOR controls the increase in width for bright scanlines. MASK_TYPE defines what, if any, shadow mask to use. MASK_BRIGHTNESS defines how much the mask type darkens the screen. */ #pragma parameter CURVATURE_X "Screen curvature - horizontal" 0.10 0.0 1.0 0.01 #pragma parameter CURVATURE_Y "Screen curvature - vertical" 0.15 0.0 1.0 0.01 #pragma parameter MASK_BRIGHTNESS "Mask brightness" 0.70 0.0 1.0 0.01 #pragma parameter SCANLINE_WEIGHT "Scanline weight" 6.0 0.0 15.0 0.1 #pragma parameter SCANLINE_GAP_BRIGHTNESS "Scanline gap brightness" 0.12 0.0 1.0 0.01 #pragma parameter BLOOM_FACTOR "Bloom factor" 1.5 0.0 5.0 0.01 #pragma parameter INPUT_GAMMA "Input gamma" 2.4 0.0 5.0 0.01 #pragma parameter OUTPUT_GAMMA "Output gamma" 2.2 0.0 5.0 0.01 // Haven't put these as parameters as it would slow the code down. #define SCANLINES #define MULTISAMPLE #define GAMMA //#define FAKE_GAMMA //#define CURVATURE //#define SHARPER // MASK_TYPE: 0 = none, 1 = green/magenta, 2 = trinitron(ish) #define MASK_TYPE 1 #ifdef GL_ES #define COMPAT_PRECISION mediump precision mediump float; #else #define COMPAT_PRECISION #endif #ifdef PARAMETER_UNIFORM uniform COMPAT_PRECISION float CURVATURE_X; uniform COMPAT_PRECISION float CURVATURE_Y; uniform COMPAT_PRECISION float MASK_BRIGHTNESS; uniform COMPAT_PRECISION float SCANLINE_WEIGHT; uniform COMPAT_PRECISION float SCANLINE_GAP_BRIGHTNESS; uniform COMPAT_PRECISION float BLOOM_FACTOR; uniform COMPAT_PRECISION float INPUT_GAMMA; uniform COMPAT_PRECISION float OUTPUT_GAMMA; #else #define CURVATURE_X 0.10 #define CURVATURE_Y 0.25 #define MASK_BRIGHTNESS 0.70 #define SCANLINE_WEIGHT 6.0 #define SCANLINE_GAP_BRIGHTNESS 0.12 #define BLOOM_FACTOR 1.5 #define INPUT_GAMMA 2.4 #define OUTPUT_GAMMA 2.2 #endif /* COMPATIBILITY - GLSL compilers */ #ifdef GL_ES #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif uniform vec2 TextureSize; #if defined(CURVATURE) varying COMPAT_PRECISION vec2 screenScale; #endif varying COMPAT_PRECISION vec2 TEX0; varying COMPAT_PRECISION float filterWidth; #if defined(VERTEX) uniform mat4 MVPMatrix; attribute vec4 VertexCoord; attribute vec2 TexCoord; uniform vec2 InputSize; uniform vec2 OutputSize; void main() { #if defined(CURVATURE) screenScale = TextureSize / InputSize; #endif filterWidth = (InputSize.y / OutputSize.y) / 3.0; TEX0 = TexCoord; gl_Position = MVPMatrix * VertexCoord; } #elif defined(FRAGMENT) uniform sampler2D Texture; #if defined(CURVATURE) vec2 CURVATURE_DISTORTION = vec2(CURVATURE_X, CURVATURE_Y); // Barrel distortion shrinks the display area a bit, this will allow us to counteract that. vec2 barrelScale = 1.0 - (0.23 * CURVATURE_DISTORTION); vec2 Distort(vec2 coord) { coord *= screenScale; coord -= vec2(0.5); float rsq = coord.x * coord.x + coord.y * coord.y; coord += coord * (CURVATURE_DISTORTION * rsq); coord *= barrelScale; if (abs(coord.x) >= 0.5 || abs(coord.y) >= 0.5) coord = vec2(-1.0); // If out of bounds, return an invalid value. else { coord += vec2(0.5); coord /= screenScale; } return coord; } #endif float CalcScanLineWeight(float dist) { return max(1.0-dist*dist*SCANLINE_WEIGHT, SCANLINE_GAP_BRIGHTNESS); } float CalcScanLine(float dy) { float scanLineWeight = CalcScanLineWeight(dy); #if defined(MULTISAMPLE) scanLineWeight += CalcScanLineWeight(dy-filterWidth); scanLineWeight += CalcScanLineWeight(dy+filterWidth); scanLineWeight *= 0.3333333; #endif return scanLineWeight; } void main() { #if defined(CURVATURE) vec2 texcoord = Distort(TEX0); if (texcoord.x < 0.0) gl_FragColor = vec4(0.0); else #else vec2 texcoord = TEX0; #endif { vec2 texcoordInPixels = texcoord * TextureSize; #if defined(SHARPER) vec2 tempCoord = floor(texcoordInPixels) + 0.5; vec2 coord = tempCoord / TextureSize; vec2 deltas = texcoordInPixels - tempCoord; float scanLineWeight = CalcScanLine(deltas.y); vec2 signs = sign(deltas); deltas.x *= 2.0; deltas = deltas * deltas; deltas.y = deltas.y * deltas.y; deltas.x *= 0.5; deltas.y *= 8.0; deltas /= TextureSize; deltas *= signs; vec2 tc = coord + deltas; #else float tempY = floor(texcoordInPixels.y) + 0.5; float yCoord = tempY / TextureSize.y; float dy = texcoordInPixels.y - tempY; float scanLineWeight = CalcScanLine(dy); float signY = sign(dy); dy = dy * dy; dy = dy * dy; dy *= 8.0; dy /= TextureSize.y; dy *= signY; vec2 tc = vec2(texcoord.x, yCoord + dy); #endif vec3 colour = texture2D(Texture, tc).rgb; #if defined(SCANLINES) #if defined(GAMMA) #if defined(FAKE_GAMMA) colour = colour * colour; #else colour = pow(colour, vec3(INPUT_GAMMA)); #endif #endif scanLineWeight *= BLOOM_FACTOR; colour *= scanLineWeight; #if defined(GAMMA) #if defined(FAKE_GAMMA) colour = sqrt(colour); #else colour = pow(colour, vec3(1.0/OUTPUT_GAMMA)); #endif #endif #endif #if MASK_TYPE == 0 gl_FragColor = vec4(colour, 1.0); #else #if MASK_TYPE == 1 float whichMask = fract(gl_FragCoord.y * 0.5); vec3 mask; if (whichMask < 0.5) mask = vec3(MASK_BRIGHTNESS, 1.0, MASK_BRIGHTNESS); else mask = vec3(1.0, MASK_BRIGHTNESS, 1.0); #elif MASK_TYPE == 2 float whichMask = fract(gl_FragCoord.y * 0.3333333); vec3 mask = vec3(MASK_BRIGHTNESS, MASK_BRIGHTNESS, MASK_BRIGHTNESS); if (whichMask < 0.3333333) mask.x = 1.0; else if (whichMask < 0.6666666) mask.y = 1.0; else mask.z = 1.0; #endif gl_FragColor = vec4(colour * mask, 1.0); #endif } } #endif ================================================ FILE: packages/sx05re/emuelec/shaders/crt/shaders/crt-pi.glsl ================================================ /* crt-pi - A Raspberry Pi friendly CRT shader. Copyright (C) 2015-2016 davej This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Notes: This shader is designed to work well on Raspberry Pi GPUs (i.e. 1080P @ 60Hz on a game with a 4:3 aspect ratio). It pushes the Pi's GPU hard and enabling some features will slow it down so that it is no longer able to match 1080P @ 60Hz. You will need to overclock your Pi to the fastest setting in raspi-config to get the best results from this shader: 'Pi2' for Pi2 and 'Turbo' for original Pi and Pi Zero. Note: Pi2s are slower at running the shader than other Pis, this seems to be down to Pi2s lower maximum memory speed. Pi2s don't quite manage 1080P @ 60Hz - they drop about 1 in 1000 frames. You probably won't notice this, but if you do, try enabling FAKE_GAMMA. SCANLINES enables scanlines. You'll almost certainly want to use it with MULTISAMPLE to reduce moire effects. SCANLINE_WEIGHT defines how wide scanlines are (it is an inverse value so a higher number = thinner lines). SCANLINE_GAP_BRIGHTNESS defines how dark the gaps between the scan lines are. Darker gaps between scan lines make moire effects more likely. GAMMA enables gamma correction using the values in INPUT_GAMMA and OUTPUT_GAMMA. FAKE_GAMMA causes it to ignore the values in INPUT_GAMMA and OUTPUT_GAMMA and approximate gamma correction in a way which is faster than true gamma whilst still looking better than having none. You must have GAMMA defined to enable FAKE_GAMMA. CURVATURE distorts the screen by CURVATURE_X and CURVATURE_Y. Curvature slows things down a lot. By default the shader uses linear blending horizontally. If you find this too blury, enable SHARPER. BLOOM_FACTOR controls the increase in width for bright scanlines. MASK_TYPE defines what, if any, shadow mask to use. MASK_BRIGHTNESS defines how much the mask type darkens the screen. */ #pragma parameter CURVATURE_X "Screen curvature - horizontal" 0.10 0.0 1.0 0.01 #pragma parameter CURVATURE_Y "Screen curvature - vertical" 0.15 0.0 1.0 0.01 #pragma parameter MASK_BRIGHTNESS "Mask brightness" 0.70 0.0 1.0 0.01 #pragma parameter SCANLINE_WEIGHT "Scanline weight" 6.0 0.0 15.0 0.1 #pragma parameter SCANLINE_GAP_BRIGHTNESS "Scanline gap brightness" 0.12 0.0 1.0 0.01 #pragma parameter BLOOM_FACTOR "Bloom factor" 1.5 0.0 5.0 0.01 #pragma parameter INPUT_GAMMA "Input gamma" 2.4 0.0 5.0 0.01 #pragma parameter OUTPUT_GAMMA "Output gamma" 2.2 0.0 5.0 0.01 // Haven't put these as parameters as it would slow the code down. #define SCANLINES #define MULTISAMPLE #define GAMMA //#define FAKE_GAMMA //#define CURVATURE //#define SHARPER // MASK_TYPE: 0 = none, 1 = green/magenta, 2 = trinitron(ish) #define MASK_TYPE 1 #ifdef GL_ES #define COMPAT_PRECISION mediump precision mediump float; #else #define COMPAT_PRECISION #endif #ifdef PARAMETER_UNIFORM uniform COMPAT_PRECISION float CURVATURE_X; uniform COMPAT_PRECISION float CURVATURE_Y; uniform COMPAT_PRECISION float MASK_BRIGHTNESS; uniform COMPAT_PRECISION float SCANLINE_WEIGHT; uniform COMPAT_PRECISION float SCANLINE_GAP_BRIGHTNESS; uniform COMPAT_PRECISION float BLOOM_FACTOR; uniform COMPAT_PRECISION float INPUT_GAMMA; uniform COMPAT_PRECISION float OUTPUT_GAMMA; #else #define CURVATURE_X 0.10 #define CURVATURE_Y 0.25 #define MASK_BRIGHTNESS 0.70 #define SCANLINE_WEIGHT 6.0 #define SCANLINE_GAP_BRIGHTNESS 0.12 #define BLOOM_FACTOR 1.5 #define INPUT_GAMMA 2.4 #define OUTPUT_GAMMA 2.2 #endif /* COMPATIBILITY - GLSL compilers */ uniform vec2 TextureSize; #if defined(CURVATURE) varying vec2 screenScale; #endif varying vec2 TEX0; varying float filterWidth; #if defined(VERTEX) uniform mat4 MVPMatrix; attribute vec4 VertexCoord; attribute vec2 TexCoord; uniform vec2 InputSize; uniform vec2 OutputSize; void main() { #if defined(CURVATURE) screenScale = TextureSize / InputSize; #endif filterWidth = (InputSize.y / OutputSize.y) / 3.0; TEX0 = TexCoord; gl_Position = MVPMatrix * VertexCoord; } #elif defined(FRAGMENT) uniform sampler2D Texture; #if defined(CURVATURE) vec2 CURVATURE_DISTORTION = vec2(CURVATURE_X, CURVATURE_Y); // Barrel distortion shrinks the display area a bit, this will allow us to counteract that. vec2 barrelScale = 1.0 - (0.23 * CURVATURE_DISTORTION); vec2 Distort(vec2 coord) { coord *= screenScale; coord -= vec2(0.5); float rsq = coord.x * coord.x + coord.y * coord.y; coord += coord * (CURVATURE_DISTORTION * rsq); coord *= barrelScale; if (abs(coord.x) >= 0.5 || abs(coord.y) >= 0.5) coord = vec2(-1.0); // If out of bounds, return an invalid value. else { coord += vec2(0.5); coord /= screenScale; } return coord; } #endif float CalcScanLineWeight(float dist) { return max(1.0-dist*dist*SCANLINE_WEIGHT, SCANLINE_GAP_BRIGHTNESS); } float CalcScanLine(float dy) { float scanLineWeight = CalcScanLineWeight(dy); #if defined(MULTISAMPLE) scanLineWeight += CalcScanLineWeight(dy-filterWidth); scanLineWeight += CalcScanLineWeight(dy+filterWidth); scanLineWeight *= 0.3333333; #endif return scanLineWeight; } void main() { #if defined(CURVATURE) vec2 texcoord = Distort(TEX0); if (texcoord.x < 0.0) gl_FragColor = vec4(0.0); else #else vec2 texcoord = TEX0; #endif { vec2 texcoordInPixels = texcoord * TextureSize; #if defined(SHARPER) vec2 tempCoord = floor(texcoordInPixels) + 0.5; vec2 coord = tempCoord / TextureSize; vec2 deltas = texcoordInPixels - tempCoord; float scanLineWeight = CalcScanLine(deltas.y); vec2 signs = sign(deltas); deltas.x *= 2.0; deltas = deltas * deltas; deltas.y = deltas.y * deltas.y; deltas.x *= 0.5; deltas.y *= 8.0; deltas /= TextureSize; deltas *= signs; vec2 tc = coord + deltas; #else float tempY = floor(texcoordInPixels.y) + 0.5; float yCoord = tempY / TextureSize.y; float dy = texcoordInPixels.y - tempY; float scanLineWeight = CalcScanLine(dy); float signY = sign(dy); dy = dy * dy; dy = dy * dy; dy *= 8.0; dy /= TextureSize.y; dy *= signY; vec2 tc = vec2(texcoord.x, yCoord + dy); #endif vec3 colour = texture2D(Texture, tc).rgb; #if defined(SCANLINES) #if defined(GAMMA) #if defined(FAKE_GAMMA) colour = colour * colour; #else colour = pow(colour, vec3(INPUT_GAMMA)); #endif #endif scanLineWeight *= BLOOM_FACTOR; colour *= scanLineWeight; #if defined(GAMMA) #if defined(FAKE_GAMMA) colour = sqrt(colour); #else colour = pow(colour, vec3(1.0/OUTPUT_GAMMA)); #endif #endif #endif #if MASK_TYPE == 0 gl_FragColor = vec4(colour, 1.0); #else #if MASK_TYPE == 1 float whichMask = fract(gl_FragCoord.x * 0.5); vec3 mask; if (whichMask < 0.5) mask = vec3(MASK_BRIGHTNESS, 1.0, MASK_BRIGHTNESS); else mask = vec3(1.0, MASK_BRIGHTNESS, 1.0); #elif MASK_TYPE == 2 float whichMask = fract(gl_FragCoord.x * 0.3333333); vec3 mask = vec3(MASK_BRIGHTNESS, MASK_BRIGHTNESS, MASK_BRIGHTNESS); if (whichMask < 0.3333333) mask.x = 1.0; else if (whichMask < 0.6666666) mask.y = 1.0; else mask.z = 1.0; #endif gl_FragColor = vec4(colour * mask, 1.0); #endif } } #endif ================================================ FILE: packages/sx05re/emuelec/shaders/crt/shaders/fakelottes.glsl ================================================ // Simple scanlines with curvature and mask effects lifted from crt-lottes // by hunterk //////////////////////////////////////////////////////////////////// //////////////////////////// SETTINGS //////////////////////////// ///// comment these lines to disable effects and gain speed ////// //////////////////////////////////////////////////////////////////// //#define MASK // fancy, expensive phosphor mask effect #define CURVATURE // applies barrel distortion to the screen #define SCANLINES // applies horizontal scanline effect //#define ROTATE_SCANLINES // for TATE games; also disables the mask effects, which look bad with it //#define EXTRA_MASKS // disable these if you need extra registers freed up //////////////////////////////////////////////////////////////////// ////////////////////////// END SETTINGS ////////////////////////// //////////////////////////////////////////////////////////////////// /////////////////////// Runtime Parameters /////////////////////// #pragma parameter shadowMask "shadowMask" 1.0 0.0 4.0 1.0 #pragma parameter SCANLINE_SINE_COMP_B "Scanline Intensity" 0.40 0.0 1.0 0.05 #pragma parameter warpX "warpX" 0.031 0.0 0.125 0.01 #pragma parameter warpY "warpY" 0.041 0.0 0.125 0.01 #pragma parameter maskDark "maskDark" 0.5 0.0 2.0 0.1 #pragma parameter maskLight "maskLight" 1.5 0.0 2.0 0.1 #pragma parameter crt_gamma "CRT Gamma" 2.5 1.0 4.0 0.05 #pragma parameter monitor_gamma "Monitor Gamma" 2.2 1.0 4.0 0.05 #pragma parameter SCANLINE_SINE_COMP_A "Scanline Sine Comp A" 0.0 0.0 0.10 0.01 #pragma parameter SCANLINE_BASE_BRIGHTNESS "Scanline Base Brightness" 0.95 0.0 1.0 0.01 // prevent stupid behavior #if defined ROTATE_SCANLINES && !defined SCANLINES #define SCANLINES #endif #if defined(VERTEX) #if __VERSION__ >= 130 #define COMPAT_VARYING out #define COMPAT_ATTRIBUTE in #define COMPAT_TEXTURE texture #else #define COMPAT_VARYING varying #define COMPAT_ATTRIBUTE attribute #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif COMPAT_ATTRIBUTE vec4 VertexCoord; COMPAT_ATTRIBUTE vec4 COLOR; COMPAT_ATTRIBUTE vec4 TexCoord; COMPAT_VARYING vec4 COL0; COMPAT_VARYING vec4 TEX0; vec4 _oPosition1; uniform mat4 MVPMatrix; uniform COMPAT_PRECISION int FrameDirection; uniform COMPAT_PRECISION int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; // compatibility #defines #define vTexCoord TEX0.xy #define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize #define OutSize vec4(OutputSize, 1.0 / OutputSize) #ifdef PARAMETER_UNIFORM uniform COMPAT_PRECISION float WHATEVER; #else #define WHATEVER 0.0 #endif void main() { gl_Position = MVPMatrix * VertexCoord; TEX0.xy = TexCoord.xy; } #elif defined(FRAGMENT) #if __VERSION__ >= 130 #define COMPAT_VARYING in #define COMPAT_TEXTURE texture out vec4 FragColor; #else #define COMPAT_VARYING varying #define FragColor gl_FragColor #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif uniform COMPAT_PRECISION int FrameDirection; uniform COMPAT_PRECISION int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; uniform sampler2D Texture; COMPAT_VARYING vec4 TEX0; // compatibility #defines #define Source Texture #define vTexCoord TEX0.xy #define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize #define OutSize vec4(OutputSize, 1.0 / OutputSize) #ifdef PARAMETER_UNIFORM uniform COMPAT_PRECISION float SCANLINE_BASE_BRIGHTNESS; uniform COMPAT_PRECISION float SCANLINE_SINE_COMP_A; uniform COMPAT_PRECISION float SCANLINE_SINE_COMP_B; uniform COMPAT_PRECISION float warpX; uniform COMPAT_PRECISION float warpY; uniform COMPAT_PRECISION float maskDark; uniform COMPAT_PRECISION float maskLight; uniform COMPAT_PRECISION float shadowMask; uniform COMPAT_PRECISION float crt_gamma; uniform COMPAT_PRECISION float monitor_gamma; #else #define SCANLINE_BASE_BRIGHTNESS 0.95 #define SCANLINE_SINE_COMP_A 0.0 #define SCANLINE_SINE_COMP_B 0.40 #define warpX 0.031 #define warpY 0.041 #define maskDark 0.5 #define maskLight 1.5 #define shadowMask 1.0 #define crt_gamma 2.5 #define monitor_gamma 2.2 #endif vec4 scanline(vec2 coord, vec4 frame) { #if defined SCANLINES vec2 omega = vec2(3.1415 * OutputSize.x, 2.0 * 3.1415 * TextureSize.y); vec2 sine_comp = vec2(SCANLINE_SINE_COMP_A, SCANLINE_SINE_COMP_B); vec3 res = frame.xyz; #ifdef ROTATE_SCANLINES sine_comp = sine_comp.yx; omega = omega.yx; #endif vec3 scanline = res * (SCANLINE_BASE_BRIGHTNESS + dot(sine_comp * sin(coord * omega), vec2(1.0, 1.0))); return vec4(scanline.x, scanline.y, scanline.z, 1.0); #else return frame; #endif } #ifdef CURVATURE // Distortion of scanlines, and end of screen alpha. vec2 Warp(vec2 pos) { pos = pos*2.0-1.0; pos *= vec2(1.0 + (pos.y*pos.y)*warpX, 1.0 + (pos.x*pos.x)*warpY); return pos*0.5 + 0.5; } #endif #if defined MASK && !defined ROTATE_SCANLINES // Shadow mask. vec4 Mask(vec2 pos) { vec3 mask = vec3(maskDark, maskDark, maskDark); // Very compressed TV style shadow mask. if (shadowMask == 1.0) { float line = maskLight; float odd = 0.0; if (fract(pos.x*0.166666666) < 0.5) odd = 1.0; if (fract((pos.y + odd) * 0.5) < 0.5) line = maskDark; pos.x = fract(pos.x*0.333333333); if (pos.x < 0.333) mask.r = maskLight; else if (pos.x < 0.666) mask.g = maskLight; else mask.b = maskLight; mask*=line; } // Aperture-grille. else if (shadowMask == 2.0) { pos.x = fract(pos.x*0.333333333); if (pos.x < 0.333) mask.r = maskLight; else if (pos.x < 0.666) mask.g = maskLight; else mask.b = maskLight; } #ifdef EXTRA_MASKS // These can cause moire with curvature and scanlines // so they're an easy target for freeing up registers // Stretched VGA style shadow mask (same as prior shaders). else if (shadowMask == 3.0) { pos.x += pos.y*3.0; pos.x = fract(pos.x*0.166666666); if (pos.x < 0.333) mask.r = maskLight; else if (pos.x < 0.666) mask.g = maskLight; else mask.b = maskLight; } // VGA style shadow mask. else if (shadowMask == 4.0) { pos.xy = floor(pos.xy*vec2(1.0, 0.5)); pos.x += pos.y*3.0; pos.x = fract(pos.x*0.166666666); if (pos.x < 0.333) mask.r = maskLight; else if (pos.x < 0.666) mask.g = maskLight; else mask.b = maskLight; } #endif else mask = vec3(1.,1.,1.); return vec4(mask, 1.0); } #endif void main() { #ifdef CURVATURE vec2 pos = Warp(TEX0.xy*(TextureSize.xy/InputSize.xy))*(InputSize.xy/TextureSize.xy); #else vec2 pos = TEX0.xy; #endif #if defined MASK && !defined ROTATE_SCANLINES // mask effects look bad unless applied in linear gamma space vec4 in_gamma = vec4(monitor_gamma, monitor_gamma, monitor_gamma, 1.0); vec4 out_gamma = vec4(1.0 / crt_gamma, 1.0 / crt_gamma, 1.0 / crt_gamma, 1.0); vec4 res = pow(COMPAT_TEXTURE(Source, pos), in_gamma); #else vec4 res = COMPAT_TEXTURE(Source, pos); #endif #if defined MASK && !defined ROTATE_SCANLINES // apply the mask; looks bad with vert scanlines so make them mutually exclusive res *= Mask(gl_FragCoord.xy * 1.0001); #endif #if defined CURVATURE && defined GL_ES // hacky clamp fix for GLES vec2 bordertest = (pos); if ( bordertest.x > 0.0001 && bordertest.x < 0.9999 && bordertest.y > 0.0001 && bordertest.y < 0.9999) res = res; else res = vec4(0.,0.,0.,0.); #endif #if defined MASK && !defined ROTATE_SCANLINES // re-apply the gamma curve for the mask path FragColor = pow(scanline(pos, res), out_gamma); #else FragColor = scanline(pos, res); #endif } #endif ================================================ FILE: packages/sx05re/emuelec/shaders/crt/shaders/scanlines.glsl ================================================ // Parameter lines go here: #pragma parameter SCANLINE_BASE_BRIGHTNESS "Scanline Base Brightness" 0.95 0.0 1.0 0.01 #pragma parameter SCANLINE_SINE_COMP_A "Scanline Sine Comp A" 0.0 0.0 0.10 0.01 #pragma parameter SCANLINE_SINE_COMP_B "Scanline Sine Comp B" 0.15 0.0 1.0 0.05 #define pi 3.141592654 #if defined(VERTEX) #if __VERSION__ >= 130 #define COMPAT_VARYING out #define COMPAT_ATTRIBUTE in #define COMPAT_TEXTURE texture #else #define COMPAT_VARYING varying #define COMPAT_ATTRIBUTE attribute #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif COMPAT_ATTRIBUTE vec4 VertexCoord; COMPAT_ATTRIBUTE vec4 COLOR; COMPAT_ATTRIBUTE vec4 TexCoord; COMPAT_VARYING vec4 COL0; COMPAT_VARYING vec4 TEX0; COMPAT_VARYING vec2 omega; vec4 _oPosition1; uniform mat4 MVPMatrix; uniform COMPAT_PRECISION int FrameDirection; uniform COMPAT_PRECISION int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; void main() { gl_Position = MVPMatrix * VertexCoord; COL0 = COLOR; TEX0.xy = TexCoord.xy; omega = vec2(pi * OutputSize.x, 2.0 * pi * TextureSize.y); } #elif defined(FRAGMENT) #if __VERSION__ >= 130 #define COMPAT_VARYING in #define COMPAT_TEXTURE texture out vec4 FragColor; #else #define COMPAT_VARYING varying #define FragColor gl_FragColor #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif uniform COMPAT_PRECISION int FrameDirection; uniform COMPAT_PRECISION int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; uniform sampler2D Texture; COMPAT_VARYING vec4 TEX0; COMPAT_VARYING vec2 omega; // compatibility #defines #define Source Texture #define vTexCoord TEX0.xy #define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize #define OutputSize vec4(OutputSize, 1.0 / OutputSize) #ifdef PARAMETER_UNIFORM // All parameter floats need to have COMPAT_PRECISION in front of them uniform COMPAT_PRECISION float SCANLINE_BASE_BRIGHTNESS; uniform COMPAT_PRECISION float SCANLINE_SINE_COMP_A; uniform COMPAT_PRECISION float SCANLINE_SINE_COMP_B; #else #define SCANLINE_BASE_BRIGHTNESS 0.95 #define SCANLINE_SINE_COMP_A 0.0 #define SCANLINE_SINE_COMP_B 0.15 #endif void main() { vec2 sine_comp = vec2(SCANLINE_SINE_COMP_A, SCANLINE_SINE_COMP_B); vec3 res = COMPAT_TEXTURE(Source, vTexCoord).xyz; vec3 scanline = res * (SCANLINE_BASE_BRIGHTNESS + dot(sine_comp * sin(vTexCoord * omega), vec2(1.0, 1.0))); FragColor = vec4(scanline.x, scanline.y, scanline.z, 1.0); } #endif ================================================ FILE: packages/sx05re/emuelec/shaders/crt/shaders/zfast_crt.glsl ================================================ /* zfast_crt_standard - A simple, fast CRT shader. Copyright (C) 2017 Greg Hogan (SoltanGris42) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Notes: This shader does scaling with a weighted linear filter for adjustable sharpness on the x and y axes based on the algorithm by Inigo Quilez here: http://http://www.iquilezles.org/www/articles/texture/texture.htm but modified to be somewhat sharper. Then a scanline effect that varies based on pixel brighness is applied along with a monochrome aperture mask. This shader runs at 60fps on the Raspberry Pi 3 hardware at 2mpix/s resolutions (1920x1080 or 1600x1200). */ //For testing compilation //#define FRAGMENT //#define VERTEX //This can't be an option without slowing the shader down //Comment this out for a coarser 3 pixel mask...which is currently broken //on SNES Classic Edition due to Mali 400 gpu precision #define FINEMASK //Some drivers don't return black with texture coordinates out of bounds //SNES Classic is too slow to black these areas out when using fullscreen //overlays. But you can uncomment the below to black them out if necessary //#define BLACK_OUT_BORDER // Parameter lines go here: #pragma parameter BLURSCALEX "Blur Amount X-Axis" 0.30 0.0 1.0 0.05 #pragma parameter LOWLUMSCAN "Scanline Darkness - Low" 6.0 0.0 10.0 0.5 #pragma parameter HILUMSCAN "Scanline Darkness - High" 8.0 0.0 50.0 1.0 #pragma parameter BRIGHTBOOST "Dark Pixel Brightness Boost" 1.25 0.5 1.5 0.05 #pragma parameter MASK_DARK "Mask Effect Amount" 0.25 0.0 1.0 0.05 #pragma parameter MASK_FADE "Mask/Scanline Fade" 0.8 0.0 1.0 0.05 #if defined(VERTEX) #if __VERSION__ >= 130 #define COMPAT_VARYING out #define COMPAT_ATTRIBUTE in #define COMPAT_TEXTURE texture #else #define COMPAT_VARYING varying #define COMPAT_ATTRIBUTE attribute #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif COMPAT_ATTRIBUTE vec4 VertexCoord; COMPAT_ATTRIBUTE vec4 COLOR; COMPAT_ATTRIBUTE vec4 TexCoord; COMPAT_VARYING vec4 COL0; COMPAT_VARYING vec4 TEX0; COMPAT_VARYING float maskFade; COMPAT_VARYING vec2 invDims; vec4 _oPosition1; uniform mat4 MVPMatrix; uniform COMPAT_PRECISION int FrameDirection; uniform COMPAT_PRECISION int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; // compatibility #defines #define vTexCoord TEX0.xy #define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize #define OutSize vec4(OutputSize, 1.0 / OutputSize) #ifdef PARAMETER_UNIFORM // All parameter floats need to have COMPAT_PRECISION in front of them uniform COMPAT_PRECISION float BLURSCALEX; //uniform COMPAT_PRECISION float BLURSCALEY; uniform COMPAT_PRECISION float LOWLUMSCAN; uniform COMPAT_PRECISION float HILUMSCAN; uniform COMPAT_PRECISION float BRIGHTBOOST; uniform COMPAT_PRECISION float MASK_DARK; uniform COMPAT_PRECISION float MASK_FADE; #else #define BLURSCALEX 0.45 //#define BLURSCALEY 0.20 #define LOWLUMSCAN 5.0 #define HILUMSCAN 10.0 #define BRIGHTBOOST 1.25 #define MASK_DARK 0.25 #define MASK_FADE 0.8 #endif void main() { gl_Position = MVPMatrix * VertexCoord; TEX0.xy = (TexCoord.xy); maskFade = 0.3333*MASK_FADE; invDims = 1.0/TextureSize.xy; } #elif defined(FRAGMENT) #ifdef GL_ES #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif #if __VERSION__ >= 130 #define COMPAT_VARYING in #define COMPAT_TEXTURE texture out COMPAT_PRECISION vec4 FragColor; #else #define COMPAT_VARYING varying #define FragColor gl_FragColor #define COMPAT_TEXTURE texture2D #endif uniform COMPAT_PRECISION int FrameDirection; uniform COMPAT_PRECISION int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; uniform sampler2D Texture; COMPAT_VARYING vec4 TEX0; COMPAT_VARYING float maskFade; COMPAT_VARYING vec2 invDims; // compatibility #defines #define Source Texture #define vTexCoord TEX0.xy #define texture(c, d) COMPAT_TEXTURE(c, d) #define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize #define OutSize vec4(OutputSize, 1.0 / OutputSize) #ifdef PARAMETER_UNIFORM // All parameter floats need to have COMPAT_PRECISION in front of them uniform COMPAT_PRECISION float BLURSCALEX; //uniform COMPAT_PRECISION float BLURSCALEY; uniform COMPAT_PRECISION float LOWLUMSCAN; uniform COMPAT_PRECISION float HILUMSCAN; uniform COMPAT_PRECISION float BRIGHTBOOST; uniform COMPAT_PRECISION float MASK_DARK; uniform COMPAT_PRECISION float MASK_FADE; #else #define BLURSCALEX 0.45 //#define BLURSCALEY 0.20 #define LOWLUMSCAN 5.0 #define HILUMSCAN 10.0 #define BRIGHTBOOST 1.25 #define MASK_DARK 0.25 #define MASK_FADE 0.8 #endif void main() { //This is just like "Quilez Scaling" but sharper COMPAT_PRECISION vec2 p = vTexCoord * TextureSize; COMPAT_PRECISION vec2 i = floor(p) + 0.50; COMPAT_PRECISION vec2 f = p - i; p = (i + 4.0*f*f*f)*invDims; p.x = mix( p.x , vTexCoord.x, BLURSCALEX); COMPAT_PRECISION float Y = f.y*f.y; COMPAT_PRECISION float YY = Y*Y; #if defined(FINEMASK) COMPAT_PRECISION float whichmask = fract( gl_FragCoord.x*-0.4999); COMPAT_PRECISION float mask = 1.0 + float(whichmask < 0.5) * -MASK_DARK; #else COMPAT_PRECISION float whichmask = fract(gl_FragCoord.x * -0.3333); COMPAT_PRECISION float mask = 1.0 + float(whichmask <= 0.33333) * -MASK_DARK; #endif COMPAT_PRECISION vec3 colour = COMPAT_TEXTURE(Source, p).rgb; COMPAT_PRECISION float scanLineWeight = (BRIGHTBOOST - LOWLUMSCAN*(Y - 2.05*YY)); COMPAT_PRECISION float scanLineWeightB = 1.0 - HILUMSCAN*(YY-2.8*YY*Y); #if defined(BLACK_OUT_BORDER) colour.rgb*=float(tc.x > 0.0)*float(tc.y > 0.0); //why doesn't the driver do the right thing? #endif FragColor.rgb = colour.rgb*mix(scanLineWeight*mask, scanLineWeightB, dot(colour.rgb,vec3(maskFade))); } #endif ================================================ FILE: packages/sx05re/emuelec/shaders/crt/zfast-crt.glslp ================================================ shaders = 1 shader0 = shaders/zfast_crt.glsl filter_linear0 = true ================================================ FILE: packages/sx05re/emuelec/shaders/kurg/kurg-ROPi-scanlines-3x.glsl ================================================ #if defined(VERTEX) attribute vec4 VertexCoord; attribute vec4 TexCoord; varying vec4 TEX0; uniform mat4 MVPMatrix; void main() { gl_Position = VertexCoord.x*MVPMatrix[0] + VertexCoord.y*MVPMatrix[1] + VertexCoord.z*MVPMatrix[2] + VertexCoord.w*MVPMatrix[3]; TEX0.xy = TexCoord.xy; } #elif defined(FRAGMENT) precision mediump float; uniform sampler2D Texture; varying vec4 TEX0; uniform vec2 TextureSize; void main() { vec3 col; float x = TEX0.x * TextureSize.x; float y = floor(gl_FragCoord.y / 3.0) + 0.5; float ymod = mod(gl_FragCoord.y, 3.0); vec2 f0 = vec2(x, y); vec2 uv0 = f0 / TextureSize.xy; vec3 t0 = texture2D(Texture, uv0).xyz; if (ymod > 2.0) { vec2 f1 = vec2(x, y + 1.0); vec2 uv1 = f1 / TextureSize.xy; vec3 t1 = texture2D(Texture, uv1).xyz; col = (t0 + t1) / 2.0 * 0.6; } else { col = t0; } gl_FragColor = vec4( col, 1.0 ); } #endif ================================================ FILE: packages/sx05re/emuelec/shaders/kurg/kurg-ROPi-scanlines-3x.glslp ================================================ shaders = 1 shader0 = kurg-ROPi-scanlines-3x.glsl filter_linear0 = true scale_type_x0 = "viewport" scale_x0 = "1.000000" scale_type_y0 = "viewport" scale_y0 = "1.000000" ================================================ FILE: packages/sx05re/emuelec/shaders/kurg/kurg-ROPi-scanlines-3x_v2.glsl ================================================ #if defined(VERTEX) attribute vec4 VertexCoord; attribute vec4 TexCoord; varying vec4 TEX0; uniform mat4 MVPMatrix; void main() { gl_Position = MVPMatrix * VertexCoord; TEX0.xy = TexCoord.xy; } #elif defined(FRAGMENT) precision mediump float; uniform sampler2D Texture; varying vec4 TEX0; uniform vec2 TextureSize; uniform vec2 InputSize; void main() { vec3 col; if (InputSize.y > 220.0 && InputSize.y < 242.0) { float x = TEX0.x; float y = TEX0.y + (0.25 / TextureSize.y); col = texture2D(Texture, vec2(x, y)).xyz; float texel_y = TEX0.y * TextureSize.y * 3.0; float ymod = mod(texel_y, 3.0); if (ymod >= 1.5) { col = col * 0.6; } } else { col = texture2D(Texture, TEX0.xy).xyz; } gl_FragColor = vec4( col, 1.0 ); } #endif ================================================ FILE: packages/sx05re/emuelec/shaders/kurg/kurg-ROPi-scanlines-3x_v2.glslp ================================================ shaders = 1 shader0 = kurg-ROPi-scanlines-3x_v2.glsl filter_linear0 = true scale_type_x0 = "viewport" scale_x0 = "1.000000" scale_type_y0 = "viewport" scale_y0 = "1.000000" ================================================ FILE: packages/sx05re/emuelec/shaders/kurg/kurg_scanlines_source.glsl ================================================ #if defined(VERTEX) #if __VERSION__ >= 130 #define COMPAT_VARYING out #define COMPAT_ATTRIBUTE in #define COMPAT_TEXTURE texture #else #define COMPAT_VARYING varying #define COMPAT_ATTRIBUTE attribute #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif COMPAT_VARYING float _frame_rotation; struct input_dummy { vec2 _video_size; vec2 _texture_size; vec2 _output_dummy_size; float _frame_count; float _frame_direction; float _frame_rotation; }; COMPAT_ATTRIBUTE vec4 VertexCoord; COMPAT_ATTRIBUTE vec4 COLOR; COMPAT_VARYING vec4 COL0; COMPAT_ATTRIBUTE vec4 TexCoord; COMPAT_VARYING vec4 TEX0; uniform mat4 MVPMatrix; uniform int FrameDirection; uniform int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; void main() { gl_Position = VertexCoord.x*MVPMatrix[0] + VertexCoord.y*MVPMatrix[1] + VertexCoord.z*MVPMatrix[2] + VertexCoord.w*MVPMatrix[3]; TEX0.xy = TexCoord.xy; } #elif defined(FRAGMENT) #if __VERSION__ >= 130 #define COMPAT_VARYING in #define COMPAT_TEXTURE texture out vec4 FragColor; #else #define COMPAT_VARYING varying #define FragColor gl_FragColor #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif COMPAT_VARYING float _frame_rotation; struct input_dummy { vec2 _video_size; vec2 _texture_size; vec2 _output_dummy_size; float _frame_count; float _frame_direction; float _frame_rotation; }; float _TMP2; float _TMP1; uniform sampler2D Texture; input_dummy _IN1; COMPAT_VARYING vec4 TEX0; uniform int FrameDirection; uniform int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; void main() { vec4 _res; _res = COMPAT_TEXTURE(Texture, TEX0.xy); _TMP1 = TEX0.y*TextureSize.y; _TMP2 = fract(_TMP1); if (_TMP2 < 0.5) { FragColor = _res; } else { //FragColor = vec4(0.0, 0.0, 0.0, 0.0); FragColor = _res * 0.5; //FragColor = _res * 0.8; } } #endif ================================================ FILE: packages/sx05re/emuelec/shaders/kurg/kurg_scanlines_source_nearest.glslp ================================================ shaders = 1 shader0 = kurg_scanlines_source.glsl filter_linear0 = false #filter_linear0 = true scale_type_x0 = "source" scale_x0 = "1.000000" scale_type_y0 = "source" scale_y0 = "3.000000" ================================================ FILE: packages/sx05re/emuelec/shaders/sharp/shaders/sharp-bilinear-scanlines.glsl ================================================ /* Author: rsn8887 (based on TheMaister) License: Public domain This is an integer prescale filter that should be combined with a bilinear hardware filtering (GL_BILINEAR filter or some such) to achieve a smooth scaling result with minimum blur. This is good for pixelgraphics that are scaled by non-integer factors. The prescale factor and texel coordinates are precalculated in the vertex shader for speed. */ // Parameter lines go here: #pragma parameter SCANLINE_BASE_BRIGHTNESS "Scanline Base Brightness" 0.60 0.0 1.0 0.01 #pragma parameter SCANLINE_HORIZONTAL_MODULATION "Scanline Horizontal Modulation" 0.0 0.0 2.00 0.01 #pragma parameter SCANLINE_VERTICAL_MODULATION "Scanline Vertical Modulation" 0.75 0.0 2.0 0.01 #define pi 3.141592654 #if defined(VERTEX) #if __VERSION__ >= 130 #define COMPAT_VARYING out #define COMPAT_ATTRIBUTE in #define COMPAT_TEXTURE texture #else #define COMPAT_VARYING varying #define COMPAT_ATTRIBUTE attribute #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif COMPAT_ATTRIBUTE vec4 VertexCoord; COMPAT_ATTRIBUTE vec4 COLOR; COMPAT_ATTRIBUTE vec4 TexCoord; COMPAT_VARYING vec4 COL0; COMPAT_VARYING vec4 TEX0; COMPAT_VARYING vec2 omega; uniform mat4 MVPMatrix; uniform int FrameDirection; uniform int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; // vertex compatibility #defines #define vTexCoord TEX0.xy #define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize #define outsize vec4(OutputSize, 1.0 / OutputSize) COMPAT_VARYING vec2 precalc_texel; COMPAT_VARYING vec2 precalc_scale; void main() { gl_Position = MVPMatrix * VertexCoord; COL0 = COLOR; TEX0.xy = TexCoord.xy; omega = vec2(pi * OutputSize.x, 2.0 * pi * TextureSize.y); precalc_texel = vTexCoord * SourceSize.xy; precalc_scale = max(floor(outsize.xy / InputSize.xy), vec2(1.0, 1.0)); } #elif defined(FRAGMENT) #if __VERSION__ >= 130 #define COMPAT_VARYING in #define COMPAT_TEXTURE texture out vec4 FragColor; #else #define COMPAT_VARYING varying #define FragColor gl_FragColor #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif uniform int FrameDirection; uniform int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; uniform sampler2D Texture; COMPAT_VARYING vec4 TEX0; COMPAT_VARYING vec2 omega; // fragment compatibility #defines #define Source Texture #define vTexCoord TEX0.xy #define texture(c, d) COMPAT_TEXTURE(c, d) #define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize #define outsize vec4(OutputSize, 1.0 / OutputSize) #ifdef PARAMETER_UNIFORM // All parameter floats need to have COMPAT_PRECISION in front of them uniform COMPAT_PRECISION float SCANLINE_BASE_BRIGHTNESS; uniform COMPAT_PRECISION float SCANLINE_HORIZONTAL_MODULATION; uniform COMPAT_PRECISION float SCANLINE_VERTICAL_MODULATION; #else #define SCANLINE_BASE_BRIGHTNESS 0.60 #define SCANLINE_HORIZONTAL_MODULATION 0.0 #define SCANLINE_VERTICAL_MODULATION 0.75 #endif COMPAT_VARYING vec2 precalc_texel; COMPAT_VARYING vec2 precalc_scale; void main() { vec2 texel = precalc_texel; vec2 scale = precalc_scale; vec2 texel_floored = floor(texel); vec2 s = fract(texel); vec2 region_range = 0.5 - 0.5 / scale; // Figure out where in the texel to sample to get correct pre-scaled bilinear. // Uses the hardware bilinear interpolator to avoid having to sample 4 times manually. vec2 center_dist = s - 0.5; vec2 f = (center_dist - clamp(center_dist, -region_range, region_range)) * scale + 0.5; vec2 mod_texel = texel_floored + f; vec3 res = texture(Source, mod_texel / SourceSize.xy).xyz; // thick scanlines (thickness pre-calculated in vertex shader based on source resolution) vec2 sine_comp = vec2(SCANLINE_HORIZONTAL_MODULATION, SCANLINE_VERTICAL_MODULATION); vec3 scanline = res * (SCANLINE_BASE_BRIGHTNESS + dot(sine_comp * sin(vTexCoord * omega), vec2(1.0, 1.0))); FragColor = vec4(scanline.rgb, 1.0); } #endif ================================================ FILE: packages/sx05re/emuelec/shaders/sharp/shaders/sharp-bilinear-simple.glsl ================================================ /* Author: rsn8887 (based on TheMaister) License: Public domain This is an integer prescale filter that should be combined with a bilinear hardware filtering (GL_BILINEAR filter or some such) to achieve a smooth scaling result with minimum blur. This is good for pixelgraphics that are scaled by non-integer factors. The prescale factor and texel coordinates are precalculated in the vertex shader for speed. */ #if defined(VERTEX) #if __VERSION__ >= 130 #define COMPAT_VARYING out #define COMPAT_ATTRIBUTE in #define COMPAT_TEXTURE texture #else #define COMPAT_VARYING varying #define COMPAT_ATTRIBUTE attribute #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif COMPAT_ATTRIBUTE vec4 VertexCoord; COMPAT_ATTRIBUTE vec4 COLOR; COMPAT_ATTRIBUTE vec4 TexCoord; COMPAT_VARYING vec4 COL0; COMPAT_VARYING vec4 TEX0; uniform mat4 MVPMatrix; uniform int FrameDirection; uniform int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; // vertex compatibility #defines #define vTexCoord TEX0.xy #define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize #define outsize vec4(OutputSize, 1.0 / OutputSize) COMPAT_VARYING vec2 precalc_texel; COMPAT_VARYING vec2 precalc_scale; void main() { gl_Position = MVPMatrix * VertexCoord; COL0 = COLOR; TEX0.xy = TexCoord.xy; precalc_texel = vTexCoord * SourceSize.xy; precalc_scale = max(floor(outsize.xy / InputSize.xy), vec2(1.0, 1.0)); } #elif defined(FRAGMENT) #if __VERSION__ >= 130 #define COMPAT_VARYING in #define COMPAT_TEXTURE texture out vec4 FragColor; #else #define COMPAT_VARYING varying #define FragColor gl_FragColor #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif uniform int FrameDirection; uniform int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; uniform sampler2D Texture; COMPAT_VARYING vec4 TEX0; // fragment compatibility #defines #define Source Texture #define vTexCoord TEX0.xy #define texture(c, d) COMPAT_TEXTURE(c, d) #define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize #define outsize vec4(OutputSize, 1.0 / OutputSize) COMPAT_VARYING vec2 precalc_texel; COMPAT_VARYING vec2 precalc_scale; void main() { vec2 texel = precalc_texel; vec2 scale = precalc_scale; vec2 texel_floored = floor(texel); vec2 s = fract(texel); vec2 region_range = 0.5 - 0.5 / scale; // Figure out where in the texel to sample to get correct pre-scaled bilinear. // Uses the hardware bilinear interpolator to avoid having to sample 4 times manually. vec2 center_dist = s - 0.5; vec2 f = (center_dist - clamp(center_dist, -region_range, region_range)) * scale + 0.5; vec2 mod_texel = texel_floored + f; FragColor = vec4(texture(Source, mod_texel / SourceSize.xy).rgb, 1.0); } #endif ================================================ FILE: packages/sx05re/emuelec/shaders/sharp/shaders/stock.glsl ================================================ // GLSL shader autogenerated by cg2glsl.py. #if defined(VERTEX) #if __VERSION__ >= 130 #define COMPAT_VARYING out #define COMPAT_ATTRIBUTE in #define COMPAT_TEXTURE texture #else #define COMPAT_VARYING varying #define COMPAT_ATTRIBUTE attribute #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif COMPAT_VARYING float _frame_rotation; COMPAT_VARYING vec4 _color1; struct output_dummy { vec4 _color1; }; struct input_dummy { vec2 _video_size; vec2 _texture_size; vec2 _output_dummy_size; float _frame_count; float _frame_direction; float _frame_rotation; }; vec4 _oPosition1; vec4 _r0005; COMPAT_ATTRIBUTE vec4 VertexCoord; COMPAT_ATTRIBUTE vec4 COLOR; COMPAT_ATTRIBUTE vec4 TexCoord; COMPAT_VARYING vec4 COL0; COMPAT_VARYING vec4 TEX0; uniform mat4 MVPMatrix; uniform int FrameDirection; uniform int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; void main() { vec4 _oColor; vec2 _otexCoord; _r0005 = VertexCoord.x*MVPMatrix[0]; _r0005 = _r0005 + VertexCoord.y*MVPMatrix[1]; _r0005 = _r0005 + VertexCoord.z*MVPMatrix[2]; _r0005 = _r0005 + VertexCoord.w*MVPMatrix[3]; _oPosition1 = _r0005; _oColor = COLOR; _otexCoord = TexCoord.xy; gl_Position = _r0005; COL0 = COLOR; TEX0.xy = TexCoord.xy; } #elif defined(FRAGMENT) #if __VERSION__ >= 130 #define COMPAT_VARYING in #define COMPAT_TEXTURE texture out vec4 FragColor; #else #define COMPAT_VARYING varying #define FragColor gl_FragColor #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif COMPAT_VARYING float _frame_rotation; COMPAT_VARYING vec4 _color; struct output_dummy { vec4 _color; }; struct input_dummy { vec2 _video_size; vec2 _texture_size; vec2 _output_dummy_size; float _frame_count; float _frame_direction; float _frame_rotation; }; uniform sampler2D Texture; COMPAT_VARYING vec4 TEX0; uniform int FrameDirection; uniform int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; void main() { output_dummy _OUT; _OUT._color = COMPAT_TEXTURE(Texture, TEX0.xy); FragColor = _OUT._color; return; } #endif ================================================ FILE: packages/sx05re/emuelec/shaders/sharp/sharp-bilinear-2x-prescale.glslp ================================================ shaders = 2 shader0 = shaders/stock.glsl filter_linear0 = false scale_type0 = source scale0 = 2.0 shader1 = shaders/stock.glsl filter_linear1 = true ================================================ FILE: packages/sx05re/emuelec/shaders/sharp/sharp-bilinear-scanlines.glslp ================================================ shaders = 1 shader0 = shaders/sharp-bilinear-scanlines.glsl filter_linear0 = true ================================================ FILE: packages/sx05re/emuelec/shaders/sharp/sharp-bilinear-simple.glslp ================================================ shaders = 1 shader0 = shaders/sharp-bilinear-simple.glsl filter_linear0 = true ================================================ FILE: packages/sx05re/emuelec/system.d/emuelec-autostart.service ================================================ [Unit] Description=emuelec user autostart script Before=emulationstation.service After=graphical.target [Service] Type=oneshot Environment=HOME=/storage ExecStart=-/bin/bash -c ". /etc/profile; exec /bin/bash /usr/bin/emuelec_autostart.sh" RemainAfterExit=yes [Install] WantedBy=emuelec.target ================================================ FILE: packages/sx05re/emuelec/system.d/emuelec-disable_small_cores.service ================================================ [Unit] Description=emuelec disable small cores service Before=emulationstation.service After=graphical.target [Service] Type=oneshot ExecStart=/usr/bin/emuelec-utils small-cores disable RemainAfterExit=true ExecStop=/usr/bin/emuelec-utils small-cores enable [Install] WantedBy=emuelec.target ================================================ FILE: packages/sx05re/emuelec/system.d/emuelec-reboot.service ================================================ [Unit] Description=EmuELEC reboot script After=emustation.service Before=systemd-reboot.service DefaultDependencies=no [Service] Type=oneshot Environment=HOME=/storage ExecStart=-/bin/sh -c ". /etc/profile; exec /bin/sh /storage/.config/shutdown.sh reboot" RemainAfterExit=yes [Install] WantedBy=reboot.target ================================================ FILE: packages/sx05re/emuelec/system.d/emuelec-shutdown.service ================================================ [Unit] Description=EmuELEC poweroff script After=emustation.service Before=systemd-poweroff.service DefaultDependencies=no [Service] Type=oneshot Environment=HOME=/storage ExecStart=-/bin/sh -c ". /etc/profile; exec /bin/sh /storage/.config/shutdown.sh poweroff" RemainAfterExit=yes [Install] WantedBy=poweroff.target ================================================ FILE: packages/sx05re/emuelec/system.d/emuelec.target ================================================ [Unit] Description=emuelec Requires=multi-user.target graphical.target After=graphical.target #Requires=basic.target #After=basic.target Conflicts=rescue.target AllowIsolate=yes [Install] Alias=default.target ================================================ FILE: packages/sx05re/emuelec/tmpfiles.d/emuelec-dirs.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) d /storage/roms/3do 0777 root root - - d /storage/roms/BGM 0777 root root - - d /storage/roms/amiga 0777 root root - - d /storage/roms/amigacd32 0777 root root - - d /storage/roms/amstradcpc 0777 root root - - d /storage/roms/amstradgx4000 0777 root root - - d /storage/roms/apple 0777 root root - - d /storage/roms/arcade 0777 root root - - d /storage/roms/atari2600 0777 root root - - d /storage/roms/atari5200 0777 root root - - d /storage/roms/atari7800 0777 root root - - d /storage/roms/atari800 0777 root root - - d /storage/roms/atarilynx 0777 root root - - d /storage/roms/atarijaguar 0777 root root - - d /storage/roms/atarist 0777 root root - - d /storage/roms/atomiswave 0777 root root - - d /storage/roms/bezels 0777 root root - - d /storage/roms/bios 0777 root root - - d /storage/roms/bios/dc/textures 0777 root root - - d /storage/roms/bios/dc/texdump 0777 root root - - d /storage/roms/bios/dc/data 0777 root root - - d /storage/roms/bios/mame 0777 root root - - d /storage/roms/c128 0777 root root - - d /storage/roms/c16 0777 root root - - d /storage/roms/c64 0777 root root - - d /storage/roms/capcom 0777 root root - - d /storage/roms/capcom 0777 root root - - d /storage/roms/coleco 0777 root root - - d /storage/roms/cps1 0777 root root - - d /storage/roms/cps2 0777 root root - - d /storage/roms/cps3 0777 root root - - d /storage/roms/daphne 0777 root root - - d /storage/roms/daphne/roms 0777 root root - - d /storage/roms/daphne/sound 0777 root root - - d /storage/roms/downloads 0777 root root - - d /storage/roms/dreamcast 0777 root root - - d /storage/roms/easyrpg 0777 root root - - d /storage/roms/famicom 0777 root root - - d /storage/roms/fbneo 0777 root root - - d /storage/roms/fbneo/coleco 0777 root root - - d /storage/roms/fbneo/chf 0777 root root - - d /storage/roms/fbneo/gamegear 0777 root root - - d /storage/roms/fbneo/fds 0777 root root - - d /storage/roms/fbneo/megadriv 0777 root root - - d /storage/roms/fbneo/megadrive 0777 root root - - d /storage/roms/fbneo/genesis 0777 root root - - d /storage/roms/fbneo/neocd 0777 root root - - d /storage/roms/fbneo/negp 0777 root root - - d /storage/roms/fbneo/nes 0777 root root - - d /storage/roms/fbneo/msx 0777 root root - - d /storage/roms/fbneo/pce 0777 root root - - d /storage/roms/fbneo/sg1000 0777 root root - - d /storage/roms/fbneo/spectrum 0777 root root - - d /storage/roms/fbneo/sgx 0777 root root - - d /storage/roms/fbneo/sms 0777 root root - - d /storage/roms/fbneo/tg16 0777 root root - - d /storage/roms/fds 0777 root root - - d /storage/roms/fmtownsux 0777 root root - - d /storage/roms/freej2me 0777 root root - - d /storage/roms/gameandwatch 0777 root root - - d /storage/roms/gamegear 0777 root root - - d /storage/roms/gamegearh 0777 root root - - d /storage/roms/gb 0777 root root - - d /storage/roms/gba 0777 root root - - d /storage/roms/gbah 0777 root root - - d /storage/roms/gbc 0777 root root - - d /storage/roms/gbch 0777 root root - - d /storage/roms/gbh 0777 root root - - d /storage/roms/genesis 0777 root root - - d /storage/roms/genh 0777 root root - - d /storage/roms/gw 0777 root root - - d /storage/roms/intellivision 0777 root root - - d /storage/roms/mame 0777 root root - - d /storage/roms/mastersystem 0777 root root - - d /storage/roms/megadrive 0777 root root - - d /storage/roms/megadrive-japan 0777 root root - - d /storage/roms/megaduck 0777 root root - - d /storage/roms/mplayer 0777 root root - - d /storage/roms/mplayer/retroarch 0777 root root - - d /storage/roms/msx 0777 root root - - d /storage/roms/msx2 0777 root root - - d /storage/roms/n64 0777 root root - - d /storage/roms/naomi 0777 root root - - d /storage/roms/nds 0777 root root - - d /storage/roms/neocd 0777 root root - - d /storage/roms/neogeo 0777 root root - - d /storage/roms/nes 0777 root root - - d /storage/roms/nesh 0777 root root - - d /storage/roms/ngp 0777 root root - - d /storage/roms/ngpc 0777 root root - - d /storage/roms/odyssey2 0777 root root - - d /storage/roms/openbor 0777 root root - - d /storage/roms/pc 0777 root root - - d /storage/roms/pc98 0777 root root - - d /storage/roms/pcengine 0777 root root - - d /storage/roms/pcenginecd 0777 root root - - d /storage/roms/pcfx 0777 root root - - d /storage/roms/pgm2 0777 root root - - d /storage/roms/pico-8 0777 root root - - d /storage/roms/pokemini 0777 root root - - d /storage/roms/ports 0777 root root - - d /storage/roms/ports/ecwolf 0777 root root - - d /storage/roms/ikemen 0777 root root - - d /storage/roms/psp 0777 root root - - d /storage/roms/pspminis 0777 root root - - d /storage/roms/psx 0777 root root - - d /storage/roms/psx/textures 0777 root root - - d /storage/roms/saturn 0777 root root - - d /storage/roms/savestates 0777 root root - - d /storage/roms/sc-3000 0777 root root - - d /storage/roms/screenshots 0777 root root - - d /storage/roms/scummvm 0777 root root - - d /storage/roms/sega32x 0777 root root - - d /storage/roms/segacd 0777 root root - - d /storage/roms/sfc 0777 root root - - d /storage/roms/sg-1000 0777 root root - - d /storage/roms/supergrafx 0777 root root - - d /storage/roms/snes 0777 root root - - d /storage/roms/snesh 0777 root root - - d /storage/roms/snesmsu1 0777 root root - - d /storage/roms/megadrivemsu 0777 root root - - d /storage/roms/solarus 0777 root root - - d /storage/roms/splash 0777 root root - - d /storage/roms/supervision 0777 root root - - d /storage/roms/tg16 0777 root root - - d /storage/roms/tg16cd 0777 root root - - d /storage/roms/tic-80 0777 root root - - d /storage/roms/uzebox 0777 root root - - d /storage/roms/vectrex 0777 root root - - d /storage/roms/vic20 0777 root root - - d /storage/roms/videopac 0777 root root - - d /storage/roms/virtualboy 0777 root root - - d /storage/roms/wonderswan 0777 root root - - d /storage/roms/wonderswancolor 0777 root root - - d /storage/roms/x1 0777 root root - - d /storage/roms/x68000 0777 root root - - d /storage/roms/zx81 0777 root root - - d /storage/roms/zxspectrum 0777 root root - - d /tmp/cache ================================================ FILE: packages/sx05re/emuelec-emulationstation/config/es_features.cfg ================================================ ================================================ FILE: packages/sx05re/emuelec-emulationstation/config/es_input.cfg ================================================ bash /storage/.emulationstation/scripts/inputconfiguration.sh ================================================ FILE: packages/sx05re/emuelec-emulationstation/config/es_settings.cfg ================================================ ================================================ FILE: packages/sx05re/emuelec-emulationstation/config/es_systems.json ================================================ { "systems": [ { "name": "imageviewer", "fullname": "Screenshots", "manufacturer": "EmuELEC", "path": "/storage/roms/screenshots", "platform": "ignore", "theme": "imageviewer", "command": "ignore", "extensions": [ ".jpg", ".pbm", ".png" ] }, { "name": "amstradgx4000", "fullname": "Amstrad GX4000", "manufacturer": "Amstrad", "release": "1990", "hardware": "computer", "path": "/storage/roms/amstradgx4000", "platform": "gx4000", "theme": "gx4000", "command": "default", "extensions": [ ".cdt", ".cpr", ".dsk", ".m3u", ".sna", ".tap", ".voc", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "cap32", "default": true } ] } ] }, { "name": "amstradcpc", "fullname": "Amstrad CPC", "manufacturer": "Amstrad", "release": "1984", "hardware": "computer", "path": "/storage/roms/amstradcpc", "platform": "amstradcpc", "theme": "amstradcpc", "command": "default", "extensions": [ ".7z", ".cdt", ".dsk", ".m3u", ".sna", ".tap", ".voc", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "cap32", "default": true } ] } ] }, { "name": "arcade", "fullname": "Arcade", "manufacturer": "Arcade", "hardware": "arcade", "path": "/storage/roms/arcade", "platform": "arcade", "theme": "arcade", "command": "default", "extensions": [ ".7z", ".cmd", ".bighard", ".zip" ], "emulators": [ { "name": "AdvanceMame", "cores": [ { "name": "AdvanceMame" } ] }, { "name": "libretro", "cores": [ { "name": "mame2003_plus", "default": true }, { "name": "mame2010" }, { "name": "fbneo" }, { "name": "fbalpha2012" }, { "name": "mame" } ] }, { "name": "FBNEOSA", "cores": [ { "name": "FbneoSA" } ] } ] }, { "name": "mame", "fullname": "Arcade MAME", "manufacturer": "Arcade", "hardware": "arcade", "path": "/storage/roms/mame", "platform": "arcade", "theme": "mame", "command": "default", "extensions": [ ".7z", ".cmd", ".bighard", ".zip" ], "emulators": [ { "name": "AdvanceMame", "cores": [ { "name": "AdvanceMame", "default": true } ] }, { "name": "libretro", "cores": [ { "name": "mame2003_plus" }, { "name": "mame2010" }, { "name": "fbneo" }, { "name": "fbalpha2012" }, { "name": "mame" } ] }, { "name": "FBNEOSA", "cores": [ { "name": "FbneoSA" } ] } ] }, { "name": "fmtowns", "fullname": "FM Towns", "manufacturer": "Fujitsu", "release": "1989", "hardware": "computer", "path": "/storage/roms/fmtownsux", "platform": "fmtowns", "theme": "fmtowns", "command": "default", "extensions": [ ".cmd" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] } ] }, { "name": "apple2", "fullname": "Apple 2", "manufacturer": "Apple", "release": "1977", "hardware": "computer", "path": "/storage/roms/apple", "platform": "apple2", "theme": "apple2", "command": "default", "extensions": [ ".cmd" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] } ] }, { "name": "pgm2", "fullname": "PolyGame Master", "manufacturer": "IGS", "release": "2007", "hardware": "arcade", "path": "/storage/roms/pgm2", "platform": "pgm2", "theme": "pgm2", "command": "default", "extensions": [ ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] } ] }, { "name": "atari2600", "fullname": "Atari 2600", "manufacturer": "Atari", "release": "1977", "hardware": "console", "path": "/storage/roms/atari2600", "platform": "atari2600", "theme": "atari2600", "command": "default", "extensions": [ ".7z", ".a26", ".bin", ".zip" ], "emulators": [ { "name": "STELLASA", "cores": [ { "name": "STELLASA", "default": true } ] }, { "name": "libretro", "cores": [ { "name": "stella" } ] } ] }, { "name": "atari5200", "fullname": "Atari 5200", "manufacturer": "Atari", "release": "1982", "hardware": "console", "path": "/storage/roms/atari5200", "platform": "atari5200", "theme": "atari5200", "command": "default", "extensions": [ ".7z", ".a52", ".atr", ".atx", ".bin", ".cas", ".cdm", ".rom", ".xex", ".xfd", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "a5200", "default": true }, { "name": "atari800" } ] } ] }, { "name": "atari7800", "fullname": "Atari 7800", "manufacturer": "Atari", "release": "1986", "hardware": "console", "path": "/storage/roms/atari7800", "platform": "atari7800", "theme": "atari7800", "command": "default", "extensions": [ ".7z", ".a78", ".bin", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "prosystem", "default": true } ] } ] }, { "name": "atari800", "fullname": "Atari 800", "manufacturer": "Atari", "release": "1979", "hardware": "console", "path": "/storage/roms/atari800", "platform": "atari800", "theme": "atari800", "command": "default", "extensions": [ ".7z", ".a52", ".atr", ".atx", ".bas", ".bin", ".car", ".cas", ".cdm", ".rom", ".xex", ".xfd", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "atari800", "default": true } ] } ] }, { "name": "atarilynx", "fullname": "Atari Lynx", "manufacturer": "Atari", "release": "1989", "hardware": "portable", "path": "/storage/roms/atarilynx", "platform": "atarilynx", "theme": "atarilynx", "command": "default", "extensions": [ ".7z", ".lnx", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "handy", "default": true }, { "name": "mednafen_lynx" }, { "name": "gearlynx" } ] } ] }, { "name": "atarist", "fullname": "Atari ST", "manufacturer": "Atari", "release": "1985", "hardware": "computer", "path": "/storage/roms/atarist", "platform": "atarist", "theme": "atarist", "command": "default", "extensions": [ ".7z", ".dim", ".ipf", ".m3u", ".msa", ".st", ".stx", ".zip" ], "emulators": [ { "name": "HATARISA", "cores": [ { "name": "HATARISA" } ] }, { "name": "libretro", "cores": [ { "name": "hatari", "default": true } ] } ] }, { "name": "atarijaguar", "fullname": "Atari Jaguar", "manufacturer": "Atari", "release": "1993", "hardware": "console", "path": "/storage/roms/atarijaguar", "platform": "atarijaguar", "theme": "atarijaguar", "command": "default", "extensions": [ ".j64", ".jag", ".zip" ], "emulators": [ { "name": "bigpemu", "cores": [ { "name": "bigpemu", "default": true } ] }, { "name": "libretro", "cores": [ { "name": "virtualjaguar" } ] } ] }, { "name": "atarijaguarcd", "fullname": "Atari Jaguar CD", "manufacturer": "Atari", "release": "1993", "hardware": "console", "path": "/storage/roms/atarijaguarcd", "platform": "atarijaguarcd", "theme": "atarijaguarcd", "command": "default", "extensions": [ ".j64", ".jag", ".cdi", ".cue", ".cof", ".rom", ".abs", ".bigpimg", ".zip" ], "emulators": [ { "name": "bigpemu", "cores": [ { "name": "bigpemu", "default": true } ] }, { "name": "libretro", "cores": [ { "name": "virtualjaguar" } ] } ] }, { "name": "wonderswan", "fullname": "Bandai Wonderswan", "manufacturer": "Bandai", "release": "1999", "hardware": "portable", "path": "/storage/roms/wonderswan", "platform": "wonderswan", "theme": "wonderswan", "command": "default", "extensions": [ ".7z", ".ws", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mednafen_wswan", "default": true } ] } ] }, { "name": "wonderswancolor", "fullname": "Bandai Wonderswan Color", "manufacturer": "Bandai", "release": "2000", "hardware": "portable", "path": "/storage/roms/wonderswancolor", "platform": "wonderswancolor", "theme": "wonderswancolor", "command": "default", "extensions": [ ".7z", ".wsc", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mednafen_wswan", "default": true } ] } ] }, { "name": "cps1", "fullname": "Capcom PlaySystem 1", "manufacturer": "Capcom", "release": "1988", "hardware": "arcade", "path": "/storage/roms/cps1", "platform": "arcade", "theme": "cps1", "command": "default", "extensions": [ ".7z", ".zip" ], "emulators": [ { "name": "AdvanceMame", "cores": [ { "name": "AdvanceMame" } ] }, { "name": "libretro", "cores": [ { "name": "mame2003_plus" }, { "name": "mame2010" }, { "name": "fbneo", "default": true }, { "name": "fbalpha2012" }, { "name": "mame" } ] }, { "name": "FBNEOSA", "cores": [ { "name": "FbneoSA" } ] } ] }, { "name": "cps2", "fullname": "Capcom PlaySystem 2", "manufacturer": "Capcom", "release": "1993", "hardware": "arcade", "path": "/storage/roms/cps2", "platform": "arcade", "theme": "cps2", "command": "default", "extensions": [ ".7z", ".zip" ], "emulators": [ { "name": "AdvanceMame", "cores": [ { "name": "AdvanceMame" } ] }, { "name": "libretro", "cores": [ { "name": "mame2003_plus" }, { "name": "mame2010" }, { "name": "fbneo", "default": true }, { "name": "fbalpha2012" }, { "name": "mame" } ] }, { "name": "FBNEOSA", "cores": [ { "name": "FbneoSA" } ] } ] }, { "name": "cps3", "fullname": "Capcom PlaySystem 3", "manufacturer": "Capcom", "release": "1996", "hardware": "arcade", "path": "/storage/roms/cps3", "platform": "arcade", "theme": "cps3", "command": "default", "extensions": [ ".7z", ".zip" ], "emulators": [ { "name": "AdvanceMame", "cores": [ { "name": "AdvanceMame" } ] }, { "name": "libretro", "cores": [ { "name": "mame2003_plus" }, { "name": "mame2010" }, { "name": "fbneo", "default": true }, { "name": "fbalpha2012" }, { "name": "mame" } ] }, { "name": "FBNEOSA", "cores": [ { "name": "FbneoSA" } ] } ] }, { "name": "colecovision", "fullname": "ColecoVision", "manufacturer": "Coleco", "release": "1982", "hardware": "console", "path": "/storage/roms/coleco", "platform": "colecovision", "theme": "colecovision", "command": "default", "extensions": [ ".7z", ".bin", ".col", ".rom", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "bluemsx", "default": true }, { "name": "gearcoleco" }, { "name": "jollycv" } ] } ] }, { "name": "c128", "fullname": "Commodore 128", "manufacturer": "Commodore", "release": "1985", "hardware": "computer", "path": "/storage/roms/c128", "platform": "c128", "theme": "c128", "command": "default", "extensions": [ ".7z", ".crt", ".d64", ".g64", ".m3u", ".prg", ".t64", ".x64", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "vice_x128", "default": true } ] } ] }, { "name": "c64", "fullname": "Commodore 64", "manufacturer": "Commodore", "release": "1982", "hardware": "computer", "path": "/storage/roms/c64", "platform": "c64", "theme": "c64", "command": "default", "extensions": [ ".7z", ".crt", ".d64", ".m3u", ".prg", ".t64", ".tap", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "vice_x64", "default": true }, { "name": "vice_x64sc" } ] } ] }, { "name": "amiga", "fullname": "Commodore Amiga", "manufacturer": "Commodore", "release": "1985", "hardware": "computer", "path": "/storage/roms/amiga", "platform": "amiga", "theme": "amiga", "command": "default", "extensions": [ ".adf", ".adz", ".dms", ".hdf", ".ipf", ".lha", ".m3u", ".uae", ".zip" ], "emulators": [ { "name": "AMIBERRY", "cores": [ { "name": "AMIBERRY-LITE", "incompatible": [".m3u"] }, { "name": "AMIBERRY", "incompatible": [".m3u"] } ] }, { "name": "libretro", "cores": [ { "name": "puae", "default": true }, { "name": "puae2021" }, { "name": "uae4arm_32b" } ] } ] }, { "name": "amigacd32", "fullname": "Commodore Amiga CD 32", "manufacturer": "Commodore", "release": "1994", "hardware": "console", "path": "/storage/roms/amigacd32", "platform": "amigacd32", "theme": "amigacd32", "command": "default", "extensions": [ ".chd", ".cue", ".hdf", ".iso", ".lha", ".zip" ], "emulators": [ { "name": "AMIBERRY", "cores": [ { "name": "AMIBERRY-LITE", "incompatible": [".m3u"] }, { "name": "AMIBERRY", "incompatible": [".m3u"] } ] }, { "name": "libretro", "cores": [ { "name": "puae", "default": true }, { "name": "puae2021" }, { "name": "uae4arm_32b" } ] } ] }, { "name": "c16", "fullname": "Commodore Plus4", "manufacturer": "Commodore", "release": "1984", "hardware": "computer", "path": "/storage/roms/c16", "platform": "c16", "theme": "c16", "command": "default", "extensions": [ ".d64", ".g64", ".prg", ".t64", ".x64", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "vice_xplus4", "default": true } ] } ] }, { "name": "vic20", "fullname": "Commodore Vic 20", "manufacturer": "Commodore", "release": "1980", "hardware": "computer", "path": "/storage/roms/vic20", "platform": "vic20", "theme": "vic20", "command": "default", "extensions": [ ".d64", ".g64", ".t64", ".x64", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "vice_xvic", "default": true } ] } ] }, { "name": "pc", "fullname": "DOS x86", "manufacturer": "Microsoft", "release": "1981", "hardware": "computer", "path": "/storage/roms/pc", "platform": "pc", "theme": "pc", "command": "default", "extensions": [ ".bat", ".com", ".exe", ".sh", ".zip", ".iso", ".cue" ], "emulators": [ { "name": "DOSBOXSDL2", "cores": [ { "name": "DOSBOXSDL2" } ] }, { "name": "libretro", "cores": [ { "name": "dosbox_pure", "default": true }, { "name": "dosbox_svn" } ] } ] }, { "name": "pc-9800", "fullname": "NEC PC-9800", "manufacturer": "NEC", "release": "1983", "hardware": "computer", "path": "/storage/roms/pc98", "platform": "pc98", "theme": "pc98", "command": "default", "extensions": [ ".2hd", ".88d", ".98d", ".d88", ".d98", ".dup", ".fdd", ".fdi", ".hdd", ".hdi", ".hdm", ".hdn", ".nhd", ".tfd", ".thd", ".xdf", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "np2kai", "default": true }, { "name": "nekop2" } ] } ] }, { "name": "daphne", "fullname": "Daphne", "manufacturer": "Arcade", "release": "1982", "hardware": "arcade", "path": "/storage/roms/daphne", "platform": "daphne", "theme": "daphne", "command": "default", "extensions": [ ".daphne" ], "emulators": [ { "name": "HYPSEUS", "cores": [ { "name": "HYPSEUS", "default": true } ] }, { "name": "libretro", "cores": [ { "name": "daphne" } ] } ] }, { "name": "wii", "fullname": "Nintendo Wii", "manufacturer": "Nintendo", "release": "2006", "hardware": "console", "path": "/storage/roms/wii", "platform": "wii", "theme": "wii", "command": "default", "extensions": [ ".ciso", ".gcm", ".gcz", ".iso", ".rvz", ".wad", ".wbfs" ], "emulators": [ { "name": "dolphin", "cores": [ { "name": "dolphin", "default": true } ] } ] }, { "name": "gamecube", "fullname": "Nintendo GameCube", "manufacturer": "Nintendo", "release": "2001", "hardware": "console", "path": "/storage/roms/gamecube", "platform": "gc", "theme": "gc", "command": "default", "extensions": [ ".ciso", ".gcm", ".gcz", ".iso", ".rvz", ".wbfs" ], "emulators": [ { "name": "dolphin", "cores": [ { "name": "dolphin", "default": true } ] } ] }, { "name": "fbn", "fullname": "Final Burn Neo", "manufacturer": "Arcade", "hardware": "arcade", "path": "/storage/roms/fbneo", "platform": "arcade", "theme": "fbn", "command": "default", "extensions": [ ".7z", ".bighard", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "fbneo", "default": true }, { "name": "mame2003_plus" }, { "name": "fbalpha2012" } ] }, { "name": "FBNEOSA", "cores": [ { "name": "FbneoSA" } ] } ] }, { "name": "msx", "fullname": "MSX", "manufacturer": "Microsoft", "release": "1983", "hardware": "computer", "path": "/storage/roms/msx", "platform": "msx", "theme": "msx", "command": "default", "extensions": [ ".7z", ".cas", ".dsk", ".m3u", ".mx1", ".mx2", ".rom", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "bluemsx", "default": true }, { "name": "fmsx" } ] } ] }, { "name": "msx2", "fullname": "MSX2", "manufacturer": "Microsoft", "release": "1985", "hardware": "computer", "path": "/storage/roms/msx2", "platform": "msx", "theme": "msx2", "command": "default", "extensions": [ ".7z", ".cas", ".dsk", ".m3u", ".mx1", ".mx2", ".rom", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "bluemsx", "default": true }, { "name": "fmsx" } ] } ] }, { "name": "odyssey2", "fullname": "Magnavox Odyssey 2", "manufacturer": "Magnavox - Philips", "release": "1979", "hardware": "console", "path": "/storage/roms/odyssey2", "platform": "odyssey2", "theme": "odyssey2", "command": "default", "extensions": [ ".7z", ".bin", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "o2em", "default": true } ] } ] }, { "name": "intellivision", "fullname": "Mattel Intellivision", "manufacturer": "Mattel", "release": "1979", "hardware": "console", "path": "/storage/roms/intellivision", "platform": "intellivision", "theme": "intellivision", "command": "default", "extensions": [ ".7z", ".bin", ".int", ".rom", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "freeintv", "default": true } ] }, { "name": "jzintv", "cores": [ { "name": "jzintv" } ] } ] }, { "name": "mplayer", "fullname": "Media Player", "manufacturer": "EmuELEC", "release": "2020", "path": "/storage/roms/mplayer", "platform": "mplayer", "theme": "mplayer", "command": "default", "extensions": [ ".3g2", ".3gp", ".aac", ".ac3", ".aiff", ".asf", ".avi", ".divx", ".dts", ".f4f", ".f4v", ".flac", ".flv", ".hevc", ".m2p", ".m2ts", ".m3u", ".m4a", ".mkv", ".mov", ".mp3", ".mp4", ".mpeg", ".mpg", ".mxf", ".ogg", ".ogm", ".ogv", ".opus", ".pcm", ".pls", ".ps", ".rm", ".sh", ".swf", ".ts", ".twi", ".vob", ".wav", ".webm", ".wma", ".wmv", ".ytb" ], "emulators": [ { "name": "mpv", "cores": [ { "name": "mpv" } ] }, { "name": "ffplay", "cores": [ { "name": "ffplay" } ] } ] }, { "name": "vectrex", "fullname": "Milton Bradley Vectrex", "manufacturer": "Milton Bradley", "release": "1982", "hardware": "console", "path": "/storage/roms/vectrex", "platform": "vectrex", "theme": "vectrex", "command": "default", "extensions": [ ".7z", ".bin", ".gam", ".vec", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "vecx", "default": true } ] } ] }, { "name": "pcengine", "fullname": "NEC PC-Engine", "manufacturer": "NEC", "release": "1987", "hardware": "console", "path": "/storage/roms/pcengine", "platform": "pcengine", "theme": "pcengine", "command": "default", "extensions": [ ".7z", ".bin", ".pce", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mednafen_pce_fast", "default": true }, { "name": "mednafen_supergrafx" }, { "name": "geargrafx" } ] } ] }, { "name": "pcenginecd", "fullname": "NEC PC-Engine CD", "manufacturer": "NEC", "release": "1988", "hardware": "console", "path": "/storage/roms/pcenginecd", "platform": "pcenginecd", "theme": "pce-cd", "command": "default", "extensions": [ ".7z", ".bin", ".ccd", ".chd", ".cue", ".img", ".iso", ".pce", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mednafen_pce_fast", "default": true }, { "name": "mednafen_supergrafx" }, { "name": "geargrafx" } ] } ] }, { "name": "pcfx", "fullname": "NEC PC-FX", "manufacturer": "NEC", "release": "1994", "hardware": "console", "path": "/storage/roms/pcfx", "platform": "pcfx", "theme": "pcfx", "command": "default", "extensions": [ ".ccd", ".chd", ".cue", ".toc", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mednafen_pcfx", "default": true } ] } ] }, { "name": "supergrafx", "fullname": "NEC Super Grafx", "manufacturer": "NEC", "release": "1989", "hardware": "console", "path": "/storage/roms/supergrafx", "platform": "supergrafx", "theme": "supergrafx", "command": "default", "extensions": [ ".7z", ".ccd", ".chd", ".cue", ".pce", ".sgx", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mednafen_supergrafx", "default": true }, { "name": "mednafen_pce_fast" }, { "name": "geargrafx" } ] } ] }, { "name": "tg16", "fullname": "NEC TurboGrafx 16", "manufacturer": "NEC", "release": "1989", "hardware": "console", "path": "/storage/roms/tg16", "platform": "pcengine", "theme": "tg16", "command": "default", "extensions": [ ".7z", ".bin", ".pce", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mednafen_pce_fast", "default": true }, { "name": "mednafen_supergrafx" }, { "name": "geargrafx" } ] } ] }, { "name": "tg16cd", "fullname": "NEC TurboGrafx 16-CD", "manufacturer": "NEC", "release": "1989", "hardware": "console", "path": "/storage/roms/tg16cd", "platform": "pcenginecd", "theme": "tg16cd", "command": "default", "extensions": [ ".7z", ".bin", ".ccd", ".chd", ".cue", ".img", ".iso", ".pce", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mednafen_pce_fast", "default": true }, { "name": "mednafen_supergrafx" }, { "name": "geargrafx" } ] } ] }, { "name": "n64", "fullname": "Nintendo 64", "manufacturer": "Nintendo", "release": "1996", "hardware": "console", "path": "/storage/roms/n64", "platform": "n64", "theme": "n64", "command": "default", "extensions": [ ".7z", ".n64", ".v64", ".z64", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mupen64plus_next", "default": true }, { "name": "mupen64plus_next_alt" }, { "name": "mupen64plus_32b" }, { "name": "parallel_n64_32b" } ] }, { "name": "mupen64plussa", "cores": [ { "name": "rice" }, { "name": "glide64mk2" } ] } ] }, { "name": "nds", "fullname": "Nintendo DS", "manufacturer": "Nintendo", "release": "2004", "hardware": "portable", "path": "/storage/roms/nds", "platform": "nds", "theme": "nds", "command": "default", "extensions": [ ".7z", ".nds", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "melonds", "default": true }, { "name": "desmume" } ] } ] }, { "name": "nes", "fullname": "Nintendo Entertainment System", "manufacturer": "Nintendo", "release": "1985", "hardware": "console", "path": "/storage/roms/nes", "platform": "nes", "theme": "nes", "command": "default", "extensions": [ ".7z", ".nes", ".nesm", ".unf", ".unif", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "nestopia", "default": true }, { "name": "fceumm" }, { "name": "fceumm_mod" }, { "name": "mesen" } ] } ] }, { "name": "nesh", "fullname": "Nintendo Entertainment System Hacks", "manufacturer": "Nintendo", "release": "1985", "hardware": "console", "path": "/storage/roms/nesh", "platform": "nes", "theme": "nesh", "command": "default", "extensions": [ ".7z", ".nes", ".nesm", ".unf", ".unif", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "nestopia", "default": true }, { "name": "fceumm" }, { "name": "fceumm_mod" }, { "name": "mesen" } ] } ] }, { "name": "famicom", "fullname": "Nintendo Famicom", "manufacturer": "Nintendo", "release": "1983", "hardware": "console", "path": "/storage/roms/famicom", "platform": "nes", "theme": "famicom", "command": "default", "extensions": [ ".7z", ".nes", ".nesm", ".unf", ".unif", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "nestopia", "default": true }, { "name": "fceumm" }, { "name": "fceumm_mod" }, { "name": "mesen" } ] } ] }, { "name": "fds", "fullname": "Nintendo Famicom Disk System", "manufacturer": "Nintendo", "release": "1986", "hardware": "console", "path": "/storage/roms/fds", "platform": "fds", "theme": "fds", "command": "default", "extensions": [ ".7z", ".fds", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "nestopia", "default": true }, { "name": "fceumm" }, { "name": "fceumm_mod" }, { "name": "mesen" } ] } ] }, { "name": "gb", "fullname": "Nintendo Game Boy", "manufacturer": "Nintendo", "release": "1989", "hardware": "portable", "path": "/storage/roms/gb", "platform": "gb", "theme": "gb", "command": "default", "extensions": [ ".7z", ".gb", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "gambatte", "default": true }, { "name": "gearboy" }, { "name": "sameboy" }, { "name": "tgbdual" }, { "name": "mgba" }, { "name": "vbam" }, { "name": "vba_next" }, { "name": "mesen-s" } ] } ] }, { "name": "gba", "fullname": "Nintendo Game Boy Advance", "manufacturer": "Nintendo", "release": "2001", "hardware": "portable", "path": "/storage/roms/gba", "platform": "gba", "theme": "gba", "command": "default", "extensions": [ ".7z", ".gba", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mgba", "default": true }, { "name": "gpsp" }, { "name": "vbam" }, { "name": "vba_next" } ] } ] }, { "name": "gbah", "fullname": "Nintendo Game Boy Advance hacks", "manufacturer": "Nintendo", "release": "2001", "hardware": "portable", "path": "/storage/roms/gbah", "platform": "gba", "theme": "gbah", "command": "default", "extensions": [ ".7z", ".gba", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mgba", "default": true }, { "name": "gpsp" }, { "name": "vbam" }, { "name": "vba_next" } ] } ] }, { "name": "gbc", "fullname": "Nintendo Game Boy Color", "manufacturer": "Nintendo", "release": "1998", "hardware": "portable", "path": "/storage/roms/gbc", "platform": "gbc", "theme": "gbc", "command": "default", "extensions": [ ".7z", ".gb", ".gbc", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "gambatte", "default": true }, { "name": "gearboy" }, { "name": "sameboy" }, { "name": "tgbdual" }, { "name": "mgba" }, { "name": "vbam" }, { "name": "vba_next" }, { "name": "mesen-s" } ] } ] }, { "name": "gbch", "fullname": "Nintendo Game Boy Color Hacks", "manufacturer": "Nintendo", "release": "1998", "hardware": "portable", "path": "/storage/roms/gbch", "platform": "gbc", "theme": "gbch", "command": "default", "extensions": [ ".7z", ".gb", ".gbc", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "gambatte", "default": true }, { "name": "gearboy" }, { "name": "sameboy" }, { "name": "tgbdual" }, { "name": "mgba" }, { "name": "vbam" }, { "name": "vba_next" }, { "name": "mesen-s" } ] } ] }, { "name": "gbh", "fullname": "Nintendo Game Boy Hacks", "manufacturer": "Nintendo", "release": "1989", "hardware": "portable", "path": "/storage/roms/gbh", "platform": "gb", "theme": "gbh", "command": "default", "extensions": [ ".7z", ".gb", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "gambatte", "default": true }, { "name": "gearboy" }, { "name": "sameboy" }, { "name": "tgbdual" }, { "name": "mgba" }, { "name": "vbam" }, { "name": "vba_next" }, { "name": "mesen-s" } ] } ] }, { "name": "gameandwatch", "fullname": "Nintendo Game and Watch", "manufacturer": "Nintendo", "release": "1980", "hardware": "portable", "path": "/storage/roms/gameandwatch", "platform": "gameandwatch", "theme": "gameandwatch", "command": "default", "extensions": [ ".7z", ".mgw", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "gw", "default": true } ] } ] }, { "name": "sfc", "fullname": "Nintendo Super Famicom", "manufacturer": "Nintendo", "release": "1990", "hardware": "console", "path": "/storage/roms/sfc", "platform": "snes", "theme": "sfc", "command": "default", "extensions": [ ".7z", ".bs", ".bsx", ".dx2", ".fig", ".gd3", ".gd7", ".sfc", ".smc", ".st", ".swc", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "snes9x", "default": true }, { "name": "snes9x2010" }, { "name": "snes9x2002" }, { "name": "snes9x2005_plus" }, { "name": "mesen-s" }, { "name": "mednafen_supafaust" } ] } ] }, { "name": "snes", "fullname": "Nintendo Super Nintendo", "manufacturer": "Nintendo", "release": "1991", "hardware": "console", "path": "/storage/roms/snes", "platform": "snes", "theme": "snes", "command": "default", "extensions": [ ".7z", ".bs", ".bsx", ".dx2", ".fig", ".gd3", ".gd7", ".sfc", ".smc", ".st", ".swc", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "snes9x", "default": true }, { "name": "snes9x2010" }, { "name": "snes9x2002" }, { "name": "snes9x2005_plus" }, { "name": "mesen-s" }, { "name": "mednafen_supafaust" } ] } ] }, { "name": "snesh", "fullname": "Nintendo Super Nintendo Hacks", "manufacturer": "Nintendo", "release": "1991", "hardware": "console", "path": "/storage/roms/snesh", "platform": "snes", "theme": "snesh", "command": "default", "extensions": [ ".7z", ".bs", ".bsx", ".dx2", ".fig", ".gd3", ".gd7", ".sfc", ".smc", ".st", ".swc", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "snes9x", "default": true }, { "name": "snes9x2010" }, { "name": "snes9x2002" }, { "name": "snes9x2005_plus" }, { "name": "mesen-s" }, { "name": "mednafen_supafaust" } ] } ] }, { "name": "snesmsu1", "fullname": "Near's Super Nintendo MSU1", "manufacturer": "Nintendo - Near", "release": "2012", "hardware": "console", "path": "/storage/roms/snesmsu1", "platform": "snes", "theme": "snesmsu1", "command": "default", "extensions": [ ".7z", ".bs", ".bsx", ".dx2", ".fig", ".gd3", ".gd7", ".sfc", ".smc", ".st", ".swc", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "snes9x", "default": true }, { "name": "mednafen_supafaust" }, { "name": "mesen-s" } ] } ] }, { "name": "sufami", "fullname": "SuFami Turbo", "manufacturer": "Bandai", "release": "1996", "hardware": "console", "path": "/storage/roms/sufami", "platform": "snes", "theme": "sufami", "command": "default", "extensions": [ ".st", ".fig", ".bs", ".smc", ".sfc", ".zip", ".7z" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "snes9x", "default": true }, { "name": "mesen-s" } ] } ] }, { "name": "satellaview", "fullname": "Satellaview", "manufacturer": "Nintendo", "release": "1995", "hardware": "console", "path": "/storage/roms/satellaview", "platform": "snes", "theme": "satellaview", "command": "default", "extensions": [ ".st", ".fig", ".bs", ".smc", ".sfc", ".zip", ".7z" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "snes9x", "default": true }, { "name": "mesen-s" } ] } ] }, { "name": "virtualboy", "fullname": "Nintendo Virtual Boy", "manufacturer": "Nintendo", "release": "1995", "hardware": "console", "path": "/storage/roms/virtualboy", "platform": "virtualboy", "theme": "virtualboy", "command": "default", "extensions": [ ".7z", ".vb", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mednafen_vb", "default": true } ] } ] }, { "name": "philips-cdi", "fullname": "Philips CDI", "manufacturer": "Philips", "release": "1990", "hardware": "console", "path": "/storage/roms/cdi", "platform": "cdi", "theme": "cdi", "command": "default", "extensions": [ ".chd", ".iso", ".cue" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "same_cdi", "default": true } ] } ] }, { "name": "pokemini", "fullname": "Pokemon Mini", "manufacturer": "Nintendo", "release": "2001", "hardware": "portable", "path": "/storage/roms/pokemini", "platform": "pokemini", "theme": "pokemini", "command": "default", "extensions": [ ".7z", ".min", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "pokemini", "default": true } ] } ] }, { "name": "openbor", "fullname": "OpenBOR", "manufacturer": "Ports", "release": "2008", "hardware": "port", "path": "/storage/roms/openbor", "platform": "openbor", "theme": "openbor", "command": "default", "extensions": [ ".pak" ], "emulators": [ { "name": "OPENBOR", "cores": [ { "name": "OpenBOR", "default": true }, { "name": "OpenBORff" } ] } ] }, { "name": "videopac", "fullname": "Philips VideoPac", "manufacturer": "Magnavox - Philips", "release": "1978", "hardware": "console", "path": "/storage/roms/videopac", "platform": "videopac", "theme": "videopac", "command": "default", "extensions": [ ".bin", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "o2em", "default": true } ] } ] }, { "name": "3do", "fullname": "Panasonic 3DO", "manufacturer": "Panasonic", "release": "1993", "hardware": "console", "path": "/storage/roms/3do", "platform": "3do", "theme": "3do", "command": "default", "extensions": [ ".7z", ".bin", ".chd", ".cue", ".iso", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "opera", "default": true } ] } ] }, { "name": "ports", "fullname": "Ports", "manufacturer": "Ports", "release": "Varies", "hardware": "port", "path": "/storage/roms/ports_scripts", "platform": "ports", "theme": "ports", "command": "emuelecRunApp.sh %ROM% -P%SYSTEM% --core=%CORE% --emulator=%EMULATOR% --controllers=\"%CONTROLLERSCONFIG%\"", "extensions": [ ".sh" ], "emulators": [ { "name": "ports", "cores": [ { "name": "ports", "default": true } ] } ] }, { "name": "neogeo", "fullname": "SNK Neo-Geo", "manufacturer": "SNK", "release": "1990", "hardware": "console", "path": "/storage/roms/neogeo", "platform": "neogeo", "theme": "neogeo", "command": "default", "extensions": [ ".7z", ".neo", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "fbneo", "default": true }, { "name": "mame2003_plus" }, { "name": "fbalpha2012" }, { "name": "geolith" } ] }, { "name": "FBNEOSA", "cores": [ { "name": "FbneoSA" } ] } ] }, { "name": "neocd", "fullname": "SNK Neo-Geo CD", "manufacturer": "SNK", "release": "1990", "hardware": "console", "path": "/storage/roms/neocd", "platform": "neogeocd", "theme": "neogeocd", "command": "default", "extensions": [ ".7z", ".chd", ".cue", ".iso", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "neocd", "default": true }, { "name": "fbneo" } ] } ] }, { "name": "ngp", "fullname": "SNK Neo-Geo Pocket", "manufacturer": "SNK", "release": "1998", "hardware": "portable", "path": "/storage/roms/ngp", "platform": "ngp", "theme": "ngp", "command": "default", "extensions": [ ".7z", ".ngp", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mednafen_ngp", "default": true } ] } ] }, { "name": "ngpc", "fullname": "SNK Neo-Geo Pocket Color", "manufacturer": "SNK", "release": "1999", "hardware": "portable", "path": "/storage/roms/ngpc", "platform": "ngpc", "theme": "ngpc", "command": "default", "extensions": [ ".7z", ".ngc", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mednafen_ngp", "default": true } ] } ] }, { "name": "scummvm", "fullname": "ScummVM", "manufacturer": "LucasArts", "release": "1987", "hardware": "computer", "path": "/storage/roms/scummvm", "platform": "pc", "theme": "scummvm", "command": "default", "extensions": [ ".scummvm" ], "emulators": [ { "name": "SCUMMVMSA", "cores": [ { "name": "SCUMMVMSA", "default": true } ] }, { "name": "libretro", "cores": [ { "name": "scummvm" } ] } ] }, { "name": "sega32x", "fullname": "Sega 32X", "manufacturer": "Sega", "release": "1991", "hardware": "console", "path": "/storage/roms/sega32x", "platform": "sega32x", "theme": "sega32x", "command": "default", "extensions": [ ".32x", ".7z", ".bin", ".md", ".smd", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "picodrive" } ] } ] }, { "name": "segacd", "fullname": "Sega CD", "manufacturer": "Sega", "release": "1991", "hardware": "console", "path": "/storage/roms/segacd", "platform": "segacd", "theme": "segacd", "command": "default", "extensions": [ ".7z", ".chd", ".cue", ".iso", ".m3u", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "genesis_plus_gx", "default": true }, { "name": "picodrive" } ] } ] }, { "name": "dreamcast", "fullname": "Sega Dreamcast", "manufacturer": "Sega", "release": "1998", "hardware": "console", "path": "/storage/roms/dreamcast", "platform": "dreamcast", "theme": "dreamcast", "command": "default", "extensions": [ ".7z", ".cdi", ".chd", ".gdi", ".m3u", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "flycast", "default": true }, { "name": "flycast_32b" } ] }, { "name": "flycastsa", "cores": [ { "name": "flycastsa" } ] }, { "name": "flycast_dojo", "cores": [ { "name": "flycast_dojo" } ] }, { "name": "retrorun", "cores": [ { "name": "flycast" }, { "name": "flycast_32b" } ] } ] }, { "name": "atomiswave", "fullname": "Atomiswave", "manufacturer": "Sammy", "release": "2003", "hardware": "arcade", "path": "/storage/roms/atomiswave", "platform": "atomiswave", "theme": "atomiswave", "command": "default", "extensions": [ ".7z", ".bin", ".dat", ".lst", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "flycast", "default": true }, { "name": "flycast_32b" } ] }, { "name": "flycastsa", "cores": [ { "name": "flycastsa" } ] }, { "name": "flycast_dojo", "cores": [ { "name": "flycast_dojo" } ] }, { "name": "retrorun", "cores": [ { "name": "flycast" }, { "name": "flycast_32b" } ] } ] }, { "name": "gamegear", "fullname": "Sega Game Gear", "manufacturer": "Sega", "release": "1990", "hardware": "portable", "path": "/storage/roms/gamegear", "platform": "gamegear", "theme": "gamegear", "command": "default", "extensions": [ ".7z", ".bin", ".gg", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "gearsystem", "default": true }, { "name": "genesis_plus_gx" }, { "name": "picodrive" } ] } ] }, { "name": "ggh", "fullname": "Sega Game Gear Hacks", "manufacturer": "Sega", "release": "1990", "hardware": "portable", "path": "/storage/roms/gamegearh", "platform": "gamegear", "theme": "ggh", "command": "default", "extensions": [ ".7z", ".bin", ".gg", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "gearsystem", "default": true }, { "name": "genesis_plus_gx" }, { "name": "picodrive" } ] } ] }, { "name": "genesis", "fullname": "Sega Genesis", "manufacturer": "Sega", "release": "1989", "hardware": "console", "path": "/storage/roms/genesis", "platform": "genesis", "theme": "genesis", "command": "default", "extensions": [ ".68k", ".7z", ".bin", ".gen", ".md", ".sg", ".sgd", ".smd", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "genesis_plus_gx", "default": true }, { "name": "genesis_plus_gx_cart_special" }, { "name": "genesis_plus_gx_wide" }, { "name": "clownmdemu" }, { "name": "picodrive" } ] } ] }, { "name": "genh", "fullname": "Sega Genesis Hacks", "manufacturer": "Sega", "release": "1989", "hardware": "console", "path": "/storage/roms/genh", "platform": "genesis", "theme": "genh", "command": "default", "extensions": [ ".68k", ".7z", ".bin", ".gen", ".md", ".sg", ".sgd", ".smd", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "genesis_plus_gx", "default": true }, { "name": "genesis_plus_gx_wide" }, { "name": "genesis_plus_gx_cart_special" }, { "name": "clownmdemu" }, { "name": "picodrive" } ] } ] }, { "name": "mastersystem", "fullname": "Sega Master System", "manufacturer": "Sega", "release": "1985", "hardware": "console", "path": "/storage/roms/mastersystem", "platform": "mastersystem", "theme": "mastersystem", "command": "default", "extensions": [ ".7z", ".bin", ".sms", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "gearsystem", "default": true }, { "name": "genesis_plus_gx" }, { "name": "clownmdemu" }, { "name": "picodrive" } ] } ] }, { "name": "megadrive", "fullname": "Sega Mega Drive", "manufacturer": "Sega", "release": "1990", "hardware": "console", "path": "/storage/roms/megadrive", "platform": "megadrive", "theme": "megadrive", "command": "default", "extensions": [ ".68k", ".7z", ".bin", ".gen", ".md", ".sg", ".sgd", ".smd", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "genesis_plus_gx", "default": true }, { "name": "genesis_plus_gx_cart_special" }, { "name": "clownmdemu" }, { "name": "genesis_plus_gx_wide" }, { "name": "picodrive" } ] } ] }, { "name": "megadrivemsu", "fullname": "Sega Mega Drive MSU", "manufacturer": "Sega", "release": "1990", "hardware": "console", "path": "/storage/roms/megadrivemsu", "platform": "megadrive", "theme": "megadrivemsu", "command": "default", "extensions": [ ".7z", ".bin", ".gen", ".md", ".sg", ".smd", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "genesis_plus_gx_wide", "default": true }, { "name": "clownmdemu" }, { "name": "genesis_plus_gx" } ] } ] }, { "name": "megadrive-japan", "fullname": "Sega Mega Drive Japan", "manufacturer": "Sega", "release": "1988", "hardware": "console", "path": "/storage/roms/megadrive-japan", "platform": "megadrive", "theme": "megadrive-japan", "command": "default", "extensions": [ ".68k", ".7z", ".bin", ".gen", ".md", ".sg", ".sgd", ".smd", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "genesis_plus_gx", "default": true }, { "name": "genesis_plus_gx_wide" }, { "name": "clownmdemu" }, { "name": "genesis_plus_gx_cart_special" }, { "name": "picodrive" } ] } ] }, { "name": "megaduck", "fullname": "MegaDuck", "manufacturer": "Welback Holdings", "release": "1993", "hardware": "console", "path": "/storage/roms/megaduck", "platform": "megaduck", "theme": "megaduck", "command": "default", "extensions": [ ".7z", ".bin", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "sameduck", "default": true } ] } ] }, { "name": "naomi", "fullname": "Sega Naomi", "manufacturer": "Sega", "release": "1998", "hardware": "arcade", "path": "/storage/roms/naomi", "platform": "naomi", "theme": "naomi", "command": "default", "extensions": [ ".7z", ".bin", ".dat", ".lst", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "flycast", "default": true }, { "name": "flycast_32b" } ] }, { "name": "flycastsa", "cores": [ { "name": "flycastsa" } ] }, { "name": "flycast_dojo", "cores": [ { "name": "flycast_dojo" } ] }, { "name": "retrorun", "cores": [ { "name": "flycast" }, { "name": "flycast_32b" } ] } ] }, { "name": "sc-3000", "fullname": "Sega SC-3000", "manufacturer": "Sega", "release": "1983", "hardware": "computer", "path": "/storage/roms/sc-3000", "platform": "sc-3000", "theme": "sc-3000", "command": "default", "extensions": [ ".7z", ".bin", ".sg", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "bluemsx", "default": true } ] } ] }, { "name": "sg-1000", "fullname": "Sega SG-1000", "manufacturer": "Sega", "release": "1983", "hardware": "console", "path": "/storage/roms/sg-1000", "platform": "sg-1000", "theme": "sg-1000", "command": "default", "extensions": [ ".7z", ".bin", ".sg", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "gearsystem", "default": true }, { "name": "genesis_plus_gx" }, { "name": "picodrive" } ] } ] }, { "name": "saturn", "fullname": "Sega Saturn", "manufacturer": "Sega", "release": "1994", "hardware": "console", "path": "/storage/roms/saturn", "platform": "saturn", "theme": "saturn", "command": "default", "extensions": [ ".bin", ".chd", ".cue", ".iso", ".mds", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "yabasanshiro" }, { "name": "mednafen_saturn" } ] }, { "name": "yabasanshiro", "cores": [ { "name": "yabasanshiroSA" }, { "name": "yabasanshiroSA1_5", "default": true } ] } ] }, { "name": "setup", "fullname": "Setup", "manufacturer": "EmuELEC", "release": "2017", "hardware": "Amlogic", "path": "/usr/bin/scripts/setup", "platform": "setup", "theme": "setup", "command": "default", "extensions": [ ".sh" ] }, { "name": "ikemen", "fullname": "ikemen", "manufacturer": "Ports", "release": "2021", "hardware": "port", "path": "/storage/roms/ikemen", "platform": "ikemen", "theme": "ikemen", "command": "default", "extensions": [ ".exe", ".ikemen", ".pc" ], "emulators": [ { "name": "ikemen", "cores": [ { "name": "ikemen", "default": true } ] } ] }, { "name": "x68000", "fullname": "Sharp X68000", "manufacturer": "Sharp", "release": "1987", "hardware": "computer", "path": "/storage/roms/x68000", "platform": "x68000", "theme": "x68000", "command": "default", "extensions": [ ".2hd", ".7z", ".88d", ".cmd", ".d88", ".dim", ".dup", ".hdf", ".hdm", ".img", ".m3u", ".xdf", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "px68k", "default": true } ] } ] }, { "name": "x1", "fullname": "Sharp X1", "manufacturer": "Sharp", "release": "1982", "hardware": "computer", "path": "/storage/roms/x1", "platform": "x1", "theme": "sharpx1", "command": "default", "extensions": [ ".2d", ".2hd", ".7z", ".88d", ".cmd", ".d88", ".dup", ".dx1", ".hdm", ".tap", ".tfd", ".xdf", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "x1", "default": true } ] } ] }, { "name": "zxspectrum", "fullname": "Sinclair ZX Spectrum", "manufacturer": "Sinclair", "release": "1982", "hardware": "computer", "path": "/storage/roms/zxspectrum", "platform": "zxspectrum", "theme": "zxspectrum", "command": "default", "extensions": [ ".7z", ".rzx", ".scl", ".tap", ".trd", ".tzx", ".z80", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "fuse", "default": true } ] } ] }, { "name": "zx81", "fullname": "Sinclair ZX81", "manufacturer": "Sinclair", "release": "1981", "hardware": "computer", "path": "/storage/roms/zx81", "platform": "zx81", "theme": "zx81", "command": "default", "extensions": [ ".7z", ".p", ".tzx", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "81", "default": true } ] } ] }, { "name": "psx", "fullname": "Sony Playstation", "manufacturer": "Sony", "release": "1994", "hardware": "console", "path": "/storage/roms/psx", "platform": "psx", "theme": "psx", "command": "default", "extensions": [ ".7z", ".bin", ".cbn", ".ccd", ".chd", ".cue", ".img", ".iso", ".m3u", ".mdf", ".pbp", ".toc", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "pcsx_rearmed_32b", "default": true }, { "name": "pcsx_rearmed" }, { "name": "swanstation" } ] }, { "name": "Duckstation", "cores": [ { "name": "duckstation" } ] } ] }, { "name": "psp", "fullname": "Sony Playstation Portable", "manufacturer": "Sony", "release": "2004", "hardware": "portable", "path": "/storage/roms/psp", "platform": "psp", "theme": "psp", "command": "default", "extensions": [ ".cso", ".iso", ".pbp" ], "emulators": [ { "name": "PPSSPPSDL", "cores": [ { "name": "PPSSPPSDL", "default": true } ] } ] }, { "name": "pspminis", "fullname": "Sony Playstation Portable Minis", "manufacturer": "Sony", "release": "2004", "hardware": "portable", "path": "/storage/roms/pspminis", "platform": "psp", "theme": "pspminis", "command": "default", "extensions": [ ".cso", ".iso", ".pbp" ], "emulators": [ { "name": "PPSSPPSDL", "cores": [ { "name": "PPSSPPSDL", "default": true } ] } ] }, { "name": "ngage", "fullname": "Nokia N-Gage", "manufacturer": "Nokia", "release": "2003", "hardware": "portable", "path": "/storage/roms/ngage", "platform": "ngage", "theme": "ngage", "command": "default", "extensions": [ ".ngage", ".symbian", ".zip", ".sis" ], "emulators": [ { "name": "eka2l1", "cores": [ { "name": "eka2l1", "default": true } ] } ] }, { "name": "uzebox", "fullname": "uzebox", "manufacturer": "belogic", "release": "2008", "hardware": "console", "path": "/storage/roms/uzebox", "platform": "uzebox", "theme": "uzebox", "command": "default", "extensions": [ ".hex", ".uze" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "uzem" } ] } ] }, { "name": "solarus", "fullname": "Solarus", "manufacturer": "Solarus", "release": "2006", "hardware": "console", "path": "/storage/roms/solarus", "platform": "solarus", "theme": "solarus", "command": "default", "extensions": [ ".solarus" ], "emulators": [ { "name": "Solarus", "cores": [ { "name": "solarus", "default": true } ] } ] }, { "name": "pico8", "fullname": "PICO-8 fantasy console", "manufacturer": "Lexaloffle", "release": "2015", "hardware": "console", "path": "/storage/roms/pico-8", "platform": "pico8", "theme": "pico8", "command": "default", "extensions": [ ".p8", ".png" ], "emulators": [ { "name": "Pico-8", "cores": [ { "name": "Pico-8", "default": true } ] }, { "name": "libretro", "cores": [ { "name": "fake08" } ] } ] }, { "name": "prboom", "fullname": "Doom", "manufacturer": "id", "release": "1993", "hardware": "computer", "path": "/storage/roms/ports/doom", "platform": "pc", "theme": "prboom", "command": "default", "extensions": [ ".doom", ".iwad", ".pwad", ".wad" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "prboom" } ] }, { "name": "Chocolate-Doom", "cores": [ { "name": "Chocolate-Doom", "default": true } ] }, { "name": "LZDoom", "cores": [ { "name": "LZDoom" } ] }, { "name": "GZDoom", "cores": [ { "name": "GZDoom" } ] } ] }, { "name": "samcoupe", "fullname": "SAM Coupé", "manufacturer": "Miles Gordon Technology", "release": "1989", "hardware": "computer", "path": "/storage/roms/samcoupe", "platform": "samcoupe", "theme": "samcoupe", "command": "default", "extensions": [ ".dsk", ".cpm", ".sad", ".mgt", ".sdf", ".td0", ".sbt", ".zip" ], "emulators": [ { "name": "simcoupe", "cores": [ { "name": "simcoupe", "default": true } ] } ] }, { "name": "tic-80", "fullname": "TIC-80", "manufacturer": "Nesbox", "release": "2017", "hardware": "console", "path": "/storage/roms/tic-80", "platform": "tic80", "theme": "tic-80", "command": "default", "extensions": [ ".tic" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "tic80", "default": true } ] } ] }, { "name": "easyrpg", "fullname": "EasyRPG", "manufacturer": "EasyRPG", "release": "2003", "hardware": "ports", "path": "/storage/roms/easyrpg", "platform": "easyrpg", "theme": "easyrpg", "command": "default", "extensions": [ ".ldb" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "easyrpg", "default": true } ] } ] }, { "name": "ecwolf", "fullname": "Wolfenstein 3D", "manufacturer": "id", "release": "1992", "hardware": "computer", "path": "/storage/roms/ports/ecwolf/games", "platform": "pc", "theme": "ecwolf", "command": "default", "extensions": [ ".ecwolf", ".n3d", ".sd2", ".sd3", ".sod", ".wl6" ], "emulators": [ { "name": "ECWolf", "cores": [ { "name": "ecwolf", "default": true } ] } ] }, { "name": "supervision", "fullname": "Supervision", "manufacturer": "watara", "release": "1992", "hardware": "portable", "path": "/storage/roms/supervision", "platform": "supervision", "theme": "supervision", "command": "default", "extensions": [ ".7z", ".bin", ".sv", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "potator", "default": true } ] } ] }, { "name": "freej2me", "fullname": "Java Games", "manufacturer": "freej2me", "release": "2017", "hardware": "portable", "path": "/storage/roms/freej2me", "platform": "freej2me", "theme": "freej2me", "command": "default", "extensions": [ ".jar" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "freej2me", "default": true } ] } ] }, { "name": "gmloader", "fullname": "Gamemaker Loader", "manufacturer": "gmloader", "release": "2021", "hardware": "port", "path": "/storage/roms/ports/gmloader", "platform": "gmloader", "theme": "gmloader", "command": "default", "extensions": [ ".apk", ".zip" ], "emulators": [ { "name": "gmloader", "cores": [ { "name": "gmloader", "default": true } ] } ] }, { "name": "karaoke", "fullname": "Karaoke", "manufacturer": "Karaoke", "release": "2000", "hardware": "console", "path": "/storage/roms/karaoke", "platform": "karaoke", "theme": "karaoke", "command": "default", "extensions": [ ".cdg" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "pocketcdg", "default": true } ] } ] }, { "name": "channelf", "fullname": "Channel F", "manufacturer": "Fairchild", "release": "1976", "hardware": "console", "path": "/storage/roms/channelf", "platform": "channelf", "theme": "channelf", "command": "default", "extensions": [ ".bin", ".zip", ".rom", ".chf" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "freechaf", "default": true } ] } ] }, { "name": "arduboy", "fullname": "Arduboy", "manufacturer": "Kevin Bates", "release": "2015", "hardware": "portable", "path": "/storage/roms/arduboy", "platform": "arduboy", "theme": "arduboy", "command": "default", "extensions": [ ".hex", ".zip", ".7z" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "arduous", "default": true } ] } ] }, { "name": "wasm4", "fullname": "Wasm-4", "manufacturer": "Aduros", "release": "2021", "hardware": "console", "path": "/storage/roms/wasm4", "platform": "wasm4", "theme": "wasm4", "command": "default", "extensions": [ ".wasm" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "wasm4", "default": true } ] } ] }, { "name": "bbc", "fullname": "BBC Micro", "manufacturer": "Acorn Electronics", "release": "1981", "hardware": "computer", "path": "/storage/roms/bbc", "platform": "bbc", "theme": "bbc", "command": "default", "extensions": [ ".mfi", ".dfi", "hfe", ".mfm", ".td0", ".imd", ".d77", ".d88", ".ldd", ".cqm", ".cqi", ".dsk", ".ima", ".img", ".ufi", ".360", ".ipf", ".ssd", ".bbc", ".dsd", ".adf", ".ads", ".adm", ".adl", ".fsd", ".wav", ".tap", ".bin", ".zip", ".7z" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true }, { "name": "b2" } ] } ] }, { "name": "m2000", "fullname": "Philips P2000T", "manufacturer": "Philips", "release": "1980", "hardware": "computer", "path": "/storage/roms/p2000t", "platform": "m2000", "theme": "p2000t", "command": "default", "extensions": [ ".cas" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "m2000", "default": true } ] } ] }, { "name": "macintosh", "fullname": "Macintosh", "manufacturer": "Apple", "release": "1984", "hardware": "computer", "path": "/storage/roms/macintosh", "platform": "macintosh", "theme": "macintosh", "command": "default", "extensions": [ ".dsk", ".zip", ".7z", ".mfi", ".dfi", ".hfe", ".mfm", ".td0", ".imd", ".d77", ".d88", ".1dd", ".cqm", ".cqi", ".dsk", ".ima", ".img", ".ufi", ".ipf", ".dc42", ".woz", ".2mg", ".360", ".chd", ".cue", ".toc", ".nrg", ".gdi", ".iso", ".cdr", ".hd", ".hdv", ".2mg", ".hdi" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true }, { "name": "minivmac" } ] } ] }, { "name": "theodore", "fullname": "Thomson - MO/TO", "manufacturer": "Thomson", "release": "1984", "hardware": "computer", "path": "/storage/roms/thomson", "platform": "thomson", "theme": "thomson", "command": "default", "extensions": [ ".fd", ".sap", ".k7", ".m7", ".m5", ".rom", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "theodore", "default": true } ] } ] }, { "name": "vircon32", "fullname": "Vircon32", "manufacturer": "Carra", "hardware": "console", "path": "/storage/roms/vircon32", "platform": "vircon32", "theme": "vircon32", "command": "default", "extensions": [ ".v32", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "vircon32", "default": true } ] } ] }, { "name": "scv", "fullname": "Super Cassette Vision", "manufacturer": "Epoch Co.", "release": "1984", "hardware": "console", "path": "/storage/roms/scv", "platform": "scv", "theme": "scv", "command": "default", "extensions": [ ".bin", ".0" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "emuscv", "default": true } ] } ] }, { "name": "astrocde", "fullname": "Bally Astrocade", "manufacturer": "Bally Manufacturing", "release": "1978", "hardware": "console", "path": "/storage/roms/astrocde", "platform": "astrocde", "theme": "astrocde", "command": "default", "extensions": [ ".bin", ".zip", ".7z" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] } ] }, { "name": "arcadia", "fullname": "Arcadia 2001", "manufacturer": "Emerson", "release": "1982", "hardware": "console", "path": "/storage/roms/arcadia", "platform": "arcadia", "theme": "arcadia", "command": "default", "extensions": [ ".cmd", ".zip", ".7z" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] } ] }, { "name": "crvision", "fullname": "CreatiVision", "manufacturer": "VTech", "release": "1982", "hardware": "console", "path": "/storage/roms/crvision", "platform": "crvision", "theme": "crvision", "command": "default", "extensions": [ ".cmd", ".bin", ".rom", ".zip", ".7z" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true }, { "name": "jollycv" } ] } ] }, { "name": "gmaster", "fullname": "Game Master", "manufacturer": "Hartung", "release": "1990", "hardware": "portable", "path": "/storage/roms/gmaster", "platform": "gmaster", "theme": "gmaster", "command": "default", "extensions": [ ".cmd", ".bin", ".zip", ".7z" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] } ] }, { "name": "archimedes", "fullname": "Archimede", "manufacturer": "Acorn Computers", "release": "1987", "hardware": "computer", "path": "/storage/roms/archimedes", "platform": "archimedes", "theme": "archimedes", "command": "default", "extensions": [ ".cmd", ".mfi", ".dfi", ".hfe", ".mfm", ".td0", ".imd", ".d77", ".d88", ".ldd", ".cqm", ".cqi", ".dsk", ".ima", ".img", ".ufi", ".360", ".ipf", ".adf", ".apd", ".jfd", ".asd", ".adm", ".adl", ".ssd", ".bbc", ".dsd", ".st", ".msa", ".chd", ".zip", ".7z" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] } ] }, { "name": "electron", "fullname": "Electron", "manufacturer": "Acorn Computers", "release": "1983", "hardware": "computer", "path": "/storage/roms/electron", "platform": "electron", "theme": "electron", "command": "default", "extensions": [ ".cmd", ".bin", ".zip", ".wav", ".csw", ".uef", ".mfi", ".dfi", ".hfe", ".mfm", ".td0", ".imd", ".d77", ".d88", ".ldd", ".cqm", ".cqi", ".dsk", ".ssd", ".bbc", ".img", ".dsd", ".adf", ".ads", ".adm", ".adl", ".rom", ".7z" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] } ] }, { "name": "pc88", "fullname": "NEC PC-8800", "manufacturer": "NEC", "release": "1981", "hardware": "computer", "path": "/storage/roms/pc88", "platform": "pc88", "theme": "pc88", "command": "default", "extensions": [ ".d88", ".u88", ".m3u" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "quasi88", "default": true } ] } ] }, { "name": "apfm1000", "fullname": "APF-MP1000", "manufacturer": "APF Electronics", "release": "1978", "hardware": "console", "path": "/storage/roms/apfm1000", "platform": "apfm1000", "theme": "apfm1000", "command": "default", "extensions": [ ".bin", ".zip", ".7z", ".cmd" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] } ] }, { "name": "gamecom", "fullname": "Game.com", "manufacturer": "Tiger Electronics", "release": "1997", "hardware": "portable", "path": "/storage/roms/gamecom", "platform": "gamecom", "theme": "gamecom", "command": "default", "extensions": [ ".bin", ".tgc", ".zip", ".7z", ".cmd" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] } ] }, { "name": "vc4000", "fullname": "Interton Video Computer 4000", "manufacturer": "Interton", "release": "1978", "hardware": "console", "path": "/storage/roms/vc4000", "platform": "vc4000", "theme": "vc4000", "command": "default", "extensions": [ ".bin", ".rom", ".pgm", ".tvc", ".zip", ".7z", ".cmd" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] } ] }, { "name": "advision", "fullname": "Adventure Vision", "manufacturer": "Entex Industries", "release": "1982", "hardware": "console", "path": "/storage/roms/advision", "platform": "advision", "theme": "advision", "command": "default", "extensions": [ ".bin", ".zip", ".7z", ".cmd" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] } ] }, { "name": "vsmile", "fullname": "V.Smile", "manufacturer": "Vtech", "release": "2005", "hardware": "console", "path": "/storage/roms/vsmile", "platform": "vsmile", "theme": "vsmile", "command": "default", "extensions": [ ".u1", ".u3", ".bin", ".zip", ".7z", ".cmd" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] } ] }, { "name": "socrates", "fullname": "Socrates", "manufacturer": "Vtech", "release": "1988", "hardware": "console", "path": "/storage/roms/socrates", "platform": "socrates", "theme": "socrates", "command": "default", "extensions": [ ".bin", ".zip", ".7z", ".cmd" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] } ] }, { "name": "ti99", "fullname": "Texas Instruments TI-99/4A", "manufacturer": "Texas Instruments", "release": "1979", "hardware": "computer", "path": "/storage/roms/ti99", "platform": "ti99", "theme": "ti99", "command": "default", "extensions": [ ".rpk", ".wav", ".zip", ".7z", ".ctg", ".cmd" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] }, { "name": "ti99sim", "cores": [ { "name": "ti99sim" } ] } ] }, { "name": "multivision", "fullname": "Othello Multivision", "manufacturer": "Tsukuda Original", "release": "1983", "hardware": "console", "path": "/storage/roms/multivision", "platform": "multivision", "theme": "multivision", "command": "default", "extensions": [ ".bin", ".sg", ".zip", ".7z" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "picodrive", "default": true } ] } ] }, { "name": "tutor", "fullname": "Tomy Tutor", "manufacturer": "Tomy", "release": "1983", "hardware": "computer", "path": "/storage/roms/tutor", "platform": "tutor", "theme": "tutor", "command": "default", "extensions": [ ".bin", ".wav", ".zip", ".7z", ".cmd" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] } ] }, { "name": "pico8", "fullname": "Sega Pico", "manufacturer": "Sega", "release": "1993", "hardware": "console", "path": "/storage/roms/pico", "platform": "pico", "theme": "pico", "command": "default", "extensions": [ ".bin", ".md", ".zip", ".7z" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "genesis_plus_gx", "default": true } ] } ] }, { "name": "zmachine", "fullname": "Z-Machine", "manufacturer": "", "release": "", "hardware": "", "path": "/storage/roms/zmachine", "platform": "zmachine", "theme": "zmachine", "command": "default", "extensions": [ ".dat", ".zip", ".z1", ".z2", ".z3", ".z4", ".z5", ".z6", ".z7", ".z8" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mojozork", "default": true } ] } ] }, { "name": "chip8", "fullname": "CHIP-8", "manufacturer": "Joseph Weisbecker", "release": "1978", "hardware": "console", "path": "/storage/roms/chip8", "platform": "chip8", "theme": "chip8", "command": "default", "extensions": [ ".ch8" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "jaxe", "default": true } ] } ] }, { "name": "fm7", "fullname": "Fujitsu Micro 7", "manufacturer": "Fujitsu", "release": "1982", "hardware": "computer", "path": "/storage/roms/fm7", "platform": "fm7", "theme": "fm7", "command": "default", "extensions": [ ".wav", ".t77", ".mfi", ".dfi", ".hfe", ".mfm", ".td0", ".imd", ".d77", ".d88", ".1dd", ".cqm", ".cqi", ".dsk", ".zip", ".7z", ".cmd" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "mame", "default": true } ] } ] }, { "name": "dragon32", "fullname": "Dragon 32", "manufacturer": "Dragon Data", "release": "1982", "hardware": "computer", "path": "/storage/roms/dragon32", "platform": "dragon32", "theme": "dragon32", "command": "default", "extensions": [ ".cas", ".wav", ".k7", ".vdk", ".jvc", ".dsk", ".cmd", ".zip", ".7z" ], "emulators": [ { "name": "xroar", "cores": [ { "name": "xroar", "default": true } ] }, { "name": "libretro", "cores": [ { "name": "mame" } ] } ] }, { "name": "dragon64", "fullname": "Dragon 64", "manufacturer": "Dragon Data", "release": "1983", "hardware": "computer", "path": "/storage/roms/dragon64", "platform": "dragon64", "theme": "dragon64", "command": "default", "extensions": [ ".cas", ".wav", ".k7", ".vdk", ".jvc", ".dsk", ".cmd", ".zip", ".7z" ], "emulators": [ { "name": "xroar", "cores": [ { "name": "xroar", "default": true } ] }, { "name": "libretro", "cores": [ { "name": "mame" } ] } ] }, { "name": "coco", "fullname": "TRS-80 CoCo", "manufacturer": "Tandy", "release": "1980", "hardware": "computer", "path": "/storage/roms/coco", "platform": "coco", "theme": "coco", "command": "default", "extensions": [ ".cas", ".wav", ".k7", ".vdk", ".jvc", ".dsk", ".cmd", ".zip", ".7z" ], "emulators": [ { "name": "xroar", "cores": [ { "name": "xroar", "default": true } ] }, { "name": "libretro", "cores": [ { "name": "mame" } ] } ] }, { "name": "coco3", "fullname": "TRS-80 CoCo 3", "manufacturer": "Tandy", "release": "1986", "hardware": "computer", "path": "/storage/roms/coco3", "platform": "coco3", "theme": "coco3", "command": "default", "extensions": [ ".cas", ".wav", ".k7", ".vdk", ".jvc", ".dsk", ".cmd", ".zip", ".7z" ], "emulators": [ { "name": "xroar", "cores": [ { "name": "xroar", "default": true } ] }, { "name": "libretro", "cores": [ { "name": "mame" } ] } ] }, { "name": "mc10", "fullname": "Tandy MC-10", "manufacturer": "Tandy", "release": "1983", "hardware": "computer", "path": "/storage/roms/mc10", "platform": "mc10", "theme": "mc10", "command": "default", "extensions": [ ".c10", ".k7", ".cmd", ".zip", ".7z" ], "emulators": [ { "name": "xroar", "cores": [ { "name": "xroar", "default": true } ] }, { "name": "libretro", "cores": [ { "name": "mame" } ] } ] }, { "name": "oricutron", "fullname": "Oric Atmos", "manufacturer": "Tangerine Computer Systems", "release": "1984", "hardware": "computer", "path": "/storage/roms/oricatmos", "platform": "oricatmos", "theme": "oricatmos", "command": "default", "extensions": [ ".tap", ".dsk", ".cmd", ".zip" ], "emulators": [ { "name": "oricutron", "cores": [ { "name": "oricutron", "default": true } ] }, { "name": "libretro", "cores": [ { "name": "mame" } ] } ] }, { "name": "x16", "fullname": "Commander X16", "manufacturer": "X16Community", "release": "2020", "hardware": "computer", "path": "/storage/roms/x16", "platform": "x16", "theme": "x16", "command": "default", "extensions": [ ".prg", ".bas", ".img", ".crt" ], "emulators": [ { "name": "x16emu", "cores": [ { "name": "x16emu", "default": true } ] } ] }, { "name": "dice", "fullname": "Discrete Integrated Circuit Emulator", "manufacturer": "", "release": "2008", "hardware": "computer", "path": "/storage/roms/dice", "platform": "dice", "theme": "dice", "command": "default", "extensions": [ ".zip", ".dmy" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "dice", "default": true } ] } ] }, { "name": "lowresnx", "fullname": "Lowres NX", "manufacturer": "", "release": "", "hardware": "computer", "path": "/storage/roms/lowresnx", "platform": "lowresnx", "theme": "lowresnx", "command": "default", "extensions": [ ".nx", ".zip", ".7z." ], "emulators": [ { "name": "libretro", "cores": [ { "name": "lowresnx", "default": true } ] } ] }, { "name": "bk", "fullname": "Electronika", "path": "/storage/roms/bk", "platform": "bk", "theme": "bk", "command": "default", "extensions": [ ".bin", ".zip" ], "emulators": [ { "name": "libretro", "cores": [ { "name": "bk", "default": true } ] } ] } ] } ================================================ FILE: packages/sx05re/emuelec-emulationstation/config/resources/services/index.html ================================================ EmuELEC-EmulationStation Web services
ES

EmuELEC-EmulationStation Web Services

Ready

Select a system to view games

================================================ FILE: packages/sx05re/emuelec-emulationstation/config/resources/services/main.css ================================================ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; background: linear-gradient(135deg, #764ba2 0%, #222655 100%); color: #333; height: 100vh; overflow: hidden; } .container { display: flex; flex-direction: column; height: 100vh; max-width: 1800px; margin: 0 auto; background: rgba(255, 255, 255, 0.95); box-shadow: 0 0 50px rgba(0, 0, 0, 0.3); } .header { background: linear-gradient(135deg, #764ba2 0%, #222655 100%); color: white; padding: 20px 30px; display: flex; align-items: center; justify-content: space-between; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); } .header-left { display: flex; align-items: center; gap: 15px; } .header-left img { height: 32px; } .header-left h1 { font-size: 24px; font-weight: 600; } .status-bar { display: flex; gap: 20px; font-size: 14px; } .status-item { display: flex; align-items: center; gap: 8px; background: rgba(255, 255, 255, 0.2); padding: 6px 12px; border-radius: 6px; } .status-dot { width: 8px; height: 8px; border-radius: 50%; background: #4ade80; animation: pulse 2s infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } .toolbar { background: #51447d; padding: 15px 30px; border-bottom: 1px solid #e2e8f0; display: flex; gap: 10px; flex-wrap: wrap; } .btn { padding: 10px 20px; border: none; border-radius: 8px; cursor: pointer; font-size: 14px; font-weight: 500; transition: all 0.2s; display: flex; align-items: center; gap: 8px; } .btn:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } .btn-primary { background: #667eea; color: white; } .btn-danger { background: #ef4444; color: white; } .btn-warning { background: #f59e0b; color: white; } .btn-secondary { background: #64748b; color: white; } .main-content { display: flex; flex: 1; overflow: hidden; } .sidebar { width: 280px; background: #1e293b; color: white; overflow-y: auto; border-right: 1px solid #334155; } .sidebar h3 { padding: 20px; font-size: 14px; text-transform: uppercase; letter-spacing: 1px; color: #94a3b8; } .system-item { padding: 15px 20px; cursor: pointer; transition: all 0.2s; border-left: 3px solid transparent; display: flex; align-items: center; gap: 12px; } .system-item:hover { background: #334155; border-left-color: #667eea; } .system-item.active { background: #334155; border-left-color: #667eea; } .system-item img { height: 24px; max-width: 60px; object-fit: contain; } .system-info { flex: 1; } .system-name { font-weight: 500; font-size: 14px; } .system-count { font-size: 12px; color: #94a3b8; margin-top: 2px; } .content-area { flex: 1; display: flex; flex-direction: column; overflow: hidden; } .search-bar { padding: 20px 30px; background: white; border-bottom: 1px solid #e2e8f0; } .search-input { width: 100%; padding: 12px 20px; border: 2px solid #e2e8f0; border-radius: 8px; font-size: 14px; transition: all 0.2s; } .search-input:focus { outline: none; border-color: #667eea; } .games-grid { flex: 1; overflow-y: auto; padding: 30px; } .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 24px; } .game-card { background: white; border-radius: 12px; overflow: hidden; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); transition: all 0.3s; cursor: pointer; } .game-card:hover { transform: translateY(-4px); box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15); } .game-image { width: 100%; height: 200px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); display: flex; align-items: center; justify-content: center; position: relative; overflow: hidden; } .game-image img { width: 100%; height: 100%; object-fit: cover; } .game-image-placeholder { font-size: 48px; color: rgba(255, 255, 255, 0.5); } .game-info { padding: 16px; } .game-name { font-weight: 600; font-size: 16px; margin-bottom: 8px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .game-desc { font-size: 13px; color: #64748b; line-height: 1.5; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; margin-bottom: 8px; } .game-meta { font-size: 11px; color: #94a3b8; line-height: 1.4; padding-top: 8px; border-top: 1px solid #e2e8f0; } .game-actions { padding: 12px 16px; border-top: 1px solid #e2e8f0; display: grid; grid-template-columns: 1fr auto 1fr auto; gap: 8px; } .game-btn { padding: 8px 12px; border: none; border-radius: 6px; cursor: pointer; font-size: 12px; font-weight: 500; transition: all 0.2s; } .game-btn:hover { opacity: 0.9; } .game-btn-play { background: #667eea; color: white; } .game-btn-info { background: #e2e8f0; color: #334155; } .game-btn-favorite { background: white; border: 2px solid #94a3b8; color: #94a3b8; font-size: 16px; padding: 4px 8px; } .game-btn-scrape { background: #64748b; color: white; } .modal { display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.7); z-index: 1000; align-items: center; justify-content: center; } .modal.active { display: flex; } .modal-content { background: white; border-radius: 16px; width: 90%; max-width: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); } .modal-header { padding: 24px; border-bottom: 1px solid #e2e8f0; display: flex; justify-content: space-between; align-items: center; } .modal-title { font-size: 20px; font-weight: 600; } .modal-close { background: none; border: none; font-size: 24px; cursor: pointer; color: #64748b; padding: 0; width: 32px; height: 32px; border-radius: 6px; transition: all 0.2s; } .modal-close:hover { background: #f1f5f9; } .modal-body { padding: 24px; } .loading { text-align: center; padding: 60px 30px; color: #64748b; } .spinner { width: 48px; height: 48px; border: 4px solid #e2e8f0; border-top-color: #667eea; border-radius: 50%; animation: spin 1s linear infinite; margin: 0 auto 20px; } @keyframes spin { to { transform: rotate(360deg); } } .empty-state { text-align: center; padding: 60px 30px; color: #64748b; } .empty-state-icon { font-size: 64px; margin-bottom: 16px; opacity: 0.3; } ::-webkit-scrollbar { width: 10px; height: 10px; } ::-webkit-scrollbar-track { background: #f1f5f9; } ::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 5px; } ::-webkit-scrollbar-thumb:hover { background: #94a3b8; } .tabs { display: flex; gap: 4px; border-bottom: 1px solid #e2e8f0; margin-bottom: 20px; } .tab { padding: 12px 20px; background: none; border: none; cursor: pointer; font-size: 14px; font-weight: 500; color: #64748b; border-bottom: 2px solid transparent; transition: all 0.2s; } .tab:hover { color: #334155; } .tab.active { color: #667eea; border-bottom-color: #667eea; } .form-group { margin-bottom: 20px; } .form-label { display: block; font-size: 14px; font-weight: 500; margin-bottom: 8px; color: #334155; } .form-input, .form-textarea { width: 100%; padding: 10px 14px; border: 2px solid #e2e8f0; border-radius: 8px; font-size: 14px; transition: all 0.2s; } .form-textarea { resize: vertical; min-height: 100px; } .form-input:focus, .form-textarea:focus { outline: none; border-color: #667eea; } .media-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 12px; margin-top: 12px; } .media-item { aspect-ratio: 1; background: #f1f5f9; border-radius: 8px; overflow: hidden; position: relative; } .media-item img { width: 100%; height: 100%; object-fit: cover; } .config-editor { padding: 30px; height: 100%; display: flex; flex-direction: column; } .config-editor-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; padding-bottom: 15px; border-bottom: 2px solid #e2e8f0; } .config-editor-title { font-size: 20px; font-weight: 600; color: #1e293b; } .config-editor-actions { display: flex; gap: 10px; } .config-textarea { flex: 1; width: 100%; padding: 15px; border: 2px solid #e2e8f0; border-radius: 8px; font-family: 'Courier New', monospace; font-size: 13px; line-height: 1.5; resize: none; } .config-textarea:focus { outline: none; border-color: #667eea; } .breadcrumb { padding: 15px 20px; background: #f8fafc; border-bottom: 1px solid #e2e8f0; font-size: 14px; color: #64748b; } .breadcrumb a { color: #667eea; text-decoration: none; cursor: pointer; } .breadcrumb a:hover { text-decoration: underline; } .file-list-item { padding: 12px 20px; cursor: pointer; transition: all 0.2s; border-left: 3px solid transparent; display: flex; align-items: center; gap: 10px; } .file-list-item:hover { background: #334155; border-left-color: #667eea; } .file-icon { font-size: 16px; width: 20px; } .file-name { flex: 1; font-size: 13px; } .tools-section { max-width: 1200px; margin: 0 auto; } .tools-section h2 { color: #334155; margin-bottom: 30px; } .tool-card { background: white; padding: 30px; border-radius: 12px; margin-bottom: 30px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } .tool-card h3 { color: #334155; margin-bottom: 15px; } .tool-card p { color: #64748b; margin-bottom: 15px; } .tool-input { width: 100%; padding: 10px; background: white; color: #334155; border: 2px solid #e2e8f0; border-radius: 8px; font-size: 14px; margin-bottom: 15px; } .tool-input:focus { outline: none; border-color: #667eea; } .tool-textarea { width: 100%; padding: 15px; background: white; color: #334155; border: 2px solid #e2e8f0; border-radius: 8px; font-family: monospace; font-size: 12px; margin-bottom: 15px; resize: vertical; } .tool-textarea:focus { outline: none; border-color: #667eea; } .tool-result { margin-top: 15px; padding: 15px; background: #f1f5f9; border-radius: 8px; color: #334155; display: none; } .tool-label { display: block; color: #334155; margin-bottom: 8px; font-weight: 500; } .notification-banner { position: fixed; top: 0; left: 0; right: 0; padding: 15px 20px; z-index: 10000; display: flex; align-items: center; justify-content: space-between; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); animation: slideDown 0.3s ease; } @keyframes slideDown { from { transform: translateY(-100%); } to { transform: translateY(0); } } .notification-success { background: #10b981; color: white; } .notification-error { background: #ef4444; color: white; } .notification-info { background: #3b82f6; color: white; } /* Mobile Responsive Styles */ @media (max-width: 768px) { .header { flex-direction: column; padding: 15px; gap: 10px; } .header-left h1 { font-size: 18px; } .status-bar { flex-wrap: wrap; gap: 10px; font-size: 12px; } .toolbar { padding: 10px; gap: 5px; } .btn { padding: 8px 12px; font-size: 12px; } .main-content { flex-direction: column; } .sidebar { width: 100%; max-height: 200px; border-right: none; border-bottom: 1px solid #334155; } .search-bar > div { flex-direction: column; gap: 10px; } .search-bar select, .search-bar button { width: 100% !important; flex: none !important; } .grid { grid-template-columns: 1fr; gap: 16px; } .game-card { max-width: 100%; } .game-actions { grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; gap: 6px; } .game-btn { font-size: 11px; padding: 8px 6px; } .modal-content { width: 95%; max-height: 80vh; } .tools-section { padding: 0 15px; } .tool-card { padding: 20px 15px; } .config-editor { padding: 15px; } .config-editor-header { flex-direction: column; align-items: flex-start; gap: 10px; } .config-editor-actions { width: 100%; flex-direction: column; } .config-editor-actions .btn { width: 100%; } } @media (max-width: 480px) { .header-left h1 { font-size: 16px; } .header-left img { height: 24px; } .btn { padding: 6px 10px; font-size: 11px; } .system-item { padding: 10px 15px; } .system-name { font-size: 13px; } .games-grid { padding: 15px; } .game-name { font-size: 14px; } .game-desc { font-size: 12px; } .tool-card h3 { font-size: 16px; } .tool-textarea { font-size: 11px; } } ================================================ FILE: packages/sx05re/emuelec-emulationstation/config/resources/services/main.js ================================================ var app = { currentSystem: null, allGames: [], systems: [], currentGameDetail: null, currentView: 'games', currentConfigPath: '', configContent: '', scrapingInProgress: false, scrapingCheckInterval: null, init: function() { this.loadSystems(); this.updateStatus(); var self = this; setInterval(function() { self.updateStatus(); }, 5000); this.populateSystemSelects(); }, request: function(method, endpoint, body, contentType) { var xhr = new XMLHttpRequest(); xhr.open(method, endpoint, false); if (body && contentType) { xhr.setRequestHeader('Content-Type', contentType); } try { xhr.send(body || null); return xhr; } catch (error) { console.error('Request failed:', error); this.showNotificationBanner('Request failed: ' + error.message, 'error'); return null; } }, loadSystems: function() { var xhr = this.request('GET', '/systems'); if (xhr && xhr.status === 200) { var systems = JSON.parse(xhr.responseText); this.systems = systems; this.displaySystems(systems); } }, displaySystems: function(systems) { var html = ''; for (var i = 0; i < systems.length; i++) { var s = systems[i]; if (s.visible === 'true') { html += '
'; if (s.logo) { html += '' + s.fullname + ''; } else { html += '[ ]'; } html += '
'; html += '
' + s.fullname + '
'; html += '
' + (s.totalGames || 0) + ' games
'; html += '
'; } } document.getElementById('systemList').innerHTML = html; }, selectSystem: function(systemName) { this.currentSystem = systemName; var items = document.querySelectorAll('.system-item'); for (var i = 0; i < items.length; i++) { items[i].classList.remove('active'); } if (event.target.closest) { event.target.closest('.system-item').classList.add('active'); } document.getElementById('gamesContainer').innerHTML = '

Loading games...

'; var xhr = this.request('GET', '/systems/' + systemName + '/games'); if (xhr && xhr.status === 200) { var games = JSON.parse(xhr.responseText); this.allGames = games; this.filterGames(); // Apply current filters instead of directly sorting } }, displayGames: function(games) { if (games.length === 0) { document.getElementById('gamesContainer').innerHTML = '
' + '
[ ]
' + '

No games found

' + '
'; return; } var html = '
'; for (var i = 0; i < games.length; i++) { var g = games[i]; var escapedPath = g.path.replace(/'/g, "\\'"); var isFavorite = g.favorite === 'true' || g.favorite === true; var heartIcon = isFavorite ? '❤' : '♡'; var heartColor = isFavorite ? '#ef4444' : '#94a3b8'; html += '
'; html += '
'; if (g.image) { html += '' + g.name + ''; } else { html += '
*
'; } html += '
'; html += '
'; html += '
' + g.name + '
'; if (g.desc) { html += '
' + g.desc + '
'; } // Add metadata info var metaInfo = []; // Year if (g.releasedate) { var year = g.releasedate.substring(0, 4); metaInfo.push('Year: ' + year); } // Developer/Publisher var devPub = []; if (g.developer) devPub.push(g.developer); if (g.publisher) devPub.push(g.publisher); if (devPub.length > 0) { metaInfo.push('By: ' + devPub.join('/')); } // Platform if (this.currentSystem) { var systemName = ''; for (var j = 0; j < this.systems.length; j++) { if (this.systems[j].name === this.currentSystem) { systemName = this.systems[j].fullname; break; } } if (systemName) { metaInfo.push('Platform: ' + systemName); } } // Genre if (g.genre) { metaInfo.push('Genre: ' + g.genre); } // Play count if (g.playcount) { metaInfo.push('Play count: ' + g.playcount); } // Cheevos var hasCheevos = (g.cheevosHash && g.cheevosHash !== '') && (g.cheevosId && g.cheevosId !== ''); metaInfo.push('Cheevos: ' + (hasCheevos ? 'Yes' : 'No')); if (metaInfo.length > 0) { html += '
' + metaInfo.join(' | ') + '
'; } html += '
'; html += '
'; html += ''; html += ''; html += ''; html += ''; html += '
'; } html += '
'; document.getElementById('gamesContainer').innerHTML = html; }, filterGames: function() { var searchInput = document.getElementById('searchInput'); var filterFieldSelect = document.getElementById('filterField'); var invertFilterCheckbox = document.getElementById('invertFilter'); // If elements don't exist yet, just sort and display all games if (!searchInput || !filterFieldSelect || !invertFilterCheckbox) { this.sortAndDisplayGames(this.allGames); return; } var search = searchInput.value.toLowerCase(); var filterField = filterFieldSelect.value; var invertFilter = invertFilterCheckbox.checked; var filtered = []; for (var i = 0; i < this.allGames.length; i++) { var g = this.allGames[i]; // Apply search filter var matchesSearch = !search || g.name.toLowerCase().indexOf(search) !== -1 || (g.desc && g.desc.toLowerCase().indexOf(search) !== -1); if (!matchesSearch) continue; // Apply metadata filter var matchesFilter = true; if (filterField) { if (filterField === 'notscraped') { // Game is "not scraped" if it lacks both image and video var hasImage = g.image && g.image !== ''; var hasVideo = g.video && g.video !== ''; matchesFilter = !hasImage && !hasVideo; } else if (filterField === 'favorite') { // Special handling for favorite - check if it's true matchesFilter = (g.favorite === 'true' || g.favorite === true); } else if (filterField === 'hascheevos') { // Check if both cheevosHash and cheevosId are filled var hasCheevosHash = g.cheevosHash && g.cheevosHash !== ''; var hasCheevosId = g.cheevosId && g.cheevosId !== ''; matchesFilter = hasCheevosHash && hasCheevosId; } // Invert filter if checkbox is checked if (invertFilter) { matchesFilter = !matchesFilter; } } if (matchesFilter) { filtered.push(g); } } this.sortAndDisplayGames(filtered); }, sortGames: function() { this.filterGames(); }, sortAndDisplayGames: function(games) { var sortField = document.getElementById('sortField').value; var sortOrder = document.getElementById('sortOrder').value; games.sort(function(a, b) { var aVal = a[sortField]; var bVal = b[sortField]; if (aVal === undefined) aVal = ''; if (bVal === undefined) bVal = ''; if (sortField === 'rating' || sortField === 'playcount' || sortField === 'gametime' || sortField === 'players') { aVal = parseFloat(aVal) || 0; bVal = parseFloat(bVal) || 0; } if (sortField === 'favorite') { aVal = (aVal === 'true' || aVal === true) ? 1 : 0; bVal = (bVal === 'true' || bVal === true) ? 1 : 0; } var comparison = 0; if (aVal > bVal) comparison = 1; else if (aVal < bVal) comparison = -1; return sortOrder === 'desc' ? -comparison : comparison; }); this.displayGames(games); }, toggleFavorite: function(gamePath) { var game = null; for (var i = 0; i < this.allGames.length; i++) { if (this.allGames[i].path === gamePath) { game = this.allGames[i]; break; } } if (!game) return; var isFavorite = game.favorite === 'true' || game.favorite === true; var newFavorite = !isFavorite; var gameJson = JSON.stringify({ favorite: newFavorite.toString() }); var xhr = this.request('POST', '/systems/' + this.currentSystem + '/games/' + game.id, gameJson, 'application/json'); if (xhr && xhr.status === 200) { game.favorite = newFavorite.toString(); this.filterGames(); this.showNotificationBanner(newFavorite ? 'Added to favorites' : 'Removed from favorites', 'success'); } else { this.showNotificationBanner('Failed to update favorite status', 'error'); } }, scrapeGame: function(gamePath) { var game = null; for (var i = 0; i < this.allGames.length; i++) { if (this.allGames[i].path === gamePath) { game = this.allGames[i]; break; } } if (!game) return; if (!confirm('Scrape metadata and media for: ' + game.name + '?')) { return; } var xhr = this.request('POST', '/scrape/' + this.currentSystem, game.path, 'text/plain'); if (xhr && xhr.status === 200) { this.showNotificationBanner('Scraping started for ' + game.name, 'info'); this.startScrapingMonitor(); } else if (xhr && xhr.status === 409) { this.showNotificationBanner('Scraper is already running. Please wait for it to finish.', 'error'); } else if (xhr && xhr.status === 404) { this.showNotificationBanner('Game not found.', 'error'); } else { this.showNotificationBanner('Failed to start scraping', 'error'); } }, scrapeSystem: function() { if (!this.currentSystem) { this.showNotificationBanner('Please select a system first', 'error'); return; } if (!confirm('Scrape all games in ' + this.currentSystem + '?\n\nThis may take a long time depending on the number of games.')) { return; } var xhr = this.request('POST', '/scrape/' + this.currentSystem); if (xhr && xhr.status === 200) { this.showNotificationBanner('System scraping started. Monitoring progress...', 'info'); this.startScrapingMonitor(); } else if (xhr && xhr.status === 409) { this.showNotificationBanner('Scraper is already running. Please wait for it to finish.', 'error'); } else { this.showNotificationBanner('Failed to start system scraping', 'error'); } }, startScrapingMonitor: function() { if (this.scrapingInProgress) { return; } this.scrapingInProgress = true; document.getElementById('statusText').textContent = 'Scraping...'; var self = this; this.scrapingCheckInterval = setInterval(function() { self.checkScrapingStatus(); }, 2000); }, checkScrapingStatus: function() { var xhr = this.request('GET', '/isIdle'); if (xhr && xhr.status === 200) { try { var isIdle = JSON.parse(xhr.responseText); if (isIdle[0] === true) { this.stopScrapingMonitor(); /* if (confirm('Scraping completed!\n\nWould you like to reload the games list to see the updated metadata?')) { var currentSys = this.currentSystem; this.reloadGames(); // Reload the current system view after a delay to allow ES to process if (currentSys) { var self = this; setTimeout(function() { self.selectSystem(currentSys); }, 2000); } } */ this.showNotificationBanner('Scraping completed! Click "Reload Games" to see the updated metadata.', 'success'); } } catch (e) { console.error('Failed to parse isIdle response:', e); } } }, stopScrapingMonitor: function() { if (this.scrapingCheckInterval) { clearInterval(this.scrapingCheckInterval); this.scrapingCheckInterval = null; } this.scrapingInProgress = false; document.getElementById('statusText').textContent = 'Ready'; }, reloadCurrentSystem: function() { if (this.currentSystem) { var systemName = this.currentSystem; this.currentSystem = null; this.selectSystem(systemName); // selectSystem now calls filterGames() which will apply current filters } }, launchGame: function(gamePath) { var xhr = this.request('POST', '/launch', gamePath, 'text/plain'); if (xhr && xhr.status === 200) { this.showNotificationBanner('Game launched!', 'success'); this.updateStatus(); } else { this.showNotificationBanner('Failed to launch game', 'error'); } }, showGameDetails: function(gamePath) { var game = null; for (var i = 0; i < this.allGames.length; i++) { if (this.allGames[i].path === gamePath) { game = this.allGames[i]; break; } } if (!game) return; this.currentGameDetail = game; var modalBody = '
' + '' + '' + '
'; document.getElementById('modalTitle').textContent = game.name; document.getElementById('modalBody').innerHTML = modalBody; document.getElementById('gameModal').classList.add('active'); this.showInfoTab(); }, showTab: function(tab) { var tabs = document.querySelectorAll('.tab'); for (var i = 0; i < tabs.length; i++) { tabs[i].classList.remove('active'); } event.target.classList.add('active'); var tabContent = document.getElementById('tabContent'); if (tab === 'media') { this.showMediaTab(); } else { this.showInfoTab(); } }, showInfoTab: function() { var game = this.currentGameDetail; if (!game) return; var html = '
' + '' + '' + '
' + '
' + '' + '' + '
'; if (game.desc) { html += '
' + '' + '' + '
'; } if (game.developer) { html += '
' + '' + '' + '
'; } if (game.publisher) { html += '
' + '' + '' + '
'; } if (game.releasedate) { html += '
' + '' + '' + '
'; } if (game.genre) { html += '
' + '' + '' + '
'; } if (game.players) { html += '
' + '' + '' + '
'; } if (game.playcount) { html += '
' + '' + '' + '
'; } if (game.rating) { html += '
' + '' + '' + '
'; } document.getElementById('tabContent').innerHTML = html; }, showMediaTab: function() { var game = this.currentGameDetail; if (!game) return; var mediaTypes = [ { key: 'image', label: 'Image' }, { key: 'thumbnail', label: 'Thumbnail' }, { key: 'marquee', label: 'Marquee' }, { key: 'fanart', label: 'Fan Art' }, { key: 'boxback', label: 'Box Back' }, { key: 'video', label: 'Video' }, { key: 'manual', label: 'Manual' } ]; var html = '
'; for (var i = 0; i < mediaTypes.length; i++) { var media = mediaTypes[i]; if (game[media.key]) { html += '
'; if (media.key === 'video') { html += ''; } else if (media.key === 'manual') { html += '
' + '
PDF
' + 'View Manual' + '
'; } else { html += '' + media.label + ''; } html += '
' + media.label + '
'; html += '
'; } } html += '
'; if (html === '
') { html = '
[ ]

No media available

'; } document.getElementById('tabContent').innerHTML = html; }, closeModal: function() { document.getElementById('gameModal').classList.remove('active'); }, showNotificationBanner: function(message, type) { var banner = document.getElementById('notificationBanner'); var notificationText = document.getElementById('notificationText'); if (!banner || !notificationText) { console.error('Notification banner elements not found'); return; } // Remove existing type classes banner.className = 'notification-banner'; // Add type-specific class if (type === 'success') { banner.classList.add('notification-success'); } else if (type === 'error') { banner.classList.add('notification-error'); } else if (type === 'info') { banner.classList.add('notification-info'); } notificationText.textContent = message; banner.style.display = 'flex'; // Auto-hide after 5 seconds setTimeout(function() { banner.style.display = 'none'; }, 5000); }, /* showNotificationBanner: function(message, type) { // Create banner if it doesn't exist var banner = document.getElementById('notificationBanner'); if (!banner) { banner = document.createElement('div'); banner.id = 'notificationBanner'; banner.style.cssText = 'position:fixed;top:20px;right:20px;padding:15px 20px;border-radius:8px;' + 'color:white;font-size:14px;z-index:10000;box-shadow:0 4px 6px rgba(0,0,0,0.3);' + 'transition:opacity 0.3s ease;max-width:400px;'; document.body.appendChild(banner); } // Set color based on type var bgColor; if (type === 'success') { bgColor = '#10b981'; // green } else if (type === 'error') { bgColor = '#ef4444'; // red } else if (type === 'info') { bgColor = '#3b82f6'; // blue } else { bgColor = '#6b7280'; // gray } banner.style.backgroundColor = bgColor; banner.textContent = message; banner.style.opacity = '1'; banner.style.display = 'block'; // Auto-hide after 3 seconds setTimeout(function() { banner.style.opacity = '0'; setTimeout(function() { banner.style.display = 'none'; }, 500); }, 5000); }, */ updateStatus: function() { var xhr = this.request('GET', '/runningGame'); if (xhr && xhr.status === 200) { var text = xhr.responseText; var runningDiv = document.getElementById('runningGame'); var runningText = document.getElementById('runningGameText'); if (text && text !== 'null' && text !== '') { try { var gameData = JSON.parse(text); var displayText = gameData.name; if (gameData.systemName) { displayText += ', System: ' + gameData.systemName.toUpperCase(); } runningDiv.style.display = 'flex'; runningText.textContent = displayText; document.getElementById('statusText').textContent = 'Playing'; } catch (e) { runningDiv.style.display = 'flex'; runningText.textContent = text; document.getElementById('statusText').textContent = 'Playing'; } } else { runningDiv.style.display = 'none'; document.getElementById('statusText').textContent = 'Ready'; } } }, reloadGames: function() { if (confirm('Reload all game lists?')) { this.request('GET', '/reloadgames'); this.showNotificationBanner('Games reloaded!', 'success'); this.loadSystems(); } }, killEmulator: function() { if (confirm('Kill the running emulator?')) { this.request('GET', '/emukill'); this.showNotificationBanner('Emulator killed!', 'success'); this.updateStatus(); } }, restart: function() { if (confirm('Restart EmulationStation?')) { this.request('GET', '/restart'); } }, quit: function() { if (confirm('Quit EmulationStation?')) { this.request('GET', '/quit'); } }, showMessageBox: function() { var message = prompt('Enter message to display:'); if (message) { this.request('POST', '/messagebox', message, 'text/plain'); } }, showNotification: function() { var message = prompt('Enter notification text:'); if (message) { this.request('POST', '/notify', message, 'text/plain'); } }, showView: function(view) { this.currentView = view; document.getElementById('gamesView').style.display = 'none'; document.getElementById('configView').style.display = 'none'; document.getElementById('toolsView').style.display = 'none'; if (view === 'games') { document.getElementById('gamesView').style.display = 'flex'; } else if (view === 'config') { document.getElementById('configView').style.display = 'flex'; this.loadConfigList(); } else if (view === 'tools') { document.getElementById('toolsView').style.display = 'flex'; } }, loadConfigList: function(subpath) { this.currentConfigPath = subpath || ''; var endpoint = '/config' + (subpath ? '/' + subpath : ''); var xhr = this.request('GET', endpoint); if (xhr && xhr.status === 200) { try { var items = JSON.parse(xhr.responseText); this.displayConfigList(items); } catch (e) { console.error('Failed to parse config list:', e); } } }, displayConfigList: function(items) { items.sort(function(a, b) { if (a.isDirectory && !b.isDirectory) return -1; if (!a.isDirectory && b.isDirectory) return 1; return a.name.localeCompare(b.name); }); var html = ''; if (this.currentConfigPath) { var parentPath = this.currentConfigPath.split('/').slice(0, -1).join('/'); html += '
'; html += '<'; html += '..'; html += '
'; } for (var i = 0; i < items.length; i++) { var item = items[i]; var icon = item.isDirectory ? '📁' : '📄'; var onclick = item.isDirectory ? 'app.loadConfigList(\'' + item.path + '\')' : 'app.loadConfigFile(\'' + item.path + '\')'; html += '
'; html += '' + icon + ''; html += '' + item.name + ''; html += '
'; } document.getElementById('configList').innerHTML = html; }, loadConfigFile: function(filepath) { var xhr = this.request('GET', '/config/' + filepath); if (xhr && xhr.status === 200) { this.configContent = xhr.responseText; this.displayConfigEditor(filepath); } }, displayConfigEditor: function(filepath) { var breadcrumb = filepath.split('/').join(' / '); var html = '
'; html += '
'; html += '
' + filepath + '
'; html += '
'; html += ''; html += ''; html += ''; html += '
'; html += ''; html += '
'; document.getElementById('configEditorContainer').innerHTML = html; }, saveConfigFile: function(filepath) { var content = document.getElementById('configTextarea').value; var xhr = this.request('POST', '/config/' + filepath, content, 'text/plain'); if (xhr && xhr.status === 200) { this.showNotificationBanner('File saved successfully!', 'success'); this.configContent = content; } else { this.showNotificationBanner('Failed to save file', 'error'); } }, deleteConfigFile: function(filepath) { if (!confirm('Are you sure you want to delete this file?\n\n' + filepath + '\n\nA backup will be created.')) { return; } var xhr = new XMLHttpRequest(); xhr.open('DELETE', '/config/' + filepath, false); xhr.send(); if (xhr.status === 200) { this.showNotificationBanner('File deleted! Backup saved as .deleted', 'success'); this.closeConfigEditor(); this.loadConfigList(this.currentConfigPath); } else { this.showNotificationBanner('Failed to delete file', 'error'); } }, closeConfigEditor: function() { document.getElementById('configEditorContainer').innerHTML = '
' + '
[ ]
' + '

Select a config file to edit

' + '
'; }, createNewConfigFile: function() { var filename = prompt('Enter filename:'); if (!filename) return; var filepath = this.currentConfigPath ? this.currentConfigPath + '/' + filename : filename; this.configContent = ''; this.displayConfigEditor(filepath); }, escapeHtml: function(text) { var map = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; return text.replace(/[&<>"']/g, function(m) { return map[m]; }); }, populateSystemSelects: function() { var self = this; setTimeout(function() { if (self.systems.length === 0) return; var html = ''; for (var i = 0; i < self.systems.length; i++) { var s = self.systems[i]; if (s.visible === 'true') { html += ''; } } document.getElementById('addGamesSystem').innerHTML = html; document.getElementById('removeGamesSystem').innerHTML = html; document.getElementById('removeSystemSelect').innerHTML = html; document.getElementById('addEmulatorSystem').innerHTML = html; document.getElementById('removeEmulatorSystem').innerHTML = html; }, 1000); }, addGames: function() { var system = document.getElementById('addGamesSystem').value; var xml = document.getElementById('addGamesXML').value; var result = document.getElementById('addGamesResult'); if (!system) { result.textContent = 'Error: Please select a system'; result.style.display = 'block'; result.style.color = '#848484'; return; } if (!xml.trim()) { result.textContent = 'Error: Please enter gamelist XML'; result.style.display = 'block'; result.style.color = '#848484'; return; } var xhr = this.request('POST', '/addgames/' + system, xml, 'application/xml'); if (xhr) { if (xhr.status === 200) { result.textContent = 'Success! Games added/updated. The system will be refreshed.'; result.style.color = '#84849f'; document.getElementById('addGamesXML').value = ''; } else if (xhr.status === 201) { result.textContent = 'Games added but system not loaded. Click "Reload Games" to see them.'; result.style.color = '#b4b1c2'; } else if (xhr.status === 204) { result.textContent = 'No games were added or updated. Check your XML format.'; result.style.color = '#848484'; } else if (xhr.status === 404) { result.textContent = 'Error: System not found'; result.style.color = '#848484'; } else { result.textContent = 'Error: ' + xhr.responseText; result.style.color = '#848484'; } result.style.display = 'block'; } }, removeGames: function() { var system = document.getElementById('removeGamesSystem').value; var xml = document.getElementById('removeGamesXML').value; var result = document.getElementById('removeGamesResult'); if (!system) { result.textContent = 'Error: Please select a system'; result.style.display = 'block'; result.style.color = '#848484'; return; } if (!xml.trim()) { result.textContent = 'Error: Please enter gamelist XML'; result.style.display = 'block'; result.style.color = '#848484'; return; } if (!confirm('WARNING: This will DELETE the ROM files from disk!\n\nAre you sure you want to remove these games?')) { return; } var xhr = this.request('POST', '/removegames/' + system, xml, 'application/xml'); if (xhr) { if (xhr.status === 200) { result.textContent = 'Success! Games removed and files deleted.'; result.style.color = '#84849f'; document.getElementById('removeGamesXML').value = ''; } else if (xhr.status === 204) { result.textContent = 'No games were removed. Check your XML format.'; result.style.color = '#848484'; } else if (xhr.status === 404) { result.textContent = 'Error: System not found'; result.style.color = '#848484'; } else { result.textContent = 'Error: ' + xhr.responseText; result.style.color = '#848484'; } result.style.display = 'block'; } }, addSystem: function() { var xml = document.getElementById('addSystemXML').value; var result = document.getElementById('addSystemResult'); if (!xml.trim()) { result.textContent = 'Error: Please enter system XML'; result.style.display = 'block'; result.style.color = '#848484'; return; } // Check if tag exists, if not add default if (xml.indexOf('') === -1) { var defaultCommand = 'emuelecRunEmu.sh %ROM% -P%SYSTEM% --core=%CORE% --emulator=%EMULATOR% --controllers="%CONTROLLERSCONFIG%"'; // Find where to insert (before closing
or tag) var insertPos = xml.lastIndexOf(''); if (insertPos === -1) { insertPos = xml.lastIndexOf(''); } if (insertPos !== -1) { xml = xml.substring(0, insertPos) + ' ' + defaultCommand + '\n' + xml.substring(insertPos); } } var xhr = this.request('POST', '/addsystem', xml, 'application/xml'); if (xhr) { if (xhr.status === 200) { result.textContent = 'Success! System added/updated. Systems will reload.'; result.style.color = '#84849f'; document.getElementById('addSystemXML').value = ''; var self = this; setTimeout(function() { self.loadSystems(); self.populateSystemSelects(); }, 2000); } else if (xhr.status === 404) { result.textContent = 'Error: es_systems.cfg not found'; result.style.color = '#848484'; } else { result.textContent = 'Error: ' + xhr.responseText; result.style.color = '#848484'; } result.style.display = 'block'; } }, removeSystem: function() { var system = document.getElementById('removeSystemSelect').value; var result = document.getElementById('removeSystemResult'); if (!system) { result.textContent = 'Error: Please select a system'; result.style.display = 'block'; result.style.color = '#848484'; return; } if (!confirm('Are you sure you want to remove the system: ' + system + '?\n\nThis will NOT delete ROM files.')) { return; } var xhr = this.request('POST', '/removesystem/' + system); if (xhr) { if (xhr.status === 200) { result.textContent = 'Success! System removed. Systems will reload.'; result.style.color = '#84849f'; document.getElementById('removeSystemSelect').value = ''; var self = this; setTimeout(function() { self.loadSystems(); self.populateSystemSelects(); }, 2000); } else if (xhr.status === 404) { result.textContent = 'Error: System or es_systems.cfg not found'; result.style.color = '#848484'; } else { result.textContent = 'Error: ' + xhr.responseText; result.style.color = '#848484'; } result.style.display = 'block'; } }, addEmulator: function() { var system = document.getElementById('addEmulatorSystem').value; var xml = document.getElementById('addEmulatorXML').value; var result = document.getElementById('addEmulatorResult'); if (!system) { result.textContent = 'Error: Please select a system'; result.style.display = 'block'; result.style.color = '#848484'; return; } if (!xml.trim()) { result.textContent = 'Error: Please enter emulator XML'; result.style.display = 'block'; result.style.color = '#848484'; return; } var xhr = this.request('POST', '/system/' + system + '/addemulator', xml, 'application/xml'); if (xhr) { if (xhr.status === 200) { result.textContent = 'Success! Emulator added/updated. Systems will reload.'; result.style.color = '#84849f'; document.getElementById('addEmulatorXML').value = ''; } else if (xhr.status === 404) { result.textContent = 'Error: System or es_systems.cfg not found'; result.style.color = '#848484'; } else { result.textContent = 'Error: ' + xhr.responseText; result.style.color = '#848484'; } result.style.display = 'block'; } }, removeEmulator: function() { var system = document.getElementById('removeEmulatorSystem').value; var emulator = document.getElementById('removeEmulatorName').value; var result = document.getElementById('removeEmulatorResult'); if (!system) { result.textContent = 'Error: Please select a system'; result.style.display = 'block'; result.style.color = '#848484'; return; } if (!emulator.trim()) { result.textContent = 'Error: Please enter emulator name'; result.style.display = 'block'; result.style.color = '#848484'; return; } if (!confirm('Are you sure you want to remove the emulator: ' + emulator + ' from ' + system + '?')) { return; } var xhr = this.request('POST', '/system/' + system + '/removeemulator/' + emulator); if (xhr) { if (xhr.status === 200) { result.textContent = 'Success! Emulator removed. Systems will reload.'; result.style.color = '#84849f'; document.getElementById('removeEmulatorName').value = ''; } else if (xhr.status === 404) { result.textContent = 'Error: System, emulator, or es_systems.cfg not found'; result.style.color = '#848484'; } else { result.textContent = 'Error: ' + xhr.responseText; result.style.color = '#848484'; } result.style.display = 'block'; } } }; app.init(); window.onclick = function(event) { var modal = document.getElementById('gameModal'); if (event.target === modal) { app.closeModal(); } }; ================================================ FILE: packages/sx05re/emuelec-emulationstation/config/scripts/combined/example.sh.example ================================================ #!/bin/bash ## This is an example combined script for all events that ES triggers ## options separated with , are secondary arguments e.g (arg1; arg2; arg3) ## options separated with ; are single argument to choose from e.g (arg1, arg1, arg1) # # start # game-start (rom, basename, name) # game-end # system-selected (name) # game-selected (system-name, game-path, name) # screensaver-start (screensaver_behavior) # screensaver-stop # theme-changed (new-theme, old-theme) # sleep # wake # config-changed # controls-changed # settings-changed # quit (and any one of these as second argument: restart; reboot; shutdown; nand; retroarch) . /etc/profile EVENT=${1} shift event_start() { echo "Started ES" } event_game_start() { echo "Started game rom: ${1} basename ${2} name ${3}" } event_screensaver_start() { echo "Starting Screen saver ${1}" } event_quit(){ case "${1}" in "restart") echo "Restarting!" ;; "reboot") echo "Rebooting!" ;; "shutdown") echo "Shutting down!" ;; *) echo "Just quitting!" ;; esac } case "${EVENT}" in "start") event_start ;; "game-start") event_game_start ${1} ${2} ${3} ;; "screensaver-start") event_screensaver_start ${1} ;; "quit") event_quit ${1} ${2} ${3} ;; # and so and and so fort *) exit 1 esac ## You could also do something like this: # event_${1} ${2} ${3} ${4} ## To call the event directly, but you need error checking. exit 0 ================================================ FILE: packages/sx05re/emuelec-emulationstation/config/scripts/configscripts/gamecontrollerdb.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # based on https://github.com/RetroPie/RetroPie-Setup/blob/master/scriptmodules/supplementary/emulationstation/configscripts/retroarch.sh TMPCONF=$(mktemp) function onstart_gamecontrollerdb_joystick() { echo -ne "${DEVICE_GUID},${DEVICE_NAME}," > "${TMPCONF}" } function map_gamecontrollerdb_joystick() { local input_name="${1}" local input_type="${2}" local input_id="${3}" local input_value="${4}" local keys case "${input_name}" in up) keys=("dpup") ;; down) keys=("dpdown") ;; left) keys=("dpleft") ;; right) keys=("dpright") ;; a) keys=("a") ;; b) keys=("b") ;; x) keys=("x") ;; y) keys=("y") ;; leftshoulder) keys=("leftshoulder") ;; rightshoulder) keys=("rightshoulder") ;; lefttrigger) keys=("lefttrigger") ;; righttrigger) keys=("righttrigger") ;; leftthumb) keys=("leftstick") ;; rightthumb) keys=("rightstick") ;; start) keys=("start") ;; select) keys=("back") ;; leftanalogleft) keys=("leftx") ;; leftanalogup) keys=("lefty") ;; rightanalogleft) keys=("rightx") ;; rightanalogup) keys=("righty") ;; hotkeyenable) keys=("guide") ;; esac local key local value local type for key in "${keys[@]}"; do case "${input_type}" in hat) type="h" value="${input_id}.${input_value}" ;; axis) type="a" value="${input_id}" ;; button) type="b" value="${input_id}" ;; esac key+=":${type}${value}" done if [ ! -z "${key}" ]; then echo -en "${key}," >> "${TMPCONF}" fi } function onend_gamecontrollerdb_joystick() { SDL_GAMECONTROLLERCONFIG_FILE="/storage/.config/SDL-GameControllerDB/gamecontrollerdb.txt" CONF=$(cat "${TMPCONF}") if grep -q "${DEVICE_GUID}" "${SDL_GAMECONTROLLERCONFIG_FILE}"; then # If DEVICE_GUID exists, replace the existing entry sed -i "/${DEVICE_GUID}/c ${CONF}platform:Linux," "${SDL_GAMECONTROLLERCONFIG_FILE}" else sed -i "5i ${CONF}platform:Linux," "${SDL_GAMECONTROLLERCONFIG_FILE}" fi # Cleanup rm -f "${TMPCONF}" > /dev/null 2>&1 } ================================================ FILE: packages/sx05re/emuelec-emulationstation/config/scripts/configscripts/retroarch.sh ================================================ #!/usr/bin/env bash # This file is part of The RetroPie Project # # The RetroPie Project is the legal property of its developers, whose names are # too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source. # # See the LICENSE.md file at the top-level directory of this distribution and # at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md # # Modified 2019 by Shanti Gilbert for EmuELEC/CoreELEC (https//www.coreelec.org) # Function to find udev device name using /proc/bus/input/devices from a SDL GUID get_udev_name_from_guid() { local guid="$1" if [[ ! "$guid" =~ ^[0-9A-Fa-f]{32}$ ]]; then echo "Invalid GUID format" >&2 return 1 fi guid=${guid,,} # lowercase for safety # Helper: swap endian (little → big) swap_endian() { echo "$1" | sed 's/\(..\)\(..\)/\2\1/' } # Extract relevant fields (note: byte order) local bus_le=${guid:0:4} local vendor_le=${guid:8:4} local product_le=${guid:16:4} local version_le=${guid:24:4} local bus=$(swap_endian "$bus_le") local vendor=$(swap_endian "$vendor_le") local product=$(swap_endian "$product_le") local version=$(swap_endian "$version_le") # Find the block starting with I: that matches all three fields local name name=$(sed -n "/I:.*Bus=${bus}.*Vendor=${vendor}.*Product=${product}/,/^$/p" /proc/bus/input/devices \ | sed -n 's/^N: Name="\([^"]*\)"/\1/p' \ | head -n1) if [[ -n "$name" ]]; then echo "$name" else #fall back to ES name echo "${DEVICE_NAME}" fi } function onstart_retroarch_joystick() { iniConfig " = " '"' "${configdir}/retroarch/retroarch.cfg" iniGet "input_joypad_driver" local input_joypad_driver="${ini_value}" if [[ -z "${input_joypad_driver}" ]]; then input_joypad_driver="udev" fi _retroarch_select_hotkey=1 _atebitdo_hack=0 getAutoConf "8bitdo_hack" && _atebitdo_hack=1 iniConfig " = " "\"" "/tmp/tempconfig.cfg" v=${DEVICE_GUID:8:8} part1=$(echo ${v:6:2}${v:4:2}${v:2:2}${v:0:2}) v=${DEVICE_GUID:16:8} part2=$(echo ${v:6:2}${v:4:2}${v:2:2}${v:0:2}) input_vendor=$(echo $((16#${part1:4}))) input_product=$(echo $((16#${part2:4}))) RA_DEVICE_NAME=$(get_udev_name_from_guid "${DEVICE_GUID}") iniSet "input_device" "${RA_DEVICE_NAME}" iniSet "input_driver" "${input_joypad_driver}" iniSet "input_vendor_id" "${input_vendor}" iniSet "input_product_id" "${input_product}" } function onstart_retroarch_keyboard() { iniConfig " = " '"' "${configdir}/retroarch/retroarch.cfg" _retroarch_select_hotkey=1 declare -Ag retroarchkeymap # SDL codes from https://wiki.libsdl.org/SDLKeycodeLookup retroarchkeymap["1073741904"]="left" retroarchkeymap["1073741903"]="right" retroarchkeymap["1073741906"]="up" retroarchkeymap["1073741905"]="down" retroarchkeymap["13"]="enter" retroarchkeymap["1073741912"]="kp_enter" retroarchkeymap["9"]="tab" retroarchkeymap["1073741897"]="insert" retroarchkeymap["127"]="del" retroarchkeymap["1073741901"]="end" retroarchkeymap["1073741898"]="home" retroarchkeymap["1073742053"]="rshift" retroarchkeymap["1073742049"]="shift" retroarchkeymap["1073742048"]="ctrl" retroarchkeymap["1073742050"]="alt" retroarchkeymap["32"]="space" retroarchkeymap["27"]="escape" retroarchkeymap["43"]="add" retroarchkeymap["45"]="subtract" retroarchkeymap["1073741911"]="kp_plus" retroarchkeymap["1073741910"]="kp_minus" retroarchkeymap["1073741882"]="f1" retroarchkeymap["1073741883"]="f2" retroarchkeymap["1073741884"]="f3" retroarchkeymap["1073741885"]="f4" retroarchkeymap["1073741886"]="f5" retroarchkeymap["1073741887"]="f6" retroarchkeymap["1073741888"]="f7" retroarchkeymap["1073741889"]="f8" retroarchkeymap["1073741890"]="f9" retroarchkeymap["1073741891"]="f10" retroarchkeymap["1073741892"]="f11" retroarchkeymap["1073741893"]="f12" retroarchkeymap["48"]="num0" retroarchkeymap["49"]="num1" retroarchkeymap["50"]="num2" retroarchkeymap["51"]="num3" retroarchkeymap["52"]="num4" retroarchkeymap["53"]="num5" retroarchkeymap["54"]="num6" retroarchkeymap["55"]="num7" retroarchkeymap["56"]="num8" retroarchkeymap["57"]="num9" retroarchkeymap["1073741899"]="pageup" retroarchkeymap["1073741902"]="pagedown" retroarchkeymap["1073741922"]="keypad0" retroarchkeymap["1073741913"]="keypad1" retroarchkeymap["1073741914"]="keypad2" retroarchkeymap["1073741915"]="keypad3" retroarchkeymap["1073741916"]="keypad4" retroarchkeymap["1073741917"]="keypad5" retroarchkeymap["1073741918"]="keypad6" retroarchkeymap["1073741919"]="keypad7" retroarchkeymap["1073741920"]="keypad8" retroarchkeymap["1073741921"]="keypad9" retroarchkeymap["46"]="period" retroarchkeymap["1073741881"]="capslock" retroarchkeymap["1073741907"]="numlock" retroarchkeymap["8"]="backspace" retroarchkeymap["42"]="multiply" retroarchkeymap["47"]="divide" retroarchkeymap["1073741894"]="print_screen" retroarchkeymap["1073741895"]="scroll_lock" retroarchkeymap["96"]="backquote" retroarchkeymap["1073741896"]="pause" retroarchkeymap["39"]="quote" retroarchkeymap["44"]="comma" retroarchkeymap["45"]="minus" retroarchkeymap["47"]="slash" retroarchkeymap["59"]="semicolon" retroarchkeymap["61"]="equals" retroarchkeymap["91"]="leftbracket" retroarchkeymap["92"]="backslash" retroarchkeymap["93"]="rightbracket" retroarchkeymap["1073741923"]="kp_period" retroarchkeymap["1073741927"]="kp_equals" retroarchkeymap["1073742052"]="rctrl" retroarchkeymap["1073742054"]="ralt" retroarchkeymap["97"]="a" retroarchkeymap["98"]="b" retroarchkeymap["99"]="c" retroarchkeymap["100"]="d" retroarchkeymap["101"]="e" retroarchkeymap["102"]="f" retroarchkeymap["103"]="g" retroarchkeymap["104"]="h" retroarchkeymap["105"]="i" retroarchkeymap["106"]="j" retroarchkeymap["107"]="k" retroarchkeymap["108"]="l" retroarchkeymap["109"]="m" retroarchkeymap["110"]="n" retroarchkeymap["111"]="o" retroarchkeymap["112"]="p" retroarchkeymap["113"]="q" retroarchkeymap["114"]="r" retroarchkeymap["115"]="s" retroarchkeymap["116"]="t" retroarchkeymap["117"]="u" retroarchkeymap["118"]="v" retroarchkeymap["119"]="w" retroarchkeymap["120"]="x" retroarchkeymap["121"]="y" retroarchkeymap["122"]="z" # special case for disabled hotkey retroarchkeymap["0"]="nul" } function map_retroarch_joystick() { local input_name="${1}" local input_type="${2}" local input_id="${3}" local input_value="${4}" local keys case "${input_name}" in up) keys=("input_up" "input_volume_up") ;; down) keys=("input_down" "input_volume_down") ;; left) keys=("input_left" "input_state_slot_decrease") ;; right) keys=("input_right" "input_state_slot_increase") ;; a) keys=("input_a") ;; b) keys=("input_b" "input_reset") ;; x) keys=("input_x" "input_menu_toggle") ;; y) keys=("input_y") ;; leftbottom|leftshoulder) keys=("input_l" "input_load_state") ;; rightbottom|rightshoulder) keys=("input_r" "input_save_state") ;; lefttop|lefttrigger) keys=("input_l2" "input_rewind") ;; righttop|righttrigger) keys=("input_r2" "input_toggle_fast_forward") ;; leftthumb) keys=("input_l3") ;; rightthumb) keys=("input_r3" "input_fps_toggle") ;; start) keys=("input_start" "input_exit_emulator") ;; select) keys=("input_select") ;; leftanalogleft) keys=("input_l_x_minus") ;; leftanalogright) keys=("input_l_x_plus") ;; leftanalogup) keys=("input_l_y_minus") ;; leftanalogdown) keys=("input_l_y_plus") ;; rightanalogleft) keys=("input_r_x_minus") ;; rightanalogright) keys=("input_r_x_plus") ;; rightanalogup) keys=("input_r_y_minus") ;; rightanalogdown) keys=("input_r_y_plus") ;; hotkeyenable) keys=("input_enable_hotkey") _retroarch_select_hotkey=0 if [[ "${input_type}" == "key" && "${input_id}" == "0" ]]; then return fi ;; *) return ;; esac local key local value local type for key in "${keys[@]}"; do case "${input_type}" in hat) type="btn" value="h${input_id}${input_name}" ;; axis) type="axis" if [[ "${input_value}" == "1" ]]; then value="+${input_id}" else value="-${input_id}" fi ;; *) type="btn" value="${input_id}" # workaround for mismatched controller mappings iniGet "input_driver" if [[ "${ini_value}" == "udev" ]]; then case "${RA_DEVICE_NAME}" in "8Bitdo FC30"*|"8Bitdo NES30"*|"8Bitdo SFC30"*|"8Bitdo SNES30"*|"8Bitdo Zero"*) if [[ "$_atebitdo_hack" -eq 1 ]]; then value="$((input_id+11))" fi ;; esac fi ;; esac if [[ "${input_name}" == "select" && "$_retroarch_select_hotkey" -eq 1 ]]; then _retroarch_select_type="${type}" fi key+="_${type}" iniSet "${key}" "${value}" done } function map_retroarch_keyboard() { local input_name="${1}" local input_type="${2}" local input_id="${3}" local input_value="${4}" local key case "${input_name}" in up) keys=("input_player1_up") ;; down) keys=("input_player1_down") ;; left) keys=("input_player1_left" "input_state_slot_decrease") ;; right) keys=("input_player1_right" "input_state_slot_increase") ;; a) keys=("input_player1_a") ;; b) keys=("input_player1_b" "input_reset") ;; x) keys=("input_player1_x" "input_menu_toggle") ;; y) keys=("input_player1_y") ;; leftbottom|leftshoulder) keys=("input_player1_l") ;; rightbottom|rightshoulder) keys=("input_player1_r") ;; lefttop|lefttrigger) keys=("input_player1_l2") ;; righttop|righttrigger) keys=("input_player1_r2") ;; leftthumb) keys=("input_player1_l3") ;; rightthumb) keys=("input_player1_r3") ;; start) keys=("input_player1_start" "input_exit_emulator") ;; select) keys=("input_player1_select") ;; hotkeyenable) keys=("input_enable_hotkey") _retroarch_select_hotkey=0 ;; *) return ;; esac for key in "${keys[@]}"; do iniSet "${key}" "${retroarchkeymap[${input_id}]}" done } function onend_retroarch_joystick() { # if $_retroarch_select_hotkey is set here, then there was no hotkeyenable button # in the configuration, so we should use the select button as hotkey enable if set if [[ "$_retroarch_select_hotkey" -eq 1 ]]; then iniGet "input_select_${_retroarch_select_type}" [[ -n "${ini_value}" ]] && iniSet "input_enable_hotkey_${_retroarch_select_type}" "${ini_value}" fi # hotkey sanity check # remove hotkeys if there is no hotkey enable button if ! grep -q "input_enable_hotkey" /tmp/tempconfig.cfg; then local key for key in input_toggle_fast_forward input_rewind input_fps_toggle input_volume_up input_volume_down input_state_slot_decrease input_state_slot_increase input_reset input_menu_toggle input_load_state input_save_state input_exit_emulator; do sed -i "/${key}/d" /tmp/tempconfig.cfg done fi # disable any auto configs for the same device to avoid duplicates local file local dir="/tmp/joypads" while read -r file; do mv "${file}" "${file}.bak" > /dev/null 2>&1 done < <(grep -Fl "\"${RA_DEVICE_NAME}\"" "${dir}/"*.cfg 2>/dev/null) for file in /tmp/joypads/*.*; do txt=$( cat "$file" | grep -E -c "^input_vendor_id = \"${input_vendor}\"$|^input_product_id = \"${input_product}\"$" ) [[ "${txt}" == "2" ]] && mv "${file}" "${file}.bak" > /dev/null 2>&1 done # sanitise filename file="${RA_DEVICE_NAME//[\?\<\>\\\/:\*\|]/}.cfg" if [[ -f "${dir}/${file}" ]]; then mv "${dir}/${file}" "${dir}/${file}.bak" fi sed -i '/^[[:space:]]*$/d' "/tmp/tempconfig.cfg" mv "/tmp/tempconfig.cfg" "${dir}/${file}" } function onend_retroarch_keyboard() { if [[ "$_retroarch_select_hotkey" -eq 1 ]]; then iniGet "input_player1_select" iniSet "input_enable_hotkey" "${ini_value}" fi # hotkey sanity check # remove hotkeys if there is no hotkey enable button iniGet "input_enable_hotkey" if [[ -z "${ini_value}" || "${ini_value}" == "nul" ]]; then iniSet "input_state_slot_decrease" "" iniSet "input_state_slot_increase" "" iniSet "input_reset" "" iniSet "input_menu_toggle" "f1" iniSet "input_load_state" "" iniSet "input_save_state" "" iniSet "input_exit_emulator" "escape" iniSet "input_shader_next" "" iniSet "input_shader_prev" "" iniSet "input_rewind" "" iniSet "input_toggle_fast_forward" "" iniSet "input_rewind" "" iniSet "input_fps_toggle" "" iniSet "input_volume_up" "" iniSet "input_volume_down" "" fi } ================================================ FILE: packages/sx05re/emuelec-emulationstation/config/scripts/say/01-say.sh ================================================ #!/bin/bash #file=$(mktemp) #espeak -w ${file}.wav "${1}" #aplay ${file}.wav #rm ${file}.wav killall aplay killall espeak espeak "${1}" --stdout | aplay ================================================ FILE: packages/sx05re/emuelec-emulationstation/depends/fping/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="fping" PKG_VERSION="5.0" PKG_SHA256="ed38c0b9b64686a05d1b3bc1d66066114a492e04e44eef1821d43b1263cd57b8" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://fping.org/" PKG_URL="http://fping.org/dist/fping-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_TOOLCHAIN="auto" PKG_CONFIGURE_OPTS_TARGET="--sbindir=/usr/bin" ================================================ FILE: packages/sx05re/emuelec-emulationstation/generate_es_systems.py ================================================ import argparse import json import xml.etree.ElementTree as ET from xml.dom import minidom def json_to_es_xml(json_file, output_file, sort_key=None): with open(json_file, 'r', encoding='utf-8') as f: data = json.load(f) systems = data.get('systems', []) if sort_key: systems.sort(key=lambda s: (s.get(sort_key) or s.get('name', '')).lower()) root = ET.Element('systemList') for sys in systems: system_el = ET.SubElement(root, 'system') for key in ['name', 'fullname', 'manufacturer', 'release', 'hardware', 'path', 'platform', 'theme']: if key in sys: ET.SubElement(system_el, key).text = str(sys[key]) # Handle command separately to allow "default" shorthand if 'command' in sys: if sys['command'] == "default": command_value = 'emuelecRunEmu.sh %ROM% -P%SYSTEM% --core=%CORE% --emulator=%EMULATOR% --controllers="%CONTROLLERSCONFIG%"' else: command_value = sys['command'] ET.SubElement(system_el, 'command').text = command_value if 'extensions' in sys: ext_set = set() for ext in sys['extensions']: ext_set.add(ext.lower()) ext_set.add(ext.upper()) ET.SubElement(system_el, 'extension').text = ' '.join(sorted(ext_set, key=str.lower)) if 'emulators' in sys and sys['emulators']: emulators_el = ET.SubElement(system_el, 'emulators') default_set = False for emulator in sys['emulators']: emu_el = ET.SubElement(emulators_el, 'emulator', {'name': emulator['name']}) cores_el = ET.SubElement(emu_el, 'cores') for core in emulator.get('cores', []): core_attrs = {} # Handle default core if core.get('default', False): if not default_set: core_attrs['default'] = 'true' default_set = True else: print( f"Warning: Multiple default cores found in system '{sys.get('name')}'. " f"Ignoring '{core['name']}' in emulator '{emulator['name']}'" ) # Handle incompatible extensions if 'incompatible' in core: if isinstance(core['incompatible'], list): core_attrs['incompatible_extensions'] = ' '.join(core['incompatible']) else: print(f"'incompatible' should be a list in core '{core['name']}'") ET.SubElement(cores_el, 'core', core_attrs).text = core['name'] # Pretty-print the XML xml_str = ET.tostring(root, encoding='utf-8') pretty_xml = minidom.parseString(xml_str).toprettyxml(indent=" ") # Fix declaration and insert comment lines = pretty_xml.splitlines() lines[0] = '' comment = ('') final_lines = [lines[0], comment] + lines[1:] final_xml = '\n'.join(final_lines) + '\n' with open(output_file, 'w', encoding='utf-8') as f: f.write(final_xml) print(f"JSON to EmulationStation es_systems written to {output_file}") def es_xml_to_json(xml_file, output_file): tree = ET.parse(xml_file) root = tree.getroot() systems = [] for system_el in root.findall('system'): system = {} for key in ['name', 'fullname', 'manufacturer', 'release', 'hardware', 'path', 'platform', 'theme', 'command']: el = system_el.find(key) if el is not None and el.text: system[key] = el.text.strip() ext_el = system_el.find('extension') if ext_el is not None and ext_el.text: raw_exts = ext_el.text.strip().split() # Deduplicate and keep only lowercase lower_exts = sorted(set(ext.lower() for ext in raw_exts)) system['extensions'] = lower_exts emulators = [] default_set = False emulators_el = system_el.find('emulators') if emulators_el is not None: for emulator_el in emulators_el.findall('emulator'): emulator = {'name': emulator_el.attrib.get('name'), 'cores': []} cores_el = emulator_el.find('cores') if cores_el is not None: for core_el in cores_el.findall('core'): core_name = core_el.text.strip() core_obj = {'name': core_name} if core_el.attrib.get('default') == 'true': if not default_set: core_obj['default'] = True default_set = True else: print( f"Warning: Multiple default cores in system '{system.get('name')}', " f"ignoring default on core '{core_name}' in emulator '{emulator['name']}'" ) # Handle incompatible extensions incompat = core_el.attrib.get('incompatible_extensions') if incompat: core_obj['incompatible'] = incompat.split() emulator['cores'].append(core_obj) emulators.append(emulator) if emulators: system['emulators'] = emulators systems.append(system) with open(output_file, 'w', encoding='utf-8') as f: json.dump({'systems': systems}, f, indent=2) print(f"EmulationStation es_systems to JSON written to {output_file}") def main(): parser = argparse.ArgumentParser(description="Convert between JSON and EmulationStation es_systems.cfg.") parser.add_argument('-r', '--reverse', action='store_true', help="Convert from EmulationStation es_systems to JSON (default is JSON to EmulationStation es_systems)") parser.add_argument('-i', '--input', help="Input file path") parser.add_argument('-b', '--order-by', help="Sort systems by this field (only used in JSON to EmulationStation es_systems)") parser.add_argument('-o', '--output', help="Output file path") args = parser.parse_args() if args.reverse: input_file = args.input or 'es_systems.cfg' output_file = args.output or 'es_systems.json' es_xml_to_json(input_file, output_file) else: input_file = args.input or 'es_systems.json' output_file = args.output or 'es_systems.cfg' json_to_es_xml(input_file, output_file, sort_key=args.order_by) if __name__ == "__main__": main() ================================================ FILE: packages/sx05re/emuelec-emulationstation/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="emuelec-emulationstation" PKG_VERSION="3de652c69481de5fad2178ceebb9470950b3e683" PKG_GIT_CLONE_BRANCH="EmuELEC" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/EmuELEC/emuelec-emulationstation" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 freetype freeimage vlc rapidjson ${OPENGLES} SDL2_mixer fping p7zip espeak" PKG_SECTION="emuelec" PKG_SHORTDESC="Emulationstation emulator frontend" PKG_BUILD_FLAGS="-gold" GET_HANDLER_SUPPORT="git" if [[ ${DEVICE} == "OdroidGoAdvance" ]] || [[ ${DEVICE} == "GameForce" ]]; then PKG_PATCH_DIRS="Rockchip/HH" fi if [[ ${DEVICE} == "OdroidM1" ]] || [[ ${DEVICE} == "RK356x" ]]; then PKG_PATCH_DIRS="Rockchip" fi # themes for Emulationstation PKG_DEPENDS_TARGET="${PKG_DEPENDS_TARGET} Crystal" pre_configure_target() { # build directly in ${PKG_BUILD} to avoid Python3 errors cd ${PKG_BUILD} rm -rf .${TARGET_NAME} PKG_CMAKE_OPTS_TARGET=" -DENABLE_EMUELEC=1 -DDISABLE_KODI=1 -DENABLE_FILEMANAGER=1 -DGLES2=1 -DENABLE_TTS=1" # Read api_keys.txt if it exist to add the required keys for cheevos, thegamesdb and screenscrapper. You need to get your own API keys. # File should be in this format # -DSCREENSCRAPER_DEV_LOGIN=devid=&devpassword= # -DGAMESDB_APIKEY= # -DCHEEVOS_DEV_LOGIN=z=&y= # and it should be placed next to this file if [ -f ${PKG_DIR}/api_keys.txt ]; then while IFS="" read -r p || [ -n "${p}" ] do PKG_CMAKE_OPTS_TARGET+=" ${p}" done < ${PKG_DIR}/api_keys.txt fi if [[ ${DEVICE} == "GameForce" ]]; then PKG_CMAKE_OPTS_TARGET+=" -DENABLE_GAMEFORCE=1" fi if [[ ${DEVICE} == "OdroidGoAdvance" ]]; then PKG_CMAKE_OPTS_TARGET+=" -DODROIDGOA=1" fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/config/emuelec/configs/locale/i18n/charmaps cp -rf ${PKG_BUILD}/locale/lang/* ${INSTALL}/usr/config/emuelec/configs/locale/ cp -PR "$(get_build_dir glibc)/localedata/charmaps/UTF-8" ${INSTALL}/usr/config/emuelec/configs/locale/i18n/charmaps/UTF-8 mkdir -p ${INSTALL}/usr/lib ln -sf /storage/.config/emuelec/configs/locale ${INSTALL}/usr/lib/locale mkdir -p ${INSTALL}/usr/config/emulationstation/resources cp -rf ${PKG_BUILD}/resources/* ${INSTALL}/usr/config/emulationstation/resources/ mkdir -p ${INSTALL}/usr/bin ln -sf /storage/.config/emulationstation/resources ${INSTALL}/usr/bin/resources cp -rf ${PKG_BUILD}/emulationstation ${INSTALL}/usr/bin cp -PR "$(get_build_dir glibc)/.${TARGET_NAME}/locale/localedef" ${INSTALL}/usr/bin mkdir -p ${INSTALL}/etc/emulationstation/ ln -sf /storage/.config/emulationstation/themes ${INSTALL}/etc/emulationstation/ mkdir -p ${INSTALL}/usr/config/emulationstation cp -rf ${PKG_DIR}/config/scripts ${INSTALL}/usr/config/emulationstation cp -rf ${PKG_DIR}/config/*.cfg ${INSTALL}/usr/config/emulationstation cp -rf ${PKG_DIR}/config/resources ${INSTALL}/usr/config/emulationstation/ # Generate es_systems.cfg from json python3 ${PKG_DIR}/generate_es_systems.py -i ${PKG_DIR}/config/es_systems.json -o ${INSTALL}/usr/config/emulationstation/es_systems.cfg -b manufacturer chmod +x ${INSTALL}/usr/config/emulationstation/scripts/* chmod +x ${INSTALL}/usr/config/emulationstation/scripts/configscripts/* find ${INSTALL}/usr/config/emulationstation/scripts/ -type f -exec chmod o+x {} \; # Vertical Games are only supported in the OdroidGoAdvance if [[ ${DEVICE} != "OdroidGoAdvance" ]]; then sed -i "s|, vertical||g" "${INSTALL}/usr/config/emulationstation/es_features.cfg" fi # Amlogic project has an issue with mixed audio if [[ "${DEVICE}" == "Amlogic-old" ]]; then sed -i "s|| \n|g" "${INSTALL}/usr/config/emulationstation/es_settings.cfg" fi if [[ "${DEVICE}" == "OdroidGoAdvance" ]] || [[ "${DEVICE}" == "GameForce" ]]; then sed -i "s|<\/config>| \n<\/config>|g" "${INSTALL}/usr/config/emulationstation/es_settings.cfg" sed -i "s|value=\"panel\" />|value=\"small panel\" />|g" "${INSTALL}/usr/config/emulationstation/es_settings.cfg" fi if [[ "${DEVICE}" == "GameForce" ]]; then mkdir -p ${INSTALL}/usr/config/emulationstation/themesettings sed -i "s|<\/config>| \n<\/config>|g" "${INSTALL}/usr/config/emulationstation/es_settings.cfg" echo "subset.ratio=43" > ${INSTALL}/usr/config/emulationstation/themesettings/Crystal.cfg fi # Remove unused cores CORESFILE="${INSTALL}/usr/config/emulationstation/es_systems.cfg" if [[ "${DEVICE}" != "Amlogic-ng" || "${DEVICE}" != "Amlogic-ne" || "${DEVICE}" != "Amlogic-no" ]]; then if [[ ${DEVICE} == "OdroidGoAdvance" || "${DEVICE}" == "GameForce" ]]; then remove_cores="mesen-s quicknes mame2016 mesen" elif [ "${DEVICE}" == "Amlogic-old" ]; then remove_cores="mesen-s quicknes mame2016 mesen yabasanshiroSA yabasanshiro" xmlstarlet ed -L -P -d "/systemList/system[name='saturn']" ${CORESFILE} xmlstarlet ed -L -P -d "/systemList/system[name='philips-cdi']" ${CORESFILE} xmlstarlet ed -L -P -d "/systemList/system/emulators/emulator[@name='Duckstation']" ${CORESFILE} fi for discore in ${remove_cores}; do sed -i "s|${discore}||g" ${CORESFILE} sed -i '/^[[:space:]]*$/d' ${CORESFILE} done fi # Remove Retrorun For unsupported devices if [[ ${DEVICE} != "OdroidGoAdvance" ]] && [[ "${DEVICE}" != "GameForce" ]]; then xmlstarlet ed -L -P -d "/systemList/system/emulators/emulator[@name='retrorun']" ${CORESFILE} else # remove duckstation for the OGA/GF xmlstarlet ed -L -P -d "/systemList/system/emulators/emulator[@name='Duckstation']" ${CORESFILE} # set parallel_n64_32b as default for handhelds sed -i "s|mupen64plus_next|mupen64plus_next|g" ${CORESFILE} sed -i "s|parallel_n64_32b|parallel_n64_32b|g" ${CORESFILE} fi } post_install() { enable_service emustation.service mkdir -p ${INSTALL}/usr/share ln -sf /storage/.config/emuelec/configs/locale ${INSTALL}/usr/share/locale mkdir -p ${INSTALL}/usr/bin/batocera/ ln -sf /usr/bin/7zr ${INSTALL}/usr/bin/batocera/7zr } ================================================ FILE: packages/sx05re/emuelec-emulationstation/patches/Rockchip/HH/emuelec-emulationstation-oga-fixes.patch ================================================ --- a/es-app/src/guis/GuiMenu.cpp +++ b/es-app/src/guis/GuiMenu.cpp @@ -1561,7 +1561,7 @@ } #endif -#ifdef BATOCERA +#if defined(ENABLE_GAMEFORCE) || defined(ODROIDGOA) s->addGroup(_("HARDWARE")); #endif --- a/es-core/src/Settings.cpp +++ b/es-core/src/Settings.cpp @@ -181,7 +181,7 @@ // Audio out device for volume control #if defined _RPI_ || defined _ENABLEEMUELEC - mStringMap["AudioDevice"] = "PCM"; + mStringMap["AudioDevice"] = "Playback"; #else mStringMap["AudioDevice"] = "Master"; #endif --- a/es-app/src/FileData.cpp +++ b/es-app/src/FileData.cpp @@ -741,10 +741,12 @@ VolumeControl::getInstance()->deinit(); bool hideWindow = Settings::getInstance()->getBool("HideWindow"); +/* #ifdef _ENABLEEMUELEC // attempts to fix screen tearing issue, we always need hideWindow to false hideWindow = false; #endif +*/ window->deinit(hideWindow); const std::string rom = Utils::FileSystem::getEscapedPath(getPath()); --- a/es-core/src/InputManager.cpp +++ b/es-core/src/InputManager.cpp @@ -587,15 +587,6 @@ if (ev.key.repeat) return false; -#ifdef _ENABLEEMUELEC - /* use the POWER KEY to turn off EmuELEC, specially useful for GTKING-PRO and Odroid Go Advance*/ - if(ev.key.keysym.sym == SDLK_POWER) { - Scripting::fireEvent("quit", "shutdown"); - Utils::Platform::quitES(Utils::Platform::QuitMode::SHUTDOWN); - /*LOG(LogError) << "no quit?";*/ - return false; - } -#endif #if !WIN32 if (ev.key.keysym.sym == SDLK_F4) @@ -607,11 +598,11 @@ } #endif - window->input(getInputConfigByDevice(DEVICE_KEYBOARD), Input(DEVICE_KEYBOARD, TYPE_KEY, ev.key.keysym.sym, 1, false)); + if(ev.key.keysym.sym != SDLK_POWER) window->input(getInputConfigByDevice(DEVICE_KEYBOARD), Input(DEVICE_KEYBOARD, TYPE_KEY, ev.key.keysym.sym, 1, false)); return true; case SDL_KEYUP: - window->input(getInputConfigByDevice(DEVICE_KEYBOARD), Input(DEVICE_KEYBOARD, TYPE_KEY, ev.key.keysym.sym, 0, false)); + if(ev.key.keysym.sym != SDLK_POWER) window->input(getInputConfigByDevice(DEVICE_KEYBOARD), Input(DEVICE_KEYBOARD, TYPE_KEY, ev.key.keysym.sym, 0, false)); return true; case SDL_TEXTINPUT: --- a/es-app/src/views/ViewController.cpp +++ b/es-app/src/views/ViewController.cpp @@ -527,11 +527,9 @@ #ifdef _ENABLEEMUELEC /* Detect unconfigured keyboad as well */ if(config->isConfigured() == false) { - if(input.type == TYPE_BUTTON || input.type == TYPE_KEY) { - if(input.id != SDLK_POWER) { + if(input.type == TYPE_BUTTON) { mWindow->pushGui(new GuiDetectDevice(mWindow, false, NULL)); return true; - } } } #else ================================================ FILE: packages/sx05re/emuelec-emulationstation/patches/Rockchip/emuelec-emulationstation-window-fix-rockchip.patch ================================================ --- a/es-app/src/FileData.cpp +++ b/es-app/src/FileData.cpp @@ -741,10 +741,12 @@ VolumeControl::getInstance()->deinit(); bool hideWindow = Settings::getInstance()->getBool("HideWindow"); +/* #ifdef _ENABLEEMUELEC // attempts to fix screen tearing issue, we always need hideWindow to false hideWindow = false; #endif +*/ window->deinit(hideWindow); const std::string rom = Utils::FileSystem::getEscapedPath(getPath()); ================================================ FILE: packages/sx05re/emuelec-emulationstation/system.d/emustation.service ================================================ [Unit] Description=EmulationStation emulator frontend ConditionPathExists=/var/lock/start.games [Service] Environment=HOME=/storage EnvironmentFile=/storage/.config/emulationstation/scripts/es_env.sh ExecStartPre=emustation-config ExecStartPre=/usr/bin/killes.sh ExecStart=/bin/bash -c 'emulationstation $(cat /emuelec/configs/ES_ARGS)' KillMode=process TimeoutStopSec=3 Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=emuelec.target ================================================ FILE: packages/sx05re/emuelec-emulationstation/themes/Crystal/Crystal-Collections/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="Crystal-Collections" PKG_VERSION="ac3311290ecf19a272535d2a9566ec58b8fdd3e8" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/dm2912/Crystal-Collections" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="emuelec" PKG_SHORTDESC="Crystal Dynamic Collections for use on the Crystal Theme" PKG_TOOLCHAIN="manual" GET_HANDLER_SUPPORT="git" make_target() { : not } makeinstall_target() { mkdir -p ${INSTALL}/usr/config/emulationstation/collections cp -r *.xcc ${INSTALL}/usr/config/emulationstation/collections } ================================================ FILE: packages/sx05re/emuelec-emulationstation/themes/Crystal/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="Crystal" PKG_VERSION="0e3c9e15768517cb80926850345a90fb24bd20f2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/dm2912/Crystal" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain Crystal-Collections" PKG_SECTION="emuelec" PKG_SHORTDESC="Crystal theme for EMUELEC by Dim (dm2912)" PKG_TOOLCHAIN="manual" GET_HANDLER_SUPPORT="git" make_target() { : not } makeinstall_target() { mkdir -p ${INSTALL}/usr/config/emulationstation/themes/Crystal cp -r * ${INSTALL}/usr/config/emulationstation/themes/Crystal rm -rf ${INSTALL}/usr/config/emulationstation/themes/Crystal/screens.png } ================================================ FILE: packages/sx05re/emuelec-emulationstation/themes/es-theme-EmuELEC-carbon/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="es-theme-EmuELEC-carbon" PKG_VERSION="381e539bd1d7e86d87e2ba679e95ddca6888ddd2" PKG_SHA256="18ed2aebd4e3776a42bfa89a489ac45b4c338c86dcef5ff8cd123e7bd7cc0ae2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/EmuELEC/es-theme-EmuELEC-carbon" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="emuelec" PKG_SHORTDESC="The EmulationStation theme Carbon Fabrice Caruso's fork with changes for EmuELEC by drixplm" PKG_IS_ADDON="no" PKG_AUTORECONF="no" PKG_TOOLCHAIN="manual" make_target() { : not } makeinstall_target() { mkdir -p ${INSTALL}/usr/config/emulationstation/themes/es-theme-EmuELEC-carbon cp -r * ${INSTALL}/usr/config/emulationstation/themes/es-theme-EmuELEC-carbon } ================================================ FILE: packages/sx05re/emuelec-ports/VVVVVV/config/saves/settings.vvv ================================================ 1 2 ================================================ FILE: packages/sx05re/emuelec-ports/VVVVVV/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="VVVVVV" PKG_VERSION="f27374d92e7af762d7bfc0d1f36e9a84ffd3d634" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="CUSTOM" PKG_SITE="https://github.com/TerryCavanagh/VVVVVV" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_mixer" PKG_SHORTDESC="VVVVVV License: https://github.com/TerryCavanagh/VVVVVV/blob/master/LICENSE.md" PKG_LONGDESC="VVVVVV is a platform game all about exploring one simple mechanical idea - what if you reversed gravity instead of jumping?" PKG_TOOLCHAIN="cmake" if [ "${DEVICE}" == "Amlogic-ogu" ]; then # OGU uses SDL 2.0.22 which is not compatible with newer versions of VVVVVV PKG_VERSION="67d350de05850067e7bc976a9a370dcff28df62b" fi if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then PKG_PATCH_DIRS="OdroidGoAdvance" fi PKG_CMAKE_OPTS_TARGET=" desktop_version" pre_configure_target() { sed -i "s/fullscreen = false/fullscreen = true/" "${PKG_BUILD}/desktop_version/src/Screen.cpp" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp VVVVVV ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emuelec-ports/VVVVVV/patches/VVVVVV-01-bios_path.patch ================================================ --- a/desktop_version/src/FileSystemUtils.cpp +++ b/desktop_version/src/FileSystemUtils.cpp @@ -150,7 +150,7 @@ else { SDL_snprintf(output, sizeof(output), "%s%s", - basePath, + "/storage/roms/ports/VVVVVV/", "data.zip" ); } @@ -173,7 +173,7 @@ goto end; } - SDL_snprintf(output, sizeof(output), "%s%s", basePath, "gamecontrollerdb.txt"); + SDL_snprintf(output, sizeof(output), "%s%s", "/storage/.config/SDL-GameControllerDB/", "gamecontrollerdb.txt"); if (SDL_GameControllerAddMappingsFromFile(output) < 0) { vlog_info("gamecontrollerdb.txt not found!"); ================================================ FILE: packages/sx05re/emuelec-ports/abuse/config/gptokeyb/abuse.gptk ================================================ back = esc start = enter guide = enter a = x b = z x = c y = a l1 = shift l2 = home l3 = mouse_left r1 = s r2 = end r3 = mouse_right up = up down = down left = left right = right left_analog_up = up left_analog_down = down left_analog_left = left left_analog_right = right right_analog_up = mouse_movement_ right_analog_down = mouse_movement_down right_analog_left = mouse_movement_left right_analog_right = mouse_movement_right deadzone_y = 2100 deadzone_x = 1900 deadzone_triggers = 3000 mouse_scale = 512 mouse_delay = 16 ================================================ FILE: packages/sx05re/emuelec-ports/abuse/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="abuse" PKG_VERSION="9d1f66f57377859bae10e28eabebea0b9c750490" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/Xenoveritas/abuse" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_mixer libepoxy" PKG_LONGDESC="Abuse SDL port originally from Crack-Dot-Com and released into the public domain" GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="cmake" PKG_CMAKE_OPTS_TARGET=" -DCMAKE_BUILD_TYPE=Release" pre_configure_target() { if [ ! -e ${SOURCES}/${PKG_NAME}/abuse-0.8.tar.gz ]; then wget http://abuse.zoy.org/raw-attachment/wiki/download/abuse-0.8.tar.gz -P ${SOURCES}/${PKG_NAME} fi tar -xf ${SOURCES}/${PKG_NAME}/abuse-0.8.tar.gz -C ${SOURCES}/${PKG_NAME}/ rm -rf ${PKG_BUILD}/data/{music,sfx} mv ${SOURCES}/${PKG_NAME}/abuse-0.8/data/music ${PKG_BUILD}/data mv ${SOURCES}/${PKG_NAME}/abuse-0.8/data/sfx ${PKG_BUILD}/data rm -rf ${SOURCES}/${PKG_NAME}/abuse-0.8/ } post_makeinstall_target() { mkdir -p ${INSTALL}/usr/config/emuelec/configs/ cp -rf ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/ } ================================================ FILE: packages/sx05re/emuelec-ports/augustus/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="augustus" PKG_VERSION="8a136244e8edf87e7b061d6da3fb36457e1d6f03" PKG_SHA256="49bb5fdd6e2ba11821fe02a4678283d393aab0dff6bc8cb62fd577b5848df345" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/Keriew/augustus" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_LONGDESC="An open source re-implementation of Caesar III" PKG_TOOLCHAIN="cmake-make" pre_configure_target() { # Just setting the version sed -i "s|unknown development version|Version: ${PKG_VERSION:0:7} - ${DISTRO}|g" ${PKG_BUILD}/CMakeLists.txt } ================================================ FILE: packages/sx05re/emuelec-ports/augustus/patches/01-augustus-EmuELEC-fixes.patch ================================================ --- a/src/platform/joystick.c +++ b/src/platform/joystick.c @@ -103,7 +103,7 @@ #if defined(__vita__) || defined(__SWITCH__) return 1; #else - return 0; + return 1; #endif } --- a/src/platform/vita/vita.h +++ b/src/platform/vita/vita.h @@ -25,3 +25,10 @@ #endif // __vita__ #endif // PLATFORM_VITA_H + +// We are not compiling for vita, but vita.h header is used widely we can set our options for EmuELEC here +// We force the software use of cursor so that it is shown. +#define PLATFORM_USE_SOFTWARE_CURSOR + +// Fix for misaligned textures: https://github.com/Keriew/augustus/issues/645 +// echo "#define MAX_TEXTURE_SIZE 1024" >> ${PKG_BUILD}/src/platform/vita/vita.h ================================================ FILE: packages/sx05re/emuelec-ports/bennugd-monolithic/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="bennugd-monolithic" PKG_VERSION="60ee3389efcf9b402d66035e87f33d17d70cbd83" PKG_ARCH="arm" PKG_SITE="https://github.com/christianhaitian/bennugd-monolithic" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain libvorbisidec SDL2 SDL2_mixer libpng tre" PKG_SHORTDESC="Use for executing bennugd games like Streets of Rage Remake " PKG_TOOLCHAIN="cmake-make" chainfile="cmake-aarch64-libreelec-linux-gnueabi.conf" if [ ${ARCH} == "arm" ]; then chainfile="cmake-${TARGET_NAME}.conf" fi pre_configure_target() { PKG_CMAKE_SCRIPT="${PKG_BUILD}/projects/cmake/bgdc/CMakeLists.txt" cd ${PKG_BUILD}/projects/cmake/bgdc/ cmake -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN}/etc/${chainfile} -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=MinSizeRel ${PKG_CMAKE_SCRIPT} make PKG_CMAKE_SCRIPT="${PKG_BUILD}/projects/cmake/bgdi/CMakeLists.txt" cd ${PKG_BUILD}/projects/cmake/bgdi/ cmake -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN}/etc/${chainfile} -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=MinSizeRel ${PKG_CMAKE_SCRIPT} make } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/projects/cmake/bgdi/bgdi ${INSTALL}/usr/bin cp ${PKG_BUILD}/projects/cmake/bgdc/bgdc ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emuelec-ports/bennugd-monolithic/tre/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="tre" PKG_VERSION="6092368aabdd0dbb0fbceb2766a37b98e0ff6911" PKG_ARCH="any" PKG_SITE="https://github.com/laurikari/tre" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_SHORTDESC="The approximate regex matching library and agrep command line tool." PKG_TOOLCHAIN="autotools" pre_configure_target() { sed -i "s|AM_GNU_GETTEXT_VERSION(0.17)|AM_GNU_GETTEXT_REQUIRE_VERSION(0.17)|" ${PKG_BUILD}/configure.ac } ================================================ FILE: packages/sx05re/emuelec-ports/bermuda/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="bermuda" PKG_VERSION="cf6bdb68d53a1618967da565a44c931b15daf791" PKG_SHA256="5e71a82c38a9496baea8a20d6463630f848aa20db9db90de0cccb4e68e159851" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Unspecified" PKG_SITE="https://github.com/cyxx/bermuda" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_mixer SDL2_image" PKG_LONGDESC="Bermuda Syndrome engine reimplementation (Emscripten, libretro, SDL) " PKG_TOOLCHAIN="make" pre_configure_target(){ sed -i "s|sdl2-config|${SYSROOT_PREFIX}/usr/bin/sdl2-config|g" ${PKG_BUILD}/Makefile } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp bs ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emuelec-ports/broguece/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="broguece" PKG_VERSION="dfd321ed82b104ed141323baefc6fef1c7b60315" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="AGPL3" PKG_SITE="https://github.com/tmewett/BrogueCE" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_image" PKG_LONGDESC="Brogue: Community Edition - a community-lead fork of the much-loved minimalist roguelike game" GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="make" pre_configure_target() { sed -i "s|#include |#include |" ${PKG_BUILD}/src/platform/tiles.c ${PKG_BUILD}/src/platform/sdl2-platform.c } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -rf ${PKG_BUILD}/bin/assets ${INSTALL}/usr/bin cp -rf ${PKG_BUILD}/bin/brogue ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emuelec-ports/bstone/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="bstone" PKG_VERSION="ca0c1a02abcf2513b1871a09f786162abb41caec" PKG_ARCH="any" PKG_SITE="https://github.com/bibendovsky/bstone" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_SHORTDESC="Unofficial source port for Blake Stone series " PKG_TOOLCHAIN="cmake" PKG_CMAKE_OPTS_TARGET=" -DCMAKE_BUILD_TYPE=Release" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -rf ${PKG_BUILD}/.${TARGET_NAME}/src/bstone/bstone ${INSTALL}/usr/bin/bstone cp -rf ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin/ } ================================================ FILE: packages/sx05re/emuelec-ports/bstone/scripts/bstone.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile DATADIR="/storage/roms/ports/bstone/aog" if [ "${1}" == "ps" ]; then DATADIR="/storage/roms/ports/bstone/ps" fi CONFIGFOLDER="/storage/.config/emuelec/configs/bstone" PORTNAME="bstone" GPTOKEYB_CONFIG="/emuelec/configs/gptokeyb/default.gptk" [[ -e "/emuelec/configs/gptokeyb/bstone.gptk" ]] && GPTOKEYB_CONFIG="/emuelec/configs/gptokeyb/bstone.gptk" gptokeyb -c "${GPTOKEYB_CONFIG}" & mkdir -p "${CONFIGFOLDER}" cd "${CONFIGFOLDER}" if [ "${EE_DEVICE}" == "Amlogic-ng" ]; then params="--vid_renderer software --vid_width 1920 --vid_height 1080 --vid_is_widescreen 1" else params="--vid_renderer auto-detect" case $(oga_ver) in "OGS") params+=" --vid_width 854 --vid_height 480 --vid_is_widescreen 1" ;; "OGA") params+=" --vid_width 480 --vid_height 320 --vid_is_widescreen 1" ;; "GF") params+=" --vid_width 640 --vid_height 480 --vid_is_widescreen 0" ;; esac fi bstone --profile_dir "${CONFIGFOLDER}" --data_dir "${DATADIR}" ${params} ================================================ FILE: packages/sx05re/emuelec-ports/ccleste/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="ccleste" PKG_VERSION="261d96f15af430b8111abc7a5250229246654f52" PKG_SITE="https://github.com/lemon32767/ccleste" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_mixer" PKG_SHORTDESC="Celeste Classic C source port for 3DS and PC." PKG_TOOLCHAIN="make" pre_configure_target() { sed -i "s|=sdl2-config|=${SYSROOT_PREFIX}/usr/bin/sdl2-config|g" Makefile } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/ccleste cp ${PKG_BUILD}/ccleste ${INSTALL}/usr/bin cp -rf ${PKG_BUILD}/data ${INSTALL}/usr/config/emuelec/configs/ccleste } ================================================ FILE: packages/sx05re/emuelec-ports/cdogs-sdl/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="cdogs-sdl" PKG_VERSION="c337d85e16fdd36cdaf455e5779ecbdfc0300c6f" PKG_ARCH="any" PKG_SITE="https://github.com/cxong/cdogs-sdl" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 python3-protobuf:host" PKG_SHORTDESC="Classic overhead run-and-gun game" PKG_TOOLCHAIN="cmake-make" pre_configure_target() { sed -i "s|-Werror|-Wno-error|" ${PKG_BUILD}/CMakeLists.txt PKG_CMAKE_OPTS_TARGET=" -DCDOGS_DATA_DIR=/storage/roms/ports/cdogs-sdl/ -DBUILD_EDITOR=OFF -DCMAKE_BUILD_TYPE=Release" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -rf ${PKG_BUILD}/.${TARGET_NAME}/src/cdogs-sdl ${INSTALL}/usr/bin cp -rf ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emuelec-ports/cdogs-sdl/scripts/cdogs-sdl.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile DATAFILE="C-Dogs.SDL-1.5.0-Linux.tar.gz" DATA="https://github.com/cxong/cdogs-sdl/releases/download/1.5.0/${DATAFILE}" CONFIGFOLDER="/storage/roms/ports/cdogs-sdl" PORTNAME="Cdogs-sdl" FLAGS="" mkdir -p "${CONFIGFOLDER}" cd "${CONFIGFOLDER}" if [ ! -e "${CONFIGFOLDER}/data/ammo.json" ]; then text_viewer -y -w -f 24 -t "Data does not exists!" -m "It seems this is the first time you are launching ${PORTNAME} or the data folder does not exists\n\nData is about 35 MB total, and you need to be connected to the internet\n\n\nDownload and continue?" if [[ $? == 21 ]]; then ee_console enable clear > /dev/tty0 cat /etc/motd > /dev/tty0 echo "Downloading ${PORTNAME} data, please wait..." > /dev/tty0 wget "${DATA}" -q --show-progress > /dev/tty0 2>&1 echo "Installing ${PORTNAME} data, please wait..." > /dev/tty0 tar -xvf "${DATAFILE}" -C "${CONFIGFOLDER}" > /dev/tty0 mv C-Dogs.SDL-1.5.0-Linux/* "${CONFIGFOLDER}" rm -rf C-Dogs.SDL-1.5.0-Linux bin share > /dev/tty0 2>&1 rm "${DATAFILE}" > /dev/tty0 2>&1 echo "Starting ${PORTNAME} for the first time, please wait..." > /dev/tty0 ee_console disable cd "${CONFIGFOLDER}" cdogs-sdl ${FLAGS} > /emuelec/logs/emuelec.log 2>&1 else exit 0 fi else cdogs-sdl ${FLAGS} > /emuelec/logs/emuelec.log 2>&1 fi killall gptokeyb & ================================================ FILE: packages/sx05re/emuelec-ports/celeste/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="celeste" PKG_VERSION="1.0" PKG_ARCH="any" PKG_LICENSE="GPL2" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SHORTDESC="Script file to run celeste (itch.io linux version)" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp celeste.sh ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs cp celeste.tar.xz ${INSTALL}/usr/config/emuelec/configs } ================================================ FILE: packages/sx05re/emuelec-ports/celeste/sources/celeste.sh ================================================ #!/bin/bash . /etc/profile directory="/storage/roms" gamedir="/$directory/ports/celeste" gameassembly="Celeste.exe" # Untar port files if [[ ! -f "${gamedir}/celeste-repacker" ]]; then tar -xf "/emuelec/configs/celeste.tar.xz" -C "$directory/ports" fi # check if required fmodengine files are installed if [[ -f "${gamedir}/fmodstudioapi20216linux.tar.gz" ]] && [[ ! -f "${gamedir}/libs/libfmod.so.13" ]]; then mkdir -p "/emuelec/configs/fmod/" tar -xvf "${gamedir}/fmodstudioapi20216linux.tar.gz" -C "/emuelec/configs/fmod/" cd "/emuelec/configs/fmod/" tar -xvf "fmodstudioapi20216linux.tar.gz" cp fmodstudioapi20216linux/api/core/lib/arm64/libfmod.so.13.16 "${gamedir}/libs/libfmod.so.13" cp fmodstudioapi20216linux/api/studio/lib/arm64/libfmodstudio.so.13.16 "${gamedir}/libs/libfmodstudio.so.13" rm -rf "/emuelec/configs/fmod/" fi # Double check if required fmod files are installed, because why not. if [[ ! -f "${gamedir}/libs/libfmod.so.13" ]] || [[ ! -f "${gamedir}/libs/libfmodstudio.so.13" ]]; then text_viewer -e -w -t "ERROR!" -f 24 -m "Fmod does not exist on ${gamedir}/libs\n\nYou need to provide the fmodengine files from https://www.fmod.com/ then copy the file fmodstudioapi20216linux.tar.gz to ${gamedir}" exit 0 fi # check if required game files are installed if [[ ! -f "${gamedir}/gamedata/${gameassembly}" ]]; then text_viewer -e -w -t "ERROR!" -f 24 -m "Celeste Game Data does not exist on ${gamedir}/gamedata\n\nYou need to provide your own game data from your copy of the game" exit 0 fi cd "$gamedir/gamedata" # Setup mono monodir="/emuelec/mono" monofile="$directory/ports/mono-6.12.0.122-aarch64.squashfs" if [ ! -e "${monofile}" ]; then monourl="https://github.com/PortsMaster/PortMaster-Hosting/releases/download/large-files/mono-6.12.0.122-aarch64.squashfs" text_viewer -y -w -f 24 -t "MONO does not exists!" -m "It seems this is the first time you are launching Celeste or the MONO file does not exists\n\nMONO is about 260 MB, and you need to be connected to the internet\n\nIMPORTANT: THIS IS NOT THE GAME DATA! YOU STILL NEED TO PROVIDE THIS FROM YOUR COPY OF THE ITCH.IO VERSION OF THE GAME!\n\nDownload and continue?" if [[ $? == 21 ]]; then ee_console enable wget "${monourl}" -O "${monofile}" -q --show-progress > /dev/tty0 2>&1 ee_console disable else exit 0 fi else mkdir -p "$monodir" umount "$monofile" || true mount "$monofile" "$monodir" fi # Setup savedir export XDG_DATA_HOME=/emuelec/configs if [ ! -L ${XDG_DATA_HOME}/Celeste ]; then rm -rf ${XDG_DATA_HOME}/Celeste mkdir -p ${XDG_DATA_HOME}/Celeste ln -sfv "${gamedir}/savedata" ${XDG_DATA_HOME}/Celeste fi # Remove all the dependencies in favour of system libs - e.g. the included # newer version of FNA with patcher included rm -f System*.dll mscorlib.dll FNA.dll Mono.*.dll cp $gamedir/libs/Celeste.exe.config $gamedir/gamedata # Setup path and other environment variables export FNA_PATCH="$gamedir/dlls/CelestePatches.dll" export MONO_PATH="$gamedir/dlls" export LD_LIBRARY_PATH="$gamedir/libs":"${monodir}/lib":$LD_LIBRARY_PATH export PATH="$monodir/bin":"$PATH" export FNA3D_OPENGL_FORCE_ES3=1 export FNA3D_OPENGL_FORCE_VBO_DISCARD=1 # For Amlogic-NG we can use the textures at full size so skip the conversion [[ "${EE_DEVICE}" == "Amlogic-ng" ]] && touch "$gamedir/.astc_done" # Compress all textures with ASTC codec, bringing massive vram gains if [[ ! -f "$gamedir/.astc_done" ]]; then echo "Optimizing textures..." >> /dev/tty0 "$gamedir/celeste-repacker" "$gamedir/gamedata/Content/Graphics/" --install >> /dev/tty0 if [ $? -eq 0 ]; then touch "$gamedir/.astc_done" fi fi # first_time_setup mono Celeste.exe kill -9 $(pidof gptokeyb) umount "$monodir" ================================================ FILE: packages/sx05re/emuelec-ports/chocolate-doom/config/chocolate-doom.cfg ================================================ video_driver "" window_position "" fullscreen 1 aspect_ratio_correct 1 integer_scaling 0 vga_porch_flash 0 window_width 800 window_height 600 fullscreen_width 0 fullscreen_height 0 force_software_renderer 0 max_scaling_buffer_pixels 16000000 startup_delay 1000 show_endoom 1 show_diskicon 1 png_screenshots 0 snd_samplerate 44100 snd_cachesize 67108864 snd_maxslicetime_ms 28 snd_pitchshift 0 snd_musiccmd "" snd_dmxoption "" opl_io_port 0x388 use_libsamplerate 0 libsamplerate_scale 0.650000 autoload_path "" music_pack_path "/storage/.local/share/chocolate-doom/music-packs" timidity_cfg_path "/storage/.config/timidity/timidity.cfg" gus_patch_path "" gus_ram_kb 1024 vanilla_savegame_limit 1 vanilla_demo_limit 1 vanilla_keyboard_mapping 1 player_name "EmuELEC Demon" grabmouse 1 novert 0 mouse_acceleration 2.000000 mouse_threshold 10 mouseb_strafeleft -1 mouseb_straferight -1 mouseb_use -1 mouseb_backward -1 mouseb_prevweapon -1 mouseb_nextweapon -1 dclick_use 1 joystick_guid "050000007e0500000920000001000000" joystick_index 0 joystick_x_axis 131328 joystick_x_invert 0 joystick_y_axis 131584 joystick_y_invert 0 joystick_strafe_axis -1 joystick_strafe_invert 0 joystick_look_axis -1 joystick_look_invert 0 joystick_physical_button0 0 joystick_physical_button1 1 joystick_physical_button2 5 joystick_physical_button3 4 joystick_physical_button4 4 joystick_physical_button5 5 joystick_physical_button6 6 joystick_physical_button7 7 joystick_physical_button8 8 joystick_physical_button9 9 joystick_physical_button10 10 joyb_strafeleft -1 joyb_straferight -1 joyb_menu_activate -1 joyb_toggle_automap -1 joyb_prevweapon -1 joyb_nextweapon -1 key_pause 69 key_menu_activate 1 key_menu_up 72 key_menu_down 80 key_menu_left 75 key_menu_right 77 key_menu_back 14 key_menu_forward 28 key_menu_confirm 21 key_menu_abort 49 key_menu_help 59 key_menu_save 60 key_menu_load 61 key_menu_volume 62 key_menu_detail 63 key_menu_qsave 64 key_menu_endgame 65 key_menu_messages 66 key_menu_qload 67 key_menu_quit 68 key_menu_gamma 87 key_spy 88 key_menu_incscreen 13 key_menu_decscreen 12 key_menu_screenshot 0 key_map_toggle 15 key_map_north 72 key_map_south 80 key_map_east 77 key_map_west 75 key_map_zoomin 13 key_map_zoomout 12 key_map_maxzoom 11 key_map_follow 33 key_map_grid 34 key_map_mark 50 key_map_clearmark 46 key_weapon1 2 key_weapon2 3 key_weapon3 4 key_weapon4 5 key_weapon5 6 key_weapon6 7 key_weapon7 8 key_weapon8 9 key_prevweapon 0 key_nextweapon 0 key_message_refresh 28 key_demo_quit 16 key_multi_msg 20 key_multi_msgplayer1 34 key_multi_msgplayer2 23 key_multi_msgplayer3 48 key_multi_msgplayer4 19 ================================================ FILE: packages/sx05re/emuelec-ports/chocolate-doom/config/default.cfg ================================================ mouse_sensitivity 5 sfx_volume 8 music_volume 8 show_messages 1 key_right 77 key_left 75 key_up 72 key_down 80 key_strafeleft 51 key_straferight 52 key_fire 29 key_use 57 key_strafe 56 key_speed 54 use_mouse 1 mouseb_fire 0 mouseb_strafe 1 mouseb_forward 2 use_joystick 1 joyb_fire 0 joyb_strafe 2 joyb_use 1 joyb_speed 3 screenblocks 9 detaillevel 0 snd_channels 8 snd_musicdevice 8 snd_sfxdevice 3 snd_sbport 0 snd_sbirq 0 snd_sbdma 0 snd_mport 0 usegamma 0 chatmacro0 "No" chatmacro1 "I'm ready to kick butt!" chatmacro2 "I'm OK." chatmacro3 "I'm not looking too good!" chatmacro4 "Help!" chatmacro5 "You suck!" chatmacro6 "Next time, scumbag..." chatmacro7 "Come here!" chatmacro8 "I'll take care of it." chatmacro9 "Yes" ================================================ FILE: packages/sx05re/emuelec-ports/chocolate-doom/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="chocolate-doom" PKG_VERSION="72d9e9318c4ccc61dab29bb9cc30bc8a9a93266d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/chocolate-doom/chocolate-doom" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_LONGDESC="Chocolate Doom is a Doom source port that is minimalist and historically accurate." GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="auto" pre_configure_target() { sed -i "s|./convert-font|${PKG_BUILD}/textscreen/fonts/convert-font|g" ${PKG_BUILD}/textscreen/fonts/Makefile.am } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cd ${PKG_BUILD} cp .${TARGET_NAME}/src/chocolate-* ${INSTALL}/usr/bin cp .${TARGET_NAME}/src/midiread ${INSTALL}/usr/bin cp .${TARGET_NAME}/src/mus2mid ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/chocolate-doom cp ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/chocolate-doom mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emuelec-ports/chocolate-doom/scripts/chocodoom.sh ================================================ #!/usr/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) . /etc/profile RUN_DIR="/storage/roms/ports/doom" CONFIG_DIR="/emuelec/configs/chocolate-doom" LOCALCONFIG="/storage/.local/share/chocolate-doom" params=" --savedir ${CONFIG_DIR}" if [ ! -L "${LOCALCONFIG}" ]; then [[ -d "${LOCALCONFIG}" ]] && rm -rf "${LOCALCONFIG}" ln -sf "${CONFIG_DIR}" "${LOCALCONFIG}" fi GUID=$(echo "${2}" | grep -Ewo '[[:xdigit:]]{32}' | head -n1) # echo "Will use controller with ${GUID}" # Try to set up gamepad sed -i "s|joystick_guid.*|joystick_guid \"${GUID}\"|" "${CONFIG_DIR}/chocolate-doom.cfg" # EXT can be wad, WAD, iwad, IWAD, pwad, PWAD or choco FILE=$(basename -- "${1}") EXT=${1#*.} # If its not a simple wad (extension .doom) read the file and parse the data if [ ${EXT} == "doom" ]; then while IFS== read -r key value; do if [ "${key}" == "GAMETYPE" ]; then case ${value} in "doom"|"DOOM") PROGRAM="chocolate-doom" ;; "heretic"|"HERETIC") PROGRAM="chocolate-heretic" ;; "hexen"|"HEXEN") PROGRAM="chocolate-hexen" ;; "strife"|"STRIFE") PROGRAM="chocolate-strife" ;; *) PROGRAM="chocolate-doom" ;; esac fi if [ "${key}" == "SUBDIR" ]; then RUN_DIR="/storage/roms/ports/doom/${value}" fi if [ "${key}" == "PARAMS" ]; then params+=" ${value}" fi done < <(<"${1}" tr -d '\r'; echo;) else PROGRAM="chocolate-doom" params+=" -iwad ${1}" fi cd "${RUN_DIR}" # Do not overwrite log messages already written by emuelecRunEmu.sh /usr/bin/${PROGRAM} ${params} >>/emuelec/logs/emuelec.log 2>&1 ================================================ FILE: packages/sx05re/emuelec-ports/commander-genius/config/cgenius.cfg ================================================ [Audio] channels = 2 format = 32784 musicvol = 128 rate = 44100 sndblaster = true soundvol = 75 [Bound] down = 130 left = 140 right = 180 speed = 5 up = 50 [FileHandling] SearchPath1 = ${HOME}/.CommanderGenius SearchPath2 = /storage/roms/ports/cgenius SearchPath3 = SearchPath4 = [Game] hud = true keystack = false level_replayability = false modern_style = true pking = true rise_bonus = true showfps = false specialfx = true [Video] OGLfilter = best OpenGL = true ShowCursor = true TiltedScreen = false VirtPad = false aspect = 16:9 filter = 1 fps = 60 fullscreen = true gameHeight = 480 gameWidth = 640 height = 1080 scale = 1 scaletype = scale4x vsync = true width = 1920 [input0] Analog = false Back = Joy0-B6 Camlead = Joy0-B8 Down = Joy0-A1+ Fire = Joy0-B1 Help = Joy0-B9 Jump = Joy0-B0 Left = Joy0-A0- Lower-Left = Key 1073741901 (End) Lower-Right = Key 1073741902 (PageDown) Pogo = Joy0-B3 Right = Joy0-A0+ Run = Joy0-B2 Status = Joy0-B7 TwoButtonFiring = false Up = Joy0-A1- Upper-Left = Key 1073741898 (Home) Upper-Right = Key 1073741899 (PageUp) [input1] Analog = false Back = Key 27 (Escape) Camlead = Key 99 (C) Down = Key 1073741905 (Down) Fire = Key 32 (Space) Help = Key 1073741882 (F1) Jump = Key 1073742048 (Left Ctrl) Left = Key 1073741904 (Left) Lower-Left = Key 1073741901 (End) Lower-Right = Key 1073741902 (PageDown) Pogo = Key 1073742050 (Left Alt) Right = Key 1073741903 (Right) Run = Key 1073742049 (Left Shift) Status = Key 13 (Return) TwoButtonFiring = false Up = Key 1073741906 (Up) Upper-Left = Key 1073741898 (Home) Upper-Right = Key 1073741899 (PageUp) [input2] Analog = false Back = Key 27 (Escape) Camlead = Key 99 (C) Down = Key 1073741905 (Down) Fire = Key 32 (Space) Help = Key 1073741882 (F1) Jump = Key 1073742048 (Left Ctrl) Left = Key 1073741904 (Left) Lower-Left = Key 1073741901 (End) Lower-Right = Key 1073741902 (PageDown) Pogo = Key 1073742050 (Left Alt) Right = Key 1073741903 (Right) Run = Key 1073742049 (Left Shift) Status = Key 13 (Return) TwoButtonFiring = false Up = Key 1073741906 (Up) Upper-Left = Key 1073741898 (Home) Upper-Right = Key 1073741899 (PageUp) [input3] Analog = false Back = Key 27 (Escape) Camlead = Key 99 (C) Down = Key 1073741905 (Down) Fire = Key 32 (Space) Help = Key 1073741882 (F1) Jump = Key 1073742048 (Left Ctrl) Left = Key 1073741904 (Left) Lower-Left = Key 1073741901 (End) Lower-Right = Key 1073741902 (PageDown) Pogo = Key 1073742050 (Left Alt) Right = Key 1073741903 (Right) Run = Key 1073742049 (Left Shift) Status = Key 13 (Return) TwoButtonFiring = false Up = Key 1073741906 (Up) Upper-Left = Key 1073741898 (Home) Upper-Right = Key 1073741899 (PageUp) ================================================ FILE: packages/sx05re/emuelec-ports/commander-genius/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="commander-genius" PKG_VERSION="6f7e67ad07323416f798046d62be8e10e856d62a" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://gitlab.com/Dringgstein/Commander-Genius" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain boost Python3 SDL2 SDL2_image SDL2_mixer" PKG_SECTION="libretro" PKG_SHORTDESC="Modern Interpreter for the Commander Keen Games (Vorticon and Galaxy Games)" PKG_TOOLCHAIN="cmake" GET_HANDLER_SUPPORT="git" PKG_CMAKE_OPTS_TARGET="-DUSE_SDL2=ON -DBUILD_TARGET=LINUX -DCMAKE_BUILD_TYPE=Release -DUSE_OPENGL=OFF -DDOWNLOADER=OFF -DNOTYPESAVE=ON" makeinstall_target() { mkdir -p ${INSTALL}/usr/config/emuelec/configs/CommanderGenius cp -rf ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/CommanderGenius/ cp -rf ${PKG_BUILD}/vfsroot/* ${INSTALL}/usr/config/emuelec/configs/CommanderGenius/ mkdir -p ${INSTALL}/usr/bin cp -rf ${PKG_BUILD}/.${TARGET_NAME}/src/CGeniusExe ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emuelec-ports/commander-genius/patches/commander-genius-02-show-emuelec-rom-path.patch ================================================ --- a/src/engine/CGameLauncher.cpp +++ b/src/engine/CGameLauncher.cpp @@ -217,9 +217,7 @@ bool CGameLauncher::setupMenu() ss << "No games detected!\n"; ss << "You can copy some into:\n"; - ss << "\"" << searchPathGames << "\",\n"; - ss << "or download using \"+ More\" button\n"; - ss << "on the next page.\n"; + ss << "\"/storage/roms/ports/cgenius/games\",\n"; std::string msg(ss.str()); ================================================ FILE: packages/sx05re/emuelec-ports/devilutionX/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="devilutionX" PKG_VERSION="c31836eab89b01b9b93124c636086ed2963b55c0" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="unlicense" PKG_SITE="https://github.com/diasurgical/devilutionX" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_mixer SDL2_ttf" PKG_LONGDESC="Diablo build for modern operating systems " GET_HANDLER_SUPPORT="git" PKG_BUILD_FLAGS="-lto" pre_configure_target() { PKG_CMAKE_OPTS_TARGET=" -DCMAKE_BUILD_TYPE="Release" -DDEVILUTIONX_STATIC_CXX_STDLIB=OFF -DDISABLE_ZERO_TIER=ON -DBUILD_TESTING=OFF -DBUILD_ASSETS_MPQ=OFF -DDEBUG=OFF -DPREFILL_PLAYER_NAME=ON -DDEVILUTIONX_SYSTEM_LIBSODIUM=OFF" sed -i "s|\"assets\"\ DIRECTORY_SEPARATOR_STR|\"assets_dvx\"\ DIRECTORY_SEPARATOR_STR|" ${PKG_BUILD}/Source/utils/paths.cpp } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin/assets_dvx cp -rf ${PKG_BUILD}/.${TARGET_NAME}/devilutionx ${INSTALL}/usr/bin cp -rf ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin cp -rf ${PKG_BUILD}/.${TARGET_NAME}/assets/* ${INSTALL}/usr/bin/assets_dvx/ mkdir -p ${INSTALL}/usr/config/emuelec/configs/devilution/langs mv ${INSTALL}/usr/bin/assets_dvx/*.gmo ${INSTALL}/usr/config/emuelec/configs/devilution/langs } ================================================ FILE: packages/sx05re/emuelec-ports/devilutionX/patches/DevilutionX-fix-mouse.patch ================================================ --- a/Source/controls/plrctrls.cpp +++ b/Source/controls/plrctrls.cpp @@ -1284,6 +1284,8 @@ void HandleRightStickMotion() if (now - lastMouseSetTick > 0) { SetCursorPos(x, y); lastMouseSetTick = now; + MousePosition.x = x; + MousePosition.y = y; } } } ================================================ FILE: packages/sx05re/emuelec-ports/devilutionX/scripts/devilutionx.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile DIABLOPATH="/storage/.local/share/diasurgical/devilution" DIABLOROMPATH="/storage/roms/ports/diablo" EELANG=$(echo ${LANG} | cut -d= -f2 | cut -d_ -f1) if [ "${EELANG}" == "en" ]; then LANG="" fi mkdir -p ${DIABLOPATH} if [ -e ${DIABLOPATH}/diablo.ini ]; then sed -i "s|Code=.*|Code=${EELANG}|g" ${DIABLOPATH}/diablo.ini fi if [ -e ${DIABLOROMPATH}/diabdat.mpq ]; then if [ ! -L ${DIABLOPATH}/diabdat.mpq ]; then ln -sf ${DIABLOROMPATH}/diabdat.mpq ${DIABLOPATH}/diabdat.mpq fi else exit 21 fi if [ "${1}" == "hellfire" ]; then for hell in diabdat hellfire hfmonk hfmusic hfvoice; do if [ -e ${DIABLOROMPATH}/${hell}.mpq ]; then if [ ! -L ${DIABLOPATH}/${hell}.mpq ]; then ln -sf ${DIABLOROMPATH}/${hell}.mpq ${DIABLOPATH}/${hell}.mpq fi else exit 21 fi done else PARAMS=" --diablo" fi devilutionx --verbose ${PARAMS} ================================================ FILE: packages/sx05re/emuelec-ports/eduke/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="eduke" PKG_VERSION="8d79c372acdb00155c75f3b6ca914b852d689b0d" PKG_ARCH="any" PKG_LICENSE="GPL2 + BUILDLIC" PKG_SITE="https://eduke32.com" PKG_URL="https://voidpoint.io/terminx/eduke32.git" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_mixer timidity flac" PKG_LONGDESC="EDuke32 is an awesome, free homebrew game engine and source port of the classic PC first person shooter Duke Nukem 3D" GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="make" export GIT_SSL_NO_VERIFY=1 pre_configure_target() { export ARCH=${ARCH} sed -i "s|sdl2-config|${SYSROOT_PREFIX}/usr/bin/sdl2-config|" Common.mak sed -i "s|-latomic|#|" Common.mak PKG_MAKE_OPTS_TARGET=" duke3d LTO=1 SDL_TARGET=2 NOASM=1 HAVE_GTK2=0 POLYMER=1 USE_OPENGL=0 RELEASE=1 OPTLEVEL=3" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -rf eduke32 ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/eduke.sh ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emuelec-ports/eduke/patches/eduke-04-recast-function.patch ================================================ Index: source/duke3d/src/astub.cpp =================================================================== --- a/source/duke3d/src/astub.cpp (revision 8090) +++ b/source/duke3d/src/astub.cpp (working copy) @@ -4291,7 +4291,7 @@ i = (i&0x4)+((i>>4)&3); i = eitherSHIFT ? prev3[i] : next3[i]; message("Sector %d %s flip %d deg%s", sectnum, typestr[search], - klabs(orient[i])%360, orient[i] < 0 ? " mirrored":""); + (int)klabs(orient[i])%360, orient[i] < 0 ? " mirrored":""); i = (i&0x4)+((i&3)<<4); *stat &= ~0x34; *stat |= i; Index: source/duke3d/src/player.cpp =================================================================== --- a/source/duke3d/src/player.cpp (revision 8090) +++ b/source/duke3d/src/player.cpp (working copy) @@ -1666,7 +1666,7 @@ for (bssize_t i=0; i < pPlayer->numloogs; i++) { - int const rotAng = klabs(sintable[((loogCounter + i) << 5) & 2047]) >> 5; + int const rotAng = (int)klabs(sintable[((loogCounter + i) << 5) & 2047]) >> 5; int const rotZoom = 4096 + ((loogCounter + i) << 9); int const rotX = (-fix16_to_int(g_player[screenpeek].input->q16avel) >> 1) + (sintable[((loogCounter + i) << 6) & 2047] >> 10); ================================================ FILE: packages/sx05re/emuelec-ports/eduke/patches/eduke-05-fix-emuelec-compile.patch ================================================ --- a/Common.mak +++ b/Common.mak @@ -188,8 +188,8 @@ CCFULLPATH = $(DEVKITPPC)/bin/$(CC) endif -CC := $(CROSS)gcc$(CROSS_SUFFIX) -CXX := $(CROSS)g++$(CROSS_SUFFIX) +# CC := $(CROSS)gcc$(CROSS_SUFFIX) +# CXX := $(CROSS)g++$(CROSS_SUFFIX) ifeq ($(PLATFORM),DARWIN) CC := $(CROSS)clang$(CROSS_SUFFIX) @@ -201,12 +201,12 @@ L_CC := $(CC) L_CXX := $(CXX) -AR := $(CROSS)ar$(CROSS_SUFFIX) -RC := $(CROSS)windres$(CROSS_SUFFIX) -RANLIB := $(CROSS)ranlib$(CROSS_SUFFIX) -STRIP := $(CROSS)strip$(CROSS_SUFFIX) - -AS := nasm +# AR := $(CROSS)ar$(CROSS_SUFFIX) +# RC := $(CROSS)windres$(CROSS_SUFFIX) +# RANLIB := $(CROSS)ranlib$(CROSS_SUFFIX) +# STRIP := $(CROSS)strip$(CROSS_SUFFIX) + +# AS := nasm # LuaJIT standalone interpreter executable: LUAJIT := luajit$(HOSTEXESUFFIX) ================================================ FILE: packages/sx05re/emuelec-ports/eduke/scripts/eduke.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile DUKEDIR="/storage/.config/eduke32" DUKECFG="${DUKEDIR}/eduke32.cfg" mkdir -p "${DUKEDIR}" if [ ! -f "${DUKECFG}" ]; then # We only do these changes if the cfg file does not already exists, if it exists we asume the user has created it outside this script # Only for handheld devices, SBCs already handle this gratefully if [ "${EE_DEVICE}" == "OdroidGoAdvance" ] || [ "${EE_DEVICE}" == "GameForce" ]; then touch "${DUKECFG}" case "$(oga_ver)" in "OGA" | "OGABE") echo "ScreenDisplay = 0" > "${DUKECFG}" echo "ScreenHeight = 320" >> "${DUKECFG}" echo "ScreenMode = 0" >> "${DUKECFG}" echo "ScreenWidth = 480" >> "${DUKECFG}" echo "MaxRefreshFreq = 0" >> "${DUKECFG}" ;; "GF") echo "ScreenDisplay = 0" > "${DUKECFG}" echo "ScreenHeight = 480" >> "${DUKECFG}" echo "ScreenMode = 0" >> "${DUKECFG}" echo "ScreenWidth = 640" >> "${DUKECFG}" echo "MaxRefreshFreq = 0" >> "${DUKECFG}" ;; "OGS") echo "ScreenDisplay = 0" > "${DUKECFG}" echo "ScreenHeight = 480" >> "${DUKECFG}" echo "ScreenMode = 0" >> "${DUKECFG}" echo "ScreenWidth = 854" >> "${DUKECFG}" echo "MaxRefreshFreq = 0" >> "${DUKECFG}" ;; esac fi fi if [ "${EE_DEVICE}" == "OdroidGoAdvance" ] || [ "${EE_DEVICE}" == "GameForce" ]; then # Eduke does not run if there is less that x ammount of memory so we need to enable swap on devices with 1GB of RAM SWAP_FILE="/storage/.config/swap.conf" if [ ! -f "${SWAP_FILE}" ]; then cp /etc/swap.conf "${SWAP_FILE}" fi # We could potentially use /tmp/swap as the swap file by changing this: SWAPFILE="${HOME}/.cache/swapfile" in "${SWAP_FILE}" but not sure of the consequences # It needs at LEAST 300mb of swap, pretty greedy sed -i 's/SWAPFILESIZE=.*/SWAPFILESIZE="300"/' "${SWAP_FILE}" sed -i 's/SWAP_ENABLED=.*/SWAP_ENABLED="yes"/' "${SWAP_FILE}" /usr/lib/coreelec/mount-swap create /usr/lib/coreelec/mount-swap mount fi cd /storage/roms/ports/eduke eduke32 -j /storage/roms/ports/eduke > /emuelec/logs/emuelec.log 2>&1 if [ "${EE_DEVICE}" == "OdroidGoAdvance" ] || [ "${EE_DEVICE}" == "GameForce" ]; then /usr/lib/coreelec/mount-swap unmount rm -rf ${HOME}/.cache/swapfile sed -i 's/SWAP_ENABLED=.*/SWAP_ENABLED="no"/' "${SWAP_FILE}" fi ================================================ FILE: packages/sx05re/emuelec-ports/falloutce1/config/fallout.cfg ================================================ [debug] mode=environment output_map_data_info=0 show_load_info=0 show_script_messages=0 show_tile_num=0 [preferences] brightness=1.000000 combat_difficulty=1 combat_looks=1 combat_messages=1 combat_speed=0 combat_taunts=1 game_difficulty=2 item_highlight=1 language_filter=0 mouse_sensitivity=1.000000 player_speed=0 player_speedup=0 running=0 running_burning_guy=1 subtitles=1 target_highlight=2 text_base_delay=3.500000 text_line_delay=1.000000 violence_level=3 [sound] cache_size=448 device=-1 dma=-1 initialize=1 irq=-1 master_volume=22281 music=1 music_path1=/storage/roms/ports/falloutce1/data/sound/music/ music_path2=/storage/roms/ports/falloutce1/sound/music/ music_volume=22281 port=-1 sndfx_volume=22281 sounds=1 speech=1 speech_volume=22281 [system] art_cache_size=8 color_cycling=1 critter_dat=/storage/roms/ports/falloutce1/critter.dat critter_patches=/storage/roms/ports/falloutce1/data cycle_speed_factor=1 executable=game free_space=20480 hashing=1 interrupt_walk=1 language=english master_dat=/storage/roms/ports/falloutce1/master.dat master_patches=/storage/roms/ports/falloutce1/data scroll_lock=0 splash=3 ================================================ FILE: packages/sx05re/emuelec-ports/falloutce1/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="falloutce1" PKG_VERSION="bc5a9273304e53f06a7cdac5d12c856cc418e137" PKG_GIT_CLONE_BRANCH="patch-1" PKG_REV="1" PKG_ARCH="any" PKG_SITE="https://github.com/glebm/fallout1-ce" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_LONGDESC="Game port of Fallout using SDL2" PKG_TOOLCHAIN="cmake" GET_HANDLER_SUPPORT="git" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/.${TARGET_NAME}/fallout-ce ${INSTALL}/usr/bin cp -rf ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/falloutce1 cp ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/falloutce1 } ================================================ FILE: packages/sx05re/emuelec-ports/falloutce1/scripts/falloutce1.sh ================================================ if ! test -f /storage/roms/ports/falloutce1/fallout.cfg; then cp /usr/config/emuelec/configs/falloutce1/fallout.cfg /storage/roms/ports/falloutce1/ fi fallout-ce > /emuelec/logs/emuelec.log 2>&1 ================================================ FILE: packages/sx05re/emuelec-ports/falloutce2/config/fallout2.cfg ================================================ [debug] mode=environment output_map_data_info=0 show_load_info=0 show_script_messages=0 show_tile_num=0 [mapper] default_f8_as_game=1 fix_map_inventory=0 fix_map_objects=0 ignore_rebuild_errors=0 librarian=0 override_librarian=0 rebuild_protos=0 run_mapper_as_game=0 save_text_maps=0 show_pid_numbers=0 sort_script_list=0 use_art_not_protos=0 [preferences] brightness=1.000000 combat_difficulty=1 combat_looks=0 combat_messages=1 combat_speed=0 combat_taunts=1 game_difficulty=1 item_highlight=1 language_filter=0 mouse_sensitivity=1.000000 player_speed=0 running=0 running_burning_guy=1 subtitles=1 target_highlight=2 text_base_delay=6.000000 text_line_delay=2.000000 violence_level=3 [sound] cache_size=448 debug=0 debug_sfxc=1 device=-1 dma=-1 initialize=1 irq=-1 master_volume=22281 music=1 music_path1=/storage/roms/ports/falloutce2/data/sound/music/ music_path2=/storage/roms/ports/falloutce2/sound/music/ music_volume=22281 port=-1 sndfx_volume=22281 sounds=1 speech=1 speech_volume=22281 [system] art_cache_size=8 color_cycling=1 critter_dat=/storage/roms/ports/falloutce2/critter.dat critter_patches=/storage/roms/ports/falloutce2/data cycle_speed_factor=1 executable=game free_space=20480 hashing=1 interrupt_walk=1 language=english master_dat=/storage/roms/ports/falloutce2/master.dat master_patches=/storage/roms/ports/falloutce2/data scroll_lock=0 splash=3 ================================================ FILE: packages/sx05re/emuelec-ports/falloutce2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="falloutce2" PKG_VERSION="ec0685ea19dd636e38d81fd8695290b3b4b5cc22" PKG_REV="1" PKG_ARCH="any" PKG_SITE="https://github.com/alexbatalov/fallout2-ce" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_LONGDESC="Game port of Fallout 2 using SDL2" PKG_TOOLCHAIN="cmake" GET_HANDLER_SUPPORT="git" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/.${TARGET_NAME}/fallout2-ce ${INSTALL}/usr/bin cp -rf ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/falloutce2 cp ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/falloutce2 } ================================================ FILE: packages/sx05re/emuelec-ports/falloutce2/scripts/falloutce2.sh ================================================ if ! test -f /storage/roms/ports/falloutce2/fallout2.cfg; then cp /usr/config/emuelec/configs/falloutce2/fallout2.cfg /storage/roms/ports/falloutce2/ fi fallout2-ce > /emuelec/logs/emuelec.log 2>&1 ================================================ FILE: packages/sx05re/emuelec-ports/fheroes2/config/fheroes2.cfg ================================================ # fheroes2 configuration file (saved by version 0.9.7) # video mode (game resolution) videomode = 800x600 # music: original, expansion, external music = external # sound volume: 0 - 10 sound volume = 6 # music volume: 0 - 10 music volume = 6 # run in fullscreen mode: on/off (use F4 key to switch between modes) fullscreen = on # print debug messages (only for development, see src/engine/logging.h for possible values) debug = 5460 # heroes movement speed: 1 - 10 heroes speed = 5 # AI movement speed: 0 - 10 ai speed = 5 # battle speed: 1 - 10 battle speed = 4 # scroll speed: 1 - 4 scroll speed = 2 # show battle grid: on/off battle grid = on # show battle shadow movement: on/off battle shadow movement = on # show battle shadow cursor: on/off battle shadow cursor = on # auto resolve battles: on/off auto resolve battles = off # auto combat spell casting: on/off auto spell casting = on # game language (an empty value means English) lang = # controller pointer speed: 0 - 100 controller pointer speed = 30 # first time game run (show additional hints): on/off first time game run = on # show game intro (splash screen and video): on/off show game intro = on ================================================ FILE: packages/sx05re/emuelec-ports/fheroes2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="fheroes2" PKG_VERSION="35ca4c915be00098547d5050412a325dd55cfd7f" PKG_ARCH="any" PKG_SITE="https://github.com/ihhub/fheroes2" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_SHORTDESC="Free Heroes of Might and Magic II (fheroes2) is a recreation of HoMM2 game engine." PKG_TOOLCHAIN="cmake" PKG_CMAKE_OPTS_TARGET=" -DENABLE_RELEASE=ON -DUSE_SDL_VERSION=SDL2 -DENABLE_IMAGE=ON -DCMAKE_BUILD_TYPE=Release" makeinstall_target() { mkdir -p ${INSTALL}/usr/share/fheroes2/files/data mkdir -p ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/fheroes2 cp ${PKG_BUILD}/files/data/resurrection.h2d ${INSTALL}/usr/share/fheroes2/files/data cp ${PKG_BUILD}/.${TARGET_NAME}/fheroes2 ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin cp ${PKG_DIR}/config/* ${INSTALL}/usr/config/fheroes2 } ================================================ FILE: packages/sx05re/emuelec-ports/fheroes2/patches/fheroes2-01-init-game-controller-unconditionally.patch ================================================ From ff48479612dc8f64b27d0579700f96eb72623dd6 Mon Sep 17 00:00:00 2001 From: 7Ji Date: Wed, 10 Aug 2022 14:24:00 +0800 Subject: [PATCH] fheroes2: init game controller unconditionally --- src/fheroes2/game/fheroes2.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/fheroes2/game/fheroes2.cpp b/src/fheroes2/game/fheroes2.cpp index d1a03c95..7d277b13 100644 --- a/src/fheroes2/game/fheroes2.cpp +++ b/src/fheroes2/game/fheroes2.cpp @@ -239,11 +239,8 @@ int main( int argc, char ** argv ) } std::set coreComponents{ fheroes2::SystemInitializationComponent::Audio, - fheroes2::SystemInitializationComponent::Video }; - -#if defined( TARGET_PS_VITA ) || defined( TARGET_NINTENDO_SWITCH ) - coreComponents.emplace( fheroes2::SystemInitializationComponent::GameController ); -#endif + fheroes2::SystemInitializationComponent::Video, + fheroes2::SystemInitializationComponent::GameController }; const fheroes2::CoreInitializer coreInitializer( coreComponents ); -- 2.37.1 ================================================ FILE: packages/sx05re/emuelec-ports/fheroes2/scripts/fheroes2.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile DATAFILE="h2demo.zip" DATA="https://archive.org/download/HeroesofMightandMagicIITheSuccessionWars_1020/${DATAFILE}" CONFIGFOLDER="/storage/roms/ports/fheroes2" PORTNAME="Free Heroes of Might and Magic II" FLAGS="" mkdir -p "${CONFIGFOLDER}" cd "${CONFIGFOLDER}" if [ ! -e "${CONFIGFOLDER}/data/HEROES2.AGG" ]; then text_viewer -y -w -f 24 -t "Data does not exists!" -m "It seems this is the first time you are launching ${PORTNAME} or the data folder does not exists\n\nDemo data is about 20 MB total, and you need to be connected to the internet\n\n\nDownload demo and continue?" if [[ $? == 21 ]]; then ee_console enable clear > /dev/tty0 cat /etc/motd > /dev/tty0 echo "Downloading ${PORTNAME} data, please wait..." > /dev/tty0 wget "${DATA}" -q --show-progress > /dev/tty0 2>&1 echo "Installing ${PORTNAME} data, please wait..." > /dev/tty0 unzip -o "${DATAFILE}" -d "${CONFIGFOLDER}/zip" > /dev/tty0 mv "${CONFIGFOLDER}/zip/DATA" "${CONFIGFOLDER}/data" > /dev/tty0 2>&1 mv "${CONFIGFOLDER}/zip/MAPS" "${CONFIGFOLDER}/maps" > /dev/tty0 2>&1 rm "${DATAFILE}" > /dev/tty0 2>&1 rm -rf "${CONFIGFOLDER}/zip" > /dev/tty0 2>&1 echo "Starting ${PORTNAME} for the first time, please wait..." > /dev/tty0 ee_console disable cd "${CONFIGFOLDER}" fheroes2 ${FLAGS} > /emuelec/logs/emuelec.log 2>&1 else exit 0 fi else fheroes2 ${FLAGS} > /emuelec/logs/emuelec.log 2>&1 fi killall gptokeyb & ================================================ FILE: packages/sx05re/emuelec-ports/gzdoom/config/N2/gzdoom.ini ================================================ # This file was generated by GZDoom g4.8pre-1891-g425cc72b1 on 2024-03-01 12:26:54 # These are the directories to automatically search for IWADs. # Each directory should be on a separate line, preceded by Path= [IWADSearch.Directories] Path=. Path=$DOOMWADDIR Path=/storage/.config/gzdoom Path=/storage/roms/ports/doom Path=/storage/roms/ports/doom-mods # These are the directories to search for wads added with the -file # command line parameter, if they cannot be found with the path # as-is. Layout is the same as for IWADSearch.Directories [FileSearch.Directories] Path=/storage/.config/gzdoom Path=/storage/roms/ports/doom Path=/storage/roms/ports/doom-mods Path=$DOOMWADDIR # These are the directories to search for soundfonts that let listed in the menu. # Layout is the same as for IWADSearch.Directories [SoundfontSearch.Directories] Path=/storage/.config/gzdoom/soundfonts Path=/storage/.config/gzdoom/fm_banks # Files to automatically execute when running the corresponding game. # Each file should be on its own line, preceded by Path= [Doom.AutoExec] Path=/storage/.config/gzdoom/autoexec.cfg [Heretic.AutoExec] Path=/storage/.config/gzdoom/autoexec.cfg [Hexen.AutoExec] Path=/storage/.config/gzdoom/autoexec.cfg [Strife.AutoExec] Path=/storage/.config/gzdoom/autoexec.cfg [Chex.AutoExec] Path=/storage/.config/gzdoom/autoexec.cfg # WAD files to always load. These are loaded after the IWAD but before # any files added with -file. Place each file on its own line, preceded # by Path= [Global.Autoload] # Wad files to automatically load depending on the game and IWAD you are # playing. You may have have files that are loaded for all similar IWADs # (the game) and files that are only loaded for particular IWADs. For example, # any files listed under 'doom.Autoload' will be loaded for any version of Doom, # but files listed under 'doom.doom2.Autoload' will only load when you are # playing a Doom 2 based game (doom2.wad, tnt.wad or plutonia.wad), and files listed under # 'doom.doom2.commercial.Autoload' only when playing doom2.wad. [doom.Autoload] [doom.id.Autoload] [doom.id.doom2.Autoload] [doom.id.doom2.commercial.Autoload] [doom.id.doom2.commercial.french.Autoload] [doom.id.doom2.commercial.xbox.Autoload] [doom.id.doom2.unity.Autoload] [doom.id.doom2.bfg.Autoload] [doom.id.doom2.plutonia.Autoload] [doom.id.doom2.plutonia.unity.Autoload] [doom.id.doom2.tnt.Autoload] [doom.id.doom2.tnt.unity.Autoload] [doom.id.doom1.Autoload] [doom.id.doom1.registered.Autoload] [doom.id.doom1.ultimate.Autoload] [doom.id.doom1.ultimate.xbox.Autoload] [doom.id.wadsmoosh.Autoload] [doom.id.doom1.unity.Autoload] [doom.id.doom1.bfg.Autoload] [doom.freedoom.Autoload] [doom.freedoom.demo.Autoload] [doom.freedoom.phase1.Autoload] [doom.freedoom.phase2.Autoload] [doom.freedoom.freedm.Autoload] [heretic.Autoload] [heretic.heretic.Autoload] [heretic.shadow.Autoload] [blasphemer.Autoload] [hexen.Autoload] [hexen.deathkings.Autoload] [hexen.hexen.Autoload] [strife.Autoload] [strife.strife.Autoload] [strife.veteran.Autoload] [chex.Autoload] [chex.chex1.Autoload] [chex.chex3.Autoload] [urbanbrawl.Autoload] [hacx.Autoload] [hacx.hacx1.Autoload] [hacx.hacx2.Autoload] [harmony.Autoload] [square.Autoload] [square.squareware.Autoload] [square.square.Autoload] [delaweare.Autoload] [woolball.Autoload] [woolball.rotwb.Autoload] [LastRun] Version=225 [GlobalSettings] I_FriendlyWindowTitle=1 adl_chips_count=6 adl_emulator_id=0 adl_fullpan=true adl_run_at_pcm_rate=false adl_volume_model=0 autoloadbrightmaps=false autoloadlights=false autoloadwidescreen=true autosavecount=4 autosavenum=1 chase_dist=90 chase_height=-8 cl_capfps=false cl_defaultconfiguration=0 cl_noprediction=false cl_oldfreelooklimit=false cl_predict_lerpscale=0.05 cl_predict_lerpthreshold=2 cl_predict_specials=true cl_run=true cl_scaleweaponfov=1 cl_waitforsave=true con_4bitansi=false con_buffersize=-1 con_ctrl_d= con_notifylines=4 con_printansi=true defaultiwad= demo_compress=true developer=0 disableautoload=false disableautosave=0 enablescriptscreenshot=false fluid_chorus=true fluid_chorus_depth=8 fluid_chorus_level=1 fluid_chorus_speed=0.3 fluid_chorus_type=0 fluid_chorus_voices=3 fluid_gain=1 fluid_interp=1 fluid_lib= fluid_patchset=gzdoom fluid_reverb=true fluid_reverb_damping=0.23 fluid_reverb_level=0.57 fluid_reverb_roomsize=0.61 fluid_reverb_width=0.76 fluid_samplerate=0 fluid_threads=4 fluid_voices=128 freelook=true gl_billboard_faces_camera=false gl_billboard_mode=0 gl_billboard_particles=true gl_cachenodes=true gl_cachetime=0.6 gl_debug=false gl_debug_breakpoint=false gl_debug_level=0 gl_distfog=70 gl_dither_bpc=0 gl_enhanced_nv_stealth=3 gl_es=true gl_finishbeforeswap=false gl_fxaa=0 gl_lens=false gl_lens_chromatic=1.12 gl_lens_k=-0.12 gl_lens_kcube=0.1 gl_light_particles=true gl_light_shadowmap=false gl_light_sprites=true gl_lights=true gl_mask_sprite_threshold=0.5 gl_mask_threshold=0.5 gl_mirror_envmap=true gl_multisample=1 gl_multithread=true gl_no_skyclear=false gl_particles_style=2 gl_pipeline_depth=0 gl_plane_reflection=true gl_satformula=1 gl_seamless=false gl_shadowmap_filter=1 gl_shadowmap_quality=512 gl_sort_textures=false gl_sprite_blend=false gl_ssao=0 gl_ssao_portals=1 gl_ssao_strength=0.7 gl_texture_filter=0 gl_texture_filter_anisotropic=8 gl_texture_hqresize_maxinputsize=512 gl_texture_hqresize_mt_height=4 gl_texture_hqresize_mt_width=16 gl_texture_hqresize_multithread=true gl_texture_hqresize_targets=7 gl_texture_hqresizemode=0 gl_texture_hqresizemult=1 gl_usecolorblending=true gme_stereodepth=0 gus_memsize=0 gus_patchdir= hw_force_cambbpref=false i_discordrpc=false i_pauseinbackground=true i_soundinbackground=false inter_subtitles=false invertmouse=false invertmousex=false language=auto longsavemessages=false lookstrafe=false m_blockcontrollers=false m_cleanscale=false m_forward=1 m_pitch=1 m_sensitivity_x=2 m_sensitivity_y=2 m_show_backbutton=0 m_showinputgrid=0 m_side=2 m_simpleoptions=false m_use_mouse=2 m_yaw=1 map_point_coordinates=true midi_config=gzdoom midi_dmxgus=false midi_voices=32 mod_autochip=false mod_autochip_scan_threshold=12 mod_autochip_size_force=100 mod_autochip_size_scan=500 mod_dumb_mastervolume=1 mod_interp=2 mod_samplerate=0 mod_volramp=2 mouse_capturemode=1 mus_calcgain=true mus_enabled=true mus_usereplaygain=false nointerscrollabort=false nomonsterinterpolation=false opl_core=0 opl_fullpan=true opl_numchips=2 opn_chips_count=8 opn_emulator_id=1 opn_fullpan=true opn_run_at_pcm_rate=false os_isanyof=true png_gamma=0 png_level=5 queryiwad=true quicksavenum=-1 quicksaverotation=true quicksaverotationcount=4 r_actorspriteshadow=1 r_actorspriteshadowalpha=0.5 r_actorspriteshadowdist=1500 r_actorspriteshadowfadeheight=0 r_blendmethod=false r_dynlights=false r_fakecontrast=1 r_fullbrightignoresectorcolor=true r_fuzzscale=true r_line_distance_cull=8000 r_linearsky=false r_magfilter=false r_minfilter=true r_mipmap=false r_mirror_recursions=2 r_models=true r_multithreaded=1 r_noaccel=false r_quakeintensity=1 r_skipmats=false r_sprite_distance_cull=4000 r_spriteadjust=2 r_ticstability=true save_dir= save_formatted=false saveloadconfirmation=true savestatistics=0 screenshot_dir= screenshot_quiet=false screenshot_type=png show_messages=true showendoom=0 snd_aldevice=Default snd_alresampler=Default snd_backend=openal snd_buffersize=0 snd_channels=128 snd_efx=false snd_enabled=true snd_hrtf=0 snd_mastervolume=1 snd_mididevice=-5 snd_midiprecache=false snd_musicvolume=0.5 snd_samplerate=0 snd_sfxvolume=1 snd_streambuffersize=64 snd_waterreverb=true statfile=zdoomstat.txt storesavepic=true strictdecorate=false telezoom=true timidity_channel_pressure=false timidity_chorus=0 timidity_config=gzdoom timidity_drum_effect=false timidity_drum_power=1 timidity_key_adjust=0 timidity_lpf_def=1 timidity_min_sustain_time=5000 timidity_modulation_envelope=true timidity_modulation_wheel=true timidity_overlap_voice_allow=true timidity_pan_delay=false timidity_portamento=true timidity_reverb=0 timidity_reverb_level=0 timidity_surround_chorus=false timidity_temper_control=true timidity_tempo_adjust=1 turnspeedsprintfast=1280 turnspeedsprintslow=320 turnspeedwalkfast=640 turnspeedwalkslow=320 use_joystick=true use_mouse=false vid_activeinbackground=false vid_adapter=0 vid_aspect=0 vid_brightness=0.15 vid_contrast=1.2 vid_cropaspect=true vid_defheight=450 vid_defwidth=800 vid_fullscreen=true vid_gamma=1.25 vid_hdr=false vid_maxfps=200 vid_preferbackend=2 vid_rendermode=4 vid_saturation=1 vid_scale_customheight=200 vid_scale_custompixelaspect=1 vid_scale_customwidth=320 vid_scale_linear=false vid_scalefactor=1 vid_scalemode=0 vid_sdl_render_driver= vid_vsync=false vr_hunits_per_meter=41 vr_ipd=0.062 vr_mode=0 vr_screendist=0.8 vr_swap_eyes=false wildmidi_config= wildmidi_enhanced_resampling=true wildmidi_reverb=false win_h=384 win_maximized=false win_w=512 win_x=-1 win_y=-1 xbrz_centerdirectionbias=4 xbrz_colorformat=0 xbrz_dominantdirectionthreshold=3.6 xbrz_equalcolortolerance=30 xbrz_luminanceweight=1 xbrz_steepdirectionthreshold=2.2 [GlobalSettings.Unknown] Gamma=1.4999995231628418 bgamma=1 ggamma=1 m_filter=false mus_gainoffset=0 rgamma=1 [Doom.Player] autoaim=35 classicflight=false color=40 cf 00 colorset=0 fov=90 fviewbob=true gender=male movebob=0.25 name=Player neverswitchonpickup=false playerclass=Fighter skin=base stillbob=0 team=255 vertspread=false wbobfire=0 wbobspeed=1 wi_noautostartmap=false [Doom.ConsoleVariables] addrocketexplosion=false adl_bank=14 adl_custom_bank= adl_use_custom_bank=false allcheats=false am_backcolor=6c 54 40 am_cdwallcolor=4c 38 20 am_colorset=0 am_customcolors=true am_drawmapback=1 am_efwallcolor=66 55 55 am_emptyspacemargin=0 am_fdwallcolor=88 70 58 am_followplayer=true am_gridcolor=8b 5a 2b am_interlevelcolor=ff 00 00 am_intralevelcolor=00 00 ff am_linealpha=1 am_lineantialiasing=0 am_linethickness=1 am_lockedcolor=00 78 00 am_map_secrets=1 am_markcolor=2 am_markfont=AMMNUMx am_notseencolor=6c 6c 6c am_ovcdwallcolor=00 88 44 am_ovefwallcolor=00 88 44 am_overlay=0 am_ovfdwallcolor=00 88 44 am_ovinterlevelcolor=ff ff 00 am_ovlockedcolor=00 88 44 am_ovotherwallscolor=00 88 44 am_ovportalcolor=00 40 22 am_ovsecretsectorcolor=00 ff ff am_ovsecretwallcolor=00 88 44 am_ovspecialwallcolor=ff ff ff am_ovtelecolor=ff ff 00 am_ovthingcolor=e8 88 00 am_ovthingcolor_citem=e8 88 00 am_ovthingcolor_friend=e8 88 00 am_ovthingcolor_item=e8 88 00 am_ovthingcolor_monster=e8 88 00 am_ovthingcolor_ncmonster=e8 88 00 am_ovunexploredsecretcolor=00 ff ff am_ovunseencolor=00 22 6e am_ovwallcolor=00 ff 00 am_ovyourcolor=fc e8 d8 am_portalcolor=40 40 40 am_portaloverlay=true am_rotate=0 am_secretsectorcolor=ff 00 ff am_secretwallcolor=00 00 00 am_showcluster=false am_showepisode=false am_showgrid=false am_showitems=true am_showkeys=true am_showkeys_always=false am_showmaplabel=2 am_showmonsters=true am_showsecrets=true am_showthingsprites=0 am_showtime=true am_showtotaltime=false am_showtriggerlines=0 am_specialwallcolor=ff ff ff am_textured=false am_thingcolor=fc fc fc am_thingcolor_citem=fc fc fc am_thingcolor_friend=fc fc fc am_thingcolor_item=fc fc fc am_thingcolor_monster=fc fc fc am_thingcolor_ncmonster=fc fc fc am_thingrenderstyles=true am_tswallcolor=88 88 88 am_unexploredsecretcolor=ff 00 ff am_wallcolor=2c 18 08 am_xhaircolor=80 80 80 am_yourcolor=fc e8 d8 am_zoomdir=0 blood_fade_scalar=1 chat_substitution=false chatmacro0=No chatmacro1=I'm ready to kick butt! chatmacro2=I'm OK. chatmacro3=I'm not looking too good! chatmacro4=Help! chatmacro5=You suck! chatmacro6=Next time, scumbag... chatmacro7=Come here! chatmacro8=I'll take care of it. chatmacro9=Yes cl_bbannounce=false cl_bloodsplats=true cl_bloodtype=1 cl_custominvulmapcolor1=00 00 1a cl_custominvulmapcolor2=a6 a6 7a cl_customizeinvulmap=false cl_doautoaim=false cl_gfxlocalization=3 cl_maxdecals=1024 cl_missiledecals=true cl_nointros=false cl_pufftype=2 cl_rockettrails=3 cl_showmultikills=true cl_showsecretmessage=true cl_showsprees=true cl_spreaddecals=true classic_scaling_factor=1 classic_scaling_pixelaspect=1.2 compatmode=0 con_alpha=0.75 con_centernotify=true con_midtime=3 con_notablist=false con_notifytime=3 con_pulsetext=false con_scale=0 con_scaletext=0 crosshair=5 crosshaircolor=ff 00 00 crosshairforce=false crosshairgrow=false crosshairhealth=1 crosshairon=true crosshairscale=0.6 dehload=0 dimamount=-1 dimcolor=ff d7 00 displaynametags=0 dlg_musicvolume=1 dlg_vgafont=false gl_aalines=false gl_bandedswlight=false gl_bloom=false gl_bloom_amount=1.4 gl_brightfog=false gl_coronas=true gl_enhanced_nightvision=false gl_exposure_base=0.35 gl_exposure_min=0.35 gl_exposure_scale=1.3 gl_exposure_speed=0.05 gl_fogmode=1 gl_fuzztype=6 gl_interpolate_model_frames=true gl_light_models=true gl_lightadditivesurfaces=false gl_lightmode=1 gl_menu_blur=-1 gl_paltonemap_powtable=2 gl_paltonemap_reverselookup=true gl_precache=false gl_scale_viewport=true gl_sclipfactor=1.8 gl_sclipthreshold=10 gl_spriteclip=1 gl_tonemap=0 gl_weaponlight=8 hud_althud=true hud_althud_forceinternal=false hud_althudscale=0 hud_ammo_order=1 hud_ammo_red=25 hud_ammo_yellow=50 hud_armor_green=100 hud_armor_red=25 hud_armor_yellow=50 hud_aspectscale=false hud_berserk_health=true hud_health_green=100 hud_health_red=25 hud_health_yellow=50 hud_oldscale=true hud_scale=0 hud_scalefactor=1 hud_showammo=2 hud_showangles=false hud_showitems=false hud_showlag=0 hud_showmonsters=true hud_showscore=false hud_showsecrets=true hud_showstats=false hud_showtime=1 hud_showtimestat=0 hud_showweapons=true hud_swaphealtharmor=false hud_timecolor=5 hudcolor_ltim=8 hudcolor_statnames=6 hudcolor_stats=3 hudcolor_time=6 hudcolor_titl=10 hudcolor_ttim=5 hudcolor_xyco=3 inter_classic_scaling=true log_vgafont=false lookspring=true m_quickexit=false msg=0 msg0color=6 msg1color=5 msg2color=2 msg3color=3 msg4color=3 msgmidcolor=5 msgmidcolor2=4 nametagcolor=5 nocheats=false opn_custom_bank= opn_use_custom_bank=false paletteflash=0 pickup_fade_scalar=1 r_deathcamera=false r_drawfuzz=2 r_maxparticles=4000 r_portal_recursions=4 r_rail_smartspiral=false r_rail_spiralsparsity=1 r_rail_trailsparsity=1 r_skymode=2 r_vanillatrans=0 sb_cooperative_enable=true sb_cooperative_headingcolor=6 sb_cooperative_otherplayercolor=2 sb_cooperative_yourplayercolor=3 sb_deathmatch_enable=true sb_deathmatch_headingcolor=6 sb_deathmatch_otherplayercolor=2 sb_deathmatch_yourplayercolor=3 sb_teamdeathmatch_enable=true sb_teamdeathmatch_headingcolor=6 screenblocks=11 setslotstrict=true show_obituaries=true snd_menuvolume=0.6 snd_pitched=false st_oldouch=false st_scale=-1 transsouls=0.75 ui_screenborder_classic_scaling=true uiscale=2 underwater_fade_scalar=1 vid_allowtrueultrawide=1 vid_cursor=None vid_nopalsubstitutions=false wi_cleantextscale=false wi_percents=true wi_showtotaltime=true wipetype=2 [Doom.LocalServerInfo] compatflags=0 compatflags2=0 forcewater=false maxviewpitch=90 sv_corpsequeuesize=64 sv_disableautohealth=false sv_dropstyle=0 sv_portal_recursions=4 sv_smartaim=0 [Doom.ConfigOnlyVariables] [Doom.UnknownConsoleVariables] [Doom.ConsoleAliases] [Doom.Bindings] Joy2=+use Joy3=+jump Joy4=+speed Joy5=centerview Joy6=+attack Joy7=weapprev Joy8=weapnext Joy9=togglemap Joy10=menu_main Joy11=pause POV1Up=+forward POV1Right=+right POV1Down=+back POV1Left=+left [Doom.DoubleBindings] [Doom.AutomapBindings] MWheelUp=am_zoom 1.2 MWheelDown=am_zoom -1.2 Joy5=+am_zoomout Joy6=+am_zoomin [Joy:JS:0] Axis0deadzone=0.5 Axis0scale=0.9 Axis1deadzone=0.5 Axis1scale=0.9 Axis2deadzone=0.5 Axis2scale=0.3 Axis3deadzone=0.9 Axis3scale=0.9 Axis4deadzone=0.5 Axis4scale=0.3 Axis5deadzone=0.25 Axis6deadzone=0.25 Axis7deadzone=0.25 [Joy:JS:1] Axis0deadzone=0.500001 Axis1deadzone=0.500001 Axis2deadzone=0.500001 Axis3deadzone=0.500001 [Doom.Player.Mod] m8f_class_as_tag=0 m8f_ts_alm_dead_cr=true m8f_ts_alt_hp_color=false m8f_ts_bar_log_scale=false m8f_ts_bot_offset=0 m8f_ts_cr_0=6 m8f_ts_cr_1=6 m8f_ts_cr_10=1 m8f_ts_cr_11=21 m8f_ts_cr_2=6 m8f_ts_cr_3=8 m8f_ts_cr_4=8 m8f_ts_cr_5=8 m8f_ts_cr_6=5 m8f_ts_cr_7=5 m8f_ts_cr_8=5 m8f_ts_cr_9=1 m8f_ts_cr_alm_dead=12 m8f_ts_cr_font=MM2SFNTO m8f_ts_cr_opacity=1 m8f_ts_cross_bottom= m8f_ts_cross_offset=0 m8f_ts_cross_only_tg=false m8f_ts_cross_scale=1 m8f_ts_cross_top= m8f_ts_crosshair=> < m8f_ts_crosshair_on=false m8f_ts_def_cl_tag_wk=9 m8f_ts_def_color_crs=3 m8f_ts_def_color_tag=9 m8f_ts_empty_pip=- m8f_ts_enabled=true m8f_ts_font=MM2SFNTO m8f_ts_frame_scale=1 m8f_ts_frame_size=1 m8f_ts_frame_style=0 m8f_ts_friendly_target=false m8f_ts_green_color=3 m8f_ts_has_target=false m8f_ts_hide_in_dark=false m8f_ts_hit_color=6 m8f_ts_hit_confirm=true m8f_ts_length_mult=1 m8f_ts_light_level=120 m8f_ts_min_health=0 m8f_ts_named_confirm=false m8f_ts_no_cross_on_1=false m8f_ts_on_target=0 m8f_ts_opacity=1 m8f_ts_pip=# m8f_ts_red_color=6 m8f_ts_show_bar=true m8f_ts_show_champion=true m8f_ts_show_confirm=false m8f_ts_show_corpses=false m8f_ts_show_dormant=false m8f_ts_show_friends=true m8f_ts_show_hidden=true m8f_ts_show_idle=true m8f_ts_show_info=false m8f_ts_show_name=true m8f_ts_show_name_tag=false m8f_ts_show_numbers=0 m8f_ts_show_objects=1 m8f_ts_step_mult=1 m8f_ts_text_scale=1 m8f_ts_top_offset=0 m8f_ts_x_adjustment=0 m8f_ts_y=0.02 m8f_ts_y_offset=0 ts_extra_character=❤ [Doom.LocalServerInfo.Mod] [Doom.ConfigOnlyVariables.Mod] [Doom.m8f_ts_Controls.Bindings] [Doom.m8f_ts_Controls.DoubleBindings] ================================================ FILE: packages/sx05re/emuelec-ports/gzdoom/config/OGA/gzdoom.ini ================================================ # This file was generated by GZDoom g4.8pre-1891-g425cc72b1 on 2024-02-29 20:44:38 # These are the directories to automatically search for IWADs. # Each directory should be on a separate line, preceded by Path= [IWADSearch.Directories] Path=. Path=$DOOMWADDIR Path=/storage/.config/gzdoom Path=/storage/roms/ports/doom Path=/storage/roms/ports/doom-mods # These are the directories to search for wads added with the -file # command line parameter, if they cannot be found with the path # as-is. Layout is the same as for IWADSearch.Directories [FileSearch.Directories] Path=/storage/.config/gzdoom Path=/storage/roms/ports/doom Path=/storage/roms/ports/doom-mods Path=$DOOMWADDIR # These are the directories to search for soundfonts that let listed in the menu. # Layout is the same as for IWADSearch.Directories [SoundfontSearch.Directories] Path=/storage/.config/gzdoom/soundfonts Path=/storage/.config/gzdoom/fm_banks # Files to automatically execute when running the corresponding game. # Each file should be on its own line, preceded by Path= [Doom.AutoExec] Path=/storage/.config/gzdoom/autoexec.cfg [Heretic.AutoExec] Path=/storage/.config/gzdoom/autoexec.cfg [Hexen.AutoExec] Path=/storage/.config/gzdoom/autoexec.cfg [Strife.AutoExec] Path=/storage/.config/gzdoom/autoexec.cfg [Chex.AutoExec] Path=/storage/.config/gzdoom/autoexec.cfg # WAD files to always load. These are loaded after the IWAD but before # any files added with -file. Place each file on its own line, preceded # by Path= [Global.Autoload] # Wad files to automatically load depending on the game and IWAD you are # playing. You may have have files that are loaded for all similar IWADs # (the game) and files that are only loaded for particular IWADs. For example, # any files listed under 'doom.Autoload' will be loaded for any version of Doom, # but files listed under 'doom.doom2.Autoload' will only load when you are # playing a Doom 2 based game (doom2.wad, tnt.wad or plutonia.wad), and files listed under # 'doom.doom2.commercial.Autoload' only when playing doom2.wad. [doom.Autoload] [doom.id.Autoload] [doom.id.doom2.Autoload] [doom.id.doom2.commercial.Autoload] [doom.id.doom2.commercial.french.Autoload] [doom.id.doom2.commercial.xbox.Autoload] [doom.id.doom2.unity.Autoload] [doom.id.doom2.bfg.Autoload] [doom.id.doom2.plutonia.Autoload] [doom.id.doom2.plutonia.unity.Autoload] [doom.id.doom2.tnt.Autoload] [doom.id.doom2.tnt.unity.Autoload] [doom.id.doom1.Autoload] [doom.id.doom1.registered.Autoload] [doom.id.doom1.ultimate.Autoload] [doom.id.doom1.ultimate.xbox.Autoload] [doom.id.wadsmoosh.Autoload] [doom.id.doom1.unity.Autoload] [doom.id.doom1.bfg.Autoload] [doom.freedoom.Autoload] [doom.freedoom.demo.Autoload] [doom.freedoom.phase1.Autoload] [doom.freedoom.phase2.Autoload] [doom.freedoom.freedm.Autoload] [heretic.Autoload] [heretic.heretic.Autoload] [heretic.shadow.Autoload] [blasphemer.Autoload] [hexen.Autoload] [hexen.deathkings.Autoload] [hexen.hexen.Autoload] [strife.Autoload] [strife.strife.Autoload] [strife.veteran.Autoload] [chex.Autoload] [chex.chex1.Autoload] [chex.chex3.Autoload] [urbanbrawl.Autoload] [hacx.Autoload] [hacx.hacx1.Autoload] [hacx.hacx2.Autoload] [harmony.Autoload] [square.Autoload] [square.squareware.Autoload] [square.square.Autoload] [delaweare.Autoload] [woolball.Autoload] [woolball.rotwb.Autoload] [LastRun] Version=225 [GlobalSettings] I_FriendlyWindowTitle=1 adl_chips_count=6 adl_emulator_id=0 adl_fullpan=true adl_run_at_pcm_rate=false adl_volume_model=0 autoloadbrightmaps=false autoloadlights=false autoloadwidescreen=true autosavecount=4 autosavenum=1 chase_dist=90 chase_height=-8 cl_capfps=false cl_defaultconfiguration=0 cl_noprediction=false cl_oldfreelooklimit=false cl_predict_lerpscale=0.05 cl_predict_lerpthreshold=2 cl_predict_specials=true cl_run=true cl_scaleweaponfov=1 cl_waitforsave=true con_4bitansi=false con_buffersize=-1 con_ctrl_d= con_notifylines=4 con_printansi=true defaultiwad= demo_compress=true developer=0 disableautoload=false disableautosave=0 enablescriptscreenshot=false fluid_chorus=true fluid_chorus_depth=8 fluid_chorus_level=1 fluid_chorus_speed=0.3 fluid_chorus_type=0 fluid_chorus_voices=3 fluid_gain=1 fluid_interp=1 fluid_lib= fluid_patchset=gzdoom fluid_reverb=true fluid_reverb_damping=0.23 fluid_reverb_level=0.57 fluid_reverb_roomsize=0.61 fluid_reverb_width=0.76 fluid_samplerate=0 fluid_threads=4 fluid_voices=128 freelook=true gl_billboard_faces_camera=false gl_billboard_mode=0 gl_billboard_particles=true gl_cachenodes=true gl_cachetime=0.6 gl_debug=false gl_debug_breakpoint=false gl_debug_level=0 gl_distfog=70 gl_dither_bpc=0 gl_enhanced_nv_stealth=3 gl_es=true gl_finishbeforeswap=false gl_fxaa=0 gl_lens=false gl_lens_chromatic=1.12 gl_lens_k=-0.12 gl_lens_kcube=0.1 gl_light_particles=true gl_light_shadowmap=false gl_light_sprites=true gl_lights=true gl_mask_sprite_threshold=0.5 gl_mask_threshold=0.5 gl_mirror_envmap=true gl_multisample=1 gl_multithread=true gl_no_skyclear=false gl_particles_style=2 gl_pipeline_depth=0 gl_plane_reflection=true gl_satformula=1 gl_seamless=false gl_shadowmap_filter=1 gl_shadowmap_quality=512 gl_sort_textures=false gl_sprite_blend=false gl_ssao=0 gl_ssao_portals=1 gl_ssao_strength=0.7 gl_texture_filter=0 gl_texture_filter_anisotropic=8 gl_texture_hqresize_maxinputsize=512 gl_texture_hqresize_mt_height=4 gl_texture_hqresize_mt_width=16 gl_texture_hqresize_multithread=true gl_texture_hqresize_targets=7 gl_texture_hqresizemode=0 gl_texture_hqresizemult=1 gl_usecolorblending=true gme_stereodepth=0 gus_memsize=0 gus_patchdir= hw_force_cambbpref=false i_discordrpc=false i_pauseinbackground=true i_soundinbackground=false inter_subtitles=false invertmouse=false invertmousex=false language=auto longsavemessages=false lookstrafe=false m_blockcontrollers=false m_cleanscale=false m_forward=1 m_pitch=1 m_sensitivity_x=2 m_sensitivity_y=2 m_show_backbutton=0 m_showinputgrid=0 m_side=2 m_simpleoptions=false m_use_mouse=2 m_yaw=1 map_point_coordinates=true midi_config=gzdoom midi_dmxgus=false midi_voices=32 mod_autochip=false mod_autochip_scan_threshold=12 mod_autochip_size_force=100 mod_autochip_size_scan=500 mod_dumb_mastervolume=1 mod_interp=2 mod_samplerate=0 mod_volramp=2 mouse_capturemode=1 mus_calcgain=true mus_enabled=true mus_usereplaygain=false nointerscrollabort=false nomonsterinterpolation=false opl_core=0 opl_fullpan=true opl_numchips=2 opn_chips_count=8 opn_emulator_id=1 opn_fullpan=true opn_run_at_pcm_rate=false os_isanyof=true png_gamma=0 png_level=5 queryiwad=true quicksavenum=-1 quicksaverotation=true quicksaverotationcount=4 r_actorspriteshadow=1 r_actorspriteshadowalpha=0.5 r_actorspriteshadowdist=1500 r_actorspriteshadowfadeheight=0 r_blendmethod=false r_dynlights=false r_fakecontrast=1 r_fullbrightignoresectorcolor=true r_fuzzscale=true r_line_distance_cull=8000 r_linearsky=false r_magfilter=false r_minfilter=true r_mipmap=false r_mirror_recursions=2 r_models=true r_multithreaded=1 r_noaccel=false r_quakeintensity=1 r_skipmats=false r_sprite_distance_cull=4000 r_spriteadjust=2 r_ticstability=true save_dir= save_formatted=false saveloadconfirmation=true savestatistics=0 screenshot_dir= screenshot_quiet=false screenshot_type=png show_messages=true showendoom=0 snd_aldevice=Default snd_alresampler=Default snd_backend=openal snd_buffersize=0 snd_channels=128 snd_efx=false snd_enabled=true snd_hrtf=0 snd_mastervolume=1 snd_mididevice=-5 snd_midiprecache=false snd_musicvolume=0.5 snd_samplerate=0 snd_sfxvolume=1 snd_streambuffersize=64 snd_waterreverb=true statfile=zdoomstat.txt storesavepic=true strictdecorate=false telezoom=true timidity_channel_pressure=false timidity_chorus=0 timidity_config=gzdoom timidity_drum_effect=false timidity_drum_power=1 timidity_key_adjust=0 timidity_lpf_def=1 timidity_min_sustain_time=5000 timidity_modulation_envelope=true timidity_modulation_wheel=true timidity_overlap_voice_allow=true timidity_pan_delay=false timidity_portamento=true timidity_reverb=0 timidity_reverb_level=0 timidity_surround_chorus=false timidity_temper_control=true timidity_tempo_adjust=1 turnspeedsprintfast=1280 turnspeedsprintslow=320 turnspeedwalkfast=640 turnspeedwalkslow=320 use_joystick=true use_mouse=false vid_activeinbackground=false vid_adapter=0 vid_aspect=0 vid_brightness=0.15 vid_contrast=1.2 vid_cropaspect=true vid_defheight=450 vid_defwidth=800 vid_fullscreen=true vid_gamma=1.25 vid_hdr=false vid_maxfps=200 vid_preferbackend=2 vid_rendermode=4 vid_saturation=1 vid_scale_customheight=200 vid_scale_custompixelaspect=1 vid_scale_customwidth=320 vid_scale_linear=false vid_scalefactor=1 vid_scalemode=0 vid_sdl_render_driver= vid_vsync=false vr_hunits_per_meter=41 vr_ipd=0.062 vr_mode=0 vr_screendist=0.8 vr_swap_eyes=false wildmidi_config= wildmidi_enhanced_resampling=true wildmidi_reverb=false win_h=384 win_maximized=false win_w=512 win_x=-1 win_y=-1 xbrz_centerdirectionbias=4 xbrz_colorformat=0 xbrz_dominantdirectionthreshold=3.6 xbrz_equalcolortolerance=30 xbrz_luminanceweight=1 xbrz_steepdirectionthreshold=2.2 [GlobalSettings.Unknown] Gamma=1.4999995231628418 bgamma=1 ggamma=1 m_filter=false mus_gainoffset=0 rgamma=1 [Doom.Player] autoaim=35 classicflight=false color=40 cf 00 colorset=0 fov=90 fviewbob=true gender=male movebob=0.25 name=Player neverswitchonpickup=false playerclass=Fighter skin=base stillbob=0 team=255 vertspread=false wbobfire=0 wbobspeed=1 wi_noautostartmap=false [Doom.ConsoleVariables] addrocketexplosion=false adl_bank=14 adl_custom_bank= adl_use_custom_bank=false allcheats=false am_backcolor=6c 54 40 am_cdwallcolor=4c 38 20 am_colorset=0 am_customcolors=true am_drawmapback=1 am_efwallcolor=66 55 55 am_emptyspacemargin=0 am_fdwallcolor=88 70 58 am_followplayer=true am_gridcolor=8b 5a 2b am_interlevelcolor=ff 00 00 am_intralevelcolor=00 00 ff am_linealpha=1 am_lineantialiasing=0 am_linethickness=1 am_lockedcolor=00 78 00 am_map_secrets=1 am_markcolor=2 am_markfont=AMMNUMx am_notseencolor=6c 6c 6c am_ovcdwallcolor=00 88 44 am_ovefwallcolor=00 88 44 am_overlay=0 am_ovfdwallcolor=00 88 44 am_ovinterlevelcolor=ff ff 00 am_ovlockedcolor=00 88 44 am_ovotherwallscolor=00 88 44 am_ovportalcolor=00 40 22 am_ovsecretsectorcolor=00 ff ff am_ovsecretwallcolor=00 88 44 am_ovspecialwallcolor=ff ff ff am_ovtelecolor=ff ff 00 am_ovthingcolor=e8 88 00 am_ovthingcolor_citem=e8 88 00 am_ovthingcolor_friend=e8 88 00 am_ovthingcolor_item=e8 88 00 am_ovthingcolor_monster=e8 88 00 am_ovthingcolor_ncmonster=e8 88 00 am_ovunexploredsecretcolor=00 ff ff am_ovunseencolor=00 22 6e am_ovwallcolor=00 ff 00 am_ovyourcolor=fc e8 d8 am_portalcolor=40 40 40 am_portaloverlay=true am_rotate=0 am_secretsectorcolor=ff 00 ff am_secretwallcolor=00 00 00 am_showcluster=false am_showepisode=false am_showgrid=false am_showitems=true am_showkeys=true am_showkeys_always=false am_showmaplabel=2 am_showmonsters=true am_showsecrets=true am_showthingsprites=0 am_showtime=true am_showtotaltime=false am_showtriggerlines=0 am_specialwallcolor=ff ff ff am_textured=false am_thingcolor=fc fc fc am_thingcolor_citem=fc fc fc am_thingcolor_friend=fc fc fc am_thingcolor_item=fc fc fc am_thingcolor_monster=fc fc fc am_thingcolor_ncmonster=fc fc fc am_thingrenderstyles=true am_tswallcolor=88 88 88 am_unexploredsecretcolor=ff 00 ff am_wallcolor=2c 18 08 am_xhaircolor=80 80 80 am_yourcolor=fc e8 d8 am_zoomdir=0 blood_fade_scalar=1 chat_substitution=false chatmacro0=No chatmacro1=I'm ready to kick butt! chatmacro2=I'm OK. chatmacro3=I'm not looking too good! chatmacro4=Help! chatmacro5=You suck! chatmacro6=Next time, scumbag... chatmacro7=Come here! chatmacro8=I'll take care of it. chatmacro9=Yes cl_bbannounce=false cl_bloodsplats=true cl_bloodtype=1 cl_custominvulmapcolor1=00 00 1a cl_custominvulmapcolor2=a6 a6 7a cl_customizeinvulmap=false cl_doautoaim=false cl_gfxlocalization=3 cl_maxdecals=1024 cl_missiledecals=true cl_nointros=false cl_pufftype=2 cl_rockettrails=3 cl_showmultikills=true cl_showsecretmessage=true cl_showsprees=true cl_spreaddecals=true classic_scaling_factor=1 classic_scaling_pixelaspect=1.2 compatmode=0 con_alpha=0.75 con_centernotify=true con_midtime=3 con_notablist=false con_notifytime=3 con_pulsetext=false con_scale=0 con_scaletext=0 crosshair=5 crosshaircolor=ff 00 00 crosshairforce=false crosshairgrow=false crosshairhealth=1 crosshairon=true crosshairscale=0.6 dehload=0 dimamount=-1 dimcolor=ff d7 00 displaynametags=0 dlg_musicvolume=1 dlg_vgafont=false gl_aalines=false gl_bandedswlight=false gl_bloom=false gl_bloom_amount=1.4 gl_brightfog=false gl_coronas=true gl_enhanced_nightvision=false gl_exposure_base=0.35 gl_exposure_min=0.35 gl_exposure_scale=1.3 gl_exposure_speed=0.05 gl_fogmode=1 gl_fuzztype=6 gl_interpolate_model_frames=true gl_light_models=true gl_lightadditivesurfaces=false gl_lightmode=1 gl_menu_blur=-1 gl_paltonemap_powtable=2 gl_paltonemap_reverselookup=true gl_precache=false gl_scale_viewport=true gl_sclipfactor=1.8 gl_sclipthreshold=10 gl_spriteclip=1 gl_tonemap=0 gl_weaponlight=8 hud_althud=true hud_althud_forceinternal=false hud_althudscale=0 hud_ammo_order=1 hud_ammo_red=25 hud_ammo_yellow=50 hud_armor_green=100 hud_armor_red=25 hud_armor_yellow=50 hud_aspectscale=false hud_berserk_health=true hud_health_green=100 hud_health_red=25 hud_health_yellow=50 hud_oldscale=true hud_scale=0 hud_scalefactor=1 hud_showammo=2 hud_showangles=false hud_showitems=false hud_showlag=0 hud_showmonsters=true hud_showscore=false hud_showsecrets=true hud_showstats=false hud_showtime=1 hud_showtimestat=0 hud_showweapons=true hud_swaphealtharmor=false hud_timecolor=5 hudcolor_ltim=8 hudcolor_statnames=6 hudcolor_stats=3 hudcolor_time=6 hudcolor_titl=10 hudcolor_ttim=5 hudcolor_xyco=3 inter_classic_scaling=true log_vgafont=false lookspring=true m_quickexit=false msg=0 msg0color=6 msg1color=5 msg2color=2 msg3color=3 msg4color=3 msgmidcolor=5 msgmidcolor2=4 nametagcolor=5 nocheats=false opn_custom_bank= opn_use_custom_bank=false paletteflash=0 pickup_fade_scalar=1 r_deathcamera=false r_drawfuzz=2 r_maxparticles=4000 r_portal_recursions=4 r_rail_smartspiral=false r_rail_spiralsparsity=1 r_rail_trailsparsity=1 r_skymode=2 r_vanillatrans=0 sb_cooperative_enable=true sb_cooperative_headingcolor=6 sb_cooperative_otherplayercolor=2 sb_cooperative_yourplayercolor=3 sb_deathmatch_enable=true sb_deathmatch_headingcolor=6 sb_deathmatch_otherplayercolor=2 sb_deathmatch_yourplayercolor=3 sb_teamdeathmatch_enable=true sb_teamdeathmatch_headingcolor=6 screenblocks=11 setslotstrict=true show_obituaries=true snd_menuvolume=0.6 snd_pitched=false st_oldouch=false st_scale=-1 transsouls=0.75 ui_screenborder_classic_scaling=true uiscale=2 underwater_fade_scalar=1 vid_allowtrueultrawide=1 vid_cursor=None vid_nopalsubstitutions=false wi_cleantextscale=false wi_percents=true wi_showtotaltime=true wipetype=2 [Doom.LocalServerInfo] compatflags=0 compatflags2=0 forcewater=false maxviewpitch=90 sv_corpsequeuesize=64 sv_disableautohealth=false sv_dropstyle=0 sv_portal_recursions=4 sv_smartaim=0 [Doom.ConfigOnlyVariables] [Doom.UnknownConsoleVariables] [Doom.ConsoleAliases] [Doom.Bindings] Joy1=invuse Joy2=+use Joy3=+jump Joy5=turn180 Joy6=+attack Joy7=weapprev Joy8=weapnext Joy9=+forward Joy10=+back Joy13=togglemap Joy14=menu_main Joy11=+left Joy12=+right Joy16=pause Joy17=toggle cl_run [Doom.DoubleBindings] [Doom.AutomapBindings] MWheelUp=am_zoom 1.2 MWheelDown=am_zoom -1.2 Joy5=+am_zoomout Joy6=+am_zoomin [Joy:JS:0] Axis0deadzone=0.500001 Axis0scale=1.5 Axis1deadzone=0.500001 Axis1scale=3 Axis2deadzone=0.500001 Axis2scale=1.3 Axis2map=0 Axis3deadzone=0.500001 Axis3scale=0.2 Axis3map=1 [Joy:JS:1] Axis0deadzone=0.500001 Axis1deadzone=0.500001 Axis2deadzone=0.500001 Axis3deadzone=0.500001 [Doom.Player.Mod] m8f_class_as_tag=0 m8f_ts_alm_dead_cr=true m8f_ts_alt_hp_color=false m8f_ts_bar_log_scale=false m8f_ts_bot_offset=0 m8f_ts_cr_0=6 m8f_ts_cr_1=6 m8f_ts_cr_10=1 m8f_ts_cr_11=21 m8f_ts_cr_2=6 m8f_ts_cr_3=8 m8f_ts_cr_4=8 m8f_ts_cr_5=8 m8f_ts_cr_6=5 m8f_ts_cr_7=5 m8f_ts_cr_8=5 m8f_ts_cr_9=1 m8f_ts_cr_alm_dead=12 m8f_ts_cr_font=MM2SFNTO m8f_ts_cr_opacity=1 m8f_ts_cross_bottom= m8f_ts_cross_offset=0 m8f_ts_cross_only_tg=false m8f_ts_cross_scale=1 m8f_ts_cross_top= m8f_ts_crosshair=> < m8f_ts_crosshair_on=false m8f_ts_def_cl_tag_wk=9 m8f_ts_def_color_crs=3 m8f_ts_def_color_tag=9 m8f_ts_empty_pip=- m8f_ts_enabled=true m8f_ts_font=MM2SFNTO m8f_ts_frame_scale=1 m8f_ts_frame_size=1 m8f_ts_frame_style=0 m8f_ts_friendly_target=false m8f_ts_green_color=3 m8f_ts_has_target=false m8f_ts_hide_in_dark=false m8f_ts_hit_color=6 m8f_ts_hit_confirm=true m8f_ts_length_mult=1 m8f_ts_light_level=120 m8f_ts_min_health=0 m8f_ts_named_confirm=false m8f_ts_no_cross_on_1=false m8f_ts_on_target=0 m8f_ts_opacity=1 m8f_ts_pip=# m8f_ts_red_color=6 m8f_ts_show_bar=true m8f_ts_show_champion=true m8f_ts_show_confirm=false m8f_ts_show_corpses=false m8f_ts_show_dormant=false m8f_ts_show_friends=true m8f_ts_show_hidden=true m8f_ts_show_idle=true m8f_ts_show_info=false m8f_ts_show_name=true m8f_ts_show_name_tag=false m8f_ts_show_numbers=0 m8f_ts_show_objects=1 m8f_ts_step_mult=1 m8f_ts_text_scale=1 m8f_ts_top_offset=0 m8f_ts_x_adjustment=0 m8f_ts_y=0.02 m8f_ts_y_offset=0 ts_extra_character=❤ [Doom.LocalServerInfo.Mod] [Doom.ConfigOnlyVariables.Mod] [Doom.m8f_ts_Controls.Bindings] [Doom.m8f_ts_Controls.DoubleBindings] ================================================ FILE: packages/sx05re/emuelec-ports/gzdoom/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present AmberELEC (https://github.com/AmberELEC) # Copyright (C) 2024-present EmuELEC (https://github.com/EmuELEC) PKG_NAME="gzdoom" PKG_VERSION="71c40432e5e893c629a1c9c76a523a0ab22bd56a" PKG_LICENSE="GPL" PKG_SITE="https://github.com/ZDoom/gzdoom" PKG_URL="${PKG_SITE}.git" PKG_GIT_CLONE_BRANCH="g4.12" PKG_DEPENDS_HOST="toolchain SDL2:host zmusic:host libwebp:host" PKG_DEPENDS_TARGET="toolchain SDL2 gzdoom:host zmusic libwebp" PKG_LONGDESC="GZDoom is a modder-friendly OpenGL and Vulkan source port based on the DOOM engine" PKG_TOOLCHAIN="cmake-make" pre_build_host() { HOST_CMAKE_OPTS="" } make_host() { cmake . -DNO_GTK=ON make } makeinstall_host() { : #no } pre_configure_host(){ PKG_CMAKE_OPTS_HOST=" -DZMUSIC_LIBRARIES=$(get_build_dir zmusic)/build_host/source/libzmusic.so \ -DZMUSIC_INCLUDE_DIR=$(get_build_dir zmusic)/include \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_RULE_MESSAGES=OFF \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON" } pre_configure_target() { PKG_CMAKE_OPTS_TARGET=" -DNO_GTK=ON \ -DFORCE_CROSSCOMPILE=ON \ -DIMPORT_EXECUTABLES=${PKG_BUILD}/.${HOST_NAME}/ImportExecutables.cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_RULE_MESSAGES=OFF \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ -DHAVE_GLES2=ON \ -DHAVE_VULKAN=OFF \ -DZMUSIC_LIBRARIES=$(get_build_dir zmusic)/build_target/source/libzmusic.so -DZMUSIC_INCLUDE_DIR=$(get_build_dir zmusic)/include" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/gzdoom.sh ${INSTALL}/usr/bin/ cp ${PKG_BUILD}/.${TARGET_NAME}/gzdoom ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/gzdoom if [ "$DEVICE" == "OdroidGoAdvance" ] || [ "$DEVICE" == "GameForce" ]; then cp ${PKG_DIR}/config/OGA/* ${INSTALL}/usr/config/emuelec/configs/gzdoom else cp ${PKG_DIR}/config/N2/* ${INSTALL}/usr/config/emuelec/configs/gzdoom fi cp ${PKG_BUILD}/.${TARGET_NAME}/*.pk3 ${INSTALL}/usr/config/emuelec/configs/gzdoom cp -r ${PKG_BUILD}/.${TARGET_NAME}/soundfonts ${INSTALL}/usr/config/emuelec/configs/gzdoom cp -r ${PKG_BUILD}/.${TARGET_NAME}/fm_banks ${INSTALL}/usr/config/emuelec/configs/gzdoom } ================================================ FILE: packages/sx05re/emuelec-ports/gzdoom/patches/000-fix-build.patch ================================================ diff --git a/specs/udmf_zdoom.txt b/specs/udmf_zdoom.txt index ebc831d57..f2d7974a8 100644 --- a/specs/udmf_zdoom.txt +++ b/specs/udmf_zdoom.txt @@ -218,6 +218,9 @@ Note: All fields default to false unless mentioned otherwise. useowncolors_bottom = ; // Set to 1 to use the colors set in the sidedef. Default is using the colors from the owning sector. uppercolor_bottom = ; // Material color of the top of the lower tier. lowercolor_bottom = ; // Material color of the bottom of the lower tier. (Hardware rendering only.) + colorscalefactor_top = // scales the material color by the given factor. Default is 1. + colorscalefactor_mid = // scales the material color by the given factor. Default is 1. + colorscalefactor_bottom = // scales the material color by the given factor. Default is 1. useowncoloradd_top = ; // Controls where the advanced colorization properties are taken from. useowncoloradd_mid = ; // 0: From the containing sector, 1: from the given part of the linedef itself diff --git a/src/common/console/keydef.h b/src/common/console/keydef.h index 108806774..971ab398f 100644 --- a/src/common/console/keydef.h +++ b/src/common/console/keydef.h @@ -75,8 +75,13 @@ enum EKeyCodes KEY_JOY6, KEY_JOY7, KEY_JOY8, - KEY_JOY14 = KEY_FIRSTJOYBUTTON+13, - KEY_JOY15 = KEY_FIRSTJOYBUTTON+14, + KEY_JOY9, + KEY_JOY10, + KEY_JOY11, + KEY_JOY12, + KEY_JOY13, + KEY_JOY14, + KEY_JOY15, KEY_LASTJOYBUTTON = 0x187, KEY_JOYPOV1_UP = 0x188, KEY_JOYPOV1_RIGHT = 0x189, diff --git a/src/common/menu/menu.cpp b/src/common/menu/menu.cpp index 448b196a1..62f4819aa 100644 --- a/src/common/menu/menu.cpp +++ b/src/common/menu/menu.cpp @@ -687,15 +687,12 @@ bool M_Responder (event_t *ev) ch = ev->data1; switch (ch) { - case KEY_JOY1: - case KEY_JOY3: - case KEY_JOY15: + case KEY_JOY2: case KEY_PAD_A: mkey = MKEY_Enter; break; - case KEY_JOY2: - case KEY_JOY14: + case KEY_JOY1: case KEY_PAD_B: mkey = MKEY_Back; break; @@ -719,6 +716,7 @@ bool M_Responder (event_t *ev) case KEY_PAD_LTHUMB_UP: case KEY_JOYAXIS2MINUS: case KEY_JOYPOV1_UP: + case KEY_JOY9: mkey = MKEY_Up; break; @@ -726,6 +724,7 @@ bool M_Responder (event_t *ev) case KEY_PAD_LTHUMB_DOWN: case KEY_JOYAXIS2PLUS: case KEY_JOYPOV1_DOWN: + case KEY_JOY10: mkey = MKEY_Down; break; @@ -733,6 +732,7 @@ bool M_Responder (event_t *ev) case KEY_PAD_LTHUMB_LEFT: case KEY_JOYAXIS1MINUS: case KEY_JOYPOV1_LEFT: + case KEY_JOY11: mkey = MKEY_Left; break; @@ -740,6 +740,7 @@ bool M_Responder (event_t *ev) case KEY_PAD_LTHUMB_RIGHT: case KEY_JOYAXIS1PLUS: case KEY_JOYPOV1_RIGHT: + case KEY_JOY12: mkey = MKEY_Right; break; } diff --git a/src/common/platform/posix/sdl/i_gui.cpp b/src/common/platform/posix/sdl/i_gui.cpp index 9290f063f..62df74a35 100644 --- a/src/common/platform/posix/sdl/i_gui.cpp +++ b/src/common/platform/posix/sdl/i_gui.cpp @@ -68,7 +68,7 @@ bool I_SetCursor(FGameTexture *cursorpic) SDL_FreeCursor (cursor); cursor = SDL_CreateColorCursor (cursorSurface, 0, 0); SDL_SetCursor (cursor); - SDL_ShowCursor(SDL_ENABLE); + SDL_ShowCursor(SDL_DISABLE); } else { diff --git a/src/gamedata/doomfont.h b/src/gamedata/doomfont.h index fedeb513c..23b2c0759 100644 --- a/src/gamedata/doomfont.h +++ b/src/gamedata/doomfont.h @@ -57,6 +57,6 @@ void InitDoomFonts() } else if (fileSystem.CheckNumForName("STCFN033", FileSys::ns_graphics) >= 0) { - OriginalSmallFont = new FFont("OriginalSmallFont", "STCFN%.3d", "defsmallfont", HU_FONTSTART, HU_FONTSIZE, HU_FONTSTART, -1, -1, false, true, true); + OriginalSmallFont = new FFont("OriginalSmallFont", "STCFN%.3d", "defsmallfont", HU_FONTSTART, HU_FONTSIZE, HU_FONTSTART, -1, -1, false, true); } diff --git a/wadsrc/static/language.def b/wadsrc/static/language.def index da8ddfb4a..a0e3cc60d 100644 --- a/wadsrc/static/language.def +++ b/wadsrc/static/language.def @@ -99,6 +99,9 @@ STARTUP3 = ""; STARTUP4 = ""; STARTUP5 = ""; +// Engine strings +CNTRLMNU_OPEN_MAIN = "Open Main Menu"; + // Placeholder definitions for strings that are in the game content table where the labels are needed even when that file is not loaded. // Level names diff --git a/src/common/rendering/gles/gles_system.cpp b/src/common/rendering/gles/gles_system.cpp index d9bedafdd..2b02dfcd8 100644 --- a/src/common/rendering/gles/gles_system.cpp +++ b/src/common/rendering/gles/gles_system.cpp @@ -208,6 +208,7 @@ namespace OpenGLESRenderer gles.npotAvailable = CheckExtension("GL_OES_texture_npot"); gles.depthClampAvailable = CheckExtension("GL_EXT_depth_clamp"); gles.anistropicFilterAvailable = CheckExtension("GL_EXT_texture_filter_anisotropic"); + gles.useMappedBuffers = true; } else if (gles.glesMode == GLES_MODE_OGL2) { ================================================ FILE: packages/sx05re/emuelec-ports/gzdoom/scripts/gzdoom.sh ================================================ #!/usr/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present EmuELEC (https://github.com/EmuELEC) . /etc/profile RUN_DIR="/storage/roms/ports/doom" CONFIG_DIR="/emuelec/configs/gzdoom" HOMECONFIG="/storage/.config/gzdoom" # Check for newer pk3 files SHASUMSRC=$(sha256sum "/usr/config/emuelec/configs/gzdoom/gzdoom.pk3" | awk '{print $1}') SHASUMDST=$(sha256sum "${CONFIG_DIR}/gzdoom.pk3" | awk '{print $1}') if [ $SHASUMSRC != $SHASUMDST ]; then cp /usr/config/emuelec/configs/gzdoom/*.pk3 ${CONFIG_DIR} fi if [ ! -L "${HOMECONFIG}" ]; then [[ -d "${HOMECONFIG}" ]] && rm -rf "${HOMECONFIG}" ln -sf "${CONFIG_DIR}" "${HOMECONFIG}" fi params=" -savedir ${CONFIG_DIR}" # EXT can be wad, WAD, iwad, IWAD, pwad, PWAD or doom EXT=${1#*.} # If its not a simple wad (extension .choco) read the file and parse the data if [ "${EXT}" == "doom" ]; then while IFS== read -r key value; do if [ "${key}" == "SUBDIR" ]; then RUN_DIR="/storage/roms/ports/doom/${value}" fi if [ "${key}" == "PARAMS" ]; then params+=" ${value}" fi done < <(<"${1}" tr -d '\r'; echo;) else params+=" -iwad ${1}" fi cd "${RUN_DIR}" # Do not overwrite log messages already written by emuelecRunEmu.sh /usr/bin/gzdoom ${params} >>/emuelec/logs/emuelec.log 2>&1 ================================================ FILE: packages/sx05re/emuelec-ports/gzdoom/zmusic/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present AmberELEC (https://github.com/AmberELEC) # Copyright (C) 2024-present EmuELEC (https://github.com/EmuELEC) PKG_NAME="zmusic" PKG_VERSION="7476a189755d2665b24a58182640752b82b3a66d" PKG_LICENSE="GPL" PKG_SITE="https://github.com/ZDoom/ZMusic" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_HOST="toolchain:host glib:host" PKG_DEPENDS_TARGET="toolchain zmusic:host" PKG_LONGDESC="GZDoom's music system as a standalone library" PKG_TOOLCHAIN="cmake-make" pre_build_host() { HOST_CMAKE_OPTS="" } make_host() { mkdir ${PKG_BUILD}/build_host cd ${PKG_BUILD}/build_host cmake -DCMAKE_BUILD_TYPE=Release .. cmake --build . } make_target() { mkdir ${PKG_BUILD}/build_target cd ${PKG_BUILD}/build_target cmake -DCMAKE_BUILD_TYPE=Release .. cmake --build . } makeinstall_host() { : #no } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib cp -f ${PKG_BUILD}/build_target/source/libzmusic* ${INSTALL}/usr/lib/ } ================================================ FILE: packages/sx05re/emuelec-ports/hodesdl/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) #https://github.com/MaximLopez/HeartOfDarkness-SDL" PKG_NAME="hodesdl" PKG_VERSION="59f3c466923c6b8d49e29176ff697a91165e7efc" PKG_REV="1" PKG_ARCH="any" PKG_SITE="https://github.com/usineur/hode" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_LONGDESC="Game port of 'Heart of Darkness' using SDL2" PKG_TOOLCHAIN="cmake" GET_HANDLER_SUPPORT="git" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/.${TARGET_NAME}/hode ${INSTALL}/usr/bin cp ${PKG_BUILD}/hode.ini ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emuelec-ports/hodesdl/sources/hode.ini ================================================ [engine] # disable animations playback disable_paf=false # disable monsters handling code disable_mst=false # disable sound handling code disable_sss=false # maximum number of active sounds (original engine sets to 10 if a slow CPU or low memory is detected) max_active_sounds=16 # 0:easy 1:normal 2:hard difficulty=1 # frame duration in milliseconds (original is 80ms, eg. 12.5hz) frame_duration=80 # display splash screen when loading data files loading_screen=true [display] # scaling factor for game graphics (base resolution is 256x192) scale_factor=3 # scaling algorithm for game graphics ('xbr' or 'nearest') scale_algorithm=nearest # gamma correction gamma=1.0 # fullscreen display fullscreen=false # widescreen (16:9) widescreen=false ================================================ FILE: packages/sx05re/emuelec-ports/hurrican/config/gptokeyb/hurrican.gptk ================================================ back = esc start = enter guide = enter # Jump a = leftalt # Shoot b = leftctrl # Grenade x = rightctrl # Powerline y = space # Ligthing l1 = leftshift # Grenade l2 = rightctrl # cycle Weapons r1 = enter # Shockwave r2 = rightshift up = up down = down left = left right = right left_analog_up = up left_analog_down = down left_analog_left = left left_analog_right = right right_analog_up = up right_analog_down = down right_analog_left = left right_analog_right = right ================================================ FILE: packages/sx05re/emuelec-ports/hurrican/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="hurrican" PKG_VERSION="3f4bfd340730c0dc4443dd35e4d9a310ecf612ad" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/drfiemost/Hurrican" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_mixer libepoxy" PKG_LONGDESC="A fork of Hurrican, freeware jump and shoot game created by Poke53280, with SDL2 enabled by default, support for libopenmpt and CRT simulation " GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="cmake" PKG_CMAKE_OPTS_TARGET=" ./Hurrican -DCMAKE_BUILD_TYPE=Release -DRENDERER=GLES2" if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then PKG_CMAKE_OPTS_TARGET+=" -DDEFAULT_SCREENBPP=16" fi makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp hurrican ${INSTALL}/usr/bin cp "${PKG_DIR}/scripts/hurrican.sh" ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs cp -rf ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/ } ================================================ FILE: packages/sx05re/emuelec-ports/hurrican/scripts/hurrican.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile DATA="https://github.com/drfiemost/Hurrican/archive/refs/heads/master.zip" DATAFOLDER="/storage/roms/ports/hurrican/data" CONFIGFOLDER="/storage/roms/ports/hurrican" mkdir -p "${DATAFOLDER}" mkdir -p "${CONFIGFOLDER}/lang" cd "${CONFIGFOLDER}" if [ "${EE_DEVICE}" != "Amlogic-ng" ]; then gptokeyb -c /emuelec/configs/gptokeyb/hurrican.gptk & FLAGS=" --depth 16" fi if [ ! -e "${DATAFOLDER}/levels/levellist.dat" ]; then text_viewer -y -w -f 24 -t "Data does not exists!" -m "It seems this is the first time you are launching Hurrican or the data folder does not exists\n\nData is about 95 MB total, and you need to be connected to the internet\n\n\nDownload and continue?" if [[ $? == 21 ]]; then ee_console enable clear > /dev/tty0 cat /etc/motd > /dev/tty0 echo "Downloading Hurrican data, please wait..." > /dev/tty0 rm -rf "${DATAFOLDER}" rm -rf "/storage/roms/ports/hurrican/lang" wget "${DATA}" -q --show-progress > /dev/tty0 2>&1 echo "Installing Hurrican data, please wait..." > /dev/tty0 unzip "master.zip" "Hurrican-master/Hurrican/data/*" -d "${CONFIGFOLDER}" unzip "master.zip" "Hurrican-master/Hurrican/lang/*.lng" -d "${CONFIGFOLDER}" mv "Hurrican-master/Hurrican/data" "${CONFIGFOLDER}" mv "Hurrican-master/Hurrican/lang" "${CONFIGFOLDER}" rm -rf "Hurrican-master" > /dev/tty0 2>&1 rm "master.zip" > /dev/tty0 2>&1 ee_console disable cd "${CONFIGFOLDER}" hurrican ${FLAGS} > /emuelec/logs/emuelec.log 2>&1 else exit 0 fi else hurrican ${FLAGS} > /emuelec/logs/emuelec.log 2>&1 fi ================================================ FILE: packages/sx05re/emuelec-ports/hydracastlelabyrinth/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="hydracastlelabyrinth" PKG_VERSION="a4000681a20cd6639183cf72a722f4c2daf30cc7" PKG_SHA256="1f6408bf1cc4dbf67846ddad3a031a40f1d65a23924a75055e940f63abe6c9ec" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL2" PKG_SITE="https://github.com/ptitSeb/hydracastlelabyrinth" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_mixer libogg timidity" PKG_LONGDESC="A port to Linux (and OpenPandora / DragonBox Pyra / ODroid / PocketCHIP / GameShell / AmigaOS4 / MorphOS / Emscripten) of Hydra Castle Labyrinth (a "metroidvania" kind of game). Status: Working." PKG_TOOLCHAIN="cmake-make" pre_configure_target() { PKG_CMAKE_OPTS_TARGET=" -DUSE_SDL2=ON -DSDL2_INCLUDE_DIRS=${SYSROOT_PREFIX}/usr/include/SDL2 -DSDL2_LIBRARIES=${SYSROOT_PREFIX}/usr/lib" LDFLAGS="${LDFLAGS} -lSDL2" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/.${TARGET_NAME}/hcl ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/hcl/data cp -r ${PKG_BUILD}/data/* ${INSTALL}/usr/config/emuelec/configs/hcl/data } ================================================ FILE: packages/sx05re/emuelec-ports/hydracastlelabyrinth/patches/01-change-back-to-guide.patch ================================================ --- a/src/sdl2/input.c +++ b/src/sdl2/input.c @@ -165,7 +165,7 @@ case SDL_CONTROLLER_BUTTON_Y: jFaceUp = w; break; case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: jL = w; break; case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: jR = w; break; - case SDL_CONTROLLER_BUTTON_BACK: jSelect = w; break; + case SDL_CONTROLLER_BUTTON_GUIDE: jSelect = w; break; case SDL_CONTROLLER_BUTTON_START: jStart = w; break; case SDL_CONTROLLER_BUTTON_DPAD_UP: jUp = w; break; case SDL_CONTROLLER_BUTTON_DPAD_DOWN: jDown = w; break; ================================================ FILE: packages/sx05re/emuelec-ports/lzdoom/config/lzdoom.ini ================================================ # This file was generated by LZDoom 3.87c-37-g9fcde1723 on 2021-03-23 23:13:52 # These are the directories to automatically search for IWADs. # Each directory should be on a separate line, preceded by Path= [IWADSearch.Directories] Path=. Path=$DOOMWADDIR Path=/emuelec/configs/lzdoom Path=/usr/local/share/doom Path=/usr/local/share/games/doom Path=/usr/share/doom Path=/usr/share/games/doom Path=/storage/roms/doom Path=/storage/roms/doom-mods # These are the directories to search for wads added with the -file # command line parameter, if they cannot be found with the path # as-is. Layout is the same as for IWADSearch.Directories [FileSearch.Directories] Path=/emuelec/configs/lzdoom Path=/usr/local/share/ Path=/usr/local/share/doom Path=/usr/local/share/games/doom Path=/usr/share/doom Path=/usr/share/games/doom Path=/storage/roms/doom Path=$DOOMWADDIR Path=/storage/roms/doom-mods # These are the directories to search for soundfonts that let listed in the menu. # Layout is the same as for IWADSearch.Directories [SoundfontSearch.Directories] Path=/emuelec/configs/lzdoom/soundfonts Path=/emuelec/configs/lzdoom/fm_banks Path=/usr/local/share/doom/soundfonts Path=/usr/local/share/doom/fm_banks Path=/usr/local/share/games/doom/soundfonts Path=/usr/local/share/games/doom/fm_banks Path=/usr/share/doom/soundfonts Path=/usr/share/doom/fm_banks Path=/usr/share/games/doom/soundfonts Path=/usr/share/games/doom/fm_banks # Files to automatically execute when running the corresponding game. # Each file should be on its own line, preceded by Path= [Doom.AutoExec] Path=/emuelec/configs/lzdoom/autoexec.cfg [Heretic.AutoExec] Path=/emuelec/configs/lzdoom/autoexec.cfg [Hexen.AutoExec] Path=/emuelec/configs/lzdoom/autoexec.cfg [Strife.AutoExec] Path=/emuelec/configs/lzdoom/autoexec.cfg [Chex.AutoExec] Path=/emuelec/configs/lzdoom/autoexec.cfg # WAD files to always load. These are loaded after the IWAD but before # any files added with -file. Place each file on its own line, preceded # by Path= [Global.Autoload] # Wad files to automatically load depending on the game and IWAD you are # playing. You may have have files that are loaded for all similar IWADs # (the game) and files that are only loaded for particular IWADs. For example, # any files listed under 'doom.Autoload' will be loaded for any version of Doom, # but files listed under 'doom.doom2.Autoload' will only load when you are # playing a Doom 2 based game (doom2.wad, tnt.wad or plutonia.wad), and files listed under # 'doom.doom2.commercial.Autoload' only when playing doom2.wad. [doom.Autoload] [doom.id.Autoload] [doom.id.doom2.Autoload] [doom.id.doom2.nerve.Autoload] [doom.id.doom2.commercial.Autoload] [doom.id.doom2.commercial.french.Autoload] [doom.id.doom2.commercial.xbox.Autoload] [doom.id.doom2.unity.Autoload] [doom.id.doom2.bfg.Autoload] [doom.id.doom1.Autoload] [doom.id.doom1.sigil.Autoload] [doom.id.doom2.plutonia.Autoload] [doom.id.doom2.plutonia.unity.Autoload] [doom.id.doom2.tnt.Autoload] [doom.id.doom2.tnt.unity.Autoload] [doom.id.doom1.registered.Autoload] [doom.id.doom1.ultimate.Autoload] [doom.id.doom1.ultimate.xbox.Autoload] [doom.id.doom2.wadsmoosh.Autoload] [doom.id.doom1.unity.Autoload] [doom.id.doom1.bfg.Autoload] [doom.freedoom.Autoload] [doom.freedoom.demo.Autoload] [doom.freedoom.phase1.Autoload] [doom.freedoom.phase2.Autoload] [doom.freedoom.freedm.Autoload] [heretic.Autoload] [heretic.heretic.Autoload] [heretic.shadow.Autoload] [blasphemer.Autoload] [hexen.Autoload] [hexen.deathkings.Autoload] [hexen.hexen.Autoload] [strife.Autoload] [strife.strife.Autoload] [strife.veteran.Autoload] [chex.Autoload] [chex.chex1.Autoload] [chex.chex3.Autoload] [urbanbrawl.Autoload] [hacx.Autoload] [hacx.hacx1.Autoload] [hacx.hacx2.Autoload] [harmony.Autoload] [square.Autoload] [square.squareware.Autoload] [square.square.Autoload] [delaweare.Autoload] [woolball.Autoload] [woolball.rotwb.Autoload] [LastRun] Version=221 [GlobalSettings] Gamma=1.4999995231628418 I_FriendlyWindowTitle=true adl_bank=14 adl_chips_count=6 adl_custom_bank= adl_emulator_id=0 adl_fullpan=true adl_run_at_pcm_rate=false adl_use_custom_bank=false adl_volume_model=0 autoloadbrightmaps=false autoloadconpics=true autoloadlights=false autoloadwidescreen=true autosavecount=4 autosavenum=1 bgamma=1 chase_dist=90 chase_height=-8 chat_self=false cl_capfps=false cl_noprediction=false cl_oldfreelooklimit=false cl_predict_lerpscale=0.05000000074505806 cl_predict_lerpthreshold=2 cl_predict_specials=true cl_run=false cl_waitforsave=true con_buffersize=-1 con_ctrl_d= con_notifylines=4 defaultiwad=DOOM Shareware demo_compress=true developer=0 disableautoload=false disableautosave=0 enablescriptscreenshot=false fluid_chorus=true fluid_chorus_depth=8 fluid_chorus_level=1 fluid_chorus_speed=0.30000001192092896 fluid_chorus_type=0 fluid_chorus_voices=3 fluid_gain=1 fluid_interp=1 fluid_lib= fluid_patchset=lzdoom fluid_reverb=true fluid_reverb_damping=0.23000000417232513 fluid_reverb_level=0.5699999928474426 fluid_reverb_roomsize=0.6100000143051147 fluid_reverb_width=0.7599999904632568 fluid_samplerate=0 fluid_threads=4 fluid_voices=128 freelook=true fullscreen=true ggamma=1 gl_billboard_faces_camera=false gl_billboard_mode=0 gl_billboard_particles=true gl_cachenodes=true gl_cachetime=0.6000000238418579 gl_debug=false gl_debug_breakpoint=false gl_debug_level=0 gl_distfog=70 gl_dither_bpc=0 gl_enhanced_nv_stealth=3 gl_es=false gl_finishbeforeswap=false gl_fxaa=0 gl_legacy_mode=false gl_lens=false gl_lens_chromatic=1.1200000047683716 gl_lens_k=-0.11999999731779099 gl_lens_kcube=0.10000000149011612 gl_light_particles=true gl_light_shadowmap=false gl_light_sprites=true gl_lights=true gl_lights_additive=false gl_lights_checkside=true gl_line_distance_cull=8000 gl_mask_sprite_threshold=0.5 gl_mask_threshold=0.5 gl_mirror_envmap=true gl_mirrors=true gl_multisample=1 gl_no_skyclear=false gl_particles_style=2 gl_plane_reflection=true gl_render_precise=false gl_renderbuffers=true gl_riskymodernpath=false gl_satformula=1 gl_seamless=false gl_shadowmap_filter=1 gl_shadowmap_quality=512 gl_sort_textures=false gl_sprite_blend=false gl_sprite_distance_cull=4000 gl_ssao=0 gl_ssao_portals=1 gl_ssao_strength=0.699999988079071 gl_texture_filter=0 gl_texture_filter_anisotropic=8 gl_texture_format=0 gl_texture_hqresize_maxinputsize=512 gl_texture_hqresize_mt_height=4 gl_texture_hqresize_mt_width=16 gl_texture_hqresize_multithread=true gl_texture_hqresize_targets=7 gl_texture_hqresizemode=0 gl_texture_hqresizemult=1 gl_texture_useshaders=true gl_usecolorblending=true gl_usefb=false gme_stereodepth=0 gus_memsize=0 gus_patchdir= i_soundinbackground=false inter_subtitles=false invertmouse=false invertmousex=false joy_background=true k_modern=1 language=auto longsavemessages=true lookstrafe=false m_blockcontrollers=false m_filter=false m_forward=1 m_noprescale=false m_pitch=1 m_show_backbutton=0 m_showinputgrid=0 m_side=2 m_use_mouse=2 m_yaw=1 map_point_coordinates=true midi_config=lzdoom midi_dmxgus=false midi_voices=32 min_sustain_time=5000 mod_autochip=false mod_autochip_scan_threshold=12 mod_autochip_size_force=100 mod_autochip_size_scan=500 mod_dumb_mastervolume=1 mod_interp=2 mod_samplerate=0 mod_volramp=2 mouse_capturemode=1 mouse_sensitivity=1.5 nointerscrollabort=false nomonsterinterpolation=false oldsaveorder=false opl_core=0 opl_fullpan=true opl_numchips=2 opn_chips_count=8 opn_custom_bank= opn_emulator_id=0 opn_fullpan=true opn_run_at_pcm_rate=false opn_use_custom_bank=false png_gamma=0 png_level=5 queryiwad=true quicksavenum=-1 quicksaverotation=false quicksaverotationcount=4 r_blendmethod=false r_dynlights=false r_fakecontrast=1 r_fullbrightignoresectorcolor=true r_fuzzscale=true r_line_distance_cull=8000 r_linearsky=false r_magfilter=false r_minfilter=true r_mipmap=false r_mirror_recursions=2 r_models=true r_models_carmack=false r_multithreaded=1 r_polyrenderer=false r_quakeintensity=1 r_sprite_distance_cull=4000 r_ticstability=true rgamma=1 save_dir= save_formatted=false saveloadconfirmation=true savestatistics=0 screenshot_dir= screenshot_quiet=false screenshot_type=png show_messages=true showendoom=0 snd_aldevice=Default snd_alresampler=Default snd_backend=openal snd_buffersize=0 snd_channels=128 snd_efx=false snd_hrtf=0 snd_mastervolume=1 snd_mididevice=-5 snd_midiprecache=false snd_musicvolume=0.5 snd_samplerate=0 snd_sfxvolume=1 snd_streambuffersize=64 snd_waterreverb=true statfile=zdoomstat.txt storesavepic=true strictdecorate=false swtruecolor=true telezoom=true timidity_channel_pressure=false timidity_chorus=0 timidity_config=lzdoom timidity_drum_effect=false timidity_drum_power=1 timidity_key_adjust=0 timidity_lpf_def=1 timidity_modulation_envelope=true timidity_modulation_wheel=true timidity_overlap_voice_allow=true timidity_pan_delay=false timidity_portamento=true timidity_reverb=0 timidity_reverb_level=0 timidity_surround_chorus=false timidity_temper_control=true timidity_tempo_adjust=1 turnspeedsprintfast=1280 turnspeedsprintslow=320 turnspeedwalkfast=640 turnspeedwalkslow=320 use_joystick=true use_mouse=false vid_activeinbackground=false vid_adapter=0 vid_aspect=0 vid_brightness=0 vid_contrast=1 vid_cropaspect=false vid_defbits=24 vid_defheight=450 vid_defwidth=800 vid_displaybits=32 vid_forcesurface=false vid_glswfb=false vid_hdr=false vid_hwaalines=true vid_hwgamma=2 vid_maxfps=200 vid_refreshrate=0 vid_renderer=0 vid_saturation=1 vid_scalefactor=1 vid_scalemode=0 vid_vsync=false vid_winscale=1 vr_enable_quadbuffered=false vr_hunits_per_meter=41 vr_ipd=0.06199999898672104 vr_screendist=0.800000011920929 wildmidi_config= wildmidi_enhanced_resampling=true wildmidi_reverb=false xbrz_centerdirectionbias=4 xbrz_colorformat=0 xbrz_dominantdirectionthreshold=3.5999999046325684 xbrz_equalcolortolerance=30 xbrz_luminanceweight=1 xbrz_steepdirectionthreshold=2.200000047683716 [GlobalSettings.Unknown] [Doom.Player] autoaim=35 classicflight=false color=40 cf 00 colorset=0 fov=90 gender=male movebob=0.25 name=Player neverswitchonpickup=false playerclass=Fighter skin=base stillbob=0 team=255 wbobfire=0 wbobspeed=1 wi_noautostartmap=false [Doom.ConsoleVariables] addrocketexplosion=false allcheats=false am_backcolor=6c 54 40 am_cdwallcolor=4c 38 20 am_colorset=0 am_customcolors=true am_drawmapback=1 am_efwallcolor=66 55 55 am_emptyspacemargin=0 am_fdwallcolor=88 70 58 am_followplayer=true am_gridcolor=8b 5a 2b am_interlevelcolor=ff 00 00 am_intralevelcolor=00 00 ff am_lockedcolor=00 78 00 am_map_secrets=1 am_markcolor=2 am_markfont=AMMNUMx am_notseencolor=6c 6c 6c am_ovcdwallcolor=00 88 44 am_ovefwallcolor=00 88 44 am_overlay=0 am_ovfdwallcolor=00 88 44 am_ovinterlevelcolor=ff ff 00 am_ovlockedcolor=00 88 44 am_ovotherwallscolor=00 88 44 am_ovportalcolor=00 40 22 am_ovsecretsectorcolor=00 ff ff am_ovsecretwallcolor=00 88 44 am_ovspecialwallcolor=ff ff ff am_ovtelecolor=ff ff 00 am_ovthingcolor=e8 88 00 am_ovthingcolor_citem=e8 88 00 am_ovthingcolor_friend=e8 88 00 am_ovthingcolor_item=e8 88 00 am_ovthingcolor_monster=e8 88 00 am_ovthingcolor_ncmonster=e8 88 00 am_ovunexploredsecretcolor=00 ff ff am_ovunseencolor=00 22 6e am_ovwallcolor=00 ff 00 am_ovyourcolor=fc e8 d8 am_portalcolor=40 40 40 am_portaloverlay=true am_rotate=0 am_secretsectorcolor=ff 00 ff am_secretwallcolor=00 00 00 am_showitems=false am_showkeys=true am_showkeys_always=false am_showmaplabel=2 am_showmonsters=true am_showsecrets=true am_showthingsprites=0 am_showtime=true am_showtotaltime=false am_showtriggerlines=0 am_specialwallcolor=ff ff ff am_textured=false am_thingcolor=fc fc fc am_thingcolor_citem=fc fc fc am_thingcolor_friend=fc fc fc am_thingcolor_item=fc fc fc am_thingcolor_monster=fc fc fc am_thingcolor_ncmonster=fc fc fc am_thingrenderstyles=true am_tswallcolor=88 88 88 am_unexploredsecretcolor=ff 00 ff am_wallcolor=2c 18 08 am_xhaircolor=80 80 80 am_yourcolor=fc e8 d8 blood_fade_scalar=1 chat_substitution=false chatmacro0=No chatmacro1=I'm ready to kick butt! chatmacro2=I'm OK. chatmacro3=I'm not looking too good! chatmacro4=Help! chatmacro5=You suck! chatmacro6=Next time, scumbag... chatmacro7=Come here! chatmacro8=I'll take care of it. chatmacro9=Yes cl_bbannounce=false cl_bloodsplats=true cl_bloodtype=0 cl_custominvulmapcolor1=00 00 1a cl_custominvulmapcolor2=a6 a6 7a cl_customizeinvulmap=false cl_doautoaim=false cl_maxdecals=1024 cl_missiledecals=true cl_pufftype=0 cl_rockettrails=1 cl_showmultikills=true cl_showsecretmessage=true cl_showsprees=true cl_spreaddecals=true compatmode=0 con_alpha=0.75 con_centernotify=false con_midtime=3 con_notablist=false con_notifytime=3 con_scale=0 con_scaletext=0 crosshair=0 crosshaircolor=ff 00 00 crosshairforce=false crosshairgrow=false crosshairhealth=1 crosshairon=true crosshairscale=1 dehload=0 dimamount=-1 dimcolor=ff d7 00 displaynametags=0 dlg_musicvolume=1 gl_aalines=false gl_bandedswlight=false gl_bloom=false gl_bloom_amount=1.399999976158142 gl_bloom_kernel_size=7 gl_brightfog=false gl_enhanced_nightvision=false gl_exposure_base=0.3499999940395355 gl_exposure_min=0.3499999940395355 gl_exposure_scale=1.2999999523162842 gl_exposure_speed=0.05000000074505806 gl_fogmode=1 gl_fuzztype=6 gl_interpolate_model_frames=true gl_light_models=true gl_lightadditivesurfaces=false gl_lightmode=8 gl_menu_blur=-1 gl_paltonemap_powtable=2 gl_paltonemap_reverselookup=true gl_precache=false gl_scale_viewport=true gl_sclipfactor=1.7999999523162842 gl_sclipthreshold=10 gl_spriteclip=1 gl_texture_usehires=true gl_tonemap=0 gl_weaponlight=8 hud_althud=false hud_althud_forceinternal=false hud_althudscale=0 hud_ammo_order=0 hud_ammo_red=25 hud_ammo_yellow=50 hud_armor_green=100 hud_armor_red=25 hud_armor_yellow=50 hud_aspectscale=false hud_berserk_health=true hud_health_green=100 hud_health_red=25 hud_health_yellow=50 hud_scale=0 hud_showammo=2 hud_showangles=false hud_showitems=false hud_showlag=0 hud_showmonsters=true hud_showscore=false hud_showsecrets=true hud_showstats=false hud_showtime=0 hud_showweapons=true hud_timecolor=5 hudcolor_ltim=8 hudcolor_statnames=6 hudcolor_stats=3 hudcolor_time=6 hudcolor_titl=10 hudcolor_ttim=5 hudcolor_xyco=3 lookspring=true m_quickexit=false menu_screenratios=-1 msg=0 msg0color=6 msg1color=5 msg2color=2 msg3color=3 msg4color=3 msgmidcolor=5 msgmidcolor2=4 nametagcolor=5 nocheats=false os_isanyof=true paletteflash=0 pickup_fade_scalar=1 r_deathcamera=false r_drawfuzz=1 r_highlight_portals=false r_maxparticles=4000 r_portal_recursions=4 r_rail_smartspiral=false r_rail_spiralsparsity=1 r_rail_trailsparsity=1 r_shadercolormaps=true r_skymode=2 r_vanillatrans=0 sb_cooperative_enable=true sb_cooperative_headingcolor=6 sb_cooperative_otherplayercolor=2 sb_cooperative_yourplayercolor=3 sb_deathmatch_enable=true sb_deathmatch_headingcolor=6 sb_deathmatch_otherplayercolor=2 sb_deathmatch_yourplayercolor=3 sb_teamdeathmatch_enable=true sb_teamdeathmatch_headingcolor=6 screenblocks=11 setslotstrict=true show_obituaries=true snd_menuvolume=0.6000000238418579 snd_pitched=false st_oldouch=false st_scale=-1 transsouls=0.75 uiscale=0 underwater_fade_scalar=1 vid_cursor=- vid_nopalsubstitutions=false wi_percents=true wi_showtotaltime=true wipetype=1 [Doom.LocalServerInfo] compatflags=0 compatflags2=0 forcewater=false maxviewpitch=90 sv_alwaystally=0 sv_corpsequeuesize=64 sv_disableautohealth=false sv_dropstyle=0 sv_portal_recursions=4 sv_smartaim=0 [Doom.ConfigOnlyVariables] [Doom.UnknownConsoleVariables] [Doom.ConsoleAliases] [Doom.Bindings] 1=slot 1 2=slot 2 3=slot 3 4=slot 4 5=slot 5 6=slot 6 7=slot 7 8=slot 8 9=slot 9 0=slot 0 `=toggleconsole Joy1=invuse Joy2=+use Joy3=+jump Joy5=+speed Joy6=+attack Joy7=weapprev Joy8=weapnext Joy9=toggle cl_run Joy10=centerview POV1Up=+forward POV1Right=+moveright POV1Down=+back POV1Left=+moveleft Joy13=togglemap Joy14=menu_main [Doom.DoubleBindings] [Doom.AutomapBindings] 0=am_gobig -=+am_zoomout Equals=+am_zoomin P=am_toggletexture F=am_togglefollow G=am_togglegrid C=am_clearmarks M=am_setmark KP-=+am_zoomout KP+=+am_zoomin UpArrow=+am_panup LeftArrow=+am_panleft RightArrow=+am_panright DownArrow=+am_pandown MWheelUp=am_zoom 1.2 MWheelDown=am_zoom -1.2 [Joy:JS:0] Sensitivity=1.2 Axis0deadzone=0.500001 Axis0scale=0.6 Axis0map=0 Axis1deadzone=0.500001 Axis1scale=0.6 Axis2deadzone=0.500001 Axis2scale=0.6 Axis2map=3 Axis3deadzone=0.500001 Axis3scale=0.6 Axis3map=1 [Strife.Player] autoaim=35 classicflight=false color=40 cf 00 colorset=0 fov=90 gender=male movebob=0.25 name=Player neverswitchonpickup=false playerclass=Fighter skin=base stillbob=0 team=255 wbobfire=0 wbobspeed=1 wi_noautostartmap=false [Strife.ConsoleVariables] addrocketexplosion=false allcheats=false am_backcolor=6c 54 40 am_cdwallcolor=4c 38 20 am_colorset=0 am_customcolors=true am_drawmapback=1 am_efwallcolor=66 55 55 am_emptyspacemargin=0 am_fdwallcolor=88 70 58 am_followplayer=true am_gridcolor=8b 5a 2b am_interlevelcolor=ff 00 00 am_intralevelcolor=00 00 ff am_lockedcolor=00 78 00 am_map_secrets=1 am_markcolor=2 am_markfont=AMMNUMx am_notseencolor=6c 6c 6c am_ovcdwallcolor=00 88 44 am_ovefwallcolor=00 88 44 am_overlay=0 am_ovfdwallcolor=00 88 44 am_ovinterlevelcolor=ff ff 00 am_ovlockedcolor=00 88 44 am_ovotherwallscolor=00 88 44 am_ovportalcolor=00 40 22 am_ovsecretsectorcolor=00 ff ff am_ovsecretwallcolor=00 88 44 am_ovspecialwallcolor=ff ff ff am_ovtelecolor=ff ff 00 am_ovthingcolor=e8 88 00 am_ovthingcolor_citem=e8 88 00 am_ovthingcolor_friend=e8 88 00 am_ovthingcolor_item=e8 88 00 am_ovthingcolor_monster=e8 88 00 am_ovthingcolor_ncmonster=e8 88 00 am_ovunexploredsecretcolor=00 ff ff am_ovunseencolor=00 22 6e am_ovwallcolor=00 ff 00 am_ovyourcolor=fc e8 d8 am_portalcolor=40 40 40 am_portaloverlay=true am_rotate=0 am_secretsectorcolor=ff 00 ff am_secretwallcolor=00 00 00 am_showitems=false am_showkeys=true am_showkeys_always=false am_showmaplabel=2 am_showmonsters=true am_showsecrets=true am_showthingsprites=0 am_showtime=true am_showtotaltime=false am_showtriggerlines=0 am_specialwallcolor=ff ff ff am_textured=false am_thingcolor=fc fc fc am_thingcolor_citem=fc fc fc am_thingcolor_friend=fc fc fc am_thingcolor_item=fc fc fc am_thingcolor_monster=fc fc fc am_thingcolor_ncmonster=fc fc fc am_thingrenderstyles=true am_tswallcolor=88 88 88 am_unexploredsecretcolor=ff 00 ff am_wallcolor=2c 18 08 am_xhaircolor=80 80 80 am_yourcolor=fc e8 d8 blood_fade_scalar=1 chat_substitution=false chatmacro0=No chatmacro1=I'm ready to kick butt! chatmacro2=I'm OK. chatmacro3=I'm not looking too good! chatmacro4=Help! chatmacro5=You suck! chatmacro6=Next time, scumbag... chatmacro7=Come here! chatmacro8=I'll take care of it. chatmacro9=Yes cl_bbannounce=false cl_bloodsplats=true cl_bloodtype=0 cl_custominvulmapcolor1=00 00 1a cl_custominvulmapcolor2=a6 a6 7a cl_customizeinvulmap=false cl_doautoaim=false cl_maxdecals=1024 cl_missiledecals=true cl_pufftype=0 cl_rockettrails=1 cl_showmultikills=true cl_showsecretmessage=true cl_showsprees=true cl_spreaddecals=true compatmode=0 con_alpha=0.75 con_centernotify=false con_midtime=3 con_notablist=false con_notifytime=3 con_scale=0 con_scaletext=0 crosshair=0 crosshaircolor=ff 00 00 crosshairforce=false crosshairgrow=false crosshairhealth=1 crosshairon=true crosshairscale=1 dehload=0 dimamount=-1 dimcolor=ff d7 00 displaynametags=0 dlg_musicvolume=1 gl_aalines=false gl_bandedswlight=false gl_bloom=false gl_bloom_amount=1.399999976158142 gl_bloom_kernel_size=7 gl_brightfog=false gl_enhanced_nightvision=false gl_exposure_base=0.3499999940395355 gl_exposure_min=0.3499999940395355 gl_exposure_scale=1.2999999523162842 gl_exposure_speed=0.05000000074505806 gl_fogmode=1 gl_fuzztype=6 gl_interpolate_model_frames=true gl_light_models=true gl_lightadditivesurfaces=false gl_lightmode=3 gl_menu_blur=-1 gl_paltonemap_powtable=2 gl_paltonemap_reverselookup=true gl_precache=false gl_scale_viewport=true gl_sclipfactor=1.7999999523162842 gl_sclipthreshold=10 gl_spriteclip=1 gl_texture_usehires=true gl_tonemap=0 gl_weaponlight=8 hud_althud=false hud_althud_forceinternal=false hud_althudscale=0 hud_ammo_order=0 hud_ammo_red=25 hud_ammo_yellow=50 hud_armor_green=100 hud_armor_red=25 hud_armor_yellow=50 hud_aspectscale=false hud_berserk_health=true hud_health_green=100 hud_health_red=25 hud_health_yellow=50 hud_scale=0 hud_showammo=2 hud_showangles=false hud_showitems=false hud_showlag=0 hud_showmonsters=true hud_showscore=false hud_showsecrets=true hud_showstats=false hud_showtime=0 hud_showweapons=true hud_timecolor=5 hudcolor_ltim=8 hudcolor_statnames=6 hudcolor_stats=3 hudcolor_time=6 hudcolor_titl=10 hudcolor_ttim=5 hudcolor_xyco=3 lookspring=true m_quickexit=false menu_screenratios=-1 msg=0 msg0color=6 msg1color=5 msg2color=2 msg3color=3 msg4color=3 msgmidcolor=5 msgmidcolor2=4 nametagcolor=5 nocheats=false os_isanyof=true paletteflash=0 pickup_fade_scalar=1 r_deathcamera=false r_drawfuzz=1 r_highlight_portals=false r_maxparticles=4000 r_portal_recursions=4 r_rail_smartspiral=false r_rail_spiralsparsity=1 r_rail_trailsparsity=1 r_shadercolormaps=true r_skymode=2 r_vanillatrans=0 sb_cooperative_enable=true sb_cooperative_headingcolor=6 sb_cooperative_otherplayercolor=2 sb_cooperative_yourplayercolor=3 sb_deathmatch_enable=true sb_deathmatch_headingcolor=6 sb_deathmatch_otherplayercolor=2 sb_deathmatch_yourplayercolor=3 sb_teamdeathmatch_enable=true sb_teamdeathmatch_headingcolor=6 screenblocks=10 setslotstrict=true show_obituaries=true snd_menuvolume=0.6000000238418579 snd_pitched=false st_oldouch=false st_scale=-1 transsouls=0.75 uiscale=0 underwater_fade_scalar=1 vid_cursor=- vid_nopalsubstitutions=false wi_percents=true wi_showtotaltime=true wipetype=1 [Strife.LocalServerInfo] compatflags=0 compatflags2=0 forcewater=false maxviewpitch=90 sv_alwaystally=0 sv_corpsequeuesize=64 sv_disableautohealth=false sv_dropstyle=0 sv_portal_recursions=4 sv_smartaim=0 [Strife.ConfigOnlyVariables] [Strife.UnknownConsoleVariables] [Strife.ConsoleAliases] [Strife.Bindings] 1=slot 1 2=slot 2 3=slot 3 4=slot 4 5=slot 5 6=slot 6 7=slot 7 8=slot 8 9=slot 9 0=slot 0 T=messagemode `=toggleconsole Joy1=invuse Joy2=+use Joy3=+jump Joy4=invnext Joy5=+speed Joy6=+attack Joy7=menu_main Joy8=togglemap Joy9=toggle cl_run Joy10=centerview Joy11=weapprev Joy12=weapnext Joy14=showpop 3 Joy15=showpop 2 Joy16=showpop 1 POV1Up=+forward POV1Right=+moveright POV1Down=+back POV1Left=+moveleft [Strife.DoubleBindings] [Strife.AutomapBindings] 0=am_gobig -=+am_zoomout Equals=+am_zoomin P=am_toggletexture F=am_togglefollow G=am_togglegrid C=am_clearmarks M=am_setmark KP-=+am_zoomout KP+=+am_zoomin UpArrow=+am_panup LeftArrow=+am_panleft RightArrow=+am_panright DownArrow=+am_pandown MWheelUp=am_zoom 1.2 MWheelDown=am_zoom -1.2 [Hexen.Player] autoaim=35 classicflight=false color=40 cf 00 colorset=0 fov=90 gender=male movebob=0.25 name=Player neverswitchonpickup=false playerclass=Fighter skin=base stillbob=0 team=255 wbobfire=0 wbobspeed=1 wi_noautostartmap=false [Hexen.ConsoleVariables] addrocketexplosion=false allcheats=false am_backcolor=6c 54 40 am_cdwallcolor=73 43 23 am_colorset=0 am_customcolors=true am_drawmapback=1 am_efwallcolor=66 55 55 am_emptyspacemargin=0 am_fdwallcolor=d0 b0 85 am_followplayer=true am_gridcolor=8b 5a 2b am_interlevelcolor=ff 00 00 am_intralevelcolor=00 00 ff am_lockedcolor=00 78 00 am_map_secrets=1 am_markcolor=2 am_markfont=AMMNUMx am_notseencolor=6c 6c 6c am_ovcdwallcolor=00 88 44 am_ovefwallcolor=00 88 44 am_overlay=0 am_ovfdwallcolor=00 88 44 am_ovinterlevelcolor=ff ff 00 am_ovlockedcolor=00 88 44 am_ovotherwallscolor=00 88 44 am_ovportalcolor=00 40 22 am_ovsecretsectorcolor=00 ff ff am_ovsecretwallcolor=00 88 44 am_ovspecialwallcolor=ff ff ff am_ovtelecolor=ff ff 00 am_ovthingcolor=e8 88 00 am_ovthingcolor_citem=e8 88 00 am_ovthingcolor_friend=e8 88 00 am_ovthingcolor_item=e8 88 00 am_ovthingcolor_monster=e8 88 00 am_ovthingcolor_ncmonster=e8 88 00 am_ovunexploredsecretcolor=00 ff ff am_ovunseencolor=00 22 6e am_ovwallcolor=00 ff 00 am_ovyourcolor=fc e8 d8 am_portalcolor=40 40 40 am_portaloverlay=true am_rotate=0 am_secretsectorcolor=ff 00 ff am_secretwallcolor=00 00 00 am_showitems=false am_showkeys=true am_showkeys_always=false am_showmaplabel=2 am_showmonsters=true am_showsecrets=true am_showthingsprites=0 am_showtime=true am_showtotaltime=false am_showtriggerlines=0 am_specialwallcolor=ff ff ff am_textured=false am_thingcolor=fc fc fc am_thingcolor_citem=fc fc fc am_thingcolor_friend=fc fc fc am_thingcolor_item=fc fc fc am_thingcolor_monster=fc fc fc am_thingcolor_ncmonster=fc fc fc am_thingrenderstyles=true am_tswallcolor=88 88 88 am_unexploredsecretcolor=ff 00 ff am_wallcolor=54 3b 17 am_xhaircolor=80 80 80 am_yourcolor=fc e8 d8 blood_fade_scalar=1 chat_substitution=false chatmacro0=No chatmacro1=I'm ready to kick butt! chatmacro2=I'm OK. chatmacro3=I'm not looking too good! chatmacro4=Help! chatmacro5=You suck! chatmacro6=Next time, scumbag... chatmacro7=Come here! chatmacro8=I'll take care of it. chatmacro9=Yes cl_bbannounce=false cl_bloodsplats=true cl_bloodtype=0 cl_custominvulmapcolor1=00 00 1a cl_custominvulmapcolor2=a6 a6 7a cl_customizeinvulmap=false cl_doautoaim=false cl_maxdecals=1024 cl_missiledecals=true cl_pufftype=0 cl_rockettrails=1 cl_showmultikills=true cl_showsecretmessage=true cl_showsprees=true cl_spreaddecals=true compatmode=0 con_alpha=0.75 con_centernotify=true con_midtime=3 con_notablist=false con_notifytime=3 con_scale=0 con_scaletext=0 crosshair=0 crosshaircolor=ff 00 00 crosshairforce=false crosshairgrow=false crosshairhealth=1 crosshairon=true crosshairscale=1 dehload=0 dimamount=-1 dimcolor=ff d7 00 displaynametags=0 dlg_musicvolume=1 gl_aalines=false gl_bandedswlight=false gl_bloom=false gl_bloom_amount=1.399999976158142 gl_bloom_kernel_size=7 gl_brightfog=false gl_enhanced_nightvision=false gl_exposure_base=0.3499999940395355 gl_exposure_min=0.3499999940395355 gl_exposure_scale=1.2999999523162842 gl_exposure_speed=0.05000000074505806 gl_fogmode=1 gl_fuzztype=6 gl_interpolate_model_frames=true gl_light_models=true gl_lightadditivesurfaces=false gl_lightmode=3 gl_menu_blur=-1 gl_paltonemap_powtable=2 gl_paltonemap_reverselookup=true gl_precache=false gl_scale_viewport=true gl_sclipfactor=1.7999999523162842 gl_sclipthreshold=10 gl_spriteclip=1 gl_texture_usehires=true gl_tonemap=0 gl_weaponlight=8 hud_althud=false hud_althud_forceinternal=false hud_althudscale=0 hud_ammo_order=0 hud_ammo_red=25 hud_ammo_yellow=50 hud_armor_green=100 hud_armor_red=25 hud_armor_yellow=50 hud_aspectscale=false hud_berserk_health=true hud_health_green=100 hud_health_red=25 hud_health_yellow=50 hud_scale=0 hud_showammo=2 hud_showangles=false hud_showitems=false hud_showlag=0 hud_showmonsters=true hud_showscore=false hud_showsecrets=true hud_showstats=false hud_showtime=0 hud_showweapons=true hud_timecolor=5 hudcolor_ltim=8 hudcolor_statnames=6 hudcolor_stats=3 hudcolor_time=6 hudcolor_titl=10 hudcolor_ttim=5 hudcolor_xyco=3 lookspring=true m_quickexit=false menu_screenratios=-1 msg=0 msg0color=9 msg1color=5 msg2color=2 msg3color=3 msg4color=3 msgmidcolor=9 msgmidcolor2=10 nametagcolor=5 nocheats=false os_isanyof=true paletteflash=0 pickup_fade_scalar=1 r_deathcamera=false r_drawfuzz=1 r_highlight_portals=false r_maxparticles=4000 r_portal_recursions=4 r_rail_smartspiral=false r_rail_spiralsparsity=1 r_rail_trailsparsity=1 r_shadercolormaps=true r_skymode=2 r_vanillatrans=0 sb_cooperative_enable=true sb_cooperative_headingcolor=6 sb_cooperative_otherplayercolor=2 sb_cooperative_yourplayercolor=3 sb_deathmatch_enable=true sb_deathmatch_headingcolor=6 sb_deathmatch_otherplayercolor=2 sb_deathmatch_yourplayercolor=3 sb_teamdeathmatch_enable=true sb_teamdeathmatch_headingcolor=6 screenblocks=11 setslotstrict=true show_obituaries=true snd_menuvolume=0.6000000238418579 snd_pitched=true st_oldouch=false st_scale=-1 transsouls=0.75 uiscale=2 underwater_fade_scalar=1 vid_cursor=- vid_nopalsubstitutions=false wi_percents=false wi_showtotaltime=true wipetype=1 [Hexen.LocalServerInfo] compatflags=0 compatflags2=0 forcewater=false maxviewpitch=90 sv_alwaystally=0 sv_corpsequeuesize=64 sv_disableautohealth=false sv_dropstyle=0 sv_portal_recursions=4 sv_smartaim=0 [Hexen.ConfigOnlyVariables] [Hexen.UnknownConsoleVariables] [Hexen.ConsoleAliases] [Hexen.Bindings] 5=use ArtiInvulnerability2 6=use ArtiPork 7=use ArtiTeleportOther 8=use ArtiTeleport 9=use ArtiBlastRadius 0=useflechette T=messagemode \=use ArtiHealth Joy1=invuse Joy2=+use Joy3=+jump Joy4=invnext Joy5=+speed Joy6=+attack Joy7=menu_main Joy8=togglemap Joy9=toggle cl_run Joy10=centerview Joy11=weapprev Joy12=weapnext Joy14=showpop 3 Joy15=showpop 2 Joy16=showpop 1 POV1Up=+forward POV1Right=+moveright POV1Down=+back POV1Left=+moveleft [Hexen.DoubleBindings] [Hexen.AutomapBindings] 0=am_gobig -=+am_zoomout Equals=+am_zoomin P=am_toggletexture F=am_togglefollow G=am_togglegrid C=am_clearmarks M=am_setmark KP-=+am_zoomout KP+=+am_zoomin UpArrow=+am_panup LeftArrow=+am_panleft RightArrow=+am_panright DownArrow=+am_pandown MWheelUp=am_zoom 1.2 MWheelDown=am_zoom -1.2 [Doom.Player.Mod] b_flashlighthpos=0 b_flashlightlowq=0 b_flashlightmode=0 b_flashlightvpos=18 bd_bloodamount=2 bd_disablebloodyscreen=0 bd_enablesprint=0 bd_lowgraphicsmode=0 bd_morebloodmist=0 bd_sbartype=1 cl_step_delaymul=1 cl_step_volmul=7 [Doom.LocalServerInfo.Mod] bd_classicmonsters=0 bd_disablecrueltybonus=0 bd_disabledecorations=0 bd_disabledemonspheres=0 bd_disablefriendlymarines=0 bd_disablemapenhancements=0 bd_disablenewenemies=0 bd_disablenewguns=0 bd_disablescanner=0 bd_disablewaterripples2=1 bd_footstepsounds=1 bd_infinitecasings=0 bd_rocketbackblast=1 bd_shootablerocketammo=0 bd_voxeldec=1 flashlight_color=ff ff ff flashlight_inner=13 flashlight_intensity=235 flashlight_location=0 flashlight_outer=18 gmota_nomusic=0 isrunningzandronum=1 zdoombrutalblood=2 zdoombrutaljanitor=0 [Doom.ConfigOnlyVariables.Mod] [Doom.GMOTAactionkeys.Bindings] [Doom.GMOTAactionkeys.DoubleBindings] [UrbanBrawl.AutoExec] Path=/storage/.config/lzdoom/autoexec.cfg [UrbanBrawl.Player] autoaim=35 classicflight=false color=40 cf 00 colorset=0 fov=90 gender=male movebob=0.25 name=Player neverswitchonpickup=false playerclass=Fighter skin=base stillbob=0 team=255 wbobfire=0 wbobspeed=1 wi_noautostartmap=false [UrbanBrawl.ConsoleVariables] addrocketexplosion=false allcheats=false am_backcolor=6c 54 40 am_cdwallcolor=4c 38 20 am_colorset=0 am_customcolors=true am_drawmapback=1 am_efwallcolor=66 55 55 am_emptyspacemargin=0 am_fdwallcolor=88 70 58 am_followplayer=true am_gridcolor=8b 5a 2b am_interlevelcolor=ff 00 00 am_intralevelcolor=00 00 ff am_lockedcolor=00 78 00 am_map_secrets=1 am_markcolor=2 am_markfont=AMMNUMx am_notseencolor=6c 6c 6c am_ovcdwallcolor=00 88 44 am_ovefwallcolor=00 88 44 am_overlay=0 am_ovfdwallcolor=00 88 44 am_ovinterlevelcolor=ff ff 00 am_ovlockedcolor=00 88 44 am_ovotherwallscolor=00 88 44 am_ovportalcolor=00 40 22 am_ovsecretsectorcolor=00 ff ff am_ovsecretwallcolor=00 88 44 am_ovspecialwallcolor=ff ff ff am_ovtelecolor=ff ff 00 am_ovthingcolor=e8 88 00 am_ovthingcolor_citem=e8 88 00 am_ovthingcolor_friend=e8 88 00 am_ovthingcolor_item=e8 88 00 am_ovthingcolor_monster=e8 88 00 am_ovthingcolor_ncmonster=e8 88 00 am_ovunexploredsecretcolor=00 ff ff am_ovunseencolor=00 22 6e am_ovwallcolor=00 ff 00 am_ovyourcolor=fc e8 d8 am_portalcolor=40 40 40 am_portaloverlay=true am_rotate=0 am_secretsectorcolor=ff 00 ff am_secretwallcolor=00 00 00 am_showitems=false am_showkeys=true am_showkeys_always=false am_showmaplabel=2 am_showmonsters=true am_showsecrets=true am_showthingsprites=0 am_showtime=true am_showtotaltime=false am_showtriggerlines=0 am_specialwallcolor=ff ff ff am_textured=false am_thingcolor=fc fc fc am_thingcolor_citem=fc fc fc am_thingcolor_friend=fc fc fc am_thingcolor_item=fc fc fc am_thingcolor_monster=fc fc fc am_thingcolor_ncmonster=fc fc fc am_thingrenderstyles=true am_tswallcolor=88 88 88 am_unexploredsecretcolor=ff 00 ff am_wallcolor=2c 18 08 am_xhaircolor=80 80 80 am_yourcolor=fc e8 d8 blood_fade_scalar=1 chat_substitution=false chatmacro0=No chatmacro1=I'm ready to kick butt! chatmacro2=I'm OK. chatmacro3=I'm not looking too good! chatmacro4=Help! chatmacro5=You suck! chatmacro6=Next time, scumbag... chatmacro7=Come here! chatmacro8=I'll take care of it. chatmacro9=Yes cl_bbannounce=false cl_bloodsplats=true cl_bloodtype=0 cl_custominvulmapcolor1=00 00 1a cl_custominvulmapcolor2=a6 a6 7a cl_customizeinvulmap=false cl_doautoaim=false cl_maxdecals=1024 cl_missiledecals=true cl_pufftype=0 cl_rockettrails=1 cl_showmultikills=true cl_showsecretmessage=true cl_showsprees=true cl_spreaddecals=true compatmode=0 con_alpha=0.75 con_centernotify=false con_midtime=3 con_notablist=false con_notifytime=3 con_scale=0 con_scaletext=0 crosshair=0 crosshaircolor=ff 00 00 crosshairforce=false crosshairgrow=false crosshairhealth=1 crosshairon=true crosshairscale=1 dehload=0 dimamount=-1 dimcolor=ff d7 00 displaynametags=0 dlg_musicvolume=1 gl_aalines=false gl_bandedswlight=false gl_bloom=false gl_bloom_amount=1.399999976158142 gl_bloom_kernel_size=7 gl_brightfog=false gl_enhanced_nightvision=false gl_exposure_base=0.3499999940395355 gl_exposure_min=0.3499999940395355 gl_exposure_scale=1.2999999523162842 gl_exposure_speed=0.05000000074505806 gl_fogmode=1 gl_fuzztype=6 gl_interpolate_model_frames=true gl_light_models=true gl_lightadditivesurfaces=false gl_lightmode=8 gl_menu_blur=-1 gl_paltonemap_powtable=2 gl_paltonemap_reverselookup=true gl_precache=false gl_scale_viewport=true gl_sclipfactor=1.7999999523162842 gl_sclipthreshold=10 gl_spriteclip=1 gl_texture_usehires=true gl_tonemap=0 gl_weaponlight=8 hud_althud=false hud_althud_forceinternal=false hud_althudscale=0 hud_ammo_order=0 hud_ammo_red=25 hud_ammo_yellow=50 hud_armor_green=100 hud_armor_red=25 hud_armor_yellow=50 hud_aspectscale=false hud_berserk_health=true hud_health_green=100 hud_health_red=25 hud_health_yellow=50 hud_scale=0 hud_showammo=2 hud_showangles=false hud_showitems=false hud_showlag=0 hud_showmonsters=true hud_showscore=false hud_showsecrets=true hud_showstats=false hud_showtime=0 hud_showweapons=true hud_timecolor=5 hudcolor_ltim=8 hudcolor_statnames=6 hudcolor_stats=3 hudcolor_time=6 hudcolor_titl=10 hudcolor_ttim=5 hudcolor_xyco=3 lookspring=true m_quickexit=false menu_screenratios=-1 msg=0 msg0color=6 msg1color=5 msg2color=2 msg3color=3 msg4color=3 msgmidcolor=5 msgmidcolor2=4 nametagcolor=5 nocheats=false os_isanyof=true paletteflash=0 pickup_fade_scalar=1 r_deathcamera=false r_drawfuzz=1 r_highlight_portals=false r_maxparticles=4000 r_portal_recursions=4 r_rail_smartspiral=false r_rail_spiralsparsity=1 r_rail_trailsparsity=1 r_shadercolormaps=true r_skymode=2 r_vanillatrans=0 sb_cooperative_enable=true sb_cooperative_headingcolor=6 sb_cooperative_otherplayercolor=2 sb_cooperative_yourplayercolor=3 sb_deathmatch_enable=true sb_deathmatch_headingcolor=6 sb_deathmatch_otherplayercolor=2 sb_deathmatch_yourplayercolor=3 sb_teamdeathmatch_enable=true sb_teamdeathmatch_headingcolor=6 screenblocks=10 show_obituaries=true snd_menuvolume=0.6000000238418579 snd_pitched=false st_oldouch=false st_scale=-1 transsouls=0.75 uiscale=0 underwater_fade_scalar=1 vid_cursor=- vid_nopalsubstitutions=false wi_percents=true wi_showtotaltime=true wipetype=1 [UrbanBrawl.LocalServerInfo] compatflags=0 compatflags2=0 forcewater=false maxviewpitch=90 sv_corpsequeuesize=64 sv_disableautohealth=false sv_dropstyle=0 sv_portal_recursions=4 sv_smartaim=0 [UrbanBrawl.ConfigOnlyVariables] [UrbanBrawl.UnknownConsoleVariables] [UrbanBrawl.ConsoleAliases] [UrbanBrawl.spdivk_keysection.Bindings] Z=ad2_drop [UrbanBrawl.spdivk_keysection.DoubleBindings] [UrbanBrawl.Bindings] 1=slot 1 2=slot 2 3=slot 3 4=slot 4 5=slot 5 6=slot 6 7=slot 7 8=slot 8 9=slot 9 0=slot 0 -=sizedown Equals=sizeup Tab=togglemap W=+forward E=+jump T=messagemode LeftBracket=invprev RightBracket=invnext A=+moveleft S=+back D=+moveright `=toggleconsole Shift=+speed \=+showscores X=crouch Space=+use CapsLock=toggle cl_run F1=menu_help F2=menu_save F3=menu_load F4=menu_options F5=menu_display F6=quicksave F7=menu_endgame F8=togglemessages F9=quickload F10=menu_quit F11=bumpgamma F12=spynext SysRq=screenshot Pause=pause Home=land PgUp=+moveup End=centerview PgDn=+lookup Ins=+movedown Del=+lookdown Mouse1=+attack Mouse2=+altattack Mouse3=invuse MWheelUp=weapprev MWheelDown=weapnext MWheelRight=invnext MWheelLeft=invprev DPadUp=togglemap DPadDown=invuse DPadLeft=invprev DPadRight=invnext Pad_Start=pause Pad_Back=menu_main LThumb=crouch LShoulder=weapprev RShoulder=weapnext LTrigger=+altattack RTrigger=+attack Pad_A=+use Pad_Y=+jump [UrbanBrawl.DoubleBindings] [UrbanBrawl.AutomapBindings] 0=am_gobig -=+am_zoomout Equals=+am_zoomin P=am_toggletexture F=am_togglefollow G=am_togglegrid C=am_clearmarks M=am_setmark KP-=+am_zoomout KP+=+am_zoomin UpArrow=+am_panup LeftArrow=+am_panleft RightArrow=+am_panright DownArrow=+am_pandown MWheelUp=am_zoom 1.2 MWheelDown=am_zoom -1.2 [Chex.Player] autoaim=35 classicflight=false color=40 cf 00 colorset=0 fov=90 gender=male movebob=0.25 name=Player neverswitchonpickup=false playerclass=Fighter skin=base stillbob=0 team=255 wbobfire=0 wbobspeed=1 wi_noautostartmap=false [Chex.ConsoleVariables] addrocketexplosion=false allcheats=false am_backcolor=6c 54 40 am_cdwallcolor=4c 38 20 am_colorset=0 am_customcolors=true am_drawmapback=1 am_efwallcolor=66 55 55 am_emptyspacemargin=0 am_fdwallcolor=88 70 58 am_followplayer=true am_gridcolor=8b 5a 2b am_interlevelcolor=ff 00 00 am_intralevelcolor=00 00 ff am_lockedcolor=00 78 00 am_map_secrets=1 am_markcolor=2 am_markfont=AMMNUMx am_notseencolor=6c 6c 6c am_ovcdwallcolor=00 88 44 am_ovefwallcolor=00 88 44 am_overlay=0 am_ovfdwallcolor=00 88 44 am_ovinterlevelcolor=ff ff 00 am_ovlockedcolor=00 88 44 am_ovotherwallscolor=00 88 44 am_ovportalcolor=00 40 22 am_ovsecretsectorcolor=00 ff ff am_ovsecretwallcolor=00 88 44 am_ovspecialwallcolor=ff ff ff am_ovtelecolor=ff ff 00 am_ovthingcolor=e8 88 00 am_ovthingcolor_citem=e8 88 00 am_ovthingcolor_friend=e8 88 00 am_ovthingcolor_item=e8 88 00 am_ovthingcolor_monster=e8 88 00 am_ovthingcolor_ncmonster=e8 88 00 am_ovunexploredsecretcolor=00 ff ff am_ovunseencolor=00 22 6e am_ovwallcolor=00 ff 00 am_ovyourcolor=fc e8 d8 am_portalcolor=40 40 40 am_portaloverlay=true am_rotate=0 am_secretsectorcolor=ff 00 ff am_secretwallcolor=00 00 00 am_showitems=false am_showkeys=true am_showkeys_always=false am_showmaplabel=2 am_showmonsters=true am_showsecrets=true am_showthingsprites=0 am_showtime=true am_showtotaltime=false am_showtriggerlines=0 am_specialwallcolor=ff ff ff am_textured=false am_thingcolor=fc fc fc am_thingcolor_citem=fc fc fc am_thingcolor_friend=fc fc fc am_thingcolor_item=fc fc fc am_thingcolor_monster=fc fc fc am_thingcolor_ncmonster=fc fc fc am_thingrenderstyles=true am_tswallcolor=88 88 88 am_unexploredsecretcolor=ff 00 ff am_wallcolor=2c 18 08 am_xhaircolor=80 80 80 am_yourcolor=fc e8 d8 blood_fade_scalar=1 chat_substitution=false chatmacro0=No chatmacro1=I'm ready to kick butt! chatmacro2=I'm OK. chatmacro3=I'm not looking too good! chatmacro4=Help! chatmacro5=You suck! chatmacro6=Next time, scumbag... chatmacro7=Come here! chatmacro8=I'll take care of it. chatmacro9=Yes cl_bbannounce=false cl_bloodsplats=true cl_bloodtype=0 cl_custominvulmapcolor1=00 00 1a cl_custominvulmapcolor2=a6 a6 7a cl_customizeinvulmap=false cl_doautoaim=false cl_maxdecals=1024 cl_missiledecals=true cl_pufftype=0 cl_rockettrails=1 cl_showmultikills=true cl_showsecretmessage=true cl_showsprees=true cl_spreaddecals=true compatmode=0 con_alpha=0.75 con_centernotify=false con_midtime=3 con_notablist=false con_notifytime=3 con_scale=0 con_scaletext=0 crosshair=0 crosshaircolor=ff 00 00 crosshairforce=false crosshairgrow=false crosshairhealth=1 crosshairon=true crosshairscale=1 dehload=0 dimamount=-1 dimcolor=ff d7 00 displaynametags=0 dlg_musicvolume=1 gl_aalines=false gl_bandedswlight=false gl_bloom=false gl_bloom_amount=1.399999976158142 gl_bloom_kernel_size=7 gl_brightfog=false gl_enhanced_nightvision=false gl_exposure_base=0.3499999940395355 gl_exposure_min=0.3499999940395355 gl_exposure_scale=1.2999999523162842 gl_exposure_speed=0.05000000074505806 gl_fogmode=1 gl_fuzztype=6 gl_interpolate_model_frames=true gl_light_models=true gl_lightadditivesurfaces=false gl_lightmode=3 gl_menu_blur=-1 gl_paltonemap_powtable=2 gl_paltonemap_reverselookup=true gl_precache=false gl_scale_viewport=true gl_sclipfactor=1.7999999523162842 gl_sclipthreshold=10 gl_spriteclip=1 gl_texture_usehires=true gl_tonemap=0 gl_weaponlight=8 hud_althud=false hud_althud_forceinternal=false hud_althudscale=0 hud_ammo_order=0 hud_ammo_red=25 hud_ammo_yellow=50 hud_armor_green=100 hud_armor_red=25 hud_armor_yellow=50 hud_aspectscale=false hud_berserk_health=true hud_health_green=100 hud_health_red=25 hud_health_yellow=50 hud_scale=0 hud_showammo=2 hud_showangles=false hud_showitems=false hud_showlag=0 hud_showmonsters=true hud_showscore=false hud_showsecrets=true hud_showstats=false hud_showtime=0 hud_showweapons=true hud_timecolor=5 hudcolor_ltim=8 hudcolor_statnames=6 hudcolor_stats=3 hudcolor_time=6 hudcolor_titl=10 hudcolor_ttim=5 hudcolor_xyco=3 lookspring=true m_quickexit=true menu_screenratios=-1 msg=0 msg0color=6 msg1color=5 msg2color=2 msg3color=3 msg4color=3 msgmidcolor=5 msgmidcolor2=4 nametagcolor=5 nocheats=false os_isanyof=true paletteflash=0 pickup_fade_scalar=1 r_deathcamera=false r_drawfuzz=1 r_highlight_portals=false r_maxparticles=4000 r_portal_recursions=4 r_rail_smartspiral=false r_rail_spiralsparsity=1 r_rail_trailsparsity=1 r_shadercolormaps=true r_skymode=2 r_vanillatrans=0 sb_cooperative_enable=true sb_cooperative_headingcolor=6 sb_cooperative_otherplayercolor=2 sb_cooperative_yourplayercolor=3 sb_deathmatch_enable=true sb_deathmatch_headingcolor=6 sb_deathmatch_otherplayercolor=2 sb_deathmatch_yourplayercolor=3 sb_teamdeathmatch_enable=true sb_teamdeathmatch_headingcolor=6 screenblocks=11 setslotstrict=true show_obituaries=true snd_menuvolume=0.3999999761581421 snd_pitched=false st_oldouch=false st_scale=-1 transsouls=0.75 uiscale=0 underwater_fade_scalar=1 vid_cursor=- vid_nopalsubstitutions=false wi_percents=true wi_showtotaltime=true wipetype=1 [Chex.LocalServerInfo] compatflags=0 compatflags2=0 forcewater=false maxviewpitch=90 sv_alwaystally=0 sv_corpsequeuesize=64 sv_disableautohealth=false sv_dropstyle=0 sv_portal_recursions=4 sv_smartaim=0 [Chex.ConfigOnlyVariables] [Chex.UnknownConsoleVariables] [Chex.ConsoleAliases] [Chex.Bindings] 1=slot 1 2=slot 2 3=slot 3 4=slot 4 5=slot 5 6=slot 6 7=slot 7 8=slot 8 9=slot 9 0=slot 0 T=messagemode `=toggleconsole Joy1=invuse Joy2=+use Joy3=+jump Joy4=invnext Joy5=+speed Joy6=+attack Joy7=menu_main Joy8=togglemap Joy9=toggle cl_run Joy10=centerview Joy11=weapprev Joy12=weapnext Joy14=showpop 3 Joy15=showpop 2 Joy16=showpop 1 POV1Up=+forward POV1Right=+moveright POV1Down=+back POV1Left=+moveleft [Chex.DoubleBindings] [Chex.AutomapBindings] 0=am_gobig -=+am_zoomout Equals=+am_zoomin P=am_toggletexture F=am_togglefollow G=am_togglegrid C=am_clearmarks M=am_setmark KP-=+am_zoomout KP+=+am_zoomin UpArrow=+am_panup LeftArrow=+am_panleft RightArrow=+am_panright DownArrow=+am_pandown MWheelUp=am_zoom 1.2 MWheelDown=am_zoom -1.2 [Hexen.Player.Mod] WoC_AutoPetLeash=true WoC_Dam_fontclass=DamNumFontGameDefault WoC_Dam_physics=0 WoC_Dam_translation=DamDefault WoC_Dam_usetypes=true WoC_DamageIndicator=true WoC_EnemyFloatingHealthBar=true WoC_EnemyHealthBar=true WoC_FloatingHealthBar=true WoC_GoreLevel=0 WoC_HPBars_FullBright=false WoC_HPBars_Offset=0.10000000149011612 WoC_HPBars_RenderStyle=true WoC_HPBars_Scale=0.30000001192092896 WoC_MajorPotion=0.6600000262260437 WoC_MinorPotion=1 WoC_MysticUrn=0.25 WoC_NormalPotion=0.75 WoC_PlayerDamageDisplay=true WoC_RandomSkills=false WoC_RandomStats=false WoC_SupremePotion=0.5 [Hexen.LocalServerInfo.Mod] WoC_AgilitySpeedMult=1 WoC_Dam_enabled=true WoC_Dam_shootable=false WoC_Dam_spray=0 WoC_Director=false WoC_DisableAwards=false WoC_DisableKillingSpree=false WoC_ExpDeath=1 WoC_ExpDeathAmount=33 WoC_ExpMult=100 WoC_GoldDeath=true WoC_GoldDeathAmount=50 WoC_HPBars_Enable=true WoC_MaxJump=12 WoC_MaxLevel=160 WoC_MaxSpeed=200 WoC_MinLevel=1 WoC_ServerDisableHealthBar=false WoC_SetMonstersOnce=true WoC_SpeedMult=1 WoC_WeaponStart=false [Hexen.ConfigOnlyVariables.Mod] [Hexen.WOCKeysection.Bindings] Joy16=viewStats Joy2=abil1 Joy13=abil2 Joy14=abil3 Joy15=abil4 [Hexen.WOCKeysection.DoubleBindings] [Hexen.woc_weaponsection.Bindings] [Hexen.woc_weaponsection.DoubleBindings] [Hexen.woc_artifacts.Bindings] [Hexen.woc_artifacts.DoubleBindings] [Hexen.woc_flasks.Bindings] [Hexen.woc_flasks.DoubleBindings] [Heretic.Player] autoaim=35 classicflight=false color=3f 60 40 colorset=0 fov=90 gender=male movebob=0.25 name=Player neverswitchonpickup=false playerclass=Fighter skin=base stillbob=0 team=255 wbobfire=0 wbobspeed=1 wi_noautostartmap=false [Heretic.ConsoleVariables] addrocketexplosion=false allcheats=false am_backcolor=6c 54 40 am_cdwallcolor=73 43 23 am_colorset=0 am_customcolors=true am_drawmapback=1 am_efwallcolor=66 55 55 am_emptyspacemargin=0 am_fdwallcolor=d0 b0 85 am_followplayer=true am_gridcolor=8b 5a 2b am_interlevelcolor=ff 00 00 am_intralevelcolor=00 00 ff am_lockedcolor=00 78 00 am_map_secrets=1 am_markcolor=2 am_markfont=AMMNUMx am_notseencolor=6c 6c 6c am_ovcdwallcolor=00 88 44 am_ovefwallcolor=00 88 44 am_overlay=0 am_ovfdwallcolor=00 88 44 am_ovinterlevelcolor=ff ff 00 am_ovlockedcolor=00 88 44 am_ovotherwallscolor=00 88 44 am_ovportalcolor=00 40 22 am_ovsecretsectorcolor=00 ff ff am_ovsecretwallcolor=00 88 44 am_ovspecialwallcolor=ff ff ff am_ovtelecolor=ff ff 00 am_ovthingcolor=e8 88 00 am_ovthingcolor_citem=e8 88 00 am_ovthingcolor_friend=e8 88 00 am_ovthingcolor_item=e8 88 00 am_ovthingcolor_monster=e8 88 00 am_ovthingcolor_ncmonster=e8 88 00 am_ovunexploredsecretcolor=00 ff ff am_ovunseencolor=00 22 6e am_ovwallcolor=00 ff 00 am_ovyourcolor=fc e8 d8 am_portalcolor=40 40 40 am_portaloverlay=true am_rotate=0 am_secretsectorcolor=ff 00 ff am_secretwallcolor=00 00 00 am_showitems=false am_showkeys=true am_showkeys_always=false am_showmaplabel=2 am_showmonsters=true am_showsecrets=true am_showthingsprites=0 am_showtime=true am_showtotaltime=false am_showtriggerlines=0 am_specialwallcolor=ff ff ff am_textured=false am_thingcolor=fc fc fc am_thingcolor_citem=fc fc fc am_thingcolor_friend=fc fc fc am_thingcolor_item=fc fc fc am_thingcolor_monster=fc fc fc am_thingcolor_ncmonster=fc fc fc am_thingrenderstyles=true am_tswallcolor=88 88 88 am_unexploredsecretcolor=ff 00 ff am_wallcolor=54 3b 17 am_xhaircolor=80 80 80 am_yourcolor=fc e8 d8 blood_fade_scalar=1 chat_substitution=false chatmacro0=No chatmacro1=I'm ready to kick butt! chatmacro2=I'm OK. chatmacro3=I'm not looking too good! chatmacro4=Help! chatmacro5=You suck! chatmacro6=Next time, scumbag... chatmacro7=Come here! chatmacro8=I'll take care of it. chatmacro9=Yes cl_bbannounce=false cl_bloodsplats=true cl_bloodtype=1 cl_custominvulmapcolor1=00 00 1a cl_custominvulmapcolor2=a6 a6 7a cl_customizeinvulmap=false cl_doautoaim=false cl_maxdecals=1024 cl_missiledecals=true cl_pufftype=2 cl_rockettrails=3 cl_showmultikills=true cl_showsecretmessage=true cl_showsprees=true cl_spreaddecals=true compatmode=0 con_alpha=0.75 con_centernotify=true con_midtime=3 con_notablist=false con_notifytime=3 con_scale=0 con_scaletext=0 crosshair=0 crosshaircolor=ff 00 00 crosshairforce=false crosshairgrow=false crosshairhealth=1 crosshairon=true crosshairscale=1 dehload=0 dimamount=-1 dimcolor=ff d7 00 displaynametags=0 dlg_musicvolume=1 gl_aalines=false gl_bandedswlight=false gl_bloom=false gl_bloom_amount=1.399999976158142 gl_bloom_kernel_size=7 gl_brightfog=false gl_enhanced_nightvision=false gl_exposure_base=0.3499999940395355 gl_exposure_min=0.3499999940395355 gl_exposure_scale=1.2999999523162842 gl_exposure_speed=0.05000000074505806 gl_fogmode=1 gl_fuzztype=6 gl_interpolate_model_frames=true gl_light_models=true gl_lightadditivesurfaces=false gl_lightmode=3 gl_menu_blur=-1 gl_paltonemap_powtable=2 gl_paltonemap_reverselookup=true gl_precache=false gl_scale_viewport=true gl_sclipfactor=1.7999999523162842 gl_sclipthreshold=10 gl_spriteclip=1 gl_texture_usehires=true gl_tonemap=0 gl_weaponlight=8 hud_althud=false hud_althud_forceinternal=false hud_althudscale=0 hud_ammo_order=0 hud_ammo_red=25 hud_ammo_yellow=50 hud_armor_green=100 hud_armor_red=25 hud_armor_yellow=50 hud_aspectscale=false hud_berserk_health=true hud_health_green=100 hud_health_red=25 hud_health_yellow=50 hud_scale=0 hud_showammo=2 hud_showangles=false hud_showitems=false hud_showlag=0 hud_showmonsters=true hud_showscore=false hud_showsecrets=true hud_showstats=false hud_showtime=0 hud_showweapons=true hud_timecolor=5 hudcolor_ltim=8 hudcolor_statnames=6 hudcolor_stats=3 hudcolor_time=6 hudcolor_titl=10 hudcolor_ttim=5 hudcolor_xyco=3 lookspring=true m_quickexit=false menu_screenratios=-1 msg=0 msg0color=9 msg1color=5 msg2color=2 msg3color=3 msg4color=3 msgmidcolor=9 msgmidcolor2=10 nametagcolor=5 nocheats=false os_isanyof=true paletteflash=0 pickup_fade_scalar=1 r_deathcamera=true r_drawfuzz=1 r_highlight_portals=false r_maxparticles=4000 r_portal_recursions=4 r_rail_smartspiral=false r_rail_spiralsparsity=1 r_rail_trailsparsity=1 r_shadercolormaps=true r_skymode=2 r_vanillatrans=0 sb_cooperative_enable=true sb_cooperative_headingcolor=6 sb_cooperative_otherplayercolor=2 sb_cooperative_yourplayercolor=3 sb_deathmatch_enable=true sb_deathmatch_headingcolor=6 sb_deathmatch_otherplayercolor=2 sb_deathmatch_yourplayercolor=3 sb_teamdeathmatch_enable=true sb_teamdeathmatch_headingcolor=6 screenblocks=11 setslotstrict=true show_obituaries=true snd_menuvolume=0.6000000238418579 snd_pitched=true st_oldouch=false st_scale=-1 transsouls=0.75 uiscale=0 underwater_fade_scalar=1 vid_cursor=- vid_nopalsubstitutions=false wi_percents=false wi_showtotaltime=true wipetype=1 [Heretic.LocalServerInfo] compatflags=0 compatflags2=0 forcewater=false maxviewpitch=90 sv_alwaystally=0 sv_corpsequeuesize=64 sv_disableautohealth=false sv_dropstyle=0 sv_portal_recursions=4 sv_smartaim=0 [Heretic.ConfigOnlyVariables] [Heretic.UnknownConsoleVariables] [Heretic.ConsoleAliases] [Heretic.Bindings] 1=slot 1 2=slot 2 3=slot 3 4=slot 4 5=slot 5 6=slot 6 7=slot 7 8=slot 8 9=slot 9 0=slot 0 Backspace=use ArtiTomeOfPower T=messagemode `=toggleconsole Joy1=invuse Joy2=+use Joy3=+jump Joy4=invnext Joy5=+speed Joy6=+attack Joy7=menu_main Joy8=togglemap Joy9=toggle cl_run Joy10=centerview Joy11=weapprev Joy12=weapnext Joy14=showpop 3 Joy15=showpop 2 Joy16=showpop 1 POV1Up=+forward POV1Right=+moveright POV1Down=+back POV1Left=+moveleft [Heretic.DoubleBindings] [Heretic.AutomapBindings] 0=am_gobig -=+am_zoomout Equals=+am_zoomin P=am_toggletexture F=am_togglefollow G=am_togglegrid C=am_clearmarks M=am_setmark KP-=+am_zoomout KP+=+am_zoomin UpArrow=+am_panup LeftArrow=+am_panleft RightArrow=+am_panright DownArrow=+am_pandown MWheelUp=am_zoom 1.2 MWheelDown=am_zoom -1.2 [Doom.SteveFlashlightKeySection.Bindings] F=toggleflashlight_bind [Doom.SteveFlashlightKeySection.DoubleBindings] [Doom.options.Bindings] Y=rdrone Z=tflare T=pturret Mouse3=isight M=MusicPlay B=MuteTracker P=rain K=death [Doom.options.DoubleBindings] [Doom.BrutalDoomActions.Bindings] Q=kickem R=reload F=flashlightswitch G=grenadetoss [Doom.BrutalDoomActions.DoubleBindings] [Doom.BrutalDoomInteractions.Bindings] H=brutaltaunt V=wave1 N=wave2 J=advtaunt K=oneliner X=dual O=selectammodrop [Doom.BrutalDoomInteractions.DoubleBindings] [Doom.BrutalDoomAdvMoves.Bindings] [Doom.BrutalDoomAdvMoves.DoubleBindings] [Doom.CODBO_Active.Bindings] B=knife KP8=grenade Joy1=invuse [Doom.CODBO_Active.DoubleBindings] [Doom.CODBO_Advanced.Bindings] M=Scopeselection P=WeaponLookselection [Doom.CODBO_Advanced.DoubleBindings] [Doom.CODBO_EQ.Bindings] KP1=use Medicalkit_COD KP2=use TacticalInsertion KP3=use BeaconHand KP4=use ClaymoreHand KP5=use C4Hand [Doom.CODBO_EQ.DoubleBindings] ================================================ FILE: packages/sx05re/emuelec-ports/lzdoom/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="lzdoom" PKG_VERSION="a9baed86e5226ff4511fa54ca50af5f1e283eb6e" # version 3.88b PKG_LICENSE="GPL" PKG_SITE="https://github.com/drfrag666/gzdoom" PKG_GIT_CLONE_BRANCH="g3.3mgw" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 lzdoom:host" PKG_SHORTDESC="LZDoom" PKG_LONGDESC="ZDoom is a family of enhanced ports of the Doom engine for running on modern operating systems. It runs on Windows, Linux, and OS X, and adds new features not found in the games as originally published by id Software." GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="cmake-make" PKG_DEPENDS_HOST="toolchain:host SDL2:host" pre_build_host() { HOST_CMAKE_OPTS="" } make_host() { cmake . -DNO_GTK=ON make } makeinstall_host() { : #no } pre_configure_target() { PKG_CMAKE_OPTS_TARGET=" -DNO_GTK=ON \ -DFORCE_CROSSCOMPILE=ON \ -DIMPORT_EXECUTABLES=${PKG_BUILD}/.${HOST_NAME}/ImportExecutables.cmake -DCMAKE_BUILD_TYPE=Release" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cd ${PKG_BUILD} cp .${TARGET_NAME}/lzdoom ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/lzdoom cp ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/lzdoom cp .${TARGET_NAME}/*.pk3 ${INSTALL}/usr/config/emuelec/configs/lzdoom cp -r .${TARGET_NAME}/soundfonts ${INSTALL}/usr/config/emuelec/configs/lzdoom mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emuelec-ports/lzdoom/scripts/lzdoom.sh ================================================ #!/usr/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) . /etc/profile RUN_DIR="/storage/roms/ports/doom" CONFIG_DIR="/emuelec/configs/lzdoom" HOMECONFIG="/storage/.config/lzdoom" if [ /usr/config/emuelec/configs/lzdoom/lzdoom.pk3 -nt ${CONFIG_DIR}/lzdoom.pk3 ]; then cp /usr/config/emuelec/configs/lzdoom/*.pk3 ${CONFIG_DIR} fi if [ ! -L "${HOMECONFIG}" ]; then [[ -d "${HOMECONFIG}" ]] && rm -rf "${HOMECONFIG}" ln -sf "${CONFIG_DIR}" "${HOMECONFIG}" fi params=" -savedir ${CONFIG_DIR}" # EXT can be wad, WAD, iwad, IWAD, pwad, PWAD or doom EXT=${1#*.} # If its not a simple wad (extension .choco) read the file and parse the data if [ "${EXT}" == "doom" ]; then while IFS== read -r key value; do if [ "${key}" == "SUBDIR" ]; then RUN_DIR="/storage/roms/ports/doom/${value}" fi if [ "${key}" == "PARAMS" ]; then params+=" ${value}" fi done < <(<"${1}" tr -d '\r'; echo;) else params+=" -iwad ${1}" fi cd "${RUN_DIR}" # Do not overwrite log messages already written by emuelecRunEmu.sh /usr/bin/lzdoom ${params} >>/emuelec/logs/emuelec.log 2>&1 ================================================ FILE: packages/sx05re/emuelec-ports/openjazz/package.mk ================================================ PKG_NAME="openjazz" PKG_VERSION="a34e79dba5756000ad3796efae61a57be4a46496" PKG_SHA256="fe76aca99a319ee70c1eaeec17a935880c7a73f02e42ac1917e581062ea38e67" PKG_ARCH="aarch64" PKG_LICENSE="GPL-2.0-or-later" PKG_SITE="http://www.alister.eu/jazz/oj/" PKG_URL="https://github.com/sana2dang/openjazz/archive/${PKG_VERSION}.tar.gz" PKG_SHORTDESC="OpenJazz for OGA" PKG_LONGDESC="a free, open-source version of the classic Jazz Jackrabbit™ games." PKG_DEPENDS_TARGET="toolchain SDL2" PKG_TOOLCHAIN="auto" pre_configure_target() { sed -i "s|sdl2-config|${SYSROOT_PREFIX}/usr/bin/sdl2-config|g" Makefile } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/OpenJazz ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emuelec-ports/opentyrian/config/opentyrian.cfg ================================================ section 'joystick' 'odroidgo2_joypad_v11' item 'analog' 'yes' item 'sensitivity' '5' item 'threshold' '5' list 'up' 'AX 2-' list 'up' 'BTN 9' list 'right' 'AX 1+' list 'right' 'BTN 12' list 'down' 'AX 2+' list 'down' 'BTN 10' list 'left' 'AX 1-' list 'left' 'BTN 11' list 'fire' 'BTN 1' list 'change fire' 'BTN 2' list 'left sidekick' 'BTN 3' list 'right sidekick' 'BTN 4' list 'menu' 'BTN 5' list 'pause' 'BTN 6' section 'joystick' 'odroidgo2_joypad' item 'analog' 'yes' item 'sensitivity' '5' item 'threshold' '5' list 'up' 'AX 2-' list 'up' 'BTN 9' list 'right' 'AX 1+' list 'right' 'BTN 12' list 'down' 'AX 2+' list 'down' 'BTN 10' list 'left' 'AX 1-' list 'left' 'BTN 11' list 'fire' 'BTN 1' list 'change fire' 'BTN 2' list 'left sidekick' 'BTN 3' list 'right sidekick' 'BTN 4' list 'menu' 'BTN 5' list 'pause' 'BTN 6' section 'joystick' 'gameforce_gamepad' item 'analog' 'yes' item 'sensitivity' '5' item 'threshold' '5' list 'up' 'BTN 11' list 'up' 'AX 1-' list 'right' 'AX 2+' list 'right' 'BTN 14' list 'down' 'BTN 12' list 'down' 'AX 1+' list 'left' 'AX 2-' list 'left' 'BTN 13' list 'fire' 'BTN 1' list 'change fire' 'BTN 2' list 'left sidekick' 'BTN 5' list 'right sidekick' 'BTN 6' list 'menu' 'BTN 10' list 'pause' 'BTN 9' section 'video' item 'fullscreen' '0' item 'scaler' 'Scale2x' item 'scaling_mode' 'Fit 4:3' section 'keyboard' item 'up' 'Up' item 'down' 'Down' item 'left' 'Left' item 'right' 'Right' item 'fire' 'Space' item 'change fire' 'Return' item 'left sidekick' 'Left Ctrl' item 'right sidekick' 'Left Alt' ================================================ FILE: packages/sx05re/emuelec-ports/opentyrian/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="opentyrian" PKG_VERSION="9750f8cfab738d0ea08ccb8d8752b95f5c09df07" PKG_SHA256="f9cd08210df3990c0bc3ac9241694bd6c58e0ddec4716b6e74a7cc655637e5a0" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL2" PKG_SITE="https://github.com/opentyrian/opentyrian" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_net" PKG_LONGDESC="An open-source port of the DOS shoot-em-up Tyrian." PKG_TOOLCHAIN="make" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp opentyrian ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/opentyrian cp -r ${PKG_DIR}/config/* ${INSTALL}/usr/config/opentyrian } ================================================ FILE: packages/sx05re/emuelec-ports/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="emuelec-ports" PKG_VERSION="1.0" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain Jinja2:host pyyaml pyyaml:host" PKG_SECTION="emuelec" PKG_SHORTDESC="EmuELEC Ports Meta Package" PKG_TOOLCHAIN="manual" PKG_DEPENDS_TARGET+=" commander-genius \ devilutionX \ sdlpop \ VVVVVV \ opentyrian \ bermuda \ hodesdl \ hydracastlelabyrinth \ eduke \ rigelengine \ sonic2013 \ soniccd \ supertux \ supertuxkart \ chocolate-doom \ lzdoom \ gzdoom \ supermariowar \ bstone \ hurrican \ cdogs-sdl \ abuse \ fheroes2 \ augustus \ xash3d \ sonicmania \ shovelknight \ tmntsr \ falloutce1 \ falloutce2 \ ccleste \ celeste" amlogicports="" hhports=" openjazz" if [ "${DEVICE}" == "Amlogic"* ]; then PKG_DEPENDS_TARGET+="${amlogicports}" fi if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then PKG_DEPENDS_TARGET+="${hhports}" fi make_target() { mkdir -p ${PKG_BUILD}/scripts python3 port_builder.py ports.yaml scripts } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin/ports cp -rf ${PKG_BUILD}/scripts/* ${INSTALL}/usr/bin/ports # Remove duplicate newlines just to be tidy for file in "${INSTALL}/usr/bin/ports/*.sh"; do sed -i '$!N; /^\(.*\)\n\1$/!P; D' ${file} done # Remove empty lines from gamelist.xml sed -i '/^$/d' ${INSTALL}/usr/bin/ports/gamelist.xml } ================================================ FILE: packages/sx05re/emuelec-ports/rigelengine/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Nikolai Wuttke (https://github.com/lethal-guitar) PKG_NAME="rigelengine" PKG_VERSION="f05996f9b3ad3b3ea5bb818e49e7977636746343" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/lethal-guitar/RigelEngine" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_mixer boost" PKG_LONGDESC="A modern re-implementation of the classic DOS game Duke Nukem II" PKG_CMAKE_OPTS_TARGET="-DCMAKE_BUILD_TYPE=Release -DUSE_GL_ES=ON -DWARNINGS_AS_ERRORS=OFF" GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="cmake" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ./src/RigelEngine ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emuelec-ports/sdlpop/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="sdlpop" PKG_VERSION="bb0c6f3da464106b5fc931925fcf338f6c4939b9" PKG_SHA256="e2d7f80397a3f8b730c4255416c43107cd34b59541dd67610597045fbb7d2b6c" PKG_ARCH="any" PKG_LICENSE="GPL3" PKG_SITE="https://github.com/NagyD/SDLPoP" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_image" PKG_SHORTDESC="Prince of Persia SDL" PKG_LONGDESC="An open-source port of Prince of Persia, based on the disassembly of the DOS version." PKG_TOOLCHAIN="make" pre_configure_target() { sed -i "s/start_fullscreen = false/start_fullscreen = true/" "${PKG_BUILD}/SDLPoP.ini" sed -i "s/enable_info_screen = true;/enable_info_screen = false;/" "${PKG_BUILD}/SDLPoP.ini" } make_target() { cd ${PKG_BUILD}/src/ mkdir -p build cd build/ cmake .. make CC=cc } makeinstall_target() { mkdir -p ${INSTALL}/usr/config/emuelec/configs/SDLPoP mkdir -p ${INSTALL}/usr/bin cp -r ${PKG_BUILD}/* ${INSTALL}/usr/config/emuelec/configs/SDLPoP/ mv "${INSTALL}/usr/config/emuelec/configs/SDLPoP/prince" "${INSTALL}/usr/bin/" rm -rf ${INSTALL}/usr/config/emuelec/configs/SDLPoP/src rm -rf ${INSTALL}/usr/config/emuelec/configs/SDLPoP/.gitignore rm -rf ${INSTALL}/usr/config/emuelec/configs/SDLPoP/.editorconfig } ================================================ FILE: packages/sx05re/emuelec-ports/sdlpop/patches/001-addsdlgamecontrollerdb.patch ================================================ --- a/src/seg009.c +++ b/src/seg009.c @@ -801,6 +801,13 @@ if (sdl_controller_ == NULL) { is_joyst_mode = 0; } else { + SDL_GameControllerAddMappingsFromFile("gamecontrollerdb.txt"); //char* output; + //strcpy(output, "/storage/.config/SDL-GameControllerDB/"); + //strcpy(output, "gamecontrollerdb.txt"); + //if (SDL_GameControllerAddMappingsFromFile(output) < 0) + //{ + // printf("gamecontrollerdb.txt not found!\n"); + //} is_joyst_mode = 1; } } ================================================ FILE: packages/sx05re/emuelec-ports/shovelknight/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="shovelknight" PKG_VERSION="1.0" PKG_ARCH="any" PKG_LICENSE="GPL2" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SHORTDESC="Script file to run Shovel Knight" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp shovelknight.sh ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emuelec-ports/shovelknight/sources/shovelknight.sh ================================================ #!/bin/bash cd /storage/roms/ports/shovelknight/64 export LIBGL_NOBANNER=1 export LIBGL_ES=2 export LIBGL_GL=21 export LIBGL_FB=4 export BOX64_LOG=0 export BOX64_LD_LIBRARY_PATH=/emuelec/bin/box64/lib/ export BOX64_DYNAREC=1 export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/emuelec/bin/box64/lib/ fbfix $( emuelec-utils getmainfb ) /emuelec/bin/box64/box64 ShovelKnight ================================================ FILE: packages/sx05re/emuelec-ports/sonic2013/config/settings.ini ================================================ [Dev] DataFile=Data.rsdk [Window] ; Determines if the window will be fullscreen or not FullScreen=true ; Determines if the window will be borderless or not Borderless=false ; Determines if VSync will be active or not VSync=true ; How big the window will be WindowScale=2 ; How wide the base screen will be in pixels ScreenWidth=424 ; Determines the target FPS RefreshRate=60 ================================================ FILE: packages/sx05re/emuelec-ports/sonic2013/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="sonic2013" PKG_VERSION="bff61dff624ee986ace719583b00baab22a40d52" PKG_ARCH="any" PKG_SITE="https://github.com/Rubberduckycooly/Sonic-1-2-2013-Decompilation" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_SHORTDESC="Sonic 1/2 (2013) Decompilation" PKG_TOOLCHAIN="make" PKG_EE_UPDATE="no" pre_configure_target() { # Add missing -lstdc++fs sed -i "s|pthread|pthread -lstdc++fs|" ${PKG_BUILD}/Makefile } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp bin/RSDKv4 ${INSTALL}/usr/bin/sonic2013 mkdir -p ${INSTALL}/usr/config/emuelec/configs/sonic cp ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/sonic } ================================================ FILE: packages/sx05re/emuelec-ports/soniccd/config/settings.ini ================================================ [Dev] ; Enable this flag to activate dev menu via the ESC key DevMenu=true ; Enable this flag to activate features used for debugging the engine (may result in slightly slower game speed) EngineDebugMode=false ; Sets the starting category ID StartingCategory=0 ; Sets the starting scene ID StartingScene=0 ; Determines how fast the game will be when fastforwarding is active FastForwardSpeed=8 ; Determines if the game will try to use the steam directory for the game if it can locate it (windows only) UseSteamDir=true ; Determines if applicable rendering modes (such as 3D floor from special stages) will render in "High Quality" mode or standard mode UseHQModes=true ; Determines what RSDK file will be loaded DataFile=Data.rsdk [Game] ; Sets the game language (0 = EN, 1 = FR, 2 = IT, 3 = DE, 4 = ES, 5 = JP) Language=0 ; Sets the game's spindash style (-1 = let save file decide, 0 = S2, 1 = CD) OriginalControls=-1 ; Determines if the game should hide the touch controls UI DisableTouchControls=false [Window] ; Determines if the window will be fullscreen or not FullScreen=true ; Determines if the window will be borderless or not Borderless=false ; Determines if VSync will be active or not VSync=true ; Determines what scaling is used. 0 is nearest neighbour, 1 is integer scale, 2 is sharp bilinear, and 3 is regular bilinear. ; Note: Not all scaling options work correctly on certain platforms, as they don't support bilinear filtering. ScalingMode=2 ; How big the window will be WindowScale=2 ; How wide the base screen will be in pixels ScreenWidth=424 ; Determines the target FPS RefreshRate=60 ; Determines the dim timer in seconds, set to -1 to disable dimming DimLimit=300 [Audio] BGMVolume=1.000000 SFXVolume=1.000000 [Keyboard 1] ; Keyboard Mappings for P1 (Based on: https://wiki.libsdl.org/SDL_Scancode) Up=82 Down=81 Left=80 Right=79 A=29 B=27 C=6 Start=40 [Controller 1] ; Controller Mappings for P1 (Based on: https://wiki.libsdl.org/SDL_GameControllerButton) ; Extra buttons can be mapped with the following IDs: ; CONTROLLER_BUTTON_ZL = 16 ; CONTROLLER_BUTTON_ZR = 17 ; CONTROLLER_BUTTON_LSTICK_UP = 18 ; CONTROLLER_BUTTON_LSTICK_DOWN = 19 ; CONTROLLER_BUTTON_LSTICK_LEFT = 20 ; CONTROLLER_BUTTON_LSTICK_RIGHT = 21 ; CONTROLLER_BUTTON_RSTICK_UP = 22 ; CONTROLLER_BUTTON_RSTICK_DOWN = 23 ; CONTROLLER_BUTTON_RSTICK_LEFT = 24 ; CONTROLLER_BUTTON_RSTICK_RIGHT = 25 Up=11 Down=12 Left=13 Right=14 A=0 B=1 C=2 Start=6 ; Deadzones, 0.0-1.0 LStickDeadzone=0.300000 RStickDeadzone=0.300000 LTriggerDeadzone=0.300000 RTriggerDeadzone=0.300000 ================================================ FILE: packages/sx05re/emuelec-ports/soniccd/libtheora/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="libtheora" PKG_VERSION="1.1.1" PKG_SHA256="" PKG_ARCH="any" PKG_LICENSE="BSD-3-Clause" PKG_SITE="http://downloads.xiph.org/releases/theora" PKG_URL="${PKG_SITE}/libtheora-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libogg libvorbis" PKG_SHORTDESC="Theora is a free and open video compression format from the Xiph.org Foundation." PKG_TOOLCHAIN="auto" pre_configure_target() { PKG_CONFIGURE_OPTS_TARGET="--disable-oggtest \ --disable-vorbistest \ --disable-sdltest \ --disable-examples \ --disable-spec" } ================================================ FILE: packages/sx05re/emuelec-ports/soniccd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="soniccd" PKG_VERSION="4650327a4959321c8d28b89693abbda41fa69e6e" PKG_ARCH="any" PKG_SITE="https://github.com/Rubberduckycooly/Sonic-CD-11-Decompilation" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 libtheora" PKG_SHORTDESC="A Full Decompilation of Sonic CD 2011" PKG_TOOLCHAIN="cmake" PKG_EE_UPDATE="no" pre_configure_target() { PKG_CMAKE_OPTS_TARGET="-DRETRO_SDL_VERSION=2 -DRETRO_USE_HW_RENDER=OFF" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/.${TARGET_NAME}/RSDKv3 ${INSTALL}/usr/bin/soniccd mkdir -p ${INSTALL}/usr/config/emuelec/configs/sonic cp ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/sonic } ================================================ FILE: packages/sx05re/emuelec-ports/sonicmania/config/Settings.ini ================================================ ; Retro Engine Config File [Game] language=0 devMenu=y username=Emuelec [Video] ; NB: Fullscreen Resolution can be explicitly set with values fsWidth and fsHeight ; If not listed, fullscreen will just use the desktop resolution windowed=n border=n exclusiveFS=y vsync=y tripleBuffering=n winWidth=424 winHeight=240 refreshRate=60 shaderSupport=y screenShader=0 ; Maximum width the screen will be allowed to be. A value of 0 will disable the maximum width maxPixWidth=424 [Audio] streamsEnabled=y streamVolume=1.000000 sfxVolume=1.000000 [Keyboard Map 1] up=0x26 down=0x28 left=0x25 right=0x27 buttonA=0x41 buttonB=0x53 buttonC=0x44 buttonX=0x51 buttonY=0x57 buttonZ=0x45 start=0xd select=0x9 [Keyboard Map 2] up=0x68 down=0x65 left=0x64 right=0x66 buttonA=0x4a buttonB=0x4a buttonC=0x0 buttonX=0x55 buttonY=0x49 buttonZ=0x0 start=0xdb select=0xdd [Keyboard Map 3] up=0x0 down=0x0 left=0x0 right=0x0 buttonA=0x0 buttonB=0x0 buttonC=0x0 buttonX=0x0 buttonY=0x0 buttonZ=0x0 start=0x0 select=0x0 [Keyboard Map 4] up=0x0 down=0x0 left=0x0 right=0x0 buttonA=0x0 buttonB=0x0 buttonC=0x0 buttonX=0x0 buttonY=0x0 buttonZ=0x0 start=0x0 select=0x0 ================================================ FILE: packages/sx05re/emuelec-ports/sonicmania/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="sonicmania" PKG_VERSION="f2120842a15a5721d88907bf98edee670c10f79d" PKG_ARCH="any" PKG_SITE="https://github.com/Rubberduckycooly/Sonic-Mania-Decompilation" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 portaudio" PKG_SHORTDESC="Sonic Mania Decompilation" PKG_TOOLCHAIN="cmake" pre_configure_target() { PKG_CMAKE_OPTS_TARGET="-DRETRO_SUBSYSTEM=SDL2" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin/sonic_mania echo "${PKG_BUILD}" cp ${PKG_BUILD}/.${TARGET_NAME}/dependencies/RSDKv5/RSDKv5U ${INSTALL}/usr/bin/sonicmania cp ${PKG_BUILD}/.${TARGET_NAME}/dependencies/RSDKv5/libGame.so ${INSTALL}/usr/bin/sonic_mania/Game.so mkdir -p ${INSTALL}/usr/config/emuelec/configs/sonicmania cp ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/sonicmania } ================================================ FILE: packages/sx05re/emuelec-ports/sources/gamelist.xml.j2 ================================================ {% for game, data in games %} ./{{ game }}.sh {{ game }} {{ data.description }} ./images/screenshots/{{ game | lower | replace(' ', '_') | replace('.', '_') }}-screenshot.jpg ./images/icons/{{ game | lower | replace(' ', '_') | replace('.', '_') }}-icon.png ./images/logos/{{ game | lower | replace(' ', '_') | replace('.', '_') }}-logo.png {{ data.rating }} {{ data.release_date }} {{ data.developer }} {{ data.publisher }} {% endfor %} ================================================ FILE: packages/sx05re/emuelec-ports/sources/port.sh.j2 ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile {% if data.init_port %} PORT="{{ data.port_exe }}" # init_port binary audio(alsa. pulseaudio, default) init_port "${PORT}" "{{ data.audio }}" "{{ data.killsignal }}" "{{ data.vkb }}" {% endif %} {% for command in data.commands %} {{ command }} {% endfor %} ret_error=$? {% for command in data.commands_end %} {{ command }} {% endfor %} {% if data.check_bios %} [[ "$ret_error" != 0 ]] && ee_check_bios "{{ data.check_bios }}" {% endif %} {% if data.init_port %} end_port {% endif %} exit $ret_error ================================================ FILE: packages/sx05re/emuelec-ports/sources/port_builder.py ================================================ #!/usr/bin/env python import jinja2 import yaml from os import environ, getcwd, path from sys import argv def meets_requirements(data): if not "requires" in data: # No specific requirements return True for supported_setup in data["requires"]: acceptable = True for key, value in supported_setup.items(): if environ.get(key) != value: acceptable = False break if acceptable: return True return False yaml_file = argv[1] try: output_location = argv[2] except IndexError: output_location = getcwd() templateLoader = jinja2.FileSystemLoader(searchpath=".") templateEnv = jinja2.Environment(loader=templateLoader) port_template = templateEnv.get_template("port.sh.j2") gamelist_template = templateEnv.get_template("gamelist.xml.j2") with open(yaml_file) as ports_file: ports = yaml.load(ports_file, Loader=yaml.SafeLoader) supported_ports = [port for port in ports.items() if meets_requirements(port[1])] for name, data in supported_ports: # Create port script with open(path.join(output_location, "{}.sh".format(name)), "w") as port_file: port_file.write(port_template.render(name=name, data=data)) ports_file.close() # Create gamelist.xml with open(path.join(output_location, "gamelist.xml"), "w") as gamelist_file: gamelist_file.write(gamelist_template.render(games=supported_ports)) gamelist_file.close() ================================================ FILE: packages/sx05re/emuelec-ports/sources/ports.yaml ================================================ 2048: description: 2048 is a single-player sliding block puzzle game designed by Italian web developer Gabriele Cirulli. The game's objective is to slide numbered tiles on a grid to combine them to create a tile with the number 2048. However, one can continue to play the game after reaching the goal, creating tiles with larger numbers. rating: 1.0 release_date: 20100111T000000 developer: Gabriele Cirulli - Higor Euripedes publisher: Public Domain commands: - /usr/bin/emuelecRunEmu.sh "" -Pports "${2}" -C2048 "-SC${0}" Abuse: description: Abuse is a dark 2D side-scrolling platform game developed by Crack dot Com in 1995. It features beautiful lighting, realistic animation and nasty alien-like creatures to destroy. It is now maintained by Sam Hocevar in an attempt to prevent it from vanishing from the Internet. rating: 1.0 release_date: 1995 developer: Crack dot Com publisher: Crack dot Com init_port: true port_exe: "abuse" vkb: "abuse" audio: "alsa" commands: - abuse >> $EE_LOG 2>&1 Bermuda Syndrome: description: Bermuda Syndrome is a PC game developed by Century Interactive and published by BMG Interactive in 1995. The game is similar in gameplay and appearance to the classic Flashback from 1992. The player controls the main character from a third person sidescrolling perspective. rating: 1.0 release_date: 19950129T000000 developer: Century Interactive publisher: BMG Interactive init_port: true port_exe: "bs" audio: "alsa" commands: - cd /storage/roms/ports/bermuda/ - ${PORT} --datapath=/storage/roms/ports/bermuda/ --fullscreen --widescreen=4:3 >> $EE_LOG 2>&1 Blake Stone: description: "Blake Stone: Aliens of Gold is a first-person shooter for DOS created by JAM Productions and published by Apogee Software in 1993." rating: 1.0 release_date: 1993 developer: Apogee publisher: Apogee init_port: true port_exe: "bstone" audio: "alsa" commands: - bstone.sh >> $EE_LOG 2>&1 Blake Stone Planet Strike: description: "Blake Stone: Planet Strike is a first-person shooter video game, the sequel to Blake Stone: Aliens of Gold, made by JAM Productions and released for DOS on October 28, 1994, by Apogee Software." rating: 1.0 release_date: 1994 developer: Apogee publisher: Apogee init_port: true port_exe: "bstone" audio: "alsa" commands: - bstone.sh ps >> $EE_LOG 2>&1 Cannonball: description: "This is an arcade-perfect port of SEGA's seminal arcade racer. Features include: Pixel-perfect 240p video. 60 FPS gameplay. Continuous mode (play all 15 tracks in one go)." rating: 0.8 release_date: 20140101T000000 developer: Chris White, Yu Suzuki publisher: non-commercial check_bios: Cannonball commands: - /usr/bin/emuelecRunEmu.sh "/storage/roms/ports/cannonball/" -Pports "${2}" -Ccannonball "-SC${0}" Cave Story: description: A platform-adventure video game released in 2004 for Windows PCs. It was developed over five years by Japanese developer Daisuke "Pixel" Amaya in his free time. Cave Story features 2D platform mechanics. rating: 0.9 release_date: 20041220T000000 developer: Studio Pixel publisher: GPLv3 check_bios: CaveStory commands: - /usr/bin/emuelecRunEmu.sh "/storage/roms/ports/CaveStory/Doukutsu.exe" -Pports "${2}" -Cnxengine "-SC${0}" Cdogs-sdl: description: C-Dogs SDL is a classic overhead run-and-gun game, supporting up to 4 players in co-op and deathmatch modes. Customize your player, choose from many weapons, and blast, slide and slash your way through over 100 user-created campaigns. Have fun! rating: 1.0 release_date: 2002 developer: Cxong publisher: Cxong init_port: true port_exe: "cdogs-sdl" audio: "alsa" commands: - cdogs-sdl.sh >> $EE_LOG 2>&1 Celeste: description: Help Madeline survive her inner demons on her journey to the top of Celeste Mountain, in this super-tight, hand-crafted platformer from the creators of multiplayer classic TowerFall (itch.io version). rating: 1.0 release_date: 2018 developer: Extremely OK Games, Ltd., Maddy Makes Games publisher: Maddy Makes Games Inc. init_port: true port_exe: "mono" audio: "alsa" commands: - celeste.sh >> $EE_LOG 2>&1 Celeste Classic: description: Celeste Classic. rating: 1.0 release_date: 2016 developer: Extremely OK Games, Ltd., Maddy Makes Games publisher: Maddy Makes Games Inc. init_port: true port_exe: "ccleste" audio: "alsa" commands: - cd /emuelec/configs/ccleste - ${PORT} >> $EE_LOG 2>&1 Commander Keen: description: Commander Genius is a software piece that interprets the Commander Keen Invasion of the Vorticons and Galaxy series. As fans and developers we try to implement new features, improve the gameplay and give players an experience that feels like playing the original game but a bit more refreshing. rating: 1.0 release_date: 20170326T000000 developer: Commander Genius team publisher: non-commercial init_port: true port_exe: "CGeniusExe" audio: "alsa" commands: - '[[ ! -L "/storage/.CommanderGenius" ]] && ln -sf /emuelec/configs/CommanderGenius /storage/.CommanderGenius' - cd /storage/roms/ports/cgenius - /usr/bin/${PORT} >> $EE_LOG 2>&1 Diablo: description: Diablo build for modern operating systems - Diablo is an action role-playing hack and slash video game developed by Blizzard North and released by Blizzard Entertainment in early January 1997. rating: 1.0 release_date: 19970101T000000 developer: DevilutionX - Blizzard publisher: Public Domain check_bios: Diablo init_port: true port_exe: "devilutionx" audio: "pulseaudio" commands: - devilutionx.sh >> $EE_LOG 2>&1 Diablo Hellfire: description: Hellfire is the expansion pack for the video game Diablo, developed by Synergistic Software, a Sierra division, and published by Sierra On-Line in 1997. Despite the objections of Blizzard Entertainment, the Hellfire expansion was produced, permitted by Davidson & Associates, their parent company at the time. rating: 1.0 release_date: 19971124T000000 developer: DevilutionX - Blizzard - Synergistic Software publisher: Blizzard check_bios: Hellfire init_port: true port_exe: "devilutionx" audio: "pulseaudio" commands: - devilutionx.sh hellfire >> $EE_LOG 2>&1 Dinothawr: description: Dinothawr is a block pushing puzzle game on slippery surfaces. Our hero is a dinosaur whose friends are trapped in ice. Through puzzles it is your task to free the dinos from their ice prison. rating: 0.8 release_date: 20130220T000000 developer: Themaister, Agnes Heyer publisher: non-commercial check_bios: Dinothawr commands: - /usr/bin/emuelecRunEmu.sh "/storage/roms/ports/dinothawr/dinothawr.game" -Pports "${2}" -Cdinothawr "-SC${0}" Doom: description: Players assume the role of a space marine fighting his way through hordes of invading demons through the 9 levels of Hell. rating: 0.8 release_date: 19931210T000000 developer: id Software publisher: GT Interactive check_bios: DOOM1 commands: - /usr/bin/emuelecRunEmu.sh "/storage/roms/ports/doom/doom1.wad" -Pports "${2}" -Cprboom "-SC${0}" Doom 2: description: A first-person shooter video game, the second title of id Software's Doom franchise. It was originally released for MS-DOS computers in 1994 and Macintosh computers in 1995. rating: 0.9 release_date: 19941010T000000 developer: id Software publisher: GT Interactive check_bios: DOOM2 commands: - /usr/bin/emuelecRunEmu.sh "/storage/roms/ports/doom2/doom2.wad" -Pports "${2}" -Cprboom "-SC${0}" Duke Nukem: description: Duke Nukem 3D is a first-person shooter video game developed by 3D Realms. It is a sequel to the platform games Duke Nukem and Duke Nukem II, published by 3D Realms. Duke Nukem 3D features the adventures of the titular Duke Nukem, voiced by Jon St. John, who fights against an alien invasion on Earth. rating: 1.0 release_date: 19960129T000000 developer: 3D Realms publisher: FormGen init_port: true port_exe: "eduke32" audio: "alsa" check_bios: eduke32 commands: - cd /storage/roms/ports/eduke - eduke.sh >> $EE_LOG 2>&1 Fallout: description: "Fallout: A Post Nuclear Role Playing Game. In a mid-22nd century post-apocalyptic and retro-futuristic world, decades after a global nuclear war between the United States and China, the Vault Dweller, inhabits the underground nuclear shelter Vault 13." rating: 0.9 release_date: 19971007T000000 developer: Interplay Productions publisher: Interplay Productions init_port: true port_exe: "fallout-ce" vkb: "fallout" audio: "alsa" commands: - cd /storage/roms/ports/falloutce1 - falloutce1.sh >> $EE_LOG 2>&1 Fallout 2: description: Fallout 2 is a sequel to Fallout, featuring similar graphics and game mechanics. The game story takes place in 2241, 80 years after the events of Fallout and 164 years after the atomic war which reduced the vast majority of the world to a nuclear wasteland. The player assumes the role of The Chosen One, the grandchild of the first game protagonist, and undertakes a quest to save their small village on the West Coast of the United States. rating: 0.9 release_date: 19980930T000000 developer: Black Isle Studios publisher: Interplay Productions init_port: true port_exe: "fallout2-ce" vkb: "fallout" audio: "alsa" commands: - cd /storage/roms/ports/falloutce2 - falloutce2.sh >> $EE_LOG 2>&1 Flashback: description: REminiscence is a game engine recreation of the 1992/1993 action adventure game Flashback. It is the spiritual successor of Another World/Out Of This World and it distinguishes itself with rotoscoped graphics, and polygonal cutscenes. rating: 0.8 release_date: 20180114T000000 developer: Gregory Montoir, Stuart Carnie publisher: GPLv3 check_bios: REminiscence commands: - /usr/bin/emuelecRunEmu.sh "/storage/roms/ports/reminiscence" -Pports "${2}" -Creminiscence "-SC${0}" Half-Life: description: Half-Life is a 1998 first-person shooter (FPS) game developed by Valve and published by Sierra Studios for Windows. It was Valve's debut product and the first game in the Half-Life series. Players assume the role of Gordon Freeman, a scientist who must escape the Black Mesa Research Facility after it is invaded by aliens. The gameplay consists of combat, exploration, and puzzle-solving. rating: 1.0 release_date: 1998 developer: Valve publisher: Sierra Studios init_port: true port_exe: "xash3d" audio: "alsa" commands: - xash3d.sh >> $EE_LOG 2>&1 Heart of Darkness: description: Hode is a reimplementation of the engine used by the game "Heart of Darkness" developed by Amazing Studio. Heart of Darkness is a cinematic platformer in the vein of Eric Chahi's previous game Another World. The player controls Andy, who faces various dangers in search of his dog, Whisky. The player progresses through the game's linear storyline by navigating various environments and solving puzzles, all whilst attempting to keep Andy from being killed by evil shadows. rating: 0.9 release_date: 19980704T000000 developer: Amazing Studio publisher: Infogrames Interplay init_port: true port_exe: "hode" audio: "alsa" commands: - ${PORT} --datapath=/storage/roms/ports/hode/ --savepath=/storage/roms/ports/hode/ >> $EE_LOG 2>&1 Heroes of Might and Magic II: description: "Heroes of Might and Magic II: The Succession Wars is a turn-based strategy video game developed by Jon Van Caneghem through New World Computing and published in 1996 by the 3DO Company." rating: 1.0 release_date: 1996 developer: New World Computing publisher: The 3DO Company init_port: true port_exe: "fheroes2" audio: "alsa" commands: - fheroes2.sh >> $EE_LOG 2>&1 Hurrican: description: Freeware jump and shoot game created by Poke53280, based on the Turrican game series by Manfred Trenz. rating: 1.0 release_date: 2001 developer: Poke53280 publisher: Hurrican Team init_port: true port_exe: "hurrican" vkb: "hurrican" audio: "alsa" commands: - hurrican.sh >> $EE_LOG 2>&1 Hydra Castle Labyrinth: description: Hydra Castle Labyrinth (a "metroidvania" kind of game). rating: 1.0 release_date: 20110129T000000 developer: ptitSeb publisher: Nicalis, Inc. init_port: true port_exe: "hcl" audio: "alsa" commands: - cd /emuelec/configs/hcl/ - ${PORT} -d >> $EE_LOG 2>&1 Mr. Boom: description: Mr. Boom is an up to 8 player Bomberman clone. The goal of the game is to bomb away your enemies and other players. rating: 0.8 release_date: 19990225T000000 developer: Remdy Software publisher: non-commercial commands: - /usr/bin/emuelecRunEmu.sh "" -Pports "${2}" -Cmrboom "-SC${0}" OpenJazz: description: OpenJazz is a free, open-source version of the classic Jazz Jackrabbit game. Jazz Jackrabbit is a PC platform game. Produced by Epic Games (then Epic MegaGames), it was first released in 1994. rating: 1.0 release_date: 20210516T000000 developer: sana2dang, AlisterT publisher: non-commercial requires: - DEVICE: OdroidGoAdvance - DEVICE: GameForce init_port: true port_exe: "OpenJazz" audio: "alsa" commands: - ${PORT} --Datadir /storage/roms/ports/openjazz >> $EE_LOG 2>&1 OpenTyrian: description: OpenTyrian is an open-source port of the "cult" arcade-style vertical scrolling shooter called "Tyrian". Original game was developed by World Tree Games Productions and published in 1995 by Epic MegaGames. rating: 1.0 release_date: 1995 developer: World Tree Games publisher: Epic MegaGames check_bios: OpenTyrian init_port: true port_exe: "opentyrian" audio: "alsa" commands: - '## on "Amlogic" project we need to remove asound.conf or else OpenTyrian will have no sound.' - '[[ "$EE_DEVICE" == "Amlogic" ]] && mv /storage/.config/asound.conf /storage/.config/asound2.conf' - ${PORT} -t /storage/roms/ports/opentyrian >> $EE_LOG 2>&1 commands_end: - '[[ "$EE_DEVICE" == "Amlogic" ]] && mv /storage/.config/asound2.conf /storage/.config/asound.conf' Prince of Persia: description: SDLPoP is an open-source port of Prince of Persia that runs natively on Windows and Linux. It is based on a disassembly of the DOS version. rating: 1.0 release_date: 20110111T000000 developer: Dávid Nagy publisher: non-commercial init_port: true port_exe: "prince" audio: "alsa" commands: - '[[ ! -f "/storage/.config/emuelec/configs/SDLPoP/SDLPoP.cfg" ]] && touch "/storage/.config/emuelec/configs/SDLPoP/SDLPoP.cfg"' - '# SDLPop will complain about a missing data and config files by showing a nice blank screen after the intro' - cd /storage/.config/emuelec/configs/SDLPoP - ${PORT} >> $EE_LOG 2>&1 Quake: description: Players must find their way through various maze-like, medieval environments while battling a variety of monsters using an array of weaponry. rating: 0.8 release_date: 19960622T000000 developer: id Software publisher: GT Interactive check_bios: Quake commands: - /usr/bin/emuelecRunEmu.sh "/storage/roms/ports/quake/id1/pak0.pak" -Pports "${2}" -Ctyrquake "-SC${0}" Rick Dangerous: description: Way before Lara Croft, back in the 1980's and early 1990's, Rick Dangerous was the Indiana Jones of computer games, running away from rolling rocks, avoiding traps, from South America to a futuristic missile base via Egypt and the Schwarzendumpf castle. Xrick is a clone of Rick Dangerous, known to run on Linux, Windows, BeOs, Amiga, QNX, all sorts of gaming consoles. rating: 0.8 release_date: 20170326T000000 developer: BigOrno publisher: non-commercial check_bios: RickDangerous commands: - /usr/bin/emuelecRunEmu.sh "/storage/roms/ports/xrick/data.zip" -Pports "${2}" -Cxrick "-SC${0}" RigelEngine: description: RigelEngine is an open-source recreation of the 2D side-scroller Duke Nukem II, originally released by Apogee in 1993. rating: 1.0 release_date: 1993 developer: Apogee Software publisher: Apogee Software init_port: true port_exe: "RigelEngine" audio: "alsa" check_bios: RigelEngine commands: - ${PORT} /storage/roms/ports/rigelengine >> $EE_LOG 2>&1 Shovel Knight: description: Shovel Knight is a 2D side-scrolling platform game developed and published by Yacht Club Games. rating: 1.0 release_date: 2014 developer: Yacht Club Games publisher: Yacht Club Games init_port: true port_exe: "ShovelKnight" audio: "alsa" commands: - shovelknight.sh >> $EE_LOG 2>&1 Sonic 1: description: Sonic the Hedgehog is a platform game developed by Sonic Team and published by Sega for the Sega Genesis home video game console. It was released in North America in June 1991 and in PAL regions and Japan the following month. rating: 1.0 release_date: 1991 developer: SEGA publisher: SEGA init_port: true port_exe: "sonic2013" audio: "alsa" check_bios: sonic1 commands: - '[ ! -e "/storage/roms/ports/sonic1/settings.ini" ] && cp "/emuelec/configs/sonic/settings.ini" "/storage/roms/ports/sonic1/settings.ini"' - cd /storage/roms/ports/sonic1/ - ${PORT} >> $EE_LOG 2>&1 Sonic 2: description: Sonic the Hedgehog 2 is a 1992 platform game developed and published by Sega for the Sega Genesis. It is the second main entry in the Sonic the Hedgehog series, and introduced Sonic's sidekick, Miles "Tails" Prower, controllable by a second player. rating: 1.0 release_date: 1992 developer: SEGA publisher: SEGA init_port: true port_exe: "sonic2013" audio: "alsa" check_bios: sonic2 commands: - '[ ! -e "/storage/roms/ports/sonic2/settings.ini" ] && cp "/emuelec/configs/sonic/settings.ini" "/storage/roms/ports/sonic2/settings.ini"' - cd /storage/roms/ports/sonic2/ - ${PORT} >> $EE_LOG 2>&1 Sonic CD: description: Sonic the Hedgehog CD is a 1993 platform game for the Sega CD. The story follows Sonic the Hedgehog as he attempts to save an extraterrestrial body, Little Planet, from Doctor Robotnik. rating: 1.0 release_date: 1993 developer: SEGA publisher: SEGA init_port: true port_exe: "soniccd" audio: "alsa" check_bios: soniccd commands: - '[ ! -e "/storage/roms/ports/soniccd/settings.ini" ] && cp "/emuelec/configs/sonic/settings.ini" "/storage/roms/ports/soniccd/settings.ini"' - cd /storage/roms/ports/soniccd/ - ${PORT} >> $EE_LOG 2>&1 Sonic Mania: description: Sonic Mania is a 2017 platform game published by Sega. Produced in commemoration of the Sonic the Hedgehog series' 25th anniversary, Sonic Mania pays homage to the original Sega Genesis Sonic games, featuring speedy side-scrolling gameplay. rating: 1.0 release_date: 2017 developer: SEGA publisher: SEGA init_port: true port_exe: "sonicmania" audio: "alsa" check_bios: sonicmania commands: - '[ ! -e "/storage/roms/ports/sonicmania/Settings.ini" ] && cp "/emuelec/configs/sonicmania/Settings.ini" "/storage/roms/ports/sonicmania/Settings.ini"' - '[ ! -e "/storage/roms/ports/sonicmania/Game.so" ] && cp "/usr/bin/sonic_mania/Game.so" "/storage/roms/ports/sonicmania/Game.so"' - cd /storage/roms/ports/sonicmania/ - ${PORT} >> $EE_LOG 2>&1 Sorr: description: Streets of Rage Remake is a remastered version of the MegaDrive classic. There are more than 60 different enemies, you can choose among 16 characters, choose your favourite one and kick asses out there. It's even better than the original one. More characters, more levels, more actions, more finals,... Amazing. rating: 1.0 release_date: 2011 developer: BomberGames publisher: BomberGames init_port: true port_exe: "bgdi" vkb: "sorr" audio: "alsa" commands: - cd /storage/roms/ports/sorr - '[[ ! -e "/storage/roms/ports/sorr/SorR.dat" ]] && end_port && exit 21' - bgdi "/storage/roms/ports/sorr/SorR.dat" >> $EE_LOG 2>&1 Supermariowar: description: A fan-made multiplayer Super Mario Bros. style deathmatch game. rating: 0.8 release_date: 2006 developer: Michael Schaffer, Florian Hufsky, Supermariowar Team publisher: Supermariowar Team init_port: true port_exe: "smw" audio: "alsa" commands: - run_smw.sh >> $EE_LOG 2>&1 SuperTux: description: SuperTux is a free and open-source two-dimensional platform video game published under the GNU General Public License. The game was inspired by Nintendo's Super Mario Bros. series; instead of Mario, the hero in the game is Tux, the official mascot of the Linux kernel. rating: 1.0 release_date: 2004 developer: SuperTux Development Team publisher: Pelya, SuperTux Development Team init_port: true port_exe: "supertux2" audio: "alsa" commands: - run_supertux.sh >> $EE_LOG 2>&1 SuperTuxKart: description: SuperTuxKart is a free and open-source kart racing game, distributed under the terms of the GNU General Public License, version 3. It features mascots of various open-source projects. rating: 1.0 release_date: 2007 developer: SuperTuxKart Team publisher: SuperTuxKart Team init_port: true port_exe: "supertuxkart" audio: "alsa" commands: - run_supertuxkart.sh >> $EE_LOG 2>&1 TMNTSR: description: "Teenage Mutant Ninja Turtles: Shredder's Revenge is a beat'em up game developed by Tribute Games and published by Dotemu." rating: 1.0 release_date: 2022 developer: Tribute Games publisher: Dotemu init_port: true port_exe: "mono" audio: "alsa" commands: - tmntsr.sh >> $EE_LOG 2>&1 VVVVVV: description: VVVVVV is a platform game all about exploring one simple mechanical idea - what if you reversed gravity instead of jumping? The game is designed not to artificially gate your progress. In VVVVVV there are no locks, no power-ups, no switches, nothing to stop you progressing except the challenges themselves. rating: 1.0 release_date: 20100111T000000 developer: Terry Cavanagh, Simon Roth, Nicalis publisher: non-commercial init_port: true port_exe: "VVVVVV" audio: "alsa" check_bios: VVVVVV commands: - '# VVVVVV will complain about a missing gamecontrollerdb.txt unless we switch to this folder first' - cd /storage/.config/SDL-GameControllerDB/ - ${PORT} >> $EE_LOG 2>&1 ================================================ FILE: packages/sx05re/emuelec-ports/supermariowar/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="supermariowar" PKG_VERSION="ed60ed45e296ff88a8883cbc51f5bf5aed880636" PKG_ARCH="any" PKG_SITE="https://github.com/mmatyas/supermariowar" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_image SDL2_mixer" PKG_SHORTDESC="A fan-made multiplayer Super Mario Bros. style deathmatch game " PKG_TOOLCHAIN="cmake" PKG_CMAKE_OPTS_TARGET=" -DUSE_PNG_SAVE=ON -DSDL2_FORCE_GLES=ON" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/.${TARGET_NAME}/smw* ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emuelec-ports/supermariowar/patches/supermariowar-emuelec-001-config-path.patch ================================================ --- a/src/common/path.cpp +++ b/src/common/path.cpp @@ -48,8 +48,8 @@ return result; #else // catch-all for Linux-based systems - std::string result(".smw/"); - char* folder = getenv("HOME"); + std::string result("smw/"); + char* folder = "/emuelec/configs"; if (folder) result = std::string(folder) + "/" + result; return result; ================================================ FILE: packages/sx05re/emuelec-ports/supermariowar/scripts/run_smw.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Modified 2024-present DiegroSan (github) # Source predefined functions and variables . /etc/profile DATA="https://github.com/mmatyas/supermariowar-data/archive/da13a367e5a41c59d59f8c0a7fb8248a2f72750c.zip" DATAFILE=$(basename "$DATA") DATANAME=$(basename "$DATA" .zip) DATAFOLDER="/storage/roms/ports/smw/data" CONFIGFOLDER="/emuelec/configs/smw" mkdir -p "${DATAFOLDER}" mkdir -p "${CONFIGFOLDER}" cd "${DATAFOLDER}" gptokeyb & if [ ! -f "${CONFIGFOLDER}/nofakekeyb" ]; then touch "${CONFIGFOLDER}/nofakekeyb" fi if [ ! -e "${DATAFOLDER}/worlds/Big JM_Mixed River.txt" ]; then text_viewer -y -w -f 24 -t "Data does not exists!" -m "It seems this is the first time you are launching Super Mario War or the data folder does not exists\n\nData is about 30 MB total, and you need to be connected to the internet\n\nKeep in mind the first time you run the game a fake keyboard is set, you need to set up your controller/gamepad and restart the game.\n\nDownload and continue?" if [[ $? == 21 ]]; then ee_console enable wget "${DATA}" -q --show-progress > /dev/tty0 2>&1 unzip "${DATAFILE}" > /dev/tty0 mv "${DATAFOLDER}/supermariowar-data-${DATANAME}"/* "${DATAFOLDER}/" > /dev/tty0 rm -rf "${DATAFOLDER}/supermariowar-data-${DATANAME}" > /dev/tty0 2>&1 rm "${DATAFOLDER}/${DATAFILE}" > /dev/tty0 2>&1 rm "imgui.ini" > /dev/tty0 2>&1 ee_console disable cd "${DATAFOLDER}/.." smw --datadir "${DATAFOLDER}" > /emuelec/logs/emuelec.log 2>&1 else exit 0 fi else smw --datadir "${DATAFOLDER}" > /emuelec/logs/emuelec.log 2>&1 fi killall gptokeyb & ================================================ FILE: packages/sx05re/emuelec-ports/supertux/config/config ================================================ (supertux-config (profile 1) (show_fps #f) (show_player_pos #f) (show_controller #f) (developer #f) (confirmation_dialog #f) (pause_on_focusloss #t) (custom_mouse_cursor #t) (integrations (hide_editor_levelnames #f) ) (video (fullscreen #t) (video "auto") (vsync #t) (fullscreen_width 1920) (fullscreen_height 1080) (fullscreen_refresh_rate 0) (window_width 1920) (window_height 1080) (window_resizable #f) (aspect_width 0) (aspect_height 0) (magnification 0) ) ) ================================================ FILE: packages/sx05re/emuelec-ports/supertux/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="supertux" PKG_VERSION="37cddf24a4abfdec7931a84afd9e87fb8ea18767" #v0.6.3 PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/SuperTux/supertux" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 boost" PKG_LONGDESC="Run and jump through multiple worlds, fighting off enemies by jumping on them, bumping them from below or tossing objects at them, grabbing power-ups and other stuff on the way." pre_configure_target() { PKG_CMAKE_OPTS_TARGET+=" -DENABLE_OPENGL=ON -DENABLE_OPENGLES2=ON -DBUILD_DOCUMENTATION=OFF -DENABLE_DISCORD=Off -DCMAKE_BUILD_TYPE=Release -DIS_SUPERTUX_RELEASE=ON -DBoost_NO_BOOST_CMAKE=ON" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/.${TARGET_NAME}/supertux2 ${INSTALL}/usr/bin/ cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/supertux2 cp ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/supertux2 } ================================================ FILE: packages/sx05re/emuelec-ports/supertux/scripts/run_supertux.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile # This variable has to match the version on package.mk VERSION="0.6.3" DATA="https://github.com/SuperTux/supertux/archive/refs/tags/v${VERSION}.zip" DATAFOLDER="/storage/roms/ports/supertux" CONFIGFOLDER="/emuelec/configs/supertux2" if [ "${EE_DEVICE}" == "OdroidGoAdvance" ] || [ "${EE_DEVICE}" == "GameForce" ]; then OGAVER=$(oga_ver) case "${OGAVER}" in "OGA") sed -i "s|(fullscreen_width .*|(fullscreen_width 480)|" ${CONFIGFOLDER}/config sed -i "s|(fullscreen_height .*|(fullscreen_height 320)|" ${CONFIGFOLDER}/config sed -i "s|(fullscreen_refresh_rate .*|(fullscreen_refresh_rate 60)|" ${CONFIGFOLDER}/config sed -i "s|(window_width .*|(window_width 480)|" ${CONFIGFOLDER}/config sed -i "s|(window_height .*|(window_height 320)|" ${CONFIGFOLDER}/config ;; "OGS") sed -i "s|(fullscreen_width .*|(fullscreen_width 854)|" ${CONFIGFOLDER}/config sed -i "s|(fullscreen_height .*|(fullscreen_height 480)|" ${CONFIGFOLDER}/config sed -i "s|(fullscreen_refresh_rate .*|(fullscreen_refresh_rate 60)|" ${CONFIGFOLDER}/config sed -i "s|(window_width .*|(window_width 854)|" ${CONFIGFOLDER}/config sed -i "s|(window_height .*|(window_height 480)|" ${CONFIGFOLDER}/config ;; "GF") sed -i "s|(fullscreen_width .*|(fullscreen_width 640)|" ${CONFIGFOLDER}/config sed -i "s|(fullscreen_height .*|(fullscreen_height 480)|" ${CONFIGFOLDER}/config sed -i "s|(fullscreen_refresh_rate .*|(fullscreen_refresh_rate 60)|" ${CONFIGFOLDER}/config sed -i "s|(window_width .*|(window_width 640)|" ${CONFIGFOLDER}/config sed -i "s|(window_height .*|(window_height 480)|" ${CONFIGFOLDER}/config ;; esac fi mkdir -p "${DATAFOLDER}" cd "${DATAFOLDER}" if [ ! -e "${DATAFOLDER}/credits.stxt" ]; then text_viewer -y -w -f 24 -t "Data does not exists!" -m "It seems this is the first time you are launching Super Tux or the data folder does not exists\n\nData is about 200 MB total, and you need to be connected to the internet\n\nDownload and continue?" if [[ $? == 21 ]]; then ee_console enable rm -rf ${DATAFOLDER}/* wget "${DATA}" -O "${VERSION}.zip" -q --show-progress > /dev/tty0 2>&1 unzip "${VERSION}.zip" > /dev/tty0 mv supertux-${VERSION}/data/* "${DATAFOLDER}" > /dev/tty0 rm -rf "supertux-${VERSION}" rm "${VERSION}.zip" rm "imgui.ini" mv ${DATAFOLDER}/levels/misc/menu.stl.in ${DATAFOLDER}/levels/misc/menu.stl sed -i "s|@LOGO_FILE@|logo_final.sprite|g" ${DATAFOLDER}/levels/misc/menu.stl ee_console disable SUPERTUX2_DATA_DIR="${DATAFOLDER}" supertux2 else exit 0 fi else SUPERTUX2_DATA_DIR="${DATAFOLDER}" SUPERTUX2_USER_DIR="${CONFIGFOLDER}" supertux2 fi ================================================ FILE: packages/sx05re/emuelec-ports/supertuxkart/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="supertuxkart" PKG_VERSION="fab79150111944c9e33396db68eb5de84f2efeaa" PKG_SHA256="c2b0d7781331e1bd717f2eeaf9f5ca56f314d4bb5136a8dd9c6fe45777d31022" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/supertuxkart/stk-code" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2 harfbuzz" PKG_LONGDESC="SuperTuxKart is a free kart racing game. It focuses on fun and not on realistic kart physics. Instructions can be found on the in-game help page." pre_configure_target() { PKG_CMAKE_OPTS_TARGET+=" -DNO_SHADERC=on -DBUILD_RECORDER=0 -DUSE_WIIUSE=OFF -DCHECK_ASSETS=off -DCMAKE_BUILD_TYPE=Release" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/.${TARGET_NAME}/bin/supertuxkart ${INSTALL}/usr/bin/ cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emuelec-ports/supertuxkart/scripts/run_supertuxkart.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile # This variable has to match the version on package.mk VERSION="1.4" ASSETS="https://github.com/supertuxkart/stk-assets-mobile/releases/download/${VERSION}/stk-assets.zip" DATA="https://github.com/supertuxkart/stk-code/archive/refs/tags/${VERSION}.zip" DATAFOLDER="/storage/roms/ports/supertuxkart" mkdir -p "${DATAFOLDER}" cd "${DATAFOLDER}" if [ ! -e "${DATAFOLDER}/data/stk_config.xml" ]; then text_viewer -y -w -f 24 -t "Data does not exists!" -m "It seems this is the first time you are launching Super Tux Kart or the data folder does not exists\n\nData is about 250 MB total, and you need to be connected to the internet\n\nDownload and continue?" if [[ $? == 21 ]]; then ee_console enable wget "${DATA}" -q --show-progress > /dev/tty0 2>&1 unzip "${VERSION}.zip" > /dev/tty0 rm -rf "${DATAFOLDER}/data" mv "stk-code-${VERSION}/data" "${DATAFOLDER}" > /dev/tty0 rm -rf "stk-code-${VERSION}" wget "${ASSETS}" -q --show-progress > /dev/tty0 2>&1 unzip "stk-assets.zip" -d data > /dev/tty0 rm "stk-assets.zip" rm "${VERSION}.zip" ee_console disable mkdir -p /storage/.config/supertuxkart/config-0.10 [[ ! -f "${DATAFOLDER}/data/supertuxkart.git" ]] && touch "${DATAFOLDER}/data/supertuxkart.git" cat > /storage/.config/supertuxkart/config-0.10/players.xml << EOF EOF SUPERTUXKART_DATADIR="${DATAFOLDER}" supertuxkart else exit 0 fi else SUPERTUXKART_DATADIR="${DATAFOLDER}" supertuxkart fi ================================================ FILE: packages/sx05re/emuelec-ports/tmntsr/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="tmntsr" PKG_VERSION="1.0" PKG_ARCH="any" PKG_LICENSE="GPL2" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain progressor" PKG_SHORTDESC="Script file to run teenage mutant ninja turtles shredder's revenge" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp tmntsr.sh ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs cp tmntsr.tar.xz ${INSTALL}/usr/config/emuelec/configs } ================================================ FILE: packages/sx05re/emuelec-ports/tmntsr/sources/tmntsr.sh ================================================ #!/bin/bash . /etc/profile directory="/storage/roms" export gameassembly="TMNT.exe" export gamedir="/$directory/ports/tmntsr" # Untar port files if [[ ! -f "${gamedir}/MMLoader.exe" ]]; then tar -xf "/emuelec/configs/tmntsr.tar.xz" -C "$directory/ports" fi # check if required files are installed if [[ ! -f "${gamedir}/gamedata/${gameassembly}" ]]; then text_viewer -e -w -t "ERROR!" -f 24 -m "TMNT:SR Game Data does not exist on ${gamedir}/gamedata\n\nYou need to provide your own game data from your copy of the game" exit 0 fi cd "$gamedir/gamedata" # Setup mono monodir="/emuelec/mono" monofile="$directory/ports/mono-6.12.0.122-aarch64.squashfs" if [ ! -e "${monofile}" ]; then monourl="https://github.com/PortsMaster/PortMaster-Hosting/releases/download/large-files/mono-6.12.0.122-aarch64.squashfs" text_viewer -y -w -f 24 -t "MONO does not exists!" -m "It seems this is the first time you are launching TMNT:SR or the MONO file does not exists\n\nMONO is about 260 MB, and you need to be connected to the internet\n\nIMPORTANT: THIS IS NOT THE GAME DATA! YOU STILL NEED TO PROVIDE THIS FROM YOUR COPY OF TMNT:SR\n\nDownload and continue?" if [[ $? == 21 ]]; then ee_console enable wget "${monourl}" -O "${monofile}" -q --show-progress > /dev/tty0 2>&1 ee_console disable else exit 0 fi else mkdir -p "$monodir" umount "$monofile" || true mount "$monofile" "$monodir" fi # Remove all the dependencies in favour of system libs - e.g. the included rm -f System*.dll mscorlib.dll FNA.dll Mono.*.dll # Setup path and other environment variables # export FNA_PATCH="$gamedir/dlls/PanzerPaladinPatches.dll" export MONO_IOMAP=all export XDG_DATA_HOME=/emuelec/configs export MONO_PATH="$gamedir/dlls":"$gamedir/gamedata":"$gamedir/monomod" export LD_LIBRARY_PATH="$gamedir/libs":"$monodir/lib":"$LD_LIBRARY_PATH" export PATH="$monodir/bin":"$PATH" # Setup savedir if [ ! -L ${XDG_DATA_HOME}/Tribute\ Games/TMNT ]; then rm -rf ${XDG_DATA_HOME}/Tribute\ Games/TMNT mkdir -p ${XDG_DATA_HOME}/Tribute\ Games/ ln -sfv "${gamedir}/savedata" ${XDG_DATA_HOME}/Tribute\ Games/TMNT fi # Configure the renderpath export FNA3D_FORCE_DRIVER=OpenGL export FNA3D_OPENGL_FORCE_ES3=1 export FNA3D_OPENGL_FORCE_VBO_DISCARD=1 export FNA_SDL2_FORCE_BASE_PATH=0 sha1sum -c "${gamedir}/gamedata/.ver_checksum" if [ $? -ne 0 ]; then echo "Checksum fail or unpatched binary found, patching game..." |& tee /dev/tty0 rm -f "${gamedir}/gamedata/.astc_done" rm -f "${gamedir}/gamedata/.patch_done" fi if [[ ! -f "${gamedir}/gamedata/.astc_done" ]] || [[ ! -f "${gamedir}/gamedata/.patch_done" ]]; then chmod +x ../repack.src ../utils/* progressor \ --log "../repack.log" \ --font "../FiraCode-Regular.ttf" \ --title "First Time Setup" \ ../repack.src [[ $? != 0 ]] && exit -1 fi # Fix for a goof on previous on the previous patcher... if [[ -f "${gamedir}/gamedata/MONOMODDED_ParisEngine.dll.so" ]]; then mv "${gamedir}/gamedata/MONOMODDED_ParisEngine.dll.so" "${gamedir}/gamedata/ParisEngine.dll.so" mv "${gamedir}/gamedata/MONOMODDED_${gameassembly}.so" "${gamedir}/gamedata/${gameassembly}.so" fi printf "\033c" > /dev/tty0 echo "Loading... Please Wait." > /dev/tty0 mono --ffast-math -O=all ../MMLoader.exe MONOMODDED_${gameassembly} |& tee ${gamedir}/log.txt kill -9 $(pidof gptokeyb) umount "$monodir" # Disable console printf "\033c" >> /dev/tty1 ================================================ FILE: packages/sx05re/emuelec-ports/xash3d/files/config.cfg ================================================ //======================================================================= // Copyright XashXT Group & Flying With Gauss 2022 (C) // config.cfg - archive of cvars //======================================================================= unbindall bind TAB "+showscores" bind MODE "escape" bind ESCAPE "escape" bind ' "+moveup" bind , "+moveleft" bind . "+moveright" bind / "+movedown" bind 1 "slot1" bind 2 "slot2" bind 3 "slot3" bind 4 "slot4" bind 5 "slot5" bind SEMICOLON "+mlook" bind ` "toggleconsole" bind a "+moveleft" bind c "+movedown" bind d "+moveright" bind e "+use" bind k "+voicerecord" bind q "lastinv" bind r "+reload" bind s "+back" bind t "impulse 201" bind u "messagemode2" bind v "+moveup" bind w "+forward" bind y "messagemode" bind ~ "toggleconsole" bind UPARROW "+forward" bind DOWNARROW "+back" bind LEFTARROW "+left" bind RIGHTARROW "+right" bind ALT "+strafe" bind CTRL "+duck" bind F5 "snapshot" bind F6 "save quick" bind F7 "load quick" bind F10 "quit" bind INS "+klook" bind PGDN "+lookdown" bind PGUP "+lookup" bind END "force_centerview" bind LTRIGGER "+attack2" bind RTRIGGER "+attack" bind A_BUTTON "+jump" bind B_BUTTON "impulse 100" bind X_BUTTON "+use" bind Y_BUTTON "+reload" bind L1_BUTTON "invprev" bind R1_BUTTON "invnext" bind BACK "quit" bind START "pause" bind STICK2 "+duck" bind STICK1 "+speed" bind PAUSE "pause" MP3Volume "1.0" allow_levelshots "0" ambient_fade "1000" ambient_level "0.3" bottomcolor "6" brightness "1.000000" cl_allow_download "1" cl_allow_upload "1" cl_autowepswitch "1" cl_backspeed "400" cl_bmodelinterp "1" cl_charset "utf-8" cl_clockreset "0.1" cl_cmdbackup "10" cl_cmdrate "60" cl_dlmax "1200" cl_download_ingame "1" cl_envshot_size "256" cl_filterstuffcmd "0" cl_fixtimerate "7.5" cl_forwardspeed "400" cl_himodels "0.000000" cl_laddermode "2" cl_lc "1" cl_lightstyle_lerping "0" cl_logocolor "orange" cl_logofile "lambda" cl_lw "1" cl_nopred "0" cl_nosmooth "0" cl_righthand "0" cl_scoreboard_bg "1" cl_showerror "0" cl_showevents "0" cl_showfps "1" cl_showpacketloss "0" cl_showpos "0" cl_sidespeed "400" cl_smoothtime "0.1" cl_test_bandwidth "1" cl_trace_messages "0" cl_updaterate "20" cl_upmax "1200" cl_viewbob "0" cl_vsmoothing "0.05" cmd_scripting "0" con_charset "cp1251" con_color "240 180 24" con_fontnum "-1" con_fontscale "1.0" con_fontsize "1" con_mapfilter "1" con_notifytime "3" crosshair "1" default_fov "90" direct "1" dsp_coeff_table "0" dsp_off "0" ex_interp "0.1" fps_max "72" gamma "2.500000" gl_clear "0" gl_vbo "0" gl_vbo_dlightmode "1" gl_vsync "0" hpk_maxsize "0" http_autoremove "1" http_maxconnections "4" http_timeout "45" http_useragent "xash3d" hud_capturemouse "1" hud_centerid "0" hud_classautokill "1" hud_deathnotice_time "6" hud_draw "1" hud_fastswitch "0" hud_scale "0" hud_takesshots "0" hud_textmode "0" hud_utf8 "0" joy_axis_binding "sfpyrl" joy_enable "1" joy_forward "1.0" joy_forward_deadzone "0" joy_forward_key_threshold "24576" joy_lt_threshold "16384" joy_pitch "100.0" joy_pitch_deadzone "0" joy_rt_threshold "16384" joy_side "1.0" joy_side_deadzone "0" joy_side_key_threshold "24576" joy_yaw "100.0" joy_yaw_deadzone "0" joystick "0.000000" key_rotate "0" lastdemo "" lightgamma "1" look_filter "0" lookspring "0" lookstrafe "0" m_forward "1" m_ignore "0" m_pitch "0.022000" m_rawinput "1" m_side "0.8" m_yaw "0.022" menu_mp_firsttime "1" model "gordon" mp_decals "300" name "Player" net_graph "0" net_graphheight "64" net_graphpos "1" net_graphsolid "1" net_graphwidth "192" net_scale "5" net_speeds "0" osk_enable "0" r_adjust_fov "1" r_decals "4096" r_detailtextures "1" r_dynamic "1" r_lighting_modulate "0.6" r_showtree "0" r_speeds "0" r_sprite_lerping "1" r_sprite_lighting "1" r_studiocache "1" rate "2500.000000" room_hires "2" s_combine_sounds "0" s_lerping "0" s_samplecount "0" s_show "0" s_warn_late_precache "0" scr_conspeed "600" sensitivity "3.100000" sleeptime "1" snd_mute_losefocus "1" suitvolume "0.250000" sv_aim "1" sv_allow_PhysX "1" sv_allow_joystick "1" sv_allow_mouse "1" sv_allow_noinputdevices "1" sv_allow_touch "1" sv_allow_vr "1" sv_background_freeze "1" sv_check_errors "0" sv_enttools_enable "0" sv_enttools_maxfire "5" sv_log_onefile "0" sv_log_singleplayer "0" sv_maxupdaterate "60.0" sv_minupdaterate "25.0" sv_precache_meshes "1" sv_reconnect_limit "3" sv_rollangle "0" sv_voiceenable "1" sv_voicequality "3" topcolor "30" touch_config_file "touch.cfg" touch_emulate "0" touch_enable "0" ui_borderclip "0" ui_language "english" ui_renderworld "0" ui_show_window_stack "0" ui_showmodels "0" vibration_enable "1" vibration_length "1.0" viewsize "120.000000" voice_avggain "0.5" voice_enable "1" voice_maxgain "5.0" voice_scale "1.0" volume "0.800000" zoom_sensitivity_ratio "1.2" +mlook +jlook exec userconfig.cfg // end of config.cfg ================================================ FILE: packages/sx05re/emuelec-ports/xash3d/files/xash3d.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile XHAS3D_LIBS="/usr/lib/xash3d/valve" # Exports for xash3d export XASH3D_BASEDIR=/storage/roms/ports/half-life export XASH3D_VALVEDIR=${XASH3D_BASEDIR}/valve # Check if the valve dir exists if [ ! -x "${XASH3D_VALVEDIR}" ]; then text_viewer -e -w -t "ERROR!" -f 24 -m "You need to copy the Half-Life valve folder to ${XASH3D_BASEDIR}!" exit 0 fi if [ ! -e ${XASH3D_VALVEDIR}/emuelec.config.done ]; then cp -rf ${XHAS3D_LIBS}/* ${XASH3D_VALVEDIR}/ cp -rf /usr/emuelec/configs/hl/config.cfg ${XASH3D_VALVEDIR}/config.cfg touch ${XASH3D_VALVEDIR}/emuelec.config.done fi # Change to binary folder and run HL cd /usr/bin/xash3d/usr ./xash3d -ref gles2 -console &> /emuelec/logs/xash3d.log killall gptokeyb ================================================ FILE: packages/sx05re/emuelec-ports/xash3d/hlsdk-portable/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019 Trond Haugland (github.com/escalade) # Copyright (C) 2022-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="hlsdk-portable" PKG_VERSION="895b28d0379f8902051d2b733029fc6a0fa9989c" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/FWGS/hlsdk-portable" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Portable Half-Life SDK. GoldSource and Xash3D. Crossplatform." PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="-lto -gold" makeinstall_target() { # Seems to be needed for some reason #if [ "${ARCH}" = "arm" ]; then # CPPFLAGS+="-D__ARM_ARCH_7__" #fi # Compile xash3d cd ${PKG_BUILD} ARGS="--build-type=release \ --64bits" ./waf configure ${ARGS} ./waf build -v ./waf install --destdir=${INSTALL}/usr/lib/xash3d } ================================================ FILE: packages/sx05re/emuelec-ports/xash3d/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019 Trond Haugland (github.com/escalade) # Copyright (C) 2022-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="xash3d" PKG_VERSION="b59ba5a1275e052626cea9577da32c634ae5527c" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/FWGS/xash3d-fwgs" PKG_URL="https://github.com/FWGS/xash3d-fwgs.git" PKG_DEPENDS_TARGET="toolchain hlsdk-portable SDL2" PKG_LONGDESC="Xash3D FWGS engine. Rebooted fork since big Xash3D 0.99" PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="-lto" makeinstall_target() { cd ${PKG_BUILD} ARGS="--build-type=release \ --prefix=/usr \ --sdl2=${PKG_ORIG_SYSROOT_PREFIX}/usr \ --64bits \ --disable-gl \ --enable-gles2" ./waf configure ${ARGS} ./waf build -v ./waf install --destdir=${INSTALL}/usr/bin/xash3d mkdir -p ${INSTALL}/usr/lib/xash3d/valve mkdir -p ${INSTALL}/usr/emuelec/configs/hl wget -q -O ${INSTALL}/usr/lib/xash3d/valve/extras.pak https://github.com/FWGS/xash-extras/releases/download/v0.19.2/extras.pak cp ${PKG_DIR}/files/xash3d.sh ${INSTALL}/usr/bin/ cp ${PKG_DIR}/files/config.cfg ${INSTALL}/usr/emuelec/configs/hl } ================================================ FILE: packages/sx05re/emuelec-ports/xash3d/tmpfiles.d/xash3d.conf ================================================ d /storage/roms/half-life/valve 0775 root root - - ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/NPEG00023.ini ================================================ _S NPEG-00023 _G GoW CoO [EUR-PSN] _C0 60 FPS [Fixed] _L 0xE00E003C 0x10003800 _L 0xE00D166F 0x0001F690//vblank _L 0x10003800 0x0000003C _L 0x20003804 0x10800003 _L 0x20003808 0x00000000 _L 0x2000380C 0x0E2C166F _L 0x20003810 0x00000000 _L 0x20003814 0x0E2C166F _L 0x20003818 0x00000000 _L 0x2000381C 0x8FBF0000 _L 0x20003820 0x03E00008 _L 0x20003824 0x27BD0010 _L 0x2001A31C 0x0A200E01//Jump _L 0x2001A320 0x34040000//FPS _L 0x2001A324 0x00000000 _C0 30 FPS [Fixed] _L 0xE00E001E 0x10003800 _L 0xE00D166F 0x0001F690//vblank _L 0x10003800 0x0000001E _L 0x20003804 0x10800003 _L 0x20003808 0x00000000 _L 0x2000380C 0x0E2C166F _L 0x20003810 0x00000000 _L 0x20003814 0x0E2C166F _L 0x20003818 0x00000000 _L 0x2000381C 0x8FBF0000 _L 0x20003820 0x03E00008 _L 0x20003824 0x27BD0010 _L 0x2001A31C 0x0A200E01//Jump _L 0x2001A320 0x34040001//FPS _L 0x2001A324 0x00000000 _C0 Unlimited FPS [Default] _L 0xE0040E01 0x0001A31C _L 0x2001A31C 0x8FBF0000 _L 0x2001A320 0x03E00008 _L 0x2001A324 0x27BD0010 _L 0x10003800 0x00000000 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/NPEG00044.ini ================================================ _S NPEG-00044 _G GoW GoS [EUR-MULTI5-PSN] _C0 60 FPS [Fixed] _L 0xE00E003C 0x10003800 _L 0xE00DE14D 0x000205DC//vblank _L 0x10003800 0x0000003C _L 0x20003804 0x10800003 _L 0x20003808 0x00000000 _L 0x2000380C 0x0E2FE14D _L 0x20003810 0x00000000 _L 0x20003814 0x0E2FE14D _L 0x20003818 0x00000000 _L 0x2000381C 0x8FBF0000 _L 0x20003820 0x03E00008 _L 0x20003824 0x27BD0010 _L 0x2001B10C 0x0A200E01//Jump _L 0x2001B110 0x34040000//FPS _L 0x2001B114 0x00000000 _C0 30 FPS [Fixed] _L 0xE00E001E 0x10003800 _L 0xE00DE14D 0x000205DC//vblank _L 0x10003800 0x0000001E _L 0x20003804 0x10800003 _L 0x20003808 0x00000000 _L 0x2000380C 0x0E2FE14D _L 0x20003810 0x00000000 _L 0x20003814 0x0E2FE14D _L 0x20003818 0x00000000 _L 0x2000381C 0x8FBF0000 _L 0x20003820 0x03E00008 _L 0x20003824 0x27BD0010 _L 0x2001B10C 0x0A200E01//Jump _L 0x2001B110 0x34040001//FPS _L 0x2001B114 0x00000000 _C0 Unlimited FPS [Default] _L 0xE0040E01 0x1001B10C _L 0x2001B10C 0x8FBF0000 _L 0x2001B110 0x03E00008 _L 0x2001B114 0x27BD0010 _L 0x10003800 0x00000000 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/NPUG80325.ini ================================================ _S NPUG-80325 _G GoW CoO [USA-PSN] _C1 60 FPS [Fixed] _L 0xE00E003C 0x10003800 _L 0xE00D1671 0x0001F690//vblank _L 0x10003800 0x0000003C _L 0x20003804 0x10800003 _L 0x20003808 0x00000000 _L 0x2000380C 0x0E2C1671 _L 0x20003810 0x00000000 _L 0x20003814 0x0E2C1671 _L 0x20003818 0x00000000 _L 0x2000381C 0x8FBF0000 _L 0x20003820 0x03E00008 _L 0x20003824 0x27BD0010 _L 0x2001A31C 0x0A200E01//Jump _L 0x2001A320 0x34040000//FPS _L 0x2001A324 0x00000000 _C0 30 FPS [Fixed] _L 0xE00E001E 0x10003800 _L 0xE00D1671 0x0001F690//vblank _L 0x10003800 0x0000001E _L 0x20003804 0x10800003 _L 0x20003808 0x00000000 _L 0x2000380C 0x0E2C1671 _L 0x20003810 0x00000000 _L 0x20003814 0x0E2C1671 _L 0x20003818 0x00000000 _L 0x2000381C 0x8FBF0000 _L 0x20003820 0x03E00008 _L 0x20003824 0x27BD0010 _L 0x2001A31C 0x0A200E01//Jump _L 0x2001A320 0x34040001//FPS _L 0x2001A324 0x00000000 _C0 Unlimited FPS [Default] _L 0xE0040E01 0x0001A31C _L 0x2001A31C 0x8FBF0000 _L 0x2001A320 0x03E00008 _L 0x2001A324 0x27BD0010 _L 0x10003800 0x00000000 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/UCES00019.ini ================================================ _S UCES-00019 _G Pursuit Force [EUR] _C0 60 FPS v2 _L 0x20188038 0x0A262017//FPS _L 0x2016F308 0x3C043F00//GAMEPLAYSPEED _L 0x2016F388 0x3C044270//MENUSPEED _C0 30 FPS v2 [Default] _L 0x20188038 0x10800008//FPS _L 0x2016F308 0x3C043F80//GAMEPLAYSPEED _L 0x2016F388 0x3C0441F0//MENUSPEED ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/UCES00842.ini ================================================ _S UCES-00842 _G GoW CoO [EUR] _C0 60 FPS [Fixed] _L 0xE00E003C 0x10003800 _L 0xE00D0200 0x0001A378//Jump-0x10 _L 0x10003800 0x0000003C _L 0x20003804 0x10800003 _L 0x20003808 0x00000000 _L 0x2000380C 0x0E2C16F9 _L 0x20003810 0x00000000 _L 0x20003814 0x0E2C16F9 _L 0x20003818 0x00000000 _L 0x2000381C 0x8FBF0010 _L 0x20003820 0x03E00008 _L 0x20003824 0x27BD0020 _L 0x2001A388 0x0A200E01//Jump _L 0x2001A38C 0x34040000//FPS _L 0x2001A390 0x00000000 _C0 30 FPS [Fixed] _L 0xE00E001E 0x10003800 _L 0xE00D0200 0x0001A378//Jump-0x10 _L 0x10003800 0x0000001E _L 0x20003804 0x10800003 _L 0x20003808 0x00000000 _L 0x2000380C 0x0E2C16F9 _L 0x20003810 0x00000000 _L 0x20003814 0x0E2C16F9 _L 0x20003818 0x00000000 _L 0x2000381C 0x8FBF0010 _L 0x20003820 0x03E00008 _L 0x20003824 0x27BD0020 _L 0x2001A388 0x0A200E01//Jump _L 0x2001A38C 0x34040001//FPS _L 0x2001A390 0x00000000 _C0 Unlimited FPS [Default] _L 0xE0040E01 0x0001A388 _L 0x2001A388 0x8FBF0010 _L 0x2001A38C 0x03E00008 _L 0x2001A390 0x27BD0020 _L 0x10003800 0x00000000 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/UCES01184.ini ================================================ _S UCES-01184 _G Resistance: Retribution [EUR] _C0 60FPS v2 [No Vsync] _L 0xE0030001 0x10003600 _L 0xE0020003 0x0047F150 _L 0x2047F158 0x34020001 _L 0x20003600 0x00000001 _C0 60FPS v2 [Default] _L 0xE0030002 0x10003600 _L 0xE0020003 0x0047F150 _L 0x2047F158 0x0E31EDB7 _L 0x20003600 0x00000002 _C0 30FPS v2 _L 0xE00A0003 0x10003600 _L 0xE0090003 0x0047F150 _L 0x2047F158 0x0E200D81//Jal _L 0x20003600 0x00000003 _L 0x20003604 0x03E0D821 _L 0x20003608 0x0E3674AD//Vb _L 0x2000360C 0x00000000 _L 0x20003610 0x0E3674AD//Vb _L 0x20003614 0x00000000 _L 0x20003618 0x03600008 _L 0x2000361C 0x34020001 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/UCES01401.ini ================================================ _S UCES-01401 _G GoW GoS [EUR-MULTI5-UMD] _C0 60 FPS [Fixed] _L 0xE00E003C 0x10003800 _L 0xE00DE13C 0x000205DC//vblank _L 0x10003800 0x0000003C _L 0x20003804 0x10800003 _L 0x20003808 0x00000000 _L 0x2000380C 0x0E2FE13C _L 0x20003810 0x00000000 _L 0x20003814 0x0E2FE13C _L 0x20003818 0x00000000 _L 0x2000381C 0x8FBF0000 _L 0x20003820 0x03E00008 _L 0x20003824 0x27BD0010 _L 0x2001B10C 0x0A200E01//Jump _L 0x2001B110 0x34040000//FPS _L 0x2001B114 0x00000000 _C0 30 FPS [Fixed] _L 0xE00E001E 0x10003800 _L 0xE00DE13C 0x000205DC//vblank _L 0x10003800 0x0000001E _L 0x20003804 0x10800003 _L 0x20003808 0x00000000 _L 0x2000380C 0x0E2FE13C _L 0x20003810 0x00000000 _L 0x20003814 0x0E2FE13C _L 0x20003818 0x00000000 _L 0x2000381C 0x8FBF0000 _L 0x20003820 0x03E00008 _L 0x20003824 0x27BD0010 _L 0x2001B10C 0x0A200E01//Jump _L 0x2001B110 0x34040001//FPS _L 0x2001B114 0x00000000 _C0 Unlimited FPS [Default] _L 0xE0040E01 0x1001B10C _L 0x2001B10C 0x8FBF0000 _L 0x2001B110 0x03E00008 _L 0x2001B114 0x27BD0010 _L 0x10003800 0x00000000 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/UCES01473.ini ================================================ _S UCES-01473 _G GoW GoS [EUR-MULTI3-UMD] _C0 60 FPS [Fixed] _L 0xE00E003C 0x10003800 _L 0xE00DE173 0x000205DC//vblank _L 0x10003800 0x0000003C _L 0x20003804 0x10800003 _L 0x20003808 0x00000000 _L 0x2000380C 0x0E2FE173 _L 0x20003810 0x00000000 _L 0x20003814 0x0E2FE173 _L 0x20003818 0x00000000 _L 0x2000381C 0x8FBF0000 _L 0x20003820 0x03E00008 _L 0x20003824 0x27BD0010 _L 0x2001B10C 0x0A200E01//Jump _L 0x2001B110 0x34040000//FPS _L 0x2001B114 0x00000000 _C0 30 FPS [Fixed] _L 0xE00E001E 0x10003800 _L 0xE00DE173 0x000205DC//vblank _L 0x10003800 0x0000001E _L 0x20003804 0x10800003 _L 0x20003808 0x00000000 _L 0x2000380C 0x0E2FE173 _L 0x20003810 0x00000000 _L 0x20003814 0x0E2FE173 _L 0x20003818 0x00000000 _L 0x2000381C 0x8FBF0000 _L 0x20003820 0x03E00008 _L 0x20003824 0x27BD0010 _L 0x2001B10C 0x0A200E01//Jump _L 0x2001B110 0x34040001//FPS _L 0x2001B114 0x00000000 _C0 Unlimited FPS [Default] _L 0xE0040E01 0x1001B10C _L 0x2001B10C 0x8FBF0000 _L 0x2001B110 0x03E00008 _L 0x2001B114 0x27BD0010 _L 0x10003800 0x00000000 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/UCUS98640.ini ================================================ _S UCUS-98640 _G Pursuit Force [USA] _C0 60 FPS v2 _L 0x201AC008 0x0A26B00B//FPS _L 0x20193928 0x3C043F00//GAMEPLAYSPEED _L 0x201939A8 0x3C044270//MENUSPEED _C0 30 FPS v2 [Default] _L 0x201AC008 0x10800008//FPS _L 0x20193928 0x3C043F80//GAMEPLAYSPEED _L 0x201939A8 0x3C0441F0//MENUSPEED ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/UCUS98653.ini ================================================ _S UCUS-98653 _G GoW CoO [USA] _C0 60 FPS [Fixed] _L 0xE00E003C 0x10003800 _L 0xE00D0200 0x0001A378//Jump-0x10 _L 0x10003800 0x0000003C _L 0x20003804 0x10800003 _L 0x20003808 0x00000000 _L 0x2000380C 0x0E2C16F9 _L 0x20003810 0x00000000 _L 0x20003814 0x0E2C16F9 _L 0x20003818 0x00000000 _L 0x2000381C 0x8FBF0010 _L 0x20003820 0x03E00008 _L 0x20003824 0x27BD0020 _L 0x2001A388 0x0A200E01//Jump _L 0x2001A38C 0x34040000//FPS _L 0x2001A390 0x00000000 _C0 30 FPS [Fixed] _L 0xE00E001E 0x10003800 _L 0xE00D0200 0x0001A378//Jump-0x10 _L 0x10003800 0x0000001E _L 0x20003804 0x10800003 _L 0x20003808 0x00000000 _L 0x2000380C 0x0E2C16F9 _L 0x20003810 0x00000000 _L 0x20003814 0x0E2C16F9 _L 0x20003818 0x00000000 _L 0x2000381C 0x8FBF0010 _L 0x20003820 0x03E00008 _L 0x20003824 0x27BD0020 _L 0x2001A388 0x0A200E01//Jump _L 0x2001A38C 0x34040001//FPS _L 0x2001A390 0x00000000 _C0 Unlimited FPS [Default] _L 0xE0040E01 0x0001A388 _L 0x2001A388 0x8FBF0010 _L 0x2001A38C 0x03E00008 _L 0x2001A390 0x27BD0020 _L 0x10003800 0x00000000 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/UCUS98668.ini ================================================ _S UCUS-98668 _G Resistance: Retribution [USA] _C0 60FPS v2 [No Vsync] _L 0xE0030001 0x10003600 _L 0xE0020003 0x0047F150 _L 0x2047F158 0x34020001 _L 0x20003600 0x00000001 _C0 60FPS v2 [Default] _L 0xE0030002 0x10003600 _L 0xE0020003 0x0047F150 _L 0x2047F158 0x0E31EDB7 _L 0x20003600 0x00000002 _C0 30FPS v2 _L 0xE00A0003 0x10003600 _L 0xE0090003 0x0047F150 _L 0x2047F158 0x0E200D81//Jal _L 0x20003600 0x00000003 _L 0x20003604 0x03E0D821 _L 0x20003608 0x0E3674AD//Vb _L 0x2000360C 0x00000000 _L 0x20003610 0x0E3674AD//Vb _L 0x20003614 0x00000000 _L 0x20003618 0x03600008 _L 0x2000361C 0x34020001 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/UCUS98737.ini ================================================ _S UCUS-98737 _G GoW GoS [USA-UMD] _C1 60 FPS [Fixed] _L 0xE00E003C 0x10003800 _L 0xE00DDC67 0x000205DC//vblank _L 0x10003800 0x0000003C _L 0x20003804 0x10800003 _L 0x20003808 0x00000000 _L 0x2000380C 0x0E2FDC67 _L 0x20003810 0x00000000 _L 0x20003814 0x0E2FDC67 _L 0x20003818 0x00000000 _L 0x2000381C 0x8FBF0000 _L 0x20003820 0x03E00008 _L 0x20003824 0x27BD0010 _L 0x2001B10C 0x0A200E01//Jump _L 0x2001B110 0x34040000//FPS _L 0x2001B114 0x00000000 _C0 30 FPS [Fixed] _L 0xE00E001E 0x10003800 _L 0xE00DDC67 0x000205DC//vblank _L 0x10003800 0x0000001E _L 0x20003804 0x10800003 _L 0x20003808 0x00000000 _L 0x2000380C 0x0E2FDC67 _L 0x20003810 0x00000000 _L 0x20003814 0x0E2FDC67 _L 0x20003818 0x00000000 _L 0x2000381C 0x8FBF0000 _L 0x20003820 0x03E00008 _L 0x20003824 0x27BD0010 _L 0x2001B10C 0x0A200E01//Jump _L 0x2001B110 0x34040001//FPS _L 0x2001B114 0x00000000 _C0 Unlimited FPS [Default] _L 0xE0040E01 0x1001B10C _L 0x2001B10C 0x8FBF0000 _L 0x2001B110 0x03E00008 _L 0x2001B114 0x27BD0010 _L 0x10003800 0x00000000 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULES00033.ini ================================================ _S ULES-00033 _G Tony Hawk's Underground 2: Remix [EUR-ENG] _C0 60 FPS _L 0xE0021080 0x0005F61A _L 0x2005F618 0x10000017 _L 0x2000C190 0x00000000 _C0 30 FPS [Default] _L 0xE0021000 0x0005F61A _L 0x2005F618 0x10800017//Vblank _L 0x2000C190 0x1480FFEE//CtrlBuff ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULES00034.ini ================================================ ULES-00034 _G Tony Hawk's Underground 2: Remix [EUR-FR] _C0 60 FPS _L 0xE0021080 0x0005F61A _L 0x2005F618 0x10000017 _L 0x2000C190 0x00000000 _C0 30 FPS [Default] _L 0xE0021000 0x0005F61A _L 0x2005F618 0x10800017//Vblank _L 0x2000C190 0x1480FFEE//CtrlBuff ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULES00035.ini ================================================ _S ULES-00035 _G Tony Hawk's Underground 2: Remix [EUR-GER] _C0 60 FPS _L 0xE0021080 0x0005F61A _L 0x2005F618 0x10000017 _L 0x2000C190 0x00000000 _C0 30 FPS [Default] _L 0xE0021000 0x0005F61A _L 0x2005F618 0x10800017//Vblank _L 0x2000C190 0x1480FFEE//CtrlBuff ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULES00125.ini ================================================ _S ULES-00125 _G Burnout Legends [EUR-v2.00] _C1 60 FPS v3 _L 0xE0020003 0x000555D0//conditional _L 0x200555D0 0x00000000//FPS,1 _L 0x2024A7FC 0x3C043F00//Speed,EnableBeforeIngame _L 0xE0010100 0x10441740//Condit,normalGame _L 0x2000F380 0x14800003//FPS,2 _L 0xE0010100 0x00441740//Condit,crashMode _L 0x2000F380 0x16200003//FPS,2 _C0 30 FPS v3 [Default] _L 0xE0030000 0x000555D0//conditional _L 0x200555D0 0x14A00003//FPS,1 _L 0x2024A7FC 0x3C043F80//Speed,EnableBeforeIngame _L 0x2000F380 0x14800003//FPS,2 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULES00483.ini ================================================ _S ULES-00483 _G The Warriors [EUR] _C0 60 FPS _L 0xE001FFF6 0x003B4D84 _L 0x203B4D84 0x00000000 _C0 30 FPS [Default] _L 0x203B4D84 0x1440FFF6 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULES00625.ini ================================================ _S ULES-00625 _G Tony Hawk's Project 8 [EUR-ENG] _C0 60 FPS _L 0xE0021080 0x00096E16 _L 0x20096E14 0x10000017 _L 0x20011C28 0x00000000 _C0 30 FPS [Default] _L 0xE0021000 0x00096E16 _L 0x20096E14 0x10800017//Vblank _L 0x20011C28 0x1480FFEE//CtrlBuff ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULES00626.ini ================================================ _S ULES-00626 _G Tony Hawk's Project 8 [EUR-Multi5] _C0 60 FPS _L 0xE0021080 0x00096E16 _L 0x20096E14 0x10000017 _L 0x20011C28 0x00000000 _C0 30 FPS [Default] _L 0xE0021000 0x00096E16 _L 0x20096E14 0x10800017//Vblank _L 0x20011C28 0x1480FFEE//CtrlBuff ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULES00703.ini ================================================ _S ULES-00703 _G Burnout Dominator [EUR][MULTI5] _C0 60 FPS v2 _L 0xE004001A 0x0002574C _L 0x2002574C 0x00000000//FPS _L 0x201A0360 0x00000000//WritesSpeed1 _L 0x204F08BC 0x3C888888//Speed1 _L 0x2019AE98 0x3C043F00//Speed2,EnableBeforeIngameOnly _C0 30 FPS v2 [Default] _L 0xE0040000 0x0002574C _L 0x2002574C 0x14A0001A//FPS _L 0x201A0360 0x089A0360//WritesSpeed1 _L 0x204F08BC 0x3D088888//Speed1 _L 0x2019AE98 0x3C043F80//Speed2,EnableBeforeIngameOnly ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULES00968.ini ================================================ _S ULES-00968 _G FlatOut - Head On [EUR] _C0 60 FPS _L 0x006FC1F0 0x00000000 _C0 30 FPS [Default] _L 0x006FC1F0 0x00000001 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULES00981.ini ================================================ _S ULES-00981 _G Star Wars - The Force Unleashed [EUR-Multi3] _C0 60FPS [Fixed] _L 0xE0050002 0x004408B4 _L 0x204408B4 0x00000000//value _L 0x202B8B2C 0x00000000 _L 0x203BB968 0x00000000 _L 0x202B9130 0x00000000 _L 0x203BC2F0 0x00000000 _C0 30FPS [Fixed] _L 0xE0050000 0x004408B4 _L 0x204408B4 0x00000002//value _L 0x202B8B2C 0x00000000 _L 0x203BB968 0x00000000 _L 0x202B9130 0x00000000 _L 0x203BC2F0 0x00000000 _C0 30/60FPS [Default] _L 0xE0040000 0x002B8B2C _L 0x202B8B2C 0xAC9308B4//30 _L 0x203BB968 0xAC8608B4//30 _L 0x202B9130 0xAC8008B4//60 _L 0x203BC2F0 0xAC8008B4//60 _S ULES-00981 _G Star Wars - The Force Unleashed [EUR-Multi3] _C0 Red overlay FIX _L 0xE001ADAE 0x003E9712 _L 0x203E9710 0xADA00000 _C0 Red overlay NO-FIX [Default] _L 0xE001ADA0 0x003E9712 _L 0x203E9710 0xADAE0000 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULES00982.ini ================================================ _S ULES-00982 _G Star Wars - The Force Unleashed [EUR-Multi2] _C0 60FPS [Fixed] _L 0xE0050002 0x00440A84 _L 0x20440A84 0x00000000//value _L 0x202B8B2C 0x00000000 _L 0x203BB964 0x00000000 _L 0x202B9130 0x00000000 _L 0x203BC2EC 0x00000000 _C0 30FPS [Fixed] _L 0xE0050000 0x00440A84 _L 0x20440A84 0x00000002//value _L 0x202B8B2C 0x00000000 _L 0x203BB964 0x00000000 _L 0x202B9130 0x00000000 _L 0x203BC2EC 0x00000000 _C0 30/60FPS [Default] _L 0xE0040000 0x002B8B2C _L 0x202B8B2C 0xAC930A84//30 _L 0x203BB964 0xAC860A84//30 _L 0x202B9130 0xAC800A84//60 _L 0x203BC2EC 0xAC800A84//60 _S ULES-00982 _G Star Wars - The Force Unleashed [EUR-Multi2] _C0 Red overlay FIX _L 0xE001ADAE 0x003E9882 _L 0x203E9880 0xADA00000 _C0 Red overlay NO-FIX [Default] _L 0xE001ADA0 0x003E9882 _L 0x203E9880 0xADAE0000 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULES01214.ini ================================================ _S ULES-01214 _G Star Wars Battlefront - Elite Squadron [EUR] _C0 60 FPS _L 0x20456718 0x42700000 _C0 45 FPS _L 0x20456718 0x42340000 _C0 40 FPS _L 0x20456718 0x42200000 _C0 30 FPS _L 0x20456718 0x41F00000 _C0 20 FPS [Default] ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULES01402.ini ================================================ _S ULES-01402 _G Split/Second - Velocity [EUR] _C0 60 FPS _L 0x0018A790 0x00000001 _C0 30 FPS [Default] _L 0x0018A790 0x00000002 _C0 20 FPS _L 0x0018A790 0x00000003 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULES01406.ini ================================================ _S ULES-01406 _G Toy Story 3 [EUR][MULTI2] _C0 60 FPS _L 0x202E7934 0x00000000 _C0 30 FPS [Default] _L 0x202E7934 0x1080FFFB ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULUS00125.ini ================================================ _S ULUS-00125 / ULES-00125 _G Burnout Legends [USA-v2.00] _C1 60 FPS v3 _L 0xE0020003 0x000555D0//conditional _L 0x200555D0 0x00000000//FPS,1 _L 0x2024A7FC 0x3C043F00//Speed,EnableBeforeIngame _L 0xE0010100 0x10441740//Condit,normalGame _L 0x2000F380 0x14800003//FPS,2 _L 0xE0010100 0x00441740//Condit,crashMode _L 0x2000F380 0x16200003//FPS,2 _C0 30 FPS v3 [Default] _L 0xE0030000 0x000555D0//conditional _L 0x200555D0 0x14A00003//FPS,1 _L 0x2024A7FC 0x3C043F80//Speed,EnableBeforeIngame _L 0x2000F380 0x14800003//FPS,2 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULUS10014.ini ================================================ _S ULUS-10014 _G Tony Hawk's Underground 2: Remix [USA] _C1 60 FPS _L 0xE0021080 0x0005F642 _L 0x2005F640 0x10000017 _L 0x2000C190 0x00000000 _C0 30 FPS [Default] _L 0xE0021000 0x0005F642 _L 0x2005F640 0x10800017//Vblank _L 0x2000C190 0x1480FFEE//CtrlBuff ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULUS10189.ini ================================================ _S ULUS-10189 _G Snoopy vs the Red Baron [USA] _C1 60 FPS _L 0xE0010000 0x1023F394 _L 0x204C6940 0x3F000000 _L 0x0023F394 0x00000000 _C0 30 FPS [Default] _L 0x204C6940 0x3F800000 _L 0x0023F394 0x00000001 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULUS10197.ini ================================================ _S ULUS-10197 _G Tony Hawk's Project 8 [USA-UMDv1.0] _C0 60 FPS _L 0xE0021080 0x00097156 _L 0x20097154 0x10000017 _L 0x20011C28 0x00000000 _C0 30 FPS [Default] _L 0xE0021000 0x00097156 _L 0x20097154 0x10800017//Vblank _L 0x20011C28 0x1480FFEE//CtrlBuff ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULUS10213.ini ================================================ _S ULUS-10213 _G The Warriors [USA] _C1 60 FPS _L 0xE001FFF6 0x003B517C _L 0x203B517C 0x00000000 _C0 30 FPS [Default] _L 0x203B517C 0x1440FFF6 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULUS10236.ini ================================================ _S ULUS-10236 _G Burnout Dominator [USA] _C0 60 FPS v2 _L 0xE004001A 0x0002574C _L 0x2002574C 0x00000000//FPS _L 0x201A0358 0x00000000//WritesSpeed1 _L 0x204F08BC 0x3C888888//Speed1 _L 0x2019AE90 0x3C043F00//Speed2,EnableBeforeIngameOnly _C0 30 FPS v2 [Default] _L 0xE0040000 0x0002574C _L 0x2002574C 0x14A0001A//FPS _L 0x201A0358 0xE60C0034//WritesSpeed1 _L 0x204F08BC 0x3D088888//Speed1 _L 0x2019AE90 0x3C043F80//Speed2,EnableBeforeIngameOnly ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULUS10328.ini ================================================ _S ULUS-10328 _G FlatOut - Head On [USA] _C0 60 FPS _L 0x006FC0F0 0x00000000 _C0 30 FPS [Default] _L 0x006FC0F0 0x00000001 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULUS10345.ini ================================================ _S ULUS-10345 _G Star Wars - The Force Unleashed [USA] _C0 60FPS [Fixed] _L 0xE0050002 0x00440664 _L 0x20440664 0x00000000//value _L 0x202B8A14 0x00000000 _L 0x203BB714 0x00000000 _L 0x202B9018 0x00000000 _L 0x203BC09C 0x00000000 _C0 30FPS [Fixed] _L 0xE0050000 0x00440664 _L 0x20440664 0x00000002//value _L 0x202B8A14 0x00000000 _L 0x203BB714 0x00000000 _L 0x202B9018 0x00000000 _L 0x203BC09C 0x00000000 _C0 30/60FPS [Default] _L 0xE0040000 0x002B8A14 _L 0x202B8A14 0xAC930664//30 _L 0x203BB714 0xAC860664//30 _L 0x202B9018 0xAC800664//60 _L 0x203BC09C 0xAC800664//60 _S ULUS-10345 _G Star Wars - The Force Unleashed [USA] _C0 Red overlay FIX _L 0xE001ADAE 0x003E94BE _L 0x203E94BC 0xADA00000 _C0 Red overlay NO-FIX [Default] _L 0xE001ADA0 0x003E94BE _L 0x203E94BC 0xADAE0000 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULUS10390.ini ================================================ _S ULUS-10390 _G Star Wars Battlefront - Elite Squadron [USA] _C0 60 FPS _L 0x20456598 0x42700000 _C0 45 FPS _L 0x20456598 0x42340000 _C0 40 FPS _L 0x20456598 0x42200000 _C0 30 FPS _L 0x20456598 0x41F00000 _C0 20 FPS [Default] _L 0x20456598 0x41A00000 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/Cheats/ULUS10507.ini ================================================ _S ULUS-10507 _G Toy Story 3 [USA] _C1 60 FPS _L 0x202E77CC 0x00000000 _C0 30 FPS [Default] _L 0x202E77CC 0x1080FFFB ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/NPUG80325_ppsspp.ini ================================================ # Game config for NPUG80325 - God of War: Chains of Olympus [General] ForceLagSync2 = False NumWorkerThreads = 8 AutoLoadSaveState = 0 EnableCheats = True CwCheatRefreshRate = 77 ScreenshotsAsPNG = False StateSlot = 0 EnableStateUndo = True RewindFlipFrequency = 0 AutoSaveSymbolMap = False CacheFullIsoInRam = False PauseWhenMinimized = False DumpDecryptedEboots = False MemStickInserted = True [CPU] CPUCore = 1 SeparateSASThread = True SeparateIOThread = True IOTimingMethod = 0 FastMemoryAccess = True FuncReplacements = True PreloadFunctions = False JitDisableFlags = 0x00000000 CPUSpeed = 666 [Graphics] EnableCardboardVR = False CardboardScreenSize = 50 CardboardXShift = 0 CardboardYShift = 0 ShowFPSCounter = 2 RenderingMode = 1 SoftwareRenderer = False HardwareTransform = True SoftwareSkinning = True TextureFiltering = 3 BufferFiltering = 1 InternalResolution = 1 HighQualityDepth = 1 FrameSkip = 1 FrameSkipType = 1 AutoFrameSkip = True FrameRate = 0 FrameRate2 = -1 AnisotropyLevel = 0 VertexDecCache = True TextureBackoffCache = True TextureSecondaryCache = False SmallDisplayZoomType = 2 SmallDisplayOffsetX = 0.500000 SmallDisplayOffsetY = 0.500000 SmallDisplayZoomLevel = 1.000000 ImmersiveMode = False SustainedPerformanceMode = False ReplaceTextures = True SaveNewTextures = False IgnoreTextureFilenames = True TexScalingLevel = 1 TexScalingType = 0 TexDeposterize = False TexHardwareScaling = False VSyncInterval = False BloomHack = 0 SplineBezierQuality = 1 HardwareTessellation = False PostShader = Off MemBlockTransferGPU = True DisableSlowFramebufEffects = True FragmentTestCache = True [Sound] Enable = True AudioBackend = 0 AudioLatency = 1 ExtraAudioBuffering = False SoundSpeedHack = False AudioResampler = False GlobalVolume = 10 AltSpeedVolume = -1 AudioDevice = AutoAudioDevice = False [Control] HapticFeedback = False ShowTouchCross = True ShowTouchCircle = True ShowTouchSquare = True ShowTouchTriangle = True ComboKey0Mapping = 0 ComboKey1Mapping = 0 ComboKey2Mapping = 0 ComboKey3Mapping = 0 ComboKey4Mapping = 0 ShowTouchControls = False DisableDpadDiagonals = False GamepadOnlyFocused = False TouchButtonStyle = 1 TouchButtonOpacity = 65 TouchButtonHideSeconds = 20 AutoCenterTouchAnalog = False ActionButtonSpacing2 = 1.000000 ActionButtonCenterX = 0.937500 ActionButtonCenterY = 0.900000 ActionButtonScale = 1.150000 DPadX = 0.074479 DPadY = 0.760000 DPadScale = 1.150000 ShowTouchDpad = True DPadSpacing = 1.000000 StartKeyX = 0.559896 StartKeyY = 0.942500 StartKeyScale = 1.150000 ShowTouchStart = True SelectKeyX = 0.500000 SelectKeyY = 0.942500 SelectKeyScale = 1.150000 ShowTouchSelect = True UnthrottleKeyX = 0.440104 UnthrottleKeyY = 0.942500 UnthrottleKeyScale = 1.150000 ShowTouchUnthrottle = True LKeyX = 0.035937 LKeyY = 0.635833 LKeyScale = 1.150000 ShowTouchLTrigger = True RKeyX = 0.964063 RKeyY = 0.635833 RKeyScale = 1.150000 ShowTouchRTrigger = True AnalogStickX = 0.074479 AnalogStickY = 0.923333 AnalogStickScale = 1.150000 ShowAnalogStick = True RightAnalogStickX = 0.906250 RightAnalogStickY = 0.872222 RightAnalogStickScale = 1.150000 ShowRightAnalogStick = False fcombo0X = 0.571875 fcombo0Y = 0.500000 comboKeyScale0 = 1.150000 ShowComboKey0 = False fcombo1X = 0.631771 fcombo1Y = 0.500000 comboKeyScale1 = 1.150000 ShowComboKey1 = False fcombo2X = 0.691667 fcombo2Y = 0.500000 comboKeyScale2 = 1.150000 ShowComboKey2 = False fcombo3X = 0.571875 fcombo3Y = 0.333333 comboKeyScale3 = 1.150000 ShowComboKey3 = False fcombo4X = 0.631771 fcombo4Y = 0.333333 comboKeyScale4 = 1.150000 ShowComboKey4 = False Speed1KeyX = 0.440104 Speed1KeyY = 0.885000 Speed1KeyScale = 1.150000 ShowSpeed1Key = False Speed2KeyX = 0.500000 Speed2KeyY = 0.885000 Speed2KeyScale = 1.150000 ShowSpeed2Key = False XInputAnalogSensitivity = 1.000000 AnalogLimiterDeadzone = 0.600000 UseMouse = False MapMouse = False ConfineMap = False MouseSensitivity = 0.100000 MouseSmoothing = 0.900000 [Network] EnableWlan = False EnableAdhocServer = False [SystemParam] PSPModel = 0 PSPFirmwareVersion = 660 NickName = PPSSPP proAdhocServer = black-seraph.com MacAddress = 4e:7a:78:d9:49:32 PortOffset = 0 Language = 1 TimeFormat = 1 DateFormat = 1 TimeZone = 0 DayLightSavings = False ButtonPreference = 1 LockParentalLevel = 0 WlanAdhocChannel = 0 WlanPowerSave = False EncryptSave = True [ControlMapping] Up = 1-19,10-19 Down = 1-20,10-20 Left = 1-21,10-21 Right = 1-22,10-22 Circle = 1-52,10-190 Cross = 1-54,10-189 Square = 1-29,10-191 Triangle = 1-47,10-188 Start = 1-62,10-197 Select = 1-66,10-196 L = 1-45,10-193 R = 1-51,10-192 An.Up = 1-37,10-4003 An.Down = 1-39,10-4002 An.Left = 1-38,10-4001 An.Right = 1-40,10-4000 Analog limiter = 1-60 RapidFire = 1-59 Unthrottle = 1-61 SpeedToggle = 1-68 Pause = 1-111 Rewind = 1-67 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/UCES00422_ppsspp.ini ================================================ # Game config for UCES00422 - RIDGE RACER 2 [General] ForceLagSync2 = False NumWorkerThreads = 6 AutoLoadSaveState = 0 EnableCheats = False CwCheatRefreshRate = 77 ScreenshotsAsPNG = False StateSlot = 0 EnableStateUndo = True RewindFlipFrequency = 0 AutoSaveSymbolMap = False CacheFullIsoInRam = False PauseWhenMinimized = False DumpDecryptedEboots = False MemStickInserted = True [CPU] CPUCore = 1 SeparateSASThread = True SeparateIOThread = True IOTimingMethod = 0 FastMemoryAccess = True FuncReplacements = True PreloadFunctions = False JitDisableFlags = 0x00000000 CPUSpeed = 333 [Graphics] ShowFPSCounter = 2 RenderingMode = 1 SoftwareRenderer = False HardwareTransform = True SoftwareSkinning = True TextureFiltering = 2 BufferFiltering = 1 InternalResolution = 1 HighQualityDepth = 1 FrameSkip = 0 FrameSkipType = 1 AutoFrameSkip = False FrameRate = 0 FrameRate2 = -1 AnisotropyLevel = 0 VertexDecCache = True TextureBackoffCache = True TextureSecondaryCache = False SmallDisplayZoomType = 2 SmallDisplayOffsetX = 0.500000 SmallDisplayOffsetY = 0.500000 SmallDisplayZoomLevel = 1.000000 ImmersiveMode = False SustainedPerformanceMode = False ReplaceTextures = True SaveNewTextures = False IgnoreTextureFilenames = False TexScalingLevel = 1 TexScalingType = 0 TexDeposterize = False VSyncInterval = False BloomHack = 0 SplineBezierQuality = 1 HardwareTessellation = False PostShader = Off MemBlockTransferGPU = True DisableSlowFramebufEffects = True FragmentTestCache = True [Sound] Enable = True AudioBackend = 0 AudioLatency = 1 ExtraAudioBuffering = False SoundSpeedHack = False AudioResampler = False GlobalVolume = 10 AltSpeedVolume = -1 AudioDevice = AutoAudioDevice = False [Control] HapticFeedback = False ShowTouchCross = True ShowTouchCircle = True ShowTouchSquare = True ShowTouchTriangle = True ComboKey0Mapping = 0 ComboKey1Mapping = 0 ComboKey2Mapping = 0 ComboKey3Mapping = 0 ComboKey4Mapping = 0 ShowTouchControls = False DisableDpadDiagonals = False GamepadOnlyFocused = False TouchButtonStyle = 1 TouchButtonOpacity = 65 TouchButtonHideSeconds = 20 AutoCenterTouchAnalog = False ActionButtonSpacing2 = 1.000000 ActionButtonCenterX = 0.906250 ActionButtonCenterY = 0.833333 ActionButtonScale = 1.150000 DPadX = 0.111719 DPadY = 0.600000 DPadScale = 1.150000 ShowTouchDpad = True DPadSpacing = 1.000000 StartKeyX = 0.589844 StartKeyY = 0.904167 StartKeyScale = 1.150000 ShowTouchStart = True SelectKeyX = 0.500000 SelectKeyY = 0.904167 SelectKeyScale = 1.150000 ShowTouchSelect = True UnthrottleKeyX = 0.410156 UnthrottleKeyY = 0.904167 UnthrottleKeyScale = 1.150000 ShowTouchUnthrottle = True LKeyX = 0.053906 LKeyY = 0.393056 LKeyScale = 1.150000 ShowTouchLTrigger = True RKeyX = 0.946094 RKeyY = 0.393056 RKeyScale = 1.150000 ShowTouchRTrigger = True AnalogStickX = 0.111719 AnalogStickY = 0.872222 AnalogStickScale = 1.150000 ShowAnalogStick = True RightAnalogStickX = 0.906250 RightAnalogStickY = 0.872222 RightAnalogStickScale = 1.150000 ShowRightAnalogStick = False fcombo0X = 0.607813 fcombo0Y = 0.500000 comboKeyScale0 = 1.150000 ShowComboKey0 = False fcombo1X = 0.697656 fcombo1Y = 0.500000 comboKeyScale1 = 1.150000 ShowComboKey1 = False fcombo2X = 0.787500 fcombo2Y = 0.500000 comboKeyScale2 = 1.150000 ShowComboKey2 = False fcombo3X = 0.607813 fcombo3Y = 0.333333 comboKeyScale3 = 1.150000 ShowComboKey3 = False fcombo4X = 0.697656 fcombo4Y = 0.333333 comboKeyScale4 = 1.150000 ShowComboKey4 = False Speed1KeyX = 0.410156 Speed1KeyY = 0.808333 Speed1KeyScale = 1.150000 ShowSpeed1Key = False Speed2KeyX = 0.500000 Speed2KeyY = 0.808333 Speed2KeyScale = 1.150000 ShowSpeed2Key = False XInputAnalogSensitivity = 1.000000 AnalogLimiterDeadzone = 0.600000 UseMouse = False MapMouse = False ConfineMap = False MouseSensitivity = 0.100000 MouseSmoothing = 0.900000 [Network] EnableWlan = False EnableAdhocServer = False [SystemParam] PSPModel = 0 PSPFirmwareVersion = 660 NickName = PPSSPP proAdhocServer = black-seraph.com MacAddress = 07:26:4f:78:37:24 PortOffset = 0 Language = 1 TimeFormat = 1 DateFormat = 1 TimeZone = 0 DayLightSavings = False ButtonPreference = 1 LockParentalLevel = 0 WlanAdhocChannel = 0 WlanPowerSave = False EncryptSave = True [ControlMapping] Up = 1-19,10-19 Down = 1-20,10-20 Left = 1-21,10-21 Right = 1-22,10-22 Circle = 1-52,10-190 Cross = 1-54,10-189 Square = 1-29,10-191 Triangle = 1-47,10-188 Start = 1-62,10-197 Select = 1-66,10-196 L = 1-45,10-193 R = 1-51,10-192 An.Up = 1-37,10-4003 An.Down = 1-39,10-4002 An.Left = 1-38,10-4001 An.Right = 1-40,10-4000 Analog limiter = 1-60 RapidFire = 1-59 Unthrottle = 1-61 SpeedToggle = 1-68 Pause = 1-111 Rewind = 1-67 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/UCUS98737_ppsspp.ini ================================================ # Game config for UCUS98737 - God of War®: Ghost of Sparta [General] ForceLagSync2 = False NumWorkerThreads = 8 AutoLoadSaveState = 0 EnableCheats = True CwCheatRefreshRate = 77 ScreenshotsAsPNG = False StateSlot = 0 EnableStateUndo = True RewindFlipFrequency = 0 AutoSaveSymbolMap = False CacheFullIsoInRam = False PauseWhenMinimized = False DumpDecryptedEboots = False MemStickInserted = True [CPU] CPUCore = 1 SeparateSASThread = True SeparateIOThread = True IOTimingMethod = 0 FastMemoryAccess = True FuncReplacements = True PreloadFunctions = False JitDisableFlags = 0x00000000 CPUSpeed = 666 [Graphics] EnableCardboardVR = False CardboardScreenSize = 50 CardboardXShift = 0 CardboardYShift = 0 ShowFPSCounter = 2 RenderingMode = 1 SoftwareRenderer = False HardwareTransform = True SoftwareSkinning = True TextureFiltering = 3 BufferFiltering = 1 InternalResolution = 1 HighQualityDepth = 1 FrameSkip = 1 FrameSkipType = 1 AutoFrameSkip = True FrameRate = 0 FrameRate2 = -1 AnisotropyLevel = 0 VertexDecCache = True TextureBackoffCache = True TextureSecondaryCache = False SmallDisplayZoomType = 2 SmallDisplayOffsetX = 0.500000 SmallDisplayOffsetY = 0.500000 SmallDisplayZoomLevel = 1.000000 ImmersiveMode = False SustainedPerformanceMode = False ReplaceTextures = True SaveNewTextures = False IgnoreTextureFilenames = True TexScalingLevel = 1 TexScalingType = 0 TexDeposterize = False TexHardwareScaling = False VSyncInterval = False BloomHack = 0 SplineBezierQuality = 1 HardwareTessellation = False PostShader = Off MemBlockTransferGPU = True DisableSlowFramebufEffects = True FragmentTestCache = True [Sound] Enable = True AudioBackend = 0 AudioLatency = 1 ExtraAudioBuffering = False SoundSpeedHack = False AudioResampler = False GlobalVolume = 10 AltSpeedVolume = -1 AudioDevice = AutoAudioDevice = False [Control] HapticFeedback = False ShowTouchCross = True ShowTouchCircle = True ShowTouchSquare = True ShowTouchTriangle = True ComboKey0Mapping = 0 ComboKey1Mapping = 0 ComboKey2Mapping = 0 ComboKey3Mapping = 0 ComboKey4Mapping = 0 ShowTouchControls = False DisableDpadDiagonals = False GamepadOnlyFocused = False TouchButtonStyle = 1 TouchButtonOpacity = 65 TouchButtonHideSeconds = 20 AutoCenterTouchAnalog = False ActionButtonSpacing2 = 1.000000 ActionButtonCenterX = 0.937500 ActionButtonCenterY = 0.900000 ActionButtonScale = 1.150000 DPadX = 0.074479 DPadY = 0.760000 DPadScale = 1.150000 ShowTouchDpad = True DPadSpacing = 1.000000 StartKeyX = 0.559896 StartKeyY = 0.942500 StartKeyScale = 1.150000 ShowTouchStart = True SelectKeyX = 0.500000 SelectKeyY = 0.942500 SelectKeyScale = 1.150000 ShowTouchSelect = True UnthrottleKeyX = 0.440104 UnthrottleKeyY = 0.942500 UnthrottleKeyScale = 1.150000 ShowTouchUnthrottle = True LKeyX = 0.035937 LKeyY = 0.635833 LKeyScale = 1.150000 ShowTouchLTrigger = True RKeyX = 0.964063 RKeyY = 0.635833 RKeyScale = 1.150000 ShowTouchRTrigger = True AnalogStickX = 0.074479 AnalogStickY = 0.923333 AnalogStickScale = 1.150000 ShowAnalogStick = True RightAnalogStickX = 0.906250 RightAnalogStickY = 0.872222 RightAnalogStickScale = 1.150000 ShowRightAnalogStick = False fcombo0X = 0.571875 fcombo0Y = 0.500000 comboKeyScale0 = 1.150000 ShowComboKey0 = False fcombo1X = 0.631771 fcombo1Y = 0.500000 comboKeyScale1 = 1.150000 ShowComboKey1 = False fcombo2X = 0.691667 fcombo2Y = 0.500000 comboKeyScale2 = 1.150000 ShowComboKey2 = False fcombo3X = 0.571875 fcombo3Y = 0.333333 comboKeyScale3 = 1.150000 ShowComboKey3 = False fcombo4X = 0.631771 fcombo4Y = 0.333333 comboKeyScale4 = 1.150000 ShowComboKey4 = False Speed1KeyX = 0.440104 Speed1KeyY = 0.885000 Speed1KeyScale = 1.150000 ShowSpeed1Key = False Speed2KeyX = 0.500000 Speed2KeyY = 0.885000 Speed2KeyScale = 1.150000 ShowSpeed2Key = False XInputAnalogSensitivity = 1.000000 AnalogLimiterDeadzone = 0.600000 UseMouse = False MapMouse = False ConfineMap = False MouseSensitivity = 0.100000 MouseSmoothing = 0.900000 [Network] EnableWlan = False EnableAdhocServer = False [SystemParam] PSPModel = 0 PSPFirmwareVersion = 660 NickName = PPSSPP proAdhocServer = black-seraph.com MacAddress = 4e:7a:78:d9:49:32 PortOffset = 0 Language = 1 TimeFormat = 1 DateFormat = 1 TimeZone = 0 DayLightSavings = False ButtonPreference = 1 LockParentalLevel = 0 WlanAdhocChannel = 0 WlanPowerSave = False EncryptSave = True [ControlMapping] Up = 1-19,10-19 Down = 1-20,10-20 Left = 1-21,10-21 Right = 1-22,10-22 Circle = 1-52,10-190 Cross = 1-54,10-189 Square = 1-29,10-191 Triangle = 1-47,10-188 Start = 1-62,10-197 Select = 1-66,10-196 L = 1-45,10-193 R = 1-51,10-192 An.Up = 1-37,10-4003 An.Down = 1-39,10-4002 An.Left = 1-38,10-4001 An.Right = 1-40,10-4000 Analog limiter = 1-60 RapidFire = 1-59 Unthrottle = 1-61 SpeedToggle = 1-68 Pause = 1-111 Rewind = 1-67 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/ULUS10001_ppsspp.ini ================================================ # Game config for ULUS10001 - RIDGE RACER [General] ForceLagSync2 = False NumWorkerThreads = 6 AutoLoadSaveState = 0 EnableCheats = False CwCheatRefreshRate = 77 ScreenshotsAsPNG = False StateSlot = 0 EnableStateUndo = True RewindFlipFrequency = 0 AutoSaveSymbolMap = False CacheFullIsoInRam = False PauseWhenMinimized = False DumpDecryptedEboots = False MemStickInserted = True [CPU] CPUCore = 1 SeparateSASThread = True SeparateIOThread = True IOTimingMethod = 0 FastMemoryAccess = True FuncReplacements = True PreloadFunctions = False JitDisableFlags = 0x00000000 CPUSpeed = 333 [Graphics] ShowFPSCounter = 2 RenderingMode = 1 SoftwareRenderer = False HardwareTransform = True SoftwareSkinning = True TextureFiltering = 2 BufferFiltering = 1 InternalResolution = 1 HighQualityDepth = 1 FrameSkip = 0 FrameSkipType = 1 AutoFrameSkip = False FrameRate = 0 FrameRate2 = -1 AnisotropyLevel = 0 VertexDecCache = True TextureBackoffCache = True TextureSecondaryCache = False SmallDisplayZoomType = 2 SmallDisplayOffsetX = 0.500000 SmallDisplayOffsetY = 0.500000 SmallDisplayZoomLevel = 1.000000 ImmersiveMode = False SustainedPerformanceMode = False ReplaceTextures = True SaveNewTextures = False IgnoreTextureFilenames = False TexScalingLevel = 1 TexScalingType = 0 TexDeposterize = False TexHardwareScaling = False VSyncInterval = False BloomHack = 0 SplineBezierQuality = 1 HardwareTessellation = False PostShader = Off MemBlockTransferGPU = True DisableSlowFramebufEffects = True FragmentTestCache = True [Sound] Enable = True AudioBackend = 0 AudioLatency = 1 ExtraAudioBuffering = False SoundSpeedHack = False AudioResampler = False GlobalVolume = 10 AltSpeedVolume = -1 AudioDevice = AutoAudioDevice = False [Control] HapticFeedback = False ShowTouchCross = True ShowTouchCircle = True ShowTouchSquare = True ShowTouchTriangle = True ComboKey0Mapping = 0 ComboKey1Mapping = 0 ComboKey2Mapping = 0 ComboKey3Mapping = 0 ComboKey4Mapping = 0 ShowTouchControls = False DisableDpadDiagonals = False GamepadOnlyFocused = False TouchButtonStyle = 1 TouchButtonOpacity = 65 TouchButtonHideSeconds = 20 AutoCenterTouchAnalog = False ActionButtonSpacing2 = 1.000000 ActionButtonCenterX = 0.906250 ActionButtonCenterY = 0.833333 ActionButtonScale = 1.150000 DPadX = 0.111719 DPadY = 0.600000 DPadScale = 1.150000 ShowTouchDpad = True DPadSpacing = 1.000000 StartKeyX = 0.589844 StartKeyY = 0.904167 StartKeyScale = 1.150000 ShowTouchStart = True SelectKeyX = 0.500000 SelectKeyY = 0.904167 SelectKeyScale = 1.150000 ShowTouchSelect = True UnthrottleKeyX = 0.410156 UnthrottleKeyY = 0.904167 UnthrottleKeyScale = 1.150000 ShowTouchUnthrottle = True LKeyX = 0.053906 LKeyY = 0.393056 LKeyScale = 1.150000 ShowTouchLTrigger = True RKeyX = 0.946094 RKeyY = 0.393056 RKeyScale = 1.150000 ShowTouchRTrigger = True AnalogStickX = 0.111719 AnalogStickY = 0.872222 AnalogStickScale = 1.150000 ShowAnalogStick = True RightAnalogStickX = 0.906250 RightAnalogStickY = 0.872222 RightAnalogStickScale = 1.150000 ShowRightAnalogStick = False fcombo0X = 0.607813 fcombo0Y = 0.500000 comboKeyScale0 = 1.150000 ShowComboKey0 = False fcombo1X = 0.697656 fcombo1Y = 0.500000 comboKeyScale1 = 1.150000 ShowComboKey1 = False fcombo2X = 0.787500 fcombo2Y = 0.500000 comboKeyScale2 = 1.150000 ShowComboKey2 = False fcombo3X = 0.607813 fcombo3Y = 0.333333 comboKeyScale3 = 1.150000 ShowComboKey3 = False fcombo4X = 0.697656 fcombo4Y = 0.333333 comboKeyScale4 = 1.150000 ShowComboKey4 = False Speed1KeyX = 0.410156 Speed1KeyY = 0.808333 Speed1KeyScale = 1.150000 ShowSpeed1Key = False Speed2KeyX = 0.500000 Speed2KeyY = 0.808333 Speed2KeyScale = 1.150000 ShowSpeed2Key = False XInputAnalogSensitivity = 1.000000 AnalogLimiterDeadzone = 0.600000 UseMouse = False MapMouse = False ConfineMap = False MouseSensitivity = 0.100000 MouseSmoothing = 0.900000 [Network] EnableWlan = False EnableAdhocServer = False [SystemParam] PSPModel = 0 PSPFirmwareVersion = 660 NickName = PPSSPP proAdhocServer = black-seraph.com MacAddress = 07:26:4f:78:37:24 PortOffset = 0 Language = 1 TimeFormat = 1 DateFormat = 1 TimeZone = 0 DayLightSavings = False ButtonPreference = 1 LockParentalLevel = 0 WlanAdhocChannel = 0 WlanPowerSave = False EncryptSave = True [ControlMapping] Up = 1-19,10-19 Down = 1-20,10-20 Left = 1-21,10-21 Right = 1-22,10-22 Circle = 1-52,10-190 Cross = 1-54,10-189 Square = 1-29,10-191 Triangle = 1-47,10-188 Start = 1-62,10-197 Select = 1-66,10-196 L = 1-45,10-193 R = 1-51,10-192 An.Up = 1-37,10-4003 An.Down = 1-39,10-4002 An.Left = 1-38,10-4001 An.Right = 1-40,10-4000 Analog limiter = 1-60 RapidFire = 1-59 Unthrottle = 1-61 SpeedToggle = 1-68 Pause = 1-111 Rewind = 1-67 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/ULUS10064_ppsspp.ini ================================================ [General] ForceLagSync = False NumWorkerThreads = 8 AutoLoadSaveState = 0 EnableCheats = True CwCheatRefreshRate = 77 ScreenshotsAsPNG = False StateSlot = 0 EnableStateUndo = True RewindFlipFrequency = 0 AutoSaveSymbolMap = False CacheFullIsoInRam = False PauseWhenMinimized = False DumpDecryptedEboots = False MemStickInserted = True [CPU] CPUCore = 1 SeparateSASThread = True SeparateIOThread = True IOTimingMethod = 0 FastMemoryAccess = True FuncReplacements = True PreloadFunctions = False CPUSpeed = 666 [Graphics] EnableCardboard = False CardboardScreenSize = 50 CardboardXShift = 0 CardboardYShift = 0 ShowFPSCounter = 2 RenderingMode = 0 SoftwareRenderer = False HardwareTransform = True SoftwareSkinning = True TextureFiltering = 2 BufferFiltering = 1 InternalResolution = 2 HighQualityDepth = 1 FrameSkip = 0 FrameSkipType = 1 AutoFrameSkip = False FrameRate = 0 FrameRate2 = -1 ForceMaxEmulatedFPS = 60 AnisotropyLevel = 0 VertexDecCache = True TextureBackoffCache = True TextureSecondaryCache = False SmallDisplayZoomType = 2 SmallDisplayOffsetX = 0.500000 SmallDisplayOffsetY = 0.500000 SmallDisplayZoomLevel = 1.000000 ImmersiveMode = False SustainedPerformanceMode = False TrueColor = True ReplaceTextures = True SaveNewTextures = False TexScalingLevel = 1 TexScalingType = 0 TexDeposterize = False VSyncInterval = False DisableStencilTest = False BloomHack = 0 TimerHack = False SplineBezierQuality = 1 HardwareTessellation = False PostShader = Off MemBlockTransferGPU = True DisableSlowFramebufEffects = True FragmentTestCache = True [Sound] Enable = True AudioBackend = 0 AudioLatency = 1 ExtraAudioBuffering = False SoundSpeedHack = False AudioResampler = False GlobalVolume = 10 AltSpeedVolume = -1 AudioDevice = AutoAudioDevice = False [Control] HapticFeedback = False ShowTouchCross = True ShowTouchCircle = True ShowTouchSquare = True ShowTouchTriangle = True ComboKey0Mapping = 0 ComboKey1Mapping = 0 ComboKey2Mapping = 0 ComboKey3Mapping = 0 ComboKey4Mapping = 0 ShowTouchControls = False DisableDpadDiagonals = False GamepadOnlyFocused = False TouchButtonStyle = 1 TouchButtonOpacity = 65 TouchButtonHideSeconds = 20 AutoCenterTouchAnalog = False ActionButtonSpacing2 = 1.000000 ActionButtonCenterX = 0.937500 ActionButtonCenterY = 0.900000 ActionButtonScale = 1.150000 DPadX = 0.074479 DPadY = 0.760000 DPadScale = 1.150000 ShowTouchDpad = True DPadSpacing = 1.000000 StartKeyX = 0.559896 StartKeyY = 0.942500 StartKeyScale = 1.150000 ShowTouchStart = True SelectKeyX = 0.500000 SelectKeyY = 0.942500 SelectKeyScale = 1.150000 ShowTouchSelect = True UnthrottleKeyX = 0.440104 UnthrottleKeyY = 0.942500 UnthrottleKeyScale = 1.150000 ShowTouchUnthrottle = True LKeyX = 0.035937 LKeyY = 0.635833 LKeyScale = 1.150000 ShowTouchLTrigger = True RKeyX = 0.964063 RKeyY = 0.635833 RKeyScale = 1.150000 ShowTouchRTrigger = True AnalogStickX = 0.074479 AnalogStickY = 0.923333 AnalogStickScale = 1.150000 ShowAnalogStick = True fcombo0X = 0.571875 fcombo0Y = 0.500000 comboKeyScale0 = 1.150000 ShowComboKey0 = False fcombo1X = 0.631771 fcombo1Y = 0.500000 comboKeyScale1 = 1.150000 ShowComboKey1 = False fcombo2X = 0.691667 fcombo2Y = 0.500000 comboKeyScale2 = 1.150000 ShowComboKey2 = False fcombo3X = 0.571875 fcombo3Y = 0.333333 comboKeyScale3 = 1.150000 ShowComboKey3 = False fcombo4X = 0.631771 fcombo4Y = 0.333333 comboKeyScale4 = 1.150000 ShowComboKey4 = False Speed1KeyX = 0.440104 Speed1KeyY = 0.885000 Speed1KeyScale = 1.150000 ShowSpeed1Key = False Speed2KeyX = 0.500000 Speed2KeyY = 0.885000 Speed2KeyScale = 1.150000 ShowSpeed2Key = False XInputAnalogSensitivity = 1.000000 AnalogLimiterDeadzone = 0.600000 UseMouse = False MapMouse = False ConfineMap = False MouseSensitivity = 0.100000 MouseSmoothing = 0.900000 [Network] EnableWlan = False EnableAdhocServer = False [SystemParam] PSPModel = 0 PSPFirmwareVersion = 660 NickName = PPSSPP proAdhocServer = black-seraph.com MacAddress = 4e:7a:78:d9:49:32 PortOffset = 0 Language = 1 TimeFormat = 1 DateFormat = 1 TimeZone = 0 DayLightSavings = False ButtonPreference = 1 LockParentalLevel = 0 WlanAdhocChannel = 0 WlanPowerSave = False EncryptSave = True [Debugger] [JIT] [Upgrade] [Theme] [ControlMapping] Up = 1-19,10-19 Down = 1-20,10-20 Left = 1-21,10-21 Right = 1-22,10-22 Circle = 1-52,10-190 Cross = 1-54,10-189 Square = 1-29,10-191 Triangle = 1-47,10-188 Start = 1-62,10-197 Select = 1-66,10-196 L = 1-45,10-194 R = 1-51,10-195 An.Up = 1-37,10-4003 An.Down = 1-39,10-4002 An.Left = 1-38,10-4001 An.Right = 1-40,10-4000 Analog limiter = 1-60 RapidFire = 1-59 Unthrottle = 1-61 SpeedToggle = 1-68 Pause = 1-111 Rewind = 1-67 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/controls.ini ================================================ [ControlMapping] Up = 1-19,10-19 Down = 1-20,10-20 Left = 1-21,10-21 Right = 1-22,10-22 Circle = 1-54,10-189 Cross = 1-52,10-190 Square = 1-47,10-188 Triangle = 1-29,10-191 Start = 1-62,10-197 Select = 1-66,10-196 L = 1-45,10-193 R = 1-51,10-192 An.Up = 1-37,10-4003 An.Down = 1-39,10-4002 An.Left = 1-38,10-4001 An.Right = 1-40,10-4000 Analog limiter = 1-60 RapidFire = 1-59 Unthrottle = 1-61 SpeedToggle = 1-68 Pause = 1-111 Rewind = 1-67 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/config/PSP/SYSTEM/ppsspp.ini ================================================ [General] FirstRun = False RunCount = 1 Enable Logging = False AutoRun = True Browse = False IgnoreBadMemAccess = True CurrentDirectory = /storage/roms/psp ShowDebuggerOnLoad = False CheckForNewVersion = False Language = en_US ForceLagSync = False DiscordPresence = False NumWorkerThreads = 8 AutoLoadSaveState = 0 EnableCheats = True CwCheatRefreshRate = 77 ScreenshotsAsPNG = False UseFFV1 = False DumpFrames = False DumpAudio = False SaveLoadResetsAVdumping = False StateSlot = 0 EnableStateUndo = True RewindFlipFrequency = 0 GridView1 = True GridView2 = True GridView3 = False ComboMode = 0 ReportingHost = default AutoSaveSymbolMap = False CacheFullIsoInRam = False RemoteISOPort = 0 LastRemoteISOServer = LastRemoteISOPort = 0 RemoteISOManualConfig = False RemoteShareOnStartup = False RemoteISOSubdir = / RemoteDebuggerOnStartup = False InternalScreenRotation = 1 PauseWhenMinimized = False DumpDecryptedEboots = False MemStickInserted = True ForceLagSync2 = False [CPU] CPUCore = 1 SeparateSASThread = True SeparateIOThread = True IOTimingMethod = 0 FastMemoryAccess = True FuncReplacements = True HideSlowWarnings = False HideStateWarnings = False PreloadFunctions = False CPUSpeed = 666 JitDisableFlags = 0x00000000 [Graphics] EnableCardboard = False CardboardScreenSize = 50 CardboardXShift = 0 CardboardYShift = 0 ShowFPSCounter = 2 GraphicsBackend = 0 FailedGraphicsBackends = VulkanDevice = RenderingMode = 1 SoftwareRenderer = False HardwareTransform = True SoftwareSkinning = True TextureFiltering = 3 BufferFiltering = 1 InternalResolution = 2 AndroidHwScale = 1 HighQualityDepth = 1 FrameSkip = 1 FrameSkipType = 1 AutoFrameSkip = True FrameRate = 0 FrameRate2 = -1 FrameSkipUnthrottle = True ForceMaxEmulatedFPS = 60 AnisotropyLevel = 0 VertexDecCache = True TextureBackoffCache = True TextureSecondaryCache = False FullScreen = False FullScreenMulti = False SmallDisplayZoomType = 2 SmallDisplayOffsetX = 0.500000 SmallDisplayOffsetY = 0.500000 SmallDisplayZoomLevel = 1.000000 ImmersiveMode = False SustainedPerformanceMode = False TrueColor = True ReplaceTextures = True SaveNewTextures = False IgnoreTextureFilenames = True TexScalingLevel = 1 TexScalingType = 0 TexDeposterize = False VSyncInterval = False DisableStencilTest = False BloomHack = 0 TimerHack = False SplineBezierQuality = 1 HardwareTessellation = False PostShader = Off MemBlockTransferGPU = True DisableSlowFramebufEffects = True FragmentTestCache = True LogFrameDrops = False [Sound] Enable = True AudioBackend = 0 AudioLatency = 1 ExtraAudioBuffering = False SoundSpeedHack = False AudioResampler = False GlobalVolume = 10 AltSpeedVolume = -1 AudioDevice = AutoAudioDevice = False [Control] HapticFeedback = False ShowTouchCross = True ShowTouchCircle = True ShowTouchSquare = True ShowTouchTriangle = True ComboKey0Mapping = 0 ComboKey1Mapping = 0 ComboKey2Mapping = 0 ComboKey3Mapping = 0 ComboKey4Mapping = 0 ShowTouchPause = False ShowTouchControls = False DisableDpadDiagonals = False GamepadOnlyFocused = False TouchButtonStyle = 1 TouchButtonOpacity = 65 TouchButtonHideSeconds = 20 AutoCenterTouchAnalog = False ActionButtonSpacing2 = 1.000000 ActionButtonCenterX = 0.937500 ActionButtonCenterY = 0.900000 ActionButtonScale = 1.150000 DPadX = 0.074479 DPadY = 0.760000 DPadScale = 1.150000 ShowTouchDpad = True DPadSpacing = 1.000000 StartKeyX = 0.559896 StartKeyY = 0.942500 StartKeyScale = 1.150000 ShowTouchStart = True SelectKeyX = 0.500000 SelectKeyY = 0.942500 SelectKeyScale = 1.150000 ShowTouchSelect = True UnthrottleKeyX = 0.440104 UnthrottleKeyY = 0.942500 UnthrottleKeyScale = 1.150000 ShowTouchUnthrottle = True LKeyX = 0.035937 LKeyY = 0.635833 LKeyScale = 1.150000 ShowTouchLTrigger = True RKeyX = 0.964063 RKeyY = 0.635833 RKeyScale = 1.150000 ShowTouchRTrigger = True AnalogStickX = 0.074479 AnalogStickY = 0.923333 AnalogStickScale = 1.150000 ShowAnalogStick = True fcombo0X = 0.571875 fcombo0Y = 0.500000 comboKeyScale0 = 1.150000 ShowComboKey0 = False fcombo1X = 0.631771 fcombo1Y = 0.500000 comboKeyScale1 = 1.150000 ShowComboKey1 = False fcombo2X = 0.691667 fcombo2Y = 0.500000 comboKeyScale2 = 1.150000 ShowComboKey2 = False fcombo3X = 0.571875 fcombo3Y = 0.333333 comboKeyScale3 = 1.150000 ShowComboKey3 = False fcombo4X = 0.631771 fcombo4Y = 0.333333 comboKeyScale4 = 1.150000 ShowComboKey4 = False Speed1KeyX = 0.440104 Speed1KeyY = 0.885000 Speed1KeyScale = 1.150000 ShowSpeed1Key = False Speed2KeyX = 0.500000 Speed2KeyY = 0.885000 Speed2KeyScale = 1.150000 ShowSpeed2Key = False XInputAnalogSensitivity = 1.000000 AnalogLimiterDeadzone = 0.600000 UseMouse = False MapMouse = False ConfineMap = False MouseSensitivity = 0.100000 MouseSmoothing = 0.900000 [Network] EnableWlan = False EnableAdhocServer = False [SystemParam] PSPModel = 0 PSPFirmwareVersion = 660 NickName = PPSSPP proAdhocServer = black-seraph.com MacAddress = 4e:7a:78:d9:49:32 PortOffset = 0 Language = 1 TimeFormat = 1 DateFormat = 1 TimeZone = 0 DayLightSavings = False ButtonPreference = 1 LockParentalLevel = 0 WlanAdhocChannel = 0 WlanPowerSave = False EncryptSave = True SavedataUpgradeVersion = True [Debugger] DisasmWindowX = -1 DisasmWindowY = -1 DisasmWindowW = -1 DisasmWindowH = -1 GEWindowX = -1 GEWindowY = -1 GEWindowW = -1 GEWindowH = -1 ConsoleWindowX = -1 ConsoleWindowY = -1 FontWidth = 8 FontHeight = 12 DisplayStatusBar = True ShowBottomTabTitles = True ShowDeveloperMenu = False SkipDeadbeefFilling = False FuncHashMap = False [JIT] [Upgrade] UpgradeMessage = UpgradeVersion = DismissedVersion = [Theme] ItemStyleFg = 0xffffffff ItemStyleBg = 0x55000000 ItemFocusedStyleFg = 0xffffffff ItemFocusedStyleBg = 0xffedc24c ItemDownStyleFg = 0xffffffff ItemDownStyleBg = 0xffbd9939 ItemDisabledStyleFg = 0x80eeeeee ItemDisabledStyleBg = 0x55e0d4af ItemHighlightedStyleFg = 0xffffffff ItemHighlightedStyleBg = 0x55bdbb39 ButtonStyleFg = 0xffffffff ButtonStyleBg = 0x55000000 ButtonFocusedStyleFg = 0xffffffff ButtonFocusedStyleBg = 0xffedc24c ButtonDownStyleFg = 0xffffffff ButtonDownStyleBg = 0xffbd9939 ButtonDisabledStyleFg = 0x80eeeeee ButtonDisabledStyleBg = 0x55e0d4af ButtonHighlightedStyleFg = 0xffffffff ButtonHighlightedStyleBg = 0x55bdbb39 HeaderStyleFg = 0xffffffff InfoStyleFg = 0xffffffff InfoStyleBg = 0x00000000 PopupTitleStyleFg = 0xffe3be59 PopupStyleFg = 0xffffffff PopupStyleBg = 0xff303030 [Recent] MaxRecent = 30 FileName0 = [PinnedPaths] [Log] SYSTEMEnabled = True SYSTEMLevel = 4 BOOTEnabled = True BOOTLevel = 4 COMMONEnabled = True COMMONLevel = 4 CPUEnabled = True CPULevel = 4 FILESYSEnabled = True FILESYSLevel = 4 G3DEnabled = True G3DLevel = 4 HLEEnabled = True HLELevel = 4 JITEnabled = True JITLevel = 4 LOADEREnabled = True LOADERLevel = 4 MEEnabled = True MELevel = 4 MEMMAPEnabled = True MEMMAPLevel = 4 SASMIXEnabled = True SASMIXLevel = 4 SAVESTATEEnabled = True SAVESTATELevel = 4 FRAMEBUFEnabled = True FRAMEBUFLevel = 4 SCEAUDIOEnabled = True SCEAUDIOLevel = 4 SCECTRLEnabled = True SCECTRLLevel = 4 SCEDISPEnabled = True SCEDISPLevel = 4 SCEFONTEnabled = True SCEFONTLevel = 4 SCEGEEnabled = True SCEGELevel = 4 SCEINTCEnabled = True SCEINTCLevel = 4 SCEIOEnabled = True SCEIOLevel = 4 SCEKERNELEnabled = True SCEKERNELLevel = 4 SCEMODULEEnabled = True SCEMODULELevel = 4 SCENETEnabled = True SCENETLevel = 4 SCERTCEnabled = True SCERTCLevel = 4 SCESASEnabled = True SCESASLevel = 4 SCEUTILEnabled = True SCEUTILLevel = 4 SCEMISCEnabled = True SCEMISCLevel = 4 ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="PPSSPPSDL" PKG_VERSION="f8261ae7ff93baa30f94214965547ed0f124da14" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MAME" PKG_SITE="https://github.com/hrydgard/ppsspp" PKG_URL="https://github.com/hrydgard/ppsspp.git" PKG_DEPENDS_TARGET="toolchain ffmpeg libzip libpng SDL2 zlib zip" PKG_SHORTDESC="PPSSPPDL" PKG_LONGDESC="PPSSPP Standalone" GET_HANDLER_SUPPORT="git" PKG_BUILD_FLAGS="-lto" PKG_CMAKE_OPTS_TARGET+="-DUSE_SYSTEM_FFMPEG=ON \ -DUSING_FBDEV=ON \ -DUSING_EGL=OFF \ -DUSING_GLES2=ON \ -DUSING_X11_VULKAN=OFF \ -DUSE_DISCORD=OFF" if [ ${ARCH} == "aarch64" ]; then PKG_CMAKE_OPTS_TARGET+=" -DARM64=ON" else PKG_CMAKE_OPTS_TARGET+=" -DARMV7=ON" fi pre_configure_target() { if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then sed -i "s|include_directories(/usr/include/drm)|include_directories(${SYSROOT_PREFIX}/usr/include/drm)|" ${PKG_BUILD}/CMakeLists.txt fi } pre_make_target() { # fix cross compiling find ${PKG_BUILD} -name flags.make -exec sed -i "s:isystem :I:g" \{} \; find ${PKG_BUILD} -name build.ninja -exec sed -i "s:isystem :I:g" \{} \; } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/*.sh ${INSTALL}/usr/bin cp `find . -name "PPSSPPSDL" | xargs echo` ${INSTALL}/usr/bin/PPSSPPSDL ln -sf /storage/.config/ppsspp/assets ${INSTALL}/usr/bin/assets mkdir -p ${INSTALL}/usr/config/ppsspp/ cp -r `find . -name "assets" | xargs echo` ${INSTALL}/usr/config/ppsspp/ cp -rf ${PKG_DIR}/config/* ${INSTALL}/usr/config/ppsspp/ rm ${INSTALL}/usr/config/ppsspp/assets/gamecontrollerdb.txt ln -sf /storage/.config/SDL-GameControllerDB/gamecontrollerdb.txt ${INSTALL}/usr/config/ppsspp/assets/gamecontrollerdb.txt # redirect some of PSP folders to /storage/roms to keep all the saves and custom files mkdir -p "${INSTALL}/usr/config/ppsspp/PSP" for dir in Cheats PPSSPP_STATE SAVEDATA TEXTURES; do ln -sf "/storage/roms/savestates/PPSSPPSDL/PSP/${dir}" "${INSTALL}/usr/config/ppsspp/PSP/${dir}" done } ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/patches/PPSSPPSDL-05-fix-fmv-stutter.patch ================================================ --- a/Core/HW/MediaEngine.cpp 2024-09-27 22:09:20.909587100 +0200 +++ b/Core/HW/MediaEngine.cpp 2024-09-27 22:15:31.844356931 +0200 @@ -303,7 +303,7 @@ av_dict_free(&open_opt); bool usedFFMPEGFindStreamInfo = false; - if (!SetupStreams() || PSP_CoreParameter().compat.flags().UseFFMPEGFindStreamInfo) { + if (true) { // Fallback to old behavior. Reads too much and corrupts when game doesn't read fast enough. // SetupStreams sometimes work for newer FFmpeg 3.1+ now, but sometimes framerate is missing. WARN_LOG_REPORT_ONCE(setupStreams, Log::ME, "Failed to read valid video stream data from header"); ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/patches/emuelec-paths.patch ================================================ --- a/Core/System.cpp +++ b/Core/System.cpp @@ -599,13 +599,13 @@ case DIRECTORY_PSP: return pspDirectory; case DIRECTORY_CHEATS: - return pspDirectory / "Cheats"; + return Path("/storage/roms/savestates/PPSSPPSDL/PSP/Cheats/"); case DIRECTORY_GAME: - return pspDirectory / "GAME"; + return Path("/storage/roms/savestates/PPSSPPSDL/PSP/GAME/"); case DIRECTORY_SAVEDATA: - return pspDirectory / "SAVEDATA"; + return Path("/storage/roms/savestates/PPSSPPSDL/PSP/SAVEDATA"); case DIRECTORY_SCREENSHOT: - return pspDirectory / "SCREENSHOT"; + return Path("/storage/roms/screenshots"); case DIRECTORY_SYSTEM: return pspDirectory / "SYSTEM"; case DIRECTORY_PAUTH: @@ -615,7 +615,7 @@ case DIRECTORY_DUMP: return pspDirectory / "SYSTEM/DUMP"; case DIRECTORY_SAVESTATE: - return pspDirectory / "PPSSPP_STATE"; + return Path("/storage/roms/savestates/PPSSPPSDL/PSP/PPSSPP_STATE/"); case DIRECTORY_CACHE: return pspDirectory / "SYSTEM/CACHE"; case DIRECTORY_TEXTURES: @@ -630,7 +630,7 @@ case DIRECTORY_VIDEO: return pspDirectory / "VIDEO"; case DIRECTORY_AUDIO: - return pspDirectory / "AUDIO"; + return Path("/storage/roms/savestates/PPSSPPSDL/PSP/AUDIO/"); case DIRECTORY_CUSTOM_SHADERS: return pspDirectory / "shaders"; ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/scripts/ppsspp.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) . /etc/profile ROMSPPSSPPFOLDER=/storage/roms/savestates/PPSSPPSDL/PSP PPSSPPFOLDER=/storage/.config/ppsspp/PSP/ AUTOGP=$(get_ee_setting ppssppsdl_auto_gamepad) CHEEVOS=$(get_ee_setting global.retroachievements) if [[ "${AUTOGP}" == "1" ]]; then set_ppsspp_joy.sh fi if [[ "${CHEEVOS}" == "1" ]]; then ppssppcheevos.sh fi # Make sure we have the correct symlinks for dir in Cheats PPSSPP_STATE SAVEDATA TEXTURES; do mkdir -p "${ROMSPPSSPPFOLDER}" if [ ! -L /storage/.config/ppsspp/PSP/${dir} ]; then cp -rf /storage/.config/ppsspp/PSP/${dir}/. ${ROMSPPSSPPFOLDER}/${dir}/ rm -rf /storage/.config/ppsspp/PSP/${dir} ln -sf ${ROMSPPSSPPFOLDER}/${dir} /storage/.config/ppsspp/PSP/${dir} fi done if [ ! -s "${ROMSPPSSPPFOLDER}/Cheats/cheat.db" ];then mkdir -p "${ROMSPPSSPPFOLDER}/Cheats/" cp -rf /usr/config/ppsspp/PSP/SYSTEM/Cheats/. "${ROMSPPSSPPFOLDER}/Cheats/" CHEAT_DB_VERSION="06d4d6148b66109005f7d51c37e8344f0bc042cc" curl -sLo "${ROMSPPSSPPFOLDER}/Cheats/cheat.db" -f "https://raw.githubusercontent.com/Saramagrean/CWCheat-Database-Plus-/${CHEAT_DB_VERSION}/cheat.db" || true fi ARG=${1//[\\]/} export SDL_AUDIODRIVER=alsa PPSSPPSDL --fullscreen "${ARG}" ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/scripts/ppssppcheevos.sh ================================================ #! /bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Hector Calvarro (https://github.com/kelvfimer) #Script for setting up cheevos on duckstation emuelec. it extracts the data from emuelec.conf and it constructs the entries in seetings.ini if [Cheevos] or Enabled = True or Enable = False are not presented # Source predefined functions and variables . /etc/profile PPSSPP_ACHIEVEMENTS="/storage/.config/ppsspp/PSP/SYSTEM/ppsspp_retroachievements.dat" PPSSPP_INI="/storage/.config/ppsspp/PSP/SYSTEM/ppsspp.ini" #Extract username and password from emuelec.conf username=$(get_ee_setting "global.retroachievements.username") password=$(get_ee_setting "global.retroachievements.password") token=$(grep "cheevos_token" /storage/.config/retroarch/retroarch.cfg | cut -d'"' -f2) #Variables for checking if [Cheevos] or enabled true or false are presente. zcheevos=$(grep -Fx "[Achievements]" ${PPSSPP_INI}) datets=$(date +%s%N | cut -b1-13) # Test the token if empty exit 1. // I don't think we should exit, it should continue but not enable cheevos if [[ -z "${token}" || "${token}" == *'"Success":false'* ]] then token="" zcheevos="" fi echo "${token}" > ${PPSSPP_ACHIEVEMENTS} if ([ -z "${zcheevos}" ]) then echo -e "[Achievements]\nAchievementsEnable = True\nAchievementsUserName = ${username}\n" >> ${PPSSPP_INI} else # Verificar y actualizar AchievementsUserName si es necesario if ! grep -q "^AchievementsUserName = " ${PPSSPP_INI}; then sed -i "/^\[Achievements\]/a AchievementsUserName = ${username}" ${PPSSPP_INI} else sed -i "/^\[Achievements\]/,/^\[/{s/^AchievementsUserName = .*/AchievementsUserName = ${username}/;}" ${PPSSPP_INI} fi fi ================================================ FILE: packages/sx05re/emulators/PPSSPPSDL/scripts/set_ppsspp_joy.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile # Configure ADVMAME players based on ES settings CONFIG_DIR="/storage/.config/ppsspp/PSP/SYSTEM" CONFIG=${CONFIG_DIR}/controls.ini #CONFIG2=${CONFIG_DIR}/controls.ini CONFIG_TMP=/tmp/jc/ppsspp.tmp source joy_common.sh "ppsspp" "fixed_order" declare -A GC_PPSSPP_VALUES=( [h0.1]="10-19" #Up [h0.4]="10-20" #Down [h0.8]="10-21" #Left [h0.2]="10-22" #Right [b0]="10-190" [b1]="10-189" [b2]="10-188" [b3]="10-191" [b4]="10-193" [b5]="10-192" [b6]="10-196" [b7]="10-197" [b8]="10-196" # back [b9]="10-197" # start [b10]="" # usually home. [b11]="10-106" #leftstick [b12]="10-107" #rightstick [b13]="10-19" # up [b14]="10-20" # down [b15]="10-21" # left [b16]="10-22" # right [a0-0]="10-4001" [a0-1]="10-4000" [a1-0]="10-4003" [a1-1]="10-4002" [a2]="10-4010" #lefttrigger [a3]="10-4011" #righttrigger [a4]="10-4010" #lefttrigger [a5]="10-4011" #righttrigger ) declare -A KB_PPSSPP_VALUES=( [h0.1]="1-19" #Up [h0.4]="1-20" #Down [h0.8]="1-21" #Left [h0.2]="1-22" #Right [b0]="1-52" [b1]="1-54" [b2]="1-47" [b3]="1-29" [b4]="1-45" [b5]="1-51" [b6]="1-66" [b7]="1-62" [a0-0]="1-38" [a0-1]="1-40" [a1-0]="1-37" [a1-1]="1-39" ) declare -A GC_PPSSPP_BUTTONS=( [dpleft]="Left" [dpright]="Right" [dpup]="Up" [dpdown]="Down" [x]="Triangle" [y]="Square" [a]="Circle" [b]="Cross" [back]="Select" [start]="Start" [leftshoulder]="L" [rightshoulder]="R" [leftx-0]="An.Left" [leftx-1]="An.Right" [lefty-0]="An.Up" [lefty-1]="An.Down" ) # Cleans all the inputs for the gamepad with name ${GAMEPAD} and player ${1} clean_pad() { [[ "${1}" != "1" ]] && return [[ -f "${CONFIG_TMP}" ]] && rm "${CONFIG_TMP}" [[ ! -f "${CONFIG}" ]] && return grep -m 1 "Analog limiter =" ${CONFIG} >> ${CONFIG_TMP} grep -m 1 "RapidFire =" ${CONFIG} >> ${CONFIG_TMP} grep -m 1 "Unthrottle =" ${CONFIG} >> ${CONFIG_TMP} grep -m 1 "SpeedToggle =" ${CONFIG} >> ${CONFIG_TMP} grep -m 1 "Pause =" ${CONFIG} >> ${CONFIG_TMP} grep -m 1 "Pause (no menu) =" ${CONFIG} >> ${CONFIG_TMP} grep -m 1 "Rewind =" ${CONFIG} >> ${CONFIG_TMP} grep -m 1 "Toggle Debugger =" ${CONFIG} >> ${CONFIG_TMP} rm ${CONFIG} } # Sets pad depending on parameters. # ${1} = Player Number # ${2} = js[0-7] # ${3} = Device GUID # ${4} = Device Name set_pad() { [[ "${1}" != "1" ]] && return local DEVICE_GUID=${3} echo "DEVICE_GUID=${DEVICE_GUID}" local GC_CONFIG="${5}" echo "GC_CONFIG=${GC_CONFIG}" [[ -z ${GC_CONFIG} ]] && return local GC_MAP=$(echo ${GC_CONFIG} | cut -d',' -f3-) local L_VAL= local R_VAL= set -f local GC_ARRAY=(${GC_MAP//,/ }) for index in "${!GC_ARRAY[@]}" do local REC=${GC_ARRAY[${index}]} local BUTTON_INDEX=$(echo ${REC} | cut -d ":" -f 1) local TVAL=$(echo ${REC} | cut -d ":" -f 2) local BUTTON_VAL=${TVAL:1} local GC_INDEX="${GC_PPSSPP_BUTTONS[${BUTTON_INDEX}]}" local BTN_TYPE=${TVAL:0:1} local VAL="${GC_PPSSPP_VALUES[${TVAL}]}" local KBVAL="${KB_PPSSPP_VALUES[${TVAL}]}" local RECORD # CREATE BUTTON MAPS (inlcuding hats). if [[ ! -z "${GC_INDEX}" ]]; then if [[ "${BTN_TYPE}" == "b" || "${BTN_TYPE}" == "h" ]]; then if [[ ! -z "${VAL}" ]]; then [[ ! -z "${KBVAL}" ]] && echo "${GC_INDEX} = ${KBVAL},${VAL}" >> ${CONFIG_TMP} [[ -z "${KBVAL}" ]] && echo "${GC_INDEX} = ${VAL}" >> ${CONFIG_TMP} fi fi fi # if [[ "${BTN_TYPE}" == "a" ]]; then # echo "BINDEX=${BUTTON_INDEX}" # [[ "${BUTTON_INDEX}" == "lefttrigger" ]] && L_VAL=${VAL} && echo "LVAL=${VAL}" # [[ "${BUTTON_INDEX}" == "righttrigger" ]] && R_VAL=${VAL} && echo "RVAL=${VAL}" # fi # Create Axis Maps case ${BUTTON_INDEX} in leftx|lefty) GC_INDEX="${GC_PPSSPP_BUTTONS[${BUTTON_INDEX}-0]}" VAL="${GC_PPSSPP_VALUES[${TVAL}-0]}" KBVAL="${KB_PPSSPP_VALUES[${TVAL}-0]}" echo "${GC_INDEX} = ${KBVAL},${VAL}" >> ${CONFIG_TMP} GC_INDEX="${GC_PPSSPP_BUTTONS[${BUTTON_INDEX}-1]}" VAL="${GC_PPSSPP_VALUES[${TVAL}-1]}" KBVAL="${KB_PPSSPP_VALUES[${TVAL}-1]}" echo "${GC_INDEX} = ${KBVAL},${VAL}" >> ${CONFIG_TMP} ;; esac done # [[ ! -z "${L_VAL}" ]] && sed -i -r "s|L = (.*)|L = \1,${L_VAL}|g" "${CONFIG_TMP}" # [[ ! -z "${R_VAL}" ]] && sed -i -r "s|R = (.*)|R = \1,${R_VAL}|g" "${CONFIG_TMP}" echo "[ControlMapping]" > ${CONFIG} cat "${CONFIG_TMP}" | sort >> ${CONFIG} rm "${CONFIG_TMP}" } jc_get_players ================================================ FILE: packages/sx05re/emulators/advancemame/bin/advmame.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) . /etc/profile CONFIG_DIR="/emuelec/configs/advmame" export DISPLAY=:0 if [ -L "${CONFIG_DIR}" ]; then rm "${CONFIG_DIR}" fi if [ ! -d "${CONFIG_DIR}" ]; then mkdir -p "${CONFIG_DIR}" cp -rf /usr/config/emuelec/configs/advmame/* "${CONFIG_DIR}/" fi if [ ! -L "/storage/.advance" ]; then cp -rf /storage/.advance/* ${CONFIG_DIR}/ rm -rf /storage/.advance ln -sf ${CONFIG_DIR} /storage/.advance fi if [[ "${1}" = "arcade" ]]; then sed -i "s|/roms/mame|/roms/arcade|g" ${CONFIG_DIR}/advmame.rc else sed -i "s|/roms/arcade|/roms/mame|g" ${CONFIG_DIR}/advmame.rc fi if [ "${EE_DEVICE}" != "OdroidGoAdvance" ] && [ "${EE_DEVICE}" != "GameForce" ]; then unset DISPLAY MODE=`get_resolution`; sed -i '/device_video_modeline/d' ${CONFIG_DIR}/advmame.rc # NOTE - Multiples should go first. case "${MODE}" in 1280*1024) echo "device_video_modeline 1280x1024_60.00 108.88 1280 1360 1496 1712 1024 1025 1028 1060 +hsync +vsync" >> ${CONFIG_DIR}/advmame.rc ;; 1024*768) echo "device_video_modeline 1024x768_60.00 64.11 1024 1080 1184 1344 768 769 772 795 +hsync +vsync" >> ${CONFIG_DIR}/advmame.rc ;; 800*600) echo "device_video_modeline 800x600_60.00 38.22 800 832 912 1024 600 601 604 622 +hsync +vsync" >> ${CONFIG_DIR}/advmame.rc ;; 640*480) echo "device_video_modeline 640x480_60.00 23.86 640 656 720 800 480 481 484 497 +hsync +vsync" >> ${CONFIG_DIR}/advmame.rc ;; *480) echo "device_video_modeline 720x480 15.246 720 762 834 968 480 484 491 525 +hsync +vsync" >> ${CONFIG_DIR}/advmame.rc ;; *720) echo "device_video_modeline 1280x720-60 91.517 1280 1440 1531 1691 720 810 812 902 +hsync +vsync" >> ${CONFIG_DIR}/advmame.rc ;; *1080) echo "device_video_modeline 1920x1080_60.00 153.234 1920 1968 2121 2168 1080 1127 1130 1178 +hsync +vsync" >> ${CONFIG_DIR}/advmame.rc ;; esac fi PLATFORM=${1} ROMNAME="$(basename ${2})" AUTOGP=$(get_ee_setting advmame_auto_gamepad) # Hack - Set the crash stack size to 0 to prevent program doing a large dump of poo. CRASH_STACK_SIZE=$( ulimit -c ) [[ "${AUTOGP}" != "0" ]] && set_advmame_joy.sh "${PLATFORM}" "${ROMNAME}" # Hack - Revert crash stack size so it can poo nicely. ulimit -c ${CRASH_STACK_SIZE} emuelec-utils blank_buffer ARG=$(echo basename ${2} | sed 's/\.[^.]*$//') ARG="$(echo ${2} | sed 's=.*/==;s/\.[^.]*$//')" SDL_AUDIODRIVER=alsa advmame ${ARG} -quiet emuelec-utils blank_buffer ================================================ FILE: packages/sx05re/emulators/advancemame/bin/set_advmame_joy.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present Joshua L (https://github.com/Langerz82) # 08/01/23 - Joshua L - Fixed a couple of issues. # Source predefined functions and variables . /etc/profile # Configure ADVMAME players based on ES settings CONFIG_DIR="/storage/.advance" CONFIG="${CONFIG_DIR}/advmame.rc" ES_FEATURES="/storage/.config/emulationstation/es_features.cfg" source joy_common.sh "advmame" PLATFORM=${1} ROMNAME=${2} BTN_CFG="0 1 2 3 4 5 6 7" BTN_H0=$(advj | grep -B 1 -E "^joy 0 .*" | grep sticks: | sed "s|sticks:\ ||" | tr -d ' ') declare -A ADVMAME_VALUES=( ["b0"]="button1" ["b1"]="button2" ["b2"]="button3" ["b3"]="button4" ["b4"]="button5" ["b5"]="button6" ["b6"]="button7" ["b7"]="button8" ["b8"]="button9" ["b9"]="button10" ["b10"]="button11" ["b11"]="button12" ["b12"]="button13" ["b13"]="button14" ["b14"]="button15" ["b15"]="button16" ["b16"]="button17" ["b17"]="button18" ["h0.1"]="stick${BTN_H0},y,up" ["h0.4"]="stick${BTN_H0},y,down" ["h0.8"]="stick${BTN_H0},x,left" ["h0.2"]="stick${BTN_H0},x,right" ["a0,1"]="stick,y,up" ["a0,2"]="stick,y,down" ["a1,1"]="stick,x,left" ["a1,2"]="stick,x,right" ["a2,1"]="stick2,x,left" ["a2,2"]="stick2,x,right" ["a3,1"]="stick3,y,up" ["a3,2"]="stick3,y,down" ["a4,1"]="stick2,x,left" ["a4,2"]="stick2,x,right" ["a5,1"]="stick3,y,up" ["a5,2"]="stick3,y,down" ) declare GC_ORDER=( "b" "a" "y" "x" "leftshoulder" "rightshoulder" "righttrigger" "lefttrigger" ) declare -A GC_NAMES=() get_button_cfg() { local BTN_INDEX=$(get_ee_setting "joy_btn_index" "${PLATFORM}" "${ROMNAME}") if [[ ! -z ${BTN_INDEX} ]]; then local BTN_SETTING="AdvanceMame.joy_btn_order.${BTN_INDEX}" local BTN_CFG_TMP="$(get_ee_setting ${BTN_SETTING})" [[ ! -z ${BTN_CFG_TMP} ]] && BTN_CFG="${BTN_CFG_TMP}" fi echo "${BTN_CFG}" } clean_pad() { sed -i "/device_joystick.*/d" ${CONFIG} sed -i "/input_map\[p${1}_.*/d" ${CONFIG} sed -i "/input_map\[coin${1}.*/d" ${CONFIG} sed -i "/input_map\[start${1}.*/d" ${CONFIG} if [[ "${1}" == "1" ]]; then sed -i '/input_map\[ui_[[:alpha:]]*\].*/d' ${CONFIG} fi echo "device_joystick raw" >> ${CONFIG} } # Sets pad depending on parameters ${GAMEPAD} = name ${1} = player set_pad(){ local P_INDEX=$(( ${1} - 1 )) local DEVICE_GUID=${3} local JOY_NAME="${4}" local GC_CONFIG="${5}" echo "GC_CONFIG=${GC_CONFIG}" [[ -z ${GC_CONFIG} ]] && return local GAMEPAD="$(advj | grep "'${JOY_NAME}'" | cut -d"'" -f2 | head -n 1 )" [[ -z "${GAMEPAD}" ]] && return BTN_H0=$(advj | grep -B 1 -E "^joy ${P_INDEX}.*" | grep sticks: | sed "s|sticks:\ ||" | tr -d ' ') ADVMAME_VALUES["h0.1"]="stick${BTN_H0},y,up" ADVMAME_VALUES["h0.4"]="stick${BTN_H0},y,down" ADVMAME_VALUES["h0.8"]="stick${BTN_H0},x,left" ADVMAME_VALUES["h0.2"]="stick${BTN_H0},x,right" ADVMAME_VALUES["a0,1"]="stick,y,up" ADVMAME_VALUES["a0,2"]="stick,y,down" ADVMAME_VALUES["a1,1"]="stick,x,left" ADVMAME_VALUES["a1,2"]="stick,x,right" local INVERT_AXIS=$(get_ee_setting "advmame_invert_axis") if [[ ${INVERT_AXIS} == 1 ]]; then ADVMAME_VALUES["a1,1"]="stick,y,up" ADVMAME_VALUES["a1,2"]="stick,y,down" ADVMAME_VALUES["a0,1"]="stick,x,left" ADVMAME_VALUES["a0,2"]="stick,x,right" fi local NAME_NUM="${GC_NAMES[${GAMEPAD}]}" if [[ -z "NAME_NUM" ]]; then GC_NAMES[${GAMEPAD}]=1 else GC_NAMES[${GAMEPAD}]=$(( NAME_NUM+1 )) fi [[ "${GC_NAMES[${GAMEPAD}]}" -gt "1" ]] && GAMEPAD="${GAMEPAD}_${GC_NAMES[${GAMEPAD}]}" # GAMEPAD=0 local GC_MAP=$(echo ${GC_CONFIG} | cut -d',' -f3-) declare DIRS=() declare -A DIR_INDEX=( [dpup]="0" [dpdown]="1" [dpleft]="2" [dpright]="3" [leftx]="0,1" [lefty]="2,3" ) local ADD_HAT=$(get_ee_setting advmame_add_hat) local i=1 set -f local GC_ARRAY=(${GC_MAP//,/ }) declare -A GC_ASSOC=() for index in "${!GC_ARRAY[@]}" do local REC=${GC_ARRAY[${index}]} local GC_INDEX=$(echo ${REC} | cut -d ":" -f 1) [[ ${GC_INDEX} == "" || ${GC_INDEX} == "platform" ]] && continue local TVAL=$(echo ${REC} | cut -d ":" -f 2) GC_ASSOC["${GC_INDEX}"]=${TVAL} [[ " ${GC_ORDER[*]} " == *" ${GC_INDEX} "* ]] && continue local BUTTON_VAL=${TVAL:1} local BTN_TYPE=${TVAL:0:1} local VAL="${ADVMAME_VALUES[${TVAL}]}" local I="${DIR_INDEX[${GC_INDEX}]}" local DIR="${DIRS[${I}]}" # Create Axis Maps case ${GC_INDEX} in dpup|dpdown|dpleft|dpright) [[ ! -z "${DIR}" ]] && DIR+=" or " if [[ "${BTN_TYPE}" == "a" ]]; then local direction case ${GC_INDEX} in dpleft|dpup) direction=1 ;; dpright|dpdown) direction=2 ;; esac VAL="${ADVMAME_VALUES[${TVAL},${direction}]}" DIR+="joystick_digital[${GAMEPAD},${VAL}]" DIRS["${I}"]="${DIR}" else [[ "${BTN_TYPE}" == "b" ]] && DIR+="joystick_button[${GAMEPAD},${VAL}]" [[ "${BTN_TYPE}" == "h" ]] && DIR+="joystick_digital[${GAMEPAD},${VAL}]" DIRS["${I}"]="${DIR}" fi ;; leftx|lefty) for i in {1..2}; do I=$(echo "${DIR_INDEX[${GC_INDEX}]}" | cut -d, -f "${i}") DIR="${DIRS[${I}]}" [[ ! -z "${DIR}" ]] && DIR+=" or " VAL="${ADVMAME_VALUES[${TVAL},${i}]}" DIR+="joystick_digital[${GAMEPAD},${VAL}]" DIRS["${I}"]=${DIR} done ;; start) echo "input_map[start${1}] joystick_button[${GAMEPAD},${VAL}]" >> ${CONFIG} ;; back) echo "input_map[coin${1}] joystick_button[${GAMEPAD},${VAL}]" >> ${CONFIG} ;; esac done declare -i i=1 for bi in ${BTN_CFG}; do local button="${GC_ORDER[${bi}]}" [[ -z "${button}" ]] && continue button="${GC_ASSOC[${button}]}" local BTN_TYPE="${button:0:1}" if [[ "${BTN_TYPE}" == "a" ]]; then local STR="input_map[p${1}_button${i}]" for j in {1..2}; do local VAL="${ADVMAME_VALUES[${button},${j}]}" STR+=" joystick_digital[${GAMEPAD},${VAL}]" done echo "${STR}" >> ${CONFIG} elif [[ "${BTN_TYPE}" == "b" ]]; then local VAL="${ADVMAME_VALUES[${button}]}" echo "input_map[p${1}_button${i}] joystick_button[${GAMEPAD},${VAL}]" >> ${CONFIG} fi (( i++ )) done echo "input_map[p${1}_up] ${DIRS[0]}" >> ${CONFIG} echo "input_map[p${1}_down] ${DIRS[1]}" >> ${CONFIG} echo "input_map[p${1}_left] ${DIRS[2]}" >> ${CONFIG} echo "input_map[p${1}_right] ${DIRS[3]}" >> ${CONFIG} # Menu should only be set to player 1 if [[ "${1}" == "1" ]]; then #echo "Setting menu buttons for player 1" #debug echo "input_map[ui_up] keyboard[0,up] or keyboard[1,up] or ${DIRS[0]}" >> ${CONFIG} echo "input_map[ui_down] keyboard[0,down] or keyboard[1,down] or ${DIRS[1]}" >> ${CONFIG} echo "input_map[ui_left] keyboard[0,left] or keyboard[1,left] or ${DIRS[2]}" >> ${CONFIG} echo "input_map[ui_right] keyboard[0,right] or keyboard[1,right] or ${DIRS[3]}" >> ${CONFIG} local button="${GC_ASSOC[b]}" local VAL="${ADVMAME_VALUES[${button}]}" if [ ! -z "${VAL}" ]; then echo "input_map[ui_select] keyboard[0,enter] or keyboard[1,enter] or joystick_button[${GAMEPAD},${VAL}]" >> ${CONFIG} fi local record="input_map[ui_cancel] keyboard[0,backspace] or keyboard[1,backspace]" button="${GC_ASSOC[leftstick]}" if [[ ! -z "${button}" ]]; then VAL="${ADVMAME_VALUES[${button}]}" if [ ! -z "${VAL}" ]; then record="${record} or joystick_button[${GAMEPAD},${VAL}]" fi fi echo "${record}" >> ${CONFIG} VAL="" button="${GC_ASSOC[rightstick]}" if [[ ! -z "${button}" ]]; then VAL="${ADVMAME_VALUES[${button}]}" elif [[ "${GC_ASSOC[guide]}" != "${GC_ASSOC[back]}" ]]; then button="${GC_ASSOC[guide]}" VAL="${ADVMAME_VALUES[${button}]}" fi record="input_map[ui_configure] keyboard[1,tab] or keyboard[0,tab]" if [ ! -z "${VAL}" ]; then record="${record} or joystick_button[${GAMEPAD},${VAL}]" fi echo "${record}" >> ${CONFIG} fi } ADVMAME_REGEX="" ADVMAME_REMAP=$(cat "${ES_FEATURES}" | grep -E "${ADVMAME_REGEX}") [[ ! -z "${ADVMAME_REMAP}" ]] && BTN_CFG=$(get_button_cfg) echo "BTN_CFG=${BTN_CFG}" jc_get_players ================================================ FILE: packages/sx05re/emulators/advancemame/config/advmame.rc ================================================ device_alsa_device sdl device_color_bgr15 no device_color_bgr8 no dir_artwork /storage/roms/mame/artwork dir_diff /storage/roms/mame/diff dir_hi /storage/roms/mame/hi dir_image /storage/roms/mame/image dir_inp /storage/roms/mame/inp dir_memcard /storage/roms/mame/memcard dir_nvram /storage/roms/mame/nvram dir_rom /storage/roms/mame dir_sample /storage/roms/bios/advmame/samples dir_snap /storage/roms/mame/snap dir_sta /storage/roms/mame/nvram record_sound no record_video no sound_latency 0.10 sound_normalize no display_rgbeffect scan2horz display_vsync no device_video_clock 10-180 / 30-80 / 50-70 #device_video_modeline ATSC-720-60p 73.44 1280 1312 1368 1632 720 722 728 728 +hsync +vsync #device_video_modeline 1280x720-60 91.517 1280 1440 1531 1691 720 810 812 902 +hsync +vsync device_video_modeline 1920x1080_60.00 153.234 1920 1968 2121 2168 1080 1127 1130 1178 +hsync +vsync # WARNING: auto gamepad needs device_joystick to be set to raw device_joystick raw input_map[ui_select] keyboard[0,enter] or keyboard[1,enter] ================================================ FILE: packages/sx05re/emulators/advancemame/config/advmame.rc_gf ================================================ dir_artwork /storage/roms/mame/artwork dir_diff /storage/roms/mame/diff dir_hi /storage/roms/mame/hi dir_image /storage/roms/mame/image dir_inp /storage/roms/mame/inp dir_memcard /storage/roms/mame/memcard dir_nvram /storage/roms/mame/nvram dir_rom /storage/roms/mame dir_sample /storage/roms/bios/advmame/samples dir_snap /storage/roms/mame/snap dir_sta /storage/roms/mame/nvram record_sound no record_video no sound_latency 0.10 sound_normalize no device_video_clock 10-180 / 30-80 / 50-70 display_mode 640x480x16 display_resizeeffect none display_magnify 1 display_resize none display_vsync no device_keyboard sdl device_joystick raw misc_smp no misc_quiet yes device_alsa_device sdl input_map[coin1] joystick_button[gameforcegamepad,button9] input_map[start1] joystick_button[gameforcegamepad,button10] input_map[p1_button1] joystick_button[gameforcegamepad,button2] input_map[p1_button2] joystick_button[gameforcegamepad,button1] input_map[p1_button3] joystick_button[gameforcegamepad,button3] input_map[p1_button4] joystick_button[gameforcegamepad,button4] input_map[p1_button5] joystick_button[gameforcegamepad,button6] input_map[p1_button6] joystick_button[gameforcegamepad,button5] input_map[p1_button7] joystick_button[gameforcegamepad,button8] input_map[p1_button8] joystick_button[gameforcegamepad,button7] input_map[p1_up] joystick_button[gameforcegamepad,button11] or joystick_digital[gameforcegamepad,stick,x,up] input_map[ui_up] joystick_button[gameforcegamepad,button11] or joystick_digital[gameforcegamepad,stick,x,up] input_map[p1_down] joystick_button[gameforcegamepad,button12] or joystick_digital[gameforcegamepad,stick,x,down] input_map[ui_down] joystick_button[gameforcegamepad,button12] or joystick_digital[gameforcegamepad,stick,x,down] input_map[p1_right] joystick_button[gameforcegamepad,button14] or joystick_digital[gameforcegamepad,stick,y,right] input_map[ui_right] joystick_button[gameforcegamepad,button14] or joystick_digital[gameforcegamepad,stick,y,right] input_map[p1_left] joystick_button[gameforcegamepad,button13] or joystick_digital[gameforcegamepad,stick,y,left] input_map[ui_left] joystick_button[gameforcegamepad,button13] or joystick_digital[gameforcegamepad,stick,y,left] input_map[ui_select] keyboard[0,enter] or keyboard[1,enter] or joystick_button[gameforcegamepad,button2] input_map[ui_cancel] keyboard[0,backspace] or keyboard[1,backspace] or joystick_button[gameforcegamepad,button16] input_map[ui_configure] keyboard[1,tab] or keyboard[0,tab] or joystick_button[gameforcegamepad,button15] ================================================ FILE: packages/sx05re/emulators/advancemame/config/advmame.rc_oga ================================================ dir_artwork /storage/roms/mame/artwork dir_diff /storage/roms/mame/diff dir_hi /storage/roms/mame/hi dir_image /storage/roms/mame/image dir_inp /storage/roms/mame/inp dir_memcard /storage/roms/mame/memcard dir_nvram /storage/roms/mame/nvram dir_rom /storage/roms/mame dir_sample /storage/roms/bios/advmame/samples dir_snap /storage/roms/mame/snap dir_sta /storage/roms/mame/nvram device_joystick raw device_keyboard sdl misc_smp no display_magnifysize 320 display_resize none display_resizeeffect none misc_quiet yes sound_mode mono device_alsa_device sdl device_color_bgr15 no device_color_bgr8 no record_sound no record_video no sound_latency 0.10 sound_normalize no device_video_clock 10-180 / 30-80 / 50-70 display_mode 320x224x32 ================================================ FILE: packages/sx05re/emulators/advancemame/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="advancemame" PKG_VERSION="6a34ec0ec3fd74535ae559304ceb6c7ce63acff5" PKG_SHA256="d6211711e1e46a3b3bae9bcf4bb8491c90cfc84e104044b6f18eb118fa0e7cf2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MAME" PKG_SITE="https://github.com/amadvance/advancemame" PKG_URL="https://github.com/amadvance/advancemame/archive/${PKG_VERSION}.tar.gz" PKG_SOURCE_DIR="advancemame-${PKG_VERSION}*" PKG_DEPENDS_TARGET="toolchain freetype slang alsa SDL2" PKG_SECTION="emuelec/mod" PKG_SHORTDESC="A MAME and MESS port with an advanced video support for Arcade Monitors, TVs, and PC Monitors " PKG_LONGDESC="A MAME and MESS port with an advanced video support for Arcade Monitors, TVs, and PC Monitors " PKG_IS_ADDON="no" PKG_AUTORECONF="yes" PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="-parallel" pre_configure_target() { export CFLAGS=`echo ${CFLAGS} | sed -e "s|-O.|-O3|g"` sed -i "s|#include |#include <${SYSROOT_PREFIX}/usr/include/slang.h>|" ${PKG_BUILD}/configure.ac } pre_make_target() { VERSION="EmuELEC-v$(cat ${ROOT}/packages/sx05re/emuelec/config/EE_VERSION)-${PKG_VERSION:0:7}" echo ${VERSION} > ${PKG_BUILD}/.version } make_target() { cd ${PKG_BUILD} ./autogen.sh ./configure --prefix=/usr --datadir=/usr/share/ --datarootdir=/usr/share/ --host=${TARGET_NAME} --enable-fb --enable-freetype --with-freetype-prefix=${SYSROOT_PREFIX}/usr/ --enable-slang make mame make j } makeinstall_target() { mkdir -p ${INSTALL}/usr/config/emuelec/configs/advmame mkdir -p ${INSTALL}/usr/bin if [ "${DEVICE}" == "OdroidGoAdvance" ]; then cp -r ${PKG_DIR}/config/advmame.rc_oga ${INSTALL}/usr/config/emuelec/configs/advmame/advmame.rc elif [ "${DEVICE}" == "GameForce" ]; then cp -r ${PKG_DIR}/config/advmame.rc_gf ${INSTALL}/usr/config/emuelec/configs/advmame/advmame.rc else cp -r ${PKG_DIR}/config/advmame.rc ${INSTALL}/usr/config/emuelec/configs/advmame/advmame.rc fi cp -r ${PKG_DIR}/bin/* ${INSTALL}/usr/bin chmod +x ${INSTALL}/usr/bin/* cp -r ${PKG_BUILD}/obj/mame/linux/blend/advmame ${INSTALL}/usr/bin cp -r ${PKG_BUILD}/obj/j/linux/blend/advj ${INSTALL}/usr/bin cp -r ${PKG_BUILD}/support/category.ini ${INSTALL}/usr/config/emuelec/configs/advmame cp -r ${PKG_BUILD}/support/sysinfo.dat ${INSTALL}/usr/config/emuelec/configs/advmame cp -r ${PKG_BUILD}/support/history.dat ${INSTALL}/usr/config/emuelec/configs/advmame cp -r ${PKG_BUILD}/support/hiscore.dat ${INSTALL}/usr/config/emuelec/configs/advmame cp -r ${PKG_BUILD}/support/event.dat ${INSTALL}/usr/config/emuelec/configs/advmame } ================================================ FILE: packages/sx05re/emulators/advancemame/patches/advancemame-002-fix-vfb.patch ================================================ --- a/advance/linux/vfb.c 2018-03-10 10:38:17.000000000 -0600 +++ b/advance/linux/vfb.c 2018-03-10 13:55:40.977788463 -0600 @@ -859,6 +859,7 @@ } /* set the preferred bit depth */ +/* switch (fb_state.varinfo.bits_per_pixel) { case 16: if ((fb_state.flags & VIDEO_DRIVER_FLAGS_MODE_BGR16) != 0) @@ -873,6 +874,9 @@ fb_state.flags |= VIDEO_DRIVER_FLAGS_DEFAULT_BGR32; break; } +*/ +/* force 16bit for EmuELEC */ + fb_state.flags |= VIDEO_DRIVER_FLAGS_DEFAULT_BGR16; log_std(("video:fb: size %ux%u\n", target_size_x(), target_size_y())); log_std(("video:fb: aspect %ux%u\n", target_aspect_x(), target_aspect_y())); ================================================ FILE: packages/sx05re/emulators/advancemame/patches/advancemame-999-modify-advj.patch ================================================ --- a/advance/j/j.c +++ b/advance/j/j.c @@ -34,6 +34,7 @@ strcpy(name, DEVICE_NONAME); if (joystickb_device_desc_get(i, desc) != 0) strcpy(desc, DEVICE_NONAME); + printf("sticks: %i \n", joystickb_state.driver_current->stick_count_get(i)); printf("joy %d '%s' '%s', controls %d, buttons %d, ball axes %d\n", i, name, desc, joystickb_stick_count_get(i), joystickb_button_count_get(i), joystickb_rel_count_get(i)); for (j = 0; j < joystickb_stick_count_get(i); ++j) { @@ -214,6 +215,7 @@ const char* section_map[1]; adv_bool opt_log; adv_bool opt_logsync; + int idriver = 1; opt_log = 0; opt_logsync = 0; @@ -224,22 +226,28 @@ goto err_conf; joystickb_reg(context, 1); - joystickb_reg_driver_all(context); if (conf_input_args_load(context, 0, "", &argc, argv, error_callback, 0) != 0) goto err_os; for (i = 1; i < argc; ++i) { - if (target_option_compare(argv[i], "log")) { - opt_log = 1; - } else if (target_option_compare(argv[i], "logsync")) { - opt_logsync = 1; + if (target_option_compare(argv[i], "event")) { + idriver = 3; + } else if (target_option_compare(argv[i], "sdl")) { + idriver = 2; } else { - fprintf(stderr, "Unknown argument '%s'\n", argv[1]); - goto err_os; - } - } - + idriver = 1; + } + } + + if (idriver == 2) { + joystickb_reg_driver(context, &joystickb_sdl_driver); + } else if (idriver == 3) { + joystickb_reg_driver(context, &joystickb_event_driver); + } else { + joystickb_reg_driver(context, &joystickb_raw_driver); + } + if (opt_log || opt_logsync) { const char* log = "advj.log"; remove(log); @@ -263,8 +271,8 @@ } probe(); - calibrate(); - run(); + /* calibrate(); + run();*/ joystickb_done(); os_inner_done(); ================================================ FILE: packages/sx05re/emulators/advancemame/patches/advancemame-fix-slang.patch ================================================ --- a/configure.ac 2025-04-16 09:30:03.284454900 +0200 +++ b/configure.ac 2025-04-16 22:31:02.634757319 +0200 @@ -732,38 +732,27 @@ [ac_lib_slang=auto] ) if test $ac_lib_slang = auto; then - PKG_CHECK_MODULES([SLANG], [slang], [ac_lib_slang=yes], [ac_lib_slang=no]) - if test $ac_lib_slang = yes; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="SLANG_CFLAGS $CFLAGS" - LIBS="$SLANG_LIBS $LIBS" - AC_MSG_CHECKING([for linking slang]) - AC_LINK_IFELSE([AC_LANG_PROGRAM([[ - #include - ]], [[ - if (SLang_init_tty(-1, 0, 0) < 0) { - perror("SLang_init_tty"); - return 1; - } - - SLang_reset_tty(); - return 0; - ]])],[ac_lib_slang=yes],[ac_lib_slang=no]) - AC_MSG_RESULT([$ac_lib_slang]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi + AC_CHECK_LIB( + [slang], + [SLang_init_tty], + [ac_lib_slang=yes], + [ac_lib_slang=no], + [] + ) elif test $ac_lib_slang = yes; then - PKG_CHECK_MODULES([SLANG], [slang], [], AC_MSG_ERROR([the slang library is missing])) + AC_CHECK_LIB( + [slang], + [SLang_init_tty], + [], + [AC_MSG_ERROR([the sLang library is missing])], + [] + ) fi if test $ac_lib_slang = yes; then - AC_CHECK_HEADERS([slang.h slang/slang.h], [break]) - ac_lib_video="$ac_lib_video slang" - ac_lib_text_flag=yes + AC_CHECK_HEADERS([slang.h slang/slang.h], [break]) + ac_lib_video="$ac_lib_video slang" + ac_lib_text_flag=yes fi -AC_SUBST([SLANGCFLAGS],[$SLANG_CFLAGS]) -AC_SUBST([SLANGLIBS],[$SLANG_LIBS]) AC_SUBST([CONF_LIB_SLANG],[$ac_lib_slang]) @@ -775,34 +764,27 @@ [ac_lib_ncurses=auto] ) if test $ac_lib_ncurses = auto; then - PKG_CHECK_MODULES([NCURSES], [ncurses], [ac_lib_ncurses=yes], [ac_lib_ncurses=no]) - if test $ac_lib_ncurses = yes; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$NCURSES_CFLAGS $CFLAGS" - LIBS="$NCURSES_LIBS $LIBS" - AC_MSG_CHECKING([for linking ncurses]) - AC_LINK_IFELSE([AC_LANG_PROGRAM([[ - #include - ]], [[ - initscr(); - noecho(); - curs_set(FALSE); - endwin(); - ]])],[ac_lib_ncurses=yes],[ac_lib_ncurses=no]) - AC_MSG_RESULT([$ac_lib_ncurses]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi + AC_CHECK_LIB( + [ncurses], + [endwin], + [ac_lib_ncurses=yes], + [ac_lib_ncurses=no], + [] + ) elif test $ac_lib_ncurses = yes; then - PKG_CHECK_MODULES([NCURSES], [ncurses], [], AC_MSG_ERROR([the ncurses library is missing])) + AC_CHECK_LIB( + [ncurses], + [endwin], + [], + [AC_MSG_ERROR([the sLang library is missing])], + [] + ) fi if test $ac_lib_ncurses = yes; then - ac_lib_video="$ac_lib_video ncurses" - ac_lib_text_flag=yes + ac_lib_video="$ac_lib_video ncurses" + ac_lib_text_flag=yes fi -AC_SUBST([NCURSESCFLAGS],[$NCURSES_CFLAGS]) -AC_SUBST([NCURSESLIBS],[$NCURSES_LIBS]) + AC_SUBST([CONF_LIB_NCURSES],[$ac_lib_ncurses]) ================================================ FILE: packages/sx05re/emulators/advancemame/patches/advancemame-fix-vfb-fps.patch ================================================ diff --git a/advance/linux/vfb.c b/advance/linux/vfb.c index c25bca05..7886f78c 100644 --- a/advance/linux/vfb.c +++ b/advance/linux/vfb.c @@ -1707,7 +1707,7 @@ static adv_error fb_wait_vsync_ext(void) if (ioctl(fb_state.fd, FBIO_WAITFORVSYNC, 0) != 0) { log_std(("WARNING:video:fb: ioctl(FBIO_WAITFORVSYNC) failed\n")); /* it may be not supported, it isn't an error */ - return -1; + return -2; } return 0; @@ -1727,7 +1727,7 @@ static adv_error fb_wait_vsync_api(void) if (ioctl(fb_state.fd, FBIOGET_VBLANK, &blank) != 0) { log_std(("WARNING:video:fb: ioctl(FBIOGET_VBLANK) failed\n")); /* it may be not supported, it isn't an error */ - return -1; + return -2; } if ((blank.flags & FB_VBLANK_HAVE_COUNT) != 0) { @@ -1803,9 +1803,13 @@ static adv_error fb_wait_vsync_vga(void) void fb_wait_vsync(void) { + adv_error res = 0; switch (fb_state.wait) { - case fb_wait_ext: - if (fb_wait_vsync_ext() != 0) { + case fb_wait_ext: + res = fb_wait_vsync_ext(); + if (res != 0) { + if (res == -2) + break; ++fb_state.wait_error; if (fb_state.wait_error > WAIT_ERROR_MAX) fb_state.wait = fb_wait_none; @@ -1814,7 +1818,10 @@ void fb_wait_vsync(void) } break; case fb_wait_api: - if (fb_wait_vsync_api() != 0) { + res = fb_wait_vsync_api(); + if (res != 0) { + if (res == -2) + break; ++fb_state.wait_error; if (fb_state.wait_error > WAIT_ERROR_MAX) fb_state.wait = fb_wait_none; @@ -1834,18 +1841,21 @@ void fb_wait_vsync(void) break; #endif case fb_wait_detect: - if (fb_wait_vsync_ext() == 0) { + res = fb_wait_vsync_ext(); + if (res == 0) { fb_state.wait = fb_wait_ext; fb_state.wait_error = 0; - } else if (fb_wait_vsync_api() == 0) { + } else if ((res = fb_wait_vsync_api()) && res == 0) { fb_state.wait = fb_wait_api; fb_state.wait_error = 0; #ifdef __i386__ - } else if (fb_wait_vsync_vga() == 0) { + } else if ((res = fb_wait_vsync_vga()) && res == 0) { fb_state.wait = fb_wait_vga; fb_state.wait_error = 0; #endif } else { + if (res==-2) + break; ++fb_state.wait_error; if (fb_state.wait_error > WAIT_ERROR_MAX) fb_state.wait = fb_wait_none; diff --git a/src/mame.c b/src/mame.c index 2d7eb97a..b37f5924 100644 --- a/src/mame.c +++ b/src/mame.c @@ -229,6 +229,7 @@ const char *memory_region_names[REGION_MAX] = "REGION_PLDS" }; +_globals globals; /*************************************************************************** PROTOTYPES @@ -303,6 +304,14 @@ int run_game(int game) /* then finish setting up our local machine */ init_machine(); + printf("globals.fps_fixed: %f",globals.fps_fixed); + if (globals.fps_fixed > 0.0 && Machine->refresh_rate != globals.fps_fixed) { + *(globals.sound_fps) = globals.fps_fixed; + *(globals.fps_speed_factor) *= Machine->refresh_rate / globals.fps_fixed; + *(globals.sound_speed) = globals.fps_fixed / Machine->refresh_rate; + Machine->refresh_rate = globals.fps_fixed; + } + /* load the configuration settings and NVRAM */ settingsloaded = config_load_settings(); nvram_load(); diff --git a/src/mame.h b/src/mame.h index 2b920a1b..a47751a8 100644 --- a/src/mame.h +++ b/src/mame.h @@ -182,6 +182,13 @@ struct ImageFile }; #endif /* MESS */ +typedef struct __globals _globals; +struct __globals { + double fps_fixed; + double* fps_speed_factor; + double* sound_speed; + double* sound_fps; +}; /* The host platform should fill these fields with the preferences specified in the GUI */ /* or on the commandline. */ ================================================ FILE: packages/sx05re/emulators/advancemame/patches/advancemame-return-0-on-terminate.patch ================================================ --- a/advance/linux/target.c +++ b/advance/linux/target.c @@ -1099,7 +1099,7 @@ exit(EXIT_FAILURE); } else if (signum == SIGTERM) { fprintf(stderr, "Terminated\n\r"); - exit(EXIT_FAILURE); + exit(0); } else if (signum == SIGALRM) { fprintf(stderr, "Alarm\n\r"); exit(EXIT_FAILURE); ================================================ FILE: packages/sx05re/emulators/amiberry/config/conf/AmigaA1200-default.uae ================================================ config_description=UAE Amiga 1200/ Amiga CD32 default configuration config_hardware=true config_host=true config_version=3.6.0 rtg_nocustom=true a1000ram=false synchronize_clock=yes sound_auto=yes pandora.jump=-1 pandora.autofire_button=3 pandora.button2=1 pandora.button1=2 pandora.move_y=0 pandora.move_x=0 pandora.custom_r=0 pandora.custom_l=0 pandora.custom_y=0 pandora.custom_x=0 pandora.custom_b=0 pandora.custom_a=0 pandora.custom_right=0 pandora.custom_left=0 pandora.custom_down=0 pandora.custom_up=0 pandora.custom_dpad=0 pandora.custom_controls=0 pandora.tap_delay=10 pandora.stylus_offset=0 pandora.joy_port=0 pandora.joy_conf=0 pandora.cpu_speed=600 pandora.hardfile_path=/storage/.config/amiberry/ pandora.floppy_path=/storage/.config/amiberry/disks/ pandora.rom_path=/storage/.config/amiberry/kickstarts/ amiberry.rom_path=/storage/.config/amiberry/kickstarts/ amiberry.floppy_path=/storage/.config/amiberry/disks/ amiberry.hardfile_path=/storage/.config/amiberry/ amiberry.cd_path=/storage/.config/amiberry/cd32/ ; ; *** Controller/Input Configuration ; joyport0=mouse joyport0_autofire=none joyport0_friendlyname=Mouse joyport0_name=MOUSE0 ; joyport1=joy1 joyport1_autofire=normal joyport1_friendlyname=Logitech Gamepad F310 joyport1_name=JOY1 ; joyport2=joy0 joyport2_autofire=normal joyport2_friendlyname=Keyboard as Joystick [Default] joyport2_name=JOY0 ; ; ; input.joymouse_speed_analog=2 input.joymouse_speed_digital=10 input.joymouse_deadzone=33 input.joystick_deadzone=33 input.analog_joystick_multiplier=15 input.analog_joystick_offset=-1 input.mouse_speed=100 input.autofire_speed=2496 kbd_lang=us ; ; *** Host-Specific ; amiberry.vertical_offset=0 amiberry.hide_idle_led=0 amiberry.gfx_correct_aspect=1 amiberry.kbd_led_num=-1 amiberry.kbd_led_scr=-1 amiberry.scaling_method=-1 amiberry.use_analogue_remap=false amiberry.use_retroarch_quit=true amiberry.use_retroarch_menu=true amiberry.use_retroarch_reset=false ; ; *** Common / Paths ; use_gui=no kickstart_rom_file=$(FILE_PATH)/kick40068.A1200 kickstart_ext_rom_file= ide_mb_rom_file=:ENABLED flash_file= cart_file= ; ; *** Floppy Drives ; ;floppy0= ;floppy1= ;floppy2= ;floppy3= nr_floppies=4 floppy_speed=100 ; ; *** Hard Drives ; ; ; *** CD / CD32 ; cd_speed=100 ; ; *** Display / Screen Setup ; gfx_framerate=0 gfx_width=640 gfx_height=256 gfx_refreshrate=50 gfx_refreshrate_rtg=50 gfx_lores=false gfx_resolution=hires gfx_linemode=none gfx_fullscreen_amiga=true gfx_fullscreen_picasso=true ntsc=false ; ; *** CPU options ; cpu_speed=real cpu_type=68ec020 cpu_model=68020 cpu_compatible=false cpu_24bit_addressing=true fpu_strict=false compfpu=true cachesize=0 finegrain_cpu_speed=1024 ; ; *** Memory ; chipmem_size=4 z3mapping=real fastmem_size=0 a3000mem_size=0 mbresmem_size=0 z3mem_size=0 z3mem_start=0x40000000 bogomem_size=0 rtg_modes=0x502 ; ; *** Chipset ; chipset=aga chipset_refreshrate=50.000000 collision_level=playfields chipset_compatible=Generic rtc=MSM6242B immediate_blits=false fast_copper=true ; ; *** Sound Options ; sound_output=exact sound_channels=stereo sound_stereo_separation=7 sound_stereo_mixing_delay=0 sound_frequency=44100 sound_interpol=none sound_filter=off sound_filter_type=standard sound_volume_cd=20 ; ; *** Misc. Options ; bsdsocket_emu=false gfx_center_vertical=smart gfx_center_horizontal=smart gfx_center_vertical=smart gfx_center_horizontal=smart ================================================ FILE: packages/sx05re/emulators/amiberry/config/conf/AmigaA500-default.uae ================================================ config_description=UAE Amiga 500 default configuration config_hardware=true config_host=true config_version=8.0.0 config_hardware_path= config_host_path= config_all_path= amiberry.rom_path=./ amiberry.floppy_path=./ amiberry.hardfile_path=./ ; host-specific amiberry.middle_mouse=true amiberry.active_priority=2 amiberry.soundcard=0 amiberry.soundcardname=AML-AUGESOUND, ; common use_gui=no use_debugger=false kickstart_rom_file=/storage/roms/bios/amiga-os-130.rom kickstart_rom_file_id=C4F0F55F,KS ROM v1.3 (A500,A1000,A2000) kickstart_ext_rom_file= flash_file= cart_file= rtc_file= kickshifter=false scsidevice_disable=false floppy_volume=33 floppy1= floppy1type=-1 floppy2= floppy3= nr_floppies=1 floppy_speed=100 cd_speed=100 parallel_on_demand=false serial_on_demand=false serial_hardware_ctsrts=true serial_status=true serial_direct=false scsi=false uaeserial=false sana2=false sound_output=exact sound_channels=stereo sound_stereo_separation=7 sound_stereo_mixing_delay=0 sound_max_buff=8192 sound_frequency=44100 sound_interpol=anti sound_filter=emulated sound_filter_type=standard sound_volume=0 sound_volume_paula=0 sound_volume_cd=0 sound_volume_ahi=0 sound_volume_midi=0 sound_volume_genlock=0 sound_auto=false sound_stereo_swap_paula=false sound_stereo_swap_ahi=false comp_trustbyte=direct comp_trustword=direct comp_trustlong=direct comp_trustnaddr=direct comp_nf=true comp_constjump=true comp_flushmode=soft comp_catchfault=true cachesize=0 joyport0=mouse joyport0autofire=none joyportfriendlyname0=System mouse joyportname0=MOUSE0 joyport1=joy0 joyport1autofire=none joyportfriendlyname1=Wireless Controller joyportname1=JOY0 joyport1_amiberry_custom_none_a= joyport1_amiberry_custom_none_b= joyport1_amiberry_custom_none_x= joyport1_amiberry_custom_none_y= joyport1_amiberry_custom_none_back= joyport1_amiberry_custom_none_guide= joyport1_amiberry_custom_none_start= joyport1_amiberry_custom_none_leftstick= joyport1_amiberry_custom_none_rightstick= joyport1_amiberry_custom_none_leftshoulder= joyport1_amiberry_custom_none_rightshoulder= joyport1_amiberry_custom_none_dpup= joyport1_amiberry_custom_none_dpdown= joyport1_amiberry_custom_none_dpleft= joyport1_amiberry_custom_none_dpright= joyport1_amiberry_custom_none_misc1= joyport1_amiberry_custom_none_paddle1= joyport1_amiberry_custom_none_paddle2= joyport1_amiberry_custom_none_paddle3= joyport1_amiberry_custom_none_paddle4= joyport1_amiberry_custom_none_touchpad= joyport1_amiberry_custom_axis_none_leftx= joyport1_amiberry_custom_axis_none_lefty= joyport1_amiberry_custom_axis_none_rightx= joyport1_amiberry_custom_axis_none_righty= joyport1_amiberry_custom_axis_none_lefttrigger= joyport1_amiberry_custom_axis_none_righttrigger= joyport1_amiberry_custom_hotkey_a= joyport1_amiberry_custom_hotkey_b= joyport1_amiberry_custom_hotkey_x= joyport1_amiberry_custom_hotkey_y= joyport1_amiberry_custom_hotkey_back= joyport1_amiberry_custom_hotkey_guide= joyport1_amiberry_custom_hotkey_start= joyport1_amiberry_custom_hotkey_leftstick= joyport1_amiberry_custom_hotkey_rightstick= joyport1_amiberry_custom_hotkey_leftshoulder= joyport1_amiberry_custom_hotkey_rightshoulder= joyport1_amiberry_custom_hotkey_dpup= joyport1_amiberry_custom_hotkey_dpdown= joyport1_amiberry_custom_hotkey_dpleft= joyport1_amiberry_custom_hotkey_dpright= joyport1_amiberry_custom_hotkey_misc1= joyport1_amiberry_custom_hotkey_paddle1= joyport1_amiberry_custom_hotkey_paddle2= joyport1_amiberry_custom_hotkey_paddle3= joyport1_amiberry_custom_hotkey_paddle4= joyport1_amiberry_custom_hotkey_touchpad= joyport1_amiberry_custom_axis_hotkey_leftx= joyport1_amiberry_custom_axis_hotkey_lefty= joyport1_amiberry_custom_axis_hotkey_rightx= joyport1_amiberry_custom_axis_hotkey_righty= joyport1_amiberry_custom_axis_hotkey_lefttrigger= joyport1_amiberry_custom_axis_hotkey_righttrigger= bsdsocket_emu=false synchronize_clock=false maprom=0x0 parallel_postscript_emulation=false parallel_postscript_detection=false ghostscript_parameters= parallel_autoflush=5 gfx_display=0 gfx_display_rtg=0 gfx_framerate=1 gfx_width=720 gfx_height=568 gfx_x_windowed=0 gfx_y_windowed=0 gfx_width_windowed=720 gfx_height_windowed=568 gfx_width_fullscreen=800 gfx_height_fullscreen=600 gfx_refreshrate=0 gfx_autoresolution=0 gfx_autoresolution_vga=true gfx_backbuffers=2 gfx_backbuffers_rtg=1 gfx_vsync=false gfx_vsyncmode=normal gfx_vsync_picasso=false gfx_vsyncmode_picasso=normal gfx_lores=false gfx_resolution=hires gfx_lores_mode=normal gfx_flickerfixer=false gfx_linemode=double2 gfx_fullscreen_amiga=fullwindow gfx_fullscreen_picasso=fullwindow gfx_center_horizontal=none gfx_center_vertical=none gfx_colour_mode=32bit gfx_blacker_than_black=false gfx_api=sdl2 gfx_api_options=hardware immediate_blits=false ntsc=false genlock=false chipset=ocs chipset_refreshrate=49.920410 collision_level=full chipset_compatible=A500 display_optimizations=full rtc=MSM6242B resetwarning=false cia_todbug=true fastmem_size=0 debugmem_start=0x0 debugmem_size=0 mem25bit_size=0 a3000mem_size=0 mbresmem_size=0 z3mem_size=0 z3mem_start=0x40000000 bogomem_size=2 gfxcard_hardware_vblank=false gfxcard_hardware_sprite=false gfxcard_multithread=false chipmem_size=1 cpu_speed=real cpu_throttle=0.0 cpu_type=68000 cpu_model=68000 cpu_compatible=true cpu_24bit_addressing=true cpu_data_cache=false cpu_multiplier=2 cpu_cycle_exact=true cpu_memory_cycle_exact=true blitter_cycle_exact=true cycle_exact=true fpu_strict=false rtg_nocustom=true rtg_modes=0x112 rtg_noautomodes=false debug_mem=false log_illegal_mem=false kbd_lang=us input.config=0 input.joymouse_speed_analog=100 input.joymouse_speed_digital=10 input.joymouse_deadzone=33 input.joystick_deadzone=33 input.analog_joystick_multiplier=18 input.analog_joystick_offset=-5 input.mouse_speed=100 input.autofire_speed=600 input.autoswitch=true ; *** WHDLoad Booter. Options whdload_filename= whdload_game_name= whdload_uuid= whdload_slave_default= whdload_slave_libraries=false whdload_slave= whdload_slave_data_path= whdload_custom1=0 whdload_custom2=0 whdload_custom3=0 whdload_custom4=0 whdload_custom5=0 whdload_custom= whdload_buttonwait=false whdload_showsplash=true whdload_writecache=false whdload_quit_on_exit=false ================================================ FILE: packages/sx05re/emulators/amiberry/config/conf/amiberry.conf ================================================ Quickstart=1 read_config_descriptions=yes write_logfile=no default_line_mode=1 rctrl_as_ramiga=no gui_joystick_control=yes default_multithreaded_drawing=yes input_default_mouse_speed=100 input_keyboard_as_joystick_stop_keypresses=no default_open_gui_key=F12 default_quit_key= default_ar_key=Pause default_fullscreen_toggle_key= rotation_angle=0 default_horizontal_centering=no default_vertical_centering=no default_scaling_method=-1 default_gfx_autoresolution=0 default_frameskip=no default_correct_aspect_ratio=yes default_auto_crop=no default_width=720 default_height=568 default_fullscreen_mode=1 default_stereo_separation=7 default_sound_frequency=44100 default_sound_buffer=8192 default_sound_pull=yes default_joystick_deadzone=33 default_retroarch_quit=yes default_retroarch_menu=yes default_retroarch_reset=no default_retroarch_vkbd=no default_controller1=joy1 default_controller2=joy2 default_controller3= default_controller4= default_mouse1=mouse default_mouse2=joy0 default_whd_buttonwait=no default_whd_showsplash=yes default_whd_configdelay=0 default_whd_writecache=no default_whd_quit_on_exit=no use_jst_instead_of_whd=no disable_shutdown_button=yes allow_display_settings_from_xml=yes default_soundcard=0 default_vkbd_enabled=no default_vkbd_hires=no default_vkbd_exit=no default_vkbd_language=US default_vkbd_style=Original default_vkbd_transparency=0 default_vkbd_toggle=guide gui_theme=Default.theme config_path=/storage/.config/amiberry/conf/ controllers_path=/storage/.config/amiberry/controller/ retroarch_config=/storage/.config/retroarch/retroarch.cfg whdboot_path=/storage/.config/amiberry/whdboot/ whdload_arch_path=/storage/.config/amiberry/lha/ floppy_path=/storage/.config/amiberry/floppies/ harddrive_path=/storage/.config/amiberry/harddrives/ cdrom_path=/storage/.config/amiberry/cdroms/ logfile_path=/storage/.config/amiberry/amiberry.log rom_path=/storage/.config/amiberry/kickstarts/ rp9_path=/storage/.config/amiberry/rp9/ floppy_sounds_dir=/storage/.config/amiberry/data/floppy_sounds/ saveimage_dir=/storage/.config/amiberry/ savestate_dir=/storage/.config/amiberry/savestates/ screenshot_dir=/storage/.config/amiberry/screenshots/ ripper_path=/storage/.config/amiberry/ripper/ inputrecordings_dir=/storage/.config/amiberry/inputrecordings/ nvram_dir=/storage/.config/amiberry/nvram/ plugins_dir=/storage/.config/amiberry/plugins video_dir=/storage/.config/amiberry/videos/ themes_path=/storage/.config/amiberry/themes/ MRUDiskList=1 MRUCDList=0 MRUWHDLoadList=0 ================================================ FILE: packages/sx05re/emulators/amiberry/libenet/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2025-present EmuELEC (https://github.com/emuelec) PKG_NAME="libenet" PKG_VERSION="8be2368a8001f28db44e81d5939de5e613025023" PKG_LICENSE="GPL" PKG_SITE="https://github.com/lsalzman/enet" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="ENet reliable UDP networking library" PKG_TOOLCHAIN="auto" ================================================ FILE: packages/sx05re/emulators/amiberry/libportmidi/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2025-present EmuELEC (https://github.com/emuelec) PKG_NAME="libportmidi" PKG_VERSION="7e978e1ef5bf199ad9ea43e3d224cd3f19cb2077" PKG_LICENSE="other" PKG_SITE="https://github.com/PortMidi/portmidi" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain alsa" PKG_LONGDESC="portmidi is a cross-platform MIDI input/output library" PKG_TOOLCHAIN="auto" ================================================ FILE: packages/sx05re/emulators/amiberry/libserialport/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2025-present EmuELEC (https://github.com/emuelec) PKG_NAME="libserialport" PKG_VERSION="21b3dfe5f68c205be4086469335fd2fc2ce11ed2" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/sigrokproject/libserialport" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="libserialport is a minimal, cross-platform shared library written in C that is intended to take care of the OS-specific details when writing software that uses serial ports." PKG_TOOLCHAIN="configure" pre_configure_target() { ${PKG_BUILD}/autogen.sh } ================================================ FILE: packages/sx05re/emulators/amiberry/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Frank Hartung (supervisedthinking (@) gmail.com) PKG_NAME="amiberry" PKG_VERSION="452783ae8c94a67984b664e9b24f0b99ad163dcd" PKG_ARCH="aarch64 arm" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/BlitterStudio/amiberry" PKG_URL="https://github.com/BlitterStudio/amiberry.git" PKG_DEPENDS_TARGET="toolchain linux libpcap libenet glibc bzip2 zlib SDL2 SDL2_image SDL2_ttf capsimg freetype libxml2 flac libogg mpg123-compat libpng libmpeg2 libportmidi libserialport" PKG_LONGDESC="Amiberry is an optimized Amiga emulator for ARM-based boards." GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="cmake" PKG_EE_UPDATE=no PKG_BUILD_FLAGS="-O3 -fno-strict-aliasing -fomit-frame-pointer -ffast-math" pre_configure_target() { PKG_CMAKE_OPTS_TARGET="-DUSE_OPENGL=OFF -DCMAKE_BUILD_TYPE=Release -DUSE_UAENET_PCAP=ON" } makeinstall_target() { # Create directories mkdir -p ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/lib mkdir -p ${INSTALL}/usr/config/amiberry # mkdir -p ${INSTALL}/usr/config/amiberry/controller # Copy ressources cp -a ${PKG_DIR}/config/* ${INSTALL}/usr/config/amiberry/ cp -a data ${INSTALL}/usr/config/amiberry/ cp -a roms ${INSTALL}/usr/config/amiberry/ mkdir -p savestates ${INSTALL}/usr/config/amiberry/ mkdir -p screenshots ${INSTALL}/usr/config/amiberry/ cp -a whdboot ${INSTALL}/usr/config/amiberry/ ln -s /storage/roms/bios ${INSTALL}/usr/config/amiberry/kickstarts mkdir -p ${INSTALL}/usr/config/amiberry/plugins cp ${PKG_BUILD}/.${TARGET_NAME}/external/floppybridge/libfloppybridge.so ${INSTALL}/usr/config/amiberry/plugins/ cp ${PKG_BUILD}/.${TARGET_NAME}/external/capsimage/*.so ${INSTALL}/usr/config/amiberry/plugins/ # Create links to Retroarch controller files # ln -s /usr/share/retroarch/autoconfig/udev/8Bitdo_Pro_SF30_BT_B.cfg "${INSTALL}/usr/config/amiberry/controller/8Bitdo SF30 Pro.cfg" ln -s "/tmp/joypads" "${INSTALL}/usr/config/amiberry/controller" # Copy binary, scripts & link libcapsimg cp -a amiberry* ${INSTALL}/usr/bin/amiberry cp -a ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin UAE="${INSTALL}/usr/config/amiberry/conf/*.uae" for i in ${UAE}; do echo -e "gfx_center_vertical=smart\ngfx_center_horizontal=smart" >> ${i}; done } ================================================ FILE: packages/sx05re/emulators/amiberry/patches/001-default_fullscreen.patch ================================================ --- a/src/include/options.h 2024-03-13 19:51:07.175899314 +0100 +++ b/src/include/options.h 2024-03-13 19:51:30.872392451 +0100 @@ -1244,7 +1244,7 @@ bool default_auto_crop = false; int default_width = 720; int default_height = 568; - int default_fullscreen_mode = 0; + int default_fullscreen_mode = 1; int default_stereo_separation = 7; int default_sound_buffer = 8192; bool default_sound_pull = true; ================================================ FILE: packages/sx05re/emulators/amiberry/patches/002-paths.patch ================================================ diff '--color=auto' -uri amiberry-v7.1.0-orig/src/osdep/amiberry.cpp amiberry-v7.1.0/src/osdep/amiberry.cpp --- amiberry-v7.1.0-orig/src/osdep/amiberry.cpp 2025-07-09 14:01:05.000000000 -0700 +++ amiberry-v7.1.0/src/osdep/amiberry.cpp 2025-07-23 09:30:24.737904046 -0700 @@ -4398,8 +4398,10 @@ if (!my_existsdir(xdg_config_home.c_str())) my_mkdir(xdg_config_home.c_str()); - amiberry_conf_file = xdg_config_home + "/amiberry.conf"; - amiberry_ini_file = xdg_config_home + "/amiberry.ini"; + //amiberry_conf_file = xdg_config_home + "/amiberry.conf"; + //amiberry_ini_file = xdg_config_home + "/amiberry.ini"; + amiberry_conf_file = std::string("/storage/.config/amiberry/conf/amiberry.conf"); + amiberry_ini_file = std::string("/storage/.config/amiberry/conf/amiberry.ini"); } return my_existsfile2(amiberry_conf_file.c_str()); } ================================================ FILE: packages/sx05re/emulators/amiberry/patches/003-use_udev_gamepad_name.patch ================================================ --- a/src/osdep/retroarch.cpp +++ b/src/osdep/retroarch.cpp @@ -71,7 +71,22 @@ if (param[0] != 'h') // check it isn't some kind of hat starting 'h' (so if D-pad uses buttons) { - button = abs(std::stoi(param)); + try + { + button = abs(std::stoi(param)); + } + catch (const std::invalid_argument& e) + { + write_log("Invalid argument in stoi for param='%s' in setting='%s' (line: %s)", + param.c_str(), find_setting.c_str(), line.c_str()); + button = -1; // fallback + } + catch (const std::out_of_range& e) + { + write_log("Out of range in stoi for param='%s' in setting='%s' (line: %s)", + param.c_str(), find_setting.c_str(), line.c_str()); + button = -1; + } } if (option == find_setting) --- a/src/osdep/amiberry_input.cpp +++ b/src/osdep/amiberry_input.cpp --- +++ @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include "sysdeps.h" #include "options.h" @@ -1073,6 +1075,54 @@ return num_joystick; } +std::string get_udev_name_from_proc(SDL_Joystick* joystick) +{ + const char* joystick_path = SDL_JoystickPath(joystick); + if (joystick_path == nullptr) + return ""; + + // Extract the event number from the path (e.g., "/dev/input/event5" -> "event5") + const char* last_slash = strrchr(joystick_path, '/'); + if (last_slash == nullptr) + return ""; + + std::string event_name = std::string(last_slash + 1); + + // Parse /proc/bus/input/devices to find the matching device + std::ifstream devices_file("/proc/bus/input/devices"); + if (!devices_file.is_open()) + return ""; + + std::string line; + std::string current_name; + bool found_device = false; + + while (std::getline(devices_file, line)) + { + // Look for Name line (e.g., N: Name="Microsoft X-Box 360 pad") + if (line.substr(0, 3) == "N: ") + { + size_t start = line.find('"'); + size_t end = line.rfind('"'); + if (start != std::string::npos && end != std::string::npos && end > start) + current_name = line.substr(start + 1, end - start - 1); + } + // Look for Handlers line containing our event device + else if (line.substr(0, 3) == "H: " && line.find(event_name) != std::string::npos) + { + found_device = true; + break; + } + // Empty line indicates new device section + else if (line.empty()) + { + current_name.clear(); + } + } + + return found_device ? current_name : ""; +} + // Helper functions void open_as_game_controller(struct didata* did, const int i) { @@ -1098,6 +1148,9 @@ did->joystick_name.assign(SDL_JoystickNameForIndex(i)); else did->joystick_name = ""; + + // Get UDEV name from /proc/bus/input/devices + did->udev_name = get_udev_name_from_proc(did->joystick); if (!did->controller_name.empty()) did->name = did->controller_name; @@ -1210,8 +1263,19 @@ } const std::string retroarch_file = get_retroarch_file(); - const bool retroarch_config_exists = !retroarch_config_file.empty() && my_existsfile2(retroarch_config_file.c_str()); + bool retroarch_config_exists = !retroarch_config_file.empty() && my_existsfile2(retroarch_config_file.c_str()); + + if (!retroarch_config_exists && !did->udev_name.empty()) + { + const auto sanitized_name = sanitize_retroarch_name(did->udev_name); + retroarch_config_file = controllers + sanitized_name + ".cfg"; + write_log("Joystick udev name: '%s', sanitized to: '%s'\n", did->joystick_name.c_str(), sanitized_name.c_str()); + write_log("Checking for Retroarch cfg file using udev: '%s'\n", retroarch_config_file.c_str()); + } + + retroarch_config_exists = !retroarch_config_file.empty() && my_existsfile2(retroarch_config_file.c_str()); const bool retroarch_file_exists = my_existsfile2(retroarch_file.c_str()); + if (retroarch_config_exists || retroarch_file_exists) { --- a/src/osdep/amiberry_input.h +++ b/src/osdep/amiberry_input.h @@ -49,6 +49,7 @@ int type{}; int acquired{}; std::string name{}; + std::string udev_name{}; std::string controller_name{}; std::string joystick_name{}; ================================================ FILE: packages/sx05re/emulators/amiberry/patches/fix_fbdev_window.patch ================================================ From dd65698e9919d4df13d305e2bfe91b044611b201 Mon Sep 17 00:00:00 2001 From: Adventurous Programmer <47227694+Diegrosan@users.noreply.github.com> Date: Sat, 11 Oct 2025 22:37:01 -0300 Subject: [PATCH] Update main_window.cpp --- src/osdep/gui/main_window.cpp | 154 ++++++++++++++++++++++++++++------ 1 file changed, 127 insertions(+), 27 deletions(-) diff --git a/src/osdep/gui/main_window.cpp b/src/osdep/gui/main_window.cpp index d6ba1f258..141e29331 100644 --- a/src/osdep/gui/main_window.cpp +++ b/src/osdep/gui/main_window.cpp @@ -26,6 +26,9 @@ #include "inputdevice.h" #include "xwin.h" +static bool fbdev_detected = false; +static bool reusing_amiga_resources = false; + bool ctrl_state = false, shift_state = false, alt_state = false, win_state = false; int last_x = 0; int last_y = 0; @@ -246,6 +249,12 @@ void update_gui_screen() { const AmigaMonitor* mon = &AMonitors[0]; + if (!gui_texture || !gui_screen || !mon->gui_renderer) + { + write_log("WARNING: update_gui_screen called with null pointers!\n"); + return; + } + SDL_UpdateTexture(gui_texture, nullptr, gui_screen->pixels, gui_screen->pitch); if (amiberry_options.rotation_angle == 0 || amiberry_options.rotation_angle == 180) gui_renderQuad = { 0, 0, gui_screen->w, gui_screen->h }; @@ -259,23 +268,70 @@ void update_gui_screen() show_screen(0, 0); } + void amiberry_gui_init() { AmigaMonitor* mon = &AMonitors[0]; sdl_video_driver = SDL_GetCurrentVideoDriver(); - if (sdl_video_driver != nullptr && strcmpi(sdl_video_driver, "KMSDRM") == 0) + write_log("=== GUI INIT START ===\n"); + write_log("SDL Video Driver: %s\n", sdl_video_driver ? sdl_video_driver : "NULL"); + write_log("amiga_window exists: %s\n", mon->amiga_window ? "YES" : "NO"); + write_log("amiga_renderer exists: %s\n", mon->amiga_renderer ? "YES" : "NO"); + write_log("gui_window exists: %s\n", mon->gui_window ? "YES" : "NO"); + write_log("gui_renderer exists: %s\n", mon->gui_renderer ? "YES" : "NO"); + + reusing_amiga_resources = false; // Reset + + if (sdl_video_driver != nullptr) { - kmsdrm_detected = true; - if (!mon->gui_window && mon->amiga_window) + if (strcmpi(sdl_video_driver, "KMSDRM") == 0) + { + write_log("KMSDRM detected\n"); + kmsdrm_detected = true; + fbdev_detected = false; + + if (!mon->gui_window && mon->amiga_window) + { + mon->gui_window = mon->amiga_window; + reusing_amiga_resources = true; + write_log("Reusing amiga_window for GUI (KMSDRM)\n"); + } + if (!mon->gui_renderer && mon->amiga_renderer) + { + mon->gui_renderer = mon->amiga_renderer; + reusing_amiga_resources = true; + write_log("Reusing amiga_renderer for GUI (KMSDRM)\n"); + } + } + else if (strcmpi(sdl_video_driver, "fbdev") == 0 || + strstr(sdl_video_driver, "mali") != nullptr) { - mon->gui_window = mon->amiga_window; + write_log("fbdev/mali detected\n"); + fbdev_detected = true; + kmsdrm_detected = true; // Para compatibilidade + + if (!mon->gui_window && mon->amiga_window) + { + mon->gui_window = mon->amiga_window; + reusing_amiga_resources = true; + write_log("Reusing amiga_window for GUI (fbdev)\n"); + } + if (!mon->gui_renderer && mon->amiga_renderer) + { + mon->gui_renderer = mon->amiga_renderer; + reusing_amiga_resources = true; + write_log("Reusing amiga_renderer for GUI (fbdev)\n"); + } } - if (!mon->gui_renderer && mon->amiga_renderer) + else { - mon->gui_renderer = mon->amiga_renderer; + write_log("Standard video driver: %s\n", sdl_video_driver); + kmsdrm_detected = false; + fbdev_detected = false; } } + SDL_GetCurrentDisplayMode(0, &sdl_mode); //------------------------------------------------- @@ -285,23 +341,22 @@ void amiberry_gui_init() { gui_screen = SDL_CreateRGBSurface(0, GUI_WIDTH, GUI_HEIGHT, 16, 0, 0, 0, 0); check_error_sdl(gui_screen == nullptr, "Unable to create GUI surface:"); + write_log("GUI surface created\n"); } if (!mon->gui_window) { - write_log("Creating Amiberry GUI window...\n"); + write_log("Creating new Amiberry GUI window...\n"); regqueryint(nullptr, _T("GUIPosX"), &gui_window_rect.x); regqueryint(nullptr, _T("GUIPosY"), &gui_window_rect.y); Uint32 mode; if (!kmsdrm_detected) { - // Only enable Windowed mode if we're running under x11 mode = SDL_WINDOW_RESIZABLE; } else { - // otherwise go for Full-window mode = SDL_WINDOW_FULLSCREEN_DESKTOP; } @@ -311,7 +366,6 @@ void amiberry_gui_init() mode |= SDL_WINDOW_HIDDEN; else mode |= SDL_WINDOW_SHOWN; - // Set Window allow high DPI by default mode |= SDL_WINDOW_ALLOW_HIGHDPI; if (amiberry_options.rotation_angle == 0 || amiberry_options.rotation_angle == 180) @@ -333,6 +387,7 @@ void amiberry_gui_init() mode); } check_error_sdl(mon->gui_window == nullptr, "Unable to create window:"); + write_log("New GUI window created\n"); auto* const icon_surface = IMG_Load(prefix_with_data_path("amiberry.png").c_str()); if (icon_surface != nullptr) @@ -341,16 +396,23 @@ void amiberry_gui_init() SDL_FreeSurface(icon_surface); } } - else if (kmsdrm_detected) + else { - SDL_SetWindowSize(mon->gui_window, GUI_WIDTH, GUI_HEIGHT); + write_log("Using existing window for GUI\n"); } if (mon->gui_renderer == nullptr) { + write_log("Creating new GUI renderer...\n"); mon->gui_renderer = SDL_CreateRenderer(mon->gui_window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); check_error_sdl(mon->gui_renderer == nullptr, "Unable to create a renderer:"); + write_log("New GUI renderer created\n"); + } + else + { + write_log("Using existing renderer for GUI\n"); } + DPIHandler::set_render_scale(mon->gui_renderer); gui_texture = SDL_CreateTexture(mon->gui_renderer, gui_screen->format->format, SDL_TEXTUREACCESS_STREAMING, gui_screen->w, @@ -364,31 +426,34 @@ void amiberry_gui_init() SDL_SetRelativeMouseMode(SDL_FALSE); SDL_ShowCursor(SDL_ENABLE); - SDL_RaiseWindow(mon->gui_window); //------------------------------------------------- // Create helpers for GUI framework //------------------------------------------------- - gui_imageLoader = new gcn::SDLImageLoader(); gui_imageLoader->setRenderer(mon->gui_renderer); - - // The ImageLoader in use is static and must be set to be - // able to load images gcn::Image::setImageLoader(gui_imageLoader); + gui_graphics = new gcn::SDLGraphics(); - // Set the target for the graphics object to be the screen. - // In other words, we will draw to the screen. - // Note, any surface will do, it doesn't have to be the screen. gui_graphics->setTarget(gui_screen); + gui_input = new gcn::SDLInput(); + + write_log("=== GUI INIT COMPLETE ===\n"); + write_log("Reusing amiga resources: %s\n", reusing_amiga_resources ? "YES" : "NO"); } void amiberry_gui_halt() { AmigaMonitor* mon = &AMonitors[0]; + write_log("=== GUI HALT START ===\n"); + write_log("Reusing amiga resources: %s\n", reusing_amiga_resources ? "YES" : "NO"); + write_log("fbdev_detected: %s\n", fbdev_detected ? "YES" : "NO"); + write_log("kmsdrm_detected: %s\n", kmsdrm_detected ? "YES" : "NO"); + + // Clear GUI helpers delete gui_imageLoader; gui_imageLoader = nullptr; delete gui_input; @@ -396,30 +461,65 @@ void amiberry_gui_halt() delete gui_graphics; gui_graphics = nullptr; + // Clear GUI surface if (gui_screen != nullptr) { SDL_FreeSurface(gui_screen); gui_screen = nullptr; + write_log("GUI screen freed\n"); } + + // Clear GUI texture if (gui_texture != nullptr) { SDL_DestroyTexture(gui_texture); gui_texture = nullptr; + write_log("GUI texture destroyed\n"); } - if (mon->gui_renderer && !kmsdrm_detected) + + // CRITICAL: Deciding what to do with renderer and window + if (reusing_amiga_resources) { - SDL_DestroyRenderer(mon->gui_renderer); + + write_log("Releasing (not destroying) renderer and window - they belong to emulation\n"); + + // IMPORTANT: Reset logical size for the game + if (mon->gui_renderer) + { + SDL_RenderClear(mon->gui_renderer); + SDL_RenderPresent(mon->gui_renderer); + } + + // DO NOT destroy, just "release" the pointers mon->gui_renderer = nullptr; + mon->gui_window = nullptr; } + else + { + // created own resources, we destroy normally + write_log("Destroying GUI-owned renderer and window\n"); + + if (mon->gui_renderer) + { + SDL_DestroyRenderer(mon->gui_renderer); + mon->gui_renderer = nullptr; + write_log("GUI renderer destroyed\n"); + } - if (mon->gui_window && !kmsdrm_detected) { - regsetint(nullptr, _T("GUIPosX"), gui_window_rect.x); - regsetint(nullptr, _T("GUIPosY"), gui_window_rect.y); - SDL_DestroyWindow(mon->gui_window); - mon->gui_window = nullptr; + if (mon->gui_window) + { + regsetint(nullptr, _T("GUIPosX"), gui_window_rect.x); + regsetint(nullptr, _T("GUIPosY"), gui_window_rect.y); + SDL_DestroyWindow(mon->gui_window); + mon->gui_window = nullptr; + write_log("GUI window destroyed\n"); + } } + + write_log("=== GUI HALT COMPLETE ===\n"); } + void check_input() { const AmigaMonitor* mon = &AMonitors[0]; ================================================ FILE: packages/sx05re/emulators/amiberry/scripts/amiberry.start ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) originally created by Escalade (https://github.com/escalade) # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) # Copyright (C) 2025-present Langerz82 (https://github.com/Langerz82), worstcase_scenario (https://github.com/worstcase-scenario) . /etc/profile AMIBERRY_EXE=amiberry [[ "${2}" == "AMIBERRY-LITE" ]] && AMIBERRY_EXE=amiberry-lite # Core paths AMIBERRY_DIR=/storage/.config/${AMIBERRY_EXE} AMIBERRY_CONFIG_DIR="${AMIBERRY_DIR}/conf" AMIBERRY_TMP_DIR=/tmp/emulation/${AMIBERRY_EXE} AMIBERRY_TMP_CONFIG="${AMIBERRY_TMP_DIR}/.${AMIBERRY_EXE}_conf.uae" AMIBERRY_LOG=/emuelec/logs/${AMIBERRY_EXE}.log MAX_DRIVES=4 i=0 echo "EmuELEC ${AMIBERRY_EXE} Log" > "${AMIBERRY_LOG}" echo "Trying to boot this game: ${TARGET_FILE}" >> "${AMIBERRY_LOG}" # Force SDL audio backend export SDL_AUDIODRIVER=alsa # Amiberry loads assets relative to its working directory cd "${AMIBERRY_DIR}" # Prepare a clean temp dir if [ -d "${AMIBERRY_TMP_DIR}" ]; then echo "Clean up old working directory." >> "${AMIBERRY_LOG}" rm -rf "${AMIBERRY_TMP_DIR}" fi mkdir -p "${AMIBERRY_TMP_DIR}" ############################################################################### # Helper: detect machine model (A500 / A1200 / CD32) # Result is later passed to --model if no config template exists ############################################################################### AMIBERRY_SET_MODEL() { local MODEL=A500 # Heuristic for A1200 / AGA if [ "$(echo "${TARGET_FILE}" | grep -e 'AGA' | wc -l)" -eq 1 ] \ || [ "$(echo "${AMIBERRY_TMP_DIR}"/* | grep -e 'AGA' | wc -l)" -eq 1 ] \ || [[ "${TARGET_FILE}" = */amiga1200/* ]]; then MODEL=A1200 # Heuristic for CD32 elif [ "$(echo "${TARGET_FILE}" | grep -e 'CD32' | wc -l)" -eq 1 ] \ || [ "$(echo "${AMIBERRY_TMP_DIR}"/* | grep -e 'CD32' | wc -l)" -eq 1 ] \ || [[ "${TARGET_FILE}" = */cd32/* ]] \ || [[ "${TARGET_FILE}" = */amigacd32/* ]]; then MODEL=CD32 fi echo "${MODEL}" } ############################################################################### # Helper: pick a base config (.uae) for that model # Returns either '-f /tmp/.../.amiberry-lite_conf.uae' or an empty string ############################################################################### AMIBERRY_SET_CONF() { local CONF_MODEL="${1}" local CONFIG_FILE="${AMIBERRY_CONFIG_DIR}/Amiga${CONF_MODEL}-custom.uae" if [ -f "${CONFIG_FILE}" ]; then cp "${CONFIG_FILE}" "${AMIBERRY_TMP_CONFIG}" echo "-f ${AMIBERRY_TMP_CONFIG}" return fi CONFIG_FILE="${AMIBERRY_CONFIG_DIR}/custom.uae" if [ -f "${CONFIG_FILE}" ]; then cp "${CONFIG_FILE}" "${AMIBERRY_TMP_CONFIG}" echo "-f ${AMIBERRY_TMP_CONFIG}" return fi # no template available echo "" } ############################################################################### # Helper: build Amiberry arg string # Example: # "--model CD32 -G --log" # or "-f /tmp/.../.amiberry-lite_conf.uae --log" ############################################################################### AMIBERRY_GET_ARGS() { local MODEL MODEL="$( AMIBERRY_SET_MODEL "${1}" )" local CONF_ARG CONF_ARG="$( AMIBERRY_SET_CONF "${MODEL}" )" if [[ -z "${CONF_ARG}" ]]; then # fall back to explicit model if no template .uae exists CONF_ARG="--model ${MODEL}" fi echo ${CONF_ARG} -G ${AMIBERRY_ADD_ARGS} --log } TARGET_FILE="${1}" # extra args from caller if any AMIBERRY_ADD_ARGS="${3}" ############################################################################### # CASE 1: .zip # - WHDLoad-in-zip (lha/slave content) -> --autoload # - multi-floppy zip -> mount as DF0/DF1/DF2/DF3 ############################################################################### if echo "${TARGET_FILE}" | grep -qi .zip ; then unzip -j -q -o "${TARGET_FILE}" -d "${AMIBERRY_TMP_DIR}" # crude WHDLoad-in-zip detection: .nfo plus *.slave content if [ -f "${AMIBERRY_TMP_DIR}"/*.*nfo ] && [ -f "${AMIBERRY_TMP_DIR}"/*/*.*lave ]; then echo "Loading a WHDLoad (.zip) file" >> "${AMIBERRY_LOG}" AMIBERRY_ARGS="$( AMIBERRY_GET_ARGS "${TARGET_FILE}" )" ${AMIBERRY_EXE} ${AMIBERRY_ARGS} --autoload "${TARGET_FILE}" >> "${AMIBERRY_LOG}" 2>&1 else echo "Loading a .zip file with floppy images" >> "${AMIBERRY_LOG}" AMIBERRY_ARGS="$( AMIBERRY_GET_ARGS "${TARGET_FILE}" )" FLOPPY_ARG=() i=0 for FILE in "${AMIBERRY_TMP_DIR}"/*; do FLOPPY_ARG+=(-${i} "${FILE}") [[ "${FILE}" = *.cue ]] && CUE_FILE=${FILE} && break if [ `echo ${TARGET_FILE} | grep -i -e .chd -e .cue -e .iso -e .bin | wc -l` -eq 1 ]; then CD_FILE=${FILE} fi i=$((i+1)) if [ ${i} -eq ${MAX_DRIVES} ]; then break fi done if [[ ! -z ${CUE_FILE} ]]; then ${AMIBERRY_EXE} ${AMIBERRY_ARGS} --cdimage "${CUE_FILE}" >> "${AMIBERRY_LOG}" 2>&1 elif [[ ! -z ${CD_FILE} ]]; then ${AMIBERRY_EXE} ${AMIBERRY_ARGS} --autoload "${CD_FILE}" >> "${AMIBERRY_LOG}" 2>&1 else ${AMIBERRY_EXE} ${AMIBERRY_ARGS} "${FLOPPY_ARG[@]}" >> "${AMIBERRY_LOG}" 2>&1 fi fi ############################################################################### # CASE 2: .lha (WHDLoad install) # -> just --autoload ############################################################################### elif echo "${TARGET_FILE}" | grep -qi .lha ; then echo "Loading a WHDLoad (.lha) file" >> "${AMIBERRY_LOG}" AMIBERRY_ARGS="$( AMIBERRY_GET_ARGS "${TARGET_FILE}" )" ${AMIBERRY_EXE} ${AMIBERRY_ARGS} --autoload "${TARGET_FILE}" >> "${AMIBERRY_LOG}" 2>&1 ############################################################################### # CASE 3: .uae (explicit Amiberry config) ############################################################################### elif echo "${TARGET_FILE}" | grep -qi .uae ; then echo "Loading a .uae file" >> "${AMIBERRY_LOG}" AMIBERRY_ARGS="$( AMIBERRY_GET_ARGS "${TARGET_FILE}" )" ${AMIBERRY_EXE} ${AMIBERRY_ARGS} -f "${TARGET_FILE}" >> "${AMIBERRY_LOG}" 2>&1 ############################################################################### # CASE 4: .hdf (hardfile / HDD image) # We build a temp config that mounts the .hdf as DH0 and boots from it # We force model A1200 in this path ############################################################################### elif echo "${TARGET_FILE}" | grep -qi .hdf ; then echo "Loading a hardfile (.hdf)" >> "${AMIBERRY_LOG}" # try A1200 template first, then custom.uae BASE_CFG="${AMIBERRY_CONFIG_DIR}/AmigaA1200-custom.uae" if [ ! -f "${BASE_CFG}" ]; then BASE_CFG="${AMIBERRY_CONFIG_DIR}/custom.uae" fi if [ -f "${BASE_CFG}" ]; then cp "${BASE_CFG}" "${AMIBERRY_TMP_CONFIG}" else : > "${AMIBERRY_TMP_CONFIG}" fi # append HDD mapping cat >> "${AMIBERRY_TMP_CONFIG}" <> "${AMIBERRY_LOG}" 2>&1 ############################################################################### # CASE 5: CD / CD32 images (.chd .cue .iso .bin) # This is the critical amigacd32 path # We call --autoload so Amiberry mounts it as CD drive instead of DF0 # AMIBERRY_GET_ARGS will set --model CD32 if the path matches amigacd32 ############################################################################### elif echo "${TARGET_FILE}" | grep -qi -e .cue ; then echo "Loading a CD or CD32 image file" >> "${AMIBERRY_LOG}" AMIBERRY_ARGS="$( AMIBERRY_GET_ARGS "${TARGET_FILE}" )" ${AMIBERRY_EXE} ${AMIBERRY_ARGS} --cdimage "${TARGET_FILE}" >> "${AMIBERRY_LOG}" 2>&1 elif echo "${TARGET_FILE}" | grep -qi -e .chd -e .iso -e .bin ; then echo "Loading a CD or CD32 image file" >> "${AMIBERRY_LOG}" AMIBERRY_ARGS="$( AMIBERRY_GET_ARGS "${TARGET_FILE}" )" ${AMIBERRY_EXE} ${AMIBERRY_ARGS} --autoload "${TARGET_FILE}" >> "${AMIBERRY_LOG}" 2>&1 ############################################################################### # CASE 6: default floppy images (.adf .adz .ipf etc) # We mount the file as DF0 using -0 ############################################################################### else echo "Loading a single floppy image (.adf or .adz or .ipf)" >> "${AMIBERRY_LOG}" AMIBERRY_ARGS="$( AMIBERRY_GET_ARGS "${TARGET_FILE}" )" ${AMIBERRY_EXE} ${AMIBERRY_ARGS} -0 "${TARGET_FILE}" >> "${AMIBERRY_LOG}" 2>&1 fi # cleanup temp dir rm -rf "${AMIBERRY_TMP_DIR}" ================================================ FILE: packages/sx05re/emulators/amiberry-lite/config/conf/AmigaA1200-default.uae ================================================ config_description=UAE Amiga 1200/ Amiga CD32 default configuration config_hardware=true config_host=true config_version=3.6.0 rtg_nocustom=true a1000ram=false synchronize_clock=yes sound_auto=yes pandora.jump=-1 pandora.autofire_button=3 pandora.button2=1 pandora.button1=2 pandora.move_y=0 pandora.move_x=0 pandora.custom_r=0 pandora.custom_l=0 pandora.custom_y=0 pandora.custom_x=0 pandora.custom_b=0 pandora.custom_a=0 pandora.custom_right=0 pandora.custom_left=0 pandora.custom_down=0 pandora.custom_up=0 pandora.custom_dpad=0 pandora.custom_controls=0 pandora.tap_delay=10 pandora.stylus_offset=0 pandora.joy_port=0 pandora.joy_conf=0 pandora.cpu_speed=600 pandora.hardfile_path=/storage/.config/amiberry-lite/ pandora.floppy_path=/storage/.config/amiberry-lite/disks/ pandora.rom_path=/storage/.config/amiberry-lite/kickstarts/ amiberry.rom_path=/storage/.config/amiberry-lite/kickstarts/ amiberry.floppy_path=/storage/.config/amiberry-lite/disks/ amiberry.hardfile_path=/storage/.config/amiberry-lite/ amiberry.cd_path=/storage/.config/amiberry-lite/cd32/ ; ; *** Controller/Input Configuration ; joyport0=mouse joyport0_autofire=none joyport0_friendlyname=Mouse joyport0_name=MOUSE0 ; joyport1=joy1 joyport1_autofire=normal joyport1_friendlyname=Logitech Gamepad F310 joyport1_name=JOY1 ; joyport2=joy0 joyport2_autofire=normal joyport2_friendlyname=Keyboard as Joystick [Default] joyport2_name=JOY0 ; ; ; input.joymouse_speed_analog=2 input.joymouse_speed_digital=10 input.joymouse_deadzone=33 input.joystick_deadzone=33 input.analog_joystick_multiplier=15 input.analog_joystick_offset=-1 input.mouse_speed=100 input.autofire_speed=2496 kbd_lang=us ; ; *** Host-Specific ; amiberry.vertical_offset=0 amiberry.hide_idle_led=0 amiberry.gfx_correct_aspect=1 amiberry.kbd_led_num=-1 amiberry.kbd_led_scr=-1 amiberry.scaling_method=-1 amiberry.use_analogue_remap=false amiberry.use_retroarch_quit=true amiberry.use_retroarch_menu=true amiberry.use_retroarch_reset=false ; ; *** Common / Paths ; use_gui=no kickstart_rom_file=$(FILE_PATH)/kick40068.A1200 kickstart_ext_rom_file= ide_mb_rom_file=:ENABLED flash_file= cart_file= ; ; *** Floppy Drives ; ;floppy0= ;floppy1= ;floppy2= ;floppy3= nr_floppies=4 floppy_speed=100 ; ; *** Hard Drives ; ; ; *** CD / CD32 ; cd_speed=100 ; ; *** Display / Screen Setup ; gfx_framerate=0 gfx_width=640 gfx_height=256 gfx_refreshrate=50 gfx_refreshrate_rtg=50 gfx_lores=false gfx_resolution=hires gfx_linemode=none gfx_fullscreen_amiga=true gfx_fullscreen_picasso=true ntsc=false ; ; *** CPU options ; cpu_speed=real cpu_type=68ec020 cpu_model=68020 cpu_compatible=false cpu_24bit_addressing=true fpu_strict=false compfpu=true cachesize=0 finegrain_cpu_speed=1024 ; ; *** Memory ; chipmem_size=4 z3mapping=real fastmem_size=0 a3000mem_size=0 mbresmem_size=0 z3mem_size=0 z3mem_start=0x40000000 bogomem_size=0 rtg_modes=0x502 ; ; *** Chipset ; chipset=aga chipset_refreshrate=50.000000 collision_level=playfields chipset_compatible=Generic rtc=MSM6242B immediate_blits=false fast_copper=true ; ; *** Sound Options ; sound_output=exact sound_channels=stereo sound_stereo_separation=7 sound_stereo_mixing_delay=0 sound_frequency=44100 sound_interpol=none sound_filter=off sound_filter_type=standard sound_volume_cd=20 ; ; *** Misc. Options ; bsdsocket_emu=false ================================================ FILE: packages/sx05re/emulators/amiberry-lite/config/conf/AmigaA500-default.uae ================================================ config_description=UAE Amiga 500 default configuration config_hardware=true config_host=true config_version=8.0.0 config_hardware_path= config_host_path= config_all_path= amiberry.rom_path=./ amiberry.floppy_path=./ amiberry.hardfile_path=./ ; host-specific amiberry.middle_mouse=true amiberry.active_priority=2 amiberry.soundcard=0 amiberry.soundcardname=AML-AUGESOUND, ; common use_gui=no use_debugger=false kickstart_rom_file=/storage/roms/bios/amiga-os-130.rom kickstart_rom_file_id=C4F0F55F,KS ROM v1.3 (A500,A1000,A2000) kickstart_ext_rom_file= flash_file= cart_file= rtc_file= kickshifter=false scsidevice_disable=false floppy_volume=33 floppy0= floppy1= floppy1type=-1 floppy2= floppy3= nr_floppies=1 floppy_speed=100 cd_speed=100 parallel_on_demand=false serial_on_demand=false serial_hardware_ctsrts=true serial_status=true serial_direct=false scsi=false uaeserial=false sana2=false sound_output=exact sound_channels=stereo sound_stereo_separation=7 sound_stereo_mixing_delay=0 sound_max_buff=8192 sound_frequency=44100 sound_interpol=anti sound_filter=emulated sound_filter_type=standard sound_volume=0 sound_volume_paula=0 sound_volume_cd=0 sound_volume_ahi=0 sound_volume_midi=0 sound_volume_genlock=0 sound_auto=false sound_stereo_swap_paula=false sound_stereo_swap_ahi=false comp_trustbyte=direct comp_trustword=direct comp_trustlong=direct comp_trustnaddr=direct comp_nf=true comp_constjump=true comp_flushmode=soft comp_catchfault=true cachesize=0 joyport0=mouse joyport0autofire=none joyportfriendlyname0=System mouse joyportname0=MOUSE0 joyport1=joy0 joyport1autofire=none joyportfriendlyname1=Wireless Controller joyportname1=JOY0 joyport1_amiberry_custom_none_a= joyport1_amiberry_custom_none_b= joyport1_amiberry_custom_none_x= joyport1_amiberry_custom_none_y= joyport1_amiberry_custom_none_back= joyport1_amiberry_custom_none_guide= joyport1_amiberry_custom_none_start= joyport1_amiberry_custom_none_leftstick= joyport1_amiberry_custom_none_rightstick= joyport1_amiberry_custom_none_leftshoulder= joyport1_amiberry_custom_none_rightshoulder= joyport1_amiberry_custom_none_dpup= joyport1_amiberry_custom_none_dpdown= joyport1_amiberry_custom_none_dpleft= joyport1_amiberry_custom_none_dpright= joyport1_amiberry_custom_none_misc1= joyport1_amiberry_custom_none_paddle1= joyport1_amiberry_custom_none_paddle2= joyport1_amiberry_custom_none_paddle3= joyport1_amiberry_custom_none_paddle4= joyport1_amiberry_custom_none_touchpad= joyport1_amiberry_custom_axis_none_leftx= joyport1_amiberry_custom_axis_none_lefty= joyport1_amiberry_custom_axis_none_rightx= joyport1_amiberry_custom_axis_none_righty= joyport1_amiberry_custom_axis_none_lefttrigger= joyport1_amiberry_custom_axis_none_righttrigger= joyport1_amiberry_custom_hotkey_a= joyport1_amiberry_custom_hotkey_b= joyport1_amiberry_custom_hotkey_x= joyport1_amiberry_custom_hotkey_y= joyport1_amiberry_custom_hotkey_back= joyport1_amiberry_custom_hotkey_guide= joyport1_amiberry_custom_hotkey_start= joyport1_amiberry_custom_hotkey_leftstick= joyport1_amiberry_custom_hotkey_rightstick= joyport1_amiberry_custom_hotkey_leftshoulder= joyport1_amiberry_custom_hotkey_rightshoulder= joyport1_amiberry_custom_hotkey_dpup= joyport1_amiberry_custom_hotkey_dpdown= joyport1_amiberry_custom_hotkey_dpleft= joyport1_amiberry_custom_hotkey_dpright= joyport1_amiberry_custom_hotkey_misc1= joyport1_amiberry_custom_hotkey_paddle1= joyport1_amiberry_custom_hotkey_paddle2= joyport1_amiberry_custom_hotkey_paddle3= joyport1_amiberry_custom_hotkey_paddle4= joyport1_amiberry_custom_hotkey_touchpad= joyport1_amiberry_custom_axis_hotkey_leftx= joyport1_amiberry_custom_axis_hotkey_lefty= joyport1_amiberry_custom_axis_hotkey_rightx= joyport1_amiberry_custom_axis_hotkey_righty= joyport1_amiberry_custom_axis_hotkey_lefttrigger= joyport1_amiberry_custom_axis_hotkey_righttrigger= bsdsocket_emu=false synchronize_clock=false maprom=0x0 parallel_postscript_emulation=false parallel_postscript_detection=false ghostscript_parameters= parallel_autoflush=5 gfx_display=0 gfx_display_rtg=0 gfx_framerate=1 gfx_width=720 gfx_height=568 gfx_x_windowed=0 gfx_y_windowed=0 gfx_width_windowed=720 gfx_height_windowed=568 gfx_width_fullscreen=800 gfx_height_fullscreen=600 gfx_refreshrate=0 gfx_autoresolution=0 gfx_autoresolution_vga=true gfx_backbuffers=2 gfx_backbuffers_rtg=1 gfx_vsync=false gfx_vsyncmode=normal gfx_vsync_picasso=false gfx_vsyncmode_picasso=normal gfx_lores=false gfx_resolution=hires gfx_lores_mode=normal gfx_flickerfixer=false gfx_linemode=double2 gfx_fullscreen_amiga=fullwindow gfx_fullscreen_picasso=fullwindow gfx_center_horizontal=none gfx_center_vertical=none gfx_colour_mode=32bit gfx_blacker_than_black=false gfx_api=sdl2 gfx_api_options=hardware immediate_blits=false ntsc=false genlock=false chipset=ocs chipset_refreshrate=49.920410 collision_level=full chipset_compatible=A500 display_optimizations=full rtc=MSM6242B resetwarning=false cia_todbug=true fastmem_size=0 debugmem_start=0x0 debugmem_size=0 mem25bit_size=0 a3000mem_size=0 mbresmem_size=0 z3mem_size=0 z3mem_start=0x40000000 bogomem_size=2 gfxcard_hardware_vblank=false gfxcard_hardware_sprite=false gfxcard_multithread=false chipmem_size=1 cpu_speed=real cpu_throttle=0.0 cpu_type=68000 cpu_model=68000 cpu_compatible=true cpu_24bit_addressing=true cpu_data_cache=false cpu_multiplier=2 cpu_cycle_exact=true cpu_memory_cycle_exact=true blitter_cycle_exact=true cycle_exact=true fpu_strict=false rtg_nocustom=true rtg_modes=0x112 rtg_noautomodes=false debug_mem=false log_illegal_mem=false kbd_lang=us input.config=0 input.joymouse_speed_analog=100 input.joymouse_speed_digital=10 input.joymouse_deadzone=33 input.joystick_deadzone=33 input.analog_joystick_multiplier=18 input.analog_joystick_offset=-5 input.mouse_speed=100 input.autofire_speed=600 input.autoswitch=true ; *** WHDLoad Booter. Options whdload_filename= whdload_game_name= whdload_uuid= whdload_slave_default= whdload_slave_libraries=false whdload_slave= whdload_slave_data_path= whdload_custom1=0 whdload_custom2=0 whdload_custom3=0 whdload_custom4=0 whdload_custom5=0 whdload_custom= whdload_buttonwait=false whdload_showsplash=true whdload_writecache=false whdload_quit_on_exit=false ================================================ FILE: packages/sx05re/emulators/amiberry-lite/config/conf/adfdir.conf ================================================ path=/storage/roms/amiga/ config_path=/storage/.config/amiberry/conf/ controllers_path=/storage/.config/amiberry/controller/ retroarch_config=/storage/.config/retroarch/retroarch.cfg rom_path=/storage/.config/amiberry/kickstarts/ ROMs=6 ROMName=KS ROM v1.2 (A500,A1000,A2000) rev 33.180 (256k) [315093-01] ROMPath=/storage/.config/amiberry/kickstarts/kick33180.A500.rom ROMType=256 ROMName=KS ROM v1.3 (A500,A1000,A2000) rev 34.5 (256k) [315093-02] ROMPath=/storage/.config/amiberry/kickstarts/kick34005.A500.rom ROMType=256 ROMName=KS ROM v2.04 (A500+) rev 37.175 (512k) [390979-01] ROMPath=/storage/.config/amiberry/kickstarts/kick37175.A500.rom ROMType=256 ROMName=KS ROM v3.0 (A1200) rev 39.106 (512k) [391523-01/391524-01] ROMPath=/storage/.config/amiberry/kickstarts/kick39106.A1200.rom ROMType=256 ROMName=KS ROM v3.1 (A1200) rev 40.68 (512k) [391773-01/391774-01] ROMPath=/storage/.config/amiberry/kickstarts/kick40068.A1200.rom ROMType=256 ROMName=KS ROM v3.1 (A4000) rev 40.68 (512k) ROMPath=/storage/.config/amiberry/kickstarts/kick40068.A4000.rom ROMType=256 MRUDiskList=1 Diskfile= MRUCDList=0 Quickstart=1 read_config_descriptions=yes swap_win_alt_keys=no gui_joystick_control=yes use_sdl2_render_thread=no input_default_mouse_speed=100 input_keyboard_as_joystick_stop_keypresses=no default_open_gui_key=F12 ================================================ FILE: packages/sx05re/emulators/amiberry-lite/config/conf/amiberry-lite.conf ================================================ Quickstart=1 read_config_descriptions=yes write_logfile=yes default_line_mode=1 rctrl_as_ramiga=no gui_joystick_control=yes default_multithreaded_drawing=yes input_default_mouse_speed=100 input_keyboard_as_joystick_stop_keypresses=no default_open_gui_key=F12 default_quit_key= default_ar_key=Pause default_fullscreen_toggle_key= rotation_angle=0 default_horizontal_centering=no default_vertical_centering=no default_scaling_method=-1 default_gfx_autoresolution=0 default_frameskip=no default_correct_aspect_ratio=yes default_auto_crop=no default_width=720 default_height=568 default_fullscreen_mode=1 default_stereo_separation=7 default_sound_frequency=44100 default_sound_buffer=8192 default_sound_pull=yes default_joystick_deadzone=33 default_retroarch_quit=yes default_retroarch_menu=yes default_retroarch_reset=no default_retroarch_vkbd=no default_controller1=joy1 default_controller2=joy2 default_controller3= default_controller4= default_mouse1=mouse default_mouse2=joy0 default_whd_buttonwait=no default_whd_showsplash=yes default_whd_configdelay=0 default_whd_writecache=no default_whd_quit_on_exit=no use_jst_instead_of_whd=no disable_shutdown_button=no allow_display_settings_from_xml=yes default_soundcard=0 default_vkbd_enabled=no default_vkbd_hires=no default_vkbd_exit=no default_vkbd_language=US default_vkbd_style=Original default_vkbd_transparency=0 default_vkbd_toggle=guide gui_theme=Default.theme config_path=/storage/.config/amiberry-lite/conf/ controllers_path=/storage/.config/amiberry-lite/controller/ retroarch_config=/storage/.config/retroarch/retroarch.cfg whdboot_path=/storage/.config/amiberry-lite/whdboot/ whdload_arch_path=/storage/.config/amiberry-lite/lha/ floppy_path=/storage/.config/amiberry-lite/floppies/ harddrive_path=/storage/.config/amiberry-lite/harddrives/ cdrom_path=/storage/.config/amiberry-lite/cdroms/ logfile_path=/storage/.config/amiberry-lite/amiberry.log rom_path=/storage/.config/amiberry/kickstarts/ rp9_path=/storage/.config/amiberry-lite/rp9/ floppy_sounds_dir=/storage/.config/amiberry-lite/data/floppy_sounds/ saveimage_dir=/storage/.config/amiberry-lite/savestates/ savestate_dir=/storage/.config/amiberry-lite/savestates/ screenshot_dir=/storage/.config/amiberry-lite/screenshots/ ripper_path=/storage/.config/amiberry-lite/ripper/ inputrecordings_dir=/storage/.config/amiberry-lite/inputrecordings/ nvram_dir=/storage/.config/amiberry-lite/nvram/ plugins_dir=/storage/.config/amiberry-lite/plugins video_dir=/storage/.config/amiberry-lite/videos/ themes_path=/storage/.config/amiberry-lite/themes/ MRUDiskList=5 Diskfile= MRUCDList=1 CDfile= MRUWHDLoadList=1 ================================================ FILE: packages/sx05re/emulators/amiberry-lite/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Frank Hartung (supervisedthinking (@) gmail.com) PKG_NAME="amiberry-lite" PKG_VERSION="e535218c72071b9579debad0d30ae99390d681c3" PKG_ARCH="aarch64 arm" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/BlitterStudio/amiberry-lite" PKG_URL="https://github.com/BlitterStudio/amiberry-lite.git" PKG_DEPENDS_TARGET="toolchain linux libpcap glibc bzip2 zlib SDL2 SDL2_image SDL2_ttf capsimg freetype libxml2 flac libogg mpg123-compat libpng libmpeg2 libportmidi libserialport libenet" PKG_LONGDESC="Amiberry is an optimized Amiga emulator for ARM-based boards." GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="cmake" PKG_EE_UPDATE=no PKG_BUILD_FLAGS="-O3 -fno-strict-aliasing -fomit-frame-pointer -ffast-math" pre_configure_target() { PKG_CMAKE_OPTS_TARGET="-DUSE_OPENGL=OFF -DCMAKE_BUILD_TYPE=Release -DUSE_UAENET_PCAP=OFF" } makeinstall_target() { # Create directories mkdir -p ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/lib mkdir -p ${INSTALL}/usr/config/amiberry-lite # mkdir -p ${INSTALL}/usr/config/amiberry-lite/controller # Copy ressources cp -a ${PKG_DIR}/config/* ${INSTALL}/usr/config/amiberry-lite/ cp -a data ${INSTALL}/usr/config/amiberry-lite/ cp -a roms ${INSTALL}/usr/config/amiberry-lite/ mkdir -p savestates ${INSTALL}/usr/config/amiberry-lite/ mkdir -p screenshots ${INSTALL}/usr/config/amiberry-lite/ cp -a whdboot ${INSTALL}/usr/config/amiberry-lite/ ln -s /storage/roms/bios ${INSTALL}/usr/config/amiberry-lite/kickstarts mkdir -p ${INSTALL}/usr/config/amiberry-lite/plugins cp ${PKG_BUILD}/.${TARGET_NAME}/external/floppybridge/libfloppybridge.so ${INSTALL}/usr/config/amiberry-lite/plugins/ cp ${PKG_BUILD}/.${TARGET_NAME}/external/capsimage/*.so ${INSTALL}/usr/config/amiberry-lite/plugins/ # Create links to Retroarch controller files # ln -s /usr/share/retroarch/autoconfig/udev/8Bitdo_Pro_SF30_BT_B.cfg "${INSTALL}/usr/config/amiberry-lite/controller/8Bitdo SF30 Pro.cfg" ln -s "/tmp/joypads" "${INSTALL}/usr/config/amiberry-lite/controller" # Copy binary, scripts & link libcapsimg cp -a amiberry* ${INSTALL}/usr/bin/amiberry-lite UAE="${INSTALL}/usr/config/amiberry-lite/conf/*.uae" for i in ${UAE}; do echo -e "gfx_center_vertical=smart\ngfx_center_horizontal=smart" >> ${i}; done } ================================================ FILE: packages/sx05re/emulators/amiberry-lite/patches/001-default_fullscreen.patch ================================================ --- a/src/include/options.h 2024-03-13 19:51:07.175899314 +0100 +++ b/src/include/options.h 2024-03-13 19:51:30.872392451 +0100 @@ -1244,7 +1244,7 @@ bool default_auto_crop = false; int default_width = 720; int default_height = 568; - int default_fullscreen_mode = 0; + int default_fullscreen_mode = 1; int default_stereo_separation = 7; int default_sound_buffer = 8192; bool default_sound_pull = true; ================================================ FILE: packages/sx05re/emulators/amiberry-lite/patches/002-paths.patch ================================================ --- a/src/osdep/amiberry.cpp +++ b/src/osdep/amiberry.cpp @@ -4429,8 +4429,10 @@ if (!my_existsdir(xdg_config_home.c_str())) my_mkdir(xdg_config_home.c_str()); - amiberry_conf_file = xdg_config_home + "/amiberry.conf"; - amiberry_ini_file = xdg_config_home + "/amiberry.ini"; + //amiberry_conf_file = xdg_config_home + "/amiberry.conf"; + amiberry_conf_file = "/storage/.config/amiberry-lite/conf/amiberry-lite.conf"; + //amiberry_ini_file = xdg_config_home + "/amiberry.ini"; + amiberry_ini_file = "/storage/.config/amiberry-lite/conf/amiberry-lite.ini"; } return my_existsfile2(amiberry_conf_file.c_str()); } ================================================ FILE: packages/sx05re/emulators/amiberry-lite/patches/003-use_udev_gamepad_name.patch ================================================ --- a/src/osdep/retroarch.cpp +++ b/src/osdep/retroarch.cpp @@ -71,7 +71,22 @@ if (param[0] != 'h') // check it isn't some kind of hat starting 'h' (so if D-pad uses buttons) { - button = abs(std::stoi(param)); + try + { + button = abs(std::stoi(param)); + } + catch (const std::invalid_argument& e) + { + write_log("Invalid argument in stoi for param='%s' in setting='%s' (line: %s)", + param.c_str(), find_setting.c_str(), line.c_str()); + button = -1; // fallback + } + catch (const std::out_of_range& e) + { + write_log("Out of range in stoi for param='%s' in setting='%s' (line: %s)", + param.c_str(), find_setting.c_str(), line.c_str()); + button = -1; + } } if (option == find_setting) --- a/src/osdep/amiberry_input.cpp +++ b/src/osdep/amiberry_input.cpp --- +++ @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include "sysdeps.h" #include "options.h" @@ -1073,6 +1075,54 @@ return num_joystick; } +std::string get_udev_name_from_proc(SDL_Joystick* joystick) +{ + const char* joystick_path = SDL_JoystickPath(joystick); + if (joystick_path == nullptr) + return ""; + + // Extract the event number from the path (e.g., "/dev/input/event5" -> "event5") + const char* last_slash = strrchr(joystick_path, '/'); + if (last_slash == nullptr) + return ""; + + std::string event_name = std::string(last_slash + 1); + + // Parse /proc/bus/input/devices to find the matching device + std::ifstream devices_file("/proc/bus/input/devices"); + if (!devices_file.is_open()) + return ""; + + std::string line; + std::string current_name; + bool found_device = false; + + while (std::getline(devices_file, line)) + { + // Look for Name line (e.g., N: Name="Microsoft X-Box 360 pad") + if (line.substr(0, 3) == "N: ") + { + size_t start = line.find('"'); + size_t end = line.rfind('"'); + if (start != std::string::npos && end != std::string::npos && end > start) + current_name = line.substr(start + 1, end - start - 1); + } + // Look for Handlers line containing our event device + else if (line.substr(0, 3) == "H: " && line.find(event_name) != std::string::npos) + { + found_device = true; + break; + } + // Empty line indicates new device section + else if (line.empty()) + { + current_name.clear(); + } + } + + return found_device ? current_name : ""; +} + // Helper functions void open_as_game_controller(struct didata* did, const int i) { @@ -1098,6 +1148,9 @@ did->joystick_name.assign(SDL_JoystickNameForIndex(i)); else did->joystick_name = ""; + + // Get UDEV name from /proc/bus/input/devices + did->udev_name = get_udev_name_from_proc(did->joystick); if (!did->controller_name.empty()) did->name = did->controller_name; @@ -1210,8 +1263,19 @@ } const std::string retroarch_file = get_retroarch_file(); - const bool retroarch_config_exists = !retroarch_config_file.empty() && my_existsfile2(retroarch_config_file.c_str()); + bool retroarch_config_exists = !retroarch_config_file.empty() && my_existsfile2(retroarch_config_file.c_str()); + + if (!retroarch_config_exists && !did->udev_name.empty()) + { + const auto sanitized_name = sanitize_retroarch_name(did->udev_name); + retroarch_config_file = controllers + sanitized_name + ".cfg"; + write_log("Joystick udev name: '%s', sanitized to: '%s'\n", did->joystick_name.c_str(), sanitized_name.c_str()); + write_log("Checking for Retroarch cfg file using udev: '%s'\n", retroarch_config_file.c_str()); + } + + retroarch_config_exists = !retroarch_config_file.empty() && my_existsfile2(retroarch_config_file.c_str()); const bool retroarch_file_exists = my_existsfile2(retroarch_file.c_str()); + if (retroarch_config_exists || retroarch_file_exists) { --- a/src/osdep/amiberry_input.h +++ b/src/osdep/amiberry_input.h @@ -49,6 +49,7 @@ int type{}; int acquired{}; std::string name{}; + std::string udev_name{}; std::string controller_name{}; std::string joystick_name{}; ================================================ FILE: packages/sx05re/emulators/amiberry-lite/patches/fix_fbdev_window.patch ================================================ From 4a2a96134121d857099461ac27de15a848baaece Mon Sep 17 00:00:00 2001 From: Adventurous Programmer <47227694+Diegrosan@users.noreply.github.com> Date: Mon, 13 Oct 2025 22:25:33 -0300 Subject: [PATCH] Update main_window.cpp --- src/osdep/gui/main_window.cpp | 369 +++++++++++++++++++++++++++------- 1 file changed, 291 insertions(+), 78 deletions(-) diff --git a/src/osdep/gui/main_window.cpp b/src/osdep/gui/main_window.cpp index b464a011..ae0ea703 100644 --- a/src/osdep/gui/main_window.cpp +++ b/src/osdep/gui/main_window.cpp @@ -26,6 +26,15 @@ #include "inputdevice.h" #include "xwin.h" +static bool fbdev_detected = false; +static bool reusing_amiga_resources = false; + +static gcn::Widget* widget_before_modal = nullptr; +static int gui_top_children_count = -1; +static int frames_after_modal = 0; +static bool waiting_for_modal_close = false; +static int frames_waiting_for_close = 0; + bool ctrl_state = false, shift_state = false, alt_state = false, win_state = false; int last_x = 0; int last_y = 0; @@ -246,6 +255,12 @@ void update_gui_screen() { const AmigaMonitor* mon = &AMonitors[0]; + if (!gui_texture || !gui_screen || !mon->gui_renderer) + { + write_log("WARNING: update_gui_screen called with null pointers!\n"); + return; + } + SDL_UpdateTexture(gui_texture, nullptr, gui_screen->pixels, gui_screen->pitch); if (amiberry_options.rotation_angle == 0 || amiberry_options.rotation_angle == 180) gui_renderQuad = { 0, 0, gui_screen->w, gui_screen->h }; @@ -259,23 +274,70 @@ void update_gui_screen() show_screen(0, 0); } + void amiberry_gui_init() { AmigaMonitor* mon = &AMonitors[0]; sdl_video_driver = SDL_GetCurrentVideoDriver(); - if (sdl_video_driver != nullptr && strcmpi(sdl_video_driver, "KMSDRM") == 0) + write_log("=== GUI INIT START ===\n"); + write_log("SDL Video Driver: %s\n", sdl_video_driver ? sdl_video_driver : "NULL"); + write_log("amiga_window exists: %s\n", mon->amiga_window ? "YES" : "NO"); + write_log("amiga_renderer exists: %s\n", mon->amiga_renderer ? "YES" : "NO"); + write_log("gui_window exists: %s\n", mon->gui_window ? "YES" : "NO"); + write_log("gui_renderer exists: %s\n", mon->gui_renderer ? "YES" : "NO"); + + reusing_amiga_resources = false; // Reset + + if (sdl_video_driver != nullptr) { - kmsdrm_detected = true; - if (!mon->gui_window && mon->amiga_window) + if (strcmpi(sdl_video_driver, "KMSDRM") == 0) { - mon->gui_window = mon->amiga_window; + write_log("KMSDRM detected\n"); + kmsdrm_detected = true; + fbdev_detected = false; + + if (!mon->gui_window && mon->amiga_window) + { + mon->gui_window = mon->amiga_window; + reusing_amiga_resources = true; + write_log("Reusing amiga_window for GUI (KMSDRM)\n"); + } + if (!mon->gui_renderer && mon->amiga_renderer) + { + mon->gui_renderer = mon->amiga_renderer; + reusing_amiga_resources = true; + write_log("Reusing amiga_renderer for GUI (KMSDRM)\n"); + } } - if (!mon->gui_renderer && mon->amiga_renderer) + else if (strcmpi(sdl_video_driver, "fbdev") == 0 || + strstr(sdl_video_driver, "mali") != nullptr) { - mon->gui_renderer = mon->amiga_renderer; + write_log("fbdev/mali detected\n"); + fbdev_detected = true; + kmsdrm_detected = true; // Para compatibilidade + + if (!mon->gui_window && mon->amiga_window) + { + mon->gui_window = mon->amiga_window; + reusing_amiga_resources = true; + write_log("Reusing amiga_window for GUI (fbdev)\n"); + } + if (!mon->gui_renderer && mon->amiga_renderer) + { + mon->gui_renderer = mon->amiga_renderer; + reusing_amiga_resources = true; + write_log("Reusing amiga_renderer for GUI (fbdev)\n"); + } + } + else + { + write_log("Standard video driver: %s\n", sdl_video_driver); + kmsdrm_detected = false; + fbdev_detected = false; } } + SDL_GetCurrentDisplayMode(0, &sdl_mode); //------------------------------------------------- @@ -285,23 +347,22 @@ void amiberry_gui_init() { gui_screen = SDL_CreateRGBSurface(0, GUI_WIDTH, GUI_HEIGHT, 16, 0, 0, 0, 0); check_error_sdl(gui_screen == nullptr, "Unable to create GUI surface:"); + write_log("GUI surface created\n"); } if (!mon->gui_window) { - write_log("Creating Amiberry GUI window...\n"); + write_log("Creating new Amiberry GUI window...\n"); regqueryint(nullptr, _T("GUIPosX"), &gui_window_rect.x); regqueryint(nullptr, _T("GUIPosY"), &gui_window_rect.y); Uint32 mode; if (!kmsdrm_detected) { - // Only enable Windowed mode if we're running under x11 mode = SDL_WINDOW_RESIZABLE; } else { - // otherwise go for Full-window mode = SDL_WINDOW_FULLSCREEN_DESKTOP; } @@ -311,14 +372,13 @@ void amiberry_gui_init() mode |= SDL_WINDOW_HIDDEN; else mode |= SDL_WINDOW_SHOWN; - // Set Window allow high DPI by default mode |= SDL_WINDOW_ALLOW_HIGHDPI; if (amiberry_options.rotation_angle == 0 || amiberry_options.rotation_angle == 180) { mon->gui_window = SDL_CreateWindow("Amiberry GUI", - gui_window_rect.x != 0 ? gui_window_rect.x : SDL_WINDOWPOS_CENTERED, - gui_window_rect.y != 0 ? gui_window_rect.y : SDL_WINDOWPOS_CENTERED, + gui_window_rect.x, + gui_window_rect.y, gui_window_rect.w, gui_window_rect.h, mode); @@ -326,13 +386,14 @@ void amiberry_gui_init() else { mon->gui_window = SDL_CreateWindow("Amiberry GUI", - gui_window_rect.y != 0 ? gui_window_rect.y : SDL_WINDOWPOS_CENTERED, - gui_window_rect.x != 0 ? gui_window_rect.x : SDL_WINDOWPOS_CENTERED, + gui_window_rect.y, + gui_window_rect.x, gui_window_rect.h, gui_window_rect.w, mode); } check_error_sdl(mon->gui_window == nullptr, "Unable to create window:"); + write_log("New GUI window created\n"); auto* const icon_surface = IMG_Load(prefix_with_data_path("amiberry.png").c_str()); if (icon_surface != nullptr) @@ -341,16 +402,23 @@ void amiberry_gui_init() SDL_FreeSurface(icon_surface); } } - else if (kmsdrm_detected) + else { - SDL_SetWindowSize(mon->gui_window, GUI_WIDTH, GUI_HEIGHT); + write_log("Using existing window for GUI\n"); } if (mon->gui_renderer == nullptr) { + write_log("Creating new GUI renderer...\n"); mon->gui_renderer = SDL_CreateRenderer(mon->gui_window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); check_error_sdl(mon->gui_renderer == nullptr, "Unable to create a renderer:"); + write_log("New GUI renderer created\n"); + } + else + { + write_log("Using existing renderer for GUI\n"); } + DPIHandler::set_render_scale(mon->gui_renderer); gui_texture = SDL_CreateTexture(mon->gui_renderer, gui_screen->format->format, SDL_TEXTUREACCESS_STREAMING, gui_screen->w, @@ -364,31 +432,34 @@ void amiberry_gui_init() SDL_SetRelativeMouseMode(SDL_FALSE); SDL_ShowCursor(SDL_ENABLE); - SDL_RaiseWindow(mon->gui_window); //------------------------------------------------- // Create helpers for GUI framework //------------------------------------------------- - gui_imageLoader = new gcn::SDLImageLoader(); gui_imageLoader->setRenderer(mon->gui_renderer); - - // The ImageLoader in use is static and must be set to be - // able to load images gcn::Image::setImageLoader(gui_imageLoader); + gui_graphics = new gcn::SDLGraphics(); - // Set the target for the graphics object to be the screen. - // In other words, we will draw to the screen. - // Note, any surface will do, it doesn't have to be the screen. gui_graphics->setTarget(gui_screen); + gui_input = new gcn::SDLInput(); + + write_log("=== GUI INIT COMPLETE ===\n"); + write_log("Reusing amiga resources: %s\n", reusing_amiga_resources ? "YES" : "NO"); } void amiberry_gui_halt() { AmigaMonitor* mon = &AMonitors[0]; + write_log("=== GUI HALT START ===\n"); + write_log("Reusing amiga resources: %s\n", reusing_amiga_resources ? "YES" : "NO"); + write_log("fbdev_detected: %s\n", fbdev_detected ? "YES" : "NO"); + write_log("kmsdrm_detected: %s\n", kmsdrm_detected ? "YES" : "NO"); + + // Clear GUI helpers delete gui_imageLoader; gui_imageLoader = nullptr; delete gui_input; @@ -396,30 +467,135 @@ void amiberry_gui_halt() delete gui_graphics; gui_graphics = nullptr; + // Clear GUI surface if (gui_screen != nullptr) { SDL_FreeSurface(gui_screen); gui_screen = nullptr; + write_log("GUI screen freed\n"); } + + // Clear GUI texture if (gui_texture != nullptr) { SDL_DestroyTexture(gui_texture); gui_texture = nullptr; + write_log("GUI texture destroyed\n"); } - if (mon->gui_renderer && !kmsdrm_detected) + + // CRITICAL: Deciding what to do with renderer and window + if (reusing_amiga_resources) { - SDL_DestroyRenderer(mon->gui_renderer); + + write_log("Releasing (not destroying) renderer and window - they belong to emulation\n"); + + // IMPORTANT: Reset logical size for the game + if (mon->gui_renderer) + { + SDL_RenderClear(mon->gui_renderer); + SDL_RenderPresent(mon->gui_renderer); + } + + // DO NOT destroy, just "release" the pointers mon->gui_renderer = nullptr; + mon->gui_window = nullptr; } + else + { + // created own resources, we destroy normally + write_log("Destroying GUI-owned renderer and window\n"); + + if (mon->gui_renderer) + { + SDL_DestroyRenderer(mon->gui_renderer); + mon->gui_renderer = nullptr; + write_log("GUI renderer destroyed\n"); + } - if (mon->gui_window && !kmsdrm_detected) { - regsetint(nullptr, _T("GUIPosX"), gui_window_rect.x); - regsetint(nullptr, _T("GUIPosY"), gui_window_rect.y); - SDL_DestroyWindow(mon->gui_window); - mon->gui_window = nullptr; + if (mon->gui_window) + { + regsetint(nullptr, _T("GUIPosX"), gui_window_rect.x); + regsetint(nullptr, _T("GUIPosY"), gui_window_rect.y); + SDL_DestroyWindow(mon->gui_window); + mon->gui_window = nullptr; + write_log("GUI window destroyed\n"); + } } + + write_log("=== GUI HALT COMPLETE ===\n"); } + + +// ============================================================ +// ADICIONE ESTAS FUNÇÕES AUXILIARES +// (antes da função check_input) +// ============================================================ + +void restore_input_after_modal() +{ + const AmigaMonitor* mon = &AMonitors[0]; + + write_log("=== MODAL CLOSED - Restoring input ===\n"); + + // Limpar TODOS os eventos pendentes da fila + SDL_Event event; + int cleared = 0; + while (SDL_PollEvent(&event)) + { + cleared++; + } + write_log("Cleared %d pending events\n", cleared); + + // Resetar todos os estados + ctrl_state = false; + shift_state = false; + alt_state = false; + win_state = false; + last_x = 0; + last_y = 0; + + // Garantir que mouse está visível e configurado + SDL_SetRelativeMouseMode(SDL_FALSE); + SDL_ShowCursor(SDL_ENABLE); + + // Elevar e focar a janela GUI + if (mon->gui_window) + { + SDL_RaiseWindow(mon->gui_window); + SDL_SetWindowInputFocus(mon->gui_window); + write_log("Window raised and focused\n"); + } + + // Pequeno delay para estabilizar + SDL_Delay(50); + + // Limpar eventos novamente após o delay + while (SDL_PollEvent(&event)) { } + + // Restaurar foco no widget ou no painel ativo + if (widget_before_modal && widget_before_modal->isVisible()) + { + widget_before_modal->requestFocus(); + write_log("Focus restored to saved widget\n"); + } + else if (categories[last_active_panel].selector) + { + categories[last_active_panel].selector->requestFocus(); + write_log("Focus restored to panel selector\n"); + } + + widget_before_modal = nullptr; + frames_after_modal = 5; // Aguardar alguns frames + + write_log("=== Input restoration complete ===\n"); +} + + +// ============================================================ +// SUBSTITUA A FUNÇÃO check_input() COMPLETA POR ESTA VERSÃO +// ============================================================ + void check_input() { const AmigaMonitor* mon = &AMonitors[0]; @@ -428,8 +604,67 @@ void check_input() didata* did = &di_joystick[0]; didata* existing_did; + // Detectar mudanças no número de widgets filhos (indica modal abrindo/fechando) + if (uae_gui && gui_top) + { + const auto& children = gui_top->getChildren(); + int current_count = children.size(); + + // Primeira vez - apenas inicializar + if (gui_top_children_count == -1) + { + gui_top_children_count = current_count; + write_log("GUI initialized with %d children\n", current_count); + } + // Se número de filhos aumentou significativamente, modal abriu + else if (current_count > gui_top_children_count + 1) + { + write_log("Child count increased from %d to %d - MODAL OPENED\n", + gui_top_children_count, current_count); + + // Salvar widget com foco + focusHdl = gui_top->_getFocusHandler(); + if (focusHdl) + { + widget_before_modal = focusHdl->getFocused(); + write_log("Saved focus widget before modal\n"); + } + waiting_for_modal_close = true; + } + // Se estava esperando modal fechar E o número diminuiu + else if (waiting_for_modal_close && current_count < gui_top_children_count) + { + write_log("Child count decreased from %d to %d - MODAL CLOSED\n", + gui_top_children_count, current_count); + restore_input_after_modal(); + waiting_for_modal_close = false; + } + + gui_top_children_count = current_count; + } + + // Se estamos em período de estabilização após modal, decrementar + if (frames_after_modal > 0) + { + frames_after_modal--; + if (frames_after_modal == 0) + { + write_log("Stabilization period finished\n"); + } + } + while (SDL_PollEvent(&gui_event)) { + // Durante estabilização, descartar eventos de entrada do joystick/teclado + if (frames_after_modal > 0 && + (gui_event.type == SDL_KEYDOWN || + gui_event.type == SDL_JOYBUTTONDOWN || + gui_event.type == SDL_JOYHATMOTION)) + { + write_log("Discarding input during stabilization\n"); + continue; + } + switch (gui_event.type) { case SDL_WINDOWEVENT: @@ -445,6 +680,16 @@ void check_input() gui_window_rect.w = gui_event.window.data1; gui_window_rect.h = gui_event.window.data2; break; + case SDL_WINDOWEVENT_FOCUS_GAINED: + write_log("Window focus gained\n"); + if (mon->gui_window) + { + SDL_SetWindowInputFocus(mon->gui_window); + } + break; + case SDL_WINDOWEVENT_FOCUS_LOST: + write_log("Window focus lost\n"); + break; default: break; } @@ -454,15 +699,11 @@ void check_input() case SDL_QUIT: got_event = 1; - //------------------------------------------------- - // Quit entire program - //------------------------------------------------- uae_quit(); gui_running = false; break; case SDL_JOYDEVICEADDED: - // Check if we need to re-import joysticks existing_did = &di_joystick[gui_event.jdevice.which]; if (existing_did->guid.empty()) { @@ -472,6 +713,7 @@ void check_input() RefreshPanelInput(); } return; + case SDL_JOYDEVICEREMOVED: write_log("GUI: SDL2 Controller/Joystick removed, re-running import joysticks...\n"); if (inputdevice_devicechange(&currprefs)) @@ -495,16 +737,10 @@ void check_input() { if (emulating && cmdStart->isEnabled()) { - //------------------------------------------------ - // Continue emulation - //------------------------------------------------ gui_running = false; } else { - //------------------------------------------------ - // First start of emulator -> reset Amiga - //------------------------------------------------ uae_reset(0, 1); gui_running = false; } @@ -512,18 +748,17 @@ void check_input() else if (SDL_JoystickGetButton(gui_joystick, did->mapping.button[SDL_CONTROLLER_BUTTON_DPAD_UP]) || hat & SDL_HAT_UP) { if (handle_navigation(DIRECTION_UP)) - continue; // Don't change value when enter Slider -> don't send event to control + continue; PushFakeKey(SDLK_UP); break; } else if (SDL_JoystickGetButton(gui_joystick, did->mapping.button[SDL_CONTROLLER_BUTTON_DPAD_DOWN]) || hat & SDL_HAT_DOWN) { if (handle_navigation(DIRECTION_DOWN)) - continue; // Don't change value when enter Slider -> don't send event to control + continue; PushFakeKey(SDLK_DOWN); break; } - else if ((did->mapping.is_retroarch || !did->is_controller) && SDL_JoystickGetButton(gui_joystick, did->mapping.button[SDL_CONTROLLER_BUTTON_LEFTSHOULDER]) || SDL_GameControllerGetButton(did->controller, @@ -544,18 +779,17 @@ void check_input() PushFakeKey(SDLK_DOWN); } } - else if (SDL_JoystickGetButton(gui_joystick, did->mapping.button[SDL_CONTROLLER_BUTTON_DPAD_RIGHT]) || hat & SDL_HAT_RIGHT) { if (handle_navigation(DIRECTION_RIGHT)) - continue; // Don't change value when enter Slider -> don't send event to control + continue; PushFakeKey(SDLK_RIGHT); break; } else if (SDL_JoystickGetButton(gui_joystick, did->mapping.button[SDL_CONTROLLER_BUTTON_DPAD_LEFT]) || hat & SDL_HAT_LEFT) { if (handle_navigation(DIRECTION_LEFT)) - continue; // Don't change value when enter Slider -> don't send event to control + continue; PushFakeKey(SDLK_LEFT); break; } @@ -570,22 +804,18 @@ void check_input() PushFakeKey(SDLK_RETURN); continue; } - else if (SDL_JoystickGetButton(gui_joystick, did->mapping.quit_button) && SDL_JoystickGetButton(gui_joystick, did->mapping.hotkey_button)) { - // use the HOTKEY button uae_quit(); gui_running = false; break; } - else if ((did->mapping.is_retroarch || !did->is_controller) && SDL_JoystickGetButton(gui_joystick, did->mapping.button[SDL_CONTROLLER_BUTTON_GUIDE]) || SDL_GameControllerGetButton(did->controller, static_cast(did->mapping.button[SDL_CONTROLLER_BUTTON_GUIDE]))) { - // use the HOTKEY button gui_running = false; } } @@ -601,14 +831,14 @@ void check_input() { last_x = 1; if (handle_navigation(DIRECTION_RIGHT)) - continue; // Don't change value when enter Slider -> don't send event to control + continue; PushFakeKey(SDLK_RIGHT); } else if (gui_event.jaxis.value < -joystick_dead_zone && last_x != -1) { last_x = -1; if (handle_navigation(DIRECTION_LEFT)) - continue; // Don't change value when enter Slider -> don't send event to control + continue; PushFakeKey(SDLK_LEFT); } else if (gui_event.jaxis.value > -joystick_dead_zone && gui_event.jaxis.value < joystick_dead_zone) @@ -622,14 +852,14 @@ void check_input() { last_y = -1; if (handle_navigation(DIRECTION_UP)) - continue; // Don't change value when enter Slider -> don't send event to control + continue; PushFakeKey(SDLK_UP); } else if (gui_event.jaxis.value > joystick_dead_zone && last_y != 1) { last_y = 1; if (handle_navigation(DIRECTION_DOWN)) - continue; // Don't change value when enter Slider -> don't send event to control + continue; PushFakeKey(SDLK_DOWN); } else if (gui_event.jaxis.value > -joystick_dead_zone && gui_event.jaxis.value < joystick_dead_zone) @@ -673,16 +903,10 @@ void check_input() { if (emulating && cmdStart->isEnabled()) { - //------------------------------------------------ - // Continue emulation - //------------------------------------------------ gui_running = false; } else { - //------------------------------------------------ - // First start of emulator -> reset Amiga - //------------------------------------------------ uae_reset(0, 1); gui_running = false; } @@ -693,14 +917,10 @@ void check_input() switch (gui_event.key.keysym.sym) { case SDLK_q: - //------------------------------------------------- - // Quit entire program via Q on keyboard - //------------------------------------------------- focusHdl = gui_top->_getFocusHandler(); activeWidget = focusHdl->getFocused(); if (dynamic_cast(activeWidget) == nullptr) { - // ...but only if we are not in a Textfield... uae_quit(); gui_running = false; } @@ -713,32 +933,29 @@ void check_input() case VK_Green: case VK_Blue: - //------------------------------------------------ - // Simulate press of enter when 'X' pressed - //------------------------------------------------ gui_event.key.keysym.sym = SDLK_RETURN; - gui_input->pushInput(gui_event); // Fire key down - gui_event.type = SDL_KEYUP; // and the key up + gui_input->pushInput(gui_event); + gui_event.type = SDL_KEYUP; break; case VK_UP: if (handle_navigation(DIRECTION_UP)) - continue; // Don't change value when enter ComboBox -> don't send event to control + continue; break; case VK_DOWN: if (handle_navigation(DIRECTION_DOWN)) - continue; // Don't change value when enter ComboBox -> don't send event to control + continue; break; case VK_LEFT: if (handle_navigation(DIRECTION_LEFT)) - continue; // Don't change value when enter Slider -> don't send event to control + continue; break; case VK_RIGHT: if (handle_navigation(DIRECTION_RIGHT)) - continue; // Don't change value when enter Slider -> don't send event to control + continue; break; case SDLK_F1: @@ -822,12 +1039,8 @@ void check_input() if (got_event) { - // Now we let the Gui object perform its logic. uae_gui->logic(); - SDL_RenderClear(mon->gui_renderer); - - // Now we let the Gui object draw itself. uae_gui->draw(); update_gui_screen(); } ================================================ FILE: packages/sx05re/emulators/atari800sa/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="atari800sa" PKG_VERSION="fcb6e799734c749f9e326640f4d506abf854e95c" PKG_SHA256="e96cc007ab9115fe69f9e914813c7c3a5381885033f1ed4c35f21624bbb365c3" PKG_SITE="https://github.com/atari800/atari800" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_SHORTDESC="Atari 8-bit computer and 5200 console emulator" PKG_TOOLCHAIN="configure" pre_configure_target() { ${PKG_BUILD}/autogen.sh } ================================================ FILE: packages/sx05re/emulators/biginstinct/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present EmuELEC Team (https://github.com/EmuELEC/EmuELEC) PKG_NAME="biginstinct" PKG_VERSION="10" PKG_SHA256="5c29befbabefa6f65c60149de670e382101a315f41a20cdd2e738d59268c1629" PKG_ARCH="aarch64" PKG_LICENSE="Proprietary" PKG_SITE="https://www.richwhitehouse.com/ki" PKG_URL="https://www.richwhitehouse.com/ki/builds/BigInstinct_LinuxARM64_v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="emuelec/emulators" PKG_SHORTDESC="BigInstinct - Killer Instinct Arcade Emulator" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin/biginstinct cp -rv ${PKG_BUILD}/* ${INSTALL}/usr/bin/biginstinct/ chmod +x ${INSTALL}/usr/bin/biginstinct/biginstinct cp -f ${PKG_DIR}/scripts/biginstinctstart.sh ${INSTALL}/usr/bin/biginstinctstart.sh chmod +x ${INSTALL}/usr/bin/biginstinctstart.sh } ================================================ FILE: packages/sx05re/emulators/biginstinct/scripts/biginstinctstart.sh ================================================ #!/bin/bash # Create libOpenGL.so.0 symlink in /tmp (filesystem is read-only) if [ ! -f /tmp/libOpenGL.so.0 ]; then ln -sf /usr/lib/libGL.so.1 /tmp/libOpenGL.so.0 fi # Add /tmp first so libOpenGL.so.0 symlink is found before other paths export LD_LIBRARY_PATH=/tmp:/usr/lib:/emuelec/lib:$LD_LIBRARY_PATH # Fix GL rendering issues on Mali GPU export LIBGL_NOTEST=1 # Change to biginstinct directory cd /usr/bin/biginstinct # Launch biginstinct with all arguments ./biginstinct "$@" ================================================ FILE: packages/sx05re/emulators/bigpemu/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present EmuELEC Team (https://github.com/EmuELEC/EmuELEC) PKG_NAME="bigpemu" PKG_VERSION="122" PKG_SHA256="afacd7254baa5d2858146651e1e2b7f7cc7beb7f0ea65cdc62a87c296170f646" PKG_ARCH="aarch64" PKG_LICENSE="Proprietary" PKG_SITE="https://www.richwhitehouse.com/jaguar" PKG_URL="https://www.richwhitehouse.com/jaguar/builds/BigPEmu_LinuxARM64_v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="emuelec/emulators" PKG_SHORTDESC="BigPEmu - Atari Jaguar Emulator" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin/bigpemu cp -rv ${PKG_BUILD}/* ${INSTALL}/usr/bin/bigpemu/ chmod +x ${INSTALL}/usr/bin/bigpemu/bigpemu cp -f ${PKG_DIR}/scripts/bigpemustart.sh ${INSTALL}/usr/bin/bigpemustart.sh chmod +x ${INSTALL}/usr/bin/bigpemustart.sh } ================================================ FILE: packages/sx05re/emulators/bigpemu/scripts/bigpemustart.sh ================================================ #!/bin/bash # Create libOpenGL.so.0 symlink in /tmp (filesystem is read-only) if [ ! -f /tmp/libOpenGL.so.0 ]; then ln -sf /usr/lib/libGL.so.1 /tmp/libOpenGL.so.0 fi # Add /tmp first so libOpenGL.so.0 symlink is found before other paths export LD_LIBRARY_PATH=/tmp:/usr/lib:/emuelec/lib:$LD_LIBRARY_PATH # Fix GL rendering issues on Mali GPU export LIBGL_NOTEST=1 # Change to BigPEmu directory cd /usr/bin/bigpemu # Launch BigPEmu with all arguments ./bigpemu "$@" ================================================ FILE: packages/sx05re/emulators/box64/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="box64" PKG_VERSION="448ee01f44b0aabb5c39d5c73edf8f8b6a051fe4" # amlogic-old uses older linux headers not compatible with newer versions [ "${DEVICE}" == "Amlogic-old" ] && PKG_VERSION="6392550208eadf07419692920acc2955bb844af7" PKG_REV="1" PKG_ARCH="aarch64" PKG_LICENSE="MIT" PKG_SITE="https://github.com/ptitSeb/box64" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain gl4es" PKG_LONGDESC="Box64 - Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices" PKG_TOOLCHAIN="cmake" if [[ "${DEVICE}" == "Amlogic"* ]]; then PKG_CMAKE_OPTS_TARGET=" -DODROIDN2=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo" else PKG_CMAKE_OPTS_TARGET=" -DRK3326=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo" fi pre_configure_target() { # https://github.com/ptitSeb/box64/issues/256 if ! grep -q "as-needed" ${PKG_BUILD}/CMakeLists.txt; then sed -i "s|as-need|as-needed|g" ${PKG_BUILD}/CMakeLists.txt fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/config/emuelec/bin/box64/lib cp ${PKG_BUILD}/x64lib/* ${INSTALL}/usr/config/emuelec/bin/box64/lib cp ${PKG_BUILD}/.${TARGET_NAME}/box64 ${INSTALL}/usr/config/emuelec/bin/box64/ mkdir -p ${INSTALL}/etc/binfmt.d ln -sf /emuelec/configs/box64.conf ${INSTALL}/etc/binfmt.d/box64.conf } ================================================ FILE: packages/sx05re/emulators/box86/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="box86" PKG_VERSION="fa14e0ab1417303455ca3b716a5ad545fb132d4a" PKG_SHA256="2fa0d9aa2856275ce04a912b7aefa9232260a3b4187d26c9e8ca408b40cd045d" PKG_REV="1" PKG_ARCH="arm" PKG_LICENSE="MIT" PKG_SITE="https://github.com/ptitSeb/box86" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain gl4es" PKG_LONGDESC="Box86 - Linux Userspace x86 Emulator with a twist, targeted at ARM Linux devices" PKG_TOOLCHAIN="cmake" if [[ "${DEVICE}" == "Amlogic"* ]]; then PKG_CMAKE_OPTS_TARGET=" -DRK3399=ON -DCMAKE_BUILD_TYPE=Release" else PKG_CMAKE_OPTS_TARGET=" -DGOA_CLONE=ON -DCMAKE_BUILD_TYPE=Release" fi makeinstall_target() { mkdir -p ${INSTALL}/usr/config/emuelec/bin/box86/lib cp ${PKG_BUILD}/x86lib/* ${INSTALL}/usr/config/emuelec/bin/box86/lib cp ${PKG_BUILD}/.${TARGET_NAME}/box86 ${INSTALL}/usr/config/emuelec/bin/box86/ mkdir -p ${INSTALL}/etc/binfmt.d ln -sf /emuelec/configs/box86.conf ${INSTALL}/etc/binfmt.d/box86.conf } ================================================ FILE: packages/sx05re/emulators/dolphinSA/config/Dolphin.ini ================================================ [General] LastFilename = ShowLag = False ShowFrameCount = False ISOPaths = 1 RecursiveISOPaths = False NANDRootPath = WirelessMac = [Interface] ConfirmStop = True UsePanicHandlers = True OnScreenDisplayMessages = True HideCursor = False AutoHideCursor = False MainWindowPosX = 403 MainWindowPosY = 148 MainWindowWidth = 800 MainWindowHeight = 600 Language = 0 ShowToolbar = True ShowStatusbar = True ShowLogWindow = False ShowLogConfigWindow = False ExtendedFPSInfo = False ThemeName40 = Clean Blue PauseOnFocusLost = False [Display] FullscreenResolution = Auto Fullscreen = True RenderToMain = False RenderWindowXPos = -1 RenderWindowYPos = -1 RenderWindowWidth = 640 RenderWindowHeight = 480 RenderWindowAutoSize = False KeepWindowOnTop = False ProgressiveScan = False PAL60 = True DisableScreenSaver = True ForceNTSCJ = False [GameList] ListDrives = False ListWad = True ListElfDol = True ListWii = True ListGC = True ListJap = True ListPal = True ListUsa = True ListAustralia = True ListFrance = True ListGermany = True ListItaly = True ListKorea = True ListNetherlands = True ListRussia = True ListSpain = True ListTaiwan = True ListWorld = True ListUnknown = True ListSort = 3 ListSortSecondary = 0 ColorCompressed = True ColumnPlatform = True ColumnBanner = True ColumnNotes = True ColumnFileName = False ColumnID = False ColumnRegion = True ColumnSize = True ColumnState = True [Core] HLE_BS2 = False TimingVariance = 32 CPUCore = 4 Fastmem = True CPUThread = True DSPHLE = True SkipIdle = False SyncOnSkipIdle = False SyncGPU = False SyncGpuMaxDistance = 200000 SyncGpuMinDistance = -200000 SyncGpuOverclock = 1.00000000 FPRF = False AccurateNaNs = False DefaultISO = DVDRoot = Apploader = EnableCheats = True SelectedLanguage = 0 OverrideGCLang = False DPL2Decoder = False Latency = 2 MemcardAPath = MemcardBPath = AgpCartAPath = AgpCartBPath = SlotA = 1 SlotB = 255 SerialPort1 = 255 BBA_MAC = SIDevice0 = 6 AdapterRumble0 = True SimulateKonga0 = False SIDevice1 = 6 AdapterRumble1 = True SimulateKonga1 = False SIDevice2 = 0 AdapterRumble2 = True SimulateKonga2 = False SIDevice3 = 0 AdapterRumble3 = True SimulateKonga3 = False WiiSDCard = False WiiKeyboard = False WiimoteContinuousScanning = False WiimoteEnableSpeaker = False RunCompareServer = False RunCompareClient = False EmulationSpeed = 1.00000000 FrameSkip = 0x00000003 Overclock = 4.00000000 OverclockEnable = False GFXBackend = OGL GPUDeterminismMode = auto PerfMapDir = [Movie] PauseMovie = False Author = DumpFrames = False DumpFramesSilent = False ShowInputDisplay = False [DSP] EnableJIT = True DumpAudio = False DumpUCode = False Backend = ALSA Volume = 100 CaptureLog = False [Input] BackgroundInput = False [FifoPlayer] LoopReplay = True [Analytics] ID = 5082f0c30a7e422b1220107f69d6c108 Enabled = False PermissionAsked = True ================================================ FILE: packages/sx05re/emulators/dolphinSA/config/GCPadNew.ini ================================================ [GCPad1] Device = SDL/0/HORI CO.,LTD. HORIPAD S Buttons/A = `Button 2` Buttons/B = `Button 1` Buttons/X = `Button 3` Buttons/Y = `Button 0` Buttons/Z = `Button 4` Buttons/Start = `Button 9` Main Stick/Up = `Axis 1-` Main Stick/Down = `Axis 1+` Main Stick/Left = `Axis 0-` Main Stick/Right = `Axis 0+` Main Stick/Modifier = Shift_L Main Stick/Modifier/Range = 50.000000000000000 C-Stick/Up = `Axis 1-` C-Stick/Down = K C-Stick/Left = J C-Stick/Right = L C-Stick/Modifier = Control_L C-Stick/Modifier/Range = 50.000000000000000 Triggers/L = Q Triggers/R = W D-Pad/Up = `Hat 0 N` D-Pad/Down = `Hat 0 S` D-Pad/Left = `Hat 0 W` D-Pad/Right = `Hat 0 E` [GCPad2] Device = evdev/0/HORI CO.,LTD. HORIPAD S Buttons/A = `Button 2` Buttons/B = `Button 1` Buttons/X = `Button 3` Buttons/Y = `Button 0` Buttons/Z = `Button 13` Buttons/Start = `Button 9` Buttons/Mic = `Button 8` Main Stick/Up = `Axis 1-` Main Stick/Down = `Axis 1+` Main Stick/Left = `Axis 0-` Main Stick/Right = `Axis 0+` C-Stick/Up = `Axis 3-` C-Stick/Down = `Axis 3+` C-Stick/Left = `Axis 2-` C-Stick/Right = `Axis 2+` Triggers/L = `Button 4` Triggers/R = `Button 5` Triggers/L-Analog = `Button 6` Triggers/R-Analog = `Button 7` D-Pad/Up = `Axis 5-` D-Pad/Down = `Axis 5+` D-Pad/Left = `Axis 4-` D-Pad/Right = `Axis 4+` ================================================ FILE: packages/sx05re/emulators/dolphinSA/config/GFX.ini ================================================ [Hardware] VSync = False Adapter = 0 [Settings] AspectRatio = 2 Crop = False wideScreenHack = False UseXFB = False UseRealXFB = False SafeTextureCacheColorSamples = 128 ShowFPS = True LogRenderTimeToFile = False OverlayStats = False OverlayProjStats = False DumpTextures = False HiresTextures = False ConvertHiresTextures = False CacheHiresTextures = False DumpEFBTarget = False FreeLook = False UseFFV1 = False EnablePixelLighting = False FastDepthCalc = True MSAA = 0 SSAA = False EFBScale = 1 TexFmtOverlayEnable = False TexFmtOverlayCenter = False Wireframe = False DisableFog = False EnableShaderDebugging = False BorderlessFullscreen = False SWZComploc = True SWZFreeze = True SWDumpObjects = False SWDumpTevStages = False SWDumpTevTexFetches = False SWDrawStart = 0 SWDrawEnd = 100000 [Enhancements] ForceFiltering = False MaxAnisotropy = 0 PostProcessingShader = [Stereoscopy] StereoMode = 0 StereoDepth = 20 StereoConvergencePercentage = 100 StereoSwapEyes = False [Hacks] EFBAccessEnable = False BBoxEnable = False ForceProgressive = True EFBToTextureEnable = True EFBScaledCopy = False EFBEmulateFormatChanges = False ================================================ FILE: packages/sx05re/emulators/dolphinSA/config/Logger.ini ================================================ [LogWindow] x = 400 y = 600 pos = 2 [Options] Font = 0 WrapLines = False ================================================ FILE: packages/sx05re/emulators/dolphinSA/config/WiimoteNew.ini ================================================ [Wiimote1] Device = evdev/0/Logitech Gamepad F310 Extension = Classic Source = 1 Classic/Buttons/A = `Button 1` Classic/Buttons/B = `Button 0` Classic/Buttons/X = `Button 3` Classic/Buttons/Y = `Button 2` Classic/Buttons/ZL = `Button 9` Classic/Buttons/ZR = `Button 10` Classic/Buttons/- = `Button 6` Classic/Buttons/+ = `Button 7` Classic/Buttons/Home = `Button 8` Classic/Left Stick/Up = `Axis 1-` Classic/Left Stick/Down = `Axis 1+` Classic/Left Stick/Left = `Axis 0-` Classic/Left Stick/Right = `Axis 0+` Classic/Right Stick/Up = `Axis 4-` Classic/Right Stick/Down = `Axis 4+` Classic/Right Stick/Left = `Axis 3-` Classic/Right Stick/Right = `Axis 3+` Classic/Triggers/L = `Button 4` Classic/Triggers/R = `Button 5` Classic/Triggers/L-Analog = `Axis 2-+` Classic/Triggers/R-Analog = `Axis 5-+` Classic/D-Pad/Up = `Axis 7-` Classic/D-Pad/Down = `Axis 7+` Classic/D-Pad/Left = `Axis 6-` Classic/D-Pad/Right = `Axis 6+` [Wiimote2] Source = 0 [Wiimote3] Source = 0 [Wiimote4] Source = 0 [BalanceBoard] Source = 0 ================================================ FILE: packages/sx05re/emulators/dolphinSA/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="dolphinSA" PKG_VERSION="3c4d4fcd09173ea070dc812ab5d64ca3a3af5f29" PKG_ARCH="aarch64" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/dolphin-emu/dolphin" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain qt-everywhere libevdev" PKG_LONGDESC="Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements. " PKG_BUILD_FLAGS="lto" # Configure CMake for LTO with BFD linker PKG_CMAKE_OPTS_TARGET=" -DENABLE_LTO=ON \ -DCMAKE_EXE_LINKER_FLAGS='-fuse-ld=bfd' \ -DCMAKE_SHARED_LINKER_FLAGS='-fuse-ld=bfd' \ -DDISTRIBUTOR='EmuELEC' \ -DBUILD_SHARED_LIBS=OFF \ -DTHREADS_PTHREAD_ARG=OFF \ -DENABLE_FBDEV=ON \ -DENABLE_EGL=ON \ -DENABLE_X11=OFF \ -DENABLE_NOGUI=ON \ -DUSE_DISCORD_PRESENCE=OFF \ -DENABLE_QT=OFF \ -DCMAKE_BUILD_TYPE=Release" makeinstall_target() { export CXXFLAGS="`echo ${CXXFLAGS} | sed -e "s|-O.|-O3|g"`" mkdir -p ${INSTALL}/usr/bin cp -rf ${PKG_BUILD}/.${TARGET_NAME}/Binaries/dolphin-emu-nogui ${INSTALL}/usr/bin cp -rf ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/dolphin-emu cp -rf ${PKG_BUILD}/Data/Sys/* ${INSTALL}/usr/config/emuelec/configs/dolphin-emu cp -rf ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/dolphin-emu } ================================================ FILE: packages/sx05re/emulators/dolphinSA/patches/000-hotkeys.patch ================================================ diff --git a/Source/Core/Core/HW/GCPadEmu.cpp b/Source/Core/Core/HW/GCPadEmu.cpp index fbbcbc630e..9dc3641bfc 100644 --- a/Source/Core/Core/HW/GCPadEmu.cpp +++ b/Source/Core/Core/HW/GCPadEmu.cpp @@ -26,6 +26,7 @@ static const u16 button_bitmasks[] = { PAD_BUTTON_Y, PAD_TRIGGER_Z, PAD_BUTTON_START, + PAD_BUTTON_HOTKEY, 0 // MIC HAX }; @@ -50,6 +51,9 @@ GCPad::GCPad(const unsigned int index) : m_index(index) // i18n: The START/PAUSE button on GameCube controllers m_buttons->AddInput(Translatability::Translate, START_BUTTON, _trans("START")); + // Hotkey Button + m_buttons->AddInput(Translatability::Translate, HOTKEY_BUTTON, _trans("HOTKEY")); + // sticks groups.emplace_back(m_main_stick = new ControllerEmu::OctagonAnalogStick( MAIN_STICK_GROUP, _trans("Control Stick"), MAIN_STICK_GATE_RADIUS)); diff --git a/Source/Core/Core/HW/GCPadEmu.h b/Source/Core/Core/HW/GCPadEmu.h index 2555ee05b1..c2230a606a 100644 --- a/Source/Core/Core/HW/GCPadEmu.h +++ b/Source/Core/Core/HW/GCPadEmu.h @@ -68,6 +68,7 @@ public: static constexpr const char* Y_BUTTON = "Y"; static constexpr const char* Z_BUTTON = "Z"; static constexpr const char* START_BUTTON = "Start"; + static constexpr const char* HOTKEY_BUTTON = "Hotkey"; // i18n: The left trigger button (labeled L on real controllers) static constexpr const char* L_DIGITAL = _trans("L"); diff --git a/Source/Core/DolphinNoGUI/PlatformFBDev.cpp b/Source/Core/DolphinNoGUI/PlatformFBDev.cpp index 53312bfa08..c166c06c40 100644 --- a/Source/Core/DolphinNoGUI/PlatformFBDev.cpp +++ b/Source/Core/DolphinNoGUI/PlatformFBDev.cpp @@ -11,6 +11,14 @@ #include "Core/State.h" #include "Core/System.h" +#include "Core/HW/GCPad.h" +#include "InputCommon/GCPadStatus.h" +#include +#include "Core/Config/GraphicsSettings.h" +#include "Core/Config/MainSettings.h" +#include "VideoCommon/VideoConfig.h" +#include "VideoCommon/OnScreenDisplay.h" + #include #include #include @@ -78,9 +85,111 @@ void PlatformFBDev::MainLoop() { while (IsRunning()) { + static int hotkey = 0; + static int slot = 0; + static int fps = 0; + static int aspect = 0; + static int fforward = 0; + static int ires = 0; + UpdateRunningFlag(); Core::HostDispatchJobs(Core::System::GetInstance()); + if(Pad::IsInitialized()) { + GCPadStatus x = Pad::GetStatus(0); + + if( (x.button & PAD_BUTTON_HOTKEY) == PAD_BUTTON_HOTKEY) { // hotkey pressed + if(hotkey == 1) { + hotkey = 2; + } + } else { + hotkey = 1; // assure hotkey is released between actions + } + + if(hotkey == 2) { // hotkey pressed + if( (x.button & PAD_BUTTON_START) == PAD_BUTTON_START) { + RequestShutdown(); + hotkey = 0; + } + + if( (x.button & PAD_TRIGGER_L) == PAD_TRIGGER_L) { + State::Load(Core::System::GetInstance(), slot); + hotkey = 0; + } + if( (x.button & PAD_TRIGGER_R) == PAD_TRIGGER_R) { + State::Save(Core::System::GetInstance(), slot); + hotkey = 0; + } + if( (x.button & PAD_BUTTON_DOWN) == PAD_BUTTON_DOWN) { + if(slot > 0) slot--; + Core::DisplayMessage(fmt::format("Slot {} selected", slot), 4000); + hotkey = 0; + } + if( (x.button & PAD_BUTTON_UP) == PAD_BUTTON_UP) { + if(slot < 10) slot++; + Core::DisplayMessage(fmt::format("Slot {} selected", slot), 4000); + hotkey = 0; + } + if( (x.button & PAD_BUTTON_A) == PAD_BUTTON_A) { + Core::SaveScreenShot(); + hotkey = 0; + } + if( (x.button & PAD_BUTTON_Y) == PAD_BUTTON_Y) { + if(fps == 0) { + Config::SetCurrent(Config::GFX_SHOW_FPS, true); + fps = 1; + } else { + Config::SetCurrent(Config::GFX_SHOW_FPS, false); + fps = 0; + } + hotkey = 0; + } + if( (x.button & PAD_BUTTON_X) == PAD_BUTTON_X) { + if(aspect == 0) { + Config::SetCurrent(Config::GFX_ASPECT_RATIO, AspectMode::Stretch); + aspect = 1; + } else { + Config::SetCurrent(Config::GFX_ASPECT_RATIO, AspectMode::Auto); + aspect = 0; + } + hotkey = 0; + } + if( (x.button & PAD_BUTTON_B) == PAD_BUTTON_B) { + if(ires == 2) { + Config::SetCurrent(Config::GFX_EFB_SCALE, 4); + OSD::AddMessage("Internal Resolution: 720P"); + ires = 4; + } + else if(ires == 4) { + Config::SetCurrent(Config::GFX_EFB_SCALE, 6); + OSD::AddMessage("Internal Resolution: 1080P"); + ires = 6; + } else { + Config::SetCurrent(Config::GFX_EFB_SCALE, 2); + OSD::AddMessage("Internal Resolution: 480P"); + ires = 2; + } + hotkey = 0; + } + if( (x.button & PAD_TRIGGER_Z) == PAD_TRIGGER_Z) { + if(fforward == 0) { + auto speed = Config::Get(Config::MAIN_EMULATION_SPEED) + 1.0; + speed = (speed >= 0.95 && speed <= 1.05) ? 1.0 : speed; + Config::SetCurrent(Config::MAIN_EMULATION_SPEED, speed); + OSD::AddMessage("Fast Forward: ON"); + fforward = 1; + } else { + auto speed = Config::Get(Config::MAIN_EMULATION_SPEED) - 1.0; + speed = (speed <= 0 || (speed >= 0.95 && speed <= 1.05)) ? 1.0 : speed; + Config::SetCurrent(Config::MAIN_EMULATION_SPEED, speed); + OSD::AddMessage("Fast Forward: OFF"); + fforward = 0; + } + hotkey = 0; + } + } + } + // TODO: Is this sleep appropriate? std::this_thread::sleep_for(std::chrono::milliseconds(1)); } diff --git a/Source/Core/InputCommon/GCPadStatus.h b/Source/Core/InputCommon/GCPadStatus.h index 74849e5594..029ade5824 100644 --- a/Source/Core/InputCommon/GCPadStatus.h +++ b/Source/Core/InputCommon/GCPadStatus.h @@ -26,6 +26,7 @@ enum PadButton PAD_BUTTON_X = 0x0400, PAD_BUTTON_Y = 0x0800, PAD_BUTTON_START = 0x1000, + PAD_BUTTON_HOTKEY = 0x2000, }; struct GCPadStatus ================================================ FILE: packages/sx05re/emulators/dolphinSA/patches/001-padorder.patch ================================================ diff --git a/Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp b/Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp index 6df37b4..64ade4a 100644 --- a/Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp +++ b/Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp @@ -392,6 +392,65 @@ void Init() StartHotplugThread(); } +struct joypad_udev_entry +{ + const char *devnode; + struct udev_device *dev; +}; + +int isNumber(const char *s) { + int n; + + if(strlen(s) == 0) { + return 0; + } + + for(n=0; ndevnode, bb->devnode); +} + // Only call this when ControllerInterface::m_devices_population_mutex is locked void PopulateDevices() { @@ -404,6 +463,10 @@ void PopulateDevices() // We use udev to iterate over all /dev/input/event* devices. // Note: the Linux kernel is currently limited to just 32 event devices. If // this ever changes, hopefully udev will take care of this. + unsigned sorted_count = 0; + struct joypad_udev_entry sorted[64]; + const char* devnode; + int i; udev* const udev = udev_new(); ASSERT_MSG(CONTROLLERINTERFACE, udev != nullptr, "Couldn't initialize libudev."); @@ -422,11 +485,25 @@ void PopulateDevices() udev_device* dev = udev_device_new_from_syspath(udev, path); - if (const char* devnode = udev_device_get_devnode(dev)) - AddDeviceNode(devnode); - - udev_device_unref(dev); + devnode = udev_device_get_devnode(dev); + if (devnode != NULL && sorted_count < 64) { + sorted[sorted_count].devnode = devnode; + sorted[sorted_count].dev = dev; + sorted_count++; + } else { + udev_device_unref(dev); + } } + + /* Sort the udev entries by devnode name so that they are + * created in the proper order */ + qsort(sorted, sorted_count, sizeof(struct joypad_udev_entry), sort_devnodes); + + for (i = 0; i < sorted_count; i++) { + AddDeviceNode(sorted[i].devnode); + udev_device_unref(sorted[i].dev); + } + udev_enumerate_unref(enumerate); udev_unref(udev); } ================================================ FILE: packages/sx05re/emulators/dolphinSA/patches/002-savestat-names.patch ================================================ diff --git a/Source/Core/Core/BootManager.cpp b/Source/Core/Core/BootManager.cpp index 52a3ec910f..fb18a04835 100644 --- a/Source/Core/Core/BootManager.cpp +++ b/Source/Core/Core/BootManager.cpp @@ -66,6 +66,11 @@ bool BootCore(Core::System& system, std::unique_ptr boot, if (!StartUp.SetPathsAndGameMetadata(system, *boot)) return false; + if (std::holds_alternative(boot->parameters)) + { + StartUp.SetBaseSaveState(PathToFileName(std::get(boot->parameters).path)); + } + // Movie settings auto& movie = system.GetMovie(); if (movie.IsPlayingInput() && movie.IsConfigSaved()) diff --git a/Source/Core/Core/ConfigManager.cpp b/Source/Core/Core/ConfigManager.cpp index a284cbe266..cec815e678 100644 --- a/Source/Core/Core/ConfigManager.cpp +++ b/Source/Core/Core/ConfigManager.cpp @@ -142,6 +142,10 @@ void SConfig::SetRunningGameMetadata(const std::string& game_id) SetRunningGameMetadata(game_id, "", 0, 0, DiscIO::Region::Unknown); } +void SConfig::SetBaseSaveState(const std::string& base_save_state) { + m_base_save_state = base_save_state; +} + void SConfig::SetRunningGameMetadata(const std::string& game_id, const std::string& gametdb_id, u64 title_id, u16 revision, DiscIO::Region region) { diff --git a/Source/Core/Core/ConfigManager.h b/Source/Core/Core/ConfigManager.h index 999cc9f86c..dd649a037a 100644 --- a/Source/Core/Core/ConfigManager.h +++ b/Source/Core/Core/ConfigManager.h @@ -61,6 +61,8 @@ struct SConfig // TODO: remove this as soon as the ticket view hack in IOS/ES/Views is dropped. bool m_disc_booted_from_game_list = false; + const std::string& GetBaseSaveState() const { return m_base_save_state; } + void SetBaseSaveState(const std::string& base_save_state); const std::string& GetGameID() const { return m_game_id; } const std::string& GetGameTDBID() const { return m_gametdb_id; } const std::string& GetTitleName() const { return m_title_name; } @@ -115,6 +117,7 @@ private: static SConfig* m_Instance; + std::string m_base_save_state; std::string m_game_id; std::string m_gametdb_id; std::string m_title_name; diff --git a/Source/Core/Core/State.cpp b/Source/Core/Core/State.cpp index fe20d74ea4..4094351533 100644 --- a/Source/Core/Core/State.cpp +++ b/Source/Core/Core/State.cpp @@ -293,7 +293,38 @@ static std::string SystemTimeAsDoubleToString(double time) return fmt::format(std::locale{""}, "{:%x %X}", *local_time); } -static std::string MakeStateFilename(int number); +static std::string MakeStateFilename_partdirectory(int number) +{ + return File::GetUserPath(D_STATESAVES_IDX); +} + +static std::string MakeStateFilename_partfileID(int number) +{ + return fmt::format("{}.s{:02d}", SConfig::GetInstance().GetGameID(), number); +} + +static std::string MakeStateFilename_partfileName(int number) +{ + std::string basesavestate = SConfig::GetInstance().GetBaseSaveState(); + if(basesavestate == "") return ""; + return fmt::format("{}.s{:02d}", basesavestate, number); +} + +static std::string MakeStateFilename(bool useId, int number) +{ + // if the useId flag is set : if the file with name exits, returns it, otherwise, if the file with id exists, returns it, otherwise, return the file with name + // => priority with the file with name. + // if the game is not loaded from a file (disk), use the gameId + std::string filePartName = MakeStateFilename_partfileName(number); + std::string fileWithName = fmt::format("{}{}", MakeStateFilename_partdirectory(number), filePartName); + if (File::Exists(fileWithName) && filePartName != "") + return fileWithName; + std::string fileWithId = fmt::format("{}{}", MakeStateFilename_partdirectory(number), MakeStateFilename_partfileID(number)); + if (File::Exists(fileWithId) && useId) + return fileWithId; + if(filePartName == "") return fileWithId; + return fileWithName; +} static std::vector GetUsedSlotsWithTimestamp() { @@ -301,7 +332,7 @@ static std::vector GetUsedSlotsWithTimestamp() StateHeader header; for (int i = 1; i <= (int)NUM_STATES; i++) { - std::string filename = MakeStateFilename(i); + std::string filename = MakeStateFilename(true, i); if (File::Exists(filename)) { if (ReadHeader(filename, header)) @@ -645,7 +676,7 @@ bool ReadHeader(const std::string& filename, StateHeader& header) std::string GetInfoStringOfSlot(int slot, bool translate) { - std::string filename = MakeStateFilename(slot); + std::string filename = MakeStateFilename(true, slot); if (!File::Exists(filename)) return translate ? Common::GetStringT("Empty") : "Empty"; @@ -659,7 +690,7 @@ std::string GetInfoStringOfSlot(int slot, bool translate) u64 GetUnixTimeOfSlot(int slot) { State::StateHeader header; - if (!ReadHeader(MakeStateFilename(slot), header)) + if (!ReadHeader(MakeStateFilename(true, slot), header)) return 0; constexpr u64 MS_PER_SEC = 1000; @@ -977,12 +1008,13 @@ static std::string MakeStateFilename(int number) void Save(Core::System& system, int slot, bool wait) { - SaveAs(system, MakeStateFilename(slot), wait); + std::string savePath = MakeStateFilename(false, slot); + SaveAs(system, savePath, wait); } void Load(Core::System& system, int slot) { - LoadAs(system, MakeStateFilename(slot)); + LoadAs(system, MakeStateFilename(true, slot)); } void LoadLastSaved(Core::System& system, int i) ================================================ FILE: packages/sx05re/emulators/dolphinSA/scripts/dolphin.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) . /etc/profile CONFIG_DIR="/storage/.local/share/dolphin-emu" if [ -d "${CONFIG_DIR}" ]; then rm -rf "${CONFIG_DIR}" fi mkdir -p /storage/.local/share/ if [ ! -L "${CONFIG_DIR}" ]; then ln -sf "/emuelec/configs/dolphin-emu" "${CONFIG_DIR}" fi mkdir -p /storage/roms/dolphin/dolphin-emu/StateSaves AUTOGP=$(get_ee_setting dolphin_auto_gamepad) if [[ "${AUTOGP}" != "0" ]]; then set_dolphin_joy.sh fi fbfix $( emuelec-utils getmainfb ) XDG_CONFIG_HOME=/emuelec/configs XDG_DATA_HOME=/storage/roms/dolphin /usr/bin/dolphin-emu-nogui -p fbdev "${1}" ================================================ FILE: packages/sx05re/emulators/dolphinSA/scripts/set_dolphin_joy.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile # Configure ADVMAME players based on ES settings CONFIG_DIR="/storage/.config/emuelec/configs/dolphin-emu" CONFIG=${CONFIG_DIR}/GCPadNew.ini WII_CONFIG=${CONFIG_DIR}/WiimoteNew.ini MAIN_CONFIG=${CONFIG_DIR}/Dolphin.ini CONFIG_TMP=/tmp/jc/GCPadNew.tmp WII_CONFIG_TMP=/tmp/jc/WiimoteNew.tmp source joy_common.sh "dolphin" BTN_H0=$(get_ee_setting dolphin_btn_h0) [[ -z "${BTN_H0}" ]] && BTN_H0=6 H0_AXIS1=$(( BTN_H0+0 )) H0_AXIS2=$(( BTN_H0+1 )) declare -A GC_DOLPHIN_VALUES=( [h0.1]="Hat 0 N" [h0.4]="Hat 0 S" [h0.8]="Hat 0 W" [h0.2]="Hat 0 E" [b0]="Button 0" [b1]="Button 1" [b2]="Button 2" [b3]="Button 3" [b4]="Button 4" [b5]="Button 5" [b6]="Button 6" [b7]="Button 7" [b8]="Button 8" [b9]="Button 9" [b10]="Button 10" [b11]="Button 11" [b12]="Button 12" [b13]="Button 13" [b14]="Button 14" [b15]="Button 15" [b16]="Button 16" ) declare -A GC_DOLPHIN_BUTTONS=( [dpleft]="D-Pad/Left" [dpright]="D-Pad/Right" [dpup]="D-Pad/Up" [dpdown]="D-Pad/Down" [x]="Buttons/Y" [y]="Buttons/X" [a]="Buttons/B" [b]="Buttons/A" [lefttrigger]="Triggers/L" [righttrigger]="Triggers/R" [start]="Buttons/Start" [rightshoulder]="Buttons/Z" [guide]="Buttons/Hotkey" ) declare -A WII_DOLPHIN_BUTTONS=( [dpleft]="D-Pad/Left" [dpright]="D-Pad/Right" [dpup]="D-Pad/Up" [dpdown]="D-Pad/Down" [x]="Buttons/Y" [y]="Buttons/X" [a]="Buttons/B" [b]="Buttons/A" [leftshoulder]="Triggers/L" [rightshoulder]="Triggers/R" [back]="Buttons/-" [start]="Buttons/+" [lefttrigger]="Buttons/L-Analog" [righttrigger]="Buttons/R-Analog" [guide]="Buttons/Home" [leftstick]="Buttons/ZL" [rightstick]="Buttons/ZR" ) BTN_SWAP_XY=$(get_ee_setting dolphin_joy_swap_xy) if [[ "${BTN_SWAP_XY}" == "1" ]]; then GC_DOLPHIN_BUTTONS[x]="Buttons/X" GC_DOLPHIN_BUTTONS[y]="Buttons/Y" fi BTN_SWAP_AB=$(get_ee_setting dolphin_joy_swap_ab) if [[ "${BTN_SWAP_AB}" == "1" ]]; then GC_DOLPHIN_BUTTONS[a]="Buttons/A" GC_DOLPHIN_BUTTONS[b]="Buttons/B" fi declare -A WII_DOLPHIN_STICKS=( ["leftx,0"]="Left Stick/Left" ["leftx,1"]="Left Stick/Right" ["lefty,0"]="Left Stick/Up" ["lefty,1"]="Left Stick/Down" ["rightx,0"]="Right Stick/Left" ["rightx,1"]="Right Stick/Right" ["righty,0"]="Right Stick/Up" ["righty,1"]="Right Stick/Down" ) declare -A GC_DOLPHIN_STICKS=( ["leftx,0"]="Main Stick/Left" ["leftx,1"]="Main Stick/Right" ["lefty,0"]="Main Stick/Up" ["lefty,1"]="Main Stick/Down" ["rightx,0"]="C-Stick/Left" ["rightx,1"]="C-Stick/Right" ["righty,0"]="C-Stick/Up" ["righty,1"]="C-Stick/Down" ) # Declare an associative array to store ID counts declare -A id_counts=() # Function to add or increment an ID add_or_increment_id() { local id=$1 # Check if the ID already exists as a key in the associative array if [[ -v id_counts["${id}"] ]]; then # If present, increment its value (count) (( id_counts["${id}"]++ )) else # If not present, add it to the array and set the count to 1 id_counts["$id"]=0 fi } # Cleans all the inputs for the gamepad with name ${GAMEPAD} and player ${1} clean_pad() { declare -a params=(".*Stick\/Modifier\/Range" ".*Stick\/Dead\ Zone") jc_wipe_config_sub_heading "${CONFIG}" "[GCPad${1}]" "${CONFIG_TMP}" "${params[@]}" jc_wipe_config_sub_heading "${WII_CONFIG}" "[Wiimote${1}]" "${WII_CONFIG_TMP}" echo "[Wiimote${1}]" >> ${WII_CONFIG} echo "Source = 0" >> ${WII_CONFIG} } # Sets pad depending on parameters. # ${1} = Player Number # ${2} = js[0-7] # ${3} = Device GUID # ${4} = Device Name set_pad() { local DEVICE_GUID=${3} local JOY_NAME="${4}" echo "DEVICE_GUID=${DEVICE_GUID}" local GC_CONFIG="${5}" echo "GC_CONFIG=${GC_CONFIG}" [[ -z ${GC_CONFIG} ]] && return sed -i "/\[Wiimote${1}\]/,+1 d" ${WII_CONFIG} local GC_MAP=$(echo ${GC_CONFIG} | cut -d',' -f3-) echo "[GCPad${1}]" >> ${CONFIG} add_or_increment_id "${JOY_NAME}" local JOY_INDEX=${id_counts[${JOY_NAME}]} echo "Device = evdev/${JOY_INDEX}/${JOY_NAME}" >> ${CONFIG} echo "[Wiimote${1}]" >> ${WII_CONFIG} echo "Device = evdev/${JOY_INDEX}/${JOY_NAME}" >> ${WII_CONFIG} echo "Extension = Classic" >> ${WII_CONFIG} echo "Source = 1" >> ${WII_CONFIG} set -f local GC_ARRAY=(${GC_MAP//,/ }) for index in "${!GC_ARRAY[@]}" do local REC=${GC_ARRAY[${index}]} local BUTTON_INDEX=$(echo ${REC} | cut -d ":" -f 1) local TVAL=$(echo ${REC} | cut -d ":" -f 2) local BUTTON_VAL=${TVAL:1} local BTN_TYPE=${TVAL:0:1} local VAL="${GC_DOLPHIN_VALUES[${TVAL}]}" # CREATE BUTTON MAPS (inlcuding hats). local GC_INDEX="${GC_DOLPHIN_BUTTONS[${BUTTON_INDEX}]}" if [[ ! -z "${GC_INDEX}" ]]; then if [[ "${BTN_TYPE}" == "b" || "${BTN_TYPE}" == "h" ]]; then [[ ! -z "${VAL}" ]] && echo "${GC_INDEX} = \`${VAL}\`" >> ${CONFIG_TMP} fi if [[ "${BTN_TYPE}" == "a" ]]; then echo "${GC_INDEX} = \`Axis ${BUTTON_VAL}+\`" >> ${CONFIG_TMP} fi fi # Wii CREATE BUTTON MAPS (inlcuding hats). local WII_INDEX="${WII_DOLPHIN_BUTTONS[${BUTTON_INDEX}]}" if [[ ! -z "${WII_INDEX}" ]]; then if [[ "${BTN_TYPE}" == "b" || "${BTN_TYPE}" == "h" ]]; then [[ ! -z "${VAL}" ]] && echo "Classic/${WII_INDEX} = \`${VAL}\`" >> ${WII_CONFIG_TMP} fi if [[ "${BTN_TYPE}" == "a" ]]; then echo "Classic/${WII_INDEX} = \`Axis ${BUTTON_VAL}-+\`" >> ${WII_CONFIG_TMP} fi fi # Create Axis Maps case ${BUTTON_INDEX} in leftx|lefty|rightx|righty) GC_INDEX="${GC_DOLPHIN_STICKS[${BUTTON_INDEX},0]}" echo "${GC_INDEX} = \`Axis ${BUTTON_VAL}-\`" >> ${CONFIG_TMP} GC_INDEX="${GC_DOLPHIN_STICKS[${BUTTON_INDEX},1]}" echo "${GC_INDEX} = \`Axis ${BUTTON_VAL}+\`" >> ${CONFIG_TMP} ;; esac # Wii Create Axis Maps case ${BUTTON_INDEX} in leftx|lefty|rightx|righty) WII_INDEX="${WII_DOLPHIN_STICKS[${BUTTON_INDEX},0]}" echo "Classic/${WII_INDEX} = \`Axis ${BUTTON_VAL}-\`" >> ${WII_CONFIG_TMP} WII_INDEX="${WII_DOLPHIN_STICKS[${BUTTON_INDEX},1]}" echo "Classic/${WII_INDEX} = \`Axis ${BUTTON_VAL}+\`" >> ${WII_CONFIG_TMP} ;; esac done local JOYSTICK="Main Stick" local GC_RECORD GC_RECORD=$(cat ${CONFIG_TMP} | grep -E "^${JOYSTICK}/Modifier *= *(.*)$") [[ -z "${GC_RECORD}" ]] && echo "${JOYSTICK}/Modifier = Shift_L" >> ${CONFIG_TMP} GC_RECORD=$(cat ${CONFIG_TMP} | grep -E "^${JOYSTICK}/Modifier/Range *= *(.*)$") [[ -z "${GC_RECORD}" ]] && echo "${JOYSTICK}/Modifier/Range = 50.000000000000000" >> ${CONFIG_TMP} GC_RECORD=$(cat ${CONFIG_TMP} | grep -E "^${JOYSTICK}/Dead Zone *= *(.*)$") [[ -z "${GC_RECORD}" ]] && echo "${JOYSTICK}/Dead Zone = 25.000000000000000" >> ${CONFIG_TMP} JOYSTICK="C-Stick" GC_RECORD=$(cat ${CONFIG_TMP} | grep -E "^${JOYSTICK}/Modifier *= *(.*)$") [[ -z "${GC_RECORD}" ]] && echo "${JOYSTICK}/Modifier = Control_L" >> ${CONFIG_TMP} GC_RECORD=$(cat ${CONFIG_TMP} | grep -E "^${JOYSTICK}/Modifier/Range *= *(.*)$") [[ -z "${GC_RECORD}" ]] && echo "${JOYSTICK}/Modifier/Range = 50.000000000000000" >> ${CONFIG_TMP} GC_RECORD=$(cat ${CONFIG_TMP} | grep -E "^${JOYSTICK}/Dead Zone *= *(.*)$") [[ -z "${GC_RECORD}" ]] && echo "${JOYSTICK}/Dead Zone = 25.000000000000000" >> ${CONFIG_TMP} cat "${CONFIG_TMP}" | sort >> ${CONFIG} RUMBLE=$(get_ee_setting ee_rumble_strength) [[ -z "${RUMBLE}" ]] && RUMBLE=0 echo "Rumble/Motor = `Strong`|`Weak`" >> ${CONFIG} echo "Rumble/Motor/Range = ${RUMBLE}" >> ${CONFIG} rm "${CONFIG_TMP}" cat "${WII_CONFIG_TMP}" | sort >> ${WII_CONFIG} echo "Rumble/Motor = `Strong`|`Weak`" >> ${WII_CONFIG} echo "Rumble/Motor/Range = ${RUMBLE}" >> ${WII_CONFIG} rm "${WII_CONFIG_TMP}" } init_config() { local SIDevices=$( cat "${MAIN_CONFIG}" | grep -E "^SIDevice[0-9] *= *[^6]$") [[ -z "${SIDevices}" ]] && return declare -i LN=$( cat "${MAIN_CONFIG}" | grep -n -E "SIDevice[0-9] *= *[0-9]" | cut -d: -f1 | head -1 ) [[ "${LN}" == "0" ]] && LN=$( cat "${MAIN_CONFIG}" | grep -n "\[Core\]" | cut -d: -f1 | head -1 ) if [ ${LN} -ne 0 ]; then sed -i '/SIDevice[0-9] *\= *[0-9]/d' "${MAIN_CONFIG}" sed -i "${LN} i SIDevice0=6\nSIDevice1=6\nSIDevice2=6\nSIDevice3=6" "${MAIN_CONFIG}" fi } init_config jc_get_players ================================================ FILE: packages/sx05re/emulators/dosbox-sdl2/config/dosbox-SDL2-MT32.conf ================================================ # This is the configuration file for DOSBox SDL2. (Please use the latest version of DOSBox) # Lines starting with a # are comment lines and are ignored by DOSBox. # They are used to (briefly) document the effect of each option. [sdl] # fullscreen: Start dosbox directly in fullscreen. (Press ALT-Enter to go back) # vsync: Sync to Vblank IF supported by the output device and renderer (if relevant). # It can reduce screen flickering, but it can also result in a slow DOSBox. # fullresolution: What resolution to use for fullscreen: original, desktop or a fixed size (e.g. 1024x768). # Using your monitor's native resolution with aspect=true might give the best results. # If you end up with small window on a large screen, try an output different from surface. # windowresolution: Scale the window to this size IF the output device supports hardware scaling. # (output=surface does not!) # output: What video system to use for output. # Possible values: surface, texture, texturenb, opengl, openglnb. # gl.shader: What set of GLSL shaders to use with an OpenGL output. Keep empty if this is not desired. # Note that in case it is used, the respective shader files must be found in the "shaders" subdirectory # relatively to where the default DOSBox configuration fiel is stored. For shader file naming convention, # suppose that you have a pair of shader files ready: mysample.vert and mysample.frag. # Then shader=mysample should be set. # # texture.renderer: Choose a renderer driver if output=texture or output=texturenb. Use output=auto for an automatic choice. # Possible values: auto, opengl, software. # autolock: Mouse will automatically lock, if you click on the screen. (Press CTRL-F10 to unlock) # sensitivity: Mouse sensitivity. # waitonerror: Wait before closing the console if dosbox has an error. # priority: Priority levels for dosbox. Second entry behind the comma is for when dosbox is not focused/minimized. # pause is only valid for the second entry. # Possible values: lowest, lower, normal, higher, highest, pause. # mapperfile: File used to load/save the key/event mappings from. Resetmapper only works with the default value. fullscreen=true # Note that VSYNC is be very demanding vsync=false fullresolution=0x0 windowresolution=original output=texture # Place shaders in /storage/.config/dosbox/shaders gl.shader=crt-easymode texture.renderer=auto autolock=true sensitivity=100 waitonerror=true priority=highest,highest # Input mapper file is looked for in the same directory as the specified conf mapperfile=example.map [dosbox] # language: Select another language file. # machine: The type of machine DOSBox tries to emulate. # Possible values: hercules, cga, tandy, pcjr, ega, vgaonly, svga_s3, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe. # captures: Directory where things like wave, midi, screenshot get captured. # memsize: Amount of memory DOSBox has in megabytes. # This value is best left at its default to avoid problems with some games, # though few games might require a higher value. # There is generally no speed advantage when raising this value. language= machine=svga_s3 captures=capture memsize=16 [render] # frameskip: How many frames DOSBox skips before drawing one. # aspect: Do aspect correction, if your output method doesn't support scaling this can slow things down!. # scaler: Scaler used to enlarge/enhance low resolution modes. If 'forced' is appended, # then the scaler will be used even if the result might not be desired. # Possible values: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x. frameskip=0 aspect=true scaler=none [cpu] # core: CPU Core used in emulation. auto will switch to dynamic if available and # appropriate. # Possible values: auto, dynamic, normal, simple. # cputype: CPU Type used in emulation. auto is the fastest choice. # Possible values: auto, 386, 386_slow, 486_slow, pentium_slow, 386_prefetch. # cycles: Amount of instructions DOSBox tries to emulate each millisecond. # Setting this value too high results in sound dropouts and lags. # Cycles can be set in 3 ways: # 'auto' tries to guess what a game needs. # It usually works, but can fail for certain games. # 'fixed #number' will set a fixed amount of cycles. This is what you usually # need if 'auto' fails (Example: fixed 4000). # 'max' will allocate as much cycles as your computer is able to # handle. # Possible values: auto, fixed, max. # cycleup: Amount of cycles to decrease/increase with keycombos.(CTRL-F11/CTRL-F12) # cycledown: Setting it lower than 100 will be a percentage. core=auto cputype=auto cycles=auto cycleup=10 cycledown=20 [mixer] # nosound: Enable silent mode, sound is still emulated though. # rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged. # Possible values: 1024, 2048, 4096, 8192, 512, 256. # prebuffer: How many milliseconds of data to keep on top of the blocksize. nosound=false rate=44100 blocksize=1024 prebuffer=20 [midi] # mpu401: Type of MPU-401 to emulate. # Possible values: intelligent, uart, none. # mididevice: Device that will receive the MIDI data from MPU-401. # Possible values: default, win32, alsa, oss, coreaudio, coremidi, mt32, none. # midiconfig: Special configuration options for the device driver. This is usually the id of the device you want to use. # or in the case of coreaudio, you can specify a soundfont here. # When using a Roland MT-32 rev. 0 as midi output device, some games may require a delay in order to prevent 'buffer overflow' issues. # In that case, add 'delaysysex', for example: midiconfig=2 delaysysex # See the README/Manual for more details. # mt32.romdir: Name of the directory where MT-32 Control and PCM ROM files can be found. Emulation requires these files to work. # Accepted file names are as follows: # MT32_CONTROL.ROM or CM32L_CONTROL.ROM - control ROM file. # MT32_PCM.ROM or CM32L_PCM.ROM - PCM ROM file. # mt32.reverse.stereo: Reverse stereo channels for MT-32 output # mt32.verbose: MT-32 debug logging # mt32.thread: MT-32 rendering in separate thread # mt32.chunk: Minimum milliseconds of data to render at once. # Increasing this value reduces rendering overhead which may improve performance but also increases audio lag. # Valid for rendering in separate thread only. # Possible values: 2, 3, 16, 99, 100. # mt32.prebuffer: How many milliseconds of data to render ahead. # Increasing this value may help to avoid underruns but also increases audio lag. # Cannot be set less than or equal to mt32.chunk value. # Valid for rendering in separate thread only. # Possible values: 3, 4, 32, 199, 200. # mt32.partials: The maximum number of partials playing simultaneously. # Possible values: 8, 9, 32, 255, 256. # mt32.dac: MT-32 DAC input emulation mode # Nice = 0 - default # Produces samples at double the volume, without tricks. # Higher quality than the real devices # # Pure = 1 # Produces samples that exactly match the bits output from the emulated LA32. # Nicer overdrive characteristics than the DAC hacks (it simply clips samples within range) # Much less likely to overdrive than any other mode. # Half the volume of any of the other modes. # Perfect for developers while debugging :) # # GENERATION1 = 2 # Re-orders the LA32 output bits as in early generation MT-32s (according to Wikipedia). # Bit order at DAC (where each number represents the original LA32 output bit number, and XX means the bit is always low): # 15 13 12 11 10 09 08 07 06 05 04 03 02 01 00 XX # # GENERATION2 = 3 # Re-orders the LA32 output bits as in later generations (personally confirmed on my CM-32L - KG). # Bit order at DAC (where each number represents the original LA32 output bit number): # 15 13 12 11 10 09 08 07 06 05 04 03 02 01 00 14 # Possible values: 0, 1, 2, 3. # mt32.analog: MT-32 analogue output emulation mode # Digital = 0 # Only digital path is emulated. The output samples correspond to the digital output signal appeared at the DAC entrance. # Fastest mode. # # Coarse = 1 # Coarse emulation of LPF circuit. High frequencies are boosted, sample rate remains unchanged. # A bit better sounding but also a bit slower. # # Accurate = 2 - default # Finer emulation of LPF circuit. Output signal is upsampled to 48 kHz to allow emulation of audible mirror spectra above 16 kHz, # which is passed through the LPF circuit without significant attenuation. # Sounding is closer to the analog output from real hardware but also slower than the modes 0 and 1. # # Oversampled = 3 # Same as the default mode 2 but the output signal is 2x oversampled, i.e. the output sample rate is 96 kHz. # Even slower than all the other modes but better retains highest frequencies while further resampled in DOSBox mixer. # Possible values: 0, 1, 2, 3. # mt32.reverb.mode: MT-32 reverb mode # Possible values: 0, 1, 2, 3, auto. # mt32.reverb.time: MT-32 reverb decaying time # Possible values: 0, 1, 2, 3, 4, 5, 6, 7. # mt32.reverb.level: MT-32 reverb level # Possible values: 0, 1, 2, 3, 4, 5, 6, 7. mpu401=intelligent mididevice=mt32 midiconfig= # Place MT-32 roms here mt32.romdir=/storage/roms/bios mt32.reverse.stereo=false mt32.verbose=false mt32.thread=false mt32.chunk=16 mt32.prebuffer=32 mt32.partials=32 mt32.dac=0 mt32.analog=2 mt32.reverb.mode=auto mt32.reverb.time=5 mt32.reverb.level=3 [sblaster] # sbtype: Type of Soundblaster to emulate. gb is Gameblaster. # Possible values: sb1, sb2, sbpro1, sbpro2, sb16, gb, none. # sbbase: The IO address of the soundblaster. # Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300. # irq: The IRQ number of the soundblaster. # Possible values: 7, 5, 3, 9, 10, 11, 12. # dma: The DMA number of the soundblaster. # Possible values: 1, 5, 0, 3, 6, 7. # hdma: The High DMA number of the soundblaster. # Possible values: 1, 5, 0, 3, 6, 7. # sbmixer: Allow the soundblaster mixer to modify the DOSBox mixer. # oplmode: Type of OPL emulation. On 'auto' the mode is determined by sblaster type. All OPL modes are Adlib-compatible, except for 'cms'. # Possible values: auto, cms, opl2, dualopl2, opl3, opl3gold, none. # oplemu: Provider for the OPL emulation. compat might provide better quality (see oplrate as well). # Possible values: default, compat, fast. # oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly). # Possible values: 44100, 49716, 48000, 32000, 22050, 16000, 11025, 8000. sbtype=sb16 sbbase=220 irq=7 dma=1 hdma=5 sbmixer=true oplmode=auto oplemu=default oplrate=44100 [gus] # gus: Enable the Gravis Ultrasound emulation. # gusrate: Sample rate of Ultrasound emulation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # gusbase: The IO base address of the Gravis Ultrasound. # Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300. # gusirq: The IRQ number of the Gravis Ultrasound. # Possible values: 5, 3, 7, 9, 10, 11, 12. # gusdma: The DMA channel of the Gravis Ultrasound. # Possible values: 3, 0, 1, 5, 6, 7. # ultradir: Path to Ultrasound directory. In this directory # there should be a MIDI directory that contains # the patch files for GUS playback. Patch sets used # with Timidity should work fine. gus=true gusrate=44100 gusbase=240 gusirq=5 gusdma=3 # Place GUS files in /storage/roms/dos/ULTRASND ultradir=C:\ULTRASND [speaker] # pcspeaker: Enable PC-Speaker emulation. # pcrate: Sample rate of the PC-Speaker sound generation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'. # Possible values: auto, on, off. # tandyrate: Sample rate of the Tandy 3-Voice generation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible). pcspeaker=true pcrate=44100 tandy=auto tandyrate=44100 disney=true [joystick] # joysticktype: Type of joystick to emulate: auto (default), none, # 2axis (supports two joysticks), # 4axis (supports one joystick, first joystick used), # 4axis_2 (supports one joystick, second joystick used), # fcs (Thrustmaster), ch (CH Flightstick). # none disables joystick emulation. # auto chooses emulation depending on real joystick(s). # (Remember to reset dosbox's mapperfile if you saved it earlier) # Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none. # timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away). # autofire: continuously fires as long as you keep the button pressed. # swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks. # buttonwrap: enable button wrapping at the number of emulated buttons. joysticktype=fcs timed=true autofire=false swap34=false buttonwrap=false [serial] # serial1: set type of device connected to com port. # Can be disabled, dummy, modem, nullmodem, directserial. # Additional parameters must be in the same line in the form of # parameter:value. Parameter for all types is irq (optional). # for directserial: realport (required), rxdelay (optional). # (realport:COM1 realport:ttyS0). # for modem: listenport (optional). # for nullmodem: server, rxdelay, txdelay, telnet, usedtr, # transparent, port, inhsocket (all optional). # Example: serial1=modem listenport:5000 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial2: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial3: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial4: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. serial1=dummy serial2=dummy serial3=disabled serial4=disabled [dos] # xms: Enable XMS support. # ems: Enable EMS support. The default (=true) provides the best # compatibility but certain applications may run better with # other choices, or require EMS support to be disabled (=false) # to work at all. # Possible values: true, emsboard, emm386, false. # umb: Enable UMB support. # keyboardlayout: Language code of the keyboard layout (or none). xms=true ems=true umb=true keyboardlayout=auto [ipx] # ipx: Enable ipx over UDP/IP emulation. ipx=false [autoexec] # Lines in this section will be run at startup. mount c /storage/roms/dos c: cd example example.exe #exit ================================================ FILE: packages/sx05re/emulators/dosbox-sdl2/config/dosbox-SDL2.conf ================================================ # This is the configuration file for DOSBox SDL2. (Please use the latest version of DOSBox) # Lines starting with a # are comment lines and are ignored by DOSBox. # They are used to (briefly) document the effect of each option. [sdl] # fullscreen: Start dosbox directly in fullscreen. (Press ALT-Enter to go back) # vsync: Sync to Vblank IF supported by the output device and renderer (if relevant). # It can reduce screen flickering, but it can also result in a slow DOSBox. # fullresolution: What resolution to use for fullscreen: original, desktop or a fixed size (e.g. 1024x768). # Using your monitor's native resolution with aspect=true might give the best results. # If you end up with small window on a large screen, try an output different from surface. # windowresolution: Scale the window to this size IF the output device supports hardware scaling. # (output=surface does not!) # output: What video system to use for output. # Possible values: surface, texture, texturenb, opengl, openglnb. # gl.shader: What set of GLSL shaders to use with an OpenGL output. Keep empty if this is not desired. # Note that in case it is used, the respective shader files must be found in the "shaders" subdirectory # relatively to where the default DOSBox configuration fiel is stored. For shader file naming convention, # suppose that you have a pair of shader files ready: mysample.vert and mysample.frag. # Then shader=mysample should be set. # # texture.renderer: Choose a renderer driver if output=texture or output=texturenb. Use output=auto for an automatic choice. # Possible values: auto, opengl, software. # autolock: Mouse will automatically lock, if you click on the screen. (Press CTRL-F10 to unlock) # sensitivity: Mouse sensitivity. # waitonerror: Wait before closing the console if dosbox has an error. # priority: Priority levels for dosbox. Second entry behind the comma is for when dosbox is not focused/minimized. # pause is only valid for the second entry. # Possible values: lowest, lower, normal, higher, highest, pause. # mapperfile: File used to load/save the key/event mappings from. Resetmapper only works with the default value. fullscreen=true # Note that VSYNC is be very demanding vsync=false fullresolution=0x0 windowresolution=original output=texture # Place shaders in /storage/.config/dosbox/shaders gl.shader=crt-easymode texture.renderer=auto autolock=true sensitivity=100 waitonerror=true priority=highest,highest # Input mapper file is looked for in the same directory as the specified conf mapperfile=example.map [dosbox] # language: Select another language file. # machine: The type of machine DOSBox tries to emulate. # Possible values: hercules, cga, tandy, pcjr, ega, vgaonly, svga_s3, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe. # captures: Directory where things like wave, midi, screenshot get captured. # memsize: Amount of memory DOSBox has in megabytes. # This value is best left at its default to avoid problems with some games, # though few games might require a higher value. # There is generally no speed advantage when raising this value. language= machine=svga_s3 captures=capture memsize=16 [render] # frameskip: How many frames DOSBox skips before drawing one. # aspect: Do aspect correction, if your output method doesn't support scaling this can slow things down!. # scaler: Scaler used to enlarge/enhance low resolution modes. If 'forced' is appended, # then the scaler will be used even if the result might not be desired. # Possible values: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x. frameskip=0 aspect=true scaler=none [cpu] # core: CPU Core used in emulation. auto will switch to dynamic if available and # appropriate. # Possible values: auto, dynamic, normal, simple. # cputype: CPU Type used in emulation. auto is the fastest choice. # Possible values: auto, 386, 386_slow, 486_slow, pentium_slow, 386_prefetch. # cycles: Amount of instructions DOSBox tries to emulate each millisecond. # Setting this value too high results in sound dropouts and lags. # Cycles can be set in 3 ways: # 'auto' tries to guess what a game needs. # It usually works, but can fail for certain games. # 'fixed #number' will set a fixed amount of cycles. This is what you usually # need if 'auto' fails (Example: fixed 4000). # 'max' will allocate as much cycles as your computer is able to # handle. # Possible values: auto, fixed, max. # cycleup: Amount of cycles to decrease/increase with keycombos.(CTRL-F11/CTRL-F12) # cycledown: Setting it lower than 100 will be a percentage. core=auto cputype=auto cycles=auto cycleup=10 cycledown=20 [mixer] # nosound: Enable silent mode, sound is still emulated though. # rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged. # Possible values: 1024, 2048, 4096, 8192, 512, 256. # prebuffer: How many milliseconds of data to keep on top of the blocksize. nosound=false rate=44100 blocksize=1024 prebuffer=20 [midi] # mpu401: Type of MPU-401 to emulate. # Possible values: intelligent, uart, none. # mididevice: Device that will receive the MIDI data from MPU-401. # Possible values: default, win32, alsa, oss, coreaudio, coremidi, mt32, none. # midiconfig: Special configuration options for the device driver. This is usually the id of the device you want to use. # or in the case of coreaudio, you can specify a soundfont here. # When using a Roland MT-32 rev. 0 as midi output device, some games may require a delay in order to prevent 'buffer overflow' issues. # In that case, add 'delaysysex', for example: midiconfig=2 delaysysex # See the README/Manual for more details. # mt32.romdir: Name of the directory where MT-32 Control and PCM ROM files can be found. Emulation requires these files to work. # Accepted file names are as follows: # MT32_CONTROL.ROM or CM32L_CONTROL.ROM - control ROM file. # MT32_PCM.ROM or CM32L_PCM.ROM - PCM ROM file. # mt32.reverse.stereo: Reverse stereo channels for MT-32 output # mt32.verbose: MT-32 debug logging # mt32.thread: MT-32 rendering in separate thread # mt32.chunk: Minimum milliseconds of data to render at once. # Increasing this value reduces rendering overhead which may improve performance but also increases audio lag. # Valid for rendering in separate thread only. # Possible values: 2, 3, 16, 99, 100. # mt32.prebuffer: How many milliseconds of data to render ahead. # Increasing this value may help to avoid underruns but also increases audio lag. # Cannot be set less than or equal to mt32.chunk value. # Valid for rendering in separate thread only. # Possible values: 3, 4, 32, 199, 200. # mt32.partials: The maximum number of partials playing simultaneously. # Possible values: 8, 9, 32, 255, 256. # mt32.dac: MT-32 DAC input emulation mode # Nice = 0 - default # Produces samples at double the volume, without tricks. # Higher quality than the real devices # # Pure = 1 # Produces samples that exactly match the bits output from the emulated LA32. # Nicer overdrive characteristics than the DAC hacks (it simply clips samples within range) # Much less likely to overdrive than any other mode. # Half the volume of any of the other modes. # Perfect for developers while debugging :) # # GENERATION1 = 2 # Re-orders the LA32 output bits as in early generation MT-32s (according to Wikipedia). # Bit order at DAC (where each number represents the original LA32 output bit number, and XX means the bit is always low): # 15 13 12 11 10 09 08 07 06 05 04 03 02 01 00 XX # # GENERATION2 = 3 # Re-orders the LA32 output bits as in later generations (personally confirmed on my CM-32L - KG). # Bit order at DAC (where each number represents the original LA32 output bit number): # 15 13 12 11 10 09 08 07 06 05 04 03 02 01 00 14 # Possible values: 0, 1, 2, 3. # mt32.analog: MT-32 analogue output emulation mode # Digital = 0 # Only digital path is emulated. The output samples correspond to the digital output signal appeared at the DAC entrance. # Fastest mode. # # Coarse = 1 # Coarse emulation of LPF circuit. High frequencies are boosted, sample rate remains unchanged. # A bit better sounding but also a bit slower. # # Accurate = 2 - default # Finer emulation of LPF circuit. Output signal is upsampled to 48 kHz to allow emulation of audible mirror spectra above 16 kHz, # which is passed through the LPF circuit without significant attenuation. # Sounding is closer to the analog output from real hardware but also slower than the modes 0 and 1. # # Oversampled = 3 # Same as the default mode 2 but the output signal is 2x oversampled, i.e. the output sample rate is 96 kHz. # Even slower than all the other modes but better retains highest frequencies while further resampled in DOSBox mixer. # Possible values: 0, 1, 2, 3. # mt32.reverb.mode: MT-32 reverb mode # Possible values: 0, 1, 2, 3, auto. # mt32.reverb.time: MT-32 reverb decaying time # Possible values: 0, 1, 2, 3, 4, 5, 6, 7. # mt32.reverb.level: MT-32 reverb level # Possible values: 0, 1, 2, 3, 4, 5, 6, 7. mpu401=intelligent # FluidSynth Software Synthesizer mididevice=fluidsynth fluid.driver=pulseaudio fluid.soundfont=/usr/share/soundfonts/GeneralUser.sf2 [sblaster] # sbtype: Type of Soundblaster to emulate. gb is Gameblaster. # Possible values: sb1, sb2, sbpro1, sbpro2, sb16, gb, none. # sbbase: The IO address of the soundblaster. # Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300. # irq: The IRQ number of the soundblaster. # Possible values: 7, 5, 3, 9, 10, 11, 12. # dma: The DMA number of the soundblaster. # Possible values: 1, 5, 0, 3, 6, 7. # hdma: The High DMA number of the soundblaster. # Possible values: 1, 5, 0, 3, 6, 7. # sbmixer: Allow the soundblaster mixer to modify the DOSBox mixer. # oplmode: Type of OPL emulation. On 'auto' the mode is determined by sblaster type. All OPL modes are Adlib-compatible, except for 'cms'. # Possible values: auto, cms, opl2, dualopl2, opl3, opl3gold, none. # oplemu: Provider for the OPL emulation. compat might provide better quality (see oplrate as well). # Possible values: default, compat, fast. # oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly). # Possible values: 44100, 49716, 48000, 32000, 22050, 16000, 11025, 8000. sbtype=sb16 sbbase=220 irq=7 dma=1 hdma=5 sbmixer=true oplmode=auto oplemu=default oplrate=44100 [gus] # gus: Enable the Gravis Ultrasound emulation. # gusrate: Sample rate of Ultrasound emulation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # gusbase: The IO base address of the Gravis Ultrasound. # Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300. # gusirq: The IRQ number of the Gravis Ultrasound. # Possible values: 5, 3, 7, 9, 10, 11, 12. # gusdma: The DMA channel of the Gravis Ultrasound. # Possible values: 3, 0, 1, 5, 6, 7. # ultradir: Path to Ultrasound directory. In this directory # there should be a MIDI directory that contains # the patch files for GUS playback. Patch sets used # with Timidity should work fine. gus=true gusrate=44100 gusbase=240 gusirq=5 gusdma=3 # Place GUS files in /storage/roms/dos/ULTRASND ultradir=C:\ULTRASND [speaker] # pcspeaker: Enable PC-Speaker emulation. # pcrate: Sample rate of the PC-Speaker sound generation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'. # Possible values: auto, on, off. # tandyrate: Sample rate of the Tandy 3-Voice generation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible). pcspeaker=true pcrate=44100 tandy=auto tandyrate=44100 disney=true [joystick] # joysticktype: Type of joystick to emulate: auto (default), none, # 2axis (supports two joysticks), # 4axis (supports one joystick, first joystick used), # 4axis_2 (supports one joystick, second joystick used), # fcs (Thrustmaster), ch (CH Flightstick). # none disables joystick emulation. # auto chooses emulation depending on real joystick(s). # (Remember to reset dosbox's mapperfile if you saved it earlier) # Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none. # timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away). # autofire: continuously fires as long as you keep the button pressed. # swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks. # buttonwrap: enable button wrapping at the number of emulated buttons. joysticktype=fcs timed=true autofire=false swap34=false buttonwrap=false [serial] # serial1: set type of device connected to com port. # Can be disabled, dummy, modem, nullmodem, directserial. # Additional parameters must be in the same line in the form of # parameter:value. Parameter for all types is irq (optional). # for directserial: realport (required), rxdelay (optional). # (realport:COM1 realport:ttyS0). # for modem: listenport (optional). # for nullmodem: server, rxdelay, txdelay, telnet, usedtr, # transparent, port, inhsocket (all optional). # Example: serial1=modem listenport:5000 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial2: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial3: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial4: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. serial1=dummy serial2=dummy serial3=disabled serial4=disabled [dos] # xms: Enable XMS support. # ems: Enable EMS support. The default (=true) provides the best # compatibility but certain applications may run better with # other choices, or require EMS support to be disabled (=false) # to work at all. # Possible values: true, emsboard, emm386, false. # umb: Enable UMB support. # keyboardlayout: Language code of the keyboard layout (or none). xms=true ems=true umb=true keyboardlayout=auto [ipx] # ipx: Enable ipx over UDP/IP emulation. ipx=false [autoexec] # Lines in this section will be run at startup. ================================================ FILE: packages/sx05re/emulators/dosbox-sdl2/config/dosbox-SVN.conf ================================================ # This is the configuration file for DOSBox SVN. (Please use the latest version of DOSBox) # Lines starting with a # are comment lines and are ignored by DOSBox. # They are used to (briefly) document the effect of each option. [sdl] # fullscreen: Start dosbox directly in fullscreen. (Press ALT-Enter to go back) # vsync: Sync to Vblank IF supported by the output device and renderer (if relevant). # It can reduce screen flickering, but it can also result in a slow DOSBox. # fullresolution: What resolution to use for fullscreen: original, desktop or a fixed size (e.g. 1024x768). # Using your monitor's native resolution with aspect=true might give the best results. # If you end up with small window on a large screen, try an output different from surface.On Windows 10 with display scaling (Scale and layout) set to a value above 100%, it is recommended # to use a lower full/windowresolution, in order to avoid window size problems. # windowresolution: Scale the window to this size IF the output device supports hardware scaling. # (output=surface does not!) # output: What video system to use for output. # Possible values: surface, texture, texturenb. # gl.shader: What set of GLSL shaders to use with an OpenGL output. Keep empty if this is not desired. # Note that in case it is used, the respective shader files must be found in the "shaders" subdirectory # relatively to where the default DOSBox configuration fiel is stored. For shader file naming convention, # suppose that you have a pair of shader files ready: mysample.vert and mysample.frag. # Then shader=mysample should be set. # # texture.renderer: Choose a renderer driver if output=texture or output=texturenb. Use output=auto for an automatic choice. # Possible values: auto, opengl, software. # autolock: Mouse will automatically lock, if you click on the screen. (Press CTRL-F10 to unlock) # sensitivity: Mouse sensitivity. The optional second parameter specifies vertical sensitivity (e.g. 100,-50). # waitonerror: Wait before closing the console if dosbox has an error. # priority: Priority levels for dosbox. Second entry behind the comma is for when dosbox is not focused/minimized. # pause is only valid for the second entry. # Possible values: lowest, lower, normal, higher, highest, pause. # mapperfile: File used to load/save the key/event mappings from. Resetmapper only works with the default value. fullscreen = true vsync = false fullresolution = 0x0 windowresolution = original output = texturenb gl.shader = texture.renderer = auto autolock = true sensitivity = 100 waitonerror = true priority = higher,normal mapperfile = mapper-sdl2-SVN.map [dosbox] # language: Select another language file. # machine: The type of machine DOSBox tries to emulate. # Possible values: hercules, cga, tandy, pcjr, ega, vgaonly, svga_s3, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe. # captures: Directory where things like wave, midi, screenshot get captured. # memsize: Amount of memory DOSBox has in megabytes. # This value is best left at its default to avoid problems with some games, # though few games might require a higher value. # There is generally no speed advantage when raising this value. language = machine = svga_s3 captures = capture memsize = 16 [render] # frameskip: How many frames DOSBox skips before drawing one. # aspect: Do aspect correction, if your output method doesn't support scaling this can slow things down! # scaler: Scaler used to enlarge/enhance low resolution modes. If 'forced' is appended, # then the scaler will be used even if the result might not be desired. # To fit a scaler in the resolution used at full screen may require a border or side bars, # to fill the screen entirely, depending on your hardware, a different scaler/fullresolution might work. # Possible values: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x. frameskip = 0 aspect = true scaler = none [cpu] # core: CPU Core used in emulation. auto will switch to dynamic if available and # appropriate. # Possible values: auto, dynamic, normal, simple. # cputype: CPU Type used in emulation. auto is the fastest choice. # Possible values: auto, 386, 386_slow, 486_slow, pentium_slow, 386_prefetch. # cycles: Amount of instructions DOSBox tries to emulate each millisecond. # Setting this value too high results in sound dropouts and lags. # Cycles can be set in 3 ways: # 'auto' tries to guess what a game needs. # It usually works, but can fail for certain games. # 'fixed #number' will set a fixed amount of cycles. This is what you usually # need if 'auto' fails (Example: fixed 4000). # 'max' will allocate as much cycles as your computer is able to # handle. # Possible values: auto, fixed, max. # cycleup: Amount of cycles to decrease/increase with keycombos.(CTRL-F11/CTRL-F12) # cycledown: Setting it lower than 100 will be a percentage. core = auto cputype = auto cycles = auto cycleup = 10 cycledown = 20 [mixer] # nosound: Enable silent mode, sound is still emulated though. # rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged. # Possible values: 1024, 2048, 4096, 8192, 512, 256. # prebuffer: How many milliseconds of data to keep on top of the blocksize. nosound = false rate = 44100 blocksize = 1024 prebuffer = 25 [midi] # mpu401: Type of MPU-401 to emulate. # Possible values: intelligent, uart, none. # mididevice: Device that will receive the MIDI data from MPU-401. # Possible values: default, win32, alsa, oss, coreaudio, coremidi, fluidsynth, mt32, none. # midiconfig: Special configuration options for the device driver. This is usually the id or part of the name of the device you want to use (find the id/name with mixer/listmidi). # Or in the case of coreaudio, you can specify a soundfont here. # When using a Roland MT-32 rev. 0 as midi output device, some games may require a delay in order to prevent 'buffer overflow' issues. # In that case, add 'delaysysex', for example: midiconfig=2 delaysysex # See the README/Manual for more details. # fluid.driver: Driver to use with Fluidsynth, not needed under Windows. Available drivers depend on what Fluidsynth was compiled with # Possible values: pulseaudio, alsa, oss, coreaudio, dsound, portaudio, sndman, jack, file, default. # fluid.soundfont: Soundfont to use with Fluidsynth. One must be specified. # fluid.samplerate: Sample rate to use with Fluidsynth. # fluid.gain: Fluidsynth gain. # fluid.polyphony: Fluidsynth polyphony. # fluid.cores: Fluidsynth CPU cores to use, default. # fluid.periods: Fluidsynth periods. # fluid.periodsize: Fluidsynth period size. # fluid.reverb: Fluidsynth use reverb. # Possible values: no, yes. # fluid.chorus: Fluidsynth use chorus. # Possible values: no, yes. # fluid.reverb,roomsize: Fluidsynth reverb room size. # fluid.reverb.damping: Fluidsynth reverb damping. # fluid.reverb.width: Fluidsynth reverb width. # fluid.reverb.level: Fluidsynth reverb level. # fluid.chorus.number: Fluidsynth chorus voices # fluid.chorus.level: Fluidsynth chorus level. # fluid.chorus.speed: Fluidsynth chorus speed. # fluid.chorus.depth: Fluidsynth chorus depth. # fluid.chorus.type: Fluidsynth chorus type. 0 is sine wave, 1 is triangle wave. # Possible values: 0, 1. # mt32.romdir: Name of the directory where MT-32 Control and PCM ROM files can be found. Emulation requires these files to work. # Accepted file names are as follows: # MT32_CONTROL.ROM or CM32L_CONTROL.ROM - control ROM file. # MT32_PCM.ROM or CM32L_PCM.ROM - PCM ROM file. # mt32.reverse.stereo: Reverse stereo channels for MT-32 output # mt32.verbose: MT-32 debug logging # mt32.thread: MT-32 rendering in separate thread # mt32.chunk: Minimum milliseconds of data to render at once. # Increasing this value reduces rendering overhead which may improve performance but also increases audio lag. # Valid for rendering in separate thread only. # Possible values: 2, 3, 16, 99, 100. # mt32.prebuffer: How many milliseconds of data to render ahead. # Increasing this value may help to avoid underruns but also increases audio lag. # Cannot be set less than or equal to mt32.chunk value. # Valid for rendering in separate thread only. # Possible values: 3, 4, 32, 199, 200. # mt32.partials: The maximum number of partials playing simultaneously. # Possible values: 8, 9, 32, 255, 256. # mt32.dac: MT-32 DAC input emulation mode # Nice = 0 - default # Produces samples at double the volume, without tricks. # Higher quality than the real devices # # Pure = 1 # Produces samples that exactly match the bits output from the emulated LA32. # Nicer overdrive characteristics than the DAC hacks (it simply clips samples within range) # Much less likely to overdrive than any other mode. # Half the volume of any of the other modes. # Perfect for developers while debugging :) # # GENERATION1 = 2 # Re-orders the LA32 output bits as in early generation MT-32s (according to Wikipedia). # Bit order at DAC (where each number represents the original LA32 output bit number, and XX means the bit is always low): # 15 13 12 11 10 09 08 07 06 05 04 03 02 01 00 XX # # GENERATION2 = 3 # Re-orders the LA32 output bits as in later generations (personally confirmed on my CM-32L - KG). # Bit order at DAC (where each number represents the original LA32 output bit number): # 15 13 12 11 10 09 08 07 06 05 04 03 02 01 00 14 # Possible values: 0, 1, 2, 3. # mt32.analog: MT-32 analogue output emulation mode # Digital = 0 # Only digital path is emulated. The output samples correspond to the digital output signal appeared at the DAC entrance. # Fastest mode. # # Coarse = 1 # Coarse emulation of LPF circuit. High frequencies are boosted, sample rate remains unchanged. # A bit better sounding but also a bit slower. # # Accurate = 2 - default # Finer emulation of LPF circuit. Output signal is upsampled to 48 kHz to allow emulation of audible mirror spectra above 16 kHz, # which is passed through the LPF circuit without significant attenuation. # Sounding is closer to the analog output from real hardware but also slower than the modes 0 and 1. # # Oversampled = 3 # Same as the default mode 2 but the output signal is 2x oversampled, i.e. the output sample rate is 96 kHz. # Even slower than all the other modes but better retains highest frequencies while further resampled in DOSBox mixer. # Possible values: 0, 1, 2, 3. # mt32.reverb.mode: MT-32 reverb mode # Possible values: 0, 1, 2, 3, auto. # mt32.reverb.time: MT-32 reverb decaying time # Possible values: 0, 1, 2, 3, 4, 5, 6, 7. # mt32.reverb.level: MT-32 reverb level # Possible values: 0, 1, 2, 3, 4, 5, 6, 7. mpu401 = intelligent # FluidSynth Software Synthesizer mididevice = fluidsynth fluid.driver = pulseaudio fluid.soundfont = /usr/share/soundfonts/GeneralUser.sf2 [sblaster] # sbtype: Type of Soundblaster to emulate. gb is Gameblaster. # Possible values: sb1, sb2, sbpro1, sbpro2, sb16, gb, none. # sbbase: The IO address of the soundblaster. # Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300. # irq: The IRQ number of the soundblaster. # Possible values: 7, 5, 3, 9, 10, 11, 12. # dma: The DMA number of the soundblaster. # Possible values: 1, 5, 0, 3, 6, 7. # hdma: The High DMA number of the soundblaster. # Possible values: 1, 5, 0, 3, 6, 7. # sbmixer: Allow the soundblaster mixer to modify the DOSBox mixer. # oplmode: Type of OPL emulation. On 'auto' the mode is determined by sblaster type. All OPL modes are Adlib-compatible, except for 'cms'. # Possible values: auto, cms, opl2, dualopl2, opl3, opl3gold, none. # oplemu: Provider for the OPL emulation. compat might provide better quality (see oplrate as well). # Possible values: default, compat, fast, mame. # oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly). # Possible values: 44100, 49716, 48000, 32000, 22050, 16000, 11025, 8000. sbtype = sb16 sbbase = 220 irq = 7 dma = 1 hdma = 5 sbmixer = true oplmode = auto oplemu = default oplrate = 44100 [gus] # gus: Enable the Gravis Ultrasound emulation. # gusrate: Sample rate of Ultrasound emulation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # gusbase: The IO base address of the Gravis Ultrasound. # Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300. # gusirq: The IRQ number of the Gravis Ultrasound. # Possible values: 5, 3, 7, 9, 10, 11, 12. # gusdma: The DMA channel of the Gravis Ultrasound. # Possible values: 3, 0, 1, 5, 6, 7. # ultradir: Path to Ultrasound directory. In this directory # there should be a MIDI directory that contains # the patch files for GUS playback. Patch sets used # with Timidity should work fine. gus = false gusrate = 44100 gusbase = 240 gusirq = 5 gusdma = 3 ultradir = C:\ULTRASND [speaker] # pcspeaker: Enable PC-Speaker emulation. # pcrate: Sample rate of the PC-Speaker sound generation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'. # Possible values: auto, on, off. # tandyrate: Sample rate of the Tandy 3-Voice generation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible). pcspeaker = true pcrate = 44100 tandy = auto tandyrate = 44100 disney = true [joystick] # joysticktype: Type of joystick to emulate: auto (default), none, # 2axis (supports two joysticks), # 4axis (supports one joystick, first joystick used), # 4axis_2 (supports one joystick, second joystick used), # fcs (Thrustmaster), ch (CH Flightstick). # none disables joystick emulation. # auto chooses emulation depending on real joystick(s). # (Remember to reset dosbox's mapperfile if you saved it earlier) # Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none. # timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away). # autofire: continuously fires as long as you keep the button pressed. # swap34: swap the 3rd and the 4th axis. Can be useful for certain joysticks. # buttonwrap: enable button wrapping at the number of emulated buttons. # circularinput: enable translation of circular input to square output. # Try enabling this if your left analog stick can only move in a circle. # deadzone: the percentage of motion to ignore. 100 turns the stick into a digital one. joysticktype = auto timed = true autofire = false swap34 = false buttonwrap = false circularinput = false deadzone = 10 [serial] # serial1: set type of device connected to com port. # Can be disabled, dummy, modem, nullmodem, directserial. # Additional parameters must be in the same line in the form of # parameter:value. Parameter for all types is irq (optional). # for directserial: realport (required), rxdelay (optional). # (realport:COM1 realport:ttyS0). # for modem: listenport (optional). # for nullmodem: server, rxdelay, txdelay, telnet, usedtr, # transparent, port, inhsocket (all optional). # Example: serial1=modem listenport:5000 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial2: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial3: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial4: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. serial1 = dummy serial2 = dummy serial3 = disabled serial4 = disabled [dos] # xms: Enable XMS support. # ems: Enable EMS support. The default (=true) provides the best # compatibility but certain applications may run better with # other choices, or require EMS support to be disabled (=false) # to work at all. # Possible values: true, emsboard, emm386, false. # umb: Enable UMB support. # keyboardlayout: Language code of the keyboard layout (or none). xms = true ems = true umb = true keyboardlayout = auto [ipx] # ipx: Enable ipx over UDP/IP emulation. ipx = false [autoexec] # Lines in this section will be run at startup. # You can put your MOUNT lines here. ================================================ FILE: packages/sx05re/emulators/dosbox-sdl2/config/games/+ Scan DOSBox Games.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2020-present Sylvia van Os (https://github.com/TheLastProject) EE_DEVICE=$(cat /ee_arch) source /usr/bin/env.sh rp_registerAllModules joy2keyStart function restart_confirm() { if dialog --ascii-lines --yesno "DOSBox scan completed, any found games will appear next time you restart Emulationstation, do you want to restart it now?" 22 76 >/dev/tty; then systemctl restart emustation fi if [ "${EE_DEVICE}" == "OdroidGoAdvance" ]; then killall kmscon fi } function create_launcher() { launcher_name="${1} (${2})" dos_dirname="${1:0:6}~1" mkdir -p "/storage/roms/pc/${launcher_name}" cp /storage/.config/dosbox/dosbox-SDL2.conf "/storage/roms/pc/${launcher_name}" echo "mount c /storage/roms/pcdata" >> "/storage/roms/pc/${launcher_name}/dosbox-SDL2.conf" echo "c:" >> "/storage/roms/pc/${launcher_name}/dosbox-SDL2.conf" echo "cd ${dos_dirname}" >> "/storage/roms/pc/${launcher_name}/dosbox-SDL2.conf" echo "${2}" >> "/storage/roms/pc/${launcher_name}/dosbox-SDL2.conf" echo "exit" >> "/storage/roms/pc/${launcher_name}/dosbox-SDL2.conf" touch "/storage/roms/pc/${launcher_name}/${launcher_name}.bat" } for data_dir in /storage/roms/pcdata/*; do if [ -d "${data_dir}" ]; then for executable in $(find "${data_dir}" -iname "*.exe"); do executable_case="$(basename ${executable} | tr '[:lower:]' '[:upper:]')" case "${executable_case}" in "SETUP.EXE" | "INSTALL.EXE" | "INSTALLER.EXE") ;; *) create_launcher "$(basename ${data_dir})" "$(basename ${executable})" ;; esac done fi done restart_confirm ================================================ FILE: packages/sx05re/emulators/dosbox-sdl2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Frank Hartung (supervisedthinking (@) gmail.com) PKG_NAME="dosbox-sdl2" PKG_VERSION="0dd982477bff268c10558004dd1671e183b1a10f" PKG_SHA256="2737817cd45889b21a4cef1e5fbd0782ffb5972f29bd3eaf7c3b8cc99cd9bac0" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/moralrecordings/dosbox" PKG_URL="https://github.com/moralrecordings/dosbox/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux glibc glib systemd dbus alsa-lib SDL2 SDL2_net SDL_sound libpng zlib libvorbis flac libogg fluidsynth-git munt" PKG_LONGDESC="This is an enhanced fork of DOSBox. It is currently in sync with revision 4156." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+lto" pre_configure_target() { if [ ${ARCH} == "arm" ]; then EE_ARCH="armv7l" else EE_ARCH=${ARCH} fi # Clean up build directory cd ${PKG_BUILD} rm -rf .${TARGET_NAME} PKG_CONFIGURE_OPTS_TARGET="--prefix=/usr \ --enable-core-inline \ --enable-dynrec \ --enable-unaligned_memory \ --with-sdl-prefix=${SYSROOT_PREFIX}/usr" PKG_CONFIGURE_OPTS_TARGET+=" --host=${EE_ARCH}" } pre_make_target() { # Define DOSBox version sed -e "s/SVN/SDL2/" -i ${PKG_BUILD}/config.h } post_makeinstall_target() { # Create config directory & install config mkdir -p ${INSTALL}/usr/config/dosbox cp -a ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin/ cp -a ${PKG_DIR}/config/* ${INSTALL}/usr/config/dosbox/ } ================================================ FILE: packages/sx05re/emulators/dosbox-sdl2/patches/dosbox-sdl2.995.01-add-mt32emu-MIDI-device.patch ================================================ diff --git b/configure.ac a/configure.ac index f393457e41..b14d3e9ad3 100644 --- b/configure.ac +++ a/configure.ac @@ -421,6 +421,16 @@ if test x$have_wordexp_h = xyes ; then AC_DEFINE(C_WORDEXP,1) fi +AH_TEMPLATE(C_MUNT,[define to 1 if you have munt lib]) +AC_CHECK_LIB(mt32emu, main, have_mt32emu_lib=yes, have_mt32emu_lib=no, ) +if test x$have_mt32emu_lib = xyes ; then + LIBS="$LIBS -lmt32emu" + AC_DEFINE(C_MUNT,1) + AC_MSG_RESULT(yes) +else + AC_MSG_WARN([Can't find munt, Roland MIDI device emulation disabled.]) +fi + AH_TEMPLATE(C_OPENGL,[Define to 1 to use opengl display output support]) AC_CHECK_LIB(GL, main, have_gl_lib=yes, have_gl_lib=no , ) AC_CHECK_LIB(opengl32, main, have_opengl32_lib=yes,have_opengl32_lib=no , ) diff --git b/src/dosbox.cpp a/src/dosbox.cpp index 485f6a7958..18688a8e00 100644 --- b/src/dosbox.cpp +++ a/src/dosbox.cpp @@ -500,6 +500,9 @@ void DOSBOX_Init(void) { "coremidi", #ifdef C_FLUIDSYNTH "fluidsynth", +#endif +#ifdef C_MUNT + "mt32", #endif "none", 0 @@ -587,6 +590,10 @@ void DOSBOX_Init(void) { Pint->Set_help("Fluidsynth chorus type. 0 is sine wave, 1 is triangle wave."); #endif +#ifdef C_MUNT +#include "mt32options.h" +#endif + #if C_DEBUG secprop=control->AddSection_prop("debug",&DEBUG_Init); #endif diff --git b/src/gui/Makefile.am a/src/gui/Makefile.am index 3fed5e68ae..eb994d86b8 100644 --- b/src/gui/Makefile.am +++ a/src/gui/Makefile.am @@ -7,5 +7,6 @@ libgui_a_SOURCES = sdlmain.cpp sdl_mapper.cpp dosbox_logo.h \ render_templates_sai.h render_templates_hq.h \ render_templates_hq2x.h render_templates_hq3x.h \ midi.cpp midi_win32.h midi_oss.h midi_coreaudio.h midi_alsa.h \ - midi_coremidi.h sdl_gui.cpp dosbox_splash.h + midi_coremidi.h midi_mt32.h midi_mt32.cpp sdl_gui.cpp \ + dosbox_splash.h diff --git b/src/gui/midi.cpp a/src/gui/midi.cpp index 16cdae2cb5..bed8b7f6bd 100644 --- b/src/gui/midi.cpp +++ a/src/gui/midi.cpp @@ -95,6 +95,11 @@ MidiHandler Midi_none; #endif +#ifdef C_MUNT +#include "midi_mt32.h" +static MidiHandler_mt32 &Midi_mt32 = MidiHandler_mt32::GetInstance(); +#endif + DB_Midi midi; void MIDI_RawOutByte(Bit8u data) { diff --git b/src/gui/midi_mt32.cpp a/src/gui/midi_mt32.cpp new file mode 100644 index 0000000000..d7beafba0b --- /dev/null +++ a/src/gui/midi_mt32.cpp @@ -0,0 +1,283 @@ +#include "config.h" +#ifdef C_MUNT + +#include "SDL_thread.h" +#include "SDL_endian.h" +#include "control.h" + +#ifndef DOSBOX_MIDI_H +#include "midi.h" +#endif + +#ifdef C_WORDEXP +#include +#endif + +#include "midi_mt32.h" + +static const Bitu MILLIS_PER_SECOND = 1000; + +MidiHandler_mt32 &MidiHandler_mt32::GetInstance() { + static MidiHandler_mt32 midiHandler_mt32; + return midiHandler_mt32; +} + +const char *MidiHandler_mt32::GetName(void) { + return "mt32"; +} + +bool MidiHandler_mt32::Open(const char *conf) { + Section_prop *section = static_cast(control->GetSection("midi")); + const char *romDir = section->Get_string("mt32.romdir"); + if (romDir == NULL) romDir = "./"; // Paranoid NULL-check, should never happen + size_t romDirLen = strlen(romDir); + bool addPathSeparator = false; + if (romDirLen < 1) { + romDir = "./"; + } else if (4080 < romDirLen) { + LOG_MSG("MT32: mt32.romdir is too long, using the current dir."); + romDir = "./"; + } else { + char lastChar = romDir[strlen(romDir) - 1]; + addPathSeparator = lastChar != '/' && lastChar != '\\'; + } + + char pathName[4096]; + MT32Emu::FileStream controlROMFile; + MT32Emu::FileStream pcmROMFile; + + makeROMPathName(pathName, romDir, "CM32L_CONTROL.ROM", addPathSeparator); + if (!controlROMFile.open(pathName)) { + makeROMPathName(pathName, romDir, "MT32_CONTROL.ROM", addPathSeparator); + if (!controlROMFile.open(pathName)) { + LOG_MSG("MT32: Control ROM file not found"); + return false; + } + } + makeROMPathName(pathName, romDir, "CM32L_PCM.ROM", addPathSeparator); + if (!pcmROMFile.open(pathName)) { + makeROMPathName(pathName, romDir, "MT32_PCM.ROM", addPathSeparator); + if (!pcmROMFile.open(pathName)) { + LOG_MSG("MT32: PCM ROM file not found"); + return false; + } + } + const MT32Emu::ROMImage *controlROMImage = MT32Emu::ROMImage::makeROMImage(&controlROMFile); + const MT32Emu::ROMImage *pcmROMImage = MT32Emu::ROMImage::makeROMImage(&pcmROMFile); + + MT32Emu::AnalogOutputMode analogOutputMode = (MT32Emu::AnalogOutputMode)section->Get_int("mt32.analog"); + + synth = new MT32Emu::Synth(&reportHandler); + if (!synth->open(*controlROMImage, *pcmROMImage, section->Get_int("mt32.partials"), analogOutputMode)) { + delete synth; + synth = NULL; + LOG_MSG("MT32: Error initialising emulation"); + return false; + } + MT32Emu::ROMImage::freeROMImage(controlROMImage); + MT32Emu::ROMImage::freeROMImage(pcmROMImage); + + if (strcmp(section->Get_string("mt32.reverb.mode"), "auto") != 0) { + Bit8u reverbsysex[] = {0x10, 0x00, 0x01, 0x00, 0x05, 0x03}; + reverbsysex[3] = (Bit8u)atoi(section->Get_string("mt32.reverb.mode")); + reverbsysex[4] = (Bit8u)section->Get_int("mt32.reverb.time"); + reverbsysex[5] = (Bit8u)section->Get_int("mt32.reverb.level"); + synth->writeSysex(16, reverbsysex, 6); + synth->setReverbOverridden(true); + } + + synth->setDACInputMode((MT32Emu::DACInputMode)section->Get_int("mt32.dac")); + + synth->setReversedStereoEnabled(section->Get_bool("mt32.reverse.stereo")); + noise = section->Get_bool("mt32.verbose"); + renderInThread = section->Get_bool("mt32.thread"); + + if (noise) LOG_MSG("MT32: Set maximum number of partials %d", synth->getPartialCount()); + if (noise) LOG_MSG("MT32: Adding mixer channel at sample rate %d", synth->getStereoOutputSampleRate()); + chan = MIXER_AddChannel(mixerCallBack, synth->getStereoOutputSampleRate(), "MT32"); + if (renderInThread) { + stopProcessing = false; + playPos = 0; + sampleRateRatio = MT32Emu::SAMPLE_RATE / (double)synth->getStereoOutputSampleRate(); + int chunkSize = section->Get_int("mt32.chunk"); + minimumRenderFrames = (chunkSize * synth->getStereoOutputSampleRate()) / MILLIS_PER_SECOND; + int latency = section->Get_int("mt32.prebuffer"); + if (latency <= chunkSize) { + latency = 2 * chunkSize; + LOG_MSG("MT32: chunk length must be less than prebuffer length, prebuffer length reset to %i ms.", latency); + } + framesPerAudioBuffer = (latency * synth->getStereoOutputSampleRate()) / MILLIS_PER_SECOND; + audioBufferSize = framesPerAudioBuffer << 1; + audioBuffer = new Bit16s[audioBufferSize]; + synth->render(audioBuffer, framesPerAudioBuffer - 1); + renderPos = (framesPerAudioBuffer - 1) << 1; + playedBuffers = 1; + lock = SDL_CreateMutex(); + framesInBufferChanged = SDL_CreateCond(); + thread = SDL_CreateThread(processingThread, NULL, NULL); + } + chan->Enable(true); + + open = true; + return true; +} + +void MidiHandler_mt32::Close(void) { + if (!open) return; + chan->Enable(false); + if (renderInThread) { + stopProcessing = true; + SDL_LockMutex(lock); + SDL_CondSignal(framesInBufferChanged); + SDL_UnlockMutex(lock); + SDL_WaitThread(thread, NULL); + thread = NULL; + SDL_DestroyMutex(lock); + lock = NULL; + SDL_DestroyCond(framesInBufferChanged); + framesInBufferChanged = NULL; + delete[] audioBuffer; + audioBuffer = NULL; + } + MIXER_DelChannel(chan); + chan = NULL; + synth->close(); + delete synth; + synth = NULL; + open = false; +} + +void MidiHandler_mt32::PlayMsg(Bit8u *msg) { + if (renderInThread) { + synth->playMsg(SDL_SwapLE32(*(Bit32u *)msg), getMidiEventTimestamp()); + } else { + synth->playMsg(SDL_SwapLE32(*(Bit32u *)msg)); + } +} + +void MidiHandler_mt32::PlaySysex(Bit8u *sysex, Bitu len) { + if (renderInThread) { + synth->playSysex(sysex, len, getMidiEventTimestamp()); + } else { + synth->playSysex(sysex, len); + } +} + +void MidiHandler_mt32::mixerCallBack(Bitu len) { + MidiHandler_mt32::GetInstance().handleMixerCallBack(len); +} + +int MidiHandler_mt32::processingThread(void *) { + MidiHandler_mt32::GetInstance().renderingLoop(); + return 0; +} + +void MidiHandler_mt32::makeROMPathName(char pathName[], const char romDir[], const char fileName[], bool addPathSeparator) { + +#ifdef C_WORDEXP + wordexp_t p; + wordexp(romDir, &p, 0); + strcpy(pathName, p.we_wordv[0]); + wordfree(&p); +#else + strcpy(pathName, romDir); +#endif + + if (addPathSeparator) { + strcat(pathName, "/"); + } + strcat(pathName, fileName); +} + +MidiHandler_mt32::MidiHandler_mt32() : open(false), chan(NULL), synth(NULL), thread(NULL) { +} + +MidiHandler_mt32::~MidiHandler_mt32() { + Close(); +} + +void MidiHandler_mt32::handleMixerCallBack(Bitu len) { + if (renderInThread) { + while (renderPos == playPos) { + SDL_LockMutex(lock); + SDL_CondWait(framesInBufferChanged, lock); + SDL_UnlockMutex(lock); + if (stopProcessing) return; + } + Bitu renderPosSnap = renderPos; + Bitu playPosSnap = playPos; + Bitu samplesReady = (renderPosSnap < playPosSnap) ? audioBufferSize - playPosSnap : renderPosSnap - playPosSnap; + if (len > (samplesReady >> 1)) { + len = samplesReady >> 1; + } + chan->AddSamples_s16(len, audioBuffer + playPosSnap); + playPosSnap += (len << 1); + while (audioBufferSize <= playPosSnap) { + playPosSnap -= audioBufferSize; + playedBuffers++; + } + playPos = playPosSnap; + renderPosSnap = renderPos; + const Bitu samplesFree = (renderPosSnap < playPosSnap) ? playPosSnap - renderPosSnap : audioBufferSize + playPosSnap - renderPosSnap; + if (minimumRenderFrames <= (samplesFree >> 1)) { + SDL_LockMutex(lock); + SDL_CondSignal(framesInBufferChanged); + SDL_UnlockMutex(lock); + } + } else { + synth->render((Bit16s *)MixTemp, len); + chan->AddSamples_s16(len, (Bit16s *)MixTemp); + } +} + +void MidiHandler_mt32::renderingLoop() { + while (!stopProcessing) { + const Bitu renderPosSnap = renderPos; + const Bitu playPosSnap = playPos; + Bitu samplesToRender; + if (renderPosSnap < playPosSnap) { + samplesToRender = playPosSnap - renderPosSnap - 2; + } else { + samplesToRender = audioBufferSize - renderPosSnap; + if (playPosSnap == 0) samplesToRender -= 2; + } + Bitu framesToRender = samplesToRender >> 1; + if ((framesToRender == 0) || ((framesToRender < minimumRenderFrames) && (renderPosSnap < playPosSnap))) { + SDL_LockMutex(lock); + SDL_CondWait(framesInBufferChanged, lock); + SDL_UnlockMutex(lock); + } else { + synth->render(audioBuffer + renderPosSnap, framesToRender); + renderPos = (renderPosSnap + samplesToRender) % audioBufferSize; + if (renderPosSnap == playPos) { + SDL_LockMutex(lock); + SDL_CondSignal(framesInBufferChanged); + SDL_UnlockMutex(lock); + } + } + } +} + +void MidiHandler_mt32::MT32ReportHandler::onErrorControlROM() { + LOG_MSG("MT32: Couldn't open Control ROM file"); +} + +void MidiHandler_mt32::MT32ReportHandler::onErrorPCMROM() { + LOG_MSG("MT32: Couldn't open PCM ROM file"); +} + +void MidiHandler_mt32::MT32ReportHandler::showLCDMessage(const char *message) { + LOG_MSG("MT32: LCD-Message: %s", message); +} + +void MidiHandler_mt32::MT32ReportHandler::printDebug(const char *fmt, va_list list) { + MidiHandler_mt32 &midiHandler_mt32 = MidiHandler_mt32::GetInstance(); + if (midiHandler_mt32.noise) { + char s[1024]; + strcpy(s, "MT32: "); + vsnprintf(s + 6, 1017, fmt, list); + LOG_MSG(s); + } +} + +#endif // C_MUNT diff --git b/src/gui/midi_mt32.h a/src/gui/midi_mt32.h new file mode 100644 index 0000000000..5ceabe7400 --- /dev/null +++ a/src/gui/midi_mt32.h @@ -0,0 +1,57 @@ +#ifndef DOSBOX_MIDI_MT32_H +#define DOSBOX_MIDI_MT32_H + +#include "mixer.h" +#include + +struct SDL_Thread; + +class MidiHandler_mt32 : public MidiHandler { +public: + static MidiHandler_mt32 &GetInstance(void); + + const char *GetName(void); + bool Open(const char *conf); + void Close(void); + void PlayMsg(Bit8u *msg); + void PlaySysex(Bit8u *sysex, Bitu len); + +private: + MixerChannel *chan; + MT32Emu::Synth *synth; + SDL_Thread *thread; + SDL_mutex *lock; + SDL_cond *framesInBufferChanged; + Bit16s *audioBuffer; + Bitu audioBufferSize; + Bitu framesPerAudioBuffer; + Bitu minimumRenderFrames; + double sampleRateRatio; + volatile Bitu renderPos, playPos, playedBuffers; + volatile bool stopProcessing; + bool open, noise, renderInThread; + + class MT32ReportHandler : public MT32Emu::ReportHandler { + protected: + virtual void onErrorControlROM(); + virtual void onErrorPCMROM(); + virtual void showLCDMessage(const char *message); + virtual void printDebug(const char *fmt, va_list list); + } reportHandler; + + static void mixerCallBack(Bitu len); + static int processingThread(void *); + static void makeROMPathName(char pathName[], const char romDir[], const char fileName[], bool addPathSeparator); + + MidiHandler_mt32(); + ~MidiHandler_mt32(); + + Bit32u inline getMidiEventTimestamp() { + return Bit32u((playedBuffers * framesPerAudioBuffer + (playPos >> 1)) * sampleRateRatio); + } + + void handleMixerCallBack(Bitu len); + void renderingLoop(); +}; + +#endif /* DOSBOX_MIDI_MT32_H */ diff --git b/src/mt32options.h a/src/mt32options.h new file mode 100644 index 0000000000..85082157a8 --- /dev/null +++ a/src/mt32options.h @@ -0,0 +1,98 @@ +Pstring = secprop->Add_string("mt32.romdir",Property::Changeable::WhenIdle,""); +Pstring->Set_help("Name of the directory where MT-32 Control and PCM ROM files can be found. Emulation requires these files to work.\n" + " Accepted file names are as follows:\n" + " MT32_CONTROL.ROM or CM32L_CONTROL.ROM - control ROM file.\n" + " MT32_PCM.ROM or CM32L_PCM.ROM - PCM ROM file."); + +Pbool = secprop->Add_bool("mt32.reverse.stereo",Property::Changeable::WhenIdle,false); +Pbool->Set_help("Reverse stereo channels for MT-32 output"); + +Pbool = secprop->Add_bool("mt32.verbose",Property::Changeable::WhenIdle,false); +Pbool->Set_help("MT-32 debug logging"); + +Pbool = secprop->Add_bool("mt32.thread",Property::Changeable::WhenIdle,false); +Pbool->Set_help("MT-32 rendering in separate thread"); + +const char *mt32chunk[] = {"2", "3", "16", "99", "100",0}; +Pint = secprop->Add_int("mt32.chunk",Property::Changeable::WhenIdle,16); +Pint->Set_values(mt32chunk); +Pint->SetMinMax(2,100); +Pint->Set_help("Minimum milliseconds of data to render at once.\n" + "Increasing this value reduces rendering overhead which may improve performance but also increases audio lag.\n" + "Valid for rendering in separate thread only."); + +const char *mt32prebuffer[] = {"3", "4", "32", "199", "200",0}; +Pint = secprop->Add_int("mt32.prebuffer",Property::Changeable::WhenIdle,32); +Pint->Set_values(mt32prebuffer); +Pint->SetMinMax(3,200); +Pint->Set_help("How many milliseconds of data to render ahead.\n" + "Increasing this value may help to avoid underruns but also increases audio lag.\n" + "Cannot be set less than or equal to mt32.chunk value.\n" + "Valid for rendering in separate thread only."); + +const char *mt32partials[] = {"8", "9", "32", "255", "256",0}; +Pint = secprop->Add_int("mt32.partials",Property::Changeable::WhenIdle,32); +Pint->Set_values(mt32partials); +Pint->SetMinMax(8,256); +Pint->Set_help("The maximum number of partials playing simultaneously."); + +const char *mt32DACModes[] = {"0", "1", "2", "3",0}; +Pint = secprop->Add_int("mt32.dac",Property::Changeable::WhenIdle,0); +Pint->Set_values(mt32DACModes); +Pint->Set_help("MT-32 DAC input emulation mode\n" + "Nice = 0 - default\n" + "Produces samples at double the volume, without tricks.\n" + "Higher quality than the real devices\n\n" + + "Pure = 1\n" + "Produces samples that exactly match the bits output from the emulated LA32.\n" + "Nicer overdrive characteristics than the DAC hacks (it simply clips samples within range)\n" + "Much less likely to overdrive than any other mode.\n" + "Half the volume of any of the other modes.\n" + "Perfect for developers while debugging :)\n\n" + + "GENERATION1 = 2\n" + "Re-orders the LA32 output bits as in early generation MT-32s (according to Wikipedia).\n" + "Bit order at DAC (where each number represents the original LA32 output bit number, and XX means the bit is always low):\n" + "15 13 12 11 10 09 08 07 06 05 04 03 02 01 00 XX\n\n" + + "GENERATION2 = 3\n" + "Re-orders the LA32 output bits as in later generations (personally confirmed on my CM-32L - KG).\n" + "Bit order at DAC (where each number represents the original LA32 output bit number):\n" + "15 13 12 11 10 09 08 07 06 05 04 03 02 01 00 14"); + +const char *mt32analogModes[] = {"0", "1", "2", "3",0}; +Pint = secprop->Add_int("mt32.analog",Property::Changeable::WhenIdle,2); +Pint->Set_values(mt32analogModes); +Pint->Set_help("MT-32 analogue output emulation mode\n" + "Digital = 0\n" + "Only digital path is emulated. The output samples correspond to the digital output signal appeared at the DAC entrance.\n" + "Fastest mode.\n\n" + + "Coarse = 1\n" + "Coarse emulation of LPF circuit. High frequencies are boosted, sample rate remains unchanged.\n" + "A bit better sounding but also a bit slower.\n\n" + + "Accurate = 2 - default\n" + "Finer emulation of LPF circuit. Output signal is upsampled to 48 kHz to allow emulation of audible mirror spectra above 16 kHz,\n" + "which is passed through the LPF circuit without significant attenuation.\n" + "Sounding is closer to the analog output from real hardware but also slower than the modes 0 and 1.\n\n" + + "Oversampled = 3\n" + "Same as the default mode 2 but the output signal is 2x oversampled, i.e. the output sample rate is 96 kHz.\n" + "Even slower than all the other modes but better retains highest frequencies while further resampled in DOSBox mixer."); + +const char *mt32reverbModes[] = {"0", "1", "2", "3", "auto",0}; +Pstring = secprop->Add_string("mt32.reverb.mode",Property::Changeable::WhenIdle,"auto"); +Pstring->Set_values(mt32reverbModes); +Pstring->Set_help("MT-32 reverb mode"); + +const char *mt32reverbTimes[] = {"0", "1", "2", "3", "4", "5", "6", "7",0}; +Pint = secprop->Add_int("mt32.reverb.time",Property::Changeable::WhenIdle,5); +Pint->Set_values(mt32reverbTimes); +Pint->Set_help("MT-32 reverb decaying time"); + +const char *mt32reverbLevels[] = {"0", "1", "2", "3", "4", "5", "6", "7",0}; +Pint = secprop->Add_int("mt32.reverb.level",Property::Changeable::WhenIdle,3); +Pint->Set_values(mt32reverbLevels); +Pint->Set_help("MT-32 reverb level"); ================================================ FILE: packages/sx05re/emulators/dosbox-sdl2/scripts/dosbox.start ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Frank Hartung (supervisedthinking (@) gmail.com) # Source predefined functions and variables . /etc/profile set_audio pulseaudio # Set common variables RR_DOSBOX_HOME=/storage/.dosbox RR_DOSBOX_HOME_CONFIG=/storage/.config/dosbox # Create symlink to config dir if [ ! -L ${RR_DOSBOX_HOME} ]; then if [ -d ${RR_DOSBOX_HOME} ]; then cp -rf ${RR_DOSBOX_HOME} ${RR_DOSBOX_HOME_CONFIG} rm -rf ${RR_DOSBOX_HOME} fi ln -sf ${RR_DOSBOX_HOME_CONFIG} ${RR_DOSBOX_HOME} fi # Run the emulator dosbox "$@" > /emuelec/logs/dosbox.log 2>&1 set_audio default ================================================ FILE: packages/sx05re/emulators/dosbox-staging/config/dosbox-staging.conf ================================================ # This is the configuration file for dosbox-staging (0.79.0). # Lines starting with a '#' character are comments. [sdl] # fullscreen: Start directly in fullscreen. # Run INTRO and see Special Keys for window control hotkeys. # display: Number of display to use; values depend on OS and user settings. # fullresolution: What resolution to use for fullscreen: 'original', 'desktop' # or a fixed size (e.g. 1024x768). # windowresolution: Set window size when running in windowed mode: # default: Select the best option based on your # environment and other settings. # small, medium, or large (or s, m, l): # Size the window relative to the desktop. # : Scale the window to the given dimensions in # WxH format. For example: 1024x768. # Scaling is not performed for output=surface. # viewport_resolution: Set the viewport size (drawable area) within the window/screen: # fit: Fit the viewport to the available window/screen (default). # : Limit the viewport within to a custom resolution or percentage of # the desktop. Specified in WxH, N%, N.M%. Examples: 960x720 or 50% # window_position: Set initial window position when running in windowed mode: # auto: Let the window manager decide the position. # : Set window position in X,Y format. For example: 250,100 # 0,0 is the top-left corner of the screen. # window_decorations: Controls whether to display window decorations in windowed mode. # transparency: Set the transparency of the DOSBox Staging screen. # From 0 (no transparency) to 90 (high transparency). # host_rate: Set the host's refresh rate: # auto: Use SDI rates, or VRR rates when fullscreen on a high-refresh display. # sdi: Use serial device interface (SDI) rates, without further adjustment. # vrr: Deduct 3 Hz from the reported rate (best-practice for VRR displays). # : Specify a custom rate as a whole or decimal value greater than 23.000. # vsync: Synchronize with display refresh rate if supported. This can # reduce flickering and tearing, but may also impact performance. # vsync_skip: Number of microseconds to allow rendering to block before skipping the next frame. 0 disables this and will always render. # presentation_mode: Optionally select the frame presentation mode: # auto: Intelligently time and drop frames to prevent # emulation stalls, based on host and DOS frame rates. # cfr: Always present DOS frames at a constant frame rate. # vfr: Always present changed DOS frames at a variable frame rate. # Possible values: auto, cfr, vfr. # output: What video system to use for output. # Possible values: surface, texture, texturenb, texturepp. # texture_renderer: Choose a renderer driver when using a texture output mode. # Use texture_renderer=auto for an automatic choice. # Possible values: auto, opengles2, software. # capture_mouse: Choose a mouse control method: # onclick: Capture the mouse when clicking any button in the window. # onstart: Capture the mouse immediately on start. # seamless: Let the mouse move seamlessly; captures only with middle-click or hotkey. # nomouse: Hide the mouse and don't send input to the game. # Choose how middle-clicks are handled (second parameter): # middlegame: Middle-clicks are sent to the game. # middlerelease: Middle-click will release the captured mouse, and also capture when seamless. # Defaults (if not present or incorrect): seamless middlerelease # Possible values: seamless, onclick, onstart, nomouse. # sensitivity: Mouse sensitivity. The optional second parameter specifies vertical sensitivity (e.g. 100,-50). # raw_mouse_input: Enable this setting to bypass your operating system's mouse # acceleration and sensitivity settings. This works in # fullscreen or when the mouse is captured in window mode. # waitonerror: Wait before closing the console if dosbox has an error. # priority: Priority levels for dosbox. Second entry behind the comma is for when dosbox is not focused/minimized. # pause is only valid for the second entry. auto disables priority levels and uses OS defaults # Possible values: auto, lowest, lower, normal, higher, highest, pause. # mapperfile: File used to load/save the key/event mappings from. # Resetmapper only works with the default value. # screensaver: Use 'allow' or 'block' to override the SDL_VIDEO_ALLOW_SCREENSAVER # environment variable (which usually blocks the OS screensaver # while the emulator is running). # Possible values: auto, allow, block. fullscreen = true display = 0 fullresolution = desktop windowresolution = default viewport_resolution = fit window_position = auto window_decorations = true transparency = 0 host_rate = auto vsync = false vsync_skip = 7000 presentation_mode = auto output = texture texture_renderer = auto capture_mouse = seamless middlerelease sensitivity = 100 raw_mouse_input = false waitonerror = true priority = auto,auto mapperfile = mapper-sdl2-0.79.0.map screensaver = auto [dosbox] # language: Select a language to use: de, en, es, fr, it, pl, and ru # Notes: This setting will override the 'LANG' environment, if set. # The 'resources/translations' directory bundled with the executable holds # these files. Please keep it along-side the executable to support this feature. # machine: The type of machine DOSBox tries to emulate. # Possible values: hercules, cga, cga_mono, tandy, pcjr, ega, vgaonly, svga_s3, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe. # captures: Directory where things like wave, midi, screenshot get captured. # memsize: Amount of memory DOSBox has in megabytes. # This value is best left at its default to avoid problems with some games, # though few games might require a higher value. # There is generally no speed advantage when raising this value. # vmemsize: Video memory in MiB (1-8) or KiB (256 to 8192). 'auto' uses the default per video adapter. # Possible values: auto, 1, 2, 4, 8, 256, 512, 1024, 2048, 4096, 8192. # dos_rate: Customize the emulated video mode's frame rate, in Hz: # default: The DOS video mode determines the rate (recommended). # host: Match the DOS rate to the host rate (see 'host_rate' setting). # : Sets the rate to an exact value, between 24.000 and 1000.000 (Hz). # We recommend the 'default' rate; otherwise test and set on a per-game basis. # vesa_modes: Controls the selection of VESA 1.2 and 2.0 modes offered: # compatible A tailored selection that maximizes game compatibility. # This is recommended along with 4 or 8 MB of video memory. # all Offers all modes for a given video memory size, however # some games may not use them properly (flickering) or may need # more system memory (mem = ) to use them. # Possible values: compatible, all. # speed_mods: Permit changes known to improve performance. Currently no games are known # to be affected by this. Please file a bug with the project if you find a # game that fails when this is set to true so we will list them here. # autoexec_section: How autoexec sections are handled from multiple config files. # join : combines them into one big section (legacy behavior). # overwrite : use the last one encountered, like other conf settings. # Possible values: join, overwrite. # startup_verbosity: Controls verbosity prior to displaying the program: # Verbosity | Splash | Welcome | Early stdout # high | yes | yes | yes # medium | no | yes | yes # low | no | no | yes # quiet | no | no | no # splash_only | yes | no | no # auto | 'low' if exec or dir is passed, otherwise 'high' # Possible values: auto, high, medium, low, splash_only, quiet. language = machine = svga_s3 captures = capture memsize = 16 vmemsize = auto dos_rate = default vesa_modes = compatible speed_mods = true autoexec_section = join startup_verbosity = auto [render] # frameskip: How many frames DOSBox skips before drawing one. # aspect: Scales the vertical resolution to produce a 4:3 display aspect # ratio, matching that of the original standard-definition monitors # for which the majority of DOS games were designed. This setting # only affects video modes that use non-square pixels, such as # 320x200 or 640x400; where as square-pixel modes, such as 640x480 # and 800x600, will be displayed as-is. # monochrome_palette: Select default palette for monochrome display. # Works only when emulating hercules or cga_mono. # You can also cycle through available colours using F11. # Possible values: white, paperwhite, green, amber. # scaler: Scaler used to enlarge/enhance low resolution modes. # If 'forced' is appended, then the scaler will be used even if # the result might not be desired. # Note that some scalers may use black borders to fit the image # within your configured display resolution. If this is # undesirable, try either a different scaler or enabling # fullresolution output. # Possible values: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x. frameskip = 0 aspect = true monochrome_palette = white scaler = none [composite] # composite: Enable composite mode on start. 'auto' lets the program decide. # Note: Fine-tune the settings below (ie: hue) using the composite hotkeys. # Then read the new settings from your console and enter them here. # Possible values: auto, on, off. # era: Era of composite technology. When 'auto', PCjr uses new and CGA/Tandy use old. # Possible values: auto, old, new. # hue: Appearance of RGB palette. For example, adjust until sky is blue. # saturation: Intensity of colors, from washed out to vivid. # contrast: Ratio between the dark and light area. # brightness: Luminosity of the image, from dark to light. # convergence: Convergence of subpixel elements, from blurry to sharp (CGA and Tandy-only). composite = auto era = auto hue = 0 saturation = 100 contrast = 100 brightness = 0 convergence = 0 [cpu] # core: CPU Core used in emulation. auto will switch to dynamic if available and # appropriate. # Possible values: auto, dynamic, normal, simple. # cputype: CPU Type used in emulation. auto is the fastest choice. # Possible values: auto, 386, 386_slow, 486_slow, pentium_slow, 386_prefetch. # cycles: Number of instructions DOSBox tries to emulate each millisecond. # Setting this value too high results in sound dropouts and lags. # Cycles can be set in 3 ways: # 'auto' tries to guess what a game needs. # It usually works, but can fail for certain games. # 'fixed #number' will set a fixed number of cycles. This is what you usually # need if 'auto' fails (Example: fixed 4000). # 'max' will allocate as much cycles as your computer is able to # handle. # Possible values: auto, fixed, max. # cycleup: Number of cycles added or subtracted with speed control hotkeys. # Run INTRO and see Special Keys for list of hotkeys. # cycledown: Setting it lower than 100 will be a percentage. core = auto cputype = auto cycles = auto cycleup = 10 cycledown = 20 [mixer] # nosound: Enable silent mode, sound is still emulated though. # rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged. # Possible values: 1024, 2048, 4096, 8192, 512, 256, 128. # prebuffer: How many milliseconds of data to keep on top of the blocksize. # negotiate: Let the system audio driver negotiate (possibly) better rate and blocksize settings. nosound = false rate = 48000 blocksize = 512 prebuffer = 20 negotiate = true [midi] # mididevice: Device that will receive the MIDI data (from the emulated MIDI # interface - MPU-401). Choose one of the following: # 'fluidsynth', to use the built-in MIDI synthesizer. See the # [fluidsynth] section for detailed configuration. # 'mt32', to use the built-in Roland MT-32 synthesizer. # See the [mt32] section for detailed configuration. # 'auto', to use the first working external MIDI player. This # might be a software synthesizer or physical device. # Possible values: auto, oss, alsa, fluidsynth, mt32, none. # midiconfig: Configuration options for the selected MIDI interface. # This is usually the id or name of the MIDI synthesizer you want # to use (find the id/name with DOS command 'mixer /listmidi'). # - This option has no effect when using the built-in synthesizers # (mididevice = fluidsynth or mt32). # - When using ALSA, use Linux command 'aconnect -l' to list open # MIDI ports, and select one (for example 'midiconfig=14:0' # for sequencer client 14, port 0). # - If you're using a physical Roland MT-32 with revision 0 PCB, # the hardware may require a delay in order to prevent its # buffer from overflowing. In that case, add 'delaysysex', # for example: 'midiconfig=2 delaysysex'. # See the README/Manual for more details. # mpu401: Type of MPU-401 to emulate. # Possible values: intelligent, uart, none. mididevice = auto midiconfig = mpu401 = intelligent [fluidsynth] # soundfont: Path to a SoundFont file in .sf2 format. You can use an # absolute or relative path, or the name of an .sf2 inside # the 'soundfonts' directory within your DOSBox configuration # directory. # An optional percentage will scale the SoundFont's volume. # For example: 'soundfont.sf2 50' will attenuate it by 50 percent. # The scaling percentage can range from 1 to 500. # chorus: Chorus effect: 'auto', 'on', 'off', or custom values. # When using custom values: # All five must be provided in-order and space-separated. # They are: voice-count level speed depth modulation-wave, where: # - voice-count is an integer from 0 to 99. # - level is a decimal from 0.0 to 10.0 # - speed is a decimal, measured in Hz, from 0.1 to 5.0 # - depth is a decimal from 0.0 to 21.0 # - modulation-wave is either 'sine' or 'triangle' # For example: chorus = 3 1.2 0.3 8.0 sine # reverb: Reverb effect: 'auto', 'on', 'off', or custom values. # When using custom values: # All four must be provided in-order and space-separated. # They are: room-size damping width level, where: # - room-size is a decimal from 0.0 to 1.0 # - damping is a decimal from 0.0 to 1.0 # - width is a decimal from 0.0 to 100.0 # - level is a decimal from 0.0 to 1.0 # For example: reverb = 0.61 0.23 0.76 0.56 soundfont = default.sf2 chorus = auto reverb = auto [mt32] # model: Model of synthesizer to use. # 'auto' picks the first model with available ROMs, in order as listed. # 'cm32l' and 'mt32' pick the first model of their type, in the order listed. # 'mt32_old' and 'mt32_new' are aliases for 1.07 and 2.04, respectively. # Possible values: auto, cm32l, cm32l_102, cm32l_100, mt32, mt32_old, mt32_107, mt32_106, mt32_105, mt32_104, mt32_bluer, mt32_new, mt32_204. # romdir: The directory containing ROMs for one or more models. # The directory can be absolute or relative, or leave it blank to # use the 'mt32-roms' directory in your DOSBox configuration # directory. Other common system locations will be checked as well. # ROM files inside this directory may include any of the following: # - MT32_CONTROL.ROM and MT32_PCM.ROM, for the 'mt32' model. # - CM32L_CONTROL.ROM and CM32L_PCM.ROM, for the 'cm32l' model. # - Unzipped MAME MT-32 and CM-32L ROMs, for the versioned models. model = auto romdir = [sblaster] # sbtype: Type of Sound Blaster to emulate. 'gb' is Game Blaster. # Possible values: sb1, sb2, sbpro1, sbpro2, sb16, gb, none. # sbbase: The IO address of the Sound Blaster. # Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300. # irq: The IRQ number of the Sound Blaster. # Possible values: 7, 5, 3, 9, 10, 11, 12. # dma: The DMA number of the Sound Blaster. # Possible values: 1, 5, 0, 3, 6, 7. # hdma: The High DMA number of the Sound Blaster. # Possible values: 1, 5, 0, 3, 6, 7. # sbmixer: Allow the Sound Blaster mixer to modify the DOSBox mixer. # sbwarmup: Silence initial DMA audio after card power-on, in milliseconds. # This mitigates pops heard when starting many SB-based games. # Reduce this if you notice intial playback is missing audio. # oplmode: Type of OPL emulation. On 'auto' the mode is determined by 'sbtype'. # All OPL modes are AdLib-compatible, except for 'cms'. # Possible values: auto, cms, opl2, dualopl2, opl3, opl3gold, none. # oplemu: Provider for the OPL emulation. 'compat' provides better quality, # 'nuked' is the default and most accurate (but the most CPU-intensive). # Possible values: default, compat, fast, mame, nuked. sbtype = sb16 sbbase = 220 irq = 7 dma = 1 hdma = 5 sbmixer = true sbwarmup = 100 oplmode = auto oplemu = default [gus] # gus: Enable Gravis UltraSound emulation. # gusbase: The IO base address of the Gravis UltraSound. # Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300. # gusirq: The IRQ number of the Gravis UltraSound. # Possible values: 5, 3, 7, 9, 10, 11, 12. # gusdma: The DMA channel of the Gravis UltraSound. # Possible values: 3, 0, 1, 5, 6, 7. # ultradir: Path to UltraSound directory. In this directory # there should be a MIDI directory that contains # the patch files for GUS playback. Patch sets used # with Timidity should work fine. gus = false gusbase = 240 gusirq = 5 gusdma = 3 ultradir = C:\ULTRASND [innovation] # sidmodel: Model of chip to emulate in the Innovation SSI-2001 card: # - auto: Selects the 6581 chip. # - 6581: The original chip, known for its bassy and rich character. # - 8580: A later revision that more closely matched the SID specification. # It fixed the 6581's DC bias and is less prone to distortion. # The 8580 is an option on reproduction cards, like the DuoSID. # - none: Disables the card. # Possible values: auto, 6581, 8580, none. # sidclock: The SID chip's clock frequency, which is jumperable on reproduction cards. # - default: uses 0.895 MHz, per the original SSI-2001 card. # - c64ntsc: uses 1.023 MHz, per NTSC Commodore PCs and the DuoSID. # - c64pal: uses 0.985 MHz, per PAL Commodore PCs and the DuoSID. # - hardsid: uses 1.000 MHz, available on the DuoSID. # Possible values: default, c64ntsc, c64pal, hardsid. # sidport: The IO port address of the Innovation SSI-2001. # Possible values: 240, 260, 280, 2a0, 2c0. # 6581filter: The SID's analog filtering meant that each chip was physically unique. # Adjusts the 6581's filtering strength as a percent from 0 to 100. # 8580filter: Adjusts the 8580's filtering strength as a percent from 0 to 100. sidmodel = none sidclock = default sidport = 280 6581filter = 50 8580filter = 50 [speaker] # pcspeaker: Enable PC-Speaker emulation. # pcrate: Sample rate of the PC-Speaker sound generation. # zero_offset: Neutralizes and prevents the PC speaker's DC-offset from harming other sources. # 'auto' enables this for non-Windows systems and disables it on Windows. # If your OS performs its own DC-offset correction, then set this to 'false'. # Possible values: auto, true, false. # tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'. # Possible values: auto, on, off. # tandyrate: Sample rate of the Tandy 3-Voice generation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible). # ps1audio: Enable IBM PS/1 Audio emulation. pcspeaker = true pcrate = 18939 zero_offset = auto tandy = auto tandyrate = 44100 disney = true ps1audio = false [joystick] # joysticktype: Type of joystick to emulate: auto (default), # auto : Detect and use any joystick(s), if possible., # 2axis : Support up to two joysticks. # 4axis : Support the first joystick only. # 4axis_2 : Support the second joystick only. # fcs : Support a Thrustmaster-type joystick. # ch : Support a CH Flightstick-type joystick. # hidden : Prevent DOS from seeing the joystick(s), but enable them for mapping. # disabled : Fully disable joysticks: won't be polled, mapped, or visible in DOS. # (Remember to reset DOSBox's mapperfile if you saved it earlier) # Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, hidden, disabled. # timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away). # autofire: continuously fires as long as you keep the button pressed. # swap34: swap the 3rd and the 4th axis. Can be useful for certain joysticks. # buttonwrap: enable button wrapping at the number of emulated buttons. # circularinput: enable translation of circular input to square output. # Try enabling this if your left analog stick can only move in a circle. # deadzone: the percentage of motion to ignore. 100 turns the stick into a digital one. joysticktype = auto timed = true autofire = false swap34 = false buttonwrap = false circularinput = false deadzone = 10 [serial] # serial1: set type of device connected to com port. # Can be disabled, dummy, modem, nullmodem, directserial. # Additional parameters must be in the same line in the form of # parameter:value. Parameter for all types is irq (optional). # for directserial: realport (required), rxdelay (optional). # (realport:COM1 realport:ttyS0). # for modem: listenport sock (all optional). # for nullmodem: server, rxdelay, txdelay, telnet, usedtr, # transparent, port, inhsocket, sock (all optional). # SOCK parameter specifies the protocol to be used by both sides # of the conection. 0 for TCP and 1 for ENet reliable UDP. # Example: serial1=modem listenport:5000 sock:1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial2: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial3: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial4: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # phonebookfile: File used to map fake phone numbers to addresses. serial1 = dummy serial2 = dummy serial3 = disabled serial4 = disabled phonebookfile = phonebook.txt [dos] # xms: Enable XMS support. # ems: Enable EMS support. The default (=true) provides the best # compatibility but certain applications may run better with # other choices, or require EMS support to be disabled (=false) # to work at all. # Possible values: true, emsboard, emm386, false. # umb: Enable UMB support. # ver: Set DOS version (5.0 by default). Specify as major.minor format. # A single number is treated as the major version. # Common settings are 3.3, 5.0, 6.22, and 7.1. # country: Set DOS country code which will affect country-specific # information such as date, time, and decimal formats. # If set to 0, the country code corresponding to the # selected keyboard layout will be used. # keyboardlayout: Language code of the keyboard layout (or none). xms = true ems = true umb = true ver = 5.0 country = 0 keyboardlayout = auto [ipx] # ipx: Enable ipx over UDP/IP emulation. ipx = false [ethernet] # ne2000: Enable emulation of a Novell NE2000 network card on a software-based # network (using libslirp) with properties as follows: # - 255.255.255.0 : Subnet mask of the 10.0.2.0 virtual LAN. # - 10.0.2.2 : IP of the gateway and DHCP service. # - 10.0.2.3 : IP of the virtual DNS server. # - 10.0.2.15 : First IP provided by DHCP, your IP! # Note: Inside DOS, setting this up requires an NE2000 packet driver, # DHCP client, and TCP/IP stack. You might need port-forwarding # from the host into the DOS guest, and from your router to your # host when acting as the server for multiplayer games. # nicbase: The base address of the NE2000 card. # Note: Addresses 220 and 240 might not be available as they're assigned # to the Sound Blaster and Gravis UltraSound by default. # Possible values: 200, 220, 240, 260, 280, 2c0, 300, 320, 340, 360. # nicirq: The interrupt used by the NE2000 card. # Note: IRQs 3 and 5 might not be available as they're assigned # to 'serial2' and the Gravis UltraSound by default. # Possible values: 3, 4, 5, 9, 10, 11, 12, 14, 15. # macaddr: The MAC address of the NE2000 card. # tcp_port_forwards: Forwards one or more TCP ports from the host into the DOS guest. # The format is: # port1 port2 port3 ... (e.g., 21 80 443) # This will forward FTP, HTTP, and HTTPS into the DOS guest. # If the ports are privileged on the host, a mapping can be used # host:guest ..., (e.g., 8021:21 8080:80) # This will forward ports 8021 and 8080 to FTP and HTTP in the guest # A range of adjacent ports can be abbreviated with a dash: # start-end ... (e.g., 27910-27960) # This will forward ports 27910 to 27960 into the DOS guest. # Mappings and ranges can be combined, too: # hstart-hend:gstart-gend ..., (e.g, 8040-8080:20-60) # This forwards ports 8040 to 8080 into 20 to 60 in the guest # Notes: # - If mapped ranges differ, the shorter range is extended to fit. # - If conflicting host ports are given, only the first one is setup. # - If conflicting guest ports are given, the latter rule takes precedent. # udp_port_forwards: Forwards one or more UDP ports from the host into the DOS guest. # The format is the same as for TCP port forwards. ne2000 = true nicbase = 300 nicirq = 3 macaddr = AC:DE:48:88:99:AA tcp_port_forwards = udp_port_forwards = [autoexec] # Lines in this section will be run at startup. # You can put your MOUNT lines here. ================================================ FILE: packages/sx05re/emulators/dosbox-staging/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="dosbox-staging" PKG_VERSION="3f67c91dd6a998cc091f24d2200e2b99cf37fb18" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/dosbox-staging/dosbox-staging" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain linux meson:host glibc glib systemd dbus alsa-lib SDL2 SDL2_net SDL_sound libpng zlib libvorbis flac libogg fluidsynth-git munt opusfile" PKG_LONGDESC="DOS/x86 emulator focusing on ease of use " PKG_BUILD_FLAGS="+lto" ## For some reason my build PC needs this to download fluidsynth # sudo apt install ca-certificates # sudo update-ca-certificates --fresh ## And this to locate them export SSL_CERT_DIR=/etc/ssl/certs pre_configure_target() { PKG_MESON_OPTS_TARGET=" -Duse_opengl=false" sed -i "s|C_MANYMOUSE') == true)|C_MANYMOUSE') == false)|" ${PKG_BUILD}/meson.build sed -i "s|C_MANYMOUSE', true)|C_MANYMOUSE', false)|" ${PKG_BUILD}/meson.build } post_makeinstall_target () { mkdir -p ${INSTALL}/usr/config/dosbox cp -a ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin/ cp -a ${PKG_DIR}/config/* ${INSTALL}/usr/config/dosbox/ cp -a ${PKG_BUILD}/contrib/resources/* ${INSTALL}/usr/config/dosbox/ rm -rf ${INSTALL}/usr/share find ${INSTALL}/usr/config/dosbox -name "meson.build" -exec rm -rf {} \; } ================================================ FILE: packages/sx05re/emulators/dosbox-staging/scripts/dosbox.start ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Frank Hartung (supervisedthinking (@) gmail.com) # Source predefined functions and variables . /etc/profile set_audio pulseaudio # Set common variables RR_DOSBOX_HOME=/storage/.dosbox RR_DOSBOX_HOME_CONFIG=/storage/.config/dosbox # Create symlink to config dir if [ ! -L ${RR_DOSBOX_HOME} ]; then if [ -d ${RR_DOSBOX_HOME} ]; then cp -rf ${RR_DOSBOX_HOME} ${RR_DOSBOX_HOME_CONFIG} rm -rf ${RR_DOSBOX_HOME} fi ln -sf ${RR_DOSBOX_HOME_CONFIG} ${RR_DOSBOX_HOME} fi # Run the emulator dosbox "$@" > /emuelec/logs/dosbox.log 2>&1 set_audio default ================================================ FILE: packages/sx05re/emulators/dosbox-x/config/dosbox-x-SDL2-MT32.conf ================================================ # This is the configuration file for DOSBox SDL2. (Please use the latest version of DOSBox) # Lines starting with a # are comment lines and are ignored by DOSBox. # They are used to (briefly) document the effect of each option. [sdl] # fullscreen: Start dosbox directly in fullscreen. (Press ALT-Enter to go back) # vsync: Sync to Vblank IF supported by the output device and renderer (if relevant). # It can reduce screen flickering, but it can also result in a slow DOSBox. # fullresolution: What resolution to use for fullscreen: original, desktop or a fixed size (e.g. 1024x768). # Using your monitor's native resolution with aspect=true might give the best results. # If you end up with small window on a large screen, try an output different from surface. # windowresolution: Scale the window to this size IF the output device supports hardware scaling. # (output=surface does not!) # output: What video system to use for output. # Possible values: surface, texture, texturenb, opengl, openglnb. # gl.shader: What set of GLSL shaders to use with an OpenGL output. Keep empty if this is not desired. # Note that in case it is used, the respective shader files must be found in the "shaders" subdirectory # relatively to where the default DOSBox configuration fiel is stored. For shader file naming convention, # suppose that you have a pair of shader files ready: mysample.vert and mysample.frag. # Then shader=mysample should be set. # # texture.renderer: Choose a renderer driver if output=texture or output=texturenb. Use output=auto for an automatic choice. # Possible values: auto, opengl, software. # autolock: Mouse will automatically lock, if you click on the screen. (Press CTRL-F10 to unlock) # sensitivity: Mouse sensitivity. # waitonerror: Wait before closing the console if dosbox has an error. # priority: Priority levels for dosbox. Second entry behind the comma is for when dosbox is not focused/minimized. # pause is only valid for the second entry. # Possible values: lowest, lower, normal, higher, highest, pause. # mapperfile: File used to load/save the key/event mappings from. Resetmapper only works with the default value. fullscreen=true # Note that VSYNC is be very demanding vsync=false fullresolution=0x0 windowresolution=original output=texture # Place shaders in /storage/.config/dosbox/shaders gl.shader=crt-easymode texture.renderer=auto autolock=true sensitivity=100 waitonerror=true priority=highest,highest # Input mapper file is looked for in the same directory as the specified conf mapperfile=example.map [dosbox] # language: Select another language file. # machine: The type of machine DOSBox tries to emulate. # Possible values: hercules, cga, tandy, pcjr, ega, vgaonly, svga_s3, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe. # captures: Directory where things like wave, midi, screenshot get captured. # memsize: Amount of memory DOSBox has in megabytes. # This value is best left at its default to avoid problems with some games, # though few games might require a higher value. # There is generally no speed advantage when raising this value. language= machine=svga_s3 captures=capture memsize=16 [render] # frameskip: How many frames DOSBox skips before drawing one. # aspect: Do aspect correction, if your output method doesn't support scaling this can slow things down!. # scaler: Scaler used to enlarge/enhance low resolution modes. If 'forced' is appended, # then the scaler will be used even if the result might not be desired. # Possible values: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x. frameskip=0 aspect=true scaler=none [cpu] # core: CPU Core used in emulation. auto will switch to dynamic if available and # appropriate. # Possible values: auto, dynamic, normal, simple. # cputype: CPU Type used in emulation. auto is the fastest choice. # Possible values: auto, 386, 386_slow, 486_slow, pentium_slow, 386_prefetch. # cycles: Amount of instructions DOSBox tries to emulate each millisecond. # Setting this value too high results in sound dropouts and lags. # Cycles can be set in 3 ways: # 'auto' tries to guess what a game needs. # It usually works, but can fail for certain games. # 'fixed #number' will set a fixed amount of cycles. This is what you usually # need if 'auto' fails (Example: fixed 4000). # 'max' will allocate as much cycles as your computer is able to # handle. # Possible values: auto, fixed, max. # cycleup: Amount of cycles to decrease/increase with keycombos.(CTRL-F11/CTRL-F12) # cycledown: Setting it lower than 100 will be a percentage. core=auto cputype=auto cycles=auto cycleup=10 cycledown=20 [mixer] # nosound: Enable silent mode, sound is still emulated though. # rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged. # Possible values: 1024, 2048, 4096, 8192, 512, 256. # prebuffer: How many milliseconds of data to keep on top of the blocksize. nosound=false rate=44100 blocksize=1024 prebuffer=20 [midi] # mpu401: Type of MPU-401 to emulate. # Possible values: intelligent, uart, none. # mididevice: Device that will receive the MIDI data from MPU-401. # Possible values: default, win32, alsa, oss, coreaudio, coremidi, mt32, none. # midiconfig: Special configuration options for the device driver. This is usually the id of the device you want to use. # or in the case of coreaudio, you can specify a soundfont here. # When using a Roland MT-32 rev. 0 as midi output device, some games may require a delay in order to prevent 'buffer overflow' issues. # In that case, add 'delaysysex', for example: midiconfig=2 delaysysex # See the README/Manual for more details. # mt32.romdir: Name of the directory where MT-32 Control and PCM ROM files can be found. Emulation requires these files to work. # Accepted file names are as follows: # MT32_CONTROL.ROM or CM32L_CONTROL.ROM - control ROM file. # MT32_PCM.ROM or CM32L_PCM.ROM - PCM ROM file. # mt32.reverse.stereo: Reverse stereo channels for MT-32 output # mt32.verbose: MT-32 debug logging # mt32.thread: MT-32 rendering in separate thread # mt32.chunk: Minimum milliseconds of data to render at once. # Increasing this value reduces rendering overhead which may improve performance but also increases audio lag. # Valid for rendering in separate thread only. # Possible values: 2, 3, 16, 99, 100. # mt32.prebuffer: How many milliseconds of data to render ahead. # Increasing this value may help to avoid underruns but also increases audio lag. # Cannot be set less than or equal to mt32.chunk value. # Valid for rendering in separate thread only. # Possible values: 3, 4, 32, 199, 200. # mt32.partials: The maximum number of partials playing simultaneously. # Possible values: 8, 9, 32, 255, 256. # mt32.dac: MT-32 DAC input emulation mode # Nice = 0 - default # Produces samples at double the volume, without tricks. # Higher quality than the real devices # # Pure = 1 # Produces samples that exactly match the bits output from the emulated LA32. # Nicer overdrive characteristics than the DAC hacks (it simply clips samples within range) # Much less likely to overdrive than any other mode. # Half the volume of any of the other modes. # Perfect for developers while debugging :) # # GENERATION1 = 2 # Re-orders the LA32 output bits as in early generation MT-32s (according to Wikipedia). # Bit order at DAC (where each number represents the original LA32 output bit number, and XX means the bit is always low): # 15 13 12 11 10 09 08 07 06 05 04 03 02 01 00 XX # # GENERATION2 = 3 # Re-orders the LA32 output bits as in later generations (personally confirmed on my CM-32L - KG). # Bit order at DAC (where each number represents the original LA32 output bit number): # 15 13 12 11 10 09 08 07 06 05 04 03 02 01 00 14 # Possible values: 0, 1, 2, 3. # mt32.analog: MT-32 analogue output emulation mode # Digital = 0 # Only digital path is emulated. The output samples correspond to the digital output signal appeared at the DAC entrance. # Fastest mode. # # Coarse = 1 # Coarse emulation of LPF circuit. High frequencies are boosted, sample rate remains unchanged. # A bit better sounding but also a bit slower. # # Accurate = 2 - default # Finer emulation of LPF circuit. Output signal is upsampled to 48 kHz to allow emulation of audible mirror spectra above 16 kHz, # which is passed through the LPF circuit without significant attenuation. # Sounding is closer to the analog output from real hardware but also slower than the modes 0 and 1. # # Oversampled = 3 # Same as the default mode 2 but the output signal is 2x oversampled, i.e. the output sample rate is 96 kHz. # Even slower than all the other modes but better retains highest frequencies while further resampled in DOSBox mixer. # Possible values: 0, 1, 2, 3. # mt32.reverb.mode: MT-32 reverb mode # Possible values: 0, 1, 2, 3, auto. # mt32.reverb.time: MT-32 reverb decaying time # Possible values: 0, 1, 2, 3, 4, 5, 6, 7. # mt32.reverb.level: MT-32 reverb level # Possible values: 0, 1, 2, 3, 4, 5, 6, 7. mpu401=intelligent mididevice=mt32 midiconfig= # Place MT-32 roms here mt32.romdir=/storage/roms/bios mt32.reverse.stereo=false mt32.verbose=false mt32.thread=false mt32.chunk=16 mt32.prebuffer=32 mt32.partials=32 mt32.dac=0 mt32.analog=2 mt32.reverb.mode=auto mt32.reverb.time=5 mt32.reverb.level=3 [sblaster] # sbtype: Type of Soundblaster to emulate. gb is Gameblaster. # Possible values: sb1, sb2, sbpro1, sbpro2, sb16, gb, none. # sbbase: The IO address of the soundblaster. # Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300. # irq: The IRQ number of the soundblaster. # Possible values: 7, 5, 3, 9, 10, 11, 12. # dma: The DMA number of the soundblaster. # Possible values: 1, 5, 0, 3, 6, 7. # hdma: The High DMA number of the soundblaster. # Possible values: 1, 5, 0, 3, 6, 7. # sbmixer: Allow the soundblaster mixer to modify the DOSBox mixer. # oplmode: Type of OPL emulation. On 'auto' the mode is determined by sblaster type. All OPL modes are Adlib-compatible, except for 'cms'. # Possible values: auto, cms, opl2, dualopl2, opl3, opl3gold, none. # oplemu: Provider for the OPL emulation. compat might provide better quality (see oplrate as well). # Possible values: default, compat, fast. # oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly). # Possible values: 44100, 49716, 48000, 32000, 22050, 16000, 11025, 8000. sbtype=sb16 sbbase=220 irq=7 dma=1 hdma=5 sbmixer=true oplmode=auto oplemu=default oplrate=44100 [gus] # gus: Enable the Gravis Ultrasound emulation. # gusrate: Sample rate of Ultrasound emulation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # gusbase: The IO base address of the Gravis Ultrasound. # Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300. # gusirq: The IRQ number of the Gravis Ultrasound. # Possible values: 5, 3, 7, 9, 10, 11, 12. # gusdma: The DMA channel of the Gravis Ultrasound. # Possible values: 3, 0, 1, 5, 6, 7. # ultradir: Path to Ultrasound directory. In this directory # there should be a MIDI directory that contains # the patch files for GUS playback. Patch sets used # with Timidity should work fine. gus=true gusrate=44100 gusbase=240 gusirq=5 gusdma=3 # Place GUS files in /storage/roms/dos/ULTRASND ultradir=C:\ULTRASND [speaker] # pcspeaker: Enable PC-Speaker emulation. # pcrate: Sample rate of the PC-Speaker sound generation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'. # Possible values: auto, on, off. # tandyrate: Sample rate of the Tandy 3-Voice generation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible). pcspeaker=true pcrate=44100 tandy=auto tandyrate=44100 disney=true [joystick] # joysticktype: Type of joystick to emulate: auto (default), none, # 2axis (supports two joysticks), # 4axis (supports one joystick, first joystick used), # 4axis_2 (supports one joystick, second joystick used), # fcs (Thrustmaster), ch (CH Flightstick). # none disables joystick emulation. # auto chooses emulation depending on real joystick(s). # (Remember to reset dosbox's mapperfile if you saved it earlier) # Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none. # timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away). # autofire: continuously fires as long as you keep the button pressed. # swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks. # buttonwrap: enable button wrapping at the number of emulated buttons. joysticktype=fcs timed=true autofire=false swap34=false buttonwrap=false [serial] # serial1: set type of device connected to com port. # Can be disabled, dummy, modem, nullmodem, directserial. # Additional parameters must be in the same line in the form of # parameter:value. Parameter for all types is irq (optional). # for directserial: realport (required), rxdelay (optional). # (realport:COM1 realport:ttyS0). # for modem: listenport (optional). # for nullmodem: server, rxdelay, txdelay, telnet, usedtr, # transparent, port, inhsocket (all optional). # Example: serial1=modem listenport:5000 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial2: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial3: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial4: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. serial1=dummy serial2=dummy serial3=disabled serial4=disabled [dos] # xms: Enable XMS support. # ems: Enable EMS support. The default (=true) provides the best # compatibility but certain applications may run better with # other choices, or require EMS support to be disabled (=false) # to work at all. # Possible values: true, emsboard, emm386, false. # umb: Enable UMB support. # keyboardlayout: Language code of the keyboard layout (or none). xms=true ems=true umb=true keyboardlayout=auto [ipx] # ipx: Enable ipx over UDP/IP emulation. ipx=false [autoexec] # Lines in this section will be run at startup. mount c /storage/roms/dos c: cd example example.exe #exit ================================================ FILE: packages/sx05re/emulators/dosbox-x/config/dosbox-x-SDL2.conf ================================================ # This is the configuration file for DOSBox SDL2. (Please use the latest version of DOSBox) # Lines starting with a # are comment lines and are ignored by DOSBox. # They are used to (briefly) document the effect of each option. [sdl] # fullscreen: Start dosbox directly in fullscreen. (Press ALT-Enter to go back) # vsync: Sync to Vblank IF supported by the output device and renderer (if relevant). # It can reduce screen flickering, but it can also result in a slow DOSBox. # fullresolution: What resolution to use for fullscreen: original, desktop or a fixed size (e.g. 1024x768). # Using your monitor's native resolution with aspect=true might give the best results. # If you end up with small window on a large screen, try an output different from surface. # windowresolution: Scale the window to this size IF the output device supports hardware scaling. # (output=surface does not!) # output: What video system to use for output. # Possible values: surface, texture, texturenb, opengl, openglnb. # gl.shader: What set of GLSL shaders to use with an OpenGL output. Keep empty if this is not desired. # Note that in case it is used, the respective shader files must be found in the "shaders" subdirectory # relatively to where the default DOSBox configuration fiel is stored. For shader file naming convention, # suppose that you have a pair of shader files ready: mysample.vert and mysample.frag. # Then shader=mysample should be set. # # texture.renderer: Choose a renderer driver if output=texture or output=texturenb. Use output=auto for an automatic choice. # Possible values: auto, opengl, software. # autolock: Mouse will automatically lock, if you click on the screen. (Press CTRL-F10 to unlock) # sensitivity: Mouse sensitivity. # waitonerror: Wait before closing the console if dosbox has an error. # priority: Priority levels for dosbox. Second entry behind the comma is for when dosbox is not focused/minimized. # pause is only valid for the second entry. # Possible values: lowest, lower, normal, higher, highest, pause. # mapperfile: File used to load/save the key/event mappings from. Resetmapper only works with the default value. fullscreen=true # Note that VSYNC is be very demanding vsync=false fullresolution=0x0 windowresolution=original output=texture # Place shaders in /storage/.config/dosbox/shaders gl.shader=crt-easymode texture.renderer=auto autolock=true sensitivity=100 waitonerror=true priority=highest,highest # Input mapper file is looked for in the same directory as the specified conf mapperfile=example.map [dosbox] # language: Select another language file. # machine: The type of machine DOSBox tries to emulate. # Possible values: hercules, cga, tandy, pcjr, ega, vgaonly, svga_s3, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe. # captures: Directory where things like wave, midi, screenshot get captured. # memsize: Amount of memory DOSBox has in megabytes. # This value is best left at its default to avoid problems with some games, # though few games might require a higher value. # There is generally no speed advantage when raising this value. language= machine=svga_s3 captures=capture memsize=16 [render] # frameskip: How many frames DOSBox skips before drawing one. # aspect: Do aspect correction, if your output method doesn't support scaling this can slow things down!. # scaler: Scaler used to enlarge/enhance low resolution modes. If 'forced' is appended, # then the scaler will be used even if the result might not be desired. # Possible values: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x. frameskip=0 aspect=true scaler=none [cpu] # core: CPU Core used in emulation. auto will switch to dynamic if available and # appropriate. # Possible values: auto, dynamic, normal, simple. # cputype: CPU Type used in emulation. auto is the fastest choice. # Possible values: auto, 386, 386_slow, 486_slow, pentium_slow, 386_prefetch. # cycles: Amount of instructions DOSBox tries to emulate each millisecond. # Setting this value too high results in sound dropouts and lags. # Cycles can be set in 3 ways: # 'auto' tries to guess what a game needs. # It usually works, but can fail for certain games. # 'fixed #number' will set a fixed amount of cycles. This is what you usually # need if 'auto' fails (Example: fixed 4000). # 'max' will allocate as much cycles as your computer is able to # handle. # Possible values: auto, fixed, max. # cycleup: Amount of cycles to decrease/increase with keycombos.(CTRL-F11/CTRL-F12) # cycledown: Setting it lower than 100 will be a percentage. core=auto cputype=auto cycles=auto cycleup=10 cycledown=20 [mixer] # nosound: Enable silent mode, sound is still emulated though. # rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged. # Possible values: 1024, 2048, 4096, 8192, 512, 256. # prebuffer: How many milliseconds of data to keep on top of the blocksize. nosound=false rate=44100 blocksize=1024 prebuffer=20 [midi] # mpu401: Type of MPU-401 to emulate. # Possible values: intelligent, uart, none. # mididevice: Device that will receive the MIDI data from MPU-401. # Possible values: default, win32, alsa, oss, coreaudio, coremidi, mt32, none. # midiconfig: Special configuration options for the device driver. This is usually the id of the device you want to use. # or in the case of coreaudio, you can specify a soundfont here. # When using a Roland MT-32 rev. 0 as midi output device, some games may require a delay in order to prevent 'buffer overflow' issues. # In that case, add 'delaysysex', for example: midiconfig=2 delaysysex # See the README/Manual for more details. # mt32.romdir: Name of the directory where MT-32 Control and PCM ROM files can be found. Emulation requires these files to work. # Accepted file names are as follows: # MT32_CONTROL.ROM or CM32L_CONTROL.ROM - control ROM file. # MT32_PCM.ROM or CM32L_PCM.ROM - PCM ROM file. # mt32.reverse.stereo: Reverse stereo channels for MT-32 output # mt32.verbose: MT-32 debug logging # mt32.thread: MT-32 rendering in separate thread # mt32.chunk: Minimum milliseconds of data to render at once. # Increasing this value reduces rendering overhead which may improve performance but also increases audio lag. # Valid for rendering in separate thread only. # Possible values: 2, 3, 16, 99, 100. # mt32.prebuffer: How many milliseconds of data to render ahead. # Increasing this value may help to avoid underruns but also increases audio lag. # Cannot be set less than or equal to mt32.chunk value. # Valid for rendering in separate thread only. # Possible values: 3, 4, 32, 199, 200. # mt32.partials: The maximum number of partials playing simultaneously. # Possible values: 8, 9, 32, 255, 256. # mt32.dac: MT-32 DAC input emulation mode # Nice = 0 - default # Produces samples at double the volume, without tricks. # Higher quality than the real devices # # Pure = 1 # Produces samples that exactly match the bits output from the emulated LA32. # Nicer overdrive characteristics than the DAC hacks (it simply clips samples within range) # Much less likely to overdrive than any other mode. # Half the volume of any of the other modes. # Perfect for developers while debugging :) # # GENERATION1 = 2 # Re-orders the LA32 output bits as in early generation MT-32s (according to Wikipedia). # Bit order at DAC (where each number represents the original LA32 output bit number, and XX means the bit is always low): # 15 13 12 11 10 09 08 07 06 05 04 03 02 01 00 XX # # GENERATION2 = 3 # Re-orders the LA32 output bits as in later generations (personally confirmed on my CM-32L - KG). # Bit order at DAC (where each number represents the original LA32 output bit number): # 15 13 12 11 10 09 08 07 06 05 04 03 02 01 00 14 # Possible values: 0, 1, 2, 3. # mt32.analog: MT-32 analogue output emulation mode # Digital = 0 # Only digital path is emulated. The output samples correspond to the digital output signal appeared at the DAC entrance. # Fastest mode. # # Coarse = 1 # Coarse emulation of LPF circuit. High frequencies are boosted, sample rate remains unchanged. # A bit better sounding but also a bit slower. # # Accurate = 2 - default # Finer emulation of LPF circuit. Output signal is upsampled to 48 kHz to allow emulation of audible mirror spectra above 16 kHz, # which is passed through the LPF circuit without significant attenuation. # Sounding is closer to the analog output from real hardware but also slower than the modes 0 and 1. # # Oversampled = 3 # Same as the default mode 2 but the output signal is 2x oversampled, i.e. the output sample rate is 96 kHz. # Even slower than all the other modes but better retains highest frequencies while further resampled in DOSBox mixer. # Possible values: 0, 1, 2, 3. # mt32.reverb.mode: MT-32 reverb mode # Possible values: 0, 1, 2, 3, auto. # mt32.reverb.time: MT-32 reverb decaying time # Possible values: 0, 1, 2, 3, 4, 5, 6, 7. # mt32.reverb.level: MT-32 reverb level # Possible values: 0, 1, 2, 3, 4, 5, 6, 7. mpu401=intelligent # FluidSynth Software Synthesizer mididevice=fluidsynth fluid.driver=pulseaudio fluid.soundfont=/usr/share/soundfonts/GeneralUser.sf2 [sblaster] # sbtype: Type of Soundblaster to emulate. gb is Gameblaster. # Possible values: sb1, sb2, sbpro1, sbpro2, sb16, gb, none. # sbbase: The IO address of the soundblaster. # Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300. # irq: The IRQ number of the soundblaster. # Possible values: 7, 5, 3, 9, 10, 11, 12. # dma: The DMA number of the soundblaster. # Possible values: 1, 5, 0, 3, 6, 7. # hdma: The High DMA number of the soundblaster. # Possible values: 1, 5, 0, 3, 6, 7. # sbmixer: Allow the soundblaster mixer to modify the DOSBox mixer. # oplmode: Type of OPL emulation. On 'auto' the mode is determined by sblaster type. All OPL modes are Adlib-compatible, except for 'cms'. # Possible values: auto, cms, opl2, dualopl2, opl3, opl3gold, none. # oplemu: Provider for the OPL emulation. compat might provide better quality (see oplrate as well). # Possible values: default, compat, fast. # oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly). # Possible values: 44100, 49716, 48000, 32000, 22050, 16000, 11025, 8000. sbtype=sb16 sbbase=220 irq=7 dma=1 hdma=5 sbmixer=true oplmode=auto oplemu=default oplrate=44100 [gus] # gus: Enable the Gravis Ultrasound emulation. # gusrate: Sample rate of Ultrasound emulation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # gusbase: The IO base address of the Gravis Ultrasound. # Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300. # gusirq: The IRQ number of the Gravis Ultrasound. # Possible values: 5, 3, 7, 9, 10, 11, 12. # gusdma: The DMA channel of the Gravis Ultrasound. # Possible values: 3, 0, 1, 5, 6, 7. # ultradir: Path to Ultrasound directory. In this directory # there should be a MIDI directory that contains # the patch files for GUS playback. Patch sets used # with Timidity should work fine. gus=true gusrate=44100 gusbase=240 gusirq=5 gusdma=3 # Place GUS files in /storage/roms/dos/ULTRASND ultradir=C:\ULTRASND [speaker] # pcspeaker: Enable PC-Speaker emulation. # pcrate: Sample rate of the PC-Speaker sound generation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'. # Possible values: auto, on, off. # tandyrate: Sample rate of the Tandy 3-Voice generation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible). pcspeaker=true pcrate=44100 tandy=auto tandyrate=44100 disney=true [joystick] # joysticktype: Type of joystick to emulate: auto (default), none, # 2axis (supports two joysticks), # 4axis (supports one joystick, first joystick used), # 4axis_2 (supports one joystick, second joystick used), # fcs (Thrustmaster), ch (CH Flightstick). # none disables joystick emulation. # auto chooses emulation depending on real joystick(s). # (Remember to reset dosbox's mapperfile if you saved it earlier) # Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none. # timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away). # autofire: continuously fires as long as you keep the button pressed. # swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks. # buttonwrap: enable button wrapping at the number of emulated buttons. joysticktype=fcs timed=true autofire=false swap34=false buttonwrap=false [serial] # serial1: set type of device connected to com port. # Can be disabled, dummy, modem, nullmodem, directserial. # Additional parameters must be in the same line in the form of # parameter:value. Parameter for all types is irq (optional). # for directserial: realport (required), rxdelay (optional). # (realport:COM1 realport:ttyS0). # for modem: listenport (optional). # for nullmodem: server, rxdelay, txdelay, telnet, usedtr, # transparent, port, inhsocket (all optional). # Example: serial1=modem listenport:5000 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial2: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial3: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial4: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. serial1=dummy serial2=dummy serial3=disabled serial4=disabled [dos] # xms: Enable XMS support. # ems: Enable EMS support. The default (=true) provides the best # compatibility but certain applications may run better with # other choices, or require EMS support to be disabled (=false) # to work at all. # Possible values: true, emsboard, emm386, false. # umb: Enable UMB support. # keyboardlayout: Language code of the keyboard layout (or none). xms=true ems=true umb=true keyboardlayout=auto [ipx] # ipx: Enable ipx over UDP/IP emulation. ipx=false [autoexec] # Lines in this section will be run at startup. mount c /storage/roms/pc c: @echo off echo ######################################################## echo # DOSBox SDL2 default config # echo ######################################################## echo. ================================================ FILE: packages/sx05re/emulators/dosbox-x/config/dosbox-x-SVN.conf ================================================ # This is the configuration file for DOSBox SVN. (Please use the latest version of DOSBox) # Lines starting with a # are comment lines and are ignored by DOSBox. # They are used to (briefly) document the effect of each option. [sdl] # fullscreen: Start dosbox directly in fullscreen. (Press ALT-Enter to go back) # vsync: Sync to Vblank IF supported by the output device and renderer (if relevant). # It can reduce screen flickering, but it can also result in a slow DOSBox. # fullresolution: What resolution to use for fullscreen: original, desktop or a fixed size (e.g. 1024x768). # Using your monitor's native resolution with aspect=true might give the best results. # If you end up with small window on a large screen, try an output different from surface.On Windows 10 with display scaling (Scale and layout) set to a value above 100%, it is recommended # to use a lower full/windowresolution, in order to avoid window size problems. # windowresolution: Scale the window to this size IF the output device supports hardware scaling. # (output=surface does not!) # output: What video system to use for output. # Possible values: surface, texture, texturenb. # gl.shader: What set of GLSL shaders to use with an OpenGL output. Keep empty if this is not desired. # Note that in case it is used, the respective shader files must be found in the "shaders" subdirectory # relatively to where the default DOSBox configuration fiel is stored. For shader file naming convention, # suppose that you have a pair of shader files ready: mysample.vert and mysample.frag. # Then shader=mysample should be set. # # texture.renderer: Choose a renderer driver if output=texture or output=texturenb. Use output=auto for an automatic choice. # Possible values: auto, opengl, software. # autolock: Mouse will automatically lock, if you click on the screen. (Press CTRL-F10 to unlock) # sensitivity: Mouse sensitivity. The optional second parameter specifies vertical sensitivity (e.g. 100,-50). # waitonerror: Wait before closing the console if dosbox has an error. # priority: Priority levels for dosbox. Second entry behind the comma is for when dosbox is not focused/minimized. # pause is only valid for the second entry. # Possible values: lowest, lower, normal, higher, highest, pause. # mapperfile: File used to load/save the key/event mappings from. Resetmapper only works with the default value. fullscreen = true vsync = false fullresolution = 0x0 windowresolution = original output = texturenb gl.shader = texture.renderer = auto autolock = true sensitivity = 100 waitonerror = true priority = higher,normal mapperfile = mapper-sdl2-SVN.map [dosbox] # language: Select another language file. # machine: The type of machine DOSBox tries to emulate. # Possible values: hercules, cga, tandy, pcjr, ega, vgaonly, svga_s3, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe. # captures: Directory where things like wave, midi, screenshot get captured. # memsize: Amount of memory DOSBox has in megabytes. # This value is best left at its default to avoid problems with some games, # though few games might require a higher value. # There is generally no speed advantage when raising this value. language = machine = svga_s3 captures = capture memsize = 16 [render] # frameskip: How many frames DOSBox skips before drawing one. # aspect: Do aspect correction, if your output method doesn't support scaling this can slow things down! # scaler: Scaler used to enlarge/enhance low resolution modes. If 'forced' is appended, # then the scaler will be used even if the result might not be desired. # To fit a scaler in the resolution used at full screen may require a border or side bars, # to fill the screen entirely, depending on your hardware, a different scaler/fullresolution might work. # Possible values: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x. frameskip = 0 aspect = true scaler = none [cpu] # core: CPU Core used in emulation. auto will switch to dynamic if available and # appropriate. # Possible values: auto, dynamic, normal, simple. # cputype: CPU Type used in emulation. auto is the fastest choice. # Possible values: auto, 386, 386_slow, 486_slow, pentium_slow, 386_prefetch. # cycles: Amount of instructions DOSBox tries to emulate each millisecond. # Setting this value too high results in sound dropouts and lags. # Cycles can be set in 3 ways: # 'auto' tries to guess what a game needs. # It usually works, but can fail for certain games. # 'fixed #number' will set a fixed amount of cycles. This is what you usually # need if 'auto' fails (Example: fixed 4000). # 'max' will allocate as much cycles as your computer is able to # handle. # Possible values: auto, fixed, max. # cycleup: Amount of cycles to decrease/increase with keycombos.(CTRL-F11/CTRL-F12) # cycledown: Setting it lower than 100 will be a percentage. core = auto cputype = auto cycles = auto cycleup = 10 cycledown = 20 [mixer] # nosound: Enable silent mode, sound is still emulated though. # rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged. # Possible values: 1024, 2048, 4096, 8192, 512, 256. # prebuffer: How many milliseconds of data to keep on top of the blocksize. nosound = false rate = 44100 blocksize = 1024 prebuffer = 25 [midi] # mpu401: Type of MPU-401 to emulate. # Possible values: intelligent, uart, none. # mididevice: Device that will receive the MIDI data from MPU-401. # Possible values: default, win32, alsa, oss, coreaudio, coremidi, fluidsynth, mt32, none. # midiconfig: Special configuration options for the device driver. This is usually the id or part of the name of the device you want to use (find the id/name with mixer/listmidi). # Or in the case of coreaudio, you can specify a soundfont here. # When using a Roland MT-32 rev. 0 as midi output device, some games may require a delay in order to prevent 'buffer overflow' issues. # In that case, add 'delaysysex', for example: midiconfig=2 delaysysex # See the README/Manual for more details. # fluid.driver: Driver to use with Fluidsynth, not needed under Windows. Available drivers depend on what Fluidsynth was compiled with # Possible values: pulseaudio, alsa, oss, coreaudio, dsound, portaudio, sndman, jack, file, default. # fluid.soundfont: Soundfont to use with Fluidsynth. One must be specified. # fluid.samplerate: Sample rate to use with Fluidsynth. # fluid.gain: Fluidsynth gain. # fluid.polyphony: Fluidsynth polyphony. # fluid.cores: Fluidsynth CPU cores to use, default. # fluid.periods: Fluidsynth periods. # fluid.periodsize: Fluidsynth period size. # fluid.reverb: Fluidsynth use reverb. # Possible values: no, yes. # fluid.chorus: Fluidsynth use chorus. # Possible values: no, yes. # fluid.reverb,roomsize: Fluidsynth reverb room size. # fluid.reverb.damping: Fluidsynth reverb damping. # fluid.reverb.width: Fluidsynth reverb width. # fluid.reverb.level: Fluidsynth reverb level. # fluid.chorus.number: Fluidsynth chorus voices # fluid.chorus.level: Fluidsynth chorus level. # fluid.chorus.speed: Fluidsynth chorus speed. # fluid.chorus.depth: Fluidsynth chorus depth. # fluid.chorus.type: Fluidsynth chorus type. 0 is sine wave, 1 is triangle wave. # Possible values: 0, 1. # mt32.romdir: Name of the directory where MT-32 Control and PCM ROM files can be found. Emulation requires these files to work. # Accepted file names are as follows: # MT32_CONTROL.ROM or CM32L_CONTROL.ROM - control ROM file. # MT32_PCM.ROM or CM32L_PCM.ROM - PCM ROM file. # mt32.reverse.stereo: Reverse stereo channels for MT-32 output # mt32.verbose: MT-32 debug logging # mt32.thread: MT-32 rendering in separate thread # mt32.chunk: Minimum milliseconds of data to render at once. # Increasing this value reduces rendering overhead which may improve performance but also increases audio lag. # Valid for rendering in separate thread only. # Possible values: 2, 3, 16, 99, 100. # mt32.prebuffer: How many milliseconds of data to render ahead. # Increasing this value may help to avoid underruns but also increases audio lag. # Cannot be set less than or equal to mt32.chunk value. # Valid for rendering in separate thread only. # Possible values: 3, 4, 32, 199, 200. # mt32.partials: The maximum number of partials playing simultaneously. # Possible values: 8, 9, 32, 255, 256. # mt32.dac: MT-32 DAC input emulation mode # Nice = 0 - default # Produces samples at double the volume, without tricks. # Higher quality than the real devices # # Pure = 1 # Produces samples that exactly match the bits output from the emulated LA32. # Nicer overdrive characteristics than the DAC hacks (it simply clips samples within range) # Much less likely to overdrive than any other mode. # Half the volume of any of the other modes. # Perfect for developers while debugging :) # # GENERATION1 = 2 # Re-orders the LA32 output bits as in early generation MT-32s (according to Wikipedia). # Bit order at DAC (where each number represents the original LA32 output bit number, and XX means the bit is always low): # 15 13 12 11 10 09 08 07 06 05 04 03 02 01 00 XX # # GENERATION2 = 3 # Re-orders the LA32 output bits as in later generations (personally confirmed on my CM-32L - KG). # Bit order at DAC (where each number represents the original LA32 output bit number): # 15 13 12 11 10 09 08 07 06 05 04 03 02 01 00 14 # Possible values: 0, 1, 2, 3. # mt32.analog: MT-32 analogue output emulation mode # Digital = 0 # Only digital path is emulated. The output samples correspond to the digital output signal appeared at the DAC entrance. # Fastest mode. # # Coarse = 1 # Coarse emulation of LPF circuit. High frequencies are boosted, sample rate remains unchanged. # A bit better sounding but also a bit slower. # # Accurate = 2 - default # Finer emulation of LPF circuit. Output signal is upsampled to 48 kHz to allow emulation of audible mirror spectra above 16 kHz, # which is passed through the LPF circuit without significant attenuation. # Sounding is closer to the analog output from real hardware but also slower than the modes 0 and 1. # # Oversampled = 3 # Same as the default mode 2 but the output signal is 2x oversampled, i.e. the output sample rate is 96 kHz. # Even slower than all the other modes but better retains highest frequencies while further resampled in DOSBox mixer. # Possible values: 0, 1, 2, 3. # mt32.reverb.mode: MT-32 reverb mode # Possible values: 0, 1, 2, 3, auto. # mt32.reverb.time: MT-32 reverb decaying time # Possible values: 0, 1, 2, 3, 4, 5, 6, 7. # mt32.reverb.level: MT-32 reverb level # Possible values: 0, 1, 2, 3, 4, 5, 6, 7. mpu401 = intelligent # FluidSynth Software Synthesizer mididevice = fluidsynth fluid.driver = pulseaudio fluid.soundfont = /usr/share/soundfonts/GeneralUser.sf2 [sblaster] # sbtype: Type of Soundblaster to emulate. gb is Gameblaster. # Possible values: sb1, sb2, sbpro1, sbpro2, sb16, gb, none. # sbbase: The IO address of the soundblaster. # Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300. # irq: The IRQ number of the soundblaster. # Possible values: 7, 5, 3, 9, 10, 11, 12. # dma: The DMA number of the soundblaster. # Possible values: 1, 5, 0, 3, 6, 7. # hdma: The High DMA number of the soundblaster. # Possible values: 1, 5, 0, 3, 6, 7. # sbmixer: Allow the soundblaster mixer to modify the DOSBox mixer. # oplmode: Type of OPL emulation. On 'auto' the mode is determined by sblaster type. All OPL modes are Adlib-compatible, except for 'cms'. # Possible values: auto, cms, opl2, dualopl2, opl3, opl3gold, none. # oplemu: Provider for the OPL emulation. compat might provide better quality (see oplrate as well). # Possible values: default, compat, fast, mame. # oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly). # Possible values: 44100, 49716, 48000, 32000, 22050, 16000, 11025, 8000. sbtype = sb16 sbbase = 220 irq = 7 dma = 1 hdma = 5 sbmixer = true oplmode = auto oplemu = default oplrate = 44100 [gus] # gus: Enable the Gravis Ultrasound emulation. # gusrate: Sample rate of Ultrasound emulation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # gusbase: The IO base address of the Gravis Ultrasound. # Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300. # gusirq: The IRQ number of the Gravis Ultrasound. # Possible values: 5, 3, 7, 9, 10, 11, 12. # gusdma: The DMA channel of the Gravis Ultrasound. # Possible values: 3, 0, 1, 5, 6, 7. # ultradir: Path to Ultrasound directory. In this directory # there should be a MIDI directory that contains # the patch files for GUS playback. Patch sets used # with Timidity should work fine. gus = false gusrate = 44100 gusbase = 240 gusirq = 5 gusdma = 3 ultradir = C:\ULTRASND [speaker] # pcspeaker: Enable PC-Speaker emulation. # pcrate: Sample rate of the PC-Speaker sound generation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'. # Possible values: auto, on, off. # tandyrate: Sample rate of the Tandy 3-Voice generation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible). pcspeaker = true pcrate = 44100 tandy = auto tandyrate = 44100 disney = true [joystick] # joysticktype: Type of joystick to emulate: auto (default), none, # 2axis (supports two joysticks), # 4axis (supports one joystick, first joystick used), # 4axis_2 (supports one joystick, second joystick used), # fcs (Thrustmaster), ch (CH Flightstick). # none disables joystick emulation. # auto chooses emulation depending on real joystick(s). # (Remember to reset dosbox's mapperfile if you saved it earlier) # Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none. # timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away). # autofire: continuously fires as long as you keep the button pressed. # swap34: swap the 3rd and the 4th axis. Can be useful for certain joysticks. # buttonwrap: enable button wrapping at the number of emulated buttons. # circularinput: enable translation of circular input to square output. # Try enabling this if your left analog stick can only move in a circle. # deadzone: the percentage of motion to ignore. 100 turns the stick into a digital one. joysticktype = auto timed = true autofire = false swap34 = false buttonwrap = false circularinput = false deadzone = 10 [serial] # serial1: set type of device connected to com port. # Can be disabled, dummy, modem, nullmodem, directserial. # Additional parameters must be in the same line in the form of # parameter:value. Parameter for all types is irq (optional). # for directserial: realport (required), rxdelay (optional). # (realport:COM1 realport:ttyS0). # for modem: listenport (optional). # for nullmodem: server, rxdelay, txdelay, telnet, usedtr, # transparent, port, inhsocket (all optional). # Example: serial1=modem listenport:5000 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial2: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial3: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial4: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. serial1 = dummy serial2 = dummy serial3 = disabled serial4 = disabled [dos] # xms: Enable XMS support. # ems: Enable EMS support. The default (=true) provides the best # compatibility but certain applications may run better with # other choices, or require EMS support to be disabled (=false) # to work at all. # Possible values: true, emsboard, emm386, false. # umb: Enable UMB support. # keyboardlayout: Language code of the keyboard layout (or none). xms = true ems = true umb = true keyboardlayout = auto [ipx] # ipx: Enable ipx over UDP/IP emulation. ipx = false [autoexec] # Lines in this section will be run at startup. # You can put your MOUNT lines here. ================================================ FILE: packages/sx05re/emulators/dosbox-x/config/dosbox-x.conf ================================================ # This is the configuration file for DOSBox SDL2. (Please use the latest version of DOSBox) # Lines starting with a # are comment lines and are ignored by DOSBox. # They are used to (briefly) document the effect of each option. [sdl] # fullscreen: Start dosbox directly in fullscreen. (Press ALT-Enter to go back) # vsync: Sync to Vblank IF supported by the output device and renderer (if relevant). # It can reduce screen flickering, but it can also result in a slow DOSBox. # fullresolution: What resolution to use for fullscreen: original, desktop or a fixed size (e.g. 1024x768). # Using your monitor's native resolution with aspect=true might give the best results. # If you end up with small window on a large screen, try an output different from surface. # windowresolution: Scale the window to this size IF the output device supports hardware scaling. # (output=surface does not!) # output: What video system to use for output. # Possible values: surface, texture, texturenb, opengl, openglnb. # gl.shader: What set of GLSL shaders to use with an OpenGL output. Keep empty if this is not desired. # Note that in case it is used, the respective shader files must be found in the "shaders" subdirectory # relatively to where the default DOSBox configuration fiel is stored. For shader file naming convention, # suppose that you have a pair of shader files ready: mysample.vert and mysample.frag. # Then shader=mysample should be set. # # texture.renderer: Choose a renderer driver if output=texture or output=texturenb. Use output=auto for an automatic choice. # Possible values: auto, opengl, software. # autolock: Mouse will automatically lock, if you click on the screen. (Press CTRL-F10 to unlock) # sensitivity: Mouse sensitivity. # waitonerror: Wait before closing the console if dosbox has an error. # priority: Priority levels for dosbox. Second entry behind the comma is for when dosbox is not focused/minimized. # pause is only valid for the second entry. # Possible values: lowest, lower, normal, higher, highest, pause. # mapperfile: File used to load/save the key/event mappings from. Resetmapper only works with the default value. fullscreen=true # Note that VSYNC is be very demanding vsync=false fullresolution=0x0 windowresolution=original output=texture # Place shaders in /storage/.config/dosbox/shaders gl.shader=crt-easymode texture.renderer=auto autolock=true sensitivity=100 waitonerror=true priority=highest,highest # Input mapper file is looked for in the same directory as the specified conf mapperfile=example.map [dosbox] # language: Select another language file. # machine: The type of machine DOSBox tries to emulate. # Possible values: hercules, cga, tandy, pcjr, ega, vgaonly, svga_s3, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe. # captures: Directory where things like wave, midi, screenshot get captured. # memsize: Amount of memory DOSBox has in megabytes. # This value is best left at its default to avoid problems with some games, # though few games might require a higher value. # There is generally no speed advantage when raising this value. language= machine=svga_s3 captures=capture memsize=16 [render] # frameskip: How many frames DOSBox skips before drawing one. # aspect: Do aspect correction, if your output method doesn't support scaling this can slow things down!. # scaler: Scaler used to enlarge/enhance low resolution modes. If 'forced' is appended, # then the scaler will be used even if the result might not be desired. # Possible values: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x. frameskip=0 aspect=true scaler=none [cpu] # core: CPU Core used in emulation. auto will switch to dynamic if available and # appropriate. # Possible values: auto, dynamic, normal, simple. # cputype: CPU Type used in emulation. auto is the fastest choice. # Possible values: auto, 386, 386_slow, 486_slow, pentium_slow, 386_prefetch. # cycles: Amount of instructions DOSBox tries to emulate each millisecond. # Setting this value too high results in sound dropouts and lags. # Cycles can be set in 3 ways: # 'auto' tries to guess what a game needs. # It usually works, but can fail for certain games. # 'fixed #number' will set a fixed amount of cycles. This is what you usually # need if 'auto' fails (Example: fixed 4000). # 'max' will allocate as much cycles as your computer is able to # handle. # Possible values: auto, fixed, max. # cycleup: Amount of cycles to decrease/increase with keycombos.(CTRL-F11/CTRL-F12) # cycledown: Setting it lower than 100 will be a percentage. core=auto cputype=auto cycles=auto cycleup=10 cycledown=20 [mixer] # nosound: Enable silent mode, sound is still emulated though. # rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged. # Possible values: 1024, 2048, 4096, 8192, 512, 256. # prebuffer: How many milliseconds of data to keep on top of the blocksize. nosound=false rate=44100 blocksize=1024 prebuffer=20 [midi] # mpu401: Type of MPU-401 to emulate. # Possible values: intelligent, uart, none. # mididevice: Device that will receive the MIDI data from MPU-401. # Possible values: default, win32, alsa, oss, coreaudio, coremidi, mt32, none. # midiconfig: Special configuration options for the device driver. This is usually the id of the device you want to use. # or in the case of coreaudio, you can specify a soundfont here. # When using a Roland MT-32 rev. 0 as midi output device, some games may require a delay in order to prevent 'buffer overflow' issues. # In that case, add 'delaysysex', for example: midiconfig=2 delaysysex # See the README/Manual for more details. # mt32.romdir: Name of the directory where MT-32 Control and PCM ROM files can be found. Emulation requires these files to work. # Accepted file names are as follows: # MT32_CONTROL.ROM or CM32L_CONTROL.ROM - control ROM file. # MT32_PCM.ROM or CM32L_PCM.ROM - PCM ROM file. # mt32.reverse.stereo: Reverse stereo channels for MT-32 output # mt32.verbose: MT-32 debug logging # mt32.thread: MT-32 rendering in separate thread # mt32.chunk: Minimum milliseconds of data to render at once. # Increasing this value reduces rendering overhead which may improve performance but also increases audio lag. # Valid for rendering in separate thread only. # Possible values: 2, 3, 16, 99, 100. # mt32.prebuffer: How many milliseconds of data to render ahead. # Increasing this value may help to avoid underruns but also increases audio lag. # Cannot be set less than or equal to mt32.chunk value. # Valid for rendering in separate thread only. # Possible values: 3, 4, 32, 199, 200. # mt32.partials: The maximum number of partials playing simultaneously. # Possible values: 8, 9, 32, 255, 256. # mt32.dac: MT-32 DAC input emulation mode # Nice = 0 - default # Produces samples at double the volume, without tricks. # Higher quality than the real devices # # Pure = 1 # Produces samples that exactly match the bits output from the emulated LA32. # Nicer overdrive characteristics than the DAC hacks (it simply clips samples within range) # Much less likely to overdrive than any other mode. # Half the volume of any of the other modes. # Perfect for developers while debugging :) # # GENERATION1 = 2 # Re-orders the LA32 output bits as in early generation MT-32s (according to Wikipedia). # Bit order at DAC (where each number represents the original LA32 output bit number, and XX means the bit is always low): # 15 13 12 11 10 09 08 07 06 05 04 03 02 01 00 XX # # GENERATION2 = 3 # Re-orders the LA32 output bits as in later generations (personally confirmed on my CM-32L - KG). # Bit order at DAC (where each number represents the original LA32 output bit number): # 15 13 12 11 10 09 08 07 06 05 04 03 02 01 00 14 # Possible values: 0, 1, 2, 3. # mt32.analog: MT-32 analogue output emulation mode # Digital = 0 # Only digital path is emulated. The output samples correspond to the digital output signal appeared at the DAC entrance. # Fastest mode. # # Coarse = 1 # Coarse emulation of LPF circuit. High frequencies are boosted, sample rate remains unchanged. # A bit better sounding but also a bit slower. # # Accurate = 2 - default # Finer emulation of LPF circuit. Output signal is upsampled to 48 kHz to allow emulation of audible mirror spectra above 16 kHz, # which is passed through the LPF circuit without significant attenuation. # Sounding is closer to the analog output from real hardware but also slower than the modes 0 and 1. # # Oversampled = 3 # Same as the default mode 2 but the output signal is 2x oversampled, i.e. the output sample rate is 96 kHz. # Even slower than all the other modes but better retains highest frequencies while further resampled in DOSBox mixer. # Possible values: 0, 1, 2, 3. # mt32.reverb.mode: MT-32 reverb mode # Possible values: 0, 1, 2, 3, auto. # mt32.reverb.time: MT-32 reverb decaying time # Possible values: 0, 1, 2, 3, 4, 5, 6, 7. # mt32.reverb.level: MT-32 reverb level # Possible values: 0, 1, 2, 3, 4, 5, 6, 7. mpu401=intelligent # FluidSynth Software Synthesizer mididevice=fluidsynth fluid.driver=pulseaudio fluid.soundfont=/usr/share/soundfonts/GeneralUser.sf2 [sblaster] # sbtype: Type of Soundblaster to emulate. gb is Gameblaster. # Possible values: sb1, sb2, sbpro1, sbpro2, sb16, gb, none. # sbbase: The IO address of the soundblaster. # Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300. # irq: The IRQ number of the soundblaster. # Possible values: 7, 5, 3, 9, 10, 11, 12. # dma: The DMA number of the soundblaster. # Possible values: 1, 5, 0, 3, 6, 7. # hdma: The High DMA number of the soundblaster. # Possible values: 1, 5, 0, 3, 6, 7. # sbmixer: Allow the soundblaster mixer to modify the DOSBox mixer. # oplmode: Type of OPL emulation. On 'auto' the mode is determined by sblaster type. All OPL modes are Adlib-compatible, except for 'cms'. # Possible values: auto, cms, opl2, dualopl2, opl3, opl3gold, none. # oplemu: Provider for the OPL emulation. compat might provide better quality (see oplrate as well). # Possible values: default, compat, fast. # oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly). # Possible values: 44100, 49716, 48000, 32000, 22050, 16000, 11025, 8000. sbtype=sb16 sbbase=220 irq=7 dma=1 hdma=5 sbmixer=true oplmode=auto oplemu=default oplrate=44100 [gus] # gus: Enable the Gravis Ultrasound emulation. # gusrate: Sample rate of Ultrasound emulation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # gusbase: The IO base address of the Gravis Ultrasound. # Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300. # gusirq: The IRQ number of the Gravis Ultrasound. # Possible values: 5, 3, 7, 9, 10, 11, 12. # gusdma: The DMA channel of the Gravis Ultrasound. # Possible values: 3, 0, 1, 5, 6, 7. # ultradir: Path to Ultrasound directory. In this directory # there should be a MIDI directory that contains # the patch files for GUS playback. Patch sets used # with Timidity should work fine. gus=true gusrate=44100 gusbase=240 gusirq=5 gusdma=3 # Place GUS files in /storage/roms/dos/ULTRASND ultradir=C:\ULTRASND [speaker] # pcspeaker: Enable PC-Speaker emulation. # pcrate: Sample rate of the PC-Speaker sound generation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'. # Possible values: auto, on, off. # tandyrate: Sample rate of the Tandy 3-Voice generation. # Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. # disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible). pcspeaker=true pcrate=44100 tandy=auto tandyrate=44100 disney=true [joystick] # joysticktype: Type of joystick to emulate: auto (default), none, # 2axis (supports two joysticks), # 4axis (supports one joystick, first joystick used), # 4axis_2 (supports one joystick, second joystick used), # fcs (Thrustmaster), ch (CH Flightstick). # none disables joystick emulation. # auto chooses emulation depending on real joystick(s). # (Remember to reset dosbox's mapperfile if you saved it earlier) # Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none. # timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away). # autofire: continuously fires as long as you keep the button pressed. # swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks. # buttonwrap: enable button wrapping at the number of emulated buttons. joysticktype=fcs timed=true autofire=false swap34=false buttonwrap=false [serial] # serial1: set type of device connected to com port. # Can be disabled, dummy, modem, nullmodem, directserial. # Additional parameters must be in the same line in the form of # parameter:value. Parameter for all types is irq (optional). # for directserial: realport (required), rxdelay (optional). # (realport:COM1 realport:ttyS0). # for modem: listenport (optional). # for nullmodem: server, rxdelay, txdelay, telnet, usedtr, # transparent, port, inhsocket (all optional). # Example: serial1=modem listenport:5000 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial2: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial3: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. # serial4: see serial1 # Possible values: dummy, disabled, modem, nullmodem, directserial. serial1=dummy serial2=dummy serial3=disabled serial4=disabled [dos] # xms: Enable XMS support. # ems: Enable EMS support. The default (=true) provides the best # compatibility but certain applications may run better with # other choices, or require EMS support to be disabled (=false) # to work at all. # Possible values: true, emsboard, emm386, false. # umb: Enable UMB support. # keyboardlayout: Language code of the keyboard layout (or none). xms=true ems=true umb=true keyboardlayout=auto [ipx] # ipx: Enable ipx over UDP/IP emulation. ipx=false [autoexec] # Lines in this section will be run at startup. mount c /storage/roms/pc c: @echo off echo ######################################################## echo # DOSBox SDL2 default config # echo ######################################################## echo. ================================================ FILE: packages/sx05re/emulators/dosbox-x/include/gpio.h ================================================ /* * - userspace ABI for the GPIO character devices * * Copyright (C) 2016 Linus Walleij * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published by * the Free Software Foundation. */ #ifndef _GPIO_H_ #define _GPIO_H_ #include #include /** * struct gpiochip_info - Information about a certain GPIO chip * @name: the Linux kernel name of this GPIO chip * @label: a functional name for this GPIO chip, such as a product * number, may be NULL * @lines: number of GPIO lines on this chip */ struct gpiochip_info { char name[32]; char label[32]; __u32 lines; }; /* Informational flags */ #define GPIOLINE_FLAG_KERNEL (1UL << 0) /* Line used by the kernel */ #define GPIOLINE_FLAG_IS_OUT (1UL << 1) #define GPIOLINE_FLAG_ACTIVE_LOW (1UL << 2) #define GPIOLINE_FLAG_OPEN_DRAIN (1UL << 3) #define GPIOLINE_FLAG_OPEN_SOURCE (1UL << 4) /** * struct gpioline_info - Information about a certain GPIO line * @line_offset: the local offset on this GPIO device, fill this in when * requesting the line information from the kernel * @flags: various flags for this line * @name: the name of this GPIO line, such as the output pin of the line on the * chip, a rail or a pin header name on a board, as specified by the gpio * chip, may be NULL * @consumer: a functional name for the consumer of this GPIO line as set by * whatever is using it, will be NULL if there is no current user but may * also be NULL if the consumer doesn't set this up */ struct gpioline_info { __u32 line_offset; __u32 flags; char name[32]; char consumer[32]; }; /* Maximum number of requested handles */ #define GPIOHANDLES_MAX 64 /* Linerequest flags */ #define GPIOHANDLE_REQUEST_INPUT (1UL << 0) #define GPIOHANDLE_REQUEST_OUTPUT (1UL << 1) #define GPIOHANDLE_REQUEST_ACTIVE_LOW (1UL << 2) #define GPIOHANDLE_REQUEST_OPEN_DRAIN (1UL << 3) #define GPIOHANDLE_REQUEST_OPEN_SOURCE (1UL << 4) /** * struct gpiohandle_request - Information about a GPIO handle request * @lineoffsets: an array desired lines, specified by offset index for the * associated GPIO device * @flags: desired flags for the desired GPIO lines, such as * GPIOHANDLE_REQUEST_OUTPUT, GPIOHANDLE_REQUEST_ACTIVE_LOW etc, OR:ed * together. Note that even if multiple lines are requested, the same flags * must be applicable to all of them, if you want lines with individual * flags set, request them one by one. It is possible to select * a batch of input or output lines, but they must all have the same * characteristics, i.e. all inputs or all outputs, all active low etc * @default_values: if the GPIOHANDLE_REQUEST_OUTPUT is set for a requested * line, this specifies the default output value, should be 0 (low) or * 1 (high), anything else than 0 or 1 will be interpreted as 1 (high) * @consumer_label: a desired consumer label for the selected GPIO line(s) * such as "my-bitbanged-relay" * @lines: number of lines requested in this request, i.e. the number of * valid fields in the above arrays, set to 1 to request a single line * @fd: if successful this field will contain a valid anonymous file handle * after a GPIO_GET_LINEHANDLE_IOCTL operation, zero or negative value * means error */ struct gpiohandle_request { __u32 lineoffsets[GPIOHANDLES_MAX]; __u32 flags; __u8 default_values[GPIOHANDLES_MAX]; char consumer_label[32]; __u32 lines; int fd; }; /** * struct gpiohandle_data - Information of values on a GPIO handle * @values: when getting the state of lines this contains the current * state of a line, when setting the state of lines these should contain * the desired target state */ struct gpiohandle_data { __u8 values[GPIOHANDLES_MAX]; }; #define GPIOHANDLE_GET_LINE_VALUES_IOCTL _IOWR(0xB4, 0x08, struct gpiohandle_data) #define GPIOHANDLE_SET_LINE_VALUES_IOCTL _IOWR(0xB4, 0x09, struct gpiohandle_data) /* Eventrequest flags */ #define GPIOEVENT_REQUEST_RISING_EDGE (1UL << 0) #define GPIOEVENT_REQUEST_FALLING_EDGE (1UL << 1) #define GPIOEVENT_REQUEST_BOTH_EDGES ((1UL << 0) | (1UL << 1)) /** * struct gpioevent_request - Information about a GPIO event request * @lineoffset: the desired line to subscribe to events from, specified by * offset index for the associated GPIO device * @handleflags: desired handle flags for the desired GPIO line, such as * GPIOHANDLE_REQUEST_ACTIVE_LOW or GPIOHANDLE_REQUEST_OPEN_DRAIN * @eventflags: desired flags for the desired GPIO event line, such as * GPIOEVENT_REQUEST_RISING_EDGE or GPIOEVENT_REQUEST_FALLING_EDGE * @consumer_label: a desired consumer label for the selected GPIO line(s) * such as "my-listener" * @fd: if successful this field will contain a valid anonymous file handle * after a GPIO_GET_LINEEVENT_IOCTL operation, zero or negative value * means error */ struct gpioevent_request { __u32 lineoffset; __u32 handleflags; __u32 eventflags; char consumer_label[32]; int fd; }; /** * GPIO event types */ #define GPIOEVENT_EVENT_RISING_EDGE 0x01 #define GPIOEVENT_EVENT_FALLING_EDGE 0x02 /** * struct gpioevent_data - The actual event being pushed to userspace * @timestamp: best estimate of time of event occurrence, in nanoseconds * @id: event identifier */ struct gpioevent_data { __u64 timestamp; __u32 id; }; #define GPIO_GET_CHIPINFO_IOCTL _IOR(0xB4, 0x01, struct gpiochip_info) #define GPIO_GET_LINEINFO_IOCTL _IOWR(0xB4, 0x02, struct gpioline_info) #define GPIO_GET_LINEHANDLE_IOCTL _IOWR(0xB4, 0x03, struct gpiohandle_request) #define GPIO_GET_LINEEVENT_IOCTL _IOWR(0xB4, 0x04, struct gpioevent_request) #endif /* _GPIO_H_ */ ================================================ FILE: packages/sx05re/emulators/dosbox-x/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="dosbox-x" if [[ "${DEVICE}" == "Amlogic-old" ]]; then PKG_VERSION="286e859e08b60a04c0b4c2bc952432122c957a9c" PKG_SHA256="1a44710e38b05f67e76da74f46bbea4bb8b73ed4a28044575dfa24765bc65d7c" else PKG_VERSION="5e7f129f43683a0dd5a797d29b962a429d9bd0a7" PKG_SHA256="edf31acd6310157a6617f9f25e2c99a39f40bcdffa6da3aeb78a0ed3db5655dc" fi PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/joncampbell123/dosbox-x" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux glibc glib systemd dbus alsa-lib SDL2 SDL2_net SDL_sound libpng zlib libvorbis flac libogg fluidsynth-git munt" PKG_LONGDESC="DOSBox-X fork of the DOSBox project." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+lto" pre_configure_target() { cd ${PKG_BUILD} rm -rf .${TARGET_NAME} PKG_CONFIGURE_OPTS_TARGET="--prefix=/usr \ --enable-core-inline \ --enable-dynrec \ --enable-unaligned_memory \ --disable-sdl \ --enable-sdl2 \ --enable-mt32 \ --with-sdl2-prefix=${SYSROOT_PREFIX}/usr" } pre_make_target() { # Define DOSBox version sed -e "s/SVN/SDL2/" -i ${PKG_BUILD}/config.h if [[ "${DEVICE}" == "GameForce" ]] || [[ "${DEVICE}" == "OdroidGoAdvance" ]] ; then cp ${PKG_DIR}/include/gpio.h ${SYSROOT_PREFIX}/usr/include/linux fi } post_makeinstall_target() { # Create config directory & install config mkdir -p ${INSTALL}/usr/config/emuelec/configs/dosbox-x/ cp -a ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin/ cp -a ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/dosbox-x/ if [[ "${DEVICE}" == "GameForce" ]] || [[ "${DEVICE}" == "OdroidGoAdvance" ]] ; then echo ${TOOLCHAIN}/${TARGET_NAME}/sysroot/usr/include/linux/gpio.h rm ${TOOLCHAIN}/${TARGET_NAME}/sysroot/usr/include/linux/gpio.h fi } ================================================ FILE: packages/sx05re/emulators/dosbox-x/patches/000-arm_configure.patch ================================================ diff --git a/configure.ac b/configure.ac index 407d553..e15473b 100644 --- a/configure.ac +++ b/configure.ac @@ -249,6 +249,12 @@ dnl The target cpu checks for dynamic cores AH_TEMPLATE(C_TARGETCPU,[The type of cpu this target has]) AC_MSG_CHECKING(for target cpu type) case "$host_cpu" in + arm) + AC_DEFINE(C_TARGETCPU,ARMV7LE) + AC_MSG_RESULT(ARMv7 Little Endian) + c_targetcpu="arm" + c_unalignedmemory=yes + ;; x86_64 | amd64) AC_DEFINE(C_TARGETCPU,X86_64) AC_MSG_RESULT(x86-64 bit compatible) ================================================ FILE: packages/sx05re/emulators/dosbox-x/patches/001-sdl-config.patch ================================================ diff --git a/acinclude.m4 b/acinclude.m4 index 9b85f7f..a2c7117 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -14,35 +14,12 @@ SDL2_CONFIG=no if test x$enable_sdl2enable = xyes ; then - if test x$sdl2_exec_prefix != x ; then - sdl2_args="$sdl2_args --exec-prefix=$sdl2_exec_prefix" - if test x${SDL2_CONFIG+set} != xset ; then - SDL2_CONFIG=$sdl2_exec_prefix/bin/sdl2-config - fi - fi - if test x$sdl2_prefix != x ; then - sdl2_args="$sdl2_args --prefix=$sdl2_prefix" - if test x${SDL2_CONFIG+set} != xset ; then - SDL2_CONFIG=$sdl2_prefix/bin/sdl2-config - fi - fi - - if test -x vs/sdl2/linux-host/bin/sdl2-config ; then - SDL2_CONFIG=vs/sdl2/linux-host/bin/sdl2-config - PATH=vs/sdl2/linux-host/bin:$PATH - fi + SDL2_CONFIG=$sdl2_prefix/bin/sdl2-config AC_PATH_PROG(SDL2_CONFIG, sdl2-config, no) - min_sdl2_version=ifelse([$1], ,0.11.0,$1) - AC_MSG_CHECKING(for SDL2 - version >= $min_sdl2_version) - no_sdl2="" - if test "$SDL2_CONFIG" = "no" ; then - no_sdl2=yes - else - SDL2_CFLAGS=`$SDL2_CONFIG $sdl2conf_args --cflags` - SDL2_LIBS=`$SDL2_CONFIG $sdl2conf_args --libs` - AC_DEFINE(C_SDL2,1) - fi + SDL2_CFLAGS=`$SDL2_CONFIG $sdl2conf_args --cflags` + SDL2_LIBS=`$SDL2_CONFIG $sdl2conf_args --libs` + AC_DEFINE(C_SDL2,1) fi AC_SUBST(SDL2_CFLAGS) ================================================ FILE: packages/sx05re/emulators/dosbox-x/patches/003-dosboxconf.patch ================================================ diff --git a/src/gui/sdlmain.cpp b/src/gui/sdlmain.cpp index ec6ba7b..f689b3c 100644 --- a/src/gui/sdlmain.cpp +++ b/src/gui/sdlmain.cpp @@ -947,7 +947,7 @@ #elif defined(HAIKU) #define DEFAULT_CONFIG_FILE "~/config/settings/dosbox-x/dosbox-x.conf" #else /*linux freebsd*/ -# define DEFAULT_CONFIG_FILE "/.dosboxrc" +# define DEFAULT_CONFIG_FILE "/dosbox-x.conf" #endif #if C_SET_PRIORITY diff --git a/src/misc/cross.cpp b/src/misc/cross.cpp index 05a5893..74daf41 100644 --- a/src/misc/cross.cpp +++ b/src/misc/cross.cpp @@ -88,7 +88,7 @@ #elif defined(LINUX) const char *xdg_data_home = getenv("XDG_DATA_HOME"); const std::string data_home = xdg_data_home && xdg_data_home[0] == '/' ? xdg_data_home: "~/.local/share"; - in = data_home + "/dosbox-x"; + in = "/storage/.config/emuelec/configs/dosbox-x"; ResolveHomedir(in); // Let's check if the above exists, otherwise use RESDIR @@ -112,14 +112,14 @@ in = "~/Library/Preferences"; ResolveHomedir(in); #elif defined(HAIKU) - in = "~/config/settings/dosbox-x"; + in = "/storage/.config/emuelec/configs/dosbox-x"; ResolveHomedir(in); #elif defined(RISCOS) in = "//DosBox-X"; #elif !defined(HX_DOS) const char *xdg_conf_home = getenv("XDG_CONFIG_HOME"); const std::string conf_home = xdg_conf_home && xdg_conf_home[0] == '/' ? xdg_conf_home: "~/.config"; - in = conf_home + "/dosbox-x"; + in = "/storage/.config/emuelec/configs/dosbox-x"; ResolveHomedir(in); #endif //LOG_MSG("Config dir: %s", in.c_str()); @@ -147,7 +147,7 @@ ResolveHomedir(in); //Don't create it. Assume it exists #elif defined(HAIKU) - in = "~/config/settings/dosbox-x"; + in = "/storage/.config/emuelec/configs/dosbox-x"; ResolveHomedir(in); mkdir(in.c_str(),0700); #elif defined(RISCOS) @@ -156,7 +156,7 @@ #elif !defined(HX_DOS) const char *xdg_conf_home = getenv("XDG_CONFIG_HOME"); const std::string conf_home = xdg_conf_home && xdg_conf_home[0] == '/' ? xdg_conf_home: "~/.config"; - in = conf_home + "/dosbox-x"; + in = "/storage/.config/emuelec/configs/dosbox-x"; ResolveHomedir(in); mkdir(in.c_str(),0700); #endif ================================================ FILE: packages/sx05re/emulators/dosbox-x/scripts/dosbox-x.start ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Frank Hartung (supervisedthinking (@) gmail.com) # Source predefined functions and variables . /etc/profile set_audio pulseaudio # Set common variables RR_DOSBOX_HOME=/storage/.dosbox RR_DOSBOX_HOME_CONFIG=/storage/.config/emuelec/configs/dosbox-x # Create symlink to config dir if [ ! -L ${RR_DOSBOX_HOME} ]; then if [ -d ${RR_DOSBOX_HOME} ]; then cp -rf ${RR_DOSBOX_HOME} ${RR_DOSBOX_HOME_CONFIG} rm -rf ${RR_DOSBOX_HOME} fi ln -sf ${RR_DOSBOX_HOME_CONFIG} ${RR_DOSBOX_HOME} fi # Run the emulator ARG="$(echo $1 | sed 's=.*/==;s/\.[^.]*$//')" dosbox-x -c "${ARG}" > /emuelec/logs/dosbox-x.log 2>&1 set_audio default ================================================ FILE: packages/sx05re/emulators/droidports/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="droidports" PKG_VERSION="9e43646b43ca3bf80a50edfc1a212d2c702b617d" PKG_ARCH="arm" PKG_SITE="https://github.com/JohnnyonFlame/droidports" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_image openal-soft bzip2 libzip libpng" PKG_LONGDESC="A repository for experimenting with elf loading and in-place patching of android native libraries on non-android operating systems." PKG_TOOLCHAIN="cmake" pre_configure_target() { PKG_CMAKE_OPTS_TARGET=" -DCMAKE_BUILD_TYPE=Release -DPLATFORM=linux -DPORT=gmloader -DUSE_BUILTIN_FREETYPE=ON" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/.${TARGET_NAME}/gmloader ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/gmloader cp ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/gmloader } ================================================ FILE: packages/sx05re/emulators/droidports/patches/01-EmuELEC-set-save-path.patch ================================================ --- a/ports/gmloader/libyoyo.c +++ b/ports/gmloader/libyoyo.c @@ -172,7 +172,7 @@ //TODO:: Update psvita sdk and use the newlib mkdir. #ifndef PLATFORM_VITA // For linux targets - snprintf(platform_savedir, sizeof(platform_savedir), "%s/.config/%s/", getenv("HOME"), gamename); + snprintf(platform_savedir, sizeof(platform_savedir), "%s/.config/gmloader/%s/", getenv("HOME"), gamename); warning("Saving to folder %s.\n", platform_savedir); char mkdir_cmd[PATH_MAX]; ================================================ FILE: packages/sx05re/emulators/droidports/scripts/gmloader.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile [ ! -e "/storage/roms/ports/gmloader/libc++_shared.so" ] && cp "/usr/config/emuelec/configs/gmloader/libc++_shared.so" "/storage/roms/ports/gmloader/libc++_shared.so" cd /storage/roms/ports/gmloader gmloader "${1}" ================================================ FILE: packages/sx05re/emulators/duckstation/config/settings.ini ================================================ [Main] SettingsVersion = 3 StartFullscreen = true [BIOS] SearchDirectory = /storage/roms/bios PathNTSCU = PathNTSCJ = PathPAL = PatchTTYEnable = false PatchFastBoot = true [Controller1] Type = AnalogController ButtonUp = Controller0/Button11 ButtonDown = Controller0/Button12 ButtonLeft = Controller0/Button13 ButtonRight = Controller0/Button14 ButtonSelect = Controller0/Button4 ButtonStart = Controller0/Button6 ButtonTriangle = Controller0/Button3 ButtonCross = Controller0/Button0 ButtonSquare = Controller0/Button2 ButtonCircle = Controller0/Button1 ButtonL1 = Controller0/Button9 ButtonL2 = Controller0/+Axis4 ButtonR1 = Controller0/Button10 ButtonR2 = Controller0/+Axis5 ButtonL3 = Controller0/Button7 ButtonR3 = Controller0/Button8 AxisLeftX = Controller0/Axis0 AxisLeftY = Controller0/Axis1 AxisRightX = Controller0/Axis2 AxisRightY = Controller0/Axis3 ButtonAnalog = Controller0/Button5 [Hotkeys] OpenQuickMenu = Controller0/Button5 [Logging] LogLevel = Error LogFilter = LogToConsole = false LogToDebug = false LogToWindow = false LogToFile = false [Display] ShowFPS = true ShowVPS = true ShowSpeed = true [Audio] Backend = SDL ================================================ FILE: packages/sx05re/emulators/duckstation/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="duckstation" PKG_VERSION="fd3507c16d098fb32806c281caaefb205946da8a" #PKG_VERSION="35f272b336667cffd35d149d9da6f85e958ddfa2" PKG_ARCH="aarch64" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/stenzek/duckstation" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 nasm:host ${OPENGLES} libevdev" PKG_SECTION="libretro" PKG_SHORTDESC="Fast PlayStation 1 emulator for x86-64/AArch32/AArch64 " PKG_TOOLCHAIN="cmake" if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then EXTRA_OPTS+=" -DUSE_DRMKMS=ON -DUSE_FBDEV=OFF -DUSE_MALI=OFF" else EXTRA_OPTS+=" -DUSE_DRMKMS=OFF -DUSE_FBDEV=ON -DUSE_MALI=ON" fi pre_configure_target() { PKG_CMAKE_OPTS_TARGET+=" -DANDROID=OFF \ -DENABLE_DISCORD_PRESENCE=OFF \ -DUSE_X11=OFF \ -DBUILD_LIBRETRO_CORE=OFF \ -DBUILD_GO2_FRONTEND=OFF \ -DBUILD_QT_FRONTEND=OFF \ -DBUILD_NOGUI_FRONTEND=ON \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=OFF \ -DUSE_SDL2=ON \ -DENABLE_CHEEVOS=ON \ -DHAVE_EGL=ON \ ${EXTRA_OPTS}" if [ "${DEVICE}" == "Amlogic-old" ]; then cp -rf $(get_build_dir libevdev)/include/linux/linux/input-event-codes.h ${SYSROOT_PREFIX}/usr/include/linux/ fi } post_make_target() { if [ "${DEVICE}" == "Amlogic-old" ]; then rm ${SYSROOT_PREFIX}/usr/include/linux/input-event-codes.h fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -rf ${PKG_BUILD}/.${TARGET_NAME}/bin/duckstation-nogui ${INSTALL}/usr/bin cp -rf ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/duckstation cp -rf ${PKG_BUILD}/.${TARGET_NAME}/bin/* ${INSTALL}/usr/config/emuelec/configs/duckstation cp -rf ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/duckstation rm -rf ${INSTALL}/usr/config/emuelec/configs/duckstation/database/gamecontrollerdb.txt ln -sf /storage/.config/SDL-GameControllerDB/gamecontrollerdb.txt ${INSTALL}/usr/config/emuelec/configs/duckstation/database/gamecontrollerdb.txt rm -rf ${INSTALL}/usr/config/emuelec/configs/duckstation/duckstation-nogui rm -rf ${INSTALL}/usr/config/emuelec/configs/duckstation/common-tests } ================================================ FILE: packages/sx05re/emulators/duckstation/patches/000-fix-cmake.patch ================================================ diff -u -r /home/romain/duckstation/CMakeLists.txt ./CMakeLists.txt --- /home/romain/duckstation/CMakeLists.txt 2021-02-13 00:29:48.693304818 +0100 +++ ./CMakeLists.txt 2021-02-13 00:52:42.082500283 +0100 @@ -35,6 +35,7 @@ endif() if(LINUX OR ANDROID) option(USE_EGL "Support EGL OpenGL context creation" ON) + option(USE_MALI "Link with libmali for EGL support" OFF) endif() if(LINUX AND NOT ANDROID) option(USE_DRMKMS "Support DRM/KMS display and contexts" OFF) @@ -254,7 +254,7 @@ elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm64") set(CPU_ARCH "aarch64") elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "armv7-a" OR - ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "armv7l") + ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "armv7l" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "armv8l") set(CPU_ARCH "aarch32") if(ANDROID) # Force ARM mode, since apparently ANDROID_ARM_MODE isn't working.. diff -u -r /home/romain/duckstation/CMakeModules/FindEGL.cmake ./CMakeModules/FindEGL.cmake --- /home/romain/duckstation/CMakeModules/FindEGL.cmake 2021-02-13 00:29:48.693304818 +0100 +++ ./CMakeModules/FindEGL.cmake 2021-02-13 00:45:35.564462969 +0100 @@ -86,6 +86,17 @@ ${PKG_EGL_LIBRARY_DIRS} ) +if(USE_MALI) +pkg_check_modules(PKG_MALI QUIET mali) +find_library(MALI_LIBRARY + NAMES + mali + HINTS + ${PKG_MALI_LIBRARY_DIRS} +) +endif() + + # NB: We do *not* use the version information from pkg-config, as that # is the implementation version (eg: the Mesa version) if(EGL_INCLUDE_DIR) @@ -117,7 +128,11 @@ cmake_push_check_state(RESET) list(APPEND CMAKE_REQUIRED_LIBRARIES "${EGL_LIBRARY}") +if(USE_MALI) +list(APPEND CMAKE_REQUIRED_LIBRARIES "${MALI_LIBRARY}") +endif() list(APPEND CMAKE_REQUIRED_INCLUDES "${EGL_INCLUDE_DIR}") +list(APPEND CMAKE_REQUIRED_DEFINITIONS "-DEGL_NO_X11 -DUSE_X11=NO") check_cxx_source_compiles(" #include @@ -161,7 +176,11 @@ mark_as_advanced(EGL_LIBRARY EGL_INCLUDE_DIR HAVE_EGL) # compatibility variables +if (USE_MALI) +set(EGL_LIBRARIES ${EGL_LIBRARY} ${MALI_LIBRARY}) +else() set(EGL_LIBRARIES ${EGL_LIBRARY}) +endif() set(EGL_INCLUDE_DIRS ${EGL_INCLUDE_DIR}) set(EGL_VERSION_STRING ${EGL_VERSION}) Seulement dans ./CMakeModules: FindEGL.cmake.orig diff -u -r /home/romain/duckstation/dep/glad/CMakeLists.txt ./dep/glad/CMakeLists.txt --- /home/romain/duckstation/dep/glad/CMakeLists.txt 2021-02-13 00:29:48.765302377 +0100 +++ ./dep/glad/CMakeLists.txt 2021-02-13 00:42:20.848512028 +0100 @@ -17,8 +17,9 @@ target_sources(glad PRIVATE src/glad_wgl.c) else() if(USE_EGL) + target_compile_definitions(glad PRIVATE -DEGL_NO_X11) target_sources(glad PRIVATE src/glad_egl.c) - target_link_libraries(glad PRIVATE EGL::EGL) + target_link_libraries(glad PRIVATE EGL) endif() if(USE_X11) target_sources(glad PRIVATE src/glad_glx.c) diff -u -r /home/romain/duckstation/src/common/CMakeLists.txt ./src/common/CMakeLists.txt --- /home/romain/duckstation/src/common/CMakeLists.txt 2021-02-13 00:29:48.885298307 +0100 +++ ./src/common/CMakeLists.txt 2021-02-13 00:42:20.848512028 +0100 @@ -175,12 +175,13 @@ ) endif() if(USE_DRMKMS) + target_compile_definitions(common PRIVATE "-DEGL_NO_X11=1") target_compile_definitions(common PRIVATE "-DUSE_GBM=1") target_sources(common PRIVATE gl/context_egl_gbm.cpp gl/context_egl_gbm.h ) - target_link_libraries(common PUBLIC GBM::GBM) + target_link_libraries(common PUBLIC gbm EGL) endif() endif() diff -u -r /home/romain/duckstation/src/duckstation-nogui/CMakeLists.txt ./src/duckstation-nogui/CMakeLists.txt --- /home/romain/duckstation/src/duckstation-nogui/CMakeLists.txt 2021-02-13 00:29:48.901297765 +0100 +++ ./src/duckstation-nogui/CMakeLists.txt 2021-02-13 00:56:19.913224314 +0100 @@ -29,6 +29,10 @@ target_compile_definitions(duckstation-nogui PRIVATE "-DUSE_LIBEVDEV=1") target_include_directories(duckstation-nogui PRIVATE ${LIBEVDEV_INCLUDE_DIRS}) target_link_libraries(duckstation-nogui PRIVATE ${LIBEVDEV_LIBRARIES}) +if (USE_MALI) + target_link_libraries(duckstation-nogui PRIVATE ${MALI_LIBRARY}) +endif() + endif() if(WIN32) ================================================ FILE: packages/sx05re/emulators/duckstation/patches/001-path-program.patch ================================================ diff --git a/src/common/file_system.cpp b/src/common/file_system.cpp index 6a24732..a287703 100644 --- a/src/common/file_system.cpp +++ b/src/common/file_system.cpp @@ -1179,6 +1179,8 @@ bool FileSystem::DeleteDirectory(const char* Path, bool Recursive) std::string GetProgramPath() { + return "/emuelec/configs/duckstation"; + std::wstring buffer; buffer.resize(MAX_PATH); @@ -1549,6 +1551,8 @@ bool DeleteDirectory(const char* Path, bool Recursive) std::string GetProgramPath() { + return "/emuelec/configs/duckstation"; + #if defined(__linux__) static const char* exeFileName = "/proc/self/exe"; ================================================ FILE: packages/sx05re/emulators/duckstation/patches/002-path-getdirectory.patch ================================================ diff --git a/src/common/file_system.cpp b/src/common/file_system.cpp index ceb2f08..0fa5a04 100644 --- a/src/common/file_system.cpp +++ b/src/common/file_system.cpp @@ -683,6 +683,9 @@ std::string GetDisplayNameFromPath(const std::string_view& path) std::string_view GetPathDirectory(const std::string_view& path) { + + return "/emuelec/configs/duckstation"; + std::string::size_type pos = GetLastSeperatorPosition(path, false); if (pos == std::string_view::npos) return {}; ================================================ FILE: packages/sx05re/emulators/duckstation/patches/003-path-language.patch ================================================ diff --git a/src/duckstation-qt/qthostinterface.cpp b/src/duckstation-qt/qthostinterface.cpp index 8052278..4f338d7 100644 --- a/src/duckstation-qt/qthostinterface.cpp +++ b/src/duckstation-qt/qthostinterface.cpp @@ -137,7 +137,7 @@ void QtHostInterface::installTranslator() const QString language(QString::fromStdString(GetStringSettingValue("Main", "Language", "en"))); // install the base qt translation first - const QString base_dir(QStringLiteral("%1/translations").arg(qApp->applicationDirPath())); + const QString base_dir(QStringLiteral("%1/translations").arg("/emuelec/configs/duckstation")); const QString base_path(QStringLiteral("%1/qtbase_%2.qm").arg(base_dir).arg(language)); if (QFile::exists(base_path)) { ================================================ FILE: packages/sx05re/emulators/duckstation/patches/006-maxbuttons.patch ================================================ diff --git a/src/frontend-common/controller_interface.h b/src/frontend-common/controller_interface.h index f97d0f6..563b5f4 100644 --- a/src/frontend-common/sdl_controller_interface.h +++ b/src/frontend-common/sdl_controller_interface.h @@ -46,7 +46,7 @@ enum : int { MAX_NUM_AXES = 7, - MAX_NUM_BUTTONS = 16, + MAX_NUM_BUTTONS = 256, }; struct ControllerData ================================================ FILE: packages/sx05re/emulators/duckstation/scripts/duckstation.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) . /etc/profile LOCAL_CONFIG="/storage/.local/share" CONFIG_DIR="/emuelec/configs/duckstation" mkdir -p "${LOCAL_CONFIG}" if [ ! -d "${CONFIG_DIR}" ]; then mkdir -p "${CONFIG_DIR}" cp -rf "/usr/config/emuelec/configs/duckstation/*" "${CONFIG_DIR}" fi # If texture folder exists and not symlink, remove it and create symlink to textures folder in /storage/roms/psx/textures to enable texture replacement if [ ! -L "${CONFIG_DIR}/textures" ]; then rm -r "${CONFIG_DIR}/textures" ln -s /storage/roms/psx/textures "${CONFIG_DIR}" fi if [ ! -L "${LOCAL_CONFIG}/duckstation" ]; then rm -rf "${LOCAL_CONFIG}/duckstation" ln -sf "${CONFIG_DIR}" "${LOCAL_CONFIG}" fi AUTOGP=$(get_ee_setting duckstation_auto_gamepad) if [[ "${AUTOGP}" == "1" ]]; then set_duckstation_joy.sh fi duckstationcheevos.sh if [[ "${1}" == *"duckstation_gui.pbp"* ]]; then duckstation-nogui -fullscreen else duckstation-nogui -fullscreen -settings "${CONFIG_DIR}/settings.ini" -- "${1}" > /dev/null 2>&1 fi ================================================ FILE: packages/sx05re/emulators/duckstation/scripts/duckstationcheevos.sh ================================================ #! /bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Hector Calvarro (https://github.com/kelvfimer) #Script for setting up cheevos on duckstation emuelec. it extracts the data from emuelec.conf and it constructs the entries in seetings.ini if [Cheevos] or Enabled = True or Enable = False are not presented . /etc/profile # Extract username, password, and token username=$(get_ee_setting "global.retroachievements.username") password=$(get_ee_setting "global.retroachievements.password") token=$(grep "cheevos_token" /storage/.config/retroarch/retroarch.cfg | cut -d'"' -f2) # Path to DuckStation settings.ini DUCK_INI="/storage/.config/emuelec/configs/duckstation/settings.ini" # Get current date in milliseconds for LoginTimestamp datets=$(date +%s%N | cut -b1-13) # Check if the [Cheevos] section exists in the settings file zcheevos=$(grep -Fx "[Cheevos]" ${DUCK_INI}) # If the token is empty or invalid, do not proceed with enabling Cheevos if [[ -z "${token}" || "${token}" == *'"Success":false'* ]]; then token="" zcheevos="" # Remove the Cheevos section if token is invalid fi # Check if the [Cheevos] section is present, and add it if not if [[ -z "${zcheevos}" ]]; then # Add [Cheevos] section if not present { echo -e "[Cheevos]" echo "Enabled = true" echo "Username = ${username}" echo "Token = ${token}" echo "LoginTimestamp = ${datets}" } >> "${DUCK_INI}" else # If [Cheevos] section is present, update specific fields as needed # Update the Username field if grep -q "^Username = " "${DUCK_INI}"; then sed -i "/^\[Cheevos\]/,/^\[/{s/^Username = .*/Username = ${username}/;}" "${DUCK_INI}" else sed -i "/^\[Cheevos\]/a Username = ${username}" "${DUCK_INI}" fi # Update the Token field if grep -q "^Token = " "${DUCK_INI}"; then sed -i "/^\[Cheevos\]/,/^\[/{s/^Token = .*/Token = ${token}/;}" "${DUCK_INI}" else sed -i "/^\[Cheevos\]/a Token = ${token}" "${DUCK_INI}" fi # Update the LoginTimestamp field sed -i "/^\[Cheevos\]/,/^\[/{s/^LoginTimestamp = .*/LoginTimestamp = ${datets}/;}" "${DUCK_INI}" fi ================================================ FILE: packages/sx05re/emulators/duckstation/scripts/set_duckstation_joy.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2026-present Shanti Gilbert (https://github.com/shantigilbert) # 27/2/2026 modifications pmsobrado (https://github.com/pmsobrado) # 01/3/2026 minor modifications - Langerz82 (https://github.com/Langerz82) # Source predefined functions and variables . /etc/profile # duckstationjoy.sh - Convert SDL GameControllerDB mappings to DuckStation INI format # Usage: duckstationjoy.sh [OPTIONS] guid1 [guid2] [guid3] [guid4] source joy_common.sh "duckstation" OUTPUT_FILE="/emuelec/configs/duckstation/settings.ini" LAST_GUIDE_BUTTON="" # SDL_GameControllerButton enum values declare -A SDL_BUTTON_ENUM=( [a]=0 [b]=1 [x]=2 [y]=3 [back]=4 [select]=4 [guide]=5 [hotkeyenable]=5 [start]=6 [leftstick]=7 [leftthumb]=7 [rightstick]=8 [rightthumb]=8 [leftshoulder]=9 [rightshoulder]=10 [dpup]=11 [dpdown]=12 [dpleft]=13 [dpright]=14 ) # DuckStation button names - Xbox/Standard layout declare -A DUCKSTATION_BUTTONS=( [a]="ButtonCross" [b]="ButtonCircle" [x]="ButtonSquare" [y]="ButtonTriangle" [dpup]="ButtonUp" [dpdown]="ButtonDown" [dpleft]="ButtonLeft" [dpright]="ButtonRight" [leftshoulder]="ButtonL1" [rightshoulder]="ButtonR1" [leftstick]="ButtonL3" [leftthumb]="ButtonL3" [rightstick]="ButtonR3" [rightthumb]="ButtonR3" [start]="ButtonStart" [back]="ButtonSelect" [select]="ButtonSelect" ) # DuckStation button names - Nintendo layout (A/B and X/Y swapped) declare -A NINTENDO_LAYOUT_BUTTONS=( [a]="ButtonCircle" [b]="ButtonCross" [x]="ButtonTriangle" [y]="ButtonSquare" [dpup]="ButtonUp" [dpdown]="ButtonDown" [dpleft]="ButtonLeft" [dpright]="ButtonRight" [leftshoulder]="ButtonL1" [rightshoulder]="ButtonR1" [leftstick]="ButtonL3" [leftthumb]="ButtonL3" [rightstick]="ButtonR3" [rightthumb]="ButtonR3" [start]="ButtonStart" [back]="ButtonSelect" [select]="ButtonSelect" ) # DuckStation axis names declare -A DUCKSTATION_AXES=( [leftx]="AxisLeftX" [lefty]="AxisLeftY" [rightx]="AxisRightX" [righty]="AxisRightY" ) # Generate DuckStation config for one controller generate_config() { local controller_num="$1" local controller_order="$3" local mapping="$2" LAST_GUIDE_BUTTON="" [ -z "$mapping" ] && return 1 # Parse mapping: guid,name,key:value,key:value,... IFS=',' read -ra PARTS <<< "$mapping" local controller_name="${PARTS[1]}" # Choose button mapping based on controller type local -n BUTTON_MAP BUTTON_MAP=NINTENDO_LAYOUT_BUTTONS # BUTTON_MAP=DUCKSTATION_BUTTONS echo "[Controller${controller_order}]" echo "Type = AnalogController" echo "AnalogDPadInDigitalMode = true" local guide_button="" # Process each mapping element (skip first 2: guid and name) for ((i=2; i<${#PARTS[@]}; i++)); do local part="${PARTS[i]}" # Skip metadata [[ "$part" =~ ^(platform|crc|sdk): ]] && continue IFS=':' read -r key value <<< "$part" # Handle buttons if [[ "$value" =~ ^b([0-9]+)$ ]]; then # Triggers mapped as buttons -> convert to axes if [ "$key" = "lefttrigger" ]; then echo "ButtonL2 = Controller${controller_num}/+Axis4" elif [ "$key" = "righttrigger" ]; then echo "ButtonR2 = Controller${controller_num}/+Axis5" else local enum_value="${SDL_BUTTON_ENUM[$key]}" local duck_name="${BUTTON_MAP[$key]}" if [ -n "$enum_value" ] && [ -n "$duck_name" ]; then echo "$duck_name = Controller${controller_num}/Button${enum_value}" fi # Track guide/back button for hotkeys (prefer back) if [ "$key" = "guide" ]; then guide_button="$enum_value" LAST_GUIDE_BUTTON="$enum_value" elif ([ "$key" = "back" ] || [ "$key" = "select" ]) && [ -z "$guide_button" ]; then guide_button="$enum_value" LAST_GUIDE_BUTTON="$enum_value" fi fi # Handle axes elif [[ "$value" =~ ^a([0-9]+)$ ]]; then local axis_num="${BASH_REMATCH[1]}" if [ "$key" = "lefttrigger" ]; then echo "ButtonL2 = Controller${controller_num}/+Axis${axis_num}" elif [ "$key" = "righttrigger" ]; then echo "ButtonR2 = Controller${controller_num}/+Axis${axis_num}" else local duck_name="${DUCKSTATION_AXES[$key]}" [ -n "$duck_name" ] && echo "$duck_name = Controller${controller_num}/Axis${axis_num}" fi # Handle hats (D-pad) elif [[ "$value" =~ ^h([0-9]+)\.([0-9]+)$ ]]; then local enum_value="${SDL_BUTTON_ENUM[$key]}" local duck_name="${BUTTON_MAP[$key]}" if [ -n "$enum_value" ] && [ -n "$duck_name" ]; then echo "$duck_name = Controller${controller_num}/Button${enum_value}" fi fi done RUMBLE=$(get_ee_setting ee_rumble_strength) [[ -z "${RUMBLE}" ]] && RUMBLE=0 [[ "${RUMBLE}" -gt "0" ]] && echo "Rumble = Controller${controller_num}" } # Merge controller configs into existing settings.ini merge_controller_configs() { # Extract total indexes (before the -- separator) local player_order=() while [ "$1" != "--" ]; do player_order+=("$1") shift done shift local maincontroller="$1" shift local settings_file="$1" shift # Extract guide buttons (before the -- separator) local guide_buttons=() while [ "$1" != "--" ]; do guide_buttons+=("$1") shift done shift local temp_configs=("$@") local temp_output=$(mktemp) local current_section="" local skip_section=false # Build list of controller sections we're replacing local controller_sections=() for i in "${!temp_configs[@]}"; do controller_sections+=("[Controller$(( ${player_order[i]} + 1 ))") done # Read existing settings.ini, skip controller and hotkey sections we're replacing while IFS= read -r line || [ -n "$line" ]; do if [[ "$line" =~ ^\[.*\]$ ]]; then current_section="$line" skip_section=false # Skip controller sections we're replacing for section in "${controller_sections[@]}"; do [ "$current_section" = "$section" ] && skip_section=true && break done # Skip old [Hotkeys] section [ "$current_section" = "[Hotkeys]" ] && skip_section=true [ "$skip_section" = false ] && echo "$line" >> "$temp_output" elif [ "$skip_section" = false ]; then echo "$line" >> "$temp_output" fi done < "$settings_file" # Append new controller configurations for i in "${!temp_configs[@]}"; do if (( i != 0 )); then echo -e "\n" >> "$temp_output" fi cat "${temp_configs[$i]}" >> "$temp_output" done # Add single [Hotkeys] section echo -e "\n" >> "$temp_output" echo "[Hotkeys]" >> "$temp_output" [ -n "${guide_buttons[0]}" ] && echo "OpenQuickMenu = Controller${maincontroller}/Button${guide_buttons[0]}" >> "$temp_output" mv "$temp_output" "$settings_file" } # Main script main() { local guids=() # Capture GUIDs into a variable detected_guids=$(gamepad_info 2>/dev/null | grep -oP '^[0-9a-f]{32}' | head -n4) # Use mapfile to convert the result into an array mapfile -t guids <<< "$detected_guids" # Find settings file local settings_file="" settings_file="$OUTPUT_FILE" # Generate controller configs local temp_configs=() local guide_buttons=() local player_order=($( jc_get_order_indexes 8 "${guids[@]}")) for i in {1..8}; do jc_wipe_config_sub_heading "${settings_file}" "[Controller${i}]" done for i in "${!guids[@]}"; do local guid="${guids[$i]}" local mapping=$(gamepad_info 2>/dev/null | grep "^$guid" | head -n1) if [ -z "$mapping" ]; then echo "Warning: No mapping found for GUID: $guid" >&2 continue fi local temp_file=$(mktemp) local order=$(( ${player_order[i]} + 1 )) generate_config "$i" "$mapping" "$order" > "$temp_file" temp_configs+=("$temp_file") guide_buttons+=("$LAST_GUIDE_BUTTON") done [ ${#temp_configs[@]} -eq 0 ] && echo "Error: No valid configurations generated" >&2 && exit 1 merge_controller_configs "${player_order[@]}" -- "${player_order[0]}" "$settings_file" "${guide_buttons[@]}" -- "${temp_configs[@]}" # Cleanup rm -f "${temp_configs[@]}" } main "$@" ================================================ FILE: packages/sx05re/emulators/ecwolf/config/ecwolf.cfg ================================================ BaseDataPaths = ".;$PROGDIR;/storage/roms/ports/ecwolf;/storage/roms/ports/ecwolf/spear;/storage/roms/ports/ecwolf/ark"; FullScreenWidth = 640; FullScreenHeight = 480; WindowedScreenWidth = 640; WindowedScreenHeight = 480; ================================================ FILE: packages/sx05re/emulators/ecwolf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="ecwolf" PKG_VERSION="601d5b2a0f12b7491205d311ca462c3fcf6ada21" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/ECWolfEngine/ECWolf" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_mixer SDL2_net ecwolf:host" PKG_DEPENDS_HOST="SDL2:host SDL2_mixer:host SDL2_net:host" PKG_LONGDESC="ECWolf is a port of the Wolfenstein 3D engine based of Wolf4SDL. It combines the original Wolfenstein 3D engine with the user experience of ZDoom to create the most user and mod author friendly Wolf3D source port." PKG_TOOLCHAIN="cmake-make" pre_build_host() { HOST_CMAKE_OPTS="" } make_host() { cmake . -DNO_GTK=ON -DSDL2_mixer_LIBRARIES=${TOOLCHAIN}/lib/libSDL2_mixer.so -DSDL2_mixer_INCLUDE_DIRS=${TOOLCHAIN}/include/SDL2 make } makeinstall_host() { : #no } pre_configure_target() { PKG_CMAKE_OPTS_TARGET=" -DNO_GTK=ON \ -DFORCE_CROSSCOMPILE=ON \ -DIMPORT_EXECUTABLES=${PKG_BUILD}/.${HOST_NAME}/ImportExecutables.cmake -DCMAKE_BUILD_TYPE=Release" cd ${PKG_BUILD}/deps/gdtoa ${HOST_CC} -o rithchk arithchk.c -Wall -Wextra ./rithchk > ${PKG_BUILD}/deps/gdtoa/arith.h ${HOST_CC} -o qnan qnan.c -Wall -Wextra ./qnan > ${PKG_BUILD}/deps/gdtoa/gd_qnan.h cd ${PKG_BUILD} } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/ecwolf ${INSTALL}/usr/bin/ecwolf cp ${PKG_DIR}/scripts/ecwolf.sh ${INSTALL}/usr/bin/ecwolf.sh mkdir -p ${INSTALL}/usr/config/emuelec/configs/ecwolf cp ${PKG_BUILD}/ecwolf.pk3 ${INSTALL}/usr/config/emuelec/configs/ecwolf/ecwolf.pk3 cp ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/ecwolf/ } ================================================ FILE: packages/sx05re/emulators/ecwolf/patches/ecwolf-001-add-video-modes.patch ================================================ --- a/src/sdlvideo.cpp 2021-03-11 13:47:06.522533113 -0600 +++ a/src/sdlvideo.cpp 2021-03-11 13:49:59.262707940 -0600 @@ -388,6 +388,7 @@ { 400, 225 }, // 16:9 { 400, 300 }, { 480, 270 }, // 16:9 + { 480, 320 }, // 3:2 { 480, 360 }, { 512, 288 }, // 16:9 { 512, 384 }, @@ -402,6 +403,7 @@ { 800, 500 }, // 16:10 { 800, 600 }, { 848, 480 }, // 16:9 + { 854, 480 }, // 16:9 { 960, 600 }, // 16:10 { 960, 720 }, { 1024, 576 }, // 16:9 ================================================ FILE: packages/sx05re/emulators/ecwolf/patches/ecwolf-002-add-exit-menu.patch ================================================ diff --git a/src/wl_play.cpp b/src/wl_play.cpp index 551f0fb..afd0d38 100644 --- a/src/wl_play.cpp +++ b/src/wl_play.cpp @@ -101,6 +101,7 @@ ControlScheme controlScheme[] = { bt_automap, "Automap", -1, -1, -1, CS_AxisDigital, 0 }, { bt_showstatusbar, "Show Status", -1, sc_Tab, -1, CS_AxisDigital, 0 }, { bt_pause, "Pause", -1, sc_Pause, -1, CS_AxisDigital, 0 }, + { bt_esc, "Escape Game", -1, sc_Escape, -1, CS_AxisDigital, 0 }, // End of List { bt_nobutton, NULL, -1, -1, -1, CS_AxisDigital, 0 } ================================================ FILE: packages/sx05re/emulators/ecwolf/scripts/ecwolf.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) . /etc/profile # We cd into this directory before starting ecwolf RUN_DIR="/emuelec/configs/ecwolf" CONFIG_DIR="/emuelec/configs/ecwolf" CONFIG_FILE="${CONFIG_DIR}/ecwolf.cfg" params=" --config ${CONFIG_FILE} --savedir ${CONFIG_DIR}" case $(oga_ver) in "OGS") params+=" --res 854 480 --fullscreen --aspect 16:9" ;; "OGA") params+=" --res 480 320 --fullscreen --aspect 3:2" ;; "GF") params+=" --res 640 480 --fullscreen --aspect 4:3" ;; *) params+=" --fullscreen --aspect 16:9" ;; esac # data can be SD2 SD3 SOD WL6 or N3D and it's passed as the ROM DATA=${1#*.} # If its a mod (extension .ecwolf) read the file and parse the data if [ ${DATA} == "ecwolf" ]; then while IFS== read -r key value; do if [ "${key}" == "SUBDIR" ]; then RUN_DIR="/storage/roms/ports/ecwolf/${value}" # ecwolf does not work without ecwolf.pk3 in the current directory # so we have to copy it there if it not already exists if [ ! -f ${RUN_DIR}/ecwolf.pk3 ]; then cp ${CONFIG_DIR}/ecwolf.pk3 ${RUN_DIR} fi fi if [ "${key}" == "PARAMS" ]; then params+=" ${value}" fi done < <(<"${1}" tr -d '\r'; echo;) else params+=" --data ${DATA}" fi # There are mods which have the same files as the original games, so you have # to put them in subdirectories. ecwolf on the other side has no command line # parameter to switch to such a subdir, so you have to cd into that dir first. cd "${RUN_DIR}" # Do not overwrite log messages already written by emuelecRunEmu.sh ecwolf ${params} >> /emuelec/logs/emuelec.log 2>&1 ================================================ FILE: packages/sx05re/emulators/eka2l1/config/eka.gptk ================================================ # EKA2L1 gptokeyb configuration. # I N S T R U C T I O N S : # # The correct filepath for this file is: /storage/.config/eka2l1/gptk/eka.gptk # #----------------------------------------------------------------------------------------------------------------------- # # EKA2L1 gptokeyb configuration. # # Keyboard bindings in eka2l1: # Arrow Keys -> D-pad # Enter -> OK / Select # F1 / F2 -> Left / Right Softkey # F3 / F4 -> Green (Call) / Red (End) # Backspace -> Backspace # Escape -> End key back = escape start = backspace a = enter b = f4 y = f3 l1 = f1 r1 = f2 up = up down = down left = left right = right left_analog_up = up left_analog_down = down left_analog_left = left left_analog_right = right ================================================ FILE: packages/sx05re/emulators/eka2l1/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 PKG_NAME="eka2l1" PKG_VERSION="d2e7abb191bf41ffa1413100154590e0930aebfa" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/AveyondFly/EKA2L1" PKG_URL="${PKG_SITE}.git" PKG_GIT_CLONE_BRANCH="master" PKG_GIT_SUBMODULES="yes" PKG_DEPENDS_TARGET="toolchain SDL2 freetype zlib" PKG_SECTION="emuelec/emulators" PKG_SHORTDESC="Symbian OS / N-Gage emulator for aarch64 Linux" PKG_TOOLCHAIN="cmake" PKG_BUILD_FLAGS="-lto" PKG_CMAKE_OPTS_TARGET=" -DCMAKE_BUILD_TYPE=Release -DEKA2L1_BUILD_TESTS=OFF -DEKA2L1_BUILD_SDL2_FRONTEND=ON " pre_configure_target() { sed -i '/add_subdirectory(qt)/d' ${PKG_BUILD}/src/emu/CMakeLists.txt sed -i '/target_include_directories(buildvm/d' ${PKG_BUILD}/src/external/CMakeLists.txt sed -i '/add_subdirectory(programs)/d' ${PKG_BUILD}/src/external/mbedtls/CMakeLists.txt sed -i '/add_subdirectory(tests)/d' ${PKG_BUILD}/src/external/mbedtls/CMakeLists.txt echo "// stub" > ${PKG_BUILD}/src/emu/drivers/src/graphics/backend/context_glx.cpp echo "// stub" > ${PKG_BUILD}/src/emu/drivers/src/graphics/backend/vulkan/graphics_vulkan.cpp cat > ${PKG_BUILD}/src/external/ffmpeg/CMakeLists.txt << 'EOF' if (NOT DEFINED FFMPEG_CORE_NAME) set(FFMPEG_CORE_NAME ffmpeg) endif() add_library(${FFMPEG_CORE_NAME} INTERFACE) target_include_directories(${FFMPEG_CORE_NAME} INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include") target_link_libraries(${FFMPEG_CORE_NAME} INTERFACE avformat avcodec avutil swscale swresample z) EOF } make_target() { BUILD_DIR="${PKG_BUILD}/.aarch64-libreelec-linux-gnu" LUAJIT_SRC="${PKG_BUILD}/src/external/luajit/src" LUAJIT_CMAKE_BUILD="${BUILD_DIR}/src/external/luajit-cmake" MINILUA_BIN="${LUAJIT_CMAKE_BUILD}/minilua/minilua" BUILDVM_BIN="${LUAJIT_CMAKE_BUILD}/buildvm/buildvm" cd "${BUILD_DIR}" ninja minilua || true gcc "${LUAJIT_SRC}/host/minilua.c" -o "${MINILUA_BIN}" -lm ninja -t restat ninja buildvm || true gcc \ -I"${LUAJIT_SRC}" \ -I"${LUAJIT_CMAKE_BUILD}" \ -DLUAJIT_TARGET=LUAJIT_ARCH_arm64 \ -DLJ_ARCH_HASFPU=1 \ -DLJ_ABI_SOFTFP=0 \ -DLUAJIT_NUMMODE=2 \ "${LUAJIT_SRC}/host/buildvm.c" \ "${LUAJIT_SRC}/host/buildvm_asm.c" \ "${LUAJIT_SRC}/host/buildvm_fold.c" \ "${LUAJIT_SRC}/host/buildvm_lib.c" \ "${LUAJIT_SRC}/host/buildvm_peobj.c" \ -o "${BUILDVM_BIN}" -lm ninja -t restat ninja ${NINJA_OPTS} ${PKG_MAKE_OPTS_TARGET} } makeinstall_target() { BUILD_DIR="${PKG_BUILD}/.aarch64-libreelec-linux-gnu" mkdir -p "${INSTALL}/usr/bin/eka2l1" cp -a "${BUILD_DIR}/bin/." "${INSTALL}/usr/bin/eka2l1/" chmod +x "${INSTALL}/usr/bin/eka2l1/eka2l1_sdl2" cp "${PKG_DIR}/scripts/ekastart.sh" "${INSTALL}/usr/bin/ekastart.sh" chmod +x "${INSTALL}/usr/bin/ekastart.sh" mkdir -p "${INSTALL}/usr/config/emuelec/configs/eka2l1/gptk" cp -f "${PKG_DIR}/config/eka.gptk" "${INSTALL}/usr/config/emuelec/configs/eka2l1/gptk/eka.gptk" } ================================================ FILE: packages/sx05re/emulators/eka2l1/scripts/ekastart.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2026-present worstcase_scenario (https://github.com/worstcase-scenario) . /etc/profile # --------------------------------------------------------------------- # Paths / defaults # --------------------------------------------------------------------- EKA_EXE="/usr/bin/eka2l1/eka2l1_sdl2" EKA_CONFIG_DIR="/storage/.config/eka2l1" EKA_DATA_DIR="${EKA_CONFIG_DIR}/data" EKA_DRIVES_DIR="${EKA_DATA_DIR}/drives" EKA_E_DIR="${EKA_DRIVES_DIR}/e" EKA_GPTK="/storage/.config/emuelec/configs/eka2l1/gptk/eka.gptk" EKA_LOG="/emuelec/logs/eka2l1.log" EKA_DEVICE_NGAGE1="${EKA_DEVICE_NGAGE1:-NEM-4}" EKA_DEVICE_NGAGE1_ALT="${EKA_DEVICE_NGAGE1_ALT:-RH-29}" EKA_DEVICE_NGAGE2="${EKA_DEVICE_NGAGE2:-RM-409}" ROMFILE="$1" LAUNCH_MODE="games" APP_RUN="" DEVICE_CODE="${EKA_DEVICE_NGAGE2}" CLASSIC_NGAGE=0 CLEANUP_DONE=0 mkdir -p "$(dirname "${EKA_LOG}")" echo "EmuELEC eka2l1 Log" > "${EKA_LOG}" log() { echo "$*" >> "${EKA_LOG}"; } device_installed() { local dev="$1" [ -z "${dev}" ] && return 1 "${EKA_EXE}" --listdevices 2>/dev/null | grep -Fq "(${dev})" } select_ngage1_device() { if device_installed "${EKA_DEVICE_NGAGE1}"; then echo "${EKA_DEVICE_NGAGE1}" elif device_installed "${EKA_DEVICE_NGAGE1_ALT}"; then echo "${EKA_DEVICE_NGAGE1_ALT}" else echo "${EKA_DEVICE_NGAGE1}" fi } # --------------------------------------------------------------------- # N-Gage 1 app name lookup table # Key: lowercase game folder name (without .ngage) # Value: exact --run name for eka2l1 # --------------------------------------------------------------------- get_run_name() { local key key="$(echo "$1" | tr '[:upper:]' '[:lower:]')" case "${key}" in "ashen") echo "Ashen" ;; "asphalt: urban gt 2"|"asphalt urban gt 2") echo "Asphalt 2" ;; "asphalt: urban gt"|"asphalt urban gt") echo "Asphalt" ;; "atari masterpieces vol. 1"|"atari masterpieces vol 1") echo "Atari MP Vol I" ;; "atari masterpieces vol. ii"|"atari masterpieces vol ii") echo "Atari MP Vol II" ;; "bomberman") echo "Bomberman" ;; "call of duty") echo "CallofDuty" ;; "catan") echo "Catan" ;; "civilization") echo "Civilization" ;; "colin mcrae rally 2005") echo "colin mcrae rally 2005" ;; "crash nitro kart") echo "CrashNitroKart" ;; "fifa football 2005"|"fifa 2005") echo "FIFA 2005" ;; "fifa soccer 2004"|"fifa 2004") echo "FIFA 2004" ;; "glimmerati") echo "Glimmerati" ;; "high seize") echo "High Seize" ;; "mlb slam!"|"mlb slam") echo "MLB Slam!" ;; "marcel desailly pro soccer") echo "MarcelDesaillyProSoccer" ;; "mile high pinball") echo "Mile High" ;; "motogp") echo "MotoGP" ;; "ncaa football 2004") echo "NCAA®" ;; "one") echo "ONE" ;; "operation shadow") echo "Operation Shadow" ;; "pandemonium!") echo "Pandemonium" ;; "pathway to glory") echo "Pathway to Glory" ;; "pathway to glory: ikusa islands"|"ikusa islands") echo "Ikusa Islands" ;; "payload") echo "Payload" ;; "pocket kingdom: own the world"|"pocket kingdom") echo "PKingdom" ;; "puyo pop") echo "Puyo Pop" ;; "puzzle bobble vs") echo "PuzzleBobbleVS" ;; "rayman 3") echo "Rayman 3" ;; "red faction") echo "RedFaction" ;; "requiem of hell") echo "Requiem of Hell" ;; "rifts: promise of power"|"rifts") echo "RIFTS" ;; "ssx: out of bounds"|"ssx out of bounds"|"ssx") echo "SSX" ;; "sega rally championship") echo "SegaRally" ;; "snakes") echo "Snakes" ;; "sonicn") echo "SonicN" ;; "spider-man 2"|"spiderman 2") echo "SM 2" ;; "super monkey ball") echo "supermonkeyball" ;; "system rush") echo "System Rush" ;; "the elder scrolls travels: shadowkey"|"shadowkey") echo "Elder Scrolls" ;; "the king of fighters: extreme"|"kof extreme") echo "KOF EXTREME" ;; "the roots: gates of chaos"|"the roots") echo "The Roots" ;; "the sims: bustin' out"|"the sims bustin out") echo "The Sims Bustin' Out" ;; "tiger woods pga tour 2004") echo "TW 2004" ;; "tom clancy's ghost recon: jungle storm"|"ghost recon") echo "GhostRecon" ;; "tom clancy's splinter cell: chaos theory") echo "SplinterCell" ;; "tom clancy's splinter cell: team stealth action"|"splinter cell") echo "Splinter Cell" ;; "tomb raider: starring lara croft"|"tomb raider") echo "Tomb Raider" ;; "tony hawk's pro skater") echo "Tony Hawk's Pro Skater" ;; "virtua cop") echo "Virtua Cop" ;; "virtua tennis") echo "virtuatennis" ;; "wwe: aftershock"|"wwe aftershock"|"wwe") echo "WWE" ;; "warhammer 40,000: glory in death"|"warhammer 40000") echo "WH40K" ;; "worms: world party"|"worms world party") echo "WWP" ;; "x-men legends ii: rise of apocalypse"|"x-men legends ii") echo "XMLII" ;; "x-men legends") echo "XMen™" ;; "xanadu next") echo "XanaduNEXT" ;; *) echo "" ;; esac } CLASSIC_APP_DST="" CLASSIC_APP_SRC="" save_classic_state() { [ -z "${CLASSIC_APP_DST}" ] && return [ ! -d "${CLASSIC_APP_DST}" ] && return [ -z "${CLASSIC_APP_SRC}" ] && return log "Syncing saves back to: ${CLASSIC_APP_SRC}" find "${CLASSIC_APP_DST}" -type f | while read -r DST_FILE; do REL="${DST_FILE#${CLASSIC_APP_DST}/}" SRC_FILE="${CLASSIC_APP_SRC}/${REL}" if [ ! -f "${SRC_FILE}" ] || [ "${DST_FILE}" -nt "${SRC_FILE}" ]; then mkdir -p "$(dirname "${SRC_FILE}")" cp -a "${DST_FILE}" "${SRC_FILE}" log " Saved: ${REL}" fi done } cleanup() { [ "${CLEANUP_DONE}" = "1" ] && return CLEANUP_DONE=1 save_classic_state if [ -n "${CLASSIC_APP_DST}" ] && [ -d "${CLASSIC_APP_DST}" ]; then log "Removing ${CLASSIC_APP_DST} from e:/system/apps/" rm -rf "${CLASSIC_APP_DST}" fi killall -9 gptokeyb 2>/dev/null } trap cleanup EXIT INT TERM HUP # --------------------------------------------------------------------- # Sanity check # --------------------------------------------------------------------- if [ ! -d "${EKA_DATA_DIR}" ]; then log "ERROR: eka2l1 not set up. Please run EKA_INSTALL first." exit 1 fi mkdir -p "${EKA_DRIVES_DIR}" "${EKA_E_DIR}" # --------------------------------------------------------------------- # Detect launch mode # --------------------------------------------------------------------- if [ -n "${ROMFILE}" ]; then if [ -f "${ROMFILE}" ]; then case "${ROMFILE##*.}" in uid|UID) APP_UID="$(tr -d '\r\n[:space:]' < "${ROMFILE}")" if [ -n "${APP_UID}" ]; then case "${APP_UID}" in 0x*|0X*) ;; *) APP_UID="0x${APP_UID}" ;; esac LAUNCH_MODE="uid" DEVICE_CODE="$(select_ngage1_device)" log "UID launcher: ${APP_UID}" log "UID device selected: ${DEVICE_CODE}" fi ;; esac elif [ -d "${ROMFILE}" ]; then case "${ROMFILE}" in *.ngage|*.NGAGE) CLASSIC_NGAGE=1 LAUNCH_MODE="classic" DEVICE_CODE="$(select_ngage1_device)" log "Classic N-Gage device selected: ${DEVICE_CODE}" GAME_FOLDER="$(basename "${ROMFILE}")" GAME_ID="${GAME_FOLDER%.ngage}" GAME_ID="${GAME_ID%.NGAGE}" SIDECAR="${ROMFILE%/}.name" if [ -f "${SIDECAR}" ]; then APP_RUN="$(tr -d '\r\n' < "${SIDECAR}")" log "App name from sidecar: ${APP_RUN}" else APP_RUN="$(get_run_name "${GAME_ID}")" if [ -z "${APP_RUN}" ]; then APP_RUN="$(echo "${GAME_ID}" | sed 's/\b\(.\)/\u\1/g')" log "App name from folder (fallback): ${APP_RUN}" else log "App name from lookup table: ${APP_RUN}" fi fi APP_FOLDER="$(ls "${ROMFILE}/system/apps/" 2>/dev/null | head -1)" if [ -n "${APP_FOLDER}" ]; then SRC="${ROMFILE}/system/apps/${APP_FOLDER}" DST="${EKA_E_DIR}/system/apps/${APP_FOLDER}" log "Installing ${APP_FOLDER} into e:/system/apps/" mkdir -p "${EKA_E_DIR}/system/apps" rm -rf "${DST}" cp -a "${SRC}" "${DST}" CLASSIC_APP_DST="${DST}" CLASSIC_APP_SRC="${SRC}" else log "ERROR: No app folder found in ${ROMFILE}/system/apps/" exit 1 fi ;; esac fi fi # --------------------------------------------------------------------- # gptokeyb # --------------------------------------------------------------------- killall -9 gptokeyb 2>/dev/null gptokeyb 1 eka2l1_sdl2 -c "${EKA_GPTK}" & sleep 1 cd "${EKA_CONFIG_DIR}" || exit 1 # --------------------------------------------------------------------- # Launch # --------------------------------------------------------------------- if [ "${LAUNCH_MODE}" = "uid" ]; then log "Launching UID ${APP_UID} on ${DEVICE_CODE}" CUBEB_BACKEND=alsa "${EKA_EXE}" --device "${DEVICE_CODE}" --app "${APP_UID}" >> "${EKA_LOG}" 2>&1 elif [ "${LAUNCH_MODE}" = "classic" ]; then log "Launching classic N-Gage: --run \"${APP_RUN}\" on ${DEVICE_CODE}" CUBEB_BACKEND=alsa "${EKA_EXE}" --device "${DEVICE_CODE}" --run "${APP_RUN}" >> "${EKA_LOG}" 2>&1 else log "Launching N-Gage 2.0 Games app on ${DEVICE_CODE}" CUBEB_BACKEND=alsa "${EKA_EXE}" --device "${DEVICE_CODE}" --app Games >> "${EKA_LOG}" 2>&1 fi ================================================ FILE: packages/sx05re/emulators/fbneoSA/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="fbneoSA" PKG_VERSION="47f12dd9296d4297b1d3daec3e91c4d3d2c0f80a" PKG_ARCH="aarch64" PKG_LICENSE="Custom" PKG_SITE="https://github.com/finalburnneo/FBNeo" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 gl4es" PKG_LONGDESC="https://github.com/finalburnneo/FBNeo/blob/master/src/license.txt" GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="make" PKG_MAKE_OPTS_TARGET=" sdl2 RELEASEBUILD=1" pre_configure_target() { sed -i "s|\`sdl2-config|\`${SYSROOT_PREFIX}/usr/bin/sdl2-config|g" makefile.sdl2 sed -i "s|objdir = obj/|objdir = ${PKG_BUILD}/obj/|" makefile.sdl2 sed -i "s|srcdir = src/|srcdir = ${PKG_BUILD}/src/|" makefile.sdl2 sed -i "s|CC = gcc|#CC = gcc|" makefile.sdl2 export LDFLAGS+=" -L$(get_install_dir gl4es)/usr/lib" unset MAKELEVEL } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -rf ${PKG_BUILD}/fbneo ${INSTALL}/usr/bin cp -rf ${PKG_BUILD}/src/license.txt ${INSTALL}/usr/bin/fbneo_license.txt cp -rf ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emulators/fbneoSA/patches/fbneoSA-EmuELEC-rom-path.patch ================================================ --- a/src/burner/sdl/drv.cpp 2022-01-22 01:27:13.278967632 -0600 +++ b/src/burner/sdl/drv.cpp 2022-01-22 01:24:57.509794634 -0600 @@ -3,7 +3,7 @@ #include "neocdlist.h" int bDrvOkay = 0; // 1 if the Driver has been initted okay, and it's okay to use the BurnDrv functions -char szAppRomPaths[DIRS_MAX][MAX_PATH] = { { "/usr/local/share/roms/" }, { "roms/" }, }; +char szAppRomPaths[DIRS_MAX][MAX_PATH] = { { "/storage/roms/mame/" }, { "/storage/roms/fbneo/" }, { "/storage/roms/neogeo/" }, }; static bool bSaveRAM = false; ================================================ FILE: packages/sx05re/emulators/fbneoSA/scripts/fbneo.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile add_player_hat() { local pl=${1} local pf="/storage/.local/share/fbneo/config/p${pl}defaults.ini" if [ ! -f "${pf}" ]; then echo "version 0x100003" > ${pf} echo "macro \"P${pl} Up\" switch 0x4012" >> ${pf} echo "macro \"P${pl} Down\" switch 0x4013" >> ${pf} echo "macro \"P${pl} Left\" switch 0x4010" >> ${pf} echo "macro \"P${pl} Right\" switch 0x4011" >> ${pf} fi } mkdir -p /emuelec/configs/fbneo/config mkdir -p /storage/.local/share if [ -d "/storage/.local/share/fbneo/" ]; then mv -f /storage/.local/share/fbneo/* /emuelec/configs/fbneo rm -rf /storage/.local/share/fbneo ln -sf /emuelec/configs/fbneo /storage/.local/share/fbneo fi if [ ! -L "/storage/.local/share/fbneo" ]; then ln -sf /emuelec/configs/fbneo /storage/.local/share/fbneo fi add_player_hat 1 add_player_hat 2 add_player_hat 3 add_player_hat 4 # TODO: Allow settings from ES #case "$@" in #EXTRAOPTS= if [ "${2}" == "NCD" ]; then echo . > /dev/null #EXTRAOPTS=CDOPTS? fi ROM=$(basename -- "${1}") ROM="${ROM%.*}" DIR=$(dirname ${1}) sed -i "s|szAppRomPaths\[0\].*|szAppRomPaths\[0\] ${DIR}/|" /emuelec/configs/fbneo/config/fbneo.ini export LIBGL_NOBANNER=1 export LIBGL_SILENTSTUB=1 fbfix $( emuelec-utils getmainfb ) fbneo -joy -fullscreen "${ROM}" ${EXTRAOPTS} >> /emuelec/logs/emuelec.log 2>&1 ================================================ FILE: packages/sx05re/emulators/flycast-dojo/config/emu.cfg ================================================ [Dolphin Blue] config.aica.LimitFPS = yes config.pvr.AutoSkipFrame = 2 config.rend.Resolution = 480 [alsa] device = auto [audio] backend = auto [config] BoxartDisplayMode = yes Debug.GDBEnabled = no Debug.GDBPort = 3263 Debug.GDBWaitForConnection = no Debug.SerialConsoleEnabled = no Debug.SerialPTY = no Dreamcast.AutoLoadState = no Dreamcast.AutoSaveState = no Dreamcast.Broadcast = 0 Dreamcast.Cable = 3 Dreamcast.ContentPath = /storage/roms/atomiswave;/storage/roms/dreamcast;/storage/roms/naomi Dreamcast.ForceWindowsCE = no Dreamcast.FullMMU = no Dreamcast.HideLegacyNaomiRoms = no Dreamcast.Language = 1 Dreamcast.Region = 1 Dreamcast.SavestateSlot = 0 Dynarec.Enabled = yes Dynarec.idleskip = yes FastGDRomLoad = yes FetchBoxart = yes ForceFreePlay = yes Profiler.DrawGUI = no Profiler.Enabled = no Profiler.FrameWarningTime = 0.018182 Profiler.OutputTTY = no RecSlotFile = 0 SOCDResolution = 1 ShowEjectDisk = no UploadCrashLogs = yes UseReios = no aica.AutoLatency = yes aica.BufferSize = 1014 aica.DSPEnabled = no aica.LimitFPS = yes aica.Volume = 100 pvr.AutoSkipFrame = 2 pvr.MaxThreads = 2 pvr.rend = 0 rend.AnisotropicFiltering = 1 rend.CrossHairColor1 = 0 rend.CrossHairColor2 = 0 rend.CrossHairColor3 = 0 rend.CrossHairColor4 = 0 rend.CustomTextures = no rend.DelayFrameSwapping = no rend.DumpTextures = no rend.DupeFrames = yes rend.EmulateFramebuffer = no rend.ExtraDepthScale = 1.000000 rend.FixUpscaleBleedingEdge = yes rend.FixedFrequency = 0 rend.FixedFrequencyThreadSleep = no rend.FloatVMUs = no rend.Fog = yes rend.MaxFilteredTextureSize = 256 rend.ModifierVolumes = yes rend.NativeDepthInterpolation = no rend.PerPixelLayers = 16 rend.PerStripSorting = yes rend.PixelBufferSize = 536870912 rend.RenderToTextureBuffer = no rend.Resolution = 480 rend.Rotate90 = no rend.ScreenStretching = 100 rend.ShowFPS = yes rend.SuperWideScreen = no rend.TextureFiltering = 0 rend.TextureUpscale = 1 rend.ThreadedRendering = yes rend.TranslucentPolygonDepthMask = no rend.UseMipmaps = yes rend.WideScreen = no rend.WidescreenGameHacks = no rend.vsync = no ta.skip = 0 [dojo] ActAsServer = yes BufferAutoResume = yes CopyMissingSharedMem = yes CustomOutputStreamTxt = no Debug = 8 DefaultRelayPort = 8001 Delay = 0 DojoProtoCall = Enable = no EnableBackfill = yes EnableLobby = no EnableMatchCode = yes EnableMemRestore = no EnablePlayerNameOverlay = yes EnableSessionQuickLoad = no EnableTrainingLua = yes FirstTo = 0 ForceRealBios = no GameName = HideKey = no HideRandomInputSlot = yes HostJoinSelect = no IgnoreNetSave = no LaunchReplay = no LobbyMulticastAddress = 224.1.10.1 LobbyMulticastPort = 52001 MatchCode = MatchmakingServerAddress = match.dojo.ooo MatchmakingServerPort = 52001 MultiOutputStreamTxt = no MultiOutputStreamTxtIdx = 4 MultiOutputStreamTxtMax = 4 NetCustomVmu = no NetSaveBase = https://github.com/blueminder/flycast-netplay-savestates/raw/main/ NetStartVerifyRoms = no NetplayMethod = GGPO NumBackFrames = 3 OpponentName = Opponent OutputStreamTxt = no PacketsPerFrame = 3 PlayerName = Player PlayerSwitched = no Quark = Receiving = no RecordMatches = no RecordOnFirstInput = no Relay = no RelayAddressHistory = us-west-1.match.dojo.ooo;us-east-1.match.dojo.ooo;chl-1.match.dojo.ooo;bra-1.match.dojo.ooo;esp-1.match.dojo.ooo;fin-1.match.dojo.ooo;kor-1.match.dojo.ooo;aus-1.match.dojo.ooo;match.dojo.ooo RelayKey = ReplayFilename = RxFrameBuffer = 1800 ServerIP = 127.0.0.1 ServerPort = 6000 ServiceTransmitOnly = yes ShowInputDisplay = yes ShowPlaybackControls = yes ShowPublicIP = no ShowReplayInputDisplay = no ShowTrainingGameOverlay = yes SpectateKey = Spectating = no SpectatorIP = match.dojo.ooo SpectatorPort = 7000 TestGame = no Training = no TransmitScore = no Transmitting = yes UpdateChannel = stable UseAnimeInputNotation = no [input] EnableDiagonalCorrection = no EnableMouseCaptureToggle = 0 MouseSensitivity = 100 VirtualGamepadVibration = 20 device1 = 0 device1.1 = 1 device1.2 = 3 device2 = 0 device2.1 = 1 device2.2 = 3 device3 = 10 device3.1 = 10 device3.2 = 10 device4 = 10 device4.1 = 10 device4.2 = 10 maple_sdl_joystick_0 = 0 maple_sdl_keyboard = 0 maple_sdl_mouse = 0 [network] ActAsServer = no DNS = 46.101.91.123 EmulateBBA = no Enable = no EnableUPnP = yes EnableWinFWPolicy = yes GGPO = no GGPOAnalogAxes = 0 GGPOChat = no GGPOChatTimeout = 10 GGPOChatTimeoutToggle = no GGPOChatTimeoutToggleSend = no GGPODelay = 0 GGPOPort = 19713 GGPORemotePort = 19713 LocalPort = 37391 NetworkOutput = no Stats = yes server = [validate] OpenGlChecks = no [window] fullscreen = yes height = 480 left = 536805376 maximized = no top = 536805376 width = 640 ================================================ FILE: packages/sx05re/emulators/flycast-dojo/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2025-present DiegroSan (https://github.com/Diegrosan) PKG_NAME="flycast-dojo" PKG_VERSION="d0e47e572b1e7b355e88bda8308c89d0c5156cbf" #6.53+ PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/blueminder/flycast-dojo" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain ${OPENGLES} alsa SDL2 libzip zip asio vksdl " PKG_LONGDESC="flycast-dojo is a multiplatform Sega Dreamcast, Naomi and Atomiswave emulator" PKG_TOOLCHAIN="cmake" PKG_GIT_CLONE_BRANCH="master" PKG_CMAKE_OPTS_TARGET+=" -DTHREAD_SANITIZER_AVAILABLE_EXITCODE=1" PKG_CMAKE_OPTS_TARGET+=" -DADDRESS_SANITIZER_AVAILABLE_EXITCODE=1" PKG_CMAKE_OPTS_TARGET+=" -DALL_SANITIZERS_AVAILABLE_EXITCODE=1" PKG_CMAKE_OPTS_TARGET+=" -DUSE_GLES=ON -DUSE_VULKAN=OFF -DUSE_HOST_SDL=ON -DENABLE_CTEST=OFF -DTEST_AUTOMATION=OFF -DASAN=OFF " if [ "${ARCH}" == "arm" ]; then PKG_PATCH_DIRS="arm" fi pre_configure_target() { export CXXFLAGS="${CXXFLAGS} -Wno-error=array-bounds -Wswitch -Wsign-compare -I$(get_install_dir asio)/usr/include" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/flycast-dojo cp -r ${PKG_DIR}/config/* ${INSTALL}/usr/config/flycast-dojo cp "${PKG_BUILD}/.${TARGET_NAME}/flycast-dojo" "${INSTALL}/usr/bin/flycastdojo" cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin chmod +x ${INSTALL}/usr/bin/flycastdojo.sh } ================================================ FILE: packages/sx05re/emulators/flycast-dojo/patches/03-sdl.patch ================================================ --- a/core/sdl/sdl.cpp 2024-06-02 19:45:15.598400200 +0200 +++ b/core/sdl/sdl.cpp 2024-06-02 19:49:41.074683700 +0200 @@ -200,6 +200,11 @@ #endif std::string db = get_readonly_data_path("gamecontrollerdb.txt"); int rv = SDL_GameControllerAddMappingsFromFile(db.c_str()); + if (rv < 0 && (nowide::getenv("SDL_GAMECONTROLLERCONFIG_FILE") != NULL)) + { + db = (std::string) nowide::getenv("SDL_GAMECONTROLLERCONFIG_FILE"); + rv = SDL_GameControllerAddMappingsFromFile(db.c_str()); + } if (rv < 0) { db = get_readonly_config_path("gamecontrollerdb.txt"); ================================================ FILE: packages/sx05re/emulators/flycast-dojo/patches/arm/01-EmuELEC-fix-arm-compile.patch ================================================ --- a/core/linux/posix_vmem.cpp +++ b/core/linux/posix_vmem.cpp @@ -361,7 +361,8 @@ static void CacheFlush(void* code, void* pEnd) { #if !defined(__ANDROID__) - __clear_cache((void*)code, pEnd); + //__clear_cache((void*)code, pEnd); + __builtin___clear_cache((char *)code, (char *)pEnd); #else // defined(__ANDROID__) void* start=code; size_t size=(u8*)pEnd-(u8*)start+4; --- a/core/hw/arm7/arm7_rec_arm32.cpp +++ b/core/hw/arm7/arm7_rec_arm32.cpp @@ -59,9 +59,9 @@ r5, r6, r7, r9, r10, r11 }; -class Arm32ArmRegAlloc : public ArmRegAlloc -{ - using super = ArmRegAlloc; +class Arm32ArmRegAlloc : public ArmRegAlloc<6, Arm32ArmRegAlloc> +{ + using super = ArmRegAlloc<6, Arm32ArmRegAlloc>; void LoadReg(int host_reg, Arm7Reg armreg, ArmOp::Condition cc = ArmOp::AL) { ================================================ FILE: packages/sx05re/emulators/flycast-dojo/scripts/flycastdojo.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2025-present DiegroSan (https://github.com/Diegrosan) . /etc/profile virtual_keyboard & VK_PID=$! LOCAL_DATA="/storage/roms/bios/dc_dojo" LOCAL_HOME="/storage/.local/share/flycast-dojo" MAP="/storage/.config/flycast-dojo/mappings" mkdir -p "/storage/.local/share/" mkdir -p "${LOCAL_DATA}" if [ ! -d "/storage/.config/flycast-dojo" ]; then mkdir -p "/storage/.config/flycast-dojo" cp -r "/usr/config/flycast-dojo" "/storage/.config/" fi if [ ! -f "/storage/.config/flycast-dojo/emu.cfg" ]; then mkdir -p "/storage/.config/flycast-dojo" cp -f "/usr/config/flycast-dojo/emu.cfg" "/storage/.config/flycast-dojo/emu.cfg" fi if [ ! -L "${LOCAL_HOME}" ]; then rm -rf "${LOCAL_HOME}" ln -sf "${LOCAL_DATA}" "${LOCAL_HOME}" fi PLAYER=$(get_ee_setting global.netplay.nickname) [ -z "${PLAYER}" ] && PLAYER="PLAYER" PLAYER="${PLAYER// /_}" #AUTOGP=$(get_ee_setting flycast_auto_gamepad) #if [[ "${AUTOGP}" != "0" ]]; then # mkdir -p "${MAP}" # set_flycastdojo_joy.sh #fi #Here is a way I found to access the menu more easily without needing a specific file, being able to access any_name.iso #The file must be smaller than 1 kb which can be a renamed clean text block if [ "$(wc -c < "$1")" -lt $((1 * 1024)) ]; then flycastdojo -config dojo:PlayerName=${PLAYER} -config network:GGPO=yes "" else flycastdojo -config network:GGPO=no -config dojo:PlayerName=${PLAYER} "$1" fi kill $VK_PID ================================================ FILE: packages/sx05re/emulators/flycastsa/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="flycastsa" PKG_VERSION="bf2bd7efed41e9f3367a764c2d90fcaa9c38a1f9" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/flyinghead/flycast" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain ${OPENGLES} alsa SDL2 libzip zip" PKG_LONGDESC="Flycast is a multiplatform Sega Dreamcast, Naomi and Atomiswave emulator" PKG_TOOLCHAIN="cmake" PKG_GIT_CLONE_BRANCH="master" if [ "${ARCH}" == "arm" ]; then PKG_PATCH_DIRS="arm" fi pre_configure_target() { export CXXFLAGS="${CXXFLAGS} -Wno-error=array-bounds" PKG_CMAKE_OPTS_TARGET+="-DUSE_GLES=ON -DUSE_VULKAN=OFF -DUSE_HOST_SDL=ON" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/.${TARGET_NAME}/flycast ${INSTALL}/usr/bin/flycast cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin chmod +x ${INSTALL}/usr/bin/flycast.sh chmod +x ${INSTALL}/usr/bin/set_flycast_joy.sh } ================================================ FILE: packages/sx05re/emulators/flycastsa/patches/03-sdl.patch ================================================ --- a/core/sdl/sdl.cpp 2024-06-02 19:45:15.598400200 +0200 +++ b/core/sdl/sdl.cpp 2024-06-02 19:49:41.074683700 +0200 @@ -200,6 +200,11 @@ #endif std::string db = get_readonly_data_path("gamecontrollerdb.txt"); int rv = SDL_GameControllerAddMappingsFromFile(db.c_str()); + if (rv < 0 && (nowide::getenv("SDL_GAMECONTROLLERCONFIG_FILE") != NULL)) + { + db = (std::string) nowide::getenv("SDL_GAMECONTROLLERCONFIG_FILE"); + rv = SDL_GameControllerAddMappingsFromFile(db.c_str()); + } if (rv < 0) { db = get_readonly_config_path("gamecontrollerdb.txt"); ================================================ FILE: packages/sx05re/emulators/flycastsa/patches/arm/01-EmuELEC-fix-arm-compile.patch ================================================ --- a/core/linux/posix_vmem.cpp +++ b/core/linux/posix_vmem.cpp @@ -361,7 +361,8 @@ static void CacheFlush(void* code, void* pEnd) { #if !defined(__ANDROID__) - __clear_cache((void*)code, pEnd); + //__clear_cache((void*)code, pEnd); + __builtin___clear_cache((char *)code, (char *)pEnd); #else // defined(__ANDROID__) void* start=code; size_t size=(u8*)pEnd-(u8*)start+4; --- a/core/hw/arm7/arm7_rec_arm32.cpp +++ b/core/hw/arm7/arm7_rec_arm32.cpp @@ -59,9 +59,9 @@ r5, r6, r7, r9, r10, r11 }; -class Arm32ArmRegAlloc : public ArmRegAlloc -{ - using super = ArmRegAlloc; +class Arm32ArmRegAlloc : public ArmRegAlloc<6, Arm32ArmRegAlloc> +{ + using super = ArmRegAlloc<6, Arm32ArmRegAlloc>; void LoadReg(int host_reg, Arm7Reg armreg, ArmOp::Condition cc = ArmOp::AL) { ================================================ FILE: packages/sx05re/emulators/flycastsa/scripts/flycast.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile mkdir -p "/storage/.local/share/" if [ ! -L "/storage/.local/share/flycast" ]; then mkdir -p "/storage/roms/bios/dc" rm -rf "/storage/.local/share/flycast" ln -sf "/storage/roms/bios/dc" "/storage/.local/share/flycast" fi AUTOGP=$(get_ee_setting flycast_auto_gamepad) if [[ "${AUTOGP}" != "0" ]]; then mkdir -p "/storage/.config/flycast/mappings" set_flycast_joy.sh fi flycastcheevos.sh flycast "${1}" ================================================ FILE: packages/sx05re/emulators/flycastsa/scripts/flycastcheevos.sh ================================================ #! /bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Hector Calvarro (https://github.com/kelvfimer) # Script for setting up cheevos on duckstation emuelec. it extracts the data from emuelec.conf and it constructs the entries in settings.ini if [Cheevos] or Enabled = True or Enable = False are not presented . /etc/profile FLYCAST_CFG="/storage/.config/flycast/emu.cfg" # Extract username and password from emuelec.conf username=$(get_ee_setting "global.retroachievements.username") password=$(get_ee_setting "global.retroachievements.password") token=$(grep "cheevos_token" /storage/.config/retroarch/retroarch.cfg | cut -d'"' -f2) # Variables for checking if [Cheevos] or enabled true or false are present. zcheevos=$(grep -Fx "[achievements]" ${FLYCAST_CFG}) # Test the token if empty exit 1. // I don't think we should exit, it should continue but not enable cheevos if [[ -z "${token}" || "${token}" == *'"Success":false'* ]] then token="" zcheevos="" fi if [ -z "${zcheevos}" ]; then # Añadir la sección [achievements] con los valores sed -i "\$a [achievements]\nEnabled = yes\nUserName = ${username}\nToken = ${token}" ${FLYCAST_CFG} else # Verificar y actualizar UserName y Token si es necesario if ! grep -q "^UserName = " ${FLYCAST_CFG}; then sed -i "/^\[achievements\]/a UserName = ${username}" ${FLYCAST_CFG} else sed -i "/^\[achievements\]/,/^\[/{s/^UserName = .*/UserName = ${username}/;}" ${FLYCAST_CFG} fi if ! grep -q "^Token = " ${FLYCAST_CFG}; then sed -i "/^\[achievements\]/a Token = ${token}" ${FLYCAST_CFG} else sed -i "/^\[achievements\]/,/^\[/{s/^Token = .*/Token = ${token}/;}" ${FLYCAST_CFG} fi fi ================================================ FILE: packages/sx05re/emulators/flycastsa/scripts/set_flycast_joy.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile CONFIG_DIR="/storage/.config/flycast" EMU_FILE="${CONFIG_DIR}/emu.cfg" MAPPING_DIR="${CONFIG_DIR}/mappings" source joy_common.sh "flycast" CONFIG_TMP_A="/tmp/jc/SDLflycastA.tmp" CONFIG_TMP_D="/tmp/jc/SDLflycastD.tmp" CONFIG_TMP_E="/tmp/jc/SDLflycastE.tmp" BTN_H0=$(get_ee_setting flycast_btn_h0) [[ -z "${BTN_H0}" ]] && BTN_H0=255 declare -A FLYCAST_D_INDEXES=( [h0.1]=$(( BTN_H0+1 )) [h0.4]=$(( BTN_H0+2 )) [h0.8]=$(( BTN_H0+3 )) [h0.2]=$(( BTN_H0+4 )) ) declare -A FLYCAST_D_BUTTONS=( [x]="btn_y" [y]="btn_x" [a]="btn_b" [b]="btn_a" [leftshoulder]="btn_c" [rightshoulder]="btn_d" [lefttrigger]="btn_trigger_left" [righttrigger]="btn_trigger_right" [back]="btn_menu" [start]="btn_start" [guide]="btn_escape" [rightstick]="btn_fforward" [dpup]="btn_dpad1_up" [dpdown]="btn_dpad1_down" [dpleft]="btn_dpad1_left" [dpright]="btn_dpad1_right" [leftx]="axis_x" [lefty]="axis_y" [rightx]="axis_right_x" [righty]="axis_right_y" ) BTN_SWAP_XY=$(get_ee_setting flycast_joy_swap_xy) if [[ "${BTN_SWAP_XY}" == "1" ]]; then FLYCAST_D_BUTTONS[x]="btn_x" FLYCAST_D_BUTTONS[y]="btn_y" fi BTN_SWAP_AB=$(get_ee_setting flycast_joy_swap_ab) if [[ "${BTN_SWAP_AB}" == "1" ]]; then FLYCAST_D_BUTTONS[a]="btn_a" FLYCAST_D_BUTTONS[b]="btn_b" fi declare -A STICK_DIRECTIONS=( [axis_x,neg]="btn_analog_left" [axis_x,pos]="btn_analog_right" [axis_y,neg]="btn_analog_up" [axis_y,pos]="btn_analog_down" [axis_right_x,neg]="axis2_left" [axis_right_x,pos]="axis2_right" [axis_right_y,neg]="axis2_up" [axis_right_y,pos]="axis2_down" ) # Cleans all the inputs for the gamepad with name ${GAMEPAD} and player ${1} clean_pad() { #echo "Cleaning pad ${1} ${2}" #debug [[ -f "${CONFIG_TMP_A}" ]] && rm "${CONFIG_TMP_A}" [[ -f "${CONFIG_TMP_D}" ]] && rm "${CONFIG_TMP_D}" [[ -f "${CONFIG_TMP_E}" ]] && rm "${CONFIG_TMP_E}" sed -i "s/device${1}\.2.*/device${1}.2 = 10/g" "${EMU_FILE}" sed -i "s/device${1}\.1.*/device${1}.1 = 10/g" "${EMU_FILE}" sed -i "s/device${1} .*/device${1} = 10/g" "${EMU_FILE}" local i=$(( ${1} - 1 )) sed -i "s/maple_sdl_joystick_${i}.*/maple_sdl_joystick_${i} = -1/g" "${EMU_FILE}" } # Sets pad depending on parameters. # ${1} = Player Number # ${2} = js[0-7] # ${3} = Device GUID # ${4} = Device Name set_pad() { echo "set_pad params: ${1} ${2} ${3} ${4}" local JOY_NAME="${4}" local ORDER=${7} local i=$(( ${1} - 1 )) # Vars to dinamically set triggers local L_TR_AXIS="" local R_TR_AXIS="" sed -i "s/device${1} .*/device${1} = 0/g" "${EMU_FILE}" local device1=1 local RUMBLE=$(get_ee_setting ee_rumble_strength) [[ -z "${RUMBLE}" ]] && RUMBLE=0 [[ "${RUMBLE}" -gt "0" ]] && device1=3 sed -i "s/device${1}\.1.*/device${1}.1 = ${device1}/g" "${EMU_FILE}" sed -i "s/device${1}\.2.*/device${1}.2 = 1/g" "${EMU_FILE}" sed -i "s/maple_sdl_joystick_${i}.*/maple_sdl_joystick_${i} = ${ORDER}/g" "${EMU_FILE}" local CONFIG="${MAPPING_DIR}/SDL_${JOY_NAME}.cfg" [[ -f "${CONFIG}" ]] && rm "${CONFIG}" > "${CONFIG_TMP_A}"; > "${CONFIG_TMP_D}"; > "${CONFIG_TMP_E}" local GC_CONFIG="${5}" [[ -z ${GC_CONFIG} ]] && return local GC_MAP=$(echo ${GC_CONFIG} | cut -d',' -f3-) set -f local GC_ARRAY=(${GC_MAP//,/ }) local B_COUNT_A=0 local B_COUNT_D=0 for REC in "${GC_ARRAY[@]}"; do local KEY=$(echo ${REC} | cut -d ":" -f 1) local TVAL=$(echo ${REC} | cut -d ":" -f 2) local TYPE=${TVAL:0:1} local NUM=${TVAL:1} local ACTION=${FLYCAST_D_BUTTONS[${KEY}]} [[ -z "${ACTION}" ]] && continue if [[ "${TYPE}" == "a" ]]; then # ANALOG SECTION if [[ "${KEY}" == "leftx" || "${KEY}" == "lefty" || "${KEY}" == "rightx" || "${KEY}" == "righty" ]]; then echo "bind$((B_COUNT_A++)) = ${NUM}-:${STICK_DIRECTIONS[${ACTION},neg]}" >> "${CONFIG_TMP_A}" echo "bind$((B_COUNT_A++)) = ${NUM}+:${STICK_DIRECTIONS[${ACTION},pos]}" >> "${CONFIG_TMP_A}" else # ITS ANALOG TRIGGER echo "bind$((B_COUNT_A++)) = ${NUM}+:${ACTION}" >> "${CONFIG_TMP_A}" # SAVE IDS FOR LATER [[ "${KEY}" == "lefttrigger" ]] && L_TR_AXIS="${NUM}" [[ "${KEY}" == "righttrigger" ]] && R_TR_AXIS="${NUM}" fi elif [[ "${TYPE}" == "b" || "${TYPE}" == "h" ]]; then # DIGITAL SECTION local FINAL_NUM=${NUM} [[ "${TYPE}" == "h" ]] && FINAL_NUM=${FLYCAST_D_INDEXES[${TVAL}]} echo "bind$((B_COUNT_D++)) = ${FINAL_NUM}:${ACTION}" >> "${CONFIG_TMP_D}" fi done echo "[analog]" > "${CONFIG}" cat "${CONFIG_TMP_A}" | sort >> "${CONFIG}" echo -e "\n[digital]" >> "${CONFIG}" cat "${CONFIG_TMP_D}" | sort >> "${CONFIG}" echo -e "\n[emulator]" >> "${CONFIG}" echo "mapping_name = ${JOY_NAME}" >> "${CONFIG}" echo "version = 4" >> "${CONFIG}" echo "rumble_power = ${RUMBLE}" >> "${CONFIG}" if [[ ! -z "${L_TR_AXIS}" && ! -z "${R_TR_AXIS}" ]]; then echo "triggers = ${L_TR_AXIS},${R_TR_AXIS}" >> "${CONFIG}" fi cat "${CONFIG_TMP_E}" | sort -u >> "${CONFIG}" rm "${CONFIG_TMP_A}" "${CONFIG_TMP_D}" "${CONFIG_TMP_E}" } init_config() { mkdir -p "/storage/.config/flycast/mappings" # Adjust the emulator config file to load sdl controller files. if [[ ! -f "${EMU_FILE}" ]]; then echo "[input]" >> "${EMU_FILE}" local SDL_JOYSTICK="maple_sdl_joystick_0 = 0\nmaple_sdl_joystick_1 = 1\nmaple_sdl_joystick_2 = 2\nmaple_sdl_joystick_3 = 3\n" echo -e "${SDL_JOYSTICK}" >> "${EMU_FILE}" for i in {1..4}; do echo -e "device${i} = 0\ndevice${i}.1 = 1\ndevice{$i}.2 = 1\n" >> "${EMU_FILE}" done return fi local RUMBLE=$(get_ee_setting ee_rumble_strength) [[ -z "${RUMBLE}" ]] && RUMBLE=0 jc_set_record "${EMU_FILE}" "\[input\]" "VirtualGamepadVibration" "${RUMBLE}" } init_config jc_get_players ================================================ FILE: packages/sx05re/emulators/hatarisa/config/conf/Atari-ST-default.cfg ================================================ [Log] sLogFileName = stderr sTraceFileName = stderr nTextLogLevel = 3 nAlertDlgLogLevel = 1 bConfirmQuit = FALSE bNatFeats = FALSE bConsoleWindow = FALSE [Debugger] nNumberBase = 10 nSymbolLines = -1 nMemdumpLines = -1 nDisasmLines = -1 nExceptionDebugMask = 515 nDisasmOptions = 15 bDisasmUAE = FALSE bSymbolsResident = FALSE bMatchAllSymbols = FALSE [Screen] nMonitorType = 1 nFrameSkips = 5 bFullScreen = TRUE bKeepResolution = TRUE bResizable = TRUE bAllowOverscan = TRUE nSpec512Threshold = 1 nForceBpp = 0 bAspectCorrect = TRUE bUseExtVdiResolutions = FALSE nVdiWidth = 640 nVdiHeight = 480 nVdiColors = 2 bMouseWarp = TRUE bShowStatusbar = FALSE bShowDriveLed = FALSE bCrop = FALSE bForceMax = FALSE nMaxWidth = 832 nMaxHeight = 588 bUseSdlRenderer = TRUE nRenderScaleQuality = 0 bUseVsync = TRUE [Joystick0] nJoystickMode = 0 bEnableAutoFire = FALSE bEnableJumpOnFire2 = FALSE nJoyId = 0 kUp = Up kDown = Down kLeft = Left kRight = Right kFire = Right Ctrl [Joystick1] nJoystickMode = 1 bEnableAutoFire = FALSE bEnableJumpOnFire2 = FALSE nJoyId = 0 kUp = Up kDown = Down kLeft = Left kRight = Right kFire = Right Ctrl [Joystick2] nJoystickMode = 0 bEnableAutoFire = FALSE bEnableJumpOnFire2 = FALSE nJoyId = 0 kUp = Up kDown = Down kLeft = Left kRight = Right kFire = Right Ctrl [Joystick3] nJoystickMode = 0 bEnableAutoFire = FALSE bEnableJumpOnFire2 = FALSE nJoyId = 0 kUp = Up kDown = Down kLeft = Left kRight = Right kFire = Right Ctrl [Joystick4] nJoystickMode = 0 bEnableAutoFire = FALSE bEnableJumpOnFire2 = FALSE nJoyId = 0 kUp = Up kDown = Down kLeft = Left kRight = Right kFire = Right Ctrl [Joystick5] nJoystickMode = 0 bEnableAutoFire = FALSE bEnableJumpOnFire2 = FALSE nJoyId = 0 kUp = Up kDown = Down kLeft = Left kRight = Right kFire = Right Ctrl [Keyboard] bDisableKeyRepeat = FALSE nKeymapType = 0 szMappingFileName = [KeyShortcutsWithMod] kOptions = O kFullScreen = F kBorders = B kMouseMode = M kColdReset = C kWarmReset = R kScreenShot = G kBossKey = I kCursorEmu = J kFastForward = X kRecAnim = A kRecSound = Y kSound = S kPause = kDebugger = Pause kQuit = Q kLoadMem = L kSaveMem = K kInsertDiskA = D kSwitchJoy0 = F1 kSwitchJoy1 = F2 kSwitchPadA = F3 kSwitchPadB = F4 [KeyShortcutsWithoutMod] kOptions = F12 kFullScreen = F11 kBorders = kMouseMode = kColdReset = kWarmReset = kScreenShot = kBossKey = kCursorEmu = kFastForward = kRecAnim = kRecSound = kSound = kPause = Pause kDebugger = kQuit = kLoadMem = kSaveMem = kInsertDiskA = kSwitchJoy0 = kSwitchJoy1 = kSwitchPadA = kSwitchPadB = [Sound] bEnableMicrophone = TRUE bEnableSound = TRUE bEnableSoundSync = FALSE nPlaybackFreq = 44100 nSdlAudioBufferSize = 0 szYMCaptureFileName = /storage/.hatari/hatari.wav YmVolumeMixing = 2 [Memory] nMemorySize = 1024 nTTRamSize = 0 bAutoSave = FALSE szMemoryCaptureFileName = /storage/.config/hatari/hatari.sav szAutoSaveFileName = /storage/.config/hatari/auto.sav [HardDisk] nGemdosDrive = 0 bBootFromHardDisk = FALSE bUseHardDiskDirectory = FALSE szHardDiskDirectory = /storage/.hatari nGemdosCase = 0 nWriteProtection = 0 bFilenameConversion = FALSE bGemdosHostTime = FALSE bUseHardDiskImage = FALSE szHardDiskImage = /storage/.hatari bUseIdeMasterHardDiskImage = FALSE bUseIdeSlaveHardDiskImage = FALSE szIdeMasterHardDiskImage = /storage/.hatari szIdeSlaveHardDiskImage = /storage/.hatari [ROM] szTosImageFileName = /storage/roms/bios/tos.img bPatchTos = TRUE szCartridgeImageFileName = [RS232] bEnableRS232 = FALSE szOutFileName = /dev/modem szInFileName = /dev/modem [Printer] bEnablePrinting = FALSE szPrintToFileName = /storage/.config/hatari/hatari.prn [Midi] bEnableMidi = FALSE sMidiInFileName = /dev/snd/midiC1D0 sMidiOutFileName = /dev/snd/midiC1D0 sMidiInPortName = Off sMidiOutPortName = Off [System] nCpuLevel = 0 nCpuFreq = 8 bCompatibleCpu = TRUE nModelType = 0 bBlitter = FALSE nDSPType = 0 bPatchTimerD = FALSE bFastBoot = FALSE bFastForward = FALSE bAddressSpace24 = TRUE bCycleExactCpu = TRUE n_FPUType = 0 bSoftFloatFPU = FALSE bMMU = FALSE VideoTiming = 3 [Video] AviRecordVcodec = 2 AviRecordFps = 0 AviRecordFile = /storage/.hatari/hatari.avi [Floppy] bAutoInsertDiskB = TRUE FastFloppy = TRUE EnableDriveA = TRUE DriveA_NumberOfHeads = 2 EnableDriveB = TRUE DriveB_NumberOfHeads = 2 nWriteProtection = 0 szDiskImageDirectory = /storage/roms/atarist szDiskAZipPath = szDiskBZipPath = ================================================ FILE: packages/sx05re/emulators/hatarisa/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) PKG_NAME="hatarisa" #PKG_VERSION="e1e274a0a47b4f0675505143a4c535700d16f9bd" PKG_VERSION="fda67f05188a925535fefc1b0ef24eb044a029d2" #PKG_SHA256="a46e6456c4d725e8118fd536284e51f8e467f60b8141491be38101c36278d763" PKG_LICENSE="GPL" PKG_SITE="https://github.com/hatari/hatari" PKG_URL="https://github.com/hatari/hatari/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux glibc systemd alsa-lib SDL2 portaudio zlib capsimg libpng" PKG_LONGDESC="Hatari is an Atari ST/STE/TT/Falcon emulator" pre_configure_target() { PKG_CMAKE_OPTS_TARGET="-DCMAKE_SKIP_RPATH=ON \ -DDATADIR="/usr/config/hatari" \ -DBIN2DATADIR="../../storage/.config/hatari" \ -DCAPSIMAGE_INCLUDE_DIR=${PKG_BUILD}/src/include \ -DCAPSIMAGE_LIBRARY=${PKG_BUILD}/libcapsimage.so.5.1" # copy IPF Support Library include files mkdir -p ${PKG_BUILD}/src/includes/caps/ cp -R $(get_build_dir capsimg)/LibIPF/* ${PKG_BUILD}/src/includes/caps/ cp -R $(get_build_dir capsimg)/Core/CommonTypes.h ${PKG_BUILD}/src/includes/caps/ cp -R $(get_install_dir capsimg)/usr/lib/libcapsimage.so.5.1 ${PKG_BUILD}/ # add library search path for loading libcapsimage library LDFLAGS="${LDFLAGS} -Wl,-rpath='${PKG_BUILD}'" } makeinstall_target() { # create directories mkdir -p ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/hatari # copy config files touch ${INSTALL}/usr/config/hatari/hatari.nvram cp -R ${PKG_DIR}/config/* ${INSTALL}/usr/config/hatari # copy binary & start script cp src/hatari ${INSTALL}/usr/bin cp -R ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin/ } ================================================ FILE: packages/sx05re/emulators/hatarisa/portaudio/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) PKG_NAME="portaudio" PKG_VERSION="64d1bf913433d7a2835526b80a93487d5038cb8e" PKG_SHA256="c33e48217a844cca3b66ab88571b90beefb8fcb6967177951d4dc283587bf834" PKG_LICENSE="GPL" PKG_SITE="https://portaudio.com" PKG_URL="https://github.com/zhang-ray/portaudio/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain alsa-lib" PKG_LONGDESC="PortAudio is a free, cross-platform, open-source, audio I/O library." ================================================ FILE: packages/sx05re/emulators/hatarisa/scripts/hatari.start ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) . /etc/profile # Set some common variables HATARI_DIR_HOME=/storage/.hatari HATARI_DIR=/storage/.config/hatari HATARI_CONFIG_DIR=$HATARI_DIR/conf HATARI_TMP_DIR=/tmp/hatari HATARI_TMP_CONFIG="$HATARI_TMP_DIR"/.hatari-temp.cfg HATARI_LOG="/emuelec/logs/hatari.log" MAX_DRIVES=2 i=0 export SDL_AUDIODRIVER=alsa # create symlink to hatari config dir if [ ! -L $HATARI_DIR_HOME ]; then rm -rf $HATARI_DIR_HOME ln -s $HATARI_DIR $HATARI_DIR_HOME fi # Which file should hatari load? echo "Trying to boot this game:" "$1" >> $HATARI_LOG # Create a clean working directory if [ -d "$HATARI_TMP_DIR" ]; then echo "Clean up old working directory." >> $HATARI_LOG rm -rf "$HATARI_TMP_DIR" fi mkdir -p "$HATARI_TMP_DIR" # copy default config file to tmp cp $HATARI_CONFIG_DIR/Atari-ST-default.cfg "$HATARI_TMP_CONFIG" # Check if we are loading a .zip file if [ `echo $1 | grep -i .zip | wc -l` -eq 1 ]; then #unpack the zip file unzip -q -o "$1" -d "$HATARI_TMP_DIR" # Assign files to floppy 1 & 2 for FILE in "$HATARI_TMP_DIR"/* do i=$(($i+1)) case "$i" in 1) ARGS="\nszDiskAFileName = "$FILE"" ;; 2) ARGS="$ARGS\nszDiskBFileName = "$FILE"" ;; esac # This emulator supports 2 floppies max if [ $i -eq $MAX_DRIVES ]; then break; fi done # Add game files as floppy 1 & 2 to .hatari-temp.cfg & start hatari echo -e $ARGS >> "$HATARI_TMP_CONFIG" echo -e "\nAssigned floppy drives:" $ARGS "\n" >> "$HATARI_LOG" hatari --configfile "$HATARI_TMP_CONFIG" >> $HATARI_LOG 2>&1 # Check for .cfg config file elif [ `echo $1 | grep -i .cfg | wc -l` -eq 1 ]; then hatari --configfile "$1" >> $HATARI_LOG 2>&1 # All other files else hatari --configfile "$HATARI_TMP_CONFIG" --disk-a "$1" >> $HATARI_LOG 2>&1 fi # Remove temporary dir rm -rf "$HATARI_TMP_DIR" ================================================ FILE: packages/sx05re/emulators/hypseus-singe/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="hypseus-singe" PKG_VERSION="8397498bccd5dd8afc55b2200d533d66e17be56f" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL3" PKG_SITE="https://github.com/DirtBagXon/hypseus-singe" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 libvorbis SDL2_ttf SDL2_image" PKG_LONGDESC="Hypseus is a fork of Daphne. A program that lets one play the original versions of many laserdisc arcade games on one's PC." PKG_TOOLCHAIN="cmake" GET_HANDLER_SUPPORT="git" PKG_CMAKE_OPTS_TARGET=" ./src" pre_configure_target() { mkdir -p ${INSTALL}/usr/config/emuelec/configs/hypseus ln -fs /storage/roms/daphne/roms ${INSTALL}/usr/config/emuelec/configs/hypseus/roms ln -fs /usr/share/daphne/sound ${INSTALL}/usr/config/emuelec/configs/hypseus/sound ln -fs /usr/share/daphne/fonts ${INSTALL}/usr/config/emuelec/configs/hypseus/fonts ln -fs /usr/share/daphne/pics ${INSTALL}/usr/config/emuelec/configs/hypseus/pics } post_makeinstall_target() { cp -rf ${PKG_BUILD}/doc/hypinput.ini ${INSTALL}/usr/config/emuelec/configs/hypseus/hypinput.ini cp -rf ${PKG_BUILD}/doc/hypinput_gamepad.ini ${INSTALL}/usr/config/emuelec/configs/hypseus/hypinput_gamepad.ini ln -fs /storage/.config/emuelec/configs/hypseus/hypinput.ini ${INSTALL}/usr/share/daphne/hypinput.ini } ================================================ FILE: packages/sx05re/emulators/hypseus-singe/patches/hypseus-singe-001-buildfix.patch ================================================ --- a/src/CMakeLists.txt 2021-06-07 19:12:18.646828485 +0200 +++ b/src/CMakeLists.txt 2021-06-07 19:13:56.113491528 +0200 @@ -52,15 +52,13 @@ include(GetGitRevisionDescription) include(InstallRequiredSystemLibraries) include(FindPkgConfig) -include(ExternalProject) -include(BuildLibMPEG2) use_cxx11( ) PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2) PKG_SEARCH_MODULE(SDL2_TTF REQUIRED SDL2_ttf) PKG_SEARCH_MODULE(SDL2_MIXER REQUIRED SDL2_mixer) -build_libmpeg2( ) +PKG_SEARCH_MODULE(MPEG2 REQUIRED libmpeg2) message(STATUS "Target: ${CMAKE_SYSTEM_NAME} ${CMAKE_TARGET_ARCHITECTURES}") @@ -114,7 +112,6 @@ add_subdirectory(video) add_subdirectory(vldp) -add_dependencies( vldp libmpeg2 ) add_dependencies( ldp-out vldp ) add_dependencies( game vldp ) add_dependencies( sound vldp ) @@ -162,3 +159,5 @@ set(CPACK_PACKAGE_VERSION_PATCH "${VER_PATCH}") include(CPack) +install(TARGETS hypseus DESTINATION bin) +install(DIRECTORY ../pics ../fonts ../sound DESTINATION /usr/share/daphne) diff --git a/src/vldp/vldp.h b/src/vldp/vldp.h index a59c723..3c986dc 100644 --- a/src/vldp/vldp.h +++ b/src/vldp/vldp.h @@ -34,6 +34,8 @@ extern "C" { // Ubuntu Linux complains with plain #include // only used for threading +#include + struct yuv_buf { uint8_t *Y; // Y channel uint8_t *U; // U channel diff --git a/src/vldp/vldp_internal.h b/src/vldp/vldp_internal.h index cd046fe..67cea2d 100644 --- a/src/vldp/vldp_internal.h +++ b/src/vldp/vldp_internal.h @@ -27,7 +27,6 @@ #include "vldp.h" // for the VLDP_BOOL definition and SDL.h -#include // this is which version of the .dat file format we are using #define DAT_VERSION 2 --- a/src/manymouse/CMakeLists.txt +++ b/src/manymouse/CMakeLists.txt @@ -1,7 +1,8 @@ + + set( LIB_SOURCES manymouse.c linux_evdev.c macosx_hidmanager.c macosx_hidutilities.c windows_wminput.c - x11_xinput2.c ) set( LIB_HEADERS ================================================ FILE: packages/sx05re/emulators/hypseus-singe/patches/hypseus-singe-002-headersfix.patch ================================================ diff --git a/src/game/singe.cpp b/src/game/singe.cpp index b6506b8..fb2af4e 100644 --- a/src/game/singe.cpp +++ b/src/game/singe.cpp @@ -28,6 +28,8 @@ #include "singe.h" #include "singe/singe_interface.h" +#include +#include // Win32 doesn't use strcasecmp, it uses stricmp (lame) #ifdef WIN32 ================================================ FILE: packages/sx05re/emulators/hypseus-singe/patches/manymouse.patch ================================================ --- a/src/manymouse/manymouse.c 2025-08-06 13:57:11.365331700 +0200 +++ b/src/manymouse/manymouse.c 2025-08-06 13:58:27.190043892 +0200 @@ -15,7 +15,6 @@ extern const ManyMouseDriver *ManyMouseDriver_windows; extern const ManyMouseDriver *ManyMouseDriver_evdev; -extern const ManyMouseDriver *ManyMouseDriver_xinput2; extern const ManyMouseDriver *ManyMouseDriver_hidmanager; extern const ManyMouseDriver *ManyMouseDriver_hidutilities; @@ -33,7 +32,6 @@ static const ManyMouseDriver **mice_drivers[] = { &ManyMouseDriver_evdev, - &ManyMouseDriver_xinput2, &ManyMouseDriver_windows, &ManyMouseDriver_hidmanager, &ManyMouseDriver_hidutilities ================================================ FILE: packages/sx05re/emulators/ikemen-go/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2025-present DiegroSan (https://github.com/Diegrosan) # Thank you very much, leonkasovan, for the Port (aarch64/arm64 port) SDL ikemen-go # PKG_NAME="ikemen-go" PKG_VERSION="86bd3bf7b378eb31239624c698b295d399f96873" PKG_GIT_CLONE_BRANCH="SDL2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/leonkasovan/Ikemen-GO" PKG_URL="https://github.com/leonkasovan/Ikemen-GO.git" PKG_DEPENDS_TARGET="toolchain go:host go SDL2 ${OPENGLES} openal-soft sdlgamepadmap" PKG_TOOLCHAIN="manual" PKG_SHORTDESC="Open-source fighting game engine" PKG_LONGDESC="Ikemen GO is an open-source fighting game engine." PKG_IS_TARGET=y GET_HANDLER_SUPPORT="git" pre_configure_target() { export GOOS=linux export GOARCH=arm64 export CGO_ENABLED=1 export CGO_CFLAGS="$CFLAGS -w -DGL_GLEXT_PROTOTYPES $(pkg-config --cflags sdl2)" export CGO_CXXFLAGS="$CXXFLAGS -w -DGL_GLEXT_PROTOTYPES" export CGO_LDFLAGS="$LDFLAGS -lGLESv2 -lEGL $(pkg-config --libs sdl2)" export GOPATH="$PKG_BUILD/.gopath" export GOROOT="$(get_build_dir go)" export PATH="$GOROOT/bin:$PATH" export PKG_CONFIG_PATH="$SYSROOT_PREFIX/usr/lib/pkgconfig:$SYSROOT_PREFIX/usr/share/pkgconfig" } pre_make_target() { # Garantir que as dependências estejam atualizadas / Ensure dependencies are up to date go mod tidy chmod -R 775 "${PKG_BUILD}/.gopath" } make_target() { cd "$PKG_BUILD" chmod a+x build/build.sh cd ./build && ./build.sh pi4 chmod -R 775 "${PKG_BUILD}/.gopath" } makeinstall_target() { mkdir -p "$INSTALL/usr/bin" mkdir -p "$INSTALL/usr/share/ikemen_go" # Copy alsa config mkdir -p ${INSTALL}/usr/config cp -rf ${PKG_DIR}/src/asound-ikemen.conf ${INSTALL}/usr/config/ cp -f "$PKG_DIR/src/Ikemen_Go.sh" "$INSTALL/usr/bin/Ikemen_Go.sh" cp "$PKG_BUILD/bin/Ikemen_Go_"* "$INSTALL/usr/bin/Ikemen_Go" # Copiar recursos / Copy resources cp -rf "$PKG_BUILD/data" "$INSTALL/usr/share/ikemen_go" cp -rf "$PKG_BUILD/external" "$INSTALL/usr/share/ikemen_go" cp -rf "$PKG_BUILD/font" "$INSTALL/usr/share/ikemen_go" chmod +x "$INSTALL/usr/bin/Ikemen_Go.sh" chmod +x "$INSTALL/usr/bin/Ikemen_Go" } ================================================ FILE: packages/sx05re/emulators/ikemen-go/patches/0001-enhance_joystick_and_game_controller_support.patch ================================================ From 49df807e8c646e6d06543b8787f0090848d4a7bf Mon Sep 17 00:00:00 2001 From: Adventurous Programmer <47227694+Diegrosan@users.noreply.github.com> Date: Wed, 22 Oct 2025 14:48:17 -0300 Subject: [PATCH] Enhance input handling with game controller support Added support for game controllers in the input handling system, including common mappings and loading from an external database. --- src/input_sdl.go | 363 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 253 insertions(+), 110 deletions(-) diff --git a/src/input_sdl.go b/src/input_sdl.go index 409b41790..8bdc12b95 100644 --- a/src/input_sdl.go +++ b/src/input_sdl.go @@ -1,11 +1,14 @@ //go:build sdl +// +build sdl package main import ( "fmt" + "os" "runtime" "strconv" + "strings" sdl "github.com/veandco/go-sdl2/sdl" ) @@ -13,7 +16,10 @@ import ( const MAX_JOYSTICK_COUNT = 4 type Input struct { - joysticks [MAX_JOYSTICK_COUNT]*sdl.Joystick + joysticks [MAX_JOYSTICK_COUNT]*sdl.Joystick + gameControllers [MAX_JOYSTICK_COUNT]*sdl.GameController + useGameController [MAX_JOYSTICK_COUNT]bool + deviceIndex [MAX_JOYSTICK_COUNT]int32 } type Key = sdl.Keycode @@ -154,6 +160,76 @@ func init() { for k, v := range KeyToStringLUT { StringToKeyLUT[v] = k } + + if err := sdl.InitSubSystem(sdl.INIT_GAMECONTROLLER); err != nil { + fmt.Printf("[init] Failed to initialize GameController: %v\n", err) + } + + AddCommonMappings() + LoadGameControllerDB() +} + +func AddCommonMappings() { + fmt.Printf("[AddCommonMappings] Loading built-in controller mappings...\n") + + commonMappings := []string{ + "030000005e0400008e02000014010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,", + "030000005e040000ea02000001030000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,", + "030000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,", + "030000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,", + "030000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,", + "03000000790000001100000000000000,Generic USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,", + } + + count := 0 + for _, mapping := range commonMappings { + if sdl.GameControllerAddMapping(mapping) >= 0 { + count++ + } + } + + fmt.Printf("[AddCommonMappings] Loaded %d built-in mappings (will be overridden by gamecontrollerdb.txt if present)\n", count) +} + +func LoadGameControllerDB() { + envPath := os.Getenv("SDL_GAMECONTROLLERCONFIG_FILE") + + if envPath == "" { + fmt.Printf("[LoadGameControllerDB] SDL_GAMECONTROLLERCONFIG_FILE environment variable not set\n") + fmt.Printf("[LoadGameControllerDB] Using built-in mappings as fallback\n") + return + } + + fmt.Printf("[LoadGameControllerDB] Searching for gamecontrollerdb.txt in:\n") + fmt.Printf("[LoadGameControllerDB] - %s (SDL_GAMECONTROLLERCONFIG_FILE env variable)\n", envPath) + + if _, err := os.Stat(envPath); err != nil { + fmt.Printf("[LoadGameControllerDB] File not found: %s\n", envPath) + fmt.Printf("[LoadGameControllerDB] Using built-in mappings as fallback\n") + return + } + + data, err := os.ReadFile(envPath) + if err != nil { + fmt.Printf("[LoadGameControllerDB] Failed to read file: %v\n", err) + fmt.Printf("[LoadGameControllerDB] Using built-in mappings as fallback\n") + return + } + + lines := strings.Split(string(data), "\n") + count := 0 + for _, line := range lines { + line = strings.TrimSpace(line) + if len(line) == 0 || strings.HasPrefix(line, "#") { + continue + } + if sdl.GameControllerAddMapping(line) >= 0 { + count++ + } + } + + fmt.Printf("[LoadGameControllerDB] Loaded %d mappings from: %s\n", count, envPath) + fmt.Printf("[LoadGameControllerDB] External database has PRIORITY over built-in mappings\n") } func StringToKey(s string) sdl.Keycode { @@ -170,7 +246,6 @@ func KeyToString(k sdl.Keycode) string { return "" } -// to be fix: doesn't work toggle Full Screen func NewModifierKey(ctrl, alt, shift bool) (mod ModifierKey) { if ctrl { mod |= sdl.KMOD_CTRL @@ -194,29 +269,48 @@ func (input *Input) IsJoystickPresent(joy int) bool { if joy < 0 || joy >= len(input.joysticks) { return false } - return input.joysticks[joy].Attached() + if input.gameControllers[joy] != nil { + return true + } + if input.joysticks[joy] != nil { + return input.joysticks[joy].Attached() + } + return false } func (input *Input) GetJoystickName(joy int) string { if joy < 0 || joy >= len(input.joysticks) { return "" } - return input.joysticks[joy].Name() + if input.gameControllers[joy] != nil { + return input.gameControllers[joy].Name() + } + if input.joysticks[joy] != nil { + return input.joysticks[joy].Name() + } + return "" } func (input *Input) GetJoystickAxis(joy int, axis int) int16 { if joy < 0 || joy >= len(input.joysticks) { return 0 } - return input.joysticks[joy].Axis(axis) + if input.joysticks[joy] != nil { + return input.joysticks[joy].Axis(axis) + } + return 0 } func (input *Input) GetJoystickAxes(joy int) []int16 { if joy < 0 || joy >= len(input.joysticks) { return []int16{} } - axes := make([]int16, input.joysticks[joy].NumAxes()) - for i := range axes { + if input.joysticks[joy] == nil { + return []int16{} + } + numAxes := input.joysticks[joy].NumAxes() + axes := make([]int16, numAxes) + for i := 0; i < numAxes; i++ { axes[i] = input.joysticks[joy].Axis(i) } return axes @@ -226,8 +320,12 @@ func (input *Input) GetJoystickButtons(joy int) []byte { if joy < 0 || joy >= len(input.joysticks) { return []byte{} } - buttons := make([]byte, input.joysticks[joy].NumButtons()) - for i := range buttons { + if input.joysticks[joy] == nil { + return []byte{} + } + numButtons := input.joysticks[joy].NumButtons() + buttons := make([]byte, numButtons) + for i := 0; i < numButtons; i++ { buttons[i] = input.joysticks[joy].Button(i) } return buttons @@ -237,13 +335,26 @@ func (input *Input) GetJoystickHats(joy int) []byte { if joy < 0 || joy >= len(input.joysticks) { return []byte{} } - hats := make([]byte, input.joysticks[joy].NumHats()) - for i := range hats { + if input.joysticks[joy] == nil { + return []byte{} + } + numHats := input.joysticks[joy].NumHats() + hats := make([]byte, numHats) + for i := 0; i < numHats; i++ { hats[i] = input.joysticks[joy].Hat(i) } return hats } +func getAxisValue(value int16, sensitivity int16) int16 { + if value > sensitivity { + return value + } else if value < -sensitivity { + return value + } + return 0 +} + func JoystickState(joy, button int) bool { if joy < 0 { return sys.keyState[Key(button)] @@ -251,81 +362,101 @@ func JoystickState(joy, button int) bool { if joy >= input.GetMaxJoystickCount() { return false } + js := input.joysticks[joy] - if button >= js.NumButtons() { // only check for Hats or "axis for dpad" (max_button,max_button+1,max_button+2,max_button+3) - if js.NumAxes() >= 2 { // check axes for dpad - switch button { // check HAT0, AXIS1, AXIS2 - case sys.joystickConfig[joy].dU: // Up - return (js.Axis(1) < -sys.controllerStickSensitivitySDL) || ((js.Hat(0) & 1) != 0) - case sys.joystickConfig[joy].dR: // Right - return (js.Axis(0) > sys.controllerStickSensitivitySDL) || ((js.Hat(0) & 2) != 0) - case sys.joystickConfig[joy].dD: // Down - return (js.Axis(1) > sys.controllerStickSensitivitySDL) || ((js.Hat(0) & 4) != 0) - case sys.joystickConfig[joy].dL: // Left - return (js.Axis(0) < -sys.controllerStickSensitivitySDL) || ((js.Hat(0) & 8) != 0) - default: // invalid button code if > max_button+3 - return false - } - } else { - switch button { // check HAT0 only - case sys.joystickConfig[joy].dU: // Up - return js.Hat(0)&1 != 0 - case sys.joystickConfig[joy].dR: // Right - return js.Hat(0)&2 != 0 - case sys.joystickConfig[joy].dD: // Down - return js.Hat(0)&4 != 0 - case sys.joystickConfig[joy].dL: // Left - return js.Hat(0)&8 != 0 - default: // invalid button code if > max_button+3 - return false + if js == nil { + return false + } + + isDpadButton := button == sys.joystickConfig[joy].dU || + button == sys.joystickConfig[joy].dR || + button == sys.joystickConfig[joy].dD || + button == sys.joystickConfig[joy].dL + + if isDpadButton { + if js.NumHats() > 0 { + hatValue := js.Hat(0) + switch button { + case sys.joystickConfig[joy].dU: + if hatValue&sdl.HAT_UP != 0 { + return true + } + case sys.joystickConfig[joy].dR: + if hatValue&sdl.HAT_RIGHT != 0 { + return true + } + case sys.joystickConfig[joy].dD: + if hatValue&sdl.HAT_DOWN != 0 { + return true + } + case sys.joystickConfig[joy].dL: + if hatValue&sdl.HAT_LEFT != 0 { + return true + } } } - } else if button >= 0 { // Check for button code (0,1,2,...,10,11,max_button-1) + if js.NumAxes() >= 2 { - switch button { // check BUTTON, AXIS1, AXIS2 - case sys.joystickConfig[joy].dU: // Up: check axis, d.pad(hat), button - return (js.Axis(1) < -sys.controllerStickSensitivitySDL) || (js.Button(button) != 0) - case sys.joystickConfig[joy].dR: // Right: check axis and d.pad(hat), button - return (js.Axis(0) > sys.controllerStickSensitivitySDL) || (js.Button(button) != 0) - case sys.joystickConfig[joy].dD: // Down: check axis and d.pad(hat), button - return (js.Axis(1) > sys.controllerStickSensitivitySDL) || (js.Button(button) != 0) - case sys.joystickConfig[joy].dL: // Left: check axis and d.pad(hat), button - return (js.Axis(0) < -sys.controllerStickSensitivitySDL) || (js.Button(button) != 0) - default: // Other (normal) button - // if js.Button(button) != 0 { - // fmt.Printf("[default] input.joysticks[%v].Button(%v)=%v\n", joy, button, js.Button(button)) - // } - return js.Button(button) != 0 + axis0 := getAxisValue(js.Axis(0), sys.controllerStickSensitivitySDL) + axis1 := getAxisValue(js.Axis(1), sys.controllerStickSensitivitySDL) + + switch button { + case sys.joystickConfig[joy].dU: + if axis1 < 0 { + return true + } + case sys.joystickConfig[joy].dR: + if axis0 > 0 { + return true + } + case sys.joystickConfig[joy].dD: + if axis1 > 0 { + return true + } + case sys.joystickConfig[joy].dL: + if axis0 < 0 { + return true + } } - } else { // check BUTTON only + } + + if button >= 0 && button < js.NumButtons() { return js.Button(button) != 0 } - - } else { // Check for Axis code, button is negatif (-1,-2,...,-10,-11,...) + + return false + } + + if button >= 0 && button < js.NumButtons() { + return js.Button(button) != 0 + } + + if button < 0 { var axis int - if button&1 == 0 { + isPositive := (button & 1) == 0 + + if isPositive { axis = (-button - 1) / 2 } else { axis = -button / 2 } - if js.NumAxes() > axis { - value := js.Axis(axis) - if button&1 == 0 { - return value > sys.controllerStickSensitivitySDL + + if axis < js.NumAxes() { + value := getAxisValue(js.Axis(axis), sys.controllerStickSensitivitySDL) + if isPositive { + return value > 0 } else { - return -value > sys.controllerStickSensitivitySDL + return value < 0 } - } else { - return false } - return false } + + return false } -// Reads controllers and converts inputs to letters for later processing func (ir *InputReader) LocalInput(in int) (bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool) { var U, D, L, R, a, b, c, x, y, z, s, d, w, m bool - // Keyboard + if in < len(sys.keyConfig) { joy := sys.keyConfig[in].Joy if joy == -1 { @@ -345,12 +476,12 @@ func (ir *InputReader) LocalInput(in int) (bool, bool, bool, bool, bool, bool, b m = sys.keyConfig[in].m() } } - // Joystick + if in < len(sys.joystickConfig) { sdl.JoystickUpdate() joyS := sys.joystickConfig[in].Joy if joyS >= 0 { - U = U || sys.joystickConfig[in].U() // Does not override keyboard + U = U || sys.joystickConfig[in].U() D = D || sys.joystickConfig[in].D() L = L || sys.joystickConfig[in].L() R = R || sys.joystickConfig[in].R() @@ -366,61 +497,73 @@ func (ir *InputReader) LocalInput(in int) (bool, bool, bool, bool, bool, bool, b m = m || sys.joystickConfig[in].m() } } - // Button assist is checked locally so the sent inputs are already processed + if sys.inputButtonAssist { a, b, c, x, y, z, s, d, w = ir.ButtonAssistCheck(a, b, c, x, y, z, s, d, w) } + return U, D, L, R, a, b, c, x, y, z, s, d, w, m } func checkAxisForDpad(joy int, axes *[]int16, base int) string { - var s string - if (*axes)[0] > sys.controllerStickSensitivitySDL { // right - s = strconv.Itoa(2 + base) - fmt.Printf("[input_sdl.go][checkAxisForDpad] AXIS for DPAD RIGHT joy=%v s: %v\n", joy, s) - } else if -(*axes)[0] > sys.controllerStickSensitivitySDL { // left - s = strconv.Itoa(1 + base) - fmt.Printf("[input_sdl.go][checkAxisForDpad] AXIS for DPAD LEFT joy=%v s: %v\n", joy, s) - } - if (*axes)[1] > sys.controllerStickSensitivitySDL { // down - s = strconv.Itoa(3 + base) - fmt.Printf("[input_sdl.go][checkAxisForDpad] AXIS for DPAD DOWN joy=%v s: %v\n", joy, s) - } else if -(*axes)[1] > sys.controllerStickSensitivitySDL { // up - s = strconv.Itoa(base) - fmt.Printf("[input_sdl.go][checkAxisForDpad] AXIS for DPAD UP joy=%v s: %v\n", joy, s) - } - return s + if len(*axes) < 2 { + return "" + } + + axis0 := getAxisValue((*axes)[0], sys.controllerStickSensitivitySDL) + axis1 := getAxisValue((*axes)[1], sys.controllerStickSensitivitySDL) + + if axis0 > 0 { + return strconv.Itoa(2 + base) + } else if axis0 < 0 { + return strconv.Itoa(1 + base) + } + + if axis1 > 0 { + return strconv.Itoa(3 + base) + } else if axis1 < 0 { + return strconv.Itoa(base) + } + + return "" } func checkAxisForTrigger(joy int, axes *[]int16) string { - var s string = "" + name := input.GetJoystickName(joy) + "." + runtime.GOOS + "." + runtime.GOARCH + ".sdl" + + restingTriggers := map[string][]int{ + "XInput Gamepad (GLFW).windows.amd64.sdl": {4, 5}, + "PS4 Controller.windows.amd64.sdl": {4, 5}, + "Steam Virtual Gamepad.linux.amd64.glfw": {2, 5}, + "Steam Deck Controller.linux.amd64.sdl": {2, 5}, + "PS3 Controller.linux.amd64.sdl": {2, 5}, + "Logitech Dual Action.linux.amd64.sdl": {2, 5}, + "Gamepad.linux.arm64.sdl": {4, 5}, + } + + exceptions := restingTriggers[name] + for i := range *axes { - if (*axes)[i] < -sys.controllerStickSensitivitySDL { - name := input.GetJoystickName(joy) + "." + runtime.GOOS + "." + runtime.GOARCH + ".sdl" - if (i == 4 || i == 5) && name == "XInput Gamepad (GLFW).windows.amd64.sdl" { - // do nothing - } else if (i == 4 || i == 5) && name == "PS4 Controller.windows.amd64.sdl" { - // do nothing - } else if (i == 2 || i == 5) && name == "Steam Virtual Gamepad.linux.amd64.glfw" { - // do nothing - } else if (i == 2 || i == 5) && name == "Steam Deck Controller.linux.amd64.sdl" { - // do nothing - } else if (i == 2 || i == 5) && name == "PS3 Controller.linux.amd64.sdl" { - // do nothing - } else if (i == 2 || i == 5) && name == "Logitech Dual Action.linux.amd64.sdl" { - // do nothing - } else if (i == 4 || i == 5) && name == "Gamepad.linux.arm64.sdl" { - // do nothing - } else { - s = strconv.Itoa(-i*2 - 1) - fmt.Printf("[input_sdl.go][checkAxisForTrigger] 1.AXIS joy=%v i=%v s:%v axes[i]=%v\n", joy, i, s, (*axes)[i]) + value := getAxisValue((*axes)[i], sys.controllerStickSensitivitySDL) + + isException := false + for _, ex := range exceptions { + if i == ex && value < 0 { + isException = true break } - } else if (*axes)[i] > sys.controllerStickSensitivitySDL { - s = strconv.Itoa(-i*2 - 2) - fmt.Printf("[input_sdl.go][checkAxisForTrigger] 2.AXIS joy=%v i=%v s:%v axes[i]=%v\n", joy, i, s, (*axes)[i]) - break + } + + if isException { + continue + } + + if value < 0 { + return strconv.Itoa(-i*2 - 1) + } else if value > 0 { + return strconv.Itoa(-i*2 - 2) } } - return s + + return "" } ================================================ FILE: packages/sx05re/emulators/ikemen-go/sdlgamepadmap/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2025-present Diegrosan (https://github.com/Diegrosan) # PKG_NAME="sdlgamepadmap" PKG_VERSION="1.0" PKG_REV="1" PKG_ARCH="arm aarch64" PKG_LICENSE="GPLv2" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain SDL2_ttf SDL2" PKG_LONGDESC="joystick map for ikemen-go" PKG_TOOLCHAIN="manual" configure_target() { mkdir -p ${PKG_BUILD} cp -rf ${PKG_DIR}/src/* ${PKG_BUILD}/ } make_target() { ${CC} -s -O3 -o sdl_gamepadmap sdl_gamepadmap.c -lSDL2 -lSDL2_ttf -ljson-c -lm } makeinstall_target() { mkdir -p "$INSTALL/usr/bin" cp -f "$PKG_BUILD/sdl_gamepadmap" "$INSTALL/usr/bin/sdl_gamepadmap" chmod +x "$INSTALL/usr/bin/sdl_gamepadmap" } ================================================ FILE: packages/sx05re/emulators/ikemen-go/sdlgamepadmap/src/sdl_gamepadmap.c ================================================ #include #include #include #include #include #include const char *button_names[] = { "Up", "Down", "Left", "Right", "A", "B", "C", "X", "Y", "Z", "Start", "L", "R", "Menu" }; #define NUM_BUTTONS (sizeof(button_names) / sizeof(button_names[0])) #define COLOR_BG_R 15 #define COLOR_BG_G 23 #define COLOR_BG_B 42 #define COLOR_PRIMARY_R 59 #define COLOR_PRIMARY_G 130 #define COLOR_PRIMARY_B 246 #define COLOR_SUCCESS_R 16 #define COLOR_SUCCESS_G 185 #define COLOR_SUCCESS_B 129 #define COLOR_TEXT_R 255 #define COLOR_TEXT_G 255 #define COLOR_TEXT_B 255 #define COLOR_ARROW_R 59 #define COLOR_ARROW_G 130 #define COLOR_ARROW_B 246 typedef struct { SDL_Renderer *ren; TTF_Font *font_large; TTF_Font *font_medium; TTF_Font *font_small; int screen_w; int screen_h; } UI_Context; void drawText(UI_Context *ui, const char *text, int x, int y, TTF_Font *font, SDL_Color color) { SDL_Surface *surf = TTF_RenderUTF8_Blended(font, text, color); if (!surf) return; SDL_Texture *tex = SDL_CreateTextureFromSurface(ui->ren, surf); SDL_Rect dest = {x, y, surf->w, surf->h}; SDL_RenderCopy(ui->ren, tex, NULL, &dest); SDL_FreeSurface(surf); SDL_DestroyTexture(tex); } void drawTextCentered(UI_Context *ui, const char *text, int y, TTF_Font *font, SDL_Color color) { SDL_Surface *surf = TTF_RenderUTF8_Blended(font, text, color); if (!surf) return; SDL_Texture *tex = SDL_CreateTextureFromSurface(ui->ren, surf); int x = (ui->screen_w - surf->w) / 2; SDL_Rect dest = {x, y, surf->w, surf->h}; SDL_RenderCopy(ui->ren, tex, NULL, &dest); SDL_FreeSurface(surf); SDL_DestroyTexture(tex); } void drawRoundedRect(SDL_Renderer *ren, int x, int y, int w, int h, int r, int g, int b, int a) { SDL_SetRenderDrawColor(ren, r, g, b, a); SDL_Rect rect = {x + 4, y, w - 8, h}; SDL_RenderFillRect(ren, &rect); rect = (SDL_Rect){x, y + 4, w, h - 8}; SDL_RenderFillRect(ren, &rect); for (int i = 0; i < 4; i++) { SDL_Rect corner = {x + i, y + i, w - i * 2, h - i * 2}; SDL_RenderDrawRect(ren, &corner); } } void drawArrow(SDL_Renderer *ren, int x, int y, int size, int direction) { SDL_SetRenderDrawColor(ren, COLOR_ARROW_R, COLOR_ARROW_G, COLOR_ARROW_B, 255); SDL_Point points[4]; switch (direction) { case 0: points[0] = (SDL_Point){x, y - size / 2}; points[1] = (SDL_Point){x - size / 2, y + size / 2}; points[2] = (SDL_Point){x, y + size / 4}; points[3] = (SDL_Point){x + size / 2, y + size / 2}; break; case 1: points[0] = (SDL_Point){x, y + size / 2}; points[1] = (SDL_Point){x - size / 2, y - size / 2}; points[2] = (SDL_Point){x, y - size / 4}; points[3] = (SDL_Point){x + size / 2, y - size / 2}; break; case 2: points[0] = (SDL_Point){x - size / 2, y}; points[1] = (SDL_Point){x + size / 2, y - size / 2}; points[2] = (SDL_Point){x + size / 4, y}; points[3] = (SDL_Point){x + size / 2, y + size / 2}; break; case 3: points[0] = (SDL_Point){x + size / 2, y}; points[1] = (SDL_Point){x - size / 2, y - size / 2}; points[2] = (SDL_Point){x - size / 4, y}; points[3] = (SDL_Point){x - size / 2, y + size / 2}; break; } for (int i = 0; i < 4; i++) { SDL_RenderDrawLine(ren, points[i].x, points[i].y, points[(i + 1) % 4].x, points[(i + 1) % 4].y); } SDL_RenderDrawLines(ren, points, 4); } void drawButton(UI_Context *ui, const char *name, int x, int y, int pressed, int is_arrow, int arrow_dir) { int w = 100, h = 100; drawRoundedRect(ui->ren, x + 4, y + 4, w, h, 0, 0, 0, 80); if (pressed) { drawRoundedRect(ui->ren, x, y, w, h, COLOR_SUCCESS_R, COLOR_SUCCESS_G, COLOR_SUCCESS_B, 255); } else { drawRoundedRect(ui->ren, x, y, w, h, 50, 50, 60, 255); } SDL_SetRenderDrawColor(ui->ren, COLOR_PRIMARY_R, COLOR_PRIMARY_G, COLOR_PRIMARY_B, 255); for (int i = 0; i < 3; i++) { SDL_Rect border = {x + i, y + i, w - i * 2, h - i * 2}; SDL_RenderDrawRect(ui->ren, &border); } if (is_arrow) { drawArrow(ui->ren, x + w / 2, y + h / 2, 40, arrow_dir); } else { SDL_Color color = {COLOR_TEXT_R, COLOR_TEXT_G, COLOR_TEXT_B, 255}; SDL_Surface *surf = TTF_RenderUTF8_Blended(ui->font_medium, name, color); if (surf) { SDL_Texture *tex = SDL_CreateTextureFromSurface(ui->ren, surf); int tx = x + (w - surf->w) / 2; int ty = y + (h - surf->h) / 2; SDL_Rect dest = {tx, ty, surf->w, surf->h}; SDL_RenderCopy(ui->ren, tex, NULL, &dest); SDL_FreeSurface(surf); SDL_DestroyTexture(tex); } } } void drawGamepadLayout(UI_Context *ui, int current_button, int pressed_buttons[NUM_BUTTONS]) { int cx = ui->screen_w / 2; int cy = ui->screen_h / 2 + 80; int spacing = 120; int dpad_x = cx - 350; int dpad_y = cy - 60; drawButton(ui, "Up", dpad_x, dpad_y - spacing, pressed_buttons[0], 1, 0); drawButton(ui, "Down", dpad_x, dpad_y + spacing, pressed_buttons[1], 1, 1); drawButton(ui, "Left", dpad_x - spacing, dpad_y, pressed_buttons[2], 1, 2); drawButton(ui, "Right", dpad_x + spacing, dpad_y, pressed_buttons[3], 1, 3); int action_x = cx + 350; int action_y = cy - 60; drawButton(ui, "X", action_x, action_y - spacing, pressed_buttons[7], 0, 0); drawButton(ui, "Y", action_x - spacing, action_y, pressed_buttons[8], 0, 0); drawButton(ui, "A", action_x, action_y + spacing, pressed_buttons[4], 0, 0); drawButton(ui, "B", action_x + spacing, action_y, pressed_buttons[5], 0, 0); drawButton(ui, "L", cx - 250, cy - 250, pressed_buttons[11], 0, 0); drawButton(ui, "R", cx + 150, cy - 250, pressed_buttons[12], 0, 0); drawButton(ui, "Select", cx - 130, cy + 200, pressed_buttons[13], 0, 0); drawButton(ui, "Start", cx + 30, cy + 200, pressed_buttons[10], 0, 0); drawButton(ui, "C", cx - 110, cy - 60, pressed_buttons[6], 0, 0); drawButton(ui, "Z", cx + 110, cy - 60, pressed_buttons[9], 0, 0); } void saveMapping(const char *path, int js_id, char button_values[NUM_BUTTONS][8]) { struct json_object *root = json_object_from_file(path); if (!root) root = json_object_new_object(); struct json_object *jarr = json_object_object_get(root, "JoystickConfig"); if (!jarr) { jarr = json_object_new_array(); json_object_object_add(root, "JoystickConfig", jarr); } struct json_object *entry = json_object_new_object(); json_object_object_add(entry, "Joystick", json_object_new_int(js_id)); struct json_object *btns = json_object_new_array(); for (int i = 0; i < NUM_BUTTONS; i++) { json_object_array_add(btns, json_object_new_string(button_values[i])); } json_object_object_add(entry, "Buttons", btns); while (json_object_array_length(jarr) <= js_id) json_object_array_add(jarr, json_object_new_object()); json_object_array_put_idx(jarr, js_id, entry); json_object_to_file_ext(path, root, JSON_C_TO_STRING_PRETTY); json_object_put(root); } int main(int argc, char *argv[]) { if (argc < 2) { printf("Usage: %s \n", argv[0]); return 1; } const char *CONFIG_PATH = argv[1]; if (SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO) < 0) { printf("Error initializing SDL: %s\n", SDL_GetError()); return 1; } if (TTF_Init() < 0) { printf("Error initializing TTF: %s\n", TTF_GetError()); return 1; } SDL_DisplayMode dm; SDL_GetCurrentDisplayMode(0, &dm); int screen_w = dm.w * 0.8; int screen_h = dm.h * 0.8; SDL_Window *win = SDL_CreateWindow("Gamepad Mapper Pro", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, screen_w, screen_h, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE); SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); UI_Context ui = { .ren = ren, .font_large = TTF_OpenFont("/usr/share/fonts/liberation/LiberationSans-Bold.ttf", 48), .font_medium = TTF_OpenFont("/usr/share/fonts/liberation/LiberationSans-Regular.ttf", 28), .font_small = TTF_OpenFont("/usr/share/fonts/liberation/LiberationSans-Regular.ttf", 20), .screen_w = screen_w, .screen_h = screen_h }; if (!ui.font_large || !ui.font_medium || !ui.font_small) { printf("Error loading fonts. Make sure Liberation Sans is installed.\n"); return 1; } int num_joysticks = SDL_NumJoysticks(); if (num_joysticks < 1) { printf("No joystick detected!\n"); return 0; } SDL_Joystick *joysticks[4] = {NULL}; int device_index[4] = {-1, -1, -1, -1}; for (int i = 0; i < num_joysticks && i < 4; i++) { joysticks[i] = SDL_JoystickOpen(i); if (joysticks[i]) { SDL_JoystickID instance_id = SDL_JoystickInstanceID(joysticks[i]); device_index[instance_id] = i; printf("Joystick %d opened - Instance ID: %d - Name: %s\n", i, instance_id, SDL_JoystickName(joysticks[i])); } } int js_id = -1; int device_id = -1; Uint32 first_press_time = 0; int detecting_instance_id = -1; while (js_id == -1) { SDL_Event e; while (SDL_PollEvent(&e)) { if (e.type == SDL_JOYBUTTONDOWN || (e.type == SDL_JOYAXISMOTION && abs(e.jaxis.value) > 16000)) { int current_instance_id = (e.type == SDL_JOYBUTTONDOWN) ? e.jbutton.which : e.jaxis.which; if (detecting_instance_id == -1) { detecting_instance_id = current_instance_id; first_press_time = SDL_GetTicks(); } else if (detecting_instance_id == current_instance_id) { if (SDL_GetTicks() - first_press_time >= 5000) { js_id = current_instance_id; device_id = device_index[current_instance_id]; break; } } else { detecting_instance_id = current_instance_id; first_press_time = SDL_GetTicks(); } } else if (e.type == SDL_QUIT) { for (int i = 0; i < 4; i++) { if (joysticks[i]) SDL_JoystickClose(joysticks[i]); } SDL_Quit(); return 0; } } SDL_SetRenderDrawColor(ren, COLOR_BG_R, COLOR_BG_G, COLOR_BG_B, 255); SDL_RenderClear(ren); SDL_Color white = {255, 255, 255, 255}; SDL_Color yellow = {255, 230, 100, 255}; drawTextCentered(&ui, "Press any button", screen_h / 2 - 100, ui.font_large, white); drawTextCentered(&ui, "on the controller to map", screen_h / 2 - 40, ui.font_medium, white); if (detecting_instance_id != -1) { Uint32 elapsed = SDL_GetTicks() - first_press_time; float progress = (float)elapsed / 5000.0f; if (progress > 1.0f) progress = 1.0f; int detecting_device = device_index[detecting_instance_id]; char msg[64]; snprintf(msg, sizeof(msg), "Detecting Joystick %d (/dev/input/js%d)", detecting_device, detecting_device); drawTextCentered(&ui, msg, screen_h / 2 + 40, ui.font_medium, yellow); int bar_w = 400; int bar_h = 30; int bar_x = (screen_w - bar_w) / 2; int bar_y = screen_h / 2 + 100; drawRoundedRect(ren, bar_x, bar_y, bar_w, bar_h, 40, 40, 50, 255); int fill_w = (int)(bar_w * progress); if (fill_w > 0) { drawRoundedRect(ren, bar_x, bar_y, fill_w, bar_h, COLOR_SUCCESS_R, COLOR_SUCCESS_G, COLOR_SUCCESS_B, 255); } float remaining = 5.0f - (elapsed / 1000.0f); if (remaining < 0) remaining = 0; snprintf(msg, sizeof(msg), "%.1f seconds", remaining); drawTextCentered(&ui, msg, bar_y + bar_h + 20, ui.font_small, white); } else { drawTextCentered(&ui, "Hold for 5 seconds", screen_h / 2 + 40, ui.font_small, white); } SDL_RenderPresent(ren); SDL_Delay(16); } SDL_Joystick *target = joysticks[device_id]; printf("\n✓ Selected controller: Joystick %d (/dev/input/js%d)\n", device_id, device_id); printf(" Name: %s\n\n", SDL_JoystickName(target)); for (int i = 0; i < 4; i++) { if (joysticks[i] && i != device_id) SDL_JoystickClose(joysticks[i]); } char button_values[NUM_BUTTONS][8]; int pressed_buttons[NUM_BUTTONS] = {0}; memset(button_values, 0, sizeof(button_values)); for (int i = 0; i < NUM_BUTTONS; i++) { int mapped = 0; while (!mapped) { SDL_Event e; while (SDL_PollEvent(&e)) { if (e.type == SDL_JOYBUTTONDOWN) { snprintf(button_values[i], sizeof(button_values[i]), "%d", e.jbutton.button); pressed_buttons[i] = 1; mapped = 1; } else if (e.type == SDL_JOYAXISMOTION && abs(e.jaxis.value) > 16000) { snprintf(button_values[i], sizeof(button_values[i]), "%s%d", (e.jaxis.value < 0 ? "-" : ""), e.jaxis.axis); pressed_buttons[i] = 1; mapped = 1; } else if (e.type == SDL_QUIT) { SDL_Quit(); return 0; } } SDL_SetRenderDrawColor(ren, COLOR_BG_R, COLOR_BG_G, COLOR_BG_B, 255); SDL_RenderClear(ren); SDL_Color white = {255, 255, 255, 255}; SDL_Color yellow = {255, 230, 100, 255}; char instruction[64]; snprintf(instruction, sizeof(instruction), "Press: %s", button_names[i]); drawTextCentered(&ui, instruction, 50, ui.font_large, yellow); char progress[32]; snprintf(progress, sizeof(progress), "Button %d of %d", i + 1, NUM_BUTTONS); drawTextCentered(&ui, progress, 120, ui.font_small, white); drawGamepadLayout(&ui, i, pressed_buttons); SDL_RenderPresent(ren); SDL_Delay(16); } SDL_Delay(200); } saveMapping(CONFIG_PATH, device_id, button_values); SDL_SetRenderDrawColor(ren, COLOR_BG_R, COLOR_BG_G, COLOR_BG_B, 255); SDL_RenderClear(ren); SDL_Color green = {COLOR_SUCCESS_R, COLOR_SUCCESS_G, COLOR_SUCCESS_B, 255}; char success_msg[128]; snprintf(success_msg, sizeof(success_msg), "✓ Configuration Saved! (Joystick %d)", device_id); drawTextCentered(&ui, success_msg, screen_h / 2, ui.font_large, green); SDL_RenderPresent(ren); SDL_Delay(2500); printf("✓ Mapping saved successfully at: %s\n", CONFIG_PATH); printf(" Joystick ID: %d (/dev/input/js%d)\n", device_id, device_id); TTF_CloseFont(ui.font_large); TTF_CloseFont(ui.font_medium); TTF_CloseFont(ui.font_small); SDL_JoystickClose(target); SDL_DestroyRenderer(ren); SDL_DestroyWindow(win); TTF_Quit(); SDL_Quit(); return 0; } ================================================ FILE: packages/sx05re/emulators/ikemen-go/src/Ikemen_Go.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2025-present DiegroSan (https://github.com/Diegrosan) # . /etc/profile IKEMEN_ALSA_CONF=/storage/.config/asound-ikemen.conf ALSA_CONF=/storage/.config/asound.conf mv ${ALSA_CONF} ${ALSA_CONF}.tmp cp ${IKEMEN_ALSA_CONF} ${ALSA_CONF} LOGSDIR="/emuelec/logs" LOGFILE="$LOGSDIR/ikemen.log" SHARED="/usr/share/ikemen_go" CONFIGDIRHOME="/tmp/ikemen" # Language log Configuration by DiegroSan config_file="/storage/.config/emuelec/configs/emuelec.conf" language_value=$(grep '^system.language=' "$config_file" | cut -d'=' -f2) if [ "$language_value" = "pt_BR" ]; then MESSAGE_001="Erro: Nenhum arquivo foi passado como argumento." MESSAGE_002="Nome do jogo:" MESSAGE_003="Diretório de Temporário:" MESSAGE_004="Diretório do arquivo:" MESSAGE_005="Aliando dependências do Ikemen_Go:" MESSAGE_006="Links simbólicos criados com sucesso." MESSAGE_007="Erro ao criar links simbólicos." MESSAGE_008="Verificação dos arquivos do Ikemen_Go" MESSAGE_009="error gamecontrollerdb" MESSAGE_010="error saving gamepadmap configuration" MESSAGE_011="Falha ao copiar $file" MESSAGE_012="Falha ao copiar diretório external" MESSAGE_013="Falha ao copiar arquivos de fonte" MESSAGE_014="Arquivo de configuração não encontrado:" MESSAGE_015="Sem permissão de escrita em:" MESSAGE_016="Executável Ikemen_Go não encontrado ou sem permissão de execução" elif [ "$language_value" = "es_ES" ]; then MESSAGE_001="Error: No se pasó ningún archivo como argumento." MESSAGE_002="Nombre del juego:" MESSAGE_003="Directorio temporal:" MESSAGE_004="Directorio del archivo:" MESSAGE_005="Alineando dependencias do Ikemen_Go:" MESSAGE_006="Enlaces simbólicos creados con éxito." MESSAGE_007="Error al crear enlaces simbólicos." MESSAGE_008="Verificación de los archivos de Ikemen_Go" MESSAGE_009="error gamecontrollerdb" MESSAGE_010="error saving gamepadmap configuration" MESSAGE_011="Error al copiar $file" MESSAGE_012="Error al copiar el directorio external" MESSAGE_013="Error al copiar archivos de fuente" MESSAGE_014="Archivo de configuración no encontrado:" MESSAGE_015="Sin permiso de escritura en:" MESSAGE_016="Ejecutable Ikemen_Go no encontrado o sin permiso de ejecución" elif [ "$language_value" = "zh_CN" ]; then MESSAGE_001="错误:没有文件作为参数传递。" MESSAGE_002="游戏名称:" MESSAGE_003="临时目录:" MESSAGE_004="文件目录:" MESSAGE_005="对齐文件依赖关系:" MESSAGE_006="符号链接创建成功。" MESSAGE_007="创建符号链接时出错。" MESSAGE_008="验证Ikemen_Go文件" MESSAGE_009="error gamecontrollerdb" MESSAGE_010="error saving gamepadmap configuration" MESSAGE_011="复制失败 $file" MESSAGE_012="复制external目录失败" MESSAGE_013="复制字体文件失败" MESSAGE_014="未找到配置文件:" MESSAGE_015="没有写入权限:" MESSAGE_016="找不到Ikemen_Go可执行文件或没有执行权限" else MESSAGE_001="Error: No file was passed as an argument." MESSAGE_002="Game name:" MESSAGE_003="Temp Directory:" MESSAGE_004="File directory:" MESSAGE_005="Aligning Ikemen_Go dependencies:" MESSAGE_006="Symbolic links created successfully." MESSAGE_007="Error creating symbolic links." MESSAGE_008="Verifying Ikemen_Go files" MESSAGE_009="error gamecontrollerdb" MESSAGE_010="error saving gamepadmap configuration" MESSAGE_011="Failed to copy $file" MESSAGE_012="Failed to copy external directory" MESSAGE_013="Failed to copy font files" MESSAGE_014="Configuration file not found:" MESSAGE_015="No write permission in:" MESSAGE_016="Ikemen_Go executable not found or no execution permission" fi log() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOGFILE" } if [ ! -f "$config_file" ]; then log "$MESSAGE_014 $config_file" exit 1 fi mkdir -p "$CONFIGDIRHOME" mkdir -p "$LOGSDIR" rm -f "$LOGFILE" #killall gptokeyb 2>/dev/null [ -z "$1" ] && { log "$MESSAGE_001"; exit 1; } OB="$1" GAME=$(basename "${OB%.*}") CONFIGDIR="$CONFIGDIRHOME/$GAME" IKEMEN=$(dirname "$OB") log "$MESSAGE_002 $GAME" log "$MESSAGE_003 $CONFIGDIR" if [ ! -w "$CONFIGDIRHOME" ]; then log "$MESSAGE_015 $CONFIGDIRHOME" exit 1 fi rm -rf "$CONFIGDIRHOME"/* mkdir -p "$CONFIGDIR" log "$MESSAGE_004 $IKEMEN" # Required files files=( "action.zss" "common.const" "functions.zss" "system.base.def" "common.air" "common1.cns.zss" "guardbreak.zss" "tag.zss" "common.cmd" "dizzy.zss" "score.zss" "training.zss" ) # Create data directory if it doesn't exist mkdir -p "$IKEMEN/data" # Create save directory mkdir -p "$IKEMEN/save" # Check and copy required files for file in "${files[@]}"; do if [ ! -f "$IKEMEN/data/$file" ]; then cp "$SHARED/data/$file" "$IKEMEN/data/$file" 2>/dev/null || log "$MESSAGE_011" fi done # Handle external directory if [ ! -d "$IKEMEN/external" ]; then cp -r "$SHARED/external" "$IKEMEN/" 2>/dev/null || log "$MESSAGE_012" fi # Handle font directory mkdir -p "$IKEMEN/font" cp -r "$SHARED/font/"* "$IKEMEN/font/" 2>/dev/null || log "$MESSAGE_013" log "$MESSAGE_005 $IKEMEN" # Create symbolic links ln -sf "$IKEMEN"/* "$CONFIGDIR/" GAMEMAP=$(get_ee_setting ee_ikemen.enabled) if [[ ${GAMEMAP} != 0 ]]; then gamepadmap "${IKEMEN}/save/config.json" 2>/dev/null || log "$MESSAGE_010" fi if [ $? -eq 0 ]; then log "$MESSAGE_006" else log "$MESSAGE_007" exit 1 fi cd "$CONFIGDIR" || exit 1 # Verifying included the game assets log "$MESSAGE_008" Ikemen_Go -audit >> "$LOGFILE" 2>&1 exec nice -n -20 Ikemen_Go # restore asound.conf rm ${ALSA_CONF} mv ${ALSA_CONF}.tmp ${ALSA_CONF} ================================================ FILE: packages/sx05re/emulators/ikemen-go/src/asound-ikemen.conf ================================================ pcm.!default { type plug slave.pcm "dmixer" } pcm.dmixer { type dmix ipc_key 1024 slave { pcm "hw:0,0" period_time 0 period_size 1024 buffer_size 4096 rate 44100 } bindings { 0 0 1 1 } } ================================================ FILE: packages/sx05re/emulators/jzintv/config/jzintv_keyb.hack ================================================ ; ----------------------------------------------------------------------------------------- MAP 0 ; keymap 0 (default keymap) ; ----------------------------------------------------------------------------------------- ; ***** Joystick #0 - Left Controller ***** ; ** Side Buttons and Numeric Keypad ** JS0_BTN_00 PD0L_A_T JS0_BTN_01 PD0L_A_L JS0_BTN_02 PD0L_A_R JS0_BTN_03 PD0L_KP1 JS0_BTN_04 PD0L_KP2 JS0_BTN_05 PD0L_KP3 JS0_BTN_06 PD0L_KP4 JS0_BTN_07 PD0L_KP5 JS0_BTN_08 PD0L_KP6 JS0_BTN_09 PD0L_KP7 JS0_BTN_10 PD0L_KP8 JS0_BTN_11 PD0L_KP9 JS0_BTN_12 PD0L_KPC JS0_BTN_13 PD0L_KP0 JS0_BTN_07 PD0L_KPE ; ** Direction Disc ** JS0_HAT0_N PD0L_J_N JS0_HAT0_NNE PD0L_J_NNE JS0_HAT0_NE PD0L_J_NE JS0_HAT0_ENE PD0L_J_ENE JS0_HAT0_E PD0L_J_E JS0_HAT0_ESE PD0L_J_ESE JS0_HAT0_SE PD0L_J_SE JS0_HAT0_SSE PD0L_J_SSE JS0_HAT0_S PD0L_J_S JS0_HAT0_SSW PD0L_J_SSW JS0_HAT0_SW PD0L_J_SW JS0_HAT0_WSW PD0L_J_WSW JS0_HAT0_W PD0L_J_W JS0_HAT0_WNW PD0L_J_WNW JS0_HAT0_NW PD0L_J_NW JS0_HAT0_NNW PD0L_J_NNW ; ***** Joystick #1 - Right Controller ***** ; ** Side Buttons and Numeric Keypad ** JS1_BTN_00 PD0R_A_T JS1_BTN_01 PD0R_A_L JS1_BTN_02 PD0R_A_R JS1_BTN_03 PD0R_KP1 JS1_BTN_04 PD0R_KP2 JS1_BTN_05 PD0R_KP3 JS1_BTN_06 PD0R_KP4 JS1_BTN_07 PD0R_KP5 JS1_BTN_08 PD0R_KP6 JS1_BTN_09 PD0R_KP7 JS1_BTN_10 PD0R_KP8 JS1_BTN_11 PD0R_KP9 JS1_BTN_12 PD0R_KPC JS1_BTN_13 PD0R_KP0 JS1_BTN_14 PD0R_KPE ; ** Direction Disc ** JS1_N PD0R_J_N JS1_NNE PD0R_J_NNE JS1_NE PD0R_J_NE JS1_ENE PD0R_J_ENE JS1_E PD0R_J_E JS1_ESE PD0R_J_ESE JS1_SE PD0R_J_SE JS1_SSE PD0R_J_SSE JS1_S PD0R_J_S JS1_SSW PD0R_J_SSW JS1_SW PD0R_J_SW JS1_WSW PD0R_J_WSW JS1_W PD0R_J_W JS1_WNW PD0R_J_WNW JS1_NW PD0R_J_NW JS1_NNW PD0R_J_NNW ================================================ FILE: packages/sx05re/emulators/jzintv/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="jzintv" PKG_VERSION="20200712" PKG_LICENSE="FOSS" PKG_SITE="http://spatula-city.org/~im14u2c/intv" PKG_URL="${PKG_SITE}/dl/jzintv-${PKG_VERSION}-src.zip" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_mixer SDL2_net" PKG_LONGDESC="Joe Zbiciak Intellivision Emulator" PKG_TOOLCHAIN="make" pre_configure_target() { sed -i "s|sdl2-config|${SYSROOT_PREFIX}/usr/bin/sdl2-config|g" src/Makefile PKG_MAKE_OPTS_TARGET="-C src/ -f Makefile GNU_READLINE=0 " } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp bin/jzintv ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs cp -rf ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs } ================================================ FILE: packages/sx05re/emulators/jzintv/patches/01-emuelec-only-build-emu.patch ================================================ --- a/src/Makefile +++ b/src/Makefile @@ -40,7 +40,7 @@ # Get SDL2 related build flags. SDL2_CFLAGS := $(shell sdl2-config --cflags) -DUSE_SDL2 -SDL2_LFLAGS := $(shell sdl2-config --static-libs || sdl2-config --libs) +SDL2_LFLAGS := $(shell sdl2-config --libs) # Override these in a .mak file. See buidlcfg/00-compiler*.txt for examples. # @@ -115,8 +115,8 @@ $(PROG_SDL2): $(OBJS) $(OBJS_SDL1) $(CXX) -o $(PROG_SDL2) $(OBJS) $(OBJS_SDL2) $(CFLAGS) $(SDL2_LFLAGS) $(LFLAGS) $(RL_LFLAGS) -$(PROG_NULL): $(OBJS) $(OBJS_NULL) - $(CXX) -o $(PROG_NULL) $(OBJS) $(OBJS_NULL) $(CFLAGS) $(SLFLAGS) $(RL_LFLAGS) +# $(PROG_NULL): $(OBJS) $(OBJS_NULL) +# $(CXX) -o $(PROG_NULL) $(OBJS) $(OBJS_NULL) $(CFLAGS) $(SLFLAGS) $(RL_LFLAGS) clean: $(RM) $(OBJS) @@ -150,4 +150,4 @@ ## Makefile.common includes all the subMakefiles and such ############################################################################## include Makefile.common -build: jzIntv SDK-1600 +build: jzIntv ================================================ FILE: packages/sx05re/emulators/jzintv/scripts/jzintv.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile [ -n "$1" ] || exit 1 IN="$1" # Resolution -> "-z WxH,32" MODE="$(get_resolution 2>/dev/null || echo '640 480')" case "$MODE" in *x*) W="${MODE%x*}"; H="${MODE#*x}";; *) set -- $MODE; W="$1"; H="$2";; esac case "$W" in *[!0-9]*|'') W=640;; esac case "$H" in *[!0-9]*|'') H=480;; esac [ "$W" -lt 320 ] 2>/dev/null && W=640 [ "$H" -lt 200 ] 2>/dev/null && H=480 RES="${W}x${H},32" # ZIP -> pick first valid cart TMP="" trap '[ -n "$TMP" ] && rm -rf "$TMP"' EXIT ROM="$IN" case "$IN" in *.zip|*.ZIP|*.Zip) TMP="$(mktemp -d)" if command -v unzip >/dev/null 2>&1; then unzip -o -qq "$IN" -d "$TMP" elif command -v bsdtar >/dev/null 2>&1; then bsdtar -xf "$IN" -C "$TMP" else echo "Need unzip or bsdtar" >&2 exit 1 fi ROM="$(find "$TMP" -type f \( -iname '*.cfg' -o -iname '*.rom' -o -iname '*.cc3' -o -iname '*.bin' -o -iname '*.int' -o -iname '*.itv' \) | head -n1)" [ -n "$ROM" ] || { echo "No cart file in ZIP" >&2; exit 1; } ;; esac # Optional keyboard hack KBD="/emuelec/configs/jzintv_keyb.hack" [ -f "$KBD" ] && KBD_OPT="--kbdhackfile $KBD" || KBD_OPT="" exec jzintv -f1 -z "$RES" -p /storage/roms/bios/ "$ROM" $KBD_OPT ================================================ FILE: packages/sx05re/emulators/mesen2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="mesen2" PKG_VERSION="fabc9a62174f8734a113df6d244f5539ef6b8fcf" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/SourMesen/Mesen2" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_mixer SDL2_net" PKG_LONGDESC="ECWolf is a port of the Wolfenstein 3D engine based of Wolf4SDL. It combines the original Wolfenstein 3D engine with the user experience of ZDoom to create the most user and mod author friendly Wolf3D source port." PKG_TOOLCHAIN="make" make_target() { export PUBLISHFLAGS="-r linux-arm64 --no-self-contained false -p:PublishSingleFile=true -p:PublishReadyToRun=true" USE_GCC=true MESENPLATFORM=linux-arm64 make } ================================================ FILE: packages/sx05re/emulators/mesen2/sources/makefile ================================================ #Welcome to what must be the most terrible makefile ever (but hey, it works) #Both clang & gcc work fine - clang seems to output faster code #.NET 6 (and its dev tools) must be installed to compile the UI. #The emulation core also requires SDL2. #Run "make" to build, "make run" to run MESENFLAGS= ifeq ($(USE_GCC),true) CXX := g++ CC := gcc PROFILE_GEN_FLAG := -fprofile-generate PROFILE_USE_FLAG := -fprofile-use else CXX := clang++ CC := clang PROFILE_GEN_FLAG := -fprofile-instr-generate=$(CURDIR)/PGOHelper/pgo.profraw PROFILE_USE_FLAG := -fprofile-instr-use=$(CURDIR)/PGOHelper/pgo.profdata endif SDL2LIB := $(shell sdl2-config --libs) SDL2INC := $(shell sdl2-config --cflags) LINKCHECKUNRESOLVED := -Wl,-z,defs LINKOPTIONS := MESENOS := UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Linux) MESENOS := linux SHAREDLIB := MesenCore.so endif ifeq ($(UNAME_S),Darwin) MESENOS := osx SHAREDLIB := MesenCore.dylib LTO := false STATICLINK := false LINKCHECKUNRESOLVED := endif MESENFLAGS += -m64 MACHINE := $(shell uname -m) ifeq ($(MACHINE),x86_64) MESENPLATFORM := $(MESENOS)-x64 endif ifneq ($(filter %86,$(MACHINE)),) MESENPLATFORM := $(MESENOS)-x64 endif # TODO: this returns `aarch64` on one of my machines... ifneq ($(filter arm%,$(MACHINE)),) MESENPLATFORM := $(MESENOS)-arm64 endif ifeq ($(MACHINE),aarch64) MESENPLATFORM := $(MESENOS)-arm64 ifeq ($(USE_GCC),true) #don't set -m64 on arm64 for gcc (unrecognized option) MESENFLAGS= endif endif DEBUG ?= 0 ifeq ($(DEBUG),0) MESENFLAGS += -O3 ifneq ($(LTO),false) MESENFLAGS += -DHAVE_LTO ifneq ($(USE_GCC),true) MESENFLAGS += -flto=thin else MESENFLAGS += -flto=auto endif endif else MESENFLAGS += -O0 -g # Note: if compiling with a sanitizer, you will likely need to `LD_PRELOAD` the library `libMesenCore.so` will be linked against. ifneq ($(SANITIZER),) ifeq ($(SANITIZER),address) # Currently, `-fsanitize=address` is not supported together with `-fsanitize=thread` MESENFLAGS += -fsanitize=address else ifeq ($(SANITIZER),thread) # Currently, `-fsanitize=address` is not supported together with `-fsanitize=thread` MESENFLAGS += -fsanitize=thread else $(warning Unrecognised $$(SANITIZER) value: $(SANITIZER)) endif # `-Wl,-z,defs` is incompatible with the sanitizers in a shared lib, unless the sanitizer libs are linked dynamically; hence `-shared-libsan` (not the default for Clang). # It seems impossible to link dynamically against two sanitizers at the same time, but that might be a Clang limitation. ifneq ($(USE_GCC),true) MESENFLAGS += -shared-libsan endif endif endif ifeq ($(PGO),profile) MESENFLAGS += ${PROFILE_GEN_FLAG} endif ifeq ($(PGO),optimize) MESENFLAGS += ${PROFILE_USE_FLAG} endif ifneq ($(STATICLINK),false) LINKOPTIONS += -static-libgcc -static-libstdc++ endif ifeq ($(MESENOS),osx) LINKOPTIONS += -framework Foundation -framework Cocoa -framework GameController -framework CoreHaptics -Wl,-rpath,/opt/local/lib endif CXXFLAGS = -fPIC -Wall --std=c++17 $(MESENFLAGS) $(SDL2INC) -I $(realpath ./) -I $(realpath ./Core) -I $(realpath ./Utilities) -I $(realpath ./Sdl) -I $(realpath ./Linux) -I $(realpath ./MacOS) OBJCXXFLAGS = $(CXXFLAGS) CFLAGS = -fPIC -Wall $(MESENFLAGS) OBJFOLDER := obj.$(MESENPLATFORM) DEBUGFOLDER := bin/$(MESENPLATFORM)/Debug RELEASEFOLDER := bin/$(MESENPLATFORM)/Release ifeq ($(DEBUG), 0) OUTFOLDER = $(RELEASEFOLDER) BUILD_TYPE := Release OPTIMIZEUI := -p:OptimizeUi=true else OUTFOLDER = $(DEBUGFOLDER) BUILD_TYPE := Debug OPTIMIZEUI := endif ifeq ($(USE_AOT),true) PUBLISHFLAGS ?= -r $(MESENPLATFORM) -p:PublishSingleFile=false -p:PublishAot=true -p:SelfContained=true else PUBLISHFLAGS ?= -r $(MESENPLATFORM) --no-self-contained true -p:PublishSingleFile=true endif CORESRC := $(shell find Core -name '*.cpp') COREOBJ := $(CORESRC:.cpp=.o) UTILSRC := $(shell find Utilities -name '*.cpp' -o -name '*.c') UTILOBJ := $(addsuffix .o,$(basename $(UTILSRC))) SDLSRC := $(shell find Sdl -name '*.cpp') SDLOBJ := $(SDLSRC:.cpp=.o) SEVENZIPSRC := $(shell find SevenZip -name '*.c') SEVENZIPOBJ := $(SEVENZIPSRC:.c=.o) LUASRC := $(shell find Lua -name '*.c') LUAOBJ := $(LUASRC:.c=.o) ifeq ($(MESENOS),linux) LINUXSRC := $(shell find Linux -name '*.cpp') else LINUXSRC := endif LINUXOBJ := $(LINUXSRC:.cpp=.o) ifeq ($(MESENOS),osx) MACOSSRC := $(shell find MacOS -name '*.mm') else MACOSSRC := endif MACOSOBJ := $(MACOSSRC:.mm=.o) DLLSRC := $(shell find InteropDLL -name '*.cpp') DLLOBJ := $(DLLSRC:.cpp=.o) ifeq ($(SYSTEM_LIBEVDEV), true) LIBEVDEVLIB := $(shell pkg-config --libs libevdev) LIBEVDEVINC := $(shell pkg-config --cflags libevdev) else LIBEVDEVSRC := $(shell find Linux/libevdev -name '*.c') LIBEVDEVOBJ := $(LIBEVDEVSRC:.c=.o) LIBEVDEVINC := -I../ endif ifeq ($(MESENOS),linux) X11LIB := -lX11 else X11LIB := endif FSLIB := -lstdc++fs ifeq ($(MESENOS),osx) LIBEVDEVOBJ := LIBEVDEVINC := LIBEVDEVSRC := FSLIB := ifeq ($(USE_AOT),true) PUBLISHFLAGS := -t:BundleApp -p:UseAppHost=true -p:RuntimeIdentifier=$(MESENPLATFORM) -p:PublishSingleFile=false -p:PublishAot=true -p:SelfContained=true else PUBLISHFLAGS := -t:BundleApp -p:UseAppHost=true -p:RuntimeIdentifier=$(MESENPLATFORM) -p:SelfContained=true -p:PublishSingleFile=false -p:PublishReadyToRun=false endif endif all: ui ui: InteropDLL/$(OBJFOLDER)/$(SHAREDLIB) mkdir -p $(OUTFOLDER)/Dependencies rm -fr $(OUTFOLDER)/Dependencies/* cp InteropDLL/$(OBJFOLDER)/$(SHAREDLIB) $(OUTFOLDER)/$(SHAREDLIB) #Called twice because the first call copies native libraries to the bin folder which need to be included in Dependencies.zip #Don't run with AOT flags the first time to reduce build duration cd UI && ~/.dotnet/dotnet publish -c $(BUILD_TYPE) $(OPTIMIZEUI) -r $(MESENPLATFORM) cd UI && ~/.dotnet/dotnet publish -c $(BUILD_TYPE) $(OPTIMIZEUI) $(PUBLISHFLAGS) core: InteropDLL/$(OBJFOLDER)/$(SHAREDLIB) pgohelper: InteropDLL/$(OBJFOLDER)/$(SHAREDLIB) mkdir -p PGOHelper/$(OBJFOLDER) && cd PGOHelper/$(OBJFOLDER) && $(CXX) $(CXXFLAGS) $(LINKCHECKUNRESOLVED) -o pgohelper ../PGOHelper.cpp ../../bin/pgohelperlib.so -pthread $(FSLIB) $(SDL2LIB) $(LIBEVDEVLIB) $(X11LIB) %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ %.o: %.cpp $(CXX) $(CXXFLAGS) -c $< -o $@ %.o: %.mm $(CXX) $(OBJCXXFLAGS) -c $< -o $@ InteropDLL/$(OBJFOLDER)/$(SHAREDLIB): $(SEVENZIPOBJ) $(LUAOBJ) $(UTILOBJ) $(COREOBJ) $(SDLOBJ) $(LIBEVDEVOBJ) $(LINUXOBJ) $(DLLOBJ) $(MACOSOBJ) mkdir -p bin mkdir -p InteropDLL/$(OBJFOLDER) $(CXX) $(CXXFLAGS) $(LINKOPTIONS) $(LINKCHECKUNRESOLVED) -shared -o $(SHAREDLIB) $(DLLOBJ) $(SEVENZIPOBJ) $(LUAOBJ) $(LINUXOBJ) $(MACOSOBJ) $(LIBEVDEVOBJ) $(UTILOBJ) $(SDLOBJ) $(COREOBJ) $(SDL2INC) -pthread $(FSLIB) $(SDL2LIB) $(LIBEVDEVLIB) $(X11LIB) cp $(SHAREDLIB) bin/pgohelperlib.so mv $(SHAREDLIB) InteropDLL/$(OBJFOLDER) pgo: ./buildPGO.sh run: $(OUTFOLDER)/$(MESENPLATFORM)/publish/Mesen clean: rm -r -f $(COREOBJ) rm -r -f $(UTILOBJ) rm -r -f $(LINUXOBJ) $(LIBEVDEVOBJ) rm -r -f $(SDLOBJ) rm -r -f $(SEVENZIPOBJ) rm -r -f $(LUAOBJ) rm -r -f $(MACOSOBJ) rm -r -f $(DLLOBJ) ================================================ FILE: packages/sx05re/emulators/mupen64plussa/mupen64plussa-audio-sdl/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="mupen64plussa-audio-sdl" PKG_VERSION="af6af5b1fd4fdb435c836be15371dd047f395c4d" PKG_SHA256="265ccdd56736f9cb4144196ad6673d2728a8ebd1e7b9c4280a632c3a343be261" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/mupen64plus/mupen64plus-audio-sdl" PKG_URL="https://github.com/mupen64plus/mupen64plus-audio-sdl/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ${OPENGLES} libpng SDL2 SDL2_net zlib freetype nasm:host mupen64plussa-core" PKG_SHORTDESC="mupen64plus-audio-sdl" PKG_LONGDESC="Mupen64Plus Standalone Audio SDL" PKG_TOOLCHAIN="manual" PKG_MAKE_OPTS_TARGET+="USE_GLES=1" make_target() { export HOST_CPU=aarch64 export APIDIR=$(get_install_dir mupen64plussa-core)/usr/local/include/mupen64plus export USE_GLES=1 export SDL_CFLAGS="-I${SYSROOT_PREFIX}/usr/include/SDL2 -D_REENTRANT" export SDL_LDLIBS="-lSDL2_net -lSDL2" export CROSS_COMPILE="${TARGET_PREFIX}" export V=1 export VC=0 BINUTILS="$(get_build_dir binutils)/.${TARGET_NAME}" make -C projects/unix clean make -C projects/unix all ${PKG_MAKE_OPTS_TARGET} } makeinstall_target() { UPREFIX=${INSTALL}/usr/local ULIBDIR=${UPREFIX}/lib UPLUGINDIR=${ULIBDIR}/mupen64plus mkdir -p ${UPLUGINDIR} cp ${PKG_BUILD}/projects/unix/mupen64plus-audio-sdl.so ${UPLUGINDIR} #${STRIP} ${UPLUGINDIR}/mupen64plus-audio-sdl.so chmod 0644 ${UPLUGINDIR}/mupen64plus-audio-sdl.so } ================================================ FILE: packages/sx05re/emulators/mupen64plussa/mupen64plussa-core/config/mupen64plus.cfg ================================================ # Mupen64Plus Configuration File # This file is automatically read and written by the Mupen64Plus Core library [64DD] # Filename of the 64DD IPL ROM IPL-ROM = "" # Filename of the disk to load into Disk Drive Disk = "" [Audio-SDL] # Mupen64Plus SDL Audio Plugin config parameter version number Version = 1.000000 # Frequency which is used if rom doesn't want to change it DEFAULT_FREQUENCY = 33600 # Swaps left and right channels SWAP_CHANNELS = False # Size of primary buffer in output samples. This is where audio is loaded after it's extracted from n64's memory. PRIMARY_BUFFER_SIZE = 16384 # Fullness level target for Primary audio buffer, in equivalent output samples. This value must be larger than the SECONDARY_BUFFER_SIZE. Decreasing this value will reduce audio latency but requires a faster PC to avoid choppiness. Increasing this will increase audio latency but reduce the chance of drop-outs. PRIMARY_BUFFER_TARGET = 2048 # Size of secondary buffer in output samples. This is SDL's hardware buffer. The SDL documentation states that this should be a power of two between 512 and 8192. SECONDARY_BUFFER_SIZE = 1024 # Audio resampling algorithm. src-sinc-best-quality, src-sinc-medium-quality, src-sinc-fastest, src-zero-order-hold, src-linear, speex-fixed-{10-0}, trivial RESAMPLE = "trivial" # Volume control type: 1 = SDL (only affects Mupen64Plus output) 2 = OSS mixer (adjusts master PC volume) VOLUME_CONTROL_TYPE = 1 # Percentage change each time the volume is increased or decreased VOLUME_ADJUST = 5 # Default volume when a game is started. Only used if VOLUME_CONTROL_TYPE is 1 VOLUME_DEFAULT = 100 # Synchronize Video/Audio AUDIO_SYNC = False [Core] # Mupen64Plus Core config parameter set version number. Please don't change this version number. Version = 1.010000 # Draw on-screen display if True, otherwise don't draw OSD OnScreenDisplay = True # Use Pure Interpreter if 0, Cached Interpreter if 1, or Dynamic Recompiler if 2 or more R4300Emulator = 2 # Disable compiled jump commands in dynamic recompiler (should be set to False) NoCompiledJump = False # Disable 4MB expansion RAM pack. May be necessary for some games DisableExtraMem = False # Increment the save state slot after each save operation AutoStateSlotIncrement = False # Activate the R4300 debugger when ROM execution begins, if core was built with Debugger support EnableDebugger = False # Save state slot (0-9) to use when saving/loading the emulator state CurrentStateSlot = 0 # Path to directory where screenshots are saved. If this is blank, the default value of ${UserDataPath}/screenshot will be used ScreenshotPath = "/storage/roms/n64" # Path to directory where emulator save states (snapshots) are saved. If this is blank, the default value of ${UserDataPath}/save will be used SaveStatePath = "/storage/roms/n64" # Path to directory where SRAM/EEPROM data (in-game saves) are stored. If this is blank, the default value of ${UserDataPath}/save will be used SaveSRAMPath = "/storage/roms/n64" # Path to a directory to search when looking for shared data files SharedDataPath = "/storage/roms/gamedata/mupen64plussa" # Force number of cycles per emulated instruction CountPerOp = 0 # Randomize PI/SI Interrupt Timing RandomizeInterrupt = True # Duration of SI DMA (-1: use per game settings) SiDmaDuration = -1 # Gameboy Camera Video Capture backend GbCameraVideoCaptureBackend1 = "" # Disk Save Format (0: Full Disk Copy (*.ndr/*.d6r), 1: RAM Area Only (*.ram)) SaveDiskFormat = 1 [CoreEvents] # Mupen64Plus CoreEvents config parameter set version number. Please don't change this version number. Version = 1.000000 # SDL keysym for stopping the emulator Kbd Mapping Stop = 27 # SDL keysym for switching between fullscreen/windowed modes Kbd Mapping Fullscreen = 0 # SDL keysym for saving the emulator state Kbd Mapping Save State = 286 # SDL keysym for loading the emulator state Kbd Mapping Load State = 288 # SDL keysym for advancing the save state slot Kbd Mapping Increment Slot = 0 # SDL keysym for resetting the emulator Kbd Mapping Reset = 290 # SDL keysym for slowing down the emulator Kbd Mapping Speed Down = 291 # SDL keysym for speeding up the emulator Kbd Mapping Speed Up = 292 # SDL keysym for taking a screenshot Kbd Mapping Screenshot = 293 # SDL keysym for pausing the emulator Kbd Mapping Pause = 112 # SDL keysym for muting/unmuting the sound Kbd Mapping Mute = 109 # SDL keysym for increasing the volume Kbd Mapping Increase Volume = 93 # SDL keysym for decreasing the volume Kbd Mapping Decrease Volume = 91 # SDL keysym for temporarily going really fast Kbd Mapping Fast Forward = 102 # SDL keysym for advancing by one frame when paused Kbd Mapping Frame Advance = 47 # SDL keysym for pressing the game shark button Kbd Mapping Gameshark = 103 # Joystick event string for stopping the emulator Joy Mapping Stop = "J0B7/B6" # Joystick event string for switching between fullscreen/windowed modes Joy Mapping Fullscreen = "" # Joystick event string for saving the emulator state Joy Mapping Save State = "J0B7/B5" # Joystick event string for loading the emulator state Joy Mapping Load State = "J0B7/B4" # Joystick event string for advancing the save state slot Joy Mapping Increment Slot = "" # Joystick event string for resetting the emulator Joy Mapping Reset = "" # Joystick event string for slowing down the emulator Joy Mapping Speed Down = "" # Joystick event string for speeding up the emulator Joy Mapping Speed Up = "" # Joystick event string for taking a screenshot Joy Mapping Screenshot = "" # Joystick event string for pausing the emulator Joy Mapping Pause = "J0B7/B0" # Joystick event string for muting/unmuting the sound Joy Mapping Mute = "" # Joystick event string for increasing the volume Joy Mapping Increase Volume = "" # Joystick event string for decreasing the volume Joy Mapping Decrease Volume = "" # Joystick event string for fast-forward Joy Mapping Fast Forward = "" # Joystick event string for advancing by one frame when paused Joy Mapping Frame Advance = "" # Joystick event string for pressing the game shark button Joy Mapping Gameshark = "" # SDL keysym for save slot 0 Kbd Mapping Slot 0 = 48 # SDL keysym for save slot 1 Kbd Mapping Slot 1 = 49 # SDL keysym for save slot 2 Kbd Mapping Slot 2 = 50 # SDL keysym for save slot 3 Kbd Mapping Slot 3 = 51 # SDL keysym for save slot 4 Kbd Mapping Slot 4 = 52 # SDL keysym for save slot 5 Kbd Mapping Slot 5 = 53 # SDL keysym for save slot 6 Kbd Mapping Slot 6 = 54 # SDL keysym for save slot 7 Kbd Mapping Slot 7 = 55 # SDL keysym for save slot 8 Kbd Mapping Slot 8 = 56 # SDL keysym for save slot 9 Kbd Mapping Slot 9 = 57 [Input-SDL-Control1] # Mupen64Plus SDL Input Plugin config parameter version number. Please don't change this version number. version = 2.000000 # Controller configuration mode: 0=Fully Manual, 1=Auto with named SDL Device, 2=Fully automatic mode = 2 # Specifies which joystick is bound to this controller: -1=No joystick, 0 or more= SDL Joystick number device = 0 # SDL joystick name (or Keyboard) name = "OpenSimHardware OSH PB Controller" # Specifies whether this controller is 'plugged in' to the simulated N64 plugged = True # Specifies which type of expansion pak is in the controller: 1=None, 2=Mem pak, 4=Transfer pak, 5=Rumble pak plugin = 2 # If True, then mouse buttons may be used with this controller mouse = False # Scaling factor for mouse movements. For X, Y axes. MouseSensitivity = "2.00,2.00" # The minimum absolute value of the SDL analog joystick axis to move the N64 controller axis value from 0. For X, Y axes. AnalogDeadzone = "0,0" # An absolute value of the SDL joystick axis >= AnalogPeak will saturate the N64 controller axis value (at 80). For X, Y axes. For each axis, this must be greater than the corresponding AnalogDeadzone value AnalogPeak = "32768,32768" # Digital button configuration mappings DPad R = "hat(0 Right)" DPad L = "hat(0 Left)" DPad D = "hat(0 Down)" DPad U = "hat(0 Up)" Start = "button(6)" Z Trig = "button(9)" B Button = "button(3)" A Button = "button(1)" C Button R = "button(11)" C Button L = "button(2)" C Button D = "button(0)" C Button U = "button(10)" R Trig = "button(5)" L Trig = "button(4)" Mempak switch = "" Rumblepak switch = "" # Analog axis configuration mappings X Axis = "axis(0+,0-)" Y Axis = "axis(1+,1-)" [Input-SDL-Control2] # Mupen64Plus SDL Input Plugin config parameter version number. Please don't change this version number. version = 2.000000 # Controller configuration mode: 0=Fully Manual, 1=Auto with named SDL Device, 2=Fully automatic mode = 2 # Specifies which joystick is bound to this controller: -1=No joystick, 0 or more= SDL Joystick number device = -1 # SDL joystick name (or Keyboard) name = "" # Specifies whether this controller is 'plugged in' to the simulated N64 plugged = False # Specifies which type of expansion pak is in the controller: 1=None, 2=Mem pak, 4=Transfer pak, 5=Rumble pak plugin = 2 # If True, then mouse buttons may be used with this controller mouse = False # Scaling factor for mouse movements. For X, Y axes. MouseSensitivity = "2.00,2.00" # The minimum absolute value of the SDL analog joystick axis to move the N64 controller axis value from 0. For X, Y axes. AnalogDeadzone = "4096,4096" # An absolute value of the SDL joystick axis >= AnalogPeak will saturate the N64 controller axis value (at 80). For X, Y axes. For each axis, this must be greater than the corresponding AnalogDeadzone value AnalogPeak = "32768,32768" # Digital button configuration mappings DPad R = "" DPad L = "" DPad D = "" DPad U = "" Start = "" Z Trig = "" B Button = "" A Button = "" C Button R = "" C Button L = "" C Button D = "" C Button U = "" R Trig = "" L Trig = "" Mempak switch = "" Rumblepak switch = "" # Analog axis configuration mappings X Axis = "" Y Axis = "" [Input-SDL-Control3] # Mupen64Plus SDL Input Plugin config parameter version number. Please don't change this version number. version = 2.000000 # Controller configuration mode: 0=Fully Manual, 1=Auto with named SDL Device, 2=Fully automatic mode = 2 # Specifies which joystick is bound to this controller: -1=No joystick, 0 or more= SDL Joystick number device = -1 # SDL joystick name (or Keyboard) name = "" # Specifies whether this controller is 'plugged in' to the simulated N64 plugged = False # Specifies which type of expansion pak is in the controller: 1=None, 2=Mem pak, 4=Transfer pak, 5=Rumble pak plugin = 2 # If True, then mouse buttons may be used with this controller mouse = False # Scaling factor for mouse movements. For X, Y axes. MouseSensitivity = "2.00,2.00" # The minimum absolute value of the SDL analog joystick axis to move the N64 controller axis value from 0. For X, Y axes. AnalogDeadzone = "4096,4096" # An absolute value of the SDL joystick axis >= AnalogPeak will saturate the N64 controller axis value (at 80). For X, Y axes. For each axis, this must be greater than the corresponding AnalogDeadzone value AnalogPeak = "32768,32768" # Digital button configuration mappings DPad R = "" DPad L = "" DPad D = "" DPad U = "" Start = "" Z Trig = "" B Button = "" A Button = "" C Button R = "" C Button L = "" C Button D = "" C Button U = "" R Trig = "" L Trig = "" Mempak switch = "" Rumblepak switch = "" # Analog axis configuration mappings X Axis = "" Y Axis = "" [Input-SDL-Control4] # Mupen64Plus SDL Input Plugin config parameter version number. Please don't change this version number. version = 2.000000 # Controller configuration mode: 0=Fully Manual, 1=Auto with named SDL Device, 2=Fully automatic mode = 2 # Specifies which joystick is bound to this controller: -1=No joystick, 0 or more= SDL Joystick number device = -1 # SDL joystick name (or Keyboard) name = "" # Specifies whether this controller is 'plugged in' to the simulated N64 plugged = False # Specifies which type of expansion pak is in the controller: 1=None, 2=Mem pak, 4=Transfer pak, 5=Rumble pak plugin = 2 # If True, then mouse buttons may be used with this controller mouse = False # Scaling factor for mouse movements. For X, Y axes. MouseSensitivity = "2.00,2.00" # The minimum absolute value of the SDL analog joystick axis to move the N64 controller axis value from 0. For X, Y axes. AnalogDeadzone = "4096,4096" # An absolute value of the SDL joystick axis >= AnalogPeak will saturate the N64 controller axis value (at 80). For X, Y axes. For each axis, this must be greater than the corresponding AnalogDeadzone value AnalogPeak = "32768,32768" # Digital button configuration mappings DPad R = "" DPad L = "" DPad D = "" DPad U = "" Start = "" Z Trig = "" B Button = "" A Button = "" C Button R = "" C Button L = "" C Button D = "" C Button U = "" R Trig = "" L Trig = "" Mempak switch = "" Rumblepak switch = "" # Analog axis configuration mappings X Axis = "" Y Axis = "" [Rsp-HLE] # Mupen64Plus RSP HLE Plugin config parameter version number Version = 1.000000 # Path to a RSP plugin which will be used when encountering an unknown ucode.You can disable this by letting an empty string. RspFallback = "" # Send display lists to the graphics plugin DisplayListToGraphicsPlugin = True # Send audio lists to the audio plugin AudioListToAudioPlugin = False [Transferpak] # Filename of the GB ROM to load into transferpak 1 GB-rom-1 = "" # Filename of the GB RAM to load into transferpak 1 GB-ram-1 = "" # Filename of the GB ROM to load into transferpak 2 GB-rom-2 = "" # Filename of the GB RAM to load into transferpak 2 GB-ram-2 = "" # Filename of the GB ROM to load into transferpak 3 GB-rom-3 = "" # Filename of the GB RAM to load into transferpak 3 GB-ram-3 = "" # Filename of the GB ROM to load into transferpak 4 GB-rom-4 = "" # Filename of the GB RAM to load into transferpak 4 GB-ram-4 = "" [UI-Console] # Mupen64Plus UI-Console config parameter set version number. Please don't change this version number. Version = 1.000000 # Directory in which to search for plugins PluginDir = "/usr/local/lib/mupen64plus" # Filename of video plugin VideoPlugin = "mupen64plus-video-rice" # Filename of audio plugin AudioPlugin = "mupen64plus-audio-sdl.so" # Filename of input plugin InputPlugin = "mupen64plus-input-sdl.so" # Filename of RSP plugin RspPlugin = "mupen64plus-rsp-hle.so" [Video-General] # Width of output window or fullscreen width ScreenWidth = 1920 # Height of output window or fullscreen height ScreenHeight = 1080 # Use fullscreen mode if True, or windowed mode if False Fullscreen = True # If true, activate the SDL_GL_SWAP_CONTROL attribute VerticalSync = True # Rotate screen contents: 0=0 degree, 1=90 degree, 2 = 180 degree, 3=270 degree Rotate = 0 [Video-Glide64mk2] # Enable full-scene anti-aliasing by setting this to a value greater than 1 wrpAntiAliasing = 0 # Card ID card_id = 0 # If true, use polygon offset values specified below force_polygon_offset = False # Specifies a scale factor that is used to create a variable depth offset for each polygon polygon_offset_factor = 0.000000 # Is multiplied by an implementation-specific value to create a constant depth offset polygon_offset_units = 0.000000 # Vertical sync vsync = True # TODO:ssformat ssformat = False # Display performance stats (add together desired flags): 1=FPS counter, 2=VI/s counter, 4=% speed, 8=FPS transparent show_fps = 0 # Clock enabled clock = False # Clock is 24-hour clock_24_hr = True # Wrapper resolution wrpResolution = 0 # Wrapper VRAM wrpVRAM = 0 # Wrapper FBO wrpFBO = True # Wrapper Anisotropic Filtering wrpAnisotropic = True # Texture Enhancement: Smooth/Sharpen Filters ghq_fltr = 0 # Texture Compression: 0 for S3TC, 1 for FXT1 ghq_cmpr = 0 # Texture Enhancement: More filters ghq_enht = 0 # Hi-res texture pack format (0 for none, 1 for Rice) ghq_hirs = 1 # Compress texture cache with S3TC or FXT1 ghq_enht_cmpr = False # Tile textures (saves memory but could cause issues) ghq_enht_tile = 0 # Force 16bpp textures (saves ram but lower quality) ghq_enht_f16bpp = False # Compress texture cache ghq_enht_gz = True # Don't enhance textures for backgrounds ghq_enht_nobg = False # Enable S3TC and FXT1 compression ghq_hirs_cmpr = False # Tile hi-res textures (saves memory but could cause issues) ghq_hirs_tile = False # Force 16bpp hi-res textures (saves ram but lower quality) ghq_hirs_f16bpp = False # Compress hi-res texture cache ghq_hirs_gz = True # Alternative CRC calculation -- emulates Rice bug ghq_hirs_altcrc = True # Save tex cache to disk ghq_cache_save = True # Texture Cache Size (MB) ghq_cache_size = 128 # Use full alpha channel -- could cause issues for some tex packs ghq_hirs_let_texartists_fly = False # Dump textures ghq_hirs_dump = False # Alternate texture size method: -1=Game default, 0=disable. 1=enable alt_tex_size = -1 # Use first SETTILESIZE only: -1=Game default, 0=disable. 1=enable use_sts1_only = -1 # Use spheric mapping only: -1=Game default, 0=disable. 1=enable force_calc_sphere = -1 # Force positive viewport: -1=Game default, 0=disable. 1=enable correct_viewport = -1 # Force texrect size to integral value: -1=Game default, 0=disable. 1=enable increase_texrect_edge = -1 # Reduce fillrect size by 1: -1=Game default, 0=disable. 1=enable decrease_fillrect_edge = -1 # Enable perspective texture correction emulation: -1=Game default, 0=disable. 1=enable texture_correction = -1 # Set special scale for PAL games: -1=Game default, 0=disable. 1=enable pal230 = -1 # 3DFX Dithered alpha emulation mode: -1=Game default, >=0=dithered alpha emulation mode stipple_mode = -1 # 3DFX Dithered alpha pattern: -1=Game default, >=0=pattern used for dithered alpha emulation stipple_pattern = -1 # Check microcode each frame: -1=Game default, 0=disable. 1=enable force_microcheck = -1 # Force 0xb5 command to be quad, not line 3D: -1=Game default, 0=disable. 1=enable force_quad3d = -1 # Enable near z clipping: -1=Game default, 0=disable. 1=enable clip_zmin = -1 # Enable far plane clipping: -1=Game default, 0=disable. 1=enable clip_zmax = -1 # Use fast CRC algorithm: -1=Game default, 0=disable. 1=enable fast_crc = -1 # Adjust screen aspect for wide screen mode: -1=Game default, 0=disable. 1=enable adjust_aspect = -1 # Force strict check in Depth buffer test: -1=Game default, 0=disable. 1=enable zmode_compare_less = -1 # Apply alpha dither regardless of alpha_dither_mode: -1=Game default, 0=disable. 1=enable old_style_adither = -1 # Scale vertex z value before writing to depth buffer: -1=Game default, 0=disable. 1=enable n64_z_scale = -1 # Fast texrect rendering with hwfbe: -1=Game default, 0=disable. 1=enable optimize_texrect = -1 # Do not copy auxiliary frame buffers: -1=Game default, 0=disable. 1=enable ignore_aux_copy = -1 # Clear auxiliary texture frame buffers: -1=Game default, 0=disable. 1=enable hires_buf_clear = -1 # Read alpha from framebuffer: -1=Game default, 0=disable. 1=enable fb_read_alpha = -1 # Handle unchanged fb: -1=Game default, 0=disable. 1=enable useless_is_useless = -1 # Set frambuffer CRC mode: -1=Game default, 0=disable CRC, 1=fast CRC, 2=safe CRC fb_crc_mode = -1 # Filtering mode: -1=Game default, 0=automatic, 1=force bilinear, 2=force point sampled filtering = -1 # Fog: -1=Game default, 0=disable. 1=enable fog = -1 # Buffer clear on every frame: -1=Game default, 0=disable. 1=enable buff_clear = -1 # Buffer swapping method: -1=Game default, 0=swap buffers when vertical interrupt has occurred, 1=swap buffers when set of conditions is satisfied. Prevents flicker on some games, 2=mix of first two methods swapmode = -1 # Aspect ratio: -1=Game default, 0=Force 4:3, 1=Force 16:9, 2=Stretch, 3=Original aspect = -1 # LOD calculation: -1=Game default, 0=disable. 1=fast, 2=precise lodmode = -1 # Smart framebuffer: -1=Game default, 0=disable. 1=enable fb_smart = -1 # Hardware frame buffer emulation: -1=Game default, 0=disable. 1=enable fb_hires = -1 # Read framebuffer every frame (may be slow use only for effects that need it e.g. Banjo Kazooie, DK64 transitions): -1=Game default, 0=disable. 1=enable fb_read_always = -1 # Render N64 frame buffer as texture: -1=Game default, 0=disable, 1=mode1, 2=mode2 read_back_to_screen = -1 # Show images written directly by CPU: -1=Game default, 0=disable. 1=enable detect_cpu_write = -1 # Get frame buffer info: -1=Game default, 0=disable. 1=enable fb_get_info = -1 # Enable software depth render: -1=Game default, 0=disable. 1=enable fb_render = -1 # If true, skip up to maxframeskip frames to maintain clock schedule; if false, skip exactly maxframeskip frames autoframeskip = False # If autoframeskip is true, skip up to this many frames to maintain clock schedule; if autoframeskip is false, skip exactly this many frames maxframeskip = 0 [Video-Rice] # Mupen64Plus Rice Video Plugin config parameter version number Version = 1 # Frame Buffer Emulation (0=ROM default, 1=disable) FrameBufferSetting = 0 # Frequency to write back the frame buffer (0=every frame, 1=every other frame, etc) FrameBufferWriteBackControl = 0 # Render-to-texture emulation (0=none, 1=ignore, 2=normal, 3=write back, 4=write back and reload) RenderToTexture = 0 # Control when the screen will be updated (0=ROM default, 1=VI origin update, 2=VI origin change, 3=CI change, 4=first CI change, 5=first primitive draw, 6=before screen clear, 7=after screen drawn) ScreenUpdateSetting = 4 # Force to use normal alpha blender NormalAlphaBlender = False # Use a faster algorithm to speed up texture loading and CRC computation FastTextureLoading = False # Use different texture coordinate clamping code AccurateTextureMapping = True # Force emulated frame buffers to be in N64 native resolution InN64Resolution = False # Try to reduce Video RAM usage (should never be used) SaveVRAM = False # Enable this option to have better render-to-texture quality DoubleSizeForSmallTxtrBuf = False # Force to use normal color combiner DefaultCombinerDisable = False # Enable game-specific settings from INI file EnableHacks = True # If enabled, graphics will be drawn in WinFrame mode instead of solid and texture mode WinFrameMode = False # N64 Texture Memory Full Emulation (may fix some games, may break others) FullTMEMEmulation = False # Enable vertex clipper for fog operations OpenGLVertexClipper = False # Enable/Disable SSE optimizations for capable CPUs EnableSSE = True # If this option is enabled, the plugin will skip every other frame SkipFrame = False # If enabled, texture enhancement will be done only for TxtRect ucode TexRectOnly = False # If enabled, texture enhancement will be done only for textures width+height<=128 SmallTextureOnly = False # Select hi-resolution textures based only on the CRC and ignore format+size information (Glide64 compatibility) LoadHiResCRCOnly = True # Enable hi-resolution texture file loading LoadHiResTextures = False # Enable texture dumping DumpTexturesToFiles = False # Display On-screen FPS ShowFPS = False # Use Mipmapping? 0=no, 1=nearest, 2=bilinear, 3=trilinear Mipmapping = 2 # Enable, Disable fog generation (0=Disable, 1=Enable) FogMethod = 1 # Force to use texture filtering or not (0=auto: n64 choose, 1=force no filtering, 2=force filtering) ForceTextureFilter = 0 # Primary texture enhancement filter (0=None, 1=2X, 2=2XSAI, 3=HQ2X, 4=LQ2X, 5=HQ4X, 6=Sharpen, 7=Sharpen More, 8=External, 9=Mirrored) TextureEnhancement = 0 # Secondary texture enhancement filter (0 = none, 1-4 = filtered) TextureEnhancementControl = 0 # Color bit depth to use for textures (0=default, 1=32 bits, 2=16 bits) TextureQuality = 0 # Z-buffer depth (only 16 or 32) OpenGLDepthBufferSetting = 16 # Enable/Disable MultiSampling (0=off, 2,4,8,16=quality) MultiSampling = 0 # Color bit depth for rendering window (0=32 bits, 1=16 bits) ColorQuality = 1 # OpenGL level to support (0=auto, 1=OGL_FRAGMENT_PROGRAM) OpenGLRenderSetting = 0 # Enable/Disable Anisotropic Filtering for Mipmapping (0=no filtering, 2-16=quality). This is uneffective if Mipmapping is 0. If the given value is to high to be supported by your graphic card, the value will be the highest value your graphic card can support. Better result with Trilinear filtering AnisotropicFiltering = 0 # If true, use polygon offset values specified below ForcePolygonOffset = False # Specifies a scale factor that is used to create a variable depth offset for each polygon PolygonOffsetFactor = 0.000000 # Is multiplied by an implementation-specific value to create a constant depth offset PolygonOffsetUnits = 0.000000 ================================================ FILE: packages/sx05re/emulators/mupen64plussa/mupen64plussa-core/m64p.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present Shanti Gilbert (https://github.com/shantigilbert) # # 2025 to the present DiegroSan (https://github.com/Diegrosan) # Multithreading used for faster extraction. # Simultaneous execution of set_mupen64_joy.sh and 7za # Add suport 64DD... # Source predefined functions and variables . /etc/profile CONFIGDIR="/emuelec/configs/mupen64plussa" SAVEDIR="/storage/roms/savestates/mupen64plussa" BIOSDIR="/storage/roms/bios/Mupen64plus" mkdir -p ${CONFIGDIR} mkdir -p ${SAVEDIR} # Setup configs for files in /usr/local/share/mupen64plus/*; do dest_file="${CONFIGDIR}/$(basename "$files")" [[ -f "$dest_file" ]] || cp "$files" "$dest_file" done FILE="$1" GAMEDIR=$(dirname "${FILE}") extract_archive() { mkdir -p /tmp/mupen64plus rm -rf /tmp/mupen64plus/* 7za x -mmt=on -y "$FILE" -o/tmp/mupen64plus >/dev/null 2>&1 find /tmp/mupen64plus -maxdepth 1 \( -name "*.z64" -o -name "*.n64" -o -name "*.v64" -o -name "*.bin" -o -name "*.rom" \) | head -n1 } setup_gamepad() { AUTOGP=$(get_ee_setting mupen64plus_auto_gamepad) [[ "$AUTOGP" != "0" ]] && set_mupen64_joy.sh } EXT="${FILE##*.}" if [[ "$EXT" == "zip" || "$EXT" == "7z" ]]; then setup_gamepad & pad_pid=$! EXTRACTED_ROM=$(extract_archive) wait $pad_pid if [[ -n "$EXTRACTED_ROM" ]]; then FILE="$EXTRACTED_ROM" else echo "Error: No valid ROM found in compressed file." exit 1 fi else setup_gamepad fi GAMENAME=$(basename "${FILE%.*}") IPLROM="${BIOSDIR}/N64DD IPLROM (J).n64" [ ! -f "${IPLROM}" ] && IPLROM="${BIOSDIR}/IPL.n64" if [ -f "${GAMEDIR}/${GAMENAME}.ndd" ] && [ -f "${IPLROM}" ]; then RENMODE="1" SETMEMORY="DisableExtraMem[Core]=False" DDDISK="${GAMEDIR}/${GAMENAME}.ndd" else RENMODE="2" SETMEMORY="DisableExtraMem[Core]=True" IPLROM="" DDDISK="" fi # Get resolution case "$(oga_ver)" in "OGA"*) RES_W="480"; RES_H="320" ;; "OGS") RES_W="854"; RES_H="480" ;; "GF") RES_W="640"; RES_H="480" ;; *) read -r RES_W RES_H <<< "$(echo $(get_resolution))" ;; esac RES="${RES_W}x${RES_H}" echo "RESOLUTION=$RES" #RES="800x400" #test #echo " --emumode "${RENMODE}" --set "${SETMEMORY}" --dd-ipl-rom "${IPLROM}" --dd-disk "${DDDISK}" "${FILE}"" # Launch emulator case "$2" in "m64p_gl64mk2") mupen64plus --fullscreen --resolution "$RES" --emumode "${RENMODE}" --set "${SETMEMORY}" --configdir "$CONFIGDIR" --datadir "$CONFIGDIR" --savestate "$SAVEDIR" --gfx mupen64plus-video-glide64mk2.so --dd-ipl-rom "${IPLROM}" --dd-disk "${DDDISK}" "${FILE}" ;; *) mupen64plus --fullscreen --resolution "$RES" --emumode "${RENMODE}" --set "${SETMEMORY}" --configdir "$CONFIGDIR" --datadir "$CONFIGDIR" --savestate "$SAVEDIR" --gfx mupen64plus-video-rice.so --dd-ipl-rom "${IPLROM}" --dd-disk "${DDDISK}" "${FILE}" ;; esac # Cleanup rm -rf /tmp/mupen64plus/* ================================================ FILE: packages/sx05re/emulators/mupen64plussa/mupen64plussa-core/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="mupen64plussa-core" PKG_VERSION="57828d930280554c7400bb2bcf1e46c7f2ee8373" PKG_SHA256="3446b6f6d7df3d57d792ed9d46354e4a22f0cc843efffa0343cab523ab525c3a" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/mupen64plus/mupen64plus-core" PKG_URL="https://github.com/mupen64plus/mupen64plus-core/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ${OPENGLES} boost libpng SDL2 SDL2_net zlib freetype nasm:host" PKG_SHORTDESC="mupen64plus" PKG_LONGDESC="Mupen64Plus Standalone" PKG_TOOLCHAIN="manual" PKG_MAKE_OPTS_TARGET+="USE_GLES=1" make_target() { export HOST_CPU=aarch64 export USE_GLES=1 export SDL_CFLAGS="-I${SYSROOT_PREFIX}/usr/include/SDL2 -D_REENTRANT" export SDL_LDLIBS="-lSDL2_net -lSDL2" export CROSS_COMPILE="${TARGET_PREFIX}" export V=1 export VC=0 BINUTILS="$(get_build_dir binutils)/.${TAGET_NAME}" make -C projects/unix clean make -C projects/unix all ${PKG_MAKE_OPTS_TARGET} } makeinstall_target() { mkdir -p ${INSTALL}/usr/local/lib cp ${PKG_BUILD}/projects/unix/libmupen64plus.so.2.0.0 ${INSTALL}/usr/local/lib chmod 644 ${INSTALL}/usr/local/lib/libmupen64plus.so.2.0.0 cp ${PKG_BUILD}/projects/unix/libmupen64plus.so.2 ${INSTALL}/usr/local/lib mkdir -p ${INSTALL}/usr/local/share/mupen64plus cp ${PKG_BUILD}/data/* ${INSTALL}/usr/local/share/mupen64plus chmod 0644 ${INSTALL}/usr/local/share/mupen64plus/* mkdir -p ${INSTALL}/usr/local/include/mupen64plus cp ${PKG_BUILD}/src/api/m64p_*.h ${INSTALL}/usr/local/include/mupen64plus chmod 0644 ${INSTALL}/usr/local/include/mupen64plus/* cp ${PKG_DIR}/config/mupen64plus.cfg ${INSTALL}/usr/local/share/mupen64plus/mupen64plus.cfg chmod 644 ${INSTALL}/usr/local/share/mupen64plus/mupen64plus.cfg mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/m64p.sh ${INSTALL}/usr/bin chmod 755 ${INSTALL}/usr/bin/m64p.sh cp ${PKG_DIR}/set_mupen64_joy.sh ${INSTALL}/usr/bin chmod 755 ${INSTALL}/usr/bin/set_mupen64_joy.sh } ================================================ FILE: packages/sx05re/emulators/mupen64plussa/mupen64plussa-core/set_mupen64_joy.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Joshua L (https://github.com/Langerz82) # Optimized application 2x faster 2025-present DiegroSan # Source predefined functions and variables . /etc/profile # Configure Mupen64Plus players based on GameControllerDB CONFIG_DIR="/storage/.config/emuelec/configs/mupen64plussa" CONFIG="${CONFIG_DIR}/mupen64plus.cfg" CONFIG_TMP="/tmp/jc/mupen64.tmp" source joy_common.sh "mupen64plus" BTN_H0=$(get_ee_setting mupen_btn_h0) BTN_H0=${BTN_H0:-0} declare -A GC_MUPEN64_VALUES=( [h0.1]="hat(${BTN_H0} Up)" [h0.4]="hat(${BTN_H0} Down)" [h0.8]="hat(${BTN_H0} Left)" [h0.2]="hat(${BTN_H0} Right)" [b0]="button(0)" [b1]="button(1)" [b2]="button(2)" [b3]="button(3)" [b4]="button(4)" [b5]="button(5)" [b6]="button(6)" [b7]="button(7)" [b8]="button(8)" [b9]="button(9)" [b10]="button(10)" [b11]="button(11)" [b12]="button(12)" [b13]="button(13)" [b14]="button(14)" [b15]="button(15)" [b16]="button(16)" ) declare -A GC_MUPEN64_BUTTONS=( [dpleft]="DPad L" [dpright]="DPad R" [dpup]="DPad U" [dpdown]="DPad D" [a]="B Button" [b]="A Button" [righttrigger]="Z Trig" [start]="Start" [leftshoulder]="L Trig" [rightshoulder]="R Trig" [leftx]="X Axis" [lefty]="Y Axis" [rightx,0]="C Button L" [rightx,1]="C Button R" [righty,0]="C Button U" [righty,1]="C Button D" ) BTN_SWAP_AB=$(get_ee_setting mupen64_joy_swap_ab) if [[ "${BTN_SWAP_AB}" == "1" ]]; then GC_MUPEN64_BUTTONS[a]="A Button" GC_MUPEN64_BUTTONS[b]="B Button" fi declare -A GC_MUPEN64_STICKS=( ["leftx"]="axis(%d-,%d+)" ["lefty"]="axis(%d-,%d+)" ["rightx,0"]="axis(%d-)" ["rightx,1"]="axis(%d+)" ["righty,0"]="axis(%d-)" ["righty,1"]="axis(%d+)" ) clean_pad() { [[ -f "${CONFIG_TMP}" ]] && rm "${CONFIG_TMP}" [[ ! -f "${CONFIG}" ]] && return local GC_REGEX="\[Input-SDL-Control${1}\]" local in_section=0 local temp_file=$(mktemp) while IFS= read -r line; do if [[ "$line" =~ \[.*\] ]]; then if [[ "$line" =~ $GC_REGEX ]]; then in_section=1 # Keep AnalogPeak and AnalogDeadZone if they exist grep -E "^AnalogPeak|^AnalogDeadZone" "${CONFIG}" | head -2 >> "${CONFIG_TMP}" else in_section=0 fi fi if (( !in_section )); then echo "$line" >> "$temp_file" fi done < "${CONFIG}" mv "$temp_file" "${CONFIG}" rm -f "$temp_file" } set_pad() { local PLAYER=${1} local JSI=${2} local DEVICE_GUID=${3} local JOY_NAME="${4}" local RUMBLEPAK_SWITCH="\"\"" local GC_CONFIG="${5}" [[ -z ${GC_CONFIG} ]] && return local GC_MAP=$(cut -d',' -f3- <<< "${GC_CONFIG}") IFS=',' read -ra GC_ARRAY <<< "${GC_MAP}" for REC in "${GC_ARRAY[@]}"; do local BUTTON_INDEX=$(cut -d ":" -f 1 <<< "${REC}") local TVAL=$(cut -d ":" -f 2 <<< "${REC}") local BUTTON_VAL=${TVAL:1} local GC_INDEX="${GC_MUPEN64_BUTTONS[${BUTTON_INDEX}]}" local BTN_TYPE=${TVAL:0:1} local VAL="${GC_MUPEN64_VALUES[${TVAL}]}" case ${BUTTON_INDEX} in rightstick) RUMBLEPAK_SWITCH="\"button(${BUTTON_VAL})\"" ;; leftx|lefty) printf "%s = axis(%d-,%d+)\n" "${GC_INDEX}" "${BUTTON_VAL}" "${BUTTON_VAL}" >> "${CONFIG_TMP}" ;; rightx|righty) printf "%s = axis(%d-)\n" "${GC_MUPEN64_BUTTONS[${BUTTON_INDEX},0]}" "${BUTTON_VAL}" >> "${CONFIG_TMP}" printf "%s = axis(%d+)\n" "${GC_MUPEN64_BUTTONS[${BUTTON_INDEX},1]}" "${BUTTON_VAL}" >> "${CONFIG_TMP}" ;; *) if [[ -n "${GC_INDEX}" ]]; then case "${BTN_TYPE}" in b|h) [[ -n "${VAL}" ]] && echo "${GC_INDEX} = ${VAL}" >> "${CONFIG_TMP}" ;; a) printf "%s = axis(%d+)\n" "${GC_INDEX}" "${BUTTON_VAL}" >> "${CONFIG_TMP}" ;; esac fi ;; esac done { printf "[Input-SDL-Control%s]\n" "${1}" echo "version = 2.000000" echo "mode = 0" echo "device = $(( PLAYER - 1 ))" echo "name = \"${JOY_NAME}\"" echo "plugged = True" echo "plugin = 5" echo "mouse = False" echo "Mempak switch = \"\"" echo "Rumblepak switch = ${RUMBLEPAK_SWITCH}" } >> "${CONFIG}" # Add default values if they don't exist grep -q "^AnalogPeak" "${CONFIG_TMP}" || echo "AnalogPeak = \"32768,32768\"" >> "${CONFIG_TMP}" grep -q "^AnalogDeadzone" "${CONFIG_TMP}" || echo "AnalogDeadzone = \"4096,4096\"" >> "${CONFIG_TMP}" sort "${CONFIG_TMP}" >> "${CONFIG}" printf "\n\n" >> "${CONFIG}" rm -f "${CONFIG_TMP}" } jc_get_players ================================================ FILE: packages/sx05re/emulators/mupen64plussa/mupen64plussa-input-sdl/config/InputAutoCfg.ini ================================================ ; InputAutoCfg.ini for Mupen64Plus SDL Input plugin for RGB10 [Keyboard] plugged = True mouse = False DPad R = key(100) DPad L = key(97) DPad D = key(115) DPad U = key(119) Start = key(13) Z Trig = key(122) B Button = key(306) A Button = key(304) C Button R = key(108) C Button L = key(106) C Button D = key(107) C Button U = key(105) R Trig = key(99) L Trig = key(120) Mempak switch = key(44) Rumblepak switch = key(46) X Axis = key(276,275) Y Axis = key(273,274) [Austgame PS to USB convert cable] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(8) Z Trig = button(4) B Button = button(3) A Button = button(2) C Button R = button(1) C Button L = button(0) C Button D = button(5) C Button U = axis(3-) R Trig = button(7) L Trig = button(6) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [BDA Pro Ex] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = axis(4+) DPad L = axis(4-) DPad D = axis(5+) DPad U = axis(5-) Start = button(9) Z Trig = button(7) B Button = button(2) A Button = button(1) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(5) L Trig = button(4) Mempak switch = key(44) Rumblepak switch = key(46) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; Boom Smart Joy Converter [HID 6666:0667] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = button(13) DPad L = button(15) DPad D = button(14) DPad U = button(12) Start = button(11) Z Trig = button(10) B Button = button(4) A Button = button(5) C Button R = button(1) C Button L = button(3) C Button D = button(2) C Button U = button(0) R Trig = button(7) L Trig = button(6) Mempak switch = key(109) Rumblepak switch = key(114) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Cyborg V.3 Rumble Pad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = axis(4+) DPad L = axis(4-) DPad D = axis(5+) DPad U = axis(5-) Start = button(12) Z Trig = button(7) B Button = button(0) A Button = button(1) C Button R = button(8) axis(2+) C Button L = button(3) axis(2-) C Button D = button(2) axis(3+) C Button U = button(9) axis(3-) R Trig = button(5) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [DragonRise Inc. Generic USB Joystick] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = key(275) axis(0+) DPad L = key(276) axis(0-) DPad D = key(274) axis(1+) DPad U = key(273) axis(1-) Start = button(9) Z Trig = button(4) B Button = button(3) A Button = button(2) C Button R = button(7) axis(3+) C Button L = button(6) axis(3-) C Button D = button(1) axis(4+) C Button U = button(0) axis(4-) R Trig = button(5) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; FuSa is a homebrew program which allows a PSP to be used as a gamepad [FuSa FuSa GamePad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = DPad L = DPad D = DPad U = Start = button(7) Z Trig = button(4) B Button = button(2) A Button = button(0) C Button R = hat(0 Right) C Button L = hat(0 Left) C Button D = hat(0 Down) C Button U = hat(0 Up) R Trig = button(5) L Trig = button(3) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; "Super Joy Box 13" USB adaptor for a Gamecube controller [GameCube to USB box 1] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(7) Z Trig = button(6) B Button = button(1) A Button = button(0) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3-) C Button U = axis(3+) R Trig = axis(5+) L Trig = axis(4+) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Gasia Co.,Ltd PS(R) Gamepad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = key(275) axis(0+) hat(0 Right) DPad L = key(276) axis(0-) hat(0 Left) DPad D = key(274) axis(1+) hat(0 Down) DPad U = key(273) axis(1-) hat(0 Up) Start = button(9) Z Trig = button(6) B Button = button(3) A Button = button(2) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(5) L Trig = button(4) Mempak switch = button(1) Rumblepak switch = button(0) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; raphnet technologies USB converter (http://www.raphnet-tech.com/) [GC/N64_USB] [GC/N64 to USB, v2.9] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = button(13) DPad L = button(12) DPad D = button(11) DPad U = button(10) Start = button(3) Z Trig = button(2) B Button = button(1) A Button = button(0) C Button R = button(7) C Button L = button(6) C Button D = button(5) C Button U = button(4) R Trig = button(9) L Trig = button(8) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; raphnet technologies USB converter, v3 series (http://www.raphnet-tech.com/) [raphnet technologies GC/N64 to USB] [raphnet technologies N64 to USB] [raphnet technologies Dual N64 to USB] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = button(13) DPad L = button(12) DPad D = button(11) DPad U = button(10) Start = button(3) Z Trig = button(2) B Button = button(1) A Button = button(0) C Button R = button(9) C Button L = button(8) C Button D = button(7) C Button U = button(6) R Trig = button(5) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; Retrolink N64 USB clone [Generic USB Joystick] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = axis(5+) DPad L = axis(5-) DPad D = axis(6+) DPad U = axis(6-) Start = button(9) Z Trig = button(7) B Button = button(8) A Button = button(6) C Button R = button(1) C Button L = button(3) C Button D = button(2) C Button U = button(0) R Trig = button(5) L Trig = button(4) Mempak switch = key(109) Rumblepak switch = key(114) Y Axis = axis(1-,1+) X Axis = axis(0-,0+) ; gioteck VX2PS3-21 RF Wireless Controller [Goodbetterbest Ltd PC USB Controller] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 Mempak switch = button(7) Rumblepak switch = C Button D = button(1) axis(3+) C Button L = axis(2-) Z Trig = button(6) Start = button(9) Y Axis = axis(1-,1+) DPad U = hat(0 Up) C Button U = button(0) axis(3-) A Button = button(2) DPad D = hat(0 Down) X Axis = axis(0-,0+) R Trig = button(5) DPad R = hat(0 Right) B Button = button(3) DPad L = hat(0 Left) C Button R = axis(2+) L Trig = button(4) [GreenAsia Inc. USB Joystick] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(1) B Button = button(3) A Button = button(2) C Button R = axis(3+) C Button L = axis(3-) C Button D = axis(2+) C Button U = axis(2-) R Trig = button(7) L Trig = button(6) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [GS gamepad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(7) B Button = button(2) A Button = button(0) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(5) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Guillemot Corporation DA Leader] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(12) Z Trig = button(11) B Button = button(1) A Button = button(3) C Button R = button(6) C Button L = button(4) C Button D = button(7) C Button U = button(5) R Trig = button(2) L Trig = button(0) Mempak switch = key(44) Rumblepak switch = key(46) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [ipega media gamepad controller] plugged = True mouse = False DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(11) Z Trig = button(6) B Button = button(3) A Button = button(0) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = axis(4+) L Trig = axis(5+) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [ipega gamepad controller] plugged = True mouse = False DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(2) B Button = button(0) A Button = button(1) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(5) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Jess Tech Dual Analog Pad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(7) B Button = button(0) A Button = button(2) C Button R = axis(3+) C Button L = axis(3-) C Button D = axis(2+) C Button U = axis(2-) R Trig = button(6) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Win32: Colour Rumble Pad] [Jess Tech Colour Rumble Pad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(4) B Button = button(0) A Button = button(2) C Button R = axis(3+) C Button L = axis(3-) C Button D = axis(2+) C Button U = axis(2-) R Trig = button(7) L Trig = button(5) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Jess Tech USB 4-Axis 12-Button Gamepad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(4) Z Trig = button(5) B Button = button(8) A Button = button(9) C Button R = button(1) C Button L = button(3) C Button D = button(2) C Button U = button(0) R Trig = button(7) L Trig = button(6) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Jess Technology Co., Ltd. USB Game Controllers] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = axis(0+) DPad L = axis(0-) DPad D = axis(1+) DPad U = axis(1-) Start = button(9) Z Trig = button(3) B Button = button(0) A Button = button(2) C Button R = axis(5+) C Button L = axis(5-) C Button D = axis(2+) C Button U = axis(2-) R Trig = button(6) L Trig = button(4) Mempak switch = button(7) Rumblepak switch = button(5) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; X-box controllers and compatible clones [Logitech Chillstream Controller] [Logic3 Controller] [HORIPAD ONE] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(7) Z Trig = axis(2+) B Button = button(2) A Button = button(0) C Button R = axis(3+) C Button L = axis(3-) C Button D = axis(4+) C Button U = axis(4-) R Trig = button(5) L Trig = button(4) Mempak switch = button(6) Rumblepak switch = button(8) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Logitech Cordless Rumblepad 2] [Logitech Cordless RumblePad 2] [Logitech RumblePad 2 USB] [Logitech Dual Action] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = axis(4+) hat(0 Right) DPad L = axis(4-) hat(0 Left) DPad D = axis(5+) hat(0 Down) DPad U = axis(5-) hat(0 Up) Start = button(9) Z Trig = button(6) B Button = button(0) A Button = button(1) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(5) L Trig = button(4) Mempak switch = button(8) Rumblepak switch = button(7) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Logitech Gamepad F310] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(7) Z Trig = button(5) B Button = button(2) A Button = button(0) C Button R = axis(3+) C Button L = axis(3-) C Button D = axis(4+) C Button U = axis(4-) R Trig = axis(5-) L Trig = axis(2-) Mempak switch = button(1) Rumblepak switch = button(3) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Logitech Gamepad F710] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(7) Z Trig = axis(2+) B Button = button(0) A Button = button(1) C Button R = axis(3+) C Button L = axis(3-) C Button D = axis(4+) C Button U = axis(4-) R Trig = button(5) L Trig = button(4) Mempak switch = button(6) Rumblepak switch = axis(5+) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Logitech Logitech(R) Precision(TM) Gamepad] [Gravis GamePad Pro USB] plugged = True mouse = False AnalogDeadzone = 100,100 AnalogPeak = 32768,32768 DPad R = axis(0+) DPad L = axis(0-) DPad D = axis(1+) Dpad U = axis(1-) Start = button(9) Z Trig = button(6) B Button = button(5) A Button = button(4) C Button R = button(2) C Button L = button(0) C Button D = button(1) C Button U = button(3) R Trig = button(7) L Trig = button(8) Mempack switch = Rumblepak Switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Logitech WingMan Action Pad] [Logitech Inc WingMan RumblePad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = button(13) DPad L = button(15) DPad D = button(14) DPad U = button(12) Start = button(8) Z Trig = button(6) B Button = button(3) A Button = button(0) C Button R = button(2) C Button L = button(4) C Button D = button(1) C Button U = button(5) R Trig = button(7) L Trig = Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Mayflash GC Controller Adapter 4-Port] ; Mayflash Gamecube 4-Port Controller Adapter (for PC & Wii U USB) - With one Gamecube gamepad(s) connected ; this is a 4-port USB device. The ports from left to right are p1, p2, p3, p4. ; This is configured for Toki no Ocarina, therefore the L trig represents the Z trig and vice versa plugged = True mouse = False AnalogDeadzone = 128,128 AnalogPeak = 28000,28000 DPad R = hat(4 Right) DPad L = hat(4 Left) DPad D = hat(4 Down) DPad U = hat(4 Up) Start = button(36) ; L Trig is mapped to Z Z Trig = axis(12+) B Button = button(8) A Button = button(4) C Button R = axis(20+) C Button L = axis(20-) C Button D = axis(8+) C Button U = axis(8-) R Trig = axis(16+) L Trig = button(28) Mempak switch = Rumblepak switch = Y Axis = axis(0-,0+) X Axis = axis(4-,4+) [Mega World Thrustmaster dual analog 3.2] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(8) B Button = button(1) A Button = button(0) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(6) L Trig = button(4) Mempak switch = button(5) Rumblepak switch = button(7) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Mega World USB Game Controllers] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(7) B Button = button(0) A Button = button(2) C Button R = axis(3+) C Button L = axis(3-) C Button D = axis(2+) C Button U = axis(2-) R Trig = button(6) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [MP-8866 Dual USB Joypad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(8) Z Trig = button(6) B Button = button(3) A Button = button(2) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(7) L Trig = button(4) Mempak switch = button(10) Rumblepak switch = button(11) Y Axis = axis(1-,1+) X Axis = axis(0-,0+) ; Nes30 Pro Controller ; NB - this maps Z trigger to button Y ; Select, L2 and R2 are unmapped [Bluetooth Wireless Controller ] [8Bitdo NES30 Pro] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = axis(6+) DPad L = axis(6-) DPad D = axis(7+) DPad U = axis(7-) Start = button(11) Z Trig = button(4) B Button = button(1) A Button = button(0) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(7) L Trig = button(6) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Linux: Microsoft X-Box 360 pad] [Linux: Xbox 360 Wireless Receiver (XBOX)] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(7) Z Trig = axis(2+) B Button = button(2) A Button = button(0) C Button R = axis(3+,24000) C Button L = axis(3-,24000) button(3) C Button D = axis(4+,24000) button(1) C Button U = axis(4-,24000) R Trig = button(5) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; Multilaser PS2 Generic Controller JS030 [Linux: Microntek USB Joystick] [Win32: USB Network Joystick] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(6) B Button = button(3) A Button = button(2) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(5) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Microsoft X-Box 360 pad] [Microsoft X-Box One pad] [Win32: Controller (XBOX 360 For Windows)] [Win32: XBOX 360 For Windows (Controller)] [Win32: XBOX 360 For Windows] [Xbox 360 Wireless Receiver] [Linux: Xbox Gamepad (userspace driver)] [Afterglow Gamepad for Xbox 360] [Controller (Xbox One For Windows)] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(7) Z Trig = axis(2+) B Button = button(2) A Button = button(0) C Button R = axis(4+,24000) C Button L = axis(4-,24000) C Button D = axis(3+,24000) C Button U = axis(3-,24000) R Trig = button(5) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) # mappings for use with the TattieBogle driver under OSX, given in googlecode.com issue #630 [OSX: Wireless 360 Controller] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = button(3) DPad L = button(2) DPad D = button(0) DPad U = button(1) Start = button(4) Z Trig = axis(5+) B Button = button(13) A Button = button(11) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(9) L Trig = button(8) Mempak switch = "" Rumblepak switch = "" X Axis = axis(0-,0+) Y Axis = axis(1-,1+) # For Xbox One controllers in Bluetooth mode [Xbox Wireless Controller] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(11) Z Trig = button(7) B Button = button(1) A Button = button(0) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = axis(4+) L Trig = axis(5+) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) # from the Google Group, with the tattiebogle driver 0.15 beta 3 under El Capitan 10.11.1 [OSX: Xbox 360 Wired Controller] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = button(14) DPad L = button(13) DPad D = button(12) DPad U = button(11) Start = button(8) Z Trig = axis(2+) B Button = button(2) A Button = button(0) C Button R = axis(3+) C Button L = axis(3-) C Button D = axis(4+) C Button U = axis(4-) R Trig = button(5) L Trig = button(4) Mempak switch = "" Rumblepak switch = "" X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; ACRUX Gamepad (USB ID: 1a34:0802), a Xbox 360 controller clone aviable under ; various brands (e.g. techsolo TG-30) [USB GAMEPAD 8116] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = axis(4-) B Button = button(2) A Button = button(0) C Button R = axis(3+) C Button L = axis(3-) button(3) C Button D = axis(2+) button(1) C Button U = axis(2-) R Trig = button(5) axis(4+) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [XInput: Microsoft X-Box 360 pad] [XInput: Controller (XBOX 360 For Windows)] [XInput: XBOX 360 For Windows (Controller)] [XInput: XBOX 360 For Windows] [XInput: Xbox 360 Wireless Receiver] [XInput: XInput Controller #] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(7) Z Trig = axis(2+) B Button = button(2) A Button = button(0) C Button R = axis(3+) C Button L = axis(3-) button(3) C Button D = axis(4+) button(1) C Button U = axis(4-) R Trig = button(5) axis(5+) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ;Snakebyte PS3-style USB controller [MY-POWER CO.,LTD. 2In1 USB Joystick] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(7) B Button = button(2) A Button = button(1) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(5) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [N64 controller] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(0) B Button = button(2) A Button = button(1) C Button R = button(4) C Button L = button(5) C Button D = button(3) C Button U = button(6) R Trig = button(8) L Trig = button(7) Mempak switch = key(109) Rumblepak switch = key(114) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Nintendo Wiimote Classic] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = button(23) DPad L = button(22) DPad D = button(21) DPad U = button(20) Start = button(17) Z Trig = button(24) B Button = button(14) A Button = button(13) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(25) L Trig = button(26) Mempak switch = button(16) Rumblepak switch = button(15) X Axis = axis(4-,4+) Y Axis = axis(5-,5+) [Nintendo Wii Remote Pro Controller] plugged = True mouse = False AnalogDeadzone = 2000,2000 AnalogPeak = 17000,17000 DPad R = button(16) DPad L = button(15) DPad D = button(14) DPad U = button(13) Start = button(9) Z Trig = button(6) B Button = button(0) A Button = button(1) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(5) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [OUYA Game Controller] plugged = True mouse = False Mempak switch = Rumblepak switch = DPad U = button(8) DPad D = button(9) DPad L = button(10) DPad R = button(11) Start = button(7) Z Trig = button(12) A Button = button(0) B Button = button(1) C Button U = axis(4-) C Button D = axis(4+) C Button L = axis(3-) C Button R = axis(3+) L Trig = button(4) R Trig = button(5) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [PC Game Controller] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(8) B Button = button(4) A Button = button(5) C Button R = button(1) C Button L = button(3) C Button D = button(2) C Button U = button(0) R Trig = button(7) L Trig = button(6) Mempak switch = key(109) Rumblepak switch = key(114) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; Nintendo Switch Pro Controller [Pro Controller] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = axis(4+) DPad L = axis(4-) DPad D = axis(5+) DPad U = axis(5-) Start = button(9) Z Trig = button(6) B Button = button(0) A Button = button(1) C Button R = axis(2-) C Button L = axis(2+) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(7) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; Playfect PS3 controller (cheap clone of the Sony DualShock 3 controller) [PS3/PC WirelessGamePad] plugged = True mouse = False DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(4) B Button = button(3) A Button = button(2) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(5) L Trig = button(6) Mempak switch = key(109) Rumblepak switch = key(114) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; this is also the MayFlash / HuiJia adapter [PS/SS/N64 Joypad to USB BOX] plugged=True mouse=False AnalogDeadzone=1024,1024 AnalogPeak=11000,11000 DPad R=hat(0 right) DPad L=hat(0 left) DPad U=hat(0 up) DPad D=hat(0 down) Start=button(8) Z Trig=button(9) B Button=button(2) A Button=button(1) C Button R=axis(2-) C Button L=axis(2+) C Button U=axis(3-) C Button D=axis(3+) R Trig=button(7) L Trig=button(5) X Axis=axis(0-,0+) Y Axis=axis(1-,1+) [Rock Candy Gamepad for PS3] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(7) B Button = button(0) A Button = button(2) C Button R = axis(3+) C Button L = axis(3-) C Button D = axis(2+) C Button U = axis(2-) R Trig = button(6) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [PLAYSTATION(R)3 Controller] [Sony PLAYSTATION(R)3 Controller] [SHENGHIC 2009/0708ZXW-V1Inc. PLAYSTATION(R)3Conteroller] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = button(5) DPad L = button(7) DPad D = button(6) DPad U = button(4) Start = button(3) Z Trig = button(10) B Button = button(15) A Button = button(14) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(11) L Trig = button(8) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Sony Computer Entertainment Wireless Controller] [Sony Interactive Entertainment Wireless Controller] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = axis(3+) B Button = button(0) A Button = button(1) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(5+) C Button U = axis(5-) R Trig = button(5) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; Sony DS4 connected via Bluetooth advertises itself as "Wireless Controller" [Wireless Controller] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) ; L2, change to 7 for R2 Z Trig = button(6) B Button = button(0) A Button = button(1) C Button R = axis(3+) C Button L = axis(3-) C Button D = axis(4+) C Button U = axis(4-) R Trig = button(5) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [SAITEK P880] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(10) Z Trig = button(3) B Button = button(0) A Button = button(2) C Button R = button(5) axis(3+) C Button L = button(1) axis(3-) C Button D = button(9) axis(2+) C Button U = button(4) axis(2-) R Trig = button(7) L Trig = button(6) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Saitek P990 Dual Analog Pad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(5) Z Trig = button(4) B Button = button(0) A Button = button(1) C Button R = button(8) axis(3+) C Button L = button(3) axis(3-) C Button D = button(2) axis(2+) C Button U = button(9) axis(2-) R Trig = button(7) L Trig = button(6) Mempak switch = button(11) Rumblepak switch = button(10) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Saitek P2900 Wireless Pad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = axis(4+) DPad L = axis(4-) DPad D = axis(5+) DPad U = axis(5-) Start = button(6) Z Trig = button(7) B Button = button(0) A Button = button(1) C Button R = button(8) axis(3+) C Button L = button(3) axis(3-) C Button D = button(2) axis(2+) C Button U = button(9) axis(2-) R Trig = button(5) L Trig = button(4) Mempak switch = button(11) Rumblepak switch = axis(10+) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Saitek PLC Cyborg Force Rumble Pad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(8) B Button = button(0) A Button = button(2) C Button R = button(5) axis(3+) C Button L = button(1) axis(3-) C Button D = button(3) axis(2+) C Button U = button(4) axis(2-) R Trig = button(7) L Trig = button(6) Mempak switch = button(11) Rumblepak switch = axis(10+) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [ShanWan USB WirelessGamepad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = axis(0+) DPad L = axis(0-) DPad D = axis(1+) DPad U = axis(1-) Start = button(9) Z Trig = button(8) B Button = button(3) A Button = button(2) C Button R = button(7) C Button L = button(6) C Button D = button(1) C Button U = button(0) R Trig = button(5) L Trig = button(4) Mempak switch = key(109) Rumblepak switch = key(114) Y Axis = axis(1-,1+) X Axis = axis(0-,0+) [SZMY-POWER CO.,LTD. GAMEPAD 3 TURBO] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(6) B Button = button(0) A Button = button(1) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(5) L Trig = button(4) Mempak switch = key(44) Rumblepak switch = key(46) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Thrustmaster Dual Trigger 3-in-1] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(3) B Button = button(0) A Button = button(1) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(5+) C Button U = axis(5-) R Trig = button(5) L Trig = button(4) Mempak switch = button(6) Rumblepak switch = button(7) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [THRUSTMASTER Firestorm Dual Power 2] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(5) Z Trig = button(8) B Button = button(1) A Button = button(0) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(6) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Thrustmaster T Mini Wireless] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat (0 Right) DPad L = hat (0 Left) DPad D = hat (0 Down) DPad U = hat (0 Up) Start = button(9) Z Trig = button(5) B Button = button(0) A Button = button(1) C Button R = Axis = axis(2+) C Button L = Axis = axis(2-) C Button D = Axis = axis(3+) C Button U = Axis = axis(3-) R Trig = button(7) L Trig = button(6) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Twin USB Joystick] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(4) B Button = button(6) A Button = button(7) C Button R = button(1) C Button L = button(3) C Button D = button(2) C Button U = button(0) R Trig = button(5) L Trig = button(11) Mempak switch = Rumblepak switch = Y Axis = axis(1-,1+) X Axis = axis(0-,0+) [Twin USB Vibration Gamepad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(7) B Button = button(0) A Button = button(2) C Button R = axis(3+) C Button L = axis(3-) C Button D = axis(2+) C Button U = axis(2-) R Trig = button(6) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ;Twin USB PS-controller lookalike, branded "POWER PAD". ;The controller closest to the USB-plug is Player 1. [Twin USB Gamepad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(4) B Button = button(3) A Button = button(2) C Button R = axis(3+) C Button L = axis(3-) C Button D = axis(2+) C Button U = axis(2-) R Trig = button(7) L Trig = button(6) Mempak switch = Rumblepak switch = Y Axis = axis(1-,1+) X Axis = axis(0-,0+) [Wii U GameCube Adapter Port 1] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = button(11) DPad L = button(10) DPad D = button(9) DPad U = button(8) Start = button(7) Z Trig = button(4) B Button = button(3) A Button = button(0) C Button R = axis(3+) C Button L = axis(3-) C Button D = axis(4+) C Button U = axis(4-) R Trig = button(5) L Trig = button(4) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [TigerGame XBOX+PS2+GC Game Controller Adapter] [WiseGroup.,Ltd TigerGame XBOX+PS2+GC Game Controller Adapter] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = button(9) DPad L = button(8) DPad D = button(10) DPad U = button(11) Start = button(7) Z Trig = button(6) B Button = button(1) A Button = button(0) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(3+) C Button U = axis(3-) R Trig = axis(4+) L Trig = axis(5+) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Wish Technologies Adaptoid] [Adaptoid] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = button(13) DPad L = button(12) DPad D = button(11) DPad U = button(10) Start = button(8) Z Trig = button(9) B Button = button(3) A Button = button(0) C Button R = button(2) C Button L = button(4) C Button D = button(1) C Button U = button(5) R Trig = button(7) L Trig = button(6) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; X-box controllers and compatible clones [Microsoft X-Box pad v1 (US)] [Microsoft X-Box pad v2 (US)] [Microsoft X-Box pad (Japan)] [Microsoft Xbox Controller S] [Thrustmaster, Inc. Controller] [Logitech Xbox Cordless Controller] [Logitech Compact Controller for Xbox] [Mad Catz Controller (unverified)] [InterAct 'PowerPad Pro' X-Box pad (Germany)] [Mad Catz Control Pad] [Mad Catz LumiCON] [Mad Catz Control Pad Pro] [Mad Catz MicroCON] [Mad Catz Lynx Wireless Controller] [Zeroplus Xbox Controller] [Pelican Eclipse PL-2023] [Zeroplus Xbox Controller] [Radica Gamester Controller] [Radica Games Jtech Controller] [Logic3 Freebird wireless Controller] [Eclipse wireless Controller] [Edge wireless Controller] [SmartJoy Frag Xpad/PS2 adaptor] [Joytech Advanced Controller] [BigBen XBMiniPad Controller] [Joytech Wireless Advanced Controller] [Chinese-made Xbox Controller] [Generic X-Box pad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(7) Z Trig = axis(2+) B Button = button(2) A Button = button(0) C Button R = axis(3+) C Button L = axis(3-) button(3) C Button D = axis(4+) button(1) C Button U = axis(4-) R Trig = button(5) axis(5+) L Trig = button(4) Mempak switch = button(9) Rumblepak switch = button(10) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [OSX: USB GamePad] ; this is a 2-port USB device. The Right port is controller #1, the Left port is #2 ; this is the "MayFlash" adapter, aka HuiJia. The OSX driver seems to have a ; different button mapping plugged = True mouse = False AnalogDeadzone = 2500,2500 AnalogPeak = 20000,20000 DPad R = button(13) DPad L = button(15) DPad D = button(14) DPad U = button(12) Start = button(9) Z Trig = button(8) B Button = button(2) A Button = button(1) C Button R = axis(1-) C Button L = axis(1+) C Button D = axis(0+) C Button U = axis(0-) R Trig = button(7) L Trig = button(6) Mempak switch = key(109) Rumblepak switch = key(114) X Axis = axis(2-,2+) Y Axis = axis(3-,3+) __NextController: plugged = True mouse = False AnalogDeadzone = 2500,2500 AnalogPeak = 20000,20000 DPad R = button(29) DPad L = button(31) DPad D = button(30) DPad U = button(28) Start = button(25) Z Trig = button(24) B Button = button(18) A Button = button(17) C Button R = axis(5-) C Button L = axis(5+) C Button D = axis(4+) C Button U = axis(4-) R Trig = button(23) L Trig = button(22) Mempak switch = key(109) Rumblepak switch = key(114) X Axis = axis(6-,6+) Y Axis = axis(7-,7+) [Linux: HuiJia USB GamePad] plugged = True mouse = False AnalogDeadzone = 100,100 AnalogPeak = 20000,20000 DPad R = button(13) DPad L = button(15) DPad D = button(14) DPad U = button(12) Start = button(8) Z Trig = button(9) B Button = button(2) A Button = button(1) C Button R = axis(3-) C Button L = axis(3+) C Button D = axis(2+) C Button U = axis(2-) R Trig = button(7) L Trig = button(6) Mempak switch = key(109) Rumblepak switch = key(114) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; Mayflash N64 Controller Adapter (for PC USB) - With two N64 gamepads connected ; this is a 2-port USB device. The Right port is controller #1, the Left port is #2 [Win32: USB GamePad] plugged = True mouse = False AnalogDeadzone = 1024,1024 AnalogPeak = 12288,12288 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(8) Z Trig = button(9) B Button = button(2) A Button = button(1) C Button R = axis(3-) C Button L = axis(3+) C Button D = axis(2+) C Button U = axis(2-) R Trig = button(7) L Trig = button(6) Mempak switch = key(109) Rumblepak switch = key(114) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; MayFlash PC048 adapter [PS/SS/N64 Joypad to USB BOX] plugged = True mouse = False AnalogDeadzone = 1024,1024 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(8) Z Trig = button(9) B Button = button(2) A Button = button(1) C Button R = axis(2-) C Button L = axis(2+) C Button D = axis(3+) C Button U = axis(3-) R Trig = button(7) L Trig = button(5) Mempak switch = Rumblepak switch = Y Axis = axis(1-,1+) X Axis = axis(0-,0+) ; Asikgame - Super Dual Box (with two PS2 gamepads connected) ; this is a 2-port USB device. The Right port is controller #1, the Left port is #2 [USB Human(2p) Interface Device] plugged = True mouse = False DPad R= axis(2+) DPad L= axis(2-) DPad D= axis(5+) DPad U= axis(5-) Start= button(0) Z Trig= button(1) B Button= button(3) A Button= button(2) C Button R= hat(0 Right) C Button L= hat(0 Left) C Button D= hat(0 Down) C Button U= hat(0 Up) R Trig= button(5) L Trig= button(4) Mempak switch= button(9) Rumblepak switch= button(8) Y Axis= axis(1-,1+) X Axis= axis(0-,0+) __NextController: plugged = True mouse = False DPad R= axis(6+) DPad L= axis(6-) DPad D= axis(7+) DPad U= axis(7-) Start= button(12) Z Trig= button(13) B Button= button(15) A Button= button(14) C Button R= hat(1 Right) C Button L= hat(1 Left) C Button D= hat(1 Down) C Button U= hat(1 Up) R Trig= button(17) L Trig= button(16) Mempak switch= button(21) Rumblepak switch= button(20) Y Axis= axis(4-,4+) X Axis= axis(3-,3+) [Microsoft SideWinder Game Pad Pro USB version 1.0] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = key(275) DPad L = key(276) DPad D = key(274) DPad U = key(273) Start = button(8) Z Trig = button(6) B Button = button(0) A Button = button(3) C Button R = button(2) C Button L = button(4) C Button D = button(1) C Button U = button(5) R Trig = button(7) L Trig = button(6) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [USB,2-axis 8-button gamepad] [USB Gamepad ] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = axis(0+) DPad L = axis(0-) DPad D = axis(1+) DPad U = axis(1-) Start = button(7) Z Trig = button(6) B Button = button(1) A Button = button(0) C Button R = button(2) C Button L = button(3) C Button D = button(99) C Button U = button(99) R Trig = button(4) L Trig = button(5) Mempak switch = key(109) Rumblepak switch = key(114) Y Axis = axis(1-,1+) X Axis = axis(0-,0+) ; RetroUSB "USB N64 RetroPort" [N64 ] plugged = True mouse = False AnalogDeadzone = 2048,2048 AnalogPeak = 18432,18432 DPad R = button(0) DPad L = button(1) DPad D = button(2) DPad U = button(3) Start = button(4) Z Trig = button(5) B Button = button(6) A Button = button(7) C Button R = button(8) C Button L = button(9) C Button D = button(10) C Button U = button(11) R Trig = button(12) L Trig = button(13) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [Jess Tech GGE909 PC Recoil Pad] plugged = True mouse = False AnalogDeadzone = 4096,4096 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(9) Z Trig = button(7) B Button = button(0) A Button = button(2) C Button R = axis(3+) C Button L = axis(3-) C Button D = axis(2+) C Button U = axis(2-) R Trig = button(6) L Trig = button(4) Mempak switch = button(10) Rumblepak switch = button(11) X Axis = axis(0-,0+) Y Axis = axis(1-,1+) [8BITDO NES30] plugged = True mouse = False DPad R = key(3) DPad L = key(2) DPad D = key(5) DPad U = key(0) Start = key(22) Z Trig = key(21) B Button = key(12) A Button = key(11) C Button R = key(3) C Button L = key(2) C Button D = key(5) C Button U = key(0) R Trig = key(99) L Trig = key(120) Mempak switch = key(44) Rumblepak switch = key(46) X Axis = key(276,275) Y Axis = key(273,274) ; Xiaomi Bluetooth Controller [小米蓝牙手柄] plugged = True mouse = False AnalogDeadzone = 0,0 AnalogPeak = 32768,32768 DPad R = axis(8+) DPad L = axis(8-) DPad D = axis(9+) DPad U = axis(9-) Start = button(11) Z Trig = button(6) B Button = button(3) A Button = button(0) C Button R = axis(2+) C Button L = axis(2-) C Button D = axis(5+) C Button U = axis(5-) R Trig = button(7) L Trig = button(8) Mempak switch = Rumblepak switch = X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; ODROID Go Advance Gamepad [odroidgo2_joypad] plugged = True mouse = False AnalogDeadzone = 0,0 AnalogPeak = 32768,32768 DPad R = button(11) DPad L = button(10) DPad D = button(9) DPad U = button(8) Start = button(17) Z Trig = button(12) B Button = button(3) A Button = button(0) C Button R = button(15) C Button L = button(2) C Button D = button(1) C Button U = button(14) R Trig = button(5) L Trig = button(4) Mempak switch = Rumblepak switch = # Analog axis configuration mappings X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ; RG351P Gamepad [OpenSimHardware OSH PB Controller] plugged = True mouse = False AnalogDeadzone = 0,0 AnalogPeak = 32768,32768 DPad R = hat(0 Right) DPad L = hat(0 Left) DPad D = hat(0 Down) DPad U = hat(0 Up) Start = button(6) Z Trig = button(9) B Button = button(3) A Button = button(1) C Button R = button(11) C Button L = button(2) C Button D = button(0) C Button U = button(10) R Trig = button(5) L Trig = button(4) Mempak switch = Rumblepak switch = # Analog axis configuration mappings X Axis = axis(0+,0-) Y Axis = axis(1+,1-) ; RG351MP Gamepad [GO-Super Gamepad] plugged = True mouse = False AnalogDeadzone = 0,0 AnalogPeak = 32768,32768 DPad R = button(11) DPad L = button(10) DPad D = button(9) DPad U = button(8) Start = button(13) Z Trig = button(15) B Button = button(3) A Button = button(0) C Button R = button(7) C Button L = button(2) C Button D = button(1) C Button U = button(6) R Trig = button(5) L Trig = button(4) Mempak switch = Rumblepak switch = # Analog axis configuration mappings X Axis = axis(0-,0+) Y Axis = axis(1-,1+) ================================================ FILE: packages/sx05re/emulators/mupen64plussa/mupen64plussa-input-sdl/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="mupen64plussa-input-sdl" PKG_VERSION="5e20c6f87b73a07c92148cc4d11f9dfb3b0b0f15" PKG_SHA256="113558329487f8fba6c6fe361a1ff5863d0e3088c26dde6f1a4eb6c599762917" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/mupen64plus/mupen64plus-input-sdl" PKG_URL="https://github.com/mupen64plus/mupen64plus-input-sdl/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ${OPENGLES} libpng SDL2 SDL2_net zlib freetype nasm:host mupen64plussa-core" PKG_SHORTDESC="mupen64plus-input-sdl" PKG_LONGDESC="Mupen64Plus Standalone Input SDL" PKG_TOOLCHAIN="manual" PKG_MAKE_OPTS_TARGET+="USE_GLES=1" make_target() { export HOST_CPU=aarch64 export APIDIR=$(get_install_dir mupen64plussa-core)/usr/local/include/mupen64plus export USE_GLES=1 export SDL_CFLAGS="-I${SYSROOT_PREFIX}/usr/include/SDL2 -D_REENTRANT" export SDL_LDLIBS="-lSDL2_net -lSDL2" export CROSS_COMPILE="${TARGET_PREFIX}" export V=1 export VC=0 BINUTILS="$(get_build_dir binutils)/.${TARGET_NAME}" make -C projects/unix clean make -C projects/unix all ${PKG_MAKE_OPTS_TARGET} } makeinstall_target() { UPREFIX=${INSTALL}/usr/local ULIBDIR=${UPREFIX}/lib USHAREDIR=${UPREFIX}/share/mupen64plus UPLUGINDIR=${ULIBDIR}/mupen64plus mkdir -p ${UPLUGINDIR} cp ${PKG_BUILD}/projects/unix/mupen64plus-input-sdl.so ${UPLUGINDIR} #${STRIP} ${UPLUGINDIR}/mupen64plus-input-sdl.so chmod 0644 ${UPLUGINDIR}/mupen64plus-input-sdl.so mkdir -p ${USHAREDIR} cp ${PKG_DIR}/config/InputAutoCfg.ini ${USHAREDIR} chmod 644 ${USHAREDIR}/InputAutoCfg.ini } ================================================ FILE: packages/sx05re/emulators/mupen64plussa/mupen64plussa-rsp-hle/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="mupen64plussa-rsp-hle" PKG_VERSION="88093cb43499eff53d343653cddcae2132af17ef" PKG_SHA256="ca2f2c583b73f37d4c1e02a0b4e665275126e6e4cfda2e367087e879f0fd73e2" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/mupen64plus/mupen64plus-rsp-hle" PKG_URL="https://github.com/mupen64plus/mupen64plus-rsp-hle/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ${OPENGLES} libpng SDL2 SDL2_net zlib freetype nasm:host mupen64plussa-core" PKG_SHORTDESC="mupen64plus-rsp-hle" PKG_LONGDESC="Mupen64Plus Standalone RSP HLE" PKG_TOOLCHAIN="manual" PKG_MAKE_OPTS_TARGET+="USE_GLES=1" make_target() { export HOST_CPU=aarch64 export APIDIR=$(get_install_dir mupen64plussa-core)/usr/local/include/mupen64plus export USE_GLES=1 export SDL_CFLAGS="-I${SYSROOT_PREFIX}/usr/include/SDL2 -D_REENTRANT" export SDL_LDLIBS="-lSDL2_net -lSDL2" export CROSS_COMPILE="${TARGET_PREFIX}" export V=1 export VC=0 BINUTILS="$(get_build_dir binutils)/.${TARGET_NAME}" make -C projects/unix clean make -C projects/unix all ${PKG_MAKE_OPTS_TARGET} } makeinstall_target() { UPREFIX=${INSTALL}/usr/local ULIBDIR=${UPREFIX}/lib UPLUGINDIR=${ULIBDIR}/mupen64plus mkdir -p ${UPLUGINDIR} cp ${PKG_BUILD}/projects/unix/mupen64plus-rsp-hle.so ${UPLUGINDIR} #${STRIP} ${UPLUGINDIR}/mupen64plus-rsp-hle.so chmod 0644 ${UPLUGINDIR}/mupen64plus-rsp-hle.so } ================================================ FILE: packages/sx05re/emulators/mupen64plussa/mupen64plussa-ui-console/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="mupen64plussa-ui-console" PKG_VERSION="32e27344214946f0dce3cd2b4fff152a3538bd8f" PKG_SHA256="7d4a0a71545caec19d007f34038cffaee36b75d27de615cd4e175bb5ab2e227d" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/mupen64plus/mupen64plus-ui-console" PKG_URL="https://github.com/mupen64plus/mupen64plus-ui-console/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ${OPENGLES} libpng SDL2 SDL2_net zlib freetype nasm:host mupen64plussa-core" PKG_SHORTDESC="mupen64plus-ui-console" PKG_LONGDESC="Mupen64Plus Standalone Console" PKG_TOOLCHAIN="manual" PKG_MAKE_OPTS_TARGET+="USE_GLES=1" make_target() { export HOST_CPU=aarch64 export APIDIR=$(get_install_dir mupen64plussa-core)/usr/local/include/mupen64plus export USE_GLES=1 export SDL_CFLAGS="-I${SYSROOT_PREFIX}/usr/include/SDL2 -D_REENTRANT" export SDL_LDLIBS="-lSDL2_net -lSDL2" export CROSS_COMPILE="${TARGET_PREFIX}" export V=1 export VC=0 BINUTILS="$(get_build_dir binutils)/.${TARGET_NAME}" make -C projects/unix clean make -C projects/unix all ${PKG_MAKE_OPTS_TARGET} } makeinstall_target() { UPREFIX=${INSTALL}/usr/local ULIBDIR=${UPREFIX}/lib UBINDIR=${INSTALL}/usr/bin UMANDIR=${UPREFIX}/share/man UAPPSDIR=${UPREFIX}/share/applications UICONSDIR=${UPREFIX}/share/icons/hicolor mkdir -p ${UBINDIR} cp ${PKG_BUILD}/projects/unix/mupen64plus ${UBINDIR} #${STRIP} ${UBINDIR}/mupen64plus chmod 0755 ${UBINDIR}/mupen64plus mkdir -p ${UMANDIR}/man6 cp ${PKG_BUILD}/doc/mupen64plus.6 ${UMANDIR}/man6 chmod 0644 ${UMANDIR}/man6/mupen64plus.6 mkdir -p ${UAPPSDIR} cp ${PKG_BUILD}/data/mupen64plus.desktop ${UAPPSDIR} chmod 0644 ${UAPPSDIR}/mupen64plus.desktop mkdir -p ${UICONSDIR}/48x48/apps cp ${PKG_BUILD}/data/icons/48x48/apps/mupen64plus.png ${UICONSDIR}/48x48/apps chmod 0644 ${UICONSDIR}/48x48/apps/mupen64plus.png mkdir -p ${UICONSDIR}/scalable/apps cp ${PKG_BUILD}/data/icons/scalable/apps/mupen64plus.svg ${UICONSDIR}/scalable/apps chmod 0644 ${UICONSDIR}/scalable/apps/mupen64plus.svg } ================================================ FILE: packages/sx05re/emulators/mupen64plussa/mupen64plussa-video-glide64mk2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="mupen64plussa-video-glide64mk2" PKG_VERSION="5ac60b38e2c9d9dea3c21fd341b03799841b0b5f" PKG_SHA256="715a4d92f38672225ccf670edbec974816870d061e5ccdf4bc70a49cdccde8d2" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/mupen64plus/mupen64plus-video-glide64mk2" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ${OPENGLES} boost libpng SDL2 SDL2_net zlib freetype nasm:host mupen64plussa-core" PKG_SHORTDESC="mupen64plus-video-glide64mk2" PKG_LONGDESC="Mupen64Plus Standalone Glide64 Video Driver" PKG_TOOLCHAIN="manual" PKG_MAKE_OPTS_TARGET+="USE_GLES=1" make_target() { export HOST_CPU=aarch64 export APIDIR=$(get_install_dir mupen64plussa-core)/usr/local/include/mupen64plus export USE_GLES=1 export SDL_CFLAGS="-I${SYSROOT_PREFIX}/usr/include/SDL2 -D_REENTRANT" export SDL_LDLIBS="-lSDL2_net -lSDL2" export CROSS_COMPILE="${TARGET_PREFIX}" export V=1 export VC=0 BINUTILS="$(get_build_dir binutils)/.${TARGET_NAME}" make -C projects/unix clean make -C projects/unix all ${PKG_MAKE_OPTS_TARGET} } makeinstall_target() { UPREFIX=${INSTALL}/usr/local ULIBDIR=${UPREFIX}/lib USHAREDIR=${UPREFIX}/share/mupen64plus UPLUGINDIR=${ULIBDIR}/mupen64plus mkdir -p ${UPLUGINDIR} cp ${PKG_BUILD}/projects/unix/mupen64plus-video-glide64mk2.so ${UPLUGINDIR} #${STRIP} ${UPLUGINDIR}/mupen64plus-video-glide64mk2.so chmod 0644 ${UPLUGINDIR}/mupen64plus-video-glide64mk2.so mkdir -p ${USHAREDIR} cp ${PKG_BUILD}/data/Glide64mk2.ini ${USHAREDIR} chmod 0644 ${USHAREDIR}/Glide64mk2.ini } ================================================ FILE: packages/sx05re/emulators/mupen64plussa/mupen64plussa-video-rice/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="mupen64plussa-video-rice" PKG_VERSION="3da7d800989717111da5992a50a8ac410cac038f" PKG_SHA256="4a7d1ac05a0dc82f071afdef747b4a7876140e580e2d6c8b5306865cfb069c43" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/mupen64plus/mupen64plus-video-rice" PKG_URL="https://github.com/mupen64plus/mupen64plus-video-rice/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ${OPENGLES} libpng SDL2 SDL2_net zlib freetype nasm:host mupen64plussa-core" PKG_SHORTDESC="mupen64plus-video-rice" PKG_LONGDESC="Mupen64Plus Standalone Rice Video Driver" PKG_TOOLCHAIN="manual" PKG_MAKE_OPTS_TARGET+="USE_GLES=1" make_target() { export HOST_CPU=aarch64 export APIDIR=$(get_install_dir mupen64plussa-core)/usr/local/include/mupen64plus export USE_GLES=1 export SDL_CFLAGS="-I${SYSROOT_PREFIX}/usr/include/SDL2 -D_REENTRANT" export SDL_LDLIBS="-lSDL2_net -lSDL2" export CROSS_COMPILE="${TARGET_PREFIX}" export V=1 export VC=0 BINUTILS="$(get_build_dir binutils)/.${TARGET_NAME}" make -C projects/unix clean make -C projects/unix all ${PKG_MAKE_OPTS_TARGET} } makeinstall_target() { UPREFIX=${INSTALL}/usr/local ULIBDIR=${UPREFIX}/lib USHAREDIR=${UPREFIX}/share/mupen64plus UPLUGINDIR=${ULIBDIR}/mupen64plus mkdir -p ${UPLUGINDIR} cp ${PKG_BUILD}/projects/unix/mupen64plus-video-rice.so ${UPLUGINDIR} #${STRIP} ${UPLUGINDIR}/mupen64plus-video-rice.so chmod 0644 ${UPLUGINDIR}/mupen64plus-video-rice.so mkdir -p ${USHAREDIR} cp ${PKG_BUILD}/data/RiceVideoLinux.ini ${USHAREDIR} chmod 0644 ${USHAREDIR}/RiceVideoLinux.ini } ================================================ FILE: packages/sx05re/emulators/mupen64plussa/package.mk ================================================ # 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="mupen64plussa" PKG_VERSION="" PKG_LICENSE="GPL" PKG_SITE="https://mupen64plus.org/" PKG_URL="" PKG_DEPENDS_TARGET="toolchain mupen64plussa-core mupen64plussa-ui-console mupen64plussa-audio-sdl mupen64plussa-input-sdl mupen64plussa-rsp-hle mupen64plussa-video-rice mupen64plussa-video-glide64mk2" PKG_SECTION="virtual" PKG_LONGDESC="Meta package for installing the different Mupen64Plus standalone modules" ================================================ FILE: packages/sx05re/emulators/openbor/config/gptokeyb/openbor.gptk ================================================ back = esc start = enter guide = enter a = d b = a x = s y = f l1 = z l2 = home l3 = mouse_right r1 = x r2 = end r3 = shift up = up down = down left = left right = right right_analog_up = mouse_movement_up right_analog_down = mouse_movement_down right_analog_left = mouse_movement_left right_analog_right = mouse_movement_right left_analog_up = up left_analog_down = down left_analog_left = left left_analog_right = right deadzone_y = 2100 deadzone_x = 1900 deadzone_triggers = 3000 mouse_scale = 512 mouse_delay = 16 ================================================ FILE: packages/sx05re/emulators/openbor/openborff/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="openborff" PKG_VERSION="3c14ffc37c984a5aebc7a3fb6133b47484d43bd2" PKG_SHA256="275ba0593027053cfd9df0586868e1471b71153858dc0b42429938db07eba74c" PKG_ARCH="any" PKG_SITE="https://github.com/gonzalomvp/openbor" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2 libogg libvorbisidec libvpx libpng" PKG_SHORTDESC="OpenBOR is the ultimate 2D side scrolling engine for beat em' ups, shooters, and more! " PKG_LONGDESC="OpenBOR is the ultimate 2D side scrolling engine for beat em' ups, shooters, and more! " PKG_TOOLCHAIN="make" if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then PKG_PATCH_DIRS="OdroidGoAdvance" fi if [[ "${ARCH}" == "arm" ]]; then PKG_PATCH_DIRS="${ARCH}" else PKG_PATCH_DIRS="emuelec-aarch64" fi pre_configure_target() { PKG_MAKE_OPTS_TARGET="BUILD_LINUX_${ARCH}=1 \ -C ${PKG_BUILD}/engine \ SDKPATH=\"${SYSROOT_PREFIX}\" \ PREFIX=${TARGET_NAME}" } pre_make_target() { cd ${PKG_BUILD}/engine ./version.sh } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp `find . -name "OpenBOR.elf" | xargs echo` ${INSTALL}/usr/bin/OpenBORff chmod +x ${INSTALL}/usr/bin/* mkdir -p ${INSTALL}/usr/config/emuelec/configs/openbor cp ${PKG_DIR}/config/master.cfg ${INSTALL}/usr/config/emuelec/configs/openbor/masterff.cfg } ================================================ FILE: packages/sx05re/emulators/openbor/openborff/patches/emuelec-aarch64/openborff-01-addplatform_fixes.patch ================================================ From 5d057e7b6b350e2faa75c041d0081fb2963e980d Mon Sep 17 00:00:00 2001 From: 5schatten Date: Sat, 12 Oct 2019 19:24:14 +0200 Subject: [PATCH] engine/Makefile: updated platform --- engine/Makefile | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/engine/Makefile b/engine/Makefile index 8b0f9a65..6e8198e0 100644 --- a/engine/Makefile +++ b/engine/Makefile @@ -95,6 +95,31 @@ BUILD_DEBUG = 1 endif endif + +ifdef BUILD_LINUX_aarch64 +TARGET = $(VERSION_NAME).elf +TARGET_FINAL = $(VERSION_NAME) +TARGET_PLATFORM = LINUX +BUILD_LINUX = 1 +BUILD_SDL = 1 +BUILD_GFX = 1 +BUILD_PTHREAD = 1 +BUILD_SDL_IO = 1 +BUILD_VORBIS = 1 +BUILD_WEBM = 1 +BUILDING = 1 +INCLUDES = $(SDKPATH)/usr/include \ + $(SDKPATH)/usr/include/SDL2 +OBJTYPE = elf +LIBRARIES = $(SDKPATH)/usr/lib +# Workaround for GCC 9 +CFLAGS += -Wno-error=address -Wno-error=format-overflow -Wno-error=stringop-truncation -Wno-error=implicit-function-declaration -Wno-error=unused-variable -Wno-error=unused-label + +ifeq ($(BUILD_LINUX_aarch64), 0) +BUILD_DEBUG = 1 +endif +endif + ifdef BUILD_DARWIN TARGET = $(VERSION_NAME).elf @@ -208,7 +233,7 @@ STRIP = strip$(EXTENSION) $(TARGET) -o $(TARGET_FINAL) endif ifdef BUILD_LINUX -STRIP = strip $(TARGET) -o $(TARGET_FINAL) +STRIP = cp $(TARGET) $(TARGET_FINAL) endif ifdef BUILD_DARWIN STRIP = $(PREFIX)strip $(TARGET) -o $(TARGET_FINAL) --- a/engine/openbor.h +++ b/engine/openbor.h @@ -1902,7 +1902,7 @@ struct animlist *next; }; typedef struct animlist s_anim_list; -s_anim_list *anim_list; +extern s_anim_list *anim_list; typedef struct { @@ -2248,7 +2248,7 @@ int clearcount; int selectcol; } s_modelcache; -s_modelcache *model_cache; +extern s_modelcache *model_cache; // Caskey, Damon V. // 2013-12-08 --- a/engine/openbor.c +++ b/engine/openbor.c @@ -45,6 +45,9 @@ //when there are more entities than this, those with lower priority will be erased int spawnoverride = 999999; int maxentities = 999999; + +s_modelcache *model_cache; +s_anim_list *anim_list; int global_model = -1; #define global_model_scripts ((global_model>=0 && model_cache[global_model].model)?model_cache[global_model].model->scripts:NULL) @@ -2424,7 +2427,7 @@ savedata.logo = 0; savedata.uselog = 1; savedata.debuginfo = 0; - savedata.fullscreen = 0; + savedata.fullscreen = 1; #ifdef RASPBERRY savedata.fullscreen = 1; #endif ================================================ FILE: packages/sx05re/emulators/openbor/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="openbor" #PKG_VERSION="18.1.2024 / 08d79c23dc29f6e788d41aa76d828ee553344337" PKG_VERSION="f71c4fd95f9bbf101a758a3e82832f31be00d1cf" #PKG_SHA256="5857160fa876556cd744bcd03eadc99e00acab64" PKG_ARCH="any" PKG_SITE="https://github.com/DCurrent/openbor" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2 libogg libvorbisidec libvpx libpng openborff" PKG_SHORTDESC="OpenBOR is the ultimate 2D side scrolling engine for beat em' ups, shooters, and more! " PKG_LONGDESC="OpenBOR is the ultimate 2D side scrolling engine for beat em' ups, shooters, and more! " PKG_TOOLCHAIN="make" if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then PKG_PATCH_DIRS="OdroidGoAdvance" fi if [[ "${ARCH}" == "arm" ]]; then PKG_PATCH_DIRS="${ARCH}" else PKG_PATCH_DIRS="emuelec-aarch64" fi pre_configure_target() { PKG_MAKE_OPTS_TARGET="BUILD_LINUX_${ARCH}=1 \ -C ${PKG_BUILD}/engine \ SDKPATH="${SYSROOT_PREFIX}" PREFIX=${TARGET_NAME}" } pre_make_target() { cd ${PKG_BUILD}/engine chmod +x ./version.sh ./version.sh } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp `find . -name "OpenBOR.elf" | xargs echo` ${INSTALL}/usr/bin/OpenBOR cp ${PKG_DIR}/scripts/*.sh ${INSTALL}/usr/bin chmod +x ${INSTALL}/usr/bin/* mkdir -p ${INSTALL}/usr/config/emuelec/configs/openbor cp ${PKG_DIR}/config/master.cfg ${INSTALL}/usr/config/emuelec/configs/openbor/master.cfg mkdir -p ${INSTALL}/usr/config/emuelec/configs/gptokeyb cp -rf ${PKG_DIR}/config/gptokeyb/* ${INSTALL}/usr/config/emuelec/configs/gptokeyb } ================================================ FILE: packages/sx05re/emulators/openbor/patches/002openbor-defaultfs.patch ================================================ --- a/engine/openbor.c +++ b/engine/openbor.c @@ -2639,7 +2639,7 @@ savedata.logo = 1; savedata.uselog = 1; savedata.debuginfo = 0; - savedata.fullscreen = 0; + savedata.fullscreen = 1; savedata.fpslimit = 1; // default to vsync #if WII ================================================ FILE: packages/sx05re/emulators/openbor/patches/007-version.patch ================================================ diff --git a/engine/version.sh b/engine/version.sh index 44bb1a6..f38197f 100755 --- a/engine/version.sh +++ b/engine/version.sh @@ -32,8 +32,8 @@ # get commit hash, 7 chars in length is enough, and still work when supply as URL on github.com VERSION_COMMIT=`git rev-parse HEAD | cut -c -7` else # manually add build number if missing - echo "Missing version build, please add it manually and press ENTER: "; read -r VERSION_BUILD - echo "Missing version commit, please add it manually and press ENTER: "; read -r VERSION_COMMIT + VERSION_BUILD=openbor + VERSION_COMMIT=openbor if [ -z $VERSION_BUILD ]; then VERSION_BUILD=0; fi if [ -z $VERSION_COMMIT ]; then VERSION_COMMIT="0000000"; fi echo "VERSION_BUILD is set to: $VERSION_BUILD" ================================================ FILE: packages/sx05re/emulators/openbor/patches/arm/openbor-02-addplatform.patch ================================================ From 5d057e7b6b350e2faa75c041d0081fb2963e980d Mon Sep 17 00:00:00 2001 From: 5schatten Date: Sat, 12 Oct 2019 19:24:14 +0200 Subject: [PATCH] engine/Makefile: updated platform --- engine/Makefile | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/engine/Makefile b/engine/Makefile index 8b0f9a65..6e8198e0 100644 --- a/engine/Makefile +++ b/engine/Makefile @@ -103,6 +103,52 @@ BUILD_DEBUG = 1 endif endif +ifdef BUILD_LINUX_x86_64 +TARGET = $(VERSION_NAME).elf +TARGET_FINAL = $(VERSION_NAME) +TARGET_PLATFORM = LINUX +BUILD_SDL = 1 +BUILD_GFX = 1 +BUILD_PTHREAD = 1 +BUILD_SDL_IO = 1 +BUILD_OPENGL = 1 +BUILD_LOADGL = 1 +BUILD_VORBIS = 1 +BUILD_WEBM = 1 +BUILDING = 1 +YASM = nasm +OBJTYPE = elf +INCLUDES = $(SDKPATH)/usr/include \ + $(SDKPATH)/usr/include/SDL2 +TARGET_ARCH = amd64 +BUILD_AMD64 = 1 +ARCHFLAGS = -m64 +LIBRARIES = $(SDKPATH)/usr/lib +CFLAGS += -DAMD64 +# Workaround for GCC 9 +CFLAGS += -Wno-error=format-overflow -Wno-error=stringop-truncation +endif + +ifdef BUILD_LINUX_arm +TARGET = $(VERSION_NAME).elf +TARGET_FINAL = $(VERSION_NAME) +TARGET_PLATFORM = LINUX +BUILD_LINUX = 1 +BUILD_SDL = 1 +BUILD_GFX = 1 +BUILD_PTHREAD = 1 +BUILD_SDL_IO = 1 +BUILD_VORBIS = 1 +BUILD_WEBM = 1 +BUILDING = 1 +INCLUDES = $(SDKPATH)/usr/include \ + $(SDKPATH)/usr/include/SDL2 +OBJTYPE = elf +LIBRARIES = $(SDKPATH)/usr/lib +# Workaround for GCC 9 +CFLAGS += -Wno-error=format-overflow -Wno-error=stringop-truncation -Wno-error=implicit-function-declaration -Wno-error=unused-variable -Wno-error=unused-label +endif + ifdef BUILD_DARWIN TARGET = $(VERSION_NAME).elf TARGET_FINAL = $(VERSION_NAME) @@ -195,7 +241,7 @@ ifdef BUILD_WIN STRIP = $(WINDEV)/$(PREFIX)strip$(EXTENSION) $(TARGET) -o $(TARGET_FINAL) endif ifdef BUILD_LINUX -STRIP = $(LNXDEV)/$(PREFIX)strip $(TARGET) -o $(TARGET_FINAL) +STRIP = $(PREFIX)-strip $(TARGET) -o $(TARGET_FINAL) endif ifdef BUILD_DARWIN STRIP = $(PREFIX)strip $(TARGET) -o $(TARGET_FINAL) ================================================ FILE: packages/sx05re/emulators/openbor/patches/emuelec-aarch64/openbor-02-addplatform.patch ================================================ From 5d057e7b6b350e2faa75c041d0081fb2963e980d Mon Sep 17 00:00:00 2001 From: 5schatten Date: Sat, 12 Oct 2019 19:24:14 +0200 Subject: [PATCH] engine/Makefile: updated platform --- engine/Makefile | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/engine/Makefile b/engine/Makefile index 8b0f9a65..6e8198e0 100644 --- a/engine/Makefile +++ b/engine/Makefile @@ -103,6 +103,52 @@ BUILD_DEBUG = 1 endif endif +ifdef BUILD_LINUX_x86_64 +TARGET = $(VERSION_NAME).elf +TARGET_FINAL = $(VERSION_NAME) +TARGET_PLATFORM = LINUX +BUILD_SDL = 1 +BUILD_GFX = 1 +BUILD_PTHREAD = 1 +BUILD_SDL_IO = 1 +BUILD_OPENGL = 1 +BUILD_LOADGL = 1 +BUILD_VORBIS = 1 +BUILD_WEBM = 1 +BUILDING = 1 +YASM = nasm +OBJTYPE = elf +INCLUDES = $(SDKPATH)/usr/include \ + $(SDKPATH)/usr/include/SDL2 +TARGET_ARCH = amd64 +BUILD_AMD64 = 1 +ARCHFLAGS = -m64 +LIBRARIES = $(SDKPATH)/usr/lib +CFLAGS += -DAMD64 +# Workaround for GCC 9 +CFLAGS += -Wno-error=format-overflow -Wno-error=stringop-truncation +endif + +ifdef BUILD_LINUX_aarch64 +TARGET = $(VERSION_NAME).elf +TARGET_FINAL = $(VERSION_NAME) +TARGET_PLATFORM = LINUX +BUILD_LINUX = 1 +BUILD_SDL = 1 +BUILD_GFX = 1 +BUILD_PTHREAD = 1 +BUILD_SDL_IO = 1 +BUILD_VORBIS = 1 +BUILD_WEBM = 1 +BUILDING = 1 +INCLUDES = $(SDKPATH)/usr/include \ + $(SDKPATH)/usr/include/SDL2 +OBJTYPE = elf +LIBRARIES = $(SDKPATH)/usr/lib +# Workaround for GCC 9 +CFLAGS += -Wno-error=address -Wno-error=format-overflow -Wno-error=stringop-truncation -Wno-error=implicit-function-declaration -Wno-error=unused-variable -Wno-error=unused-label +endif + ifdef BUILD_DARWIN TARGET = $(VERSION_NAME).elf TARGET_FINAL = $(VERSION_NAME) @@ -195,7 +241,7 @@ ifdef BUILD_WIN STRIP = $(WINDEV)/$(PREFIX)strip$(EXTENSION) $(TARGET) -o $(TARGET_FINAL) endif ifdef BUILD_LINUX -STRIP = $(LNXDEV)/$(PREFIX)strip $(TARGET) -o $(TARGET_FINAL) +STRIP = $(PREFIX)-strip $(TARGET) -o $(TARGET_FINAL) endif ifdef BUILD_DARWIN STRIP = $(PREFIX)strip $(TARGET) -o $(TARGET_FINAL) ================================================ FILE: packages/sx05re/emulators/openbor/scripts/openbor.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # OpenBOR only works with Pak files, if you have an extracted game you will need to create a pak first. OB=${2} [[ -z ${OB} ]] && OB=OpenBOR pakname=$(basename "${1}") pakname="${pakname%.*}" CONFIGDIR="/emuelec/configs/openbor" PAKS="${CONFIGDIR}/Paks" SAVES="${CONFIGDIR}/Saves" # Make sure the folders exists mkdir -p "${PAKS}" mkdir -p "${SAVES}" # make a symlink to the pak ln -sf "${1}" "${PAKS}" # create symlink to master.cfg rm "${SAVES}/${pakname}.cfg" if [ ${OB} = "OpenBORff" ]; then ln -sf "${CONFIGDIR}/masterff.cfg" "${SAVES}/${pakname}.cfg" else ln -sf "${CONFIGDIR}/master.cfg" "${SAVES}/${pakname}.cfg" fi # Run OpenBOR in the config folder cd "${CONFIGDIR}" SDL_AUDIODRIVER=alsa ${OB} # Clear PAKS folder to avoid getting the launcher on nex run rm -rf ${PAKS}/* ================================================ FILE: packages/sx05re/emulators/oricutron/config/oricutron.cfg ================================================ ; ; Example config file for Oricutron ; ; ---------------------------------- ; ROM files. (NOTE: For roms, DO NOT include the ".rom" file ; extension. These are added automatically. ; If a file with the same name, but with a ".sym" extension ; is found, symbols will be loaded from it and used in the ; debugger when the ROM in question is active. ; Filename of Oric Atmos ROM ;atmosrom = 'roms/basic11b' ; Filename of the Oric-1 ROM ;oric1rom = 'roms/basic10' ; Filename of the Pravetz 8D ROM ;pravetzrom = 'roms/pravetzt' ; Filename of ROMs for the telestrat banks ;telebank0 = '' ;telebank1 = '' ;telebank2 = '' ;telebank3 = '' ;telebank4 = '' ;telebank5 = 'roms/teleass' ;telebank6 = 'roms/hyperbas' ;telebank7 = 'roms/telmon24' ; ---------------------------------- ; Filename of the Microdisc ROM ;mdiscrom = 'roms/microdis' ; Filename of the Byte Drive 500 ROM ;bd500rom = 'roms/bd500' ; Filename of the Jasmin ROM ;jasminrom = 'roms/jasmin' ; Filename of the Pravetz 8D disk ROM ;pravetz8drom = 'roms/8dos' ;pravetz8drom = 'roms/8dos2' ; ---------------------------------- ; Type of machine to emulate (atmos, oric1, oric1-16k, telestrat, pravetz) machine = atmos ; ---------------------------------- ; Type of disk controller (none, microdisc, jasmin, bd500, pravetz) disktype = none ; Write back all changes to disk images (if turned off, you have to press ; F7 to write changes back to the disk image) diskautosave = yes ; ---------------------------------- ; Start with this disk in drive 0 (backslash is an escape char to insert ; quotes, so double backslash is required to insert a backslash. You can use ; forward slash as a path separator, even on windows. ;diskimage = 'assets/disks/aigledor.dsk' ; ---------------------------------- ; Default path for tapes ;tapepath = 'tapes' ; Default path for atmos/oric-1 disks ;diskpath = 'disks' ; Default path for telestrat disks ;telediskpath = 'teledisks' ; Default path for pravetz disks ;pravdiskpath = 'pravdisks' pravdiskautoboot = yes ; ---------------------------------- ; Start with this tape inserted ;tapeimage = ; ---------------------------------- ; Start Oricutron in the debugger? (yes/no) debug = no ; Load these symbols into the debugger ;symbols = 'd:/osdk/my project/build/symbols' ; ---------------------------------- ; Specifies how ROMDIS disables ROM chip(s) ; related to BD500/BDDOS ; rom16 = yes - 64k mode (Default) ; rom16 = no - 56k mode ;rom16 = yes ; Support BD500/DOS70 ; dos70 = no (default) ;dos70 = no ; ---------------------------------- ; Initial status bar mode (none, nofps, full) statusbarmode = none ; Render mode (soft, opengl) rendermode = opengl ; Show scanlines? (yes/no) scanlines = no ; Maintain correct aspect ratio in 50Hz/60Hz modes aratio = yes ; Horizontal stretch? (yes/no) <-- opengl only hstretch = no ; PAL ghosting? (yes/no) <-- opengl only palghosting = no ; Start fullscreen? fullscreen = yes ; Tell SDL to use a hardware surface? (might increase speed in fullscreen, or ; it might do nothing, or it might make it worse). (software rendering only) hwsurface = yes ; Force video display bit depth, either 16 or 32 (on some hardware, 16 can ; extremely slow, ie. eeepc clones). Normally Oricutron will guess the best ; one, but if it seems to be slow, try setting this to 16 or 32 to see if ; it makes a difference. (software rendering only) ;swdepth = 16 ; ---------------------------------- ; RAM pattern on powerup (0 or 1) rampattern = 0 ; ---------------------------------- ; Lightpen (yes/no) lightpen = no ; Enable printing to 'printer_out.txt' ; default enabled ;printenable = yes ; Filter printed symbols in 'printer_out.txt' ; select 'no' for raw binary mode ;printfilter = yes ; Enable audio DC adjustment ; default enabled ;dcadjust = yes ; Enable sound loopback ; default disabled ;soundloopon = no ; ACIA emulation back-end name: ; 'none' - no serial present ; 'loopback' - for testing - all TX data is returned to RX ; 'modem[:port][:ipv6]' - emulates com port with attached modem, ; only minimal AT command set is supported and ; data is redirected to TCP. Default port is 23 (telnet). ; if :ipv6 is added at the end uses IPv6 instead of IPv4 ; 'com:115200,8,N,1,' - use real or virtual on host as emulated ACIA ; baudrate, data bits, parity and stop bits can be set as needed ; ex.: Windows: 'com:115200,8,N,1,COM1' ; Linux: 'com:115200,8,N,1,/dev/ttyUSB0' serial = 'none' ; Set serial base address. Default: $31c serial_address = $31c ; Joystick interface for Atmos/Oric-1 mode. Telestrat has its own built-in standard. ; Options are 'none', 'altai', 'pase' or 'ijk' joyinterface = ijk ; How to emulate joysticks attached to the above interface ; Options are 'none', 'kbjoy1', 'kbjoy2', 'sdljoyN' (where n is 0 to 9) joystick_a = sdljoy0 joystick_b = none ; How to emulate joysticks attached to the telestrat ; Options are 'none', 'kbjoy1', 'kbjoy2', 'sdljoyN', 'mouse' telejoy_a = kbjoy2 telejoy_b = none ; Keys to emulate joystick, set 1 ; NOTE: "fire2" is only available on telestrat ; NOTE: "fire3" is only available on telestrat (right port) kbjoy1_up = 'KP8' kbjoy1_down = 'KP2' kbjoy1_left = 'KP4' kbjoy1_right = 'KP6' kbjoy1_fire1 = 'KP_SPACE' kbjoy1_fire2 = 'KP_PLUS' kbjoy1_fire3 = 'KP_MINUS' ; Keys to emulate joystick, set 2 kbjoy2_up = 'W' kbjoy2_down = 'S' kbjoy2_left = 'A' kbjoy2_right = 'D' kbjoy2_fire1 = 'SPACE' kbjoy2_fire2 = 'N' kbjoy2_fire3 = 'LALT' ; Visual keyboard show_keyboard = no sticky_mod_keys = no ;autoload_keyboard_mapping = 'keymap/my_keymap.kma' ; Disable menu color scheme ;disable_menuscheme = no ; ch376 chip emulation. This chip can read a usbkey. For more information : http://orix.oric.org ; only available in telestrat mode ch376 = no twilighte_board = no ================================================ FILE: packages/sx05re/emulators/oricutron/config/oricutron.gptk ================================================ # Oricutron gptokeyb configuration. # I N S T R U C T I O N S : # # If you have a game with special keys (for example A for UP, Z for down etc.), change the mapping table beneath accordingly # # Then SAVE this file under the game's name. For Example: Mr. Wimpy (Europe).gptk # # The correct filepath for the game-gptk file is: /storage/.config/emuelec/configs/gptokeyb/oric # # For example: /storage/.config/emuelec/configs/gptokeyb/oric/Mr. Wimpy (Europe).gptk # # Oricutron will automatically load the respective gptk file when starting the game. # If no gptk file is found, the emulator will always use "oricutron.gptk" in /storage/.config/emuelec/configs/gptokeyb/ #---------------------------------------------------------------------------------------------------------------------------- # D-Pad mapping to cursor keys up = up down = down left = left right = right # Left analog stick mapping to cursor keys left_analog_left = left left_analog_right = right left_analog_up = up left_analog_down = down #Alternative D-Pad mapping #up = A #down = Z #left = < #right = > # Alternative D-Pad mapping #up = w #down = s #left = a #right = d # Button mappings a = space b = enter x = y y = n select = esc start = 1 # Shoulder buttons for common Oric F-keys l1 = f1 r1 = f2 l2 = f3 r2 = f4 ================================================ FILE: packages/sx05re/emulators/oricutron/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024 PKG_NAME="oricutron" PKG_VERSION="a76131d" PKG_REV="1" PKG_ARCH="aarch64" PKG_LICENSE="GPL-2.0" PKG_SITE="https://github.com/pete-gordon/oricutron" PKG_URL="$PKG_SITE/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_SECTION="emuelec/emulators" PKG_SHORTDESC="Oricutron - Oric-1/Atmos/Telestrat emulator" PKG_TOOLCHAIN="make" pre_make_target() { cd "$PKG_BUILD" sed -i \ -e 's/filereq_gtk/filereq_sdl/g;s/msgbox_gtk/msgbox_sdl/g' \ -e 's/[[:space:]]*\(gui_x11\|render_gl\)\.o//g;/\(gui_x11\|render_gl\)\.c/d' \ -e 's/-D__OPENGL_AVAILABLE__//g;s/ -l\(GL\|GLU\|X11\)//g;s/-m64//g;s| -L/usr/lib64||g' \ -e '/pkg-config.*gtk/d;s/^\t\$(CXX)/\t\$(CC)/' \ -e 's/msgbox_sdl\.o/& emuelec_stub.o/' \ Makefile cat > emuelec_stub.c <<'EOF' void clipboard_copy(const char *t){(void)t;} char *clipboard_paste(void){return "";} void init_gui_native(void){} void shut_gui_native(void){} EOF } make_target() { cd "$PKG_BUILD" make PLATFORM=linux CC="$CC" CXX="$CC" \ CFLAGS="$CFLAGS -I$SYSROOT_PREFIX/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -DAUDIO_BUFLEN=1024 -D__CBCOPY__ -D__CBPASTE__ -DAPP_NAME_FULL='\"Oricutron\"' -DAPP_YEAR='\"2024\"' -DVERSION_COPYRIGHTS='\"Oricutron (c)2024\"'" \ LDFLAGS="$LDFLAGS -L$SYSROOT_PREFIX/usr/lib" \ LIBS="-lSDL -lpthread -lm" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -f ${PKG_BUILD}/oricutron ${INSTALL}/usr/bin/oricutron chmod +x ${INSTALL}/usr/bin/oricutron cp -f ${PKG_DIR}/scripts/oricutronstart.sh ${INSTALL}/usr/bin/oricutronstart.sh chmod +x ${INSTALL}/usr/bin/oricutronstart.sh mkdir -p ${INSTALL}/usr/config/emuelec/configs/oricutron cp -r ${PKG_BUILD}/roms ${INSTALL}/usr/config/emuelec/configs/oricutron/ 2>/dev/null || : cp -r ${PKG_BUILD}/images ${INSTALL}/usr/config/emuelec/configs/oricutron/ 2>/dev/null || : cp -f ${PKG_DIR}/config/oricutron.cfg \ ${INSTALL}/usr/config/emuelec/configs/oricutron/oricutron.cfg mkdir -p ${INSTALL}/usr/config/emuelec/configs/oricutron/disks mkdir -p ${INSTALL}/usr/config/emuelec/configs/oricutron/tapes mkdir -p ${INSTALL}/usr/config/emuelec/configs/gptokeyb cp -f ${PKG_DIR}/config/oricutron.gptk \ ${INSTALL}/usr/config/emuelec/configs/gptokeyb/oricutron.gptk 2>/dev/null || : } ================================================ FILE: packages/sx05re/emulators/oricutron/scripts/oricutronstart.sh ================================================ #!/bin/bash . /etc/profile ROM="$1" CONFIG_DIR="/storage/.config/emuelec/configs/oricutron" DEFAULT_DIR="/usr/config/emuelec/configs/oricutron" # Default GPTK GPTK_DEFAULT="/storage/.config/emuelec/configs/gptokeyb/oricutron.gptk" # Per-ROM GPTK directory (optional) GPTK_PERROM_DIR="/storage/.config/emuelec/configs/gptokeyb/oric" mkdir -p "${CONFIG_DIR}" mkdir -p "${GPTK_PERROM_DIR}" if [ ! -f "${CONFIG_DIR}/oricutron.cfg" ]; then cp -f "${DEFAULT_DIR}/oricutron.cfg" "${CONFIG_DIR}/oricutron.cfg" 2>/dev/null || : fi [ -d "${CONFIG_DIR}/roms" ] || cp -r "${DEFAULT_DIR}/roms" "${CONFIG_DIR}/" 2>/dev/null || : [ -d "${CONFIG_DIR}/images" ] || cp -r "${DEFAULT_DIR}/images" "${CONFIG_DIR}/" 2>/dev/null || : mkdir -p "${CONFIG_DIR}"/{disks,tapes} if [[ -n "${ROM}" && "${ROM}" != /* ]]; then ROM="$(pwd)/${ROM}" fi # Pick GPTK config: per-ROM if present, otherwise default GPTK_CFG="" if [ -n "${ROM}" ] && [ -e "${ROM}" ]; then ROM_BASENAME="$(basename -- "${ROM}")" ROM_STEM="${ROM_BASENAME%.*}" # Prefer exact stem match if [ -f "${GPTK_PERROM_DIR}/${ROM_STEM}.gptk" ]; then GPTK_CFG="${GPTK_PERROM_DIR}/${ROM_STEM}.gptk" # Fallback: sanitize to avoid problems with weird chars in filenames else ROM_SAFE="$(printf '%s' "${ROM_STEM}" | sed 's/[^A-Za-z0-9._-]/_/g')" if [ -f "${GPTK_PERROM_DIR}/${ROM_SAFE}.gptk" ]; then GPTK_CFG="${GPTK_PERROM_DIR}/${ROM_SAFE}.gptk" fi fi fi # If no per-ROM cfg found, use default if [ -z "${GPTK_CFG}" ] && [ -f "${GPTK_DEFAULT}" ]; then GPTK_CFG="${GPTK_DEFAULT}" fi TMP_DIR="/tmp/oricutron_$$" mkdir -p "${TMP_DIR}" cp -f /usr/bin/oricutron "${TMP_DIR}/oricutron" || exit 1 chmod +x "${TMP_DIR}/oricutron" ln -sf "${CONFIG_DIR}/roms" "${TMP_DIR}/roms" ln -sf "${CONFIG_DIR}/images" "${TMP_DIR}/images" ln -sf "${CONFIG_DIR}/disks" "${TMP_DIR}/disks" ln -sf "${CONFIG_DIR}/tapes" "${TMP_DIR}/tapes" cp -f "${CONFIG_DIR}/oricutron.cfg" "${TMP_DIR}/oricutron.cfg" 2>/dev/null || : cd "${TMP_DIR}" || exit 1 GPTK_PID="" if [ -n "${GPTK_CFG}" ] && [ -f "${GPTK_CFG}" ]; then gptokeyb "./oricutron" -c "${GPTK_CFG}" & GPTK_PID=$! fi if [ -n "${ROM}" ]; then ./oricutron "${ROM}" else ./oricutron fi [ -n "${GPTK_PID}" ] && kill "${GPTK_PID}" 2>/dev/null cp -f "${TMP_DIR}/oricutron.cfg" "${CONFIG_DIR}/oricutron.cfg" 2>/dev/null || : sync cd / rm -rf "${TMP_DIR}" exit 0 ================================================ FILE: packages/sx05re/emulators/picodrivesa/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="picodrivesa" PKG_VERSION="3cd193ed1c7a2ffa94e69334367c64c136de0c7d" PKG_REV="1" PKG_LICENSE="GPL2" PKG_SITE="https://github.com/irixxxx/picodrive" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_SHORTDESC="A multi-platform Atari 2600 Emulator" PKG_TOOLCHAIN="configure" GET_HANDLER_SUPPORT="git" pre_configure_target() { TARGET_CONFIGURE_OPTS=" --platform=generic" cd ${PKG_BUILD} } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin/skin cp -rf ${PKG_BUILD}/PicoDrive ${INSTALL}/usr/bin cp -rf ${PKG_BUILD}/skin/* ${INSTALL}/usr/bin/skin/ } ================================================ FILE: packages/sx05re/emulators/scummvmsa/bin/scummvm.start ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile CONFIG_DIR="/storage/.config/scummvm" ROM_DIR="/storage/roms/scummvm" TMP_DIR="/tmp/scummvm" GAME="$(echo $2 | sed 's=.*/==;s/\.[^.]*$//')" RATMPCONF="/storage/.config/retroarch/retroarch.cfg" create_svm(){ mkdir -p ${TMP_DIR} scummvm --list-targets | tail -n +3 | cut -d " " -f 1 | while read line; do id=($line); [[ -f "${TMP_DIR}/${id}.scummvm" ]] && rm "${TMP_DIR}/${id}.scummvm" touch "${TMP_DIR}/${id}.scummvm" SVMPATH=$(cat ${CONFIG_DIR}/scummvm.ini | sed -n "/\[$id\]/,/\[/p" | grep path= | sed "s|path=||") echo "-p \"${SVMPATH}\" ${id}" > "${TMP_DIR}/${id}.scummvm" echo "${id} has been added with the path $SVMPATH to ${ROM_DIR}/${id}.scummvm" done cp -rf ${TMP_DIR}/*.scummvm ${ROM_DIR} rm -rf ${TMP_DIR} } if [ ! -d "${CONFIG_DIR}" ]; then mkdir -p ${CONFIG_DIR} cp -rf /usr/config/scummvm/* $CONFIG_DIR/ fi if [ ! -d "${ROM_DIR}" ]; then mkdir -p ${ROM_DIR} fi if [ -d "/storage/.config/scummvm/extra" ]; then EXTRA="--extrapath=/storage/.config/scummvm/extra" fi case $1 in "sa") set_audio "fluidsynth" scummvm --fullscreen --joystick=0 $EXTRA "${GAME}" set_audio "pulseaudio" ;; "libretro") retroarch -L /tmp/cores/scummvm_libretro.so --config ${RATMPCONF} "${GAME}" ;; "add") scummvm --add --path="/storage/roms/scummvm" --recursive mkdir -p /storage/roms/bios/ cp ${CONFIG_DIR}/scummvm.ini /storage/roms/bios/scummvm.ini ;; "create") create_svm ;; esac ================================================ FILE: packages/sx05re/emulators/scummvmsa/config/scummvm.ini ================================================ [scummvm] gui_browser_show_hidden=true browser_lastpath=/storage/roms/scummvm gm_device=fluidsynth fullscreen=true soundfont=/storage/.config/fluidsynth/soundfonts/GeneralUser.sf2 fluidsynth_chorus_speed=30 fluidsynth_chorus_depth=80 fluidsynth_reverb_roomsize=20 fluidsynth_reverb_activate=true fluidsynth_reverb_damping=0 fluidsynth_reverb_width=1 fluidsynth_misc_interpolation=4th fluidsynth_chorus_waveform=sine fluidsynth_reverb_level=90 fluidsynth_chorus_nr=3 fluidsynth_chorus_level=100 fluidsynth_chorus_activate=true ================================================ FILE: packages/sx05re/emulators/scummvmsa/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="scummvmsa" PKG_VERSION="0d62e946497ec9fc432750734e94a7333db0963c" PKG_SHA256="475c50fc5af385db6a0f42db9b051abb871f2c3c6d36822f036803facd5b75a3" PKG_REV="1" PKG_LICENSE="GPL2" PKG_SITE="https://github.com/scummvm/scummvm" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_net freetype fluidsynth-git libmad timidity" PKG_SHORTDESC="Script Creation Utility for Maniac Mansion Virtual Machine" PKG_LONGDESC="ScummVM is a program which allows you to run certain classic graphical point-and-click adventure games, provided you already have their data files." pre_configure_target() { cd ${PKG_BUILD} TARGET_CONFIGURE_OPTS="--disable-opengl-game \ --disable-opengl-game-classic \ --disable-opengl-game-shaders \ --host=${TARGET_NAME} \ --backend=sdl \ --enable-vkeybd \ --enable-optimizations \ --opengl-mode=gles2 \ --with-sdl-prefix=${SYSROOT_PREFIX}/usr \ --disable-debug \ --enable-release \ --enable-engine=xeen \ --enable-engine=mm \ --enable-engine=adl,testbed,scumm,scumm_7_8,grim,monkey4,mohawk,myst,riven,sci32,agos2,sword2,drascula,sky,lure,queen,testbed,director,stark \ --prefix=/usr/local" } configure_target() { cd ${PKG_BUILD} ./configure ${TARGET_CONFIGURE_OPTS} } make_target() { cd ${PKG_BUILD} make ${PKG_MAKE_OPTS_TARGET} V=1 } post_makeinstall_target() { mkdir -p ${INSTALL}/usr/config/scummvm/extra cp -rf ${PKG_DIR}/config/* ${INSTALL}/usr/config/scummvm/ cp -rf ${PKG_BUILD}/backends/vkeybd/packs/*.zip ${INSTALL}/usr/config/scummvm/extra mv ${INSTALL}/usr/local/bin ${INSTALL}/usr/ cp -rf ${PKG_DIR}/bin/* ${INSTALL}/usr/bin for i in metainfo pixmaps appdata applications doc icons man; do rm -rf "${INSTALL}/usr/local/share/${i}" done } ================================================ FILE: packages/sx05re/emulators/simcoupe/config/simcoupe.gptk ================================================ # Simcoupe gptokeyb configuration. # I N S T R U C T I O N S : # # If you have a game with special keys (for example A for UP, Z for down etc.), change the mapping table beneath accordingly # # Then SAVE this file under the game's name. For Example: Prince of Persia.gptk # # The correct filepath for the game-gptk file is: /storage/.config/emuelec/configs/gptokeyb/simcoupe # # For example: /storage/.config/emuelec/configs/gptokeyb/simcoupe/Prince of Persia.gptk # # Simcoupe will automatically load the respective gptk file when starting the game. # # If no gptk file is found, the emulator will always use "simcoupe.gptk" in /storage/.config/emuelec/configs/gptokeyb/ #---------------------------------------------------------------------------------------------------------------------------- back = esc start = enter select = a = enter b = space x = space y = esc l1 = f10 l2 = r1 = r2 = up = up down = down left = left right = right left_analog_left = left left_analog_right = right left_analog_up = up left_analog_down = down ================================================ FILE: packages/sx05re/emulators/simcoupe/package.mk ================================================ PKG_NAME="simcoupe" PKG_VERSION="1.2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/simonowen/simcoupe" PKG_URL="$PKG_SITE/archive/refs/heads/master.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2 zlib libpng" PKG_PRIORITY="optional" PKG_SECTION="emuelec/emulators" PKG_SHORTDESC="SimCoupe - SAM Coupe emulator" PKG_LONGDESC="SimCoupe is a SAM Coupe emulator for various platforms" PKG_TOOLCHAIN="cmake" pre_configure_target() { PKG_CMAKE_OPTS_TARGET="-DCMAKE_BUILD_TYPE=Release" } makeinstall_target() { # Binary + Wrapper mkdir -p ${INSTALL}/usr/bin cp -f $PKG_BUILD/.$TARGET_NAME/simcoupe ${INSTALL}/usr/bin/simcoupe chmod +x ${INSTALL}/usr/bin/simcoupe cp -f ${PKG_DIR}/scripts/simcoupestart.sh ${INSTALL}/usr/bin/simcoupestart.sh chmod +x ${INSTALL}/usr/bin/simcoupestart.sh # SAASound mkdir -p ${INSTALL}/usr/lib cp -f $PKG_BUILD/.$TARGET_NAME/_deps/saasound-build/libSAASound.so* ${INSTALL}/usr/lib/ 2>/dev/null || : # ROM resources mkdir -p ${INSTALL}/usr/share/simcoupe cp -f $PKG_BUILD/Resource/*.rom ${INSTALL}/usr/share/simcoupe/ 2>/dev/null || : cp -f $PKG_BUILD/Resource/*.zx82 ${INSTALL}/usr/share/simcoupe/ 2>/dev/null || : cp -f $PKG_BUILD/Resource/*.bin ${INSTALL}/usr/share/simcoupe/ 2>/dev/null || : # GPTK file if [ -f "${PKG_DIR}/config/simcoupe.gptk" ]; then mkdir -p ${INSTALL}/usr/config/emuelec/configs/gptokeyb cp -f "${PKG_DIR}/config/simcoupe.gptk" \ "${INSTALL}/usr/config/emuelec/configs/gptokeyb/simcoupe.gptk" fi } ================================================ FILE: packages/sx05re/emulators/simcoupe/scripts/simcoupestart.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present EmuELEC (https://github.com/EmuELEC) . /etc/profile ROM="$1" ROMNAME="${ROM##*/}" ROMBASE="${ROMNAME%.*}" # Kill old instances killall -9 gptokeyb 2>/dev/null # Check for game-specific gptk config GPTK_GAME="/storage/.config/emuelec/configs/gptokeyb/simcoupe/${ROMBASE}.gptk" GPTK_DEFAULT="/emuelec/configs/gptokeyb/simcoupe.gptk" if [ -f "$GPTK_GAME" ]; then GPTK_CONFIG="$GPTK_GAME" else GPTK_CONFIG="$GPTK_DEFAULT" fi # Start gptokeyb with selected config gptokeyb 1 simcoupe -c "$GPTK_CONFIG" & # Wait for gptokeyb to initialize sleep 1 # Launch SimCoupe /usr/bin/simcoupe -rom /storage/roms/bios/samcoupe.rom -fullscreen -disk1 "$ROM" -autoboot # Cleanup killall -9 gptokeyb ================================================ FILE: packages/sx05re/emulators/solarus/config/pads.ini ================================================ down=hat 0 down item2=button 3 attack=button 0 pause=button 7 right=hat 0 right action=button 1 item1=button 2 up=hat 0 up left=hat 0 left ================================================ FILE: packages/sx05re/emulators/solarus/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="solarus" PKG_VERSION="cc580fb399f720e241754ecc7817ce5d551d74d0" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://gitlab.com/solarus-games/solarus" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain luajit glm libmodplug physfs SDL2 SDL2_ttf" PKG_SHORTDESC="Action-RPG/Adventure 2D game engine" PKG_TOOLCHAIN="cmake" GET_HANDLER_SUPPORT="git" pre_configure_target() { export LDFLAGS+=" -ldl" PKG_CMAKE_OPTS_TARGET="-DSOLARUS_GL_ES=ON -DSOLARUS_GUI=OFF -DSOLARUS_USE_LUAJIT=ON -DSOLARUS_TESTS=OFF" } pre_makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/solarus cp ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/solarus } ================================================ FILE: packages/sx05re/emulators/solarus/patches/solarus-001-addFindOpenGles2.patch ================================================ From 2bf0e98f17d92fd86ee61be179e3cebe93f75ea7 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Sun, 3 Jan 2021 12:38:13 +0000 Subject: [PATCH] Add a basic FindOpenGLES2.cmake Fixes #1324 --- cmake/modules/FindOpenGLES2.cmake | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 cmake/modules/FindOpenGLES2.cmake diff --git a/cmake/modules/FindOpenGLES2.cmake b/cmake/modules/FindOpenGLES2.cmake new file mode 100644 index 000000000..70fd5e6f0 --- /dev/null +++ b/cmake/modules/FindOpenGLES2.cmake @@ -0,0 +1,28 @@ +# Try to find OpenGLES2. Once done this will define: +# OPENGLES2_FOUND +# OPENGLES2_INCLUDE_DIRS +# OPENGLES2_LIBRARIES +# OPENGLES2_DEFINITIONS + +find_package(PkgConfig QUIET) + +pkg_check_modules(PC_OPENGLES2 glesv2) + +if (PC_OPENGLES2_FOUND) + set(OPENGLES2_DEFINITIONS ${PC_OPENGLES2_CFLAGS_OTHER}) +endif () + +find_path(OPENGLES2_INCLUDE_DIRS NAMES GLES2/gl2.h + HINTS ${PC_OPENGLES2_INCLUDEDIR} ${PC_OPENGLES2_INCLUDE_DIRS} +) + +set(OPENGLES2_NAMES ${OPENGLES2_NAMES} glesv2 GLESv2) +find_library(OPENGLES2_LIBRARIES NAMES ${OPENGLES2_NAMES} + HINTS ${PC_OPENGLES2_LIBDIR} ${PC_OPENGLES2_LIBRARY_DIRS} +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OpenGLES2 REQUIRED_VARS OPENGLES2_INCLUDE_DIRS OPENGLES2_LIBRARIES + FOUND_VAR OPENGLES2_FOUND) + +mark_as_advanced(OPENGLES2_INCLUDE_DIRS OPENGLES2_LIBRARIES) -- 2.27.0 ================================================ FILE: packages/sx05re/emulators/solarus/patches/solarus-002-pad.patch ================================================ diff --git a/include/solarus/core/Savegame.h b/include/solarus/core/Savegame.h index 910d99f..8177ad1 100644 --- a/include/solarus/core/Savegame.h +++ b/include/solarus/core/Savegame.h @@ -108,6 +108,7 @@ class SOLARUS_API Savegame: public ExportableToLua { bool is_set(const std::string& key) const; void unset(const std::string& key); + bool loadPadFromIni(); void set_initial_values(); void set_default_keyboard_controls(); void set_default_joypad_controls(); diff --git a/src/core/Savegame.cpp b/src/core/Savegame.cpp index 29ef124..d6ca5bb 100644 --- a/src/core/Savegame.cpp +++ b/src/core/Savegame.cpp @@ -95,6 +95,47 @@ Savegame::Savegame(MainLoop& main_loop, const std::string& file_name): // at this point, but is needed by initialize() when calling item scripts. } +#define MAX_BUFFER_LEN 512 + +bool Savegame::loadPadFromIni() { + FILE *handle = NULL; + char path[MAX_BUFFER_LEN] = { "" }; + + strcpy(path, "/emuelec/configs/solarus/pads.ini"); + handle = fopen(path, "rb"); + + if (handle != NULL) { + char line[1024] = ""; + + while (fgets(line, 1024, handle)) { + strtok(line, "\n"); + + char* pch = strstr(line, "="); + if (pch != NULL) { + char key[1024] = ""; + char value[1024] = ""; + + strncpy(key, line, pch - line); + strcpy(value, pch + 1); + + if (strcmp(key, "action") == 0) set_string(KEY_JOYPAD_ACTION, value); + if (strcmp(key, "attack") == 0) set_string(KEY_JOYPAD_ATTACK, value); + if (strcmp(key, "item1" ) == 0) set_string(KEY_JOYPAD_ITEM_1, value); + if (strcmp(key, "item2" ) == 0) set_string(KEY_JOYPAD_ITEM_2, value); + if (strcmp(key, "pause" ) == 0) set_string(KEY_JOYPAD_PAUSE, value); + if (strcmp(key, "right" ) == 0) set_string(KEY_JOYPAD_RIGHT, value); + if (strcmp(key, "up" ) == 0) set_string(KEY_JOYPAD_UP, value); + if (strcmp(key, "left" ) == 0) set_string(KEY_JOYPAD_LEFT, value); + if (strcmp(key, "down" ) == 0) set_string(KEY_JOYPAD_DOWN, value); + } + } + + fclose(handle); + return true; + } + return false; +} + /** * \brief Initializes the data from the file or from initial values if the file * does not exist. @@ -120,6 +161,8 @@ void Savegame::initialize() { import_from_file(); } + loadPadFromIni(); // set batocera pad config + get_equipment().load_items(); } ================================================ FILE: packages/sx05re/emulators/solarus/patches/solarus-003-dirs.patch ================================================ diff --git a/cmake/AddDefines.cmake b/cmake/AddDefines.cmake index 6330da7..35e80e3 100644 --- a/cmake/AddDefines.cmake +++ b/cmake/AddDefines.cmake @@ -8,16 +8,14 @@ endif() # Base directory where to write files. # If blank it will be set depending on the OS (typically the user's home directory). -set(SOLARUS_BASE_WRITE_DIR "" CACHE STRING "Base directory where to write files, if blank it will be set depending on the OS (typically the user's home directory).") -if(SOLARUS_BASE_WRITE_DIR) - add_definitions(-DSOLARUS_BASE_WRITE_DIR=\"${SOLARUS_BASE_WRITE_DIR}\") -endif() +set(SOLARUS_BASE_WRITE_DIR "/emuelec/configs/solarus/saves" CACHE STRING "Base directory where to write files, if blank it will be set depending on the OS (typically the user's home directory).") +add_definitions(-DSOLARUS_BASE_WRITE_DIR=\"${SOLARUS_BASE_WRITE_DIR}\") # Directory where to write savegames and other files saved by quests. if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(SOLARUS_INITIAL_WRITE_DIR "Solarus") else() - set(SOLARUS_INITIAL_WRITE_DIR ".solarus") + set(SOLARUS_INITIAL_WRITE_DIR "solarus") endif() set(SOLARUS_WRITE_DIR ${SOLARUS_INITIAL_WRITE_DIR} CACHE STRING "Directory where Solarus savegames are stored, relative to the base write directory.") if(SOLARUS_WRITE_DIR) ================================================ FILE: packages/sx05re/emulators/solarus/scripts/solarus.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile [[ ! -d "/emuelec/configs/solarus/saves/" ]] && mkdir -p "/emuelec/configs/solarus/saves/" if [ "${EE_DEVICE}" == "OdroidGoAdvance" ] || ["${EE_DEVICE}" == "Amlogic-ng" ] || [ "${EE_DEVICE}" == "GameForce" ]; then gptokeyb -c /emuelec/configs/gptokeyb/solarus-run.gptk & SDL_GAMECONTROLLERCONFIG_FILE="" solarus-run -fullscreen=yes ${1} killall gptokeyb else solarus-run -fullscreen=yes ${1} fi exit 0 ================================================ FILE: packages/sx05re/emulators/stellasa/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="stellasa" PKG_VERSION="14df3bc79a43bba078645be4f7c5b0556e5d9a9b" PKG_SHA256="2b8cc59a9f8d168c04363926804b1bbb8f65e86946a62ec1ce3de07edbf17a90" PKG_REV="1" PKG_LICENSE="GPL2" PKG_SITE="https://github.com/stella-emu/stella" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_SHORTDESC="A multi-platform Atari 2600 Emulator" PKG_TOOLCHAIN="configure" pre_configure_target() { TARGET_CONFIGURE_OPTS="--host=${TARGET_NAME} --with-sdl-prefix=${SYSROOT_PREFIX}/usr/bin --disable-windowed" } make_target() { cd ${PKG_BUILD} mv ${PKG_BUILD}/.${TARGET_NAME}/* ${PKG_BUILD} make } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -rf ${PKG_BUILD}/stella ${INSTALL}/usr/bin cp -rf ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emulators/stellasa/scripts/stella.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) export SDL_AUDIODRIVER=alsa /usr/bin/stella "${1}" ================================================ FILE: packages/sx05re/emulators/sundog/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="sundog" PKG_VERSION="e4b1823ea832aea7aca27e94968665be615c8468" PKG_SHA256="5449cdb241a6c2a464fdd42cb8723bc87d1afbeb2f4f1ba3ae0d2d00645d3855" PKG_ARCH="any" PKG_SITE="https://github.com/laanwj/sundog" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_LONGDESC="A port of the Atari ST game SunDog: Frozen Legacy (1984) by FTL software " PKG_TOOLCHAIN="make" pre_configure_target() { cd src PKG_MAKE_OPTS_TARGET=" -C ${PKG_BUILD}/src sundog" sed -i "s|sdl2-config|${SYSROOT_PREFIX}/usr/bin/sdl2-config|g" Makefile sed -i "s|-lreadline|-lreadline -lncurses|g" Makefile } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/src/sundog ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/emulators/ti99sim/package.mk ================================================ PKG_NAME="ti99sim" PKG_VERSION="0.16.0" PKG_SHA256="14bd72f372fe1a253c3a25bca579d29b5c3e47aff2f22622188dc4023576b159" PKG_LICENSE="GPL-3.0" PKG_SITE="https://www.mrousseau.org/programs/ti99sim/" PKG_URL="https://www.mrousseau.org/programs/ti99sim/archives/ti99sim-${PKG_VERSION}.src.tar.xz" PKG_DEPENDS_TARGET="toolchain SDL2 openssl" PKG_LONGDESC="TI-99/4A Emulator" PKG_TOOLCHAIN="make" pre_configure_target() { sed -i 's/-march=aarch64/-march=armv8-a/g; s/-march=$(ARCH)/-march=armv8-a/g' "$PKG_BUILD/rules.mak" 2>/dev/null || true f="$PKG_BUILD/src/core/device-support.cpp" grep -q '^#include ' "$f" 2>/dev/null || sed -i '/^#include "cf7+\.hpp"$/a #include ' "$f" } pre_make_target() { make -C "$PKG_BUILD/src/core" CC="$CC" CXX="$CXX" AR="$AR"; } make_target() { make -C "$PKG_BUILD/src/sdl" CC="$CC" CXX="$CXX" SDL2=1; } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/bin/ti99sim-sdl ${INSTALL}/usr/bin/ti99sim-sdl chmod +x ${INSTALL}/usr/bin/ti99sim-sdl cp ${PKG_DIR}/scripts/ti99sdlstart.sh ${INSTALL}/usr/bin/ti99sdlstart.sh chmod +x ${INSTALL}/usr/bin/ti99sdlstart.sh } ================================================ FILE: packages/sx05re/emulators/ti99sim/scripts/ti99sdlstart.sh ================================================ #!/bin/bash . /etc/profile ROM="${1}" /usr/bin/ti99sim-sdl --fullscreen --console=/storage/roms/bios/ti-994a.ctg "${ROM}" ================================================ FILE: packages/sx05re/emulators/vector06sdl/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="vector06sdl" PKG_VERSION="5cbd54023df430446e283cb874cac36d71359d73" PKG_SHA256="553b018d9a45dc7fb7558583ddf7db12481c29b8ed00a56b22ef41df165ff65a" PKG_LICENSE="GPL" PKG_SITE="https://github.com/svofski/vector06sdl" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain freetype slang alsa" PKG_LONGDESC="Opensource Vector-06C emulator in C++" pre_configure_target() { PKG_CMAKE_OPTS_TARGET="-DCMAKE_SYSTEM_PROCESSOR=arm -DSDL2_LIBRARY=${SYSROOT_PREFIX}/usr/lib/libSDL2.so -DSDL2_IMAGE_LIBRARY=${SYSROOT_PREFIX}/usr/lib/libSDL2_image.so" #PKG_CONFIGURE_OPTS_TARGET=" --disable-pulseaudio --disable-esd --disable-video-mir --disable-video-wayland --disable-video-x11 --disable-video-opengl" } ================================================ FILE: packages/sx05re/emulators/vector06sdl/patches/patch.patch ================================================ --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ message("CMAKE_SYSTEM_NAME is ${CMAKE_SYSTEM_NAME}") add_definitions(-Wall) -add_definitions(-std=gnu++14) +add_definitions(-std=gnu++17) add_definitions(-fpermissive) add_definitions(-O3) #add_definitions(-Rpass=loop-vectorize) @@ -45,6 +45,9 @@ message("Assuming this is Linux on Raspberry Pi") set(BFDNAME -O elf32-littlearm -B arm) add_definitions(-mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a53 -funsafe-math-optimizations -ftree-vectorize -ftree-vectorizer-verbose=2 -fopt-info-vec) + elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64") + message("Assuming this is aarch64") + add_definitions(-mcpu=cortex-a53 -funsafe-math-optimizations -ftree-vectorize -ftree-vectorizer-verbose=2 -fopt-info-vec) else() message("Looks like it's a desktop Linux on amd64, will use xxd") set(USE_XXD true) @@ -158,7 +161,7 @@ target_link_libraries(v06x ${BOOT_O} ${EXTRA_LIBS}) -set(TEST_SOURCE_FILES test/tests.cpp) +#set(TEST_SOURCE_FILES test/tests.cpp) include_directories(src) -add_executable(tests ${TEST_SOURCE_FILES} boots.o) +#add_executable(tests ${TEST_SOURCE_FILES} boots.o) ================================================ FILE: packages/sx05re/emulators/viceSA/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="viceSA" PKG_VERSION="3.3" PKG_SHA256="1a55b38cc988165b077808c07c52a779d181270b28c14b5c9abf4e569137431d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL2" PKG_SITE="https://freefr.dl.sourceforge.net/project/vice-emu/releases" PKG_URL="${PKG_SITE}/vice-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_mixer SDL2_ttf xa:host ffmpeg" PKG_LONGDESC="VICE is an emulator collection which emulates the C64, the C64-DTV, the C128, the VIC20, practically all PET models, the PLUS4 and the CBM-II (aka C610)." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET=" --enable-external-ffmpeg --disable-option-checking --enable-midi --enable-lame --with-zlib --with-jpeg --with-png --enable-x64" pre_configure_target() { LDFLAGS="${LDFLAGS} -lSDL2" } ================================================ FILE: packages/sx05re/emulators/viceSA/patches/viceSA-001-no-docs.patch ================================================ --- a/Makefile.am +++ b/Makefile.am @@ -6,7 +6,7 @@ # Process this file with automake to produce Makefile.in -SUBDIRS = src build data man doc +SUBDIRS = src build data # COMMON_EXTRA_DIST is what used to be the EXTRA_DIST, when adding dist # files, please add them to the COMMON_EXTRA_DIST list. ================================================ FILE: packages/sx05re/emulators/viceSA/xa/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="xa" PKG_VERSION="2.3.10" PKG_SHA256="867b5b26b6524be8bcfbad8820ab3efe422b3e0cc9775dcb743284778868ba78" PKG_ARCH="any" PKG_LICENSE="GPL2" PKG_SITE="https://www.floodgap.com/retrotech/xa/dists" PKG_URL="${PKG_SITE}/xa-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="ccache:host" PKG_LONGDESC="xa is a high-speed, two-pass portable cross-assembler. It understands mnemonics and generates code for NMOS 6502s (such as 6502A, 6504, 6507, 6510, 7501, 8500, 8501, 8502 ...), CMOS 6502s (65C02 and Rockwell R65C02) and the 65816. " makeinstall_host() { cp xa ${TOOLCHAIN}/bin/ } ================================================ FILE: packages/sx05re/emulators/x16/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2025-present Team EmuELEC (https://github.com/EmuELEC) PKG_NAME="x16" PKG_VERSION="r49" PKG_SHA256="" PKG_LICENSE="BSD-2-Clause" PKG_SITE="https://github.com/X16Community/x16-emulator" PKG_URL="https://github.com/X16Community/x16-emulator/releases/download/${PKG_VERSION}/x16emu_linux-aarch64-${PKG_VERSION}.zip" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_LONGDESC="Emulator for the Commander X16 8-bit computer" PKG_TOOLCHAIN="manual" unpack() { mkdir -p ${PKG_BUILD} unzip -o ${SOURCES}/${PKG_NAME}/${PKG_SOURCE_NAME} -d ${PKG_BUILD}/ } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/share/x16-emulator install -m 0755 ${PKG_BUILD}/x16emu ${INSTALL}/usr/bin/ if [ -f ${PKG_BUILD}/rom.bin ]; then install -m 0644 ${PKG_BUILD}/rom.bin ${INSTALL}/usr/share/x16-emulator/ fi if [ -f ${PKG_BUILD}/sdcard.img ]; then install -m 0644 ${PKG_BUILD}/sdcard.img ${INSTALL}/usr/share/x16-emulator/ fi install -m 0755 ${PKG_DIR}/scripts/x16emustart.sh ${INSTALL}/usr/bin/ } ================================================ FILE: packages/sx05re/emulators/x16/scripts/x16emustart.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Wrapper-script for X16emu # Copyright (C) 2025-present worstcase_scenario (https://github.com/worstcase-scenario) SYSTEM_ROM="/usr/share/x16-emulator/rom.bin" USER_ROM="/storage/roms/x16/rom.bin" EMU_BIN="/usr/bin/x16emu" if [ -f "${USER_ROM}" ]; then ROM="${USER_ROM}" elif [ -f "${SYSTEM_ROM}" ]; then ROM="${SYSTEM_ROM}" else echo "ERROR: No rom.bin found!" exit 1 fi ARGS=(-rom "${ROM}" -fullscreen -quality best -scale 2 -joy1 -joy2 -joy3 -joy4) if [ -n "$1" ]; then FILE="$1" EXT="${FILE##*.}" case "${EXT,,}" in prg|bas) GAME_DIR="$(dirname -- "${FILE}")" GAME_BASE="$(basename -- "${FILE}")" cd "${GAME_DIR}" || exit 1 ;; esac case "${EXT,,}" in prg) ARGS+=(-prg "${GAME_BASE}" -run) ;; bas) ARGS+=(-bas "${GAME_BASE}" -run) ;; img) ARGS+=(-sdcard "${FILE}") ;; crt) ARGS+=(-cart "${FILE}") ;; esac fi exec "${EMU_BIN}" "${ARGS[@]}" ================================================ FILE: packages/sx05re/emulators/xroar/config/xroar.gptk ================================================ # XROAR gptokeyb configuration. # I N S T R U C T I O N S : # # If you have a game with special keys (for example A for UP, Z for down etc.), change the mapping table beneath accordingly. # # Then SAVE that modified file under the game's name. For Example: Chuckie Egg Plus (1983)(Burgin, Paul).gptk # # The correct filepath for the game-gptk file is: /storage/.config/emuelec/configs/xroar/gptk # # For example: /storage/.config/emuelec/configs/xroar/gptk/Chuckie Egg Plus (1983)(Burgin, Paul).gptk # # XROAR will automatically load the respective gptk file when starting the game. # If no gptk file is found, the emulator will always use "xroar.gptk" in /storage/.config/emuelec/configs/xroar/gptk # #----------------------------------------------------------------------------------------------------------------------- # # Controller buttons -> keyboard keys back = esc start = enter a = enter b = space x = 1 y = 2 # Shoulders/triggers/sticks -> keyboard keys (choose what you want) l1 = y l2 = n l3 = x r1 = a r2 = z r3 = c # D-pad -> cursor keys up = up down = down left = left right = right # Left analog as alternative to D-pad left_analog_up = up left_analog_down = down left_analog_left = left left_analog_right = right ================================================ FILE: packages/sx05re/emulators/xroar/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later PKG_NAME="xroar" PKG_VERSION="2025-07-16" PKG_SHA256="25731a74cc9d5888b318c7b6be2dcf981b37cc95138e3dcf4c4d91402544faea" PKG_ARCH="aarch64" PKG_LICENSE="GPL-3.0-or-later" PKG_SITE="https://github.com/PortsMaster/PortMaster-New" PKG_URL="https://github.com/PortsMaster/PortMaster-New/releases/download/2025-07-16_2108/xroar.zip" PKG_SOURCE_NAME="xroar.zip" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="emuelec/emulators" PKG_SHORTDESC="XRoar - Dragon/CoCo Emulator" PKG_TOOLCHAIN="manual" unpack() { mkdir -p ${PKG_BUILD} unzip -q ${SOURCES}/${PKG_NAME}/${PKG_SOURCE_NAME} -d ${PKG_BUILD} if [ -d "${PKG_BUILD}/xroar" ]; then mv ${PKG_BUILD}/xroar/* ${PKG_BUILD}/ rmdir ${PKG_BUILD}/xroar fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/xroar.aarch64 ${INSTALL}/usr/bin/xroar.aarch64 chmod +x ${INSTALL}/usr/bin/xroar.aarch64 cp ${PKG_DIR}/scripts/xroar.sh ${INSTALL}/usr/bin/xroar.sh chmod +x ${INSTALL}/usr/bin/xroar.sh mkdir -p ${INSTALL}/usr/config/emuelec/configs/xroar cp -r ${PKG_BUILD}/libs.aarch64 ${INSTALL}/usr/config/emuelec/configs/xroar/ cp -r ${PKG_BUILD}/gptk ${INSTALL}/usr/config/emuelec/configs/xroar/ cp ${PKG_BUILD}/xroar.conf ${INSTALL}/usr/config/emuelec/configs/xroar/ cp -r ${PKG_BUILD}/fonts ${INSTALL}/usr/config/emuelec/configs/xroar/ if [ -f "${PKG_DIR}/config/xroar.gptk" ]; then mkdir -p ${INSTALL}/usr/config/emuelec/configs/xroar/gptk cp -f "${PKG_DIR}/config/xroar.gptk" \ "${INSTALL}/usr/config/emuelec/configs/xroar/gptk/xroar.gptk" fi } ================================================ FILE: packages/sx05re/emulators/xroar/scripts/xroar.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present EmuELEC (https://github.com/EmuELEC) . /etc/profile ROM="$1" ROMNAME="${ROM##*/}" ROMBASE="${ROMNAME%.*}" # Asset directory setup ASSETDIR="/usr/config/emuelec/configs/xroar" export LD_LIBRARY_PATH="${ASSETDIR}/libs.aarch64:${LD_LIBRARY_PATH}" # Determine machine type based on ROM path case "$ROM" in */dragon32/*) MACHINE="dragon32" ;; */dragon64/*) MACHINE="dragon64" ;; */coco/*) MACHINE="coco" ;; */coco3/*) MACHINE="coco3" ;; */mc10/*) MACHINE="mc10" ;; *) MACHINE="dragon64" ;; esac # Kill old instances killall -9 gptokeyb 2>/dev/null # Check for game-specific gptk config GPTK_GAME="/storage/.config/emuelec/configs/xroar/gptk/${ROMBASE}.gptk" GPTK_DEFAULT="/storage/.config/emuelec/configs/xroar/gptk/xroar.gptk" if [ -f "$GPTK_GAME" ]; then GPTK_CONFIG="$GPTK_GAME" else GPTK_CONFIG="$GPTK_DEFAULT" fi # Start gptokeyb with selected config gptokeyb 1 xroar.aarch64 -c "$GPTK_CONFIG" & # Wait for gptokeyb to initialize sleep 1 # Launch XRoar /usr/bin/xroar.aarch64 -fs -rompath /storage/roms/bios \ -default-machine "$MACHINE" \ -run "$ROM" # Cleanup killall -9 gptokeyb 2>/dev/null ================================================ FILE: packages/sx05re/emulators/yabasanshiroSA_1_11/config/input.cfg ================================================ ================================================ FILE: packages/sx05re/emulators/yabasanshiroSA_1_11/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2022-present 351ELEC # Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) PKG_NAME="yabasanshiroSA_1_11" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/sydarn/yabause" PKG_URL="${PKG_SITE}.git" PKG_VERSION="a40dace1ae0af3ebd45848549fdf396f40e3930f" PKG_GIT_CLONE_BRANCH="pi4-update" PKG_ARCH="aarch64" PKG_DEPENDS_TARGET="toolchain SDL2 boost openal-soft zlib" PKG_LONGDESC="Yabause is a Sega Saturn emulator and took over as Yaba Sanshiro" PKG_TOOLCHAIN="cmake-make" GET_HANDLER_SUPPORT="git" PKG_BUILD_FLAGS="+speed" post_unpack() { # use host versions sed -i "s|COMMAND m68kmake|COMMAND ${PKG_BUILD}/m68kmake_host|" ${PKG_BUILD}/yabause/src/musashi/CMakeLists.txt sed -i "s|COMMAND ./bin2c|COMMAND ${PKG_BUILD}/bin2c_host|" ${PKG_BUILD}/yabause/src/retro_arena/nanogui-sdl/CMakeLists.txt } pre_make_target() { # runs on host so make them manually if package is not crosscompile friendly ${HOST_CC} ${PKG_BUILD}/yabause/src/retro_arena/nanogui-sdl/resources/bin2c.c -o ${PKG_BUILD}/bin2c_host ${HOST_CC} ${PKG_BUILD}/yabause/src/musashi/m68kmake.c -o ${PKG_BUILD}/m68kmake_host } pre_configure_target() { PKG_CMAKE_OPTS_TARGET="${PKG_BUILD}/yabause " #PKG_CMAKE_OPTS_TARGET+=" -DUSE_EGL=OFF -DUSE_OPENGL=ON" case ${ARCH} in aarch64) PKG_CMAKE_OPTS_TARGET+=" -DYAB_WANT_ARM7=OFF \ -DYAB_WANT_DYNAREC_DEVMIYAX=ON \ -DCMAKE_TOOLCHAIN_FILE=${PKG_BUILD}/yabause/src/retro_arena/n2.cmake \ -DYAB_PORTS=retro_arena" ;; esac #PKG_CMAKE_OPTS_TARGET+=" -DCMAKE_SYSTEM_PROCESSOR=x86_64" PKG_CMAKE_OPTS_TARGET+=" -DOPENGL_INCLUDE_DIR=${SYSROOT_PREFIX}/usr/include \ -DOPENGL_opengl_LIBRARY=${SYSROOT_PREFIX}/usr/lib \ -DOPENGL_glx_LIBRARY=${SYSROOT_PREFIX}/usr/lib \ -DLIBPNG_LIB_DIR=${SYSROOT_PREFIX}/usr/lib \ -Dpng_STATIC_LIBRARIES=${SYSROOT_PREFIX}/usr/lib/libpng16.so \ -DCMAKE_BUILD_TYPE=Release" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -a ${PKG_BUILD}/src/retro_arena/yabasanshiro ${INSTALL}/usr/bin cp -a ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/yabasanshiro cp ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/yabasanshiro } ================================================ FILE: packages/sx05re/emulators/yabasanshiroSA_1_11/patches/02-yabasanshiroSA-use-system-libpng.patch ================================================ --- a/yabause/src/retro_arena/CMakeLists.txt 2022-01-05 15:44:20.891135756 -0600 +++ b/yabause/src/retro_arena/CMakeLists.txt 2022-01-05 15:44:41.738849860 -0600 @@ -22,7 +22,7 @@ add_subdirectory(nanogui-sdl) #include( ../glfw/external_zlib.cmake ) -include( ${CMAKE_SOURCE_DIR}/CMake/Packages/external_libpng.cmake ) +#include( ${CMAKE_SOURCE_DIR}/CMake/Packages/external_libpng.cmake ) #------------------------------------------------------------------------------ # nlohmann/json ================================================ FILE: packages/sx05re/emulators/yabasanshiroSA_1_11/patches/04-yabasanshiroSA-use-paths.patch ================================================ diff --git a/yabause/src/retro_arena/InputManager.cpp b/yabause/src/retro_arena/InputManager.cpp index bd806736..c32af4a7 100644 --- a/yabause/src/retro_arena/InputManager.cpp +++ b/yabause/src/retro_arena/InputManager.cpp @@ -213,7 +213,7 @@ int mapKeys( const json & configs ){ if( SDL_NumJoysticks() == 0 ){ - PADLOG("No joy stic is found force to keyboard\n"); + PADLOG("No joystick is found force to keyboard\n"); padbits = PerPadAdd(&PORTDATA1); if( configs.find("player1") == configs.end() ){ return setDefalutSettings(padbits); @@ -460,22 +460,22 @@ int getPlayerJsonFromInputConfig( int joy, InputConfig * inputconfig, json & pla } Input result; - inputconfig->getInputByName("a", &result); + inputconfig->getInputByName("y", &result); player[guid]["a"] ={ { "type", input_types[result.type] },{ "id", result.id },{ "value", result.value } }; inputconfig->getInputByName("b", &result); player[guid]["b"] = { { "type", input_types[result.type] },{ "id", result.id },{ "value", result.value } }; - inputconfig->getInputByName("rightshoulder", &result); + inputconfig->getInputByName("a", &result); player[guid]["c"] = { { "type", input_types[result.type] },{ "id", result.id },{ "value", result.value } } ; inputconfig->getInputByName("x", &result); player[guid]["x"] = { { "type", input_types[result.type] },{ "id", result.id },{ "value", result.value } }; - inputconfig->getInputByName("y", &result); + inputconfig->getInputByName("leftshoulder", &result); player[guid]["y"] = { { "type", input_types[result.type] },{ "id", result.id },{ "value", result.value } }; - inputconfig->getInputByName("leftshoulder", &result); + inputconfig->getInputByName("rightshoulder", &result); player[guid]["z"] = { { "type", input_types[result.type] },{ "id", result.id },{ "value", result.value } }; inputconfig->getInputByName("lefttrigger", &result); @@ -1209,7 +1209,7 @@ void InputManager::writeDeviceConfig(InputConfig* config) std::string InputManager::getConfigPath() { std::string path = getenv("HOME"); - path += "/.emulationstation/es_temporaryinput.cfg"; + path = "/storage/roms/saturn/yabasanshiro/input.cfg"; return path; } diff --git a/yabause/src/retro_arena/Preference.cpp b/yabause/src/retro_arena/Preference.cpp index 1108c843..49815002 100644 --- a/yabause/src/retro_arena/Preference.cpp +++ b/yabause/src/retro_arena/Preference.cpp @@ -17,7 +17,7 @@ Preference::Preference( const std::string & filename ){ } std::string home_dir = getenv("HOME"); - home_dir += "/.yabasanshiro/"; + home_dir = "/storage/.config/yabasanshiro/"; this->filename = home_dir + input_trace_filename + ".config"; diff --git a/yabause/src/retro_arena/main.cpp b/yabause/src/retro_arena/main.cpp index 3b3b581c..dacfee8e 100644 --- a/yabause/src/retro_arena/main.cpp +++ b/yabause/src/retro_arena/main.cpp @@ -290,14 +290,14 @@ int main(int argc, char** argv) // Inisialize home directory std::string home_dir = getenv("HOME"); - home_dir += "/.yabasanshiro/"; + home_dir = "/storage/roms/saturn/yabasanshiro/"; struct stat st = {0}; if (stat(home_dir.c_str(), &st) == -1) { mkdir(home_dir.c_str(), 0700); } - std::string bckup_dir = home_dir + "backup.bin"; + std::string bckup_dir = "/storage/roms/bios/yabasanshiro/backup.bin"; strcpy( buppath, bckup_dir.c_str() ); - strcpy( s_savepath, home_dir.c_str() ); + strcpy( s_savepath, "/storage/roms/savestates/saturn" ); g_keymap_filename = home_dir + "keymapv2.json"; std::string current_exec_name = argv[0]; // Name of the current exec program @@ -601,7 +601,7 @@ int main(int argc, char** argv) if( ret == 0 ){ char pngname[256]; snprintf(pngname,256,"%s/%s_%d.png", s_savepath, cdip->itemnum, e.user.code); - fs::copy(tmpfilename, pngname, fs::copy_options::overwrite_existing ); + system((std::string("cp -f ") + tmpfilename + " " + pngname).c_str()); } hideMenuScreen(); } ================================================ FILE: packages/sx05re/emulators/yabasanshiroSA_1_11/scripts/set_yabasanshiro_joy.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Langerz82 (https://github.com/Langerz82) # Source predefined functions and variables . /etc/profile # Configure ADVMAME players based on ES settings CONFIG_DIR="/storage/roms/saturn/yabasanshiro" CONFIG="${CONFIG_DIR}/keymapv2.json" CONFIG_TMP=/tmp/jc/yabasan.tmp source /usr/bin/joy_common.sh "yabasanshiro" declare -A GC_VALUES=( [h0.1]="1" [h0.4]="4" [h0.8]="8" [h0.2]="2" [b0]="0" [b1]="1" [b2]="2" [b3]="3" [b4]="4" [b5]="5" [b6]="6" [b7]="7" [b8]="8" [b9]="9" [b10]="10" [b11]="11" [b12]="12" [b13]="13" [b14]="14" [b15]="15" [b16]="16" [a0]="0" [a1]="1" [a2]="2" [a3]="3" [a4]="4" [a5]="5" ) declare -A GC_TYPES=( [h0.1]="hat" [h0.4]="hat" [h0.8]="hat" [h0.2]="hat" [b0]="button" [b1]="button" [b2]="button" [b3]="button" [b4]="button" [b5]="button" [b6]="button" [b7]="button" [b8]="button" [b9]="button" [b10]="button" [b11]="button" [b12]="button" [b13]="button" [b14]="button" [b15]="button" [b16]="button" [a0]="axis" [a1]="axis" [a2]="axis" [a3]="axis" [a4]="axis" [a5]="axis" ) declare -A GC_BUTTONS=( [dpleft]="left" [dpright]="right" [dpup]="up" [dpdown]="down" [x]="y" [y]="x" [a]="b" [b]="a" [leftshoulder]="l" [rightshoulder]="r" [lefttrigger]="z" [righttrigger]="c" #[leftstick]="" #[rightstick]="" [back]="select" [start]="start" #[guide]="" [leftx0]="analogx" [leftx1]="analogy" [leftx2]="analogleft" [lefty0]="analogl" [lefty1]="analogr" [lefty2]="analogright" ) # Cleans all the inputs for the gamepad with name ${GAMEPAD} and player ${1} clean_pad() { [[ -f "${CONFIG_TMP}" ]] && rm "${CONFIG_TMP}" } # Sets pad depending on parameters. # ${1} = Player Number # ${2} = js[0-7] # ${3} = Device GUID # ${4} = Device Name set_pad() { local DEVICE_GUID=${3} local JOY_NAME="${4}" echo "DEVICE_GUID=${DEVICE_GUID}" local GC_CONFIG="${5}" echo "GC_CONFIG=${GC_CONFIG}" [[ -z ${GC_CONFIG} ]] && return touch "${CONFIG_TMP}" local GC_MAP=$(echo ${GC_CONFIG} | cut -d',' -f3-) [[ "${1}" != "1" ]] && echo "," >> ${CONFIG_TMP} declare -i JOY_INDEX=$(( ${1} - 1 )) echo -e "\t\"${JOY_INDEX}_${JOY_NAME}_${DEVICE_GUID}\": {" >> ${CONFIG_TMP} local ADD_ANALOG=0 local LINE_INSERT= set -f local GC_ARRAY=(${GC_MAP//,/ }) for index in "${!GC_ARRAY[@]}" do local REC=${GC_ARRAY[${index}]} local BUTTON_INDEX=$(echo ${REC} | cut -d ":" -f 1) local TVAL=$(echo ${REC} | cut -d ":" -f 2) local BUTTON_VAL=${TVAL:1} local GC_INDEX="${GC_BUTTONS[${BUTTON_INDEX}]}" local BTN_TYPE=${TVAL:0:1} local VAL="${GC_VALUES[${TVAL}]}" local TYPE="${GC_TYPES[${TVAL}]}" # CREATE BUTTON MAPS (inlcuding hats). if [[ ! -z "${GC_INDEX}" ]]; then if [[ "${BTN_TYPE}" == "b" ]]; then [[ ! -z "${VAL}" ]] && echo -e "\t\t\"${GC_INDEX}\": { \"id\": ${VAL}, \"type\": \"${TYPE}\", \"value\": 1 }," >> ${CONFIG_TMP} fi if [[ "${BTN_TYPE}" == "h" ]]; then [[ ! -z "${VAL}" ]] && echo -e "\t\t\"${GC_INDEX}\": { \"id\": 0, \"type\": \"${TYPE}\", \"value\": ${VAL} }," >> ${CONFIG_TMP} fi if [[ "${BTN_TYPE}" == "a" ]]; then case ${BUTTON_INDEX} in leftx|lefty|rightx|righty) ;; esac [[ ! -z "${VAL}" ]] && echo -e "\t\t\"${GC_INDEX}\": { \"id\": ${VAL}, \"type\": \"${TYPE}\", \"value\": 1 }," >> ${CONFIG_TMP} fi fi if [[ "${BTN_TYPE}" == "a" ]]; then case ${BUTTON_INDEX} in leftx|lefty) #ADD_ANALOG=1 GC_INDEX="${GC_BUTTONS[${BUTTON_INDEX}0]}" echo -e "\t\t\"${GC_INDEX}\": { \"id\": ${VAL}, \"type\": \"${TYPE}\", \"value\": -1 }," >> ${CONFIG_TMP} GC_INDEX="${GC_BUTTONS[${BUTTON_INDEX}1]}" echo -e "\t\t\"${GC_INDEX}\": { \"id\": ${VAL}, \"type\": \"${TYPE}\", \"value\": 1 }," >> ${CONFIG_TMP} GC_INDEX="${GC_BUTTONS[${BUTTON_INDEX}2]}" echo -e "\t\t\"${GC_INDEX}\": { \"id\": ${VAL}, \"type\": \"${TYPE}\", \"value\": 1 }," >> ${CONFIG_TMP} ;; esac fi done # remove last character sed -i '$ s/.$//' ${CONFIG_TMP} echo -e "\t}," >> ${CONFIG_TMP} echo -e "\t\"player${1}\": {" >> ${CONFIG_TMP} echo -e "\t\t\"DeviceID\": ${JOY_INDEX}," >> ${CONFIG_TMP} echo -e "\t\t\"deviceGUID\": \"${DEVICE_GUID}\"," >> ${CONFIG_TMP} echo -e "\t\t\"deviceName\": \"${JOY_NAME}\"," >> ${CONFIG_TMP} echo -e "\t\t\"padmode\": ${ADD_ANALOG}" >> ${CONFIG_TMP} echo -e "\t}" >> ${CONFIG_TMP} cat "${CONFIG_TMP}" >> ${CONFIG} rm "${CONFIG_TMP}" } rm ${CONFIG} echo "{" >> ${CONFIG} jc_get_players echo "}" >> ${CONFIG} ================================================ FILE: packages/sx05re/emulators/yabasanshiroSA_1_11/scripts/yabasanshiro.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile mkdir -p "/storage/roms/saturn/yabasanshiro/" mkdir -p "/storage/roms/bios/yabasanshiro/" ROMNAME=$(basename "${1}") BIOS="" # Gamepad Autoconfiguration GAMEPAD=$(sdljoytest -skip_loop | grep "0 name" | sed "s|Joystick 0 name ||") GAMEPADCONFIG=$(xmlstarlet sel -t -c "//inputList/inputConfig[@deviceName=${GAMEPAD}]" -n /storage/.emulationstation/es_input.cfg) if [ ! -z "${GAMEPADCONFIG}" ]; then echo -e "\n" > "/storage/roms/saturn/yabasanshiro/input.cfg" echo "${GAMEPADCONFIG}" >> "/storage/roms/saturn/yabasanshiro/input.cfg" echo "" >> "/storage/roms/saturn/yabasanshiro/input.cfg" fi # if the auto config was not succesful copy the default just in case. if [ ! -e "/storage/roms/saturn/yabasanshiro/input.cfg" ]; then cp -rf "/emuelec/configs/yabasanshiro/input.cfg" "/storage/roms/saturn/yabasanshiro/input.cfg" fi HLEBIOS=$(get_ee_setting hlebios saturn "${ROMNAME}") if [ "${HLEBIOS}" != 1 ]; then if [ -e "/storage/roms/bios/saturn_bios.bin" ]; then BIOS="-b /storage/roms/bios/saturn_bios.bin" else text_viewer -w -t "Notice! Yabasanshiro BIOS Missing!" -f 24 -m "/storage/roms/bios/saturn_bios.bin was not found!\n\nYabasanshiro will continue to load with HLE BIOS\n\nTo avoid this message please copy saturn_bios.bin with checksum af5828fdff51384f99b3c4926be27762 to /storage/roms/bios/\n\nOr select \"USE HLE BIOS\" on the emulator options" BIOS="" fi fi # It should be disabled by default unless the user enables it. AUTOGP=$(get_ee_setting yabasanshiro_auto_gamepad) if [[ "${AUTOGP}" == "1" ]]; then cp -f /storage/.emulationstation/es_input.cfg /storage/roms/saturn/yabasanshiro/input.cfg set_yabasanshiro_joy.sh fi # We use { } to avoid SIGUSR signal showing text and messing up with the error handling { yabasanshiro -r 2 -i "${1}" ${BIOS}; } > /emuelec/logs/emuelec.log 2>&1 ================================================ FILE: packages/sx05re/emulators/yabasanshiroSA_1_5/config/input.cfg ================================================ ================================================ FILE: packages/sx05re/emulators/yabasanshiroSA_1_5/package.mk ================================================ PKG_NAME="yabasanshiroSA_1_5" PKG_VERSION="f6f41dd6485c638ab661f3acd2951c9522f34450" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/devmiyax/yabause" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 boost openal-soft ${OPENGLES} zlib" PKG_LONGDESC="Yabause is a Sega Saturn emulator and took over as Yaba Sanshiro" PKG_TOOLCHAIN="cmake-make" GET_HANDLER_SUPPORT="git" PKG_GIT_CLONE_BRANCH="pi4" #PKG_BUILD_FLAGS="+speed" post_unpack() { # use host versions sed -i "s|COMMAND m68kmake|COMMAND ${PKG_BUILD}/m68kmake_host|" ${PKG_BUILD}/yabause/src/musashi/CMakeLists.txt sed -i "s|COMMAND ./bin2c|COMMAND ${PKG_BUILD}/bin2c_host|" ${PKG_BUILD}/yabause/src/retro_arena/nanogui-sdl/CMakeLists.txt } pre_make_target() { # runs on host so make them manually if package is not crosscompile friendly $HOST_CC ${PKG_BUILD}/yabause/src/retro_arena/nanogui-sdl/resources/bin2c.c -o ${PKG_BUILD}/bin2c_host $HOST_CC ${PKG_BUILD}/yabause/src/musashi/m68kmake.c -o ${PKG_BUILD}/m68kmake_host } pre_configure_target() { PKG_CMAKE_OPTS_TARGET="${PKG_BUILD}/yabause \ -DYAB_PORTS=retro_arena \ -DYAB_WANT_DYNAREC_DEVMIYAX=ON \ -DYAB_WANT_ARM7=OFF \ -DCMAKE_TOOLCHAIN_FILE=${PKG_BUILD}/yabause/src/retro_arena/n2.cmake \ -DYAB_WANT_VULKAN=OFF \ -DOPENGL_INCLUDE_DIR=${SYSROOT_PREFIX}/usr/include \ -DOPENGL_opengl_LIBRARY=${SYSROOT_PREFIX}/usr/lib \ -DOPENGL_glx_LIBRARY=${SYSROOT_PREFIX}/usr/lib \ -DLIBPNG_LIB_DIR=${SYSROOT_PREFIX}/usr/lib \ -Dpng_STATIC_LIBRARIES=${SYSROOT_PREFIX}/usr/lib/libpng16.a \ -DCMAKE_BUILD_TYPE=Release" if [[ ${DEVICE} == "OdroidGoAdvance" || ${DEVICE} == "GameForce" ]]; then PKG_CMAKE_OPTS_TARGET+=" -DCMAKE_BUILD_TYPE=Release" fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -a ${PKG_BUILD}/src/retro_arena/yabasanshiro ${INSTALL}/usr/bin/yabasanshiro1_5 cp -a ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/yabasanshiro1_5 cp ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/yabasanshiro1_5 } ================================================ FILE: packages/sx05re/emulators/yabasanshiroSA_1_5/patches/01-yabasanshiroSA-EmuELEC-add-missing-include.patch ================================================ --- a/yabause/src/threads.h 2022-01-05 15:41:03.685887385 -0600 +++ b/yabause/src/threads.h 2022-01-05 15:43:05.404177636 -0600 @@ -115,6 +115,8 @@ int YabCopyFile(const char * src, const char * dst); int YabMakeCleanDir( const char * dirname ); + +#include int YabNanosleep(u64 ns); /////////////////////////////////////////////////////////////////////////// ================================================ FILE: packages/sx05re/emulators/yabasanshiroSA_1_5/patches/02-yabasanshiroSA-EmuELEC-use-system-libpng.patch ================================================ --- a/yabause/src/retro_arena/CMakeLists.txt 2022-01-05 15:44:20.891135756 -0600 +++ b/yabause/src/retro_arena/CMakeLists.txt 2022-01-05 15:44:41.738849860 -0600 @@ -22,7 +22,7 @@ add_subdirectory(nanogui-sdl) #include( ../glfw/external_zlib.cmake ) -include( ${CMAKE_SOURCE_DIR}/CMake/Packages/external_libpng.cmake ) +#include( ${CMAKE_SOURCE_DIR}/CMake/Packages/external_libpng.cmake ) #------------------------------------------------------------------------------ # nlohmann/json ================================================ FILE: packages/sx05re/emulators/yabasanshiroSA_1_5/patches/03-yabasanshiroSA-removegl3ext.patch ================================================ --- a/yabause/src/ygl.h +++ b/yabause/src/ygl.h @@ -50,7 +50,6 @@ #include #elif defined(__ANDROID__) #include - #include #include --- a/yabause/src/nanovg/nanovg_osdcore.c +++ b/yabause/src/nanovg/nanovg_osdcore.c @@ -36,7 +36,6 @@ #if defined(_OGLES3_) #include -#include #else #include "ygl.h" #endif ================================================ FILE: packages/sx05re/emulators/yabasanshiroSA_1_5/patches/04-yabasanshiroSA-use-EmuELEC-paths.patch ================================================ --- a/yabause/src/retro_arena/main.cpp +++ b/yabause/src/retro_arena/main.cpp @@ -286,7 +286,7 @@ // Inisialize home directory std::string home_dir = getenv("HOME"); - home_dir += "/.yabasanshiro/"; + home_dir = "/storage/roms/saturn/yabasanshiro1_5/"; struct stat st = {0}; if (stat(home_dir.c_str(), &st) == -1) { mkdir(home_dir.c_str(), 0700); @@ -597,7 +597,9 @@ if( ret == 0 ){ char pngname[256]; snprintf(pngname,256,"%s/%s_%d.png", s_savepath, cdip->itemnum, e.user.code); - fs::copy(tmpfilename, pngname, fs::copy_options::overwrite_existing ); + //fs::copy(tmpfilename, pngname, fs::copy_options::overwrite_existing ); + + system((std::string("cp -f ") + tmpfilename + " " + pngname).c_str()); } hideMenuScreen(); } --- a/yabause/src/retro_arena/Preference.cpp +++ b/yabause/src/retro_arena/Preference.cpp @@ -17,7 +17,7 @@ } std::string home_dir = getenv("HOME"); - home_dir += "/.yabasanshiro/"; + home_dir = "/storage/roms/saturn/yabasanshiro1_5/"; this->filename = home_dir + input_trace_filename + ".config"; --- a/yabause/src/retro_arena/InputManager.cpp +++ b/yabause/src/retro_arena/InputManager.cpp @@ -213,7 +213,7 @@ if( SDL_NumJoysticks() == 0 ){ - PADLOG("No joy stic is found force to keyboard\n"); + PADLOG("No joystick is found force to keyboard\n"); padbits = PerPadAdd(&PORTDATA1); if( configs.find("player1") == configs.end() ){ return setDefalutSettings(padbits); @@ -460,22 +460,22 @@ } Input result; - inputconfig->getInputByName("a", &result); + inputconfig->getInputByName("y", &result); player[guid]["a"] ={ { "type", input_types[result.type] },{ "id", result.id },{ "value", result.value } }; inputconfig->getInputByName("b", &result); player[guid]["b"] = { { "type", input_types[result.type] },{ "id", result.id },{ "value", result.value } }; - inputconfig->getInputByName("rightshoulder", &result); + inputconfig->getInputByName("a", &result); player[guid]["c"] = { { "type", input_types[result.type] },{ "id", result.id },{ "value", result.value } } ; inputconfig->getInputByName("x", &result); player[guid]["x"] = { { "type", input_types[result.type] },{ "id", result.id },{ "value", result.value } }; - inputconfig->getInputByName("y", &result); + inputconfig->getInputByName("leftshoulder", &result); player[guid]["y"] = { { "type", input_types[result.type] },{ "id", result.id },{ "value", result.value } }; - inputconfig->getInputByName("leftshoulder", &result); + inputconfig->getInputByName("rightshoulder", &result); player[guid]["z"] = { { "type", input_types[result.type] },{ "id", result.id },{ "value", result.value } }; inputconfig->getInputByName("lefttrigger", &result); @@ -1209,7 +1209,7 @@ std::string InputManager::getConfigPath() { std::string path = getenv("HOME"); - path += "/.emulationstation/es_temporaryinput.cfg"; + path = "/storage/roms/saturn/yabasanshiro1_5/input.cfg"; return path; } ================================================ FILE: packages/sx05re/emulators/yabasanshiroSA_1_5/scripts/set_yabasanshiro_joy.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Langerz82 (https://github.com/Langerz82) # Source predefined functions and variables . /etc/profile # Configure ADVMAME players based on ES settings CONFIG_DIR="/storage/roms/saturn/yabasanshiro1_5" CONFIG="${CONFIG_DIR}/keymapv2.json" CONFIG_TMP=/tmp/jc/yabasan.tmp source /usr/bin/joy_common.sh "yabasanshiro" declare -A GC_VALUES=( [h0.1]="1" [h0.4]="4" [h0.8]="8" [h0.2]="2" [b0]="0" [b1]="1" [b2]="2" [b3]="3" [b4]="4" [b5]="5" [b6]="6" [b7]="7" [b8]="8" [b9]="9" [b10]="10" [b11]="11" [b12]="12" [b13]="13" [b14]="14" [b15]="15" [b16]="16" [a0]="0" [a1]="1" [a2]="2" [a3]="3" [a4]="4" [a5]="5" ) declare -A GC_TYPES=( [h0.1]="hat" [h0.4]="hat" [h0.8]="hat" [h0.2]="hat" [b0]="button" [b1]="button" [b2]="button" [b3]="button" [b4]="button" [b5]="button" [b6]="button" [b7]="button" [b8]="button" [b9]="button" [b10]="button" [b11]="button" [b12]="button" [b13]="button" [b14]="button" [b15]="button" [b16]="button" [a0]="axis" [a1]="axis" [a2]="axis" [a3]="axis" [a4]="axis" [a5]="axis" ) declare -A GC_BUTTONS=( [dpleft]="left" [dpright]="right" [dpup]="up" [dpdown]="down" [x]="y" [y]="x" [a]="b" [b]="a" [leftshoulder]="z" [rightshoulder]="c" [lefttrigger]="l" [righttrigger]="r" #[leftstick]="" #[rightstick]="" [back]="select" [start]="start" #[guide]="" [leftx0]="analogx" [leftx1]="analogy" [lefty0]="analogl" [lefty1]="analogr" ) # Cleans all the inputs for the gamepad with name ${GAMEPAD} and player ${1} clean_pad() { [[ -f "${CONFIG_TMP}" ]] && rm "${CONFIG_TMP}" } # Sets pad depending on parameters. # ${1} = Player Number # ${2} = js[0-7] # ${3} = Device GUID # ${4} = Device Name set_pad() { local DEVICE_GUID=${3} local JOY_NAME="${4}" echo "DEVICE_GUID=${DEVICE_GUID}" local GC_CONFIG="${5}" echo "GC_CONFIG=${GC_CONFIG}" [[ -z ${GC_CONFIG} ]] && return touch "${CONFIG_TMP}" local GC_MAP=$(echo ${GC_CONFIG} | cut -d',' -f3-) [[ "${1}" != "1" ]] && echo "," >> ${CONFIG_TMP} declare -i JOY_INDEX=$(( ${1} - 1 )) echo -e "\t\"${JOY_INDEX}_${JOY_NAME}_${DEVICE_GUID}\": {" >> ${CONFIG_TMP} local ADD_ANALOG=0 local LINE_INSERT= set -f local GC_ARRAY=(${GC_MAP//,/ }) for index in "${!GC_ARRAY[@]}" do local REC=${GC_ARRAY[${index}]} local BUTTON_INDEX=$(echo ${REC} | cut -d ":" -f 1) local TVAL=$(echo ${REC} | cut -d ":" -f 2) local BUTTON_VAL=${TVAL:1} local GC_INDEX="${GC_BUTTONS[${BUTTON_INDEX}]}" local BTN_TYPE=${TVAL:0:1} local VAL="${GC_VALUES[${TVAL}]}" local TYPE="${GC_TYPES[${TVAL}]}" # CREATE BUTTON MAPS (inlcuding hats). if [[ ! -z "${GC_INDEX}" ]]; then if [[ "${BTN_TYPE}" == "b" ]]; then [[ ! -z "${VAL}" ]] && echo -e "\t\t\"${GC_INDEX}\": { \"id\": ${VAL}, \"type\": \"${TYPE}\", \"value\": 1 }," >> ${CONFIG_TMP} fi if [[ "${BTN_TYPE}" == "h" ]]; then [[ ! -z "${VAL}" ]] && echo -e "\t\t\"${GC_INDEX}\": { \"id\": 0, \"type\": \"${TYPE}\", \"value\": ${VAL} }," >> ${CONFIG_TMP} fi if [[ "${BTN_TYPE}" == "a" ]]; then case ${BUTTON_INDEX} in leftx|rightx|lefty|righty) continue ;; esac [[ ! -z "${VAL}" ]] && echo -e "\t\t\"${GC_INDEX}\": { \"id\": ${VAL}, \"type\": \"${TYPE}\", \"value\": 1 }," >> ${CONFIG_TMP} fi fi if [[ "${BTN_TYPE}" == "a" ]]; then case ${BUTTON_INDEX} in leftx|lefty) #ADD_ANALOG=1 GC_INDEX="${GC_BUTTONS[${BUTTON_INDEX}0]}" echo -e "\t\t\"${GC_INDEX}\": { \"id\": ${VAL}, \"type\": \"${TYPE}\", \"value\": -1 }," >> ${CONFIG_TMP} GC_INDEX="${GC_BUTTONS[${BUTTON_INDEX}1]}" echo -e "\t\t\"${GC_INDEX}\": { \"id\": ${VAL}, \"type\": \"${TYPE}\", \"value\": 1 }," >> ${CONFIG_TMP} ;; esac fi done local AXIS="$( cat /tmp/sdljoytest.txt | grep "Joystick ${JOY_INDEX} Axes" | cut -d' ' -f4 | sed 's/^0*//' )" if [[ ! -z "${AXIS}" ]]; then local AXIS_LEFT=$(( AXIS - 2 )) local AXIS_RIGHT=$(( AXIS - 1 )) echo -e "\t\t\"analogleft\": { \"id\": ${AXIS_LEFT}, \"type\": \"axis\", \"value\": 0 }," >> ${CONFIG_TMP} echo -e "\t\t\"analogright\": { \"id\": ${AXIS_RIGHT}, \"type\": \"axis\", \"value\": 0 }," >> ${CONFIG_TMP} fi # remove last character sed -i '$ s/.$//' ${CONFIG_TMP} echo -e "\t}," >> ${CONFIG_TMP} echo -e "\t\"player${1}\": {" >> ${CONFIG_TMP} echo -e "\t\t\"DeviceID\": ${JOY_INDEX}," >> ${CONFIG_TMP} echo -e "\t\t\"deviceGUID\": \"${DEVICE_GUID}\"," >> ${CONFIG_TMP} echo -e "\t\t\"deviceName\": \"${JOY_NAME}\"," >> ${CONFIG_TMP} echo -e "\t\t\"padmode\": ${ADD_ANALOG}" >> ${CONFIG_TMP} echo -e "\t}" >> ${CONFIG_TMP} cat "${CONFIG_TMP}" >> ${CONFIG} rm "${CONFIG_TMP}" } sdljoytest -skip_loop > /tmp/sdljoytest.txt rm ${CONFIG} echo "{" >> ${CONFIG} jc_get_players echo "}" >> ${CONFIG} ================================================ FILE: packages/sx05re/emulators/yabasanshiroSA_1_5/scripts/yabasanshiro1_5.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile mkdir -p "/storage/roms/saturn/yabasanshiro1_5/" ROMNAME=$(basename "${1}") BIOS="" # Gamepad Autoconfiguration GAMEPAD=$(sdljoytest -skip_loop | grep "0 name" | sed "s|Joystick 0 name ||") GAMEPADCONFIG=$(xmlstarlet sel -t -c "//inputList/inputConfig[@deviceName=${GAMEPAD}]" -n /storage/.emulationstation/es_input.cfg) if [ ! -z "${GAMEPADCONFIG}" ]; then echo -e "\n" > "/storage/roms/saturn/yabasanshiro1_5/input.cfg" echo "${GAMEPADCONFIG}" >> "/storage/roms/saturn/yabasanshiro1_5/input.cfg" echo "" >> "/storage/roms/saturn/yabasanshiro1_5/input.cfg" fi # if the auto config was not succesful copy the default just in case. if [ ! -e "/storage/roms/saturn/yabasanshiro1_5/input.cfg" ]; then cp -rf "/emuelec/configs/yabasanshiro1_5/input.cfg" "/storage/roms/saturn/yabasanshiro/input.cfg" fi HLEBIOS=$(get_ee_setting hlebios saturn "${ROMNAME}") if [ "${HLEBIOS}" != 1 ]; then if [ -e "/storage/roms/bios/saturn_bios.bin" ]; then BIOS="-b /storage/roms/bios/saturn_bios.bin" else text_viewer -w -t "Notice! Yabasanshiro BIOS Missing!" -f 24 -m "/storage/roms/bios/saturn_bios.bin was not found!\n\nYabasanshiro will continue to load with HLE BIOS\n\nTo avoid this message please copy saturn_bios.bin with checksum af5828fdff51384f99b3c4926be27762 to /storage/roms/bios/\n\nOr select \"USE HLE BIOS\" on the emulator options" BIOS="" fi fi AUTOGP=$(get_ee_setting yabasanshiro_auto_gamepad) if [[ "${AUTOGP}" == "1" ]]; then cp -f /storage/.emulationstation/es_input.cfg /storage/roms/saturn/yabasanshiro1_5/input.cfg set_yabasanshiro_joy1_5.sh fi # We use { } to avoid SIGUSR signal showing text and messing up with the error handling { yabasanshiro1_5 -r 2 -i "${1}" ${BIOS}; } > /emuelec/logs/emuelec.log 2>&1 ================================================ FILE: packages/sx05re/libretro/2048/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="2048" PKG_VERSION="86e02d3c2dd76858db7370f5df1ccfc33b3abee1" PKG_SHA256="1288de5aa6c88b1bf710f62b7bdd9908c72781890bf6c34e8864a5bbeb67bb1d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/libretro-2048" PKG_URL="https://github.com/libretro/libretro-2048/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of 2048 puzzle game to the libretro API." PKG_LONGDESC="Port of 2048 puzzle game to the libretro API." PKG_TOOLCHAIN="make" PKG_MAKE_OPTS_TARGET="-f Makefile.libretro GIT_VERSION=${PKG_VERSION:0:7}" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp 2048_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/81/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="81" PKG_VERSION="ffc99f27f092addc9ddd34dd0e3a3d4d1c053cbf" PKG_SHA256="3db0e494cbd2afcc511cd7ba0e5eda104871301e26a74254bf4a08356d567181" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/81-libretro" PKG_URL="https://github.com/libretro/81-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="A port of the EightyOne ZX81 Emulator to libretro" PKG_LONGDESC="A port of the EightyOne ZX81 Emulator to libretro" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make -f Makefile.libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp 81_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/a5200/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="a5200" PKG_VERSION="526404072821bb2021fab16f8c5dbbca300512c8" PKG_SHA256="920d6072d58456a05a80e09efa8b8780a1c7d67ec29500e873c3095321fe799a" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/a5200" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Port of Atari 5200 emulator for GCW0 " PKG_TOOLCHAIN="auto" PKG_MAKE_OPTS_TARGET="platform=rpi4" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp a5200_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/arduous/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present PKG_NAME="arduous" PKG_VERSION="50c1e48084f003dee582ed5f4f5c0f59eb30bc4c" PKG_ARCH="any" PKG_LICENSE="GPL-3.0-or-later" PKG_SITE="https://github.com/libretro/arduous" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="emuelec/libretro" PKG_SHORTDESC="Arduous libretro core (Arduboy)" PKG_LONGDESC="Arduous is a libretro emulator core for the Arduboy." PKG_TOOLCHAIN="cmake" makeinstall_target() { mkdir -p "${INSTALL}/usr/lib/libretro" if [ -f "${PKG_BUILD}/.${TARGET_NAME}/arduous_libretro.so" ]; then cp "${PKG_BUILD}/.${TARGET_NAME}/arduous_libretro.so" "${INSTALL}/usr/lib/libretro/" else cp "${PKG_BUILD}/arduous_libretro.so" "${INSTALL}/usr/lib/libretro/" fi } ================================================ FILE: packages/sx05re/libretro/atari800/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="atari800" PKG_VERSION="6a18cb23cc4a7cecabd9b16143d2d7332ae8d44b" PKG_SHA256="0fa8456f611975f80e0edba37a9cb4935918a94d30f6d42f8fa0679e76a9971a" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libretro/libretro-atari800" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="atari800 3.1.0 for libretro/libco WIP" PKG_LONGDESC="atari800 3.1.0 for libretro/libco WIP" PKG_TOOLCHAIN="auto" PKG_MAKE_OPTS_TARGET="platform=emuelec GIT_VERSION=${PKG_VERSION:0:7}" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp atari800_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/atari800/patches/aarch64/atari800-01-add-emuelec-platform.patch ================================================ --- a/Makefile +++ b/Makefile @@ -345,6 +345,31 @@ LDFLAGS += -static-libgcc -static-libstdc++ ####################################### +# (armv8 a35, hard point, neon based) ### +# PlayStation Classic +else ifeq ($(platform), emuelec) + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + LDFLAGS := -shared -Wl,--version-script=link.T -Wl,--no-undefined + CFLAGS += -O2 \ + -fuse-linker-plugin \ + -fdata-sections -ffunction-sections -Wl,--gc-sections \ + -fno-stack-protector -fno-ident -fomit-frame-pointer \ + -falign-functions=1 -falign-jumps=1 -falign-loops=1 \ + -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-unroll-loops \ + -fmerge-all-constants -fno-math-errno \ + #-marm -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard + CXXFLAGS += $(CFLAGS) + CPPFLAGS += $(CFLAGS) + ASFLAGS += $(CFLAGS) + HAVE_NEON = 1 + CFLAGS += -march=armv8-a + LDFLAGS += -static-libgcc + CFLAGS += -DDEFAULT_CFG_NAME="\"/storage/.config/emuelec/configs/atari800.cfg\"" +####################################### + + + # emscripten else ifeq ($(platform), emscripten) TARGET := $(TARGET_NAME)_libretro_emscripten.bc ================================================ FILE: packages/sx05re/libretro/atari800/patches/arm/atari800-01-add-emuelec-platform.patch ================================================ --- a/Makefile +++ b/Makefile @@ -345,6 +345,31 @@ LDFLAGS += -static-libgcc -static-libstdc++ ####################################### +# (armv8 a35, hard point, neon based) ### +# PlayStation Classic +else ifeq ($(platform), emuelec) + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + LDFLAGS := -shared -Wl,--version-script=link.T -Wl,--no-undefined + CFLAGS += -O2 \ + -fuse-linker-plugin \ + -fdata-sections -ffunction-sections -Wl,--gc-sections \ + -fno-stack-protector -fno-ident -fomit-frame-pointer \ + -falign-functions=1 -falign-jumps=1 -falign-loops=1 \ + -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-unroll-loops \ + -fmerge-all-constants -fno-math-errno \ + -marm -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard + CXXFLAGS += $(CFLAGS) + CPPFLAGS += $(CFLAGS) + ASFLAGS += $(CFLAGS) + HAVE_NEON = 1 + CFLAGS += -march=armv8-a + LDFLAGS += -static-libgcc + CFLAGS += -DDEFAULT_CFG_NAME="\"/.config/emuelec/configs/atari800.cfg\"" +####################################### + + + # emscripten else ifeq ($(platform), emscripten) TARGET := $(TARGET_NAME)_libretro_emscripten.bc ================================================ FILE: packages/sx05re/libretro/b2/package.mk ================================================ PKG_NAME="b2" PKG_VERSION="9a00b269" PKG_SHA256="" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/zoltanvb/b2-libretro" PKG_URL="$PKG_SITE.git" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="BBC Micro emulator for libretro" PKG_LONGDESC="Adaptation of Tom Seddon's b2 emulator for BBC Micro" PKG_TOOLCHAIN="make" PKG_LIBRETRO="src/libretro" pre_make_target() { cd ${PKG_BUILD}/${PKG_LIBRETRO} } make_target() { cd ${PKG_BUILD}/${PKG_LIBRETRO} make GIT_VERSION=${PKG_VERSION} } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/${PKG_LIBRETRO}/b2_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/beetle-gba/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="beetle-gba" PKG_VERSION="6cee80685f735ea6c2373db2622a1f1ee9f39d39" PKG_SHA256="33ef14eb0141e98323cc8c3e997f668df348fea7b7bf5a97766c2c91af075fa7" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-gba-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="libretro implementation of Mednafen VBA/GBA. (Game Boy Advance)" PKG_LONGDESC="libretro implementation of Mednafen VBA/GBA. (Game Boy Advance)" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mednafen_gba_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/beetle-lynx/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="beetle-lynx" PKG_VERSION="efd1797c7aa5a83c354507b1b61ac24222ebaa58" PKG_SHA256="51228c6b180bf784020e8b601bc26fe7ce5f813571693eb2e4590d7bf166248c" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-lynx-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="libretro implementation of Mednafen Lynx" PKG_LONGDESC="libretro implementation of Mednafen Lynx" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mednafen_lynx_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/beetle-ngp/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="beetle-ngp" PKG_VERSION="139fe34c8dfc5585d6ee1793a7902bca79d544de" PKG_SHA256="5f0122405b18e0a95f4a5da2ef2f57b4bf1895a691370e65cc19fd5854a50412" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-ngp-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="libretro implementation of Mednafen Neo Geo Pocket." PKG_LONGDESC="libretro implementation of Mednafen Neo Geo Pocket." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mednafen_ngp_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/beetle-pce/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="beetle-pce" PKG_VERSION="d5c2b28ee6931ae43a4a79455937693ae8ccc8a1" PKG_SHA256="3e2c410fba2abd46c62d5f43f4b8914e459a0927c8c56df48af440890ef403c4" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-pce-fast-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Standalone port of Mednafen PCE Fast to libretro." PKG_LONGDESC="Standalone port of Mednafen PCE Fast to libretro." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mednafen_pce_fast_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/beetle-pcfx/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="beetle-pcfx" PKG_VERSION="dd04cef9355286488a1d78ff18c4c848a1575540" PKG_SHA256="8f1153206479a25e925981076758698e0c5f6e7f826213b2b3598dc33a7d8ea0" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-pcfx-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="libretro implementation of Mednafen PC-FX." PKG_LONGDESC="libretro implementation of Mednafen PC-FX." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { if [ "${ARCH}" == "i386" -o "${ARCH}" == "x86_64" ]; then make platform=unix CC=${CC} CXX=${CXX} AR=${AR} else make platform=armv CC=${CC} CXX=${CXX} AR=${AR} fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mednafen_pcfx_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/beetle-psx-hw/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="beetle-psx-hw" PKG_VERSION="b62e2aa1b3ad2d027a06542305e12a52e5f5d4c4" PKG_SHA256="a9a36839410c3024a289ea910fe859f1c2bc48c26dfe1d86d5a9acb0a6f148e1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/ZachCook/beetle-psx-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SHORTDESC="Fork of Mednafen PSX" PKG_TOOLCHAIN="make" PKG_GIT_CLONE_BRANCH="lightrec" make_target() { make HAVE_HW=1 } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mednafen_lynx_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/beetle-saturn/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present Team EmuELEC (https://emuelec.org) PKG_NAME="beetle-saturn" PKG_VERSION="ccba5265f60f8e64a1984c9d14d383606193ea6a" PKG_SHA256="f6d23a233a4b66038d20ba13f7b13666bab258478d9e62a4ebfac6dd8eefe2d8" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/sonninnos/beetle-saturn-libretro/" PKG_URL="$PKG_SITE/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SHORTDESC=" Standalone hard fork of Mednafen Saturn to the libretro API. " PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="+speed" CXXFLAGS="-O3 -march=armv8-a+crc+fp+simd -mtune=cortex-a73.cortex-a53 -flto" makeinstall_target() { mkdir -p $INSTALL/usr/lib/libretro cp mednafen_saturn_*.so $INSTALL/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/beetle-saturn/patches/02.patch ================================================ --- a/Makefile 2024-12-20 21:55:50.723084900 +0100 +++ b/Makefile 2024-12-20 22:17:50.342798300 +0100 @@ -446,7 +446,7 @@ all: $(TARGET) ifeq ($(DEBUG),0) - FLAGS += -O2 $(EXTRA_GCC_FLAGS) + FLAGS += -O3 $(EXTRA_GCC_FLAGS) else FLAGS += -O0 -g endif ================================================ FILE: packages/sx05re/libretro/beetle-supergrafx/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="beetle-supergrafx" PKG_VERSION="a776133c34ae8da5daf7d9ccb43e3e292e2b07b0" PKG_SHA256="f6a2d1cfeb170510eed437f939ae05d717a20b6e23626cff6ebd47f0c84f13ce" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-supergrafx-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Standalone port of Mednafen PCE Fast to libretro." PKG_LONGDESC="Standalone port of Mednafen PCE Fast to libretro." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mednafen_supergrafx_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/beetle-vb/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="beetle-vb" PKG_VERSION="8f837ebc077afdd6652efb2827fd8308a07113ca" PKG_SHA256="d2733026bde2b8049b8258f68d49954687ab43e2639d6a879c79cca68e91dea6" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-vb-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="libretro implementation of Mednafen VB. (VirtualBoy)" PKG_LONGDESC="libretro implementation of Mednafen VB. (VirtualBoy)" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mednafen_vb_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/beetle-wswan/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="beetle-wswan" PKG_VERSION="2aeb47d3a58bf0360c686f842d9bb5bd201306fe" PKG_SHA256="035c0ebdad6740511cc395199db134d20c29611b830cf11831d6ec8744a33d42" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/beetle-wswan-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="libretro implementation of Mednafen wswan" PKG_LONGDESC="libretro implementation of Mednafen wswan" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mednafen_wswan_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/bk/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2023-present Team LibreELEC (https://libreelec.tv) PKG_NAME="bk" PKG_VERSION="f95d929c8eca6c85075cd5c56a08aac9c58f3802" PKG_SHA256="7ed9976abe5c235061a44884346426509231d1237c9b7ff23e8a7aa6894fcf5d" PKG_LICENSE="NTP" PKG_SITE="https://github.com/libretro/bk-emulator" PKG_URL="https://github.com/libretro/bk-emulator/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" PKG_MAKE_OPTS_TARGET="-f Makefile.libretro" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro wget -O ${INSTALL}/usr/lib/libretro/bk_libretro.info https://raw.githubusercontent.com/libretro/libretro-super/master/dist/info/bk_libretro.info cp ${PKG_BUILD}/bk_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/bluemsx/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="bluemsx" PKG_VERSION="3a2855e30c7f39a41064ca36264e9bf9f6170f8e" PKG_SHA256="7a0ebdc889c9f069c08ba9a97e2b4c3bb640090268275e6d697b0bf326e570bd" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/blueMSX-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of blueMSX to the libretro API." PKG_LONGDESC="Port of blueMSX to the libretro API." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make -f Makefile.libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp bluemsx_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/bnes/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="bnes" PKG_VERSION="8e26e89a93bef8eb8992d1921b539dce1792660a" PKG_SHA256="c151e1296b8f6c035014dc62919692097feeebb19ae73294f1b9781edf1921b1" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/bnes-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="libretro implementation of bNES/higan. (Nintendo Entertainment System)" PKG_LONGDESC="libretro implementation of bNES/higan. (Nintendo Entertainment System)" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp bnes_libretro.so ${INSTALL}/usr/lib/libretro/bnes_libretro.so } ================================================ FILE: packages/sx05re/libretro/bsnes_hd/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="bsnes_hd" PKG_VERSION="591b7e13b6914beffaa01084e4c0b7a5d9cc0673" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/bsnes" PKG_URL="${PKG_SITE}.git" #PKG_GIT_CLONE_BRANCH="hd" PKG_DEPENDS_TARGET="toolchain" PKG_SHORTDESC="Super Nintendo (Super Famicom) emulator" GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="make" PKG_IS_ADDON="no" PKG_AUTORECONF="no" make_target() { make -C bsnes -f GNUmakefile target="libretro" } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp bsnes/out/bsnes_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/cannonball/package.mk ================================================ ################################################################################ # This file is part of Lakka - http://www.lakka.tv # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="cannonball" PKG_VERSION="5137a791d229a5b9c7c089cf1edcce4db3c57d64" PKG_SHA256="f066944897cde7bbf3df365ac75c2cc1ef5114059d1a0c51782f12bff5bcfa73" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/cannonball" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Cannonball: An Enhanced OutRun Engine" PKG_LONGDESC="Cannonball: An Enhanced OutRun Engine" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp cannonball_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/cap32/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="cap32" PKG_VERSION="a5d96c5ebbda3bc89a3bd1c1691a20f5eacc232d" PKG_SHA256="c9010df18c86ab98ea77c1960b17ddde381f2ac57120792c266a87b518d0b86b" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/libretro-cap32" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="caprice32 4.2.0 libretro" PKG_LONGDESC="caprice32 4.2.0 libretro" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp cap32_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/chaigame/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="chaigame" PKG_VERSION="467cd453e3b1761c5c3611746b35e709328a2ced" PKG_SHA256="e8c720ae6c7722261d9084548536a66f1c7291232f93ddaa7bc89e2348459c41" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/RobLoach/ChaiGame" PKG_URL="https://github.com/RobLoach/ChaiGame/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="ChaiGame: 2D Game Framework" PKG_LONGDESC="Framework to create 2D games with ChaiScript." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" configure_target() { cd ${PKG_BUILD} } makeinstall_target() { make install INSTALLDIR="${INSTALL}/usr/lib/libretro" } ================================================ FILE: packages/sx05re/libretro/chailove/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="chailove" PKG_VERSION="467cd453e3b1761c5c3611746b35e709328a2ced" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/libretro/libretro-chailove" PKG_URL="https://github.com/libretro/libretro-chailove.git" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="ChaiLove: 2D Game Framework" PKG_LONGDESC="Framework to create 2D games with ChaiScript." PKG_TOOLCHAIN="make" GET_HANDLER_SUPPORT="git" configure_target() { cd ${PKG_BUILD} } makeinstall_target() { make install INSTALLDIR="${INSTALL}/usr/lib/libretro" } ================================================ FILE: packages/sx05re/libretro/clownmdemu/package.mk ================================================ PKG_NAME="clownmdemu" PKG_VERSION="7591c16337b217006c524727df76670a85efad0f" PKG_SHA256="" PKG_LICENSE="AGPLv3" PKG_SITE="https://github.com/Clownacy/clownmdemu-libretro" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="ClownMDEmu - Sega Mega Drive/Genesis emulator libretro core" PKG_TOOLCHAIN="make" GET_HANDLER_SUPPORT="git" PKG_LIBNAME="clownmdemu_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" make_target() { cd ${PKG_BUILD} make GIT_VERSION=1.5 } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/${PKG_LIBNAME} ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/craft/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="craft" PKG_VERSION="675c5b2fc690d2e80f6099f46407bf23827c59d4" PKG_SHA256="e6208ba074af0e0789d8d4345ae579dbfd5838be9419558863c6bd60a0d35f6e" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/libretro/Craft" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="A simple Minecraft clone written in C using modern OpenGL (shaders)." PKG_LONGDESC="A simple Minecraft clone written in C using modern OpenGL (shaders)." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" pre_configure_target() { cd ${PKG_BUILD} } make_target() { if [ "${OPENGLES_SUPPORT}" = yes ]; then make -f Makefile.libretro FORCE_GLES=1 else make -f Makefile.libretro fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp craft_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/crocods/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="crocods" PKG_VERSION="a320f6e38af49af84a63f81329a1bdb9322022b4" PKG_SHA256="b2fb689f0a2d3d0496ee11330ed0d086d09dcd8cde1bce34f46f8a1db89aabbf" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/libretro/libretro-crocods" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Amstrad CPC emulator" PKG_LONGDESC="Amstrad CPC emulator" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp crocods_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/daphne/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="daphne" PKG_VERSION="b5481bab34a51369b6749cd95f5f889e43aaa23f" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2+" PKG_SITE="https://github.com/libretro/daphne" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_SHORTDESC="This is a Daphne core" GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="make" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp daphne_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/desmume/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="desmume" PKG_VERSION="7f05a8d447b00acd9e0798aee97b4f72eb505ef9" PKG_SHA256="2bcbf364f91fcaf533f3b8e1b03a0dae1ebc54df54ee3973c1e0bf79dc32bda6" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/desmume" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux glibc libpcap" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="libretro wrapper for desmume NDS emulator." PKG_LONGDESC="libretro wrapper for desmume NDS emulator." PKG_TOOLCHAIN="make" make_target() { cd ${PKG_BUILD}/desmume/src/frontend/libretro make CC=${CC} platform=arm64-unix } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/desmume/src/frontend/libretro/desmume_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/desmume/patches/desmume-001-arm64-build-fix.patch ================================================ --- a/desmume/src/frontend/libretro/Makefile.libretro +++ b/desmume/src/frontend/libretro/Makefile.libretro @@ -39,7 +39,16 @@ ifneq (,$(findstring unix,$(platform))) CXX = clang++ AR = clang endif - + # ARM64 + ifneq (,$(findstring arm64,$(platform))) + DESMUME_JIT = 0 + DESMUME_JIT_ARM = 0 + override TARGET_ARCH := arm64 + CXXFLAGS += -DUSE_POSIX_MEMALIGN + CXXFLAGS += -DARM64 + DESMUME_OPENGL = 0 + DESMUME_OPENGL_CORE = 0 + endif # Generic ARM ifneq (,$(findstring armv,$(platform))) DESMUME_JIT_ARM = 1 ================================================ FILE: packages/sx05re/libretro/desmume/patches/desmume-002-disable-ogl.patch ================================================ --- a/desmume/src/frontend/libretro/Makefile.libretro 2018-09-09 17:25:30.299207550 +0200 +++ b/desmume/src/frontend/libretro/Makefile.libretro 2018-09-09 17:21:15.835543000 +0200 @@ -75,10 +75,8 @@ CXX = g++-x86 endif else - LIBS := -lpthread -lGL -lpcap - CXXFLAGS += -DHAVE_OPENGL -std=gnu++11 - DESMUME_OPENGL = 1 - DESMUME_OPENGL_CORE = 1 + LIBS := -lpthread -lpcap + CXXFLAGS += -std=gnu++11 endif ifneq (,$(findstring clang,$(platform))) ================================================ FILE: packages/sx05re/libretro/desmume-2015/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="desmume-2015" PKG_VERSION="af397ff3d1f208c27f3922cc8f2b8e08884ba893" PKG_SHA256="de35962a758dfee9c82c7a2055c62a80a539d602fd4db20bdce6b0619f5e34dd" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/desmume2015" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="libretro wrapper for desmume NDS emulator." PKG_LONGDESC="libretro wrapper for desmume NDS emulator." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { if [ "${ARCH}" == "arm" ]; then make -C desmume platform=armv LDFLAGS="${LDFLAGS} -lpthread" # DESMUME_JIT_ARM=1 elif [ "${ARCH}" == "aarch64" ]; then make -C desmume platform=arm64-unix LDFLAGS="${LDFLAGS} -lpthread" else make -C desmume LDFLAGS="${LDFLAGS} -lpthread" fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp desmume/desmume2015_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/desmume-2015/patches/desmume-2015-001-arm64-build-fix.patch ================================================ diff --git a/desmume/Makefile.libretro b/desmume/Makefile.libretro index 7e8f3d20..b6bbbe18 100644 --- a/desmume/Makefile.libretro +++ b/desmume/Makefile.libretro @@ -39,7 +39,16 @@ ifneq (,$(findstring unix,$(platform))) CXX = clang++ AR = clang endif - + + # ARM64 + ifneq (,$(findstring arm64,$(platform))) + DESMUME_JIT = 0 + DESMUME_JIT_ARM = 0 + override TARGET_ARCH := arm64 + CXXFLAGS += -DUSE_POSIX_MEMALIGN + CXXFLAGS += -DARM64 + endif + # Generic ARM ifneq (,$(findstring armv,$(platform))) DESMUME_JIT_ARM = 1 ================================================ FILE: packages/sx05re/libretro/dice/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024 PKG_NAME="dice" PKG_VERSION="f41ed433ed90716521b05437c49684c370faa9df" #PKG_SHA256="" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/mittonk/dice-libretro" PKG_URL="$PKG_SITE/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="DICE - Discrete Integrated Circuit Emulator" PKG_LONGDESC="Emulates computer systems that lack any type of CPU, consisting only of discrete logic components. Supports Pong, Breakout and other early arcade games." PKG_TOOLCHAIN="make" PKG_LIBNAME="dice_libretro.so" PKG_LIBPATH="$PKG_LIBNAME" make_target() { make -f Makefile.libretro } makeinstall_target() { mkdir -p $INSTALL/usr/lib/libretro cp $PKG_LIBPATH $INSTALL/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/dinothawr/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="dinothawr" PKG_VERSION="e57e780a963372b89736620d7e3b8608190f7581" PKG_SHA256="e969f14628a0b7c49609bc98b5ddf6344b3fa4ad3389de77f59da2d2b6160480" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" PKG_SITE="https://github.com/libretro/Dinothawr" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Dinothawr is a block pushing puzzle game on slippery surfaces" PKG_LONGDESC="Dinothawr is a block pushing puzzle game on slippery surfaces. Our hero is a dinosaur whose friends are trapped in ice. Through puzzles it is your task to free the dinos from their ice prison." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" PKG_BUILD_FLAGS="-gold" pre_configure_target() { PKG_MAKE_OPTS_TARGET="HAVE_NEON=1" } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp dinothawr_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/dosbox/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="dosbox" PKG_VERSION="b7b24262c282c0caef2368c87323ff8c381b3102" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/dosbox-libretro" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="libretro wrapper for the DOSBox emulator" PKG_LONGDESC="An open source DOS emulator for BeOS, Linux, Mac OS X, OS/2, and Windows. Primarily focuses on running DOS Games." PKG_BUILD_FLAGS="-lto" GET_HANDLER_SUPPORT="git" PKG_IS_ADDON="no" PKG_AUTORECONF="no" make_target() { make -f Makefile.libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp dosbox_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/dosbox-pure/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="dosbox-pure" PKG_VERSION="fe0bdab8a04eedb912634d89ad8137de75529cff" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/schellingb/dosbox-pure" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain linux glibc glib systemd dbus alsa-lib SDL2 SDL2_net SDL_sound libpng zlib libvorbis flac libogg fluidsynth-git munt opusfile" PKG_LONGDESC="DOSBox Pure is a new fork of DOSBox built for RetroArch/Libretro aiming for simplicity and ease of use. " PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="+lto" pre_configure_target() { if [ "${DEVICE}" == "Amlogic-old" ]; then PKG_MAKE_OPTS_TARGET=" platform=emuelec" elif [ "${DEVICE}" == "Amlogic-ng" ] || [ "${DEVICE}" == "Amlogic-no" ] || ["${DEVICE}" == "Amlogic-ogu" ]; then PKG_MAKE_OPTS_TARGET=" platform=emuelec-ng" else PKG_MAKE_OPTS_TARGET=" platform=emuelec-hh" fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp dosbox_pure_libretro.so ${INSTALL}/usr/lib/libretro/dosbox_pure_libretro.so cp dosbox_pure_libretro.info ${INSTALL}/usr/lib/libretro/dosbox_pure_libretro.info } ================================================ FILE: packages/sx05re/libretro/dosbox-pure/patches/dosbox-pure-add-emuelec-platform.patch ================================================ --- a/Makefile +++ b/Makefile @@ -88,6 +88,30 @@ LDFLAGS += $(CPUFLAGS) -lpthread -shared #LDFLAGS += -static-libstdc++ -static-libgcc #adds 1MB to output +ifneq (,$(findstring emuelec,$(platform))) +OUTNAME := dosbox_pure_libretro.so +BUILD := RELEASE +BUILDDIR := release +CFLAGS := -DNDEBUG -O3 -fno-ident +LDFLAGS += -O3 -fno-ident +STRIPCMD = $(STRIP) --strip-all +CPUFLAGS := -mtune=cortex-a53 -mcpu=cortex-a53 -march=armv8-a+crc+fp+simd + + ifneq (,$(findstring emuelec-hh,$(platform))) + CPUFLAGS := -mtune=cortex-a35 -mcpu=cortex-a35 -march=armv8-a+crc+fp+simd + endif + ifneq (,$(findstring emuelec-ng,$(platform))) + CPUFLAGS := -mtune=cortex-a72.cortex-a53 -mcpu=cortex-a72.cortex-a53 -march=armv8-a+crc+fp+simd + endif + +CFLAGS += $(CPUFLAGS) -fpic -fomit-frame-pointer -Wno-psabi -Wno-format +LDFLAGS += $(CPUFLAGS) -lpthread -Wl,--gc-sections -shared +CXX = $(CC) +endif + +CFLAGS += -pthread -D__LIBRETRO__ -Iinclude +$(info Building $(platform) with $(CPUFLAGS)) + .PHONY: all clean all: $(OUTNAME) ================================================ FILE: packages/sx05re/libretro/dosbox-svn/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="dosbox-svn" PKG_VERSION="53ca2f6303a652d129321cfc521f000cd7ec5531" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/dosbox-svn" PKG_URL="${PKG_SITE}.git" PKG_GIT_CLONE_BRANCH="libretro" PKG_DEPENDS_TARGET="toolchain sdl12-compat SDL_net" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Upstream port of DOSBox to libretro" PKG_LONGDESC="Upstream port of DOSBox to libretro" GET_HANDLER_SUPPORT="git" PKG_IS_ADDON="no" PKG_AUTORECONF="no" PKG_BUILD_FLAGS="-lto" PKG_TOOLCHAIN="make" make_target() { if [ "${ARCH}" = "aarch64" ]; then make -C libretro target=arm64 WITH_EMBEDDED_SDL=0 WITH_FAKE_SDL=1 elif [ "${ARCH}" = "arm" ]; then make -C libretro target=arm WITH_EMBEDDED_SDL=0 WITH_FAKE_SDL=1 elif [ "${ARCH}" = "x86_64" ]; then make -C libretro target=x86_64 WITH_EMBEDDED_SDL=0 elif [ "${ARCH}" = "i386" ]; then make -C libretro target=x86 WITH_EMBEDDED_SDL=0 else make -C libretro WITH_EMBEDDED_SDL=0 WITH_FAKE_SDL=1 fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/libretro/dosbox_svn_libretro.so ${INSTALL}/usr/lib/libretro } ================================================ FILE: packages/sx05re/libretro/dosbox-svn/patches/dosbox-svn-use-sdl-config.patch ================================================ --- a/libretro/Makefile.libretro 2018-08-15 16:42:50.000000000 +0200 +++ b/libretro/Makefile.libretro 2018-08-16 16:22:53.958591362 +0200 @@ -276,8 +276,8 @@ OBJECTS = $(SOURCES_CXX:.cpp=.o) $(SOURCES_C:.c=.o) OBJECT_DEPS = $(OBJECTS:.o=.d) -CXXFLAGS += -D__LIBRETRO__ -MMD $(fpic) $(INCFLAGS) $(COMMONFLAGS) -CFLAGS += -D__LIBRETRO__ -MMD $(fpic) $(INCFLAGS) $(COMMONFLAGS) +CXXFLAGS += -D__LIBRETRO__ -MMD $(fpic) $(INCFLAGS) $(COMMONFLAGS) `sdl-config --cflags` +CFLAGS += -D__LIBRETRO__ -MMD $(fpic) $(INCFLAGS) $(COMMONFLAGS) `sdl-config --cflags` LDFLAGS += -lm $(fpic) .PHONY: all ================================================ FILE: packages/sx05re/libretro/duckstation-lr/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="duckstation-lr" PKG_VERSION="f799f62a" PKG_LICENSE="NON-COMMERCIAL" PKG_ARCH="aarch64" PKG_SITE="https://www.duckstation.org/libretro" PKG_URL="${PKG_SITE}/duckstation_libretro_linux_aarch64.zip" PKG_SHORTDESC="Fast PlayStation 1 emulator for PC and Android " PKG_TOOLCHAIN="manual" pre_unpack() { unzip ${SOURCES}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.zip -d ${PKG_BUILD} } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/duckstation_libretro.so ${INSTALL}/usr/lib/libretro } ================================================ FILE: packages/sx05re/libretro/easyrpg/liblcf/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # # OpenELEC is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # OpenELEC is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC. If not, see . ################################################################################ PKG_NAME="liblcf" PKG_VERSION="01b73de93cf80185fcdf3ffd4737dfdb9111a85e" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/EasyRPG/liblcf" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain expat icu" PKG_SHORTDESC="Library to handle RPG Maker 2000/2003 and EasyRPG projects" PKG_AUTORECONF="no" PKG_TOOLCHAIN="cmake" PKG_CMAKE_OPTS_TARGET="-DCMAKE_BUILD_TYPE=Release" pre_make_target() { find ${PKG_BUILD} -name flags.make -exec sed -i "s:isystem :I:g" \{} \; find ${PKG_BUILD} -name build.ninja -exec sed -i "s:isystem :I:g" \{} \; } ================================================ FILE: packages/sx05re/libretro/easyrpg/libspeexdsp/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="libspeexdsp" PKG_VERSION="64cbfa9" PKG_REV="1" PKG_ARCH="any" PKG_SITE="https://github.com/xiph/speexdsp" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SHORTDESC="Speex audio processing library" GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="configure" PKG_IS_ADDON="no" PKG_AUTORECONF="no" pre_configure_target() { ${PKG_BUILD}/autogen.sh } ================================================ FILE: packages/sx05re/libretro/easyrpg/libxmp-lite/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="libxmp-lite" PKG_VERSION="4.5.0" PKG_REV="1" PKG_ARCH="any" PKG_SITE="http://sourceforge.net/projects/xmp" PKG_URL="${PKG_SITE}/files/libxmp/${PKG_VERSION}/libxmp-lite-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SHORTDESC="Libxmp is a library that renders module files to PCM data." PKG_IS_ADDON="no" PKG_AUTORECONF="no" PKG_TOOLCHAIN="configure" pre_configure_target() { cd ${PKG_BUILD} } ================================================ FILE: packages/sx05re/libretro/easyrpg/libxmp-lite/sources/CMakeLists.txt ================================================ cmake_minimum_required(VERSION 3.7) project(xmp-lite VERSION 4.5.0 LANGUAGES C) add_library(xmp-lite include/libxmp-lite/xmp.h src/virtual.c src/format.c src/period.c src/player.c src/read_event.c src/dataio.c src/lfo.c src/scan.c src/control.c src/filter.c src/effects.c src/mixer.c src/mix_all.c src/load_helpers.c src/load.c src/hio.c src/smix.c src/memio.c src/md5.c src/misc.c src/loaders/common.c src/loaders/itsex.c src/loaders/sample.c src/loaders/xm_load.c src/loaders/mod_load.c src/loaders/s3m_load.c src/loaders/it_load.c) target_include_directories(xmp-lite PUBLIC $ $) target_compile_definitions(xmp-lite PRIVATE LIBXMP_CORE_PLAYER=1 LIBXMP_NO_DEPACKERS=1) # pkg-config set(PACKAGE_TARNAME ${PROJECT_NAME}) set(prefix "${CMAKE_INSTALL_PREFIX}") set(exec_prefix "\${prefix}") set(libdir "\${exec_prefix}/lib") set(includedir "\${prefix}/include") configure_file(lib${PROJECT_NAME}.pc.in libxmp.pc @ONLY) # install install( TARGETS xmp-lite ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin) install( FILES include/libxmp-lite/xmp.h DESTINATION include/libxmp-lite) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/libxmp.pc DESTINATION lib/pkgconfig ) ================================================ FILE: packages/sx05re/libretro/easyrpg/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="easyrpg" PKG_VERSION="69aaeb2d8bf17eee565ac3e46a98809a9ebe4df0" PKG_REV="2" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/easyrpg/player" PKG_URL="${PKG_SITE}.git" PKG_GIT_CLONE_BRANCH="0-7-0-stable" PKG_DEPENDS_TARGET="toolchain zlib libfmt liblcf pixman libspeexdsp mpg123-compat libsndfile libvorbis opusfile wildmidi libxmp-lite libpng" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="An unofficial libretro port of the EasyRPG/Player." PKG_LONGDESC="An unofficial libretro port of the EasyRPG/Player." GET_HANDLER_SUPPORT="git" PKG_BUILD_FLAGS="+pic" PKG_IS_ADDON="no" PKG_AUTORECONF="no" PKG_CMAKE_OPTS_TARGET="-DPLAYER_TARGET_PLATFORM=libretro \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_BUILD_TYPE=Release" pre_make_target() { find ${PKG_BUILD} -name flags.make -exec sed -i "s:isystem :I:g" \{} \; find ${PKG_BUILD} -name build.ninja -exec sed -i "s:isystem :I:g" \{} \; } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/.${TARGET_NAME}/easyrpg_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/easyrpg/patches/easyrpg-disable-manpage-doxygen.patch ================================================ ================================================ FILE: packages/sx05re/libretro/emuscv/package.mk ================================================ # SPDX-License-Identifier: GPL-3.0-or-later PKG_NAME="emuscv" PKG_VERSION="dfce10df090ce3f5eb23bdbee289702ec1478246" PKG_SHA256="" PKG_LICENSE="GPL-3.0-or-later" PKG_SITE="https://gitlab.com/MaaaX-EmuSCV/libretro-emuscv" PKG_URL="${PKG_SITE}.git" PKG_ARCH="any" PKG_SECTION="emuelec/libretro" PKG_DEPENDS_TARGET="toolchain SDL2 zlib" PKG_SHORTDESC="EmuSCV libretro core" PKG_TOOLCHAIN="make" PKG_GIT_CLONE_SINGLE="yes" pre_make_target() { export PATH="${SYSROOT_PREFIX}/usr/bin:${PATH}" mkdir -p sys : > sys/io.h sed -i 's|-I/usr/include/SDL2||g' Makefile.libretro } make_target() { make -f Makefile.libretro platform=unix \ CC="${CC}" CXX="${CXX}" AR="${AR}" RANLIB="${RANLIB}" STRIP="${STRIP}" } makeinstall_target() { mkdir -p "${INSTALL}/usr/lib/libretro" cp emuscv_libretro.so "${INSTALL}/usr/lib/libretro/" } ================================================ FILE: packages/sx05re/libretro/emux-sms/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="emux-sms" PKG_VERSION="640d4bae7d4757f5377dbeb42f2d02763895095c" PKG_SHA256="6bacec4fb2d71976e577f267732a70f2da5caa73cbe9ff928794ec6708dd8dc7" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/emux" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Libretro port of Emux" PKG_LONGDESC="Emux is a cross-platform emulator project supporting various machines with an architecture inspired by the Linux kernel." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make -C libretro -f Makefile.lakka MACHINE=sms } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp libretro/emux_sms_libretro.so ${INSTALL}/usr/lib/libretro/emux_sms_libretro.so } ================================================ FILE: packages/sx05re/libretro/emux-sms/patches/emux-sms-01-buildfix.patch ================================================ diff -Naur emux.git/libretro/Makefile.lakka emux.patch/libretro/Makefile.lakka --- emux.git/libretro/Makefile.lakka 1970-01-01 01:00:00.000000000 +0100 +++ emux.patch/libretro/Makefile.lakka 2016-05-12 08:46:58.338888783 +0200 @@ -0,0 +1,65 @@ +HOST_PLATFORM = linux + +TARGET_PLATFORM = lakka + +OBJEXT = .o +SOEXT = .so + +################ +# Platform setup + +STATIC_LINKING = 0 +platform = unix +PLATDEFS = +PLATCFLAGS = -fpic -fstrict-aliasing +PLATCXXFLAGS = -fpic -fstrict-aliasing +PLATLDFLAGS = -shared -lm -Wl,-version-script=$(BUILD_DIR)/link.T -Wl,-no-undefined +PLATLDXFLAGS = -shared -lm -Wl,-version-script=$(BUILD_DIR)/link.T -Wl,-no-undefined + +################ +# libretro setup + +RETRODEFS = -D__LIBRETRO__ +RETROCFLAGS = +RETROCXXFLAGS = +RETROLDFLAGS = +RETROLDXFLAGS = + +################# +# Final variables + +DEFINES += $(PLATDEFS) $(RETRODEFS) +CFLAGS += $(PLATCFLAGS) $(RETROCFLAGS) $(DEFINES) $(INCLUDES) +CXXFLAGS += $(PLATCXXFLAGS) $(RETROCXXFLAGS) $(DEFINES) $(INCLUDES) +LDFLAGS += $(PLATLDFLAGS) $(RETROLDFLAGS) +LDXFLAGS += $(PLATLDXFLAGS) $(RETROLDXFLAGS) + +######## +# Tuning + +ifneq ($(DEBUG),) + CFLAGS += -O0 -g + CXXFLAGS += -O0 -g +else + CFLAGS += -O3 -DNDEBUG + CXXFLAGS += -O3 -DNDEBUG +endif + +ifneq ($(LOG_PERFORMANCE),) + CFLAGS += -DLOG_PERFORMANCE + CXXFLAGS += -DLOG_PERFORMANCE +endif + +#################################### +# Variable setup for Makefile.common + +CORE_DIR ?= .. +BUILD_DIR ?= . +INCLUDES = + +include $(BUILD_DIR)/Makefile.common + +############### +# Include rules + +include $(BUILD_DIR)/Makefile.rules ================================================ FILE: packages/sx05re/libretro/ep128emu/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # EmuELEC package for ep128emu libretro core PKG_NAME="ep128emu" PKG_VERSION="a9e857e70466f95cfd54b4e5f2b30453b581e822" PKG_LICENSE="GPL-2.0-only" PKG_SITE="https://github.com/libretro/ep128emu-core" PKG_URL="${PKG_SITE}.git" PKG_ARCH="any" PKG_SECTION="emuelec/libretro" PKG_DEPENDS_TARGET="toolchain" PKG_SHORTDESC="Enterprise 64/128 (ep128emu) libretro core" PKG_LONGDESC="Libretro core version of ep128emu, emulating Enterprise 64/128, Videoton TVC, Amstrad CPC and ZX Spectrum home computers." PKG_TOOLCHAIN="make" PKG_GIT_CLONE_BRANCH="core" pre_make_target() { : } make_target() { make -C "${PKG_BUILD}" \ CC="${CC}" \ CXX="${CXX}" \ AR="${AR}" } makeinstall_target() { mkdir -p "${INSTALL}/usr/lib/libretro" cp "${PKG_BUILD}/ep128emu_core_libretro.so" \ "${INSTALL}/usr/lib/libretro/" } ================================================ FILE: packages/sx05re/libretro/fake_08/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="fake_08" PKG_VERSION="0d26fd59103941e5f95e0ee665c6e0fb8c6b6f03" PKG_LICENSE="MIT" PKG_SITE="https://github.com/jtothebell/fake-08" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_SHORTDESC="A Pico-8 player/emulator for console homebrew" pre_configure_target() { PKG_MAKE_OPTS_TARGET="-C ${PKG_BUILD}/platform/libretro" } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp -v ${PKG_BUILD}/platform/libretro/fake08_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/fbalpha/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="fbalpha" PKG_VERSION="0581797db6fdffd826086b053ced4b6b29bb6678" PKG_SHA256="96812000a349e413d63bc5ef04ab7a330bb0b4194047c048ed6ec549b8274936" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" PKG_SITE="https://github.com/libretro/fbalpha" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of Final Burn Alpha to Libretro (v0.2.97.38)." PKG_LONGDESC="Currently, FB Alpha supports games on Capcom CPS-1 and CPS-2 hardware, SNK Neo-Geo hardware, Toaplan hardware, Cave hardware, and various games on miscellaneous hardware. " PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { if [ "${ARCH}" == "arm" ]; then if [[ "${TARGET_FPU}" =~ "neon" ]]; then make -f makefile.libretro CC=${CC} CXX=${CXX} HAVE_NEON=1 profile=performance else make -f makefile.libretro CC=${CC} CXX=${CXX} profile=performance fi else make -f makefile.libretro CC=${CC} CXX=${CXX} profile=accuracy fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp fbalpha_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/fbalpha2012/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="fbalpha2012" PKG_VERSION="77167cea72e808384c136c8c163a6b4975ce7a84" PKG_SHA256="14e19d8f2d9e464960ad504a4efb731ba63253c18be6bbfb33a6d70ce7d95d79" PKG_ARCH="any" PKG_LICENSE="Non-commercial" PKG_SITE="https://github.com/libretro/fbalpha2012" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of Final Burn Alpha 2012 to Libretro" PKG_TOOLCHAIN="make" make_target() { cd svn-current/trunk if [ "${ARCH}" == "arm" ]; then make -f makefile.libretro platform=armv CC=${CC} CXX=${CXX} else make -f makefile.libretro CC=${CC} CXX=${CXX} fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp fbalpha2012_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/fbneo/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="fbneo" PKG_VERSION="9a5899faba4d0c67d5f4cf56bcd5633d9e6e061d" PKG_SHA256="f1fa098ae7f14f0ca652611a5a9a563b21702599760fa4afa153a8848578999f" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" PKG_SITE="https://github.com/libretro/FBNeo" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="libretro" PKG_SHORTDESC="Port of Final Burn Neo to Libretro (v0.2.97.38)." PKG_LONGDESC="Currently, FB neo supports games on Capcom CPS-1 and CPS-2 hardware, SNK Neo-Geo hardware, Toaplan hardware, Cave hardware, and various games on miscellaneous hardware. " PKG_TOOLCHAIN="make" pre_configure_target() { sed -i "s|LDFLAGS += -static-libgcc -static-libstdc++|LDFLAGS += -static-libgcc|" ./src/burner/libretro/Makefile PKG_MAKE_OPTS_TARGET=" -C ./src/burner/libretro USE_CYCLONE=0 profile=performance" if [[ "${TARGET_FPU}" =~ "neon" ]]; then PKG_MAKE_OPTS_TARGET+=" HAVE_NEON=1" fi if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then if [ "${ARCH}" == "arm" ]; then PKG_MAKE_OPTS_TARGET+=" platform=classic_armv8_a35" fi fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/src/burner/libretro/fbneo_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/fceumm/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="fceumm" #PKG_VERSION="449db5de6b56e9d44fc685e1b38399f0b233bd28" PKG_VERSION="5cd4a43e16a7f3cd35628d481c347a0a98cfdfa2" #PKG_SHA256="5cac184772421ec3cffa19f50737a5fdd481089007d21d79b3e2760f94c8fa87" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/libretro-fceumm" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of FCEUmm / FCEUX to Libretro." PKG_LONGDESC="FCEUX is a Nintendo Entertainment System (NES), Famicom, and Famicom Disk System (FDS) emulator." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make -f Makefile.libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp fceumm_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/fceumm-mod/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="fceumm-mod" PKG_VERSION="f0ea52190427b136a51da4490e49087fe2ca2abb" PKG_SHA256="acfa9de9520db21bd36fd567a8d069970884e60ee021ede05211ad3f5ba9767e" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/Tippek/libretro-fceumm-mod" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of FCEUmm / FCEUX to Libretro." PKG_LONGDESC="FCEUX is a Nintendo Entertainment System (NES), Famicom, and Famicom Disk System (FDS) emulator." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make -f Makefile.libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/fceumm_mod_libretro.* ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/flycast/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="flycast" PKG_VERSION="$(get_pkg_version flycastsa)" PKG_NEED_UNPACK="$(get_pkg_directory flycastsa)" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/flyinghead/flycast" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain ${OPENGLES}" PKG_SHORTDESC="Flycast is a multiplatform Sega Dreamcast emulator" PKG_BUILD_FLAGS="-lto" PKG_TOOLCHAIN="cmake" PKG_CMAKE_OPTS_TARGET="-DLIBRETRO=ON \ -DUSE_OPENMP=OFF \ -DCMAKE_BUILD_TYPE=Release \ -DUSE_GLES2=OFF \ -DUSE_GLES=ON \ -DUSE_VULKAN=OFF" pre_make_target() { find ${PKG_BUILD} -name flags.make -exec sed -i "s:isystem :I:g" \{} \; find ${PKG_BUILD} -name build.ninja -exec sed -i "s:isystem :I:g" \{} \; } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro if [ "${ARCH}" == "arm" ]; then cp flycast_libretro.so ${INSTALL}/usr/lib/libretro/flycast_32b_libretro.so else cp flycast_libretro.so ${INSTALL}/usr/lib/libretro/ fi } ================================================ FILE: packages/sx05re/libretro/flycast/patches/Amlogic/flycast-01-buildfix.patch ================================================ --- a/Makefile +++ b/Makefile @@ -23,20 +23,10 @@ TARGET_NAME := flycast -ifeq ($(HAVE_CLANG),1) - CXX = ${CC_PREFIX}clang++ - CC = ${CC_PREFIX}clang - SHARED := -fuse-ld=lld -else - CXX ?= ${CC_PREFIX}g++ - CC ?= ${CC_PREFIX}gcc - SHARED := -endif + ifeq ($(HAVE_LTCG),1) SHARED += -flto endif - -CC_AS ?= ${CC_PREFIX}as MFLAGS := ASFLAGS := @@ -1033,7 +1023,7 @@ PREFIX ?= /usr/local ifneq (,$(findstring arm, $(ARCH))) - CC_AS = ${CC_PREFIX}gcc #The ngen_arm.S must be compiled with gcc, not as + CC_AS = ${CC_PREFIX}${CC} #The ngen_arm.S must be compiled with gcc, not as ASFLAGS += $(CFLAGS) endif ================================================ FILE: packages/sx05re/libretro/flycast/patches/Amlogic/flycast-02-set_optim.patch ================================================ --- a/Makefile +++ b/Makefile @@ -1,3 +1,4 @@ +SET_OPTIM := -O3 DEBUG := 0 NO_REND := 0 HAVE_GL := 1 @@ -861,7 +862,7 @@ ifneq (,$(findstring msvc,$(platform))) OPTFLAGS := -O2 else ifneq ($(platform), classic_armv7_a7) - OPTFLAGS := -O3 + OPTFLAGS := $(SET_OPTIM) endif CORE_DEFINES += -DNDEBUG ================================================ FILE: packages/sx05re/libretro/fmsx-libretro/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="fmsx-libretro" PKG_VERSION="fbe4dfc4c3e3f7eb27089def3d663a905b181845" PKG_SHA256="6d95d777ccc9f918b97aea223e7d88149f1c4fa54fc6c1a37664b258b2b11456" PKG_ARCH="any" PKG_LICENSE="OPEN/NON-COMMERCIAL" PKG_SITE="https://github.com/libretro/fmsx-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SHORTDESC="Port of fMSX to the libretro API. " PKG_TOOLCHAIN="make" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp fmsx_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/freechaf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # EmuELEC / LibreELEC style package for libretro FreeChaF core PKG_NAME="freechaf" PKG_VERSION="cdb8ad6fcecb276761b193650f5ce9ae8b878067" PKG_SHA256="" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/FreeChaF" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="emuelec/libretro" PKG_SHORTDESC="FreeChaF libretro core (Fairchild Channel F)" PKG_LONGDESC="FreeChaF is a libretro emulation core for the Fairchild Channel F / Video Entertainment System." PKG_TOOLCHAIN="make" PKG_GIT_CLONE_SINGLE="yes" PKG_MAKE_OPTS_TARGET="platform=unix" makeinstall_target() { mkdir -p "${INSTALL}/usr/lib/libretro" cp "${PKG_BUILD}/freechaf_libretro.so" "${INSTALL}/usr/lib/libretro/" } ================================================ FILE: packages/sx05re/libretro/freeintv/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="freeintv" PKG_VERSION="6efc4b8fd4c7423ec1f5ff1913b854529135b565" PKG_SHA256="5bb5e060dc1445aad0559136124a4c0235e35810500bacaa073018866dc54653" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/FreeIntv" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="FreeIntv is a libretro emulation core for the Mattel Intellivision." PKG_LONGDESC="FreeIntv is a libretro emulation core for the Mattel Intellivision." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp freeintv_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/freej2me/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="freej2me" PKG_VERSION="8b9bc8a19baf26e3d92f88934a64a32f1cbc2795" PKG_SHA256="cec467023fed435e10fdb64147d962717aa81c0e43170c22cdebeeddcd7e21db" PKG_ARCH="any" PKG_SITE="https://github.com/hex007/freej2me" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2 libogg libvorbisidec libvpx libpng apache-ant:host" PKG_SHORTDESC="A free J2ME emulator with libretro, awt and sdl2 frontends." PKG_TOOLCHAIN="make" pre_configure_target() { ${TOOLCHAIN}/bin/ant } make_target(){ ## SDL2 is not needed for the libretro core and .jar files ## but in case you need it, here are the commands #sed -i "s|g++|${CXX}|g" ${PKG_BUILD}/src/sdl2/Makefile #PKG_MAKE_OPTS_TARGET=" -C ${PKG_BUILD}/src/sdl2" #make ${PKG_MAKE_OPTS_TARGET} #mkdir -p ${INSTALL}/usr/bin #cp ${PKG_BUILD}/src/sdl2/sdl_interface ${INSTALL}/usr/bin PKG_MAKE_OPTS_TARGET=" -C ${PKG_BUILD}/src/libretro" make ${PKG_MAKE_OPTS_TARGET} } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp `find . -name "freej2me_libretro.so" | xargs echo` ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/build/freej2me-lr.jar ${INSTALL}/usr/lib/libretro mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/*.sh ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/libretro/freej2me/patches/01-emuelec-paths.patch ================================================ --- a/src/javax/microedition/rms/RecordStore.java +++ b/src/javax/microedition/rms/RecordStore.java @@ -70,8 +70,8 @@ appname = Mobile.getPlatform().loader.suitename; - rmsPath = Mobile.getPlatform().dataPath + "./rms/"+appname; - rmsFile = Mobile.getPlatform().dataPath + "./rms/"+appname+"/"+recordStoreName; + rmsPath = "/storage/roms/freej2me/freej2me/rms/"+appname; + rmsFile = "/storage/roms/freej2me/freej2me/rms/"+appname+"/"+recordStoreName; try { @@ -244,7 +244,7 @@ { try { - File fstore = new File(Mobile.getPlatform().dataPath + "./rms/"+Mobile.getPlatform().loader.suitename+"/"+recordStoreName); + File fstore = new File("/storage/roms/freej2me/freej2me/rms/"+Mobile.getPlatform().loader.suitename+"/"+recordStoreName); fstore.delete(); } catch (Exception e) @@ -347,7 +347,7 @@ //System.out.println("List Record Stores"); if(rmsPath==null) { - rmsPath = Mobile.getPlatform().dataPath + "./rms/"+Mobile.getPlatform().loader.name; + rmsPath = "/storage/roms/freej2me/freej2me/rms/"+Mobile.getPlatform().loader.name; try { Files.createDirectories(Paths.get(rmsPath)); ================================================ FILE: packages/sx05re/libretro/freej2me/scripts/freej2me.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) . /etc/profile # Lets check if java is installed and up to date, called from profile install_java if [[ -f "/storage/roms/bios/jdk/eeversion" ]]; then cp -rf /usr/lib/libretro/freej2me-lr.jar ${HOME}/roms/bios else exit 1 fi exit 0 ================================================ FILE: packages/sx05re/libretro/frodo/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="frodo" PKG_VERSION="4c1501686ac0a6815d6dc410556029b6577fd7ec" PKG_SHA256="6a009da4b9b83c3e0f103bfaeaf7f1dfc388e7488ecef5657c2f4a66d20819b7" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/r-type/frodo-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Frodo - The free portable C64 emulator" PKG_LONGDESC="Frodo - The free portable C64 emulator" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { #if [ "${ARCH}" == "arm" ]; then # CFLAGS="${CFLAGS} -DARM -DALIGN_DWORD -mstructure-size-boundary=32 -mthumb-interwork -falign-functions=16 -marm" #fi make -f Makefile.libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp frodo_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/fsuae/package.mk ================================================ ################################################################################ # This file is part of LibreELEC - http://www.libreelec.tv # Copyright (C) 2016 Team LibreELEC # # LibreELEC is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # LibreELEC is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LibreELEC. If not, see . ################################################################################ PKG_NAME="fsuae" PKG_VERSION="06e3030a46a6063aa0f7028c269d972f06c46d5d" PKG_SHA256="60c601d537ae416e29f7f30426d41879d6a473e57c548d7de516749091ece8ff" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/libretro-fsuae" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libmpeg2 openal-soft glib" PKG_SECTION="emulation" PKG_SHORTDESC="FS-UAE amiga emulator libretro core." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="yes" PKG_BUILD_FLAGS="-lto" case ${PROJECT} in RPi*) PKG_CONFIGURE_OPTS_TARGET="--disable-jit --enable-neon" ;; esac pre_configure_target() { cd ${BUILD}/${PKG_NAME}-${PKG_VERSION} rm -rf .${TARGET_NAME} export ac_cv_func_realloc_0_nonnull=yes } make_target() { make CC=${HOST_CC} CFLAGS= gen make CC=${CC} } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp fsuae_libretro.so ${INSTALL}/usr/lib/libretro/ mkdir -p ${INSTALL}/usr/share/fs-uae cp fs-uae.dat ${INSTALL}/usr/share/fs-uae/ } ================================================ FILE: packages/sx05re/libretro/fsuae/patches/fsuae-libretro-001-link-glib.patch ================================================ --- a/Makefile.in 2016-09-16 14:46:15.352407556 +0000 +++ b/Makefile.in 2016-09-16 14:46:31.459074122 +0000 @@ -33,7 +33,7 @@ CC = gcc TARGET := $(TARGET_NAME)_libretro.so fpic := -fPIC - LDFLAGS := -lz -lpthread + LDFLAGS := -lz -lpthread -lglib-2.0 SHARED := -shared -Wl,--version-script=$(CORE_DIR)/libretro/link.T ifeq ($(USE_JIT), 1) ifeq ($(TARGET_ARCH), x86_64) # JIT => address space 32 bits ================================================ FILE: packages/sx05re/libretro/fuse-libretro/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="fuse-libretro" PKG_VERSION="cad85b7b1b864c65734f71aa4a510b6f6536881c" PKG_SHA256="6fda1a3ffc0d2faeebe27fae94e5b7790337dd96d1ea29922ad804a425d2852b" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/fuse-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="A port of the Fuse Unix Spectrum Emulator to libretro " PKG_LONGDESC="A port of the Fuse Unix Spectrum Emulator to libretro " PKG_TOOLCHAIN="make" make_target() { if [ "${DEVICE}" == "Amlogic-ng" ] || [ "${DEVICE}" == "Amlogic-no" ] || [ "${DEVICE}" == "Amlogic-ogu" ]; then make -f Makefile.libretro platform=rpi4_64 else make -f Makefile.libretro platform=rpi3_64 fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp fuse_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/gambatte/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="gambatte" PKG_VERSION="b75225203ffea8b65124bb31acb598e91e7f22d9" PKG_SHA256="52352417d719221ae2813b3dec8277508319171fe74e35196a9765881fb109bd" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/gambatte-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="libretro implementation of libgambatte" PKG_LONGDESC="Gambatte is an open-source Game Boy Color emulator written for fun and made available in the hope that it will be useful." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make -f Makefile.libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp gambatte_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/gearboy/package.mk ================================================ PKG_NAME="gearboy" PKG_VERSION="3da04945eb5d34b67267b8aed3cec3d31d9a1999" PKG_SHA256="0da08b65d8ceed524d87fe44e92b8e7f0c5164c195b8c38b5b51adae6641eec7" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/drhelius/Gearboy" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Game Boy / Gameboy Color emulator for iOS, Mac, Raspberry Pi, Windows and Linux" PKG_LONGDESC="Game Boy / Gameboy Color emulator for iOS, Mac, Raspberry Pi, Windows and Linux" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make -C platforms/libretro/ } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp platforms/libretro/gearboy_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/gearcoleco/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="gearcoleco" PKG_VERSION="b09cd197551c8a4cfd64673c498cfa68c84dc02a" PKG_SHA256="ad107b942c271dd366348c9f1970d61187d0269b73910da1487ca99b84eef605" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/drhelius/Gearcoleco" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="libretro" PKG_LONGDESC="Gearcoleco is a very accurate cross-platform ColecoVision emulator written in C++" PKG_TOOLCHAIN="make" make_target() { make -C platforms/libretro/ } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp platforms/libretro/gearcoleco_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/geargrafx/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="geargrafx" PKG_VERSION="12e994ffcb6d051289d7875d3670fd8fce9c7a62" #PKG_SHA256="7918b813b74573e2d91c1d8ea511097897e1c5a3b429008ba48f50fd44630980" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/drhelius/Geargrafx/" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="libretro" PKG_LONGDESC="Geargrafz is a very accurate cross-platform Turbografx emulator written in C++" PKG_TOOLCHAIN="make" make_target() { make -C platforms/libretro/ } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp platforms/libretro/geargrafx_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/gearlynx/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="gearlynx" PKG_VERSION="9dbb7449d4e35a9240f7091de8856fb9156def48" PKG_SHA256="9621f641bddb58a29d5fcb8ba17c1fe2143d3f921e279be5c208b92ebcafe7d2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/drhelius/Gearlynx/" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="libretro" PKG_LONGDESC="Gearlynx is a very accurate cross-platform Atari Lynx emulator written in C++" PKG_TOOLCHAIN="make" make_target() { make -C platforms/libretro/ } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp platforms/libretro/gearlynx_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/gearsystem/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="gearsystem" PKG_VERSION="c1592d77ee3ab7f2ae7f4ae78a62b9d17cd75cbb" PKG_SHA256="b930097d9efee54f8dd1d6c9151be3f6efb134b0ac3abc0d554ea7ede4f01bb4" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/drhelius/Gearsystem" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Gearsystem is a Sega Master System / Game Gear / SG-1000 emulator written in C++" PKG_LONGDESC="Gearsystem is a Sega Master System / Game Gear / SG-1000 emulator written in C++" PKG_TOOLCHAIN="make" GET_HANDLER_SUPPORT="git" make_target() { make -C platforms/libretro/ } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp platforms/libretro/gearsystem_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/genesis-plus-gx/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="genesis-plus-gx" PKG_VERSION="cecccacf767b1c8e86af3e315223b052a7f81b95" PKG_SHA256="8a3fa4dada19046a953f7ed65be9ff0f5eb47e169a917fe6e3616b5cf187acc7" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" PKG_SITE="https://github.com/libretro/Genesis-Plus-GX" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="An enhanced port of Genesis Plus for Gamecube/Wii" PKG_LONGDESC="Genesis Plus GX is an open-source & portable Sega Mega Drive / Genesis emulator, now also emulating SG-1000, Master System, Game Gear and Sega/Mega CD hardware." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { if [ "${ARCH}" == "arm" ]; then CFLAGS="${CFLAGS} -DALIGN_LONG" fi make -f Makefile.libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp genesis_plus_gx_libretro.so ${INSTALL}/usr/lib/libretro/genesis_plus_gx_libretro.so } ================================================ FILE: packages/sx05re/libretro/genesis-plus-gx-wide/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="genesis-plus-gx-wide" PKG_VERSION="b7d314220d755537aebb7bc1750ac21f764365c4" PKG_SHA256="ffbf0ad2c669e03f4400e789a88c4b0c7546115425bfe2ace46bd1070a7774f2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" PKG_SITE="https://github.com/libretro/Genesis-Plus-GX-Wide" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Widescreen modification of Genesis Plus GX" PKG_LONGDESC="Genesis Plus GX is an open-source & portable Sega Mega Drive / Genesis emulator, now also emulating SG-1000, Master System, Game Gear and Sega/Mega CD hardware." PKG_TOOLCHAIN="make" make_target() { if [ "${ARCH}" == "arm" ]; then CFLAGS="${CFLAGS} -DALIGN_LONG" fi make -f Makefile.libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp genesis_plus_gx_wide_libretro.so ${INSTALL}/usr/lib/libretro/genesis_plus_gx_wide_libretro.so } ================================================ FILE: packages/sx05re/libretro/genesis_plus_gx_cart_special/genesis_plus_gx_cart_special.info ================================================ # Software Information display_name = "Sega - MS/GG/MD/CD (Genesis Plus GX)" authors = "Charles McDonald|Eke-Eke" supported_extensions = "mdx|md|smd|gen|bin|cue|iso|sms|bms|gg|sg|68k|sgd|chd|m3u" corename = "Genesis Plus GX" categories = "Emulator" license = "Non-commercial" permissions = "" display_version = "v1.7.4" # Hardware Information manufacturer = "Sega" systemname = "Sega 8/16-bit (Various)" systemid = "mega_drive" # Libretro Features supports_no_game = "false" savestate = "true" savestate_features = "deterministic" cheats = "true" input_descriptors = "true" memory_descriptors = "true" libretro_saves = "true" core_options = "true" core_options_version = "2.0" database = "Sega - Game Gear|Sega - Master System - Mark III|Sega - Mega-CD - Sega CD|Sega - Mega Drive - Genesis|Sega - PICO|Sega - SG-1000" hw_render = "false" needs_fullpath = "true" disk_control = "true" # BIOS / Firmware firmware_count = 12 firmware0_desc = "bios_MD.bin (Mega Drive startup ROM)" firmware0_path = "bios_MD.bin" firmware0_opt = "true" firmware1_desc = "bios_CD_E.bin (MegaCD EU BIOS)" firmware1_path = "bios_CD_E.bin" firmware1_opt = "true" firmware2_desc = "bios_CD_U.bin (SegaCD US BIOS)" firmware2_path = "bios_CD_U.bin" firmware2_opt = "true" firmware3_desc = "bios_CD_J.bin (MegaCD JP BIOS)" firmware3_path = "bios_CD_J.bin" firmware3_opt = "true" firmware4_desc = "bios_E.sms (MasterSystem EU BIOS)" firmware4_path = "bios_E.sms" firmware4_opt = "true" firmware5_desc = "bios_U.sms (MasterSystem US BIOS)" firmware5_path = "bios_U.sms" firmware5_opt = "true" firmware6_desc = "bios_J.sms (MasterSystem JP BIOS)" firmware6_path = "bios_J.sms" firmware6_opt = "true" firmware7_desc = "bios.gg (GameGear BIOS)" firmware7_path = "bios.gg" firmware7_opt = "true" firmware8_desc = "sk.bin (Sonic & Knuckles ROM)" firmware8_path = "sk.bin" firmware8_opt = "true" firmware9_desc = "sk2chip.bin (Sonic & Knuckles UPMEM ROM)" firmware9_path = "sk2chip.bin" firmware9_opt = "true" firmware10_desc = "areplay.bin (Action Replay ROM)" firmware10_path = "areplay.bin" firmware10_opt = "true" firmware11_desc = "ggenie.bin (Game Genie ROM)" firmware11_path = "ggenie.bin" firmware11_opt = "true" notes = "(!) sk2chip.bin (md5): b4e76e416b887f4e7413ba76fa735f16|(!) sk.bin (md5): 4ea493ea4e9f6c9ebfccbdb15110367e" description = "A port of the Genesis Plus GX emulator to libretro. Originally designed to run on the Wii console via homebrew, Genesis Plus GX was one of the first cores ported to libretro, and it has always been the first choice for any 8- and 16-bit Sega consoles, from Master System to Game Gear to Genesis/Mega Drive to Sega CD. Only the 32X is not supported. The core is both fast and highly accurate and it benefits from a tight and feature-filled integration with libretro." ================================================ FILE: packages/sx05re/libretro/genesis_plus_gx_cart_special/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="genesis_plus_gx_cart_special" PKG_VERSION="17c9c5e98cc379b708a081bbf40d939c2481b1e8" PKG_SHA256="83b868ef317e2dbad00efbe9ceb867ed6ece6308d646c438ec76fc8dd39d4ad7" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" PKG_SITE="https://github.com/libretro/Genesis-Plus-GX" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="An enhanced port of Genesis Plus for Gamecube/Wii" PKG_LONGDESC="Genesis Plus GX is an open-source & portable Sega Mega Drive / Genesis emulator, now also emulating SG-1000, Master System, Game Gear and Sega/Mega CD hardware." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { if [ "${ARCH}" == "arm" ]; then CFLAGS="${CFLAGS} -DALIGN_LONG" fi make -f Makefile.libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp genesis_plus_gx_libretro.so ${INSTALL}/usr/lib/libretro/${PKG_NAME}_libretro.so cp -f ${PKG_DIR}/genesis_plus_gx_cart_special.info ${INSTALL}/usr/lib/libretro/${PKG_NAME}_libretro.info } ================================================ FILE: packages/sx05re/libretro/genesis_plus_gx_cart_special/patches/ae77caee6d249667d3cbdbb1bcdfa8d5186f949b.patch ================================================ From ae77caee6d249667d3cbdbb1bcdfa8d5186f949b Mon Sep 17 00:00:00 2001 From: Adventurous Programmer <47227694+Diegrosan@users.noreply.github.com> Date: Wed, 9 Jul 2025 20:37:07 -0300 Subject: [PATCH] por --- Makefile.libretro | 20 +- core/cart_hw/md_cart.c | 31 + core/cart_hw/md_cart.h | 1 + core/cart_hw/minimp3.h | 1865 +++++++++ core/cart_hw/minimp3_ex.h | 1397 +++++++ core/cart_hw/paprium.h | 2863 ++++++++++++++ core/cd_hw/cdd.c | 155 +- core/m68k/m68kcpu.c | 14 + core/m68k/m68kcpu.h | 4 +- core/m68k/m68kd.h | 1162 ++++++ core/m68k/m68kops.h | 10 +- core/m68k/s68kcpu.c | 16 +- core/m68k/s68kd.h | 1153 ++++++ core/memz80.c | 38 + core/sound/blip_buf.c | 722 ++-- core/sound/blip_buf.h | 23 +- core/sound/blip_lpf.h | 313 ++ core/sound/blip_lpf_192K.h | 7 + core/sound/blip_lpf_192K_24K.h | 297 ++ core/sound/blip_lpf_192K_48K.h | 297 ++ core/sound/blip_lpf_192K_96K.h | 297 ++ core/sound/blip_lpf_384K.h | 8 + core/sound/blip_lpf_384K_192K.h | 591 +++ core/sound/blip_lpf_384K_24K.h | 591 +++ core/sound/blip_lpf_384K_48K.h | 591 +++ core/sound/blip_lpf_384K_96K.h | 591 +++ core/sound/blip_lpf_48K.h | 5 + core/sound/blip_lpf_48K_24K.h | 77 + core/sound/blip_lpf_768K.h | 9 + core/sound/blip_lpf_768K_192K.h | 1181 ++++++ core/sound/blip_lpf_768K_24K.h | 1181 ++++++ core/sound/blip_lpf_768K_384K.h | 1181 ++++++ core/sound/blip_lpf_768K_48K.h | 1181 ++++++ core/sound/blip_lpf_768K_96K.h | 1181 ++++++ core/sound/blip_lpf_96K.h | 6 + core/sound/blip_lpf_96K_24K.h | 151 + core/sound/blip_lpf_96K_48K.h | 151 + core/sound/opll.c | 11 +- core/sound/sound.c | 2 +- core/sound/ym2413.c | 2 +- core/sound/ym2612.c | 2 +- core/sound/ym3438.c | 30 + core/state.h | 3 +- core/system.c | 51 +- core/system.h | 4 +- core/vdp_ctrl.c | 169 +- core/vdp_render.c | 75 + core/z80/z80.c | 10 + libretro/Makefile.common | 14 +- libretro/debian/rules | 0 .../deps/libchdr/include/dr_libs/dr_flac.h | 2210 +---------- libretro/deps/libchdr/include/libchdr/cdrom.h | 6 +- libretro/deps/libchdr/include/libchdr/chd.h | 204 +- .../deps/libchdr/include/libchdr/coretypes.h | 81 +- libretro/deps/libchdr/src/libchdr_cdrom.c | 7 +- libretro/deps/libchdr/src/libchdr_chd.c | 990 +---- libretro/deps/libchdr/src/libchdr_flac.c | 23 +- libretro/deps/libchdr/src/libchdr_huffman.c | 20 +- libretro/jni/Android.mk | 2 +- libretro/libretro.c | 107 +- libretro/libretro_core_options.h | 3358 ++++++++++++++--- libretro/libretro_core_options_intl.h | 1650 +------- 62 files changed, 22768 insertions(+), 5624 deletions(-) create mode 100644 core/cart_hw/minimp3.h create mode 100644 core/cart_hw/minimp3_ex.h create mode 100644 core/cart_hw/paprium.h create mode 100644 core/m68k/m68kd.h create mode 100644 core/m68k/s68kd.h create mode 100644 core/sound/blip_lpf.h create mode 100644 core/sound/blip_lpf_192K.h create mode 100644 core/sound/blip_lpf_192K_24K.h create mode 100644 core/sound/blip_lpf_192K_48K.h create mode 100644 core/sound/blip_lpf_192K_96K.h create mode 100644 core/sound/blip_lpf_384K.h create mode 100644 core/sound/blip_lpf_384K_192K.h create mode 100644 core/sound/blip_lpf_384K_24K.h create mode 100644 core/sound/blip_lpf_384K_48K.h create mode 100644 core/sound/blip_lpf_384K_96K.h create mode 100644 core/sound/blip_lpf_48K.h create mode 100644 core/sound/blip_lpf_48K_24K.h create mode 100644 core/sound/blip_lpf_768K.h create mode 100644 core/sound/blip_lpf_768K_192K.h create mode 100644 core/sound/blip_lpf_768K_24K.h create mode 100644 core/sound/blip_lpf_768K_384K.h create mode 100644 core/sound/blip_lpf_768K_48K.h create mode 100644 core/sound/blip_lpf_768K_96K.h create mode 100644 core/sound/blip_lpf_96K.h create mode 100644 core/sound/blip_lpf_96K_24K.h create mode 100644 core/sound/blip_lpf_96K_48K.h mode change 100755 => 100644 libretro/debian/rules diff --git a/Makefile.libretro b/Makefile.libretro index a05ba9e83..0baa912d2 100644 --- a/Makefile.libretro +++ b/Makefile.libretro @@ -1,6 +1,7 @@ DEBUG = 0 LOGSOUND = 0 -FRONTEND_SUPPORTS_RGB565 = 1 +FRONTEND_SUPPORTS_RGB565 = 0 +FRONTEND_SUPPORTS_RGB888 = 1 HAVE_CHD = 1 HAVE_SYS_PARAM = 1 HOOK_CPU = 0 @@ -8,6 +9,7 @@ HAVE_CDROM = 0 USE_PER_SOUND_CHANNELS_CONFIG = 1 LOW_MEMORY = 0 MAX_ROM_SIZE = 10485760 +LTO ?= -flto CORE_DIR := . @@ -785,8 +787,8 @@ ifeq ($(platform), emscripten) CFLAGS += -O3 -DNDEBUG CXXFLAGS += -O3 -DNDEBUG else - CFLAGS += -O2 -DNDEBUG - CXXFLAGS += -O2 -DNDEBUG + CFLAGS += -O3 -DNDEBUG + CXXFLAGS += -O3 -DNDEBUG endif endif @@ -809,7 +811,7 @@ else endif ifeq ($(HAVE_CHD), 1) - DEFINES += -DUSE_LIBCHDR -D_7ZIP_ST -DZSTD_DISABLE_ASM -DUSE_LIBRETRO_VFS + DEFINES += -DUSE_LIBCHDR -D_7ZIP_ST -DUSE_LIBRETRO_VFS endif ifeq ($(USE_PER_SOUND_CHANNELS_CONFIG), 1) @@ -820,12 +822,15 @@ ifeq ($(LOW_MEMORY), 1) DEFINES += -DLOW_MEMORY endif -CFLAGS += $(fpic) $(DEFINES) $(CODE_DEFINES) $(FLAGS) -CXXFLAGS += $(fpic) $(DEFINES) $(CODE_DEFINES) $(FLAGS) +CFLAGS += $(fpic) $(DEFINES) $(CODE_DEFINES) $(FLAGS) -MMD +CXXFLAGS += $(fpic) $(DEFINES) $(CODE_DEFINES) $(FLAGS) -MMD ifeq ($(FRONTEND_SUPPORTS_RGB565), 1) # if you have a new frontend that supports RGB565 BPP_DEFINES = -DUSE_16BPP_RENDERING -DFRONTEND_SUPPORTS_RGB565 +else ifeq ($(FRONTEND_SUPPORTS_RGB888), 1) + # if you have a new frontend that supports RGB888 + BPP_DEFINES = -DUSE_32BPP_RENDERING -DFRONTEND_SUPPORTS_RGB888 else BPP_DEFINES = -DUSE_15BPP_RENDERING endif @@ -908,3 +913,6 @@ endif print-%: @echo '$*=$($*)' + +DEPENDS = ${OBJECTS:.o=.d} # substitutes ".o" with ".d" +-include ${DEPENDS} # copies files x.d, y.d, z.d (if they exist) diff --git a/core/cart_hw/md_cart.c b/core/cart_hw/md_cart.c index 766289da1..acb272707 100644 --- a/core/cart_hw/md_cart.c +++ b/core/cart_hw/md_cart.c @@ -94,6 +94,8 @@ static void topshooter_w(uint32 address, uint32 data); static uint32 tekken_regs_r(uint32 address); static void tekken_regs_w(uint32 address, uint32 data); +#include "paprium.h" + /* Games that need extra hardware emulation: - copy protection device - custom ROM banking device @@ -571,6 +573,15 @@ void md_cart_init(void) /* initialize SPI EEPROM board */ eeprom_spi_init(); } + else if (strstr(rominfo.product,"T-574120-00")) + { + cart.special |= HW_PAPRIUM; + + paprium_init(); + + /* initialize SPI EEPROM board */ + eeprom_spi_init(); + } else if (strstr(rominfo.ROMType,"SF") && strstr(rominfo.product,"001")) { /* SF-001 mapper */ @@ -848,6 +859,12 @@ void md_cart_reset(int hard_reset) megasd_reset(); } + /* MegaSD hardware */ + if (cart.special & HW_PAPRIUM) + { + paprium_reset(); + } + /* SVP chip */ if (svp) { @@ -935,6 +952,11 @@ int md_cart_context_save(uint8 *state) bufferptr += megasd_context_save(&state[bufferptr]); } + if (cart.special & HW_PAPRIUM) + { + save_param(&paprium_s, sizeof(paprium_s)); + } + return bufferptr; } @@ -997,6 +1019,15 @@ int md_cart_context_load(uint8 *state) bufferptr += megasd_context_load(&state[bufferptr]); } + if (cart.special & HW_PAPRIUM) + { + load_param(&paprium_s, sizeof(paprium_s)); + + paprium_map(); + + log_cb(RETRO_LOG_ERROR, "\n\n\n ############################\n\n\n"); + } + return bufferptr; } diff --git a/core/cart_hw/md_cart.h b/core/cart_hw/md_cart.h index 58687b9da..36d6d8599 100644 --- a/core/cart_hw/md_cart.h +++ b/core/cart_hw/md_cart.h @@ -65,6 +65,7 @@ #define HW_J_CART 0x04 #define HW_LOCK_ON 0x08 #define HW_MEGASD 0x10 +#define HW_PAPRIUM 0x20 /* Cartridge extra hardware */ typedef struct diff --git a/core/cart_hw/minimp3.h b/core/cart_hw/minimp3.h new file mode 100644 index 000000000..3220ae1a8 --- /dev/null +++ b/core/cart_hw/minimp3.h @@ -0,0 +1,1865 @@ +#ifndef MINIMP3_H +#define MINIMP3_H +/* + https://github.com/lieff/minimp3 + To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. + This software is distributed without any warranty. + See . +*/ +#include + +#define MINIMP3_MAX_SAMPLES_PER_FRAME (1152*2) + +typedef struct +{ + int frame_bytes, frame_offset, channels, hz, layer, bitrate_kbps; +} mp3dec_frame_info_t; + +typedef struct +{ + float mdct_overlap[2][9*32], qmf_state[15*2*32]; + int reserv, free_format_bytes; + unsigned char header[4], reserv_buf[511]; +} mp3dec_t; + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +void mp3dec_init(mp3dec_t *dec); +#ifndef MINIMP3_FLOAT_OUTPUT +typedef int16_t mp3d_sample_t; +#else /* MINIMP3_FLOAT_OUTPUT */ +typedef float mp3d_sample_t; +void mp3dec_f32_to_s16(const float *in, int16_t *out, int num_samples); +#endif /* MINIMP3_FLOAT_OUTPUT */ +int mp3dec_decode_frame(mp3dec_t *dec, const uint8_t *mp3, int mp3_bytes, mp3d_sample_t *pcm, mp3dec_frame_info_t *info); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* MINIMP3_H */ +#if defined(MINIMP3_IMPLEMENTATION) && !defined(_MINIMP3_IMPLEMENTATION_GUARD) +#define _MINIMP3_IMPLEMENTATION_GUARD + +#include +#include + +#define MAX_FREE_FORMAT_FRAME_SIZE 2304 /* more than ISO spec's */ +#ifndef MAX_FRAME_SYNC_MATCHES +#define MAX_FRAME_SYNC_MATCHES 10 +#endif /* MAX_FRAME_SYNC_MATCHES */ + +#define MAX_L3_FRAME_PAYLOAD_BYTES MAX_FREE_FORMAT_FRAME_SIZE /* MUST be >= 320000/8/32000*1152 = 1440 */ + +#define MAX_BITRESERVOIR_BYTES 511 +#define SHORT_BLOCK_TYPE 2 +#define STOP_BLOCK_TYPE 3 +#define MODE_MONO 3 +#define MODE_JOINT_STEREO 1 +#define HDR_SIZE 4 +#define HDR_IS_MONO(h) (((h[3]) & 0xC0) == 0xC0) +#define HDR_IS_MS_STEREO(h) (((h[3]) & 0xE0) == 0x60) +#define HDR_IS_FREE_FORMAT(h) (((h[2]) & 0xF0) == 0) +#define HDR_IS_CRC(h) (!((h[1]) & 1)) +#define HDR_TEST_PADDING(h) ((h[2]) & 0x2) +#define HDR_TEST_MPEG1(h) ((h[1]) & 0x8) +#define HDR_TEST_NOT_MPEG25(h) ((h[1]) & 0x10) +#define HDR_TEST_I_STEREO(h) ((h[3]) & 0x10) +#define HDR_TEST_MS_STEREO(h) ((h[3]) & 0x20) +#define HDR_GET_STEREO_MODE(h) (((h[3]) >> 6) & 3) +#define HDR_GET_STEREO_MODE_EXT(h) (((h[3]) >> 4) & 3) +#define HDR_GET_LAYER(h) (((h[1]) >> 1) & 3) +#define HDR_GET_BITRATE(h) ((h[2]) >> 4) +#define HDR_GET_SAMPLE_RATE(h) (((h[2]) >> 2) & 3) +#define HDR_GET_MY_SAMPLE_RATE(h) (HDR_GET_SAMPLE_RATE(h) + (((h[1] >> 3) & 1) + ((h[1] >> 4) & 1))*3) +#define HDR_IS_FRAME_576(h) ((h[1] & 14) == 2) +#define HDR_IS_LAYER_1(h) ((h[1] & 6) == 6) + +#define BITS_DEQUANTIZER_OUT -1 +#define MAX_SCF (255 + BITS_DEQUANTIZER_OUT*4 - 210) +#define MAX_SCFI ((MAX_SCF + 3) & ~3) + +#define MINIMP3_MIN(a, b) ((a) > (b) ? (b) : (a)) +#define MINIMP3_MAX(a, b) ((a) < (b) ? (b) : (a)) + +#if !defined(MINIMP3_NO_SIMD) + +#if !defined(MINIMP3_ONLY_SIMD) && (defined(_M_X64) || defined(__x86_64__) || defined(__aarch64__) || defined(_M_ARM64)) +/* x64 always have SSE2, arm64 always have neon, no need for generic code */ +#define MINIMP3_ONLY_SIMD +#endif /* SIMD checks... */ + +#if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))) || ((defined(__i386__) || defined(__x86_64__)) && defined(__SSE2__)) +#if defined(_MSC_VER) +#include +#endif /* defined(_MSC_VER) */ +#include +#define HAVE_SSE 1 +#define HAVE_SIMD 1 +#define VSTORE _mm_storeu_ps +#define VLD _mm_loadu_ps +#define VSET _mm_set1_ps +#define VADD _mm_add_ps +#define VSUB _mm_sub_ps +#define VMUL _mm_mul_ps +#define VMAC(a, x, y) _mm_add_ps(a, _mm_mul_ps(x, y)) +#define VMSB(a, x, y) _mm_sub_ps(a, _mm_mul_ps(x, y)) +#define VMUL_S(x, s) _mm_mul_ps(x, _mm_set1_ps(s)) +#define VREV(x) _mm_shuffle_ps(x, x, _MM_SHUFFLE(0, 1, 2, 3)) +typedef __m128 f4; +#if defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD) +#define minimp3_cpuid __cpuid +#else /* defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD) */ +static __inline__ __attribute__((always_inline)) void minimp3_cpuid(int CPUInfo[], const int InfoType) +{ +#if defined(__PIC__) + __asm__ __volatile__( +#if defined(__x86_64__) + "push %%rbx\n" + "cpuid\n" + "xchgl %%ebx, %1\n" + "pop %%rbx\n" +#else /* defined(__x86_64__) */ + "xchgl %%ebx, %1\n" + "cpuid\n" + "xchgl %%ebx, %1\n" +#endif /* defined(__x86_64__) */ + : "=a" (CPUInfo[0]), "=r" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) + : "a" (InfoType)); +#else /* defined(__PIC__) */ + __asm__ __volatile__( + "cpuid" + : "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) + : "a" (InfoType)); +#endif /* defined(__PIC__)*/ +} +#endif /* defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD) */ +static int have_simd(void) +{ +#ifdef MINIMP3_ONLY_SIMD + return 1; +#else /* MINIMP3_ONLY_SIMD */ + static int g_have_simd; + int CPUInfo[4]; +#ifdef MINIMP3_TEST + static int g_counter; + if (g_counter++ > 100) + return 0; +#endif /* MINIMP3_TEST */ + if (g_have_simd) + goto end; + minimp3_cpuid(CPUInfo, 0); + g_have_simd = 1; + if (CPUInfo[0] > 0) + { + minimp3_cpuid(CPUInfo, 1); + g_have_simd = (CPUInfo[3] & (1 << 26)) + 1; /* SSE2 */ + } +end: + return g_have_simd - 1; +#endif /* MINIMP3_ONLY_SIMD */ +} +#elif defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64) +#include +#define HAVE_SSE 0 +#define HAVE_SIMD 1 +#define VSTORE vst1q_f32 +#define VLD vld1q_f32 +#define VSET vmovq_n_f32 +#define VADD vaddq_f32 +#define VSUB vsubq_f32 +#define VMUL vmulq_f32 +#define VMAC(a, x, y) vmlaq_f32(a, x, y) +#define VMSB(a, x, y) vmlsq_f32(a, x, y) +#define VMUL_S(x, s) vmulq_f32(x, vmovq_n_f32(s)) +#define VREV(x) vcombine_f32(vget_high_f32(vrev64q_f32(x)), vget_low_f32(vrev64q_f32(x))) +typedef float32x4_t f4; +static int have_simd() +{ /* TODO: detect neon for !MINIMP3_ONLY_SIMD */ + return 1; +} +#else /* SIMD checks... */ +#define HAVE_SSE 0 +#define HAVE_SIMD 0 +#ifdef MINIMP3_ONLY_SIMD +#error MINIMP3_ONLY_SIMD used, but SSE/NEON not enabled +#endif /* MINIMP3_ONLY_SIMD */ +#endif /* SIMD checks... */ +#else /* !defined(MINIMP3_NO_SIMD) */ +#define HAVE_SIMD 0 +#endif /* !defined(MINIMP3_NO_SIMD) */ + +#if defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__aarch64__) && !defined(_M_ARM64) +#define HAVE_ARMV6 1 +static __inline__ __attribute__((always_inline)) int32_t minimp3_clip_int16_arm(int32_t a) +{ + int32_t x = 0; + __asm__ ("ssat %0, #16, %1" : "=r"(x) : "r"(a)); + return x; +} +#else +#define HAVE_ARMV6 0 +#endif + +typedef struct +{ + const uint8_t *buf; + int pos, limit; +} bs_t; + +typedef struct +{ + float scf[3*64]; + uint8_t total_bands, stereo_bands, bitalloc[64], scfcod[64]; +} L12_scale_info; + +typedef struct +{ + uint8_t tab_offset, code_tab_width, band_count; +} L12_subband_alloc_t; + +typedef struct +{ + const uint8_t *sfbtab; + uint16_t part_23_length, big_values, scalefac_compress; + uint8_t global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb; + uint8_t table_select[3], region_count[3], subblock_gain[3]; + uint8_t preflag, scalefac_scale, count1_table, scfsi; +} L3_gr_info_t; + +typedef struct +{ + bs_t bs; + uint8_t maindata[MAX_BITRESERVOIR_BYTES + MAX_L3_FRAME_PAYLOAD_BYTES]; + L3_gr_info_t gr_info[4]; + float grbuf[2][576], scf[40], syn[18 + 15][2*32]; + uint8_t ist_pos[2][39]; +} mp3dec_scratch_t; + +static void bs_init(bs_t *bs, const uint8_t *data, int bytes) +{ + bs->buf = data; + bs->pos = 0; + bs->limit = bytes*8; +} + +static uint32_t get_bits(bs_t *bs, int n) +{ + uint32_t next, cache = 0, s = bs->pos & 7; + int shl = n + s; + const uint8_t *p = bs->buf + (bs->pos >> 3); + if ((bs->pos += n) > bs->limit) + return 0; + next = *p++ & (255 >> s); + while ((shl -= 8) > 0) + { + cache |= next << shl; + next = *p++; + } + return cache | (next >> -shl); +} + +static int hdr_valid(const uint8_t *h) +{ + return h[0] == 0xff && + ((h[1] & 0xF0) == 0xf0 || (h[1] & 0xFE) == 0xe2) && + (HDR_GET_LAYER(h) != 0) && + (HDR_GET_BITRATE(h) != 15) && + (HDR_GET_SAMPLE_RATE(h) != 3); +} + +static int hdr_compare(const uint8_t *h1, const uint8_t *h2) +{ + return hdr_valid(h2) && + ((h1[1] ^ h2[1]) & 0xFE) == 0 && + ((h1[2] ^ h2[2]) & 0x0C) == 0 && + !(HDR_IS_FREE_FORMAT(h1) ^ HDR_IS_FREE_FORMAT(h2)); +} + +static unsigned hdr_bitrate_kbps(const uint8_t *h) +{ + static const uint8_t halfrate[2][3][15] = { + { { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,16,24,28,32,40,48,56,64,72,80,88,96,112,128 } }, + { { 0,16,20,24,28,32,40,48,56,64,80,96,112,128,160 }, { 0,16,24,28,32,40,48,56,64,80,96,112,128,160,192 }, { 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224 } }, + }; + return 2*halfrate[!!HDR_TEST_MPEG1(h)][HDR_GET_LAYER(h) - 1][HDR_GET_BITRATE(h)]; +} + +static unsigned hdr_sample_rate_hz(const uint8_t *h) +{ + static const unsigned g_hz[3] = { 44100, 48000, 32000 }; + return g_hz[HDR_GET_SAMPLE_RATE(h)] >> (int)!HDR_TEST_MPEG1(h) >> (int)!HDR_TEST_NOT_MPEG25(h); +} + +static unsigned hdr_frame_samples(const uint8_t *h) +{ + return HDR_IS_LAYER_1(h) ? 384 : (1152 >> (int)HDR_IS_FRAME_576(h)); +} + +static int hdr_frame_bytes(const uint8_t *h, int free_format_size) +{ + int frame_bytes = hdr_frame_samples(h)*hdr_bitrate_kbps(h)*125/hdr_sample_rate_hz(h); + if (HDR_IS_LAYER_1(h)) + { + frame_bytes &= ~3; /* slot align */ + } + return frame_bytes ? frame_bytes : free_format_size; +} + +static int hdr_padding(const uint8_t *h) +{ + return HDR_TEST_PADDING(h) ? (HDR_IS_LAYER_1(h) ? 4 : 1) : 0; +} + +#ifndef MINIMP3_ONLY_MP3 +static const L12_subband_alloc_t *L12_subband_alloc_table(const uint8_t *hdr, L12_scale_info *sci) +{ + const L12_subband_alloc_t *alloc; + int mode = HDR_GET_STEREO_MODE(hdr); + int nbands, stereo_bands = (mode == MODE_MONO) ? 0 : (mode == MODE_JOINT_STEREO) ? (HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32; + + if (HDR_IS_LAYER_1(hdr)) + { + static const L12_subband_alloc_t g_alloc_L1[] = { { 76, 4, 32 } }; + alloc = g_alloc_L1; + nbands = 32; + } else if (!HDR_TEST_MPEG1(hdr)) + { + static const L12_subband_alloc_t g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } }; + alloc = g_alloc_L2M2; + nbands = 30; + } else + { + static const L12_subband_alloc_t g_alloc_L2M1[] = { { 0, 4, 3 }, { 16, 4, 8 }, { 32, 3, 12 }, { 40, 2, 7 } }; + int sample_rate_idx = HDR_GET_SAMPLE_RATE(hdr); + unsigned kbps = hdr_bitrate_kbps(hdr) >> (int)(mode != MODE_MONO); + if (!kbps) /* free-format */ + { + kbps = 192; + } + + alloc = g_alloc_L2M1; + nbands = 27; + if (kbps < 56) + { + static const L12_subband_alloc_t g_alloc_L2M1_lowrate[] = { { 44, 4, 2 }, { 44, 3, 10 } }; + alloc = g_alloc_L2M1_lowrate; + nbands = sample_rate_idx == 2 ? 12 : 8; + } else if (kbps >= 96 && sample_rate_idx != 1) + { + nbands = 30; + } + } + + sci->total_bands = (uint8_t)nbands; + sci->stereo_bands = (uint8_t)MINIMP3_MIN(stereo_bands, nbands); + + return alloc; +} + +static void L12_read_scalefactors(bs_t *bs, uint8_t *pba, uint8_t *scfcod, int bands, float *scf) +{ + static const float g_deq_L12[18*3] = { +#define DQ(x) 9.53674316e-07f/x, 7.56931807e-07f/x, 6.00777173e-07f/x + DQ(3),DQ(7),DQ(15),DQ(31),DQ(63),DQ(127),DQ(255),DQ(511),DQ(1023),DQ(2047),DQ(4095),DQ(8191),DQ(16383),DQ(32767),DQ(65535),DQ(3),DQ(5),DQ(9) + }; + int i, m; + for (i = 0; i < bands; i++) + { + float s = 0; + int ba = *pba++; + int mask = ba ? 4 + ((19 >> scfcod[i]) & 3) : 0; + for (m = 4; m; m >>= 1) + { + if (mask & m) + { + int b = get_bits(bs, 6); + s = g_deq_L12[ba*3 - 6 + b % 3]*(1 << 21 >> b/3); + } + *scf++ = s; + } + } +} + +static void L12_read_scale_info(const uint8_t *hdr, bs_t *bs, L12_scale_info *sci) +{ + static const uint8_t g_bitalloc_code_tab[] = { + 0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16, + 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16, + 0,17,18, 3,19,4,5,16, + 0,17,18,16, + 0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15, + 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14, + 0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16 + }; + const L12_subband_alloc_t *subband_alloc = L12_subband_alloc_table(hdr, sci); + + int i, k = 0, ba_bits = 0; + const uint8_t *ba_code_tab = g_bitalloc_code_tab; + + for (i = 0; i < sci->total_bands; i++) + { + uint8_t ba; + if (i == k) + { + k += subband_alloc->band_count; + ba_bits = subband_alloc->code_tab_width; + ba_code_tab = g_bitalloc_code_tab + subband_alloc->tab_offset; + subband_alloc++; + } + ba = ba_code_tab[get_bits(bs, ba_bits)]; + sci->bitalloc[2*i] = ba; + if (i < sci->stereo_bands) + { + ba = ba_code_tab[get_bits(bs, ba_bits)]; + } + sci->bitalloc[2*i + 1] = sci->stereo_bands ? ba : 0; + } + + for (i = 0; i < 2*sci->total_bands; i++) + { + sci->scfcod[i] = sci->bitalloc[i] ? HDR_IS_LAYER_1(hdr) ? 2 : get_bits(bs, 2) : 6; + } + + L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf); + + for (i = sci->stereo_bands; i < sci->total_bands; i++) + { + sci->bitalloc[2*i + 1] = 0; + } +} + +static int L12_dequantize_granule(float *grbuf, bs_t *bs, L12_scale_info *sci, int group_size) +{ + int i, j, k, choff = 576; + for (j = 0; j < 4; j++) + { + float *dst = grbuf + group_size*j; + for (i = 0; i < 2*sci->total_bands; i++) + { + int ba = sci->bitalloc[i]; + if (ba != 0) + { + if (ba < 17) + { + int half = (1 << (ba - 1)) - 1; + for (k = 0; k < group_size; k++) + { + dst[k] = (float)((int)get_bits(bs, ba) - half); + } + } else + { + unsigned mod = (2 << (ba - 17)) + 1; /* 3, 5, 9 */ + unsigned code = get_bits(bs, mod + 2 - (mod >> 3)); /* 5, 7, 10 */ + for (k = 0; k < group_size; k++, code /= mod) + { + dst[k] = (float)((int)(code % mod - mod/2)); + } + } + } + dst += choff; + choff = 18 - choff; + } + } + return group_size*4; +} + +static void L12_apply_scf_384(L12_scale_info *sci, const float *scf, float *dst) +{ + int i, k; + memcpy(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*sizeof(float)); + for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6) + { + for (k = 0; k < 12; k++) + { + dst[k + 0] *= scf[0]; + dst[k + 576] *= scf[3]; + } + } +} +#endif /* MINIMP3_ONLY_MP3 */ + +static int L3_read_side_info(bs_t *bs, L3_gr_info_t *gr, const uint8_t *hdr) +{ + static const uint8_t g_scf_long[8][23] = { + { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 }, + { 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 }, + { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 }, + { 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 }, + { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 }, + { 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 }, + { 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 }, + { 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 } + }; + static const uint8_t g_scf_short[8][40] = { + { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, + { 8,8,8,8,8,8,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 }, + { 4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 }, + { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 }, + { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, + { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 }, + { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 }, + { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 } + }; + static const uint8_t g_scf_mixed[8][40] = { + { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, + { 12,12,12,4,4,4,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 }, + { 6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 }, + { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 }, + { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, + { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 }, + { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 }, + { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 } + }; + + unsigned tables, scfsi = 0; + int main_data_begin, part_23_sum = 0; + int sr_idx = HDR_GET_MY_SAMPLE_RATE(hdr); sr_idx -= (sr_idx != 0); + int gr_count = HDR_IS_MONO(hdr) ? 1 : 2; + + if (HDR_TEST_MPEG1(hdr)) + { + gr_count *= 2; + main_data_begin = get_bits(bs, 9); + scfsi = get_bits(bs, 7 + gr_count); + } else + { + main_data_begin = get_bits(bs, 8 + gr_count) >> gr_count; + } + + do + { + if (HDR_IS_MONO(hdr)) + { + scfsi <<= 4; + } + gr->part_23_length = (uint16_t)get_bits(bs, 12); + part_23_sum += gr->part_23_length; + gr->big_values = (uint16_t)get_bits(bs, 9); + if (gr->big_values > 288) + { + return -1; + } + gr->global_gain = (uint8_t)get_bits(bs, 8); + gr->scalefac_compress = (uint16_t)get_bits(bs, HDR_TEST_MPEG1(hdr) ? 4 : 9); + gr->sfbtab = g_scf_long[sr_idx]; + gr->n_long_sfb = 22; + gr->n_short_sfb = 0; + if (get_bits(bs, 1)) + { + gr->block_type = (uint8_t)get_bits(bs, 2); + if (!gr->block_type) + { + return -1; + } + gr->mixed_block_flag = (uint8_t)get_bits(bs, 1); + gr->region_count[0] = 7; + gr->region_count[1] = 255; + if (gr->block_type == SHORT_BLOCK_TYPE) + { + scfsi &= 0x0F0F; + if (!gr->mixed_block_flag) + { + gr->region_count[0] = 8; + gr->sfbtab = g_scf_short[sr_idx]; + gr->n_long_sfb = 0; + gr->n_short_sfb = 39; + } else + { + gr->sfbtab = g_scf_mixed[sr_idx]; + gr->n_long_sfb = HDR_TEST_MPEG1(hdr) ? 8 : 6; + gr->n_short_sfb = 30; + } + } + tables = get_bits(bs, 10); + tables <<= 5; + gr->subblock_gain[0] = (uint8_t)get_bits(bs, 3); + gr->subblock_gain[1] = (uint8_t)get_bits(bs, 3); + gr->subblock_gain[2] = (uint8_t)get_bits(bs, 3); + } else + { + gr->block_type = 0; + gr->mixed_block_flag = 0; + tables = get_bits(bs, 15); + gr->region_count[0] = (uint8_t)get_bits(bs, 4); + gr->region_count[1] = (uint8_t)get_bits(bs, 3); + gr->region_count[2] = 255; + } + gr->table_select[0] = (uint8_t)(tables >> 10); + gr->table_select[1] = (uint8_t)((tables >> 5) & 31); + gr->table_select[2] = (uint8_t)((tables) & 31); + gr->preflag = HDR_TEST_MPEG1(hdr) ? get_bits(bs, 1) : (gr->scalefac_compress >= 500); + gr->scalefac_scale = (uint8_t)get_bits(bs, 1); + gr->count1_table = (uint8_t)get_bits(bs, 1); + gr->scfsi = (uint8_t)((scfsi >> 12) & 15); + scfsi <<= 4; + gr++; + } while(--gr_count); + + if (part_23_sum + bs->pos > bs->limit + main_data_begin*8) + { + return -1; + } + + return main_data_begin; +} + +static void L3_read_scalefactors(uint8_t *scf, uint8_t *ist_pos, const uint8_t *scf_size, const uint8_t *scf_count, bs_t *bitbuf, int scfsi) +{ + int i, k; + for (i = 0; i < 4 && scf_count[i]; i++, scfsi *= 2) + { + int cnt = scf_count[i]; + if (scfsi & 8) + { + memcpy(scf, ist_pos, cnt); + } else + { + int bits = scf_size[i]; + if (!bits) + { + memset(scf, 0, cnt); + memset(ist_pos, 0, cnt); + } else + { + int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1; + for (k = 0; k < cnt; k++) + { + int s = get_bits(bitbuf, bits); + ist_pos[k] = (s == max_scf ? -1 : s); + scf[k] = s; + } + } + } + ist_pos += cnt; + scf += cnt; + } + scf[0] = scf[1] = scf[2] = 0; +} + +static float L3_ldexp_q2(float y, int exp_q2) +{ + static const float g_expfrac[4] = { 9.31322575e-10f,7.83145814e-10f,6.58544508e-10f,5.53767716e-10f }; + int e; + do + { + e = MINIMP3_MIN(30*4, exp_q2); + y *= g_expfrac[e & 3]*(1 << 30 >> (e >> 2)); + } while ((exp_q2 -= e) > 0); + return y; +} + +static void L3_decode_scalefactors(const uint8_t *hdr, uint8_t *ist_pos, bs_t *bs, const L3_gr_info_t *gr, float *scf, int ch) +{ + static const uint8_t g_scf_partitions[3][28] = { + { 6,5,5, 5,6,5,5,5,6,5, 7,3,11,10,0,0, 7, 7, 7,0, 6, 6,6,3, 8, 8,5,0 }, + { 8,9,6,12,6,9,9,9,6,9,12,6,15,18,0,0, 6,15,12,0, 6,12,9,6, 6,18,9,0 }, + { 9,9,6,12,9,9,9,9,9,9,12,6,18,18,0,0,12,12,12,0,12, 9,9,6,15,12,9,0 } + }; + const uint8_t *scf_partition = g_scf_partitions[!!gr->n_short_sfb + !gr->n_long_sfb]; + uint8_t scf_size[4], iscf[40]; + int i, scf_shift = gr->scalefac_scale + 1, gain_exp, scfsi = gr->scfsi; + float gain; + + if (HDR_TEST_MPEG1(hdr)) + { + static const uint8_t g_scfc_decode[16] = { 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 }; + int part = g_scfc_decode[gr->scalefac_compress]; + scf_size[1] = scf_size[0] = (uint8_t)(part >> 2); + scf_size[3] = scf_size[2] = (uint8_t)(part & 3); + } else + { + static const uint8_t g_mod[6*4] = { 5,5,4,4,5,5,4,1,4,3,1,1,5,6,6,1,4,4,4,1,4,3,1,1 }; + int k, modprod, sfc, ist = HDR_TEST_I_STEREO(hdr) && ch; + sfc = gr->scalefac_compress >> ist; + for (k = ist*3*4; sfc >= 0; sfc -= modprod, k += 4) + { + for (modprod = 1, i = 3; i >= 0; i--) + { + scf_size[i] = (uint8_t)(sfc / modprod % g_mod[k + i]); + modprod *= g_mod[k + i]; + } + } + scf_partition += k; + scfsi = -16; + } + L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi); + + if (gr->n_short_sfb) + { + int sh = 3 - scf_shift; + for (i = 0; i < gr->n_short_sfb; i += 3) + { + iscf[gr->n_long_sfb + i + 0] += gr->subblock_gain[0] << sh; + iscf[gr->n_long_sfb + i + 1] += gr->subblock_gain[1] << sh; + iscf[gr->n_long_sfb + i + 2] += gr->subblock_gain[2] << sh; + } + } else if (gr->preflag) + { + static const uint8_t g_preamp[10] = { 1,1,1,1,2,2,3,3,3,2 }; + for (i = 0; i < 10; i++) + { + iscf[11 + i] += g_preamp[i]; + } + } + + gain_exp = gr->global_gain + BITS_DEQUANTIZER_OUT*4 - 210 - (HDR_IS_MS_STEREO(hdr) ? 2 : 0); + gain = L3_ldexp_q2(1 << (MAX_SCFI/4), MAX_SCFI - gain_exp); + for (i = 0; i < (int)(gr->n_long_sfb + gr->n_short_sfb); i++) + { + scf[i] = L3_ldexp_q2(gain, iscf[i] << scf_shift); + } +} + +static const float g_pow43[129 + 16] = { + 0,-1,-2.519842f,-4.326749f,-6.349604f,-8.549880f,-10.902724f,-13.390518f,-16.000000f,-18.720754f,-21.544347f,-24.463781f,-27.473142f,-30.567351f,-33.741992f,-36.993181f, + 0,1,2.519842f,4.326749f,6.349604f,8.549880f,10.902724f,13.390518f,16.000000f,18.720754f,21.544347f,24.463781f,27.473142f,30.567351f,33.741992f,36.993181f,40.317474f,43.711787f,47.173345f,50.699631f,54.288352f,57.937408f,61.644865f,65.408941f,69.227979f,73.100443f,77.024898f,81.000000f,85.024491f,89.097188f,93.216975f,97.382800f,101.593667f,105.848633f,110.146801f,114.487321f,118.869381f,123.292209f,127.755065f,132.257246f,136.798076f,141.376907f,145.993119f,150.646117f,155.335327f,160.060199f,164.820202f,169.614826f,174.443577f,179.305980f,184.201575f,189.129918f,194.090580f,199.083145f,204.107210f,209.162385f,214.248292f,219.364564f,224.510845f,229.686789f,234.892058f,240.126328f,245.389280f,250.680604f,256.000000f,261.347174f,266.721841f,272.123723f,277.552547f,283.008049f,288.489971f,293.998060f,299.532071f,305.091761f,310.676898f,316.287249f,321.922592f,327.582707f,333.267377f,338.976394f,344.709550f,350.466646f,356.247482f,362.051866f,367.879608f,373.730522f,379.604427f,385.501143f,391.420496f,397.362314f,403.326427f,409.312672f,415.320884f,421.350905f,427.402579f,433.475750f,439.570269f,445.685987f,451.822757f,457.980436f,464.158883f,470.357960f,476.577530f,482.817459f,489.077615f,495.357868f,501.658090f,507.978156f,514.317941f,520.677324f,527.056184f,533.454404f,539.871867f,546.308458f,552.764065f,559.238575f,565.731879f,572.243870f,578.774440f,585.323483f,591.890898f,598.476581f,605.080431f,611.702349f,618.342238f,625.000000f,631.675540f,638.368763f,645.079578f +}; + +static float L3_pow_43(int x) +{ + float frac; + int sign, mult = 256; + + if (x < 129) + { + return g_pow43[16 + x]; + } + + if (x < 1024) + { + mult = 16; + x <<= 3; + } + + sign = 2*x & 64; + frac = (float)((x & 63) - sign) / ((x & ~63) + sign); + return g_pow43[16 + ((x + sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult; +} + +static void L3_huffman(float *dst, bs_t *bs, const L3_gr_info_t *gr_info, const float *scf, int layer3gr_limit) +{ + static const int16_t tabs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 785,785,785,785,784,784,784,784,513,513,513,513,513,513,513,513,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + -255,1313,1298,1282,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,290,288, + -255,1313,1298,1282,769,769,769,769,529,529,529,529,529,529,529,529,528,528,528,528,528,528,528,528,512,512,512,512,512,512,512,512,290,288, + -253,-318,-351,-367,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,819,818,547,547,275,275,275,275,561,560,515,546,289,274,288,258, + -254,-287,1329,1299,1314,1312,1057,1057,1042,1042,1026,1026,784,784,784,784,529,529,529,529,529,529,529,529,769,769,769,769,768,768,768,768,563,560,306,306,291,259, + -252,-413,-477,-542,1298,-575,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-383,-399,1107,1092,1106,1061,849,849,789,789,1104,1091,773,773,1076,1075,341,340,325,309,834,804,577,577,532,532,516,516,832,818,803,816,561,561,531,531,515,546,289,289,288,258, + -252,-429,-493,-559,1057,1057,1042,1042,529,529,529,529,529,529,529,529,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,-382,1077,-415,1106,1061,1104,849,849,789,789,1091,1076,1029,1075,834,834,597,581,340,340,339,324,804,833,532,532,832,772,818,803,817,787,816,771,290,290,290,290,288,258, + -253,-349,-414,-447,-463,1329,1299,-479,1314,1312,1057,1057,1042,1042,1026,1026,785,785,785,785,784,784,784,784,769,769,769,769,768,768,768,768,-319,851,821,-335,836,850,805,849,341,340,325,336,533,533,579,579,564,564,773,832,578,548,563,516,321,276,306,291,304,259, + -251,-572,-733,-830,-863,-879,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,1396,1351,1381,1366,1395,1335,1380,-559,1334,1138,1138,1063,1063,1350,1392,1031,1031,1062,1062,1364,1363,1120,1120,1333,1348,881,881,881,881,375,374,359,373,343,358,341,325,791,791,1123,1122,-703,1105,1045,-719,865,865,790,790,774,774,1104,1029,338,293,323,308,-799,-815,833,788,772,818,803,816,322,292,307,320,561,531,515,546,289,274,288,258, + -251,-525,-605,-685,-765,-831,-846,1298,1057,1057,1312,1282,785,785,785,785,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,1399,1398,1383,1367,1382,1396,1351,-511,1381,1366,1139,1139,1079,1079,1124,1124,1364,1349,1363,1333,882,882,882,882,807,807,807,807,1094,1094,1136,1136,373,341,535,535,881,775,867,822,774,-591,324,338,-671,849,550,550,866,864,609,609,293,336,534,534,789,835,773,-751,834,804,308,307,833,788,832,772,562,562,547,547,305,275,560,515,290,290, + -252,-397,-477,-557,-622,-653,-719,-735,-750,1329,1299,1314,1057,1057,1042,1042,1312,1282,1024,1024,785,785,785,785,784,784,784,784,769,769,769,769,-383,1127,1141,1111,1126,1140,1095,1110,869,869,883,883,1079,1109,882,882,375,374,807,868,838,881,791,-463,867,822,368,263,852,837,836,-543,610,610,550,550,352,336,534,534,865,774,851,821,850,805,593,533,579,564,773,832,578,578,548,548,577,577,307,276,306,291,516,560,259,259, + -250,-2107,-2507,-2764,-2909,-2974,-3007,-3023,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-767,-1052,-1213,-1277,-1358,-1405,-1469,-1535,-1550,-1582,-1614,-1647,-1662,-1694,-1726,-1759,-1774,-1807,-1822,-1854,-1886,1565,-1919,-1935,-1951,-1967,1731,1730,1580,1717,-1983,1729,1564,-1999,1548,-2015,-2031,1715,1595,-2047,1714,-2063,1610,-2079,1609,-2095,1323,1323,1457,1457,1307,1307,1712,1547,1641,1700,1699,1594,1685,1625,1442,1442,1322,1322,-780,-973,-910,1279,1278,1277,1262,1276,1261,1275,1215,1260,1229,-959,974,974,989,989,-943,735,478,478,495,463,506,414,-1039,1003,958,1017,927,942,987,957,431,476,1272,1167,1228,-1183,1256,-1199,895,895,941,941,1242,1227,1212,1135,1014,1014,490,489,503,487,910,1013,985,925,863,894,970,955,1012,847,-1343,831,755,755,984,909,428,366,754,559,-1391,752,486,457,924,997,698,698,983,893,740,740,908,877,739,739,667,667,953,938,497,287,271,271,683,606,590,712,726,574,302,302,738,736,481,286,526,725,605,711,636,724,696,651,589,681,666,710,364,467,573,695,466,466,301,465,379,379,709,604,665,679,316,316,634,633,436,436,464,269,424,394,452,332,438,363,347,408,393,448,331,422,362,407,392,421,346,406,391,376,375,359,1441,1306,-2367,1290,-2383,1337,-2399,-2415,1426,1321,-2431,1411,1336,-2447,-2463,-2479,1169,1169,1049,1049,1424,1289,1412,1352,1319,-2495,1154,1154,1064,1064,1153,1153,416,390,360,404,403,389,344,374,373,343,358,372,327,357,342,311,356,326,1395,1394,1137,1137,1047,1047,1365,1392,1287,1379,1334,1364,1349,1378,1318,1363,792,792,792,792,1152,1152,1032,1032,1121,1121,1046,1046,1120,1120,1030,1030,-2895,1106,1061,1104,849,849,789,789,1091,1076,1029,1090,1060,1075,833,833,309,324,532,532,832,772,818,803,561,561,531,560,515,546,289,274,288,258, + -250,-1179,-1579,-1836,-1996,-2124,-2253,-2333,-2413,-2477,-2542,-2574,-2607,-2622,-2655,1314,1313,1298,1312,1282,785,785,785,785,1040,1040,1025,1025,768,768,768,768,-766,-798,-830,-862,-895,-911,-927,-943,-959,-975,-991,-1007,-1023,-1039,-1055,-1070,1724,1647,-1103,-1119,1631,1767,1662,1738,1708,1723,-1135,1780,1615,1779,1599,1677,1646,1778,1583,-1151,1777,1567,1737,1692,1765,1722,1707,1630,1751,1661,1764,1614,1736,1676,1763,1750,1645,1598,1721,1691,1762,1706,1582,1761,1566,-1167,1749,1629,767,766,751,765,494,494,735,764,719,749,734,763,447,447,748,718,477,506,431,491,446,476,461,505,415,430,475,445,504,399,460,489,414,503,383,474,429,459,502,502,746,752,488,398,501,473,413,472,486,271,480,270,-1439,-1455,1357,-1471,-1487,-1503,1341,1325,-1519,1489,1463,1403,1309,-1535,1372,1448,1418,1476,1356,1462,1387,-1551,1475,1340,1447,1402,1386,-1567,1068,1068,1474,1461,455,380,468,440,395,425,410,454,364,467,466,464,453,269,409,448,268,432,1371,1473,1432,1417,1308,1460,1355,1446,1459,1431,1083,1083,1401,1416,1458,1445,1067,1067,1370,1457,1051,1051,1291,1430,1385,1444,1354,1415,1400,1443,1082,1082,1173,1113,1186,1066,1185,1050,-1967,1158,1128,1172,1097,1171,1081,-1983,1157,1112,416,266,375,400,1170,1142,1127,1065,793,793,1169,1033,1156,1096,1141,1111,1155,1080,1126,1140,898,898,808,808,897,897,792,792,1095,1152,1032,1125,1110,1139,1079,1124,882,807,838,881,853,791,-2319,867,368,263,822,852,837,866,806,865,-2399,851,352,262,534,534,821,836,594,594,549,549,593,593,533,533,848,773,579,579,564,578,548,563,276,276,577,576,306,291,516,560,305,305,275,259, + -251,-892,-2058,-2620,-2828,-2957,-3023,-3039,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,-559,1530,-575,-591,1528,1527,1407,1526,1391,1023,1023,1023,1023,1525,1375,1268,1268,1103,1103,1087,1087,1039,1039,1523,-604,815,815,815,815,510,495,509,479,508,463,507,447,431,505,415,399,-734,-782,1262,-815,1259,1244,-831,1258,1228,-847,-863,1196,-879,1253,987,987,748,-767,493,493,462,477,414,414,686,669,478,446,461,445,474,429,487,458,412,471,1266,1264,1009,1009,799,799,-1019,-1276,-1452,-1581,-1677,-1757,-1821,-1886,-1933,-1997,1257,1257,1483,1468,1512,1422,1497,1406,1467,1496,1421,1510,1134,1134,1225,1225,1466,1451,1374,1405,1252,1252,1358,1480,1164,1164,1251,1251,1238,1238,1389,1465,-1407,1054,1101,-1423,1207,-1439,830,830,1248,1038,1237,1117,1223,1148,1236,1208,411,426,395,410,379,269,1193,1222,1132,1235,1221,1116,976,976,1192,1162,1177,1220,1131,1191,963,963,-1647,961,780,-1663,558,558,994,993,437,408,393,407,829,978,813,797,947,-1743,721,721,377,392,844,950,828,890,706,706,812,859,796,960,948,843,934,874,571,571,-1919,690,555,689,421,346,539,539,944,779,918,873,932,842,903,888,570,570,931,917,674,674,-2575,1562,-2591,1609,-2607,1654,1322,1322,1441,1441,1696,1546,1683,1593,1669,1624,1426,1426,1321,1321,1639,1680,1425,1425,1305,1305,1545,1668,1608,1623,1667,1592,1638,1666,1320,1320,1652,1607,1409,1409,1304,1304,1288,1288,1664,1637,1395,1395,1335,1335,1622,1636,1394,1394,1319,1319,1606,1621,1392,1392,1137,1137,1137,1137,345,390,360,375,404,373,1047,-2751,-2767,-2783,1062,1121,1046,-2799,1077,-2815,1106,1061,789,789,1105,1104,263,355,310,340,325,354,352,262,339,324,1091,1076,1029,1090,1060,1075,833,833,788,788,1088,1028,818,818,803,803,561,561,531,531,816,771,546,546,289,274,288,258, + -253,-317,-381,-446,-478,-509,1279,1279,-811,-1179,-1451,-1756,-1900,-2028,-2189,-2253,-2333,-2414,-2445,-2511,-2526,1313,1298,-2559,1041,1041,1040,1040,1025,1025,1024,1024,1022,1007,1021,991,1020,975,1019,959,687,687,1018,1017,671,671,655,655,1016,1015,639,639,758,758,623,623,757,607,756,591,755,575,754,559,543,543,1009,783,-575,-621,-685,-749,496,-590,750,749,734,748,974,989,1003,958,988,973,1002,942,987,957,972,1001,926,986,941,971,956,1000,910,985,925,999,894,970,-1071,-1087,-1102,1390,-1135,1436,1509,1451,1374,-1151,1405,1358,1480,1420,-1167,1507,1494,1389,1342,1465,1435,1450,1326,1505,1310,1493,1373,1479,1404,1492,1464,1419,428,443,472,397,736,526,464,464,486,457,442,471,484,482,1357,1449,1434,1478,1388,1491,1341,1490,1325,1489,1463,1403,1309,1477,1372,1448,1418,1433,1476,1356,1462,1387,-1439,1475,1340,1447,1402,1474,1324,1461,1371,1473,269,448,1432,1417,1308,1460,-1711,1459,-1727,1441,1099,1099,1446,1386,1431,1401,-1743,1289,1083,1083,1160,1160,1458,1445,1067,1067,1370,1457,1307,1430,1129,1129,1098,1098,268,432,267,416,266,400,-1887,1144,1187,1082,1173,1113,1186,1066,1050,1158,1128,1143,1172,1097,1171,1081,420,391,1157,1112,1170,1142,1127,1065,1169,1049,1156,1096,1141,1111,1155,1080,1126,1154,1064,1153,1140,1095,1048,-2159,1125,1110,1137,-2175,823,823,1139,1138,807,807,384,264,368,263,868,838,853,791,867,822,852,837,866,806,865,790,-2319,851,821,836,352,262,850,805,849,-2399,533,533,835,820,336,261,578,548,563,577,532,532,832,772,562,562,547,547,305,275,560,515,290,290,288,258 }; + static const uint8_t tab32[] = { 130,162,193,209,44,28,76,140,9,9,9,9,9,9,9,9,190,254,222,238,126,94,157,157,109,61,173,205 }; + static const uint8_t tab33[] = { 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 }; + static const int16_t tabindex[2*16] = { 0,32,64,98,0,132,180,218,292,364,426,538,648,746,0,1126,1460,1460,1460,1460,1460,1460,1460,1460,1842,1842,1842,1842,1842,1842,1842,1842 }; + static const uint8_t g_linbits[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,6,8,10,13,4,5,6,7,8,9,11,13 }; + +#define PEEK_BITS(n) (bs_cache >> (32 - n)) +#define FLUSH_BITS(n) { bs_cache <<= (n); bs_sh += (n); } +#define CHECK_BITS while (bs_sh >= 0) { bs_cache |= (uint32_t)*bs_next_ptr++ << bs_sh; bs_sh -= 8; } +#define BSPOS ((bs_next_ptr - bs->buf)*8 - 24 + bs_sh) + + float one = 0.0f; + int ireg = 0, big_val_cnt = gr_info->big_values; + const uint8_t *sfb = gr_info->sfbtab; + const uint8_t *bs_next_ptr = bs->buf + bs->pos/8; + uint32_t bs_cache = (((bs_next_ptr[0]*256u + bs_next_ptr[1])*256u + bs_next_ptr[2])*256u + bs_next_ptr[3]) << (bs->pos & 7); + int pairs_to_decode, np, bs_sh = (bs->pos & 7) - 8; + bs_next_ptr += 4; + + while (big_val_cnt > 0) + { + int tab_num = gr_info->table_select[ireg]; + int sfb_cnt = gr_info->region_count[ireg++]; + const int16_t *codebook = tabs + tabindex[tab_num]; + int linbits = g_linbits[tab_num]; + if (linbits) + { + do + { + np = *sfb++ / 2; + pairs_to_decode = MINIMP3_MIN(big_val_cnt, np); + one = *scf++; + do + { + int j, w = 5; + int leaf = codebook[PEEK_BITS(w)]; + while (leaf < 0) + { + FLUSH_BITS(w); + w = leaf & 7; + leaf = codebook[PEEK_BITS(w) - (leaf >> 3)]; + } + FLUSH_BITS(leaf >> 8); + + for (j = 0; j < 2; j++, dst++, leaf >>= 4) + { + int lsb = leaf & 0x0F; + if (lsb == 15) + { + lsb += PEEK_BITS(linbits); + FLUSH_BITS(linbits); + CHECK_BITS; + *dst = one*L3_pow_43(lsb)*((int32_t)bs_cache < 0 ? -1: 1); + } else + { + *dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one; + } + FLUSH_BITS(lsb ? 1 : 0); + } + CHECK_BITS; + } while (--pairs_to_decode); + } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0); + } else + { + do + { + np = *sfb++ / 2; + pairs_to_decode = MINIMP3_MIN(big_val_cnt, np); + one = *scf++; + do + { + int j, w = 5; + int leaf = codebook[PEEK_BITS(w)]; + while (leaf < 0) + { + FLUSH_BITS(w); + w = leaf & 7; + leaf = codebook[PEEK_BITS(w) - (leaf >> 3)]; + } + FLUSH_BITS(leaf >> 8); + + for (j = 0; j < 2; j++, dst++, leaf >>= 4) + { + int lsb = leaf & 0x0F; + *dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one; + FLUSH_BITS(lsb ? 1 : 0); + } + CHECK_BITS; + } while (--pairs_to_decode); + } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0); + } + } + + for (np = 1 - big_val_cnt;; dst += 4) + { + const uint8_t *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32; + int leaf = codebook_count1[PEEK_BITS(4)]; + if (!(leaf & 8)) + { + leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))]; + } + FLUSH_BITS(leaf & 7); + if (BSPOS > layer3gr_limit) + { + break; + } +#define RELOAD_SCALEFACTOR if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; } +#define DEQ_COUNT1(s) if (leaf & (128 >> s)) { dst[s] = ((int32_t)bs_cache < 0) ? -one : one; FLUSH_BITS(1) } + RELOAD_SCALEFACTOR; + DEQ_COUNT1(0); + DEQ_COUNT1(1); + RELOAD_SCALEFACTOR; + DEQ_COUNT1(2); + DEQ_COUNT1(3); + CHECK_BITS; + } + + bs->pos = layer3gr_limit; +} + +static void L3_midside_stereo(float *left, int n) +{ + int i = 0; + float *right = left + 576; +#if HAVE_SIMD + if (have_simd()) + { + for (; i < n - 3; i += 4) + { + f4 vl = VLD(left + i); + f4 vr = VLD(right + i); + VSTORE(left + i, VADD(vl, vr)); + VSTORE(right + i, VSUB(vl, vr)); + } +#ifdef __GNUC__ + /* Workaround for spurious -Waggressive-loop-optimizations warning from gcc. + * For more info see: https://github.com/lieff/minimp3/issues/88 + */ + if (__builtin_constant_p(n % 4 == 0) && n % 4 == 0) + return; +#endif + } +#endif /* HAVE_SIMD */ + for (; i < n; i++) + { + float a = left[i]; + float b = right[i]; + left[i] = a + b; + right[i] = a - b; + } +} + +static void L3_intensity_stereo_band(float *left, int n, float kl, float kr) +{ + int i; + for (i = 0; i < n; i++) + { + left[i + 576] = left[i]*kr; + left[i] = left[i]*kl; + } +} + +static void L3_stereo_top_band(const float *right, const uint8_t *sfb, int nbands, int max_band[3]) +{ + int i, k; + + max_band[0] = max_band[1] = max_band[2] = -1; + + for (i = 0; i < nbands; i++) + { + for (k = 0; k < sfb[i]; k += 2) + { + if (right[k] != 0 || right[k + 1] != 0) + { + max_band[i % 3] = i; + break; + } + } + right += sfb[i]; + } +} + +static void L3_stereo_process(float *left, const uint8_t *ist_pos, const uint8_t *sfb, const uint8_t *hdr, int max_band[3], int mpeg2_sh) +{ + static const float g_pan[7*2] = { 0,1,0.21132487f,0.78867513f,0.36602540f,0.63397460f,0.5f,0.5f,0.63397460f,0.36602540f,0.78867513f,0.21132487f,1,0 }; + unsigned i, max_pos = HDR_TEST_MPEG1(hdr) ? 7 : 64; + + for (i = 0; sfb[i]; i++) + { + unsigned ipos = ist_pos[i]; + if ((int)i > max_band[i % 3] && ipos < max_pos) + { + float kl, kr, s = HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1; + if (HDR_TEST_MPEG1(hdr)) + { + kl = g_pan[2*ipos]; + kr = g_pan[2*ipos + 1]; + } else + { + kl = 1; + kr = L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh); + if (ipos & 1) + { + kl = kr; + kr = 1; + } + } + L3_intensity_stereo_band(left, sfb[i], kl*s, kr*s); + } else if (HDR_TEST_MS_STEREO(hdr)) + { + L3_midside_stereo(left, sfb[i]); + } + left += sfb[i]; + } +} + +static void L3_intensity_stereo(float *left, uint8_t *ist_pos, const L3_gr_info_t *gr, const uint8_t *hdr) +{ + int max_band[3], n_sfb = gr->n_long_sfb + gr->n_short_sfb; + int i, max_blocks = gr->n_short_sfb ? 3 : 1; + + L3_stereo_top_band(left + 576, gr->sfbtab, n_sfb, max_band); + if (gr->n_long_sfb) + { + max_band[0] = max_band[1] = max_band[2] = MINIMP3_MAX(MINIMP3_MAX(max_band[0], max_band[1]), max_band[2]); + } + for (i = 0; i < max_blocks; i++) + { + int default_pos = HDR_TEST_MPEG1(hdr) ? 3 : 0; + int itop = n_sfb - max_blocks + i; + int prev = itop - max_blocks; + ist_pos[itop] = max_band[i] >= prev ? default_pos : ist_pos[prev]; + } + L3_stereo_process(left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress & 1); +} + +static void L3_reorder(float *grbuf, float *scratch, const uint8_t *sfb) +{ + int i, len; + float *src = grbuf, *dst = scratch; + + for (;0 != (len = *sfb); sfb += 3, src += 2*len) + { + for (i = 0; i < len; i++, src++) + { + *dst++ = src[0*len]; + *dst++ = src[1*len]; + *dst++ = src[2*len]; + } + } + memcpy(grbuf, scratch, (dst - scratch)*sizeof(float)); +} + +static void L3_antialias(float *grbuf, int nbands) +{ + static const float g_aa[2][8] = { + {0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f}, + {0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f} + }; + + for (; nbands > 0; nbands--, grbuf += 18) + { + int i = 0; +#if HAVE_SIMD + if (have_simd()) for (; i < 8; i += 4) + { + f4 vu = VLD(grbuf + 18 + i); + f4 vd = VLD(grbuf + 14 - i); + f4 vc0 = VLD(g_aa[0] + i); + f4 vc1 = VLD(g_aa[1] + i); + vd = VREV(vd); + VSTORE(grbuf + 18 + i, VSUB(VMUL(vu, vc0), VMUL(vd, vc1))); + vd = VADD(VMUL(vu, vc1), VMUL(vd, vc0)); + VSTORE(grbuf + 14 - i, VREV(vd)); + } +#endif /* HAVE_SIMD */ +#ifndef MINIMP3_ONLY_SIMD + for(; i < 8; i++) + { + float u = grbuf[18 + i]; + float d = grbuf[17 - i]; + grbuf[18 + i] = u*g_aa[0][i] - d*g_aa[1][i]; + grbuf[17 - i] = u*g_aa[1][i] + d*g_aa[0][i]; + } +#endif /* MINIMP3_ONLY_SIMD */ + } +} + +static void L3_dct3_9(float *y) +{ + float s0, s1, s2, s3, s4, s5, s6, s7, s8, t0, t2, t4; + + s0 = y[0]; s2 = y[2]; s4 = y[4]; s6 = y[6]; s8 = y[8]; + t0 = s0 + s6*0.5f; + s0 -= s6; + t4 = (s4 + s2)*0.93969262f; + t2 = (s8 + s2)*0.76604444f; + s6 = (s4 - s8)*0.17364818f; + s4 += s8 - s2; + + s2 = s0 - s4*0.5f; + y[4] = s4 + s0; + s8 = t0 - t2 + s6; + s0 = t0 - t4 + t2; + s4 = t0 + t4 - s6; + + s1 = y[1]; s3 = y[3]; s5 = y[5]; s7 = y[7]; + + s3 *= 0.86602540f; + t0 = (s5 + s1)*0.98480775f; + t4 = (s5 - s7)*0.34202014f; + t2 = (s1 + s7)*0.64278761f; + s1 = (s1 - s5 - s7)*0.86602540f; + + s5 = t0 - s3 - t2; + s7 = t4 - s3 - t0; + s3 = t4 + s3 - t2; + + y[0] = s4 - s7; + y[1] = s2 + s1; + y[2] = s0 - s3; + y[3] = s8 + s5; + y[5] = s8 - s5; + y[6] = s0 + s3; + y[7] = s2 - s1; + y[8] = s4 + s7; +} + +static void L3_imdct36(float *grbuf, float *overlap, const float *window, int nbands) +{ + int i, j; + static const float g_twid9[18] = { + 0.73727734f,0.79335334f,0.84339145f,0.88701083f,0.92387953f,0.95371695f,0.97629601f,0.99144486f,0.99904822f,0.67559021f,0.60876143f,0.53729961f,0.46174861f,0.38268343f,0.30070580f,0.21643961f,0.13052619f,0.04361938f + }; + + for (j = 0; j < nbands; j++, grbuf += 18, overlap += 9) + { + float co[9], si[9]; + co[0] = -grbuf[0]; + si[0] = grbuf[17]; + for (i = 0; i < 4; i++) + { + si[8 - 2*i] = grbuf[4*i + 1] - grbuf[4*i + 2]; + co[1 + 2*i] = grbuf[4*i + 1] + grbuf[4*i + 2]; + si[7 - 2*i] = grbuf[4*i + 4] - grbuf[4*i + 3]; + co[2 + 2*i] = -(grbuf[4*i + 3] + grbuf[4*i + 4]); + } + L3_dct3_9(co); + L3_dct3_9(si); + + si[1] = -si[1]; + si[3] = -si[3]; + si[5] = -si[5]; + si[7] = -si[7]; + + i = 0; + +#if HAVE_SIMD + if (have_simd()) for (; i < 8; i += 4) + { + f4 vovl = VLD(overlap + i); + f4 vc = VLD(co + i); + f4 vs = VLD(si + i); + f4 vr0 = VLD(g_twid9 + i); + f4 vr1 = VLD(g_twid9 + 9 + i); + f4 vw0 = VLD(window + i); + f4 vw1 = VLD(window + 9 + i); + f4 vsum = VADD(VMUL(vc, vr1), VMUL(vs, vr0)); + VSTORE(overlap + i, VSUB(VMUL(vc, vr0), VMUL(vs, vr1))); + VSTORE(grbuf + i, VSUB(VMUL(vovl, vw0), VMUL(vsum, vw1))); + vsum = VADD(VMUL(vovl, vw1), VMUL(vsum, vw0)); + VSTORE(grbuf + 14 - i, VREV(vsum)); + } +#endif /* HAVE_SIMD */ + for (; i < 9; i++) + { + float ovl = overlap[i]; + float sum = co[i]*g_twid9[9 + i] + si[i]*g_twid9[0 + i]; + overlap[i] = co[i]*g_twid9[0 + i] - si[i]*g_twid9[9 + i]; + grbuf[i] = ovl*window[0 + i] - sum*window[9 + i]; + grbuf[17 - i] = ovl*window[9 + i] + sum*window[0 + i]; + } + } +} + +static void L3_idct3(float x0, float x1, float x2, float *dst) +{ + float m1 = x1*0.86602540f; + float a1 = x0 - x2*0.5f; + dst[1] = x0 + x2; + dst[0] = a1 + m1; + dst[2] = a1 - m1; +} + +static void L3_imdct12(float *x, float *dst, float *overlap) +{ + static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f }; + float co[3], si[3]; + int i; + + L3_idct3(-x[0], x[6] + x[3], x[12] + x[9], co); + L3_idct3(x[15], x[12] - x[9], x[6] - x[3], si); + si[1] = -si[1]; + + for (i = 0; i < 3; i++) + { + float ovl = overlap[i]; + float sum = co[i]*g_twid3[3 + i] + si[i]*g_twid3[0 + i]; + overlap[i] = co[i]*g_twid3[0 + i] - si[i]*g_twid3[3 + i]; + dst[i] = ovl*g_twid3[2 - i] - sum*g_twid3[5 - i]; + dst[5 - i] = ovl*g_twid3[5 - i] + sum*g_twid3[2 - i]; + } +} + +static void L3_imdct_short(float *grbuf, float *overlap, int nbands) +{ + for (;nbands > 0; nbands--, overlap += 9, grbuf += 18) + { + float tmp[18]; + memcpy(tmp, grbuf, sizeof(tmp)); + memcpy(grbuf, overlap, 6*sizeof(float)); + L3_imdct12(tmp, grbuf + 6, overlap + 6); + L3_imdct12(tmp + 1, grbuf + 12, overlap + 6); + L3_imdct12(tmp + 2, overlap, overlap + 6); + } +} + +static void L3_change_sign(float *grbuf) +{ + int b, i; + for (b = 0, grbuf += 18; b < 32; b += 2, grbuf += 36) + for (i = 1; i < 18; i += 2) + grbuf[i] = -grbuf[i]; +} + +static void L3_imdct_gr(float *grbuf, float *overlap, unsigned block_type, unsigned n_long_bands) +{ + static const float g_mdct_window[2][18] = { + { 0.99904822f,0.99144486f,0.97629601f,0.95371695f,0.92387953f,0.88701083f,0.84339145f,0.79335334f,0.73727734f,0.04361938f,0.13052619f,0.21643961f,0.30070580f,0.38268343f,0.46174861f,0.53729961f,0.60876143f,0.67559021f }, + { 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f } + }; + if (n_long_bands) + { + L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands); + grbuf += 18*n_long_bands; + overlap += 9*n_long_bands; + } + if (block_type == SHORT_BLOCK_TYPE) + L3_imdct_short(grbuf, overlap, 32 - n_long_bands); + else + L3_imdct36(grbuf, overlap, g_mdct_window[block_type == STOP_BLOCK_TYPE], 32 - n_long_bands); +} + +static void L3_save_reservoir(mp3dec_t *h, mp3dec_scratch_t *s) +{ + int pos = (s->bs.pos + 7)/8u; + int remains = s->bs.limit/8u - pos; + if (remains > MAX_BITRESERVOIR_BYTES) + { + pos += remains - MAX_BITRESERVOIR_BYTES; + remains = MAX_BITRESERVOIR_BYTES; + } + if (remains > 0) + { + memmove(h->reserv_buf, s->maindata + pos, remains); + } + h->reserv = remains; +} + +static int L3_restore_reservoir(mp3dec_t *h, bs_t *bs, mp3dec_scratch_t *s, int main_data_begin) +{ + int frame_bytes = (bs->limit - bs->pos)/8; + int bytes_have = MINIMP3_MIN(h->reserv, main_data_begin); + memcpy(s->maindata, h->reserv_buf + MINIMP3_MAX(0, h->reserv - main_data_begin), MINIMP3_MIN(h->reserv, main_data_begin)); + memcpy(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes); + bs_init(&s->bs, s->maindata, bytes_have + frame_bytes); + return h->reserv >= main_data_begin; +} + +static void L3_decode(mp3dec_t *h, mp3dec_scratch_t *s, L3_gr_info_t *gr_info, int nch) +{ + int ch; + + for (ch = 0; ch < nch; ch++) + { + int layer3gr_limit = s->bs.pos + gr_info[ch].part_23_length; + L3_decode_scalefactors(h->header, s->ist_pos[ch], &s->bs, gr_info + ch, s->scf, ch); + L3_huffman(s->grbuf[ch], &s->bs, gr_info + ch, s->scf, layer3gr_limit); + } + + if (HDR_TEST_I_STEREO(h->header)) + { + L3_intensity_stereo(s->grbuf[0], s->ist_pos[1], gr_info, h->header); + } else if (HDR_IS_MS_STEREO(h->header)) + { + L3_midside_stereo(s->grbuf[0], 576); + } + + for (ch = 0; ch < nch; ch++, gr_info++) + { + int aa_bands = 31; + int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (int)(HDR_GET_MY_SAMPLE_RATE(h->header) == 2); + + if (gr_info->n_short_sfb) + { + aa_bands = n_long_bands - 1; + L3_reorder(s->grbuf[ch] + n_long_bands*18, s->syn[0], gr_info->sfbtab + gr_info->n_long_sfb); + } + + L3_antialias(s->grbuf[ch], aa_bands); + L3_imdct_gr(s->grbuf[ch], h->mdct_overlap[ch], gr_info->block_type, n_long_bands); + L3_change_sign(s->grbuf[ch]); + } +} + +static void mp3d_DCT_II(float *grbuf, int n) +{ + static const float g_sec[24] = { + 10.19000816f,0.50060302f,0.50241929f,3.40760851f,0.50547093f,0.52249861f,2.05778098f,0.51544732f,0.56694406f,1.48416460f,0.53104258f,0.64682180f,1.16943991f,0.55310392f,0.78815460f,0.97256821f,0.58293498f,1.06067765f,0.83934963f,0.62250412f,1.72244716f,0.74453628f,0.67480832f,5.10114861f + }; + int i, k = 0; +#if HAVE_SIMD + if (have_simd()) for (; k < n; k += 4) + { + f4 t[4][8], *x; + float *y = grbuf + k; + + for (x = t[0], i = 0; i < 8; i++, x++) + { + f4 x0 = VLD(&y[i*18]); + f4 x1 = VLD(&y[(15 - i)*18]); + f4 x2 = VLD(&y[(16 + i)*18]); + f4 x3 = VLD(&y[(31 - i)*18]); + f4 t0 = VADD(x0, x3); + f4 t1 = VADD(x1, x2); + f4 t2 = VMUL_S(VSUB(x1, x2), g_sec[3*i + 0]); + f4 t3 = VMUL_S(VSUB(x0, x3), g_sec[3*i + 1]); + x[0] = VADD(t0, t1); + x[8] = VMUL_S(VSUB(t0, t1), g_sec[3*i + 2]); + x[16] = VADD(t3, t2); + x[24] = VMUL_S(VSUB(t3, t2), g_sec[3*i + 2]); + } + for (x = t[0], i = 0; i < 4; i++, x += 8) + { + f4 x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt; + xt = VSUB(x0, x7); x0 = VADD(x0, x7); + x7 = VSUB(x1, x6); x1 = VADD(x1, x6); + x6 = VSUB(x2, x5); x2 = VADD(x2, x5); + x5 = VSUB(x3, x4); x3 = VADD(x3, x4); + x4 = VSUB(x0, x3); x0 = VADD(x0, x3); + x3 = VSUB(x1, x2); x1 = VADD(x1, x2); + x[0] = VADD(x0, x1); + x[4] = VMUL_S(VSUB(x0, x1), 0.70710677f); + x5 = VADD(x5, x6); + x6 = VMUL_S(VADD(x6, x7), 0.70710677f); + x7 = VADD(x7, xt); + x3 = VMUL_S(VADD(x3, x4), 0.70710677f); + x5 = VSUB(x5, VMUL_S(x7, 0.198912367f)); /* rotate by PI/8 */ + x7 = VADD(x7, VMUL_S(x5, 0.382683432f)); + x5 = VSUB(x5, VMUL_S(x7, 0.198912367f)); + x0 = VSUB(xt, x6); xt = VADD(xt, x6); + x[1] = VMUL_S(VADD(xt, x7), 0.50979561f); + x[2] = VMUL_S(VADD(x4, x3), 0.54119611f); + x[3] = VMUL_S(VSUB(x0, x5), 0.60134488f); + x[5] = VMUL_S(VADD(x0, x5), 0.89997619f); + x[6] = VMUL_S(VSUB(x4, x3), 1.30656302f); + x[7] = VMUL_S(VSUB(xt, x7), 2.56291556f); + } + + if (k > n - 3) + { +#if HAVE_SSE +#define VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v) +#else /* HAVE_SSE */ +#define VSAVE2(i, v) vst1_f32((float32_t *)&y[i*18], vget_low_f32(v)) +#endif /* HAVE_SSE */ + for (i = 0; i < 7; i++, y += 4*18) + { + f4 s = VADD(t[3][i], t[3][i + 1]); + VSAVE2(0, t[0][i]); + VSAVE2(1, VADD(t[2][i], s)); + VSAVE2(2, VADD(t[1][i], t[1][i + 1])); + VSAVE2(3, VADD(t[2][1 + i], s)); + } + VSAVE2(0, t[0][7]); + VSAVE2(1, VADD(t[2][7], t[3][7])); + VSAVE2(2, t[1][7]); + VSAVE2(3, t[3][7]); + } else + { +#define VSAVE4(i, v) VSTORE(&y[i*18], v) + for (i = 0; i < 7; i++, y += 4*18) + { + f4 s = VADD(t[3][i], t[3][i + 1]); + VSAVE4(0, t[0][i]); + VSAVE4(1, VADD(t[2][i], s)); + VSAVE4(2, VADD(t[1][i], t[1][i + 1])); + VSAVE4(3, VADD(t[2][1 + i], s)); + } + VSAVE4(0, t[0][7]); + VSAVE4(1, VADD(t[2][7], t[3][7])); + VSAVE4(2, t[1][7]); + VSAVE4(3, t[3][7]); + } + } else +#endif /* HAVE_SIMD */ +#ifdef MINIMP3_ONLY_SIMD + {} /* for HAVE_SIMD=1, MINIMP3_ONLY_SIMD=1 case we do not need non-intrinsic "else" branch */ +#else /* MINIMP3_ONLY_SIMD */ + for (; k < n; k++) + { + float t[4][8], *x, *y = grbuf + k; + + for (x = t[0], i = 0; i < 8; i++, x++) + { + float x0 = y[i*18]; + float x1 = y[(15 - i)*18]; + float x2 = y[(16 + i)*18]; + float x3 = y[(31 - i)*18]; + float t0 = x0 + x3; + float t1 = x1 + x2; + float t2 = (x1 - x2)*g_sec[3*i + 0]; + float t3 = (x0 - x3)*g_sec[3*i + 1]; + x[0] = t0 + t1; + x[8] = (t0 - t1)*g_sec[3*i + 2]; + x[16] = t3 + t2; + x[24] = (t3 - t2)*g_sec[3*i + 2]; + } + for (x = t[0], i = 0; i < 4; i++, x += 8) + { + float x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt; + xt = x0 - x7; x0 += x7; + x7 = x1 - x6; x1 += x6; + x6 = x2 - x5; x2 += x5; + x5 = x3 - x4; x3 += x4; + x4 = x0 - x3; x0 += x3; + x3 = x1 - x2; x1 += x2; + x[0] = x0 + x1; + x[4] = (x0 - x1)*0.70710677f; + x5 = x5 + x6; + x6 = (x6 + x7)*0.70710677f; + x7 = x7 + xt; + x3 = (x3 + x4)*0.70710677f; + x5 -= x7*0.198912367f; /* rotate by PI/8 */ + x7 += x5*0.382683432f; + x5 -= x7*0.198912367f; + x0 = xt - x6; xt += x6; + x[1] = (xt + x7)*0.50979561f; + x[2] = (x4 + x3)*0.54119611f; + x[3] = (x0 - x5)*0.60134488f; + x[5] = (x0 + x5)*0.89997619f; + x[6] = (x4 - x3)*1.30656302f; + x[7] = (xt - x7)*2.56291556f; + + } + for (i = 0; i < 7; i++, y += 4*18) + { + y[0*18] = t[0][i]; + y[1*18] = t[2][i] + t[3][i] + t[3][i + 1]; + y[2*18] = t[1][i] + t[1][i + 1]; + y[3*18] = t[2][i + 1] + t[3][i] + t[3][i + 1]; + } + y[0*18] = t[0][7]; + y[1*18] = t[2][7] + t[3][7]; + y[2*18] = t[1][7]; + y[3*18] = t[3][7]; + } +#endif /* MINIMP3_ONLY_SIMD */ +} + +#ifndef MINIMP3_FLOAT_OUTPUT +static int16_t mp3d_scale_pcm(float sample) +{ +#if HAVE_ARMV6 + int32_t s32 = (int32_t)(sample + .5f); + s32 -= (s32 < 0); + int16_t s = (int16_t)minimp3_clip_int16_arm(s32); +#else + if (sample >= 32766.5) return (int16_t) 32767; + if (sample <= -32767.5) return (int16_t)-32768; + int16_t s = (int16_t)(sample + .5f); + s -= (s < 0); /* away from zero, to be compliant */ +#endif + return s; +} +#else /* MINIMP3_FLOAT_OUTPUT */ +static float mp3d_scale_pcm(float sample) +{ + return sample*(1.f/32768.f); +} +#endif /* MINIMP3_FLOAT_OUTPUT */ + +static void mp3d_synth_pair(mp3d_sample_t *pcm, int nch, const float *z) +{ + float a; + a = (z[14*64] - z[ 0]) * 29; + a += (z[ 1*64] + z[13*64]) * 213; + a += (z[12*64] - z[ 2*64]) * 459; + a += (z[ 3*64] + z[11*64]) * 2037; + a += (z[10*64] - z[ 4*64]) * 5153; + a += (z[ 5*64] + z[ 9*64]) * 6574; + a += (z[ 8*64] - z[ 6*64]) * 37489; + a += z[ 7*64] * 75038; + pcm[0] = mp3d_scale_pcm(a); + + z += 2; + a = z[14*64] * 104; + a += z[12*64] * 1567; + a += z[10*64] * 9727; + a += z[ 8*64] * 64019; + a += z[ 6*64] * -9975; + a += z[ 4*64] * -45; + a += z[ 2*64] * 146; + a += z[ 0*64] * -5; + pcm[16*nch] = mp3d_scale_pcm(a); +} + +static void mp3d_synth(float *xl, mp3d_sample_t *dstl, int nch, float *lins) +{ + int i; + float *xr = xl + 576*(nch - 1); + mp3d_sample_t *dstr = dstl + (nch - 1); + + static const float g_win[] = { + -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992, + -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856, + -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630, + -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313, + -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908, + -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415, + -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835, + -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169, + -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420, + -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590, + -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679, + -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692, + -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629, + -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494, + -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290 + }; + float *zlin = lins + 15*64; + const float *w = g_win; + + zlin[4*15] = xl[18*16]; + zlin[4*15 + 1] = xr[18*16]; + zlin[4*15 + 2] = xl[0]; + zlin[4*15 + 3] = xr[0]; + + zlin[4*31] = xl[1 + 18*16]; + zlin[4*31 + 1] = xr[1 + 18*16]; + zlin[4*31 + 2] = xl[1]; + zlin[4*31 + 3] = xr[1]; + + mp3d_synth_pair(dstr, nch, lins + 4*15 + 1); + mp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1); + mp3d_synth_pair(dstl, nch, lins + 4*15); + mp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64); + +#if HAVE_SIMD + if (have_simd()) for (i = 14; i >= 0; i--) + { +#define VLOAD(k) f4 w0 = VSET(*w++); f4 w1 = VSET(*w++); f4 vz = VLD(&zlin[4*i - 64*k]); f4 vy = VLD(&zlin[4*i - 64*(15 - k)]); +#define V0(k) { VLOAD(k) b = VADD(VMUL(vz, w1), VMUL(vy, w0)) ; a = VSUB(VMUL(vz, w0), VMUL(vy, w1)); } +#define V1(k) { VLOAD(k) b = VADD(b, VADD(VMUL(vz, w1), VMUL(vy, w0))); a = VADD(a, VSUB(VMUL(vz, w0), VMUL(vy, w1))); } +#define V2(k) { VLOAD(k) b = VADD(b, VADD(VMUL(vz, w1), VMUL(vy, w0))); a = VADD(a, VSUB(VMUL(vy, w1), VMUL(vz, w0))); } + f4 a, b; + zlin[4*i] = xl[18*(31 - i)]; + zlin[4*i + 1] = xr[18*(31 - i)]; + zlin[4*i + 2] = xl[1 + 18*(31 - i)]; + zlin[4*i + 3] = xr[1 + 18*(31 - i)]; + zlin[4*i + 64] = xl[1 + 18*(1 + i)]; + zlin[4*i + 64 + 1] = xr[1 + 18*(1 + i)]; + zlin[4*i - 64 + 2] = xl[18*(1 + i)]; + zlin[4*i - 64 + 3] = xr[18*(1 + i)]; + + V0(0) V2(1) V1(2) V2(3) V1(4) V2(5) V1(6) V2(7) + + { +#ifndef MINIMP3_FLOAT_OUTPUT +#if HAVE_SSE + static const f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f }; + static const f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f }; + __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)), + _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min))); + dstr[(15 - i)*nch] = _mm_extract_epi16(pcm8, 1); + dstr[(17 + i)*nch] = _mm_extract_epi16(pcm8, 5); + dstl[(15 - i)*nch] = _mm_extract_epi16(pcm8, 0); + dstl[(17 + i)*nch] = _mm_extract_epi16(pcm8, 4); + dstr[(47 - i)*nch] = _mm_extract_epi16(pcm8, 3); + dstr[(49 + i)*nch] = _mm_extract_epi16(pcm8, 7); + dstl[(47 - i)*nch] = _mm_extract_epi16(pcm8, 2); + dstl[(49 + i)*nch] = _mm_extract_epi16(pcm8, 6); +#else /* HAVE_SSE */ + int16x4_t pcma, pcmb; + a = VADD(a, VSET(0.5f)); + b = VADD(b, VSET(0.5f)); + pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, VSET(0))))); + pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, VSET(0))))); + vst1_lane_s16(dstr + (15 - i)*nch, pcma, 1); + vst1_lane_s16(dstr + (17 + i)*nch, pcmb, 1); + vst1_lane_s16(dstl + (15 - i)*nch, pcma, 0); + vst1_lane_s16(dstl + (17 + i)*nch, pcmb, 0); + vst1_lane_s16(dstr + (47 - i)*nch, pcma, 3); + vst1_lane_s16(dstr + (49 + i)*nch, pcmb, 3); + vst1_lane_s16(dstl + (47 - i)*nch, pcma, 2); + vst1_lane_s16(dstl + (49 + i)*nch, pcmb, 2); +#endif /* HAVE_SSE */ + +#else /* MINIMP3_FLOAT_OUTPUT */ + + static const f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f }; + a = VMUL(a, g_scale); + b = VMUL(b, g_scale); +#if HAVE_SSE + _mm_store_ss(dstr + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1))); + _mm_store_ss(dstr + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(1, 1, 1, 1))); + _mm_store_ss(dstl + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0))); + _mm_store_ss(dstl + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(0, 0, 0, 0))); + _mm_store_ss(dstr + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3))); + _mm_store_ss(dstr + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 3, 3, 3))); + _mm_store_ss(dstl + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2))); + _mm_store_ss(dstl + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(2, 2, 2, 2))); +#else /* HAVE_SSE */ + vst1q_lane_f32(dstr + (15 - i)*nch, a, 1); + vst1q_lane_f32(dstr + (17 + i)*nch, b, 1); + vst1q_lane_f32(dstl + (15 - i)*nch, a, 0); + vst1q_lane_f32(dstl + (17 + i)*nch, b, 0); + vst1q_lane_f32(dstr + (47 - i)*nch, a, 3); + vst1q_lane_f32(dstr + (49 + i)*nch, b, 3); + vst1q_lane_f32(dstl + (47 - i)*nch, a, 2); + vst1q_lane_f32(dstl + (49 + i)*nch, b, 2); +#endif /* HAVE_SSE */ +#endif /* MINIMP3_FLOAT_OUTPUT */ + } + } else +#endif /* HAVE_SIMD */ +#ifdef MINIMP3_ONLY_SIMD + {} /* for HAVE_SIMD=1, MINIMP3_ONLY_SIMD=1 case we do not need non-intrinsic "else" branch */ +#else /* MINIMP3_ONLY_SIMD */ + for (i = 14; i >= 0; i--) + { +#define LOAD(k) float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - k*64]; float *vy = &zlin[4*i - (15 - k)*64]; +#define S0(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] = vz[j]*w1 + vy[j]*w0, a[j] = vz[j]*w0 - vy[j]*w1; } +#define S1(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vz[j]*w0 - vy[j]*w1; } +#define S2(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vy[j]*w1 - vz[j]*w0; } + float a[4], b[4]; + + zlin[4*i] = xl[18*(31 - i)]; + zlin[4*i + 1] = xr[18*(31 - i)]; + zlin[4*i + 2] = xl[1 + 18*(31 - i)]; + zlin[4*i + 3] = xr[1 + 18*(31 - i)]; + zlin[4*(i + 16)] = xl[1 + 18*(1 + i)]; + zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)]; + zlin[4*(i - 16) + 2] = xl[18*(1 + i)]; + zlin[4*(i - 16) + 3] = xr[18*(1 + i)]; + + S0(0) S2(1) S1(2) S2(3) S1(4) S2(5) S1(6) S2(7) + + dstr[(15 - i)*nch] = mp3d_scale_pcm(a[1]); + dstr[(17 + i)*nch] = mp3d_scale_pcm(b[1]); + dstl[(15 - i)*nch] = mp3d_scale_pcm(a[0]); + dstl[(17 + i)*nch] = mp3d_scale_pcm(b[0]); + dstr[(47 - i)*nch] = mp3d_scale_pcm(a[3]); + dstr[(49 + i)*nch] = mp3d_scale_pcm(b[3]); + dstl[(47 - i)*nch] = mp3d_scale_pcm(a[2]); + dstl[(49 + i)*nch] = mp3d_scale_pcm(b[2]); + } +#endif /* MINIMP3_ONLY_SIMD */ +} + +static void mp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int nch, mp3d_sample_t *pcm, float *lins) +{ + int i; + for (i = 0; i < nch; i++) + { + mp3d_DCT_II(grbuf + 576*i, nbands); + } + + memcpy(lins, qmf_state, sizeof(float)*15*64); + + for (i = 0; i < nbands; i += 2) + { + mp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64); + } +#ifndef MINIMP3_NONSTANDARD_BUT_LOGICAL + if (nch == 1) + { + for (i = 0; i < 15*64; i += 2) + { + qmf_state[i] = lins[nbands*64 + i]; + } + } else +#endif /* MINIMP3_NONSTANDARD_BUT_LOGICAL */ + { + memcpy(qmf_state, lins + nbands*64, sizeof(float)*15*64); + } +} + +static int mp3d_match_frame(const uint8_t *hdr, int mp3_bytes, int frame_bytes) +{ + int i, nmatch; + for (i = 0, nmatch = 0; nmatch < MAX_FRAME_SYNC_MATCHES; nmatch++) + { + i += hdr_frame_bytes(hdr + i, frame_bytes) + hdr_padding(hdr + i); + if (i + HDR_SIZE > mp3_bytes) + return nmatch > 0; + if (!hdr_compare(hdr, hdr + i)) + return 0; + } + return 1; +} + +static int mp3d_find_frame(const uint8_t *mp3, int mp3_bytes, int *free_format_bytes, int *ptr_frame_bytes) +{ + int i, k; + for (i = 0; i < mp3_bytes - HDR_SIZE; i++, mp3++) + { + if (hdr_valid(mp3)) + { + int frame_bytes = hdr_frame_bytes(mp3, *free_format_bytes); + int frame_and_padding = frame_bytes + hdr_padding(mp3); + + for (k = HDR_SIZE; !frame_bytes && k < MAX_FREE_FORMAT_FRAME_SIZE && i + 2*k < mp3_bytes - HDR_SIZE; k++) + { + if (hdr_compare(mp3, mp3 + k)) + { + int fb = k - hdr_padding(mp3); + int nextfb = fb + hdr_padding(mp3 + k); + if (i + k + nextfb + HDR_SIZE > mp3_bytes || !hdr_compare(mp3, mp3 + k + nextfb)) + continue; + frame_and_padding = k; + frame_bytes = fb; + *free_format_bytes = fb; + } + } + if ((frame_bytes && i + frame_and_padding <= mp3_bytes && + mp3d_match_frame(mp3, mp3_bytes - i, frame_bytes)) || + (!i && frame_and_padding == mp3_bytes)) + { + *ptr_frame_bytes = frame_and_padding; + return i; + } + *free_format_bytes = 0; + } + } + *ptr_frame_bytes = 0; + return mp3_bytes; +} + +void mp3dec_init(mp3dec_t *dec) +{ + dec->header[0] = 0; +} + +int mp3dec_decode_frame(mp3dec_t *dec, const uint8_t *mp3, int mp3_bytes, mp3d_sample_t *pcm, mp3dec_frame_info_t *info) +{ + int i = 0, igr, frame_size = 0, success = 1; + const uint8_t *hdr; + bs_t bs_frame[1]; + mp3dec_scratch_t scratch; + + if (mp3_bytes > 4 && dec->header[0] == 0xff && hdr_compare(dec->header, mp3)) + { + frame_size = hdr_frame_bytes(mp3, dec->free_format_bytes) + hdr_padding(mp3); + if (frame_size != mp3_bytes && (frame_size + HDR_SIZE > mp3_bytes || !hdr_compare(mp3, mp3 + frame_size))) + { + frame_size = 0; + } + } + if (!frame_size) + { + memset(dec, 0, sizeof(mp3dec_t)); + i = mp3d_find_frame(mp3, mp3_bytes, &dec->free_format_bytes, &frame_size); + if (!frame_size || i + frame_size > mp3_bytes) + { + info->frame_bytes = i; + return 0; + } + } + + hdr = mp3 + i; + memcpy(dec->header, hdr, HDR_SIZE); + info->frame_bytes = i + frame_size; + info->frame_offset = i; + info->channels = HDR_IS_MONO(hdr) ? 1 : 2; + info->hz = hdr_sample_rate_hz(hdr); + info->layer = 4 - HDR_GET_LAYER(hdr); + info->bitrate_kbps = hdr_bitrate_kbps(hdr); + + if (!pcm) + { + return hdr_frame_samples(hdr); + } + + bs_init(bs_frame, hdr + HDR_SIZE, frame_size - HDR_SIZE); + if (HDR_IS_CRC(hdr)) + { + get_bits(bs_frame, 16); + } + + if (info->layer == 3) + { + int main_data_begin = L3_read_side_info(bs_frame, scratch.gr_info, hdr); + if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit) + { + mp3dec_init(dec); + return 0; + } + success = L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin); + if (success) + { + for (igr = 0; igr < (HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm += 576*info->channels) + { + memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); + L3_decode(dec, &scratch, scratch.gr_info + igr*info->channels, info->channels); + mp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 18, info->channels, pcm, scratch.syn[0]); + } + } + L3_save_reservoir(dec, &scratch); + } else + { +#ifdef MINIMP3_ONLY_MP3 + return 0; +#else /* MINIMP3_ONLY_MP3 */ + L12_scale_info sci[1]; + L12_read_scale_info(hdr, bs_frame, sci); + + memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); + for (i = 0, igr = 0; igr < 3; igr++) + { + if (12 == (i += L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1))) + { + i = 0; + L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]); + mp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 12, info->channels, pcm, scratch.syn[0]); + memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); + pcm += 384*info->channels; + } + if (bs_frame->pos > bs_frame->limit) + { + mp3dec_init(dec); + return 0; + } + } +#endif /* MINIMP3_ONLY_MP3 */ + } + return success*hdr_frame_samples(dec->header); +} + +#ifdef MINIMP3_FLOAT_OUTPUT +void mp3dec_f32_to_s16(const float *in, int16_t *out, int num_samples) +{ + int i = 0; +#if HAVE_SIMD + int aligned_count = num_samples & ~7; + for(; i < aligned_count; i += 8) + { + static const f4 g_scale = { 32768.0f, 32768.0f, 32768.0f, 32768.0f }; + f4 a = VMUL(VLD(&in[i ]), g_scale); + f4 b = VMUL(VLD(&in[i+4]), g_scale); +#if HAVE_SSE + static const f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f }; + static const f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f }; + __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)), + _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min))); + out[i ] = _mm_extract_epi16(pcm8, 0); + out[i+1] = _mm_extract_epi16(pcm8, 1); + out[i+2] = _mm_extract_epi16(pcm8, 2); + out[i+3] = _mm_extract_epi16(pcm8, 3); + out[i+4] = _mm_extract_epi16(pcm8, 4); + out[i+5] = _mm_extract_epi16(pcm8, 5); + out[i+6] = _mm_extract_epi16(pcm8, 6); + out[i+7] = _mm_extract_epi16(pcm8, 7); +#else /* HAVE_SSE */ + int16x4_t pcma, pcmb; + a = VADD(a, VSET(0.5f)); + b = VADD(b, VSET(0.5f)); + pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, VSET(0))))); + pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, VSET(0))))); + vst1_lane_s16(out+i , pcma, 0); + vst1_lane_s16(out+i+1, pcma, 1); + vst1_lane_s16(out+i+2, pcma, 2); + vst1_lane_s16(out+i+3, pcma, 3); + vst1_lane_s16(out+i+4, pcmb, 0); + vst1_lane_s16(out+i+5, pcmb, 1); + vst1_lane_s16(out+i+6, pcmb, 2); + vst1_lane_s16(out+i+7, pcmb, 3); +#endif /* HAVE_SSE */ + } +#endif /* HAVE_SIMD */ + for(; i < num_samples; i++) + { + float sample = in[i] * 32768.0f; + if (sample >= 32766.5) + out[i] = (int16_t) 32767; + else if (sample <= -32767.5) + out[i] = (int16_t)-32768; + else + { + int16_t s = (int16_t)(sample + .5f); + s -= (s < 0); /* away from zero, to be compliant */ + out[i] = s; + } + } +} +#endif /* MINIMP3_FLOAT_OUTPUT */ +#endif /* MINIMP3_IMPLEMENTATION && !_MINIMP3_IMPLEMENTATION_GUARD */ diff --git a/core/cart_hw/minimp3_ex.h b/core/cart_hw/minimp3_ex.h new file mode 100644 index 000000000..2871705df --- /dev/null +++ b/core/cart_hw/minimp3_ex.h @@ -0,0 +1,1397 @@ +#ifndef MINIMP3_EXT_H +#define MINIMP3_EXT_H +/* + https://github.com/lieff/minimp3 + To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. + This software is distributed without any warranty. + See . +*/ +#include +#include "minimp3.h" + +/* flags for mp3dec_ex_open_* functions */ +#define MP3D_SEEK_TO_BYTE 0 /* mp3dec_ex_seek seeks to byte in stream */ +#define MP3D_SEEK_TO_SAMPLE 1 /* mp3dec_ex_seek precisely seeks to sample using index (created during duration calculation scan or when mp3dec_ex_seek called) */ +#define MP3D_DO_NOT_SCAN 2 /* do not scan whole stream for duration if vbrtag not found, mp3dec_ex_t::samples will be filled only if mp3dec_ex_t::vbr_tag_found == 1 */ +#ifdef MINIMP3_ALLOW_MONO_STEREO_TRANSITION +#define MP3D_ALLOW_MONO_STEREO_TRANSITION 4 +#define MP3D_FLAGS_MASK 7 +#else +#define MP3D_FLAGS_MASK 3 +#endif + +/* compile-time config */ +#define MINIMP3_PREDECODE_FRAMES 2 /* frames to pre-decode and skip after seek (to fill internal structures) */ +/*#define MINIMP3_SEEK_IDX_LINEAR_SEARCH*/ /* define to use linear index search instead of binary search on seek */ +#define MINIMP3_IO_SIZE (128*1024) /* io buffer size for streaming functions, must be greater than MINIMP3_BUF_SIZE */ +#define MINIMP3_BUF_SIZE (16*1024) /* buffer which can hold minimum 10 consecutive mp3 frames (~16KB) worst case */ +/*#define MINIMP3_SCAN_LIMIT (256*1024)*/ /* how many bytes will be scanned to search first valid mp3 frame, to prevent stall on large non-mp3 files */ +#define MINIMP3_ENABLE_RING 0 /* WIP enable hardware magic ring buffer if available, to make less input buffer memmove(s) in callback IO mode */ + +/* return error codes */ +#define MP3D_E_PARAM -1 +#define MP3D_E_MEMORY -2 +#define MP3D_E_IOERROR -3 +#define MP3D_E_USER -4 /* can be used to stop processing from callbacks without indicating specific error */ +#define MP3D_E_DECODE -5 /* decode error which can't be safely skipped, such as sample rate, layer and channels change */ + +typedef struct +{ + mp3d_sample_t *buffer; + size_t samples; /* channels included, byte size = samples*sizeof(mp3d_sample_t) */ + int channels, hz, layer, avg_bitrate_kbps; +} mp3dec_file_info_t; + +typedef struct +{ + const uint8_t *buffer; + size_t size; +} mp3dec_map_info_t; + +typedef struct +{ + uint64_t sample; + uint64_t offset; +} mp3dec_frame_t; + +typedef struct +{ + mp3dec_frame_t *frames; + size_t num_frames, capacity; +} mp3dec_index_t; + +typedef size_t (*MP3D_READ_CB)(void *buf, size_t size, void *user_data); +typedef int (*MP3D_SEEK_CB)(uint64_t position, void *user_data); + +typedef struct +{ + MP3D_READ_CB read; + void *read_data; + MP3D_SEEK_CB seek; + void *seek_data; +} mp3dec_io_t; + +typedef struct +{ + mp3dec_t mp3d; + mp3dec_map_info_t file; + mp3dec_io_t *io; + mp3dec_index_t index; + uint64_t offset, samples, detected_samples, cur_sample, start_offset, end_offset; + mp3dec_frame_info_t info; + mp3d_sample_t buffer[MINIMP3_MAX_SAMPLES_PER_FRAME]; + size_t input_consumed, input_filled; + int is_file, flags, vbr_tag_found, indexes_built; + int free_format_bytes; + int buffer_samples, buffer_consumed, to_skip, start_delay; + int last_error; +} mp3dec_ex_t; + +typedef int (*MP3D_ITERATE_CB)(void *user_data, const uint8_t *frame, int frame_size, int free_format_bytes, size_t buf_size, uint64_t offset, mp3dec_frame_info_t *info); +typedef int (*MP3D_PROGRESS_CB)(void *user_data, size_t file_size, uint64_t offset, mp3dec_frame_info_t *info); + +#ifdef __cplusplus +extern "C" { +#endif + +/* detect mp3/mpa format */ +int mp3dec_detect_buf(const uint8_t *buf, size_t buf_size); +int mp3dec_detect_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size); +/* decode whole buffer block */ +int mp3dec_load_buf(mp3dec_t *dec, const uint8_t *buf, size_t buf_size, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data); +int mp3dec_load_cb(mp3dec_t *dec, mp3dec_io_t *io, uint8_t *buf, size_t buf_size, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data); +/* iterate through frames */ +int mp3dec_iterate_buf(const uint8_t *buf, size_t buf_size, MP3D_ITERATE_CB callback, void *user_data); +int mp3dec_iterate_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size, MP3D_ITERATE_CB callback, void *user_data); +/* streaming decoder with seeking capability */ +int mp3dec_ex_open_buf(mp3dec_ex_t *dec, const uint8_t *buf, size_t buf_size, int flags); +int mp3dec_ex_open_cb(mp3dec_ex_t *dec, mp3dec_io_t *io, int flags); +void mp3dec_ex_close(mp3dec_ex_t *dec); +int mp3dec_ex_seek(mp3dec_ex_t *dec, uint64_t position); +size_t mp3dec_ex_read_frame(mp3dec_ex_t *dec, mp3d_sample_t **buf, mp3dec_frame_info_t *frame_info, size_t max_samples); +size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples); +#ifndef MINIMP3_NO_STDIO +/* stdio versions of file detect, load, iterate and stream */ +int mp3dec_detect(const char *file_name); +int mp3dec_load(mp3dec_t *dec, const char *file_name, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data); +int mp3dec_iterate(const char *file_name, MP3D_ITERATE_CB callback, void *user_data); +int mp3dec_ex_open(mp3dec_ex_t *dec, const char *file_name, int flags); +#ifdef _WIN32 +int mp3dec_detect_w(const wchar_t *file_name); +int mp3dec_load_w(mp3dec_t *dec, const wchar_t *file_name, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data); +int mp3dec_iterate_w(const wchar_t *file_name, MP3D_ITERATE_CB callback, void *user_data); +int mp3dec_ex_open_w(mp3dec_ex_t *dec, const wchar_t *file_name, int flags); +#endif +#endif + +#ifdef __cplusplus +} +#endif +#endif /*MINIMP3_EXT_H*/ + +#if defined(MINIMP3_IMPLEMENTATION) && !defined(_MINIMP3_EX_IMPLEMENTATION_GUARD) +#define _MINIMP3_EX_IMPLEMENTATION_GUARD +#include +#include "minimp3.h" + +static void mp3dec_skip_id3v1(const uint8_t *buf, size_t *pbuf_size) +{ + size_t buf_size = *pbuf_size; +#ifndef MINIMP3_NOSKIP_ID3V1 + if (buf_size >= 128 && !memcmp(buf + buf_size - 128, "TAG", 3)) + { + buf_size -= 128; + if (buf_size >= 227 && !memcmp(buf + buf_size - 227, "TAG+", 4)) + buf_size -= 227; + } +#endif +#ifndef MINIMP3_NOSKIP_APEV2 + if (buf_size > 32 && !memcmp(buf + buf_size - 32, "APETAGEX", 8)) + { + buf_size -= 32; + const uint8_t *tag = buf + buf_size + 8 + 4; + uint32_t tag_size = (uint32_t)(tag[3] << 24) | (tag[2] << 16) | (tag[1] << 8) | tag[0]; + if (buf_size >= tag_size) + buf_size -= tag_size; + } +#endif + *pbuf_size = buf_size; +} + +static size_t mp3dec_skip_id3v2(const uint8_t *buf, size_t buf_size) +{ +#define MINIMP3_ID3_DETECT_SIZE 10 +#ifndef MINIMP3_NOSKIP_ID3V2 + if (buf_size >= MINIMP3_ID3_DETECT_SIZE && !memcmp(buf, "ID3", 3) && !((buf[5] & 15) || (buf[6] & 0x80) || (buf[7] & 0x80) || (buf[8] & 0x80) || (buf[9] & 0x80))) + { + size_t id3v2size = (((buf[6] & 0x7f) << 21) | ((buf[7] & 0x7f) << 14) | ((buf[8] & 0x7f) << 7) | (buf[9] & 0x7f)) + 10; + if ((buf[5] & 16)) + id3v2size += 10; /* footer */ + return id3v2size; + } +#endif + return 0; +} + +static void mp3dec_skip_id3(const uint8_t **pbuf, size_t *pbuf_size) +{ + uint8_t *buf = (uint8_t *)(*pbuf); + size_t buf_size = *pbuf_size; + size_t id3v2size = mp3dec_skip_id3v2(buf, buf_size); + if (id3v2size) + { + if (id3v2size >= buf_size) + id3v2size = buf_size; + buf += id3v2size; + buf_size -= id3v2size; + } + mp3dec_skip_id3v1(buf, &buf_size); + *pbuf = (const uint8_t *)buf; + *pbuf_size = buf_size; +} + +static int mp3dec_check_vbrtag(const uint8_t *frame, int frame_size, uint32_t *frames, int *delay, int *padding) +{ + static const char g_xing_tag[4] = { 'X', 'i', 'n', 'g' }; + static const char g_info_tag[4] = { 'I', 'n', 'f', 'o' }; +#define FRAMES_FLAG 1 +#define BYTES_FLAG 2 +#define TOC_FLAG 4 +#define VBR_SCALE_FLAG 8 + /* Side info offsets after header: + / Mono Stereo + / MPEG1 17 32 + / MPEG2 & 2.5 9 17*/ + bs_t bs[1]; + L3_gr_info_t gr_info[4]; + bs_init(bs, frame + HDR_SIZE, frame_size - HDR_SIZE); + if (HDR_IS_CRC(frame)) + get_bits(bs, 16); + if (L3_read_side_info(bs, gr_info, frame) < 0) + return 0; /* side info corrupted */ + + const uint8_t *tag = frame + HDR_SIZE + bs->pos/8; + if (memcmp(g_xing_tag, tag, 4) && memcmp(g_info_tag, tag, 4)) + return 0; + int flags = tag[7]; + if (!((flags & FRAMES_FLAG))) + return -1; + tag += 8; + *frames = (uint32_t)(tag[0] << 24) | (tag[1] << 16) | (tag[2] << 8) | tag[3]; + tag += 4; + if (flags & BYTES_FLAG) + tag += 4; + if (flags & TOC_FLAG) + tag += 100; + if (flags & VBR_SCALE_FLAG) + tag += 4; + *delay = *padding = 0; + if (*tag) + { /* extension, LAME, Lavc, etc. Should be the same structure. */ + tag += 21; + if (tag - frame + 14 >= frame_size) + return 0; + *delay = ((tag[0] << 4) | (tag[1] >> 4)) + (528 + 1); + *padding = (((tag[1] & 0xF) << 8) | tag[2]) - (528 + 1); + } + return 1; +} + +int mp3dec_detect_buf(const uint8_t *buf, size_t buf_size) +{ + return mp3dec_detect_cb(0, (uint8_t *)buf, buf_size); +} + +int mp3dec_detect_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size) +{ + if (!buf || (size_t)-1 == buf_size || (io && buf_size < MINIMP3_BUF_SIZE)) + return MP3D_E_PARAM; + size_t filled = buf_size; + if (io) + { + if (io->seek(0, io->seek_data)) + return MP3D_E_IOERROR; + filled = io->read(buf, MINIMP3_ID3_DETECT_SIZE, io->read_data); + if (filled > MINIMP3_ID3_DETECT_SIZE) + return MP3D_E_IOERROR; + } + if (filled < MINIMP3_ID3_DETECT_SIZE) + return MP3D_E_USER; /* too small, can't be mp3/mpa */ + if (mp3dec_skip_id3v2(buf, filled)) + return 0; /* id3v2 tag is enough evidence */ + if (io) + { + size_t readed = io->read(buf + MINIMP3_ID3_DETECT_SIZE, buf_size - MINIMP3_ID3_DETECT_SIZE, io->read_data); + if (readed > (buf_size - MINIMP3_ID3_DETECT_SIZE)) + return MP3D_E_IOERROR; + filled += readed; + if (filled < MINIMP3_BUF_SIZE) + mp3dec_skip_id3v1(buf, &filled); + } else + { + mp3dec_skip_id3v1(buf, &filled); + if (filled > MINIMP3_BUF_SIZE) + filled = MINIMP3_BUF_SIZE; + } + int free_format_bytes, frame_size; + mp3d_find_frame(buf, filled, &free_format_bytes, &frame_size); + if (frame_size) + return 0; /* MAX_FRAME_SYNC_MATCHES consecutive frames found */ + return MP3D_E_USER; +} + +int mp3dec_load_buf(mp3dec_t *dec, const uint8_t *buf, size_t buf_size, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data) +{ + return mp3dec_load_cb(dec, 0, (uint8_t *)buf, buf_size, info, progress_cb, user_data); +} + +int mp3dec_load_cb(mp3dec_t *dec, mp3dec_io_t *io, uint8_t *buf, size_t buf_size, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data) +{ + if (!dec || !buf || !info || (size_t)-1 == buf_size || (io && buf_size < MINIMP3_BUF_SIZE)) + return MP3D_E_PARAM; + uint64_t detected_samples = 0; + size_t orig_buf_size = buf_size; + int to_skip = 0; + mp3dec_frame_info_t frame_info; + memset(info, 0, sizeof(*info)); + memset(&frame_info, 0, sizeof(frame_info)); + + /* skip id3 */ + size_t filled = 0, consumed = 0; + int eof = 0, ret = 0; + if (io) + { + if (io->seek(0, io->seek_data)) + return MP3D_E_IOERROR; + filled = io->read(buf, MINIMP3_ID3_DETECT_SIZE, io->read_data); + if (filled > MINIMP3_ID3_DETECT_SIZE) + return MP3D_E_IOERROR; + if (MINIMP3_ID3_DETECT_SIZE != filled) + return 0; + size_t id3v2size = mp3dec_skip_id3v2(buf, filled); + if (id3v2size) + { + if (io->seek(id3v2size, io->seek_data)) + return MP3D_E_IOERROR; + filled = io->read(buf, buf_size, io->read_data); + if (filled > buf_size) + return MP3D_E_IOERROR; + } else + { + size_t readed = io->read(buf + MINIMP3_ID3_DETECT_SIZE, buf_size - MINIMP3_ID3_DETECT_SIZE, io->read_data); + if (readed > (buf_size - MINIMP3_ID3_DETECT_SIZE)) + return MP3D_E_IOERROR; + filled += readed; + } + if (filled < MINIMP3_BUF_SIZE) + mp3dec_skip_id3v1(buf, &filled); + } else + { + mp3dec_skip_id3((const uint8_t **)&buf, &buf_size); + if (!buf_size) + return 0; + } + /* try to make allocation size assumption by first frame or vbr tag */ + mp3dec_init(dec); + int samples; + do + { + uint32_t frames; + int i, delay, padding, free_format_bytes = 0, frame_size = 0; + const uint8_t *hdr; + if (io) + { + if (!eof && filled - consumed < MINIMP3_BUF_SIZE) + { /* keep minimum 10 consecutive mp3 frames (~16KB) worst case */ + memmove(buf, buf + consumed, filled - consumed); + filled -= consumed; + consumed = 0; + size_t readed = io->read(buf + filled, buf_size - filled, io->read_data); + if (readed > (buf_size - filled)) + return MP3D_E_IOERROR; + if (readed != (buf_size - filled)) + eof = 1; + filled += readed; + if (eof) + mp3dec_skip_id3v1(buf, &filled); + } + i = mp3d_find_frame(buf + consumed, filled - consumed, &free_format_bytes, &frame_size); + consumed += i; + hdr = buf + consumed; + } else + { + i = mp3d_find_frame(buf, buf_size, &free_format_bytes, &frame_size); + buf += i; + buf_size -= i; + hdr = buf; + } + if (i && !frame_size) + continue; + if (!frame_size) + return 0; + frame_info.channels = HDR_IS_MONO(hdr) ? 1 : 2; + frame_info.hz = hdr_sample_rate_hz(hdr); + frame_info.layer = 4 - HDR_GET_LAYER(hdr); + frame_info.bitrate_kbps = hdr_bitrate_kbps(hdr); + frame_info.frame_bytes = frame_size; + samples = hdr_frame_samples(hdr)*frame_info.channels; + if (3 != frame_info.layer) + break; + int ret = mp3dec_check_vbrtag(hdr, frame_size, &frames, &delay, &padding); + if (ret > 0) + { + padding *= frame_info.channels; + to_skip = delay*frame_info.channels; + detected_samples = samples*(uint64_t)frames; + if (detected_samples >= (uint64_t)to_skip) + detected_samples -= to_skip; + if (padding > 0 && detected_samples >= (uint64_t)padding) + detected_samples -= padding; + if (!detected_samples) + return 0; + } + if (ret) + { + if (io) + { + consumed += frame_size; + } else + { + buf += frame_size; + buf_size -= frame_size; + } + } + break; + } while(1); + size_t allocated = MINIMP3_MAX_SAMPLES_PER_FRAME*sizeof(mp3d_sample_t); + if (detected_samples) + allocated += detected_samples*sizeof(mp3d_sample_t); + else + allocated += (buf_size/frame_info.frame_bytes)*samples*sizeof(mp3d_sample_t); + info->buffer = (mp3d_sample_t*)malloc(allocated); + if (!info->buffer) + return MP3D_E_MEMORY; + /* save info */ + info->channels = frame_info.channels; + info->hz = frame_info.hz; + info->layer = frame_info.layer; + /* decode all frames */ + size_t avg_bitrate_kbps = 0, frames = 0; + do + { + if ((allocated - info->samples*sizeof(mp3d_sample_t)) < MINIMP3_MAX_SAMPLES_PER_FRAME*sizeof(mp3d_sample_t)) + { + allocated *= 2; + mp3d_sample_t *alloc_buf = (mp3d_sample_t*)realloc(info->buffer, allocated); + if (!alloc_buf) + return MP3D_E_MEMORY; + info->buffer = alloc_buf; + } + if (io) + { + if (!eof && filled - consumed < MINIMP3_BUF_SIZE) + { /* keep minimum 10 consecutive mp3 frames (~16KB) worst case */ + memmove(buf, buf + consumed, filled - consumed); + filled -= consumed; + consumed = 0; + size_t readed = io->read(buf + filled, buf_size - filled, io->read_data); + if (readed != (buf_size - filled)) + eof = 1; + filled += readed; + if (eof) + mp3dec_skip_id3v1(buf, &filled); + } + samples = mp3dec_decode_frame(dec, buf + consumed, filled - consumed, info->buffer + info->samples, &frame_info); + consumed += frame_info.frame_bytes; + } else + { + samples = mp3dec_decode_frame(dec, buf, MINIMP3_MIN(buf_size, (size_t)INT_MAX), info->buffer + info->samples, &frame_info); + buf += frame_info.frame_bytes; + buf_size -= frame_info.frame_bytes; + } + if (samples) + { + if (info->hz != frame_info.hz || info->layer != frame_info.layer) + { + ret = MP3D_E_DECODE; + break; + } + if (info->channels && info->channels != frame_info.channels) + { +#ifdef MINIMP3_ALLOW_MONO_STEREO_TRANSITION + info->channels = 0; /* mark file with mono-stereo transition */ +#else + ret = MP3D_E_DECODE; + break; +#endif + } + samples *= frame_info.channels; + if (to_skip) + { + size_t skip = MINIMP3_MIN(samples, to_skip); + to_skip -= skip; + samples -= skip; + memmove(info->buffer, info->buffer + skip, samples*sizeof(mp3d_sample_t)); + } + info->samples += samples; + avg_bitrate_kbps += frame_info.bitrate_kbps; + frames++; + if (progress_cb) + { + ret = progress_cb(user_data, orig_buf_size, orig_buf_size - buf_size, &frame_info); + if (ret) + break; + } + } + } while (frame_info.frame_bytes); + if (detected_samples && info->samples > detected_samples) + info->samples = detected_samples; /* cut padding */ + /* reallocate to normal buffer size */ + if (allocated != info->samples*sizeof(mp3d_sample_t)) + { + mp3d_sample_t *alloc_buf = (mp3d_sample_t*)realloc(info->buffer, info->samples*sizeof(mp3d_sample_t)); + if (!alloc_buf && info->samples) + return MP3D_E_MEMORY; + info->buffer = alloc_buf; + } + if (frames) + info->avg_bitrate_kbps = avg_bitrate_kbps/frames; + return ret; +} + +int mp3dec_iterate_buf(const uint8_t *buf, size_t buf_size, MP3D_ITERATE_CB callback, void *user_data) +{ + const uint8_t *orig_buf = buf; + if (!buf || (size_t)-1 == buf_size || !callback) + return MP3D_E_PARAM; + /* skip id3 */ + mp3dec_skip_id3(&buf, &buf_size); + if (!buf_size) + return 0; + mp3dec_frame_info_t frame_info; + memset(&frame_info, 0, sizeof(frame_info)); + do + { + int free_format_bytes = 0, frame_size = 0, ret; + int i = mp3d_find_frame(buf, buf_size, &free_format_bytes, &frame_size); + buf += i; + buf_size -= i; + if (i && !frame_size) + continue; + if (!frame_size) + break; + const uint8_t *hdr = buf; + frame_info.channels = HDR_IS_MONO(hdr) ? 1 : 2; + frame_info.hz = hdr_sample_rate_hz(hdr); + frame_info.layer = 4 - HDR_GET_LAYER(hdr); + frame_info.bitrate_kbps = hdr_bitrate_kbps(hdr); + frame_info.frame_bytes = frame_size; + + if (callback) + { + if ((ret = callback(user_data, hdr, frame_size, free_format_bytes, buf_size, hdr - orig_buf, &frame_info))) + return ret; + } + buf += frame_size; + buf_size -= frame_size; + } while (1); + return 0; +} + +int mp3dec_iterate_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size, MP3D_ITERATE_CB callback, void *user_data) +{ + if (!io || !buf || (size_t)-1 == buf_size || buf_size < MINIMP3_BUF_SIZE || !callback) + return MP3D_E_PARAM; + size_t filled = io->read(buf, MINIMP3_ID3_DETECT_SIZE, io->read_data), consumed = 0; + uint64_t readed = 0; + mp3dec_frame_info_t frame_info; + int eof = 0; + memset(&frame_info, 0, sizeof(frame_info)); + if (filled > MINIMP3_ID3_DETECT_SIZE) + return MP3D_E_IOERROR; + if (MINIMP3_ID3_DETECT_SIZE != filled) + return 0; + size_t id3v2size = mp3dec_skip_id3v2(buf, filled); + if (id3v2size) + { + if (io->seek(id3v2size, io->seek_data)) + return MP3D_E_IOERROR; + filled = io->read(buf, buf_size, io->read_data); + if (filled > buf_size) + return MP3D_E_IOERROR; + readed += id3v2size; + } else + { + size_t readed = io->read(buf + MINIMP3_ID3_DETECT_SIZE, buf_size - MINIMP3_ID3_DETECT_SIZE, io->read_data); + if (readed > (buf_size - MINIMP3_ID3_DETECT_SIZE)) + return MP3D_E_IOERROR; + filled += readed; + } + if (filled < MINIMP3_BUF_SIZE) + mp3dec_skip_id3v1(buf, &filled); + do + { + int free_format_bytes = 0, frame_size = 0, ret; + int i = mp3d_find_frame(buf + consumed, filled - consumed, &free_format_bytes, &frame_size); + if (i && !frame_size) + { + consumed += i; + continue; + } + if (!frame_size) + break; + const uint8_t *hdr = buf + consumed + i; + frame_info.channels = HDR_IS_MONO(hdr) ? 1 : 2; + frame_info.hz = hdr_sample_rate_hz(hdr); + frame_info.layer = 4 - HDR_GET_LAYER(hdr); + frame_info.bitrate_kbps = hdr_bitrate_kbps(hdr); + frame_info.frame_bytes = frame_size; + + readed += i; + if (callback) + { + if ((ret = callback(user_data, hdr, frame_size, free_format_bytes, filled - consumed, readed, &frame_info))) + return ret; + } + readed += frame_size; + consumed += i + frame_size; + if (!eof && filled - consumed < MINIMP3_BUF_SIZE) + { /* keep minimum 10 consecutive mp3 frames (~16KB) worst case */ + memmove(buf, buf + consumed, filled - consumed); + filled -= consumed; + consumed = 0; + size_t readed = io->read(buf + filled, buf_size - filled, io->read_data); + if (readed > (buf_size - filled)) + return MP3D_E_IOERROR; + if (readed != (buf_size - filled)) + eof = 1; + filled += readed; + if (eof) + mp3dec_skip_id3v1(buf, &filled); + } + } while (1); + return 0; +} + +static int mp3dec_load_index(void *user_data, const uint8_t *frame, int frame_size, int free_format_bytes, size_t buf_size, uint64_t offset, mp3dec_frame_info_t *info) +{ + mp3dec_frame_t *idx_frame; + mp3dec_ex_t *dec = (mp3dec_ex_t *)user_data; + if (!dec->index.frames && !dec->start_offset) + { /* detect VBR tag and try to avoid full scan */ + uint32_t frames; + int delay, padding; + dec->info = *info; + dec->start_offset = dec->offset = offset; + dec->end_offset = offset + buf_size; + dec->free_format_bytes = free_format_bytes; /* should not change */ + if (3 == dec->info.layer) + { + int ret = mp3dec_check_vbrtag(frame, frame_size, &frames, &delay, &padding); + if (ret) + dec->start_offset = dec->offset = offset + frame_size; + if (ret > 0) + { + padding *= info->channels; + dec->start_delay = dec->to_skip = delay*info->channels; + dec->samples = hdr_frame_samples(frame)*info->channels*(uint64_t)frames; + if (dec->samples >= (uint64_t)dec->start_delay) + dec->samples -= dec->start_delay; + if (padding > 0 && dec->samples >= (uint64_t)padding) + dec->samples -= padding; + dec->detected_samples = dec->samples; + dec->vbr_tag_found = 1; + return MP3D_E_USER; + } else if (ret < 0) + return 0; + } + } + if (dec->flags & MP3D_DO_NOT_SCAN) + return MP3D_E_USER; + if (dec->index.num_frames + 1 > dec->index.capacity) + { + if (!dec->index.capacity) + dec->index.capacity = 4096; + else + dec->index.capacity *= 2; + mp3dec_frame_t *alloc_buf = (mp3dec_frame_t *)realloc((void*)dec->index.frames, sizeof(mp3dec_frame_t)*dec->index.capacity); + if (!alloc_buf) + return MP3D_E_MEMORY; + dec->index.frames = alloc_buf; + } + idx_frame = &dec->index.frames[dec->index.num_frames++]; + idx_frame->offset = offset; + idx_frame->sample = dec->samples; + if (!dec->buffer_samples && dec->index.num_frames < 256) + { /* for some cutted mp3 frames, bit-reservoir not filled and decoding can't be started from first frames */ + /* try to decode up to 255 first frames till samples starts to decode */ + dec->buffer_samples = mp3dec_decode_frame(&dec->mp3d, frame, MINIMP3_MIN(buf_size, (size_t)INT_MAX), dec->buffer, info); + dec->samples += dec->buffer_samples*info->channels; + } else + dec->samples += hdr_frame_samples(frame)*info->channels; + return 0; +} + +int mp3dec_ex_open_buf(mp3dec_ex_t *dec, const uint8_t *buf, size_t buf_size, int flags) +{ + if (!dec || !buf || (size_t)-1 == buf_size || (flags & (~MP3D_FLAGS_MASK))) + return MP3D_E_PARAM; + memset(dec, 0, sizeof(*dec)); + dec->file.buffer = buf; + dec->file.size = buf_size; + dec->flags = flags; + mp3dec_init(&dec->mp3d); + int ret = mp3dec_iterate_buf(dec->file.buffer, dec->file.size, mp3dec_load_index, dec); + if (ret && MP3D_E_USER != ret) + return ret; + mp3dec_init(&dec->mp3d); + dec->buffer_samples = 0; + dec->indexes_built = !(dec->vbr_tag_found || (flags & MP3D_DO_NOT_SCAN)); + dec->flags &= (~MP3D_DO_NOT_SCAN); + return 0; +} + +#ifndef MINIMP3_SEEK_IDX_LINEAR_SEARCH +static size_t mp3dec_idx_binary_search(mp3dec_index_t *idx, uint64_t position) +{ + size_t end = idx->num_frames, start = 0, index = 0; + while (start <= end) + { + size_t mid = (start + end) / 2; + if (idx->frames[mid].sample >= position) + { /* move left side. */ + if (idx->frames[mid].sample == position) + return mid; + end = mid - 1; + } else + { /* move to right side */ + index = mid; + start = mid + 1; + if (start == idx->num_frames) + break; + } + } + return index; +} +#endif + +int mp3dec_ex_seek(mp3dec_ex_t *dec, uint64_t position) +{ + size_t i; + if (!dec) + return MP3D_E_PARAM; + if (!(dec->flags & MP3D_SEEK_TO_SAMPLE)) + { + if (dec->io) + { + dec->offset = position; + } else + { + dec->offset = MINIMP3_MIN(position, dec->file.size); + } + dec->cur_sample = 0; + goto do_exit; + } + dec->cur_sample = position; + position += dec->start_delay; + if (0 == position) + { /* optimize seek to zero, no index needed */ +seek_zero: + dec->offset = dec->start_offset; + dec->to_skip = 0; + goto do_exit; + } + if (!dec->indexes_built) + { /* no index created yet (vbr tag used to calculate track length or MP3D_DO_NOT_SCAN open flag used) */ + dec->indexes_built = 1; + dec->samples = 0; + dec->buffer_samples = 0; + if (dec->io) + { + if (dec->io->seek(dec->start_offset, dec->io->seek_data)) + return MP3D_E_IOERROR; + int ret = mp3dec_iterate_cb(dec->io, (uint8_t *)dec->file.buffer, dec->file.size, mp3dec_load_index, dec); + if (ret && MP3D_E_USER != ret) + return ret; + } else + { + int ret = mp3dec_iterate_buf(dec->file.buffer + dec->start_offset, dec->file.size - dec->start_offset, mp3dec_load_index, dec); + if (ret && MP3D_E_USER != ret) + return ret; + } + for (i = 0; i < dec->index.num_frames; i++) + dec->index.frames[i].offset += dec->start_offset; + dec->samples = dec->detected_samples; + } + if (!dec->index.frames) + goto seek_zero; /* no frames in file - seek to zero */ +#ifdef MINIMP3_SEEK_IDX_LINEAR_SEARCH + for (i = 0; i < dec->index.num_frames; i++) + { + if (dec->index.frames[i].sample >= position) + break; + } +#else + i = mp3dec_idx_binary_search(&dec->index, position); +#endif + if (i) + { + int to_fill_bytes = 511; + int skip_frames = MINIMP3_PREDECODE_FRAMES +#ifdef MINIMP3_SEEK_IDX_LINEAR_SEARCH + + ((dec->index.frames[i].sample == position) ? 0 : 1) +#endif + ; + i -= MINIMP3_MIN(i, (size_t)skip_frames); + if (3 == dec->info.layer) + { + while (i && to_fill_bytes) + { /* make sure bit-reservoir is filled when we start decoding */ + bs_t bs[1]; + L3_gr_info_t gr_info[4]; + int frame_bytes, frame_size; + const uint8_t *hdr; + if (dec->io) + { + hdr = dec->file.buffer; + if (dec->io->seek(dec->index.frames[i - 1].offset, dec->io->seek_data)) + return MP3D_E_IOERROR; + size_t readed = dec->io->read((uint8_t *)hdr, HDR_SIZE, dec->io->read_data); + if (readed != HDR_SIZE) + return MP3D_E_IOERROR; + frame_size = hdr_frame_bytes(hdr, dec->free_format_bytes) + hdr_padding(hdr); + readed = dec->io->read((uint8_t *)hdr + HDR_SIZE, frame_size - HDR_SIZE, dec->io->read_data); + if (readed != (size_t)(frame_size - HDR_SIZE)) + return MP3D_E_IOERROR; + bs_init(bs, hdr + HDR_SIZE, frame_size - HDR_SIZE); + } else + { + hdr = dec->file.buffer + dec->index.frames[i - 1].offset; + frame_size = hdr_frame_bytes(hdr, dec->free_format_bytes) + hdr_padding(hdr); + bs_init(bs, hdr + HDR_SIZE, frame_size - HDR_SIZE); + } + if (HDR_IS_CRC(hdr)) + get_bits(bs, 16); + i--; + if (L3_read_side_info(bs, gr_info, hdr) < 0) + break; /* frame not decodable, we can start from here */ + frame_bytes = (bs->limit - bs->pos)/8; + to_fill_bytes -= MINIMP3_MIN(to_fill_bytes, frame_bytes); + } + } + } + dec->offset = dec->index.frames[i].offset; + dec->to_skip = position - dec->index.frames[i].sample; + while ((i + 1) < dec->index.num_frames && !dec->index.frames[i].sample && !dec->index.frames[i + 1].sample) + { /* skip not decodable first frames */ + const uint8_t *hdr; + if (dec->io) + { + hdr = dec->file.buffer; + if (dec->io->seek(dec->index.frames[i].offset, dec->io->seek_data)) + return MP3D_E_IOERROR; + size_t readed = dec->io->read((uint8_t *)hdr, HDR_SIZE, dec->io->read_data); + if (readed != HDR_SIZE) + return MP3D_E_IOERROR; + } else + hdr = dec->file.buffer + dec->index.frames[i].offset; + dec->to_skip += hdr_frame_samples(hdr)*dec->info.channels; + i++; + } +do_exit: + if (dec->io) + { + if (dec->io->seek(dec->offset, dec->io->seek_data)) + return MP3D_E_IOERROR; + } + dec->buffer_samples = 0; + dec->buffer_consumed = 0; + dec->input_consumed = 0; + dec->input_filled = 0; + dec->last_error = 0; + mp3dec_init(&dec->mp3d); + return 0; +} + +size_t mp3dec_ex_read_frame(mp3dec_ex_t *dec, mp3d_sample_t **buf, mp3dec_frame_info_t *frame_info, size_t max_samples) +{ + if (!dec || !buf || !frame_info) + { + if (dec) + dec->last_error = MP3D_E_PARAM; + return 0; + } + if (dec->detected_samples && dec->cur_sample >= dec->detected_samples) + return 0; /* at end of stream */ + if (dec->last_error) + return 0; /* error eof state, seek can reset it */ + *buf = NULL; + uint64_t end_offset = dec->end_offset ? dec->end_offset : dec->file.size; + int eof = 0; + while (dec->buffer_consumed == dec->buffer_samples) + { + const uint8_t *dec_buf; + if (dec->io) + { + if (!eof && (dec->input_filled - dec->input_consumed) < MINIMP3_BUF_SIZE) + { /* keep minimum 10 consecutive mp3 frames (~16KB) worst case */ + memmove((uint8_t*)dec->file.buffer, (uint8_t*)dec->file.buffer + dec->input_consumed, dec->input_filled - dec->input_consumed); + dec->input_filled -= dec->input_consumed; + dec->input_consumed = 0; + size_t readed = dec->io->read((uint8_t*)dec->file.buffer + dec->input_filled, dec->file.size - dec->input_filled, dec->io->read_data); + if (readed > (dec->file.size - dec->input_filled)) + { + dec->last_error = MP3D_E_IOERROR; + readed = 0; + } + if (readed != (dec->file.size - dec->input_filled)) + eof = 1; + dec->input_filled += readed; + if (eof) + mp3dec_skip_id3v1((uint8_t*)dec->file.buffer, &dec->input_filled); + } + dec_buf = dec->file.buffer + dec->input_consumed; + if (!(dec->input_filled - dec->input_consumed)) + return 0; + dec->buffer_samples = mp3dec_decode_frame(&dec->mp3d, dec_buf, dec->input_filled - dec->input_consumed, dec->buffer, frame_info); + dec->input_consumed += frame_info->frame_bytes; + } else + { + dec_buf = dec->file.buffer + dec->offset; + uint64_t buf_size = end_offset - dec->offset; + if (!buf_size) + return 0; + dec->buffer_samples = mp3dec_decode_frame(&dec->mp3d, dec_buf, MINIMP3_MIN(buf_size, (uint64_t)INT_MAX), dec->buffer, frame_info); + } + dec->buffer_consumed = 0; + if (dec->info.hz != frame_info->hz || dec->info.layer != frame_info->layer) + { +return_e_decode: + dec->last_error = MP3D_E_DECODE; + return 0; + } + if (dec->buffer_samples) + { + dec->buffer_samples *= frame_info->channels; + if (dec->to_skip) + { + size_t skip = MINIMP3_MIN(dec->buffer_samples, dec->to_skip); + dec->buffer_consumed += skip; + dec->to_skip -= skip; + } + if ( +#ifdef MINIMP3_ALLOW_MONO_STEREO_TRANSITION + !(dec->flags & MP3D_ALLOW_MONO_STEREO_TRANSITION) && +#endif + dec->buffer_consumed != dec->buffer_samples && dec->info.channels != frame_info->channels) + { + goto return_e_decode; + } + } else if (dec->to_skip) + { /* In mp3 decoding not always can start decode from any frame because of bit reservoir, + count skip samples for such frames */ + int frame_samples = hdr_frame_samples(dec_buf)*frame_info->channels; + dec->to_skip -= MINIMP3_MIN(frame_samples, dec->to_skip); + } + dec->offset += frame_info->frame_bytes; + } + size_t out_samples = MINIMP3_MIN((size_t)(dec->buffer_samples - dec->buffer_consumed), max_samples); + if (dec->detected_samples) + { /* count decoded samples to properly cut padding */ + if (dec->cur_sample + out_samples >= dec->detected_samples) + out_samples = dec->detected_samples - dec->cur_sample; + } + dec->cur_sample += out_samples; + *buf = dec->buffer + dec->buffer_consumed; + dec->buffer_consumed += out_samples; + return out_samples; +} + +size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples) +{ + if (!dec || !buf) + { + if (dec) + dec->last_error = MP3D_E_PARAM; + return 0; + } + mp3dec_frame_info_t frame_info; + memset(&frame_info, 0, sizeof(frame_info)); + size_t samples_requested = samples; + while (samples) + { + mp3d_sample_t *buf_frame = NULL; + size_t read_samples = mp3dec_ex_read_frame(dec, &buf_frame, &frame_info, samples); + if (!read_samples) + { + break; + } + memcpy(buf, buf_frame, read_samples * sizeof(mp3d_sample_t)); + buf += read_samples; + samples -= read_samples; + } + return samples_requested - samples; +} + +int mp3dec_ex_open_cb(mp3dec_ex_t *dec, mp3dec_io_t *io, int flags) +{ + if (!dec || !io || (flags & (~MP3D_FLAGS_MASK))) + return MP3D_E_PARAM; + memset(dec, 0, sizeof(*dec)); +#ifdef MINIMP3_HAVE_RING + int ret; + if (ret = mp3dec_open_ring(&dec->file, MINIMP3_IO_SIZE)) + return ret; +#else + dec->file.size = MINIMP3_IO_SIZE; + dec->file.buffer = (const uint8_t*)malloc(dec->file.size); + if (!dec->file.buffer) + return MP3D_E_MEMORY; +#endif + dec->flags = flags; + dec->io = io; + mp3dec_init(&dec->mp3d); + if (io->seek(0, io->seek_data)) + return MP3D_E_IOERROR; + int ret = mp3dec_iterate_cb(io, (uint8_t *)dec->file.buffer, dec->file.size, mp3dec_load_index, dec); + if (ret && MP3D_E_USER != ret) + return ret; + if (dec->io->seek(dec->start_offset, dec->io->seek_data)) + return MP3D_E_IOERROR; + mp3dec_init(&dec->mp3d); + dec->buffer_samples = 0; + dec->indexes_built = !(dec->vbr_tag_found || (flags & MP3D_DO_NOT_SCAN)); + dec->flags &= (~MP3D_DO_NOT_SCAN); + return 0; +} + + +#ifndef MINIMP3_NO_STDIO + +#if defined(__linux__) || defined(__FreeBSD__) +#include +#include +#include +#include +#include +#include +#if !defined(_GNU_SOURCE) +#include +#include +#endif +#if !defined(MAP_POPULATE) && defined(__linux__) +#define MAP_POPULATE 0x08000 +#elif !defined(MAP_POPULATE) +#define MAP_POPULATE 0 +#endif + +static void mp3dec_close_file(mp3dec_map_info_t *map_info) +{ + if (map_info->buffer && MAP_FAILED != map_info->buffer) + munmap((void *)map_info->buffer, map_info->size); + map_info->buffer = 0; + map_info->size = 0; +} + +static int mp3dec_open_file(const char *file_name, mp3dec_map_info_t *map_info) +{ + if (!file_name) + return MP3D_E_PARAM; + int file; + struct stat st; + memset(map_info, 0, sizeof(*map_info)); +retry_open: + file = open(file_name, O_RDONLY); + if (file < 0 && (errno == EAGAIN || errno == EINTR)) + goto retry_open; + if (file < 0 || fstat(file, &st) < 0) + { + close(file); + return MP3D_E_IOERROR; + } + + map_info->size = st.st_size; +retry_mmap: + map_info->buffer = (const uint8_t *)mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE | MAP_POPULATE, file, 0); + if (MAP_FAILED == map_info->buffer && (errno == EAGAIN || errno == EINTR)) + goto retry_mmap; + close(file); + if (MAP_FAILED == map_info->buffer) + return MP3D_E_IOERROR; + return 0; +} + +#if MINIMP3_ENABLE_RING && defined(__linux__) && defined(_GNU_SOURCE) +#define MINIMP3_HAVE_RING +static void mp3dec_close_ring(mp3dec_map_info_t *map_info) +{ +#if defined(__linux__) && defined(_GNU_SOURCE) + if (map_info->buffer && MAP_FAILED != map_info->buffer) + munmap((void *)map_info->buffer, map_info->size*2); +#else + if (map_info->buffer) + { + shmdt(map_info->buffer); + shmdt(map_info->buffer + map_info->size); + } +#endif + map_info->buffer = 0; + map_info->size = 0; +} + +static int mp3dec_open_ring(mp3dec_map_info_t *map_info, size_t size) +{ + int memfd, page_size; +#if defined(__linux__) && defined(_GNU_SOURCE) + void *buffer; + int res; +#endif + memset(map_info, 0, sizeof(*map_info)); + +#ifdef _SC_PAGESIZE + page_size = sysconf(_SC_PAGESIZE); +#else + page_size = getpagesize(); +#endif + map_info->size = (size + page_size - 1)/page_size*page_size; + +#if defined(__linux__) && defined(_GNU_SOURCE) + memfd = memfd_create("mp3_ring", 0); + if (memfd < 0) + return MP3D_E_MEMORY; + +retry_ftruncate: + res = ftruncate(memfd, map_info->size); + if (res && (errno == EAGAIN || errno == EINTR)) + goto retry_ftruncate; + if (res) + goto error; + +retry_mmap: + map_info->buffer = (const uint8_t *)mmap(NULL, map_info->size*2, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + if (MAP_FAILED == map_info->buffer && (errno == EAGAIN || errno == EINTR)) + goto retry_mmap; + if (MAP_FAILED == map_info->buffer || !map_info->buffer) + goto error; +retry_mmap2: + buffer = mmap((void *)map_info->buffer, map_info->size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, memfd, 0); + if (MAP_FAILED == map_info->buffer && (errno == EAGAIN || errno == EINTR)) + goto retry_mmap2; + if (MAP_FAILED == map_info->buffer || buffer != (void *)map_info->buffer) + goto error; +retry_mmap3: + buffer = mmap((void *)map_info->buffer + map_info->size, map_info->size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, memfd, 0); + if (MAP_FAILED == map_info->buffer && (errno == EAGAIN || errno == EINTR)) + goto retry_mmap3; + if (MAP_FAILED == map_info->buffer || buffer != (void *)(map_info->buffer + map_info->size)) + goto error; + + close(memfd); + return 0; +error: + close(memfd); + mp3dec_close_ring(map_info); + return MP3D_E_MEMORY; +#else + memfd = shmget(IPC_PRIVATE, map_info->size, IPC_CREAT | 0700); + if (memfd < 0) + return MP3D_E_MEMORY; +retry_mmap: + map_info->buffer = (const uint8_t *)mmap(NULL, map_info->size*2, PROT_NONE, MAP_PRIVATE, -1, 0); + if (MAP_FAILED == map_info->buffer && (errno == EAGAIN || errno == EINTR)) + goto retry_mmap; + if (MAP_FAILED == map_info->buffer) + goto error; + if (map_info->buffer != shmat(memfd, map_info->buffer, 0)) + goto error; + if ((map_info->buffer + map_info->size) != shmat(memfd, map_info->buffer + map_info->size, 0)) + goto error; + if (shmctl(memfd, IPC_RMID, NULL) < 0) + return MP3D_E_MEMORY; + return 0; +error: + shmctl(memfd, IPC_RMID, NULL); + mp3dec_close_ring(map_info); + return MP3D_E_MEMORY; +#endif +} +#endif /*MINIMP3_ENABLE_RING*/ +#elif defined(_WIN32) +#include + +static void mp3dec_close_file(mp3dec_map_info_t *map_info) +{ + if (map_info->buffer) + UnmapViewOfFile(map_info->buffer); + map_info->buffer = 0; + map_info->size = 0; +} + +static int mp3dec_open_file_h(HANDLE file, mp3dec_map_info_t *map_info) +{ + memset(map_info, 0, sizeof(*map_info)); + + HANDLE mapping = NULL; + LARGE_INTEGER s; + s.LowPart = GetFileSize(file, (DWORD*)&s.HighPart); + if (s.LowPart == INVALID_FILE_SIZE && GetLastError() != NO_ERROR) + goto error; + map_info->size = s.QuadPart; + + mapping = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL); + if (!mapping) + goto error; + map_info->buffer = (const uint8_t*)MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, s.QuadPart); + CloseHandle(mapping); + if (!map_info->buffer) + goto error; + + CloseHandle(file); + return 0; +error: + mp3dec_close_file(map_info); + CloseHandle(file); + return MP3D_E_IOERROR; +} + +static int mp3dec_open_file(const char *file_name, mp3dec_map_info_t *map_info) +{ + if (!file_name) + return MP3D_E_PARAM; + HANDLE file = CreateFileA(file_name, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + if (INVALID_HANDLE_VALUE == file) + return MP3D_E_IOERROR; + return mp3dec_open_file_h(file, map_info); +} + +static int mp3dec_open_file_w(const wchar_t *file_name, mp3dec_map_info_t *map_info) +{ + if (!file_name) + return MP3D_E_PARAM; + HANDLE file = CreateFileW(file_name, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + if (INVALID_HANDLE_VALUE == file) + return MP3D_E_IOERROR; + return mp3dec_open_file_h(file, map_info); +} +#else +#include + +static void mp3dec_close_file(mp3dec_map_info_t *map_info) +{ + if (map_info->buffer) + free((void *)map_info->buffer); + map_info->buffer = 0; + map_info->size = 0; +} + +static int mp3dec_open_file(const char *file_name, mp3dec_map_info_t *map_info) +{ + if (!file_name) + return MP3D_E_PARAM; + memset(map_info, 0, sizeof(*map_info)); + FILE *file = fopen(file_name, "rb"); + if (!file) + return MP3D_E_IOERROR; + int res = MP3D_E_IOERROR; + long size = -1; + if (fseek(file, 0, SEEK_END)) + goto error; + size = ftell(file); + if (size < 0) + goto error; + map_info->size = (size_t)size; + if (fseek(file, 0, SEEK_SET)) + goto error; + map_info->buffer = (uint8_t *)malloc(map_info->size); + if (!map_info->buffer) + { + res = MP3D_E_MEMORY; + goto error; + } + if (fread((void *)map_info->buffer, 1, map_info->size, file) != map_info->size) + goto error; + fclose(file); + return 0; +error: + mp3dec_close_file(map_info); + fclose(file); + return res; +} +#endif + +static int mp3dec_detect_mapinfo(mp3dec_map_info_t *map_info) +{ + int ret = mp3dec_detect_buf(map_info->buffer, map_info->size); + mp3dec_close_file(map_info); + return ret; +} + +static int mp3dec_load_mapinfo(mp3dec_t *dec, mp3dec_map_info_t *map_info, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data) +{ + int ret = mp3dec_load_buf(dec, map_info->buffer, map_info->size, info, progress_cb, user_data); + mp3dec_close_file(map_info); + return ret; +} + +static int mp3dec_iterate_mapinfo(mp3dec_map_info_t *map_info, MP3D_ITERATE_CB callback, void *user_data) +{ + int ret = mp3dec_iterate_buf(map_info->buffer, map_info->size, callback, user_data); + mp3dec_close_file(map_info); + return ret; +} + +static int mp3dec_ex_open_mapinfo(mp3dec_ex_t *dec, int flags) +{ + int ret = mp3dec_ex_open_buf(dec, dec->file.buffer, dec->file.size, flags); + dec->is_file = 1; + if (ret) + mp3dec_ex_close(dec); + return ret; +} + +int mp3dec_detect(const char *file_name) +{ + int ret; + mp3dec_map_info_t map_info; + if ((ret = mp3dec_open_file(file_name, &map_info))) + return ret; + return mp3dec_detect_mapinfo(&map_info); +} + +int mp3dec_load(mp3dec_t *dec, const char *file_name, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data) +{ + int ret; + mp3dec_map_info_t map_info; + if ((ret = mp3dec_open_file(file_name, &map_info))) + return ret; + return mp3dec_load_mapinfo(dec, &map_info, info, progress_cb, user_data); +} + +int mp3dec_iterate(const char *file_name, MP3D_ITERATE_CB callback, void *user_data) +{ + int ret; + mp3dec_map_info_t map_info; + if ((ret = mp3dec_open_file(file_name, &map_info))) + return ret; + return mp3dec_iterate_mapinfo(&map_info, callback, user_data); +} + +int mp3dec_ex_open(mp3dec_ex_t *dec, const char *file_name, int flags) +{ + int ret; + if (!dec) + return MP3D_E_PARAM; + if ((ret = mp3dec_open_file(file_name, &dec->file))) + return ret; + return mp3dec_ex_open_mapinfo(dec, flags); +} + +void mp3dec_ex_close(mp3dec_ex_t *dec) +{ +#ifdef MINIMP3_HAVE_RING + if (dec->io) + mp3dec_close_ring(&dec->file); +#else + if (dec->io && dec->file.buffer) + free((void*)dec->file.buffer); +#endif + if (dec->is_file) + mp3dec_close_file(&dec->file); + if (dec->index.frames) + free(dec->index.frames); + memset(dec, 0, sizeof(*dec)); +} + +#ifdef _WIN32 +int mp3dec_detect_w(const wchar_t *file_name) +{ + int ret; + mp3dec_map_info_t map_info; + if ((ret = mp3dec_open_file_w(file_name, &map_info))) + return ret; + return mp3dec_detect_mapinfo(&map_info); +} + +int mp3dec_load_w(mp3dec_t *dec, const wchar_t *file_name, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data) +{ + int ret; + mp3dec_map_info_t map_info; + if ((ret = mp3dec_open_file_w(file_name, &map_info))) + return ret; + return mp3dec_load_mapinfo(dec, &map_info, info, progress_cb, user_data); +} + +int mp3dec_iterate_w(const wchar_t *file_name, MP3D_ITERATE_CB callback, void *user_data) +{ + int ret; + mp3dec_map_info_t map_info; + if ((ret = mp3dec_open_file_w(file_name, &map_info))) + return ret; + return mp3dec_iterate_mapinfo(&map_info, callback, user_data); +} + +int mp3dec_ex_open_w(mp3dec_ex_t *dec, const wchar_t *file_name, int flags) +{ + int ret; + if ((ret = mp3dec_open_file_w(file_name, &dec->file))) + return ret; + return mp3dec_ex_open_mapinfo(dec, flags); +} +#endif +#else /* MINIMP3_NO_STDIO */ +void mp3dec_ex_close(mp3dec_ex_t *dec) +{ +#ifdef MINIMP3_HAVE_RING + if (dec->io) + mp3dec_close_ring(&dec->file); +#else + if (dec->io && dec->file.buffer) + free((void*)dec->file.buffer); +#endif + if (dec->index.frames) + free(dec->index.frames); + memset(dec, 0, sizeof(*dec)); +} +#endif + +#endif /* MINIMP3_IMPLEMENTATION && !_MINIMP3_EX_IMPLEMENTATION_GUARD */ diff --git a/core/cart_hw/paprium.h b/core/cart_hw/paprium.h new file mode 100644 index 000000000..9acf355ef --- /dev/null +++ b/core/cart_hw/paprium.h @@ -0,0 +1,2863 @@ +/* +Project Little Man +*/ + +#ifdef _WIN32 +#include +#include +#endif + + +#define DEBUG_SPRITE 0 +#define DEBUG_MODE 0 +#define DEBUG_CHEAT 0 + + +#define MINIMP3_IMPLEMENTATION +#include "minimp3_ex.h" + + +static mp3dec_t paprium_mp3d; +static mp3dec_file_info_t paprium_mp3d_info; + +static mp3dec_t paprium_mp3d_boss1; +static mp3dec_file_info_t paprium_mp3d_info_boss1; + +static mp3dec_t paprium_mp3d_boss2; +static mp3dec_file_info_t paprium_mp3d_info_boss2; + +static mp3dec_t paprium_mp3d_boss3; +static mp3dec_file_info_t paprium_mp3d_info_boss3; + +static mp3dec_t paprium_mp3d_boss4; +static mp3dec_file_info_t paprium_mp3d_info_boss4; + +static int paprium_track_last; +extern char g_rom_dir[256]; + + +#define PAPRIUM_BOSS1 0x17 +#define PAPRIUM_BOSS2 0x21 +#define PAPRIUM_BOSS3 0x22 +#define PAPRIUM_BOSS4 0x23 + + +static int skip_boot1 = 1; + + +extern T_SRAM sram; + + +extern retro_log_printf_t log_cb; +static char error_str[1024]; +static int paprium_cmd_count = 0; + +#define m68k_read_immediate_16(address) *(uint16 *)(m68k.memory_map[((address)>>16)&0xff].base + ((address) & 0xffff)) +#define m68k_read_immediate_32(address) (m68k_read_immediate_16(address) << 16) | (m68k_read_immediate_16(address+2)) + + +static uint8 paprium_obj_ram[0x80000]; +static uint8 paprium_wave_ram[0x180000]; + +static int paprium_tmss = 1; +int fast_dma_hack = 0; + +static int paprium_music_ptr; +static int paprium_wave_ptr; +static int paprium_sfx_ptr; +static int paprium_tile_ptr; +static int paprium_sprite_ptr; + + +typedef struct paprium_voice_t +{ + int volume; + int panning; + int flags; + int type; + + int size; + int ptr; + int tick; + + int loop; + int echo; + int program; + + + int count; + + int time; + + int start; + int num; + + int decay; + int decay2; + int release; + int sustain; + + int duration; + int velocity; + int keyon; + int key_type; + int pitch; + int cents; + int modulation; +} paprium_voice_t; + + +struct paprium_t +{ + uint8 ram[0x10000]; + uint8 decoder_ram[0x10000]; + uint8 scaler_ram[0x1000]; + uint8 music_ram[0x8000]; + uint8 exps_ram[14*8]; + + paprium_voice_t sfx[8]; + paprium_voice_t music[26]; + + int music_section, audio_tick, music_segment; + + int out_l, out_r; + int audio_flags, sfx_volume, music_volume; + + int decoder_mode, decoder_ptr, decoder_size; + int draw_src, draw_dst; + int obj[0x31]; + + int echo_l[48000/4], echo_r[48000/4]; + int echo_ptr, echo_pan; + + int music_track, mp3_ptr, music_tick; +} paprium_s; + + +uint8 paprium_volume_table[256] = +{ + 0x00, 0x03, 0x07, 0x0B, 0x0E, 0x12, 0x15, 0x18, 0x1B, 0x1E, 0x21, 0x24, 0x27, 0x29, 0x2C, 0x2F, + 0x31, 0x34, 0x36, 0x38, 0x3B, 0x3D, 0x3F, 0x41, 0x44, 0x46, 0x48, 0x4A, 0x4C, 0x4E, 0x50, 0x51, + 0x53, 0x55, 0x57, 0x59, 0x5A, 0x5C, 0x5E, 0x5F, 0x61, 0x63, 0x64, 0x66, 0x67, 0x69, 0x6A, 0x6C, + 0x6D, 0x6F, 0x70, 0x72, 0x73, 0x74, 0x76, 0x77, 0x78, 0x7A, 0x7B, 0x7C, 0x7E, 0x7F, 0x80, 0x81, + 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, + 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, + 0xA4, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xAF, 0xB0, + 0xB1, 0xB2, 0xB3, 0xB3, 0xB4, 0xB5, 0xB6, 0xB6, 0xB7, 0xB8, 0xB9, 0xB9, 0xBA, 0xBB, 0xBC, 0xBC, + 0xBD, 0xBE, 0xBE, 0xBF, 0xC0, 0xC1, 0xC1, 0xC2, 0xC3, 0xC3, 0xC4, 0xC5, 0xC5, 0xC6, 0xC7, 0xC7, + 0xC8, 0xC9, 0xC9, 0xCA, 0xCA, 0xCB, 0xCC, 0xCC, 0xCD, 0xCE, 0xCE, 0xCF, 0xCF, 0xD0, 0xD1, 0xD1, + 0xD2, 0xD2, 0xD3, 0xD3, 0xD4, 0xD5, 0xD5, 0xD6, 0xD6, 0xD7, 0xD7, 0xD8, 0xD9, 0xD9, 0xDA, 0xDA, + 0xDB, 0xDB, 0xDC, 0xDC, 0xDD, 0xDD, 0xDE, 0xDF, 0xDF, 0xE0, 0xE0, 0xE1, 0xE1, 0xE2, 0xE2, 0xE3, + 0xE3, 0xE4, 0xE4, 0xE5, 0xE5, 0xE6, 0xE6, 0xE7, 0xE7, 0xE8, 0xE8, 0xE9, 0xE9, 0xEA, 0xEA, 0xEA, + 0xEB, 0xEB, 0xEC, 0xEC, 0xED, 0xED, 0xEE, 0xEE, 0xEF, 0xEF, 0xF0, 0xF0, 0xF0, 0xF1, 0xF1, 0xF2, + 0xF2, 0xF3, 0xF3, 0xF4, 0xF4, 0xF4, 0xF5, 0xF5, 0xF6, 0xF6, 0xF7, 0xF7, 0xF7, 0xF8, 0xF8, 0xF9, + 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, +}; + + +static void paprium_load_mp3(int track, int reload) +{ + static char name[512]; + + paprium_s.music_track = track; + +#ifdef _WIN32 + sprintf(error_str, "%s\\paprium\\", g_rom_dir); +#else + sprintf(error_str, "%s/paprium/", g_rom_dir); +#endif + + switch(track) { + case 0x01: sprintf(name, "%s02 90's Acid Dub Character Select.mp3", error_str); break; + case 0x02: sprintf(name, "%s08 90's Dance.mp3", error_str); break; + case 0x03: sprintf(name, "%s42 1988 Commercial.mp3", error_str); break; + case 0x04: sprintf(name, "%s05 Asian Chill.mp3", error_str); break; + case 0x05: sprintf(name, "%s31 Bad Dudes vs Paprium.mp3", error_str); break; + case 0x06: sprintf(name, "%s43 Blade FM.mp3", error_str); break; + case 0x07: sprintf(name, "%s03 Bone Crusher.mp3", error_str); break; + case 0x0B: sprintf(name, "%s26 Club Shuffle.mp3", error_str); break; + case 0x0C: sprintf(name, "%s23 Continue.mp3", error_str); break; /* Continue Fast */ + case 0x0E: sprintf(name, "%s07 Cool Groove.mp3", error_str); break; + case 0x0F: sprintf(name, "%s36 Cyberpunk Ninja.mp3", error_str); break; + case 0x10: sprintf(name, "%s35 Cyberpunk Funk.mp3", error_str); break; + case 0x11: sprintf(name, "%s30 Cyber Interlude.mp3", error_str); break; + case 0x12: sprintf(name, "%s21 Cyborg Invasion.mp3", error_str); break; + case 0x13: sprintf(name, "%s44 Dark Alley.mp3", error_str); break; + case 0x14: sprintf(name, "%s29 Dark & Power Mad.mp3", error_str); break; + case 0x15: sprintf(name, "%s24 Intro.mp3", error_str); break; /* Dark Bounce */ + case 0x16: sprintf(name, "%s27 Dark Rock.mp3", error_str); break; + case 0x17: sprintf(name, "%s04 Drumbass Boss.mp3", error_str); break; + case 0x18: sprintf(name, "%s45 Dubstep Groove.mp3", error_str); break; + case 0x19: sprintf(name, "%s15 Electro Acid Funk.mp3", error_str); break; + case 0x1B: sprintf(name, "%s28 Evolve.mp3", error_str); break; + case 0x1C: sprintf(name, "%s33 Funk Enhanced Mix.mp3", error_str); break; + case 0x1D: sprintf(name, "%s41 Game Over.mp3", error_str); break; + case 0x1E: sprintf(name, "%s46 Gothic.mp3", error_str); break; + case 0x20: sprintf(name, "%s13 Hard Rock.mp3", error_str); break; + case 0x21: sprintf(name, "%s22 Hardcore BP1.mp3", error_str); break; + case 0x22: sprintf(name, "%s11 Hardcore BP2.mp3", error_str); break; + case 0x23: sprintf(name, "%s38 Hardcore BP3.mp3", error_str); break; + case 0x24: sprintf(name, "%s40 Score.mp3", error_str); break; /* High Score */ + case 0x25: sprintf(name, "%s47 House.mp3", error_str); break; + case 0x26: sprintf(name, "%s17 Indie Shuffle.mp3", error_str); break; + case 0x27: sprintf(name, "%s25 Indie Break Beat.mp3", error_str); break; + case 0x28: sprintf(name, "%s16 Jazzy Shuffle.mp3", error_str); break; + case 0x2A: sprintf(name, "%s19 Neo Metal.mp3", error_str); break; + case 0x2B: sprintf(name, "%s14 Neon Rider.mp3", error_str); break; + case 0x2E: sprintf(name, "%s09 Retro Beat.mp3", error_str); break; + case 0x2F: sprintf(name, "%s20 Sadness.mp3", error_str); break; + case 0x31: sprintf(name, "%s18 Slow Asian Beat.mp3", error_str); break; + case 0x32: sprintf(name, "%s48 Slow Mood.mp3", error_str); break; /* Slow Mood Ext. ? */ + case 0x33: sprintf(name, "%s49 Smooth Coords.mp3", error_str); break; + case 0x34: sprintf(name, "%s10 Spiral.mp3", error_str); break; + case 0x35: sprintf(name, "%s12 Stage Clear.mp3", error_str); break; + case 0x36: sprintf(name, "%s32 Summer Breeze.mp3", error_str); break; + case 0x37: sprintf(name, "%s06 Techno Beats.mp3", error_str); break; + case 0x38: sprintf(name, "%s50 Tension.mp3", error_str); break; + case 0x39: sprintf(name, "%s01 Theme of Paprium.mp3", error_str); break; + case 0x3A: sprintf(name, "%s39 Ending.mp3", error_str); break; /* Tough Guy */ + case 0x3B: sprintf(name, "%s34 Transe.mp3", error_str); break; + case 0x3C: sprintf(name, "%s37 Urban.mp3", error_str); break; + case 0x3D: sprintf(name, "%s51 Water.mp3", error_str); break; + case 0x3E: sprintf(name, "%s52 Waterfront Beat.mp3", error_str); break; + default: paprium_s.music_track = 0; return; + } + + if( reload ) + paprium_s.mp3_ptr = 0; + + paprium_s.music_tick = 0; + + if( track != PAPRIUM_BOSS1 && track != PAPRIUM_BOSS2 && track != PAPRIUM_BOSS3 && track != PAPRIUM_BOSS4 ) { + if( mp3dec_load(&paprium_mp3d, name, &paprium_mp3d_info, NULL, NULL) ) { + paprium_s.music_track = 0; + return; + } + } +} + + +static void paprium_load_mp3_boss() +{ + static char name[512]; + +#ifdef _WIN32 + sprintf(error_str, "%s\\paprium\\", g_rom_dir); +#else + sprintf(error_str, "%s/paprium/", g_rom_dir); +#endif + + sprintf(name, "%s04 Drumbass Boss.mp3", error_str); + mp3dec_load(&paprium_mp3d_boss1, name, &paprium_mp3d_info_boss1, NULL, NULL); + + sprintf(name, "%s22 Hardcore BP1.mp3", error_str); + mp3dec_load(&paprium_mp3d_boss2, name, &paprium_mp3d_info_boss2, NULL, NULL); + + sprintf(name, "%s11 Hardcore BP2.mp3", error_str); + mp3dec_load(&paprium_mp3d_boss3, name, &paprium_mp3d_info_boss3, NULL, NULL); + + sprintf(name, "%s38 Hardcore BP3.mp3", error_str); + mp3dec_load(&paprium_mp3d_boss4, name, &paprium_mp3d_info_boss4, NULL, NULL); +} + + +static void paprium_music_sheet() +{ + int ch; + int l = 0, r = 0; + + /* 00-04 = WMMM */ + /* 05, 06, 07 */ + int sections = paprium_s.music_ram[0x09]; + /* 09 */ + int bars = (paprium_s.music_ram[0x0B] ? paprium_s.music_ram[0x0B] : 0x100) + 8; + /* 0B */ + int cmds = paprium_s.music_ram[0x0D]; + /* 10-29 */ + /* 2A-43 */ + /* 44-5D */ + /* 5E-77 */ + /* 78-97 = title ^ 0xA5 */ + /* 98-B7 = author ^ 0xA5 */ + /* B8-D7 = comment ^ 0xA5 */ + + + if( paprium_s.music_segment == -1 ) { + paprium_s.music_track = 0; + return; + } + + if( paprium_s.audio_tick < 4 ) + return; + paprium_s.audio_tick = 0; + + +#if 0 + sprintf(error_str, "Music_Sheet %X %X - %X %X\n", paprium_s.music_segment, paprium_s.music_section, sections, bars); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + for( ch = 0; ch < 26; ch++ ) { + int ptr = *(uint16*)(paprium_s.music_ram + 0xD8 + (ch*sections*2) + (paprium_s.music_segment*2)); + int index = paprium_s.music_ram[(ptr + paprium_s.music_section)^1]; + int code = 0, arg = 0; + int keyon = 0, duration = 0, freq = -1, volume = 0; + paprium_voice_t *voice = paprium_s.music + ch; + + +#if 0 +//if(ch == 0) { +{ + sprintf(error_str, "[%d] Music %X %X %X = %X\n", ch, ptr, ptr + paprium_s.music_section, index, (index == 0) ? 0 : ptr + bars + ((index-1)*8) + paprium_s.music_section*2); + log_cb(RETRO_LOG_ERROR, error_str); +} +#endif + + + if( index == 0 ) + goto next; + ptr += bars + (index-1) * 8; + + + for( int lcv = 0; lcv < cmds; lcv++ ) { + code = *(uint16*)(paprium_s.music_ram + ptr + lcv*2); + arg = code & 0xFF; + code >>= 8; + + + if( code == 0x00 ) + {} //break; + + else if( code == 0x01 ) { /* ?? */ + if( ch >= 11-1 ) keyon = code; + voice->volume = 255 - paprium_volume_table[arg]; /* z80 table ? */ + } + + else if( code == 0x02 ) + voice->panning = arg; + + else if( code == 0x03 ) { + voice->volume = 255 - paprium_volume_table[arg]; /* z80 table ? */ + } + + else if( code == 0x05 ) { + voice->volume = 255 - paprium_volume_table[arg]; /* z80 table ? */ + } + + /* velocity */ + + else if( code == 0x08 ) { +#if 0 + sprintf(error_str, "08 - %X %X %X\n", ch, ptr, arg); + log_cb(RETRO_LOG_ERROR, error_str); + //MessageBoxA(0, error_str, "---", 0); +#endif + + freq = arg; + } + + else if( code == 0x0A ) { +#if 0 + sprintf(error_str, "0B - %X %X %X\n", ch, ptr, arg); + log_cb(RETRO_LOG_ERROR, error_str); + //MessageBoxA(0, error_str, "---", 0); +#endif + freq = 0; /* faster ? */ + } + + else if( code == 0x0B ) { +#if 0 + sprintf(error_str, "0B - %X %X %X\n", ch, ptr, arg); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + //MessageBoxA(0, error_str, "---", 0); + } + + else if( code == 0x0C ) { +#if 0 + sprintf(error_str, "0C - %X %X %X\n", ch, ptr, arg); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + //MessageBoxA(0, error_str, "---", 0); + } + + else if( code == 0x0E ) { /* stop ? */ + keyon = 0; + voice->size = 0; + } + + else if( code == 0x0F ) { /* program */ + voice->program = arg; + + if( ch < 6 ) { /* YM */ + } + + else if( ch < 10 ) { /* PSG */ + } + + else + { /* wave */ + } + +#if DEBUG_MODE + sprintf(error_str, "[%d] Sample %X %X\n", ch, arg, ptr); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + } + } + + + if( keyon ) { +#if 0 + uint8* ptr = paprium_wave_ram + voice->program*16; + + voice->ptr = (*(uint16*)(ptr + 0x00)<<16) + *(uint16*)(ptr + 0x02); + voice->size = (*(uint16*)((paprium_wave_ram + 0x04 + voice->program*16))<<16) + *(uint16*)(paprium_wave_ram + 0x06 + voice->program*16); + /* *(uint16*)(paprium_wave_ram + 0x08 + voice->program*16)<<16) + *(uint16*)(paprium_wave_ram + 0x0A + voice->program*16); */ + voice->type = *(uint16*)(paprium_wave_ram + 0x0C + voice->program*16) + 1; + /* *(uint16*)(paprium_wave_ram + 0x0E + voice->program*16); */ + + voice->tick = 0; + voice->time = 0; + + voice->keyon = keyon; + voice->duration = 65536; + voice->release = 256; +#endif + } + + if( freq >= 0 ) { + voice->type = freq; + //if(ch == 16-1) MessageBoxA(0,"hit","-",0); + } + +next: + *(uint16*)(paprium_s.ram + ch*4 + 0x1B98) = index ? 0xE0 : 0; /* L */ + *(uint16*)(paprium_s.ram + ch*4 + 0x1B9A) = index ? 0xE0 : 0; /* R */ + } + + +end: + if( (++paprium_s.music_section) >= bars ) { + paprium_s.music_section = 0; + + if( (++paprium_s.music_segment) >= sections ) + paprium_s.music_segment = 0; + } +} + + +static void paprium_music_synth(int *out_l, int *out_r) +{ + int ch; + int l = 0, r = 0; + + +#if 1 + if( paprium_s.music_track ) { + if( paprium_s.music_track == PAPRIUM_BOSS1 ) { + l = paprium_mp3d_info_boss1.buffer[paprium_s.mp3_ptr]; + r = paprium_mp3d_info_boss1.buffer[paprium_s.mp3_ptr]; + } + else if( paprium_s.music_track == PAPRIUM_BOSS2 ) { + l = paprium_mp3d_info_boss2.buffer[paprium_s.mp3_ptr]; + r = paprium_mp3d_info_boss2.buffer[paprium_s.mp3_ptr]; + } + else if( paprium_s.music_track == PAPRIUM_BOSS3 ) { + l = paprium_mp3d_info_boss3.buffer[paprium_s.mp3_ptr]; + r = paprium_mp3d_info_boss3.buffer[paprium_s.mp3_ptr]; + } + else if( paprium_s.music_track == PAPRIUM_BOSS4 ) { + l = paprium_mp3d_info_boss4.buffer[paprium_s.mp3_ptr]; + r = paprium_mp3d_info_boss4.buffer[paprium_s.mp3_ptr]; + } + else { + l = paprium_mp3d_info.buffer[paprium_s.mp3_ptr]; + r = paprium_mp3d_info.buffer[paprium_s.mp3_ptr]; + } + + + l = (l * paprium_s.music_volume) / 256; + r = (r * paprium_s.music_volume) / 256; + + + paprium_s.music_tick += 0x10000; + if( paprium_s.music_tick >= 0x10000 ) { + paprium_s.music_tick -= 0x10000; + + paprium_s.mp3_ptr += 2; + } + + + if( paprium_s.music_track == PAPRIUM_BOSS1 ) { + if( paprium_s.mp3_ptr >= paprium_mp3d_info_boss1.samples) + paprium_s.mp3_ptr -= paprium_mp3d_info_boss1.samples; + } + else if( paprium_s.music_track == PAPRIUM_BOSS2 ) { + if( paprium_s.mp3_ptr >= paprium_mp3d_info_boss2.samples) + paprium_s.mp3_ptr -= paprium_mp3d_info_boss2.samples; + } + else if( paprium_s.music_track == PAPRIUM_BOSS3 ) { + if( paprium_s.mp3_ptr >= paprium_mp3d_info_boss3.samples) + paprium_s.mp3_ptr -= paprium_mp3d_info_boss3.samples; + } + else if( paprium_s.music_track == PAPRIUM_BOSS4 ) { + if( paprium_s.mp3_ptr >= paprium_mp3d_info_boss4.samples) + paprium_s.mp3_ptr -= paprium_mp3d_info_boss4.samples; + } + else { + if( paprium_s.mp3_ptr >= paprium_mp3d_info.samples) + paprium_s.mp3_ptr -= paprium_mp3d_info.samples; + } + } + + *out_l = l; + *out_r = r; + + return; +#endif + + + for( ch = 0; ch < 26; ch++ ) { + paprium_voice_t *voice = paprium_s.music + ch; + const int _rates[] = {2,4,5,8,9,10}; /* 24000 ?, 12000, 9600, 6000, 5333-?, 4800-? */ + + int rate = _rates[voice->type] << 16; /* 16.16 */ + int vol = voice->volume; + int pan = voice->panning; + + int sample, sample_l, sample_r; + + + //if( ch < 15-1 || ch > 17-1 ) goto next; + +#if 0 + if( ch == 20 ) { + sprintf(error_str, "[%d] %X %X\n", ch, voice->ptr, voice->size); + log_cb(RETRO_LOG_ERROR, error_str); + } + else + goto next; +#endif + + + if( ((paprium_s.audio_tick % 4) == 0) && voice->duration) { + //voice->duration--; + if( voice->duration == 0 ) { + if( voice->keyon == 1 ) /* hard off */ + voice->size = 0; + } + } + + + if( voice->size == 0 ) goto next; + + + sample = *(uint8 *)(paprium_wave_ram + (voice->ptr^1)); + + sample = (((sample & 0xFF) * 65536) / 256) - 32768; + sample = (sample * vol) / 0x300; + + sample_l = (sample * ((pan <= 0x80) ? 0x80 : 0x100 - pan)) / 0x80; + sample_r = (sample * ((pan >= 0x80) ? 0x80 : pan)) / 0x80; + + l += sample_l; + r += sample_r; + + + voice->time++; + voice->tick += 0x10000; + + + if( voice->tick >= rate ) { + voice->tick -= rate; + + voice->size--; + voice->ptr++; + } + + +next: + } + + + *out_l += l; + *out_r += r; +} + + +static void paprium_sfx_voice(int *out_l, int *out_r) +{ + int ch; + int l = 0, r = 0; + + for( ch = 0; ch < 8; ch++ ) { + paprium_voice_t *voice = paprium_s.sfx + ch; + const int _rates[] = {1,2,4,5,8,9}; /* 48000, 24000, 12000, 9600, 6000, 5333 */ + + int rate = _rates[voice->type >> 4] << 16; /* 16.16 */ + int depth = voice->type & 0x03; + /* voice->type & 0xC0; */ + + int vol = voice->volume; + int pan = voice->panning; + + int sample, sample_l, sample_r; + + + if( voice->size == 0 ) goto next; + + + sample = *(uint8 *)(cart.rom + paprium_sfx_ptr + (voice->ptr^1)); + + if( depth == 1 ) + sample = (((sample & 0xFF) * 65536) / 256) - 32768; + + else if( depth == 2 ) { + if( voice->count == 0 ) + sample >>= 4; + + sample = (((sample & 0x0F) * 65536) / 16) - 32768; + } + + + sample = (sample * vol) / 0x400; + + sample_l = (sample * ((pan <= 0x80) ? 0x80 : 0x100 - pan)) / 0x80; + sample_r = (sample * ((pan >= 0x80) ? 0x80 : pan)) / 0x80; + + l += sample_l; + r += sample_r; + + + if( voice->flags & 0x4000 ) { /* echo */ + if( voice->echo & 1 ) + paprium_s.echo_l[paprium_s.echo_ptr % (48000/6)] += (sample_l * 33) / 100; + else + paprium_s.echo_r[paprium_s.echo_ptr % (48000/6)] += (sample_r * 33) / 100; + } + + + if( voice->flags & 0x100 ) { /* amplify */ + l = (l * 125) / 100; + r = (r * 125) / 100; + } + + voice->time++; + + voice->tick += 0x10000; + voice->tick -= (voice->flags & 0x8000) ? 0x800 : 0; /* tiny pitch */ + voice->tick -= (voice->flags & 0x2000) ? 0x8000 : 0; /* huge pitch */ + + + if( voice->tick >= rate ) { + voice->tick -= rate; + + voice->count++; + voice->size--; + + if( voice->count >= depth ) { + voice->ptr++; + + voice->count = 0; + } + } + + +next: + if( voice->size == 0 ) { + voice->count = 0; + + if( voice->loop ) { + uint8 *sfx = paprium_sfx_ptr + cart.rom; + + voice->ptr = (*(uint16 *)(sfx + voice->num*8) << 16) | (*(uint16 *)(sfx + voice->num*8 + 2)); + voice->size = (*(uint8 *)(sfx + voice->num*8 + 4) << 16) | (*(uint16 *)(sfx + voice->num*8 + 6)); + } + } + } + + *out_l += l; + *out_r += r; +} + + +void paprium_audio(int cycles) +{ + int lcv; + int samples = blip_clocks_needed(snd.blips[3], cycles); + + +#if DEBUG_MODE + sprintf(error_str, "Audio frame %X - %X\n", samples, cycles); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + if( paprium_s.music_track != paprium_track_last ) { + paprium_load_mp3(paprium_s.music_track, 0); + } + + + paprium_s.audio_tick++; + + + for( lcv = 0; lcv < samples; lcv++ ) { + int l = 0, r = 0; + int ch; + + + paprium_s.echo_l[paprium_s.echo_ptr] = 0; + paprium_s.echo_r[paprium_s.echo_ptr] = 0; + + + paprium_music_synth(&l, &r); + paprium_sfx_voice(&l, &r); + + + paprium_s.echo_ptr = (paprium_s.echo_ptr+1) % (48000/6); + + l += paprium_s.echo_l[paprium_s.echo_ptr]; + r += paprium_s.echo_r[paprium_s.echo_ptr]; + + + l = (l * paprium_s.sfx_volume) / 0x100; + r = (r * paprium_s.sfx_volume) / 0x100; + + + if( paprium_s.audio_flags & 0x08 ) { /* gain */ + l = l * 4 / 2; + r = r * 4 / 2; + } + + + if( l > 32767 ) l = 32767; + else if( l < -32768 ) l = -32768; + + if( r > 32767 ) r = 32767; + else if( r < -32768 ) r = -32768; + + + blip_add_delta_fast(snd.blips[3], lcv, l-paprium_s.out_l, r-paprium_s.out_r); + + + paprium_s.out_l = l; + paprium_s.out_r = r; + } + + + paprium_music_sheet(); + + +#if DEBUG_MODE + for( lcv = 0; lcv < 8; lcv++ ) { + if( !paprium_s.sfx[lcv].decay ) continue; + + sprintf(error_str, "[%d] %d %d %d - %d %d\n", lcv, paprium_s.sfx[lcv].loop, paprium_s.sfx[lcv].volume, paprium_s.sfx[lcv].size, paprium_s.sfx[lcv].decay, paprium_s.sfx[lcv].decay2); + log_cb(RETRO_LOG_ERROR, error_str); + + paprium_s.sfx[lcv].decay2 += paprium_s.sfx[lcv].decay; + while( paprium_s.sfx[lcv].decay2 >= 2 ) { /* stage1 intro sound fade-out time ?? 2 seems decent */ + paprium_s.sfx[lcv].volume -= 1; + if( paprium_s.sfx[lcv].volume < 0 ) paprium_s.sfx[lcv].volume = 0; + + paprium_s.sfx[lcv].decay2 -= 2; + } + } +#endif + + + blip_end_frame(snd.blips[3], samples); + + + paprium_track_last = paprium_s.music_track; +} + + +static void paprium_decoder_lz_rle(uint src, uint8 *dst) +{ + int size = 0; + int len, lz, rle, code; + + +#if 0 + sprintf(error_str, "LZ-RLE %X\n", src); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + while(1) { + int type = cart.rom[(src++)^1]; + + code = type >> 6; + len = type & 0x3F; + + + if( (code == 0) && (len == 0)) + break; + + else if( code == 1 ) + rle = cart.rom[(src++)^1]; + + else if( code == 2 ) + lz = size - cart.rom[(src++)^1]; + + + while( len-- > 0 ) { + switch(code) { + case 0: dst[(size++)^1] = cart.rom[(src++)^1]; break; + case 1: dst[(size++)^1] = rle; break; + case 2: dst[(size++)^1] = dst[(lz++)^1]; break; + case 3: dst[(size++)^1] = 0; break; + } + } + } + +#if 0 + sprintf(error_str, "STOP %X - %X\n", src, size); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + paprium_s.decoder_size = size; +} + + +static void paprium_decoder_lzo(uint src, uint8 *dst) +{ + int size = 0; + int len, lz, raw; + int state = 0; + + +#if 0 + sprintf(error_str, "LZO %X\n", src); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + while(1) { + int code = cart.rom[(src++)^1]; + + if( code & 0x80 ) goto code_80; + if( code & 0x40 ) goto code_40; + if( code & 0x20 ) goto code_20; + if( code & 0x10 ) goto code_10; + + +code_00: + if( state == 0 ) { + raw = code & 0x0F; + + if( raw == 0 ) { + int extra = 0; + + while(1) { + raw = cart.rom[(src++)^1]; + if( raw ) break; + + extra += 255; + } + + raw += extra; + raw += 15; + } + raw += 3; + + len = 0; + state = 4; + goto copy_loop; + } + + else if( state < 4 ) { + raw = code & 0x03; + lz = (code >> 2) & 0x03; + + lz += cart.rom[(src++)^1] << 2; + lz += 1; + + len = 2; + goto copy_loop; + } + + else { + raw = code & 0x03; + lz = (code >> 2) & 0x03; + + lz += cart.rom[(src++)^1] << 2; + lz += 2049; + + len = 3; + goto copy_loop; + } + + +code_10: + len = code & 0x07; + + if( len == 0 ) { + int extra = 0; + + while(1) { + len = cart.rom[(src++)^1]; + if( len ) break; + + extra += 255; + } + + len += extra; + len += 7; + } + len += 2; + + + lz = ((code >> 3) & 1) << 14; + + code = cart.rom[(src++)^1]; + raw = code & 0x03; + lz += code >> 2; + + lz += cart.rom[(src++)^1] << 6; + lz += 16384; + + if( lz == 16384 ) break; + goto copy_loop; + + +code_20: + len = code & 0x1F; + + if( len == 0 ) { + int extra = 0; + + while(1) { + len = cart.rom[(src++)^1]; + if( len ) break; + + extra += 255; + } + + len += extra; + len += 31; + } + len += 2; + + + code = cart.rom[(src++)^1]; + raw = code & 0x03; + + lz = code >> 2; + lz += cart.rom[(src++)^1] << 6; + lz += 1; + + goto copy_loop; + + +code_40: + raw = code & 0x03; + len = ((code >> 5) & 1) + 3; + lz = (code >> 2) & 0x07; + + lz += cart.rom[(src++)^1] << 3; + lz += 1; + + goto copy_loop; + + +code_80: + raw = code & 0x03; + len = ((code >> 5) & 0x03) + 5; + lz = (code >> 2) & 0x07; + + lz += cart.rom[(src++)^1] << 3; + lz += 1; + + +copy_loop: + if( len > 0 ) + state = raw; + else + state = 4; + + + lz = size - lz; + + while(1) { + if( len > 0 ) { + dst[(size++)^1] = dst[(lz++)^1]; + len--; + } + + else if( raw > 0 ) { + dst[(size++)^1] = cart.rom[(src++)^1]; + raw--; + } + + else + break; + } + } + + +#if 0 + sprintf(error_str, "END %X - %X\n", src, size); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + paprium_s.decoder_size = size; +} + + +static void paprium_decoder_type(int src, uint8 *dst) +{ + int type = cart.rom[(src++)^1]; + + if( type == 0x80 ) + paprium_decoder_lz_rle(src, dst); + + else if( type == 0x81 ) + paprium_decoder_lzo(src, dst); + + else { +#if DEBUG_MODE + sprintf(error_str, "%X - Decoder_Type %X\n", src-1, type); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "paprium_decoder_init", 0); +#endif + } +} + + +static int paprium_decoder(int mode) +{ +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM Decoder %02X -- %04X %04X %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + mode, *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12), *(uint16 *)(paprium_s.ram + 0x1E14)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + int offset = *(uint16 *)(paprium_s.ram + 0x1E10); + int ptr = (*(uint16 *)(paprium_s.ram + 0x1E12) << 16) + *(uint16 *)(paprium_s.ram + 0x1E14); + + +#if DEBUG_MODE + if( mode != 2 && mode != 7 ) { + sprintf(error_str, "Mode %X", mode); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "Decoder_Init", 0); + } +#endif + + + paprium_decoder_type(ptr, paprium_s.decoder_ram + offset); + + + paprium_s.decoder_mode = mode; + paprium_s.decoder_ptr = offset; + + +#if DEBUG_MODE + if( paprium_cmd_count != 3 ) { + sprintf(error_str, "Decoder %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif +} + + +static int paprium_decoder_copy(int arg) +{ + /* *(uint16 *)(paprium_s.ram + 0x1E10); */ + int offset = *(uint16 *)(paprium_s.ram + 0x1E12); + int size = *(uint16 *)(paprium_s.ram + 0x1E14); + + +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM Decoder_Copy %02X [%X] -- %04X %04X %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + arg, paprium_s.decoder_ptr, + *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12), *(uint16 *)(paprium_s.ram + 0x1E14)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + +#if DEBUG_MODE + if( *(uint16 *)(paprium_s.ram + 0x1E10) ) { + sprintf(error_str, "paprium_decoder 1E10 = %X", *(uint16 *)(paprium_s.ram + 0x1E10)); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0,error_str,"decoder",0); + } +#endif + + + paprium_s.decoder_ptr = offset; + paprium_s.decoder_size = size; + + +#if DEBUG_MODE + if( paprium_cmd_count != 3 ) { + sprintf(error_str, "Decoder_Copy %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif +} + + +static void paprium_sprite(int index) +{ + int lcv, spr_x, spr_y, count; + int spritePtr, gfxPtr; + + int dmaSize = 0; + int dmaPtr = *(uint16*) (paprium_s.ram + 0x1F16); + + int spriteCount = *(uint16*) (paprium_s.ram + 0x1F18); + + int anim = *(uint16*) (paprium_s.ram + 0xF80 + index*16); + int nextAnim = *(uint16*) (paprium_s.ram + 0xF82 + index*16); + int obj = *(uint16*) (paprium_s.ram + 0xF84 + index*16) & 0x7FFF; + //*(uint16*) (paprium_s.ram + 0xF86 + index*16); + int objAttr = *(uint16*) (paprium_s.ram + 0xF88 + index*16); + int reset = *(uint16*) (paprium_s.ram + 0xF8A + index*16); + int pos_x = *(uint16*) (paprium_s.ram + 0xF8C + index*16); + int pos_y = *(uint16*) (paprium_s.ram + 0xF8E + index*16); + + int src = paprium_s.draw_src; + int vram = paprium_s.draw_dst; + int flip_h = objAttr & 0x800; + int animFlags; + + + int animPtr = *(uint32*) (paprium_obj_ram + (obj+1)*4); + int framePtr = paprium_s.obj[index]; + + + if( index != 0x30 ) { + //return; + } + + +#if DEBUG_MODE /* frozen enemy */ + { + int color = -1; + int pri = -1; + + if(0) {} + else if( (obj > 0x00 && obj < 0x30) && (anim == 5) ) color = 0; + else if( (obj == 0x0D) && (anim == 3) ) color = 0; + + if( color != -1 ) { + objAttr &= ~0x6000; + + switch(color) { + case 0: break; + case 1: objAttr += 0x2000; break; + case 2: objAttr += 0x4000; break; + case 3: objAttr += 0x6000; break; + } + } + + if( pri != -1 ) { + objAttr &= ~0x8000; + + switch(pri) { + case 0: break; + case 1: objAttr += 0x8000; break; + } + } + } +#endif + + +#if DEBUG_SPRITE + uint8 *ptr = paprium_s.ram + 0xF80 + index*16; + + sprintf(error_str, "[%d] [%04X:%04X] DM Sprite %02X - %04X %04X %04X %04X %04X %04X X=%04X Y=%04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + index, + *(uint16 *)(ptr+0), *(uint16 *)(ptr+2), *(uint16 *)(ptr+4), *(uint16 *)(ptr+6), + *(uint16 *)(ptr+8), *(uint16 *)(ptr+10), *(uint16 *)(ptr+12), *(uint16 *)(ptr+14) ); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + +reload: + if( reset == 1 ) { + framePtr = *(uint32*) (paprium_obj_ram + animPtr + anim*4); + + *(uint16*) (paprium_s.ram + 0xF8A + index*16) = 0; + } + if( (framePtr == 0) || (framePtr == -1) ) { + *(uint16*) (paprium_s.ram + 0xF80 + index*16) = 0; + return; + } + + + spritePtr = paprium_obj_ram[framePtr + 0] << 0; + spritePtr += paprium_obj_ram[framePtr + 1] << 8; + spritePtr += paprium_obj_ram[framePtr + 2] << 16; + animFlags = paprium_obj_ram[framePtr + 3]; + + +#if DEBUG_SPRITE + sprintf(error_str, "%X - %X %X %X - %X - %X %X\n", + ((obj+1) & 0x7FFF)*4, + animPtr, anim, animPtr + anim*4, + framePtr, + spritePtr, animFlags); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + if( spritePtr == 0 ) return; + + + framePtr += 4; + + if( animFlags < 0x80 ) { + if( nextAnim == 0xFFFF ) { + int nextFrame; + + nextFrame = paprium_obj_ram[framePtr + 0] << 0; + nextFrame += paprium_obj_ram[framePtr + 1] << 8; + nextFrame += paprium_obj_ram[framePtr + 2] << 16; + + framePtr = nextFrame; + } + else if( reset == 0 ) { + anim = nextAnim; + reset = 1; + + goto reload; + } + } + + paprium_s.obj[index] = framePtr; + + + count = paprium_obj_ram[(spritePtr++)^1]; + int flags2 = paprium_obj_ram[(spritePtr++)^1]; + + +#if 0 + sprintf(error_str, "%d - %X %X %X\n", count, src, vram, flags2); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + spr_x = pos_x; + spr_y = pos_y; + + for( lcv = 0; lcv < count; lcv++ ) { + int misc = ((paprium_obj_ram[spritePtr + 3] >> 4) & 0x0F); + int size_x = ((paprium_obj_ram[spritePtr + 3] >> 2) & 0x03) + 1; + int size_y = ((paprium_obj_ram[spritePtr + 3] >> 0) & 0x03) + 1; + int tile = *(uint16*) (paprium_obj_ram + spritePtr + 4); + int tileAttr = *(uint16*) (paprium_obj_ram + spritePtr + 6) & ~0x1FF; + int ofs = *(uint16*) (paprium_obj_ram + spritePtr + 6) & 0x1FF; + + int tilePtr = paprium_tile_ptr + tile*4; + int tileSize = size_x * size_y * 0x20; + + int sprAttr = 0; + + + if( !flip_h ) + spr_x += (int8) paprium_obj_ram[spritePtr + 1]; + else + spr_x -= (int8) paprium_obj_ram[spritePtr + 1]; + + spr_y += (int8) paprium_obj_ram[spritePtr + 0]; + spritePtr += 8; + + + if( tile == 0 ) continue; + if( spriteCount >= 94 ) continue; + + + sprAttr = (tileAttr & 0x8000) ? 0x8000 : (objAttr & 0x8000); + sprAttr += (tileAttr & 0x6000) ? (tileAttr & 0x6000) : (objAttr & 0x6000); + sprAttr += (tileAttr & 0x1800) ^ (objAttr & 0x1800); + + + if( (spr_y >= 128) && (spr_y + size_y*8 < 368) ) { + if( (!flip_h && ((spr_x + size_x*8 >= 128) && spr_x < 448)) || + (flip_h && ((spr_x - size_x*8 < 448) && spr_x >= 128)) ) { + if( spriteCount < 80 ) { + *(uint16*) (paprium_s.ram + 0xB00 + spriteCount*8) = spr_y & 0x3FF; + *(uint16*) (paprium_s.ram + 0xB02 + spriteCount*8) = ((size_x-1) << 10) + ((size_y-1) << 8) + (spriteCount+1); + *(uint16*) (paprium_s.ram + 0xB04 + spriteCount*8) = sprAttr + ((vram / 0x20) & 0x7FF); + *(uint16*) (paprium_s.ram + 0xB06 + spriteCount*8) = (spr_x - ((!flip_h) ? 0 : size_x*8)) & 0x1FF; + +#if DEBUG_SPRITE + sprintf(error_str, "%d / %X %X %X %X\n", + spriteCount, + *(uint16*) (paprium_s.ram + 0xB00 + (spriteCount-0)*8), + *(uint16*) (paprium_s.ram + 0xB02 + (spriteCount-0)*8), + *(uint16*) (paprium_s.ram + 0xB04 + (spriteCount-0)*8), + *(uint16*) (paprium_s.ram + 0xB06 + (spriteCount-0)*8) + ); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + } + else { + if( spriteCount == 80 ) { /* sprite 0 lock */ + paprium_s.ram[0xD7A] = 1; /* exp.s list */ + + memcpy(paprium_s.exps_ram, paprium_s.ram + 0xB00, 8); + paprium_s.exps_ram[2] = 14; /* normal list */ + + spriteCount++; + } + + *(uint16*) (paprium_s.exps_ram + 0 + (spriteCount-80)*8) = spr_y & 0x3FF; + *(uint16*) (paprium_s.exps_ram + 2 + (spriteCount-80)*8) = ((size_x-1) << 10) + ((size_y-1) << 8) + ((spriteCount-80)+1); + *(uint16*) (paprium_s.exps_ram + 4 + (spriteCount-80)*8) = sprAttr + ((vram / 0x20) & 0x7FF); + *(uint16*) (paprium_s.exps_ram + 6 + (spriteCount-80)*8) = (spr_x - ((!flip_h) ? 0 : size_x*8)) & 0x1FF; + +#if DEBUG_SPRITE + sprintf(error_str, "%d / %X %X %X %X\n", + spriteCount, + *(uint16*) (paprium_s.ram + 0x1F20 + (spriteCount-80)*8), + *(uint16*) (paprium_s.ram + 0x1F22 + (spriteCount-80)*8), + *(uint16*) (paprium_s.ram + 0x1F24 + (spriteCount-80)*8), + *(uint16*) (paprium_s.ram + 0x1F26 + (spriteCount-80)*8) + ); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + } + + spriteCount++; + +#if DEBUG_SPRITE + sprintf(error_str, "%d %d / %d %d %X %X / %X %X %X\n", spriteCount, count, spr_x, spr_y, tileAttr, objAttr, src, vram, tile); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + } + } + + + + int ptr = paprium_tile_ptr + (*(uint16*)(cart.rom + tilePtr) << 16) + *(uint16*)(cart.rom + tilePtr + 2); + static uint8 tile_ram[0x10000]; + + paprium_decoder_type(ptr, tile_ram); + memcpy(paprium_s.ram + src, tile_ram + ofs * 0x20, tileSize); + + + //if( !tiledupe && dmaPtr < dmalimit && vram < vramlimit && tile < tilelimit) + + *(uint16*) (paprium_s.ram + 0x1400 + dmaPtr*16) = 0x8F02; + *(uint16*) (paprium_s.ram + 0x1402 + dmaPtr*16) = 0x9300 + ((tileSize >> 1) & 0xFF); + *(uint16*) (paprium_s.ram + 0x1404 + dmaPtr*16) = 0x9500 + ((src >> 1) & 0xFF); + *(uint16*) (paprium_s.ram + 0x1406 + dmaPtr*16) = 0x9400 + ((tileSize >> 9) & 0xFF); + *(uint16*) (paprium_s.ram + 0x1408 + dmaPtr*16) = 0x9700; + *(uint16*) (paprium_s.ram + 0x140A + dmaPtr*16) = 0x9600 + ((src >> 9) & 0xFF); + *(uint16*) (paprium_s.ram + 0x140C + dmaPtr*16) = 0x4000 + (vram & 0x3FFF); + *(uint16*) (paprium_s.ram + 0x140E + dmaPtr*16) = 0x0080 + (vram >> 14); + + *(uint16*) (paprium_s.ram + 0x1F16) = ++dmaPtr; + *(uint16*) (paprium_s.ram + 0x1F18) = spriteCount; + + + src += tileSize; + dmaSize += tileSize; + vram += tileSize; + } + + + paprium_s.draw_src = src; + paprium_s.draw_dst = vram; +} + + +static void paprium_sprite_init(int arg) +{ +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM Sprite_Init %02X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + arg); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + memset(paprium_s.ram + 0x1F20, 0, 14*8); + + +#if DEBUG_MODE + if( paprium_cmd_count != 0 ) { + sprintf(error_str, ">> Sprite_Init %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif +} + + +static void paprium_sprite_start(int arg) +{ +#if DEBUG_SPRITE + sprintf(error_str, "[%d] [%04X:%04X] DM Sprite_Start %02X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + arg); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + int count = *(uint16*)(paprium_s.ram + 0x1F18); + + *(uint16*) (paprium_s.ram + 0x1F16) = 0x0001; /* dma count */ + + *(uint16*) (paprium_s.ram + 0x1400) = 0x8f02; + *(uint16*) (paprium_s.ram + 0x1402) = 0x9340; + *(uint16*) (paprium_s.ram + 0x1404) = 0x9580; + *(uint16*) (paprium_s.ram + 0x1406) = 0x9401; + *(uint16*) (paprium_s.ram + 0x1408) = 0x9700; + *(uint16*) (paprium_s.ram + 0x140a) = 0x9605; + *(uint16*) (paprium_s.ram + 0x140c) = 0x7000; + *(uint16*) (paprium_s.ram + 0x140e) = 0x0083; + + + if( count < 80 ) + memcpy(paprium_s.ram + 0x1F20, paprium_s.ram + 0xB00, 14*8); + else + memcpy(paprium_s.ram + 0x1F20, paprium_s.exps_ram, 14*8); + + + paprium_s.draw_src = 0x2000; + paprium_s.draw_dst = 0x200; + + +#if DEBUG_MODE + if( paprium_cmd_count != 0 ) { + sprintf(error_str, ">> Sprite_Start %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif +} + + +static void paprium_sprite_stop(int arg) +{ +#if DEBUG_SPRITE + sprintf(error_str, "[%d] [%04X:%04X] DM Sprite_Stop %02X -- %d sprites\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + arg, *(uint16*)(paprium_s.ram + 0x1f18)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + int count = *(uint16*)(paprium_s.ram + 0x1F18); + + if( count == 0 ) { + memset(paprium_s.ram + 0xB00, 0, 8); + memset(paprium_s.exps_ram, 0, 8); + } + else if( count <= 80 ) { + paprium_s.ram[0xB02 + (count-1)*8] = 0; + + if( count <= 14 ) + paprium_s.exps_ram[2 + (count-1)*8] = 0; + } + else + paprium_s.exps_ram[2 + (count-81)*8] = 0; + + + if( arg == 2 ) + *(uint16*) (paprium_s.ram + 0x1F1C) = 1; /* exp.s - force draw */ + + +#if DEBUG_MODE + if( paprium_cmd_count != 0 ) { + sprintf(error_str, ">> Sprite_Stop %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif +} + + +static void paprium_sprite_pause(int arg) +{ +#if DEBUG_SPRITE + sprintf(error_str, "[%d] [%04X:%04X] DM Sprite_Pause %02X -- %d sprites\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + arg, *(uint16*)(paprium_s.ram + 0x1f18)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + int count = *(uint16*)(paprium_s.ram + 0x1F18); + + if( count == 0 ) + memset(paprium_s.ram + 0xB00, 0, 8); + + +#if DEBUG_MODE + if( paprium_cmd_count != 0 ) { + sprintf(error_str, ">> Sprite_Pause %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif +} + + +static void paprium_scaler_init(int arg) +{ + int row, col, out; + static uint8 temp[0x800]; + +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM Scaler_Init %02X - %04X %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + arg, + *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + int ptr = (*(uint16 *)(paprium_s.ram + 0x1E10) << 16) + *(uint16 *)(paprium_s.ram + 0x1E12); + paprium_decoder_type(ptr, temp); + + + out = 0; + + for( col = 0; col < 64; col++ ) { + for( row = 0; row < 64; row++ ) { + if( col & 1 ) + paprium_s.scaler_ram[out] = temp[row*32 + (col/2)^1] & 0x0F; + else + paprium_s.scaler_ram[out] = temp[row*32 + (col/2)^1] >> 4; + + out++; + } + } + + +#if DEBUG_MODE + if( paprium_cmd_count != 2 ) { + sprintf(error_str, ">> Scaler_Init %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif +} + + +static void paprium_scaler(int arg) +{ + int row, col; + + int left = *(uint16 *)(paprium_s.ram + 0x1E10); + int right = *(uint16 *)(paprium_s.ram + 0x1E12); + int scale = *(uint16 *)(paprium_s.ram + 0x1E14); + int ptr = *(uint16 *)(paprium_s.ram + 0x1E16); + int step = 64 * 0x10000 / scale; + int ptr_frac = 0; + + +#if DEBUG_SPRITE + sprintf(error_str, "[%d] [%04X:%04X] DM Scaler %02X -- %04X %04X %04X %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + arg, *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12), *(uint16 *)(paprium_s.ram + 0x1E14), *(uint16 *)(paprium_s.ram + 0x1E16)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + for( col = 0; col < 128; col++ ) { + int base = (col & 4) ? 0x600 : 0x200; + int out = ((col / 8) * 64) + ((col & 2) / 2); + + for( row = 0; row < 64; row += 2 ) { + if( (col >= left) && (col < right) ) { + if(col & 1) + paprium_s.ram[base + out^1] += paprium_s.scaler_ram[row*64 + ptr] & 0x0F; + else + paprium_s.ram[base + out^1] = paprium_s.scaler_ram[row*64 + ptr] << 4; + } + else if( (col & 1) == 0 ) + paprium_s.ram[base + out^1] = 0; + + out += 2; + } + + if( (col >= left) && (col < right) && (ptr < 64) ) { + ptr_frac += 0x10000; + + while( ptr_frac >= step ) { + ptr++; + ptr_frac -= step; + } + } + } + + +#if DEBUG_MODE + if( paprium_cmd_count != 4 ) { + sprintf(error_str, ">> Scaler %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif +} + + +static void paprium_sram_read(int bank) +{ +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM Sram_Read %02X -- %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + bank, *(uint16 *)(paprium_s.ram + 0x1E10)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + int offset = *(uint16 *)(paprium_s.ram + 0x1E10); + + if( (bank >= 1) && (bank <= 4) ) + memcpy(paprium_s.ram + offset, sram.sram + ((bank-1) * 0x780), 0x780); + + +#if DEBUG_MODE + if( paprium_cmd_count != 1 ) { + sprintf(error_str, ">> Sram_Read %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif +} + + +static void paprium_sram_write(int bank) +{ +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM Sram_Write %02X -- %04X %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + bank, *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + /* *(uint16 *)(paprium_s.ram + 0x1E10) */ + int offset = *(uint16 *)(paprium_s.ram + 0x1E12); + + if( (bank >= 1) && (bank <= 4) ) + memcpy(sram.sram + ((bank-1) * 0x780), paprium_s.ram + offset, 0x780); + + +#if DEBUG_MODE + if( *(uint16 *)(paprium_s.ram + 0x1E10) != 0xBEEF ) { + sprintf(error_str, ">> SRAM write 1E10 %X\n", *(uint16 *)(paprium_s.ram + 0x1E10)); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "sram write", 0); + } + + if( paprium_cmd_count != 1 ) { + sprintf(error_str, ">> Sram_Write %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif +} + + +static void paprium_mapper(int arg) +{ +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM Mapper %02X -- %04X %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + arg, *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + memcpy(paprium_s.ram + 0x8000, cart.rom + 0x8000, 0x8000); /* troll */ + + +#if DEBUG_MODE + if( paprium_cmd_count != 2 ) { + sprintf(error_str, ">> Mapper %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif +} + + +static void paprium_boot(int arg) +{ +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM Boot %02X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + arg); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + paprium_music_ptr = (*(uint16*)(paprium_s.ram + 0x1E10) << 16) + *(uint16*)(paprium_s.ram + 0x1E12); + /* (*(uint16*)(paprium_s.ram + 0x1E14) << 16) + *(uint16*)(paprium_s.ram + 0x1E16); */ + paprium_wave_ptr = (*(uint16*)(paprium_s.ram + 0x1E18) << 16) + *(uint16*)(paprium_s.ram + 0x1E1A); + /* (*(uint16*)(paprium_s.ram + 0x1E1C) << 16) + *(uint16*)(paprium_s.ram + 0x1E1E); */ + paprium_sfx_ptr = (*(uint16*)(paprium_s.ram + 0x1E20) << 16) + *(uint16*)(paprium_s.ram + 0x1E22); + paprium_sprite_ptr = (*(uint16*)(paprium_s.ram + 0x1E24) << 16) + *(uint16*)(paprium_s.ram + 0x1E26); + paprium_tile_ptr = (*(uint16*)(paprium_s.ram + 0x1E28) << 16) + *(uint16*)(paprium_s.ram + 0x1E2A); + + /* paprium_wave_unpack(paprium_wave_ptr, paprium_wave_ram); */ + paprium_decoder_type(paprium_sprite_ptr, paprium_obj_ram); + + paprium_s.decoder_size = 0; + + +#if DEBUG_MODE + paprium_cmd_count = 0; +#endif +} + + +static void paprium_EC(int arg) +{ +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM EC %02X = %02X %02X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + arg, *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + +#if DEBUG_MODE + if( *(uint16 *)(paprium_s.ram + 0x1E10) ) { + sprintf(error_str, ">> EC %02X\n", *(uint16 *)(paprium_s.ram + 0x1E10)); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "ec", 0); + } +#endif + +#if DEBUG_MODE + if( paprium_cmd_count != 2 ) { + sprintf(error_str, ">> EC %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif +} + + +static void paprium_music(int track) +{ +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM Music %02X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + track); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + track &= 0x7F; + + + int ptr = (*(uint16*)(cart.rom + paprium_music_ptr + track*4)<<16) + (*(uint16*)(cart.rom + paprium_music_ptr + track*4 + 2)); + paprium_decoder_type(paprium_music_ptr + ptr, paprium_s.music_ram); + paprium_s.decoder_size = 0; + + + paprium_s.music_section = 0; + paprium_s.music_segment = 0; + paprium_s.audio_tick = 0; + + + memset(paprium_s.music, 0, sizeof(paprium_s.music)); + for( int ch = 0; ch < 26; ch++ ) { + paprium_voice_t *voice = paprium_s.music + ch; + + voice->panning = 0x80; + voice->volume = 0x80; + voice->program = paprium_s.music_ram[0x2A + ch^1]; + } + + +#if DEBUG_MODE + if( paprium_cmd_count != 0 ) { + sprintf(error_str, ">> Music %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif + + +#if 1 + paprium_load_mp3(track, 1); +#endif +} + + +static void paprium_music_volume(int level) +{ +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM Music_Volume %02X -- %04X %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + level, *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + paprium_s.music_volume = level; + /* *(uint16 *)(paprium_s.ram + 0x1E10); */ + /* *(uint16 *)(paprium_s.ram + 0x1E12); */ + + +#if 0 + // stream mp3 / ogg, manage tempo +#endif + + +#if DEBUG_MODE + if(*(uint16 *)(paprium_s.ram + 0x1E10) != 0x80) { + sprintf(error_str, ">> Music_Volume = %X\n", *(uint16 *)(paprium_s.ram + 0x1E10)); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "ooo", 0); + } + + if(*(uint16 *)(paprium_s.ram + 0x1E12) != 0x00 && *(uint16 *)(paprium_s.ram + 0x1E12) != 0x08) { + sprintf(error_str, ">> Music_Volume-2 = %X\n", *(uint16 *)(paprium_s.ram + 0x1E12)); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "ooo", 0); + } + + if( paprium_cmd_count != 2 ) { + sprintf(error_str, ">> Music_Volume %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif +} + + +static void paprium_music_setting(int flag) +{ +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM Music_Setting %02X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + flag); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + if( flag == 8 ) + paprium_s.music_segment = -1; + + else if( flag == 0 ) + paprium_s.music_segment = -1; + + +#if DEBUG_MODE + else { + sprintf(error_str, ">> Music_Setting = %X\n", flag); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "ooo", 0); + } +#endif + + +#if DEBUG_MODE + if( paprium_cmd_count != 0 ) { + sprintf(error_str, ">> Music_Setting %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif +} + + +static void paprium_music_special(int flag) +{ +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM Music_Special %02X = %04X %04X %04X %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + flag, *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12), *(uint16 *)(paprium_s.ram + 0x1E14), *(uint16 *)(paprium_s.ram + 0x1E16)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + if( flag == 1 ) { + //*(uint16 *)(paprium_s.ram + 0x1E10) + //*(uint16 *)(paprium_s.ram + 0x1E12) + +#if DEBUG_MODE + if( *(uint16 *)(paprium_s.ram + 0x1E10) != 0x40 ) { + sprintf(error_str, ">> Music_Special_01 %X count\n", *(uint16 *)(paprium_s.ram + 0x1E10)); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } + + if( *(uint16 *)(paprium_s.ram + 0x1E12) != 0x08 ) { + sprintf(error_str, ">> Music_Special_01-2 %X count\n", *(uint16 *)(paprium_s.ram + 0x1E10)); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } + + if( paprium_cmd_count != 2 ) { + sprintf(error_str, ">> Music_Special-01 %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif + } + + else if( flag == 2 ) { + //*(uint16 *)(paprium_s.ram + 0x1E10) /* 4 = crisis, 0 = normal ? */ + +#if DEBUG_MODE + if( *(uint16 *)(paprium_s.ram + 0x1E10) != 4 && *(uint16 *)(paprium_s.ram + 0x1E10) != 0 ) { + sprintf(error_str, ">> Music_Special_02 %X count\n", *(uint16 *)(paprium_s.ram + 0x1E10)); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } + + if( paprium_cmd_count != 1 ) { + sprintf(error_str, ">> Music_Special-02 %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif + } + + else if( flag == 4 ) { + //*(uint16 *)(paprium_s.ram + 0x1E10) /* 81 = blu pill */ + +#if DEBUG_MODE + if( *(uint16 *)(paprium_s.ram + 0x1E10) != 0x80 && *(uint16 *)(paprium_s.ram + 0x1E10) != 0x81 ) { + sprintf(error_str, ">> Music_Special_04 %X count\n", *(uint16 *)(paprium_s.ram + 0x1E10)); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } + + if( paprium_cmd_count != 1 ) { + sprintf(error_str, ">> Music_Special-04 %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif + } + + else if( flag == 6 ) { /* sax man */ + //*(uint16 *)(paprium_s.ram + 0x1E10) + //*(uint16 *)(paprium_s.ram + 0x1E12) + //*(uint16 *)(paprium_s.ram + 0x1E14) + +#if DEBUG_MODE + if( *(uint16 *)(paprium_s.ram + 0x1E10) != 1 ) { + sprintf(error_str, ">> Music_Special_06 %X count\n", *(uint16 *)(paprium_s.ram + 0x1E10)); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } + + if( paprium_cmd_count != 3 ) { + sprintf(error_str, ">> Music_Special-06 %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif + } + + else if( flag == 7 ) { /* blu pill - stage title */ + //*(uint16 *)(paprium_s.ram + 0x1E10) + +#if DEBUG_MODE + if( *(uint16 *)(paprium_s.ram + 0x1E10) != 0x6C && *(uint16 *)(paprium_s.ram + 0x1E10) != 0xA0 ) { + sprintf(error_str, ">> Music_Special_07 %X count\n", *(uint16 *)(paprium_s.ram + 0x1E10)); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } + + if( paprium_cmd_count != 1 ) { + sprintf(error_str, ">> Music_Special-06 %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif + } + +#if DEBUG_MODE + else { + sprintf(error_str, ">> Music special = %X\n", flag); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "ooo", 0); + } +#endif +} + + +static void paprium_audio_setting(int flags) +{ +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM Audio_Settings %02X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + flags); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + paprium_s.audio_flags = flags; + + paprium_s.ram[0x1801] = flags & 0x01; /* dac */ + + paprium_s.ram[0x1800] = (flags & 0x01) ? 0x80 : 0x00; /* dac */ + paprium_s.ram[0x1800] += (flags & 0x02) ? 0x40 : 0x00; /* ntsc */ + + +#if DEBUG_MODE + if( paprium_cmd_count != 0 ) { + sprintf(error_str, ">> Audio_Settings %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif +} + + +static void paprium_sfx_volume(int level) +{ +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM Sfx_Volume %02X -- %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + level, *(uint16 *)(paprium_s.ram + 0x1E10)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + paprium_s.sfx_volume = level; + /* *(uint16 *)(paprium_s.ram + 0x1E10); */ + /* *(uint16 *)(paprium_s.ram + 0x1E12); */ + + +#if DEBUG_MODE + if(*(uint16 *)(paprium_s.ram + 0x1E10) != 0x80) { + sprintf(error_str, ">> Sfx_Volume-1 = %X\n", *(uint16 *)(paprium_s.ram + 0x1E10)); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "ooo", 0); + } + + if(*(uint16 *)(paprium_s.ram + 0x1E12) != 0x00 && paprium_cmd_count == 2) { + sprintf(error_str, ">> Sfx_Volume-2 = %X\n", *(uint16 *)(paprium_s.ram + 0x1E12)); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "ooo", 0); + } +#endif + + +#if DEBUG_MODE + if( paprium_cmd_count != 1 && paprium_cmd_count != 2 ) { + sprintf(error_str, ">> Sfx_Volume %d count\n", paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif +} + + +static void paprium_cmd(int data) +{ + int cmd = data >> 8; + int lcv; + int retaddr; + int argscnt; + + + data &= 0xFF; + + if( m68k.prev_pc == 0xb4394 ) { + retaddr = m68k_read_immediate_32(m68k.dar[15]+16); + argscnt = 4; + } + else { + retaddr = m68k_read_immediate_32(m68k.dar[15]+4); + argscnt = 0; + } + + + + switch(cmd) { + case 0x81: + case 0x83: + case 0x95: + case 0x96: + case 0xA4: + case 0xA9: + case 0xB6: + goto print_0; + + case 0xD0: + goto print_2; + goto print_5; + + case 0xE7: /* T-574120-0 = after demo loop */ + goto print_9; + + case 0xD5: /* secret room */ + case 0xEC: + goto print_2; + + case 0x84: paprium_mapper(data); break; + case 0x88: paprium_audio_setting(data); break; + case 0x8C: paprium_music(data); break; + case 0x8D: paprium_music_setting(data); break; + case 0xAD: paprium_sprite(data); break; + case 0xAE: paprium_sprite_start(data); break; + case 0xAF: paprium_sprite_stop(data); break; + case 0xB0: paprium_sprite_init(data); break; + case 0xB1: paprium_sprite_pause(data); break; + case 0xC6: paprium_boot(data); break; + case 0xC9: paprium_music_volume(data); break; + case 0xCA: paprium_sfx_volume(data); break; + case 0xD1: goto sfx_play; + case 0xD2: goto sfx_off; + case 0xD3: goto sfx_loop; + case 0xD6: paprium_music_special(data); break; + case 0xDA: paprium_decoder(data); break; + case 0xDB: paprium_decoder_copy(data); break; + case 0xDF: paprium_sram_read(data); break; + case 0xE0: paprium_sram_write(data); break; + //case 0xF2: paprium_block_viewer(data); break; + case 0xF4: paprium_scaler_init(data); break; + case 0xF5: paprium_scaler(data); break; + + default: goto print_x; + } + + +done: + *(uint16*)(paprium_s.ram + 0x1FEA) &= 0x7FFF; + return; + + + +print_0: +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM %02X %02X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + cmd, data); + log_cb(RETRO_LOG_ERROR, error_str); + + if( paprium_cmd_count != 0 ) { + sprintf(error_str, "%X %d count\n", cmd, paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif + goto done; + + +print_1: +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM %02X %02X -- %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + cmd, data, + *(uint16 *)(paprium_s.ram + 0x1E10)); + log_cb(RETRO_LOG_ERROR, error_str); + + if( paprium_cmd_count != 1 ) { + sprintf(error_str, "%X %d count\n", cmd, paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif + goto done; + + +print_2: +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM %02X %02X -- %04X %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + cmd, data, + *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12)); + log_cb(RETRO_LOG_ERROR, error_str); + + if( paprium_cmd_count != 2 ) { + sprintf(error_str, "%X %d count\n", cmd, paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif + goto done; + + +print_4: +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM %02X %02X -- %04X %04X %04X %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + cmd, data, + *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12), *(uint16 *)(paprium_s.ram + 0x1E14), *(uint16 *)(paprium_s.ram + 0x1E16)); + log_cb(RETRO_LOG_ERROR, error_str); + + + if( paprium_cmd_count != 4 ) { + sprintf(error_str, "%X %d count\n", cmd, paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif + goto done; + + +print_5: +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM %02X %02X -- %04X %04X %04X %04X %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + cmd, data, + *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12), *(uint16 *)(paprium_s.ram + 0x1E14), *(uint16 *)(paprium_s.ram + 0x1E16), *(uint16 *)(paprium_s.ram + 0x1E18)); + log_cb(RETRO_LOG_ERROR, error_str); + + if( paprium_cmd_count != 5 ) { + sprintf(error_str, "%X %d count\n", cmd, paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif + goto done; + + +print_9: +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X] DM %02X %02X -- %04X %04X %04X %04X %04X ..\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + cmd, data, + *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12), *(uint16 *)(paprium_s.ram + 0x1E14), *(uint16 *)(paprium_s.ram + 0x1E16), *(uint16 *)(paprium_s.ram + 0x1E18)); + log_cb(RETRO_LOG_ERROR, error_str); + + if( paprium_cmd_count != 9 ) { + sprintf(error_str, "%X %d count\n", cmd, paprium_cmd_count); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "count", 0); + } +#endif + goto done; + + +print_x: +#if DEBUG_MODE + if( argscnt == 4 ) { + sprintf(error_str, "[%d] [%04X:%04X] DM %02X %02X -- %04X %04X %04X %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + cmd, data, + *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12), *(uint16 *)(paprium_s.ram + 0x1E14), *(uint16 *)(paprium_s.ram + 0x1E16)); + log_cb(RETRO_LOG_ERROR, error_str); + } + + else { + sprintf(error_str, "[%d] [%04X:%04X] DM %02X %02X ## %04X %04X %04X %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, + cmd, data, + *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12), *(uint16 *)(paprium_s.ram + 0x1E14), *(uint16 *)(paprium_s.ram + 0x1E16)); + log_cb(RETRO_LOG_ERROR, error_str); + } + + sprintf(error_str, "DM %02X %02X\n", cmd, data); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "DM", 0); +#endif + goto done; + + +sfx_play: + { + int chan, vol, pan, flags; + int ptr, size, type; + int lcv; + int newch = 0, maxtime = 0; + const int rates[] = {1,2,4,5,8,9}; + uint8 *sfx = paprium_sfx_ptr + cart.rom; + + +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X <== %04X:%04X] DM Sfx_Play %02X -- %04X %04X %04X %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, (retaddr>>16)&0xffff, retaddr&0xffff, + data, *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12), *(uint16 *)(paprium_s.ram + 0x1E14), *(uint16 *)(paprium_s.ram + 0x1E16)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + chan = *(uint16 *)(paprium_s.ram + 0x1E10); + vol = *(uint16 *)(paprium_s.ram + 0x1E12); + pan = *(uint16 *)(paprium_s.ram + 0x1E14); + flags = *(uint16 *)(paprium_s.ram + 0x1E16); + + +#if DEBUG_MODE + if(flags & 0x100) { + sprintf(error_str, "Sfx flags %X\n", flags); + //MessageBoxA(0, error_str, "Sfx flags", MB_OK ); + log_cb(RETRO_LOG_ERROR, error_str); + } /* stage1 alarm = 8100 */ + //else if( flags <= 0x8100 ) {} + else if( flags & 0x8000 ) {} + else if( flags & 0x4000 ) {} + else if( flags & 0x2000 ) {} + else if( flags & 0x800 ) {} + //else if( flags & 0x100 ) {} + else if( flags & 0x400 ) {} + else if( flags == 0 ) {} + else { + sprintf(error_str, "Sfx flags %X\n", flags); + log_cb(RETRO_LOG_ERROR, error_str); + MessageBoxA(0, error_str, "Sfx flags", MB_OK ); + } + + + if( chan > 0x80 ) MessageBoxA(0, "Sfx channel", "Warn", MB_OK ); +#endif + + + ptr = (*(uint16 *)(sfx + data*8) << 16) | (*(uint16 *)(sfx + data*8 + 2)); + size = (*(uint8 *)(sfx + data*8 + 4) << 16) | (*(uint16 *)(sfx + data*8 + 6)); + type = *(uint8 *)(sfx + data*8 + 5); + + +#if DEBUG_MODE + sprintf(error_str, "%X %X | %X %X %X | %X %X %X\n", + paprium_sfx_ptr + data*8, paprium_sfx_ptr + ptr, + ptr, size, type, + rates[type >> 4], type & 0x03, type & 0x0C); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + for( lcv = 0; lcv < 8; lcv++, chan >>= 1 ) { + if( (chan & 1) == 0 ) continue; + + if( paprium_s.sfx[lcv].size ) { + if( maxtime < paprium_s.sfx[lcv].time ) { + maxtime = paprium_s.sfx[lcv].time; + newch = lcv; + } + continue; + } + + newch = lcv; + break; + } + + + paprium_s.sfx[newch].volume = vol; + paprium_s.sfx[newch].panning = pan; + paprium_s.sfx[newch].type = type; + + paprium_s.sfx[newch].num = data; + paprium_s.sfx[newch].flags = flags; + + paprium_s.sfx[newch].loop = 0; + paprium_s.sfx[newch].count = 0; + paprium_s.sfx[newch].time = 0; + paprium_s.sfx[newch].tick = 0; + paprium_s.sfx[newch].decay = 0; + + if( flags & 0x4000 ) + paprium_s.sfx[newch].echo = (paprium_s.echo_pan++) & 1; + + paprium_s.sfx[newch].ptr = ptr; + paprium_s.sfx[newch].start = ptr; + paprium_s.sfx[newch].size = size; + } + goto done; + + +sfx_loop: + { + int lcv; + + +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X <== %04X:%04X] DM Sfx_Loop %02X -- %04X %04X %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, (retaddr>>16)&0xffff, retaddr&0xffff, + data, *(uint16 *)(paprium_s.ram + 0x1E10), *(uint16 *)(paprium_s.ram + 0x1E12), *(uint16 *)(paprium_s.ram + 0x1E14)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + for( lcv = 0; lcv < 8; lcv++, data >>= 1 ) { + if( (data & 1) == 0 ) continue; + + paprium_s.sfx[lcv].volume = *(uint16 *)(paprium_s.ram + 0x1E10); + paprium_s.sfx[lcv].panning = *(uint16 *)(paprium_s.ram + 0x1E12); + paprium_s.sfx[lcv].decay = *(uint16 *)(paprium_s.ram + 0x1E14); + + paprium_s.sfx[lcv].loop = 1; + + break; + } + } + goto done; + + +sfx_off: + { + int flags; + + +#if DEBUG_MODE + sprintf(error_str, "[%d] [%04X:%04X <== %04X:%04X] DM Sfx_Off %02X -- %04X\n", + v_counter, + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, (retaddr>>16)&0xffff, retaddr&0xffff, + data, *(uint16 *)(paprium_s.ram + 0x1E10)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + + flags = *(uint16 *)(paprium_s.ram + 0x1E10); + + + if(0) {} + //else if( flags == 6 ) {} + else if( flags == 0 ) {} + else {} //MessageBoxA(0, "Sfx_Off flags", "Warn", MB_OK ); + + + for( lcv = 0; lcv < 8; lcv++ ) { + if( !(data & (1 << lcv) ) ) continue; + + if( flags == 0 ) { + paprium_s.sfx[lcv].size = 0; + } + + paprium_s.sfx[lcv].decay = flags; + paprium_s.sfx[lcv].loop = 0; + + break; + } + } + goto done; +} + + +static int paprium_addr_test(uint32 address, int mode) +{ +#if DEBUG_MODE == 0 + return 0; +#endif + + + if( address < 0x100 ) return 0; /* exception table */ + + if( skip_boot1 ) { + if( address == 0x14CE ) { + skip_boot1 = 0; + } + return 0; + } + + +#if DEBUG_MODE + if( mode == 0 ) { + if( address >= 0x8000 ) return 0; + } +#endif + + +#if DEBUG_MODE + if( address >= 0x2000 && address < 0x8000 ) return 0; +#endif + +#if DEBUG_MODE + if( address >= 0x200 && address < 0xb00 ) return 0; +#endif + +#if DEBUG_MODE + if( address >= 0xb00 && address < 0xf00 ) return 0; + if( address >= 0x1f20 && address < 0x1f90 ) return 0; /* exp.s */ +#endif + +#if DEBUG_MODE + if( address >= 0xF80 && address < 0x1290 ) return 0; /* OBJ list */ +#endif + +#if 0 + if( address >= 0x1290 && address < 0x1400 ) { + MessageBoxA(0, "address", "me", 0); + return 0; + } +#endif + +#if 0 + if( address >= 0x1B40 && address < 0x1b90 ) { + MessageBoxA(0, "address 2", "me", 0); + return 1; + } +#endif + +#if 0 + if( address >= 0xd80 && address < 0xf80 ) { + MessageBoxA(0, "address 3", "me", 0); + return 1; + } +#endif + +#if DEBUG_MODE + if( address >= 0x1400 && address < 0x1800 ) return 0; /* DMA list */ +#endif + +#if DEBUG_MODE + if( address >= 0x1800 && address < 0x1A00 ) return 0; /* DAC list ?? */ +#endif + +#if DEBUG_MODE + if( address == 0x1F10 ) return 0; /* DMA size = header [10h] + packet [x words] */ + if( address == 0x1F16 ) return 0; /* DMA transfer count */ + if( address == 0x1F18 ) return 0; /* OBJ count */ + if( address == 0x1F12 ) return 0; /* sprite ram available ??? 0B00 or 1200 */ +#endif + +#if DEBUG_MODE + if( address >= 0x1b98 && address < 0x1c00 ) return 0; /* soundshock x26 */ +#endif + + + if( address == 0x1FEA ) return 0; /* DM command */ + + + //if( address == 0x1FE4 ) return 0; /* DM ?? */ + //if( address == 0x1FE6 ) return 0; /* DM ?? */ + + return 1; +} + + +static uint32 paprium_r8(uint32 address) +{ + int data = paprium_s.ram[address^1]; + + +#if DEBUG_MODE + if( paprium_addr_test(address, 0) ) { + sprintf(error_str, "[%04X:%04X] R8 %04X = %04X\n", + (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, address, data); + + log_cb(RETRO_LOG_ERROR, error_str); + } +#endif + + + if( address == 0x1800 ) + data = 0; + + else if( address >= 0x1880 && address < 0x1b00 ) { + data = rand() % 256; + //paprium_s.ram[address^1] = data; /* dma blowout if no limit */ + } + + + return data; +} + + +static uint32 paprium_r16(uint32 address) +{ + int data = 0; + + + if( (address == 0xC000) && (paprium_s.decoder_size > 0) ) { +#if DEBUG_MODE + sprintf(error_str, "[%d] Decoder %X %X @ C000\n", v_counter, paprium_s.decoder_ptr, paprium_s.decoder_size); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + int max, size; + + if( paprium_s.decoder_mode == 2 ) + max = 0x4000; + + else if( paprium_s.decoder_mode == 7 ) + max = 0x800; + + + size = (paprium_s.decoder_size > max) ? max : paprium_s.decoder_size; + + memcpy(paprium_s.ram + 0xC000, paprium_s.decoder_ram + paprium_s.decoder_ptr, size); + + paprium_s.decoder_ptr += size; + paprium_s.decoder_size -= size; + } + + + switch( address ) { + case 0x1FE4: + data = 0xFFFF; + data &= ~(1<<2); + data &= ~(1<<6); + break; + + case 0x1FE6: + data = 0xFFFF; + data &= ~(1<<14); + data &= ~(1<<8); /* sram */ + data &= ~(1<<9); /* sram */ + break; + + case 0x1FEA: + data = 0xFFFF; + data &= ~(1<<15); + break; + + default: + data = *(uint16 *)(paprium_s.ram + address); + break; + } + + +#if DEBUG_MODE + if( paprium_addr_test(address, 0) ) { + sprintf(error_str, "[%d] [%04X:%04X] R16 %04X = %04X\n", + v_counter, (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, address, data); + + log_cb(RETRO_LOG_ERROR, error_str); + } +#endif + + return data; +} + + +static void paprium_w8(uint32 address, uint32 data) +{ +#if DEBUG_MODE + if( paprium_addr_test(address, 1) ) { + sprintf(error_str, "[%d] [%04X:%04X] W8 %04X = %02X\n", + v_counter, (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, address, data); + + log_cb(RETRO_LOG_ERROR, error_str); + } +#endif + + paprium_s.ram[address^1] = data; +} + + +static void paprium_w16(uint32 address, uint32 data) +{ +#if DEBUG_MODE + if( paprium_addr_test(address, 1) ) { + sprintf(error_str, "[%d] [%04X:%04X] W16 %04X = %04X\n", + v_counter, (m68k.prev_pc>>16)&0xffff, m68k.prev_pc&0xffff, address, data); + + log_cb(RETRO_LOG_ERROR, error_str); + } + + if( address >= 0x1E10 && address <= 0x1E30 ) paprium_cmd_count++; +#endif + + *(uint16 *)(paprium_s.ram + address) = data; + + if( address == 0x1FEA ) { + paprium_cmd(data); + + paprium_cmd_count = 0; + } +} + + +static uint32 paprium_io_r8(uint32 address) +{ + if( address == 0xA14101 ) + return paprium_tmss; + + ctrl_io_read_byte(address); +} + + +static void paprium_io_w8(uint32 address, uint32 data) +{ + if( address >= 0xA130F3 && address <= 0xA130FF ) /* no bank mapper */ + return; + + if( address == 0xA14101 ) { + paprium_tmss = data; + return; + } + + ctrl_io_write_byte(address, data); +} + + +static void paprium_map() +{ + m68k.memory_map[0x00].base = paprium_s.ram; + m68k.memory_map[0x00].read8 = paprium_r8; + m68k.memory_map[0x00].read16 = paprium_r16; + m68k.memory_map[0x00].write8 = paprium_w8; + m68k.memory_map[0x00].write16 = paprium_w16; + + m68k.memory_map[0xA1].read8 = paprium_io_r8; + m68k.memory_map[0xA1].write8 = paprium_io_w8; + + zbank_memory_map[0x00].read = paprium_r8; + zbank_memory_map[0x00].write = paprium_w8; +} + + +static void paprium_init() +{ + int ptr; + + paprium_map(); + + + memset(&paprium_s, 0, sizeof(paprium_s)); + memcpy(paprium_s.ram, cart.rom, 0x10000); + + +#if 1 /* fast loadstate */ + ptr = (*(uint16*)(cart.rom + 0xaf77c) << 16) + *(uint16*)(cart.rom + 0xaf77e); + + paprium_music_ptr = (*(uint16*)(cart.rom + 0x10054)<< 16) + *(uint16*)(cart.rom + 0x10056); + // (*(uint16*)(cart.rom + 0x10058)<< 16) + *(uint16*)(cart.rom + 0x1005a); + paprium_wave_ptr = (*(uint16*)(cart.rom + ptr + 0x774)<< 16) + *(uint16*)(cart.rom + ptr + 0x776); + // (*(uint16*)(cart.rom + 0x1005c)<< 16) + *(uint16*)(cart.rom + 0x1005e); + paprium_sfx_ptr = (*(uint16*)(cart.rom + ptr + 0x778)<< 16) + *(uint16*)(cart.rom + ptr + 0x77a); + paprium_sprite_ptr = (*(uint16*)(cart.rom + 0x10014)<< 16) + *(uint16*)(cart.rom + 0x10016); + paprium_tile_ptr = (*(uint16*)(cart.rom + ptr + 0x780)<< 16) + *(uint16*)(cart.rom + ptr + 0x782); + + paprium_decoder_type(paprium_sprite_ptr, paprium_obj_ram); + paprium_s.decoder_size = 0; + + + if(0) { /* www.wavpack.com */ + /* warn: adding payload after 8MB ROM breaks Mega CD */ + + FILE *fp; + +#ifdef _WIN32 + sprintf(error_str, "%s\\paprium\\paprium.wav", g_rom_dir); +#else + sprintf(error_str, "%s/paprium/paprium.wav", g_rom_dir); +#endif + + fp = fopen(error_str, "rb"); + if(!fp) { + //MessageBoxA(0,"help","r",0); + exit(1); + } + fseek(fp, 0x2C, SEEK_SET); + int size = fread(paprium_wave_ram, 1, 0x180000, fp); + for(int lcv = 0; lcv < size; lcv +=2 ) { + int data = *(uint16*)(paprium_wave_ram + lcv); + data = ((data & 0xFF00) >> 8) + ((data & 0x00FF) << 8); + *(uint16*)(paprium_wave_ram + lcv) = data; + } + fclose(fp); + } + + *(uint16*)(paprium_s.ram + 0x192) = 0x3634; /* 6-button, multitap */ +#endif + + + paprium_s.ram[0x1D1D^1] = 0x04; /* rom ok - dynamic patch */ + paprium_s.ram[0x1D2C^1] = 0x67; + + +#if 1 /* boot hack */ + *(uint16*) (paprium_s.ram + 0x1560) = 0x4EF9; + *(uint16*) (paprium_s.ram + 0x1562) = 0x0001; + *(uint16*) (paprium_s.ram + 0x1564) = 0x0100; +#endif + + + fast_dma_hack = 1; /* skip vram management */ + + +#if DEBUG_CHEAT /* cheat - big hurt */ + *(uint16*) (cart.rom + 0x9FE38 + 6) = 0x007F; /* Tug */ + *(uint16*) (cart.rom + 0x9FE58 + 6) = 0x007F; + *(uint16*) (cart.rom + 0x9FF18 + 6) = 0x007F; + *(uint16*) (cart.rom + 0x9FF38 + 6) = 0x007F; + + *(uint16*) (cart.rom + 0x9FB58 + 6) = 0x007F; /* Alex */ + *(uint16*) (cart.rom + 0x9FB78 + 6) = 0x007F; + *(uint16*) (cart.rom + 0x9FBF8 + 6) = 0x007F; + *(uint16*) (cart.rom + 0x9FC18 + 6) = 0x007F; + *(uint16*) (cart.rom + 0x9FCB8 + 6) = 0x007F; + *(uint16*) (cart.rom + 0x9FCD8 + 6) = 0x007F; + + *(uint16*) (cart.rom + 0x9F758 + 6) = 0x007F; /* Dice */ + *(uint16*) (cart.rom + 0x9F778 + 6) = 0x007F; + *(uint16*) (cart.rom + 0x9F798 + 6) = 0x007F; + *(uint16*) (cart.rom + 0x9F7B8 + 6) = 0x007F; + *(uint16*) (cart.rom + 0x9F7D8 + 6) = 0x007F; + *(uint16*) (cart.rom + 0x9F898 + 6) = 0x007F; +#endif + + +#if 1 /* WM text - pre-irq delay */ + *(uint16*)(cart.rom + 0xb9094) = 0x2079; + *(uint16*)(cart.rom + 0xb9096) = 0x000a; + *(uint16*)(cart.rom + 0xb9098) = 0xf85c; + + *(uint16*)(cart.rom + 0xb909a) = 0x20bc; + *(uint16*)(cart.rom + 0xb909c) = 0x0000; + *(uint16*)(cart.rom + 0xb909e) = 0x0003; + + *(uint16*)(cart.rom + 0xb90a0) = 0x20bc; + *(uint16*)(cart.rom + 0xb90a2) = 0x0000; + *(uint16*)(cart.rom + 0xb90a4) = 0x0003; + + *(uint16*)(cart.rom + 0xb90a6) = 0x20bc; + *(uint16*)(cart.rom + 0xb90a8) = 0x0000; + *(uint16*)(cart.rom + 0xb90aa) = 0x0003; + + *(uint16*)(cart.rom + 0xb90ac) = 0x20bc; + *(uint16*)(cart.rom + 0xb90ae) = 0x0000; + *(uint16*)(cart.rom + 0xb90b0) = 0x0003; + + *(uint16*)(cart.rom + 0xb90b2) = 0x20bc; + *(uint16*)(cart.rom + 0xb90b4) = 0x0000; + *(uint16*)(cart.rom + 0xb90b6) = 0x0003; +#endif + + + srand((uintptr_t) &ptr); /* discard time library */ + paprium_s.echo_pan = rand(); + + + paprium_s.music_segment = -1; +} + + +static void paprium_reset() +{ + paprium_init(); + + mp3dec_init(&paprium_mp3d); + + mp3dec_init(&paprium_mp3d_boss1); + mp3dec_init(&paprium_mp3d_boss2); + mp3dec_init(&paprium_mp3d_boss3); + mp3dec_init(&paprium_mp3d_boss4); + paprium_load_mp3_boss(); + + + //extern int trace_start; + //trace_start = 1; + skip_boot1 = 1; +} diff --git a/core/cd_hw/cdd.c b/core/cd_hw/cdd.c index 45bc5bf3a..a20338bb4 100644 --- a/core/cd_hw/cdd.c +++ b/core/cd_hw/cdd.c @@ -192,7 +192,8 @@ void cdd_init(int samplerate) { /* CD-DA is running by default at 44100 Hz */ /* Audio stream is resampled to desired rate using Blip Buffer */ - blip_set_rates(snd.blips[2], 44100, samplerate); + //blip_set_rates(snd.blips[2], 44100, samplerate); + blip_set_rates(snd.blips[2], 48000, samplerate); /* paprium hack */ } void cdd_reset(void) @@ -1811,82 +1812,6 @@ void cdd_update(void) error("LBA = %d (track %d)(latency=%d)\n", cdd.lba, cdd.index, cdd.latency); #endif - /* check if seeking is pending */ - if (cdd.pending) - { - /* reset track index */ - int index = 0; - - /* new LBA position */ - int lba = ((scd.regs[0x44>>1].byte.h * 10 + scd.regs[0x44>>1].byte.l) * 60 + - (scd.regs[0x46>>1].byte.h * 10 + scd.regs[0x46>>1].byte.l)) * 75 + - (scd.regs[0x48>>1].byte.h * 10 + scd.regs[0x48>>1].byte.l) - 150; - - /* CD drive latency */ - if (!cdd.latency) - { - /* Fixes a few games hanging because they expect data to be read with some delay */ - /* Wolf Team games (Annet Futatabi, Aisle Lord, Cobra Command, Earnest Evans, Road Avenger & Time Gal) need at least 11 interrupts delay */ - /* Space Adventure Cobra (2nd morgue scene) needs at least 13 interrupts delay (incl. seek time, so 11 is OK) */ - /* By default, at least two interrupts latency is required by current emulation model (BIOS hangs otherwise) */ - cdd.latency = 2 + 9*config.cd_latency; - } - - /* CD drive seek time */ - /* max. seek time = 1.5 s = 1.5 x 75 = 112.5 CDD interrupts (rounded to 120) for 270000 sectors max on disc. */ - /* Note: This is only a rough approximation since, on real hardware, seek time is much likely not linear and */ - /* latency much larger than above value, but this model works fine for Sonic CD (track 26 playback needs to */ - /* be enough delayed to start in sync with intro sequence, as compared with real hardware recording). */ - /* It also works fine for Switch/Panic! intro (at least 30 interrupts are needed while seeking from 00:05:63 */ - /* to 24:03:19 in Switch or when seeking from 00:05:60 to 24:06:07 in Panic!). */ - if (lba > cdd.lba) - { - cdd.latency += (((lba - cdd.lba) * 120 * config.cd_latency) / 270000); - } - else - { - cdd.latency += (((cdd.lba - lba) * 120 * config.cd_latency) / 270000); - } - - /* update current LBA */ - cdd.lba = lba; - - /* get track index */ - while ((cdd.toc.tracks[index].end <= lba) && (index < cdd.toc.last)) - index++; - - /* audio track ? */ - if (cdd.toc.tracks[index].type == TYPE_AUDIO) - { - /* stay within track limits when seeking files */ - if (lba < cdd.toc.tracks[index].start) - { - lba = cdd.toc.tracks[index].start; - } - - /* seek to current track sector */ - cdd_seek_audio(index, lba); - } - - /* update current track index */ - cdd.index = index; - - /* seek to current subcode position */ - if (cdd.toc.sub) - { - cdStreamSeek(cdd.toc.sub, lba * 96, SEEK_SET); - } - - /* no audio track playing (yet) */ - scd.regs[0x36>>1].byte.h = 0x01; - - /* update CDD status with pending end status (will be reported to host once seeking has ended) */ - cdd.status = cdd.pending; - - /* clear pending flag */ - cdd.pending = 0; - } - /* drive latency */ if (cdd.latency > 0) { @@ -2034,6 +1959,82 @@ void cdd_update(void) cdd.index = index; } } + + /* check if seeking is pending */ + if (cdd.pending) + { + /* reset track index */ + int index = 0; + + /* new LBA position */ + int lba = ((scd.regs[0x44>>1].byte.h * 10 + scd.regs[0x44>>1].byte.l) * 60 + + (scd.regs[0x46>>1].byte.h * 10 + scd.regs[0x46>>1].byte.l)) * 75 + + (scd.regs[0x48>>1].byte.h * 10 + scd.regs[0x48>>1].byte.l) - 150; + + /* CD drive latency */ + if (!cdd.latency) + { + /* Fixes a few games hanging because they expect data to be read with some delay */ + /* Wolf Team games (Annet Futatabi, Aisle Lord, Cobra Command, Earnest Evans, Road Avenger & Time Gal) need at least 11 interrupts delay */ + /* Space Adventure Cobra (2nd morgue scene) needs at least 13 interrupts delay (incl. seek time, so 11 is OK) */ + /* By default, at least two interrupts latency is required by current emulation model (BIOS hangs otherwise) */ + cdd.latency = 2 + 9*config.cd_latency; + } + + /* CD drive seek time */ + /* max. seek time = 1.5 s = 1.5 x 75 = 112.5 CDD interrupts (rounded to 120) for 270000 sectors max on disc. */ + /* Note: This is only a rough approximation since, on real hardware, seek time is much likely not linear and */ + /* latency much larger than above value, but this model works fine for Sonic CD (track 26 playback needs to */ + /* be enough delayed to start in sync with intro sequence, as compared with real hardware recording). */ + /* It also works fine for Switch/Panic! intro (at least 30 interrupts are needed while seeking from 00:05:63 */ + /* to 24:03:19 in Switch or when seeking from 00:05:60 to 24:06:07 in Panic!). */ + if (lba > cdd.lba) + { + cdd.latency += (((lba - cdd.lba) * 120 * config.cd_latency) / 270000); + } + else + { + cdd.latency += (((cdd.lba - lba) * 120 * config.cd_latency) / 270000); + } + + /* update current LBA */ + cdd.lba = lba; + + /* get track index */ + while ((cdd.toc.tracks[index].end <= lba) && (index < cdd.toc.last)) + index++; + + /* audio track ? */ + if (cdd.toc.tracks[index].type == TYPE_AUDIO) + { + /* stay within track limits when seeking files */ + if (lba < cdd.toc.tracks[index].start) + { + lba = cdd.toc.tracks[index].start; + } + + /* seek to current track sector */ + cdd_seek_audio(index, lba); + } + + /* update current track index */ + cdd.index = index; + + /* seek to current subcode position */ + if (cdd.toc.sub) + { + cdStreamSeek(cdd.toc.sub, lba * 96, SEEK_SET); + } + + /* no audio track playing (yet) */ + scd.regs[0x36>>1].byte.h = 0x01; + + /* update CDD status with pending end status (will be reported to host once seeking has ended) */ + cdd.status = cdd.pending; + + /* clear pending flag */ + cdd.pending = 0; + } } void cdd_process(void) diff --git a/core/m68k/m68kcpu.c b/core/m68k/m68kcpu.c index 5382ce422..237fb1cc1 100644 --- a/core/m68k/m68kcpu.c +++ b/core/m68k/m68kcpu.c @@ -2,6 +2,8 @@ /* MAIN 68K CORE */ /* ======================================================================== */ +#define DEBUG_TRACE 0 + extern int vdp_68k_irq_ack(int int_level); #define m68ki_cpu m68k @@ -31,6 +33,11 @@ static int irq_latency; m68ki_cpu_core m68k; +#if DEBUG_TRACE +#include +#include "m68kd.h" +#include "shared.h" +#endif /* ======================================================================== */ /* =============================== CALLBACKS ============================== */ @@ -296,6 +303,13 @@ void m68k_run(unsigned int cycles) cpu_hook(HOOK_M68K_E, 0, REG_PC, 0); #endif +#if DEBUG_TRACE + { + m68k.prev_pc = m68k.pc; + trace_m68k(); + } +#endif + /* Decode next instruction */ REG_IR = m68ki_read_imm_16(); diff --git a/core/m68k/m68kcpu.h b/core/m68k/m68kcpu.h index 424d68723..3655f91a3 100644 --- a/core/m68k/m68kcpu.h +++ b/core/m68k/m68kcpu.h @@ -154,8 +154,8 @@ /* We have to do this because the morons at ANSI decided that shifts * by >= data size are undefined. */ - #define LSR_32(A, C) ((C) < 32 ? (A) >> (C) : 0) - #define LSL_32(A, C) ((C) < 32 ? (A) << (C) : 0) + #define LSR_32(A, C) (((C) < 32) ? (A) >> (C) : 0) + #define LSL_32(A, C) (((C) < 32) ? (A) << (C) : 0) #endif /* M68K_INT_GT_32_BIT */ #if M68K_USE_64_BIT diff --git a/core/m68k/m68kd.h b/core/m68k/m68kd.h new file mode 100644 index 000000000..4b4424882 --- /dev/null +++ b/core/m68k/m68kd.h @@ -0,0 +1,1162 @@ +//#include + +static FILE *fp_trace_m68k; +static char map_m68k[0x100 * 0x10000]; + + +static char Dbg_Str[64]; +static char Dbg_EA_Str[32]; +static char Dbg_Size_Str[3]; +static char Dbg_Cond_Str[3]; + +static unsigned short (*Next_Word)(); +static unsigned int (*Next_Long)(); + +int trace_start; + + +static char *Make_Dbg_EA_Str(int Size, int EA_Num, int Reg_Num) +{ + int i; + Dbg_EA_Str[31] = 0; + + switch(EA_Num) + { + case 0: + // 000 rrr Dr + sprintf(Dbg_EA_Str, "D%.1d%c", Reg_Num, 0); + break; + + case 1: + // 001 rrr Ar + sprintf(Dbg_EA_Str, "A%.1d%c", Reg_Num, 0); + break; + + case 2: + // 010 rrr (Ar) + sprintf(Dbg_EA_Str, "(A%.1d)%c", Reg_Num, 0); + break; + + case 3: + // 011 rrr (Ar)+ + sprintf(Dbg_EA_Str, "(A%.1d)+%c", Reg_Num, 0); + break; + + case 4: + // 100 rrr -(Ar) + sprintf(Dbg_EA_Str, "-(A%.1d)%c", Reg_Num, 0); + break; + + case 5: + // 101 rrr d16(Ar) dddddddd dddddddd + sprintf(Dbg_EA_Str, "$%.4X(A%.1d)%c", Next_Word(), Reg_Num, 0); + break; + + case 6: + // 110 rrr d8(Ar,ix) aiiizcc0 dddddddd + i = Next_Word() & 0xFFFF; + if (i & 0x8000) + sprintf(Dbg_EA_Str, "$%.2X(A%.1d,A%.1d)%c", i & 0xFF, Reg_Num, (i >> 12) & 0x7, 0); + else + sprintf(Dbg_EA_Str, "$%.2X(A%.1d,D%.1d)%c", i & 0xFF, Reg_Num, (i >> 12) & 0x7, 0); + break; + + case 7: + switch(Reg_Num) + { + case 0: + // 111 000 addr16 dddddddd dddddddd + sprintf(Dbg_EA_Str, "($%.4X)%c", Next_Word(), 0); + break; + + case 1: + // 111 001 addr32 dddddddd dddddddd ddddddddd dddddddd + sprintf(Dbg_EA_Str, "($%.8X)%c", Next_Long(), 0); + break; + + case 2: + // 111 010 d16(PC) dddddddd dddddddd + sprintf(Dbg_EA_Str, "$%.4X(PC)%c", Next_Word(), 0); + break; + + case 3: + // 111 011 d8(PC,ix) aiiiz000 dddddddd + i = Next_Word() & 0xFFFF; + if (i & 0x8000) + sprintf(Dbg_EA_Str, "$%.2X(PC,A%.1d)%c", i & 0xFF, (i >> 12) & 0x7, 0); + else + sprintf(Dbg_EA_Str, "$%.2X(PC,D%.1d)%c", i & 0xFF, (i >> 12) & 0x7, 0); + break; + + case 4: + // 111 100 imm/implied + switch(Size) + { + case 0: + sprintf(Dbg_EA_Str, "#$%.2X%c", Next_Word() & 0xFF, 0); + break; + + case 1: + sprintf(Dbg_EA_Str, "#$%.4X%c", Next_Word(), 0); + break; + + case 2: + sprintf(Dbg_EA_Str, "#$%.8X%c", Next_Long(), 0); + break; + } + break; + } + break; + } + + return(Dbg_EA_Str); +} + + +static char *Make_Dbg_Size_Str(int Size) +{ + Dbg_Size_Str[2] = 0; + sprintf(Dbg_Size_Str, ".?"); + + switch(Size) + { + case 0: + sprintf(Dbg_Size_Str, ".B"); + break; + + case 1: + sprintf(Dbg_Size_Str, ".W"); + break; + + case 2: + sprintf(Dbg_Size_Str, ".L"); + break; + } + + return(Dbg_Size_Str); +} + + +static char *Make_Dbg_Size_Str_2(int Size) +{ + Dbg_Size_Str[2] = 0; + sprintf(Dbg_Size_Str, ".?"); + + switch(Size) + { + case 0: + sprintf(Dbg_Size_Str, ".W"); + break; + + case 1: + sprintf(Dbg_Size_Str, ".L"); + break; + } + + return(Dbg_Size_Str); +} + +static char *Make_Dbg_Cond_Str(int Cond) +{ + Dbg_Cond_Str[2] = 0; + sprintf(Dbg_Cond_Str, "??"); + + switch(Cond) + { + case 0: + sprintf(Dbg_Cond_Str, "Tr"); + break; + + case 1: + sprintf(Dbg_Cond_Str, "Fa"); + break; + + case 2: + sprintf(Dbg_Cond_Str, "HI"); + break; + + case 3: + sprintf(Dbg_Cond_Str, "LS"); + break; + + case 4: + sprintf(Dbg_Cond_Str, "CC"); + break; + + case 5: + sprintf(Dbg_Cond_Str, "CS"); + break; + + case 6: + sprintf(Dbg_Cond_Str, "NE"); + break; + + case 7: + sprintf(Dbg_Cond_Str, "EQ"); + break; + + case 8: + sprintf(Dbg_Cond_Str, "VC"); + break; + + case 9: + sprintf(Dbg_Cond_Str, "VS"); + break; + + case 10: + sprintf(Dbg_Cond_Str, "PL"); + break; + + case 11: + sprintf(Dbg_Cond_Str, "MI"); + break; + + case 12: + sprintf(Dbg_Cond_Str, "GE"); + break; + + case 13: + sprintf(Dbg_Cond_Str, "LT"); + break; + + case 14: + sprintf(Dbg_Cond_Str, "GT"); + break; + + case 15: + sprintf(Dbg_Cond_Str, "LE"); + break; + } + + return(Dbg_Cond_Str); +} + + +static char *M68KDisasm(unsigned short (*NW)(), unsigned int (*NL)(), unsigned int hook_pc ) +{ + int i; + unsigned short OPC; + static char Tmp_Str[64]; + + Dbg_Str[63] = 0; + Tmp_Str[63] = 0; + + Next_Word = NW; + Next_Long = NL; + + OPC = Next_Word(); + + sprintf(Dbg_Str, "Unknown Opcode%c", 0); + + switch(OPC >> 12) + { + case 0: + + if (OPC & 0x100) + { + if ((OPC & 0x038) == 0x8) + { + if (OPC & 0x080) + //MOVEP.z Ds,d16(Ad) + sprintf(Dbg_Str, "MOVEP%-3sD%.1d,#$%.4X(A%.1d)%c", Make_Dbg_Size_Str_2((OPC & 0x40) >> 6), (OPC & 0xE00) >> 9, Next_Word(), OPC & 0x7, 0); + else + //MOVEP.z d16(As),Dd + sprintf(Dbg_Str, "MOVEP%-3s#$%.4X(A%.1d),D%.1d%c", Make_Dbg_Size_Str_2((OPC & 0x40) >> 6), Next_Word(), OPC & 0x7, (OPC & 0xE00) >> 9, 0); + } + else + { + switch((OPC >> 6) & 0x3) + { + case 0: + //BTST Ds,a + sprintf(Dbg_Str, "BTST D%.1d,%s%c", (OPC & 0xE00) >> 9, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 7), 0); + break; + + case 1: + //BCHG Ds,a + sprintf(Dbg_Str, "BCHG D%.1d,%s%c", (OPC & 0xE00) >> 9, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 7), 0); + break; + + case 2: + //BCLR Ds,a + sprintf(Dbg_Str, "BCLR D%.1d,%s%c", (OPC & 0xE00) >> 9, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 7), 0); + break; + + case 3: + //BSET Ds,a + sprintf(Dbg_Str, "BSET D%.1d,%s%c", (OPC & 0xE00) >> 9, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 7), 0); + break; + } + } + } + else + { + switch((OPC >> 6) & 0x3F) + { + case 0: + //ORI.B #k,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "ORI.B #$%.2X,%s%c", i, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 1: + //ORI.W #k,a + i = Next_Word() & 0xFFFF; + sprintf(Dbg_Str, "ORI.W #$%.4X,%s%c", i, Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 2: + //ORI.L #k,a + i = Next_Long(); + sprintf(Dbg_Str, "ORI.L #$%.8X,%s%c", i, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 8: + //ANDI.B #k,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "ANDI.B #$%.2X,%s%c", i & 0xFF, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 9: + //ANDI.W #k,a + i = Next_Word() & 0xFFFF; + sprintf(Dbg_Str, "ANDI.W #$%.4X,%s%c", i, Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 10: + //ANDI.L #k,a + i = Next_Long(); + sprintf(Dbg_Str, "ANDI.L #$%.8X,%s%c", i, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 16: + //SUBI.B #k,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "SUBI.B #$%.2X,%s%c", i & 0xFF, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 17: + //SUBI.W #k,a + i = Next_Word() & 0xFFFF; + sprintf(Dbg_Str, "SUBI.W #$%.4X,%s%c", i, Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 18: + //SUBI.L #k,a + i = Next_Long(); + sprintf(Dbg_Str, "SUBI.L #$%.8X,%s%c", i, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 24: + //ADDI.B #k,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "ADDI.B #$%.2X,%s%c", i & 0xFF, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 25: + //ADDI.W #k,a + i = Next_Word() & 0xFFFF; + sprintf(Dbg_Str, "ADDI.W #$%.4X,%s%c", i, Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 26: + //ADDI.L #k,a + i = Next_Long(); + sprintf(Dbg_Str, "ADDI.L #$%.8X,%s%c", i, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 32: + //BTST #n,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "BTST #%d,%s%c", i, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 33: + //BCHG #n,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "BCHG #%d,%s%c", i, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 34: + //BCLR #n,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "BCLR #%d,%s%c", i, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 35: + //BSET #n,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "BSET #%d,%s%c", i, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 40: + //EORI.B #k,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "EORI.B #$%.2X,%s%c", i & 0xFF, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 41: + //EORI.W #k,a + i = Next_Word() & 0xFFFF; + sprintf(Dbg_Str, "EORI.W #$%.4X,%s%c", i, Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 42: + //EORI.L #k,a + i = Next_Long(); + sprintf(Dbg_Str, "EORI.L #$%.8X,%s%c", i, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 48: + //CMPI.B #k,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "CMPI.B #$%.2X,%s%c", i & 0xFF, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 49: + //CMPI.W #k,a + i = Next_Word() & 0xFFFF; + sprintf(Dbg_Str, "CMPI.W #$%.4X,%s%c", i, Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 50: + //CMPI.L #k,a + i = Next_Long(); + sprintf(Dbg_Str, "CMPI.L #$%.8X,%s%c", i, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + } + } + break; + + case 1: + //MOVE.b as,ad + sprintf(Tmp_Str, "%s%c", Make_Dbg_EA_Str(0, (OPC >> 3) & 0x7, OPC & 0x7), 0); + sprintf(Dbg_Str, "MOVE.b %s,%s%c", Tmp_Str, Make_Dbg_EA_Str(0, (OPC >> 6) & 0x7, (OPC >> 9) & 0x7), 0); + break; + + case 2: + //MOVE.l as,ad + sprintf(Tmp_Str, "%s%c", Make_Dbg_EA_Str(2, (OPC >> 3) & 0x7, OPC & 0x7), 0); + sprintf(Dbg_Str, "MOVE.l %s,%s%c", Tmp_Str, Make_Dbg_EA_Str(2, (OPC >> 6) & 0x7, (OPC >> 9) & 0x7), 0); + break; + + case 3: + //MOVE.w as,ad + sprintf(Tmp_Str, "%s%c", Make_Dbg_EA_Str(1, (OPC >> 3) & 0x7, OPC & 0x7), 0); + sprintf(Dbg_Str, "MOVE.w %s,%s%c", Tmp_Str, Make_Dbg_EA_Str(1, (OPC >> 6) & 0x7, (OPC >> 9) & 0x7), 0); + break; + + case 4: + //SPECIALS ... + + if (OPC & 0x100) + { + if (OPC & 0x40) + //LEA a,Ad + sprintf(Dbg_Str, "LEA %s,A%.1d%c", Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + else + //CHK.W a,Dd + sprintf(Dbg_Str, "CHK.W %s,D%.1d%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + } + else + { + switch((OPC >> 6) & 0x3F) + { + case 0: case 1: case 2: + //NEGX.z a + sprintf(Dbg_Str, "NEGX%-4s%s%c", Make_Dbg_Size_Str((OPC >> 6) & 3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 3: + //MOVE SR,a + sprintf(Dbg_Str, "MOVE SR,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 8: case 9: case 10: + //CLR.z a + sprintf(Dbg_Str, "CLR%-5s%s%c", Make_Dbg_Size_Str((OPC >> 6) & 3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 16: case 17: case 18: + //NEG.z a + sprintf(Dbg_Str, "NEG%-5s%s%c", Make_Dbg_Size_Str((OPC >> 6) & 3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 19: + //MOVE a,CCR + sprintf(Dbg_Str, "MOVE %s,CCR%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 24: case 25: case 26: + //NOT.z a + sprintf(Dbg_Str, "NOT%-5s%s%c", Make_Dbg_Size_Str((OPC >> 6) & 3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 27: + //MOVE a,SR + sprintf(Dbg_Str, "MOVE %s,SR%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 32: + //NBCD a + sprintf(Dbg_Str, "NBCD %s%c", Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 33: + + if (OPC & 0x38) + //PEA a + sprintf(Dbg_Str, "PEA %s%c", Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + else + //SWAP.w Dd + sprintf(Dbg_Str, "SWAP.w D%d%c", OPC & 0x7, 0); + + break; + + case 34: case 35: + + if (OPC & 0x38) + { + int registers_a7_d0 = Next_Word(); + + //MOVEM.z Reg-List,a + sprintf(Dbg_Str, "MOVEM%-3s{d0-a7}[%02x %02x],%s%c", Make_Dbg_Size_Str_2((OPC >> 6) & 1), + registers_a7_d0 >> 8, registers_a7_d0 & 0xff, + Make_Dbg_EA_Str((OPC >> 6) & 1 + 1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + //Next_Word(); + } + else + //EXT.z Dd + sprintf(Dbg_Str, "EXT%-5s%s%c", Make_Dbg_Size_Str_2((OPC >> 6) & 1), Make_Dbg_EA_Str((OPC >> 6) & 1 + 1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + + break; + + case 40: case 41: case 42: + //TST.z a + sprintf(Dbg_Str, "TST%-5s%s%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), Make_Dbg_EA_Str((OPC >> 6) & 0x3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 43: + //TAS.b a + sprintf(Dbg_Str, "TAS.B %s%c", Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 48: case 49: + //Bad Opcode + sprintf(Dbg_Str, "Bad Opcode%c", 0); + break; + + case 50: case 51: { + int registers_d0_a7 = Next_Word(); + + //MOVEM.z a,Reg-List + sprintf(Dbg_Str, "MOVEM%-3s%s,{a7-d0}[%02x %02x]%c", Make_Dbg_Size_Str_2((OPC >> 6) & 1), Make_Dbg_EA_Str((OPC >> 6) & 1 + 1, (OPC & 0x38) >> 3, OPC & 0x7), + registers_d0_a7 >> 8, registers_d0_a7 & 0xff, + 0); + //Next_Word(); + } break; + + case 57: + + switch((OPC >> 3) & 0x7) + { + case 0: case 1: + //TRAP #vector + sprintf(Dbg_Str, "TRAP #$%.1X%c", OPC & 0xF, 0); + break; + + case 2: + //LINK As,#k16 + sprintf(Dbg_Str, "LINK A%.1d,#$%.4X%c", OPC & 0x7, Next_Word(), 0); + break; + + case 3: + //ULNK Ad + sprintf(Dbg_Str, "ULNK A%.1d%c", OPC & 0x7, 0); + break; + + case 4: + //MOVE As,USP + sprintf(Dbg_Str, "MOVE A%.1d,USP%c",OPC & 0x7, 0); + break; + + case 5: + //MOVE USP,Ad + sprintf(Dbg_Str, "MOVE USP,A%.1d%c",OPC & 0x7, 0); + break; + + case 6: + + switch(OPC & 0x7) + { + case 0: + //RESET + sprintf(Dbg_Str, "RESET%c", 0); + break; + + case 1: + //NOP + sprintf(Dbg_Str, "NOP%c", 0); + break; + + case 2: + //STOP #k16 + sprintf(Dbg_Str, "STOP #$%.4X%c", Next_Word(), 0); + break; + + case 3: + //RTE + sprintf(Dbg_Str, "RTE%c", 0); + break; + + case 4: + //Bad Opcode + sprintf(Dbg_Str, "Bad Opcode%c", 0); + break; + + case 5: + //RTS + sprintf(Dbg_Str, "RTS%c", 0); + break; + + case 6: + //TRAPV + sprintf(Dbg_Str, "TRAPV%c", 0); + break; + + case 7: + //RTR + sprintf(Dbg_Str, "RTR%c", 0); + break; + } + break; + } + break; + + case 58: + //JSR a + sprintf(Dbg_Str, "JSR %s%c", Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 59: + //JMP a + sprintf(Dbg_Str, "JMP %s%c", Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + } + } + break; + + case 5: + + if ((OPC & 0xC0) == 0xC0) + { + char offset = OPC & 0xFF; + + if ((OPC & 0x38) == 0x08) { + unsigned short word = Next_Word(); + + //DBCC Ds,label + sprintf(Dbg_Str, "DB%-6sD%.1d,#$%.4X [%02X:%04X]%c", Make_Dbg_Cond_Str((OPC >> 8) & 0xF), OPC & 0x7, word, + (hook_pc + 2) >> 16, (hook_pc + 2 + word) & 0xffff, 0); + } + else + //STCC.b a + sprintf(Dbg_Str, "ST%-6s%s [%02X:%04X]%c", Make_Dbg_Cond_Str((OPC >> 8) & 0xF), Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), + (hook_pc + 2) >> 16, (hook_pc + 2 + offset) & 0xffff, 0); + break; + } + else + { + if (OPC & 0x100) + //SUBQ.z #k3,a + sprintf(Dbg_Str, "SUBQ%-4s#%.1d,%s%c", Make_Dbg_Size_Str((OPC >> 6) & 3), (OPC >> 9) & 0x7, Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + else + //ADDQ.z #k3,a + sprintf(Dbg_Str, "ADDQ%-4s#%.1d,%s%c", Make_Dbg_Size_Str((OPC >> 6) & 3), (OPC >> 9) & 0x7, Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + } + break; + + case 6: + + if (OPC & 0xFF) + { + int offset = (char) (OPC & 0xFF); + + if ((OPC & 0xF00) == 0x100) + { + //BSR label + sprintf(Dbg_Str, "BSR #$%.2X [%02X:%04X]%c", OPC & 0xFF, + (hook_pc + 2 + offset) >> 16, (hook_pc + 2 + offset) & 0xffff, 0); + break; + } + + if (!(OPC & 0xF00)) + { + //BRA label + sprintf(Dbg_Str, "BRA #$%.2X [%02X:%04X]%c", OPC & 0xFF, + (hook_pc + 2 + offset) >> 16, (hook_pc + 2 + offset) & 0xffff, 0); + break; + } + + //BCC label + sprintf(Dbg_Str, "B%-7s#$%.2X [%02X:%04X]%c", + Make_Dbg_Cond_Str((OPC >> 8) & 0xF), OPC & 0xFF, + (hook_pc + 2 + offset) >> 16, (hook_pc + 2 + offset) & 0xffff, 0); + } + else + { + int offset = (short)(Next_Word()); + + if ((OPC & 0xF00) == 0x100) + { + //BSR label + sprintf(Dbg_Str, "BSR #$%.4X [%02X:%04X]%c", offset, + (hook_pc + 2 + offset) >> 16, (hook_pc + 2 + offset) & 0xffff, 0); + break; + } + + if (!(OPC & 0xF00)) + { + //BRA label + sprintf(Dbg_Str, "BRA #$%.4X [%02X:%04X]%c", offset, + (hook_pc + 2 + offset) >> 16, (hook_pc + 2 + offset) & 0xffff, 0); + break; + } + + //BCC label + sprintf(Dbg_Str, "B%-7s#$%.4X [%02X:%04X]%c", + Make_Dbg_Cond_Str((OPC >> 8 ) & 0xF), offset, + (hook_pc + 2 + offset) >> 16, (hook_pc + 2 + offset) & 0xffff, 0); + } + break; + + case 7: + //MOVEQ #k8,Dd + sprintf(Dbg_Str, "MOVEQ #$%.2X,D%.1d%c", OPC & 0xFF, (OPC >> 9) & 0x7, 0); + break; + + case 8: + + if (OPC & 0x100) + { + if (!(OPC & 0xF8)) + { + //SBCD Ds,Dd + sprintf(Dbg_Str, "SBCD D%.1d,D%.1d%c", OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + if ((OPC & 0xF8) == 0x8) + { + //SBCD -(As),-(Ad) + sprintf(Dbg_Str, "SBCD -(A%.1d),-(A%.1d)%c", OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + if ((OPC & 0xC0) == 0xC0) + //DIVS.w a,Dd + sprintf(Dbg_Str, "DIVS.W %s,D%.1d%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + else + //OR.z Ds,a + sprintf(Dbg_Str, "OR%-6sD%.1d;%s%c", Make_Dbg_Size_Str((OPC >> 6) & 3), (OPC >> 9) & 0x7, Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + } + else + { + if ((OPC & 0xC0) == 0xC0) + //DIVU.w a,Dd + sprintf(Dbg_Str, "DIVU.W %s,D%.1d%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + else + //OR.z a,Dd + sprintf(Dbg_Str, "OR%-6s%s,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + } + break; + + case 9: + + if ((OPC & 0xC0) == 0xC0) + //SUBA.z a,Ad + sprintf(Dbg_Str, "SUBA%-4s%s,A%.1d%c", Make_Dbg_Size_Str_2((OPC >> 8) & 1), Make_Dbg_EA_Str((OPC >> 8) & 1 + 1, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + else + { + if (OPC & 0x100) + { + if (!(OPC & 0x38)) + { + //SUBX.z Ds,Dd + sprintf(Dbg_Str, "SUBX%-4sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + if ((OPC & 0x38) == 0x8) + { + //SUBX.z -(As),-(Ad) + sprintf(Dbg_Str, "SUBX%-4s-(A%.1d),-(A%.1d)%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + //SUB.z Ds,a + sprintf(Dbg_Str, "SUB%-5sD%.1d,%s%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + } + else + //SUB.z a,Dd + sprintf(Dbg_Str, "SUB%-5s%s,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + } + break; + + case 10: + //Bad Opcode + sprintf(Dbg_Str, "Bad Opcode%c", 0); + break; + + case 11: + + if ((OPC & 0xC0) == 0xC0) + //CMPA.z a,Ad + sprintf(Dbg_Str, "CMPA%-4s%s,A%.1d%c", Make_Dbg_Size_Str_2((OPC >> 8) & 1), Make_Dbg_EA_Str((OPC >> 7) & 1 + 1, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + else + { + if (OPC & 0x100) + { + if ((OPC & 0x38) == 0x8) + { + //CMPM.z (As)+,(Ad)+ + sprintf(Dbg_Str, "CMPM%-4s(A%.1d)+,(A%.1d)+%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + //EOR.z Ds,a + sprintf(Dbg_Str, "EOR%-5sD%.1d,%s%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + } + else + //CMP.z a,Dd + sprintf(Dbg_Str, "CMP%-5s%s,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + } + break; + + case 12: + + if ((OPC & 0X1F8) == 0x100) + { + //ABCD Ds,Dd + sprintf(Dbg_Str, "ABCD D%.1d,D%.1d%c", OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + if ((OPC & 0X1F8) == 0x140) + { + //EXG.l Ds,Dd + sprintf(Dbg_Str, "EXG.L D%.1d,D%.1d%c", OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + if ((OPC & 0X1F8) == 0x108) + { + //ABCD -(As),-(Ad) + sprintf(Dbg_Str, "ABCD -(A%.1d),-(A%.1d)%c", OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + if ((OPC & 0X1F8) == 0x148) + { + //EXG.l As,Ad + sprintf(Dbg_Str, "EXG.L A%.1d,A%.1d%c", OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + if ((OPC & 0X1F8) == 0x188) + { + //EXG.l As,Dd + sprintf(Dbg_Str, "EXG.L A%.1d,D%.1d%c", OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + switch((OPC >> 6) & 0x7) + { + case 0: case 1: case 2: + //AND.z a,Dd + sprintf(Dbg_Str, "AND%-5s%s,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + break; + + case 3: + //MULU.w a,Dd + sprintf(Dbg_Str, "MULU.W %s,D%.1d%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + break; + + case 4: case 5: case 6: + //AND.z Ds,a + sprintf(Dbg_Str, "AND%-5sD%.1d,%s%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 7: + //MULS.w a,Dd + sprintf(Dbg_Str, "MULS.W %s,D%.1d%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + break; + } + break; + + case 13: + + if ((OPC & 0xC0) == 0xC0) + //ADDA.z a,Ad + sprintf(Dbg_Str, "ADDA%-4s%s,A%.1d%c", Make_Dbg_Size_Str_2((OPC >> 8) & 1), Make_Dbg_EA_Str((OPC >> 8) & 1 + 1, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + else + { + if (OPC & 0x100) + { + if (!(OPC & 0x38)) + { + //ADDX.z Ds,Dd + sprintf(Dbg_Str, "ADDX%-4sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + if ((OPC & 0x38) == 0x8) + { + //ADDX.z -(As),-(Ad) + sprintf(Dbg_Str, "ADDX%-4s-(A%.1d),-(A%.1d)%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + //ADD.z Ds,a + sprintf(Dbg_Str, "ADD%-5sD%.1d,%s%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + } + else + //ADD.z a,Dd + sprintf(Dbg_Str, "ADD%-5s%s,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + } + break; + + case 14: + + if ((OPC & 0xC0) == 0xC0) + { + switch ((OPC >> 8) & 0x7) + { + case 0: + //ASR.w #1,a + sprintf(Dbg_Str, "ASR.W #1,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 1: + //ASL.w #1,a + sprintf(Dbg_Str, "ASL.W #1,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 2: + //LSR.w #1,a + sprintf(Dbg_Str, "LSR.W #1,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 3: + //LSL.w #1,a + sprintf(Dbg_Str, "LSL.W #1,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 4: + //ROXR.w #1,a + sprintf(Dbg_Str, "ROXR.W #1,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 5: + //ROXL.w #1,a + sprintf(Dbg_Str, "ROXL.W #1,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 6: + //ROR.w #1,a + sprintf(Dbg_Str, "ROR.W #1,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 7: + //ROL.w #1,a + sprintf(Dbg_Str, "ROL.W #1,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + } + } + else + { + switch ((OPC >> 3) & 0x3F) + { + case 0: case 8: case 16: + //ASR.z #k,Dd + sprintf(Dbg_Str, "ASR%-5s#%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 1: case 9: case 17: + //LSR.z #k,Dd + sprintf(Dbg_Str, "LSR%-5s#%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 2: case 10: case 18: + //ROXR.z #k,Dd + sprintf(Dbg_Str, "ROXR%-4s#%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 3: case 11: case 19: + //ROR.z #k,Dd + sprintf(Dbg_Str, "ROR%-5s#%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 4: case 12: case 20: + //ASR.z Ds,Dd + sprintf(Dbg_Str, "ASR%-5sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 5: case 13: case 21: + //LSR.z Ds,Dd + sprintf(Dbg_Str, "LSR%-5sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 6: case 14: case 22: + //ROXR.z Ds,Dd + sprintf(Dbg_Str, "ROXR%-4sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 7: case 15: case 23: + //ROR.z Ds,Dd + sprintf(Dbg_Str, "ROR%-5sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 32: case 40: case 48: + //ASL.z #k,Dd + sprintf(Dbg_Str, "ASL%-5s#%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 33: case 41: case 49: + //LSL.z #k,Dd + sprintf(Dbg_Str, "LSL%-5s#%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 34: case 42: case 50: + //ROXL.z #k,Dd + sprintf(Dbg_Str, "ROXL%-4s#%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 35: case 43: case 51: + //ROL.z #k,Dd + sprintf(Dbg_Str, "ROL%-5s#%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 36: case 44: case 52: + //ASL.z Ds,Dd + sprintf(Dbg_Str, "ASL%-5sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 37: case 45: case 53: + //LSL.z Ds,Dd + sprintf(Dbg_Str, "LSL%-5sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 38: case 46: case 54: + //ROXL.z Ds,Dd + sprintf(Dbg_Str, "ROXL%-4sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 39: case 47: case 55: + //ROL.z Ds,Dd + sprintf(Dbg_Str, "ROL%-5sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + } + } + break; + + case 15: + //Bad Opcode + sprintf(Dbg_Str, "Bad Opcode%c", 0); + break; + } + + return(Dbg_Str); +} + + +static unsigned short Next_Word_T(void) +{ + return m68ki_read_imm_16(); +} + +static unsigned int Next_Long_T(void) +{ + return m68ki_read_imm_32(); +} + +static void trace_m68k() +{ + static char String [512]; + static unsigned int counter = 0; + int real_pc = m68k.pc; + + + if( trace_start == 0 ) return; + + + counter++; + + if( map_m68k[m68k.pc] ) return; + if( m68k.pc == 0x1F00 ) return; // paprium diasm crash + //if( m68k.pc >= 0xFF0000 ) return; + //if( m68k.pc < 0x10000 ) return; + map_m68k[m68k.pc] = 1; + + //if(m68k.pc == 0x84bf6 ) map_m68k[m68k.pc] = 0; + + + if( !fp_trace_m68k ) { + fp_trace_m68k = fopen("trace-m68k.txt", "w"); + } + + + sprintf( String, "[%X] %02X:%04X", counter, m68k.pc >> 16, m68k.pc & 0xffff ); + fprintf( fp_trace_m68k, "%s", String ); + + + sprintf( String, " %04X %04X ", m68k_read_immediate_16(m68k.pc), m68k_read_immediate_16(m68k.pc+2) ); + fprintf( fp_trace_m68k, "%s", String ); + + + sprintf( String, "%-33s", M68KDisasm( Next_Word_T, Next_Long_T, m68k.pc ) ); + fprintf( fp_trace_m68k, "%s", String ); + + + sprintf( String, "A0=%.8X A1=%.8X A2=%.8X ", m68k.dar[8], m68k.dar[9], m68k.dar[10]); + fprintf( fp_trace_m68k, "%s", String ); + + sprintf( String, "A3=%.8X A4=%.8X A5=%.8X ", m68k.dar[11], m68k.dar[12], m68k.dar[13]); + fprintf( fp_trace_m68k, "%s", String ); + + sprintf( String, "A6=%.8X A7=%.8X", m68k.dar[14], m68k.dar[15]); + fprintf( fp_trace_m68k, "%s", String ); + + sprintf( String, " " ); + fprintf( fp_trace_m68k, "%s", String ); + + sprintf( String, "D0=%.8X D1=%.8X D2=%.8X ", m68k.dar[0], m68k.dar[1], m68k.dar[2]); + fprintf( fp_trace_m68k, "%s", String ); + + sprintf( String, "D3=%.8X D4=%.8X D5=%.8X ", m68k.dar[3], m68k.dar[4], m68k.dar[5]); + fprintf( fp_trace_m68k, "%s", String ); + + sprintf( String, "D6=%.8X D7=%.8X", m68k.dar[6], m68k.dar[7]); + fprintf( fp_trace_m68k, "%s", String ); + + fprintf( fp_trace_m68k, " "); + fprintf( fp_trace_m68k, "%c", (m68k.ir & 0x10)?'X':'x' ); + fprintf( fp_trace_m68k, "%c", (m68k.ir & 0x08)?'N':'n' ); + fprintf( fp_trace_m68k, "%c", (m68k.ir & 0x04)?'Z':'z' ); + fprintf( fp_trace_m68k, "%c", (m68k.ir & 0x02)?'V':'v' ); + fprintf( fp_trace_m68k, "%c", (m68k.ir & 0x01)?'C':'c' ); + + fprintf( fp_trace_m68k, "\n" ); + fflush(fp_trace_m68k); + + +#if 0 + if( real_pc == 0xb90c2 ) + MessageBoxA(0,"debug","0",0); +#endif + + m68k.pc = real_pc; +} diff --git a/core/m68k/m68kops.h b/core/m68k/m68kops.h index 83bd911f4..1a2751a19 100644 --- a/core/m68k/m68kops.h +++ b/core/m68k/m68kops.h @@ -3973,7 +3973,7 @@ static void m68k_op_asl_8_r(void) } *r_dst &= 0xffffff00; - FLAG_X = FLAG_C = ((shift == 8 ? src & 1 : 0))<<8; + FLAG_X = FLAG_C = (((shift == 8) ? src & 1 : 0))<<8; FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = (!(src == 0))<<7; @@ -4010,7 +4010,7 @@ static void m68k_op_asl_16_r(void) } *r_dst &= 0xffff0000; - FLAG_X = FLAG_C = ((shift == 16 ? src & 1 : 0))<<8; + FLAG_X = FLAG_C = (((shift == 16) ? src & 1 : 0))<<8; FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = (!(src == 0))<<7; @@ -4047,7 +4047,7 @@ static void m68k_op_asl_32_r(void) } *r_dst = 0; - FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8; + FLAG_X = FLAG_C = (((shift == 32) ? src & 1 : 0))<<8; FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = (!(src == 0))<<7; @@ -9668,7 +9668,7 @@ static void m68k_op_lsr_32_r(void) } *r_dst = 0; - FLAG_X = FLAG_C = (shift == 32 ? GET_MSB_32(src)>>23 : 0); + FLAG_X = FLAG_C = ((shift == 32) ? GET_MSB_32(src)>>23 : 0); FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = VFLAG_CLEAR; @@ -9940,7 +9940,7 @@ static void m68k_op_lsl_32_r(void) } *r_dst = 0; - FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8; + FLAG_X = FLAG_C = (((shift == 32) ? src & 1 : 0))<<8; FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = VFLAG_CLEAR; diff --git a/core/m68k/s68kcpu.c b/core/m68k/s68kcpu.c index ef47850ed..e3375f4df 100644 --- a/core/m68k/s68kcpu.c +++ b/core/m68k/s68kcpu.c @@ -2,6 +2,8 @@ /* SUB 68K CORE */ /* ======================================================================== */ +#define DEBUG_TRACE 0 + extern int scd_68k_irq_ack(int level); #define m68ki_cpu s68k @@ -19,6 +21,10 @@ extern int scd_68k_irq_ack(int level); #include "m68kcpu.h" #include "m68kops.h" +#if DEBUG_TRACE +#include "s68kd.h" +#endif + /* ======================================================================== */ /* ================================= DATA ================================= */ /* ======================================================================== */ @@ -253,8 +259,14 @@ void s68k_run(unsigned int cycles) /* Set the address space for reads */ m68ki_use_data_space() /* auto-disable (see m68kcpu.h) */ - /* Save current instruction PC */ - s68k.prev_pc = REG_PC; + /* Save current instruction PC */ + s68k.prev_pc = REG_PC; + +#if DEBUG_TRACE + { + trace_s68k(); + } +#endif /* Decode next instruction */ REG_IR = m68ki_read_imm_16(); diff --git a/core/m68k/s68kd.h b/core/m68k/s68kd.h new file mode 100644 index 000000000..323200807 --- /dev/null +++ b/core/m68k/s68kd.h @@ -0,0 +1,1153 @@ +//#include + +static FILE *fp_trace_s68k; +static char map_s68k[0x100 * 0x10000]; + + +static char Dbg_Str[64]; +static char Dbg_EA_Str[32]; +static char Dbg_Size_Str[3]; +static char Dbg_Cond_Str[3]; + +static unsigned short (*Next_Word)(); +static unsigned int (*Next_Long)(); + +extern int trace_start; + + +static char *Make_Dbg_EA_Str(int Size, int EA_Num, int Reg_Num) +{ + int i; + Dbg_EA_Str[31] = 0; + + switch(EA_Num) + { + case 0: + // 000 rrr Dr + sprintf(Dbg_EA_Str, "D%.1d%c", Reg_Num, 0); + break; + + case 1: + // 001 rrr Ar + sprintf(Dbg_EA_Str, "A%.1d%c", Reg_Num, 0); + break; + + case 2: + // 010 rrr (Ar) + sprintf(Dbg_EA_Str, "(A%.1d)%c", Reg_Num, 0); + break; + + case 3: + // 011 rrr (Ar)+ + sprintf(Dbg_EA_Str, "(A%.1d)+%c", Reg_Num, 0); + break; + + case 4: + // 100 rrr -(Ar) + sprintf(Dbg_EA_Str, "-(A%.1d)%c", Reg_Num, 0); + break; + + case 5: + // 101 rrr d16(Ar) dddddddd dddddddd + sprintf(Dbg_EA_Str, "$%.4X(A%.1d)%c", Next_Word(), Reg_Num, 0); + break; + + case 6: + // 110 rrr d8(Ar,ix) aiiizcc0 dddddddd + i = Next_Word() & 0xFFFF; + if (i & 0x8000) + sprintf(Dbg_EA_Str, "$%.2X(A%.1d,A%.1d)%c", i & 0xFF, Reg_Num, (i >> 12) & 0x7, 0); + else + sprintf(Dbg_EA_Str, "$%.2X(A%.1d,D%.1d)%c", i & 0xFF, Reg_Num, (i >> 12) & 0x7, 0); + break; + + case 7: + switch(Reg_Num) + { + case 0: + // 111 000 addr16 dddddddd dddddddd + sprintf(Dbg_EA_Str, "($%.4X)%c", Next_Word(), 0); + break; + + case 1: + // 111 001 addr32 dddddddd dddddddd ddddddddd dddddddd + sprintf(Dbg_EA_Str, "($%.8X)%c", Next_Long(), 0); + break; + + case 2: + // 111 010 d16(PC) dddddddd dddddddd + sprintf(Dbg_EA_Str, "$%.4X(PC)%c", Next_Word(), 0); + break; + + case 3: + // 111 011 d8(PC,ix) aiiiz000 dddddddd + i = Next_Word() & 0xFFFF; + if (i & 0x8000) + sprintf(Dbg_EA_Str, "$%.2X(PC,A%.1d)%c", i & 0xFF, (i >> 12) & 0x7, 0); + else + sprintf(Dbg_EA_Str, "$%.2X(PC,D%.1d)%c", i & 0xFF, (i >> 12) & 0x7, 0); + break; + + case 4: + // 111 100 imm/implied + switch(Size) + { + case 0: + sprintf(Dbg_EA_Str, "#$%.2X%c", Next_Word() & 0xFF, 0); + break; + + case 1: + sprintf(Dbg_EA_Str, "#$%.4X%c", Next_Word(), 0); + break; + + case 2: + sprintf(Dbg_EA_Str, "#$%.8X%c", Next_Long(), 0); + break; + } + break; + } + break; + } + + return(Dbg_EA_Str); +} + + +static char *Make_Dbg_Size_Str(int Size) +{ + Dbg_Size_Str[2] = 0; + sprintf(Dbg_Size_Str, ".?"); + + switch(Size) + { + case 0: + sprintf(Dbg_Size_Str, ".B"); + break; + + case 1: + sprintf(Dbg_Size_Str, ".W"); + break; + + case 2: + sprintf(Dbg_Size_Str, ".L"); + break; + } + + return(Dbg_Size_Str); +} + + +static char *Make_Dbg_Size_Str_2(int Size) +{ + Dbg_Size_Str[2] = 0; + sprintf(Dbg_Size_Str, ".?"); + + switch(Size) + { + case 0: + sprintf(Dbg_Size_Str, ".W"); + break; + + case 1: + sprintf(Dbg_Size_Str, ".L"); + break; + } + + return(Dbg_Size_Str); +} + +static char *Make_Dbg_Cond_Str(int Cond) +{ + Dbg_Cond_Str[2] = 0; + sprintf(Dbg_Cond_Str, "??"); + + switch(Cond) + { + case 0: + sprintf(Dbg_Cond_Str, "Tr"); + break; + + case 1: + sprintf(Dbg_Cond_Str, "Fa"); + break; + + case 2: + sprintf(Dbg_Cond_Str, "HI"); + break; + + case 3: + sprintf(Dbg_Cond_Str, "LS"); + break; + + case 4: + sprintf(Dbg_Cond_Str, "CC"); + break; + + case 5: + sprintf(Dbg_Cond_Str, "CS"); + break; + + case 6: + sprintf(Dbg_Cond_Str, "NE"); + break; + + case 7: + sprintf(Dbg_Cond_Str, "EQ"); + break; + + case 8: + sprintf(Dbg_Cond_Str, "VC"); + break; + + case 9: + sprintf(Dbg_Cond_Str, "VS"); + break; + + case 10: + sprintf(Dbg_Cond_Str, "PL"); + break; + + case 11: + sprintf(Dbg_Cond_Str, "MI"); + break; + + case 12: + sprintf(Dbg_Cond_Str, "GE"); + break; + + case 13: + sprintf(Dbg_Cond_Str, "LT"); + break; + + case 14: + sprintf(Dbg_Cond_Str, "GT"); + break; + + case 15: + sprintf(Dbg_Cond_Str, "LE"); + break; + } + + return(Dbg_Cond_Str); +} + + +static char *S68KDisasm(unsigned short (*NW)(), unsigned int (*NL)(), unsigned int hook_pc ) +{ + int i; + unsigned short OPC; + static char Tmp_Str[64]; + + Dbg_Str[63] = 0; + Tmp_Str[63] = 0; + + Next_Word = NW; + Next_Long = NL; + + OPC = Next_Word(); + + sprintf(Dbg_Str, "Unknown Opcode%c", 0); + + switch(OPC >> 12) + { + case 0: + + if (OPC & 0x100) + { + if ((OPC & 0x038) == 0x8) + { + if (OPC & 0x080) + //MOVEP.z Ds,d16(Ad) + sprintf(Dbg_Str, "MOVEP%-3sD%.1d,#$%.4X(A%.1d)%c", Make_Dbg_Size_Str_2((OPC & 0x40) >> 6), (OPC & 0xE00) >> 9, Next_Word(), OPC & 0x7, 0); + else + //MOVEP.z d16(As),Dd + sprintf(Dbg_Str, "MOVEP%-3s#$%.4X(A%.1d),D%.1d%c", Make_Dbg_Size_Str_2((OPC & 0x40) >> 6), Next_Word(), OPC & 0x7, (OPC & 0xE00) >> 9, 0); + } + else + { + switch((OPC >> 6) & 0x3) + { + case 0: + //BTST Ds,a + sprintf(Dbg_Str, "BTST D%.1d,%s%c", (OPC & 0xE00) >> 9, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 7), 0); + break; + + case 1: + //BCHG Ds,a + sprintf(Dbg_Str, "BCHG D%.1d,%s%c", (OPC & 0xE00) >> 9, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 7), 0); + break; + + case 2: + //BCLR Ds,a + sprintf(Dbg_Str, "BCLR D%.1d,%s%c", (OPC & 0xE00) >> 9, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 7), 0); + break; + + case 3: + //BSET Ds,a + sprintf(Dbg_Str, "BSET D%.1d,%s%c", (OPC & 0xE00) >> 9, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 7), 0); + break; + } + } + } + else + { + switch((OPC >> 6) & 0x3F) + { + case 0: + //ORI.B #k,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "ORI.B #$%.2X,%s%c", i, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 1: + //ORI.W #k,a + i = Next_Word() & 0xFFFF; + sprintf(Dbg_Str, "ORI.W #$%.4X,%s%c", i, Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 2: + //ORI.L #k,a + i = Next_Long(); + sprintf(Dbg_Str, "ORI.L #$%.8X,%s%c", i, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 8: + //ANDI.B #k,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "ANDI.B #$%.2X,%s%c", i & 0xFF, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 9: + //ANDI.W #k,a + i = Next_Word() & 0xFFFF; + sprintf(Dbg_Str, "ANDI.W #$%.4X,%s%c", i, Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 10: + //ANDI.L #k,a + i = Next_Long(); + sprintf(Dbg_Str, "ANDI.L #$%.8X,%s%c", i, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 16: + //SUBI.B #k,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "SUBI.B #$%.2X,%s%c", i & 0xFF, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 17: + //SUBI.W #k,a + i = Next_Word() & 0xFFFF; + sprintf(Dbg_Str, "SUBI.W #$%.4X,%s%c", i, Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 18: + //SUBI.L #k,a + i = Next_Long(); + sprintf(Dbg_Str, "SUBI.L #$%.8X,%s%c", i, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 24: + //ADDI.B #k,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "ADDI.B #$%.2X,%s%c", i & 0xFF, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 25: + //ADDI.W #k,a + i = Next_Word() & 0xFFFF; + sprintf(Dbg_Str, "ADDI.W #$%.4X,%s%c", i, Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 26: + //ADDI.L #k,a + i = Next_Long(); + sprintf(Dbg_Str, "ADDI.L #$%.8X,%s%c", i, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 32: + //BTST #n,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "BTST #%d,%s%c", i, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 33: + //BCHG #n,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "BCHG #%d,%s%c", i, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 34: + //BCLR #n,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "BCLR #%d,%s%c", i, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 35: + //BSET #n,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "BSET #%d,%s%c", i, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 40: + //EORI.B #k,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "EORI.B #$%.2X,%s%c", i & 0xFF, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 41: + //EORI.W #k,a + i = Next_Word() & 0xFFFF; + sprintf(Dbg_Str, "EORI.W #$%.4X,%s%c", i, Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 42: + //EORI.L #k,a + i = Next_Long(); + sprintf(Dbg_Str, "EORI.L #$%.8X,%s%c", i, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 48: + //CMPI.B #k,a + i = Next_Word() & 0xFF; + sprintf(Dbg_Str, "CMPI.B #$%.2X,%s%c", i & 0xFF, Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 49: + //CMPI.W #k,a + i = Next_Word() & 0xFFFF; + sprintf(Dbg_Str, "CMPI.W #$%.4X,%s%c", i, Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 50: + //CMPI.L #k,a + i = Next_Long(); + sprintf(Dbg_Str, "CMPI.L #$%.8X,%s%c", i, Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + } + } + break; + + case 1: + //MOVE.b as,ad + sprintf(Tmp_Str, "%s%c", Make_Dbg_EA_Str(0, (OPC >> 3) & 0x7, OPC & 0x7), 0); + sprintf(Dbg_Str, "MOVE.b %s,%s%c", Tmp_Str, Make_Dbg_EA_Str(0, (OPC >> 6) & 0x7, (OPC >> 9) & 0x7), 0); + break; + + case 2: + //MOVE.l as,ad + sprintf(Tmp_Str, "%s%c", Make_Dbg_EA_Str(2, (OPC >> 3) & 0x7, OPC & 0x7), 0); + sprintf(Dbg_Str, "MOVE.l %s,%s%c", Tmp_Str, Make_Dbg_EA_Str(2, (OPC >> 6) & 0x7, (OPC >> 9) & 0x7), 0); + break; + + case 3: + //MOVE.w as,ad + sprintf(Tmp_Str, "%s%c", Make_Dbg_EA_Str(1, (OPC >> 3) & 0x7, OPC & 0x7), 0); + sprintf(Dbg_Str, "MOVE.w %s,%s%c", Tmp_Str, Make_Dbg_EA_Str(1, (OPC >> 6) & 0x7, (OPC >> 9) & 0x7), 0); + break; + + case 4: + //SPECIALS ... + + if (OPC & 0x100) + { + if (OPC & 0x40) + //LEA a,Ad + sprintf(Dbg_Str, "LEA %s,A%.1d%c", Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + else + //CHK.W a,Dd + sprintf(Dbg_Str, "CHK.W %s,D%.1d%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + } + else + { + switch((OPC >> 6) & 0x3F) + { + case 0: case 1: case 2: + //NEGX.z a + sprintf(Dbg_Str, "NEGX%-4s%s%c", Make_Dbg_Size_Str((OPC >> 6) & 3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 3: + //MOVE SR,a + sprintf(Dbg_Str, "MOVE SR,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 8: case 9: case 10: + //CLR.z a + sprintf(Dbg_Str, "CLR%-5s%s%c", Make_Dbg_Size_Str((OPC >> 6) & 3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 16: case 17: case 18: + //NEG.z a + sprintf(Dbg_Str, "NEG%-5s%s%c", Make_Dbg_Size_Str((OPC >> 6) & 3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 19: + //MOVE a,CCR + sprintf(Dbg_Str, "MOVE %s,CCR%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 24: case 25: case 26: + //NOT.z a + sprintf(Dbg_Str, "NOT%-5s%s%c", Make_Dbg_Size_Str((OPC >> 6) & 3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 27: + //MOVE a,SR + sprintf(Dbg_Str, "MOVE %s,SR%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 32: + //NBCD a + sprintf(Dbg_Str, "NBCD %s%c", Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 33: + + if (OPC & 0x38) + //PEA a + sprintf(Dbg_Str, "PEA %s%c", Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + else + //SWAP.w Dd + sprintf(Dbg_Str, "SWAP.w D%d%c", OPC & 0x7, 0); + + break; + + case 34: case 35: + + if (OPC & 0x38) + { + int registers_a7_d0 = Next_Word(); + + //MOVEM.z Reg-List,a + sprintf(Dbg_Str, "MOVEM%-3s{d0-a7}[%02x %02x],%s%c", Make_Dbg_Size_Str_2((OPC >> 6) & 1), + registers_a7_d0 >> 8, registers_a7_d0 & 0xff, + Make_Dbg_EA_Str((OPC >> 6) & 1 + 1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + //Next_Word(); + } + else + //EXT.z Dd + sprintf(Dbg_Str, "EXT%-5s%s%c", Make_Dbg_Size_Str_2((OPC >> 6) & 1), Make_Dbg_EA_Str((OPC >> 6) & 1 + 1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + + break; + + case 40: case 41: case 42: + //TST.z a + sprintf(Dbg_Str, "TST%-5s%s%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), Make_Dbg_EA_Str((OPC >> 6) & 0x3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 43: + //TAS.b a + sprintf(Dbg_Str, "TAS.B %s%c", Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 48: case 49: + //Bad Opcode + sprintf(Dbg_Str, "Bad Opcode%c", 0); + break; + + case 50: case 51: { + int registers_d0_a7 = Next_Word(); + + //MOVEM.z a,Reg-List + sprintf(Dbg_Str, "MOVEM%-3s%s,{a7-d0}[%02x %02x]%c", Make_Dbg_Size_Str_2((OPC >> 6) & 1), Make_Dbg_EA_Str((OPC >> 6) & 1 + 1, (OPC & 0x38) >> 3, OPC & 0x7), + registers_d0_a7 >> 8, registers_d0_a7 & 0xff, + 0); + //Next_Word(); + } break; + + case 57: + + switch((OPC >> 3) & 0x7) + { + case 0: case 1: + //TRAP #vector + sprintf(Dbg_Str, "TRAP #$%.1X%c", OPC & 0xF, 0); + break; + + case 2: + //LINK As,#k16 + sprintf(Dbg_Str, "LINK A%.1d,#$%.4X%c", OPC & 0x7, Next_Word(), 0); + break; + + case 3: + //ULNK Ad + sprintf(Dbg_Str, "ULNK A%.1d%c", OPC & 0x7, 0); + break; + + case 4: + //MOVE As,USP + sprintf(Dbg_Str, "MOVE A%.1d,USP%c",OPC & 0x7, 0); + break; + + case 5: + //MOVE USP,Ad + sprintf(Dbg_Str, "MOVE USP,A%.1d%c",OPC & 0x7, 0); + break; + + case 6: + + switch(OPC & 0x7) + { + case 0: + //RESET + sprintf(Dbg_Str, "RESET%c", 0); + break; + + case 1: + //NOP + sprintf(Dbg_Str, "NOP%c", 0); + break; + + case 2: + //STOP #k16 + sprintf(Dbg_Str, "STOP #$%.4X%c", Next_Word(), 0); + break; + + case 3: + //RTE + sprintf(Dbg_Str, "RTE%c", 0); + break; + + case 4: + //Bad Opcode + sprintf(Dbg_Str, "Bad Opcode%c", 0); + break; + + case 5: + //RTS + sprintf(Dbg_Str, "RTS%c", 0); + break; + + case 6: + //TRAPV + sprintf(Dbg_Str, "TRAPV%c", 0); + break; + + case 7: + //RTR + sprintf(Dbg_Str, "RTR%c", 0); + break; + } + break; + } + break; + + case 58: + //JSR a + sprintf(Dbg_Str, "JSR %s%c", Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 59: + //JMP a + sprintf(Dbg_Str, "JMP %s%c", Make_Dbg_EA_Str(2, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + } + } + break; + + case 5: + + if ((OPC & 0xC0) == 0xC0) + { + char offset = OPC & 0xFF; + + if ((OPC & 0x38) == 0x08) { + unsigned short word = Next_Word(); + + //DBCC Ds,label + sprintf(Dbg_Str, "DB%-6sD%.1d,#$%.4X [%02X:%04X]%c", Make_Dbg_Cond_Str((OPC >> 8) & 0xF), OPC & 0x7, word, + (hook_pc + 2) >> 16, (hook_pc + 2 + word) & 0xffff, 0); + } + else + //STCC.b a + sprintf(Dbg_Str, "ST%-6s%s [%02X:%04X]%c", Make_Dbg_Cond_Str((OPC >> 8) & 0xF), Make_Dbg_EA_Str(0, (OPC & 0x38) >> 3, OPC & 0x7), + (hook_pc + 2) >> 16, (hook_pc + 2 + offset) & 0xffff, 0); + break; + } + else + { + if (OPC & 0x100) + //SUBQ.z #k3,a + sprintf(Dbg_Str, "SUBQ%-4s#%.1d,%s%c", Make_Dbg_Size_Str((OPC >> 6) & 3), (OPC >> 9) & 0x7, Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + else + //ADDQ.z #k3,a + sprintf(Dbg_Str, "ADDQ%-4s#%.1d,%s%c", Make_Dbg_Size_Str((OPC >> 6) & 3), (OPC >> 9) & 0x7, Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + } + break; + + case 6: + + if (OPC & 0xFF) + { + int offset = (char) (OPC & 0xFF); + + if ((OPC & 0xF00) == 0x100) + { + //BSR label + sprintf(Dbg_Str, "BSR #$%.2X [%02X:%04X]%c", OPC & 0xFF, + (hook_pc + 2 + offset) >> 16, (hook_pc + 2 + offset) & 0xffff, 0); + break; + } + + if (!(OPC & 0xF00)) + { + //BRA label + sprintf(Dbg_Str, "BRA #$%.2X [%02X:%04X]%c", OPC & 0xFF, + (hook_pc + 2 + offset) >> 16, (hook_pc + 2 + offset) & 0xffff, 0); + break; + } + + //BCC label + sprintf(Dbg_Str, "B%-7s#$%.2X [%02X:%04X]%c", + Make_Dbg_Cond_Str((OPC >> 8) & 0xF), OPC & 0xFF, + (hook_pc + 2 + offset) >> 16, (hook_pc + 2 + offset) & 0xffff, 0); + } + else + { + int offset = (short)(Next_Word()); + + if ((OPC & 0xF00) == 0x100) + { + //BSR label + sprintf(Dbg_Str, "BSR #$%.4X [%02X:%04X]%c", offset, + (hook_pc + 2 + offset) >> 16, (hook_pc + 2 + offset) & 0xffff, 0); + break; + } + + if (!(OPC & 0xF00)) + { + //BRA label + sprintf(Dbg_Str, "BRA #$%.4X [%02X:%04X]%c", offset, + (hook_pc + 2 + offset) >> 16, (hook_pc + 2 + offset) & 0xffff, 0); + break; + } + + //BCC label + sprintf(Dbg_Str, "B%-7s#$%.4X [%02X:%04X]%c", + Make_Dbg_Cond_Str((OPC >> 8 ) & 0xF), offset, + (hook_pc + 2 + offset) >> 16, (hook_pc + 2 + offset) & 0xffff, 0); + } + break; + + case 7: + //MOVEQ #k8,Dd + sprintf(Dbg_Str, "MOVEQ #$%.2X,D%.1d%c", OPC & 0xFF, (OPC >> 9) & 0x7, 0); + break; + + case 8: + + if (OPC & 0x100) + { + if (!(OPC & 0xF8)) + { + //SBCD Ds,Dd + sprintf(Dbg_Str, "SBCD D%.1d,D%.1d%c", OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + if ((OPC & 0xF8) == 0x8) + { + //SBCD -(As),-(Ad) + sprintf(Dbg_Str, "SBCD -(A%.1d),-(A%.1d)%c", OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + if ((OPC & 0xC0) == 0xC0) + //DIVS.w a,Dd + sprintf(Dbg_Str, "DIVS.W %s,D%.1d%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + else + //OR.z Ds,a + sprintf(Dbg_Str, "OR%-6sD%.1d;%s%c", Make_Dbg_Size_Str((OPC >> 6) & 3), (OPC >> 9) & 0x7, Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + } + else + { + if ((OPC & 0xC0) == 0xC0) + //DIVU.w a,Dd + sprintf(Dbg_Str, "DIVU.W %s,D%.1d%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + else + //OR.z a,Dd + sprintf(Dbg_Str, "OR%-6s%s,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + } + break; + + case 9: + + if ((OPC & 0xC0) == 0xC0) + //SUBA.z a,Ad + sprintf(Dbg_Str, "SUBA%-4s%s,A%.1d%c", Make_Dbg_Size_Str_2((OPC >> 8) & 1), Make_Dbg_EA_Str((OPC >> 8) & 1 + 1, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + else + { + if (OPC & 0x100) + { + if (!(OPC & 0x38)) + { + //SUBX.z Ds,Dd + sprintf(Dbg_Str, "SUBX%-4sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + if ((OPC & 0x38) == 0x8) + { + //SUBX.z -(As),-(Ad) + sprintf(Dbg_Str, "SUBX%-4s-(A%.1d),-(A%.1d)%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + //SUB.z Ds,a + sprintf(Dbg_Str, "SUB%-5sD%.1d,%s%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + } + else + //SUB.z a,Dd + sprintf(Dbg_Str, "SUB%-5s%s,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + } + break; + + case 10: + //Bad Opcode + sprintf(Dbg_Str, "Bad Opcode%c", 0); + break; + + case 11: + + if ((OPC & 0xC0) == 0xC0) + //CMPA.z a,Ad + sprintf(Dbg_Str, "CMPA%-4s%s,A%.1d%c", Make_Dbg_Size_Str_2((OPC >> 8) & 1), Make_Dbg_EA_Str((OPC >> 7) & 1 + 1, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + else + { + if (OPC & 0x100) + { + if ((OPC & 0x38) == 0x8) + { + //CMPM.z (As)+,(Ad)+ + sprintf(Dbg_Str, "CMPM%-4s(A%.1d)+,(A%.1d)+%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + //EOR.z Ds,a + sprintf(Dbg_Str, "EOR%-5sD%.1d,%s%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + } + else + //CMP.z a,Dd + sprintf(Dbg_Str, "CMP%-5s%s,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + } + break; + + case 12: + + if ((OPC & 0X1F8) == 0x100) + { + //ABCD Ds,Dd + sprintf(Dbg_Str, "ABCD D%.1d,D%.1d%c", OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + if ((OPC & 0X1F8) == 0x140) + { + //EXG.l Ds,Dd + sprintf(Dbg_Str, "EXG.L D%.1d,D%.1d%c", OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + if ((OPC & 0X1F8) == 0x108) + { + //ABCD -(As),-(Ad) + sprintf(Dbg_Str, "ABCD -(A%.1d),-(A%.1d)%c", OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + if ((OPC & 0X1F8) == 0x148) + { + //EXG.l As,Ad + sprintf(Dbg_Str, "EXG.L A%.1d,A%.1d%c", OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + if ((OPC & 0X1F8) == 0x188) + { + //EXG.l As,Dd + sprintf(Dbg_Str, "EXG.L A%.1d,D%.1d%c", OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + switch((OPC >> 6) & 0x7) + { + case 0: case 1: case 2: + //AND.z a,Dd + sprintf(Dbg_Str, "AND%-5s%s,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + break; + + case 3: + //MULU.w a,Dd + sprintf(Dbg_Str, "MULU.W %s,D%.1d%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + break; + + case 4: case 5: case 6: + //AND.z Ds,a + sprintf(Dbg_Str, "AND%-5sD%.1d,%s%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 7: + //MULS.w a,Dd + sprintf(Dbg_Str, "MULS.W %s,D%.1d%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + break; + } + break; + + case 13: + + if ((OPC & 0xC0) == 0xC0) + //ADDA.z a,Ad + sprintf(Dbg_Str, "ADDA%-4s%s,A%.1d%c", Make_Dbg_Size_Str_2((OPC >> 8) & 1), Make_Dbg_EA_Str((OPC >> 8) & 1 + 1, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + else + { + if (OPC & 0x100) + { + if (!(OPC & 0x38)) + { + //ADDX.z Ds,Dd + sprintf(Dbg_Str, "ADDX%-4sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + if ((OPC & 0x38) == 0x8) + { + //ADDX.z -(As),-(Ad) + sprintf(Dbg_Str, "ADDX%-4s-(A%.1d),-(A%.1d)%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), OPC & 0x7, (OPC >> 9) & 0x7, 0); + break; + } + + //ADD.z Ds,a + sprintf(Dbg_Str, "ADD%-5sD%.1d,%s%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), 0); + } + else + //ADD.z a,Dd + sprintf(Dbg_Str, "ADD%-5s%s,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), Make_Dbg_EA_Str((OPC >> 6) & 3, (OPC & 0x38) >> 3, OPC & 0x7), (OPC >> 9) & 0x7, 0); + } + break; + + case 14: + + if ((OPC & 0xC0) == 0xC0) + { + switch ((OPC >> 8) & 0x7) + { + case 0: + //ASR.w #1,a + sprintf(Dbg_Str, "ASR.W #1,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 1: + //ASL.w #1,a + sprintf(Dbg_Str, "ASL.W #1,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 2: + //LSR.w #1,a + sprintf(Dbg_Str, "LSR.W #1,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 3: + //LSL.w #1,a + sprintf(Dbg_Str, "LSL.W #1,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 4: + //ROXR.w #1,a + sprintf(Dbg_Str, "ROXR.W #1,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 5: + //ROXL.w #1,a + sprintf(Dbg_Str, "ROXL.W #1,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 6: + //ROR.w #1,a + sprintf(Dbg_Str, "ROR.W #1,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + case 7: + //ROL.w #1,a + sprintf(Dbg_Str, "ROL.W #1,%s%c", Make_Dbg_EA_Str(1, (OPC & 0x38) >> 3, OPC & 0x7), 0); + break; + + } + } + else + { + switch ((OPC >> 3) & 0x3F) + { + case 0: case 8: case 16: + //ASR.z #k,Dd + sprintf(Dbg_Str, "ASR%-5s#%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 1: case 9: case 17: + //LSR.z #k,Dd + sprintf(Dbg_Str, "LSR%-5s#%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 2: case 10: case 18: + //ROXR.z #k,Dd + sprintf(Dbg_Str, "ROXR%-4s#%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 3: case 11: case 19: + //ROR.z #k,Dd + sprintf(Dbg_Str, "ROR%-5s#%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 4: case 12: case 20: + //ASR.z Ds,Dd + sprintf(Dbg_Str, "ASR%-5sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 5: case 13: case 21: + //LSR.z Ds,Dd + sprintf(Dbg_Str, "LSR%-5sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 6: case 14: case 22: + //ROXR.z Ds,Dd + sprintf(Dbg_Str, "ROXR%-4sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 7: case 15: case 23: + //ROR.z Ds,Dd + sprintf(Dbg_Str, "ROR%-5sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 32: case 40: case 48: + //ASL.z #k,Dd + sprintf(Dbg_Str, "ASL%-5s#%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 33: case 41: case 49: + //LSL.z #k,Dd + sprintf(Dbg_Str, "LSL%-5s#%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 34: case 42: case 50: + //ROXL.z #k,Dd + sprintf(Dbg_Str, "ROXL%-4s#%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 35: case 43: case 51: + //ROL.z #k,Dd + sprintf(Dbg_Str, "ROL%-5s#%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 36: case 44: case 52: + //ASL.z Ds,Dd + sprintf(Dbg_Str, "ASL%-5sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 37: case 45: case 53: + //LSL.z Ds,Dd + sprintf(Dbg_Str, "LSL%-5sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 38: case 46: case 54: + //ROXL.z Ds,Dd + sprintf(Dbg_Str, "ROXL%-4sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + case 39: case 47: case 55: + //ROL.z Ds,Dd + sprintf(Dbg_Str, "ROL%-5sD%.1d,D%.1d%c", Make_Dbg_Size_Str((OPC >> 6) & 0x3), (OPC >> 9) & 0x7, OPC & 0x7, 0); + break; + + } + } + break; + + case 15: + //Bad Opcode + sprintf(Dbg_Str, "Bad Opcode%c", 0); + break; + } + + return(Dbg_Str); +} + + +static unsigned short Next_Word_T(void) +{ + return m68ki_read_imm_16(); +} + +static unsigned int Next_Long_T(void) +{ + return m68ki_read_imm_32(); +} + +static void trace_s68k() +{ + static char String [512]; + int real_pc = s68k.pc; + + + return; + if( trace_start == 0 ) return; + + + if( map_s68k[s68k.pc] ) return; + if( s68k.pc == 0x1F00 ) return; // paprium diasm crash + //if( s68k.pc >= 0xFF0000 ) return; + //if( s68k.pc < 0x10000 ) return; + map_s68k[s68k.pc] = 1; + + + if( !fp_trace_s68k ) { + fp_trace_s68k = fopen("trace-s68k.txt", "w"); + } + + + sprintf( String, "%02X:%04X", s68k.pc >> 16, s68k.pc & 0xffff ); + fprintf( fp_trace_s68k, "%s", String ); + + + sprintf( String, " %04X %04X ", m68k_read_immediate_16(s68k.pc), m68k_read_immediate_16(s68k.pc+2) ); + fprintf( fp_trace_s68k, "%s", String ); + + + sprintf( String, "%-33s", S68KDisasm( Next_Word_T, Next_Long_T, s68k.pc ) ); + fprintf( fp_trace_s68k, "%s", String ); + + + sprintf( String, "A0=%.8X A1=%.8X A2=%.8X ", s68k.dar[8], s68k.dar[9], s68k.dar[10]); + fprintf( fp_trace_s68k, "%s", String ); + + sprintf( String, "A3=%.8X A4=%.8X A5=%.8X ", s68k.dar[11], s68k.dar[12], s68k.dar[13]); + fprintf( fp_trace_s68k, "%s", String ); + + sprintf( String, "A6=%.8X A7=%.8X", s68k.dar[14], s68k.dar[15]); + fprintf( fp_trace_s68k, "%s", String ); + + sprintf( String, " " ); + fprintf( fp_trace_s68k, "%s", String ); + + sprintf( String, "D0=%.8X D1=%.8X D2=%.8X ", s68k.dar[0], s68k.dar[1], s68k.dar[2]); + fprintf( fp_trace_s68k, "%s", String ); + + sprintf( String, "D3=%.8X D4=%.8X D5=%.8X ", s68k.dar[3], s68k.dar[4], s68k.dar[5]); + fprintf( fp_trace_s68k, "%s", String ); + + sprintf( String, "D6=%.8X D7=%.8X", s68k.dar[6], s68k.dar[7]); + fprintf( fp_trace_s68k, "%s", String ); + + fprintf( fp_trace_s68k, " "); + fprintf( fp_trace_s68k, "%c", (s68k.ir & 0x10)?'X':'x' ); + fprintf( fp_trace_s68k, "%c", (s68k.ir & 0x08)?'N':'n' ); + fprintf( fp_trace_s68k, "%c", (s68k.ir & 0x04)?'Z':'z' ); + fprintf( fp_trace_s68k, "%c", (s68k.ir & 0x02)?'V':'v' ); + fprintf( fp_trace_s68k, "%c", (s68k.ir & 0x01)?'C':'c' ); + + fprintf( fp_trace_s68k, "\n" ); + fflush(fp_trace_s68k); + + + s68k.pc = real_pc; +} diff --git a/core/memz80.c b/core/memz80.c index 75e1a20e4..0ea91f599 100644 --- a/core/memz80.c +++ b/core/memz80.c @@ -152,6 +152,14 @@ unsigned char z80_memory_r(unsigned int address) /* read from 68k banked area */ address = zbank | (address & 0x7FFF); + + if(0) + { + static FILE *fp = 0; + if(!fp) fp = fopen("trace-z80-mem.txt", "w"); + fprintf(fp, "%X - %X %X - %X %X %X %X\n", address, Z80.pc.w.l, zbank, Z80.af.b.h, Z80.bc.w.l, Z80.de.w.l, Z80.hl.w.l); + } + if (zbank_memory_map[address >> 16].read) { return (*zbank_memory_map[address >> 16].read)(address); @@ -164,6 +172,16 @@ unsigned char z80_memory_r(unsigned int address) void z80_memory_w(unsigned int address, unsigned char data) { +#if 0 + static char error_str[512]; + sprintf(error_str, "[%d] Z80 %04X = %X\n", + v_counter, + address, data + ); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + switch((address >> 13) & 7) { case 0: /* $0000-$3FFF: Z80 RAM (8K mirrored) */ @@ -175,6 +193,26 @@ void z80_memory_w(unsigned int address, unsigned char data) case 2: /* $4000-$5FFF: YM2612 */ { +#if 0 +if( address == 0x4000 && data != 0x2A && data != 0x2B && data != 0xB6 ) { + static char error_str[512]; + sprintf(error_str, "[%d] Z80 %04X = %X\n", + v_counter, + address, data + ); + log_cb(RETRO_LOG_ERROR, error_str); +} + +if( address == 0x4002 && data != 0x2A && data != 0x2B && data != 0xB6 ) { + static char error_str[512]; + sprintf(error_str, "[%d] Z80 %04X = %X\n", + v_counter, + address, data + ); + log_cb(RETRO_LOG_ERROR, error_str); +} +#endif + fm_write(Z80.cycles, address & 3, data); return; } diff --git a/core/sound/blip_buf.c b/core/sound/blip_buf.c index 1a47157d8..f231bbb09 100644 --- a/core/sound/blip_buf.c +++ b/core/sound/blip_buf.c @@ -27,62 +27,41 @@ details. You should have received a copy of the GNU Lesser General Public License along with this module; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - -#if defined (BLARGG_TEST) && BLARGG_TEST - #include "blargg_test.h" +#ifdef _WIN32 +#define DEBUG_BLIP #endif -/* Equivalent to ULONG_MAX >= 0xFFFFFFFF00000000. -Avoids constants that don't fit in 32 bits. */ -#if ULONG_MAX/0xFFFFFFFF > 0xFFFFFFFF - typedef unsigned long fixed_t; - enum { pre_shift = 32 }; +#ifdef DEBUG_BLIP +#include +#include -#elif defined(ULLONG_MAX) - typedef unsigned long long fixed_t; - enum { pre_shift = 32 }; - -#else - typedef unsigned fixed_t; - enum { pre_shift = 0 }; +void debug_me(char *msg, int x) +{ + while(GetModuleHandle(NULL)) { + if( GetProcAddress(NULL, msg) ) Sleep(1); + Sleep (1); + } +} +#endif +#if defined (BLARGG_TEST) && BLARGG_TEST + #include "blargg_test.h" #endif -enum { time_bits = pre_shift + 20 }; +//#define BLIP_MONO -static fixed_t const time_unit = (fixed_t) 1 << time_bits; +/* +YM2612 = 7.67 Mhz NTSC +Z80 = 3.579545 MHz +Crystal = 53.693175 = 15 x 3.57954 MHz NTSC -enum { bass_shift = 9 }; /* affects high-pass filter breakpoint frequency */ -enum { end_frame_extra = 2 }; /* allows deltas slightly after frame length */ - -enum { half_width = 8 }; -enum { buf_extra = half_width*2 + end_frame_extra }; -enum { phase_bits = 5 }; -enum { phase_count = 1 << phase_bits }; -enum { delta_bits = 15 }; -enum { delta_unit = 1 << delta_bits }; -enum { frac_bits = time_bits - pre_shift }; -enum { phase_shift = frac_bits - phase_bits }; - -/* We could eliminate avail and encode whole samples in offset, but that would -limit the total buffered samples to blip_max_frame. That could only be -increased by decreasing time_bits, which would reduce resample ratio accuracy. +53693175 clock @ 50 == 1073863.5 [2^20.034] +32552 pcm +44100 cdda */ -typedef int buf_t; - -struct blip_t -{ - fixed_t factor; - fixed_t offset; - int size; -#ifdef BLIP_MONO - int integrator; -#else - int integrator[2]; - buf_t* buffer[2]; -#endif -}; +enum { time_bits = 64-22 }; /* 22.42 -- 768000 * 2^42 = 2EE0 0000 0000 0000*/ +static fixed_t const time_unit = (fixed_t) 1 << time_bits; #define BLIP_BUFFER_STATE_BUFFER_SIZE 16 @@ -90,10 +69,10 @@ struct blip_buffer_state_t { fixed_t offset; #ifdef BLIP_MONO - int integrator; + buf_t integrator; buf_t buffer[BLIP_BUFFER_STATE_BUFFER_SIZE]; #else - int integrator[2]; + buf_t integrator[2]; buf_t buffer[2][BLIP_BUFFER_STATE_BUFFER_SIZE]; #endif }; @@ -111,16 +90,18 @@ enum { max_sample = +32767 }; enum { min_sample = -32768 }; #define CLAMP( n ) \ - {\ - if ( n > max_sample ) n = max_sample;\ - else if ( n < min_sample) n = min_sample;\ - } +{\ + if ( n > max_sample ) n = max_sample;\ + else if ( n < min_sample) n = min_sample;\ +} + +#include "blip_lpf.h" #ifdef BLIP_ASSERT static void check_assumptions( void ) { int n; - + #if INT_MAX < 0x7FFFFFFF || UINT_MAX < 0xFFFFFFFF #error "int must be at least 32 bits" #endif @@ -146,31 +127,38 @@ blip_t* blip_new( int size ) #ifdef BLIP_ASSERT assert( size >= 0 ); #endif - -#ifdef BLIP_MONO - m = (blip_t*) malloc( sizeof *m + (size + buf_extra) * sizeof (buf_t) ); -#else + m = (blip_t*) malloc( sizeof *m ); + +#ifdef DEBUG_BLIP + printf("[blip_new] %d\n", size); fflush(stdout); #endif if ( m ) { -#ifndef BLIP_MONO - m->buffer[0] = (buf_t*) malloc( (size + buf_extra) * sizeof (buf_t)); - m->buffer[1] = (buf_t*) malloc( (size + buf_extra) * sizeof (buf_t)); - if ((m->buffer[0] == NULL) || (m->buffer[1] == NULL)) - { - blip_delete(m); - return 0; - } -#endif - m->factor = time_unit / blip_max_ratio; +#ifdef BLIP_MONO + m->buffer = (buf_t*) malloc( size * sizeof (buf_t)); + if (m->buffer == NULL) + { + blip_delete(m); + return 0; + } +#else + m->buffer[0] = (buf_t*) malloc( size * sizeof (buf_t)); + m->buffer[1] = (buf_t*) malloc( size * sizeof (buf_t)); + if ((m->buffer[0] == NULL) || (m->buffer[1] == NULL)) + { + blip_delete(m); + return 0; + } +#endif + m->factor = time_unit; m->size = size; blip_clear( m ); #ifdef BLIP_ASSERT check_assumptions(); #endif - } + } return m; } @@ -178,13 +166,16 @@ void blip_delete( blip_t* m ) { if ( m != NULL ) { -#ifndef BLIP_MONO - if (m->buffer[0] != NULL) - free(m->buffer[0]); - if (m->buffer[1] != NULL) - free(m->buffer[1]); +#ifdef BLIP_MONO + if (m->buffer != NULL) + free(m->buffer); +#else + if (m->buffer[0] != NULL) + free(m->buffer[0]); + if (m->buffer[1] != NULL) + free(m->buffer[1]); #endif - /* Clear fields in case user tries to use after freeing */ + /* Clear fields in case user tries to use after freeing */ memset( m, 0, sizeof *m ); free( m ); } @@ -192,40 +183,32 @@ void blip_delete( blip_t* m ) void blip_set_rates( blip_t* m, double clock_rate, double sample_rate ) { - double factor = time_unit * sample_rate / clock_rate; - m->factor = (fixed_t) factor; - + m->factor = (fixed_t) ((double) time_unit * sample_rate / clock_rate); + + m->clock_rate = (int) clock_rate; + m->sample_rate = (int) sample_rate; + +#ifdef DEBUG_BLIP + printf("[blip_set_rates] %d %d %lld\n", (int) clock_rate, (int) sample_rate, m->factor); fflush(stdout); +#endif + #ifdef BLIP_ASSERT /* Fails if clock_rate exceeds maximum, relative to sample_rate */ assert( 0 <= factor - m->factor && factor - m->factor < 1 ); #endif - -/* Avoid requiring math.h. Equivalent to - m->factor = (int) ceil( factor ) */ - if ( m->factor < factor ) - m->factor++; - - /* At this point, factor is most likely rounded up, but could still - have been rounded down in the floating-point calculation. */ } void blip_clear( blip_t* m ) { - /* We could set offset to 0, factor/2, or factor-1. 0 is suitable if - factor is rounded up. factor-1 is suitable if factor is rounded down. - Since we don't know rounding direction, factor/2 accommodates either, - with the slight loss of showing an error in half the time. Since for - a 64-bit factor this is years, the halving isn't a problem. */ - - m->offset = m->factor / 2; + m->offset = 0; #ifdef BLIP_MONO m->integrator = 0; - memset( SAMPLES( m ), 0, (m->size + buf_extra) * sizeof (buf_t) ); + memset( m->buffer, 0, m->size * sizeof (buf_t) ); #else m->integrator[0] = 0; m->integrator[1] = 0; - memset( m->buffer[0], 0, (m->size + buf_extra) * sizeof (buf_t) ); - memset( m->buffer[1], 0, (m->size + buf_extra) * sizeof (buf_t) ); + memset( m->buffer[0], 0, m->size * sizeof (buf_t) ); + memset( m->buffer[1], 0, m->size * sizeof (buf_t) ); #endif } @@ -238,7 +221,12 @@ int blip_clocks_needed( const blip_t* m, int samples ) assert( (samples >= 0) && (((m->offset >> time_bits) + samples) <= m->size) ); #endif - needed = (fixed_t) samples * time_unit; + needed = (fixed_t) samples * time_unit; + +#ifdef DEBUG_BLIP + printf("[blip_clocks_needed] %d %lld %lld\n", samples, time_unit, needed); fflush(stdout); +#endif + if ( needed < m->offset ) return 0; @@ -247,11 +235,19 @@ int blip_clocks_needed( const blip_t* m, int samples ) void blip_end_frame( blip_t* m, unsigned t ) { - m->offset += t * m->factor; +#ifdef DEBUG_BLIP + //printf("[blip_end_frame] %lld %d %lld\n", m->offset, t, m->factor); fflush(stdout); +#endif + + m->offset += (fixed_t) t * m->factor; + +#ifdef DEBUG_BLIP + //printf("[blip_end_frame] %lld %d %lld\n", m->offset, t, m->factor); fflush(stdout); +#endif #ifdef BLIP_ASSERT /* Fails if buffer size was exceeded */ - assert( (m->offset >> time_bits) <= m->size ); + assert( (m->offset >> time_bits) <= m->size ); #endif } @@ -263,12 +259,21 @@ int blip_samples_avail( const blip_t* m ) static void remove_samples( blip_t* m, int count ) { #ifdef BLIP_MONO - buf_t* buf = SAMPLES( m ); + buf_t* buf = m->buffer; #else buf_t* buf = m->buffer[0]; #endif - int remain = (m->offset >> time_bits) + buf_extra - count; - m->offset -= count * time_unit; + + int lpf_taps = blip_lpf_taps(m->sample_rate); + + int remain = (m->offset >> time_bits) - count; + if( lpf_taps > remain ) remain = lpf_taps; + + m->offset -= count * time_unit; + +#ifdef DEBUG_BLIP + printf("[blip_remove_samples] %d %d %d %lld\n", remain, lpf_taps, count, m->offset); fflush(stdout); +#endif memmove( &buf [0], &buf [count], remain * sizeof (buf_t) ); memset( &buf [remain], 0, count * sizeof (buf_t) ); @@ -281,37 +286,47 @@ static void remove_samples( blip_t* m, int count ) int blip_discard_samples_dirty(blip_t* m, int count) { +#ifdef BLIP_ASSERT if (count > (m->offset >> time_bits)) count = m->offset >> time_bits; +#endif m->offset -= count * time_unit; } int blip_read_samples( blip_t* m, short out [], int count) { +#ifdef DEBUG_BLIP + printf("[blip_read_samples] %d\n", count); fflush(stdout); + //debug_me("blip_read_samples", count); +#endif + #ifdef BLIP_ASSERT assert( count >= 0 ); +#endif - if ( count > (m->offset >> time_bits) ) - count = m->offset >> time_bits; + if ( count > blip_samples_avail(m) ) + count = blip_samples_avail(m); if ( count ) -#endif - { + { #ifdef BLIP_MONO - buf_t const* in = SAMPLES( m ); - int sum = m->integrator; + buf_t const* in = m->buffer; + buf_t sum = m->integrator; #else buf_t const* in = m->buffer[0]; buf_t const* in2 = m->buffer[1]; - int sum = m->integrator[0]; - int sum2 = m->integrator[1]; + buf_t sum = m->integrator[0]; + buf_t sum2 = m->integrator[1]; #endif buf_t const* end = in + count; do { /* Eliminate fraction */ - int s = ARITH_SHIFT( sum, delta_bits ); + buf_t s = ARITH_SHIFT( sum, lpf_frac ); +#ifdef DEBUG_BLIP + //printf("%d %d\n", sum, s); fflush(stdout); +#endif sum += *in++; @@ -319,21 +334,15 @@ int blip_read_samples( blip_t* m, short out [], int count) *out++ = s; - /* High-pass filter */ - sum -= s << (delta_bits - bass_shift); - #ifndef BLIP_MONO /* Eliminate fraction */ - s = ARITH_SHIFT( sum2, delta_bits ); + s = ARITH_SHIFT( sum2, lpf_frac ); sum2 += *in2++; CLAMP( s ); *out++ = s; - - /* High-pass filter */ - sum2 -= s << (delta_bits - bass_shift); #endif } while ( in != end ); @@ -350,87 +359,170 @@ int blip_read_samples( blip_t* m, short out [], int count) return count; } -int blip_mix_samples( blip_t* m1, blip_t* m2, blip_t* m3, short out [], int count) +int blip_mix_samples_2( blip_t* m1, blip_t* m2, short out [], int count) { #ifdef BLIP_ASSERT - assert( count >= 0 ); + assert( count >= 0 ); +#endif + +#ifdef DEBUG_BLIP + printf("[blip_mix_samples] %d\n", count); fflush(stdout); + //debug_me("blip_mix_samples", count); +#endif - if ( count > (m1->offset >> time_bits) ) - count = m1->offset >> time_bits; - if ( count > (m2->offset >> time_bits) ) - count = m2->offset >> time_bits; - if ( count > (m3->offset >> time_bits) ) - count = m3->offset >> time_bits; + if ( count > blip_samples_avail(m1) ) + count = blip_samples_avail(m1); + if ( count > blip_samples_avail(m2) ) + count = blip_samples_avail(m2); - if ( count ) +#ifdef DEBUG_BLIP + printf("[blip_mix_samples] %d\n", count); fflush(stdout); + //debug_me("blip_mix_samples", count); #endif - { - buf_t const* end; - buf_t const* in[3]; + + if ( count ) + { + buf_t const* end; + buf_t const* in[2]; #ifdef BLIP_MONO - int sum = m1->integrator; - in[0] = SAMPLES( m1 ); - in[1] = SAMPLES( m2 ); - in[2] = SAMPLES( m3 ); + buf_t sum = m1->integrator; + in[0] = m1->buffer; + in[1] = m2->buffer; #else - int sum = m1->integrator[0]; - int sum2 = m1->integrator[1]; - buf_t const* in2[3]; - in[0] = m1->buffer[0]; - in[1] = m2->buffer[0]; - in[2] = m3->buffer[0]; - in2[0] = m1->buffer[1]; - in2[1] = m2->buffer[1]; - in2[2] = m3->buffer[1]; + buf_t sum = m1->integrator[0]; + buf_t sum2 = m1->integrator[1]; + buf_t const* in2[2]; + in[0] = m1->buffer[0]; + in[1] = m2->buffer[0]; + in2[0] = m1->buffer[1]; + in2[1] = m2->buffer[1]; #endif - end = in[0] + count; - do - { - /* Eliminate fraction */ - int s = ARITH_SHIFT( sum, delta_bits ); - - sum += *in[0]++; - sum += *in[1]++; - sum += *in[2]++; + end = in[0] + count; + do + { + /* Eliminate fraction */ + buf_t s = ARITH_SHIFT( sum, lpf_frac ); - CLAMP( s ); + sum += *in[0]++; + sum += *in[1]++; - *out++ = s; + CLAMP( s ); - /* High-pass filter */ - sum -= s << (delta_bits - bass_shift); + *out++ = s; #ifndef BLIP_MONO - /* Eliminate fraction */ - s = ARITH_SHIFT( sum2, delta_bits ); + /* Eliminate fraction */ + s = ARITH_SHIFT( sum2, lpf_frac ); + + sum2 += *in2[0]++; + sum2 += *in2[1]++; + + CLAMP( s ); - sum2 += *in2[0]++; - sum2 += *in2[1]++; - sum2 += *in2[2]++; + *out++ = s; +#endif + } + while ( in[0] != end ); + +#ifdef BLIP_MONO + m1->integrator = sum; +#else + m1->integrator[0] = sum; + m1->integrator[1] = sum2; +#endif + remove_samples( m1, count ); + remove_samples( m2, count ); + } + + return count; +} + +int blip_mix_samples( blip_t* m1, blip_t* m2, blip_t* m3, short out [], int count) +{ +#ifdef BLIP_ASSERT + assert( count >= 0 ); +#endif - CLAMP( s ); +#ifdef DEBUG_BLIP + printf("[blip_mix_samples] %d\n", count); fflush(stdout); + //debug_me("blip_mix_samples", count); +#endif - *out++ = s; + if ( count > blip_samples_avail(m1) ) + count = blip_samples_avail(m1); + if ( count > blip_samples_avail(m2) ) + count = blip_samples_avail(m2); + if ( count > blip_samples_avail(m3) ) + count = blip_samples_avail(m3); - /* High-pass filter */ - sum2 -= s << (delta_bits - bass_shift); +#ifdef DEBUG_BLIP + printf("[blip_mix_samples] %d\n", count); fflush(stdout); + //debug_me("blip_mix_samples", count); #endif - } - while ( in[0] != end ); + if ( count ) + { + buf_t const* end; + buf_t const* in[3]; #ifdef BLIP_MONO - m1->integrator = sum; + buf_t sum = m1->integrator; + in[0] = m1->buffer; + in[1] = m2->buffer; + in[2] = m3->buffer; #else - m1->integrator[0] = sum; - m1->integrator[1] = sum2; + buf_t sum = m1->integrator[0]; + buf_t sum2 = m1->integrator[1]; + buf_t const* in2[3]; + in[0] = m1->buffer[0]; + in[1] = m2->buffer[0]; + in[2] = m3->buffer[0]; + in2[0] = m1->buffer[1]; + in2[1] = m2->buffer[1]; + in2[2] = m3->buffer[1]; +#endif + + end = in[0] + count; + do + { + /* Eliminate fraction */ + buf_t s = ARITH_SHIFT( sum, lpf_frac ); + + sum += *in[0]++; + sum += *in[1]++; + sum += *in[2]++; + + CLAMP( s ); + + *out++ = s; + +#ifndef BLIP_MONO + /* Eliminate fraction */ + s = ARITH_SHIFT( sum2, lpf_frac ); + + sum2 += *in2[0]++; + sum2 += *in2[1]++; + sum2 += *in2[2]++; + + CLAMP( s ); + + *out++ = s; #endif - remove_samples( m1, count ); - remove_samples( m2, count ); - remove_samples( m3, count ); - } + } + while ( in[0] != end ); + +#ifdef BLIP_MONO + m1->integrator = sum; +#else + m1->integrator[0] = sum; + m1->integrator[1] = sum2; +#endif + remove_samples( m1, count ); + remove_samples( m2, count ); + remove_samples( m3, count ); + } - return count; + return count; } /* Things that didn't help performance on x86: @@ -439,271 +531,71 @@ int blip_mix_samples( blip_t* m1, blip_t* m2, blip_t* m3, short out [], int coun restrict */ -/* Sinc_Generator( 0.9, 0.55, 4.5 ) */ -static short const bl_step [phase_count + 1] [half_width] = -{ -{ 43, -115, 350, -488, 1136, -914, 5861,21022}, -{ 44, -118, 348, -473, 1076, -799, 5274,21001}, -{ 45, -121, 344, -454, 1011, -677, 4706,20936}, -{ 46, -122, 336, -431, 942, -549, 4156,20829}, -{ 47, -123, 327, -404, 868, -418, 3629,20679}, -{ 47, -122, 316, -375, 792, -285, 3124,20488}, -{ 47, -120, 303, -344, 714, -151, 2644,20256}, -{ 46, -117, 289, -310, 634, -17, 2188,19985}, -{ 46, -114, 273, -275, 553, 117, 1758,19675}, -{ 44, -108, 255, -237, 471, 247, 1356,19327}, -{ 43, -103, 237, -199, 390, 373, 981,18944}, -{ 42, -98, 218, -160, 310, 495, 633,18527}, -{ 40, -91, 198, -121, 231, 611, 314,18078}, -{ 38, -84, 178, -81, 153, 722, 22,17599}, -{ 36, -76, 157, -43, 80, 824, -241,17092}, -{ 34, -68, 135, -3, 8, 919, -476,16558}, -{ 32, -61, 115, 34, -60, 1006, -683,16001}, -{ 29, -52, 94, 70, -123, 1083, -862,15422}, -{ 27, -44, 73, 106, -184, 1152,-1015,14824}, -{ 25, -36, 53, 139, -239, 1211,-1142,14210}, -{ 22, -27, 34, 170, -290, 1261,-1244,13582}, -{ 20, -20, 16, 199, -335, 1301,-1322,12942}, -{ 18, -12, -3, 226, -375, 1331,-1376,12293}, -{ 15, -4, -19, 250, -410, 1351,-1408,11638}, -{ 13, 3, -35, 272, -439, 1361,-1419,10979}, -{ 11, 9, -49, 292, -464, 1362,-1410,10319}, -{ 9, 16, -63, 309, -483, 1354,-1383, 9660}, -{ 7, 22, -75, 322, -496, 1337,-1339, 9005}, -{ 6, 26, -85, 333, -504, 1312,-1280, 8355}, -{ 4, 31, -94, 341, -507, 1278,-1205, 7713}, -{ 3, 35, -102, 347, -506, 1238,-1119, 7082}, -{ 1, 40, -110, 350, -499, 1190,-1021, 6464}, -{ 0, 43, -115, 350, -488, 1136, -914, 5861} -}; - -/* Shifting by pre_shift allows calculation using unsigned int rather than -possibly-wider fixed_t. On 32-bit platforms, this is likely more efficient. -And by having pre_shift 32, a 32-bit platform can easily do the shift by -simply ignoring the low half. */ - #ifndef BLIP_MONO void blip_add_delta( blip_t* m, unsigned time, int delta_l, int delta_r ) { - if (delta_l | delta_r) - { - unsigned fixed = (unsigned) ((time * m->factor + m->offset) >> pre_shift); - int phase = fixed >> phase_shift & (phase_count - 1); - short const* in = bl_step [phase]; - short const* rev = bl_step [phase_count - phase]; - int interp = fixed >> (phase_shift - delta_bits) & (delta_unit - 1); - int pos = fixed >> frac_bits; + if (!(delta_l | delta_r)) return; + + //debug_me("blip_add_delta", time); + + fixed_t fixed = (fixed_t) (time * m->factor + m->offset); + int pos = fixed >> time_bits; + +#ifdef DEBUG_BLIP + //printf("[blip_add_delta] %lld %d %d %d %d\n", fixed, pos, time, delta_l, delta_r); fflush(stdout); +#endif #ifdef BLIP_INVERT - buf_t* out_l = m->buffer[1] + pos; - buf_t* out_r = m->buffer[0] + pos; + buf_t* out_l = m->buffer[1] + pos; + buf_t* out_r = m->buffer[0] + pos; #else - buf_t* out_l = m->buffer[0] + pos; - buf_t* out_r = m->buffer[1] + pos; + buf_t* out_l = m->buffer[0] + pos; + buf_t* out_r = m->buffer[1] + pos; #endif - int delta; - #ifdef BLIP_ASSERT - /* Fails if buffer size was exceeded */ - assert( pos <= m->size + end_frame_extra ); -#endif - - if (delta_l == delta_r) - { - buf_t out; - delta = (delta_l * interp) >> delta_bits; - delta_l -= delta; - out = in[0]*delta_l + in[half_width+0]*delta; - out_l[0] += out; - out_r[0] += out; - out = in[1]*delta_l + in[half_width+1]*delta; - out_l[1] += out; - out_r[1] += out; - out = in[2]*delta_l + in[half_width+2]*delta; - out_l[2] += out; - out_r[2] += out; - out = in[3]*delta_l + in[half_width+3]*delta; - out_l[3] += out; - out_r[3] += out; - out = in[4]*delta_l + in[half_width+4]*delta; - out_l[4] += out; - out_r[4] += out; - out = in[5]*delta_l + in[half_width+5]*delta; - out_l[5] += out; - out_r[5] += out; - out = in[6]*delta_l + in[half_width+6]*delta; - out_l[6] += out; - out_r[6] += out; - out = in[7]*delta_l + in[half_width+7]*delta; - out_l[7] += out; - out_r[7] += out; - out = rev[7]*delta_l + rev[7-half_width]*delta; - out_l[8] += out; - out_r[8] += out; - out = rev[6]*delta_l + rev[6-half_width]*delta; - out_l[9] += out; - out_r[9] += out; - out = rev[5]*delta_l + rev[5-half_width]*delta; - out_l[10] += out; - out_r[10] += out; - out = rev[4]*delta_l + rev[4-half_width]*delta; - out_l[11] += out; - out_r[11] += out; - out = rev[3]*delta_l + rev[3-half_width]*delta; - out_l[12] += out; - out_r[12] += out; - out = rev[2]*delta_l + rev[2-half_width]*delta; - out_l[13] += out; - out_r[13] += out; - out = rev[1]*delta_l + rev[1-half_width]*delta; - out_l[14] += out; - out_r[14] += out; - out = rev[0]*delta_l + rev[0-half_width]*delta; - out_l[15] += out; - out_r[15] += out; - } - else - { - delta = (delta_l * interp) >> delta_bits; - delta_l -= delta; - out_l [0] += in[0]*delta_l + in[half_width+0]*delta; - out_l [1] += in[1]*delta_l + in[half_width+1]*delta; - out_l [2] += in[2]*delta_l + in[half_width+2]*delta; - out_l [3] += in[3]*delta_l + in[half_width+3]*delta; - out_l [4] += in[4]*delta_l + in[half_width+4]*delta; - out_l [5] += in[5]*delta_l + in[half_width+5]*delta; - out_l [6] += in[6]*delta_l + in[half_width+6]*delta; - out_l [7] += in[7]*delta_l + in[half_width+7]*delta; - out_l [8] += rev[7]*delta_l + rev[7-half_width]*delta; - out_l [9] += rev[6]*delta_l + rev[6-half_width]*delta; - out_l [10] += rev[5]*delta_l + rev[5-half_width]*delta; - out_l [11] += rev[4]*delta_l + rev[4-half_width]*delta; - out_l [12] += rev[3]*delta_l + rev[3-half_width]*delta; - out_l [13] += rev[2]*delta_l + rev[2-half_width]*delta; - out_l [14] += rev[1]*delta_l + rev[1-half_width]*delta; - out_l [15] += rev[0]*delta_l + rev[0-half_width]*delta; - - delta = (delta_r * interp) >> delta_bits; - delta_r -= delta; - out_r [0] += in[0]*delta_r + in[half_width+0]*delta; - out_r [1] += in[1]*delta_r + in[half_width+1]*delta; - out_r [2] += in[2]*delta_r + in[half_width+2]*delta; - out_r [3] += in[3]*delta_r + in[half_width+3]*delta; - out_r [4] += in[4]*delta_r + in[half_width+4]*delta; - out_r [5] += in[5]*delta_r + in[half_width+5]*delta; - out_r [6] += in[6]*delta_r + in[half_width+6]*delta; - out_r [7] += in[7]*delta_r + in[half_width+7]*delta; - out_r [8] += rev[7]*delta_r + rev[7-half_width]*delta; - out_r [9] += rev[6]*delta_r + rev[6-half_width]*delta; - out_r [10] += rev[5]*delta_r + rev[5-half_width]*delta; - out_r [11] += rev[4]*delta_r + rev[4-half_width]*delta; - out_r [12] += rev[3]*delta_r + rev[3-half_width]*delta; - out_r [13] += rev[2]*delta_r + rev[2-half_width]*delta; - out_r [14] += rev[1]*delta_r + rev[1-half_width]*delta; - out_r [15] += rev[0]*delta_r + rev[0-half_width]*delta; - } - } + /* Fails if buffer size was exceeded */ + assert( pos <= m->size ); +#endif + + blip_lpf_stereo(m->sample_rate, out_l, out_r, delta_l, delta_r); } + void blip_add_delta_fast( blip_t* m, unsigned time, int delta_l, int delta_r ) { - if (delta_l | delta_r) - { - unsigned fixed = (unsigned) ((time * m->factor + m->offset) >> pre_shift); - int interp = fixed >> (frac_bits - delta_bits) & (delta_unit - 1); - int pos = fixed >> frac_bits; - -#ifdef STEREO_INVERT - buf_t* out_l = m->buffer[1] + pos; - buf_t* out_r = m->buffer[0] + pos; -#else - buf_t* out_l = m->buffer[0] + pos; - buf_t* out_r = m->buffer[1] + pos; -#endif - - int delta = delta_l * interp; - -#ifdef BLIP_ASSERT - /* Fails if buffer size was exceeded */ - assert( pos <= m->size + end_frame_extra ); -#endif - - if (delta_l == delta_r) - { - delta_l = delta_l * delta_unit - delta; - out_l[7] += delta_l; - out_l[8] += delta; - out_r[7] += delta_l; - out_r[8] += delta; - } - else - { - out_l[7] += delta_l * delta_unit - delta; - out_l[8] += delta; - delta = delta_r * interp; - out_r[7] += delta_r * delta_unit - delta; - out_r[8] += delta; - } - } + blip_add_delta(m, time, delta_l, delta_r); } #else void blip_add_delta( blip_t* m, unsigned time, int delta ) { - unsigned fixed = (unsigned) ((time * m->factor + m->offset) >> pre_shift); - buf_t* out = SAMPLES( m ) + (fixed >> frac_bits); - - int phase = fixed >> phase_shift & (phase_count - 1); - short const* in = bl_step [phase]; - short const* rev = bl_step [phase_count - phase]; - - int interp = fixed >> (phase_shift - delta_bits) & (delta_unit - 1); - int delta2 = (delta * interp) >> delta_bits; - delta -= delta2; - + if (!delta) return; + + //debug_me("blip_add_delta", time); + + fixed_t fixed = (fixed_t) (time * m->factor + m->offset); + int pos = fixed >> time_bits; + + buf_t* out = m->buffer + pos; + +#ifdef DEBUG_BLIP + printf("[blip_add_delta] %lld %d %d %d\n", fixed, pos, time, delta); fflush(stdout); +#endif + #ifdef BLIP_ASSERT /* Fails if buffer size was exceeded */ - assert( out <= &SAMPLES( m ) [m->size + end_frame_extra] ); + assert( pos <= m->size ); #endif - out [0] += in[0]*delta + in[half_width+0]*delta2; - out [1] += in[1]*delta + in[half_width+1]*delta2; - out [2] += in[2]*delta + in[half_width+2]*delta2; - out [3] += in[3]*delta + in[half_width+3]*delta2; - out [4] += in[4]*delta + in[half_width+4]*delta2; - out [5] += in[5]*delta + in[half_width+5]*delta2; - out [6] += in[6]*delta + in[half_width+6]*delta2; - out [7] += in[7]*delta + in[half_width+7]*delta2; - - in = rev; - out [ 8] += in[7]*delta + in[7-half_width]*delta2; - out [ 9] += in[6]*delta + in[6-half_width]*delta2; - out [10] += in[5]*delta + in[5-half_width]*delta2; - out [11] += in[4]*delta + in[4-half_width]*delta2; - out [12] += in[3]*delta + in[3-half_width]*delta2; - out [13] += in[2]*delta + in[2-half_width]*delta2; - out [14] += in[1]*delta + in[1-half_width]*delta2; - out [15] += in[0]*delta + in[0-half_width]*delta2; + blip_lpf_mono(m->sample_rate, out, delta); } void blip_add_delta_fast( blip_t* m, unsigned time, int delta ) { - unsigned fixed = (unsigned) ((time * m->factor + m->offset) >> pre_shift); - buf_t* out = SAMPLES( m ) + (fixed >> frac_bits); - - int interp = fixed >> (frac_bits - delta_bits) & (delta_unit - 1); - int delta2 = delta * interp; - -#ifdef BLIP_ASSERT - /* Fails if buffer size was exceeded */ - assert( out <= &SAMPLES( m ) [m->size + end_frame_extra] ); -#endif - - out [7] += delta * delta_unit - delta2; - out [8] += delta2; + blip_add_delta(m, time, delta); } #endif @@ -711,7 +603,7 @@ void blip_save_buffer_state(const blip_t *buf, blip_buffer_state_t *state) { #ifdef BLIP_MONO state->integrator = buf->integrator; - if (buf->buffer && buf->size >= BLIPSTATE_BUFFER_SIZE) + if (buf->buffer && buf->size >= BLIP_BUFFER_STATE_BUFFER_SIZE) { memcpy(state->buffer, buf->buffer, sizeof(state->buffer)); } @@ -732,10 +624,10 @@ void blip_save_buffer_state(const blip_t *buf, blip_buffer_state_t *state) void blip_load_buffer_state(blip_t *buf, const blip_buffer_state_t *state) { #ifdef BLIP_MONO - state->integrator = buf->integrator; - if (buf->buffer && buf->size >= BLIPSTATE_BUFFER_SIZE) + buf->integrator = state->integrator; + if (buf->buffer && buf->size >= BLIP_BUFFER_STATE_BUFFER_SIZE) { - memcpy(state->buffer, buf->buffer, sizeof(state->buffer)); + memcpy(buf->buffer, state->buffer, sizeof(state->buffer)); } #else int c; diff --git a/core/sound/blip_buf.h b/core/sound/blip_buf.h index 4383563f3..03032feb5 100644 --- a/core/sound/blip_buf.h +++ b/core/sound/blip_buf.h @@ -10,7 +10,23 @@ /** First parameter of most functions is blip_t*, or const blip_t* if nothing is changed. */ -typedef struct blip_t blip_t; +typedef unsigned long long fixed_t; +typedef signed int buf_t; +typedef struct blip_t +{ + fixed_t factor; + fixed_t offset; + int size; + int clock_rate; + int sample_rate; +#ifdef BLIP_MONO + buf_t integrator; + buf_t* buffer; +#else + buf_t integrator[2]; + buf_t* buffer[2]; +#endif +} blip_t; typedef struct blip_buffer_state_t blip_buffer_state_t; /** Creates new buffer that can hold at most sample_count samples. Sets rates @@ -24,7 +40,7 @@ void blip_set_rates( blip_t*, double clock_rate, double sample_rate ); enum { /** Maximum clock_rate/sample_rate ratio. For a given sample_rate, clock_rate must not be greater than sample_rate*blip_max_ratio. */ -blip_max_ratio = 1 << 20 }; +blip_max_ratio = 1 << 30 }; /** Clears entire buffer. Afterwards, blip_samples_avail() == 0. */ void blip_clear( blip_t* ); @@ -52,7 +68,7 @@ samples available. */ int blip_clocks_needed( const blip_t*, int sample_count ); enum { /** Maximum number of samples that can be generated from one time frame. */ -blip_max_frame = 4000 }; +blip_max_frame = 768000 / 50 }; /** Makes input clocks before clock_duration available for reading as output samples. Also begins new time frame at clock_duration, so that clock time 0 in @@ -75,6 +91,7 @@ int blip_read_samples( blip_t*, short out [], int count); /* Same as above function except sample is mixed from three blip buffers source */ int blip_mix_samples( blip_t* m1, blip_t* m2, blip_t* m3, short out [], int count); +int blip_mix_samples_2( blip_t* m1, blip_t* m2, short out [], int count); /** Frees buffer. No effect if NULL is passed. */ void blip_delete( blip_t* ); diff --git a/core/sound/blip_lpf.h b/core/sound/blip_lpf.h new file mode 100644 index 000000000..89cb5654b --- /dev/null +++ b/core/sound/blip_lpf.h @@ -0,0 +1,313 @@ +/* https://fiiir.com/ */ + + +/* +note: use higher sampling rates for better de-aliasing [384K, 768K] + frontend can do nearest neighbor integer downsampling [48K target w/ 24K cutoff] +*/ + + +/* 1.16.15 */ +enum { lpf_frac = 15 }; +enum { lpf_scale = 32768 }; + + +static int blip_lpf_cutoff = 0; /* set to nyquist (1/2) of final output sampling rate - 0 = none */ + + +#define LPF_TAPS(x) (buf_t) ((double) (x) * (double) (1UL << lpf_frac) * (double) lpf_scale) + + +#include "blip_lpf_48K.h" +#include "blip_lpf_96K.h" +#include "blip_lpf_192K.h" +#include "blip_lpf_384K.h" +#include "blip_lpf_768K.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +void set_blip_lowpass(int rate) +{ + blip_lpf_cutoff = rate; +} + +#ifdef __cplusplus +} +#endif + + +static int blip_lpf_taps(int sample_rate) +{ + switch( sample_rate ) { + case 48000: return blip_lpf_48K_taps; + case 96000: return blip_lpf_96K_taps; + case 192000: return blip_lpf_192K_taps; + case 384000: return blip_lpf_384K_taps; + case 768000: return blip_lpf_768K_taps; + }; + + return 0; +} + + +static void blip_lpf_stereo(int sample_rate, buf_t* out_l, buf_t* out_r, int delta_l, int delta_r) +{ + /* 31-bit * 15-bit = 46-bit >> 15 = 31-bit */ + + if( blip_lpf_cutoff == 24000 ) { + switch( sample_rate ) { + case 48000: + for( int lcv = 0; lcv < blip_lpf_48K_taps; lcv++ ) { + out_l [lcv] += ((signed long long)blip_lpf_48K_24K[lcv] * delta_l) / lpf_scale; + out_r [lcv] += ((signed long long)blip_lpf_48K_24K[lcv] * delta_r) / lpf_scale; + } + return; + + case 96000: + for( int lcv = 0; lcv < blip_lpf_96K_taps; lcv++ ) { + out_l [lcv] += ((signed long long)blip_lpf_96K_24K[lcv] * delta_l) / lpf_scale; + out_r [lcv] += ((signed long long)blip_lpf_96K_24K[lcv] * delta_r) / lpf_scale; + } + return; + + case 192000: + for( int lcv = 0; lcv < blip_lpf_192K_taps; lcv++ ) { + out_l [lcv] += ((signed long long)blip_lpf_192K_24K[lcv] * delta_l) / lpf_scale; + out_r [lcv] += ((signed long long)blip_lpf_192K_24K[lcv] * delta_r) / lpf_scale; + } + return; + + case 384000: + for( int lcv = 0; lcv < blip_lpf_384K_taps; lcv++ ) { + out_l [lcv] += ((signed long long)blip_lpf_384K_24K[lcv] * delta_l) / lpf_scale; + out_r [lcv] += ((signed long long)blip_lpf_384K_24K[lcv] * delta_r) / lpf_scale; + } + return; + + case 768000: + for( int lcv = 0; lcv < blip_lpf_768K_taps; lcv++ ) { + out_l [lcv] += ((signed long long)blip_lpf_768K_24K[lcv] * delta_l) / lpf_scale; + out_r [lcv] += ((signed long long)blip_lpf_768K_24K[lcv] * delta_r) / lpf_scale; + } + return; + } + } + + + if( blip_lpf_cutoff == 48000 ) { + switch( sample_rate ) { + case 96000: + for( int lcv = 0; lcv < blip_lpf_96K_taps; lcv++ ) { + out_l [lcv] += ((signed long long)blip_lpf_96K_48K[lcv] * delta_l) / lpf_scale; + out_r [lcv] += ((signed long long)blip_lpf_96K_48K[lcv] * delta_r) / lpf_scale; + } + return; + + case 192000: + for( int lcv = 0; lcv < blip_lpf_192K_taps; lcv++ ) { + out_l [lcv] += ((signed long long)blip_lpf_192K_48K[lcv] * delta_l) / lpf_scale; + out_r [lcv] += ((signed long long)blip_lpf_192K_48K[lcv] * delta_r) / lpf_scale; + } + return; + + case 384000: + for( int lcv = 0; lcv < blip_lpf_384K_taps; lcv++ ) { + out_l [lcv] += ((signed long long)blip_lpf_384K_48K[lcv] * delta_l) / lpf_scale; + out_r [lcv] += ((signed long long)blip_lpf_384K_48K[lcv] * delta_r) / lpf_scale; + } + return; + + case 768000: + for( int lcv = 0; lcv < blip_lpf_768K_taps; lcv++ ) { + out_l [lcv] += ((signed long long)blip_lpf_768K_48K[lcv] * delta_l) / lpf_scale; + out_r [lcv] += ((signed long long)blip_lpf_768K_48K[lcv] * delta_r) / lpf_scale; + } + return; + } + } + + + if( blip_lpf_cutoff == 96000 ) { + switch( sample_rate ) { + case 192000: + for( int lcv = 0; lcv < blip_lpf_192K_taps; lcv++ ) { + out_l [lcv] += ((signed long long)blip_lpf_192K_96K[lcv] * delta_l) / lpf_scale; + out_r [lcv] += ((signed long long)blip_lpf_192K_96K[lcv] * delta_r) / lpf_scale; + } + return; + + case 384000: + for( int lcv = 0; lcv < blip_lpf_384K_taps; lcv++ ) { + out_l [lcv] += ((signed long long)blip_lpf_384K_96K[lcv] * delta_l) / lpf_scale; + out_r [lcv] += ((signed long long)blip_lpf_384K_96K[lcv] * delta_r) / lpf_scale; + } + return; + + case 768000: + for( int lcv = 0; lcv < blip_lpf_768K_taps; lcv++ ) { + out_l [lcv] += ((signed long long)blip_lpf_768K_96K[lcv] * delta_l) / lpf_scale; + out_r [lcv] += ((signed long long)blip_lpf_768K_96K[lcv] * delta_r) / lpf_scale; + } + return; + } + } + + + if( blip_lpf_cutoff == 192000 ) { + switch( sample_rate ) { + case 384000: + for( int lcv = 0; lcv < blip_lpf_384K_taps; lcv++ ) { + out_l [lcv] += ((signed long long)blip_lpf_384K_192K[lcv] * delta_l) / lpf_scale; + out_r [lcv] += ((signed long long)blip_lpf_384K_192K[lcv] * delta_r) / lpf_scale; + } + return; + + case 768000: + for( int lcv = 0; lcv < blip_lpf_768K_taps; lcv++ ) { + out_l [lcv] += ((signed long long)blip_lpf_768K_192K[lcv] * delta_l) / lpf_scale; + out_r [lcv] += ((signed long long)blip_lpf_768K_192K[lcv] * delta_r) / lpf_scale; + } + return; + } + } + + + if( blip_lpf_cutoff == 384000 ) { + switch( sample_rate ) { + case 768000: + for( int lcv = 0; lcv < blip_lpf_768K_taps; lcv++ ) { + out_l [lcv] += ((signed long long)blip_lpf_768K_384K[lcv] * delta_l) / lpf_scale; + out_r [lcv] += ((signed long long)blip_lpf_768K_384K[lcv] * delta_r) / lpf_scale; + } + return; + } + } + + + out_l [0] += (buf_t) delta_l * (1UL << lpf_frac); + out_r [0] += (buf_t) delta_r * (1UL << lpf_frac); +} + + +static void blip_lpf_mono(int sample_rate, buf_t* out, int delta) +{ + if( blip_lpf_cutoff == 24000 ) { + switch( sample_rate ) { + case 48000: + for( int lcv = 0; lcv < blip_lpf_48K_taps; lcv++ ) { + out [lcv] += ((signed long long)blip_lpf_48K_24K[lcv] * delta) / lpf_scale; + } + return; + + case 96000: + for( int lcv = 0; lcv < blip_lpf_96K_taps; lcv++ ) { + out [lcv] += ((signed long long)blip_lpf_96K_24K[lcv] * delta) / lpf_scale; + } + return; + + case 192000: + for( int lcv = 0; lcv < blip_lpf_192K_taps; lcv++ ) { + out [lcv] += ((signed long long)blip_lpf_192K_24K[lcv] * delta) / lpf_scale; + } + return; + + case 384000: + for( int lcv = 0; lcv < blip_lpf_384K_taps; lcv++ ) { + out [lcv] += ((signed long long)blip_lpf_384K_24K[lcv] * delta) / lpf_scale; + } + return; + + case 768000: + for( int lcv = 0; lcv < blip_lpf_768K_taps; lcv++ ) { + out [lcv] += ((signed long long)blip_lpf_768K_24K[lcv] * delta) / lpf_scale; + } + return; + } + } + + + if( blip_lpf_cutoff == 48000 ) { + switch( sample_rate ) { + case 96000: + for( int lcv = 0; lcv < blip_lpf_96K_taps; lcv++ ) { + out [lcv] += ((signed long long)blip_lpf_96K_48K[lcv] * delta) / lpf_scale; + } + return; + + case 192000: + for( int lcv = 0; lcv < blip_lpf_192K_taps; lcv++ ) { + out [lcv] += ((signed long long)blip_lpf_192K_48K[lcv] * delta) / lpf_scale; + } + return; + + case 384000: + for( int lcv = 0; lcv < blip_lpf_384K_taps; lcv++ ) { + out [lcv] += ((signed long long)blip_lpf_384K_48K[lcv] * delta) / lpf_scale; + } + return; + + case 768000: + for( int lcv = 0; lcv < blip_lpf_768K_taps; lcv++ ) { + out [lcv] += ((signed long long)blip_lpf_768K_48K[lcv] * delta) / lpf_scale; + } + return; + } + } + + + if( blip_lpf_cutoff == 96000 ) { + switch( sample_rate ) { + case 192000: + for( int lcv = 0; lcv < blip_lpf_192K_taps; lcv++ ) { + out [lcv] += ((signed long long)blip_lpf_192K_96K[lcv] * delta) / lpf_scale; + } + return; + + case 384000: + for( int lcv = 0; lcv < blip_lpf_384K_taps; lcv++ ) { + out [lcv] += ((signed long long)blip_lpf_384K_96K[lcv] * delta) / lpf_scale; + } + return; + + case 768000: + for( int lcv = 0; lcv < blip_lpf_768K_taps; lcv++ ) { + out [lcv] += ((signed long long)blip_lpf_768K_96K[lcv] * delta) / lpf_scale; + } + return; + } + } + + + if( blip_lpf_cutoff == 192000 ) { + switch( sample_rate ) { + case 384000: + for( int lcv = 0; lcv < blip_lpf_384K_taps; lcv++ ) { + out [lcv] += ((signed long long)blip_lpf_384K_192K[lcv] * delta) / lpf_scale; + } + return; + + case 768000: + for( int lcv = 0; lcv < blip_lpf_768K_taps; lcv++ ) { + out [lcv] += ((signed long long)blip_lpf_768K_192K[lcv] * delta) / lpf_scale; + } + return; + } + } + + + if( blip_lpf_cutoff == 384000 ) { + switch( sample_rate ) { + case 768000: + for( int lcv = 0; lcv < blip_lpf_768K_taps; lcv++ ) { + out [lcv] += ((signed long long)blip_lpf_768K_384K[lcv] * delta) / lpf_scale; + } + return; + } + } + + + out [0] += (buf_t) delta * (1UL << lpf_frac); +} diff --git a/core/sound/blip_lpf_192K.h b/core/sound/blip_lpf_192K.h new file mode 100644 index 000000000..1b923ff45 --- /dev/null +++ b/core/sound/blip_lpf_192K.h @@ -0,0 +1,7 @@ +/* 192K sampling, 2K cutoff, 3K transition */ +enum { blip_lpf_192K_taps = 295 }; + + +#include "blip_lpf_192K_24K.h" +#include "blip_lpf_192K_48K.h" +#include "blip_lpf_192K_96K.h" diff --git a/core/sound/blip_lpf_192K_24K.h b/core/sound/blip_lpf_192K_24K.h new file mode 100644 index 000000000..73744dcc7 --- /dev/null +++ b/core/sound/blip_lpf_192K_24K.h @@ -0,0 +1,297 @@ +static buf_t const blip_lpf_192K_24K[blip_lpf_192K_taps] = { +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000088867880174), +LPF_TAPS(-0.000000238149160989), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000967826707627), +LPF_TAPS(0.000002293299391840), +LPF_TAPS(0.000002794151684877), +LPF_TAPS(0.000001194819042577), +LPF_TAPS(-0.000002692542847324), +LPF_TAPS(-0.000007189532013224), +LPF_TAPS(-0.000009191703997209), +LPF_TAPS(-0.000005935583389038), +LPF_TAPS(0.000002786671528697), +LPF_TAPS(0.000013451394329611), +LPF_TAPS(0.000019852237874508), +LPF_TAPS(0.000016344170879499), +LPF_TAPS(0.000001741335735348), +LPF_TAPS(-0.000018529842079338), +LPF_TAPS(-0.000033904623197724), +LPF_TAPS(-0.000033800086864146), +LPF_TAPS(-0.000014089712842714), +LPF_TAPS(0.000018750083838216), +LPF_TAPS(0.000048910060055138), +LPF_TAPS(0.000058402235278429), +LPF_TAPS(0.000037111313024223), +LPF_TAPS(-0.000009601521922410), +LPF_TAPS(-0.000060722607418047), +LPF_TAPS(-0.000088433378276437), +LPF_TAPS(-0.000072615683850022), +LPF_TAPS(-0.000013736274648311), +LPF_TAPS(0.000063565979232706), +LPF_TAPS(0.000119910156306053), +LPF_TAPS(0.000120569818801960), +LPF_TAPS(0.000055611400702006), +LPF_TAPS(-0.000050408904084663), +LPF_TAPS(-0.000146329682785647), +LPF_TAPS(-0.000178286254100790), +LPF_TAPS(-0.000118882157530363), +LPF_TAPS(0.000013702800097689), +LPF_TAPS(0.000158738425916860), +LPF_TAPS(0.000239731180927390), +LPF_TAPS(0.000203740441664265), +LPF_TAPS(0.000053496004603635), +LPF_TAPS(-0.000146241851067930), +LPF_TAPS(-0.000295118409098363), +LPF_TAPS(-0.000306513263908866), +LPF_TAPS(-0.000156059832555650), +LPF_TAPS(0.000097038599796698), +LPF_TAPS(0.000330966493993223), +LPF_TAPS(0.000418635208448877), +LPF_TAPS(0.000295095855792692), +LPF_TAPS(-0.000000000000000005), +LPF_TAPS(-0.000330777418181525), +LPF_TAPS(-0.000526021540293030), +LPF_TAPS(-0.000466220696521015), +LPF_TAPS(-0.000153270702730086), +LPF_TAPS(0.000276441517410037), +LPF_TAPS(0.000609077894058258), +LPF_TAPS(0.000658065918351398), +LPF_TAPS(0.000366064286993324), +LPF_TAPS(-0.000150386402110856), +LPF_TAPS(-0.000643549484484288), +LPF_TAPS(-0.000851316283811722), +LPF_TAPS(-0.000634138612347655), +LPF_TAPS(-0.000061624390633655), +LPF_TAPS(0.000602337744180382), +LPF_TAPS(0.001018581734917155), +LPF_TAPS(0.000943577962191536), +LPF_TAPS(0.000367260061047211), +LPF_TAPS(-0.000458299554997024), +LPF_TAPS(-0.001125354793155152), +LPF_TAPS(-0.001269318042621104), +LPF_TAPS(-0.000764290283324042), +LPF_TAPS(0.000187905638196626), +LPF_TAPS(0.001132206574500079), +LPF_TAPS(0.001574705433974788), +LPF_TAPS(0.001237569662484544), +LPF_TAPS(0.000224511362529855), +LPF_TAPS(-0.000998234344597220), +LPF_TAPS(-0.001812391534151866), +LPF_TAPS(-0.001756794170294545), +LPF_TAPS(-0.000782319104071645), +LPF_TAPS(0.000685607318862552), +LPF_TAPS(0.001926735087455666), +LPF_TAPS(0.002275459232597814), +LPF_TAPS(0.001472448638347935), +LPF_TAPS(-0.000164888079687475), +LPF_TAPS(-0.001857714543905295), +LPF_TAPS(-0.002731352650618140), +LPF_TAPS(-0.002262076797697579), +LPF_TAPS(-0.000579338030693501), +LPF_TAPS(0.001546150733363754), +LPF_TAPS(0.003048749090619086), +LPF_TAPS(0.003096593192501319), +LPF_TAPS(0.001543084834901600), +LPF_TAPS(-0.000939837302041592), +LPF_TAPS(-0.003142245599040471), +LPF_TAPS(-0.003899170603326770), +LPF_TAPS(-0.002698408098877719), +LPF_TAPS(0.000000000000000021), +LPF_TAPS(0.002921903641535428), +LPF_TAPS(0.004572008955895946), +LPF_TAPS(0.003990141163815959), +LPF_TAPS(0.001292615642227111), +LPF_TAPS(-0.002299054442402459), +LPF_TAPS(-0.004998959763464508), +LPF_TAPS(-0.005334161275829722), +LPF_TAPS(-0.002932772495491725), +LPF_TAPS(0.001191775941151652), +LPF_TAPS(0.005048722557538835), +LPF_TAPS(0.006617006934658838), +LPF_TAPS(0.004887582240540398), +LPF_TAPS(0.000471391820742604), +LPF_TAPS(-0.004577023938925431), +LPF_TAPS(-0.007695957214193918), +LPF_TAPS(-0.007095712754339889), +LPF_TAPS(-0.002751638823885237), +LPF_TAPS(0.003424817617303759), +LPF_TAPS(0.008397388880842557), +LPF_TAPS(0.009469292790600799), +LPF_TAPS(0.005707632271462191), +LPF_TAPS(-0.001406641214315407), +LPF_TAPS(-0.008508488631453783), +LPF_TAPS(-0.011898560218317223), +LPF_TAPS(-0.009418303287613599), +LPF_TAPS(-0.001724055500589014), +LPF_TAPS(0.007750487581196339), +LPF_TAPS(0.014258989316922464), +LPF_TAPS(0.014039471720665702), +LPF_TAPS(0.006367554689719202), +LPF_TAPS(-0.005700613585608971), +LPF_TAPS(-0.016420333624407701), +LPF_TAPS(-0.019952098086170714), +LPF_TAPS(-0.013341186324730379), +LPF_TAPS(0.001551440842540053), +LPF_TAPS(0.018256772503679127), +LPF_TAPS(0.028227518365292050), +LPF_TAPS(0.024784200946553939), +LPF_TAPS(0.006795943777113442), +LPF_TAPS(-0.019657185861938053), +LPF_TAPS(-0.042666070096388911), +LPF_TAPS(-0.048683868505890286), +LPF_TAPS(-0.028025412280222081), +LPF_TAPS(0.020534526388022348), +LPF_TAPS(0.088073047119200415), +LPF_TAPS(0.157675115394035670), +LPF_TAPS(0.209836886946609902), +LPF_TAPS(0.229166551041813965), +LPF_TAPS(0.209836886946609930), +LPF_TAPS(0.157675115394035670), +LPF_TAPS(0.088073047119200415), +LPF_TAPS(0.020534526388022348), +LPF_TAPS(-0.028025412280222081), +LPF_TAPS(-0.048683868505890293), +LPF_TAPS(-0.042666070096388911), +LPF_TAPS(-0.019657185861938053), +LPF_TAPS(0.006795943777113443), +LPF_TAPS(0.024784200946553946), +LPF_TAPS(0.028227518365292050), +LPF_TAPS(0.018256772503679127), +LPF_TAPS(0.001551440842540053), +LPF_TAPS(-0.013341186324730381), +LPF_TAPS(-0.019952098086170714), +LPF_TAPS(-0.016420333624407701), +LPF_TAPS(-0.005700613585608974), +LPF_TAPS(0.006367554689719204), +LPF_TAPS(0.014039471720665702), +LPF_TAPS(0.014258989316922464), +LPF_TAPS(0.007750487581196341), +LPF_TAPS(-0.001724055500589014), +LPF_TAPS(-0.009418303287613601), +LPF_TAPS(-0.011898560218317223), +LPF_TAPS(-0.008508488631453785), +LPF_TAPS(-0.001406641214315407), +LPF_TAPS(0.005707632271462193), +LPF_TAPS(0.009469292790600803), +LPF_TAPS(0.008397388880842563), +LPF_TAPS(0.003424817617303759), +LPF_TAPS(-0.002751638823885237), +LPF_TAPS(-0.007095712754339889), +LPF_TAPS(-0.007695957214193918), +LPF_TAPS(-0.004577023938925433), +LPF_TAPS(0.000471391820742604), +LPF_TAPS(0.004887582240540398), +LPF_TAPS(0.006617006934658838), +LPF_TAPS(0.005048722557538837), +LPF_TAPS(0.001191775941151653), +LPF_TAPS(-0.002932772495491724), +LPF_TAPS(-0.005334161275829720), +LPF_TAPS(-0.004998959763464509), +LPF_TAPS(-0.002299054442402458), +LPF_TAPS(0.001292615642227111), +LPF_TAPS(0.003990141163815962), +LPF_TAPS(0.004572008955895946), +LPF_TAPS(0.002921903641535427), +LPF_TAPS(0.000000000000000021), +LPF_TAPS(-0.002698408098877721), +LPF_TAPS(-0.003899170603326770), +LPF_TAPS(-0.003142245599040471), +LPF_TAPS(-0.000939837302041592), +LPF_TAPS(0.001543084834901600), +LPF_TAPS(0.003096593192501320), +LPF_TAPS(0.003048749090619088), +LPF_TAPS(0.001546150733363754), +LPF_TAPS(-0.000579338030693501), +LPF_TAPS(-0.002262076797697580), +LPF_TAPS(-0.002731352650618141), +LPF_TAPS(-0.001857714543905297), +LPF_TAPS(-0.000164888079687475), +LPF_TAPS(0.001472448638347934), +LPF_TAPS(0.002275459232597816), +LPF_TAPS(0.001926735087455665), +LPF_TAPS(0.000685607318862552), +LPF_TAPS(-0.000782319104071646), +LPF_TAPS(-0.001756794170294546), +LPF_TAPS(-0.001812391534151866), +LPF_TAPS(-0.000998234344597222), +LPF_TAPS(0.000224511362529855), +LPF_TAPS(0.001237569662484545), +LPF_TAPS(0.001574705433974788), +LPF_TAPS(0.001132206574500079), +LPF_TAPS(0.000187905638196626), +LPF_TAPS(-0.000764290283324042), +LPF_TAPS(-0.001269318042621104), +LPF_TAPS(-0.001125354793155152), +LPF_TAPS(-0.000458299554997024), +LPF_TAPS(0.000367260061047211), +LPF_TAPS(0.000943577962191536), +LPF_TAPS(0.001018581734917156), +LPF_TAPS(0.000602337744180382), +LPF_TAPS(-0.000061624390633655), +LPF_TAPS(-0.000634138612347655), +LPF_TAPS(-0.000851316283811722), +LPF_TAPS(-0.000643549484484288), +LPF_TAPS(-0.000150386402110857), +LPF_TAPS(0.000366064286993324), +LPF_TAPS(0.000658065918351398), +LPF_TAPS(0.000609077894058259), +LPF_TAPS(0.000276441517410037), +LPF_TAPS(-0.000153270702730086), +LPF_TAPS(-0.000466220696521016), +LPF_TAPS(-0.000526021540293030), +LPF_TAPS(-0.000330777418181525), +LPF_TAPS(-0.000000000000000005), +LPF_TAPS(0.000295095855792692), +LPF_TAPS(0.000418635208448877), +LPF_TAPS(0.000330966493993224), +LPF_TAPS(0.000097038599796698), +LPF_TAPS(-0.000156059832555650), +LPF_TAPS(-0.000306513263908867), +LPF_TAPS(-0.000295118409098363), +LPF_TAPS(-0.000146241851067930), +LPF_TAPS(0.000053496004603635), +LPF_TAPS(0.000203740441664265), +LPF_TAPS(0.000239731180927390), +LPF_TAPS(0.000158738425916860), +LPF_TAPS(0.000013702800097689), +LPF_TAPS(-0.000118882157530363), +LPF_TAPS(-0.000178286254100791), +LPF_TAPS(-0.000146329682785648), +LPF_TAPS(-0.000050408904084663), +LPF_TAPS(0.000055611400702006), +LPF_TAPS(0.000120569818801959), +LPF_TAPS(0.000119910156306052), +LPF_TAPS(0.000063565979232706), +LPF_TAPS(-0.000013736274648311), +LPF_TAPS(-0.000072615683850022), +LPF_TAPS(-0.000088433378276437), +LPF_TAPS(-0.000060722607418047), +LPF_TAPS(-0.000009601521922410), +LPF_TAPS(0.000037111313024223), +LPF_TAPS(0.000058402235278429), +LPF_TAPS(0.000048910060055138), +LPF_TAPS(0.000018750083838216), +LPF_TAPS(-0.000014089712842714), +LPF_TAPS(-0.000033800086864146), +LPF_TAPS(-0.000033904623197724), +LPF_TAPS(-0.000018529842079338), +LPF_TAPS(0.000001741335735348), +LPF_TAPS(0.000016344170879499), +LPF_TAPS(0.000019852237874508), +LPF_TAPS(0.000013451394329611), +LPF_TAPS(0.000002786671528698), +LPF_TAPS(-0.000005935583389038), +LPF_TAPS(-0.000009191703997209), +LPF_TAPS(-0.000007189532013224), +LPF_TAPS(-0.000002692542847324), +LPF_TAPS(0.000001194819042577), +LPF_TAPS(0.000002794151684877), +LPF_TAPS(0.000002293299391840), +LPF_TAPS(0.000000967826707627), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000238149160989), +LPF_TAPS(-0.000000088867880174), +LPF_TAPS(0.000000000000000000), +}; diff --git a/core/sound/blip_lpf_192K_48K.h b/core/sound/blip_lpf_192K_48K.h new file mode 100644 index 000000000..38ab936fc --- /dev/null +++ b/core/sound/blip_lpf_192K_48K.h @@ -0,0 +1,297 @@ +static buf_t const blip_lpf_192K_48K[blip_lpf_192K_taps] = { +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000011699684035), +LPF_TAPS(-0.000000360416908350), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000001464716937627), +LPF_TAPS(0.000000301918738577), +LPF_TAPS(-0.000003295928230852), +LPF_TAPS(-0.000001194819620067), +LPF_TAPS(0.000005764676411107), +LPF_TAPS(0.000002978003106345), +LPF_TAPS(-0.000008705808898682), +LPF_TAPS(-0.000005935586257872), +LPF_TAPS(0.000011876723517204), +LPF_TAPS(0.000010321622883786), +LPF_TAPS(-0.000014957735575653), +LPF_TAPS(-0.000016344178779097), +LPF_TAPS(0.000017554863172917), +LPF_TAPS(0.000024148572024212), +LPF_TAPS(-0.000019205435573849), +LPF_TAPS(-0.000033800103200680), +LPF_TAPS(0.000019386927628363), +LPF_TAPS(0.000045266728576528), +LPF_TAPS(-0.000017529388978758), +LPF_TAPS(-0.000058402263505874), +LPF_TAPS(0.000013031766421880), +LPF_TAPS(0.000072930834880073), +LPF_TAPS(-0.000005282309369841), +LPF_TAPS(-0.000088433421018778), +LPF_TAPS(-0.000006316897832758), +LPF_TAPS(0.000104337415082632), +LPF_TAPS(0.000022321414313687), +LPF_TAPS(-0.000119910214262005), +LPF_TAPS(-0.000043212280878318), +LPF_TAPS(0.000134257862687919), +LPF_TAPS(0.000069360801474369), +LPF_TAPS(-0.000146329753510899), +LPF_TAPS(-0.000100991099262988), +LPF_TAPS(0.000154930318953823), +LPF_TAPS(0.000138141528895099), +LPF_TAPS(-0.000158738502639612), +LPF_TAPS(-0.000180626266732152), +LPF_TAPS(0.000156335614993112), +LPF_TAPS(0.000227998617493814), +LPF_TAPS(-0.000146241921750728), +LPF_TAPS(-0.000279517755671161), +LPF_TAPS(0.000126962012322580), +LPF_TAPS(0.000334120749962844), +LPF_TAPS(-0.000097038646698174), +LPF_TAPS(-0.000390401787033481), +LPF_TAPS(0.000055114397408641), +LPF_TAPS(0.000446600506885053), +LPF_TAPS(-0.000000000000000006), +LPF_TAPS(-0.000500601278283534), +LPF_TAPS(-0.000069252083035812), +LPF_TAPS(0.000549945074130452), +LPF_TAPS(0.000153270776810127), +LPF_TAPS(-0.000591855351920665), +LPF_TAPS(-0.000252288446198623), +LPF_TAPS(0.000623279005681946), +LPF_TAPS(0.000366064463922513), +LPF_TAPS(-0.000640943039114649), +LPF_TAPS(-0.000493813126218410), +LPF_TAPS(0.000641427124992022), +LPF_TAPS(0.000634138918844690), +LPF_TAPS(-0.000621251676932805), +LPF_TAPS(-0.000784982210639611), +LPF_TAPS(0.000576980483533690), +LPF_TAPS(0.000943578418249327), +LPF_TAPS(-0.000505336361627272), +LPF_TAPS(-0.001106433536073574), +LPF_TAPS(0.000403327697534788), +LPF_TAPS(0.001269318656118245), +LPF_TAPS(-0.000268383186665769), +LPF_TAPS(-0.001427285713983255), +LPF_TAPS(0.000098491577542187), +LPF_TAPS(0.001574706195074243), +LPF_TAPS(0.000107657198890842), +LPF_TAPS(-0.001705333929525307), +LPF_TAPS(-0.000350533456054162), +LPF_TAPS(0.001812392410131702), +LPF_TAPS(0.000629635873110615), +LPF_TAPS(-0.001888686304008138), +LPF_TAPS(-0.000943370501630691), +LPF_TAPS(0.001926736018700954), +LPF_TAPS(0.001288944738825755), +LPF_TAPS(-0.001918933353174580), +LPF_TAPS(-0.001662280064090690), +LPF_TAPS(0.001857715441791014), +LPF_TAPS(0.002057946865741891), +LPF_TAPS(-0.001735753414692443), +LPF_TAPS(-0.002469124022221547), +LPF_TAPS(0.001546151480661884), +LPF_TAPS(0.002887585040926098), +LPF_TAPS(-0.001282651517427551), +LPF_TAPS(-0.003303711492255804), +LPF_TAPS(0.000939837756291379), +LPF_TAPS(0.003706533197250494), +LPF_TAPS(-0.000513335796556813), +LPF_TAPS(-0.004083793117000289), +LPF_TAPS(0.000000000000000027), +LPF_TAPS(0.004422033118268171), +LPF_TAPS(0.000601916688958754), +LPF_TAPS(-0.004706694693093308), +LPF_TAPS(-0.001292616266984692), +LPF_TAPS(0.004922226186722231), +LPF_TAPS(0.002070637932581485), +LPF_TAPS(-0.005052184961159095), +LPF_TAPS(-0.002932773912983241), +LPF_TAPS(0.005079318894153638), +LPF_TAPS(0.003874022945641129), +LPF_TAPS(-0.004985606189918983), +LPF_TAPS(-0.004887584602846446), +LPF_TAPS(0.004752224827174563), +LPF_TAPS(0.005964896612310225), +LPF_TAPS(-0.004359411682422675), +LPF_TAPS(-0.007095716183897575), +LPF_TAPS(0.003786154007080481), +LPF_TAPS(0.008268245136622701), +LPF_TAPS(-0.003009628201892344), +LPF_TAPS(-0.009469297367376523), +LPF_TAPS(0.002004254889476187), +LPF_TAPS(0.010684505952884770), +LPF_TAPS(-0.000740160397126897), +LPF_TAPS(-0.011898565969226251), +LPF_TAPS(-0.000819305919485099), +LPF_TAPS(0.013095507988590082), +LPF_TAPS(0.002721610624445016), +LPF_TAPS(-0.014258996208693293), +LPF_TAPS(-0.005031753397366375), +LPF_TAPS(0.015372644321100564), +LPF_TAPS(0.007843835020286348), +LPF_TAPS(-0.016420341560817068), +LPF_TAPS(-0.011301961155043415), +LPF_TAPS(0.017386580925610604), +LPF_TAPS(0.015640482853936873), +LPF_TAPS(-0.018256781327691107), +LPF_TAPS(-0.021268118905985057), +LPF_TAPS(0.019017595453519179), +LPF_TAPS(0.028964140354554850), +LPF_TAPS(-0.019657195362809188), +LPF_TAPS(-0.040410641251038312), +LPF_TAPS(0.020165528350490871), +LPF_TAPS(0.060001805818588987), +LPF_TAPS(-0.020534536312936849), +LPF_TAPS(-0.103889292749747980), +LPF_TAPS(0.020758332782087250), +LPF_TAPS(0.317568878837019564), +LPF_TAPS(0.479166656500229882), +LPF_TAPS(0.317568878837019619), +LPF_TAPS(0.020758332782087250), +LPF_TAPS(-0.103889292749747980), +LPF_TAPS(-0.020534536312936849), +LPF_TAPS(0.060001805818588987), +LPF_TAPS(0.020165528350490871), +LPF_TAPS(-0.040410641251038312), +LPF_TAPS(-0.019657195362809188), +LPF_TAPS(0.028964140354554854), +LPF_TAPS(0.019017595453519186), +LPF_TAPS(-0.021268118905985057), +LPF_TAPS(-0.018256781327691107), +LPF_TAPS(0.015640482853936873), +LPF_TAPS(0.017386580925610604), +LPF_TAPS(-0.011301961155043415), +LPF_TAPS(-0.016420341560817068), +LPF_TAPS(0.007843835020286349), +LPF_TAPS(0.015372644321100568), +LPF_TAPS(-0.005031753397366375), +LPF_TAPS(-0.014258996208693293), +LPF_TAPS(0.002721610624445017), +LPF_TAPS(0.013095507988590084), +LPF_TAPS(-0.000819305919485099), +LPF_TAPS(-0.011898565969226251), +LPF_TAPS(-0.000740160397126897), +LPF_TAPS(0.010684505952884775), +LPF_TAPS(0.002004254889476188), +LPF_TAPS(-0.009469297367376528), +LPF_TAPS(-0.003009628201892346), +LPF_TAPS(0.008268245136622703), +LPF_TAPS(0.003786154007080481), +LPF_TAPS(-0.007095716183897575), +LPF_TAPS(-0.004359411682422675), +LPF_TAPS(0.005964896612310226), +LPF_TAPS(0.004752224827174565), +LPF_TAPS(-0.004887584602846446), +LPF_TAPS(-0.004985606189918983), +LPF_TAPS(0.003874022945641131), +LPF_TAPS(0.005079318894153640), +LPF_TAPS(-0.002932773912983241), +LPF_TAPS(-0.005052184961159091), +LPF_TAPS(0.002070637932581485), +LPF_TAPS(0.004922226186722231), +LPF_TAPS(-0.001292616266984692), +LPF_TAPS(-0.004706694693093311), +LPF_TAPS(0.000601916688958754), +LPF_TAPS(0.004422033118268169), +LPF_TAPS(0.000000000000000027), +LPF_TAPS(-0.004083793117000291), +LPF_TAPS(-0.000513335796556813), +LPF_TAPS(0.003706533197250494), +LPF_TAPS(0.000939837756291379), +LPF_TAPS(-0.003303711492255802), +LPF_TAPS(-0.001282651517427552), +LPF_TAPS(0.002887585040926099), +LPF_TAPS(0.001546151480661884), +LPF_TAPS(-0.002469124022221548), +LPF_TAPS(-0.001735753414692443), +LPF_TAPS(0.002057946865741892), +LPF_TAPS(0.001857715441791016), +LPF_TAPS(-0.001662280064090690), +LPF_TAPS(-0.001918933353174579), +LPF_TAPS(0.001288944738825756), +LPF_TAPS(0.001926736018700954), +LPF_TAPS(-0.000943370501630691), +LPF_TAPS(-0.001888686304008139), +LPF_TAPS(0.000629635873110615), +LPF_TAPS(0.001812392410131702), +LPF_TAPS(-0.000350533456054163), +LPF_TAPS(-0.001705333929525308), +LPF_TAPS(0.000107657198890842), +LPF_TAPS(0.001574706195074243), +LPF_TAPS(0.000098491577542187), +LPF_TAPS(-0.001427285713983254), +LPF_TAPS(-0.000268383186665769), +LPF_TAPS(0.001269318656118245), +LPF_TAPS(0.000403327697534788), +LPF_TAPS(-0.001106433536073575), +LPF_TAPS(-0.000505336361627273), +LPF_TAPS(0.000943578418249328), +LPF_TAPS(0.000576980483533690), +LPF_TAPS(-0.000784982210639612), +LPF_TAPS(-0.000621251676932805), +LPF_TAPS(0.000634138918844690), +LPF_TAPS(0.000641427124992022), +LPF_TAPS(-0.000493813126218410), +LPF_TAPS(-0.000640943039114650), +LPF_TAPS(0.000366064463922513), +LPF_TAPS(0.000623279005681946), +LPF_TAPS(-0.000252288446198623), +LPF_TAPS(-0.000591855351920666), +LPF_TAPS(0.000153270776810127), +LPF_TAPS(0.000549945074130454), +LPF_TAPS(-0.000069252083035812), +LPF_TAPS(-0.000500601278283533), +LPF_TAPS(-0.000000000000000006), +LPF_TAPS(0.000446600506885053), +LPF_TAPS(0.000055114397408641), +LPF_TAPS(-0.000390401787033482), +LPF_TAPS(-0.000097038646698174), +LPF_TAPS(0.000334120749962844), +LPF_TAPS(0.000126962012322581), +LPF_TAPS(-0.000279517755671162), +LPF_TAPS(-0.000146241921750728), +LPF_TAPS(0.000227998617493814), +LPF_TAPS(0.000156335614993112), +LPF_TAPS(-0.000180626266732152), +LPF_TAPS(-0.000158738502639613), +LPF_TAPS(0.000138141528895099), +LPF_TAPS(0.000154930318953823), +LPF_TAPS(-0.000100991099262988), +LPF_TAPS(-0.000146329753510899), +LPF_TAPS(0.000069360801474369), +LPF_TAPS(0.000134257862687919), +LPF_TAPS(-0.000043212280878318), +LPF_TAPS(-0.000119910214262005), +LPF_TAPS(0.000022321414313687), +LPF_TAPS(0.000104337415082632), +LPF_TAPS(-0.000006316897832758), +LPF_TAPS(-0.000088433421018778), +LPF_TAPS(-0.000005282309369841), +LPF_TAPS(0.000072930834880073), +LPF_TAPS(0.000013031766421880), +LPF_TAPS(-0.000058402263505874), +LPF_TAPS(-0.000017529388978758), +LPF_TAPS(0.000045266728576528), +LPF_TAPS(0.000019386927628363), +LPF_TAPS(-0.000033800103200680), +LPF_TAPS(-0.000019205435573849), +LPF_TAPS(0.000024148572024212), +LPF_TAPS(0.000017554863172917), +LPF_TAPS(-0.000016344178779097), +LPF_TAPS(-0.000014957735575653), +LPF_TAPS(0.000010321622883786), +LPF_TAPS(0.000011876723517204), +LPF_TAPS(-0.000005935586257872), +LPF_TAPS(-0.000008705808898682), +LPF_TAPS(0.000002978003106345), +LPF_TAPS(0.000005764676411107), +LPF_TAPS(-0.000001194819620067), +LPF_TAPS(-0.000003295928230852), +LPF_TAPS(0.000000301918738577), +LPF_TAPS(0.000001464716937627), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000360416908350), +LPF_TAPS(-0.000000011699684035), +LPF_TAPS(0.000000000000000000), +}; diff --git a/core/sound/blip_lpf_192K_96K.h b/core/sound/blip_lpf_192K_96K.h new file mode 100644 index 000000000..4effb8d2e --- /dev/null +++ b/core/sound/blip_lpf_192K_96K.h @@ -0,0 +1,297 @@ +static buf_t const blip_lpf_192K_96K[blip_lpf_192K_taps] = { +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000011699684267), +LPF_TAPS(-0.000000023622972699), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000096002622039), +LPF_TAPS(-0.000000301918744560), +LPF_TAPS(0.000000655600900104), +LPF_TAPS(-0.000001194819643744), +LPF_TAPS(0.000001956843997497), +LPF_TAPS(-0.000002978003165359), +LPF_TAPS(0.000004293229923365), +LPF_TAPS(-0.000005935586375495), +LPF_TAPS(0.000007935773099930), +LPF_TAPS(-0.000010321623088325), +LPF_TAPS(0.000013117582299463), +LPF_TAPS(-0.000016344179102984), +LPF_TAPS(0.000020017485373424), +LPF_TAPS(-0.000024148572502755), +LPF_TAPS(0.000028742966123913), +LPF_TAPS(-0.000033800103870485), +LPF_TAPS(0.000039312801030250), +LPF_TAPS(-0.000045266729473564), +LPF_TAPS(0.000051639915742486), +LPF_TAPS(-0.000058402264663211), +LPF_TAPS(0.000065515115283167), +LPF_TAPS(-0.000072930836325319), +LPF_TAPS(0.000080592468686167), +LPF_TAPS(-0.000088433422771234), +LPF_TAPS(0.000096377238653759), +LPF_TAPS(-0.000104337417150253), +LPF_TAPS(0.000112217329923088), +LPF_TAPS(-0.000119910216638228), +LPF_TAPS(0.000127299277019925), +LPF_TAPS(-0.000134257865348465), +LPF_TAPS(0.000140649794538436), +LPF_TAPS(-0.000146329756410672), +LPF_TAPS(0.000151143864130081), +LPF_TAPS(-0.000154930322024030), +LPF_TAPS(0.000157520227123526), +LPF_TAPS(-0.000158738505785284), +LPF_TAPS(0.000158404987661415), +LPF_TAPS(-0.000156335618091171), +LPF_TAPS(0.000152343808703457), +LPF_TAPS(-0.000146241924648769), +LPF_TAPS(0.000137842905435367), +LPF_TAPS(-0.000126962014838557), +LPF_TAPS(0.000113418713797108), +LPF_TAPS(-0.000097038648621177), +LPF_TAPS(0.000077655745226952), +LPF_TAPS(-0.000055114398500844), +LPF_TAPS(0.000029271744296376), +LPF_TAPS(0.000000000000000005), +LPF_TAPS(-0.000032811141918621), +LPF_TAPS(0.000069252084408131), +LPF_TAPS(-0.000109390878791837), +LPF_TAPS(0.000153270779847421), +LPF_TAPS(-0.000200907823821846), +LPF_TAPS(0.000252288451198140), +LPF_TAPS(-0.000307367196884387), +LPF_TAPS(0.000366064471176646), +LPF_TAPS(-0.000428264455346255), +LPF_TAPS(0.000493813136004140), +LPF_TAPS(-0.000562516502490292), +LPF_TAPS(0.000634138931411217), +LPF_TAPS(-0.000708401782100121), +LPF_TAPS(0.000784982226195324), +LPF_TAPS(-0.000863512333713981), +LPF_TAPS(0.000943578436947906), +LPF_TAPS(-0.001024720792217768), +LPF_TAPS(0.001106433557999406), +LPF_TAPS(-0.001188165106185149), +LPF_TAPS(0.001269318681271905), +LPF_TAPS(-0.001349253420085044), +LPF_TAPS(0.001427285742267313), +LPF_TAPS(-0.001502691119198399), +LPF_TAPS(0.001574706226279688), +LPF_TAPS(-0.001642531480640847), +LPF_TAPS(0.001705333963319374), +LPF_TAPS(-0.001762250721854476), +LPF_TAPS(0.001812392446047311), +LPF_TAPS(-0.001854847506395012), +LPF_TAPS(0.001888686341435625), +LPF_TAPS(-0.001912966176969622), +LPF_TAPS(0.001926736056882465), +LPF_TAPS(-0.001929042162111216), +LPF_TAPS(0.001918933391201516), +LPF_TAPS(-0.001895467172926061), +LPF_TAPS(0.001857715478604782), +LPF_TAPS(-0.001804770999109921), +LPF_TAPS(0.001735753449089341), +LPF_TAPS(-0.001649815958715717), +LPF_TAPS(0.001546151511301517), +LPF_TAPS(-0.001423999383428101), +LPF_TAPS(0.001282651542845464), +LPF_TAPS(-0.001121458958325758), +LPF_TAPS(0.000939837774915927), +LPF_TAPS(-0.000737275307646808), +LPF_TAPS(0.000513335806729532), +LPF_TAPS(-0.000267665947613575), +LPF_TAPS(-0.000000000000000021), +LPF_TAPS(0.000289835368998426), +LPF_TAPS(-0.000601916700886649), +LPF_TAPS(0.000936219802489234), +LPF_TAPS(-0.001292616292599868), +LPF_TAPS(0.001670870675282795), +LPF_TAPS(-0.002070637973614653), +LPF_TAPS(0.002491461954432159), +LPF_TAPS(-0.002932773971101029), +LPF_TAPS(0.003393892447508969), +LPF_TAPS(-0.003874023022411256), +LPF_TAPS(0.004372259368953546), +LPF_TAPS(-0.004887584699702088), +LPF_TAPS(0.005418873962854631), +LPF_TAPS(-0.005964896730514600), +LPF_TAPS(0.006524320775035389), +LPF_TAPS(-0.007095716324511088), +LPF_TAPS(0.007677560983540607), +LPF_TAPS(-0.008268245300471832), +LPF_TAPS(0.008866078957473050), +LPF_TAPS(-0.009469297555026516), +LPF_TAPS(0.010076069957823942), +LPF_TAPS(-0.010684506164616164), +LPF_TAPS(0.011292665660355927), +LPF_TAPS(-0.011898566205016293), +LPF_TAPS(0.012500193009798910), +LPF_TAPS(-0.013095508248099581), +LPF_TAPS(0.013682460845602764), +LPF_TAPS(-0.014258996491259241), +LPF_TAPS(0.014823067808685773), +LPF_TAPS(-0.015372644625735333), +LPF_TAPS(0.015905724278637460), +LPF_TAPS(-0.016420341886213691), +LPF_TAPS(0.016914580529250271), +LPF_TAPS(-0.017386581270154931), +LPF_TAPS(0.017834552948553309), +LPF_TAPS(-0.018256781689479799), +LPF_TAPS(0.018651640062293810), +LPF_TAPS(-0.019017595830384797), +LPF_TAPS(0.019353220234126459), +LPF_TAPS(-0.019657195752349511), +LPF_TAPS(0.019928323290854689), +LPF_TAPS(-0.020165528750104574), +LPF_TAPS(0.020367868928236835), +LPF_TAPS(-0.020534536719863154), +LPF_TAPS(0.020664865575759649), +LPF_TAPS(-0.020758333193448456), +LPF_TAPS(0.020814564413806608), +LPF_TAPS(0.979166665295603811), +LPF_TAPS(0.020814564413806608), +LPF_TAPS(-0.020758333193448456), +LPF_TAPS(0.020664865575759649), +LPF_TAPS(-0.020534536719863154), +LPF_TAPS(0.020367868928236835), +LPF_TAPS(-0.020165528750104574), +LPF_TAPS(0.019928323290854689), +LPF_TAPS(-0.019657195752349511), +LPF_TAPS(0.019353220234126459), +LPF_TAPS(-0.019017595830384801), +LPF_TAPS(0.018651640062293810), +LPF_TAPS(-0.018256781689479803), +LPF_TAPS(0.017834552948553309), +LPF_TAPS(-0.017386581270154935), +LPF_TAPS(0.016914580529250271), +LPF_TAPS(-0.016420341886213691), +LPF_TAPS(0.015905724278637463), +LPF_TAPS(-0.015372644625735336), +LPF_TAPS(0.014823067808685773), +LPF_TAPS(-0.014258996491259241), +LPF_TAPS(0.013682460845602765), +LPF_TAPS(-0.013095508248099583), +LPF_TAPS(0.012500193009798911), +LPF_TAPS(-0.011898566205016293), +LPF_TAPS(0.011292665660355928), +LPF_TAPS(-0.010684506164616170), +LPF_TAPS(0.010076069957823945), +LPF_TAPS(-0.009469297555026519), +LPF_TAPS(0.008866078957473053), +LPF_TAPS(-0.008268245300471832), +LPF_TAPS(0.007677560983540607), +LPF_TAPS(-0.007095716324511088), +LPF_TAPS(0.006524320775035389), +LPF_TAPS(-0.005964896730514602), +LPF_TAPS(0.005418873962854633), +LPF_TAPS(-0.004887584699702088), +LPF_TAPS(0.004372259368953546), +LPF_TAPS(-0.003874023022411258), +LPF_TAPS(0.003393892447508970), +LPF_TAPS(-0.002932773971101028), +LPF_TAPS(0.002491461954432157), +LPF_TAPS(-0.002070637973614654), +LPF_TAPS(0.001670870675282794), +LPF_TAPS(-0.001292616292599868), +LPF_TAPS(0.000936219802489234), +LPF_TAPS(-0.000601916700886649), +LPF_TAPS(0.000289835368998426), +LPF_TAPS(-0.000000000000000021), +LPF_TAPS(-0.000267665947613575), +LPF_TAPS(0.000513335806729533), +LPF_TAPS(-0.000737275307646808), +LPF_TAPS(0.000939837774915926), +LPF_TAPS(-0.001121458958325758), +LPF_TAPS(0.001282651542845464), +LPF_TAPS(-0.001423999383428102), +LPF_TAPS(0.001546151511301517), +LPF_TAPS(-0.001649815958715718), +LPF_TAPS(0.001735753449089341), +LPF_TAPS(-0.001804770999109922), +LPF_TAPS(0.001857715478604784), +LPF_TAPS(-0.001895467172926061), +LPF_TAPS(0.001918933391201516), +LPF_TAPS(-0.001929042162111217), +LPF_TAPS(0.001926736056882465), +LPF_TAPS(-0.001912966176969622), +LPF_TAPS(0.001888686341435626), +LPF_TAPS(-0.001854847506395012), +LPF_TAPS(0.001812392446047311), +LPF_TAPS(-0.001762250721854477), +LPF_TAPS(0.001705333963319375), +LPF_TAPS(-0.001642531480640848), +LPF_TAPS(0.001574706226279688), +LPF_TAPS(-0.001502691119198398), +LPF_TAPS(0.001427285742267312), +LPF_TAPS(-0.001349253420085045), +LPF_TAPS(0.001269318681271905), +LPF_TAPS(-0.001188165106185149), +LPF_TAPS(0.001106433557999407), +LPF_TAPS(-0.001024720792217768), +LPF_TAPS(0.000943578436947906), +LPF_TAPS(-0.000863512333713982), +LPF_TAPS(0.000784982226195325), +LPF_TAPS(-0.000708401782100121), +LPF_TAPS(0.000634138931411218), +LPF_TAPS(-0.000562516502490292), +LPF_TAPS(0.000493813136004140), +LPF_TAPS(-0.000428264455346255), +LPF_TAPS(0.000366064471176646), +LPF_TAPS(-0.000307367196884387), +LPF_TAPS(0.000252288451198141), +LPF_TAPS(-0.000200907823821847), +LPF_TAPS(0.000153270779847421), +LPF_TAPS(-0.000109390878791837), +LPF_TAPS(0.000069252084408131), +LPF_TAPS(-0.000032811141918621), +LPF_TAPS(0.000000000000000005), +LPF_TAPS(0.000029271744296376), +LPF_TAPS(-0.000055114398500844), +LPF_TAPS(0.000077655745226952), +LPF_TAPS(-0.000097038648621177), +LPF_TAPS(0.000113418713797108), +LPF_TAPS(-0.000126962014838558), +LPF_TAPS(0.000137842905435368), +LPF_TAPS(-0.000146241924648769), +LPF_TAPS(0.000152343808703457), +LPF_TAPS(-0.000156335618091171), +LPF_TAPS(0.000158404987661415), +LPF_TAPS(-0.000158738505785285), +LPF_TAPS(0.000157520227123526), +LPF_TAPS(-0.000154930322024030), +LPF_TAPS(0.000151143864130082), +LPF_TAPS(-0.000146329756410672), +LPF_TAPS(0.000140649794538436), +LPF_TAPS(-0.000134257865348465), +LPF_TAPS(0.000127299277019925), +LPF_TAPS(-0.000119910216638228), +LPF_TAPS(0.000112217329923088), +LPF_TAPS(-0.000104337417150253), +LPF_TAPS(0.000096377238653759), +LPF_TAPS(-0.000088433422771235), +LPF_TAPS(0.000080592468686167), +LPF_TAPS(-0.000072930836325320), +LPF_TAPS(0.000065515115283168), +LPF_TAPS(-0.000058402264663211), +LPF_TAPS(0.000051639915742486), +LPF_TAPS(-0.000045266729473564), +LPF_TAPS(0.000039312801030250), +LPF_TAPS(-0.000033800103870485), +LPF_TAPS(0.000028742966123913), +LPF_TAPS(-0.000024148572502755), +LPF_TAPS(0.000020017485373424), +LPF_TAPS(-0.000016344179102984), +LPF_TAPS(0.000013117582299463), +LPF_TAPS(-0.000010321623088325), +LPF_TAPS(0.000007935773099930), +LPF_TAPS(-0.000005935586375495), +LPF_TAPS(0.000004293229923365), +LPF_TAPS(-0.000002978003165359), +LPF_TAPS(0.000001956843997497), +LPF_TAPS(-0.000001194819643744), +LPF_TAPS(0.000000655600900104), +LPF_TAPS(-0.000000301918744560), +LPF_TAPS(0.000000096002622039), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000023622972699), +LPF_TAPS(0.000000011699684267), +LPF_TAPS(0.000000000000000000), +}; diff --git a/core/sound/blip_lpf_384K.h b/core/sound/blip_lpf_384K.h new file mode 100644 index 000000000..016afa3bc --- /dev/null +++ b/core/sound/blip_lpf_384K.h @@ -0,0 +1,8 @@ +/* 384K sampling, 2K cutoff, 3K transition */ +enum { blip_lpf_384K_taps = 589 }; + + +#include "blip_lpf_384K_24K.h" +#include "blip_lpf_384K_48K.h" +#include "blip_lpf_384K_96K.h" +#include "blip_lpf_384K_192K.h" diff --git a/core/sound/blip_lpf_384K_192K.h b/core/sound/blip_lpf_384K_192K.h new file mode 100644 index 000000000..740906680 --- /dev/null +++ b/core/sound/blip_lpf_384K_192K.h @@ -0,0 +1,591 @@ +static buf_t const blip_lpf_384K_192K[blip_lpf_384K_taps] = { +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000001818683069), +LPF_TAPS(0.000000005849842142), +LPF_TAPS(-0.000000009919970318), +LPF_TAPS(0.000000011811486367), +LPF_TAPS(-0.000000009268046592), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000018310012110), +LPF_TAPS(-0.000000048001311091), +LPF_TAPS(0.000000091429289498), +LPF_TAPS(-0.000000150959372505), +LPF_TAPS(0.000000228960831633), +LPF_TAPS(-0.000000327800450540), +LPF_TAPS(0.000000449836042893), +LPF_TAPS(-0.000000597409822761), +LPF_TAPS(0.000000772841628323), +LPF_TAPS(-0.000000978422000204), +LPF_TAPS(0.000001216405116219), +LPF_TAPS(-0.000001489001584895), +LPF_TAPS(0.000001798371100741), +LPF_TAPS(-0.000002146614964877), +LPF_TAPS(0.000002535768475343), +LPF_TAPS(-0.000002967793192163), +LPF_TAPS(0.000003444569082966), +LPF_TAPS(-0.000003967886555867), +LPF_TAPS(0.000004539438387109), +LPF_TAPS(-0.000005160811551841), +LPF_TAPS(0.000005833478967426), +LPF_TAPS(-0.000006558791159490), +LPF_TAPS(0.000007337967862007), +LPF_TAPS(-0.000008172089563650), +LPF_TAPS(0.000009062089013671), +LPF_TAPS(-0.000010008742701603), +LPF_TAPS(0.000011012662326107), +LPF_TAPS(-0.000012074286269341), +LPF_TAPS(0.000013193871094264), +LPF_TAPS(-0.000014371483083336), +LPF_TAPS(0.000015606989838136), +LPF_TAPS(-0.000016900051960385), +LPF_TAPS(0.000018250114835954), +LPF_TAPS(-0.000019656400544368), +LPF_TAPS(0.000021117899917293), +LPF_TAPS(-0.000022633364770453), +LPF_TAPS(0.000024201300334306), +LPF_TAPS(-0.000025819957909655), +LPF_TAPS(0.000027487327775239), +LPF_TAPS(-0.000029201132375049), +LPF_TAPS(0.000030958819813886), +LPF_TAPS(-0.000032757557690317), +LPF_TAPS(0.000034594227296746), +LPF_TAPS(-0.000036465418216909), +LPF_TAPS(0.000038367423351500), +LPF_TAPS(-0.000040296234403032), +LPF_TAPS(0.000042247537851347), +LPF_TAPS(-0.000044216711451398), +LPF_TAPS(0.000046198821285030), +LPF_TAPS(-0.000048188619398569), +LPF_TAPS(0.000050180542057917), +LPF_TAPS(-0.000052168708652737), +LPF_TAPS(0.000054146921281024), +LPF_TAPS(-0.000056108665045016), +LPF_TAPS(0.000058047109088909), +LPF_TAPS(-0.000059955108408308), +LPF_TAPS(0.000061825206460594), +LPF_TAPS(-0.000063649638604653), +LPF_TAPS(0.000065420336397474), +LPF_TAPS(-0.000067128932774100), +LPF_TAPS(0.000068766768136256), +LPF_TAPS(-0.000070324897373838), +LPF_TAPS(0.000071794097841849), +LPF_TAPS(-0.000073164878314178), +LPF_TAPS(0.000074427488933831), +LPF_TAPS(-0.000075571932177465), +LPF_TAPS(0.000076587974850560), +LPF_TAPS(-0.000077465161127258), +LPF_TAPS(0.000078192826647125), +LPF_TAPS(-0.000078760113678928), +LPF_TAPS(0.000079155987359146), +LPF_TAPS(-0.000079369253010716), +LPF_TAPS(0.000079388574545169), +LPF_TAPS(-0.000079202493948537), +LPF_TAPS(0.000078799451849036), +LPF_TAPS(-0.000078167809161869), +LPF_TAPS(0.000077295869803477), +LPF_TAPS(-0.000076171904465048), +LPF_TAPS(0.000074784175431958), +LPF_TAPS(-0.000073120962433157), +LPF_TAPS(0.000071170589501115), +LPF_TAPS(-0.000068921452820213), +LPF_TAPS(0.000066362049538439), +LPF_TAPS(-0.000063481007513722), +LPF_TAPS(0.000060267115963468), +LPF_TAPS(-0.000056709356982912), +LPF_TAPS(0.000052796937893741), +LPF_TAPS(-0.000048519324382749), +LPF_TAPS(0.000043866274386062), +LPF_TAPS(-0.000038827872671237), +LPF_TAPS(0.000033394566067721), +LPF_TAPS(-0.000027557199291414), +LPF_TAPS(0.000021307051307166), +LPF_TAPS(-0.000014635872169941), +LPF_TAPS(0.000007535920281846), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000007978500472509), +LPF_TAPS(0.000016405570983717), +LPF_TAPS(-0.000025286541190957), +LPF_TAPS(0.000034626042255596), +LPF_TAPS(-0.000044427968552949), +LPF_TAPS(0.000054695439477278), +LPF_TAPS(-0.000065430761424673), +LPF_TAPS(0.000076635390037745), +LPF_TAPS(-0.000088309892798977), +LPF_TAPS(0.000100453912060380), +LPF_TAPS(-0.000113066128598582), +LPF_TAPS(0.000126144225786715), +LPF_TAPS(-0.000139684854474777), +LPF_TAPS(0.000153683598670829), +LPF_TAPS(-0.000168134942118076), +LPF_TAPS(0.000183032235860659), +LPF_TAPS(-0.000198367666893487), +LPF_TAPS(0.000214132227991698), +LPF_TAPS(-0.000230315688813067), +LPF_TAPS(0.000246906568369384), +LPF_TAPS(-0.000263892108960412), +LPF_TAPS(0.000281258251663605), +LPF_TAPS(-0.000298989613472842), +LPF_TAPS(0.000317069466177310), +LPF_TAPS(-0.000335479717070287), +LPF_TAPS(0.000354200891577032), +LPF_TAPS(-0.000373212117887880), +LPF_TAPS(0.000392491113681582), +LPF_TAPS(-0.000412014175020648), +LPF_TAPS(0.000431756167499303), +LPF_TAPS(-0.000451690519720436), +LPF_TAPS(0.000471789219175841), +LPF_TAPS(-0.000492022810600967), +LPF_TAPS(0.000512360396871137), +LPF_TAPS(-0.000532769642503142), +LPF_TAPS(0.000553216779822719), +LPF_TAPS(-0.000573666617853055), +LPF_TAPS(0.000594082553976388), +LPF_TAPS(-0.000614426588415893), +LPF_TAPS(0.000634659341580137), +LPF_TAPS(-0.000654740074307908), +LPF_TAPS(0.000674626711046154), +LPF_TAPS(-0.000694275865988328), +LPF_TAPS(0.000713642872195339), +LPF_TAPS(-0.000732681813715889), +LPF_TAPS(0.000751345560716971), +LPF_TAPS(-0.000769585807629875), +LPF_TAPS(0.000787353114311179), +LPF_TAPS(-0.000804596950211894), +LPF_TAPS(0.000821265741542208), +LPF_TAPS(-0.000837306921412881), +LPF_TAPS(0.000852666982928181), +LPF_TAPS(-0.000867291535198970), +LPF_TAPS(0.000881125362238082), +LPF_TAPS(-0.000894112484693921), +LPF_TAPS(0.000906196224371776), +LPF_TAPS(-0.000917319271485603), +LPF_TAPS(0.000927423754577199), +LPF_TAPS(-0.000936451313033140), +LPF_TAPS(0.000944343172122700), +LPF_TAPS(-0.000951040220475200), +LPF_TAPS(0.000956483089907740), +LPF_TAPS(-0.000960612237508392), +LPF_TAPS(0.000963368029874411), +LPF_TAPS(-0.000964690829398552), +LPF_TAPS(0.000964521082490530), +LPF_TAPS(-0.000962799409615877), +LPF_TAPS(0.000959466697028092), +LPF_TAPS(-0.000954464190064709), +LPF_TAPS(0.000947733587872965), +LPF_TAPS(-0.000939217139425856), +LPF_TAPS(0.000928857740684234), +LPF_TAPS(-0.000916599032755621), +LPF_TAPS(0.000902385500897409), +LPF_TAPS(-0.000886162574206814), +LPF_TAPS(0.000867876725835767), +LPF_TAPS(-0.000847475573567521), +LPF_TAPS(0.000824907980585085), +LPF_TAPS(-0.000800124156261971), +LPF_TAPS(0.000773075756800786), +LPF_TAPS(-0.000743715985543212), +LPF_TAPS(0.000711999692773278), +LPF_TAPS(-0.000677883474834165), +LPF_TAPS(0.000641325772376801), +LPF_TAPS(-0.000602286967556684), +LPF_TAPS(0.000560729479997027), +LPF_TAPS(-0.000516617861333690), +LPF_TAPS(0.000469918888156992), +LPF_TAPS(-0.000420601653169192), +LPF_TAPS(0.000368637654371840), +LPF_TAPS(-0.000314000882103524), +LPF_TAPS(0.000256667903746495), +LPF_TAPS(-0.000196617945923104), +LPF_TAPS(0.000133832974005865), +LPF_TAPS(-0.000068297768767573), +LPF_TAPS(0.000000000000000002), +LPF_TAPS(0.000071069703067951), +LPF_TAPS(-0.000144917684714879), +LPF_TAPS(0.000221547199195576), +LPF_TAPS(-0.000300958350891157), +LPF_TAPS(0.000383148038288760), +LPF_TAPS(-0.000468109901940947), +LPF_TAPS(0.000555834276542550), +LPF_TAPS(-0.000646308147261596), +LPF_TAPS(0.000739515110453973), +LPF_TAPS(-0.000835435338884242), +LPF_TAPS(0.000934045551568285), +LPF_TAPS(-0.001035318988347563), +LPF_TAPS(0.001139225389298674), +LPF_TAPS(-0.001245730979069405), +LPF_TAPS(0.001354798456232424), +LPF_TAPS(-0.001466386987732098), +LPF_TAPS(0.001580452208496668), +LPF_TAPS(-0.001696946226279024), +LPF_TAPS(0.001815817631778271), +LPF_TAPS(-0.001937011514087372), +LPF_TAPS(0.002060469481503738), +LPF_TAPS(-0.002186129687729117), +LPF_TAPS(0.002313926863475365), +LPF_TAPS(-0.002443792353486666), +LPF_TAPS(0.002575654158974951), +LPF_TAPS(-0.002709436985458192), +LPF_TAPS(0.002845062295982047), +LPF_TAPS(-0.002982448369694321), +LPF_TAPS(0.003121510365731584), +LPF_TAPS(-0.003262160392370767), +LPF_TAPS(0.003404307581384737), +LPF_TAPS(-0.003547858167533667), +LPF_TAPS(0.003692715573114637), +LPF_TAPS(-0.003838780497481271), +LPF_TAPS(0.003985951011435366), +LPF_TAPS(-0.004134122656386202), +LPF_TAPS(0.004283188548159220), +LPF_TAPS(-0.004433039485331522), +LPF_TAPS(0.004583564061959497), +LPF_TAPS(-0.004734648784556964), +LPF_TAPS(0.004886178193172272), +LPF_TAPS(-0.005038034986406997), +LPF_TAPS(0.005190100150207429), +LPF_TAPS(-0.005342253090255694), +LPF_TAPS(0.005494371767777562), +LPF_TAPS(-0.005646332838577949), +LPF_TAPS(0.005798011795107618), +LPF_TAPS(-0.005949283111358818), +LPF_TAPS(0.006100020390380346), +LPF_TAPS(-0.006250096514197633), +LPF_TAPS(0.006399383795917306), +LPF_TAPS(-0.006547754133790769), +LPF_TAPS(0.006695079167006964), +LPF_TAPS(-0.006841230432978989), +LPF_TAPS(0.006986079525887232), +LPF_TAPS(-0.007129498256236060), +LPF_TAPS(0.007271358811179647), +LPF_TAPS(-0.007411533915368887), +LPF_TAPS(0.007549896992069969), +LPF_TAPS(-0.007686322324302492), +LPF_TAPS(0.007820685215744338), +LPF_TAPS(-0.007952862151150037), +LPF_TAPS(0.008082730956027729), +LPF_TAPS(-0.008210170955320985), +LPF_TAPS(0.008335063130842599), +LPF_TAPS(-0.008457290277206927), +LPF_TAPS(0.008576737156010138), +LPF_TAPS(-0.008693290648010277), +LPF_TAPS(0.008806839903059112), +LPF_TAPS(-0.008917276487542697), +LPF_TAPS(0.009024494529091247), +LPF_TAPS(-0.009128390858320101), +LPF_TAPS(0.009228865147370027), +LPF_TAPS(-0.009325820045020628), +LPF_TAPS(0.009419161308151987), +LPF_TAPS(-0.009508797929338439), +LPF_TAPS(0.009594642260365112), +LPF_TAPS(-0.009676610131458962), +LPF_TAPS(0.009754620966039424), +LPF_TAPS(-0.009828597890796587), +LPF_TAPS(0.009898467840912336), +LPF_TAPS(-0.009964161660250772), +LPF_TAPS(0.010025614196349649), +LPF_TAPS(-0.010082764390052302), +LPF_TAPS(0.010135555359632321), +LPF_TAPS(-0.010183934479268833), +LPF_TAPS(0.010227853451738598), +LPF_TAPS(-0.010267268375206008), +LPF_TAPS(0.010302139803996540), +LPF_TAPS(-0.010332432803251270), +LPF_TAPS(0.010358116997370248), +LPF_TAPS(-0.010379166612165125), +LPF_TAPS(0.010395560510646093), +LPF_TAPS(-0.010407282222386030), +LPF_TAPS(0.010414319966410993), +LPF_TAPS(0.989583333419875033), +LPF_TAPS(0.010414319966410993), +LPF_TAPS(-0.010407282222386032), +LPF_TAPS(0.010395560510646093), +LPF_TAPS(-0.010379166612165125), +LPF_TAPS(0.010358116997370248), +LPF_TAPS(-0.010332432803251270), +LPF_TAPS(0.010302139803996540), +LPF_TAPS(-0.010267268375206008), +LPF_TAPS(0.010227853451738598), +LPF_TAPS(-0.010183934479268833), +LPF_TAPS(0.010135555359632320), +LPF_TAPS(-0.010082764390052302), +LPF_TAPS(0.010025614196349649), +LPF_TAPS(-0.009964161660250772), +LPF_TAPS(0.009898467840912336), +LPF_TAPS(-0.009828597890796587), +LPF_TAPS(0.009754620966039424), +LPF_TAPS(-0.009676610131458964), +LPF_TAPS(0.009594642260365114), +LPF_TAPS(-0.009508797929338441), +LPF_TAPS(0.009419161308151989), +LPF_TAPS(-0.009325820045020628), +LPF_TAPS(0.009228865147370027), +LPF_TAPS(-0.009128390858320103), +LPF_TAPS(0.009024494529091247), +LPF_TAPS(-0.008917276487542697), +LPF_TAPS(0.008806839903059114), +LPF_TAPS(-0.008693290648010277), +LPF_TAPS(0.008576737156010138), +LPF_TAPS(-0.008457290277206927), +LPF_TAPS(0.008335063130842599), +LPF_TAPS(-0.008210170955320985), +LPF_TAPS(0.008082730956027731), +LPF_TAPS(-0.007952862151150038), +LPF_TAPS(0.007820685215744340), +LPF_TAPS(-0.007686322324302493), +LPF_TAPS(0.007549896992069970), +LPF_TAPS(-0.007411533915368887), +LPF_TAPS(0.007271358811179648), +LPF_TAPS(-0.007129498256236060), +LPF_TAPS(0.006986079525887232), +LPF_TAPS(-0.006841230432978991), +LPF_TAPS(0.006695079167006965), +LPF_TAPS(-0.006547754133790770), +LPF_TAPS(0.006399383795917307), +LPF_TAPS(-0.006250096514197633), +LPF_TAPS(0.006100020390380349), +LPF_TAPS(-0.005949283111358818), +LPF_TAPS(0.005798011795107618), +LPF_TAPS(-0.005646332838577950), +LPF_TAPS(0.005494371767777562), +LPF_TAPS(-0.005342253090255696), +LPF_TAPS(0.005190100150207429), +LPF_TAPS(-0.005038034986406999), +LPF_TAPS(0.004886178193172272), +LPF_TAPS(-0.004734648784556966), +LPF_TAPS(0.004583564061959497), +LPF_TAPS(-0.004433039485331523), +LPF_TAPS(0.004283188548159220), +LPF_TAPS(-0.004134122656386203), +LPF_TAPS(0.003985951011435367), +LPF_TAPS(-0.003838780497481271), +LPF_TAPS(0.003692715573114637), +LPF_TAPS(-0.003547858167533667), +LPF_TAPS(0.003404307581384739), +LPF_TAPS(-0.003262160392370767), +LPF_TAPS(0.003121510365731586), +LPF_TAPS(-0.002982448369694322), +LPF_TAPS(0.002845062295982047), +LPF_TAPS(-0.002709436985458192), +LPF_TAPS(0.002575654158974950), +LPF_TAPS(-0.002443792353486666), +LPF_TAPS(0.002313926863475365), +LPF_TAPS(-0.002186129687729117), +LPF_TAPS(0.002060469481503738), +LPF_TAPS(-0.001937011514087373), +LPF_TAPS(0.001815817631778272), +LPF_TAPS(-0.001696946226279024), +LPF_TAPS(0.001580452208496668), +LPF_TAPS(-0.001466386987732098), +LPF_TAPS(0.001354798456232424), +LPF_TAPS(-0.001245730979069404), +LPF_TAPS(0.001139225389298675), +LPF_TAPS(-0.001035318988347563), +LPF_TAPS(0.000934045551568285), +LPF_TAPS(-0.000835435338884242), +LPF_TAPS(0.000739515110453974), +LPF_TAPS(-0.000646308147261596), +LPF_TAPS(0.000555834276542550), +LPF_TAPS(-0.000468109901940947), +LPF_TAPS(0.000383148038288759), +LPF_TAPS(-0.000300958350891157), +LPF_TAPS(0.000221547199195576), +LPF_TAPS(-0.000144917684714879), +LPF_TAPS(0.000071069703067951), +LPF_TAPS(0.000000000000000002), +LPF_TAPS(-0.000068297768767573), +LPF_TAPS(0.000133832974005865), +LPF_TAPS(-0.000196617945923104), +LPF_TAPS(0.000256667903746495), +LPF_TAPS(-0.000314000882103524), +LPF_TAPS(0.000368637654371840), +LPF_TAPS(-0.000420601653169192), +LPF_TAPS(0.000469918888156992), +LPF_TAPS(-0.000516617861333690), +LPF_TAPS(0.000560729479997027), +LPF_TAPS(-0.000602286967556683), +LPF_TAPS(0.000641325772376801), +LPF_TAPS(-0.000677883474834166), +LPF_TAPS(0.000711999692773278), +LPF_TAPS(-0.000743715985543212), +LPF_TAPS(0.000773075756800786), +LPF_TAPS(-0.000800124156261972), +LPF_TAPS(0.000824907980585086), +LPF_TAPS(-0.000847475573567521), +LPF_TAPS(0.000867876725835767), +LPF_TAPS(-0.000886162574206813), +LPF_TAPS(0.000902385500897410), +LPF_TAPS(-0.000916599032755622), +LPF_TAPS(0.000928857740684235), +LPF_TAPS(-0.000939217139425856), +LPF_TAPS(0.000947733587872965), +LPF_TAPS(-0.000954464190064709), +LPF_TAPS(0.000959466697028092), +LPF_TAPS(-0.000962799409615878), +LPF_TAPS(0.000964521082490530), +LPF_TAPS(-0.000964690829398553), +LPF_TAPS(0.000963368029874411), +LPF_TAPS(-0.000960612237508392), +LPF_TAPS(0.000956483089907740), +LPF_TAPS(-0.000951040220475200), +LPF_TAPS(0.000944343172122701), +LPF_TAPS(-0.000936451313033140), +LPF_TAPS(0.000927423754577199), +LPF_TAPS(-0.000917319271485603), +LPF_TAPS(0.000906196224371776), +LPF_TAPS(-0.000894112484693922), +LPF_TAPS(0.000881125362238083), +LPF_TAPS(-0.000867291535198970), +LPF_TAPS(0.000852666982928181), +LPF_TAPS(-0.000837306921412881), +LPF_TAPS(0.000821265741542209), +LPF_TAPS(-0.000804596950211894), +LPF_TAPS(0.000787353114311179), +LPF_TAPS(-0.000769585807629876), +LPF_TAPS(0.000751345560716971), +LPF_TAPS(-0.000732681813715889), +LPF_TAPS(0.000713642872195338), +LPF_TAPS(-0.000694275865988328), +LPF_TAPS(0.000674626711046154), +LPF_TAPS(-0.000654740074307908), +LPF_TAPS(0.000634659341580137), +LPF_TAPS(-0.000614426588415894), +LPF_TAPS(0.000594082553976388), +LPF_TAPS(-0.000573666617853055), +LPF_TAPS(0.000553216779822720), +LPF_TAPS(-0.000532769642503142), +LPF_TAPS(0.000512360396871137), +LPF_TAPS(-0.000492022810600967), +LPF_TAPS(0.000471789219175841), +LPF_TAPS(-0.000451690519720436), +LPF_TAPS(0.000431756167499303), +LPF_TAPS(-0.000412014175020649), +LPF_TAPS(0.000392491113681583), +LPF_TAPS(-0.000373212117887881), +LPF_TAPS(0.000354200891577031), +LPF_TAPS(-0.000335479717070286), +LPF_TAPS(0.000317069466177310), +LPF_TAPS(-0.000298989613472842), +LPF_TAPS(0.000281258251663605), +LPF_TAPS(-0.000263892108960412), +LPF_TAPS(0.000246906568369384), +LPF_TAPS(-0.000230315688813067), +LPF_TAPS(0.000214132227991698), +LPF_TAPS(-0.000198367666893488), +LPF_TAPS(0.000183032235860659), +LPF_TAPS(-0.000168134942118076), +LPF_TAPS(0.000153683598670829), +LPF_TAPS(-0.000139684854474777), +LPF_TAPS(0.000126144225786715), +LPF_TAPS(-0.000113066128598582), +LPF_TAPS(0.000100453912060380), +LPF_TAPS(-0.000088309892798977), +LPF_TAPS(0.000076635390037745), +LPF_TAPS(-0.000065430761424673), +LPF_TAPS(0.000054695439477278), +LPF_TAPS(-0.000044427968552949), +LPF_TAPS(0.000034626042255596), +LPF_TAPS(-0.000025286541190957), +LPF_TAPS(0.000016405570983717), +LPF_TAPS(-0.000007978500472509), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000007535920281846), +LPF_TAPS(-0.000014635872169941), +LPF_TAPS(0.000021307051307166), +LPF_TAPS(-0.000027557199291414), +LPF_TAPS(0.000033394566067721), +LPF_TAPS(-0.000038827872671237), +LPF_TAPS(0.000043866274386062), +LPF_TAPS(-0.000048519324382749), +LPF_TAPS(0.000052796937893741), +LPF_TAPS(-0.000056709356982912), +LPF_TAPS(0.000060267115963468), +LPF_TAPS(-0.000063481007513722), +LPF_TAPS(0.000066362049538439), +LPF_TAPS(-0.000068921452820214), +LPF_TAPS(0.000071170589501115), +LPF_TAPS(-0.000073120962433157), +LPF_TAPS(0.000074784175431958), +LPF_TAPS(-0.000076171904465048), +LPF_TAPS(0.000077295869803477), +LPF_TAPS(-0.000078167809161870), +LPF_TAPS(0.000078799451849036), +LPF_TAPS(-0.000079202493948537), +LPF_TAPS(0.000079388574545169), +LPF_TAPS(-0.000079369253010717), +LPF_TAPS(0.000079155987359147), +LPF_TAPS(-0.000078760113678928), +LPF_TAPS(0.000078192826647125), +LPF_TAPS(-0.000077465161127258), +LPF_TAPS(0.000076587974850560), +LPF_TAPS(-0.000075571932177465), +LPF_TAPS(0.000074427488933831), +LPF_TAPS(-0.000073164878314178), +LPF_TAPS(0.000071794097841849), +LPF_TAPS(-0.000070324897373838), +LPF_TAPS(0.000068766768136256), +LPF_TAPS(-0.000067128932774100), +LPF_TAPS(0.000065420336397474), +LPF_TAPS(-0.000063649638604653), +LPF_TAPS(0.000061825206460594), +LPF_TAPS(-0.000059955108408308), +LPF_TAPS(0.000058047109088909), +LPF_TAPS(-0.000056108665045016), +LPF_TAPS(0.000054146921281024), +LPF_TAPS(-0.000052168708652737), +LPF_TAPS(0.000050180542057917), +LPF_TAPS(-0.000048188619398569), +LPF_TAPS(0.000046198821285030), +LPF_TAPS(-0.000044216711451398), +LPF_TAPS(0.000042247537851347), +LPF_TAPS(-0.000040296234403032), +LPF_TAPS(0.000038367423351500), +LPF_TAPS(-0.000036465418216909), +LPF_TAPS(0.000034594227296746), +LPF_TAPS(-0.000032757557690317), +LPF_TAPS(0.000030958819813886), +LPF_TAPS(-0.000029201132375049), +LPF_TAPS(0.000027487327775239), +LPF_TAPS(-0.000025819957909655), +LPF_TAPS(0.000024201300334306), +LPF_TAPS(-0.000022633364770453), +LPF_TAPS(0.000021117899917293), +LPF_TAPS(-0.000019656400544368), +LPF_TAPS(0.000018250114835954), +LPF_TAPS(-0.000016900051960385), +LPF_TAPS(0.000015606989838136), +LPF_TAPS(-0.000014371483083336), +LPF_TAPS(0.000013193871094264), +LPF_TAPS(-0.000012074286269341), +LPF_TAPS(0.000011012662326106), +LPF_TAPS(-0.000010008742701603), +LPF_TAPS(0.000009062089013671), +LPF_TAPS(-0.000008172089563650), +LPF_TAPS(0.000007337967862007), +LPF_TAPS(-0.000006558791159490), +LPF_TAPS(0.000005833478967426), +LPF_TAPS(-0.000005160811551841), +LPF_TAPS(0.000004539438387109), +LPF_TAPS(-0.000003967886555867), +LPF_TAPS(0.000003444569082966), +LPF_TAPS(-0.000002967793192163), +LPF_TAPS(0.000002535768475343), +LPF_TAPS(-0.000002146614964877), +LPF_TAPS(0.000001798371100741), +LPF_TAPS(-0.000001489001584895), +LPF_TAPS(0.000001216405116219), +LPF_TAPS(-0.000000978422000204), +LPF_TAPS(0.000000772841628323), +LPF_TAPS(-0.000000597409822761), +LPF_TAPS(0.000000449836042893), +LPF_TAPS(-0.000000327800450540), +LPF_TAPS(0.000000228960831633), +LPF_TAPS(-0.000000150959372505), +LPF_TAPS(0.000000091429289498), +LPF_TAPS(-0.000000048001311091), +LPF_TAPS(0.000000018310012110), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000009268046592), +LPF_TAPS(0.000000011811486367), +LPF_TAPS(-0.000000009919970318), +LPF_TAPS(0.000000005849842142), +LPF_TAPS(-0.000000001818683069), +LPF_TAPS(0.000000000000000000), +}; diff --git a/core/sound/blip_lpf_384K_24K.h b/core/sound/blip_lpf_384K_24K.h new file mode 100644 index 000000000..4ce080319 --- /dev/null +++ b/core/sound/blip_lpf_384K_24K.h @@ -0,0 +1,591 @@ +static buf_t const blip_lpf_384K_24K[blip_lpf_384K_taps] = { +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000010873062592), +LPF_TAPS(-0.000000044433940061), +LPF_TAPS(-0.000000089256106800), +LPF_TAPS(-0.000000119074580424), +LPF_TAPS(-0.000000099778720099), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000197123477448), +LPF_TAPS(0.000000483913353528), +LPF_TAPS(0.000000822645851364), +LPF_TAPS(0.000001146649695244), +LPF_TAPS(0.000001368850624164), +LPF_TAPS(0.000001397075841614), +LPF_TAPS(0.000001153882516618), +LPF_TAPS(0.000000597409520936), +LPF_TAPS(-0.000000260956550586), +LPF_TAPS(-0.000001346271422868), +LPF_TAPS(-0.000002520396942092), +LPF_TAPS(-0.000003594766004492), +LPF_TAPS(-0.000004355165268430), +LPF_TAPS(-0.000004595851995894), +LPF_TAPS(-0.000004158226808320), +LPF_TAPS(-0.000002967791692768), +LPF_TAPS(-0.000001062561235713), +LPF_TAPS(0.000001393335763527), +LPF_TAPS(0.000004115402656697), +LPF_TAPS(0.000006725697160838), +LPF_TAPS(0.000008799412983442), +LPF_TAPS(0.000009926118931399), +LPF_TAPS(0.000009777591229902), +LPF_TAPS(0.000008172085434929), +LPF_TAPS(0.000005124222565588), +LPF_TAPS(0.000000870667867161), +LPF_TAPS(-0.000004135526887174), +LPF_TAPS(-0.000009264921034204), +LPF_TAPS(-0.000013783975093675), +LPF_TAPS(-0.000016952311588863), +LPF_TAPS(-0.000018132931135849), +LPF_TAPS(-0.000016900043422104), +LPF_TAPS(-0.000013127866291288), +LPF_TAPS(-0.000007044856417201), +LPF_TAPS(0.000000758574386669), +LPF_TAPS(0.000009375041913578), +LPF_TAPS(0.000017676791840063), +LPF_TAPS(0.000024455030013144), +LPF_TAPS(0.000028585852155228), +LPF_TAPS(0.000029201117621990), +LPF_TAPS(0.000025839774290033), +LPF_TAPS(0.000018555656501166), +LPF_TAPS(0.000007961867914031), +LPF_TAPS(-0.000004800760958373), +LPF_TAPS(-0.000018173780752453), +LPF_TAPS(-0.000030361303691115), +LPF_TAPS(-0.000039560882481565), +LPF_TAPS(-0.000044216689112137), +LPF_TAPS(-0.000043260891228141), +LPF_TAPS(-0.000036307841903594), +LPF_TAPS(-0.000023769387926964), +LPF_TAPS(-0.000006868137320104), +LPF_TAPS(0.000012461924109274), +LPF_TAPS(0.000031782989597605), +LPF_TAPS(0.000048449010849361), +LPF_TAPS(0.000059955078117661), +LPF_TAPS(0.000064296035824224), +LPF_TAPS(0.000060284909365420), +LPF_TAPS(0.000047783451824105), +LPF_TAPS(0.000027805700334601), +LPF_TAPS(0.000002470165554645), +LPF_TAPS(-0.000025204452027464), +LPF_TAPS(-0.000051643692406506), +LPF_TAPS(-0.000073164841349667), +LPF_TAPS(-0.000086473339538773), +LPF_TAPS(-0.000089143126997813), +LPF_TAPS(-0.000080013419130200), +LPF_TAPS(-0.000059441078730119), +LPF_TAPS(-0.000029363338982690), +LPF_TAPS(0.000006851400044803), +LPF_TAPS(0.000044759314989653), +LPF_TAPS(0.000079369212911613), +LPF_TAPS(0.000105782560625035), +LPF_TAPS(0.000119865590392991), +LPF_TAPS(0.000118863704413853), +LPF_TAPS(0.000101870220772043), +LPF_TAPS(0.000070075546976098), +LPF_TAPS(0.000026748002286040), +LPF_TAPS(-0.000023069000488844), +LPF_TAPS(-0.000073120925490834), +LPF_TAPS(-0.000116707600123990), +LPF_TAPS(-0.000147559204462142), +LPF_TAPS(-0.000160710819459113), +LPF_TAPS(-0.000153256631864033), +LPF_TAPS(-0.000124873738820864), +LPF_TAPS(-0.000078029916231798), +LPF_TAPS(-0.000017827335238358), +LPF_TAPS(0.000048519299869729), +LPF_TAPS(0.000112522168650018), +LPF_TAPS(0.000165483246898999), +LPF_TAPS(0.000199650622682477), +LPF_TAPS(0.000209317604100970), +LPF_TAPS(0.000191712715464584), +LPF_TAPS(0.000147547927809313), +LPF_TAPS(0.000081130848127410), +LPF_TAPS(-0.000000000000000002), +LPF_TAPS(-0.000085895615387418), +LPF_TAPS(-0.000165388708993206), +LPF_TAPS(-0.000227518646599173), +LPF_TAPS(-0.000263010769991375), +LPF_TAPS(-0.000265614219035522), +LPF_TAPS(-0.000233110348123005), +LPF_TAPS(-0.000167837621839738), +LPF_TAPS(-0.000076635351319839), +LPF_TAPS(0.000029818586580912), +LPF_TAPS(0.000138220758623487), +LPF_TAPS(0.000234273533524654), +LPF_TAPS(0.000304538946849493), +LPF_TAPS(0.000338278693693145), +LPF_TAPS(0.000329032958981615), +LPF_TAPS(0.000275712562297710), +LPF_TAPS(0.000183032143388698), +LPF_TAPS(0.000061191338650244), +LPF_TAPS(-0.000075193201011075), +LPF_TAPS(-0.000208801555785383), +LPF_TAPS(-0.000321774742052341), +LPF_TAPS(-0.000398063601974186), +LPF_TAPS(-0.000425658141654782), +LPF_TAPS(-0.000398393435008102), +LPF_TAPS(-0.000317069305986801), +LPF_TAPS(-0.000189699387626334), +LPF_TAPS(-0.000030812195298653), +LPF_TAPS(0.000140150374400007), +LPF_TAPS(0.000301168871912543), +LPF_TAPS(0.000430441762402456), +LPF_TAPS(0.000509290867158166), +LPF_TAPS(0.000524795183039878), +LPF_TAPS(0.000471788980817478), +LPF_TAPS(0.000353927069933187), +LPF_TAPS(0.000183630030415289), +LPF_TAPS(-0.000019137575534522), +LPF_TAPS(-0.000229149777363345), +LPF_TAPS(-0.000419009939519924), +LPF_TAPS(-0.000562677396245674), +LPF_TAPS(-0.000638981997825178), +LPF_TAPS(-0.000634659020936191), +LPF_TAPS(-0.000546478704306668), +LPF_TAPS(-0.000382145141436608), +LPF_TAPS(-0.000159787721040352), +LPF_TAPS(0.000093952819042894), +LPF_TAPS(0.000347054805369461), +LPF_TAPS(0.000566103286916117), +LPF_TAPS(0.000720645397188631), +LPF_TAPS(0.000787352716522965), +LPF_TAPS(0.000753430069803305), +LPF_TAPS(0.000618784830877275), +LPF_TAPS(0.000396613352761790), +LPF_TAPS(0.000112255681198712), +LPF_TAPS(-0.000199607309825992), +LPF_TAPS(-0.000499117172004200), +LPF_TAPS(-0.000746270850545457), +LPF_TAPS(-0.000906195766541403), +LPF_TAPS(-0.000953979713424516), +LPF_TAPS(-0.000878397084629140), +LPF_TAPS(-0.000683990310445222), +LPF_TAPS(-0.000391159551805093), +LPF_TAPS(-0.000034162239368962), +LPF_TAPS(0.000342803659229069), +LPF_TAPS(0.000690997789610670), +LPF_TAPS(0.000963367543159580), +LPF_TAPS(0.001120822949094585), +LPF_TAPS(0.001137729615627804), +LPF_TAPS(0.001005861205368310), +LPF_TAPS(0.000736224318739697), +LPF_TAPS(0.000358424893452024), +LPF_TAPS(-0.000082444039795107), +LPF_TAPS(-0.000531086999098461), +LPF_TAPS(-0.000928857271404751), +LPF_TAPS(-0.001221336864993682), +LPF_TAPS(-0.001365676324503511), +LPF_TAPS(-0.001336716992459966), +LPF_TAPS(-0.001131038398181634), +LPF_TAPS(-0.000768311612478299), +LPF_TAPS(-0.000289669015175886), +LPF_TAPS(0.000246817785251053), +LPF_TAPS(0.000773075366225870), +LPF_TAPS(0.001219567077567143), +LPF_TAPS(0.001524374544410374), +LPF_TAPS(0.001641649248269317), +LPF_TAPS(0.001548296595337379), +LPF_TAPS(0.001247941340472507), +LPF_TAPS(0.000771542416995697), +LPF_TAPS(0.000174440415894133), +LPF_TAPS(-0.000469918650743609), +LPF_TAPS(-0.001078892858232290), +LPF_TAPS(-0.001571122798593491), +LPF_TAPS(-0.001877265645783939), +LPF_TAPS(-0.001949585300513400), +LPF_TAPS(-0.001769093234844250), +LPF_TAPS(-0.001349204048643017), +LPF_TAPS(-0.000735285897155893), +LPF_TAPS(0.000000000000000010), +LPF_TAPS(0.000765128221959373), +LPF_TAPS(0.001460951819905955), +LPF_TAPS(0.001993397141117926), +LPF_TAPS(0.002286004476599548), +LPF_TAPS(0.002290664423330716), +LPF_TAPS(0.001995070580731165), +LPF_TAPS(0.001425780490409142), +LPF_TAPS(0.000646307820732324), +LPF_TAPS(-0.000249703568309774), +LPF_TAPS(-0.001149527220523168), +LPF_TAPS(-0.001935346637858005), +LPF_TAPS(-0.002499479880257908), +LPF_TAPS(-0.002758893782458384), +LPF_TAPS(-0.002667080636341654), +LPF_TAPS(-0.002221637864557989), +LPF_TAPS(-0.001466386246880898), +LPF_TAPS(-0.000487528980025600), +LPF_TAPS(0.000595887970224335), +LPF_TAPS(0.001646199390461799), +LPF_TAPS(0.002524361277280395), +LPF_TAPS(0.003108080445438140), +LPF_TAPS(0.003308503465377861), +LPF_TAPS(0.003083228413154061), +LPF_TAPS(0.002443791118828701), +LPF_TAPS(0.001456421929056373), +LPF_TAPS(0.000235695910232274), +LPF_TAPS(-0.001068391209347100), +LPF_TAPS(-0.002288511968112811), +LPF_TAPS(-0.003261121836683584), +LPF_TAPS(-0.003847978604827186), +LPF_TAPS(-0.003955283855420899), +LPF_TAPS(-0.003547856375077202), +LPF_TAPS(-0.002656283356645106), +LPF_TAPS(-0.001375819411131076), +LPF_TAPS(0.000143179026116892), +LPF_TAPS(0.001712408807641796), +LPF_TAPS(0.003128469600049731), +LPF_TAPS(0.004198694437944632), +LPF_TAPS(0.004766745086702058), +LPF_TAPS(0.004734646392507615), +LPF_TAPS(0.004078247892247627), +LPF_TAPS(0.002853816134047740), +LPF_TAPS(0.001194502525004682), +LPF_TAPS(-0.000703320606742842), +LPF_TAPS(-0.002602559649764842), +LPF_TAPS(-0.004254244313217478), +LPF_TAPS(-0.005429297774939240), +LPF_TAPS(-0.005949280105649362), +LPF_TAPS(-0.005712100682603256), +LPF_TAPS(-0.004709151641029054), +LPF_TAPS(-0.003031243380414721), +LPF_TAPS(-0.000862027749786030), +LPF_TAPS(0.001540873728568918), +LPF_TAPS(0.003875243788312313), +LPF_TAPS(0.005830930222998419), +LPF_TAPS(0.007129494654255819), +LPF_TAPS(0.007561956900417036), +LPF_TAPS(0.007019735856192181), +LPF_TAPS(0.005514495324598487), +LPF_TAPS(0.003183777342981615), +LPF_TAPS(0.000280926205451193), +LPF_TAPS(-0.002850306791123200), +LPF_TAPS(-0.005814155812879863), +LPF_TAPS(-0.008210166807360992), +LPF_TAPS(-0.009684066391535082), +LPF_TAPS(-0.009976049037200873), +LPF_TAPS(-0.008960337000324321), +LPF_TAPS(-0.006670593158430466), +LPF_TAPS(-0.003307186049262837), +LPF_TAPS(0.000775720420812459), +LPF_TAPS(0.005102964497395414), +LPF_TAPS(0.009128386246455083), +LPF_TAPS(0.012297147197125468), +LPF_TAPS(0.014113759174320867), +LPF_TAPS(0.014208175048013237), +LPF_TAPS(0.012392100465967349), +LPF_TAPS(0.008698392373932410), +LPF_TAPS(0.003397971886552389), +LPF_TAPS(-0.003009050437933545), +LPF_TAPS(-0.009828592925171522), +LPF_TAPS(-0.016231795109683190), +LPF_TAPS(-0.021333035035610928), +LPF_TAPS(-0.024279308494577493), +LPF_TAPS(-0.024341934238586781), +LPF_TAPS(-0.021000916877291515), +LPF_TAPS(-0.014012706131845489), +LPF_TAPS(-0.003453521729232617), +LPF_TAPS(0.010267263187954912), +LPF_TAPS(0.026426203927856780), +LPF_TAPS(0.044036523533624770), +LPF_TAPS(0.061926377607317312), +LPF_TAPS(0.078837557650514617), +LPF_TAPS(0.093535285832901924), +LPF_TAPS(0.104918443411417636), +LPF_TAPS(0.112119366971203394), +LPF_TAPS(0.114583275453318756), +LPF_TAPS(0.112119366971203394), +LPF_TAPS(0.104918443411417650), +LPF_TAPS(0.093535285832901924), +LPF_TAPS(0.078837557650514617), +LPF_TAPS(0.061926377607317312), +LPF_TAPS(0.044036523533624770), +LPF_TAPS(0.026426203927856780), +LPF_TAPS(0.010267263187954912), +LPF_TAPS(-0.003453521729232617), +LPF_TAPS(-0.014012706131845489), +LPF_TAPS(-0.021000916877291515), +LPF_TAPS(-0.024341934238586785), +LPF_TAPS(-0.024279308494577493), +LPF_TAPS(-0.021333035035610928), +LPF_TAPS(-0.016231795109683190), +LPF_TAPS(-0.009828592925171522), +LPF_TAPS(-0.003009050437933545), +LPF_TAPS(0.003397971886552389), +LPF_TAPS(0.008698392373932410), +LPF_TAPS(0.012392100465967353), +LPF_TAPS(0.014208175048013239), +LPF_TAPS(0.014113759174320867), +LPF_TAPS(0.012297147197125468), +LPF_TAPS(0.009128386246455084), +LPF_TAPS(0.005102964497395414), +LPF_TAPS(0.000775720420812459), +LPF_TAPS(-0.003307186049262837), +LPF_TAPS(-0.006670593158430466), +LPF_TAPS(-0.008960337000324321), +LPF_TAPS(-0.009976049037200873), +LPF_TAPS(-0.009684066391535082), +LPF_TAPS(-0.008210166807360992), +LPF_TAPS(-0.005814155812879864), +LPF_TAPS(-0.002850306791123202), +LPF_TAPS(0.000280926205451193), +LPF_TAPS(0.003183777342981615), +LPF_TAPS(0.005514495324598487), +LPF_TAPS(0.007019735856192181), +LPF_TAPS(0.007561956900417038), +LPF_TAPS(0.007129494654255819), +LPF_TAPS(0.005830930222998419), +LPF_TAPS(0.003875243788312314), +LPF_TAPS(0.001540873728568918), +LPF_TAPS(-0.000862027749786030), +LPF_TAPS(-0.003031243380414722), +LPF_TAPS(-0.004709151641029054), +LPF_TAPS(-0.005712100682603258), +LPF_TAPS(-0.005949280105649362), +LPF_TAPS(-0.005429297774939240), +LPF_TAPS(-0.004254244313217479), +LPF_TAPS(-0.002602559649764842), +LPF_TAPS(-0.000703320606742842), +LPF_TAPS(0.001194502525004682), +LPF_TAPS(0.002853816134047741), +LPF_TAPS(0.004078247892247627), +LPF_TAPS(0.004734646392507617), +LPF_TAPS(0.004766745086702059), +LPF_TAPS(0.004198694437944634), +LPF_TAPS(0.003128469600049731), +LPF_TAPS(0.001712408807641796), +LPF_TAPS(0.000143179026116892), +LPF_TAPS(-0.001375819411131076), +LPF_TAPS(-0.002656283356645106), +LPF_TAPS(-0.003547856375077202), +LPF_TAPS(-0.003955283855420901), +LPF_TAPS(-0.003847978604827186), +LPF_TAPS(-0.003261121836683586), +LPF_TAPS(-0.002288511968112812), +LPF_TAPS(-0.001068391209347100), +LPF_TAPS(0.000235695910232274), +LPF_TAPS(0.001456421929056373), +LPF_TAPS(0.002443791118828701), +LPF_TAPS(0.003083228413154060), +LPF_TAPS(0.003308503465377862), +LPF_TAPS(0.003108080445438140), +LPF_TAPS(0.002524361277280396), +LPF_TAPS(0.001646199390461799), +LPF_TAPS(0.000595887970224335), +LPF_TAPS(-0.000487528980025600), +LPF_TAPS(-0.001466386246880898), +LPF_TAPS(-0.002221637864557990), +LPF_TAPS(-0.002667080636341652), +LPF_TAPS(-0.002758893782458385), +LPF_TAPS(-0.002499479880257908), +LPF_TAPS(-0.001935346637858006), +LPF_TAPS(-0.001149527220523168), +LPF_TAPS(-0.000249703568309774), +LPF_TAPS(0.000646307820732324), +LPF_TAPS(0.001425780490409142), +LPF_TAPS(0.001995070580731166), +LPF_TAPS(0.002290664423330716), +LPF_TAPS(0.002286004476599548), +LPF_TAPS(0.001993397141117926), +LPF_TAPS(0.001460951819905955), +LPF_TAPS(0.000765128221959373), +LPF_TAPS(0.000000000000000010), +LPF_TAPS(-0.000735285897155893), +LPF_TAPS(-0.001349204048643017), +LPF_TAPS(-0.001769093234844250), +LPF_TAPS(-0.001949585300513400), +LPF_TAPS(-0.001877265645783941), +LPF_TAPS(-0.001571122798593491), +LPF_TAPS(-0.001078892858232290), +LPF_TAPS(-0.000469918650743609), +LPF_TAPS(0.000174440415894133), +LPF_TAPS(0.000771542416995697), +LPF_TAPS(0.001247941340472507), +LPF_TAPS(0.001548296595337380), +LPF_TAPS(0.001641649248269319), +LPF_TAPS(0.001524374544410374), +LPF_TAPS(0.001219567077567144), +LPF_TAPS(0.000773075366225870), +LPF_TAPS(0.000246817785251053), +LPF_TAPS(-0.000289669015175886), +LPF_TAPS(-0.000768311612478299), +LPF_TAPS(-0.001131038398181634), +LPF_TAPS(-0.001336716992459966), +LPF_TAPS(-0.001365676324503511), +LPF_TAPS(-0.001221336864993683), +LPF_TAPS(-0.000928857271404751), +LPF_TAPS(-0.000531086999098461), +LPF_TAPS(-0.000082444039795107), +LPF_TAPS(0.000358424893452024), +LPF_TAPS(0.000736224318739697), +LPF_TAPS(0.001005861205368311), +LPF_TAPS(0.001137729615627805), +LPF_TAPS(0.001120822949094585), +LPF_TAPS(0.000963367543159579), +LPF_TAPS(0.000690997789610670), +LPF_TAPS(0.000342803659229069), +LPF_TAPS(-0.000034162239368962), +LPF_TAPS(-0.000391159551805093), +LPF_TAPS(-0.000683990310445222), +LPF_TAPS(-0.000878397084629141), +LPF_TAPS(-0.000953979713424516), +LPF_TAPS(-0.000906195766541403), +LPF_TAPS(-0.000746270850545458), +LPF_TAPS(-0.000499117172004201), +LPF_TAPS(-0.000199607309825992), +LPF_TAPS(0.000112255681198712), +LPF_TAPS(0.000396613352761790), +LPF_TAPS(0.000618784830877275), +LPF_TAPS(0.000753430069803305), +LPF_TAPS(0.000787352716522965), +LPF_TAPS(0.000720645397188631), +LPF_TAPS(0.000566103286916117), +LPF_TAPS(0.000347054805369461), +LPF_TAPS(0.000093952819042894), +LPF_TAPS(-0.000159787721040352), +LPF_TAPS(-0.000382145141436609), +LPF_TAPS(-0.000546478704306668), +LPF_TAPS(-0.000634659020936191), +LPF_TAPS(-0.000638981997825179), +LPF_TAPS(-0.000562677396245674), +LPF_TAPS(-0.000419009939519924), +LPF_TAPS(-0.000229149777363346), +LPF_TAPS(-0.000019137575534522), +LPF_TAPS(0.000183630030415289), +LPF_TAPS(0.000353927069933187), +LPF_TAPS(0.000471788980817478), +LPF_TAPS(0.000524795183039879), +LPF_TAPS(0.000509290867158167), +LPF_TAPS(0.000430441762402456), +LPF_TAPS(0.000301168871912543), +LPF_TAPS(0.000140150374400007), +LPF_TAPS(-0.000030812195298653), +LPF_TAPS(-0.000189699387626334), +LPF_TAPS(-0.000317069305986801), +LPF_TAPS(-0.000398393435008102), +LPF_TAPS(-0.000425658141654782), +LPF_TAPS(-0.000398063601974186), +LPF_TAPS(-0.000321774742052341), +LPF_TAPS(-0.000208801555785383), +LPF_TAPS(-0.000075193201011075), +LPF_TAPS(0.000061191338650244), +LPF_TAPS(0.000183032143388699), +LPF_TAPS(0.000275712562297710), +LPF_TAPS(0.000329032958981615), +LPF_TAPS(0.000338278693693145), +LPF_TAPS(0.000304538946849494), +LPF_TAPS(0.000234273533524654), +LPF_TAPS(0.000138220758623487), +LPF_TAPS(0.000029818586580912), +LPF_TAPS(-0.000076635351319839), +LPF_TAPS(-0.000167837621839738), +LPF_TAPS(-0.000233110348123005), +LPF_TAPS(-0.000265614219035522), +LPF_TAPS(-0.000263010769991375), +LPF_TAPS(-0.000227518646599173), +LPF_TAPS(-0.000165388708993206), +LPF_TAPS(-0.000085895615387418), +LPF_TAPS(-0.000000000000000002), +LPF_TAPS(0.000081130848127410), +LPF_TAPS(0.000147547927809313), +LPF_TAPS(0.000191712715464584), +LPF_TAPS(0.000209317604100970), +LPF_TAPS(0.000199650622682477), +LPF_TAPS(0.000165483246899000), +LPF_TAPS(0.000112522168650018), +LPF_TAPS(0.000048519299869729), +LPF_TAPS(-0.000017827335238358), +LPF_TAPS(-0.000078029916231798), +LPF_TAPS(-0.000124873738820864), +LPF_TAPS(-0.000153256631864033), +LPF_TAPS(-0.000160710819459113), +LPF_TAPS(-0.000147559204462142), +LPF_TAPS(-0.000116707600123990), +LPF_TAPS(-0.000073120925490834), +LPF_TAPS(-0.000023069000488844), +LPF_TAPS(0.000026748002286040), +LPF_TAPS(0.000070075546976099), +LPF_TAPS(0.000101870220772043), +LPF_TAPS(0.000118863704413853), +LPF_TAPS(0.000119865590392991), +LPF_TAPS(0.000105782560625035), +LPF_TAPS(0.000079369212911613), +LPF_TAPS(0.000044759314989653), +LPF_TAPS(0.000006851400044803), +LPF_TAPS(-0.000029363338982690), +LPF_TAPS(-0.000059441078730119), +LPF_TAPS(-0.000080013419130200), +LPF_TAPS(-0.000089143126997813), +LPF_TAPS(-0.000086473339538773), +LPF_TAPS(-0.000073164841349667), +LPF_TAPS(-0.000051643692406506), +LPF_TAPS(-0.000025204452027464), +LPF_TAPS(0.000002470165554645), +LPF_TAPS(0.000027805700334601), +LPF_TAPS(0.000047783451824105), +LPF_TAPS(0.000060284909365420), +LPF_TAPS(0.000064296035824224), +LPF_TAPS(0.000059955078117661), +LPF_TAPS(0.000048449010849361), +LPF_TAPS(0.000031782989597605), +LPF_TAPS(0.000012461924109274), +LPF_TAPS(-0.000006868137320104), +LPF_TAPS(-0.000023769387926964), +LPF_TAPS(-0.000036307841903594), +LPF_TAPS(-0.000043260891228141), +LPF_TAPS(-0.000044216689112137), +LPF_TAPS(-0.000039560882481565), +LPF_TAPS(-0.000030361303691115), +LPF_TAPS(-0.000018173780752453), +LPF_TAPS(-0.000004800760958373), +LPF_TAPS(0.000007961867914031), +LPF_TAPS(0.000018555656501166), +LPF_TAPS(0.000025839774290034), +LPF_TAPS(0.000029201117621990), +LPF_TAPS(0.000028585852155228), +LPF_TAPS(0.000024455030013144), +LPF_TAPS(0.000017676791840063), +LPF_TAPS(0.000009375041913578), +LPF_TAPS(0.000000758574386669), +LPF_TAPS(-0.000007044856417201), +LPF_TAPS(-0.000013127866291288), +LPF_TAPS(-0.000016900043422104), +LPF_TAPS(-0.000018132931135849), +LPF_TAPS(-0.000016952311588863), +LPF_TAPS(-0.000013783975093675), +LPF_TAPS(-0.000009264921034204), +LPF_TAPS(-0.000004135526887174), +LPF_TAPS(0.000000870667867161), +LPF_TAPS(0.000005124222565588), +LPF_TAPS(0.000008172085434929), +LPF_TAPS(0.000009777591229902), +LPF_TAPS(0.000009926118931399), +LPF_TAPS(0.000008799412983442), +LPF_TAPS(0.000006725697160838), +LPF_TAPS(0.000004115402656697), +LPF_TAPS(0.000001393335763527), +LPF_TAPS(-0.000001062561235713), +LPF_TAPS(-0.000002967791692768), +LPF_TAPS(-0.000004158226808320), +LPF_TAPS(-0.000004595851995894), +LPF_TAPS(-0.000004355165268430), +LPF_TAPS(-0.000003594766004492), +LPF_TAPS(-0.000002520396942092), +LPF_TAPS(-0.000001346271422868), +LPF_TAPS(-0.000000260956550586), +LPF_TAPS(0.000000597409520936), +LPF_TAPS(0.000001153882516618), +LPF_TAPS(0.000001397075841614), +LPF_TAPS(0.000001368850624164), +LPF_TAPS(0.000001146649695244), +LPF_TAPS(0.000000822645851364), +LPF_TAPS(0.000000483913353528), +LPF_TAPS(0.000000197123477448), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000099778720099), +LPF_TAPS(-0.000000119074580424), +LPF_TAPS(-0.000000089256106800), +LPF_TAPS(-0.000000044433940061), +LPF_TAPS(-0.000000010873062592), +LPF_TAPS(0.000000000000000000), +}; diff --git a/core/sound/blip_lpf_384K_48K.h b/core/sound/blip_lpf_384K_48K.h new file mode 100644 index 000000000..5f729dd72 --- /dev/null +++ b/core/sound/blip_lpf_384K_48K.h @@ -0,0 +1,591 @@ +static buf_t const blip_lpf_384K_48K[blip_lpf_384K_taps] = { +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000006503202820), +LPF_TAPS(-0.000000005849842015), +LPF_TAPS(-0.000000078233669747), +LPF_TAPS(-0.000000180208454089), +LPF_TAPS(-0.000000193635170079), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000382546880181), +LPF_TAPS(0.000000732358468462), +LPF_TAPS(0.000000721055467933), +LPF_TAPS(0.000000150959369216), +LPF_TAPS(-0.000000818712590339), +LPF_TAPS(-0.000001647964114635), +LPF_TAPS(-0.000001682261877696), +LPF_TAPS(-0.000000597409809747), +LPF_TAPS(0.000001255026676517), +LPF_TAPS(0.000002882338204170), +LPF_TAPS(0.000003145434327730), +LPF_TAPS(0.000001489001552458), +LPF_TAPS(-0.000001534929736759), +LPF_TAPS(-0.000004352904447252), +LPF_TAPS(-0.000005147636573837), +LPF_TAPS(-0.000002967793127511), +LPF_TAPS(0.000001481210903335), +LPF_TAPS(0.000005938361755751), +LPF_TAPS(0.000007689232639407), +LPF_TAPS(0.000005160811439416), +LPF_TAPS(-0.000000901303542104), +LPF_TAPS(-0.000007478867784236), +LPF_TAPS(-0.000010728673861079), +LPF_TAPS(-0.000008172089385626), +LPF_TAPS(-0.000000406244457850), +LPF_TAPS(0.000008777431582245), +LPF_TAPS(0.000014177858864022), +LPF_TAPS(0.000012074286006310), +LPF_TAPS(0.000002644067905706), +LPF_TAPS(-0.000009602717782315), +LPF_TAPS(-0.000017898314581276), +LPF_TAPS(-0.000016900051592227), +LPF_TAPS(-0.000006007031232565), +LPF_TAPS(0.000009693463809528), +LPF_TAPS(0.000021698487437919), +LPF_TAPS(0.000022633364277399), +LPF_TAPS(0.000010672062517435), +LPF_TAPS(-0.000008764694485172), +LPF_TAPS(-0.000025332465809854), +LPF_TAPS(-0.000029201131738919), +LPF_TAPS(-0.000016786881125153), +LPF_TAPS(0.000006515883207812), +LPF_TAPS(0.000028500473714422), +LPF_TAPS(0.000036465417422531), +LPF_TAPS(0.000024457806196456), +LPF_TAPS(-0.000002641154683653), +LPF_TAPS(-0.000030851477633416), +LPF_TAPS(-0.000044216710488163), +LPF_TAPS(-0.000033736922293091), +LPF_TAPS(-0.000003158448914863), +LPF_TAPS(0.000031988230255699), +LPF_TAPS(0.000052168707516273), +LPF_TAPS(0.000044608971706441), +LPF_TAPS(0.000011160707151486), +LPF_TAPS(-0.000031475034442276), +LPF_TAPS(-0.000059955107102222), +LPF_TAPS(-0.000056978435359620), +LPF_TAPS(-0.000021606140428787), +LPF_TAPS(0.000028848446583500), +LPF_TAPS(0.000067128931311735), +LPF_TAPS(0.000070657350418120), +LPF_TAPS(0.000034680400720536), +LPF_TAPS(-0.000023631050649621), +LPF_TAPS(-0.000073164876720327), +LPF_TAPS(-0.000085354486947704), +LPF_TAPS(-0.000050495549607254), +LPF_TAPS(0.000015348323840559), +LPF_TAPS(0.000077465159439725), +LPF_TAPS(0.000100666562503584), +LPF_TAPS(0.000069070764414392), +LPF_TAPS(-0.000003548484364012), +LPF_TAPS(-0.000079369251281705), +LPF_TAPS(-0.000116072206993584), +LPF_TAPS(-0.000090313133322722), +LPF_TAPS(-0.000012174934625460), +LPF_TAPS(0.000078167807459032), +LPF_TAPS(0.000130929395731458), +LPF_TAPS(0.000113999308692182), +LPF_TAPS(0.000032158198421559), +LPF_TAPS(-0.000073120960840263), +LPF_TAPS(-0.000144477042387634), +LPF_TAPS(-0.000139758877768490), +LPF_TAPS(-0.000056640747389047), +LPF_TAPS(0.000063481006130816), +LPF_TAPS(0.000155841382823267), +LPF_TAPS(0.000167060374901225), +LPF_TAPS(0.000085737572960195), +LPF_TAPS(-0.000048519323325795), +LPF_TAPS(-0.000164047684222058), +LPF_TAPS(-0.000195200893423035), +LPF_TAPS(-0.000119411479655871), +LPF_TAPS(0.000027557198691092), +LPF_TAPS(0.000168037681742167), +LPF_TAPS(0.000223300253335332), +LPF_TAPS(0.000157446252670375), +LPF_TAPS(-0.000000000000000003), +LPF_TAPS(-0.000166692979005046), +LPF_TAPS(-0.000250300639021611), +LPF_TAPS(-0.000199421858038953), +LPF_TAPS(-0.000034626041501284), +LPF_TAPS(0.000158864452745100), +LPF_TAPS(0.000274972536933227), +LPF_TAPS(0.000244692877132379), +LPF_TAPS(0.000076635388368275), +LPF_TAPS(-0.000143407481172504), +LPF_TAPS(-0.000295927675818274), +LPF_TAPS(-0.000292371412661462), +LPF_TAPS(-0.000126144223038756), +LPF_TAPS(0.000119222576930763), +LPF_TAPS(0.000311639502691372), +LPF_TAPS(0.000341315694158472), +LPF_TAPS(0.000183032231873393), +LPF_TAPS(-0.000085300757219496), +LPF_TAPS(-0.000320471519403484), +LPF_TAPS(-0.000390125553156118), +LPF_TAPS(-0.000246906562990679), +LPF_TAPS(0.000040772735080986), +LPF_TAPS(0.000320713562342054), +LPF_TAPS(0.000437145829897804), +LPF_TAPS(0.000317069459270137), +LPF_TAPS(0.000015039222807827), +LPF_TAPS(-0.000310625838317288), +LPF_TAPS(-0.000480478614259649), +LPF_TAPS(-0.000392491105131392), +LPF_TAPS(-0.000082568144639632), +LPF_TAPS(0.000288490241628356), +LPF_TAPS(0.000518005015648909), +LPF_TAPS(0.000471789208898184), +LPF_TAPS(0.000161949468098235), +LPF_TAPS(-0.000252668180692344), +LPF_TAPS(-0.000547416904163501), +LPF_TAPS(-0.000553216767771218), +LPF_TAPS(-0.000252970126618144), +LPF_TAPS(0.000201663848670586), +LPF_TAPS(0.000566258774624573), +LPF_TAPS(0.000634659327754457), +LPF_TAPS(0.000355021407836447), +LPF_TAPS(-0.000134191593268466), +LPF_TAPS(-0.000571979564666246), +LPF_TAPS(-0.000713642856649047), +LPF_TAPS(-0.000467057421066836), +LPF_TAPS(0.000049245788747453), +LPF_TAPS(0.000561993918193049), +LPF_TAPS(0.000787353097159156), +LPF_TAPS(0.000587560981677088), +LPF_TAPS(0.000053828599419581), +LPF_TAPS(-0.000533752038109352), +LPF_TAPS(-0.000852666964353335), +LPF_TAPS(-0.000714518621550615), +LPF_TAPS(-0.000175266727942945), +LPF_TAPS(0.000484816930467727), +LPF_TAPS(0.000906196204630836), +LPF_TAPS(0.000845406263993468), +LPF_TAPS(0.000314817936404181), +LPF_TAPS(-0.000412947520140350), +LPF_TAPS(-0.000944343151550742), +LPF_TAPS(-0.000977186858435632), +LPF_TAPS(-0.000471685250588915), +LPF_TAPS(0.000316185830334019), +LPF_TAPS(0.000963368008888017), +LPF_TAPS(0.001106320957296740), +LPF_TAPS(0.000644472369103502), +LPF_TAPS(-0.000192946179359307), +LPF_TAPS(-0.000959466676126703), +LPF_TAPS(-0.001228790838834765), +LPF_TAPS(-0.000831140031646361), +LPF_TAPS(0.000042104172341939), +LPF_TAPS(0.000928857720449613), +LPF_TAPS(0.001340138341942271), +LPF_TAPS(0.001028973432376992), +LPF_TAPS(0.000136916833243533), +LPF_TAPS(-0.000867876706929601), +LPF_TAPS(-0.001435516089365050), +LPF_TAPS(-0.001234562010518128), +LPF_TAPS(-0.000344064118248697), +LPF_TAPS(0.000773075739959831), +LPF_TAPS(0.001509751243047028), +LPF_TAPS(0.001443792519769963), +LPF_TAPS(0.000578581085490012), +LPF_TAPS(-0.000641325758405910), +LPF_TAPS(-0.001557420367308325), +LPF_TAPS(-0.001651855745334937), +LPF_TAPS(-0.000838941865677717), +LPF_TAPS(0.000469918877920107), +LPF_TAPS(0.001572933378730220), +LPF_TAPS(0.001853266597735595), +LPF_TAPS(0.001122796740918288), +LPF_TAPS(-0.000256667898155195), +LPF_TAPS(-0.001550623938785613), +LPF_TAPS(-0.002041896557519943), +LPF_TAPS(-0.001426929605946781), +LPF_TAPS(0.000000000000000014), +LPF_TAPS(0.001484842993021157), +LPF_TAPS(0.002211016558072698), +LPF_TAPS(0.001747228052000544), +LPF_TAPS(0.000300958344334903), +LPF_TAPS(-0.001370051465454246), +LPF_TAPS(-0.002353347345416942), +LPF_TAPS(-0.002078665835068547), +LPF_TAPS(-0.000646308133182089), +LPF_TAPS(0.001200907349311346), +LPF_TAPS(0.002461113092179670), +LPF_TAPS(0.002415296435696646), +LPF_TAPS(0.001035318965793742), +LPF_TAPS(-0.000972341540733622), +LPF_TAPS(-0.002526092479366909), +LPF_TAPS(-0.002750255061253166), +LPF_TAPS(-0.001466386955787689), +LPF_TAPS(0.000679615646265460), +LPF_TAPS(0.002539659445857668), +LPF_TAPS(0.003075764667526174), +LPF_TAPS(0.001937011471890712), +LPF_TAPS(-0.000318353499249274), +LPF_TAPS(-0.002492803093762833), +LPF_TAPS(-0.003383139191049453), +LPF_TAPS(-0.002443792300250093), +LPF_TAPS(-0.000115464020033783), +LPF_TAPS(0.002376112412446640), +LPF_TAPS(0.003662773859520006), +LPF_TAPS(0.002982448304723403), +LPF_TAPS(0.000625554495446453), +LPF_TAPS(-0.002179705840164981), +LPF_TAPS(-0.003904107624531098), +LPF_TAPS(-0.003547858090245656), +LPF_TAPS(-0.001215458531635024), +LPF_TAPS(0.001893077002631478), +LPF_TAPS(0.004095535459895290), +LPF_TAPS(0.004134122566326785), +LPF_TAPS(0.001888760328101881), +LPF_TAPS(-0.001504814100223794), +LPF_TAPS(-0.004224236740519411), +LPF_TAPS(-0.004734648681415416), +LPF_TAPS(-0.002649445068584514), +LPF_TAPS(0.001002127444257027), +LPF_TAPS(0.004275866942694263), +LPF_TAPS(0.005342252973877862), +LPF_TAPS(0.003502457765705811), +LPF_TAPS(-0.000370080198385793), +LPF_TAPS(-0.004234027361415646), +LPF_TAPS(-0.005949282981757201), +LPF_TAPS(-0.004454570661594240), +LPF_TAPS(-0.000409652959545898), +LPF_TAPS(0.004079369292625890), +LPF_TAPS(0.006547753991151824), +LPF_TAPS(0.005515744756444054), +LPF_TAPS(0.001360805311569260), +LPF_TAPS(-0.003788080011994879), +LPF_TAPS(-0.007129498100924165), +LPF_TAPS(-0.006701322514199400), +LPF_TAPS(-0.002515876697475453), +LPF_TAPS(0.003329282790038720), +LPF_TAPS(0.007686322156860501), +LPF_TAPS(0.008035696758406874), +LPF_TAPS(0.003921917508260477), +LPF_TAPS(-0.002660433522403174), +LPF_TAPS(-0.008210170776467280), +LPF_TAPS(-0.009558767162523707), +LPF_TAPS(-0.005650980574808982), +LPF_TAPS(0.001718788616915996), +LPF_TAPS(0.008693290458632130), +LPF_TAPS(0.011338051552494286), +LPF_TAPS(0.007820241423214368), +LPF_TAPS(-0.000404559134412800), +LPF_TAPS(-0.009128390659463513), +LPF_TAPS(-0.013493311245838014), +LPF_TAPS(-0.010634059447887700), +LPF_TAPS(-0.001455310544204177), +LPF_TAPS(0.009508797722194937), +LPF_TAPS(0.016252106569250600), +LPF_TAPS(0.014482070170325378), +LPF_TAPS(0.004194617841823830), +LPF_TAPS(-0.009828597676686424), +LPF_TAPS(-0.020093993429713325), +LPF_TAPS(-0.020205320615819689), +LPF_TAPS(-0.008556973225887702), +LPF_TAPS(0.010082764170405253), +LPF_TAPS(0.026208968816161637), +LPF_TAPS(0.030000902894892705), +LPF_TAPS(0.016609132395323946), +LPF_TAPS(-0.010267268151539673), +LPF_TAPS(-0.038527141888178663), +LPF_TAPS(-0.051944646349938214), +LPF_TAPS(-0.037038303614902512), +LPF_TAPS(0.010379166386061156), +LPF_TAPS(0.081984403352501831), +LPF_TAPS(0.158784439342286088), +LPF_TAPS(0.217583996578812361), +LPF_TAPS(0.239583328135104134), +LPF_TAPS(0.217583996578812361), +LPF_TAPS(0.158784439342286116), +LPF_TAPS(0.081984403352501831), +LPF_TAPS(0.010379166386061156), +LPF_TAPS(-0.037038303614902512), +LPF_TAPS(-0.051944646349938214), +LPF_TAPS(-0.038527141888178663), +LPF_TAPS(-0.010267268151539673), +LPF_TAPS(0.016609132395323946), +LPF_TAPS(0.030000902894892705), +LPF_TAPS(0.026208968816161634), +LPF_TAPS(0.010082764170405253), +LPF_TAPS(-0.008556973225887702), +LPF_TAPS(-0.020205320615819689), +LPF_TAPS(-0.020093993429713325), +LPF_TAPS(-0.009828597676686424), +LPF_TAPS(0.004194617841823830), +LPF_TAPS(0.014482070170325380), +LPF_TAPS(0.016252106569250604), +LPF_TAPS(0.009508797722194940), +LPF_TAPS(-0.001455310544204177), +LPF_TAPS(-0.010634059447887700), +LPF_TAPS(-0.013493311245838014), +LPF_TAPS(-0.009128390659463513), +LPF_TAPS(-0.000404559134412800), +LPF_TAPS(0.007820241423214368), +LPF_TAPS(0.011338051552494290), +LPF_TAPS(0.008693290458632130), +LPF_TAPS(0.001718788616915996), +LPF_TAPS(-0.005650980574808982), +LPF_TAPS(-0.009558767162523707), +LPF_TAPS(-0.008210170776467280), +LPF_TAPS(-0.002660433522403174), +LPF_TAPS(0.003921917508260478), +LPF_TAPS(0.008035696758406876), +LPF_TAPS(0.007686322156860502), +LPF_TAPS(0.003329282790038720), +LPF_TAPS(-0.002515876697475453), +LPF_TAPS(-0.006701322514199401), +LPF_TAPS(-0.007129498100924165), +LPF_TAPS(-0.003788080011994879), +LPF_TAPS(0.001360805311569260), +LPF_TAPS(0.005515744756444054), +LPF_TAPS(0.006547753991151825), +LPF_TAPS(0.004079369292625891), +LPF_TAPS(-0.000409652959545898), +LPF_TAPS(-0.004454570661594242), +LPF_TAPS(-0.005949282981757201), +LPF_TAPS(-0.004234027361415646), +LPF_TAPS(-0.000370080198385794), +LPF_TAPS(0.003502457765705811), +LPF_TAPS(0.005342252973877865), +LPF_TAPS(0.004275866942694263), +LPF_TAPS(0.001002127444257027), +LPF_TAPS(-0.002649445068584514), +LPF_TAPS(-0.004734648681415419), +LPF_TAPS(-0.004224236740519412), +LPF_TAPS(-0.001504814100223794), +LPF_TAPS(0.001888760328101881), +LPF_TAPS(0.004134122566326786), +LPF_TAPS(0.004095535459895291), +LPF_TAPS(0.001893077002631478), +LPF_TAPS(-0.001215458531635024), +LPF_TAPS(-0.003547858090245656), +LPF_TAPS(-0.003904107624531100), +LPF_TAPS(-0.002179705840164981), +LPF_TAPS(0.000625554495446453), +LPF_TAPS(0.002982448304723404), +LPF_TAPS(0.003662773859520006), +LPF_TAPS(0.002376112412446641), +LPF_TAPS(-0.000115464020033783), +LPF_TAPS(-0.002443792300250093), +LPF_TAPS(-0.003383139191049452), +LPF_TAPS(-0.002492803093762834), +LPF_TAPS(-0.000318353499249274), +LPF_TAPS(0.001937011471890712), +LPF_TAPS(0.003075764667526174), +LPF_TAPS(0.002539659445857669), +LPF_TAPS(0.000679615646265460), +LPF_TAPS(-0.001466386955787688), +LPF_TAPS(-0.002750255061253167), +LPF_TAPS(-0.002526092479366907), +LPF_TAPS(-0.000972341540733622), +LPF_TAPS(0.001035318965793743), +LPF_TAPS(0.002415296435696647), +LPF_TAPS(0.002461113092179670), +LPF_TAPS(0.001200907349311347), +LPF_TAPS(-0.000646308133182089), +LPF_TAPS(-0.002078665835068547), +LPF_TAPS(-0.002353347345416943), +LPF_TAPS(-0.001370051465454246), +LPF_TAPS(0.000300958344334903), +LPF_TAPS(0.001747228052000543), +LPF_TAPS(0.002211016558072697), +LPF_TAPS(0.001484842993021157), +LPF_TAPS(0.000000000000000014), +LPF_TAPS(-0.001426929605946781), +LPF_TAPS(-0.002041896557519943), +LPF_TAPS(-0.001550623938785614), +LPF_TAPS(-0.000256667898155195), +LPF_TAPS(0.001122796740918289), +LPF_TAPS(0.001853266597735596), +LPF_TAPS(0.001572933378730221), +LPF_TAPS(0.000469918877920107), +LPF_TAPS(-0.000838941865677717), +LPF_TAPS(-0.001651855745334936), +LPF_TAPS(-0.001557420367308325), +LPF_TAPS(-0.000641325758405911), +LPF_TAPS(0.000578581085490013), +LPF_TAPS(0.001443792519769964), +LPF_TAPS(0.001509751243047029), +LPF_TAPS(0.000773075739959831), +LPF_TAPS(-0.000344064118248697), +LPF_TAPS(-0.001234562010518129), +LPF_TAPS(-0.001435516089365050), +LPF_TAPS(-0.000867876706929602), +LPF_TAPS(0.000136916833243533), +LPF_TAPS(0.001028973432376992), +LPF_TAPS(0.001340138341942272), +LPF_TAPS(0.000928857720449614), +LPF_TAPS(0.000042104172341939), +LPF_TAPS(-0.000831140031646360), +LPF_TAPS(-0.001228790838834765), +LPF_TAPS(-0.000959466676126702), +LPF_TAPS(-0.000192946179359307), +LPF_TAPS(0.000644472369103502), +LPF_TAPS(0.001106320957296741), +LPF_TAPS(0.000963368008888017), +LPF_TAPS(0.000316185830334019), +LPF_TAPS(-0.000471685250588915), +LPF_TAPS(-0.000977186858435632), +LPF_TAPS(-0.000944343151550742), +LPF_TAPS(-0.000412947520140350), +LPF_TAPS(0.000314817936404181), +LPF_TAPS(0.000845406263993468), +LPF_TAPS(0.000906196204630836), +LPF_TAPS(0.000484816930467727), +LPF_TAPS(-0.000175266727942945), +LPF_TAPS(-0.000714518621550615), +LPF_TAPS(-0.000852666964353335), +LPF_TAPS(-0.000533752038109352), +LPF_TAPS(0.000053828599419581), +LPF_TAPS(0.000587560981677089), +LPF_TAPS(0.000787353097159157), +LPF_TAPS(0.000561993918193049), +LPF_TAPS(0.000049245788747453), +LPF_TAPS(-0.000467057421066836), +LPF_TAPS(-0.000713642856649046), +LPF_TAPS(-0.000571979564666246), +LPF_TAPS(-0.000134191593268466), +LPF_TAPS(0.000355021407836447), +LPF_TAPS(0.000634659327754457), +LPF_TAPS(0.000566258774624574), +LPF_TAPS(0.000201663848670586), +LPF_TAPS(-0.000252970126618144), +LPF_TAPS(-0.000553216767771218), +LPF_TAPS(-0.000547416904163501), +LPF_TAPS(-0.000252668180692344), +LPF_TAPS(0.000161949468098235), +LPF_TAPS(0.000471789208898184), +LPF_TAPS(0.000518005015648910), +LPF_TAPS(0.000288490241628357), +LPF_TAPS(-0.000082568144639632), +LPF_TAPS(-0.000392491105131393), +LPF_TAPS(-0.000480478614259649), +LPF_TAPS(-0.000310625838317288), +LPF_TAPS(0.000015039222807827), +LPF_TAPS(0.000317069459270137), +LPF_TAPS(0.000437145829897804), +LPF_TAPS(0.000320713562342054), +LPF_TAPS(0.000040772735080986), +LPF_TAPS(-0.000246906562990679), +LPF_TAPS(-0.000390125553156118), +LPF_TAPS(-0.000320471519403484), +LPF_TAPS(-0.000085300757219496), +LPF_TAPS(0.000183032231873393), +LPF_TAPS(0.000341315694158471), +LPF_TAPS(0.000311639502691372), +LPF_TAPS(0.000119222576930763), +LPF_TAPS(-0.000126144223038757), +LPF_TAPS(-0.000292371412661462), +LPF_TAPS(-0.000295927675818274), +LPF_TAPS(-0.000143407481172504), +LPF_TAPS(0.000076635388368275), +LPF_TAPS(0.000244692877132379), +LPF_TAPS(0.000274972536933228), +LPF_TAPS(0.000158864452745100), +LPF_TAPS(-0.000034626041501284), +LPF_TAPS(-0.000199421858038954), +LPF_TAPS(-0.000250300639021611), +LPF_TAPS(-0.000166692979005046), +LPF_TAPS(-0.000000000000000003), +LPF_TAPS(0.000157446252670375), +LPF_TAPS(0.000223300253335332), +LPF_TAPS(0.000168037681742168), +LPF_TAPS(0.000027557198691092), +LPF_TAPS(-0.000119411479655871), +LPF_TAPS(-0.000195200893423036), +LPF_TAPS(-0.000164047684222058), +LPF_TAPS(-0.000048519323325795), +LPF_TAPS(0.000085737572960195), +LPF_TAPS(0.000167060374901225), +LPF_TAPS(0.000155841382823267), +LPF_TAPS(0.000063481006130817), +LPF_TAPS(-0.000056640747389047), +LPF_TAPS(-0.000139758877768490), +LPF_TAPS(-0.000144477042387634), +LPF_TAPS(-0.000073120960840263), +LPF_TAPS(0.000032158198421559), +LPF_TAPS(0.000113999308692182), +LPF_TAPS(0.000130929395731458), +LPF_TAPS(0.000078167807459032), +LPF_TAPS(-0.000012174934625460), +LPF_TAPS(-0.000090313133322722), +LPF_TAPS(-0.000116072206993584), +LPF_TAPS(-0.000079369251281705), +LPF_TAPS(-0.000003548484364012), +LPF_TAPS(0.000069070764414392), +LPF_TAPS(0.000100666562503584), +LPF_TAPS(0.000077465159439725), +LPF_TAPS(0.000015348323840559), +LPF_TAPS(-0.000050495549607254), +LPF_TAPS(-0.000085354486947704), +LPF_TAPS(-0.000073164876720327), +LPF_TAPS(-0.000023631050649621), +LPF_TAPS(0.000034680400720536), +LPF_TAPS(0.000070657350418119), +LPF_TAPS(0.000067128931311735), +LPF_TAPS(0.000028848446583500), +LPF_TAPS(-0.000021606140428787), +LPF_TAPS(-0.000056978435359620), +LPF_TAPS(-0.000059955107102221), +LPF_TAPS(-0.000031475034442276), +LPF_TAPS(0.000011160707151486), +LPF_TAPS(0.000044608971706442), +LPF_TAPS(0.000052168707516273), +LPF_TAPS(0.000031988230255699), +LPF_TAPS(-0.000003158448914863), +LPF_TAPS(-0.000033736922293091), +LPF_TAPS(-0.000044216710488163), +LPF_TAPS(-0.000030851477633416), +LPF_TAPS(-0.000002641154683653), +LPF_TAPS(0.000024457806196456), +LPF_TAPS(0.000036465417422531), +LPF_TAPS(0.000028500473714422), +LPF_TAPS(0.000006515883207812), +LPF_TAPS(-0.000016786881125153), +LPF_TAPS(-0.000029201131738919), +LPF_TAPS(-0.000025332465809854), +LPF_TAPS(-0.000008764694485172), +LPF_TAPS(0.000010672062517435), +LPF_TAPS(0.000022633364277399), +LPF_TAPS(0.000021698487437919), +LPF_TAPS(0.000009693463809528), +LPF_TAPS(-0.000006007031232565), +LPF_TAPS(-0.000016900051592227), +LPF_TAPS(-0.000017898314581276), +LPF_TAPS(-0.000009602717782315), +LPF_TAPS(0.000002644067905706), +LPF_TAPS(0.000012074286006310), +LPF_TAPS(0.000014177858864022), +LPF_TAPS(0.000008777431582245), +LPF_TAPS(-0.000000406244457850), +LPF_TAPS(-0.000008172089385626), +LPF_TAPS(-0.000010728673861079), +LPF_TAPS(-0.000007478867784236), +LPF_TAPS(-0.000000901303542104), +LPF_TAPS(0.000005160811439416), +LPF_TAPS(0.000007689232639407), +LPF_TAPS(0.000005938361755751), +LPF_TAPS(0.000001481210903335), +LPF_TAPS(-0.000002967793127511), +LPF_TAPS(-0.000005147636573837), +LPF_TAPS(-0.000004352904447252), +LPF_TAPS(-0.000001534929736759), +LPF_TAPS(0.000001489001552458), +LPF_TAPS(0.000003145434327730), +LPF_TAPS(0.000002882338204170), +LPF_TAPS(0.000001255026676517), +LPF_TAPS(-0.000000597409809747), +LPF_TAPS(-0.000001682261877696), +LPF_TAPS(-0.000001647964114635), +LPF_TAPS(-0.000000818712590339), +LPF_TAPS(0.000000150959369216), +LPF_TAPS(0.000000721055467933), +LPF_TAPS(0.000000732358468462), +LPF_TAPS(0.000000382546880181), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000193635170079), +LPF_TAPS(-0.000000180208454089), +LPF_TAPS(-0.000000078233669747), +LPF_TAPS(-0.000000005849842015), +LPF_TAPS(0.000000006503202820), +LPF_TAPS(0.000000000000000000), +}; diff --git a/core/sound/blip_lpf_384K_96K.h b/core/sound/blip_lpf_384K_96K.h new file mode 100644 index 000000000..7bce8e95a --- /dev/null +++ b/core/sound/blip_lpf_384K_96K.h @@ -0,0 +1,591 @@ +static buf_t const blip_lpf_384K_96K[blip_lpf_384K_taps] = { +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000011015600767), +LPF_TAPS(0.000000005849842074), +LPF_TAPS(0.000000100719147701), +LPF_TAPS(-0.000000011811486228), +LPF_TAPS(-0.000000283109532916), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000559313003533), +LPF_TAPS(0.000000048001310528), +LPF_TAPS(-0.000000928297143806), +LPF_TAPS(-0.000000150959370735), +LPF_TAPS(0.000001386795289539), +LPF_TAPS(0.000000327800446696), +LPF_TAPS(-0.000001929241549214), +LPF_TAPS(-0.000000597409815756), +LPF_TAPS(0.000002547717384186), +LPF_TAPS(0.000000978421988732), +LPF_TAPS(-0.000003231910828620), +LPF_TAPS(-0.000001489001567436), +LPF_TAPS(0.000003969089552504), +LPF_TAPS(0.000002146614939706), +LPF_TAPS(-0.000004744089084507), +LPF_TAPS(-0.000002967793157365), +LPF_TAPS(0.000005539317611880), +LPF_TAPS(0.000003967886509344), +LPF_TAPS(-0.000006334778858395), +LPF_TAPS(-0.000005160811491329), +LPF_TAPS(0.000007108114604907), +LPF_TAPS(0.000006558791082586), +LPF_TAPS(-0.000007834668457273), +LPF_TAPS(-0.000008172089467830), +LPF_TAPS(0.000008487572479706), +LPF_TAPS(0.000010008742584247), +LPF_TAPS(-0.000009037858295623), +LPF_TAPS(-0.000012074286127767), +LPF_TAPS(0.000009454594209865), +LPF_TAPS(0.000014371482914828), +LPF_TAPS(-0.000009705049823939), +LPF_TAPS(-0.000016900051762228), +LPF_TAPS(0.000009754889497821), +LPF_TAPS(0.000019656400313892), +LPF_TAPS(-0.000009568395856687), +LPF_TAPS(-0.000022633364505072), +LPF_TAPS(0.000009108724348073), +LPF_TAPS(0.000025819957606911), +LPF_TAPS(-0.000008338189624081), +LPF_TAPS(-0.000029201132032658), +LPF_TAPS(0.000007218584254945), +LPF_TAPS(0.000032757557306227), +LPF_TAPS(-0.000005711529975318), +LPF_TAPS(-0.000036465417789344), +LPF_TAPS(0.000003778861324781), +LPF_TAPS(0.000040296233930550), +LPF_TAPS(-0.000001383041171332), +LPF_TAPS(-0.000044216710932948), +LPF_TAPS(-0.000001512392796211), +LPF_TAPS(0.000048188618833547), +LPF_TAPS(0.000004942351950558), +LPF_TAPS(-0.000052168708041048), +LPF_TAPS(-0.000008939692779225), +LPF_TAPS(0.000056108664387130), +LPF_TAPS(0.000013534687376105), +LPF_TAPS(-0.000059955107705322), +LPF_TAPS(-0.000018754471123261), +LPF_TAPS(0.000063649637858348), +LPF_TAPS(0.000024622470808229), +LPF_TAPS(-0.000067128931986998), +LPF_TAPS(-0.000031157816917856), +LPF_TAPS(0.000070324896549265), +LPF_TAPS(0.000038374744342056), +LPF_TAPS(-0.000073164877456309), +LPF_TAPS(-0.000046281986203924), +LPF_TAPS(0.000075571931291371), +LPF_TAPS(0.000054882165999193), +LPF_TAPS(-0.000077465160218964), +LPF_TAPS(-0.000064171193671817), +LPF_TAPS(0.000078760112755455), +LPF_TAPS(0.000074137671667086), +LPF_TAPS(-0.000079369252080098), +LPF_TAPS(-0.000084762317381802), +LPF_TAPS(0.000079202493019870), +LPF_TAPS(0.000096017408766624), +LPF_TAPS(-0.000078167808245341), +LPF_TAPS(-0.000107866260122152), +LPF_TAPS(0.000076171903571917), +LPF_TAPS(0.000120262735361821), +LPF_TAPS(-0.000073120961575807), +LPF_TAPS(-0.000133150806184833), +LPF_TAPS(0.000068921452012099), +LPF_TAPS(0.000146464162706635), +LPF_TAPS(-0.000063481006769390), +LPF_TAPS(-0.000160125884127777), +LPF_TAPS(0.000056709356317991), +LPF_TAPS(0.000174048176979626), +LPF_TAPS(-0.000048519323813871), +LPF_TAPS(-0.000188132188364734), +LPF_TAPS(0.000038827872215975), +LPF_TAPS(0.000202267901407275), +LPF_TAPS(-0.000027557198968305), +LPF_TAPS(-0.000216334119842647), +LPF_TAPS(0.000014635871998353), +LPF_TAPS(0.000230198548304553), +LPF_TAPS(0.000000000000000002), +LPF_TAPS(-0.000243717974411615), +LPF_TAPS(-0.000016405570791358), +LPF_TAPS(0.000256738558214805), +LPF_TAPS(0.000034626041849581), +LPF_TAPS(-0.000269096233943092), +LPF_TAPS(-0.000054695438835973), +LPF_TAPS(0.000280617228280185), +LPF_TAPS(0.000076635389139154), +LPF_TAPS(-0.000291118698623548), +LPF_TAPS(-0.000100453910882524), +LPF_TAPS(0.000300409493922405), +LPF_TAPS(0.000126144224307666), +LPF_TAPS(-0.000308291039769518), +LPF_TAPS(-0.000153683596868854), +LPF_TAPS(0.000314558348438531), +LPF_TAPS(0.000183032233714526), +LPF_TAPS(-0.000319001153521583), +LPF_TAPS(-0.000214132225480944), +LPF_TAPS(0.000321405167739016), +LPF_TAPS(0.000246906565474358), +LPF_TAPS(-0.000321553461372830), +LPF_TAPS(-0.000281258248365758), +LPF_TAPS(0.000319227957627963), +LPF_TAPS(0.000317069462459603), +LPF_TAPS(-0.000314211040060395), +LPF_TAPS(-0.000354200887423921), +LPF_TAPS(0.000306287266039554), +LPF_TAPS(0.000392491109079526), +LPF_TAPS(-0.000295245179045763), +LPF_TAPS(-0.000431756162436877), +LPF_TAPS(0.000280879211452807), +LPF_TAPS(0.000471789213644001), +LPF_TAPS(-0.000262991668324403), +LPF_TAPS(-0.000512360390863583), +LPF_TAPS(0.000241394781671497), +LPF_TAPS(0.000553216773336134), +LPF_TAPS(-0.000215912823589380), +LPF_TAPS(-0.000594082547010641), +LPF_TAPS(0.000186384265730750), +LPF_TAPS(0.000634659334138613), +LPF_TAPS(-0.000152663971685384), +LPF_TAPS(-0.000674626703136016), +LPF_TAPS(0.000114625408040413), +LPF_TAPS(0.000713642863827721), +LPF_TAPS(-0.000072162859201040), +LPF_TAPS(-0.000751345551907282), +LPF_TAPS(0.000025193630468347), +LPF_TAPS(0.000787353105079299), +LPF_TAPS(0.000026339776589673), +LPF_TAPS(-0.000821265731912697), +LPF_TAPS(-0.000082467532763677), +LPF_TAPS(0.000852666972930490), +LPF_TAPS(0.000143190410299827), +LPF_TAPS(-0.000881125351906697), +LPF_TAPS(-0.000208477788977746), +LPF_TAPS(0.000906196213746451), +LPF_TAPS(0.000278265755551535), +LPF_TAPS(-0.000927423743702984), +LPF_TAPS(-0.000352455312647677), +LPF_TAPS(0.000944343161050078), +LPF_TAPS(0.000430910712749655), +LPF_TAPS(-0.000956483078692794), +LPF_TAPS(-0.000513457932258434), +LPF_TAPS(0.000963368018578731), +LPF_TAPS(0.000599883299797623), +LPF_TAPS(-0.000964521071181302), +LPF_TAPS(-0.000689932291924013), +LPF_TAPS(0.000959466685778196), +LPF_TAPS(0.000783308508207108), +LPF_TAPS(-0.000947733576760587), +LPF_TAPS(-0.000879672836255881), +LPF_TAPS(0.000928857729793189), +LPF_TAPS(0.000978642815687279), +LPF_TAPS(-0.000902385490316769), +LPF_TAPS(-0.001079792208254300), +LPF_TAPS(0.000867876715659763), +LPF_TAPS(0.001182650779375594), +LPF_TAPS(-0.000824907970912845), +LPF_TAPS(-0.001286704294128211), +LPF_TAPS(0.000773075747736378), +LPF_TAPS(0.001391394728381238), +LPF_TAPS(-0.000711999684424938), +LPF_TAPS(-0.001496120693149179), +LPF_TAPS(0.000641325764857145), +LPF_TAPS(0.001600238067424449), +LPF_TAPS(-0.000560729473422399), +LPF_TAPS(-0.001703060831694894), +LPF_TAPS(0.000469918882647158), +LPF_TAPS(0.001803862091048397), +LPF_TAPS(-0.000368637650049468), +LPF_TAPS(-0.001901875273189507), +LPF_TAPS(0.000256667900737123), +LPF_TAPS(0.001996295482812222), +LPF_TAPS(-0.000133832972436669), +LPF_TAPS(-0.002086280989547721), +LPF_TAPS(-0.000000000000000010), +LPF_TAPS(0.002170954822083052), +LPF_TAPS(0.000144917683015615), +LPF_TAPS(-0.002249406435955790), +LPF_TAPS(-0.000300958347362256), +LPF_TAPS(0.002320693416880992), +LPF_TAPS(0.000468109896452331), +LPF_TAPS(-0.002383843175141072), +LPF_TAPS(-0.000646308139683340), +LPF_TAPS(0.002437854579416513), +LPF_TAPS(0.000835435329088609), +LPF_TAPS(-0.002481699470256925), +LPF_TAPS(-0.001035318976208225), +LPF_TAPS(0.002514323983937589), +LPF_TAPS(0.001245730964462881), +LPF_TAPS(-0.002534649606387051), +LPF_TAPS(-0.001466386970538345), +LPF_TAPS(0.002541573863783226), +LPF_TAPS(0.001696946206381959), +LPF_TAPS(-0.002533970540751470), +LPF_TAPS(-0.001937011491375429), +LPF_TAPS(0.002510689298140439), +LPF_TAPS(0.002186129662096221), +LPF_TAPS(-0.002470554539162156), +LPF_TAPS(-0.002443792324832665), +LPF_TAPS(0.002412363344034429), +LPF_TAPS(0.002709436953689394), +LPF_TAPS(-0.002334882257521798), +LPF_TAPS(-0.002982448334724418), +LPF_TAPS(0.002236842668768351), +LPF_TAPS(0.003262160354121255), +LPF_TAPS(-0.002116934465646910), +LPF_TAPS(-0.003547858125934267), +LPF_TAPS(0.001973797572585516), +LPF_TAPS(0.003838780452470702), +LPF_TAPS(-0.001806010886127095), +LPF_TAPS(-0.004134122607912742), +LPF_TAPS(0.001612077998994808), +LPF_TAPS(0.004433039433353184), +LPF_TAPS(-0.001390408940994410), +LPF_TAPS(-0.004734648729042185), +LPF_TAPS(0.001139296949435484), +LPF_TAPS(0.005038034927334975), +LPF_TAPS(-0.000856888992736507), +LPF_TAPS(-0.005342253027616647), +LPF_TAPS(0.000541148379629372), +LPF_TAPS(0.005646332772373505), +LPF_TAPS(-0.000189807251080793), +LPF_TAPS(-0.005949283041602227), +LPF_TAPS(-0.000199693988689541), +LPF_TAPS(0.006250096440913952), +LPF_TAPS(0.000630284283290779), +LPF_TAPS(-0.006547754057017011), +LPF_TAPS(-0.001105362031111897), +LPF_TAPS(0.006841230352764132), +LPF_TAPS(0.001628925261767635), +LPF_TAPS(-0.007129498172641222), +LPF_TAPS(-0.002205742554827556), +LPF_TAPS(0.007411533828467142), +LPF_TAPS(0.002841579981535849), +LPF_TAPS(-0.007686322234178770), +LPF_TAPS(-0.003543506329125897), +LPF_TAPS(0.007952862057901125), +LPF_TAPS(0.004320309654234472), +LPF_TAPS(-0.008210170859055036), +LPF_TAPS(-0.005183075263676913), +LPF_TAPS(0.008457290178043437), +LPF_TAPS(0.006146002858099756), +LPF_TAPS(-0.008693290546079707), +LPF_TAPS(-0.007227586637919146), +LPF_TAPS(0.008917276382985836), +LPF_TAPS(0.008452361402853461), +LPF_TAPS(-0.009128390751287793), +LPF_TAPS(-0.009853558917979684), +LPF_TAPS(0.009325819935673612), +LPF_TAPS(0.011477281127491516), +LPF_TAPS(-0.009508797817845869), +LPF_TAPS(-0.013389307610701225), +LPF_TAPS(0.009676610017998718), +LPF_TAPS(0.015686706352215952), +LPF_TAPS(-0.009828597775554265), +LPF_TAPS(-0.018518730591539998), +LPF_TAPS(0.009964161543419017), +LPF_TAPS(0.022127001789441349), +LPF_TAPS(-0.010082764271829761), +LPF_TAPS(-0.026929524287683412), +LPF_TAPS(0.010183934359860159), +LPF_TAPS(0.033716713860811466), +LPF_TAPS(-0.010267268254820187), +LPF_TAPS(-0.044183467442614553), +LPF_TAPS(0.010332432682101312), +LPF_TAPS(0.062738188702308406), +LPF_TAPS(-0.010379166490467277), +LPF_TAPS(-0.105547895901716732), +LPF_TAPS(0.010407282100358520), +LPF_TAPS(0.318124561856717447), +LPF_TAPS(0.489583327635681576), +LPF_TAPS(0.318124561856717447), +LPF_TAPS(0.010407282100358520), +LPF_TAPS(-0.105547895901716732), +LPF_TAPS(-0.010379166490467277), +LPF_TAPS(0.062738188702308406), +LPF_TAPS(0.010332432682101312), +LPF_TAPS(-0.044183467442614553), +LPF_TAPS(-0.010267268254820187), +LPF_TAPS(0.033716713860811466), +LPF_TAPS(0.010183934359860159), +LPF_TAPS(-0.026929524287683408), +LPF_TAPS(-0.010082764271829761), +LPF_TAPS(0.022127001789441349), +LPF_TAPS(0.009964161543419017), +LPF_TAPS(-0.018518730591539998), +LPF_TAPS(-0.009828597775554265), +LPF_TAPS(0.015686706352215956), +LPF_TAPS(0.009676610017998718), +LPF_TAPS(-0.013389307610701227), +LPF_TAPS(-0.009508797817845869), +LPF_TAPS(0.011477281127491518), +LPF_TAPS(0.009325819935673612), +LPF_TAPS(-0.009853558917979684), +LPF_TAPS(-0.009128390751287794), +LPF_TAPS(0.008452361402853461), +LPF_TAPS(0.008917276382985836), +LPF_TAPS(-0.007227586637919147), +LPF_TAPS(-0.008693290546079709), +LPF_TAPS(0.006146002858099756), +LPF_TAPS(0.008457290178043437), +LPF_TAPS(-0.005183075263676913), +LPF_TAPS(-0.008210170859055036), +LPF_TAPS(0.004320309654234473), +LPF_TAPS(0.007952862057901126), +LPF_TAPS(-0.003543506329125898), +LPF_TAPS(-0.007686322234178772), +LPF_TAPS(0.002841579981535850), +LPF_TAPS(0.007411533828467142), +LPF_TAPS(-0.002205742554827557), +LPF_TAPS(-0.007129498172641222), +LPF_TAPS(0.001628925261767635), +LPF_TAPS(0.006841230352764133), +LPF_TAPS(-0.001105362031111897), +LPF_TAPS(-0.006547754057017012), +LPF_TAPS(0.000630284283290779), +LPF_TAPS(0.006250096440913953), +LPF_TAPS(-0.000199693988689541), +LPF_TAPS(-0.005949283041602227), +LPF_TAPS(-0.000189807251080793), +LPF_TAPS(0.005646332772373506), +LPF_TAPS(0.000541148379629372), +LPF_TAPS(-0.005342253027616649), +LPF_TAPS(-0.000856888992736507), +LPF_TAPS(0.005038034927334976), +LPF_TAPS(0.001139296949435484), +LPF_TAPS(-0.004734648729042187), +LPF_TAPS(-0.001390408940994411), +LPF_TAPS(0.004433039433353186), +LPF_TAPS(0.001612077998994808), +LPF_TAPS(-0.004134122607912742), +LPF_TAPS(-0.001806010886127095), +LPF_TAPS(0.003838780452470702), +LPF_TAPS(0.001973797572585516), +LPF_TAPS(-0.003547858125934267), +LPF_TAPS(-0.002116934465646911), +LPF_TAPS(0.003262160354121255), +LPF_TAPS(0.002236842668768352), +LPF_TAPS(-0.002982448334724419), +LPF_TAPS(-0.002334882257521798), +LPF_TAPS(0.002709436953689395), +LPF_TAPS(0.002412363344034428), +LPF_TAPS(-0.002443792324832665), +LPF_TAPS(-0.002470554539162155), +LPF_TAPS(0.002186129662096221), +LPF_TAPS(0.002510689298140439), +LPF_TAPS(-0.001937011491375430), +LPF_TAPS(-0.002533970540751471), +LPF_TAPS(0.001696946206381960), +LPF_TAPS(0.002541573863783227), +LPF_TAPS(-0.001466386970538345), +LPF_TAPS(-0.002534649606387052), +LPF_TAPS(0.001245730964462880), +LPF_TAPS(0.002514323983937590), +LPF_TAPS(-0.001035318976208226), +LPF_TAPS(-0.002481699470256926), +LPF_TAPS(0.000835435329088609), +LPF_TAPS(0.002437854579416514), +LPF_TAPS(-0.000646308139683340), +LPF_TAPS(-0.002383843175141073), +LPF_TAPS(0.000468109896452332), +LPF_TAPS(0.002320693416880992), +LPF_TAPS(-0.000300958347362256), +LPF_TAPS(-0.002249406435955789), +LPF_TAPS(0.000144917683015615), +LPF_TAPS(0.002170954822083053), +LPF_TAPS(-0.000000000000000010), +LPF_TAPS(-0.002086280989547721), +LPF_TAPS(-0.000133832972436669), +LPF_TAPS(0.001996295482812222), +LPF_TAPS(0.000256667900737123), +LPF_TAPS(-0.001901875273189508), +LPF_TAPS(-0.000368637650049468), +LPF_TAPS(0.001803862091048397), +LPF_TAPS(0.000469918882647158), +LPF_TAPS(-0.001703060831694895), +LPF_TAPS(-0.000560729473422398), +LPF_TAPS(0.001600238067424449), +LPF_TAPS(0.000641325764857145), +LPF_TAPS(-0.001496120693149180), +LPF_TAPS(-0.000711999684424938), +LPF_TAPS(0.001391394728381239), +LPF_TAPS(0.000773075747736378), +LPF_TAPS(-0.001286704294128211), +LPF_TAPS(-0.000824907970912845), +LPF_TAPS(0.001182650779375594), +LPF_TAPS(0.000867876715659763), +LPF_TAPS(-0.001079792208254300), +LPF_TAPS(-0.000902385490316769), +LPF_TAPS(0.000978642815687280), +LPF_TAPS(0.000928857729793190), +LPF_TAPS(-0.000879672836255881), +LPF_TAPS(-0.000947733576760587), +LPF_TAPS(0.000783308508207108), +LPF_TAPS(0.000959466685778196), +LPF_TAPS(-0.000689932291924013), +LPF_TAPS(-0.000964521071181302), +LPF_TAPS(0.000599883299797623), +LPF_TAPS(0.000963368018578730), +LPF_TAPS(-0.000513457932258434), +LPF_TAPS(-0.000956483078692794), +LPF_TAPS(0.000430910712749655), +LPF_TAPS(0.000944343161050079), +LPF_TAPS(-0.000352455312647677), +LPF_TAPS(-0.000927423743702985), +LPF_TAPS(0.000278265755551534), +LPF_TAPS(0.000906196213746451), +LPF_TAPS(-0.000208477788977747), +LPF_TAPS(-0.000881125351906698), +LPF_TAPS(0.000143190410299827), +LPF_TAPS(0.000852666972930490), +LPF_TAPS(-0.000082467532763677), +LPF_TAPS(-0.000821265731912697), +LPF_TAPS(0.000026339776589673), +LPF_TAPS(0.000787353105079299), +LPF_TAPS(0.000025193630468347), +LPF_TAPS(-0.000751345551907282), +LPF_TAPS(-0.000072162859201040), +LPF_TAPS(0.000713642863827721), +LPF_TAPS(0.000114625408040413), +LPF_TAPS(-0.000674626703136016), +LPF_TAPS(-0.000152663971685384), +LPF_TAPS(0.000634659334138613), +LPF_TAPS(0.000186384265730751), +LPF_TAPS(-0.000594082547010641), +LPF_TAPS(-0.000215912823589380), +LPF_TAPS(0.000553216773336135), +LPF_TAPS(0.000241394781671497), +LPF_TAPS(-0.000512360390863583), +LPF_TAPS(-0.000262991668324403), +LPF_TAPS(0.000471789213644001), +LPF_TAPS(0.000280879211452807), +LPF_TAPS(-0.000431756162436878), +LPF_TAPS(-0.000295245179045763), +LPF_TAPS(0.000392491109079526), +LPF_TAPS(0.000306287266039554), +LPF_TAPS(-0.000354200887423921), +LPF_TAPS(-0.000314211040060394), +LPF_TAPS(0.000317069462459603), +LPF_TAPS(0.000319227957627964), +LPF_TAPS(-0.000281258248365758), +LPF_TAPS(-0.000321553461372831), +LPF_TAPS(0.000246906565474358), +LPF_TAPS(0.000321405167739016), +LPF_TAPS(-0.000214132225480944), +LPF_TAPS(-0.000319001153521584), +LPF_TAPS(0.000183032233714526), +LPF_TAPS(0.000314558348438530), +LPF_TAPS(-0.000153683596868854), +LPF_TAPS(-0.000308291039769518), +LPF_TAPS(0.000126144224307666), +LPF_TAPS(0.000300409493922405), +LPF_TAPS(-0.000100453910882524), +LPF_TAPS(-0.000291118698623548), +LPF_TAPS(0.000076635389139154), +LPF_TAPS(0.000280617228280184), +LPF_TAPS(-0.000054695438835973), +LPF_TAPS(-0.000269096233943092), +LPF_TAPS(0.000034626041849581), +LPF_TAPS(0.000256738558214805), +LPF_TAPS(-0.000016405570791358), +LPF_TAPS(-0.000243717974411615), +LPF_TAPS(0.000000000000000002), +LPF_TAPS(0.000230198548304554), +LPF_TAPS(0.000014635871998353), +LPF_TAPS(-0.000216334119842647), +LPF_TAPS(-0.000027557198968305), +LPF_TAPS(0.000202267901407275), +LPF_TAPS(0.000038827872215975), +LPF_TAPS(-0.000188132188364734), +LPF_TAPS(-0.000048519323813871), +LPF_TAPS(0.000174048176979626), +LPF_TAPS(0.000056709356317991), +LPF_TAPS(-0.000160125884127777), +LPF_TAPS(-0.000063481006769391), +LPF_TAPS(0.000146464162706635), +LPF_TAPS(0.000068921452012099), +LPF_TAPS(-0.000133150806184833), +LPF_TAPS(-0.000073120961575807), +LPF_TAPS(0.000120262735361821), +LPF_TAPS(0.000076171903571917), +LPF_TAPS(-0.000107866260122152), +LPF_TAPS(-0.000078167808245341), +LPF_TAPS(0.000096017408766624), +LPF_TAPS(0.000079202493019870), +LPF_TAPS(-0.000084762317381802), +LPF_TAPS(-0.000079369252080098), +LPF_TAPS(0.000074137671667086), +LPF_TAPS(0.000078760112755455), +LPF_TAPS(-0.000064171193671817), +LPF_TAPS(-0.000077465160218964), +LPF_TAPS(0.000054882165999193), +LPF_TAPS(0.000075571931291371), +LPF_TAPS(-0.000046281986203924), +LPF_TAPS(-0.000073164877456309), +LPF_TAPS(0.000038374744342056), +LPF_TAPS(0.000070324896549265), +LPF_TAPS(-0.000031157816917856), +LPF_TAPS(-0.000067128931986999), +LPF_TAPS(0.000024622470808229), +LPF_TAPS(0.000063649637858348), +LPF_TAPS(-0.000018754471123261), +LPF_TAPS(-0.000059955107705322), +LPF_TAPS(0.000013534687376105), +LPF_TAPS(0.000056108664387130), +LPF_TAPS(-0.000008939692779225), +LPF_TAPS(-0.000052168708041048), +LPF_TAPS(0.000004942351950558), +LPF_TAPS(0.000048188618833547), +LPF_TAPS(-0.000001512392796211), +LPF_TAPS(-0.000044216710932948), +LPF_TAPS(-0.000001383041171332), +LPF_TAPS(0.000040296233930550), +LPF_TAPS(0.000003778861324781), +LPF_TAPS(-0.000036465417789344), +LPF_TAPS(-0.000005711529975318), +LPF_TAPS(0.000032757557306228), +LPF_TAPS(0.000007218584254945), +LPF_TAPS(-0.000029201132032658), +LPF_TAPS(-0.000008338189624081), +LPF_TAPS(0.000025819957606911), +LPF_TAPS(0.000009108724348073), +LPF_TAPS(-0.000022633364505072), +LPF_TAPS(-0.000009568395856687), +LPF_TAPS(0.000019656400313892), +LPF_TAPS(0.000009754889497821), +LPF_TAPS(-0.000016900051762228), +LPF_TAPS(-0.000009705049823939), +LPF_TAPS(0.000014371482914828), +LPF_TAPS(0.000009454594209865), +LPF_TAPS(-0.000012074286127767), +LPF_TAPS(-0.000009037858295623), +LPF_TAPS(0.000010008742584247), +LPF_TAPS(0.000008487572479706), +LPF_TAPS(-0.000008172089467830), +LPF_TAPS(-0.000007834668457273), +LPF_TAPS(0.000006558791082586), +LPF_TAPS(0.000007108114604907), +LPF_TAPS(-0.000005160811491329), +LPF_TAPS(-0.000006334778858395), +LPF_TAPS(0.000003967886509344), +LPF_TAPS(0.000005539317611880), +LPF_TAPS(-0.000002967793157365), +LPF_TAPS(-0.000004744089084507), +LPF_TAPS(0.000002146614939706), +LPF_TAPS(0.000003969089552504), +LPF_TAPS(-0.000001489001567436), +LPF_TAPS(-0.000003231910828620), +LPF_TAPS(0.000000978421988732), +LPF_TAPS(0.000002547717384186), +LPF_TAPS(-0.000000597409815756), +LPF_TAPS(-0.000001929241549214), +LPF_TAPS(0.000000327800446696), +LPF_TAPS(0.000001386795289539), +LPF_TAPS(-0.000000150959370735), +LPF_TAPS(-0.000000928297143806), +LPF_TAPS(0.000000048001310528), +LPF_TAPS(0.000000559313003533), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000283109532916), +LPF_TAPS(-0.000000011811486228), +LPF_TAPS(0.000000100719147701), +LPF_TAPS(0.000000005849842074), +LPF_TAPS(-0.000000011015600767), +LPF_TAPS(0.000000000000000000), +}; diff --git a/core/sound/blip_lpf_48K.h b/core/sound/blip_lpf_48K.h new file mode 100644 index 000000000..b6f070d34 --- /dev/null +++ b/core/sound/blip_lpf_48K.h @@ -0,0 +1,5 @@ +/* 48K sampling, 2K cutoff, 3K transition */ +enum { blip_lpf_48K_taps = 75 }; + + +#include "blip_lpf_48K_24K.h" diff --git a/core/sound/blip_lpf_48K_24K.h b/core/sound/blip_lpf_48K_24K.h new file mode 100644 index 000000000..cfc55509c --- /dev/null +++ b/core/sound/blip_lpf_48K_24K.h @@ -0,0 +1,77 @@ +static buf_t const blip_lpf_48K_24K[blip_lpf_48K_taps] = { +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000006172351880734), +LPF_TAPS(-0.000027967518784738), +LPF_TAPS(0.000073690439314385), +LPF_TAPS(-0.000148511866632178), +LPF_TAPS(0.000252294005948314), +LPF_TAPS(-0.000377448480600132), +LPF_TAPS(0.000507171487425029), +LPF_TAPS(-0.000614507519940712), +LPF_TAPS(0.000662742722649616), +LPF_TAPS(-0.000607589638848393), +LPF_TAPS(0.000401476982379787), +LPF_TAPS(-0.000000000000000019), +LPF_TAPS(-0.000629759853592583), +LPF_TAPS(0.001499729835175342), +LPF_TAPS(-0.002591217555386272), +LPF_TAPS(0.003846516360834453), +LPF_TAPS(-0.005163246483314691), +LPF_TAPS(0.006392876984000919), +LPF_TAPS(-0.007344587700569814), +LPF_TAPS(0.007795122064233218), +LPF_TAPS(-0.007504593248757817), +LPF_TAPS(0.006237413639836052), +LPF_TAPS(-0.003786722276039828), +LPF_TAPS(0.000000000000000084), +LPF_TAPS(0.005196903228349641), +LPF_TAPS(-0.011780261796860798), +LPF_TAPS(0.019616218693346690), +LPF_TAPS(-0.028457941223227038), +LPF_TAPS(0.037953457657094965), +LPF_TAPS(-0.047664323241449508), +LPF_TAPS(0.057094042553461788), +LPF_TAPS(-0.065724003835937739), +LPF_TAPS(0.073053711370429431), +LPF_TAPS(-0.078641465941841002), +LPF_TAPS(0.082141434075137285), +LPF_TAPS(0.916666347460571185), +LPF_TAPS(0.082141434075137298), +LPF_TAPS(-0.078641465941841016), +LPF_TAPS(0.073053711370429431), +LPF_TAPS(-0.065724003835937739), +LPF_TAPS(0.057094042553461788), +LPF_TAPS(-0.047664323241449522), +LPF_TAPS(0.037953457657094986), +LPF_TAPS(-0.028457941223227038), +LPF_TAPS(0.019616218693346690), +LPF_TAPS(-0.011780261796860800), +LPF_TAPS(0.005196903228349641), +LPF_TAPS(0.000000000000000084), +LPF_TAPS(-0.003786722276039829), +LPF_TAPS(0.006237413639836052), +LPF_TAPS(-0.007504593248757819), +LPF_TAPS(0.007795122064233216), +LPF_TAPS(-0.007344587700569819), +LPF_TAPS(0.006392876984000925), +LPF_TAPS(-0.005163246483314693), +LPF_TAPS(0.003846516360834457), +LPF_TAPS(-0.002591217555386270), +LPF_TAPS(0.001499729835175344), +LPF_TAPS(-0.000629759853592583), +LPF_TAPS(-0.000000000000000019), +LPF_TAPS(0.000401476982379787), +LPF_TAPS(-0.000607589638848392), +LPF_TAPS(0.000662742722649617), +LPF_TAPS(-0.000614507519940712), +LPF_TAPS(0.000507171487425029), +LPF_TAPS(-0.000377448480600133), +LPF_TAPS(0.000252294005948314), +LPF_TAPS(-0.000148511866632178), +LPF_TAPS(0.000073690439314385), +LPF_TAPS(-0.000027967518784738), +LPF_TAPS(0.000006172351880734), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000000000000000), +}; diff --git a/core/sound/blip_lpf_768K.h b/core/sound/blip_lpf_768K.h new file mode 100644 index 000000000..49cf333e4 --- /dev/null +++ b/core/sound/blip_lpf_768K.h @@ -0,0 +1,9 @@ +/* 768K sampling, 2K cutoff, 3K transition */ +enum { blip_lpf_768K_taps = 1179 }; + + +#include "blip_lpf_768K_24K.h" +#include "blip_lpf_768K_48K.h" +#include "blip_lpf_768K_96K.h" +#include "blip_lpf_768K_192K.h" +#include "blip_lpf_768K_384K.h" diff --git a/core/sound/blip_lpf_768K_192K.h b/core/sound/blip_lpf_768K_192K.h new file mode 100644 index 000000000..3777532db --- /dev/null +++ b/core/sound/blip_lpf_768K_192K.h @@ -0,0 +1,1181 @@ +static buf_t const blip_lpf_768K_192K[blip_lpf_768K_taps] = { +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000000270411187), +LPF_TAPS(0.000000005464226025), +LPF_TAPS(-0.000000002039181362), +LPF_TAPS(-0.000000022053172665), +LPF_TAPS(0.000000004555102289), +LPF_TAPS(0.000000050015122713), +LPF_TAPS(-0.000000006729075807), +LPF_TAPS(-0.000000089535638879), +LPF_TAPS(0.000000007450379996), +LPF_TAPS(0.000000140736086864), +LPF_TAPS(-0.000000005589328078), +LPF_TAPS(-0.000000203672228149), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000278332885067), +LPF_TAPS(0.000000010476952729), +LPF_TAPS(-0.000000364638680968), +LPF_TAPS(-0.000000027011428462), +LPF_TAPS(0.000000462440858539), +LPF_TAPS(0.000000050780922643), +LPF_TAPS(-0.000000571520179580), +LPF_TAPS(-0.000000082967500509), +LPF_TAPS(0.000000691585909819), +LPF_TAPS(0.000000124754695030), +LPF_TAPS(-0.000000822274892573), +LPF_TAPS(-0.000000177324329996), +LPF_TAPS(0.000000963150715332), +LPF_TAPS(0.000000241853268333), +LPF_TAPS(-0.000001113702973585), +LPF_TAPS(-0.000000319510085909), +LPF_TAPS(0.000001273346636437), +LPF_TAPS(0.000000411451671308), +LPF_TAPS(-0.000001441421518830), +LPF_TAPS(-0.000000518819752302), +LPF_TAPS(0.000001617191865353), +LPF_TAPS(0.000000642737349976), +LPF_TAPS(-0.000001799846050903), +LPF_TAPS(-0.000000784305161806), +LPF_TAPS(0.000001988496403598), +LPF_TAPS(0.000000944597875235), +LPF_TAPS(-0.000002182179155572), +LPF_TAPS(-0.000001124660413670), +LPF_TAPS(0.000002379854527418), +LPF_TAPS(0.000001325504117162), +LPF_TAPS(-0.000002580406952221), +LPF_TAPS(-0.000001548102860405), +LPF_TAPS(0.000002782645445234), +LPF_TAPS(0.000001793389111064), +LPF_TAPS(-0.000002985304125357), +LPF_TAPS(-0.000002062249931914), +LPF_TAPS(0.000003187042894687), +LPF_TAPS(0.000002355522930638), +LPF_TAPS(-0.000003386448282433), +LPF_TAPS(-0.000002673992161604), +LPF_TAPS(0.000003582034459542), +LPF_TAPS(0.000003018383984428), +LPF_TAPS(-0.000003772244430401), +LPF_TAPS(-0.000003389362884580), +LPF_TAPS(0.000003955451407915), +LPF_TAPS(0.000003787527261756), +LPF_TAPS(-0.000004129960378251), +LPF_TAPS(-0.000004213405192313), +LPF_TAPS(0.000004294009861432), +LPF_TAPS(0.000004667450172476), +LPF_TAPS(-0.000004445773873841), +LPF_TAPS(-0.000005150036849619), +LPF_TAPS(0.000004583364098553), +LPF_TAPS(0.000005661456749387), +LPF_TAPS(-0.000004704832269243), +LPF_TAPS(-0.000006201914006984), +LPF_TAPS(0.000004808172773150), +LPF_TAPS(0.000006771521111433), +LPF_TAPS(-0.000004891325478376), +LPF_TAPS(-0.000007370294672177), +LPF_TAPS(0.000004952178790474), +LPF_TAPS(0.000007998151217884), +LPF_TAPS(-0.000004988572942947), +LPF_TAPS(-0.000008654903037807), +LPF_TAPS(0.000004998303525934), +LPF_TAPS(0.000009340254076601), +LPF_TAPS(-0.000004979125256946), +LPF_TAPS(-0.000010053795893948), +LPF_TAPS(0.000004928755997066), +LPF_TAPS(0.000010795003700833), +LPF_TAPS(-0.000004844881015559), +LPF_TAPS(-0.000011563232484775), +LPF_TAPS(0.000004725157505337), +LPF_TAPS(0.000012357713236772), +LPF_TAPS(-0.000004567219351147), +LPF_TAPS(-0.000013177549293115), +LPF_TAPS(0.000004368682151773), +LPF_TAPS(0.000014021712805663), +LPF_TAPS(-0.000004127148496975), +LPF_TAPS(-0.000014889041354518), +LPF_TAPS(0.000003840213499109), +LPF_TAPS(0.000015778234717405), +LPF_TAPS(-0.000003505470578851), +LPF_TAPS(-0.000016687851810380), +LPF_TAPS(0.000003120517503602), +LPF_TAPS(0.000017616307814767), +LPF_TAPS(-0.000002682962676418), +LPF_TAPS(-0.000018561871505499), +LPF_TAPS(0.000002190431672634), +LPF_TAPS(0.000019522662796228), +LPF_TAPS(-0.000001640574020396), +LPF_TAPS(-0.000020496650516781), +LPF_TAPS(0.000001031070220591), +LPF_TAPS(0.000021481650438649), +LPF_TAPS(-0.000000359639000791), +LPF_TAPS(-0.000022475323564316), +LPF_TAPS(-0.000000375955203094), +LPF_TAPS(0.000023475174696270), +LPF_TAPS(0.000001177894544622), +LPF_TAPS(-0.000024478551301565), +LPF_TAPS(-0.000002048299852131), +LPF_TAPS(0.000025482642687743), +LPF_TAPS(0.000002989222510623), +LPF_TAPS(-0.000026484479505846), +LPF_TAPS(-0.000004002636150150), +LPF_TAPS(0.000027480933596112), +LPF_TAPS(0.000005090428151623), +LPF_TAPS(-0.000028468718191753), +LPF_TAPS(-0.000006254390981889), +LPF_TAPS(0.000029444388495961), +LPF_TAPS(0.000007496213370957), +LPF_TAPS(-0.000030404342647009), +LPF_TAPS(-0.000008817471345155), +LPF_TAPS(0.000031344823085946), +LPF_TAPS(0.000010219619130956), +LPF_TAPS(-0.000032261918340969), +LPF_TAPS(-0.000011703979945270), +LPF_TAPS(0.000033151565242131), +LPF_TAPS(0.000013271736688854), +LPF_TAPS(-0.000034009551579453), +LPF_TAPS(-0.000014923922560452), +LPF_TAPS(0.000034831519217002), +LPF_TAPS(0.000016661411610296), +LPF_TAPS(-0.000035612967674835), +LPF_TAPS(-0.000018484909252414), +LPF_TAPS(0.000036349258189961), +LPF_TAPS(0.000020394942756081), +LPF_TAPS(-0.000037035618266847), +LPF_TAPS(-0.000022391851737813), +LPF_TAPS(0.000037667146727081), +LPF_TAPS(0.000024475778675831), +LPF_TAPS(-0.000038238819266954), +LPF_TAPS(-0.000026646659470014), +LPF_TAPS(0.000038745494530907), +LPF_TAPS(0.000028904214071107), +LPF_TAPS(-0.000039181920707691), +LPF_TAPS(-0.000031247937203481), +LPF_TAPS(0.000039542742655132), +LPF_TAPS(0.000033677089206780), +LPF_TAPS(-0.000039822509558359), +LPF_TAPS(-0.000036190687022217), +LPF_TAPS(0.000040015683125125), +LPF_TAPS(0.000038787495349966), +LPF_TAPS(-0.000040116646320761), +LPF_TAPS(-0.000041466018004756), +LPF_TAPS(0.000040119712644108), +LPF_TAPS(0.000044224489497212), +LPF_TAPS(-0.000040019135944408), +LPF_TAPS(-0.000047060866868922), +LPF_TAPS(0.000039809120777898), +LPF_TAPS(0.000049972821809768), +LPF_TAPS(-0.000039483833301589), +LPF_TAPS(-0.000052957733086275), +LPF_TAPS(0.000039037412700123), +LPF_TAPS(0.000056012679310092), +LPF_TAPS(-0.000038463983140413), +LPF_TAPS(-0.000059134432075883), +LPF_TAPS(0.000037757666247151), +LPF_TAPS(0.000062319449498186), +LPF_TAPS(-0.000036912594090979), +LPF_TAPS(-0.000065563870176755), +LPF_TAPS(0.000035922922679381), +LPF_TAPS(0.000068863507619961), +LPF_TAPS(-0.000034782845939036), +LPF_TAPS(-0.000072213845155834), +LPF_TAPS(0.000033486610176828), +LPF_TAPS(0.000075610031360122), +LPF_TAPS(-0.000032028529004963), +LPF_TAPS(-0.000079046876030527), +LPF_TAPS(0.000030402998714268), +LPF_TAPS(0.000082518846736081), +LPF_TAPS(-0.000028604514078264), +LPF_TAPS(-0.000086020065970184), +LPF_TAPS(0.000026627684568545), +LPF_TAPS(0.000089544308935324), +LPF_TAPS(-0.000024467250961158), +LPF_TAPS(-0.000093085001987199), +LPF_TAPS(0.000022118102311547), +LPF_TAPS(0.000096635221765021), +LPF_TAPS(-0.000019575293274054), +LPF_TAPS(-0.000100187695034352), +LPF_TAPS(0.000016834061741043), +LPF_TAPS(0.000103734799267992), +LPF_TAPS(-0.000013889846774370), +LPF_TAPS(-0.000107268563989415), +LPF_TAPS(0.000010738306800940), +LPF_TAPS(0.000110780672902561), +LPF_TAPS(-0.000007375338042619), +LPF_TAPS(-0.000114262466830563), +LPF_TAPS(0.000003797093148942), +LPF_TAPS(0.000117704947484981), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000121098782085899), +LPF_TAPS(-0.000004019219354460), +LPF_TAPS(0.000124434308851991), +LPF_TAPS(0.000008263529655400), +LPF_TAPS(-0.000127701543378277), +LPF_TAPS(-0.000012735563330892), +LPF_TAPS(0.000130890185917930), +LPF_TAPS(0.000017437601366372), +LPF_TAPS(-0.000133989629582932), +LPF_TAPS(-0.000022371554188088), +LPF_TAPS(0.000136988969476841), +LPF_TAPS(0.000027538942599739), +LPF_TAPS(-0.000139877012771326), +LPF_TAPS(-0.000032940878813716), +LPF_TAPS(0.000142642289736313), +LPF_TAPS(0.000038578047618915), +LPF_TAPS(-0.000145273065731922), +LPF_TAPS(-0.000044450687728521), +LPF_TAPS(0.000147757354168510), +LPF_TAPS(0.000050558573351575), +LPF_TAPS(-0.000150082930439164), +LPF_TAPS(-0.000056900996032834), +LPF_TAPS(0.000152237346827124), +LPF_TAPS(0.000063476746806541), +LPF_TAPS(-0.000154207948388639), +LPF_TAPS(-0.000070284098709880), +LPF_TAPS(0.000155981889809562), +LPF_TAPS(0.000077320789702193), +LPF_TAPS(-0.000157546153231995), +LPF_TAPS(-0.000084584006037386), +LPF_TAPS(0.000158887567045323), +LPF_TAPS(0.000092070366135805), +LPF_TAPS(-0.000159992825633266), +LPF_TAPS(-0.000099775905003113), +LPF_TAPS(0.000160848510067184), +LPF_TAPS(0.000107696059243807), +LPF_TAPS(-0.000161441109732858), +LPF_TAPS(-0.000115825652715863), +LPF_TAPS(0.000161757044876159), +LPF_TAPS(0.000124158882874344), +LPF_TAPS(-0.000161782690050796), +LPF_TAPS(-0.000132689307850565), +LPF_TAPS(0.000161504398448678), +LPF_TAPS(0.000141409834313202), +LPF_TAPS(-0.000160908527091470), +LPF_TAPS(-0.000150312706157744), +LPF_TAPS(0.000159981462859707), +LPF_TAPS(0.000159389494069615), +LPF_TAPS(-0.000158709649333105), +LPF_TAPS(-0.000168631086005580), +LPF_TAPS(0.000157079614413859), +LPF_TAPS(0.000178027678637799), +LPF_TAPS(-0.000155077998702502), +LPF_TAPS(-0.000187568769803267), +LPF_TAPS(0.000152691584593175), +LPF_TAPS(0.000197243152000898), +LPF_TAPS(-0.000149907326053507), +LPF_TAPS(-0.000207038906976828), +LPF_TAPS(0.000146712379051885), +LPF_TAPS(0.000216943401437930), +LPF_TAPS(-0.000143094132592875), +LPF_TAPS(-0.000226943283931415), +LPF_TAPS(0.000139040240319026), +LPF_TAPS(0.000237024482927353), +LPF_TAPS(-0.000134538652636258), +LPF_TAPS(-0.000247172206139378), +LPF_TAPS(0.000129577649317022), +LPF_TAPS(0.000257370941116722), +LPF_TAPS(-0.000124145872533844), +LPF_TAPS(-0.000267604457139195), +LPF_TAPS(0.000118232360274576), +LPF_TAPS(0.000277855808445009), +LPF_TAPS(-0.000111826580088162), +LPF_TAPS(-0.000288107338818654), +LPF_TAPS(0.000104918463108302), +LPF_TAPS(0.000298340687564529), +LPF_TAPS(-0.000097498438301123), +LPF_TAPS(-0.000308536796889542), +LPF_TAPS(0.000089557466881093), +LPF_TAPS(0.000318675920715468), +LPF_TAPS(-0.000081087076837988), +LPF_TAPS(-0.000328737634939617), +LPF_TAPS(0.000072079397516850), +LPF_TAPS(0.000338700849159800), +LPF_TAPS(-0.000062527194191441), +LPF_TAPS(-0.000348543819876908), +LPF_TAPS(0.000052423902570022), +LPF_TAPS(0.000358244165185824), +LPF_TAPS(-0.000041763663172922), +LPF_TAPS(-0.000367778880962728), +LPF_TAPS(0.000030541355518856), +LPF_TAPS(0.000377124358553825), +LPF_TAPS(-0.000018752632056849), +LPF_TAPS(-0.000386256403967828), +LPF_TAPS(0.000006393951780809), +LPF_TAPS(0.000395150258571598), +LPF_TAPS(0.000006537386537703), +LPF_TAPS(-0.000403780621285212), +LPF_TAPS(-0.000020043211562898), +LPF_TAPS(0.000412121672269845), +LPF_TAPS(0.000034124447118409), +LPF_TAPS(-0.000420147098098687), +LPF_TAPS(-0.000048781080485743), +LPF_TAPS(0.000427830118398051), +LPF_TAPS(0.000064012131341976), +LPF_TAPS(-0.000435143513942678), +LPF_TAPS(-0.000079815621400166), +LPF_TAPS(0.000442059656186037), +LPF_TAPS(0.000096188544815881), +LPF_TAPS(-0.000448550538203314), +LPF_TAPS(-0.000113126839423332), +LPF_TAPS(0.000454587807021607), +LPF_TAPS(0.000130625358861683), +LPF_TAPS(-0.000460142797308446), +LPF_TAPS(-0.000148677845653371), +LPF_TAPS(0.000465186566386890), +LPF_TAPS(0.000167276905294243), +LPF_TAPS(-0.000469689930542188), +LPF_TAPS(-0.000186413981413071), +LPF_TAPS(0.000473623502581409), +LPF_TAPS(0.000206079332057869), +LPF_TAPS(-0.000476957730605114), +LPF_TAPS(-0.000226262007164247), +LPF_TAPS(0.000479662937946381), +LPF_TAPS(0.000246949827258589), +LPF_TAPS(-0.000481709364229588), +LPF_TAPS(-0.000268129363447485), +LPF_TAPS(0.000483067207498627), +LPF_TAPS(0.000289785918742595), +LPF_TAPS(-0.000483706667360984), +LPF_TAPS(-0.000311903510766968), +LPF_TAPS(0.000483597989091136), +LPF_TAPS(0.000334464855886926), +LPF_TAPS(-0.000482711508634332), +LPF_TAPS(-0.000357451354810840), +LPF_TAPS(0.000481017698448667), +LPF_TAPS(0.000380843079692384), +LPF_TAPS(-0.000478487214120758), +LPF_TAPS(-0.000404618762773439), +LPF_TAPS(0.000475090941687849), +LPF_TAPS(0.000428755786598220), +LPF_TAPS(-0.000470800045596781), +LPF_TAPS(-0.000453230175826497), +LPF_TAPS(0.000465586017227704), +LPF_TAPS(0.000478016590669961), +LPF_TAPS(-0.000459420723907908), +LPF_TAPS(-0.000503088321972070), +LPF_TAPS(0.000452276458339745), +LPF_TAPS(0.000528417287947738), +LPF_TAPS(-0.000444125988363888), +LPF_TAPS(-0.000553974032593938), +LPF_TAPS(0.000434942606977188), +LPF_TAPS(0.000579727725779194), +LPF_TAPS(-0.000424700182523640), +LPF_TAPS(-0.000605646165013736), +LPF_TAPS(0.000413373208973718), +LPF_TAPS(0.000631695778898094), +LPF_TAPS(-0.000400936856207481), +LPF_TAPS(-0.000657841632242460), +LPF_TAPS(0.000387367020214454), +LPF_TAPS(0.000684047432843816), +LPF_TAPS(-0.000372640373122280), +LPF_TAPS(-0.000710275539901573), +LPF_TAPS(0.000356734412965341), +LPF_TAPS(0.000736486974048094), +LPF_TAPS(-0.000339627513103736), +LPF_TAPS(-0.000762641428962928), +LPF_TAPS(0.000321298971202047), +LPF_TAPS(0.000788697284533992), +LPF_TAPS(-0.000301729057676401), +LPF_TAPS(-0.000814611621522312), +LPF_TAPS(0.000280899063519201), +LPF_TAPS(0.000840340237680266), +LPF_TAPS(-0.000258791347409589), +LPF_TAPS(-0.000865837665265529), +LPF_TAPS(0.000235389382017556), +LPF_TAPS(0.000891057189886533), +LPF_TAPS(-0.000210677799411442), +LPF_TAPS(-0.000915950870606544), +LPF_TAPS(0.000184642435476311), +LPF_TAPS(0.000940469561226123), +LPF_TAPS(-0.000157270373253856), +LPF_TAPS(-0.000964562932655105), +LPF_TAPS(0.000128549985113490), +LPF_TAPS(0.000988179496276455), +LPF_TAPS(-0.000098470973665477), +LPF_TAPS(-0.001011266628194997), +LPF_TAPS(0.000067024411328462), +LPF_TAPS(0.001033770594254893), +LPF_TAPS(-0.000034202778465029), +LPF_TAPS(-0.001055636575699028), +LPF_TAPS(0.000000000000000001), +LPF_TAPS(0.001076808695333126), +LPF_TAPS(0.000035588519562657), +LPF_TAPS(-0.001097230044046120), +LPF_TAPS(-0.000072565862804956), +LPF_TAPS(0.001116842707526315), +LPF_TAPS(0.000110933567822261), +LPF_TAPS(-0.001135587793000342), +LPF_TAPS(-0.000150691598491106), +LPF_TAPS(0.001153405455808370), +LPF_TAPS(0.000191838316651094), +LPF_TAPS(-0.001170234925614872), +LPF_TAPS(-0.000234370456275451), +LPF_TAPS(0.001186014532038874), +LPF_TAPS(0.000278283099698674), +LPF_TAPS(-0.001200681729471176), +LPF_TAPS(-0.000323569655969105), +LPF_TAPS(0.001214173120828369), +LPF_TAPS(0.000370221841390830), +LPF_TAPS(-0.001226424479975013), +LPF_TAPS(-0.000418229662315629), +LPF_TAPS(0.001237370772523770), +LPF_TAPS(0.000467581400242392), +LPF_TAPS(-0.001246946174701972), +LPF_TAPS(-0.000518263599278438), +LPF_TAPS(0.001255084089948550), +LPF_TAPS(0.000570261056014149), +LPF_TAPS(-0.001261717162878848), +LPF_TAPS(-0.000623556811856089), +LPF_TAPS(0.001266777290225573), +LPF_TAPS(0.000678132147863779), +LPF_TAPS(-0.001270195628333515), +LPF_TAPS(-0.000733966582127434), +LPF_TAPS(0.001271902596749720), +LPF_TAPS(0.000791037869722423), +LPF_TAPS(-0.001271827877412626), +LPF_TAPS(-0.000849322005271670), +LPF_TAPS(0.001269900408902514), +LPF_TAPS(0.000908793228141729), +LPF_TAPS(-0.001266048375166084), +LPF_TAPS(-0.000969424030294818), +LPF_TAPS(0.001260199188078141), +LPF_TAPS(0.001031185166814938), +LPF_TAPS(-0.001252279463143894), +LPF_TAPS(-0.001094045669120904), +LPF_TAPS(0.001242214987580476), +LPF_TAPS(0.001157972860874287), +LPF_TAPS(-0.001229930679943168), +LPF_TAPS(-0.001222932376587285), +LPF_TAPS(0.001215350540382264), +LPF_TAPS(0.001288888182928606), +LPF_TAPS(-0.001198397590521112), +LPF_TAPS(-0.001355802602721991), +LPF_TAPS(0.001178993801846175), +LPF_TAPS(0.001423636341627361), +LPF_TAPS(-0.001157060011381363), +LPF_TAPS(-0.001492348517489139), +LPF_TAPS(0.001132515823287145), +LPF_TAPS(0.001561896692331240), +LPF_TAPS(-0.001105279494874691), +LPF_TAPS(-0.001632236906974967), +LPF_TAPS(0.001075267805358061), +LPF_TAPS(0.001703323718249198), +LPF_TAPS(-0.001042395905468702), +LPF_TAPS(-0.001775110238758652), +LPF_TAPS(0.001006577145840449), +LPF_TAPS(0.001847548179171371), +LPF_TAPS(-0.000967722881817869), +LPF_TAPS(-0.001920587892981246), +LPF_TAPS(0.000925742252050820), +LPF_TAPS(0.001994178423696552), +LPF_TAPS(-0.000880541927906545), +LPF_TAPS(-0.002068267554402306), +LPF_TAPS(0.000832025830346419), +LPF_TAPS(0.002142801859637292), +LPF_TAPS(-0.000780094810472054), +LPF_TAPS(-0.002217726759524548), +LPF_TAPS(0.000724646289434996), +LPF_TAPS(0.002292986576088003), +LPF_TAPS(-0.000665573852808821), +LPF_TAPS(-0.002368524591684551), +LPF_TAPS(0.000602766793834741), +LPF_TAPS(0.002444283109475893), +LPF_TAPS(-0.000536109599146661), +LPF_TAPS(-0.002520203515861609), +LPF_TAPS(0.000465481369642675), +LPF_TAPS(0.002596226344789195), +LPF_TAPS(-0.000390755168068576), +LPF_TAPS(-0.002672291343854694), +LPF_TAPS(0.000311797283586851), +LPF_TAPS(0.002748337542102629), +LPF_TAPS(-0.000228466402077559), +LPF_TAPS(-0.002824303319430995), +LPF_TAPS(0.000140612669117720), +LPF_TAPS(0.002900126477503273), +LPF_TAPS(-0.000048076630447099), +LPF_TAPS(-0.002975744312066664), +LPF_TAPS(-0.000049311967813908), +LPF_TAPS(0.003051093686572026), +LPF_TAPS(0.000151735539964805), +LPF_TAPS(-0.003126111106988650), +LPF_TAPS(-0.000259390206949400), +LPF_TAPS(0.003200732797703957), +LPF_TAPS(0.000372487556785411), +LPF_TAPS(-0.003274894778395678), +LPF_TAPS(-0.000491256653256188), +LPF_TAPS(0.003348532941762045), +LPF_TAPS(0.000615946333320373), +LPF_TAPS(-0.003421583131992657), +LPF_TAPS(-0.000746827841480148), +LPF_TAPS(0.003493981223861782), +LPF_TAPS(0.000884197858865158), +LPF_TAPS(-0.003565663202323037), +LPF_TAPS(-0.001028381996475798), +LPF_TAPS(0.003636565242483652), +LPF_TAPS(0.001179738836445650), +LPF_TAPS(-0.003706623789834758), +LPF_TAPS(-0.001338664623068026), +LPF_TAPS(0.003775775640613427), +LPF_TAPS(0.001505598727615959), +LPF_TAPS(-0.003843958022170892), +LPF_TAPS(-0.001681030038931735), +LPF_TAPS(0.003911108673221020), +LPF_TAPS(0.001865504466995201), +LPF_TAPS(-0.003977165923842889), +LPF_TAPS(-0.002059633791377601), +LPF_TAPS(0.004042068775110544), +LPF_TAPS(0.002264106143571020), +LPF_TAPS(-0.004105756978223527), +LPF_TAPS(-0.002479698485574325), +LPF_TAPS(0.004168171113012271), +LPF_TAPS(0.002707291542161917), +LPF_TAPS(-0.004229252665692150), +LPF_TAPS(-0.002947887768313048), +LPF_TAPS(0.004288944105741360), +LPF_TAPS(0.003202633096500789), +LPF_TAPS(-0.004347188961779128), +LPF_TAPS(-0.003472843425182641), +LPF_TAPS(0.004403931896320721), +LPF_TAPS(0.003760037100055920), +LPF_TAPS(-0.004459118779288241), +LPF_TAPS(-0.004065975032297385), +LPF_TAPS(0.004512696760158023), +LPF_TAPS(0.004392710634902094), +LPF_TAPS(-0.004564614338625998), +LPF_TAPS(-0.004742652500755700), +LPF_TAPS(0.004614821433675697), +LPF_TAPS(0.005118643785605256), +LPF_TAPS(-0.004663269450936213), +LPF_TAPS(-0.005524063733774922), +LPF_TAPS(0.004709911348218218), +LPF_TAPS(0.005962958906579988), +LPF_TAPS(-0.004754701699120422), +LPF_TAPS(-0.006440214774937782), +LPF_TAPS(0.004797596754602302), +LPF_TAPS(0.006961782948076841), +LPF_TAPS(-0.004838554502419361), +LPF_TAPS(-0.007534986291718715), +LPF_TAPS(0.004877534724323964), +LPF_TAPS(0.008168934978658603), +LPF_TAPS(-0.004914499050936128), +LPF_TAPS(-0.008875103569123370), +LPF_TAPS(0.004949411014192367), +LPF_TAPS(0.009668146858266438), +LPF_TAPS(-0.004982236097286190), +LPF_TAPS(-0.010567078294794799), +LPF_TAPS(0.005012941782016459), +LPF_TAPS(0.011597014009338947), +LPF_TAPS(-0.005041497593463745), +LPF_TAPS(-0.012791826735496585), +LPF_TAPS(0.005067875141921109), +LPF_TAPS(0.014198316217362795), +LPF_TAPS(-0.005092048162008614), +LPF_TAPS(-0.015883013513289131), +LPF_TAPS(0.005113992548904921), +LPF_TAPS(0.017943788285475964), +LPF_TAPS(-0.005133686391636841), +LPF_TAPS(-0.020530741860699774), +LPF_TAPS(0.005151110003369837), +LPF_TAPS(0.023886386121836339), +LPF_TAPS(-0.005166245948648558), +LPF_TAPS(-0.028429653831338730), +LPF_TAPS(0.005179079067541477), +LPF_TAPS(0.034951922612326908), +LPF_TAPS(-0.005189596496650059), +LPF_TAPS(-0.045149079900442757), +LPF_TAPS(0.005197787686945111), +LPF_TAPS(0.063430543582118512), +LPF_TAPS(-0.005203644418401950), +LPF_TAPS(-0.105964364852374607), +LPF_TAPS(0.005207160811409030), +LPF_TAPS(0.318263564357176620), +LPF_TAPS(0.494791666818391318), +LPF_TAPS(0.318263564357176620), +LPF_TAPS(0.005207160811409030), +LPF_TAPS(-0.105964364852374607), +LPF_TAPS(-0.005203644418401950), +LPF_TAPS(0.063430543582118512), +LPF_TAPS(0.005197787686945111), +LPF_TAPS(-0.045149079900442757), +LPF_TAPS(-0.005189596496650059), +LPF_TAPS(0.034951922612326908), +LPF_TAPS(0.005179079067541477), +LPF_TAPS(-0.028429653831338730), +LPF_TAPS(-0.005166245948648558), +LPF_TAPS(0.023886386121836339), +LPF_TAPS(0.005151110003369838), +LPF_TAPS(-0.020530741860699774), +LPF_TAPS(-0.005133686391636841), +LPF_TAPS(0.017943788285475964), +LPF_TAPS(0.005113992548904922), +LPF_TAPS(-0.015883013513289131), +LPF_TAPS(-0.005092048162008615), +LPF_TAPS(0.014198316217362795), +LPF_TAPS(0.005067875141921110), +LPF_TAPS(-0.012791826735496585), +LPF_TAPS(-0.005041497593463745), +LPF_TAPS(0.011597014009338947), +LPF_TAPS(0.005012941782016459), +LPF_TAPS(-0.010567078294794799), +LPF_TAPS(-0.004982236097286190), +LPF_TAPS(0.009668146858266438), +LPF_TAPS(0.004949411014192368), +LPF_TAPS(-0.008875103569123370), +LPF_TAPS(-0.004914499050936128), +LPF_TAPS(0.008168934978658605), +LPF_TAPS(0.004877534724323964), +LPF_TAPS(-0.007534986291718715), +LPF_TAPS(-0.004838554502419361), +LPF_TAPS(0.006961782948076841), +LPF_TAPS(0.004797596754602302), +LPF_TAPS(-0.006440214774937783), +LPF_TAPS(-0.004754701699120422), +LPF_TAPS(0.005962958906579988), +LPF_TAPS(0.004709911348218218), +LPF_TAPS(-0.005524063733774922), +LPF_TAPS(-0.004663269450936213), +LPF_TAPS(0.005118643785605256), +LPF_TAPS(0.004614821433675698), +LPF_TAPS(-0.004742652500755700), +LPF_TAPS(-0.004564614338625999), +LPF_TAPS(0.004392710634902094), +LPF_TAPS(0.004512696760158023), +LPF_TAPS(-0.004065975032297386), +LPF_TAPS(-0.004459118779288240), +LPF_TAPS(0.003760037100055921), +LPF_TAPS(0.004403931896320721), +LPF_TAPS(-0.003472843425182641), +LPF_TAPS(-0.004347188961779128), +LPF_TAPS(0.003202633096500789), +LPF_TAPS(0.004288944105741361), +LPF_TAPS(-0.002947887768313048), +LPF_TAPS(-0.004229252665692151), +LPF_TAPS(0.002707291542161917), +LPF_TAPS(0.004168171113012272), +LPF_TAPS(-0.002479698485574325), +LPF_TAPS(-0.004105756978223527), +LPF_TAPS(0.002264106143571020), +LPF_TAPS(0.004042068775110545), +LPF_TAPS(-0.002059633791377602), +LPF_TAPS(-0.003977165923842889), +LPF_TAPS(0.001865504466995201), +LPF_TAPS(0.003911108673221020), +LPF_TAPS(-0.001681030038931735), +LPF_TAPS(-0.003843958022170892), +LPF_TAPS(0.001505598727615959), +LPF_TAPS(0.003775775640613427), +LPF_TAPS(-0.001338664623068026), +LPF_TAPS(-0.003706623789834758), +LPF_TAPS(0.001179738836445650), +LPF_TAPS(0.003636565242483653), +LPF_TAPS(-0.001028381996475798), +LPF_TAPS(-0.003565663202323037), +LPF_TAPS(0.000884197858865158), +LPF_TAPS(0.003493981223861783), +LPF_TAPS(-0.000746827841480148), +LPF_TAPS(-0.003421583131992658), +LPF_TAPS(0.000615946333320373), +LPF_TAPS(0.003348532941762046), +LPF_TAPS(-0.000491256653256187), +LPF_TAPS(-0.003274894778395678), +LPF_TAPS(0.000372487556785411), +LPF_TAPS(0.003200732797703957), +LPF_TAPS(-0.000259390206949401), +LPF_TAPS(-0.003126111106988651), +LPF_TAPS(0.000151735539964805), +LPF_TAPS(0.003051093686572026), +LPF_TAPS(-0.000049311967813908), +LPF_TAPS(-0.002975744312066664), +LPF_TAPS(-0.000048076630447099), +LPF_TAPS(0.002900126477503272), +LPF_TAPS(0.000140612669117720), +LPF_TAPS(-0.002824303319430995), +LPF_TAPS(-0.000228466402077559), +LPF_TAPS(0.002748337542102630), +LPF_TAPS(0.000311797283586851), +LPF_TAPS(-0.002672291343854695), +LPF_TAPS(-0.000390755168068576), +LPF_TAPS(0.002596226344789195), +LPF_TAPS(0.000465481369642675), +LPF_TAPS(-0.002520203515861609), +LPF_TAPS(-0.000536109599146661), +LPF_TAPS(0.002444283109475894), +LPF_TAPS(0.000602766793834741), +LPF_TAPS(-0.002368524591684551), +LPF_TAPS(-0.000665573852808821), +LPF_TAPS(0.002292986576088003), +LPF_TAPS(0.000724646289434996), +LPF_TAPS(-0.002217726759524548), +LPF_TAPS(-0.000780094810472054), +LPF_TAPS(0.002142801859637292), +LPF_TAPS(0.000832025830346418), +LPF_TAPS(-0.002068267554402307), +LPF_TAPS(-0.000880541927906545), +LPF_TAPS(0.001994178423696553), +LPF_TAPS(0.000925742252050820), +LPF_TAPS(-0.001920587892981246), +LPF_TAPS(-0.000967722881817869), +LPF_TAPS(0.001847548179171371), +LPF_TAPS(0.001006577145840448), +LPF_TAPS(-0.001775110238758653), +LPF_TAPS(-0.001042395905468702), +LPF_TAPS(0.001703323718249198), +LPF_TAPS(0.001075267805358061), +LPF_TAPS(-0.001632236906974967), +LPF_TAPS(-0.001105279494874691), +LPF_TAPS(0.001561896692331240), +LPF_TAPS(0.001132515823287146), +LPF_TAPS(-0.001492348517489139), +LPF_TAPS(-0.001157060011381363), +LPF_TAPS(0.001423636341627361), +LPF_TAPS(0.001178993801846175), +LPF_TAPS(-0.001355802602721991), +LPF_TAPS(-0.001198397590521113), +LPF_TAPS(0.001288888182928606), +LPF_TAPS(0.001215350540382264), +LPF_TAPS(-0.001222932376587285), +LPF_TAPS(-0.001229930679943168), +LPF_TAPS(0.001157972860874288), +LPF_TAPS(0.001242214987580477), +LPF_TAPS(-0.001094045669120904), +LPF_TAPS(-0.001252279463143894), +LPF_TAPS(0.001031185166814938), +LPF_TAPS(0.001260199188078142), +LPF_TAPS(-0.000969424030294817), +LPF_TAPS(-0.001266048375166084), +LPF_TAPS(0.000908793228141729), +LPF_TAPS(0.001269900408902515), +LPF_TAPS(-0.000849322005271671), +LPF_TAPS(-0.001271827877412626), +LPF_TAPS(0.000791037869722423), +LPF_TAPS(0.001271902596749720), +LPF_TAPS(-0.000733966582127433), +LPF_TAPS(-0.001270195628333515), +LPF_TAPS(0.000678132147863779), +LPF_TAPS(0.001266777290225573), +LPF_TAPS(-0.000623556811856090), +LPF_TAPS(-0.001261717162878848), +LPF_TAPS(0.000570261056014149), +LPF_TAPS(0.001255084089948549), +LPF_TAPS(-0.000518263599278438), +LPF_TAPS(-0.001246946174701972), +LPF_TAPS(0.000467581400242392), +LPF_TAPS(0.001237370772523770), +LPF_TAPS(-0.000418229662315629), +LPF_TAPS(-0.001226424479975014), +LPF_TAPS(0.000370221841390830), +LPF_TAPS(0.001214173120828369), +LPF_TAPS(-0.000323569655969105), +LPF_TAPS(-0.001200681729471177), +LPF_TAPS(0.000278283099698674), +LPF_TAPS(0.001186014532038875), +LPF_TAPS(-0.000234370456275451), +LPF_TAPS(-0.001170234925614872), +LPF_TAPS(0.000191838316651094), +LPF_TAPS(0.001153405455808370), +LPF_TAPS(-0.000150691598491106), +LPF_TAPS(-0.001135587793000342), +LPF_TAPS(0.000110933567822261), +LPF_TAPS(0.001116842707526315), +LPF_TAPS(-0.000072565862804956), +LPF_TAPS(-0.001097230044046120), +LPF_TAPS(0.000035588519562657), +LPF_TAPS(0.001076808695333126), +LPF_TAPS(0.000000000000000001), +LPF_TAPS(-0.001055636575699027), +LPF_TAPS(-0.000034202778465030), +LPF_TAPS(0.001033770594254894), +LPF_TAPS(0.000067024411328462), +LPF_TAPS(-0.001011266628194997), +LPF_TAPS(-0.000098470973665477), +LPF_TAPS(0.000988179496276456), +LPF_TAPS(0.000128549985113490), +LPF_TAPS(-0.000964562932655105), +LPF_TAPS(-0.000157270373253856), +LPF_TAPS(0.000940469561226123), +LPF_TAPS(0.000184642435476311), +LPF_TAPS(-0.000915950870606545), +LPF_TAPS(-0.000210677799411442), +LPF_TAPS(0.000891057189886533), +LPF_TAPS(0.000235389382017556), +LPF_TAPS(-0.000865837665265529), +LPF_TAPS(-0.000258791347409589), +LPF_TAPS(0.000840340237680265), +LPF_TAPS(0.000280899063519201), +LPF_TAPS(-0.000814611621522313), +LPF_TAPS(-0.000301729057676401), +LPF_TAPS(0.000788697284533992), +LPF_TAPS(0.000321298971202047), +LPF_TAPS(-0.000762641428962928), +LPF_TAPS(-0.000339627513103736), +LPF_TAPS(0.000736486974048094), +LPF_TAPS(0.000356734412965341), +LPF_TAPS(-0.000710275539901574), +LPF_TAPS(-0.000372640373122280), +LPF_TAPS(0.000684047432843816), +LPF_TAPS(0.000387367020214454), +LPF_TAPS(-0.000657841632242460), +LPF_TAPS(-0.000400936856207481), +LPF_TAPS(0.000631695778898094), +LPF_TAPS(0.000413373208973719), +LPF_TAPS(-0.000605646165013736), +LPF_TAPS(-0.000424700182523640), +LPF_TAPS(0.000579727725779194), +LPF_TAPS(0.000434942606977188), +LPF_TAPS(-0.000553974032593938), +LPF_TAPS(-0.000444125988363888), +LPF_TAPS(0.000528417287947739), +LPF_TAPS(0.000452276458339745), +LPF_TAPS(-0.000503088321972070), +LPF_TAPS(-0.000459420723907908), +LPF_TAPS(0.000478016590669961), +LPF_TAPS(0.000465586017227704), +LPF_TAPS(-0.000453230175826497), +LPF_TAPS(-0.000470800045596782), +LPF_TAPS(0.000428755786598220), +LPF_TAPS(0.000475090941687848), +LPF_TAPS(-0.000404618762773439), +LPF_TAPS(-0.000478487214120758), +LPF_TAPS(0.000380843079692384), +LPF_TAPS(0.000481017698448667), +LPF_TAPS(-0.000357451354810840), +LPF_TAPS(-0.000482711508634332), +LPF_TAPS(0.000334464855886926), +LPF_TAPS(0.000483597989091137), +LPF_TAPS(-0.000311903510766968), +LPF_TAPS(-0.000483706667360984), +LPF_TAPS(0.000289785918742595), +LPF_TAPS(0.000483067207498627), +LPF_TAPS(-0.000268129363447485), +LPF_TAPS(-0.000481709364229587), +LPF_TAPS(0.000246949827258589), +LPF_TAPS(0.000479662937946381), +LPF_TAPS(-0.000226262007164248), +LPF_TAPS(-0.000476957730605114), +LPF_TAPS(0.000206079332057869), +LPF_TAPS(0.000473623502581409), +LPF_TAPS(-0.000186413981413071), +LPF_TAPS(-0.000469689930542188), +LPF_TAPS(0.000167276905294243), +LPF_TAPS(0.000465186566386891), +LPF_TAPS(-0.000148677845653371), +LPF_TAPS(-0.000460142797308446), +LPF_TAPS(0.000130625358861683), +LPF_TAPS(0.000454587807021608), +LPF_TAPS(-0.000113126839423332), +LPF_TAPS(-0.000448550538203314), +LPF_TAPS(0.000096188544815881), +LPF_TAPS(0.000442059656186037), +LPF_TAPS(-0.000079815621400166), +LPF_TAPS(-0.000435143513942679), +LPF_TAPS(0.000064012131341976), +LPF_TAPS(0.000427830118398051), +LPF_TAPS(-0.000048781080485743), +LPF_TAPS(-0.000420147098098687), +LPF_TAPS(0.000034124447118409), +LPF_TAPS(0.000412121672269845), +LPF_TAPS(-0.000020043211562898), +LPF_TAPS(-0.000403780621285212), +LPF_TAPS(0.000006537386537703), +LPF_TAPS(0.000395150258571598), +LPF_TAPS(0.000006393951780809), +LPF_TAPS(-0.000386256403967828), +LPF_TAPS(-0.000018752632056849), +LPF_TAPS(0.000377124358553826), +LPF_TAPS(0.000030541355518856), +LPF_TAPS(-0.000367778880962729), +LPF_TAPS(-0.000041763663172922), +LPF_TAPS(0.000358244165185824), +LPF_TAPS(0.000052423902570022), +LPF_TAPS(-0.000348543819876908), +LPF_TAPS(-0.000062527194191441), +LPF_TAPS(0.000338700849159801), +LPF_TAPS(0.000072079397516850), +LPF_TAPS(-0.000328737634939617), +LPF_TAPS(-0.000081087076837988), +LPF_TAPS(0.000318675920715468), +LPF_TAPS(0.000089557466881093), +LPF_TAPS(-0.000308536796889541), +LPF_TAPS(-0.000097498438301123), +LPF_TAPS(0.000298340687564529), +LPF_TAPS(0.000104918463108302), +LPF_TAPS(-0.000288107338818654), +LPF_TAPS(-0.000111826580088162), +LPF_TAPS(0.000277855808445009), +LPF_TAPS(0.000118232360274576), +LPF_TAPS(-0.000267604457139195), +LPF_TAPS(-0.000124145872533844), +LPF_TAPS(0.000257370941116722), +LPF_TAPS(0.000129577649317022), +LPF_TAPS(-0.000247172206139378), +LPF_TAPS(-0.000134538652636258), +LPF_TAPS(0.000237024482927353), +LPF_TAPS(0.000139040240319026), +LPF_TAPS(-0.000226943283931415), +LPF_TAPS(-0.000143094132592875), +LPF_TAPS(0.000216943401437930), +LPF_TAPS(0.000146712379051885), +LPF_TAPS(-0.000207038906976829), +LPF_TAPS(-0.000149907326053507), +LPF_TAPS(0.000197243152000898), +LPF_TAPS(0.000152691584593175), +LPF_TAPS(-0.000187568769803268), +LPF_TAPS(-0.000155077998702502), +LPF_TAPS(0.000178027678637799), +LPF_TAPS(0.000157079614413860), +LPF_TAPS(-0.000168631086005580), +LPF_TAPS(-0.000158709649333105), +LPF_TAPS(0.000159389494069615), +LPF_TAPS(0.000159981462859707), +LPF_TAPS(-0.000150312706157744), +LPF_TAPS(-0.000160908527091470), +LPF_TAPS(0.000141409834313202), +LPF_TAPS(0.000161504398448678), +LPF_TAPS(-0.000132689307850565), +LPF_TAPS(-0.000161782690050796), +LPF_TAPS(0.000124158882874344), +LPF_TAPS(0.000161757044876159), +LPF_TAPS(-0.000115825652715863), +LPF_TAPS(-0.000161441109732857), +LPF_TAPS(0.000107696059243807), +LPF_TAPS(0.000160848510067184), +LPF_TAPS(-0.000099775905003113), +LPF_TAPS(-0.000159992825633266), +LPF_TAPS(0.000092070366135805), +LPF_TAPS(0.000158887567045323), +LPF_TAPS(-0.000084584006037386), +LPF_TAPS(-0.000157546153231995), +LPF_TAPS(0.000077320789702193), +LPF_TAPS(0.000155981889809561), +LPF_TAPS(-0.000070284098709880), +LPF_TAPS(-0.000154207948388639), +LPF_TAPS(0.000063476746806541), +LPF_TAPS(0.000152237346827124), +LPF_TAPS(-0.000056900996032834), +LPF_TAPS(-0.000150082930439164), +LPF_TAPS(0.000050558573351575), +LPF_TAPS(0.000147757354168510), +LPF_TAPS(-0.000044450687728521), +LPF_TAPS(-0.000145273065731922), +LPF_TAPS(0.000038578047618915), +LPF_TAPS(0.000142642289736313), +LPF_TAPS(-0.000032940878813716), +LPF_TAPS(-0.000139877012771326), +LPF_TAPS(0.000027538942599739), +LPF_TAPS(0.000136988969476841), +LPF_TAPS(-0.000022371554188088), +LPF_TAPS(-0.000133989629582932), +LPF_TAPS(0.000017437601366372), +LPF_TAPS(0.000130890185917930), +LPF_TAPS(-0.000012735563330892), +LPF_TAPS(-0.000127701543378277), +LPF_TAPS(0.000008263529655400), +LPF_TAPS(0.000124434308851991), +LPF_TAPS(-0.000004019219354460), +LPF_TAPS(-0.000121098782085899), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000117704947484981), +LPF_TAPS(0.000003797093148942), +LPF_TAPS(-0.000114262466830563), +LPF_TAPS(-0.000007375338042619), +LPF_TAPS(0.000110780672902561), +LPF_TAPS(0.000010738306800940), +LPF_TAPS(-0.000107268563989415), +LPF_TAPS(-0.000013889846774370), +LPF_TAPS(0.000103734799267992), +LPF_TAPS(0.000016834061741043), +LPF_TAPS(-0.000100187695034353), +LPF_TAPS(-0.000019575293274054), +LPF_TAPS(0.000096635221765021), +LPF_TAPS(0.000022118102311547), +LPF_TAPS(-0.000093085001987199), +LPF_TAPS(-0.000024467250961158), +LPF_TAPS(0.000089544308935324), +LPF_TAPS(0.000026627684568545), +LPF_TAPS(-0.000086020065970184), +LPF_TAPS(-0.000028604514078264), +LPF_TAPS(0.000082518846736081), +LPF_TAPS(0.000030402998714268), +LPF_TAPS(-0.000079046876030527), +LPF_TAPS(-0.000032028529004963), +LPF_TAPS(0.000075610031360122), +LPF_TAPS(0.000033486610176828), +LPF_TAPS(-0.000072213845155834), +LPF_TAPS(-0.000034782845939036), +LPF_TAPS(0.000068863507619961), +LPF_TAPS(0.000035922922679381), +LPF_TAPS(-0.000065563870176755), +LPF_TAPS(-0.000036912594090979), +LPF_TAPS(0.000062319449498186), +LPF_TAPS(0.000037757666247151), +LPF_TAPS(-0.000059134432075883), +LPF_TAPS(-0.000038463983140413), +LPF_TAPS(0.000056012679310092), +LPF_TAPS(0.000039037412700123), +LPF_TAPS(-0.000052957733086275), +LPF_TAPS(-0.000039483833301589), +LPF_TAPS(0.000049972821809768), +LPF_TAPS(0.000039809120777898), +LPF_TAPS(-0.000047060866868922), +LPF_TAPS(-0.000040019135944408), +LPF_TAPS(0.000044224489497212), +LPF_TAPS(0.000040119712644108), +LPF_TAPS(-0.000041466018004756), +LPF_TAPS(-0.000040116646320761), +LPF_TAPS(0.000038787495349966), +LPF_TAPS(0.000040015683125125), +LPF_TAPS(-0.000036190687022217), +LPF_TAPS(-0.000039822509558359), +LPF_TAPS(0.000033677089206780), +LPF_TAPS(0.000039542742655132), +LPF_TAPS(-0.000031247937203481), +LPF_TAPS(-0.000039181920707691), +LPF_TAPS(0.000028904214071107), +LPF_TAPS(0.000038745494530907), +LPF_TAPS(-0.000026646659470014), +LPF_TAPS(-0.000038238819266954), +LPF_TAPS(0.000024475778675831), +LPF_TAPS(0.000037667146727081), +LPF_TAPS(-0.000022391851737813), +LPF_TAPS(-0.000037035618266847), +LPF_TAPS(0.000020394942756081), +LPF_TAPS(0.000036349258189961), +LPF_TAPS(-0.000018484909252414), +LPF_TAPS(-0.000035612967674835), +LPF_TAPS(0.000016661411610296), +LPF_TAPS(0.000034831519217002), +LPF_TAPS(-0.000014923922560452), +LPF_TAPS(-0.000034009551579453), +LPF_TAPS(0.000013271736688854), +LPF_TAPS(0.000033151565242131), +LPF_TAPS(-0.000011703979945270), +LPF_TAPS(-0.000032261918340969), +LPF_TAPS(0.000010219619130956), +LPF_TAPS(0.000031344823085946), +LPF_TAPS(-0.000008817471345155), +LPF_TAPS(-0.000030404342647009), +LPF_TAPS(0.000007496213370957), +LPF_TAPS(0.000029444388495961), +LPF_TAPS(-0.000006254390981889), +LPF_TAPS(-0.000028468718191753), +LPF_TAPS(0.000005090428151623), +LPF_TAPS(0.000027480933596112), +LPF_TAPS(-0.000004002636150150), +LPF_TAPS(-0.000026484479505846), +LPF_TAPS(0.000002989222510623), +LPF_TAPS(0.000025482642687743), +LPF_TAPS(-0.000002048299852131), +LPF_TAPS(-0.000024478551301565), +LPF_TAPS(0.000001177894544622), +LPF_TAPS(0.000023475174696270), +LPF_TAPS(-0.000000375955203094), +LPF_TAPS(-0.000022475323564316), +LPF_TAPS(-0.000000359639000791), +LPF_TAPS(0.000021481650438649), +LPF_TAPS(0.000001031070220591), +LPF_TAPS(-0.000020496650516781), +LPF_TAPS(-0.000001640574020396), +LPF_TAPS(0.000019522662796228), +LPF_TAPS(0.000002190431672634), +LPF_TAPS(-0.000018561871505499), +LPF_TAPS(-0.000002682962676418), +LPF_TAPS(0.000017616307814767), +LPF_TAPS(0.000003120517503602), +LPF_TAPS(-0.000016687851810380), +LPF_TAPS(-0.000003505470578851), +LPF_TAPS(0.000015778234717405), +LPF_TAPS(0.000003840213499109), +LPF_TAPS(-0.000014889041354518), +LPF_TAPS(-0.000004127148496975), +LPF_TAPS(0.000014021712805663), +LPF_TAPS(0.000004368682151773), +LPF_TAPS(-0.000013177549293115), +LPF_TAPS(-0.000004567219351147), +LPF_TAPS(0.000012357713236772), +LPF_TAPS(0.000004725157505337), +LPF_TAPS(-0.000011563232484775), +LPF_TAPS(-0.000004844881015559), +LPF_TAPS(0.000010795003700833), +LPF_TAPS(0.000004928755997066), +LPF_TAPS(-0.000010053795893948), +LPF_TAPS(-0.000004979125256946), +LPF_TAPS(0.000009340254076601), +LPF_TAPS(0.000004998303525934), +LPF_TAPS(-0.000008654903037807), +LPF_TAPS(-0.000004988572942947), +LPF_TAPS(0.000007998151217884), +LPF_TAPS(0.000004952178790474), +LPF_TAPS(-0.000007370294672177), +LPF_TAPS(-0.000004891325478376), +LPF_TAPS(0.000006771521111433), +LPF_TAPS(0.000004808172773150), +LPF_TAPS(-0.000006201914006985), +LPF_TAPS(-0.000004704832269243), +LPF_TAPS(0.000005661456749387), +LPF_TAPS(0.000004583364098553), +LPF_TAPS(-0.000005150036849619), +LPF_TAPS(-0.000004445773873841), +LPF_TAPS(0.000004667450172476), +LPF_TAPS(0.000004294009861432), +LPF_TAPS(-0.000004213405192313), +LPF_TAPS(-0.000004129960378251), +LPF_TAPS(0.000003787527261756), +LPF_TAPS(0.000003955451407915), +LPF_TAPS(-0.000003389362884580), +LPF_TAPS(-0.000003772244430401), +LPF_TAPS(0.000003018383984428), +LPF_TAPS(0.000003582034459542), +LPF_TAPS(-0.000002673992161604), +LPF_TAPS(-0.000003386448282433), +LPF_TAPS(0.000002355522930638), +LPF_TAPS(0.000003187042894687), +LPF_TAPS(-0.000002062249931914), +LPF_TAPS(-0.000002985304125357), +LPF_TAPS(0.000001793389111064), +LPF_TAPS(0.000002782645445234), +LPF_TAPS(-0.000001548102860405), +LPF_TAPS(-0.000002580406952221), +LPF_TAPS(0.000001325504117162), +LPF_TAPS(0.000002379854527418), +LPF_TAPS(-0.000001124660413670), +LPF_TAPS(-0.000002182179155572), +LPF_TAPS(0.000000944597875235), +LPF_TAPS(0.000001988496403598), +LPF_TAPS(-0.000000784305161806), +LPF_TAPS(-0.000001799846050903), +LPF_TAPS(0.000000642737349976), +LPF_TAPS(0.000001617191865353), +LPF_TAPS(-0.000000518819752302), +LPF_TAPS(-0.000001441421518830), +LPF_TAPS(0.000000411451671308), +LPF_TAPS(0.000001273346636437), +LPF_TAPS(-0.000000319510085909), +LPF_TAPS(-0.000001113702973585), +LPF_TAPS(0.000000241853268333), +LPF_TAPS(0.000000963150715332), +LPF_TAPS(-0.000000177324329996), +LPF_TAPS(-0.000000822274892573), +LPF_TAPS(0.000000124754695030), +LPF_TAPS(0.000000691585909819), +LPF_TAPS(-0.000000082967500509), +LPF_TAPS(-0.000000571520179580), +LPF_TAPS(0.000000050780922643), +LPF_TAPS(0.000000462440858539), +LPF_TAPS(-0.000000027011428462), +LPF_TAPS(-0.000000364638680968), +LPF_TAPS(0.000000010476952729), +LPF_TAPS(0.000000278332885067), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000203672228149), +LPF_TAPS(-0.000000005589328078), +LPF_TAPS(0.000000140736086864), +LPF_TAPS(0.000000007450379996), +LPF_TAPS(-0.000000089535638879), +LPF_TAPS(-0.000000006729075807), +LPF_TAPS(0.000000050015122713), +LPF_TAPS(0.000000004555102289), +LPF_TAPS(-0.000000022053172665), +LPF_TAPS(-0.000000002039181362), +LPF_TAPS(0.000000005464226025), +LPF_TAPS(0.000000000270411187), +LPF_TAPS(0.000000000000000000), +}; diff --git a/core/sound/blip_lpf_768K_24K.h b/core/sound/blip_lpf_768K_24K.h new file mode 100644 index 000000000..53ff7b178 --- /dev/null +++ b/core/sound/blip_lpf_768K_24K.h @@ -0,0 +1,1181 @@ +static buf_t const blip_lpf_768K_24K[blip_lpf_768K_taps] = { +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000001152484340), +LPF_TAPS(-0.000000005095710178), +LPF_TAPS(-0.000000012191318007), +LPF_TAPS(-0.000000022267607829), +LPF_TAPS(-0.000000034599414872), +LPF_TAPS(-0.000000047931559441), +LPF_TAPS(-0.000000060545647801), +LPF_TAPS(-0.000000070367396870), +LPF_TAPS(-0.000000075109154481), +LPF_TAPS(-0.000000072440019472), +LPF_TAPS(-0.000000060174053095), +LPF_TAPS(-0.000000036465621112), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000049832918420), +LPF_TAPS(0.000000112793649081), +LPF_TAPS(0.000000187687704968), +LPF_TAPS(0.000000272309003584), +LPF_TAPS(0.000000363439182757), +LPF_TAPS(0.000000456907299830), +LPF_TAPS(0.000000547711411542), +LPF_TAPS(0.000000630200331088), +LPF_TAPS(0.000000698310581159), +LPF_TAPS(0.000000745850363362), +LPF_TAPS(0.000000766819403203), +LPF_TAPS(0.000000755750958378), +LPF_TAPS(0.000000708060236928), +LPF_TAPS(0.000000620382081976), +LPF_TAPS(0.000000490880137644), +LPF_TAPS(0.000000319509882033), +LPF_TAPS(0.000000108218929585), +LPF_TAPS(-0.000000138930138694), +LPF_TAPS(-0.000000415726506026), +LPF_TAPS(-0.000000713876132379), +LPF_TAPS(-0.000001023169801964), +LPF_TAPS(-0.000001331754540171), +LPF_TAPS(-0.000001626504038801), +LPF_TAPS(-0.000001893478950466), +LPF_TAPS(-0.000002118463259581), +LPF_TAPS(-0.000002287558619334), +LPF_TAPS(-0.000002387814767604), +LPF_TAPS(-0.000002407871092248), +LPF_TAPS(-0.000002338582277506), +LPF_TAPS(-0.000002173599867573), +LPF_TAPS(-0.000001909881632425), +LPF_TAPS(-0.000001548101872579), +LPF_TAPS(-0.000001092938263905), +LPF_TAPS(-0.000000553214480790), +LPF_TAPS(0.000000058117445035), +LPF_TAPS(0.000000724165411796), +LPF_TAPS(0.000001424460145696), +LPF_TAPS(0.000002135489726262), +LPF_TAPS(0.000002831395534679), +LPF_TAPS(0.000003484812208163), +LPF_TAPS(0.000004067827273334), +LPF_TAPS(0.000004553029819940), +LPF_TAPS(0.000004914612148722), +LPF_TAPS(0.000005129484047575), +LPF_TAPS(0.000005178356448336), +LPF_TAPS(0.000005046749878656), +LPF_TAPS(0.000004725883481839), +LPF_TAPS(0.000004213402503791), +LPF_TAPS(0.000003513906045182), +LPF_TAPS(0.000002639242484125), +LPF_TAPS(0.000001608547155233), +LPF_TAPS(0.000000448005422616), +LPF_TAPS(-0.000000809666058306), +LPF_TAPS(-0.000002126016652791), +LPF_TAPS(-0.000003457923533233), +LPF_TAPS(-0.000004758892958091), +LPF_TAPS(-0.000005980565575676), +LPF_TAPS(-0.000007074380617936), +LPF_TAPS(-0.000007993345409950), +LPF_TAPS(-0.000008693849789841), +LPF_TAPS(-0.000009137460147870), +LPF_TAPS(-0.000009292625130319), +LPF_TAPS(-0.000009136224819149), +LPF_TAPS(-0.000008654897515219), +LPF_TAPS(-0.000007846083153315), +LPF_TAPS(-0.000006718729797308), +LPF_TAPS(-0.000005293619442137), +LPF_TAPS(-0.000003603281228946), +LPF_TAPS(-0.000001691473813720), +LPF_TAPS(0.000000387766409326), +LPF_TAPS(0.000002571498736137), +LPF_TAPS(0.000004789644663852), +LPF_TAPS(0.000006967103138217), +LPF_TAPS(0.000009026155308364), +LPF_TAPS(0.000010889086159912), +LPF_TAPS(0.000012480939038455), +LPF_TAPS(0.000013732310264828), +LPF_TAPS(0.000014582085215692), +LPF_TAPS(0.000014980014741443), +LPF_TAPS(0.000014889031854004), +LPF_TAPS(0.000014287213355241), +LPF_TAPS(0.000013169299478268), +LPF_TAPS(0.000011547696530582), +LPF_TAPS(0.000009452902677324), +LPF_TAPS(0.000006933314973567), +LPF_TAPS(0.000004054396015711), +LPF_TAPS(0.000000897200498571), +LPF_TAPS(-0.000002443715184290), +LPF_TAPS(-0.000005862954157649), +LPF_TAPS(-0.000009247442627863), +LPF_TAPS(-0.000012480006488093), +LPF_TAPS(-0.000015443253135853), +LPF_TAPS(-0.000018023635212619), +LPF_TAPS(-0.000020115561256850), +LPF_TAPS(-0.000021625410855532), +LPF_TAPS(-0.000022475309223088), +LPF_TAPS(-0.000022606518515204), +LPF_TAPS(-0.000021982310715217), +LPF_TAPS(-0.000020590199549203), +LPF_TAPS(-0.000018443426346149), +LPF_TAPS(-0.000015581616633170), +LPF_TAPS(-0.000012070549940901), +LPF_TAPS(-0.000008001014031039), +LPF_TAPS(-0.000003486745649395), +LPF_TAPS(0.000001338508053458), +LPF_TAPS(0.000006324741191609), +LPF_TAPS(0.000011310156627793), +LPF_TAPS(0.000016126223163572), +LPF_TAPS(0.000020603170792004), +LPF_TAPS(0.000024575751153583), +LPF_TAPS(0.000027889074347600), +LPF_TAPS(0.000030404323246372), +LPF_TAPS(0.000032004143012902), +LPF_TAPS(0.000032597506998249), +LPF_TAPS(0.000032123870727846), +LPF_TAPS(0.000030556443168657), +LPF_TAPS(0.000027904428545995), +LPF_TAPS(0.000024214122051354), +LPF_TAPS(0.000019568778020638), +LPF_TAPS(0.000014087208525556), +LPF_TAPS(0.000007921112588556), +LPF_TAPS(0.000001251180037771), +LPF_TAPS(-0.000005717942104500), +LPF_TAPS(-0.000012763690379575), +LPF_TAPS(-0.000019652463024142), +LPF_TAPS(-0.000026147130699873), +LPF_TAPS(-0.000032014945859340), +LPF_TAPS(-0.000037035594634876), +LPF_TAPS(-0.000041009121031896), +LPF_TAPS(-0.000043763447917918), +LPF_TAPS(-0.000045161223312182), +LPF_TAPS(-0.000045105733981406), +LPF_TAPS(-0.000043545651195518), +LPF_TAPS(-0.000040478405225530), +LPF_TAPS(-0.000035952024983577), +LPF_TAPS(-0.000030065326015535), +LPF_TAPS(-0.000022966382484504), +LPF_TAPS(-0.000014849275213654), +LPF_TAPS(-0.000005949166482728), +LPF_TAPS(0.000003464188848603), +LPF_TAPS(0.000013094329200604), +LPF_TAPS(0.000022627149092650), +LPF_TAPS(0.000031740871303510), +LPF_TAPS(0.000040116620722822), +LPF_TAPS(0.000047449261396865), +LPF_TAPS(0.000053458137968486), +LPF_TAPS(0.000057897353992016), +LPF_TAPS(0.000060565223145184), +LPF_TAPS(0.000061312545438306), +LPF_TAPS(0.000060049388991730), +LPF_TAPS(0.000056750098241436), +LPF_TAPS(0.000051456300542010), +LPF_TAPS(0.000044277743665853), +LPF_TAPS(0.000035390864880425), +LPF_TAPS(0.000025035066036882), +LPF_TAPS(0.000013506746083069), +LPF_TAPS(0.000001151220097359), +LPF_TAPS(-0.000011647270299523), +LPF_TAPS(-0.000024477179102611), +LPF_TAPS(-0.000036912570537509), +LPF_TAPS(-0.000048526931495632), +LPF_TAPS(-0.000058907444320778), +LPF_TAPS(-0.000067669253154571), +LPF_TAPS(-0.000074469242648514), +LPF_TAPS(-0.000079018849322365), +LPF_TAPS(-0.000081095443628076), +LPF_TAPS(-0.000080551854759354), +LPF_TAPS(-0.000077323659767323), +LPF_TAPS(-0.000071433922392276), +LPF_TAPS(-0.000062995143465779), +LPF_TAPS(-0.000052208271561396), +LPF_TAPS(-0.000039358717142457), +LPF_TAPS(-0.000024809412796150), +LPF_TAPS(-0.000008991063029236), +LPF_TAPS(0.000007610173841222), +LPF_TAPS(0.000024467235348915), +LPF_TAPS(0.000041028514488886), +LPF_TAPS(0.000056735534135903), +LPF_TAPS(0.000071041382131944), +LPF_TAPS(0.000083429310872019), +LPF_TAPS(0.000093430882066834), +LPF_TAPS(0.000100643034423825), +LPF_TAPS(0.000104743469950318), +LPF_TAPS(0.000105503793440806), +LPF_TAPS(0.000102799898754107), +LPF_TAPS(0.000096619173300672), +LPF_TAPS(0.000087064186655507), +LPF_TAPS(0.000074352637674032), +LPF_TAPS(0.000058813453653570), +LPF_TAPS(0.000040879061234729), +LPF_TAPS(0.000021073977816960), +LPF_TAPS(-0.000000000000000001), +LPF_TAPS(-0.000021681612386472), +LPF_TAPS(-0.000043270446012788), +LPF_TAPS(-0.000064049128813514), +LPF_TAPS(-0.000083306720698925), +LPF_TAPS(-0.000100362551675977), +LPF_TAPS(-0.000114589722882715), +LPF_TAPS(-0.000125437475434065), +LPF_TAPS(-0.000132451647778846), +LPF_TAPS(-0.000135292484671578), +LPF_TAPS(-0.000133749129170364), +LPF_TAPS(-0.000127750221693984), +LPF_TAPS(-0.000117370144655030), +LPF_TAPS(-0.000102830584276255), +LPF_TAPS(-0.000084497228924858), +LPF_TAPS(-0.000062871581095080), +LPF_TAPS(-0.000038578023002731), +LPF_TAPS(-0.000012346438291968), +LPF_TAPS(0.000015009150871958), +LPF_TAPS(0.000042615326457718), +LPF_TAPS(0.000069566662877976), +LPF_TAPS(0.000094954918773381), +LPF_TAPS(0.000117899107325585), +LPF_TAPS(0.000137575466160802), +LPF_TAPS(0.000153246325251039), +LPF_TAPS(0.000164286881487674), +LPF_TAPS(0.000170208932309904), +LPF_TAPS(0.000170680697327237), +LPF_TAPS(0.000165541964570681), +LPF_TAPS(0.000154813934042112), +LPF_TAPS(0.000138703291782455), +LPF_TAPS(0.000117600228002549), +LPF_TAPS(0.000092070307386824), +LPF_TAPS(0.000062840302340481), +LPF_TAPS(0.000030778304128856), +LPF_TAPS(-0.000003131374242035), +LPF_TAPS(-0.000037817802723216), +LPF_TAPS(-0.000072156677613199), +LPF_TAPS(-0.000105006191277136), +LPF_TAPS(-0.000135244402503110), +LPF_TAPS(-0.000161806903178408), +LPF_TAPS(-0.000183723536547474), +LPF_TAPS(-0.000200152922407314), +LPF_TAPS(-0.000210413586217004), +LPF_TAPS(-0.000214010571892406), +LPF_TAPS(-0.000210656540284900), +LPF_TAPS(-0.000200286513900972), +LPF_TAPS(-0.000183065618912633), +LPF_TAPS(-0.000159389392365138), +LPF_TAPS(-0.000129876459117940), +LPF_TAPS(-0.000095353632044028), +LPF_TAPS(-0.000056833742354112), +LPF_TAPS(-0.000015486756257180), +LPF_TAPS(0.000027395028900060), +LPF_TAPS(0.000070436699562965), +LPF_TAPS(0.000112224154544881), +LPF_TAPS(0.000151349897149756), +LPF_TAPS(0.000186459729305847), +LPF_TAPS(0.000216298820689293), +LPF_TAPS(0.000239755609570793), +LPF_TAPS(0.000255902026837354), +LPF_TAPS(0.000264028620387530), +LPF_TAPS(0.000263673292235667), +LPF_TAPS(0.000254642541863430), +LPF_TAPS(0.000237024331684940), +LPF_TAPS(0.000211191947516224), +LPF_TAPS(0.000177798510922227), +LPF_TAPS(0.000137762102436393), +LPF_TAPS(0.000092241765277955), +LPF_TAPS(0.000042604968190238), +LPF_TAPS(-0.000009612596932831), +LPF_TAPS(-0.000062753732040099), +LPF_TAPS(-0.000115091570803501), +LPF_TAPS(-0.000164884941123817), +LPF_TAPS(-0.000210435501765685), +LPF_TAPS(-0.000250144802934651), +LPF_TAPS(-0.000282569380038599), +LPF_TAPS(-0.000306472011140359), +LPF_TAPS(-0.000320867352425224), +LPF_TAPS(-0.000325060311027916), +LPF_TAPS(-0.000318675717372279), +LPF_TAPS(-0.000301678114356434), +LPF_TAPS(-0.000274380780983162), +LPF_TAPS(-0.000237443444441768), +LPF_TAPS(-0.000191858496840385), +LPF_TAPS(-0.000138925909321826), +LPF_TAPS(-0.000080217414992324), +LPF_TAPS(-0.000017530900424471), +LPF_TAPS(0.000047163708998224), +LPF_TAPS(0.000111785473930746), +LPF_TAPS(0.000174208515351682), +LPF_TAPS(0.000232331068450502), +LPF_TAPS(0.000284145301110270), +LPF_TAPS(0.000327805606950321), +LPF_TAPS(0.000361693082058822), +LPF_TAPS(0.000384473969581270), +LPF_TAPS(0.000395150006431077), +LPF_TAPS(0.000393098828235401), +LPF_TAPS(0.000378102876452084), +LPF_TAPS(0.000350365597303463), +LPF_TAPS(0.000310514115583092), +LPF_TAPS(0.000259587995509967), +LPF_TAPS(0.000199014152192461), +LPF_TAPS(0.000130568436450885), +LPF_TAPS(0.000056324867689981), +LPF_TAPS(-0.000021406080919213), +LPF_TAPS(-0.000100148348209094), +LPF_TAPS(-0.000177338163410176), +LPF_TAPS(-0.000250406520562381), +LPF_TAPS(-0.000316863627940003), +LPF_TAPS(-0.000374382589341350), +LPF_TAPS(-0.000420879540010174), +LPF_TAPS(-0.000454587516954722), +LPF_TAPS(-0.000474121491579033), +LPF_TAPS(-0.000478532228889226), +LPF_TAPS(-0.000467346956149880), +LPF_TAPS(-0.000440595215956922), +LPF_TAPS(-0.000398818732858811), +LPF_TAPS(-0.000343064625195643), +LPF_TAPS(-0.000274861829143962), +LPF_TAPS(-0.000196181153047007), +LPF_TAPS(-0.000109379929089854), +LPF_TAPS(-0.000017132758053872), +LPF_TAPS(0.000077649666647308), +LPF_TAPS(0.000171911234199990), +LPF_TAPS(0.000262547804955242), +LPF_TAPS(0.000346508246194215), +LPF_TAPS(0.000420895864074487), +LPF_TAPS(0.000483066899259388), +LPF_TAPS(0.000530722780509705), +LPF_TAPS(0.000561992966921032), +LPF_TAPS(0.000575505453295788), +LPF_TAPS(0.000570442358525909), +LPF_TAPS(0.000546578454533896), +LPF_TAPS(0.000504301010739203), +LPF_TAPS(0.000444609910754149), +LPF_TAPS(0.000369097626198387), +LPF_TAPS(0.000279909287382278), +LPF_TAPS(0.000179683751090833), +LPF_TAPS(0.000071477210129250), +LPF_TAPS(-0.000041328503916990), +LPF_TAPS(-0.000155130224881734), +LPF_TAPS(-0.000266217192675056), +LPF_TAPS(-0.000370890684020134), +LPF_TAPS(-0.000465585720142990), +LPF_TAPS(-0.000546990891677487), +LPF_TAPS(-0.000612162321851922), +LPF_TAPS(-0.000658627900460039), +LPF_TAPS(-0.000684478162165066), +LPF_TAPS(-0.000688440548023091), +LPF_TAPS(-0.000669934269219190), +LPF_TAPS(-0.000629103573390101), +LPF_TAPS(-0.000566827879456252), +LPF_TAPS(-0.000484707976382240), +LPF_TAPS(-0.000385028251996259), +LPF_TAPS(-0.000270695705380619), +LPF_TAPS(-0.000145157274813930), +LPF_TAPS(-0.000012297757001391), +LPF_TAPS(0.000123678722798222), +LPF_TAPS(0.000258380129850500), +LPF_TAPS(0.000387366773040352), +LPF_TAPS(0.000506295964894752), +LPF_TAPS(0.000611066427620510), +LPF_TAPS(0.000697957698936131), +LPF_TAPS(0.000763759860442502), +LPF_TAPS(0.000805889135312000), +LPF_TAPS(0.000822485276891549), +LPF_TAPS(0.000812487186081086), +LPF_TAPS(0.000775683838897867), +LPF_TAPS(0.000712738357840256), +LPF_TAPS(0.000625183898955119), +LPF_TAPS(0.000515390925051658), +LPF_TAPS(0.000386506365966708), +LPF_TAPS(0.000242366099243077), +LPF_TAPS(0.000087383088454098), +LPF_TAPS(-0.000073585638543570), +LPF_TAPS(-0.000235389231818504), +LPF_TAPS(-0.000392745899395397), +LPF_TAPS(-0.000540413337085645), +LPF_TAPS(-0.000673361271639362), +LPF_TAPS(-0.000786940503718210), +LPF_TAPS(-0.000877042840762386), +LPF_TAPS(-0.000940246497411816), +LPF_TAPS(-0.000973941910185252), +LPF_TAPS(-0.000976433455066244), +LPF_TAPS(-0.000947013257100458), +LPF_TAPS(-0.000886004120206203), +LPF_TAPS(-0.000794769558342508), +LPF_TAPS(-0.000675689946958247), +LPF_TAPS(-0.000532104903912070), +LPF_TAPS(-0.000368223117113155), +LPF_TAPS(-0.000189001926039628), +LPF_TAPS(0.000000000000000005), +LPF_TAPS(0.000192792597451849), +LPF_TAPS(0.000383141843876918), +LPF_TAPS(0.000564768905597874), +LPF_TAPS(0.000731554712944432), +LPF_TAPS(0.000877743377118140), +LPF_TAPS(0.000998137770969946), +LPF_TAPS(0.001088280720886277), +LPF_TAPS(0.001144615598626183), +LPF_TAPS(0.001164620653372918), +LPF_TAPS(0.001146912171496028), +LPF_TAPS(0.001091312473933286), +LPF_TAPS(0.000998879831943005), +LPF_TAPS(0.000871898569131351), +LPF_TAPS(0.000713828884594515), +LPF_TAPS(0.000529217238894420), +LPF_TAPS(0.000323569449503238), +LPF_TAPS(0.000103189902660546), +LPF_TAPS(-0.000125008537718581), +LPF_TAPS(-0.000353718296351377), +LPF_TAPS(-0.000575468016503558), +LPF_TAPS(-0.000782863453250455), +LPF_TAPS(-0.000968830662626959), +LPF_TAPS(-0.001126853593007360), +LPF_TAPS(-0.001251198211887599), +LPF_TAPS(-0.001337115585136943), +LPF_TAPS(-0.001381016862473527), +LPF_TAPS(-0.001380613899811274), +LPF_TAPS(-0.001335020245572579), +LPF_TAPS(-0.001244808405865867), +LPF_TAPS(-0.001112020647622544), +LPF_TAPS(-0.000940132058647822), +LPF_TAPS(-0.000733966113792357), +LPF_TAPS(-0.000499564548666700), +LPF_TAPS(-0.000244014866424895), +LPF_TAPS(0.000024759750985369), +LPF_TAPS(0.000298242036610992), +LPF_TAPS(0.000567586499855441), +LPF_TAPS(0.000823901383743757), +LPF_TAPS(0.001058537859482148), +LPF_TAPS(0.001263377187176217), +LPF_TAPS(0.001431106452212325), +LPF_TAPS(0.001555473670218642), +LPF_TAPS(0.001631513539674637), +LPF_TAPS(0.001655735900279768), +LPF_TAPS(0.001626270007586307), +LPF_TAPS(0.001542959031374493), +LPF_TAPS(0.001407400689546614), +LPF_TAPS(0.001222931596249173), +LPF_TAPS(0.000994554681679378), +LPF_TAPS(0.000728810876167928), +LPF_TAPS(0.000433598084332047), +LPF_TAPS(0.000117942246968937), +LPF_TAPS(-0.000208273059652547), +LPF_TAPS(-0.000534610561168048), +LPF_TAPS(-0.000850407583894923), +LPF_TAPS(-0.001145118562253254), +LPF_TAPS(-0.001408660933417868), +LPF_TAPS(-0.001631753265716173), +LPF_TAPS(-0.001806234489224940), +LPF_TAPS(-0.001925353479318096), +LPF_TAPS(-0.001984018981432122), +LPF_TAPS(-0.001979000941352422), +LPF_TAPS(-0.001909075691954721), +LPF_TAPS(-0.001775109106082625), +LPF_TAPS(-0.001580073708111861), +LPF_TAPS(-0.001328997787593093), +LPF_TAPS(-0.001028846714519885), +LPF_TAPS(-0.000688338849954788), +LPF_TAPS(-0.000317700608131232), +LPF_TAPS(0.000071632713461015), +LPF_TAPS(0.000467361829414448), +LPF_TAPS(0.000856703924997078), +LPF_TAPS(0.001226797152716265), +LPF_TAPS(0.001565116620653128), +LPF_TAPS(0.001859888687412874), +LPF_TAPS(0.002100490149867073), +LPF_TAPS(0.002277819107241694), +LPF_TAPS(0.002384624910977274), +LPF_TAPS(0.002415785652952178), +LPF_TAPS(0.002368523080358119), +LPF_TAPS(0.002242546615955572), +LPF_TAPS(0.002040120257740298), +LPF_TAPS(0.001766048471616154), +LPF_TAPS(0.001427579704876770), +LPF_TAPS(0.001034228760561114), +LPF_TAPS(0.000597521901801380), +LPF_TAPS(0.000130671117675938), +LPF_TAPS(-0.000351813605211574), +LPF_TAPS(-0.000834562978150250), +LPF_TAPS(-0.001301825166365410), +LPF_TAPS(-0.001737966190365439), +LPF_TAPS(-0.002127978474272729), +LPF_TAPS(-0.002457981429236488), +LPF_TAPS(-0.002715697845351253), +LPF_TAPS(-0.002890890264067375), +LPF_TAPS(-0.002975742413280810), +LPF_TAPS(-0.002965172191343571), +LPF_TAPS(-0.002857064550412904), +LPF_TAPS(-0.002652414904921744), +LPF_TAPS(-0.002355376314608072), +LPF_TAPS(-0.001973206588323283), +LPF_TAPS(-0.001516114539436932), +LPF_TAPS(-0.000997007803078406), +LPF_TAPS(-0.000431147801801422), +LPF_TAPS(0.000164279480330407), +LPF_TAPS(0.000770665383479393), +LPF_TAPS(0.001368539010210255), +LPF_TAPS(0.001938169916452744), +LPF_TAPS(0.002460195023751910), +LPF_TAPS(0.002916250514243055), +LPF_TAPS(0.003289588836867587), +LPF_TAPS(0.003565660927117201), +LPF_TAPS(0.003732644337448212), +LPF_TAPS(0.003781899186874162), +LPF_TAPS(0.003708335642353476), +LPF_TAPS(0.003510678998832139), +LPF_TAPS(0.003191621268673138), +LPF_TAPS(0.002757851447814955), +LPF_TAPS(0.002219960204124247), +LPF_TAPS(0.001592218530000328), +LPF_TAPS(0.000892233804429490), +LPF_TAPS(0.000140490601831083), +LPF_TAPS(-0.000640212653492852), +LPF_TAPS(-0.001425416575883931), +LPF_TAPS(-0.002189725487726716), +LPF_TAPS(-0.002907583423253569), +LPF_TAPS(-0.003554078894612804), +LPF_TAPS(-0.004105754358390497), +LPF_TAPS(-0.004541395526739372), +LPF_TAPS(-0.004842775608648294), +LPF_TAPS(-0.004995330262056102), +LPF_TAPS(-0.004988740482468818), +LPF_TAPS(-0.004817402821803838), +LPF_TAPS(-0.004480769173390059), +LPF_TAPS(-0.003983541805197440), +LPF_TAPS(-0.003335713283738389), +LPF_TAPS(-0.002552445298778380), +LPF_TAPS(-0.001653785052822236), +LPF_TAPS(-0.000664222687184143), +LPF_TAPS(0.000387901961004376), +LPF_TAPS(0.001471130281711834), +LPF_TAPS(0.002551736080144651), +LPF_TAPS(0.003594675595265330), +LPF_TAPS(0.004564611426001721), +LPF_TAPS(0.005426982600476230), +LPF_TAPS(0.006149090924198915), +LPF_TAPS(0.006701172463119070), +LPF_TAPS(0.007057422610883705), +LPF_TAPS(0.007196943686238185), +LPF_TAPS(0.007104585410053790), +LPF_TAPS(0.006771650899488136), +LPF_TAPS(0.006196443940707756), +LPF_TAPS(0.005384637187795986), +LPF_TAPS(0.004349445487004629), +LPF_TAPS(0.003111593624626861), +LPF_TAPS(0.001699073308000820), +LPF_TAPS(0.000146689962985106), +LPF_TAPS(-0.001504594191750185), +LPF_TAPS(-0.003208508517971278), +LPF_TAPS(-0.004914495915054737), +LPF_TAPS(-0.006568885298479145), +LPF_TAPS(-0.008116186879932121), +LPF_TAPS(-0.009500478553868536), +LPF_TAPS(-0.010666848523875708), +LPF_TAPS(-0.011562857035962059), +LPF_TAPS(-0.012139978801904341), +LPF_TAPS(-0.012354987444366434), +LPF_TAPS(-0.012171244098485332), +LPF_TAPS(-0.011559854154464340), +LPF_TAPS(-0.010500658985394174), +LPF_TAPS(-0.008983033308274631), +LPF_TAPS(-0.007006463481110434), +LPF_TAPS(-0.004580887427296669), +LPF_TAPS(-0.001726782860894111), +LPF_TAPS(0.001525003094514639), +LPF_TAPS(0.005133683115894706), +LPF_TAPS(0.009049211171689249), +LPF_TAPS(0.013213203073096175), +LPF_TAPS(0.017560076473553177), +LPF_TAPS(0.022018384769864386), +LPF_TAPS(0.026512314046210402), +LPF_TAPS(0.030963307661350890), +LPF_TAPS(0.035291779438375498), +LPF_TAPS(0.039418873780099187), +LPF_TAPS(0.043268229479278157), +LPF_TAPS(0.046767703569527926), +LPF_TAPS(0.049851012287597349), +LPF_TAPS(0.052459248076485478), +LPF_TAPS(0.054542234506598564), +LPF_TAPS(0.056059684953538136), +LPF_TAPS(0.056982135742987355), +LPF_TAPS(0.057291630127126743), +LPF_TAPS(0.056982135742987355), +LPF_TAPS(0.056059684953538136), +LPF_TAPS(0.054542234506598564), +LPF_TAPS(0.052459248076485478), +LPF_TAPS(0.049851012287597349), +LPF_TAPS(0.046767703569527926), +LPF_TAPS(0.043268229479278157), +LPF_TAPS(0.039418873780099187), +LPF_TAPS(0.035291779438375505), +LPF_TAPS(0.030963307661350890), +LPF_TAPS(0.026512314046210402), +LPF_TAPS(0.022018384769864386), +LPF_TAPS(0.017560076473553177), +LPF_TAPS(0.013213203073096178), +LPF_TAPS(0.009049211171689249), +LPF_TAPS(0.005133683115894706), +LPF_TAPS(0.001525003094514639), +LPF_TAPS(-0.001726782860894111), +LPF_TAPS(-0.004580887427296669), +LPF_TAPS(-0.007006463481110434), +LPF_TAPS(-0.008983033308274629), +LPF_TAPS(-0.010500658985394175), +LPF_TAPS(-0.011559854154464340), +LPF_TAPS(-0.012171244098485332), +LPF_TAPS(-0.012354987444366434), +LPF_TAPS(-0.012139978801904341), +LPF_TAPS(-0.011562857035962061), +LPF_TAPS(-0.010666848523875708), +LPF_TAPS(-0.009500478553868536), +LPF_TAPS(-0.008116186879932121), +LPF_TAPS(-0.006568885298479145), +LPF_TAPS(-0.004914495915054737), +LPF_TAPS(-0.003208508517971279), +LPF_TAPS(-0.001504594191750185), +LPF_TAPS(0.000146689962985106), +LPF_TAPS(0.001699073308000820), +LPF_TAPS(0.003111593624626861), +LPF_TAPS(0.004349445487004629), +LPF_TAPS(0.005384637187795987), +LPF_TAPS(0.006196443940707756), +LPF_TAPS(0.006771650899488136), +LPF_TAPS(0.007104585410053790), +LPF_TAPS(0.007196943686238185), +LPF_TAPS(0.007057422610883705), +LPF_TAPS(0.006701172463119071), +LPF_TAPS(0.006149090924198916), +LPF_TAPS(0.005426982600476230), +LPF_TAPS(0.004564611426001722), +LPF_TAPS(0.003594675595265330), +LPF_TAPS(0.002551736080144652), +LPF_TAPS(0.001471130281711834), +LPF_TAPS(0.000387901961004376), +LPF_TAPS(-0.000664222687184143), +LPF_TAPS(-0.001653785052822236), +LPF_TAPS(-0.002552445298778380), +LPF_TAPS(-0.003335713283738390), +LPF_TAPS(-0.003983541805197441), +LPF_TAPS(-0.004480769173390060), +LPF_TAPS(-0.004817402821803838), +LPF_TAPS(-0.004988740482468819), +LPF_TAPS(-0.004995330262056103), +LPF_TAPS(-0.004842775608648295), +LPF_TAPS(-0.004541395526739372), +LPF_TAPS(-0.004105754358390497), +LPF_TAPS(-0.003554078894612804), +LPF_TAPS(-0.002907583423253569), +LPF_TAPS(-0.002189725487726717), +LPF_TAPS(-0.001425416575883931), +LPF_TAPS(-0.000640212653492852), +LPF_TAPS(0.000140490601831083), +LPF_TAPS(0.000892233804429491), +LPF_TAPS(0.001592218530000328), +LPF_TAPS(0.002219960204124247), +LPF_TAPS(0.002757851447814955), +LPF_TAPS(0.003191621268673138), +LPF_TAPS(0.003510678998832139), +LPF_TAPS(0.003708335642353476), +LPF_TAPS(0.003781899186874163), +LPF_TAPS(0.003732644337448212), +LPF_TAPS(0.003565660927117202), +LPF_TAPS(0.003289588836867588), +LPF_TAPS(0.002916250514243056), +LPF_TAPS(0.002460195023751910), +LPF_TAPS(0.001938169916452745), +LPF_TAPS(0.001368539010210255), +LPF_TAPS(0.000770665383479393), +LPF_TAPS(0.000164279480330407), +LPF_TAPS(-0.000431147801801422), +LPF_TAPS(-0.000997007803078406), +LPF_TAPS(-0.001516114539436932), +LPF_TAPS(-0.001973206588323284), +LPF_TAPS(-0.002355376314608072), +LPF_TAPS(-0.002652414904921744), +LPF_TAPS(-0.002857064550412904), +LPF_TAPS(-0.002965172191343571), +LPF_TAPS(-0.002975742413280810), +LPF_TAPS(-0.002890890264067375), +LPF_TAPS(-0.002715697845351253), +LPF_TAPS(-0.002457981429236488), +LPF_TAPS(-0.002127978474272729), +LPF_TAPS(-0.001737966190365439), +LPF_TAPS(-0.001301825166365411), +LPF_TAPS(-0.000834562978150250), +LPF_TAPS(-0.000351813605211574), +LPF_TAPS(0.000130671117675938), +LPF_TAPS(0.000597521901801380), +LPF_TAPS(0.001034228760561114), +LPF_TAPS(0.001427579704876769), +LPF_TAPS(0.001766048471616154), +LPF_TAPS(0.002040120257740299), +LPF_TAPS(0.002242546615955573), +LPF_TAPS(0.002368523080358119), +LPF_TAPS(0.002415785652952178), +LPF_TAPS(0.002384624910977274), +LPF_TAPS(0.002277819107241695), +LPF_TAPS(0.002100490149867073), +LPF_TAPS(0.001859888687412874), +LPF_TAPS(0.001565116620653128), +LPF_TAPS(0.001226797152716265), +LPF_TAPS(0.000856703924997079), +LPF_TAPS(0.000467361829414448), +LPF_TAPS(0.000071632713461015), +LPF_TAPS(-0.000317700608131232), +LPF_TAPS(-0.000688338849954788), +LPF_TAPS(-0.001028846714519885), +LPF_TAPS(-0.001328997787593093), +LPF_TAPS(-0.001580073708111861), +LPF_TAPS(-0.001775109106082626), +LPF_TAPS(-0.001909075691954721), +LPF_TAPS(-0.001979000941352422), +LPF_TAPS(-0.001984018981432122), +LPF_TAPS(-0.001925353479318096), +LPF_TAPS(-0.001806234489224941), +LPF_TAPS(-0.001631753265716172), +LPF_TAPS(-0.001408660933417869), +LPF_TAPS(-0.001145118562253254), +LPF_TAPS(-0.000850407583894923), +LPF_TAPS(-0.000534610561168048), +LPF_TAPS(-0.000208273059652547), +LPF_TAPS(0.000117942246968937), +LPF_TAPS(0.000433598084332047), +LPF_TAPS(0.000728810876167928), +LPF_TAPS(0.000994554681679379), +LPF_TAPS(0.001222931596249174), +LPF_TAPS(0.001407400689546613), +LPF_TAPS(0.001542959031374494), +LPF_TAPS(0.001626270007586307), +LPF_TAPS(0.001655735900279769), +LPF_TAPS(0.001631513539674637), +LPF_TAPS(0.001555473670218643), +LPF_TAPS(0.001431106452212325), +LPF_TAPS(0.001263377187176217), +LPF_TAPS(0.001058537859482148), +LPF_TAPS(0.000823901383743757), +LPF_TAPS(0.000567586499855442), +LPF_TAPS(0.000298242036610992), +LPF_TAPS(0.000024759750985369), +LPF_TAPS(-0.000244014866424895), +LPF_TAPS(-0.000499564548666700), +LPF_TAPS(-0.000733966113792357), +LPF_TAPS(-0.000940132058647823), +LPF_TAPS(-0.001112020647622544), +LPF_TAPS(-0.001244808405865867), +LPF_TAPS(-0.001335020245572579), +LPF_TAPS(-0.001380613899811275), +LPF_TAPS(-0.001381016862473528), +LPF_TAPS(-0.001337115585136942), +LPF_TAPS(-0.001251198211887600), +LPF_TAPS(-0.001126853593007361), +LPF_TAPS(-0.000968830662626959), +LPF_TAPS(-0.000782863453250455), +LPF_TAPS(-0.000575468016503558), +LPF_TAPS(-0.000353718296351377), +LPF_TAPS(-0.000125008537718581), +LPF_TAPS(0.000103189902660546), +LPF_TAPS(0.000323569449503238), +LPF_TAPS(0.000529217238894420), +LPF_TAPS(0.000713828884594515), +LPF_TAPS(0.000871898569131352), +LPF_TAPS(0.000998879831943005), +LPF_TAPS(0.001091312473933286), +LPF_TAPS(0.001146912171496027), +LPF_TAPS(0.001164620653372918), +LPF_TAPS(0.001144615598626185), +LPF_TAPS(0.001088280720886277), +LPF_TAPS(0.000998137770969946), +LPF_TAPS(0.000877743377118140), +LPF_TAPS(0.000731554712944432), +LPF_TAPS(0.000564768905597874), +LPF_TAPS(0.000383141843876918), +LPF_TAPS(0.000192792597451849), +LPF_TAPS(0.000000000000000005), +LPF_TAPS(-0.000189001926039628), +LPF_TAPS(-0.000368223117113155), +LPF_TAPS(-0.000532104903912071), +LPF_TAPS(-0.000675689946958247), +LPF_TAPS(-0.000794769558342508), +LPF_TAPS(-0.000886004120206203), +LPF_TAPS(-0.000947013257100459), +LPF_TAPS(-0.000976433455066244), +LPF_TAPS(-0.000973941910185252), +LPF_TAPS(-0.000940246497411816), +LPF_TAPS(-0.000877042840762386), +LPF_TAPS(-0.000786940503718210), +LPF_TAPS(-0.000673361271639363), +LPF_TAPS(-0.000540413337085645), +LPF_TAPS(-0.000392745899395397), +LPF_TAPS(-0.000235389231818504), +LPF_TAPS(-0.000073585638543570), +LPF_TAPS(0.000087383088454098), +LPF_TAPS(0.000242366099243077), +LPF_TAPS(0.000386506365966708), +LPF_TAPS(0.000515390925051659), +LPF_TAPS(0.000625183898955119), +LPF_TAPS(0.000712738357840256), +LPF_TAPS(0.000775683838897867), +LPF_TAPS(0.000812487186081086), +LPF_TAPS(0.000822485276891549), +LPF_TAPS(0.000805889135312000), +LPF_TAPS(0.000763759860442503), +LPF_TAPS(0.000697957698936132), +LPF_TAPS(0.000611066427620510), +LPF_TAPS(0.000506295964894752), +LPF_TAPS(0.000387366773040352), +LPF_TAPS(0.000258380129850500), +LPF_TAPS(0.000123678722798222), +LPF_TAPS(-0.000012297757001391), +LPF_TAPS(-0.000145157274813930), +LPF_TAPS(-0.000270695705380619), +LPF_TAPS(-0.000385028251996259), +LPF_TAPS(-0.000484707976382240), +LPF_TAPS(-0.000566827879456253), +LPF_TAPS(-0.000629103573390101), +LPF_TAPS(-0.000669934269219190), +LPF_TAPS(-0.000688440548023092), +LPF_TAPS(-0.000684478162165066), +LPF_TAPS(-0.000658627900460040), +LPF_TAPS(-0.000612162321851922), +LPF_TAPS(-0.000546990891677487), +LPF_TAPS(-0.000465585720142990), +LPF_TAPS(-0.000370890684020135), +LPF_TAPS(-0.000266217192675056), +LPF_TAPS(-0.000155130224881734), +LPF_TAPS(-0.000041328503916990), +LPF_TAPS(0.000071477210129250), +LPF_TAPS(0.000179683751090833), +LPF_TAPS(0.000279909287382278), +LPF_TAPS(0.000369097626198387), +LPF_TAPS(0.000444609910754149), +LPF_TAPS(0.000504301010739204), +LPF_TAPS(0.000546578454533897), +LPF_TAPS(0.000570442358525909), +LPF_TAPS(0.000575505453295788), +LPF_TAPS(0.000561992966921032), +LPF_TAPS(0.000530722780509705), +LPF_TAPS(0.000483066899259388), +LPF_TAPS(0.000420895864074487), +LPF_TAPS(0.000346508246194215), +LPF_TAPS(0.000262547804955242), +LPF_TAPS(0.000171911234199990), +LPF_TAPS(0.000077649666647308), +LPF_TAPS(-0.000017132758053872), +LPF_TAPS(-0.000109379929089854), +LPF_TAPS(-0.000196181153047007), +LPF_TAPS(-0.000274861829143962), +LPF_TAPS(-0.000343064625195643), +LPF_TAPS(-0.000398818732858811), +LPF_TAPS(-0.000440595215956923), +LPF_TAPS(-0.000467346956149880), +LPF_TAPS(-0.000478532228889226), +LPF_TAPS(-0.000474121491579033), +LPF_TAPS(-0.000454587516954723), +LPF_TAPS(-0.000420879540010174), +LPF_TAPS(-0.000374382589341350), +LPF_TAPS(-0.000316863627940004), +LPF_TAPS(-0.000250406520562381), +LPF_TAPS(-0.000177338163410176), +LPF_TAPS(-0.000100148348209094), +LPF_TAPS(-0.000021406080919213), +LPF_TAPS(0.000056324867689981), +LPF_TAPS(0.000130568436450885), +LPF_TAPS(0.000199014152192461), +LPF_TAPS(0.000259587995509968), +LPF_TAPS(0.000310514115583092), +LPF_TAPS(0.000350365597303463), +LPF_TAPS(0.000378102876452084), +LPF_TAPS(0.000393098828235401), +LPF_TAPS(0.000395150006431077), +LPF_TAPS(0.000384473969581270), +LPF_TAPS(0.000361693082058822), +LPF_TAPS(0.000327805606950321), +LPF_TAPS(0.000284145301110270), +LPF_TAPS(0.000232331068450502), +LPF_TAPS(0.000174208515351682), +LPF_TAPS(0.000111785473930746), +LPF_TAPS(0.000047163708998224), +LPF_TAPS(-0.000017530900424471), +LPF_TAPS(-0.000080217414992324), +LPF_TAPS(-0.000138925909321826), +LPF_TAPS(-0.000191858496840385), +LPF_TAPS(-0.000237443444441768), +LPF_TAPS(-0.000274380780983162), +LPF_TAPS(-0.000301678114356435), +LPF_TAPS(-0.000318675717372279), +LPF_TAPS(-0.000325060311027916), +LPF_TAPS(-0.000320867352425224), +LPF_TAPS(-0.000306472011140359), +LPF_TAPS(-0.000282569380038600), +LPF_TAPS(-0.000250144802934651), +LPF_TAPS(-0.000210435501765685), +LPF_TAPS(-0.000164884941123817), +LPF_TAPS(-0.000115091570803501), +LPF_TAPS(-0.000062753732040099), +LPF_TAPS(-0.000009612596932831), +LPF_TAPS(0.000042604968190238), +LPF_TAPS(0.000092241765277955), +LPF_TAPS(0.000137762102436393), +LPF_TAPS(0.000177798510922227), +LPF_TAPS(0.000211191947516224), +LPF_TAPS(0.000237024331684940), +LPF_TAPS(0.000254642541863430), +LPF_TAPS(0.000263673292235667), +LPF_TAPS(0.000264028620387531), +LPF_TAPS(0.000255902026837354), +LPF_TAPS(0.000239755609570794), +LPF_TAPS(0.000216298820689293), +LPF_TAPS(0.000186459729305847), +LPF_TAPS(0.000151349897149756), +LPF_TAPS(0.000112224154544882), +LPF_TAPS(0.000070436699562966), +LPF_TAPS(0.000027395028900060), +LPF_TAPS(-0.000015486756257180), +LPF_TAPS(-0.000056833742354112), +LPF_TAPS(-0.000095353632044028), +LPF_TAPS(-0.000129876459117940), +LPF_TAPS(-0.000159389392365138), +LPF_TAPS(-0.000183065618912633), +LPF_TAPS(-0.000200286513900972), +LPF_TAPS(-0.000210656540284900), +LPF_TAPS(-0.000214010571892406), +LPF_TAPS(-0.000210413586217005), +LPF_TAPS(-0.000200152922407313), +LPF_TAPS(-0.000183723536547474), +LPF_TAPS(-0.000161806903178408), +LPF_TAPS(-0.000135244402503110), +LPF_TAPS(-0.000105006191277136), +LPF_TAPS(-0.000072156677613199), +LPF_TAPS(-0.000037817802723216), +LPF_TAPS(-0.000003131374242035), +LPF_TAPS(0.000030778304128856), +LPF_TAPS(0.000062840302340481), +LPF_TAPS(0.000092070307386824), +LPF_TAPS(0.000117600228002548), +LPF_TAPS(0.000138703291782456), +LPF_TAPS(0.000154813934042112), +LPF_TAPS(0.000165541964570681), +LPF_TAPS(0.000170680697327237), +LPF_TAPS(0.000170208932309904), +LPF_TAPS(0.000164286881487674), +LPF_TAPS(0.000153246325251040), +LPF_TAPS(0.000137575466160802), +LPF_TAPS(0.000117899107325585), +LPF_TAPS(0.000094954918773381), +LPF_TAPS(0.000069566662877977), +LPF_TAPS(0.000042615326457718), +LPF_TAPS(0.000015009150871958), +LPF_TAPS(-0.000012346438291968), +LPF_TAPS(-0.000038578023002731), +LPF_TAPS(-0.000062871581095080), +LPF_TAPS(-0.000084497228924858), +LPF_TAPS(-0.000102830584276255), +LPF_TAPS(-0.000117370144655030), +LPF_TAPS(-0.000127750221693984), +LPF_TAPS(-0.000133749129170364), +LPF_TAPS(-0.000135292484671579), +LPF_TAPS(-0.000132451647778846), +LPF_TAPS(-0.000125437475434065), +LPF_TAPS(-0.000114589722882715), +LPF_TAPS(-0.000100362551675977), +LPF_TAPS(-0.000083306720698925), +LPF_TAPS(-0.000064049128813514), +LPF_TAPS(-0.000043270446012788), +LPF_TAPS(-0.000021681612386472), +LPF_TAPS(-0.000000000000000001), +LPF_TAPS(0.000021073977816960), +LPF_TAPS(0.000040879061234729), +LPF_TAPS(0.000058813453653570), +LPF_TAPS(0.000074352637674032), +LPF_TAPS(0.000087064186655507), +LPF_TAPS(0.000096619173300672), +LPF_TAPS(0.000102799898754107), +LPF_TAPS(0.000105503793440806), +LPF_TAPS(0.000104743469950318), +LPF_TAPS(0.000100643034423825), +LPF_TAPS(0.000093430882066834), +LPF_TAPS(0.000083429310872019), +LPF_TAPS(0.000071041382131944), +LPF_TAPS(0.000056735534135903), +LPF_TAPS(0.000041028514488886), +LPF_TAPS(0.000024467235348915), +LPF_TAPS(0.000007610173841222), +LPF_TAPS(-0.000008991063029236), +LPF_TAPS(-0.000024809412796150), +LPF_TAPS(-0.000039358717142457), +LPF_TAPS(-0.000052208271561396), +LPF_TAPS(-0.000062995143465779), +LPF_TAPS(-0.000071433922392276), +LPF_TAPS(-0.000077323659767323), +LPF_TAPS(-0.000080551854759354), +LPF_TAPS(-0.000081095443628076), +LPF_TAPS(-0.000079018849322365), +LPF_TAPS(-0.000074469242648514), +LPF_TAPS(-0.000067669253154571), +LPF_TAPS(-0.000058907444320778), +LPF_TAPS(-0.000048526931495632), +LPF_TAPS(-0.000036912570537509), +LPF_TAPS(-0.000024477179102611), +LPF_TAPS(-0.000011647270299523), +LPF_TAPS(0.000001151220097359), +LPF_TAPS(0.000013506746083069), +LPF_TAPS(0.000025035066036882), +LPF_TAPS(0.000035390864880425), +LPF_TAPS(0.000044277743665853), +LPF_TAPS(0.000051456300542010), +LPF_TAPS(0.000056750098241436), +LPF_TAPS(0.000060049388991730), +LPF_TAPS(0.000061312545438306), +LPF_TAPS(0.000060565223145184), +LPF_TAPS(0.000057897353992016), +LPF_TAPS(0.000053458137968486), +LPF_TAPS(0.000047449261396865), +LPF_TAPS(0.000040116620722822), +LPF_TAPS(0.000031740871303510), +LPF_TAPS(0.000022627149092650), +LPF_TAPS(0.000013094329200604), +LPF_TAPS(0.000003464188848603), +LPF_TAPS(-0.000005949166482728), +LPF_TAPS(-0.000014849275213654), +LPF_TAPS(-0.000022966382484504), +LPF_TAPS(-0.000030065326015535), +LPF_TAPS(-0.000035952024983576), +LPF_TAPS(-0.000040478405225530), +LPF_TAPS(-0.000043545651195518), +LPF_TAPS(-0.000045105733981406), +LPF_TAPS(-0.000045161223312182), +LPF_TAPS(-0.000043763447917918), +LPF_TAPS(-0.000041009121031896), +LPF_TAPS(-0.000037035594634876), +LPF_TAPS(-0.000032014945859340), +LPF_TAPS(-0.000026147130699873), +LPF_TAPS(-0.000019652463024142), +LPF_TAPS(-0.000012763690379575), +LPF_TAPS(-0.000005717942104500), +LPF_TAPS(0.000001251180037771), +LPF_TAPS(0.000007921112588556), +LPF_TAPS(0.000014087208525556), +LPF_TAPS(0.000019568778020638), +LPF_TAPS(0.000024214122051354), +LPF_TAPS(0.000027904428545995), +LPF_TAPS(0.000030556443168657), +LPF_TAPS(0.000032123870727846), +LPF_TAPS(0.000032597506998249), +LPF_TAPS(0.000032004143012902), +LPF_TAPS(0.000030404323246372), +LPF_TAPS(0.000027889074347600), +LPF_TAPS(0.000024575751153583), +LPF_TAPS(0.000020603170792004), +LPF_TAPS(0.000016126223163572), +LPF_TAPS(0.000011310156627793), +LPF_TAPS(0.000006324741191609), +LPF_TAPS(0.000001338508053458), +LPF_TAPS(-0.000003486745649395), +LPF_TAPS(-0.000008001014031039), +LPF_TAPS(-0.000012070549940901), +LPF_TAPS(-0.000015581616633170), +LPF_TAPS(-0.000018443426346149), +LPF_TAPS(-0.000020590199549203), +LPF_TAPS(-0.000021982310715217), +LPF_TAPS(-0.000022606518515204), +LPF_TAPS(-0.000022475309223088), +LPF_TAPS(-0.000021625410855532), +LPF_TAPS(-0.000020115561256850), +LPF_TAPS(-0.000018023635212619), +LPF_TAPS(-0.000015443253135853), +LPF_TAPS(-0.000012480006488093), +LPF_TAPS(-0.000009247442627863), +LPF_TAPS(-0.000005862954157649), +LPF_TAPS(-0.000002443715184290), +LPF_TAPS(0.000000897200498571), +LPF_TAPS(0.000004054396015711), +LPF_TAPS(0.000006933314973567), +LPF_TAPS(0.000009452902677324), +LPF_TAPS(0.000011547696530582), +LPF_TAPS(0.000013169299478268), +LPF_TAPS(0.000014287213355241), +LPF_TAPS(0.000014889031854004), +LPF_TAPS(0.000014980014741443), +LPF_TAPS(0.000014582085215692), +LPF_TAPS(0.000013732310264828), +LPF_TAPS(0.000012480939038455), +LPF_TAPS(0.000010889086159912), +LPF_TAPS(0.000009026155308364), +LPF_TAPS(0.000006967103138217), +LPF_TAPS(0.000004789644663852), +LPF_TAPS(0.000002571498736137), +LPF_TAPS(0.000000387766409326), +LPF_TAPS(-0.000001691473813720), +LPF_TAPS(-0.000003603281228946), +LPF_TAPS(-0.000005293619442137), +LPF_TAPS(-0.000006718729797308), +LPF_TAPS(-0.000007846083153315), +LPF_TAPS(-0.000008654897515219), +LPF_TAPS(-0.000009136224819149), +LPF_TAPS(-0.000009292625130319), +LPF_TAPS(-0.000009137460147870), +LPF_TAPS(-0.000008693849789841), +LPF_TAPS(-0.000007993345409950), +LPF_TAPS(-0.000007074380617936), +LPF_TAPS(-0.000005980565575676), +LPF_TAPS(-0.000004758892958091), +LPF_TAPS(-0.000003457923533233), +LPF_TAPS(-0.000002126016652791), +LPF_TAPS(-0.000000809666058306), +LPF_TAPS(0.000000448005422616), +LPF_TAPS(0.000001608547155233), +LPF_TAPS(0.000002639242484125), +LPF_TAPS(0.000003513906045182), +LPF_TAPS(0.000004213402503791), +LPF_TAPS(0.000004725883481839), +LPF_TAPS(0.000005046749878656), +LPF_TAPS(0.000005178356448336), +LPF_TAPS(0.000005129484047575), +LPF_TAPS(0.000004914612148722), +LPF_TAPS(0.000004553029819940), +LPF_TAPS(0.000004067827273334), +LPF_TAPS(0.000003484812208163), +LPF_TAPS(0.000002831395534679), +LPF_TAPS(0.000002135489726262), +LPF_TAPS(0.000001424460145696), +LPF_TAPS(0.000000724165411796), +LPF_TAPS(0.000000058117445035), +LPF_TAPS(-0.000000553214480790), +LPF_TAPS(-0.000001092938263905), +LPF_TAPS(-0.000001548101872579), +LPF_TAPS(-0.000001909881632425), +LPF_TAPS(-0.000002173599867573), +LPF_TAPS(-0.000002338582277506), +LPF_TAPS(-0.000002407871092248), +LPF_TAPS(-0.000002387814767604), +LPF_TAPS(-0.000002287558619334), +LPF_TAPS(-0.000002118463259581), +LPF_TAPS(-0.000001893478950466), +LPF_TAPS(-0.000001626504038801), +LPF_TAPS(-0.000001331754540171), +LPF_TAPS(-0.000001023169801964), +LPF_TAPS(-0.000000713876132379), +LPF_TAPS(-0.000000415726506026), +LPF_TAPS(-0.000000138930138694), +LPF_TAPS(0.000000108218929585), +LPF_TAPS(0.000000319509882033), +LPF_TAPS(0.000000490880137644), +LPF_TAPS(0.000000620382081976), +LPF_TAPS(0.000000708060236928), +LPF_TAPS(0.000000755750958378), +LPF_TAPS(0.000000766819403203), +LPF_TAPS(0.000000745850363362), +LPF_TAPS(0.000000698310581159), +LPF_TAPS(0.000000630200331088), +LPF_TAPS(0.000000547711411542), +LPF_TAPS(0.000000456907299830), +LPF_TAPS(0.000000363439182757), +LPF_TAPS(0.000000272309003584), +LPF_TAPS(0.000000187687704968), +LPF_TAPS(0.000000112793649081), +LPF_TAPS(0.000000049832918420), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000036465621112), +LPF_TAPS(-0.000000060174053095), +LPF_TAPS(-0.000000072440019472), +LPF_TAPS(-0.000000075109154481), +LPF_TAPS(-0.000000070367396870), +LPF_TAPS(-0.000000060545647801), +LPF_TAPS(-0.000000047931559441), +LPF_TAPS(-0.000000034599414872), +LPF_TAPS(-0.000000022267607829), +LPF_TAPS(-0.000000012191318007), +LPF_TAPS(-0.000000005095710178), +LPF_TAPS(-0.000000001152484340), +LPF_TAPS(0.000000000000000000), +}; diff --git a/core/sound/blip_lpf_768K_384K.h b/core/sound/blip_lpf_768K_384K.h new file mode 100644 index 000000000..e198f897e --- /dev/null +++ b/core/sound/blip_lpf_768K_384K.h @@ -0,0 +1,1181 @@ +static buf_t const blip_lpf_768K_384K[blip_lpf_768K_taps] = { +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000000270411186), +LPF_TAPS(-0.000000000994249696), +LPF_TAPS(0.000000002039181362), +LPF_TAPS(-0.000000003271279145), +LPF_TAPS(0.000000004555102288), +LPF_TAPS(-0.000000005753776591), +LPF_TAPS(0.000000006729075805), +LPF_TAPS(-0.000000007341504155), +LPF_TAPS(0.000000007450379994), +LPF_TAPS(-0.000000006913920594), +LPF_TAPS(0.000000005589328076), +LPF_TAPS(-0.000000003332876482), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000004554617657), +LPF_TAPS(-0.000000010476952726), +LPF_TAPS(0.000000017913549694), +LPF_TAPS(-0.000000027011428453), +LPF_TAPS(0.000000037917990275), +LPF_TAPS(-0.000000050780922627), +LPF_TAPS(0.000000065748102820), +LPF_TAPS(-0.000000082967500483), +LPF_TAPS(0.000000102587078868), +LPF_TAPS(-0.000000124754694991), +LPF_TAPS(0.000000149617998591), +LPF_TAPS(-0.000000177324329941), +LPF_TAPS(0.000000208020616472), +LPF_TAPS(-0.000000241853268257), +LPF_TAPS(0.000000278968072322), +LPF_TAPS(-0.000000319510085809), +LPF_TAPS(0.000000363623527997), +LPF_TAPS(-0.000000411451671180), +LPF_TAPS(0.000000463136730412), +LPF_TAPS(-0.000000518819752139), +LPF_TAPS(0.000000578640501706), +LPF_TAPS(-0.000000642737349775), +LPF_TAPS(0.000000711247157657), +LPF_TAPS(-0.000000784305161561), +LPF_TAPS(0.000000862044855799), +LPF_TAPS(-0.000000944597874939), +LPF_TAPS(0.000001032093874948), +LPF_TAPS(-0.000001124660413318), +LPF_TAPS(0.000001222422828231), +LPF_TAPS(-0.000001325504116749), +LPF_TAPS(0.000001434024812076), +LPF_TAPS(-0.000001548102859921), +LPF_TAPS(0.000001667853493968), +LPF_TAPS(-0.000001793389110503), +LPF_TAPS(0.000001924819142227), +LPF_TAPS(-0.000002062249931271), +LPF_TAPS(0.000002205784601466), +LPF_TAPS(-0.000002355522929902), +LPF_TAPS(0.000002511561217805), +LPF_TAPS(-0.000002673992160767), +LPF_TAPS(0.000002842904718416), +LPF_TAPS(-0.000003018383983486), +LPF_TAPS(0.000003200511050424), +LPF_TAPS(-0.000003389362883522), +LPF_TAPS(0.000003585012184637), +LPF_TAPS(-0.000003787527260573), +LPF_TAPS(0.000003996971890143), +LPF_TAPS(-0.000004213405190998), +LPF_TAPS(0.000004436881486255), +LPF_TAPS(-0.000004667450171018), +LPF_TAPS(0.000004905155578810), +LPF_TAPS(-0.000005150036848010), +LPF_TAPS(0.000005402127788367), +LPF_TAPS(-0.000005661456747620), +LPF_TAPS(0.000005928046478342), +LPF_TAPS(-0.000006201914005048), +LPF_TAPS(0.000006483070491646), +LPF_TAPS(-0.000006771521109318), +LPF_TAPS(0.000007067264904908), +LPF_TAPS(-0.000007370294669877), +LPF_TAPS(0.000007680596809926), +LPF_TAPS(-0.000007998151215387), +LPF_TAPS(0.000008322931132410), +LPF_TAPS(-0.000008654903035105), +LPF_TAPS(0.000008994026498681), +LPF_TAPS(-0.000009340254073686), +LPF_TAPS(0.000009693531161449), +LPF_TAPS(-0.000010053795890810), +LPF_TAPS(0.000010420978996245), +LPF_TAPS(-0.000010795003697464), +LPF_TAPS(0.000011175785580615), +LPF_TAPS(-0.000011563232481166), +LPF_TAPS(0.000011957244368585), +LPF_TAPS(-0.000012357713232915), +LPF_TAPS(0.000012764522973365), +LPF_TAPS(-0.000013177549289003), +LPF_TAPS(0.000013596659571678), +LPF_TAPS(-0.000014021712801288), +LPF_TAPS(0.000014452559443468), +LPF_TAPS(-0.000014889041349871), +LPF_TAPS(0.000015330991661110), +LPF_TAPS(-0.000015778234712481), +LPF_TAPS(0.000016230585942621), +LPF_TAPS(-0.000016687851805172), +LPF_TAPS(0.000017149829683597), +LPF_TAPS(-0.000017616307809269), +LPF_TAPS(0.000018087065182938), +LPF_TAPS(-0.000018561871499706), +LPF_TAPS(0.000019040487077642), +LPF_TAPS(-0.000019522662790136), +LPF_TAPS(0.000020008140002136), +LPF_TAPS(-0.000020496650510385), +LPF_TAPS(0.000020987916487774), +LPF_TAPS(-0.000021481650431946), +LPF_TAPS(0.000021977555118269), +LPF_TAPS(-0.000022475323557302), +LPF_TAPS(0.000022974638956881), +LPF_TAPS(-0.000023475174688944), +LPF_TAPS(0.000023976594261223), +LPF_TAPS(-0.000024478551293927), +LPF_TAPS(0.000024980689501528), +LPF_TAPS(-0.000025482642679791), +LPF_TAPS(0.000025984034698155), +LPF_TAPS(-0.000026484479497582), +LPF_TAPS(0.000026983581094014), +LPF_TAPS(-0.000027480933587538), +LPF_TAPS(0.000027976121177382), +LPF_TAPS(-0.000028468718182870), +LPF_TAPS(0.000028958289070426), +LPF_TAPS(-0.000029444388486774), +LPF_TAPS(0.000029926561298414), +LPF_TAPS(-0.000030404342637523), +LPF_TAPS(0.000030877257954332), +LPF_TAPS(-0.000031344823076165), +LPF_TAPS(0.000031806544273172), +LPF_TAPS(-0.000032261918330903), +LPF_TAPS(0.000032710432629812), +LPF_TAPS(-0.000033151565231787), +LPF_TAPS(0.000033584784973814), +LPF_TAPS(-0.000034009551568840), +LPF_TAPS(0.000034425315713993), +LPF_TAPS(-0.000034831519206137), +LPF_TAPS(0.000035227595064980), +LPF_TAPS(-0.000035612967663724), +LPF_TAPS(0.000035987052867338), +LPF_TAPS(-0.000036349258178619), +LPF_TAPS(0.000036698982892007), +LPF_TAPS(-0.000037035618255292), +LPF_TAPS(0.000037358547639259), +LPF_TAPS(-0.000037667146715327), +LPF_TAPS(0.000037960783641273), +LPF_TAPS(-0.000038238819255021), +LPF_TAPS(0.000038500607276709), +LPF_TAPS(-0.000038745494518822), +LPF_TAPS(0.000038972821104735), +LPF_TAPS(-0.000039181920695467), +LPF_TAPS(0.000039372120724805), +LPF_TAPS(-0.000039542742642795), +LPF_TAPS(0.000039693102167627), +LPF_TAPS(-0.000039822509545943), +LPF_TAPS(0.000039930269821541), +LPF_TAPS(-0.000040015683112645), +LPF_TAPS(0.000040078044897437), +LPF_TAPS(-0.000040116646308240), +LPF_TAPS(0.000040130774434075), +LPF_TAPS(-0.000040119712631595), +LPF_TAPS(0.000040082740844612), +LPF_TAPS(-0.000040019135931921), +LPF_TAPS(0.000039928172003567), +LPF_TAPS(-0.000039809120765476), +LPF_TAPS(0.000039661251872419), +LPF_TAPS(-0.000039483833289280), +LPF_TAPS(0.000039276131660508), +LPF_TAPS(-0.000039037412687953), +LPF_TAPS(0.000038766941516558), +LPF_TAPS(-0.000038463983128416), +LPF_TAPS(0.000038127802744662), +LPF_TAPS(-0.000037757666235375), +LPF_TAPS(0.000037352840537317), +LPF_TAPS(-0.000036912594079466), +LPF_TAPS(0.000036436197216230), +LPF_TAPS(-0.000035922922668168), +LPF_TAPS(0.000035372045970431), +LPF_TAPS(-0.000034782845928194), +LPF_TAPS(0.000034154605079717), +LPF_TAPS(-0.000033486610166390), +LPF_TAPS(0.000032778152609630), +LPF_TAPS(-0.000032028528994971), +LPF_TAPS(0.000031237041562635), +LPF_TAPS(-0.000030402998704811), +LPF_TAPS(0.000029525715469236), +LPF_TAPS(-0.000028604514069339), +LPF_TAPS(0.000027638724400135), +LPF_TAPS(-0.000026627684560227), +LPF_TAPS(0.000025570741379770), +LPF_TAPS(-0.000024467250953544), +LPF_TAPS(0.000023316579179911), +LPF_TAPS(-0.000022118102304654), +LPF_TAPS(0.000020871207469923), +LPF_TAPS(-0.000019575293267954), +LPF_TAPS(0.000018229770299364), +LPF_TAPS(-0.000016834061735821), +LPF_TAPS(0.000015387603886708), +LPF_TAPS(-0.000013889846770054), +LPF_TAPS(0.000012340254686558), +LPF_TAPS(-0.000010738306797607), +LPF_TAPS(0.000009083497706100), +LPF_TAPS(-0.000007375338040335), +LPF_TAPS(0.000005613355040533), +LPF_TAPS(-0.000003797093147761), +LPF_TAPS(0.000001926114595016), +LPF_TAPS(-0.000000000000000003), +LPF_TAPS(-0.000001981651040116), +LPF_TAPS(0.000004019219353176), +LPF_TAPS(-0.000006113065595237), +LPF_TAPS(0.000008263529652806), +LPF_TAPS(-0.000010470930045337), +LPF_TAPS(0.000012735563326905), +LPF_TAPS(-0.000015057703488542), +LPF_TAPS(0.000017437601360918), +LPF_TAPS(-0.000019875484017872), +LPF_TAPS(0.000022371554181095), +LPF_TAPS(-0.000024925989626264), +LPF_TAPS(0.000027538942591151), +LPF_TAPS(-0.000030210539185376), +LPF_TAPS(0.000032940878803412), +LPF_TAPS(-0.000035730033539605), +LPF_TAPS(0.000038578047606853), +LPF_TAPS(-0.000041484936758591), +LPF_TAPS(0.000044450687714644), +LPF_TAPS(-0.000047475257591278), +LPF_TAPS(0.000050558573335760), +LPF_TAPS(-0.000053700531166021), +LPF_TAPS(0.000056900996015075), +LPF_TAPS(-0.000060159800981691), +LPF_TAPS(0.000063476746786749), +LPF_TAPS(-0.000066851601235593), +LPF_TAPS(0.000070284098687913), +LPF_TAPS(-0.000073773939533842), +LPF_TAPS(0.000077320789678049), +LPF_TAPS(-0.000080924280031426), +LPF_TAPS(0.000084584006010995), +LPF_TAPS(-0.000088299527048358), +LPF_TAPS(0.000092070366107026), +LPF_TAPS(-0.000095896009209253), +LPF_TAPS(0.000099775904971949), +LPF_TAPS(-0.000103709464153514), +LPF_TAPS(0.000107696059210172), +LPF_TAPS(-0.000111735023863637), +LPF_TAPS(0.000115825652679693), +LPF_TAPS(-0.000119967200658306), +LPF_TAPS(0.000124158882835594), +LPF_TAPS(-0.000128399873897980), +LPF_TAPS(0.000132689307809155), +LPF_TAPS(-0.000137026277449419), +LPF_TAPS(0.000141409834269035), +LPF_TAPS(-0.000145838987954894), +LPF_TAPS(0.000150312706110820), +LPF_TAPS(-0.000154829913953110), +LPF_TAPS(0.000159389494019859), +LPF_TAPS(-0.000163990285895906), +LPF_TAPS(0.000168631085952943), +LPF_TAPS(-0.000173310647105377), +LPF_TAPS(0.000178027678582232), +LPF_TAPS(-0.000182780845715392), +LPF_TAPS(0.000187568769744742), +LPF_TAPS(-0.000192390027639763), +LPF_TAPS(0.000197243151939321), +LPF_TAPS(-0.000202126630608231), +LPF_TAPS(0.000207038906912205), +LPF_TAPS(-0.000211978379311058), +LPF_TAPS(0.000216943401370225), +LPF_TAPS(-0.000221932281691084), +LPF_TAPS(0.000226943283860568), +LPF_TAPS(-0.000231974626419998), +LPF_TAPS(0.000237024482853370), +LPF_TAPS(-0.000242090981595875), +LPF_TAPS(0.000247172206062245), +LPF_TAPS(-0.000252266194695467), +LPF_TAPS(0.000257370941036386), +LPF_TAPS(-0.000262484393813786), +LPF_TAPS(0.000267604457055676), +LPF_TAPS(-0.000272728990221946), +LPF_TAPS(0.000277855808358299), +LPF_TAPS(-0.000282982682271836), +LPF_TAPS(0.000288107338728734), +LPF_TAPS(-0.000293227460673635), +LPF_TAPS(0.000298340687471423), +LPF_TAPS(-0.000303444615171273), +LPF_TAPS(0.000308536796793261), +LPF_TAPS(-0.000313614742637452), +LPF_TAPS(0.000318675920616005), +LPF_TAPS(-0.000323717756607956), +LPF_TAPS(0.000328737634837030), +LPF_TAPS(-0.000333732898272658), +LPF_TAPS(0.000338700849054109), +LPF_TAPS(-0.000343638748937800), +LPF_TAPS(0.000348543819768130), +LPF_TAPS(-0.000353413243971537), +LPF_TAPS(0.000358244165074024), +LPF_TAPS(-0.000363033688242245), +LPF_TAPS(0.000367778880847963), +LPF_TAPS(-0.000372476773056069), +LPF_TAPS(0.000377124358436137), +LPF_TAPS(-0.000381718594597412), +LPF_TAPS(0.000386256403847293), +LPF_TAPS(-0.000390734673873283), +LPF_TAPS(0.000395150258448289), +LPF_TAPS(-0.000399499978159282), +LPF_TAPS(0.000403780621159213), +LPF_TAPS(-0.000407988943942102), +LPF_TAPS(0.000412121672141243), +LPF_TAPS(-0.000416175501350349), +LPF_TAPS(0.000420147097967579), +LPF_TAPS(-0.000424033100062336), +LPF_TAPS(0.000427830118264552), +LPF_TAPS(-0.000431534736676509), +LPF_TAPS(0.000435143513806895), +LPF_TAPS(-0.000438652983526867), +LPF_TAPS(0.000442059656048091), +LPF_TAPS(-0.000445360018922507), +LPF_TAPS(0.000448550538063360), +LPF_TAPS(-0.000451627658787709), +LPF_TAPS(0.000454587806879764), +LPF_TAPS(-0.000457427389675035), +LPF_TAPS(0.000460142797164853), +LPF_TAPS(-0.000462730403121316), +LPF_TAPS(0.000465186566241766), +LPF_TAPS(-0.000467507631313145), +LPF_TAPS(0.000469689930395631), +LPF_TAPS(-0.000471729784024983), +LPF_TAPS(0.000473623502433613), +LPF_TAPS(-0.000475367386790137), +LPF_TAPS(0.000476957730456324), +LPF_TAPS(-0.000478390820261935), +LPF_TAPS(0.000479662937796735), +LPF_TAPS(-0.000480770360718725), +LPF_TAPS(0.000481709364079260), +LPF_TAPS(-0.000482476221663812), +LPF_TAPS(0.000483067207347903), +LPF_TAPS(-0.000483478596468587), +LPF_TAPS(0.000483706667210077), +LPF_TAPS(-0.000483747702003447), +LPF_TAPS(0.000483597988940244), +LPF_TAPS(-0.000483253823198865), +LPF_TAPS(0.000482711508483713), +LPF_TAPS(-0.000481967358476406), +LPF_TAPS(0.000481017698298616), +LPF_TAPS(-0.000479858865985737), +LPF_TAPS(0.000478487213971473), +LPF_TAPS(-0.000476899110581980), +LPF_TAPS(0.000475090941539597), +LPF_TAPS(-0.000473059111475377), +LPF_TAPS(0.000470800045449915), +LPF_TAPS(-0.000468310190481600), +LPF_TAPS(0.000465586017082436), +LPF_TAPS(-0.000462624020799889), +LPF_TAPS(0.000459420723764587), +LPF_TAPS(-0.000455972676243683), +LPF_TAPS(0.000452276458198651), +LPF_TAPS(-0.000448328680846479), +LPF_TAPS(0.000444125988225302), +LPF_TAPS(-0.000439665058761943), +LPF_TAPS(0.000434942606841526), +LPF_TAPS(-0.000429955384379064), +LPF_TAPS(0.000424700182391138), +LPF_TAPS(-0.000419173832567952), +LPF_TAPS(0.000413373208844710), +LPF_TAPS(-0.000407295228971762), +LPF_TAPS(0.000400936856082419), +LPF_TAPS(-0.000394295100258801), +LPF_TAPS(0.000387367020093622), +LPF_TAPS(-0.000380149724248259), +LPF_TAPS(0.000372640373005998), +LPF_TAPS(-0.000364836179819894), +LPF_TAPS(0.000356734412854055), +LPF_TAPS(-0.000348332396518861), +LPF_TAPS(0.000339627512997867), +LPF_TAPS(-0.000330617203766392), +LPF_TAPS(0.000321298971101761), +LPF_TAPS(-0.000311670379583514), +LPF_TAPS(0.000301729057582259), +LPF_TAPS(-0.000291472698739046), +LPF_TAPS(0.000280899063431644), +LPF_TAPS(-0.000270005980228271), +LPF_TAPS(0.000258791347328876), +LPF_TAPS(-0.000247253133991462), +LPF_TAPS(0.000235389381944138), +LPF_TAPS(-0.000223198206781637), +LPF_TAPS(0.000210677799345778), +LPF_TAPS(-0.000197826427088561), +LPF_TAPS(0.000184642435418710), +LPF_TAPS(-0.000171124249029053), +LPF_TAPS(0.000157270373204788), +LPF_TAPS(-0.000143079395113615), +LPF_TAPS(0.000128549985073485), +LPF_TAPS(-0.000113680897800369), +LPF_TAPS(0.000098470973634793), +LPF_TAPS(-0.000082919139745099), +LPF_TAPS(0.000067024411307639), +LPF_TAPS(-0.000050785892664286), +LPF_TAPS(0.000034202778454439), +LPF_TAPS(-0.000017274354722572), +LPF_TAPS(0.000000000000000014), +LPF_TAPS(0.000017620813639447), +LPF_TAPS(-0.000035588519551489), +LPF_TAPS(0.000053903455519512), +LPF_TAPS(-0.000072565862782260), +LPF_TAPS(0.000091575885089580), +LPF_TAPS(-0.000110933567787666), +LPF_TAPS(0.000130638856934091), +LPF_TAPS(-0.000150691598443988), +LPF_TAPS(0.000171091537266013), +LPF_TAPS(-0.000191838316591080), +LPF_TAPS(0.000212931477093403), +LPF_TAPS(-0.000234370456202377), +LPF_TAPS(0.000256154587410179), +LPF_TAPS(-0.000278283099611775), +LPF_TAPS(0.000300755116478590), +LPF_TAPS(-0.000323569655867949), +LPF_TAPS(0.000346725629267694), +LPF_TAPS(-0.000370221841275197), +LPF_TAPS(0.000394056989113803), +LPF_TAPS(-0.000418229662185097), +LPF_TAPS(0.000442738341658212), +LPF_TAPS(-0.000467581400096332), +LPF_TAPS(0.000492757101121587), +LPF_TAPS(-0.000518263599116645), +LPF_TAPS(0.000544098938966130), +LPF_TAPS(-0.000570261055836143), +LPF_TAPS(0.000596747774993021), +LPF_TAPS(-0.000623556811661394), +LPF_TAPS(0.000650685770922677), +LPF_TAPS(-0.000678132147652138), +LPF_TAPS(0.000705893326497600), +LPF_TAPS(-0.000733966581898311), +LPF_TAPS(0.000762349078143984), +LPF_TAPS(-0.000791037869475468), +LPF_TAPS(0.000820029900226574), +LPF_TAPS(-0.000849322005006614), +LPF_TAPS(0.000878910908925097), +LPF_TAPS(-0.000908793227858092), +LPF_TAPS(0.000938965468755724), +LPF_TAPS(-0.000969424029992167), +LPF_TAPS(0.001000165201758039), +LPF_TAPS(-0.001031185166493171), +LPF_TAPS(0.001062479999363495), +LPF_TAPS(-0.001094045668779393), +LPF_TAPS(0.001125878036955373), +LPF_TAPS(-0.001157972860512807), +LPF_TAPS(0.001190325791125529), +LPF_TAPS(-0.001222932376205617), +LPF_TAPS(0.001255788059632947), +LPF_TAPS(-0.001288888182526336), +LPF_TAPS(0.001322227984056061), +LPF_TAPS(-0.001355802602298820), +LPF_TAPS(0.001389607075134370), +LPF_TAPS(-0.001423636341183102), +LPF_TAPS(0.001457885240785600), +LPF_TAPS(-0.001492348517023386), +LPF_TAPS(0.001527020816780052), +LPF_TAPS(-0.001561896691843702), +LPF_TAPS(0.001596970600050276), +LPF_TAPS(-0.001632236906465618), +LPF_TAPS(0.001667689884609320), +LPF_TAPS(-0.001703323717717588), +LPF_TAPS(0.001739132500044762), +LPF_TAPS(-0.001775110238204683), +LPF_TAPS(0.001811250852550967), +LPF_TAPS(-0.001847548178594808), +LPF_TAPS(0.001883995968461036), +LPF_TAPS(-0.001920587892381849), +LPF_TAPS(0.001957317540227685), +LPF_TAPS(-0.001994178423074255), +LPF_TAPS(0.002031163974806278), +LPF_TAPS(-0.002068267553756874), +LPF_TAPS(0.002105482444381715), +LPF_TAPS(-0.002142801858968588), +LPF_TAPS(0.002180218939380428), +LPF_TAPS(-0.002217726758832453), +LPF_TAPS(0.002255318323702332), +LPF_TAPS(-0.002292986575372473), +LPF_TAPS(0.002330724392104569), +LPF_TAPS(-0.002368524590945418), +LPF_TAPS(0.002406379929663035), +LPF_TAPS(-0.002444283108713129), +LPF_TAPS(0.002482226773234861), +LPF_TAPS(-0.002520203515075174), +LPF_TAPS(0.002558205874840951), +LPF_TAPS(-0.002596226343979004), +LPF_TAPS(0.002634257366882061), +LPF_TAPS(-0.002672291343020784), +LPF_TAPS(0.002710320629100963), +LPF_TAPS(-0.002748337541244994), +LPF_TAPS(0.002786334357196795), +LPF_TAPS(-0.002824303318549647), +LPF_TAPS(0.002862236632995987), +LPF_TAPS(-0.002900126476598270), +LPF_TAPS(0.002937964996080315), +LPF_TAPS(-0.002975744311138068), +LPF_TAPS(0.003013456516769105), +LPF_TAPS(-0.003051093685619919), +LPF_TAPS(0.003088647870350189), +LPF_TAPS(-0.003126111106013140), +LPF_TAPS(0.003163475412451058), +LPF_TAPS(-0.003200732796705143), +LPF_TAPS(0.003237875255438910), +LPF_TAPS(-0.003274894777373765), +LPF_TAPS(0.003311783345736453), +LPF_TAPS(-0.003348532940717123), +LPF_TAPS(0.003385135541937034), +LPF_TAPS(-0.003421583130924953), +LPF_TAPS(0.003457867693601739), +LPF_TAPS(-0.003493981222771505), +LPF_TAPS(0.003529915720618663), +LPF_TAPS(-0.003565663201210385), +LPF_TAPS(0.003601215693002516), +LPF_TAPS(-0.003636565241348854), +LPF_TAPS(0.003671703911012522), +LPF_TAPS(-0.003706623788678157), +LPF_TAPS(0.003741316985464251), +LPF_TAPS(-0.003775775639435239), +LPF_TAPS(0.003809991918110436), +LPF_TAPS(-0.003843958020971396), +LPF_TAPS(0.003877666181964841), +LPF_TAPS(-0.003911108672000603), +LPF_TAPS(0.003944277801444062), +LPF_TAPS(-0.003977165922601843), +LPF_TAPS(0.004009765432199282), +LPF_TAPS(-0.004042068773849197), +LPF_TAPS(0.004074068440511907), +LPF_TAPS(-0.004105756976942348), +LPF_TAPS(0.004137126982127919), +LPF_TAPS(-0.004168171111711666), +LPF_TAPS(0.004198882080402778), +LPF_TAPS(-0.004229252664372421), +LPF_TAPS(0.004259275703633247), +LPF_TAPS(-0.004288944104403062), +LPF_TAPS(0.004318250841450483), +LPF_TAPS(-0.004347188960422623), +LPF_TAPS(0.004375751580152430), +LPF_TAPS(-0.004403931894946425), +LPF_TAPS(0.004431723176851317), +LPF_TAPS(-0.004459118777896791), +LPF_TAPS(0.004486112132317764), +LPF_TAPS(-0.004512696758749931), +LPF_TAPS(0.004538866262402050), +LPF_TAPS(-0.004564614337201600), +LPF_TAPS(0.004589934767914467), +LPF_TAPS(-0.004614821432235720), +LPF_TAPS(0.004639268302853067), +LPF_TAPS(-0.004663269449481221), +LPF_TAPS(0.004686819040863900), +LPF_TAPS(-0.004709911346748542), +LPF_TAPS(0.004732540739825469), +LPF_TAPS(-0.004754701697636799), +LPF_TAPS(0.004776388804451371), +LPF_TAPS(-0.004797596753105372), +LPF_TAPS(0.004818320346807375), +LPF_TAPS(-0.004838554500909534), +LPF_TAPS(0.004858294244640562), +LPF_TAPS(-0.004877534722802006), +LPF_TAPS(0.004896271197427504), +LPF_TAPS(-0.004914499049402611), +LPF_TAPS(0.004932213780045447), +LPF_TAPS(-0.004949411012647929), +LPF_TAPS(0.004966086493976694), +LPF_TAPS(-0.004982236095731548), +LPF_TAPS(0.004997855815964010), +LPF_TAPS(-0.005012941780452204), +LPF_TAPS(0.005027490244032875), +LPF_TAPS(-0.005041497591890537), +LPF_TAPS(0.005054960340802851), +LPF_TAPS(-0.005067875140339913), +LPF_TAPS(0.005080238774019983), +LPF_TAPS(-0.005092048160419741), +LPF_TAPS(0.005103300354237250), +LPF_TAPS(-0.005113992547309152), +LPF_TAPS(0.005124122069582142), +LPF_TAPS(-0.005133686390034935), +LPF_TAPS(0.005142683117554329), +LPF_TAPS(-0.005151110001762504), +LPF_TAPS(0.005158964933796077), +LPF_TAPS(-0.005166245947036424), +LPF_TAPS(0.005172951217791205), +LPF_TAPS(-0.005179079065925450), +LPF_TAPS(0.005184627955445600), +LPF_TAPS(-0.005189596495030709), +LPF_TAPS(0.005193983438515609), +LPF_TAPS(-0.005197787685323134), +LPF_TAPS(0.005201008280846106), +LPF_TAPS(-0.005203644416778216), +LPF_TAPS(0.005205695431395181), +LPF_TAPS(-0.005207160809784200), +LPF_TAPS(0.005208040184022438), +LPF_TAPS(0.994791666661283269), +LPF_TAPS(0.005208040184022438), +LPF_TAPS(-0.005207160809784200), +LPF_TAPS(0.005205695431395181), +LPF_TAPS(-0.005203644416778216), +LPF_TAPS(0.005201008280846106), +LPF_TAPS(-0.005197787685323134), +LPF_TAPS(0.005193983438515609), +LPF_TAPS(-0.005189596495030709), +LPF_TAPS(0.005184627955445601), +LPF_TAPS(-0.005179079065925450), +LPF_TAPS(0.005172951217791205), +LPF_TAPS(-0.005166245947036424), +LPF_TAPS(0.005158964933796077), +LPF_TAPS(-0.005151110001762505), +LPF_TAPS(0.005142683117554329), +LPF_TAPS(-0.005133686390034935), +LPF_TAPS(0.005124122069582142), +LPF_TAPS(-0.005113992547309153), +LPF_TAPS(0.005103300354237250), +LPF_TAPS(-0.005092048160419742), +LPF_TAPS(0.005080238774019983), +LPF_TAPS(-0.005067875140339913), +LPF_TAPS(0.005054960340802851), +LPF_TAPS(-0.005041497591890537), +LPF_TAPS(0.005027490244032875), +LPF_TAPS(-0.005012941780452204), +LPF_TAPS(0.004997855815964010), +LPF_TAPS(-0.004982236095731548), +LPF_TAPS(0.004966086493976694), +LPF_TAPS(-0.004949411012647929), +LPF_TAPS(0.004932213780045447), +LPF_TAPS(-0.004914499049402611), +LPF_TAPS(0.004896271197427504), +LPF_TAPS(-0.004877534722802006), +LPF_TAPS(0.004858294244640562), +LPF_TAPS(-0.004838554500909534), +LPF_TAPS(0.004818320346807375), +LPF_TAPS(-0.004797596753105372), +LPF_TAPS(0.004776388804451371), +LPF_TAPS(-0.004754701697636799), +LPF_TAPS(0.004732540739825469), +LPF_TAPS(-0.004709911346748542), +LPF_TAPS(0.004686819040863900), +LPF_TAPS(-0.004663269449481221), +LPF_TAPS(0.004639268302853067), +LPF_TAPS(-0.004614821432235721), +LPF_TAPS(0.004589934767914467), +LPF_TAPS(-0.004564614337201602), +LPF_TAPS(0.004538866262402050), +LPF_TAPS(-0.004512696758749932), +LPF_TAPS(0.004486112132317765), +LPF_TAPS(-0.004459118777896791), +LPF_TAPS(0.004431723176851318), +LPF_TAPS(-0.004403931894946425), +LPF_TAPS(0.004375751580152430), +LPF_TAPS(-0.004347188960422624), +LPF_TAPS(0.004318250841450484), +LPF_TAPS(-0.004288944104403062), +LPF_TAPS(0.004259275703633247), +LPF_TAPS(-0.004229252664372422), +LPF_TAPS(0.004198882080402778), +LPF_TAPS(-0.004168171111711667), +LPF_TAPS(0.004137126982127919), +LPF_TAPS(-0.004105756976942348), +LPF_TAPS(0.004074068440511907), +LPF_TAPS(-0.004042068773849197), +LPF_TAPS(0.004009765432199283), +LPF_TAPS(-0.003977165922601843), +LPF_TAPS(0.003944277801444063), +LPF_TAPS(-0.003911108672000603), +LPF_TAPS(0.003877666181964843), +LPF_TAPS(-0.003843958020971395), +LPF_TAPS(0.003809991918110436), +LPF_TAPS(-0.003775775639435239), +LPF_TAPS(0.003741316985464251), +LPF_TAPS(-0.003706623788678157), +LPF_TAPS(0.003671703911012522), +LPF_TAPS(-0.003636565241348854), +LPF_TAPS(0.003601215693002516), +LPF_TAPS(-0.003565663201210386), +LPF_TAPS(0.003529915720618663), +LPF_TAPS(-0.003493981222771505), +LPF_TAPS(0.003457867693601739), +LPF_TAPS(-0.003421583130924954), +LPF_TAPS(0.003385135541937035), +LPF_TAPS(-0.003348532940717124), +LPF_TAPS(0.003311783345736452), +LPF_TAPS(-0.003274894777373765), +LPF_TAPS(0.003237875255438911), +LPF_TAPS(-0.003200732796705143), +LPF_TAPS(0.003163475412451059), +LPF_TAPS(-0.003126111106013141), +LPF_TAPS(0.003088647870350190), +LPF_TAPS(-0.003051093685619919), +LPF_TAPS(0.003013456516769106), +LPF_TAPS(-0.002975744311138068), +LPF_TAPS(0.002937964996080315), +LPF_TAPS(-0.002900126476598269), +LPF_TAPS(0.002862236632995987), +LPF_TAPS(-0.002824303318549648), +LPF_TAPS(0.002786334357196794), +LPF_TAPS(-0.002748337541244995), +LPF_TAPS(0.002710320629100963), +LPF_TAPS(-0.002672291343020785), +LPF_TAPS(0.002634257366882061), +LPF_TAPS(-0.002596226343979004), +LPF_TAPS(0.002558205874840951), +LPF_TAPS(-0.002520203515075174), +LPF_TAPS(0.002482226773234862), +LPF_TAPS(-0.002444283108713130), +LPF_TAPS(0.002406379929663036), +LPF_TAPS(-0.002368524590945418), +LPF_TAPS(0.002330724392104569), +LPF_TAPS(-0.002292986575372473), +LPF_TAPS(0.002255318323702333), +LPF_TAPS(-0.002217726758832453), +LPF_TAPS(0.002180218939380428), +LPF_TAPS(-0.002142801858968588), +LPF_TAPS(0.002105482444381714), +LPF_TAPS(-0.002068267553756875), +LPF_TAPS(0.002031163974806278), +LPF_TAPS(-0.001994178423074256), +LPF_TAPS(0.001957317540227685), +LPF_TAPS(-0.001920587892381849), +LPF_TAPS(0.001883995968461037), +LPF_TAPS(-0.001847548178594808), +LPF_TAPS(0.001811250852550967), +LPF_TAPS(-0.001775110238204684), +LPF_TAPS(0.001739132500044762), +LPF_TAPS(-0.001703323717717588), +LPF_TAPS(0.001667689884609320), +LPF_TAPS(-0.001632236906465618), +LPF_TAPS(0.001596970600050276), +LPF_TAPS(-0.001561896691843702), +LPF_TAPS(0.001527020816780052), +LPF_TAPS(-0.001492348517023386), +LPF_TAPS(0.001457885240785600), +LPF_TAPS(-0.001423636341183102), +LPF_TAPS(0.001389607075134370), +LPF_TAPS(-0.001355802602298820), +LPF_TAPS(0.001322227984056061), +LPF_TAPS(-0.001288888182526336), +LPF_TAPS(0.001255788059632947), +LPF_TAPS(-0.001222932376205617), +LPF_TAPS(0.001190325791125529), +LPF_TAPS(-0.001157972860512807), +LPF_TAPS(0.001125878036955374), +LPF_TAPS(-0.001094045668779393), +LPF_TAPS(0.001062479999363495), +LPF_TAPS(-0.001031185166493171), +LPF_TAPS(0.001000165201758039), +LPF_TAPS(-0.000969424029992166), +LPF_TAPS(0.000938965468755724), +LPF_TAPS(-0.000908793227858092), +LPF_TAPS(0.000878910908925098), +LPF_TAPS(-0.000849322005006615), +LPF_TAPS(0.000820029900226574), +LPF_TAPS(-0.000791037869475468), +LPF_TAPS(0.000762349078143985), +LPF_TAPS(-0.000733966581898311), +LPF_TAPS(0.000705893326497601), +LPF_TAPS(-0.000678132147652138), +LPF_TAPS(0.000650685770922677), +LPF_TAPS(-0.000623556811661394), +LPF_TAPS(0.000596747774993021), +LPF_TAPS(-0.000570261055836143), +LPF_TAPS(0.000544098938966130), +LPF_TAPS(-0.000518263599116645), +LPF_TAPS(0.000492757101121588), +LPF_TAPS(-0.000467581400096331), +LPF_TAPS(0.000442738341658212), +LPF_TAPS(-0.000418229662185096), +LPF_TAPS(0.000394056989113803), +LPF_TAPS(-0.000370221841275197), +LPF_TAPS(0.000346725629267694), +LPF_TAPS(-0.000323569655867949), +LPF_TAPS(0.000300755116478590), +LPF_TAPS(-0.000278283099611775), +LPF_TAPS(0.000256154587410179), +LPF_TAPS(-0.000234370456202377), +LPF_TAPS(0.000212931477093403), +LPF_TAPS(-0.000191838316591080), +LPF_TAPS(0.000171091537266013), +LPF_TAPS(-0.000150691598443988), +LPF_TAPS(0.000130638856934091), +LPF_TAPS(-0.000110933567787667), +LPF_TAPS(0.000091575885089580), +LPF_TAPS(-0.000072565862782260), +LPF_TAPS(0.000053903455519512), +LPF_TAPS(-0.000035588519551489), +LPF_TAPS(0.000017620813639447), +LPF_TAPS(0.000000000000000014), +LPF_TAPS(-0.000017274354722572), +LPF_TAPS(0.000034202778454439), +LPF_TAPS(-0.000050785892664286), +LPF_TAPS(0.000067024411307639), +LPF_TAPS(-0.000082919139745099), +LPF_TAPS(0.000098470973634793), +LPF_TAPS(-0.000113680897800369), +LPF_TAPS(0.000128549985073485), +LPF_TAPS(-0.000143079395113615), +LPF_TAPS(0.000157270373204788), +LPF_TAPS(-0.000171124249029052), +LPF_TAPS(0.000184642435418710), +LPF_TAPS(-0.000197826427088561), +LPF_TAPS(0.000210677799345778), +LPF_TAPS(-0.000223198206781637), +LPF_TAPS(0.000235389381944138), +LPF_TAPS(-0.000247253133991462), +LPF_TAPS(0.000258791347328876), +LPF_TAPS(-0.000270005980228271), +LPF_TAPS(0.000280899063431644), +LPF_TAPS(-0.000291472698739046), +LPF_TAPS(0.000301729057582259), +LPF_TAPS(-0.000311670379583514), +LPF_TAPS(0.000321298971101761), +LPF_TAPS(-0.000330617203766392), +LPF_TAPS(0.000339627512997867), +LPF_TAPS(-0.000348332396518861), +LPF_TAPS(0.000356734412854056), +LPF_TAPS(-0.000364836179819894), +LPF_TAPS(0.000372640373005998), +LPF_TAPS(-0.000380149724248259), +LPF_TAPS(0.000387367020093622), +LPF_TAPS(-0.000394295100258801), +LPF_TAPS(0.000400936856082419), +LPF_TAPS(-0.000407295228971762), +LPF_TAPS(0.000413373208844710), +LPF_TAPS(-0.000419173832567952), +LPF_TAPS(0.000424700182391138), +LPF_TAPS(-0.000429955384379064), +LPF_TAPS(0.000434942606841526), +LPF_TAPS(-0.000439665058761943), +LPF_TAPS(0.000444125988225302), +LPF_TAPS(-0.000448328680846479), +LPF_TAPS(0.000452276458198651), +LPF_TAPS(-0.000455972676243683), +LPF_TAPS(0.000459420723764588), +LPF_TAPS(-0.000462624020799889), +LPF_TAPS(0.000465586017082436), +LPF_TAPS(-0.000468310190481601), +LPF_TAPS(0.000470800045449915), +LPF_TAPS(-0.000473059111475377), +LPF_TAPS(0.000475090941539597), +LPF_TAPS(-0.000476899110581980), +LPF_TAPS(0.000478487213971474), +LPF_TAPS(-0.000479858865985737), +LPF_TAPS(0.000481017698298616), +LPF_TAPS(-0.000481967358476406), +LPF_TAPS(0.000482711508483713), +LPF_TAPS(-0.000483253823198866), +LPF_TAPS(0.000483597988940244), +LPF_TAPS(-0.000483747702003447), +LPF_TAPS(0.000483706667210077), +LPF_TAPS(-0.000483478596468587), +LPF_TAPS(0.000483067207347904), +LPF_TAPS(-0.000482476221663813), +LPF_TAPS(0.000481709364079260), +LPF_TAPS(-0.000480770360718725), +LPF_TAPS(0.000479662937796735), +LPF_TAPS(-0.000478390820261935), +LPF_TAPS(0.000476957730456324), +LPF_TAPS(-0.000475367386790138), +LPF_TAPS(0.000473623502433613), +LPF_TAPS(-0.000471729784024983), +LPF_TAPS(0.000469689930395632), +LPF_TAPS(-0.000467507631313146), +LPF_TAPS(0.000465186566241767), +LPF_TAPS(-0.000462730403121316), +LPF_TAPS(0.000460142797164853), +LPF_TAPS(-0.000457427389675035), +LPF_TAPS(0.000454587806879764), +LPF_TAPS(-0.000451627658787709), +LPF_TAPS(0.000448550538063360), +LPF_TAPS(-0.000445360018922507), +LPF_TAPS(0.000442059656048091), +LPF_TAPS(-0.000438652983526867), +LPF_TAPS(0.000435143513806896), +LPF_TAPS(-0.000431534736676510), +LPF_TAPS(0.000427830118264552), +LPF_TAPS(-0.000424033100062336), +LPF_TAPS(0.000420147097967580), +LPF_TAPS(-0.000416175501350349), +LPF_TAPS(0.000412121672141243), +LPF_TAPS(-0.000407988943942102), +LPF_TAPS(0.000403780621159213), +LPF_TAPS(-0.000399499978159282), +LPF_TAPS(0.000395150258448289), +LPF_TAPS(-0.000390734673873283), +LPF_TAPS(0.000386256403847293), +LPF_TAPS(-0.000381718594597412), +LPF_TAPS(0.000377124358436137), +LPF_TAPS(-0.000372476773056069), +LPF_TAPS(0.000367778880847964), +LPF_TAPS(-0.000363033688242245), +LPF_TAPS(0.000358244165074024), +LPF_TAPS(-0.000353413243971538), +LPF_TAPS(0.000348543819768130), +LPF_TAPS(-0.000343638748937801), +LPF_TAPS(0.000338700849054109), +LPF_TAPS(-0.000333732898272658), +LPF_TAPS(0.000328737634837030), +LPF_TAPS(-0.000323717756607956), +LPF_TAPS(0.000318675920616005), +LPF_TAPS(-0.000313614742637452), +LPF_TAPS(0.000308536796793261), +LPF_TAPS(-0.000303444615171273), +LPF_TAPS(0.000298340687471424), +LPF_TAPS(-0.000293227460673635), +LPF_TAPS(0.000288107338728734), +LPF_TAPS(-0.000282982682271836), +LPF_TAPS(0.000277855808358299), +LPF_TAPS(-0.000272728990221946), +LPF_TAPS(0.000267604457055676), +LPF_TAPS(-0.000262484393813786), +LPF_TAPS(0.000257370941036386), +LPF_TAPS(-0.000252266194695467), +LPF_TAPS(0.000247172206062245), +LPF_TAPS(-0.000242090981595876), +LPF_TAPS(0.000237024482853370), +LPF_TAPS(-0.000231974626419998), +LPF_TAPS(0.000226943283860568), +LPF_TAPS(-0.000221932281691084), +LPF_TAPS(0.000216943401370225), +LPF_TAPS(-0.000211978379311058), +LPF_TAPS(0.000207038906912205), +LPF_TAPS(-0.000202126630608231), +LPF_TAPS(0.000197243151939321), +LPF_TAPS(-0.000192390027639763), +LPF_TAPS(0.000187568769744742), +LPF_TAPS(-0.000182780845715392), +LPF_TAPS(0.000178027678582232), +LPF_TAPS(-0.000173310647105377), +LPF_TAPS(0.000168631085952943), +LPF_TAPS(-0.000163990285895906), +LPF_TAPS(0.000159389494019859), +LPF_TAPS(-0.000154829913953110), +LPF_TAPS(0.000150312706110820), +LPF_TAPS(-0.000145838987954894), +LPF_TAPS(0.000141409834269036), +LPF_TAPS(-0.000137026277449419), +LPF_TAPS(0.000132689307809155), +LPF_TAPS(-0.000128399873897980), +LPF_TAPS(0.000124158882835594), +LPF_TAPS(-0.000119967200658306), +LPF_TAPS(0.000115825652679693), +LPF_TAPS(-0.000111735023863637), +LPF_TAPS(0.000107696059210172), +LPF_TAPS(-0.000103709464153514), +LPF_TAPS(0.000099775904971949), +LPF_TAPS(-0.000095896009209253), +LPF_TAPS(0.000092070366107026), +LPF_TAPS(-0.000088299527048358), +LPF_TAPS(0.000084584006010995), +LPF_TAPS(-0.000080924280031426), +LPF_TAPS(0.000077320789678049), +LPF_TAPS(-0.000073773939533842), +LPF_TAPS(0.000070284098687913), +LPF_TAPS(-0.000066851601235593), +LPF_TAPS(0.000063476746786749), +LPF_TAPS(-0.000060159800981691), +LPF_TAPS(0.000056900996015075), +LPF_TAPS(-0.000053700531166021), +LPF_TAPS(0.000050558573335760), +LPF_TAPS(-0.000047475257591278), +LPF_TAPS(0.000044450687714644), +LPF_TAPS(-0.000041484936758591), +LPF_TAPS(0.000038578047606853), +LPF_TAPS(-0.000035730033539605), +LPF_TAPS(0.000032940878803412), +LPF_TAPS(-0.000030210539185376), +LPF_TAPS(0.000027538942591151), +LPF_TAPS(-0.000024925989626264), +LPF_TAPS(0.000022371554181096), +LPF_TAPS(-0.000019875484017872), +LPF_TAPS(0.000017437601360918), +LPF_TAPS(-0.000015057703488542), +LPF_TAPS(0.000012735563326905), +LPF_TAPS(-0.000010470930045337), +LPF_TAPS(0.000008263529652806), +LPF_TAPS(-0.000006113065595237), +LPF_TAPS(0.000004019219353176), +LPF_TAPS(-0.000001981651040116), +LPF_TAPS(-0.000000000000000003), +LPF_TAPS(0.000001926114595016), +LPF_TAPS(-0.000003797093147761), +LPF_TAPS(0.000005613355040533), +LPF_TAPS(-0.000007375338040335), +LPF_TAPS(0.000009083497706100), +LPF_TAPS(-0.000010738306797607), +LPF_TAPS(0.000012340254686558), +LPF_TAPS(-0.000013889846770054), +LPF_TAPS(0.000015387603886708), +LPF_TAPS(-0.000016834061735821), +LPF_TAPS(0.000018229770299364), +LPF_TAPS(-0.000019575293267954), +LPF_TAPS(0.000020871207469923), +LPF_TAPS(-0.000022118102304654), +LPF_TAPS(0.000023316579179911), +LPF_TAPS(-0.000024467250953544), +LPF_TAPS(0.000025570741379770), +LPF_TAPS(-0.000026627684560227), +LPF_TAPS(0.000027638724400135), +LPF_TAPS(-0.000028604514069339), +LPF_TAPS(0.000029525715469236), +LPF_TAPS(-0.000030402998704811), +LPF_TAPS(0.000031237041562636), +LPF_TAPS(-0.000032028528994971), +LPF_TAPS(0.000032778152609630), +LPF_TAPS(-0.000033486610166390), +LPF_TAPS(0.000034154605079718), +LPF_TAPS(-0.000034782845928194), +LPF_TAPS(0.000035372045970431), +LPF_TAPS(-0.000035922922668168), +LPF_TAPS(0.000036436197216230), +LPF_TAPS(-0.000036912594079466), +LPF_TAPS(0.000037352840537317), +LPF_TAPS(-0.000037757666235375), +LPF_TAPS(0.000038127802744662), +LPF_TAPS(-0.000038463983128416), +LPF_TAPS(0.000038766941516558), +LPF_TAPS(-0.000039037412687953), +LPF_TAPS(0.000039276131660508), +LPF_TAPS(-0.000039483833289280), +LPF_TAPS(0.000039661251872419), +LPF_TAPS(-0.000039809120765477), +LPF_TAPS(0.000039928172003567), +LPF_TAPS(-0.000040019135931921), +LPF_TAPS(0.000040082740844612), +LPF_TAPS(-0.000040119712631595), +LPF_TAPS(0.000040130774434076), +LPF_TAPS(-0.000040116646308240), +LPF_TAPS(0.000040078044897437), +LPF_TAPS(-0.000040015683112645), +LPF_TAPS(0.000039930269821541), +LPF_TAPS(-0.000039822509545943), +LPF_TAPS(0.000039693102167627), +LPF_TAPS(-0.000039542742642795), +LPF_TAPS(0.000039372120724805), +LPF_TAPS(-0.000039181920695467), +LPF_TAPS(0.000038972821104735), +LPF_TAPS(-0.000038745494518822), +LPF_TAPS(0.000038500607276709), +LPF_TAPS(-0.000038238819255021), +LPF_TAPS(0.000037960783641273), +LPF_TAPS(-0.000037667146715327), +LPF_TAPS(0.000037358547639259), +LPF_TAPS(-0.000037035618255292), +LPF_TAPS(0.000036698982892007), +LPF_TAPS(-0.000036349258178619), +LPF_TAPS(0.000035987052867338), +LPF_TAPS(-0.000035612967663724), +LPF_TAPS(0.000035227595064980), +LPF_TAPS(-0.000034831519206137), +LPF_TAPS(0.000034425315713993), +LPF_TAPS(-0.000034009551568840), +LPF_TAPS(0.000033584784973814), +LPF_TAPS(-0.000033151565231787), +LPF_TAPS(0.000032710432629812), +LPF_TAPS(-0.000032261918330903), +LPF_TAPS(0.000031806544273172), +LPF_TAPS(-0.000031344823076165), +LPF_TAPS(0.000030877257954332), +LPF_TAPS(-0.000030404342637523), +LPF_TAPS(0.000029926561298414), +LPF_TAPS(-0.000029444388486774), +LPF_TAPS(0.000028958289070426), +LPF_TAPS(-0.000028468718182870), +LPF_TAPS(0.000027976121177382), +LPF_TAPS(-0.000027480933587537), +LPF_TAPS(0.000026983581094014), +LPF_TAPS(-0.000026484479497582), +LPF_TAPS(0.000025984034698156), +LPF_TAPS(-0.000025482642679791), +LPF_TAPS(0.000024980689501528), +LPF_TAPS(-0.000024478551293927), +LPF_TAPS(0.000023976594261223), +LPF_TAPS(-0.000023475174688944), +LPF_TAPS(0.000022974638956881), +LPF_TAPS(-0.000022475323557302), +LPF_TAPS(0.000021977555118269), +LPF_TAPS(-0.000021481650431946), +LPF_TAPS(0.000020987916487774), +LPF_TAPS(-0.000020496650510385), +LPF_TAPS(0.000020008140002136), +LPF_TAPS(-0.000019522662790136), +LPF_TAPS(0.000019040487077642), +LPF_TAPS(-0.000018561871499706), +LPF_TAPS(0.000018087065182938), +LPF_TAPS(-0.000017616307809269), +LPF_TAPS(0.000017149829683597), +LPF_TAPS(-0.000016687851805172), +LPF_TAPS(0.000016230585942621), +LPF_TAPS(-0.000015778234712481), +LPF_TAPS(0.000015330991661110), +LPF_TAPS(-0.000014889041349871), +LPF_TAPS(0.000014452559443468), +LPF_TAPS(-0.000014021712801288), +LPF_TAPS(0.000013596659571678), +LPF_TAPS(-0.000013177549289003), +LPF_TAPS(0.000012764522973365), +LPF_TAPS(-0.000012357713232915), +LPF_TAPS(0.000011957244368585), +LPF_TAPS(-0.000011563232481166), +LPF_TAPS(0.000011175785580615), +LPF_TAPS(-0.000010795003697464), +LPF_TAPS(0.000010420978996245), +LPF_TAPS(-0.000010053795890810), +LPF_TAPS(0.000009693531161449), +LPF_TAPS(-0.000009340254073686), +LPF_TAPS(0.000008994026498681), +LPF_TAPS(-0.000008654903035105), +LPF_TAPS(0.000008322931132410), +LPF_TAPS(-0.000007998151215387), +LPF_TAPS(0.000007680596809926), +LPF_TAPS(-0.000007370294669877), +LPF_TAPS(0.000007067264904908), +LPF_TAPS(-0.000006771521109318), +LPF_TAPS(0.000006483070491646), +LPF_TAPS(-0.000006201914005048), +LPF_TAPS(0.000005928046478342), +LPF_TAPS(-0.000005661456747620), +LPF_TAPS(0.000005402127788367), +LPF_TAPS(-0.000005150036848010), +LPF_TAPS(0.000004905155578810), +LPF_TAPS(-0.000004667450171018), +LPF_TAPS(0.000004436881486255), +LPF_TAPS(-0.000004213405190998), +LPF_TAPS(0.000003996971890143), +LPF_TAPS(-0.000003787527260573), +LPF_TAPS(0.000003585012184637), +LPF_TAPS(-0.000003389362883522), +LPF_TAPS(0.000003200511050424), +LPF_TAPS(-0.000003018383983486), +LPF_TAPS(0.000002842904718416), +LPF_TAPS(-0.000002673992160767), +LPF_TAPS(0.000002511561217805), +LPF_TAPS(-0.000002355522929902), +LPF_TAPS(0.000002205784601466), +LPF_TAPS(-0.000002062249931271), +LPF_TAPS(0.000001924819142227), +LPF_TAPS(-0.000001793389110503), +LPF_TAPS(0.000001667853493968), +LPF_TAPS(-0.000001548102859921), +LPF_TAPS(0.000001434024812076), +LPF_TAPS(-0.000001325504116749), +LPF_TAPS(0.000001222422828231), +LPF_TAPS(-0.000001124660413318), +LPF_TAPS(0.000001032093874948), +LPF_TAPS(-0.000000944597874939), +LPF_TAPS(0.000000862044855799), +LPF_TAPS(-0.000000784305161561), +LPF_TAPS(0.000000711247157657), +LPF_TAPS(-0.000000642737349775), +LPF_TAPS(0.000000578640501706), +LPF_TAPS(-0.000000518819752139), +LPF_TAPS(0.000000463136730412), +LPF_TAPS(-0.000000411451671180), +LPF_TAPS(0.000000363623527997), +LPF_TAPS(-0.000000319510085809), +LPF_TAPS(0.000000278968072322), +LPF_TAPS(-0.000000241853268257), +LPF_TAPS(0.000000208020616472), +LPF_TAPS(-0.000000177324329941), +LPF_TAPS(0.000000149617998591), +LPF_TAPS(-0.000000124754694991), +LPF_TAPS(0.000000102587078868), +LPF_TAPS(-0.000000082967500483), +LPF_TAPS(0.000000065748102820), +LPF_TAPS(-0.000000050780922627), +LPF_TAPS(0.000000037917990275), +LPF_TAPS(-0.000000027011428453), +LPF_TAPS(0.000000017913549694), +LPF_TAPS(-0.000000010476952726), +LPF_TAPS(0.000000004554617657), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000003332876482), +LPF_TAPS(0.000000005589328076), +LPF_TAPS(-0.000000006913920594), +LPF_TAPS(0.000000007450379994), +LPF_TAPS(-0.000000007341504155), +LPF_TAPS(0.000000006729075805), +LPF_TAPS(-0.000000005753776591), +LPF_TAPS(0.000000004555102288), +LPF_TAPS(-0.000000003271279145), +LPF_TAPS(0.000000002039181362), +LPF_TAPS(-0.000000000994249696), +LPF_TAPS(0.000000000270411186), +LPF_TAPS(0.000000000000000000), +}; diff --git a/core/sound/blip_lpf_768K_48K.h b/core/sound/blip_lpf_768K_48K.h new file mode 100644 index 000000000..d9f39a406 --- /dev/null +++ b/core/sound/blip_lpf_768K_48K.h @@ -0,0 +1,1181 @@ +static buf_t const blip_lpf_768K_48K[blip_lpf_768K_taps] = { +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000001359448860), +LPF_TAPS(0.000000004667803778), +LPF_TAPS(0.000000007291655555), +LPF_TAPS(0.000000005417116054), +LPF_TAPS(-0.000000004555102366), +LPF_TAPS(-0.000000024455755672), +LPF_TAPS(-0.000000053068738903), +LPF_TAPS(-0.000000085529617644), +LPF_TAPS(-0.000000113670834618), +LPF_TAPS(-0.000000127377349425), +LPF_TAPS(-0.000000116776553081), +LPF_TAPS(-0.000000074862812243), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000102305467491), +LPF_TAPS(0.000000218892576977), +LPF_TAPS(0.000000330027000994), +LPF_TAPS(0.000000412114767172), +LPF_TAPS(0.000000441750238329), +LPF_TAPS(0.000000400482860087), +LPF_TAPS(0.000000279454635221), +LPF_TAPS(0.000000082967501909), +LPF_TAPS(-0.000000169880370116), +LPF_TAPS(-0.000000446094830917), +LPF_TAPS(-0.000000702426625941), +LPF_TAPS(-0.000000891469622152), +LPF_TAPS(-0.000000969441292523), +LPF_TAPS(-0.000000904464094134), +LPF_TAPS(-0.000000683928580435), +LPF_TAPS(-0.000000319510091302), +LPF_TAPS(0.000000151344328816), +LPF_TAPS(0.000000668161269568), +LPF_TAPS(0.000001154465104752), +LPF_TAPS(0.000001528393730563), +LPF_TAPS(0.000001715526626870), +LPF_TAPS(0.000001662018825424), +LPF_TAPS(0.000001345877978929), +LPF_TAPS(0.000000784305175046), +LPF_TAPS(0.000000035460970252), +LPF_TAPS(-0.000000806224823920), +LPF_TAPS(-0.000001621105458760), +LPF_TAPS(-0.000002280585752777), +LPF_TAPS(-0.000002666499897103), +LPF_TAPS(-0.000002690787350045), +LPF_TAPS(-0.000002312345201813), +LPF_TAPS(-0.000001548102886537), +LPF_TAPS(-0.000000476023404783), +LPF_TAPS(0.000000771181400041), +LPF_TAPS(0.000002021465017603), +LPF_TAPS(0.000003086375184260), +LPF_TAPS(0.000003788560986201), +LPF_TAPS(0.000003989957117356), +LPF_TAPS(0.000003616317717796), +LPF_TAPS(0.000002673992206742), +LPF_TAPS(0.000001255716262414), +LPF_TAPS(-0.000000466356405324), +LPF_TAPS(-0.000002260316904552), +LPF_TAPS(-0.000003864827717528), +LPF_TAPS(-0.000005026285450778), +LPF_TAPS(-0.000005537656619195), +LPF_TAPS(-0.000005273188024575), +LPF_TAPS(-0.000004213405263437), +LPF_TAPS(-0.000002455897603684), +LPF_TAPS(-0.000000209237167646), +LPF_TAPS(0.000002230237752093), +LPF_TAPS(0.000004516461176901), +LPF_TAPS(0.000006301781191850), +LPF_TAPS(0.000007288640610621), +LPF_TAPS(0.000007277262295166), +LPF_TAPS(0.000006201914111676), +LPF_TAPS(0.000004149568146742), +LPF_TAPS(0.000001357021165956), +LPF_TAPS(-0.000001814470334864), +LPF_TAPS(-0.000004924673538250), +LPF_TAPS(-0.000007514453903456), +LPF_TAPS(-0.000009172392215667), +LPF_TAPS(-0.000009598430104571), +LPF_TAPS(-0.000008654903183906), +LPF_TAPS(-0.000006396629158261), +LPF_TAPS(-0.000003074347785313), +LPF_TAPS(0.000000890558151977), +LPF_TAPS(0.000004957983543046), +LPF_TAPS(0.000008541512942748), +LPF_TAPS(0.000011091787638396), +LPF_TAPS(0.000012179135462912), +LPF_TAPS(0.000011563232679969), +LPF_TAPS(0.000009238814004167), +LPF_TAPS(0.000005449388731714), +LPF_TAPS(0.000000665210997690), +LPF_TAPS(-0.000004473175304439), +LPF_TAPS(-0.000009239352535250), +LPF_TAPS(-0.000012922484749463), +LPF_TAPS(-0.000014931815471149), +LPF_TAPS(-0.000014889041605853), +LPF_TAPS(-0.000012694403544655), +LPF_TAPS(-0.000008555473445022), +LPF_TAPS(-0.000002972543870313), +LPF_TAPS(0.000003319420166117), +LPF_TAPS(0.000009445938101717), +LPF_TAPS(0.000014513205712786), +LPF_TAPS(0.000017736994996257), +LPF_TAPS(0.000018561871818833), +LPF_TAPS(0.000016752874677521), +LPF_TAPS(0.000012444972319258), +LPF_TAPS(0.000006141091038300), +LPF_TAPS(-0.000001343421473661), +LPF_TAPS(-0.000008984312747285), +LPF_TAPS(-0.000015687084203430), +LPF_TAPS(-0.000020442241587054), +LPF_TAPS(-0.000022475323943711), +LPF_TAPS(-0.000021369670893989), +LPF_TAPS(-0.000017142865405167), +LPF_TAPS(-0.000010263678225663), +LPF_TAPS(-0.000001604409044088), +LPF_TAPS(0.000007667313823874), +LPF_TAPS(0.000016244238103206), +LPF_TAPS(0.000022862192292638), +LPF_TAPS(0.000026484479952918), +LPF_TAPS(0.000026461321281526), +LPF_TAPS(0.000022640183553416), +LPF_TAPS(0.000015408940720877), +LPF_TAPS(0.000005662780227376), +LPF_TAPS(-0.000005303553733386), +LPF_TAPS(-0.000015965707722944), +LPF_TAPS(-0.000024779861226435), +LPF_TAPS(-0.000030404343160250), +LPF_TAPS(-0.000031901167390632), +LPF_TAPS(-0.000028887554888383), +LPF_TAPS(-0.000021613534847926), +LPF_TAPS(-0.000010951445764810), +LPF_TAPS(0.000001704673145246), +LPF_TAPS(0.000014618866986779), +LPF_TAPS(0.000025949422139282), +LPF_TAPS(0.000034009552153551), +LPF_TAPS(0.000037515983141392), +LPF_TAPS(0.000035789132174905), +LPF_TAPS(0.000028874154654551), +LPF_TAPS(0.000017562372412707), +LPF_TAPS(0.000003306180458168), +LPF_TAPS(-0.000011964370615358), +LPF_TAPS(-0.000026100632912291), +LPF_TAPS(-0.000037035618892028), +LPF_TAPS(-0.000043083788946342), +LPF_TAPS(-0.000043197213207640), +LPF_TAPS(-0.000037139634571452), +LPF_TAPS(-0.000025550362604739), +LPF_TAPS(-0.000009884758915617), +LPF_TAPS(0.000007764644796739), +LPF_TAPS(0.000024945028324660), +LPF_TAPS(0.000039181921369101), +LPF_TAPS(0.000048333165179803), +LPF_TAPS(0.000050907893980236), +LPF_TAPS(0.000046303466797793), +LPF_TAPS(0.000034923404169512), +LPF_TAPS(0.000018155182598477), +LPF_TAPS(-0.000001793863434875), +LPF_TAPS(-0.000022183953916465), +LPF_TAPS(-0.000040116646997951), +LPF_TAPS(-0.000052944360125334), +LPF_TAPS(-0.000058658110405480), +LPF_TAPS(-0.000056197102480673), +LPF_TAPS(-0.000045633079459602), +LPF_TAPS(-0.000028198722243287), +LPF_TAPS(-0.000006150721233903), +LPF_TAPS(0.000017518448170727), +LPF_TAPS(0.000039483833968097), +LPF_TAPS(0.000056552462191051), +LPF_TAPS(0.000066124426393850), +LPF_TAPS(0.000066584435346170), +LPF_TAPS(0.000057565419794740), +LPF_TAPS(0.000040042213710101), +LPF_TAPS(0.000016236303510003), +LPF_TAPS(-0.000010660904207243), +LPF_TAPS(-0.000036912594714084), +LPF_TAPS(-0.000058752864731266), +LPF_TAPS(-0.000072923912246472), +LPF_TAPS(-0.000077157882495439), +LPF_TAPS(-0.000070532635385286), +LPF_TAPS(-0.000053646492901935), +LPF_TAPS(-0.000028581195343862), +LPF_TAPS(0.000001348358019648), +LPF_TAPS(0.000032028529545616), +LPF_TAPS(0.000059109194199816), +LPF_TAPS(0.000078617426254042), +LPF_TAPS(0.000087536477165891), +LPF_TAPS(0.000084266182598215), +LPF_TAPS(0.000068895297575180), +LPF_TAPS(0.000043241014115690), +LPF_TAPS(0.000010642839072521), +LPF_TAPS(-0.000024467251374184), +LPF_TAPS(-0.000057163799306339), +LPF_TAPS(-0.000082715563486318), +LPF_TAPS(-0.000097266370464980), +LPF_TAPS(-0.000098411646607848), +LPF_TAPS(-0.000085585131224879), +LPF_TAPS(-0.000060194832140154), +LPF_TAPS(-0.000025481297179959), +LPF_TAPS(0.000013889847008835), +LPF_TAPS(0.000052450811872167), +LPF_TAPS(0.000084687469158516), +LPF_TAPS(0.000105824102159998), +LPF_TAPS(0.000112525915634239), +LPF_TAPS(0.000103416618210071), +LPF_TAPS(0.000079331798651948), +LPF_TAPS(0.000043264236188097), +LPF_TAPS(-0.000000000000000002), +LPF_TAPS(-0.000044511691498128), +LPF_TAPS(-0.000083972630656939), +LPF_TAPS(-0.000112622944066689), +LPF_TAPS(-0.000126077101208288), +LPF_TAPS(-0.000121987895707572), +LPF_TAPS(-0.000100438797921751), +LPF_TAPS(-0.000064001010754390), +LPF_TAPS(-0.000017437601660726), +LPF_TAPS(0.000032913059017108), +LPF_TAPS(0.000079995664135062), +LPF_TAPS(0.000117022543786603), +LPF_TAPS(0.000138447616040141), +LPF_TAPS(0.000140790584377543), +LPF_TAPS(0.000123189743606017), +LPF_TAPS(0.000087597089208893), +LPF_TAPS(0.000038578048270125), +LPF_TAPS(-0.000017266511725195), +LPF_TAPS(-0.000072184001225267), +LPF_TAPS(-0.000118342002758861), +LPF_TAPS(-0.000148940756773300), +LPF_TAPS(-0.000159208853892438), +LPF_TAPS(-0.000147137126223414), +LPF_TAPS(-0.000113839121163930), +LPF_TAPS(-0.000063476747878071), +LPF_TAPS(-0.000002749999175545), +LPF_TAPS(0.000059988262299059), +LPF_TAPS(0.000115876412984811), +LPF_TAPS(0.000156791053766152), +LPF_TAPS(0.000176522050630483), +LPF_TAPS(0.000171706425136369), +LPF_TAPS(0.000142381767716384), +LPF_TAPS(0.000092070367689991), +LPF_TAPS(0.000027369756980472), +LPF_TAPS(-0.000042904978978613), +LPF_TAPS(-0.000108916754401175), +LPF_TAPS(-0.000161178545601417), +LPF_TAPS(-0.000191911282688537), +LPF_TAPS(-0.000196193966704777), +LPF_TAPS(-0.000172736985353814), +LPF_TAPS(-0.000124158884970213), +LPF_TAPS(-0.000056714461339902), +LPF_TAPS(0.000020501204933958), +LPF_TAPS(0.000096772923575936), +LPF_TAPS(0.000161247014791811), +LPF_TAPS(0.000204470262738553), +LPF_TAPS(0.000219768755358778), +LPF_TAPS(0.000204266447336485), +LPF_TAPS(0.000159389496760190), +LPF_TAPS(0.000090771716893217), +LPF_TAPS(0.000007559564539307), +LPF_TAPS(-0.000078799528741505), +LPF_TAPS(-0.000156126086562068), +LPF_TAPS(-0.000213220593974129), +LPF_TAPS(-0.000241478724185279), +LPF_TAPS(-0.000236177752523331), +LPF_TAPS(-0.000197243155330462), +LPF_TAPS(-0.000129373609165754), +LPF_TAPS(-0.000041490851807240), +LPF_TAPS(0.000054423951283517), +LPF_TAPS(0.000144956948925325), +LPF_TAPS(0.000217131551326968), +LPF_TAPS(0.000260261747274281), +LPF_TAPS(0.000267525010396375), +LPF_TAPS(0.000237024486928444), +LPF_TAPS(0.000172177192501632), +LPF_TAPS(0.000081356815168347), +LPF_TAPS(-0.000023176045180278), +LPF_TAPS(-0.000126921304547573), +LPF_TAPS(-0.000215144263109794), +LPF_TAPS(-0.000274961629651598), +LPF_TAPS(-0.000297214302530807), +LPF_TAPS(-0.000277855813135357), +LPF_TAPS(-0.000218647732480789), +LPF_TAPS(-0.000127046877978245), +LPF_TAPS(-0.000015281270758960), +LPF_TAPS(0.000101273018695546), +LPF_TAPS(0.000206200041981676), +LPF_TAPS(0.000284349145337142), +LPF_TAPS(0.000324014406196469), +LPF_TAPS(0.000318675926094879), +LPF_TAPS(0.000268045533373828), +LPF_TAPS(0.000178252266903005), +LPF_TAPS(0.000061121371994166), +LPF_TAPS(-0.000067371788877151), +LPF_TAPS(-0.000189272454112044), +LPF_TAPS(-0.000287148034138770), +LPF_TAPS(-0.000346573027549407), +LPF_TAPS(-0.000358244171233166), +LPF_TAPS(-0.000319417137704527), +LPF_TAPS(-0.000234445374637796), +LPF_TAPS(-0.000114324158704671), +LPF_TAPS(0.000024718036788845), +LPF_TAPS(0.000163402557720058), +LPF_TAPS(0.000282065698371838), +LPF_TAPS(0.000363438633495539), +LPF_TAPS(0.000395150265241936), +LPF_TAPS(0.000371591608966844), +LPF_TAPS(0.000294862846963479), +LPF_TAPS(0.000174648125360398), +LPF_TAPS(0.000027011881957749), +LPF_TAPS(-0.000127736593278010), +LPF_TAPS(-0.000267828167726443), +LPF_TAPS(-0.000373087797360296), +LPF_TAPS(-0.000427830125620042), +LPF_TAPS(-0.000423182500185979), +LPF_TAPS(-0.000358493243807931), +LPF_TAPS(-0.000241605252470305), +LPF_TAPS(-0.000087931134219321), +LPF_TAPS(0.000081565274292044), +LPF_TAPS(0.000243218730553891), +LPF_TAPS(0.000373957789509607), +LPF_TAPS(0.000454587814695286), +LPF_TAPS(0.000472595971723450), +LPF_TAPS(0.000424070037890936), +LPF_TAPS(0.000314439682826313), +LPF_TAPS(0.000157909563791660), +LPF_TAPS(-0.000024363716411711), +LPF_TAPS(-0.000207119469909664), +LPF_TAPS(-0.000364483956377314), +LPF_TAPS(-0.000473623510576415), +LPF_TAPS(-0.000518045354092092), +LPF_TAPS(-0.000490070592560787), +LPF_TAPS(-0.000392111085189919), +LPF_TAPS(-0.000236543587877976), +LPF_TAPS(-0.000044169039830351), +LPF_TAPS(0.000158554800002030), +LPF_TAPS(0.000343141246928103), +LPF_TAPS(0.000483067215653052), +LPF_TAPS(0.000557572259271586), +LPF_TAPS(0.000554721603718573), +LPF_TAPS(0.000473283508764436), +LPF_TAPS(0.000323129851106015), +LPF_TAPS(0.000124072004969681), +LPF_TAPS(-0.000096735980511317), +LPF_TAPS(-0.000308489071818717), +LPF_TAPS(-0.000481017706568504), +LPF_TAPS(-0.000589074131789658), +LPF_TAPS(-0.000616011301487119), +LPF_TAPS(-0.000556320391373693), +LPF_TAPS(-0.000416643580674457), +LPF_TAPS(-0.000215086814767172), +LPF_TAPS(0.000021105499668541), +LPF_TAPS(0.000259218525026417), +LPF_TAPS(0.000465586025087031), +LPF_TAPS(0.000610337904146259), +LPF_TAPS(0.000671708488657673), +LPF_TAPS(0.000639286203371008), +LPF_TAPS(0.000515722468116167), +LPF_TAPS(0.000316625963837260), +LPF_TAPS(0.000068619831178850), +LPF_TAPS(-0.000194200868121255), +LPF_TAPS(-0.000434942614319249), +LPF_TAPS(-0.000619079186033522), +LPF_TAPS(-0.000719388248767022), +LPF_TAPS(-0.000719954989008131), +LPF_TAPS(-0.000618656737124804), +LPF_TAPS(-0.000427745671860825), +LPF_TAPS(-0.000172408232095687), +LPF_TAPS(0.000112536081132703), +LPF_TAPS(0.000387367026753429), +LPF_TAPS(0.000612986179481084), +LPF_TAPS(0.000756463891081504), +LPF_TAPS(0.000795825808780393), +LPF_TAPS(0.000723385841491201), +LPF_TAPS(0.000547124213374555), +LPF_TAPS(0.000289875871129091), +LPF_TAPS(-0.000013600228281345), +LPF_TAPS(-0.000321298976625744), +LPF_TAPS(-0.000589767278575103), +LPF_TAPS(-0.000780224416792033), +LPF_TAPS(-0.000864144791486477), +LPF_TAPS(-0.000827501970962114), +LPF_TAPS(-0.000673046341994755), +LPF_TAPS(-0.000420254351351959), +LPF_TAPS(-0.000102909621436732), +LPF_TAPS(0.000235389385991059), +LPF_TAPS(0.000547201088099536), +LPF_TAPS(0.000787876493512615), +LPF_TAPS(0.000921933173856351), +LPF_TAPS(0.000928260223461724), +LPF_TAPS(0.000803394177128660), +LPF_TAPS(0.000562363609226324), +LPF_TAPS(0.000236934133089329), +LPF_TAPS(-0.000128549987283509), +LPF_TAPS(-0.000483187384332318), +LPF_TAPS(-0.000776589615094117), +LPF_TAPS(-0.000966020337024241), +LPF_TAPS(-0.001022594925275672), +LPF_TAPS(-0.000935644589411755), +LPF_TAPS(-0.000714590827271672), +LPF_TAPS(-0.000388015211898054), +LPF_TAPS(0.000000000000000007), +LPF_TAPS(0.000395797345139045), +LPF_TAPS(0.000743542799064008), +LPF_TAPS(0.000993080437533362), +LPF_TAPS(0.001107141138307767), +LPF_TAPS(0.001066872710566303), +LPF_TAPS(0.000874875646388696), +LPF_TAPS(0.000555265209860269), +LPF_TAPS(0.000150691601034830), +LPF_TAPS(-0.000283321194004648), +LPF_TAPS(-0.000685970827866444), +LPF_TAPS(-0.000999670764342302), +LPF_TAPS(-0.001178259870510930), +LPF_TAPS(-0.001193760688319778), +LPF_TAPS(-0.001040701551881250), +LPF_TAPS(-0.000737342514358144), +LPF_TAPS(-0.000323569661431093), +LPF_TAPS(0.000144311227422484), +LPF_TAPS(0.000601207657703439), +LPF_TAPS(0.000982269410612325), +LPF_TAPS(0.001232064876063025), +LPF_TAPS(0.001312610181298188), +LPF_TAPS(0.001209092780511007), +LPF_TAPS(0.000932433858217402), +LPF_TAPS(0.000518263608026988), +LPF_TAPS(0.000022381986458309), +LPF_TAPS(-0.000486724172822189), +LPF_TAPS(-0.000937309191562415), +LPF_TAPS(-0.001264448151532591), +LPF_TAPS(-0.001419356298934519), +LPF_TAPS(-0.001376615418620143), +LPF_TAPS(-0.001138243238730974), +LPF_TAPS(-0.000733966594517146), +LPF_TAPS(-0.000217582662460545), +LPF_TAPS(0.000340156906325913), +LPF_TAPS(0.000861203902397716), +LPF_TAPS(0.001271100228905015), +LPF_TAPS(0.001509579665070793), +LPF_TAPS(0.001539380475420018), +LPF_TAPS(0.001351986739160018), +LPF_TAPS(0.000969424046659185), +LPF_TAPS(0.000441774816022595), +LPF_TAPS(-0.000159323601669108), +LPF_TAPS(-0.000750361884546773), +LPF_TAPS(-0.001247520011945825), +LPF_TAPS(-0.001578511900391426), +LPF_TAPS(-0.001693045524085645), +LPF_TAPS(-0.001570391756465221), +LPF_TAPS(-0.001222932397231006), +LPF_TAPS(-0.000695102381242500), +LPF_TAPS(-0.000057779580465230), +LPF_TAPS(0.000601180272375858), +LPF_TAPS(0.001189006991122532), +LPF_TAPS(0.001621027875164315), +LPF_TAPS(0.001832809842707534), +LPF_TAPS(0.001789698061951320), +LPF_TAPS(0.001492348542680722), +LPF_TAPS(0.000977388252817532), +LPF_TAPS(0.000313006019718721), +LPF_TAPS(-0.000410010919136253), +LPF_TAPS(-0.001090625851674463), +LPF_TAPS(-0.001631615234243192), +LPF_TAPS(-0.001953395577104861), +LPF_TAPS(-0.002005656598462505), +LPF_TAPS(-0.001775110268723410), +LPF_TAPS(-0.001288177216072311), +LPF_TAPS(-0.000608121107446455), +LPF_TAPS(0.000173085322578482), +LPF_TAPS(0.000947129150702814), +LPF_TAPS(0.001604307340888672), +LPF_TAPS(0.002049003798581933), +LPF_TAPS(0.002213519668761413), +LPF_TAPS(0.002068267589315719), +LPF_TAPS(0.001626809663921161), +LPF_TAPS(0.000944912710343187), +LPF_TAPS(0.000113620040394409), +LPF_TAPS(-0.000752816806223807), +LPF_TAPS(-0.001532558858449233), +LPF_TAPS(-0.002113228567072949), +LPF_TAPS(-0.002408012689596018), +LPF_TAPS(-0.002368524631666443), +LPF_TAPS(-0.001992536333210033), +LPF_TAPS(-0.001325370018242146), +LPF_TAPS(-0.000454606383626016), +LPF_TAPS(0.000501299656080775), +LPF_TAPS(0.001409031739149504), +LPF_TAPS(0.002138902624492951), +LPF_TAPS(0.002583272037926706), +LPF_TAPS(0.002672291388964332), +LPF_TAPS(0.002384690142120560), +LPF_TAPS(0.001751963089894417), +LPF_TAPS(0.000855208577551981), +LPF_TAPS(-0.000185114622720898), +LPF_TAPS(-0.001225239726990133), +LPF_TAPS(-0.002117832071754483), +LPF_TAPS(-0.002732723904046048), +LPF_TAPS(-0.002975744362298746), +LPF_TAPS(-0.002802941719239318), +LPF_TAPS(-0.002228076641992786), +LPF_TAPS(-0.001322159750808357), +LPF_TAPS(-0.000204896150555957), +LPF_TAPS(0.000970964342673048), +LPF_TAPS(0.002040348260098252), +LPF_TAPS(0.002848861909604556), +LPF_TAPS(0.003274894833677578), +LPF_TAPS(0.003247684687255261), +LPF_TAPS(0.002758690863649444), +LPF_TAPS(0.001864495530567434), +LPF_TAPS(0.000680595212459752), +LPF_TAPS(-0.000633289731702014), +LPF_TAPS(-0.001894550570044378), +LPF_TAPS(-0.002922849064605867), +LPF_TAPS(-0.003565663262513257), +LPF_TAPS(-0.003720634286961690), +LPF_TAPS(-0.003351477778623521), +LPF_TAPS(-0.002495036862551363), +LPF_TAPS(-0.001258229252703277), +LPF_TAPS(0.000194975183151831), +LPF_TAPS(0.001665006205857837), +LPF_TAPS(0.002943805914118389), +LPF_TAPS(0.003843958087058865), +LPF_TAPS(0.004225798837087251), +LPF_TAPS(0.004018635661116777), +LPF_TAPS(0.003232911217167509), +LPF_TAPS(0.001961321217018796), +LPF_TAPS(0.000368382711489133), +LPF_TAPS(-0.001330448303111322), +LPF_TAPS(-0.002897512586064453), +LPF_TAPS(-0.004105757047530809), +LPF_TAPS(-0.004771146551610363), +LPF_TAPS(-0.004780117208221306), +LPF_TAPS(-0.004108053920816586), +LPF_TAPS(-0.002825896333281318), +LPF_TAPS(-0.001093538945580079), +LPF_TAPS(0.000859509678153194), +LPF_TAPS(0.002763948990592597), +LPF_TAPS(0.004347189035161921), +LPF_TAPS(0.005371667058210150), +LPF_TAPS(0.005669685080505564), +LPF_TAPS(0.005169768442631645), +LPF_TAPS(0.003910542281136750), +LPF_TAPS(0.002039710357167114), +LPF_TAPS(-0.000202299725470556), +LPF_TAPS(-0.002512348101206461), +LPF_TAPS(-0.004564614415679022), +LPF_TAPS(-0.006055481428685038), +LPF_TAPS(-0.006747224427039125), +LPF_TAPS(-0.006504381455886494), +LPF_TAPS(-0.005317439779102889), +LPF_TAPS(-0.003310001477805524), +LPF_TAPS(-0.000727706394243490), +LPF_TAPS(0.002090371981529391), +LPF_TAPS(0.004754701779382235), +LPF_TAPS(0.006877371468460783), +LPF_TAPS(0.008126520471630896), +LPF_TAPS(0.008275740284339120), +LPF_TAPS(0.007241408673530529), +LPF_TAPS(0.005102230981241567), +LPF_TAPS(0.002097405428776219), +LPF_TAPS(-0.001397448693528728), +LPF_TAPS(-0.004914499133895396), +LPF_TAPS(-0.007953126593456580), +LPF_TAPS(-0.010047356605476896), +LPF_TAPS(-0.010832642208056086), +LPF_TAPS(-0.010102975549189539), +LPF_TAPS(-0.007850110868803264), +LPF_TAPS(-0.004278601732532487), +LPF_TAPS(0.000206810215022680), +LPF_TAPS(0.005041497678566803), +LPF_TAPS(0.009565394720809384), +LPF_TAPS(0.013104736936610281), +LPF_TAPS(0.015061657215475832), +LPF_TAPS(0.015000690417068760), +LPF_TAPS(0.012721042817706861), +LPF_TAPS(0.008304673409568883), +LPF_TAPS(0.002132719023066271), +LPF_TAPS(-0.005133686478296106), +LPF_TAPS(-0.012607994653065960), +LPF_TAPS(-0.019263721656912779), +LPF_TAPS(-0.024042394058406389), +LPF_TAPS(-0.025972472722104633), +LPF_TAPS(-0.024285972973015362), +LPF_TAPS(-0.018519226073113456), +LPF_TAPS(-0.008585550204756025), +LPF_TAPS(0.005189596584253116), +LPF_TAPS(0.022076420229632895), +LPF_TAPS(0.040992261870568814), +LPF_TAPS(0.060592521675711608), +LPF_TAPS(0.079392273199095378), +LPF_TAPS(0.095906176085457207), +LPF_TAPS(0.108792019799307069), +LPF_TAPS(0.116982593447661723), +LPF_TAPS(0.119791668725544434), +LPF_TAPS(0.116982593447661723), +LPF_TAPS(0.108792019799307069), +LPF_TAPS(0.095906176085457207), +LPF_TAPS(0.079392273199095378), +LPF_TAPS(0.060592521675711608), +LPF_TAPS(0.040992261870568814), +LPF_TAPS(0.022076420229632895), +LPF_TAPS(0.005189596584253116), +LPF_TAPS(-0.008585550204756025), +LPF_TAPS(-0.018519226073113456), +LPF_TAPS(-0.024285972973015362), +LPF_TAPS(-0.025972472722104633), +LPF_TAPS(-0.024042394058406389), +LPF_TAPS(-0.019263721656912779), +LPF_TAPS(-0.012607994653065960), +LPF_TAPS(-0.005133686478296106), +LPF_TAPS(0.002132719023066271), +LPF_TAPS(0.008304673409568883), +LPF_TAPS(0.012721042817706861), +LPF_TAPS(0.015000690417068762), +LPF_TAPS(0.015061657215475832), +LPF_TAPS(0.013104736936610281), +LPF_TAPS(0.009565394720809384), +LPF_TAPS(0.005041497678566803), +LPF_TAPS(0.000206810215022680), +LPF_TAPS(-0.004278601732532487), +LPF_TAPS(-0.007850110868803264), +LPF_TAPS(-0.010102975549189539), +LPF_TAPS(-0.010832642208056086), +LPF_TAPS(-0.010047356605476898), +LPF_TAPS(-0.007953126593456580), +LPF_TAPS(-0.004914499133895396), +LPF_TAPS(-0.001397448693528728), +LPF_TAPS(0.002097405428776219), +LPF_TAPS(0.005102230981241567), +LPF_TAPS(0.007241408673530529), +LPF_TAPS(0.008275740284339120), +LPF_TAPS(0.008126520471630896), +LPF_TAPS(0.006877371468460784), +LPF_TAPS(0.004754701779382235), +LPF_TAPS(0.002090371981529391), +LPF_TAPS(-0.000727706394243490), +LPF_TAPS(-0.003310001477805524), +LPF_TAPS(-0.005317439779102889), +LPF_TAPS(-0.006504381455886495), +LPF_TAPS(-0.006747224427039125), +LPF_TAPS(-0.006055481428685038), +LPF_TAPS(-0.004564614415679024), +LPF_TAPS(-0.002512348101206461), +LPF_TAPS(-0.000202299725470556), +LPF_TAPS(0.002039710357167115), +LPF_TAPS(0.003910542281136750), +LPF_TAPS(0.005169768442631646), +LPF_TAPS(0.005669685080505564), +LPF_TAPS(0.005371667058210150), +LPF_TAPS(0.004347189035161921), +LPF_TAPS(0.002763948990592597), +LPF_TAPS(0.000859509678153194), +LPF_TAPS(-0.001093538945580079), +LPF_TAPS(-0.002825896333281318), +LPF_TAPS(-0.004108053920816587), +LPF_TAPS(-0.004780117208221306), +LPF_TAPS(-0.004771146551610363), +LPF_TAPS(-0.004105757047530809), +LPF_TAPS(-0.002897512586064453), +LPF_TAPS(-0.001330448303111323), +LPF_TAPS(0.000368382711489133), +LPF_TAPS(0.001961321217018796), +LPF_TAPS(0.003232911217167510), +LPF_TAPS(0.004018635661116777), +LPF_TAPS(0.004225798837087253), +LPF_TAPS(0.003843958087058864), +LPF_TAPS(0.002943805914118389), +LPF_TAPS(0.001665006205857837), +LPF_TAPS(0.000194975183151831), +LPF_TAPS(-0.001258229252703277), +LPF_TAPS(-0.002495036862551363), +LPF_TAPS(-0.003351477778623522), +LPF_TAPS(-0.003720634286961690), +LPF_TAPS(-0.003565663262513257), +LPF_TAPS(-0.002922849064605867), +LPF_TAPS(-0.001894550570044379), +LPF_TAPS(-0.000633289731702014), +LPF_TAPS(0.000680595212459752), +LPF_TAPS(0.001864495530567434), +LPF_TAPS(0.002758690863649444), +LPF_TAPS(0.003247684687255260), +LPF_TAPS(0.003274894833677578), +LPF_TAPS(0.002848861909604557), +LPF_TAPS(0.002040348260098252), +LPF_TAPS(0.000970964342673048), +LPF_TAPS(-0.000204896150555957), +LPF_TAPS(-0.001322159750808358), +LPF_TAPS(-0.002228076641992786), +LPF_TAPS(-0.002802941719239318), +LPF_TAPS(-0.002975744362298747), +LPF_TAPS(-0.002732723904046048), +LPF_TAPS(-0.002117832071754483), +LPF_TAPS(-0.001225239726990133), +LPF_TAPS(-0.000185114622720898), +LPF_TAPS(0.000855208577551981), +LPF_TAPS(0.001751963089894417), +LPF_TAPS(0.002384690142120560), +LPF_TAPS(0.002672291388964333), +LPF_TAPS(0.002583272037926706), +LPF_TAPS(0.002138902624492951), +LPF_TAPS(0.001409031739149504), +LPF_TAPS(0.000501299656080775), +LPF_TAPS(-0.000454606383626017), +LPF_TAPS(-0.001325370018242146), +LPF_TAPS(-0.001992536333210033), +LPF_TAPS(-0.002368524631666444), +LPF_TAPS(-0.002408012689596018), +LPF_TAPS(-0.002113228567072950), +LPF_TAPS(-0.001532558858449234), +LPF_TAPS(-0.000752816806223807), +LPF_TAPS(0.000113620040394409), +LPF_TAPS(0.000944912710343188), +LPF_TAPS(0.001626809663921161), +LPF_TAPS(0.002068267589315719), +LPF_TAPS(0.002213519668761413), +LPF_TAPS(0.002049003798581933), +LPF_TAPS(0.001604307340888671), +LPF_TAPS(0.000947129150702814), +LPF_TAPS(0.000173085322578483), +LPF_TAPS(-0.000608121107446455), +LPF_TAPS(-0.001288177216072311), +LPF_TAPS(-0.001775110268723411), +LPF_TAPS(-0.002005656598462505), +LPF_TAPS(-0.001953395577104861), +LPF_TAPS(-0.001631615234243192), +LPF_TAPS(-0.001090625851674463), +LPF_TAPS(-0.000410010919136254), +LPF_TAPS(0.000313006019718720), +LPF_TAPS(0.000977388252817533), +LPF_TAPS(0.001492348542680722), +LPF_TAPS(0.001789698061951319), +LPF_TAPS(0.001832809842707535), +LPF_TAPS(0.001621027875164315), +LPF_TAPS(0.001189006991122532), +LPF_TAPS(0.000601180272375858), +LPF_TAPS(-0.000057779580465230), +LPF_TAPS(-0.000695102381242500), +LPF_TAPS(-0.001222932397231007), +LPF_TAPS(-0.001570391756465220), +LPF_TAPS(-0.001693045524085646), +LPF_TAPS(-0.001578511900391427), +LPF_TAPS(-0.001247520011945825), +LPF_TAPS(-0.000750361884546773), +LPF_TAPS(-0.000159323601669108), +LPF_TAPS(0.000441774816022596), +LPF_TAPS(0.000969424046659185), +LPF_TAPS(0.001351986739160019), +LPF_TAPS(0.001539380475420018), +LPF_TAPS(0.001509579665070794), +LPF_TAPS(0.001271100228905015), +LPF_TAPS(0.000861203902397716), +LPF_TAPS(0.000340156906325913), +LPF_TAPS(-0.000217582662460545), +LPF_TAPS(-0.000733966594517146), +LPF_TAPS(-0.001138243238730974), +LPF_TAPS(-0.001376615418620143), +LPF_TAPS(-0.001419356298934519), +LPF_TAPS(-0.001264448151532591), +LPF_TAPS(-0.000937309191562415), +LPF_TAPS(-0.000486724172822189), +LPF_TAPS(0.000022381986458309), +LPF_TAPS(0.000518263608026988), +LPF_TAPS(0.000932433858217402), +LPF_TAPS(0.001209092780511007), +LPF_TAPS(0.001312610181298188), +LPF_TAPS(0.001232064876063025), +LPF_TAPS(0.000982269410612325), +LPF_TAPS(0.000601207657703440), +LPF_TAPS(0.000144311227422484), +LPF_TAPS(-0.000323569661431093), +LPF_TAPS(-0.000737342514358145), +LPF_TAPS(-0.001040701551881250), +LPF_TAPS(-0.001193760688319779), +LPF_TAPS(-0.001178259870510930), +LPF_TAPS(-0.000999670764342301), +LPF_TAPS(-0.000685970827866444), +LPF_TAPS(-0.000283321194004648), +LPF_TAPS(0.000150691601034830), +LPF_TAPS(0.000555265209860269), +LPF_TAPS(0.000874875646388696), +LPF_TAPS(0.001066872710566303), +LPF_TAPS(0.001107141138307768), +LPF_TAPS(0.000993080437533362), +LPF_TAPS(0.000743542799064008), +LPF_TAPS(0.000395797345139045), +LPF_TAPS(0.000000000000000007), +LPF_TAPS(-0.000388015211898053), +LPF_TAPS(-0.000714590827271673), +LPF_TAPS(-0.000935644589411756), +LPF_TAPS(-0.001022594925275672), +LPF_TAPS(-0.000966020337024242), +LPF_TAPS(-0.000776589615094116), +LPF_TAPS(-0.000483187384332319), +LPF_TAPS(-0.000128549987283509), +LPF_TAPS(0.000236934133089329), +LPF_TAPS(0.000562363609226325), +LPF_TAPS(0.000803394177128660), +LPF_TAPS(0.000928260223461724), +LPF_TAPS(0.000921933173856352), +LPF_TAPS(0.000787876493512615), +LPF_TAPS(0.000547201088099536), +LPF_TAPS(0.000235389385991059), +LPF_TAPS(-0.000102909621436732), +LPF_TAPS(-0.000420254351351959), +LPF_TAPS(-0.000673046341994754), +LPF_TAPS(-0.000827501970962114), +LPF_TAPS(-0.000864144791486477), +LPF_TAPS(-0.000780224416792033), +LPF_TAPS(-0.000589767278575103), +LPF_TAPS(-0.000321298976625744), +LPF_TAPS(-0.000013600228281345), +LPF_TAPS(0.000289875871129091), +LPF_TAPS(0.000547124213374555), +LPF_TAPS(0.000723385841491201), +LPF_TAPS(0.000795825808780393), +LPF_TAPS(0.000756463891081504), +LPF_TAPS(0.000612986179481084), +LPF_TAPS(0.000387367026753429), +LPF_TAPS(0.000112536081132703), +LPF_TAPS(-0.000172408232095687), +LPF_TAPS(-0.000427745671860825), +LPF_TAPS(-0.000618656737124805), +LPF_TAPS(-0.000719954989008130), +LPF_TAPS(-0.000719388248767023), +LPF_TAPS(-0.000619079186033522), +LPF_TAPS(-0.000434942614319249), +LPF_TAPS(-0.000194200868121255), +LPF_TAPS(0.000068619831178850), +LPF_TAPS(0.000316625963837260), +LPF_TAPS(0.000515722468116167), +LPF_TAPS(0.000639286203371008), +LPF_TAPS(0.000671708488657673), +LPF_TAPS(0.000610337904146259), +LPF_TAPS(0.000465586025087032), +LPF_TAPS(0.000259218525026417), +LPF_TAPS(0.000021105499668541), +LPF_TAPS(-0.000215086814767172), +LPF_TAPS(-0.000416643580674457), +LPF_TAPS(-0.000556320391373693), +LPF_TAPS(-0.000616011301487119), +LPF_TAPS(-0.000589074131789658), +LPF_TAPS(-0.000481017706568504), +LPF_TAPS(-0.000308489071818717), +LPF_TAPS(-0.000096735980511317), +LPF_TAPS(0.000124072004969681), +LPF_TAPS(0.000323129851106015), +LPF_TAPS(0.000473283508764437), +LPF_TAPS(0.000554721603718573), +LPF_TAPS(0.000557572259271585), +LPF_TAPS(0.000483067215653052), +LPF_TAPS(0.000343141246928103), +LPF_TAPS(0.000158554800002030), +LPF_TAPS(-0.000044169039830351), +LPF_TAPS(-0.000236543587877976), +LPF_TAPS(-0.000392111085189920), +LPF_TAPS(-0.000490070592560787), +LPF_TAPS(-0.000518045354092093), +LPF_TAPS(-0.000473623510576415), +LPF_TAPS(-0.000364483956377313), +LPF_TAPS(-0.000207119469909664), +LPF_TAPS(-0.000024363716411711), +LPF_TAPS(0.000157909563791660), +LPF_TAPS(0.000314439682826313), +LPF_TAPS(0.000424070037890936), +LPF_TAPS(0.000472595971723450), +LPF_TAPS(0.000454587814695287), +LPF_TAPS(0.000373957789509607), +LPF_TAPS(0.000243218730553891), +LPF_TAPS(0.000081565274292044), +LPF_TAPS(-0.000087931134219321), +LPF_TAPS(-0.000241605252470305), +LPF_TAPS(-0.000358493243807931), +LPF_TAPS(-0.000423182500185980), +LPF_TAPS(-0.000427830125620041), +LPF_TAPS(-0.000373087797360296), +LPF_TAPS(-0.000267828167726444), +LPF_TAPS(-0.000127736593278010), +LPF_TAPS(0.000027011881957749), +LPF_TAPS(0.000174648125360398), +LPF_TAPS(0.000294862846963479), +LPF_TAPS(0.000371591608966844), +LPF_TAPS(0.000395150265241936), +LPF_TAPS(0.000363438633495539), +LPF_TAPS(0.000282065698371838), +LPF_TAPS(0.000163402557720058), +LPF_TAPS(0.000024718036788845), +LPF_TAPS(-0.000114324158704671), +LPF_TAPS(-0.000234445374637796), +LPF_TAPS(-0.000319417137704526), +LPF_TAPS(-0.000358244171233166), +LPF_TAPS(-0.000346573027549407), +LPF_TAPS(-0.000287148034138770), +LPF_TAPS(-0.000189272454112044), +LPF_TAPS(-0.000067371788877151), +LPF_TAPS(0.000061121371994166), +LPF_TAPS(0.000178252266903006), +LPF_TAPS(0.000268045533373828), +LPF_TAPS(0.000318675926094879), +LPF_TAPS(0.000324014406196470), +LPF_TAPS(0.000284349145337142), +LPF_TAPS(0.000206200041981676), +LPF_TAPS(0.000101273018695546), +LPF_TAPS(-0.000015281270758960), +LPF_TAPS(-0.000127046877978245), +LPF_TAPS(-0.000218647732480789), +LPF_TAPS(-0.000277855813135357), +LPF_TAPS(-0.000297214302530807), +LPF_TAPS(-0.000274961629651599), +LPF_TAPS(-0.000215144263109794), +LPF_TAPS(-0.000126921304547573), +LPF_TAPS(-0.000023176045180278), +LPF_TAPS(0.000081356815168347), +LPF_TAPS(0.000172177192501632), +LPF_TAPS(0.000237024486928444), +LPF_TAPS(0.000267525010396375), +LPF_TAPS(0.000260261747274281), +LPF_TAPS(0.000217131551326968), +LPF_TAPS(0.000144956948925325), +LPF_TAPS(0.000054423951283517), +LPF_TAPS(-0.000041490851807240), +LPF_TAPS(-0.000129373609165754), +LPF_TAPS(-0.000197243155330462), +LPF_TAPS(-0.000236177752523331), +LPF_TAPS(-0.000241478724185279), +LPF_TAPS(-0.000213220593974129), +LPF_TAPS(-0.000156126086562068), +LPF_TAPS(-0.000078799528741505), +LPF_TAPS(0.000007559564539307), +LPF_TAPS(0.000090771716893217), +LPF_TAPS(0.000159389496760190), +LPF_TAPS(0.000204266447336485), +LPF_TAPS(0.000219768755358778), +LPF_TAPS(0.000204470262738553), +LPF_TAPS(0.000161247014791811), +LPF_TAPS(0.000096772923575936), +LPF_TAPS(0.000020501204933958), +LPF_TAPS(-0.000056714461339902), +LPF_TAPS(-0.000124158884970214), +LPF_TAPS(-0.000172736985353814), +LPF_TAPS(-0.000196193966704777), +LPF_TAPS(-0.000191911282688537), +LPF_TAPS(-0.000161178545601417), +LPF_TAPS(-0.000108916754401175), +LPF_TAPS(-0.000042904978978614), +LPF_TAPS(0.000027369756980472), +LPF_TAPS(0.000092070367689991), +LPF_TAPS(0.000142381767716384), +LPF_TAPS(0.000171706425136369), +LPF_TAPS(0.000176522050630483), +LPF_TAPS(0.000156791053766152), +LPF_TAPS(0.000115876412984811), +LPF_TAPS(0.000059988262299059), +LPF_TAPS(-0.000002749999175545), +LPF_TAPS(-0.000063476747878071), +LPF_TAPS(-0.000113839121163930), +LPF_TAPS(-0.000147137126223414), +LPF_TAPS(-0.000159208853892438), +LPF_TAPS(-0.000148940756773300), +LPF_TAPS(-0.000118342002758861), +LPF_TAPS(-0.000072184001225267), +LPF_TAPS(-0.000017266511725195), +LPF_TAPS(0.000038578048270125), +LPF_TAPS(0.000087597089208893), +LPF_TAPS(0.000123189743606018), +LPF_TAPS(0.000140790584377544), +LPF_TAPS(0.000138447616040141), +LPF_TAPS(0.000117022543786603), +LPF_TAPS(0.000079995664135062), +LPF_TAPS(0.000032913059017108), +LPF_TAPS(-0.000017437601660726), +LPF_TAPS(-0.000064001010754390), +LPF_TAPS(-0.000100438797921751), +LPF_TAPS(-0.000121987895707572), +LPF_TAPS(-0.000126077101208288), +LPF_TAPS(-0.000112622944066690), +LPF_TAPS(-0.000083972630656939), +LPF_TAPS(-0.000044511691498128), +LPF_TAPS(-0.000000000000000002), +LPF_TAPS(0.000043264236188097), +LPF_TAPS(0.000079331798651948), +LPF_TAPS(0.000103416618210071), +LPF_TAPS(0.000112525915634239), +LPF_TAPS(0.000105824102159998), +LPF_TAPS(0.000084687469158516), +LPF_TAPS(0.000052450811872168), +LPF_TAPS(0.000013889847008835), +LPF_TAPS(-0.000025481297179959), +LPF_TAPS(-0.000060194832140154), +LPF_TAPS(-0.000085585131224879), +LPF_TAPS(-0.000098411646607848), +LPF_TAPS(-0.000097266370464980), +LPF_TAPS(-0.000082715563486318), +LPF_TAPS(-0.000057163799306339), +LPF_TAPS(-0.000024467251374184), +LPF_TAPS(0.000010642839072521), +LPF_TAPS(0.000043241014115690), +LPF_TAPS(0.000068895297575180), +LPF_TAPS(0.000084266182598215), +LPF_TAPS(0.000087536477165891), +LPF_TAPS(0.000078617426254042), +LPF_TAPS(0.000059109194199816), +LPF_TAPS(0.000032028529545616), +LPF_TAPS(0.000001348358019648), +LPF_TAPS(-0.000028581195343862), +LPF_TAPS(-0.000053646492901935), +LPF_TAPS(-0.000070532635385286), +LPF_TAPS(-0.000077157882495440), +LPF_TAPS(-0.000072923912246472), +LPF_TAPS(-0.000058752864731266), +LPF_TAPS(-0.000036912594714084), +LPF_TAPS(-0.000010660904207243), +LPF_TAPS(0.000016236303510003), +LPF_TAPS(0.000040042213710101), +LPF_TAPS(0.000057565419794740), +LPF_TAPS(0.000066584435346171), +LPF_TAPS(0.000066124426393850), +LPF_TAPS(0.000056552462191051), +LPF_TAPS(0.000039483833968097), +LPF_TAPS(0.000017518448170727), +LPF_TAPS(-0.000006150721233903), +LPF_TAPS(-0.000028198722243287), +LPF_TAPS(-0.000045633079459602), +LPF_TAPS(-0.000056197102480673), +LPF_TAPS(-0.000058658110405480), +LPF_TAPS(-0.000052944360125334), +LPF_TAPS(-0.000040116646997951), +LPF_TAPS(-0.000022183953916465), +LPF_TAPS(-0.000001793863434875), +LPF_TAPS(0.000018155182598477), +LPF_TAPS(0.000034923404169512), +LPF_TAPS(0.000046303466797793), +LPF_TAPS(0.000050907893980236), +LPF_TAPS(0.000048333165179803), +LPF_TAPS(0.000039181921369101), +LPF_TAPS(0.000024945028324660), +LPF_TAPS(0.000007764644796739), +LPF_TAPS(-0.000009884758915617), +LPF_TAPS(-0.000025550362604739), +LPF_TAPS(-0.000037139634571452), +LPF_TAPS(-0.000043197213207640), +LPF_TAPS(-0.000043083788946342), +LPF_TAPS(-0.000037035618892028), +LPF_TAPS(-0.000026100632912291), +LPF_TAPS(-0.000011964370615358), +LPF_TAPS(0.000003306180458168), +LPF_TAPS(0.000017562372412707), +LPF_TAPS(0.000028874154654551), +LPF_TAPS(0.000035789132174905), +LPF_TAPS(0.000037515983141392), +LPF_TAPS(0.000034009552153551), +LPF_TAPS(0.000025949422139282), +LPF_TAPS(0.000014618866986779), +LPF_TAPS(0.000001704673145246), +LPF_TAPS(-0.000010951445764810), +LPF_TAPS(-0.000021613534847926), +LPF_TAPS(-0.000028887554888383), +LPF_TAPS(-0.000031901167390632), +LPF_TAPS(-0.000030404343160250), +LPF_TAPS(-0.000024779861226435), +LPF_TAPS(-0.000015965707722944), +LPF_TAPS(-0.000005303553733386), +LPF_TAPS(0.000005662780227376), +LPF_TAPS(0.000015408940720877), +LPF_TAPS(0.000022640183553416), +LPF_TAPS(0.000026461321281526), +LPF_TAPS(0.000026484479952918), +LPF_TAPS(0.000022862192292638), +LPF_TAPS(0.000016244238103206), +LPF_TAPS(0.000007667313823874), +LPF_TAPS(-0.000001604409044088), +LPF_TAPS(-0.000010263678225663), +LPF_TAPS(-0.000017142865405167), +LPF_TAPS(-0.000021369670893989), +LPF_TAPS(-0.000022475323943711), +LPF_TAPS(-0.000020442241587054), +LPF_TAPS(-0.000015687084203430), +LPF_TAPS(-0.000008984312747285), +LPF_TAPS(-0.000001343421473661), +LPF_TAPS(0.000006141091038300), +LPF_TAPS(0.000012444972319258), +LPF_TAPS(0.000016752874677521), +LPF_TAPS(0.000018561871818833), +LPF_TAPS(0.000017736994996257), +LPF_TAPS(0.000014513205712786), +LPF_TAPS(0.000009445938101717), +LPF_TAPS(0.000003319420166117), +LPF_TAPS(-0.000002972543870313), +LPF_TAPS(-0.000008555473445022), +LPF_TAPS(-0.000012694403544655), +LPF_TAPS(-0.000014889041605853), +LPF_TAPS(-0.000014931815471149), +LPF_TAPS(-0.000012922484749463), +LPF_TAPS(-0.000009239352535250), +LPF_TAPS(-0.000004473175304439), +LPF_TAPS(0.000000665210997690), +LPF_TAPS(0.000005449388731714), +LPF_TAPS(0.000009238814004167), +LPF_TAPS(0.000011563232679969), +LPF_TAPS(0.000012179135462912), +LPF_TAPS(0.000011091787638396), +LPF_TAPS(0.000008541512942748), +LPF_TAPS(0.000004957983543046), +LPF_TAPS(0.000000890558151977), +LPF_TAPS(-0.000003074347785313), +LPF_TAPS(-0.000006396629158261), +LPF_TAPS(-0.000008654903183906), +LPF_TAPS(-0.000009598430104571), +LPF_TAPS(-0.000009172392215667), +LPF_TAPS(-0.000007514453903456), +LPF_TAPS(-0.000004924673538250), +LPF_TAPS(-0.000001814470334864), +LPF_TAPS(0.000001357021165956), +LPF_TAPS(0.000004149568146742), +LPF_TAPS(0.000006201914111676), +LPF_TAPS(0.000007277262295166), +LPF_TAPS(0.000007288640610621), +LPF_TAPS(0.000006301781191850), +LPF_TAPS(0.000004516461176901), +LPF_TAPS(0.000002230237752093), +LPF_TAPS(-0.000000209237167646), +LPF_TAPS(-0.000002455897603684), +LPF_TAPS(-0.000004213405263437), +LPF_TAPS(-0.000005273188024575), +LPF_TAPS(-0.000005537656619195), +LPF_TAPS(-0.000005026285450778), +LPF_TAPS(-0.000003864827717528), +LPF_TAPS(-0.000002260316904552), +LPF_TAPS(-0.000000466356405324), +LPF_TAPS(0.000001255716262414), +LPF_TAPS(0.000002673992206742), +LPF_TAPS(0.000003616317717796), +LPF_TAPS(0.000003989957117356), +LPF_TAPS(0.000003788560986201), +LPF_TAPS(0.000003086375184260), +LPF_TAPS(0.000002021465017603), +LPF_TAPS(0.000000771181400041), +LPF_TAPS(-0.000000476023404783), +LPF_TAPS(-0.000001548102886537), +LPF_TAPS(-0.000002312345201813), +LPF_TAPS(-0.000002690787350045), +LPF_TAPS(-0.000002666499897103), +LPF_TAPS(-0.000002280585752777), +LPF_TAPS(-0.000001621105458760), +LPF_TAPS(-0.000000806224823920), +LPF_TAPS(0.000000035460970252), +LPF_TAPS(0.000000784305175046), +LPF_TAPS(0.000001345877978929), +LPF_TAPS(0.000001662018825424), +LPF_TAPS(0.000001715526626870), +LPF_TAPS(0.000001528393730563), +LPF_TAPS(0.000001154465104752), +LPF_TAPS(0.000000668161269568), +LPF_TAPS(0.000000151344328816), +LPF_TAPS(-0.000000319510091302), +LPF_TAPS(-0.000000683928580435), +LPF_TAPS(-0.000000904464094134), +LPF_TAPS(-0.000000969441292523), +LPF_TAPS(-0.000000891469622152), +LPF_TAPS(-0.000000702426625941), +LPF_TAPS(-0.000000446094830917), +LPF_TAPS(-0.000000169880370116), +LPF_TAPS(0.000000082967501909), +LPF_TAPS(0.000000279454635221), +LPF_TAPS(0.000000400482860087), +LPF_TAPS(0.000000441750238329), +LPF_TAPS(0.000000412114767172), +LPF_TAPS(0.000000330027000994), +LPF_TAPS(0.000000218892576977), +LPF_TAPS(0.000000102305467491), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000074862812243), +LPF_TAPS(-0.000000116776553081), +LPF_TAPS(-0.000000127377349425), +LPF_TAPS(-0.000000113670834618), +LPF_TAPS(-0.000000085529617644), +LPF_TAPS(-0.000000053068738903), +LPF_TAPS(-0.000000024455755672), +LPF_TAPS(-0.000000004555102366), +LPF_TAPS(0.000000005417116054), +LPF_TAPS(0.000000007291655555), +LPF_TAPS(0.000000004667803778), +LPF_TAPS(0.000000001359448860), +LPF_TAPS(0.000000000000000000), +}; diff --git a/core/sound/blip_lpf_768K_96K.h b/core/sound/blip_lpf_768K_96K.h new file mode 100644 index 000000000..4ce32869f --- /dev/null +++ b/core/sound/blip_lpf_768K_96K.h @@ -0,0 +1,1181 @@ +static buf_t const blip_lpf_768K_96K[blip_lpf_768K_taps] = { +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000000270411184), +LPF_TAPS(-0.000000004566831930), +LPF_TAPS(-0.000000012351139235), +LPF_TAPS(-0.000000013280804131), +LPF_TAPS(0.000000004555102241), +LPF_TAPS(0.000000039434566462), +LPF_TAPS(0.000000068321452499), +LPF_TAPS(0.000000058120029422), +LPF_TAPS(-0.000000007450379918), +LPF_TAPS(-0.000000104404320415), +LPF_TAPS(-0.000000170736308622), +LPF_TAPS(-0.000000141661312606), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000193590467381), +LPF_TAPS(0.000000320037795188), +LPF_TAPS(0.000000270505273607), +LPF_TAPS(0.000000027011428177), +LPF_TAPS(-0.000000300182995740), +LPF_TAPS(-0.000000515587354585), +LPF_TAPS(-0.000000450616719176), +LPF_TAPS(-0.000000082967499633), +LPF_TAPS(0.000000416485063055), +LPF_TAPS(0.000000755628036388), +LPF_TAPS(0.000000687232046705), +LPF_TAPS(0.000000177324328124), +LPF_TAPS(-0.000000533957607898), +LPF_TAPS(-0.000001037252087726), +LPF_TAPS(-0.000000984767130185), +LPF_TAPS(-0.000000319510082535), +LPF_TAPS(0.000000643271372107), +LPF_TAPS(0.000001356374370310), +LPF_TAPS(0.000001346726039086), +LPF_TAPS(0.000000518819746823), +LPF_TAPS(-0.000000734366703963), +LPF_TAPS(-0.000001707712156148), +LPF_TAPS(-0.000001775611017371), +LPF_TAPS(-0.000000784305153524), +LPF_TAPS(0.000000796521519526), +LPF_TAPS(0.000002084771914283), +LPF_TAPS(0.000002272834232693), +LPF_TAPS(0.000001124660401793), +LPF_TAPS(-0.000000818427794343), +LPF_TAPS(-0.000002479843756310), +LPF_TAPS(-0.000002838631893487), +LPF_TAPS(-0.000001548102844057), +LPF_TAPS(0.000000788276939661), +LPF_TAPS(0.000002884004257187), +LPF_TAPS(0.000003471981422733), +LPF_TAPS(0.000002062249910138), +LPF_TAPS(-0.000000693854385419), +LPF_TAPS(-0.000003287128408051), +LPF_TAPS(-0.000004170522469635), +LPF_TAPS(-0.000002673992133367), +LPF_TAPS(0.000000522643645980), +LPF_TAPS(0.000003677911487767), +LPF_TAPS(0.000004930482632690), +LPF_TAPS(0.000003389362848789), +LPF_TAPS(-0.000000261940083240), +LPF_TAPS(-0.000004043901657974), +LPF_TAPS(-0.000005746608857426), +LPF_TAPS(-0.000004213405147821), +LPF_TAPS(-0.000000101025494664), +LPF_TAPS(0.000004371544091072), +LPF_TAPS(0.000006612105557627), +LPF_TAPS(0.000005150036795236), +LPF_TAPS(0.000000578953352335), +LPF_TAPS(-0.000004646237430354), +LPF_TAPS(-0.000007518580587867), +LPF_TAPS(-0.000006201913941494), +LPF_TAPS(-0.000001184331523467), +LPF_TAPS(0.000004852403355266), +LPF_TAPS(0.000008456000265721), +LPF_TAPS(0.000007370294594349), +LPF_TAPS(0.000001929282864789), +LPF_TAPS(-0.000004973569981430), +LPF_TAPS(-0.000009412654701919), +LPF_TAPS(-0.000008654902946414), +LPF_TAPS(-0.000002825402781922), +LPF_TAPS(0.000004992469763834), +LPF_TAPS(0.000010375134744049), +LPF_TAPS(0.000010053795787783), +LPF_TAPS(0.000003883588087799), +LPF_TAPS(-0.000004891152491910), +LPF_TAPS(-0.000011328321872127), +LPF_TAPS(-0.000011563232362672), +LPF_TAPS(-0.000005113857611770), +LPF_TAPS(0.000004651113866717), +LPF_TAPS(0.000012255392400844), +LPF_TAPS(0.000013177549153965), +LPF_TAPS(0.000006525165344348), +LPF_TAPS(-0.000004253440033178), +LPF_TAPS(-0.000013137837341611), +LPF_TAPS(-0.000014889041197294), +LPF_TAPS(-0.000008125207077045), +LPF_TAPS(0.000003678968304326), +LPF_TAPS(0.000013955499256432), +LPF_TAPS(0.000016687851634161), +LPF_TAPS(0.000009920221676887), +LPF_TAPS(-0.000002908464160586), +LPF_TAPS(-0.000014686627393690), +LPF_TAPS(-0.000018561871309492), +LPF_TAPS(-0.000011914788318634), +LPF_TAPS(0.000001922814435766), +LPF_TAPS(0.000015307952332069), +LPF_TAPS(0.000020496650300343), +LPF_TAPS(0.000014111621182239), +LPF_TAPS(-0.000000703236414013), +LPF_TAPS(-0.000015794781272331), +LPF_TAPS(-0.000022475323326984), +LPF_TAPS(-0.000016511363305968), +LPF_TAPS(-0.000000768497640292), +LPF_TAPS(0.000016121115006902), +LPF_TAPS(0.000024478551043080), +LPF_TAPS(0.000019112381464281), +LPF_TAPS(0.000002509821213062), +LPF_TAPS(-0.000016259787463951), +LPF_TAPS(-0.000026484479226179), +LPF_TAPS(-0.000021910564111253), +LPF_TAPS(-0.000004537120451352), +LPF_TAPS(0.000016182628565960), +LPF_TAPS(0.000028468717891133), +LPF_TAPS(0.000024899124592205), +LPF_TAPS(0.000006865468409934), +LPF_TAPS(-0.000015860650962998), +LPF_TAPS(-0.000030404342325949), +LPF_TAPS(-0.000028068411975450), +LPF_TAPS(-0.000009508348030975), +LPF_TAPS(0.000015264260998860), +LPF_TAPS(0.000032261918000294), +LPF_TAPS(0.000031405731989841), +LPF_TAPS(0.000012477365500132), +LPF_TAPS(-0.000014363494044602), +LPF_TAPS(-0.000034009551220323), +LPF_TAPS(-0.000034895180669362), +LPF_TAPS(-0.000015781955869275), +LPF_TAPS(0.000013128274090703), +LPF_TAPS(0.000035612967298774), +LPF_TAPS(0.000038517493400618), +LPF_TAPS(0.000019429083080919), +LPF_TAPS(-0.000011528697227208), +LPF_TAPS(-0.000037035617875765), +LPF_TAPS(-0.000042249912140231), +LPF_TAPS(-0.000023422936769313), +LPF_TAPS(0.000009535338363085), +LPF_TAPS(0.000038238818863166), +LPF_TAPS(0.000046066073614426), +LPF_TAPS(0.000027764628444526), +LPF_TAPS(-0.000007119580243999), +LPF_TAPS(-0.000039181920293943), +LPF_TAPS(-0.000049935921330255), +LPF_TAPS(-0.000032451889885582), +LPF_TAPS(0.000004253963524157), +LPF_TAPS(0.000039822509137849), +LPF_TAPS(0.000053825644215059), +LPF_TAPS(0.000037478776773538), +LPF_TAPS(-0.000000912556335678), +LPF_TAPS(-0.000040116645897143), +LPF_TAPS(-0.000057697644656153), +LPF_TAPS(-0.000042835380781845), +LPF_TAPS(-0.000002928658518456), +LPF_TAPS(0.000040019135521818), +LPF_TAPS(0.000061510538634914), +LPF_TAPS(0.000048507553506201), +LPF_TAPS(0.000007291380941630), +LPF_TAPS(-0.000039483832884655), +LPF_TAPS(-0.000065219190537468), +LPF_TAPS(-0.000054476645756378), +LPF_TAPS(-0.000012194578003053), +LPF_TAPS(0.000038463982734246), +LPF_TAPS(0.000068774785077135), +LPF_TAPS(0.000060719265845020), +LPF_TAPS(0.000017654058304802), +LPF_TAPS(-0.000036912593701199), +LPF_TAPS(-0.000072124938581478), +LPF_TAPS(-0.000067207060590316), +LPF_TAPS(-0.000023682039386360), +LPF_TAPS(0.000034782845571742), +LPF_TAPS(0.000075213851679169), +LPF_TAPS(0.000073906522798216), +LPF_TAPS(0.000030286711588387), +LPF_TAPS(-0.000032028528666751), +LPF_TAPS(-0.000077982505169364), +LPF_TAPS(-0.000080778829003251), +LPF_TAPS(-0.000037471802072891), +LPF_TAPS(0.000028604513776213), +LPF_TAPS(0.000080368900569730), +LPF_TAPS(0.000087779711222512), +LPF_TAPS(0.000045236142951916), +LPF_TAPS(-0.000024467250702803), +LPF_TAPS(-0.000082308346520089), +LPF_TAPS(-0.000094859366413814), +LPF_TAPS(-0.000053573247707659), +LPF_TAPS(0.000019575293067346), +LPF_TAPS(0.000083733791868213), +LPF_TAPS(0.000101962407224727), +LPF_TAPS(0.000062470900289848), +LPF_TAPS(-0.000013889846627700), +LPF_TAPS(-0.000084576205885109), +LPF_TAPS(-0.000109027857473073), +LPF_TAPS(-0.000071910761447583), +LPF_TAPS(0.000007375337964748), +LPF_TAPS(0.000084765005651504), +LPF_TAPS(0.000115989195611307), +LPF_TAPS(0.000081867996989454), +LPF_TAPS(0.000000000000000001), +LPF_TAPS(-0.000084228530228097), +LPF_TAPS(-0.000122774449196541), +LPF_TAPS(-0.000092310932764303), +LPF_TAPS(-0.000008263529568140), +LPF_TAPS(0.000082894560772723), +LPF_TAPS(0.000129306343115324), +LPF_TAPS(0.000103200741212745), +LPF_TAPS(0.000017437601182228), +LPF_TAPS(-0.000080690885301903), +LPF_TAPS(-0.000135502503998360), +LPF_TAPS(-0.000114491164353880), +LPF_TAPS(-0.000027538942308942), +LPF_TAPS(0.000077545906315897), +LPF_TAPS(0.000141275722906486), +LPF_TAPS(0.000126128278040423), +LPF_TAPS(0.000038578047211531), +LPF_TAPS(-0.000073389289019584), +LPF_TAPS(-0.000146534277977077), +LPF_TAPS(-0.000138050302236821), +LPF_TAPS(-0.000050558572817687), +LPF_TAPS(0.000068152647381547), +LPF_TAPS(0.000151182318291936), +LPF_TAPS(0.000150187461947657), +LPF_TAPS(0.000063476746136257), +LPF_TAPS(-0.000061770264784565), +LPF_TAPS(-0.000155120309766295), +LPF_TAPS(-0.000162461903246604), +LPF_TAPS(-0.000077320788885710), +LPF_TAPS(0.000054179845537360), +LPF_TAPS(0.000158245543366951), +LPF_TAPS(0.000174787668629224), +LPF_TAPS(0.000092070365163552), +LPF_TAPS(-0.000045323293046136), +LPF_TAPS(-0.000160452705449426), +LPF_TAPS(-0.000187070735635932), +LPF_TAPS(-0.000107696058106567), +LPF_TAPS(0.000035147509988554), +LPF_TAPS(0.000161634509463345), +LPF_TAPS(0.000199209122364984), +LPF_TAPS(0.000124158881563270), +LPF_TAPS(-0.000023605215399143), +LPF_TAPS(-0.000161682387716431), +LPF_TAPS(-0.000211093063120905), +LPF_TAPS(-0.000141409832819943), +LPF_TAPS(0.000010655773168138), +LPF_TAPS(0.000160487241315340), +LPF_TAPS(0.000222605257022561), +LPF_TAPS(0.000159389492386513), +LPF_TAPS(0.000003733973919304), +LPF_TAPS(-0.000157940245821130), +LPF_TAPS(-0.000233621191929531), +LPF_TAPS(-0.000178027676757870), +LPF_TAPS(-0.000019588870814477), +LPF_TAPS(0.000153933709573879), +LPF_TAPS(0.000244009545538508), +LPF_TAPS(0.000197243149918067), +LPF_TAPS(0.000036924624014180), +LPF_TAPS(-0.000148361981060471), +LPF_TAPS(-0.000253632664955913), +LPF_TAPS(-0.000216943399147082), +LPF_TAPS(-0.000055746989303841), +LPF_TAPS(0.000141122401127468), +LPF_TAPS(0.000262347125473069), +LPF_TAPS(0.000237024480424446), +LPF_TAPS(0.000076050980390099), +LPF_TAPS(-0.000132116295283923), +LPF_TAPS(-0.000270004368660097), +LPF_TAPS(-0.000257370938398958), +LPF_TAPS(-0.000097820105521335), +LPF_TAPS(0.000121250000801888), +LPF_TAPS(0.000276451419258909), +LPF_TAPS(0.000277855805510942), +LPF_TAPS(0.000121025639279983), +LPF_TAPS(-0.000108435922812569), +LPF_TAPS(-0.000281531679699815), +LPF_TAPS(-0.000298340684414147), +LPF_TAPS(-0.000145625936753519), +LPF_TAPS(0.000093593613118962), +LPF_TAPS(0.000285085800395328), +LPF_TAPS(0.000318675917350350), +LPF_TAPS(0.000171565797249006), +LPF_TAPS(-0.000076650865007591), +LPF_TAPS(-0.000286952623285186), +LPF_TAPS(-0.000338700845583232), +LPF_TAPS(-0.000198775884607860), +LPF_TAPS(0.000057544816948299), +LPF_TAPS(0.000286970195424600), +LPF_TAPS(0.000358244161402881), +LPF_TAPS(0.000227172210999713), +LPF_TAPS(-0.000036223057728650), +LPF_TAPS(-0.000284976848729387), +LPF_TAPS(-0.000377124354571514), +LPF_TAPS(-0.000256655690826361), +LPF_TAPS(0.000012644725282694), +LPF_TAPS(0.000280812341324255), +LPF_TAPS(0.000395150254398941), +LPF_TAPS(0.000287111771048686), +LPF_TAPS(0.000013218408751720), +LPF_TAPS(-0.000274319055291023), +LPF_TAPS(-0.000412121667917977), +LPF_TAPS(-0.000318410143859715), +LPF_TAPS(-0.000041380876871214), +LPF_TAPS(0.000265343244988183), +LPF_TAPS(0.000427830113880310), +LPF_TAPS(0.000350404547166695), +LPF_TAPS(0.000071842484152793), +LPF_TAPS(-0.000253736329520328), +LPF_TAPS(-0.000442059651518030), +LPF_TAPS(-0.000382932657815871), +LPF_TAPS(-0.000104587315532687), +LPF_TAPS(0.000239356222381871), +LPF_TAPS(0.000454587802221318), +LPF_TAPS(0.000415816081895713), +LPF_TAPS(0.000139582790075373), +LPF_TAPS(-0.000222068690791697), +LPF_TAPS(-0.000465186561474685), +LPF_TAPS(-0.000448860445790772), +LPF_TAPS(-0.000176778770242168), +LPF_TAPS(0.000201748736780270), +LPF_TAPS(0.000473623497580100), +LPF_TAPS(0.000481855590931383), +LPF_TAPS(0.000216106733933253), +LPF_TAPS(-0.000178281991696848), +LPF_TAPS(-0.000479662932881307), +LPF_TAPS(-0.000514575874397409), +LPF_TAPS(-0.000257479016753594), +LPF_TAPS(0.000151566115476765), +LPF_TAPS(0.000483067202397602), +LPF_TAPS(0.000546780576689613), +LPF_TAPS(0.000300788131540266), +LPF_TAPS(-0.000121512191754436), +LPF_TAPS(-0.000483597983984493), +LPF_TAPS(-0.000578214417085337), +LPF_TAPS(-0.000345906171682450), +LPF_TAPS(0.000088046109734778), +LPF_TAPS(0.000481017693369305), +LPF_TAPS(0.000608608176048614), +LPF_TAPS(0.000392684304164982), +LPF_TAPS(-0.000051109923647480), +LPF_TAPS(-0.000475090936671043), +LPF_TAPS(-0.000637679423173593), +LPF_TAPS(-0.000440952357572390), +LPF_TAPS(0.000010663180613739), +LPF_TAPS(0.000465586012311272), +LPF_TAPS(0.000665133348108232), +LPF_TAPS(0.000490518509497743), +LPF_TAPS(0.000033315792142107), +LPF_TAPS(-0.000452276453563864), +LPF_TAPS(-0.000690663690836736), +LPF_TAPS(-0.000541169076912061), +LPF_TAPS(-0.000080828649596569), +LPF_TAPS(0.000434942602384353), +LPF_TAPS(0.000713953766598160), +LPF_TAPS(0.000592668412062428), +LPF_TAPS(0.000131855849291230), +LPF_TAPS(-0.000413373204608622), +LPF_TAPS(-0.000734677579588487), +LPF_TAPS(-0.000644758905377691), +LPF_TAPS(-0.000186355537869023), +LPF_TAPS(0.000387367016124019), +LPF_TAPS(0.000752501018436972), +LPF_TAPS(0.000697161095670107), +LPF_TAPS(0.000244262511342674), +LPF_TAPS(-0.000356734409198346), +LPF_TAPS(-0.000767083125267112), +LPF_TAPS(-0.000749573886623857), +LPF_TAPS(-0.000305487255974598), +LPF_TAPS(0.000321298967809247), +LPF_TAPS(0.000778077428948392), +LPF_TAPS(0.000801674867154103), +LPF_TAPS(0.000369915075832187), +LPF_TAPS(-0.000280899060553020), +LPF_TAPS(-0.000785133331916735), +LPF_TAPS(-0.000853120731696567), +LPF_TAPS(-0.000437405312127583), +LPF_TAPS(0.000235389379531954), +LPF_TAPS(0.000787897538687086), +LPF_TAPS(0.000903547794839195), +LPF_TAPS(0.000507790658341669), +LPF_TAPS(-0.000184642433526538), +LPF_TAPS(-0.000786015512894042), +LPF_TAPS(-0.000952572592922852), +LPF_TAPS(-0.000580876573863251), +LPF_TAPS(0.000128549983756101), +LPF_TAPS(0.000779132948370268), +LPF_TAPS(0.000999792563301986), +LPF_TAPS(0.000656440797430408), +LPF_TAPS(-0.000067024410620718), +LPF_TAPS(-0.000766897238393383), +LPF_TAPS(-0.001044786789848272), +LPF_TAPS(-0.000734232960023326), +LPF_TAPS(-0.000000000000000005), +LPF_TAPS(0.000748958925783496), +LPF_TAPS(0.001087116800973934), +LPF_TAPS(0.000813974295010493), +LPF_TAPS(0.000072565862038648), +LPF_TAPS(-0.000724973114994913), +LPF_TAPS(-0.001126327403911303), +LPF_TAPS(-0.000895357441261970), +LPF_TAPS(-0.000150691596899802), +LPF_TAPS(0.000694600825682697), +LPF_TAPS(0.001161947536166415), +LPF_TAPS(0.000978046332583554), +LPF_TAPS(0.000234370453800612), +LPF_TAPS(-0.000657510265401049), +LPF_TAPS(-0.001193491111907350), +LPF_TAPS(-0.001061676164149838), +LPF_TAPS(-0.000323569652552237), +LPF_TAPS(0.000613377997052172), +LPF_TAPS(0.001220457837477517), +LPF_TAPS(0.001145853423567000), +LPF_TAPS(0.000418229657899272), +LPF_TAPS(-0.000561889974384736), +LPF_TAPS(-0.001242333966140826), +LPF_TAPS(-0.001230155970706029), +LPF_TAPS(-0.000518263593805743), +LPF_TAPS(0.000502742416153757), +LPF_TAPS(0.001258592957444364), +LPF_TAPS(0.001314133146421481), +LPF_TAPS(0.000623556805271501), +LPF_TAPS(-0.000435642486386754), +LPF_TAPS(-0.001268696001060263), +LPF_TAPS(-0.001397305885589659), +LPF_TAPS(-0.000733966574376959), +LPF_TAPS(0.000360308744410595), +LPF_TAPS(0.001272092358430086), +LPF_TAPS(0.001479166804407970), +LPF_TAPS(0.000849321996303103), +LPF_TAPS(-0.000276471323693381), +LPF_TAPS(-0.001268219467708550), +LPF_TAPS(-0.001559180225390086), +LPF_TAPS(-0.000969424020057980), +LPF_TAPS(0.000183871792903588), +LPF_TAPS(0.001256502748029804), +LPF_TAPS(0.001636782095705366), +LPF_TAPS(0.001094045657568108), +LPF_TAPS(-0.000082262645572483), +LPF_TAPS(-0.001236355027529776), +LPF_TAPS(-0.001711379745094407), +LPF_TAPS(-0.001222932363673510), +LPF_TAPS(-0.000028593644051682), +LPF_TAPS(0.001207175505238442), +LPF_TAPS(0.001782351418086488), +LPF_TAPS(0.001355802588405122), +LPF_TAPS(0.000148926072484010), +LPF_TAPS(-0.001168348139089120), +LPF_TAPS(-0.001849045501035285), +LPF_TAPS(-0.001492348501730395), +LPF_TAPS(-0.000278957153502074), +LPF_TAPS(0.001119239329794093), +LPF_TAPS(0.001910779346758653), +LPF_TAPS(0.001632236889739083), +LPF_TAPS(0.000418905665507703), +LPF_TAPS(-0.001059194741754679), +LPF_TAPS(-0.001966837577216155), +LPF_TAPS(-0.001775110220014063), +LPF_TAPS(-0.000568990229048854), +LPF_TAPS(0.000987535065544672), +LPF_TAPS(0.002016469716192195), +LPF_TAPS(0.001920587872700438), +LPF_TAPS(0.000729433874303646), +LPF_TAPS(-0.000903550479155667), +LPF_TAPS(-0.002058886967336214), +LPF_TAPS(-0.002068267532562079), +LPF_TAPS(-0.000900469798287184), +LPF_TAPS(0.000806493503452518), +LPF_TAPS(0.002093257905337432), +LPF_TAPS(0.002217726736106073), +LPF_TAPS(0.001082348564271453), +LPF_TAPS(-0.000695569866067479), +LPF_TAPS(-0.002118702785577123), +LPF_TAPS(-0.002368524566673696), +LPF_TAPS(-0.001275347066045030), +LPF_TAPS(0.000569926880137041), +LPF_TAPS(0.002134286094823393), +LPF_TAPS(0.002520203489249087), +LPF_TAPS(0.001479779673719473), +LPF_TAPS(-0.000428638699776618), +LPF_TAPS(-0.002139006854631970), +LPF_TAPS(-0.002672291315636172), +LPF_TAPS(-0.001696012105135989), +LPF_TAPS(0.000270687618562523), +LPF_TAPS(0.002131786038913134), +LPF_TAPS(0.002824303289607278), +LPF_TAPS(0.001924478741007838), +LPF_TAPS(-0.000094940309639865), +LPF_TAPS(-0.002111450261374951), +LPF_TAPS(-0.002975744280643784), +LPF_TAPS(-0.002165704342448907), +LPF_TAPS(-0.000099882464296025), +LPF_TAPS(0.002076710603318021), +LPF_TAPS(0.003126111073977952), +LPF_TAPS(0.002420331465708461), +LPF_TAPS(0.000315244661688287), +LPF_TAPS(-0.002026135051765541), +LPF_TAPS(-0.003274894743813884), +LPF_TAPS(-0.002689155344745519), +LPF_TAPS(-0.000552845020310631), +LPF_TAPS(0.001958112447871428), +LPF_TAPS(0.003421583095861868), +LPF_TAPS(0.002973168695048461), +LPF_TAPS(0.000814682149728468), +LPF_TAPS(-0.001870805022176066), +LPF_TAPS(-0.003565663164670819), +LPF_TAPS(-0.003273619886621902), +LPF_TAPS(-0.001103139994380340), +LPF_TAPS(0.001762085384909424), +LPF_TAPS(0.003706623750694053), +LPF_TAPS(0.003592089406590396), +LPF_TAPS(0.001421101307595647), +LPF_TAPS(-0.001629452035153002), +LPF_TAPS(-0.003843957981579970), +LPF_TAPS(-0.003930591751701837), +LPF_TAPS(-0.001772100266318171), +LPF_TAPS(0.001469914706687037), +LPF_TAPS(0.003977165881845358), +LPF_TAPS(0.004291713304285165), +LPF_TAPS(0.002160530749761068), +LPF_TAPS(-0.001279836601243179), +LPF_TAPS(-0.004105756934868098), +LPF_TAPS(-0.004678802109646364), +LPF_TAPS(-0.002591935331103227), +LPF_TAPS(0.001054713774132877), +LPF_TAPS(0.004229252621032640), +LPF_TAPS(0.005096234111258445), +LPF_TAPS(0.003073413849970708), +LPF_TAPS(-0.000788860865288700), +LPF_TAPS(-0.004347188915874286), +LPF_TAPS(-0.005549794693420798), +LPF_TAPS(-0.003614213465399337), +LPF_TAPS(0.000474953775693102), +LPF_TAPS(0.004459118732201452), +LPF_TAPS(0.006047238764530833), +LPF_TAPS(0.004226601704931117), +LPF_TAPS(-0.000103347635223954), +LPF_TAPS(-0.004564614290425168), +LPF_TAPS(-0.006599135675019976), +LPF_TAPS(-0.004927194646314364), +LPF_TAPS(-0.000338969649985560), +LPF_TAPS(0.004663269401693712), +LPF_TAPS(0.007220184376639409), +LPF_TAPS(0.005739043522408302), +LPF_TAPS(0.000870037019175714), +LPF_TAPS(-0.004754701648912377), +LPF_TAPS(-0.007931336370168995), +LPF_TAPS(-0.006695038446581728), +LPF_TAPS(-0.001515656923509417), +LPF_TAPS(0.004838554451325837), +LPF_TAPS(0.008763372616940504), +LPF_TAPS(0.007843713794596620), +LPF_TAPS(0.002314122726735356), +LPF_TAPS(-0.004914498999040660), +LPF_TAPS(-0.009763247625583497), +LPF_TAPS(-0.009259696625635633), +LPF_TAPS(-0.003324858732932616), +LPF_TAPS(0.004982236044675482), +LPF_TAPS(0.011006070343321725), +LPF_TAPS(0.011063798161185320), +LPF_TAPS(0.004645354753451371), +LPF_TAPS(-0.005041497540227182), +LPF_TAPS(-0.012619584031900466), +LPF_TAPS(-0.013465021110133799), +LPF_TAPS(-0.006447454322367885), +LPF_TAPS(0.005092048108238308), +LPF_TAPS(0.014839564692262223), +LPF_TAPS(0.016858573939520928), +LPF_TAPS(0.009064872816953886), +LPF_TAPS(-0.005133686337426830), +LPF_TAPS(-0.018153852707843591), +LPF_TAPS(-0.022091905732457218), +LPF_TAPS(-0.013242286375227360), +LPF_TAPS(0.005166245894094694), +LPF_TAPS(0.023760629646010001), +LPF_TAPS(0.031369218971440446), +LPF_TAPS(0.021048655686047999), +LPF_TAPS(-0.005189596441849655), +LPF_TAPS(-0.035597921097925082), +LPF_TAPS(-0.052774023466892729), +LPF_TAPS(-0.041174498840934465), +LPF_TAPS(0.005203644363453204), +LPF_TAPS(0.078609102662633309), +LPF_TAPS(0.159062306412752513), +LPF_TAPS(0.221363681692069797), +LPF_TAPS(0.244791664156811084), +LPF_TAPS(0.221363681692069797), +LPF_TAPS(0.159062306412752513), +LPF_TAPS(0.078609102662633309), +LPF_TAPS(0.005203644363453204), +LPF_TAPS(-0.041174498840934465), +LPF_TAPS(-0.052774023466892729), +LPF_TAPS(-0.035597921097925082), +LPF_TAPS(-0.005189596441849655), +LPF_TAPS(0.021048655686048003), +LPF_TAPS(0.031369218971440446), +LPF_TAPS(0.023760629646010001), +LPF_TAPS(0.005166245894094694), +LPF_TAPS(-0.013242286375227360), +LPF_TAPS(-0.022091905732457225), +LPF_TAPS(-0.018153852707843591), +LPF_TAPS(-0.005133686337426830), +LPF_TAPS(0.009064872816953886), +LPF_TAPS(0.016858573939520932), +LPF_TAPS(0.014839564692262223), +LPF_TAPS(0.005092048108238309), +LPF_TAPS(-0.006447454322367884), +LPF_TAPS(-0.013465021110133800), +LPF_TAPS(-0.012619584031900466), +LPF_TAPS(-0.005041497540227182), +LPF_TAPS(0.004645354753451371), +LPF_TAPS(0.011063798161185320), +LPF_TAPS(0.011006070343321727), +LPF_TAPS(0.004982236044675482), +LPF_TAPS(-0.003324858732932616), +LPF_TAPS(-0.009259696625635633), +LPF_TAPS(-0.009763247625583497), +LPF_TAPS(-0.004914498999040660), +LPF_TAPS(0.002314122726735356), +LPF_TAPS(0.007843713794596620), +LPF_TAPS(0.008763372616940504), +LPF_TAPS(0.004838554451325837), +LPF_TAPS(-0.001515656923509417), +LPF_TAPS(-0.006695038446581728), +LPF_TAPS(-0.007931336370168997), +LPF_TAPS(-0.004754701648912377), +LPF_TAPS(0.000870037019175714), +LPF_TAPS(0.005739043522408302), +LPF_TAPS(0.007220184376639409), +LPF_TAPS(0.004663269401693713), +LPF_TAPS(-0.000338969649985560), +LPF_TAPS(-0.004927194646314365), +LPF_TAPS(-0.006599135675019976), +LPF_TAPS(-0.004564614290425169), +LPF_TAPS(-0.000103347635223954), +LPF_TAPS(0.004226601704931118), +LPF_TAPS(0.006047238764530834), +LPF_TAPS(0.004459118732201452), +LPF_TAPS(0.000474953775693102), +LPF_TAPS(-0.003614213465399337), +LPF_TAPS(-0.005549794693420798), +LPF_TAPS(-0.004347188915874287), +LPF_TAPS(-0.000788860865288701), +LPF_TAPS(0.003073413849970708), +LPF_TAPS(0.005096234111258445), +LPF_TAPS(0.004229252621032641), +LPF_TAPS(0.001054713774132877), +LPF_TAPS(-0.002591935331103227), +LPF_TAPS(-0.004678802109646364), +LPF_TAPS(-0.004105756934868098), +LPF_TAPS(-0.001279836601243179), +LPF_TAPS(0.002160530749761068), +LPF_TAPS(0.004291713304285166), +LPF_TAPS(0.003977165881845358), +LPF_TAPS(0.001469914706687038), +LPF_TAPS(-0.001772100266318171), +LPF_TAPS(-0.003930591751701838), +LPF_TAPS(-0.003843957981579969), +LPF_TAPS(-0.001629452035153002), +LPF_TAPS(0.001421101307595647), +LPF_TAPS(0.003592089406590396), +LPF_TAPS(0.003706623750694053), +LPF_TAPS(0.001762085384909424), +LPF_TAPS(-0.001103139994380340), +LPF_TAPS(-0.003273619886621902), +LPF_TAPS(-0.003565663164670820), +LPF_TAPS(-0.001870805022176066), +LPF_TAPS(0.000814682149728468), +LPF_TAPS(0.002973168695048460), +LPF_TAPS(0.003421583095861869), +LPF_TAPS(0.001958112447871428), +LPF_TAPS(-0.000552845020310631), +LPF_TAPS(-0.002689155344745519), +LPF_TAPS(-0.003274894743813884), +LPF_TAPS(-0.002026135051765542), +LPF_TAPS(0.000315244661688287), +LPF_TAPS(0.002420331465708461), +LPF_TAPS(0.003126111073977953), +LPF_TAPS(0.002076710603318022), +LPF_TAPS(-0.000099882464296025), +LPF_TAPS(-0.002165704342448908), +LPF_TAPS(-0.002975744280643785), +LPF_TAPS(-0.002111450261374951), +LPF_TAPS(-0.000094940309639865), +LPF_TAPS(0.001924478741007838), +LPF_TAPS(0.002824303289607278), +LPF_TAPS(0.002131786038913134), +LPF_TAPS(0.000270687618562523), +LPF_TAPS(-0.001696012105135989), +LPF_TAPS(-0.002672291315636172), +LPF_TAPS(-0.002139006854631970), +LPF_TAPS(-0.000428638699776618), +LPF_TAPS(0.001479779673719473), +LPF_TAPS(0.002520203489249086), +LPF_TAPS(0.002134286094823393), +LPF_TAPS(0.000569926880137041), +LPF_TAPS(-0.001275347066045031), +LPF_TAPS(-0.002368524566673696), +LPF_TAPS(-0.002118702785577123), +LPF_TAPS(-0.000695569866067479), +LPF_TAPS(0.001082348564271454), +LPF_TAPS(0.002217726736106073), +LPF_TAPS(0.002093257905337432), +LPF_TAPS(0.000806493503452518), +LPF_TAPS(-0.000900469798287184), +LPF_TAPS(-0.002068267532562080), +LPF_TAPS(-0.002058886967336214), +LPF_TAPS(-0.000903550479155668), +LPF_TAPS(0.000729433874303646), +LPF_TAPS(0.001920587872700438), +LPF_TAPS(0.002016469716192196), +LPF_TAPS(0.000987535065544672), +LPF_TAPS(-0.000568990229048854), +LPF_TAPS(-0.001775110220014063), +LPF_TAPS(-0.001966837577216155), +LPF_TAPS(-0.001059194741754679), +LPF_TAPS(0.000418905665507703), +LPF_TAPS(0.001632236889739084), +LPF_TAPS(0.001910779346758654), +LPF_TAPS(0.001119239329794093), +LPF_TAPS(-0.000278957153502074), +LPF_TAPS(-0.001492348501730395), +LPF_TAPS(-0.001849045501035285), +LPF_TAPS(-0.001168348139089120), +LPF_TAPS(0.000148926072484010), +LPF_TAPS(0.001355802588405122), +LPF_TAPS(0.001782351418086488), +LPF_TAPS(0.001207175505238443), +LPF_TAPS(-0.000028593644051682), +LPF_TAPS(-0.001222932363673511), +LPF_TAPS(-0.001711379745094406), +LPF_TAPS(-0.001236355027529776), +LPF_TAPS(-0.000082262645572483), +LPF_TAPS(0.001094045657568108), +LPF_TAPS(0.001636782095705366), +LPF_TAPS(0.001256502748029804), +LPF_TAPS(0.000183871792903588), +LPF_TAPS(-0.000969424020057980), +LPF_TAPS(-0.001559180225390086), +LPF_TAPS(-0.001268219467708550), +LPF_TAPS(-0.000276471323693381), +LPF_TAPS(0.000849321996303103), +LPF_TAPS(0.001479166804407970), +LPF_TAPS(0.001272092358430086), +LPF_TAPS(0.000360308744410595), +LPF_TAPS(-0.000733966574376958), +LPF_TAPS(-0.001397305885589660), +LPF_TAPS(-0.001268696001060262), +LPF_TAPS(-0.000435642486386754), +LPF_TAPS(0.000623556805271501), +LPF_TAPS(0.001314133146421482), +LPF_TAPS(0.001258592957444364), +LPF_TAPS(0.000502742416153757), +LPF_TAPS(-0.000518263593805743), +LPF_TAPS(-0.001230155970706030), +LPF_TAPS(-0.001242333966140826), +LPF_TAPS(-0.000561889974384736), +LPF_TAPS(0.000418229657899272), +LPF_TAPS(0.001145853423567001), +LPF_TAPS(0.001220457837477517), +LPF_TAPS(0.000613377997052172), +LPF_TAPS(-0.000323569652552237), +LPF_TAPS(-0.001061676164149839), +LPF_TAPS(-0.001193491111907350), +LPF_TAPS(-0.000657510265401049), +LPF_TAPS(0.000234370453800612), +LPF_TAPS(0.000978046332583554), +LPF_TAPS(0.001161947536166415), +LPF_TAPS(0.000694600825682696), +LPF_TAPS(-0.000150691596899802), +LPF_TAPS(-0.000895357441261970), +LPF_TAPS(-0.001126327403911303), +LPF_TAPS(-0.000724973114994913), +LPF_TAPS(0.000072565862038648), +LPF_TAPS(0.000813974295010493), +LPF_TAPS(0.001087116800973934), +LPF_TAPS(0.000748958925783496), +LPF_TAPS(-0.000000000000000005), +LPF_TAPS(-0.000734232960023325), +LPF_TAPS(-0.001044786789848272), +LPF_TAPS(-0.000766897238393383), +LPF_TAPS(-0.000067024410620718), +LPF_TAPS(0.000656440797430408), +LPF_TAPS(0.000999792563301986), +LPF_TAPS(0.000779132948370269), +LPF_TAPS(0.000128549983756101), +LPF_TAPS(-0.000580876573863252), +LPF_TAPS(-0.000952572592922853), +LPF_TAPS(-0.000786015512894041), +LPF_TAPS(-0.000184642433526538), +LPF_TAPS(0.000507790658341669), +LPF_TAPS(0.000903547794839196), +LPF_TAPS(0.000787897538687086), +LPF_TAPS(0.000235389379531954), +LPF_TAPS(-0.000437405312127583), +LPF_TAPS(-0.000853120731696568), +LPF_TAPS(-0.000785133331916735), +LPF_TAPS(-0.000280899060553020), +LPF_TAPS(0.000369915075832187), +LPF_TAPS(0.000801674867154103), +LPF_TAPS(0.000778077428948392), +LPF_TAPS(0.000321298967809247), +LPF_TAPS(-0.000305487255974598), +LPF_TAPS(-0.000749573886623857), +LPF_TAPS(-0.000767083125267112), +LPF_TAPS(-0.000356734409198346), +LPF_TAPS(0.000244262511342674), +LPF_TAPS(0.000697161095670107), +LPF_TAPS(0.000752501018436972), +LPF_TAPS(0.000387367016124019), +LPF_TAPS(-0.000186355537869023), +LPF_TAPS(-0.000644758905377691), +LPF_TAPS(-0.000734677579588487), +LPF_TAPS(-0.000413373204608623), +LPF_TAPS(0.000131855849291230), +LPF_TAPS(0.000592668412062428), +LPF_TAPS(0.000713953766598160), +LPF_TAPS(0.000434942602384354), +LPF_TAPS(-0.000080828649596569), +LPF_TAPS(-0.000541169076912061), +LPF_TAPS(-0.000690663690836736), +LPF_TAPS(-0.000452276453563864), +LPF_TAPS(0.000033315792142107), +LPF_TAPS(0.000490518509497743), +LPF_TAPS(0.000665133348108233), +LPF_TAPS(0.000465586012311272), +LPF_TAPS(0.000010663180613739), +LPF_TAPS(-0.000440952357572390), +LPF_TAPS(-0.000637679423173593), +LPF_TAPS(-0.000475090936671043), +LPF_TAPS(-0.000051109923647480), +LPF_TAPS(0.000392684304164983), +LPF_TAPS(0.000608608176048614), +LPF_TAPS(0.000481017693369305), +LPF_TAPS(0.000088046109734778), +LPF_TAPS(-0.000345906171682450), +LPF_TAPS(-0.000578214417085338), +LPF_TAPS(-0.000483597983984493), +LPF_TAPS(-0.000121512191754436), +LPF_TAPS(0.000300788131540266), +LPF_TAPS(0.000546780576689613), +LPF_TAPS(0.000483067202397602), +LPF_TAPS(0.000151566115476765), +LPF_TAPS(-0.000257479016753594), +LPF_TAPS(-0.000514575874397409), +LPF_TAPS(-0.000479662932881307), +LPF_TAPS(-0.000178281991696848), +LPF_TAPS(0.000216106733933253), +LPF_TAPS(0.000481855590931383), +LPF_TAPS(0.000473623497580101), +LPF_TAPS(0.000201748736780270), +LPF_TAPS(-0.000176778770242168), +LPF_TAPS(-0.000448860445790772), +LPF_TAPS(-0.000465186561474686), +LPF_TAPS(-0.000222068690791697), +LPF_TAPS(0.000139582790075373), +LPF_TAPS(0.000415816081895713), +LPF_TAPS(0.000454587802221318), +LPF_TAPS(0.000239356222381871), +LPF_TAPS(-0.000104587315532687), +LPF_TAPS(-0.000382932657815871), +LPF_TAPS(-0.000442059651518030), +LPF_TAPS(-0.000253736329520328), +LPF_TAPS(0.000071842484152793), +LPF_TAPS(0.000350404547166695), +LPF_TAPS(0.000427830113880309), +LPF_TAPS(0.000265343244988183), +LPF_TAPS(-0.000041380876871214), +LPF_TAPS(-0.000318410143859715), +LPF_TAPS(-0.000412121667917977), +LPF_TAPS(-0.000274319055291023), +LPF_TAPS(0.000013218408751720), +LPF_TAPS(0.000287111771048686), +LPF_TAPS(0.000395150254398941), +LPF_TAPS(0.000280812341324255), +LPF_TAPS(0.000012644725282694), +LPF_TAPS(-0.000256655690826361), +LPF_TAPS(-0.000377124354571515), +LPF_TAPS(-0.000284976848729387), +LPF_TAPS(-0.000036223057728650), +LPF_TAPS(0.000227172210999713), +LPF_TAPS(0.000358244161402881), +LPF_TAPS(0.000286970195424601), +LPF_TAPS(0.000057544816948299), +LPF_TAPS(-0.000198775884607860), +LPF_TAPS(-0.000338700845583232), +LPF_TAPS(-0.000286952623285186), +LPF_TAPS(-0.000076650865007591), +LPF_TAPS(0.000171565797249007), +LPF_TAPS(0.000318675917350350), +LPF_TAPS(0.000285085800395328), +LPF_TAPS(0.000093593613118962), +LPF_TAPS(-0.000145625936753519), +LPF_TAPS(-0.000298340684414148), +LPF_TAPS(-0.000281531679699815), +LPF_TAPS(-0.000108435922812569), +LPF_TAPS(0.000121025639279983), +LPF_TAPS(0.000277855805510942), +LPF_TAPS(0.000276451419258910), +LPF_TAPS(0.000121250000801888), +LPF_TAPS(-0.000097820105521335), +LPF_TAPS(-0.000257370938398959), +LPF_TAPS(-0.000270004368660097), +LPF_TAPS(-0.000132116295283924), +LPF_TAPS(0.000076050980390099), +LPF_TAPS(0.000237024480424446), +LPF_TAPS(0.000262347125473069), +LPF_TAPS(0.000141122401127468), +LPF_TAPS(-0.000055746989303841), +LPF_TAPS(-0.000216943399147082), +LPF_TAPS(-0.000253632664955913), +LPF_TAPS(-0.000148361981060471), +LPF_TAPS(0.000036924624014180), +LPF_TAPS(0.000197243149918068), +LPF_TAPS(0.000244009545538509), +LPF_TAPS(0.000153933709573879), +LPF_TAPS(-0.000019588870814477), +LPF_TAPS(-0.000178027676757870), +LPF_TAPS(-0.000233621191929532), +LPF_TAPS(-0.000157940245821130), +LPF_TAPS(0.000003733973919304), +LPF_TAPS(0.000159389492386513), +LPF_TAPS(0.000222605257022561), +LPF_TAPS(0.000160487241315340), +LPF_TAPS(0.000010655773168138), +LPF_TAPS(-0.000141409832819944), +LPF_TAPS(-0.000211093063120906), +LPF_TAPS(-0.000161682387716431), +LPF_TAPS(-0.000023605215399143), +LPF_TAPS(0.000124158881563270), +LPF_TAPS(0.000199209122364984), +LPF_TAPS(0.000161634509463345), +LPF_TAPS(0.000035147509988554), +LPF_TAPS(-0.000107696058106567), +LPF_TAPS(-0.000187070735635932), +LPF_TAPS(-0.000160452705449426), +LPF_TAPS(-0.000045323293046136), +LPF_TAPS(0.000092070365163552), +LPF_TAPS(0.000174787668629224), +LPF_TAPS(0.000158245543366951), +LPF_TAPS(0.000054179845537360), +LPF_TAPS(-0.000077320788885710), +LPF_TAPS(-0.000162461903246604), +LPF_TAPS(-0.000155120309766295), +LPF_TAPS(-0.000061770264784565), +LPF_TAPS(0.000063476746136257), +LPF_TAPS(0.000150187461947657), +LPF_TAPS(0.000151182318291936), +LPF_TAPS(0.000068152647381547), +LPF_TAPS(-0.000050558572817687), +LPF_TAPS(-0.000138050302236821), +LPF_TAPS(-0.000146534277977078), +LPF_TAPS(-0.000073389289019584), +LPF_TAPS(0.000038578047211531), +LPF_TAPS(0.000126128278040423), +LPF_TAPS(0.000141275722906487), +LPF_TAPS(0.000077545906315898), +LPF_TAPS(-0.000027538942308942), +LPF_TAPS(-0.000114491164353880), +LPF_TAPS(-0.000135502503998360), +LPF_TAPS(-0.000080690885301903), +LPF_TAPS(0.000017437601182228), +LPF_TAPS(0.000103200741212745), +LPF_TAPS(0.000129306343115324), +LPF_TAPS(0.000082894560772723), +LPF_TAPS(-0.000008263529568140), +LPF_TAPS(-0.000092310932764303), +LPF_TAPS(-0.000122774449196541), +LPF_TAPS(-0.000084228530228097), +LPF_TAPS(0.000000000000000001), +LPF_TAPS(0.000081867996989454), +LPF_TAPS(0.000115989195611307), +LPF_TAPS(0.000084765005651504), +LPF_TAPS(0.000007375337964748), +LPF_TAPS(-0.000071910761447583), +LPF_TAPS(-0.000109027857473073), +LPF_TAPS(-0.000084576205885109), +LPF_TAPS(-0.000013889846627700), +LPF_TAPS(0.000062470900289848), +LPF_TAPS(0.000101962407224727), +LPF_TAPS(0.000083733791868213), +LPF_TAPS(0.000019575293067346), +LPF_TAPS(-0.000053573247707659), +LPF_TAPS(-0.000094859366413814), +LPF_TAPS(-0.000082308346520089), +LPF_TAPS(-0.000024467250702803), +LPF_TAPS(0.000045236142951916), +LPF_TAPS(0.000087779711222512), +LPF_TAPS(0.000080368900569730), +LPF_TAPS(0.000028604513776213), +LPF_TAPS(-0.000037471802072892), +LPF_TAPS(-0.000080778829003251), +LPF_TAPS(-0.000077982505169364), +LPF_TAPS(-0.000032028528666751), +LPF_TAPS(0.000030286711588387), +LPF_TAPS(0.000073906522798216), +LPF_TAPS(0.000075213851679169), +LPF_TAPS(0.000034782845571742), +LPF_TAPS(-0.000023682039386360), +LPF_TAPS(-0.000067207060590316), +LPF_TAPS(-0.000072124938581478), +LPF_TAPS(-0.000036912593701199), +LPF_TAPS(0.000017654058304802), +LPF_TAPS(0.000060719265845020), +LPF_TAPS(0.000068774785077135), +LPF_TAPS(0.000038463982734246), +LPF_TAPS(-0.000012194578003053), +LPF_TAPS(-0.000054476645756378), +LPF_TAPS(-0.000065219190537468), +LPF_TAPS(-0.000039483832884655), +LPF_TAPS(0.000007291380941630), +LPF_TAPS(0.000048507553506201), +LPF_TAPS(0.000061510538634914), +LPF_TAPS(0.000040019135521818), +LPF_TAPS(-0.000002928658518456), +LPF_TAPS(-0.000042835380781844), +LPF_TAPS(-0.000057697644656153), +LPF_TAPS(-0.000040116645897143), +LPF_TAPS(-0.000000912556335678), +LPF_TAPS(0.000037478776773538), +LPF_TAPS(0.000053825644215059), +LPF_TAPS(0.000039822509137849), +LPF_TAPS(0.000004253963524157), +LPF_TAPS(-0.000032451889885582), +LPF_TAPS(-0.000049935921330255), +LPF_TAPS(-0.000039181920293943), +LPF_TAPS(-0.000007119580243999), +LPF_TAPS(0.000027764628444526), +LPF_TAPS(0.000046066073614426), +LPF_TAPS(0.000038238818863166), +LPF_TAPS(0.000009535338363085), +LPF_TAPS(-0.000023422936769313), +LPF_TAPS(-0.000042249912140231), +LPF_TAPS(-0.000037035617875765), +LPF_TAPS(-0.000011528697227208), +LPF_TAPS(0.000019429083080919), +LPF_TAPS(0.000038517493400618), +LPF_TAPS(0.000035612967298774), +LPF_TAPS(0.000013128274090703), +LPF_TAPS(-0.000015781955869275), +LPF_TAPS(-0.000034895180669362), +LPF_TAPS(-0.000034009551220323), +LPF_TAPS(-0.000014363494044602), +LPF_TAPS(0.000012477365500132), +LPF_TAPS(0.000031405731989841), +LPF_TAPS(0.000032261918000294), +LPF_TAPS(0.000015264260998860), +LPF_TAPS(-0.000009508348030975), +LPF_TAPS(-0.000028068411975450), +LPF_TAPS(-0.000030404342325949), +LPF_TAPS(-0.000015860650962998), +LPF_TAPS(0.000006865468409934), +LPF_TAPS(0.000024899124592205), +LPF_TAPS(0.000028468717891133), +LPF_TAPS(0.000016182628565960), +LPF_TAPS(-0.000004537120451352), +LPF_TAPS(-0.000021910564111253), +LPF_TAPS(-0.000026484479226179), +LPF_TAPS(-0.000016259787463952), +LPF_TAPS(0.000002509821213062), +LPF_TAPS(0.000019112381464281), +LPF_TAPS(0.000024478551043080), +LPF_TAPS(0.000016121115006902), +LPF_TAPS(-0.000000768497640292), +LPF_TAPS(-0.000016511363305968), +LPF_TAPS(-0.000022475323326984), +LPF_TAPS(-0.000015794781272331), +LPF_TAPS(-0.000000703236414013), +LPF_TAPS(0.000014111621182239), +LPF_TAPS(0.000020496650300343), +LPF_TAPS(0.000015307952332069), +LPF_TAPS(0.000001922814435766), +LPF_TAPS(-0.000011914788318634), +LPF_TAPS(-0.000018561871309492), +LPF_TAPS(-0.000014686627393690), +LPF_TAPS(-0.000002908464160586), +LPF_TAPS(0.000009920221676887), +LPF_TAPS(0.000016687851634161), +LPF_TAPS(0.000013955499256432), +LPF_TAPS(0.000003678968304326), +LPF_TAPS(-0.000008125207077045), +LPF_TAPS(-0.000014889041197294), +LPF_TAPS(-0.000013137837341611), +LPF_TAPS(-0.000004253440033178), +LPF_TAPS(0.000006525165344347), +LPF_TAPS(0.000013177549153965), +LPF_TAPS(0.000012255392400844), +LPF_TAPS(0.000004651113866717), +LPF_TAPS(-0.000005113857611770), +LPF_TAPS(-0.000011563232362672), +LPF_TAPS(-0.000011328321872127), +LPF_TAPS(-0.000004891152491910), +LPF_TAPS(0.000003883588087799), +LPF_TAPS(0.000010053795787783), +LPF_TAPS(0.000010375134744049), +LPF_TAPS(0.000004992469763834), +LPF_TAPS(-0.000002825402781922), +LPF_TAPS(-0.000008654902946414), +LPF_TAPS(-0.000009412654701919), +LPF_TAPS(-0.000004973569981430), +LPF_TAPS(0.000001929282864789), +LPF_TAPS(0.000007370294594349), +LPF_TAPS(0.000008456000265721), +LPF_TAPS(0.000004852403355266), +LPF_TAPS(-0.000001184331523467), +LPF_TAPS(-0.000006201913941494), +LPF_TAPS(-0.000007518580587867), +LPF_TAPS(-0.000004646237430354), +LPF_TAPS(0.000000578953352335), +LPF_TAPS(0.000005150036795236), +LPF_TAPS(0.000006612105557627), +LPF_TAPS(0.000004371544091072), +LPF_TAPS(-0.000000101025494664), +LPF_TAPS(-0.000004213405147821), +LPF_TAPS(-0.000005746608857426), +LPF_TAPS(-0.000004043901657974), +LPF_TAPS(-0.000000261940083240), +LPF_TAPS(0.000003389362848789), +LPF_TAPS(0.000004930482632690), +LPF_TAPS(0.000003677911487767), +LPF_TAPS(0.000000522643645981), +LPF_TAPS(-0.000002673992133367), +LPF_TAPS(-0.000004170522469635), +LPF_TAPS(-0.000003287128408051), +LPF_TAPS(-0.000000693854385419), +LPF_TAPS(0.000002062249910138), +LPF_TAPS(0.000003471981422733), +LPF_TAPS(0.000002884004257187), +LPF_TAPS(0.000000788276939661), +LPF_TAPS(-0.000001548102844057), +LPF_TAPS(-0.000002838631893487), +LPF_TAPS(-0.000002479843756310), +LPF_TAPS(-0.000000818427794343), +LPF_TAPS(0.000001124660401793), +LPF_TAPS(0.000002272834232693), +LPF_TAPS(0.000002084771914283), +LPF_TAPS(0.000000796521519526), +LPF_TAPS(-0.000000784305153524), +LPF_TAPS(-0.000001775611017371), +LPF_TAPS(-0.000001707712156148), +LPF_TAPS(-0.000000734366703963), +LPF_TAPS(0.000000518819746823), +LPF_TAPS(0.000001346726039086), +LPF_TAPS(0.000001356374370310), +LPF_TAPS(0.000000643271372107), +LPF_TAPS(-0.000000319510082535), +LPF_TAPS(-0.000000984767130185), +LPF_TAPS(-0.000001037252087726), +LPF_TAPS(-0.000000533957607898), +LPF_TAPS(0.000000177324328124), +LPF_TAPS(0.000000687232046705), +LPF_TAPS(0.000000755628036388), +LPF_TAPS(0.000000416485063055), +LPF_TAPS(-0.000000082967499633), +LPF_TAPS(-0.000000450616719176), +LPF_TAPS(-0.000000515587354585), +LPF_TAPS(-0.000000300182995740), +LPF_TAPS(0.000000027011428177), +LPF_TAPS(0.000000270505273607), +LPF_TAPS(0.000000320037795188), +LPF_TAPS(0.000000193590467381), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000141661312606), +LPF_TAPS(-0.000000170736308622), +LPF_TAPS(-0.000000104404320415), +LPF_TAPS(-0.000000007450379918), +LPF_TAPS(0.000000058120029422), +LPF_TAPS(0.000000068321452499), +LPF_TAPS(0.000000039434566462), +LPF_TAPS(0.000000004555102241), +LPF_TAPS(-0.000000013280804131), +LPF_TAPS(-0.000000012351139235), +LPF_TAPS(-0.000000004566831930), +LPF_TAPS(-0.000000000270411184), +LPF_TAPS(0.000000000000000000), +}; diff --git a/core/sound/blip_lpf_96K.h b/core/sound/blip_lpf_96K.h new file mode 100644 index 000000000..337bc7542 --- /dev/null +++ b/core/sound/blip_lpf_96K.h @@ -0,0 +1,6 @@ +/* 96K sampling, 2K cutoff, 3K transition */ +enum { blip_lpf_96K_taps = 149 }; + + +#include "blip_lpf_96K_24K.h" +#include "blip_lpf_96K_48K.h" diff --git a/core/sound/blip_lpf_96K_24K.h b/core/sound/blip_lpf_96K_24K.h new file mode 100644 index 000000000..3bea654e0 --- /dev/null +++ b/core/sound/blip_lpf_96K_24K.h @@ -0,0 +1,151 @@ +static buf_t const blip_lpf_96K_24K[blip_lpf_96K_taps] = { +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000701708496922), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000006526941230716), +LPF_TAPS(0.000003086174321712), +LPF_TAPS(-0.000017562355331373), +LPF_TAPS(-0.000013983752058089), +LPF_TAPS(0.000030897117874493), +LPF_TAPS(0.000036845200332407), +LPF_TAPS(-0.000041175536588245), +LPF_TAPS(-0.000074255894369925), +LPF_TAPS(0.000040812226421973), +LPF_TAPS(0.000126146936811878), +LPF_TAPS(-0.000020604771748354), +LPF_TAPS(-0.000188724141316930), +LPF_TAPS(-0.000029173032704737), +LPF_TAPS(0.000253585610710458), +LPF_TAPS(0.000117164314451904), +LPF_TAPS(-0.000307253598820201), +LPF_TAPS(-0.000248860398155740), +LPF_TAPS(0.000331371187525320), +LPF_TAPS(0.000424233064773930), +LPF_TAPS(-0.000303794660088205), +LPF_TAPS(-0.000635351123521239), +LPF_TAPS(0.000200738385905457), +LPF_TAPS(0.000864371546408451), +LPF_TAPS(-0.000000000000000010), +LPF_TAPS(-0.001082363393076616), +LPF_TAPS(-0.000314879761646322), +LPF_TAPS(0.001249428733550099), +LPF_TAPS(0.000749864524294362), +LPF_TAPS(-0.001316512932465652), +LPF_TAPS(-0.001295608098165062), +LPF_TAPS(0.001229142584712964), +LPF_TAPS(0.001923257171696114), +LPF_TAPS(-0.000933102744204027), +LPF_TAPS(-0.002581621887633276), +LPF_TAPS(0.000381790053630705), +LPF_TAPS(0.003196436815514680), +LPF_TAPS(0.000455308268491780), +LPF_TAPS(-0.003672291924219871), +LPF_TAPS(-0.001583812755983461), +LPF_TAPS(0.003897558987902193), +LPF_TAPS(0.002976302417062643), +LPF_TAPS(-0.003752294656353574), +LPF_TAPS(-0.004565839676857047), +LPF_TAPS(0.003118705184201384), +LPF_TAPS(0.006242078083372391), +LPF_TAPS(-0.001893360144979369), +LPF_TAPS(-0.007850564394344390), +LPF_TAPS(0.000000000000000042), +LPF_TAPS(0.009195349733646911), +LPF_TAPS(0.002598450251324513), +LPF_TAPS(-0.010044302454275438), +LPF_TAPS(-0.005890127809141893), +LPF_TAPS(0.010135492919056117), +LPF_TAPS(0.009808104202461783), +LPF_TAPS(-0.009181469455383524), +LPF_TAPS(-0.014228963148724134), +LPF_TAPS(0.006865511849241973), +LPF_TAPS(0.018976718875527550), +LPF_TAPS(-0.002818154096629675), +LPF_TAPS(-0.023832149121100512), +LPF_TAPS(-0.003452366427128846), +LPF_TAPS(0.028547006304230925), +LPF_TAPS(0.012745589635669397), +LPF_TAPS(-0.032861984682323937), +LPF_TAPS(-0.026695612427201355), +LPF_TAPS(0.036526836527406958), +LPF_TAPS(0.049580913855936638), +LPF_TAPS(-0.039320712347764498), +LPF_TAPS(-0.097376548791218737), +LPF_TAPS(0.041070695496571295), +LPF_TAPS(0.315353296251168147), +LPF_TAPS(0.458332933341161874), +LPF_TAPS(0.315353296251168147), +LPF_TAPS(0.041070695496571302), +LPF_TAPS(-0.097376548791218737), +LPF_TAPS(-0.039320712347764505), +LPF_TAPS(0.049580913855936638), +LPF_TAPS(0.036526836527406958), +LPF_TAPS(-0.026695612427201365), +LPF_TAPS(-0.032861984682323937), +LPF_TAPS(0.012745589635669397), +LPF_TAPS(0.028547006304230925), +LPF_TAPS(-0.003452366427128846), +LPF_TAPS(-0.023832149121100522), +LPF_TAPS(-0.002818154096629675), +LPF_TAPS(0.018976718875527557), +LPF_TAPS(0.006865511849241973), +LPF_TAPS(-0.014228963148724134), +LPF_TAPS(-0.009181469455383529), +LPF_TAPS(0.009808104202461783), +LPF_TAPS(0.010135492919056122), +LPF_TAPS(-0.005890127809141894), +LPF_TAPS(-0.010044302454275435), +LPF_TAPS(0.002598450251324513), +LPF_TAPS(0.009195349733646914), +LPF_TAPS(0.000000000000000042), +LPF_TAPS(-0.007850564394344388), +LPF_TAPS(-0.001893360144979369), +LPF_TAPS(0.006242078083372392), +LPF_TAPS(0.003118705184201384), +LPF_TAPS(-0.004565839676857049), +LPF_TAPS(-0.003752294656353575), +LPF_TAPS(0.002976302417062643), +LPF_TAPS(0.003897558987902192), +LPF_TAPS(-0.001583812755983463), +LPF_TAPS(-0.003672291924219874), +LPF_TAPS(0.000455308268491780), +LPF_TAPS(0.003196436815514683), +LPF_TAPS(0.000381790053630706), +LPF_TAPS(-0.002581621887633277), +LPF_TAPS(-0.000933102744204027), +LPF_TAPS(0.001923257171696116), +LPF_TAPS(0.001229142584712963), +LPF_TAPS(-0.001295608098165061), +LPF_TAPS(-0.001316512932465654), +LPF_TAPS(0.000749864524294363), +LPF_TAPS(0.001249428733550099), +LPF_TAPS(-0.000314879761646322), +LPF_TAPS(-0.001082363393076616), +LPF_TAPS(-0.000000000000000010), +LPF_TAPS(0.000864371546408451), +LPF_TAPS(0.000200738385905457), +LPF_TAPS(-0.000635351123521240), +LPF_TAPS(-0.000303794660088205), +LPF_TAPS(0.000424233064773931), +LPF_TAPS(0.000331371187525320), +LPF_TAPS(-0.000248860398155740), +LPF_TAPS(-0.000307253598820201), +LPF_TAPS(0.000117164314451904), +LPF_TAPS(0.000253585610710458), +LPF_TAPS(-0.000029173032704737), +LPF_TAPS(-0.000188724141316931), +LPF_TAPS(-0.000020604771748354), +LPF_TAPS(0.000126146936811877), +LPF_TAPS(0.000040812226421973), +LPF_TAPS(-0.000074255894369925), +LPF_TAPS(-0.000041175536588245), +LPF_TAPS(0.000036845200332407), +LPF_TAPS(0.000030897117874494), +LPF_TAPS(-0.000013983752058089), +LPF_TAPS(-0.000017562355331373), +LPF_TAPS(0.000003086174321712), +LPF_TAPS(0.000006526941230715), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000701708496923), +LPF_TAPS(0.000000000000000000), +}; diff --git a/core/sound/blip_lpf_96K_48K.h b/core/sound/blip_lpf_96K_48K.h new file mode 100644 index 000000000..fbbd96fcb --- /dev/null +++ b/core/sound/blip_lpf_96K_48K.h @@ -0,0 +1,151 @@ +static buf_t const blip_lpf_96K_48K[blip_lpf_96K_taps] = { +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000092381758809), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(0.000000859288883037), +LPF_TAPS(-0.000003086177081482), +LPF_TAPS(0.000007274572270650), +LPF_TAPS(-0.000013983764562867), +LPF_TAPS(0.000023708213596591), +LPF_TAPS(-0.000036845233280721), +LPF_TAPS(0.000053661052007767), +LPF_TAPS(-0.000074255960772238), +LPF_TAPS(0.000098529518647157), +LPF_TAPS(-0.000126147049617042), +LPF_TAPS(0.000156508919705138), +LPF_TAPS(-0.000188724310080899), +LPF_TAPS(0.000221591381302565), +LPF_TAPS(-0.000253585837475903), +LPF_TAPS(0.000282859929919310), +LPF_TAPS(-0.000307253873577503), +LPF_TAPS(0.000324321475191690), +LPF_TAPS(-0.000331371483849456), +LPF_TAPS(0.000325525770890753), +LPF_TAPS(-0.000303794931752394), +LPF_TAPS(0.000263171287568576), +LPF_TAPS(-0.000200738565412977), +LPF_TAPS(0.000113796774689262), +LPF_TAPS(-0.000000000000000012), +LPF_TAPS(-0.000142495971420656), +LPF_TAPS(0.000314880043223212), +LPF_TAPS(-0.000517530789449474), +LPF_TAPS(0.000749865194850437), +LPF_TAPS(-0.001010196806458020), +LPF_TAPS(0.001295609256744784), +LPF_TAPS(-0.001601851235669701), +LPF_TAPS(0.001923258891542412), +LPF_TAPS(-0.002252711314599227), +LPF_TAPS(0.002581624196213172), +LPF_TAPS(-0.002899985963333183), +LPF_TAPS(0.003196439673884358), +LPF_TAPS(-0.003458412745589792), +LPF_TAPS(0.003672295208116436), +LPF_TAPS(-0.003823665655012165), +LPF_TAPS(0.003897562473240722), +LPF_TAPS(-0.003878796295721843), +LPF_TAPS(0.003752298011791477), +LPF_TAPS(-0.003503495139787102), +LPF_TAPS(0.003118707973060552), +LPF_TAPS(-0.002585555711620335), +LPF_TAPS(0.001893361838090584), +LPF_TAPS(-0.001033547334220734), +LPF_TAPS(0.000000000000000055), +LPF_TAPS(0.001210591841178303), +LPF_TAPS(-0.002598452574953052), +LPF_TAPS(0.004160490021595888), +LPF_TAPS(-0.005890133076307769), +LPF_TAPS(0.007777244207948916), +LPF_TAPS(-0.009808112973224117), +LPF_TAPS(0.011965534654227609), +LPF_TAPS(-0.014228975872778828), +LPF_TAPS(0.016574826640870784), +LPF_TAPS(-0.018976735845197538), +LPF_TAPS(0.021406024711794043), +LPF_TAPS(-0.023832170432672221), +LPF_TAPS(0.026223349937347668), +LPF_TAPS(-0.028547031831998824), +LPF_TAPS(0.030770602875039004), +LPF_TAPS(-0.032862014068701928), +LPF_TAPS(0.034790430569500291), +LPF_TAPS(-0.036526869191028370), +LPF_TAPS(0.038044807311335589), +LPF_TAPS(-0.039320747509770888), +LPF_TAPS(0.040334723235147786), +LPF_TAPS(-0.041070732223476049), +LPF_TAPS(0.041517086199934598), +LPF_TAPS(0.958333353961726031), +LPF_TAPS(0.041517086199934598), +LPF_TAPS(-0.041070732223476056), +LPF_TAPS(0.040334723235147786), +LPF_TAPS(-0.039320747509770895), +LPF_TAPS(0.038044807311335589), +LPF_TAPS(-0.036526869191028370), +LPF_TAPS(0.034790430569500298), +LPF_TAPS(-0.032862014068701928), +LPF_TAPS(0.030770602875039004), +LPF_TAPS(-0.028547031831998824), +LPF_TAPS(0.026223349937347668), +LPF_TAPS(-0.023832170432672228), +LPF_TAPS(0.021406024711794047), +LPF_TAPS(-0.018976735845197549), +LPF_TAPS(0.016574826640870784), +LPF_TAPS(-0.014228975872778828), +LPF_TAPS(0.011965534654227615), +LPF_TAPS(-0.009808112973224117), +LPF_TAPS(0.007777244207948919), +LPF_TAPS(-0.005890133076307770), +LPF_TAPS(0.004160490021595888), +LPF_TAPS(-0.002598452574953052), +LPF_TAPS(0.001210591841178303), +LPF_TAPS(0.000000000000000055), +LPF_TAPS(-0.001033547334220734), +LPF_TAPS(0.001893361838090585), +LPF_TAPS(-0.002585555711620336), +LPF_TAPS(0.003118707973060552), +LPF_TAPS(-0.003503495139787103), +LPF_TAPS(0.003752298011791478), +LPF_TAPS(-0.003878796295721843), +LPF_TAPS(0.003897562473240721), +LPF_TAPS(-0.003823665655012169), +LPF_TAPS(0.003672295208116439), +LPF_TAPS(-0.003458412745589795), +LPF_TAPS(0.003196439673884361), +LPF_TAPS(-0.002899985963333184), +LPF_TAPS(0.002581624196213173), +LPF_TAPS(-0.002252711314599227), +LPF_TAPS(0.001923258891542414), +LPF_TAPS(-0.001601851235669700), +LPF_TAPS(0.001295609256744783), +LPF_TAPS(-0.001010196806458021), +LPF_TAPS(0.000749865194850438), +LPF_TAPS(-0.000517530789449474), +LPF_TAPS(0.000314880043223212), +LPF_TAPS(-0.000142495971420657), +LPF_TAPS(-0.000000000000000012), +LPF_TAPS(0.000113796774689262), +LPF_TAPS(-0.000200738565412977), +LPF_TAPS(0.000263171287568577), +LPF_TAPS(-0.000303794931752394), +LPF_TAPS(0.000325525770890754), +LPF_TAPS(-0.000331371483849456), +LPF_TAPS(0.000324321475191690), +LPF_TAPS(-0.000307253873577503), +LPF_TAPS(0.000282859929919310), +LPF_TAPS(-0.000253585837475903), +LPF_TAPS(0.000221591381302565), +LPF_TAPS(-0.000188724310080900), +LPF_TAPS(0.000156508919705138), +LPF_TAPS(-0.000126147049617042), +LPF_TAPS(0.000098529518647157), +LPF_TAPS(-0.000074255960772238), +LPF_TAPS(0.000053661052007767), +LPF_TAPS(-0.000036845233280721), +LPF_TAPS(0.000023708213596591), +LPF_TAPS(-0.000013983764562867), +LPF_TAPS(0.000007274572270650), +LPF_TAPS(-0.000003086177081482), +LPF_TAPS(0.000000859288883036), +LPF_TAPS(0.000000000000000000), +LPF_TAPS(-0.000000092381758809), +LPF_TAPS(0.000000000000000000), +}; diff --git a/core/sound/opll.c b/core/sound/opll.c index 260f56608..5ccd217bc 100644 --- a/core/sound/opll.c +++ b/core/sound/opll.c @@ -1,6 +1,6 @@ #ifdef HAVE_OPLL_CORE /* - * Copyright (C) 2019 Nuke.YKT + * Copyright (C) 2019-2023 Nuke.YKT * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: @@ -38,7 +38,7 @@ * siliconpr0n.org(digshadow, John McMaster): * VRC VII decap and die shot. * - * version: 1.0 + * version: 1.0.2 */ #include @@ -153,7 +153,7 @@ static const opll_patch_t patch_ds1001[opll_patch_max] = { { 0x00, 0x00, 0x00, 0x00,{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x01, 0x00 },{ 0x00, 0x00 },{ 0x0c, 0x00 },{ 0x08, 0x00 },{ 0x0a, 0x00 },{ 0x07, 0x00 } }, { 0x00, 0x00, 0x00, 0x00,{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x05, 0x00 },{ 0x00, 0x00 },{ 0x0f, 0x00 },{ 0x08, 0x00 },{ 0x05, 0x00 },{ 0x09, 0x00 } }, { 0x00, 0x00, 0x00, 0x00,{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x01 },{ 0x00, 0x00 },{ 0x00, 0x0f },{ 0x00, 0x08 },{ 0x00, 0x06 },{ 0x00, 0x0d } }, - { 0x00, 0x00, 0x00, 0x00,{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x01 },{ 0x00, 0x00 },{ 0x00, 0x0d },{ 0x00, 0x08 },{ 0x00, 0x06 },{ 0x00, 0x08 } }, + { 0x00, 0x00, 0x00, 0x00,{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x01 },{ 0x00, 0x00 },{ 0x00, 0x0d },{ 0x00, 0x08 },{ 0x00, 0x04 },{ 0x00, 0x08 } }, { 0x00, 0x00, 0x00, 0x00,{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x01 },{ 0x00, 0x00 },{ 0x00, 0x0a },{ 0x00, 0x0a },{ 0x00, 0x05 },{ 0x00, 0x05 } } }; @@ -417,8 +417,8 @@ void OPLL_PreparePatch2(opll_t *chip) { void OPLL_PhaseGenerate(opll_t *chip) { uint32_t ismod; uint32_t phase; - uint8_t rm_bit; uint16_t pg_out; + uint8_t rm_bit; chip->pg_phase[(chip->cycles + 17) % 18] = chip->pg_phase_next + chip->pg_inc; @@ -953,6 +953,9 @@ void OPLL_Operator(opll_t *chip) { } } + if (!(chip->rm_enable & 0x80)) + routput = 0; + chip->ch_out = ismod1 ? routput : (output>>3); } diff --git a/core/sound/sound.c b/core/sound/sound.c index 40c2bbddb..1b209557b 100644 --- a/core/sound/sound.c +++ b/core/sound/sound.c @@ -239,7 +239,7 @@ static void OPLL2413_Update(int* buffer, int length) int i, j; for (i = 0; i < length; i++) { - OPLL_Clock(&opll, opll_accm[opll_cycles]); + OPLL_Clock(&opll, (int32_t *)opll_accm[opll_cycles]); opll_cycles = (opll_cycles + 1) % 18; if (opll_cycles == 0) { diff --git a/core/sound/ym2413.c b/core/sound/ym2413.c index 82bc43cf3..edef50e53 100644 --- a/core/sound/ym2413.c +++ b/core/sound/ym2413.c @@ -1183,7 +1183,7 @@ static int init_tables(void) n = n>>1; /* waveform 0: standard sinus */ - sin_tab[ i ] = n*2 + (m>=0.0? 0: 1 ); + sin_tab[ i ] = n*2 + ((m>=0.0)? 0: 1 ); /* waveform 1: __ __ */ /* / \____/ \____*/ diff --git a/core/sound/ym2612.c b/core/sound/ym2612.c index 3cba674ca..fc55e2c19 100644 --- a/core/sound/ym2612.c +++ b/core/sound/ym2612.c @@ -1843,7 +1843,7 @@ static void init_tables(void) n = n>>1; /* 13-bits (8.5) value is formatted for above 'Power' table */ - sin_tab[ i ] = n*2 + (m>=0.0? 0: 1 ); + sin_tab[ i ] = n*2 + ((m>=0.0)? 0: 1 ); } /* build LFO PM modulation table */ diff --git a/core/sound/ym3438.c b/core/sound/ym3438.c index d2debad7a..9ecc45477 100644 --- a/core/sound/ym3438.c +++ b/core/sound/ym3438.c @@ -983,6 +983,36 @@ static void OPN2_ChOutput(ym3438_t *chip) chip->mol = 0; chip->mor = 0; +#if 1 +/* https://jsgroth.dev/blog/posts/sega-cd-pcm-interpolation/ */ + { + static Bit16s ym[6][6] = {0,0,0,0,0,0}; /* hermite 6p */ + float x = 0; /* fractional pitch */ + float c0,c1,c2,c3; + int ch = 0; //chip->channel; + int out_ex; + + ym[ch][0] = ym[ch][1]; + ym[ch][1] = ym[ch][2]; + ym[ch][2] = ym[ch][3]; + ym[ch][3] = ym[ch][4]; + ym[ch][4] = ym[ch][5]; + ym[ch][5] = out; + + c0 = ym[ch][2]; + c1 = 1.0/12.0 * (ym[ch][0] - ym[ch][4]) + 2.0/3.0 * (ym[ch][3] - ym[ch][1]); + c2 = 5.0/4.0 * ym[ch][1] - 7/3 * ym[ch][2] + 5.0/3.0 * ym[ch][3] - 1.0/2.0 * ym[ch][4] + 1.0/12.0 * ym[ch][5] - 1.0/6.0 * ym[ch][0]; + c3 = 1.0/12.0 * (ym[ch][0] - ym[ch][5]) + 7.0/12.0 * (ym[ch][4] - ym[ch][1]) + 4.0/3.0 * (ym[ch][2] - ym[ch][3]); + + out_ex = (Bit16s) (((c3 * x + c2) * x + c1) * x + c0); + if (out_ex > 32767) + out_ex = 32767; + else if(out_ex < -32768) + out_ex = -32768; + out = (Bit16s) out_ex; + } +#endif + if (chip_type & ym3438_mode_ym2612) { out_en = ((cycles & 3) == 3) || test_dac; diff --git a/core/state.h b/core/state.h index 7f6e46b58..9cb5af5b6 100644 --- a/core/state.h +++ b/core/state.h @@ -39,7 +39,8 @@ #ifndef _STATE_H_ #define _STATE_H_ -#define STATE_SIZE 0xfd000 +//#define STATE_SIZE 0x120000 +#define STATE_SIZE 0x200000 #define STATE_VERSION "GENPLUS-GX 1.7.6" #define load_param(param, size) \ diff --git a/core/system.c b/core/system.c index 17491b628..9da3e3f96 100644 --- a/core/system.c +++ b/core/system.c @@ -42,8 +42,6 @@ #include "shared.h" #include "eq.h" -extern int8 audio_hard_disable; - /* Global variables */ t_bitmap bitmap; t_snd snd; @@ -89,6 +87,14 @@ int audio_init(int samplerate, double framerate) } } + /* Cart sound */ + snd.blips[3] = blip_new(samplerate / 10); + if (!snd.blips[3]) + { + audio_shutdown(); + return -1; + } + /* Initialize resampler internal rates */ audio_set_rate(samplerate, framerate); @@ -145,6 +151,8 @@ void audio_set_rate(int samplerate, double framerate) cdd_init(samplerate); } + blip_set_rates(snd.blips[3], 48000, samplerate); + /* Reinitialize internal rates */ snd.sample_rate = samplerate; snd.frame_rate = framerate; @@ -155,7 +163,7 @@ void audio_reset(void) int i; /* Clear blip buffers */ - for (i=0; i<3; i++) + for (i=0; i<4; i++) { if (snd.blips[i]) { @@ -185,12 +193,11 @@ void audio_shutdown(void) int i; /* Delete blip buffers */ - for (i=0; i<3; i++) + for (i=0; i<4; i++) { - blip_delete(snd.blips[i]); + if (snd.blips[i]) + blip_delete(snd.blips[i]); snd.blips[i] = 0; - blip_delete_buffer_state(snd.blip_states[i]); - snd.blip_states[i] = 0; } } @@ -199,8 +206,22 @@ int audio_update(int16 *buffer) /* run sound chips until end of frame */ int size = sound_update(mcycles_vdp); + if (cart.special & HW_PAPRIUM) + { + extern void paprium_audio(int samples); + paprium_audio(size); + +#ifdef ALIGN_SND + /* return an aligned number of samples if required */ + size &= ALIGN_SND; +#endif + + /* resample & mix FM/PSG, PCM & Cart streams to output buffer */ + blip_mix_samples_2(snd.blips[0], snd.blips[3], buffer, size); + } + /* Mega CD sound hardware enabled ? */ - if (snd.blips[1] && snd.blips[2]) + else if (snd.blips[1] && snd.blips[2]) { /* sync PCM chip with other sound chips */ pcm_update(size); @@ -213,14 +234,6 @@ int audio_update(int16 *buffer) size &= ALIGN_SND; #endif - if (audio_hard_disable) - { - blip_discard_samples_dirty(snd.blips[0], size); - blip_discard_samples_dirty(snd.blips[1], size); - blip_discard_samples_dirty(snd.blips[2], size); - return 0; - } - /* resample & mix FM/PSG, PCM & CD-DA streams to output buffer */ blip_mix_samples(snd.blips[0], snd.blips[1], snd.blips[2], buffer, size); } @@ -231,12 +244,6 @@ int audio_update(int16 *buffer) size &= ALIGN_SND; #endif - if (audio_hard_disable) - { - blip_discard_samples_dirty(snd.blips[0], size); - return 0; - } - /* resample FM/PSG mixed stream to output buffer */ blip_read_samples(snd.blips[0], buffer, size); } diff --git a/core/system.h b/core/system.h index 5857f838e..633c4c678 100644 --- a/core/system.h +++ b/core/system.h @@ -92,8 +92,8 @@ typedef struct int sample_rate; /* Output Sample rate (8000-48000) */ double frame_rate; /* Output Frame rate (usually 50 or 60 frames per second) */ int enabled; /* 1= sound emulation is enabled */ - blip_t* blips[3]; /* Blip Buffer resampling (stereo) */ - blip_buffer_state_t *blip_states[3]; /* states for suspending and restoring the sound buffer */ + blip_t* blips[4]; /* Blip Buffer resampling (stereo) */ + blip_buffer_state_t *blip_states[4]; /* states for suspending and restoring the sound buffer */ int fm_last_save[2]; /* For saving and restoring the sound buffer */ int16 cd_last_save[2]; /* For saving and restoring the sound buffer */ } t_snd; diff --git a/core/vdp_ctrl.c b/core/vdp_ctrl.c index b09880d29..9d01d4981 100644 --- a/core/vdp_ctrl.c +++ b/core/vdp_ctrl.c @@ -42,10 +42,23 @@ #include "shared.h" #include "hvc.h" +#if 0 +#include +#include +#endif + +//#define DEBUG_DMA +//#define DEBUG_VDP + +extern retro_log_printf_t log_cb; +static int debug_dma; +static int debug_dma_once; + extern int8 reset_do_not_clear_buffers; static int8 do_not_invalidate_tile_cache; static void vdp_set_all_vram(const uint8 *src); + static char error_str[512]; /* Mark a pattern as modified */ #define MARK_BG_DIRTY(addr) \ @@ -689,8 +702,19 @@ void vdp_dma_update(unsigned int cycles) error("[%d(%d)][%d(%d)] DMA type %d (%d access/line)(%d cycles left)-> %d access (%d remaining) (%x)\n", v_counter, (v_counter + (cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, cycles, cycles%MCYCLES_PER_LINE,dma_type, rate, dma_cycles, dma_bytes, dma_length, m68k_get_reg(M68K_REG_PC)); #endif +#if 0 +static char error_str[512]; +sprintf(error_str, "[%d(%d)][%d(%d)] DMA type %d (%d access/line)(%d cycles left)-> %d access (%d remaining) (%x)\n", v_counter, (v_counter + (cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, cycles, cycles%MCYCLES_PER_LINE,dma_type, rate, dma_cycles, dma_bytes, dma_length, m68k_get_reg(M68K_REG_PC)); +log_cb(RETRO_LOG_ERROR, error_str); +#endif + /* Check if DMA can be finished within current timeframe */ - if (dma_length < dma_bytes) + extern int fast_dma_hack; + if( fast_dma_hack ) { + dma_bytes = dma_length; + dma_cycles = (1 * MCYCLES_PER_LINE) / rate; + } + else if (dma_length < dma_bytes) { /* Adjust remaining DMA bytes */ dma_bytes = dma_length; @@ -740,6 +764,8 @@ void vdp_dma_update(unsigned int cycles) /* Check if DMA is finished */ if (!dma_length) { + debug_dma = 0; + /* DMA source address registers are incremented during DMA (even DMA Fill) */ uint16 end = reg[21] + (reg[22] << 8) + reg[19] + (reg[20] << 8); reg[21] = end & 0xff; @@ -1222,6 +1248,55 @@ unsigned int vdp_68k_ctrl_r(unsigned int cycles) { unsigned int temp; +#if 0 + static int debug_dump = 0; + + if( GetAsyncKeyState(VK_OEM_PERIOD) ) { + if( debug_dump == 0 ) { + FILE *fp = fopen("vram.bin","wb"); + int lcv; + if(fp) { + debug_dump = 1; + for( lcv = 0; lcv < 0x10000; lcv += 2 ) { + fwrite(vram + lcv + 1, 1, 1, fp); + fwrite(vram + lcv + 0, 1, 1, fp); + } + fclose(fp); + } + + fp = fopen("ram.bin","wb"); + if(fp) { + debug_dump = 1; + for( lcv = 0; lcv < 0x10000; lcv += 2 ) { + fwrite(m68k.memory_map[0xff].base + lcv + 1, 1, 1, fp); + fwrite(m68k.memory_map[0xff].base + lcv + 0, 1, 1, fp); + } + fclose(fp); + } + + fp = fopen("stm32.bin","wb"); + if(fp) { + debug_dump = 1; + for( lcv = 0; lcv < 0x10000; lcv += 2 ) { + fwrite(m68k.memory_map[0x00].base + lcv + 1, 1, 1, fp); + fwrite(m68k.memory_map[0x00].base + lcv + 0, 1, 1, fp); + } + fclose(fp); + } + + fp = fopen("z80.bin","wb"); + if(fp) { + debug_dump = 1; + fwrite(zram, 1, 0x2000, fp); + fclose(fp); + } + } + } + else { + debug_dump = 0; + } +#endif + /* Cycle-accurate VDP status read (adjust CPU time with current instruction execution time) */ cycles += m68k_cycles(); @@ -1288,6 +1363,13 @@ unsigned int vdp_68k_ctrl_r(unsigned int cycles) #ifdef LOGVDP error("[%d(%d)][%d(%d)] VDP 68k status read -> 0x%x (0x%x) (%x)\n", v_counter, (v_counter + cycles/MCYCLES_PER_LINE)%lines_per_frame, cycles + mcycles_vdp, cycles%MCYCLES_PER_LINE, temp, status, m68k_get_reg(M68K_REG_PC)); #endif + +#ifdef VDP_DEBUG + static char error_str[512]; + sprintf(error_str, "[%d(%d)][%d(%d)] VDP 68k status read -> 0x%x (0x%x) (%x)\n", v_counter, (v_counter + cycles/MCYCLES_PER_LINE)%lines_per_frame, cycles + mcycles_vdp, cycles%MCYCLES_PER_LINE, temp, status, m68k_get_reg(M68K_REG_PC)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + return (temp); } @@ -1398,6 +1480,7 @@ unsigned int vdp_z80_ctrl_r(unsigned int cycles) #ifdef LOGVDP error("[%d(%d)][%d(%d)] VDP Z80 status read -> 0x%x (0x%x) (%x)\n", v_counter, (v_counter + (cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, cycles, cycles%MCYCLES_PER_LINE, temp, status, Z80.pc.w.l); #endif + return (temp); } @@ -1537,6 +1620,12 @@ static void vdp_reg_w(unsigned int r, unsigned int d, unsigned int cycles) error("[%d(%d)][%d(%d)] VDP register %d write -> 0x%x (%x)\n", v_counter, (v_counter + (cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, cycles, cycles%MCYCLES_PER_LINE, r, d, m68k_get_reg(M68K_REG_PC)); #endif +#ifdef DEBUG_VDP + static char error_str[512]; + sprintf(error_str, "[%d(%d)][%d(%d)] VDP register %d write -> 0x%x (%x)\n", v_counter, (v_counter + (cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, cycles, cycles%MCYCLES_PER_LINE, r, d, m68k_get_reg(M68K_REG_PC)); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + /* VDP registers #11 to #23 cannot be updated in Mode 4 (Captain Planet & Avengers, Bass Master Classic Pro Edition) */ if (!(reg[1] & 4) && (r > 10)) { @@ -2160,6 +2249,35 @@ static void vdp_bus_w(unsigned int data) /* increment FIFO write pointer */ fifo_idx = (fifo_idx + 1) & 3; + + if( debug_dma == 1 ) { + int test = ((reg[23] & 0x7f) << 16) + reg[21] + (reg[22] << 8); + test *= 2; + + debug_dma_once = 1; + debug_dma = 2; + +#ifdef DEBUG_DMA + sprintf(error_str, "[%d] DMA %02X:%04X ==>", v_counter, (test>>16) & 0xff, test & 0xffff); + + if( code & 0x04 ) { + sprintf(error_str, "%s VSRAM", error_str); + } + else if( code & 0x02 ) { + sprintf(error_str, "%s CRAM", error_str); + } + else { + sprintf(error_str, "%s VRAM", error_str); + } + + sprintf(error_str, "%s %04X @ %04X len\n", error_str, addr, (reg[19] + (reg[20] << 8)) * 2); + log_cb(RETRO_LOG_ERROR, error_str); +#endif + + //if(addr == 0xc800) memset(vram + 0xc000, 0xAA, 0x400); + } + + /* Check destination code (CD0-CD3) */ switch (code & 0x0F) { @@ -2204,6 +2322,19 @@ static void vdp_bus_w(unsigned int data) #ifdef LOGVDP error("[%d(%d)][%d(%d)] VRAM 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, addr, data, m68k_get_reg(M68K_REG_PC)); #endif + +#ifdef DEBUG_VDP + { + static int once = 0; + if (data != 0) once = 1; + if (!debug_dma && debug_dma_once && once) { + //if (once) { + sprintf(error_str, "[%d(%d)][%d(%d)] VRAM 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, addr, data, m68k_get_reg(M68K_REG_PC)); + log_cb(RETRO_LOG_ERROR, error_str); + } + } +#endif + break; } @@ -2253,6 +2384,17 @@ static void vdp_bus_w(unsigned int data) #ifdef LOGVDP error("[%d(%d)][%d(%d)] CRAM 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, addr, data, m68k_get_reg(M68K_REG_PC)); #endif + +#ifdef DEBUG_VDP + { + static int once = 0; + if (data != 0) once = 1; + if (!debug_dma && debug_dma_once && once) { + sprintf(error_str, "[%d(%d)][%d(%d)] CRAM 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, addr, data, m68k_get_reg(M68K_REG_PC)); + log_cb(RETRO_LOG_ERROR, error_str); + } + } +#endif break; } @@ -2279,6 +2421,17 @@ static void vdp_bus_w(unsigned int data) #ifdef LOGVDP error("[%d(%d)][%d(%d)] VSRAM 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, addr, data, m68k_get_reg(M68K_REG_PC)); #endif + +#ifdef DEBUG_VDP + { + static int once = 0; + if (data != 0) once = 1; + if (!debug_dma && debug_dma_once && once) { + sprintf(error_str, "[%d(%d)][%d(%d)] VSRAM 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, addr, data, m68k_get_reg(M68K_REG_PC)); + log_cb(RETRO_LOG_ERROR, error_str); + } + } +#endif break; } @@ -2287,6 +2440,10 @@ static void vdp_bus_w(unsigned int data) #ifdef LOGERROR error("[%d(%d)][%d(%d)] Invalid (%d) 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, code, addr, data, m68k_get_reg(M68K_REG_PC)); #endif + + sprintf(error_str, "[%d(%d)][%d(%d)] Invalid (%d) 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, code, addr, data, m68k_get_reg(M68K_REG_PC)); + log_cb(RETRO_LOG_ERROR, error_str); + break; } } @@ -3014,6 +3171,8 @@ static void vdp_dma_68k_ext(unsigned int length) /* 68k bus source address */ uint32 source = (reg[23] << 17) | (dma_src << 1); + if( debug_dma == 0 ) debug_dma = 1; + do { /* Read data word from 68k bus */ @@ -3049,6 +3208,8 @@ static void vdp_dma_68k_ram(unsigned int length) /* 68k bus source address */ uint32 source = (reg[23] << 17) | (dma_src << 1); + if( debug_dma == 0 ) debug_dma = 1; + do { /* access Work-RAM by default */ @@ -3077,6 +3238,8 @@ static void vdp_dma_68k_io(unsigned int length) /* 68k bus source address */ uint32 source = (reg[23] << 17) | (dma_src << 1); + if( debug_dma == 0 ) debug_dma = 1; + do { /* Z80 area */ @@ -3120,6 +3283,8 @@ static void vdp_dma_68k_io(unsigned int length) /* VRAM Copy */ static void vdp_dma_copy(unsigned int length) { + if( debug_dma == 0 ) debug_dma = 1; + /* CD4 should be set (CD0-CD3 ignored) otherwise VDP locks (hard reset needed) */ if (code & 0x10) { @@ -3163,6 +3328,8 @@ static void vdp_dma_copy(unsigned int length) /* DMA Fill */ static void vdp_dma_fill(unsigned int length) { + if( debug_dma == 0 ) debug_dma = 1; + /* Check destination code (CD0-CD3) */ switch (code & 0x0F) { diff --git a/core/vdp_render.c b/core/vdp_render.c index d3c913006..abf87d6ca 100644 --- a/core/vdp_render.c +++ b/core/vdp_render.c @@ -968,6 +968,81 @@ INLINE void merge(uint8 *srca, uint8 *srcb, uint8 *dst, uint8 *table, int width) /* Pixel color lookup tables initialization */ /*--------------------------------------------------------------------------*/ +void palette_libretro_init(int type) +{ + int r, g, b, i; + + /* Initialize Mode 5 pixel color look-up tables */ + for (i = 0; i < 0x200; i++) + { + /* CRAM 9-bit value (BBBGGGRRR) */ + r = (i >> 0) & 7; + g = (i >> 3) & 7; + b = (i >> 6) & 7; + + /* Convert to output pixel format */ + if (type == 0) + { + static int linear_lut[15] = { 0, 18, 36, 55, 73, 91, 109, 128, 146, 164, 182, 200, 219, 237, 255 }; + + pixel_lut[0][i] = (0xff << 24) | (linear_lut[r+0] << 16) | (linear_lut[g+0] << 8) | (linear_lut[b+0] << 0); + pixel_lut[1][i] = (0xff << 24) | (linear_lut[r*2] << 16) | (linear_lut[g*2] << 8) | (linear_lut[b*2] << 0); + pixel_lut[2][i] = (0xff << 24) | (linear_lut[r+7] << 16) | (linear_lut[g+7] << 8) | (linear_lut[b+7] << 0); + } + else if (type == 1) + { + static int hardware_lut[15] = { 0, 27, 49, 71, 87, 103, 119, 130, 146, 157, 174, 190, 206, 228, 255 }; /* non-linear dac ramp */ + + pixel_lut[0][i] = (0xff << 24) | (hardware_lut[r+0] << 16) | (hardware_lut[g+0] << 8) | (hardware_lut[b+0] << 0); + pixel_lut[1][i] = (0xff << 24) | (hardware_lut[r*2] << 16) | (hardware_lut[g*2] << 8) | (hardware_lut[b*2] << 0); + pixel_lut[2][i] = (0xff << 24) | (hardware_lut[r+7] << 16) | (hardware_lut[g+7] << 8) | (hardware_lut[b+7] << 0); + } + else if (type == 2) + { + static int sgb_lut[15] = { 0, 9, 27, 42, 58, 76, 94, 114, 133, 153, 173, 192, 211, 229, 255 }; + static int hardware_lut[15] = { 0, 27, 49, 71, 87, 103, 119, 130, 146, 157, 174, 190, 206, 228, 255 }; + + static int sgb_hardware[15]; + for(int lcv = 0; lcv < 15; lcv++) { +#if 1 + sgb_hardware[lcv] = (sgb_lut[lcv] + hardware_lut[lcv]) / 2; +#else + sgb_hardware[lcv] = sgb_lut[lcv]; +#endif + } + + pixel_lut[0][i] = (0xff << 24) | (sgb_hardware[r+0] << 16) | (sgb_hardware[g+0] << 8) | (sgb_hardware[b+0] << 0); + pixel_lut[1][i] = (0xff << 24) | (sgb_hardware[r*2] << 16) | (sgb_hardware[g*2] << 8) | (sgb_hardware[b*2] << 0); + pixel_lut[2][i] = (0xff << 24) | (sgb_hardware[r+7] << 16) | (sgb_hardware[g+7] << 8) | (sgb_hardware[b+7] << 0); + } + } + + + /* Mega Drive VDP only */ + if (system_hw & SYSTEM_MD) + { + /* Reset color palette */ + if (reg[1] & 0x04) + { + /* Mode 5 */ + /* color_update_m5(0x00, *(uint16 *)&cram[border << 1]); */ + for (i = 1; i < 0x40; i++) + { + color_update_m5(i, *(uint16 *)&cram[i << 1]); + } + } + else + { + /* Mode 4 */ + for (i = 0; i < 0x20; i++) + { + color_update_m4(i, *(uint16 *)&cram[i << 1]); + } + /* color_update_m4(0x40, *(uint16 *)&cram[(0x10 | (border & 0x0F)) << 1]); */ + } + } +} + static void palette_init(void) { int r, g, b, i; diff --git a/core/z80/z80.c b/core/z80/z80.c index 74d5053c6..9fa286da0 100644 --- a/core/z80/z80.c +++ b/core/z80/z80.c @@ -3428,6 +3428,16 @@ void z80_run(unsigned int cycles) if (Z80.cycles >= cycles) return; } + +//if(PC == 0x28C) + if(0) + { + static FILE *fp = 0; + if(!fp) fp = fopen("trace-z80.txt", "w"); + fprintf(fp, "%X %X - %X %X %X %X\n", PC, zbank, A, BC, DE, HL); + } + + Z80.after_ei = FALSE; R++; EXEC_INLINE(op,ROP()); diff --git a/libretro/Makefile.common b/libretro/Makefile.common index 02f4fb65e..ac77aca98 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -25,8 +25,7 @@ ifeq ($(HAVE_CHD), 1) INCFLAGS += \ -I$(LIBRETRO_DEPS_DIR)/libchdr/include \ -I$(LIBRETRO_DEPS_DIR)/lzma-19.00/include \ - -I$(LIBRETRO_DEPS_DIR)/zlib-1.2.11 \ - -I$(LIBRETRO_DEPS_DIR)/zstd/lib + -I$(LIBRETRO_DEPS_DIR)/zlib-1.2.11 SOURCES_C += \ $(LIBRETRO_DEPS_DIR)/lzma-19.00/src/Alloc.c \ $(LIBRETRO_DEPS_DIR)/lzma-19.00/src/Bra86.c \ @@ -42,16 +41,7 @@ ifeq ($(HAVE_CHD), 1) $(LIBRETRO_DEPS_DIR)/libchdr/src/libchdr_cdrom.c \ $(LIBRETRO_DEPS_DIR)/libchdr/src/libchdr_chd.c \ $(LIBRETRO_DEPS_DIR)/libchdr/src/libchdr_flac.c \ - $(LIBRETRO_DEPS_DIR)/libchdr/src/libchdr_huffman.c \ - $(LIBRETRO_DEPS_DIR)/zstd/lib/common/entropy_common.c \ - $(LIBRETRO_DEPS_DIR)/zstd/lib/common/error_private.c \ - $(LIBRETRO_DEPS_DIR)/zstd/lib/common/fse_decompress.c \ - $(LIBRETRO_DEPS_DIR)/zstd/lib/common/zstd_common.c \ - $(LIBRETRO_DEPS_DIR)/zstd/lib/common/xxhash.c \ - $(LIBRETRO_DEPS_DIR)/zstd/lib/decompress/huf_decompress.c \ - $(LIBRETRO_DEPS_DIR)/zstd/lib/decompress/zstd_ddict.c \ - $(LIBRETRO_DEPS_DIR)/zstd/lib/decompress/zstd_decompress.c \ - $(LIBRETRO_DEPS_DIR)/zstd/lib/decompress/zstd_decompress_block.c + $(LIBRETRO_DEPS_DIR)/libchdr/src/libchdr_huffman.c endif SOURCES_C += $(foreach dir,$(GENPLUS_SRC_DIR),$(wildcard $(dir)/*.c)) diff --git a/libretro/debian/rules b/libretro/debian/rules old mode 100755 new mode 100644 diff --git a/libretro/deps/libchdr/include/dr_libs/dr_flac.h b/libretro/deps/libchdr/include/dr_libs/dr_flac.h index 14324cf37..c38e5b250 100644 --- a/libretro/deps/libchdr/include/dr_libs/dr_flac.h +++ b/libretro/deps/libchdr/include/dr_libs/dr_flac.h @@ -1,6 +1,6 @@ /* FLAC audio decoder. Choice of public domain or MIT-0. See license statements at the end of this file. -dr_flac - v0.12.42 - 2023-11-02 +dr_flac - v0.12.28 - 2021-02-21 David Reid - mackron@gmail.com @@ -210,9 +210,6 @@ Build Options #define DR_FLAC_NO_SIMD Disables SIMD optimizations (SSE on x86/x64 architectures, NEON on ARM architectures). Use this if you are having compatibility issues with your compiler. -#define DR_FLAC_NO_WCHAR - Disables all functions ending with `_w`. Use this if your compiler does not provide wchar.h. Not required if DR_FLAC_NO_STDIO is also defined. - Notes @@ -235,19 +232,19 @@ extern "C" { #define DRFLAC_VERSION_MAJOR 0 #define DRFLAC_VERSION_MINOR 12 -#define DRFLAC_VERSION_REVISION 42 +#define DRFLAC_VERSION_REVISION 28 #define DRFLAC_VERSION_STRING DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MAJOR) "." DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MINOR) "." DRFLAC_XSTRINGIFY(DRFLAC_VERSION_REVISION) #include /* For size_t. */ -/* Sized Types */ +/* Sized types. */ typedef signed char drflac_int8; typedef unsigned char drflac_uint8; typedef signed short drflac_int16; typedef unsigned short drflac_uint16; typedef signed int drflac_int32; typedef unsigned int drflac_uint32; -#if defined(_MSC_VER) && !defined(__clang__) +#if defined(_MSC_VER) typedef signed __int64 drflac_int64; typedef unsigned __int64 drflac_uint64; #else @@ -264,7 +261,7 @@ typedef unsigned int drflac_uint32; #pragma GCC diagnostic pop #endif #endif -#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__)) || defined(_M_X64) || defined(__ia64) || defined(_M_IA64) || defined(__aarch64__) || defined(_M_ARM64) || defined(__powerpc64__) +#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__)) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) typedef drflac_uint64 drflac_uintptr; #else typedef drflac_uint32 drflac_uintptr; @@ -273,9 +270,7 @@ typedef drflac_uint8 drflac_bool8; typedef drflac_uint32 drflac_bool32; #define DRFLAC_TRUE 1 #define DRFLAC_FALSE 0 -/* End Sized Types */ -/* Decorations */ #if !defined(DRFLAC_API) #if defined(DRFLAC_DLL) #if defined(_WIN32) @@ -305,7 +300,6 @@ typedef drflac_uint32 drflac_bool32; #define DRFLAC_PRIVATE static #endif #endif -/* End Decorations */ #if defined(_MSC_VER) && _MSC_VER >= 1700 /* Visual Studio 2012 */ #define DRFLAC_DEPRECATED __declspec(deprecated) @@ -324,16 +318,6 @@ typedef drflac_uint32 drflac_bool32; DRFLAC_API void drflac_version(drflac_uint32* pMajor, drflac_uint32* pMinor, drflac_uint32* pRevision); DRFLAC_API const char* drflac_version_string(void); -/* Allocation Callbacks */ -typedef struct -{ - void* pUserData; - void* (* onMalloc)(size_t sz, void* pUserData); - void* (* onRealloc)(void* p, size_t sz, void* pUserData); - void (* onFree)(void* p, void* pUserData); -} drflac_allocation_callbacks; -/* End Allocation Callbacks */ - /* As data is read from the client it is placed into an internal buffer for fast access. This controls the size of that buffer. Larger values means more speed, but also more memory. In my testing there is diminishing returns after about 4KB, but you can fiddle with this to suit your own needs. Must be a multiple of 8. @@ -342,22 +326,11 @@ but also more memory. In my testing there is diminishing returns after about 4KB #define DR_FLAC_BUFFER_SIZE 4096 #endif - -/* Architecture Detection */ +/* Check if we can enable 64-bit optimizations. */ #if defined(_WIN64) || defined(_LP64) || defined(__LP64__) #define DRFLAC_64BIT #endif -#if defined(__x86_64__) || defined(_M_X64) - #define DRFLAC_X64 -#elif defined(__i386) || defined(_M_IX86) - #define DRFLAC_X86 -#elif defined(__arm__) || defined(_M_ARM) || defined(__arm64) || defined(__arm64__) || defined(__aarch64__) || defined(_M_ARM64) - #define DRFLAC_ARM -#endif -/* End Architecture Detection */ - - #ifdef DRFLAC_64BIT typedef drflac_uint64 drflac_cache_t; #else @@ -410,13 +383,15 @@ typedef enum drflac_seek_origin_current } drflac_seek_origin; -/* The order of members in this structure is important because we map this directly to the raw data within the SEEKTABLE metadata block. */ +/* Packing is important on this structure because we map this directly to the raw data within the SEEKTABLE metadata block. */ +#pragma pack(2) typedef struct { drflac_uint64 firstPCMFrame; drflac_uint64 flacFrameOffset; /* The offset from the first byte of the header of the first frame. */ drflac_uint16 pcmFrameCount; } drflac_seekpoint; +#pragma pack() typedef struct { @@ -586,6 +561,14 @@ will be set to one of the DRFLAC_METADATA_BLOCK_TYPE_* tokens. typedef void (* drflac_meta_proc)(void* pUserData, drflac_metadata* pMetadata); +typedef struct +{ + void* pUserData; + void* (* onMalloc)(size_t sz, void* pUserData); + void* (* onRealloc)(void* p, size_t sz, void* pUserData); + void (* onFree)(void* p, void* pUserData); +} drflac_allocation_callbacks; + /* Structure for internal use. Only used for decoders opened with drflac_open_memory. */ typedef struct { @@ -1072,84 +1055,6 @@ Return Value */ DRFLAC_API drflac_bool32 drflac_seek_to_pcm_frame(drflac* pFlac, drflac_uint64 pcmFrameIndex); - - -#ifndef DR_FLAC_NO_STDIO -/* -Opens a FLAC decoder from the file at the given path. - - -Parameters ----------- -pFileName (in) - The path of the file to open, either absolute or relative to the current directory. - -pAllocationCallbacks (in, optional) - A pointer to application defined callbacks for managing memory allocations. - - -Return Value ------------- -A pointer to an object representing the decoder. - - -Remarks -------- -Close the decoder with drflac_close(). - - -Remarks -------- -This will hold a handle to the file until the decoder is closed with drflac_close(). Some platforms will restrict the number of files a process can have open -at any given time, so keep this mind if you have many decoders open at the same time. - - -See Also --------- -drflac_open_file_with_metadata() -drflac_open() -drflac_close() -*/ -DRFLAC_API drflac* drflac_open_file(const char* pFileName, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API drflac* drflac_open_file_w(const wchar_t* pFileName, const drflac_allocation_callbacks* pAllocationCallbacks); - -/* -Opens a FLAC decoder from the file at the given path and notifies the caller of the metadata chunks (album art, etc.) - - -Parameters ----------- -pFileName (in) - The path of the file to open, either absolute or relative to the current directory. - -pAllocationCallbacks (in, optional) - A pointer to application defined callbacks for managing memory allocations. - -onMeta (in) - The callback to fire for each metadata block. - -pUserData (in) - A pointer to the user data to pass to the metadata callback. - -pAllocationCallbacks (in) - A pointer to application defined callbacks for managing memory allocations. - - -Remarks -------- -Look at the documentation for drflac_open_with_metadata() for more information on how metadata is handled. - - -See Also --------- -drflac_open_with_metadata() -drflac_open() -drflac_close() -*/ -DRFLAC_API drflac* drflac_open_file_with_metadata(const char* pFileName, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API drflac* drflac_open_file_with_metadata_w(const wchar_t* pFileName, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks); -#endif - /* Opens a FLAC decoder from a pre-allocated block of memory @@ -1242,17 +1147,6 @@ DRFLAC_API drflac_int16* drflac_open_and_read_pcm_frames_s16(drflac_read_proc on /* Same as drflac_open_and_read_pcm_frames_s32(), except returns 32-bit floating-point samples. */ DRFLAC_API float* drflac_open_and_read_pcm_frames_f32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); -#ifndef DR_FLAC_NO_STDIO -/* Same as drflac_open_and_read_pcm_frames_s32() except opens the decoder from a file. */ -DRFLAC_API drflac_int32* drflac_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); - -/* Same as drflac_open_file_and_read_pcm_frames_s32(), except returns signed 16-bit integer samples. */ -DRFLAC_API drflac_int16* drflac_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); - -/* Same as drflac_open_file_and_read_pcm_frames_s32(), except returns 32-bit floating-point samples. */ -DRFLAC_API float* drflac_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); -#endif - /* Same as drflac_open_and_read_pcm_frames_s32() except opens the decoder from a block of memory. */ DRFLAC_API drflac_int32* drflac_open_memory_and_read_pcm_frames_s32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); @@ -1297,13 +1191,15 @@ typedef struct const char* pRunningData; } drflac_cuesheet_track_iterator; -/* The order of members here is important because we map this directly to the raw data within the CUESHEET metadata block. */ +/* Packing is important on this structure because we map this directly to the raw data within the CUESHEET metadata block. */ +#pragma pack(4) typedef struct { drflac_uint64 offset; drflac_uint8 index; drflac_uint8 reserved[3]; } drflac_cuesheet_track_index; +#pragma pack() typedef struct { @@ -1367,7 +1263,6 @@ DRFLAC_API drflac_bool32 drflac_next_cuesheet_track(drflac_cuesheet_track_iterat #include #include -/* Inline */ #ifdef _MSC_VER #define DRFLAC_INLINE __forceinline #elif defined(__GNUC__) @@ -1379,22 +1274,24 @@ DRFLAC_API drflac_bool32 drflac_next_cuesheet_track(drflac_cuesheet_track_iterat I am using "__inline__" only when we're compiling in strict ANSI mode. */ #if defined(__STRICT_ANSI__) - #define DRFLAC_GNUC_INLINE_HINT __inline__ - #else - #define DRFLAC_GNUC_INLINE_HINT inline - #endif - - #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)) || defined(__clang__) - #define DRFLAC_INLINE DRFLAC_GNUC_INLINE_HINT __attribute__((always_inline)) + #define DRFLAC_INLINE __inline__ __attribute__((always_inline)) #else - #define DRFLAC_INLINE DRFLAC_GNUC_INLINE_HINT + #define DRFLAC_INLINE inline __attribute__((always_inline)) #endif #elif defined(__WATCOMC__) #define DRFLAC_INLINE __inline #else #define DRFLAC_INLINE #endif -/* End Inline */ + +/* CPU architecture. */ +#if defined(__x86_64__) || defined(_M_X64) + #define DRFLAC_X64 +#elif defined(__i386) || defined(_M_IX86) + #define DRFLAC_X86 +#elif defined(__arm__) || defined(_M_ARM) || defined(_M_ARM64) + #define DRFLAC_ARM +#endif /* Intrinsics Support @@ -1445,6 +1342,16 @@ Unfortuantely dr_flac depends on this for a few things so we're just going to di #if defined(DRFLAC_ARM) #if !defined(DRFLAC_NO_NEON) && (defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64)) #define DRFLAC_SUPPORT_NEON + #endif + + /* Fall back to looking for the #include file. */ + #if !defined(__GNUC__) && !defined(__clang__) && defined(__has_include) + #if !defined(DRFLAC_SUPPORT_NEON) && !defined(DRFLAC_NO_NEON) && __has_include() + #define DRFLAC_SUPPORT_NEON + #endif + #endif + + #if defined(DRFLAC_SUPPORT_NEON) #include #endif #endif @@ -1523,7 +1430,9 @@ static DRFLAC_INLINE drflac_bool32 drflac_has_sse41(void) { #if defined(DRFLAC_SUPPORT_SSE41) #if (defined(DRFLAC_X64) || defined(DRFLAC_X86)) && !defined(DRFLAC_NO_SSE41) - #if defined(__SSE4_1__) || defined(__AVX__) + #if defined(DRFLAC_X64) + return DRFLAC_TRUE; /* 64-bit targets always support SSE4.1. */ + #elif (defined(_M_IX86_FP) && _M_IX86_FP == 2) || defined(__SSE4_1__) return DRFLAC_TRUE; /* If the compiler is allowed to freely generate SSE41 code we can assume support. */ #else #if defined(DRFLAC_NO_CPUID) @@ -1579,30 +1488,6 @@ static DRFLAC_INLINE drflac_bool32 drflac_has_sse41(void) #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) #define DRFLAC_HAS_BYTESWAP16_INTRINSIC #endif -#elif defined(__WATCOMC__) && defined(__386__) - #define DRFLAC_HAS_BYTESWAP16_INTRINSIC - #define DRFLAC_HAS_BYTESWAP32_INTRINSIC - #define DRFLAC_HAS_BYTESWAP64_INTRINSIC - extern __inline drflac_uint16 _watcom_bswap16(drflac_uint16); - extern __inline drflac_uint32 _watcom_bswap32(drflac_uint32); - extern __inline drflac_uint64 _watcom_bswap64(drflac_uint64); -#pragma aux _watcom_bswap16 = \ - "xchg al, ah" \ - parm [ax] \ - value [ax] \ - modify nomemory; -#pragma aux _watcom_bswap32 = \ - "bswap eax" \ - parm [eax] \ - value [eax] \ - modify nomemory; -#pragma aux _watcom_bswap64 = \ - "bswap eax" \ - "bswap edx" \ - "xchg eax,edx" \ - parm [eax edx] \ - value [eax edx] \ - modify nomemory; #endif @@ -1632,7 +1517,6 @@ static DRFLAC_INLINE drflac_bool32 drflac_has_sse41(void) #define DRFLAC_MAX_SIMD_VECTOR_SIZE 64 /* 64 for AVX-512 in the future. */ -/* Result Codes */ typedef drflac_int32 drflac_result; #define DRFLAC_SUCCESS 0 #define DRFLAC_ERROR -1 /* A generic error. */ @@ -1688,10 +1572,7 @@ typedef drflac_int32 drflac_result; #define DRFLAC_CANCELLED -51 #define DRFLAC_MEMORY_ALREADY_MAPPED -52 #define DRFLAC_AT_END -53 - -#define DRFLAC_CRC_MISMATCH -100 -/* End Result Codes */ - +#define DRFLAC_CRC_MISMATCH -128 #define DRFLAC_SUBFRAME_CONSTANT 0 #define DRFLAC_SUBFRAME_VERBATIM 1 @@ -1707,10 +1588,6 @@ typedef drflac_int32 drflac_result; #define DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE 9 #define DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE 10 -#define DRFLAC_SEEKPOINT_SIZE_IN_BYTES 18 -#define DRFLAC_CUESHEET_TRACK_SIZE_IN_BYTES 36 -#define DRFLAC_CUESHEET_TRACK_INDEX_SIZE_IN_BYTES 12 - #define drflac_align(x, a) ((((x) + (a) - 1) / (a)) * (a)) @@ -1834,8 +1711,6 @@ static DRFLAC_INLINE drflac_uint16 drflac__swap_endian_uint16(drflac_uint16 n) return _byteswap_ushort(n); #elif defined(__GNUC__) || defined(__clang__) return __builtin_bswap16(n); - #elif defined(__WATCOMC__) && defined(__386__) - return _watcom_bswap16(n); #else #error "This compiler does not support the byte swap intrinsic." #endif @@ -1851,7 +1726,7 @@ static DRFLAC_INLINE drflac_uint32 drflac__swap_endian_uint32(drflac_uint32 n) #if defined(_MSC_VER) && !defined(__clang__) return _byteswap_ulong(n); #elif defined(__GNUC__) || defined(__clang__) - #if defined(DRFLAC_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 6) && !defined(__ARM_ARCH_6M__) && !defined(DRFLAC_64BIT) /* <-- 64-bit inline assembly has not been tested, so disabling for now. */ + #if defined(DRFLAC_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 6) && !defined(DRFLAC_64BIT) /* <-- 64-bit inline assembly has not been tested, so disabling for now. */ /* Inline assembly optimized implementation for ARM. In my testing, GCC does not generate optimized code with __builtin_bswap32(). */ drflac_uint32 r; __asm__ __volatile__ ( @@ -1865,8 +1740,6 @@ static DRFLAC_INLINE drflac_uint32 drflac__swap_endian_uint32(drflac_uint32 n) #else return __builtin_bswap32(n); #endif - #elif defined(__WATCOMC__) && defined(__386__) - return _watcom_bswap32(n); #else #error "This compiler does not support the byte swap intrinsic." #endif @@ -1885,8 +1758,6 @@ static DRFLAC_INLINE drflac_uint64 drflac__swap_endian_uint64(drflac_uint64 n) return _byteswap_uint64(n); #elif defined(__GNUC__) || defined(__clang__) return __builtin_bswap64(n); - #elif defined(__WATCOMC__) && defined(__386__) - return _watcom_bswap64(n); #else #error "This compiler does not support the byte swap intrinsic." #endif @@ -1922,12 +1793,6 @@ static DRFLAC_INLINE drflac_uint32 drflac__be2host_32(drflac_uint32 n) return n; } -static DRFLAC_INLINE drflac_uint32 drflac__be2host_32_ptr_unaligned(const void* pData) -{ - const drflac_uint8* pNum = (drflac_uint8*)pData; - return *(pNum) << 24 | *(pNum+1) << 16 | *(pNum+2) << 8 | *(pNum+3); -} - static DRFLAC_INLINE drflac_uint64 drflac__be2host_64(drflac_uint64 n) { if (drflac__is_little_endian()) { @@ -1947,12 +1812,6 @@ static DRFLAC_INLINE drflac_uint32 drflac__le2host_32(drflac_uint32 n) return n; } -static DRFLAC_INLINE drflac_uint32 drflac__le2host_32_ptr_unaligned(const void* pData) -{ - const drflac_uint8* pNum = (drflac_uint8*)pData; - return *pNum | *(pNum+1) << 8 | *(pNum+2) << 16 | *(pNum+3) << 24; -} - static DRFLAC_INLINE drflac_uint32 drflac__unsynchsafe_32(drflac_uint32 n) { @@ -2034,19 +1893,6 @@ static DRFLAC_INLINE drflac_uint8 drflac_crc8(drflac_uint8 crc, drflac_uint32 da (void)data; (void)count; return 0; -#else -#if 0 - /* REFERENCE (use of this implementation requires an explicit flush by doing "drflac_crc8(crc, 0, 8);") */ - drflac_uint8 p = 0x07; - for (int i = count-1; i >= 0; --i) { - drflac_uint8 bit = (data & (1 << i)) >> i; - if (crc & 0x80) { - crc = ((crc << 1) | bit) ^ p; - } else { - crc = ((crc << 1) | bit); - } - } - return crc; #else drflac_uint32 wholeBytes; drflac_uint32 leftoverBits; @@ -2071,7 +1917,6 @@ static DRFLAC_INLINE drflac_uint8 drflac_crc8(drflac_uint8 crc, drflac_uint32 da } return crc; #endif -#endif } static DRFLAC_INLINE drflac_uint16 drflac_crc16_byte(drflac_uint16 crc, drflac_uint8 data) @@ -2114,106 +1959,6 @@ static DRFLAC_INLINE drflac_uint16 drflac_crc16_bytes(drflac_uint16 crc, drflac_ return crc; } -#if 0 -static DRFLAC_INLINE drflac_uint16 drflac_crc16__32bit(drflac_uint16 crc, drflac_uint32 data, drflac_uint32 count) -{ -#ifdef DR_FLAC_NO_CRC - (void)crc; - (void)data; - (void)count; - return 0; -#else -#if 0 - /* REFERENCE (use of this implementation requires an explicit flush by doing "drflac_crc16(crc, 0, 16);") */ - drflac_uint16 p = 0x8005; - for (int i = count-1; i >= 0; --i) { - drflac_uint16 bit = (data & (1ULL << i)) >> i; - if (r & 0x8000) { - r = ((r << 1) | bit) ^ p; - } else { - r = ((r << 1) | bit); - } - } - - return crc; -#else - drflac_uint32 wholeBytes; - drflac_uint32 leftoverBits; - drflac_uint64 leftoverDataMask; - - static drflac_uint64 leftoverDataMaskTable[8] = { - 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F - }; - - DRFLAC_ASSERT(count <= 64); - - wholeBytes = count >> 3; - leftoverBits = count & 7; - leftoverDataMask = leftoverDataMaskTable[leftoverBits]; - - switch (wholeBytes) { - default: - case 4: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (0xFF000000UL << leftoverBits)) >> (24 + leftoverBits))); - case 3: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (0x00FF0000UL << leftoverBits)) >> (16 + leftoverBits))); - case 2: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (0x0000FF00UL << leftoverBits)) >> ( 8 + leftoverBits))); - case 1: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (0x000000FFUL << leftoverBits)) >> ( 0 + leftoverBits))); - case 0: if (leftoverBits > 0) crc = (crc << leftoverBits) ^ drflac__crc16_table[(crc >> (16 - leftoverBits)) ^ (data & leftoverDataMask)]; - } - return crc; -#endif -#endif -} - -static DRFLAC_INLINE drflac_uint16 drflac_crc16__64bit(drflac_uint16 crc, drflac_uint64 data, drflac_uint32 count) -{ -#ifdef DR_FLAC_NO_CRC - (void)crc; - (void)data; - (void)count; - return 0; -#else - drflac_uint32 wholeBytes; - drflac_uint32 leftoverBits; - drflac_uint64 leftoverDataMask; - - static drflac_uint64 leftoverDataMaskTable[8] = { - 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F - }; - - DRFLAC_ASSERT(count <= 64); - - wholeBytes = count >> 3; - leftoverBits = count & 7; - leftoverDataMask = leftoverDataMaskTable[leftoverBits]; - - switch (wholeBytes) { - default: - case 8: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0xFF000000 << 32) << leftoverBits)) >> (56 + leftoverBits))); /* Weird "<< 32" bitshift is required for C89 because it doesn't support 64-bit constants. Should be optimized out by a good compiler. */ - case 7: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x00FF0000 << 32) << leftoverBits)) >> (48 + leftoverBits))); - case 6: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x0000FF00 << 32) << leftoverBits)) >> (40 + leftoverBits))); - case 5: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x000000FF << 32) << leftoverBits)) >> (32 + leftoverBits))); - case 4: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0xFF000000 ) << leftoverBits)) >> (24 + leftoverBits))); - case 3: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x00FF0000 ) << leftoverBits)) >> (16 + leftoverBits))); - case 2: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x0000FF00 ) << leftoverBits)) >> ( 8 + leftoverBits))); - case 1: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x000000FF ) << leftoverBits)) >> ( 0 + leftoverBits))); - case 0: if (leftoverBits > 0) crc = (crc << leftoverBits) ^ drflac__crc16_table[(crc >> (16 - leftoverBits)) ^ (data & leftoverDataMask)]; - } - return crc; -#endif -} - - -static DRFLAC_INLINE drflac_uint16 drflac_crc16(drflac_uint16 crc, drflac_cache_t data, drflac_uint32 count) -{ -#ifdef DRFLAC_64BIT - return drflac_crc16__64bit(crc, data, count); -#else - return drflac_crc16__32bit(crc, data, count); -#endif -} -#endif - - #ifdef DRFLAC_64BIT #define drflac__be2host__cache_line drflac__be2host_64 #else @@ -2454,10 +2199,6 @@ static DRFLAC_INLINE drflac_bool32 drflac__read_uint32(drflac_bs* bs, unsigned i if (!drflac__reload_cache(bs)) { return DRFLAC_FALSE; } - if (bitCountLo > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { - /* This happens when we get to end of stream */ - return DRFLAC_FALSE; - } *pResultOut = (resultHi << bitCountLo) | (drflac_uint32)DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCountLo); bs->consumedBits += bitCountLo; @@ -2512,27 +2253,6 @@ static drflac_bool32 drflac__read_uint64(drflac_bs* bs, unsigned int bitCount, d } #endif -/* Function below is unused, but leaving it here in case I need to quickly add it again. */ -#if 0 -static drflac_bool32 drflac__read_int64(drflac_bs* bs, unsigned int bitCount, drflac_int64* pResultOut) -{ - drflac_uint64 result; - drflac_uint64 signbit; - - DRFLAC_ASSERT(bitCount <= 64); - - if (!drflac__read_uint64(bs, bitCount, &result)) { - return DRFLAC_FALSE; - } - - signbit = ((result >> (bitCount-1)) & 0x01); - result |= (~signbit + 1) << bitCount; - - *pResultOut = (drflac_int64)result; - return DRFLAC_TRUE; -} -#endif - static drflac_bool32 drflac__read_uint16(drflac_bs* bs, unsigned int bitCount, drflac_uint16* pResult) { drflac_uint32 result; @@ -2550,25 +2270,6 @@ static drflac_bool32 drflac__read_uint16(drflac_bs* bs, unsigned int bitCount, d return DRFLAC_TRUE; } -#if 0 -static drflac_bool32 drflac__read_int16(drflac_bs* bs, unsigned int bitCount, drflac_int16* pResult) -{ - drflac_int32 result; - - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(pResult != NULL); - DRFLAC_ASSERT(bitCount > 0); - DRFLAC_ASSERT(bitCount <= 16); - - if (!drflac__read_int32(bs, bitCount, &result)) { - return DRFLAC_FALSE; - } - - *pResult = (drflac_int16)result; - return DRFLAC_TRUE; -} -#endif - static drflac_bool32 drflac__read_uint8(drflac_bs* bs, unsigned int bitCount, drflac_uint8* pResult) { drflac_uint32 result; @@ -2710,13 +2411,6 @@ static drflac_bool32 drflac__find_and_seek_to_next_sync_code(drflac_bs* bs) #if defined(_MSC_VER) && _MSC_VER >= 1400 && (defined(DRFLAC_X64) || defined(DRFLAC_X86)) && !defined(__clang__) #define DRFLAC_IMPLEMENT_CLZ_MSVC #endif -#if defined(__WATCOMC__) && defined(__386__) -#define DRFLAC_IMPLEMENT_CLZ_WATCOM -#endif -#ifdef __MRC__ -#include -#define DRFLAC_IMPLEMENT_CLZ_MRC -#endif static DRFLAC_INLINE drflac_uint32 drflac__clz_software(drflac_cache_t x) { @@ -2757,8 +2451,6 @@ static DRFLAC_INLINE drflac_bool32 drflac__is_lzcnt_supported(void) /* Fast compile time check for ARM. */ #if defined(DRFLAC_HAS_LZCNT_INTRINSIC) && defined(DRFLAC_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 5) return DRFLAC_TRUE; -#elif defined(__MRC__) - return DRFLAC_TRUE; #else /* If the compiler itself does not support the intrinsic then we'll need to return false. */ #ifdef DRFLAC_HAS_LZCNT_INTRINSIC @@ -2815,7 +2507,7 @@ static DRFLAC_INLINE drflac_uint32 drflac__clz_lzcnt(drflac_cache_t x) return r; } - #elif defined(DRFLAC_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 5) && !defined(__ARM_ARCH_6M__) && !defined(DRFLAC_64BIT) /* <-- I haven't tested 64-bit inline assembly, so only enabling this for the 32-bit build for now. */ + #elif defined(DRFLAC_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 5) && !defined(DRFLAC_64BIT) /* <-- I haven't tested 64-bit inline assembly, so only enabling this for the 32-bit build for now. */ { unsigned int r; __asm__ __volatile__ ( @@ -2866,26 +2558,6 @@ static DRFLAC_INLINE drflac_uint32 drflac__clz_msvc(drflac_cache_t x) } #endif -#ifdef DRFLAC_IMPLEMENT_CLZ_WATCOM -static __inline drflac_uint32 drflac__clz_watcom (drflac_uint32); -#ifdef DRFLAC_IMPLEMENT_CLZ_WATCOM_LZCNT -/* Use the LZCNT instruction (only available on some processors since the 2010s). */ -#pragma aux drflac__clz_watcom_lzcnt = \ - "db 0F3h, 0Fh, 0BDh, 0C0h" /* lzcnt eax, eax */ \ - parm [eax] \ - value [eax] \ - modify nomemory; -#else -/* Use the 386+-compatible implementation. */ -#pragma aux drflac__clz_watcom = \ - "bsr eax, eax" \ - "xor eax, 31" \ - parm [eax] nomemory \ - value [eax] \ - modify exact [eax] nomemory; -#endif -#endif - static DRFLAC_INLINE drflac_uint32 drflac__clz(drflac_cache_t x) { #ifdef DRFLAC_IMPLEMENT_CLZ_LZCNT @@ -2896,12 +2568,6 @@ static DRFLAC_INLINE drflac_uint32 drflac__clz(drflac_cache_t x) { #ifdef DRFLAC_IMPLEMENT_CLZ_MSVC return drflac__clz_msvc(x); -#elif defined(DRFLAC_IMPLEMENT_CLZ_WATCOM_LZCNT) - return drflac__clz_watcom_lzcnt(x); -#elif defined(DRFLAC_IMPLEMENT_CLZ_WATCOM) - return (x == 0) ? sizeof(x)*8 : drflac__clz_watcom(x); -#elif defined(__MRC__) - return __cntlzw(x); #else return drflac__clz_software(x); #endif @@ -2921,24 +2587,9 @@ static DRFLAC_INLINE drflac_bool32 drflac__seek_past_next_set_bit(drflac_bs* bs, } } - if (bs->cache == 1) { - /* Not catching this would lead to undefined behaviour: a shift of a 32-bit number by 32 or more is undefined */ - *pOffsetOut = zeroCounter + (drflac_uint32)DRFLAC_CACHE_L1_BITS_REMAINING(bs) - 1; - if (!drflac__reload_cache(bs)) { - return DRFLAC_FALSE; - } - - return DRFLAC_TRUE; - } - setBitOffsetPlus1 = drflac__clz(bs->cache); setBitOffsetPlus1 += 1; - if (setBitOffsetPlus1 > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { - /* This happens when we get to end of stream */ - return DRFLAC_FALSE; - } - bs->consumedBits += setBitOffsetPlus1; bs->cache <<= setBitOffsetPlus1; @@ -3053,25 +2704,6 @@ static drflac_result drflac__read_utf8_coded_number(drflac_bs* bs, drflac_uint64 } -static DRFLAC_INLINE drflac_uint32 drflac__ilog2_u32(drflac_uint32 x) -{ -#if 1 /* Needs optimizing. */ - drflac_uint32 result = 0; - while (x > 0) { - result += 1; - x >>= 1; - } - - return result; -#endif -} - -static DRFLAC_INLINE drflac_bool32 drflac__use_64_bit_prediction(drflac_uint32 bitsPerSample, drflac_uint32 order, drflac_uint32 precision) -{ - /* https://web.archive.org/web/20220205005724/https://github.com/ietf-wg-cellar/flac-specification/blob/37a49aa48ba4ba12e8757badfc59c0df35435fec/rfc_backmatter.md */ - return bitsPerSample + precision + drflac__ilog2_u32(order) > 32; -} - /* The next two functions are responsible for calculating the prediction. @@ -3079,9 +2711,6 @@ The next two functions are responsible for calculating the prediction. When the bits per sample is >16 we need to use 64-bit integer arithmetic because otherwise we'll run out of precision. It's safe to assume this will be slower on 32-bit platforms so we use a more optimal solution when the bits per sample is <=16. */ -#if defined(__clang__) -__attribute__((no_sanitize("signed-integer-overflow"))) -#endif static DRFLAC_INLINE drflac_int32 drflac__calculate_prediction_32(drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pDecodedSamples) { drflac_int32 prediction = 0; @@ -3311,170 +2940,6 @@ static DRFLAC_INLINE drflac_int32 drflac__calculate_prediction_64(drflac_uint32 return (drflac_int32)(prediction >> shift); } - -#if 0 -/* -Reference implementation for reading and decoding samples with residual. This is intentionally left unoptimized for the -sake of readability and should only be used as a reference. -*/ -static drflac_bool32 drflac__decode_samples_with_residual__rice__reference(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut) -{ - drflac_uint32 i; - - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(pSamplesOut != NULL); - - for (i = 0; i < count; ++i) { - drflac_uint32 zeroCounter = 0; - for (;;) { - drflac_uint8 bit; - if (!drflac__read_uint8(bs, 1, &bit)) { - return DRFLAC_FALSE; - } - - if (bit == 0) { - zeroCounter += 1; - } else { - break; - } - } - - drflac_uint32 decodedRice; - if (riceParam > 0) { - if (!drflac__read_uint32(bs, riceParam, &decodedRice)) { - return DRFLAC_FALSE; - } - } else { - decodedRice = 0; - } - - decodedRice |= (zeroCounter << riceParam); - if ((decodedRice & 0x01)) { - decodedRice = ~(decodedRice >> 1); - } else { - decodedRice = (decodedRice >> 1); - } - - - if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) { - pSamplesOut[i] = decodedRice + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + i); - } else { - pSamplesOut[i] = decodedRice + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + i); - } - } - - return DRFLAC_TRUE; -} -#endif - -#if 0 -static drflac_bool32 drflac__read_rice_parts__reference(drflac_bs* bs, drflac_uint8 riceParam, drflac_uint32* pZeroCounterOut, drflac_uint32* pRiceParamPartOut) -{ - drflac_uint32 zeroCounter = 0; - drflac_uint32 decodedRice; - - for (;;) { - drflac_uint8 bit; - if (!drflac__read_uint8(bs, 1, &bit)) { - return DRFLAC_FALSE; - } - - if (bit == 0) { - zeroCounter += 1; - } else { - break; - } - } - - if (riceParam > 0) { - if (!drflac__read_uint32(bs, riceParam, &decodedRice)) { - return DRFLAC_FALSE; - } - } else { - decodedRice = 0; - } - - *pZeroCounterOut = zeroCounter; - *pRiceParamPartOut = decodedRice; - return DRFLAC_TRUE; -} -#endif - -#if 0 -static DRFLAC_INLINE drflac_bool32 drflac__read_rice_parts(drflac_bs* bs, drflac_uint8 riceParam, drflac_uint32* pZeroCounterOut, drflac_uint32* pRiceParamPartOut) -{ - drflac_cache_t riceParamMask; - drflac_uint32 zeroCounter; - drflac_uint32 setBitOffsetPlus1; - drflac_uint32 riceParamPart; - drflac_uint32 riceLength; - - DRFLAC_ASSERT(riceParam > 0); /* <-- riceParam should never be 0. drflac__read_rice_parts__param_equals_zero() should be used instead for this case. */ - - riceParamMask = DRFLAC_CACHE_L1_SELECTION_MASK(riceParam); - - zeroCounter = 0; - while (bs->cache == 0) { - zeroCounter += (drflac_uint32)DRFLAC_CACHE_L1_BITS_REMAINING(bs); - if (!drflac__reload_cache(bs)) { - return DRFLAC_FALSE; - } - } - - setBitOffsetPlus1 = drflac__clz(bs->cache); - zeroCounter += setBitOffsetPlus1; - setBitOffsetPlus1 += 1; - - riceLength = setBitOffsetPlus1 + riceParam; - if (riceLength < DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { - riceParamPart = (drflac_uint32)((bs->cache & (riceParamMask >> setBitOffsetPlus1)) >> DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, riceLength)); - - bs->consumedBits += riceLength; - bs->cache <<= riceLength; - } else { - drflac_uint32 bitCountLo; - drflac_cache_t resultHi; - - bs->consumedBits += riceLength; - bs->cache <<= setBitOffsetPlus1 & (DRFLAC_CACHE_L1_SIZE_BITS(bs)-1); /* <-- Equivalent to "if (setBitOffsetPlus1 < DRFLAC_CACHE_L1_SIZE_BITS(bs)) { bs->cache <<= setBitOffsetPlus1; }" */ - - /* It straddles the cached data. It will never cover more than the next chunk. We just read the number in two parts and combine them. */ - bitCountLo = bs->consumedBits - DRFLAC_CACHE_L1_SIZE_BITS(bs); - resultHi = DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, riceParam); /* <-- Use DRFLAC_CACHE_L1_SELECT_AND_SHIFT_SAFE() if ever this function allows riceParam=0. */ - - if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { -#ifndef DR_FLAC_NO_CRC - drflac__update_crc16(bs); -#endif - bs->cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]); - bs->consumedBits = 0; -#ifndef DR_FLAC_NO_CRC - bs->crc16Cache = bs->cache; -#endif - } else { - /* Slow path. We need to fetch more data from the client. */ - if (!drflac__reload_cache(bs)) { - return DRFLAC_FALSE; - } - if (bitCountLo > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { - /* This happens when we get to end of stream */ - return DRFLAC_FALSE; - } - } - - riceParamPart = (drflac_uint32)(resultHi | DRFLAC_CACHE_L1_SELECT_AND_SHIFT_SAFE(bs, bitCountLo)); - - bs->consumedBits += bitCountLo; - bs->cache <<= bitCountLo; - } - - pZeroCounterOut[0] = zeroCounter; - pRiceParamPartOut[0] = riceParamPart; - - return DRFLAC_TRUE; -} -#endif - static DRFLAC_INLINE drflac_bool32 drflac__read_rice_parts_x1(drflac_bs* bs, drflac_uint8 riceParam, drflac_uint32* pZeroCounterOut, drflac_uint32* pRiceParamPartOut) { drflac_uint32 riceParamPlus1 = riceParam + 1; @@ -3540,10 +3005,6 @@ static DRFLAC_INLINE drflac_bool32 drflac__read_rice_parts_x1(drflac_bs* bs, drf if (!drflac__reload_cache(bs)) { return DRFLAC_FALSE; } - if (riceParamPartLoBitCount > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { - /* This happens when we get to end of stream */ - return DRFLAC_FALSE; - } bs_cache = bs->cache; bs_consumedBits = bs->consumedBits + riceParamPartLoBitCount; @@ -3654,11 +3115,6 @@ static DRFLAC_INLINE drflac_bool32 drflac__seek_rice_parts(drflac_bs* bs, drflac return DRFLAC_FALSE; } - if (riceParamPartLoBitCount > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { - /* This happens when we get to end of stream */ - return DRFLAC_FALSE; - } - bs_cache = bs->cache; bs_consumedBits = bs->consumedBits + riceParamPartLoBitCount; } @@ -3716,6 +3172,7 @@ static drflac_bool32 drflac__decode_samples_with_residual__rice__scalar_zeroorde drflac_uint32 i; DRFLAC_ASSERT(bs != NULL); + DRFLAC_ASSERT(count > 0); DRFLAC_ASSERT(pSamplesOut != NULL); (void)bitsPerSample; @@ -3745,7 +3202,7 @@ static drflac_bool32 drflac__decode_samples_with_residual__rice__scalar_zeroorde return DRFLAC_TRUE; } -static drflac_bool32 drflac__decode_samples_with_residual__rice__scalar(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut) +static drflac_bool32 drflac__decode_samples_with_residual__rice__scalar(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut) { drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF}; drflac_uint32 zeroCountPart0 = 0; @@ -3761,16 +3218,17 @@ static drflac_bool32 drflac__decode_samples_with_residual__rice__scalar(drflac_b drflac_uint32 i; DRFLAC_ASSERT(bs != NULL); + DRFLAC_ASSERT(count > 0); DRFLAC_ASSERT(pSamplesOut != NULL); - if (lpcOrder == 0) { - return drflac__decode_samples_with_residual__rice__scalar_zeroorder(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut); + if (order == 0) { + return drflac__decode_samples_with_residual__rice__scalar_zeroorder(bs, bitsPerSample, count, riceParam, order, shift, coefficients, pSamplesOut); } riceParamMask = (drflac_uint32)~((~0UL) << riceParam); pSamplesOutEnd = pSamplesOut + (count & ~3); - if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) { + if (bitsPerSample+shift > 32) { while (pSamplesOut < pSamplesOutEnd) { /* Rice extraction. It's faster to do this one at a time against local variables than it is to use the x4 version @@ -3798,10 +3256,10 @@ static drflac_bool32 drflac__decode_samples_with_residual__rice__scalar(drflac_b riceParamPart2 = (riceParamPart2 >> 1) ^ t[riceParamPart2 & 0x01]; riceParamPart3 = (riceParamPart3 >> 1) ^ t[riceParamPart3 & 0x01]; - pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 0); - pSamplesOut[1] = riceParamPart1 + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 1); - pSamplesOut[2] = riceParamPart2 + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 2); - pSamplesOut[3] = riceParamPart3 + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 3); + pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_64(order, shift, coefficients, pSamplesOut + 0); + pSamplesOut[1] = riceParamPart1 + drflac__calculate_prediction_64(order, shift, coefficients, pSamplesOut + 1); + pSamplesOut[2] = riceParamPart2 + drflac__calculate_prediction_64(order, shift, coefficients, pSamplesOut + 2); + pSamplesOut[3] = riceParamPart3 + drflac__calculate_prediction_64(order, shift, coefficients, pSamplesOut + 3); pSamplesOut += 4; } @@ -3829,10 +3287,10 @@ static drflac_bool32 drflac__decode_samples_with_residual__rice__scalar(drflac_b riceParamPart2 = (riceParamPart2 >> 1) ^ t[riceParamPart2 & 0x01]; riceParamPart3 = (riceParamPart3 >> 1) ^ t[riceParamPart3 & 0x01]; - pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 0); - pSamplesOut[1] = riceParamPart1 + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 1); - pSamplesOut[2] = riceParamPart2 + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 2); - pSamplesOut[3] = riceParamPart3 + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 3); + pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + 0); + pSamplesOut[1] = riceParamPart1 + drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + 1); + pSamplesOut[2] = riceParamPart2 + drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + 2); + pSamplesOut[3] = riceParamPart3 + drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + 3); pSamplesOut += 4; } @@ -3852,10 +3310,10 @@ static drflac_bool32 drflac__decode_samples_with_residual__rice__scalar(drflac_b /*riceParamPart0 = (riceParamPart0 >> 1) ^ (~(riceParamPart0 & 0x01) + 1);*/ /* Sample reconstruction. */ - if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) { - pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 0); + if (bitsPerSample+shift > 32) { + pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_64(order, shift, coefficients, pSamplesOut + 0); } else { - pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 0); + pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + 0); } i += 1; @@ -4311,20 +3769,21 @@ static drflac_bool32 drflac__decode_samples_with_residual__rice__sse41_64(drflac return DRFLAC_TRUE; } -static drflac_bool32 drflac__decode_samples_with_residual__rice__sse41(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut) +static drflac_bool32 drflac__decode_samples_with_residual__rice__sse41(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut) { DRFLAC_ASSERT(bs != NULL); + DRFLAC_ASSERT(count > 0); DRFLAC_ASSERT(pSamplesOut != NULL); /* In my testing the order is rarely > 12, so in this case I'm going to simplify the SSE implementation by only handling order <= 12. */ - if (lpcOrder > 0 && lpcOrder <= 12) { - if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) { - return drflac__decode_samples_with_residual__rice__sse41_64(bs, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut); + if (order > 0 && order <= 12) { + if (bitsPerSample+shift > 32) { + return drflac__decode_samples_with_residual__rice__sse41_64(bs, count, riceParam, order, shift, coefficients, pSamplesOut); } else { - return drflac__decode_samples_with_residual__rice__sse41_32(bs, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut); + return drflac__decode_samples_with_residual__rice__sse41_32(bs, count, riceParam, order, shift, coefficients, pSamplesOut); } } else { - return drflac__decode_samples_with_residual__rice__scalar(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut); + return drflac__decode_samples_with_residual__rice__scalar(bs, bitsPerSample, count, riceParam, order, shift, coefficients, pSamplesOut); } } #endif @@ -4463,7 +3922,7 @@ static drflac_bool32 drflac__decode_samples_with_residual__rice__neon_32(drflac_ const drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF}; - riceParamMask = (drflac_uint32)~((~0UL) << riceParam); + riceParamMask = ~((~0UL) << riceParam); riceParamMask128 = vdupq_n_u32(riceParamMask); riceParam128 = vdupq_n_s32(riceParam); @@ -4649,13 +4108,10 @@ static drflac_bool32 drflac__decode_samples_with_residual__rice__neon_64(drflac_ int32x4_t riceParam128; int64x1_t shift64; uint32x4_t one128; - int64x2_t prediction128 = { 0 }; - uint32x4_t zeroCountPart128; - uint32x4_t riceParamPart128; const drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF}; - riceParamMask = (drflac_uint32)~((~0UL) << riceParam); + riceParamMask = ~((~0UL) << riceParam); riceParamMask128 = vdupq_n_u32(riceParamMask); riceParam128 = vdupq_n_s32(riceParam); @@ -4664,7 +4120,7 @@ static drflac_bool32 drflac__decode_samples_with_residual__rice__neon_64(drflac_ /* Pre-loading the coefficients and prior samples is annoying because we need to ensure we don't try reading more than - what's available in the input buffers. It would be convenient to use a fall-through switch to do this, but this results + what's available in the input buffers. It would be conenient to use a fall-through switch to do this, but this results in strict aliasing warnings with GCC. To work around this I'm just doing something hacky. This feels a bit convoluted so I think there's opportunity for this to be simplified. */ @@ -4732,6 +4188,10 @@ static drflac_bool32 drflac__decode_samples_with_residual__rice__neon_64(drflac_ /* For this version we are doing one sample at a time. */ while (pDecodedSamples < pDecodedSamplesEnd) { + int64x2_t prediction128; + uint32x4_t zeroCountPart128; + uint32x4_t riceParamPart128; + if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[0], &riceParamParts[0]) || !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[1], &riceParamParts[1]) || !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[2], &riceParamParts[2]) || @@ -4808,42 +4268,39 @@ static drflac_bool32 drflac__decode_samples_with_residual__rice__neon_64(drflac_ return DRFLAC_TRUE; } -static drflac_bool32 drflac__decode_samples_with_residual__rice__neon(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut) +static drflac_bool32 drflac__decode_samples_with_residual__rice__neon(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut) { DRFLAC_ASSERT(bs != NULL); + DRFLAC_ASSERT(count > 0); DRFLAC_ASSERT(pSamplesOut != NULL); /* In my testing the order is rarely > 12, so in this case I'm going to simplify the NEON implementation by only handling order <= 12. */ - if (lpcOrder > 0 && lpcOrder <= 12) { - if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) { - return drflac__decode_samples_with_residual__rice__neon_64(bs, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut); + if (order > 0 && order <= 12) { + if (bitsPerSample+shift > 32) { + return drflac__decode_samples_with_residual__rice__neon_64(bs, count, riceParam, order, shift, coefficients, pSamplesOut); } else { - return drflac__decode_samples_with_residual__rice__neon_32(bs, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut); + return drflac__decode_samples_with_residual__rice__neon_32(bs, count, riceParam, order, shift, coefficients, pSamplesOut); } } else { - return drflac__decode_samples_with_residual__rice__scalar(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut); + return drflac__decode_samples_with_residual__rice__scalar(bs, bitsPerSample, count, riceParam, order, shift, coefficients, pSamplesOut); } } #endif -static drflac_bool32 drflac__decode_samples_with_residual__rice(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut) +static drflac_bool32 drflac__decode_samples_with_residual__rice(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut) { #if defined(DRFLAC_SUPPORT_SSE41) if (drflac__gIsSSE41Supported) { - return drflac__decode_samples_with_residual__rice__sse41(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut); + return drflac__decode_samples_with_residual__rice__sse41(bs, bitsPerSample, count, riceParam, order, shift, coefficients, pSamplesOut); } else #elif defined(DRFLAC_SUPPORT_NEON) if (drflac__gIsNEONSupported) { - return drflac__decode_samples_with_residual__rice__neon(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut); + return drflac__decode_samples_with_residual__rice__neon(bs, bitsPerSample, count, riceParam, order, shift, coefficients, pSamplesOut); } else #endif { /* Scalar fallback. */ - #if 0 - return drflac__decode_samples_with_residual__rice__reference(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut); - #else - return drflac__decode_samples_with_residual__rice__scalar(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut); - #endif + return drflac__decode_samples_with_residual__rice__scalar(bs, bitsPerSample, count, riceParam, order, shift, coefficients, pSamplesOut); } } @@ -4853,6 +4310,7 @@ static drflac_bool32 drflac__read_and_seek_residual__rice(drflac_bs* bs, drflac_ drflac_uint32 i; DRFLAC_ASSERT(bs != NULL); + DRFLAC_ASSERT(count > 0); for (i = 0; i < count; ++i) { if (!drflac__seek_rice_parts(bs, riceParam)) { @@ -4863,14 +4321,12 @@ static drflac_bool32 drflac__read_and_seek_residual__rice(drflac_bs* bs, drflac_ return DRFLAC_TRUE; } -#if defined(__clang__) -__attribute__((no_sanitize("signed-integer-overflow"))) -#endif -static drflac_bool32 drflac__decode_samples_with_residual__unencoded(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 unencodedBitsPerSample, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut) +static drflac_bool32 drflac__decode_samples_with_residual__unencoded(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 unencodedBitsPerSample, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut) { drflac_uint32 i; DRFLAC_ASSERT(bs != NULL); + DRFLAC_ASSERT(count > 0); DRFLAC_ASSERT(unencodedBitsPerSample <= 31); /* <-- unencodedBitsPerSample is a 5 bit number, so cannot exceed 31. */ DRFLAC_ASSERT(pSamplesOut != NULL); @@ -4883,10 +4339,10 @@ static drflac_bool32 drflac__decode_samples_with_residual__unencoded(drflac_bs* pSamplesOut[i] = 0; } - if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) { - pSamplesOut[i] += drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + i); + if (bitsPerSample >= 24) { + pSamplesOut[i] += drflac__calculate_prediction_64(order, shift, coefficients, pSamplesOut + i); } else { - pSamplesOut[i] += drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + i); + pSamplesOut[i] += drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + i); } } @@ -4899,7 +4355,7 @@ Reads and decodes the residual for the sub-frame the decoder is currently sittin when the decoder is sitting at the very start of the RESIDUAL block. The first residuals will be ignored. The and parameters are used to determine how many residual values need to be decoded. */ -static drflac_bool32 drflac__decode_samples_with_residual(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 blockSize, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pDecodedSamples) +static drflac_bool32 drflac__decode_samples_with_residual(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 blockSize, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pDecodedSamples) { drflac_uint8 residualMethod; drflac_uint8 partitionOrder; @@ -4919,7 +4375,7 @@ static drflac_bool32 drflac__decode_samples_with_residual(drflac_bs* bs, drflac_ } /* Ignore the first values. */ - pDecodedSamples += lpcOrder; + pDecodedSamples += order; if (!drflac__read_uint8(bs, 4, &partitionOrder)) { return DRFLAC_FALSE; @@ -4934,11 +4390,11 @@ static drflac_bool32 drflac__decode_samples_with_residual(drflac_bs* bs, drflac_ } /* Validation check. */ - if ((blockSize / (1 << partitionOrder)) < lpcOrder) { + if ((blockSize / (1 << partitionOrder)) <= order) { return DRFLAC_FALSE; } - samplesInPartition = (blockSize / (1 << partitionOrder)) - lpcOrder; + samplesInPartition = (blockSize / (1 << partitionOrder)) - order; partitionsRemaining = (1 << partitionOrder); for (;;) { drflac_uint8 riceParam = 0; @@ -4959,7 +4415,7 @@ static drflac_bool32 drflac__decode_samples_with_residual(drflac_bs* bs, drflac_ } if (riceParam != 0xFF) { - if (!drflac__decode_samples_with_residual__rice(bs, bitsPerSample, samplesInPartition, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pDecodedSamples)) { + if (!drflac__decode_samples_with_residual__rice(bs, bitsPerSample, samplesInPartition, riceParam, order, shift, coefficients, pDecodedSamples)) { return DRFLAC_FALSE; } } else { @@ -4968,7 +4424,7 @@ static drflac_bool32 drflac__decode_samples_with_residual(drflac_bs* bs, drflac_ return DRFLAC_FALSE; } - if (!drflac__decode_samples_with_residual__unencoded(bs, bitsPerSample, samplesInPartition, unencodedBitsPerSample, lpcOrder, lpcShift, lpcPrecision, coefficients, pDecodedSamples)) { + if (!drflac__decode_samples_with_residual__unencoded(bs, bitsPerSample, samplesInPartition, unencodedBitsPerSample, order, shift, coefficients, pDecodedSamples)) { return DRFLAC_FALSE; } } @@ -5137,7 +4593,7 @@ static drflac_bool32 drflac__decode_samples__fixed(drflac_bs* bs, drflac_uint32 pDecodedSamples[i] = sample; } - if (!drflac__decode_samples_with_residual(bs, subframeBitsPerSample, blockSize, lpcOrder, 0, 4, lpcCoefficientsTable[lpcOrder], pDecodedSamples)) { + if (!drflac__decode_samples_with_residual(bs, subframeBitsPerSample, blockSize, lpcOrder, 0, lpcCoefficientsTable[lpcOrder], pDecodedSamples)) { return DRFLAC_FALSE; } @@ -5192,7 +4648,7 @@ static drflac_bool32 drflac__decode_samples__lpc(drflac_bs* bs, drflac_uint32 bl } } - if (!drflac__decode_samples_with_residual(bs, bitsPerSample, blockSize, lpcOrder, lpcShift, lpcPrecision, coefficients, pDecodedSamples)) { + if (!drflac__decode_samples_with_residual(bs, bitsPerSample, blockSize, lpcOrder, lpcShift, coefficients, pDecodedSamples)) { return DRFLAC_FALSE; } @@ -5320,9 +4776,6 @@ static drflac_bool32 drflac__read_next_flac_frame_header(drflac_bs* bs, drflac_u return DRFLAC_FALSE; } crc8 = drflac_crc8(crc8, header->blockSizeInPCMFrames, 16); - if (header->blockSizeInPCMFrames == 0xFFFF) { - return DRFLAC_FALSE; /* Frame is too big. This is the size of the frame minus 1. The STREAMINFO block defines the max block size which is 16-bits. Adding one will make it 17 bits and therefore too big. */ - } header->blockSizeInPCMFrames += 1; } else { DRFLAC_ASSERT(blockSize >= 8); @@ -5361,11 +4814,6 @@ static drflac_bool32 drflac__read_next_flac_frame_header(drflac_bs* bs, drflac_u header->bitsPerSample = streaminfoBitsPerSample; } - if (header->bitsPerSample != streaminfoBitsPerSample) { - /* If this subframe has a different bitsPerSample then streaminfo or the first frame, reject it */ - return DRFLAC_FALSE; - } - if (!drflac__read_uint8(bs, 8, &header->crc8)) { return DRFLAC_FALSE; } @@ -5452,11 +4900,6 @@ static drflac_bool32 drflac__decode_subframe(drflac_bs* bs, drflac_frame* frame, subframeBitsPerSample += 1; } - if (subframeBitsPerSample > 32) { - /* libFLAC and ffmpeg reject 33-bit subframes as well */ - return DRFLAC_FALSE; - } - /* Need to handle wasted bits per sample. */ if (pSubframe->wastedBitsPerSample >= subframeBitsPerSample) { return DRFLAC_FALSE; @@ -5976,15 +5419,6 @@ static drflac_bool32 drflac__seek_to_approximate_flac_frame_to_byte(drflac* pFla static drflac_bool32 drflac__decode_flac_frame_and_seek_forward_by_pcm_frames(drflac* pFlac, drflac_uint64 offset) { /* This section of code would be used if we were only decoding the FLAC frame header when calling drflac__seek_to_approximate_flac_frame_to_byte(). */ -#if 0 - if (drflac__decode_flac_frame(pFlac) != DRFLAC_SUCCESS) { - /* We failed to decode this frame which may be due to it being corrupt. We'll just use the next valid FLAC frame. */ - if (drflac__read_and_decode_next_flac_frame(pFlac) == DRFLAC_FALSE) { - return DRFLAC_FALSE; - } - } -#endif - return drflac__seek_forward_by_pcm_frames(pFlac, offset) == offset; } @@ -6127,11 +5561,6 @@ static drflac_bool32 drflac__seek_to_pcm_frame__seek_table(drflac* pFlac, drflac return DRFLAC_FALSE; } - /* Do not use the seektable if pcmFramIndex is not coverd by it. */ - if (pFlac->pSeekpoints[0].firstPCMFrame > pcmFrameIndex) { - return DRFLAC_FALSE; - } - for (iSeekpoint = 0; iSeekpoint < pFlac->seekpointCount; ++iSeekpoint) { if (pFlac->pSeekpoints[iSeekpoint].firstPCMFrame >= pcmFrameIndex) { break; @@ -6479,7 +5908,7 @@ static void drflac__free_from_callbacks(void* p, const drflac_allocation_callbac } -static drflac_bool32 drflac__read_and_decode_metadata(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD, drflac_uint64* pFirstFramePos, drflac_uint64* pSeektablePos, drflac_uint32* pSeekpointCount, drflac_allocation_callbacks* pAllocationCallbacks) +static drflac_bool32 drflac__read_and_decode_metadata(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD, drflac_uint64* pFirstFramePos, drflac_uint64* pSeektablePos, drflac_uint32* pSeektableSize, drflac_allocation_callbacks* pAllocationCallbacks) { /* We want to keep track of the byte position in the stream of the seektable. At the time of calling this function we know that @@ -6492,7 +5921,7 @@ static drflac_bool32 drflac__read_and_decode_metadata(drflac_read_proc onRead, d for (;;) { drflac_metadata metadata; drflac_uint8 isLastBlock = 0; - drflac_uint8 blockType = 0; + drflac_uint8 blockType; drflac_uint32 blockSize; if (drflac__read_and_decode_block_header(onRead, pUserData, &isLastBlock, &blockType, &blockSize) == DRFLAC_FALSE) { return DRFLAC_FALSE; @@ -6539,37 +5968,32 @@ static drflac_bool32 drflac__read_and_decode_metadata(drflac_read_proc onRead, d seektableSize = blockSize; if (onMeta) { - drflac_uint32 seekpointCount; drflac_uint32 iSeekpoint; void* pRawData; - seekpointCount = blockSize/DRFLAC_SEEKPOINT_SIZE_IN_BYTES; - - pRawData = drflac__malloc_from_callbacks(seekpointCount * sizeof(drflac_seekpoint), pAllocationCallbacks); + pRawData = drflac__malloc_from_callbacks(blockSize, pAllocationCallbacks); if (pRawData == NULL) { return DRFLAC_FALSE; } - /* We need to read seekpoint by seekpoint and do some processing. */ - for (iSeekpoint = 0; iSeekpoint < seekpointCount; ++iSeekpoint) { - drflac_seekpoint* pSeekpoint = (drflac_seekpoint*)pRawData + iSeekpoint; + if (onRead(pUserData, pRawData, blockSize) != blockSize) { + drflac__free_from_callbacks(pRawData, pAllocationCallbacks); + return DRFLAC_FALSE; + } - if (onRead(pUserData, pSeekpoint, DRFLAC_SEEKPOINT_SIZE_IN_BYTES) != DRFLAC_SEEKPOINT_SIZE_IN_BYTES) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } + metadata.pRawData = pRawData; + metadata.rawDataSize = blockSize; + metadata.data.seektable.seekpointCount = blockSize/sizeof(drflac_seekpoint); + metadata.data.seektable.pSeekpoints = (const drflac_seekpoint*)pRawData; - /* Endian swap. */ + /* Endian swap. */ + for (iSeekpoint = 0; iSeekpoint < metadata.data.seektable.seekpointCount; ++iSeekpoint) { + drflac_seekpoint* pSeekpoint = (drflac_seekpoint*)pRawData + iSeekpoint; pSeekpoint->firstPCMFrame = drflac__be2host_64(pSeekpoint->firstPCMFrame); pSeekpoint->flacFrameOffset = drflac__be2host_64(pSeekpoint->flacFrameOffset); pSeekpoint->pcmFrameCount = drflac__be2host_16(pSeekpoint->pcmFrameCount); } - metadata.pRawData = pRawData; - metadata.rawDataSize = blockSize; - metadata.data.seektable.seekpointCount = seekpointCount; - metadata.data.seektable.pSeekpoints = (const drflac_seekpoint*)pRawData; - onMeta(pUserDataMD, &metadata); drflac__free_from_callbacks(pRawData, pAllocationCallbacks); @@ -6604,7 +6028,7 @@ static drflac_bool32 drflac__read_and_decode_metadata(drflac_read_proc onRead, d pRunningData = (const char*)pRawData; pRunningDataEnd = (const char*)pRawData + blockSize; - metadata.data.vorbis_comment.vendorLength = drflac__le2host_32_ptr_unaligned(pRunningData); pRunningData += 4; + metadata.data.vorbis_comment.vendorLength = drflac__le2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; /* Need space for the rest of the block */ if ((pRunningDataEnd - pRunningData) - 4 < (drflac_int64)metadata.data.vorbis_comment.vendorLength) { /* <-- Note the order of operations to avoid overflow to a valid value */ @@ -6612,7 +6036,7 @@ static drflac_bool32 drflac__read_and_decode_metadata(drflac_read_proc onRead, d return DRFLAC_FALSE; } metadata.data.vorbis_comment.vendor = pRunningData; pRunningData += metadata.data.vorbis_comment.vendorLength; - metadata.data.vorbis_comment.commentCount = drflac__le2host_32_ptr_unaligned(pRunningData); pRunningData += 4; + metadata.data.vorbis_comment.commentCount = drflac__le2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; /* Need space for 'commentCount' comments after the block, which at minimum is a drflac_uint32 per comment */ if ((pRunningDataEnd - pRunningData) / sizeof(drflac_uint32) < metadata.data.vorbis_comment.commentCount) { /* <-- Note the order of operations to avoid overflow to a valid value */ @@ -6630,7 +6054,7 @@ static drflac_bool32 drflac__read_and_decode_metadata(drflac_read_proc onRead, d return DRFLAC_FALSE; } - commentLength = drflac__le2host_32_ptr_unaligned(pRunningData); pRunningData += 4; + commentLength = drflac__le2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; if (pRunningDataEnd - pRunningData < (drflac_int64)commentLength) { /* <-- Note the order of operations to avoid overflow to a valid value */ drflac__free_from_callbacks(pRawData, pAllocationCallbacks); return DRFLAC_FALSE; @@ -6654,15 +6078,9 @@ static drflac_bool32 drflac__read_and_decode_metadata(drflac_read_proc onRead, d void* pRawData; const char* pRunningData; const char* pRunningDataEnd; - size_t bufferSize; drflac_uint8 iTrack; drflac_uint8 iIndex; - void* pTrackData; - /* - This needs to be loaded in two passes. The first pass is used to calculate the size of the memory allocation - we need for storing the necessary data. The second pass will fill that buffer with usable data. - */ pRawData = drflac__malloc_from_callbacks(blockSize, pAllocationCallbacks); if (pRawData == NULL) { return DRFLAC_FALSE; @@ -6683,91 +6101,38 @@ static drflac_bool32 drflac__read_and_decode_metadata(drflac_read_proc onRead, d metadata.data.cuesheet.leadInSampleCount = drflac__be2host_64(*(const drflac_uint64*)pRunningData); pRunningData += 8; metadata.data.cuesheet.isCD = (pRunningData[0] & 0x80) != 0; pRunningData += 259; metadata.data.cuesheet.trackCount = pRunningData[0]; pRunningData += 1; - metadata.data.cuesheet.pTrackData = NULL; /* Will be filled later. */ - - /* Pass 1: Calculate the size of the buffer for the track data. */ - { - const char* pRunningDataSaved = pRunningData; /* Will be restored at the end in preparation for the second pass. */ - - bufferSize = metadata.data.cuesheet.trackCount * DRFLAC_CUESHEET_TRACK_SIZE_IN_BYTES; - - for (iTrack = 0; iTrack < metadata.data.cuesheet.trackCount; ++iTrack) { - drflac_uint8 indexCount; - drflac_uint32 indexPointSize; - - if (pRunningDataEnd - pRunningData < DRFLAC_CUESHEET_TRACK_SIZE_IN_BYTES) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } + metadata.data.cuesheet.pTrackData = pRunningData; - /* Skip to the index point count */ - pRunningData += 35; - - indexCount = pRunningData[0]; - pRunningData += 1; - - bufferSize += indexCount * sizeof(drflac_cuesheet_track_index); - - /* Quick validation check. */ - indexPointSize = indexCount * DRFLAC_CUESHEET_TRACK_INDEX_SIZE_IN_BYTES; - if (pRunningDataEnd - pRunningData < (drflac_int64)indexPointSize) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } + /* Check that the cuesheet tracks are valid before passing it to the callback */ + for (iTrack = 0; iTrack < metadata.data.cuesheet.trackCount; ++iTrack) { + drflac_uint8 indexCount; + drflac_uint32 indexPointSize; - pRunningData += indexPointSize; + if (pRunningDataEnd - pRunningData < 36) { + drflac__free_from_callbacks(pRawData, pAllocationCallbacks); + return DRFLAC_FALSE; } - pRunningData = pRunningDataSaved; - } - - /* Pass 2: Allocate a buffer and fill the data. Validation was done in the step above so can be skipped. */ - { - char* pRunningTrackData; - - pTrackData = drflac__malloc_from_callbacks(bufferSize, pAllocationCallbacks); - if (pTrackData == NULL) { + /* Skip to the index point count */ + pRunningData += 35; + indexCount = pRunningData[0]; pRunningData += 1; + indexPointSize = indexCount * sizeof(drflac_cuesheet_track_index); + if (pRunningDataEnd - pRunningData < (drflac_int64)indexPointSize) { drflac__free_from_callbacks(pRawData, pAllocationCallbacks); return DRFLAC_FALSE; } - pRunningTrackData = (char*)pTrackData; - - for (iTrack = 0; iTrack < metadata.data.cuesheet.trackCount; ++iTrack) { - drflac_uint8 indexCount; - - DRFLAC_COPY_MEMORY(pRunningTrackData, pRunningData, DRFLAC_CUESHEET_TRACK_SIZE_IN_BYTES); - pRunningData += DRFLAC_CUESHEET_TRACK_SIZE_IN_BYTES-1; /* Skip forward, but not beyond the last byte in the CUESHEET_TRACK block which is the index count. */ - pRunningTrackData += DRFLAC_CUESHEET_TRACK_SIZE_IN_BYTES-1; - - /* Grab the index count for the next part. */ - indexCount = pRunningData[0]; - pRunningData += 1; - pRunningTrackData += 1; - - /* Extract each track index. */ - for (iIndex = 0; iIndex < indexCount; ++iIndex) { - drflac_cuesheet_track_index* pTrackIndex = (drflac_cuesheet_track_index*)pRunningTrackData; - - DRFLAC_COPY_MEMORY(pRunningTrackData, pRunningData, DRFLAC_CUESHEET_TRACK_INDEX_SIZE_IN_BYTES); - pRunningData += DRFLAC_CUESHEET_TRACK_INDEX_SIZE_IN_BYTES; - pRunningTrackData += sizeof(drflac_cuesheet_track_index); - - pTrackIndex->offset = drflac__be2host_64(pTrackIndex->offset); - } + /* Endian swap. */ + for (iIndex = 0; iIndex < indexCount; ++iIndex) { + drflac_cuesheet_track_index* pTrack = (drflac_cuesheet_track_index*)pRunningData; + pRunningData += sizeof(drflac_cuesheet_track_index); + pTrack->offset = drflac__be2host_64(pTrack->offset); } - - metadata.data.cuesheet.pTrackData = pTrackData; } - /* The original data is no longer needed. */ - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - pRawData = NULL; - onMeta(pUserDataMD, &metadata); - drflac__free_from_callbacks(pTrackData, pAllocationCallbacks); - pTrackData = NULL; + drflac__free_from_callbacks(pRawData, pAllocationCallbacks); } } break; @@ -6798,28 +6163,28 @@ static drflac_bool32 drflac__read_and_decode_metadata(drflac_read_proc onRead, d pRunningData = (const char*)pRawData; pRunningDataEnd = (const char*)pRawData + blockSize; - metadata.data.picture.type = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.mimeLength = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; + metadata.data.picture.type = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + metadata.data.picture.mimeLength = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; /* Need space for the rest of the block */ if ((pRunningDataEnd - pRunningData) - 24 < (drflac_int64)metadata.data.picture.mimeLength) { /* <-- Note the order of operations to avoid overflow to a valid value */ drflac__free_from_callbacks(pRawData, pAllocationCallbacks); return DRFLAC_FALSE; } - metadata.data.picture.mime = pRunningData; pRunningData += metadata.data.picture.mimeLength; - metadata.data.picture.descriptionLength = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; + metadata.data.picture.mime = pRunningData; pRunningData += metadata.data.picture.mimeLength; + metadata.data.picture.descriptionLength = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; /* Need space for the rest of the block */ if ((pRunningDataEnd - pRunningData) - 20 < (drflac_int64)metadata.data.picture.descriptionLength) { /* <-- Note the order of operations to avoid overflow to a valid value */ drflac__free_from_callbacks(pRawData, pAllocationCallbacks); return DRFLAC_FALSE; } - metadata.data.picture.description = pRunningData; pRunningData += metadata.data.picture.descriptionLength; - metadata.data.picture.width = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.height = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.colorDepth = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.indexColorCount = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.pictureDataSize = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; + metadata.data.picture.description = pRunningData; pRunningData += metadata.data.picture.descriptionLength; + metadata.data.picture.width = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + metadata.data.picture.height = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + metadata.data.picture.colorDepth = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + metadata.data.picture.indexColorCount = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + metadata.data.picture.pictureDataSize = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; metadata.data.picture.pPictureData = (const drflac_uint8*)pRunningData; /* Need space for the picture after the block */ @@ -6897,9 +6262,9 @@ static drflac_bool32 drflac__read_and_decode_metadata(drflac_read_proc onRead, d } } - *pSeektablePos = seektablePos; - *pSeekpointCount = seektableSize / DRFLAC_SEEKPOINT_SIZE_IN_BYTES; - *pFirstFramePos = runningFilePos; + *pSeektablePos = seektablePos; + *pSeektableSize = seektableSize; + *pFirstFramePos = runningFilePos; return DRFLAC_TRUE; } @@ -7063,24 +6428,6 @@ static DRFLAC_INLINE drflac_uint32 drflac_crc32_byte(drflac_uint32 crc32, drflac #endif } -#if 0 -static DRFLAC_INLINE drflac_uint32 drflac_crc32_uint32(drflac_uint32 crc32, drflac_uint32 data) -{ - crc32 = drflac_crc32_byte(crc32, (drflac_uint8)((data >> 24) & 0xFF)); - crc32 = drflac_crc32_byte(crc32, (drflac_uint8)((data >> 16) & 0xFF)); - crc32 = drflac_crc32_byte(crc32, (drflac_uint8)((data >> 8) & 0xFF)); - crc32 = drflac_crc32_byte(crc32, (drflac_uint8)((data >> 0) & 0xFF)); - return crc32; -} - -static DRFLAC_INLINE drflac_uint32 drflac_crc32_uint64(drflac_uint32 crc32, drflac_uint64 data) -{ - crc32 = drflac_crc32_uint32(crc32, (drflac_uint32)((data >> 32) & 0xFFFFFFFF)); - crc32 = drflac_crc32_uint32(crc32, (drflac_uint32)((data >> 0) & 0xFFFFFFFF)); - return crc32; -} -#endif - static DRFLAC_INLINE drflac_uint32 drflac_crc32_buffer(drflac_uint32 crc32, drflac_uint8* pData, drflac_uint32 dataSize) { /* This can be optimized. */ @@ -7337,85 +6684,6 @@ static drflac_bool32 drflac_oggbs__goto_next_page(drflac_oggbs* oggbs, drflac_og } /* Function below is unused at the moment, but I might be re-adding it later. */ -#if 0 -static drflac_uint8 drflac_oggbs__get_current_segment_index(drflac_oggbs* oggbs, drflac_uint8* pBytesRemainingInSeg) -{ - drflac_uint32 bytesConsumedInPage = drflac_ogg__get_page_body_size(&oggbs->currentPageHeader) - oggbs->bytesRemainingInPage; - drflac_uint8 iSeg = 0; - drflac_uint32 iByte = 0; - while (iByte < bytesConsumedInPage) { - drflac_uint8 segmentSize = oggbs->currentPageHeader.segmentTable[iSeg]; - if (iByte + segmentSize > bytesConsumedInPage) { - break; - } else { - iSeg += 1; - iByte += segmentSize; - } - } - - *pBytesRemainingInSeg = oggbs->currentPageHeader.segmentTable[iSeg] - (drflac_uint8)(bytesConsumedInPage - iByte); - return iSeg; -} - -static drflac_bool32 drflac_oggbs__seek_to_next_packet(drflac_oggbs* oggbs) -{ - /* The current packet ends when we get to the segment with a lacing value of < 255 which is not at the end of a page. */ - for (;;) { - drflac_bool32 atEndOfPage = DRFLAC_FALSE; - - drflac_uint8 bytesRemainingInSeg; - drflac_uint8 iFirstSeg = drflac_oggbs__get_current_segment_index(oggbs, &bytesRemainingInSeg); - - drflac_uint32 bytesToEndOfPacketOrPage = bytesRemainingInSeg; - for (drflac_uint8 iSeg = iFirstSeg; iSeg < oggbs->currentPageHeader.segmentCount; ++iSeg) { - drflac_uint8 segmentSize = oggbs->currentPageHeader.segmentTable[iSeg]; - if (segmentSize < 255) { - if (iSeg == oggbs->currentPageHeader.segmentCount-1) { - atEndOfPage = DRFLAC_TRUE; - } - - break; - } - - bytesToEndOfPacketOrPage += segmentSize; - } - - /* - At this point we will have found either the packet or the end of the page. If were at the end of the page we'll - want to load the next page and keep searching for the end of the packet. - */ - drflac_oggbs__seek_physical(oggbs, bytesToEndOfPacketOrPage, drflac_seek_origin_current); - oggbs->bytesRemainingInPage -= bytesToEndOfPacketOrPage; - - if (atEndOfPage) { - /* - We're potentially at the next packet, but we need to check the next page first to be sure because the packet may - straddle pages. - */ - if (!drflac_oggbs__goto_next_page(oggbs)) { - return DRFLAC_FALSE; - } - - /* If it's a fresh packet it most likely means we're at the next packet. */ - if ((oggbs->currentPageHeader.headerType & 0x01) == 0) { - return DRFLAC_TRUE; - } - } else { - /* We're at the next packet. */ - return DRFLAC_TRUE; - } - } -} - -static drflac_bool32 drflac_oggbs__seek_to_next_frame(drflac_oggbs* oggbs) -{ - /* The bitstream should be sitting on the first byte just after the header of the frame. */ - - /* What we're actually doing here is seeking to the start of the next packet. */ - return drflac_oggbs__seek_to_next_packet(oggbs); -} -#endif - static size_t drflac__on_read_ogg(void* pUserData, void* bufferOut, size_t bytesToRead) { drflac_oggbs* oggbs = (drflac_oggbs*)pUserData; @@ -7929,11 +7197,11 @@ static drflac* drflac_open_with_metadata_private(drflac_read_proc onRead, drflac drflac_uint32 wholeSIMDVectorCountPerChannel; drflac_uint32 decodedSamplesAllocationSize; #ifndef DR_FLAC_NO_OGG - drflac_oggbs* pOggbs = NULL; + drflac_oggbs oggbs; #endif drflac_uint64 firstFramePos; drflac_uint64 seektablePos; - drflac_uint32 seekpointCount; + drflac_uint32 seektableSize; drflac_allocation_callbacks allocationCallbacks; drflac* pFlac; @@ -7987,21 +7255,18 @@ static drflac* drflac_open_with_metadata_private(drflac_read_proc onRead, drflac /* There's additional data required for Ogg streams. */ if (init.container == drflac_container_ogg) { allocationSize += sizeof(drflac_oggbs); + } - pOggbs = (drflac_oggbs*)drflac__malloc_from_callbacks(sizeof(*pOggbs), &allocationCallbacks); - if (pOggbs == NULL) { - return NULL; /*DRFLAC_OUT_OF_MEMORY;*/ - } - - DRFLAC_ZERO_MEMORY(pOggbs, sizeof(*pOggbs)); - pOggbs->onRead = onRead; - pOggbs->onSeek = onSeek; - pOggbs->pUserData = pUserData; - pOggbs->currentBytePos = init.oggFirstBytePos; - pOggbs->firstBytePos = init.oggFirstBytePos; - pOggbs->serialNumber = init.oggSerial; - pOggbs->bosPageHeader = init.oggBosHeader; - pOggbs->bytesRemainingInPage = 0; + DRFLAC_ZERO_MEMORY(&oggbs, sizeof(oggbs)); + if (init.container == drflac_container_ogg) { + oggbs.onRead = onRead; + oggbs.onSeek = onSeek; + oggbs.pUserData = pUserData; + oggbs.currentBytePos = init.oggFirstBytePos; + oggbs.firstBytePos = init.oggFirstBytePos; + oggbs.serialNumber = init.oggSerial; + oggbs.bosPageHeader = init.oggBosHeader; + oggbs.bytesRemainingInPage = 0; } #endif @@ -8010,9 +7275,9 @@ static drflac* drflac_open_with_metadata_private(drflac_read_proc onRead, drflac consist of only a single heap allocation. To this, the size of the seek table needs to be known, which we determine when reading and decoding the metadata. */ - firstFramePos = 42; /* <-- We know we are at byte 42 at this point. */ - seektablePos = 0; - seekpointCount = 0; + firstFramePos = 42; /* <-- We know we are at byte 42 at this point. */ + seektablePos = 0; + seektableSize = 0; if (init.hasMetadataBlocks) { drflac_read_proc onReadOverride = onRead; drflac_seek_proc onSeekOverride = onSeek; @@ -8022,26 +7287,20 @@ static drflac* drflac_open_with_metadata_private(drflac_read_proc onRead, drflac if (init.container == drflac_container_ogg) { onReadOverride = drflac__on_read_ogg; onSeekOverride = drflac__on_seek_ogg; - pUserDataOverride = (void*)pOggbs; + pUserDataOverride = (void*)&oggbs; } #endif - if (!drflac__read_and_decode_metadata(onReadOverride, onSeekOverride, onMeta, pUserDataOverride, pUserDataMD, &firstFramePos, &seektablePos, &seekpointCount, &allocationCallbacks)) { - #ifndef DR_FLAC_NO_OGG - drflac__free_from_callbacks(pOggbs, &allocationCallbacks); - #endif + if (!drflac__read_and_decode_metadata(onReadOverride, onSeekOverride, onMeta, pUserDataOverride, pUserDataMD, &firstFramePos, &seektablePos, &seektableSize, &allocationCallbacks)) { return NULL; } - allocationSize += seekpointCount * sizeof(drflac_seekpoint); + allocationSize += seektableSize; } pFlac = (drflac*)drflac__malloc_from_callbacks(allocationSize, &allocationCallbacks); if (pFlac == NULL) { - #ifndef DR_FLAC_NO_OGG - drflac__free_from_callbacks(pOggbs, &allocationCallbacks); - #endif return NULL; } @@ -8051,12 +7310,8 @@ static drflac* drflac_open_with_metadata_private(drflac_read_proc onRead, drflac #ifndef DR_FLAC_NO_OGG if (init.container == drflac_container_ogg) { - drflac_oggbs* pInternalOggbs = (drflac_oggbs*)((drflac_uint8*)pFlac->pDecodedSamples + decodedSamplesAllocationSize + (seekpointCount * sizeof(drflac_seekpoint))); - DRFLAC_COPY_MEMORY(pInternalOggbs, pOggbs, sizeof(*pOggbs)); - - /* At this point the pOggbs object has been handed over to pInternalOggbs and can be freed. */ - drflac__free_from_callbacks(pOggbs, &allocationCallbacks); - pOggbs = NULL; + drflac_oggbs* pInternalOggbs = (drflac_oggbs*)((drflac_uint8*)pFlac->pDecodedSamples + decodedSamplesAllocationSize + seektableSize); + *pInternalOggbs = oggbs; /* The Ogg bistream needs to be layered on top of the original bitstream. */ pFlac->bs.onRead = drflac__on_read_ogg; @@ -8080,7 +7335,7 @@ static drflac* drflac_open_with_metadata_private(drflac_read_proc onRead, drflac { /* If we have a seektable we need to load it now, making sure we move back to where we were previously. */ if (seektablePos != 0) { - pFlac->seekpointCount = seekpointCount; + pFlac->seekpointCount = seektableSize / sizeof(*pFlac->pSeekpoints); pFlac->pSeekpoints = (drflac_seekpoint*)((drflac_uint8*)pFlac->pDecodedSamples + decodedSamplesAllocationSize); DRFLAC_ASSERT(pFlac->bs.onSeek != NULL); @@ -8088,20 +7343,18 @@ static drflac* drflac_open_with_metadata_private(drflac_read_proc onRead, drflac /* Seek to the seektable, then just read directly into our seektable buffer. */ if (pFlac->bs.onSeek(pFlac->bs.pUserData, (int)seektablePos, drflac_seek_origin_start)) { - drflac_uint32 iSeekpoint; - - for (iSeekpoint = 0; iSeekpoint < seekpointCount; iSeekpoint += 1) { - if (pFlac->bs.onRead(pFlac->bs.pUserData, pFlac->pSeekpoints + iSeekpoint, DRFLAC_SEEKPOINT_SIZE_IN_BYTES) == DRFLAC_SEEKPOINT_SIZE_IN_BYTES) { - /* Endian swap. */ + if (pFlac->bs.onRead(pFlac->bs.pUserData, pFlac->pSeekpoints, seektableSize) == seektableSize) { + /* Endian swap. */ + drflac_uint32 iSeekpoint; + for (iSeekpoint = 0; iSeekpoint < pFlac->seekpointCount; ++iSeekpoint) { pFlac->pSeekpoints[iSeekpoint].firstPCMFrame = drflac__be2host_64(pFlac->pSeekpoints[iSeekpoint].firstPCMFrame); pFlac->pSeekpoints[iSeekpoint].flacFrameOffset = drflac__be2host_64(pFlac->pSeekpoints[iSeekpoint].flacFrameOffset); pFlac->pSeekpoints[iSeekpoint].pcmFrameCount = drflac__be2host_16(pFlac->pSeekpoints[iSeekpoint].pcmFrameCount); - } else { - /* Failed to read the seektable. Pretend we don't have one. */ - pFlac->pSeekpoints = NULL; - pFlac->seekpointCount = 0; - break; } + } else { + /* Failed to read the seektable. Pretend we don't have one. */ + pFlac->pSeekpoints = NULL; + pFlac->seekpointCount = 0; } /* We need to seek back to where we were. If this fails it's a critical error. */ @@ -8118,697 +7371,33 @@ static drflac* drflac_open_with_metadata_private(drflac_read_proc onRead, drflac } - /* - If we get here, but don't have a STREAMINFO block, it means we've opened the stream in relaxed mode and need to decode - the first frame. - */ - if (!init.hasStreamInfoBlock) { - pFlac->currentFLACFrame.header = init.firstFrameHeader; - for (;;) { - drflac_result result = drflac__decode_flac_frame(pFlac); - if (result == DRFLAC_SUCCESS) { - break; - } else { - if (result == DRFLAC_CRC_MISMATCH) { - if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) { - drflac__free_from_callbacks(pFlac, &allocationCallbacks); - return NULL; - } - continue; - } else { - drflac__free_from_callbacks(pFlac, &allocationCallbacks); - return NULL; - } - } - } - } - - return pFlac; -} - - - -#ifndef DR_FLAC_NO_STDIO -#include -#ifndef DR_FLAC_NO_WCHAR -#include /* For wcslen(), wcsrtombs() */ -#endif - -/* Errno */ -/* drflac_result_from_errno() is only used for fopen() and wfopen() so putting it inside DR_WAV_NO_STDIO for now. If something else needs this later we can move it out. */ -#include -static drflac_result drflac_result_from_errno(int e) -{ - switch (e) - { - case 0: return DRFLAC_SUCCESS; - #ifdef EPERM - case EPERM: return DRFLAC_INVALID_OPERATION; - #endif - #ifdef ENOENT - case ENOENT: return DRFLAC_DOES_NOT_EXIST; - #endif - #ifdef ESRCH - case ESRCH: return DRFLAC_DOES_NOT_EXIST; - #endif - #ifdef EINTR - case EINTR: return DRFLAC_INTERRUPT; - #endif - #ifdef EIO - case EIO: return DRFLAC_IO_ERROR; - #endif - #ifdef ENXIO - case ENXIO: return DRFLAC_DOES_NOT_EXIST; - #endif - #ifdef E2BIG - case E2BIG: return DRFLAC_INVALID_ARGS; - #endif - #ifdef ENOEXEC - case ENOEXEC: return DRFLAC_INVALID_FILE; - #endif - #ifdef EBADF - case EBADF: return DRFLAC_INVALID_FILE; - #endif - #ifdef ECHILD - case ECHILD: return DRFLAC_ERROR; - #endif - #ifdef EAGAIN - case EAGAIN: return DRFLAC_UNAVAILABLE; - #endif - #ifdef ENOMEM - case ENOMEM: return DRFLAC_OUT_OF_MEMORY; - #endif - #ifdef EACCES - case EACCES: return DRFLAC_ACCESS_DENIED; - #endif - #ifdef EFAULT - case EFAULT: return DRFLAC_BAD_ADDRESS; - #endif - #ifdef ENOTBLK - case ENOTBLK: return DRFLAC_ERROR; - #endif - #ifdef EBUSY - case EBUSY: return DRFLAC_BUSY; - #endif - #ifdef EEXIST - case EEXIST: return DRFLAC_ALREADY_EXISTS; - #endif - #ifdef EXDEV - case EXDEV: return DRFLAC_ERROR; - #endif - #ifdef ENODEV - case ENODEV: return DRFLAC_DOES_NOT_EXIST; - #endif - #ifdef ENOTDIR - case ENOTDIR: return DRFLAC_NOT_DIRECTORY; - #endif - #ifdef EISDIR - case EISDIR: return DRFLAC_IS_DIRECTORY; - #endif - #ifdef EINVAL - case EINVAL: return DRFLAC_INVALID_ARGS; - #endif - #ifdef ENFILE - case ENFILE: return DRFLAC_TOO_MANY_OPEN_FILES; - #endif - #ifdef EMFILE - case EMFILE: return DRFLAC_TOO_MANY_OPEN_FILES; - #endif - #ifdef ENOTTY - case ENOTTY: return DRFLAC_INVALID_OPERATION; - #endif - #ifdef ETXTBSY - case ETXTBSY: return DRFLAC_BUSY; - #endif - #ifdef EFBIG - case EFBIG: return DRFLAC_TOO_BIG; - #endif - #ifdef ENOSPC - case ENOSPC: return DRFLAC_NO_SPACE; - #endif - #ifdef ESPIPE - case ESPIPE: return DRFLAC_BAD_SEEK; - #endif - #ifdef EROFS - case EROFS: return DRFLAC_ACCESS_DENIED; - #endif - #ifdef EMLINK - case EMLINK: return DRFLAC_TOO_MANY_LINKS; - #endif - #ifdef EPIPE - case EPIPE: return DRFLAC_BAD_PIPE; - #endif - #ifdef EDOM - case EDOM: return DRFLAC_OUT_OF_RANGE; - #endif - #ifdef ERANGE - case ERANGE: return DRFLAC_OUT_OF_RANGE; - #endif - #ifdef EDEADLK - case EDEADLK: return DRFLAC_DEADLOCK; - #endif - #ifdef ENAMETOOLONG - case ENAMETOOLONG: return DRFLAC_PATH_TOO_LONG; - #endif - #ifdef ENOLCK - case ENOLCK: return DRFLAC_ERROR; - #endif - #ifdef ENOSYS - case ENOSYS: return DRFLAC_NOT_IMPLEMENTED; - #endif - #ifdef ENOTEMPTY - case ENOTEMPTY: return DRFLAC_DIRECTORY_NOT_EMPTY; - #endif - #ifdef ELOOP - case ELOOP: return DRFLAC_TOO_MANY_LINKS; - #endif - #ifdef ENOMSG - case ENOMSG: return DRFLAC_NO_MESSAGE; - #endif - #ifdef EIDRM - case EIDRM: return DRFLAC_ERROR; - #endif - #ifdef ECHRNG - case ECHRNG: return DRFLAC_ERROR; - #endif - #ifdef EL2NSYNC - case EL2NSYNC: return DRFLAC_ERROR; - #endif - #ifdef EL3HLT - case EL3HLT: return DRFLAC_ERROR; - #endif - #ifdef EL3RST - case EL3RST: return DRFLAC_ERROR; - #endif - #ifdef ELNRNG - case ELNRNG: return DRFLAC_OUT_OF_RANGE; - #endif - #ifdef EUNATCH - case EUNATCH: return DRFLAC_ERROR; - #endif - #ifdef ENOCSI - case ENOCSI: return DRFLAC_ERROR; - #endif - #ifdef EL2HLT - case EL2HLT: return DRFLAC_ERROR; - #endif - #ifdef EBADE - case EBADE: return DRFLAC_ERROR; - #endif - #ifdef EBADR - case EBADR: return DRFLAC_ERROR; - #endif - #ifdef EXFULL - case EXFULL: return DRFLAC_ERROR; - #endif - #ifdef ENOANO - case ENOANO: return DRFLAC_ERROR; - #endif - #ifdef EBADRQC - case EBADRQC: return DRFLAC_ERROR; - #endif - #ifdef EBADSLT - case EBADSLT: return DRFLAC_ERROR; - #endif - #ifdef EBFONT - case EBFONT: return DRFLAC_INVALID_FILE; - #endif - #ifdef ENOSTR - case ENOSTR: return DRFLAC_ERROR; - #endif - #ifdef ENODATA - case ENODATA: return DRFLAC_NO_DATA_AVAILABLE; - #endif - #ifdef ETIME - case ETIME: return DRFLAC_TIMEOUT; - #endif - #ifdef ENOSR - case ENOSR: return DRFLAC_NO_DATA_AVAILABLE; - #endif - #ifdef ENONET - case ENONET: return DRFLAC_NO_NETWORK; - #endif - #ifdef ENOPKG - case ENOPKG: return DRFLAC_ERROR; - #endif - #ifdef EREMOTE - case EREMOTE: return DRFLAC_ERROR; - #endif - #ifdef ENOLINK - case ENOLINK: return DRFLAC_ERROR; - #endif - #ifdef EADV - case EADV: return DRFLAC_ERROR; - #endif - #ifdef ESRMNT - case ESRMNT: return DRFLAC_ERROR; - #endif - #ifdef ECOMM - case ECOMM: return DRFLAC_ERROR; - #endif - #ifdef EPROTO - case EPROTO: return DRFLAC_ERROR; - #endif - #ifdef EMULTIHOP - case EMULTIHOP: return DRFLAC_ERROR; - #endif - #ifdef EDOTDOT - case EDOTDOT: return DRFLAC_ERROR; - #endif - #ifdef EBADMSG - case EBADMSG: return DRFLAC_BAD_MESSAGE; - #endif - #ifdef EOVERFLOW - case EOVERFLOW: return DRFLAC_TOO_BIG; - #endif - #ifdef ENOTUNIQ - case ENOTUNIQ: return DRFLAC_NOT_UNIQUE; - #endif - #ifdef EBADFD - case EBADFD: return DRFLAC_ERROR; - #endif - #ifdef EREMCHG - case EREMCHG: return DRFLAC_ERROR; - #endif - #ifdef ELIBACC - case ELIBACC: return DRFLAC_ACCESS_DENIED; - #endif - #ifdef ELIBBAD - case ELIBBAD: return DRFLAC_INVALID_FILE; - #endif - #ifdef ELIBSCN - case ELIBSCN: return DRFLAC_INVALID_FILE; - #endif - #ifdef ELIBMAX - case ELIBMAX: return DRFLAC_ERROR; - #endif - #ifdef ELIBEXEC - case ELIBEXEC: return DRFLAC_ERROR; - #endif - #ifdef EILSEQ - case EILSEQ: return DRFLAC_INVALID_DATA; - #endif - #ifdef ERESTART - case ERESTART: return DRFLAC_ERROR; - #endif - #ifdef ESTRPIPE - case ESTRPIPE: return DRFLAC_ERROR; - #endif - #ifdef EUSERS - case EUSERS: return DRFLAC_ERROR; - #endif - #ifdef ENOTSOCK - case ENOTSOCK: return DRFLAC_NOT_SOCKET; - #endif - #ifdef EDESTADDRREQ - case EDESTADDRREQ: return DRFLAC_NO_ADDRESS; - #endif - #ifdef EMSGSIZE - case EMSGSIZE: return DRFLAC_TOO_BIG; - #endif - #ifdef EPROTOTYPE - case EPROTOTYPE: return DRFLAC_BAD_PROTOCOL; - #endif - #ifdef ENOPROTOOPT - case ENOPROTOOPT: return DRFLAC_PROTOCOL_UNAVAILABLE; - #endif - #ifdef EPROTONOSUPPORT - case EPROTONOSUPPORT: return DRFLAC_PROTOCOL_NOT_SUPPORTED; - #endif - #ifdef ESOCKTNOSUPPORT - case ESOCKTNOSUPPORT: return DRFLAC_SOCKET_NOT_SUPPORTED; - #endif - #ifdef EOPNOTSUPP - case EOPNOTSUPP: return DRFLAC_INVALID_OPERATION; - #endif - #ifdef EPFNOSUPPORT - case EPFNOSUPPORT: return DRFLAC_PROTOCOL_FAMILY_NOT_SUPPORTED; - #endif - #ifdef EAFNOSUPPORT - case EAFNOSUPPORT: return DRFLAC_ADDRESS_FAMILY_NOT_SUPPORTED; - #endif - #ifdef EADDRINUSE - case EADDRINUSE: return DRFLAC_ALREADY_IN_USE; - #endif - #ifdef EADDRNOTAVAIL - case EADDRNOTAVAIL: return DRFLAC_ERROR; - #endif - #ifdef ENETDOWN - case ENETDOWN: return DRFLAC_NO_NETWORK; - #endif - #ifdef ENETUNREACH - case ENETUNREACH: return DRFLAC_NO_NETWORK; - #endif - #ifdef ENETRESET - case ENETRESET: return DRFLAC_NO_NETWORK; - #endif - #ifdef ECONNABORTED - case ECONNABORTED: return DRFLAC_NO_NETWORK; - #endif - #ifdef ECONNRESET - case ECONNRESET: return DRFLAC_CONNECTION_RESET; - #endif - #ifdef ENOBUFS - case ENOBUFS: return DRFLAC_NO_SPACE; - #endif - #ifdef EISCONN - case EISCONN: return DRFLAC_ALREADY_CONNECTED; - #endif - #ifdef ENOTCONN - case ENOTCONN: return DRFLAC_NOT_CONNECTED; - #endif - #ifdef ESHUTDOWN - case ESHUTDOWN: return DRFLAC_ERROR; - #endif - #ifdef ETOOMANYREFS - case ETOOMANYREFS: return DRFLAC_ERROR; - #endif - #ifdef ETIMEDOUT - case ETIMEDOUT: return DRFLAC_TIMEOUT; - #endif - #ifdef ECONNREFUSED - case ECONNREFUSED: return DRFLAC_CONNECTION_REFUSED; - #endif - #ifdef EHOSTDOWN - case EHOSTDOWN: return DRFLAC_NO_HOST; - #endif - #ifdef EHOSTUNREACH - case EHOSTUNREACH: return DRFLAC_NO_HOST; - #endif - #ifdef EALREADY - case EALREADY: return DRFLAC_IN_PROGRESS; - #endif - #ifdef EINPROGRESS - case EINPROGRESS: return DRFLAC_IN_PROGRESS; - #endif - #ifdef ESTALE - case ESTALE: return DRFLAC_INVALID_FILE; - #endif - #ifdef EUCLEAN - case EUCLEAN: return DRFLAC_ERROR; - #endif - #ifdef ENOTNAM - case ENOTNAM: return DRFLAC_ERROR; - #endif - #ifdef ENAVAIL - case ENAVAIL: return DRFLAC_ERROR; - #endif - #ifdef EISNAM - case EISNAM: return DRFLAC_ERROR; - #endif - #ifdef EREMOTEIO - case EREMOTEIO: return DRFLAC_IO_ERROR; - #endif - #ifdef EDQUOT - case EDQUOT: return DRFLAC_NO_SPACE; - #endif - #ifdef ENOMEDIUM - case ENOMEDIUM: return DRFLAC_DOES_NOT_EXIST; - #endif - #ifdef EMEDIUMTYPE - case EMEDIUMTYPE: return DRFLAC_ERROR; - #endif - #ifdef ECANCELED - case ECANCELED: return DRFLAC_CANCELLED; - #endif - #ifdef ENOKEY - case ENOKEY: return DRFLAC_ERROR; - #endif - #ifdef EKEYEXPIRED - case EKEYEXPIRED: return DRFLAC_ERROR; - #endif - #ifdef EKEYREVOKED - case EKEYREVOKED: return DRFLAC_ERROR; - #endif - #ifdef EKEYREJECTED - case EKEYREJECTED: return DRFLAC_ERROR; - #endif - #ifdef EOWNERDEAD - case EOWNERDEAD: return DRFLAC_ERROR; - #endif - #ifdef ENOTRECOVERABLE - case ENOTRECOVERABLE: return DRFLAC_ERROR; - #endif - #ifdef ERFKILL - case ERFKILL: return DRFLAC_ERROR; - #endif - #ifdef EHWPOISON - case EHWPOISON: return DRFLAC_ERROR; - #endif - default: return DRFLAC_ERROR; - } -} -/* End Errno */ - -/* fopen */ -static drflac_result drflac_fopen(FILE** ppFile, const char* pFilePath, const char* pOpenMode) -{ -#if defined(_MSC_VER) && _MSC_VER >= 1400 - errno_t err; -#endif - - if (ppFile != NULL) { - *ppFile = NULL; /* Safety. */ - } - - if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) { - return DRFLAC_INVALID_ARGS; - } - -#if defined(_MSC_VER) && _MSC_VER >= 1400 - err = fopen_s(ppFile, pFilePath, pOpenMode); - if (err != 0) { - return drflac_result_from_errno(err); - } -#else -#if defined(_WIN32) || defined(__APPLE__) - *ppFile = fopen(pFilePath, pOpenMode); -#else - #if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && defined(_LARGEFILE64_SOURCE) - *ppFile = fopen64(pFilePath, pOpenMode); - #else - *ppFile = fopen(pFilePath, pOpenMode); - #endif -#endif - if (*ppFile == NULL) { - drflac_result result = drflac_result_from_errno(errno); - if (result == DRFLAC_SUCCESS) { - result = DRFLAC_ERROR; /* Just a safety check to make sure we never ever return success when pFile == NULL. */ - } - - return result; - } -#endif - - return DRFLAC_SUCCESS; -} - -/* -_wfopen() isn't always available in all compilation environments. - - * Windows only. - * MSVC seems to support it universally as far back as VC6 from what I can tell (haven't checked further back). - * MinGW-64 (both 32- and 64-bit) seems to support it. - * MinGW wraps it in !defined(__STRICT_ANSI__). - * OpenWatcom wraps it in !defined(_NO_EXT_KEYS). - -This can be reviewed as compatibility issues arise. The preference is to use _wfopen_s() and _wfopen() as opposed to the wcsrtombs() -fallback, so if you notice your compiler not detecting this properly I'm happy to look at adding support. -*/ -#if defined(_WIN32) - #if defined(_MSC_VER) || defined(__MINGW64__) || (!defined(__STRICT_ANSI__) && !defined(_NO_EXT_KEYS)) - #define DRFLAC_HAS_WFOPEN - #endif -#endif - -#ifndef DR_FLAC_NO_WCHAR -static drflac_result drflac_wfopen(FILE** ppFile, const wchar_t* pFilePath, const wchar_t* pOpenMode, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - if (ppFile != NULL) { - *ppFile = NULL; /* Safety. */ - } - - if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) { - return DRFLAC_INVALID_ARGS; - } - -#if defined(DRFLAC_HAS_WFOPEN) - { - /* Use _wfopen() on Windows. */ - #if defined(_MSC_VER) && _MSC_VER >= 1400 - errno_t err = _wfopen_s(ppFile, pFilePath, pOpenMode); - if (err != 0) { - return drflac_result_from_errno(err); - } - #else - *ppFile = _wfopen(pFilePath, pOpenMode); - if (*ppFile == NULL) { - return drflac_result_from_errno(errno); - } - #endif - (void)pAllocationCallbacks; - } -#else - /* - Use fopen() on anything other than Windows. Requires a conversion. This is annoying because - fopen() is locale specific. The only real way I can think of to do this is with wcsrtombs(). Note - that wcstombs() is apparently not thread-safe because it uses a static global mbstate_t object for - maintaining state. I've checked this with -std=c89 and it works, but if somebody get's a compiler - error I'll look into improving compatibility. - */ - - /* - Some compilers don't support wchar_t or wcsrtombs() which we're using below. In this case we just - need to abort with an error. If you encounter a compiler lacking such support, add it to this list - and submit a bug report and it'll be added to the library upstream. - */ - #if defined(__DJGPP__) - { - /* Nothing to do here. This will fall through to the error check below. */ - } - #else - { - mbstate_t mbs; - size_t lenMB; - const wchar_t* pFilePathTemp = pFilePath; - char* pFilePathMB = NULL; - char pOpenModeMB[32] = {0}; - - /* Get the length first. */ - DRFLAC_ZERO_OBJECT(&mbs); - lenMB = wcsrtombs(NULL, &pFilePathTemp, 0, &mbs); - if (lenMB == (size_t)-1) { - return drflac_result_from_errno(errno); - } - - pFilePathMB = (char*)drflac__malloc_from_callbacks(lenMB + 1, pAllocationCallbacks); - if (pFilePathMB == NULL) { - return DRFLAC_OUT_OF_MEMORY; - } - - pFilePathTemp = pFilePath; - DRFLAC_ZERO_OBJECT(&mbs); - wcsrtombs(pFilePathMB, &pFilePathTemp, lenMB + 1, &mbs); - - /* The open mode should always consist of ASCII characters so we should be able to do a trivial conversion. */ - { - size_t i = 0; - for (;;) { - if (pOpenMode[i] == 0) { - pOpenModeMB[i] = '\0'; - break; - } - - pOpenModeMB[i] = (char)pOpenMode[i]; - i += 1; - } - } - - *ppFile = fopen(pFilePathMB, pOpenModeMB); - - drflac__free_from_callbacks(pFilePathMB, pAllocationCallbacks); - } - #endif - - if (*ppFile == NULL) { - return DRFLAC_ERROR; - } -#endif - - return DRFLAC_SUCCESS; -} -#endif -/* End fopen */ - -static size_t drflac__on_read_stdio(void* pUserData, void* bufferOut, size_t bytesToRead) -{ - return fread(bufferOut, 1, bytesToRead, (FILE*)pUserData); -} - -static drflac_bool32 drflac__on_seek_stdio(void* pUserData, int offset, drflac_seek_origin origin) -{ - DRFLAC_ASSERT(offset >= 0); /* <-- Never seek backwards. */ - - return fseek((FILE*)pUserData, offset, (origin == drflac_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0; -} - - -DRFLAC_API drflac* drflac_open_file(const char* pFileName, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - FILE* pFile; - - if (drflac_fopen(&pFile, pFileName, "rb") != DRFLAC_SUCCESS) { - return NULL; - } - - pFlac = drflac_open(drflac__on_read_stdio, drflac__on_seek_stdio, (void*)pFile, pAllocationCallbacks); - if (pFlac == NULL) { - fclose(pFile); - return NULL; - } - - return pFlac; -} - -#ifndef DR_FLAC_NO_WCHAR -DRFLAC_API drflac* drflac_open_file_w(const wchar_t* pFileName, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - FILE* pFile; - - if (drflac_wfopen(&pFile, pFileName, L"rb", pAllocationCallbacks) != DRFLAC_SUCCESS) { - return NULL; - } - - pFlac = drflac_open(drflac__on_read_stdio, drflac__on_seek_stdio, (void*)pFile, pAllocationCallbacks); - if (pFlac == NULL) { - fclose(pFile); - return NULL; - } - - return pFlac; -} -#endif - -DRFLAC_API drflac* drflac_open_file_with_metadata(const char* pFileName, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - FILE* pFile; - - if (drflac_fopen(&pFile, pFileName, "rb") != DRFLAC_SUCCESS) { - return NULL; - } - - pFlac = drflac_open_with_metadata_private(drflac__on_read_stdio, drflac__on_seek_stdio, onMeta, drflac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks); - if (pFlac == NULL) { - fclose(pFile); - return pFlac; - } - - return pFlac; -} - -#ifndef DR_FLAC_NO_WCHAR -DRFLAC_API drflac* drflac_open_file_with_metadata_w(const wchar_t* pFileName, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - FILE* pFile; - - if (drflac_wfopen(&pFile, pFileName, L"rb", pAllocationCallbacks) != DRFLAC_SUCCESS) { - return NULL; - } - - pFlac = drflac_open_with_metadata_private(drflac__on_read_stdio, drflac__on_seek_stdio, onMeta, drflac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks); - if (pFlac == NULL) { - fclose(pFile); - return pFlac; + /* + If we get here, but don't have a STREAMINFO block, it means we've opened the stream in relaxed mode and need to decode + the first frame. + */ + if (!init.hasStreamInfoBlock) { + pFlac->currentFLACFrame.header = init.firstFrameHeader; + for (;;) { + drflac_result result = drflac__decode_flac_frame(pFlac); + if (result == DRFLAC_SUCCESS) { + break; + } else { + if (result == DRFLAC_CRC_MISMATCH) { + if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) { + drflac__free_from_callbacks(pFlac, &allocationCallbacks); + return NULL; + } + continue; + } else { + drflac__free_from_callbacks(pFlac, &allocationCallbacks); + return NULL; + } + } + } } return pFlac; } -#endif -#endif /* DR_FLAC_NO_STDIO */ static size_t drflac__on_read_memory(void* pUserData, void* bufferOut, size_t bytesToRead) { @@ -8947,47 +7536,9 @@ DRFLAC_API void drflac_close(drflac* pFlac) return; } -#ifndef DR_FLAC_NO_STDIO - /* - If we opened the file with drflac_open_file() we will want to close the file handle. We can know whether or not drflac_open_file() - was used by looking at the callbacks. - */ - if (pFlac->bs.onRead == drflac__on_read_stdio) { - fclose((FILE*)pFlac->bs.pUserData); - } - -#ifndef DR_FLAC_NO_OGG - /* Need to clean up Ogg streams a bit differently due to the way the bit streaming is chained. */ - if (pFlac->container == drflac_container_ogg) { - drflac_oggbs* oggbs = (drflac_oggbs*)pFlac->_oggbs; - DRFLAC_ASSERT(pFlac->bs.onRead == drflac__on_read_ogg); - - if (oggbs->onRead == drflac__on_read_stdio) { - fclose((FILE*)oggbs->pUserData); - } - } -#endif -#endif - drflac__free_from_callbacks(pFlac, &pFlac->allocationCallbacks); } - -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_left_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - drflac_uint64 i; - for (i = 0; i < frameCount; ++i) { - drflac_uint32 left = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - drflac_uint32 side = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - drflac_uint32 right = left - side; - - pOutputSamples[i*2+0] = (drflac_int32)left; - pOutputSamples[i*2+1] = (drflac_int32)right; - } -} -#endif - static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_left_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) { drflac_uint64 i; @@ -9118,30 +7669,11 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_left_side(drflac* p #endif { /* Scalar fallback. */ -#if 0 - drflac_read_pcm_frames_s32__decode_left_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else drflac_read_pcm_frames_s32__decode_left_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif } } -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_right_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - drflac_uint64 i; - for (i = 0; i < frameCount; ++i) { - drflac_uint32 side = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - drflac_uint32 right = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - drflac_uint32 left = right + side; - - pOutputSamples[i*2+0] = (drflac_int32)left; - pOutputSamples[i*2+1] = (drflac_int32)right; - } -} -#endif - static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_right_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) { drflac_uint64 i; @@ -9272,30 +7804,11 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_right_side(drflac* #endif { /* Scalar fallback. */ -#if 0 - drflac_read_pcm_frames_s32__decode_right_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else drflac_read_pcm_frames_s32__decode_right_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif } } -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_mid_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - for (drflac_uint64 i = 0; i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - - mid = (mid << 1) | (side & 0x01); - - pOutputSamples[i*2+0] = (drflac_int32)((drflac_uint32)((drflac_int32)(mid + side) >> 1) << unusedBitsPerSample); - pOutputSamples[i*2+1] = (drflac_int32)((drflac_uint32)((drflac_int32)(mid - side) >> 1) << unusedBitsPerSample); - } -} -#endif - static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_mid_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) { drflac_uint64 i; @@ -9574,24 +8087,9 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_mid_side(drflac* pF #endif { /* Scalar fallback. */ -#if 0 - drflac_read_pcm_frames_s32__decode_mid_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else drflac_read_pcm_frames_s32__decode_mid_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} - - -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_independent_stereo__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - for (drflac_uint64 i = 0; i < frameCount; ++i) { - pOutputSamples[i*2+0] = (drflac_int32)((drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample)); - pOutputSamples[i*2+1] = (drflac_int32)((drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample)); } } -#endif static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_independent_stereo__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) { @@ -9697,11 +8195,7 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_independent_stereo( #endif { /* Scalar fallback. */ -#if 0 - drflac_read_pcm_frames_s32__decode_independent_stereo__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else drflac_read_pcm_frames_s32__decode_independent_stereo__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif } } @@ -9787,25 +8281,6 @@ DRFLAC_API drflac_uint64 drflac_read_pcm_frames_s32(drflac* pFlac, drflac_uint64 return framesRead; } - -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_left_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - drflac_uint64 i; - for (i = 0; i < frameCount; ++i) { - drflac_uint32 left = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - drflac_uint32 side = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - drflac_uint32 right = left - side; - - left >>= 16; - right >>= 16; - - pOutputSamples[i*2+0] = (drflac_int16)left; - pOutputSamples[i*2+1] = (drflac_int16)right; - } -} -#endif - static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_left_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) { drflac_uint64 i; @@ -9960,32 +8435,9 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_left_side(drflac* p #endif { /* Scalar fallback. */ -#if 0 - drflac_read_pcm_frames_s16__decode_left_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else drflac_read_pcm_frames_s16__decode_left_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} - - -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_right_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - drflac_uint64 i; - for (i = 0; i < frameCount; ++i) { - drflac_uint32 side = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - drflac_uint32 right = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - drflac_uint32 left = right + side; - - left >>= 16; - right >>= 16; - - pOutputSamples[i*2+0] = (drflac_int16)left; - pOutputSamples[i*2+1] = (drflac_int16)right; } } -#endif static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_right_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) { @@ -10141,29 +8593,9 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_right_side(drflac* #endif { /* Scalar fallback. */ -#if 0 - drflac_read_pcm_frames_s16__decode_right_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else drflac_read_pcm_frames_s16__decode_right_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} - - -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_mid_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - for (drflac_uint64 i = 0; i < frameCount; ++i) { - drflac_uint32 mid = (drflac_uint32)pInputSamples0[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = (drflac_uint32)pInputSamples1[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - - mid = (mid << 1) | (side & 0x01); - - pOutputSamples[i*2+0] = (drflac_int16)(((drflac_uint32)((drflac_int32)(mid + side) >> 1) << unusedBitsPerSample) >> 16); - pOutputSamples[i*2+1] = (drflac_int16)(((drflac_uint32)((drflac_int32)(mid - side) >> 1) << unusedBitsPerSample) >> 16); } } -#endif static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_mid_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) { @@ -10471,24 +8903,9 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_mid_side(drflac* pF #endif { /* Scalar fallback. */ -#if 0 - drflac_read_pcm_frames_s16__decode_mid_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else drflac_read_pcm_frames_s16__decode_mid_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} - - -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_independent_stereo__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - for (drflac_uint64 i = 0; i < frameCount; ++i) { - pOutputSamples[i*2+0] = (drflac_int16)((drflac_int32)((drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample)) >> 16); - pOutputSamples[i*2+1] = (drflac_int16)((drflac_int32)((drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample)) >> 16); } } -#endif static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_independent_stereo__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) { @@ -10610,11 +9027,7 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_independent_stereo( #endif { /* Scalar fallback. */ -#if 0 - drflac_read_pcm_frames_s16__decode_independent_stereo__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else drflac_read_pcm_frames_s16__decode_independent_stereo__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif } } @@ -10700,22 +9113,6 @@ DRFLAC_API drflac_uint64 drflac_read_pcm_frames_s16(drflac* pFlac, drflac_uint64 return framesRead; } - -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - drflac_uint64 i; - for (i = 0; i < frameCount; ++i) { - drflac_uint32 left = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - drflac_uint32 side = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - drflac_uint32 right = left - side; - - pOutputSamples[i*2+0] = (float)((drflac_int32)left / 2147483648.0); - pOutputSamples[i*2+1] = (float)((drflac_int32)right / 2147483648.0); - } -} -#endif - static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) { drflac_uint64 i; @@ -10859,29 +9256,9 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side(drflac* p #endif { /* Scalar fallback. */ -#if 0 - drflac_read_pcm_frames_f32__decode_left_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else drflac_read_pcm_frames_f32__decode_left_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} - - -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - drflac_uint64 i; - for (i = 0; i < frameCount; ++i) { - drflac_uint32 side = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - drflac_uint32 right = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - drflac_uint32 left = right + side; - - pOutputSamples[i*2+0] = (float)((drflac_int32)left / 2147483648.0); - pOutputSamples[i*2+1] = (float)((drflac_int32)right / 2147483648.0); } } -#endif static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) { @@ -11025,29 +9402,9 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side(drflac* #endif { /* Scalar fallback. */ -#if 0 - drflac_read_pcm_frames_f32__decode_right_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else drflac_read_pcm_frames_f32__decode_right_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} - - -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - for (drflac_uint64 i = 0; i < frameCount; ++i) { - drflac_uint32 mid = (drflac_uint32)pInputSamples0[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = (drflac_uint32)pInputSamples1[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - - mid = (mid << 1) | (side & 0x01); - - pOutputSamples[i*2+0] = (float)((((drflac_int32)(mid + side) >> 1) << (unusedBitsPerSample)) / 2147483648.0); - pOutputSamples[i*2+1] = (float)((((drflac_int32)(mid - side) >> 1) << (unusedBitsPerSample)) / 2147483648.0); } } -#endif static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) { @@ -11351,23 +9708,9 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side(drflac* pF #endif { /* Scalar fallback. */ -#if 0 - drflac_read_pcm_frames_f32__decode_mid_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else drflac_read_pcm_frames_f32__decode_mid_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} - -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - for (drflac_uint64 i = 0; i < frameCount; ++i) { - pOutputSamples[i*2+0] = (float)((drflac_int32)((drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample)) / 2147483648.0); - pOutputSamples[i*2+1] = (float)((drflac_int32)((drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample)) / 2147483648.0); } } -#endif static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) { @@ -11492,11 +9835,7 @@ static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo( #endif { /* Scalar fallback. */ -#if 0 - drflac_read_pcm_frames_f32__decode_independent_stereo__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else drflac_read_pcm_frames_f32__decode_independent_stereo__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif } } @@ -11607,7 +9946,6 @@ DRFLAC_API drflac_bool32 drflac_seek_to_pcm_frame(drflac* pFlac, drflac_uint64 p return drflac__seek_to_first_frame(pFlac); } else { drflac_bool32 wasSuccessful = DRFLAC_FALSE; - drflac_uint64 originalPCMFrame = pFlac->currentPCMFrame; /* Clamp the sample to the end. */ if (pcmFrameIndex > pFlac->totalPCMFrameCount) { @@ -11665,16 +10003,7 @@ DRFLAC_API drflac_bool32 drflac_seek_to_pcm_frame(drflac* pFlac, drflac_uint64 p } } - if (wasSuccessful) { - pFlac->currentPCMFrame = pcmFrameIndex; - } else { - /* Seek failed. Try putting the decoder back to it's original state. */ - if (drflac_seek_to_pcm_frame(pFlac, originalPCMFrame) == DRFLAC_FALSE) { - /* Failed to seek back to the original PCM frame. Fall back to 0. */ - drflac_seek_to_pcm_frame(pFlac, 0); - } - } - + pFlac->currentPCMFrame = pcmFrameIndex; return wasSuccessful; } } @@ -11683,7 +10012,6 @@ DRFLAC_API drflac_bool32 drflac_seek_to_pcm_frame(drflac* pFlac, drflac_uint64 p /* High Level APIs */ -/* SIZE_MAX */ #if defined(SIZE_MAX) #define DRFLAC_SIZE_MAX SIZE_MAX #else @@ -11693,7 +10021,6 @@ DRFLAC_API drflac_bool32 drflac_seek_to_pcm_frame(drflac* pFlac, drflac_uint64 p #define DRFLAC_SIZE_MAX 0xFFFFFFFF #endif #endif -/* End SIZE_MAX */ /* Using a macro as the definition of the drflac__full_decode_and_close_*() API family. Sue me. */ @@ -11742,7 +10069,7 @@ static type* drflac__full_read_and_close_ ## extension (drflac* pFlac, unsigned DRFLAC_ZERO_MEMORY(pSampleData + (totalPCMFrameCount*pFlac->channels), (size_t)(sampleDataBufferSize - totalPCMFrameCount*pFlac->channels*sizeof(type))); \ } else { \ drflac_uint64 dataSize = totalPCMFrameCount*pFlac->channels*sizeof(type); \ - if (dataSize > (drflac_uint64)DRFLAC_SIZE_MAX) { \ + if (dataSize > DRFLAC_SIZE_MAX) { \ goto on_error; /* The decoded data is too big. */ \ } \ \ @@ -11836,74 +10163,6 @@ DRFLAC_API float* drflac_open_and_read_pcm_frames_f32(drflac_read_proc onRead, d return drflac__full_read_and_close_f32(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut); } -#ifndef DR_FLAC_NO_STDIO -DRFLAC_API drflac_int32* drflac_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - - if (sampleRate) { - *sampleRate = 0; - } - if (channels) { - *channels = 0; - } - if (totalPCMFrameCount) { - *totalPCMFrameCount = 0; - } - - pFlac = drflac_open_file(filename, pAllocationCallbacks); - if (pFlac == NULL) { - return NULL; - } - - return drflac__full_read_and_close_s32(pFlac, channels, sampleRate, totalPCMFrameCount); -} - -DRFLAC_API drflac_int16* drflac_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - - if (sampleRate) { - *sampleRate = 0; - } - if (channels) { - *channels = 0; - } - if (totalPCMFrameCount) { - *totalPCMFrameCount = 0; - } - - pFlac = drflac_open_file(filename, pAllocationCallbacks); - if (pFlac == NULL) { - return NULL; - } - - return drflac__full_read_and_close_s16(pFlac, channels, sampleRate, totalPCMFrameCount); -} - -DRFLAC_API float* drflac_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - - if (sampleRate) { - *sampleRate = 0; - } - if (channels) { - *channels = 0; - } - if (totalPCMFrameCount) { - *totalPCMFrameCount = 0; - } - - pFlac = drflac_open_file(filename, pAllocationCallbacks); - if (pFlac == NULL) { - return NULL; - } - - return drflac__full_read_and_close_f32(pFlac, channels, sampleRate, totalPCMFrameCount); -} -#endif - DRFLAC_API drflac_int32* drflac_open_memory_and_read_pcm_frames_s32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks) { drflac* pFlac; @@ -12007,7 +10266,7 @@ DRFLAC_API const char* drflac_next_vorbis_comment(drflac_vorbis_comment_iterator return NULL; } - length = drflac__le2host_32_ptr_unaligned(pIter->pRunningData); + length = drflac__le2host_32(*(const drflac_uint32*)pIter->pRunningData); pIter->pRunningData += 4; pComment = pIter->pRunningData; @@ -12077,57 +10336,6 @@ DRFLAC_API drflac_bool32 drflac_next_cuesheet_track(drflac_cuesheet_track_iterat /* REVISION HISTORY ================ -v0.12.42 - 2023-11-02 - - Fix build for ARMv6-M. - - Fix a compilation warning with GCC. - -v0.12.41 - 2023-06-17 - - Fix an incorrect date in revision history. No functional change. - -v0.12.40 - 2023-05-22 - - Minor code restructure. No functional change. - -v0.12.39 - 2022-09-17 - - Fix compilation with DJGPP. - - Fix compilation error with Visual Studio 2019 and the ARM build. - - Fix an error with SSE 4.1 detection. - - Add support for disabling wchar_t with DR_WAV_NO_WCHAR. - - Improve compatibility with compilers which lack support for explicit struct packing. - - Improve compatibility with low-end and embedded hardware by reducing the amount of stack - allocation when loading an Ogg encapsulated file. - -v0.12.38 - 2022-04-10 - - Fix compilation error on older versions of GCC. - -v0.12.37 - 2022-02-12 - - Improve ARM detection. - -v0.12.36 - 2022-02-07 - - Fix a compilation error with the ARM build. - -v0.12.35 - 2022-02-06 - - Fix a bug due to underestimating the amount of precision required for the prediction stage. - - Fix some bugs found from fuzz testing. - -v0.12.34 - 2022-01-07 - - Fix some misalignment bugs when reading metadata. - -v0.12.33 - 2021-12-22 - - Fix a bug with seeking when the seek table does not start at PCM frame 0. - -v0.12.32 - 2021-12-11 - - Fix a warning with Clang. - -v0.12.31 - 2021-08-16 - - Silence some warnings. - -v0.12.30 - 2021-07-31 - - Fix platform detection for ARM64. - -v0.12.29 - 2021-04-02 - - Fix a bug where the running PCM frame index is set to an invalid value when over-seeking. - - Fix a decoding error due to an incorrect validation check. - v0.12.28 - 2021-02-21 - Fix a warning due to referencing _MSC_VER when it is undefined. @@ -12517,7 +10725,7 @@ For more information, please refer to =============================================================================== ALTERNATIVE 2 - MIT No Attribution =============================================================================== -Copyright 2023 David Reid +Copyright 2020 David Reid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/libretro/deps/libchdr/include/libchdr/cdrom.h b/libretro/deps/libchdr/include/libchdr/cdrom.h index 4ceb0b033..5bd4a2e02 100644 --- a/libretro/deps/libchdr/include/libchdr/cdrom.h +++ b/libretro/deps/libchdr/include/libchdr/cdrom.h @@ -72,12 +72,12 @@ void ecc_clear(uint8_t *sector); INLINE FUNCTIONS ***************************************************************************/ -static INLINE uint32_t msf_to_lba(uint32_t msf) +INLINE uint32_t msf_to_lba(uint32_t msf) { return ( ((msf&0x00ff0000)>>16) * 60 * 75) + (((msf&0x0000ff00)>>8) * 75) + ((msf&0x000000ff)>>0); } -static INLINE uint32_t lba_to_msf(uint32_t lba) +INLINE uint32_t lba_to_msf(uint32_t lba) { uint8_t m, s, f; @@ -96,7 +96,7 @@ static INLINE uint32_t lba_to_msf(uint32_t lba) * Angelo also says PCE tracks often start playing at the * wrong address.. related? **/ -static INLINE uint32_t lba_to_msf_alt(int lba) +INLINE uint32_t lba_to_msf_alt(int lba) { uint32_t ret = 0; diff --git a/libretro/deps/libchdr/include/libchdr/chd.h b/libretro/deps/libchdr/include/libchdr/chd.h index ed052ef7c..61b149dcf 100644 --- a/libretro/deps/libchdr/include/libchdr/chd.h +++ b/libretro/deps/libchdr/include/libchdr/chd.h @@ -58,67 +58,67 @@ extern "C" { V1 header: [ 0] char tag[8]; // 'MComprHD' - [ 8] uint32_t length; // length of header (including tag and length fields) - [ 12] uint32_t version; // drive format version - [ 16] uint32_t flags; // flags (see below) - [ 20] uint32_t compression; // compression type - [ 24] uint32_t hunksize; // 512-byte sectors per hunk - [ 28] uint32_t totalhunks; // total # of hunks represented - [ 32] uint32_t cylinders; // number of cylinders on hard disk - [ 36] uint32_t heads; // number of heads on hard disk - [ 40] uint32_t sectors; // number of sectors on hard disk - [ 44] uint8_t md5[16]; // MD5 checksum of raw data - [ 60] uint8_t parentmd5[16]; // MD5 checksum of parent file + [ 8] UINT32 length; // length of header (including tag and length fields) + [ 12] UINT32 version; // drive format version + [ 16] UINT32 flags; // flags (see below) + [ 20] UINT32 compression; // compression type + [ 24] UINT32 hunksize; // 512-byte sectors per hunk + [ 28] UINT32 totalhunks; // total # of hunks represented + [ 32] UINT32 cylinders; // number of cylinders on hard disk + [ 36] UINT32 heads; // number of heads on hard disk + [ 40] UINT32 sectors; // number of sectors on hard disk + [ 44] UINT8 md5[16]; // MD5 checksum of raw data + [ 60] UINT8 parentmd5[16]; // MD5 checksum of parent file [ 76] (V1 header length) V2 header: [ 0] char tag[8]; // 'MComprHD' - [ 8] uint32_t length; // length of header (including tag and length fields) - [ 12] uint32_t version; // drive format version - [ 16] uint32_t flags; // flags (see below) - [ 20] uint32_t compression; // compression type - [ 24] uint32_t hunksize; // seclen-byte sectors per hunk - [ 28] uint32_t totalhunks; // total # of hunks represented - [ 32] uint32_t cylinders; // number of cylinders on hard disk - [ 36] uint32_t heads; // number of heads on hard disk - [ 40] uint32_t sectors; // number of sectors on hard disk - [ 44] uint8_t md5[16]; // MD5 checksum of raw data - [ 60] uint8_t parentmd5[16]; // MD5 checksum of parent file - [ 76] uint32_t seclen; // number of bytes per sector + [ 8] UINT32 length; // length of header (including tag and length fields) + [ 12] UINT32 version; // drive format version + [ 16] UINT32 flags; // flags (see below) + [ 20] UINT32 compression; // compression type + [ 24] UINT32 hunksize; // seclen-byte sectors per hunk + [ 28] UINT32 totalhunks; // total # of hunks represented + [ 32] UINT32 cylinders; // number of cylinders on hard disk + [ 36] UINT32 heads; // number of heads on hard disk + [ 40] UINT32 sectors; // number of sectors on hard disk + [ 44] UINT8 md5[16]; // MD5 checksum of raw data + [ 60] UINT8 parentmd5[16]; // MD5 checksum of parent file + [ 76] UINT32 seclen; // number of bytes per sector [ 80] (V2 header length) V3 header: [ 0] char tag[8]; // 'MComprHD' - [ 8] uint32_t length; // length of header (including tag and length fields) - [ 12] uint32_t version; // drive format version - [ 16] uint32_t flags; // flags (see below) - [ 20] uint32_t compression; // compression type - [ 24] uint32_t totalhunks; // total # of hunks represented - [ 28] uint64_t logicalbytes; // logical size of the data (in bytes) - [ 36] uint64_t metaoffset; // offset to the first blob of metadata - [ 44] uint8_t md5[16]; // MD5 checksum of raw data - [ 60] uint8_t parentmd5[16]; // MD5 checksum of parent file - [ 76] uint32_t hunkbytes; // number of bytes per hunk - [ 80] uint8_t sha1[20]; // SHA1 checksum of raw data - [100] uint8_t parentsha1[20];// SHA1 checksum of parent file + [ 8] UINT32 length; // length of header (including tag and length fields) + [ 12] UINT32 version; // drive format version + [ 16] UINT32 flags; // flags (see below) + [ 20] UINT32 compression; // compression type + [ 24] UINT32 totalhunks; // total # of hunks represented + [ 28] UINT64 logicalbytes; // logical size of the data (in bytes) + [ 36] UINT64 metaoffset; // offset to the first blob of metadata + [ 44] UINT8 md5[16]; // MD5 checksum of raw data + [ 60] UINT8 parentmd5[16]; // MD5 checksum of parent file + [ 76] UINT32 hunkbytes; // number of bytes per hunk + [ 80] UINT8 sha1[20]; // SHA1 checksum of raw data + [100] UINT8 parentsha1[20];// SHA1 checksum of parent file [120] (V3 header length) V4 header: [ 0] char tag[8]; // 'MComprHD' - [ 8] uint32_t length; // length of header (including tag and length fields) - [ 12] uint32_t version; // drive format version - [ 16] uint32_t flags; // flags (see below) - [ 20] uint32_t compression; // compression type - [ 24] uint32_t totalhunks; // total # of hunks represented - [ 28] uint64_t logicalbytes; // logical size of the data (in bytes) - [ 36] uint64_t metaoffset; // offset to the first blob of metadata - [ 44] uint32_t hunkbytes; // number of bytes per hunk - [ 48] uint8_t sha1[20]; // combined raw+meta SHA1 - [ 68] uint8_t parentsha1[20];// combined raw+meta SHA1 of parent - [ 88] uint8_t rawsha1[20]; // raw data SHA1 + [ 8] UINT32 length; // length of header (including tag and length fields) + [ 12] UINT32 version; // drive format version + [ 16] UINT32 flags; // flags (see below) + [ 20] UINT32 compression; // compression type + [ 24] UINT32 totalhunks; // total # of hunks represented + [ 28] UINT64 logicalbytes; // logical size of the data (in bytes) + [ 36] UINT64 metaoffset; // offset to the first blob of metadata + [ 44] UINT32 hunkbytes; // number of bytes per hunk + [ 48] UINT8 sha1[20]; // combined raw+meta SHA1 + [ 68] UINT8 parentsha1[20];// combined raw+meta SHA1 of parent + [ 88] UINT8 rawsha1[20]; // raw data SHA1 [108] (V4 header length) Flags: @@ -130,17 +130,17 @@ extern "C" { V5 header: [ 0] char tag[8]; // 'MComprHD' - [ 8] uint32_t_t length; // length of header (including tag and length fields) - [ 12] uint32_t_t version; // drive format version - [ 16] uint32_t_t compressors[4];// which custom compressors are used? - [ 32] uint64_t_t logicalbytes; // logical size of the data (in bytes) - [ 40] uint64_t_t mapoffset; // offset to the map - [ 48] uint64_t_t metaoffset; // offset to the first blob of metadata - [ 56] uint32_t_t hunkbytes; // number of bytes per hunk (512k maximum) - [ 60] uint32_t_t unitbytes; // number of bytes per unit within each hunk - [ 64] uint8_t_t rawsha1[20]; // raw data SHA1 - [ 84] uint8_t_t sha1[20]; // combined raw+meta SHA1 - [104] uint8_t_t parentsha1[20];// combined raw+meta SHA1 of parent + [ 8] uint32_t length; // length of header (including tag and length fields) + [ 12] uint32_t version; // drive format version + [ 16] uint32_t compressors[4];// which custom compressors are used? + [ 32] uint64_t logicalbytes; // logical size of the data (in bytes) + [ 40] uint64_t mapoffset; // offset to the map + [ 48] uint64_t metaoffset; // offset to the first blob of metadata + [ 56] uint32_t hunkbytes; // number of bytes per hunk (512k maximum) + [ 60] uint32_t unitbytes; // number of bytes per unit within each hunk + [ 64] uint8_t rawsha1[20]; // raw data SHA1 + [ 84] uint8_t sha1[20]; // combined raw+meta SHA1 + [104] uint8_t parentsha1[20];// combined raw+meta SHA1 of parent [124] (V5 header length) If parentsha1 != 0, we have a parent (no need for flags) @@ -148,22 +148,22 @@ extern "C" { V5 uncompressed map format: - [ 0] uint32_t_t offset; // starting offset / hunk size + [ 0] uint32_t offset; // starting offset / hunk size V5 compressed map format header: - [ 0] uint32_t_t length; // length of compressed map + [ 0] uint32_t length; // length of compressed map [ 4] UINT48 datastart; // offset of first block [ 10] uint16_t crc; // crc-16 of the map - [ 12] uint8_t_t lengthbits; // bits used to encode complength - [ 13] uint8_t_t hunkbits; // bits used to encode self-refs - [ 14] uint8_t_t parentunitbits; // bits used to encode parent unit refs - [ 15] uint8_t_t reserved; // future use + [ 12] uint8_t lengthbits; // bits used to encode complength + [ 13] uint8_t hunkbits; // bits used to encode self-refs + [ 14] uint8_t parentunitbits; // bits used to encode parent unit refs + [ 15] uint8_t reserved; // future use [ 16] (compressed header length) Each compressed map entry, once expanded, looks like: - [ 0] uint8_t_t compression; // compression type + [ 0] uint8_t compression; // compression type [ 1] UINT24 complength; // compressed length [ 4] UINT48 offset; // offset [ 10] uint16_t crc; // crc-16 of the data @@ -204,15 +204,10 @@ extern "C" { #define CHD_CODEC_NONE 0 #define CHD_CODEC_ZLIB CHD_MAKE_TAG('z','l','i','b') -#define CHD_CODEC_LZMA CHD_MAKE_TAG('l','z','m','a') -#define CHD_CODEC_HUFFMAN CHD_MAKE_TAG('h','u','f','f') -#define CHD_CODEC_FLAC CHD_MAKE_TAG('f','l','a','c') -#define CHD_CODEC_ZSTD CHD_MAKE_TAG('z', 's', 't', 'd') /* general codecs with CD frontend */ #define CHD_CODEC_CD_ZLIB CHD_MAKE_TAG('c','d','z','l') #define CHD_CODEC_CD_LZMA CHD_MAKE_TAG('c','d','l','z') #define CHD_CODEC_CD_FLAC CHD_MAKE_TAG('c','d','f','l') -#define CHD_CODEC_CD_ZSTD CHD_MAKE_TAG('c','d','z','s') /* A/V codec configuration parameters */ #define AV_CODEC_COMPRESS_CONFIG 1 @@ -220,7 +215,7 @@ extern "C" { /* metadata parameters */ #define CHDMETATAG_WILDCARD 0 -#define CHD_METAINDEX_APPEND ((uint32_t)-1) +#define CHD_METAINDEX_APPEND ((UINT32)-1) /* metadata flags */ #define CHD_MDFLAGS_CHECKSUM 0x01 /* indicates data is checksummed */ @@ -307,32 +302,32 @@ typedef struct _chd_file chd_file; typedef struct _chd_header chd_header; struct _chd_header { - uint32_t length; /* length of header data */ - uint32_t version; /* drive format version */ - uint32_t flags; /* flags field */ - uint32_t compression[4]; /* compression type */ - uint32_t hunkbytes; /* number of bytes per hunk */ - uint32_t totalhunks; /* total # of hunks represented */ - uint64_t logicalbytes; /* logical size of the data */ - uint64_t metaoffset; /* offset in file of first metadata */ - uint64_t mapoffset; /* TOOD V5 */ - uint8_t md5[CHD_MD5_BYTES]; /* overall MD5 checksum */ - uint8_t parentmd5[CHD_MD5_BYTES]; /* overall MD5 checksum of parent */ - uint8_t sha1[CHD_SHA1_BYTES]; /* overall SHA1 checksum */ - uint8_t rawsha1[CHD_SHA1_BYTES]; /* SHA1 checksum of raw data */ - uint8_t parentsha1[CHD_SHA1_BYTES]; /* overall SHA1 checksum of parent */ - uint32_t unitbytes; /* TODO V5 */ - uint64_t unitcount; /* TODO V5 */ - uint32_t hunkcount; /* TODO V5 */ + UINT32 length; /* length of header data */ + UINT32 version; /* drive format version */ + UINT32 flags; /* flags field */ + UINT32 compression[4]; /* compression type */ + UINT32 hunkbytes; /* number of bytes per hunk */ + UINT32 totalhunks; /* total # of hunks represented */ + UINT64 logicalbytes; /* logical size of the data */ + UINT64 metaoffset; /* offset in file of first metadata */ + UINT64 mapoffset; /* TOOD V5 */ + UINT8 md5[CHD_MD5_BYTES]; /* overall MD5 checksum */ + UINT8 parentmd5[CHD_MD5_BYTES]; /* overall MD5 checksum of parent */ + UINT8 sha1[CHD_SHA1_BYTES]; /* overall SHA1 checksum */ + UINT8 rawsha1[CHD_SHA1_BYTES]; /* SHA1 checksum of raw data */ + UINT8 parentsha1[CHD_SHA1_BYTES]; /* overall SHA1 checksum of parent */ + UINT32 unitbytes; /* TODO V5 */ + UINT64 unitcount; /* TODO V5 */ + UINT32 hunkcount; /* TODO V5 */ /* map information */ - uint32_t mapentrybytes; /* length of each entry in a map (V5) */ - uint8_t* rawmap; /* raw map data */ + UINT32 mapentrybytes; /* length of each entry in a map (V5) */ + UINT8* rawmap; /* raw map data */ - uint32_t obsolete_cylinders; /* obsolete field -- do not use! */ - uint32_t obsolete_sectors; /* obsolete field -- do not use! */ - uint32_t obsolete_heads; /* obsolete field -- do not use! */ - uint32_t obsolete_hunksize; /* obsolete field -- do not use! */ + UINT32 obsolete_cylinders; /* obsolete field -- do not use! */ + UINT32 obsolete_sectors; /* obsolete field -- do not use! */ + UINT32 obsolete_heads; /* obsolete field -- do not use! */ + UINT32 obsolete_hunksize; /* obsolete field -- do not use! */ }; @@ -340,10 +335,10 @@ struct _chd_header typedef struct _chd_verify_result chd_verify_result; struct _chd_verify_result { - uint8_t md5[CHD_MD5_BYTES]; /* overall MD5 checksum */ - uint8_t sha1[CHD_SHA1_BYTES]; /* overall SHA1 checksum */ - uint8_t rawsha1[CHD_SHA1_BYTES]; /* SHA1 checksum of raw data */ - uint8_t metasha1[CHD_SHA1_BYTES]; /* SHA1 checksum of metadata */ + UINT8 md5[CHD_MD5_BYTES]; /* overall MD5 checksum */ + UINT8 sha1[CHD_SHA1_BYTES]; /* overall SHA1 checksum */ + UINT8 rawsha1[CHD_SHA1_BYTES]; /* SHA1 checksum of raw data */ + UINT8 metasha1[CHD_SHA1_BYTES]; /* SHA1 checksum of metadata */ }; @@ -369,14 +364,13 @@ struct _chd_verify_result /* ----- CHD file management ----- */ /* create a new CHD file fitting the given description */ -/* chd_error chd_create(const char *filename, uint64_t logicalbytes, uint32_t hunkbytes, uint32_t compression, chd_file *parent); */ +/* chd_error chd_create(const char *filename, UINT64 logicalbytes, UINT32 hunkbytes, UINT32 compression, chd_file *parent); */ /* same as chd_create(), but accepts an already-opened core_file object */ -/* chd_error chd_create_file(core_file *file, uint64_t logicalbytes, uint32_t hunkbytes, uint32_t compression, chd_file *parent); */ +/* chd_error chd_create_file(core_file *file, UINT64 logicalbytes, UINT32 hunkbytes, UINT32 compression, chd_file *parent); */ /* open an existing CHD file */ -CHD_EXPORT chd_error chd_open_core_file(core_file *file, int mode, chd_file *parent, chd_file **chd); -CHD_EXPORT chd_error chd_open_file(FILE *file, int mode, chd_file *parent, chd_file **chd); +CHD_EXPORT chd_error chd_open_file(core_file *file, int mode, chd_file *parent, chd_file **chd); CHD_EXPORT chd_error chd_open(const char *filename, int mode, chd_file *parent, chd_file **chd); /* precache underlying file */ @@ -398,22 +392,20 @@ CHD_EXPORT const char *chd_error_string(chd_error err); /* return a pointer to the extracted CHD header data */ CHD_EXPORT const chd_header *chd_get_header(chd_file *chd); -/* read CHD header data from file into the pointed struct */ -CHD_EXPORT chd_error chd_read_header(const char *filename, chd_header *header); /* ----- core data read/write ----- */ /* read one hunk from the CHD file */ -CHD_EXPORT chd_error chd_read(chd_file *chd, uint32_t hunknum, void *buffer); +CHD_EXPORT chd_error chd_read(chd_file *chd, UINT32 hunknum, void *buffer); /* ----- metadata management ----- */ /* get indexed metadata of a particular sort */ -CHD_EXPORT chd_error chd_get_metadata(chd_file *chd, uint32_t searchtag, uint32_t searchindex, void *output, uint32_t outputlen, uint32_t *resultlen, uint32_t *resulttag, uint8_t *resultflags); +CHD_EXPORT chd_error chd_get_metadata(chd_file *chd, UINT32 searchtag, UINT32 searchindex, void *output, UINT32 outputlen, UINT32 *resultlen, UINT32 *resulttag, UINT8 *resultflags); @@ -424,7 +416,7 @@ CHD_EXPORT chd_error chd_get_metadata(chd_file *chd, uint32_t searchtag, uint32_ CHD_EXPORT chd_error chd_codec_config(chd_file *chd, int param, void *config); /* return a string description of a codec */ -CHD_EXPORT const char *chd_get_codec_name(uint32_t codec); +CHD_EXPORT const char *chd_get_codec_name(UINT32 codec); #ifdef __cplusplus } diff --git a/libretro/deps/libchdr/include/libchdr/coretypes.h b/libretro/deps/libchdr/include/libchdr/coretypes.h index 86689e07a..12f095ee0 100644 --- a/libretro/deps/libchdr/include/libchdr/coretypes.h +++ b/libretro/deps/libchdr/include/libchdr/coretypes.h @@ -8,54 +8,51 @@ #include #endif -#ifndef ARRAY_LENGTH #define ARRAY_LENGTH(x) (sizeof(x)/sizeof(x[0])) -#endif -typedef struct chd_core_file { - /* - * arbitrary pointer to data the implementation uses to implement the below functions - */ - void *argp; - - /* - * return the size of a given file as a 64-bit unsigned integer. - * the position of the file pointer after calling this function is - * undefined because many implementations will seek to the end of the - * file and call ftell. - * - * on error, (uint64_t)-1 is returned. - */ - uint64_t(*fsize)(struct chd_core_file*); - - /* - * should match the behavior of fread, except the FILE* argument at the end - * will be replaced with a struct chd_core_file*. - */ - size_t(*fread)(void*,size_t,size_t,struct chd_core_file*); - - /* closes the given file. */ - int (*fclose)(struct chd_core_file*); - - /* fseek clone */ - int (*fseek)(struct chd_core_file*, int64_t, int); -} core_file; - -static INLINE int core_fclose(core_file *fp) { - return fp->fclose(fp); -} +typedef uint64_t UINT64; +typedef uint32_t UINT32; +typedef uint16_t UINT16; +typedef uint8_t UINT8; -static INLINE size_t core_fread(core_file *fp, void *ptr, size_t len) { - return fp->fread(ptr, 1, len, fp); -} +typedef int64_t INT64; +typedef int32_t INT32; +typedef int16_t INT16; +typedef int8_t INT8; -static INLINE int core_fseek(core_file* fp, int64_t offset, int whence) { - return fp->fseek(fp, offset, whence); -} +#ifdef USE_LIBRETRO_VFS +/* Genesis-Plus-GX requires custom defines */ +#define core_file RFILE +#define core_fopen(file) rfopen(file, "rb") +#define core_fseek rfseek +#define core_ftell rftell +#define core_fread(fc, buff, len) rfread(buff, 1, len, fc) +#define core_fclose rfclose +#else +#define core_file FILE +#define core_fopen(file) fopen(file, "rb") +#if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(__WIN64__) + #define core_fseek _fseeki64 + #define core_ftell _ftelli64 +#elif defined(_LARGEFILE_SOURCE) && defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 + #define core_fseek fseeko64 + #define core_ftell ftello64 +#else + #define core_fseek fseeko + #define core_ftell ftello +#endif +#define core_fread(fc, buff, len) fread(buff, 1, len, fc) +#define core_fclose fclose +#endif -static INLINE uint64_t core_fsize(core_file *fp) +static UINT64 core_fsize(core_file *f) { - return fp->fsize(fp); + UINT64 rv; + UINT64 p = core_ftell(f); + core_fseek(f, 0, SEEK_END); + rv = core_ftell(f); + core_fseek(f, p, SEEK_SET); + return rv; } #endif diff --git a/libretro/deps/libchdr/src/libchdr_cdrom.c b/libretro/deps/libchdr/src/libchdr_cdrom.c index 547b6007b..44fa66466 100644 --- a/libretro/deps/libchdr/src/libchdr_cdrom.c +++ b/libretro/deps/libchdr/src/libchdr_cdrom.c @@ -15,12 +15,9 @@ schemes will differ after track 1! ***************************************************************************/ - +#include #include -#undef INLINE -#include - #include #ifdef WANT_RAW_DATA_SECTOR @@ -307,7 +304,7 @@ static const uint16_t qoffsets[ECC_Q_NUM_BYTES][ECC_Q_COMP] = *------------------------------------------------- */ -static INLINE uint8_t ecc_source_byte(const uint8_t *sector, uint32_t offset) +INLINE uint8_t ecc_source_byte(const uint8_t *sector, uint32_t offset) { /* in mode 2 always treat these as 0 bytes */ return (sector[MODE_OFFSET] == 2 && offset < 4) ? 0x00 : sector[SYNC_OFFSET + SYNC_NUM_BYTES + offset]; diff --git a/libretro/deps/libchdr/src/libchdr_chd.c b/libretro/deps/libchdr/src/libchdr_chd.c index 70ebde6be..632426ee7 100644 --- a/libretro/deps/libchdr/src/libchdr_chd.c +++ b/libretro/deps/libchdr/src/libchdr_chd.c @@ -43,21 +43,14 @@ #include #include -#undef INLINE -#include - #include #include #include #include -#include -#include +#include "zlib.h" #include "LzmaEnc.h" #include "LzmaDec.h" -#if defined(__PS3__) || defined(__PSL1GHT__) -#define __MACTYPES__ -#endif #undef TRUE #undef FALSE @@ -164,10 +157,10 @@ enum typedef struct _codec_interface codec_interface; struct _codec_interface { - uint32_t compression; /* type of compression */ + UINT32 compression; /* type of compression */ const char *compname; /* name of the algorithm */ - uint8_t lossy; /* is this a lossy algorithm? */ - chd_error (*init)(void *codec, uint32_t hunkbytes); /* codec initialize */ + UINT8 lossy; /* is this a lossy algorithm? */ + chd_error (*init)(void *codec, UINT32 hunkbytes); /* codec initialize */ void (*free)(void *codec); /* codec free */ chd_error (*decompress)(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen); /* decompress data */ chd_error (*config)(void *codec, int param, void *config); /* configure */ @@ -177,22 +170,22 @@ struct _codec_interface typedef struct _map_entry map_entry; struct _map_entry { - uint64_t offset; /* offset within the file of the data */ - uint32_t crc; /* 32-bit CRC of the data */ - uint32_t length; /* length of the data */ - uint8_t flags; /* misc flags */ + UINT64 offset; /* offset within the file of the data */ + UINT32 crc; /* 32-bit CRC of the data */ + UINT32 length; /* length of the data */ + UINT8 flags; /* misc flags */ }; /* a single metadata entry */ typedef struct _metadata_entry metadata_entry; struct _metadata_entry { - uint64_t offset; /* offset within the file of the header */ - uint64_t next; /* offset within the file of the next header */ - uint64_t prev; /* offset within the file of the previous header */ - uint32_t length; /* length of the metadata */ - uint32_t metatag; /* metadata tag */ - uint8_t flags; /* flag bits */ + UINT64 offset; /* offset within the file of the header */ + UINT64 next; /* offset within the file of the next header */ + UINT64 prev; /* offset within the file of the previous header */ + UINT32 length; /* length of the metadata */ + UINT32 metatag; /* metadata tag */ + UINT8 flags; /* flag bits */ }; /* codec-private data for the ZLIB codec */ @@ -200,8 +193,8 @@ struct _metadata_entry typedef struct _zlib_allocator zlib_allocator; struct _zlib_allocator { - uint32_t * allocptr[MAX_ZLIB_ALLOCS]; - uint32_t * allocptr2[MAX_ZLIB_ALLOCS]; + UINT32 * allocptr[MAX_ZLIB_ALLOCS]; + UINT32 * allocptr2[MAX_ZLIB_ALLOCS]; }; typedef struct _zlib_codec_data zlib_codec_data; @@ -231,18 +224,6 @@ struct _lzma_codec_data lzma_allocator allocator; }; -typedef struct _huff_codec_data huff_codec_data; -struct _huff_codec_data -{ - struct huffman_decoder* decoder; -}; - -typedef struct _zstd_codec_data zstd_codec_data; -struct _zstd_codec_data -{ - ZSTD_DStream *dstream; -}; - /* codec-private data for the CDZL codec */ typedef struct _cdzl_codec_data cdzl_codec_data; struct _cdzl_codec_data { @@ -265,14 +246,6 @@ struct _cdlz_codec_data { uint8_t* buffer; }; -/* codec-private data for the FLAC codec */ -typedef struct _flac_codec_data flac_codec_data; -struct _flac_codec_data { - /* internal state */ - int native_endian; - flac_decoder decoder; -}; - /* codec-private data for the CDFL codec */ typedef struct _cdfl_codec_data cdfl_codec_data; struct _cdfl_codec_data { @@ -285,22 +258,13 @@ struct _cdfl_codec_data { uint8_t* buffer; }; -typedef struct _cdzs_codec_data cdzs_codec_data; -struct _cdzs_codec_data -{ - zstd_codec_data base_decompressor; -#ifdef WANT_SUBCODE - zstd_codec_data subcode_decompressor; -#endif - uint8_t* buffer; -}; - /* internal representation of an open CHD file */ struct _chd_file { - uint32_t cookie; /* cookie, should equal COOKIE_VALUE */ + UINT32 cookie; /* cookie, should equal COOKIE_VALUE */ core_file * file; /* handle to the open core file */ + UINT8 owns_file; /* flag indicating if this file should be closed on chd_close() */ chd_header header; /* header, extracted from file */ chd_file * parent; /* pointer to parent file, or NULL */ @@ -308,31 +272,26 @@ struct _chd_file map_entry * map; /* array of map entries */ #ifdef NEED_CACHE_HUNK - uint8_t * cache; /* hunk cache pointer */ - uint32_t cachehunk; /* index of currently cached hunk */ + UINT8 * cache; /* hunk cache pointer */ + UINT32 cachehunk; /* index of currently cached hunk */ - uint8_t * compare; /* hunk compare pointer */ - uint32_t comparehunk; /* index of current compare data */ + UINT8 * compare; /* hunk compare pointer */ + UINT32 comparehunk; /* index of current compare data */ #endif - uint8_t * compressed; /* pointer to buffer for compressed data */ + UINT8 * compressed; /* pointer to buffer for compressed data */ const codec_interface * codecintf[4]; /* interface to the codec */ zlib_codec_data zlib_codec_data; /* zlib codec data */ - lzma_codec_data lzma_codec_data; /* lzma codec data */ - huff_codec_data huff_codec_data; /* huff codec data */ - flac_codec_data flac_codec_data; /* flac codec data */ - zstd_codec_data zstd_codec_data; /* zstd codec data */ cdzl_codec_data cdzl_codec_data; /* cdzl codec data */ cdlz_codec_data cdlz_codec_data; /* cdlz codec data */ cdfl_codec_data cdfl_codec_data; /* cdfl codec data */ - cdzs_codec_data cdzs_codec_data; /* cdzs codec data */ #ifdef NEED_CACHE_HUNK - uint32_t maxhunk; /* maximum hunk accessed */ + UINT32 maxhunk; /* maximum hunk accessed */ #endif - uint8_t * file_cache; /* cache of underlying file */ + UINT8 * file_cache; /* cache of underlying file */ }; @@ -340,36 +299,28 @@ struct _chd_file GLOBAL VARIABLES ***************************************************************************/ -static const uint8_t nullmd5[CHD_MD5_BYTES] = { 0 }; -static const uint8_t nullsha1[CHD_SHA1_BYTES] = { 0 }; +static const UINT8 nullmd5[CHD_MD5_BYTES] = { 0 }; +static const UINT8 nullsha1[CHD_SHA1_BYTES] = { 0 }; /*************************************************************************** PROTOTYPES ***************************************************************************/ -/* core_file wrappers over stdio */ -static core_file *core_stdio_fopen(char const *path); -static uint64_t core_stdio_fsize(core_file *file); -static size_t core_stdio_fread(void *ptr, size_t size, size_t nmemb, core_file *file); -static int core_stdio_fclose(core_file *file); -static int core_stdio_fclose_nonowner(core_file *file); /* alternate fclose used by chd_open_file */ -static int core_stdio_fseek(core_file* file, int64_t offset, int whence); - /* internal header operations */ static chd_error header_validate(const chd_header *header); static chd_error header_read(chd_file *chd, chd_header *header); /* internal hunk read/write */ #ifdef NEED_CACHE_HUNK -static chd_error hunk_read_into_cache(chd_file *chd, uint32_t hunknum); +static chd_error hunk_read_into_cache(chd_file *chd, UINT32 hunknum); #endif -static chd_error hunk_read_into_memory(chd_file *chd, uint32_t hunknum, uint8_t *dest); +static chd_error hunk_read_into_memory(chd_file *chd, UINT32 hunknum, UINT8 *dest); /* internal map access */ static chd_error map_read(chd_file *chd); /* metadata management */ -static chd_error metadata_find_entry(chd_file *chd, uint32_t metatag, uint32_t metaindex, metadata_entry *metaentry); +static chd_error metadata_find_entry(chd_file *chd, UINT32 metatag, UINT32 metaindex, metadata_entry *metaentry); /* zlib compression codec */ static chd_error zlib_codec_init(void *codec, uint32_t hunkbytes); @@ -384,22 +335,6 @@ static chd_error lzma_codec_init(void *codec, uint32_t hunkbytes); static void lzma_codec_free(void *codec); static chd_error lzma_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen); -/* huff compression codec */ -static chd_error huff_codec_init(void *codec, uint32_t hunkbytes); -static void huff_codec_free(void *codec); -static chd_error huff_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen); - -/* flac compression codec */ -static chd_error flac_codec_init(void *codec, uint32_t hunkbytes); -static void flac_codec_free(void *codec); -static chd_error flac_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen); - -/* zstd compression codec */ -static chd_error zstd_codec_init(void *codec, uint32_t hunkbytes); -static void zstd_codec_free(void *codec); -static chd_error zstd_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen); - - /* cdzl compression codec */ static chd_error cdzl_codec_init(void* codec, uint32_t hunkbytes); static void cdzl_codec_free(void* codec); @@ -415,11 +350,6 @@ static chd_error cdfl_codec_init(void* codec, uint32_t hunkbytes); static void cdfl_codec_free(void* codec); static chd_error cdfl_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen); -/* cdzs compression codec */ -static chd_error cdzs_codec_init(void *codec, uint32_t hunkbytes); -static void cdzs_codec_free(void *codec); -static chd_error cdzs_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen); - /*************************************************************************** * LZMA ALLOCATOR HELPER *************************************************************************** @@ -816,123 +746,24 @@ static chd_error cdzl_codec_decompress(void *codec, const uint8_t *src, uint32_t return CHDERR_NONE; } -/*************************************************************************** - * HUFFMAN DECOMPRESSOR - *************************************************************************** - */ - -static chd_error huff_codec_init(void* codec, uint32_t hunkbytes) -{ - huff_codec_data* huff_codec = (huff_codec_data*) codec; - huff_codec->decoder = create_huffman_decoder(256, 16); - return CHDERR_NONE; -} - -static void huff_codec_free(void *codec) -{ - huff_codec_data* huff_codec = (huff_codec_data*) codec; - delete_huffman_decoder(huff_codec->decoder); -} - -static chd_error huff_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen) -{ - uint32_t cur; - chd_error result; - huff_codec_data* huff_codec = (huff_codec_data*) codec; - struct bitstream* bitbuf = create_bitstream(src, complen); - - /* first import the tree */ - enum huffman_error err = huffman_import_tree_huffman(huff_codec->decoder, bitbuf); - if (err != HUFFERR_NONE) - { - free(bitbuf); - return CHDERR_DECOMPRESSION_ERROR; - } - - /* then decode the data */ - for (cur = 0; cur < destlen; cur++) - dest[cur] = huffman_decode_one(huff_codec->decoder, bitbuf); - bitstream_flush(bitbuf); - result = bitstream_overflow(bitbuf) ? CHDERR_DECOMPRESSION_ERROR : CHDERR_NONE; - - free(bitbuf); - return result; -} - /*************************************************************************** * CD FLAC DECOMPRESSOR *************************************************************************** */ /*------------------------------------------------------ - * flac_codec_blocksize - return the optimal block size + * cdfl_codec_blocksize - return the optimal block size *------------------------------------------------------ */ -static uint32_t flac_codec_blocksize(uint32_t bytes) +static uint32_t cdfl_codec_blocksize(uint32_t bytes) { /* determine FLAC block size, which must be 16-65535 * clamp to 2k since that's supposed to be the sweet spot */ - uint32_t blocksize = bytes / 4; - while (blocksize > 2048) - blocksize /= 2; - return blocksize; -} - -static chd_error flac_codec_init(void *codec, uint32_t hunkbytes) -{ - uint16_t native_endian = 0; - flac_codec_data *flac = (flac_codec_data*)codec; - - /* make sure the CHD's hunk size is an even multiple of the sample size */ - if (hunkbytes % 4 != 0) - return CHDERR_CODEC_ERROR; - - /* determine whether we want native or swapped samples */ - *(uint8_t *)(&native_endian) = 1; - flac->native_endian = (native_endian & 1); - - /* flac decoder init */ - if (flac_decoder_init(&flac->decoder)) - return CHDERR_OUT_OF_MEMORY; - - return CHDERR_NONE; -} - -static void flac_codec_free(void *codec) -{ - flac_codec_data *flac = (flac_codec_data*)codec; - flac_decoder_free(&flac->decoder); -} - -static chd_error flac_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen) -{ - flac_codec_data *flac = (flac_codec_data*)codec; - int swap_endian; - - if (src[0] == 'L') - swap_endian = !flac->native_endian; - else if (src[0] == 'B') - swap_endian = flac->native_endian; - else - return CHDERR_DECOMPRESSION_ERROR; - - if (!flac_decoder_reset(&flac->decoder, 44100, 2, flac_codec_blocksize(destlen), src + 1, complen - 1)) - return CHDERR_DECOMPRESSION_ERROR; - if (!flac_decoder_decode_interleaved(&flac->decoder, (int16_t *)(dest), destlen/4, swap_endian)) - return CHDERR_DECOMPRESSION_ERROR; - flac_decoder_finish(&flac->decoder); - - return CHDERR_NONE; -} - -static uint32_t cdfl_codec_blocksize(uint32_t bytes) -{ - /* for CDs it seems that CD_MAX_SECTOR_DATA is the right target */ - uint32_t blocksize = bytes / 4; - while (blocksize > CD_MAX_SECTOR_DATA) - blocksize /= 2; - return blocksize; + uint32_t hunkbytes = bytes / 4; + while (hunkbytes > 2048) + hunkbytes /= 2; + return hunkbytes; } static chd_error cdfl_codec_init(void *codec, uint32_t hunkbytes) @@ -1020,173 +851,6 @@ static chd_error cdfl_codec_decompress(void *codec, const uint8_t *src, uint32_t return CHDERR_NONE; } - - -/*************************************************************************** - * ZSTD DECOMPRESSOR - *************************************************************************** - */ - -/*------------------------------------------------- - * zstd_codec_init - constructor - *------------------------------------------------- - */ - -static chd_error zstd_codec_init(void* codec, uint32_t hunkbytes) -{ - zstd_codec_data* zstd_codec = (zstd_codec_data*) codec; - - zstd_codec->dstream = ZSTD_createDStream(); - if (!zstd_codec->dstream) { - printf("NO DSTREAM CREATED!\n"); - return CHDERR_DECOMPRESSION_ERROR; - } - return CHDERR_NONE; -} - -/*------------------------------------------------- - * zstd_codec_free - *------------------------------------------------- - */ - -static void zstd_codec_free(void* codec) -{ - zstd_codec_data* zstd_codec = (zstd_codec_data*) codec; - - ZSTD_freeDStream(zstd_codec->dstream); -} - -/*------------------------------------------------- - * decompress - decompress data using the ZSTD - * codec - *------------------------------------------------- - */ -static chd_error zstd_codec_decompress(void* codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen) -{ - ZSTD_inBuffer input; - ZSTD_outBuffer output; - - /* initialize */ - zstd_codec_data* zstd_codec = (zstd_codec_data*) codec; - - /* reset decompressor */ - size_t zstd_res = ZSTD_initDStream(zstd_codec->dstream); - - input.src = src; - input.size = complen; - input.pos = 0; - - output.dst = dest; - output.size = destlen; - output.pos = 0; - - if (ZSTD_isError(zstd_res)) - { - printf("INITI DSTREAM FAILED!\n"); - return CHDERR_DECOMPRESSION_ERROR; - } - - while ((input.pos < input.size) && (output.pos < output.size)) - { - zstd_res = ZSTD_decompressStream(zstd_codec->dstream, &output, &input); - if (ZSTD_isError(zstd_res)) - { - printf("DECOMPRESSION ERROR IN LOOP\n"); - return CHDERR_DECOMPRESSION_ERROR; - } - } - if (output.pos != output.size) - { - printf("OUTPUT DOESN'T MATCH!\n"); - return CHDERR_DECOMPRESSION_ERROR; - } - return CHDERR_NONE; - -} - -/* cdzs */ -static chd_error cdzs_codec_init(void* codec, uint32_t hunkbytes) -{ - chd_error ret; - cdzs_codec_data* cdzs = (cdzs_codec_data*) codec; - - /* allocate buffer */ - cdzs->buffer = (uint8_t*)malloc(sizeof(uint8_t) * hunkbytes); - if (cdzs->buffer == NULL) - return CHDERR_OUT_OF_MEMORY; - - /* make sure the CHD's hunk size is an even multiple of the frame size */ - ret = zstd_codec_init(&cdzs->base_decompressor, (hunkbytes / CD_FRAME_SIZE) * CD_MAX_SECTOR_DATA); - if (ret != CHDERR_NONE) - return ret; - -#ifdef WANT_SUBCODE - ret = zstd_codec_init(&cdzs->subcode_decompressor, (hunkbytes / CD_FRAME_SIZE) * CD_MAX_SUBCODE_DATA); - if (ret != CHDERR_NONE) - return ret; -#endif - - if (hunkbytes % CD_FRAME_SIZE != 0) - return CHDERR_CODEC_ERROR; - - return CHDERR_NONE; -} - -static void cdzs_codec_free(void* codec) -{ - cdzs_codec_data* cdzs = (cdzs_codec_data*) codec; - free(cdzs->buffer); - zstd_codec_free(&cdzs->base_decompressor); -#ifdef WANT_SUBCODE - zstd_codec_free(&cdzs->subcode_decompressor); -#endif -} - -static chd_error cdzs_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen) -{ - uint32_t framenum; - cdzs_codec_data* cdzs = (cdzs_codec_data*)codec; - - /* determine header bytes */ - uint32_t frames = destlen / CD_FRAME_SIZE; - uint32_t complen_bytes = (destlen < 65536) ? 2 : 3; - uint32_t ecc_bytes = (frames + 7) / 8; - uint32_t header_bytes = ecc_bytes + complen_bytes; - - /* extract compressed length of base */ - uint32_t complen_base = (src[ecc_bytes + 0] << 8) | src[ecc_bytes + 1]; - if (complen_bytes > 2) - complen_base = (complen_base << 8) | src[ecc_bytes + 2]; - - /* reset and decode */ - zstd_codec_decompress(&cdzs->base_decompressor, &src[header_bytes], complen_base, &cdzs->buffer[0], frames * CD_MAX_SECTOR_DATA); -#ifdef WANT_SUBCODE - zstd_codec_decompress(&cdzs->subcode_decompressor, &src[header_bytes + complen_base], complen - complen_base - header_bytes, &cdzs->buffer[frames * CD_MAX_SECTOR_DATA], frames * CD_MAX_SUBCODE_DATA); -#endif - - /* reassemble the data */ - for (framenum = 0; framenum < frames; framenum++) - { - uint8_t *sector; - - memcpy(&dest[framenum * CD_FRAME_SIZE], &cdzs->buffer[framenum * CD_MAX_SECTOR_DATA], CD_MAX_SECTOR_DATA); -#ifdef WANT_SUBCODE - memcpy(&dest[framenum * CD_FRAME_SIZE + CD_MAX_SECTOR_DATA], &cdzs->buffer[frames * CD_MAX_SECTOR_DATA + framenum * CD_MAX_SUBCODE_DATA], CD_MAX_SUBCODE_DATA); -#endif - -#ifdef WANT_RAW_DATA_SECTOR - /* reconstitute the ECC data and sync header */ - sector = (uint8_t *)&dest[framenum * CD_FRAME_SIZE]; - if ((src[framenum / 8] & (1 << (framenum % 8))) != 0) - { - memcpy(sector, s_cd_sync_header, sizeof(s_cd_sync_header)); - ecc_generate(sector); - } -#endif - } - return CHDERR_NONE; -} - /*************************************************************************** CODEC INTERFACES ***************************************************************************/ @@ -1237,49 +901,6 @@ static const codec_interface codec_interfaces[] = NULL }, - /* V5 lzma compression */ - { - CHD_CODEC_LZMA, - "lzma (LZMA)", - FALSE, - lzma_codec_init, - lzma_codec_free, - lzma_codec_decompress, - NULL - }, - - /* V5 huffman compression */ - { - CHD_CODEC_HUFFMAN, - "Huffman", - FALSE, - huff_codec_init, - huff_codec_free, - huff_codec_decompress, - NULL - }, - - /* V5 flac compression */ - { - CHD_CODEC_FLAC, - "flac (FLAC)", - FALSE, - flac_codec_init, - flac_codec_free, - flac_codec_decompress, - NULL - }, - /* V5 zstd compression */ - { - CHD_CODEC_ZSTD, - "ZStandard", - FALSE, - zstd_codec_init, - zstd_codec_free, - zstd_codec_decompress, - NULL - }, - /* V5 CD zlib compression */ { CHD_CODEC_CD_ZLIB, @@ -1312,17 +933,6 @@ static const codec_interface codec_interfaces[] = cdfl_codec_decompress, NULL }, - /* V5 CD zstd compression */ - { - CHD_CODEC_CD_ZSTD, - "cdzs (CD ZStandard)", - FALSE, - cdzs_codec_init, - cdzs_codec_free, - cdzs_codec_decompress, - NULL - } - }; /*************************************************************************** @@ -1330,22 +940,22 @@ static const codec_interface codec_interfaces[] = ***************************************************************************/ /*------------------------------------------------- - get_bigendian_uint64_t - fetch a uint64_t from + get_bigendian_uint64 - fetch a UINT64 from the data stream in bigendian order -------------------------------------------------*/ -static INLINE uint64_t get_bigendian_uint64_t(const uint8_t *base) +INLINE UINT64 get_bigendian_uint64(const UINT8 *base) { - return ((uint64_t)base[0] << 56) | ((uint64_t)base[1] << 48) | ((uint64_t)base[2] << 40) | ((uint64_t)base[3] << 32) | - ((uint64_t)base[4] << 24) | ((uint64_t)base[5] << 16) | ((uint64_t)base[6] << 8) | (uint64_t)base[7]; + return ((UINT64)base[0] << 56) | ((UINT64)base[1] << 48) | ((UINT64)base[2] << 40) | ((UINT64)base[3] << 32) | + ((UINT64)base[4] << 24) | ((UINT64)base[5] << 16) | ((UINT64)base[6] << 8) | (UINT64)base[7]; } /*------------------------------------------------- - put_bigendian_uint64_t - write a uint64_t to + put_bigendian_uint64 - write a UINT64 to the data stream in bigendian order -------------------------------------------------*/ -static INLINE void put_bigendian_uint64_t(uint8_t *base, uint64_t value) +INLINE void put_bigendian_uint64(UINT8 *base, UINT64 value) { base[0] = value >> 56; base[1] = value >> 48; @@ -1362,10 +972,10 @@ static INLINE void put_bigendian_uint64_t(uint8_t *base, uint64_t value) the data stream in bigendian order -------------------------------------------------*/ -static INLINE uint64_t get_bigendian_uint48(const uint8_t *base) +INLINE UINT64 get_bigendian_uint48(const UINT8 *base) { - return ((uint64_t)base[0] << 40) | ((uint64_t)base[1] << 32) | - ((uint64_t)base[2] << 24) | ((uint64_t)base[3] << 16) | ((uint64_t)base[4] << 8) | (uint64_t)base[5]; + return ((UINT64)base[0] << 40) | ((UINT64)base[1] << 32) | + ((UINT64)base[2] << 24) | ((UINT64)base[3] << 16) | ((UINT64)base[4] << 8) | (UINT64)base[5]; } /*------------------------------------------------- @@ -1373,7 +983,7 @@ static INLINE uint64_t get_bigendian_uint48(const uint8_t *base) the data stream in bigendian order -------------------------------------------------*/ -static INLINE void put_bigendian_uint48(uint8_t *base, uint64_t value) +INLINE void put_bigendian_uint48(UINT8 *base, UINT64 value) { value &= 0xffffffffffff; base[0] = value >> 40; @@ -1384,21 +994,21 @@ static INLINE void put_bigendian_uint48(uint8_t *base, uint64_t value) base[5] = value; } /*------------------------------------------------- - get_bigendian_uint32_t - fetch a uint32_t from + get_bigendian_uint32 - fetch a UINT32 from the data stream in bigendian order -------------------------------------------------*/ -static INLINE uint32_t get_bigendian_uint32_t(const uint8_t *base) +INLINE UINT32 get_bigendian_uint32(const UINT8 *base) { return (base[0] << 24) | (base[1] << 16) | (base[2] << 8) | base[3]; } /*------------------------------------------------- - put_bigendian_uint32_t - write a uint32_t to + put_bigendian_uint32 - write a UINT32 to the data stream in bigendian order -------------------------------------------------*/ -static INLINE void put_bigendian_uint32_t(uint8_t *base, uint32_t value) +INLINE void put_bigendian_uint32(UINT8 *base, UINT32 value) { base[0] = value >> 24; base[1] = value >> 16; @@ -1411,7 +1021,7 @@ static INLINE void put_bigendian_uint32_t(uint8_t *base, uint32_t value) the data stream in bigendian order -------------------------------------------------*/ -static INLINE void put_bigendian_uint24(uint8_t *base, uint32_t value) +INLINE void put_bigendian_uint24(UINT8 *base, UINT32 value) { value &= 0xffffff; base[0] = value >> 16; @@ -1424,27 +1034,27 @@ static INLINE void put_bigendian_uint24(uint8_t *base, uint32_t value) the data stream in bigendian order -------------------------------------------------*/ -static INLINE uint32_t get_bigendian_uint24(const uint8_t *base) +INLINE UINT32 get_bigendian_uint24(const UINT8 *base) { return (base[0] << 16) | (base[1] << 8) | base[2]; } /*------------------------------------------------- - get_bigendian_uint16 - fetch a uint16_t from + get_bigendian_uint16 - fetch a UINT16 from the data stream in bigendian order -------------------------------------------------*/ -static INLINE uint16_t get_bigendian_uint16(const uint8_t *base) +INLINE UINT16 get_bigendian_uint16(const UINT8 *base) { return (base[0] << 8) | base[1]; } /*------------------------------------------------- - put_bigendian_uint16 - write a uint16_t to + put_bigendian_uint16 - write a UINT16 to the data stream in bigendian order -------------------------------------------------*/ -static INLINE void put_bigendian_uint16(uint8_t *base, uint16_t value) +INLINE void put_bigendian_uint16(UINT8 *base, UINT16 value) { base[0] = value >> 8; base[1] = value; @@ -1455,10 +1065,10 @@ static INLINE void put_bigendian_uint16(uint8_t *base, uint16_t value) entry from the datastream -------------------------------------------------*/ -static INLINE void map_extract(const uint8_t *base, map_entry *entry) +INLINE void map_extract(const UINT8 *base, map_entry *entry) { - entry->offset = get_bigendian_uint64_t(&base[0]); - entry->crc = get_bigendian_uint32_t(&base[8]); + entry->offset = get_bigendian_uint64(&base[0]); + entry->crc = get_bigendian_uint32(&base[8]); entry->length = get_bigendian_uint16(&base[12]) | (base[14] << 16); entry->flags = base[15]; } @@ -1468,10 +1078,10 @@ static INLINE void map_extract(const uint8_t *base, map_entry *entry) entry to the datastream -------------------------------------------------*/ -static INLINE void map_assemble(uint8_t *base, map_entry *entry) +INLINE void map_assemble(UINT8 *base, map_entry *entry) { - put_bigendian_uint64_t(&base[0], entry->offset); - put_bigendian_uint32_t(&base[8], entry->crc); + put_bigendian_uint64(&base[0], entry->offset); + put_bigendian_uint32(&base[8], entry->crc); put_bigendian_uint16(&base[12], entry->length); base[14] = entry->length >> 16; base[15] = entry->flags; @@ -1480,7 +1090,7 @@ static INLINE void map_assemble(uint8_t *base, map_entry *entry) /*------------------------------------------------- map_size_v5 - calculate CHDv5 map size -------------------------------------------------*/ -static INLINE int map_size_v5(chd_header* header) +INLINE int map_size_v5(chd_header* header) { return header->hunkcount * header->mapentrybytes; } @@ -1539,7 +1149,7 @@ uint16_t crc16(const void *data, uint32_t length) /*------------------------------------------------- compressed - test if CHD file is compressed +-------------------------------------------------*/ -static INLINE int chd_compressed(chd_header* header) { +INLINE int chd_compressed(chd_header* header) { return header->compression[0] != CHD_CODEC_NONE; } @@ -1549,8 +1159,8 @@ static INLINE int chd_compressed(chd_header* header) { static chd_error decompress_v5_map(chd_file* chd, chd_header* header) { - /*int result = 0;*/ - uint32_t hunknum; + int result = 0; + int hunknum; int repcount = 0; uint8_t lastcomp = 0; uint32_t last_self = 0; @@ -1572,17 +1182,15 @@ static chd_error decompress_v5_map(chd_file* chd, chd_header* header) if (!chd_compressed(header)) { header->rawmap = (uint8_t*)malloc(rawmapsize); - if (header->rawmap == NULL) - return CHDERR_OUT_OF_MEMORY; core_fseek(chd->file, header->mapoffset, SEEK_SET); - core_fread(chd->file, header->rawmap, rawmapsize); + result = core_fread(chd->file, header->rawmap, rawmapsize); return CHDERR_NONE; } /* read the reader */ core_fseek(chd->file, header->mapoffset, SEEK_SET); - core_fread(chd->file, rawbuf, sizeof(rawbuf)); - mapbytes = get_bigendian_uint32_t(&rawbuf[0]); + result = core_fread(chd->file, rawbuf, sizeof(rawbuf)); + mapbytes = get_bigendian_uint32(&rawbuf[0]); firstoffs = get_bigendian_uint48(&rawbuf[4]); mapcrc = get_bigendian_uint16(&rawbuf[10]); lengthbits = rawbuf[12]; @@ -1591,18 +1199,10 @@ static chd_error decompress_v5_map(chd_file* chd, chd_header* header) /* now read the map */ compressed_ptr = (uint8_t*)malloc(sizeof(uint8_t) * mapbytes); - if (compressed_ptr == NULL) - return CHDERR_OUT_OF_MEMORY; core_fseek(chd->file, header->mapoffset + 16, SEEK_SET); - core_fread(chd->file, compressed_ptr, mapbytes); + result = core_fread(chd->file, compressed_ptr, mapbytes); bitbuf = create_bitstream(compressed_ptr, sizeof(uint8_t) * mapbytes); header->rawmap = (uint8_t*)malloc(rawmapsize); - if (header->rawmap == NULL) - { - free(compressed_ptr); - free(bitbuf); - return CHDERR_OUT_OF_MEMORY; - } /* first decode the compression types */ decoder = create_huffman_decoder(16, 8); @@ -1719,9 +1319,9 @@ static chd_error decompress_v5_map(chd_file* chd, chd_header* header) entry in old format from the datastream -------------------------------------------------*/ -static INLINE void map_extract_old(const uint8_t *base, map_entry *entry, uint32_t hunkbytes) +INLINE void map_extract_old(const UINT8 *base, map_entry *entry, UINT32 hunkbytes) { - entry->offset = get_bigendian_uint64_t(&base[0]); + entry->offset = get_bigendian_uint64(&base[0]); entry->crc = 0; entry->length = entry->offset >> 44; entry->flags = MAP_ENTRY_FLAG_NO_CRC | ((entry->length == hunkbytes) ? V34_MAP_ENTRY_TYPE_UNCOMPRESSED : V34_MAP_ENTRY_TYPE_COMPRESSED); @@ -1740,24 +1340,7 @@ static INLINE void map_extract_old(const uint8_t *base, map_entry *entry, uint32 chd_open_file - open a CHD file for access -------------------------------------------------*/ -CHD_EXPORT chd_error chd_open_file(FILE *file, int mode, chd_file *parent, chd_file **chd) { - core_file *stream = malloc(sizeof(core_file)); - if (!stream) - return CHDERR_OUT_OF_MEMORY; - stream->argp = file; - stream->fsize = core_stdio_fsize; - stream->fread = core_stdio_fread; - stream->fclose = core_stdio_fclose_nonowner; - stream->fseek = core_stdio_fseek; - - return chd_open_core_file(stream, mode, parent, chd); -} - -/*------------------------------------------------- - chd_open_core_file - open a CHD file for access --------------------------------------------------*/ - -CHD_EXPORT chd_error chd_open_core_file(core_file *file, int mode, chd_file *parent, chd_file **chd) +CHD_EXPORT chd_error chd_open_file(core_file *file, int mode, chd_file *parent, chd_file **chd) { chd_file *newchd = NULL; chd_error err; @@ -1799,15 +1382,8 @@ CHD_EXPORT chd_error chd_open_core_file(core_file *file, int mode, chd_file *par EARLY_EXIT(err = CHDERR_UNSUPPORTED_VERSION); /* if we need a parent, make sure we have one */ - if (parent == NULL) - { - /* Detect parent requirement for versions below 5 */ - if (newchd->header.version < 5 && newchd->header.flags & CHDFLAGS_HAS_PARENT) - EARLY_EXIT(err = CHDERR_REQUIRES_PARENT); - /* Detection for version 5 and above - if parentsha1 != 0, we have a parent */ - else if (newchd->header.version >= 5 && memcmp(nullsha1, newchd->header.parentsha1, sizeof(newchd->header.parentsha1)) != 0) - EARLY_EXIT(err = CHDERR_REQUIRES_PARENT); - } + if (parent == NULL && (newchd->header.flags & CHDFLAGS_HAS_PARENT)) + EARLY_EXIT(err = CHDERR_REQUIRES_PARENT); /* make sure we have a valid parent */ if (parent != NULL) @@ -1841,8 +1417,8 @@ CHD_EXPORT chd_error chd_open_core_file(core_file *file, int mode, chd_file *par #ifdef NEED_CACHE_HUNK /* allocate and init the hunk cache */ - newchd->cache = (uint8_t *)malloc(newchd->header.hunkbytes); - newchd->compare = (uint8_t *)malloc(newchd->header.hunkbytes); + newchd->cache = (UINT8 *)malloc(newchd->header.hunkbytes); + newchd->compare = (UINT8 *)malloc(newchd->header.hunkbytes); if (newchd->cache == NULL || newchd->compare == NULL) EARLY_EXIT(err = CHDERR_OUT_OF_MEMORY); newchd->cachehunk = ~0; @@ -1850,7 +1426,7 @@ CHD_EXPORT chd_error chd_open_core_file(core_file *file, int mode, chd_file *par #endif /* allocate the temporary compressed buffer */ - newchd->compressed = (uint8_t *)malloc(newchd->header.hunkbytes); + newchd->compressed = (UINT8 *)malloc(newchd->header.hunkbytes); if (newchd->compressed == NULL) EARLY_EXIT(err = CHDERR_OUT_OF_MEMORY); @@ -1906,22 +1482,6 @@ CHD_EXPORT chd_error chd_open_core_file(core_file *file, int mode, chd_file *par codec = &newchd->zlib_codec_data; break; - case CHD_CODEC_LZMA: - codec = &newchd->lzma_codec_data; - break; - - case CHD_CODEC_HUFFMAN: - codec = &newchd->huff_codec_data; - break; - - case CHD_CODEC_FLAC: - codec = &newchd->flac_codec_data; - break; - - case CHD_CODEC_ZSTD: - codec = &newchd->zstd_codec_data; - break; - case CHD_CODEC_CD_ZLIB: codec = &newchd->cdzl_codec_data; break; @@ -1933,10 +1493,6 @@ CHD_EXPORT chd_error chd_open_core_file(core_file *file, int mode, chd_file *par case CHD_CODEC_CD_FLAC: codec = &newchd->cdfl_codec_data; break; - - case CHD_CODEC_CD_ZSTD: - codec = &newchd->cdzs_codec_data; - break; } if (codec == NULL) @@ -1966,13 +1522,17 @@ CHD_EXPORT chd_error chd_open_core_file(core_file *file, int mode, chd_file *par CHD_EXPORT chd_error chd_precache(chd_file *chd) { - int64_t count; - uint64_t size; +#ifdef _MSC_VER + size_t size, count; +#else + ssize_t size, count; +#endif if (chd->file_cache == NULL) { - size = core_fsize(chd->file); - if ((int64_t)size <= 0) + core_fseek(chd->file, 0, SEEK_END); + size = core_ftell(chd->file); + if (size <= 0) return CHDERR_INVALID_DATA; chd->file_cache = malloc(size); if (chd->file_cache == NULL) @@ -2000,12 +1560,6 @@ CHD_EXPORT chd_error chd_open(const char *filename, int mode, chd_file *parent, chd_error err; core_file *file = NULL; - if (filename == NULL) - { - err = CHDERR_INVALID_PARAMETER; - goto cleanup; - } - /* choose the proper mode */ switch(mode) { @@ -2018,7 +1572,7 @@ CHD_EXPORT chd_error chd_open(const char *filename, int mode, chd_file *parent, } /* open the file */ - file = core_stdio_fopen(filename); + file = core_fopen(filename); if (file == 0) { err = CHDERR_FILE_NOT_FOUND; @@ -2026,7 +1580,12 @@ CHD_EXPORT chd_error chd_open(const char *filename, int mode, chd_file *parent, } /* now open the CHD */ - return chd_open_core_file(file, mode, parent, chd); + err = chd_open_file(file, mode, parent, chd); + if (err != CHDERR_NONE) + goto cleanup; + + /* we now own this file */ + (*chd)->owns_file = TRUE; cleanup: if ((err != CHDERR_NONE) && (file != NULL)) @@ -2063,41 +1622,21 @@ CHD_EXPORT void chd_close(chd_file *chd) switch (chd->codecintf[i]->compression) { - case CHD_CODEC_ZLIB: - codec = &chd->zlib_codec_data; - break; - - case CHD_CODEC_LZMA: - codec = &chd->lzma_codec_data; - break; - - case CHD_CODEC_HUFFMAN: - codec = &chd->huff_codec_data; - break; - - case CHD_CODEC_FLAC: - codec = &chd->flac_codec_data; + case CHD_CODEC_CD_LZMA: + codec = &chd->cdlz_codec_data; break; - case CHD_CODEC_ZSTD: - codec = &chd->zstd_codec_data; + case CHD_CODEC_ZLIB: + codec = &chd->zlib_codec_data; break; case CHD_CODEC_CD_ZLIB: codec = &chd->cdzl_codec_data; break; - case CHD_CODEC_CD_LZMA: - codec = &chd->cdlz_codec_data; - break; - case CHD_CODEC_CD_FLAC: codec = &chd->cdfl_codec_data; break; - - case CHD_CODEC_CD_ZSTD: - codec = &chd->cdzs_codec_data; - break; } if (codec) @@ -2128,7 +1667,7 @@ CHD_EXPORT void chd_close(chd_file *chd) free(chd->map); /* close the file */ - if (chd->file != NULL) + if (chd->owns_file && chd->file != NULL) core_fclose(chd->file); #ifdef NEED_CACHE_HUNK @@ -2137,9 +1676,6 @@ CHD_EXPORT void chd_close(chd_file *chd) if (chd->file_cache) free(chd->file_cache); - if (chd->parent) - chd_close(chd->parent); - /* free our memory */ free(chd); } @@ -2213,41 +1749,6 @@ CHD_EXPORT const chd_header *chd_get_header(chd_file *chd) return &chd->header; } -/*------------------------------------------------- - chd_read_header - read CHD header data - from file into the pointed struct --------------------------------------------------*/ -CHD_EXPORT chd_error chd_read_header(const char *filename, chd_header *header) -{ - chd_error err = CHDERR_NONE; - chd_file chd; - - /* punt if NULL */ - if (filename == NULL || header == NULL) - EARLY_EXIT(err = CHDERR_INVALID_PARAMETER); - - /* open the file */ - chd.file = core_stdio_fopen(filename); - if (chd.file == NULL) - EARLY_EXIT(err = CHDERR_FILE_NOT_FOUND); - - /* attempt to read the header */ - err = header_read(&chd, header); - if (err != CHDERR_NONE) - EARLY_EXIT(err); - - /* validate the header */ - err = header_validate(header); - if (err != CHDERR_NONE) - EARLY_EXIT(err); - -cleanup: - if (chd.file != NULL) - core_fclose(chd.file); - - return err; -} - /*************************************************************************** CORE DATA READ/WRITE ***************************************************************************/ @@ -2257,7 +1758,7 @@ CHD_EXPORT chd_error chd_read_header(const char *filename, chd_header *header) file -------------------------------------------------*/ -CHD_EXPORT chd_error chd_read(chd_file *chd, uint32_t hunknum, void *buffer) +CHD_EXPORT chd_error chd_read(chd_file *chd, UINT32 hunknum, void *buffer) { /* punt if NULL or invalid */ if (chd == NULL || chd->cookie != COOKIE_VALUE) @@ -2268,7 +1769,7 @@ CHD_EXPORT chd_error chd_read(chd_file *chd, uint32_t hunknum, void *buffer) return CHDERR_HUNK_OUT_OF_RANGE; /* perform the read */ - return hunk_read_into_memory(chd, hunknum, (uint8_t *)buffer); + return hunk_read_into_memory(chd, hunknum, (UINT8 *)buffer); } /*************************************************************************** @@ -2280,11 +1781,11 @@ CHD_EXPORT chd_error chd_read(chd_file *chd, uint32_t hunknum, void *buffer) of the given type -------------------------------------------------*/ -CHD_EXPORT chd_error chd_get_metadata(chd_file *chd, uint32_t searchtag, uint32_t searchindex, void *output, uint32_t outputlen, uint32_t *resultlen, uint32_t *resulttag, uint8_t *resultflags) +CHD_EXPORT chd_error chd_get_metadata(chd_file *chd, UINT32 searchtag, UINT32 searchindex, void *output, UINT32 outputlen, UINT32 *resultlen, UINT32 *resulttag, UINT8 *resultflags) { metadata_entry metaentry; chd_error err; - uint32_t count; + UINT32 count; /* if we didn't find it, just return */ err = metadata_find_entry(chd, searchtag, searchindex, &metaentry); @@ -2294,11 +1795,11 @@ CHD_EXPORT chd_error chd_get_metadata(chd_file *chd, uint32_t searchtag, uint32_ if (chd->header.version < 3 && (searchtag == HARD_DISK_METADATA_TAG || searchtag == CHDMETATAG_WILDCARD) && searchindex == 0) { char faux_metadata[256]; - uint32_t faux_length; + UINT32 faux_length; /* fill in the faux metadata */ sprintf(faux_metadata, HARD_DISK_METADATA_FORMAT, chd->header.obsolete_cylinders, chd->header.obsolete_heads, chd->header.obsolete_sectors, chd->header.hunkbytes / chd->header.obsolete_hunksize); - faux_length = (uint32_t)strlen(faux_metadata) + 1; + faux_length = (UINT32)strlen(faux_metadata) + 1; /* copy the metadata itself */ memcpy(output, faux_metadata, MIN(outputlen, faux_length)); @@ -2349,7 +1850,7 @@ CHD_EXPORT chd_error chd_codec_config(chd_file *chd, int param, void *config) particular codec -------------------------------------------------*/ -CHD_EXPORT const char *chd_get_codec_name(uint32_t codec) +CHD_EXPORT const char *chd_get_codec_name(UINT32 codec) { return "Unknown"; } @@ -2427,7 +1928,7 @@ static chd_error header_validate(const chd_header *header) guess at the bytes/unit based on metadata -------------------------------------------------*/ -static uint32_t header_guess_unitbytes(chd_file *chd) +static UINT32 header_guess_unitbytes(chd_file *chd) { /* look for hard disk metadata; if found, then the unit size == sector size */ char metadata[512]; @@ -2455,8 +1956,8 @@ static uint32_t header_guess_unitbytes(chd_file *chd) static chd_error header_read(chd_file *chd, chd_header *header) { - uint8_t rawheader[CHD_MAX_HEADER_SIZE]; - uint32_t count; + UINT8 rawheader[CHD_MAX_HEADER_SIZE]; + UINT32 count; /* punt if NULL */ if (header == NULL) @@ -2478,8 +1979,8 @@ static chd_error header_read(chd_file *chd, chd_header *header) /* extract the direct data */ memset(header, 0, sizeof(*header)); - header->length = get_bigendian_uint32_t(&rawheader[8]); - header->version = get_bigendian_uint32_t(&rawheader[12]); + header->length = get_bigendian_uint32(&rawheader[8]); + header->version = get_bigendian_uint32(&rawheader[12]); /* make sure it's a version we understand */ if (header->version == 0 || header->version > CHD_HEADER_VERSION) @@ -2495,8 +1996,8 @@ static chd_error header_read(chd_file *chd, chd_header *header) return CHDERR_INVALID_DATA; /* extract the common data */ - header->flags = get_bigendian_uint32_t(&rawheader[16]); - header->compression[0] = get_bigendian_uint32_t(&rawheader[20]); + header->flags = get_bigendian_uint32(&rawheader[16]); + header->compression[0] = get_bigendian_uint32(&rawheader[20]); header->compression[1] = CHD_CODEC_NONE; header->compression[2] = CHD_CODEC_NONE; header->compression[3] = CHD_CODEC_NONE; @@ -2504,19 +2005,17 @@ static chd_error header_read(chd_file *chd, chd_header *header) /* extract the V1/V2-specific data */ if (header->version < 3) { - int seclen = (header->version == 1) ? CHD_V1_SECTOR_SIZE : get_bigendian_uint32_t(&rawheader[76]); - header->obsolete_hunksize = get_bigendian_uint32_t(&rawheader[24]); - header->totalhunks = get_bigendian_uint32_t(&rawheader[28]); - header->obsolete_cylinders = get_bigendian_uint32_t(&rawheader[32]); - header->obsolete_heads = get_bigendian_uint32_t(&rawheader[36]); - header->obsolete_sectors = get_bigendian_uint32_t(&rawheader[40]); + int seclen = (header->version == 1) ? CHD_V1_SECTOR_SIZE : get_bigendian_uint32(&rawheader[76]); + header->obsolete_hunksize = get_bigendian_uint32(&rawheader[24]); + header->totalhunks = get_bigendian_uint32(&rawheader[28]); + header->obsolete_cylinders = get_bigendian_uint32(&rawheader[32]); + header->obsolete_heads = get_bigendian_uint32(&rawheader[36]); + header->obsolete_sectors = get_bigendian_uint32(&rawheader[40]); memcpy(header->md5, &rawheader[44], CHD_MD5_BYTES); memcpy(header->parentmd5, &rawheader[60], CHD_MD5_BYTES); - header->logicalbytes = (uint64_t)header->obsolete_cylinders * (uint64_t)header->obsolete_heads * (uint64_t)header->obsolete_sectors * (uint64_t)seclen; + header->logicalbytes = (UINT64)header->obsolete_cylinders * (UINT64)header->obsolete_heads * (UINT64)header->obsolete_sectors * (UINT64)seclen; header->hunkbytes = seclen * header->obsolete_hunksize; header->unitbytes = header_guess_unitbytes(chd); - if (header->unitbytes == 0) - return CHDERR_INVALID_DATA; header->unitcount = (header->logicalbytes + header->unitbytes - 1) / header->unitbytes; header->metaoffset = 0; } @@ -2524,15 +2023,13 @@ static chd_error header_read(chd_file *chd, chd_header *header) /* extract the V3-specific data */ else if (header->version == 3) { - header->totalhunks = get_bigendian_uint32_t(&rawheader[24]); - header->logicalbytes = get_bigendian_uint64_t(&rawheader[28]); - header->metaoffset = get_bigendian_uint64_t(&rawheader[36]); + header->totalhunks = get_bigendian_uint32(&rawheader[24]); + header->logicalbytes = get_bigendian_uint64(&rawheader[28]); + header->metaoffset = get_bigendian_uint64(&rawheader[36]); memcpy(header->md5, &rawheader[44], CHD_MD5_BYTES); memcpy(header->parentmd5, &rawheader[60], CHD_MD5_BYTES); - header->hunkbytes = get_bigendian_uint32_t(&rawheader[76]); + header->hunkbytes = get_bigendian_uint32(&rawheader[76]); header->unitbytes = header_guess_unitbytes(chd); - if (header->unitbytes == 0) - return CHDERR_INVALID_DATA; header->unitcount = (header->logicalbytes + header->unitbytes - 1) / header->unitbytes; memcpy(header->sha1, &rawheader[80], CHD_SHA1_BYTES); memcpy(header->parentsha1, &rawheader[100], CHD_SHA1_BYTES); @@ -2541,13 +2038,11 @@ static chd_error header_read(chd_file *chd, chd_header *header) /* extract the V4-specific data */ else if (header->version == 4) { - header->totalhunks = get_bigendian_uint32_t(&rawheader[24]); - header->logicalbytes = get_bigendian_uint64_t(&rawheader[28]); - header->metaoffset = get_bigendian_uint64_t(&rawheader[36]); - header->hunkbytes = get_bigendian_uint32_t(&rawheader[44]); + header->totalhunks = get_bigendian_uint32(&rawheader[24]); + header->logicalbytes = get_bigendian_uint64(&rawheader[28]); + header->metaoffset = get_bigendian_uint64(&rawheader[36]); + header->hunkbytes = get_bigendian_uint32(&rawheader[44]); header->unitbytes = header_guess_unitbytes(chd); - if (header->unitbytes == 0) - return CHDERR_INVALID_DATA; header->unitcount = (header->logicalbytes + header->unitbytes - 1) / header->unitbytes; memcpy(header->sha1, &rawheader[48], CHD_SHA1_BYTES); memcpy(header->parentsha1, &rawheader[68], CHD_SHA1_BYTES); @@ -2558,20 +2053,16 @@ static chd_error header_read(chd_file *chd, chd_header *header) else if (header->version == 5) { /* TODO */ - header->compression[0] = get_bigendian_uint32_t(&rawheader[16]); - header->compression[1] = get_bigendian_uint32_t(&rawheader[20]); - header->compression[2] = get_bigendian_uint32_t(&rawheader[24]); - header->compression[3] = get_bigendian_uint32_t(&rawheader[28]); - header->logicalbytes = get_bigendian_uint64_t(&rawheader[32]); - header->mapoffset = get_bigendian_uint64_t(&rawheader[40]); - header->metaoffset = get_bigendian_uint64_t(&rawheader[48]); - header->hunkbytes = get_bigendian_uint32_t(&rawheader[56]); - if (header->hunkbytes == 0) - return CHDERR_INVALID_DATA; + header->compression[0] = get_bigendian_uint32(&rawheader[16]); + header->compression[1] = get_bigendian_uint32(&rawheader[20]); + header->compression[2] = get_bigendian_uint32(&rawheader[24]); + header->compression[3] = get_bigendian_uint32(&rawheader[28]); + header->logicalbytes = get_bigendian_uint64(&rawheader[32]); + header->mapoffset = get_bigendian_uint64(&rawheader[40]); + header->metaoffset = get_bigendian_uint64(&rawheader[48]); + header->hunkbytes = get_bigendian_uint32(&rawheader[56]); header->hunkcount = (header->logicalbytes + header->hunkbytes - 1) / header->hunkbytes; - header->unitbytes = get_bigendian_uint32_t(&rawheader[60]); - if (header->unitbytes == 0) - return CHDERR_INVALID_DATA; + header->unitbytes = get_bigendian_uint32(&rawheader[60]); header->unitcount = (header->logicalbytes + header->unitbytes - 1) / header->unitbytes; memcpy(header->sha1, &rawheader[84], CHD_SHA1_BYTES); memcpy(header->parentsha1, &rawheader[104], CHD_SHA1_BYTES); @@ -2603,7 +2094,7 @@ static chd_error header_read(chd_file *chd, chd_header *header) hunk -------------------------------------------------*/ -static uint8_t* hunk_read_compressed(chd_file *chd, uint64_t offset, size_t size) +static UINT8* hunk_read_compressed(chd_file *chd, UINT64 offset, size_t size) { #ifdef _MSC_VER size_t bytes; @@ -2629,7 +2120,7 @@ static uint8_t* hunk_read_compressed(chd_file *chd, uint64_t offset, size_t size hunk -------------------------------------------------*/ -static chd_error hunk_read_uncompressed(chd_file *chd, uint64_t offset, size_t size, uint8_t *dest) +static chd_error hunk_read_uncompressed(chd_file *chd, UINT64 offset, size_t size, UINT8 *dest) { #ifdef _MSC_VER size_t bytes; @@ -2656,7 +2147,7 @@ static chd_error hunk_read_uncompressed(chd_file *chd, uint64_t offset, size_t s the CHD's hunk cache -------------------------------------------------*/ -static chd_error hunk_read_into_cache(chd_file *chd, uint32_t hunknum) +static chd_error hunk_read_into_cache(chd_file *chd, UINT32 hunknum) { chd_error err; @@ -2685,7 +2176,7 @@ static chd_error hunk_read_into_cache(chd_file *chd, uint32_t hunknum) memory at the given location -------------------------------------------------*/ -static chd_error hunk_read_into_memory(chd_file *chd, uint32_t hunknum, uint8_t *dest) +static chd_error hunk_read_into_memory(chd_file *chd, UINT32 hunknum, UINT8 *dest) { chd_error err; @@ -2703,8 +2194,8 @@ static chd_error hunk_read_into_memory(chd_file *chd, uint32_t hunknum, uint8_t if (chd->header.version < 5) { map_entry *entry = &chd->map[hunknum]; - uint32_t bytes; - uint8_t* compressed_bytes; + UINT32 bytes; + UINT8* compressed_bytes; /* switch off the entry type */ switch (entry->flags & MAP_ENTRY_FLAG_TYPE_MASK) @@ -2717,9 +2208,7 @@ static chd_error hunk_read_into_memory(chd_file *chd, uint32_t hunknum, uint8_t /* read it into the decompression buffer */ compressed_bytes = hunk_read_compressed(chd, entry->offset, entry->length); if (compressed_bytes == NULL) - { return CHDERR_READ_ERROR; - } /* now decompress using the codec */ err = CHDERR_NONE; @@ -2740,7 +2229,7 @@ static chd_error hunk_read_into_memory(chd_file *chd, uint32_t hunknum, uint8_t /* mini-compressed data */ case V34_MAP_ENTRY_TYPE_MINI: - put_bigendian_uint64_t(&dest[0], entry->offset); + put_bigendian_uint64(&dest[0], entry->offset); for (bytes = 8; bytes < chd->header.hunkbytes; bytes++) dest[bytes] = dest[bytes - 8]; break; @@ -2772,16 +2261,16 @@ static chd_error hunk_read_into_memory(chd_file *chd, uint32_t hunknum, uint8_t uint16_t blockcrc; #endif uint8_t *rawmap = &chd->header.rawmap[chd->header.mapentrybytes * hunknum]; - uint8_t* compressed_bytes; + UINT8* compressed_bytes; /* uncompressed case */ if (!chd_compressed(&chd->header)) { - blockoffs = (uint64_t)get_bigendian_uint32_t(rawmap) * (uint64_t)chd->header.hunkbytes; + blockoffs = (uint64_t)get_bigendian_uint32(rawmap) * (uint64_t)chd->header.hunkbytes; if (blockoffs != 0) { + int result; core_fseek(chd->file, blockoffs, SEEK_SET); - /*int result =*/ - core_fread(chd->file, dest, chd->header.hunkbytes); + result = core_fread(chd->file, dest, chd->header.hunkbytes); /* TODO else if (m_parent_missing) throw CHDERR_REQUIRES_PARENT; */ @@ -2814,41 +2303,21 @@ static chd_error hunk_read_into_memory(chd_file *chd, uint32_t hunknum, uint8_t return CHDERR_READ_ERROR; switch (chd->codecintf[rawmap[0]]->compression) { - case CHD_CODEC_ZLIB: - codec = &chd->zlib_codec_data; - break; - - case CHD_CODEC_LZMA: - codec = &chd->lzma_codec_data; - break; - - case CHD_CODEC_HUFFMAN: - codec = &chd->huff_codec_data; - break; - - case CHD_CODEC_FLAC: - codec = &chd->flac_codec_data; + case CHD_CODEC_CD_LZMA: + codec = &chd->cdlz_codec_data; break; - case CHD_CODEC_ZSTD: - codec = &chd->zstd_codec_data; + case CHD_CODEC_ZLIB: + codec = &chd->zlib_codec_data; break; case CHD_CODEC_CD_ZLIB: codec = &chd->cdzl_codec_data; break; - case CHD_CODEC_CD_LZMA: - codec = &chd->cdlz_codec_data; - break; - case CHD_CODEC_CD_FLAC: codec = &chd->cdfl_codec_data; break; - - case CHD_CODEC_CD_ZSTD: - codec = &chd->cdzs_codec_data; - break; } if (codec==NULL) return CHDERR_CODEC_ERROR; @@ -2875,36 +2344,13 @@ static chd_error hunk_read_into_memory(chd_file *chd, uint32_t hunknum, uint8_t return hunk_read_into_memory(chd, blockoffs, dest); case COMPRESSION_PARENT: - { - uint8_t units_in_hunk = chd->header.hunkbytes / chd->header.unitbytes; - - if (chd->parent == NULL) +#if 0 + /* TODO */ + if (m_parent_missing) return CHDERR_REQUIRES_PARENT; - - /* blockoffs is aligned to units_in_hunk */ - if (blockoffs % units_in_hunk == 0) { - return hunk_read_into_memory(chd->parent, blockoffs / units_in_hunk, dest); - /* blockoffs is not aligned to units_in_hunk */ - } else { - uint32_t unit_in_hunk = blockoffs % units_in_hunk; - uint8_t *buf = malloc(chd->header.hunkbytes); - /* Read first half of hunk which contains blockoffs */ - err = hunk_read_into_memory(chd->parent, blockoffs / units_in_hunk, buf); - if (err != CHDERR_NONE) { - free(buf); - return err; - } - memcpy(dest, buf + unit_in_hunk * chd->header.unitbytes, (units_in_hunk - unit_in_hunk) * chd->header.unitbytes); - /* Read second half of hunk which contains blockoffs */ - err = hunk_read_into_memory(chd->parent, (blockoffs / units_in_hunk) + 1, buf); - if (err != CHDERR_NONE) { - free(buf); - return err; - } - memcpy(dest + (units_in_hunk - unit_in_hunk) * chd->header.unitbytes, buf, unit_in_hunk * chd->header.unitbytes); - free(buf); - } - } + return m_parent->read_bytes(uint64_t(blockoffs) * uint64_t(m_parent->unit_bytes()), dest, m_hunkbytes); +#endif + return CHDERR_DECOMPRESSION_ERROR; } return CHDERR_NONE; } @@ -2923,13 +2369,13 @@ static chd_error hunk_read_into_memory(chd_file *chd, uint32_t hunknum, uint8_t static chd_error map_read(chd_file *chd) { - uint32_t entrysize = (chd->header.version < 3) ? OLD_MAP_ENTRY_SIZE : MAP_ENTRY_SIZE; - uint8_t raw_map_entries[MAP_STACK_ENTRIES * MAP_ENTRY_SIZE]; - uint64_t fileoffset, maxoffset = 0; - uint8_t cookie[MAP_ENTRY_SIZE]; - uint32_t count; + UINT32 entrysize = (chd->header.version < 3) ? OLD_MAP_ENTRY_SIZE : MAP_ENTRY_SIZE; + UINT8 raw_map_entries[MAP_STACK_ENTRIES * MAP_ENTRY_SIZE]; + UINT64 fileoffset, maxoffset = 0; + UINT8 cookie[MAP_ENTRY_SIZE]; + UINT32 count; chd_error err; - uint32_t i; + int i; /* first allocate memory */ chd->map = (map_entry *)malloc(sizeof(chd->map[0]) * chd->header.totalhunks); @@ -3006,7 +2452,7 @@ static chd_error map_read(chd_file *chd) metadata_find_entry - find a metadata entry -------------------------------------------------*/ -static chd_error metadata_find_entry(chd_file *chd, uint32_t metatag, uint32_t metaindex, metadata_entry *metaentry) +static chd_error metadata_find_entry(chd_file *chd, UINT32 metatag, UINT32 metaindex, metadata_entry *metaentry) { /* start at the beginning */ metaentry->offset = chd->header.metaoffset; @@ -3015,8 +2461,8 @@ static chd_error metadata_find_entry(chd_file *chd, uint32_t metatag, uint32_t m /* loop until we run out of options */ while (metaentry->offset != 0) { - uint8_t raw_meta_header[METADATA_HEADER_SIZE]; - uint32_t count; + UINT8 raw_meta_header[METADATA_HEADER_SIZE]; + UINT32 count; /* read the raw header */ core_fseek(chd->file, metaentry->offset, SEEK_SET); @@ -3025,9 +2471,9 @@ static chd_error metadata_find_entry(chd_file *chd, uint32_t metatag, uint32_t m break; /* extract the data */ - metaentry->metatag = get_bigendian_uint32_t(&raw_meta_header[0]); - metaentry->length = get_bigendian_uint32_t(&raw_meta_header[4]); - metaentry->next = get_bigendian_uint64_t(&raw_meta_header[8]); + metaentry->metatag = get_bigendian_uint32(&raw_meta_header[0]); + metaentry->length = get_bigendian_uint32(&raw_meta_header[4]); + metaentry->next = get_bigendian_uint64(&raw_meta_header[8]); /* flags are encoded in the high byte of length */ metaentry->flags = metaentry->length >> 24; @@ -3080,6 +2526,10 @@ static chd_error zlib_codec_init(void *codec, uint32_t hunkbytes) else err = CHDERR_NONE; + /* handle an error */ + if (err != CHDERR_NONE) + zlib_codec_free(data); + return err; } @@ -3095,6 +2545,8 @@ static void zlib_codec_free(void *codec) /* deinit the streams */ if (data != NULL) { + int i; + inflateEnd(&data->inflater); /* free our fast memory */ @@ -3144,7 +2596,7 @@ static voidpf zlib_fast_alloc(voidpf opaque, uInt items, uInt size) { zlib_allocator *alloc = (zlib_allocator *)opaque; uintptr_t paddr = 0; - uint32_t *ptr; + UINT32 *ptr; int i; /* compute the size, rounding to the nearest 1k */ @@ -3165,7 +2617,7 @@ static voidpf zlib_fast_alloc(voidpf opaque, uInt items, uInt size) } /* alloc a new one */ - ptr = (uint32_t *)malloc(size + sizeof(uint32_t) + ZLIB_MIN_ALIGNMENT_BYTES); + ptr = (UINT32 *)malloc(size + sizeof(UINT32) + ZLIB_MIN_ALIGNMENT_BYTES); if (!ptr) return NULL; @@ -3174,7 +2626,7 @@ static voidpf zlib_fast_alloc(voidpf opaque, uInt items, uInt size) if (!alloc->allocptr[i]) { alloc->allocptr[i] = ptr; - paddr = (((uintptr_t)ptr) + sizeof(uint32_t) + (ZLIB_MIN_ALIGNMENT_BYTES-1)) & (~(ZLIB_MIN_ALIGNMENT_BYTES-1)); + paddr = (((uintptr_t)ptr) + sizeof(UINT32) + (ZLIB_MIN_ALIGNMENT_BYTES-1)) & (~(ZLIB_MIN_ALIGNMENT_BYTES-1)); alloc->allocptr2[i] = (uint32_t*)paddr; break; } @@ -3194,7 +2646,7 @@ static voidpf zlib_fast_alloc(voidpf opaque, uInt items, uInt size) static void zlib_fast_free(voidpf opaque, voidpf address) { zlib_allocator *alloc = (zlib_allocator *)opaque; - uint32_t *ptr = (uint32_t *)address; + UINT32 *ptr = (UINT32 *)address; int i; /* find the hunk */ @@ -3219,87 +2671,3 @@ static void zlib_allocator_free(voidpf opaque) if (alloc->allocptr[i]) free(alloc->allocptr[i]); } - -/*------------------------------------------------- - core_stdio_fopen - core_file wrapper over fopen --------------------------------------------------*/ -static core_file *core_stdio_fopen(char const *path) { - core_file *file = malloc(sizeof(core_file)); - if (!file) - return NULL; - if (!(file->argp = fopen(path, "rb"))) { - free(file); - return NULL; - } - file->fsize = core_stdio_fsize; - file->fread = core_stdio_fread; - file->fclose = core_stdio_fclose; - file->fseek = core_stdio_fseek; - return file; -} - -/*------------------------------------------------- - core_stdio_fsize - core_file function for - getting file size with stdio --------------------------------------------------*/ -static uint64_t core_stdio_fsize(core_file *file) { -#if defined USE_LIBRETRO_VFS - #define core_stdio_fseek_impl fseek - #define core_stdio_ftell_impl ftell -#elif defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(__WIN64__) - #define core_stdio_fseek_impl _fseeki64 - #define core_stdio_ftell_impl _ftelli64 -#elif defined(_LARGEFILE_SOURCE) && defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 - #define core_stdio_fseek_impl fseeko64 - #define core_stdio_ftell_impl ftello64 -#elif defined(__PS3__) && !defined(__PSL1GHT__) || defined(__SWITCH__) || defined(__vita__) - #define core_stdio_fseek_impl(x,y,z) fseek(x,(off_t)y,z) - #define core_stdio_ftell_impl(x) (off_t)ftell(x) -#else - #define core_stdio_fseek_impl fseeko - #define core_stdio_ftell_impl ftello -#endif - FILE *fp; - uint64_t p, rv; - fp = (FILE*)file->argp; - - p = core_stdio_ftell_impl(fp); - core_stdio_fseek_impl(fp, 0, SEEK_END); - rv = core_stdio_ftell_impl(fp); - core_stdio_fseek_impl(fp, p, SEEK_SET); - return rv; -} - -/*------------------------------------------------- - core_stdio_fread - core_file wrapper over fread --------------------------------------------------*/ -static size_t core_stdio_fread(void *ptr, size_t size, size_t nmemb, core_file *file) { - return fread(ptr, size, nmemb, (FILE*)file->argp); -} - -/*------------------------------------------------- - core_stdio_fclose - core_file wrapper over fclose --------------------------------------------------*/ -static int core_stdio_fclose(core_file *file) { - int err = fclose((FILE*)file->argp); - if (err == 0) - free(file); - return err; -} - -/*------------------------------------------------- - core_stdio_fclose_nonowner - don't call fclose because - we don't own the underlying file, but do free the - core_file because libchdr did allocate that itself. --------------------------------------------------*/ -static int core_stdio_fclose_nonowner(core_file *file) { - free(file); - return 0; -} - -/*------------------------------------------------- - core_stdio_fseek - core_file wrapper over fclose --------------------------------------------------*/ -static int core_stdio_fseek(core_file* file, int64_t offset, int whence) { - return core_stdio_fseek_impl((FILE*)file->argp, offset, whence); -} diff --git a/libretro/deps/libchdr/src/libchdr_flac.c b/libretro/deps/libchdr/src/libchdr_flac.c index 66c09dea8..4ded43ba4 100644 --- a/libretro/deps/libchdr/src/libchdr_flac.c +++ b/libretro/deps/libchdr/src/libchdr_flac.c @@ -8,14 +8,11 @@ ***************************************************************************/ +#include #include #include -#undef INLINE -#include #define DR_FLAC_IMPLEMENTATION -#define DR_FLAC_NO_STDIO -#define DRFLAC_API static INLINE #include /*************************************************************************** @@ -26,13 +23,13 @@ static size_t flac_decoder_read_callback(void *userdata, void *buffer, size_t bytes); static drflac_bool32 flac_decoder_seek_callback(void *userdata, int offset, drflac_seek_origin origin); static void flac_decoder_metadata_callback(void *userdata, drflac_metadata *metadata); -static void flac_decoder_write_callback(void *userdata, void *buffer, size_t bytes); +static void flac_decoder_write_callback(void *userdata, void *buffer, size_t len); /* getters (valid after reset) */ -/*static uint32_t sample_rate(flac_decoder *decoder) { return decoder->sample_rate; }*/ +static uint32_t sample_rate(flac_decoder *decoder) { return decoder->sample_rate; } static uint8_t channels(flac_decoder *decoder) { return decoder->channels; } -/*static uint8_t bits_per_sample(flac_decoder *decoder) { return decoder->bits_per_sample; }*/ +static uint8_t bits_per_sample(flac_decoder *decoder) { return decoder->bits_per_sample; } /*------------------------------------------------- * flac_decoder - constructor @@ -63,10 +60,9 @@ int flac_decoder_init(flac_decoder *decoder) void flac_decoder_free(flac_decoder* decoder) { - if ((decoder != NULL) && (decoder->decoder != NULL)) { + if ((decoder != NULL) && (decoder->decoder != NULL)) drflac_close(decoder->decoder); - decoder->decoder = NULL; - } + decoder->decoder = NULL; } /*------------------------------------------------- @@ -131,11 +127,12 @@ int flac_decoder_reset(flac_decoder* decoder, uint32_t sample_rate, uint8_t num_ *------------------------------------------------- */ +#define BUFFER 2352 /* bytes per CD audio sector */ + int flac_decoder_decode_interleaved(flac_decoder* decoder, int16_t *samples, uint32_t num_samples, int swap_endian) { -#define BUFFER 2352 /* bytes per CD audio sector */ int16_t buffer[BUFFER]; - uint32_t buf_samples = BUFFER / channels(decoder); + uint32_t buf_samples; /* configure the uncompressed buffer */ memset(decoder->uncompressed_start, 0, sizeof(decoder->uncompressed_start)); @@ -144,6 +141,7 @@ int flac_decoder_decode_interleaved(flac_decoder* decoder, int16_t *samples, uin decoder->uncompressed_length = num_samples; decoder->uncompressed_swap = swap_endian; + buf_samples = BUFFER / channels(decoder); /* loop until we get everything we want */ while (decoder->uncompressed_offset < decoder->uncompressed_length) { uint32_t frames = (num_samples < buf_samples ? num_samples : buf_samples); @@ -304,3 +302,4 @@ static drflac_bool32 flac_decoder_seek_callback(void *userdata, int offset, drfl } return 0; } + diff --git a/libretro/deps/libchdr/src/libchdr_huffman.c b/libretro/deps/libchdr/src/libchdr_huffman.c index 556aa346f..6a50f1344 100644 --- a/libretro/deps/libchdr/src/libchdr_huffman.c +++ b/libretro/deps/libchdr/src/libchdr_huffman.c @@ -97,6 +97,7 @@ ***************************************************************************/ #include +#include #include #include @@ -180,8 +181,7 @@ uint32_t huffman_decode_one(struct huffman_decoder* decoder, struct bitstream* b enum huffman_error huffman_import_tree_rle(struct huffman_decoder* decoder, struct bitstream* bitbuf) { - int numbits; - uint32_t curnode; + int numbits, curnode; enum huffman_error error; /* bits per entry depends on the maxbits */ @@ -212,8 +212,6 @@ enum huffman_error huffman_import_tree_rle(struct huffman_decoder* decoder, stru else { int repcount = bitstream_read(bitbuf, numbits) + 3; - if (repcount + curnode > decoder->numcodes) - return HUFFERR_INVALID_DATA; while (repcount--) decoder->huffnode[curnode++].numbits = nodebits; } @@ -249,7 +247,7 @@ enum huffman_error huffman_import_tree_huffman(struct huffman_decoder* decoder, int last = 0; int count = 0; int index; - uint32_t curcode; + int curcode; uint8_t rlefullbits = 0; uint32_t temp; enum huffman_error error; @@ -295,9 +293,6 @@ enum huffman_error huffman_import_tree_huffman(struct huffman_decoder* decoder, } } - /* make sure we free the local huffman decoder */ - delete_huffman_decoder(smallhuff); - /* make sure we ended up with the right number */ if (curcode != decoder->numcodes) return HUFFERR_INVALID_DATA; @@ -322,7 +317,7 @@ enum huffman_error huffman_import_tree_huffman(struct huffman_decoder* decoder, enum huffman_error huffman_compute_tree_from_histo(struct huffman_decoder* decoder) { - uint32_t i; + int i; uint32_t lowerweight; uint32_t upperweight; /* compute the number of data items in the histogram */ @@ -386,7 +381,7 @@ static int huffman_tree_node_compare(const void *item1, const void *item2) int huffman_build_tree(struct huffman_decoder* decoder, uint32_t totaldata, uint32_t totalweight) { - uint32_t curcode; + int curcode; int nextalloc; int listitems = 0; int maxbits = 0; @@ -483,8 +478,7 @@ int huffman_build_tree(struct huffman_decoder* decoder, uint32_t totaldata, uint enum huffman_error huffman_assign_canonical_codes(struct huffman_decoder* decoder) { - uint32_t curcode; - int codelen; + int curcode, codelen; uint32_t curstart = 0; /* build up a histogram of bit lengths */ uint32_t bithisto[33] = { 0 }; @@ -525,7 +519,7 @@ enum huffman_error huffman_assign_canonical_codes(struct huffman_decoder* decode void huffman_build_lookup_table(struct huffman_decoder* decoder) { - uint32_t curcode; + int curcode; /* iterate over all codes */ for (curcode = 0; curcode < decoder->numcodes; curcode++) { diff --git a/libretro/jni/Android.mk b/libretro/jni/Android.mk index fb5a3a82e..d9448aff8 100644 --- a/libretro/jni/Android.mk +++ b/libretro/jni/Android.mk @@ -10,7 +10,7 @@ USE_PER_SOUND_CHANNELS_CONFIG := 1 include $(CORE_DIR)/libretro/Makefile.common -COREFLAGS := -ffast-math -funroll-loops -DINLINE="static inline" -DUSE_LIBTREMOR -DUSE_16BPP_RENDERING -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN -D__LIBRETRO__ -DFRONTEND_SUPPORTS_RGB565 -DALIGN_LONG -DALIGN_WORD -DM68K_OVERCLOCK_SHIFT=20 -DZ80_OVERCLOCK_SHIFT=20 -DHAVE_YM3438_CORE -DUSE_LIBCHDR -D_7ZIP_ST -DZSTD_DISABLE_ASM -DUSE_LIBRETRO_VFS -DHAVE_OPLL_CORE -DUSE_PER_SOUND_CHANNELS_CONFIG $(INCFLAGS) -DMAXROMSIZE=16777216 +COREFLAGS := -ffast-math -funroll-loops -DINLINE="static inline" -DUSE_LIBTREMOR -DUSE_16BPP_RENDERING -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN -D__LIBRETRO__ -DFRONTEND_SUPPORTS_RGB565 -DALIGN_LONG -DALIGN_WORD -DM68K_OVERCLOCK_SHIFT=20 -DZ80_OVERCLOCK_SHIFT=20 -DHAVE_YM3438_CORE -DUSE_LIBCHDR -D_7ZIP_ST -DUSE_LIBRETRO_VFS -DHAVE_OPLL_CORE -DUSE_PER_SOUND_CHANNELS_CONFIG $(INCFLAGS) -DMAXROMSIZE=16777216 ifeq ($(TARGET_ARCH),arm) COREFLAGS += -D_ARM_ASSEM_ diff --git a/libretro/libretro.c b/libretro/libretro.c index 798c6cc5f..05899d814 100644 --- a/libretro/libretro.c +++ b/libretro/libretro.c @@ -144,14 +144,22 @@ static uint8_t brm_format[0x40] = }; uint8_t cart_size; +#define MAX_SOUND 768000 + +#ifdef FRONTEND_SUPPORTS_RGB888 + #define RETRO_PITCH uint32_t +#else + #define RETRO_PITCH uint16_t +#endif + static bool is_running = 0; static bool restart_eq = false; static uint8_t temp[0x10000]; -static int16 soundbuffer[3068]; -static uint16_t bitmap_data_[720 * 576]; +static int16 soundbuffer[MAX_SOUND / 50 * 4 * 2]; +static RETRO_PITCH bitmap_data_[720 * 576]; static uint8_t reg0_prev = 0; -static char g_rom_dir[256]; +char g_rom_dir[256]; static char g_rom_name[256]; static const void *g_rom_data = NULL; static size_t g_rom_size = 0; @@ -201,7 +209,7 @@ static uint32_t overclock_delay; static bool libretro_supports_option_categories = false; static bool libretro_supports_bitmasks = false; -#define SOUND_FREQUENCY 44100 +#define SOUND_FREQUENCY MAX_SOUND /*EQ settings*/ #define HAVE_EQ @@ -226,6 +234,10 @@ static bool update_audio_latency = false; static bool show_advanced_av_settings = true; #endif +static unsigned video_ramp = 0; +static unsigned volume_master = 100; +static unsigned sampling_rate = 48000; + static void retro_audio_buff_status_cb( bool active, unsigned occupancy, bool underrun_likely) { @@ -937,7 +949,8 @@ static void draw_cursor(int16_t x, int16_t y, uint16_t color) int i; /* crosshair center position */ - uint16_t *ptr = (uint16_t *)bitmap.data + ((bitmap.viewport.y + y) * bitmap.width) + x + bitmap.viewport.x; + RETRO_PITCH *ptr = (uint32_t *)bitmap.data + ((bitmap.viewport.y + y) * bitmap.width) + x + bitmap.viewport.x; + RETRO_PITCH white = (RETRO_PITCH) (-1); /* default crosshair dimension */ int x_start = x - 3; @@ -957,9 +970,9 @@ static void draw_cursor(int16_t x, int16_t y, uint16_t color) /* draw crosshair */ for (i = (x_start - x); i <= (x_end - x); i++) - ptr[i] = (i & 1) ? color : 0xffff; + ptr[i] = (i & 1) ? color : white; for (i = (y_start - y); i <= (y_end - y); i++) - ptr[i * bitmap.width] = (i & 1) ? color : 0xffff; + ptr[i * bitmap.width] = (i & 1) ? color : white; } static void init_bitmap(void) @@ -967,7 +980,7 @@ static void init_bitmap(void) memset(&bitmap, 0, sizeof(bitmap)); bitmap.width = 720; bitmap.height = 576; - bitmap.pitch = 720 * 2; + bitmap.pitch = 720 * sizeof(RETRO_PITCH); bitmap.data = (uint8_t *)bitmap_data_; } @@ -1320,9 +1333,9 @@ static bool update_viewport(void) else bmdoffset = vwoffset = 0; - vwidth = bitmap.viewport.w + (bitmap.viewport.x * 2); - vheight = bitmap.viewport.h + (bitmap.viewport.y * 2); - vaspect_ratio = calculate_display_aspect_ratio(); + vwidth = bitmap.viewport.w + (bitmap.viewport.x * 2); + vheight = bitmap.viewport.h + (bitmap.viewport.y * 2); + vaspect_ratio = calculate_display_aspect_ratio(); if (config.ntsc) { @@ -1607,7 +1620,7 @@ static void check_variables(bool first_run) }; /* framerate might have changed, reinitialize audio timings */ - audio_set_rate(44100, 0); + audio_set_rate(sampling_rate, 0); /* reinitialize I/O region register */ if (system_hw == SYSTEM_MD) @@ -1688,7 +1701,7 @@ static void check_variables(bool first_run) }; /* framerate might have changed, reinitialize audio timings */ - audio_set_rate(44100, 0); + audio_set_rate(sampling_rate, 0); /* reinitialize I/O region register */ if (system_hw == SYSTEM_MD) @@ -1859,11 +1872,35 @@ static void check_variables(bool first_run) config.mono = 0; } + var.key = "genesis_plus_gx_audio_master_volume"; + environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); + { + volume_master = (!var.value) ? 100 : atoi(var.value); + } + + var.key = "genesis_plus_gx_audio_sampling_rate"; + environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); + { + unsigned old_value = sampling_rate; + sampling_rate = (!var.value) ? 48000 : atoi(var.value); + } + + var.key = "genesis_plus_gx_audio_lowpass_cutoff"; + environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); + { + extern int set_blip_lowpass(int rate); + unsigned new_value; + + new_value = (!var.value) ? 0 : atoi(var.value); + set_blip_lowpass(new_value); + } var.key = "genesis_plus_gx_psg_preamp"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { config.psg_preamp = (!var.value) ? 150: atoi(var.value); + config.psg_preamp = (config.psg_preamp * volume_master) / 100; + if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { psg_config(0, config.psg_preamp, 0xff); @@ -1878,18 +1915,21 @@ static void check_variables(bool first_run) environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { config.fm_preamp = (!var.value) ? 100: atoi(var.value); + config.fm_preamp = (config.fm_preamp * volume_master) / 100; } var.key = "genesis_plus_gx_cdda_volume"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { config.cdda_volume = (!var.value) ? 100: atoi(var.value); + config.cdda_volume = (config.cdda_volume * volume_master) / 100; } var.key = "genesis_plus_gx_pcm_volume"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { config.pcm_volume = (!var.value) ? 100: atoi(var.value); + config.pcm_volume = (config.pcm_volume * volume_master) / 100; } var.key = "genesis_plus_gx_audio_filter"; @@ -2011,6 +2051,7 @@ static void check_variables(bool first_run) { orig_value = config.ntsc; +#if 0 if (!var.value || !strcmp(var.value, "disabled")) config.ntsc = 0; else if (var.value && !strcmp(var.value, "monochrome")) @@ -2037,6 +2078,7 @@ static void check_variables(bool first_run) sms_ntsc_init(sms_ntsc, &sms_ntsc_rgb); md_ntsc_init(md_ntsc, &md_ntsc_rgb); } +#endif if (orig_value != config.ntsc) update_viewports = true; @@ -2109,6 +2151,23 @@ static void check_variables(bool first_run) update_viewports = true; } + var.key = "genesis_plus_gx_video_ramp"; + environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); + { + extern void palette_libretro_init(int type); + int old_value = video_ramp; + + if (!var.value || !strcmp(var.value, "Linear")) + video_ramp = 0; + else if (!strcmp(var.value, "Hardware")) + video_ramp = 1; + else if (!strcmp(var.value, "Sgb")) + video_ramp = 2; + + if (old_value != video_ramp) + palette_libretro_init(video_ramp); + } + var.key = "genesis_plus_gx_gun_cursor"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { @@ -2273,7 +2332,7 @@ static void check_variables(bool first_run) #ifdef HAVE_OVERCLOCK overclock_delay = OVERCLOCK_FRAME_DELAY; #endif - audio_init(SOUND_FREQUENCY, 0); + audio_init(sampling_rate, 0); memcpy(temp, sram.sram, sizeof(temp)); system_init(); system_reset(); @@ -2743,11 +2802,10 @@ static void set_memory_maps(void) const uint64_t mem = RETRO_MEMDESC_SYSTEM_RAM; struct retro_memory_map mmaps; struct retro_memory_descriptor descs[] = { - { mem, work_ram, 0, 0xFF0000, 0, 0, 0x10000, "68KRAM" }, + { mem, work_ram, 0, 0xFF0000, 0, 0, 0x10000, "68KRAM" }, /* virtual address using SCD_BIT so all 512M of prg_ram can be accessed */ /* at address $80020000 */ - { mem, scd.prg_ram, 0, SCD_BIT | 0x020000, 0, 0, 0x80000, "PRGRAM" }, - { mem, scd.word_ram_2M, 0, 0x200000, 0, 0, 0x40000, "WORDRAM" }, + { mem, scd.prg_ram, 0, SCD_BIT | 0x020000, 0, 0, 0x80000, "PRGRAM" }, }; mmaps.descriptors = descs; @@ -3165,7 +3223,7 @@ void retro_get_system_av_info(struct retro_system_av_info *info) info->geometry.aspect_ratio = vaspect_ratio; info->timing.fps = (double)(system_clock) / (double)lines_per_frame / (double)MCYCLES_PER_LINE; - info->timing.sample_rate = SOUND_FREQUENCY; + info->timing.sample_rate = sampling_rate; if (!retro_fps) retro_fps = info->timing.fps; @@ -3491,6 +3549,13 @@ bool retro_load_game(const struct retro_game_info *info) if (log_cb) log_cb(RETRO_LOG_INFO, "Frontend supports RGB565 - will use that instead of XRGB1555.\n"); } +#elif defined(FRONTEND_SUPPORTS_RGB888) + { + unsigned rgb888 = RETRO_PIXEL_FORMAT_XRGB8888; + if(environ_cb(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &rgb888)) + if (log_cb) + log_cb(RETRO_LOG_INFO, "Frontend supports RGB888 - will use that instead of XRGB565.\n"); + } #endif sms_ntsc = calloc(1, sizeof(sms_ntsc_t)); @@ -3666,7 +3731,7 @@ bool retro_load_game(const struct retro_game_info *info) } } - audio_init(SOUND_FREQUENCY, 0); + audio_init(sampling_rate, 0); system_init(); system_reset(); is_running = false; @@ -4006,9 +4071,9 @@ void retro_run(void) retro_led_interface(); if (!do_skip) - video_cb(bitmap.data + bmdoffset, vwidth - vwoffset, vheight, 720 * 2); + video_cb(bitmap.data + bmdoffset, vwidth - vwoffset, vheight, 720 * sizeof(RETRO_PITCH)); else - video_cb(NULL, vwidth - vwoffset, vheight, 720 * 2); + video_cb(NULL, vwidth - vwoffset, vheight, 720 * sizeof(RETRO_PITCH)); audio_cb(soundbuffer, soundbuffer_size); } diff --git a/libretro/libretro_core_options.h b/libretro/libretro_core_options.h index 284e4ce6c..ff9763afc 100644 --- a/libretro/libretro_core_options.h +++ b/libretro/libretro_core_options.h @@ -389,6 +389,20 @@ struct retro_core_option_v2_definition option_defs_us[] = { }, "33" }, + { + "genesis_plus_gx_video_ramp", + "Video Ramp", + NULL, + "Lookup-table gamma ramp.", + NULL, + "video", + { + { "Linear", NULL }, + { "Hardware", NULL }, + { "Sgb", "Sgb (TV)" }, + }, + "Linear" + }, { "genesis_plus_gx_ym2413", "Master System FM (YM2413)", @@ -474,6 +488,347 @@ struct retro_core_option_v2_definition option_defs_us[] = { }, "disabled" }, +#ifdef HAVE_EQ + { + "genesis_plus_gx_audio_eq_low", + "EQ Low", + NULL, + "Adjust the low range band of the internal audio equalizer.", + NULL, + "audio", + { + { "0", "0%" }, + { "1", "1%" }, + { "2", "2%" }, + { "3", "3%" }, + { "4", "4%" }, + { "5", "5%" }, + { "6", "6%" }, + { "7", "7%" }, + { "8", "8%" }, + { "9", "9%" }, + { "10", "10%" }, + { "11", "11%" }, + { "12", "12%" }, + { "13", "13%" }, + { "14", "14%" }, + { "15", "15%" }, + { "16", "16%" }, + { "17", "17%" }, + { "18", "18%" }, + { "19", "19%" }, + { "20", "20%" }, + { "21", "21%" }, + { "22", "22%" }, + { "23", "23%" }, + { "24", "24%" }, + { "25", "25%" }, + { "26", "26%" }, + { "27", "27%" }, + { "28", "28%" }, + { "29", "29%" }, + { "30", "30%" }, + { "31", "31%" }, + { "32", "32%" }, + { "33", "33%" }, + { "34", "34%" }, + { "35", "35%" }, + { "36", "36%" }, + { "37", "37%" }, + { "38", "38%" }, + { "39", "39%" }, + { "40", "40%" }, + { "41", "41%" }, + { "42", "42%" }, + { "43", "43%" }, + { "44", "44%" }, + { "45", "45%" }, + { "46", "46%" }, + { "47", "47%" }, + { "48", "48%" }, + { "49", "49%" }, + { "50", "50%" }, + { "51", "51%" }, + { "52", "52%" }, + { "53", "53%" }, + { "54", "54%" }, + { "55", "55%" }, + { "56", "56%" }, + { "57", "57%" }, + { "58", "58%" }, + { "59", "59%" }, + { "60", "60%" }, + { "61", "61%" }, + { "62", "62%" }, + { "63", "63%" }, + { "64", "64%" }, + { "65", "65%" }, + { "66", "66%" }, + { "67", "67%" }, + { "68", "68%" }, + { "69", "69%" }, + { "70", "70%" }, + { "71", "71%" }, + { "72", "72%" }, + { "73", "73%" }, + { "74", "74%" }, + { "75", "75%" }, + { "76", "76%" }, + { "77", "77%" }, + { "78", "78%" }, + { "79", "79%" }, + { "80", "80%" }, + { "81", "81%" }, + { "82", "82%" }, + { "83", "83%" }, + { "84", "84%" }, + { "85", "85%" }, + { "86", "86%" }, + { "87", "87%" }, + { "88", "88%" }, + { "89", "89%" }, + { "90", "90%" }, + { "91", "91%" }, + { "92", "92%" }, + { "93", "93%" }, + { "94", "94%" }, + { "95", "95%" }, + { "96", "96%" }, + { "97", "97%" }, + { "98", "98%" }, + { "99", "99%" }, + { "100", "100%" }, + { NULL, NULL }, + }, + "100" + }, + { + "genesis_plus_gx_audio_eq_mid", + "EQ Mid", + NULL, + "Adjust the middle range band of the internal audio equalizer.", + NULL, + "audio", + { + { "0", "0%" }, + { "1", "1%" }, + { "2", "2%" }, + { "3", "3%" }, + { "4", "4%" }, + { "5", "5%" }, + { "6", "6%" }, + { "7", "7%" }, + { "8", "8%" }, + { "9", "9%" }, + { "10", "10%" }, + { "11", "11%" }, + { "12", "12%" }, + { "13", "13%" }, + { "14", "14%" }, + { "15", "15%" }, + { "16", "16%" }, + { "17", "17%" }, + { "18", "18%" }, + { "19", "19%" }, + { "20", "20%" }, + { "21", "21%" }, + { "22", "22%" }, + { "23", "23%" }, + { "24", "24%" }, + { "25", "25%" }, + { "26", "26%" }, + { "27", "27%" }, + { "28", "28%" }, + { "29", "29%" }, + { "30", "30%" }, + { "31", "31%" }, + { "32", "32%" }, + { "33", "33%" }, + { "34", "34%" }, + { "35", "35%" }, + { "36", "36%" }, + { "37", "37%" }, + { "38", "38%" }, + { "39", "39%" }, + { "40", "40%" }, + { "41", "41%" }, + { "42", "42%" }, + { "43", "43%" }, + { "44", "44%" }, + { "45", "45%" }, + { "46", "46%" }, + { "47", "47%" }, + { "48", "48%" }, + { "49", "49%" }, + { "50", "50%" }, + { "51", "51%" }, + { "52", "52%" }, + { "53", "53%" }, + { "54", "54%" }, + { "55", "55%" }, + { "56", "56%" }, + { "57", "57%" }, + { "58", "58%" }, + { "59", "59%" }, + { "60", "60%" }, + { "61", "61%" }, + { "62", "62%" }, + { "63", "63%" }, + { "64", "64%" }, + { "65", "65%" }, + { "66", "66%" }, + { "67", "67%" }, + { "68", "68%" }, + { "69", "69%" }, + { "70", "70%" }, + { "71", "71%" }, + { "72", "72%" }, + { "73", "73%" }, + { "74", "74%" }, + { "75", "75%" }, + { "76", "76%" }, + { "77", "77%" }, + { "78", "78%" }, + { "79", "79%" }, + { "80", "80%" }, + { "81", "81%" }, + { "82", "82%" }, + { "83", "83%" }, + { "84", "84%" }, + { "85", "85%" }, + { "86", "86%" }, + { "87", "87%" }, + { "88", "88%" }, + { "89", "89%" }, + { "90", "90%" }, + { "91", "91%" }, + { "92", "92%" }, + { "93", "93%" }, + { "94", "94%" }, + { "95", "95%" }, + { "96", "96%" }, + { "97", "97%" }, + { "98", "98%" }, + { "99", "99%" }, + { "100", "100%" }, + { NULL, NULL }, + }, + "100" + }, + { + "genesis_plus_gx_audio_eq_high", + "EQ High", + NULL, + "Adjust the high range band of the internal audio equalizer.", + NULL, + "audio", + { + { "0", "0%" }, + { "1", "1%" }, + { "2", "2%" }, + { "3", "3%" }, + { "4", "4%" }, + { "5", "5%" }, + { "6", "6%" }, + { "7", "7%" }, + { "8", "8%" }, + { "9", "9%" }, + { "10", "10%" }, + { "11", "11%" }, + { "12", "12%" }, + { "13", "13%" }, + { "14", "14%" }, + { "15", "15%" }, + { "16", "16%" }, + { "17", "17%" }, + { "18", "18%" }, + { "19", "19%" }, + { "20", "20%" }, + { "21", "21%" }, + { "22", "22%" }, + { "23", "23%" }, + { "24", "24%" }, + { "25", "25%" }, + { "26", "26%" }, + { "27", "27%" }, + { "28", "28%" }, + { "29", "29%" }, + { "30", "30%" }, + { "31", "31%" }, + { "32", "32%" }, + { "33", "33%" }, + { "34", "34%" }, + { "35", "35%" }, + { "36", "36%" }, + { "37", "37%" }, + { "38", "38%" }, + { "39", "39%" }, + { "40", "40%" }, + { "41", "41%" }, + { "42", "42%" }, + { "43", "43%" }, + { "44", "44%" }, + { "45", "45%" }, + { "46", "46%" }, + { "47", "47%" }, + { "48", "48%" }, + { "49", "49%" }, + { "50", "50%" }, + { "51", "51%" }, + { "52", "52%" }, + { "53", "53%" }, + { "54", "54%" }, + { "55", "55%" }, + { "56", "56%" }, + { "57", "57%" }, + { "58", "58%" }, + { "59", "59%" }, + { "60", "60%" }, + { "61", "61%" }, + { "62", "62%" }, + { "63", "63%" }, + { "64", "64%" }, + { "65", "65%" }, + { "66", "66%" }, + { "67", "67%" }, + { "68", "68%" }, + { "69", "69%" }, + { "70", "70%" }, + { "71", "71%" }, + { "72", "72%" }, + { "73", "73%" }, + { "74", "74%" }, + { "75", "75%" }, + { "76", "76%" }, + { "77", "77%" }, + { "78", "78%" }, + { "79", "79%" }, + { "80", "80%" }, + { "81", "81%" }, + { "82", "82%" }, + { "83", "83%" }, + { "84", "84%" }, + { "85", "85%" }, + { "86", "86%" }, + { "87", "87%" }, + { "88", "88%" }, + { "89", "89%" }, + { "90", "90%" }, + { "91", "91%" }, + { "92", "92%" }, + { "93", "93%" }, + { "94", "94%" }, + { "95", "95%" }, + { "96", "96%" }, + { "97", "97%" }, + { "98", "98%" }, + { "99", "99%" }, + { "100", "100%" }, + { NULL, NULL }, + }, + "100" + }, +#endif { "genesis_plus_gx_lowpass_range", "Low-Pass Filter %", @@ -482,302 +837,713 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "audio", { - { "5", NULL }, - { "10", NULL }, - { "15", NULL }, - { "20", NULL }, - { "25", NULL }, - { "30", NULL }, - { "35", NULL }, - { "40", NULL }, - { "45", NULL }, - { "50", NULL }, - { "55", NULL }, - { "60", NULL }, - { "65", NULL }, - { "70", NULL }, - { "75", NULL }, - { "80", NULL }, - { "85", NULL }, - { "90", NULL }, - { "95", NULL }, + { "0", "0%" }, + { "1", "1%" }, + { "2", "2%" }, + { "3", "3%" }, + { "4", "4%" }, + { "5", "5%" }, + { "6", "6%" }, + { "7", "7%" }, + { "8", "8%" }, + { "9", "9%" }, + { "10", "10%" }, + { "11", "11%" }, + { "12", "12%" }, + { "13", "13%" }, + { "14", "14%" }, + { "15", "15%" }, + { "16", "16%" }, + { "17", "17%" }, + { "18", "18%" }, + { "19", "19%" }, + { "20", "20%" }, + { "21", "21%" }, + { "22", "22%" }, + { "23", "23%" }, + { "24", "24%" }, + { "25", "25%" }, + { "26", "26%" }, + { "27", "27%" }, + { "28", "28%" }, + { "29", "29%" }, + { "30", "30%" }, + { "31", "31%" }, + { "32", "32%" }, + { "33", "33%" }, + { "34", "34%" }, + { "35", "35%" }, + { "36", "36%" }, + { "37", "37%" }, + { "38", "38%" }, + { "39", "39%" }, + { "40", "40%" }, + { "41", "41%" }, + { "42", "42%" }, + { "43", "43%" }, + { "44", "44%" }, + { "45", "45%" }, + { "46", "46%" }, + { "47", "47%" }, + { "48", "48%" }, + { "49", "49%" }, + { "50", "50%" }, + { "51", "51%" }, + { "52", "52%" }, + { "53", "53%" }, + { "54", "54%" }, + { "55", "55%" }, + { "56", "56%" }, + { "57", "57%" }, + { "58", "58%" }, + { "59", "59%" }, + { "60", "60%" }, + { "61", "61%" }, + { "62", "62%" }, + { "63", "63%" }, + { "64", "64%" }, + { "65", "65%" }, + { "66", "66%" }, + { "67", "67%" }, + { "68", "68%" }, + { "69", "69%" }, + { "70", "70%" }, + { "71", "71%" }, + { "72", "72%" }, + { "73", "73%" }, + { "74", "74%" }, + { "75", "75%" }, + { "76", "76%" }, + { "77", "77%" }, + { "78", "78%" }, + { "79", "79%" }, + { "80", "80%" }, + { "81", "81%" }, + { "82", "82%" }, + { "83", "83%" }, + { "84", "84%" }, + { "85", "85%" }, + { "86", "86%" }, + { "87", "87%" }, + { "88", "88%" }, + { "89", "89%" }, + { "90", "90%" }, + { "91", "91%" }, + { "92", "92%" }, + { "93", "93%" }, + { "94", "94%" }, + { "95", "95%" }, + { "96", "96%" }, + { "97", "97%" }, + { "98", "98%" }, + { "99", "99%" }, + { "100", "100%" }, { NULL, NULL }, }, "60" }, { - "genesis_plus_gx_psg_preamp", - "PSG Preamp Level", + "genesis_plus_gx_audio_sampling_rate", + "Sampling Rate (Reboot core)", NULL, - "Set the audio preamplifier level of the emulated SN76496 4-channel Programmable Sound Generator found in the SG-1000, Sega Mark III, Master System, Game Gear and Mega Drive/Genesis.", + "Internal sampling rate. Higher gives less audio lag, better downsampling.", NULL, "audio", { - { "0", NULL }, - { "5", NULL }, - { "10", NULL }, - { "15", NULL }, - { "20", NULL }, - { "25", NULL }, - { "30", NULL }, - { "35", NULL }, - { "40", NULL }, - { "45", NULL }, - { "50", NULL }, - { "55", NULL }, - { "60", NULL }, - { "65", NULL }, - { "70", NULL }, - { "75", NULL }, - { "80", NULL }, - { "85", NULL }, - { "90", NULL }, - { "95", NULL }, - { "100", NULL }, - { "105", NULL }, - { "110", NULL }, - { "115", NULL }, - { "120", NULL }, - { "125", NULL }, - { "130", NULL }, - { "135", NULL }, - { "140", NULL }, - { "145", NULL }, - { "150", NULL }, - { "155", NULL }, - { "160", NULL }, - { "165", NULL }, - { "170", NULL }, - { "175", NULL }, - { "180", NULL }, - { "185", NULL }, - { "190", NULL }, - { "195", NULL }, - { "200", NULL }, + { "22050", NULL }, + { "44100", NULL }, + { "48000", NULL }, + { "96000", NULL }, + { "192000", NULL }, + { "384000", NULL }, + { "768000", NULL }, { NULL, NULL }, }, - "150" + "48000" }, { - "genesis_plus_gx_fm_preamp", - "FM Preamp Level", + "genesis_plus_gx_audio_lowpass_cutoff", + "Lowpass Cutoff Rate", NULL, - "Set the audio preamplifier level of the emulated Mega Drive/Genesis FM sound synthesizer or Sega Mark III/Master System FM Sound Unit.", + "Remove high frequency, aliasing sounds beyond nyquist.", NULL, "audio", { - { "0", NULL }, - { "5", NULL }, - { "10", NULL }, - { "15", NULL }, - { "20", NULL }, - { "25", NULL }, - { "30", NULL }, - { "35", NULL }, - { "40", NULL }, - { "45", NULL }, - { "50", NULL }, - { "55", NULL }, - { "60", NULL }, - { "65", NULL }, - { "70", NULL }, - { "75", NULL }, - { "80", NULL }, - { "85", NULL }, - { "90", NULL }, - { "95", NULL }, - { "100", NULL }, - { "105", NULL }, - { "110", NULL }, - { "115", NULL }, - { "120", NULL }, - { "125", NULL }, - { "130", NULL }, - { "135", NULL }, - { "140", NULL }, - { "145", NULL }, - { "150", NULL }, - { "155", NULL }, - { "160", NULL }, - { "165", NULL }, - { "170", NULL }, - { "175", NULL }, - { "180", NULL }, - { "185", NULL }, - { "190", NULL }, - { "195", NULL }, - { "200", NULL }, + { "0", "Disabled" }, + { "24000" }, + { "48000" }, + { "96000" }, + { "192000" }, + { "384000" }, { NULL, NULL }, }, - "100" + "24000" }, { - "genesis_plus_gx_cdda_volume", - "CD-DA Volume", + "genesis_plus_gx_psg_preamp", + "PSG Preamp Level", NULL, - "Adjust the mixing volume of the emulated CD audio playback output.", + "Set the audio preamplifier level of the emulated SN76496 4-channel Programmable Sound Generator found in the SG-1000, Sega Mark III, Master System, Game Gear and Mega Drive/Genesis.", NULL, "audio", { - { "0", NULL }, - { "5", NULL }, - { "10", NULL }, - { "15", NULL }, - { "20", NULL }, - { "25", NULL }, - { "30", NULL }, - { "35", NULL }, - { "40", NULL }, - { "45", NULL }, - { "50", NULL }, - { "55", NULL }, - { "60", NULL }, - { "65", NULL }, - { "70", NULL }, - { "75", NULL }, - { "80", NULL }, - { "85", NULL }, - { "90", NULL }, - { "95", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, - "100" + "150" }, { - "genesis_plus_gx_pcm_volume", - "PCM Volume", + "genesis_plus_gx_fm_preamp", + "FM Preamp Level", NULL, - "Adjust the mixing volume of the emulated Sega CD/Mega-CD RF5C164 PCM sound generator output.", + "Set the audio preamplifier level of the emulated Mega Drive/Genesis FM sound synthesizer or Sega Mark III/Master System FM Sound Unit.", NULL, "audio", { - { "0", NULL }, - { "5", NULL }, - { "10", NULL }, - { "15", NULL }, - { "20", NULL }, - { "25", NULL }, - { "30", NULL }, - { "35", NULL }, - { "40", NULL }, - { "45", NULL }, - { "50", NULL }, - { "55", NULL }, - { "60", NULL }, - { "65", NULL }, - { "70", NULL }, - { "75", NULL }, - { "80", NULL }, - { "85", NULL }, - { "90", NULL }, - { "95", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" }, -#ifdef HAVE_EQ { - "genesis_plus_gx_audio_eq_low", - "EQ Low", + "genesis_plus_gx_cdda_volume", + "CD-DA Volume", NULL, - "Adjust the low range band of the internal audio equalizer.", + "Adjust the mixing volume of the emulated CD audio playback output.", NULL, "audio", { - { "0", NULL }, - { "5", NULL }, - { "10", NULL }, - { "15", NULL }, - { "20", NULL }, - { "25", NULL }, - { "30", NULL }, - { "35", NULL }, - { "40", NULL }, - { "45", NULL }, - { "50", NULL }, - { "55", NULL }, - { "60", NULL }, - { "65", NULL }, - { "70", NULL }, - { "75", NULL }, - { "80", NULL }, - { "85", NULL }, - { "90", NULL }, - { "95", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" }, { - "genesis_plus_gx_audio_eq_mid", - "EQ Mid", + "genesis_plus_gx_pcm_volume", + "PCM Volume", NULL, - "Adjust the middle range band of the internal audio equalizer.", + "Adjust the mixing volume of the emulated Sega CD/Mega-CD RF5C164 PCM sound generator output.", NULL, "audio", { - { "0", NULL }, - { "5", NULL }, - { "10", NULL }, - { "15", NULL }, - { "20", NULL }, - { "25", NULL }, - { "30", NULL }, - { "35", NULL }, - { "40", NULL }, - { "45", NULL }, - { "50", NULL }, - { "55", NULL }, - { "60", NULL }, - { "65", NULL }, - { "70", NULL }, - { "75", NULL }, - { "80", NULL }, - { "85", NULL }, - { "90", NULL }, - { "95", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" }, { - "genesis_plus_gx_audio_eq_high", - "EQ High", + "genesis_plus_gx_audio_master_volume", + "Master Volume", NULL, - "Adjust the high range band of the internal audio equalizer.", + "Adjust the output volume level.", NULL, "audio", { - { "0", NULL }, - { "5", NULL }, - { "10", NULL }, - { "15", NULL }, - { "20", NULL }, - { "25", NULL }, - { "30", NULL }, - { "35", NULL }, - { "40", NULL }, - { "45", NULL }, - { "50", NULL }, - { "55", NULL }, - { "60", NULL }, - { "65", NULL }, - { "70", NULL }, - { "75", NULL }, - { "80", NULL }, - { "85", NULL }, - { "90", NULL }, - { "95", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" }, -#endif { "genesis_plus_gx_gun_input", "Light Gun Input", @@ -985,17 +1751,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1008,17 +1864,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1031,17 +1977,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1054,17 +2090,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1077,17 +2203,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1100,17 +2316,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1123,17 +2429,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1146,17 +2542,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1169,17 +2655,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1192,17 +2768,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1215,17 +2881,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1238,17 +2994,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1261,17 +3107,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1284,17 +3220,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1307,17 +3333,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1330,17 +3446,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1353,17 +3559,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1376,17 +3672,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" @@ -1399,17 +3785,107 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "channel_volume", { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, + { "0", "0%" }, + { "2", "2%" }, + { "4", "4%" }, + { "6", "6%" }, + { "8", "8%" }, + { "10", "10%" }, + { "12", "12%" }, + { "14", "14%" }, + { "16", "16%" }, + { "18", "18%" }, + { "20", "20%" }, + { "22", "22%" }, + { "24", "24%" }, + { "26", "26%" }, + { "28", "28%" }, + { "30", "30%" }, + { "32", "32%" }, + { "34", "34%" }, + { "36", "36%" }, + { "38", "38%" }, + { "40", "40%" }, + { "42", "42%" }, + { "44", "44%" }, + { "46", "46%" }, + { "48", "48%" }, + { "50", "50%" }, + { "52", "52%" }, + { "54", "54%" }, + { "56", "56%" }, + { "58", "58%" }, + { "60", "60%" }, + { "62", "62%" }, + { "64", "64%" }, + { "66", "66%" }, + { "68", "68%" }, + { "70", "70%" }, + { "72", "72%" }, + { "74", "74%" }, + { "76", "76%" }, + { "78", "78%" }, + { "80", "80%" }, + { "82", "82%" }, + { "84", "84%" }, + { "86", "86%" }, + { "88", "88%" }, + { "90", "90%" }, + { "92", "92%" }, + { "94", "94%" }, + { "96", "96%" }, + { "98", "98%" }, + { "100", "100%" }, + { "102", "102%" }, + { "104", "104%" }, + { "106", "106%" }, + { "108", "108%" }, + { "110", "110%" }, + { "112", "112%" }, + { "114", "114%" }, + { "116", "116%" }, + { "118", "118%" }, + { "120", "120%" }, + { "122", "122%" }, + { "124", "124%" }, + { "126", "126%" }, + { "128", "128%" }, + { "130", "130%" }, + { "132", "132%" }, + { "134", "134%" }, + { "136", "136%" }, + { "138", "138%" }, + { "140", "140%" }, + { "142", "142%" }, + { "144", "144%" }, + { "146", "146%" }, + { "148", "148%" }, + { "150", "150%" }, + { "152", "152%" }, + { "154", "154%" }, + { "156", "156%" }, + { "158", "158%" }, + { "160", "160%" }, + { "162", "162%" }, + { "164", "164%" }, + { "166", "166%" }, + { "168", "168%" }, + { "170", "170%" }, + { "172", "172%" }, + { "174", "174%" }, + { "176", "176%" }, + { "178", "178%" }, + { "180", "180%" }, + { "182", "182%" }, + { "184", "184%" }, + { "186", "186%" }, + { "188", "188%" }, + { "190", "190%" }, + { "192", "192%" }, + { "194", "194%" }, + { "196", "196%" }, + { "198", "198%" }, + { "200", "200%" }, { NULL, NULL }, }, "100" diff --git a/libretro/libretro_core_options_intl.h b/libretro/libretro_core_options_intl.h index 34473c9e6..0481abddf 100644 --- a/libretro/libretro_core_options_intl.h +++ b/libretro/libretro_core_options_intl.h @@ -1779,7 +1779,7 @@ struct retro_core_options_v2 options_ar = { #define OPTION_VAL_475_AST NULL #define OPTION_VAL_500_AST NULL #define GENESIS_PLUS_GX_FORCE_DTACK_LABEL_AST "Bloqueos del sistema" -#define GENESIS_PLUS_GX_FORCE_DTACK_INFO_0_AST "Emula los bloqueos del sistema que se producen nel hardware real cuando s'accede a direiciones illegales. Esta opción namás habría desactivase cuando se xueguen ciertes demos ya programes homebrew que s'enconten nel comportamientu illegal pa funcionar correutamente." +#define GENESIS_PLUS_GX_FORCE_DTACK_INFO_0_AST "Emula los bloqueos del sistema que se producen nel hardware real cuando s'accede a direiciones illegales. Esta opción namás habría desactivase cuando se xueguen ciertes demos y programes homebrew que s'enconten nel comportamientu illegal pa funcionar correutamente." #define GENESIS_PLUS_GX_ADDR_ERROR_LABEL_AST NULL #define GENESIS_PLUS_GX_ADDR_ERROR_INFO_0_AST NULL #define GENESIS_PLUS_GX_CD_LATENCY_LABEL_AST NULL @@ -22140,11 +22140,11 @@ struct retro_core_options_v2 options_eo = { #define GENESIS_PLUS_GX_SYSTEM_BRAM_INFO_0_ES "Al ejecutar contenidos para Mega-CD/Sega CD, especifica si se debe compartir un archivo de guardado entre todos los juegos de la misma región («Una por BIOS») o si se debe crear un archivo de guardado individual para cada juego («Una por cada juego»). Nota: la Mega-CD/Sega CD tiene un almacenamiento interno limitado, suficiente para unos pocos títulos. Se recomienda seleccionar «Una por cada juego» para que no te quedes sin espacio libre." #define OPTION_VAL_PER_BIOS_ES "Uno por BIOS" #define OPTION_VAL_PER_GAME_ES "Uno por cada juego" -#define GENESIS_PLUS_GX_CART_BRAM_LABEL_ES "Cartucho de BRAM de CD (es necesario reiniciar)" +#define GENESIS_PLUS_GX_CART_BRAM_LABEL_ES "BRAM de memoria de CD (es necesario reiniciar)" #define GENESIS_PLUS_GX_CART_BRAM_INFO_0_ES "Al ejecutar contenidos para Mega-CD/Sega CD, especifica si se debe compartir un cartucho de RAM para guardados entre todos los juegos de la misma región («Una por cartucho») o si se debe crear un archivo de guardado individual para cada juego («Una por cada juego»)." #define OPTION_VAL_PER_CART_ES "Una por cartucho" -#define GENESIS_PLUS_GX_CART_SIZE_LABEL_ES "Tamaño del cartucho de BRAM de CD (es necesario reiniciar)" -#define GENESIS_PLUS_GX_CART_SIZE_INFO_0_ES "Establece el tamaño del cartucho de RAM para los contenidos de Sega CD/Mega-CD. Este ajuste es ideal si se utiliza un archivo de cartucho de RAM por cada juego para así no tener varios cartuchos de gran tamaño." +#define GENESIS_PLUS_GX_CART_SIZE_LABEL_ES "Tamaño de la BRAM de memoria de CD (es necesario reiniciar)" +#define GENESIS_PLUS_GX_CART_SIZE_INFO_0_ES "Establece el tamaño del cartucho de memoria BRAM para los contenidos de Sega CD/Mega-CD. Este ajuste es ideal al configurar las BRAM de memoria para que haya una por cada juego y evitar tener varios cartuchos con un tamaño grande." #define OPTION_VAL_128K_ES "128 Kbit" #define OPTION_VAL_256K_ES "256 Kbit" #define OPTION_VAL_512K_ES "512 Kbit" @@ -22244,7 +22244,7 @@ struct retro_core_options_v2 options_eo = { #define GENESIS_PLUS_GX_NO_SPRITE_LIMIT_LABEL_ES "Eliminar límite de sprites por línea" #define GENESIS_PLUS_GX_NO_SPRITE_LIMIT_INFO_0_ES "Elimina el límite de sprites por líneas de barrido que tenía el hardware original. Reduce los parpadeos, pero puede provocar fallos gráficos, ya que algunos juegos aprovechan esta limitación para generar efectos especiales." #define GENESIS_PLUS_GX_ENHANCED_VSCROLL_LABEL_ES "Mejorar desplazamiento vertical de «tiles»" -#define GENESIS_PLUS_GX_ENHANCED_VSCROLL_INFO_0_ES "Permite que cada celda individual pueda desplazarse en vertical de forma fluida en vez de hacerlo por parejas de 16 píxeles, haciendo un promedio del valor «vscroll» de las celdas colindantes. Este arreglo solo afecta a unos pocos juegos que utilizan el modo de desplazamiento vertical por parejas de dos celdas." +#define GENESIS_PLUS_GX_ENHANCED_VSCROLL_INFO_0_ES "Permite que cada celda individual pueda desplazarse verticalmente, en vez de hacerlo por parejas de 16 píxeles, haciendo un promedio del valor «vscroll» de las celdas colindantes. Este arreglo solo se aplica a unos pocos juegos que utilizan el modo de desplazamiento vertical por parejas de dos celdas." #define GENESIS_PLUS_GX_ENHANCED_VSCROLL_LIMIT_LABEL_ES "Límite de la mejora del desplazamiento vertical de «tiles»" #define GENESIS_PLUS_GX_ENHANCED_VSCROLL_LIMIT_INFO_0_ES "Esta opción solo se aplicará si la mejora del desplazamiento vertical de «tiles» está activada. Ajusta el límite de esta mejora. Cuando la diferencia del valor «vscroll» entre celdas colindantes sea superior a este límite, se desactivará la mejora." #define GENESIS_PLUS_GX_OVERCLOCK_LABEL_ES "Velocidad de la CPU" @@ -22271,9 +22271,9 @@ struct retro_core_options_v2 options_eo = { #define GENESIS_PLUS_GX_ADDR_ERROR_LABEL_ES "Error de dirección del 68K" #define GENESIS_PLUS_GX_ADDR_ERROR_INFO_0_ES "La CPU principal de la Mega Drive/Genesis (el Motorola 68000) genera una excepción (cuelgue) de error de memoria al intentar acceder a una memoria no alineada. Activa esta opción para simular este comportamiento. Solo debe desactivarse para jugar a modificaciones de juegos, ya que estas suelen desarrollarse con emuladores menos precisos y pueden depender de accesos a RAM no válidos para funcionar correctamente." #define GENESIS_PLUS_GX_CD_LATENCY_LABEL_ES "Tiempo de acceso al CD" -#define GENESIS_PLUS_GX_CD_LATENCY_INFO_0_ES "Simula la latencia del lector original de CD al empezar a leer o buscar una ubicación concreta del disco que esté cargado. Esto es necesario para algunos juegos en formato CD que se colgarán si los datos aparecen demasiado pronto, también corrige problemas de desincronización del audio de CD en algunos juegos. Desactivar esta opción podría venir bien para juegos MSU-MD, ya que hará que los bucles en las pistas de audio de CD queden más disimulados." +#define GENESIS_PLUS_GX_CD_LATENCY_INFO_0_ES "Simula la latencia del lector original de CD al iniciar una lectura o búsqueda a una ubicación concreta del disco que esté cargada. Necesario para algunos juegos en formato CD que se colgarán si los datos aparecen demasiado pronto y también corrige problemas de desincronización del audio de CD en algunos juegos. Desactivar esta opción podría venir bien para juegos MSU-MD, ya que hará que los bucles de las pistas de audio de CD parezcan más uniformes." #define GENESIS_PLUS_GX_CD_PRECACHE_LABEL_ES "Cachear imagen del CD" -#define GENESIS_PLUS_GX_CD_PRECACHE_INFO_0_ES "Carga la imagen del CD a la memoria al iniciar la emulación. Solo se admiten imágenes CHD. Es necesario reiniciar." +#define GENESIS_PLUS_GX_CD_PRECACHE_INFO_0_ES "Carga la imagen del CD a la memoria al iniciar la emulación. Solo se admiten imágenes CDH. Es necesario reiniciar." #define GENESIS_PLUS_GX_SHOW_ADVANCED_AUDIO_SETTINGS_LABEL_ES "Mostrar Ajustes avanzados de volumen de audio (es necesario reabrir el menú)" #define GENESIS_PLUS_GX_SHOW_ADVANCED_AUDIO_SETTINGS_INFO_0_ES "Permite configurar los parámetros de los canales de audio a un bajo nivel. NOTA: es necesario salir y volver a entrar del menú rápido para que el cambio surta efecto." #define GENESIS_PLUS_GX_PSG_CHANNEL_0_VOLUME_LABEL_ES "Volumen del canal tonal 0 del PSG (%)" @@ -28404,1582 +28404,6 @@ struct retro_core_options_v2 options_fr = { option_defs_fr }; -/* RETRO_LANGUAGE_GA */ - -#define CATEGORY_SYSTEM_LABEL_GA "Córas" -#define CATEGORY_SYSTEM_INFO_0_GA "Athraigh an rogha crua-earraí bunúsach, an réigiún, an BIOS agus socruithe comhaid sábhála Sega CD/Mega-CD." -#define CATEGORY_VIDEO_LABEL_GA "Físeán" -#define CATEGORY_VIDEO_INFO_0_GA "Athraigh cóimheas gné, bearradh taispeána, scagaire físe agus socruithe scipeála frámaí." -#define CATEGORY_AUDIO_LABEL_GA "Fuaim" -#define CATEGORY_AUDIO_INFO_0_GA "Athraigh socruithe gléis fuaime." -#define CATEGORY_INPUT_LABEL_GA "Ionchur" -#define CATEGORY_INPUT_INFO_0_GA "Athraigh socruithe ionchuir an ghunna solais agus/nó an luiche." -#define CATEGORY_HACKS_LABEL_GA "Cleasanna Aithrise" -#define CATEGORY_HACKS_INFO_0_GA "Athraigh socruithe róchlogála agus cruinneas aithrise próiseálaí a mbíonn tionchar acu ar fheidhmíocht agus comhoiriúnacht íseal-leibhéil." -#define CATEGORY_CHANNEL_VOLUME_LABEL_GA "Socruithe Ardleibhéil Imleabhair Cainéal" -#define CATEGORY_CHANNEL_VOLUME_INFO_0_GA "Athraigh toirt na gcainéal fuaime crua-earraí aonair." -#define GENESIS_PLUS_GX_SYSTEM_HW_LABEL_GA "Crua-earraí an Chórais" -#define GENESIS_PLUS_GX_SYSTEM_HW_INFO_0_GA "Rith ábhar luchtaithe le consól aithriste ar leith. Roghnóidh 'Auto' an córas is oiriúnaí don chluiche reatha." -#define OPTION_VAL_AUTO_GA "Uathoibríoch" -#define OPTION_VAL_SG_1000_GA NULL -#define OPTION_VAL_SG_1000_II_GA NULL -#define OPTION_VAL_SG_1000_II_RAM_EXT_GA NULL -#define OPTION_VAL_MARK_III_GA NULL -#define OPTION_VAL_MASTER_SYSTEM_GA NULL -#define OPTION_VAL_MASTER_SYSTEM_II_GA NULL -#define OPTION_VAL_GAME_GEAR_GA NULL -#define OPTION_VAL_MEGA_DRIVE_GENESIS_GA NULL -#define GENESIS_PLUS_GX_REGION_DETECT_LABEL_GA "Réigiún an Chórais" -#define GENESIS_PLUS_GX_REGION_DETECT_INFO_0_GA "Sonraigh cén réigiún as a bhfuil an córas. I gcás consóil seachas an Game Gear, is é 50 Hz an 'PAL', agus is é 60 Hz an 'NTSC'. Féadfaidh cluichí rith níos tapúla nó níos moille ná mar is gnách má roghnaítear an réigiún mícheart." -#define OPTION_VAL_NTSC_U_GA NULL -#define OPTION_VAL_PAL_GA NULL -#define OPTION_VAL_NTSC_J_GA NULL -#define GENESIS_PLUS_GX_VDP_MODE_LABEL_GA "Mód VDP Fórsála" -#define GENESIS_PLUS_GX_VDP_MODE_INFO_0_GA "Sáraíonn sé an modh VDP chun é a chur ag rith ag NTSC 60Hz nó PAL 50Hz, beag beann ar réigiún an chórais." -#define OPTION_VAL_60HZ_GA NULL -#define OPTION_VAL_50HZ_GA NULL -#define GENESIS_PLUS_GX_BIOS_LABEL_GA "ROM Tosaithe Córais" -#define GENESIS_PLUS_GX_BIOS_INFO_0_GA "Bain úsáid as an BIOS/tosaitheoir oifigiúil le haghaidh crua-earraí aithriste, má tá sé i láthair in eolaire córais RetroArch. Taispeánann sé seicheamh/beochan tosaithe atá sainiúil don chonsól, agus ansin ritheann sé ábhar luchtaithe." -#define GENESIS_PLUS_GX_SYSTEM_BRAM_LABEL_GA "Córas CD BRAM (Atosú Éilitheach)" -#define GENESIS_PLUS_GX_SYSTEM_BRAM_INFO_0_GA "Agus ábhar Sega CD/Mega-CD á rith, sonraítear an ndéanfar comhad sábhála aonair a roinnt idir na cluichí go léir ó réigiún ar leith (In aghaidh an BIOS) nó comhad sábhála ar leith a chruthú do gach cluiche (In aghaidh an Chluiche). Tabhair faoi deara go bhfuil stóráil inmheánach theoranta ag an Sega CD/Mega-CD, nach leor ach do roinnt teidil. Chun nach rithfidh tú as spás, moltar an socrú 'In aghaidh an Chluiche'." -#define OPTION_VAL_PER_BIOS_GA "In aghaidh an BIOS" -#define OPTION_VAL_PER_GAME_GA "In aghaidh an Chluiche" -#define GENESIS_PLUS_GX_CART_BRAM_LABEL_GA "Cairt Cúltaca CD BRAM (Atosú Éilitheach)" -#define GENESIS_PLUS_GX_CART_BRAM_INFO_0_GA "Agus ábhar Sega CD/Mega-CD á rith, sonraítear ann an ndéanfar cairt RAM cúltaca aonair a roinnt do gach cluiche (In aghaidh an Chairt) nó cairt RAM cúltaca ar leith a chruthú do gach cluiche (In aghaidh an Chluiche)." -#define OPTION_VAL_PER_CART_GA "In aghaidh an cartúis" -#define GENESIS_PLUS_GX_CART_SIZE_LABEL_GA "Méid BRAM Cairt Cúltaca CD (Atosú Éilitheach)" -#define GENESIS_PLUS_GX_CART_SIZE_INFO_0_GA "Socraíonn sé seo méid an chairt reithe cúltaca agus ábhar Sega CD/Mega-CD á rith. Úsáideach nuair a shocraítear an chairt reithe cúltaca go In aghaidh an Chluiche chun méideanna cairte níos mó iolracha a sheachaint." -#define OPTION_VAL_128K_GA NULL -#define OPTION_VAL_256K_GA NULL -#define OPTION_VAL_512K_GA NULL -#define OPTION_VAL_1MEG_GA NULL -#define OPTION_VAL_2MEG_GA NULL -#define OPTION_VAL_4MEG_GA NULL -#define GENESIS_PLUS_GX_ADD_ON_LABEL_GA "Breiseán CD (mód MD) (Éilíonn Atosú)" -#define GENESIS_PLUS_GX_ADD_ON_INFO_0_GA "Sonraigh cén breiseán atá le húsáid le haghaidh athsheinm fuaime CD le cluichí Mega Drive/Genesis a dtacaítear leo." -#define OPTION_VAL_SEGA_MEGA_CD_GA NULL -#define OPTION_VAL_MEGASD_GA NULL -#define OPTION_VAL_NONE_GA "Dada" -#define GENESIS_PLUS_GX_LOCK_ON_LABEL_GA "Glasáil Cartús-Ar" -#define GENESIS_PLUS_GX_LOCK_ON_INFO_0_GA "Is gné Mega Drive/Genesis í an Teicneolaíocht Glasála a chuir ar chumas cluiche níos sine ceangal le port pas-trí cartús speisialta le haghaidh súgartha sínte nó athraithe. Sonraíonn an rogha seo cén cineál cartús speisialta 'glasála' atá le haithris. Ní mór comhad bios comhfhreagrach a bheith i láthair in eolaire córais RetroArch." -#define OPTION_VAL_GAME_GENIE_GA NULL -#define OPTION_VAL_ACTION_REPLAY_PRO_GA NULL -#define OPTION_VAL_SONIC_KNUCKLES_GA NULL -#define GENESIS_PLUS_GX_ASPECT_RATIO_LABEL_GA "Cóimheas Gnéithe arna Sholáthrú ag an gCroí" -#define GENESIS_PLUS_GX_ASPECT_RATIO_INFO_0_GA "Roghnaigh an cóimheas gné ábhair is fearr leat. Ní bheidh feidhm ag seo ach amháin nuair a bheidh cóimheas gné RetroArch socraithe go 'Croílár curtha ar fáil' sna socruithe Físeáin." -#define OPTION_VAL_NTSC_PAR_GA NULL -#define OPTION_VAL_PAL_PAR_GA NULL -#define OPTION_VAL_4_3_GA NULL -#define OPTION_VAL_UNCORRECTED_GA "Gan cheartú" -#define GENESIS_PLUS_GX_OVERSCAN_LABEL_GA "Teorainneacha" -#define GENESIS_PLUS_GX_OVERSCAN_INFO_0_GA "Cumasaigh é seo chun na réigiúin ró-scan a thaispeáint ag barr/bun agus/nó ar chlé/ar dheis an scáileáin. De ghnáth, bheadh ​​siad seo i bhfolach ag an mbezel timpeall imeall teilifíse caighdeánach sainmhínithe." -#define OPTION_VAL_TOP_BOTTOM_GA "Barr/Bun" -#define OPTION_VAL_LEFT_RIGHT_GA "Clé/Deas" -#define OPTION_VAL_FULL_GA "Lán" -#define GENESIS_PLUS_GX_LEFT_BORDER_LABEL_GA "Folaigh Teorainneacha Taobh an Mháistirchórais" -#define GENESIS_PLUS_GX_LEFT_BORDER_INFO_0_GA "Gearrann sé 8 bpicteil ó thaobh clé an scáileáin, nó ón dá thaobh clé agus deas agus cluichí Master System á reáchtáil." -#define OPTION_VAL_LEFT_BORDER_GA "Imeall Clé Amháin" -#define OPTION_VAL_LEFT_RIGHT_BORDERS_GA "Teorainneacha Clé & Deis" -#define GENESIS_PLUS_GX_GG_EXTRA_LABEL_GA "Scáileán Leathnaithe Game Gear" -#define GENESIS_PLUS_GX_GG_EXTRA_INFO_0_GA "Éiríonn sé seo le teidil Game Gear a rith i mód SMS, le taifeach méadaithe de 256x192. Féadfaidh sé ábhar breise a thaispeáint, ach de ghnáth taispeánann sé teorainn de shonraí íomhá truaillithe/nach dteastaíonn." -#define GENESIS_PLUS_GX_BLARGG_NTSC_FILTER_LABEL_GA "Scagaire NTSC Blargg" -#define GENESIS_PLUS_GX_BLARGG_NTSC_FILTER_INFO_0_GA "Cuir scagaire físe i bhfeidhm chun comharthaí teilifíse NTSC éagsúla a aithris." -#define OPTION_VAL_MONOCHROME_GA "Monacrómach" -#define OPTION_VAL_COMPOSITE_GA "Ilchodach" -#define OPTION_VAL_SVIDEO_GA "S-Físeán" -#define OPTION_VAL_RGB_GA NULL -#define GENESIS_PLUS_GX_LCD_FILTER_LABEL_GA "Scagaire Taibhse LCD" -#define GENESIS_PLUS_GX_LCD_FILTER_INFO_0_GA "Cuir scagaire 'taibhsithe' íomhá i bhfeidhm chun tréithe taispeána phainéil LCD Game Gear agus Genesis Nomad a aithris." -#define GENESIS_PLUS_GX_RENDER_LABEL_GA "Aschur Mód Idirfhite 2" -#define GENESIS_PLUS_GX_RENDER_INFO_0_GA "Ligeann Mód Idirfhite 2 don Mega Drive/Genesis íomhá 320x448 airde dhúbailte (ardtaifigh) a aschur trí línte scanadh malartacha a tharraingt i ngach fráma (úsáideann modhanna il-imreora Sonic the Hedgehog 2 agus Combat Cars é seo). Déanann 'Double Field' aithris ar chrua-earraí bunaidh, ag táirgeadh íomhá ghéar le déantáin splancacha/idirfhite. Cuireann 'Single Field' scagaire dí-idirfhite i bhfeidhm, rud a chobhsaíonn an íomhá ach a chruthaíonn doiléiriú beag." -#define OPTION_VAL_SINGLE_FIELD_GA "Réimse Aonair" -#define OPTION_VAL_DOUBLE_FIELD_GA "Réimse Dúbailte" -#define GENESIS_PLUS_GX_FRAMESKIP_LABEL_GA "Fráma-léim" -#define GENESIS_PLUS_GX_FRAMESKIP_INFO_0_GA "Léim frámaí chun fo-rith maoláin fuaime (crágáil) a sheachaint. Feabhsaíonn sé feidhmíocht ar chostas réidhe amhairc. Léimeann 'Uath' frámaí nuair a thugann an tosaitheoir comhairle. Úsáideann 'Lámhleabhar' an socrú 'Tairseach Léim Frámaí (%)'." -#define OPTION_VAL_MANUAL_GA "Lámhleabhar" -#define GENESIS_PLUS_GX_FRAMESKIP_THRESHOLD_LABEL_GA "Tairseach Léim Fráma (%)" -#define GENESIS_PLUS_GX_FRAMESKIP_THRESHOLD_INFO_0_GA "Nuair a shocraítear 'Frameskip' go 'Lámhleabhar', sonraítear an tairseach áitíochta maoláin fuaime (céatadán) faoina mbeidh frámaí á scipeáil. Laghdaíonn luachanna níos airde an baol go mbeidh frámaí ag scoilteadh trína chur faoi deara go gcaillfear frámaí níos minice." -#define GENESIS_PLUS_GX_YM2413_LABEL_GA NULL -#define GENESIS_PLUS_GX_YM2413_INFO_0_GA "Cumasaigh aithris ar an Aonad Fuaime FM a úsáideann cluichí áirithe Sega Mark III/Master System le haghaidh aschur fuaime feabhsaithe." -#define GENESIS_PLUS_GX_YM2413_CORE_LABEL_GA "Croílár an Mháistirchórais FM (YM2413)" -#define GENESIS_PLUS_GX_YM2413_CORE_INFO_0_GA "Roghnaigh an modh a úsáidtear chun Aonad Fuaime FM an Chórais Sega Mark III/Master a aithris. Tá an rogha 'MAME' gasta, agus ritheann sé ar lánluas ar fhormhór na gcóras. Tá an rogha 'Nuked' cruinn ó thaobh timthrialla de, ardchaighdeáin, agus tá riachtanais shuntasacha LAP aige." -#define OPTION_VAL_MAME_GA NULL -#define OPTION_VAL_NUKED_GA NULL -#define GENESIS_PLUS_GX_YM2612_LABEL_GA NULL -#define GENESIS_PLUS_GX_YM2612_INFO_0_GA "Roghnaigh an modh a úsáidtear chun sintéiseoir FM (príomhghineadóir fuaime) an Mega Drive/Genesis a aithris. Tá roghanna 'MAME' gasta, agus ritheann siad ar lánluas ar fhormhór na gcóras. Tá roghanna 'Nuked' cruinn ó thaobh timthrialla de, ardchaighdeáin, agus tá riachtanais shuntasacha LAP acu. Úsáideann an Model 1 Mega Drive/Genesis bunaidh an tslis YM2612. Úsáidtear an YM3438 in athbhreithnithe níos déanaí ar Mega Drive/Genesis." -#define GENESIS_PLUS_GX_YM2612_INFO_1_GA "Roghnaigh an modh a úsáidtear chun sintéiseoir FM (príomhghineadóir fuaime) an Mega Drive/Genesis a aithris. Úsáideann an Mega Drive/Genesis bunaidh an tslis YM2612. Úsáidtear an YM3438 in athbhreithnithe níos déanaí ar an Mega Drive/Genesis." -#define OPTION_VAL_MAME_YM2612_GA NULL -#define OPTION_VAL_MAME_ASIC_YM3438_GA NULL -#define OPTION_VAL_MAME_ENHANCED_YM3438_GA "MAME (YM3438 Feabhsaithe)" -#define OPTION_VAL_NUKED_YM2612_GA NULL -#define OPTION_VAL_NUKED_YM3438_GA NULL -#define GENESIS_PLUS_GX_SOUND_OUTPUT_LABEL_GA "Aschur Fuaime" -#define GENESIS_PLUS_GX_SOUND_OUTPUT_INFO_0_GA "Roghnaigh athsheinm fuaime steiréó nó mona." -#define OPTION_VAL_STEREO_GA "Steiréó" -#define OPTION_VAL_MONO_GA NULL -#define GENESIS_PLUS_GX_AUDIO_FILTER_LABEL_GA "Scagaire Fuaime" -#define GENESIS_PLUS_GX_AUDIO_FILTER_INFO_0_GA "Cumasaigh scagaire fuaime ísealpas chun fuaim shainiúil Model 1 Mega Drive/Genesis a insamhladh níos fearr." -#define OPTION_VAL_LOW_PASS_GA "Íseal-Phas" -#define OPTION_VAL_EQ_GA NULL -#define GENESIS_PLUS_GX_LOWPASS_RANGE_LABEL_GA "Scagaire Íseal-Phas %" -#define GENESIS_PLUS_GX_LOWPASS_RANGE_INFO_0_GA "Sonraigh minicíocht scoite an scagaire íseal-phas fuaime. Méadaíonn luach níos airde 'neart' braite an scagaire, ós rud é go laghdaítear raon níos leithne den speictream ardmhinicíochta." -#define GENESIS_PLUS_GX_PSG_PREAMP_LABEL_GA "Leibhéal Réamh-Amp PSG" -#define GENESIS_PLUS_GX_PSG_PREAMP_INFO_0_GA "Socraigh leibhéal an réamh-aimplitheora fuaime don Ghineadóir Fuaime In-ríomhchláraithe 4-chainéil SN76496 aithriste atá le fáil sa SG-1000, Sega Mark III, Master System, Game Gear agus Mega Drive/Genesis." -#define GENESIS_PLUS_GX_FM_PREAMP_LABEL_GA "Leibhéal Réamh-Aimplitheoir FM" -#define GENESIS_PLUS_GX_FM_PREAMP_INFO_0_GA "Socraigh leibhéal an réamh-aimplitheora fuaime don sintéiseoir fuaime aithrisithe Mega Drive/Genesis FM nó don Aonad Fuaime FM Sega Mark III/Master System." -#define GENESIS_PLUS_GX_CDDA_VOLUME_LABEL_GA "Imleabhar CD-DA" -#define GENESIS_PLUS_GX_CDDA_VOLUME_INFO_0_GA "Coigeartaigh toirt mheasctha aschur athsheinm fuaime an CD aithrisithe." -#define GENESIS_PLUS_GX_PCM_VOLUME_LABEL_GA "Imleabhar PCM" -#define GENESIS_PLUS_GX_PCM_VOLUME_INFO_0_GA "Coigeartaigh toirt mheasctha aschur gineadóir fuaime Sega CD/Mega-CD RF5C164 PCM aithrisithe." -#define GENESIS_PLUS_GX_AUDIO_EQ_LOW_LABEL_GA "Cothromóir Íseal" -#define GENESIS_PLUS_GX_AUDIO_EQ_LOW_INFO_0_GA "Coigeartaigh an banda íseal-raoin den chothromóir fuaime inmheánaigh." -#define GENESIS_PLUS_GX_AUDIO_EQ_MID_LABEL_GA "EQ Lár" -#define GENESIS_PLUS_GX_AUDIO_EQ_MID_INFO_0_GA "Coigeartaigh banda lár-raoin an chothromóra fuaime inmheánaigh." -#define GENESIS_PLUS_GX_AUDIO_EQ_HIGH_LABEL_GA "Ard-EQ" -#define GENESIS_PLUS_GX_AUDIO_EQ_HIGH_INFO_0_GA "Coigeartaigh an banda ard-raoin den chothromóir fuaime inmheánaigh." -#define GENESIS_PLUS_GX_GUN_INPUT_LABEL_GA "Ionchur Gunna Solais" -#define GENESIS_PLUS_GX_GUN_INPUT_INFO_0_GA "Bain úsáid as ionchur 'Gunna Solais' nó 'Scáileán Tadhaill' atá rialaithe ag an luch." -#define OPTION_VAL_LIGHTGUN_GA "Gunna Solais" -#define OPTION_VAL_TOUCHSCREEN_GA "Scáileán tadhaill" -#define GENESIS_PLUS_GX_GUN_CURSOR_LABEL_GA "Taispeáin Crosghruaig Gunna Solais" -#define GENESIS_PLUS_GX_GUN_CURSOR_INFO_0_GA "Taispeáin crosrianta gunna solais agus na cineálacha gléasanna ionchuir MD Menacer, MD Justifiers agus MS Light Phaser in úsáid." -#define GENESIS_PLUS_GX_INVERT_MOUSE_LABEL_GA "Inbhéartaigh Ais-Y na Luiche" -#define GENESIS_PLUS_GX_INVERT_MOUSE_INFO_0_GA "Déanann sé ais-Y an chineáil gléis ionchuir Luch MD a aisiompú." -#define GENESIS_PLUS_GX_NO_SPRITE_LIMIT_LABEL_GA "Bain Teorainn Sprite In Aghaidh na Líne" -#define GENESIS_PLUS_GX_NO_SPRITE_LIMIT_INFO_0_GA "Baintear an teorainn crua-earraí bunaidh sprite-in-aghaidh-scannánlíne. Laghdaíonn sé seo an caochadh ach is féidir leis fabhtanna amhairc a chur faoi deara, toisc go mbaintear leas as an teorainn crua-earraí i roinnt cluichí chun éifeachtaí speisialta a ghiniúint." -#define GENESIS_PLUS_GX_ENHANCED_VSCROLL_LABEL_GA "Scrollaigh ingearach feabhsaithe in aghaidh an tíle" -#define GENESIS_PLUS_GX_ENHANCED_VSCROLL_INFO_0_GA "Ceadaíonn sé seo gach cill aonair a scrollú go hingearach, in ionad 16px 2-chill, trí mheán a bhaint amach le luach vscroll na cille comharsanachta. Ní bhaineann an cleas seo ach le cúpla cluiche a úsáideann mód scrollú ingearach 2-chill." -#define GENESIS_PLUS_GX_ENHANCED_VSCROLL_LIMIT_LABEL_GA "Teorainn scrollaithe ingearach feabhsaithe in aghaidh an tíle" -#define GENESIS_PLUS_GX_ENHANCED_VSCROLL_LIMIT_INFO_0_GA "Nuair a bhíonn scrolla ingearach feabhsaithe in aghaidh an tíle cumasaithe amháin. Coigeartaíonn sé teorainn an fheabhsaithe scrolla ingearach. Nuair a bhíonn an difríocht vscroll idir tíleanna comharsanacha níos mó ná an teorainn seo, díchumasaítear an feabhsú." -#define GENESIS_PLUS_GX_OVERCLOCK_LABEL_GA "Luas LAP" -#define GENESIS_PLUS_GX_OVERCLOCK_INFO_0_GA "Róchlogáil an LAP aithrisithe. Is féidir leis an moilliú a laghdú, ach d'fhéadfadh sé go mbeadh teipeanna mar thoradh air." -#define OPTION_VAL_100_GA NULL -#define OPTION_VAL_125_GA NULL -#define OPTION_VAL_150_GA NULL -#define OPTION_VAL_175_GA NULL -#define OPTION_VAL_200_GA NULL -#define OPTION_VAL_225_GA NULL -#define OPTION_VAL_250_GA NULL -#define OPTION_VAL_275_GA NULL -#define OPTION_VAL_300_GA NULL -#define OPTION_VAL_325_GA NULL -#define OPTION_VAL_350_GA NULL -#define OPTION_VAL_375_GA NULL -#define OPTION_VAL_400_GA NULL -#define OPTION_VAL_425_GA NULL -#define OPTION_VAL_450_GA NULL -#define OPTION_VAL_475_GA NULL -#define OPTION_VAL_500_GA NULL -#define GENESIS_PLUS_GX_FORCE_DTACK_LABEL_GA "Glasálacha Córais" -#define GENESIS_PLUS_GX_FORCE_DTACK_INFO_0_GA "Déan aithris ar ghlasálacha córais a tharlaíonn ar chrua-earraí fíor agus rochtain neamhdhleathach seoltaí á déanamh. Níor cheart é seo a dhíchumasú ach amháin agus taispeántais agus grúdaireacht bhaile áirithe á n-imirt a bhraitheann ar iompar neamhdhleathach le haghaidh oibriú ceart." -#define GENESIS_PLUS_GX_ADDR_ERROR_LABEL_GA "Earráid Seoladh 68K" -#define GENESIS_PLUS_GX_ADDR_ERROR_INFO_0_GA "Gineann príomh-LAP Mega Drive/Genesis (Motorola 68000) eisceacht Earráid Seolta (tuairteáil) agus iarracht á déanamh rochtain neamhailínithe ar chuimhne. Má chumasaítear é seo, déanfar an t-iompar seo a insamhladh. Níor cheart é a dhíchumasú ach amháin agus hacks ROM á n-imirt, ós rud é go bhforbraítear iad seo de ghnáth ag baint úsáide as aithriseoirí nach bhfuil chomh cruinn agus go bhféadfadh siad brath ar rochtain RAM neamhbhailí le haghaidh oibriú ceart." -#define GENESIS_PLUS_GX_CD_LATENCY_LABEL_GA "Am Rochtana CD" -#define GENESIS_PLUS_GX_CD_LATENCY_INFO_0_GA "Insamhladh a dhéanamh ar mhoill chrua-earraí bunaidh CD agus léamh á thosú nó nuair a bhíonn suíomh ar leith á lorg ar dhiosca luchtaithe. Tá sé seo riachtanach i gcás roinnt cluichí CD a thuairteálann má bhíonn sonraí CD ar fáil ró-luath agus réitíonn sé fadhbanna díshioncrónaithe fuaime CD i roinnt cluichí freisin. Is féidir é seo a dhíchumasú a bheith úsáideach le cluichí MSU-MD mar go ndéanann sé lúba rianta fuaime CD níos gan uaim." -#define GENESIS_PLUS_GX_CD_PRECACHE_LABEL_GA "Taisce Íomhá CD" -#define GENESIS_PLUS_GX_CD_PRECACHE_INFO_0_GA "Luchtaigh íomhá CD isteach sa chuimhne ag am tosaithe. Tacaítear le CHD amháin. Atosú Riachtanach." -#define GENESIS_PLUS_GX_SHOW_ADVANCED_AUDIO_SETTINGS_LABEL_GA "Taispeáin Socruithe Ardleibhéil Imleabhair Fuaime (Athoscail an roghchlár)" -#define GENESIS_PLUS_GX_SHOW_ADVANCED_AUDIO_SETTINGS_INFO_0_GA "Cumasaigh cumraíocht paraiméadair chainéil fuaime íseal-leibhéil. TABHAIR FAOI DEARA: Ní mór an Roghchlár Tapa a athrú chun go dtiocfaidh an socrú seo i bhfeidhm." -#define GENESIS_PLUS_GX_PSG_CHANNEL_0_VOLUME_LABEL_GA "Cainéal Ton PSG 0 Imleabhar %" -#define GENESIS_PLUS_GX_PSG_CHANNEL_0_VOLUME_INFO_0_GA "Laghdaigh toirt Chainéal Tóin PSG 0." -#define GENESIS_PLUS_GX_PSG_CHANNEL_1_VOLUME_LABEL_GA "% Imleabhar Cainéal 1 Ton PSG" -#define GENESIS_PLUS_GX_PSG_CHANNEL_1_VOLUME_INFO_0_GA "Laghdaigh toirt Chainéal 1 Tóin PSG." -#define GENESIS_PLUS_GX_PSG_CHANNEL_2_VOLUME_LABEL_GA "% Imleabhar Cainéal 2 Ton PSG" -#define GENESIS_PLUS_GX_PSG_CHANNEL_2_VOLUME_INFO_0_GA "Laghdaigh toirt Chainéal 2 Tone PSG." -#define GENESIS_PLUS_GX_PSG_CHANNEL_3_VOLUME_LABEL_GA "Torann PSG Cainéal 3 Imleabhar %" -#define GENESIS_PLUS_GX_PSG_CHANNEL_3_VOLUME_INFO_0_GA "Laghdaigh toirt Chainéal Torainn PSG 3." -#define GENESIS_PLUS_GX_MD_CHANNEL_0_VOLUME_LABEL_GA "Cainéal Mega Drive/Genesis FM 0 % Imleabhar" -#define GENESIS_PLUS_GX_MD_CHANNEL_0_VOLUME_INFO_0_GA "Laghdaigh toirt Cainéal 0 Mega Drive/Genesis FM. Ní oibríonn sé ach le hinslitheoirí MAME FM." -#define GENESIS_PLUS_GX_MD_CHANNEL_1_VOLUME_LABEL_GA "Cainéal 1 Mega Drive/Genesis FM % Toirt" -#define GENESIS_PLUS_GX_MD_CHANNEL_1_VOLUME_INFO_0_GA "Laghdaigh toirt Cainéal 1 Mega Drive/Genesis FM. Ní oibríonn sé ach le hinslitheoirí MAME FM." -#define GENESIS_PLUS_GX_MD_CHANNEL_2_VOLUME_LABEL_GA "Cainéal 2 Mega Drive/Genesis FM % Toirt" -#define GENESIS_PLUS_GX_MD_CHANNEL_2_VOLUME_INFO_0_GA "Laghdaigh toirt Cainéal 2 Mega Drive/Genesis FM. Ní oibríonn sé ach le hinslitheoirí MAME FM." -#define GENESIS_PLUS_GX_MD_CHANNEL_3_VOLUME_LABEL_GA "Cainéal 3 Mega Drive/Genesis FM % Toirt" -#define GENESIS_PLUS_GX_MD_CHANNEL_3_VOLUME_INFO_0_GA "Laghdaigh toirt Cainéal 3 Mega Drive/Genesis FM. Ní oibríonn sé ach le hinslitheoirí MAME FM." -#define GENESIS_PLUS_GX_MD_CHANNEL_4_VOLUME_LABEL_GA "Mega Drive/Genesis FM Cainéal 4 % Toirt" -#define GENESIS_PLUS_GX_MD_CHANNEL_4_VOLUME_INFO_0_GA "Laghdaigh toirt Cainéal 4 Mega Drive/Genesis FM. Ní oibríonn sé ach le hinslitheoirí MAME FM." -#define GENESIS_PLUS_GX_MD_CHANNEL_5_VOLUME_LABEL_GA "Cainéal 5 Mega Drive/Genesis FM % Toirt" -#define GENESIS_PLUS_GX_MD_CHANNEL_5_VOLUME_INFO_0_GA "Laghdaigh toirt Cainéal 5 Mega Drive/Genesis FM. Ní oibríonn sé ach le hinslitheoirí MAME FM." -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_0_VOLUME_LABEL_GA "Córas Máistir FM (YM2413) Cainéal 0 Imleabhar %" -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_0_VOLUME_INFO_0_GA "Laghdaigh toirt Chainéal FM 0 an Mháistirchórais." -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_1_VOLUME_LABEL_GA "Córas Máistir FM (YM2413) Cainéal 1 Imleabhar %" -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_1_VOLUME_INFO_0_GA "Laghdaigh toirt Chainéal 1 FM an Mháistirchórais." -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_2_VOLUME_LABEL_GA "Córas Máistir FM (YM2413) Cainéal 2 Imleabhar %" -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_2_VOLUME_INFO_0_GA "Laghdaigh toirt Chainéal 2 FM an Mháistirchórais." -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_3_VOLUME_LABEL_GA "Córas Máistir FM (YM2413) Cainéal 3 Imleabhar %" -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_3_VOLUME_INFO_0_GA "Laghdaigh toirt Chainéal 3 FM an Mháistirchórais." -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_4_VOLUME_LABEL_GA "Córas Máistir FM (YM2413) Cainéal 4 Imleabhar %" -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_4_VOLUME_INFO_0_GA "Laghdaigh toirt Cainéal 4 FM an Mháistirchórais." -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_5_VOLUME_LABEL_GA "Córas Máistir FM (YM2413) Cainéal 5 Imleabhar %" -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_5_VOLUME_INFO_0_GA "Laghdaigh toirt Chainéal 5 FM an Mháistirchórais." -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_6_VOLUME_LABEL_GA "Córas Máistir FM (YM2413) Cainéal 6 Imleabhar %" -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_6_VOLUME_INFO_0_GA "Laghdaigh toirt Chainéal 6 FM an Mháistirchórais." -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_7_VOLUME_LABEL_GA "Córas Máistir FM (YM2413) Cainéal 7 Imleabhar %" -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_7_VOLUME_INFO_0_GA "Laghdaigh toirt Chainéal 7 FM an Mháistirchórais." -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_8_VOLUME_LABEL_GA "Córas Máistir FM (YM2413) Cainéal 8 Imleabhar %" -#define GENESIS_PLUS_GX_SMS_FM_CHANNEL_8_VOLUME_INFO_0_GA "Laghdaigh toirt Chainéal 8 FM an Mháistirchórais." - -struct retro_core_option_v2_category option_cats_ga[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_GA, - CATEGORY_SYSTEM_INFO_0_GA - }, - { - "video", - CATEGORY_VIDEO_LABEL_GA, - CATEGORY_VIDEO_INFO_0_GA - }, - { - "audio", - CATEGORY_AUDIO_LABEL_GA, - CATEGORY_AUDIO_INFO_0_GA - }, - { - "input", - CATEGORY_INPUT_LABEL_GA, - CATEGORY_INPUT_INFO_0_GA - }, - { - "hacks", - CATEGORY_HACKS_LABEL_GA, - CATEGORY_HACKS_INFO_0_GA - }, - { - "channel_volume", - CATEGORY_CHANNEL_VOLUME_LABEL_GA, - CATEGORY_CHANNEL_VOLUME_INFO_0_GA - }, - { NULL, NULL, NULL }, -}; -struct retro_core_option_v2_definition option_defs_ga[] = { - { - "genesis_plus_gx_system_hw", - GENESIS_PLUS_GX_SYSTEM_HW_LABEL_GA, - NULL, - GENESIS_PLUS_GX_SYSTEM_HW_INFO_0_GA, - NULL, - "system", - { - { "auto", OPTION_VAL_AUTO_GA }, - { "sg-1000", OPTION_VAL_SG_1000_GA }, - { "sg-1000 II", OPTION_VAL_SG_1000_II_GA }, - { "sg-1000 II + ram ext.",OPTION_VAL_SG_1000_II_RAM_EXT_GA}, - { "mark-III", OPTION_VAL_MARK_III_GA }, - { "master system", OPTION_VAL_MASTER_SYSTEM_GA }, - { "master system II", OPTION_VAL_MASTER_SYSTEM_II_GA }, - { "game gear", OPTION_VAL_GAME_GEAR_GA }, - { "mega drive / genesis", OPTION_VAL_MEGA_DRIVE_GENESIS_GA }, - { NULL, NULL }, - }, - "auto" - }, - { - "genesis_plus_gx_region_detect", - GENESIS_PLUS_GX_REGION_DETECT_LABEL_GA, - NULL, - GENESIS_PLUS_GX_REGION_DETECT_INFO_0_GA, - NULL, - "system", - { - { "auto", OPTION_VAL_AUTO_GA }, - { "ntsc-u", OPTION_VAL_NTSC_U_GA }, - { "pal", OPTION_VAL_PAL_GA }, - { "ntsc-j", OPTION_VAL_NTSC_J_GA }, - { NULL, NULL }, - }, - "auto" - }, - { - "genesis_plus_gx_vdp_mode", - GENESIS_PLUS_GX_VDP_MODE_LABEL_GA, - NULL, - GENESIS_PLUS_GX_VDP_MODE_INFO_0_GA, - NULL, - "system", - { - { "auto", "Disabled" }, - { "60hz", OPTION_VAL_60HZ_GA }, - { "50hz", OPTION_VAL_50HZ_GA }, - { NULL, NULL }, - }, - "auto" - }, - { - "genesis_plus_gx_bios", - GENESIS_PLUS_GX_BIOS_LABEL_GA, - NULL, - GENESIS_PLUS_GX_BIOS_INFO_0_GA, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled" - }, - { - "genesis_plus_gx_system_bram", - GENESIS_PLUS_GX_SYSTEM_BRAM_LABEL_GA, - NULL, - GENESIS_PLUS_GX_SYSTEM_BRAM_INFO_0_GA, - NULL, - "system", - { - { "per bios", OPTION_VAL_PER_BIOS_GA }, - { "per game", OPTION_VAL_PER_GAME_GA }, - { NULL, NULL }, - }, - "per bios" - }, - { - "genesis_plus_gx_cart_bram", - GENESIS_PLUS_GX_CART_BRAM_LABEL_GA, - NULL, - GENESIS_PLUS_GX_CART_BRAM_INFO_0_GA, - NULL, - "system", - { - { "per cart", OPTION_VAL_PER_CART_GA }, - { "per game", OPTION_VAL_PER_GAME_GA }, - { NULL, NULL }, - }, - "per cart" - }, - { - "genesis_plus_gx_cart_size", - GENESIS_PLUS_GX_CART_SIZE_LABEL_GA, - NULL, - GENESIS_PLUS_GX_CART_SIZE_INFO_0_GA, - NULL, - "system", - { - { "disabled", "Disabled" }, - { "128k", OPTION_VAL_128K_GA }, - { "256k", OPTION_VAL_256K_GA }, - { "512k", OPTION_VAL_512K_GA }, - { "1meg", OPTION_VAL_1MEG_GA }, - { "2meg", OPTION_VAL_2MEG_GA }, - { "4meg", OPTION_VAL_4MEG_GA }, - { NULL, NULL }, - }, - "4meg" - }, - { - "genesis_plus_gx_add_on", - GENESIS_PLUS_GX_ADD_ON_LABEL_GA, - NULL, - GENESIS_PLUS_GX_ADD_ON_INFO_0_GA, - NULL, - "system", - { - { "auto", OPTION_VAL_AUTO_GA }, - { "sega/mega cd", OPTION_VAL_SEGA_MEGA_CD_GA }, - { "megasd", OPTION_VAL_MEGASD_GA }, - { "none", OPTION_VAL_NONE_GA }, - { NULL, NULL }, - }, - "auto" - }, - { - "genesis_plus_gx_lock_on", - GENESIS_PLUS_GX_LOCK_ON_LABEL_GA, - NULL, - GENESIS_PLUS_GX_LOCK_ON_INFO_0_GA, - NULL, - "system", - { - { "disabled", NULL }, - { "game genie", OPTION_VAL_GAME_GENIE_GA }, - { "action replay (pro)", OPTION_VAL_ACTION_REPLAY_PRO_GA }, - { "sonic & knuckles", OPTION_VAL_SONIC_KNUCKLES_GA }, - { NULL, NULL }, - }, - "disabled" - }, - { - "genesis_plus_gx_aspect_ratio", - GENESIS_PLUS_GX_ASPECT_RATIO_LABEL_GA, - NULL, - GENESIS_PLUS_GX_ASPECT_RATIO_INFO_0_GA, - NULL, - "video", - { - { "auto", OPTION_VAL_AUTO_GA }, - { "NTSC PAR", OPTION_VAL_NTSC_PAR_GA }, - { "PAL PAR", OPTION_VAL_PAL_PAR_GA }, - { "4:3", OPTION_VAL_4_3_GA }, - { "Uncorrected", OPTION_VAL_UNCORRECTED_GA }, - }, - "auto" - }, - { - "genesis_plus_gx_overscan", - GENESIS_PLUS_GX_OVERSCAN_LABEL_GA, - NULL, - GENESIS_PLUS_GX_OVERSCAN_INFO_0_GA, - NULL, - "video", - { - { "disabled", NULL }, - { "top/bottom", OPTION_VAL_TOP_BOTTOM_GA }, - { "left/right", OPTION_VAL_LEFT_RIGHT_GA }, - { "full", OPTION_VAL_FULL_GA }, - { NULL, NULL }, - }, - "disabled" - }, - { - "genesis_plus_gx_left_border", - GENESIS_PLUS_GX_LEFT_BORDER_LABEL_GA, - NULL, - GENESIS_PLUS_GX_LEFT_BORDER_INFO_0_GA, - NULL, - "video", - { - { "disabled", NULL }, - { "left border", OPTION_VAL_LEFT_BORDER_GA }, - { "left & right borders", OPTION_VAL_LEFT_RIGHT_BORDERS_GA }, - { NULL, NULL }, - }, - "disabled" - }, - { - "genesis_plus_gx_gg_extra", - GENESIS_PLUS_GX_GG_EXTRA_LABEL_GA, - NULL, - GENESIS_PLUS_GX_GG_EXTRA_INFO_0_GA, - NULL, - "video", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled" - }, - { - "genesis_plus_gx_blargg_ntsc_filter", - GENESIS_PLUS_GX_BLARGG_NTSC_FILTER_LABEL_GA, - NULL, - GENESIS_PLUS_GX_BLARGG_NTSC_FILTER_INFO_0_GA, - NULL, - "video", - { - { "disabled", NULL }, - { "monochrome", OPTION_VAL_MONOCHROME_GA }, - { "composite", OPTION_VAL_COMPOSITE_GA }, - { "svideo", OPTION_VAL_SVIDEO_GA }, - { "rgb", OPTION_VAL_RGB_GA }, - { NULL, NULL }, - }, - "disabled" - }, - { - "genesis_plus_gx_lcd_filter", - GENESIS_PLUS_GX_LCD_FILTER_LABEL_GA, - NULL, - GENESIS_PLUS_GX_LCD_FILTER_INFO_0_GA, - NULL, - "video", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled" - }, - { - "genesis_plus_gx_render", - GENESIS_PLUS_GX_RENDER_LABEL_GA, - NULL, - GENESIS_PLUS_GX_RENDER_INFO_0_GA, - NULL, - "video", - { - { "single field", OPTION_VAL_SINGLE_FIELD_GA }, - { "double field", OPTION_VAL_DOUBLE_FIELD_GA }, - { NULL, NULL }, - }, - "single field" - }, - { - "genesis_plus_gx_frameskip", - GENESIS_PLUS_GX_FRAMESKIP_LABEL_GA, - NULL, - GENESIS_PLUS_GX_FRAMESKIP_INFO_0_GA, - NULL, - "video", - { - { "disabled", NULL }, - { "auto", OPTION_VAL_AUTO_GA }, - { "manual", OPTION_VAL_MANUAL_GA }, - { NULL, NULL }, - }, - "disabled" - }, - { - "genesis_plus_gx_frameskip_threshold", - GENESIS_PLUS_GX_FRAMESKIP_THRESHOLD_LABEL_GA, - NULL, - GENESIS_PLUS_GX_FRAMESKIP_THRESHOLD_INFO_0_GA, - NULL, - "video", - { - { "15", NULL }, - { "18", NULL }, - { "21", NULL }, - { "24", NULL }, - { "27", NULL }, - { "30", NULL }, - { "33", NULL }, - { "36", NULL }, - { "39", NULL }, - { "42", NULL }, - { "45", NULL }, - { "48", NULL }, - { "51", NULL }, - { "54", NULL }, - { "57", NULL }, - { "60", NULL }, - { NULL, NULL }, - }, - "33" - }, - { - "genesis_plus_gx_ym2413", - GENESIS_PLUS_GX_YM2413_LABEL_GA, - NULL, - GENESIS_PLUS_GX_YM2413_INFO_0_GA, - NULL, - "audio", - { - { "auto", OPTION_VAL_AUTO_GA }, - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "auto" - }, -#ifdef HAVE_OPLL_CORE - { - "genesis_plus_gx_ym2413_core", - GENESIS_PLUS_GX_YM2413_CORE_LABEL_GA, - NULL, - GENESIS_PLUS_GX_YM2413_CORE_INFO_0_GA, - NULL, - "audio", - { - { "mame", OPTION_VAL_MAME_GA }, - { "nuked", OPTION_VAL_NUKED_GA }, - { NULL, NULL }, - }, - "mame" - }, -#endif - { - "genesis_plus_gx_ym2612", - GENESIS_PLUS_GX_YM2612_LABEL_GA, - NULL, -#ifdef HAVE_YM3438_CORE - GENESIS_PLUS_GX_YM2612_INFO_0_GA, -#else - GENESIS_PLUS_GX_YM2612_INFO_1_GA, -#endif - NULL, - "audio", - { - { "mame (ym2612)", OPTION_VAL_MAME_YM2612_GA }, - { "mame (asic ym3438)", OPTION_VAL_MAME_ASIC_YM3438_GA }, - { "mame (enhanced ym3438)", OPTION_VAL_MAME_ENHANCED_YM3438_GA }, -#ifdef HAVE_YM3438_CORE - { "nuked (ym2612)", OPTION_VAL_NUKED_YM2612_GA }, - { "nuked (ym3438)", OPTION_VAL_NUKED_YM3438_GA }, -#endif - { NULL, NULL }, - }, - "mame (ym2612)" - }, - { - "genesis_plus_gx_sound_output", - GENESIS_PLUS_GX_SOUND_OUTPUT_LABEL_GA, - NULL, - GENESIS_PLUS_GX_SOUND_OUTPUT_INFO_0_GA, - NULL, - "audio", - { - { "stereo", OPTION_VAL_STEREO_GA }, - { "mono", OPTION_VAL_MONO_GA }, - { NULL, NULL }, - }, - "stereo" - }, - { - "genesis_plus_gx_audio_filter", - GENESIS_PLUS_GX_AUDIO_FILTER_LABEL_GA, - NULL, - GENESIS_PLUS_GX_AUDIO_FILTER_INFO_0_GA, - NULL, - "audio", - { - { "disabled", NULL }, - { "low-pass", OPTION_VAL_LOW_PASS_GA }, -#ifdef HAVE_EQ - { "EQ", OPTION_VAL_EQ_GA }, -#endif - { NULL, NULL }, - }, - "disabled" - }, - { - "genesis_plus_gx_lowpass_range", - GENESIS_PLUS_GX_LOWPASS_RANGE_LABEL_GA, - NULL, - GENESIS_PLUS_GX_LOWPASS_RANGE_INFO_0_GA, - NULL, - "audio", - { - { "5", NULL }, - { "10", NULL }, - { "15", NULL }, - { "20", NULL }, - { "25", NULL }, - { "30", NULL }, - { "35", NULL }, - { "40", NULL }, - { "45", NULL }, - { "50", NULL }, - { "55", NULL }, - { "60", NULL }, - { "65", NULL }, - { "70", NULL }, - { "75", NULL }, - { "80", NULL }, - { "85", NULL }, - { "90", NULL }, - { "95", NULL }, - { NULL, NULL }, - }, - "60" - }, - { - "genesis_plus_gx_psg_preamp", - GENESIS_PLUS_GX_PSG_PREAMP_LABEL_GA, - NULL, - GENESIS_PLUS_GX_PSG_PREAMP_INFO_0_GA, - NULL, - "audio", - { - { "0", NULL }, - { "5", NULL }, - { "10", NULL }, - { "15", NULL }, - { "20", NULL }, - { "25", NULL }, - { "30", NULL }, - { "35", NULL }, - { "40", NULL }, - { "45", NULL }, - { "50", NULL }, - { "55", NULL }, - { "60", NULL }, - { "65", NULL }, - { "70", NULL }, - { "75", NULL }, - { "80", NULL }, - { "85", NULL }, - { "90", NULL }, - { "95", NULL }, - { "100", NULL }, - { "105", NULL }, - { "110", NULL }, - { "115", NULL }, - { "120", NULL }, - { "125", NULL }, - { "130", NULL }, - { "135", NULL }, - { "140", NULL }, - { "145", NULL }, - { "150", NULL }, - { "155", NULL }, - { "160", NULL }, - { "165", NULL }, - { "170", NULL }, - { "175", NULL }, - { "180", NULL }, - { "185", NULL }, - { "190", NULL }, - { "195", NULL }, - { "200", NULL }, - { NULL, NULL }, - }, - "150" - }, - { - "genesis_plus_gx_fm_preamp", - GENESIS_PLUS_GX_FM_PREAMP_LABEL_GA, - NULL, - GENESIS_PLUS_GX_FM_PREAMP_INFO_0_GA, - NULL, - "audio", - { - { "0", NULL }, - { "5", NULL }, - { "10", NULL }, - { "15", NULL }, - { "20", NULL }, - { "25", NULL }, - { "30", NULL }, - { "35", NULL }, - { "40", NULL }, - { "45", NULL }, - { "50", NULL }, - { "55", NULL }, - { "60", NULL }, - { "65", NULL }, - { "70", NULL }, - { "75", NULL }, - { "80", NULL }, - { "85", NULL }, - { "90", NULL }, - { "95", NULL }, - { "100", NULL }, - { "105", NULL }, - { "110", NULL }, - { "115", NULL }, - { "120", NULL }, - { "125", NULL }, - { "130", NULL }, - { "135", NULL }, - { "140", NULL }, - { "145", NULL }, - { "150", NULL }, - { "155", NULL }, - { "160", NULL }, - { "165", NULL }, - { "170", NULL }, - { "175", NULL }, - { "180", NULL }, - { "185", NULL }, - { "190", NULL }, - { "195", NULL }, - { "200", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_cdda_volume", - GENESIS_PLUS_GX_CDDA_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_CDDA_VOLUME_INFO_0_GA, - NULL, - "audio", - { - { "0", NULL }, - { "5", NULL }, - { "10", NULL }, - { "15", NULL }, - { "20", NULL }, - { "25", NULL }, - { "30", NULL }, - { "35", NULL }, - { "40", NULL }, - { "45", NULL }, - { "50", NULL }, - { "55", NULL }, - { "60", NULL }, - { "65", NULL }, - { "70", NULL }, - { "75", NULL }, - { "80", NULL }, - { "85", NULL }, - { "90", NULL }, - { "95", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_pcm_volume", - GENESIS_PLUS_GX_PCM_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_PCM_VOLUME_INFO_0_GA, - NULL, - "audio", - { - { "0", NULL }, - { "5", NULL }, - { "10", NULL }, - { "15", NULL }, - { "20", NULL }, - { "25", NULL }, - { "30", NULL }, - { "35", NULL }, - { "40", NULL }, - { "45", NULL }, - { "50", NULL }, - { "55", NULL }, - { "60", NULL }, - { "65", NULL }, - { "70", NULL }, - { "75", NULL }, - { "80", NULL }, - { "85", NULL }, - { "90", NULL }, - { "95", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, -#ifdef HAVE_EQ - { - "genesis_plus_gx_audio_eq_low", - GENESIS_PLUS_GX_AUDIO_EQ_LOW_LABEL_GA, - NULL, - GENESIS_PLUS_GX_AUDIO_EQ_LOW_INFO_0_GA, - NULL, - "audio", - { - { "0", NULL }, - { "5", NULL }, - { "10", NULL }, - { "15", NULL }, - { "20", NULL }, - { "25", NULL }, - { "30", NULL }, - { "35", NULL }, - { "40", NULL }, - { "45", NULL }, - { "50", NULL }, - { "55", NULL }, - { "60", NULL }, - { "65", NULL }, - { "70", NULL }, - { "75", NULL }, - { "80", NULL }, - { "85", NULL }, - { "90", NULL }, - { "95", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_audio_eq_mid", - GENESIS_PLUS_GX_AUDIO_EQ_MID_LABEL_GA, - NULL, - GENESIS_PLUS_GX_AUDIO_EQ_MID_INFO_0_GA, - NULL, - "audio", - { - { "0", NULL }, - { "5", NULL }, - { "10", NULL }, - { "15", NULL }, - { "20", NULL }, - { "25", NULL }, - { "30", NULL }, - { "35", NULL }, - { "40", NULL }, - { "45", NULL }, - { "50", NULL }, - { "55", NULL }, - { "60", NULL }, - { "65", NULL }, - { "70", NULL }, - { "75", NULL }, - { "80", NULL }, - { "85", NULL }, - { "90", NULL }, - { "95", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_audio_eq_high", - GENESIS_PLUS_GX_AUDIO_EQ_HIGH_LABEL_GA, - NULL, - GENESIS_PLUS_GX_AUDIO_EQ_HIGH_INFO_0_GA, - NULL, - "audio", - { - { "0", NULL }, - { "5", NULL }, - { "10", NULL }, - { "15", NULL }, - { "20", NULL }, - { "25", NULL }, - { "30", NULL }, - { "35", NULL }, - { "40", NULL }, - { "45", NULL }, - { "50", NULL }, - { "55", NULL }, - { "60", NULL }, - { "65", NULL }, - { "70", NULL }, - { "75", NULL }, - { "80", NULL }, - { "85", NULL }, - { "90", NULL }, - { "95", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, -#endif - { - "genesis_plus_gx_gun_input", - GENESIS_PLUS_GX_GUN_INPUT_LABEL_GA, - NULL, - GENESIS_PLUS_GX_GUN_INPUT_INFO_0_GA, - NULL, - "input", - { - { "lightgun", OPTION_VAL_LIGHTGUN_GA }, - { "touchscreen", OPTION_VAL_TOUCHSCREEN_GA }, - { NULL, NULL }, - }, - "lightgun" - }, - { - "genesis_plus_gx_gun_cursor", - GENESIS_PLUS_GX_GUN_CURSOR_LABEL_GA, - NULL, - GENESIS_PLUS_GX_GUN_CURSOR_INFO_0_GA, - NULL, - "input", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled" - }, - { - "genesis_plus_gx_invert_mouse", - GENESIS_PLUS_GX_INVERT_MOUSE_LABEL_GA, - NULL, - GENESIS_PLUS_GX_INVERT_MOUSE_INFO_0_GA, - NULL, - "input", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled" - }, - { - "genesis_plus_gx_no_sprite_limit", - GENESIS_PLUS_GX_NO_SPRITE_LIMIT_LABEL_GA, - NULL, - GENESIS_PLUS_GX_NO_SPRITE_LIMIT_INFO_0_GA, - NULL, - "hacks", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled" - }, - { - "genesis_plus_gx_enhanced_vscroll", - GENESIS_PLUS_GX_ENHANCED_VSCROLL_LABEL_GA, - NULL, - GENESIS_PLUS_GX_ENHANCED_VSCROLL_INFO_0_GA, - NULL, - "hacks", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled" - }, - { - "genesis_plus_gx_enhanced_vscroll_limit", - GENESIS_PLUS_GX_ENHANCED_VSCROLL_LIMIT_LABEL_GA, - NULL, - GENESIS_PLUS_GX_ENHANCED_VSCROLL_LIMIT_INFO_0_GA, - NULL, - "hacks", - { - { "2", NULL }, - { "3", NULL }, - { "4", NULL }, - { "5", NULL }, - { "6", NULL }, - { "7", NULL }, - { "8", NULL }, - { "9", NULL }, - { "10", NULL }, - { "11", NULL }, - { "12", NULL }, - { "13", NULL }, - { "14", NULL }, - { "15", NULL }, - { "16", NULL }, - { NULL, NULL }, - }, - "8" - }, -#ifdef HAVE_OVERCLOCK - { - "genesis_plus_gx_overclock", - GENESIS_PLUS_GX_OVERCLOCK_LABEL_GA, - NULL, - GENESIS_PLUS_GX_OVERCLOCK_INFO_0_GA, - NULL, - "hacks", - { - { "100", OPTION_VAL_100_GA }, - { "125", OPTION_VAL_125_GA }, - { "150", OPTION_VAL_150_GA }, - { "175", OPTION_VAL_175_GA }, - { "200", OPTION_VAL_200_GA }, - { "225", OPTION_VAL_225_GA }, - { "250", OPTION_VAL_250_GA }, - { "275", OPTION_VAL_275_GA }, - { "300", OPTION_VAL_300_GA }, - { "325", OPTION_VAL_325_GA }, - { "350", OPTION_VAL_350_GA }, - { "375", OPTION_VAL_375_GA }, - { "400", OPTION_VAL_400_GA }, - { "425", OPTION_VAL_425_GA }, - { "450", OPTION_VAL_450_GA }, - { "475", OPTION_VAL_475_GA }, - { "500", OPTION_VAL_500_GA }, - { NULL, NULL }, - }, - "100%" - }, -#endif - { - "genesis_plus_gx_force_dtack", - GENESIS_PLUS_GX_FORCE_DTACK_LABEL_GA, - NULL, - GENESIS_PLUS_GX_FORCE_DTACK_INFO_0_GA, - NULL, - "hacks", - { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL }, - }, - "enabled" - }, - { - "genesis_plus_gx_addr_error", - GENESIS_PLUS_GX_ADDR_ERROR_LABEL_GA, - NULL, - GENESIS_PLUS_GX_ADDR_ERROR_INFO_0_GA, - NULL, - "hacks", - { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL }, - }, - "enabled" - }, - { - "genesis_plus_gx_cd_latency", - GENESIS_PLUS_GX_CD_LATENCY_LABEL_GA, - NULL, - GENESIS_PLUS_GX_CD_LATENCY_INFO_0_GA, - NULL, - "hacks", - { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL }, - }, - "enabled" - }, - { - "genesis_plus_gx_cd_precache", - GENESIS_PLUS_GX_CD_PRECACHE_LABEL_GA, - NULL, - GENESIS_PLUS_GX_CD_PRECACHE_INFO_0_GA, - NULL, - "hacks", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled" - }, -#ifdef USE_PER_SOUND_CHANNELS_CONFIG - { - "genesis_plus_gx_show_advanced_audio_settings", - GENESIS_PLUS_GX_SHOW_ADVANCED_AUDIO_SETTINGS_LABEL_GA, - NULL, - GENESIS_PLUS_GX_SHOW_ADVANCED_AUDIO_SETTINGS_INFO_0_GA, - NULL, - "channel_volume", - { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, - }, - "disabled" - }, - { - "genesis_plus_gx_psg_channel_0_volume", - GENESIS_PLUS_GX_PSG_CHANNEL_0_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_PSG_CHANNEL_0_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_psg_channel_1_volume", - GENESIS_PLUS_GX_PSG_CHANNEL_1_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_PSG_CHANNEL_1_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_psg_channel_2_volume", - GENESIS_PLUS_GX_PSG_CHANNEL_2_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_PSG_CHANNEL_2_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_psg_channel_3_volume", - GENESIS_PLUS_GX_PSG_CHANNEL_3_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_PSG_CHANNEL_3_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_md_channel_0_volume", - GENESIS_PLUS_GX_MD_CHANNEL_0_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_MD_CHANNEL_0_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_md_channel_1_volume", - GENESIS_PLUS_GX_MD_CHANNEL_1_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_MD_CHANNEL_1_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_md_channel_2_volume", - GENESIS_PLUS_GX_MD_CHANNEL_2_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_MD_CHANNEL_2_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_md_channel_3_volume", - GENESIS_PLUS_GX_MD_CHANNEL_3_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_MD_CHANNEL_3_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_md_channel_4_volume", - GENESIS_PLUS_GX_MD_CHANNEL_4_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_MD_CHANNEL_4_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_md_channel_5_volume", - GENESIS_PLUS_GX_MD_CHANNEL_5_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_MD_CHANNEL_5_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_sms_fm_channel_0_volume", - GENESIS_PLUS_GX_SMS_FM_CHANNEL_0_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_SMS_FM_CHANNEL_0_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_sms_fm_channel_1_volume", - GENESIS_PLUS_GX_SMS_FM_CHANNEL_1_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_SMS_FM_CHANNEL_1_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_sms_fm_channel_2_volume", - GENESIS_PLUS_GX_SMS_FM_CHANNEL_2_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_SMS_FM_CHANNEL_2_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_sms_fm_channel_3_volume", - GENESIS_PLUS_GX_SMS_FM_CHANNEL_3_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_SMS_FM_CHANNEL_3_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_sms_fm_channel_4_volume", - GENESIS_PLUS_GX_SMS_FM_CHANNEL_4_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_SMS_FM_CHANNEL_4_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_sms_fm_channel_5_volume", - GENESIS_PLUS_GX_SMS_FM_CHANNEL_5_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_SMS_FM_CHANNEL_5_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_sms_fm_channel_6_volume", - GENESIS_PLUS_GX_SMS_FM_CHANNEL_6_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_SMS_FM_CHANNEL_6_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_sms_fm_channel_7_volume", - GENESIS_PLUS_GX_SMS_FM_CHANNEL_7_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_SMS_FM_CHANNEL_7_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, - { - "genesis_plus_gx_sms_fm_channel_8_volume", - GENESIS_PLUS_GX_SMS_FM_CHANNEL_8_VOLUME_LABEL_GA, - NULL, - GENESIS_PLUS_GX_SMS_FM_CHANNEL_8_VOLUME_INFO_0_GA, - NULL, - "channel_volume", - { - { "0", NULL }, - { "10", NULL }, - { "20", NULL }, - { "30", NULL }, - { "40", NULL }, - { "50", NULL }, - { "60", NULL }, - { "70", NULL }, - { "80", NULL }, - { "90", NULL }, - { "100", NULL }, - { NULL, NULL }, - }, - "100" - }, -#endif - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_ga = { - option_cats_ga, - option_defs_ga -}; - /* RETRO_LANGUAGE_GL */ #define CATEGORY_SYSTEM_LABEL_GL "Sistema" @@ -56775,7 +55199,7 @@ struct retro_core_options_v2 options_sr = { /* RETRO_LANGUAGE_SV */ #define CATEGORY_SYSTEM_LABEL_SV NULL -#define CATEGORY_SYSTEM_INFO_0_SV "Ändra val av basmaskinvara, region, BIOS och inställningar för Sega CD/Mega-CD-sparfil." +#define CATEGORY_SYSTEM_INFO_0_SV NULL #define CATEGORY_VIDEO_LABEL_SV NULL #define CATEGORY_VIDEO_INFO_0_SV "Ändra bildformat, beskärning, videofilter och inställningar för bildruteskippning." #define CATEGORY_AUDIO_LABEL_SV "Ljud" @@ -56812,19 +55236,19 @@ struct retro_core_options_v2 options_sr = { #define GENESIS_PLUS_GX_SYSTEM_BRAM_INFO_0_SV "När du kör Sega CD/Mega-CD-innehåll anger du om en enda sparfil ska delas mellan alla spel från en viss region (Per-BIOS) eller om en separat sparfil ska skapas för varje spel (Per-Game). Observera att Sega CD/Mega-CD har ett begränsat internt lagringsutrymme, som endast räcker till en handfull titlar. För att undvika att utrymmet tar slut rekommenderas inställningen ”Per-Game”." #define OPTION_VAL_PER_BIOS_SV NULL #define OPTION_VAL_PER_GAME_SV "Per-Spel" -#define GENESIS_PLUS_GX_CART_BRAM_LABEL_SV "CD Backup Cart BRAM (kräver omstart)" +#define GENESIS_PLUS_GX_CART_BRAM_LABEL_SV NULL #define GENESIS_PLUS_GX_CART_BRAM_INFO_0_SV "När du kör Sega CD/Mega-CD-innehåll anger du om en enda ramkassett för säkerhetskopiering ska delas för alla spel (Per-Cart) eller om en separat ramkassett för säkerhetskopiering ska skapas för varje spel (Per-Game)." -#define OPTION_VAL_PER_CART_SV "Per-kassett" -#define GENESIS_PLUS_GX_CART_SIZE_LABEL_SV "CD Backup Cart BRAM-storlek (kräver omstart)" -#define GENESIS_PLUS_GX_CART_SIZE_INFO_0_SV "Ställer in storleken på backup-ramkortet när du kör Sega CD/Mega-CD-innehåll. Användbart när du ställer in backup-ramkortet på Per spel för att undvika flera större kortstorlekar." +#define OPTION_VAL_PER_CART_SV NULL +#define GENESIS_PLUS_GX_CART_SIZE_LABEL_SV NULL +#define GENESIS_PLUS_GX_CART_SIZE_INFO_0_SV NULL #define OPTION_VAL_128K_SV NULL #define OPTION_VAL_256K_SV NULL #define OPTION_VAL_512K_SV NULL #define OPTION_VAL_1MEG_SV NULL #define OPTION_VAL_2MEG_SV NULL #define OPTION_VAL_4MEG_SV NULL -#define GENESIS_PLUS_GX_ADD_ON_LABEL_SV "CD-tillägg (MD-läge) (kräver omstart)" -#define GENESIS_PLUS_GX_ADD_ON_INFO_0_SV "Ange vilket tillägg som ska användas för uppspelning av CD-ljud med Mega Drive/Genesis-spel som stöds." +#define GENESIS_PLUS_GX_ADD_ON_LABEL_SV NULL +#define GENESIS_PLUS_GX_ADD_ON_INFO_0_SV NULL #define OPTION_VAL_SEGA_MEGA_CD_SV NULL #define OPTION_VAL_MEGASD_SV NULL #define OPTION_VAL_NONE_SV "Ingen" @@ -56840,15 +55264,15 @@ struct retro_core_options_v2 options_sr = { #define OPTION_VAL_4_3_SV NULL #define OPTION_VAL_UNCORRECTED_SV "Okorrigerad" #define GENESIS_PLUS_GX_OVERSCAN_LABEL_SV "Ramar" -#define GENESIS_PLUS_GX_OVERSCAN_INFO_0_SV "Aktivera detta för att visa överskanningsområdena längst upp/ned och/eller till vänster/höger på skärmen. Dessa skulle normalt vara dolda av ramen runt kanten på en standard-Tv." +#define GENESIS_PLUS_GX_OVERSCAN_INFO_0_SV NULL #define OPTION_VAL_TOP_BOTTOM_SV "Topp/Botten" #define OPTION_VAL_LEFT_RIGHT_SV "Vänster/Höger" #define OPTION_VAL_FULL_SV NULL #define GENESIS_PLUS_GX_LEFT_BORDER_LABEL_SV "Dölj sidokanter för Master System" -#define GENESIS_PLUS_GX_LEFT_BORDER_INFO_0_SV "Skär bort 8 bildpunkter från antingen vänster sida av skärmen eller från både vänster och höger sida när Master System-spel körs." +#define GENESIS_PLUS_GX_LEFT_BORDER_INFO_0_SV NULL #define OPTION_VAL_LEFT_BORDER_SV "Endast vänster ram" #define OPTION_VAL_LEFT_RIGHT_BORDERS_SV "Vänstra och högra ramar" -#define GENESIS_PLUS_GX_GG_EXTRA_LABEL_SV "Utökad skärm för Game Gear" +#define GENESIS_PLUS_GX_GG_EXTRA_LABEL_SV NULL #define GENESIS_PLUS_GX_GG_EXTRA_INFO_0_SV "Tvingar Game Gear-titlar att köras i SMS-läge, med en ökad upplösning på 256x192. Kan visa ytterligare innehåll, men visar vanligtvis en kant av korrupt/olämplig bilddata." #define GENESIS_PLUS_GX_BLARGG_NTSC_FILTER_LABEL_SV "Blargg NTSC-filter" #define GENESIS_PLUS_GX_BLARGG_NTSC_FILTER_INFO_0_SV "Använd ett videofilter för att efterlikna olika NTSC-TV-signaler." @@ -56868,8 +55292,8 @@ struct retro_core_options_v2 options_sr = { #define GENESIS_PLUS_GX_FRAMESKIP_THRESHOLD_LABEL_SV "Frameskip Tröskelvärde (%)" #define GENESIS_PLUS_GX_FRAMESKIP_THRESHOLD_INFO_0_SV "När 'Frameskip' är satt till 'Manuell', ange ljudbuffertens tröskel (i procent) under vilka ramar som kommer att hoppas över. Högre värden minskar risken för hackigt ljud genom att bildrutor tappas oftare." #define GENESIS_PLUS_GX_YM2413_LABEL_SV NULL -#define GENESIS_PLUS_GX_YM2413_INFO_0_SV "Aktivera emulering av FM-ljudkortet som används av vissa Sega Mark III/Master System-spel för förbättrad ljudutgång." -#define GENESIS_PLUS_GX_YM2413_CORE_LABEL_SV "Kärna för Master System FM (YM2413)" +#define GENESIS_PLUS_GX_YM2413_INFO_0_SV NULL +#define GENESIS_PLUS_GX_YM2413_CORE_LABEL_SV NULL #define GENESIS_PLUS_GX_YM2413_CORE_INFO_0_SV "Välj metod som används för att emulera FM-ljudenheten i Sega Mark III/Master System. ”MAME\"-alternativet är snabbt och körs i full hastighet på de flesta system. Alternativet ”Nuked” är cykelnoggrannt, av mycket hög kvalitet och har betydande CPU-krav." #define OPTION_VAL_MAME_SV NULL #define OPTION_VAL_NUKED_SV NULL @@ -56889,22 +55313,22 @@ struct retro_core_options_v2 options_sr = { #define GENESIS_PLUS_GX_AUDIO_FILTER_INFO_0_SV "Aktivera ett lågpassljudfilter för att bättre simulera det karakteristiska ljudet från en Model 1 Mega Drive/Genesis." #define OPTION_VAL_LOW_PASS_SV "Lågpass" #define OPTION_VAL_EQ_SV NULL -#define GENESIS_PLUS_GX_LOWPASS_RANGE_LABEL_SV "Lågpassfilter %" -#define GENESIS_PLUS_GX_LOWPASS_RANGE_INFO_0_SV "Ange gränsfrekvensen för ljudets lågpassfilter. Ett högre värde ökar den upplevda ”styrkan” hos filtret, eftersom ett bredare spektrum av höga frekvenser dämpas." -#define GENESIS_PLUS_GX_PSG_PREAMP_LABEL_SV "PSG-förförstärkarens nivå" -#define GENESIS_PLUS_GX_PSG_PREAMP_INFO_0_SV "Ställ in ljudförförstärkarnivån för den emulerade SN76496 4-kanals programmerbara ljudgeneratorn som finns i SG-1000, Sega Mark III, Master System, Game Gear och Mega Drive/Genesis." -#define GENESIS_PLUS_GX_FM_PREAMP_LABEL_SV "FM-förförstärkarnivå" -#define GENESIS_PLUS_GX_FM_PREAMP_INFO_0_SV "Ställ in ljudförförstärkarens nivå för den emulerade Mega Drive/Genesis FM-ljudsyntetisatorn eller Sega Mark III/Master System FM-ljudkällan." +#define GENESIS_PLUS_GX_LOWPASS_RANGE_LABEL_SV NULL +#define GENESIS_PLUS_GX_LOWPASS_RANGE_INFO_0_SV NULL +#define GENESIS_PLUS_GX_PSG_PREAMP_LABEL_SV NULL +#define GENESIS_PLUS_GX_PSG_PREAMP_INFO_0_SV NULL +#define GENESIS_PLUS_GX_FM_PREAMP_LABEL_SV NULL +#define GENESIS_PLUS_GX_FM_PREAMP_INFO_0_SV NULL #define GENESIS_PLUS_GX_CDDA_VOLUME_LABEL_SV "CD-DA-volym" #define GENESIS_PLUS_GX_CDDA_VOLUME_INFO_0_SV "Justera mixningsvolymen för den emulerade uppspelningen av CD-ljud." #define GENESIS_PLUS_GX_PCM_VOLUME_LABEL_SV "PCM-volym" -#define GENESIS_PLUS_GX_PCM_VOLUME_INFO_0_SV "Justera mixningsvolymen för den emulerade Sega CD/Mega-CD RF5C164 PCM-ljudgeneratorns utgång." +#define GENESIS_PLUS_GX_PCM_VOLUME_INFO_0_SV NULL #define GENESIS_PLUS_GX_AUDIO_EQ_LOW_LABEL_SV "EQ låg" -#define GENESIS_PLUS_GX_AUDIO_EQ_LOW_INFO_0_SV "Justera det låga frekvensområdet för den interna ljudequalizern." +#define GENESIS_PLUS_GX_AUDIO_EQ_LOW_INFO_0_SV NULL #define GENESIS_PLUS_GX_AUDIO_EQ_MID_LABEL_SV "EQ mid" -#define GENESIS_PLUS_GX_AUDIO_EQ_MID_INFO_0_SV "Justera det mellersta frekvensområdet för den interna ljudequalizern." +#define GENESIS_PLUS_GX_AUDIO_EQ_MID_INFO_0_SV NULL #define GENESIS_PLUS_GX_AUDIO_EQ_HIGH_LABEL_SV "EQ hög" -#define GENESIS_PLUS_GX_AUDIO_EQ_HIGH_INFO_0_SV "Justera det höga frekvensområdet för den interna ljudequalizern." +#define GENESIS_PLUS_GX_AUDIO_EQ_HIGH_INFO_0_SV NULL #define GENESIS_PLUS_GX_GUN_INPUT_LABEL_SV "Inmatning för ljuspistol" #define GENESIS_PLUS_GX_GUN_INPUT_INFO_0_SV "Använd en musstyrd 'ljuspistol' eller 'pekskärm'." #define OPTION_VAL_LIGHTGUN_SV "Ljuspistol" @@ -56912,13 +55336,13 @@ struct retro_core_options_v2 options_sr = { #define GENESIS_PLUS_GX_GUN_CURSOR_LABEL_SV "Visa hårkors för ljuspistol" #define GENESIS_PLUS_GX_GUN_CURSOR_INFO_0_SV "Visa hårkorset för ljuspistoler när du använder inmatningsenhetstyperna MD Menacer, MD Justifiers och MS Light Phaser." #define GENESIS_PLUS_GX_INVERT_MOUSE_LABEL_SV "Invertera musens Y-axel" -#define GENESIS_PLUS_GX_INVERT_MOUSE_INFO_0_SV "Inverterar Y-axeln för inmatningsenhetstypen MD Mouse." +#define GENESIS_PLUS_GX_INVERT_MOUSE_INFO_0_SV NULL #define GENESIS_PLUS_GX_NO_SPRITE_LIMIT_LABEL_SV "Ta bort blockfigursgräns per rad" -#define GENESIS_PLUS_GX_NO_SPRITE_LIMIT_INFO_0_SV "Tar bort den ursprungliga hårdvarubegränsningen för sprite per skanlinje. Detta minskar flimret men kan orsaka visuella störningar, eftersom vissa spel utnyttjar hårdvarubegränsningen för att skapa specialeffekter." -#define GENESIS_PLUS_GX_ENHANCED_VSCROLL_LABEL_SV "Förbättrad vertikal rullning per ruta" -#define GENESIS_PLUS_GX_ENHANCED_VSCROLL_INFO_0_SV "Gör det möjligt att bläddra vertikalt i varje enskild cell, istället för 16px 2-cell, genom att beräkna genomsnittet med vscroll-värdet för den angränsande cellen. Detta hack gäller endast för ett fåtal spel som använder 2-cell vertikalt bläddringsläge." -#define GENESIS_PLUS_GX_ENHANCED_VSCROLL_LIMIT_LABEL_SV "Förbättrad vertikal rullningsgräns per ruta" -#define GENESIS_PLUS_GX_ENHANCED_VSCROLL_LIMIT_INFO_0_SV "Endast när Förbättrad vertikal rullning per ruta är aktiverat. Justerar gränsen för förbättrad vertikal rullning. När skillnaden i vertikal rullning mellan angränsande rutor är större än denna gräns inaktiveras förbättringen." +#define GENESIS_PLUS_GX_NO_SPRITE_LIMIT_INFO_0_SV NULL +#define GENESIS_PLUS_GX_ENHANCED_VSCROLL_LABEL_SV NULL +#define GENESIS_PLUS_GX_ENHANCED_VSCROLL_INFO_0_SV NULL +#define GENESIS_PLUS_GX_ENHANCED_VSCROLL_LIMIT_LABEL_SV NULL +#define GENESIS_PLUS_GX_ENHANCED_VSCROLL_LIMIT_INFO_0_SV NULL #define GENESIS_PLUS_GX_OVERCLOCK_LABEL_SV "CPU-hastighet" #define GENESIS_PLUS_GX_OVERCLOCK_INFO_0_SV "Överklocka den emulerade processorn. Kan minska långsamheter, men kan orsaka glitchar." #define OPTION_VAL_100_SV NULL @@ -56942,9 +55366,9 @@ struct retro_core_options_v2 options_sr = { #define GENESIS_PLUS_GX_FORCE_DTACK_INFO_0_SV "Emulera systemlåsningar som inträffar på riktig hårdvara när man utför olaglig adressåtkomst. Detta bör endast inaktiveras när du spelar vissa demos och homebrew som förlitar sig på otillåtet beteende för korrekt funktion." #define GENESIS_PLUS_GX_ADDR_ERROR_LABEL_SV "68K-adressfel" #define GENESIS_PLUS_GX_ADDR_ERROR_INFO_0_SV "Mega Drive/Genesis huvudprocessor (Motorola 68000) genererar ett Address Error-undantag (krasch) när den försöker utföra ojusterad minnesåtkomst. Om du aktiverar detta kommer du att simulera detta beteende. Det bör endast inaktiveras när du spelar ROM-hack, eftersom dessa vanligtvis utvecklas med mindre exakta emulatorer och kan förlita sig på ogiltig RAM-åtkomst för korrekt funktion." -#define GENESIS_PLUS_GX_CD_LATENCY_LABEL_SV "CD-åtkomsttid" +#define GENESIS_PLUS_GX_CD_LATENCY_LABEL_SV NULL #define GENESIS_PLUS_GX_CD_LATENCY_INFO_0_SV "Simulera den ursprungliga CD-maskinvarans latens när du initierar en läsning eller sökning till en specifik plats på den inlästa skivan. Detta krävs av några CD-spel som kraschar om CD-data är tillgängliga för tidigt och åtgärdar även problem med desynkronisering av CD-ljud i vissa spel. Att inaktivera detta kan vara användbart med MSU-MD-spel eftersom det gör CD-ljudspårsloopar mer sömlösa." -#define GENESIS_PLUS_GX_CD_PRECACHE_LABEL_SV "CD-avbildningscache" +#define GENESIS_PLUS_GX_CD_PRECACHE_LABEL_SV NULL #define GENESIS_PLUS_GX_CD_PRECACHE_INFO_0_SV "Läs in cd-avbildning till minnet vid uppstart. CHD stöds endast. Kräver omstart." #define GENESIS_PLUS_GX_SHOW_ADVANCED_AUDIO_SETTINGS_LABEL_SV "Visa avancerade inställningar för ljudvolym (Öppnar menyn igen)" #define GENESIS_PLUS_GX_SHOW_ADVANCED_AUDIO_SETTINGS_INFO_0_SV "Aktiverar konfiguration av parametrar för lågnivå-ljudkanaler. OBS: Snabbmenyn måste vara aktiverad för att den här inställningen ska träda i kraft." ================================================ FILE: packages/sx05re/libretro/geolith/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present EmuELEC (https://github.com/emuelec) PKG_NAME="geolith" PKG_VERSION="b683c2f712a6647c69326961a90cf1990e25ccea" PKG_SHA256="8a18d404e2e3c6304cc2fc52aa1b816ba147b83963b3a576ad2ac1b13ee45c2b" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/geolith-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Highly accurate emulator for the Neo Geo AES and MVS Cartridge Systems" PKG_TOOLCHAIN="make" make_target() { cd libretro make -f ./Makefile platform=rpi3_64 } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp geolith_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/gme/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="gme" PKG_VERSION="de22a26ae9ed8f0eb739bce8990fe175677edcf8" PKG_SHA256="4974eff7d22f599e1f1780f31da96a713850c697d6b24b7c34e4c510ddcc2859" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/libretro-gme" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of blargg's Game_Music_Emu library." PKG_LONGDESC="Port of blargg's Game_Music_Emu library." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp gme_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/gpsp/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="gpsp" PKG_VERSION="74db5e5c73020626a1118b97d3735b5636d65d9d" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/gpsp" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="gpSP for libretro" PKG_TOOLCHAIN="make" pre_make_target() { PKG_MAKE_OPTS_TARGET="CC=${CC}" if [ "${ARCH}" = "arm" ]; then PKG_MAKE_OPTS_TARGET+=" platform=armv" elif [ "${ARCH}" = "aarch64" ]; then PKG_MAKE_OPTS_TARGET+=" platform=arm64" fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp -v gpsp_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/gw-libretro/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="gw-libretro" PKG_VERSION="435e5cfd4bf6aea03a84259e9b8dba3daf3ff5bd" PKG_SHA256="610f613aedb6182b00bd4231e53d4350977b97e28f6f551cec138ef810cbb761" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/gw-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="A libretro core for Game & Watch simulators " PKG_LONGDESC="A libretro core for Game & Watch simulators " PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make -f Makefile.libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp gw_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/handy/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="handy" PKG_VERSION="fca239207e9c111da3e85d2faf0b1b9d7524e498" PKG_SHA256="0e73ed43f7a2768130e110ef6a84d7df8850976daa328405f5e89a2d6db4cb96" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Zlib" PKG_SITE="https://github.com/libretro/libretro-handy" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="K. Wilkins' Atari Lynx emulator Handy for libretro" PKG_LONGDESC="Handy is an Atari Lynx Emulator for Windows 95/98/NT/2000. Handy was the original name of the Lynx project that was started at Epyx and then finished by Atari." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" if [ ${ARCH} = "aarch64" ]; then PKG_MAKE_OPTS_TARGET=" platform=emuelec" else PKG_MAKE_OPTS_TARGET=" platform=classic_armv8_a35" fi makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp handy_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/handy/patches/aarch64/handy-01-add-emuelec.patch ================================================ --- a/Makefile +++ b/Makefile @@ -245,7 +245,7 @@ # (armv8 a35, hard point, neon based) ### # Playstation Classic -else ifeq ($(platform), classic_armv8_a35) +else ifeq ($(platform), emuelec) TARGET := $(TARGET_NAME)_libretro.so fpic := -fPIC SHARED := -shared -Wl,-version-script=$(LIBRETRO_DIR)/link.T -Wl,-no-undefined @@ -256,9 +256,9 @@ -falign-functions=1 -falign-jumps=1 -falign-loops=1 \ -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-unroll-loops \ -fmerge-all-constants -fno-math-errno \ - -marm -mtune=cortex-a35 -mfpu=neon-fp-armv8 -mfloat-abi=hard + -mtune=cortex-a72 #-mfpu=neon-fp-armv8 -mfloat-abi=hard HAVE_NEON = 1 - ARCH = arm + ARCH = aarch64 ifeq ($(shell echo `$(CC) -dumpversion` "< 4.9" | bc -l), 1) CFLAGS += -march=armv8-a else ================================================ FILE: packages/sx05re/libretro/hatari/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="hatari" PKG_VERSION="7008194d3f951a157997f67a820578f56f7feee0" PKG_SHA256="05f9da703fb5030aa5424e53a35d9b310d183b3b48aa777504e796c88fdd3da2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/hatari" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="New rebasing of Hatari based on Mercurial upstream. Tries to be a shallow fork for easy upstreaming later on." PKG_LONGDESC="New rebasing of Hatari based on Mercurial upstream. Tries to be a shallow fork for easy upstreaming later on." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" PKG_USE_CMAKE="no" configure_target() { : } make_target() { if [ "${ARCH}" == "arm" ]; then CFLAGS="${CFLAGS} -DNO_ASM -DARM -D__arm__ -DARM_ASM -DNOSSE -DARM_HARDFP" fi make -C .. -f Makefile.libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ../hatari_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/imame4all/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="imame4all" PKG_VERSION="2ec60f6e1078cf9ba173e80432cc28fd4eea200f" PKG_SHA256="e9e39e0153970729a2b81898af140749118db56be2920600bcff29fe13c59658" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MAME" PKG_SITE="https://github.com/libretro/imame4all-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="A port of iMAME4all to libretro" PKG_LONGDESC="A port of iMAME4all to libretro" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make -f makefile.libretro ARM=1 } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp libretro.so ${INSTALL}/usr/lib/libretro/imame4all_libretro.so } ================================================ FILE: packages/sx05re/libretro/jaxe/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # EmuELEC / LibreELEC package for JAXE libretro core PKG_NAME="jaxe" PKG_VERSION="e8e90e3d683bb560df5882f0ad62ed28f96a541a" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/kurtjd/jaxe" PKG_URL="${PKG_SITE}.git" PKG_GIT_CLONE_BRANCH="main" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="emuelec/libretro" PKG_SHORTDESC="JAXE CHIP-8/S-CHIP/XO-CHIP libretro core" PKG_LONGDESC="JAXE is a CHIP-8 / S-CHIP / XO-CHIP emulator with a libretro frontend." PKG_TOOLCHAIN="make" post_unpack() { cd "${PKG_BUILD}" git submodule update --init --recursive } make_target() { cd "${PKG_BUILD}" make -f Makefile.libretro \ CC="${CC}" \ CXX="${CXX}" \ AR="${AR}" \ RANLIB="${RANLIB}" \ platform=unix } makeinstall_target() { mkdir -p "${INSTALL}/usr/lib/libretro" cp "${PKG_BUILD}/jaxe_libretro.so" "${INSTALL}/usr/lib/libretro/" } ================================================ FILE: packages/sx05re/libretro/jollycv/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present PKG_NAME="jollycv" PKG_VERSION="5b01c1e43f9040bfae25cc9f9dfb14d73951ec3c" PKG_SHA256="" PKG_LICENSE="BSD-3-Clause" PKG_SITE="https://github.com/libretro/jollycv" PKG_URL="https://github.com/libretro/jollycv/archive/${PKG_VERSION}.tar.gz" PKG_ARCH="any" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="emuelec/libretro" PKG_SHORTDESC="JollyCV libretro core (ColecoVision/CreatiVision/My Vision)" PKG_LONGDESC="Libretro core port of JollyCV (ColecoVision/CreatiVision/My Vision)." PKG_TOOLCHAIN="make" PKG_MAKE_OPTS_TARGET="-C libretro platform=unix" makeinstall_target() { mkdir -p "${INSTALL}/usr/lib/libretro" cp "${PKG_BUILD}/libretro/jollycv_libretro.so" "${INSTALL}/usr/lib/libretro/" } ================================================ FILE: packages/sx05re/libretro/libretro-bash-launcher/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="libretro-bash-launcher" PKG_VERSION="78b40429be72950e467ec73b7bc90b8c45dd0fce" PKG_SHA256="dd87405a7ac24d559f5daa8bab18be86a3e3276a345510929dfe8ec8ec092162" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/SwedishGojira/libretro-bash-launcher" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Use bash scripts to run apps/games from RetroArch/libretro" PKG_LONGDESC="Use bash scripts to run apps/games from RetroArch/libretro" PKG_TOOLCHAIN="make" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp `find . -name "*.so" | xargs echo` ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/lowresnx/package.mk ================================================ # SPDX-License-Identifier: Zlib # LowRes NX (libretro core) for EmuELEC # Source: https://github.com/timoinutilis/lowres-nx PKG_NAME="lowresnx" PKG_VERSION="12aeb16" PKG_SHA256="c59b1e64e845658aa3baa262e2231a4b28bc98b3be29e9e1f030c31d358e351e" PKG_LICENSE="Zlib" PKG_SITE="https://github.com/timoinutilis/lowres-nx" PKG_URL="https://github.com/timoinutilis/lowres-nx/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="emuelec/libretro" PKG_SHORTDESC="LowRes NX (libretro core)" PKG_LONGDESC="LowRes NX fantasy console (BASIC) - libretro core." PKG_TOOLCHAIN="make" PKG_MAKE_OPTS_TARGET="platform=unix" make_target() { make -C platform/LibRetro ${PKG_MAKE_OPTS_TARGET} } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp -v platform/LibRetro/lowresnx_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/lr-dolphin/package.mk ================================================ PKG_NAME="lr-dolphin" PKG_VERSION="bfac84ab609696a96a24261fd3bb5f12e90c2409" PKG_ARCH="x86_64 aarch64" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/dolphin" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements." PKG_TOOLCHAIN="cmake" if [ "${OPENGL_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGL}" fi if [ "${OPENGLES_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi if [ "${VULKAN_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${VULKAN}" fi PKG_CMAKE_OPTS_TARGET="-DENABLE_X11=OFF \ -DLIBRETRO=ON \ -DENABLE_NOGUI=OFF \ -DENABLE_QT=OFF \ -DENABLE_TESTS=OFF \ -DUSE_DISCORD_PRESENCE=OFF \ -DBUILD_SHARED_LIBS=OFF \ -DCMAKE_BUILD_TYPE=Release" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp -v ${PKG_BUILD}/.${TARGET_NAME}/dolphin_libretro.so ${INSTALL}/usr/lib/libretro/ mkdir -p ${INSTALL}/usr/share/retroarch-system/dolphin-emu cp -vr ${PKG_BUILD}/Data/Sys ${INSTALL}/usr/share/retroarch-system/dolphin-emu/ } ================================================ FILE: packages/sx05re/libretro/lr-dolphin/patches/001-openglmessage.patch ================================================ diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 5206c47..1aa4048 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -738,14 +738,14 @@ Renderer::Renderer(std::unique_ptr main_gl_context, float backbuffer_ g_ogl_config.gl_renderer, g_ogl_config.gl_version), 5000); - if (!g_ogl_config.bSupportsGLBufferStorage && !g_ogl_config.bSupportsGLPinnedMemory) - { - OSD::AddMessage(StringFromFormat("Your OpenGL driver does not support %s_buffer_storage.", - m_main_gl_context->IsGLES() ? "EXT" : "ARB"), - 60000); - OSD::AddMessage("This device's performance will be terrible.", 60000); - OSD::AddMessage("Please ask your device vendor for an updated OpenGL driver.", 60000); - } + //if (!g_ogl_config.bSupportsGLBufferStorage && !g_ogl_config.bSupportsGLPinnedMemory) + //{ + // OSD::AddMessage(StringFromFormat("Your OpenGL driver does not support %s_buffer_storage.", + // m_main_gl_context->IsGLES() ? "EXT" : "ARB"), + // 60000); + // OSD::AddMessage("This device's performance will be terrible.", 60000); + // OSD::AddMessage("Please ask your device vendor for an updated OpenGL driver.", 60000); + //} WARN_LOG(VIDEO, "Missing OGL Extensions: %s%s%s%s%s%s%s%s%s%s%s%s%s%s", g_ActiveConfig.backend_info.bSupportsDualSourceBlend ? "" : "DualSourceBlend ", ================================================ FILE: packages/sx05re/libretro/lr-dolphin/patches/dolphin-01-buildfix-libusb.patch ================================================ diff --git a/Externals/hidapi/libusb/hid.c b/Externals/hidapi/libusb/hid.c index a23bf46125..c82718636f 100644 --- a/Externals/hidapi/libusb/hid.c +++ b/Externals/hidapi/libusb/hid.c @@ -44,7 +44,7 @@ #include /* GNU / LibUSB */ -#include +#include #ifndef __ANDROID__ #include #endif ================================================ FILE: packages/sx05re/libretro/lutro/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="lutro" PKG_VERSION="b84d0605e847e07657a44a1a11374a03a6e8a489" PKG_SHA256="aa58df3d85873a3ca79841ad565dde65de64484664b01ee3352d8ee356b48f86" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/libretro/libretro-lutro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="An experimental lua game framework for libretro inspired by LÖVE" PKG_LONGDESC="An experimental lua game framework for libretro inspired by LÖVE" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" pre_make_target() { # Fix luajit cross-compilation issue # This replaces the need for the broken patch file sed -i '/deps\/luajit\/src\/libluajit.a:/,/^$/s|^\t\$(MAKE) -C deps/luajit/src BUILDMODE=static|\t$(MAKE) -C deps/luajit/src HOST_CC="$(HOST_CC) $(PTR_SIZE)" CROSS="$(CROSS)" BUILDMODE=static|' Makefile } make_target() { PTR_SIZE="-m32" if [ "${ARCH}" == "x86_64" ]; then PTR_SIZE="-m64" fi make HOST_CC="${HOST_CC}" PTR_SIZE="${PTR_SIZE}" CROSS="${TARGET_PREFIX}" HAVE_COMPOSITION=1 } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp lutro_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/m2000/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # EmuELEC package for M2000 libretro core (Philips P2000T) PKG_NAME="m2000" PKG_VERSION="0.9.4" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/p2000t/M2000" PKG_URL="${PKG_SITE}/archive/refs/tags/v${PKG_VERSION}.tar.gz" PKG_SOURCE_DIR="M2000-${PKG_VERSION}" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="emuelec/libretro" PKG_SHORTDESC="Philips P2000T (M2000) libretro core" PKG_LONGDESC="M2000 is an emulator for the Philips P2000T home computer, here built as a libretro core." PKG_TOOLCHAIN="make" make_target() { make -C "${PKG_BUILD}/src/libretro" \ CC="${CC}" \ CXX="${CXX}" \ AR="${AR}" \ platform=unix } makeinstall_target() { mkdir -p "${INSTALL}/usr/lib/libretro" cp "${PKG_BUILD}/src/libretro/m2000_libretro.so" \ "${INSTALL}/usr/lib/libretro/" } ================================================ FILE: packages/sx05re/libretro/mame/config/MAME/MAME.opt ================================================ mame_alternate_renderer = "disabled" mame_altres = "640x480" mame_auto_save = "disabled" mame_autoloadfastforward = "disabled" mame_boot_to_bios = "disabled" mame_boot_to_osd = "disabled" mame_buttons_profiles = "disabled" mame_cheats_enable = "disabled" mame_cpu_overclock = "default" mame_joystick_deadzone = "0.15" mame_joystick_saturation = "0.85" mame_joystick_threshold = "0.30" mame_lightgun_mode = "none" mame_lightgun_offscreen_mode = "free" mame_mame_4way_enable = "disabled" mame_mame_paths_enable = "enabled" mame_media_type = "rom" mame_mouse_enable = "enabled" mame_read_config = "enabled" mame_rotation_mode = "libretro" mame_saves = "game" mame_softlists_auto_media = "enabled" mame_softlists_enable = "enabled" mame_thread_mode = "enabled" mame_throttle = "disabled" mame_write_config = "enabled" ================================================ FILE: packages/sx05re/libretro/mame/config/ini/fmtownsftv.ini ================================================ # # CORE CONFIGURATION OPTIONS # readconfig 1 writeconfig 1 # # CORE SEARCH PATH OPTIONS # homepath /storage/roms/bios/mame/ rompath /storage/roms/fmtownsux hashpath /storage/roms/bios/mame/hash samplepath /storage/roms/bios/mame/samples artpath /storage/roms/bios/mame/artwork ctrlrpath system/mame/ctrlr inipath /storage/roms/bios/mame/ini fontpath system/mame/ cheatpath /storage/roms/bios/mame/cheat crosshairpath system/mame/crosshair pluginspath /storage/roms/bios/mame/plugins languagepath system/mame/language swpath system/mame/software # # CORE OUTPUT DIRECTORY OPTIONS # cfg_directory /storage/roms/mame/fmtownsux/raiden//mame/cfg nvram_directory /storage/roms/mame/fmtownsux/raiden//mame/nvram input_directory /storage/roms/mame/fmtownsux/raiden//mame/input state_directory /storage/roms/mame/fmtownsux/raiden//mame/states snapshot_directory /storage/roms/mame/fmtownsux/raiden//mame/snaps diff_directory /storage/roms/mame/fmtownsux/raiden//mame/diff comment_directory system/mame/comments share_directory system/mame/share # # CORE STATE/PLAYBACK OPTIONS # state autosave 0 rewind 0 rewind_capacity 100 playback record exit_after_playback 0 mngwrite aviwrite wavwrite snapname %g/%i snapsize auto snapview auto snapbilinear 1 statename %g/mouse burnin 0 # # CORE PERFORMANCE OPTIONS # autoframeskip 0 frameskip 0 seconds_to_run 0 throttle 0 sleep 1 speed 1.0 refreshspeed 0 lowlatency 0 # # CORE RENDER OPTIONS # keepaspect 1 unevenstretch 1 unevenstretchx 0 unevenstretchy 0 autostretchxy 0 intoverscan 0 intscalex 0 intscaley 0 # # CORE ROTATION OPTIONS # rotate 0 ror 0 rol 0 autoror 0 autorol 0 flipx 0 flipy 0 # # CORE ARTWORK OPTIONS # artwork_crop 0 fallback_artwork override_artwork # # CORE SCREEN OPTIONS # brightness 1.0 contrast 1.0 gamma 1.0 pause_brightness 0.65 effect none # # CORE VECTOR OPTIONS # beam_width_min 1.0 beam_width_max 1.0 beam_dot_size 1.0 beam_intensity_weight 0 flicker 0 # # CORE SOUND OPTIONS # samplerate 48000 samples 1 volume 0 compressor 1 speaker_report 0 # # CORE INPUT OPTIONS # coin_lockout 1 ctrlr mouse 1 joystick 1 lightgun 0 multikeyboard 0 multimouse 1 steadykey 0 ui_active 1 offscreen_reload 0 joystick_map auto joystick_deadzone 0.15 joystick_saturation 0.85 joystick_threshold 0.30 natural 0 joystick_contradictory 0 coin_impulse 0 # # CORE INPUT AUTOMATIC ENABLE OPTIONS # paddle_device keyboard adstick_device keyboard pedal_device keyboard dial_device keyboard trackball_device keyboard lightgun_device keyboard positional_device keyboard mouse_device mouse # # CORE DEBUGGING OPTIONS # verbose 0 log 0 oslog 0 debug 0 update_in_pause 1 debugscript debuglog 0 # # CORE COMM OPTIONS # comm_localhost 0.0.0.0 comm_localport 15112 comm_remotehost 127.0.0.1 comm_remoteport 15112 comm_framesync 0 # # CORE MISC OPTIONS # drc 1 drc_use_c 0 drc_log_uml 0 drc_log_native 0 bios cheat 0 skip_gameinfo 0 uifont default ui cabinet ramsize 6M confirm_quit 0 ui_mouse 1 language nvram_save 1 # # SCRIPTING OPTIONS # autoboot_command autoboot_delay 0 autoboot_script console 0 plugins 1 plugin noplugin # # HTTP SERVER OPTIONS # http 0 http_port 8080 http_root web # # OSD INPUT MAPPING OPTIONS # uimodekey auto controller_map none background_input 0 # # OSD FONT OPTIONS # uifontprovider auto # # OSD OUTPUT OPTIONS # output auto # # OSD INPUT OPTIONS # keyboardprovider auto mouseprovider auto lightgunprovider auto joystickprovider auto # # OSD DEBUGGING OPTIONS # debugger auto debugger_port 23946 debugger_font auto debugger_font_size 0 watchdog 0 # # OSD PERFORMANCE OPTIONS # numprocessors auto bench 0 # # OSD VIDEO OPTIONS # video auto numscreens 1 window 0 maximize 1 waitvsync 0 syncrefresh 0 monitorprovider auto # # OSD PER-WINDOW VIDEO OPTIONS # screen auto aspect auto resolution auto view auto screen0 auto aspect0 auto resolution0 auto view0 auto screen1 auto aspect1 auto resolution1 auto view1 auto screen2 auto aspect2 auto resolution2 auto view2 auto screen3 auto aspect3 auto resolution3 auto view3 auto # # OSD FULL SCREEN OPTIONS # switchres 0 # # OSD ACCELERATED VIDEO OPTIONS # filter 1 prescale 1 # # OSD SOUND OPTIONS # sound auto audio_latency 2 # # OSD MIDI OPTIONS # midiprovider auto # # OSD EMULATED NETWORKING OPTIONS # networkprovider auto # # BGFX POST-PROCESSING OPTIONS # bgfx_path bgfx bgfx_backend auto bgfx_debug 0 bgfx_screen_chains bgfx_shadow_mask slot-mask.png bgfx_lut lut-default.png bgfx_avi_name auto # # SDL VIDEO OPTIONS # centerh 1 centerv 1 scalemode none # # SDL JOYSTICK MAPPING # joy_idx1 auto joy_idx2 auto joy_idx3 auto joy_idx4 auto joy_idx5 auto joy_idx6 auto joy_idx7 auto joy_idx8 auto sixaxis 0 # # SDL MOUSE MAPPING # mouse_index1 auto mouse_index2 auto mouse_index3 auto mouse_index4 auto mouse_index5 auto mouse_index6 auto mouse_index7 auto mouse_index8 auto # # SDL KEYBOARD MAPPING # keyb_idx1 auto keyb_idx2 auto keyb_idx3 auto keyb_idx4 auto keyb_idx5 auto keyb_idx6 auto keyb_idx7 auto keyb_idx8 auto # # FRONTEND COMMAND OPTIONS # dtd 1 # # SLOT DEVICES # pad1 townspad pad2 mouse # # IMAGE DEVICES # floppydisk1 floppydisk2 cdrom "/storage/roms/fmtownsux/mahoudai/mahou daisakusen (japan).chd" memcard harddisk1 harddisk2 harddisk3 harddisk4 harddisk5 ================================================ FILE: packages/sx05re/libretro/mame/config/ini/fmtownshr.ini ================================================ # # CORE CONFIGURATION OPTIONS # readconfig 1 writeconfig 1 # # CORE SEARCH PATH OPTIONS # homepath /storage/roms/bios/mame/ rompath /storage/roms/fmtownsux hashpath /storage/roms/bios/mame/hash samplepath /storage/roms/bios/mame/samples artpath /storage/roms/bios/mame/artwork ctrlrpath system/mame/ctrlr inipath /storage/roms/bios/mame/ini fontpath system/mame/ cheatpath /storage/roms/bios/mame/cheat crosshairpath system/mame/crosshair pluginspath /storage/roms/bios/mame/plugins languagepath system/mame/language swpath system/mame/software # # CORE OUTPUT DIRECTORY OPTIONS # cfg_directory /storage/roms/mame/fmtownsux/raiden//mame/cfg nvram_directory /storage/roms/mame/fmtownsux/raiden//mame/nvram input_directory /storage/roms/mame/fmtownsux/raiden//mame/input state_directory /storage/roms/mame/fmtownsux/raiden//mame/states snapshot_directory /storage/roms/mame/fmtownsux/raiden//mame/snaps diff_directory /storage/roms/mame/fmtownsux/raiden//mame/diff comment_directory system/mame/comments share_directory system/mame/share # # CORE STATE/PLAYBACK OPTIONS # state autosave 0 rewind 0 rewind_capacity 100 playback record exit_after_playback 0 mngwrite aviwrite wavwrite snapname %g/%i snapsize auto snapview auto snapbilinear 1 statename %g/-ui_active burnin 0 # # CORE PERFORMANCE OPTIONS # autoframeskip 0 frameskip 0 seconds_to_run 0 throttle 0 sleep 1 speed 1.0 refreshspeed 0 lowlatency 0 # # CORE RENDER OPTIONS # keepaspect 1 unevenstretch 1 unevenstretchx 0 unevenstretchy 0 autostretchxy 0 intoverscan 0 intscalex 0 intscaley 0 # # CORE ROTATION OPTIONS # rotate 0 ror 0 rol 0 autoror 0 autorol 0 flipx 0 flipy 0 # # CORE ARTWORK OPTIONS # artwork_crop 0 fallback_artwork override_artwork # # CORE SCREEN OPTIONS # brightness 1.0 contrast 1.0 gamma 1.0 pause_brightness 0.65 effect none # # CORE VECTOR OPTIONS # beam_width_min 1.0 beam_width_max 1.0 beam_dot_size 1.0 beam_intensity_weight 0 flicker 0 # # CORE SOUND OPTIONS # samplerate 48000 samples 1 volume 0 compressor 1 speaker_report 0 # # CORE INPUT OPTIONS # coin_lockout 1 ctrlr mouse 1 joystick 1 lightgun 0 multikeyboard 0 multimouse 1 steadykey 0 ui_active 1 offscreen_reload 0 joystick_map auto joystick_deadzone 0.15 joystick_saturation 0.85 joystick_threshold 0.30 natural 0 joystick_contradictory 0 coin_impulse 0 # # CORE INPUT AUTOMATIC ENABLE OPTIONS # paddle_device keyboard adstick_device keyboard pedal_device keyboard dial_device keyboard trackball_device keyboard lightgun_device keyboard positional_device keyboard mouse_device mouse # # CORE DEBUGGING OPTIONS # verbose 0 log 0 oslog 0 debug 0 update_in_pause 1 debugscript debuglog 0 # # CORE COMM OPTIONS # comm_localhost 0.0.0.0 comm_localport 15112 comm_remotehost 127.0.0.1 comm_remoteport 15112 comm_framesync 0 # # CORE MISC OPTIONS # drc 1 drc_use_c 0 drc_log_uml 0 drc_log_native 0 bios cheat 0 skip_gameinfo 0 uifont default ui cabinet ramsize 2M confirm_quit 0 ui_mouse 1 language nvram_save 1 # # SCRIPTING OPTIONS # autoboot_command autoboot_delay 0 autoboot_script console 0 plugins 1 plugin noplugin # # HTTP SERVER OPTIONS # http 0 http_port 8080 http_root web # # OSD INPUT MAPPING OPTIONS # uimodekey auto controller_map none background_input 0 # # OSD FONT OPTIONS # uifontprovider auto # # OSD OUTPUT OPTIONS # output auto # # OSD INPUT OPTIONS # keyboardprovider auto mouseprovider auto lightgunprovider auto joystickprovider auto # # OSD DEBUGGING OPTIONS # debugger auto debugger_port 23946 debugger_font auto debugger_font_size 0 watchdog 0 # # OSD PERFORMANCE OPTIONS # numprocessors auto bench 0 # # OSD VIDEO OPTIONS # video auto numscreens 1 window 0 maximize 1 waitvsync 0 syncrefresh 0 monitorprovider auto # # OSD PER-WINDOW VIDEO OPTIONS # screen auto aspect auto resolution auto view auto screen0 auto aspect0 auto resolution0 auto view0 auto screen1 auto aspect1 auto resolution1 auto view1 auto screen2 auto aspect2 auto resolution2 auto view2 auto screen3 auto aspect3 auto resolution3 auto view3 auto # # OSD FULL SCREEN OPTIONS # switchres 0 # # OSD ACCELERATED VIDEO OPTIONS # filter 1 prescale 1 # # OSD SOUND OPTIONS # sound auto audio_latency 2 # # OSD MIDI OPTIONS # midiprovider auto # # OSD EMULATED NETWORKING OPTIONS # networkprovider auto # # BGFX POST-PROCESSING OPTIONS # bgfx_path bgfx bgfx_backend auto bgfx_debug 0 bgfx_screen_chains bgfx_shadow_mask slot-mask.png bgfx_lut lut-default.png bgfx_avi_name auto # # SDL VIDEO OPTIONS # centerh 1 centerv 1 scalemode none # # SDL JOYSTICK MAPPING # joy_idx1 auto joy_idx2 auto joy_idx3 auto joy_idx4 auto joy_idx5 auto joy_idx6 auto joy_idx7 auto joy_idx8 auto sixaxis 0 # # SDL MOUSE MAPPING # mouse_index1 auto mouse_index2 auto mouse_index3 auto mouse_index4 auto mouse_index5 auto mouse_index6 auto mouse_index7 auto mouse_index8 auto # # SDL KEYBOARD MAPPING # keyb_idx1 auto keyb_idx2 auto keyb_idx3 auto keyb_idx4 auto keyb_idx5 auto keyb_idx6 auto keyb_idx7 auto keyb_idx8 auto # # FRONTEND COMMAND OPTIONS # dtd 1 # # SLOT DEVICES # pad1 townspad pad2 mouse # # IMAGE DEVICES # floppydisk1 /storage/roms/fmtownsux/rbisland/disk1.hdm floppydisk2 cdrom "/storage/roms/fmtownsux/rbisland/rainbow islands - the story of bubble bobble 2 - extra version (japan).chd" memcard harddisk1 harddisk2 harddisk3 harddisk4 harddisk5 ================================================ FILE: packages/sx05re/libretro/mame/config/ini/fmtownsux.ini ================================================ # # CORE CONFIGURATION OPTIONS # readconfig 1 writeconfig 1 # # CORE SEARCH PATH OPTIONS # homepath /storage/roms/bios/mame/ rompath /storage/roms/fmtownsux hashpath /storage/roms/bios/mame/hash samplepath /storage/roms/bios/mame/samples artpath /storage/roms/bios/mame/artwork ctrlrpath system/mame/ctrlr inipath /storage/roms/bios/mame/ini fontpath system/mame/ cheatpath /storage/roms/bios/mame/cheat crosshairpath system/mame/crosshair pluginspath /storage/roms/bios/mame/plugins languagepath system/mame/language swpath system/mame/software # # CORE OUTPUT DIRECTORY OPTIONS # cfg_directory /storage/roms/mame/fmtownsux/raiden//mame/cfg nvram_directory /storage/roms/mame/fmtownsux/raiden//mame/nvram input_directory /storage/roms/mame/fmtownsux/raiden//mame/input state_directory /storage/roms/mame/fmtownsux/raiden//mame/states snapshot_directory /storage/roms/mame/fmtownsux/raiden//mame/snaps diff_directory /storage/roms/mame/fmtownsux/raiden//mame/diff comment_directory system/mame/comments share_directory system/mame/share # # CORE STATE/PLAYBACK OPTIONS # state autosave 0 rewind 0 rewind_capacity 100 playback record exit_after_playback 0 mngwrite aviwrite wavwrite snapname %g/%i snapsize auto snapview auto snapbilinear 1 statename %g/mouse burnin 0 # # CORE PERFORMANCE OPTIONS # autoframeskip 0 frameskip 0 seconds_to_run 0 throttle 0 sleep 1 speed 1.0 refreshspeed 0 lowlatency 0 # # CORE RENDER OPTIONS # keepaspect 1 unevenstretch 1 unevenstretchx 0 unevenstretchy 0 autostretchxy 0 intoverscan 0 intscalex 0 intscaley 0 # # CORE ROTATION OPTIONS # rotate 0 ror 0 rol 0 autoror 0 autorol 0 flipx 0 flipy 0 # # CORE ARTWORK OPTIONS # artwork_crop 0 fallback_artwork override_artwork # # CORE SCREEN OPTIONS # brightness 1.0 contrast 1.0 gamma 1.0 pause_brightness 0.65 effect none # # CORE VECTOR OPTIONS # beam_width_min 1.0 beam_width_max 1.0 beam_dot_size 1.0 beam_intensity_weight 0 flicker 0 # # CORE SOUND OPTIONS # samplerate 48000 samples 1 volume 0 compressor 1 speaker_report 0 # # CORE INPUT OPTIONS # coin_lockout 1 ctrlr mouse 1 joystick 1 lightgun 0 multikeyboard 0 multimouse 1 steadykey 0 ui_active 1 offscreen_reload 0 joystick_map auto joystick_deadzone 0.15 joystick_saturation 0.85 joystick_threshold 0.30 natural 0 joystick_contradictory 0 coin_impulse 0 # # CORE INPUT AUTOMATIC ENABLE OPTIONS # paddle_device keyboard adstick_device keyboard pedal_device keyboard dial_device keyboard trackball_device keyboard lightgun_device keyboard positional_device keyboard mouse_device mouse # # CORE DEBUGGING OPTIONS # verbose 1 log 0 oslog 0 debug 0 update_in_pause 1 debugscript debuglog 0 # # CORE COMM OPTIONS # comm_localhost 0.0.0.0 comm_localport 15112 comm_remotehost 127.0.0.1 comm_remoteport 15112 comm_framesync 0 # # CORE MISC OPTIONS # drc 1 drc_use_c 0 drc_log_uml 0 drc_log_native 0 bios cheat 0 skip_gameinfo 0 uifont default ui cabinet ramsize 6M confirm_quit 0 ui_mouse 1 language nvram_save 1 # # SCRIPTING OPTIONS # autoboot_command autoboot_delay 0 autoboot_script console 0 plugins 1 plugin noplugin # # HTTP SERVER OPTIONS # http 0 http_port 8080 http_root web # # OSD INPUT MAPPING OPTIONS # uimodekey auto controller_map none background_input 0 # # OSD FONT OPTIONS # uifontprovider auto # # OSD OUTPUT OPTIONS # output auto # # OSD INPUT OPTIONS # keyboardprovider auto mouseprovider auto lightgunprovider auto joystickprovider auto # # OSD DEBUGGING OPTIONS # debugger auto debugger_port 23946 debugger_font auto debugger_font_size 0 watchdog 0 # # OSD PERFORMANCE OPTIONS # numprocessors auto bench 0 # # OSD VIDEO OPTIONS # video auto numscreens 1 window 0 maximize 1 waitvsync 0 syncrefresh 0 monitorprovider auto # # OSD PER-WINDOW VIDEO OPTIONS # screen auto aspect auto resolution auto view auto screen0 auto aspect0 auto resolution0 auto view0 auto screen1 auto aspect1 auto resolution1 auto view1 auto screen2 auto aspect2 auto resolution2 auto view2 auto screen3 auto aspect3 auto resolution3 auto view3 auto # # OSD FULL SCREEN OPTIONS # switchres 0 # # OSD ACCELERATED VIDEO OPTIONS # filter 1 prescale 1 # # OSD SOUND OPTIONS # sound auto audio_latency 2 # # OSD MIDI OPTIONS # midiprovider auto # # OSD EMULATED NETWORKING OPTIONS # networkprovider auto # # BGFX POST-PROCESSING OPTIONS # bgfx_path bgfx bgfx_backend auto bgfx_debug 0 bgfx_screen_chains default bgfx_shadow_mask slot-mask.png bgfx_lut lut-default.png bgfx_avi_name auto # # SDL VIDEO OPTIONS # centerh 1 centerv 1 scalemode none # # SDL JOYSTICK MAPPING # joy_idx1 auto joy_idx2 auto joy_idx3 auto joy_idx4 auto joy_idx5 auto joy_idx6 auto joy_idx7 auto joy_idx8 auto sixaxis 0 # # SDL MOUSE MAPPING # mouse_index1 auto mouse_index2 auto mouse_index3 auto mouse_index4 auto mouse_index5 auto mouse_index6 auto mouse_index7 auto mouse_index8 auto # # SDL KEYBOARD MAPPING # keyb_idx1 auto keyb_idx2 auto keyb_idx3 auto keyb_idx4 auto keyb_idx5 auto keyb_idx6 auto keyb_idx7 auto keyb_idx8 auto # # FRONTEND COMMAND OPTIONS # dtd 1 # # SLOT DEVICES # pad1 townspad pad2 mouse # # IMAGE DEVICES # floppydisk1 /storage/roms/fmtownsux/rbisland/disk1.hdm floppydisk2 cdrom "/storage/roms/fmtownsux/mahoudai/mahou daisakusen (japan).chd" memcard harddisk1 /storage/roms/fmtownsux/alltynex/alltynex.h0 harddisk2 harddisk3 harddisk4 harddisk5 ================================================ FILE: packages/sx05re/libretro/mame/config/ini/mame.ini ================================================ # # CORE CONFIGURATION OPTIONS # readconfig 1 writeconfig 1 # # CORE SEARCH PATH OPTIONS # homepath /storage/roms/bios/mame/ rompath /storage/roms/bios/mame/bios;/storage/roms/mame;/storage/roms/arcade;/storage/roms/fmtownsux;/storage/roms/pgm2;/storage/roms/apple; hashpath /storage/roms/bios/mame/hash samplepath /storage/roms/bios/mame/samples artpath /storage/roms/bios/mame/artwork ctrlrpath system/mame/ctrlr inipath /storage/roms/bios/mame/ini fontpath system/mame/ cheatpath /storage/roms/bios/mame/cheat crosshairpath /storage/roms/bios/mame/crosshair pluginspath /storage/roms/bios/mame/plugins languagepath system/mame/language swpath system/mame/software # # CORE OUTPUT DIRECTORY OPTIONS # cfg_directory /storage/roms/bios/mame/mame/cfg nvram_directory /storage/roms/bios/mame/mame/nvram input_directory /storage/roms/bios/mame/mame/input state_directory /storage/roms/bios/mame/mame/states snapshot_directory /storage/roms/bios/mame/mame/snaps diff_directory /storage/roms/bios/mame/mame/diff comment_directory system/mame/comments share_directory system/mame/share # # CORE STATE/PLAYBACK OPTIONS # state autosave 0 rewind 0 rewind_capacity 10 playback record exit_after_playback 0 mngwrite aviwrite wavwrite snapname %g/%i snapsize auto snapview auto snapbilinear 1 burnin 0 # # CORE PERFORMANCE OPTIONS # autoframeskip 0 frameskip 0 seconds_to_run 0 throttle 0 sleep 0 speed 1.0 refreshspeed 0 lowlatency 0 # # CORE RENDER OPTIONS # keepaspect 1 unevenstretch 1 unevenstretchx 0 unevenstretchy 0 autostretchxy 0 intoverscan 0 intscalex 0 intscaley 0 # # CORE ROTATION OPTIONS # rotate 0 ror 0 rol 0 autoror 0 autorol 0 flipx 0 flipy 0 # # CORE ARTWORK OPTIONS # artwork_crop 0 fallback_artwork override_artwork # # CORE SCREEN OPTIONS # brightness 1.0 contrast 1.0 gamma 1.0 pause_brightness 0.65 effect none # # CORE VECTOR OPTIONS # beam_width_min 1.0 beam_width_max 1.0 beam_dot_size 1.0 beam_intensity_weight 0 flicker 0 # # CORE SOUND OPTIONS # samplerate 48000 samples 1 volume 0 # # CORE INPUT OPTIONS # coin_lockout 1 ctrlr mouse 1 joystick 1 lightgun 0 multikeyboard 0 multimouse 1 steadykey 0 ui_active 0 offscreen_reload 0 joystick_map auto joystick_deadzone 0.15 joystick_saturation 0.85 joystick_threshold 0.30 natural 0 joystick_contradictory 0 coin_impulse 0 # # CORE INPUT AUTOMATIC ENABLE OPTIONS # paddle_device keyboard adstick_device keyboard pedal_device keyboard dial_device keyboard trackball_device keyboard lightgun_device keyboard positional_device keyboard mouse_device mouse # # CORE DEBUGGING OPTIONS # verbose 0 log 0 oslog 0 debug 0 update_in_pause 1 debugscript debuglog 0 # # CORE COMM OPTIONS # comm_localhost 0.0.0.0 comm_localport 15112 comm_remotehost 127.0.0.1 comm_remoteport 15112 comm_framesync 0 # # CORE MISC OPTIONS # drc 1 drc_use_c 0 drc_log_uml 0 drc_log_native 0 bios cheat 0 skip_gameinfo 0 uifont default ui cabinet ramsize confirm_quit 0 ui_mouse 1 language nvram_save 1 # # SCRIPTING OPTIONS # autoboot_command autoboot_delay 0 autoboot_script console 0 plugins 1 plugin noplugin # # HTTP SERVER OPTIONS # http 0 http_port 8080 http_root web # # OSD INPUT MAPPING OPTIONS # uimodekey auto controller_map none background_input 0 # # OSD FONT OPTIONS # uifontprovider auto # # OSD OUTPUT OPTIONS # output auto # # OSD INPUT OPTIONS # keyboardprovider auto mouseprovider auto lightgunprovider auto joystickprovider auto # # OSD DEBUGGING OPTIONS # debugger auto debugger_host localhost debugger_port 23946 debugger_font auto debugger_font_size 0 watchdog 0 # # OSD PERFORMANCE OPTIONS # numprocessors 4 bench 0 # # OSD VIDEO OPTIONS # video auto numscreens 1 window 0 maximize 1 waitvsync 0 syncrefresh 0 monitorprovider auto # # OSD PER-WINDOW VIDEO OPTIONS # screen auto aspect auto resolution auto view auto screen0 auto aspect0 auto resolution0 auto view0 auto screen1 auto aspect1 auto resolution1 auto view1 auto screen2 auto aspect2 auto resolution2 auto view2 auto screen3 auto aspect3 auto resolution3 auto view3 auto # # OSD FULL SCREEN OPTIONS # switchres 0 # # OSD ACCELERATED VIDEO OPTIONS # filter 1 prescale 1 # # OSD SOUND OPTIONS # sound auto audio_latency 2 # # OSD MIDI OPTIONS # midiprovider auto # # OSD EMULATED NETWORKING OPTIONS # networkprovider auto # # BGFX POST-PROCESSING OPTIONS # bgfx_path bgfx bgfx_backend auto bgfx_debug 0 bgfx_screen_chains bgfx_shadow_mask slot-mask.png bgfx_lut lut-default.png bgfx_avi_name auto # # SDL VIDEO OPTIONS # centerh 1 centerv 1 scalemode none # # SDL JOYSTICK MAPPING # joy_idx1 auto joy_idx2 auto joy_idx3 auto joy_idx4 auto joy_idx5 auto joy_idx6 auto joy_idx7 auto joy_idx8 auto sixaxis 0 # # SDL MOUSE MAPPING # mouse_index1 auto mouse_index2 auto mouse_index3 auto mouse_index4 auto mouse_index5 auto mouse_index6 auto mouse_index7 auto mouse_index8 auto # # SDL KEYBOARD MAPPING # keyb_idx1 auto keyb_idx2 auto keyb_idx3 auto keyb_idx4 auto keyb_idx5 auto keyb_idx6 auto keyb_idx7 auto keyb_idx8 auto # # FRONTEND COMMAND OPTIONS # dtd 1 ================================================ FILE: packages/sx05re/libretro/mame/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019 Trond Haugland (trondah@gmail.com) PKG_NAME="mame" PKG_VERSION="6cdc40fc53ba5574073d4009b531fda07156ff49" PKG_SHA256="ea494a44d69e7a075e6271e7a9a987aca208e3b018718984e20b5739eb8a2114" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/mame" PKG_URL="https://github.com/libretro/mame/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain zlib flac sqlite expat" PKG_SECTION="libretro" PKG_SHORTDESC="MAME - Multiple Arcade Machine Emulator" PKG_TOOLCHAIN="make" pre_configure_target() { PTR64="1" NOASM="0" if [ "${ARCH}" == "arm" ]; then NOASM="1" fi PKG_MAKE_OPTS_TARGET="REGENIE=1 \ VERBOSE=1 \ NOWERROR=1 \ OPENMP=1 \ CROSS_BUILD=1 \ TOOLS=0 \ RETRO=1 \ PTR64=${PTR64} \ NOASM=${NOASM} \ PYTHON_EXECUTABLE=python3 \ CONFIG=libretro \ LIBRETRO_OS=unix \ LIBRETRO_CPU=arm64 \ PLATFORM=arm64 \ ARCH= \ TARGET=mame \ SUBTARGET=mame \ OPTIMIZE=fast \ OSD=retro \ USE_SYSTEM_LIB_EXPAT=1 \ USE_SYSTEM_LIB_ZLIB=1 \ USE_SYSTEM_LIB_FLAC=1 \ USE_SYSTEM_LIB_SQLITE3=1" export ARCHOPTS="-D__aarch64__ -DASMJIT_BUILD_X86" sed -i "s/-static-libstdc++//g" scripts/genie.lua unset ARCH unset DISTRO unset PROJECT } make_target() { make ${PKG_MAKE_OPTS_TARGET} OVERRIDE_CC=${CC} OVERRIDE_CXX=${CXX} OVERRIDE_LD=${LD} AR=${AR} ${MAKEFLAGS} -j$(nproc) } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp *.so ${INSTALL}/usr/lib/libretro/ mkdir -p ${INSTALL}/usr/config/retroarch/savefiles/mame/hi cp plugins/hiscore/hiscore.dat ${INSTALL}/usr/config/retroarch/savefiles/mame/hi mkdir -p ${INSTALL}/usr/config/emuelec/configs/mame cp -rf ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/mame mkdir -p ${INSTALL}/usr/config/emuelec/configs/mame/hash cp -rf $PKG_BUILD/hash/fmtowns_cd.xml ${INSTALL}/usr/config/emuelec/configs/mame/hash cp -rf $PKG_BUILD/hash/apple*.xml ${INSTALL}/usr/config/emuelec/configs/mame/hash mkdir -p ${INSTALL}/usr/bin cp -rf ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/libretro/mame/patches/mame-crosscompile.patch ================================================ --- a/3rdparty/genie/build/gmake.linux/genie.make 2018-08-11 00:17:44.000000000 +0200 +++ b/3rdparty/genie/build/gmake.linux/genie.make 2019-04-03 11:57:27.671223016 +0200 @@ -28,8 +28,8 @@ RM = $(SILENT) del /F "$(subst /,\\,$(1))" 2> nul || exit 0 endif -CC = gcc -CXX = g++ +CC = $(HOST_CC) +CXX = $(HOST_CXX) AR = ar ifndef RESCOMP @@ -50,12 +50,12 @@ INCLUDES += -I"../../src/host/lua-5.3.0/src" ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES) ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough - ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough - ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough - ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough - ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough + ALL_CFLAGS += $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough + ALL_CXXFLAGS += $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough + ALL_OBJCFLAGS += $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough + ALL_OBJCPPFLAGS += $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) - ALL_LDFLAGS += $(LDFLAGS) -L"." -s -rdynamic + ALL_LDFLAGS += -L"." -s -rdynamic LIBDEPS += LDDEPS += LDRESP = diff --git a/3rdparty/genie/src/host/scripts.c b/3rdparty/genie/src/host/scripts.c index d052a1418f4..486f7dc08ce 100644 --- a/3rdparty/genie/src/host/scripts.c +++ b/3rdparty/genie/src/host/scripts.c @@ -149,8 +149,7 @@ const char* builtin_scripts[] = { /* tools/gcc.lua */ "premake.gcc = { }\npremake.gcc.cc = \"gcc\"\npremake.gcc.cxx = \"g++\"\npremake.gcc.ar = \"ar\"\npremake.gcc.rc = \"windres\"\npremake.gcc.llvm = false\nlocal cflags =\n{\nEnableSSE = \"-msse\",\nEnableSSE2 = \"-msse2\",\nEnableAVX = \"-mavx\",\nEnableAVX2 = \"-mavx2\",\nPedanticWarnings = \"-Wall -Wextra -pedantic\",\nExtraWarnings = \"-Wall -Wextra\",\nFatalWarnings = \"-Werror\",\nFloatFast = \"-ffast-math\",\nFloatStrict = \"-ffloat-store\",\nNoFramePointer = \"-fomit-frame-pointer\",\nOptimize = \"-O2\",\nOptimizeSize = \"-Os\",\nOptimizeSpeed = \"-O3\",\nSymbols = \"-g\",\n}\nlocal cxxflags =\n{\nCpp11 = \"-std=c++11\",\nCpp14 = \"-std=c++14\",\nCpp17 = \"-std=c++17\",\nCpp20 = \"-std=c++20\",\nCppLatest = \"-std=c++2b\",\nNoExceptions = \"-fno-exceptions\",\nNoRTTI = \"-fno-rtti\",\nUnsignedChar = \"-funsigned-char\",\n}\nlocal objcflags =\n{\nObjcARC = \"-fobjc-arc\",\n}\npremake." - "gcc.platforms =\n{\nNative = {\ncppflags = \"-MMD -MP\",\n},\nx32 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m32\",\n},\nx64 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m64\",\n},\nUniversal = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch x86_64 -arch ppc -arch ppc64\",\n},\nUniversal32 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch ppc\",\n},\nUniversal64 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch x86_64 -arch ppc64\",\n},\nPS3 = {\ncc = \"ppu-lv2-g++\",\ncxx = \"ppu-lv2-g++\",\nar = \"ppu-lv2-ar\",\ncppflags = \"-MMD -MP\",\n},\nWiiDev = {\ncppflags = \"-MMD -MP -I$(LIBOGC_INC) $(MACHDEP)\",\nldflags= \"-L$(LIBOGC_LIB) $(MACHDEP)\",\ncfgsettings = [[\n ifeq ($(strip $(DEVKITPPC)),)\n $(error \"DEVKITPPC environment variable is not set\")'\n endif\n include $(DEVKITPPC)/wii_rules']],\n},\nOrbis = {\ncc = \"orbis-clang\",\ncxx = \"orbis-clang++\",\nar " - " = \"orbis-ar\",\ncppflags = \"-MMD -MP\",\n},\nEmscripten = {\ncc = \"$(EMSCRIPTEN)/emcc\",\ncxx = \"$(EMSCRIPTEN)/em++\",\nar = \"$(EMSCRIPTEN)/emar\",\ncppflags = \"-MMD -MP\",\n},\nNX32 = {\ncc = \"clang\",\ncxx = \"clang++\",\nar = \"armv7l-nintendo-nx-eabihf-ar\",\ncppflags = \"-MMD -MP\",\nflags = \"-march=armv7l\",\n},\nNX64 = {\ncc = \"clang\",\ncxx = \"clang++\",\nar = \"aarch64-nintendo-nx-elf-ar\",\ncppflags = \"-MMD -MP\",\nflags = \"-march=aarch64\",\n},\n}\nlocal platforms = premake.gcc.platforms\nfunction premake.gcc.getcppflags(cfg)\nlocal flags = { }\ntable.insert(flags, platforms[cfg.platform].cppflags)\nif flags[1]:startswith(\"-MMD\") then\ntable.insert(flags, \"-MP\")\nend\nreturn flags\nend\nfunction premake.gcc.getcflags(cfg)\nlocal result = table.translate(cfg.flags, cflags)\ntable.insert(result, platforms[cfg.platform].flags)\nif cfg.system ~= \"windows\" and cfg.kind == \"SharedLib\" then\nt" + "gcc.platforms =\n{\nNative = {\ncppflags = \"-MMD -MP\",\n},\nx32 = {\ncppflags = \"-MMD -MP\"\n},\nx64 = {\ncppflags = \"-MMD -MP\"\n},\nUniversal = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch x86_64 -arch ppc -arch ppc64\",\n},\nUniversal32 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch ppc\",\n},\nUniversal64 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch x86_64 -arch ppc64\",\n},\nPS3 = {\ncc = \"ppu-lv2-g++\",\ncxx = \"ppu-lv2-g++\",\nar = \"ppu-lv2-ar\",\ncppflags = \"-MMD -MP\",\n},\nWiiDev = {\ncppflags = \"-MMD -MP -I$(LIBOGC_INC) $(MACHDEP)\",\nldflags= \"-L$(LIBOGC_LIB) $(MACHDEP)\",\ncfgsettings = [[\n ifeq ($(strip $(DEVKITPPC)),)\n $(error \"DEVKITPPC environment variable is not set\")'\n endif\n include $(DEVKITPPC)/wii_rules']],\n},\nOrbis = {\ncc = \"orbis-clang\",\ncxx = \"orbis-clang++\",\nar = \"orbis-ar\",\ncppflag = \"-MMD -MP\",\n},\nEmscripten = {\ncc = \"$(EMSCRIPTEN)/emcc\",\ncxx = \"$(EMSCRIPTEN)/em++\",\nar = \"$(EMSCRIPTEN)/emar\",\ncppflags = \"-MMD -MP\",\n},\nNX32 = {\ncc = \"clang\",\ncxx = \"clang++\",\nar = \"armv7l-nintendo-nx-eabihf-ar\",\ncppflags = \"-MMD -MP\",\nflags = \"-march=armv7l\",\n},\nNX64 = {\ncc = \"clang\",\ncxx = \"clang++\",\nar = \"aarch64-nintendo-nx-elf-ar\",\ncppflags = \"-MMD -MP\",\nflags = \"-march=aarch64\",\n},\n}\nlocal platforms = premake.gcc.platforms\nfunction premake.gcc.getcppflags(cfg)\nlocal flags = { }\ntable.insert(flags, platforms[cfg.platform].cppflags)\nif flags[1]:startswith(\"-MMD\") then\ntable.insert(flags, \"-MP\")\nend\nreturn flags\nend\nfunction premake.gcc.getcflags(cfg)\nlocal result = table.translate(cfg.flags, cflags)\ntable.insert(result, platforms[cfg.platform].flags)\nif cfg.system ~= \"windows\" and cfg.kind == \"SharedLib\" then\nt" "able.insert(result, \"-fPIC\")\nend\nreturn result\nend\nfunction premake.gcc.getcxxflags(cfg)\nlocal result = table.translate(cfg.flags, cxxflags)\nreturn result\nend\nfunction premake.gcc.getobjcflags(cfg)\nreturn table.translate(cfg.flags, objcflags)\nend\nfunction premake.gcc.getldflags(cfg)\nlocal result = { }\nif not cfg.flags.Symbols then\nif cfg.system == \"macosx\" then\nelse\ntable.insert(result, \"-s\")\nend\nend\nif cfg.kind == \"Bundle\" then\ntable.insert(result, \"-bundle\")\nend\nif cfg.kind == \"SharedLib\" then\nif cfg.system == \"macosx\" then\ntable.insert(result, \"-dynamiclib\")\nelse\ntable.insert(result, \"-shared\")\nend\nif cfg.system == \"windows\" and not cfg.flags.NoImportLib then\ntable.insert(result, '-Wl,--out-implib=\"' .. cfg.linktarget.fullpath .. '\"')\nend\nend\nif cfg.kind == \"WindowedApp\" and cfg.system == \"windows\" then\ntable.insert(result, \"-mwindows\")\nend\nlocal platform = platforms[cfg.platform]\ntable.insert(result, platform.flags)\ntable.insert(result, platf" "orm.ldflags)\nreturn result\nend\nfunction premake.gcc.getlibdirflags(cfg)\nlocal result = { }\nfor _, value in ipairs(premake.getlinks(cfg, \"all\", \"directory\")) do\ntable.insert(result, '-L\\\"' .. value .. '\\\"')\nend\nreturn result\nend\nfunction premake.gcc.islibfile(p)\nif path.getextension(p) == \".a\" then\nreturn true\nend\nreturn false\nend\nfunction premake.gcc.getlibfiles(cfg)\nlocal result = {}\nfor _, value in ipairs(premake.getlinks(cfg, \"system\", \"fullpath\")) do\nif premake.gcc.islibfile(value) then\ntable.insert(result, _MAKE.esc(value))\nend\nend\nreturn result\nend\nfunction premake.gcc.getlinkflags(cfg)\nlocal result = {}\nfor _, value in ipairs(premake.getlinks(cfg, \"system\", \"fullpath\")) do\nif premake.gcc.islibfile(value) then\nvalue = path.rebase(value, cfg.project.location, cfg.location)\ntable.insert(result, _MAKE.esc(value))\nelseif path.getextension(value) == \".framework\" then\ntable.insert(result, '-framework ' .. _MAKE.esc(path.getbasename(value)))\nelse\ntable.inser" "t(result, '-l' .. _MAKE.esc(path.getname(value)))\nend\nend\nreturn result\nend\nfunction premake.gcc.wholearchive(lib)\nif premake.gcc.llvm then\nreturn {\"-force_load\", lib}\nelseif os.get() == \"macosx\" then\nreturn {\"-Wl,-force_load\", lib}\nelse\nreturn {\"-Wl,--whole-archive\", lib, \"-Wl,--no-whole-archive\"}\nend\nend\nfunction premake.gcc.getarchiveflags(prj, cfg, ndx)\nlocal result = {}\nif cfg.platform:startswith(\"Universal\") then\nif prj.options.ArchiveSplit then\nerror(\"gcc tool 'Universal*' platforms do not support split archives\")\nend\ntable.insert(result, '-o')\nelse\nif (not prj.options.ArchiveSplit) then\nif premake.gcc.llvm then\ntable.insert(result, 'rcs')\nelse\ntable.insert(result, '-rcs')\nend\nelse\nif premake.gcc.llvm then\nif (not ndx) then\ntable.insert(result, 'qc')\nelse\ntable.insert(result, 'cs')\nend\nelse\nif (not ndx) then\ntable.insert(result, '-qc')\nelse\ntable.insert(result, '-cs')\nend\nend\nend\nend\nreturn result\nend\nfunction premake.gcc.getdefines(defines)\nl" ================================================ FILE: packages/sx05re/libretro/mame/patches/mame-remove-bgfx.patch ================================================ diff --git a/Makefile.libretro b/Makefile.libretro index 31c414be..8de62064 100644 --- a/Makefile.libretro +++ b/Makefile.libretro @@ -55,6 +55,8 @@ VERBOSE ?= 1 # scripts/toolchain.lua) # PTR64 = 1 +USE_BGFX ?= 0 + ########################################################################### # # LIBRETRO PLATFORM GUESSING diff --git a/scripts/genie.lua b/scripts/genie.lua index 4655b3f4..495308a8 100644 --- a/scripts/genie.lua +++ b/scripts/genie.lua @@ -387,8 +387,22 @@ newoption { description = "Arguments for running debug build.", } +newoption { + trigger = "USE_BGFX", + description = "Use bgfx.", + allowed = { + { "0", "Disabled" }, + { "1", "Enabled" }, + } +} + dofile ("extlib.lua") +if not _OPTIONS["USE_BGFX"] then + _OPTIONS["USE_BGFX"] = "0" +end + + if _OPTIONS["SHLIB"]=="1" then LIBTYPE = "SharedLib" else ================================================ FILE: packages/sx05re/libretro/mame/patches/mame-workaround-for-arm-cross-compilation.patch ================================================ diff --git a/3rdparty/bgfx/src/renderer_gl.h b/3rdparty/bgfx/src/renderer_gl.h index d52efc76..9f5b2022 100644 --- a/3rdparty/bgfx/src/renderer_gl.h +++ b/3rdparty/bgfx/src/renderer_gl.h @@ -12,10 +12,12 @@ || BX_PLATFORM_LINUX \ || BX_PLATFORM_NX \ || BX_PLATFORM_RPI \ + || BX_PLATFORM_LINUX_NO_GL \ ) ) #define BGFX_USE_HTML5 (BGFX_CONFIG_RENDERER_OPENGLES && (0 \ || BX_PLATFORM_EMSCRIPTEN \ + || BX_PLATFORM_LINUX_NO_GL \ ) ) #define BGFX_USE_WGL (BGFX_CONFIG_RENDERER_OPENGL && (0 \ diff --git a/3rdparty/bx/include/bx/platform.h b/3rdparty/bx/include/bx/platform.h index eea5fcb0..f57a3a79 100644 --- a/3rdparty/bx/include/bx/platform.h +++ b/3rdparty/bx/include/bx/platform.h @@ -60,6 +60,7 @@ #define BX_PLATFORM_WINDOWS 0 #define BX_PLATFORM_WINRT 0 #define BX_PLATFORM_XBOXONE 0 +#define BX_PLATFORM_LINUX_NO_GL 0 // http://sourceforge.net/apps/mediawiki/predef/index.php?title=Compilers #if defined(__clang__) @@ -221,6 +222,13 @@ # define BX_PLATFORM_HAIKU 1 #endif // +#if BX_CPU_ARM +# undef BX_PLATFORM_LINUX +# define BX_PLATFORM_LINUX 0 +# undef BX_PLATFORM_LINUX_NO_GL +# define BX_PLATFORM_LINUX_NO_GL 1 +#endif + #if !BX_CRT_NONE // https://sourceforge.net/p/predef/wiki/Libraries/ # if defined(__BIONIC__) @@ -269,6 +277,7 @@ || BX_PLATFORM_OSX \ || BX_PLATFORM_PS4 \ || BX_PLATFORM_RPI \ + || BX_PLATFORM_LINUX_NO_GL \ ) /// @@ -287,6 +296,7 @@ || BX_PLATFORM_WINDOWS \ || BX_PLATFORM_WINRT \ || BX_PLATFORM_XBOXONE \ + || BX_PLATFORM_LINUX_NO_GL \ ) /// @@ -388,6 +398,8 @@ # define BX_PLATFORM_NAME "WinRT" #elif BX_PLATFORM_XBOXONE # define BX_PLATFORM_NAME "Xbox One" +#elif BX_PLATFORM_LINUX_NO_GL +# define BX_PLATFORM_NAME "Linux (GLES)" #else # error "Unknown BX_PLATFORM!" #endif // BX_PLATFORM_ diff --git a/3rdparty/bx/src/os.cpp b/3rdparty/bx/src/os.cpp index 12586aa8..ae2836ad 100644 --- a/3rdparty/bx/src/os.cpp +++ b/3rdparty/bx/src/os.cpp @@ -45,7 +46,8 @@ # if BX_PLATFORM_ANDROID # include // mallinfo # elif BX_PLATFORM_LINUX \ - || BX_PLATFORM_RPI + || BX_PLATFORM_RPI \ + || BX_PLATFORM_LINUX_NO_GL # include // fopen # include // syscall # include @@ -98,7 +100,8 @@ namespace bx #if BX_PLATFORM_WINDOWS return ::GetCurrentThreadId(); #elif BX_PLATFORM_LINUX \ - || BX_PLATFORM_RPI + || BX_PLATFORM_RPI \ + || BX_PLATFORM_LINUX_NO_GL return (pid_t)::syscall(SYS_gettid); #elif BX_PLATFORM_IOS \ || BX_PLATFORM_OSX @@ -119,7 +122,8 @@ namespace bx struct mallinfo mi = mallinfo(); return mi.uordblks; #elif BX_PLATFORM_LINUX \ - || BX_PLATFORM_HURD + || BX_PLATFORM_HURD \ + || BX_PLATFORM_LINUX_NO_GL FILE* file = fopen("/proc/self/statm", "r"); if (NULL == file) { @@ -312,7 +316,8 @@ namespace bx void* exec(const char* const* _argv) { #if BX_PLATFORM_LINUX \ - || BX_PLATFORM_HURD + || BX_PLATFORM_HURD \ + || BX_PLATFORM_LINUX_NO_GL pid_t pid = fork(); if (0 == pid) ================================================ FILE: packages/sx05re/libretro/mame/patches/neww.patch ================================================ --- a/scripts/toolchain.lua 2025-04-26 06:49:26.434764500 +0200 +++ b/scripts/toolchain.lua 2025-04-26 06:50:20.330044973 +0200 @@ -335,9 +335,6 @@ configuration { "linux-gcc", "x32" } objdir (_buildDir .. "linux_gcc" .. "/obj") - buildoptions { - "-m32", - } configuration { "linux-gcc", "x32", "Release" } targetdir (_buildDir .. "linux_gcc" .. "/bin/x32/Release") @@ -347,9 +344,6 @@ configuration { "linux-gcc", "x64" } objdir (_buildDir .. "linux_gcc" .. "/obj") - buildoptions { - "-m64", - } configuration { "linux-gcc", "x64", "Release" } targetdir (_buildDir .. "linux_gcc" .. "/bin/x64/Release") ================================================ FILE: packages/sx05re/libretro/mame/patches/thread-patch ================================================ --- a/3rdparty/bx/src/thread.cpp 2023-08-19 07:51:14.246942500 +0200 +++ b/3rdparty/bx/src/thread.cpp 2023-08-19 07:59:28.740042068 +0200 @@ -22,12 +22,14 @@ || BX_PLATFORM_OSX \ || BX_PLATFORM_PS4 \ || BX_PLATFORM_RPI \ - || BX_PLATFORM_NX + || BX_PLATFORM_NX \ + || BX_PLATFORM_LINUX_NO_GL # include # if BX_PLATFORM_BSD # include # endif // BX_PLATFORM_BSD -# if BX_PLATFORM_LINUX && (BX_CRT_GLIBC < 21200) +# if BX_PLATFORM_LINUX \ + || BX_PLATFORM_LINUX_NO_GL && (BX_CRT_GLIBC < 21200) # include # endif // BX_PLATFORM_ #elif BX_PLATFORM_WINDOWS \ @@ -252,7 +254,8 @@ pthread_setname_np(_name); #elif (BX_CRT_GLIBC >= 21200) && ! BX_PLATFORM_HURD pthread_setname_np(ti->m_handle, _name); -#elif BX_PLATFORM_LINUX +#elif BX_PLATFORM_LINUX \ + || BX_PLATFORM_LINUX_NO_GL prctl(PR_SET_NAME,_name, 0, 0, 0); #elif BX_PLATFORM_BSD # if defined(__NetBSD__) ================================================ FILE: packages/sx05re/libretro/mame/scripts/mame.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present Héctor C.M. (github.com/kelvfimer) if [ ! -f "/storage/roms/bios/mame/hash/fmtowns_cd.xml" ]; then mkdir -p /storage/roms/bios/mame/hash cp -rf "/usr/config/emuelec/configs/mame/hash/"fm* "/storage/roms/bios/mame/hash" fi if [ ! -f "/storage/roms/bios/mame/hash/apple2_flop_orig.xml" ]; then mkdir -p /storage/roms/bios/mame/hash cp -rf "/usr/config/emuelec/configs/mame/hash/"app* "/storage/roms/bios/mame/hash" fi if [ ! -f "/storage/roms/bios/mame/ini/fmtownsux.ini" ]; then mkdir -p /storage/roms/bios/mame/ini cp -rf "/usr/config/emuelec/configs/mame/ini/"fm* "/storage/roms/bios/mame/ini" fi if [ ! -f "/storage/roms/bios/mame/ini/mame.ini" ]; then mkdir -p /storage/roms/bios/mame/ini cp -rf "/usr/config/emuelec/configs/mame/ini/"mame* "/storage/roms/bios/mame/ini" fi if [ ! -f "/storage/.config/retroarch/config/MAME/MAME.opt" ]; then mkdir -p /storage/.config/retroarch/config/MAME cp -rf "/usr/config/emuelec/configs/mame/MAME/"MAME* "/storage/.config/retroarch/config/MAME" fi ================================================ FILE: packages/sx05re/libretro/mame2000/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="mame2000" PKG_VERSION="2ec60f6e1078cf9ba173e80432cc28fd4eea200f" PKG_SHA256="e9e39e0153970729a2b81898af140749118db56be2920600bcff29fe13c59658" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MAME" PKG_SITE="https://github.com/libretro/mame2000-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="MAME - Multiple Arcade Machine Emulator" PKG_LONGDESC="MAME - Multiple Arcade Machine Emulator" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { if [ "${ARCH}" == "arm" ]; then make ARM=1 USE_CYCLONE=1 USE_DRZ80=1 else make fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mame2000_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/mame2003/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="mame2003" PKG_VERSION="3570605767a447c13b087a5946189bcbafe11e1d" PKG_SHA256="0c0518ae3dbea9479353c0f11b3a674113f6064923d5383e9055e28de88d555f" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MAME" PKG_SITE="https://github.com/libretro/mame2003-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="MAME - Multiple Arcade Machine Emulator" PKG_LONGDESC="MAME - Multiple Arcade Machine Emulator" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make ARCH="" CC="${CC}" NATIVE_CC="${CC}" LD="${CC}" } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mame2003_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/mame2003-midway/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="mame2003-midway" PKG_VERSION="3a47c3d8b44d3ced80a8b4907cc7bc75d9a738fd" PKG_SHA256="2e9154db99675190e1d3b685b738627e3116fbcfe4f590a4a071d5bd1a935c09" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MAME" PKG_SITE="https://github.com/libretro/mame2003_midway" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="MAME - Multiple Arcade Machine Emulator" PKG_LONGDESC="MAME - Multiple Arcade Machine Emulator" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" PKG_BUILD_FLAGS="-lto" make_target() { make ARCH="" CC="${CC}" NATIVE_CC="${CC}" LD="${CC}" -j 1 } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mame2003_midway_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/mame2003-plus/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="mame2003-plus" PKG_VERSION="870e8ba3fa4e6635e2eb9d85c939589498659c32" PKG_SHA256="1240e641302ec7941d4879c88e162afae3a7347b67e8b0f2c826f70b23ea5166" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MAME" PKG_SITE="https://github.com/libretro/mame2003-plus-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="MAME - Multiple Arcade Machine Emulator" PKG_LONGDESC="MAME - Multiple Arcade Machine Emulator" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make ARCH="" CC="${CC}" NATIVE_CC="${CC}" LD="${CC}" } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mame2003_plus_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/mame2003-xtreme/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="mame2003-xtreme" PKG_VERSION="9382b943f6a8a197d9fc8bd136d2c4a252c39b54" PKG_SHA256="5fd17a0061166a91128364fe3b31144a1015132ef77b530aeb56734c6c0dd587" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MAME" PKG_SITE="https://github.com/KMFDManic/mame2003-xtreme" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Updated 2018 version of MAME (0.78) for libretro, with added game support, and optimized for performance and speed on the Mini Classics. " PKG_TOOLCHAIN="make" pre_configure_target() { cd ${PKG_BUILD} export SYSROOT_PREFIX=${SYSROOT_PREFIX} case ${DEVICE} in Amlogic-ng|Amlogic-no|Amlogic-ogu) PKG_MAKE_OPTS_TARGET+=" platform=AMLG12B" ;; Amlogic-old) PKG_MAKE_OPTS_TARGET+=" platform=AMLGX" ;; esac PKG_MAKE_OPTS_TARGET+=" ARCH=\"\" CC=\"${CC}\" NATIVE_CC=\"${CC}\" LD=\"${CC}\"" # PKG_MAKE_OPTS_TARGET=" platform=rpi2 ARCH=\"\" CC=\"${CC}\" NATIVE_CC=\"${CC}\" LD=\"${CC}\"" } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mame2003_libretro.so ${INSTALL}/usr/lib/libretro/km_mame2003_xtreme_libretro.so cp km_mame2003_xtreme_libretro.info ${INSTALL}/usr/lib/libretro/km_mame2003_xtreme_libretro.info } ================================================ FILE: packages/sx05re/libretro/mame2003-xtreme/sources/km_mame2003_xtreme_libretro.info ================================================ display_name = "Arcade (km_MAME 2003 Xtreme)" authors = "MAMEdev" supported_extensions = "zip" corename = "MAME 2003 Xtreme (0.78)" manufacturer = "Various" categories = "Emulator" systemname = "Arcade (various)" systemid = "mame" database = "MAME 2003" license = "MAME" permissions = "" display_version = "0.78" supports_no_game = "false" notes = "(!) The BIOS files must be inside the ROM directory.|" ================================================ FILE: packages/sx05re/libretro/mame2010/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="mame2010" PKG_VERSION="c5b413b71e0a290c57fc351562cd47ba75bac105" PKG_SHA256="38270732ef2b503583e96a3c83cd5ba8d4ca6510d1f24f2b00bf6703eb74070d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MAME" PKG_SITE="https://github.com/libretro/mame2010-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Late 2010 version of MAME (0.139) for libretro. Compatible with MAME 0.139 romsets." PKG_LONGDESC="Late 2010 version of MAME (0.139) for libretro. Compatible with MAME 0.139 romsets." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { if [ "${ARCH}" == "arm" ]; then make CC="${CC}" LD="${CC}" PLATCFLAGS="${CFLAGS}" PTR64=0 ARM_ENABLED=1 LCPU=arm elif [ "${ARCH}" == "i386" ]; then make CC="${CC}" LD="${CC}" PLATCFLAGS="${CFLAGS}" PTR64=0 ARM_ENABLED=0 LCPU=x86 elif [ "${ARCH}" == "x86_64" ]; then make CC="${CC}" LD="${CC}" PLATCFLAGS="${CFLAGS}" PTR64=1 ARM_ENABLED=0 LCPU=x86_64 elif [ "${ARCH}" == "aarch64" ]; then make CC="${CC}" LD="${CC}" PLATCFLAGS="${CFLAGS}" PTR64=1 ARM_ENABLED=1 LCPU=arm64 maketree make CC="${CC}" LD="${CC}" PLATCFLAGS="${CFLAGS}" PTR64=1 ARM_ENABLED=1 LCPU=arm64 fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mame2010_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/mame2010/patches/libretro-mame2010-0001_fix-cross-build.patch ================================================ diff --git a/Makefile b/Makefile index 65ece36..bd7d670 100644 --- a/Makefile +++ b/Makefile @@ -61,7 +61,7 @@ COBJFLAGS = CPPONLYFLAGS = # LDFLAGS are used generally; LDFLAGSEMULATOR are additional # flags only used when linking the core emulator -LDFLAGS = +LDFLAGS ?= LDFLAGSEMULATOR = GIT_VERSION ?= " $(shell git rev-parse --short HEAD || echo unknown)" @@ -104,27 +104,25 @@ ifeq ($(VRENDER),opengl) CCOMFLAGS += -DHAVE_OPENGL endif -UNAME=$(shell uname -m) - -ifeq ($(firstword $(filter x86_64,$(UNAME))),x86_64) +ifeq ($(firstword $(filter x86_64,$(ARCH))),x86_64) PTR64 ?= 1 endif -ifeq ($(firstword $(filter amd64,$(UNAME))),amd64) +ifeq ($(firstword $(filter amd64,$(ARCH))),amd64) PTR64 ?= 1 endif -ifeq ($(firstword $(filter ppc64,$(UNAME))),ppc64) +ifeq ($(firstword $(filter ppc64,$(ARCH))),ppc64) PTR64 ?= 1 endif ifneq (,$(findstring mingw64-w64,$(PATH))) PTR64 ?= 1 endif -ifeq ($(firstword $(filter arm64,$(UNAME))),arm64) +ifeq ($(firstword $(filter arm64,$(ARCH))),arm64) PTR64 ?= 1 endif -ifneq (,$(findstring Power,$(UNAME))) +ifneq (,$(findstring Power,$(ARCH))) BIGENDIAN=1 endif -ifneq (,$(findstring ppc,$(UNAME))) +ifneq (,$(findstring ppc,$(ARCH))) BIGENDIAN=1 endif @@ -146,14 +144,10 @@ ifeq ($(VRENDER),opengl) LIBS += -lGL endif LDFLAGS += $(SHARED) - NATIVELD = g++ - NATIVELDFLAGS = -Wl,--warn-common -lstdc++ - NATIVECC = g++ - NATIVECFLAGS = -std=gnu99 - CC_AS = gcc - CC = g++ - AR = @ar - LD = g++ + CC_AS ?= $(CC) + CC ?= g++ + AR ?= @ar + LD ?= g++ CCOMFLAGS += $(PLATCFLAGS) -ffast-math LIBS += -lstdc++ -lpthread @@ -462,10 +456,13 @@ else ifneq (,$(findstring rpi,$(platform))) # ARM else ifneq (,$(findstring armv,$(platform))) + ARM_ENABLED = 1 + EXTRA_RULES = 1 TARGETLIB := $(TARGET_NAME)_libretro.so - SHARED := -shared -Wl,--no-undefined + SHARED := -shared -Wl,--version-script=src/osd/retro/link.T + LDFLAGS += $(SHARED) fpic = -fPIC - CC = g++ + CC ?= g++ LDFLAGS += $(SHARED) ARM_ENABLED = 1 X86_SH2DRC = 0 @@ -683,7 +680,7 @@ DEFS += -DFLAC__NO_DLL # CFLAGS is defined based on C or C++ targets # (remember, expansion only happens when used, so doing it here is ok) -CFLAGS = $(CCOMFLAGS) $(CPPONLYFLAGS) +CFLAGS += $(CCOMFLAGS) $(CPPONLYFLAGS) # we compile C-only to C89 standard with GNU extensions # we compile C++ code to C++98 standard with GNU extensions ================================================ FILE: packages/sx05re/libretro/mame2010/patches/libretro-mame2010-0002_fix-cheats.patch ================================================ From 96e7ce0bcd1d0ae84a9974f7fd7c18e37da9c449 Mon Sep 17 00:00:00 2001 From: RussellKR <46307397+RussellKR@users.noreply.github.com> Date: Sat, 1 Jul 2023 03:03:33 +1000 Subject: [PATCH 1/8] Update README.md --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/osd/retro/retromain.c b/src/osd/retro/retromain.c index c89edd5c..3f2c0e8d 100755 --- a/src/osd/retro/retromain.c +++ b/src/osd/retro/retromain.c @@ -63,6 +63,7 @@ static int mouse_mode = 1; static bool videoapproach1_enable = false; bool hide_nagscreen = false; bool hide_gameinfo = false; +bool cheat_enable = false; bool hide_warnings = false; static void update_geometry(); @@ -226,6 +227,10 @@ void retro_init (void) path_mkdir(libretro_save_directory); // content loaded from mame2010 subfolder within the libretro system folder + snprintf(cheatpath, sizeof(cheatpath), "%s%s%s", libretro_system_directory, path_default_slash(), "cheat"); + path_mkdir(cheatpath); + snprintf(inipath, sizeof(inipath), "%s%s%s", libretro_system_directory, path_default_slash(), "ini"); + path_mkdir(inipath); snprintf(samplepath, sizeof(samplepath), "%s%s%s", libretro_system_directory, path_default_slash(), "samples"); path_mkdir(samplepath); snprintf(artpath, sizeof(artpath), "%s%s%s", libretro_system_directory, path_default_slash(), "artwork"); @@ -236,10 +241,12 @@ void retro_init (void) path_mkdir(crosshairpath); // user-generated content loaded from mame2010 subfolder within the libretro save folder - snprintf(ctrlrpath, sizeof(ctrlrpath), "%s%s%s", libretro_save_directory, path_default_slash(), "ctrlr"); - path_mkdir(ctrlrpath); + snprintf(cheatpath, sizeof(cheatpath), "%s%s%s", libretro_save_directory, path_default_slash(), "cheat"); + path_mkdir(cheatpath); snprintf(inipath, sizeof(inipath), "%s%s%s", libretro_save_directory, path_default_slash(), "ini"); path_mkdir(inipath); + snprintf(ctrlrpath, sizeof(ctrlrpath), "%s%s%s", libretro_save_directory, path_default_slash(), "ctrlr"); + path_mkdir(ctrlrpath); snprintf(cfg_directory, sizeof(cfg_directory), "%s%s%s", libretro_save_directory, path_default_slash(), "cfg"); path_mkdir(cfg_directory); snprintf(nvram_directory, sizeof(nvram_directory), "%s%s%s", libretro_save_directory, path_default_slash(), "nvram"); @@ -589,6 +596,7 @@ void retro_set_environment(retro_environment_t cb) //Shell for CPU overclock setting. Search mame_current_overclock for other pieces //{ "mame_current_overclock", "Main CPU Overclock; 100|25|30|35|40|45|50|55|60|65|70|75|80|95|90|95|105|110|115|120" }, { "mame_current_videoapproach1_enable", "Video approach 1 Enabled; disabled|enabled" }, + { "mame_current_cheat", "Cheat enable; disabled|enabled" }, { "mame_current_skip_nagscreen", "Hide nag screen; enabled|disabled" }, { "mame_current_skip_gameinfo", "Hide game info screen; disabled|enabled" }, { "mame_current_skip_warnings", "Hide warning screen; disabled|enabled" }, @@ -659,6 +667,17 @@ static void check_variables(void) if (!strcmp(var.value, "enabled")) hide_gameinfo = true; } + + var.key = "mame_current_cheat"; + var.value = NULL; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + { + retro_log(RETRO_LOG_INFO, "[MAME 2010] cheat_enable value: %s\n", var.value); + if (!strcmp(var.value, "disabled")) + cheat_enable = false; + if (!strcmp(var.value, "enabled")) + cheat_enable = true; + } var.key = "mame_current_skip_warnings"; var.value = NULL; @@ -1943,7 +1962,7 @@ int executeGame(char* path) { if (tate) { if (screenRot == 3) { - xargv[paramCount++] =(char*) "-rol"; + xargv[paramCount++] = (char*) "-rol"; } else { xargv[paramCount++] = (char*)(screenRot ? "-mouse" : "-ror"); } @@ -1956,15 +1975,21 @@ int executeGame(char* path) { } if(hide_gameinfo) { - xargv[paramCount++] =(char*) "-skip_gameinfo"; + xargv[paramCount++] = (char*) "-skip_gameinfo"; + } + + if(cheat_enable) { + xargv[paramCount++] = (char*) "-cheat"; + } else { + xargv[paramCount++] = (char*) "-nocheat"; } if(hide_nagscreen) { - xargv[paramCount++] =(char*) "-skip_nagscreen"; + xargv[paramCount++] = (char*) "-skip_nagscreen"; } if(hide_warnings) { - xargv[paramCount++] =(char*) "-skip_warnings"; + xargv[paramCount++] = (char*) "-skip_warnings"; } xargv[paramCount++] = MgameName; From 84767238401ffe3844915d3668d22f3c96c6a5b6 Mon Sep 17 00:00:00 2001 From: RussellKR <46307397+RussellKR@users.noreply.github.com> Date: Sat, 1 Jul 2023 03:54:22 +1000 Subject: [PATCH 3/8] Fixed Cheat Enable --- src/osd/retro/retromain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osd/retro/retromain.c b/src/osd/retro/retromain.c index 3f2c0e8d..338bbccc 100755 --- a/src/osd/retro/retromain.c +++ b/src/osd/retro/retromain.c @@ -63,8 +63,8 @@ static int mouse_mode = 1; static bool videoapproach1_enable = false; bool hide_nagscreen = false; bool hide_gameinfo = false; -bool cheat_enable = false; bool hide_warnings = false; +bool cheat_enable = false; static void update_geometry(); static unsigned int turbo_enable, turbo_state, turbo_delay = 5; From ab65119f992f4fbf7bd5fa5b20f2c5549ae49c7b Mon Sep 17 00:00:00 2001 From: RussellKR <46307397+RussellKR@users.noreply.github.com> Date: Sat, 1 Jul 2023 04:06:04 +1000 Subject: [PATCH 4/8] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) ================================================ FILE: packages/sx05re/libretro/mame2015/package.mk ================================================ ################################################################################ # This file is part of LibreELEC - http://www.libreelec.tv # Copyright (C) 2016 Team LibreELEC # # LibreELEC is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # LibreELEC is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LibreELEC. If not, see . ################################################################################ PKG_NAME="mame2015" PKG_VERSION="316cd06349f2b34b4719f04f7c0d07569a74c764" PKG_SHA256="45c5bda01876545c5a2b39ec700baab43c34ce38ab710e14abe14aae3b33afc4" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/mame2015-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="libretro" PKG_SHORTDESC="Late 2014/Early 2015 version of MAME (0.160-ish) for libretro. Compatible with MAME 0.160 romsets." PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="-lto" pre_make_target() { export REALCC=${CC} export CC=${CXX} export LD=${CXX} } pre_configure_target() { case ${PROJECT} in RPi|Slice) PKG_MAKE_OPTS_TARGET=" platform=armv6-hardfloat-arm1176jzf-s" ;; RPi2|Slice3) PKG_MAKE_OPTS_TARGET=" platform=armv7-neon-hardfloat-cortex-a7" ;; imx6) PKG_MAKE_OPTS_TARGET=" platform=armv7-neon-hardfloat-cortex-a9" ;; WeTek_Play) PKG_MAKE_OPTS_TARGET=" platform=armv7-neon-hardfloat-cortex-a9" ;; Odroid_C2|WeTek_Hub|WeTek_Play_2) PKG_MAKE_OPTS_TARGET=" platform=armv-neon-hardfloat" ;; Amlogic*) PKG_MAKE_OPTS_TARGET=" platform=armv8-neon-hardfloat-cortex-a53" ;; Generic) PKG_MAKE_OPTS_TARGET="" ;; *) PKG_MAKE_OPTS_TARGET=" platform=armv" ;; esac if [ "${DEVICE}" == "Amlogic"* ]; then PKG_MAKE_OPTS_TARGET=" platform=armv8-neon-hardfloat-cortex-a53" fi if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then PKG_MAKE_OPTS_TARGET=" platform=armv8-neon-hardfloat-cortex-a35" fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mame*_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/mame2016/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019 Trond Haugland (trondah@gmail.com) PKG_NAME="mame2016" PKG_VERSION="01058613a0109424c4e7211e49ed83ac950d3993" PKG_SHA256="3faaf226279d0c08d2a945a208c43d3851d4b86981b5224231de80098a97ea27" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/mame2016-libretro" PKG_URL="https://github.com/libretro/mame2016-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="escalade" PKG_SHORTDESC="MAME (0.174-ish) for libretro" PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="-lto" PTR64="0" NOASM="0" if [ "${ARCH}" == "aarch64" ]; then NOASM="1" PLAT=arm64 elif [ "${ARCH}" == "arm" ]; then NOASM="1" PLAT=${ARCH} else PLAT=${ARCH} fi PKG_MAKE_OPTS_TARGET="REGENIE=1 \ VERBOSE=1 \ NOWERROR=1 \ OPENMP=1 \ CROSS_BUILD=1 \ TOOLS=1 \ RETRO=1 \ PTR64=${PTR64} \ NOASM=${NOASM} \ PYTHON_EXECUTABLE=python \ CONFIG=libretro \ LIBRETRO_OS=unix \ LIBRETRO_CPU=${PLAT} \ PLATFORM=${PLAT} \ ARCH= \ TARGET=mame \ SUBTARGET=arcade \ OSD=retro \ USE_SYSTEM_LIB_EXPAT=1 \ USE_SYSTEM_LIB_ZLIB=1 \ USE_SYSTEM_LIB_FLAC=1 \ USE_SYSTEM_LIB_SQLITE3=1" make_target() { unset DISTRO make ${PKG_MAKE_OPTS_TARGET} OVERRIDE_CC=${CC} OVERRIDE_CXX=${CXX} OVERRIDE_LD=${LD} AR=${AR} ${MAKEFLAGS} } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/lib/libretro cp *.so ${INSTALL}/usr/lib/libretro/mame2016_libretro.so mkdir -p ${INSTALL}/usr/config/retroarch/savefiles/mame2016/hi cp metadata/hiscore.dat ${INSTALL}/usr/config/retroarch/savefiles/mame2016/hi } ================================================ FILE: packages/sx05re/libretro/mame2016/patches/57.patch ================================================ From 184b3a8eac80fde6b274089017085dda1ef1fdf8 Mon Sep 17 00:00:00 2001 From: StormedBubbles <80055191+StormedBubbles@users.noreply.github.com> Date: Mon, 18 Apr 2022 16:48:42 -0400 Subject: [PATCH 1/2] Fix mouse buttons, add multimouse/lightgun --- src/emu/emuopts.cpp | 2 +- src/osd/retro/libretro.cpp | 15 +- src/osd/retro/libretro_shared.h | 11 +- src/osd/retro/retromain.cpp | 240 ++++++++++++++++++++++++-------- 4 files changed, 202 insertions(+), 66 deletions(-) diff --git a/src/emu/emuopts.cpp b/src/emu/emuopts.cpp index 97ca3337555..ed87d8bf216 100644 --- a/src/emu/emuopts.cpp +++ b/src/emu/emuopts.cpp @@ -144,7 +144,7 @@ const options_entry emu_options::s_option_entries[] = { OPTION_JOYSTICK ";joy", "1", OPTION_BOOLEAN, "enable joystick input" }, { OPTION_LIGHTGUN ";gun", "0", OPTION_BOOLEAN, "enable lightgun input" }, { OPTION_MULTIKEYBOARD ";multikey", "0", OPTION_BOOLEAN, "enable separate input from each keyboard device (if present)" }, - { OPTION_MULTIMOUSE, "0", OPTION_BOOLEAN, "enable separate input from each mouse device (if present)" }, + { OPTION_MULTIMOUSE, "1", OPTION_BOOLEAN, "enable separate input from each mouse device (if present)" }, { OPTION_STEADYKEY ";steady", "0", OPTION_BOOLEAN, "enable steadykey support" }, { OPTION_UI_ACTIVE, "0", OPTION_BOOLEAN, "enable user interface on top of emulated keyboard (if present)" }, { OPTION_OFFSCREEN_RELOAD ";reload", "0", OPTION_BOOLEAN, "convert lightgun button 2 into offscreen reload" }, diff --git a/src/osd/retro/libretro.cpp b/src/osd/retro/libretro.cpp index c3c20d0ff40..4c93480af3f 100755 --- a/src/osd/retro/libretro.cpp +++ b/src/osd/retro/libretro.cpp @@ -133,7 +133,7 @@ void retro_set_audio_sample(retro_audio_sample_t cb) { } void retro_set_environment(retro_environment_t cb) { - sprintf(option_mouse, "%s_%s", core, "mouse_enable"); + sprintf(option_mouse, "%s_%s", core, "mouse_mode"); sprintf(option_cheats, "%s_%s", core, "cheats_enable"); sprintf(option_overclock, "%s_%s", core, "cpu_overclock"); sprintf(option_nag, "%s_%s",core,"hide_nagscreen"); @@ -162,7 +162,7 @@ void retro_set_environment(retro_environment_t cb) { option_write_config, "Write configuration; disabled|enabled" }, { option_saves, "Save state naming; game|system" }, { option_auto_save, "Auto save/load states; disabled|enabled" }, - { option_mouse, "Enable in-game mouse; disabled|enabled" }, + { option_mouse, "XY device (Restart); none|lightgun|mouse" }, { option_throttle, "Enable throttle; disabled|enabled" }, { option_cheats, "Enable cheats; disabled|enabled" }, { option_overclock, "Main CPU Overclock; default|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|60|65|70|75|80|85|90|95|100|105|110|115|120|125|130|135|140|145|150" }, @@ -212,10 +212,12 @@ static void check_variables(void) if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { - if (!strcmp(var.value, "disabled")) - mouse_enable = false; - if (!strcmp(var.value, "enabled")) - mouse_enable = true; + if (!strcmp(var.value, "none")) + mouse_mode = 0; + if (!strcmp(var.value, "mouse")) + mouse_mode = 1; + if (!strcmp(var.value, "lightgun")) + mouse_mode = 2; } var.key = option_throttle; @@ -578,6 +580,7 @@ void retro_run (void) input_poll_cb(); process_mouse_state(); + process_lightgun_state(); process_keyboard_state(); process_joypad_state(); diff --git a/src/osd/retro/libretro_shared.h b/src/osd/retro/libretro_shared.h index c53f049fc4a..c613656460e 100644 --- a/src/osd/retro/libretro_shared.h +++ b/src/osd/retro/libretro_shared.h @@ -30,7 +30,7 @@ extern int retro_pause; extern bool experimental_cmdline; extern bool hide_gameinfo; -extern bool mouse_enable; +extern int mouse_mode; extern bool cheats_enable; extern bool alternate_renderer; extern bool boot_to_osd_enable; @@ -45,9 +45,12 @@ extern bool throttle_enable; extern bool auto_save_enable; extern bool game_specific_saves_enable; -extern int mouseLX; -extern int mouseLY; +extern int mouseLX[4]; +extern int mouseLY[4]; extern int mouseBUT[4]; +extern int lightgunLX[4]; +extern int lightgunLY[4]; +extern int lightgunBUT[4]; extern UINT16 retrokbd_state[RETROK_LAST]; @@ -82,6 +85,8 @@ void process_joypad_state(void); void process_mouse_state(void); +void process_lightgun_state(void); + #ifdef __cplusplus extern "C" { #endif diff --git a/src/osd/retro/retromain.cpp b/src/osd/retro/retromain.cpp index 8f499b26027..7f66d70591d 100755 --- a/src/osd/retro/retromain.cpp +++ b/src/osd/retro/retromain.cpp @@ -61,21 +61,35 @@ typedef struct joystate_t int a2[2]; }Joystate; +typedef struct mousestate_t +{ + int mouseBUT[4]; +}Mousestate; + +typedef struct lightgunstate_t +{ + int lightgunBUT[4]; +}Lightgunstate; + /* rendering target */ static render_target *our_target = NULL; /* input device */ -static input_device *retrokbd_device; // KEYBD -static input_device *mouse_device; // MOUSE -static input_device *joy_device[4];// JOY0/JOY1/JOY2/JOY3 -static input_device *Pad_device[4];// PAD0/PAD1/PAD2/PAD3 +static input_device *retrokbd_device; // KEYBD +static input_device *mouse_device[4]; // MOUSE0/MOUSE1/MOUSE2/MOUSE3 +static input_device *lightgun_device[4]; // GUN0/GUN1/GUN2/GUN3 +static input_device *joy_device[4]; // JOY0/JOY1/JOY2/JOY3 +static input_device *Pad_device[4]; // PAD0/PAD1/PAD2/PAD3 /* state */ UINT16 retrokbd_state[RETROK_LAST]; -int mouseLX; -int mouseLY; -int mouseBUT[4]; +int mouseLX[4]; +int mouseLY[4]; +int lightgunLX[4]; +int lightgunLY[4]; static Joystate joystate[4]; +static Mousestate mousestate[4]; +static Lightgunstate lightgunstate[4]; static int ui_ipt_pushchar=-1; @@ -87,7 +101,7 @@ bool hide_warnings = false; bool nobuffer_enable = false; bool hide_gameinfo = false; -bool mouse_enable = false; +int mouse_mode = 0; bool cheats_enable = false; bool alternate_renderer = false; bool boot_to_osd_enable = false; @@ -353,10 +367,11 @@ static INT32 generic_button_get_state(void *device_internal, void *item_internal return *itemdata >> 7; } -#define input_device_item_add_joy(a,b,c,d,e) joy_device[a]->add_item(b,d,e,c) -#define input_device_item_add_mouse(a,b,c,d,e) mouse_device->add_item(b,d,e,c) -#define input_device_item_add_kbd(a,b,c,d,e) retrokbd_device->add_item(b,d,e,c) -#define input_device_item_add_pad(a,b,c,d,e) Pad_device[a]->add_item(b,d,e,c) +#define input_device_item_add_joy(a,b,c,d,e) joy_device[a]->add_item(b,d,e,c) +#define input_device_item_add_mouse(a,b,c,d,e) mouse_device[a]->add_item(b,d,e,c) +#define input_device_item_add_lightgun(a,b,c,d,e) lightgun_device[a]->add_item(b,d,e,c) +#define input_device_item_add_kbd(a,b,c,d,e) retrokbd_device->add_item(b,d,e,c) +#define input_device_item_add_pad(a,b,c,d,e) Pad_device[a]->add_item(b,d,e,c) void process_keyboard_state(void) { @@ -397,42 +412,116 @@ void process_joypad_state(void) void process_mouse_state(void) { - static int mbL = 0, mbR = 0; - int mouse_l; - int mouse_r; - int16_t mouse_x; - int16_t mouse_y; + unsigned i; - if (!mouse_enable) - return; + for(i = 0;i < 4; i++) + { + static int mbL[4] = {0}, mbR[4] = {0}, mbM[4] = {0}; + int mouse_l[4]; + int mouse_r[4]; + int mouse_m[4]; + int16_t mouse_x[4]; + int16_t mouse_y[4]; - mouse_x = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X); - mouse_y = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y); - mouse_l = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT); - mouse_r = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT); - mouseLX = mouse_x*INPUT_RELATIVE_PER_PIXEL;; - mouseLY = mouse_y*INPUT_RELATIVE_PER_PIXEL;; + if (mouse_mode == 0 || mouse_mode == 2) + return; - if(mbL==0 && mouse_l) - { - mbL=1; - mouseBUT[0]=0x80; - } - else if(mbL==1 && !mouse_l) - { - mouseBUT[0]=0; - mbL=0; - } + mouse_x[i] = input_state_cb(i, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X); + mouse_y[i] = input_state_cb(i, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y); + mouse_l[i] = input_state_cb(i, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT); + mouse_r[i] = input_state_cb(i, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT); + mouse_m[i] = input_state_cb(i, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_MIDDLE); - if(mbR==0 && mouse_r) - { - mbR=1; - mouseBUT[1]=1; + mouseLX[i] = mouse_x[i]*INPUT_RELATIVE_PER_PIXEL;; + mouseLY[i] = mouse_y[i]*INPUT_RELATIVE_PER_PIXEL;; + + if(mbL[i]==0 && mouse_l[i]) + { + mbL[i]=1; + mousestate[i].mouseBUT[0]=0x80; + } + else if(mbL[i]==1 && !mouse_l[i]) + { + mousestate[i].mouseBUT[0]=0; + mbL[i]=0; + } + + if(mbR[i]==0 && mouse_r[i]) + { + mbR[i]=1; + mousestate[i].mouseBUT[1]=0x80; + } + else if(mbR[i]==1 && !mouse_r[i]) + { + mousestate[i].mouseBUT[1]=0; + mbR[i]=0; + } + + if(mbM[i]==0 && mouse_m[i]) + { + mbM[i]=1; + mousestate[i].mouseBUT[2]=0x80; + } + else if(mbM[i]==1 && !mouse_m[i]) + { + mousestate[i].mouseBUT[2]=0; + mbM[i]=0; + } } - else if(mbR==1 && !mouse_r) - { - mouseBUT[1]=0; - mbR=0; +} + +void process_lightgun_state(void) +{ + unsigned i; + + for(i = 0;i < 4; i++) + { + static int gb1[4] = {0}, gb2[4] = {0}; + int gun_1[4]; + int gun_2[4]; + int16_t lightgun_x[4]; + int16_t lightgun_y[4]; + + if (mouse_mode == 0 || mouse_mode == 1) + return; + + gun_1[i] = input_state_cb( i, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_TRIGGER ) || input_state_cb( i, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_RELOAD ); + gun_2[i] = input_state_cb( i, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_AUX_A ); + + if(gb1[i]==0 && gun_1[i]) + { + gb1[i]=1; + lightgunstate[i].lightgunBUT[0] = 0x80; + } + else if(gb1[i]==1 && !gun_1[i]) + { + lightgunstate[i].lightgunBUT[0] = 0; + gb1[i]=0; + } + + if(gb2[i]==0 && gun_2[i]) + { + gb2[i]=1; + lightgunstate[i].lightgunBUT[1] = 0x80; + } + else if(gb2[i]==1 && !gun_2[i]) + { + lightgunstate[i].lightgunBUT[1] = 0; + gb2[i]=0; + } + + lightgun_x[i] = input_state_cb(i, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X); + lightgun_y[i] = input_state_cb(i, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y); + + lightgunLX[i] = lightgun_x[i]*2;; + lightgunLY[i] = lightgun_y[i]*2;; + + //Place the cursor at screen top left when detected as offscreen or when Gun Reload input activated + if (input_state_cb( i, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN ) || input_state_cb( i, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_RELOAD ) ) + { + lightgunLX[i] = -65534; + lightgunLY[i] = -65534; + } } } @@ -441,21 +530,46 @@ static void initInput(running_machine &machine) int i,j,button; char defname[20]; - if (mouse_enable) + //MOUSE + if (mouse_mode == 1) { - //MOUSE - mouse_device = machine.input().device_class(DEVICE_CLASS_MOUSE).add_device("Mice1"); - // add the axes - input_device_item_add_mouse(mouse_device , "X", &mouseLX, ITEM_ID_XAXIS, generic_axis_get_state); - input_device_item_add_mouse(mouse_device , "Y", &mouseLY, ITEM_ID_YAXIS, generic_axis_get_state); - // add the buttons - for (button = 0; button < 4; button++) + for(i=0;i<4;i++) { - input_item_id itemid = (input_item_id) (ITEM_ID_BUTTON1+button); - sprintf(defname, "B%d", button + 1); - input_device_item_add_mouse(mouse_device, defname, &mouseBUT[button], itemid, generic_button_get_state); + sprintf(defname, "Mouse%d", i); + mouse_device[i]=machine.input().device_class(DEVICE_CLASS_MOUSE).add_device(defname); + // add the axes + input_device_item_add_mouse (i , "X", &mouseLX[i], ITEM_ID_XAXIS, generic_axis_get_state); + input_device_item_add_mouse (i , "Y", &mouseLY[i], ITEM_ID_YAXIS, generic_axis_get_state); + // add the buttons + for (button = 0; button < 4; button++) + { + input_item_id itemid = (input_item_id) (ITEM_ID_BUTTON1+button); + sprintf(defname, "B%d", button + 1); + input_device_item_add_mouse(i, defname, &mousestate[i].mouseBUT[button], itemid, generic_button_get_state); + } } } + + //LIGHTGUN + if (mouse_mode == 2) + { + for(i=0;i<4;i++) + { + sprintf(defname, "Gun%d", i); + lightgun_device[i]=machine.input().device_class(DEVICE_CLASS_LIGHTGUN).add_device(defname); + // add the axes + input_device_item_add_lightgun (i , "X", &lightgunLX[i], ITEM_ID_XAXIS, generic_axis_get_state); + input_device_item_add_lightgun (i , "Y", &lightgunLY[i], ITEM_ID_YAXIS, generic_axis_get_state); + // add the buttons + for (button = 0; button < 4; button++) + { + input_item_id itemid = (input_item_id) (ITEM_ID_BUTTON1+button); + sprintf(defname, "B%d", button + 1); + input_device_item_add_lightgun(i, defname, &lightgunstate[i].lightgunBUT[button], itemid, generic_button_get_state); + } + } + } + //KEYBOARD retrokbd_device = machine.input().device_class(DEVICE_CLASS_KEYBOARD).add_device("Retrokdb"); @@ -1212,10 +1326,24 @@ static void Set_Default_Option(void) else Add_Option("-nocheat"); - if(mouse_enable) + if(mouse_mode == 0) + { + Add_Option("-nomouse"); + Add_Option("-nolightgun"); + } + if(mouse_mode == 1) + { Add_Option("-mouse"); - else + Add_Option("-multimouse"); + Add_Option("-nolightgun"); + } + if(mouse_mode == 2) + { Add_Option("-nomouse"); + Add_Option("-multimouse"); + Add_Option("-lightgun"); + } + if(hide_gameinfo) Add_Option("-skip_gameinfo"); From 20a4b9dc30e25cbdc8cd02319391e5943ae2f842 Mon Sep 17 00:00:00 2001 From: StormedBubbles <80055191+StormedBubbles@users.noreply.github.com> Date: Tue, 19 Apr 2022 08:39:39 -0400 Subject: [PATCH 2/2] Fix greatgun mappings --- src/mame/drivers/mazerbla.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/mame/drivers/mazerbla.cpp b/src/mame/drivers/mazerbla.cpp index 24c80847ea8..60ee75ea5b3 100644 --- a/src/mame/drivers/mazerbla.cpp +++ b/src/mame/drivers/mazerbla.cpp @@ -1315,20 +1315,24 @@ static INPUT_PORTS_START( greatgun ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 Fire") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Fire") PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) + PORT_START("STICK0_X") /* Strobe 6: horizontal movement of gun */ - PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(7) PORT_PLAYER(1) + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_MINMAX(0x00, 0xff) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(7) PORT_PLAYER(1) + PORT_START("STICK0_Y") /* Strobe 7: vertical movement of gun */ - PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(7) PORT_PLAYER(1) + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_MINMAX(0x00, 0xff) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(7) PORT_PLAYER(1) PORT_START("STICK1_X") /* Strobe 8: horizontal movement of gun */ - PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(7) PORT_PLAYER(2) + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_MINMAX(0x00, 0xff) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(7) PORT_PLAYER(2) + PORT_START("STICK1_Y") /* Strobe 9: vertical movement of gun */ - PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(7) PORT_PLAYER(2) + // for whatever reason this should be inverted? + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_MINMAX(0x00, 0xff) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_INVERT PORT_KEYDELTA(7) PORT_PLAYER(2) PORT_START("UNUSED") PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) ================================================ FILE: packages/sx05re/libretro/mame2016/patches/bgfx.patch ================================================ --- a/3rdparty/bgfx/src/config.h 2020-01-14 08:42:35.023108564 +0100 +++ b/3rdparty/bgfx/src/config.h 2020-01-14 08:42:39.527041246 +0100 @@ -12,7 +12,7 @@ # define BGFX_CONFIG_DEBUG 0 #endif // BGFX_CONFIG_DEBUG -#if !defined(BGFX_CONFIG_RENDERER_DIRECT3D9) \ +#if 0 && !defined(BGFX_CONFIG_RENDERER_DIRECT3D9) \ && !defined(BGFX_CONFIG_RENDERER_DIRECT3D11) \ && !defined(BGFX_CONFIG_RENDERER_DIRECT3D12) \ && !defined(BGFX_CONFIG_RENDERER_METAL) \ ================================================ FILE: packages/sx05re/libretro/mame2016/patches/build.patch ================================================ --- a/makefile 2020-01-08 21:26:00.559307012 +0100 +++ b/makefile 2020-01-08 21:26:17.743082994 +0100 @@ -1499,7 +1499,7 @@ @echo Compressing $<... $(SILENT)$(PYTHON) scripts/build/complay.py $< $@ layout_$(basename $(notdir $<)) -$(GENDIR)/mame/drivers/ymmu100.hxx: $(SRC)/mame/drivers/ymmu100.ppm scripts/build/file2str.py +$(GENDIR)/mame/drivers/ymmu100.hxx: $(SRC)/mame/drivers/ymmu100.ppm scripts/build/file2str.py | $(GEN_FOLDERS) @echo Converting $<... $(SILENT)$(PYTHON) scripts/build/file2str.py $< $@ ymmu100_bkg UINT8 --- a/3rdparty/genie/src/actions/make/make_cpp.lua 2020-01-09 10:47:07.915711959 +0100 +++ b/3rdparty/genie/src/actions/make/make_cpp.lua 2020-01-09 10:47:10.627673879 +0100 @@ -474,7 +474,7 @@ function cpp.fileRules(prj) for _, file in ipairs(prj.files or {}) do if path.isSourceFile(file) then - _p('$(OBJDIR)/%s.o: %s $(GCH)' + _p('$(OBJDIR)/%s.o: %s $(GCH) | $(OBJDIRS)' , _MAKE.esc(path.trimdots(path.removeext(file))) , _MAKE.esc(file) ) @@ -497,7 +497,7 @@ _p('') elseif (path.getextension(file) == ".rc") then - _p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file)) + _p('$(OBJDIR)/%s.res: %s | $(OBJDIRS)', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file)) if prj.msgresource then _p('\t@echo ' .. prj.msgresource) else --- a/3rdparty/genie/src/host/scripts.c 2020-01-10 15:55:33.330479398 +0100 +++ b/3rdparty/genie/src/host/scripts.c 2020-01-10 15:56:01.313900664 +0100 @@ -222,7 +222,7 @@ "E.esc(path.trimdots(path.removeext(file)))\n)\nend\nend\nend\n_p('')\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\nmake.settings(cfg, cc)\n_p('endif')\n_p('')\nend\nfunction cpp.platformtools(cfg, cc)\nlocal platform = cc.platforms[cfg.platform]\nif platform.cc then\n_p(' CC = %s', platform.cc)\nend\nif platform.cxx then\n_p(' CXX = %s', platform.cxx)\nend\nif platform.ar then\n_p(' AR = %s', platform.ar)\nend\nend\nfunction cpp.flags(cf" "g, cc)\nif cfg.pchheader and not cfg.flags.NoPCH then\n_p(' FORCE_INCLUDE += -include $(OBJDIR)/$(notdir $(PCH))')\nend\nif #cfg.forcedincludes > 0 then\n_p(' FORCE_INCLUDE += -include %s'\n,_MAKE.esc(table.concat(cfg.forcedincludes, \";\")))\nend\n_p(' ALL_CPPFLAGS += $(CPPFLAGS) %s $(DEFINES) $(INCLUDES)', table.concat(cc.getcppflags(cfg), \" \"))\n_p(' ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)))\n_p(' ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)))\n_p(' ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)))\n_p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s',\n make.list(table.join(cc.getdefines(cfg.resdefines),\n cc.getincludedi" "rs(cfg.resincludedirs), cfg.resoptions)))\nend\nfunction cpp.linker(prj, cfg, cc)\n_p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions)))\n_p(' LDDEPS +=%s', make.list(_MAKE.esc(premake.getlinks(cfg, \"siblings\", \"fullpath\"))))\n_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))\n_p(' EXTERNAL_LIBS +=%s', make.list(cc.getlibfiles(cfg)))\nif cfg.kind == \"StaticLib\" then\nif (not prj.options.ArchiveSplit) then\n_p(' LINKCMD = $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, false)))\nelse\n_p(' LINKCMD = $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, false)))\n_p(' LINKCMD_NDX= $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, true)))\nend\nelse\nlocal tool = iif(cfg.language == \"C\", \"CC\", \"CXX\")\n_p(' LINKCMD = $(%s) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)', tool)\nend\nend\nfunction cpp.pchconfig(cfg)\nif not cfg.pchheader or cfg.flags.NoPC" - "H then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH) | $(OBJDIR)')\nif prj.msgprecompile then\n_p('\\t@echo ' .. prj.msgprecompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nlocal cmd = iif(prj.language == \"C\", \"$(CC) $(ALL_CFLAGS) -x c-header\", \"$(CXX) $(ALL_CXXFLAGS) -x c++-header\")\n_p('\\t$(SILENT) %s $(DEFINES) $(INCLUDES) -o \"$@\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj)\nfor _, file in ipairs(prj.files or {}) do\nif path.isSourceFile(file) then\n_p('$(OBJDIR)/%s.o: %s $(GCH)'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n)\nif (pat" + "H then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH) | $(OBJDIR)')\nif prj.msgprecompile then\n_p('\\t@echo ' .. prj.msgprecompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nlocal cmd = iif(prj.language == \"C\", \"$(CC) $(ALL_CFLAGS) -x c-header\", \"$(CXX) $(ALL_CXXFLAGS) -x c++-header\")\n_p('\\t$(SILENT) %s $(DEFINES) $(INCLUDES) -o \"$@\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj)\nfor _, file in ipairs(prj.files or {}) do\nif path.isSourceFile(file) then\n_p('$(OBJDIR)/%s.o: %s $(GCH) | $(OBJDIRS)'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n)\nif (pat" "h.isobjcfile(file) and prj.msgcompile_objc) then\n_p('\\t@echo ' .. prj.msgcompile_objc)\nelseif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nif (path.isobjcfile(file)) then\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE) -o \"$@\" -c \"$<\"')\nelse\ncpp.buildcommand(path.iscfile(file) and not prj.options.ForceCPP, \"o\")\nend\nfor _, task in ipairs(prj.postcompiletasks or {}) do\n_p('\\t$(SILENT) %s', task)\n_p('')\nend\n_p('')\nelseif (path.getextension(file) == \".rc\") then\n_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))\nif prj.msgresource then\n_p('\\t@echo ' .. prj.msgresource)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) $(RESCOMP) $< -O coff -o \"$@\" $(ALL_RESFLAGS)')\n_p('')\nend\nend\nend\nfunction cpp.dependencyRules(prj)\nfor _, dependency in ipairs(prj.dependency or {}) do\nfor _, dep in ipairs(dependency or {}) do\nif (dep[3]==nil or dep[3]==false) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.es" "c(path.trimdots(path.removeext(path.getrelative(prj.location, dep[1]))))\n, _MAKE.esc(path.getrelative(prj.location, dep[2]))\n)\nelse\n_p('%s: %s'\n, _MAKE.esc(dep[1])\n, _MAKE.esc(path.getrelative(prj.location, dep[2]))\n)\nend\n_p('')\nend\nend\nend\nfunction cpp.buildcommand(iscfile, objext)\nlocal flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')\n_p('\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$@\" -c \"$<\"', flags, objext)\nend\n", ================================================ FILE: packages/sx05re/libretro/mame2016/patches/genie.patch ================================================ --- a/3rdparty/genie/build/gmake.linux/genie.make 2020-01-14 06:27:22.077161784 +0100 +++ b/3rdparty/genie/build/gmake.linux/genie.make 2020-01-14 06:27:49.856857764 +0100 @@ -28,8 +28,12 @@ RM = $(SILENT) del /F "$(subst /,\\,$(1))" 2> nul || exit 0 endif -CC = gcc -CXX = g++ +CC = $(HOST_CC) +CXX = $(HOST_CXX) +CPPFLAGS = $(HOST_CPPFLAGS) +CFLAGS = $(HOST_CFLAGS) +CXXFLAGS = $(HOST_CXXFLAGS) +LDFLAGS = $(HOST_LDFLAGS) AR = ar ifndef RESCOMP @@ -247,211 +243,211 @@ $(SILENT) $(CC) $(ALL_CFLAGS) -x c-header $(DEFINES) $(INCLUDES) -o "$@" -c "$<" endif -$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c $(GCH) +$(OBJDIR)/src/host/scripts.o: ../../src/host/scripts.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_stat.o: ../../src/host/os_stat.c $(GCH) +$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_chdir.o: ../../src/host/os_chdir.c $(GCH) +$(OBJDIR)/src/host/string_endswith.o: ../../src/host/string_endswith.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c $(GCH) +$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c $(GCH) +$(OBJDIR)/src/host/premake.o: ../../src/host/premake.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c $(GCH) +$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_ticks.o: ../../src/host/os_ticks.c $(GCH) +$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c $(GCH) +$(OBJDIR)/src/host/os_ticks.o: ../../src/host/os_ticks.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/scripts.o: ../../src/host/scripts.c $(GCH) +$(OBJDIR)/src/host/os_stat.o: ../../src/host/os_stat.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/string_endswith.o: ../../src/host/string_endswith.c $(GCH) +$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c $(GCH) +$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c $(GCH) +$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c $(GCH) +$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c $(GCH) +$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/premake.o: ../../src/host/premake.c $(GCH) +$(OBJDIR)/src/host/os_isdir.o: ../../src/host/os_isdir.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_isdir.o: ../../src/host/os_isdir.c $(GCH) +$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c $(GCH) +$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c $(GCH) +$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c $(GCH) +$(OBJDIR)/src/host/os_chdir.o: ../../src/host/os_chdir.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/ldump.o: ../../src/host/lua-5.3.0/src/ldump.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lzio.o: ../../src/host/lua-5.3.0/src/lzio.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lvm.o: ../../src/host/lua-5.3.0/src/lvm.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lvm.o: ../../src/host/lua-5.3.0/src/lvm.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/ltable.o: ../../src/host/lua-5.3.0/src/ltable.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lutf8lib.o: ../../src/host/lua-5.3.0/src/lutf8lib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lstrlib.o: ../../src/host/lua-5.3.0/src/lstrlib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lundump.o: ../../src/host/lua-5.3.0/src/lundump.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/liolib.o: ../../src/host/lua-5.3.0/src/liolib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/ltm.o: ../../src/host/lua-5.3.0/src/ltm.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lcode.o: ../../src/host/lua-5.3.0/src/lcode.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/ltablib.o: ../../src/host/lua-5.3.0/src/ltablib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lparser.o: ../../src/host/lua-5.3.0/src/lparser.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/ltable.o: ../../src/host/lua-5.3.0/src/ltable.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/loadlib.o: ../../src/host/lua-5.3.0/src/loadlib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lstrlib.o: ../../src/host/lua-5.3.0/src/lstrlib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lbitlib.o: ../../src/host/lua-5.3.0/src/lbitlib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lstring.o: ../../src/host/lua-5.3.0/src/lstring.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lzio.o: ../../src/host/lua-5.3.0/src/lzio.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lstate.o: ../../src/host/lua-5.3.0/src/lstate.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/ldblib.o: ../../src/host/lua-5.3.0/src/ldblib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lparser.o: ../../src/host/lua-5.3.0/src/lparser.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lmathlib.o: ../../src/host/lua-5.3.0/src/lmathlib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/loslib.o: ../../src/host/lua-5.3.0/src/loslib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lfunc.o: ../../src/host/lua-5.3.0/src/lfunc.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lopcodes.o: ../../src/host/lua-5.3.0/src/lopcodes.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lmem.o: ../../src/host/lua-5.3.0/src/lmem.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lobject.o: ../../src/host/lua-5.3.0/src/lobject.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lgc.o: ../../src/host/lua-5.3.0/src/lgc.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/loadlib.o: ../../src/host/lua-5.3.0/src/loadlib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lstring.o: ../../src/host/lua-5.3.0/src/lstring.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lmem.o: ../../src/host/lua-5.3.0/src/lmem.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/linit.o: ../../src/host/lua-5.3.0/src/linit.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lmathlib.o: ../../src/host/lua-5.3.0/src/lmathlib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/ltm.o: ../../src/host/lua-5.3.0/src/ltm.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/llex.o: ../../src/host/lua-5.3.0/src/llex.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lapi.o: ../../src/host/lua-5.3.0/src/lapi.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/liolib.o: ../../src/host/lua-5.3.0/src/liolib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lctype.o: ../../src/host/lua-5.3.0/src/lctype.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/linit.o: ../../src/host/lua-5.3.0/src/linit.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lstate.o: ../../src/host/lua-5.3.0/src/lstate.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lgc.o: ../../src/host/lua-5.3.0/src/lgc.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lbaselib.o: ../../src/host/lua-5.3.0/src/lbaselib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lfunc.o: ../../src/host/lua-5.3.0/src/lfunc.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/ltablib.o: ../../src/host/lua-5.3.0/src/ltablib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/ldump.o: ../../src/host/lua-5.3.0/src/ldump.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o: ../../src/host/lua-5.3.0/src/lauxlib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/ldo.o: ../../src/host/lua-5.3.0/src/ldo.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lcorolib.o: ../../src/host/lua-5.3.0/src/lcorolib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/ldebug.o: ../../src/host/lua-5.3.0/src/ldebug.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/llex.o: ../../src/host/lua-5.3.0/src/llex.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/ldblib.o: ../../src/host/lua-5.3.0/src/ldblib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/ldo.o: ../../src/host/lua-5.3.0/src/ldo.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lctype.o: ../../src/host/lua-5.3.0/src/lctype.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lundump.o: ../../src/host/lua-5.3.0/src/lundump.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lcorolib.o: ../../src/host/lua-5.3.0/src/lcorolib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lopcodes.o: ../../src/host/lua-5.3.0/src/lopcodes.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lcode.o: ../../src/host/lua-5.3.0/src/lcode.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lutf8lib.o: ../../src/host/lua-5.3.0/src/lutf8lib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lbitlib.o: ../../src/host/lua-5.3.0/src/lbitlib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/loslib.o: ../../src/host/lua-5.3.0/src/loslib.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lbaselib.o: ../../src/host/lua-5.3.0/src/lbaselib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/lobject.o: ../../src/host/lua-5.3.0/src/lobject.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o: ../../src/host/lua-5.3.0/src/lauxlib.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" -$(OBJDIR)/src/host/lua-5.3.0/src/ldebug.o: ../../src/host/lua-5.3.0/src/ldebug.c $(GCH) +$(OBJDIR)/src/host/lua-5.3.0/src/lapi.o: ../../src/host/lua-5.3.0/src/lapi.c $(GCH) | $(OBJDIRS) @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<" ================================================ FILE: packages/sx05re/libretro/mame2016/patches/mame2016-libretro-crosscompile.patch ================================================ --- a/scripts/toolchain.lua 2019-04-03 12:13:08.556919475 +0200 +++ b/scripts/toolchain.lua 2019-04-03 12:13:43.323043587 +0200 @@ -675,9 +675,6 @@ configuration { "linux-gcc", "x32" } objdir (_buildDir .. "linux_gcc" .. "/obj") - buildoptions { - "-m32", - } configuration { "linux-gcc", "x32", "Release" } targetdir (_buildDir .. "linux_gcc" .. "/bin/x32/Release") --- a/3rdparty/genie/src/host/scripts.c 2019-04-03 12:30:33.272654617 +0200 +++ b/3rdparty/genie/src/host/scripts.c 2019-04-03 12:30:12.892921812 +0200 @@ -131,7 +131,7 @@ "gs(cfg)\nlocal result = table.translate(cfg.flags, flags)\nreturn result\nend\nfunction premake.dotnet.getkind(cfg)\nif (cfg.kind == \"ConsoleApp\") then\nreturn \"Exe\"\nelseif (cfg.kind == \"WindowedApp\") then\nreturn \"WinExe\"\nelseif (cfg.kind == \"SharedLib\") then\nreturn \"Library\"\nend\nend", /* tools/gcc.lua */ - "premake.gcc = { }\npremake.gcc.cc = \"gcc\"\npremake.gcc.cxx = \"g++\"\npremake.gcc.ar = \"ar\"\npremake.gcc.llvm = false\nlocal cflags =\n{\nEnableSSE = \"-msse\",\nEnableSSE2 = \"-msse2\",\nEnableAVX = \"-mavx\",\nEnableAVX2 = \"-mavx2\",\nExtraWarnings = \"-Wall -Wextra\",\nFatalWarnings = \"-Werror\",\nFloatFast = \"-ffast-math\",\nFloatStrict = \"-ffloat-store\",\nNoFramePointer = \"-fomit-frame-pointer\",\nOptimize = \"-O2\",\nOptimizeSize = \"-Os\",\nOptimizeSpeed = \"-O3\",\nSymbols = \"-g\",\n}\nlocal cxxflags =\n{\nNoExceptions = \"-fno-exceptions\",\nNoRTTI = \"-fno-rtti\",\nUnsignedChar = \"-funsigned-char\",\n}\npremake.gcc.platforms =\n{\nNative = {\ncppflags = \"-MMD -MP\",\n},\nx32 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m32\",\n},\nx64 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m64\",\n},\nUniversal = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch x86_64 -arch ppc -arch ppc64\",\n}," + "premake.gcc = { }\npremake.gcc.cc = \"gcc\"\npremake.gcc.cxx = \"g++\"\npremake.gcc.ar = \"ar\"\npremake.gcc.llvm = false\nlocal cflags =\n{\nEnableSSE = \"-msse\",\nEnableSSE2 = \"-msse2\",\nEnableAVX = \"-mavx\",\nEnableAVX2 = \"-mavx2\",\nExtraWarnings = \"-Wall -Wextra\",\nFatalWarnings = \"-Werror\",\nFloatFast = \"-ffast-math\",\nFloatStrict = \"-ffloat-store\",\nNoFramePointer = \"-fomit-frame-pointer\",\nOptimize = \"-O2\",\nOptimizeSize = \"-Os\",\nOptimizeSpeed = \"-O3\",\nSymbols = \"-g\",\n}\nlocal cxxflags =\n{\nNoExceptions = \"-fno-exceptions\",\nNoRTTI = \"-fno-rtti\",\nUnsignedChar = \"-funsigned-char\",\n}\npremake.gcc.platforms =\n{\nNative = {\ncppflags = \"-MMD -MP\",\n},\nx32 = {\ncppflags = \"-MMD -MP\",\n},\nx64 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m64\",\n},\nUniversal = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch x86_64 -arch ppc -arch ppc64\",\n}," "\nUniversal32 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch ppc\",\n},\nUniversal64 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch x86_64 -arch ppc64\",\n},\nPS3 = {\ncc = \"ppu-lv2-g++\",\ncxx = \"ppu-lv2-g++\",\nar = \"ppu-lv2-ar\",\ncppflags = \"-MMD -MP\",\n},\nWiiDev = {\ncppflags = \"-MMD -MP -I$(LIBOGC_INC) $(MACHDEP)\",\nldflags= \"-L$(LIBOGC_LIB) $(MACHDEP)\",\ncfgsettings = [[\n ifeq ($(strip $(DEVKITPPC)),)\n $(error \"DEVKITPPC environment variable is not set\")'\n endif\n include $(DEVKITPPC)/wii_rules']],\n},\nOrbis = {\ncc = \"orbis-clang\",\ncxx = \"orbis-clang++\",\nar = \"orbis-ar\",\ncppflags = \"-MMD -MP\",\n}\n}\nlocal platforms = premake.gcc.platforms\nfunction premake.gcc.getcppflags(cfg)\nlocal flags = { }\ntable.insert(flags, platforms[cfg.platform].cppflags)\nif flags[1]:startswith(\"-MMD\") then\ntable.insert(flags, \"-MP\")\nend\nreturn flags\nend\nfunction " "premake.gcc.getcflags(cfg)\nlocal result = table.translate(cfg.flags, cflags)\ntable.insert(result, platforms[cfg.platform].flags)\nif cfg.system ~= \"windows\" and cfg.kind == \"SharedLib\" then\ntable.insert(result, \"-fPIC\")\nend\nreturn result\nend\nfunction premake.gcc.getcxxflags(cfg)\nlocal result = table.translate(cfg.flags, cxxflags)\nreturn result\nend\nfunction premake.gcc.getldflags(cfg)\nlocal result = { }\nif not cfg.flags.Symbols then\nif cfg.system == \"macosx\" then\nelse\ntable.insert(result, \"-s\")\nend\nend\nif cfg.kind == \"SharedLib\" then\nif cfg.system == \"macosx\" then\ntable.insert(result, \"-dynamiclib\")\nelse\ntable.insert(result, \"-shared\")\nend\nif cfg.system == \"windows\" and not cfg.flags.NoImportLib then\ntable.insert(result, '-Wl,--out-implib=\"' .. cfg.linktarget.fullpath .. '\"')\nend\nend\nif cfg.kind == \"WindowedApp\" and cfg.system == \"windows\" then\ntable.insert(result, \"-mwindows\")\nend\nlocal platform = platforms[cfg.platform]\ntable.insert(result, platform" ".flags)\ntable.insert(result, platform.ldflags)\nreturn result\nend\nfunction premake.gcc.getlibdirflags(cfg)\nlocal result = { }\nfor _, value in ipairs(premake.getlinks(cfg, \"all\", \"directory\")) do\ntable.insert(result, '-L' .. _MAKE.esc(value))\nend\nreturn result\nend\nfunction premake.gcc.islibfile(p)\nif path.getextension(p) == \".a\" then\nreturn true\nend\nreturn false\nend\nfunction premake.gcc.getlibfiles(cfg)\nlocal result = {}\nfor _, value in ipairs(premake.getlinks(cfg, \"system\", \"fullpath\")) do\nif premake.gcc.islibfile(value) then\ntable.insert(result, _MAKE.esc(value))\nend\nend\nreturn result\nend\nfunction premake.gcc.getlinkflags(cfg)\nlocal result = {}\nfor _, value in ipairs(premake.getlinks(cfg, \"system\", \"fullpath\")) do\nif premake.gcc.islibfile(value) then\ntable.insert(result, _MAKE.esc(value))\nelseif path.getextension(value) == \".framework\" then\ntable.insert(result, '-framework ' .. _MAKE.esc(path.getbasename(value)))\nelse\ntable.insert(result, '-l' .. _MAKE.esc(path" ================================================ FILE: packages/sx05re/libretro/mame2016/patches/pregenerate.patch ================================================ --- a/makefile 2020-01-15 17:56:35.780589637 +0100 +++ b/makefile 2020-01-15 17:56:15.020900841 +0100 @@ -1201,16 +1201,19 @@ .PHONY: linux_x64 linux_x64: generate $(PROJECTDIR)/gmake-linux/Makefile $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)64 precompile + $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)64 dasm $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)64 .PHONY: linux_x86 linux_x86: generate $(PROJECTDIR)/gmake-linux/Makefile $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)32 precompile + $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)32 dasm $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)32 .PHONY: linux linux: generate $(PROJECTDIR)/gmake-linux/Makefile $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG) precompile + $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG) dasm $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG) #------------------------------------------------- ================================================ FILE: packages/sx05re/libretro/mame2016/patches/pythonfix.patch ================================================ --- a/src/devices/cpu/tms57002/tmsmake.py +++ b/src/devices/cpu/tms57002/tmsmake.py @@ -323,7 +323,7 @@ def LoadLst(filename): instructions = [] ins = None - for n, line in enumerate(open(filename, "rU")): + for n, line in enumerate(open(filename, "r")): line = line.rstrip() if not line and ins: # new lines separate intructions --- a/src/devices/cpu/m6502/m6502make.py +++ b/src/devices/cpu/m6502/m6502make.py @@ -18,7 +18,7 @@ opcodes = [] logging.info("load_opcodes: %s", fname) try: - f = open(fname, "rU") + f = open(fname, "r") except Exception: err = sys.exc_info()[1] logging.error("cannot read opcodes file %s [%s]", fname, err) @@ -41,7 +41,7 @@ logging.info("load_disp: %s", fname) states = [] try: - f = open(fname, "rU") + f = open(fname, "r") except Exception: err = sys.exc_info()[1] logging.error("cannot read display file %s [%s]", fname, err) --- a/src/devices/cpu/m6809/m6809make.py +++ b/src/devices/cpu/m6809/m6809make.py @@ -16,7 +16,7 @@ if path != "": path += '/' try: - f = open(fname, "rU") + f = open(fname, "r") except Exception: err = sys.exc_info()[1] sys.stderr.write("Cannot read opcodes file %s [%s]\n" % (fname, err)) --- a/src/devices/cpu/mcs96/mcs96make.py +++ b/src/devices/cpu/mcs96/mcs96make.py @@ -73,7 +73,7 @@ self.ea = {} self.macros = {} try: - f = open(fname, "rU") + f = open(fname, "r") except Exception: err = sys.exc_info()[1] sys.stderr.write("Cannot read opcodes file %s [%s]\n" % (fname, err)) ================================================ FILE: packages/sx05re/libretro/melonds/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="melonds" PKG_VERSION="7a3c11ff970cd36ca806961fae6db94b30dd5401" PKG_SHA256="382d7522a626a7bd590b4d5dca0d76a2dd0805f41ab6ec130b683ee45b4a937d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/melonds" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="DS emulator, sorta" PKG_LONGDESC="DS emulator, sorta" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" PKG_USE_CMAKE="no" configure_target() { cd ${PKG_BUILD} PKG_MAKE_OPTS_TARGET+=" HAVE_OPENGL=0 HAVE_NEON=1" } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp melonds_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/meowpc98/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="meowpc98" PKG_VERSION="dc905d4e10470ff65a38e8b9e1a75b43b9b12149" PKG_SHA256="1d0e528fdccaa533a54529975a1b298f63fb52c338a8208dd34a6f7f35b20039" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Unknown" PKG_SITE="https://github.com/libretro/libretro-meowPC98" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Neko Project 2 (PC98 emulator) port for libretro/RetroArch" PKG_LONGDESC="Neko Project 2 (PC98 emulator) port for libretro/RetroArch" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make -C libretro -f Makefile.libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp libretro/nekop2_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/mesen/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="mesen" PKG_VERSION="791c5e8153ee6e29691d45b5df2cf1151ff416f9" PKG_SHA256="b39cad667603a116b38ddea1b96b88001d8e469637bd0ff3838a7a536eff1bf4" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/Mesen" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Mesen is a cross-platform (Windows & Linux) NES/Famicom emulator built in C++ and C#" PKG_LONGDESC="Mesen is a cross-platform (Windows & Linux) NES/Famicom emulator built in C++ and C#" PKG_TOOLCHAIN="make" make_target() { LTO=true make -C Libretro/ } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp Libretro/mesen_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/mesen-s/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="mesen-s" PKG_VERSION="d4fca31a6004041d99b02199688f84c009c55967" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/Mesen-S" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Mesen-S is a cross-platform (Windows & Linux) SNES emulator built in C++ and C#" PKG_LONGDESC="Mesen-S is a cross-platform (Windows & Linux) SNES emulator built in C++ and C#" PKG_TOOLCHAIN="make" GET_HANDLER_SUPPORT="git" make_target() { LTO=true make -C Libretro/ } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp Libretro/mesen-s_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/meteor/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="meteor" PKG_VERSION="e533d300d0561564451bde55a2b73119c768453c" PKG_SHA256="09df1661aa8d5c830e9ef3b62f01d7e2ae108bce2572e199b181e0c13d87e084" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/meteor-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Libretro port of Meteor GBA emulator." PKG_LONGDESC="Meteor is a Nintendo Gameboy Advance emulator." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" PKG_USE_CMAKE="no" make_target() { make -C ../libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ../libretro/meteor_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/mgba/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="mgba" PKG_VERSION="c758314a639aa0066e7b65a8341448181b73c804" PKG_SHA256="2cb97ada9b75d23ef4838fb2c1b52335bf0bba867f98d790d4ec2cf4d3b9e050" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MPLv2.0" PKG_SITE="https://github.com/libretro/mgba" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="mGBA Game Boy Advance Emulator" PKG_LONGDESC="mGBA is a new emulator for running Game Boy Advance games. It aims to be faster and more accurate than many existing Game Boy Advance emulators, as well as adding features that other emulators lack." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" PKG_USE_CMAKE="no" make_target() { cd ${PKG_BUILD} if [[ "${ARCH}" =~ "arm" ]]; then make -f Makefile.libretro platform=unix-armv HAVE_NEON=1 else make -f Makefile.libretro fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mgba_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/minivmac/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # EmuELEC package for Mini vMac (libretro-minivmac) core PKG_NAME="minivmac" PKG_VERSION="e7fcfef" PKG_LICENSE="GPL-2.0-only" PKG_SITE="https://github.com/libretro/libretro-minivmac" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="emuelec/libretro" PKG_SHORTDESC="Mini vMac Macintosh II emulator (libretro core)" PKG_LONGDESC="libretro-minivmac is a libretro port of Mini vMac, a classic Macintosh II emulator." PKG_TOOLCHAIN="make" make_target() { make -C "${PKG_BUILD}" } makeinstall_target() { mkdir -p "${INSTALL}/usr/lib/libretro" cp "${PKG_BUILD}/minivmac_libretro.so" \ "${INSTALL}/usr/lib/libretro/" } ================================================ FILE: packages/sx05re/libretro/mojozork/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2025-present EmuELEC (https://github.com/EmuELEC) PKG_NAME="mojozork" PKG_VERSION="517ccff5ad6a811f948fadc0489b45c32f177c42" PKG_SHA256="" PKG_LICENSE="Zlib" PKG_SITE="https://github.com/icculus/mojozork" PKG_URL="https://github.com/icculus/mojozork/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="MojoZork: Z-Machine implementation as libretro core" PKG_TOOLCHAIN="manual" PKG_LIBNAME="mojozork_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" make_target() { cd ${PKG_BUILD} ${CC} -o ${PKG_LIBNAME} mojozork-libretro.c -shared -fPIC ${CFLAGS} ${LDFLAGS} } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_LIBPATH} ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/mrboom/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="mrboom" PKG_VERSION="d011acfbdb2d93ed38bd684ccfa0db79bda1c932" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/mrboom-libretro" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Mr.Boom is a 8 players Bomberman clone for RetroArch/Libretro" PKG_LONGDESC="Mr.Boom is a 8 players Bomberman clone for RetroArch/Libretro" PKG_TOOLCHAIN="make" GET_HANDLER_SUPPORT="git" pre_configure_target() { if [ "${ARCH}" == "arm" ]; then PKG_MAKE_OPTS_TARGET="platform=classic_armv7_a7" #else #PKG_MAKE_OPTS_TARGET="platform=classic_armv7_a7" fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mrboom_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/multiemu/config/ini/fmtownsftv.ini ================================================ # # CORE CONFIGURATION OPTIONS # readconfig 1 writeconfig 1 # # CORE SEARCH PATH OPTIONS # homepath /storage/roms/bios/mame/ rompath /storage/roms/fmtownsux hashpath /storage/roms/bios/mame/hash samplepath /storage/roms/bios/mame/samples artpath /storage/roms/bios/mame/artwork ctrlrpath system/mame/ctrlr inipath /storage/roms/bios/mame/ini fontpath system/mame/ cheatpath /storage/roms/bios/mame/cheat crosshairpath system/mame/crosshair pluginspath /storage/roms/bios/mame/plugins languagepath system/mame/language swpath system/mame/software # # CORE OUTPUT DIRECTORY OPTIONS # cfg_directory /storage/roms/mame/fmtownsux/raiden//mame/cfg nvram_directory /storage/roms/mame/fmtownsux/raiden//mame/nvram input_directory /storage/roms/mame/fmtownsux/raiden//mame/input state_directory /storage/roms/mame/fmtownsux/raiden//mame/states snapshot_directory /storage/roms/mame/fmtownsux/raiden//mame/snaps diff_directory /storage/roms/mame/fmtownsux/raiden//mame/diff comment_directory system/mame/comments share_directory system/mame/share # # CORE STATE/PLAYBACK OPTIONS # state autosave 0 rewind 0 rewind_capacity 100 playback record exit_after_playback 0 mngwrite aviwrite wavwrite snapname %g/%i snapsize auto snapview auto snapbilinear 1 statename %g/mouse burnin 0 # # CORE PERFORMANCE OPTIONS # autoframeskip 0 frameskip 0 seconds_to_run 0 throttle 0 sleep 1 speed 1.0 refreshspeed 0 lowlatency 0 # # CORE RENDER OPTIONS # keepaspect 1 unevenstretch 1 unevenstretchx 0 unevenstretchy 0 autostretchxy 0 intoverscan 0 intscalex 0 intscaley 0 # # CORE ROTATION OPTIONS # rotate 0 ror 0 rol 0 autoror 0 autorol 0 flipx 0 flipy 0 # # CORE ARTWORK OPTIONS # artwork_crop 0 fallback_artwork override_artwork # # CORE SCREEN OPTIONS # brightness 1.0 contrast 1.0 gamma 1.0 pause_brightness 0.65 effect none # # CORE VECTOR OPTIONS # beam_width_min 1.0 beam_width_max 1.0 beam_dot_size 1.0 beam_intensity_weight 0 flicker 0 # # CORE SOUND OPTIONS # samplerate 48000 samples 1 volume 0 compressor 1 speaker_report 0 # # CORE INPUT OPTIONS # coin_lockout 1 ctrlr mouse 1 joystick 1 lightgun 0 multikeyboard 0 multimouse 1 steadykey 0 ui_active 1 offscreen_reload 0 joystick_map auto joystick_deadzone 0.15 joystick_saturation 0.85 joystick_threshold 0.30 natural 0 joystick_contradictory 0 coin_impulse 0 # # CORE INPUT AUTOMATIC ENABLE OPTIONS # paddle_device keyboard adstick_device keyboard pedal_device keyboard dial_device keyboard trackball_device keyboard lightgun_device keyboard positional_device keyboard mouse_device mouse # # CORE DEBUGGING OPTIONS # verbose 0 log 0 oslog 0 debug 0 update_in_pause 1 debugscript debuglog 0 # # CORE COMM OPTIONS # comm_localhost 0.0.0.0 comm_localport 15112 comm_remotehost 127.0.0.1 comm_remoteport 15112 comm_framesync 0 # # CORE MISC OPTIONS # drc 1 drc_use_c 0 drc_log_uml 0 drc_log_native 0 bios cheat 0 skip_gameinfo 0 uifont default ui cabinet ramsize 6M confirm_quit 0 ui_mouse 1 language nvram_save 1 # # SCRIPTING OPTIONS # autoboot_command autoboot_delay 0 autoboot_script console 0 plugins 1 plugin noplugin # # HTTP SERVER OPTIONS # http 0 http_port 8080 http_root web # # OSD INPUT MAPPING OPTIONS # uimodekey auto controller_map none background_input 0 # # OSD FONT OPTIONS # uifontprovider auto # # OSD OUTPUT OPTIONS # output auto # # OSD INPUT OPTIONS # keyboardprovider auto mouseprovider auto lightgunprovider auto joystickprovider auto # # OSD DEBUGGING OPTIONS # debugger auto debugger_port 23946 debugger_font auto debugger_font_size 0 watchdog 0 # # OSD PERFORMANCE OPTIONS # numprocessors auto bench 0 # # OSD VIDEO OPTIONS # video auto numscreens 1 window 0 maximize 1 waitvsync 0 syncrefresh 0 monitorprovider auto # # OSD PER-WINDOW VIDEO OPTIONS # screen auto aspect auto resolution auto view auto screen0 auto aspect0 auto resolution0 auto view0 auto screen1 auto aspect1 auto resolution1 auto view1 auto screen2 auto aspect2 auto resolution2 auto view2 auto screen3 auto aspect3 auto resolution3 auto view3 auto # # OSD FULL SCREEN OPTIONS # switchres 0 # # OSD ACCELERATED VIDEO OPTIONS # filter 1 prescale 1 # # OSD SOUND OPTIONS # sound auto audio_latency 2 # # OSD MIDI OPTIONS # midiprovider auto # # OSD EMULATED NETWORKING OPTIONS # networkprovider auto # # BGFX POST-PROCESSING OPTIONS # bgfx_path bgfx bgfx_backend auto bgfx_debug 0 bgfx_screen_chains bgfx_shadow_mask slot-mask.png bgfx_lut lut-default.png bgfx_avi_name auto # # SDL VIDEO OPTIONS # centerh 1 centerv 1 scalemode none # # SDL JOYSTICK MAPPING # joy_idx1 auto joy_idx2 auto joy_idx3 auto joy_idx4 auto joy_idx5 auto joy_idx6 auto joy_idx7 auto joy_idx8 auto sixaxis 0 # # SDL MOUSE MAPPING # mouse_index1 auto mouse_index2 auto mouse_index3 auto mouse_index4 auto mouse_index5 auto mouse_index6 auto mouse_index7 auto mouse_index8 auto # # SDL KEYBOARD MAPPING # keyb_idx1 auto keyb_idx2 auto keyb_idx3 auto keyb_idx4 auto keyb_idx5 auto keyb_idx6 auto keyb_idx7 auto keyb_idx8 auto # # FRONTEND COMMAND OPTIONS # dtd 1 # # SLOT DEVICES # pad1 townspad pad2 mouse # # IMAGE DEVICES # floppydisk1 floppydisk2 cdrom "/storage/roms/fmtownsux/mahoudai/mahou daisakusen (japan).chd" memcard harddisk1 harddisk2 harddisk3 harddisk4 harddisk5 ================================================ FILE: packages/sx05re/libretro/multiemu/config/ini/fmtownshr.ini ================================================ # # CORE CONFIGURATION OPTIONS # readconfig 1 writeconfig 1 # # CORE SEARCH PATH OPTIONS # homepath /storage/roms/bios/mame/ rompath /storage/roms/fmtownsux hashpath /storage/roms/bios/mame/hash samplepath /storage/roms/bios/mame/samples artpath /storage/roms/bios/mame/artwork ctrlrpath system/mame/ctrlr inipath /storage/roms/bios/mame/ini fontpath system/mame/ cheatpath /storage/roms/bios/mame/cheat crosshairpath system/mame/crosshair pluginspath /storage/roms/bios/mame/plugins languagepath system/mame/language swpath system/mame/software # # CORE OUTPUT DIRECTORY OPTIONS # cfg_directory /storage/roms/mame/fmtownsux/raiden//mame/cfg nvram_directory /storage/roms/mame/fmtownsux/raiden//mame/nvram input_directory /storage/roms/mame/fmtownsux/raiden//mame/input state_directory /storage/roms/mame/fmtownsux/raiden//mame/states snapshot_directory /storage/roms/mame/fmtownsux/raiden//mame/snaps diff_directory /storage/roms/mame/fmtownsux/raiden//mame/diff comment_directory system/mame/comments share_directory system/mame/share # # CORE STATE/PLAYBACK OPTIONS # state autosave 0 rewind 0 rewind_capacity 100 playback record exit_after_playback 0 mngwrite aviwrite wavwrite snapname %g/%i snapsize auto snapview auto snapbilinear 1 statename %g/-ui_active burnin 0 # # CORE PERFORMANCE OPTIONS # autoframeskip 0 frameskip 0 seconds_to_run 0 throttle 0 sleep 1 speed 1.0 refreshspeed 0 lowlatency 0 # # CORE RENDER OPTIONS # keepaspect 1 unevenstretch 1 unevenstretchx 0 unevenstretchy 0 autostretchxy 0 intoverscan 0 intscalex 0 intscaley 0 # # CORE ROTATION OPTIONS # rotate 0 ror 0 rol 0 autoror 0 autorol 0 flipx 0 flipy 0 # # CORE ARTWORK OPTIONS # artwork_crop 0 fallback_artwork override_artwork # # CORE SCREEN OPTIONS # brightness 1.0 contrast 1.0 gamma 1.0 pause_brightness 0.65 effect none # # CORE VECTOR OPTIONS # beam_width_min 1.0 beam_width_max 1.0 beam_dot_size 1.0 beam_intensity_weight 0 flicker 0 # # CORE SOUND OPTIONS # samplerate 48000 samples 1 volume 0 compressor 1 speaker_report 0 # # CORE INPUT OPTIONS # coin_lockout 1 ctrlr mouse 1 joystick 1 lightgun 0 multikeyboard 0 multimouse 1 steadykey 0 ui_active 1 offscreen_reload 0 joystick_map auto joystick_deadzone 0.15 joystick_saturation 0.85 joystick_threshold 0.30 natural 0 joystick_contradictory 0 coin_impulse 0 # # CORE INPUT AUTOMATIC ENABLE OPTIONS # paddle_device keyboard adstick_device keyboard pedal_device keyboard dial_device keyboard trackball_device keyboard lightgun_device keyboard positional_device keyboard mouse_device mouse # # CORE DEBUGGING OPTIONS # verbose 0 log 0 oslog 0 debug 0 update_in_pause 1 debugscript debuglog 0 # # CORE COMM OPTIONS # comm_localhost 0.0.0.0 comm_localport 15112 comm_remotehost 127.0.0.1 comm_remoteport 15112 comm_framesync 0 # # CORE MISC OPTIONS # drc 1 drc_use_c 0 drc_log_uml 0 drc_log_native 0 bios cheat 0 skip_gameinfo 0 uifont default ui cabinet ramsize 2M confirm_quit 0 ui_mouse 1 language nvram_save 1 # # SCRIPTING OPTIONS # autoboot_command autoboot_delay 0 autoboot_script console 0 plugins 1 plugin noplugin # # HTTP SERVER OPTIONS # http 0 http_port 8080 http_root web # # OSD INPUT MAPPING OPTIONS # uimodekey auto controller_map none background_input 0 # # OSD FONT OPTIONS # uifontprovider auto # # OSD OUTPUT OPTIONS # output auto # # OSD INPUT OPTIONS # keyboardprovider auto mouseprovider auto lightgunprovider auto joystickprovider auto # # OSD DEBUGGING OPTIONS # debugger auto debugger_port 23946 debugger_font auto debugger_font_size 0 watchdog 0 # # OSD PERFORMANCE OPTIONS # numprocessors auto bench 0 # # OSD VIDEO OPTIONS # video auto numscreens 1 window 0 maximize 1 waitvsync 0 syncrefresh 0 monitorprovider auto # # OSD PER-WINDOW VIDEO OPTIONS # screen auto aspect auto resolution auto view auto screen0 auto aspect0 auto resolution0 auto view0 auto screen1 auto aspect1 auto resolution1 auto view1 auto screen2 auto aspect2 auto resolution2 auto view2 auto screen3 auto aspect3 auto resolution3 auto view3 auto # # OSD FULL SCREEN OPTIONS # switchres 0 # # OSD ACCELERATED VIDEO OPTIONS # filter 1 prescale 1 # # OSD SOUND OPTIONS # sound auto audio_latency 2 # # OSD MIDI OPTIONS # midiprovider auto # # OSD EMULATED NETWORKING OPTIONS # networkprovider auto # # BGFX POST-PROCESSING OPTIONS # bgfx_path bgfx bgfx_backend auto bgfx_debug 0 bgfx_screen_chains bgfx_shadow_mask slot-mask.png bgfx_lut lut-default.png bgfx_avi_name auto # # SDL VIDEO OPTIONS # centerh 1 centerv 1 scalemode none # # SDL JOYSTICK MAPPING # joy_idx1 auto joy_idx2 auto joy_idx3 auto joy_idx4 auto joy_idx5 auto joy_idx6 auto joy_idx7 auto joy_idx8 auto sixaxis 0 # # SDL MOUSE MAPPING # mouse_index1 auto mouse_index2 auto mouse_index3 auto mouse_index4 auto mouse_index5 auto mouse_index6 auto mouse_index7 auto mouse_index8 auto # # SDL KEYBOARD MAPPING # keyb_idx1 auto keyb_idx2 auto keyb_idx3 auto keyb_idx4 auto keyb_idx5 auto keyb_idx6 auto keyb_idx7 auto keyb_idx8 auto # # FRONTEND COMMAND OPTIONS # dtd 1 # # SLOT DEVICES # pad1 townspad pad2 mouse # # IMAGE DEVICES # floppydisk1 /storage/roms/fmtownsux/rbisland/disk1.hdm floppydisk2 cdrom "/storage/roms/fmtownsux/rbisland/rainbow islands - the story of bubble bobble 2 - extra version (japan).chd" memcard harddisk1 harddisk2 harddisk3 harddisk4 harddisk5 ================================================ FILE: packages/sx05re/libretro/multiemu/config/ini/fmtownsux.ini ================================================ # # CORE CONFIGURATION OPTIONS # readconfig 1 writeconfig 1 # # CORE SEARCH PATH OPTIONS # homepath /storage/roms/bios/mame/ rompath /storage/roms/fmtownsux hashpath /storage/roms/bios/mame/hash samplepath /storage/roms/bios/mame/samples artpath /storage/roms/bios/mame/artwork ctrlrpath system/mame/ctrlr inipath /storage/roms/bios/mame/ini fontpath system/mame/ cheatpath /storage/roms/bios/mame/cheat crosshairpath system/mame/crosshair pluginspath /storage/roms/bios/mame/plugins languagepath system/mame/language swpath system/mame/software # # CORE OUTPUT DIRECTORY OPTIONS # cfg_directory /storage/roms/mame/fmtownsux/raiden//mame/cfg nvram_directory /storage/roms/mame/fmtownsux/raiden//mame/nvram input_directory /storage/roms/mame/fmtownsux/raiden//mame/input state_directory /storage/roms/mame/fmtownsux/raiden//mame/states snapshot_directory /storage/roms/mame/fmtownsux/raiden//mame/snaps diff_directory /storage/roms/mame/fmtownsux/raiden//mame/diff comment_directory system/mame/comments share_directory system/mame/share # # CORE STATE/PLAYBACK OPTIONS # state autosave 0 rewind 0 rewind_capacity 100 playback record exit_after_playback 0 mngwrite aviwrite wavwrite snapname %g/%i snapsize auto snapview auto snapbilinear 1 statename %g/mouse burnin 0 # # CORE PERFORMANCE OPTIONS # autoframeskip 0 frameskip 0 seconds_to_run 0 throttle 0 sleep 1 speed 1.0 refreshspeed 0 lowlatency 0 # # CORE RENDER OPTIONS # keepaspect 1 unevenstretch 1 unevenstretchx 0 unevenstretchy 0 autostretchxy 0 intoverscan 0 intscalex 0 intscaley 0 # # CORE ROTATION OPTIONS # rotate 0 ror 0 rol 0 autoror 0 autorol 0 flipx 0 flipy 0 # # CORE ARTWORK OPTIONS # artwork_crop 0 fallback_artwork override_artwork # # CORE SCREEN OPTIONS # brightness 1.0 contrast 1.0 gamma 1.0 pause_brightness 0.65 effect none # # CORE VECTOR OPTIONS # beam_width_min 1.0 beam_width_max 1.0 beam_dot_size 1.0 beam_intensity_weight 0 flicker 0 # # CORE SOUND OPTIONS # samplerate 48000 samples 1 volume 0 compressor 1 speaker_report 0 # # CORE INPUT OPTIONS # coin_lockout 1 ctrlr mouse 1 joystick 1 lightgun 0 multikeyboard 0 multimouse 1 steadykey 0 ui_active 1 offscreen_reload 0 joystick_map auto joystick_deadzone 0.15 joystick_saturation 0.85 joystick_threshold 0.30 natural 0 joystick_contradictory 0 coin_impulse 0 # # CORE INPUT AUTOMATIC ENABLE OPTIONS # paddle_device keyboard adstick_device keyboard pedal_device keyboard dial_device keyboard trackball_device keyboard lightgun_device keyboard positional_device keyboard mouse_device mouse # # CORE DEBUGGING OPTIONS # verbose 1 log 0 oslog 0 debug 0 update_in_pause 1 debugscript debuglog 0 # # CORE COMM OPTIONS # comm_localhost 0.0.0.0 comm_localport 15112 comm_remotehost 127.0.0.1 comm_remoteport 15112 comm_framesync 0 # # CORE MISC OPTIONS # drc 1 drc_use_c 0 drc_log_uml 0 drc_log_native 0 bios cheat 0 skip_gameinfo 0 uifont default ui cabinet ramsize 6M confirm_quit 0 ui_mouse 1 language nvram_save 1 # # SCRIPTING OPTIONS # autoboot_command autoboot_delay 0 autoboot_script console 0 plugins 1 plugin noplugin # # HTTP SERVER OPTIONS # http 0 http_port 8080 http_root web # # OSD INPUT MAPPING OPTIONS # uimodekey auto controller_map none background_input 0 # # OSD FONT OPTIONS # uifontprovider auto # # OSD OUTPUT OPTIONS # output auto # # OSD INPUT OPTIONS # keyboardprovider auto mouseprovider auto lightgunprovider auto joystickprovider auto # # OSD DEBUGGING OPTIONS # debugger auto debugger_port 23946 debugger_font auto debugger_font_size 0 watchdog 0 # # OSD PERFORMANCE OPTIONS # numprocessors auto bench 0 # # OSD VIDEO OPTIONS # video auto numscreens 1 window 0 maximize 1 waitvsync 0 syncrefresh 0 monitorprovider auto # # OSD PER-WINDOW VIDEO OPTIONS # screen auto aspect auto resolution auto view auto screen0 auto aspect0 auto resolution0 auto view0 auto screen1 auto aspect1 auto resolution1 auto view1 auto screen2 auto aspect2 auto resolution2 auto view2 auto screen3 auto aspect3 auto resolution3 auto view3 auto # # OSD FULL SCREEN OPTIONS # switchres 0 # # OSD ACCELERATED VIDEO OPTIONS # filter 1 prescale 1 # # OSD SOUND OPTIONS # sound auto audio_latency 2 # # OSD MIDI OPTIONS # midiprovider auto # # OSD EMULATED NETWORKING OPTIONS # networkprovider auto # # BGFX POST-PROCESSING OPTIONS # bgfx_path bgfx bgfx_backend auto bgfx_debug 0 bgfx_screen_chains default bgfx_shadow_mask slot-mask.png bgfx_lut lut-default.png bgfx_avi_name auto # # SDL VIDEO OPTIONS # centerh 1 centerv 1 scalemode none # # SDL JOYSTICK MAPPING # joy_idx1 auto joy_idx2 auto joy_idx3 auto joy_idx4 auto joy_idx5 auto joy_idx6 auto joy_idx7 auto joy_idx8 auto sixaxis 0 # # SDL MOUSE MAPPING # mouse_index1 auto mouse_index2 auto mouse_index3 auto mouse_index4 auto mouse_index5 auto mouse_index6 auto mouse_index7 auto mouse_index8 auto # # SDL KEYBOARD MAPPING # keyb_idx1 auto keyb_idx2 auto keyb_idx3 auto keyb_idx4 auto keyb_idx5 auto keyb_idx6 auto keyb_idx7 auto keyb_idx8 auto # # FRONTEND COMMAND OPTIONS # dtd 1 # # SLOT DEVICES # pad1 townspad pad2 mouse # # IMAGE DEVICES # floppydisk1 /storage/roms/fmtownsux/rbisland/disk1.hdm floppydisk2 cdrom "/storage/roms/fmtownsux/mahoudai/mahou daisakusen (japan).chd" memcard harddisk1 /storage/roms/fmtownsux/alltynex/alltynex.h0 harddisk2 harddisk3 harddisk4 harddisk5 ================================================ FILE: packages/sx05re/libretro/multiemu/config/ini/mame.ini ================================================ # # CORE CONFIGURATION OPTIONS # readconfig 1 writeconfig 1 # # CORE SEARCH PATH OPTIONS # homepath /storage/roms/bios/mame/ rompath /storage/roms/bios/mame/bios;/storage/roms/pgm2;/storage/roms/fmtownsux hashpath /storage/roms/bios/mame/hash samplepath /storage/roms/bios/mame/samples artpath /storage/roms/bios/mame/artwork ctrlrpath system/mame/ctrlr inipath /storage/roms/bios/mame/ini fontpath system/mame/ cheatpath /storage/roms/bios/mame/cheat crosshairpath system/mame/crosshair pluginspath /storage/roms/bios/mame/plugins languagepath system/mame/language swpath system/mame/software # # CORE OUTPUT DIRECTORY OPTIONS # cfg_directory /storage/roms/mame//cfg nvram_directory /storage/roms/mame/nvram input_directory /storage/roms/mame/input state_directory /storage/roms/mame/states snapshot_directory /storage/roms/mame/snaps diff_directory /storage/roms/mame/diff comment_directory system/mame/comments share_directory system/mame/share # # CORE STATE/PLAYBACK OPTIONS # state autosave 0 rewind 0 rewind_capacity 100 playback record exit_after_playback 0 mngwrite aviwrite wavwrite snapname %g/%i snapsize auto snapview auto snapbilinear 1 statename %g burnin 0 # # CORE PERFORMANCE OPTIONS # autoframeskip 1 frameskip 0 seconds_to_run 0 throttle 1 sleep 1 speed 1.0 refreshspeed 0 lowlatency 0 # # CORE RENDER OPTIONS # keepaspect 1 unevenstretch 1 unevenstretchx 0 unevenstretchy 0 autostretchxy 0 intoverscan 0 intscalex 0 intscaley 0 # # CORE ROTATION OPTIONS # rotate 0 ror 0 rol 0 autoror 0 autorol 0 flipx 0 flipy 0 # # CORE ARTWORK OPTIONS # artwork_crop 0 fallback_artwork override_artwork # # CORE SCREEN OPTIONS # brightness 1.0 contrast 1.0 gamma 1.0 pause_brightness 0.65 effect none # # CORE VECTOR OPTIONS # beam_width_min 1.0 beam_width_max 1.0 beam_dot_size 1.0 beam_intensity_weight 0 flicker 0 # # CORE SOUND OPTIONS # samplerate 48000 samples 1 volume 0 compressor 1 speaker_report 0 # # CORE INPUT OPTIONS # coin_lockout 1 ctrlr mouse 1 joystick 1 lightgun 0 multikeyboard 0 multimouse 1 steadykey 0 ui_active 1 offscreen_reload 0 joystick_map auto joystick_deadzone 0.20 joystick_saturation 1.00 natural 0 joystick_contradictory 0 coin_impulse 0 # # CORE INPUT AUTOMATIC ENABLE OPTIONS # paddle_device keyboard adstick_device keyboard pedal_device keyboard dial_device keyboard trackball_device keyboard lightgun_device keyboard positional_device keyboard mouse_device mouse # # CORE DEBUGGING OPTIONS # verbose 0 log 0 oslog 0 debug 0 update_in_pause 0 debugscript debuglog 0 # # CORE COMM OPTIONS # comm_localhost 0.0.0.0 comm_localport 15112 comm_remotehost 127.0.0.1 comm_remoteport 15112 comm_framesync 0 # # CORE MISC OPTIONS # drc 1 drc_use_c 0 drc_log_uml 0 drc_log_native 0 bios cheat 1 skip_gameinfo 0 uifont default ui cabinet ramsize confirm_quit 0 ui_mouse 1 language nvram_save 1 # # SCRIPTING OPTIONS # autoboot_command autoboot_delay 0 autoboot_script console 0 plugins 1 plugin noplugin # # HTTP SERVER OPTIONS # http 0 http_port 8080 http_root web # # OSD KEYBOARD MAPPING OPTIONS # uimodekey auto # # OSD FONT OPTIONS # uifontprovider auto # # OSD OUTPUT OPTIONS # output auto # # OSD INPUT OPTIONS # keyboardprovider auto mouseprovider auto lightgunprovider auto joystickprovider auto # # OSD DEBUGGING OPTIONS # debugger auto debugger_port 23946 debugger_font auto debugger_font_size 0 watchdog 0 # # OSD PERFORMANCE OPTIONS # numprocessors auto bench 0 # # OSD VIDEO OPTIONS # video auto numscreens 1 window 0 maximize 1 waitvsync 0 syncrefresh 0 monitorprovider auto # # OSD PER-WINDOW VIDEO OPTIONS # screen auto aspect auto resolution auto view auto screen0 auto aspect0 auto resolution0 auto view0 auto screen1 auto aspect1 auto resolution1 auto view1 auto screen2 auto aspect2 auto resolution2 auto view2 auto screen3 auto aspect3 auto resolution3 auto view3 auto # # OSD FULL SCREEN OPTIONS # switchres 0 # # OSD ACCELERATED VIDEO OPTIONS # filter 1 prescale 1 # # OSD SOUND OPTIONS # sound auto audio_latency 2 # # BGFX POST-PROCESSING OPTIONS # bgfx_path bgfx bgfx_backend auto bgfx_debug 0 bgfx_screen_chains default bgfx_shadow_mask slot-mask.png bgfx_lut lut-default.png bgfx_avi_name auto # # SDL VIDEO OPTIONS # centerh 1 centerv 1 scalemode none # # SDL JOYSTICK MAPPING # joy_idx1 auto joy_idx2 auto joy_idx3 auto joy_idx4 auto joy_idx5 auto joy_idx6 auto joy_idx7 auto joy_idx8 auto sixaxis 0 # # SDL MOUSE MAPPING # mouse_index1 auto mouse_index2 auto mouse_index3 auto mouse_index4 auto mouse_index5 auto mouse_index6 auto mouse_index7 auto mouse_index8 auto # # SDL KEYBOARD MAPPING # keyb_idx1 auto keyb_idx2 auto keyb_idx3 auto keyb_idx4 auto keyb_idx5 auto keyb_idx6 auto keyb_idx7 auto keyb_idx8 auto # # SDL LOWLEVEL DRIVER OPTIONS # videodriver auto renderdriver auto audiodriver auto # # FRONTEND COMMAND OPTIONS # dtd 1 ================================================ FILE: packages/sx05re/libretro/multiemu/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019 Trond Haugland (trondah@gmail.com) PKG_NAME="multiemu" PKG_VERSION="61743c76180f1ad454227ed1be0261a071d37d67" PKG_SHA256="cf61595e30235758f1598f575a075db243f9d32d1fb8994679a812d59b936917" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/mame" PKG_URL="https://github.com/libretro/mame/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain zlib flac sqlite expat" PKG_SECTION="libretro" PKG_SHORTDESC="Apple 2, Fmtowns and pgm2 MAME - Multiple Arcade Machine Emulator" PKG_TOOLCHAIN="make" pre_configure_target() { PTR64="1" NOASM="0" if [ "${ARCH}" == "arm" ]; then NOASM="1" fi PKG_MAKE_OPTS_TARGET="REGENIE=1 \ VERBOSE=1 \ NOWERROR=1 \ OPENMP=1 \ CROSS_BUILD=1 \ TOOLS=0 \ RETRO=1 \ PTR64=${PTR64} \ NOASM=${NOASM} \ PYTHON_EXECUTABLE=python3 \ CONFIG=libretro \ LIBRETRO_OS=unix \ LIBRETRO_CPU=arm64 \ PLATFORM=arm64 \ ARCH= \ TARGET=mame \ SUBTARGET=multiemu \ SOURCES=fujitsu/fmtowns.cpp,igs/pgm2.cpp,igs/pgm.cpp,igs/pgm3.cpp,apple/apple2gs.cpp,apple/apple2.cpp,apple/apple2common.cpp,apple/apple2video.cpp,apple/apple2e.cpp \ OSD=retro \ USE_SYSTEM_LIB_EXPAT=1 \ USE_SYSTEM_LIB_ZLIB=1 \ USE_SYSTEM_LIB_FLAC=1 \ USE_SYSTEM_LIB_SQLITE3=1" export ARCHOPTS="-D__aarch64__ -DASMJIT_BUILD_X86" sed -i "s/-static-libstdc++//g" scripts/genie.lua unset ARCH unset DISTRO unset PROJECT } make_target() { make $PKG_MAKE_OPTS_TARGET OVERRIDE_CC=$CC OVERRIDE_CXX=$CXX OVERRIDE_LD=$LD AR=$AR $MAKEFLAGS -j5 } makeinstall_target() { mkdir -p $INSTALL/usr/lib/libretro cp *.so $INSTALL/usr/lib/libretro/ mkdir -p ${INSTALL}/usr/config/emuelec/configs/multiemu cp -rf ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/multiemu cp -rf $PKG_BUILD/hash/fmtowns_cd.xml ${INSTALL}/usr/config/emuelec/configs/multiemu/hash mkdir -p ${INSTALL}/usr/bin cp -rf ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/libretro/multiemu/patches/fmtownshash.patch ================================================ --- a/fmtowns/hash/fmtowns_cd.xml 2024-02-03 18:10:56.927394400 +0100 +++ ./hash/fmtowns_cd.xml 2024-02-03 18:13:01.893835080 +0100 @@ -31537,4 +31537,22 @@ + + + alltynex + 1996 + Satoshi Yoshida + + + + + + + + + + + ================================================ FILE: packages/sx05re/libretro/multiemu/patches/mame-crosscompile.patch ================================================ diff --git a/makefile b/makefile index 46c78d04dc0..d95e3e6c3b0 100644 --- a/makefile +++ b/makefile @@ -383,14 +383,14 @@ ifndef FORCE_DRC_C_BACKEND endif endif -ifeq ($(findstring arm,$(UNAME)),arm) +ifeq ($(findstring arm,$(PLATFORM)),arm) ARCHITECTURE := ifndef FORCE_DRC_C_BACKEND FORCE_DRC_C_BACKEND := 1 endif endif -ifeq ($(findstring aarch64,$(UNAME)),aarch64) +ifeq ($(findstring aarch64,$(PLATFORM)),aarch64) ARCHITECTURE := ifndef FORCE_DRC_C_BACKEND FORCE_DRC_C_BACKEND := 1 --- a/3rdparty/genie/build/gmake.linux/genie.make 2018-08-11 00:17:44.000000000 +0200 +++ b/3rdparty/genie/build/gmake.linux/genie.make 2019-04-03 11:57:27.671223016 +0200 @@ -28,8 +28,8 @@ RM = $(SILENT) del /F "$(subst /,\\,$(1))" 2> nul || exit 0 endif -CC = gcc -CXX = g++ +CC = $(HOST_CC) +CXX = $(HOST_CXX) AR = ar ifndef RESCOMP @@ -50,12 +50,12 @@ INCLUDES += -I"../../src/host/lua-5.3.0/src" ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES) ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough - ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough - ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough - ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough - ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough + ALL_CFLAGS += $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough + ALL_CXXFLAGS += $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough + ALL_OBJCFLAGS += $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough + ALL_OBJCPPFLAGS += $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) - ALL_LDFLAGS += $(LDFLAGS) -L"." -s -rdynamic + ALL_LDFLAGS += -L"." -s -rdynamic LIBDEPS += LDDEPS += LDRESP = -- a/scripts/toolchain.lua 2019-04-30 15:47:21.000000000 +0200 +++ b/scripts/toolchain.lua 2019-05-21 22:51:48.116148725 +0200 @@ -698,9 +698,6 @@ configuration { "linux-gcc", "x32" } objdir (_buildDir .. "linux_gcc" .. "/obj") - buildoptions { - "-m32", - } configuration { "linux-gcc", "x32", "Release" } targetdir (_buildDir .. "linux_gcc" .. "/bin/x32/Release") ================================================ FILE: packages/sx05re/libretro/multiemu/patches/mame-remove-bgfx.patch ================================================ diff --git a/Makefile.libretro b/Makefile.libretro index 31c414be..8de62064 100644 --- a/Makefile.libretro +++ b/Makefile.libretro @@ -55,6 +55,8 @@ VERBOSE ?= 1 # scripts/toolchain.lua) # PTR64 = 1 +USE_BGFX ?= 0 + ########################################################################### # # LIBRETRO PLATFORM GUESSING diff --git a/scripts/genie.lua b/scripts/genie.lua index 4655b3f4..495308a8 100644 --- a/scripts/genie.lua +++ b/scripts/genie.lua @@ -387,8 +387,22 @@ newoption { description = "Arguments for running debug build.", } +newoption { + trigger = "USE_BGFX", + description = "Use bgfx.", + allowed = { + { "0", "Disabled" }, + { "1", "Enabled" }, + } +} + dofile ("extlib.lua") +if not _OPTIONS["USE_BGFX"] then + _OPTIONS["USE_BGFX"] = "0" +end + + if _OPTIONS["SHLIB"]=="1" then LIBTYPE = "SharedLib" else ================================================ FILE: packages/sx05re/libretro/multiemu/patches/mame-workaround-for-arm-cross-compilation.patch ================================================ diff --git a/3rdparty/bgfx/src/renderer_gl.h b/3rdparty/bgfx/src/renderer_gl.h index d52efc76..9f5b2022 100644 --- a/3rdparty/bgfx/src/renderer_gl.h +++ b/3rdparty/bgfx/src/renderer_gl.h @@ -12,10 +12,12 @@ || BX_PLATFORM_LINUX \ || BX_PLATFORM_NX \ || BX_PLATFORM_RPI \ + || BX_PLATFORM_LINUX_NO_GL \ ) ) #define BGFX_USE_HTML5 (BGFX_CONFIG_RENDERER_OPENGLES && (0 \ || BX_PLATFORM_EMSCRIPTEN \ + || BX_PLATFORM_LINUX_NO_GL \ ) ) #define BGFX_USE_WGL (BGFX_CONFIG_RENDERER_OPENGL && (0 \ diff --git a/3rdparty/bx/include/bx/platform.h b/3rdparty/bx/include/bx/platform.h index eea5fcb0..f57a3a79 100644 --- a/3rdparty/bx/include/bx/platform.h +++ b/3rdparty/bx/include/bx/platform.h @@ -60,6 +60,7 @@ #define BX_PLATFORM_WINDOWS 0 #define BX_PLATFORM_WINRT 0 #define BX_PLATFORM_XBOXONE 0 +#define BX_PLATFORM_LINUX_NO_GL 0 // http://sourceforge.net/apps/mediawiki/predef/index.php?title=Compilers #if defined(__clang__) @@ -221,6 +222,13 @@ # define BX_PLATFORM_HAIKU 1 #endif // +#if BX_CPU_ARM +# undef BX_PLATFORM_LINUX +# define BX_PLATFORM_LINUX 0 +# undef BX_PLATFORM_LINUX_NO_GL +# define BX_PLATFORM_LINUX_NO_GL 1 +#endif + #if !BX_CRT_NONE // https://sourceforge.net/p/predef/wiki/Libraries/ # if defined(__BIONIC__) @@ -269,6 +277,7 @@ || BX_PLATFORM_OSX \ || BX_PLATFORM_PS4 \ || BX_PLATFORM_RPI \ + || BX_PLATFORM_LINUX_NO_GL \ ) /// @@ -287,6 +296,7 @@ || BX_PLATFORM_WINDOWS \ || BX_PLATFORM_WINRT \ || BX_PLATFORM_XBOXONE \ + || BX_PLATFORM_LINUX_NO_GL \ ) /// @@ -388,6 +398,8 @@ # define BX_PLATFORM_NAME "WinRT" #elif BX_PLATFORM_XBOXONE # define BX_PLATFORM_NAME "Xbox One" +#elif BX_PLATFORM_LINUX_NO_GL +# define BX_PLATFORM_NAME "Linux (GLES)" #else # error "Unknown BX_PLATFORM!" #endif // BX_PLATFORM_ diff --git a/3rdparty/bx/src/os.cpp b/3rdparty/bx/src/os.cpp index 12586aa8..ae2836ad 100644 --- a/3rdparty/bx/src/os.cpp +++ b/3rdparty/bx/src/os.cpp @@ -27,7 +27,8 @@ || BX_PLATFORM_NX \ || BX_PLATFORM_OSX \ || BX_PLATFORM_PS4 \ - || BX_PLATFORM_RPI + || BX_PLATFORM_RPI \ + || BX_PLATFORM_LINUX_NO_GL # include // sched_yield # if BX_PLATFORM_BSD \ || BX_PLATFORM_HAIKU \ @@ -45,7 +46,8 @@ # if BX_PLATFORM_ANDROID # include // mallinfo # elif BX_PLATFORM_LINUX \ - || BX_PLATFORM_RPI + || BX_PLATFORM_RPI \ + || BX_PLATFORM_LINUX_NO_GL # include // fopen # include // syscall # include @@ -98,7 +100,8 @@ namespace bx #if BX_PLATFORM_WINDOWS return ::GetCurrentThreadId(); #elif BX_PLATFORM_LINUX \ - || BX_PLATFORM_RPI + || BX_PLATFORM_RPI \ + || BX_PLATFORM_LINUX_NO_GL return (pid_t)::syscall(SYS_gettid); #elif BX_PLATFORM_IOS \ || BX_PLATFORM_OSX @@ -119,7 +122,8 @@ namespace bx struct mallinfo mi = mallinfo(); return mi.uordblks; #elif BX_PLATFORM_LINUX \ - || BX_PLATFORM_HURD + || BX_PLATFORM_HURD \ + || BX_PLATFORM_LINUX_NO_GL FILE* file = fopen("/proc/self/statm", "r"); if (NULL == file) { @@ -312,7 +316,8 @@ namespace bx void* exec(const char* const* _argv) { #if BX_PLATFORM_LINUX \ - || BX_PLATFORM_HURD + || BX_PLATFORM_HURD \ + || BX_PLATFORM_LINUX_NO_GL pid_t pid = fork(); if (0 == pid) ================================================ FILE: packages/sx05re/libretro/multiemu/patches/mutex.patch ================================================ --- a/3rdparty/bx/src/mutex.cpp 2023-08-19 07:51:29.861134100 +0200 +++ b/3rdparty/bx/src/mutex.cpp 2023-08-19 08:04:43.449984297 +0200 @@ -18,7 +18,8 @@ || BX_PLATFORM_OSX \ || BX_PLATFORM_PS4 \ || BX_PLATFORM_RPI \ - || BX_PLATFORM_NX + || BX_PLATFORM_NX \ + || BX_PLATFORM_LINUX_NO_GL # include #elif BX_PLATFORM_WINDOWS \ || BX_PLATFORM_WINRT \ ================================================ FILE: packages/sx05re/libretro/multiemu/patches/new.patch ================================================ --- a/3rdparty/genie/src/host/scripts.c 2025-01-04 19:13:10.550615500 +0100 +++ b/3rdparty/genie/src/host/scripts.c 2025-01-04 21:29:13.629791709 +0100 @@ -149,7 +149,7 @@ /* tools/gcc.lua */ "premake.gcc = { }\npremake.gcc.cc = \"gcc\"\npremake.gcc.cxx = \"g++\"\npremake.gcc.ar = \"ar\"\npremake.gcc.rc = \"windres\"\npremake.gcc.llvm = false\nlocal cflags =\n{\nEnableSSE = \"-msse\",\nEnableSSE2 = \"-msse2\",\nEnableAVX = \"-mavx\",\nEnableAVX2 = \"-mavx2\",\nPedanticWarnings = \"-Wall -Wextra -pedantic\",\nExtraWarnings = \"-Wall -Wextra\",\nFatalWarnings = \"-Werror\",\nFloatFast = \"-ffast-math\",\nFloatStrict = \"-ffloat-store\",\nNoFramePointer = \"-fomit-frame-pointer\",\nOptimize = \"-O2\",\nOptimizeSize = \"-Os\",\nOptimizeSpeed = \"-O3\",\nSymbols = \"-g\",\n}\nlocal cxxflags =\n{\nCpp11 = \"-std=c++11\",\nCpp14 = \"-std=c++14\",\nCpp17 = \"-std=c++17\",\nCpp20 = \"-std=c++20\",\nCppLatest = \"-std=c++2b\",\nNoExceptions = \"-fno-exceptions\",\nNoRTTI = \"-fno-rtti\",\nUnsignedChar = \"-funsigned-char\",\n}\nlocal objcflags =\n{\nObjcARC = \"-fobjc-arc\",\n}\npremake." - "gcc.platforms =\n{\nNative = {\ncppflags = \"-MMD -MP\",\n},\nx32 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m32\",\n},\nx64 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m64\",\n},\nUniversal = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch x86_64 -arch ppc -arch ppc64\",\n},\nUniversal32 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch ppc\",\n},\nUniversal64 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch x86_64 -arch ppc64\",\n},\nPS3 = {\ncc = \"ppu-lv2-g++\",\ncxx = \"ppu-lv2-g++\",\nar = \"ppu-lv2-ar\",\ncppflags = \"-MMD -MP\",\n},\nWiiDev = {\ncppflags = \"-MMD -MP -I$(LIBOGC_INC) $(MACHDEP)\",\nldflags= \"-L$(LIBOGC_LIB) $(MACHDEP)\",\ncfgsettings = [[\n ifeq ($(strip $(DEVKITPPC)),)\n $(error \"DEVKITPPC environment variable is not set\")'\n endif\n include $(DEVKITPPC)/wii_rules']],\n},\nOrbis = {\ncc = \"orbis-clang\",\ncxx = \"orbis-clang++\",\nar " + "gcc.platforms =\n{\nNative = {\ncppflags = \"-MMD -MP\",\n},\nx32 = {\ncppflags = \"-MMD -MP\"\n},\nx64 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m64\",\n},\nUniversal = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch x86_64 -arch ppc -arch ppc64\",\n},\nUniversal32 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch ppc\",\n},\nUniversal64 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch x86_64 -arch ppc64\",\n},\nPS3 = {\ncc = \"ppu-lv2-g++\",\ncxx = \"ppu-lv2-g++\",\nar = \"ppu-lv2-ar\",\ncppflags = \"-MMD -MP\",\n},\nWiiDev = {\ncppflags = \"-MMD -MP -I$(LIBOGC_INC) $(MACHDEP)\",\nldflags= \"-L$(LIBOGC_LIB) $(MACHDEP)\",\ncfgsettings = [[\n ifeq ($(strip $(DEVKITPPC)),)\n $(error \"DEVKITPPC environment variable is not set\")'\n endif\n include $(DEVKITPPC)/wii_rules']],\n},\nOrbis = {\ncc = \"orbis-clang\",\ncxx = \"orbis-clang++\",\nar " " = \"orbis-ar\",\ncppflags = \"-MMD -MP\",\n},\nEmscripten = {\ncc = \"$(EMSCRIPTEN)/emcc\",\ncxx = \"$(EMSCRIPTEN)/em++\",\nar = \"$(EMSCRIPTEN)/emar\",\ncppflags = \"-MMD -MP\",\n},\nNX32 = {\ncc = \"clang\",\ncxx = \"clang++\",\nar = \"armv7l-nintendo-nx-eabihf-ar\",\ncppflags = \"-MMD -MP\",\nflags = \"-march=armv7l\",\n},\nNX64 = {\ncc = \"clang\",\ncxx = \"clang++\",\nar = \"aarch64-nintendo-nx-elf-ar\",\ncppflags = \"-MMD -MP\",\nflags = \"-march=aarch64\",\n},\n}\nlocal platforms = premake.gcc.platforms\nfunction premake.gcc.getcppflags(cfg)\nlocal flags = { }\ntable.insert(flags, platforms[cfg.platform].cppflags)\nif flags[1]:startswith(\"-MMD\") then\ntable.insert(flags, \"-MP\")\nend\nreturn flags\nend\nfunction premake.gcc.getcflags(cfg)\nlocal result = table.translate(cfg.flags, cflags)\ntable.insert(result, platforms[cfg.platform].flags)\nif cfg.system ~= \"windows\" and cfg.kind == \"SharedLib\" then\nt" "able.insert(result, \"-fPIC\")\nend\nreturn result\nend\nfunction premake.gcc.getcxxflags(cfg)\nlocal result = table.translate(cfg.flags, cxxflags)\nreturn result\nend\nfunction premake.gcc.getobjcflags(cfg)\nreturn table.translate(cfg.flags, objcflags)\nend\nfunction premake.gcc.getldflags(cfg)\nlocal result = { }\nif not cfg.flags.Symbols then\nif cfg.system == \"macosx\" then\nelse\ntable.insert(result, \"-s\")\nend\nend\nif cfg.kind == \"Bundle\" then\ntable.insert(result, \"-bundle\")\nend\nif cfg.kind == \"SharedLib\" then\nif cfg.system == \"macosx\" then\ntable.insert(result, \"-dynamiclib\")\nelse\ntable.insert(result, \"-shared\")\nend\nif cfg.system == \"windows\" and not cfg.flags.NoImportLib then\ntable.insert(result, '-Wl,--out-implib=\"' .. cfg.linktarget.fullpath .. '\"')\nend\nend\nif cfg.kind == \"WindowedApp\" and cfg.system == \"windows\" then\ntable.insert(result, \"-mwindows\")\nend\nlocal platform = platforms[cfg.platform]\ntable.insert(result, platform.flags)\ntable.insert(result, platf" "orm.ldflags)\nreturn result\nend\nfunction premake.gcc.getlibdirflags(cfg)\nlocal result = { }\nfor _, value in ipairs(premake.getlinks(cfg, \"all\", \"directory\")) do\ntable.insert(result, '-L\\\"' .. value .. '\\\"')\nend\nreturn result\nend\nfunction premake.gcc.islibfile(p)\nif path.getextension(p) == \".a\" then\nreturn true\nend\nreturn false\nend\nfunction premake.gcc.getlibfiles(cfg)\nlocal result = {}\nfor _, value in ipairs(premake.getlinks(cfg, \"system\", \"fullpath\")) do\nif premake.gcc.islibfile(value) then\ntable.insert(result, _MAKE.esc(value))\nend\nend\nreturn result\nend\nfunction premake.gcc.getlinkflags(cfg)\nlocal result = {}\nfor _, value in ipairs(premake.getlinks(cfg, \"system\", \"fullpath\")) do\nif premake.gcc.islibfile(value) then\nvalue = path.rebase(value, cfg.project.location, cfg.location)\ntable.insert(result, _MAKE.esc(value))\nelseif path.getextension(value) == \".framework\" then\ntable.insert(result, '-framework ' .. _MAKE.esc(path.getbasename(value)))\nelse\ntable.inser" ================================================ FILE: packages/sx05re/libretro/multiemu/patches/thread-patch ================================================ --- a/3rdparty/bx/src/thread.cpp 2023-08-19 07:51:14.246942500 +0200 +++ b/3rdparty/bx/src/thread.cpp 2023-08-19 07:59:28.740042068 +0200 @@ -22,12 +22,14 @@ || BX_PLATFORM_OSX \ || BX_PLATFORM_PS4 \ || BX_PLATFORM_RPI \ - || BX_PLATFORM_NX + || BX_PLATFORM_NX \ + || BX_PLATFORM_LINUX_NO_GL # include # if BX_PLATFORM_BSD # include # endif // BX_PLATFORM_BSD -# if BX_PLATFORM_LINUX && (BX_CRT_GLIBC < 21200) +# if BX_PLATFORM_LINUX \ + || BX_PLATFORM_LINUX_NO_GL && (BX_CRT_GLIBC < 21200) # include # endif // BX_PLATFORM_ #elif BX_PLATFORM_WINDOWS \ @@ -252,7 +254,8 @@ pthread_setname_np(_name); #elif (BX_CRT_GLIBC >= 21200) && ! BX_PLATFORM_HURD pthread_setname_np(ti->m_handle, _name); -#elif BX_PLATFORM_LINUX +#elif BX_PLATFORM_LINUX \ + || BX_PLATFORM_LINUX_NO_GL prctl(PR_SET_NAME,_name, 0, 0, 0); #elif BX_PLATFORM_BSD # if defined(__NetBSD__) ================================================ FILE: packages/sx05re/libretro/multiemu/scripts/multiemu.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present Héctor C.M. (github.com/kelvfimer) if [ ! -f "/storage/roms/bios/mame/hash/fmtowns_cd.xml" ]; then mkdir -p /storage/roms/bios/mame/hash cp -rf "/usr/config/emuelec/configs/multiemu/hash/"fm* "/storage/roms/bios/mame/hash" fi if [ ! -f "/storage/roms/bios/mame/ini/fmtownsux.ini" ]; then mkdir -p /storage/roms/bios/mame/ini cp -rf "/usr/config/emuelec/configs/multiemu/ini/"fm* "/storage/roms/bios/mame/ini" fi if [ ! -f "/storage/roms/bios/mame/ini/mame.ini" ]; then mkdir -p /storage/roms/bios/mame/ini cp -rf "/usr/config/emuelec/configs/multiemu/ini/"mame* "/storage/roms/bios/mame/ini" fi ================================================ FILE: packages/sx05re/libretro/mupen64plus/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="mupen64plus" PKG_VERSION="ab8134ac90a567581df6de4fc427dd67bfad1b17" PKG_SHA256="98e197cdcac64c0e08eda91a6d63b637c3f151066bede25766e62bc1a59552a0" PKG_REV="1" PKG_ARCH="arm" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/mupen64plus-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain nasm:host ${OPENGLES}" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="mupen64plus + RSP-HLE + GLideN64 + libretro" PKG_LONGDESC="mupen64plus + RSP-HLE + GLideN64 + libretro" PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="-lto" pre_configure_target() { CFLAGS="${CFLAGS} -DLINUX -DEGL_API_FB -fcommon" CPPFLAGS="${CPPFLAGS} -DLINUX -DEGL_API_FB" sed -i "s|BOARD :=.*|BOARD = N2|g" Makefile sed -i "s|odroid64|emuelec64|g" Makefile case ${DEVICE} in Amlogic-ng|Amlogic-no|Amlogic-ogu) if [ ${ARCH} == "arm" ]; then PKG_MAKE_OPTS_TARGET="platform=odroid BOARD=c2" else PKG_MAKE_OPTS_TARGET="platform=emuelec64 BOARD=N2" fi ;; Amlogic-old) if [ ${ARCH} == "arm" ]; then PKG_MAKE_OPTS_TARGET="platform=odroid BOARD=c2" else PKG_MAKE_OPTS_TARGET="platform=odroid64 BOARD=c2 HAVE_NEON=0" fi ;; esac if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ] || [ "${DEVICE}" == "RK356x" ]; then if [[ "${ARCH}" == "arm" ]]; then PKG_MAKE_OPTS_TARGET=" platform=unix GLES=1 FORCE_GLES=1 HAVE_NEON=1 WITH_DYNAREC=arm" else PKG_MAKE_OPTS_TARGET=" platform=unix GLES=1 FORCE_GLES=1 HAVE_NEON=0 WITH_DYNAREC=aarch64" fi fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mupen64plus_libretro.so ${INSTALL}/usr/lib/libretro/mupen64plus_32b_libretro.so } ================================================ FILE: packages/sx05re/libretro/mupen64plus/patches/mupen64plus-fixdouble.patch ================================================ diff --git a/libretro-common/include/glsym/rglgen_headers.h b/libretro-common/include/glsym/rglgen_headers.h index 766efb63..3de538d6 100644 --- a/libretro-common/include/glsym/rglgen_headers.h +++ b/libretro-common/include/glsym/rglgen_headers.h @@ -53,6 +53,7 @@ #include #elif defined(HAVE_OPENGLES2) #include +#define GL_NV_path_rendering #include #elif defined(HAVE_OPENGLES1) #include ================================================ FILE: packages/sx05re/libretro/mupen64plus/patches/mupen64plus-gcc10-32bit-fix.patch ================================================ --- a/GLideN64/src/ShaderUtils.h +++ b/GLideN64/src/ShaderUtils.h @@ -3,6 +3,7 @@ #include "OpenGL.h" #include "Combiner.h" +#include GLuint createShaderProgram(const char * _strVertex, const char * _strFragment); bool checkShaderCompileStatus(GLuint obj); ================================================ FILE: packages/sx05re/libretro/mupen64plus/patches/mupen64plus-sx05re-neonfix.patch ================================================ --- a/Makefile 2018-12-15 12:01:25.246556521 -0600 +++ b/Makefile 2018-12-15 12:01:37.110536416 -0600 @@ -92,6 +92,8 @@ else GL_LIB := -lGL endif + HAVE_NEON = 1 + WITH_DYNAREC=arm COREFLAGS += -DOS_LINUX ASFLAGS = -f elf -d ELF_TYPE ================================================ FILE: packages/sx05re/libretro/mupen64plus-nx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="mupen64plus-nx" PKG_VERSION="222acbd3f98391458a047874d0372fe78e14fe94" PKG_SHA256="9e55fa83f2313f9b80a369d77457ec216e5774ef2d486083ad8661aa94a4dbd1" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/mupen64plus-libretro-nx" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain nasm:host ${OPENGLES}" PKG_SECTION="libretro" PKG_SHORTDESC="mupen64plus + RSP-HLE + GLideN64 + libretro" PKG_LONGDESC="mupen64plus + RSP-HLE + GLideN64 + libretro" PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="-lto" pre_configure_target() { sed -e "s|^GIT_VERSION ?.*$|GIT_VERSION := \" ${PKG_VERSION:0:7}\"|" -i Makefile PKG_MAKE_OPTS_TARGET+=" HAVE_PARALLEL_RDP=1 HAVE_PARALLEL_RSP=1 HAVE_THR_AL=1 LLE=1" if [ ${ARCH} == "arm" ]; then if [ "${DEVICE}" = "Amlogic-old" ]; then PKG_MAKE_OPTS_TARGET+=" platform=emuelec BOARD=OLD32BIT" elif [ "${DEVICE}" = "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then sed -i "s|cortex-a53|cortex-a35|g" Makefile PKG_MAKE_OPTS_TARGET+=" platform=odroidgoa" elif [ "${DEVICE}" == "OdroidM1" ] || [ "${DEVICE}" == "RK356x" ]; then PKG_MAKE_OPTS_TARGET+=" platform=emuelec BOARD=NGRK32BIT" else PKG_MAKE_OPTS_TARGET+=" platform=AMLG12B" fi else if [ "${DEVICE}" = "Amlogic-old" ]; then PKG_MAKE_OPTS_TARGET+=" platform=emuelec BOARD=OLD" elif [ "${DEVICE}" == "OdroidM1" ] || [ "${DEVICE}" == "RK356x" ]; then PKG_MAKE_OPTS_TARGET+=" platform=emuelec BOARD=NGRK" elif [ "${DEVICE}" = "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then PKG_MAKE_OPTS_TARGET+=" platform=emuelec BOARD=NGHH" else PKG_MAKE_OPTS_TARGET+=" platform=odroid64 BOARD=N2" fi fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mupen64plus_next_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/mupen64plus-nx/patches/mupen64plus-nx-01-add-amlogic64.patch ================================================ --- a/Makefile +++ b/Makefile @@ -308,16 +308,35 @@ ASFLAGS = -f elf -d ELF_TYPE # Amlogic S905/S912 -else ifneq (,$(findstring amlogic,$(platform))) +else ifneq (,$(findstring emuelec,$(platform))) TARGET := $(TARGET_NAME)_libretro.so LDFLAGS += -shared -Wl,--version-script=$(LIBRETRO_DIR)/link.T -Wl,--no-undefined -ldl GLES = 1 + GLES3= 0 GL_LIB := -lGLESv2 - CPUFLAGS += -marm -mfloat-abi=hard -mfpu=neon - HAVE_NEON = 1 - WITH_DYNAREC=arm + ifneq (,$(findstring NG,$(BOARD))) + WITH_DYNAREC=aarch64 + GL_LIB := -lGLESv3 + GLES = 0 + GLES3= 1 + endif + ifneq (,$(findstring OLD,$(BOARD))) + WITH_DYNAREC=aarch64 + CPUFLAGS += -mcpu=cortex-a53 + endif + ifneq (,$(findstring HH,$(BOARD))) + CPUFLAGS += -mcpu=cortex-a35 + endif + ifneq (,$(findstring RK,$(BOARD))) + CPUFLAGS += -mcpu=cortex-a53 + endif + ifneq (,$(findstring 32BIT,$(BOARD))) + CPUFLAGS += -marm -mfloat-abi=hard -mfpu=neon + HAVE_NEON = 1 + WITH_DYNAREC=arm + endif COREFLAGS += -DUSE_GENERIC_GLESV2 -DOS_LINUX - CPUFLAGS += -march=armv8-a -mcpu=cortex-a53 -mtune=cortex-a53 + # Rockchip RK3288 e.g. Asus Tinker Board / RK3328 e.g. PINE64 Rock64 / RK3399 e.g. PINE64 RockPro64 - 32-bit userspace else ifneq (,$(findstring RK,$(platform))) ================================================ FILE: packages/sx05re/libretro/mupen64plus-nx-alt/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="mupen64plus-nx-alt" PKG_VERSION="680e033fc8ed1a49df7b156d97164e0050ee13bc" PKG_SHA256="ffadc0144406df9875e1cb5e788d619fcddc6c7d5df61692be8c67c86d5b8fcb" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/mupen64plus-libretro-nx" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain nasm:host ${OPENGLES}" PKG_SECTION="libretro" PKG_LONGDESC="Improved mupen64plus libretro core reimplementation" PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="-lto" PKG_EE_UPDATE=no pre_configure_target() { sed -e "s|^GIT_VERSION ?.*$|GIT_VERSION := \" ${PKG_VERSION:0:7}\"|" -i Makefile PKG_MAKE_OPTS_TARGET+=" HAVE_PARALLEL_RDP=1 HAVE_PARALLEL_RSP=1 HAVE_THR_AL=1 LLE=1" if [ ${ARCH} == "arm" ]; then if [ "${DEVICE}" = "Amlogic-old" ]; then PKG_MAKE_OPTS_TARGET+=" platform=emuelec BOARD=OLD32BIT" elif [ "${DEVICE}" = "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then sed -i "s|cortex-a53|cortex-a35|g" Makefile PKG_MAKE_OPTS_TARGET+=" platform=odroidgoa" elif [ "${DEVICE}" == "OdroidM1" ] || [ "${DEVICE}" == "RK356x" ]; then PKG_MAKE_OPTS_TARGET+=" platform=emuelec BOARD=NGRK32BIT" else PKG_MAKE_OPTS_TARGET+=" platform=AMLG12B" fi else if [ "${DEVICE}" = "Amlogic-old" ]; then PKG_MAKE_OPTS_TARGET+=" platform=emuelec BOARD=OLD" elif [ "${DEVICE}" == "OdroidM1" ] || [ "${DEVICE}" == "RK356x" ]; then PKG_MAKE_OPTS_TARGET+=" platform=emuelec BOARD=NGRK" elif [ "${DEVICE}" = "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then PKG_MAKE_OPTS_TARGET+=" platform=emuelec BOARD=NGHH" else PKG_MAKE_OPTS_TARGET+=" platform=odroid64 BOARD=N2" fi fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mupen64plus_next_libretro.so ${INSTALL}/usr/lib/libretro/mupen64plus_next_alt_libretro.so } ================================================ FILE: packages/sx05re/libretro/mupen64plus-nx-alt/patches/mupen64plus-nx-01-add-amlogic64.patch ================================================ --- a/Makefile +++ b/Makefile @@ -308,16 +308,35 @@ ASFLAGS = -f elf -d ELF_TYPE # Amlogic S905/S912 -else ifneq (,$(findstring amlogic,$(platform))) +else ifneq (,$(findstring emuelec,$(platform))) TARGET := $(TARGET_NAME)_libretro.so LDFLAGS += -shared -Wl,--version-script=$(LIBRETRO_DIR)/link.T -Wl,--no-undefined -ldl GLES = 1 + GLES3= 0 GL_LIB := -lGLESv2 - CPUFLAGS += -marm -mfloat-abi=hard -mfpu=neon - HAVE_NEON = 1 - WITH_DYNAREC=arm + ifneq (,$(findstring NG,$(BOARD))) + WITH_DYNAREC=aarch64 + GL_LIB := -lGLESv3 + GLES = 0 + GLES3= 1 + endif + ifneq (,$(findstring OLD,$(BOARD))) + WITH_DYNAREC=aarch64 + CPUFLAGS += -mcpu=cortex-a53 + endif + ifneq (,$(findstring HH,$(BOARD))) + CPUFLAGS += -mcpu=cortex-a35 + endif + ifneq (,$(findstring RK,$(BOARD))) + CPUFLAGS += -mcpu=cortex-a53 + endif + ifneq (,$(findstring 32BIT,$(BOARD))) + CPUFLAGS += -marm -mfloat-abi=hard -mfpu=neon + HAVE_NEON = 1 + WITH_DYNAREC=arm + endif COREFLAGS += -DUSE_GENERIC_GLESV2 -DOS_LINUX - CPUFLAGS += -march=armv8-a -mcpu=cortex-a53 -mtune=cortex-a53 + # Rockchip RK3288 e.g. Asus Tinker Board / RK3328 e.g. PINE64 Rock64 / RK3399 e.g. PINE64 RockPro64 - 32-bit userspace else ifneq (,$(findstring RK,$(platform))) ================================================ FILE: packages/sx05re/libretro/neocd_libretro/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Team CoreELEC (https://coreelec.org) PKG_NAME="neocd_libretro" PKG_VERSION="5eca2c8fd567b5261251c65ecafa8cf5b179d1d2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="LGPLv3.0" PKG_SITE="https://github.com/libretro/neocd_libretro" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain flac libogg libvorbis" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Neo Geo CD emulator for libretro " PKG_LONGDESC="NeoCD-Libretro is a complete rewrite of NeoCD from scratch in modern C++11. It is designed with accuracy and portability in mind rather than being all about speed like the the older versions. The goal is also to document all I know about the platform in the source code so other emulator authors can make their own implementations." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" GET_HANDLER_SUPPORT="git" make_target() { cd ${PKG_BUILD} CFLAGS=${CFLAGS} CXXFLAGS="${CXXFLAGS}" CXX="${CXX}" CC="${CC}" LD="${LD}" RANLIB="${RANLIB}" AR="${AR}" make } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/neocd_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/nestopia/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="nestopia" PKG_VERSION="e9429844f2e16a284a8cdf663589634fd4c6345f" PKG_SHA256="5d145e4171bd3381def8ba6d4f08a79d04d3a09c0d53e0b89266b7aa89402990" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/nestopia" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Libretro implementation of NEStopia. (Nintendo Entertainment System)" PKG_LONGDESC="This project is a fork of the original Nestopia source code, plus the Linux port. The purpose of the project is to enhance the original, and ensure it continues to work on modern operating systems." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" PKG_USE_CMAKE="no" make_target() { cd ${PKG_BUILD} make -C libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp libretro/nestopia_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/nestopiaCV/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present asakous (https://github.com/asakous) PKG_NAME="nestopiaCV" PKG_VERSION="2ef9f54159a3da268545f338842bf8a7bbd5e66c" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/asakous/NestopiaCV" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Libretro implementation of NEStopia. (Nintendo Entertainment System)" PKG_LONGDESC="This project is a fork of the original Nestopia source code, plus the Linux port. The purpose of the project is to enhance the original, and ensure it continues to work on modern operating systems." PKG_TOOLCHAIN="make" GET_HANDLER_SUPPORT="git" pre_configure_target() { cp -f ${PKG_BUILD}/NstCore.hpp ${PKG_BUILD}/source/core/NstCore.hpp } make_target() { cd ${PKG_BUILD} make -C libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro mkdir -p ${INSTALL}/etc/ cp ${PKG_BUILD}/skin.png ${INSTALL}/usr/lib/libretro/ cp ${PKG_BUILD}/skin.png ${INSTALL}/etc/ cp libretro/nestopiaCV_libretro.so ${INSTALL}/usr/lib/libretro/ echo 'display_name = "Nintendo - NES / Famicom (Nestopia CV)" authors = "Martin Freij|R. Belmont|R. Danbrook" supported_extensions = "nes|fds|unf|unif" corename = "NestopiaCV" manufacturer = "Nintendo" categories = "Emulator" systemname = "Nintendo Entertainment System" systemid = "nes" database = "Nintendo - Nintendo Entertainment System|Nintendo - Family Computer Disk System" license = "GPLv2" permissions = "" display_version = "v1.47-WIP" supports_no_game = "false" firmware_count = 2 firmware0_desc = "NstDatabase.xml (Nestopia UE Database file)" firmware0_path = "NstDatabase.xml" firmware0_opt = "false" firmware1_desc = "disksys.rom (Family Computer Disk System BIOS)" firmware1_path = "disksys.rom" firmware1_opt = "false" notes = "Get NstDatabase.xml from https://github.com/0ldsk00l/nestopia|(!) disksys.rom (md5): ca30b50f880eb660a320674ed365ef7a|Press Retropad L1 to switch disk side."'> ${INSTALL}/usr/lib/libretro/nestopiaCV_libretro.info } ================================================ FILE: packages/sx05re/libretro/np2kai/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="np2kai" PKG_VERSION="3ccfef9d7a4779591f72ff5ea7db13a1e7f3b137" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/libretro/NP2kai" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Neko Project II kai" PKG_TOOLCHAIN="make" pre_make_target() { # Fix 1: Remove the -municode flag using the absolute package build path if [ -f "${PKG_BUILD}/Makefile.libretro" ]; then sed -i 's/-municode//g' "${PKG_BUILD}/Makefile.libretro" fi # Fix 2: Comment out the s_window line in the correct path if [ -f "${PKG_BUILD}/sdl/scrnmng.c" ]; then sed -i 's/.*SDL_SetWindowFullscreen(s_window.*/\/\/ &/' "${PKG_BUILD}/sdl/scrnmng.c" fi } make_target() { cd ${PKG_BUILD}/sdl make } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/sdl/np2kai_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/nxengine/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="nxengine" PKG_VERSION="9adc032a5f6aa913d71d22042bb72cb11cf0f4a2" PKG_SHA256="bc065a4f82f3644888f01fcaca482e1ead03055df03d8453bd8efed62c176d26" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/nxengine-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of NxEngine to libretro - Cave Story game engine clone" PKG_LONGDESC="A complete open-source clone/rewrite of the masterpiece jump-and-run platformer Doukutsu Monogatari (also known as Cave Story)." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" pre_configure_target() { sed -i -e "s/CC = gcc//" Makefile } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp nxengine_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/o2em/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="o2em" PKG_VERSION="3ba4231c1dc8dcdf487428712856b790d2e4b8f3" PKG_SHA256="a2aff1f017600eb3478a0e78b68d6bcf576c86164f75c0fdd05cae4b2af55eae" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Artistic License" PKG_SITE="https://github.com/libretro/libretro-o2em" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of O2EM to the libretro API, an Odyssey 2 / VideoPac emulator." PKG_LONGDESC="Port of O2EM to the libretro API, an Odyssey 2 / VideoPac emulator." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp o2em_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/opera/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="opera" PKG_VERSION="67a29e60a4d194b675c9272b21b61eaa022f3ba3" PKG_SHA256="e4135d62160f84d3bc287d165ef514a3e4ea31b759888ee29bde05e8c899b666" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="LGPL with additional notes" PKG_SITE="https://github.com/libretro/opera-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of 4DO/libfreedo to libretro." PKG_LONGDESC="Port of 4DO/libfreedo to libretro." PKG_TOOLCHAIN="make" make_target() { make CC=${CC} CXX=${CXX} AR=${AR} } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp opera_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/parallel-n64/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="parallel-n64" PKG_VERSION="50d3ddd55b5774da643d90d7ad1e3cbd2c618883" PKG_SHA256="ac9f9a8d36cd5a1a4859589ce95f4d9b1bd4bce1047c83dc6b6d1c5c4bcf87bf" PKG_REV="2" PKG_LICENSE="GPLv2" PKG_ARCH="arm" PKG_SITE="https://github.com/libretro/parallel-n64" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Optimized/rewritten Nintendo 64 emulator made specifically for Libretro. Originally based on Mupen64 Plus." PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="-lto" if [[ "${ARCH}" == "arm" ]]; then PKG_PATCH_DIRS="emuelec-arm32" else PKG_PATCH_DIRS="emuelec-aarch64" fi pre_configure_target() { if [[ "${ARCH}" == "arm" ]]; then PKG_PATCH_DIRS="arm" PKG_MAKE_OPTS_TARGET=" platform=${DEVICE}" if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then PKG_MAKE_OPTS_TARGET=" platform=Odroidgoa" fi if [ "${DEVICE}" == "RK356x" ] || [ "${DEVICE}" == "OdroidM1" ]; then PKG_MAKE_OPTS_TARGET=" platform=Odroidgoa-RK356x" fi else PKG_PATCH_DIRS="emuelec-aarch64" PKG_MAKE_OPTS_TARGET=" platform=emuelec64-armv8" if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then #todo add odroidgoadvance to 64bits PKG_MAKE_OPTS_TARGET=" platform=emuelec64-armv8" fi fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp parallel_n64_libretro.so ${INSTALL}/usr/lib/libretro/parallel_n64_32b_libretro.so } ================================================ FILE: packages/sx05re/libretro/parallel-n64/patches/emuelec-aarch64/parallel-n64-add_platform.patch ================================================ --- a/Makefile +++ b/Makefile @@ -2,8 +2,8 @@ PERF_TEST=0 HAVE_SHARED_CONTEXT=0 WITH_CRC=brumme -FORCE_GLES=0 -HAVE_OPENGL=1 +FORCE_GLES=1 +HAVE_OPENGL=0 HAVE_VULKAN_DEBUG=0 GLIDEN64=0 GLIDEN64CORE=0 @@ -11,7 +11,7 @@ HAVE_RSP_DUMP=0 HAVE_RDP_DUMP=0 HAVE_RICE=1 -HAVE_PARALLEL=0 +HAVE_PARALLEL=1 HAVE_PARALLEL_RSP=0 STATIC_LINKING=0 WANT_LLVM_OVERRIDE=0 @@ -229,25 +229,24 @@ LDFLAGS += -static-libgcc -static-libstdc++ endif - ####################################### - # Generic ARMV8 - cross - No GL - ifneq (,$(findstring armv8,$(platform))) - CC = aarch64-linux-gnu-gcc - CXX = aarch64-linux-gnu-g++ - CPUFLAGS += -DNO_ASM -DARM -DARM_ASM -DDONT_WANT_ARM_OPTIMIZATIONS -DARM_FIX -DCLASSIC -DARM64 - LDFLAGS += -static-libgcc -static-libstdc++ - GLES = 0 - HAVE_NEON = 0 - WITH_DYNAREC=aarch64 - ifneq (,$(findstring neon,$(platform))) - CPUFLAGS += -D__NEON_OPT -mfpu=neon - HAVE_NEON = 1 - endif - endif + ####################################### + # EmuELEC 64bit ARMV8 - cross - No GL +ifneq (,$(findstring emuelec64-armv8,$(platform))) + CPUFLAGS += -DNO_ASM -DDONT_WANT_ARM_OPTIMIZATIONS -DARM_FIX -DCLASSIC -DARM64 + LDFLAGS += -static-libgcc #-static-libstdc++ + fpic = -fPIC + GLES = 1 + GL_LIB := -lGLESv3 + HAVE_OPENGL = 0 + HAVE_NEON = 1 + FORCE_GLES = 1 + WITH_DYNAREC=aarch64 + PLATFORM_EXT := unix + ####################################### # Generic ARM - ifneq (,$(findstring armv,$(platform))) + else ifneq (,$(findstring armv,$(platform))) CPUFLAGS += -DNO_ASM -DARM -D__arm__ -DARM_ASM -DNOSSE WITH_DYNAREC=arm ifneq (,$(findstring neon,$(platform))) @@ -268,6 +267,15 @@ PLATFORM_EXT := unix WITH_DYNAREC=arm HAVE_NEON=1 + ASFLAGS += -D__ARM_NEON__ -marm -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard + CPUFLAGS += -O2 \ + -fno-lto -fuse-linker-plugin -fno-semantic-interposition -fno-trapping-math \ + -fdata-sections -ffunction-sections -Wl,--gc-sections \ + -fno-stack-protector -fno-ident -fomit-frame-pointer \ + -falign-functions=32 -falign-jumps=1 -falign-loops=1 \ + -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-unroll-loops \ + -fno-strict-aliasing -fmerge-all-constants -fno-math-errno \ + -marm -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard # OS X else ifneq (,$(findstring osx,$(platform))) ================================================ FILE: packages/sx05re/libretro/parallel-n64/patches/emuelec-arm32/parallel-n64-add_platform.patch ================================================ --- a/Makefile +++ b/Makefile @@ -284,7 +284,66 @@ PLATFORM_EXT := unix WITH_DYNAREC=arm HAVE_NEON=1 - + +# Emuelec Amlogic +else ifneq (,$(findstring Amlogic,$(platform))) + TARGET := $(TARGET_NAME)_libretro.so + LDFLAGS += -shared -Wl,--version-script=$(LIBRETRO_DIR)/link.T + fpic = -fPIC + GLES = 1 + GL_LIB := -lGLESv2 + CPUFLAGS += -DNO_ASM -DARM -D__arm__ -DARM_ASM -D__NEON_OPT -DNOSSE -DARM_FIX -DCLASSIC + PLATFORM_EXT := unix + WITH_DYNAREC=arm + HAVE_NEON=1 + + ifneq (,$(findstring Amlogic-ng,$(platform))) + ASFLAGS += -D__ARM_NEON__ -marm -mcpu=cortex-a73 -mtune=cortex-a73.cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard + else + ASFLAGS += -D__ARM_NEON__ -marm -mcpu=cortex-a53 -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard + endif + + CPUFLAGS += -O2 \ + -fno-lto -fuse-linker-plugin -fno-semantic-interposition -fno-trapping-math \ + -fdata-sections -ffunction-sections -Wl,--gc-sections \ + -fno-stack-protector -fno-ident -fomit-frame-pointer \ + -falign-functions=32 -falign-jumps=1 -falign-loops=1 \ + -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-unroll-loops \ + -fno-strict-aliasing -fmerge-all-constants -fno-math-errno -fcommon + ifneq (,$(findstring Amlogic-ng,$(platform))) + CPUFLAGS += -marm -mtune=cortex-a73.cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard + else + CPUFLAGS += -marm -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard + endif + +# Emuelec OdroidGoA +else ifneq (,$(findstring Odroidgoa,$(platform))) + TARGET := $(TARGET_NAME)_libretro.so + LDFLAGS += -shared -Wl,--version-script=$(LIBRETRO_DIR)/link.T + fpic = -fPIC + GLES = 1 + GL_LIB := -lGLESv2 + CPUFLAGS += -DNO_ASM -DARM -D__arm__ -DARM_ASM -D__NEON_OPT -DNOSSE -DARM_FIX -DCLASSIC + PLATFORM_EXT := unix + WITH_DYNAREC=arm + HAVE_NEON=1 + ifneq (,$(findstring RK356x,$(platform))) + ASFLAGS += -D__ARM_NEON__ -marm -mcpu=cortex-a55 -mtune=cortex-a55 -mfpu=neon-fp-armv8 -mfloat-abi=hard + else + ASFLAGS += -D__ARM_NEON__ -marm -mcpu=cortex-a35 -mtune=cortex-a35 -mfpu=neon-fp-armv8 -mfloat-abi=hard + endif + CPUFLAGS += -O2 \ + -fno-lto -fuse-linker-plugin -fno-semantic-interposition -fno-trapping-math \ + -fdata-sections -ffunction-sections -Wl,--gc-sections \ + -fno-stack-protector -fno-ident -fomit-frame-pointer \ + -falign-functions=32 -falign-jumps=1 -falign-loops=1 \ + -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-unroll-loops \ + -fno-strict-aliasing -fmerge-all-constants -fno-math-errno -fcommon + ifneq (,$(findstring RK356x,$(platform))) + CPUFLAGS += -marm -mtune=cortex-a55 -mfpu=neon-fp-armv8 -mfloat-abi=hard + else + CPUFLAGS += -marm -mtune=cortex-a35 -mfpu=neon-fp-armv8 -mfloat-abi=hard + endif # OS X else ifneq (,$(findstring osx,$(platform))) TARGET := $(TARGET_NAME)_libretro.dylib ================================================ FILE: packages/sx05re/libretro/pcsx_rearmed/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="pcsx_rearmed" PKG_VERSION="228c14e10e9a8fae0ead8adf30daad2cdd8655b9" PKG_SHA256="0530dc5772466c31900a5bb8b412b67f82a01d8cbf771e07fe25d5799c161f0a" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/pcsx_rearmed" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain alsa" PKG_SHORTDESC="ARM optimized PCSX fork" PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="+speed -gold" make_target() { cd ${PKG_BUILD} export ALLOW_LIGHTREC_ON_ARM=1 if [ "${ARCH}" == "arm" ]; then if [ "${DEVICE}" == "Amlogic-old" ]; then make -f Makefile.libretro GIT_VERSION=${PKG_VERSION} platform=rpi3 else make -f Makefile.libretro GIT_VERSION=${PKG_VERSION} platform=rpi4 fi else if [ "${DEVICE}" == "Amlogic-old" ]; then make -f Makefile.libretro GIT_VERSION=${PKG_VERSION} platform=h5 elif [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "Gameforce" ]; then sed -i "s|cortex-a53|cortex-a35|g" Makefile.libretro make -f Makefile.libretro GIT_VERSION=${PKG_VERSION} platform=h5 else make -f Makefile.libretro GIT_VERSION=${PKG_VERSION} platform=CortexA73_G12B fi fi } makeinstall_target() { INSTALLTO="/usr/lib/libretro" mkdir -p ${INSTALL}${INSTALLTO}/ if [ "${ARCH}" == "arm" ]; then cp pcsx_rearmed_libretro.so ${INSTALL}${INSTALLTO}/pcsx_rearmed_32b_libretro.so else cp pcsx_rearmed_libretro.so ${INSTALL}${INSTALLTO} fi } ================================================ FILE: packages/sx05re/libretro/picodrive/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="picodrive" PKG_VERSION="3cd193ed1c7a2ffa94e69334367c64c136de0c7d" PKG_LICENSE="MAME" PKG_SITE="https://github.com/irixxxx/picodrive" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Libretro implementation of PicoDrive. (Sega Megadrive/Genesis/Sega Master System/Sega GameGear/Sega CD/32X)" PKG_LONGDESC="This is yet another Megadrive / Genesis / Sega CD / Mega CD / 32X / SMS emulator, which was written having ARM-based handheld devices in mind (such as smartphones and handheld consoles like GP2X and Pandora), but also runs on non-ARM little-endian hardware too." GET_HANDLER_SUPPORT="git" PKG_BUILD_FLAGS="-gold" PKG_TOOLCHAIN="make" make_target() { if [ "${ARCH}" == "arm" ]; then make -C .. -f Makefile.libretro platform=armv6 elif [ "${ARCH}" == "aarch64" ]; then cd ${PKG_BUILD} make -f Makefile.libretro platform=arm64 else make -C .. -f Makefile.libretro fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/picodrive_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/pocketcdg/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="pocketcdg" PKG_VERSION="c1fac9f7164e60e5c4b81705b65d65750abfe488" PKG_SHA256="629ec6ef7ffe2e10a3a8074e493edff156e0d0712ee6b6b33f685a16424b9cad" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/libretro/libretro-pocketcdg" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Karaoke player" PKG_LONGDESC="Karaoke player" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make CC=${CC} } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp pocketcdg_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/pokemini/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="pokemini" PKG_VERSION="19095803f1434eb980db6e4004187a4b786e20b6" PKG_SHA256="ddc19868e876ed4f6edff5e9f5b3801c0d77cf53885f404bdf250c2173ee8126" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/pokemini" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Obscure nintendo handheld emulator (functional,no color files or savestates currently)" PKG_LONGDESC="Obscure nintendo handheld emulator (functional,no color files or savestates currently)" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp pokemini_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/potator/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="potator" PKG_VERSION="ad87bc6068ef126e48339b440465fb0bf5a2794f" PKG_SHA256="a863462780ac042ad1a8defe1ab3e864fde060c645d605de3661962b72c4b808" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="The Unlicense" PKG_SITE="https://github.com/libretro/potator" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_LONGDESC="A Watara Supervision Emulator based on Normmatt version " PKG_TOOLCHAIN="make" make_target() { cd ${PKG_BUILD}/platform/libretro make } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/platform/libretro/potator_libretro.so ${INSTALL}/usr/lib/libretro/potator_libretro.so } ================================================ FILE: packages/sx05re/libretro/ppsspp/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="ppsspp" PKG_VERSION="$(get_pkg_version PPSSPPSDL)" PKG_NEED_UNPACK="$(get_pkg_directory PPSSPPSDL)" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/hrydgard/ppsspp" PKG_URL="https://github.com/hrydgard/ppsspp.git" PKG_DEPENDS_TARGET="toolchain SDL2 ffmpeg" PKG_LONGDESC="A PSP emulator for Android, Windows, Mac, Linux and Blackberry 10, written in C++." GET_HANDLER_SUPPORT="git" PKG_PATCH_DIRS+=" $(get_pkg_directory PPSSPPSDL)/patches" PKG_LIBNAME="ppsspp_libretro.so" PKG_LIBPATH="lib/${PKG_LIBNAME}" post_unpack() { ( cd "${PKG_BUILD}" && git submodule update --init --recursive ) } pre_configure_target() { PKG_CMAKE_OPTS_TARGET="-DLIBRETRO=ON \ -DUSE_SYSTEM_FFMPEG=ON \ -DUSING_X11_VULKAN=OFF" if [ "${ARCH}" = "arm" ] && [ ! "${TARGET_CPU}" = "arm1176jzf-s" ]; then PKG_CMAKE_OPTS_TARGET+=" -DARMV7=ON" elif [ "${TARGET_CPU}" = "arm1176jzf-s" ]; then PKG_CMAKE_OPTS_TARGET+=" -DARM=ON" fi if [ "${OPENGLES_SUPPORT}" = "yes" ]; then PKG_CMAKE_OPTS_TARGET+=" -DUSING_FBDEV=ON \ -DUSING_EGL=ON \ -DUSING_GLES2=ON" fi if [ ${ARCH} == "aarch64" ]; then PKG_CMAKE_OPTS_TARGET+=" -DARM64=ON" else PKG_CMAKE_OPTS_TARGET+=" -DARMV7=ON" fi } pre_make_target() { # fix cross compiling find ${PKG_BUILD} -name flags.make -exec sed -i "s:isystem :I:g" \{} \; find ${PKG_BUILD} -name build.ninja -exec sed -i "s:isystem :I:g" \{} \; } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_LIBPATH} ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/ppsspp/patches/ppsspp-x86_64-fix.patch ================================================ diff -Naur ppsspp-00051fd/ext/glew/glew.c ppsspp-00051fd.patch/ext/glew/glew.c --- ppsspp-00051fd/ext/glew/glew.c 2018-12-24 10:48:13.869315087 +0100 +++ ppsspp-00051fd.patch/ext/glew/glew.c 2018-12-24 10:50:23.969537401 +0100 @@ -20872,8 +20872,6 @@ return r; #elif defined(_WIN32) return wglewInit(); -#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) /* _UNIX */ - return glxewInit(); #else return r; #endif /* _WIN32 */ ================================================ FILE: packages/sx05re/libretro/prboom/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="prboom" PKG_VERSION="b3e5f8b2e8855f9c6fc7ff7a0036e4e61379177d" PKG_SHA256="e4a7eb96ab547027e0fbd9d27d0057d522b19e604656a0b34f00853795a4cc47" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/libretro-prboom" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="libretro implementation of Doom" PKG_LONGDESC="libretro implementation of Doom" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp prboom_libretro.so ${INSTALL}/usr/lib/libretro/prboom_libretro.so } ================================================ FILE: packages/sx05re/libretro/prosystem/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="prosystem" PKG_VERSION="acae250da8d98b8b9707cd499e2a0bf6d8500652" PKG_SHA256="5a376c6621678daff86977de12b1421f1599602683a8d7228f75281ab4274229" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/prosystem-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of ProSystem to libretro." PKG_LONGDESC="Port of ProSystem to libretro." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp prosystem_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/psp1/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="psp1" PKG_VERSION="edf1cb70cc01c9f4ce81a83e1538c7b5ab7a2658" PKG_SHA256="66e8c2902e2580c1e77cd13e2128a59fd0aac1a672782e73ba3c2a4411bdc247" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/PSP1" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Non-shallow fork of PPSSPP for libretro exclusively." PKG_LONGDESC="A fast and portable PSP emulator" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" PKG_BUILD_FLAGS="-lto" make_target() { cd ${PKG_BUILD}/libretro if [ "${OPENGLES}" == "gpu-viv-bin-mx6q" ]; then CFLAGS="${CFLAGS} -DLINUX -DEGL_API_FB" CXXFLAGS="${CXXFLAGS} -DLINUX -DEGL_API_FB" fi if [ "${ARCH}" == "arm" ]; then SYSROOT_PREFIX=${SYSROOT_PREFIX} make platform=imx6 else make fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ../libretro/ppsspp_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/puae/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="puae" #PKG_VERSION="c60e42ef9ad474518d4be859b7c1da2c0c7e1d6f" PKG_VERSION="9e2aa770a9b6b0a4e1f4fc05eb0db6c8e7aba8ee" #PKG_SHA256="933fd83ad42ceb558c2ae9c0d2ea0a7bb68f05f8ab828951bcabfe400ce8c50f" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libretro/libretro-uae" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="WIP libretro port of UAE (P-UAE and libco) Expect bugs" PKG_LONGDESC="WIP libretro port of UAE (P-UAE and libco) Expect bugs" PKG_TOOLCHAIN="make" pre_configure_target() { if [ "${ARCH}" == "arm" ]; then CFLAGS="${CFLAGS} -DARM -marm" elif [ "${ARCH}" == "aarch64" ]; then CFLAGS="${CFLAGS} -DARM" fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp puae_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/puae2021/package.mk ================================================ PKG_NAME="puae2021" PKG_VERSION="a19f7423e8ac8bedf92023064589daf888340552" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libretro/libretro-uae" PKG_URL="${PKG_SITE}.git" PKG_GIT_CLONE_BRANCH="2.6.1" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Portable Commodore Amiga Emulator. Branch frozen at older version for better performance." PKG_TOOLCHAIN="make" make_target() { make } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp -v puae2021_libretro.so ${INSTALL}/usr/lib/libretro/ mkdir -p ${INSTALL}/usr/share/retroarch/system/uae_data cp -vR ${PKG_BUILD}/sources/uae_data/* ${INSTALL}/usr/share/retroarch/system/uae_data/ } ================================================ FILE: packages/sx05re/libretro/px68k/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="px68k" PKG_VERSION="9dfa6abc25ddd6e597790f7a535cd0a1d7f9c385" PKG_SHA256="c03c89d350ec4b2c73b61a517fb4450eccd2307961f30c3b94eefc14dfd855ef" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Unknown" PKG_SITE="https://github.com/libretro/px68k-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Portable SHARP X68000 Emulator for PSP, Android and other platforms" PKG_LONGDESC="Portable SHARP X68000 Emulator for PSP, Android and other platforms" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp px68k_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/quasi88/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present asakous (https://github.com/asakous) PKG_NAME="quasi88" PKG_VERSION="42be798db5585f62b4bd34ce49dd1e8063c9d7c1" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="BSD3" PKG_SITE="https://github.com/libretro/quasi88-libretro" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="A port of QUASI88, a PC-8800 series emulator by Showzoh Fukunaga, to the libretro API" PKG_LONGDESC="A port of QUASI88, a PC-8800 series emulator by Showzoh Fukunaga, to the libretro API" PKG_TOOLCHAIN="make" GET_HANDLER_SUPPORT="git" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp quasi88_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/quicknes/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="quicknes" PKG_VERSION="dbf19f73e3eb9701d1c7f5898f57c097e05c9fbd" PKG_SHA256="3a2e3c564156a7e18b15b8ac04fc5aa10da3f44d8253a073cc42fdd74a1a48de" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="LGPLv2.1+" PKG_SITE="https://github.com/libretro/QuickNES_Core" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="The QuickNES core library, originally by Shay Green, heavily modified" PKG_LONGDESC="The QuickNES core library, originally by Shay Green, heavily modified" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make platform=armv8-hardfloat-cortex-a53 } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp quicknes_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/reminiscence/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="reminiscence" PKG_VERSION="e80d7b1aa287010e30c54f72252a9303173f1c7e" PKG_SHA256="68804a7f65faf4f86b69ab86b85953d9e0703b9499895b9307f5b16195355891" PKG_ARCH="any" PKG_SITE="https://github.com/libretro/REminiscence" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of Gregory Montoir's Flashback emulator, running as a libretro core." PKG_LONGDESC="Port of Gregory Montoir's Flashback emulator, running as a libretro core." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" configure_target () { : # nothing to do } make_target() { cd ${PKG_BUILD} make } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp reminiscence_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/same_cdi/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="same_cdi" PKG_VERSION="7ee1d8e9cb4307b7cd44ee1dd757e9b3f48f41d5" PKG_LICENSE="MAME" PKG_SITE="https://github.com/libretro/same_cdi" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain expat zlib flac sqlite" PKG_LONGDESC="SAME_CDI is a libretro core to play CD-i games. This is a fork and modification of the MAME libretro core" PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="-parallel" PKG_MAKE_OPTS_TARGET="-f Makefile.libretro REGENIE=1 VERBOSE=1 NOWERROR=1 OPENMP=0 CROSS_BUILD=1 TOOLS=0 RETRO=1 PYTHON_EXECUTABLE=python3 CONFIG=libretro LIBRETRO_OS=unix TARGET=mame OSD=retro USE_SYSTEM_LIB_EXPAT=1 USE_SYSTEM_LIB_ZLIB=1 USE_SYSTEM_LIB_FLAC=1 USE_SYSTEM_LIB_SQLITE3=1 LIBRETRO_CPU= ARCH= PROJECT=" case ${ARCH} in x86_64) PKG_MAKE_OPTS_TARGET+=" NOASM=0 PTR64=1 PLATFORM=x86_64" ;; i386) PKG_MAKE_OPTS_TARGET+=" NOASM=0 PTR64=0 PLATFORM=x86" ;; aarch64) PKG_MAKE_OPTS_TARGET+=" NOASM=0 PTR64=0 PLATFORM=arm64" ;; arm) PKG_MAKE_OPTS_TARGET+=" NOASM=1 PTR64=0 PLATFORM=arm" ;; esac pre_make_target() { PKG_MAKE_OPTS_TARGET+=" OVERRIDE_CC=${CC} OVERRIDE_CXX=${CXX} OVERRIDE_LD=${LD}" sed -i scripts/genie.lua \ -e 's|-static-libstdc++||g' } make_target() { unset DISTRO [ "${ARCH}" = "aarch64" ] && export ARCHOPTS="-D__aarch64__ -DASMJIT_BUILD_X86" make ${PKG_MAKE_OPTS_TARGET} } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp -v same_cdi_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/same_cdi/patches/mame-crosscompile.patch ================================================ --- a/3rdparty/genie/build/gmake.linux/genie.make 2018-08-11 00:17:44.000000000 +0200 +++ b/3rdparty/genie/build/gmake.linux/genie.make 2019-04-03 11:57:27.671223016 +0200 @@ -28,8 +28,8 @@ RM = $(SILENT) del /F "$(subst /,\\,$(1))" 2> nul || exit 0 endif -CC = gcc -CXX = g++ +CC = $(HOST_CC) +CXX = $(HOST_CXX) AR = ar ifndef RESCOMP @@ -50,12 +50,12 @@ INCLUDES += -I"../../src/host/lua-5.3.0/src" ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES) ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough - ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough - ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough - ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough - ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough + ALL_CFLAGS += $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough + ALL_CXXFLAGS += $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough + ALL_OBJCFLAGS += $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough + ALL_OBJCPPFLAGS += $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) - ALL_LDFLAGS += $(LDFLAGS) -L"." -s -rdynamic + ALL_LDFLAGS += -L"." -s -rdynamic LIBDEPS += LDDEPS += LDRESP = --- a/3rdparty/genie/src/host/scripts.c 2019-05-21 22:41:14.207745861 +0200 +++ b/3rdparty/genie/src/host/scripts.c 2019-05-21 22:42:43.159893481 +0200 @@ -147,7 +147,7 @@ /* tools/gcc.lua */ "premake.gcc = { }\npremake.gcc.cc = \"gcc\"\npremake.gcc.cxx = \"g++\"\npremake.gcc.ar = \"ar\"\npremake.gcc.rc = \"windres\"\npremake.gcc.llvm = false\nlocal cflags =\n{\nEnableSSE = \"-msse\",\nEnableSSE2 = \"-msse2\",\nEnableAVX = \"-mavx\",\nEnableAVX2 = \"-mavx2\",\nPedanticWarnings = \"-Wall -Wextra -pedantic\",\nExtraWarnings = \"-Wall -Wextra\",\nFatalWarnings = \"-Werror\",\nFloatFast = \"-ffast-math\",\nFloatStrict = \"-ffloat-store\",\nNoFramePointer = \"-fomit-frame-pointer\",\nOptimize = \"-O2\",\nOptimizeSize = \"-Os\",\nOptimizeSpeed = \"-O3\",\nSymbols = \"-g\",\n}\nlocal cxxflags =\n{\nCpp11 = \"-std=c++11\",\nCpp14 = \"-std=c++14\",\nCpp17 = \"-std=c++17\",\nCppLatest = \"-std=c++2a\",\nNoExceptions = \"-fno-exceptions\",\nNoRTTI = \"-fno-rtti\",\nUnsignedChar = \"-funsigned-char\",\n}\nlocal objcflags =\n{\nObjcARC = \"-fobjc-arc\",\n}\npremake.gcc.platforms =\n{\nNative = {\n" - "cppflags = \"-MMD -MP\",\n},\nx32 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m32\",\n},\nx64 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m64\",\n},\nUniversal = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch x86_64 -arch ppc -arch ppc64\",\n},\nUniversal32 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch ppc\",\n},\nUniversal64 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch x86_64 -arch ppc64\",\n},\nPS3 = {\ncc = \"ppu-lv2-g++\",\ncxx = \"ppu-lv2-g++\",\nar = \"ppu-lv2-ar\",\ncppflags = \"-MMD -MP\",\n},\nWiiDev = {\ncppflags = \"-MMD -MP -I$(LIBOGC_INC) $(MACHDEP)\",\nldflags= \"-L$(LIBOGC_LIB) $(MACHDEP)\",\ncfgsettings = [[\n ifeq ($(strip $(DEVKITPPC)),)\n $(error \"DEVKITPPC environment variable is not set\")'\n endif\n include $(DEVKITPPC)/wii_rules']],\n},\nOrbis = {\ncc = \"orbis-clang\",\ncxx = \"orbis-clang++\",\nar = \"orbis-ar\",\ncppflag" + "cppflags = \"-MMD -MP\",\n},\nx32 = {\ncppflags = \"-MMD -MP\"\n},\nx64 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m64\",\n},\nUniversal = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch x86_64 -arch ppc -arch ppc64\",\n},\nUniversal32 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch ppc\",\n},\nUniversal64 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch x86_64 -arch ppc64\",\n},\nPS3 = {\ncc = \"ppu-lv2-g++\",\ncxx = \"ppu-lv2-g++\",\nar = \"ppu-lv2-ar\",\ncppflags = \"-MMD -MP\",\n},\nWiiDev = {\ncppflags = \"-MMD -MP -I$(LIBOGC_INC) $(MACHDEP)\",\nldflags= \"-L$(LIBOGC_LIB) $(MACHDEP)\",\ncfgsettings = [[\n ifeq ($(strip $(DEVKITPPC)),)\n $(error \"DEVKITPPC environment variable is not set\")'\n endif\n include $(DEVKITPPC)/wii_rules']],\n},\nOrbis = {\ncc = \"orbis-clang\",\ncxx = \"orbis-clang++\",\nar = \"orbis-ar\",\ncppflag" "s = \"-MMD -MP\",\n},\nEmscripten = {\ncc = \"$(EMSCRIPTEN)/emcc\",\ncxx = \"$(EMSCRIPTEN)/em++\",\nar = \"$(EMSCRIPTEN)/emar\",\ncppflags = \"-MMD -MP\",\n}\n}\nlocal platforms = premake.gcc.platforms\nfunction premake.gcc.getcppflags(cfg)\nlocal flags = { }\ntable.insert(flags, platforms[cfg.platform].cppflags)\nif flags[1]:startswith(\"-MMD\") then\ntable.insert(flags, \"-MP\")\nend\nreturn flags\nend\nfunction premake.gcc.getcflags(cfg)\nlocal result = table.translate(cfg.flags, cflags)\ntable.insert(result, platforms[cfg.platform].flags)\nif cfg.system ~= \"windows\" and cfg.kind == \"SharedLib\" then\ntable.insert(result, \"-fPIC\")\nend\nreturn result\nend\nfunction premake.gcc.getcxxflags(cfg)\nlocal result = table.translate(cfg.flags, cxxflags)\nreturn result\nend\nfunction premake.gcc.getobjcflags(cfg)\nreturn table.translate(cfg.flags, objcflags)\nend\nfunction premake.gcc.getldflags(cfg)\nlocal result = { }\nif not cfg.flags.Symbols then\nif cfg.system == \"macosx\" then" "\nelse\ntable.insert(result, \"-s\")\nend\nend\nif cfg.kind == \"Bundle\" then\ntable.insert(result, \"-bundle\")\nend\nif cfg.kind == \"SharedLib\" then\nif cfg.system == \"macosx\" then\ntable.insert(result, \"-dynamiclib\")\nelse\ntable.insert(result, \"-shared\")\nend\nif cfg.system == \"windows\" and not cfg.flags.NoImportLib then\ntable.insert(result, '-Wl,--out-implib=\"' .. cfg.linktarget.fullpath .. '\"')\nend\nend\nif cfg.kind == \"WindowedApp\" and cfg.system == \"windows\" then\ntable.insert(result, \"-mwindows\")\nend\nlocal platform = platforms[cfg.platform]\ntable.insert(result, platform.flags)\ntable.insert(result, platform.ldflags)\nreturn result\nend\nfunction premake.gcc.getlibdirflags(cfg)\nlocal result = { }\nfor _, value in ipairs(premake.getlinks(cfg, \"all\", \"directory\")) do\ntable.insert(result, '-L\\\"' .. value .. '\\\"')\nend\nreturn result\nend\nfunction premake.gcc.islibfile(p)\nif path.getextension(p) == \".a\" then\nreturn true\nend\nreturn false\nend\nfunction premake.gcc.ge" "tlibfiles(cfg)\nlocal result = {}\nfor _, value in ipairs(premake.getlinks(cfg, \"system\", \"fullpath\")) do\nif premake.gcc.islibfile(value) then\ntable.insert(result, _MAKE.esc(value))\nend\nend\nreturn result\nend\nfunction premake.gcc.getlinkflags(cfg)\nlocal result = {}\nfor _, value in ipairs(premake.getlinks(cfg, \"system\", \"fullpath\")) do\nif premake.gcc.islibfile(value) then\nvalue = path.rebase(value, cfg.project.location, cfg.location)\ntable.insert(result, _MAKE.esc(value))\nelseif path.getextension(value) == \".framework\" then\ntable.insert(result, '-framework ' .. _MAKE.esc(path.getbasename(value)))\nelse\ntable.insert(result, '-l' .. _MAKE.esc(path.getname(value)))\nend\nend\nreturn result\nend\nfunction premake.gcc.wholearchive(lib)\nif premake.gcc.llvm then\nreturn {\"-force_load\", lib}\nelse\nreturn {\"-Wl,--whole-archive\", lib, \"-Wl,--no-whole-archive\"}\nend\nend\nfunction premake.gcc.getarchiveflags(prj, cfg, ndx)\nlocal result = {}\nif cfg.platform:startswith(\"Universal\") then\n" --- a/scripts/toolchain.lua 2019-04-30 15:47:21.000000000 +0200 +++ b/scripts/toolchain.lua 2019-05-21 22:51:48.116148725 +0200 @@ -698,9 +698,6 @@ configuration { "linux-gcc", "x32" } objdir (_buildDir .. "linux_gcc" .. "/obj") - buildoptions { - "-m32", - } configuration { "linux-gcc", "x32", "Release" } targetdir (_buildDir .. "linux_gcc" .. "/bin/x32/Release") ================================================ FILE: packages/sx05re/libretro/sameboy/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="sameboy" PKG_VERSION="51433012a871a44555492273fd22f29867d12655" PKG_SHA256="cb1b914ce29d250ed1b170b317c114106bdd9208d69100f3f761eeddd5fb472d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/libretro/sameboy" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_GIT_CLONE_BRANCH="buildbot" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Gameboy and Gameboy Color emulator written in C" PKG_LONGDESC="Gameboy and Gameboy Color emulator written in C" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make -C libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp libretro/sameboy_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/sameduck/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="sameduck" PKG_VERSION="5619abdb01cee6bedb47599cdb5532c318443b52" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/LIJI32/SameBoy" PKG_URL="${PKG_SITE}.git" PKG_GIT_CLONE_BRANCH="SameDuck" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Mega Duck / Cougar Boy emulator written in C" PKG_LONGDESC="Mega Duck / Cougar Boy emulator written in C" GET_HANDLER_SUPPORT="git" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make -C libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp build/bin/sameduck_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/scummvm/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="scummvm" PKG_VERSION="686cdd13719b92554fa46b264c512ca7deec7a96" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/scummvm" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="libretro" PKG_SHORTDESC="ScummVM with libretro backend." PKG_LONGDESC="ScummVM is a program which allows you to run certain classic graphical point-and-click adventure games, provided you already have their data files." PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="-lto" post_unpack() { sed -i "s|DEFINES += -Wno-multichar|#DEFINES += -Wno-multichar|" ${PKG_BUILD}/Makefile.common } make_target() { cd "${PKG_BUILD}/backends/platform/libretro" make all platform=rpi4_64 } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp "${PKG_BUILD}/backends/platform/libretro/scummvm_libretro."{so,info} ${INSTALL}/usr/lib/libretro/ mkdir -p ${INSTALL}/usr/config/emuelec/configs/scummvm cp ${PKG_BUILD}/backends/platform/libretro/scummvm.zip ${INSTALL}/usr/config/emuelec/configs/scummvm } ================================================ FILE: packages/sx05re/libretro/snes9x/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="snes9x" PKG_VERSION="abfc018c90799eb55b773fc46d486167d8b3c762" PKG_SHA256="d3d2e83ea318f0de3eca285c3b2446788f4c9c891beeae1c8a8e54c6a384f8a6" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" PKG_SITE="https://github.com/snes9xgit/snes9x" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Snes9x - Portable Super Nintendo Entertainment System (TM) emulator" PKG_LONGDESC="Snes9x - Portable Super Nintendo Entertainment System (TM) emulator" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { if [ "${ARCH}" == "arm" ]; then CXXFLAGS="${CXXFLAGS} -DARM" fi if ([ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "OdroidGoAdvance" ]) && [ "${ARCH}" == "arm" ]; then make -C libretro platform=classic_armv8_a35 else make -C libretro fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp libretro/snes9x_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/snes9x2002/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="snes9x2002" PKG_VERSION="a0709ec7dcd6de2fbebb43106bd757b649e3b7cf" PKG_SHA256="58abd84309d0fafacccd94920aa4b99eeb935c4157971487c1052b6104de2412" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" PKG_SITE="https://github.com/libretro/snes9x2002" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Snes9x 2002." PKG_LONGDESC="Snes9x 2002. Port of SNES9x 1.39 for libretro (was previously called PocketSNES). Heavily optimized for ARM." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp snes9x2002_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/snes9x2005/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="snes9x2005" PKG_VERSION="74d871db9b4dba6dbe6c5ecebc88cbf255be5349" PKG_SHA256="e8e659fe3ed3686823f77a07b22289bc36b367c39bacfbad4285cc822d7998f8" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" PKG_SITE="https://github.com/libretro/snes9x2005" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Snes9x 2005." PKG_LONGDESC="Snes9x 2005. Port of SNES9x 1.43 for libretro (was previously called CAT SFC)." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp snes9x2005_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/snes9x2005_plus/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="snes9x2005_plus" PKG_VERSION="74d871db9b4dba6dbe6c5ecebc88cbf255be5349" PKG_SHA256="e8e659fe3ed3686823f77a07b22289bc36b367c39bacfbad4285cc822d7998f8" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" PKG_SITE="https://github.com/libretro/snes9x2005" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Snes9x 2005 Plus." PKG_LONGDESC="Snes9x 2005 Plus. Port of SNES9x 1.43 for libretro (was previously called CAT SFC) with enabled BLARRG APU." PKG_TOOLCHAIN="make" PKG_MAKE_OPTS_TARGET="USE_BLARGG_APU=1 platform=armv8-hardfloat-neon" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp snes9x2005_plus_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/snes9x2005_plus/patches/aarch64/01-snes9x2005_plux-01-fix-fpic.patch ================================================ --- a/Makefile +++ b/Makefile @@ -74,9 +74,10 @@ else ifneq (,$(findstring armv,$(platform))) TARGET := $(TARGET_NAME)_libretro.so fpic := -fPIC + FLAGS += $(fpic) SHARED := -shared -Wl,--no-undefined -Wl,--version-script=link.T - CC = gcc - CXX = g++ + #CC = gcc + #CXX = g++ PLATFORM_DEFINES += -marm ifneq (,$(findstring softfloat,$(platform))) PLATFORM_DEFINES += -mfloat-abi=softfp @@ -84,8 +85,8 @@ PLATFORM_DEFINES += -mfloat-abi=hard endif ifneq (,$(findstring neon,$(platform))) - FLAGS += -mfpu=neon - ASFLAGS += -mfpu=neon + #FLAGS += -mfpu=neon + #ASFLAGS += -mfpu=neon HAVE_NEON = 1 endif PLATFORM_DEFINES += -DARM ================================================ FILE: packages/sx05re/libretro/snes9x2005_plus/patches/arm/01-snes9x2005_plux-01-fix-fpic.patch ================================================ --- a/Makefile +++ b/Makefile @@ -74,9 +74,10 @@ else ifneq (,$(findstring armv,$(platform))) TARGET := $(TARGET_NAME)_libretro.so fpic := -fPIC + FLAGS += $(fpic) SHARED := -shared -Wl,--no-undefined -Wl,--version-script=link.T - CC = gcc - CXX = g++ + #CC = gcc + #CXX = g++ PLATFORM_DEFINES += -marm ifneq (,$(findstring softfloat,$(platform))) PLATFORM_DEFINES += -mfloat-abi=softfp ================================================ FILE: packages/sx05re/libretro/snes9x2010/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="snes9x2010" PKG_VERSION="f9ae8fd28b13070a945a829ccf41cbf90a21d0f7" PKG_SHA256="730aa78b64c5c214454361c517b351ce7d225a89dd51705ebb94a8fedc3bd3e3" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" PKG_SITE="https://github.com/libretro/snes9x2010" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Snes9x 2010." PKG_LONGDESC="Snes9x 2010. Port of Snes9x 1.52+ to Libretro (previously called SNES9x Next). Rewritten in C and several optimizations and speedhacks." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { if ([ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "OdroidGoAdvance" ]) && [ "${ARCH}" == "arm" ]; then make -f Makefile.libretro platform=goa_armv8_a35 else make -f Makefile.libretro fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp snes9x2010_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/snes9x2010/patches/snes9x2010-add-oga.patch ================================================ --- a/Makefile.libretro +++ b/Makefile.libretro @@ -344,6 +344,29 @@ endif ####################################### + +######################################### +# (armv8 a35, hard point, neon based) ### +# Odroid Go Advance +else ifeq ($(platform), goa_armv8_a35) +TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + SHARED := -shared -Wl,--version-script=libretro/link.T -Wl,--no-undefined + CFLAGS += -Ofast \ + -flto=4 -fuse-linker-plugin \ + -fdata-sections -ffunction-sections -Wl,--gc-sections \ + -fno-stack-protector -fno-ident -fomit-frame-pointer \ + -falign-functions=1 -falign-jumps=1 -falign-loops=1 \ + -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-unroll-loops \ + -fmerge-all-constants -fno-math-errno \ + -marm -mcpu=cortex-a35 -mfpu=neon-fp-armv8 -mfloat-abi=hard + CXXFLAGS += $(CFLAGS) + CPPFLAGS += $(CFLAGS) + ASFLAGS += $(CFLAGS) + HAVE_NEON = 1 + ARCH = arm + BUILTIN_GPU = neon + USE_DYNAREC = 1 # Xbox 360 else ifeq ($(platform), xenon) EXT=a ================================================ FILE: packages/sx05re/libretro/spring/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="spring" PKG_VERSION="443d2a83584a6ea26cba797a88b5f4dae2258402" PKG_SHA256="93d0197787003cc5ba3025c4a7577cd5d39f6dbe53fdb6708b67900ad86b61fd" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/shantigilbert/spring-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Launch any command through retroarch" PKG_LONGDESC="Launch any command through retroarch" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" PKG_USE_CMAKE="no" make_target() { cd ${PKG_BUILD} make } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp spring_libretro.so ${INSTALL}/usr/lib/libretro/spring_ppsspp_libretro.so cp spring_ppsspp_libretro.info ${INSTALL}/usr/lib/libretro/ cp spring_libretro.so ${INSTALL}/usr/lib/libretro/spring_pcsx_rearmed32_libretro.so cp spring_pcsx_rearmed32_libretro.info ${INSTALL}/usr/lib/libretro/ cp spring_libretro.so ${INSTALL}/usr/lib/libretro/spring_shell_libretro.so cp spring_shell_libretro.info ${INSTALL}/usr/lib/libretro/ # mkdir -p ${INSTALL}/usr/bin # cp retroarch32.sh ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/libretro/spring/sources/retroarch32.sh ================================================ #!/usr/bin/env bash export LD_LIBRARY_PATH="/emuelec/lib32:$LD_LIBRARY_PATH" exec /usr/bin/retroarch32 "$@" ================================================ FILE: packages/sx05re/libretro/spring/sources/spring_pcsx_rearmed32_libretro.info ================================================ display_name = "Spring PCSX ReARMed RetroArch 32-bit" authors = "PCSX Team|notaz|Exophase" supported_extensions = "bin|cue|img|mdf|pbp|toc|cbn|m3u|ccd|chd" corename = "PCSX-ReARMed" manufacturer = "Sony" categories = "Emulator" systemname = "PlayStation" systemid = "playstation" database = "Sony - PlayStation" license = "GPLv2" permissions = "dynarec" display_version = "r21" supports_no_game = "true" firmware_count = 3 firmware0_desc = "scph5500.bin (PS1 JP BIOS)" firmware0_path = "scph5500.bin" firmware0_opt = "true" firmware1_desc = "scph5501.bin (PS1 US BIOS)" firmware1_path = "scph5501.bin" firmware1_opt = "true" firmware2_desc = "scph5502.bin (PS1 EU BIOS)" firmware2_path = "scph5502.bin" firmware2_opt = "true" notes = "(!) scph5500.bin (md5): 8dd7d5296a650fac7319bce665a6a53c|(!) scph5501.bin (md5): 490f666e1afb15b7362b406ed1cea246|(!) scph5502.bin (md5): 32736f17079d0b2b7024407c39bd3050" command = "/usr/bin/retroarch32 -L /usr/lib/libretro/pcsx_rearmed_libretro.so %s" ================================================ FILE: packages/sx05re/libretro/spring/sources/spring_ppsspp_libretro.info ================================================ display_name = "PPSSPP Standalone" authors = "valadaa48" supported_extensions = "elf|iso|cso|prx|pbp" corename = "PPSSPP" manufacturer = "Sony" categories = "Emulator" systemname = "PSP" systemid = "playstation_portable" database = "Sony - PlayStation Portable" license = "MIT" permissions = "" display_version = "0.1.0" supports_no_game = "true" command = "/usr/bin/ppsspp.sh %s" ================================================ FILE: packages/sx05re/libretro/spring/sources/spring_shell_libretro.info ================================================ display_name = "Run Shell Command" authors = "valadaa48" supported_extensions = "sh|csh|bash" corename = "shell" manufacturer = "Sony" categories = "Emulator" systemname = "shell" systemid = "playstation_portable" database = "Sony - PlayStation Portable" license = "MIT" permissions = "" display_version = "0.1.0" supports_no_game = "true" command = "bash -c '%s'" ================================================ FILE: packages/sx05re/libretro/stella/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="stella" PKG_VERSION="749a21f653cf85fcedf4fe514ac8df1ad308be8e" PKG_SHA256="57f641936267bebaf182147e60a1cf04c1cc6288cbfbc8e3b4ea80f81076f621" PKG_REV="1" PKG_LICENSE="GPL2" PKG_SITE="https://github.com/stella-emu/stella" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of Stella to libretro." PKG_LONGDESC="Stella is a multi-platform Atari 2600 VCS emulator released under the GNU General Public License (GPL)." PKG_TOOLCHAIN="make" pre_configure_target() { if [ "${ARCH}" == "arm" ]; then PKG_MAKE_OPTS_TARGET=" -C ${PKG_BUILD}/src/os/libretro -f Makefile platform=emuelec" else PKG_MAKE_OPTS_TARGET=" -C ${PKG_BUILD}/src/os/libretro -f Makefile platform=emuelec-arm64" fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/src/os/libretro/stella_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/stella/patches/stella-01-emuelec-platform.patch ================================================ --- a/src/os/libretro/Makefile +++ b/src/os/libretro/Makefile @@ -137,6 +137,27 @@ endif endif +# EmuELEC for Amlogic devices +else ifeq ($(platform), emuelec) + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + SHARED := -shared -Wl,--version-script=link.T -Wl,--no-undefined + CXXFLAGS += -lpthread -marm -mtune=cortex-a53 -mfpu=neon-vfpv4 -mfloat-abi=hard -march=armv7ve -DARM + LDFLAGS += -lpthread -static-libgcc -lstdc++ + HAVE_NEON = 1 + ARCH = arm + BUILTIN_GPU = neon + USE_DYNAREC = 1 +else ifeq ($(platform), emuelec-arm64) + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + SHARED := -shared -Wl,--version-script=link.T -Wl,--no-undefined + CXXFLAGS += -lpthread -DARM64 + LDFLAGS += -lpthread -static-libgcc -lstdc++ + ARCH = arm64 + USE_DYNAREC = 1 + + # iOS else ifneq (,$(findstring ios,$(platform))) CXXFLAGS += $(LTO) $(PTHREAD_FLAGS) -stdlib=libc++ ================================================ FILE: packages/sx05re/libretro/supafaust/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="supafaust" PKG_VERSION="e25f66765938d33f9ad5850e8d6cd597e55b7299" PKG_SHA256="0b0ff644b780d1565e8f097998f371b1a4255213846c2082d8e8c143d0868ef1" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/supafaust" PKG_URL="https://github.com/libretro/supafaust/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="SNES emulator for multicore ARM Cortex A7, A9, A15, A53 Linux platforms" PKG_LONGDESC="SNES emulator optimized for multicore ARM processors." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" PKG_LIBNAME="mednafen_supafaust_libretro.so" PKG_LIBVAR="SUPAFAUST_LIB" make_target() { make } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp -v mednafen_supafaust_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/swanstation/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="swanstation" PKG_VERSION="4d309c05fd7bdc503d91d267bd542edb8d192b09" PKG_SHA256="bf41b6df7ab1eeaafc8548eb4732775153535b12d42de826e578b7f2492c6843" PKG_ARCH="aarch64" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/swanstation" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain nasm:host ${OPENGLES}" PKG_SECTION="libretro" PKG_SHORTDESC="Fast PlayStation 1 emulator for PC and Android" PKG_TOOLCHAIN="cmake" PKG_BUILD_FLAGS="-lto" pre_configure_target() { PKG_CMAKE_OPTS_TARGET+=" -DCMAKE_BUILD_TYPE=Release -DBUILD_LIBRETRO_CORE=ON " } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/.${TARGET_NAME}/swanstation_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/tgbdual/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="tgbdual" PKG_VERSION="933707c0ba8f12360f6d79712f735a917713709a" PKG_SHA256="fb166e32c34f0f2b6e568e0136d38a60202f32c8e4f7f4defd421810ac7614e4" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/tgbdual-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="libretro port of TGB Dual" PKG_LONGDESC="TGB Dual is an open source (GPLv2) GB/GBC emulator with game link cable support." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp tgbdual_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/theodore/package.mk ================================================ # SPDX-License-Identifier: GPL-3.0-only # EmuELEC package for Theodore libretro core (Thomson MO/TO) PKG_NAME="theodore" PKG_VERSION="3.1" PKG_SHA256="" PKG_ARCH="any" PKG_LICENSE="GPL-3.0-only" PKG_SITE="https://github.com/Zlika/theodore" PKG_URL="https://github.com/Zlika/theodore/archive/v3.1/theodore-3.1.tar.gz" PKG_SOURCE_DIR="theodore-${PKG_VERSION}" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="emuelec/libretro" PKG_SHORTDESC="Theodore Thomson MO/TO libretro core" PKG_LONGDESC="Theodore is a libretro core for emulation of Thomson MO/TO computers (TO7, TO8, MO5, MO6, etc.)." PKG_TOOLCHAIN="make" configure_target() { : } make_target() { make -C "${PKG_BUILD}" \ CC="${CC}" \ CXX="${CXX}" \ AR="${AR}" } makeinstall_target() { mkdir -p "${INSTALL}/usr/lib/libretro" cp "${PKG_BUILD}/theodore_libretro.so" \ "${INSTALL}/usr/lib/libretro/" } ================================================ FILE: packages/sx05re/libretro/tic-80/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="tic-80" PKG_VERSION="a2c875f7275541e7724199ce8e504fb578b819a6" PKG_LICENSE="MIT" PKG_SITE="https://github.com/nesbox/TIC-80" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="TIC-80 is a fantasy computer for making, playing and sharing tiny games." GET_HANDLER_SUPPORT="git" PKG_CMAKE_OPTS_TARGET="-DBUILD_LIBRETRO=ON \ -DBUILD_PLAYER=ON \ -DBUILD_SDL=ON \ -DBUILD_WITH_RUBY=OFF \ -DBUILD_WITH_YUE=OFF \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_WITH_JANET=Off \ -DBUILD_WITH_ALL=On \ -DBUILD_STATIC=On" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/.${TARGET_NAME}/bin/tic80_libretro.so ${INSTALL}/usr/lib/libretro/tic80_libretro.so } ================================================ FILE: packages/sx05re/libretro/tyrquake/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="tyrquake" PKG_VERSION="dfdae65c0ab5cf5d459155e8fefe796105229959" PKG_SHA256="9c4b07794357293b874ac46e18f3929a16baf8b958cbb41e47dbe55bb151c671" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/tyrquake" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Libretro port of Tyrquake (Quake 1 engine)" PKG_LONGDESC="Libretro port of Tyrquake (Quake 1 engine)" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" pre_configure_target() { if [ "${ARCH}" == "arm" ]; then CFLAGS="${CFLAGS} -DARM -marm" fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp tyrquake_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/uae4arm/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="uae4arm" PKG_VERSION="866fe9ceee6103fbc9cd7d08533f495518471381" PKG_SHA256="221124981d8750209f10d1add2536c44c84bc60fa5c87f1dd8cf5a71c4d1c5cb" PKG_REV="1" PKG_ARCH="arm" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libretro/uae4arm-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of uae4arm for libretro (rpi/android)" PKG_LONGDESC="Port of uae4arm for libretro (rpi/android) " PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" PKG_BUILD_FLAGS="-lto" make_target() { CFLAGS="${CFLAGS} -DARM -marm" if [[ "${TARGET_FPU}" =~ "neon" ]]; then CFLAGS="-D__NEON_OPT" fi make HAVE_NEON=1 USE_PICASSO96=1 } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp uae4arm_libretro.so ${INSTALL}/usr/lib/libretro/uae4arm_32b_libretro.so } ================================================ FILE: packages/sx05re/libretro/uzebox/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="uzebox" PKG_VERSION="e5faef9a287cc98ac9fae2ce99a0117c37be460a" PKG_SHA256="e7fcee86e35b96aec94234b19e2e514d83a82a1342a84af0a93e5e18810ddb93" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/t-paul/uzebox" PKG_URL="https://github.com/t-paul/uzebox/archive/${PKG_VERSION}.tar.gz" PKG_PATCH_DIRS="libretro" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="A retro-minimalist game console engine for the ATMega644" PKG_LONGDESC="A retro-minimalist game console engine for the ATMega644" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make -C tools/uzem CPPFLAGS="${CFLAGS} -I. ${LDFLAGS} -DNOGDB=1" CC="${CXX}" LIBRETRO_BUILD=1 } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp tools/uzem/uzem_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/uzebox/patches/uzebox-01-buildfix.patch ================================================ diff -Naur uzebox.git/tools/uzem/avr8.h uzebox.patch/tools/uzem/avr8.h --- uzebox.git/tools/uzem/avr8.h 2016-06-26 21:59:20.243240043 +0200 +++ uzebox.patch/tools/uzem/avr8.h 2016-06-27 22:56:09.836039916 +0200 @@ -37,15 +37,6 @@ #include "input_driver.h" #include "video_driver.h" -#if defined(__WIN32__) - #include // Win32 memory mapped I/O - #include -#elif defined(LINUX) || defined(__APPLE__) - #include // Linux memory mapped I/O -#else - #include // Unix memory mapped I/O -#endif - // If you're building from the command line or on a non-MS compiler you'll need // -lSDL or somesuch. #include ================================================ FILE: packages/sx05re/libretro/uzem/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="uzem" PKG_VERSION="cd6004ea143435cfdb6b12e7c6779dab499f7829" PKG_SHA256="338c6bff624e9c822f9d20f497e62080588b42cc3eb94c1bd52137b3e8cae977" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/libretro/libretro-uzem" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_PATCH_DIRS="libretro" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="A retro-minimalist game console engine for the ATMega644" PKG_LONGDESC="A retro-minimalist game console engine for the ATMega644" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp uzem_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/vba-next/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="vba-next" PKG_VERSION="d0ec7f3e209a91b903bb9d2c2397fef2bb3cca32" PKG_SHA256="380473c6c9d10f47dda27239ec0375f4e49b5b149e4466902a07380f57b8d77b" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libretro/vba-next" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Optimized port of VBA-M to Libretro." PKG_LONGDESC="Optimized port of VBA-M to Libretro. " PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make -f Makefile.libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp vba_next_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/vbam/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="vbam" PKG_VERSION="277271c6f3003654154723e143f41cfc75a9cda2" PKG_SHA256="c8d83f1c4bc25bac728f9b89a0bbc1786033f22e088248305485bb03516bcb01" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/vbam-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="A fork of VBA-M with libretro integration" PKG_LONGDESC="VBA-M is a [Super] Game Boy [Color / Advance] emulator for Windows, Linux & Mac." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" PKG_USE_CMAKE="no" make_target() { make -C ../src/libretro -f Makefile } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ../src/libretro/vbam_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/vecx/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="vecx" PKG_VERSION="841229a6a81a0461d08af6488f252dcec5266c6a" PKG_SHA256="d564413e9611b16e49e076cadd719587b6712c3cb435eaf90597c2db157546f4" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2|LGPLv2.1" PKG_SITE="https://github.com/libretro/libretro-vecx" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="libretro adaptation of vecx" PKG_LONGDESC="libretro adaptation of vecx" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make -f Makefile.libretro HAS_GPU=1 HAS_GLES=1 } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp vecx_libretro.so ${INSTALL}/usr/lib/libretro/vecx_libretro.so } ================================================ FILE: packages/sx05re/libretro/vice/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="vice" PKG_VERSION="e9f8ac034ddef3025f0567768f7af8219f7cfdb8" PKG_SHA256="83c68b33ba42d2cf885705f8b703112ed5c35593bac0618f062f704957ab6c9f" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/vice-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Versatile Commodore 8-bit Emulator version 3.0" PKG_LONGDESC="Versatile Commodore 8-bit Emulator version 3.0" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" PKG_BUILD_FLAGS="-lto" make_target() { if [ "${ARCH}" == "arm" ]; then CFLAGS="${CFLAGS} -DARM -DALIGN_DWORD -mstructure-size-boundary=32 -mthumb-interwork -falign-functions=16 -marm" fi mkdir -p built for EMUTYPE in x128 x64sc x64dtv xscpu64 xplus4 xvic xcbm5x0 xcbm2 xpet x64 do make clean make EMUTYPE=${EMUTYPE} mv vice_*_libretro.so built done } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp built/vice_*_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/vircon32/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2024-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vircon32" PKG_VERSION="d8a92430e887286b4e5351916ef0bd35d8cb40e8" PKG_SHA512="8746ba64b721954adab761dad17071d6c92a48bb35944d6cc1360c25046774ec9cc2f6c144036a3376deb9723e9d106ffc2bf520e4a4595130e8ef864bb5bd2d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="BSD-3-Clause" PKG_SITE="https://github.com/vircon32/vircon32-libretro" PKG_URL="https://github.com/vircon32/vircon32-libretro/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ${OPENGLES}" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Vircon32 is a 32-bit virtual console" PKG_LONGDESC="Vircon32 emulator for libretro - a 32-bit virtual game console." PKG_IS_ADDON="no" PKG_TOOLCHAIN="cmake" PKG_AUTORECONF="no" PKG_LIBNAME="vircon32_libretro.so" PKG_LIBVAR="VIRCON32_LIB" PKG_CMAKE_OPTS_TARGET="-DENABLE_OPENGLES3=1 \ -DOpenGL_GL_PREFERENCE=GLVND \ -DOPENGL_INCLUDE_DIR=${SYSROOT_PREFIX}/usr/include \ -DOPENGL_opengl_LIBRARY=${SYSROOT_PREFIX}/usr/lib/libOpenGL.so \ -DOPENGL_glx_LIBRARY=${SYSROOT_PREFIX}/usr/lib/libGLX.so" pre_configure_target() { # Patch CMakeLists.txt to make OpenGL optional/mock it for GLES builds sed -i 's/find_package(OpenGL REQUIRED)/find_package(OpenGL)/' ${PKG_BUILD}/CMakeLists.txt # Set OpenGL as found even if desktop OpenGL isn't available echo "set(OPENGL_FOUND TRUE)" >> ${PKG_BUILD}/CMakeLists.txt echo "set(OPENGL_LIBRARIES \"\")" >> ${PKG_BUILD}/CMakeLists.txt # Remove static linking flags that cause issues sed -i 's/-static-libgcc -static-libstdc++//' ${PKG_BUILD}/CMakeLists.txt } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp -v ${PKG_BUILD}/.${TARGET_NAME}/vircon32_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/virtualjaguar/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="virtualjaguar" PKG_VERSION="48096c1f6f8b98cfff048a5cb4e6a86686631072" PKG_SHA256="2192ff7d093a76420b5dea2c694e7681ec6d388f7dd5b3df62ddec5a700afbe2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/virtualjaguar-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of Virtual Jaguar to Libretro" PKG_LONGDESC="Port of Virtual Jaguar to Libretro" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp virtualjaguar_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/virtualjaguar/patches/001-optimize.patch ================================================ diff --git a/src/blitter.c b/src/blitter.c index 12f8398..02ee24b 100644 --- a/src/blitter.c +++ b/src/blitter.c @@ -980,6 +980,8 @@ uint8_t BlitterReadByte(uint32_t offset, uint32_t who/*=UNKNOWN*/) { offset &= 0xFF; + if (offset <= 0x3B) + { // status register //This isn't cycle accurate--how to fix? !!! FIX !!! //Probably have to do some multi-threaded implementation or at least a reentrant safe implementation... @@ -1003,6 +1005,7 @@ uint8_t BlitterReadByte(uint32_t offset, uint32_t who/*=UNKNOWN*/) if (offset >= 0x2C && offset <= 0x2F) return blitter_ram[offset + 0x04]; // A2_PIXEL ($F02230) read at $F0222C + } return blitter_ram[offset]; } diff --git a/src/dac.c b/src/dac.c index 4b5bc7b..f105602 100644 --- a/src/dac.c +++ b/src/dac.c @@ -107,7 +107,7 @@ void DSPSampleCallback(void) return; } - SetCallbackTime(DSPSampleCallback, 1000000.0 / (double)DAC_AUDIO_RATE, EVENT_JERRY); + SetCallbackTime(DSPSampleCallback, (1000000.0 / (double)DAC_AUDIO_RATE)*2, EVENT_JERRY); } // Approach: Run the DSP for however many cycles needed to correspond to whatever sample rate @@ -157,7 +157,7 @@ void SoundCallback(void * userdata, uint16_t * buffer, int length) numberOfSamples = length; bufferDone = false; - SetCallbackTime(DSPSampleCallback, 1000000.0 / (double)DAC_AUDIO_RATE, EVENT_JERRY); + SetCallbackTime(DSPSampleCallback, (1000000.0 / (double)DAC_AUDIO_RATE)*2, EVENT_JERRY); // These timings are tied to NTSC, need to fix that in event.cpp/h! [FIXED] do diff --git a/src/event.h b/src/event.h index 1d01c3d..d6b42f6 100644 --- a/src/event.h +++ b/src/event.h @@ -14,10 +14,10 @@ extern "C" { enum { EVENT_MAIN, EVENT_JERRY }; //NTSC Timings... -#define RISC_CYCLE_IN_USEC 0.03760684198 +#define RISC_CYCLE_IN_USEC 0.03760684198 * 2 #define M68K_CYCLE_IN_USEC (RISC_CYCLE_IN_USEC * 2) //PAL Timings -#define RISC_CYCLE_PAL_IN_USEC 0.03760260812 +#define RISC_CYCLE_PAL_IN_USEC 0.03760260812 * 2 #define M68K_CYCLE_PAL_IN_USEC (RISC_CYCLE_PAL_IN_USEC * 2) #define HORIZ_PERIOD_IN_USEC_NTSC 63.555555555 ================================================ FILE: packages/sx05re/libretro/wasm4/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # EmuELEC / LibreELEC package for WASM-4 libretro core PKG_NAME="wasm4" PKG_VERSION="68cbe429fcbab3e80537282d2c21566f5ea216ea" PKG_ARCH="any" PKG_LICENSE="ISC" PKG_SITE="https://git.libretro.com/libretro/wasm4" PKG_URL="${PKG_SITE}.git" PKG_SHA256="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="libretro" PKG_SHORTDESC="WASM-4 libretro core" PKG_LONGDESC="WASM-4 is a fantasy console based on WebAssembly. This package builds the libretro core (lr-wasm4)." PKG_IS_ADDON="no" PKG_TOOLCHAIN="cmake" PKG_GIT_CLONE_SINGLE="yes" PKG_CMAKE_OPTS_TARGET="-DLIBRETRO=ON \ -DWASM3=ON \ -DCMAKE_BUILD_TYPE=Release" pre_configure_target() { PKG_CMAKE_SCRIPT="${PKG_BUILD}/runtimes/native/CMakeLists.txt" } makeinstall_target() { mkdir -p "${INSTALL}/usr/lib/libretro" cp "${PKG_BUILD}/wasm4_libretro.so" "${INSTALL}/usr/lib/libretro/" } ================================================ FILE: packages/sx05re/libretro/xmil/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present asakous (https://github.com/asakous) PKG_NAME="xmil" PKG_VERSION="b07506c0cae31d260db28cb079148857d6ca2e93" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Unknown" PKG_SITE="https://github.com/r-type/xmil-libretro" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Libretro port of X Millennium Sharp X1 emulator" PKG_LONGDESC="Libretro port of X Millennium Sharp X1 emulator" PKG_TOOLCHAIN="make" GET_HANDLER_SUPPORT="git" make_target() { cd ${PKG_BUILD} make -C libretro } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/libretro/x1_libretro.so ${INSTALL}/usr/lib/libretro/ cp x1_libretro.info ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/xrick/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="xrick" PKG_VERSION="476a9a637a6d2afa3f9f6b202bb98b522a4e95d1" PKG_SHA256="32c5dcef326790d91c5e2fbc666a95421bb62a1a342bb92270acd2384b375a23" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libretro/xrick-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Rick Dangerous Game Engine" PKG_LONGDESC="Rick Dangerous Game Engine" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { make -f Makefile.libretro CC=${CC} } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp xrick_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/yabasanshiro/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="yabasanshiro" PKG_VERSION="39535a6abcad5abf9f71c8b2a7975f005ee12ed6" PKG_GIT_CLONE_BRANCH="yabasanshiro" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/yabause" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain ${OPENGLES}" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of YabaSanshiro to libretro." PKG_LONGDESC="Port of YabaSanshiro to libretro." PKG_TOOLCHAIN="make" GET_HANDLER_SUPPORT="git" pre_configure_target() { if [[ "${ARCH}" == "arm" ]]; then if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then PKG_MAKE_OPTS_TARGET+=" -C yabause/src/libretro platform=RK3399" sed -i "s|-mtune=cortex-a72.cortex-a53|-mtune=cortex-a35|g" ${PKG_BUILD}/yabause/src/libretro/Makefile else PKG_MAKE_OPTS_TARGET+=" -C yabause/src/libretro platform=AMLG12B" fi else if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then sed -i "s|-mtune=cortex-a73.cortex-a53|-mtune=cortex-a35|g" ${PKG_BUILD}/yabause/src/libretro/Makefile fi if [[ "${DEVICE}" == "Amlogic-old" ]]; then sed -i "s|-mtune=cortex-a73.cortex-a53|-mtune=cortex-a53|g" ${PKG_BUILD}/yabause/src/libretro/Makefile fi PKG_MAKE_OPTS_TARGET+=" -C yabause/src/libretro platform=odroid-n2" # yabasanshiro seems to only work in debug mode, it is not recomended for use as it will be slow. But until a fix is found this will have to do #sed -i "s|DEBUG = 0|DEBUG = 1|g" ${PKG_BUILD}/yabause/src/libretro/Makefile fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp yabause/src/libretro/yabasanshiro_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro/yabasanshiro/patches/aarch64/01-optimization.patch ================================================ diff -rupN yabasanshiro.orig/yabause/src/libretro/Makefile yabasanshiro/yabause/src/libretro/Makefile --- yabasanshiro.orig/yabause/src/libretro/Makefile 2022-02-27 14:51:53.958685169 -0500 +++ yabasanshiro/yabause/src/libretro/Makefile 2022-02-27 14:57:08.993824415 -0500 @@ -155,11 +155,12 @@ else ifneq (,$(findstring rockpro64,$(pl SHARED := -shared -Wl,--no-undefined -Wl,--version-script=link.T LDFLAGS += -lpthread ARCH_IS_LINUX = 1 + FLAGS += -DAARCH64 HAVE_SSE = 0 FORCE_GLES = 1 - USE_ARM_DRC = 1 + USE_AARCH64_DRC = 1 DYNAREC_DEVMIYAX = 1 - FLAGS += -march=armv8-a+crc -mcpu=cortex-a72 -mtune=cortex-a72.cortex-a53 -mfloat-abi=hard -mfpu=neon-vfpv4 -mvectorize-with-neon-quad + FLAGS += -march=armv8-a+crc -mtune=@TARGET_CPU@ # Rpi4 (64-bit) else ifeq ($(platform), rpi4) ================================================ FILE: packages/sx05re/libretro/yabause/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="yabause" PKG_VERSION="c35712c5ed33e18d77097f2059a036e19d1d66f2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/libretro/yabause" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain ${OPENGLES}" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of Yabause to libretro." PKG_LONGDESC="Port of Yabause to libretro." PKG_TOOLCHAIN="make" GET_HANDLER_SUPPORT="git" make_target() { cd ${PKG_BUILD}/yabause/src/libretro make HAVE_SSE=0 platform=armvneonhardfloat } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/yabause/src/libretro/yabause_libretro.so ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro_base/common-shaders/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="common-shaders" PKG_VERSION="43eaf9b91857eb8515310c74ae750895d77b20f8" PKG_SHA256="4bc1bc61604e91fe314cf781d05b3b99e1991e65a6adafcb8464e633e156a58e" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/RetroPie/common-shaders" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="emuelec" PKG_SHORTDESC="Manually converted libretro/common-shaders for arm devices treebranch pi" PKG_LONGDESC="Manually converted libretro/common-shaders for arm devices treebranch pi" PKG_GIT_CLONE_BRANCH="rpi" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { : not } makeinstall_target() { #make install INSTALLDIR="${INSTALL}/usr/share/common-shaders/pi" mkdir -p ${INSTALL}/usr/share/common-shaders/rpi cp -rf ${PKG_BUILD}/* ${INSTALL}/usr/share/common-shaders/rpi } ================================================ FILE: packages/sx05re/libretro_base/core-info/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="core-info" PKG_VERSION="bc4abc9daff498eaa479a7d1efacb5ea97d2a79a" PKG_SHA256="821a41b438290634fff627e3257a2ab73158109024e47bbfdca2bcb252494b97" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libretro/libretro-core-info" PKG_URL="https://github.com/libretro/libretro-core-info/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Mirror of libretro's core info files" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_BUILD}/*.info ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/libretro_base/glsl-shaders/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="glsl-shaders" PKG_VERSION="28643f63dd8d95dec49fb7241d3d35e3d037e14a" PKG_SHA256="ea1a97cd7d233c828e48d07fa40e1124aae58471ae7f63d608e18f6eee7455cd" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libretro/glsl-shaders" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Common GSLS shaders for RetroArch" PKG_LONGDESC="Common GSLS shaders for RetroArch" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" configure_target() { cd ${PKG_BUILD} } makeinstall_target() { make install INSTALLDIR="${INSTALL}/usr/share/common-shaders" } ================================================ FILE: packages/sx05re/libretro_base/libretro-database/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="libretro-database" PKG_VERSION="798f2a875676b895da13323e64856a451b290e71" PKG_SHA256="c448d124e8dd9f5fc39c44b976ac1cd14fd96fb9ffa0bed996edec69511dc4fa" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libretro/libretro-database" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Repository containing cheatcode files, content data files, etc." PKG_LONGDESC="Repository containing cheatcode files, content data files, etc." PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" configure_target() { cd ${PKG_BUILD} } makeinstall_target() { make install INSTALLDIR="${INSTALL}/usr/share/libretro-database" } ================================================ FILE: packages/sx05re/libretro_base/retroarch/modprobe.d/usbhid.conf ================================================ # Juyao options usbhid quirks=0x0314:0x0326:0x040 options usbhid quirks=0x0314:0x0328:0x040 # 4NES4SNES options usbhid quirks=0x1781:0x0A9D:0x040 # Retrolink SNES options usbhid quirks=0x1292:0x5346:0x040 options usbhid quirks=0x1292:0x5366:0x040 # Retrobit Atari to USB Driver options usbhid quirks=0x1292:0x4154:0x040 # Retrobit Genesis to PC USB Adapter options usbhid quirks=0x1292:0x4745:0x040 # Retrode options usbhid quirks=0x0403:0x97c1:0x040 # HuiJia USB GamePad Mayflash Sega Saturn options usbhid quirks=0x0e8f:0x3010:0x040 # HuiJia USB GamePad Mayflash NES SNES options usbhid quirks=0x0079:0x1804:0x040 # Mayflash Dreamcast options usbhid quirks=0x0xe8f:0x3013:0x040 # Xin-Mo 2players 20pins options usbhid quirks=0x16c0:0x75e1:0x040 # Xinmo 18 pins USB THT 2P arcade controller THT 2P arcade controller options usbhid quirks=0x16c0:0x05e1:0x040 # USB PS2 Adapter GreenAsia Electronics options usbhid quirks=0xe8f:0x1013:0x040 # HuiJia USB GamePad Mayflash N64 - need test options usbhid quirks=0xe8f:0x3013:0x040 # XCSOURCE 2 Encoder USB - Twin USB Gamepad options usbhid quirks=0x810:0xe001:0x040 # 3H Dual Arcade 2Players options usbhid quirks=0x16c0:0x05e0:0x040 #ShanWan Twin USB Joystick options usbhid quirks=0x2563:0x555:0x040 ================================================ FILE: packages/sx05re/libretro_base/retroarch/package.mk ================================================ ############################################################################# # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="retroarch" PKG_VERSION="850cc561968846b08a268421bf904d680724f303" PKG_SITE="https://github.com/libretro/RetroArch" PKG_URL="${PKG_SITE}.git" PKG_LICENSE="GPLv3" PKG_DEPENDS_TARGET="toolchain SDL2 alsa-lib openssl freetype zlib retroarch-assets retroarch-overlays core-info ffmpeg libass joyutils empty ${OPENGLES} samba avahi nss-mdns freetype openal-soft espeak" PKG_LONGDESC="Reference frontend for the libretro API." GET_HANDLER_SUPPORT="git" if [ "${DEVICE}" = "Amlogic-ng" ] || [ "${DEVICE}" = "Amlogic-no" ] || [ "${DEVICE}" = "Amlogic-old" ]; then PKG_PATCH_DIRS="${DEVICE}" fi if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ] || [ "${DEVICE}" == "RK356x" ] || [ "${DEVICE}" == "OdroidM1" ]; then PKG_DEPENDS_TARGET+=" libdrm librga" PKG_PATCH_DIRS="OdroidGoAdvance" fi # Pulseaudio Support if [ "${PULSEAUDIO_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" pulseaudio" fi pre_configure_target() { # Retroarch does not like -O3 for CHD loading with cheevos export CFLAGS="${CFLAGS} -O3 -fno-tree-vectorize" TARGET_CONFIGURE_OPTS="" PKG_CONFIGURE_OPTS_TARGET="--disable-qt \ --enable-alsa \ --enable-udev \ --disable-opengl1 \ --disable-opengl \ --enable-egl \ --enable-opengles \ --disable-wayland \ --disable-x11 \ --enable-zlib \ --enable-freetype \ --disable-discord \ --disable-vg \ --disable-sdl \ --enable-sdl2 \ --enable-ffmpeg" if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ] || [ "${DEVICE}" == "RK356x" ] || [ "${DEVICE}" == "OdroidM1" ]; then PKG_CONFIGURE_OPTS_TARGET+=" --enable-opengles3 \ --enable-opengles3_2 \ --enable-kms \ --disable-mali_fbdev" else PKG_CONFIGURE_OPTS_TARGET+=" --disable-kms \ --enable-mali_fbdev" fi if [ "${DEVICE}" == "OdroidGoAdvance" ]; then PKG_CONFIGURE_OPTS_TARGET+=" --enable-odroidgo2" fi if [ ${ARCH} == "arm" ]; then PKG_CONFIGURE_OPTS_TARGET+=" --enable-neon" fi cd ${PKG_BUILD} } make_target() { make HAVE_ONLINE_UPDATER=1 HAVE_UPDATE_CORES=1 HAVE_UPDATE_CORE_INFO=1 HAVE_COMPRESSION=1 HAVE_ACCESSIBILITY=1 HAVE_UPDATE_ASSETS=1 HAVE_LIBRETRODB=1 HAVE_BLUETOOTH=1 HAVE_NETWORKING=1 HAVE_LAKKA=1 HAVE_ZARCH=1 HAVE_QT=0 HAVE_LANGEXTRA=1 HAVE_LAKKA_PROJECT=odroidn2+.aarch64 HAVE_LAKKA_SERVER="https://www.lakka.tv" [ $? -eq 0 ] && echo "(retroarch ok)" || { echo "(retroarch failed)" ; exit 1 ; } make -C gfx/video_filters compiler=${CC} extra_flags="${CFLAGS}" [ $? -eq 0 ] && echo "(video filters ok)" || { echo "(video filters failed)" ; exit 1 ; } make -C libretro-common/audio/dsp_filters compiler=${CC} extra_flags="${CFLAGS}" [ $? -eq 0 ] && echo "(audio filters ok)" || { echo "(audio filters failed)" ; exit 1 ; } } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin mkdir -p ${INSTALL}/etc cp ${PKG_BUILD}/retroarch ${INSTALL}/usr/bin cp ${PKG_BUILD}/retroarch.cfg ${INSTALL}/etc mkdir -p ${INSTALL}/usr/share/video_filters cp ${PKG_BUILD}/gfx/video_filters/*.so ${INSTALL}/usr/share/video_filters cp ${PKG_BUILD}/gfx/video_filters/*.filt ${INSTALL}/usr/share/video_filters mkdir -p ${INSTALL}/usr/share/audio_filters cp ${PKG_BUILD}/libretro-common/audio/dsp_filters/*.so ${INSTALL}/usr/share/audio_filters cp ${PKG_BUILD}/libretro-common/audio/dsp_filters/*.dsp ${INSTALL}/usr/share/audio_filters # General configuration sed -i -e "s/# libretro_directory =/libretro_directory = \"\/tmp\/cores\"/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# libretro_info_path =/libretro_info_path = \"\/tmp\/cores\"/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# rgui_browser_directory =/rgui_browser_directory =\/storage\/roms/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# content_database_path =/content_database_path =\/tmp\/database\/rdb/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# playlist_directory =/playlist_directory =\/storage\/playlists/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# savefile_directory =/# savefile_directory =\/storage\/savefiles/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# savestate_directory =/savestate_directory =\/storage\/roms\/savestates/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# system_directory =/system_directory =\/storage\/roms\/bios/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# screenshot_directory =/screenshot_directory =\/storage\/roms\/screenshots/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# recording_output_directory =/recording_output_directory =\/storage\/roms\/mplayer\/retroarch/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# video_shader_dir =/video_shader_dir =\/tmp\/shaders/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# rgui_show_start_screen = true/rgui_show_start_screen = false/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# assets_directory =/assets_directory =\/tmp\/assets/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# overlay_directory =/overlay_directory =\/tmp\/overlays/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# cheat_database_path =/cheat_database_path =\/tmp\/database\/cht/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# menu_driver = \"rgui\"/menu_driver = \"ozone\"/" ${INSTALL}/etc/retroarch.cfg # Quick menu echo "core_assets_directory =/storage/roms/downloads" >> ${INSTALL}/etc/retroarch.cfg echo "quick_menu_show_undo_save_load_state = \"false\"" >> ${INSTALL}/etc/retroarch.cfg echo "quick_menu_show_save_core_overrides = \"false\"" >> ${INSTALL}/etc/retroarch.cfg echo "quick_menu_show_save_game_overrides = \"false\"" >> ${INSTALL}/etc/retroarch.cfg echo "quick_menu_show_cheats = \"true\"" >> ${INSTALL}/etc/retroarch.cfg # Video sed -i -e "s/# video_windowed_fullscreen = true/video_windowed_fullscreen = false/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# video_smooth = true/video_smooth = false/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# video_aspect_ratio_auto = false/video_aspect_ratio_auto = true/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# video_threaded = false/video_threaded = true/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# video_font_path =/video_font_path =\/usr\/share\/retroarch-assets\/xmb\/monochrome\/font.ttf/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# video_font_size = 48/video_font_size = 32/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# video_filter_dir =/video_filter_dir =\/usr\/share\/video_filters/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# video_gpu_screenshot = true/video_gpu_screenshot = false/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# video_fullscreen = false/video_fullscreen = true/" ${INSTALL}/etc/retroarch.cfg # Audio sed -i -e "s/# audio_driver =/audio_driver = \"alsathread\"/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# audio_filter_dir =/audio_filter_dir =\/usr\/share\/audio_filters/" ${INSTALL}/etc/retroarch.cfg if [ "${PROJECT}" == "OdroidXU3" ]; then # workaround the 55fps bug sed -i -e "s/# audio_out_rate = 48000/audio_out_rate = 44100/" ${INSTALL}/etc/retroarch.cfg fi # Saving echo "savestate_thumbnail_enable = \"true\"" >> ${INSTALL}/etc/retroarch.cfg # Input sed -i -e "s/# input_driver = sdl/input_driver = udev/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# input_max_users = 16/input_max_users = 5/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# input_autodetect_enable = true/input_autodetect_enable = true/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# joypad_autoconfig_dir =/joypad_autoconfig_dir = \/tmp\/joypads/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# input_remapping_directory =/input_remapping_directory = \/storage\/.config\/retroarch\/config\/remappings/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# input_menu_toggle_gamepad_combo = 0/input_menu_toggle_gamepad_combo = 2/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# all_users_control_menu = false/all_users_control_menu = true/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# menu_swap_ok_cancel_buttons = false/menu_swap_ok_cancel_buttons = false/" ${INSTALL}/etc/retroarch.cfg # Menu sed -i -e "s/# menu_mouse_enable = false/menu_mouse_enable = false/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# menu_core_enable = true/menu_core_enable = true/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# thumbnails_directory =/thumbnails_directory = \/storage\/thumbnails/" ${INSTALL}/etc/retroarch.cfg echo "menu_show_advanced_settings = \"false\"" >> ${INSTALL}/etc/retroarch.cfg echo "menu_wallpaper_opacity = \"1.0\"" >> ${INSTALL}/etc/retroarch.cfg echo "content_show_images = \"false\"" >> ${INSTALL}/etc/retroarch.cfg echo "content_show_music = \"false\"" >> ${INSTALL}/etc/retroarch.cfg echo "content_show_video = \"false\"" >> ${INSTALL}/etc/retroarch.cfg # Updater if [ "${ARCH}" == "arm" ]; then sed -i -e "s/# core_updater_buildbot_url = \"http:\/\/buildbot.libretro.com\"/core_updater_buildbot_url = \"http:\/\/buildbot.libretro.com\/nightly\/linux\/armhf\/latest\/\"/" ${INSTALL}/etc/retroarch.cfg fi # Playlists echo "playlist_names = \"${RA_PLAYLIST_NAMES}\"" >> ${INSTALL}/etc/retroarch.cfg echo "playlist_cores = \"${RA_PLAYLIST_CORES}\"" >> ${INSTALL}/etc/retroarch.cfg echo "playlist_entry_rename = \"false\"" >> ${INSTALL}/etc/retroarch.cfg echo "playlist_entry_remove = \"false\"" >> ${INSTALL}/etc/retroarch.cfg #emuelec sed -i -e "s/.*core_updater_buildbot_url =.*/core_updater_buildbot_url = \"http:\/\/dontupdatecores\"/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# input_hotkey_block_delay = \"5\"/input_hotkey_block_delay = \"5\"/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# menu_show_core_updater = true/\# DONT UPDATE CORES IT WILL BREAK EMUELEC! \n menu_show_core_updater = false/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# menu_show_online_updater = true/menu_show_online_updater = true/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# input_overlay_opacity = 1.0/input_overlay_opacity = 0.15/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# audio_volume = 0.0/audio_volume = "0.000000"/" ${INSTALL}/etc/retroarch.cfg sed -i -e "s/# cache_directory =/cache_directory = \/tmp\/cache/" ${INSTALL}/etc/retroarch.cfg echo "user_language = \"0\"" >> ${INSTALL}/etc/retroarch.cfg echo "menu_show_shutdown = \"false\"" >> ${INSTALL}/etc/retroarch.cfg echo "menu_show_reboot = \"false\"" >> ${INSTALL}/etc/retroarch.cfg echo "input_player1_analog_dpad_mode = \"1\"" >> ${INSTALL}/etc/retroarch.cfg echo "input_player2_analog_dpad_mode = \"1\"" >> ${INSTALL}/etc/retroarch.cfg echo "input_player3_analog_dpad_mode = \"1\"" >> ${INSTALL}/etc/retroarch.cfg echo "input_player4_analog_dpad_mode = \"1\"" >> ${INSTALL}/etc/retroarch.cfg echo "savefiles_in_content_dir = \"true\"" >> ${INSTALL}/etc/retroarch.cfg echo "savestates_in_content_dir = \"false\"" >> ${INSTALL}/etc/retroarch.cfg echo "menu_show_restart_retroarch = \"false\"" >> ${INSTALL}/etc/retroarch.cfg echo "menu_show_quit_retroarch = \"true\"" >> ${INSTALL}/etc/retroarch.cfg if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then echo "xmb_layout = 2" >> ${INSTALL}/etc/retroarch.cfg echo "menu_widget_scale_auto = false" >> ${INSTALL}/etc/retroarch.cfg echo "menu_widget_scale_factor = 2.00" >> ${INSTALL}/etc/retroarch.cfg echo "menu_scale_factor = 1.000000" >> ${INSTALL}/etc/retroarch.cfg echo "video_font_size = 12.000000" >> ${INSTALL}/etc/retroarch.cfg echo "menu_rgui_shadows = true" >> ${INSTALL}/etc/retroarch.cfg echo "rgui_aspect_ratio = 6" >> ${INSTALL}/etc/retroarch.cfg echo "rgui_inline_thumbnails = true" >> ${INSTALL}/etc/retroarch.cfg echo "input_max_users = 1" >> ${INSTALL}/etc/retroarch.cfg fi mkdir -p ${INSTALL}/usr/config/retroarch/ mv ${INSTALL}/etc/retroarch.cfg ${INSTALL}/usr/config/retroarch/ } post_install() { enable_service retroarch.service enable_service tmp-cores.mount enable_service tmp-joypads.mount enable_service tmp-database.mount enable_service tmp-assets.mount enable_service tmp-shaders.mount enable_service tmp-overlays.mount } ================================================ FILE: packages/sx05re/libretro_base/retroarch/patches/13pixel.patch ================================================ --- a/cheevos/cheevos.c 2024-12-22 21:25:46.767207900 +0100 +++ b/cheevos/cheevos.c 2024-12-22 21:31:50.025471176 +0100 @@ -293,7 +293,11 @@ if (!cheevo) return; - + char pixelcade[256]; + snprintf(pixelcade, sizeof(pixelcade), "/storage/.emulationstation/scripts/achievements/pixelcade.sh %u \"%s\" \"%s\" > /dev/null 2>/dev/null", + cheevo->id, cheevo->title, cheevo->description); + //CHEEVOS_LOG(pixelcade); + system(pixelcade); /* Show the on screen message. */ if (settings->bools.cheevos_visibility_unlock) { @@ -1279,12 +1283,14 @@ MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); } + if (settings->bools.cheevos_unsupported_notification) { if (summary.num_unsupported_achievements) { const char* warning = msg_hash_to_str(MSG_CHEEVOS_UNSUPPORTED_WARNING); runloop_msg_queue_push(warning, strlen(warning), 0, 3 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_WARNING); } + } } static uint32_t rcheevos_client_read_memory(uint32_t address, ================================================ FILE: packages/sx05re/libretro_base/retroarch/patches/Amlogic-old/01-ALSA_fix.patch ================================================ diff --git a/audio/common/alsa.c b/audio/common/alsa.c index f1b011a2e8..07a3d9b23b 100644 --- a/audio/common/alsa.c +++ b/audio/common/alsa.c @@ -63,16 +63,6 @@ int alsa_init_pcm(snd_pcm_t **pcm, goto error; } - if ((errnum = snd_pcm_hw_params_any(*pcm, params)) < 0) - { - RARCH_ERR("[ALSA]: Failed to query hardware parameters from %s device \"%s\": %s\n", - snd_pcm_stream_name(stream), - snd_pcm_name(*pcm), - snd_strerror(errnum)); - - goto error; - } - format = (snd_pcm_hw_params_test_format(*pcm, params, SND_PCM_FORMAT_FLOAT) == 0) ? SND_PCM_FORMAT_FLOAT : SND_PCM_FORMAT_S16; stream_info->has_float = (format == SND_PCM_FORMAT_FLOAT); @@ -83,6 +73,16 @@ int alsa_init_pcm(snd_pcm_t **pcm, snd_pcm_name(*pcm) ); + if ((errnum = snd_pcm_hw_params_any(*pcm, params)) < 0) + { + RARCH_ERR("[ALSA]: Failed to query hardware parameters from %s device \"%s\": %s\n", + snd_pcm_stream_name(stream), + snd_pcm_name(*pcm), + snd_strerror(errnum)); + + goto error; + } + if ((errnum = snd_pcm_hw_params_set_access(*pcm, params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { RARCH_ERR("[ALSA]: Failed to set %s access for %s device \"%s\": %s\n", ================================================ FILE: packages/sx05re/libretro_base/retroarch/patches/OdroidGoAdvance/0001-video_thread_wrapper-implement-RETRO_ENVIRONMENT_GET.patch ================================================ From cfc19b7e5ccaabd0ae5cf74a470badc04a97fab0 Mon Sep 17 00:00:00 2001 From: valadaa48 Date: Sun, 13 Dec 2020 15:24:02 -0500 Subject: [PATCH] video_thread_wrapper: implement RETRO_ENVIRONMENT_GET_CURRENT_SOFTWARE_FRAMEBUFFER: --- gfx/video_thread_wrapper.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/gfx/video_thread_wrapper.c b/gfx/video_thread_wrapper.c index 9052130198..36028a6ec4 100644 --- a/gfx/video_thread_wrapper.c +++ b/gfx/video_thread_wrapper.c @@ -612,7 +612,7 @@ unsigned copy_stride = width * (thr->info.rgb32 ? sizeof(uint32_t) : sizeof(uint16_t)); - if (src) + if (src && src != dst) { unsigned h; for (h = 0; h < height; h++, src += pitch, dst += copy_stride) @@ -1248,6 +1248,20 @@ return thr->poke->get_flags(thr->driver_data); return 0; +} + +static bool thread_get_current_software_framebuffer(void *data, + struct retro_framebuffer *framebuffer) +{ + thread_video_t *thr = (thread_video_t*)data; + if (!thr) + return false; + + framebuffer->data = (uint8_t*)thr->frame.buffer; + framebuffer->pitch = thr->frame.pitch; + framebuffer->format = thr->info.rgb32 ? RETRO_PIXEL_FORMAT_XRGB8888 : RETRO_PIXEL_FORMAT_RGB565; + + return true; } static const video_poke_interface_t thread_poke = { @@ -1270,7 +1284,7 @@ thread_show_mouse, thread_grab_mouse_toggle, thread_get_current_shader, - NULL, /* get_current_software_framebuffer */ + thread_get_current_software_framebuffer, NULL, /* get_hw_render_interface */ thread_set_hdr_max_nits, thread_set_hdr_paper_white_nits, -- 2.30.0 ================================================ FILE: packages/sx05re/libretro_base/retroarch/patches/OdroidGoAdvance/999-emuelec-add-vertical.patch ================================================ --- a/gfx/drivers/oga_gfx.c +++ b/gfx/drivers/oga_gfx.c @@ -547,6 +547,7 @@ static bool oga_frame(void *data, const void *frame, unsigned width, unsigned height, uint64_t frame_count, unsigned pitch, const char *msg, video_frame_info_t *video_info) { + settings_t *settings = config_get_ptr(); oga_video_t *vid = (oga_video_t*)data; oga_framebuf_t* page = vid->pages[vid->cur_page]; oga_surface_t *page_surface = page->surface; @@ -581,10 +582,17 @@ static bool oga_frame(void *data, const void *frame, unsigned width, width = vid->menu_surface->width; height = vid->menu_surface->height; aspect_ratio = (float)width / height; + if (settings->bools.video_oga_vertical_enable) { + vid->rotation = 0; + if (settings->bools.video_ogs_vertical_enable) + vid->rotation = HAL_TRANSFORM_ROT_180; + + // RARCH_LOG("EmuELEC Rotation set to %d", vid->rotation); + } oga_calc_bounds(&r, vid->drm_width, vid->drm_height, width, height, aspect_ratio, vid->display_ar); oga_blit(vid->menu_surface, 0, 0, width, height, - page_surface, r.y, r.x, r.h, r.w, HAL_TRANSFORM_ROT_270, vid->scale_mode, 0); + page_surface, r.y, r.x, r.h, r.w, vid->rotation, vid->scale_mode, 0); } else #endif @@ -608,6 +616,14 @@ static bool oga_frame(void *data, const void *frame, unsigned width, } } + if (settings->bools.video_oga_vertical_enable) { + vid->rotation = HAL_TRANSFORM_ROT_270; + + if (settings->bools.video_ogs_vertical_enable) + vid->rotation = HAL_TRANSFORM_ROT_90; + + // RARCH_LOG("EmuELEC Rotation set to %d", vid->rotation); +} oga_calc_bounds(&r, vid->drm_width, vid->drm_height, width, height, aspect_ratio, vid->display_ar); oga_blit(vid->frame_surface, 0, 0, width, height, page_surface, r.y, r.x, r.h, r.w, vid->rotation, vid->scale_mode, blend); @@ -615,9 +631,21 @@ static bool oga_frame(void *data, const void *frame, unsigned width, if (msg) { + + if (settings->bools.video_oga_vertical_enable) { + int rotation2 = 0; + + if (settings->bools.video_ogs_vertical_enable) + rotation2 = HAL_TRANSFORM_ROT_180; + + oga_blit(vid->msg_surface, 0, 0, vid->msg_width, vid->msg_height, + page_surface, 0, 0, vid->msg_width, vid->msg_height, + rotation2, vid->scale_mode, 0xff0105); + } else { oga_blit(vid->msg_surface, 0, 0, vid->msg_width, vid->msg_height, page_surface, 0, 0, vid->msg_height, vid->msg_width, HAL_TRANSFORM_ROT_270, vid->scale_mode, 0xff0105); + } } if (unlikely(drmModeSetCrtc(vid->fd, vid->crtc_id, page->fb_id, 0, 0, &vid->connector_id, 1, &vid->mode) != 0)) @@ -705,6 +733,14 @@ static void oga_set_rotation(void *data, unsigned rotation) if (!vid) return; + settings_t *settings = config_get_ptr(); + + if (settings->bools.video_oga_vertical_enable) + rotation = 3; + + if (settings->bools.video_ogs_vertical_enable) + rotation = 2; + switch (rotation) { case 0: --- a/gfx/drivers_context/drm_go2_ctx.c +++ b/gfx/drivers_context/drm_go2_ctx.c @@ -295,7 +295,8 @@ int src_w = drm->fb_width; int src_h = drm->fb_height; int src_x = 0; int src_y = drm->ctx_h - drm->fb_height; + settings_t *settings = config_get_ptr(); if (out_w != src_w || out_h != src_h) { @@ -321,10 +322,25 @@ go2_context_swap_buffers(drm->context); surf = go2_context_surface_lock(drm->context); + +if (settings->bools.video_oga_vertical_enable) { + + auto ee_rotation = GO2_ROTATION_DEGREES_0; + + if (settings->bools.video_ogs_vertical_enable) + ee_rotation = GO2_ROTATION_DEGREES_180; + + go2_presenter_post(drm->presenter, + surf, + src_x, src_y, src_w, src_h, + out_y, out_x, out_h, out_w, + ee_rotation, 2); +} else { go2_presenter_post(drm->presenter, surf, src_x, src_y, src_w, src_h, out_y, out_x, out_h, out_w, GO2_ROTATION_DEGREES_270, 2); +} go2_context_surface_unlock(drm->context, surf); #endif } ================================================ FILE: packages/sx05re/libretro_base/retroarch/patches/OdroidGoAdvance/999-enable_rga_scaling_for_gf.patch ================================================ --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -10856,7 +10856,6 @@ MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT); } -#ifdef HAVE_ODROIDGO2 CONFIG_BOOL( list, list_info, &settings->bools.video_ctx_scaling, @@ -10873,7 +10872,6 @@ SD_FLAG_NONE ); MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT); -#endif CONFIG_UINT( list, list_info, --- a/msg_hash.h +++ b/msg_hash.h @@ -1105,9 +1105,7 @@ MENU_LABEL(VIDEO_RECORD_THREADS), MENU_LABEL(VIDEO_SMOOTH), MENU_LABEL(VIDEO_CTX_SCALING), -#ifdef HAVE_ODROIDGO2 MENU_LABEL(VIDEO_RGA_SCALING), -#endif MENU_LABEL(VIDEO_CROP_OVERSCAN), ================================================ FILE: packages/sx05re/libretro_base/retroarch/patches/OdroidGoAdvance/9999-emuelec-unify-brightness.patch ================================================ --- a/frontend/drivers/platform_unix.c +++ b/frontend/drivers/platform_unix.c @@ -1334,12 +1334,17 @@ } #endif - /* Calculate the brightness */ + char bright[64]; + sprintf(bright, "/usr/bin/odroidgoa_utils.sh bright %i", value); + system(bright); + /* + // Calculate the brightness value = (value * max_brightness) / 100; snprintf(svalue, sizeof(svalue), "%d\n", value); filestream_write_file("/sys/class/backlight/backlight/brightness", svalue, strlen(svalue)); +*/ } #endif @@ -2052,13 +2052,13 @@ android_app_destroy(android_app); #endif - +/* #ifdef HAVE_LAKKA - /* Reset brightness to maximum */ + // Reset brightness to maximum if (settings->uints.screen_brightness != DEFAULT_SCREEN_BRIGHTNESS) frontend_unix_set_screen_brightness(DEFAULT_SCREEN_BRIGHTNESS); #endif - +*/ frontend_unix_set_gamemode(false); } static void frontend_unix_init(void *data) @@ -2800,7 +2807,7 @@ #else NULL, /* get_lakka_version */ #endif -#if defined(HAVE_LAKKA_SWITCH) || (defined(HAVE_LAKKA) && defined(HAVE_ODROIDGO2)) +#if defined(HAVE_LAKKA_SWITCH) || defined(HAVE_LAKKA) frontend_unix_set_screen_brightness,/* set_screen_brightness */ #else NULL, /* set_screen_brightness */ ================================================ FILE: packages/sx05re/libretro_base/retroarch/patches/retroarch-01-xkb-fix.patch ================================================ diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index bcdacb60a6..d2f00114bd 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -76,14 +76,14 @@ #include "../../retroarch.h" #include "../../verbosity.h" -#if defined(HAVE_XKBCOMMON) && defined(HAVE_KMS) +#if defined(HAVE_XKBCOMMON) #define UDEV_XKB_HANDLING #endif /* Force UDEV_XKB_HANDLING for Lakka */ #ifdef HAVE_LAKKA #ifndef UDEV_XKB_HANDLING -#define UDEV_XKB_HANDLING +#undef UDEV_XKB_HANDLING #endif #endif @@ -1402,7 +1402,7 @@ /* Force xkb_handling on Lakka */ udev->xkb_handling = true; #else - udev->xkb_handling = string_is_equal(ctx_ident.ident, "kms"); + udev->xkb_handling = true; //string_is_equal(ctx_ident.ident, "kms"); #endif /* HAVE_LAKKA */ #endif ================================================ FILE: packages/sx05re/libretro_base/retroarch/patches/retroarch-02_disable_search.patch ================================================ --- a/menu/menu_driver.c 2023-08-17 17:35:47.328058500 +0200 +++ b/menu/menu_driver_2.c 2023-08-17 17:42:40.014684249 +0200 @@ -7617,7 +7617,7 @@ entry->label, entry->type, i, entry->entry_idx); break; case MENU_ACTION_SEARCH: - menu_input_dialog_start_search(); + //menu_input_dialog_start_search(); break; case MENU_ACTION_SCAN: if (cbs && cbs->action_scan) ================================================ FILE: packages/sx05re/libretro_base/retroarch/patches/retroarch-04-enablecontent.patch ================================================ --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -13884,12 +13884,6 @@ menu_entries_clear(info->list); { #ifdef HAVE_LAKKA - if (menu_entries_append(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UPDATE_LAKKA), - msg_hash_to_str(MENU_ENUM_LABEL_UPDATE_LAKKA), - MENU_ENUM_LABEL_UPDATE_LAKKA, - MENU_SETTING_ACTION, 0, 0, NULL)) - count++; if (menu_entries_append(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE_CONTENT), --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -9781,7 +9781,7 @@ #endif #if !defined(IOS) /* Apple rejects iOS apps that let you forcibly quit them. */ -#ifdef HAVE_LAKKA +#ifndef HAVE_LAKKA CONFIG_ACTION( list, list_info, MENU_ENUM_LABEL_QUIT_RETROARCH, @@ -17765,7 +17765,7 @@ general_read_handler, SD_FLAG_LAKKA_ADVANCED); -#ifdef HAVE_LAKKA +#ifndef HAVE_LAKKA CONFIG_BOOL( list, list_info, &settings->bools.menu_show_quit_retroarch, --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -604,7 +604,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_load_content_history, MENU_ENUM_SUBLABEL_LOAD_CONTENT_HISTORY) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_network_information, MENU_ENUM_SUBLABEL_NETWORK_INFORMATION) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_system_information, MENU_ENUM_SUBLABEL_SYSTEM_INFORMATION) -#ifdef HAVE_LAKKA +#ifndef HAVE_LAKKA DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quit_retroarch, MENU_ENUM_SUBLABEL_RESTART_RETROARCH) #else DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quit_retroarch, MENU_ENUM_SUBLABEL_QUIT_RETROARCH) ================================================ FILE: packages/sx05re/libretro_base/retroarch/patches/retroarch-10-Exit_menu.patch ================================================ --- ./retroarch.c 2017-07-26 23:59:01.195225618 -0500 +++ ./retroarch.c 2017-08-14 01:58:07.722644341 -0500 @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -3962,9 +3963,30 @@ } break; case CMD_EVENT_QUIT: - if (!retroarch_main_quit()) + { + /* Exit Back to Kodi if the option exists on the cfg file*/ + settings_t *settings = config_get_ptr(); + if(settings->bools.emuelec_exit_to_kodi) + { + remove("/var/lock/start.retro"); + system("touch /var/lock/start.kodi"); + system("systemctl start kodi.service"); + system("systemctl stop retroarch.service"); + } + else + { + /* Exit back to ES - TODO: Check if start.retro file exists, if it does, then exit with the following code */ + if( access( "/var/lock/start.retro", F_OK ) != -1 ) { remove("/var/lock/start.retro"); + system("touch /var/lock/start.games"); + system("systemctl restart emustation.service"); + system("systemctl stop retroarch.service"); + } } + /* if it doesn't exist then just exit */ + + if (!retroarch_main_quit()) return false; break; + } case CMD_EVENT_CHEEVOS_HARDCORE_MODE_TOGGLE: #ifdef HAVE_CHEEVOS rcheevos_toggle_hardcore_mode(); --- ./configuration.h 2017-08-14 02:20:37.546187576 -0500 +++ ./configuration.h 2017-08-14 02:20:46.390236188 -0500 @@ -47,6 +47,11 @@ { bool placeholder; + /* emuelec */ + bool emuelec_exit_to_kodi; + bool video_oga_vertical_enable; + bool video_ogs_vertical_enable; + bool cheevos_unsupported_notification; /* Video */ bool video_fullscreen; bool video_windowed_fullscreen; --- ./configuration.c 2017-08-18 06:30:31.000000000 -0500 +++ ./configuration.c 2017-08-23 01:24:28.009570267 -0500 @@ -1329,6 +1329,12 @@ { struct config_bool_setting *tmp = (struct config_bool_setting*)calloc(1, (*size + 1) * sizeof(struct config_bool_setting)); unsigned count = 0; + /* emuelec */ + SETTING_BOOL("emuelec_exit_to_kodi", &settings->bools.emuelec_exit_to_kodi, true, false, false); + SETTING_BOOL("video_oga_vertical_enable", &settings->bools.video_oga_vertical_enable, true, false, false); + SETTING_BOOL("video_ogs_vertical_enable", &settings->bools.video_ogs_vertical_enable, true, false, false); + SETTING_BOOL("cheevos_unsupported_notification", &settings->bools.cheevos_unsupported_notification, true, false, false); + /* emuelec */ SETTING_BOOL("accessibility_enable", &settings->bools.accessibility_enable, true, DEFAULT_ACCESSIBILITY_ENABLE, false); SETTING_BOOL("driver_switch_enable", &settings->bools.driver_switch_enable, true, DEFAULT_DRIVER_SWITCH_ENABLE, false); ================================================ FILE: packages/sx05re/libretro_base/retroarch/patches/retroarch-12-input_sort_devices.patch ================================================ diff --git a/input/drivers_joypad/udev_joypad.c b/input/drivers_joypad/udev_joypad.c index e60a8b2..03ba777 100644 --- a/input/drivers_joypad/udev_joypad.c +++ b/input/drivers_joypad/udev_joypad.c @@ -538,6 +538,14 @@ } } +/* Used for sorting devnodes to appear in the correct order */ +static int sort_devnodes(const void *a, const void *b) +{ + const struct joypad_udev_entry *aa = (const struct joypad_udev_entry*)a; + const struct joypad_udev_entry *bb = (const struct joypad_udev_entry*)b; + return strcmp(aa->devnode, bb->devnode); +} + static void *udev_joypad_init(void *data) { unsigned i; @@ -570,9 +578,29 @@ udev_enumerate_scan_devices(enumerate); devs = udev_enumerate_get_list_entry(enumerate); - udev_list_entry_foreach(item, devs) + for (item = devs; item; item = udev_list_entry_get_next(item)) { const char *name = udev_list_entry_get_name(item); + struct udev_device *dev = udev_device_new_from_syspath(udev_joypad_fd, name); + const char *devnode = udev_device_get_devnode(dev); + + if (devnode != NULL) { + sorted[sorted_count].devnode = devnode; + sorted[sorted_count].item = item; + sorted_count++; + } else { + udev_device_unref(dev); + } + } + + /* Sort the udev entries by devnode name so that they are + * created in the proper order */ + qsort(sorted, sorted_count, + sizeof(struct joypad_udev_entry), sort_devnodes); + + for (i = 0; i < sorted_count; i++) + { + const char *name = udev_list_entry_get_name(sorted[i].item); struct udev_device *dev = udev_device_new_from_syspath(udev_joypad_fd, name); const char *devnode = udev_device_get_devnode(dev); ================================================ FILE: packages/sx05re/libretro_base/retroarch/scripts/retroarch-config ================================================ #!/bin/bash for i in 5 4 3 2 1 0; do [ -e /dev/snd/pcmC${i}D0p ] && export ALSA_CARD=$i; done echo "ALSA_CARD=\"$ALSA_CARD\"" > /run/libreelec/retroarch.conf echo "LD_LIBRARY_PATH=\"/usr/lib:/tmp/cores\"" >> /run/libreelec/retroarch.conf ================================================ FILE: packages/sx05re/libretro_base/retroarch/system.d/retroarch.service ================================================ [Unit] Description=RetroArch emulator frontend ConditionPathExists=/var/lock/start.retro [Service] Environment=DISPLAY=:0.0 Environment=SDL_MOUSE_RELATIVE=0 Environment=FB_MULTI_BUFFER=2 Environment=HOME=/storage ExecStartPre=/usr/bin/emustation-config retroarch ExecStart=/bin/bash -c '/usr/bin/retroarch $(cat /emuelec/configs/RA_ARGS)' KillMode=process TimeoutStopSec=3 Restart=on-failure RestartSec=2 StartLimitInterval=0 [Install] WantedBy=emuelec.target ================================================ FILE: packages/sx05re/libretro_base/retroarch/system.d/tmp-assets.mount ================================================ [Unit] Description=Assets directory After=systemd-tmpfiles-setup.service DefaultDependencies=no [Mount] What=none Where=/tmp/assets Type=overlay Options=lowerdir=/usr/share/retroarch-assets,upperdir=/storage/assets,workdir=/storage/.tmp/assets-workdir [Install] WantedBy=emuelec.target ================================================ FILE: packages/sx05re/libretro_base/retroarch/system.d/tmp-cores.mount ================================================ [Unit] Description=Cores directory After=systemd-tmpfiles-setup.service DefaultDependencies=no [Mount] What=none Where=/tmp/cores Type=overlay Options=lowerdir=/usr/lib/libretro,upperdir=/storage/cores,workdir=/storage/.tmp/cores-workdir [Install] WantedBy=emuelec.target ================================================ FILE: packages/sx05re/libretro_base/retroarch/system.d/tmp-database.mount ================================================ [Unit] Description=Database directory After=systemd-tmpfiles-setup.service DefaultDependencies=no [Mount] What=none Where=/tmp/database Type=overlay Options=lowerdir=/usr/share/libretro-database,upperdir=/storage/database,workdir=/storage/.tmp/database-workdir [Install] WantedBy=emuelec.target ================================================ FILE: packages/sx05re/libretro_base/retroarch/system.d/tmp-joypads.mount ================================================ [Unit] Description=Joypad configs directory After=systemd-tmpfiles-setup.service DefaultDependencies=no [Mount] What=none Where=/tmp/joypads Type=overlay Options=lowerdir=/etc/retroarch-joypad-autoconfig,upperdir=/storage/joypads,workdir=/storage/.tmp/joypads-workdir [Install] WantedBy=emuelec.target ================================================ FILE: packages/sx05re/libretro_base/retroarch/system.d/tmp-overlays.mount ================================================ [Unit] Description=Overlays directory After=systemd-tmpfiles-setup.service DefaultDependencies=no [Mount] What=none Where=/tmp/overlays Type=overlay Options=lowerdir=/usr/share/retroarch-overlays,upperdir=/storage/overlays,workdir=/storage/.tmp/overlays-workdir [Install] WantedBy=emuelec.target ================================================ FILE: packages/sx05re/libretro_base/retroarch/system.d/tmp-shaders.mount ================================================ [Unit] Description=Shaders directory RetroArch After=systemd-tmpfiles-setup.service DefaultDependencies=no [Mount] What=none Where=/tmp/shaders Type=overlay Options=lowerdir=/usr/share/common-shaders,upperdir=/storage/shaders,workdir=/storage/.tmp/shaders-workdir [Install] WantedBy=emuelec.target ================================================ FILE: packages/sx05re/libretro_base/retroarch/tmpfiles.d/retroarch-userdirs.conf ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # # OpenELEC is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # OpenELEC is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC. If not, see . ################################################################################ d /storage/cores 0777 root root - - d /storage/playlists 0777 root root - - d /storage/savefiles 0777 root root - - d /storage/savestates 0777 root root - - d /storage/system 0777 root root - - d /storage/roms/screenshots 0777 root root - - d /storage/shaders 0777 root root - - d /storage/joypads 0777 root root - - d /storage/remappings 0777 root root - - d /storage/database 0777 root root - - d /storage/thumbnails 0777 root root - - d /storage/assets 0777 root root - - d /storage/overlays 0777 root root - - d /storage/.tmp/cores-workdir 0777 root root - - d /storage/.tmp/joypads-workdir 0777 root root - - d /storage/.tmp/database-workdir 0777 root root - - d /storage/.tmp/assets-workdir 0777 root root - - d /storage/.tmp/overlays-workdir 0777 root root - - d /storage/.tmp/shaders-workdir 0777 root root - - ================================================ FILE: packages/sx05re/libretro_base/retroarch/udev.d/99-8bitdo-bluetooth-controllers.rules ================================================ # Add the ID_INPUT_JOYSTICK attribute to the device so SDL picks up on it # 8Bitdo FC30 1P GamePad Bluetooth mode(START) mode(START+R) SUBSYSTEM=="input", ATTRS{name}=="8Bitdo FC30 GamePad", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" # 8Bitdo FC30 2P GamePad Bluetooth mode(START) SUBSYSTEM=="input", ATTRS{name}=="8Bitdo FC30 II", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" # 8Bitdo FC30 2P GamePad Bluetooth mode(START+R) SUBSYSTEM=="input", ATTRS{name}=="8Bitdo FC30 II Joystick", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" # 8Bitdo SFC30 GamePad Bluetooth mode(START) SUBSYSTEM=="input", ATTRS{name}=="8Bitdo SFC30 GamePad", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" # 8Bitdo SFC30 GamePad Bluetooth mode(START+R) SUBSYSTEM=="input", ATTRS{name}=="8Bitdo SFC30 GamePad Joystick", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" # 8Bitdo NES30 GamePad Bluetooth mode(START) SUBSYSTEM=="input", ATTRS{name}=="8Bitdo NES30 GamePad", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" # 8Bitdo NES30 GamePad Bluetooth mode(START+R) SUBSYSTEM=="input", ATTRS{name}=="8Bitdo NES30 GamePad Joystick", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" # 8Bitdo SNES30 GamePad Bluetooth mode(START) SUBSYSTEM=="input", ATTRS{name}=="8Bitdo SNES30 GamePad", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" # 8Bitdo SNES30 GamePad Bluetooth mode(START+R) SUBSYSTEM=="input", ATTRS{name}=="8Bitdo SNES30 GamePad Joystick", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" # 8Bitdo FC30 Pro GamePad Bluetooth mode(POWER) mode(POWER+R1) SUBSYSTEM=="input", ATTRS{name}=="8Bitdo FC30 Pro", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" # 8Bitdo NES30 Pro GamePad Bluetooth mode(POWER) SUBSYSTEM=="input", ATTRS{name}=="8Bitdo NES30 Pro", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" # 8Bitdo NES30 Pro GamePad Bluetooth mode(POWER+R1) SUBSYSTEM=="input", ATTRS{name}=="8Bitdo NES30 Pro Joystick", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" # 8Bitdo FC30 Arcade Joystick Bluetooth mode(HOME) SUBSYSTEM=="input", ATTRS{name}=="8Bitdo Joy", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" # 8Bitdo Zero GamePad Bluetooth mode(START) mode(START+R) SUBSYSTEM=="input", ATTRS{name}=="8Bitdo Zero GamePad", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" # 8Bitdo 2.4ghz ultimate ACTION=="add", ATTRS{idVendor}=="2dc8", ATTRS{idProduct}=="3106", RUN+="/sbin/modprobe xpad", RUN+="/bin/bash -c 'echo 2dc8 3106 > /sys/bus/usb/drivers/xpad/new_id'" # 8Bitdo M30 ACTION=="add", ATTRS{idVendor}=="2dc8", ATTRS{idProduct}=="6002", RUN+="/sbin/modprobe xpad", RUN+="/bin/bash -c 'echo 2dc8 6002 > /sys/bus/usb/drivers/xpad/new_id'" ================================================ FILE: packages/sx05re/libretro_base/retroarch/udev.d/99-ION-iCade-bluetooth.rules ================================================ SUBSYSTEM=="input", ATTRS{name}=="ION iCade", KERNEL=="event*", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" ================================================ FILE: packages/sx05re/libretro_base/retroarch/udev.d/99-bluetooth-power-on.rules ================================================ ACTION=="add", KERNEL=="hci0", RUN+="/usr/bin/hciconfig hci0 up" ================================================ FILE: packages/sx05re/libretro_base/retroarch/udev.d/99-evdev.rules ================================================ # Needed for permissions set correctly for /dev/input/event* for keyboard input SUBSYSTEM=="input", ATTRS{name}=="input/%k", KERNEL=="event*", MODE="0666", ENV{ID_INPUT_KEYBOARD}="1" ================================================ FILE: packages/sx05re/libretro_base/retroarch/udev.d/99-gen-game-s3-controller.rules ================================================ SUBSYSTEM=="input", ATTRS{name}=="GEN GAME S3", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1", ENV{ID_INPUT_MOUSE}="", ENV{ID_INPUT_KEYBOARD}="" ================================================ FILE: packages/sx05re/libretro_base/retroarch/udev.d/99-homatics-gamepad.rules ================================================ SUBSYSTEM=="input", ATTRS{name}=="GAME", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" ================================================ FILE: packages/sx05re/libretro_base/retroarch/udev.d/99-juyao-dual-arcade.rules ================================================ # Needed for device Juyao dual arcade (Bus 002 Device 007: ID 0314:0328) ATTRS{product}=="JUYAO Dual Arcade",ACTION=="add",ENV{ID_INPUT_TABLET}="0",ENV{ID_INPUT_JOYSTICK}:="1" ================================================ FILE: packages/sx05re/libretro_base/retroarch/udev.d/99-nintendo-wii-remote.rules ================================================ SUBSYSTEM=="input", ATTRS{name}=="Nintendo Wii Remote", MODE="666", ENV{ID_INPUT_JOYSTICK}="1" SUBSYSTEM=="input", ATTRS{name}=="Nintendo Wii Remote Classic Controller", MODE="666", ENV{ID_INPUT_JOYSTICK}="1" ================================================ FILE: packages/sx05re/libretro_base/retroarch/udev.d/99-ninteno-wii-remote.rules ================================================ SUBSYSTEM=="input", ATTRS{name}=="Nintendo Wii Remote", MODE="666", ENV{ID_INPUT_JOYSTICK}="1" SUBSYSTEM=="input", ATTRS{name}=="Nintendo Wii Remote Classic Controller", MODE="666", ENV{ID_INPUT_JOYSTICK}="1" ================================================ FILE: packages/sx05re/libretro_base/retroarch/udev.d/99-nv-shield-controller.rules ================================================ SUBSYSTEM=="input", ATTRS{idVendor}=="0955", ATTRS{idProduct}=="7210", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1", ENV{ID_INPUT_MOUSE}="" ================================================ FILE: packages/sx05re/libretro_base/retroarch/udev.d/99-ouya-controller.rules ================================================ SUBSYSTEM=="input", ATTRS{name}=="OUYA Game Controller", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1", ENV{ID_INPUT_MOUSE}="" ================================================ FILE: packages/sx05re/libretro_base/retroarch/udev.d/99-terios-t3.rules ================================================ # Needed for device Terios T3 (1949:0402) SUBSYSTEM=="input", ATTRS{name}=="Gamepad", KERNEL=="event*", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" ================================================ FILE: packages/sx05re/libretro_base/retroarch-assets/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="retroarch-assets" #PKG_VERSION="fb39cdde6dfaea2c98218d28c71b14afc632fa03" #PKG_SHA256="7be775fa493185d4f23725e2a550f6b8115e1f6544c56f82729469d97e13f9e5" PKG_VERSION="2d24ef2972a709f870cc3f73853158fa2376f37d" PKG_SHA256="91acc898158d2ab25d83501509bf5c26e795c0f56cfdd1eb97ac1a05211463a1" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libretro/retroarch-assets" PKG_URL="https://github.com/libretro/retroarch-assets/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="RetroArch assets. Background and icon themes for the menu drivers." PKG_TOOLCHAIN="manual" pre_configure_target() { cd ../ rm -rf .${TARGET_NAME} } makeinstall_target() { make install INSTALLDIR="${INSTALL}/usr/share/retroarch-assets" # Remove unnecesary Retroarch Assets for i in Automatic branding cfg devtools FlatUX glui nxrgui pkg/wiiu scripts Systematic switch wallpapers COPYING; do rm -rf "${INSTALL}/usr/share/retroarch-assets/${i}" done for i in automatic dot-art flatui neoactive pixel retroactive retrosystem systematic convert.sh NPMApng2PMApng.py; do rm -rf "${INSTALL}/usr/share/retroarch-assets/xmb/${i}" done } ================================================ FILE: packages/sx05re/libretro_base/retroarch-overlays/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="retroarch-overlays" #PKG_VERSION="8f48a907245babdd7f367afffaec85d330cdbe88" #PKG_SHA256="66bf3e0a0498d214cb3997e557bf4801f73b5da75d5fe21fbeb424f8df0566e0" PKG_VERSION="b8f4b3205414486793a82ce27101b850d6c7e5a0" PKG_SHA256="00000cac463a26ee0a2cf3892cf1af0d6cf322b01992740de889bdc2315a7808" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libretro/common-overlays" PKG_URL="https://github.com/libretro/common-overlays/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Collection of overlay files for use with libretro frontends, such as RetroArch." PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/share/retroarch-overlays rm -rf ${PKG_BUILD}/gamepads rm -rf ${PKG_BUILD}/misc rm -rf ${PKG_BUILD}/ipad rm -rf ${PKG_BUILD}/keyboards cp -r ${PKG_BUILD}/* ${INSTALL}/usr/share/retroarch-overlays } ================================================ FILE: packages/sx05re/libretro_base/wii-u-gc-adapter/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="wii-u-gc-adapter" PKG_VERSION="fa098efa7f6b34f8cd82e2c249c81c629901976c" PKG_SHA256="b8ef28ec9cdab69805b709423678dcd8f44da883a9c3b37e154967af8fb0ea5d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" PKG_SITE="https://github.com/ToadKing/wii-u-gc-adapter" PKG_URL="https://github.com/ToadKing/wii-u-gc-adapter/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="" PKG_SHORTDESC="Tool for using the Wii U GameCube Adapter on Linux" PKG_LONGDESC="Tool for using the Wii U GameCube Adapter on Linux" PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp wii-u-gc-adapter ${INSTALL}/usr/bin/ } ================================================ FILE: packages/sx05re/libretro_base/wii-u-gc-adapter/system.d/wii-u-gc-adapter.service ================================================ [Unit] Description=Wii U GC Adapter [Service] TimeoutStartSec=infinity ExecStart=/usr/bin/wii-u-gc-adapter [Install] WantedBy=retroarch.target ================================================ FILE: packages/sx05re/tools/32bit/emuelec-32bit-info/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="emuelec-32bit-info" PKG_VERSION="1" PKG_ARCH="aarch64" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/emuelec/emuelec-32bit-libs" PKG_URL="" PKG_DEPENDS_TARGET="lib32-retroarch" PKG_LONGDESC="EmuELEC 32-bit infos, stolen from emuelec-32bit-libs, since I don't want to break that package" PKG_TOOLCHAIN="manual" unpack() { : } make_target() { : } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp $(get_pkg_directory emuelec-32bit-libs)/infos/*.info ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/tools/32bit/emuelec-32bit-libs/infos/flycast_32b_libretro.info ================================================ # Software Information display_name = "Sega - Dreamcast/NAOMI (Flycast 32Bit)" authors = "flyinghead" supported_extensions = "chd|cdi|elf|bin|cue|gdi|lst|zip|dat|7z|m3u" corename = "Flycast 32Bit" license = "GPLv2" permissions = "" categories = "Emulator" display_version = "Git" # Hardware Information manufacturer = "Sega" systemname = "Sega Dreamcast" systemid = "dreamcast" # Libretro Features database = "Sega - Dreamcast|Sega - NAOMI" supports_no_game = "false" savestate = "true" savestate_features = "basic" # BIOS / Firmware firmware_count = 7 firmware0_desc = "dc/dc_boot.bin (Dreamcast BIOS)" firmware0_path = "dc/dc_boot.bin" firmware0_opt = "true" firmware1_desc = "dc/naomi.zip (Naomi Bios from MAME)" firmware1_path = "dc/naomi.zip" firmware1_opt = "true" firmware2_desc = "dc/hod2bios.zip (Naomi The House of the Dead 2 Bios from MAME)" firmware2_path = "dc/hod2bios.zip" firmware2_opt = "true" firmware3_desc = "dc/f355dlx.zip (Naomi Ferrari F355 Challenge deluxe Bios from MAME)" firmware3_path = "dc/f355dlx.zip" firmware3_opt = "true" firmware4_desc = "dc/f355bios.zip (Naomi Ferrari F355 Challenge twin/deluxe Bios from MAME)" firmware4_path = "dc/f355bios.zip" firmware4_opt = "true" firmware5_desc = "dc/airlbios.zip (Naomi Airline Pilots deluxe Bios from MAME)" firmware5_path = "dc/airlbios.zip" firmware5_opt = "true" firmware6_desc = "dc/awbios.zip (Atomiswave BIOS from MAME)" firmware6_path = "dc/awbios.zip" firmware6_opt = "true" notes = "(!) dc_boot.bin (md5): e10c53c2f8b90bab96ead2d368858623" hw_render = "true" required_hw_api = "OpenGL >= 3.0 | OpenGL Core >= 3.1 | OpenGL ES >= 2.0 | Vulkan >= 1.1" description = "A port of the Flycast Dreamcast emulator to libretro. In addition to Dreamcast, the core also supports the NAOMI and Atomiswave arcade platforms (with appropriate BIOS images) and will load these games from the latest MAME ROMset. This version of the core uses advanced graphics API features, so anyone using an older, limited GPU may need to use the GLES2 version if this one is incompatible with their hardware." ================================================ FILE: packages/sx05re/tools/32bit/emuelec-32bit-libs/infos/mupen64plus_32b_libretro.info ================================================ # Software Information display_name = "Nintendo - Nintendo 64 (Mupen64Plus 32Bit)" authors = "m4xw|Hacktarux|gonetz|GLideN64 Contributors|Mupen64Plus Team" supported_extensions = "n64|v64|z64|bin|u1" corename = "Mupen64Plus 32Bit" license = "GPLv2" permissions = "dynarec_optional" display_version = "1.0" categories = "Emulator" # Hardware Information manufacturer = "Nintendo" systemname = "Nintendo 64" systemid = "nintendo_64" # Libretro Features supports_no_game = "false" database = "Nintendo - Nintendo 64" hw_render = "true" required_hw_api = "OpenGL Core >= 3.3 | OpenGL ES >= 2.0" savestate = "true" savestate_features = "serialized" cheats = "true" input_descriptors = "true" memory_descriptors = "true" libretro_saves = "true" core_options = "true" load_subsystem = "true" needs_fullpath = "false" disk_control = "false" is_experimental = "false" description = "An up-to-date port of the Mupen64Plus N64 emulator, ported to libretro. It uses up-to-date GLideN64 plugin as its default graphics plug, though the high-accuracy Angrylion and ParaLLEl-RDP plugins are also available. This core is a good first choice for most users and should generally work better than the ParaLLEl-N64 core, which is mainly useful for its support for legacy graphics plugins that can run on older/low-power devices that are too weak for the modern plugins." ================================================ FILE: packages/sx05re/tools/32bit/emuelec-32bit-libs/infos/mupen64plus_next_alt_libretro.info ================================================ # Software Information display_name = "Nintendo - Nintendo 64 (Mupen64Plus-Next-Alt)" authors = "m4xw|Hacktarux|gonetz|GLideN64 Contributors|Mupen64Plus Team" supported_extensions = "n64|v64|z64|bin|u1" corename = "Mupen64Plus-Next-Alt" license = "GPLv2" permissions = "dynarec_optional" display_version = "1.0" categories = "Emulator" # Hardware Information manufacturer = "Nintendo" systemname = "Nintendo 64" systemid = "nintendo_64" # Libretro Features supports_no_game = "false" database = "Nintendo - Nintendo 64" hw_render = "true" required_hw_api = "OpenGL Core >= 3.3 | OpenGL ES >= 2.0" savestate = "true" savestate_features = "serialized" cheats = "true" input_descriptors = "true" memory_descriptors = "true" libretro_saves = "true" core_options = "true" load_subsystem = "true" needs_fullpath = "false" disk_control = "false" is_experimental = "false" description = "An up-to-date port of the Mupen64Plus N64 emulator, ported to libretro. It uses up-to-date GLideN64 plugin as its default graphics plug, though the high-accuracy Angrylion and ParaLLEl-RDP plugins are also available. This core is a good first choice for most users and should generally work better than the ParaLLEl-N64 core, which is mainly useful for its support for legacy graphics plugins that can run on older/low-power devices that are too weak for the modern plugins." ================================================ FILE: packages/sx05re/tools/32bit/emuelec-32bit-libs/infos/pcsx_rearmed_32b_libretro.info ================================================ display_name = "Sony - PlayStation (PCSX ReARMed 32Bit)" authors = "PCSX Team|notaz|Exophase" supported_extensions = "bin|cue|img|mdf|pbp|toc|cbn|m3u|ccd|chd" corename = "PCSX-ReARMed 32Bit" license = "GPLv2" permissions = "dynarec" display_version = "r21" categories = "Emulator" # Hardware Information manufacturer = "Sony" systemname = "PlayStation" systemid = "playstation" # Libretro Features database = "Sony - PlayStation" supports_no_game = "false" savestate = "true" savestate_features = "serialized" cheats = "true" input_descriptors = "true" memory_descriptors = "true" libretro_saves = "true" core_options = "true" load_subsystem = "false" hw_render = "false" needs_fullpath = "true" disk_control = "true" is_experimental = "false" # Firmware / BIOS firmware_count = 3 firmware0_desc = "scph5500.bin (PS1 JP BIOS)" firmware0_path = "scph5500.bin" firmware0_opt = "true" firmware1_desc = "scph5501.bin (PS1 US BIOS)" firmware1_path = "scph5501.bin" firmware1_opt = "true" firmware2_desc = "scph5502.bin (PS1 EU BIOS)" firmware2_path = "scph5502.bin" firmware2_opt = "true" notes = "(!) scph5500.bin (md5): 8dd7d5296a650fac7319bce665a6a53c|(!) scph5501.bin (md5): 490f666e1afb15b7362b406ed1cea246|(!) scph5502.bin (md5): 32736f17079d0b2b7024407c39bd3050" description = "A port of the PCSX-ReARMed fork to libretro. This emulator is a technical marvel and runs incredibly well on 32-bit ARM CPUs, though it is also a good choice for other low-powered hardware that cannot run Beetle-PSX/-HW or Swanstation at full speed. However, this core has no support for increased internal resolution, texture filtering, etc., so users who want those features would be better served by the other cores." ================================================ FILE: packages/sx05re/tools/32bit/emuelec-32bit-libs/infos/uae4arm_32b_libretro.info ================================================ # Software Information display_name = "Commodore - Amiga (UAE4ARM 32Bit)" categories = "Emulator" authors = "TomB/Chips-fr" supported_extensions = "adf|dms|ipf|adz|wrp|zip|uae|lha|cue|ccd|iso|hdf" corename = "UAE4ARM 32Bit" categories = "Emulator" license = "GPLv2" permissions = "" display_version = "v0.5" # Hardware Information manufacturer = "Commodore" systemname = "Amiga" systemid = "commodore_amiga" # Libretro Features supports_no_game = "false" savestate = "true" savestate_features = "serialized" # Firmware / BIOS firmware_count = 6 firmware0_desc = "kick34005.A500 (Amiga 500 BIOS, Kickstart v1.3 Rev. 34.005)" firmware0_path = "kick34005.A500" firmware0_opt = "false" firmware1_desc = "kick40063.A600 (Amiga 600 BIOS, Kickstart v3.1 Rev. 40.063)" firmware1_path = "kick40063.A600" firmware1_opt = "false" firmware2_desc = "kick40068.A1200 (Amiga 1200 BIOS, Kickstart v3.1 Rev. 40.068)" firmware2_path = "kick40068.A1200" firmware2_opt = "false" firmware3_desc = "kick34005.CDTV (Amiga CDTV extended ROM v1.00 Rev. 34.005)" firmware3_path = "kick34005.CDTV" firmware3_opt = "false" firmware4_desc = "kick40060.CD32 (Amiga CD32 BIOS, Kickstart v3.1 Rev. 40.060)" firmware4_path = "kick40060.CD32" firmware4_opt = "false" firmware5_desc = "kick40060.CD32.ext (Amiga CD32 Extended BIOS, CD32 Extended ROM Rev. 40.060)" firmware5_path = "kick40060.CD32.ext" firmware5_opt = "false" description = "An old fork of the uae4arm Amiga emulator, ported to libretro. This core is intended only for use on very weak, low-powered hardware and should only be used in cases where the P-UAE core is not available or cannot maintain full speed." ================================================ FILE: packages/sx05re/tools/32bit/emuelec-32bit-libs/infos/vice_x64dtv_libretro.info ================================================ # Software Information display_name = "Commodore - C64 (VICE x64dtv, fast)" categories = "Emulator" authors = "VICE Team" corename = "VICE x64dtv" supported_extensions = "d64|d71|d80|d81|d82|g64|g41|x64|t64|tap|prg|p00|crt|bin|zip|gz|d6z|d7z|d8z|g6z|g4z|x6z|cmd|m3u|vfl|vsf|nib|nbz|d2m|d4m" license = "GPLv2" permissions = "" display_version = "3.5" # Hardware Information manufacturer = "Commodore" systemname = "C64" systemid = "commodore_c64" # Libretro Features database = "Commodore - 64" supports_no_game = "true" savestate = "true" savestate_features = "serialized" # Firmware firmware_count = 4 firmware0_desc = "vice/JiffyDOS_C64.bin (JiffyDOS C64 Kernal)" firmware0_path = "vice/JiffyDOS_C64.bin" firmware0_opt = "true" firmware1_desc = "vice/JiffyDOS_1541-II.bin (JiffyDOS 1541 drive BIOS)" firmware1_path = "vice/JiffyDOS_1541-II.bin" firmware1_opt = "true" firmware2_desc = "vice/JiffyDOS_1571_repl310654.bin (JiffyDOS 1571 drive BIOS)" firmware2_path = "vice/JiffyDOS_1571_repl310654.bin" firmware2_opt = "true" firmware3_desc = "vice/JiffyDOS_1581.bin (JiffyDOS 1581 drive BIOS)" firmware3_path = "vice/JiffyDOS_1581.bin" firmware3_opt = "true" notes = "(!) JiffyDOS_C64.bin (md5): be09394f0576cf81fa8bacf634daf9a2|(!) JiffyDOS_1541-II.bin (md5): 1b1e985ea5325a1f46eb7fd9681707bf|(!) JiffyDOS_1571_repl310654.bin (md5): 41c6cc528e9515ffd0ed9b180f8467c0|(!) JiffyDOS_1581.bin (md5): 20b6885c6dc2d42c38754a365b043d71" description = "The VICE x64 (fast) Commodore 64 emulator, isolated and ported to libretro. This core features a fairly complete emulation of the VIC-II video chip, with all sprites, registers and video modes emulated in a fully cycle-accurate manner. However, the 'x64sc' core's VIC-II emulation is both cycle-based and pixel-accurate, making it a better choice for devices powerful enough to run it. Both cores include options to switch between the original 'fastSID' sound chip emulation and the slower but much more accurate 'reSID' module." ================================================ FILE: packages/sx05re/tools/32bit/emuelec-32bit-libs/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="emuelec-32bit-libs" PKG_VERSION="8e53ca0df4de3a86f9c7d04952b41f25d3396932" PKG_SHA256="1a273909baaf10d5abf28dc18bf60d63662113c66d9d6d316ae463253c5c7e8c" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/emuelec/emuelec-32bit-libs" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ${OPENGLES}" PKG_LONGDESC="EmuELEC 32-bit libraries, binaries and cores to use with EmuELEC aarch64" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL} if [[ "${DEVICE}" == "OdroidGoAdvance" ]] || [[ "${DEVICE}" == "GameForce" ]]; then cp -rf ${PKG_BUILD}/OdroidGoAdvance/* ${INSTALL}/ if [[ "${DEVICE}" == "GameForce" ]]; then cp -rf ${PKG_BUILD}/GameForce/* ${INSTALL}/ fi cp -rf --remove-destination "$(get_build_dir mali-bifrost)/libmali.so_rk3326_gbm_arm32_r13p0_with_vulkan_and_cl" ${INSTALL}/usr/config/emuelec/lib32/libMali.so elif [[ "${DEVICE}" == "Amlogic-ng" ]]; then cp -rf ${PKG_BUILD}/Amlogic-ng/* ${INSTALL}/ cp -p "$(get_build_dir opengl-meson)/lib/eabihf/gondul/r12p0/fbdev/libMali.so" ${INSTALL}/usr/config/emuelec/lib32/libMali.gondul.so cp -p "$(get_build_dir opengl-meson)/lib/eabihf/dvalin/r12p0/fbdev/libMali.so" ${INSTALL}/usr/config/emuelec/lib32/libMali.dvalin.so cp -p "$(get_build_dir opengl-meson)/lib/eabihf/m450/r7p0/fbdev/libMali.so" ${INSTALL}/usr/config/emuelec/lib32/libMali.m450.so elif [[ "${DEVICE}" == "Amlogic-no" ]]; then cp -rf ${PKG_BUILD}/Amlogic-no/* ${INSTALL}/ cp -p "$(get_build_dir opengl-meson)/lib/eabihf/gondul/r37p0/fbdev/libMali_r1p0.so" ${INSTALL}/usr/config/emuelec/lib32/libMali.gondul.so cp -p "$(get_build_dir opengl-meson)/lib/eabihf/dvalin/r37p0/fbdev/libMali.so" ${INSTALL}/usr/config/emuelec/lib32/libMali.dvalin.so cp -p "$(get_build_dir opengl-meson)/lib/eabihf/valhall/r41p0/fbdev/libMali.so" ${INSTALL}/usr/config/emuelec/lib32/libMali.valhall.so elif [[ "${DEVICE}" == "Amlogic-old" ]]; then cp -rf ${PKG_BUILD}/Amlogic-old/* ${INSTALL}/ cp -p "$(get_build_dir opengl-meson)/lib/eabihf/m450/r7p0/fbdev/libMali.so" ${INSTALL}/usr/config/emuelec/lib32/libMali.m450.so elif [[ "${DEVICE}" == "RK356x" ]] || [[ "${DEVICE}" == "OdroidM1" ]]; then cp -rf ${PKG_BUILD}/RK356x/* ${INSTALL}/ cp -rfp --remove-destination "$(get_build_dir mali-bifrost)/lib/arm-linux-gnueabihf/libmali-bifrost-g52-g2p0-gbm.so" ${INSTALL}/usr/config/emuelec/lib32/libMali.so fi mkdir -p ${INSTALL}/usr/lib ln -sf /emuelec/lib32 ${INSTALL}/usr/lib/arm-linux-gnueabihf ln -sf /emuelec/lib32/ld-linux-armhf.so.3 ${INSTALL}/usr/lib/ld-linux-armhf.so.3 mkdir -p ${INSTALL}/usr/lib/libretro cp ${PKG_DIR}/infos/*.info ${INSTALL}/usr/lib/libretro/ } ================================================ FILE: packages/sx05re/tools/SDL/SDL_net/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # # OpenELEC is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # OpenELEC is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC. If not, see . ################################################################################ PKG_NAME="SDL_net" PKG_VERSION="1.2.8" PKG_SHA256="5f4a7a8bb884f793c278ac3f3713be41980c5eedccecff0260411347714facb4" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://www.libsdl.org/" PKG_URL="https://www.libsdl.org/projects/SDL_net/release/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain yasm:host alsa-lib systemd dbus sdl12-compat sdl12-compat:host" PKG_DEPENDS_HOST="sdl12-compat:host" PKG_SECTION="multimedia" PKG_SHORTDESC="This is a small sample cross-platform networking library, with a sample chat client and server application." PKG_LONGDESC="This is a small sample cross-platform networking library, with a sample chat client and server application." PKG_IS_ADDON="no" PKG_USE_CMAKE="no" PKG_AUTORECONF="no" ================================================ FILE: packages/sx05re/tools/SDL2/SDL2_gfx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="SDL2_gfx" PKG_VERSION="29927b386a32ffda432a7058e831b3da62e3d1f9" PKG_SHA256="812fe76eec07c2b0b9f2cc3a9393d6b3ddb2a243d8f2c45a227da2adef532b63" PKG_LICENSE="GPL" PKG_SITE="https://github.com/jjYBdx4IL/SDL2_gfx" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_LONGDESC="SDL_image is an image file loading library. " PKG_TOOLCHAIN="configure" pre_configure_target() { export CC=${CC} } PKG_CONFIGURE_OPTS_TARGET=" --disable-mmx" ================================================ FILE: packages/sx05re/tools/SDL2/SDL2_image/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 0riginally created by Escalade (https://github.com/escalade) # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) PKG_NAME="SDL2_image" PKG_VERSION="2.8.2" PKG_LICENSE="GPL" PKG_SITE="http://www.libsdl.org/" PKG_URL="https://www.libsdl.org/projects/SDL_image/release/SDL2_image-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2 libjpeg-turbo libwebp" PKG_LONGDESC="SDL_image is an image file loading library. " PKG_TOOLCHAIN="cmake-make" PKG_CMAKE_OPTS_TARGET=" -DSDL2IMAGE_WEBP=ON" ================================================ FILE: packages/sx05re/tools/SDL2/SDL2_mixer/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Team CoreELEC (https://coreelec.org) PKG_NAME="SDL2_mixer" PKG_VERSION="d79638a1b6ff6563a82b57732ce05ca27cc54338" PKG_GIT_CLONE_BRANCH="SDL2" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/libsdl-org/SDL_mixer" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain alsa-lib SDL2 mpg123-compat libvorbis libvorbisidec libogg opusfile libmodplug flac" PKG_LONGDESC="An audio mixer that supports various file formats for Simple Directmedia Layer. " PKG_DEPENDS_HOST="toolchain:host SDL2:host" pre_configure_host() { PKG_CMAKE_OPTS_HOST="-DSDL2MIXER_OPUS=OFF \ -DSDL2MIXER_MOD=OFF \ -DSDL2MIXER_MP3=OFF \ -DSDL2MIXER_FLAC=OFF \ -DSDL2MIXER_MIDI=OFF \ -DSDL2MIXER_VORBIS=OFF \ -DSDL2MIXER_OGG=OFF \ -DSDL2MIXER_MOD_XMP=OFF \ -DSDL2MIXER_WAVPACK=OFF" } pre_configure_target() { PKG_CMAKE_OPTS_TARGET="-DSDL2MIXER_MIDI_FLUIDSYNTH=OFF \ -DSDL2MIXER_FLAC=ON \ -DSDL2MIXER_MOD_MODPLUG=ON \ -DSDL2MIXER_VORBIS_TREMOR=ON \ -DSDL2MIXER_OGG=ON \ -DSDL2MIXER_MP3=ON \ -DSDL2MIXER_SAMPLES=OFF \ -DSDL2MIXER_MOD_MODPLUG_SHARED=OFF \ -DSDL2MIXER_MOD_XMP=OFF \ -DSDL2MIXER_WAVPACK=OFF" } ================================================ FILE: packages/sx05re/tools/SDL2/SDL2_net/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 0riginally created by Escalade (https://github.com/escalade) # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) PKG_NAME="SDL2_net" PKG_VERSION="2.0.1" PKG_SHA256="15ce8a7e5a23dafe8177c8df6e6c79b6749a03fff1e8196742d3571657609d21" PKG_LICENSE="GPL" PKG_SITE="https://www.libsdl.org/projects/SDL_net/" PKG_URL="https://www.libsdl.org/projects/SDL_net/release/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_LONGDESC="SDL2_net: network library" PKG_DEPENDS_HOST="SDL2:host toolchain:host" ================================================ FILE: packages/sx05re/tools/SDL2/SDL2_ttf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 0riginally created by Escalade (https://github.com/escalade) # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) PKG_NAME="SDL2_ttf" PKG_VERSION="2.0.18" PKG_SHA256="7234eb8883514e019e7747c703e4a774575b18d435c22a4a29d068cb768a2251" PKG_LICENSE="GPL" PKG_SITE="http://www.libsdl.org/" PKG_URL="https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2 freetype" PKG_LONGDESC="This is a sample library which allows you to use TrueType fonts in your SDL applications" if [ ! "${DISPLAYSERVER}" = "x11" ]; then X11="--without-x" fi PKG_CONFIGURE_OPTS_TARGET="--with-freetype-prefix=${SYSROOT_PREFIX}/usr ${X11}" ================================================ FILE: packages/sx05re/tools/SDL2/SDL2_ttf/patches/SDL2_ttf-001-opengl-only-with-x.patch ================================================ --- a/configure 2023-09-23 21:31:10.041141600 +0200 +++ b/configure 2023-09-23 21:32:57.917914080 +0200 @@ -19383,48 +19383,10 @@ SYS_GL_LIBS="$X_LIBS -lGL" else SYS_GL_LIBS="-lGL" + SYS_GL_LIBS="$X_LIBS -lGL -DHAVE_OPENGL" fi ;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenGL support" >&5 -$as_echo_n "checking for OpenGL support... " >&6; } -have_opengl=no -save_LIBS="$LIBS" -LIBS="$LIBS $SYS_GL_LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #include "SDL_opengl.h" - -int -main () -{ - - glOrtho( -2.0, 2.0, -2.0, 2.0, -20.0, 20.0 ); - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - have_opengl=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_opengl" >&5 -$as_echo "$have_opengl" >&6; } -LIBS="$save_LIBS" -if test x$have_opengl = xyes; then - CFLAGS="$CFLAGS -DHAVE_OPENGL" - GL_LIBS="$SYS_GL_LIBS" -else - GL_LIBS="" -fi - - - - - # Finally create all the generated files ac_config_files="$ac_config_files Makefile SDL2_ttf.spec SDL2_ttf.pc" ================================================ FILE: packages/sx05re/tools/SDL2/SDL_sound/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 0riginally created by Escalade (https://github.com/escalade) # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) PKG_NAME="SDL_sound" PKG_VERSION="4a8ecd77446d8653c99a673e7896f70a4489b1bb" PKG_SHA256="aac0b9a1058fa99e7886c2639bd115c6cd40b3828a438abdfd4744af9d88cdb5" PKG_LICENSE="GPLv3" PKG_SITE="https://www.icculus.org/SDL_sound/" PKG_URL="https://github.com/icculus/SDL_sound/archive/${PKG_VERSION}.zip" PKG_DEPENDS_TARGET="toolchain alsa-lib SDL2" PKG_LONGDESC="SDL_sound library" PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--prefix=/usr \ --disable-speex \ --disable-physfs \ ac_cv_path_SDL2_CONFIG=${SYSROOT_PREFIX}/usr/bin/sdl2-config" post_unpack() { touch ${PKG_BUILD}/README } pre_configure_target() { export LDFLAGS="${LDFLAGS} -lm" } post_makeinstall_target() { ln -sf ${PKG_ORIG_SYSROOT_PREFIX:-${SYSROOT_PREFIX}}/usr/include/SDL/SDL_sound.h ${PKG_ORIG_SYSROOT_PREFIX:-${SYSROOT_PREFIX}}/usr/include/SDL2/SDL_sound.h } ================================================ FILE: packages/sx05re/tools/btop/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2025-present Team CoreELEC (https://coreelec.org) PKG_NAME="btop" PKG_VERSION="1.4.0" PKG_SHA256="ac0d2371bf69d5136de7e9470c6fb286cbee2e16b4c7a6d2cd48a14796e86650" PKG_LICENSE="Apache-2.0" PKG_SITE="https://github.com/aristocratos/btop" PKG_URL="https://github.com/aristocratos/btop/archive/refs/tags/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="btop resource monitor" PKG_TOOLCHAIN="auto" post_makeinstall_target() { mkdir -p ${INSTALL}/usr/config/btop/ cat >${INSTALL}/usr/config/btop/btop.conf <"${QMAKE_CONF_DIR}/qmake.conf" <"${QMAKE_CONF_DIR}/qplatformdefs.h" < #include #include +#include +#include #if defined(QT_COMPILER_SUPPORTS_F16C) && defined(__AVX2__) && !defined(__F16C__) // All processors that support AVX2 do support F16C too. That doesn't mean --- a/qtbase/src/corelib/text/qbytearraymatcher.h +++ b/qtbase/src/corelib/text/qbytearraymatcher.h @@ -41,7 +41,8 @@ #define QBYTEARRAYMATCHER_H #include - +#include +#include QT_BEGIN_NAMESPACE ================================================ FILE: packages/sx05re/tools/scrapers/Skyscraper/config/artwork.xml ================================================ ================================================ FILE: packages/sx05re/tools/scrapers/Skyscraper/config/config.ini ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) [main] inputFolder="/storage/roms" gamelistFolder="/storage/roms" videos="true" symlink="false" brackets="true" maxLength="10000" unattend="true" verbosity="0" hints="false" # List of supported languages https://github.com/muldjord/skyscraper/blob/master/docs/LANGUAGES.md # List of supported regions https://github.com/muldjord/skyscraper/blob/master/docs/REGIONS.md lang="en" langPrios="en,es,ja,de,fr,it" region="us" regionPrios="us,es,jp,eu,de,fr,it,wor" [screenscraper] userCreds="Username:Pass" ================================================ FILE: packages/sx05re/tools/scrapers/Skyscraper/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present CoreELEC (https://coreelec.org) PKG_NAME="Skyscraper" PKG_VERSION="03d8d657d1ea3dfc5d3b1047922b76971bdf5ff5" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/muldjord/skyscraper" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain qt-everywhere p7zip:host" PKG_PRIORITY="optional" PKG_SECTION="emuelec" PKG_SHORTDESC="Powerful and versatile game scraper written in c++ " PKG_TOOLCHAIN="make" PKG_IS_ADDON="no" PKG_AUTORECONF="no" GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="make" configure_target() { # Fix install paths / 5schatten sed -e "s#target.path=/usr/local/bin#target.path=${INSTALL}/usr/bin#" -i ${PKG_BUILD}/skyscraper.pro sed -e "s#examples.path=/usr/local/etc/skyscraper#examples.path=${INSTALL}/usr/share/skyscraper#" -i ${PKG_BUILD}/skyscraper.pro sed -e "s#cacheexamples.path=/usr/local/etc/skyscraper/cache#cacheexamples.path=${INSTALL}/usr/share/skyscraper/cache#" -i ${PKG_BUILD}/skyscraper.pro sed -e "s#impexamples.path=/usr/local/etc/skyscraper/import#impexamples.path=${INSTALL}/usr/share/skyscraper/import#" -i ${PKG_BUILD}/skyscraper.pro sed -e "s#resexamples.path=/usr/local/etc/skyscraper/resources#resexamples.path=${INSTALL}/usr/share/skyscraper/resources#" -i ${PKG_BUILD}/skyscraper.pro rm -rf .qmake.stash QMAKEPATH="$(get_build_dir qt-everywhere)/qtbase/bin/qmake" ${QMAKEPATH} ${PKG_BUILD}/skyscraper.pro } post_makeinstall_target() { # Install scripts cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin/ # Install config mkdir -p ${INSTALL}/usr/config/skyscraper cp ${PKG_DIR}/config/* ${INSTALL}/usr/config/skyscraper/ } ================================================ FILE: packages/sx05re/tools/scrapers/Skyscraper/scripts/skyscraper ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) . /etc/profile # Set common paths SKYSCRAPER_HOME_CONFIG=/storage/.config/skyscraper SKYSCRAPER_HOME=/storage/.skyscraper # create link to config directory if [ ! -L ${SKYSCRAPER_HOME} ]; then cp -r ${SKYSCRAPER_HOME}/* ${SKYSCRAPER_HOME_CONFIG}/ rm -rf ${SKYSCRAPER_HOME} ln -s ${SKYSCRAPER_HOME_CONFIG} ${SKYSCRAPER_HOME} fi Skyscraper "$@" ================================================ FILE: packages/sx05re/tools/sdl12-compat/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="sdl12-compat" PKG_VERSION="189f8f0741efdb7d6ff8308f64e5f23365d97a94" PKG_SHA256="f2c8f8e364999f9284090d4a23276a2e927a75d89c13917f126710891312f792" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libsdl-org/sdl12-compat" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain alsa-lib systemd dbus SDL2" PKG_DEPENDS_HOST="SDL2:host yasm:host" PKG_SECTION="multimedia" PKG_SHORTDESC="SDL: A cross-platform Graphic API" PKG_LONGDESC="An SDL-1.2 compatibility layer that uses SDL 2.0 behind the scenes. " pre_configure_target() { PKG_CMAKE_OPTS_TARGET+=" -DSDL12TESTS=off" } pre_configure_host() { PKG_CMAKE_OPTS_HOST+=" -DSDL12TESTS=off" } ================================================ FILE: packages/sx05re/tools/sdl12-compat/patches/fix-pkgconfig.patch ================================================ --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -222,6 +222,10 @@ install(FILES ${CMAKE_BINARY_DIR}/sdl12_compat.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig ) + configure_file(sdl.pc.in sdl.pc @ONLY) + install(FILES ${CMAKE_BINARY_DIR}/sdl.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig + ) configure_file("${CMAKE_SOURCE_DIR}/sdl-config.in" "${CMAKE_BINARY_DIR}/sdl-config" @ONLY) install(PROGRAMS "${CMAKE_BINARY_DIR}/sdl-config" DESTINATION bin) --- +++ b/sdl.pc.in @@ -0,0 +1,14 @@ +# sdl12_compat pkg-config source file + +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ + +Name: sdl12_compat +Description: An SDL-1.2 compatibility layer that uses SDL 2.0 behind the scenes. +Version: @SDL_VERSION@ +Provides: sdl = @SDL_VERSION@ +Libs: -L${libdir} @SDL_RLD_FLAGS@ @SDL_LIBS@ +Libs.private: -L${libdir} @SDL_LIBS@ @SDL_STATIC_LIBS@ +Cflags: -I${includedir}/SDL @SDL_CFLAGS@ ================================================ FILE: packages/sx05re/tools/sdl12-compat/patches/fix-sdlconfig.patch ================================================ --- a/sdl-config.in 2021-06-11 17:12:20.442391000 -0400 +++ b/sdl-config.in 2021-06-11 17:12:32.558391405 -0400 @@ -7,11 +7,11 @@ # Copied and modified from SDL2's sdl2-compat. -prefix=@CMAKE_INSTALL_PREFIX@ +prefix=@CMAKE_SYSROOT@@CMAKE_INSTALL_PREFIX@ exec_prefix=${prefix} exec_prefix_set=no -libdir=@CMAKE_INSTALL_FULL_LIBDIR@ -includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ +libdir=${prefix}/lib +includedir=${prefix}/include @ENABLE_STATIC_FALSE@usage="\ @ENABLE_STATIC_FALSE@Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]" ================================================ FILE: packages/sx05re/tools/sound/espeak/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="espeak" PKG_VERSION="1.48.04-source" PKG_SHA256="bf9a17673adffcc28ff7ea18764f06136547e97bbd9edf2ec612f09b207f0659" PKG_LICENSE="GPL" PKG_SITE="http://espeak.sourceforge.net/" PKG_URL="http://sourceforge.net/projects/espeak/files/espeak/espeak-1.48/$PKG_NAME-$PKG_VERSION.zip" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Text to Speech engine for English, with support for other languages" PKG_TOOLCHAIN="manual" REALSYSROOT=${SYSROOT_PREFIX} pre_make_target() { cp src/portaudio19.h src/portaudio.h } make_target() { make -C src \ CXXFLAGS="$CXXFLAGS" \ LDFLAGS="$LDFLAGS" \ AUDIO="" } makeinstall_target() { make -C src \ CXXFLAGS="$CXXFLAGS" \ LDFLAGS="$LDFLAGS" \ AUDIO="" \ DESTDIR=$INSTALL install } post_makeinstall_target() { mkdir -p ${REALSYSROOT}/usr/include/espeak cp ${INSTALL}/usr/lib/* ${REALSYSROOT}/usr/lib/ cp ${PKG_BUILD}/src/speak_lib.h ${REALSYSROOT}/usr/include/espeak } ================================================ FILE: packages/sx05re/tools/sound/espeak/patches/espeak-1.47-ftbs-ld-libm.patch ================================================ diff --git a/src/Makefile b/src/Makefile index f04b4c4..b8d4b19 100644 --- a/src/Makefile +++ b/src/Makefile @@ -83,15 +83,15 @@ libespeak_SOURCES = speak_lib.cpp compiledict.cpp dictionary.cpp intonation.cpp SRCS1=$(speak_SOURCES) OBJS1=$(patsubst %.cpp,%.o,$(SRCS1)) -LIBS1=-lstdc++ $(LIB_AUDIO) -lpthread $(EXTRA_LIBS) +LIBS1=-lstdc++ -lm $(LIB_AUDIO) -lpthread $(EXTRA_LIBS) SRCS2=$(libespeak_SOURCES) OBJS2=$(patsubst %.cpp,x_%.o,$(SRCS2)) -LIBS2=-lstdc++ $(LIB_AUDIO) -lpthread +LIBS2=-lstdc++ -lm $(LIB_AUDIO) -lpthread SRCS3 = espeak.cpp OBJS3=$(patsubst %.cpp,%.o,$(SRCS3)) -LIBS3=-lstdc++ -L . -lespeak +LIBS3=-lstdc++ -lm -L . -lespeak CXXFLAGS=-O2 ================================================ FILE: packages/sx05re/tools/sound/espeak/patches/espeak-1.47-wav-close.patch ================================================ diff --git a/src/espeak.cpp b/src/espeak.cpp index 00f93c1..4ad42e8 100644 --- a/src/espeak.cpp +++ b/src/espeak.cpp @@ -281,10 +281,7 @@ static int SynthCallback(short *wav, int numsamples, espeak_EVENT *events) if(quiet) return(0); // -q quiet mode if(wav == NULL) - { - CloseWavFile(); return(0); - } while(events->type != 0) { @@ -805,5 +802,7 @@ int main (int argc, char **argv) if(f_phonemes_out != stdout) fclose(f_phonemes_out); // needed for WinCE + CloseWavFile(); + espeak_Terminate(); return(0); } ================================================ FILE: packages/sx05re/tools/sound/espeak/patches/espeak-1.48-gcc-6-fix.patch ================================================ diff --git a/src/tr_languages.cpp b/src/tr_languages.cpp --- a/src/tr_languages.cpp +++ b/src/tr_languages.cpp @@ -198,7 +198,7 @@ static const unsigned short chars_ignore_zwnj_hyphen[] = { 0x200d, 1, // zero width joiner 0, 0 }; -const char string_ordinal[] = {0xc2,0xba,0}; // masculine ordinal character, UTF-8 +const char string_ordinal[] = {'\xc2','\xba',0}; // masculine ordinal character, UTF-8 static Translator* NewTranslator(void) ================================================ FILE: packages/sx05re/tools/sound/fluidsynth-git/config/fluidsynth.conf ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Frank Hartung (supervisedthinking (@) gmail.com) SOUND_FONT=/storage/.config/fluidsynth/soundfonts/GeneralUser.sf2 AUDIO_DRIVER=pulseaudio MIDI_DRIVER=alsa_seq PORT_NAME=FluidSynth OTHER_OPTS='-r 48000' ================================================ FILE: packages/sx05re/tools/sound/fluidsynth-git/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Frank Hartung (supervisedthinking (@) gmail.com) PKG_NAME="fluidsynth-git" PKG_VERSION="2.0.6" PKG_SHA256="e97e63c1045e102465f1aa848f9d712c5528c58685b8d40062e4aaf6af7edb75" PKG_LICENSE="LGPL" PKG_SITE="http://fluidsynth.org/" PKG_URL="https://github.com/FluidSynth/fluidsynth/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain glib soundfont-generaluser" PKG_LONGDESC="FluidSynth is a software real-time synthesizer based on the Soundfont 2 specifications." PKG_BUILD_FLAGS="+pic" pre_configure_target() { PKG_CMAKE_OPTS_TARGET="-DLIB_SUFFIX= \ -Denable-readline=0 \ -Denable-oss=0 \ -Denable-pulseaudio=1 \ -Denable-libsndfile=0" } post_makeinstall_target() { # Create directories mkdir -p ${INSTALL}/etc/fluidsynth mkdir -p ${INSTALL}/usr/config/fluidsynth/soundfonts # Create symlinks & install config file cp -a ${PKG_DIR}/config/* ${INSTALL}/usr/config/fluidsynth/ ln -s /storage/.config/fluidsynth/fluidsynth.conf ${INSTALL}/etc/fluidsynth/ echo "Place your SoundFonts here!" >> ${INSTALL}/usr/config/fluidsynth/soundfonts/readme.txt # Create symlink to SoundFont ln -s /usr/share/soundfonts/GeneralUser.sf2 ${INSTALL}/usr/config/fluidsynth/soundfonts/ } ================================================ FILE: packages/sx05re/tools/sound/fluidsynth-git/system.d/fluidsynth.service ================================================ [Unit] Description=FluidSynth Software Synthesizer Daemon After=sound.target [Service] EnvironmentFile=/etc/fluidsynth/fluidsynth.conf ExecStart=/usr/bin/fluidsynth -is -a $AUDIO_DRIVER -m $MIDI_DRIVER -p $PORT_NAME $OTHER_OPTS $SOUND_FONT [Install] WantedBy=multi-user.target ================================================ FILE: packages/sx05re/tools/sound/libvorbisidec/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="libvorbisidec" PKG_VERSION="a76e41f6ece93d10deac5f9ef3a84dce5b9c2a84" PKG_SHA256="54c4cfaf442885575261d7b310b2dfa79e4fbf095aaf34de07875b024e499991" PKG_LICENSE="GPL" PKG_SITE="https://github.com/sezero/tremor" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libogg freetype" PKG_LONGDESC="libvorbisidec" PKG_TOOLCHAIN="make" make_target() { cd ${PKG_BUILD} ./autogen.sh HAVE_OGG=no --disable-mmx --prefix=/usr --datadir=/usr/share/ --datarootdir=/usr/share/ --host=armv8a-libreelec-linux --enable-fb --enable-freetype --with-freetype-prefix=${SYSROOT_PREFIX}/usr/ --enable-slang make } ================================================ FILE: packages/sx05re/tools/sound/modplug/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="libmodplug" PKG_VERSION="a35e253001b1bc9046b7955d0871f841f88f993b" PKG_ARCH="any" PKG_LICENSE="public domain" PKG_SITE="https://gitlab.com/solarus-games/libmodplug" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_SHORTDESC="Modplug Plugin for XMMS v2.0 / libmodplug v0.8.5" GET_HANDLER_SUPPORT="git" ================================================ FILE: packages/sx05re/tools/sound/mpg123-compat/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) PKG_NAME="mpg123-compat" PKG_VERSION="1.28.2" PKG_SHA256="7eefd4b68fdac7e138d04c37efe12155a8ebf25a5bccf0fb7e775af22d21db00" PKG_LICENSE="LGPLv2" PKG_SITE="http://www.mpg123.org/" PKG_URL="http://downloads.sourceforge.net/sourceforge/mpg123/mpg123-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain alsa-lib SDL2" PKG_LONGDESC="A console based real time MPEG Audio Player for Layer 1, 2 and 3." PKG_BUILD_FLAGS="-fpic" if [ "${PULSEAUDIO_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET="${PKG_DEPENDS_TARGET} pulseaudio" PKG_CONFIGURE_OPTS_TARGET="--with-default-audio=pulse --with-audio=alsa,pulse" else PKG_CONFIGURE_OPTS_TARGET="--with-default-audio=alsa --with-audio=alsa" fi ================================================ FILE: packages/sx05re/tools/sound/opusfile/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="opusfile" PKG_VERSION="58b229a" PKG_REV="1" PKG_ARCH="any" PKG_SITE="https://github.com/xiph/opusfile" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain openssl opus libogg" PKG_PRIORITY="optional" PKG_SHORTDESC="Stand-alone decoder library for .opus streams" GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="configure" pre_configure_target() { ${PKG_BUILD}/autogen.sh } ================================================ FILE: packages/sx05re/tools/sound/soundfont-generaluser/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) PKG_NAME="soundfont-generaluser" PKG_VERSION="1.471" PKG_SHA256="4203835164766f428c4926c097c9ea58dae431c7fb8f9dbe277b92d80da45ec2" PKG_LICENSE="OSS" PKG_SITE="http://www.schristiancollins.com/generaluser.php" PKG_URL="https://www.dropbox.com/s/4x27l49kxcwamp5/GeneralUser_GS_${PKG_VERSION}.zip" PKG_SOURCE_DIR="GeneralUser*" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="GeneralUser GS is a GM and GS compatible SoundFont bank for composing, playing MIDI files, and retro gaming." PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/share/soundfonts cp GeneralUser*${PKG_VERSION}.sf2 ${INSTALL}/usr/share/soundfonts/GeneralUser.sf2 } ================================================ FILE: packages/sx05re/tools/sound/timidity/config/GeneralUser.cfg ================================================ dir /storage/.config/fluidsynth/soundfonts/ bank 0 0 %font "GeneralUser.sf2" 0 0 amp=52 pan=0 1 %font "GeneralUser.sf2" 0 1 amp=84 pan=0 2 %font "GeneralUser.sf2" 0 2 amp=51 pan=0 3 %font "GeneralUser.sf2" 0 3 amp=139 pan=0 4 %font "GeneralUser.sf2" 0 4 amp=79 pan=0 5 %font "GeneralUser.sf2" 0 5 amp=102 pan=0 6 %font "GeneralUser.sf2" 0 6 amp=50 pan=0 7 %font "GeneralUser.sf2" 0 7 amp=103 pan=0 8 %font "GeneralUser.sf2" 0 8 amp=127 pan=0 9 %font "GeneralUser.sf2" 0 9 amp=214 pan=0 10 %font "GeneralUser.sf2" 0 10 amp=207 pan=0 11 %font "GeneralUser.sf2" 0 11 amp=39 pan=0 12 %font "GeneralUser.sf2" 0 12 amp=143 pan=0 13 %font "GeneralUser.sf2" 0 13 amp=101 pan=0 14 %font "GeneralUser.sf2" 0 14 amp=77 pan=0 15 %font "GeneralUser.sf2" 0 15 amp=134 pan=0 16 %font "GeneralUser.sf2" 0 16 amp=119 pan=0 17 %font "GeneralUser.sf2" 0 17 amp=112 pan=0 18 %font "GeneralUser.sf2" 0 18 amp=93 pan=0 19 %font "GeneralUser.sf2" 0 19 amp=201 pan=0 20 %font "GeneralUser.sf2" 0 20 amp=86 pan=0 21 %font "GeneralUser.sf2" 0 21 amp=59 pan=0 22 %font "GeneralUser.sf2" 0 22 amp=51 pan=0 23 %font "GeneralUser.sf2" 0 23 amp=42 pan=0 24 %font "GeneralUser.sf2" 0 24 amp=130 pan=0 25 %font "GeneralUser.sf2" 0 25 amp=65 pan=0 26 %font "GeneralUser.sf2" 0 26 amp=193 pan=0 27 %font "GeneralUser.sf2" 0 27 amp=110 pan=0 28 %font "GeneralUser.sf2" 0 28 amp=187 pan=0 29 %font "GeneralUser.sf2" 0 29 amp=124 pan=0 30 %font "GeneralUser.sf2" 0 30 amp=154 pan=0 31 %font "GeneralUser.sf2" 0 31 amp=94 pan=0 32 %font "GeneralUser.sf2" 0 32 amp=231 pan=0 33 %font "GeneralUser.sf2" 0 33 amp=112 pan=0 34 %font "GeneralUser.sf2" 0 34 amp=441 pan=0 35 %font "GeneralUser.sf2" 0 35 amp=147 pan=0 36 %font "GeneralUser.sf2" 0 36 amp=342 pan=0 37 %font "GeneralUser.sf2" 0 37 amp=110 pan=0 38 %font "GeneralUser.sf2" 0 38 amp=51 pan=0 39 %font "GeneralUser.sf2" 0 39 amp=186 pan=0 40 %font "GeneralUser.sf2" 0 40 amp=115 pan=0 41 %font "GeneralUser.sf2" 0 41 amp=190 pan=0 42 %font "GeneralUser.sf2" 0 42 amp=53 pan=0 43 %font "GeneralUser.sf2" 0 43 amp=89 pan=0 44 %font "GeneralUser.sf2" 0 44 amp=147 pan=0 45 %font "GeneralUser.sf2" 0 45 amp=381 pan=0 46 %font "GeneralUser.sf2" 0 46 amp=160 pan=0 47 %font "GeneralUser.sf2" 0 47 amp=138 pan=0 48 %font "GeneralUser.sf2" 0 48 amp=127 pan=0 49 %font "GeneralUser.sf2" 0 49 amp=127 pan=0 50 %font "GeneralUser.sf2" 0 50 amp=72 pan=0 51 %font "GeneralUser.sf2" 0 51 amp=45 pan=0 52 %font "GeneralUser.sf2" 0 52 amp=64 pan=0 53 %font "GeneralUser.sf2" 0 53 amp=68 pan=0 54 %font "GeneralUser.sf2" 0 54 amp=168 pan=0 55 %font "GeneralUser.sf2" 0 55 amp=102 pan=0 56 %font "GeneralUser.sf2" 0 56 amp=112 pan=0 57 %font "GeneralUser.sf2" 0 57 amp=132 pan=0 58 %font "GeneralUser.sf2" 0 58 amp=107 pan=0 59 %font "GeneralUser.sf2" 0 59 amp=63 pan=0 60 %font "GeneralUser.sf2" 0 60 amp=120 pan=0 61 %font "GeneralUser.sf2" 0 61 amp=168 pan=0 62 %font "GeneralUser.sf2" 0 62 amp=45 pan=0 63 %font "GeneralUser.sf2" 0 63 amp=47 pan=0 64 %font "GeneralUser.sf2" 0 64 amp=90 pan=0 65 %font "GeneralUser.sf2" 0 65 amp=117 pan=0 66 %font "GeneralUser.sf2" 0 66 amp=105 pan=0 67 %font "GeneralUser.sf2" 0 67 amp=73 pan=0 68 %font "GeneralUser.sf2" 0 68 amp=110 pan=0 69 %font "GeneralUser.sf2" 0 69 amp=134 pan=0 70 %font "GeneralUser.sf2" 0 70 amp=92 pan=0 71 %font "GeneralUser.sf2" 0 71 amp=94 pan=0 72 %font "GeneralUser.sf2" 0 72 amp=58 pan=0 73 %font "GeneralUser.sf2" 0 73 amp=144 pan=0 74 %font "GeneralUser.sf2" 0 74 amp=129 pan=0 75 %font "GeneralUser.sf2" 0 75 amp=79 pan=0 76 %font "GeneralUser.sf2" 0 76 amp=87 pan=0 77 %font "GeneralUser.sf2" 0 77 amp=114 pan=0 78 %font "GeneralUser.sf2" 0 78 amp=316 pan=0 79 %font "GeneralUser.sf2" 0 79 amp=164 pan=0 80 %font "GeneralUser.sf2" 0 80 amp=22 pan=0 81 %font "GeneralUser.sf2" 0 81 amp=41 pan=0 82 %font "GeneralUser.sf2" 0 82 amp=55 pan=0 83 %font "GeneralUser.sf2" 0 83 amp=79 pan=0 84 %font "GeneralUser.sf2" 0 84 amp=140 pan=0 85 %font "GeneralUser.sf2" 0 85 amp=79 pan=0 86 %font "GeneralUser.sf2" 0 86 amp=84 pan=0 87 %font "GeneralUser.sf2" 0 87 amp=105 pan=0 88 %font "GeneralUser.sf2" 0 88 amp=165 pan=0 89 %font "GeneralUser.sf2" 0 89 amp=203 pan=0 90 %font "GeneralUser.sf2" 0 90 amp=80 pan=0 91 %font "GeneralUser.sf2" 0 91 amp=88 pan=0 92 %font "GeneralUser.sf2" 0 92 amp=168 pan=0 93 %font "GeneralUser.sf2" 0 93 amp=123 pan=0 94 %font "GeneralUser.sf2" 0 94 amp=69 pan=0 95 %font "GeneralUser.sf2" 0 95 amp=89 pan=0 96 %font "GeneralUser.sf2" 0 96 amp=77 pan=0 97 %font "GeneralUser.sf2" 0 97 amp=78 pan=0 98 %font "GeneralUser.sf2" 0 98 amp=74 pan=0 99 %font "GeneralUser.sf2" 0 99 amp=115 pan=0 100 %font "GeneralUser.sf2" 0 100 amp=109 pan=0 101 %font "GeneralUser.sf2" 0 101 amp=67 pan=0 102 %font "GeneralUser.sf2" 0 102 amp=71 pan=0 103 %font "GeneralUser.sf2" 0 103 amp=99 pan=0 104 %font "GeneralUser.sf2" 0 104 amp=126 pan=0 105 %font "GeneralUser.sf2" 0 105 amp=118 pan=0 106 %font "GeneralUser.sf2" 0 106 amp=185 pan=0 107 %font "GeneralUser.sf2" 0 107 amp=203 pan=0 108 %font "GeneralUser.sf2" 0 108 amp=62 pan=0 109 %font "GeneralUser.sf2" 0 109 amp=72 pan=0 110 %font "GeneralUser.sf2" 0 110 amp=143 pan=0 111 %font "GeneralUser.sf2" 0 111 amp=93 pan=0 112 %font "GeneralUser.sf2" 0 112 amp=126 pan=0 113 %font "GeneralUser.sf2" 0 113 amp=154 pan=0 114 %font "GeneralUser.sf2" 0 114 amp=91 pan=0 115 %font "GeneralUser.sf2" 0 115 amp=119 pan=0 116 %font "GeneralUser.sf2" 0 116 amp=99 pan=0 117 %font "GeneralUser.sf2" 0 117 amp=132 pan=0 118 %font "GeneralUser.sf2" 0 118 amp=125 pan=0 119 %font "GeneralUser.sf2" 0 119 amp=82 pan=0 120 %font "GeneralUser.sf2" 0 120 amp=68 pan=0 121 %font "GeneralUser.sf2" 0 121 amp=77 pan=0 122 %font "GeneralUser.sf2" 0 122 amp=77 pan=0 123 %font "GeneralUser.sf2" 0 123 amp=74 pan=0 124 %font "GeneralUser.sf2" 0 124 amp=57 pan=0 125 %font "GeneralUser.sf2" 0 125 amp=211 pan=0 126 %font "GeneralUser.sf2" 0 126 amp=40 pan=0 127 %font "GeneralUser.sf2" 0 127 amp=149 pan=0 bank 1 38 %font "GeneralUser.sf2" 1 38 amp=103 pan=0 44 %font "GeneralUser.sf2" 1 44 amp=142 pan=0 48 %font "GeneralUser.sf2" 1 48 amp=119 pan=0 49 %font "GeneralUser.sf2" 1 49 amp=108 pan=0 57 %font "GeneralUser.sf2" 1 57 amp=89 pan=0 60 %font "GeneralUser.sf2" 1 60 amp=196 pan=0 80 %font "GeneralUser.sf2" 1 80 amp=31 pan=0 81 %font "GeneralUser.sf2" 1 81 amp=45 pan=0 98 %font "GeneralUser.sf2" 1 98 amp=89 pan=0 120 %font "GeneralUser.sf2" 1 120 amp=28 pan=0 121 %font "GeneralUser.sf2" 1 121 amp=104 pan=0 122 %font "GeneralUser.sf2" 1 122 amp=59 pan=0 123 %font "GeneralUser.sf2" 1 123 amp=50 pan=0 124 %font "GeneralUser.sf2" 1 124 amp=101 pan=0 125 %font "GeneralUser.sf2" 1 125 amp=203 pan=0 126 %font "GeneralUser.sf2" 1 126 amp=207 pan=0 127 %font "GeneralUser.sf2" 1 127 amp=65 pan=0 bank 2 44 %font "GeneralUser.sf2" 2 44 amp=361 pan=0 48 %font "GeneralUser.sf2" 2 48 amp=118 pan=0 49 %font "GeneralUser.sf2" 2 49 amp=195 pan=0 102 %font "GeneralUser.sf2" 2 102 amp=90 pan=0 120 %font "GeneralUser.sf2" 2 120 amp=52 pan=0 122 %font "GeneralUser.sf2" 2 122 amp=85 pan=0 123 %font "GeneralUser.sf2" 2 123 amp=276 pan=0 124 %font "GeneralUser.sf2" 2 124 amp=94 pan=0 125 %font "GeneralUser.sf2" 2 125 amp=38 pan=0 126 %font "GeneralUser.sf2" 2 126 amp=38 pan=0 127 %font "GeneralUser.sf2" 2 127 amp=128 pan=0 bank 3 122 %font "GeneralUser.sf2" 3 122 amp=72 pan=0 123 %font "GeneralUser.sf2" 3 123 amp=45 pan=0 124 %font "GeneralUser.sf2" 3 124 amp=128 pan=0 125 %font "GeneralUser.sf2" 3 125 amp=61 pan=0 126 %font "GeneralUser.sf2" 3 126 amp=83 pan=0 127 %font "GeneralUser.sf2" 3 127 amp=77 pan=0 bank 4 122 %font "GeneralUser.sf2" 4 122 amp=299 pan=0 123 %font "GeneralUser.sf2" 4 123 amp=62 pan=0 125 %font "GeneralUser.sf2" 4 125 amp=73 pan=0 126 %font "GeneralUser.sf2" 4 126 amp=60 pan=0 bank 5 122 %font "GeneralUser.sf2" 5 122 amp=81 pan=0 124 %font "GeneralUser.sf2" 5 124 amp=98 pan=0 125 %font "GeneralUser.sf2" 5 125 amp=58 pan=0 126 %font "GeneralUser.sf2" 5 126 amp=141 pan=0 bank 6 125 %font "GeneralUser.sf2" 6 125 amp=91 pan=0 bank 7 125 %font "GeneralUser.sf2" 7 125 amp=41 pan=0 bank 8 0 %font "GeneralUser.sf2" 8 0 amp=52 pan=0 1 %font "GeneralUser.sf2" 8 1 amp=84 pan=0 2 %font "GeneralUser.sf2" 8 2 amp=51 pan=0 3 %font "GeneralUser.sf2" 8 3 amp=110 pan=0 4 %font "GeneralUser.sf2" 8 4 amp=82 pan=0 5 %font "GeneralUser.sf2" 8 5 amp=52 pan=0 6 %font "GeneralUser.sf2" 8 6 amp=47 pan=0 11 %font "GeneralUser.sf2" 8 11 amp=53 pan=0 12 %font "GeneralUser.sf2" 8 12 amp=143 pan=0 14 %font "GeneralUser.sf2" 8 14 amp=35 pan=0 16 %font "GeneralUser.sf2" 8 16 amp=64 pan=0 17 %font "GeneralUser.sf2" 8 17 amp=100 pan=0 19 %font "GeneralUser.sf2" 8 19 amp=153 pan=0 21 %font "GeneralUser.sf2" 8 21 amp=28 pan=0 24 %font "GeneralUser.sf2" 8 24 amp=117 pan=0 25 %font "GeneralUser.sf2" 8 25 amp=82 pan=0 26 %font "GeneralUser.sf2" 8 26 amp=87 pan=0 27 %font "GeneralUser.sf2" 8 27 amp=57 pan=0 28 %font "GeneralUser.sf2" 8 28 amp=47 pan=0 30 %font "GeneralUser.sf2" 8 30 amp=71 pan=0 31 %font "GeneralUser.sf2" 8 31 amp=100 pan=0 38 %font "GeneralUser.sf2" 8 38 amp=38 pan=0 39 %font "GeneralUser.sf2" 8 39 amp=231 pan=0 40 %font "GeneralUser.sf2" 8 40 amp=112 pan=0 48 %font "GeneralUser.sf2" 8 48 amp=86 pan=0 50 %font "GeneralUser.sf2" 8 50 amp=63 pan=0 61 %font "GeneralUser.sf2" 8 61 amp=93 pan=0 62 %font "GeneralUser.sf2" 8 62 amp=49 pan=0 63 %font "GeneralUser.sf2" 8 63 amp=74 pan=0 80 %font "GeneralUser.sf2" 8 80 amp=86 pan=0 81 %font "GeneralUser.sf2" 8 81 amp=62 pan=0 107 %font "GeneralUser.sf2" 8 107 amp=118 pan=0 115 %font "GeneralUser.sf2" 8 115 amp=149 pan=0 116 %font "GeneralUser.sf2" 8 116 amp=76 pan=0 117 %font "GeneralUser.sf2" 8 117 amp=141 pan=0 118 %font "GeneralUser.sf2" 8 118 amp=167 pan=0 125 %font "GeneralUser.sf2" 8 125 amp=80 pan=0 bank 9 14 %font "GeneralUser.sf2" 9 14 amp=53 pan=0 125 %font "GeneralUser.sf2" 9 125 amp=19 pan=0 bank 11 1 %font "GeneralUser.sf2" 11 1 amp=362 pan=0 4 %font "GeneralUser.sf2" 11 4 amp=143 pan=0 5 %font "GeneralUser.sf2" 11 5 amp=494 pan=0 8 %font "GeneralUser.sf2" 11 8 amp=355 pan=0 14 %font "GeneralUser.sf2" 11 14 amp=376 pan=0 38 %font "GeneralUser.sf2" 11 38 amp=136 pan=0 39 %font "GeneralUser.sf2" 11 39 amp=33 pan=0 50 %font "GeneralUser.sf2" 11 50 amp=73 pan=0 51 %font "GeneralUser.sf2" 11 51 amp=180 pan=0 61 %font "GeneralUser.sf2" 11 61 amp=51 pan=0 78 %font "GeneralUser.sf2" 11 78 amp=40 pan=0 81 %font "GeneralUser.sf2" 11 81 amp=194 pan=0 87 %font "GeneralUser.sf2" 11 87 amp=92 pan=0 88 %font "GeneralUser.sf2" 11 88 amp=317 pan=0 89 %font "GeneralUser.sf2" 11 89 amp=262 pan=0 96 %font "GeneralUser.sf2" 11 96 amp=40 pan=0 98 %font "GeneralUser.sf2" 11 98 amp=93 pan=0 100 %font "GeneralUser.sf2" 11 100 amp=188 pan=0 119 %font "GeneralUser.sf2" 11 119 amp=674 pan=0 121 %font "GeneralUser.sf2" 11 121 amp=71 pan=0 127 %font "GeneralUser.sf2" 11 127 amp=37 pan=0 bank 12 10 %font "GeneralUser.sf2" 12 10 amp=55 pan=0 27 %font "GeneralUser.sf2" 12 27 amp=69 pan=0 38 %font "GeneralUser.sf2" 12 38 amp=34 pan=0 48 %font "GeneralUser.sf2" 12 48 amp=156 pan=0 49 %font "GeneralUser.sf2" 12 49 amp=193 pan=0 80 %font "GeneralUser.sf2" 12 80 amp=13 pan=0 81 %font "GeneralUser.sf2" 12 81 amp=21 pan=0 88 %font "GeneralUser.sf2" 12 88 amp=108 pan=0 89 %font "GeneralUser.sf2" 12 89 amp=64 pan=0 119 %font "GeneralUser.sf2" 12 119 amp=422 pan=0 122 %font "GeneralUser.sf2" 12 122 amp=68 pan=0 127 %font "GeneralUser.sf2" 12 127 amp=185 pan=0 bank 13 88 %font "GeneralUser.sf2" 13 88 amp=128 pan=0 bank 16 0 %font "GeneralUser.sf2" 16 0 amp=118 pan=0 4 %font "GeneralUser.sf2" 16 4 amp=78 pan=0 5 %font "GeneralUser.sf2" 16 5 amp=107 pan=0 6 %font "GeneralUser.sf2" 16 6 amp=50 pan=0 25 %font "GeneralUser.sf2" 16 25 amp=61 pan=0 bank 126 0 %font "GeneralUser.sf2" 0 1 amp=112 pan=0 1 %font "GeneralUser.sf2" 0 1 amp=112 pan=0 2 %font "GeneralUser.sf2" 0 1 amp=112 pan=0 3 %font "GeneralUser.sf2" 0 3 amp=134 pan=0 4 %font "GeneralUser.sf2" 0 0 amp=72 pan=0 5 %font "GeneralUser.sf2" 0 1 amp=111 pan=0 6 %font "GeneralUser.sf2" 0 1 amp=112 pan=0 7 %font "GeneralUser.sf2" 0 4 amp=91 pan=0 8 %font "GeneralUser.sf2" 0 4 amp=80 pan=0 9 %font "GeneralUser.sf2" 0 5 amp=73 pan=0 10 %font "GeneralUser.sf2" 0 25 amp=75 pan=0 11 %font "GeneralUser.sf2" 0 25 amp=76 pan=0 12 %font "GeneralUser.sf2" 0 26 amp=92 pan=0 13 %font "GeneralUser.sf2" 0 26 amp=104 pan=0 14 %font "GeneralUser.sf2" 0 28 amp=222 pan=0 15 %font "GeneralUser.sf2" 0 36 amp=152 pan=0 16 %font "GeneralUser.sf2" 0 36 amp=152 pan=0 17 %font "GeneralUser.sf2" 0 36 amp=152 pan=0 18 %font "GeneralUser.sf2" 0 36 amp=152 pan=0 19 %font "GeneralUser.sf2" 0 37 amp=48 pan=0 20 %font "GeneralUser.sf2" 0 37 amp=48 pan=0 21 %font "GeneralUser.sf2" 0 37 amp=48 pan=0 22 %font "GeneralUser.sf2" 0 37 amp=48 pan=0 23 %font "GeneralUser.sf2" 0 33 amp=119 pan=0 24 %font "GeneralUser.sf2" 0 33 amp=120 pan=0 25 %font "GeneralUser.sf2" 0 34 amp=408 pan=0 26 %font "GeneralUser.sf2" 0 34 amp=412 pan=0 27 %font "GeneralUser.sf2" 0 35 amp=160 pan=0 28 %font "GeneralUser.sf2" 0 32 amp=361 pan=0 29 %font "GeneralUser.sf2" 0 52 amp=89 pan=0 30 %font "GeneralUser.sf2" 0 52 amp=89 pan=0 31 %font "GeneralUser.sf2" 0 52 amp=90 pan=0 32 %font "GeneralUser.sf2" 0 52 amp=89 pan=0 33 %font "GeneralUser.sf2" 0 49 amp=116 pan=0 34 %font "GeneralUser.sf2" 0 48 amp=89 pan=0 35 %font "GeneralUser.sf2" 0 50 amp=100 pan=0 36 %font "GeneralUser.sf2" 0 50 amp=76 pan=0 37 %font "GeneralUser.sf2" 0 16 amp=54 pan=0 38 %font "GeneralUser.sf2" 0 16 amp=75 pan=0 39 %font "GeneralUser.sf2" 0 16 amp=75 pan=0 40 %font "GeneralUser.sf2" 0 17 amp=167 pan=0 41 %font "GeneralUser.sf2" 0 16 amp=75 pan=0 42 %font "GeneralUser.sf2" 0 16 amp=75 pan=0 43 %font "GeneralUser.sf2" 0 17 amp=167 pan=0 44 %font "GeneralUser.sf2" 0 17 amp=167 pan=0 45 %font "GeneralUser.sf2" 0 17 amp=167 pan=0 46 %font "GeneralUser.sf2" 0 56 amp=104 pan=0 47 %font "GeneralUser.sf2" 0 56 amp=104 pan=0 48 %font "GeneralUser.sf2" 0 57 amp=94 pan=0 49 %font "GeneralUser.sf2" 0 57 amp=94 pan=0 50 %font "GeneralUser.sf2" 0 57 amp=94 pan=0 51 %font "GeneralUser.sf2" 0 57 amp=94 pan=0 52 %font "GeneralUser.sf2" 0 57 amp=94 pan=0 53 %font "GeneralUser.sf2" 0 57 amp=94 pan=0 54 %font "GeneralUser.sf2" 0 65 amp=116 pan=0 55 %font "GeneralUser.sf2" 0 66 amp=86 pan=0 56 %font "GeneralUser.sf2" 0 67 amp=144 pan=0 57 %font "GeneralUser.sf2" 0 65 amp=116 pan=0 58 %font "GeneralUser.sf2" 0 61 amp=89 pan=0 59 %font "GeneralUser.sf2" 0 61 amp=88 pan=0 60 %font "GeneralUser.sf2" 0 61 amp=105 pan=0 61 %font "GeneralUser.sf2" 0 61 amp=105 pan=0 62 %font "GeneralUser.sf2" 0 61 amp=88 pan=0 63 %font "GeneralUser.sf2" 0 55 amp=112 pan=0 bank 127 0 %font "GeneralUser.sf2" 127 0 amp=80 pan=0 1 %font "GeneralUser.sf2" 127 1 amp=143 pan=0 8 %font "GeneralUser.sf2" 127 8 amp=204 pan=0 9 %font "GeneralUser.sf2" 0 17 amp=101 pan=0 10 %font "GeneralUser.sf2" 0 18 amp=106 pan=0 11 %font "GeneralUser.sf2" 0 18 amp=79 pan=0 12 %font "GeneralUser.sf2" 0 19 amp=87 pan=0 13 %font "GeneralUser.sf2" 0 19 amp=148 pan=0 14 %font "GeneralUser.sf2" 0 20 amp=35 pan=0 15 %font "GeneralUser.sf2" 0 21 amp=53 pan=0 16 %font "GeneralUser.sf2" 127 16 amp=96 pan=0 17 %font "GeneralUser.sf2" 0 6 amp=38 pan=0 18 %font "GeneralUser.sf2" 0 6 amp=43 pan=0 19 %font "GeneralUser.sf2" 0 7 amp=63 pan=0 20 %font "GeneralUser.sf2" 0 7 amp=111 pan=0 21 %font "GeneralUser.sf2" 0 7 amp=72 pan=0 22 %font "GeneralUser.sf2" 0 8 amp=32 pan=0 23 %font "GeneralUser.sf2" 0 8 amp=32 pan=0 24 %font "GeneralUser.sf2" 127 24 amp=332 pan=0 25 %font "GeneralUser.sf2" 127 25 amp=406 pan=0 26 %font "GeneralUser.sf2" 127 26 amp=350 pan=0 27 %font "GeneralUser.sf2" 0 63 amp=89 pan=0 28 %font "GeneralUser.sf2" 0 38 amp=55 pan=0 29 %font "GeneralUser.sf2" 0 39 amp=50 pan=0 30 %font "GeneralUser.sf2" 0 38 amp=55 pan=0 31 %font "GeneralUser.sf2" 0 39 amp=69 pan=0 32 %font "GeneralUser.sf2" 127 32 amp=205 pan=0 33 %font "GeneralUser.sf2" 0 89 amp=48 pan=0 34 %font "GeneralUser.sf2" 0 52 amp=52 pan=0 35 %font "GeneralUser.sf2" 0 113 amp=165 pan=0 36 %font "GeneralUser.sf2" 0 97 amp=78 pan=0 37 %font "GeneralUser.sf2" 0 96 amp=56 pan=0 38 %font "GeneralUser.sf2" 0 91 amp=47 pan=0 39 %font "GeneralUser.sf2" 0 85 amp=16 pan=0 40 %font "GeneralUser.sf2" 127 40 amp=356 pan=0 41 %font "GeneralUser.sf2" 0 101 amp=107 pan=0 42 %font "GeneralUser.sf2" 0 68 amp=40 pan=0 43 %font "GeneralUser.sf2" 0 95 amp=119 pan=0 44 %font "GeneralUser.sf2" 0 86 amp=49 pan=0 45 %font "GeneralUser.sf2" 0 103 amp=104 pan=0 46 %font "GeneralUser.sf2" 0 88 amp=33 pan=0 47 %font "GeneralUser.sf2" 0 80 amp=19 pan=0 48 %font "GeneralUser.sf2" 127 48 amp=189 pan=0 49 %font "GeneralUser.sf2" 0 49 amp=111 pan=0 51 %font "GeneralUser.sf2" 0 45 amp=76 pan=0 52 %font "GeneralUser.sf2" 0 40 amp=86 pan=0 53 %font "GeneralUser.sf2" 0 40 amp=76 pan=0 54 %font "GeneralUser.sf2" 0 42 amp=64 pan=0 55 %font "GeneralUser.sf2" 0 42 amp=64 pan=0 56 %font "GeneralUser.sf2" 127 56 amp=220 pan=0 57 %font "GeneralUser.sf2" 0 46 amp=36 pan=0 58 %font "GeneralUser.sf2" 0 46 amp=48 pan=0 59 %font "GeneralUser.sf2" 0 24 amp=56 pan=0 60 %font "GeneralUser.sf2" 0 24 amp=43 pan=0 61 %font "GeneralUser.sf2" 0 26 amp=88 pan=0 62 %font "GeneralUser.sf2" 0 27 amp=198 pan=0 63 %font "GeneralUser.sf2" 0 104 amp=77 pan=0 64 %font "GeneralUser.sf2" 0 32 amp=158 pan=0 65 %font "GeneralUser.sf2" 0 33 amp=67 pan=0 66 %font "GeneralUser.sf2" 0 34 amp=201 pan=0 67 %font "GeneralUser.sf2" 0 39 amp=99 pan=0 68 %font "GeneralUser.sf2" 0 36 amp=117 pan=0 69 %font "GeneralUser.sf2" 0 37 amp=35 pan=0 70 %font "GeneralUser.sf2" 0 35 amp=88 pan=0 71 %font "GeneralUser.sf2" 0 35 amp=64 pan=0 72 %font "GeneralUser.sf2" 0 73 amp=64 pan=0 73 %font "GeneralUser.sf2" 0 73 amp=110 pan=0 74 %font "GeneralUser.sf2" 0 72 amp=62 pan=0 75 %font "GeneralUser.sf2" 0 72 amp=40 pan=0 76 %font "GeneralUser.sf2" 0 74 amp=71 pan=0 77 %font "GeneralUser.sf2" 0 75 amp=62 pan=0 78 %font "GeneralUser.sf2" 0 64 amp=53 pan=0 79 %font "GeneralUser.sf2" 0 65 amp=95 pan=0 80 %font "GeneralUser.sf2" 0 66 amp=111 pan=0 81 %font "GeneralUser.sf2" 0 67 amp=111 pan=0 82 %font "GeneralUser.sf2" 0 71 amp=39 pan=0 83 %font "GeneralUser.sf2" 0 71 amp=34 pan=0 84 %font "GeneralUser.sf2" 0 68 amp=66 pan=0 85 %font "GeneralUser.sf2" 0 69 amp=130 pan=0 86 %font "GeneralUser.sf2" 0 70 amp=49 pan=0 87 %font "GeneralUser.sf2" 0 22 amp=80 pan=0 88 %font "GeneralUser.sf2" 0 56 amp=156 pan=0 89 %font "GeneralUser.sf2" 0 56 amp=136 pan=0 90 %font "GeneralUser.sf2" 0 57 amp=216 pan=0 91 %font "GeneralUser.sf2" 0 57 amp=125 pan=0 92 %font "GeneralUser.sf2" 0 60 amp=146 pan=0 93 %font "GeneralUser.sf2" 0 60 amp=203 pan=0 94 %font "GeneralUser.sf2" 0 58 amp=111 pan=0 95 %font "GeneralUser.sf2" 0 61 amp=100 pan=0 96 %font "GeneralUser.sf2" 0 61 amp=89 pan=0 97 %font "GeneralUser.sf2" 0 11 amp=18 pan=0 98 %font "GeneralUser.sf2" 0 11 amp=19 pan=0 99 %font "GeneralUser.sf2" 0 12 amp=43 pan=0 100 %font "GeneralUser.sf2" 0 88 amp=30 pan=0 101 %font "GeneralUser.sf2" 0 9 amp=76 pan=0 102 %font "GeneralUser.sf2" 0 14 amp=57 pan=0 103 %font "GeneralUser.sf2" 0 13 amp=103 pan=0 104 %font "GeneralUser.sf2" 0 12 amp=61 pan=0 105 %font "GeneralUser.sf2" 0 107 amp=100 pan=0 106 %font "GeneralUser.sf2" 0 111 amp=63 pan=0 107 %font "GeneralUser.sf2" 0 77 amp=171 pan=0 108 %font "GeneralUser.sf2" 0 78 amp=164 pan=0 109 %font "GeneralUser.sf2" 0 78 amp=83 pan=0 110 %font "GeneralUser.sf2" 0 76 amp=68 pan=0 111 %font "GeneralUser.sf2" 0 76 amp=75 pan=0 112 %font "GeneralUser.sf2" 0 47 amp=40 pan=0 113 %font "GeneralUser.sf2" 0 117 amp=66 pan=0 114 %font "GeneralUser.sf2" 0 118 amp=39 pan=0 115 %font "GeneralUser.sf2" 0 118 amp=41 pan=0 116 %font "GeneralUser.sf2" 0 118 amp=67 pan=0 117 %font "GeneralUser.sf2" 0 116 amp=84 pan=0 118 %font "GeneralUser.sf2" 0 116 amp=30 pan=0 119 %font "GeneralUser.sf2" 128 0 49 amp=72 pan=0 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal drumset 0 0 %font "GeneralUser.sf2" 128 0 36 amp=231 pan=0 # Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 1 %font "GeneralUser.sf2" 128 0 35 amp=172 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 2 %font "GeneralUser.sf2" 128 1 36 amp=196 pan=0 # Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 3 %font "GeneralUser.sf2" 128 1 35 amp=149 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 4 %font "GeneralUser.sf2" 128 0 36 amp=112 pan=0 # Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 5 %font "GeneralUser.sf2" 128 0 35 amp=134 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 6 %font "GeneralUser.sf2" 128 32 36 amp=109 pan=0 # Jazz Bass Drum Jazz Bass Drum Jazz Bass Drum Jazz Bass Drum Standard Kick 1 Standard Kick 1 Standard Kick 1 7 %font "GeneralUser.sf2" 128 32 35 amp=169 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 8 %font "GeneralUser.sf2" 128 8 36 amp=145 pan=0 # Power Kick 2 Power Kick 2 Power Kick 2 Power Kick 2 9 %font "GeneralUser.sf2" 128 8 35 amp=91 pan=0 # Power/Room Kick 1 Power/Room Kick 1 Power/Room Kick 1 Power/Room Kick 1 10 %font "GeneralUser.sf2" 128 16 36 amp=57 pan=0 # Power Kick 2 Power Kick 2 Power Kick 2 Power Kick 2 11 %font "GeneralUser.sf2" 128 16 35 amp=87 pan=0 # Power/Room Kick 1 Power/Room Kick 1 Power/Room Kick 1 Power/Room Kick 1 12 %font "GeneralUser.sf2" 128 24 36 amp=94 pan=0 # TR-909 Kick Electric Tom 13 %font "GeneralUser.sf2" 128 24 35 amp=294 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 14 %font "GeneralUser.sf2" 128 25 36 amp=88 pan=0 # TR-909 Kick 15 %font "GeneralUser.sf2" 128 25 35 amp=111 pan=0 # Sine-93.75Hz 16 %font "GeneralUser.sf2" 128 26 35 amp=147 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 27 %font "GeneralUser.sf2" 128 0 27 amp=36 pan=-23 # Filter Snap 28 %font "GeneralUser.sf2" 128 0 28 amp=104 pan=31 # Slap 29 %font "GeneralUser.sf2" 128 0 29 amp=44 pan=-16 # Scratch Push 30 %font "GeneralUser.sf2" 128 0 30 amp=50 pan=-16 # Scratch Pull 31 %font "GeneralUser.sf2" 128 0 31 amp=154 pan=0 # Sticks 32 %font "GeneralUser.sf2" 128 0 32 amp=315 pan=-16 # Square Click 33 %font "GeneralUser.sf2" 128 0 33 amp=77 pan=0 # TR-808 Click 34 %font "GeneralUser.sf2" 128 0 34 amp=45 pan=0 # TR-808 Click Carillon-C6 35 %font "GeneralUser.sf2" 128 0 35 amp=161 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 36 %font "GeneralUser.sf2" 128 0 36 amp=158 pan=0 # Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 37 %font "GeneralUser.sf2" 128 0 37 amp=72 pan=0 # Jazz Rim Shot Jazz Rim Shot Jazz Rim Shot Jazz Rim Shot Rim Shot 38 %font "GeneralUser.sf2" 128 0 38 amp=129 pan=0 # Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Jazz Snare Soft 1 Jazz Snare Soft 1 39 %font "GeneralUser.sf2" 128 0 39 amp=54 pan=-16 # Hand Clap 40 %font "GeneralUser.sf2" 128 0 40 amp=378 pan=0 # Standard Snare 2 Standard Snare 2 Standard Snare 2 Standard Snare 2 41 %font "GeneralUser.sf2" 128 0 41 amp=137 pan=-47 # Standard Tom 5 Standard Tom 5 Standard Tom 5 Standard Tom 5 Standard Tom 5 42 %font "GeneralUser.sf2" 128 0 42 amp=36 pan=31 # Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Soft Hi-Hat Closed Soft Hi-Hat Closed Soft 43 %font "GeneralUser.sf2" 128 0 43 amp=130 pan=-28 # Standard Tom 5 Standard Tom 5 Standard Tom 5 Standard Tom 5 Standard Tom 5 44 %font "GeneralUser.sf2" 128 0 44 amp=23 pan=31 # Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Dead Air 45 %font "GeneralUser.sf2" 128 0 45 amp=119 pan=-9 # Standard Tom 4 Standard Tom 4 Standard Tom 4 Standard Tom 4 Standard Tom 4 46 %font "GeneralUser.sf2" 128 0 46 amp=59 pan=31 # Hi-Hat Open Hi-Hat Open Attack Hi-Hat Open Attack 47 %font "GeneralUser.sf2" 128 0 47 amp=141 pan=9 # Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 48 %font "GeneralUser.sf2" 128 0 48 amp=84 pan=28 # Standard Tom 2 Standard Tom 2 Standard Tom 2 Standard Tom 2 Standard Tom 2 49 %font "GeneralUser.sf2" 128 0 49 amp=166 pan=31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 50 %font "GeneralUser.sf2" 128 0 50 amp=52 pan=47 # Standard Tom 1 Standard Tom 1 Standard Tom 1 Standard Tom 1 Standard Tom 1 51 %font "GeneralUser.sf2" 128 0 51 amp=62 pan=-31 # Ride Cymbal 52 %font "GeneralUser.sf2" 128 0 52 amp=70 pan=-31 # Chinese Cymbal 53 %font "GeneralUser.sf2" 128 0 53 amp=62 pan=-31 # Ride Bell 54 %font "GeneralUser.sf2" 128 0 54 amp=66 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 0 55 amp=61 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 0 56 amp=102 pan=31 # Cowbell 57 %font "GeneralUser.sf2" 128 0 57 amp=136 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 0 58 amp=33 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 0 59 amp=64 pan=-31 # Ride Cymbal 60 %font "GeneralUser.sf2" 128 0 60 amp=17 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 0 61 amp=77 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 0 62 amp=31 pan=-39 # Conga High Muted 63 %font "GeneralUser.sf2" 128 0 63 amp=68 pan=-39 # Conga High Open 64 %font "GeneralUser.sf2" 128 0 64 amp=49 pan=-31 # Tumba Low 65 %font "GeneralUser.sf2" 128 0 65 amp=127 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 0 66 amp=64 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 0 67 amp=63 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 0 68 amp=71 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 0 69 amp=39 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 0 70 amp=44 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 0 71 amp=37 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 0 72 amp=40 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 0 73 amp=77 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 0 74 amp=46 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 0 75 amp=92 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 0 76 amp=56 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 0 77 amp=101 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 0 78 amp=39 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 0 79 amp=43 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 0 80 amp=45 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 0 81 amp=11 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 0 82 amp=155 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 0 83 amp=71 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 0 84 amp=40 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 0 85 amp=106 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 0 86 amp=64 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 0 87 amp=104 pan=-31 # Surdo Open 97 %font "GeneralUser.sf2" 128 0 38 amp=128 pan=0 # Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Jazz Snare Soft 1 Jazz Snare Soft 1 98 %font "GeneralUser.sf2" 128 0 40 amp=204 pan=0 # Standard Snare 2 Standard Snare 2 Standard Snare 2 Standard Snare 2 99 %font "GeneralUser.sf2" 128 1 38 amp=174 pan=0 # Standard 2 Snare Standard 2 Snare Standard 2 Snare Standard 2 Snare 100 %font "GeneralUser.sf2" 128 1 40 amp=211 pan=0 # Standard Snare 2 Standard Snare 2 Standard Snare 2 Standard Snare 2 101 %font "GeneralUser.sf2" 128 0 40 amp=345 pan=0 # Standard Snare 2 Standard Snare 2 Standard Snare 2 Standard Snare 2 102 %font "GeneralUser.sf2" 128 0 38 amp=129 pan=0 # Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Jazz Snare Soft 1 Jazz Snare Soft 1 103 %font "GeneralUser.sf2" 128 0 40 amp=250 pan=0 # Standard Snare 2 Standard Snare 2 Standard Snare 2 Standard Snare 2 104 %font "GeneralUser.sf2" 128 0 38 amp=157 pan=0 # Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Jazz Snare Soft 1 Jazz Snare Soft 1 105 %font "GeneralUser.sf2" 128 32 38 amp=80 pan=0 # Jazz Snare Soft 1 Jazz Snare Soft 1 Jazz Snare Soft 2 Jazz Snare Hard Jazz Snare Hard 106 %font "GeneralUser.sf2" 128 32 40 amp=179 pan=0 # Brush Snare Brush Snare Brush Snare Standard Snare 2 Standard Snare 2 Standard Snare 2 107 %font "GeneralUser.sf2" 128 8 38 amp=117 pan=0 # Room Snare 1 Room Snare 1 Room Snare 1 Room Snare 1 Room Snare 1 108 %font "GeneralUser.sf2" 128 8 40 amp=144 pan=0 # Standard Snare 2 Standard Snare 2 Standard Snare 2 Standard Snare 2 109 %font "GeneralUser.sf2" 128 16 38 amp=50 pan=0 # Power Snare 1 Power Snare 1 Power Snare 1 Power Snare 1 110 %font "GeneralUser.sf2" 128 16 40 amp=58 pan=0 # Power Snare 2 Power Snare 2 Power Snare 2 Power Snare 2 111 %font "GeneralUser.sf2" 128 24 40 amp=64 pan=0 # Power Snare 1 Power Snare 1 Power Snare 1 Power Snare 1 112 %font "GeneralUser.sf2" 128 26 38 amp=87 pan=0 # Dance Snare 113 %font "GeneralUser.sf2" 128 26 40 amp=75 pan=0 # TR-909 Snare 2 114 %font "GeneralUser.sf2" 128 26 38 amp=93 pan=0 # Dance Snare 115 %font "GeneralUser.sf2" 128 24 40 amp=43 pan=0 # Power Snare 1 Power Snare 1 Power Snare 1 Power Snare 1 116 %font "GeneralUser.sf2" 128 24 38 amp=116 pan=0 # Electric Tom White Noise 117 %font "GeneralUser.sf2" 128 24 38 amp=190 pan=0 # Electric Tom White Noise 118 %font "GeneralUser.sf2" 128 25 38 amp=83 pan=0 # TR-909 Snare 1 119 %font "GeneralUser.sf2" 128 25 38 amp=72 pan=0 # TR-909 Snare 1 120 %font "GeneralUser.sf2" 128 25 40 amp=53 pan=0 # TR-909 Snare 2 121 %font "GeneralUser.sf2" 128 25 38 amp=58 pan=0 # TR-909 Snare 1 122 %font "GeneralUser.sf2" 128 25 40 amp=77 pan=0 # TR-909 Snare 2 123 %font "GeneralUser.sf2" 128 25 38 amp=93 pan=0 # TR-909 Snare 1 124 %font "GeneralUser.sf2" 128 25 38 amp=68 pan=0 # TR-909 Snare 1 125 %font "GeneralUser.sf2" 128 26 38 amp=149 pan=0 # Dance Snare 126 %font "GeneralUser.sf2" 128 26 38 amp=101 pan=0 # Dance Snare 127 %font "GeneralUser.sf2" 128 26 38 amp=115 pan=0 # Dance Snare drumset 1 27 %font "GeneralUser.sf2" 128 1 27 amp=36 pan=-23 # Filter Snap 28 %font "GeneralUser.sf2" 128 1 28 amp=104 pan=31 # Slap 29 %font "GeneralUser.sf2" 128 1 29 amp=44 pan=-16 # Scratch Push 30 %font "GeneralUser.sf2" 128 1 30 amp=80 pan=-16 # Scratch Pull 31 %font "GeneralUser.sf2" 128 1 31 amp=97 pan=0 # Sticks 32 %font "GeneralUser.sf2" 128 1 32 amp=432 pan=-16 # Square Click 33 %font "GeneralUser.sf2" 128 1 33 amp=76 pan=0 # TR-808 Click 34 %font "GeneralUser.sf2" 128 1 34 amp=45 pan=0 # TR-808 Click Carillon-C6 35 %font "GeneralUser.sf2" 128 1 35 amp=161 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 36 %font "GeneralUser.sf2" 128 1 36 amp=218 pan=0 # Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 37 %font "GeneralUser.sf2" 128 1 37 amp=115 pan=0 # Jazz Rim Shot Jazz Rim Shot Jazz Rim Shot Jazz Rim Shot Rim Shot 38 %font "GeneralUser.sf2" 128 1 38 amp=286 pan=0 # Standard 2 Snare Standard 2 Snare Standard 2 Snare Standard 2 Snare 39 %font "GeneralUser.sf2" 128 1 39 amp=81 pan=-16 # Hand Clap 40 %font "GeneralUser.sf2" 128 1 40 amp=139 pan=0 # Standard Snare 2 Standard Snare 2 Standard Snare 2 Standard Snare 2 41 %font "GeneralUser.sf2" 128 1 41 amp=200 pan=-47 # Standard Tom 5 Standard Tom 5 Standard Tom 5 Standard Tom 5 Standard Tom 5 42 %font "GeneralUser.sf2" 128 1 42 amp=58 pan=31 # Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Soft Hi-Hat Closed Soft Hi-Hat Closed Soft 43 %font "GeneralUser.sf2" 128 1 43 amp=130 pan=-28 # Standard Tom 5 Standard Tom 5 Standard Tom 5 Standard Tom 5 Standard Tom 5 44 %font "GeneralUser.sf2" 128 1 44 amp=33 pan=31 # Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Dead Air 45 %font "GeneralUser.sf2" 128 1 45 amp=119 pan=-9 # Standard Tom 4 Standard Tom 4 Standard Tom 4 Standard Tom 4 Standard Tom 4 46 %font "GeneralUser.sf2" 128 1 46 amp=31 pan=31 # Hi-Hat Open Hi-Hat Open Attack Hi-Hat Open Attack 47 %font "GeneralUser.sf2" 128 1 47 amp=95 pan=9 # Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 48 %font "GeneralUser.sf2" 128 1 48 amp=124 pan=28 # Standard Tom 2 Standard Tom 2 Standard Tom 2 Standard Tom 2 Standard Tom 2 49 %font "GeneralUser.sf2" 128 1 49 amp=176 pan=31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 50 %font "GeneralUser.sf2" 128 1 50 amp=163 pan=47 # Standard Tom 1 Standard Tom 1 Standard Tom 1 Standard Tom 1 Standard Tom 1 51 %font "GeneralUser.sf2" 128 1 51 amp=61 pan=-31 # Ride Cymbal 52 %font "GeneralUser.sf2" 128 1 52 amp=55 pan=-31 # Chinese Cymbal 53 %font "GeneralUser.sf2" 128 1 53 amp=27 pan=-31 # Ride Bell 54 %font "GeneralUser.sf2" 128 1 54 amp=18 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 1 55 amp=63 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 1 56 amp=106 pan=31 # Cowbell 57 %font "GeneralUser.sf2" 128 1 57 amp=114 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 1 58 amp=80 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 1 59 amp=65 pan=-31 # Ride Cymbal 60 %font "GeneralUser.sf2" 128 1 60 amp=159 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 1 61 amp=124 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 1 62 amp=31 pan=-39 # Conga High Muted 63 %font "GeneralUser.sf2" 128 1 63 amp=67 pan=-39 # Conga High Open 64 %font "GeneralUser.sf2" 128 1 64 amp=49 pan=-31 # Tumba Low 65 %font "GeneralUser.sf2" 128 1 65 amp=82 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 1 66 amp=98 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 1 67 amp=64 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 1 68 amp=71 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 1 69 amp=40 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 1 70 amp=28 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 1 71 amp=37 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 1 72 amp=65 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 1 73 amp=77 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 1 74 amp=45 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 1 75 amp=92 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 1 76 amp=57 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 1 77 amp=62 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 1 78 amp=63 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 1 79 amp=43 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 1 80 amp=45 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 1 81 amp=11 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 1 82 amp=96 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 1 83 amp=114 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 1 84 amp=110 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 1 85 amp=14 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 1 86 amp=61 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 1 87 amp=102 pan=-31 # Surdo Open drumset 8 27 %font "GeneralUser.sf2" 128 8 27 amp=51 pan=-23 # Filter Snap 28 %font "GeneralUser.sf2" 128 8 28 amp=167 pan=31 # Slap 29 %font "GeneralUser.sf2" 128 8 29 amp=44 pan=-16 # Scratch Push 30 %font "GeneralUser.sf2" 128 8 30 amp=50 pan=-16 # Scratch Pull 31 %font "GeneralUser.sf2" 128 8 31 amp=97 pan=0 # Sticks 32 %font "GeneralUser.sf2" 128 8 32 amp=321 pan=-16 # Square Click 33 %font "GeneralUser.sf2" 128 8 33 amp=77 pan=0 # TR-808 Click 34 %font "GeneralUser.sf2" 128 8 34 amp=45 pan=0 # TR-808 Click Carillon-C6 35 %font "GeneralUser.sf2" 128 8 35 amp=95 pan=0 # Power/Room Kick 1 Power/Room Kick 1 Power/Room Kick 1 Power/Room Kick 1 36 %font "GeneralUser.sf2" 128 8 36 amp=100 pan=0 # Power Kick 2 Power Kick 2 Power Kick 2 Power Kick 2 37 %font "GeneralUser.sf2" 128 8 37 amp=72 pan=0 # Jazz Rim Shot Jazz Rim Shot Jazz Rim Shot Jazz Rim Shot Rim Shot 38 %font "GeneralUser.sf2" 128 8 38 amp=194 pan=0 # Room Snare 1 Room Snare 1 Room Snare 1 Room Snare 1 Room Snare 1 39 %font "GeneralUser.sf2" 128 8 39 amp=81 pan=-16 # Hand Clap 40 %font "GeneralUser.sf2" 128 8 40 amp=197 pan=0 # Standard Snare 2 Standard Snare 2 Standard Snare 2 Standard Snare 2 41 %font "GeneralUser.sf2" 128 8 41 amp=115 pan=-47 # Room Tom 1 Room Tom 1 Room Tom 1 Room Tom 1 42 %font "GeneralUser.sf2" 128 8 42 amp=35 pan=31 # Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Soft Hi-Hat Closed Soft Hi-Hat Closed Soft 43 %font "GeneralUser.sf2" 128 8 43 amp=113 pan=-28 # Room Tom 1 Room Tom 1 Room Tom 1 Room Tom 1 44 %font "GeneralUser.sf2" 128 8 44 amp=71 pan=31 # Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Dead Air 45 %font "GeneralUser.sf2" 128 8 45 amp=221 pan=-9 # Room Tom 1 Room Tom 1 Room Tom 1 Room Tom 1 46 %font "GeneralUser.sf2" 128 8 46 amp=42 pan=31 # Hi-Hat Open Hi-Hat Open Attack Hi-Hat Open Attack 47 %font "GeneralUser.sf2" 128 8 47 amp=148 pan=9 # Room Tom 2 Room Tom 2 Room Tom 2 Room Tom 2 48 %font "GeneralUser.sf2" 128 8 48 amp=152 pan=28 # Room Tom 2 Room Tom 2 Room Tom 2 Room Tom 2 49 %font "GeneralUser.sf2" 128 8 49 amp=176 pan=31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 50 %font "GeneralUser.sf2" 128 8 50 amp=249 pan=47 # Room Tom 2 Room Tom 2 Room Tom 2 Room Tom 2 51 %font "GeneralUser.sf2" 128 8 51 amp=77 pan=-31 # Ride Cymbal 52 %font "GeneralUser.sf2" 128 8 52 amp=71 pan=-31 # Chinese Cymbal 53 %font "GeneralUser.sf2" 128 8 53 amp=27 pan=-31 # Ride Bell 54 %font "GeneralUser.sf2" 128 8 54 amp=68 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 8 55 amp=63 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 8 56 amp=163 pan=31 # Cowbell 57 %font "GeneralUser.sf2" 128 8 57 amp=121 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 8 58 amp=34 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 8 59 amp=51 pan=-31 # Ride Cymbal 60 %font "GeneralUser.sf2" 128 8 60 amp=98 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 8 61 amp=75 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 8 62 amp=48 pan=-39 # Conga High Muted 63 %font "GeneralUser.sf2" 128 8 63 amp=67 pan=-39 # Conga High Open 64 %font "GeneralUser.sf2" 128 8 64 amp=49 pan=-31 # Tumba Low 65 %font "GeneralUser.sf2" 128 8 65 amp=82 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 8 66 amp=64 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 8 67 amp=63 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 8 68 amp=113 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 8 69 amp=39 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 8 70 amp=28 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 8 71 amp=37 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 8 72 amp=40 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 8 73 amp=77 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 8 74 amp=43 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 8 75 amp=145 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 8 76 amp=56 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 8 77 amp=64 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 8 78 amp=39 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 8 79 amp=43 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 8 80 amp=65 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 8 81 amp=11 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 8 82 amp=96 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 8 83 amp=71 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 8 84 amp=40 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 8 85 amp=106 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 8 86 amp=95 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 8 87 amp=144 pan=-31 # Surdo Open drumset 9 29 %font "GeneralUser.sf2" 128 25 29 amp=72 pan=-16 # TR-909 Scratch Pull 30 %font "GeneralUser.sf2" 128 25 30 amp=57 pan=-16 # TR-909 Scratch Push 35 %font "GeneralUser.sf2" 128 25 35 amp=177 pan=0 # Sine-93.75Hz 36 %font "GeneralUser.sf2" 128 25 36 amp=94 pan=0 # TR-909 Kick 37 %font "GeneralUser.sf2" 128 25 37 amp=175 pan=0 # TR-808 Click 38 %font "GeneralUser.sf2" 128 25 38 amp=93 pan=0 # TR-909 Snare 1 39 %font "GeneralUser.sf2" 128 25 39 amp=45 pan=-16 # Synth Hand Clap 40 %font "GeneralUser.sf2" 128 25 40 amp=64 pan=0 # TR-909 Snare 2 41 %font "GeneralUser.sf2" 128 25 41 amp=123 pan=-47 # Sine-750Hz 42 %font "GeneralUser.sf2" 128 25 42 amp=57 pan=31 # TR-808 Hi-Hat 43 %font "GeneralUser.sf2" 128 25 43 amp=72 pan=-28 # Sine-750Hz 44 %font "GeneralUser.sf2" 128 25 44 amp=36 pan=31 # TR-808 Hi-Hat 45 %font "GeneralUser.sf2" 128 25 45 amp=68 pan=-9 # Sine-750Hz 46 %font "GeneralUser.sf2" 128 25 46 amp=18 pan=31 # TR-909 Hi-Hat Open 47 %font "GeneralUser.sf2" 128 25 47 amp=68 pan=9 # Sine-750Hz 48 %font "GeneralUser.sf2" 128 25 48 amp=46 pan=28 # Sine-750Hz 49 %font "GeneralUser.sf2" 128 25 49 amp=89 pan=31 # TR-808 Hi-Hat Crash Cymbal 50 %font "GeneralUser.sf2" 128 25 50 amp=55 pan=47 # Sine-750Hz 51 %font "GeneralUser.sf2" 128 25 51 amp=62 pan=-31 # Ride Cymbal 52 %font "GeneralUser.sf2" 128 25 52 amp=23 pan=-31 # Chinese Cymbal 53 %font "GeneralUser.sf2" 128 25 53 amp=62 pan=-31 # Ride Bell 54 %font "GeneralUser.sf2" 128 25 54 amp=22 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 25 55 amp=61 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 25 56 amp=32 pan=31 # TR-808 Cowbell 57 %font "GeneralUser.sf2" 128 25 57 amp=121 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 25 58 amp=34 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 25 59 amp=66 pan=-31 # Ride Cymbal 60 %font "GeneralUser.sf2" 128 25 60 amp=98 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 25 61 amp=76 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 25 62 amp=16 pan=-39 # Sine-750Hz 63 %font "GeneralUser.sf2" 128 25 63 amp=47 pan=-39 # Sine-750Hz 64 %font "GeneralUser.sf2" 128 25 64 amp=57 pan=-31 # Sine-750Hz 65 %font "GeneralUser.sf2" 128 25 65 amp=82 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 25 66 amp=64 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 25 67 amp=64 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 25 68 amp=71 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 25 69 amp=39 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 25 70 amp=43 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 25 71 amp=37 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 25 72 amp=65 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 25 73 amp=77 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 25 74 amp=116 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 25 75 amp=80 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 25 76 amp=56 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 25 77 amp=102 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 25 78 amp=51 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 25 79 amp=73 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 25 80 amp=36 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 25 81 amp=14 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 25 82 amp=61 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 25 83 amp=114 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 25 84 amp=40 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 25 85 amp=106 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 25 86 amp=64 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 25 87 amp=102 pan=-31 # Surdo Open drumset 10 29 %font "GeneralUser.sf2" 128 25 29 amp=44 pan=-16 # TR-909 Scratch Pull 30 %font "GeneralUser.sf2" 128 25 30 amp=91 pan=-16 # TR-909 Scratch Push 35 %font "GeneralUser.sf2" 128 25 35 amp=51 pan=0 # Sine-93.75Hz 36 %font "GeneralUser.sf2" 128 25 36 amp=132 pan=0 # TR-909 Kick 37 %font "GeneralUser.sf2" 128 25 37 amp=98 pan=0 # TR-808 Click 38 %font "GeneralUser.sf2" 128 25 38 amp=79 pan=0 # TR-909 Snare 1 39 %font "GeneralUser.sf2" 128 25 39 amp=83 pan=-16 # Synth Hand Clap 40 %font "GeneralUser.sf2" 128 25 40 amp=80 pan=0 # TR-909 Snare 2 41 %font "GeneralUser.sf2" 128 25 41 amp=124 pan=-47 # Sine-750Hz 42 %font "GeneralUser.sf2" 128 25 42 amp=85 pan=31 # TR-808 Hi-Hat 43 %font "GeneralUser.sf2" 128 25 43 amp=72 pan=-28 # Sine-750Hz 44 %font "GeneralUser.sf2" 128 25 44 amp=69 pan=31 # TR-808 Hi-Hat 45 %font "GeneralUser.sf2" 128 25 45 amp=68 pan=-9 # Sine-750Hz 46 %font "GeneralUser.sf2" 128 25 46 amp=47 pan=31 # TR-909 Hi-Hat Open 47 %font "GeneralUser.sf2" 128 25 47 amp=68 pan=9 # Sine-750Hz 48 %font "GeneralUser.sf2" 128 25 48 amp=46 pan=28 # Sine-750Hz 49 %font "GeneralUser.sf2" 128 25 49 amp=97 pan=31 # TR-808 Hi-Hat Crash Cymbal 50 %font "GeneralUser.sf2" 128 25 50 amp=19 pan=47 # Sine-750Hz 51 %font "GeneralUser.sf2" 128 25 51 amp=61 pan=-31 # Ride Cymbal 52 %font "GeneralUser.sf2" 128 25 52 amp=23 pan=-31 # Chinese Cymbal 53 %font "GeneralUser.sf2" 128 25 53 amp=62 pan=-31 # Ride Bell 54 %font "GeneralUser.sf2" 128 25 54 amp=101 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 25 55 amp=62 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 25 56 amp=32 pan=31 # TR-808 Cowbell 57 %font "GeneralUser.sf2" 128 25 57 amp=136 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 25 58 amp=33 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 25 59 amp=65 pan=-31 # Ride Cymbal 60 %font "GeneralUser.sf2" 128 25 60 amp=159 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 25 61 amp=76 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 25 62 amp=16 pan=-39 # Sine-750Hz 63 %font "GeneralUser.sf2" 128 25 63 amp=48 pan=-39 # Sine-750Hz 64 %font "GeneralUser.sf2" 128 25 64 amp=36 pan=-31 # Sine-750Hz 65 %font "GeneralUser.sf2" 128 25 65 amp=82 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 25 66 amp=64 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 25 67 amp=63 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 25 68 amp=71 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 25 69 amp=39 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 25 70 amp=43 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 25 71 amp=59 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 25 72 amp=65 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 25 73 amp=77 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 25 74 amp=116 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 25 75 amp=75 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 25 76 amp=56 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 25 77 amp=101 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 25 78 amp=51 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 25 79 amp=72 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 25 80 amp=36 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 25 81 amp=9 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 25 82 amp=61 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 25 83 amp=114 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 25 84 amp=61 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 25 85 amp=106 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 25 86 amp=63 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 25 87 amp=103 pan=-31 # Surdo Open drumset 11 29 %font "GeneralUser.sf2" 128 25 29 amp=44 pan=-16 # TR-909 Scratch Pull 30 %font "GeneralUser.sf2" 128 25 30 amp=91 pan=-16 # TR-909 Scratch Push 35 %font "GeneralUser.sf2" 128 25 35 amp=72 pan=0 # Sine-93.75Hz 36 %font "GeneralUser.sf2" 128 25 36 amp=154 pan=0 # TR-909 Kick 37 %font "GeneralUser.sf2" 128 25 37 amp=175 pan=0 # TR-808 Click 38 %font "GeneralUser.sf2" 128 25 38 amp=71 pan=0 # TR-909 Snare 1 39 %font "GeneralUser.sf2" 128 25 39 amp=66 pan=-16 # Synth Hand Clap 40 %font "GeneralUser.sf2" 128 25 40 amp=94 pan=0 # TR-909 Snare 2 41 %font "GeneralUser.sf2" 128 25 41 amp=68 pan=-47 # Sine-750Hz 42 %font "GeneralUser.sf2" 128 25 42 amp=67 pan=31 # TR-808 Hi-Hat 43 %font "GeneralUser.sf2" 128 25 43 amp=109 pan=-28 # Sine-750Hz 44 %font "GeneralUser.sf2" 128 25 44 amp=93 pan=31 # TR-808 Hi-Hat 45 %font "GeneralUser.sf2" 128 25 45 amp=65 pan=-9 # Sine-750Hz 46 %font "GeneralUser.sf2" 128 25 46 amp=31 pan=31 # TR-909 Hi-Hat Open 47 %font "GeneralUser.sf2" 128 25 47 amp=63 pan=9 # Sine-750Hz 48 %font "GeneralUser.sf2" 128 25 48 amp=111 pan=28 # Sine-750Hz 49 %font "GeneralUser.sf2" 128 25 49 amp=144 pan=31 # TR-808 Hi-Hat Crash Cymbal 50 %font "GeneralUser.sf2" 128 25 50 amp=88 pan=47 # Sine-750Hz 51 %font "GeneralUser.sf2" 128 25 51 amp=62 pan=-31 # Ride Cymbal 52 %font "GeneralUser.sf2" 128 25 52 amp=23 pan=-31 # Chinese Cymbal 53 %font "GeneralUser.sf2" 128 25 53 amp=46 pan=-31 # Ride Bell 54 %font "GeneralUser.sf2" 128 25 54 amp=101 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 25 55 amp=89 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 25 56 amp=32 pan=31 # TR-808 Cowbell 57 %font "GeneralUser.sf2" 128 25 57 amp=140 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 25 58 amp=59 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 25 59 amp=52 pan=-31 # Ride Cymbal 60 %font "GeneralUser.sf2" 128 25 60 amp=194 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 25 61 amp=136 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 25 62 amp=36 pan=-39 # Sine-750Hz 63 %font "GeneralUser.sf2" 128 25 63 amp=54 pan=-39 # Sine-750Hz 64 %font "GeneralUser.sf2" 128 25 64 amp=70 pan=-31 # Sine-750Hz 65 %font "GeneralUser.sf2" 128 25 65 amp=82 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 25 66 amp=98 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 25 67 amp=64 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 25 68 amp=71 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 25 69 amp=39 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 25 70 amp=43 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 25 71 amp=37 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 25 72 amp=65 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 25 73 amp=77 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 25 74 amp=117 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 25 75 amp=84 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 25 76 amp=56 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 25 77 amp=64 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 25 78 amp=79 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 25 79 amp=113 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 25 80 amp=36 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 25 81 amp=9 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 25 82 amp=61 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 25 83 amp=71 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 25 84 amp=61 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 25 85 amp=162 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 25 86 amp=64 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 25 87 amp=103 pan=-31 # Surdo Open drumset 16 27 %font "GeneralUser.sf2" 128 16 27 amp=52 pan=-23 # Filter Snap 28 %font "GeneralUser.sf2" 128 16 28 amp=104 pan=31 # Slap 29 %font "GeneralUser.sf2" 128 16 29 amp=44 pan=-16 # Scratch Push 30 %font "GeneralUser.sf2" 128 16 30 amp=50 pan=-16 # Scratch Pull 31 %font "GeneralUser.sf2" 128 16 31 amp=97 pan=0 # Sticks 32 %font "GeneralUser.sf2" 128 16 32 amp=431 pan=-16 # Square Click 33 %font "GeneralUser.sf2" 128 16 33 amp=123 pan=0 # TR-808 Click 34 %font "GeneralUser.sf2" 128 16 34 amp=68 pan=0 # TR-808 Click Carillon-C6 35 %font "GeneralUser.sf2" 128 16 35 amp=106 pan=0 # Power/Room Kick 1 Power/Room Kick 1 Power/Room Kick 1 Power/Room Kick 1 36 %font "GeneralUser.sf2" 128 16 36 amp=75 pan=0 # Power Kick 2 Power Kick 2 Power Kick 2 Power Kick 2 37 %font "GeneralUser.sf2" 128 16 37 amp=72 pan=0 # Jazz Rim Shot Jazz Rim Shot Jazz Rim Shot Jazz Rim Shot Rim Shot 38 %font "GeneralUser.sf2" 128 16 38 amp=71 pan=0 # Power Snare 1 Power Snare 1 Power Snare 1 Power Snare 1 39 %font "GeneralUser.sf2" 128 16 39 amp=129 pan=-16 # Hand Clap 40 %font "GeneralUser.sf2" 128 16 40 amp=86 pan=0 # Power Snare 2 Power Snare 2 Power Snare 2 Power Snare 2 41 %font "GeneralUser.sf2" 128 16 41 amp=102 pan=-47 # Room Tom 1 Room Tom 1 Room Tom 1 Room Tom 1 42 %font "GeneralUser.sf2" 128 16 42 amp=35 pan=31 # Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Soft Hi-Hat Closed Soft Hi-Hat Closed Soft 43 %font "GeneralUser.sf2" 128 16 43 amp=99 pan=-28 # Room Tom 1 Room Tom 1 Room Tom 1 Room Tom 1 44 %font "GeneralUser.sf2" 128 16 44 amp=23 pan=31 # Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Dead Air 45 %font "GeneralUser.sf2" 128 16 45 amp=161 pan=-9 # Room Tom 1 Room Tom 1 Room Tom 1 Room Tom 1 46 %font "GeneralUser.sf2" 128 16 46 amp=41 pan=31 # Hi-Hat Open Hi-Hat Open Attack Hi-Hat Open Attack 47 %font "GeneralUser.sf2" 128 16 47 amp=109 pan=9 # Room Tom 2 Room Tom 2 Room Tom 2 Room Tom 2 48 %font "GeneralUser.sf2" 128 16 48 amp=128 pan=28 # Room Tom 2 Room Tom 2 Room Tom 2 Room Tom 2 49 %font "GeneralUser.sf2" 128 16 49 amp=176 pan=31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 50 %font "GeneralUser.sf2" 128 16 50 amp=56 pan=47 # Room Tom 2 Room Tom 2 Room Tom 2 Room Tom 2 51 %font "GeneralUser.sf2" 128 16 51 amp=77 pan=-31 # Ride Cymbal 52 %font "GeneralUser.sf2" 128 16 52 amp=32 pan=-31 # Chinese Cymbal 53 %font "GeneralUser.sf2" 128 16 53 amp=27 pan=-31 # Ride Bell 54 %font "GeneralUser.sf2" 128 16 54 amp=18 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 16 55 amp=62 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 16 56 amp=106 pan=31 # Cowbell 57 %font "GeneralUser.sf2" 128 16 57 amp=136 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 16 58 amp=80 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 16 59 amp=51 pan=-31 # Ride Cymbal 60 %font "GeneralUser.sf2" 128 16 60 amp=98 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 16 61 amp=78 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 16 62 amp=31 pan=-39 # Conga High Muted 63 %font "GeneralUser.sf2" 128 16 63 amp=108 pan=-39 # Conga High Open 64 %font "GeneralUser.sf2" 128 16 64 amp=75 pan=-31 # Tumba Low 65 %font "GeneralUser.sf2" 128 16 65 amp=82 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 16 66 amp=64 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 16 67 amp=64 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 16 68 amp=71 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 16 69 amp=124 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 16 70 amp=28 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 16 71 amp=37 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 16 72 amp=40 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 16 73 amp=77 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 16 74 amp=44 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 16 75 amp=145 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 16 76 amp=56 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 16 77 amp=64 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 16 78 amp=39 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 16 79 amp=43 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 16 80 amp=46 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 16 81 amp=17 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 16 82 amp=96 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 16 83 amp=71 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 16 84 amp=40 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 16 85 amp=106 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 16 86 amp=61 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 16 87 amp=144 pan=-31 # Surdo Open drumset 24 27 %font "GeneralUser.sf2" 128 24 27 amp=36 pan=-23 # Filter Snap 28 %font "GeneralUser.sf2" 128 24 28 amp=104 pan=31 # Slap 29 %font "GeneralUser.sf2" 128 24 29 amp=52 pan=-16 # Scratch Push 30 %font "GeneralUser.sf2" 128 24 30 amp=106 pan=-16 # Scratch Pull 31 %font "GeneralUser.sf2" 128 24 31 amp=97 pan=0 # Sticks 32 %font "GeneralUser.sf2" 128 24 32 amp=431 pan=-16 # Square Click 33 %font "GeneralUser.sf2" 128 24 33 amp=77 pan=0 # TR-808 Click 34 %font "GeneralUser.sf2" 128 24 34 amp=45 pan=0 # TR-808 Click Carillon-C6 35 %font "GeneralUser.sf2" 128 24 35 amp=213 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 36 %font "GeneralUser.sf2" 128 24 36 amp=297 pan=0 # TR-909 Kick Electric Tom 37 %font "GeneralUser.sf2" 128 24 37 amp=90 pan=0 # Rim Shot 38 %font "GeneralUser.sf2" 128 24 38 amp=182 pan=0 # Electric Tom White Noise 39 %font "GeneralUser.sf2" 128 24 39 amp=67 pan=-16 # Synth Hand Clap 40 %font "GeneralUser.sf2" 128 24 40 amp=57 pan=0 # Power Snare 1 Power Snare 1 Power Snare 1 Power Snare 1 41 %font "GeneralUser.sf2" 128 24 41 amp=118 pan=-47 # Electric Tom 42 %font "GeneralUser.sf2" 128 24 42 amp=58 pan=31 # Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Soft Hi-Hat Closed Soft Hi-Hat Closed Soft 43 %font "GeneralUser.sf2" 128 24 43 amp=82 pan=-28 # Electric Tom 44 %font "GeneralUser.sf2" 128 24 44 amp=32 pan=31 # Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Dead Air 45 %font "GeneralUser.sf2" 128 24 45 amp=82 pan=-9 # Electric Tom 46 %font "GeneralUser.sf2" 128 24 46 amp=31 pan=31 # Hi-Hat Open Hi-Hat Open Attack Hi-Hat Open Attack 47 %font "GeneralUser.sf2" 128 24 47 amp=84 pan=9 # Electric Tom 48 %font "GeneralUser.sf2" 128 24 48 amp=120 pan=28 # Electric Tom 49 %font "GeneralUser.sf2" 128 24 49 amp=176 pan=31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 50 %font "GeneralUser.sf2" 128 24 50 amp=35 pan=47 # Electric Tom 51 %font "GeneralUser.sf2" 128 24 51 amp=62 pan=-31 # Ride Cymbal 52 %font "GeneralUser.sf2" 128 24 52 amp=24 pan=-31 # Reverse Cymbal 53 %font "GeneralUser.sf2" 128 24 53 amp=47 pan=-31 # Ride Bell 54 %font "GeneralUser.sf2" 128 24 54 amp=104 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 24 55 amp=63 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 24 56 amp=104 pan=31 # Cowbell 57 %font "GeneralUser.sf2" 128 24 57 amp=121 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 24 58 amp=34 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 24 59 amp=65 pan=-31 # Ride Cymbal 60 %font "GeneralUser.sf2" 128 24 60 amp=157 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 24 61 amp=75 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 24 62 amp=31 pan=-39 # Conga High Muted 63 %font "GeneralUser.sf2" 128 24 63 amp=68 pan=-39 # Conga High Open 64 %font "GeneralUser.sf2" 128 24 64 amp=49 pan=-31 # Tumba Low 65 %font "GeneralUser.sf2" 128 24 65 amp=82 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 24 66 amp=64 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 24 67 amp=63 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 24 68 amp=71 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 24 69 amp=39 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 24 70 amp=28 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 24 71 amp=37 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 24 72 amp=40 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 24 73 amp=77 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 24 74 amp=43 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 24 75 amp=92 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 24 76 amp=90 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 24 77 amp=63 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 24 78 amp=39 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 24 79 amp=43 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 24 80 amp=44 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 24 81 amp=11 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 24 82 amp=155 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 24 83 amp=71 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 24 84 amp=40 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 24 85 amp=106 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 24 86 amp=61 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 24 87 amp=103 pan=-31 # Surdo Open drumset 25 27 %font "GeneralUser.sf2" 128 25 27 amp=36 pan=-23 # Filter Snap 28 %font "GeneralUser.sf2" 128 25 28 amp=104 pan=31 # Slap 29 %font "GeneralUser.sf2" 128 25 29 amp=43 pan=-16 # TR-909 Scratch Pull 30 %font "GeneralUser.sf2" 128 25 30 amp=57 pan=-16 # TR-909 Scratch Push 31 %font "GeneralUser.sf2" 128 25 31 amp=154 pan=0 # Sticks 32 %font "GeneralUser.sf2" 128 25 32 amp=320 pan=-16 # Square Click 33 %font "GeneralUser.sf2" 128 25 33 amp=77 pan=0 # TR-808 Click 34 %font "GeneralUser.sf2" 128 25 34 amp=45 pan=0 # TR-808 Click Carillon-C6 35 %font "GeneralUser.sf2" 128 25 35 amp=70 pan=0 # Sine-93.75Hz 36 %font "GeneralUser.sf2" 128 25 36 amp=97 pan=0 # TR-909 Kick 37 %font "GeneralUser.sf2" 128 25 37 amp=275 pan=0 # TR-808 Click 38 %font "GeneralUser.sf2" 128 25 38 amp=62 pan=0 # TR-909 Snare 1 39 %font "GeneralUser.sf2" 128 25 39 amp=67 pan=-16 # Synth Hand Clap 40 %font "GeneralUser.sf2" 128 25 40 amp=72 pan=0 # TR-909 Snare 2 41 %font "GeneralUser.sf2" 128 25 41 amp=67 pan=-47 # Sine-750Hz 42 %font "GeneralUser.sf2" 128 25 42 amp=68 pan=31 # TR-808 Hi-Hat 43 %font "GeneralUser.sf2" 128 25 43 amp=69 pan=-28 # Sine-750Hz 44 %font "GeneralUser.sf2" 128 25 44 amp=86 pan=31 # TR-808 Hi-Hat 45 %font "GeneralUser.sf2" 128 25 45 amp=101 pan=-9 # Sine-750Hz 46 %font "GeneralUser.sf2" 128 25 46 amp=38 pan=31 # TR-909 Hi-Hat Open 47 %font "GeneralUser.sf2" 128 25 47 amp=64 pan=9 # Sine-750Hz 48 %font "GeneralUser.sf2" 128 25 48 amp=72 pan=28 # Sine-750Hz 49 %font "GeneralUser.sf2" 128 25 49 amp=76 pan=31 # TR-808 Hi-Hat Crash Cymbal 50 %font "GeneralUser.sf2" 128 25 50 amp=135 pan=47 # Sine-750Hz 51 %font "GeneralUser.sf2" 128 25 51 amp=111 pan=-31 # Ride Cymbal 52 %font "GeneralUser.sf2" 128 25 52 amp=55 pan=-31 # Chinese Cymbal 53 %font "GeneralUser.sf2" 128 25 53 amp=27 pan=-31 # Ride Bell 54 %font "GeneralUser.sf2" 128 25 54 amp=107 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 25 55 amp=55 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 25 56 amp=32 pan=31 # TR-808 Cowbell 57 %font "GeneralUser.sf2" 128 25 57 amp=140 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 25 58 amp=81 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 25 59 amp=50 pan=-31 # Ride Cymbal 60 %font "GeneralUser.sf2" 128 25 60 amp=28 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 25 61 amp=89 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 25 62 amp=33 pan=-39 # Sine-750Hz 63 %font "GeneralUser.sf2" 128 25 63 amp=76 pan=-31 # Sine-750Hz 64 %font "GeneralUser.sf2" 128 25 64 amp=69 pan=-23 # Sine-750Hz 65 %font "GeneralUser.sf2" 128 25 65 amp=82 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 25 66 amp=64 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 25 67 amp=63 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 25 68 amp=71 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 25 69 amp=124 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 25 70 amp=70 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 25 71 amp=37 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 25 72 amp=40 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 25 73 amp=77 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 25 74 amp=116 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 25 75 amp=111 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 25 76 amp=90 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 25 77 amp=62 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 25 78 amp=51 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 25 79 amp=72 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 25 80 amp=36 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 25 81 amp=9 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 25 82 amp=61 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 25 83 amp=71 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 25 84 amp=40 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 25 85 amp=106 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 25 86 amp=62 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 25 87 amp=143 pan=-31 # Surdo Open drumset 26 21 %font "GeneralUser.sf2" 128 26 21 amp=100 pan=0 # WhiteNoiseWave FilterSnap 23 %font "GeneralUser.sf2" 128 26 23 amp=268 pan=0 # FilterSnap WhiteNoiseWave 24 %font "GeneralUser.sf2" 128 26 24 amp=76 pan=0 # WhiteNoiseWave FilterSnap 27 %font "GeneralUser.sf2" 128 26 27 amp=52 pan=-23 # Filter Snap 28 %font "GeneralUser.sf2" 128 26 28 amp=167 pan=31 # Slap 29 %font "GeneralUser.sf2" 128 26 29 amp=52 pan=-16 # Scratch Push 30 %font "GeneralUser.sf2" 128 26 30 amp=66 pan=-16 # Scratch Pull 31 %font "GeneralUser.sf2" 128 26 31 amp=97 pan=0 # Sticks 32 %font "GeneralUser.sf2" 128 26 32 amp=315 pan=-16 # Square Click 33 %font "GeneralUser.sf2" 128 26 33 amp=77 pan=0 # TR-808 Click 34 %font "GeneralUser.sf2" 128 26 34 amp=45 pan=0 # TR-808 Click Carillon-C6 35 %font "GeneralUser.sf2" 128 26 35 amp=236 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 36 %font "GeneralUser.sf2" 128 26 36 amp=94 pan=0 # TR-909 Kick TR-909 Kick 37 %font "GeneralUser.sf2" 128 26 37 amp=90 pan=0 # Rim Shot 38 %font "GeneralUser.sf2" 128 26 38 amp=93 pan=0 # Dance Snare 39 %font "GeneralUser.sf2" 128 26 39 amp=68 pan=-16 # Synth Hand Clap 40 %font "GeneralUser.sf2" 128 26 40 amp=142 pan=0 # TR-909 Snare 2 41 %font "GeneralUser.sf2" 128 26 41 amp=80 pan=-47 # Electric Tom 42 %font "GeneralUser.sf2" 128 26 42 amp=110 pan=31 # TR-808 Hi-Hat 43 %font "GeneralUser.sf2" 128 26 43 amp=81 pan=-28 # Electric Tom 44 %font "GeneralUser.sf2" 128 26 44 amp=35 pan=31 # TR-808 Hi-Hat 45 %font "GeneralUser.sf2" 128 26 45 amp=84 pan=-9 # Electric Tom 46 %font "GeneralUser.sf2" 128 26 46 amp=54 pan=31 # TR-909 Hi-Hat Open 47 %font "GeneralUser.sf2" 128 26 47 amp=83 pan=9 # Electric Tom 48 %font "GeneralUser.sf2" 128 26 48 amp=82 pan=28 # Electric Tom 49 %font "GeneralUser.sf2" 128 26 49 amp=116 pan=31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 50 %font "GeneralUser.sf2" 128 26 50 amp=35 pan=47 # Electric Tom 51 %font "GeneralUser.sf2" 128 26 51 amp=113 pan=-31 # Ride Cymbal 52 %font "GeneralUser.sf2" 128 26 52 amp=69 pan=-31 # Reverse Cymbal 53 %font "GeneralUser.sf2" 128 26 53 amp=62 pan=-31 # Ride Bell 54 %font "GeneralUser.sf2" 128 26 54 amp=64 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 26 55 amp=61 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 26 56 amp=57 pan=31 # Cowbell 57 %font "GeneralUser.sf2" 128 26 57 amp=136 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 26 58 amp=80 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 26 59 amp=51 pan=-31 # Ride Cymbal 60 %font "GeneralUser.sf2" 128 26 60 amp=17 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 26 61 amp=75 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 26 62 amp=31 pan=-39 # Conga High Muted 63 %font "GeneralUser.sf2" 128 26 63 amp=106 pan=-39 # Conga High Open 64 %font "GeneralUser.sf2" 128 26 64 amp=73 pan=-31 # Tumba Low 65 %font "GeneralUser.sf2" 128 26 65 amp=127 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 26 66 amp=98 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 26 67 amp=63 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 26 68 amp=71 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 26 69 amp=40 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 26 70 amp=44 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 26 71 amp=37 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 26 72 amp=40 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 26 73 amp=77 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 26 74 amp=46 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 26 75 amp=145 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 26 76 amp=90 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 26 77 amp=64 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 26 78 amp=51 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 26 79 amp=72 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 26 80 amp=36 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 26 81 amp=9 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 26 82 amp=98 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 26 83 amp=114 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 26 84 amp=39 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 26 85 amp=106 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 26 86 amp=62 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 26 87 amp=101 pan=-31 # Surdo Open drumset 27 29 %font "GeneralUser.sf2" 128 25 29 amp=43 pan=-16 # TR-909 Scratch Pull 30 %font "GeneralUser.sf2" 128 25 30 amp=57 pan=-16 # TR-909 Scratch Push 35 %font "GeneralUser.sf2" 128 25 35 amp=100 pan=0 # Sine-93.75Hz 36 %font "GeneralUser.sf2" 128 25 36 amp=88 pan=0 # TR-909 Kick 37 %font "GeneralUser.sf2" 128 25 37 amp=293 pan=0 # TR-808 Click 38 %font "GeneralUser.sf2" 128 25 38 amp=87 pan=0 # TR-909 Snare 1 39 %font "GeneralUser.sf2" 128 25 39 amp=66 pan=-16 # Synth Hand Clap 40 %font "GeneralUser.sf2" 128 25 40 amp=81 pan=0 # TR-909 Snare 2 41 %font "GeneralUser.sf2" 128 25 41 amp=105 pan=-47 # Sine-750Hz 42 %font "GeneralUser.sf2" 128 25 42 amp=110 pan=31 # TR-808 Hi-Hat 43 %font "GeneralUser.sf2" 128 25 43 amp=135 pan=-28 # Sine-750Hz 44 %font "GeneralUser.sf2" 128 25 44 amp=64 pan=31 # TR-808 Hi-Hat 45 %font "GeneralUser.sf2" 128 25 45 amp=98 pan=-9 # Sine-750Hz 46 %font "GeneralUser.sf2" 128 25 46 amp=34 pan=31 # TR-909 Hi-Hat Open 47 %font "GeneralUser.sf2" 128 25 47 amp=57 pan=9 # Sine-750Hz 48 %font "GeneralUser.sf2" 128 25 48 amp=145 pan=28 # Sine-750Hz 49 %font "GeneralUser.sf2" 128 25 49 amp=97 pan=31 # TR-808 Hi-Hat Crash Cymbal 50 %font "GeneralUser.sf2" 128 25 50 amp=32 pan=47 # Sine-750Hz 51 %font "GeneralUser.sf2" 128 25 51 amp=113 pan=-31 # Ride Cymbal 52 %font "GeneralUser.sf2" 128 25 52 amp=54 pan=-31 # Chinese Cymbal 53 %font "GeneralUser.sf2" 128 25 53 amp=27 pan=-31 # Ride Bell 54 %font "GeneralUser.sf2" 128 25 54 amp=33 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 25 55 amp=89 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 25 56 amp=96 pan=31 # TR-808 Cowbell 57 %font "GeneralUser.sf2" 128 25 57 amp=141 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 25 58 amp=58 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 25 59 amp=49 pan=-31 # Ride Cymbal 60 %font "GeneralUser.sf2" 128 25 60 amp=129 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 25 61 amp=89 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 25 62 amp=33 pan=-39 # Sine-750Hz 63 %font "GeneralUser.sf2" 128 25 63 amp=81 pan=-39 # Sine-750Hz 64 %font "GeneralUser.sf2" 128 25 64 amp=102 pan=-31 # Sine-750Hz 65 %font "GeneralUser.sf2" 128 25 65 amp=82 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 25 66 amp=64 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 25 67 amp=63 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 25 68 amp=71 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 25 69 amp=122 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 25 70 amp=126 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 25 71 amp=37 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 25 72 amp=40 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 25 73 amp=77 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 25 74 amp=116 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 25 75 amp=64 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 25 76 amp=56 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 25 77 amp=62 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 25 78 amp=51 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 25 79 amp=72 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 25 80 amp=163 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 25 81 amp=46 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 25 82 amp=98 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 25 83 amp=71 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 25 84 amp=41 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 25 85 amp=106 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 25 86 amp=63 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 25 87 amp=144 pan=-31 # Surdo Open drumset 28 29 %font "GeneralUser.sf2" 128 25 29 amp=44 pan=-16 # TR-909 Scratch Pull 30 %font "GeneralUser.sf2" 128 25 30 amp=91 pan=-16 # TR-909 Scratch Push 35 %font "GeneralUser.sf2" 128 25 35 amp=100 pan=0 # Sine-93.75Hz 36 %font "GeneralUser.sf2" 128 25 36 amp=85 pan=0 # TR-909 Kick 37 %font "GeneralUser.sf2" 128 25 37 amp=293 pan=0 # TR-808 Click 38 %font "GeneralUser.sf2" 128 25 38 amp=84 pan=0 # TR-909 Snare 1 39 %font "GeneralUser.sf2" 128 25 39 amp=66 pan=-16 # Synth Hand Clap 40 %font "GeneralUser.sf2" 128 25 40 amp=110 pan=0 # TR-909 Snare 2 41 %font "GeneralUser.sf2" 128 25 41 amp=126 pan=-47 # Sine-750Hz 42 %font "GeneralUser.sf2" 128 25 42 amp=76 pan=31 # TR-808 Hi-Hat 43 %font "GeneralUser.sf2" 128 25 43 amp=64 pan=-28 # Sine-750Hz 44 %font "GeneralUser.sf2" 128 25 44 amp=64 pan=31 # TR-808 Hi-Hat 45 %font "GeneralUser.sf2" 128 25 45 amp=62 pan=-9 # Sine-750Hz 46 %font "GeneralUser.sf2" 128 25 46 amp=47 pan=31 # TR-909 Hi-Hat Open 47 %font "GeneralUser.sf2" 128 25 47 amp=58 pan=9 # Sine-750Hz 48 %font "GeneralUser.sf2" 128 25 48 amp=86 pan=28 # Sine-750Hz 49 %font "GeneralUser.sf2" 128 25 49 amp=75 pan=31 # TR-808 Hi-Hat Crash Cymbal 50 %font "GeneralUser.sf2" 128 25 50 amp=67 pan=47 # Sine-750Hz 51 %font "GeneralUser.sf2" 128 25 51 amp=113 pan=-31 # Ride Cymbal 52 %font "GeneralUser.sf2" 128 25 52 amp=54 pan=-31 # Chinese Cymbal 53 %font "GeneralUser.sf2" 128 25 53 amp=44 pan=-31 # Ride Bell 54 %font "GeneralUser.sf2" 128 25 54 amp=107 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 25 55 amp=90 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 25 56 amp=59 pan=31 # TR-808 Cowbell 57 %font "GeneralUser.sf2" 128 25 57 amp=140 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 25 58 amp=58 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 25 59 amp=50 pan=-31 # Ride Cymbal 60 %font "GeneralUser.sf2" 128 25 60 amp=28 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 25 61 amp=89 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 25 62 amp=52 pan=-39 # Sine-750Hz 63 %font "GeneralUser.sf2" 128 25 63 amp=76 pan=-39 # Sine-750Hz 64 %font "GeneralUser.sf2" 128 25 64 amp=72 pan=-31 # Sine-750Hz 65 %font "GeneralUser.sf2" 128 25 65 amp=82 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 25 66 amp=98 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 25 67 amp=64 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 25 68 amp=113 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 25 69 amp=40 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 25 70 amp=78 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 25 71 amp=37 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 25 72 amp=40 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 25 73 amp=77 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 25 74 amp=116 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 25 75 amp=98 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 25 76 amp=56 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 25 77 amp=64 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 25 78 amp=51 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 25 79 amp=72 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 25 80 amp=157 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 25 81 amp=46 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 25 82 amp=61 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 25 83 amp=114 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 25 84 amp=61 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 25 85 amp=106 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 25 86 amp=64 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 25 87 amp=104 pan=-31 # Surdo Open drumset 29 29 %font "GeneralUser.sf2" 128 25 29 amp=71 pan=-16 # TR-909 Scratch Pull 30 %font "GeneralUser.sf2" 128 25 30 amp=91 pan=-16 # TR-909 Scratch Push 35 %font "GeneralUser.sf2" 128 25 35 amp=90 pan=0 # Sine-93.75Hz 36 %font "GeneralUser.sf2" 128 25 36 amp=90 pan=0 # TR-909 Kick 37 %font "GeneralUser.sf2" 128 25 37 amp=124 pan=0 # TR-808 Click 38 %font "GeneralUser.sf2" 128 25 38 amp=235 pan=0 # TR-909 Snare 1 39 %font "GeneralUser.sf2" 128 25 39 amp=66 pan=-16 # Synth Hand Clap 40 %font "GeneralUser.sf2" 128 25 40 amp=141 pan=0 # TR-909 Snare 2 41 %font "GeneralUser.sf2" 128 25 41 amp=105 pan=-47 # Sine-750Hz 42 %font "GeneralUser.sf2" 128 25 42 amp=67 pan=31 # TR-808 Hi-Hat 43 %font "GeneralUser.sf2" 128 25 43 amp=105 pan=-28 # Sine-750Hz 44 %font "GeneralUser.sf2" 128 25 44 amp=31 pan=31 # TR-808 Hi-Hat 45 %font "GeneralUser.sf2" 128 25 45 amp=105 pan=-9 # Sine-750Hz 46 %font "GeneralUser.sf2" 128 25 46 amp=34 pan=31 # TR-909 Hi-Hat Open 47 %font "GeneralUser.sf2" 128 25 47 amp=44 pan=9 # Sine-750Hz 48 %font "GeneralUser.sf2" 128 25 48 amp=51 pan=28 # Sine-750Hz 49 %font "GeneralUser.sf2" 128 25 49 amp=144 pan=31 # TR-808 Hi-Hat Crash Cymbal 50 %font "GeneralUser.sf2" 128 25 50 amp=91 pan=47 # Sine-750Hz 51 %font "GeneralUser.sf2" 128 25 51 amp=142 pan=-31 # Ride Cymbal 52 %font "GeneralUser.sf2" 128 25 52 amp=50 pan=-31 # Chinese Cymbal 53 %font "GeneralUser.sf2" 128 25 53 amp=44 pan=-31 # Ride Bell 54 %font "GeneralUser.sf2" 128 25 54 amp=107 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 25 55 amp=61 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 25 56 amp=32 pan=31 # TR-808 Cowbell 57 %font "GeneralUser.sf2" 128 25 57 amp=119 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 25 58 amp=34 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 25 59 amp=49 pan=-31 # Ride Cymbal 60 %font "GeneralUser.sf2" 128 25 60 amp=17 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 25 61 amp=75 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 25 62 amp=16 pan=-39 # Sine-750Hz 63 %font "GeneralUser.sf2" 128 25 63 amp=76 pan=-39 # Sine-750Hz 64 %font "GeneralUser.sf2" 128 25 64 amp=56 pan=-31 # Sine-750Hz 65 %font "GeneralUser.sf2" 128 25 65 amp=127 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 25 66 amp=63 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 25 67 amp=63 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 25 68 amp=71 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 25 69 amp=39 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 25 70 amp=70 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 25 71 amp=37 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 25 72 amp=40 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 25 73 amp=77 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 25 74 amp=46 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 25 75 amp=92 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 25 76 amp=56 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 25 77 amp=101 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 25 78 amp=80 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 25 79 amp=73 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 25 80 amp=36 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 25 81 amp=9 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 25 82 amp=61 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 25 83 amp=71 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 25 84 amp=39 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 25 85 amp=106 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 25 86 amp=96 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 25 87 amp=103 pan=-31 # Surdo Open drumset 30 29 %font "GeneralUser.sf2" 128 25 29 amp=44 pan=-16 # TR-909 Scratch Pull 30 %font "GeneralUser.sf2" 128 25 30 amp=91 pan=-16 # TR-909 Scratch Push 35 %font "GeneralUser.sf2" 128 25 35 amp=74 pan=0 # Sine-93.75Hz 36 %font "GeneralUser.sf2" 128 25 36 amp=132 pan=0 # TR-909 Kick 37 %font "GeneralUser.sf2" 128 25 37 amp=304 pan=0 # TR-808 Click 38 %font "GeneralUser.sf2" 128 25 38 amp=136 pan=0 # TR-909 Snare 1 39 %font "GeneralUser.sf2" 128 25 39 amp=45 pan=-16 # Synth Hand Clap 40 %font "GeneralUser.sf2" 128 25 40 amp=48 pan=0 # TR-909 Snare 2 41 %font "GeneralUser.sf2" 128 25 41 amp=81 pan=-47 # Sine-750Hz 42 %font "GeneralUser.sf2" 128 25 42 amp=44 pan=31 # TR-808 Hi-Hat 43 %font "GeneralUser.sf2" 128 25 43 amp=72 pan=-28 # Sine-750Hz 44 %font "GeneralUser.sf2" 128 25 44 amp=42 pan=31 # TR-808 Hi-Hat 45 %font "GeneralUser.sf2" 128 25 45 amp=68 pan=-9 # Sine-750Hz 46 %font "GeneralUser.sf2" 128 25 46 amp=31 pan=31 # TR-909 Hi-Hat Open 47 %font "GeneralUser.sf2" 128 25 47 amp=43 pan=9 # Sine-750Hz 48 %font "GeneralUser.sf2" 128 25 48 amp=46 pan=28 # Sine-750Hz 49 %font "GeneralUser.sf2" 128 25 49 amp=90 pan=31 # TR-808 Hi-Hat Crash Cymbal 50 %font "GeneralUser.sf2" 128 25 50 amp=86 pan=47 # Sine-750Hz 51 %font "GeneralUser.sf2" 128 25 51 amp=142 pan=-31 # Ride Cymbal 52 %font "GeneralUser.sf2" 128 25 52 amp=70 pan=-31 # Chinese Cymbal 53 %font "GeneralUser.sf2" 128 25 53 amp=46 pan=-31 # Ride Bell 54 %font "GeneralUser.sf2" 128 25 54 amp=108 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 25 55 amp=62 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 25 56 amp=52 pan=31 # TR-808 Cowbell 57 %font "GeneralUser.sf2" 128 25 57 amp=122 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 25 58 amp=34 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 25 59 amp=50 pan=-31 # Ride Cymbal 60 %font "GeneralUser.sf2" 128 25 60 amp=99 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 25 61 amp=77 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 25 62 amp=15 pan=-39 # Sine-750Hz 63 %font "GeneralUser.sf2" 128 25 63 amp=75 pan=-39 # Sine-750Hz 64 %font "GeneralUser.sf2" 128 25 64 amp=53 pan=-31 # Sine-750Hz 65 %font "GeneralUser.sf2" 128 25 65 amp=82 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 25 66 amp=65 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 25 67 amp=63 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 25 68 amp=113 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 25 69 amp=123 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 25 70 amp=70 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 25 71 amp=37 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 25 72 amp=40 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 25 73 amp=77 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 25 74 amp=117 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 25 75 amp=82 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 25 76 amp=91 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 25 77 amp=101 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 25 78 amp=80 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 25 79 amp=73 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 25 80 amp=36 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 25 81 amp=9 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 25 82 amp=61 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 25 83 amp=114 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 25 84 amp=60 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 25 85 amp=106 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 25 86 amp=65 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 25 87 amp=144 pan=-31 # Surdo Open drumset 32 27 %font "GeneralUser.sf2" 128 32 27 amp=36 pan=-23 # Filter Snap 28 %font "GeneralUser.sf2" 128 32 28 amp=104 pan=31 # Slap 29 %font "GeneralUser.sf2" 128 32 29 amp=71 pan=-16 # Scratch Push 30 %font "GeneralUser.sf2" 128 32 30 amp=80 pan=-16 # Scratch Pull 31 %font "GeneralUser.sf2" 128 32 31 amp=97 pan=0 # Sticks 32 %font "GeneralUser.sf2" 128 32 32 amp=433 pan=-16 # Square Click 33 %font "GeneralUser.sf2" 128 32 33 amp=76 pan=0 # TR-808 Click 34 %font "GeneralUser.sf2" 128 32 34 amp=45 pan=0 # TR-808 Click Carillon-C6 35 %font "GeneralUser.sf2" 128 32 35 amp=169 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 36 %font "GeneralUser.sf2" 128 32 36 amp=156 pan=0 # Jazz Bass Drum Jazz Bass Drum Jazz Bass Drum Jazz Bass Drum Standard Kick 1 Standard Kick 1 Standard Kick 1 37 %font "GeneralUser.sf2" 128 32 37 amp=115 pan=0 # Jazz Rim Shot Jazz Rim Shot Jazz Rim Shot Jazz Rim Shot Rim Shot 38 %font "GeneralUser.sf2" 128 32 38 amp=95 pan=0 # Jazz Snare Soft 1 Jazz Snare Soft 1 Jazz Snare Soft 2 Jazz Snare Hard Jazz Snare Hard 39 %font "GeneralUser.sf2" 128 32 39 amp=92 pan=-16 # Hand Clap 40 %font "GeneralUser.sf2" 128 32 40 amp=132 pan=0 # Brush Snare Brush Snare Brush Snare Standard Snare 2 Standard Snare 2 Standard Snare 2 41 %font "GeneralUser.sf2" 128 32 41 amp=123 pan=-47 # Standard Tom 5 Standard Tom 5 Standard Tom 5 Standard Tom 5 Standard Tom 5 42 %font "GeneralUser.sf2" 128 32 42 amp=37 pan=31 # Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Soft Hi-Hat Closed Soft Hi-Hat Closed Soft 43 %font "GeneralUser.sf2" 128 32 43 amp=131 pan=-28 # Standard Tom 5 Standard Tom 5 Standard Tom 5 Standard Tom 5 Standard Tom 5 44 %font "GeneralUser.sf2" 128 32 44 amp=50 pan=31 # Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Dead Air 45 %font "GeneralUser.sf2" 128 32 45 amp=118 pan=-9 # Standard Tom 4 Standard Tom 4 Standard Tom 4 Standard Tom 4 Standard Tom 4 46 %font "GeneralUser.sf2" 128 32 46 amp=30 pan=31 # Hi-Hat Open Hi-Hat Open Attack Hi-Hat Open Attack 47 %font "GeneralUser.sf2" 128 32 47 amp=97 pan=9 # Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 48 %font "GeneralUser.sf2" 128 32 48 amp=84 pan=28 # Standard Tom 2 Standard Tom 2 Standard Tom 2 Standard Tom 2 Standard Tom 2 49 %font "GeneralUser.sf2" 128 32 49 amp=176 pan=31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 50 %font "GeneralUser.sf2" 128 32 50 amp=50 pan=47 # Standard Tom 1 Standard Tom 1 Standard Tom 1 Standard Tom 1 Standard Tom 1 51 %font "GeneralUser.sf2" 128 32 51 amp=73 pan=-31 # Ride Cymbal 52 %font "GeneralUser.sf2" 128 32 52 amp=32 pan=-31 # Chinese Cymbal 53 %font "GeneralUser.sf2" 128 32 53 amp=27 pan=-31 # Ride Bell 54 %font "GeneralUser.sf2" 128 32 54 amp=68 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 32 55 amp=55 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 32 56 amp=103 pan=31 # Cowbell 57 %font "GeneralUser.sf2" 128 32 57 amp=136 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 32 58 amp=81 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 32 59 amp=69 pan=-31 # Ride Cymbal 60 %font "GeneralUser.sf2" 128 32 60 amp=98 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 32 61 amp=77 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 32 62 amp=31 pan=-39 # Conga High Muted 63 %font "GeneralUser.sf2" 128 32 63 amp=68 pan=-39 # Conga High Open 64 %font "GeneralUser.sf2" 128 32 64 amp=74 pan=-31 # Tumba Low 65 %font "GeneralUser.sf2" 128 32 65 amp=127 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 32 66 amp=64 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 32 67 amp=63 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 32 68 amp=71 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 32 69 amp=39 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 32 70 amp=28 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 32 71 amp=60 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 32 72 amp=65 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 32 73 amp=77 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 32 74 amp=43 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 32 75 amp=92 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 32 76 amp=56 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 32 77 amp=64 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 32 78 amp=39 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 32 79 amp=43 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 32 80 amp=45 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 32 81 amp=11 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 32 82 amp=96 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 32 83 amp=71 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 32 84 amp=40 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 32 85 amp=162 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 32 86 amp=67 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 32 87 amp=98 pan=-31 # Surdo Open drumset 40 27 %font "GeneralUser.sf2" 128 40 27 amp=36 pan=-23 # Filter Snap 28 %font "GeneralUser.sf2" 128 40 28 amp=104 pan=31 # Slap 29 %font "GeneralUser.sf2" 128 40 29 amp=44 pan=-16 # Scratch Push 30 %font "GeneralUser.sf2" 128 40 30 amp=50 pan=-16 # Scratch Pull 31 %font "GeneralUser.sf2" 128 40 31 amp=155 pan=0 # Sticks 32 %font "GeneralUser.sf2" 128 40 32 amp=436 pan=-16 # Square Click 33 %font "GeneralUser.sf2" 128 40 33 amp=121 pan=0 # TR-808 Click 34 %font "GeneralUser.sf2" 128 40 34 amp=45 pan=0 # TR-808 Click Carillon-C6 35 %font "GeneralUser.sf2" 128 40 35 amp=133 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 36 %font "GeneralUser.sf2" 128 40 36 amp=104 pan=0 # Jazz Bass Drum Jazz Bass Drum Jazz Bass Drum Jazz Bass Drum Standard Kick 1 Standard Kick 1 Standard Kick 1 37 %font "GeneralUser.sf2" 128 40 37 amp=72 pan=0 # Jazz Rim Shot Jazz Rim Shot Jazz Rim Shot Jazz Rim Shot Rim Shot 38 %font "GeneralUser.sf2" 128 40 38 amp=37 pan=0 # Brush Snare Brush Snare Brush Snare 39 %font "GeneralUser.sf2" 128 40 39 amp=90 pan=0 # Brush Snare Brush Snare Brush Snare Standard Snare 2 Standard Snare 2 Standard Snare 2 40 %font "GeneralUser.sf2" 128 40 40 amp=16 pan=0 # Brush Swirl 41 %font "GeneralUser.sf2" 128 40 41 amp=138 pan=-47 # Brushed Tom Brushed Tom Brushed Tom Brushed Tom 42 %font "GeneralUser.sf2" 128 40 42 amp=36 pan=31 # Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Soft Hi-Hat Closed Soft Hi-Hat Closed Soft 43 %font "GeneralUser.sf2" 128 40 43 amp=111 pan=-28 # Brushed Tom Brushed Tom Brushed Tom Brushed Tom 44 %font "GeneralUser.sf2" 128 40 44 amp=31 pan=31 # Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Dead Air 45 %font "GeneralUser.sf2" 128 40 45 amp=157 pan=-9 # Brushed Tom Brushed Tom Brushed Tom Brushed Tom 46 %font "GeneralUser.sf2" 128 40 46 amp=39 pan=31 # Hi-Hat Open Hi-Hat Open Attack Hi-Hat Open Attack 47 %font "GeneralUser.sf2" 128 40 47 amp=104 pan=9 # Brushed Tom Brushed Tom Brushed Tom Brushed Tom 48 %font "GeneralUser.sf2" 128 40 48 amp=101 pan=28 # Brushed Tom Brushed Tom Brushed Tom Brushed Tom 49 %font "GeneralUser.sf2" 128 40 49 amp=183 pan=31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 50 %font "GeneralUser.sf2" 128 40 50 amp=54 pan=47 # Brushed Tom Brushed Tom Brushed Tom Brushed Tom 51 %font "GeneralUser.sf2" 128 40 51 amp=49 pan=-31 # Ride Cymbal 52 %font "GeneralUser.sf2" 128 40 52 amp=71 pan=-31 # Chinese Cymbal 53 %font "GeneralUser.sf2" 128 40 53 amp=110 pan=-31 # Ride Bell 54 %font "GeneralUser.sf2" 128 40 54 amp=19 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 40 55 amp=55 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 40 56 amp=106 pan=31 # Cowbell 57 %font "GeneralUser.sf2" 128 40 57 amp=121 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 40 58 amp=34 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 40 59 amp=60 pan=-31 # Ride Cymbal 60 %font "GeneralUser.sf2" 128 40 60 amp=98 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 40 61 amp=78 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 40 62 amp=31 pan=-39 # Conga High Muted 63 %font "GeneralUser.sf2" 128 40 63 amp=69 pan=-39 # Conga High Open 64 %font "GeneralUser.sf2" 128 40 64 amp=48 pan=-31 # Tumba Low 65 %font "GeneralUser.sf2" 128 40 65 amp=82 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 40 66 amp=98 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 40 67 amp=63 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 40 68 amp=71 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 40 69 amp=40 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 40 70 amp=28 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 40 71 amp=37 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 40 72 amp=65 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 40 73 amp=77 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 40 74 amp=43 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 40 75 amp=92 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 40 76 amp=56 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 40 77 amp=63 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 40 78 amp=39 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 40 79 amp=43 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 40 80 amp=46 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 40 81 amp=11 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 40 82 amp=96 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 40 83 amp=71 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 40 84 amp=40 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 40 85 amp=162 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 40 86 amp=67 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 40 87 amp=144 pan=-31 # Surdo Open drumset 48 27 %font "GeneralUser.sf2" 128 48 27 amp=38 pan=31 # Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Soft Hi-Hat Closed Soft Hi-Hat Closed Soft 28 %font "GeneralUser.sf2" 128 48 28 amp=63 pan=31 # Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal 29 %font "GeneralUser.sf2" 128 48 29 amp=31 pan=31 # Hi-Hat Open Hi-Hat Open Attack Hi-Hat Open Attack 30 %font "GeneralUser.sf2" 128 48 30 amp=52 pan=-31 # Ride Cymbal 31 %font "GeneralUser.sf2" 128 48 31 amp=23 pan=0 # Sticks 32 %font "GeneralUser.sf2" 128 48 32 amp=351 pan=-16 # Square Click 33 %font "GeneralUser.sf2" 128 48 33 amp=61 pan=0 # TR-808 Click 34 %font "GeneralUser.sf2" 128 48 34 amp=37 pan=0 # TR-808 Click Carillon-C6 35 %font "GeneralUser.sf2" 128 48 35 amp=154 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 36 %font "GeneralUser.sf2" 128 48 36 amp=67 pan=0 # Taiko Drum Timpani Hard Timpani Hard Timpani Hard Timpani Hard 37 %font "GeneralUser.sf2" 128 48 37 amp=16 pan=0 # Rim Shot 38 %font "GeneralUser.sf2" 128 48 38 amp=55 pan=-31 # Orchestral Snare Orchestral Snare Orchestral Snare Orchestral Snare 39 %font "GeneralUser.sf2" 128 48 39 amp=70 pan=-47 # Castanets 40 %font "GeneralUser.sf2" 128 48 40 amp=55 pan=0 # Orchestral Snare Orchestral Snare Orchestral Snare Orchestral Snare 41 %font "GeneralUser.sf2" 128 48 41 amp=200 pan=-47 # Timpani Hard Timpani Hard Timpani Hard Timpani Soft Timpani Soft Timpani Hard Timpani Hard Timpani Soft 42 %font "GeneralUser.sf2" 0 47 amp=197 pan=-47 43 %font "GeneralUser.sf2" 0 47 amp=123 pan=-47 44 %font "GeneralUser.sf2" 0 47 amp=191 pan=-47 45 %font "GeneralUser.sf2" 0 47 amp=112 pan=-47 46 %font "GeneralUser.sf2" 0 47 amp=181 pan=-47 47 %font "GeneralUser.sf2" 0 47 amp=108 pan=-47 48 %font "GeneralUser.sf2" 0 47 amp=168 pan=-47 49 %font "GeneralUser.sf2" 0 47 amp=166 pan=-47 50 %font "GeneralUser.sf2" 0 47 amp=159 pan=-47 51 %font "GeneralUser.sf2" 0 47 amp=93 pan=-47 52 %font "GeneralUser.sf2" 0 47 amp=91 pan=-47 53 %font "GeneralUser.sf2" 0 47 amp=89 pan=-47 54 %font "GeneralUser.sf2" 128 48 54 amp=72 pan=16 # Tambourine 55 %font "GeneralUser.sf2" 128 48 55 amp=63 pan=-16 # Splash Cymbal 56 %font "GeneralUser.sf2" 128 48 56 amp=95 pan=31 # Cowbell 57 %font "GeneralUser.sf2" 128 48 57 amp=122 pan=-31 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 58 %font "GeneralUser.sf2" 128 48 58 amp=27 pan=-55 # Vibra Slap 59 %font "GeneralUser.sf2" 128 48 59 amp=99 pan=-47 # Orchestral Cymbal 60 %font "GeneralUser.sf2" 128 48 60 amp=16 pan=55 # Bongo Rim 61 %font "GeneralUser.sf2" 128 48 61 amp=115 pan=55 # Bongo Tone 62 %font "GeneralUser.sf2" 128 48 62 amp=43 pan=-39 # Conga High Muted 63 %font "GeneralUser.sf2" 128 48 63 amp=66 pan=-39 # Conga High Open 64 %font "GeneralUser.sf2" 128 48 64 amp=48 pan=-31 # Tumba Low 65 %font "GeneralUser.sf2" 128 48 65 amp=66 pan=31 # Timbale Rim 66 %font "GeneralUser.sf2" 128 48 66 amp=53 pan=31 # Timbale Low 67 %font "GeneralUser.sf2" 128 48 67 amp=91 pan=-55 # Agogo Agogo Agogo 68 %font "GeneralUser.sf2" 128 48 68 amp=101 pan=-55 # Agogo Agogo Agogo 69 %font "GeneralUser.sf2" 128 48 69 amp=30 pan=-55 # Cabasa 70 %font "GeneralUser.sf2" 128 48 70 amp=24 pan=-63 # Maracas 71 %font "GeneralUser.sf2" 128 48 71 amp=28 pan=55 # Whistle Short 72 %font "GeneralUser.sf2" 128 48 72 amp=29 pan=55 # Whistle Long 73 %font "GeneralUser.sf2" 128 48 73 amp=58 pan=47 # Guiro Short 74 %font "GeneralUser.sf2" 128 48 74 amp=65 pan=47 # Guiro Long 75 %font "GeneralUser.sf2" 128 48 75 amp=72 pan=31 # Claves 76 %font "GeneralUser.sf2" 128 48 76 amp=43 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 77 %font "GeneralUser.sf2" 128 48 77 amp=48 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 78 %font "GeneralUser.sf2" 128 48 78 amp=32 pan=-31 # Cuica Mute 79 %font "GeneralUser.sf2" 128 48 79 amp=35 pan=-31 # Cuica Open 80 %font "GeneralUser.sf2" 128 48 80 amp=36 pan=-63 # Triangle (Perc) 81 %font "GeneralUser.sf2" 128 48 81 amp=14 pan=-63 # Triangle (Perc) 82 %font "GeneralUser.sf2" 128 48 82 amp=71 pan=47 # Shaker 83 %font "GeneralUser.sf2" 128 48 83 amp=54 pan=55 # Jingle Bell 84 %font "GeneralUser.sf2" 128 48 84 amp=32 pan=63 # Bell Tree 85 %font "GeneralUser.sf2" 128 48 85 amp=81 pan=-47 # Castanets 86 %font "GeneralUser.sf2" 128 48 86 amp=52 pan=-31 # Surdo Muted 87 %font "GeneralUser.sf2" 128 48 87 amp=118 pan=-31 # Surdo Open 88 %font "GeneralUser.sf2" 128 48 88 amp=55 pan=0 # Applause drumset 49 30 %font "GeneralUser.sf2" 128 0 38 amp=109 pan=-31 # Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Jazz Snare Soft 1 Jazz Snare Soft 1 31 %font "GeneralUser.sf2" 128 0 49 amp=110 pan=-47 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 32 %font "GeneralUser.sf2" 128 0 35 amp=27 pan=-63 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 33 %font "GeneralUser.sf2" 0 116 amp=42 pan=55 36 %font "GeneralUser.sf2" 128 0 47 amp=110 pan=0 # Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 38 %font "GeneralUser.sf2" 128 0 47 amp=216 pan=-31 # Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 39 %font "GeneralUser.sf2" 128 0 47 amp=100 pan=63 # Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 40 %font "GeneralUser.sf2" 128 0 47 amp=75 pan=63 # Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 41 %font "GeneralUser.sf2" 128 0 47 amp=140 pan=31 # Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 42 %font "GeneralUser.sf2" 128 0 63 amp=59 pan=47 # Conga High Open 43 %font "GeneralUser.sf2" 128 0 64 amp=81 pan=47 # Tumba Low 44 %font "GeneralUser.sf2" 128 0 47 amp=152 pan=63 # Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 49 %font "GeneralUser.sf2" 128 0 52 amp=45 pan=-47 # Chinese Cymbal 50 %font "GeneralUser.sf2" 128 0 52 amp=177 pan=31 # Chinese Cymbal 51 %font "GeneralUser.sf2" 128 0 47 amp=247 pan=47 # Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 52 %font "GeneralUser.sf2" 128 0 47 amp=260 pan=47 # Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 54 %font "GeneralUser.sf2" 128 0 64 amp=60 pan=23 # Tumba Low 55 %font "GeneralUser.sf2" 128 0 64 amp=55 pan=47 # Tumba Low 56 %font "GeneralUser.sf2" 128 0 64 amp=30 pan=47 # Tumba Low 57 %font "GeneralUser.sf2" 128 0 60 amp=97 pan=-47 # Bongo Rim 58 %font "GeneralUser.sf2" 128 0 61 amp=56 pan=-47 # Bongo Tone 59 %font "GeneralUser.sf2" 128 0 63 amp=27 pan=-47 # Conga High Open 60 %font "GeneralUser.sf2" 128 0 64 amp=55 pan=-47 # Tumba Low 61 %font "GeneralUser.sf2" 128 0 62 amp=99 pan=-31 # Conga High Muted 62 %font "GeneralUser.sf2" 128 0 47 amp=159 pan=31 # Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 63 %font "GeneralUser.sf2" 128 0 47 amp=175 pan=31 # Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 Standard Tom 3 64 %font "GeneralUser.sf2" 128 0 64 amp=23 pan=-16 # Tumba Low 65 %font "GeneralUser.sf2" 128 0 60 amp=203 pan=-31 # Bongo Rim 67 %font "GeneralUser.sf2" 128 0 66 amp=76 pan=31 # Timbale Low 68 %font "GeneralUser.sf2" 128 0 66 amp=28 pan=39 # Timbale Low 69 %font "GeneralUser.sf2" 128 0 65 amp=69 pan=39 # Timbale Rim 70 %font "GeneralUser.sf2" 128 0 56 amp=74 pan=31 # Cowbell 71 %font "GeneralUser.sf2" 128 0 60 amp=93 pan=55 # Bongo Rim 72 %font "GeneralUser.sf2" 128 0 61 amp=91 pan=47 # Bongo Tone 73 %font "GeneralUser.sf2" 128 0 62 amp=58 pan=-31 # Conga High Muted 74 %font "GeneralUser.sf2" 128 0 63 amp=139 pan=-31 # Conga High Open 75 %font "GeneralUser.sf2" 128 0 64 amp=29 pan=-39 # Tumba Low 76 %font "GeneralUser.sf2" 128 0 64 amp=48 pan=-39 # Tumba Low 77 %font "GeneralUser.sf2" 128 0 64 amp=50 pan=-39 # Tumba Low 78 %font "GeneralUser.sf2" 128 0 64 amp=64 pan=-39 # Tumba Low 79 %font "GeneralUser.sf2" 0 116 amp=125 pan=63 80 %font "GeneralUser.sf2" 0 116 amp=56 pan=63 81 %font "GeneralUser.sf2" 0 116 amp=96 pan=-31 82 %font "GeneralUser.sf2" 0 116 amp=66 pan=-31 83 %font "GeneralUser.sf2" 128 0 54 amp=186 pan=8 # Tambourine 84 %font "GeneralUser.sf2" 128 0 67 amp=56 pan=-55 # Agogo Agogo Agogo 85 %font "GeneralUser.sf2" 128 0 68 amp=63 pan=-55 # Agogo Agogo Agogo 87 %font "GeneralUser.sf2" 128 0 71 amp=70 pan=55 # Whistle Short 88 %font "GeneralUser.sf2" 128 0 72 amp=39 pan=55 # Whistle Long 89 %font "GeneralUser.sf2" 128 0 78 amp=36 pan=-31 # Cuica Mute 90 %font "GeneralUser.sf2" 128 0 79 amp=39 pan=-31 # Cuica Open 91 %font "GeneralUser.sf2" 128 0 80 amp=43 pan=-63 # Triangle (Perc) 92 %font "GeneralUser.sf2" 128 0 81 amp=24 pan=-63 # Triangle (Perc) 93 %font "GeneralUser.sf2" 128 0 73 amp=63 pan=47 # Guiro Short 94 %font "GeneralUser.sf2" 128 0 74 amp=33 pan=47 # Guiro Long 95 %font "GeneralUser.sf2" 128 0 69 amp=44 pan=-55 # Cabasa 96 %font "GeneralUser.sf2" 128 0 69 amp=65 pan=-55 # Cabasa 97 %font "GeneralUser.sf2" 128 0 75 amp=65 pan=31 # Claves 98 %font "GeneralUser.sf2" 128 0 76 amp=79 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard 99 %font "GeneralUser.sf2" 128 0 77 amp=88 pan=55 # Wood Block Med Wood Block Med Wood Block Med Wood Block Med Wood Block Hard Wood Block Hard Wood Block Hard drumset 50 25 %font "GeneralUser.sf2" 128 25 36 amp=88 pan=0 # TR-909 Kick 26 %font "GeneralUser.sf2" 128 25 35 amp=186 pan=0 # Sine-93.75Hz 27 %font "GeneralUser.sf2" 128 25 36 amp=82 pan=0 # TR-909 Kick 28 %font "GeneralUser.sf2" 128 25 36 amp=90 pan=0 # TR-909 Kick 29 %font "GeneralUser.sf2" 128 25 36 amp=80 pan=0 # TR-909 Kick 30 %font "GeneralUser.sf2" 128 25 36 amp=112 pan=0 # TR-909 Kick 31 %font "GeneralUser.sf2" 128 25 35 amp=311 pan=0 # Sine-93.75Hz 32 %font "GeneralUser.sf2" 128 25 36 amp=106 pan=0 # TR-909 Kick 33 %font "GeneralUser.sf2" 128 25 35 amp=160 pan=0 # Sine-93.75Hz 34 %font "GeneralUser.sf2" 128 25 36 amp=59 pan=0 # TR-909 Kick 35 %font "GeneralUser.sf2" 128 25 35 amp=67 pan=0 # Sine-93.75Hz 36 %font "GeneralUser.sf2" 128 25 36 amp=93 pan=0 # TR-909 Kick 37 %font "GeneralUser.sf2" 128 25 35 amp=323 pan=0 # Sine-93.75Hz 38 %font "GeneralUser.sf2" 128 0 36 amp=144 pan=0 # Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 39 %font "GeneralUser.sf2" 128 0 35 amp=282 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 40 %font "GeneralUser.sf2" 128 0 36 amp=159 pan=0 # Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 41 %font "GeneralUser.sf2" 128 0 35 amp=172 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 42 %font "GeneralUser.sf2" 128 1 36 amp=195 pan=0 # Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 43 %font "GeneralUser.sf2" 128 1 35 amp=148 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 44 %font "GeneralUser.sf2" 128 0 36 amp=174 pan=0 # Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 45 %font "GeneralUser.sf2" 128 0 35 amp=108 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 46 %font "GeneralUser.sf2" 128 0 36 amp=179 pan=0 # Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 Standard Kick 1 47 %font "GeneralUser.sf2" 128 32 36 amp=106 pan=0 # Jazz Bass Drum Jazz Bass Drum Jazz Bass Drum Jazz Bass Drum Standard Kick 1 Standard Kick 1 Standard Kick 1 48 %font "GeneralUser.sf2" 128 32 35 amp=133 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 49 %font "GeneralUser.sf2" 128 48 36 amp=58 pan=0 # Taiko Drum Timpani Hard Timpani Hard Timpani Hard Timpani Hard 50 %font "GeneralUser.sf2" 128 8 36 amp=45 pan=0 # Power Kick 2 Power Kick 2 Power Kick 2 Power Kick 2 51 %font "GeneralUser.sf2" 128 8 35 amp=137 pan=0 # Power/Room Kick 1 Power/Room Kick 1 Power/Room Kick 1 Power/Room Kick 1 52 %font "GeneralUser.sf2" 128 16 36 amp=92 pan=0 # Power Kick 2 Power Kick 2 Power Kick 2 Power Kick 2 53 %font "GeneralUser.sf2" 128 16 35 amp=87 pan=0 # Power/Room Kick 1 Power/Room Kick 1 Power/Room Kick 1 Power/Room Kick 1 54 %font "GeneralUser.sf2" 128 24 36 amp=94 pan=0 # TR-909 Kick Electric Tom 55 %font "GeneralUser.sf2" 128 24 35 amp=181 pan=0 # Standard Kick 2 Standard Kick 2 Standard Kick 2 Standard Kick 2 56 %font "GeneralUser.sf2" 128 24 36 amp=68 pan=0 # TR-909 Kick Electric Tom 57 %font "GeneralUser.sf2" 128 25 36 amp=87 pan=0 # TR-909 Kick 58 %font "GeneralUser.sf2" 128 25 36 amp=101 pan=0 # TR-909 Kick 59 %font "GeneralUser.sf2" 128 26 36 amp=101 pan=0 # TR-909 Kick TR-909 Kick 60 %font "GeneralUser.sf2" 128 0 38 amp=127 pan=0 # Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Jazz Snare Soft 1 Jazz Snare Soft 1 61 %font "GeneralUser.sf2" 128 0 40 amp=202 pan=0 # Standard Snare 2 Standard Snare 2 Standard Snare 2 Standard Snare 2 62 %font "GeneralUser.sf2" 128 0 38 amp=135 pan=0 # Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Jazz Snare Soft 1 Jazz Snare Soft 1 63 %font "GeneralUser.sf2" 128 0 40 amp=139 pan=0 # Standard Snare 2 Standard Snare 2 Standard Snare 2 Standard Snare 2 64 %font "GeneralUser.sf2" 128 0 38 amp=125 pan=0 # Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Jazz Snare Soft 1 Jazz Snare Soft 1 65 %font "GeneralUser.sf2" 128 48 38 amp=85 pan=0 # Orchestral Snare Orchestral Snare Orchestral Snare Orchestral Snare 66 %font "GeneralUser.sf2" 128 32 38 amp=122 pan=0 # Jazz Snare Soft 1 Jazz Snare Soft 1 Jazz Snare Soft 2 Jazz Snare Hard Jazz Snare Hard 67 %font "GeneralUser.sf2" 128 32 40 amp=118 pan=0 # Brush Snare Brush Snare Brush Snare Standard Snare 2 Standard Snare 2 Standard Snare 2 68 %font "GeneralUser.sf2" 128 8 38 amp=118 pan=0 # Room Snare 1 Room Snare 1 Room Snare 1 Room Snare 1 Room Snare 1 69 %font "GeneralUser.sf2" 128 8 40 amp=144 pan=0 # Standard Snare 2 Standard Snare 2 Standard Snare 2 Standard Snare 2 70 %font "GeneralUser.sf2" 128 16 38 amp=77 pan=0 # Power Snare 1 Power Snare 1 Power Snare 1 Power Snare 1 71 %font "GeneralUser.sf2" 128 16 40 amp=57 pan=0 # Power Snare 2 Power Snare 2 Power Snare 2 Power Snare 2 72 %font "GeneralUser.sf2" 128 24 40 amp=103 pan=0 # Power Snare 1 Power Snare 1 Power Snare 1 Power Snare 1 73 %font "GeneralUser.sf2" 128 26 38 amp=133 pan=0 # Dance Snare 74 %font "GeneralUser.sf2" 128 26 40 amp=116 pan=0 # TR-909 Snare 2 75 %font "GeneralUser.sf2" 128 26 40 amp=78 pan=0 # TR-909 Snare 2 76 %font "GeneralUser.sf2" 128 24 38 amp=64 pan=0 # Electric Tom White Noise 77 %font "GeneralUser.sf2" 128 26 38 amp=67 pan=0 # Dance Snare 78 %font "GeneralUser.sf2" 128 24 38 amp=120 pan=0 # Electric Tom White Noise 79 %font "GeneralUser.sf2" 128 24 40 amp=126 pan=0 # Power Snare 1 Power Snare 1 Power Snare 1 Power Snare 1 80 %font "GeneralUser.sf2" 128 25 38 amp=47 pan=0 # TR-909 Snare 1 81 %font "GeneralUser.sf2" 128 25 40 amp=53 pan=0 # TR-909 Snare 2 82 %font "GeneralUser.sf2" 128 25 38 amp=60 pan=0 # TR-909 Snare 1 83 %font "GeneralUser.sf2" 128 25 40 amp=77 pan=0 # TR-909 Snare 2 84 %font "GeneralUser.sf2" 128 40 38 amp=26 pan=0 # Brush Snare Brush Snare Brush Snare 85 %font "GeneralUser.sf2" 128 40 38 amp=36 pan=0 # Brush Snare Brush Snare Brush Snare 86 %font "GeneralUser.sf2" 128 40 39 amp=103 pan=0 # Brush Snare Brush Snare Brush Snare Standard Snare 2 Standard Snare 2 Standard Snare 2 87 %font "GeneralUser.sf2" 128 40 39 amp=100 pan=0 # Brush Snare Brush Snare Brush Snare Standard Snare 2 Standard Snare 2 Standard Snare 2 88 %font "GeneralUser.sf2" 128 40 39 amp=131 pan=0 # Brush Snare Brush Snare Brush Snare Standard Snare 2 Standard Snare 2 Standard Snare 2 89 %font "GeneralUser.sf2" 128 40 40 amp=19 pan=0 # Brush Swirl 90 %font "GeneralUser.sf2" 128 40 40 amp=17 pan=0 # Brush Swirl 91 %font "GeneralUser.sf2" 128 40 40 amp=23 pan=0 # Brush Swirl 92 %font "GeneralUser.sf2" 128 0 38 amp=207 pan=0 # Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Jazz Snare Soft 1 Jazz Snare Soft 1 93 %font "GeneralUser.sf2" 128 0 40 amp=413 pan=0 # Standard Snare 2 Standard Snare 2 Standard Snare 2 Standard Snare 2 94 %font "GeneralUser.sf2" 128 0 38 amp=267 pan=0 # Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Standard Snare 1 Jazz Snare Soft 1 Jazz Snare Soft 1 95 %font "GeneralUser.sf2" 128 25 38 amp=93 pan=0 # TR-909 Snare 1 96 %font "GeneralUser.sf2" 128 25 40 amp=61 pan=0 # TR-909 Snare 2 97 %font "GeneralUser.sf2" 128 25 38 amp=68 pan=0 # TR-909 Snare 1 98 %font "GeneralUser.sf2" 128 25 40 amp=80 pan=0 # TR-909 Snare 2 99 %font "GeneralUser.sf2" 128 25 38 amp=66 pan=0 # TR-909 Snare 1 drumset 53 32 %font "GeneralUser.sf2" 128 0 46 amp=51 pan=0 # Hi-Hat Open Hi-Hat Open Attack Hi-Hat Open Attack 33 %font "GeneralUser.sf2" 128 0 42 amp=61 pan=0 # Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Soft Hi-Hat Closed Soft Hi-Hat Closed Soft 34 %font "GeneralUser.sf2" 128 0 42 amp=82 pan=0 # Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Soft Hi-Hat Closed Soft Hi-Hat Closed Soft 35 %font "GeneralUser.sf2" 128 25 44 amp=170 pan=0 # TR-808 Hi-Hat 36 %font "GeneralUser.sf2" 128 0 42 amp=42 pan=0 # Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Soft Hi-Hat Closed Soft Hi-Hat Closed Soft 37 %font "GeneralUser.sf2" 128 0 42 amp=45 pan=0 # Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Soft Hi-Hat Closed Soft Hi-Hat Closed Soft 38 %font "GeneralUser.sf2" 128 0 42 amp=33 pan=0 # Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Soft Hi-Hat Closed Soft Hi-Hat Closed Soft 39 %font "GeneralUser.sf2" 128 0 42 amp=34 pan=0 # Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Soft Hi-Hat Closed Soft Hi-Hat Closed Soft 40 %font "GeneralUser.sf2" 128 0 42 amp=35 pan=0 # Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Hard Hi-Hat Closed Soft Hi-Hat Closed Soft Hi-Hat Closed Soft 41 %font "GeneralUser.sf2" 128 25 42 amp=50 pan=0 # TR-808 Hi-Hat 42 %font "GeneralUser.sf2" 128 25 42 amp=72 pan=0 # TR-808 Hi-Hat 43 %font "GeneralUser.sf2" 128 25 42 amp=88 pan=0 # TR-808 Hi-Hat 44 %font "GeneralUser.sf2" 128 25 42 amp=69 pan=0 # TR-808 Hi-Hat 45 %font "GeneralUser.sf2" 128 25 42 amp=151 pan=0 # TR-808 Hi-Hat 46 %font "GeneralUser.sf2" 128 0 44 amp=41 pan=0 # Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Dead Air 47 %font "GeneralUser.sf2" 128 0 44 amp=60 pan=0 # Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Dead Air 48 %font "GeneralUser.sf2" 128 0 44 amp=43 pan=0 # Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Hi-Hat Pedal Dead Air 49 %font "GeneralUser.sf2" 128 0 46 amp=43 pan=0 # Hi-Hat Open Hi-Hat Open Attack Hi-Hat Open Attack 50 %font "GeneralUser.sf2" 128 0 46 amp=36 pan=0 # Hi-Hat Open Hi-Hat Open Attack Hi-Hat Open Attack 51 %font "GeneralUser.sf2" 128 0 46 amp=38 pan=0 # Hi-Hat Open Hi-Hat Open Attack Hi-Hat Open Attack 52 %font "GeneralUser.sf2" 128 0 46 amp=18 pan=0 # Hi-Hat Open Hi-Hat Open Attack Hi-Hat Open Attack 53 %font "GeneralUser.sf2" 128 0 46 amp=42 pan=0 # Hi-Hat Open Hi-Hat Open Attack Hi-Hat Open Attack 54 %font "GeneralUser.sf2" 128 0 46 amp=60 pan=0 # Hi-Hat Open Hi-Hat Open Attack Hi-Hat Open Attack 55 %font "GeneralUser.sf2" 128 25 46 amp=31 pan=0 # TR-909 Hi-Hat Open 56 %font "GeneralUser.sf2" 128 25 46 amp=31 pan=0 # TR-909 Hi-Hat Open 57 %font "GeneralUser.sf2" 128 25 46 amp=47 pan=0 # TR-909 Hi-Hat Open 58 %font "GeneralUser.sf2" 128 25 46 amp=61 pan=0 # TR-909 Hi-Hat Open 59 %font "GeneralUser.sf2" 128 25 46 amp=38 pan=0 # TR-909 Hi-Hat Open 60 %font "GeneralUser.sf2" 128 25 46 amp=34 pan=0 # TR-909 Hi-Hat Open 61 %font "GeneralUser.sf2" 128 0 49 amp=176 pan=0 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 62 %font "GeneralUser.sf2" 128 0 57 amp=164 pan=0 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 63 %font "GeneralUser.sf2" 128 0 49 amp=180 pan=0 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 64 %font "GeneralUser.sf2" 128 40 49 amp=105 pan=0 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 65 %font "GeneralUser.sf2" 128 0 49 amp=172 pan=0 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 66 %font "GeneralUser.sf2" 128 25 49 amp=60 pan=0 # TR-808 Hi-Hat Crash Cymbal 67 %font "GeneralUser.sf2" 128 25 49 amp=97 pan=0 # TR-808 Hi-Hat Crash Cymbal 68 %font "GeneralUser.sf2" 128 0 49 amp=271 pan=0 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 69 %font "GeneralUser.sf2" 128 0 57 amp=220 pan=0 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 70 %font "GeneralUser.sf2" 128 0 49 amp=169 pan=0 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 71 %font "GeneralUser.sf2" 128 0 57 amp=148 pan=0 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 72 %font "GeneralUser.sf2" 128 0 49 amp=155 pan=0 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 73 %font "GeneralUser.sf2" 128 40 49 amp=155 pan=0 # Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Crash Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal Ride Cymbal 74 %font "GeneralUser.sf2" 128 0 55 amp=71 pan=0 # Splash Cymbal 75 %font "GeneralUser.sf2" 128 0 55 amp=90 pan=0 # Splash Cymbal 76 %font "GeneralUser.sf2" 128 0 53 amp=47 pan=0 # Ride Bell 77 %font "GeneralUser.sf2" 128 40 53 amp=58 pan=0 # Ride Bell 78 %font "GeneralUser.sf2" 128 0 51 amp=58 pan=0 # Ride Cymbal 79 %font "GeneralUser.sf2" 128 0 59 amp=58 pan=0 # Ride Cymbal 80 %font "GeneralUser.sf2" 128 40 51 amp=75 pan=0 # Ride Cymbal 81 %font "GeneralUser.sf2" 128 0 51 amp=83 pan=0 # Ride Cymbal 82 %font "GeneralUser.sf2" 128 0 51 amp=42 pan=0 # Ride Cymbal 83 %font "GeneralUser.sf2" 128 0 51 amp=36 pan=0 # Ride Cymbal 84 %font "GeneralUser.sf2" 128 0 51 amp=41 pan=0 # Ride Cymbal 85 %font "GeneralUser.sf2" 128 0 51 amp=41 pan=0 # Ride Cymbal 86 %font "GeneralUser.sf2" 128 0 51 amp=33 pan=0 # Ride Cymbal 87 %font "GeneralUser.sf2" 128 25 51 amp=80 pan=0 # Ride Cymbal 88 %font "GeneralUser.sf2" 128 25 51 amp=252 pan=0 # Ride Cymbal 89 %font "GeneralUser.sf2" 128 0 51 amp=308 pan=0 # Ride Cymbal 90 %font "GeneralUser.sf2" 128 0 51 amp=276 pan=0 # Ride Cymbal 91 %font "GeneralUser.sf2" 128 0 39 amp=21 pan=0 # Hand Clap 92 %font "GeneralUser.sf2" 128 0 39 amp=93 pan=0 # Hand Clap 93 %font "GeneralUser.sf2" 128 0 39 amp=81 pan=0 # Hand Clap 94 %font "GeneralUser.sf2" 128 0 39 amp=83 pan=0 # Hand Clap 95 %font "GeneralUser.sf2" 128 0 39 amp=155 pan=0 # Hand Clap 96 %font "GeneralUser.sf2" 128 25 39 amp=66 pan=0 # Synth Hand Clap drumset 56 39 %font "GeneralUser.sf2" 128 56 39 amp=36 pan=-23 # Filter Snap 40 %font "GeneralUser.sf2" 128 56 40 amp=167 pan=-23 # Slap 41 %font "GeneralUser.sf2" 128 56 41 amp=74 pan=-16 # Scratch Push 42 %font "GeneralUser.sf2" 128 56 42 amp=52 pan=-16 # Scratch Pull 43 %font "GeneralUser.sf2" 128 56 43 amp=97 pan=0 # Sticks 44 %font "GeneralUser.sf2" 128 56 44 amp=433 pan=-16 # Square Click 45 %font "GeneralUser.sf2" 128 56 45 amp=77 pan=0 # TR-808 Click 46 %font "GeneralUser.sf2" 128 56 46 amp=45 pan=0 # TR-808 Click Carillon-C6 47 %font "GeneralUser.sf2" 128 56 47 amp=68 pan=0 # Fret Slide 48 %font "GeneralUser.sf2" 128 56 48 amp=17 pan=0 # Gtr Cut Up 49 %font "GeneralUser.sf2" 128 56 49 amp=73 pan=0 # Gtr Cut Down 50 %font "GeneralUser.sf2" 128 56 50 amp=28 pan=0 # Gtr Slap 51 %font "GeneralUser.sf2" 128 56 51 amp=154 pan=0 # Gtr Click 52 %font "GeneralUser.sf2" 128 56 52 amp=87 pan=0 # Laughing 53 %font "GeneralUser.sf2" 128 56 53 amp=61 pan=0 # Scream 54 %font "GeneralUser.sf2" 128 56 54 amp=174 pan=0 # Punch Bone Crunch 55 %font "GeneralUser.sf2" 128 56 55 amp=155 pan=0 # Heartbeat 56 %font "GeneralUser.sf2" 128 56 56 amp=83 pan=0 # Foot Step 58 %font "GeneralUser.sf2" 128 56 58 amp=9 pan=0 # Applause Applause 59 %font "GeneralUser.sf2" 128 56 59 amp=24 pan=0 # Door Creak 60 %font "GeneralUser.sf2" 128 56 60 amp=75 pan=0 # Door Slam 61 %font "GeneralUser.sf2" 128 56 61 amp=74 pan=0 # Scratch Pull 62 %font "GeneralUser.sf2" 128 56 62 amp=118 pan=0 # Windchimes 63 %font "GeneralUser.sf2" 128 56 63 amp=55 pan=0 # Car-Start Car-Start 64 %font "GeneralUser.sf2" 128 56 64 amp=117 pan=0 # Car-Skid 65 %font "GeneralUser.sf2" 128 56 65 amp=56 pan=0 # Car-Pass Car-Pass 66 %font "GeneralUser.sf2" 128 56 66 amp=142 pan=0 # Car-Crash 67 %font "GeneralUser.sf2" 128 56 67 amp=14 pan=0 # Siren Siren 68 %font "GeneralUser.sf2" 128 56 68 amp=302 pan=0 # Train Train 69 %font "GeneralUser.sf2" 128 56 69 amp=26 pan=0 # Jet 70 %font "GeneralUser.sf2" 128 56 70 amp=171 pan=0 # Helicopter 71 %font "GeneralUser.sf2" 128 56 71 amp=12 pan=0 # Starship Noise Harpsichord-C6 72 %font "GeneralUser.sf2" 128 56 72 amp=79 pan=0 # Gun Shot 73 %font "GeneralUser.sf2" 128 56 73 amp=33 pan=0 # Gun Shot 74 %font "GeneralUser.sf2" 128 56 74 amp=154 pan=0 # Sine-Triangle-12000 White Noise White Noise 75 %font "GeneralUser.sf2" 128 56 75 amp=65 pan=0 # Explosion Explosion 76 %font "GeneralUser.sf2" 128 56 76 amp=141 pan=0 # Dog 77 %font "GeneralUser.sf2" 128 56 77 amp=3 pan=0 # Horse Gallop 78 %font "GeneralUser.sf2" 128 56 78 amp=99 pan=0 # Birds Birds 79 %font "GeneralUser.sf2" 128 56 79 amp=14 pan=0 # Rain Rain 80 %font "GeneralUser.sf2" 128 56 80 amp=182 pan=0 # Thunder Thunder 81 %font "GeneralUser.sf2" 128 56 81 amp=12 pan=0 # WhiteNoiseWave WhiteNoiseWave 82 %font "GeneralUser.sf2" 128 56 82 amp=82 pan=0 # Seashore Seashore 83 %font "GeneralUser.sf2" 128 56 83 amp=109 pan=0 # Stream Stream 84 %font "GeneralUser.sf2" 128 56 84 amp=57 pan=0 # Bubbles ================================================ FILE: packages/sx05re/tools/sound/timidity/config/fluidr3_gm.cfg ================================================ dir /storage/roms/bios/timidity/sf2 bank 0 0 %font "FluidR3_GM.sf2" 0 0 amp=29 pan=0 1 %font "FluidR3_GM.sf2" 0 1 amp=41 pan=0 2 %font "FluidR3_GM.sf2" 0 2 amp=64 pan=0 3 %font "FluidR3_GM.sf2" 0 3 amp=32 pan=0 4 %font "FluidR3_GM.sf2" 0 4 amp=35 pan=0 5 %font "FluidR3_GM.sf2" 0 5 amp=51 pan=0 6 %font "FluidR3_GM.sf2" 0 6 amp=71 pan=0 7 %font "FluidR3_GM.sf2" 0 7 amp=65 pan=0 8 %font "FluidR3_GM.sf2" 0 8 amp=73 pan=0 9 %font "FluidR3_GM.sf2" 0 9 amp=98 pan=0 10 %font "FluidR3_GM.sf2" 0 10 amp=150 pan=0 11 %font "FluidR3_GM.sf2" 0 11 amp=63 pan=0 12 %font "FluidR3_GM.sf2" 0 12 amp=48 pan=0 13 %font "FluidR3_GM.sf2" 0 13 amp=46 pan=0 14 %font "FluidR3_GM.sf2" 0 14 amp=65 pan=0 15 %font "FluidR3_GM.sf2" 0 15 amp=62 pan=0 16 %font "FluidR3_GM.sf2" 0 16 amp=154 pan=0 17 %font "FluidR3_GM.sf2" 0 17 amp=96 pan=0 18 %font "FluidR3_GM.sf2" 0 18 amp=75 pan=0 19 %font "FluidR3_GM.sf2" 0 19 amp=128 pan=0 20 %font "FluidR3_GM.sf2" 0 20 amp=45 pan=0 21 %font "FluidR3_GM.sf2" 0 21 amp=50 pan=0 22 %font "FluidR3_GM.sf2" 0 22 amp=36 pan=0 23 %font "FluidR3_GM.sf2" 0 23 amp=46 pan=0 24 %font "FluidR3_GM.sf2" 0 24 amp=139 pan=0 25 %font "FluidR3_GM.sf2" 0 25 amp=92 pan=0 26 %font "FluidR3_GM.sf2" 0 26 amp=87 pan=0 27 %font "FluidR3_GM.sf2" 0 27 amp=46 pan=0 28 %font "FluidR3_GM.sf2" 0 28 amp=92 pan=0 29 %font "FluidR3_GM.sf2" 0 29 amp=41 pan=0 30 %font "FluidR3_GM.sf2" 0 30 amp=91 pan=0 31 %font "FluidR3_GM.sf2" 0 31 amp=60 pan=0 32 %font "FluidR3_GM.sf2" 0 32 amp=125 pan=0 33 %font "FluidR3_GM.sf2" 0 33 amp=85 pan=0 34 %font "FluidR3_GM.sf2" 0 34 amp=148 pan=0 35 %font "FluidR3_GM.sf2" 0 35 amp=98 pan=0 36 %font "FluidR3_GM.sf2" 0 36 amp=207 pan=0 37 %font "FluidR3_GM.sf2" 0 37 amp=223 pan=0 38 %font "FluidR3_GM.sf2" 0 38 amp=35 pan=0 39 %font "FluidR3_GM.sf2" 0 39 amp=38 pan=0 40 %font "FluidR3_GM.sf2" 0 40 amp=48 pan=0 41 %font "FluidR3_GM.sf2" 0 41 amp=69 pan=0 42 %font "FluidR3_GM.sf2" 0 42 amp=34 pan=0 43 %font "FluidR3_GM.sf2" 0 43 amp=109 pan=0 44 %font "FluidR3_GM.sf2" 0 44 amp=68 pan=0 45 %font "FluidR3_GM.sf2" 0 45 amp=124 pan=0 46 %font "FluidR3_GM.sf2" 0 46 amp=117 pan=0 47 %font "FluidR3_GM.sf2" 0 47 amp=98 pan=0 48 %font "FluidR3_GM.sf2" 0 48 amp=91 pan=0 49 %font "FluidR3_GM.sf2" 0 49 amp=79 pan=0 50 %font "FluidR3_GM.sf2" 0 50 amp=30 pan=0 51 %font "FluidR3_GM.sf2" 0 51 amp=14 pan=0 52 %font "FluidR3_GM.sf2" 0 52 amp=56 pan=0 53 %font "FluidR3_GM.sf2" 0 53 amp=66 pan=0 54 %font "FluidR3_GM.sf2" 0 54 amp=79 pan=0 55 %font "FluidR3_GM.sf2" 0 55 amp=105 pan=0 56 %font "FluidR3_GM.sf2" 0 56 amp=102 pan=0 57 %font "FluidR3_GM.sf2" 0 57 amp=54 pan=0 58 %font "FluidR3_GM.sf2" 0 58 amp=60 pan=0 59 %font "FluidR3_GM.sf2" 0 59 amp=42 pan=0 60 %font "FluidR3_GM.sf2" 0 60 amp=80 pan=0 61 %font "FluidR3_GM.sf2" 0 61 amp=89 pan=0 62 %font "FluidR3_GM.sf2" 0 62 amp=82 pan=0 63 %font "FluidR3_GM.sf2" 0 63 amp=117 pan=0 64 %font "FluidR3_GM.sf2" 0 64 amp=90 pan=0 65 %font "FluidR3_GM.sf2" 0 65 amp=30 pan=0 66 %font "FluidR3_GM.sf2" 0 66 amp=51 pan=0 67 %font "FluidR3_GM.sf2" 0 67 amp=33 pan=0 68 %font "FluidR3_GM.sf2" 0 68 amp=58 pan=0 69 %font "FluidR3_GM.sf2" 0 69 amp=68 pan=0 70 %font "FluidR3_GM.sf2" 0 70 amp=67 pan=0 71 %font "FluidR3_GM.sf2" 0 71 amp=61 pan=0 72 %font "FluidR3_GM.sf2" 0 72 amp=43 pan=0 73 %font "FluidR3_GM.sf2" 0 73 amp=43 pan=0 74 %font "FluidR3_GM.sf2" 0 74 amp=116 pan=0 75 %font "FluidR3_GM.sf2" 0 75 amp=51 pan=0 76 %font "FluidR3_GM.sf2" 0 76 amp=56 pan=0 77 %font "FluidR3_GM.sf2" 0 77 amp=32 pan=0 78 %font "FluidR3_GM.sf2" 0 78 amp=122 pan=0 79 %font "FluidR3_GM.sf2" 0 79 amp=144 pan=0 80 %font "FluidR3_GM.sf2" 0 80 amp=24 pan=0 81 %font "FluidR3_GM.sf2" 0 81 amp=65 pan=0 82 %font "FluidR3_GM.sf2" 0 82 amp=222 pan=0 83 %font "FluidR3_GM.sf2" 0 83 amp=86 pan=0 84 %font "FluidR3_GM.sf2" 0 84 amp=41 pan=0 85 %font "FluidR3_GM.sf2" 0 85 amp=147 pan=0 86 %font "FluidR3_GM.sf2" 0 86 amp=29 pan=0 87 %font "FluidR3_GM.sf2" 0 87 amp=60 pan=0 88 %font "FluidR3_GM.sf2" 0 88 amp=205 pan=0 89 %font "FluidR3_GM.sf2" 0 89 amp=52 pan=0 90 %font "FluidR3_GM.sf2" 0 90 amp=39 pan=0 91 %font "FluidR3_GM.sf2" 0 91 amp=60 pan=0 92 %font "FluidR3_GM.sf2" 0 92 amp=107 pan=0 93 %font "FluidR3_GM.sf2" 0 93 amp=50 pan=0 94 %font "FluidR3_GM.sf2" 0 94 amp=87 pan=0 95 %font "FluidR3_GM.sf2" 0 95 amp=70 pan=0 96 %font "FluidR3_GM.sf2" 0 96 amp=37 pan=0 97 %font "FluidR3_GM.sf2" 0 97 amp=74 pan=0 98 %font "FluidR3_GM.sf2" 0 98 amp=132 pan=0 99 %font "FluidR3_GM.sf2" 0 99 amp=117 pan=0 100 %font "FluidR3_GM.sf2" 0 100 amp=64 pan=0 101 %font "FluidR3_GM.sf2" 0 101 amp=53 pan=0 102 %font "FluidR3_GM.sf2" 0 102 amp=51 pan=0 103 %font "FluidR3_GM.sf2" 0 103 amp=110 pan=0 104 %font "FluidR3_GM.sf2" 0 104 amp=66 pan=0 105 %font "FluidR3_GM.sf2" 0 105 amp=120 pan=0 106 %font "FluidR3_GM.sf2" 0 106 amp=77 pan=0 107 %font "FluidR3_GM.sf2" 0 107 amp=182 pan=0 108 %font "FluidR3_GM.sf2" 0 108 amp=88 pan=0 109 %font "FluidR3_GM.sf2" 0 109 amp=62 pan=0 110 %font "FluidR3_GM.sf2" 0 110 amp=45 pan=0 111 %font "FluidR3_GM.sf2" 0 111 amp=78 pan=0 112 %font "FluidR3_GM.sf2" 0 112 amp=72 pan=0 113 %font "FluidR3_GM.sf2" 0 113 amp=122 pan=0 114 %font "FluidR3_GM.sf2" 0 114 amp=47 pan=0 115 %font "FluidR3_GM.sf2" 0 115 amp=142 pan=0 116 %font "FluidR3_GM.sf2" 0 116 amp=61 pan=0 117 %font "FluidR3_GM.sf2" 0 117 amp=83 pan=0 118 %font "FluidR3_GM.sf2" 0 118 amp=42 pan=0 119 %font "FluidR3_GM.sf2" 0 119 amp=75 pan=0 120 %font "FluidR3_GM.sf2" 0 120 amp=56 pan=0 121 %font "FluidR3_GM.sf2" 0 121 amp=13 pan=0 122 %font "FluidR3_GM.sf2" 0 122 amp=113 pan=0 123 %font "FluidR3_GM.sf2" 0 123 amp=80 pan=0 124 %font "FluidR3_GM.sf2" 0 124 amp=91 pan=0 125 %font "FluidR3_GM.sf2" 0 125 amp=67 pan=0 126 %font "FluidR3_GM.sf2" 0 126 amp=31 pan=0 127 %font "FluidR3_GM.sf2" 0 127 amp=117 pan=0 bank 8 4 %font "FluidR3_GM.sf2" 8 4 amp=46 pan=0 5 %font "FluidR3_GM.sf2" 8 5 amp=37 pan=0 6 %font "FluidR3_GM.sf2" 8 6 amp=57 pan=0 14 %font "FluidR3_GM.sf2" 8 14 amp=35 pan=0 16 %font "FluidR3_GM.sf2" 8 16 amp=118 pan=0 17 %font "FluidR3_GM.sf2" 8 17 amp=96 pan=0 19 %font "FluidR3_GM.sf2" 8 19 amp=78 pan=0 21 %font "FluidR3_GM.sf2" 8 21 amp=24 pan=0 24 %font "FluidR3_GM.sf2" 8 24 amp=123 pan=0 25 %font "FluidR3_GM.sf2" 8 25 amp=114 pan=0 26 %font "FluidR3_GM.sf2" 8 26 amp=111 pan=0 28 %font "FluidR3_GM.sf2" 8 28 amp=25 pan=0 30 %font "FluidR3_GM.sf2" 8 30 amp=38 pan=0 31 %font "FluidR3_GM.sf2" 8 31 amp=109 pan=0 38 %font "FluidR3_GM.sf2" 8 38 amp=59 pan=0 39 %font "FluidR3_GM.sf2" 8 39 amp=51 pan=0 40 %font "FluidR3_GM.sf2" 8 40 amp=46 pan=0 48 %font "FluidR3_GM.sf2" 8 48 amp=52 pan=0 50 %font "FluidR3_GM.sf2" 8 50 amp=32 pan=0 61 %font "FluidR3_GM.sf2" 8 61 amp=87 pan=0 62 %font "FluidR3_GM.sf2" 8 62 amp=49 pan=0 63 %font "FluidR3_GM.sf2" 8 63 amp=78 pan=0 80 %font "FluidR3_GM.sf2" 8 80 amp=84 pan=0 107 %font "FluidR3_GM.sf2" 8 107 amp=93 pan=0 115 %font "FluidR3_GM.sf2" 8 115 amp=115 pan=0 116 %font "FluidR3_GM.sf2" 8 116 amp=62 pan=0 117 %font "FluidR3_GM.sf2" 8 117 amp=73 pan=0 118 %font "FluidR3_GM.sf2" 8 118 amp=131 pan=0 bank 9 125 %font "FluidR3_GM.sf2" 9 125 amp=51 pan=0 bank 16 25 %font "FluidR3_GM.sf2" 16 25 amp=82 pan=0 bank 126 0 %font "FluidR3_GM.sf2" 0 1 amp=55 pan=0 1 %font "FluidR3_GM.sf2" 0 1 amp=55 pan=0 2 %font "FluidR3_GM.sf2" 0 1 amp=55 pan=0 3 %font "FluidR3_GM.sf2" 0 3 amp=31 pan=0 4 %font "FluidR3_GM.sf2" 0 0 amp=40 pan=0 5 %font "FluidR3_GM.sf2" 0 1 amp=55 pan=0 6 %font "FluidR3_GM.sf2" 0 1 amp=55 pan=0 7 %font "FluidR3_GM.sf2" 0 4 amp=40 pan=0 8 %font "FluidR3_GM.sf2" 0 4 amp=35 pan=0 9 %font "FluidR3_GM.sf2" 0 5 amp=37 pan=0 10 %font "FluidR3_GM.sf2" 0 25 amp=106 pan=0 11 %font "FluidR3_GM.sf2" 0 25 amp=107 pan=0 12 %font "FluidR3_GM.sf2" 0 26 amp=41 pan=0 13 %font "FluidR3_GM.sf2" 0 26 amp=47 pan=0 14 %font "FluidR3_GM.sf2" 0 28 amp=109 pan=0 15 %font "FluidR3_GM.sf2" 0 36 amp=92 pan=0 16 %font "FluidR3_GM.sf2" 0 36 amp=92 pan=0 17 %font "FluidR3_GM.sf2" 0 36 amp=92 pan=0 18 %font "FluidR3_GM.sf2" 0 36 amp=92 pan=0 19 %font "FluidR3_GM.sf2" 0 37 amp=98 pan=0 20 %font "FluidR3_GM.sf2" 0 37 amp=98 pan=0 21 %font "FluidR3_GM.sf2" 0 37 amp=98 pan=0 22 %font "FluidR3_GM.sf2" 0 37 amp=98 pan=0 23 %font "FluidR3_GM.sf2" 0 33 amp=91 pan=0 24 %font "FluidR3_GM.sf2" 0 33 amp=92 pan=0 25 %font "FluidR3_GM.sf2" 0 34 amp=137 pan=0 26 %font "FluidR3_GM.sf2" 0 34 amp=138 pan=0 27 %font "FluidR3_GM.sf2" 0 35 amp=107 pan=0 28 %font "FluidR3_GM.sf2" 0 32 amp=195 pan=0 29 %font "FluidR3_GM.sf2" 0 52 amp=78 pan=0 30 %font "FluidR3_GM.sf2" 0 52 amp=77 pan=0 31 %font "FluidR3_GM.sf2" 0 52 amp=78 pan=0 32 %font "FluidR3_GM.sf2" 0 52 amp=78 pan=0 33 %font "FluidR3_GM.sf2" 0 49 amp=72 pan=0 34 %font "FluidR3_GM.sf2" 0 48 amp=64 pan=0 35 %font "FluidR3_GM.sf2" 0 50 amp=42 pan=0 36 %font "FluidR3_GM.sf2" 0 50 amp=32 pan=0 37 %font "FluidR3_GM.sf2" 0 16 amp=70 pan=0 38 %font "FluidR3_GM.sf2" 0 16 amp=98 pan=0 39 %font "FluidR3_GM.sf2" 0 16 amp=98 pan=0 40 %font "FluidR3_GM.sf2" 0 17 amp=144 pan=0 41 %font "FluidR3_GM.sf2" 0 16 amp=98 pan=0 42 %font "FluidR3_GM.sf2" 0 16 amp=98 pan=0 43 %font "FluidR3_GM.sf2" 0 17 amp=144 pan=0 44 %font "FluidR3_GM.sf2" 0 17 amp=144 pan=0 45 %font "FluidR3_GM.sf2" 0 17 amp=144 pan=0 46 %font "FluidR3_GM.sf2" 0 56 amp=94 pan=0 47 %font "FluidR3_GM.sf2" 0 56 amp=95 pan=0 48 %font "FluidR3_GM.sf2" 0 57 amp=38 pan=0 49 %font "FluidR3_GM.sf2" 0 57 amp=38 pan=0 50 %font "FluidR3_GM.sf2" 0 57 amp=38 pan=0 51 %font "FluidR3_GM.sf2" 0 57 amp=38 pan=0 52 %font "FluidR3_GM.sf2" 0 57 amp=38 pan=0 53 %font "FluidR3_GM.sf2" 0 57 amp=38 pan=0 54 %font "FluidR3_GM.sf2" 0 65 amp=29 pan=0 55 %font "FluidR3_GM.sf2" 0 66 amp=41 pan=0 56 %font "FluidR3_GM.sf2" 0 67 amp=65 pan=0 57 %font "FluidR3_GM.sf2" 0 65 amp=29 pan=0 58 %font "FluidR3_GM.sf2" 0 61 amp=47 pan=0 59 %font "FluidR3_GM.sf2" 0 61 amp=47 pan=0 60 %font "FluidR3_GM.sf2" 0 61 amp=56 pan=0 61 %font "FluidR3_GM.sf2" 0 61 amp=56 pan=0 62 %font "FluidR3_GM.sf2" 0 61 amp=46 pan=0 63 %font "FluidR3_GM.sf2" 0 55 amp=116 pan=0 bank 127 8 %font "FluidR3_GM.sf2" 0 16 amp=59 pan=0 9 %font "FluidR3_GM.sf2" 0 17 amp=87 pan=0 10 %font "FluidR3_GM.sf2" 0 18 amp=86 pan=0 11 %font "FluidR3_GM.sf2" 0 18 amp=64 pan=0 12 %font "FluidR3_GM.sf2" 0 19 amp=55 pan=0 13 %font "FluidR3_GM.sf2" 0 19 amp=94 pan=0 14 %font "FluidR3_GM.sf2" 0 20 amp=18 pan=0 15 %font "FluidR3_GM.sf2" 0 21 amp=45 pan=0 16 %font "FluidR3_GM.sf2" 0 6 amp=60 pan=0 17 %font "FluidR3_GM.sf2" 0 6 amp=53 pan=0 18 %font "FluidR3_GM.sf2" 0 6 amp=60 pan=0 19 %font "FluidR3_GM.sf2" 0 7 amp=40 pan=0 20 %font "FluidR3_GM.sf2" 0 7 amp=71 pan=0 21 %font "FluidR3_GM.sf2" 0 7 amp=46 pan=0 22 %font "FluidR3_GM.sf2" 0 8 amp=18 pan=0 23 %font "FluidR3_GM.sf2" 0 8 amp=19 pan=0 24 %font "FluidR3_GM.sf2" 0 62 amp=83 pan=0 25 %font "FluidR3_GM.sf2" 0 63 amp=141 pan=0 26 %font "FluidR3_GM.sf2" 0 62 amp=88 pan=0 27 %font "FluidR3_GM.sf2" 0 63 amp=222 pan=0 28 %font "FluidR3_GM.sf2" 0 38 amp=38 pan=0 29 %font "FluidR3_GM.sf2" 0 39 amp=10 pan=0 30 %font "FluidR3_GM.sf2" 0 38 amp=38 pan=0 31 %font "FluidR3_GM.sf2" 0 39 amp=14 pan=0 32 %font "FluidR3_GM.sf2" 0 88 amp=108 pan=0 33 %font "FluidR3_GM.sf2" 0 89 amp=12 pan=0 34 %font "FluidR3_GM.sf2" 0 52 amp=46 pan=0 35 %font "FluidR3_GM.sf2" 0 113 amp=131 pan=0 36 %font "FluidR3_GM.sf2" 0 97 amp=74 pan=0 37 %font "FluidR3_GM.sf2" 0 96 amp=27 pan=0 38 %font "FluidR3_GM.sf2" 0 91 amp=32 pan=0 39 %font "FluidR3_GM.sf2" 0 85 amp=30 pan=0 40 %font "FluidR3_GM.sf2" 0 102 amp=83 pan=0 41 %font "FluidR3_GM.sf2" 0 101 amp=85 pan=0 42 %font "FluidR3_GM.sf2" 0 68 amp=21 pan=0 43 %font "FluidR3_GM.sf2" 0 95 amp=94 pan=0 44 %font "FluidR3_GM.sf2" 0 86 amp=17 pan=0 45 %font "FluidR3_GM.sf2" 0 103 amp=116 pan=0 46 %font "FluidR3_GM.sf2" 0 88 amp=41 pan=0 47 %font "FluidR3_GM.sf2" 0 80 amp=22 pan=0 48 %font "FluidR3_GM.sf2" 0 48 amp=55 pan=0 49 %font "FluidR3_GM.sf2" 0 49 amp=69 pan=0 51 %font "FluidR3_GM.sf2" 0 45 amp=25 pan=0 52 %font "FluidR3_GM.sf2" 0 40 amp=35 pan=0 53 %font "FluidR3_GM.sf2" 0 40 amp=32 pan=0 54 %font "FluidR3_GM.sf2" 0 42 amp=40 pan=0 55 %font "FluidR3_GM.sf2" 0 42 amp=40 pan=0 56 %font "FluidR3_GM.sf2" 0 43 amp=79 pan=0 57 %font "FluidR3_GM.sf2" 0 46 amp=26 pan=0 58 %font "FluidR3_GM.sf2" 0 46 amp=35 pan=0 59 %font "FluidR3_GM.sf2" 0 24 amp=60 pan=0 60 %font "FluidR3_GM.sf2" 0 24 amp=46 pan=0 61 %font "FluidR3_GM.sf2" 0 26 amp=39 pan=0 62 %font "FluidR3_GM.sf2" 0 27 amp=83 pan=0 63 %font "FluidR3_GM.sf2" 0 104 amp=40 pan=0 64 %font "FluidR3_GM.sf2" 0 32 amp=85 pan=0 65 %font "FluidR3_GM.sf2" 0 33 amp=51 pan=0 66 %font "FluidR3_GM.sf2" 0 34 amp=67 pan=0 67 %font "FluidR3_GM.sf2" 0 39 amp=20 pan=0 68 %font "FluidR3_GM.sf2" 0 36 amp=71 pan=0 69 %font "FluidR3_GM.sf2" 0 37 amp=72 pan=0 70 %font "FluidR3_GM.sf2" 0 35 amp=58 pan=0 71 %font "FluidR3_GM.sf2" 0 35 amp=42 pan=0 72 %font "FluidR3_GM.sf2" 0 73 amp=19 pan=0 73 %font "FluidR3_GM.sf2" 0 73 amp=33 pan=0 74 %font "FluidR3_GM.sf2" 0 72 amp=47 pan=0 75 %font "FluidR3_GM.sf2" 0 72 amp=30 pan=0 76 %font "FluidR3_GM.sf2" 0 74 amp=64 pan=0 77 %font "FluidR3_GM.sf2" 0 75 amp=40 pan=0 78 %font "FluidR3_GM.sf2" 0 64 amp=53 pan=0 79 %font "FluidR3_GM.sf2" 0 65 amp=24 pan=0 80 %font "FluidR3_GM.sf2" 0 66 amp=54 pan=0 81 %font "FluidR3_GM.sf2" 0 67 amp=50 pan=0 82 %font "FluidR3_GM.sf2" 0 71 amp=25 pan=0 83 %font "FluidR3_GM.sf2" 0 71 amp=22 pan=0 84 %font "FluidR3_GM.sf2" 0 68 amp=35 pan=0 85 %font "FluidR3_GM.sf2" 0 69 amp=66 pan=0 86 %font "FluidR3_GM.sf2" 0 70 amp=35 pan=0 87 %font "FluidR3_GM.sf2" 0 22 amp=56 pan=0 88 %font "FluidR3_GM.sf2" 0 56 amp=142 pan=0 89 %font "FluidR3_GM.sf2" 0 56 amp=124 pan=0 90 %font "FluidR3_GM.sf2" 0 57 amp=88 pan=0 91 %font "FluidR3_GM.sf2" 0 57 amp=51 pan=0 92 %font "FluidR3_GM.sf2" 0 60 amp=98 pan=0 93 %font "FluidR3_GM.sf2" 0 60 amp=136 pan=0 94 %font "FluidR3_GM.sf2" 0 58 amp=63 pan=0 95 %font "FluidR3_GM.sf2" 0 61 amp=53 pan=0 96 %font "FluidR3_GM.sf2" 0 61 amp=47 pan=0 97 %font "FluidR3_GM.sf2" 0 11 amp=28 pan=0 98 %font "FluidR3_GM.sf2" 0 11 amp=31 pan=0 99 %font "FluidR3_GM.sf2" 0 12 amp=14 pan=0 100 %font "FluidR3_GM.sf2" 0 88 amp=38 pan=0 101 %font "FluidR3_GM.sf2" 0 9 amp=35 pan=0 102 %font "FluidR3_GM.sf2" 0 14 amp=48 pan=0 103 %font "FluidR3_GM.sf2" 0 13 amp=47 pan=0 104 %font "FluidR3_GM.sf2" 0 12 amp=21 pan=0 105 %font "FluidR3_GM.sf2" 0 107 amp=89 pan=0 106 %font "FluidR3_GM.sf2" 0 111 amp=53 pan=0 107 %font "FluidR3_GM.sf2" 0 77 amp=49 pan=0 108 %font "FluidR3_GM.sf2" 0 78 amp=63 pan=0 109 %font "FluidR3_GM.sf2" 0 78 amp=32 pan=0 110 %font "FluidR3_GM.sf2" 0 76 amp=44 pan=0 111 %font "FluidR3_GM.sf2" 0 76 amp=48 pan=0 112 %font "FluidR3_GM.sf2" 0 47 amp=28 pan=0 113 %font "FluidR3_GM.sf2" 0 117 amp=42 pan=0 114 %font "FluidR3_GM.sf2" 0 118 amp=13 pan=0 115 %font "FluidR3_GM.sf2" 0 118 amp=14 pan=0 116 %font "FluidR3_GM.sf2" 0 118 amp=22 pan=0 117 %font "FluidR3_GM.sf2" 0 116 amp=52 pan=0 118 %font "FluidR3_GM.sf2" 0 116 amp=18 pan=0 119 %font "FluidR3_GM.sf2" 128 0 49 amp=34 pan=0 # Crsh 1(L) Crsh 1(R) drumset 0 0 %font "FluidR3_GM.sf2" 128 0 35 amp=206 pan=0 # Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) 1 %font "FluidR3_GM.sf2" 128 0 35 amp=138 pan=0 # Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) 2 %font "FluidR3_GM.sf2" 128 1 35 amp=189 pan=0 # Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) 3 %font "FluidR3_GM.sf2" 128 1 35 amp=129 pan=0 # Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) 4 %font "FluidR3_GM.sf2" 128 0 35 amp=100 pan=0 # Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) 5 %font "FluidR3_GM.sf2" 128 0 35 amp=107 pan=0 # Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) 6 %font "FluidR3_GM.sf2" 128 32 35 amp=89 pan=0 # Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) 7 %font "FluidR3_GM.sf2" 128 32 35 amp=119 pan=0 # Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) 8 %font "FluidR3_GM.sf2" 128 8 35 amp=249 pan=0 # Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) 9 %font "FluidR3_GM.sf2" 128 8 35 amp=143 pan=0 # Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) 10 %font "FluidR3_GM.sf2" 128 16 35 amp=86 pan=0 # Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R 11 %font "FluidR3_GM.sf2" 128 16 36 amp=85 pan=0 # Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R 12 %font "FluidR3_GM.sf2" 128 24 35 amp=86 pan=0 # Elec Kick1(L) Elec Kick1(R) 13 %font "FluidR3_GM.sf2" 128 24 36 amp=219 pan=0 # Elec Kick2(L) Elec Kick2(R) 14 %font "FluidR3_GM.sf2" 128 25 35 amp=59 pan=0 # 808 Kick 1 808 Kick 1 15 %font "FluidR3_GM.sf2" 128 25 36 amp=47 pan=0 # 808 Kick 2 808 Kick 2 16 %font "FluidR3_GM.sf2" 128 25 35 amp=60 pan=0 # 808 Kick 1 808 Kick 1 27 %font "FluidR3_GM.sf2" 128 0 27 amp=31 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 0 28 amp=44 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 0 29 amp=26 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 0 30 amp=27 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 0 31 amp=119 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 0 32 amp=128 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 0 33 amp=54 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 0 34 amp=16 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 0 35 amp=129 pan=0 # Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) 36 %font "FluidR3_GM.sf2" 128 0 35 amp=141 pan=0 # Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) 37 %font "FluidR3_GM.sf2" 128 0 37 amp=116 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 0 38 amp=110 pan=0 # Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) 39 %font "FluidR3_GM.sf2" 128 0 39 amp=38 pan=-16 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 0 40 amp=241 pan=0 # Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) 41 %font "FluidR3_GM.sf2" 128 0 41 amp=105 pan=-47 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 0 42 amp=20 pan=31 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 0 43 amp=73 pan=-28 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 0 44 amp=10 pan=31 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 0 45 amp=132 pan=-9 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 0 46 amp=89 pan=31 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 0 47 amp=167 pan=9 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 0 48 amp=148 pan=28 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 0 49 amp=79 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 0 50 amp=78 pan=47 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 0 51 amp=23 pan=-31 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 0 52 amp=84 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 0 53 amp=55 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 0 54 amp=62 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 0 55 amp=49 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 0 56 amp=100 pan=31 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 0 57 amp=56 pan=-31 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 0 58 amp=27 pan=-55 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 0 59 amp=25 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 0 60 amp=9 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 0 61 amp=55 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 0 62 amp=30 pan=-39 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 0 63 amp=80 pan=-39 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 0 64 amp=46 pan=-31 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 0 65 amp=153 pan=31 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 0 66 amp=96 pan=31 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 0 67 amp=57 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 0 68 amp=64 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 0 69 amp=15 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 0 70 amp=49 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 0 71 amp=59 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 0 72 amp=47 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 0 73 amp=43 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 0 74 amp=33 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 0 75 amp=78 pan=31 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 0 76 amp=68 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 0 77 amp=131 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 0 78 amp=66 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 0 79 amp=30 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 0 80 amp=44 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 0 81 amp=64 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 0 82 amp=249 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 0 83 amp=102 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 0 84 amp=34 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 0 85 amp=83 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 0 86 amp=48 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 0 87 amp=56 pan=-31 # Long Taiko Hit Long Taiko Hit 97 %font "FluidR3_GM.sf2" 128 0 38 amp=108 pan=0 # Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) 98 %font "FluidR3_GM.sf2" 128 0 40 amp=130 pan=0 # Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) 99 %font "FluidR3_GM.sf2" 128 1 38 amp=94 pan=0 # Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) 100 %font "FluidR3_GM.sf2" 128 1 40 amp=79 pan=0 # Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) 101 %font "FluidR3_GM.sf2" 128 0 40 amp=220 pan=0 # Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) 102 %font "FluidR3_GM.sf2" 128 0 38 amp=109 pan=0 # Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) 103 %font "FluidR3_GM.sf2" 128 0 40 amp=160 pan=0 # Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) 104 %font "FluidR3_GM.sf2" 128 0 38 amp=133 pan=0 # Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) 105 %font "FluidR3_GM.sf2" 128 32 38 amp=88 pan=0 # Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) 106 %font "FluidR3_GM.sf2" 128 32 40 amp=138 pan=0 # Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) 107 %font "FluidR3_GM.sf2" 128 8 38 amp=75 pan=0 # Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) 108 %font "FluidR3_GM.sf2" 128 8 40 amp=92 pan=0 # Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) 109 %font "FluidR3_GM.sf2" 128 16 38 amp=74 pan=0 # Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) 110 %font "FluidR3_GM.sf2" 128 16 40 amp=104 pan=0 # Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) 111 %font "FluidR3_GM.sf2" 128 24 40 amp=76 pan=0 # Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) 112 %font "FluidR3_GM.sf2" 128 11 38 amp=67 pan=0 # RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) 113 %font "FluidR3_GM.sf2" 128 11 40 amp=100 pan=0 # RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) 114 %font "FluidR3_GM.sf2" 128 11 38 amp=71 pan=0 # RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) 115 %font "FluidR3_GM.sf2" 128 24 40 amp=51 pan=0 # Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) 116 %font "FluidR3_GM.sf2" 128 24 38 amp=99 pan=0 # Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) 117 %font "FluidR3_GM.sf2" 128 24 38 amp=155 pan=0 # Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) 118 %font "FluidR3_GM.sf2" 128 25 38 amp=39 pan=0 # 808 Snare 1 808 Snare 1 119 %font "FluidR3_GM.sf2" 128 25 38 amp=34 pan=0 # 808 Snare 1 808 Snare 1 120 %font "FluidR3_GM.sf2" 128 25 40 amp=33 pan=0 # 808 Snare 2 808 Snare 2 121 %font "FluidR3_GM.sf2" 128 25 38 amp=27 pan=0 # 808 Snare 1 808 Snare 1 122 %font "FluidR3_GM.sf2" 128 25 40 amp=48 pan=0 # 808 Snare 2 808 Snare 2 123 %font "FluidR3_GM.sf2" 128 9 38 amp=79 pan=0 # Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) 124 %font "FluidR3_GM.sf2" 128 10 38 amp=58 pan=0 # RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) 125 %font "FluidR3_GM.sf2" 128 11 38 amp=113 pan=0 # RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) 126 %font "FluidR3_GM.sf2" 128 11 38 amp=77 pan=0 # RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) 127 %font "FluidR3_GM.sf2" 128 11 38 amp=88 pan=0 # RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) drumset 1 27 %font "FluidR3_GM.sf2" 128 1 27 amp=31 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 1 28 amp=43 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 1 29 amp=26 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 1 30 amp=43 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 1 31 amp=75 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 1 32 amp=176 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 1 33 amp=53 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 1 34 amp=16 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 1 35 amp=139 pan=0 # Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) 36 %font "FluidR3_GM.sf2" 128 1 35 amp=210 pan=0 # Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) 37 %font "FluidR3_GM.sf2" 128 1 37 amp=186 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 1 38 amp=154 pan=0 # Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) 39 %font "FluidR3_GM.sf2" 128 1 39 amp=58 pan=-16 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 1 40 amp=52 pan=0 # Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) 41 %font "FluidR3_GM.sf2" 128 1 41 amp=153 pan=-47 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 1 42 amp=33 pan=31 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 1 43 amp=73 pan=-28 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 1 44 amp=14 pan=31 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 1 45 amp=132 pan=-9 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 1 46 amp=47 pan=31 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 1 47 amp=112 pan=9 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 1 48 amp=217 pan=28 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 1 49 amp=83 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 1 50 amp=247 pan=47 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 1 51 amp=23 pan=-31 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 1 52 amp=65 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 1 53 amp=24 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 1 54 amp=17 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 1 55 amp=51 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 1 56 amp=103 pan=31 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 1 57 amp=47 pan=-31 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 1 58 amp=64 pan=-55 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 1 59 amp=26 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 1 60 amp=87 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 1 61 amp=88 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 1 62 amp=30 pan=-39 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 1 63 amp=78 pan=-39 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 1 64 amp=46 pan=-31 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 1 65 amp=98 pan=31 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 1 66 amp=145 pan=31 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 1 67 amp=57 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 1 68 amp=64 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 1 69 amp=15 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 1 70 amp=31 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 1 71 amp=59 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 1 72 amp=76 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 1 73 amp=43 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 1 74 amp=32 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 1 75 amp=78 pan=31 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 1 76 amp=69 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 1 77 amp=81 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 1 78 amp=105 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 1 79 amp=30 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 1 80 amp=45 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 1 81 amp=63 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 1 82 amp=155 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 1 83 amp=165 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 1 84 amp=95 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 1 85 amp=11 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 1 86 amp=46 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 1 87 amp=55 pan=-31 # Long Taiko Hit Long Taiko Hit drumset 2 27 %font "FluidR3_GM.sf2" 128 2 27 amp=31 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 2 28 amp=43 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 2 29 amp=26 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 2 30 amp=27 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 2 31 amp=75 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 2 32 amp=129 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 2 33 amp=85 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 2 34 amp=16 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 2 35 amp=110 pan=0 # Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) 37 %font "FluidR3_GM.sf2" 128 2 37 amp=116 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 2 38 amp=281 pan=0 # Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) 39 %font "FluidR3_GM.sf2" 128 2 39 amp=38 pan=-16 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 2 40 amp=221 pan=0 # Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) 41 %font "FluidR3_GM.sf2" 128 2 41 amp=105 pan=-47 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 2 42 amp=20 pan=31 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 2 43 amp=106 pan=-28 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 2 44 amp=16 pan=31 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 2 45 amp=194 pan=-9 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 2 46 amp=62 pan=31 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 2 47 amp=114 pan=9 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 2 48 amp=148 pan=28 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 2 49 amp=81 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 2 50 amp=245 pan=47 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 2 51 amp=25 pan=-31 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 2 52 amp=38 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 2 53 amp=21 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 2 54 amp=17 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 2 55 amp=71 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 2 56 amp=102 pan=31 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 2 57 amp=56 pan=-31 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 2 58 amp=27 pan=-55 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 2 59 amp=16 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 2 60 amp=54 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 2 61 amp=88 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 2 62 amp=30 pan=-39 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 2 63 amp=78 pan=-39 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 2 64 amp=45 pan=-31 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 2 65 amp=98 pan=31 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 2 66 amp=95 pan=31 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 2 67 amp=92 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 2 68 amp=64 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 2 69 amp=15 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 2 70 amp=31 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 2 71 amp=59 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 2 72 amp=47 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 2 73 amp=69 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 2 74 amp=30 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 2 75 amp=78 pan=31 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 2 76 amp=68 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 2 77 amp=83 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 2 78 amp=66 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 2 79 amp=49 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 2 80 amp=63 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 2 81 amp=63 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 2 82 amp=155 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 2 83 amp=102 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 2 84 amp=35 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 2 85 amp=127 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 2 86 amp=51 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 2 87 amp=55 pan=-31 # Long Taiko Hit Long Taiko Hit drumset 3 27 %font "FluidR3_GM.sf2" 128 3 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 3 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 3 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 3 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 3 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 3 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 3 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 3 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 3 35 amp=100 pan=0 # Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) 37 %font "FluidR3_GM.sf2" 128 3 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 3 38 amp=100 pan=0 # Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) 39 %font "FluidR3_GM.sf2" 128 3 39 amp=100 pan=0 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 3 40 amp=100 pan=0 # Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) 41 %font "FluidR3_GM.sf2" 128 3 41 amp=100 pan=0 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 3 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 3 43 amp=100 pan=0 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 3 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 3 45 amp=100 pan=0 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 3 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 3 47 amp=100 pan=0 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 3 48 amp=100 pan=0 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 3 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 3 50 amp=100 pan=0 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 3 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 3 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 3 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 3 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 3 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 3 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 3 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 3 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 3 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 3 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 3 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 3 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 3 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 3 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 3 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 3 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 3 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 3 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 3 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 3 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 3 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 3 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 3 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 3 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 3 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 3 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 3 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 3 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 3 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 3 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 3 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 3 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 3 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 3 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 3 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 3 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 3 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 4 27 %font "FluidR3_GM.sf2" 128 4 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 4 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 4 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 4 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 4 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 4 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 4 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 4 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 4 35 amp=100 pan=0 # Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) 37 %font "FluidR3_GM.sf2" 128 4 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 4 38 amp=100 pan=0 # Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) 39 %font "FluidR3_GM.sf2" 128 4 39 amp=100 pan=0 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 4 40 amp=100 pan=0 # Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) 41 %font "FluidR3_GM.sf2" 128 4 41 amp=100 pan=0 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 4 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 4 43 amp=100 pan=0 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 4 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 4 45 amp=100 pan=0 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 4 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 4 47 amp=100 pan=0 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 4 48 amp=100 pan=0 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 4 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 4 50 amp=100 pan=0 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 4 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 4 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 4 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 4 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 4 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 4 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 4 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 4 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 4 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 4 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 4 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 4 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 4 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 4 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 4 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 4 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 4 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 4 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 4 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 4 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 4 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 4 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 4 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 4 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 4 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 4 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 4 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 4 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 4 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 4 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 4 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 4 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 4 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 4 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 4 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 4 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 4 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 5 27 %font "FluidR3_GM.sf2" 128 5 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 5 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 5 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 5 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 5 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 5 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 5 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 5 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 5 35 amp=100 pan=0 # Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) 37 %font "FluidR3_GM.sf2" 128 5 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 5 38 amp=100 pan=0 # Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) 39 %font "FluidR3_GM.sf2" 128 5 39 amp=100 pan=0 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 5 40 amp=100 pan=0 # Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) 41 %font "FluidR3_GM.sf2" 128 5 41 amp=100 pan=0 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 5 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 5 43 amp=100 pan=0 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 5 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 5 45 amp=100 pan=0 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 5 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 5 47 amp=100 pan=0 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 5 48 amp=100 pan=0 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 5 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 5 50 amp=100 pan=0 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 5 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 5 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 5 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 5 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 5 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 5 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 5 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 5 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 5 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 5 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 5 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 5 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 5 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 5 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 5 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 5 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 5 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 5 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 5 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 5 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 5 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 5 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 5 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 5 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 5 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 5 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 5 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 5 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 5 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 5 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 5 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 5 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 5 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 5 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 5 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 5 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 5 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 6 27 %font "FluidR3_GM.sf2" 128 6 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 6 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 6 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 6 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 6 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 6 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 6 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 6 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 6 35 amp=100 pan=0 # Std Kick 4(L) Std Kick 4(R) Std Kick 4(L) Std Kick 4(R) Std Kick 4(L) Std Kick 4(R) Std Kick 4(L) Std Kick 4(R) Std Kick 4(L) Std Kick 4(R) Std Kick 4(L) Std Kick 4(R) Std Kick 4(L) Std Kick 4(R) 37 %font "FluidR3_GM.sf2" 128 6 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 6 38 amp=100 pan=0 # Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) 39 %font "FluidR3_GM.sf2" 128 6 39 amp=100 pan=0 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 6 40 amp=100 pan=0 # Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) 41 %font "FluidR3_GM.sf2" 128 6 41 amp=100 pan=0 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 6 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 6 43 amp=100 pan=0 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 6 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 6 45 amp=100 pan=0 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 6 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 6 47 amp=100 pan=0 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 6 48 amp=100 pan=0 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 6 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 6 50 amp=100 pan=0 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 6 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 6 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 6 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 6 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 6 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 6 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 6 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 6 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 6 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 6 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 6 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 6 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 6 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 6 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 6 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 6 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 6 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 6 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 6 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 6 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 6 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 6 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 6 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 6 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 6 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 6 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 6 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 6 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 6 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 6 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 6 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 6 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 6 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 6 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 6 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 6 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 6 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 7 27 %font "FluidR3_GM.sf2" 128 7 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 7 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 7 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 7 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 7 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 7 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 7 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 7 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 7 35 amp=100 pan=0 # Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) 37 %font "FluidR3_GM.sf2" 128 7 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 7 38 amp=100 pan=0 # Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) 39 %font "FluidR3_GM.sf2" 128 7 39 amp=100 pan=0 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 7 40 amp=100 pan=0 # Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) 41 %font "FluidR3_GM.sf2" 128 7 41 amp=100 pan=0 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 7 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 7 43 amp=100 pan=0 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 7 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 7 45 amp=100 pan=0 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 7 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 7 47 amp=100 pan=0 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 7 48 amp=100 pan=0 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 7 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 7 50 amp=100 pan=0 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 7 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 7 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 7 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 7 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 7 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 7 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 7 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 7 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 7 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 7 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 7 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 7 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 7 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 7 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 7 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 7 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 7 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 7 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 7 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 7 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 7 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 7 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 7 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 7 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 7 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 7 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 7 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 7 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 7 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 7 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 7 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 7 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 7 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 7 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 7 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 7 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 7 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 8 27 %font "FluidR3_GM.sf2" 128 8 27 amp=45 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 8 28 amp=70 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 8 29 amp=26 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 8 30 amp=27 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 8 31 amp=75 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 8 32 amp=131 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 8 33 amp=54 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 8 34 amp=16 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 8 35 amp=149 pan=0 # Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) 37 %font "FluidR3_GM.sf2" 128 8 37 amp=116 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 8 38 amp=125 pan=0 # Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) 39 %font "FluidR3_GM.sf2" 128 8 39 amp=58 pan=-16 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 8 40 amp=126 pan=0 # Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) 41 %font "FluidR3_GM.sf2" 128 8 41 amp=84 pan=-47 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 8 42 amp=20 pan=31 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 8 43 amp=62 pan=-28 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 8 44 amp=31 pan=31 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 8 45 amp=231 pan=-9 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 8 46 amp=64 pan=31 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 8 47 amp=127 pan=9 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 8 48 amp=129 pan=28 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 8 49 amp=83 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 8 50 amp=238 pan=47 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 8 51 amp=29 pan=-31 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 8 52 amp=84 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 8 53 amp=24 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 8 54 amp=63 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 8 55 amp=51 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 8 56 amp=158 pan=31 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 8 57 amp=50 pan=-31 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 8 58 amp=27 pan=-55 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 8 59 amp=20 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 8 60 amp=54 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 8 61 amp=53 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 8 62 amp=46 pan=-39 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 8 63 amp=78 pan=-39 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 8 64 amp=45 pan=-31 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 8 65 amp=98 pan=31 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 8 66 amp=96 pan=31 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 8 67 amp=57 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 8 68 amp=103 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 8 69 amp=15 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 8 70 amp=31 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 8 71 amp=59 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 8 72 amp=47 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 8 73 amp=43 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 8 74 amp=30 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 8 75 amp=123 pan=31 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 8 76 amp=68 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 8 77 amp=84 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 8 78 amp=66 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 8 79 amp=30 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 8 80 amp=64 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 8 81 amp=64 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 8 82 amp=155 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 8 83 amp=102 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 8 84 amp=34 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 8 85 amp=84 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 8 86 amp=71 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 8 87 amp=78 pan=-31 # Long Taiko Hit Long Taiko Hit drumset 9 27 %font "FluidR3_GM.sf2" 128 9 27 amp=32 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 9 28 amp=44 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 9 29 amp=52 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 9 30 amp=35 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 9 31 amp=75 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 9 32 amp=176 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 9 33 amp=54 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 9 34 amp=16 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 9 35 amp=288 pan=0 # Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) 36 %font "FluidR3_GM.sf2" 128 25 36 amp=68 pan=0 # 808 Kick 2 808 Kick 2 37 %font "FluidR3_GM.sf2" 128 9 37 amp=210 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 9 38 amp=79 pan=0 # Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) 39 %font "FluidR3_GM.sf2" 128 9 39 amp=38 pan=-16 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 9 40 amp=57 pan=0 # Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) 41 %font "FluidR3_GM.sf2" 128 9 41 amp=237 pan=-47 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 9 42 amp=30 pan=31 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 9 43 amp=95 pan=-28 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 9 44 amp=20 pan=31 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 9 45 amp=178 pan=-9 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 9 46 amp=64 pan=31 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 9 47 amp=159 pan=9 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 9 48 amp=91 pan=28 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 9 49 amp=66 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 9 50 amp=100 pan=47 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 9 51 amp=23 pan=-31 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 9 52 amp=28 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 9 53 amp=55 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 9 54 amp=20 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 9 55 amp=50 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 9 56 amp=55 pan=31 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 9 57 amp=50 pan=-31 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 9 58 amp=27 pan=-55 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 9 59 amp=26 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 9 60 amp=54 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 9 61 amp=54 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 9 62 amp=30 pan=-39 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 9 63 amp=78 pan=-39 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 9 64 amp=72 pan=-31 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 9 65 amp=98 pan=31 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 9 66 amp=95 pan=31 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 9 67 amp=58 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 9 68 amp=64 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 9 69 amp=15 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 9 70 amp=48 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 9 71 amp=59 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 9 72 amp=76 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 9 73 amp=43 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 9 74 amp=83 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 9 75 amp=68 pan=31 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 9 76 amp=68 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 9 77 amp=133 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 9 78 amp=87 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 9 79 amp=51 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 9 80 amp=36 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 9 81 amp=81 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 9 82 amp=99 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 9 83 amp=165 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 9 84 amp=35 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 9 85 amp=84 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 9 86 amp=48 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 9 87 amp=55 pan=-31 # Long Taiko Hit Long Taiko Hit drumset 10 27 %font "FluidR3_GM.sf2" 128 10 27 amp=32 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 10 28 amp=44 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 10 29 amp=32 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 10 30 amp=57 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 10 31 amp=76 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 10 32 amp=178 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 10 33 amp=53 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 10 34 amp=16 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 10 35 amp=63 pan=0 # Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) 36 %font "FluidR3_GM.sf2" 128 25 36 amp=96 pan=0 # 808 Kick 2 808 Kick 2 37 %font "FluidR3_GM.sf2" 128 10 37 amp=118 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 10 38 amp=68 pan=0 # RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) 39 %font "FluidR3_GM.sf2" 128 10 39 amp=71 pan=-16 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 10 40 amp=70 pan=0 # RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) 41 %font "FluidR3_GM.sf2" 128 10 41 amp=237 pan=-47 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 10 42 amp=45 pan=31 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 10 43 amp=95 pan=-28 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 10 44 amp=39 pan=31 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 10 45 amp=178 pan=-9 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 10 46 amp=161 pan=31 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 10 47 amp=159 pan=9 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 10 48 amp=91 pan=28 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 10 49 amp=72 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 10 50 amp=34 pan=47 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 10 51 amp=23 pan=-31 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 10 52 amp=28 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 10 53 amp=55 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 10 54 amp=94 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 10 55 amp=50 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 10 56 amp=55 pan=31 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 10 57 amp=56 pan=-31 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 10 58 amp=27 pan=-55 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 10 59 amp=26 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 10 60 amp=87 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 10 61 amp=54 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 10 62 amp=30 pan=-39 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 10 63 amp=80 pan=-39 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 10 64 amp=46 pan=-31 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 10 65 amp=98 pan=31 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 10 66 amp=95 pan=31 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 10 67 amp=57 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 10 68 amp=64 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 10 69 amp=15 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 10 70 amp=48 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 10 71 amp=95 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 10 72 amp=76 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 10 73 amp=43 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 10 74 amp=83 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 10 75 amp=64 pan=31 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 10 76 amp=68 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 10 77 amp=131 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 10 78 amp=86 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 10 79 amp=51 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 10 80 amp=36 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 10 81 amp=53 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 10 82 amp=99 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 10 83 amp=164 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 10 84 amp=53 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 10 85 amp=83 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 10 86 amp=47 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 10 87 amp=56 pan=-31 # Long Taiko Hit Long Taiko Hit drumset 11 27 %font "FluidR3_GM.sf2" 128 11 27 amp=32 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 11 28 amp=44 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 11 29 amp=32 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 11 30 amp=57 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 11 31 amp=119 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 11 32 amp=175 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 11 33 amp=53 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 11 34 amp=16 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 11 35 amp=184 pan=0 # Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) 36 %font "FluidR3_GM.sf2" 128 25 36 amp=111 pan=0 # 808 Kick 2 808 Kick 2 37 %font "FluidR3_GM.sf2" 128 11 37 amp=210 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 11 38 amp=61 pan=0 # RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) 39 %font "FluidR3_GM.sf2" 128 11 39 amp=57 pan=-16 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 11 40 amp=126 pan=0 # RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) 41 %font "FluidR3_GM.sf2" 128 11 41 amp=130 pan=-47 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 11 42 amp=36 pan=31 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 11 43 amp=143 pan=-28 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 11 44 amp=52 pan=31 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 11 45 amp=170 pan=-9 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 11 46 amp=106 pan=31 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 11 47 amp=148 pan=9 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 11 48 amp=218 pan=28 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 11 49 amp=106 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 11 50 amp=160 pan=47 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 11 51 amp=23 pan=-31 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 11 52 amp=28 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 11 53 amp=41 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 11 54 amp=94 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 11 55 amp=72 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 11 56 amp=55 pan=31 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 11 57 amp=58 pan=-31 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 11 58 amp=47 pan=-55 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 11 59 amp=21 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 11 60 amp=106 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 11 61 amp=97 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 11 62 amp=69 pan=-39 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 11 63 amp=89 pan=-39 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 11 64 amp=88 pan=-31 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 11 65 amp=98 pan=31 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 11 66 amp=145 pan=31 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 11 67 amp=57 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 11 68 amp=64 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 11 69 amp=15 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 11 70 amp=48 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 11 71 amp=59 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 11 72 amp=76 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 11 73 amp=43 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 11 74 amp=83 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 11 75 amp=71 pan=31 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 11 76 amp=68 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 11 77 amp=84 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 11 78 amp=133 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 11 79 amp=79 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 11 80 amp=36 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 11 81 amp=53 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 11 82 amp=99 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 11 83 amp=102 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 11 84 amp=52 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 11 85 amp=127 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 11 86 amp=48 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 11 87 amp=55 pan=-31 # Long Taiko Hit Long Taiko Hit drumset 12 27 %font "FluidR3_GM.sf2" 128 12 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 12 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 12 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 12 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 12 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 12 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 12 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 12 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 12 35 amp=100 pan=0 # Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) 37 %font "FluidR3_GM.sf2" 128 12 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 12 38 amp=100 pan=0 # Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) 39 %font "FluidR3_GM.sf2" 128 12 39 amp=100 pan=0 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 12 40 amp=100 pan=0 # Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) 41 %font "FluidR3_GM.sf2" 128 12 41 amp=100 pan=0 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 12 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 12 43 amp=100 pan=0 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 12 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 12 45 amp=100 pan=0 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 12 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 12 47 amp=100 pan=0 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 12 48 amp=100 pan=0 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 12 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 12 50 amp=100 pan=0 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 12 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 12 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 12 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 12 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 12 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 12 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 12 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 12 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 12 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 12 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 12 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 12 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 12 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 12 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 12 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 12 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 12 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 12 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 12 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 12 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 12 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 12 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 12 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 12 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 12 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 12 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 12 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 12 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 12 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 12 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 12 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 12 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 12 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 12 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 12 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 12 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 12 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 13 27 %font "FluidR3_GM.sf2" 128 13 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 13 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 13 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 13 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 13 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 13 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 13 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 13 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 13 35 amp=100 pan=0 # Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) 37 %font "FluidR3_GM.sf2" 128 13 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 13 38 amp=100 pan=0 # Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) 39 %font "FluidR3_GM.sf2" 128 13 39 amp=100 pan=0 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 13 40 amp=100 pan=0 # Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) 41 %font "FluidR3_GM.sf2" 128 13 41 amp=100 pan=0 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 13 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 13 43 amp=100 pan=0 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 13 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 13 45 amp=100 pan=0 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 13 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 13 47 amp=100 pan=0 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 13 48 amp=100 pan=0 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 13 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 13 50 amp=100 pan=0 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 13 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 13 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 13 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 13 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 13 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 13 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 13 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 13 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 13 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 13 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 13 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 13 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 13 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 13 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 13 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 13 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 13 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 13 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 13 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 13 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 13 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 13 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 13 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 13 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 13 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 13 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 13 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 13 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 13 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 13 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 13 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 13 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 13 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 13 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 13 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 13 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 13 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 14 27 %font "FluidR3_GM.sf2" 128 14 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 14 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 14 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 14 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 14 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 14 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 14 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 14 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 14 35 amp=100 pan=0 # Std Kick 4(L) Std Kick 4(R) Std Kick 4(L) Std Kick 4(R) Std Kick 4(L) Std Kick 4(R) Std Kick 4(L) Std Kick 4(R) Std Kick 4(L) Std Kick 4(R) Std Kick 4(L) Std Kick 4(R) Std Kick 4(L) Std Kick 4(R) 37 %font "FluidR3_GM.sf2" 128 14 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 14 38 amp=100 pan=0 # Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) 39 %font "FluidR3_GM.sf2" 128 14 39 amp=100 pan=0 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 14 40 amp=100 pan=0 # Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) 41 %font "FluidR3_GM.sf2" 128 14 41 amp=100 pan=0 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 14 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 14 43 amp=100 pan=0 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 14 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 14 45 amp=100 pan=0 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 14 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 14 47 amp=100 pan=0 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 14 48 amp=100 pan=0 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 14 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 14 50 amp=100 pan=0 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 14 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 14 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 14 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 14 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 14 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 14 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 14 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 14 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 14 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 14 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 14 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 14 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 14 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 14 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 14 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 14 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 14 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 14 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 14 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 14 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 14 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 14 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 14 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 14 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 14 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 14 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 14 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 14 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 14 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 14 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 14 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 14 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 14 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 14 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 14 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 14 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 14 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 15 27 %font "FluidR3_GM.sf2" 128 15 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 15 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 15 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 15 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 15 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 15 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 15 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 15 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 15 35 amp=100 pan=0 # Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) 37 %font "FluidR3_GM.sf2" 128 15 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 15 38 amp=100 pan=0 # Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) 39 %font "FluidR3_GM.sf2" 128 15 39 amp=100 pan=0 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 15 40 amp=100 pan=0 # Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) 41 %font "FluidR3_GM.sf2" 128 15 41 amp=100 pan=0 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 15 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 15 43 amp=100 pan=0 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 15 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 15 45 amp=100 pan=0 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 15 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 15 47 amp=100 pan=0 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 15 48 amp=100 pan=0 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 15 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 15 50 amp=100 pan=0 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 15 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 15 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 15 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 15 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 15 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 15 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 15 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 15 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 15 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 15 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 15 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 15 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 15 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 15 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 15 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 15 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 15 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 15 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 15 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 15 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 15 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 15 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 15 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 15 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 15 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 15 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 15 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 15 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 15 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 15 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 15 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 15 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 15 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 15 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 15 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 15 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 15 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 16 27 %font "FluidR3_GM.sf2" 128 16 27 amp=45 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 16 28 amp=43 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 16 29 amp=26 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 16 30 amp=27 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 16 31 amp=75 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 16 32 amp=176 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 16 33 amp=86 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 16 34 amp=24 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 16 35 amp=147 pan=0 # Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R 36 %font "FluidR3_GM.sf2" 128 16 36 amp=80 pan=0 # Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R 37 %font "FluidR3_GM.sf2" 128 16 37 amp=116 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 16 38 amp=105 pan=0 # Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) 39 %font "FluidR3_GM.sf2" 128 16 39 amp=93 pan=-16 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 16 40 amp=155 pan=0 # Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) 41 %font "FluidR3_GM.sf2" 128 16 41 amp=82 pan=-47 # Tom Floor(L) Tom Floor(R) 42 %font "FluidR3_GM.sf2" 128 16 42 amp=20 pan=31 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 16 43 amp=79 pan=-28 # Tom Floor(L) Tom Floor(R) 44 %font "FluidR3_GM.sf2" 128 16 44 amp=10 pan=31 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 16 45 amp=98 pan=-9 # Tom Low(L) Tom Low(R) 46 %font "FluidR3_GM.sf2" 128 16 46 amp=62 pan=31 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 16 47 amp=59 pan=9 # Tom Med(L) Tom Med(R) 48 %font "FluidR3_GM.sf2" 128 16 48 amp=72 pan=28 # Tom Hi(L) Tom Hi(R) 49 %font "FluidR3_GM.sf2" 128 16 49 amp=83 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 16 50 amp=31 pan=47 # Tom Hi(L) Tom Hi(R) 51 %font "FluidR3_GM.sf2" 128 16 51 amp=29 pan=-31 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 16 52 amp=38 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 16 53 amp=24 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 16 54 amp=17 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 16 55 amp=50 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 16 56 amp=103 pan=31 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 16 57 amp=56 pan=-31 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 16 58 amp=65 pan=-55 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 16 59 amp=20 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 16 60 amp=54 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 16 61 amp=55 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 16 62 amp=30 pan=-39 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 16 63 amp=126 pan=-39 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 16 64 amp=70 pan=-31 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 16 65 amp=98 pan=31 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 16 66 amp=95 pan=31 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 16 67 amp=58 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 16 68 amp=64 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 16 69 amp=47 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 16 70 amp=31 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 16 71 amp=59 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 16 72 amp=47 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 16 73 amp=43 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 16 74 amp=32 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 16 75 amp=123 pan=31 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 16 76 amp=68 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 16 77 amp=84 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 16 78 amp=66 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 16 79 amp=30 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 16 80 amp=45 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 16 81 amp=97 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 16 82 amp=155 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 16 83 amp=102 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 16 84 amp=34 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 16 85 amp=84 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 16 86 amp=46 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 16 87 amp=78 pan=-31 # Long Taiko Hit Long Taiko Hit drumset 17 27 %font "FluidR3_GM.sf2" 128 17 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 17 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 17 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 17 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 17 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 17 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 17 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 17 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 17 35 amp=100 pan=0 # Power Kick (L) Power Kick (R) Power Kick (L) Power Kick (R) Power Kick (L) Power Kick (R) Power Kick (L) Power Kick (R) Power Kick (L) Power Kick (R) Power Kick (L) Power Kick (R) Power Kick (L) Power Kick (R) 37 %font "FluidR3_GM.sf2" 128 17 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 17 38 amp=100 pan=0 # RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) 39 %font "FluidR3_GM.sf2" 128 17 39 amp=100 pan=0 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 17 40 amp=100 pan=0 # RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) 41 %font "FluidR3_GM.sf2" 128 17 41 amp=100 pan=0 # Tom Floor(L) Tom Floor(R) 42 %font "FluidR3_GM.sf2" 128 17 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 17 43 amp=100 pan=0 # Tom Floor(L) Tom Floor(R) 44 %font "FluidR3_GM.sf2" 128 17 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 17 45 amp=100 pan=0 # Tom Low(L) Tom Low(R) 46 %font "FluidR3_GM.sf2" 128 17 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 17 47 amp=100 pan=0 # Tom Med(L) Tom Med(R) 48 %font "FluidR3_GM.sf2" 128 17 48 amp=100 pan=0 # Tom Hi(L) Tom Hi(R) 49 %font "FluidR3_GM.sf2" 128 17 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 17 50 amp=100 pan=0 # Tom Hi(L) Tom Hi(R) 51 %font "FluidR3_GM.sf2" 128 17 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 17 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 17 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 17 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 17 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 17 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 17 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 17 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 17 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 17 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 17 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 17 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 17 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 17 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 17 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 17 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 17 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 17 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 17 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 17 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 17 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 17 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 17 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 17 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 17 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 17 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 17 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 17 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 17 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 17 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 17 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 17 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 17 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 17 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 17 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 17 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 17 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 18 27 %font "FluidR3_GM.sf2" 128 18 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 18 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 18 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 18 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 18 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 18 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 18 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 18 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 18 35 amp=100 pan=0 # Power Kick 2(L) Power Kick 2(R) Power Kick 2(L) Power Kick 2(R) Power Kick 2(L) Power Kick 2(R) Power Kick 2(L) Power Kick 2(R) Power Kick 2(L) Power Kick 2(R) Power Kick 2(L) Power Kick 2(R) Power Kick 2(L) Power Kick 2(R) 37 %font "FluidR3_GM.sf2" 128 18 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 18 38 amp=100 pan=0 # RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) 39 %font "FluidR3_GM.sf2" 128 18 39 amp=100 pan=0 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 18 40 amp=100 pan=0 # RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) 41 %font "FluidR3_GM.sf2" 128 18 41 amp=100 pan=0 # Tom Floor(L) Tom Floor(R) 42 %font "FluidR3_GM.sf2" 128 18 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 18 43 amp=100 pan=0 # Tom Floor(L) Tom Floor(R) 44 %font "FluidR3_GM.sf2" 128 18 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 18 45 amp=100 pan=0 # Tom Low(L) Tom Low(R) 46 %font "FluidR3_GM.sf2" 128 18 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 18 47 amp=100 pan=0 # Tom Med(L) Tom Med(R) 48 %font "FluidR3_GM.sf2" 128 18 48 amp=100 pan=0 # Tom Hi(L) Tom Hi(R) 49 %font "FluidR3_GM.sf2" 128 18 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 18 50 amp=100 pan=0 # Tom Hi(L) Tom Hi(R) 51 %font "FluidR3_GM.sf2" 128 18 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 18 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 18 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 18 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 18 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 18 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 18 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 18 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 18 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 18 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 18 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 18 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 18 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 18 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 18 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 18 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 18 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 18 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 18 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 18 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 18 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 18 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 18 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 18 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 18 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 18 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 18 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 18 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 18 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 18 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 18 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 18 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 18 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 18 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 18 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 18 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 18 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 19 27 %font "FluidR3_GM.sf2" 128 19 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 19 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 19 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 19 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 19 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 19 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 19 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 19 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 19 35 amp=100 pan=0 # Power Kick 3(L) Power Kick 3(R) Power Kick 3(L) Power Kick 3(R) Power Kick 3(L) Power Kick 3(R) Power Kick 3(L) Power Kick 3(R) Power Kick 3(L) Power Kick 3(R) Power Kick 3(L) Power Kick 3(R) Power Kick 3(L) Power Kick 3(R) 37 %font "FluidR3_GM.sf2" 128 19 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 19 38 amp=100 pan=0 # RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) 39 %font "FluidR3_GM.sf2" 128 19 39 amp=100 pan=0 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 19 40 amp=100 pan=0 # RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) 41 %font "FluidR3_GM.sf2" 128 19 41 amp=100 pan=0 # Tom Floor(L) Tom Floor(R) 42 %font "FluidR3_GM.sf2" 128 19 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 19 43 amp=100 pan=0 # Tom Floor(L) Tom Floor(R) 44 %font "FluidR3_GM.sf2" 128 19 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 19 45 amp=100 pan=0 # Tom Low(L) Tom Low(R) 46 %font "FluidR3_GM.sf2" 128 19 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 19 47 amp=100 pan=0 # Tom Med(L) Tom Med(R) 48 %font "FluidR3_GM.sf2" 128 19 48 amp=100 pan=0 # Tom Hi(L) Tom Hi(R) 49 %font "FluidR3_GM.sf2" 128 19 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 19 50 amp=100 pan=0 # Tom Hi(L) Tom Hi(R) 51 %font "FluidR3_GM.sf2" 128 19 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 19 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 19 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 19 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 19 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 19 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 19 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 19 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 19 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 19 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 19 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 19 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 19 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 19 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 19 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 19 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 19 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 19 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 19 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 19 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 19 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 19 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 19 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 19 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 19 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 19 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 19 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 19 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 19 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 19 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 19 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 19 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 19 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 19 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 19 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 19 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 19 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 24 27 %font "FluidR3_GM.sf2" 128 24 27 amp=31 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 24 28 amp=44 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 24 29 amp=31 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 24 30 amp=57 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 24 31 amp=74 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 24 32 amp=176 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 24 33 amp=54 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 24 34 amp=16 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 24 35 amp=162 pan=0 # Elec Kick1(L) Elec Kick1(R) 36 %font "FluidR3_GM.sf2" 128 24 36 amp=265 pan=0 # Elec Kick2(L) Elec Kick2(R) 37 %font "FluidR3_GM.sf2" 128 24 37 amp=116 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 24 38 amp=151 pan=0 # Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) 39 %font "FluidR3_GM.sf2" 128 24 39 amp=58 pan=-16 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 24 40 amp=67 pan=0 # Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) 41 %font "FluidR3_GM.sf2" 128 24 41 amp=180 pan=-47 # ElectTom(L) ElectTom(R) 42 %font "FluidR3_GM.sf2" 128 24 42 amp=33 pan=31 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 24 43 amp=119 pan=-28 # ElectTom(L) ElectTom(R) 44 %font "FluidR3_GM.sf2" 128 24 44 amp=14 pan=31 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 24 45 amp=114 pan=-9 # ElectTom(L) ElectTom(R) 46 %font "FluidR3_GM.sf2" 128 24 46 amp=47 pan=31 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 24 47 amp=116 pan=9 # ElectTom(L) ElectTom(R) 48 %font "FluidR3_GM.sf2" 128 24 48 amp=171 pan=28 # ElectTom(L) ElectTom(R) 49 %font "FluidR3_GM.sf2" 128 24 49 amp=83 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 24 50 amp=53 pan=47 # ElectTom(L) ElectTom(R) 51 %font "FluidR3_GM.sf2" 128 24 51 amp=23 pan=-31 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 24 52 amp=28 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 24 53 amp=41 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 24 54 amp=97 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 24 55 amp=51 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 24 56 amp=101 pan=31 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 24 57 amp=50 pan=-31 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 24 58 amp=27 pan=-55 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 24 59 amp=25 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 24 60 amp=86 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 24 61 amp=54 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 24 62 amp=30 pan=-39 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 24 63 amp=79 pan=-39 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 24 64 amp=45 pan=-31 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 24 65 amp=98 pan=31 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 24 66 amp=96 pan=31 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 24 67 amp=57 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 24 68 amp=65 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 24 69 amp=15 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 24 70 amp=31 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 24 71 amp=59 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 24 72 amp=47 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 24 73 amp=43 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 24 74 amp=30 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 24 75 amp=78 pan=31 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 24 76 amp=109 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 24 77 amp=82 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 24 78 amp=66 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 24 79 amp=30 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 24 80 amp=43 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 24 81 amp=64 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 24 82 amp=249 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 24 83 amp=103 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 24 84 amp=34 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 24 85 amp=83 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 24 86 amp=46 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 24 87 amp=55 pan=-31 # Long Taiko Hit Long Taiko Hit drumset 25 27 %font "FluidR3_GM.sf2" 128 25 27 amp=31 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 25 28 amp=43 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 25 29 amp=31 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 25 30 amp=35 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 25 31 amp=119 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 25 32 amp=130 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 25 33 amp=54 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 25 34 amp=16 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 25 35 amp=54 pan=0 # 808 Kick 1 808 Kick 1 36 %font "FluidR3_GM.sf2" 128 25 36 amp=70 pan=0 # 808 Kick 2 808 Kick 2 37 %font "FluidR3_GM.sf2" 128 25 37 amp=331 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 25 38 amp=29 pan=0 # 808 Snare 1 808 Snare 1 39 %font "FluidR3_GM.sf2" 128 25 39 amp=45 pan=-16 # 808 Clap 808 Clap 40 %font "FluidR3_GM.sf2" 128 25 40 amp=45 pan=0 # 808 Snare 2 808 Snare 2 41 %font "FluidR3_GM.sf2" 128 25 41 amp=38 pan=-47 # 808 Tom 1 808 Tom 1 42 %font "FluidR3_GM.sf2" 128 25 42 amp=21 pan=31 # 808 Closed Hat 808 Closed Hat 43 %font "FluidR3_GM.sf2" 128 25 43 amp=36 pan=-28 # 808 Tom 2 808 Tom 2 44 %font "FluidR3_GM.sf2" 128 25 44 amp=70 pan=31 # 808 Open Hat 808 Open Hat 45 %font "FluidR3_GM.sf2" 128 25 45 amp=53 pan=-9 # 808 Tom 3 808 Tom 3 46 %font "FluidR3_GM.sf2" 128 25 46 amp=78 pan=31 # 808 Open Hat 808 Open Hat 47 %font "FluidR3_GM.sf2" 128 25 47 amp=33 pan=9 # 808 Tom 4 808 Tom 4 48 %font "FluidR3_GM.sf2" 128 25 48 amp=30 pan=28 # 808 Tom 5 808 Tom 5 49 %font "FluidR3_GM.sf2" 128 25 49 amp=56 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 25 50 amp=46 pan=47 # 808 Tom 6 808 Tom 6 51 %font "FluidR3_GM.sf2" 128 25 51 amp=22 pan=-31 # Ride1(L) Ride1(R) 808 Ride 808 Ride 52 %font "FluidR3_GM.sf2" 128 25 52 amp=65 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 25 53 amp=24 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 25 54 amp=99 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 25 55 amp=44 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 25 56 amp=30 pan=31 # 808 Cowbell 808 Cowbell 57 %font "FluidR3_GM.sf2" 128 25 57 amp=58 pan=-31 # Crsh 2(L) Crsh 2(R) 59 %font "FluidR3_GM.sf2" 128 25 59 amp=20 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 25 60 amp=15 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 25 61 amp=63 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 25 62 amp=28 pan=-39 # 808 High Conga 808 High Conga 63 %font "FluidR3_GM.sf2" 128 25 63 amp=66 pan=-31 # 808 Mid Conga 808 Mid Conga 64 %font "FluidR3_GM.sf2" 128 25 64 amp=61 pan=-23 # 808 Low Conga 808 Low Conga 67 %font "FluidR3_GM.sf2" 128 25 67 amp=57 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 25 68 amp=64 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 25 69 amp=47 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 25 70 amp=78 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 25 71 amp=59 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 25 72 amp=47 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 25 73 amp=43 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 25 74 amp=83 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 25 75 amp=41 pan=31 # 808 Clave 808 Clave 76 %font "FluidR3_GM.sf2" 128 25 76 amp=109 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 25 77 amp=81 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 25 78 amp=86 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 25 79 amp=51 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 25 80 amp=36 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 25 81 amp=54 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 25 82 amp=99 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 25 83 amp=102 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 25 84 amp=35 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 25 85 amp=83 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 25 86 amp=46 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 25 87 amp=77 pan=-31 # Long Taiko Hit Long Taiko Hit drumset 26 27 %font "FluidR3_GM.sf2" 128 25 27 amp=45 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 25 28 amp=70 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 25 29 amp=31 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 25 30 amp=35 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 25 31 amp=75 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 25 32 amp=128 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 25 33 amp=54 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 25 34 amp=16 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 25 35 amp=97 pan=0 # 808 Kick 1 808 Kick 1 36 %font "FluidR3_GM.sf2" 128 24 35 amp=104 pan=0 # Elec Kick1(L) Elec Kick1(R) 37 %font "FluidR3_GM.sf2" 128 25 37 amp=116 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 11 38 amp=71 pan=0 # RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) 39 %font "FluidR3_GM.sf2" 128 25 39 amp=46 pan=-16 # 808 Clap 808 Clap 40 %font "FluidR3_GM.sf2" 128 11 40 amp=190 pan=0 # RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) 41 %font "FluidR3_GM.sf2" 128 24 41 amp=123 pan=-47 # ElectTom(L) ElectTom(R) 42 %font "FluidR3_GM.sf2" 128 25 42 amp=34 pan=31 # 808 Closed Hat 808 Closed Hat 43 %font "FluidR3_GM.sf2" 128 24 43 amp=117 pan=-28 # ElectTom(L) ElectTom(R) 44 %font "FluidR3_GM.sf2" 128 25 44 amp=28 pan=31 # 808 Open Hat 808 Open Hat 45 %font "FluidR3_GM.sf2" 128 24 45 amp=116 pan=-9 # ElectTom(L) ElectTom(R) 46 %font "FluidR3_GM.sf2" 128 25 46 amp=112 pan=31 # 808 Open Hat 808 Open Hat 47 %font "FluidR3_GM.sf2" 128 24 47 amp=114 pan=9 # ElectTom(L) ElectTom(R) 48 %font "FluidR3_GM.sf2" 128 24 48 amp=117 pan=28 # ElectTom(L) ElectTom(R) 49 %font "FluidR3_GM.sf2" 128 25 49 amp=55 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 24 50 amp=53 pan=47 # ElectTom(L) ElectTom(R) 51 %font "FluidR3_GM.sf2" 128 25 51 amp=22 pan=-31 # Ride1(L) Ride1(R) 808 Ride 808 Ride 52 %font "FluidR3_GM.sf2" 128 25 52 amp=80 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 25 53 amp=55 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 11 54 amp=59 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 25 55 amp=50 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 25 56 amp=31 pan=31 # 808 Cowbell 808 Cowbell 57 %font "FluidR3_GM.sf2" 128 25 57 amp=56 pan=-31 # Crsh 2(L) Crsh 2(R) 59 %font "FluidR3_GM.sf2" 128 25 59 amp=20 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 25 60 amp=9 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 25 61 amp=53 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 25 62 amp=13 pan=-39 # 808 High Conga 808 High Conga 63 %font "FluidR3_GM.sf2" 128 25 63 amp=65 pan=-39 # 808 Mid Conga 808 Mid Conga 64 %font "FluidR3_GM.sf2" 128 25 64 amp=48 pan=-31 # 808 Low Conga 808 Low Conga 67 %font "FluidR3_GM.sf2" 128 25 67 amp=57 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 25 68 amp=65 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 25 69 amp=15 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 25 70 amp=49 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 25 71 amp=59 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 25 72 amp=47 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 25 73 amp=43 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 25 74 amp=32 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 25 75 amp=53 pan=31 # 808 Clave 808 Clave 76 %font "FluidR3_GM.sf2" 128 25 76 amp=109 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 25 77 amp=84 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 25 78 amp=86 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 25 79 amp=51 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 25 80 amp=36 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 25 81 amp=53 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 25 82 amp=158 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 25 83 amp=165 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 25 84 amp=34 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 25 85 amp=83 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 25 86 amp=46 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 25 87 amp=54 pan=-31 # Long Taiko Hit Long Taiko Hit drumset 27 27 %font "FluidR3_GM.sf2" 128 25 27 amp=32 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 25 28 amp=44 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 25 29 amp=31 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 25 30 amp=35 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 25 31 amp=75 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 25 32 amp=178 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 25 33 amp=54 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 25 34 amp=16 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 25 35 amp=78 pan=0 # 808 Kick 1 808 Kick 1 36 %font "FluidR3_GM.sf2" 128 25 36 amp=64 pan=0 # 808 Kick 2 808 Kick 2 37 %font "FluidR3_GM.sf2" 128 25 37 amp=352 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 25 38 amp=41 pan=0 # 808 Snare 1 808 Snare 1 39 %font "FluidR3_GM.sf2" 128 25 39 amp=44 pan=-16 # 808 Clap 808 Clap 40 %font "FluidR3_GM.sf2" 128 25 40 amp=50 pan=0 # 808 Snare 2 808 Snare 2 41 %font "FluidR3_GM.sf2" 128 25 41 amp=60 pan=-47 # 808 Tom 1 808 Tom 1 42 %font "FluidR3_GM.sf2" 128 25 42 amp=34 pan=31 # 808 Closed Hat 808 Closed Hat 43 %font "FluidR3_GM.sf2" 128 25 43 amp=70 pan=-28 # 808 Tom 2 808 Tom 2 44 %font "FluidR3_GM.sf2" 128 25 44 amp=52 pan=31 # 808 Open Hat 808 Open Hat 45 %font "FluidR3_GM.sf2" 128 25 45 amp=51 pan=-9 # 808 Tom 3 808 Tom 3 46 %font "FluidR3_GM.sf2" 128 25 46 amp=71 pan=31 # 808 Open Hat 808 Open Hat 47 %font "FluidR3_GM.sf2" 128 25 47 amp=29 pan=9 # 808 Tom 4 808 Tom 4 48 %font "FluidR3_GM.sf2" 128 25 48 amp=61 pan=28 # 808 Tom 5 808 Tom 5 49 %font "FluidR3_GM.sf2" 128 25 49 amp=72 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 25 50 amp=11 pan=47 # 808 Tom 6 808 Tom 6 51 %font "FluidR3_GM.sf2" 128 25 51 amp=22 pan=-31 # Ride1(L) Ride1(R) 808 Ride 808 Ride 52 %font "FluidR3_GM.sf2" 128 25 52 amp=65 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 25 53 amp=24 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 25 54 amp=30 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 25 55 amp=72 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 25 56 amp=91 pan=31 # 808 Cowbell 808 Cowbell 57 %font "FluidR3_GM.sf2" 128 25 57 amp=58 pan=-31 # Crsh 2(L) Crsh 2(R) 59 %font "FluidR3_GM.sf2" 128 25 59 amp=19 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 25 60 amp=70 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 25 61 amp=63 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 25 62 amp=28 pan=-39 # 808 High Conga 808 High Conga 63 %font "FluidR3_GM.sf2" 128 25 63 amp=70 pan=-39 # 808 Mid Conga 808 Mid Conga 64 %font "FluidR3_GM.sf2" 128 25 64 amp=90 pan=-31 # 808 Low Conga 808 Low Conga 67 %font "FluidR3_GM.sf2" 128 25 67 amp=57 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 25 68 amp=64 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 25 69 amp=47 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 25 70 amp=141 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 25 71 amp=59 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 25 72 amp=47 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 25 73 amp=43 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 25 74 amp=83 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 25 75 amp=23 pan=31 # 808 Clave 808 Clave 76 %font "FluidR3_GM.sf2" 128 25 76 amp=68 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 25 77 amp=81 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 25 78 amp=87 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 25 79 amp=51 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 25 80 amp=161 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 25 81 amp=256 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 25 82 amp=158 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 25 83 amp=102 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 25 84 amp=36 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 25 85 amp=83 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 25 86 amp=47 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 25 87 amp=78 pan=-31 # Long Taiko Hit Long Taiko Hit drumset 28 27 %font "FluidR3_GM.sf2" 128 25 27 amp=31 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 25 28 amp=70 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 25 29 amp=32 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 25 30 amp=57 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 25 31 amp=75 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 25 32 amp=178 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 25 33 amp=86 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 25 34 amp=24 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 25 35 amp=78 pan=0 # 808 Kick 1 808 Kick 1 36 %font "FluidR3_GM.sf2" 128 25 36 amp=61 pan=0 # 808 Kick 2 808 Kick 2 37 %font "FluidR3_GM.sf2" 128 25 37 amp=352 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 25 38 amp=40 pan=0 # 808 Snare 1 808 Snare 1 39 %font "FluidR3_GM.sf2" 128 25 39 amp=44 pan=-16 # 808 Clap 808 Clap 40 %font "FluidR3_GM.sf2" 128 25 40 amp=69 pan=0 # 808 Snare 2 808 Snare 2 41 %font "FluidR3_GM.sf2" 128 25 41 amp=71 pan=-47 # 808 Tom 1 808 Tom 1 42 %font "FluidR3_GM.sf2" 128 25 42 amp=24 pan=31 # 808 Closed Hat 808 Closed Hat 43 %font "FluidR3_GM.sf2" 128 25 43 amp=33 pan=-28 # 808 Tom 2 808 Tom 2 44 %font "FluidR3_GM.sf2" 128 25 44 amp=52 pan=31 # 808 Open Hat 808 Open Hat 45 %font "FluidR3_GM.sf2" 128 25 45 amp=33 pan=-9 # 808 Tom 3 808 Tom 3 46 %font "FluidR3_GM.sf2" 128 25 46 amp=97 pan=31 # 808 Open Hat 808 Open Hat 47 %font "FluidR3_GM.sf2" 128 25 47 amp=30 pan=9 # 808 Tom 4 808 Tom 4 48 %font "FluidR3_GM.sf2" 128 25 48 amp=36 pan=28 # 808 Tom 5 808 Tom 5 49 %font "FluidR3_GM.sf2" 128 25 49 amp=55 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 25 50 amp=23 pan=47 # 808 Tom 6 808 Tom 6 51 %font "FluidR3_GM.sf2" 128 25 51 amp=22 pan=-31 # Ride1(L) Ride1(R) 808 Ride 808 Ride 52 %font "FluidR3_GM.sf2" 128 25 52 amp=65 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 25 53 amp=39 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 25 54 amp=100 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 25 55 amp=73 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 25 56 amp=56 pan=31 # 808 Cowbell 808 Cowbell 57 %font "FluidR3_GM.sf2" 128 25 57 amp=58 pan=-31 # Crsh 2(L) Crsh 2(R) 59 %font "FluidR3_GM.sf2" 128 25 59 amp=20 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 25 60 amp=15 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 25 61 amp=63 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 25 62 amp=44 pan=-39 # 808 High Conga 808 High Conga 63 %font "FluidR3_GM.sf2" 128 25 63 amp=65 pan=-39 # 808 Mid Conga 808 Mid Conga 64 %font "FluidR3_GM.sf2" 128 25 64 amp=63 pan=-31 # 808 Low Conga 808 Low Conga 67 %font "FluidR3_GM.sf2" 128 25 67 amp=57 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 25 68 amp=103 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 25 69 amp=15 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 25 70 amp=87 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 25 71 amp=59 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 25 72 amp=47 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 25 73 amp=43 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 25 74 amp=83 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 25 75 amp=36 pan=31 # 808 Clave 808 Clave 76 %font "FluidR3_GM.sf2" 128 25 76 amp=68 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 25 77 amp=84 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 25 78 amp=86 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 25 79 amp=50 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 25 80 amp=155 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 25 81 amp=256 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 25 82 amp=99 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 25 83 amp=165 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 25 84 amp=53 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 25 85 amp=83 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 25 86 amp=48 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 25 87 amp=56 pan=-31 # Long Taiko Hit Long Taiko Hit drumset 29 27 %font "FluidR3_GM.sf2" 128 25 27 amp=32 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 25 28 amp=43 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 25 29 amp=52 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 25 30 amp=57 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 25 31 amp=119 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 25 32 amp=178 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 25 33 amp=54 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 25 34 amp=16 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 25 35 amp=70 pan=0 # 808 Kick 1 808 Kick 1 36 %font "FluidR3_GM.sf2" 128 25 36 amp=65 pan=0 # 808 Kick 2 808 Kick 2 37 %font "FluidR3_GM.sf2" 128 25 37 amp=150 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 25 38 amp=112 pan=0 # 808 Snare 1 808 Snare 1 39 %font "FluidR3_GM.sf2" 128 25 39 amp=44 pan=-16 # 808 Clap 808 Clap 40 %font "FluidR3_GM.sf2" 128 25 40 amp=88 pan=0 # 808 Snare 2 808 Snare 2 41 %font "FluidR3_GM.sf2" 128 25 41 amp=60 pan=-47 # 808 Tom 1 808 Tom 1 42 %font "FluidR3_GM.sf2" 128 25 42 amp=20 pan=31 # 808 Closed Hat 808 Closed Hat 43 %font "FluidR3_GM.sf2" 128 25 43 amp=55 pan=-28 # 808 Tom 2 808 Tom 2 44 %font "FluidR3_GM.sf2" 128 25 44 amp=25 pan=31 # 808 Open Hat 808 Open Hat 45 %font "FluidR3_GM.sf2" 128 25 45 amp=55 pan=-9 # 808 Tom 3 808 Tom 3 46 %font "FluidR3_GM.sf2" 128 25 46 amp=71 pan=31 # 808 Open Hat 808 Open Hat 47 %font "FluidR3_GM.sf2" 128 25 47 amp=23 pan=9 # 808 Tom 4 808 Tom 4 48 %font "FluidR3_GM.sf2" 128 25 48 amp=21 pan=28 # 808 Tom 5 808 Tom 5 49 %font "FluidR3_GM.sf2" 128 25 49 amp=107 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 25 50 amp=31 pan=47 # 808 Tom 6 808 Tom 6 51 %font "FluidR3_GM.sf2" 128 25 51 amp=28 pan=-31 # Ride1(L) Ride1(R) 808 Ride 808 Ride 52 %font "FluidR3_GM.sf2" 128 25 52 amp=60 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 25 53 amp=39 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 25 54 amp=100 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 25 55 amp=50 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 25 56 amp=30 pan=31 # 808 Cowbell 808 Cowbell 57 %font "FluidR3_GM.sf2" 128 25 57 amp=49 pan=-31 # Crsh 2(L) Crsh 2(R) 59 %font "FluidR3_GM.sf2" 128 25 59 amp=19 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 25 60 amp=9 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 25 61 amp=54 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 25 62 amp=13 pan=-39 # 808 High Conga 808 High Conga 63 %font "FluidR3_GM.sf2" 128 25 63 amp=66 pan=-39 # 808 Mid Conga 808 Mid Conga 64 %font "FluidR3_GM.sf2" 128 25 64 amp=50 pan=-31 # 808 Low Conga 808 Low Conga 67 %font "FluidR3_GM.sf2" 128 25 67 amp=57 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 25 68 amp=64 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 25 69 amp=15 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 25 70 amp=78 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 25 71 amp=59 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 25 72 amp=47 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 25 73 amp=43 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 25 74 amp=33 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 25 75 amp=33 pan=31 # 808 Clave 808 Clave 76 %font "FluidR3_GM.sf2" 128 25 76 amp=68 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 25 77 amp=131 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 25 78 amp=134 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 25 79 amp=51 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 25 80 amp=36 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 25 81 amp=53 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 25 82 amp=99 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 25 83 amp=102 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 25 84 amp=34 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 25 85 amp=84 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 25 86 amp=72 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 25 87 amp=55 pan=-31 # Long Taiko Hit Long Taiko Hit drumset 30 27 %font "FluidR3_GM.sf2" 128 25 27 amp=31 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 25 28 amp=43 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 25 29 amp=32 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 25 30 amp=57 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 25 31 amp=74 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 25 32 amp=176 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 25 33 amp=54 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 25 34 amp=16 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 25 35 amp=58 pan=0 # 808 Kick 1 808 Kick 1 36 %font "FluidR3_GM.sf2" 128 25 36 amp=95 pan=0 # 808 Kick 2 808 Kick 2 37 %font "FluidR3_GM.sf2" 128 25 37 amp=365 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 25 38 amp=65 pan=0 # 808 Snare 1 808 Snare 1 39 %font "FluidR3_GM.sf2" 128 25 39 amp=30 pan=-16 # 808 Clap 808 Clap 40 %font "FluidR3_GM.sf2" 128 25 40 amp=30 pan=0 # 808 Snare 2 808 Snare 2 41 %font "FluidR3_GM.sf2" 128 25 41 amp=46 pan=-47 # 808 Tom 1 808 Tom 1 42 %font "FluidR3_GM.sf2" 128 25 42 amp=13 pan=31 # 808 Closed Hat 808 Closed Hat 43 %font "FluidR3_GM.sf2" 128 25 43 amp=38 pan=-28 # 808 Tom 2 808 Tom 2 44 %font "FluidR3_GM.sf2" 128 25 44 amp=35 pan=31 # 808 Open Hat 808 Open Hat 45 %font "FluidR3_GM.sf2" 128 25 45 amp=36 pan=-9 # 808 Tom 3 808 Tom 3 46 %font "FluidR3_GM.sf2" 128 25 46 amp=64 pan=31 # 808 Open Hat 808 Open Hat 47 %font "FluidR3_GM.sf2" 128 25 47 amp=22 pan=9 # 808 Tom 4 808 Tom 4 48 %font "FluidR3_GM.sf2" 128 25 48 amp=19 pan=28 # 808 Tom 5 808 Tom 5 49 %font "FluidR3_GM.sf2" 128 25 49 amp=66 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 25 50 amp=29 pan=47 # 808 Tom 6 808 Tom 6 51 %font "FluidR3_GM.sf2" 128 25 51 amp=28 pan=-31 # Ride1(L) Ride1(R) 808 Ride 808 Ride 52 %font "FluidR3_GM.sf2" 128 25 52 amp=84 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 25 53 amp=41 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 25 54 amp=100 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 25 55 amp=50 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 25 56 amp=49 pan=31 # 808 Cowbell 808 Cowbell 57 %font "FluidR3_GM.sf2" 128 25 57 amp=50 pan=-31 # Crsh 2(L) Crsh 2(R) 59 %font "FluidR3_GM.sf2" 128 25 59 amp=20 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 25 60 amp=54 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 25 61 amp=55 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 25 62 amp=13 pan=-39 # 808 High Conga 808 High Conga 63 %font "FluidR3_GM.sf2" 128 25 63 amp=65 pan=-39 # 808 Mid Conga 808 Mid Conga 64 %font "FluidR3_GM.sf2" 128 25 64 amp=47 pan=-31 # 808 Low Conga 808 Low Conga 67 %font "FluidR3_GM.sf2" 128 25 67 amp=57 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 25 68 amp=103 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 25 69 amp=47 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 25 70 amp=78 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 25 71 amp=59 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 25 72 amp=47 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 25 73 amp=43 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 25 74 amp=83 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 25 75 amp=30 pan=31 # 808 Clave 808 Clave 76 %font "FluidR3_GM.sf2" 128 25 76 amp=110 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 25 77 amp=131 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 25 78 amp=134 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 25 79 amp=51 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 25 80 amp=36 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 25 81 amp=53 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 25 82 amp=99 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 25 83 amp=164 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 25 84 amp=52 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 25 85 amp=83 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 25 86 amp=49 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 25 87 amp=78 pan=-31 # Long Taiko Hit Long Taiko Hit drumset 32 27 %font "FluidR3_GM.sf2" 128 32 27 amp=31 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 32 28 amp=43 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 32 29 amp=43 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 32 30 amp=43 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 32 31 amp=75 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 32 32 amp=176 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 32 33 amp=53 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 32 34 amp=16 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 32 35 amp=119 pan=0 # Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) 37 %font "FluidR3_GM.sf2" 128 32 37 amp=186 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 32 38 amp=104 pan=0 # Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) 39 %font "FluidR3_GM.sf2" 128 32 39 amp=66 pan=-16 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 32 40 amp=101 pan=0 # Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) 41 %font "FluidR3_GM.sf2" 128 32 41 amp=94 pan=-47 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 32 42 amp=21 pan=31 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 32 43 amp=73 pan=-28 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 32 44 amp=21 pan=31 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 32 45 amp=131 pan=-9 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 32 46 amp=46 pan=31 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 32 47 amp=114 pan=9 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 32 48 amp=148 pan=28 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 32 49 amp=83 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 32 50 amp=76 pan=47 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 32 51 amp=27 pan=-31 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 32 52 amp=38 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 32 53 amp=23 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 32 54 amp=63 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 32 55 amp=44 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 32 56 amp=101 pan=31 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 32 57 amp=56 pan=-31 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 32 58 amp=65 pan=-55 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 32 59 amp=27 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 32 60 amp=54 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 32 61 amp=55 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 32 62 amp=30 pan=-39 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 32 63 amp=79 pan=-39 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 32 64 amp=69 pan=-31 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 32 65 amp=152 pan=31 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 32 66 amp=95 pan=31 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 32 67 amp=57 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 32 68 amp=64 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 32 69 amp=15 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 32 70 amp=31 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 32 71 amp=95 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 32 72 amp=75 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 32 73 amp=43 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 32 74 amp=31 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 32 75 amp=78 pan=31 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 32 76 amp=68 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 32 77 amp=84 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 32 78 amp=66 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 32 79 amp=30 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 32 80 amp=44 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 32 81 amp=63 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 32 82 amp=155 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 32 83 amp=103 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 32 84 amp=34 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 32 85 amp=127 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 32 86 amp=50 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 32 87 amp=53 pan=-31 # Long Taiko Hit Long Taiko Hit drumset 33 27 %font "FluidR3_GM.sf2" 128 33 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 33 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 33 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 33 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 33 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 33 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 33 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 33 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 33 35 amp=100 pan=0 # Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) 37 %font "FluidR3_GM.sf2" 128 33 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 33 38 amp=100 pan=0 # Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) Piccolo 1-1(L) Piccolo 1-1(R) 39 %font "FluidR3_GM.sf2" 128 33 39 amp=100 pan=0 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 33 40 amp=100 pan=0 # Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) Piccolo 1-2(L) Piccolo 1-2(R) 41 %font "FluidR3_GM.sf2" 128 33 41 amp=100 pan=0 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 33 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 33 43 amp=100 pan=0 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 33 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 33 45 amp=100 pan=0 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 33 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 33 47 amp=100 pan=0 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 33 48 amp=100 pan=0 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 33 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 33 50 amp=100 pan=0 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 33 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 33 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 33 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 33 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 33 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 33 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 33 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 33 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 33 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 33 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 33 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 33 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 33 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 33 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 33 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 33 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 33 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 33 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 33 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 33 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 33 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 33 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 33 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 33 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 33 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 33 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 33 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 33 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 33 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 33 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 33 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 33 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 33 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 33 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 33 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 33 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 33 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 34 27 %font "FluidR3_GM.sf2" 128 34 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 34 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 34 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 34 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 34 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 34 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 34 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 34 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 34 35 amp=100 pan=0 # Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) 37 %font "FluidR3_GM.sf2" 128 34 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 34 38 amp=100 pan=0 # Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) 39 %font "FluidR3_GM.sf2" 128 34 39 amp=100 pan=0 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 34 40 amp=100 pan=0 # Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) 41 %font "FluidR3_GM.sf2" 128 34 41 amp=100 pan=0 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 34 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 34 43 amp=100 pan=0 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 34 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 34 45 amp=100 pan=0 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 34 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 34 47 amp=100 pan=0 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 34 48 amp=100 pan=0 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 34 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 34 50 amp=100 pan=0 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 34 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 34 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 34 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 34 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 34 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 34 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 34 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 34 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 34 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 34 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 34 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 34 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 34 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 34 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 34 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 34 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 34 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 34 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 34 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 34 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 34 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 34 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 34 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 34 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 34 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 34 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 34 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 34 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 34 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 34 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 34 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 34 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 34 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 34 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 34 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 34 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 34 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 35 27 %font "FluidR3_GM.sf2" 128 35 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 35 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 35 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 35 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 35 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 35 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 35 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 35 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 35 35 amp=100 pan=0 # Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) 37 %font "FluidR3_GM.sf2" 128 35 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 35 38 amp=100 pan=0 # Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) 39 %font "FluidR3_GM.sf2" 128 35 39 amp=100 pan=0 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 35 40 amp=100 pan=0 # Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) 41 %font "FluidR3_GM.sf2" 128 35 41 amp=100 pan=0 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 35 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 35 43 amp=100 pan=0 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 35 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 35 45 amp=100 pan=0 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 35 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 35 47 amp=100 pan=0 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 35 48 amp=100 pan=0 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 35 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 35 50 amp=100 pan=0 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 35 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 35 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 35 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 35 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 35 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 35 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 35 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 35 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 35 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 35 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 35 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 35 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 35 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 35 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 35 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 35 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 35 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 35 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 35 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 35 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 35 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 35 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 35 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 35 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 35 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 35 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 35 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 35 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 35 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 35 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 35 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 35 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 35 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 35 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 35 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 35 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 35 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 36 27 %font "FluidR3_GM.sf2" 128 36 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 36 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 36 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 36 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 36 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 36 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 36 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 36 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 36 35 amp=100 pan=0 # Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) 37 %font "FluidR3_GM.sf2" 128 36 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 36 38 amp=100 pan=0 # Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) 39 %font "FluidR3_GM.sf2" 128 36 39 amp=100 pan=0 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 36 40 amp=100 pan=0 # Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) 41 %font "FluidR3_GM.sf2" 128 36 41 amp=100 pan=0 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 36 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 36 43 amp=100 pan=0 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 36 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 36 45 amp=100 pan=0 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 36 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 36 47 amp=100 pan=0 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 36 48 amp=100 pan=0 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 36 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 36 50 amp=100 pan=0 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 36 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 36 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 36 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 36 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 36 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 36 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 36 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 36 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 36 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 36 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 36 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 36 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 36 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 36 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 36 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 36 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 36 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 36 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 36 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 36 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 36 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 36 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 36 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 36 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 36 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 36 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 36 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 36 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 36 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 36 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 36 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 36 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 36 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 36 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 36 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 36 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 36 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 40 27 %font "FluidR3_GM.sf2" 128 40 27 amp=31 pan=-23 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 40 28 amp=44 pan=31 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 40 29 amp=26 pan=-16 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 40 30 amp=27 pan=-16 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 40 31 amp=119 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 40 32 amp=178 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 40 33 amp=85 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 40 34 amp=16 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 40 35 amp=94 pan=0 # Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) 37 %font "FluidR3_GM.sf2" 128 40 37 amp=116 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 40 38 amp=28 pan=0 # Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) 39 %font "FluidR3_GM.sf2" 128 40 39 amp=69 pan=0 # Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) 40 %font "FluidR3_GM.sf2" 128 40 40 amp=33 pan=0 # Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) 41 %font "FluidR3_GM.sf2" 128 40 41 amp=76 pan=-47 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 40 42 amp=20 pan=31 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 40 43 amp=46 pan=-28 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 40 44 amp=13 pan=31 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 40 45 amp=125 pan=-9 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 40 46 amp=59 pan=31 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 40 47 amp=74 pan=9 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 40 48 amp=73 pan=28 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 40 49 amp=87 pan=31 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 40 50 amp=39 pan=47 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 40 51 amp=18 pan=-31 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 40 52 amp=84 pan=-31 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 40 53 amp=97 pan=-31 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 40 54 amp=17 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 40 55 amp=44 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 40 56 amp=103 pan=31 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 40 57 amp=50 pan=-31 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 40 58 amp=28 pan=-55 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 40 59 amp=24 pan=-31 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 40 60 amp=54 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 40 61 amp=56 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 40 62 amp=30 pan=-39 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 40 63 amp=80 pan=-39 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 40 64 amp=44 pan=-31 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 40 65 amp=98 pan=31 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 40 66 amp=146 pan=31 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 40 67 amp=57 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 40 68 amp=64 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 40 69 amp=15 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 40 70 amp=31 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 40 71 amp=59 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 40 72 amp=76 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 40 73 amp=43 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 40 74 amp=30 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 40 75 amp=78 pan=31 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 40 76 amp=68 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 40 77 amp=82 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 40 78 amp=66 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 40 79 amp=30 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 40 80 amp=45 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 40 81 amp=64 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 40 82 amp=155 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 40 83 amp=102 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 40 84 amp=34 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 40 85 amp=127 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 40 86 amp=50 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 40 87 amp=78 pan=-31 # Long Taiko Hit Long Taiko Hit drumset 41 27 %font "FluidR3_GM.sf2" 128 41 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 41 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 41 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 41 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 41 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 41 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 41 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 41 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 41 35 amp=100 pan=0 # Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) Std Kick 5(L) Std Kick 5(R) 37 %font "FluidR3_GM.sf2" 128 41 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 41 38 amp=100 pan=0 # Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) 39 %font "FluidR3_GM.sf2" 128 41 39 amp=100 pan=0 # Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) 40 %font "FluidR3_GM.sf2" 128 41 40 amp=100 pan=0 # Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) 41 %font "FluidR3_GM.sf2" 128 41 41 amp=100 pan=0 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 41 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 41 43 amp=100 pan=0 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 41 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 41 45 amp=100 pan=0 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 41 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 41 47 amp=100 pan=0 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 41 48 amp=100 pan=0 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 41 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 41 50 amp=100 pan=0 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 41 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 41 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 41 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 41 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 41 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 41 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 41 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 41 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 41 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 41 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 41 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 41 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 41 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 41 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 41 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 41 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 41 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 41 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 41 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 41 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 41 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 41 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 41 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 41 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 41 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 41 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 41 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 41 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 41 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 41 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 41 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 41 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 41 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 41 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 41 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 41 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 41 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 42 27 %font "FluidR3_GM.sf2" 128 42 27 amp=100 pan=0 # High Q(L) High Q(R) 28 %font "FluidR3_GM.sf2" 128 42 28 amp=100 pan=0 # Slap Slap 29 %font "FluidR3_GM.sf2" 128 42 29 amp=100 pan=0 # Scratch Push(L) Scratch Push(R) 30 %font "FluidR3_GM.sf2" 128 42 30 amp=100 pan=0 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 42 31 amp=100 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 42 32 amp=100 pan=0 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 42 33 amp=100 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 42 34 amp=100 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 42 35 amp=100 pan=0 # Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) Std Kick 1(L) Std Kick 1(R) 37 %font "FluidR3_GM.sf2" 128 42 37 amp=100 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 42 38 amp=100 pan=0 # Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) 39 %font "FluidR3_GM.sf2" 128 42 39 amp=100 pan=0 # Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) 40 %font "FluidR3_GM.sf2" 128 42 40 amp=100 pan=0 # Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) 41 %font "FluidR3_GM.sf2" 128 42 41 amp=100 pan=0 # Low Flr Studio(L) Low Flr Studio(R) 42 %font "FluidR3_GM.sf2" 128 42 42 amp=100 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 42 43 amp=100 pan=0 # Flr Studio(L) Flr Studio(R) 44 %font "FluidR3_GM.sf2" 128 42 44 amp=100 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 45 %font "FluidR3_GM.sf2" 128 42 45 amp=100 pan=0 # Low Studio(L) Low Studio(R) 46 %font "FluidR3_GM.sf2" 128 42 46 amp=100 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 47 %font "FluidR3_GM.sf2" 128 42 47 amp=100 pan=0 # Md Studio(L) Md Studio(R) 48 %font "FluidR3_GM.sf2" 128 42 48 amp=100 pan=0 # MdHi Studio(L) MdHi Studio(R) 49 %font "FluidR3_GM.sf2" 128 42 49 amp=100 pan=0 # Crsh 1(L) Crsh 1(R) 50 %font "FluidR3_GM.sf2" 128 42 50 amp=100 pan=0 # Hi Studio(L) Hi Studio(R) 51 %font "FluidR3_GM.sf2" 128 42 51 amp=100 pan=0 # Ride1(L) Ride1(R) 52 %font "FluidR3_GM.sf2" 128 42 52 amp=100 pan=0 # China Crash(L) China Crash(R) 53 %font "FluidR3_GM.sf2" 128 42 53 amp=100 pan=0 # BellRide(L) BellRide(R) 54 %font "FluidR3_GM.sf2" 128 42 54 amp=100 pan=0 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 42 55 amp=100 pan=0 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 42 56 amp=100 pan=0 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 42 57 amp=100 pan=0 # Crsh 2(L) Crsh 2(R) 58 %font "FluidR3_GM.sf2" 128 42 58 amp=100 pan=0 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 42 59 amp=100 pan=0 # Ride2(L) Ride2(R) 60 %font "FluidR3_GM.sf2" 128 42 60 amp=100 pan=0 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 42 61 amp=100 pan=0 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 42 62 amp=100 pan=0 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 42 63 amp=100 pan=0 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 42 64 amp=100 pan=0 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 42 65 amp=100 pan=0 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 42 66 amp=100 pan=0 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 42 67 amp=100 pan=0 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 42 68 amp=100 pan=0 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 42 69 amp=100 pan=0 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 42 70 amp=100 pan=0 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 42 71 amp=100 pan=0 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 42 72 amp=100 pan=0 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 42 73 amp=100 pan=0 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 42 74 amp=100 pan=0 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 42 75 amp=100 pan=0 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 42 76 amp=100 pan=0 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 42 77 amp=100 pan=0 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 42 78 amp=100 pan=0 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 42 79 amp=100 pan=0 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 42 80 amp=100 pan=0 # Triangle 81 %font "FluidR3_GM.sf2" 128 42 81 amp=100 pan=0 # Triangle 82 %font "FluidR3_GM.sf2" 128 42 82 amp=100 pan=0 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 42 83 amp=100 pan=0 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 42 84 amp=100 pan=0 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 42 85 amp=100 pan=0 # Castanet 86 %font "FluidR3_GM.sf2" 128 42 86 amp=100 pan=0 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 42 87 amp=100 pan=0 # Long Taiko Hit Long Taiko Hit drumset 48 27 %font "FluidR3_GM.sf2" 128 48 27 amp=11 pan=31 # High Q(L) High Q(R) Hi-Hat Closed(L) Hi-Hat Closed(R) 28 %font "FluidR3_GM.sf2" 128 48 28 amp=24 pan=31 # Slap Slap Hi-Hat Foot(L) Hi-Hat Foot(R) 29 %font "FluidR3_GM.sf2" 128 48 29 amp=23 pan=31 # Scratch Push(L) Scratch Push(R) Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 30 %font "FluidR3_GM.sf2" 128 48 30 amp=3 pan=-31 # Scratch Pull(L) Scratch Pull(R) 31 %font "FluidR3_GM.sf2" 128 48 31 amp=18 pan=0 # Sticks(L) Sticks(R) 32 %font "FluidR3_GM.sf2" 128 48 32 amp=143 pan=-16 # Square Click(L) Square Click(R) 33 %font "FluidR3_GM.sf2" 128 48 33 amp=43 pan=0 # Metronome Click Metronome Click 34 %font "FluidR3_GM.sf2" 128 48 34 amp=13 pan=0 # Metronome Bell(L) Metronome Bell(R) 35 %font "FluidR3_GM.sf2" 128 48 35 amp=187 pan=0 # Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) 36 %font "FluidR3_GM.sf2" 128 48 35 amp=57 pan=0 # Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) 37 %font "FluidR3_GM.sf2" 128 48 37 amp=21 pan=0 # Rim Tap(L) Rim Tap(R) 38 %font "FluidR3_GM.sf2" 128 48 38 amp=126 pan=-31 # Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) 39 %font "FluidR3_GM.sf2" 128 48 39 amp=33 pan=-47 # Clap(L) Clap(R) 40 %font "FluidR3_GM.sf2" 128 48 40 amp=126 pan=0 # Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) 41 %font "FluidR3_GM.sf2" 128 48 41 amp=87 pan=-47 # Timpani 2(L) Timpani 2(R) 42 %font "FluidR3_GM.sf2" 128 48 41 amp=86 pan=-47 # Timpani 2(L) Timpani 2(R) 43 %font "FluidR3_GM.sf2" 128 48 43 amp=81 pan=-47 # Timpani 3(L) Timpani 3(R) 44 %font "FluidR3_GM.sf2" 128 48 43 amp=126 pan=-47 # Timpani 3(L) Timpani 3(R) 45 %font "FluidR3_GM.sf2" 128 48 43 amp=75 pan=-47 # Timpani 3(L) Timpani 3(R) 46 %font "FluidR3_GM.sf2" 128 48 43 amp=120 pan=-47 # Timpani 3(L) Timpani 3(R) 47 %font "FluidR3_GM.sf2" 128 48 43 amp=72 pan=-47 # Timpani 3(L) Timpani 3(R) 48 %font "FluidR3_GM.sf2" 128 48 43 amp=114 pan=-47 # Timpani 3(L) Timpani 3(R) 49 %font "FluidR3_GM.sf2" 128 48 43 amp=113 pan=-47 # Timpani 3(L) Timpani 3(R) 50 %font "FluidR3_GM.sf2" 128 48 43 amp=110 pan=-47 # Timpani 3(L) Timpani 3(R) 51 %font "FluidR3_GM.sf2" 128 48 43 amp=63 pan=-47 # Timpani 3(L) Timpani 3(R) 52 %font "FluidR3_GM.sf2" 128 48 43 amp=63 pan=-47 # Timpani 3(L) Timpani 3(R) 53 %font "FluidR3_GM.sf2" 128 48 43 amp=61 pan=-47 # Timpani 3(L) Timpani 3(R) 54 %font "FluidR3_GM.sf2" 128 48 54 amp=67 pan=16 # Tambourine(L) Tambourine(R) 55 %font "FluidR3_GM.sf2" 128 48 55 amp=49 pan=-16 # Splash(L) Splash(R) 56 %font "FluidR3_GM.sf2" 128 48 56 amp=92 pan=31 # Cow Bell(L) Cow Bell(R) 57 %font "FluidR3_GM.sf2" 128 48 57 amp=69 pan=-31 # Orchcrash(L) Orchcrash(R) 58 %font "FluidR3_GM.sf2" 128 48 58 amp=22 pan=-55 # Vibra Slap 59 %font "FluidR3_GM.sf2" 128 48 59 amp=76 pan=-47 # Orchcrash(L) Orchcrash(R) 60 %font "FluidR3_GM.sf2" 128 48 60 amp=8 pan=55 # Bongo Rim(L) Bongo Rim(R) 61 %font "FluidR3_GM.sf2" 128 48 61 amp=82 pan=55 # Low Bongo(L) Low Bongo(R) 62 %font "FluidR3_GM.sf2" 128 48 62 amp=41 pan=-39 # Closed Slap(L) Closed Slap(R) 63 %font "FluidR3_GM.sf2" 128 48 63 amp=77 pan=-39 # High Conga(L) High Conga(R) 64 %font "FluidR3_GM.sf2" 128 48 64 amp=45 pan=-31 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 48 65 amp=80 pan=31 # High Timbale(L) High Timbale(R) 66 %font "FluidR3_GM.sf2" 128 48 66 amp=78 pan=31 # Low Timbale(L) Low Timbale(R) 67 %font "FluidR3_GM.sf2" 128 48 67 amp=82 pan=-55 # High Agogo(L) High Agogo(R) 68 %font "FluidR3_GM.sf2" 128 48 68 amp=92 pan=-55 # Low Agogo(L) Low Agogo(R) 69 %font "FluidR3_GM.sf2" 128 48 69 amp=11 pan=-55 # Cabasa(L) Cabasa(R) 70 %font "FluidR3_GM.sf2" 128 48 70 amp=27 pan=-63 # Maracas(L) Maracas(R) 71 %font "FluidR3_GM.sf2" 128 48 71 amp=45 pan=55 # Short Whistle 72 %font "FluidR3_GM.sf2" 128 48 72 amp=34 pan=55 # Long Whistle 73 %font "FluidR3_GM.sf2" 128 48 73 amp=32 pan=47 # Guiro Down(L) Guiro Down(R) 74 %font "FluidR3_GM.sf2" 128 48 74 amp=46 pan=47 # Guiro Up(L) Guiro Up(R) 75 %font "FluidR3_GM.sf2" 128 48 75 amp=61 pan=31 # Clave(L) Clave(R) 76 %font "FluidR3_GM.sf2" 128 48 76 amp=52 pan=55 # High Woodblock(L) High Woodblock(R) 77 %font "FluidR3_GM.sf2" 128 48 77 amp=63 pan=55 # Low Woodblock(L) Low Woodblock(R) 78 %font "FluidR3_GM.sf2" 128 48 78 amp=54 pan=-31 # Quica Hi Quica Hi 79 %font "FluidR3_GM.sf2" 128 48 79 amp=24 pan=-31 # Quica Low Quica Low 80 %font "FluidR3_GM.sf2" 128 48 80 amp=36 pan=-63 # Triangle 81 %font "FluidR3_GM.sf2" 128 48 81 amp=76 pan=-63 # Triangle 82 %font "FluidR3_GM.sf2" 128 48 82 amp=114 pan=47 # Small Shaker (L) Small Shaker (R) 83 %font "FluidR3_GM.sf2" 128 48 83 amp=78 pan=55 # Sleigh Bells 84 %font "FluidR3_GM.sf2" 128 48 84 amp=27 pan=63 # Bell Tree Bell Tree 85 %font "FluidR3_GM.sf2" 128 48 85 amp=63 pan=-47 # Castanet 86 %font "FluidR3_GM.sf2" 128 48 86 amp=39 pan=-31 # Short Taiko Hit Short Taiko Hit 87 %font "FluidR3_GM.sf2" 128 48 87 amp=64 pan=-31 # Long Taiko Hit Long Taiko Hit 88 %font "FluidR3_GM.sf2" 128 48 88 amp=44 pan=0 # Applause Applause drumset 49 30 %font "FluidR3_GM.sf2" 128 0 38 amp=93 pan=-31 # Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) 31 %font "FluidR3_GM.sf2" 128 0 49 amp=52 pan=-47 # Crsh 1(L) Crsh 1(R) 32 %font "FluidR3_GM.sf2" 128 0 35 amp=21 pan=-63 # Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) 33 %font "FluidR3_GM.sf2" 0 116 amp=26 pan=55 36 %font "FluidR3_GM.sf2" 128 0 47 amp=96 pan=0 # Md Studio(L) Md Studio(R) 38 %font "FluidR3_GM.sf2" 128 0 47 amp=189 pan=-31 # Md Studio(L) Md Studio(R) 39 %font "FluidR3_GM.sf2" 128 0 47 amp=88 pan=63 # Md Studio(L) Md Studio(R) 40 %font "FluidR3_GM.sf2" 128 0 47 amp=66 pan=63 # Md Studio(L) Md Studio(R) 41 %font "FluidR3_GM.sf2" 128 0 47 amp=122 pan=31 # Md Studio(L) Md Studio(R) 42 %font "FluidR3_GM.sf2" 128 0 63 amp=69 pan=47 # High Conga(L) High Conga(R) 43 %font "FluidR3_GM.sf2" 128 0 64 amp=76 pan=47 # Low Tumba(L) Low Tumba(R) 44 %font "FluidR3_GM.sf2" 128 0 47 amp=133 pan=63 # Md Studio(L) Md Studio(R) 49 %font "FluidR3_GM.sf2" 128 0 52 amp=43 pan=-47 # China Crash(L) China Crash(R) 50 %font "FluidR3_GM.sf2" 128 0 52 amp=170 pan=31 # China Crash(L) China Crash(R) 51 %font "FluidR3_GM.sf2" 128 0 47 amp=216 pan=47 # Md Studio(L) Md Studio(R) 52 %font "FluidR3_GM.sf2" 128 0 47 amp=227 pan=47 # Md Studio(L) Md Studio(R) 54 %font "FluidR3_GM.sf2" 128 0 64 amp=56 pan=23 # Low Tumba(L) Low Tumba(R) 55 %font "FluidR3_GM.sf2" 128 0 64 amp=52 pan=47 # Low Tumba(L) Low Tumba(R) 56 %font "FluidR3_GM.sf2" 128 0 64 amp=28 pan=47 # Low Tumba(L) Low Tumba(R) 57 %font "FluidR3_GM.sf2" 128 0 60 amp=53 pan=-47 # Bongo Rim(L) Bongo Rim(R) 58 %font "FluidR3_GM.sf2" 128 0 61 amp=40 pan=-47 # Low Bongo(L) Low Bongo(R) 59 %font "FluidR3_GM.sf2" 128 0 63 amp=31 pan=-47 # High Conga(L) High Conga(R) 60 %font "FluidR3_GM.sf2" 128 0 64 amp=51 pan=-47 # Low Tumba(L) Low Tumba(R) 61 %font "FluidR3_GM.sf2" 128 0 62 amp=96 pan=-31 # Closed Slap(L) Closed Slap(R) 62 %font "FluidR3_GM.sf2" 128 0 47 amp=139 pan=31 # Md Studio(L) Md Studio(R) 63 %font "FluidR3_GM.sf2" 128 0 47 amp=153 pan=31 # Md Studio(L) Md Studio(R) 64 %font "FluidR3_GM.sf2" 128 0 64 amp=22 pan=-16 # Low Tumba(L) Low Tumba(R) 65 %font "FluidR3_GM.sf2" 128 0 60 amp=111 pan=-31 # Bongo Rim(L) Bongo Rim(R) 67 %font "FluidR3_GM.sf2" 128 0 66 amp=113 pan=31 # Low Timbale(L) Low Timbale(R) 68 %font "FluidR3_GM.sf2" 128 0 66 amp=41 pan=39 # Low Timbale(L) Low Timbale(R) 69 %font "FluidR3_GM.sf2" 128 0 65 amp=83 pan=39 # High Timbale(L) High Timbale(R) 70 %font "FluidR3_GM.sf2" 128 0 56 amp=72 pan=31 # Cow Bell(L) Cow Bell(R) 71 %font "FluidR3_GM.sf2" 128 0 60 amp=50 pan=55 # Bongo Rim(L) Bongo Rim(R) 72 %font "FluidR3_GM.sf2" 128 0 61 amp=65 pan=47 # Low Bongo(L) Low Bongo(R) 73 %font "FluidR3_GM.sf2" 128 0 62 amp=56 pan=-31 # Closed Slap(L) Closed Slap(R) 74 %font "FluidR3_GM.sf2" 128 0 63 amp=162 pan=-31 # High Conga(L) High Conga(R) 75 %font "FluidR3_GM.sf2" 128 0 64 amp=27 pan=-39 # Low Tumba(L) Low Tumba(R) 76 %font "FluidR3_GM.sf2" 128 0 64 amp=45 pan=-39 # Low Tumba(L) Low Tumba(R) 77 %font "FluidR3_GM.sf2" 128 0 64 amp=47 pan=-39 # Low Tumba(L) Low Tumba(R) 78 %font "FluidR3_GM.sf2" 128 0 64 amp=60 pan=-39 # Low Tumba(L) Low Tumba(R) 79 %font "FluidR3_GM.sf2" 0 116 amp=58 pan=63 80 %font "FluidR3_GM.sf2" 0 116 amp=26 pan=63 81 %font "FluidR3_GM.sf2" 0 116 amp=44 pan=-31 82 %font "FluidR3_GM.sf2" 0 116 amp=30 pan=-31 83 %font "FluidR3_GM.sf2" 128 0 54 amp=79 pan=8 # Tambourine(L) Tambourine(R) 84 %font "FluidR3_GM.sf2" 128 0 67 amp=50 pan=-55 # High Agogo(L) High Agogo(R) 85 %font "FluidR3_GM.sf2" 128 0 68 amp=57 pan=-55 # Low Agogo(L) Low Agogo(R) 87 %font "FluidR3_GM.sf2" 128 0 71 amp=111 pan=55 # Short Whistle 88 %font "FluidR3_GM.sf2" 128 0 72 amp=45 pan=55 # Long Whistle 89 %font "FluidR3_GM.sf2" 128 0 78 amp=61 pan=-31 # Quica Hi Quica Hi 90 %font "FluidR3_GM.sf2" 128 0 79 amp=27 pan=-31 # Quica Low Quica Low 91 %font "FluidR3_GM.sf2" 128 0 80 amp=41 pan=-63 # Triangle 92 %font "FluidR3_GM.sf2" 128 0 81 amp=48 pan=-63 # Triangle 93 %font "FluidR3_GM.sf2" 128 0 73 amp=35 pan=47 # Guiro Down(L) Guiro Down(R) 94 %font "FluidR3_GM.sf2" 128 0 74 amp=23 pan=47 # Guiro Up(L) Guiro Up(R) 95 %font "FluidR3_GM.sf2" 128 0 69 amp=17 pan=-55 # Cabasa(L) Cabasa(R) 96 %font "FluidR3_GM.sf2" 128 0 69 amp=25 pan=-55 # Cabasa(L) Cabasa(R) 97 %font "FluidR3_GM.sf2" 128 0 75 amp=55 pan=31 # Clave(L) Clave(R) 98 %font "FluidR3_GM.sf2" 128 0 76 amp=96 pan=55 # High Woodblock(L) High Woodblock(R) 99 %font "FluidR3_GM.sf2" 128 0 77 amp=115 pan=55 # Low Woodblock(L) Low Woodblock(R) drumset 50 25 %font "FluidR3_GM.sf2" 128 25 36 amp=63 pan=0 # 808 Kick 2 808 Kick 2 26 %font "FluidR3_GM.sf2" 128 25 35 amp=73 pan=0 # 808 Kick 1 808 Kick 1 27 %font "FluidR3_GM.sf2" 128 25 36 amp=59 pan=0 # 808 Kick 2 808 Kick 2 28 %font "FluidR3_GM.sf2" 128 25 36 amp=65 pan=0 # 808 Kick 2 808 Kick 2 29 %font "FluidR3_GM.sf2" 128 25 36 amp=58 pan=0 # 808 Kick 2 808 Kick 2 30 %font "FluidR3_GM.sf2" 128 25 36 amp=81 pan=0 # 808 Kick 2 808 Kick 2 31 %font "FluidR3_GM.sf2" 128 25 35 amp=123 pan=0 # 808 Kick 1 808 Kick 1 32 %font "FluidR3_GM.sf2" 128 9 35 amp=150 pan=0 # Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) 33 %font "FluidR3_GM.sf2" 128 9 35 amp=133 pan=0 # Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) 34 %font "FluidR3_GM.sf2" 128 10 35 amp=63 pan=0 # Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) 35 %font "FluidR3_GM.sf2" 128 10 35 amp=82 pan=0 # Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) Std Kick 3(L) Std Kick 3(R) 36 %font "FluidR3_GM.sf2" 128 11 35 amp=205 pan=0 # Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) 37 %font "FluidR3_GM.sf2" 128 11 35 amp=417 pan=0 # Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) Room Kick (L) Room Kick (R) 38 %font "FluidR3_GM.sf2" 128 0 35 amp=129 pan=0 # Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) 39 %font "FluidR3_GM.sf2" 128 0 35 amp=226 pan=0 # Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) 40 %font "FluidR3_GM.sf2" 128 0 35 amp=142 pan=0 # Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) 41 %font "FluidR3_GM.sf2" 128 0 35 amp=138 pan=0 # Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) 42 %font "FluidR3_GM.sf2" 128 1 35 amp=188 pan=0 # Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) 43 %font "FluidR3_GM.sf2" 128 1 35 amp=128 pan=0 # Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) Std Kick 2(L) Std Kick 2(R) 44 %font "FluidR3_GM.sf2" 128 0 35 amp=156 pan=0 # Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) 45 %font "FluidR3_GM.sf2" 128 0 35 amp=86 pan=0 # Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) 46 %font "FluidR3_GM.sf2" 128 0 35 amp=160 pan=0 # Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) Std Kick(L) Std Kick(R) 47 %font "FluidR3_GM.sf2" 128 32 35 amp=86 pan=0 # Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) 48 %font "FluidR3_GM.sf2" 128 32 35 amp=94 pan=0 # Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) Std Kick 7(L) Std Kick 7(R) 49 %font "FluidR3_GM.sf2" 128 48 35 amp=50 pan=0 # Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) Orch Bass Drum(L) Orch Bass Drum(R) 50 %font "FluidR3_GM.sf2" 128 8 35 amp=77 pan=0 # Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) 51 %font "FluidR3_GM.sf2" 128 8 35 amp=215 pan=0 # Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) Std Kick 6(L) Std Kick 6(R) 52 %font "FluidR3_GM.sf2" 128 16 35 amp=140 pan=0 # Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R Power Bass Drum 1(L Power Bass Drum 1(R 53 %font "FluidR3_GM.sf2" 128 16 36 amp=85 pan=0 # Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R Power Bass Drum 2(L Power Bass Drum 2(R 54 %font "FluidR3_GM.sf2" 128 24 35 amp=86 pan=0 # Elec Kick1(L) Elec Kick1(R) 55 %font "FluidR3_GM.sf2" 128 24 36 amp=135 pan=0 # Elec Kick2(L) Elec Kick2(R) 56 %font "FluidR3_GM.sf2" 128 24 35 amp=62 pan=0 # Elec Kick1(L) Elec Kick1(R) 57 %font "FluidR3_GM.sf2" 128 25 35 amp=59 pan=0 # 808 Kick 1 808 Kick 1 58 %font "FluidR3_GM.sf2" 128 25 35 amp=68 pan=0 # 808 Kick 1 808 Kick 1 59 %font "FluidR3_GM.sf2" 128 25 35 amp=60 pan=0 # 808 Kick 1 808 Kick 1 60 %font "FluidR3_GM.sf2" 128 0 38 amp=108 pan=0 # Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) 61 %font "FluidR3_GM.sf2" 128 0 40 amp=129 pan=0 # Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) 62 %font "FluidR3_GM.sf2" 128 1 38 amp=93 pan=0 # Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) 63 %font "FluidR3_GM.sf2" 128 1 40 amp=52 pan=0 # Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) 64 %font "FluidR3_GM.sf2" 128 0 38 amp=106 pan=0 # Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) 65 %font "FluidR3_GM.sf2" 128 48 38 amp=194 pan=0 # Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) Orch Snare(L) Orch Snare(R) 66 %font "FluidR3_GM.sf2" 128 32 38 amp=134 pan=0 # Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) Snr 2-1(L) Snr 2-1(R) 67 %font "FluidR3_GM.sf2" 128 32 40 amp=91 pan=0 # Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) Snr 2-2(L) Snr 2-2(R) 68 %font "FluidR3_GM.sf2" 128 8 38 amp=76 pan=0 # Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) 69 %font "FluidR3_GM.sf2" 128 8 40 amp=92 pan=0 # Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) 70 %font "FluidR3_GM.sf2" 128 16 38 amp=113 pan=0 # Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) Power Snare 1(L) Power Snare 1(R) 71 %font "FluidR3_GM.sf2" 128 16 40 amp=103 pan=0 # Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) Power Snare 2(L) Power Snare 2(R) 72 %font "FluidR3_GM.sf2" 128 24 40 amp=123 pan=0 # Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) 73 %font "FluidR3_GM.sf2" 128 11 38 amp=102 pan=0 # RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) 74 %font "FluidR3_GM.sf2" 128 11 40 amp=155 pan=0 # RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) 75 %font "FluidR3_GM.sf2" 128 11 38 amp=71 pan=0 # RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) 76 %font "FluidR3_GM.sf2" 128 11 40 amp=66 pan=0 # RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) RmPwr 1-2(L) RmPwr 1-2(R) 77 %font "FluidR3_GM.sf2" 128 8 38 amp=63 pan=0 # Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) 78 %font "FluidR3_GM.sf2" 128 24 38 amp=100 pan=0 # Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) Electronic Snr 1(L) Electronic Snr 1(R) 79 %font "FluidR3_GM.sf2" 128 24 40 amp=149 pan=0 # Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) Electronic Snr 2(L) Electronic Snr 2(R) 80 %font "FluidR3_GM.sf2" 128 25 38 amp=22 pan=0 # 808 Snare 1 808 Snare 1 81 %font "FluidR3_GM.sf2" 128 25 40 amp=33 pan=0 # 808 Snare 2 808 Snare 2 82 %font "FluidR3_GM.sf2" 128 25 38 amp=28 pan=0 # 808 Snare 1 808 Snare 1 83 %font "FluidR3_GM.sf2" 128 25 40 amp=48 pan=0 # 808 Snare 2 808 Snare 2 84 %font "FluidR3_GM.sf2" 128 40 38 amp=19 pan=0 # Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) 85 %font "FluidR3_GM.sf2" 128 40 38 amp=27 pan=0 # Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) Brush Snr 1(L) Brush Snr 1(R) 86 %font "FluidR3_GM.sf2" 128 40 39 amp=79 pan=0 # Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) 87 %font "FluidR3_GM.sf2" 128 40 39 amp=76 pan=0 # Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) 88 %font "FluidR3_GM.sf2" 128 40 39 amp=101 pan=0 # Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) Brush Snr 2(L) Brush Snr 2(R) 89 %font "FluidR3_GM.sf2" 128 40 40 amp=40 pan=0 # Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) 90 %font "FluidR3_GM.sf2" 128 40 40 amp=37 pan=0 # Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) 91 %font "FluidR3_GM.sf2" 128 40 40 amp=48 pan=0 # Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) Brush Swirl(L) Brush Swirl(R) 92 %font "FluidR3_GM.sf2" 128 0 38 amp=175 pan=0 # Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) Std Snr 1(L) Std Snr 1(R) 93 %font "FluidR3_GM.sf2" 128 0 40 amp=264 pan=0 # Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) 94 %font "FluidR3_GM.sf2" 128 0 40 amp=304 pan=0 # Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) Std Snr 2(L) Std Snr 2(R) 95 %font "FluidR3_GM.sf2" 128 9 38 amp=79 pan=0 # Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) Snr 1-2(L) Snr 1-2(R) 96 %font "FluidR3_GM.sf2" 128 9 40 amp=54 pan=0 # Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) Snr 1-1(L) Snr 1-1(R) 97 %font "FluidR3_GM.sf2" 128 10 38 amp=58 pan=0 # RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) RmPwr 2-1(L) RmPwr 2-1(R) 98 %font "FluidR3_GM.sf2" 128 10 40 amp=70 pan=0 # RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) RmPwr 2-2(L) RmPwr 2-2(R) 99 %font "FluidR3_GM.sf2" 128 11 38 amp=56 pan=0 # RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) RmPwr 1-1(L) RmPwr 1-1(R) drumset 53 32 %font "FluidR3_GM.sf2" 128 0 46 amp=77 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 33 %font "FluidR3_GM.sf2" 128 0 42 amp=35 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 34 %font "FluidR3_GM.sf2" 128 0 42 amp=47 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 35 %font "FluidR3_GM.sf2" 128 0 46 amp=272 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 36 %font "FluidR3_GM.sf2" 128 0 42 amp=24 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 37 %font "FluidR3_GM.sf2" 128 0 42 amp=26 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 38 %font "FluidR3_GM.sf2" 128 0 42 amp=19 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 39 %font "FluidR3_GM.sf2" 128 0 42 amp=19 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 40 %font "FluidR3_GM.sf2" 128 0 42 amp=20 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 41 %font "FluidR3_GM.sf2" 128 0 42 amp=27 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 42 %font "FluidR3_GM.sf2" 128 0 42 amp=39 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 43 %font "FluidR3_GM.sf2" 128 0 42 amp=47 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 44 %font "FluidR3_GM.sf2" 128 0 42 amp=36 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 45 %font "FluidR3_GM.sf2" 128 0 42 amp=80 pan=0 # Hi-Hat Closed(L) Hi-Hat Closed(R) 46 %font "FluidR3_GM.sf2" 128 0 44 amp=17 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 47 %font "FluidR3_GM.sf2" 128 0 44 amp=26 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 48 %font "FluidR3_GM.sf2" 128 0 44 amp=18 pan=0 # Hi-Hat Foot(L) Hi-Hat Foot(R) 49 %font "FluidR3_GM.sf2" 128 0 46 amp=66 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 50 %font "FluidR3_GM.sf2" 128 0 46 amp=55 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 51 %font "FluidR3_GM.sf2" 128 0 46 amp=58 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 52 %font "FluidR3_GM.sf2" 128 0 46 amp=27 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 53 %font "FluidR3_GM.sf2" 128 0 46 amp=64 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 54 %font "FluidR3_GM.sf2" 128 0 46 amp=90 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 55 %font "FluidR3_GM.sf2" 128 0 46 amp=107 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 56 %font "FluidR3_GM.sf2" 128 0 46 amp=108 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 57 %font "FluidR3_GM.sf2" 128 0 46 amp=161 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 58 %font "FluidR3_GM.sf2" 128 0 46 amp=208 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 59 %font "FluidR3_GM.sf2" 128 0 46 amp=131 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 60 %font "FluidR3_GM.sf2" 128 0 46 amp=117 pan=0 # Hi-Hat Half-Open(L) Hi-Hat Half-Open(R) 61 %font "FluidR3_GM.sf2" 128 0 49 amp=83 pan=0 # Crsh 1(L) Crsh 1(R) 62 %font "FluidR3_GM.sf2" 128 0 57 amp=68 pan=0 # Crsh 2(L) Crsh 2(R) 63 %font "FluidR3_GM.sf2" 128 0 49 amp=85 pan=0 # Crsh 1(L) Crsh 1(R) 64 %font "FluidR3_GM.sf2" 128 0 49 amp=49 pan=0 # Crsh 1(L) Crsh 1(R) 65 %font "FluidR3_GM.sf2" 128 0 49 amp=81 pan=0 # Crsh 1(L) Crsh 1(R) 66 %font "FluidR3_GM.sf2" 128 0 49 amp=44 pan=0 # Crsh 1(L) Crsh 1(R) 67 %font "FluidR3_GM.sf2" 128 0 49 amp=72 pan=0 # Crsh 1(L) Crsh 1(R) 68 %font "FluidR3_GM.sf2" 128 0 49 amp=128 pan=0 # Crsh 1(L) Crsh 1(R) 69 %font "FluidR3_GM.sf2" 128 0 57 amp=91 pan=0 # Crsh 2(L) Crsh 2(R) 70 %font "FluidR3_GM.sf2" 128 0 49 amp=80 pan=0 # Crsh 1(L) Crsh 1(R) 71 %font "FluidR3_GM.sf2" 128 0 57 amp=61 pan=0 # Crsh 2(L) Crsh 2(R) 72 %font "FluidR3_GM.sf2" 128 0 49 amp=73 pan=0 # Crsh 1(L) Crsh 1(R) 73 %font "FluidR3_GM.sf2" 128 0 49 amp=73 pan=0 # Crsh 1(L) Crsh 1(R) 74 %font "FluidR3_GM.sf2" 128 0 55 amp=58 pan=0 # Splash(L) Splash(R) 75 %font "FluidR3_GM.sf2" 128 0 55 amp=73 pan=0 # Splash(L) Splash(R) 76 %font "FluidR3_GM.sf2" 128 0 53 amp=41 pan=0 # BellRide(L) BellRide(R) 77 %font "FluidR3_GM.sf2" 128 0 53 amp=51 pan=0 # BellRide(L) BellRide(R) 78 %font "FluidR3_GM.sf2" 128 0 51 amp=22 pan=0 # Ride1(L) Ride1(R) 79 %font "FluidR3_GM.sf2" 128 0 59 amp=23 pan=0 # Ride2(L) Ride2(R) 80 %font "FluidR3_GM.sf2" 128 0 51 amp=28 pan=0 # Ride1(L) Ride1(R) 81 %font "FluidR3_GM.sf2" 128 0 51 amp=31 pan=0 # Ride1(L) Ride1(R) 82 %font "FluidR3_GM.sf2" 128 0 51 amp=16 pan=0 # Ride1(L) Ride1(R) 83 %font "FluidR3_GM.sf2" 128 0 51 amp=13 pan=0 # Ride1(L) Ride1(R) 84 %font "FluidR3_GM.sf2" 128 0 51 amp=15 pan=0 # Ride1(L) Ride1(R) 85 %font "FluidR3_GM.sf2" 128 0 51 amp=15 pan=0 # Ride1(L) Ride1(R) 86 %font "FluidR3_GM.sf2" 128 0 51 amp=12 pan=0 # Ride1(L) Ride1(R) 87 %font "FluidR3_GM.sf2" 128 0 51 amp=30 pan=0 # Ride1(L) Ride1(R) 88 %font "FluidR3_GM.sf2" 128 0 51 amp=95 pan=0 # Ride1(L) Ride1(R) 89 %font "FluidR3_GM.sf2" 128 0 51 amp=116 pan=0 # Ride1(L) Ride1(R) 90 %font "FluidR3_GM.sf2" 128 0 51 amp=104 pan=0 # Ride1(L) Ride1(R) 91 %font "FluidR3_GM.sf2" 128 0 39 amp=15 pan=0 # Clap(L) Clap(R) 92 %font "FluidR3_GM.sf2" 128 0 39 amp=67 pan=0 # Clap(L) Clap(R) 93 %font "FluidR3_GM.sf2" 128 0 39 amp=58 pan=0 # Clap(L) Clap(R) 94 %font "FluidR3_GM.sf2" 128 0 39 amp=60 pan=0 # Clap(L) Clap(R) 95 %font "FluidR3_GM.sf2" 128 0 39 amp=111 pan=0 # Clap(L) Clap(R) 96 %font "FluidR3_GM.sf2" 128 0 39 amp=57 pan=0 # Clap(L) Clap(R) ================================================ FILE: packages/sx05re/tools/sound/timidity/config/fluidr3_gs.cfg ================================================ dir /storage/roms/bios/timidity/sf2 bank 1 120 %font "FluidR3_GS.sf2" 1 120 amp=42 pan=0 121 %font "FluidR3_GS.sf2" 1 121 amp=170 pan=0 122 %font "FluidR3_GS.sf2" 1 122 amp=24 pan=0 123 %font "FluidR3_GS.sf2" 1 123 amp=26 pan=0 124 %font "FluidR3_GS.sf2" 1 124 amp=66 pan=0 125 %font "FluidR3_GS.sf2" 1 125 amp=97 pan=0 126 %font "FluidR3_GS.sf2" 1 126 amp=181 pan=0 127 %font "FluidR3_GS.sf2" 1 127 amp=44 pan=0 bank 2 120 %font "FluidR3_GS.sf2" 2 120 amp=89 pan=0 122 %font "FluidR3_GS.sf2" 2 122 amp=93 pan=0 123 %font "FluidR3_GS.sf2" 2 123 amp=147 pan=0 124 %font "FluidR3_GS.sf2" 2 124 amp=68 pan=0 125 %font "FluidR3_GS.sf2" 2 125 amp=33 pan=0 126 %font "FluidR3_GS.sf2" 2 126 amp=17 pan=0 127 %font "FluidR3_GS.sf2" 2 127 amp=95 pan=0 bank 3 122 %font "FluidR3_GS.sf2" 3 122 amp=45 pan=0 123 %font "FluidR3_GS.sf2" 3 123 amp=58 pan=0 124 %font "FluidR3_GS.sf2" 3 124 amp=146 pan=0 125 %font "FluidR3_GS.sf2" 3 125 amp=121 pan=0 126 %font "FluidR3_GS.sf2" 3 126 amp=67 pan=0 127 %font "FluidR3_GS.sf2" 3 127 amp=94 pan=0 bank 4 122 %font "FluidR3_GS.sf2" 4 122 amp=68 pan=0 124 %font "FluidR3_GS.sf2" 4 124 amp=41 pan=0 125 %font "FluidR3_GS.sf2" 4 125 amp=33 pan=0 126 %font "FluidR3_GS.sf2" 4 126 amp=30 pan=0 bank 5 122 %font "FluidR3_GS.sf2" 5 122 amp=81 pan=0 124 %font "FluidR3_GS.sf2" 5 124 amp=136 pan=0 125 %font "FluidR3_GS.sf2" 5 125 amp=22 pan=0 126 %font "FluidR3_GS.sf2" 5 126 amp=51 pan=0 bank 6 125 %font "FluidR3_GS.sf2" 6 125 amp=61 pan=0 bank 7 125 %font "FluidR3_GS.sf2" 7 125 amp=47 pan=0 bank 8 125 %font "FluidR3_GS.sf2" 8 125 amp=27 pan=0 drumset 56 39 %font "FluidR3_GS.sf2" 128 56 39 amp=49 pan=-23 # High Q(L) 40 %font "FluidR3_GS.sf2" 128 56 40 amp=116 pan=-23 # Slap 41 %font "FluidR3_GS.sf2" 128 56 41 amp=71 pan=-16 # Scratch Push(L) 42 %font "FluidR3_GS.sf2" 128 56 42 amp=45 pan=-16 # Scratch Pull(L) 43 %font "FluidR3_GS.sf2" 128 56 43 amp=152 pan=0 # Sticks(L) 44 %font "FluidR3_GS.sf2" 128 56 44 amp=296 pan=-16 # Square Click(L) 45 %font "FluidR3_GS.sf2" 128 56 45 amp=91 pan=0 # Metronome Click 46 %font "FluidR3_GS.sf2" 128 56 46 amp=52 pan=0 # Metronome Click 47 %font "FluidR3_GS.sf2" 128 56 47 amp=56 pan=0 # Fretnoise 48 %font "FluidR3_GS.sf2" 128 56 48 amp=26 pan=0 # Gtr Cut Up 49 %font "FluidR3_GS.sf2" 128 56 49 amp=65 pan=0 # Gtr Cut Down 50 %font "FluidR3_GS.sf2" 128 56 50 amp=47 pan=0 # Str. Slap 51 %font "FluidR3_GS.sf2" 128 56 51 amp=106 pan=0 # Pick Click 52 %font "FluidR3_GS.sf2" 128 56 52 amp=76 pan=0 # Laugh 53 %font "FluidR3_GS.sf2" 128 56 53 amp=27 pan=0 # Scream 54 %font "FluidR3_GS.sf2" 128 56 54 amp=140 pan=0 # Punch Punch 55 %font "FluidR3_GS.sf2" 128 56 55 amp=78 pan=0 # HeartBeat HeartBeat 56 %font "FluidR3_GS.sf2" 128 56 56 amp=30 pan=0 # FootStep FootStep 57 %font "FluidR3_GS.sf2" 128 56 57 amp=30 pan=0 # FootStep FootStep 58 %font "FluidR3_GS.sf2" 128 56 58 amp=7 pan=0 # Applause Applause 59 %font "FluidR3_GS.sf2" 128 56 59 amp=17 pan=0 # doorcreak doorcreak 60 %font "FluidR3_GS.sf2" 128 56 60 amp=86 pan=0 # Door 61 %font "FluidR3_GS.sf2" 128 56 61 amp=40 pan=0 # Scratchgs(L) Scratchgs(R) 62 %font "FluidR3_GS.sf2" 128 56 62 amp=225 pan=0 # Wind Chime Wind Chime Wind Chime 63 %font "FluidR3_GS.sf2" 128 56 63 amp=26 pan=0 # Car Start Car Start 64 %font "FluidR3_GS.sf2" 128 56 64 amp=101 pan=0 # Car Stop Car Stop 65 %font "FluidR3_GS.sf2" 128 56 65 amp=112 pan=0 # Car Pass Car Pass 66 %font "FluidR3_GS.sf2" 128 56 66 amp=78 pan=0 # Crash Car Crash1 67 %font "FluidR3_GS.sf2" 128 56 67 amp=3 pan=0 # Siren Siren 68 %font "FluidR3_GS.sf2" 128 56 68 amp=116 pan=0 # train train 69 %font "FluidR3_GS.sf2" 128 56 69 amp=43 pan=0 # Noise 70 %font "FluidR3_GS.sf2" 128 56 70 amp=76 pan=0 # Heli Heli 71 %font "FluidR3_GS.sf2" 128 56 71 amp=4 pan=0 # Ufo1 Ufo1 72 %font "FluidR3_GS.sf2" 128 56 72 amp=62 pan=0 # Gun 73 %font "FluidR3_GS.sf2" 128 56 73 amp=32 pan=0 # MachineGun MachineGun 74 %font "FluidR3_GS.sf2" 128 56 74 amp=55 pan=0 # Noise Gun 75 %font "FluidR3_GS.sf2" 128 56 75 amp=83 pan=0 # Explosion Explosion 76 %font "FluidR3_GS.sf2" 128 56 76 amp=74 pan=0 # Dog Bark Dog Bark 77 %font "FluidR3_GS.sf2" 128 56 77 amp=6 pan=0 # Gallops Gallops 78 %font "FluidR3_GS.sf2" 128 56 78 amp=49 pan=0 # Bird2(R) Bird2(L) 79 %font "FluidR3_GS.sf2" 128 56 79 amp=4 pan=0 # SeattleRain...(L) SeattleRain...(R) 80 %font "FluidR3_GS.sf2" 128 56 80 amp=185 pan=0 # Thunder(R) Thunder(L) 81 %font "FluidR3_GS.sf2" 128 56 81 amp=7 pan=0 # Noise Noise 82 %font "FluidR3_GS.sf2" 128 56 82 amp=111 pan=0 # Sea Shore Sea Shore Sea Shore 83 %font "FluidR3_GS.sf2" 128 56 83 amp=132 pan=0 # River bubbles River 84 %font "FluidR3_GS.sf2" 128 56 84 amp=96 pan=0 # bubbles bubbles ================================================ FILE: packages/sx05re/tools/sound/timidity/config/freepats.cfg ================================================ drumset 0 25 /storage/.config/timidity/freepats/Drum_000/025_Snare_Roll.pat 26 /storage/.config/timidity/freepats/Drum_000/026_Snap.pat 27 /storage/.config/timidity/freepats/Drum_000/027_High_Q.pat 31 /storage/.config/timidity/freepats/Drum_000/031_Sticks.pat 32 /storage/.config/timidity/freepats/Drum_000/032_Square_Click.pat 33 /storage/.config/timidity/freepats/Drum_000/033_Metronome_Click.pat 34 /storage/.config/timidity/freepats/Drum_000/034_Metronome_Bell.pat 35 /storage/.config/timidity/freepats/Drum_000/035_Kick_1.pat amp=100 36 /storage/.config/timidity/freepats/Drum_000/036_Kick_2.pat amp=100 37 /storage/.config/timidity/freepats/Drum_000/037_Stick_Rim.pat 38 /storage/.config/timidity/freepats/Drum_000/038_Snare_1.pat 39 /storage/.config/timidity/freepats/Drum_000/039_Clap_Hand.pat amp=100 40 /storage/.config/timidity/freepats/Drum_000/040_Snare_2.pat 41 /storage/.config/timidity/freepats/Drum_000/041_Tom_Low_2.pat amp=100 42 /storage/.config/timidity/freepats/Drum_000/042_Hi-Hat_Closed.pat 43 /storage/.config/timidity/freepats/Drum_000/043_Tom_Low_1.pat amp=100 44 /storage/.config/timidity/freepats/Drum_000/044_Hi-Hat_Pedal.pat 45 /storage/.config/timidity/freepats/Drum_000/045_Tom_Mid_2.pat amp=100 46 /storage/.config/timidity/freepats/Drum_000/046_Hi-Hat_Open.pat 47 /storage/.config/timidity/freepats/Drum_000/047_Tom_Mid_1.pat amp=100 48 /storage/.config/timidity/freepats/Drum_000/048_Tom_High_2.pat amp=100 49 /storage/.config/timidity/freepats/Drum_000/049_Cymbal_Crash_1.pat 50 /storage/.config/timidity/freepats/Drum_000/050_Tom_High_1.pat amp=100 51 /storage/.config/timidity/freepats/Drum_000/051_Cymbal_Ride_1.pat 52 /storage/.config/timidity/freepats/Drum_000/052_Cymbal_Chinese.pat 53 /storage/.config/timidity/freepats/Drum_000/053_Cymbal_Ride_Bell.pat amp=100 54 /storage/.config/timidity/freepats/Drum_000/054_Tombourine.pat 55 /storage/.config/timidity/freepats/Drum_000/055_Cymbal_Splash.pat 56 /storage/.config/timidity/freepats/Drum_000/056_Cow_Bell.pat 57 /storage/.config/timidity/freepats/Drum_000/057_Cymbal_Crash_2.pat 58 /storage/.config/timidity/freepats/Drum_000/058_Vibra-Slap.pat 59 /storage/.config/timidity/freepats/Drum_000/059_Cymbal_Ride_2.pat 60 /storage/.config/timidity/freepats/Drum_000/060_Bongo_High.pat 61 /storage/.config/timidity/freepats/Drum_000/061_Bongo_Low.pat 62 /storage/.config/timidity/freepats/Drum_000/062_Conga_High_1_Mute.pat 63 /storage/.config/timidity/freepats/Drum_000/063_Conga_High_2_Open.pat 64 /storage/.config/timidity/freepats/Drum_000/064_Conga_Low.pat 65 /storage/.config/timidity/freepats/Drum_000/065_Timbale_High.pat 66 /storage/.config/timidity/freepats/Drum_000/066_Timbale_Low.pat 67 /storage/.config/timidity/freepats/Drum_000/067_Agogo_High.pat 68 /storage/.config/timidity/freepats/Drum_000/068_Agogo_Low.pat 69 /storage/.config/timidity/freepats/Drum_000/069_Cabasa.pat amp=100 70 /storage/.config/timidity/freepats/Drum_000/070_Maracas.pat 71 /storage/.config/timidity/freepats/Drum_000/071_Whistle_1_High_Short.pat 72 /storage/.config/timidity/freepats/Drum_000/072_Whistle_2_Low_Long.pat 73 /storage/.config/timidity/freepats/Drum_000/073_Guiro_1_Short.pat 74 /storage/.config/timidity/freepats/Drum_000/074_Guiro_2_Long.pat 75 /storage/.config/timidity/freepats/Drum_000/075_Claves.pat amp=100 76 /storage/.config/timidity/freepats/Drum_000/076_Wood_Block_1_High.pat 77 /storage/.config/timidity/freepats/Drum_000/077_Wood_Block_2_Low.pat 78 /storage/.config/timidity/freepats/Drum_000/078_Cuica_1_Mute.pat amp=100 79 /storage/.config/timidity/freepats/Drum_000/079_Cuica_2_Open.pat amp=100 80 /storage/.config/timidity/freepats/Drum_000/080_Triangle_1_Mute.pat 81 /storage/.config/timidity/freepats/Drum_000/081_Triangle_2_Open.pat 82 /storage/.config/timidity/freepats/Drum_000/082_Shaker.pat 84 /storage/.config/timidity/freepats/Drum_000/084_Belltree.pat bank 0 0 /storage/.config/timidity/freepats/Tone_000/000_Acoustic_Grand_Piano.pat amp=120 pan=center 1 /storage/.config/timidity/freepats/Tone_000/001_Acoustic_Brite_Piano.pat 2 /storage/.config/timidity/freepats/Tone_000/002_Electric_Grand_Piano.pat 4 /storage/.config/timidity/freepats/Tone_000/004_Electric_Piano_1_Rhodes.pat 5 /storage/.config/timidity/freepats/Tone_000/005_Electric_Piano_2_Chorused_Yamaha_DX.pat 6 /storage/.config/timidity/freepats/Tone_000/006_Harpsichord.pat 7 /storage/.config/timidity/freepats/Tone_000/007_Clavinet.pat 8 /storage/.config/timidity/freepats/Tone_000/008_Celesta.pat 9 /storage/.config/timidity/freepats/Tone_000/009_Glockenspiel.pat 13 /storage/.config/timidity/freepats/Tone_000/013_Xylophone.pat 14 /storage/.config/timidity/freepats/Tone_000/014_Tubular_Bells.pat 15 /storage/.config/timidity/freepats/Tone_000/015_Dulcimer.pat 16 /storage/.config/timidity/freepats/Tone_000/016_Hammond_Organ.pat 19 /storage/.config/timidity/freepats/Tone_000/019_Church_Organ.pat 21 /storage/.config/timidity/freepats/Tone_000/021_Accordion.pat 23 /storage/.config/timidity/freepats/Tone_000/023_Tango_Accordion.pat 24 /storage/.config/timidity/freepats/Tone_000/024_Nylon_Guitar.pat 25 /storage/.config/timidity/freepats/Tone_000/025_Steel_Guitar.pat 26 /storage/.config/timidity/freepats/Tone_000/026_Jazz_Guitar.pat 27 /storage/.config/timidity/freepats/Tone_000/027_Clean_Electric_Guitar.pat 28 /storage/.config/timidity/freepats/Tone_000/028_Muted_Electric_Guitar.pat 29 /storage/.config/timidity/freepats/Tone_000/029_Overdriven_Guitar.pat 30 /storage/.config/timidity/freepats/Tone_000/030_Distortion_Guitar.pat 32 /storage/.config/timidity/freepats/Tone_000/032_Acoustic_Bass.pat 33 /storage/.config/timidity/freepats/Tone_000/033_Finger_Bass.pat 34 /storage/.config/timidity/freepats/Tone_000/034_Pick_Bass.pat 35 /storage/.config/timidity/freepats/Tone_000/035_Fretless_Bass.pat 36 /storage/.config/timidity/freepats/Tone_000/036_Slap_Bass_1.pat 37 /storage/.config/timidity/freepats/Tone_000/037_Slap_Bass_2.pat 38 /storage/.config/timidity/freepats/Tone_000/038_Synth_Bass_1.pat 40 /storage/.config/timidity/freepats/Tone_000/040_Violin.pat 42 /storage/.config/timidity/freepats/Tone_000/042_Cello.pat 44 /storage/.config/timidity/freepats/Tone_000/044_Tremolo_Strings.pat 45 /storage/.config/timidity/freepats/Tone_000/045_Pizzicato_Strings.pat 46 /storage/.config/timidity/freepats/Tone_000/046_Harp.pat 47 /storage/.config/timidity/freepats/Tone_000/047_Timpani.pat 48 /storage/.config/timidity/freepats/Tone_000/048_String_Ensemble_1_Marcato.pat 53 /storage/.config/timidity/freepats/Tone_000/053_Voice_Oohs.pat 56 /storage/.config/timidity/freepats/Tone_000/056_Trumpet.pat 57 /storage/.config/timidity/freepats/Tone_000/057_Trombone.pat 58 /storage/.config/timidity/freepats/Tone_000/058_Tuba.pat 59 /storage/.config/timidity/freepats/Tone_000/059_Muted_Trumpet.pat 60 /storage/.config/timidity/freepats/Tone_000/060_French_Horn.pat 61 /storage/.config/timidity/freepats/Tone_000/061_Brass_Section.pat 64 /storage/.config/timidity/freepats/Tone_000/064_Soprano_Sax.pat 65 /storage/.config/timidity/freepats/Tone_000/065_Alto_Sax.pat 66 /storage/.config/timidity/freepats/Tone_000/066_Tenor_Sax.pat 67 /storage/.config/timidity/freepats/Tone_000/067_Baritone_Sax.pat 68 /storage/.config/timidity/freepats/Tone_000/068_Oboe.pat 69 /storage/.config/timidity/freepats/Tone_000/069_English_Horn.pat 70 /storage/.config/timidity/freepats/Tone_000/070_Bassoon.pat 71 /storage/.config/timidity/freepats/Tone_000/071_Clarinet.pat 72 /storage/.config/timidity/freepats/Tone_000/072_Piccolo.pat 73 /storage/.config/timidity/freepats/Tone_000/073_Flute.pat 74 /storage/.config/timidity/freepats/Tone_000/074_Recorder.pat 75 /storage/.config/timidity/freepats/Tone_000/075_Pan_Flute.pat 76 /storage/.config/timidity/freepats/Tone_000/076_Bottle_Blow.pat 79 /storage/.config/timidity/freepats/Tone_000/079_Ocarina.pat 80 /storage/.config/timidity/freepats/Tone_000/080_Square_Wave.pat 84 /storage/.config/timidity/freepats/Tone_000/084_Charang.pat 88 /storage/.config/timidity/freepats/Tone_000/088_New_Age.pat 94 /storage/.config/timidity/freepats/Tone_000/094_Halo_Pad.pat 95 /storage/.config/timidity/freepats/Tone_000/095_Sweep_Pad.pat 98 /storage/.config/timidity/freepats/Tone_000/098_Crystal.pat 101 /storage/.config/timidity/freepats/Tone_000/101_Goblins--Unicorn.pat 102 /storage/.config/timidity/freepats/Tone_000/102_Echo_Voice.pat 104 /storage/.config/timidity/freepats/Tone_000/104_Sitar.pat 114 /storage/.config/timidity/freepats/Tone_000/114_Steel_Drums.pat 115 /storage/.config/timidity/freepats/Tone_000/115_Wood_Block.pat 120 /storage/.config/timidity/freepats/Tone_000/120_Guitar_Fret_Noise.pat 122 /storage/.config/timidity/freepats/Tone_000/122_Seashore.pat 125 /storage/.config/timidity/freepats/Tone_000/125_Helicopter.pat ================================================ FILE: packages/sx05re/tools/sound/timidity/config/soundfont_readme.txt ================================================ If you want music using FluidR3_GM and FluidR3_GS you need to download the soundfonts from: https://osdn.net/projects/sfnet_androidframe/downloads/soundfonts/FluidR3_GM.sf2/ https://osdn.net/projects/sfnet_androidframe/downloads/soundfonts/FluidR3_GS.sf2/ and place them in /storage/roms/bios/timidity/sf2 If you want music using freepats you need to download http://freepats.zenvoid.org/freepats-20060219.zip and unzip the file to /storage/roms/bios/timidity/freepats ================================================ FILE: packages/sx05re/tools/sound/timidity/config/timidity.cfg ================================================ # Instrument configuration file for timidity # $Id: timidity.cfg,v 1.7 2005/09/03 19:26:03 hmh Exp $ # You can change just about every option in TiMidity++ using # This config file. Please refer to the timidity.cfg(5) manpage # for more details ## If you have a slow CPU, uncomment these: #opt EFresamp=d #disable resampling #opt EFvlpf=d #disable VLPF #opt EFreverb=d #disable reverb #opt EFchorus=d #disable chorus #opt EFdelay=d #disable delay #opt anti-alias=d #disable sample anti-aliasing #opt EWPVSETOZ #disable all Midi Controls #opt p32a #default to 32 voices with auto reduction #opt s32kHz #default sample frequency to 32kHz #opt fast-decay #fast decay notes ## If you have a moderate CPU, try these: #opt EFresamp=l #opt EFreverb=g,42 #opt EFchorus=s #opt s32kHz #opt p64a # Disabling some of the Midi Controls can help with the CPU usage a lot. # The same goes to the VLPF, sample anti-aliasing and effects such as # reverb and chorus # By default, try to use the instrument patches from GeneralUser.cfg: source /storage/.config/timidity/GeneralUser.cfg # alternatively, you can use freepats # source /storage/.config/timidity/freepats.cfg # or alternatively, you can use the fluid-soundfont: # source /storage/.config/timidity/fluidr3_gm.cfg # source /storage/.config/timidity/fluidr3_gs.cfg ================================================ FILE: packages/sx05re/tools/sound/timidity/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="timidity" PKG_VERSION="2.15.0" PKG_ARCH="any" PKG_LICENSE="GPL2" PKG_SITE="https://sourceforge.net/projects/timidity/" PKG_URL="${SOURCEFORGE_SRC}/timidity/TiMidity++-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_mixer" PKG_LONGDESC="TiMidity++" PKG_TOOLCHAIN="autotools" pre_configure_target() { # doesn't like to be build in target folder cd ${PKG_BUILD} rm -fr .${TARGET_NAME} # simple tool can be build directly ${HOST_CC} timidity/calcnewt.c -o timidity/calcnewt_host -lm PKG_CONFIGURE_OPTS_TARGET="--host=${TARGET_NAME} \ --enable-alsa --with-default-output=alsa \ --with-default-path=/storage/.config/timidity \ lib_cv_va_copy=yes \ lib_cv___va_copy=yes \ lib_cv_va_val_copy=no \ ac_cv_c_bigendian=no \ --with-includes=${SYSROOT_PREFIX}/usr/include \ --with-libraries=${SYSROOT_PREFIX}/usr/lib --enable-alsaseq" } makeinstall_target() { mkdir -p ${INSTALL}/usr/config/timidity cp -rf ${PKG_DIR}/config/* ${INSTALL}/usr/config/timidity ln -sf /storage/roms/bios/timidity/freepats ${INSTALL}/usr/config/timidity/freepats mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/timidity/timidity ${INSTALL}/usr/bin mkdir -p ${INSTALL}/etc/timidity/ ln -sf /storage/.config/timidity/freepats.cfg ${INSTALL}/etc/timidity/freepats.cfg } ================================================ FILE: packages/sx05re/tools/sound/timidity/patches/02-calcnewt-host-build.patch ================================================ --- a/timidity/Makefile.am 2008-03-30 04:31:14.000000000 +0200 +++ b/timidity/Makefile.am 2020-08-17 10:55:25.271404644 +0200 @@ -446,21 +446,21 @@ resample.c: newton_table.c if VCPP newton_table.c: calcnewt$(EXEEXT) - ./calcnewt $@ + ./calcnewt_host $@ else if POCC newton_table.c: calcnewt$(EXEEXT) - ./calcnewt $@ + ./calcnewt_host $@ else if WATCOM_C newton_table.c: calcnewt$(EXEEXT) - ./calcnewt > $@ + ./calcnewt_host > $@ else newton_table.c: calcnewt$(EXEEXT) - ./calcnewt > $@ + ./calcnewt_host > $@ endif endif ================================================ FILE: packages/sx05re/tools/sound/timidity/patches/03-ar-cru-fix.patch ================================================ --- a/interface/Makefile.am 2013-12-12 03:04:52.000000000 +0100 +++ b/interface/Makefile.am 2020-08-17 10:56:55.977780546 +0200 @@ -220,7 +220,7 @@ if POCC if test -f interface.lib ; then touch $@ ; fi else rm -f libinterface.a - $(AR) cru libinterface.a $(libinterface_a_OBJECTS) $(libinterface_a_LIBADD) + $(AR) cr libinterface.a $(libinterface_a_OBJECTS) $(libinterface_a_LIBADD) $(RANLIB) libinterface.a endif endif ================================================ FILE: packages/sx05re/tools/sound/wildmidi/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ PKG_NAME="wildmidi" PKG_VERSION="405ca73" PKG_REV="1" PKG_ARCH="any" PKG_SITE="https://github.com/Mindwerks/wildmidi" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain alsa" PKG_PRIORITY="optional" PKG_SHORTDESC="WildMIDI is a simple software midi player which has a core softsynth library that can be used with other applications." PKG_IS_ADDON="no" PKG_AUTORECONF="no" PKG_TOOLCHAIN="cmake" PKG_CMAKE_OPTS_TARGET="WANT_PLAYER=OFF -DWANT_ALSA=ON" ================================================ FILE: packages/sx05re/tools/sound/wildmidi/sources/CMakeLists.txt ================================================ # ########## Project setup ########## PROJECT(wildmidi C) CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11) # WildMIDI Version SET(VERSION_MAJOR 0) SET(VERSION_MINOR 4) SET(VERSION_RELEASE 3) SET(WILDMIDI_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_RELEASE}") # Lib Versions SET(SOVERSION 2) SET(VERSION 2.1.0) # Find Macros SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) INCLUDE(CMakeDependentOption) INCLUDE(CheckCCompilerFlag) INCLUDE(CheckCSourceCompiles) INCLUDE(CheckIncludeFile) INCLUDE(TestBigEndian) # Set a default build type if none was specified IF (NOT DEFINED CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "") MESSAGE(STATUS "Setting build type to 'Debug' as none was specified.") SET(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE) # Set the possible values of build type for cmake-gui SET_PROPERTY(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") ENDIF () SET(CMAKE_CONFIGURATION_TYPES "${CMAKE_BUILD_TYPE}") MESSAGE(STATUS "Build Type: ${CMAKE_BUILD_TYPE}") # Set our options OPTION(BUILD_SHARED_LIBS "Build a dynamic wildmidi library" ON) OPTION(WANT_PLAYER "Build WildMIDI player in addition to the libraries" ON) OPTION(WANT_STATIC "Build static library in addition to dynamic library" OFF) CMAKE_DEPENDENT_OPTION(WANT_PLAYERSTATIC "Build a statically linked WildMIDI player" ON "WANT_STATIC;WANT_PLAYER" OFF) OPTION(WANT_ALSA "Include ALSA (Advanced Linux Sound Architecture) support" OFF) OPTION(WANT_OSS "Include OSS (Open Sound System) support" OFF) OPTION(WANT_OPENAL "Include OpenAL (Cross Platform) support" OFF) OPTION(WANT_DEVTEST "Build WildMIDI DevTest file to check files" OFF) OPTION(WANT_OSX_DEPLOYMENT "OSX Deployment" OFF) IF (WIN32 AND MSVC) OPTION(WANT_MP_BUILD "Build with Multiple Processes (/MP)" OFF) ENDIF () IF (UNIX AND NOT APPLE AND NOT RISCOS) SET(WILDMIDI_CFG "/etc/wildmidi/wildmidi.cfg" CACHE STRING "default config location") ELSE () SET(WILDMIDI_CFG "wildmidi.cfg" CACHE STRING "default config location") ENDIF () IF ((NOT BUILD_SHARED_LIBS) AND (NOT WANT_STATIC)) MESSAGE(FATAL_ERROR "Neither dynamic nor static library build is selected.") ENDIF () # Platform specific defines IF (UNIX) # allow 'large' files in 32 bit builds ADD_DEFINITIONS( -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES ) ENDIF (UNIX) # Usage of RPATH for macOS is enabled by default; this just suppresses the CMP0042 warning # when building libwildmidi_dynamic. IF (POLICY CMP0042) CMAKE_POLICY(SET CMP0042 NEW) ENDIF () IF (OPENBSD) # Set RPATH for OpenBSD so WildMIDI can find libWildMidi.so # use, i.e. don't skip the full RPATH for the build tree SET(CMAKE_SKIP_BUILD_RPATH FALSE) # when building, don't use the install RPATH already # (but later on when installing) SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") # add the automatically determined parts of the RPATH # which point to directories outside the build tree to the install RPATH SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # the RPATH to be used when installing, but only if it's not a system directory LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) IF ("${isSystemDir}" STREQUAL "-1") SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") ENDIF () ENDIF (OPENBSD) IF (WIN32) ADD_DEFINITIONS( -DNOMINMAX -DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_WARNINGS ) ENDIF (WIN32) # Compiler specific settings IF (CMAKE_COMPILER_IS_GNUCC OR (CMAKE_C_COMPILER_ID MATCHES "Clang")) ADD_DEFINITIONS( -Wall -W -fno-common ) IF (NOT WIN32 AND NOT CYGWIN) SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Werror") CHECK_C_SOURCE_COMPILES("int foo(void) __attribute__((visibility(\"default\"))); int main(void) {return 0;}" HAVE_VISIBILITY_DEFAULT) IF (HAVE_VISIBILITY_DEFAULT) CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN) ENDIF () SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}") ENDIF () IF (CMAKE_BUILD_TYPE STREQUAL "Debug") ADD_DEFINITIONS(-ggdb3 -O0) ELSEIF (CMAKE_BUILD_TYPE STREQUAL "Release") ADD_DEFINITIONS(-O3) ENDIF (CMAKE_BUILD_TYPE STREQUAL "Debug") ENDIF () IF (CMAKE_C_COMPILER_ID MATCHES "SunPro") SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -xldscope=hidden") # __SUNPRO_C >= 0x590 # CHECK_C_SOURCE_COMPILES("int foo(void) __attribute__((visibility(\"default\"))); # int main(void) {return 0;}" HAVE_VISIBILITY_DEFAULT) # __SUNPRO_C >= 0x550 CHECK_C_SOURCE_COMPILES("__global int foo(void); int main(void) {return 0;}" HAVE_LDSCOPE_GLOBAL) IF (HAVE_LDSCOPE_GLOBAL)# OR HAVE_VISIBILITY_DEFAULT SET(HAVE_LDSCOPE_HIDDEN 1) ENDIF () SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}") ENDIF () CHECK_C_SOURCE_COMPILES("int main(void) {__builtin_expect(0,0); return 0;}" HAVE___BUILTIN_EXPECT) CHECK_C_SOURCE_COMPILES("static inline int static_foo() {return 0;} int main(void) {return 0;}" HAVE_C_INLINE) CHECK_C_SOURCE_COMPILES("static __inline__ int static_foo() {return 0;} int main(void) {return 0;}" HAVE_C___INLINE__) CHECK_C_SOURCE_COMPILES("static __inline int static_foo() {return 0;} int main(void) {return 0;}" HAVE_C___INLINE) # we must not have any unresolved symbols: if (APPLE) SET(EXTRA_LDFLAGS "-Wl,-undefined,error") ELSE() SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wl,--no-undefined") CHECK_C_COMPILER_FLAG("" HAVE_NO_UNDEFINED) SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}") IF (HAVE_NO_UNDEFINED) SET(EXTRA_LDFLAGS "-Wl,--no-undefined -lm") ELSE() SET(EXTRA_LDFLAGS "") ENDIF() ENDIF() CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H) CHECK_INCLUDE_FILE(inttypes.h HAVE_INTTYPES_H) TEST_BIG_ENDIAN(WORDS_BIGENDIAN) SET(AUDIODRV_ALSA) SET(AUDIODRV_OSS) SET(AUDIODRV_OPENAL) # UNIX-like environments IF (UNIX AND NOT APPLE) # Go looking for available sound packages for WildMIDI player IF (WANT_PLAYER) FIND_PACKAGE(ALSA) FIND_PACKAGE(OpenAL) FIND_PACKAGE(OSS) # Set preferred output IF (WANT_ALSA) IF (NOT ALSA_FOUND) MESSAGE(FATAL_ERROR "ALSA required but not found.") ENDIF () SET(AUDIODRV_ALSA 1) SET(AUDIO_LIBRARY ${ALSA_LIBRARY}) ELSEIF (WANT_OSS) IF (NOT OSS_FOUND) MESSAGE(FATAL_ERROR "OSS required but not found.") ENDIF () # no special header paths SET(AUDIODRV_OSS 1) SET(AUDIO_LIBRARY ${OSS_LIBRARY}) ELSEIF (WANT_OPENAL) IF (NOT OPENAL_FOUND) MESSAGE(FATAL_ERROR "OpenAL required but not found.") ENDIF () SET(AUDIODRV_OPENAL 1) SET(AUDIO_LIBRARY ${OPENAL_LIBRARY}) ELSE () # Try to auto-detect IF (ALSA_FOUND) SET(AUDIO_LIBRARY ${ALSA_LIBRARY}) SET(AUDIODRV_ALSA 1) ELSEIF (OSS_FOUND) # no special header paths SET(AUDIO_LIBRARY ${OSS_LIBRARY}) SET(AUDIODRV_OSS 1) ELSEIF (OPENAL_FOUND) SET(AUDIO_LIBRARY ${OPENAL_LIBRARY}) SET(AUDIODRV_OPENAL 1) ELSE () MESSAGE(WARNING "Could not find an audio sub-system!") SET(AUDIO_LIBRARY "") ENDIF () ENDIF () ENDIF () # find our math lib FIND_LIBRARY(M_LIBRARY m) MESSAGE(STATUS "M_LIBRARY: ${M_LIBRARY}") IF (NOT M_LIBRARY) SET(M_LIBRARY "") ENDIF () ## Debian and non debian Linux building IF (DPKG_PROGRAM) ## Debian specific ELSE () ## Non debian specific ENDIF () ENDIF (UNIX AND NOT APPLE) IF (APPLE AND WANT_PLAYER) FIND_PACKAGE(OpenAL) IF (WANT_OPENAL) IF (NOT OPENAL_FOUND) MESSAGE(FATAL_ERROR "OpenAL required but not found.") ENDIF () SET(AUDIO_LIBRARY ${OPENAL_LIBRARY}) ELSE () IF (OPENAL_FOUND) SET(AUDIO_LIBRARY ${OPENAL_LIBRARY}) SET(AUDIODRV_OPENAL 1) ELSE () MESSAGE(WARNING "Could not find an audio sub-system!") SET(AUDIO_LIBRARY "") ENDIF () ENDIF () ENDIF () IF (WIN32) IF (WANT_PLAYER) LINK_LIBRARIES(winmm) ENDIF () ENDIF (WIN32) # ######### General setup ########## INCLUDE_DIRECTORIES(BEFORE "${CMAKE_SOURCE_DIR}/include") FILE(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include") INCLUDE_DIRECTORIES(BEFORE "${CMAKE_BINARY_DIR}/include") IF (NOT HAVE_STDINT_H) # AND NOT HAVE_INTTYPES_H INCLUDE_DIRECTORIES(BEFORE "${CMAKE_SOURCE_DIR}/include/stdint") ENDIF () IF (AMIGA OR AROS) SET(WILDMIDI_AMIGA 1) ENDIF () IF (APPLE) SET(APP_BUNDLE_NAME "${CMAKE_PROJECT_NAME}.app") SET(APP_BUNDLE_DIR "${wildmidi_BINARY_DIR}/${APP_BUNDLE_NAME}") IF (WANT_OSX_DEPLOYMENT) SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) ENDIF () ENDIF (APPLE) IF (APPLE) SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${APP_BUNDLE_DIR}/Contents/MacOS") ELSE (APPLE) SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${wildmidi_BINARY_DIR}") ENDIF (APPLE) # Setup up our config file CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/include/config.h.cmake" "${CMAKE_BINARY_DIR}/include/config.h") ADD_SUBDIRECTORY(src) ================================================ FILE: packages/sx05re/tools/sysutils/351Files/config/gptokeyb/351Files.gptk ================================================ back = backspace start = enter guide = esc a = enter b = backspace x = x y = backspace l1 = pageup l2 = home r1 = pagedown r2 = end up = up down = down left = left right = right left_analog_up = up left_analog_down = down left_analog_left = left left_analog_right = right right_analog_up = up right_analog_down = down right_analog_left = left right_analog_right = right ================================================ FILE: packages/sx05re/tools/sysutils/351Files/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="351Files" PKG_VERSION="492961726abb04ebefa58f7dda47b7040f3bd088" PKG_SHA256="249ef2842fb28fc9a1296f25a35b7f02ac5a5ef7a472b9a4e1a977722cf39643" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/EmuELEC/351Files" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_image SDL2_gfx SDL2_ttf freetype file" PKG_LONGDESC="File Manager" PKG_TOOLCHAIN="make" pre_configure_target() { sed -i "s|ifeq (\$(DEVICE),PC)||g" Makefile sed -i "s|endif||g" Makefile sed -i "s|START_PATH = \$(PWD)||g" Makefile sed -i "s|sdl2-config|${SYSROOT_PREFIX}/usr/bin/sdl2-config|g" Makefile sed -i "s|g++|\$(CXX)|g" Makefile EEDV="PC" if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then EEDV="EE_HH" fi PKG_MAKE_OPTS_TARGET=" START_PATH="/storage" DEVICE=${EEDV} RES_PATH="/emuelec/configs/fm/res"" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/fm cp 351Files ${INSTALL}/usr/bin/ cp -rf res ${INSTALL}/usr/config/emuelec/configs/fm/ cp -rf ${PKG_DIR}/config/* ${INSTALL}/usr/config/emuelec/configs/ } ================================================ FILE: packages/sx05re/tools/sysutils/351Files/patches/01-EmuELEC.patch ================================================ --- a/src/def.h +++ b/src/def.h @@ -41,16 +41,20 @@ #define KEYBOARD_KEY_SPACING 4 // Paraters for desktop PC +#elif defined(DEVICE_PC) || defined(DEVICE_EE_HH) + extern int SCREEN_WIDTH; + extern int SCREEN_HEIGHT; +#if defined(DEVICE_PC) + #define HARDWARE_ACCELERATION 1 #else - #define SCREEN_WIDTH 640 - #define SCREEN_HEIGHT 480 - #define HARDWARE_ACCELERATION 1 + #define HARDWARE_ACCELERATION 0 +#endif #define FULLSCREEN 0 #define FONT_NAME "NotoSans-Regular.ttf" #define FONT_NAME_MONO "NotoSansMono-Regular.ttf" - #define FONT_SIZE 20 - #define LINE_HEIGHT 32 - #define ICON_SIZE 24 + extern int FONT_SIZE; + extern int LINE_HEIGHT; + extern int ICON_SIZE; #define MARGIN_X 10 #define KEYBOARD_MARGIN 8 #define KEYBOARD_KEY_SPACING 4 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,6 +17,12 @@ int g_charW = 0; std::vector g_windows; bool IWindow::g_hasChanged = true; + +int SCREEN_WIDTH = 1920; +int SCREEN_HEIGHT = 1080; +int FONT_SIZE = 30; +int LINE_HEIGHT = 42; +int ICON_SIZE = 34; // Textures for icons SDL_Texture *g_iconFile = NULL; @@ -41,6 +47,24 @@ int main(int argc, char* args[]) { + + if (argc > 2) { + SCREEN_WIDTH = atoi(args[1]); + SCREEN_HEIGHT = atoi(args[2]); + + if (argc > 3) { + FONT_SIZE = atoi(args[3]); + } + + if (argc > 4) { + LINE_HEIGHT = atoi(args[4]); + } + + if (argc > 5) { + ICON_SIZE = atoi(args[5]); + } +} + // Init SDL if (! SDLUtils::init()) { ================================================ FILE: packages/sx05re/tools/sysutils/MC/etc/edit.indent.rc ================================================ #! /bin/sh # *** External Formatter (Indenter) for GNU Midnight Commander. # arguments: # $1 - Name of the file being edited # $2 - Name of the file to be processed exec >/dev/null case `echo $1 |sed 's/^.*\.//'` in c|h) # ftp://ftp.gnu.org/pub/gnu/indent/ # Please add options to your ~/.indent.pro, not here. indent "$2" ;; C|cc|CC|cxx|CXX|cpp|CPP) # http://astyle.sourceforge.net/ astyle "$2" ;; java|JAVA) # http://astyle.sourceforge.net/ astyle --style=java --mode=java "$2" ;; htm|html|HTM|HTML) # http://tidy.sourceforge.net/ tidy -q -m -ascii -wrap 80 "$2" ;; *) # http://www.gnu.org/software/coreutils/ fmt "$2" >"$2.tmp" && rm -f "$2" && mv -f "$2.tmp" "$2" ;; esac ================================================ FILE: packages/sx05re/tools/sysutils/MC/etc/edit.spell.rc ================================================ #! /bin/sh # *** External Spell Checker for GNU Midnight Commander. # arguments: # $1 - Name of the file being edited # $2 - Name of the file to be processed if aspell /dev/null 2>&1; then aspell -c "$2" else ispell "$2" fi ================================================ FILE: packages/sx05re/tools/sysutils/MC/etc/filehighlight.ini ================================================ [executable] type=FILE_EXE [directory] type=DIR [device] type=DEVICE [special] type=SPECIAL [stalelink] type=STALE_LINK [symlink] type=SYMLINK [hardlink] type=HARDLINK [core] regexp=^core\\.*\\d*$ [temp] extensions=tmp;$$$;~;bak extensions_case=false regexp=(^#.*|.*~$) [archive] extensions=gz;bz2;tar;tgz;rpm;Z;rar;zip;arj;cab;lzh;lha;zoo;arc;ark;xz;tbz;tbz2; [doc] extensions=txt;doc;rtf;diz;ctl;me;ps;pdf;xml;xsd;xslt;dtd;html;shtml;htm;mail;msg;lsm;po;nroff;man;tex;sgml;css;text;letter;chm [source] extensions=c;h;cc;hh;cpp;cxx;hpp;asm;py;pl;pm;inc;cgi;php;phps;js;java;jav;jasm;sh;bash;diff;patch;pas;tcl;tk;awk;m4;st;mak;sl;ada;caml;ml;mli;mly;mll;mlp;sas;prg;hs;hi;erl [media] extensions=mp2;mp3;mpg;ogg;mpeg;wav;avi;asf;mov;mol;mpl;xm;mod;it;med;mid;midi;s3m;umx;vob;mkv;flv;mp4;m3u [graph] extensions=jpg;jpeg;gif;png;tif;pcx;bmp;xpm;xbm;eps;pic;rle;ico;wmf;omf;ai;cdr [database] extensions=dbf;mdn;db;mdb;dat;fox;dbx;mdx;sql;mssql;msql;ssql;pgsql;xls;cdx;dbi ================================================ FILE: packages/sx05re/tools/sysutils/MC/etc/ini ================================================ [Midnight-Commander] verbose=1 pause_after_run=1 shell_patterns=1 auto_save_setup=1 auto_menu=0 use_internal_view=1 use_internal_edit=1 clear_before_exec=1 confirm_delete=1 confirm_overwrite=1 confirm_execute=0 confirm_history_cleanup=1 confirm_exit=1 confirm_directory_hotlist_delete=1 safe_delete=0 mouse_repeat_rate=100 double_click_speed=250 use_8th_bit_as_meta=0 confirm_view_dir=0 mouse_move_pages_viewer=1 mouse_close_dialog=0 fast_refresh=0 drop_menus=0 wrap_mode=1 old_esc_mode=0 old_esc_mode_timeout=1000000 cd_symlinks=1 show_all_if_ambiguous=0 max_dirt_limit=10 use_file_to_guess_type=1 alternate_plus_minus=0 only_leading_plus_minus=1 show_output_starts_shell=0 xtree_mode=0 num_history_items_recorded=60 file_op_compute_totals=1 classic_progressbar=1 vfs_timeout=60 ftpfs_directory_timeout=900 use_netrc=1 ftpfs_retry_seconds=30 ftpfs_always_use_proxy=0 ftpfs_use_passive_connections=1 ftpfs_use_passive_connections_over_proxy=0 ftpfs_use_unix_list_options=1 ftpfs_first_cd_then_ls=1 fish_directory_timeout=900 editor_tab_spacing=8 editor_word_wrap_line_length=72 editor_fill_tabs_with_spaces=0 editor_return_does_auto_indent=1 editor_backspace_through_tabs=0 editor_fake_half_tabs=1 editor_option_save_mode=0 editor_option_save_position=1 editor_option_auto_para_formatting=0 editor_option_typewriter_wrap=0 editor_edit_confirm_save=1 editor_syntax_highlighting=1 editor_persistent_selections=1 editor_cursor_beyond_eol=0 editor_visible_tabs=1 editor_visible_spaces=1 editor_line_state=0 editor_simple_statusbar=0 editor_check_new_line=0 editor_show_right_margin=0 editor_group_undo=0 nice_rotating_dash=1 mcview_remember_file_position=0 auto_fill_mkdir_name=1 copymove_persistent_attr=1 select_flags=6 editor_backup_extension=~ mcview_eof= ignore_ftp_chattr_errors=true keymap=mc.keymap skin=default filepos_max_saved_entries=1024 preallocate_space=0 editor_cursor_after_inserted_block=0 editor_ask_filename_before_edit=0 editor_filesize_threshold=64M [Layout] message_visible=0 keybar_visible=1 xterm_title=1 output_lines=0 command_prompt=1 menubar_visible=1 free_space=1 horizontal_split=0 vertical_equal=1 left_panel_size=118 horizontal_equal=1 top_panel_size=118 [Misc] timeformat_recent=%b %e %H:%M timeformat_old=%b %e %Y ftp_proxy_host=gate ftpfs_password=anonymous@ display_codepage=UTF-8 source_codepage=UTF-8 autodetect_codeset= clipboard_store= clipboard_paste= [Colors] base_color= linux= color_terminals= xterm= [Panels] show_mini_info=true kilobyte_si=false mix_all_files=false show_backups=true show_dot_files=true fast_reload=false fast_reload_msg_shown=false mark_moves_down=true reverse_files_only=true auto_save_setup_panels=true navigate_with_arrows=false panel_scroll_pages=true mouse_move_pages=true filetype_mode=true permission_mode=false torben_fj_mode=false quick_search_mode=2 simple_swap=false [terminal:linux] f1=\\e[11~ f2=\\e[12~ f3=\\e[13~ f4=\\e[14~ f5=\\e[15~ [terminal:xterm] f1=\\e[11~ up=\\e[A down=\\e[B left=\\e[D right=\\e[C [Panelize] Find *.orig after patching=find . -name \\*.orig -print Find SUID and SGID programs=find . \\( \\( -perm -04000 -a -perm +011 \\) -o \\( -perm -02000 -a -perm +01 \\) \\) -print Find rejects after patching=find . -name \\*.rej -print ================================================ FILE: packages/sx05re/tools/sysutils/MC/etc/mc.ext ================================================ # Midnight Commander 3.0 extension file # Warning: Structure of this file has changed completely with version 3.0 # # All lines starting with # or empty lines are thrown away. # Lines starting in the first column should have following format: # # keyword/descNL, i.e. everything after keyword/ until new line is desc # # keyword can be: # # shell (desc is, when starting with a dot, any extension (no wildcars), # i.e. matches all the files *desc . Example: .tar matches *.tar; # if it doesn't start with a dot, it matches only a file of that name) # # regex (desc is an extended regular expression) # Please note that we are using the GNU regex library and thus # \| matches the literal | and | has special meaning (or) and # () have special meaning and \( \) stand for literal ( ). # # type (file matches this if `file %f` matches regular expression desc # (the filename: part from `file %f` is removed)) # # directory (matches any directory matching regular expression desc) # # include (matches an include directive) # # default (matches any file no matter what desc is) # # Other lines should start with a space or tab and should be in the format: # # keyword=commandNL (with no spaces around =), where keyword should be: # # Open (if the user presses Enter or doubleclicks it), # # View (F3), Edit (F4) # # Include is the keyword used to add any further entries from an include/ # section # # command is any one-line shell command, with the following substitutions: # # %% -> % character # %p -> name of the current file (without path, but pwd is its path) # %f -> name of the current file. Unlike %p, if file is located on a # non-local virtual filesystem, i.e. either tarfs or ftpfs, # then the file will be temporarily copied into a local directory # and %f will be the full path to this local temporal file. # If you don't want to get a local copy and want to get the # virtual fs path (like /#ftp:ftp.cvut.cz/pub/hungry/xword), then # use %d/%p instead of %f. # %d -> name of the current directory (pwd, without trailing slash) # %s -> "selected files", i.e. space separated list of tagged files if any # or name of the current file # %t -> list of tagged files # %u -> list of tagged files (they'll be untaged after the command) # # (If these 6 letters are in uppercase, they refer to the other panel. # But you shouldn't have to use it in this file.) # # # %cd -> the rest is a path mc should change into (cd won't work, since it's # a child process). %cd handles even vfs names. # # %view -> the command you type will be piped into mc's internal file viewer # if you type only the %view and no command, viewer will load %f file # instead (i.e. no piping, so it is different to %view cat %f) # %view may be directly followed by {} with a list of any of # ascii (Ascii mode), hex (Hex mode), nroff (color highlighting for # text using backspace for bold and underscore) and unform # (no highlighting for nroff sequences) separated by commas. # # %var -> You use it like this: %var{VAR:default}. This macro will expand # to the value of the VAR variable in the environment if it's set # otherwise the value in default will be used. This is similar to # the Bourne shell ${VAR-default} construct. # # Rules are applied from top to bottom, thus the order is important. # If some actions are missing, search continues as if this target didn't # match (i.e. if a file matches the first and second entry and View action # is missing in the first one, then on pressing F3 the View action from # the second entry will be used. default should catch all the actions. # # Any new entries you develop for you are always welcome if they are # useful on more than one system. You can post your modifications # as tickets at www.midnight-commander.org ### Changes ### # # Reorganization: 2000-05-01 Michal Svec ### TODO ### # # Postscript Open: ps2svga [gs -DEVICE=jpeg|zgv or something] # Images asciiview # # All X Apps [Nothing/Warning] if no DISPLAY # Not found [Default/Warning] # Empty Output [Default/Warning] # Edit: CopyOut+EDIT+CopyIn # Security Check gzip/bzip EDIT (mktemp) # # Maybe: Open/XOpen/GOpen/KOpen/... for Console/X/GNOME/KDE/etc. ### GIT Repo ### # gitfs changeset regex/^\[git\] Open=%cd %p/changesetfs:// View=%cd %p/patchsetfs:// ### Archives ### # .tgz, .tpz, .tar.gz, .tar.z, .tar.Z, .ipk regex/\.t([gp]?z|ar\.g?[zZ])$|\.ipk$ Open=%cd %p/utar:// View=%view{ascii} gzip -dc %f 2>/dev/null | tar tvvf - regex/\.tar\.bz$ # Open=%cd %p/utar:// View=%view{ascii} bzip -dc %f 2>/dev/null | tar tvvf - regex/\.t(ar\.bz2|bz2?|b2)$ Open=%cd %p/utar:// View=%view{ascii} bzip2 -dc %f 2>/dev/null | tar tvvf - # .tar.lzma, .tlz regex/\.t(ar\.lzma|lz)$ Open=%cd %p/utar:// View=%view{ascii} lzma -dc %f 2>/dev/null | tar tvvf - # .tar.xz, .txz regex/\.t(ar\.xz|xz)$ Open=%cd %p/utar:// View=%view{ascii} xz -dc %f 2>/dev/null | tar tvvf - # .tar.F - used in QNX regex/\.tar\.F$ # Open=%cd %p/utar:// View=%view{ascii} freeze -dc %f 2>/dev/null | tar tvvf - # .qpr/.qpk - QNX Neutrino package installer files regex/\.(qp[rk])$ Open=%cd %p/utar:// View=%view{ascii} gzip -dc %f 2>/dev/null | tar tvvf - # tar regex/\.(tar|TAR)$ Open=%cd %p/utar:// View=%view{ascii} tar tvvf - < %f # lha type/^LHa\ .*archive Open=%cd %p/ulha:// View=%view{ascii} lha l %f # arj regex/\.a(rj|[0-9][0-9])$ Open=%cd %p/uarj:// View=%view{ascii} unarj l %f # cab regex/\.([cC][aA][bB])$ Open=%cd %p/ucab:// View=%view{ascii} cabextract -l %f # ha regex/\.([Hh][Aa])$ Open=%cd %p/uha:// View=%view{ascii} ha lf %f # rar regex/\.[rR]([aA][rR]|[0-9][0-9])$ Open=%cd %p/urar:// View=%view{ascii} rar v -c- %f # ALZip regex/\.(alz|ALZ)$ Open=%cd %p/ualz:// View=%view{ascii} unalz -l %f # cpio shell/.cpio.Z Open=%cd %p/ucpio:// View=%view{ascii} gzip -dc %f | cpio -itv 2>/dev/null shell/.cpio.gz Open=%cd %p/ucpio:// View=%view{ascii} gzip -dc %f | cpio -itv 2>/dev/null shell/.cpio Open=%cd %p/ucpio:// View=%view{ascii} cpio -itv < %f 2>/dev/null # ls-lR regex/(^|\.)ls-?lR(\.gz|Z|bz2)$ Open=%cd %p/lslR:// # patch regex/\.(diff|patch)(\.bz2)$ Open=%cd %p/patchfs:// View=%view{ascii} bzip2 -dc %f 2>/dev/null regex/\.(diff|patch)(\.(gz|Z))$ Open=%cd %p/patchfs:// View=%view{ascii} gzip -dc %f 2>/dev/null regex/\.(diff|patch)$ Open=%cd %p/patchfs:// View=%view{ascii} /bin/cat %f 2>/dev/null # ar library regex/\.s?a$ Open=%cd %p/uar:// #Open=%view{ascii} ar tv %f View=%view{ascii} file %f && nm -C %f # trpm regex/\.trpm$ Open=%cd %p/trpm:// View=%view{ascii} rpm -qivl --scripts `basename %p .trpm` # RPM packages (SuSE uses *.spm for source packages) regex/\.(src\.rpm|spm)$ Open=%cd %p/rpm:// View=%view{ascii} if rpm --nosignature --version >/dev/null 2>&1; then RPM="rpm --nosignature" ; else RPM="rpm" ; fi ; $RPM -qivlp --scripts %f regex/\.rpm$ Open=%cd %p/rpm:// View=%view{ascii} if rpm --nosignature --version >/dev/null 2>&1; then RPM="rpm --nosignature" ; else RPM="rpm" ; fi ; $RPM -qivlp --scripts %f # deb regex/\.u?deb$ Open=%cd %p/deb:// View=%view{ascii} dpkg-deb -I %f && echo && dpkg-deb -c %f # dpkg shell/.debd Open=%cd %p/debd:// View=%view{ascii} dpkg -s `echo %p | sed 's/\([0-9a-z.-]*\).*/\1/'` # apt shell/.deba Open=%cd %p/deba:// View=%view{ascii} apt-cache show `echo %p | sed 's/\([0-9a-z.-]*\).*/\1/'` # ISO9660 regex/\.([iI][sS][oO])$ Open=%cd %p/iso9660:// View=%view{ascii} isoinfo -l -i %f # 7zip archives (they are not man pages) regex/\.(7z|7Z)$ Open=%cd %p/u7z:// View=%view{ascii} 7za l %f 2>/dev/null # Mailboxes type/^ASCII\ mail\ text Open=%cd %p/mailfs:// ### Sources ### # C shell/.c Include=editor # Fortran shell/.f Include=editor # Header regex/\.(h|hpp)$ Include=editor # Asm shell/.s Include=editor # C++ regex/\.(C|cc|cpp)$ Include=editor include/editor Open=%var{EDITOR:vi} %f # .so libraries regex/\.(so|so\.[0-9\.]*)$ View=%view{ascii} file %f && nm -C -D %f # Object type/^ELF #Open=%var{PAGER:more} %f View=%view{ascii} file %f && nm -C %f ### Documentation ### # Texinfo regex/\.(te?xi|texinfo)$ # GNU Info page type/^Info\ text Open=info -f %f shell/.info Open=info -f %f # Exception: .3gp are video files not manual pages regex/\.(3[gG][pP])$ Include=video # Manual page regex/(([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])|\.man)$ Open=case %d/%f in */log/*|*/logs/*) cat %f ;; *) { zsoelim %f 2>/dev/null || cat %f; } | nroff -c -Tlatin1 -mandoc ;; esac | %var{PAGER:more} View=%view{ascii,nroff} case %d/%f in */log/*|*/logs/*) cat %f ;; *) { zsoelim %f 2>/dev/null || cat %f; } | nroff -c -Tlatin1 -mandoc ;; esac # Perl pod page shell/.pod Open=pod2man %f | nroff -c -Tlatin1 -mandoc | %var{PAGER:more} View=%view{ascii,nroff} pod2man %f | nroff -c -Tlatin1 -mandoc # Troff with me macros. # Exception - "read.me" is not a nroff file. shell/read.me Open= View= shell/.me Open=nroff -c -Tlatin1 -me %f | %var{PAGER:more} View=%view{ascii,nroff} nroff -c -Tlatin1 -me %f # Troff with ms macros. shell/.ms Open=nroff -c -Tlatin1 -ms %f | %var{PAGER:more} View=%view{ascii,nroff} nroff -c -Tlatin1 -ms %f # Manual page - compressed regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.g?[Zz]$ Open=case %d/%f in */log/*|*/logs/*) gzip -dc %f ;; *) gzip -dc %f | nroff -c -Tlatin1 -mandoc ;; esac | %var{PAGER:more} View=%view{ascii,nroff} case %d/%f in */log/*|*/logs/*) gzip -dc %f ;; *) gzip -dc %f | nroff -c -Tlatin1 -mandoc ;; esac regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.bz$ Open=case %d/%f in */log/*|*/logs/*) bzip -dc %f ;; *) bzip -dc %f | nroff -c -Tlatin1 -mandoc ;; esac | %var{PAGER:more} View=%view{ascii,nroff} case %d/%f in */log/*|*/logs/*) bzip -dc %f ;; *) bzip -dc %f | nroff -c -Tlatin1 -mandoc ;; esac regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.bz2$ Open=case %d/%f in */log/*|*/logs/*) bzip2 -dc %f ;; *) bzip2 -dc %f | nroff -c -Tlatin1 -mandoc ;; esac | %var{PAGER:more} View=%view{ascii,nroff} case %d/%f in */log/*|*/logs/*) bzip2 -dc %f ;; *) bzip2 -dc %f | nroff -c -Tlatin1 -mandoc ;; esac regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.lzma$ Open=case %d/%f in */log/*|*/logs/*) lzma -dc %f ;; *) lzma -dc %f | nroff -c -Tlatin1 -mandoc ;; esac | %var{PAGER:more} View=%view{ascii,nroff} case %d/%f in */log/*|*/logs/*) lzma -dc %f ;; *) lzma -dc %f | nroff -c -Tlatin1 -mandoc ;; esac regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.xz$ Open=case %d/%f in */log/*|*/logs/*) xz -dc %f ;; *) xz -dc %f | nroff -c -Tlatin1 -mandoc ;; esac | %var{PAGER:more} View=%view{ascii,nroff} case %d/%f in */log/*|*/logs/*) xz -dc %f ;; *) xz -dc %f | nroff -c -Tlatin1 -mandoc ;; esac # CHM regex/\.(chm|CHM)$ Open=which kchmviewer > /dev/null 2>&1 && (kchmviewer %f &) || (xchm %f &) ### Images ### type/^GIF Include=image type/^JPEG View=%view{ascii} identify %f; test -x /usr/bin/exif && echo && exif %f 2>/dev/null Include=image type/^PC\ bitmap Include=image type/^PNG Include=image type/^TIFF Include=image type/^PBM Include=image type/^PGM Include=image type/^PPM Include=image type/^Netpbm Include=image shell/.xcf Open=(gimp %f &) shell/.xbm Open=bitmap %f shell/.xpm Include=image View=sxpm %f shell/.ico Include=image include/image Open=if [ "$DISPLAY" = "" ]; then zgv %f; else (gqview %f &); fi View=%view{ascii} identify %f #View=%view{ascii} asciiview %f ### Sound files ### regex/\.([wW][aA][vV]|[sS][nN][dD]|[vV][oO][cC]|[aA][uU]|[sS][mM][pP]|[aA][iI][fF][fF]|[sS][nN][dD])$ Open=if [ "$DISPLAY" = "" ]; then play %f; else (xmms %f >/dev/null 2>&1 &); fi regex/\.([mM][oO][dD]|[sS]3[mM]|[xX][mM]|[iI][tT]|[mM][tT][mM]|669|[sS][tT][mM]|[uU][lL][tT]|[fF][aA][rR])$ Open=mikmod %f #Open=tracker %f regex/\.([wW][aA][wW]22)$ Open=vplay -s 22 %f regex/\.([mM][pP]3)$ Open=if [ "$DISPLAY" = "" ]; then mpg123 %f; else (xmms %f >/dev/null 2>&1 &); fi View=%view{ascii} mpg123 -vtn1 %f 2>&1 | sed -n '/^Title/,/^Comment/p;/^MPEG/,/^Audio/p' regex/\.([oO][gG][gG|aA|vV|xX])$ Open=if [ "$DISPLAY" = "" ]; then ogg123 %f; else (xmms %f >/dev/null 2>&1 &); fi View=%view{ascii} ogginfo %s regex/\.([sS][pP][xX]|[fF][lL][aA][cC])$ Open=if [ "$DISPLAY" = "" ]; then play %f; else (xmms %f >/dev/null 2>&1 &); fi regex/\.([mM][iI][dD][iI]?|[rR][mM][iI][dD]?)$ Open=timidity %f regex/\.([wW][mM][aA])$ Open=mplayer -vo null %f View=%view{ascii} mplayer -quiet -slave -frames 0 -vo null -ao null -identify %f 2>/dev/null | tail +13 || file %f ### Play lists ### regex/\.([mM]3[uU]|[pP][lL][sS])$ Open=if [ -z "$DISPLAY" ]; then mplayer -vo null -playlist %f; else (xmms -p %f >/dev/null 2>&1 &); fi ### Video ### regex/\.([aA][vV][iI])$ Include=video regex/\.([aA][sS][fFxX])$ Include=video regex/\.([dD][iI][vV][xX])$ Include=video regex/\.([mM][kK][vV])$ Include=video regex/\.([mM][oO][vV]|[qQ][tT])$ Include=video regex/\.([mM][pP]4|[mM][pP][eE]?[gG])$ Include=video # MPEG-2 TS container + H.264 codec regex/\.([mM][tT][sS])$ Include=video regex/\.([vV][oO][bB])$ Include=video regex/\.([wW][mM][vV])$ Include=video regex/\.([fF][lL][iIcCvV])$ Include=video regex/\.([oO][gG][mM])$ Include=video regex/\.([rR][aA]?[mM])$ Open=(realplay %f >/dev/null 2>&1 &) include/video Open=(mplayer %f >/dev/null 2>&1 &) #Open=(gtv %f >/dev/null 2>&1 &) #Open=(xanim %f >/dev/null 2>&1 &) ### Documents ### # Postscript type/^PostScript Open=(gv %f &) View=%view{ascii} ps2ascii %f # PDF type/^PDF Open=(xpdf %f &) #Open=(acroread %f &) #Open=(ghostview %f &) View=%view{ascii} pdftotext %f - # The following code very ugly and should not be taken as example. # It should be cleaned up when the new format of mc.ext is developed. # html regex/\.([hH][tT][mM][lL]?)$ Open=(if test -n "" && test -n "$DISPLAY"; then ( file://%d/%p &) 1>&2; else links %f || lynx -force_html %f || ${PAGER:-more} %f; fi) 2>/dev/null View=%view{ascii} links -dump %f 2>/dev/null || w3m -dump %f 2>/dev/null || lynx -dump -force_html %f # StarOffice 5.2 shell/.sdw Open=(ooffice %f &) # StarOffice 6 and OpenOffice.org formats regex/\.(odt|ott|sxw|stw|ods|ots|sxc|stc|odp|otp|sxi|sti|odg|otg|sxd|std|odb|odf|sxm|odm|sxg)$ Open=(ooffice %f &) View=%view{ascii} odt2txt %f # AbiWord shell/.abw Open=(abiword %f &) # Microsoft Word Document regex/\.([Dd][oO][cCtT]|[Ww][rR][iI])$ Open=(abiword %f >/dev/null 2>&1 &) View=%view{ascii} antiword -t %f || catdoc -w %f || word2x -f text %f - || strings %f type/^Microsoft\ Word Open=(abiword %f >/dev/null 2>&1 &) View=%view{ascii} antiword -t %f || catdoc -w %f || word2x -f text %f - || strings %f # RTF document regex/\.([rR][tT][fF])$ Open=(abiword %f >/dev/null 2>&1 &) # Microsoft Excel Worksheet regex/\.([xX][lL][sSwW])$ Open=(gnumeric %f >/dev/null 2>&1 &) View=%view{ascii} xls2csv %f || strings %f type/^Microsoft\ Excel Open=(gnumeric %f >/dev/null 2>&1 &) View=%view{ascii} xls2csv %f || strings %f # Use OpenOffice.org to open any MS Office documents type/^Microsoft\ Office\ Document Open=(ooffice %f &) # Framemaker type/^FrameMaker Open=fmclient -f %f # DVI regex/\.([dD][vV][iI])$ Open=if [ x$DISPLAY = x ]; then dvisvga %f; else (xdvi %f &); fi View=%view{ascii} dvi2tty %f # TeX regex/\.([Tt][Ee][Xx])$ Include=editor # DjVu regex/\.(djvu|DJVU)$ Open=djview %f & ### Miscellaneous ### # Makefile regex/[Mm]akefile$ Open=make -f %f %{Enter parameters} # Imakefile shell/Imakefile Open=xmkmf -a # Makefile.PL (MakeMaker) regex/^Makefile.(PL|pl)$ Open=%var{PERL:perl} %f # dbf regex/\.([dD][bB][fF])$ Open=%view{ascii} dbview %f View=%view{ascii} dbview -b %f # REXX script regex/\.(rexx?|cmd)$ Open=rexx %f %{Enter parameters};echo "Press ENTER";read y # Disk images for Commodore computers (VIC20, C64, C128) regex/\.(d64|D64)$ Open=%cd %p/uc1541:// View=%view{ascii} c1541 %f -list Extract=c1541 %f -extract # Glade, a user interface designer for GTK+ and GNOME regex/\.([Gg][Ll][Aa][Dd][Ee])$ Open=if glade-3 --version >/dev/null 2>&1; then (glade-3 %f >/dev/null 2>&1 &); else (glade-2 %f >/dev/null 2>&1 &); fi # Gettext Catalogs shell/.mo View=%view{ascii} msgunfmt %f || cat %f # lyx regex/\.(lyx|LYX)$ Open=lyx %f View=%view{ascii} lyxcat %f # torrent regex/\.([tT][oO][rR][rR][eE][nN][tT])$ View=%view{ascii} ctorrent -x %f 2>/dev/null ### Plain compressed files ### # ace regex/\.(ace|ACE)$ Open=%cd %p/uace:// View=%view{ascii} unace l %f Extract=unace x %f # arc regex/\.(arc|ARC)$ Open=%cd %p/uarc:// View=%view{ascii} arc l %f Extract=arc x %f '*' Extract (with flags)=I=%{Enter any Arc flags:}; if test -n "$I"; then arc x $I %f; fi # zip type/^([Zz][Ii][Pp])\ archive Open=%cd %p/uzip:// View=%view{ascii} unzip -v %f # zoo regex/\.([Zz][Oo][Oo])$ Open=%cd %p/uzoo:// View=%view{ascii} zoo l %f # gzip type/^gzip Open=gzip -dc %f | %var{PAGER:more} View=%view{ascii} gzip -dc %f 2>/dev/null regex/\.(gz|Z)$ View=%view{ascii} gzip -dc %f 2>/dev/null # bzip2 type/^bzip2 Open=bzip2 -dc %f | %var{PAGER:more} View=%view{ascii} bzip2 -dc %f 2>/dev/null regex/\.bz2?$ View=%view{ascii} bzip2 -dc %f 2>/dev/null # bzip type/^bzip Open=bzip -dc %f | %var{PAGER:more} View=%view{ascii} bzip -dc %f 2>/dev/null # compress type/^compress Open=gzip -dc %f | %var{PAGER:more} View=%view{ascii} gzip -dc %f 2>/dev/null # lzma regex/\.lzma$ Open=lzma -dc %f | %var{PAGER:more} View=%view{ascii} lzma -dc %f 2>/dev/null # xz regex/\.xz$ Open=xz -dc %f | %var{PAGER:more} View=%view{ascii} xz -dc %f 2>/dev/null ### Default ### # Default target for anything not described above default/* Open= View= ### EOF ### ================================================ FILE: packages/sx05re/tools/sysutils/MC/etc/mc.keymap ================================================ [main] Help = f1 UserMenu = f2 View = f3 ViewFile = Edit = f4 EditForceInternal = Copy = f5 Move = f6 MakeDir = f7 Delete = f8 Menu = f9 Quit = f10 MenuLastSelected = f19 QuitQuiet = f20 Find = alt-question CdQuick = alt-c HotList = ctrl-backslash Reread = ctrl-r DirSize = ctrl-space Suspend = ctrl-z Swap = ctrl-u History = alt-h PanelListing = PanelListingSwitch = alt-t PanelListingChange = ShowHidden = alt-dot SplitVertHoriz = alt-comma Shell = ctrl-o PutCurrentPath = alt-a PutOtherPath = alt-shift-a ViewFiltered = alt-exclamation Select = kpplus Unselect = kpminus SelectInvert = kpasterisk ScreenList = alt-prime OptionsLayout = OptionsPanel = OptionsConfirm = OptionsDisplayBits = OptionsVfs = LearnKeys = SaveSetup = EditExtensionsFile = EditFileHighlightFile = Filter = ConnectFish = ConnectFtp = ConnectSmb = Undelete = ExtendedKeyMap = ctrl-x [main:xmap] ChangeMode = c ChangeOwn = o CompareDirs = d CompareFiles = ctrl-d HotListAdd = h LinkSymbolicEdit = ctrl-s Link = l LinkSymbolic = s LinkSymbolicRelative = v PanelInfo = i PanelQuickView = q ExternalPanelize = exclamation VfsList = a Jobs = j PutCurrentPath = p PutOtherPath = ctrl-p PutCurrentTagged = t PutOtherTagged = ctrl-t PutCurrentLink = r PutOtherLink = ctrl-r [panel] Search = ctrl-s; alt-s Mark = insert; ctrl-t MarkUp = shift-up MarkDown = shift-down MarkLeft = MarkRight = Down = down; ctrl-n Up = up; ctrl-p Left = left Right = right PageUp = pgup; alt-v PageDown = pgdn; ctrl-v Enter = enter PanelOtherCd = alt-o PanelOtherCdLink = alt-l ViewRaw = f13 EditNew = f14 CopySingle = f15 MoveSingle = f16 DeleteSingle = f18 Select = alt-plus Unselect = alt-minus SelectInvert = alt-asterisk CdChild = ctrl-pgdn CdParent = ctrl-pgup CdParentSmart = History = alt-shift-h HistoryNext = alt-u HistoryPrev = alt-y BottomOnScreen = alt-j MiddleOnScreen = alt-r TopOnScreen = alt-g PanelOtherSync = alt-i SelectCodepage = alt-e Top = alt-lt; home; a1 Bottom = alt-gt; end; c1 Sort = SortPrev = SortNext = SortReverse = SortByName = SortByExt = SortBySize = SortByMTime = [dialog] Ok = enter Cancel = f10; esc; ctrl-g Up = left; up #Left = left; up Down = right; down #Right = right; down Help = f1 Suspend = ctrl-z Refresh = ctrl-l ScreenList = alt-prime ScreenNext = alt-rbrace ScreenPrev = alt-lbrace [input] Home = ctrl-a; alt-lt; home; a1 End = ctrl-e; alt-gt; end; c1 Left = left; alt-left; ctrl-b Right = right; alt-right; ctrl-f WordLeft = ctrl-left; alt-b WordRight = ctrl-right; alt-f Backspace = backspace; ctrl-h Delete = delete; ctrl-d DeleteToWordBegin = alt-backspace DeleteToWordEnd = alt-d Mark = Remove = ctrl-w Cut = Store = alt-w Paste = Yank = ctrl-y DeleteToEnd = ctrl-k HistoryPrev = alt-p; ctrl-down HistoryNext = alt-n; ctrl-up History = alt-h Complete = alt-tab Clear = MarkLeft = shift-left MarkRight = shift-right MarkToWordBegin = ctrl-shift-left MarkToWordEnd = ctrl-shift-right MarkToHome = shift-home MarkToEnd = shift-end [listbox] Up = up; ctrl-p Down = down; ctrl-n Top = home; alt-lt; a1 Bottom = end; alt-gt; c1 PageUp = pgup; alt-v PageDown = pgdn; ctrl-v Delete = delete; d Clear = shift-delete; shift-d [tree] Help = f1 Reread = f2; ctrl-r Forget = f3 ToggleNavigation = f4 Copy = f5 Move = f6 Up = up; ctrl-p Down = down; ctrl-n Left = left Right = right Top = home; alt-lt; a1 Bottom = end; alt-gt; c1 PageUp = pgup; alt-v PageDown = pgdn; ctrl-v Enter = enter Search = ctrl-s; alt-s Delete = f8; delete [help] Help = f1 Index = f2; c Back = f3; left; l Quit = f10; esc Up = up; ctrl-p Down = down; ctrl-n PageDown = f; space; pgdn; ctrl-v PageUp = b; pgup; alt-v; backspace HalfPageDown = d HalfPageUp = u Top = home; ctrl-home; ctrl-pgup; a1; alt-lt; g Bottom = end; ctrl-end; ctrl-pgdn; c1; alt-gt; shift-g Enter = right; enter LinkNext = tab LinkPrev = alt-tab NodeNext = n NodePrev = p [editor] Store = ctrl-insert Paste = shift-insert Cut = shift-delete Up = up Down = down Left = left Right = right WordLeft = ctrl-left; ctrl-z WordRight = ctrl-right; ctrl-x Enter = enter Return = shift-enter BackSpace = backspace; ctrl-h Delete = delete; ctrl-d PageUp = pgup PageDown = pgdn Home = home End = end Tab = tab Undo = ctrl-u Redo = alt-r Top = ctrl-home; alt-lt Bottom = ctrl-end; alt-gt ScrollUp = ctrl-up ScrollDown = ctrl-down TopOnScreen = ctrl-pgup BottomOnScreen = ctrl-pgdn DeleteToWordBegin = alt-backspace DeleteToWordEnd = alt-d DeleteLine = ctrl-y DeleteToEnd = ctrl-k DeleteToHome = ParagraphUp = ParagraphDown = Save = f2 EditFile = EditNew = ctrl-n SaveAs = f12; ctrl-f2 Mark = f3 Copy = f5 Move = f6 Remove = f8 MarkLine = MarkWord = MarkAll = Unmark = Search = f7 SearchContinue = f17 BlockShiftLeft = BlockShiftRight = MarkPageUp = shift-pgup MarkPageDown = shift-pgdn MarkLeft = shift-left MarkRight = shift-right MarkToWordBegin = ctrl-shift-left MarkToWordEnd = ctrl-shift-right MarkUp = shift-up MarkDown = shift-down MarkToHome = shift-home MarkToEnd = shift-end MarkToFileBegin = ctrl-shift-home MarkToFileEnd = ctrl-shift-end MarkToPageBegin = ctrl-shift-pgup MarkToPageEnd = ctrl-shift-pgdn MarkScrollUp = ctrl-shift-up MarkScrollDown = ctrl-shift-down MarkParagraphUp = MarkParagraphDown = MarkColumnPageUp = alt-pgup MarkColumnPageDown = alt-pgdn MarkColumnLeft = alt-left MarkColumnRight = alt-right MarkColumnUp = alt-up MarkColumnDown = alt-down MarkColumnScrollUp = MarkColumnScrollDown = MarkColumnParagraphUp = MarkColumnParagraphDown = BlockSave = ctrl-f MarkColumn = f13 Replace = f4 ReplaceContinue = f14 Complete = alt-tab InsertFile = f15 Quit = f10 InsertOverwrite = insert Help = f1 Date = Refresh = ctrl-l Goto = alt-l Sort = alt-t Mail = alt-m ParagraphFormat = alt-p MatchBracket = alt-b ExternalCommand = alt-u UserMenu = f11 Menu = f9 Bookmark = alt-k BookmarkFlush = alt-o BookmarkNext = alt-j BookmarkPrev = alt-i History = Shell = ctrl-o InsertLiteral = ctrl-q MacroStartRecord = MacroStopRecord = MacroStartStopRecord = ctrl-r MacroDelete = ShowNumbers = alt-n ShowTabTws = alt-underline SyntaxOnOff = ctrl-s SyntaxChoose = ShowMargin = Find = alt-enter FilePrev = alt-minus FileNext = alt-plus RepeatStartStopRecord = SelectCodepage = alt-e Options = OptionsSaveMode = LearnKeys = ExtendedKeyMap = [viewer] Help = f1 WrapMode = f2 Quit = f3; f10; q; esc HexMode = f4 Goto = f5 Search = f7; question; slash SearchContinue = ctrl-r; ctrl-s; f17; n MagicMode = f8 NroffMode = f9 Home = ctrl-a End = ctrl-e Left = h; left Right = l; right LeftQuick = ctrl-left RightQuick = ctrl-right Up = k; y; insert; up; ctrl-p Down = j; e; delete; down; enter; ctrl-n PageDown = f; space; pgdn; ctrl-v PageUp = b; pgup; alt-v; backspace HalfPageDown = d HalfPageUp = u Top = home; ctrl-home; ctrl-pgup; a1; alt-lt; g Bottom = end; ctrl-end; ctrl-pgdn; c1; alt-gt; shift-g BookmarkGoto = m Bookmark = r FileNext = ctrl-f FilePrev = ctrl-b SelectCodepage = alt-e Shell = ctrl-o Ruler = alt-r [viewer:hex] Help = f1 HexEditMode = f2 Quit = f3; f10; q; esc HexMode = f4 Goto = f5 Save = f6 Search = f7; question; slash SearchContinue = ctrl-r; ctrl-s; f17; n MagicMode = f8 NroffMode = f9 ToggleNavigation = tab Home = ctrl-a; home End = ctrl-e; end Left = b; left Right = f; right Up = k; y; up Down = j; delete; down PageDown = pgdn; ctrl-v PageUp = pgup; alt-v Top = ctrl-home; ctrl-pgup; a1; alt-lt; g Bottom = ctrl-end; ctrl-pgdn; c1; alt-gt; shift-g [diffviewer] ShowSymbols = alt-s; s ShowNumbers = alt-n; l SplitFull = f SplitEqual = equal SplitMore = gt SplitLess = lt Tab2 = 2 Tab3 = 3 Tab4 = 4 Tab8 = 8 Swap = ctrl-u Redo = ctrl-r HunkNext = n; enter; space HunkPrev = p; backspace Goto = g; shift-g Save = f2 Edit = f4 EditOther = f14 Merge = f5 Search = f7 SearchContinue = f17 Options = f9 Top = ctrl-home Bottom = ctrl-end Down = down Up = up LeftQuick = ctrl-left RightQuick = ctrl-right Left = left Right = right PageDown = pgdn PageUp = pgup Home = home End = end Help = f1 Quit = f10; q; shift-q; esc Shell = ctrl-o SelectCodepage = alt-e ================================================ FILE: packages/sx05re/tools/sysutils/MC/etc/mc.keymap.default ================================================ [main] Help = f1 UserMenu = f2 View = f3 ViewFile = Edit = f4 EditForceInternal = Copy = f5 Move = f6 MakeDir = f7 Delete = f8 Menu = f9 Quit = f10 MenuLastSelected = f19 QuitQuiet = f20 Find = alt-question CdQuick = alt-c HotList = ctrl-backslash Reread = ctrl-r DirSize = ctrl-space Suspend = ctrl-z Swap = ctrl-u History = alt-h PanelListing = PanelListingSwitch = alt-t PanelListingChange = ShowHidden = alt-dot SplitVertHoriz = alt-comma Shell = ctrl-o PutCurrentPath = alt-a PutOtherPath = alt-shift-a ViewFiltered = alt-exclamation Select = kpplus Unselect = kpminus SelectInvert = kpasterisk ScreenList = alt-prime OptionsLayout = OptionsPanel = OptionsConfirm = OptionsDisplayBits = OptionsVfs = LearnKeys = SaveSetup = EditExtensionsFile = EditFileHighlightFile = Filter = ConnectFish = ConnectFtp = ConnectSmb = Undelete = ExtendedKeyMap = ctrl-x [main:xmap] ChangeMode = c ChangeOwn = o CompareDirs = d CompareFiles = ctrl-d HotListAdd = h LinkSymbolicEdit = ctrl-s Link = l LinkSymbolic = s LinkSymbolicRelative = v PanelInfo = i PanelQuickView = q ExternalPanelize = exclamation VfsList = a Jobs = j PutCurrentPath = p PutOtherPath = ctrl-p PutCurrentTagged = t PutOtherTagged = ctrl-t PutCurrentLink = r PutOtherLink = ctrl-r [panel] Search = ctrl-s; alt-s Mark = insert; ctrl-t MarkUp = shift-up MarkDown = shift-down MarkLeft = MarkRight = Down = down; ctrl-n Up = up; ctrl-p Left = left Right = right PageUp = pgup; alt-v PageDown = pgdn; ctrl-v Enter = enter PanelOtherCd = alt-o PanelOtherCdLink = alt-l ViewRaw = f13 EditNew = f14 CopySingle = f15 MoveSingle = f16 DeleteSingle = f18 Select = alt-plus Unselect = alt-minus SelectInvert = alt-asterisk CdChild = ctrl-pgdn CdParent = ctrl-pgup CdParentSmart = History = alt-shift-h HistoryNext = alt-u HistoryPrev = alt-y BottomOnScreen = alt-j MiddleOnScreen = alt-r TopOnScreen = alt-g PanelOtherSync = alt-i SelectCodepage = alt-e Top = alt-lt; home; a1 Bottom = alt-gt; end; c1 Sort = SortPrev = SortNext = SortReverse = SortByName = SortByExt = SortBySize = SortByMTime = [dialog] Ok = enter Cancel = f10; esc; ctrl-g Up = left; up #Left = left; up Down = right; down #Right = right; down Help = f1 Suspend = ctrl-z Refresh = ctrl-l ScreenList = alt-prime ScreenNext = alt-rbrace ScreenPrev = alt-lbrace [input] Home = ctrl-a; alt-lt; home; a1 End = ctrl-e; alt-gt; end; c1 Left = left; alt-left; ctrl-b Right = right; alt-right; ctrl-f WordLeft = ctrl-left; alt-b WordRight = ctrl-right; alt-f Backspace = backspace; ctrl-h Delete = delete; ctrl-d DeleteToWordBegin = alt-backspace DeleteToWordEnd = alt-d Mark = Remove = ctrl-w Cut = Store = alt-w Paste = Yank = ctrl-y DeleteToEnd = ctrl-k HistoryPrev = alt-p; ctrl-down HistoryNext = alt-n; ctrl-up History = alt-h Complete = alt-tab Clear = MarkLeft = shift-left MarkRight = shift-right MarkToWordBegin = ctrl-shift-left MarkToWordEnd = ctrl-shift-right MarkToHome = shift-home MarkToEnd = shift-end [listbox] Up = up; ctrl-p Down = down; ctrl-n Top = home; alt-lt; a1 Bottom = end; alt-gt; c1 PageUp = pgup; alt-v PageDown = pgdn; ctrl-v Delete = delete; d Clear = shift-delete; shift-d [tree] Help = f1 Reread = f2; ctrl-r Forget = f3 ToggleNavigation = f4 Copy = f5 Move = f6 Up = up; ctrl-p Down = down; ctrl-n Left = left Right = right Top = home; alt-lt; a1 Bottom = end; alt-gt; c1 PageUp = pgup; alt-v PageDown = pgdn; ctrl-v Enter = enter Search = ctrl-s; alt-s Delete = f8; delete [help] Help = f1 Index = f2; c Back = f3; left; l Quit = f10; esc Up = up; ctrl-p Down = down; ctrl-n PageDown = f; space; pgdn; ctrl-v PageUp = b; pgup; alt-v; backspace HalfPageDown = d HalfPageUp = u Top = home; ctrl-home; ctrl-pgup; a1; alt-lt; g Bottom = end; ctrl-end; ctrl-pgdn; c1; alt-gt; shift-g Enter = right; enter LinkNext = tab LinkPrev = alt-tab NodeNext = n NodePrev = p [editor] Store = ctrl-insert Paste = shift-insert Cut = shift-delete Up = up Down = down Left = left Right = right WordLeft = ctrl-left; ctrl-z WordRight = ctrl-right; ctrl-x Enter = enter Return = shift-enter BackSpace = backspace; ctrl-h Delete = delete; ctrl-d PageUp = pgup PageDown = pgdn Home = home End = end Tab = tab Undo = ctrl-u Redo = alt-r Top = ctrl-home; alt-lt Bottom = ctrl-end; alt-gt ScrollUp = ctrl-up ScrollDown = ctrl-down TopOnScreen = ctrl-pgup BottomOnScreen = ctrl-pgdn DeleteToWordBegin = alt-backspace DeleteToWordEnd = alt-d DeleteLine = ctrl-y DeleteToEnd = ctrl-k DeleteToHome = ParagraphUp = ParagraphDown = Save = f2 EditFile = EditNew = ctrl-n SaveAs = f12; ctrl-f2 Mark = f3 Copy = f5 Move = f6 Remove = f8 MarkLine = MarkWord = MarkAll = Unmark = Search = f7 SearchContinue = f17 BlockShiftLeft = BlockShiftRight = MarkPageUp = shift-pgup MarkPageDown = shift-pgdn MarkLeft = shift-left MarkRight = shift-right MarkToWordBegin = ctrl-shift-left MarkToWordEnd = ctrl-shift-right MarkUp = shift-up MarkDown = shift-down MarkToHome = shift-home MarkToEnd = shift-end MarkToFileBegin = ctrl-shift-home MarkToFileEnd = ctrl-shift-end MarkToPageBegin = ctrl-shift-pgup MarkToPageEnd = ctrl-shift-pgdn MarkScrollUp = ctrl-shift-up MarkScrollDown = ctrl-shift-down MarkParagraphUp = MarkParagraphDown = MarkColumnPageUp = alt-pgup MarkColumnPageDown = alt-pgdn MarkColumnLeft = alt-left MarkColumnRight = alt-right MarkColumnUp = alt-up MarkColumnDown = alt-down MarkColumnScrollUp = MarkColumnScrollDown = MarkColumnParagraphUp = MarkColumnParagraphDown = BlockSave = ctrl-f MarkColumn = f13 Replace = f4 ReplaceContinue = f14 Complete = alt-tab InsertFile = f15 Quit = f10 InsertOverwrite = insert Help = f1 Date = Refresh = ctrl-l Goto = alt-l Sort = alt-t Mail = alt-m ParagraphFormat = alt-p MatchBracket = alt-b ExternalCommand = alt-u UserMenu = f11 Menu = f9 Bookmark = alt-k BookmarkFlush = alt-o BookmarkNext = alt-j BookmarkPrev = alt-i History = Shell = ctrl-o InsertLiteral = ctrl-q MacroStartRecord = MacroStopRecord = MacroStartStopRecord = ctrl-r MacroDelete = ShowNumbers = alt-n ShowTabTws = alt-underline SyntaxOnOff = ctrl-s SyntaxChoose = ShowMargin = Find = alt-enter FilePrev = alt-minus FileNext = alt-plus RepeatStartStopRecord = SelectCodepage = alt-e Options = OptionsSaveMode = LearnKeys = ExtendedKeyMap = [viewer] Help = f1 WrapMode = f2 Quit = f3; f10; q; esc HexMode = f4 Goto = f5 Search = f7; question; slash SearchContinue = ctrl-r; ctrl-s; f17; n MagicMode = f8 NroffMode = f9 Home = ctrl-a End = ctrl-e Left = h; left Right = l; right LeftQuick = ctrl-left RightQuick = ctrl-right Up = k; y; insert; up; ctrl-p Down = j; e; delete; down; enter; ctrl-n PageDown = f; space; pgdn; ctrl-v PageUp = b; pgup; alt-v; backspace HalfPageDown = d HalfPageUp = u Top = home; ctrl-home; ctrl-pgup; a1; alt-lt; g Bottom = end; ctrl-end; ctrl-pgdn; c1; alt-gt; shift-g BookmarkGoto = m Bookmark = r FileNext = ctrl-f FilePrev = ctrl-b SelectCodepage = alt-e Shell = ctrl-o Ruler = alt-r [viewer:hex] Help = f1 HexEditMode = f2 Quit = f3; f10; q; esc HexMode = f4 Goto = f5 Save = f6 Search = f7; question; slash SearchContinue = ctrl-r; ctrl-s; f17; n MagicMode = f8 NroffMode = f9 ToggleNavigation = tab Home = ctrl-a; home End = ctrl-e; end Left = b; left Right = f; right Up = k; y; up Down = j; delete; down PageDown = pgdn; ctrl-v PageUp = pgup; alt-v Top = ctrl-home; ctrl-pgup; a1; alt-lt; g Bottom = ctrl-end; ctrl-pgdn; c1; alt-gt; shift-g [diffviewer] ShowSymbols = alt-s; s ShowNumbers = alt-n; l SplitFull = f SplitEqual = equal SplitMore = gt SplitLess = lt Tab2 = 2 Tab3 = 3 Tab4 = 4 Tab8 = 8 Swap = ctrl-u Redo = ctrl-r HunkNext = n; enter; space HunkPrev = p; backspace Goto = g; shift-g Save = f2 Edit = f4 EditOther = f14 Merge = f5 Search = f7 SearchContinue = f17 Options = f9 Top = ctrl-home Bottom = ctrl-end Down = down Up = up LeftQuick = ctrl-left RightQuick = ctrl-right Left = left Right = right PageDown = pgdn PageUp = pgup Home = home End = end Help = f1 Quit = f10; q; shift-q; esc Shell = ctrl-o SelectCodepage = alt-e ================================================ FILE: packages/sx05re/tools/sysutils/MC/etc/mc.keymap.emacs ================================================ [main] Help = f1 UserMenu = f2 View = f3 ViewFile = Edit = f4 EditForceInternal = Copy = f5 Move = f6 MakeDir = f7 Delete = f8 Menu = f9 Quit = f10 MenuLastSelected = f19 QuitQuiet = f20 Find = alt-question CdQuick = alt-c HotList = ctrl-backslash Reread = ctrl-r DirSize = ctrl-space Suspend = ctrl-z Swap = ctrl-u History = alt-h PanelListing = PanelListingSwitch = alt-t PanelListingChange = ShowHidden = alt-dot SplitVertHoriz = alt-comma Shell = ctrl-o PutCurrentPath = alt-a PutOtherPath = alt-shift-a ViewFiltered = alt-exclamation Select = kpplus Unselect = kpminus SelectInvert = kpasterisk ScreenList = alt-prime Options = OptionsLayout = OptionsPanel = OptionsConfirm = OptionsDisplayBits = OptionsVfs = LearnKeys = SaveSetup = EditExtensionsFile = EditFileHighlightFile = Filter = ConnectFish = ConnectFtp = ConnectSmb = Undelete = ExtendedKeyMap = ctrl-x [main:xmap] ChangeMode = c ChangeOwn = o CompareDirs = d CompareFiles = ctrl-d HotListAdd = h LinkSymbolicEdit = ctrl-s Link = l LinkSymbolic = s LinkSymbolicRelative PanelInfo = i PanelQuickView = q ExternalPanelize = exclamation VfsList = a Jobs = j PutCurrentPath = p PutOtherPath = ctrl-p PutCurrentTagged = t PutOtherTagged = ctrl-t PutCurrentLink = r PutOtherLink = ctrl-r [panel] Search = ctrl-s; alt-s Mark = insert; ctrl-t MarkUp = shift-up MarkDown = shift-down MarkLeft = MarkRight = Down = down; ctrl-n Up = up; ctrl-p Left = left Right = right PageUp = pgup; alt-v PageDown = pgdn; ctrl-v Enter = enter PanelOtherCd = alt-o PanelOtherCdLink = alt-l ViewRaw = f13 EditNew = f14 CopySingle = f15 MoveSingle = f16 DeleteSingle = f18 Select = alt-plus Unselect = alt-minus SelectInvert = alt-asterisk CdChild = ctrl-pgdn CdParent = ctrl-pgup CdParentSmart = History = alt-shift-h HistoryNext = alt-u HistoryPrev = alt-y BottomOnScreen = alt-j MiddleOnScreen = alt-r TopOnScreen = alt-g PanelOtherSync = alt-i SelectCodepage = alt-e Top = alt-lt; home; a1 Bottom = alt-gt; end; c1 Sort = SortPrev = SortNext = SortReverse = SortByName = SortByExt = SortBySize = SortByMTime = [dialog] Ok = enter Cancel = f10; esc Up = left; up #Left = left; up Down = right; down #Right = right; down Help = f1 Suspend = ctrl-z Refresh = ctrl-l ScreenList = alt-prime ScreenNext = alt-rbrace ScreenPrev = alt-lbrace [input] Home = ctrl-a; alt-lt; home; a1 End = ctrl-e; alt-gt; end; c1 Left = left; alt-left; ctrl-b Right = right; alt-right; ctrl-f WordLeft = ctrl-left; alt-b WordRight = ctrl-right; alt-f Backspace = backspace Delete = delete DeleteToWordBegin = alt-backspace DeleteToWordEnd = alt-d Mark = Remove = ctrl-w Cut = Store = alt-w Paste = Yank = ctrl-y DeleteToEnd = ctrl-k HistoryPrev = alt-p; ctrl-down HistoryNext = alt-n; ctrl-up History = alt-h Complete = alt-tab Clear = MarkLeft = MarkRight = MarkToWordBegin = MarkToWordEnd = MarkToHome = MarkToEnd = [listbox] Up = up; ctrl-p Down = down; ctrl-n Top = home; alt-lt; a1 Bottom = end; alt-gt; c1 PageUp = pgup; alt-v PageDown = pgdn; ctrl-v Delete = delete; d Clear = shift-delete; shift-d [tree] Help = f1 Reread = f2; ctrl-r Forget = f3 ToggleNavigation = f4 Copy = f5 Move = f6 Up = up; ctrl-p Down = down; ctrl-n Left = left Right = right Top = home; alt-lt; a1 Bottom = end; alt-gt; c1 PageUp = pgup; alt-v PageDown = pgdn; ctrl-v Enter = enter Search = ctrl-s; alt-s Delete = f8; delete [help] Help = f1 Index = f2; c Back = f3; left; l Quit = f10; esc; ctrl-g Up = up; ctrl-p Down = down; ctrl-n PageDown = f; space; pgdn; ctrl-v PageUp = b; pgup; alt-v; backspace HalfPageDown = d HalfPageUp = u Top = home; ctrl-home; ctrl-pgup; a1; alt-lt; g Bottom = end; ctrl-end; ctrl-pgdn; c1; alt-gt; shift-g Enter = right; enter LinkNext = tab LinkPrev = alt-tab NodeNext = n NodePrev = p [editor] Store = alt-w Paste = ctrl-y Cut = ctrl-w Up = up; ctrl-p Down = down; ctrl-n Left = left; ctrl-b Right = right; ctrl-f WordLeft = ctrl-left; alt-b WordRight = ctrl-right; alt-f Enter = enter Return = shift-enter BackSpace = backspace Delete = delete PageUp = pgup; alt-v PageDown = pgdn; ctrl-v Home = home; ctrl-a End = end; ctrl-e Tab = tab Undo = ctrl-u Redo = Top = ctrl-home; alt-lt Bottom = ctrl-end; alt-gt ScrollUp = ctrl-up ScrollDown = ctrl-down TopOnScreen = ctrl-pgup BottomOnScreen = ctrl-pgdn DeleteToWordBegin = alt-backspace DeleteToWordEnd = alt-d DeleteLine = ctrl-y DeleteToEnd = ctrl-k DeleteToHome = ParagraphUp = ParagraphDown = Save = f2 EditFile = SaveAs = f12; ctrl-f2 Mark = f3; ctrl-at Copy = f5 Move = f6 Remove = f8 MarkLine = MarkWord = MarkAll = Unmark = Search = f7; ctrl-s SearchContinue = f17 BlockShiftLeft = BlockShiftRight = MarkPageUp = shift-pgup MarkPageDown = shift-pgdn MarkLeft = shift-left MarkRight = shift-right MarkToWordBegin = ctrl-shift-left MarkToWordEnd = ctrl-shift-right MarkUp = shift-up MarkDown = shift-down MarkToHome = shift-home MarkToEnd = shift-end MarkToFileBegin = ctrl-shift-home MarkToFileEnd = ctrl-shift-end MarkToPageBegin = ctrl-shift-pgup MarkToPageEnd = ctrl-shift-pgdn MarkScrollUp = ctrl-shift-up MarkScrollDown = ctrl-shift-down MarkParagraphUp = MarkParagraphDown = MarkColumnPageUp = alt-pgup MarkColumnPageDown = alt-pgdn MarkColumnLeft = alt-left MarkColumnRight = alt-right MarkColumnUp = alt-up MarkColumnDown = alt-down MarkColumnScrollUp = MarkColumnScrollDown = MarkColumnParagraphUp = MarkColumnParagraphDown = BlockSave = MarkColumn = f13 Replace = f4 ReplaceContinue = f14 Complete = alt-tab InsertFile = f15 Quit = f10 InsertOverwrite = insert Help = f1 Date = Refresh = ctrl-l Goto = alt-l Sort = alt-t Mail = ParagraphFormat = alt-p MatchBracket = ExternalCommand = alt-u UserMenu = f11 Menu = f9 Bookmark = BookmarkFlush = BookmarkNext = BookmarkPrev = History = Shell = ctrl-o InsertLiteral = ctrl-q MacroStartRecord = MacroStopRecord = MacroStartStopRecord = ctrl-r MacroDelete = ShowNumbers = alt-n ShowTabTws = alt-underline SyntaxOnOff = ctrl-s SyntaxChoose = ShowMargin = Find = alt-enter FilePrev = alt-minus FileNext = alt-plus RepeatStartStopRecord = SelectCodepage = alt-e Options = OptionsSaveMode = LearnKeys = ExtendedKeyMap = ctrl-x [editor:xmap] EditNew = k [viewer] Help = f1 WrapMode = f2 Quit = f3; f10; q; esc HexMode = f4 Goto = f5 Search = f7; question; slash MagicMode = f8 NroffMode = f9 SearchContinue = ctrl-r; ctrl-s; f17; n Home = ctrl-a End = ctrl-e Left = h; left Right = l; right LeftQuick= ctrl-left RightQuick = ctrl-right Up = k; y; insert; up; ctrl-p Down = j; e; delete; down; enter; ctrl-n PageDown = f; space; pgdn; ctrl-v PageUp = b; pgup; alt-v; backspace HalfPageDown = d HalfPageUp = u Top = home; ctrl-home; ctrl-pgup; a1; alt-lt; g Bottom = end; ctrl-end; ctrl-pgdn; c1; alt-gt; shift-g BookmarkGoto = m Bookmark = r FileNext = ctrl-f FilePrev = ctrl-b SelectCodepage = alt-e Shell = ctrl-o Ruler = alt-r [viewer:hex] Help = f1 HexEditMode = f2 Quit = f3; f10; q; esc HexMode = f4 Goto = f5 Save = f6 Search = f7; question; slash SearchContinue = ctrl-r; ctrl-s; f17; n MagicMode = f8 NroffMode = f9 ToggleNavigation = tab Home = ctrl-a; home End = ctrl-e; end Left = b; left Right = f; right Up = k; y; up Down = j; delete; down PageDown = pgdn; ctrl-v PageUp = pgup; alt-v Top = ctrl-home; ctrl-pgup; a1; alt-lt; g Bottom = ctrl-end; ctrl-pgdn; c1; alt-gt; shift-g [diffviewer] ShowSymbols = alt-s; s ShowNumbers = alt-n; l SplitFull = f SplitEqual = equal SplitMore = gt SplitLess = lt Tab2 = 2 Tab3 = 3 Tab4 = 4 Tab8 = 8 Swap = ctrl-u Redo = ctrl-r HunkNext = n; enter; space HunkPrev = p; backspace Goto = g; shift-g Save = f2 Edit = f4 EditOther = f14 Merge = f5 Search = f7 SearchContinue = f17 Options = f9 Top = ctrl-home Bottom = ctrl-end Down = down Up = up LeftQuick = ctrl-left RightQuick = ctrl-right Left = left Right = right PageDown = pgdn PageUp = pgup Home = home End = end Help = f1 Quit = f10; q; shift-q; esc Shell = ctrl-o SelectCodepage = alt-e ================================================ FILE: packages/sx05re/tools/sysutils/MC/etc/mc.menu ================================================ shell_patterns=0 + ! t t @ Do something on the current file CMD=%{Enter command} $CMD %f + t t @ Do something on the tagged files set %t; CMD=%{Enter command} while [ -n "$1" ]; do $CMD "$1" shift done 0 Edit a bug report and send it to root I=`mktemp "${MC_TMPDIR:-/tmp}/mail.XXXXXX"` || exit 1 ${EDITOR-vi} "$I" test -r $I && mail root < $I rm -f "$I" =+ f \.1$ | f \.3$ | f \.4$ | f \.5$ | f \.6$ | f \.7$ | f \.8$ | f \.man$ & t r 1 Display the file with roff -man nroff -man %f | less 2 Call the info hypertext browser info = t d 3 Compress the current subdirectory (tar.gz) Pwd=`basename %d /` echo -n "Name of the compressed file (without extension) [$Pwd]: " read tar if [ "$tar"x = x ]; then tar="$Pwd"; fi cd .. && \ tar cf - "$Pwd" | gzip -f9 > "$tar.tar.gz" && \ echo "../$tar.tar.gz created." 4 Compress the current subdirectory (tar.bz2) Pwd=`basename %d /` echo -n "Name of the compressed file (without extension) [$Pwd]: " read tar if [ "$tar"x = x ]; then tar="$Pwd"; fi cd .. && \ tar cf - "$Pwd" | bzip2 -f > "$tar.tar.bz2" && \ echo "../$tar.tar.bz2 created." 5 Compress the current subdirectory (tar.p7) Pwd=`basename %d /` echo -n "Name of the compressed file (without extension) [$Pwd]: " read tar if [ "$tar"x = x ]; then tar="$Pwd"; fi cd .. && \ tar cf - "$Pwd" | 7za a -si "$tar.tar.7z" && \ echo "../$tar.tar.7z created." 6 Compress the current subdirectory (tar.lzma) Pwd=`basename %d /` echo -n "Name of the compressed file (without extension) [$Pwd]: " read tar if [ "$tar"x = x ]; then tar="$Pwd"; fi cd .. && \ tar cf - "$Pwd" | lzma -f > "$tar.tar.lzma" && \ echo "../$tar.tar.lzma created." 7 Compress the current subdirectory (tar.lz) Pwd=`basename %d /` echo -n "Name of the compressed file (without extension) [$Pwd]: " read tar if [ "$tar"x = x ]; then tar="$Pwd"; fi cd .. && \ tar cf - "$Pwd" | lzip -f > "$tar.tar.lz" && \ echo "../$tar.tar.lz created." 8 Compress the current subdirectory (tar.xz) Pwd=`basename %d /` echo -n "Name of the compressed file (without extension) [$Pwd]: " read tar if [ "$tar"x = x ]; then tar="$Pwd"; fi cd .. && \ tar cf - "$Pwd" | xz -f > "$tar.tar.xz" && \ echo "../$tar.tar.xz created." = f \.c$ & t r + f \.c$ & t r & ! t t с Compile and link current .c file make `basename %f .c` 2>/dev/null || cc -O -o `basename %f .c` %f + t r & ! t t a Append file to opposite cat %f >> %D/%f + t t A Append files to opposite files set %t while [ -n "$1" ]; do cat "$1" >> "%D/$1" shift done + t r & ! t t d Delete file if a copy exists in the other directory. if [ "%d" = "%D" ]; then echo "The two directories must be different." exit 1 fi if [ -f %D/%f ]; then # if two of them, then if cmp -s %D/%f %f; then rm %f && echo "%f: DELETED." else echo "%f and %D/%f differ: NOT deleted." echo -n "Press RETURN " read key fi else echo "%f: No copy in %D/%f: NOT deleted." fi + t t D Delete tagged files if a copy exists in the other directory. if [ "%d" = "%D" ]; then echo "The two directores must be different." exit 1 fi for i in %t do if [ -f "%D/$i" ]; then SUM1="`sum $i`" SUM2="`sum %D/$i`" if [ "$SUM1" = "$SUM2" ]; then rm "$i" && echo "${i}: DELETED." else echo "$i and %D/$i differ: NOT deleted." fi else echo "%f has no copy in %D/%f: NOT deleted." fi done m View manual page MAN=%{Enter manual name} %view man -P cat $MAN = f \.gz$ & t r + ! t t n Inspect gzip'ed newsbatch file dd if=%f bs=1 skip=12|zcat|${PAGER-more} # assuming the cunbatch header is 12 bytes long. = t r & + ! t t h Strip headers from current newsarticle CHECK=`awk '{print $1 ; exit}' %f` 2>/dev/null case "$CHECK" in Newsgroups:|Path:) I=`mktemp "${MC_TMPDIR:-/tmp}/news.XXXXXX"` || exit 1 cp %f "$I" && sed '/^'"$CHECK"' /,/^$/d' "$I" > %f [ "$?" = "0" ] && rm "$I" echo "%f: header removed." ;; *) echo "%f is not a news article." ;; esac + t t H Strip headers from the marked newsarticles set %t while [ -n "$1" ]; do CHECK=`awk '{print $1 ; exit}' $1` 2>/dev/null WFILE=`mktemp "${MC_TMPDIR:-/tmp}/news.XXXXXX"` || exit 1 case "$CHECK" in Newsgroups:|Path:) cp "$1" "$WFILE" && sed '/^'"$CHECK"' /,/^$/d' "$WFILE" > "$1" if [ "$?" = "0" ]; then rm "$WFILE"; echo "$1 header removed. OK." else echo "Oops! Please check $1 against $WFILE." fi ;; *) echo "$1 skipped: Not a news article." ;; esac shift done = t r + ! t t r Copy file to remote host echo -n "To which host?: " read Host echo -n "To which directory on $Host?: " read Dir rcp -p %f "${Host}:$Dir" + t t R Copy files to remote host (no error checking) echo -n "Copy files to which host?: " read Host echo -n "To which directory on $Host? :" read Dir rcp -pr %u "${Host}:$Dir" = f \.tex$ & t r + f \.tex$ & t r & ! t t t Run latex on file and show it with xdvi latex %f && xdvi `basename %f .tex`.dvi =+ f ^part | f ^Part | f uue & t r + t t U Uudecode marked news articles (needs work) set %t ( while [ -n "$1" ]; do # strip headers FIRST=`awk '{print $1 ; exit}' "$1"` cat "$1" | sed '/^'"$FIRST"' /,/^$/d'; shift done ) |sed '/^$/d' |sed -n '/^begin 6/,/^end$/p' | uudecode if [ "$?" != "0" ]; then echo "Cannot decode %t." fi echo "Please test the output file before deleting anything." =+ f \.tar\.gz$ | f \.tar\.z$ | f \.tgz$ | f \.tpz$ | f \.tar\.lz$ | f \.tar\.lzma$ | f \.tar\.7z$ | f \.tar\.xz$ | f \.tar\.Z$ | f \.tar\.bz2$ & t r x Extract the contents of a compressed tar file unset PRG case %f in *.tar.bz2) PRG="bunzip2 -c" ;; *.tar.gz|*.tar.z|*.tgz|*.tpz|*.tar.Z) PRG="gzip -dc" ;; *.tar.lzma) PRG="lzma -dc" ;; *.tar.lz) PRG="lzip -dc" ;; *.tar.xz) PRG="xz -dc" ;; *.tar.7z) PRG="7za e -so" ;; *) exit 1 ;; esac $PRG %f | tar xvf - = t r + ! t t y Gzip or gunzip current file unset DECOMP case %f in *.gz) DECOMP=-d;; *.[zZ]) DECOMP=-d;; esac gzip $DECOMP -v %f + t t Y Gzip or gunzip tagged files for i in %t do unset DECOMP case "$i" in *.gz) DECOMP=-d;; *.[zZ]) DECOMP=-d;; esac gzip $DECOMP -v "$i" done + ! t t b Bzip2 or bunzip2 current file unset DECOMP case %f in *.bz2) DECOMP=-d;; esac bzip2 $DECOMP -v %f + t t B Bzip2 or bunzip2 tagged files for i in %t do unset DECOMP case "$i" in *.bz2) DECOMP=-d;; esac bzip2 $DECOMP -v "$i" done + f \.tar.gz$ | f \.tgz$ | f \.tpz$ | f \.tar.Z$ | f \.tar.z$ | f \.tar.bz2$ | f \.tar.F$ & t r & ! t t z Extract compressed tar file to subdirectory unset D set gzip -cd case %f in *.tar.gz) D="`basename %f .tar.gz`";; *.tgz) D="`basename %f .tgz`";; *.tpz) D="`basename %f .tpz`";; *.tar.Z) D="`basename %f .tar.Z`";; *.tar.z) D="`basename %f .tar.z`";; *.tar.bz2) D="`basename %f .tar.bz2`"; set bunzip2 -c ;; *.tar.F) D="`basename %f .tar.F`"; set freeze -dc; esac mkdir "$D"; cd "$D" && ("$1" "$2" ../%f | tar xvf -) + t t Z Extract compressed tar files to subdirectories for i in %t do set gzip -dc unset D case "$i" in *.tar.gz) D="`basename $i .tar.gz`";; *.tgz) D="`basename $i .tgz`";; *.tpz) D="`basename $i .tpz`";; *.tar.Z) D="`basename $i .tar.Z`";; *.tar.z) D="`basename $i .tar.z`";; *.tar.F) D="`basename $i .tar.F`"; set freeze -dc;; *.tar.bz2) D="`basename $i .tar.bz2`"; set bunzip2 -c;; esac mkdir "$D"; (cd "$D" && "$1" "$2" "../$i" | tar xvf -) done + f \.gz$ | f \.tgz$ | f \.tpz$ | f \.Z$ | f \.z$ | f \.bz2$ & t r & ! t t c Convert gz<->bz2, tar.gz<->tar.bz2 & tgz->tar.bz2 unset D unset EXT case %f in *.tgz) EXT=tgz;; *.tpz) EXT=tpz;; *.Z) EXT=Z;; *.z) EXT=z;; *.gz) EXT=gz;; *.bz2) EXT=bz2;; esac case $EXT in tgz|tpz) D="`basename %f .$EXT`.tar";; gz|Z|z) D="`basename %f .$EXT`";; bz2) D="`basename %f .bz2`";; esac if [ "$EXT" = "bz2" ]; then bunzip2 -v %f ; gzip -f9 -v "$D" else gunzip -v %f ; bzip2 -v "$D" fi + t t C Convert gz<->bz2, tar.gz<->tar.bz2 & tgz->tar.bz2 set %t while [ -n "$1" ] do unset D unset EXT case "$1" in *.tgz) EXT=tgz;; *.tpz) EXT=tpz;; *.Z) EXT=Z;; *.z) EXT=z;; *.gz) EXT=gz;; *.bz2) EXT=bz2;; esac case $EXT in tgz) D="`basename $1 .tgz`.tar";; tpz) D="`basename $1 .tpz`.tar";; gz|Z|z) D="`basename $1 .$EXT`";; bz2) D="`basename $1 .bz2`";; esac if [ "$EXT" = "bz2" ]; then bunzip2 -v "$1" gzip -f9 -v "$D" else gunzip -v "$1" bzip2 -v "$D" fi shift done + x /usr/bin/open | x /usr/local/bin/open & x /bin/sh o Open next a free console open -s -- sh ================================================ FILE: packages/sx05re/tools/sysutils/MC/etc/mc.menu.sr ================================================ shell_patterns=0 + ! t t @ Ради нешто над текућом датотеком CMD=%{Унесите наредбу} $CMD %f + t t @ Ради нешто над означеним датотекама set %t; CMD=%{Унесите наредбу} while [ -n "$1" ]; do $CMD "$1" shift done 0 Уреди пријаву грешке и пошаљи је администратору ${EDITOR-vi} /tmp/mail.$$ test -r /tmp/mail.$$ && mail root < /tmp/mail.$$ rm -f /tmp/mail.$$ =+ f \.1$ | f \.3$ | f \.4$ | f \.5$ | f \.6$ | f \.7$ | f \.8$ | f \.man$ & t r 1 Прикажи датотеку уз помоћ roff -man nroff -man %f | less 2 Позови читач хипертекста info info = t d 3 Компримуј текући поддиректоријум (tar.gz) Pwd=`basename "%d" /` echo -n "Назив компримоване датотеке (без врсте) [$Pwd]: " read tar if [ "$tar"x = x ]; then tar="$Pwd"; fi cd .. && \ tar cf - "$Pwd" | gzip -f9 > "$tar.tar.gz" && \ echo "Датотека ../$tar.tar.gz је створена." 4 Компримуј текући поддиректоријум (tar.bz2) Pwd=`basename %d /` echo -n "Назив компримоване датотеке (без врсте) [$Pwd]: " read tar if [ "$tar"x = x ]; then tar="$Pwd"; fi cd .. && \ tar cf - "$Pwd" | bzip2 -f > "$tar.tar.bz2" && \ echo "Датотека ../$tar.tar.bz2 је створена." = f \.c$ & t r + f \.c$ & t r & ! t t 5 Преведи и повежи текућу датотеку врсте `.c' make `basename %f .c` 2>/dev/null || cc -O -o `basename %f .c` %f + t r & ! t t a Надовежи датотеку на ону из другог окна cat %f >>%D/%f + t t A Надовежи датотеке на оне из другог окна set %t while [ -n "$1" ]; do cat "$1" >> "%D/$1" shift done + t r & ! t t d Обриши датотеку ако њена копија постоји у другом окну. if [ "%d" = "%D" ]; then echo "Два директоријума морају да буду различити." exit 1 fi if [ -f %D/%f ]; then # if two of them, then if cmp -s %D/%f %f; then rm %f && echo "%f: ОБРИСАНА." else echo "%f и %D/%f се разликују: НИЈЕ обрисана." echo -n "Притисните `RETURN' " read тастер fi else echo "%f: Нема копије у %D/%f: НИЈЕ обрисана." fi + t t D Обриши означене датотеке ако постоји копија у другом окну. if [ "%d" = "%D" ]; then echo "Два директоријума морају да буду различити." exit 1 fi for i in %t do if [ -f "%D/$i" ]; then SUM1="`sum $i`" SUM2="`sum %D/$i`" if [ "$SUM1" = "$SUM2" ]; then rm "$i" && echo "${i}: ОБРИСАНА." else echo "$i и %D/$i се разликују: НИЈЕ обрисана." fi else echo "%f нема копију у %D/%f: НИЈЕ обрисана." fi done m Погледај страницу упутства MAN=%{Унесите назив упутства} %view man -P cat $MAN = f \.gz$ & t r + ! t t n Прегледај датотеку вести компримовану програмом gzip dd if=%f bs=1 skip=12|zcat|${PAGER-more} # assuming the cunbatch header is 12 bytes long. = t r & + ! t t h Скини заглавља из текућег чланка вести CHECK=`awk '{print $1 ; exit}' %f` 2>/dev/null case "$CHECK" in Newsgroups:|Path:) cp %f /tmp/%f.$$ && sed '/^'"$CHECK"' /,/^$/d' /tmp/%f.$$ > %f [ "$?" = "0" ] && rm "/tmp/%f.$$" echo "%f: уклоњено заглавље." ;; *) echo "%f није чланак вести." ;; esac + t t H Скини заглавља из означених чланака вести set %t while [ -n "$1" ]; do CHECK=`awk '{print $1 ; exit}' "$1"` 2>/dev/null WFILE=/tmp/${1}.$$ case "$CHECK" in Newsgroups:|Path:) cp "$1" "$WFILE" && sed '/^'"$CHECK"' /,/^$/d' "$WFILE" > "$1" if [ "$?" = "0" ]; then rm "$WFILE"; echo "$1 заглавље уклоњено. У реду." else echo "Уупс! Молим да проверите $1 са $WFILE." fi ;; *) echo "$1 прескочена: Није чланак вести." ;; esac shift done = t r + ! t t r Копирај датотеку на удаљеног домаћина echo -n "На ког домаћина?: " read Домаћин echo -n "У који директоријум на $Домаћин?: " read Дир rcp -p %f "${Домаћин}:$Дир" + t t R Копирај датотеке на удаљеног домаћина (без провере грешака) echo -n "На ког домаћина да копирам датотеке?: " read Домаћин echo -n "У који директоријум на $Домаћин? :" read Дир rcp -pr %u "${Домаћин}:$Дир" = f \.tex$ & t r + f \.tex$ & t r & ! t t t Покрени ЛаТеХ над датотеком и прикажи је преко програма `xdvi' latex %f && xdvi `basename %f .tex`.dvi =+ f ^part | f ^Part | f uue & t r + t t U Уудекодирај означени чланак вести (требало би разрадити) set %t ( while [ -n "$1" ]; do # strip headers FIRST=`awk '{print $1 ; exit}' "$1"` cat "$1" | sed '/^'"$FIRST"' /,/^$/d'; shift done ) |sed '/^$/d' |sed -n '/^begin 6/,/^end$/p' | uudecode if [ "$?" != "0" ]; then echo "Не могу да декодирам %t." fi echo "Молим да проверите излазну датотеку пре било каквог брисања." =+ f \.tar\.gz$ | f \.tar\.z$ | f \.tgz$ | f \.tpz$ | f \.tar\.lz$ | f \.tar\.lzma$ | f \.tar\.7z$ | f \.tar\.xz$ | f \.tar\.Z$ | f \.tar\.bz2$ & t r x Издвој садржај компримоване датотеке врсте `tar' unset PRG case %f in *.tar.bz2) PRG="bunzip2 -c" ;; *.tar.gz|*.tar.z|*.tgz|*.tpz|*.tar.Z) PRG="gzip -dc" ;; *.tar.lzma) PRG="lzma -dc" ;; *.tar.lz) PRG="lzip -dc" ;; *.tar.xz) PRG="xz -dc" ;; *.tar.7z) PRG="7za e -so" ;; *) exit 1 ;; esac $PRG %f | tar xvf - = t r + ! t t y Пакуј или расп. тек. дат. програмима `gzip' или `gunzip' unset DECOMP case %f in *.gz) DECOMP=-d;; *.[zZ]) DECOMP=-d;; esac gzip $DECOMP -v %f + t t Y Пакуј или расп. означ. дат. програмима `gzip' или `gunzip' for i in %t do unset DECOMP case "$i" in *.gz) DECOMP=-d;; *.[zZ]) DECOMP=-d;; esac gzip $DECOMP -v "$i" done + ! t t b Пакуј или расп. тек. дат. програмима `bzip2' или `bunzip2' unset DECOMP case %f in *.bz2) DECOMP=-d;; esac bzip2 $DECOMP -v %f + t t B Пакуј или расп. означ. дат. програмима `bzip2' или `bunzip2' for i in %t do unset DECOMP case "$i" in *.bz2) DECOMP=-d;; esac bzip2 $DECOMP -v "$i" done + f \.tar.gz$ | f \.tgz$ | f \.tpz$ | f \.tar.Z$ | f \.tar.z$ | f \.tar.bz2$ | f \.tar.F$ & t r & ! t t z Издвој компримовану датотеку врсте `tar' у поддиректоријум unset D set gzip -cd case %f in *.tar.gz) D="`basename %f .tar.gz`";; *.tgz) D="`basename %f .tgz`";; *.tpz) D="`basename %f .tpz`";; *.tar.Z) D="`basename %f .tar.Z`";; *.tar.z) D="`basename %f .tar.z`";; *.tar.bz2) D="`basename %f .tar.bz2`"; set bunzip2 -c ;; *.tar.F) D="`basename %f .tar.F`"; set freeze -dc; esac mkdir "$D"; cd "$D" && ("$1" "$2" ../%f | tar xvf -) + t t Z Издвој компримовану датотеке врсте `tar' у поддиректоријуме for i in %t do set gzip -dc unset D case "$i" in *.tar.gz) D="`basename $i .tar.gz`";; *.tgz) D="`basename $i .tgz`";; *.tpz) D="`basename $i .tpz`";; *.tar.Z) D="`basename $i .tar.Z`";; *.tar.z) D="`basename $i .tar.z`";; *.tar.F) D="`basename $i .tar.F`"; set freeze -dc;; *.tar.bz2) D="`basename $i .tar.bz2`"; set bunzip2 -c;; esac mkdir "$D"; (cd "$D" && "$1" "$2" "../$i" | tar xvf -) done + f \.gz$ | f \.tgz$ | f \.tpz$ | f \.Z$ | f \.z$ | f \.bz2$ & t r & ! t t c Пребаци gz<->bz2, tar.gz<->tar.bz2 и tgz->tar.bz2 unset D case "%f" in *.tgz) EXT=tgz;; *.tpz) EXT=tpz;; *.Z) EXT=Z;; *.z) EXT=z;; *.gz) EXT=gz;; *.bz2) EXT=bz2;; esac case $EXT in tgz|tpz) D="`basename %f .$EXT`.tar";; gz|Z|z) D="`basename %f .$EXT`";; bz2) D="`basename %f .bz2`";; esac if [ "$EXT" = "bz2" ]; then bunzip2 -v "%f" ; gzip -f9 -v "$D" else gunzip -v "%f" ; bzip2 -v "$D" fi + t t C Пребаци gz<->bz2, tar.gz<->tar.bz2 и tgz->tar.bz2 set %t while [ -n "$1" ] do unset D case "$1" in *.tgz) EXT=tgz;; *.tpz) EXT=tpz;; *.Z) EXT=Z;; *.z) EXT=z;; *.gz) EXT=gz;; *.bz2) EXT=bz2;; esac case $EXT in tgz) D="`basename $1 .tgz`.tar";; tpz) D="`basename $1 .tpz`.tar";; gz|Z|z) D="`basename $1 .$EXT`";; bz2) D="`basename $1 .bz2`";; esac if [ "$EXT" = "bz2" ]; then bunzip2 -v "$1" gzip -f9 -v "$D" else gunzip -v "$1" bzip2 -v "$D" fi shift done + x /usr/bin/open | x /usr/local/bin/open & x /bin/sh o Отвори следећу слободну конзолу open -s -- sh ================================================ FILE: packages/sx05re/tools/sysutils/MC/etc/mcedit.menu ================================================ shell_patterns=0 # expression type # The macros are: # # %c The cursor column position number. For edit menu only. # %i The indent of blank space, equal the cursor column # position. For edit menu only. # %y The syntax type of current file. For edit menu only. # %b The block file name. # %f The current file name. # %n Only the current file name without extension. # %x The extension of current file name. # %d The current directory name. # %F The current file in the unselected panel. # %D The directory name of the unselected panel. # %t The currently tagged files. # %T The tagged files in the unselected panel. # %u and %U Similar to the %t and %T macros, but in # addition the files are untagged. You can use this macro # only once per menu file entry or extension file entry, # because next time there will be no tagged files. # %s and %S The selected files: The tagged files if # there are any. Otherwise the current file. # # %% The % character # # %{some text} Prompt for the substitution. An input box # is shown and the text inside the braces is used as a # prompt. The macro is substituted by the text typed by the # user. The user can press ESC or F10 to cancel. This macro # doesn't work on the command line yet. #----------------------- Begin [perl] language template ----------------------- + y Perl\ Program | f \.pl$ 1 Author description header unset LANG unset LANGUAGE LC_ALL= MY_UID="`id | sed 's/^.*uid=\([^(]*\).*$/\1/'`" AUTHOR="`awk -F: '$3 == '$MY_UID' {print $5}' /etc/passwd`" cat >>%b < # Created at: `date` # Computer: `uname -n` # System: `uname -sr` on `uname -m` # # Copyright (c) `date +%%Y` $AUTHOR All rights reserved. # #---------------------------------------------------------------------- # Configure section: #---------------------------------------------------------------------- # # main() EOF + y Perl\ Program | f \.pl$ 2 while () cat < %b %iwhile() { %i} EOF + y Perl\ Program | f \.pl$ 3 for () cat < %b %ifor ($i = ; $i < ; $i++) { %i} EOF + y Perl\ Program | f \.pl$ 4 foreach () cat < %b %iforeach ($ ) { %i} EOF + y Perl\ Program | f \.pl$ 5 if () cat < %b %iif () { %i} EOF + y Perl\ Program | f \.pl$ 6 if () else cat < %b %iif () { %i} else { %i} EOF + y Perl\ Program | f \.pl$ 7 if () elsif () cat < %b %iif () { %i} elsif () { %i} EOF + y Perl\ Program | f \.pl$ 8 substr () echo "%i$ = substr(\$str, \$off, \$cnt);" >%b + y Perl\ Program | f \.pl$ 9 opendir () cat < %b %iopendir(DIR, \$dir) || die("\$0: can't open \$dir\n"); EOF + y Perl\ Program | f \.pl$ a sub () NAME=%{ Enter name of subroutine: } cat < %b sub $NAME () { } # end of $NAME() EOF #----------------------- End [perl] language template ------------------------- #---------------------- Begin [shell] language template ----------------------- + y Shell\ Script | f \.sh$ 1 Author description header unset LANG unset LANGUAGE LC_ALL= MY_UID="`id | sed 's/^.*uid=\([^(]*\).*$/\1/'`" AUTHOR="`awk -F: '$3 == '$MY_UID' {print $5}' /etc/passwd`" cat >>%b < # Created at: `date` # Computer: `uname -n` # System: `uname -sr` on `uname -m` # # Copyright (c) `date +%%Y` $AUTHOR All rights reserved. # #---------------------------------------------------------------------- # Configure section: #---------------------------------------------------------------------- # # main() EOF + y Shell\ Script | f \.sh$ 3 for cat < %b %ifor i in \$ %ido %idone EOF + y Shell\ Script | f \.sh$ 4 while cat < %b %iwhile %ido %idone EOF + y Shell\ Script | f \.sh$ 5 if [] then else cat <> %b %iif [ ];then %ielse %ifi EOF + y Shell\ Script | f \.sh$ 6 case NUMBER=%{ Enter number elements of case:} cat < %b %icase "\$" in EOF while [ "$NUMBER" -gt 0 ] do cat <> %b %i) %i ;; EOF let NUMBER=$NUMBER-1 done cat <> %b %i*) %iesac EOF + y Shell\ Script | f \.sh$ 7 function NAME=%{ Enter name of function:} cat <> %b $NAME() { } # end of $NAME() EOF + y Shell\ Script | f \.sh$ 8 select of bash cat <> %b %iselect i in \$l %ido %i if [ -n "\$i" ];then %i break %i else %i continue %i fi %idone EOF #----------------------- End [shell] language template ------------------------ #------------------------- Begin [c] language template ------------------------ + f \.h$ | f \.c$ | f \.cc$ 1 Author description header unset LANG unset LANGUAGE LC_ALL= MY_UID="`id | sed 's/^.*uid=\([^(]*\).*$/\1/'`" AUTHOR="`awk -F: '$3 == '$MY_UID' {print $5}' /etc/passwd`" cat >> %b < * Created at: `date` * Computer: `uname -n` * System: `uname -sr` on `uname -m` * * Copyright (c) `date +%%Y` $AUTHOR All rights reserved. * ********************************************************************/ EOF + f \.h$ | f \.c$ | f \.cc$ 2 GPL description header cat >>%b <. */ EOF + f \.c$ | f \.cc$ 3 if () cat < %b %iif () { %i} EOF + f \.c$ | f \.cc$ 4 if () else cat < %b %iif () { %i} else { %i} EOF + f \.c$ | f \.cc$ 5 if () else if () cat < %b %iif ( ) { %i} else if ( ) { %i} EOF + f \.c$ | f \.cc$ 6 switch () NUMBER=%{ Enter number elements of switch:} echo "%iswitch () {" >%b while [ "$NUMBER" -gt 0 ] do echo "%icase '':" >>%b echo "%i break;" >>%b let NUMBER=$NUMBER-1 done echo "%i default:" >>%b echo "%i}" >>%b + f \.c$ | f \.cc$ 7 for () cat < %b %ifor (i = ; i < ; i++) { %i} EOF + f \.c$ | f \.cc$ 8 while () cat < %b %iwhile () { %i} EOF + f \.c$ | f \.cc$ 9 do {} while () cat < %b %ido { %i} while () EOF + f \.c$ | f \.cc$ a array cat < %b %ichar const x[] = { %i, , %i}; EOF + f \.c$ | f \.cc$ b enum cat < %b %ienum x { %i, , %i}; EOF + f \.c$ | f \.cc$ c struct cat < %b %istruct ? { %i; %i}; EOF + f \.c$ | f \.cc$ d union cat < %b %iunion ? { %i; %i}; EOF + f \.c$ | f \.cc$ e typedef struct cat < %b %itypedef struct { %i; %i} ?; EOF + f \.c$ | f \.cc$ f function NAME=%{ Enter name of function:} cat <> %b $NAME() { } /* end of $NAME() */ EOF + f \.c$ | f \.h$ | f \.cc$ g #include INC=%{ Enter include name: } if [ -r "$INC" ];then echo \#include \"$INC\" >%b else echo \#include \<$INC\> >%b fi + f \.c$ | f \.h$ | f \.cc$ d #define echo "#define " >%b + f \.c$ | f \.h$ | f \.cc$ d #ifdef cat < %b #ifdef #else #endif EOF + f \.c$ | f \.h$ | f \.cc$ ............................................................................... + f \.c$ | f \.h$ | f \.cc$ h View all *.h into current directory cat *.h |less + f \.c$ | f \.cc$ d Run gdb for current file [ -x "./%n" ] && gdb ./%n = f \.c$ | f \.cc$ + f \.c$ | f \.cc$ c Compile, link and run the current .c file export CFLAGS="-g -Wall -O2" make || make %n || cc $CFLAGS -o %n %f [ -r "%n" ] && (echo "*** press any key for run... ***"; read) [ -x "%n" ] && ./%n (echo -ne "\n--- Press any key for return to edit. ---"; read) + f \.c$ | f \.h$ t Indent `C' formatter indent -kr -pcs %b 1>/dev/null 2> %e #--------------------- End [c/c++] language template -------------------------- #------------------------- Begin unknown template ----------------------------- + y unknown & t r s #! /bin/sh echo "#! /bin/sh" >%b + y unknown & t r p #! /usr/bin/perl echo "#! /usr/bin/perl" >%b + y unknown & t r a Author description header unset LANG unset LANGUAGE LC_ALL= MY_UID="`id | sed 's/^.*uid=\([^(]*\).*$/\1/'`" AUTHOR="`awk -F: '$3 == '$MY_UID' {print $5}' /etc/passwd`" cat >>%b < Created at: `date` Computer: `uname -n` System: `uname -sr` on `uname -m` Copyright (c) `date +%%Y` $AUTHOR All rights reserved. ---------------------------------------------------------------------- EOF #--------------------------- End unknown template ----------------------------- ------------------------------------------------------------------------------- #----------------------- Begin common section --------------------------------- S Sort selection TMPFILE=`mktemp ${MC_TMPDIR:-/tmp}/up.XXXXXX` || exit 1 cat %b > $TMPFILE cat $TMPFILE| sort >%b rm -f $TMPFILE I Insert `Changelog' string DATE="`date +%%Y-%%m-%%d`" MY_UID="`id | sed 's/^.*uid=\([^(]*\).*$/\1/'`" AUTHOR="`awk -F: '$3 == '$MY_UID' {print $5}' /etc/passwd`" EMAIL="<$REPLYTO>" echo "$DATE $AUTHOR $EMAIL" >%b s Invoke `shell' sh m view `man' MAN=%{Enter name of man:} TMPFILE=`mktemp ${MC_TMPDIR:-/tmp}/mcview.$MAN.XXXXXX` || exit 1 man -Pcat $MAN >$TMPFILE mcview $TMPFILE rm -f $TMPFILE i Insert a out of command to cursor. CMD=%{ Enter command: } eval $CMD > %b o Open bash to next free console open -s -- /bin/bash u Upper case selection TMPFILE=`mktemp ${MC_TMPDIR:-/tmp}/up.XXXXXX` || exit 1 cat %b > $TMPFILE cat $TMPFILE| sed 's/\(.*\)/\U\1/' >%b rm -f $TMPFILE l Lower case selection TMPFILE=`mktemp ${MC_TMPDIR:-/tmp}/up.XXXXXX` || exit 1 cat %b > $TMPFILE cat $TMPFILE| sed 's/\(.*\)/\U\1/' >%b rm -f $TMPFILE #-------------------------- End of common section ----------------------------- ================================================ FILE: packages/sx05re/tools/sysutils/MC/etc/panels.ini ================================================ [New Left Panel] display=listing reverse=0 case_sensitive=1 exec_first=0 sort_order=name list_mode=full user_format=half type name | size | perm user_status0=half type name | size | perm user_status1=half type name | size | perm user_status2=half type name | size | perm user_status3=half type name | size | perm user_mini_status=0 [New Right Panel] display=listing reverse=0 case_sensitive=1 exec_first=0 sort_order=name list_mode=full user_format=half type name | size | perm user_status0=half type name | size | perm user_status1=half type name | size | perm user_status2=half type name | size | perm user_status3=half type name | size | perm user_mini_status=0 [Dirs] other_dir=/ current_is_left=false ================================================ FILE: packages/sx05re/tools/sysutils/MC/etc/sfs.ini ================================================ # # This is config for Single File fileSystem # # Notice that output files (%3) are pre-created atomically in /tmp # with 0600 rights, so it is safe to > %3 # gz/1 gzip < %1 > %3 ugz/1 gzip -cdf < %1 > %3 bz/1 bzip < %1 > %3 ubz/1 bzip -d < %1 > %3 bz2/1 bzip2 < %1 > %3 ubz2/1 bzip2 -d < %1 > %3 lzma/1 lzma < %1 > %3 ulzma/1 lzma -d < %1 > %3 xz/1 xz < %1 > %3 uxz/1 xz -d < %1 > %3 tar/1 tar cf %3 %1 tgz/1 tar czf %3 %1 uhtml/1 lynx -force_html -dump %1 > %3 uman/1 groff -Tascii -man %1 > %3 uue/1 uuenpipe < %1 > %3 uude/1 uudepipe < %1 > %3 crlf/1 todos < %1 > %3 cr/1 fromdos < %1 > %3 # Fixme: we need it to fail whenever it should url:2 lynx -source `echo "%2" | sed 's-|-/-g'` > %3 nop/1 cat %1 > %3 strings/1 strings %1 > %3 ================================================ FILE: packages/sx05re/tools/sysutils/MC/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2011-present AlexELEC (http://alexelec.in.ua) PKG_NAME="MC" PKG_VERSION="4.8.22" PKG_SHA256="ee7868d7ba0498cf2cccefe107d7efee7f2571098806bba2aed5a159db801318" PKG_LICENSE="GPL" PKG_SITE="http://www.midnight-commander.org/" PKG_URL="http://ftp.midnight-commander.org/mc-${PKG_VERSION}.tar.xz" PKG_SOURCE_NAME="${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libtool:host gettext:host glib libssh2 pcre slang" PKG_LONGDESC="Midnight Commander is a visual file manager" PKG_TOOLCHAIN="configure" PKG_CONFIGURE_OPTS_TARGET=" \ --prefix=/usr \ --sysconfdir=/etc \ --with-screen=slang \ --with-sysroot=${SYSROOT_PREFIX} \ --disable-aspell \ --without-diff-viewer \ --disable-doxygen-doc \ --disable-doxygen-dot \ --disable-doxygen-html \ --with-gnu-ld \ --without-libiconv-prefix \ --without-libintl-prefix \ --without-gpm-mouse \ --disable-mclib \ --with-subshell \ --with-edit \ --with-internal-edit \ --enable-vfs-extfs \ --enable-vfs-ftp \ --enable-vfs-sftp \ --enable-vfs-tar \ --without-x \ --with-slang-includes=${SYSROOT_PREFIX}/usr/include" pre_configure_target() { LDFLAGS="${LDFLAGS} -lcrypto -lssl" } post_install() { rm -rf ${INSTALL}/etc/mc mkdir -p ${INSTALL}/usr/config/mc cp -a ${PKG_DIR}/etc/* ${INSTALL}/usr/config/mc ln -sf /storage/.config/mc ${INSTALL}/etc/mc } ================================================ FILE: packages/sx05re/tools/sysutils/MC/patches/MC-01-utf8.patch ================================================ diff -Naurp mc-4.8.8/lib/strutil/strutil.c mc-4.8.8-patch/lib/strutil/strutil.c --- mc-4.8.8/lib/strutil/strutil.c 2013-03-07 12:45:57.000000000 +0200 +++ mc-4.8.8-patch/lib/strutil/strutil.c 2013-05-14 09:39:14.000000000 +0300 @@ -322,16 +322,7 @@ str_translate_char (GIConv conv, const c const char * str_detect_termencoding (void) { - if (term_encoding == NULL) - { - /* On Linux, nl_langinfo (CODESET) returns upper case UTF-8 whether the LANG is set - to utf-8 or UTF-8. - On Mac OS X, it returns the same case as the LANG input. - So let tranform result of nl_langinfo (CODESET) to upper case unconditionally. */ - term_encoding = g_ascii_strup (nl_langinfo (CODESET), -1); - } - - return term_encoding; + return "UTF8"; } static int diff -Naurp mc-4.8.8/lib/tty/tty-slang.c mc-4.8.8-patch/lib/tty/tty-slang.c --- mc-4.8.8/lib/tty/tty-slang.c 2013-03-07 12:45:57.000000000 +0200 +++ mc-4.8.8-patch/lib/tty/tty-slang.c 2013-05-14 09:40:10.000000000 +0300 @@ -268,7 +268,7 @@ tty_init (gboolean mouse_enable, gboolea { SLtt_Ignore_Beep = 1; - SLutf8_enable (-1); /* has to be called first before any of the other functions. */ + SLutf8_enable (1); /* has to be called first before any of the other functions. */ SLtt_get_terminfo (); /* * If the terminal in not in terminfo but begins with a well-known ================================================ FILE: packages/sx05re/tools/sysutils/MC/profile.d/52-mc.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2011-present AlexELEC (http://alexelec.in.ua) export EDITOR="mcedit" ================================================ FILE: packages/sx05re/tools/sysutils/SDL_GameControllerDB/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) PKG_NAME="SDL_GameControllerDB" PKG_VERSION="cead9cccf79c0865cf8c2b7b652867372d63cd6e" PKG_SHA256="af45411e7b4a24b91f267cf2281c63df209e7552f41f29d9a4261a50363811e5" PKG_LICENSE="OSS" PKG_SITE="https://github.com/gabomdq/SDL_GameControllerDB" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A community sourced database of game controller mappings to be used with SDL2 Game Controller functionality" PKG_TOOLCHAIN="manual" pre_configure_target() { # These maps are old, we use our own sed -i "s/19000000010000000100000001010000,odroid/# 19000000010000000100000001010000,odroid/g" gamecontrollerdb.txt sed -i "s/19000000010000000200000011000000,odroid/# 19000000010000000200000011000000,odroid/g" gamecontrollerdb.txt sed -i "s/03000000d11800000094000011010000,Stadia Controller/# 03000000d11800000094000011010000,Stadia Controller/g" gamecontrollerdb.txt sed -i "s/030000004c0500006802000011810000,PS3 Controller/# 030000004c0500006802000011810000,PS3 Controller/g" gamecontrollerdb.txt sed -i "s/030005ff6d0400001dc2000014400000,Logitech Gamepad F310/# 030005ff6d0400001dc2000014400000,Logitech Gamepad F310/g" gamecontrollerdb.txt } makeinstall_target() { mkdir -p ${INSTALL}/usr/config/SDL-GameControllerDB cp ${PKG_BUILD}/gamecontrollerdb.txt ${INSTALL}/usr/config/SDL-GameControllerDB } ================================================ FILE: packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch ================================================ --- a/gamecontrollerdb.txt +++ b/gamecontrollerdb.txt @@ -1,5 +1,20 @@ # Game Controller DB for SDL in 2.0.9 format # Source: https://github.com/gabomdq/SDL_GameControllerDB + +# EmuELEC extra gamepads +030000004c0500006802000011810000,Sony PLAYSTATION(R)3 Controller,platform:Linux,dpleft:b15,rightx:a3,dpright:b16,rightshoulder:b5,dpdown:b14,righty:a4,leftshoulder:b4,y:b3,x:b2,b:b0,a:b1,dpup:b13,back:b8,leftstick:b11,start:b9,lefty:a1,guide:b8,lefttrigger:a2,righttrigger:a5,rightstick:b12,leftx:a0, +030005ff6d0400001dc2000014400000,Logitech Gamepad F310,dpleft:h0.8,rightx:a3,dpright:h0.2,rightshoulder:b5,dpdown:h0.4,righty:a4,leftshoulder:b4,y:b2,x:b3,b:b0,a:b1,dpup:h0.1,back:b6,leftstick:b9,start:b7,lefty:a1,guide:b8,lefttrigger:a2,righttrigger:a5,rightstick:b10,leftx:a0,platform:Linux, +030000004c0500006802000011810000,Sony PLAYSTATION(R)3 Controller,platform:Linux,dpleft:b15,rightx:a3,dpright:b16,rightshoulder:b5,dpdown:b14,righty:a4,leftshoulder:b4,y:b3,x:b2,b:b0,a:b1,dpup:b13,back:b8,leftstick:b11,start:b9,lefty:a1,guide:b8,lefttrigger:a2,righttrigger:a5,rightstick:b12,leftx:a0, +190000004b4800000010000000010000,GO-Advance Gamepad,platform:Linux,a:b0,b:b1,x:b3,y:b2,back:b10,start:b15,leftstick:b12,rightstick:b13,leftshoulder:b4,rightshoulder:b5,dpup:b6,dpdown:b7,dpleft:b8,dpright:b9,leftx:a0,lefty:a1,lefttrigger:b11,righttrigger:b14, +190000004b4800000010000001010000,GO-Advance Gamepad (rev 1.1),platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b12,guide:b13,start:b17,dpleft:b10,dpdown:b9,dpright:b11,dpup:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,rightstick:b16,leftx:a0,lefty:a1, +190000004b4800000011000000010000,GO-Super Gamepad,platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b12,guide:b16,start:b13,dpleft:b10,dpdown:b9,dpright:b11,dpup:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b14,rightstick:b17,leftx:a0,lefty:a1,rightx:a2,righty:a3, +19000000030000000300000002030000,gameforce_gamepad,platform:Linux,leftstick:b14,rightx:a3,leftshoulder:b4,start:b9,lefty:a0,dpup:b10,righty:a2,a:b1,b:b0,guide:b16,dpdown:b11,rightshoulder:b5,righttrigger:b7,rightstick:b15,dpright:b13,x:b2,back:b8,leftx:a1,y:b3,dpleft:b12,lefttrigger:b6, +05000000c82d00000021000000010000,8BitDo SN30 Pro for Android,platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b10,guide:b12,start:b11,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,righttrigger:b9,leftstick:b13,rightstick:b14,leftx:a0,lefty:a1,rightx:a2,righty:a5, +03000000c82d00000031000011010000,8BitDo 8BitDo Receiver,platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b10,guide:b2,start:b11,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,righttrigger:b9,leftstick:b13,rightstick:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3, +03000000d11800000094000011010000,Google LLC Stadia Controller rev. A,platform:Linux,leftstick:b9,rightx:a2,leftshoulder:b4,start:b7,lefty:a1,dpup:h0.1,righty:a3,a:b1,b:b0,guide:b8,dpdown:h0.4,rightshoulder:b5,righttrigger:b13,rightstick:b10,dpright:h0.2,x:b3,back:b6,leftx:a0,y:b2,dpleft:h0.8,lefttrigger:b14, +03000000790000001100000010010000,iNNEXT SNES Retro USB Controller,platform:Linux,leftshoulder:b4,start:b9,dpup:a1,a:b1,b:b2,guide:b8,dpdown:a1,rightshoulder:b5,dpright:a0,x:b0,back:b8,y:b3,dpleft:a0, +03000000100800000100000010010000,PlayGame PS2-like Controller,platform:Linux,leftstick:b10,rightx:a3,leftshoulder:b4,start:b9,lefty:a1,dpup:h0.1,righty:a2,a:b1,b:b2,guide:b8,dpdown:h0.4,rightshoulder:b5,righttrigger:b7,rightstick:b11,dpright:h0.2,x:b0,back:b8,leftx:a0,y:b3,dpleft:h0.8,lefttrigger:b6, +050000007e0500000920000001000000,8BitDo SN30 pro,platform:Linux,leftstick:b10,rightx:a2,leftshoulder:b4,start:b9,lefty:a1,dpup:h0.1,righty:a3,a:b1,b:b0,guide:b13,dpdown:h0.4,rightshoulder:b5,righttrigger:b7,rightstick:b11,dpright:h0.2,x:b3,back:b8,leftx:a0,y:b2,dpleft:h0.8,lefttrigger:b6, # Windows 03000000fa2d00000100000000000000,3DRUDDER,leftx:a0,lefty:a1,rightx:a5,righty:a2,platform:Windows, ================================================ FILE: packages/sx05re/tools/sysutils/TvTextViewer/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="TvTextViewer" PKG_VERSION="f3d2ecd7276a2fb44c0dbbd163b837feb8dc4aa1" PKG_LICENSE="MIT" PKG_SITE="https://github.com/lethal-guitar/TvTextViewer" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_SHORTDESC="Full-screen text viewer tool with gamepad controls" PKG_TOOLCHAIN="make" pre_configure_target() { sed -i "s|\`sdl2-config|\`${SYSROOT_PREFIX}/usr/bin/sdl2-config|g" Makefile } makeinstall_target(){ mkdir -p ${INSTALL}/usr/bin cp text_viewer ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/tools/sysutils/bluetool/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Based on libreelec pycryptodome package PKG_NAME="bluetool" PKG_VERSION="29570c71ed77d0db0ef19ac8d2172e8989fcecac" PKG_LICENSE="GPL" PKG_SITE="https://github.com/emlid/bluetool" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="Python3 dbus-python tcpbridge" PKG_LONGDESC="A simple Python API for Bluetooth D-Bus calls. Allows easy pairing, connecting and scanning.Also provides a TCP-to-RFCOMM socket bridge for data transfer." PKG_TOOLCHAIN="manual" pre_configure_target() { cd ${PKG_BUILD} rm -rf .${TARGET_NAME} export PYTHONXCPREFIX="${SYSROOT_PREFIX}/usr" export LDSHARED="${CC} -shared" } make_target() { python setup.py build } makeinstall_target() { python setup.py install --root=${INSTALL} --prefix=/usr } ================================================ FILE: packages/sx05re/tools/sysutils/bluetool/patches/12.patch ================================================ --- a/bluetool/__init__.py +++ b/bluetool/__init__.py @@ -2,3 +2,4 @@ from .blueserver import BluetoothServer __all__ = ['Bluetooth', 'BluetoothServer'] +from tcpbridge import TCPBridge, TCPBridgeError, TCPServer, SocketSink, FileSink --- a/bluetool/blueserver.py +++ b/bluetool/blueserver.py @@ -29,6 +29,8 @@ import socket try: + import pgi + pgi.install_as_gi() from gi.repository import GObject except ImportError: import gobject as GObject ================================================ FILE: packages/sx05re/tools/sysutils/coreutils/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="coreutils" PKG_VERSION="8.31" PKG_SHA256="ff7a9c918edce6b4f4b2725e3f9b37b0c4d193531cac49a48b56c4d0d3a9e9fd" PKG_LICENSE="GPLv2+" PKG_SITE="https://www.gnu.org/software/coreutils/" PKG_URL="https://ftp.gnu.org/gnu/coreutils/coreutils-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="The GNU Core Utilities are the basic file, shell and text manipulation utilities of the GNU operating system." PKG_TOOLCHAIN="auto" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/.${TARGET_NAME}/src/stdbuf ${INSTALL}/usr/bin/ cp ${PKG_BUILD}/.${TARGET_NAME}/src/timeout ${INSTALL}/usr/bin/ cp ${PKG_BUILD}/.${TARGET_NAME}/src/sort ${INSTALL}/usr/bin/ mkdir -p ${INSTALL}/usr/lib/coreutils cp ${PKG_BUILD}/.${TARGET_NAME}/src/libstdbuf.so ${INSTALL}/usr/lib/coreutils/ } ================================================ FILE: packages/sx05re/tools/sysutils/dasbus/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Based on libreelec pycryptodome package PKG_NAME="dasbus" PKG_VERSION="592f444f91707e6a23efe587b01592d09b3541f7" PKG_LICENSE="GPL" PKG_SITE="https://github.com/rhinstaller/dasbus" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="Python3 dbus-python tcpbridge" PKG_LONGDESC="DBus library in Python 3 " PKG_TOOLCHAIN="manual" pre_configure_target() { cd ${PKG_BUILD} rm -rf .${TARGET_NAME} export PYTHONXCPREFIX="${SYSROOT_PREFIX}/usr" export LDSHARED="${CC} -shared" } make_target() { python setup.py build } makeinstall_target() { python setup.py install --root=${INSTALL} --prefix=/usr } ================================================ FILE: packages/sx05re/tools/sysutils/dialog/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="dialog" PKG_VERSION="1.3-20220117" PKG_SHA256="754cb6bf7dc6a9ac5c1f80c13caa4d976e30a5a6e8b46f17b3bb9b080c31041f" PKG_LICENSE="GNU-2.1" PKG_SITE="https://invisible-mirror.net/archives/dialog" PKG_URL="${PKG_SITE}/dialog-${PKG_VERSION}.tgz" PKG_DEPENDS_TARGET="toolchain ncurses" PKG_LONGDESC="This version of dialog, formerly known as cdialog is based on the Debian package for dialog 0.9a" PKG_TOOLCHAIN="auto" PKG_CONFIGURE_OPTS_TARGET="--with-ncurses --disable-rpath-hack" ================================================ FILE: packages/sx05re/tools/sysutils/ee_utils/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2025-present EmuELEC (https://github.com/EmuELEC) PKG_NAME="ee_utils" PKG_VERSION="v1" PKG_LICENSE="Public Domain" PKG_SITE="https://emuelec.org" PKG_DEPENDS_TARGET="toolchain" PKG_SHORTDESC="Misc EmuELEC specific utils" PKG_TOOLCHAIN="manual" make_target() { mkdir -p bin ${CC} -O2 ees.c -o bin/ees ${CC} -O2 ee_asd.c -o bin/ee_asd } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp bin/* ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/tools/sysutils/ee_utils/sources/ee_asd.c ================================================ // autoshutdown.c #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define LOG_FILE "/emuelec/logs/shutdowntimer.log" #define PID_FILE "/tmp/autoshutdown.pid" #define MAX_DEVICES 32 #define POLL_TIMEOUT_MS 5000 // Check every 5 seconds instead of 1 static FILE *log_fp = NULL; static time_t last_activity; static volatile int running = 1; static int debug_mode = 0; static int check_debug_mode() { // get_es_setting is defined in /etc/profile, so we need to source it first FILE *fp = popen(". /etc/profile && get_es_setting string LogLevel", "r"); if (!fp) return 0; char result[64] = {0}; if (fgets(result, sizeof(result), fp) != NULL) { result[strcspn(result, "\n")] = 0; pclose(fp); return (strcmp(result, "debug") == 0); } pclose(fp); return 0; } static void log_msg(const char *level, const char *fmt, ...) { if (strcmp(level, "SUCCESS") != 0) { if (!debug_mode) return; } if (!log_fp) return; va_list args; va_start(args, fmt); time_t t = time(NULL); struct tm tm; localtime_r(&t, &tm); char buf[64]; strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm); fprintf(log_fp, "[%s] [%s] ", buf, level); vfprintf(log_fp, fmt, args); fprintf(log_fp, "\n"); fflush(log_fp); va_end(args); } static void cleanup(int signum) { log_msg("INFO", "Received signal %d, exiting...", signum); running = 0; } static void perform_action(const char *action) { if (!action) return; if (strcmp(action, "shutdown") == 0) { log_msg("SUCCESS", "No activity detected: calling shutdown, bye :-)"); system(". /etc/profile && shutdown"); } else { log_msg("INFO", "No activity detected: killing process %s", action); char cmd[256]; snprintf(cmd, sizeof(cmd), "pkill -TERM %s", action); system(cmd); } } static int is_relevant_device(const char *path) { int fd = open(path, O_RDONLY); if (fd < 0) return 0; // Check if device supports the event types we care about unsigned long evbit[EV_MAX/sizeof(long)/8 + 1] = {0}; if (ioctl(fd, EVIOCGBIT(0, sizeof(evbit)), evbit) < 0) { close(fd); return 0; } // Only monitor devices with keys, relative movement, or absolute positioning int relevant = (evbit[0] & (1 << EV_KEY)) || (evbit[0] & (1 << EV_REL)) || (evbit[0] & (1 << EV_ABS)); close(fd); return relevant; } static int is_motion_sensor_event(struct input_event *ev) { // Filter out motion sensor axes commonly used by PS3/PS4/PS5 controllers // These axes constantly send data even when controller is sitting still if (ev->type == EV_ABS) { switch (ev->code) { // Accelerometer axes case ABS_RX: // Often used for accelerometer X case ABS_RY: // Often used for accelerometer Y case ABS_RZ: // Often used for accelerometer Z // Gyroscope axes (some controllers) case ABS_TILT_X: case ABS_TILT_Y: // Other motion/orientation sensors case ABS_DISTANCE: case ABS_MISC: return 1; // This is likely motion sensor data default: return 0; // Legitimate analog stick/trigger input } } return 0; } static int open_input_devices(struct pollfd *pfds, int max_devices) { DIR *dir = opendir("/dev/input"); if (!dir) { log_msg("ERROR", "Cannot open /dev/input: %s", strerror(errno)); return 0; } struct dirent *entry; int count = 0; while ((entry = readdir(dir)) != NULL && count < max_devices) { if (strncmp(entry->d_name, "event", 5) == 0) { char path[256]; snprintf(path, sizeof(path), "/dev/input/%s", entry->d_name); // Skip irrelevant devices if (!is_relevant_device(path)) { continue; } int fd = open(path, O_RDONLY | O_NONBLOCK); if (fd >= 0) { pfds[count].fd = fd; pfds[count].events = POLLIN; log_msg("INFO", "Monitoring device: %s", path); count++; } else { log_msg("WARN", "Failed to open %s: %s", path, strerror(errno)); } } } closedir(dir); return count; } static int read_timer_from_ees() { FILE *fp = popen("ees -e -r ee_auto_shutdown_timeout", "r"); if (!fp) return 0; int t = 0; if (fscanf(fp, "%d", &t) != 1) t = 0; pclose(fp); return t; } static void set_low_priority() { // Set to lowest priority nice value if (setpriority(PRIO_PROCESS, 0, 19) < 0) { log_msg("WARN", "Failed to set nice priority: %s", strerror(errno)); } // Set idle I/O scheduling class (best effort, class 3, lowest priority) // This requires ioprio_set syscall which isn't in libc // We'll skip this for simplicity, but it could be added via syscall() } int main(int argc, char *argv[]) { int timeout_minutes = 0; const char *action = "shutdown"; // Check if debug mode is enabled BEFORE forking debug_mode = check_debug_mode(); // Open log only if debug mode is enabled if (debug_mode) { log_fp = fopen(LOG_FILE, "w+"); if (!log_fp) { perror("Failed to open log file"); return 1; } } // Parse arguments int opt; while ((opt = getopt(argc, argv, "t:p:")) != -1) { switch (opt) { case 't': timeout_minutes = atoi(optarg); break; case 'p': action = optarg; break; default: break; } } // Auto-mode if no timer specified if (timeout_minutes <= 0) { timeout_minutes = read_timer_from_ees(); if (timeout_minutes <= 0) { log_msg("INFO", "Auto-mode timer is 0 or undefined. Exiting."); if (log_fp) fclose(log_fp); return 2; // Exit code 2: no timer configured } log_msg("INFO", "Auto-mode timer: %d minutes", timeout_minutes); } int limit_seconds = timeout_minutes * 60; last_activity = time(NULL); // Setup signal handlers signal(SIGTERM, cleanup); signal(SIGINT, cleanup); // Daemonize pid_t pid = fork(); if (pid < 0) exit(1); if (pid > 0) exit(0); // parent exits umask(0); setsid(); chdir("/"); // Close standard file descriptors after forking to avoid interference close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); // Set low priority to minimize impact set_low_priority(); // Write PID file FILE *pid_fp = fopen(PID_FILE, "w"); if (pid_fp) { fprintf(pid_fp, "%d\n", getpid()); fclose(pid_fp); log_msg("INFO", "PID file created at %s", PID_FILE); } else { log_msg("WARN", "Cannot write PID file: %s", strerror(errno)); } // Open input devices struct pollfd pfds[MAX_DEVICES]; int num_fds = open_input_devices(pfds, MAX_DEVICES); if (num_fds == 0) { log_msg("ERROR", "No input devices found, exiting"); if (log_fp) fclose(log_fp); remove(PID_FILE); return 1; } log_msg("SUCCESS", "Autoshutdown started: timeout=%d minutes, action=%s, poll_interval=%dms", timeout_minutes, action, POLL_TIMEOUT_MS); struct input_event ev; char device_name[256]; time_t last_check = time(NULL); while (running) { int activity_detected = 0; // Poll with longer timeout to reduce CPU wake-ups int ret = poll(pfds, num_fds, POLL_TIMEOUT_MS); if (ret > 0) { // Drain all pending events efficiently for (int i = 0; i < num_fds; i++) { if (pfds[i].revents & POLLIN) { // Read and discard events - we only care that SOMETHING happened while (read(pfds[i].fd, &ev, sizeof(ev)) > 0) { // Check if this is legitimate input (not motion sensor noise) if (ev.type == EV_KEY || ev.type == EV_REL) { activity_detected = 1; } else if (ev.type == EV_ABS && !is_motion_sensor_event(&ev)) { activity_detected = 1; // Uncomment for detailed activity logging in debug mode if (ioctl(pfds[i].fd, EVIOCGNAME(sizeof(device_name)), device_name) >= 0) { log_msg("INFO", "Activity detected on %s", device_name); } else { log_msg("INFO", "Activity detected on fd %d", pfds[i].fd); } } } } // Handle errors/hangups by reopening device if (pfds[i].revents & (POLLERR | POLLHUP | POLLNVAL)) { close(pfds[i].fd); pfds[i].fd = -1; log_msg("WARN", "Device fd %d disconnected", i); } } } if (activity_detected) { last_activity = time(NULL); } // Only check time periodically to reduce syscalls time_t now = time(NULL); if (now - last_check >= 1) { last_check = now; if (difftime(now, last_activity) > limit_seconds) { perform_action(action); break; } } } // Cleanup for (int i = 0; i < num_fds; i++) { if (pfds[i].fd >= 0) close(pfds[i].fd); } if (log_fp) fclose(log_fp); remove(PID_FILE); return 0; } ================================================ FILE: packages/sx05re/tools/sysutils/ee_utils/sources/ees.c ================================================ /* ees - EmuELEC setter * Usage: RetroArch config: ees -s -v [-o file] Set a setting ees -r [-o file] Read a setting ees -i [-o out] Merge changes EmuELEC emuelec.conf config (enable with -e): ees -e -s -v -p [-m ] Set setting (uses $EE_CONF) ees -e -r -p [-m ] Read setting with priority: ROM -> Platform -> Global -> Standalone Environment variables: RA_CONF - path to retroarch.cfg (default: /storage/.config/retroarch/retroarch.cfg) EE_CONF - path to emuelec.conf (default: /storage/.config/emuelec/configs/emuelec.conf) Note: -o specifies output file (for -s/-r, uses $RA_CONF if not specified) Compile: gcc -O2 -o ras ras.c */ #include #include #include #include #include #define MAX_LINE 2048 #define MAX_KEY 256 #define MAX_VALUE 1024 #define HASH_SIZE 1024 typedef struct Entry { char *key; char *value; struct Entry *next; } Entry; typedef struct { Entry *buckets[HASH_SIZE]; } HashMap; /* Simple hash function */ unsigned int hash(const char *str) { unsigned int h = 5381; int c; while ((c = *str++)) h = ((h << 5) + h) + c; return h % HASH_SIZE; } /* Create new hashmap */ HashMap* hashmap_create() { HashMap *map = calloc(1, sizeof(HashMap)); return map; } /* Trim whitespace from both ends */ char* trim(char *str) { char *end; while (isspace((unsigned char)*str)) str++; if (*str == 0) return str; end = str + strlen(str) - 1; while (end > str && isspace((unsigned char)*end)) end--; end[1] = '\0'; return str; } /* Insert or update key-value pair */ void hashmap_put(HashMap *map, const char *key, const char *value) { unsigned int h = hash(key); Entry *e = map->buckets[h]; /* Check if key exists, update if found */ while (e) { if (strcmp(e->key, key) == 0) { free(e->value); e->value = strdup(value); return; } e = e->next; } /* New entry */ e = malloc(sizeof(Entry)); e->key = strdup(key); e->value = strdup(value); e->next = map->buckets[h]; map->buckets[h] = e; } /* Get value for key */ const char* hashmap_get(HashMap *map, const char *key) { unsigned int h = hash(key); Entry *e = map->buckets[h]; while (e) { if (strcmp(e->key, key) == 0) return e->value; e = e->next; } return NULL; } /* Parse a config line: key = "value" or key = value */ int parse_line(char *line, char *key, char *value) { char *eq, *val_start, *val_end; /* Skip comments and empty lines */ char *trimmed = trim(line); if (trimmed[0] == '#' || trimmed[0] == '\0') return 0; /* Find the = sign */ eq = strchr(trimmed, '='); if (!eq) return 0; /* Extract key */ *eq = '\0'; strncpy(key, trim(trimmed), MAX_KEY - 1); key[MAX_KEY - 1] = '\0'; /* Extract value */ val_start = trim(eq + 1); /* Remove quotes if present */ if (val_start[0] == '"') { val_start++; val_end = strrchr(val_start, '"'); if (val_end) *val_end = '\0'; } strncpy(value, val_start, MAX_VALUE - 1); value[MAX_VALUE - 1] = '\0'; return 1; } /* Load config file into hashmap */ int load_config(const char *filename, HashMap *map) { FILE *f = fopen(filename, "r"); if (!f) { return 0; } char line[MAX_LINE]; char key[MAX_KEY], value[MAX_VALUE]; while (fgets(line, sizeof(line), f)) { if (parse_line(line, key, value)) { hashmap_put(map, key, value); } } fclose(f); return 1; } /* Write hashmap to config file */ int write_config(const char *filename, HashMap *map) { char temp_file[1024]; snprintf(temp_file, sizeof(temp_file), "%s.tmp", filename); FILE *f = fopen(temp_file, "w"); if (!f) { fprintf(stderr, "Error: Cannot write to %s\n", temp_file); return 0; } /* Iterate through all buckets */ for (int i = 0; i < HASH_SIZE; i++) { Entry *e = map->buckets[i]; while (e) { fprintf(f, "%s = \"%s\"\n", e->key, e->value); e = e->next; } } fclose(f); /* Atomic rename */ if (rename(temp_file, filename) != 0) { fprintf(stderr, "Error: Cannot rename %s to %s\n", temp_file, filename); unlink(temp_file); return 0; } return 1; } /* Free hashmap */ void hashmap_free(HashMap *map) { for (int i = 0; i < HASH_SIZE; i++) { Entry *e = map->buckets[i]; while (e) { Entry *next = e->next; free(e->key); free(e->value); free(e); e = next; } } free(map); } /* Get RA_CONF from environment */ const char* get_ra_conf() { const char *conf = getenv("RA_CONF"); if (!conf) { return "/storage/.config/retroarch/retroarch.cfg"; } return conf; } /* Get EE_CONF from environment */ const char* get_ee_conf() { const char *conf = getenv("EE_CONF"); if (!conf) { return "/storage/.config/emuelec/configs/emuelec.conf"; } return conf; } /* Parse hierarchical config line: platform["rom"].key=value or platform.key=value or global.key=value or standalone key=value */ int parse_ee_line(char *line, char *platform, char *rom, char *key, char *value) { char *trimmed = trim(line); /* Skip comments and empty lines */ if (trimmed[0] == '#' || trimmed[0] == '\0') return 0; /* Find the = sign */ char *eq = strchr(trimmed, '='); if (!eq) return 0; *eq = '\0'; char *left = trim(trimmed); char *val = trim(eq + 1); /* Copy value */ strncpy(value, val, MAX_VALUE - 1); value[MAX_VALUE - 1] = '\0'; /* Parse left side */ platform[0] = '\0'; rom[0] = '\0'; /* Check for ROM-specific: platform["rom"].key */ char *bracket = strchr(left, '['); if (bracket) { *bracket = '\0'; strncpy(platform, trim(left), MAX_KEY - 1); platform[MAX_KEY - 1] = '\0'; char *quote1 = strchr(bracket + 1, '"'); if (quote1) { char *quote2 = strchr(quote1 + 1, '"'); if (quote2) { *quote2 = '\0'; strncpy(rom, quote1 + 1, MAX_KEY - 1); rom[MAX_KEY - 1] = '\0'; /* Look for dot or hyphen after the closing bracket */ char *sep = quote2 + 1; while (*sep && (*sep == ']' || isspace(*sep))) sep++; if (*sep == '.' || *sep == '-') { strncpy(key, trim(sep + 1), MAX_KEY - 1); key[MAX_KEY - 1] = '\0'; return 1; } } } return 0; } /* Check for platform.key or global.key */ char *dot = strchr(left, '.'); if (!dot) dot = strchr(left, '-'); /* Support both . and - as separators */ if (dot) { *dot = '\0'; strncpy(platform, trim(left), MAX_KEY - 1); platform[MAX_KEY - 1] = '\0'; strncpy(key, trim(dot + 1), MAX_KEY - 1); key[MAX_KEY - 1] = '\0'; return 1; } /* Standalone key with no platform (e.g., ee_randomsplashpath=value) */ strncpy(key, left, MAX_KEY - 1); key[MAX_KEY - 1] = '\0'; platform[0] = '\0'; /* Empty platform means standalone */ return 1; } /* Read hierarchical setting: ROM -> Platform -> Global -> Standalone */ int cmd_ee_read(const char *setting_key, const char *platform_name, const char *rom_name) { const char *conf_file = get_ee_conf(); if (!conf_file) return 1; FILE *f = fopen(conf_file, "r"); if (!f) { fprintf(stderr, "Error: Cannot read %s\n", conf_file); return 1; } char line[MAX_LINE]; char platform[MAX_KEY], rom[MAX_KEY], key[MAX_KEY], value[MAX_VALUE]; char *rom_value = NULL; char *platform_value = NULL; char *global_value = NULL; char *standalone_value = NULL; /* Read file and find matching entries */ while (fgets(line, sizeof(line), f)) { if (parse_ee_line(line, platform, rom, key, value)) { if (strcmp(key, setting_key) == 0) { /* ROM-specific match (highest priority) */ if (rom_name && rom[0] != '\0' && strcmp(platform, platform_name) == 0 && strcmp(rom, rom_name) == 0) { if (rom_value) free(rom_value); rom_value = strdup(value); } /* Platform-specific match */ else if (rom[0] == '\0' && platform[0] != '\0' && strcmp(platform, platform_name) == 0) { if (platform_value) free(platform_value); platform_value = strdup(value); } /* Global match */ else if (rom[0] == '\0' && platform[0] != '\0' && strcmp(platform, "global") == 0) { if (global_value) free(global_value); global_value = strdup(value); } /* Standalone match (no platform prefix) */ else if (rom[0] == '\0' && platform[0] == '\0') { if (standalone_value) free(standalone_value); standalone_value = strdup(value); } } } } fclose(f); /* Return in priority order: ROM -> Platform -> Global -> Standalone */ char *result = rom_value ? rom_value : (platform_value ? platform_value : (global_value ? global_value : standalone_value)); if (result) { printf("%s\n", result); if (rom_value) free(rom_value); if (platform_value) free(platform_value); if (global_value) free(global_value); if (standalone_value) free(standalone_value); return 0; } /* Cleanup */ if (rom_value) free(rom_value); if (platform_value) free(platform_value); if (global_value) free(global_value); if (standalone_value) free(standalone_value); /* Not found - return nothing (empty output) */ return 1; } /* Set hierarchical setting - preserves file structure, comments, and order */ int cmd_ee_set(const char *setting_key, const char *setting_value, const char *platform_name, const char *rom_name) { const char *conf_file = get_ee_conf(); if (!conf_file) return 1; /* Read entire file into memory, preserving everything */ FILE *f = fopen(conf_file, "r"); if (!f) { fprintf(stderr, "Error: Cannot read %s\n", conf_file); return 1; } char **lines = NULL; int line_count = 0; int line_capacity = 100; lines = malloc(sizeof(char*) * line_capacity); char buffer[MAX_LINE]; int found = 0; while (fgets(buffer, sizeof(buffer), f)) { if (line_count >= line_capacity) { line_capacity *= 2; lines = realloc(lines, sizeof(char*) * line_capacity); } char platform[MAX_KEY], rom[MAX_KEY], key[MAX_KEY], value[MAX_VALUE]; int is_target = 0; /* Try to parse, but keep original line regardless */ char *line_copy = strdup(buffer); if (parse_ee_line(line_copy, platform, rom, key, value)) { /* Check if this is the line we want to update */ if (strcmp(key, setting_key) == 0 && strcmp(platform, platform_name) == 0) { if (rom_name && rom_name[0] != '\0') { /* Looking for ROM-specific: must match ROM exactly */ if (rom[0] != '\0' && strcmp(rom, rom_name) == 0) { is_target = 1; } } else { /* Looking for platform-specific: must NOT have a ROM */ if (rom[0] == '\0') { is_target = 1; } } } } free(line_copy); if (is_target) { /* Update this line, preserving format as much as possible */ found = 1; char new_line[MAX_LINE]; if (rom_name && rom_name[0] != '\0') { /* ROM-specific: platform["rom"].key=value */ snprintf(new_line, sizeof(new_line), "%s[\"%s\"].%s=%s\n", platform_name, rom_name, setting_key, setting_value); } else if (platform_name && platform_name[0] != '\0') { /* Platform-specific: platform.key=value */ snprintf(new_line, sizeof(new_line), "%s.%s=%s\n", platform_name, setting_key, setting_value); } else { /* Standalone: key=value (no platform prefix) */ snprintf(new_line, sizeof(new_line), "%s=%s\n", setting_key, setting_value); } lines[line_count++] = strdup(new_line); } else { /* Keep original line exactly as-is (comments, blank lines, etc) */ lines[line_count++] = strdup(buffer); } } fclose(f); /* If not found, append new line at the end */ if (!found) { if (line_count >= line_capacity) { line_capacity++; lines = realloc(lines, sizeof(char*) * line_capacity); } char new_line[MAX_LINE]; if (rom_name && rom_name[0] != '\0') { /* ROM-specific: platform["rom"].key=value */ snprintf(new_line, sizeof(new_line), "%s[\"%s\"].%s=%s\n", platform_name, rom_name, setting_key, setting_value); } else if (platform_name && platform_name[0] != '\0') { /* Platform-specific: platform.key=value */ snprintf(new_line, sizeof(new_line), "%s.%s=%s\n", platform_name, setting_key, setting_value); } else { /* Standalone: key=value (no platform prefix) */ snprintf(new_line, sizeof(new_line), "%s=%s\n", setting_key, setting_value); } lines[line_count++] = strdup(new_line); } /* Write back atomically */ char temp_file[1024]; snprintf(temp_file, sizeof(temp_file), "%s.tmp", conf_file); f = fopen(temp_file, "w"); if (!f) { fprintf(stderr, "Error: Cannot write to %s\n", temp_file); for (int i = 0; i < line_count; i++) free(lines[i]); free(lines); return 1; } for (int i = 0; i < line_count; i++) { fputs(lines[i], f); free(lines[i]); } free(lines); fclose(f); /* Atomic rename */ if (rename(temp_file, conf_file) != 0) { fprintf(stderr, "Error: Cannot update %s\n", conf_file); unlink(temp_file); return 1; } return 0; } /* Set a setting */ int cmd_set(const char *key, const char *value, const char *output_file) { const char *conf_file = output_file ? output_file : get_ra_conf(); if (!conf_file) return 1; HashMap *config = hashmap_create(); /* Load existing config (create new if doesn't exist) */ load_config(conf_file, config); /* Set the value */ hashmap_put(config, key, value); /* Write back */ if (!write_config(conf_file, config)) { hashmap_free(config); return 1; } hashmap_free(config); return 0; } /* Read a setting */ int cmd_read(const char *key, const char *input_file) { const char *conf_file = input_file ? input_file : get_ra_conf(); if (!conf_file) return 1; HashMap *config = hashmap_create(); if (!load_config(conf_file, config)) { fprintf(stderr, "Error: Cannot read %s\n", conf_file); hashmap_free(config); return 1; } const char *value = hashmap_get(config, key); if (value) { printf("%s\n", value); hashmap_free(config); return 0; } hashmap_free(config); /* Key not found - return nothing (empty output) */ return 1; } /* Merge changes */ int cmd_merge(const char *changes_file, const char *output_file) { const char *base_file = output_file; /* If no output specified, use RA_CONF */ if (!base_file) { base_file = get_ra_conf(); if (!base_file) return 1; } HashMap *config = hashmap_create(); /* Load base config */ if (!load_config(base_file, config)) { fprintf(stderr, "Error: Cannot read %s\n", base_file); hashmap_free(config); return 1; } /* Apply changes */ if (!load_config(changes_file, config)) { fprintf(stderr, "Error: Cannot read %s\n", changes_file); hashmap_free(config); return 1; } /* Write merged config */ if (!write_config(base_file, config)) { hashmap_free(config); return 1; } hashmap_free(config); return 0; } void print_usage(const char *prog) { fprintf(stderr, "Usage:\n"); fprintf(stderr, " RetroArch config:\n"); fprintf(stderr, " %s -s -v [-o file] Set a setting\n", prog); fprintf(stderr, " %s -r [-o file] Read a setting\n", prog); fprintf(stderr, " %s -i [-o out] Merge changes\n", prog); fprintf(stderr, "\n"); fprintf(stderr, " EmuELEC emuelec.conf config:\n"); fprintf(stderr, " %s -e -s -v -p [-m ]\n", prog); fprintf(stderr, " Set setting (uses $EE_CONF)\n"); fprintf(stderr, " %s -e -r -p [-m ]\n", prog); fprintf(stderr, " Read setting with priority:\n"); fprintf(stderr, " ROM -> Platform -> Global -> Standalone\n"); fprintf(stderr, "\n"); fprintf(stderr, "Environment variables:\n"); fprintf(stderr, " RA_CONF - path to retroarch.cfg (default: /storage/.config/retroarch/retroarch.cfg)\n"); fprintf(stderr, " EE_CONF - path to emuelec.conf (default: /storage/.config/emuelec/configs/emuelec.conf)\n"); fprintf(stderr, "\n"); fprintf(stderr, "Note: -o specifies output file (for -s/-r, uses $RA_CONF if not specified)\n"); } int main(int argc, char *argv[]) { int opt; char *set_key = NULL, *set_value = NULL; char *read_key = NULL; char *input_file = NULL, *output_file = NULL; char *platform = NULL, *rom = NULL; int use_ee_conf = 0; if (argc < 2) { print_usage(argv[0]); return 1; } /* Parse arguments */ while ((opt = getopt(argc, argv, "s:v:r:i:o:p:m:eh")) != -1) { switch (opt) { case 's': set_key = optarg; break; case 'v': set_value = optarg; break; case 'r': read_key = optarg; break; case 'i': input_file = optarg; break; case 'o': output_file = optarg; break; case 'p': platform = optarg; break; case 'm': rom = optarg; break; case 'e': use_ee_conf = 1; break; case 'h': print_usage(argv[0]); return 0; default: print_usage(argv[0]); return 1; } } /* Execute command */ if (use_ee_conf) { /* EmuELEC hierarchical config operations */ /* Treat empty strings as NULL */ if (platform && platform[0] == '\0') platform = NULL; if (rom && rom[0] == '\0') rom = NULL; /* For simple keys like "global.timezone", auto-extract platform if no -p specified */ if (!platform) { /* Check if key contains a dot - if so, extract platform and key parts */ char *key_to_use = set_key ? set_key : read_key; if (key_to_use && strchr(key_to_use, '.')) { char *dot = strchr(key_to_use, '.'); int len = dot - key_to_use; char auto_platform[MAX_KEY]; char auto_key[MAX_KEY]; strncpy(auto_platform, key_to_use, len); auto_platform[len] = '\0'; strncpy(auto_key, dot + 1, MAX_KEY - 1); auto_key[MAX_KEY - 1] = '\0'; /* Use extracted platform and key */ if (set_value) { return cmd_ee_set(auto_key, set_value, auto_platform, rom); } else { return cmd_ee_read(auto_key, auto_platform, rom); } } /* No dot found - treat as standalone key (search all entries) */ if (read_key) { return cmd_ee_read(read_key, "", rom); } else if (set_key && set_value) { return cmd_ee_set(set_key, set_value, "", rom); } fprintf(stderr, "Error: -p required for platform-specific operations\n"); fprintf(stderr, " (or use 'platform.setting' format for auto-detection)\n"); return 1; } if (set_key && set_value) { return cmd_ee_set(set_key, set_value, platform, rom); } else if (read_key) { return cmd_ee_read(read_key, platform, rom); } else { fprintf(stderr, "Error: -s or -r required with -e\n"); print_usage(argv[0]); return 1; } } else { /* RetroArch config operations */ if (set_key && set_value) { return cmd_set(set_key, set_value, output_file); } else if (read_key) { return cmd_read(read_key, output_file); } else if (input_file) { return cmd_merge(input_file, output_file); } else { print_usage(argv[0]); return 1; } } } ================================================ FILE: packages/sx05re/tools/sysutils/eemount/package.mk ================================================ # SPDX-License-Identifier: GPL-3.0 # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="eemount" PKG_VERSION="7ec126a4dc2209eaa5c7cc25cd5e227b6157ae41" PKG_SHA256="4895c70bff8a3a9e1046d924cca71eadf5cb1774b63c2e48bab05635e26c690b" PKG_SITE="https://github.com/shantigilbert/eemount" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain systemd" PKG_LONGDESC="Multi-source ROMs mounting utility for EmuELEC" PKG_TOOLCHAIN="make" PKG_MAKE_OPTS_TARGET="LOGGING_ALL_TO_STDOUT=1" ================================================ FILE: packages/sx05re/tools/sysutils/empty/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="empty" PKG_VERSION="0.6.20b" PKG_SHA256="7e6636e400856984c4405ce7bd0843aaa3329fa3efd20c58df8400a9eaa35f09" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://empty.sourceforge.net/" PKG_DEPENDS_TARGET="toolchain linux" PKG_URL="http://downloads.sourceforge.net/sourceforge/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tgz" PKG_SECTION="sysutils" PKG_SHORTDESC="Run applications under pseudo-terminal sessions" PKG_LONGDESC="Run applications under pseudo-terminal sessions" PKG_IS_ADDON="no" PKG_AUTORECONF="no" make_target() { make CC=${CC} } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp empty ${INSTALL}/usr/bin/ } ================================================ FILE: packages/sx05re/tools/sysutils/evdev_tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present BetaXOi (https://github.com/BetaXOi) # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="evdev_tools" PKG_VERSION="" PKG_REV="1" PKG_ARCH="any" PKG_SITE="https://github.com/BetaXOi" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="emuelec" PKG_LONGDESC="A set of small evdev tools by https://github.com/BetaXOi" PKG_IS_ADDON="no" PKG_AUTORECONF="no" PKG_TOOLCHAIN="make" make_target() { cd ${PKG_BUILD}/ ${CC} -O2 evtest.c -o evtest ${CC} -O2 send.c -o evsend ${CC} -O2 remap.c -o evremap ${CC} -O2 evkill.c -o evkill } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/evtest ${INSTALL}/usr/bin cp ${PKG_BUILD}/evsend ${INSTALL}/usr/bin cp ${PKG_BUILD}/evremap ${INSTALL}/usr/bin cp ${PKG_BUILD}/evkill ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/tools/sysutils/evdev_tools/sources/evkill.c ================================================ /* Usage: evkill <-k, --keys keys> <-d, --device evdev> eg: evkill -k 304+305 -d /dev/input/event3 retroarch Signed-off-by: Ning Bo */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include void set_bit(char *mem, int key) { int8_t *byte = (int8_t *)mem + key / 8; *byte |= 1 << key % 8; } void clr_bit(char *mem, int key) { int8_t *byte = (int8_t *)mem + key / 8; *byte &= ~(1 << key % 8); } static const struct option long_options[] = { {"device", required_argument, NULL, 'd'}, {"keys", required_argument, NULL, 'k'}, {0, 0, 0, 0} }; char *js2evdev(char *joystick) { char *evdev = NULL; char *path = NULL; DIR *dir; struct dirent *ptr; asprintf(&path, "/sys/class/input/%s/device", basename(joystick)); dir = opendir(path); free(path); if (dir == NULL) { return NULL; } while((ptr = readdir(dir)) != NULL) { if (ptr->d_type == DT_DIR && strncmp(ptr->d_name, "event", 5) == 0) { asprintf(&evdev, "/dev/input/%s", ptr->d_name); } } return evdev; } int main(int argc, char* argv[]) { int ret = 0; int opt = 0; struct input_event ev; char *dev = NULL, *keys = NULL; char cmd[1024]; int size = (KEY_CNT - 1) / 8 + 1; char *bitmap0 = (char *)malloc(size); char *bitmap1 = (char *)malloc(size); memset(bitmap0, 0x0, size); memset(bitmap1, 0x0, size); while((opt = getopt_long(argc, argv, "d:k:", long_options, NULL)) != -1) { switch(opt) { case 'd': dev = strdup(optarg); break; case 'k': keys = strdup(optarg); break; default: printf("Usage: %s <-k, --keys keys> <-d, --device evdev or joystick> \n", argv[0]); exit(1); break; } } if (dev == NULL || keys== NULL || optind == argc) { printf("Usage: %s <-k, --keys keys> <-d, --device evdev or joystick> \n", argv[0]); exit(1); } strcpy(cmd, "killall "); int i; for (i = optind; i < argc; i++) { strcat(cmd, argv[i]); } char *str, *saveptr, *key; for (i = 0, str = keys; ; i++, str = NULL) { key = strtok_r(str, ",+", &saveptr); if (key == NULL) break; if (atoi(key) > KEY_MAX) continue; set_bit(bitmap0, atoi(key)); } while(1) { int fd, version, ready; ready = 0; do { fd = open(dev, O_RDONLY); if (fd > 0) { if (ioctl(fd, EVIOCGVERSION, &version)) { ready = 1; break; } } char *evdev = js2evdev(dev); if (!evdev) { break; } fd = open(evdev, O_RDONLY); free(evdev); if (fd > 0) { if (ioctl(fd, EVIOCGVERSION, &version) == 0) { ready = 1; break; } } } while(0); if (!ready) { sleep(1); continue; } while(1) { ret = read(fd, &ev, sizeof(struct input_event)); if (ret < 0) { perror("read"); break; } if (ev.type == EV_KEY) { if (ev.value == 0) { clr_bit(bitmap1, ev.code); continue; } else { set_bit(bitmap1, ev.code); } } if (memcmp(bitmap0, bitmap1, size) == 0) { memset(bitmap1, 0x0, size); /* printf("execute cmd: %s\n", cmd);*/ system(cmd); exit(0); } } close(fd); } return 0; } ================================================ FILE: packages/sx05re/tools/sysutils/evdev_tools/sources/evtest.c ================================================ /* evtest is used for show input event received. send is used for send BTN_A input event. Signed-off-by: Ning Bo */ #include #include #include #include #include #include #ifndef EV_SYN #define EV_SYN 0 #endif char *events[EV_MAX + 1] = { [0 ... EV_MAX] = NULL, [EV_SYN] = "Sync", [EV_KEY] = "Key", [EV_REL] = "Relative", [EV_ABS] = "Absolute", [EV_MSC] = "Misc", [EV_LED] = "LED", [EV_SND] = "Sound", [EV_REP] = "Repeat", [EV_FF] = "ForceFeedback", [EV_PWR] = "Power", [EV_FF_STATUS] = "ForceFeedbackStatus", }; char *keys[KEY_MAX + 1] = { [0 ... KEY_MAX] = NULL, [KEY_RESERVED] = "Reserved", [KEY_ESC] = "Esc", [KEY_1] = "1", [KEY_2] = "2", [KEY_3] = "3", [KEY_4] = "4", [KEY_5] = "5", [KEY_6] = "6", [KEY_7] = "7", [KEY_8] = "8", [KEY_9] = "9", [KEY_0] = "0", [KEY_MINUS] = "Minus", [KEY_EQUAL] = "Equal", [KEY_BACKSPACE] = "Backspace", [KEY_TAB] = "Tab", [KEY_Q] = "Q", [KEY_W] = "W", [KEY_E] = "E", [KEY_R] = "R", [KEY_T] = "T", [KEY_Y] = "Y", [KEY_U] = "U", [KEY_I] = "I", [KEY_O] = "O", [KEY_P] = "P", [KEY_LEFTBRACE] = "LeftBrace", [KEY_RIGHTBRACE] = "RightBrace", [KEY_ENTER] = "Enter", [KEY_LEFTCTRL] = "LeftControl", [KEY_A] = "A", [KEY_S] = "S", [KEY_D] = "D", [KEY_F] = "F", [KEY_G] = "G", [KEY_H] = "H", [KEY_J] = "J", [KEY_K] = "K", [KEY_L] = "L", [KEY_SEMICOLON] = "Semicolon", [KEY_APOSTROPHE] = "Apostrophe", [KEY_GRAVE] = "Grave", [KEY_LEFTSHIFT] = "LeftShift", [KEY_BACKSLASH] = "BackSlash", [KEY_Z] = "Z", [KEY_X] = "X", [KEY_C] = "C", [KEY_V] = "V", [KEY_B] = "B", [KEY_N] = "N", [KEY_M] = "M", [KEY_COMMA] = "Comma", [KEY_DOT] = "Dot", [KEY_SLASH] = "Slash", [KEY_RIGHTSHIFT] = "RightShift", [KEY_KPASTERISK] = "KPAsterisk", [KEY_LEFTALT] = "LeftAlt", [KEY_SPACE] = "Space", [KEY_CAPSLOCK] = "CapsLock", [KEY_F1] = "F1", [KEY_F2] = "F2", [KEY_F3] = "F3", [KEY_F4] = "F4", [KEY_F5] = "F5", [KEY_F6] = "F6", [KEY_F7] = "F7", [KEY_F8] = "F8", [KEY_F9] = "F9", [KEY_F10] = "F10", [KEY_NUMLOCK] = "NumLock", [KEY_SCROLLLOCK] = "ScrollLock", [KEY_KP7] = "KP7", [KEY_KP8] = "KP8", [KEY_KP9] = "KP9", [KEY_KPMINUS] = "KPMinus", [KEY_KP4] = "KP4", [KEY_KP5] = "KP5", [KEY_KP6] = "KP6", [KEY_KPPLUS] = "KPPlus", [KEY_KP1] = "KP1", [KEY_KP2] = "KP2", [KEY_KP3] = "KP3", [KEY_KP0] = "KP0", [KEY_KPDOT] = "KPDot", [KEY_ZENKAKUHANKAKU] = "Zenkaku/Hankaku", [KEY_102ND] = "102nd", [KEY_F11] = "F11", [KEY_F12] = "F12", [KEY_RO] = "RO", [KEY_KATAKANA] = "Katakana", [KEY_HIRAGANA] = "HIRAGANA", [KEY_HENKAN] = "Henkan", [KEY_KATAKANAHIRAGANA] = "Katakana/Hiragana", [KEY_MUHENKAN] = "Muhenkan", [KEY_KPJPCOMMA] = "KPJpComma", [KEY_KPENTER] = "KPEnter", [KEY_RIGHTCTRL] = "RightCtrl", [KEY_KPSLASH] = "KPSlash", [KEY_SYSRQ] = "SysRq", [KEY_RIGHTALT] = "RightAlt", [KEY_LINEFEED] = "LineFeed", [KEY_HOME] = "Home", [KEY_UP] = "Up", [KEY_PAGEUP] = "PageUp", [KEY_LEFT] = "Left", [KEY_RIGHT] = "Right", [KEY_END] = "End", [KEY_DOWN] = "Down", [KEY_PAGEDOWN] = "PageDown", [KEY_INSERT] = "Insert", [KEY_DELETE] = "Delete", [KEY_MACRO] = "Macro", [KEY_MUTE] = "Mute", [KEY_VOLUMEDOWN] = "VolumeDown", [KEY_VOLUMEUP] = "VolumeUp", [KEY_POWER] = "Power", [KEY_KPEQUAL] = "KPEqual", [KEY_KPPLUSMINUS] = "KPPlusMinus", [KEY_PAUSE] = "Pause", [KEY_KPCOMMA] = "KPComma", [KEY_HANGUEL] = "Hanguel", [KEY_HANJA] = "Hanja", [KEY_YEN] = "Yen", [KEY_LEFTMETA] = "LeftMeta", [KEY_RIGHTMETA] = "RightMeta", [KEY_COMPOSE] = "Compose", [KEY_STOP] = "Stop", [KEY_AGAIN] = "Again", [KEY_PROPS] = "Props", [KEY_UNDO] = "Undo", [KEY_FRONT] = "Front", [KEY_COPY] = "Copy", [KEY_OPEN] = "Open", [KEY_PASTE] = "Paste", [KEY_FIND] = "Find", [KEY_CUT] = "Cut", [KEY_HELP] = "Help", [KEY_MENU] = "Menu", [KEY_CALC] = "Calc", [KEY_SETUP] = "Setup", [KEY_SLEEP] = "Sleep", [KEY_WAKEUP] = "WakeUp", [KEY_FILE] = "File", [KEY_SENDFILE] = "SendFile", [KEY_DELETEFILE] = "DeleteFile", [KEY_XFER] = "X-fer", [KEY_PROG1] = "Prog1", [KEY_PROG2] = "Prog2", [KEY_WWW] = "WWW", [KEY_MSDOS] = "MSDOS", [KEY_COFFEE] = "Coffee", [KEY_DIRECTION] = "Direction", [KEY_CYCLEWINDOWS] = "CycleWindows", [KEY_MAIL] = "Mail", [KEY_BOOKMARKS] = "Bookmarks", [KEY_COMPUTER] = "Computer", [KEY_BACK] = "Back", [KEY_FORWARD] = "Forward", [KEY_CLOSECD] = "CloseCD", [KEY_EJECTCD] = "EjectCD", [KEY_EJECTCLOSECD] = "EjectCloseCD", [KEY_NEXTSONG] = "NextSong", [KEY_PLAYPAUSE] = "PlayPause", [KEY_PREVIOUSSONG] = "PreviousSong", [KEY_STOPCD] = "StopCD", [KEY_RECORD] = "Record", [KEY_REWIND] = "Rewind", [KEY_PHONE] = "Phone", [KEY_ISO] = "ISOKey", [KEY_CONFIG] = "Config", [KEY_HOMEPAGE] = "HomePage", [KEY_REFRESH] = "Refresh", [KEY_EXIT] = "Exit", [KEY_MOVE] = "Move", [KEY_EDIT] = "Edit", [KEY_SCROLLUP] = "ScrollUp", [KEY_SCROLLDOWN] = "ScrollDown", [KEY_KPLEFTPAREN] = "KPLeftParenthesis", [KEY_KPRIGHTPAREN] = "KPRightParenthesis", [KEY_F13] = "F13", [KEY_F14] = "F14", [KEY_F15] = "F15", [KEY_F16] = "F16", [KEY_F17] = "F17", [KEY_F18] = "F18", [KEY_F19] = "F19", [KEY_F20] = "F20", [KEY_F21] = "F21", [KEY_F22] = "F22", [KEY_F23] = "F23", [KEY_F24] = "F24", [KEY_PLAYCD] = "PlayCD", [KEY_PAUSECD] = "PauseCD", [KEY_PROG3] = "Prog3", [KEY_PROG4] = "Prog4", [KEY_SUSPEND] = "Suspend", [KEY_CLOSE] = "Close", [KEY_PLAY] = "Play", [KEY_FASTFORWARD] = "Fast Forward", [KEY_BASSBOOST] = "Bass Boost", [KEY_PRINT] = "Print", [KEY_HP] = "HP", [KEY_CAMERA] = "Camera", [KEY_SOUND] = "Sound", [KEY_QUESTION] = "Question", [KEY_EMAIL] = "Email", [KEY_CHAT] = "Chat", [KEY_SEARCH] = "Search", [KEY_CONNECT] = "Connect", [KEY_FINANCE] = "Finance", [KEY_SPORT] = "Sport", [KEY_SHOP] = "Shop", [KEY_ALTERASE] = "Alternate Erase", [KEY_CANCEL] = "Cancel", [KEY_BRIGHTNESSDOWN] = "Brightness down", [KEY_BRIGHTNESSUP] = "Brightness up", [KEY_MEDIA] = "Media", [KEY_UNKNOWN] = "Unknown", [BTN_0] = "Btn0", [BTN_1] = "Btn1", [BTN_2] = "Btn2", [BTN_3] = "Btn3", [BTN_4] = "Btn4", [BTN_5] = "Btn5", [BTN_6] = "Btn6", [BTN_7] = "Btn7", [BTN_8] = "Btn8", [BTN_9] = "Btn9", [BTN_LEFT] = "LeftBtn", [BTN_RIGHT] = "RightBtn", [BTN_MIDDLE] = "MiddleBtn", [BTN_SIDE] = "SideBtn", [BTN_EXTRA] = "ExtraBtn", [BTN_FORWARD] = "ForwardBtn", [BTN_BACK] = "BackBtn", [BTN_TASK] = "TaskBtn", [BTN_TRIGGER] = "Trigger", [BTN_THUMB] = "ThumbBtn", [BTN_THUMB2] = "ThumbBtn2", [BTN_TOP] = "TopBtn", [BTN_TOP2] = "TopBtn2", [BTN_PINKIE] = "PinkieBtn", [BTN_BASE] = "BaseBtn", [BTN_BASE2] = "BaseBtn2", [BTN_BASE3] = "BaseBtn3", [BTN_BASE4] = "BaseBtn4", [BTN_BASE5] = "BaseBtn5", [BTN_BASE6] = "BaseBtn6", [BTN_DEAD] = "BtnDead", [BTN_A] = "BtnA", [BTN_B] = "BtnB", [BTN_C] = "BtnC", [BTN_X] = "BtnX", [BTN_Y] = "BtnY", [BTN_Z] = "BtnZ", [BTN_TL] = "BtnTL", [BTN_TR] = "BtnTR", [BTN_TL2] = "BtnTL2", [BTN_TR2] = "BtnTR2", [BTN_SELECT] = "BtnSelect", [BTN_START] = "BtnStart", [BTN_MODE] = "BtnMode", [BTN_THUMBL] = "BtnThumbL", [BTN_THUMBR] = "BtnThumbR", [BTN_TOOL_PEN] = "ToolPen", [BTN_TOOL_RUBBER] = "ToolRubber", [BTN_TOOL_BRUSH] = "ToolBrush", [BTN_TOOL_PENCIL] = "ToolPencil", [BTN_TOOL_AIRBRUSH] = "ToolAirbrush", [BTN_TOOL_FINGER] = "ToolFinger", [BTN_TOOL_MOUSE] = "ToolMouse", [BTN_TOOL_LENS] = "ToolLens", [BTN_TOUCH] = "Touch", [BTN_STYLUS] = "Stylus", [BTN_STYLUS2] = "Stylus2", [BTN_TOOL_DOUBLETAP] = "Tool Doubletap", [BTN_TOOL_TRIPLETAP] = "Tool Tripletap", [BTN_GEAR_DOWN] = "WheelBtn", [BTN_GEAR_UP] = "Gear up", [KEY_OK] = "Ok", [KEY_SELECT] = "Select", [KEY_GOTO] = "Goto", [KEY_CLEAR] = "Clear", [KEY_POWER2] = "Power2", [KEY_OPTION] = "Option", [KEY_INFO] = "Info", [KEY_TIME] = "Time", [KEY_VENDOR] = "Vendor", [KEY_ARCHIVE] = "Archive", [KEY_PROGRAM] = "Program", [KEY_CHANNEL] = "Channel", [KEY_FAVORITES] = "Favorites", [KEY_EPG] = "EPG", [KEY_PVR] = "PVR", [KEY_MHP] = "MHP", [KEY_LANGUAGE] = "Language", [KEY_TITLE] = "Title", [KEY_SUBTITLE] = "Subtitle", [KEY_ANGLE] = "Angle", [KEY_ZOOM] = "Zoom", [KEY_MODE] = "Mode", [KEY_KEYBOARD] = "Keyboard", [KEY_SCREEN] = "Screen", [KEY_PC] = "PC", [KEY_TV] = "TV", [KEY_TV2] = "TV2", [KEY_VCR] = "VCR", [KEY_VCR2] = "VCR2", [KEY_SAT] = "Sat", [KEY_SAT2] = "Sat2", [KEY_CD] = "CD", [KEY_TAPE] = "Tape", [KEY_RADIO] = "Radio", [KEY_TUNER] = "Tuner", [KEY_PLAYER] = "Player", [KEY_TEXT] = "Text", [KEY_DVD] = "DVD", [KEY_AUX] = "Aux", [KEY_MP3] = "MP3", [KEY_AUDIO] = "Audio", [KEY_VIDEO] = "Video", [KEY_DIRECTORY] = "Directory", [KEY_LIST] = "List", [KEY_MEMO] = "Memo", [KEY_CALENDAR] = "Calendar", [KEY_RED] = "Red", [KEY_GREEN] = "Green", [KEY_YELLOW] = "Yellow", [KEY_BLUE] = "Blue", [KEY_CHANNELUP] = "ChannelUp", [KEY_CHANNELDOWN] = "ChannelDown", [KEY_FIRST] = "First", [KEY_LAST] = "Last", [KEY_AB] = "AB", [KEY_NEXT] = "Next", [KEY_RESTART] = "Restart", [KEY_SLOW] = "Slow", [KEY_SHUFFLE] = "Shuffle", [KEY_BREAK] = "Break", [KEY_PREVIOUS] = "Previous", [KEY_DIGITS] = "Digits", [KEY_TEEN] = "TEEN", [KEY_TWEN] = "TWEN", [KEY_DEL_EOL] = "Delete EOL", [KEY_DEL_EOS] = "Delete EOS", [KEY_INS_LINE] = "Insert line", [KEY_DEL_LINE] = "Delete line", }; char *absval[5] = { "Value", "Min ", "Max ", "Fuzz ", "Flat " }; char *relatives[REL_MAX + 1] = { [0 ... REL_MAX] = NULL, [REL_X] = "X", [REL_Y] = "Y", [REL_Z] = "Z", [REL_HWHEEL] = "HWheel", [REL_DIAL] = "Dial", [REL_WHEEL] = "Wheel", [REL_MISC] = "Misc", }; char *absolutes[ABS_MAX + 1] = { [0 ... ABS_MAX] = NULL, [ABS_X] = "X", [ABS_Y] = "Y", [ABS_Z] = "Z", [ABS_RX] = "Rx", [ABS_RY] = "Ry", [ABS_RZ] = "Rz", [ABS_THROTTLE] = "Throttle", [ABS_RUDDER] = "Rudder", [ABS_WHEEL] = "Wheel", [ABS_GAS] = "Gas", [ABS_BRAKE] = "Brake", [ABS_HAT0X] = "Hat0X", [ABS_HAT0Y] = "Hat0Y", [ABS_HAT1X] = "Hat1X", [ABS_HAT1Y] = "Hat1Y", [ABS_HAT2X] = "Hat2X", [ABS_HAT2Y] = "Hat2Y", [ABS_HAT3X] = "Hat3X", [ABS_HAT3Y] = "Hat 3Y", [ABS_PRESSURE] = "Pressure", [ABS_DISTANCE] = "Distance", [ABS_TILT_X] = "XTilt", [ABS_TILT_Y] = "YTilt", [ABS_TOOL_WIDTH] = "Tool Width", [ABS_VOLUME] = "Volume", [ABS_MISC] = "Misc", }; char *misc[MSC_MAX + 1] = { [ 0 ... MSC_MAX] = NULL, [MSC_SERIAL] = "Serial", [MSC_PULSELED] = "Pulseled", [MSC_GESTURE] = "Gesture", [MSC_RAW] = "RawData", [MSC_SCAN] = "ScanCode", }; char *leds[LED_MAX + 1] = { [0 ... LED_MAX] = NULL, [LED_NUML] = "NumLock", [LED_CAPSL] = "CapsLock", [LED_SCROLLL] = "ScrollLock", [LED_COMPOSE] = "Compose", [LED_KANA] = "Kana", [LED_SLEEP] = "Sleep", [LED_SUSPEND] = "Suspend", [LED_MUTE] = "Mute", [LED_MISC] = "Misc", }; char *repeats[REP_MAX + 1] = { [0 ... REP_MAX] = NULL, [REP_DELAY] = "Delay", [REP_PERIOD] = "Period" }; char *sounds[SND_MAX + 1] = { [0 ... SND_MAX] = NULL, [SND_CLICK] = "Click", [SND_BELL] = "Bell", [SND_TONE] = "Tone" }; char **names[EV_MAX + 1] = { [0 ... EV_MAX] = NULL, [EV_SYN] = events, [EV_KEY] = keys, [EV_REL] = relatives, [EV_ABS] = absolutes, [EV_MSC] = misc, [EV_LED] = leds, [EV_SND] = sounds, [EV_REP] = repeats, }; #define BITS_PER_LONG (sizeof(long) * 8) #define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1) #define OFF(x) ((x)%BITS_PER_LONG) #define BIT(x) (1UL<> OFF(bit)) & 1) int main (int argc, char **argv) { int fd, rd, i, j, k; struct input_event ev[64]; int version; unsigned short id[4]; unsigned long bit[EV_MAX][NBITS(KEY_MAX)]; char name[256] = "Unknown"; int abs[5]; if (argc < 2) { printf("Usage: evtest /dev/input/eventX\n"); printf("Where X = input device number\n"); return 1; } if ((fd = open(argv[argc - 1], O_RDONLY)) < 0) { perror("evtest"); return 1; } if (ioctl(fd, EVIOCGVERSION, &version)) { perror("evtest: can't get version"); return 1; } printf("Input driver version is %d.%d.%d\n", version >> 16, (version >> 8) & 0xff, version & 0xff); ioctl(fd, EVIOCGID, id); printf("Input device ID: bus 0x%x vendor 0x%x product 0x%x version 0x%x\n", id[ID_BUS], id[ID_VENDOR], id[ID_PRODUCT], id[ID_VERSION]); ioctl(fd, EVIOCGNAME(sizeof(name)), name); printf("Input device name: \"%s\"\n", name); memset(bit, 0, sizeof(bit)); ioctl(fd, EVIOCGBIT(0, EV_MAX), bit[0]); printf("Supported events:\n"); for (i = 0; i < EV_MAX; i++) if (test_bit(i, bit[0])) { printf(" Event type %d (%s)\n", i, events[i] ? events[i] : "?"); if (!i) continue; ioctl(fd, EVIOCGBIT(i, KEY_MAX), bit[i]); for (j = 0; j < KEY_MAX; j++) if (test_bit(j, bit[i])) { printf(" Event code %d (%s)\n", j, names[i] ? (names[i][j] ? names[i][j] : "?") : "?"); if (i == EV_ABS) { ioctl(fd, EVIOCGABS(j), abs); for (k = 0; k < 5; k++) if ((k < 3) || abs[k]) printf(" %s %6d\n", absval[k], abs[k]); } } } printf("Testing ... (interrupt to exit)\n"); while (1) { rd = read(fd, ev, sizeof(struct input_event) * 64); if (rd < (int) sizeof(struct input_event)) { printf("yyy\n"); perror("\nevtest: error reading"); return 1; } for (i = 0; i < rd / sizeof(struct input_event); i++) if (ev[i].type == EV_SYN) { printf("Event: time %ld.%06ld, -------------- %s ------------\n", ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].code ? "Config Sync" : "Report Sync" ); } else if (ev[i].type == EV_MSC && (ev[i].code == MSC_RAW || ev[i].code == MSC_SCAN)) { printf("Event: time %ld.%06ld, type %d (%s), code %d (%s), value %02x\n", ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].type, events[ev[i].type] ? events[ev[i].type] : "?", ev[i].code, names[ev[i].type] ? (names[ev[i].type][ev[i].code] ? names[ev[i].type][ev[i].code] : "?") : "?", ev[i].value); } else { printf("Event: time %ld.%06ld, type %d (%s), code %d (%s), value %d\n", ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].type, events[ev[i].type] ? events[ev[i].type] : "?", ev[i].code, names[ev[i].type] ? (names[ev[i].type][ev[i].code] ? names[ev[i].type][ev[i].code] : "?") : "?", ev[i].value); } } } ================================================ FILE: packages/sx05re/tools/sysutils/evdev_tools/sources/remap.c ================================================ /* * Signed-off-by: Ning Bo */ #include #include #include #include #include #include #include void remap(int src, int dst) { int ret = 0; int power = 0, back = 0; struct input_event ev, ev_pre, ev_end; while(1) { ret = read(src, &ev, sizeof(struct input_event)); if(ret != sizeof(struct input_event)) { perror("read"); break; } if (ev.value == 0xc0030) { ev_pre.time = ev.time; ev_pre.type = 4; ev_pre.code = 4; ev_pre.value = 0x9000b; power = 1; continue; } if (power==0 && ev.value==0xc0224) { ev_pre.time = ev.time; ev_pre.type = 4; ev_pre.code = 4; ev_pre.value = 0x9000b; back = 1; continue; } if (power) { write(dst, &ev_pre, sizeof(struct input_event)); ev.code = 0x13a; write(dst, &ev, sizeof(struct input_event)); ev_end.time = ev.time; ev_end.type = 0; ev_end.code = 0; ev_end.value = 0; write(dst, &ev_end, sizeof(struct input_event)); ev_pre.value = 0x9000c; write(dst, &ev_pre, sizeof(struct input_event)); ev.code = 0x13b; write(dst, &ev, sizeof(struct input_event)); write(dst, &ev_end, sizeof(struct input_event)); power = 0; continue; } if (back) { write(dst, &ev_pre, sizeof(struct input_event)); ev.code = 0x13a; write(dst, &ev, sizeof(struct input_event)); ev_end.time = ev.time; ev_end.type = 0; ev_end.code = 0; ev_end.value = 0; write(dst, &ev_end, sizeof(struct input_event)); back = 0; continue; } } close(src); close(dst); return; } int main(int argc, char *argv[]) { int fd_from = 0, fd_to = 0; if (argc != 3) { printf("usage: %s ", argv[0]); return 1; } while(1) { fd_from = open(argv[1], O_RDONLY); if(fd_from < 0) { perror("open from"); sleep(1); break; } fd_to = open(argv[2], O_WRONLY); if(fd_to < 0) { perror("open to"); sleep(1); break; } remap(fd_from, fd_to); } } ================================================ FILE: packages/sx05re/tools/sysutils/evdev_tools/sources/send.c ================================================ /* * Signed-off-by: Ning Bo */ #include #include #include #include #include #include #include #define BASE_VALUE 0x9000b #define BASE_CODE BTN_SELECT int main(int argc, char *argv[]) { int fd_to = -1, ret = -1; struct input_event ev, ev_pre, ev_end; struct timeval ts; if (argc != 2) { printf("usage: %s ", argv[0]); return 1; } char *to = argv[1]; fd_to = open(to, O_WRONLY); if(fd_to < 0) { perror("open to"); return -1; } int version; ioctl(fd_to, EVIOCGVERSION, &version); gettimeofday(&ts, NULL); ev_pre.time=ts; ev_pre.type=4; ev_pre.code=4; ev_pre.value=BASE_VALUE+(BTN_A-BTN_SELECT); write(fd_to, &ev_pre, sizeof(struct input_event)); ev.time=ts; ev.type=1; ev.code=BASE_CODE+(BTN_A-BTN_SELECT); ev.value=1; write(fd_to, &ev, sizeof(struct input_event)); ev_end.time=ev.time; ev_end.type=0; ev_end.code=0; ev_end.value=0; write(fd_to, &ev_end, sizeof(struct input_event)); sleep(1); gettimeofday(&ts, NULL); ev_pre.time=ts; write(fd_to, &ev_pre, sizeof(struct input_event)); ev.time=ts; ev.value=0; write(fd_to, &ev, sizeof(struct input_event)); ev_end.time=ts; write(fd_to, &ev_end, sizeof(struct input_event)); } ================================================ FILE: packages/sx05re/tools/sysutils/exfat/package.mk ================================================ # 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="exfat" PKG_VERSION="66747e2df0771b23ea30cbef3767f2b72488e914" PKG_SHA256="c83fedc3deaefde0d9549deb73ffc4b610d29ff23d39e5628114f67d267d0e82" PKG_LICENSE="GPLv2+" PKG_SITE="https://github.com/relan/exfat" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Free exFAT file system implementation." PKG_TOOLCHAIN="autotools" ================================================ FILE: packages/sx05re/tools/sysutils/exfat/patches/01-no-fuse.patch ================================================ diff -rupN exfat.orig/configure.ac exfat.new/configure.ac --- exfat.orig/configure.ac 2021-01-04 18:18:34.766169964 -0500 +++ exfat.new/configure.ac 2021-01-04 18:20:48.674744092 -0500 @@ -38,7 +38,6 @@ PKG_CHECK_MODULES([UBLIO], [libublio], [ AC_DEFINE([USE_UBLIO], [1], [Define if block devices are not supported.]) ], [:]) -PKG_CHECK_MODULES([FUSE], [fuse]) case "$host_os" in *-gnu) AC_DEFINE([_XOPEN_SOURCE], [500], [Enable pread() and pwrite().]) @@ -50,7 +49,6 @@ AC_CONFIG_FILES([ libexfat/Makefile dump/Makefile fsck/Makefile - fuse/Makefile label/Makefile mkfs/Makefile Makefile]) diff -rupN exfat.orig/configure.ac.orig exfat.new/configure.ac.orig --- exfat.orig/configure.ac.orig 1969-12-31 19:00:00.000000000 -0500 +++ exfat.new/configure.ac.orig 2021-01-04 18:19:10.778324347 -0500 @@ -0,0 +1,57 @@ +# +# configure.ac (30.03.15) +# Autoconf source. +# +# Free exFAT implementation. +# Copyright (C) 2010-2018 Andrew Nayenko +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# + +AC_INIT([Free exFAT implementation], + [1.3.0], + [relan@users.noreply.github.com], + [exfat], + [https://github.com/relan/exfat]) +AM_INIT_AUTOMAKE([1.11.2 -Wall -Werror foreign subdir-objects]) +AC_PROG_CC +AC_PROG_CC_C99 +AC_PROG_RANLIB +AM_PROG_AR +AC_SYS_LARGEFILE +AC_CANONICAL_HOST +PKG_CHECK_MODULES([UBLIO], [libublio], [ + CFLAGS="$CFLAGS $UBLIO_CFLAGS" + LIBS="$LIBS $UBLIO_LIBS" + AC_DEFINE([USE_UBLIO], [1], + [Define if block devices are not supported.]) +], [:]) +PKG_CHECK_MODULES([FUSE], [fuse]) +case "$host_os" in + *-gnu) + AC_DEFINE([_XOPEN_SOURCE], [500], [Enable pread() and pwrite().]) + AC_DEFINE([_DEFAULT_SOURCE], [], [Enable vsyslog().]) + ;; +esac +AC_CONFIG_HEADERS([libexfat/config.h]) +AC_CONFIG_FILES([ + libexfat/Makefile + dump/Makefile + fsck/Makefile + fuse/Makefile + label/Makefile + mkfs/Makefile + Makefile]) +AC_OUTPUT diff -rupN exfat.orig/Makefile.am exfat.new/Makefile.am --- exfat.orig/Makefile.am 2021-01-04 18:18:34.766169964 -0500 +++ exfat.new/Makefile.am 2021-01-04 18:19:10.778324347 -0500 @@ -20,4 +20,4 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # -SUBDIRS = libexfat dump fsck fuse label mkfs +SUBDIRS = libexfat dump fsck label mkfs diff -rupN exfat.orig/patch exfat.new/patch --- exfat.orig/patch 1969-12-31 19:00:00.000000000 -0500 +++ exfat.new/patch 2021-01-04 18:18:55.522258946 -0500 @@ -0,0 +1,26 @@ +diff --git configure.ac configure.ac +--- configure.ac 2018-09-15 07:03:24.000000000 +0200 ++++ configure.ac 2019-10-28 18:02:19.792588993 +0100 +@@ -37,13 +37,11 @@ + AC_DEFINE([USE_UBLIO], [1], + [Define if block devices are not supported.]) + ], [:]) +-PKG_CHECK_MODULES([FUSE], [fuse]) + AC_CONFIG_HEADERS([libexfat/config.h]) + AC_CONFIG_FILES([ + libexfat/Makefile + dump/Makefile + fsck/Makefile +- fuse/Makefile + label/Makefile + mkfs/Makefile + Makefile]) +diff --git Makefile.am Makefile.am +--- Makefile.am 2018-09-15 07:03:24.000000000 +0200 ++++ Makefile.am 2019-10-28 18:02:19.785922319 +0100 +@@ -20,4 +20,4 @@ + # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + # + +-SUBDIRS = libexfat dump fsck fuse label mkfs ++SUBDIRS = libexfat dump fsck label mkfs ================================================ FILE: packages/sx05re/tools/sysutils/exfat-linux/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="exfat-linux" PKG_VERSION="29fdcd25f82439e49d03ed2d5c7d0fd0906f3cb8" PKG_SHA256="15d5bff755733442546aec119d7a05e2166af2d034ff0698677e914efe35e1d6" PKG_SITE="https://github.com/arter97/exfat-linux" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="exFAT filesystem module for Linux kernel, for extraction in linux package only, DO NOT BUILD" PKG_TOOLCHAIN="manual" unpack() { # This package should not be built, and should not be unpacked to the build dir : } ================================================ FILE: packages/sx05re/tools/sysutils/fbdump/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="fbdump" PKG_VERSION="0.4.2" PKG_SHA256="c4d521a86229b3106cf69786008ad94f899da5288a19a067deae84951880722d" PKG_LICENSE="GPL" PKG_SITE="http://www.rcdrummond.net/fbdump" PKG_URL="${PKG_SITE}/fbdump-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="fbdump is a simple tool that captures the contents of the visible portion of the Linux framebuffer device and writes it to the standard output as a PPM file." PKG_TOOLCHAIN="autotools" pre_configure_target() { # for some reason this was failing with undefined reference to 'rpl_malloc' so we remove the check cd ${PKG_BUILD} sed -i "s|AC_FUNC_MALLOC||" configure.in } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp src/fbdump ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/tools/sysutils/fbfix/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="fbfix" PKG_VERSION="v1" PKG_LICENSE="Public Domain" PKG_SITE="https://forum.odroid.com/viewtopic.php?t=34827" PKG_DEPENDS_TARGET="toolchain" PKG_SHORTDESC="A workaround used to fix framebuffer issues on s922x kernel v4.x" PKG_TOOLCHAIN="manual" make_target() { ${CC} -O2 fbfix.c -o fbfix } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp fbfix ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/tools/sysutils/fbfix/sources/fbfix.c ================================================ /* by crashoverride https://forum.odroid.com/viewtopic.php?p=254904#p254904 */ #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } // Validate argument if (strlen(argv[1]) != 1 || !isdigit(argv[1][0])) { fprintf(stderr, "Error: framebuffer index must be a single digit (0-3)\n"); return 1; } int fb_index = argv[1][0] - '0'; if (fb_index < 0 || fb_index > 3) { fprintf(stderr, "Error: framebuffer index must be between 0 and 3\n"); return 1; } int fbfd = 0; struct fb_var_screeninfo vinfo; struct fb_fix_screeninfo finfo; // Build framebuffer path char fb_path[16]; snprintf(fb_path, sizeof(fb_path), "/dev/fb%d", fb_index); /* Open the file for reading and writing */ fbfd = open(fb_path, O_RDWR); if (!fbfd) { printf("Error: cannot open framebuffer device.\n"); exit(1); } printf("The framebuffer device was opened successfully.\n"); /* Get fixed screen information */ if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) { printf("Error reading fixed information.\n"); exit(2); } /* Get variable screen information */ if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) { printf("Error reading variable information.\n"); exit(3); } printf("vinfo.yoffset=%d\n", vinfo.yoffset); if (vinfo.yoffset != 0) { printf("FIX: setting vinfo.yoffset=0.\n"); vinfo.yoffset = 0; if (ioctl(fbfd, FBIOPUT_VSCREENINFO, &vinfo)) { printf("Error setting variable information.\n"); exit(4); } } return 0; } ================================================ FILE: packages/sx05re/tools/sysutils/fbgrab/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="fbgrab" PKG_VERSION="74373aafc0b496e67642562d86eac6b858a31f24" PKG_SHA256="c6199223c001bb47950a157be9877f54b20211cacd05c0256a08769e9fe0f190" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/GunnarMonell/fbgrab" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libpng fbdump" PKG_LONGDESC="fbgrab linux framebuffer screenshot utility. " PKG_TOOLCHAIN="make" pre_configure_target() { sed -i "s|-Wall|-Wall -lm|" Makefile } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp fbgrab ${INSTALL}/usr/bin cp screenshot.sh ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/tools/sysutils/fbgrab/sources/screenshot.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) . /etc/profile SCREENDIR="/storage/roms/screenshots" FILENAME=$(date "+%Y%m%d%H%M%S%3N") # Make sure folder exists mkdir -p "${SCREENDIR}" # Take screenshot cd "${SCREENDIR}" if [[ "$EE_DEVICE" == "OdroidGoAdvance" || "$EE_DEVICE" == "GameForce" || "$EE_DEVICE" == "RK3568" ]]; then fbdump > "${FILENAME}.pbm" convert "${FILENAME}.pbm" "${FILENAME}.png" rm "${FILENAME}.pbm" else fbgrab -z 0 "${FILENAME}.png" fi ================================================ FILE: packages/sx05re/tools/sysutils/fbterm/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="fbterm" PKG_VERSION="ef9a13146e24c059fa44151e2a0a22b9762853bc" PKG_SHA256="149c9fd243b6f93a0e907c8adf281e6e308d15be6a30fc0b1081755c0bc44dbc" PKG_LICENSE="GPLv2+" PKG_SITE="https://github.com/sfzhi/fbterm" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain freetype fontconfig" PKG_LONGDESC=" fbterm is a framebuffer based terminal emulator for linux " PKG_TOOLCHAIN="configure" pre_configure_target() { cd .. rm -rf .${TARGET_NAME} } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -rf ${PKG_BUILD}/src/fbterm ${INSTALL}/usr/bin #mkdir -p ${INSTALL}/usr/share/terminfo #cp -rf ${PKG_DIR}/terminfo/* ${INSTALL}/usr/share/terminfo/ #tic ${PKG_BUILD}/terminfo/fbterm -o ${INSTALL}/usr/share/terminfo # mv ${INSTALL}/usr/share/terminfo/f/fbterm ${INSTALL}/usr/share/terminfo/f/linux # mv ${INSTALL}/usr/share/terminfo/f ${INSTALL}/usr/share/terminfo/l # mkdir -p ${INSTALL}/usr/share/terminfo/f/ # cp ${PKG_BUILD}/terminfo/fbterm ${INSTALL}/usr/share/terminfo/f/ } ================================================ FILE: packages/sx05re/tools/sysutils/fbterm/patches/0001-fbio.cpp-improxy.cpp-fbterm.cpp-fix-musl-compile.patch ================================================ From 1072d60c6c8f1f51feb740527a8a056bfead9318 Mon Sep 17 00:00:00 2001 From: Peter Seiderer Date: Thu, 8 Oct 2015 19:53:47 +0200 Subject: [PATCH] fbio.cpp, improxy.cpp, fbterm.cpp: fix musl compile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - add missing include, fixes: fbio.cpp:33:8: error: ‘fd_set’ does not name a type static fd_set fds; improxy.cpp:439:3: error: ‘fd_set’ was not declared in this scope - add missing WAIT_ANY define, fixes: fbterm.cpp: In member function ‘void FbTerm::processSignal(u32)’: fbterm.cpp:212:22: error: ‘WAIT_ANY’ was not declared in this scope s32 pid = waitpid(WAIT_ANY, 0, WNOHANG); Signed-off-by: Peter Seiderer --- src/fbio.cpp | 1 + src/fbterm.cpp | 4 ++++ src/improxy.cpp | 1 + 3 files changed, 6 insertions(+) diff --git a/src/fbio.cpp b/src/fbio.cpp index e5afc44..88c632c 100644 --- a/src/fbio.cpp +++ b/src/fbio.cpp @@ -30,6 +30,7 @@ #define NR_EPOLL_FDS 10 s32 epollFd; #else +#include static fd_set fds; static u32 maxfd = 0; #endif diff --git a/src/fbterm.cpp b/src/fbterm.cpp index 38d4014..60288e4 100644 --- a/src/fbterm.cpp +++ b/src/fbterm.cpp @@ -37,6 +37,10 @@ #include "input_key.h" #include "mouse.h" +#ifndef WAIT_ANY +#define WAIT_ANY (-1) +#endif + #ifdef HAVE_SIGNALFD // offered by some systems has bug with g++ #include "signalfd.h" diff --git a/src/improxy.cpp b/src/improxy.cpp index 3d03e66..4e046d2 100644 --- a/src/improxy.cpp +++ b/src/improxy.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include "improxy.h" #include "immessage.h" -- 2.1.4 ================================================ FILE: packages/sx05re/tools/sysutils/fbterm/patches/gcc-6-build-fixes.patch ================================================ From 69917d25c6f718572433262d86691bf24e72e4c8 Mon Sep 17 00:00:00 2001 From: Nobuhiro Iwamatsu Date: Wed, 13 Jul 2016 12:02:10 +0900 Subject: [PATCH] Fix build with gcc-6 Signed-off-by: Nobuhiro Iwamatsu --- src/lib/vterm.cpp | 4 ++-- src/lib/vterm_states.cpp | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/lib/vterm.cpp b/src/lib/vterm.cpp index 3a5dcc7..f79f44c 100644 --- a/src/lib/vterm.cpp +++ b/src/lib/vterm.cpp @@ -68,13 +68,13 @@ u8 VTerm::control_map[MAX_CONTROL_CODE], VTerm::escape_map[NR_STATES][MAX_ESCAPE void VTerm::init_state() { - for (u8 i = 1; control_sequences[i].code != (u16)-1; i++) { + for (u8 i = 1; control_sequences[i].code != (u16)0xFFFF; i++) { control_map[control_sequences[i].code] = i; } u8 state = ESnormal; for (u8 i = 1; ; i++) { - if (escape_sequences[i].code == (u16)-1) { + if (escape_sequences[i].code == (u16)0xFFFF) { state++; if (state == NR_STATES) break; } else { diff --git a/src/lib/vterm_states.cpp b/src/lib/vterm_states.cpp index 49e7588..6aaa8b3 100644 --- a/src/lib/vterm_states.cpp +++ b/src/lib/vterm_states.cpp @@ -39,14 +39,14 @@ const VTerm::Sequence VTerm::control_sequences[] = { { 0x1B, 0, ESesc }, { 0x7F, 0, ESkeep }, { 0x9B, 0, ESsquare }, - { -1} + { 0xFFFF} }; const VTerm::Sequence VTerm::escape_sequences[] = { { 0, 0, ESnormal }, // ESnormal - { -1 }, + { 0xFFFF }, // ESesc { '[', &VTerm::clear_param, ESsquare }, @@ -65,7 +65,7 @@ const VTerm::Sequence VTerm::escape_sequences[] = { { '8', &VTerm::restore_cursor, ESnormal }, { '>', &VTerm::keypad_numeric, ESnormal }, { '=', &VTerm::keypad_application, ESnormal }, - { -1 }, + { 0xFFFF }, // ESsquare { '[', 0, ESfunckey }, @@ -104,7 +104,7 @@ const VTerm::Sequence VTerm::escape_sequences[] = { { '`', &VTerm::cursor_position_col, ESnormal }, { ']', &VTerm::linux_specific, ESnormal }, { '}', &VTerm::fbterm_specific, ESnormal }, - { -1 }, + { 0xFFFF }, // ESnonstd { '0' | ADDSAME(9), &VTerm::set_palette, ESkeep }, @@ -112,25 +112,25 @@ const VTerm::Sequence VTerm::escape_sequences[] = { { 'a' | ADDSAME(5), &VTerm::set_palette, ESkeep }, { 'P', &VTerm::begin_set_palette, ESkeep }, { 'R', &VTerm::reset_palette, ESnormal }, - { -1 }, + { 0xFFFF }, // ESpercent { '@', &VTerm::clear_utf8, ESnormal }, { 'G', &VTerm::set_utf8, ESnormal }, { '8', &VTerm::set_utf8, ESnormal }, - { -1 }, + { 0xFFFF }, // EScharset { '0', &VTerm::set_charset, ESnormal }, { 'B', &VTerm::set_charset, ESnormal }, { 'U', &VTerm::set_charset, ESnormal }, { 'K', &VTerm::set_charset, ESnormal }, - { -1 }, + { 0xFFFF }, // EShash { '8', &VTerm::screen_align, ESnormal }, - { -1 }, + { 0xFFFF }, // ESfunckey - { -1 }, + { 0xFFFF }, }; -- 2.8.1 ================================================ FILE: packages/sx05re/tools/sysutils/freeimage/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) PKG_NAME="freeimage" PKG_VERSION="3180" PKG_SHA256="f41379682f9ada94ea7b34fe86bf9ee00935a3147be41b6569c9605a53e438fd" PKG_LICENSE="GPLv3" PKG_SITE="http://freeimage.sourceforge.net/" PKG_URL="${SOURCEFORGE_SRC}/${PKG_NAME}/FreeImage${PKG_VERSION}.zip" PKG_DEPENDS_TARGET="toolchain" PKG_SOURCE_DIR="FreeImage" PKG_LONGDESC="FreeImage library" pre_make_target() { export CXXFLAGS="${CXXFLAGS} -Wno-narrowing -std=c++11" export CFLAGS="${CFLAGS} -DPNG_ARM_NEON_OPT=0" } ================================================ FILE: packages/sx05re/tools/sysutils/freeimage/patches/freeimage-02-makefix.patch ================================================ --- a/Makefile.gnu 2016-03-21 16:07:00.122741950 +0100 +++ b/Makefile.gnu 2016-03-21 16:07:25.745733760 +0100 @@ -71,9 +71,9 @@ install: install -d $(INCDIR) $(INSTALLDIR) - install -m 644 -o root -g root $(HEADER) $(INCDIR) - install -m 644 -o root -g root $(STATICLIB) $(INSTALLDIR) - install -m 755 -o root -g root $(SHAREDLIB) $(INSTALLDIR) + install -m 644 $(HEADER) $(INCDIR) + install -m 644 $(STATICLIB) $(INSTALLDIR) + install -m 755 $(SHAREDLIB) $(INSTALLDIR) ln -sf $(SHAREDLIB) $(INSTALLDIR)/$(VERLIBNAME) ln -sf $(VERLIBNAME) $(INSTALLDIR)/$(LIBNAME) # ldconfig ================================================ FILE: packages/sx05re/tools/sysutils/git/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="git" PKG_VERSION="2.39.2" PKG_SHA256="fb6807d1eb4094bb2349ab97d203fe1e6c3eb28af73ea391decfbd3a03c02e85" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://git-scm.com/" PKG_URL="https://mirrors.edge.kernel.org/pub/software/scm/git/git-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain openssl pcre curl libiconv zlib" PKG_SECTION="emuelec" PKG_SHORTDESC="Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. " PKG_LONGDESC="Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. " PKG_CONFIGURE_OPTS_TARGET="ac_cv_fread_reads_directories=yes \ ac_cv_snprintf_returns_bogus=yes \ ac_cv_iconv_omits_bom=yes" pre_configure_target() { cd .. rm -rf .${TARGET_NAME} } ================================================ FILE: packages/sx05re/tools/sysutils/gptokeyb/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="gptokeyb" PKG_VERSION="9cf438275c87ca3542b2ce34b1a043663d3be005" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/EmuELEC/gptokeyb" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 libevdev" PKG_SECTION="emuelec" PKG_SHORTDESC="Gamepad to Keyboard/mouse/xbox360 emulator" PKG_TOOLCHAIN="make" pre_configure_target() { sed -i "s|\`sdl2-config|\`${SYSROOT_PREFIX}/usr/bin/sdl2-config|g" Makefile sed -i "s|\-I/usr/include/libevdev-1.0|\-I${SYSROOT_PREFIX}/usr/include/libevdev-1.0|g" Makefile } makeinstall_target(){ mkdir -p ${INSTALL}/usr/bin cp gptokeyb ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/gptokeyb cp -rf ${PKG_BUILD}/configs/*.gptk ${INSTALL}/usr/config/emuelec/configs/gptokeyb } ================================================ FILE: packages/sx05re/tools/sysutils/grep/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="grep" PKG_VERSION="3.11" PKG_SHA256="1f31014953e71c3cddcedb97692ad7620cb9d6d04fbdc19e0d8dd836f87622bb" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://ftp.gnu.org/gnu/${PKG_NAME}" PKG_URL="${PKG_SITE}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SHORTDESC="Grep" PKG_TOOLCHAIN="configure" PKG_NEED_UNPACK="$(get_pkg_directory busybox)" pre_configure_target() { PKG_CONFIGURE_OPTS_TARGET="--enable-perl-regexp=yes" } ================================================ FILE: packages/sx05re/tools/sysutils/iotop/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="iotop" PKG_VERSION="4602ed3353a6479b1b7a3adfba84e09124c90d38" PKG_SHA256="0d3593714011197e32f56953ae1dc21079126a614f90caa2a58d118137f1e8af" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/Tomas-M/iotop" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ncurses" PKG_LONGDESC="A top utility for IO " PKG_TOOLCHAIN="make" ================================================ FILE: packages/sx05re/tools/sysutils/joyutils/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="joyutils" PKG_VERSION="b6703ebf04c839fc47f9e490b68c4d5d885f32f9" PKG_SHA256="73914d760d44542fa5b88ab42f914713e07e184c299415fdbe8abd83e68dc200" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/datrh/joyutils" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="tools" PKG_SHORTDESC="jscal, jstest, and jsattach utilities for the Linux joystick driver" PKG_LONGDESC="jscal, jstest, and jsattach utilities for the Linux joystick driver" PKG_IS_ADDON="no" PKG_AUTORECONF="no" # post_unpack() { # mv ${BUILD}/joystick-${PKG_VERSION} ${BUILD}/${PKG_NAME}-${PKG_VERSION} # } make_target() { ${CC} -lm -o jscal jscal.c ${CFLAGS} ${CC} -lm -o jstest jstest.c ${CFLAGS} ${CC} -lm -o jsattach jsattach.c ${CFLAGS} } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp jscal ${INSTALL}/usr/bin/ cp jstest ${INSTALL}/usr/bin/ cp jsattach ${INSTALL}/usr/bin/ } ================================================ FILE: packages/sx05re/tools/sysutils/jslisten/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="jslisten" PKG_VERSION="f6842f6be8ffff2013ce4a7f56b421bed61c269c" PKG_SHA256="9ad886915544ca620b751de65fd8337613de94c742fbac550d13d8a6f692dea3" PKG_LICENSE="GPL3" PKG_SITE="https://github.com/shantigilbert/jslisten" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_GIT_CLONE_BRANCH="EmuELEC" PKG_DEPENDS_TARGET="toolchain systemd" PKG_LONGDESC="listen to gamepad inputs and trigger a command, cloned from https://github.com/workinghard/jslisten" PKG_TOOLCHAIN="make" make_target() { mkdir bin make } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp bin/jslisten ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/tools/sysutils/light/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="light" PKG_VERSION="33f2316e5512762a5a33a62c78db7a435d9fec9b" PKG_LICENSE="GPL3" PKG_SITE="https://github.com/haikarainen/light" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Light - A program to control backlights (and other hardware lights) in GNU/Linux" PKG_TOOLCHAIN="configure" pre_configure_target() { ./autogen.sh } ================================================ FILE: packages/sx05re/tools/sysutils/luajit/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019 Trond Haugland (github.com/escalade) PKG_NAME="luajit" PKG_VERSION="99168476b9f6e1910057181428f2225b09458747" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/moonjit/moonjit" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain luajit:host" PKG_SHORTDESC="LuaJIT is a Just-In-Time Compiler (JIT) for the Lua programming language. " GET_HANDLER_SUPPORT="git" PKG_GIT_CLONE_BRANCH="v2.1" PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="+speed" post_patch() { mkdir -p ${PKG_BUILD}/.${TARGET_NAME} && cp -r ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME} mkdir -p ${PKG_BUILD}/.${HOST_NAME} && cp -r ${PKG_BUILD}/* ${PKG_BUILD}/.${HOST_NAME} } makeinstall_host() { cd .${HOST_NAME} make amalg make PREFIX=/ DESTDIR=${TOOLCHAIN} install VER=$(grep LUAJIT_VERSION src/luajit.h | head -n1 | cut -d \" -f 2 | cut -d " " -f 2) ln -sf luajit-${VER} ${TOOLCHAIN}/bin/luajit } makeinstall_target() { cd .${TARGET_NAME} unset CFLAGS [ "${ARCH}" = "arm" ] && BIT="-m32" make PREFIX="/usr" \ CC="${CC} -fPIC" \ TARGET_LD="${CC}" \ TARGET_AR="${AR} rcus" \ TARGET_STRIP=true \ TARGET_CFLAGS="${TARGET_CFLAGS}" \ TARGET_LDFLAGS="${LDFLAGS}" \ HOST_CC="${HOST_CC} ${BIT}" \ HOST_CFLAGS="${CFLAGS}" \ HOST_LDFLAGS="${LDFLAGS}" \ XCFLAGS= \ ${JITARCH} \ amalg make PREFIX=/usr DESTDIR=${INSTALL} install make PREFIX=/usr DESTDIR=${SYSROOT_PREFIX} install VER=$(grep LUAJIT_VERSION src/luajit.h | head -n1 | cut -d \" -f 2 | cut -d " " -f 2) ln -sf /usr/bin/luajit-${VER} ${INSTALL}/usr/bin/lua } ================================================ FILE: packages/sx05re/tools/sysutils/luajit/patches/luajit-crosscompile.patch ================================================ --- a/src/host/buildvm.c 2019-11-19 18:33:03.914237086 +0100 +++ b/src/host/buildvm.c 2019-11-19 18:33:08.837645902 +0100 @@ -434,12 +434,6 @@ BuildCtx *ctx = &ctx_; int status, binmode; - if (sizeof(void *) != 4*LJ_32+8*LJ_64) { - fprintf(stderr,"Error: pointer size mismatch in cross-build.\n"); - fprintf(stderr,"Try: make HOST_CC=\"gcc -m32\" CROSS=...\n\n"); - return 1; - } - UNUSED(argc); parseargs(ctx, argv); ================================================ FILE: packages/sx05re/tools/sysutils/munt/munt_alsadrv/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2024-present EmuELEC (https://github.com/emuelec) PKG_NAME="munt_alsadrv" PKG_VERSION="$(get_pkg_version munt)" PKG_NEED_UNPACK="$(get_pkg_directory munt)" PKG_LICENSE="GPL" PKG_SITE="https://github.com/munt/munt" PKG_URL="" PKG_DEPENDS_TARGET="toolchain munt" PKG_LONGDESC="A software synthesiser emulating pre-GM MIDI devices such as the Roland MT-32." PKG_TOOLCHAIN="make" unpack() { ${SCRIPTS}/get munt mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/munt/munt-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } make_target() { cd ${PKG_BUILD}/mt32emu_alsadrv make mt32d } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin/ cp ${PKG_BUILD}/mt32emu_alsadrv/mt32d ${INSTALL}/usr/bin/ } ================================================ FILE: packages/sx05re/tools/sysutils/munt/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 0riginally created by Escalade (https://github.com/escalade) # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) PKG_NAME="munt" PKG_VERSION="1cdac309f420ca224e59e2952f5521759508d2eb" PKG_SHA256="cad4c7b224f315051e01a8c6b27b42941fc1818766c3c69df773e788bc39f0b6" PKG_LICENSE="GPL" PKG_SITE="https://github.com/munt/munt" PKG_URL="https://github.com/munt/munt/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A software synthesiser emulating pre-GM MIDI devices such as the Roland MT-32." PKG_CMAKE_OPTS_TARGET="-Dmunt_WITH_MT32EMU_QT=OFF \ -Dmunt_WITH_MT32EMU_SMF2WAV=0 \ -Dlibmt32emu_SHARED=1" ================================================ FILE: packages/sx05re/tools/sysutils/patchelf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="patchelf" PKG_VERSION="47dc18d0e5c1ff24f815177927940c294b1fde76" PKG_SHA256="4799c754930293281966426f0aae596a629d1a1b77612f92b8ff8a98063d511c" PKG_LICENSE="OSS" PKG_SITE="https://github.com/NixOS/patchelf" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="A small utility to modify the dynamic linker and RPATH of ELF executables" PKG_TOOLCHAIN="configure" pre_configure_target() { ./bootstrap.sh } ================================================ FILE: packages/sx05re/tools/sysutils/physfs/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="physfs" PKG_VERSION="0145431345058282ec77ffb4240b2f5947a7dc4a" PKG_ARCH="any" PKG_LICENSE="OSS" PKG_SITE="https://github.com/criptych/physfs" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain glm ncurses" PKG_SHORTDESC="PhysicsFS; a portable, flexible file i/o abstraction." GET_HANDLER_SUPPORT="git" ================================================ FILE: packages/sx05re/tools/sysutils/poppler/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Copyright (C) 2023-present Guoxin "7Ji" Pu (https://github.com/7Ji) PKG_NAME="poppler" PKG_VERSION="23.04.0" _PKG_TAG="${PKG_NAME}-${PKG_VERSION}" PKG_SHA256="61ab8a8da0ae2bd6f8e7e6f60d5970f7f87cd790c1620f0fe6fbcbdc095c7571" PKG_LICENSE="GPL" PKG_SITE="https://gitlab.freedesktop.org/poppler/poppler" PKG_URL="${PKG_SITE}/-/archive/${_PKG_TAG}/${PKG_NAME}-${_PKG_TAG}.tar.gz" PKG_DEPENDS_TARGET="toolchain zlib libpng libjpeg-turbo boost freetype fontconfig glib glib:host" PKG_LONGDESC="The poppler pdf rendering library " PKG_TOOLCHAIN="cmake" pre_configure_target() { PKG_CMAKE_OPTS_TARGET="-DCMAKE_BUILD_TYPE=release \ -DENABLE_LIBOPENJPEG=none \ -DENABLE_GLIB=ON \ -DENABLE_QT5=off \ -DENABLE_CPP=off" # Disable "gobject-introspection" sed -i "s|set(HAVE_INTROSPECTION \${INTROSPECTION_FOUND})|set(HAVE_INTROSPECTION "NO")|g" ${PKG_BUILD}/CMakeLists.txt } post_makeinstall_target() { mkdir -p ${INSTALL}/usr/bin/batocera ln -sf /usr/bin/pdftoppm ${INSTALL}/usr/bin/batocera/pdftoppm ln -sf /usr/bin/pdfinfo ${INSTALL}/usr/bin/batocera/pdfinfo } ================================================ FILE: packages/sx05re/tools/sysutils/progressor/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="progressor" PKG_VERSION="151f47a07b13cb37faf3e9a144691f44c7370161" PKG_LICENSE="GPL-2.0" PKG_SITE="https://github.com/JohnnyonFlame/progressor" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_SHORTDESC="Simple ImGui application to display patching progress and queries." PKG_TOOLCHAIN="cmake" makeinstall_target(){ mkdir -p ${INSTALL}/usr/bin cp progressor ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/tools/sysutils/progressor/patches/gles.patch ================================================ --- a/src/main.cpp +++ b/src/main.cpp @@ -40,19 +40,11 @@ const char* glsl_version_core_32 = "#version 150"; static int create_gl_context(int width, int height, bool is_es2) { - if (is_es2) { SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); glsl_version = glsl_version_es_20; - } else { - SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); // Always required on Mac - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); - glsl_version = glsl_version_core_32; - } sdl_win = SDL_CreateWindow("Progress", 0, 0, width, height, SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN_DESKTOP); if (!sdl_win) { ================================================ FILE: packages/sx05re/tools/sysutils/pygame/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="pygame" PKG_VERSION="ee0fc698531a0c14f3e6a06734d35f8460ab71f4" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/pygame/pygame" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_mixer SDL2_net SDL2_ttf libpng libjpeg-turbo Python3" PKG_LONGDESC="pygame (the library) is a Free and Open Source python programming language library for making multimedia applications like games built on top of the excellent SDL library. C, Python, Native, OpenGL. " PKG_TOOLCHAIN="manual" pre_make_target() { export PYTHONXCPREFIX="${SYSROOT_PREFIX}/usr" export LDFLAGS="${LDFLAGS} -L${SYSROOT_PREFIX}/usr/lib -L${SYSROOT_PREFIX}/lib" export LDSHARED="${CC} -shared" sed -i "s|sdl2-config|${SYSROOT_PREFIX}/usr/bin/sdl2-config|g" ${PKG_BUILD}/buildconfig/config_unix.py sed -i "s|freetype-config|${SYSROOT_PREFIX}/usr/bin/freetype-config|g" ${PKG_BUILD}/buildconfig/config_unix.py sed -i "s|raise SystemExit(\"Missing dependencies\")||g" ${PKG_BUILD}/buildconfig/config_unix.py } make_target() { LOCALBASE="${SYSROOT_PREFIX}/usr" python3 setup.py build } makeinstall_target() { python3 setup.py install --root=${INSTALL} --prefix=/usr } post_makeinstall_target() { find ${INSTALL}/usr/lib/python*/site-packages/ -name "*.pyc" -exec rm -rf {} ";" } ================================================ FILE: packages/sx05re/tools/sysutils/python-evdev/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 0riginally created by Escalade (https://github.com/escalade) # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) PKG_NAME="python-evdev" PKG_VERSION="2dd6ce6364bb67eedb209f6aa0bace0c18a3a40a" PKG_LICENSE="OSS" PKG_SITE="https://github.com/gvalkov/python-evdev" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain Python3:host Python3 distutilscross:host" PKG_LONGDESC="Userspace evdev events" PKG_TOOLCHAIN="manual" PKG_GIT_CLONE_BRANCH="main" pre_make_target() { export PYTHONXCPREFIX="${SYSROOT_PREFIX}/usr" export LDFLAGS="${LDFLAGS} -L${SYSROOT_PREFIX}/usr/lib -L${SYSROOT_PREFIX}/lib" export LDSHARED="${CC} -shared" find . -name setup.py -exec sed -i "s:/usr/include/linux/input.h :${SYSROOT_PREFIX}/usr/include/linux/input.h:g" \{} \; find . -name setup.py -exec sed -i "s:/usr/include/linux/input-event-codes.h :${SYSROOT_PREFIX}/usr/include/linux/input-event-codes.h:g" \{} \; } make_target() { python3 setup.py build_ext \ build_ecodes --evdev-headers ${SYSROOT_PREFIX}/usr/include/linux/input.h:${SYSROOT_PREFIX}/usr/include/linux/input-event-codes.h \ build_ext --include-dirs ${SYSROOT_PREFIX}/usr/include/ } makeinstall_target() { python3 setup.py install --root=${INSTALL} --prefix=/usr } post_makeinstall_target() { if [[ "${ARCH}" == "arm" ]]; then libname="arm-linux-gnueabihf.so" else libname="aarch64-linux-gnu.so" fi # Seems like there's an issue in the build system. # C Modules get built using the correct target toolchain but the generated *.so # file names use the arch from the host system # tried to solve it but couldn't so I move them to the correct names for python # to grab them mv ${INSTALL}/usr/lib/${PKG_PYTHON_VERSION}/site-packages/evdev/_ecodes.cpython-311-* \ ${INSTALL}/usr/lib/${PKG_PYTHON_VERSION}/site-packages/evdev/_ecodes.cpython-311-${libname} mv ${INSTALL}/usr/lib/${PKG_PYTHON_VERSION}/site-packages/evdev/_input.cpython-311-* \ ${INSTALL}/usr/lib/${PKG_PYTHON_VERSION}/site-packages/evdev/_input.cpython-311-${libname} mv ${INSTALL}/usr/lib/${PKG_PYTHON_VERSION}/site-packages/evdev/_uinput.cpython-311-* \ ${INSTALL}/usr/lib/${PKG_PYTHON_VERSION}/site-packages/evdev/_uinput.cpython-311-${libname} } ================================================ FILE: packages/sx05re/tools/sysutils/python3-protobuf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="python3-protobuf" PKG_VERSION="4f49062a95f18a6c7e21ba17715a2b0a4608151a" PKG_SHA256="b96b86607ee0b1620b6cb512fa8ea01149493a9af01438906b006f685fd43e59" PKG_LICENSE="OSS" PKG_SITE="https://github.com/protocolbuffers/protobuf" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host protobuf" PKG_DEPENDS_HOST="toolchain Python3:host distutilscross:host protobuf protobuf:host" PKG_LONGDESC="Python 2 and 3 compatibility library " PKG_TOOLCHAIN="manual" make_host() { cd ${PKG_BUILD}/python python3 setup.py build } makeinstall_host() { cd ${PKG_BUILD}/python python3 setup.py install --prefix=${TOOLCHAIN} } pre_make_target() { export PYTHONXCPREFIX="${SYSROOT_PREFIX}/usr" export LDFLAGS="${LDFLAGS} -L${SYSROOT_PREFIX}/usr/lib -L${SYSROOT_PREFIX}/lib" export LDSHARED="${CC} -shared" cd ${PKG_BUILD}/python } make_target() { cd ${PKG_BUILD}/python python3 setup.py build } makeinstall_target() { python3 setup.py install --root=${INSTALL} --prefix=/usr } post_makeinstall_target() { find ${INSTALL}/usr/lib/python*/site-packages/ -name "*.py" -exec rm -rf {} ";" } ================================================ FILE: packages/sx05re/tools/sysutils/python3-protobuf/patches/python3-protobuf-001-add-experimental_allow_proto3_optional.patch ================================================ --- a/python/setup.py +++ b/python/setup.py @@ -73,7 +73,7 @@ "or install the binary package.\n") sys.exit(-1) - protoc_command = [ protoc, "-I../src", "-I.", "--python_out=.", source ] + protoc_command = [ protoc, "--experimental_allow_proto3_optional", "-I../src", "-I.", "--python_out=.", source ] if subprocess.call(protoc_command) != 0: sys.exit(-1) ================================================ FILE: packages/sx05re/tools/sysutils/pyudev/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 0riginally created by Escalade (https://github.com/escalade) # Copyright (C) 2018-present 5schatten (https://github.com/5schatten) PKG_NAME="pyudev" PKG_VERSION="fa2789694c84c7120ecc7bf9e4647914482e8665" PKG_SHA256="50597fc925fca44f8d572775be0caadfd6875afaad3dd7f4d02809220c30ebb5" PKG_LICENSE="OSS" PKG_SITE="https://github.com/pyudev/pyudev" PKG_URL="https://github.com/pyudev/pyudev/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="pyudev is a LGPL licenced, pure Python 2/3 binding to libudev, the device and hardware management and information library of Linux." pre_make_target() { export PYTHONXCPREFIX="${SYSROOT_PREFIX}/usr" export LDFLAGS="${LDFLAGS} -L${SYSROOT_PREFIX}/usr/lib -L${SYSROOT_PREFIX}/lib" export LDSHARED="${CC} -shared" } make_target() { python setup.py build --cross-compile } makeinstall_target() { python setup.py install --root=${INSTALL} --prefix=/usr } post_makeinstall_target() { find ${INSTALL}/usr/lib/python*/site-packages/ -name "*.py" -exec rm -rf {} ";" } ================================================ FILE: packages/sx05re/tools/sysutils/pyudev/patches/pyudev-001-libraryfix.patch ================================================ --- a/src/pyudev/_ctypeslib/utils.py 2016-07-25 13:16:38.820202459 +0200 +++ b/src/pyudev/_ctypeslib/utils.py 2016-07-25 13:23:32.533533168 +0200 @@ -53,7 +53,7 @@ """ library_name = find_library(name) if not library_name: - raise ImportError('No library named %s' % name) + library_name = 'libudev.so' lib = CDLL(library_name, use_errno=True) # Add function signatures for funcname, signature in signatures.items(): ================================================ FILE: packages/sx05re/tools/sysutils/pyyaml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="pyyaml" PKG_VERSION="8cdff2c80573b8be8e8ad28929264a913a63aa33" PKG_SHA256="" PKG_LICENSE="OSS" PKG_SITE="https://github.com/yaml/pyyaml" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_DEPENDS_HOST="toolchain:host distutilscross:host Python3:host " PKG_LONGDESC="Python 2 and 3 compatibility library " PKG_TOOLCHAIN="manual" make_host() { python3 setup.py build } makeinstall_host() { exec_thread_safe python3 setup.py install --prefix=${TOOLCHAIN} } pre_make_target() { export PYTHONXCPREFIX="${SYSROOT_PREFIX}/usr" export LDFLAGS="${LDFLAGS} -L${SYSROOT_PREFIX}/usr/lib -L${SYSROOT_PREFIX}/lib" export LDSHARED="${CC} -shared" } make_target() { python3 setup.py build } makeinstall_target() { python3 setup.py install --root=${INSTALL} --prefix=/usr } post_makeinstall_target() { find ${INSTALL}/usr/lib/python*/site-packages/ -name "*.py" -exec rm -rf {} ";" } ================================================ FILE: packages/sx05re/tools/sysutils/rclone/bin/ra_rclone.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Joshua L. (https://github.com/Langerz82) # Source predefined functions and variables . /etc/profile ACTION=${1} PLATFORM=${2} ROMNAME="${3}" RA_CONFIG="/storage/.config/retroarch/retroarch.cfg" RA_RBASE="emuelec:/retroarch-saves" RC_LOG="/emuelec/logs/rclone.log" RCLONE_ARGS=" --log-file=${RC_LOG} --log-level DEBUG --transfers 2 --checkers 2 --contimeout 30s --timeout 120s --retries 3 --low-level-retries 10 --stats 1s" DEBUG=1 rm "${RC_LOG}" touch "${RC_LOG}" [[ ! -f "${ROMNAME}" ]] && exit 1 [[ ${DEBUG} == 1 ]] && echo "ROMNAME=${ROMNAME}" >> "${RC_LOG}" BASENAME="${ROMNAME##*/}" [[ ${DEBUG} == 1 ]] && echo "BASENAME=${BASENAME}" >> "${RC_LOG}" ROMSTEM="${BASENAME%.*}" [[ ${DEBUG} == 1 ]] && echo "ROMSTEM=${ROMSTEM}" >> "${RC_LOG}" if [[ "${ACTION}" == "get" || "${ACTION}" == "set" ]]; then SRM_CONTENT=$(cat "${RA_CONFIG}" | grep savefiles_in_content_dir | cut -d'"' -f2) if [[ "${SRM_CONTENT}" == "true" ]]; then RA_LSAVES="${ROMNAME%/*}" else SAVEFILE_PATH=$(cat "${RA_CONFIG}" | grep savefile_directory | cut -d'"' -f2 | sed -e "s/\/${PLATFORM}$//g" | sed -e "s/^~/\/storage/g" ) [[ ${DEBUG} == 1 ]] && echo "SAVEFILE_PATH=${SAVEFILE_PATH}" >> "${RC_LOG}" RA_LSAVES="${SAVEFILE_PATH}" fi [[ ${DEBUG} == 1 ]] && echo "RA_LSAVES=${RA_LSAVES}" >> "${RC_LOG}" SAVESTATE_PATH=$(cat "${RA_CONFIG}" | grep savestate_directory | cut -d'"' -f2 | sed -e "s/\/${PLATFORM}$//g" | sed -e "s/^~/\/storage/g" ) [[ ${DEBUG} == 1 ]] && echo "SAVESTATE_PATH=${SAVESTATE_PATH}" >> "${RC_LOG}" RA_LSTATES="${SAVESTATE_PATH}/${PLATFORM}/" [[ ${DEBUG} == 1 ]] && echo "RA_LSTATES=\"${RA_LSTATES}\"" >> "${RC_LOG}" RA_RSAVES=${RA_RBASE}/saves/${PLATFORM} [[ ${DEBUG} == 1 ]] && echo "RA_RSAVES=${RA_RBASE}/saves/${PLATFORM}" >> "${RC_LOG}" RA_RSTATES=${RA_RBASE}/states/${PLATFORM} [[ ${DEBUG} == 1 ]] && echo "RA_RSTATES=${RA_RBASE}/states/${PLATFORM}" >> "${RC_LOG}" fi RUNSYNC=$(get_ee_setting cloudsave "${PLATFORM}" "${ROMNAME}") if [[ "${RUNSYNC}" == "1" ]]; then rclone mkdir "${RA_RBASE}" wait if [[ "${ACTION}" == "get" ]]; then rclone copy ${RCLONE_ARGS} "${RA_RSAVES}/" --include "/${ROMSTEM}.srm" "${RA_LSAVES}" & rclone copy ${RCLONE_ARGS} "${RA_RSTATES}/" --include "/${ROMSTEM}.state*" "${RA_LSTATES}" & fi if [[ "${ACTION}" == "set" ]]; then SRM="${RA_LSAVES}/${ROMSTEM}.srm" if [[ -f "${SRM}" ]]; then rclone copy ${RCLONE_ARGS} "${SRM}" "${RA_RSAVES}" & fc -ln -1 >> "${RC_LOG}" fi SF_FILES="${RA_LSTATES}${ROMSTEM}.state" SF_OK=$(ls "${SF_FILES}"*) if [[ ! -z "${SF_OK}" ]]; then rclone copy ${RCLONE_ARGS} "${RA_LSTATES}" --include "/${ROMSTEM}.state*" "${RA_RSTATES}" & fc -ln -1 >> "${RC_LOG}" fi fi wait LOG_ERROR_TEXT=$(cat ${RC_LOG} \ | grep -e "ERROR :" -e "Failed to create file system" \ | grep -v "directory not found") [[ ! -z "${LOG_ERROR_TEXT}" ]] || [[ ! -f "${RC_LOG}" ]] && exit 1 exit 0 fi ================================================ FILE: packages/sx05re/tools/sysutils/rclone/config/emuelec-cloud-filter.cfg ================================================ # Save states / sram from /storage/roms + ee_defaults.txt + *.sav + *.nv + *.nvmem* + *.eeprom* + *.fs + *.srm + *.state* + *.auto # config backup (it will include restored backups as well) + *ee_backup_config.tar.gz # Do not backup bios, roms and everything else - bios/** - * # exclude hidden files (hopefuly) - *. ================================================ FILE: packages/sx05re/tools/sysutils/rclone/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="rclone" PKG_VERSION="71a784cfa22cd4753950999b356c16231e4f6888" PKG_SHA256="e47d769185971d3d414d4ca5f9532e5b476e4fc5b1d4da89a8437ed3049bf908" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/rclone/rclone" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain go:host" PKG_LONGDESC="rsync for cloud storage - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Yandex Files" PKG_TOOLCHAIN="manual" configure_target() { case ${TARGET_ARCH} in arm) export GOARCH=arm case ${TARGET_CPU} in arm1176jzf-s) export GOARM=6 ;; *) export GOARM=7 ;; esac ;; aarch64) export GOARCH=arm64 ;; esac export GOOS=linux export GOLANG=${TOOLCHAIN}/lib/golang/bin/go export LDFLAGS="-w -extldflags -static -X main.gitCommit=${PKG_VERSION} -X main.versionStr=${PKG_VERSION:0:7} -extld ${CC}" } make_target() { mkdir -p bin cd ${PKG_BUILD} ${GOLANG} get $(echo ${PKG_SITE} | sed s/'http[s]\?:\/\/'//) ${GOLANG} build -ldflags "${LDFLAGS}" $(echo ${PKG_SITE} | sed s/'http[s]\?:\/\/'//) } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin/ mkdir -p ${INSTALL}/usr/config/emuelec/configs/rclone cp ${PKG_BUILD}/rclone ${INSTALL}/usr/bin/ cp ${PKG_DIR}/bin/ra_rclone.sh ${INSTALL}/usr/bin cp ${PKG_DIR}/config/emuelec-cloud-filter.cfg ${INSTALL}/usr/config/emuelec/configs/rclone/ ln -sf /emuelec/configs/rclone ${INSTALL}/usr/config/rclone } ================================================ FILE: packages/sx05re/tools/sysutils/rs97-commander-sdl2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="rs97-commander-sdl2" PKG_VERSION="ad4f01b14a2fde33897167f18daa7218c13e5b52" PKG_SHA256="175357346bae41e827de5cf79e752ed438eaae7dba82d812f042dd05fb146b45" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/EmuELEC/rs97-commander-sdl2" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_image SDL2_gfx SDL2_ttf freetype" PKG_SECTION="tools" PKG_SHORTDESC="Two-pane commander for RetroFW and RG-350 (fork of Dingux Commander)" pre_configure_target() { sed -i "s|sdl2-config|${SYSROOT_PREFIX}/usr/bin/sdl2-config|" Makefile sed -i "s|CC=g++|CC=${CXX}|" Makefile OGA=0 if [[ "${DEVICE}" == "OdroidGoAdvance" || "${DEVICE}" == "GameForce" ]]; then OGA=1 fi PKG_MAKE_OPTS_TARGET=" ODROIDGO=${OGA} CC=${CXX}" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/fm cp DinguxCommander ${INSTALL}/usr/bin/ cp -rf res ${INSTALL}/usr/config/emuelec/configs/fm/ } ================================================ FILE: packages/sx05re/tools/sysutils/sdljoytest/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="sdljoytest" PKG_VERSION="49724c185e19d176cb05f08eab5f2349c4c365b7" PKG_SHA256="e6c321cfb33b040dc56aa1472df6f50f5c956446e765e0238b073da4e6774ab1" PKG_LICENSE="OSS" PKG_SITE="https://github.com/EmuELEC/sdljoytest" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain SDL2" PKG_LONGDESC="Test joystick with SDL2 in Linux" PKG_TOOLCHAIN="make" pre_configure_target() { sed -i "s|gcc|${CC}|" Makefile } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -rf test_gamepad_SDL2 ${INSTALL}/usr/bin/sdljoytest cp -rf map_gamepad_SDL2 ${INSTALL}/usr/bin/sdljoymap cp -rf gamepad_info ${INSTALL}/usr/bin/gamepad_info cp -rf sdl_ra_joystick_map ${INSTALL}/usr/bin/sdl_ra_joystick_map } ================================================ FILE: packages/sx05re/tools/sysutils/sdlterm/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2025-present EmuELEC (https://github.com/EmuELEC) PKG_NAME="sdlterm" PKG_VERSION="v1" PKG_LICENSE="Public Domain" PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_ttf" PKG_SHORTDESC="simple SDL2 program to read output of bash scripts" PKG_TOOLCHAIN="manual" make_target() { ${CXX} sdlterm.cpp -o sdlterm `sdl2-config --cflags --libs` -lSDL2_ttf -pthread } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp sdlterm ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/tools/sysutils/sdlterm/sources/sdlterm.cpp ================================================ #include #include #include #include #include #include #include #include #include #include #include std::vector output_lines; std::mutex output_mutex; bool running = true; void read_script_output(const std::string& cmd) { FILE* pipe = popen(cmd.c_str(), "r"); if (!pipe) { std::lock_guard lock(output_mutex); output_lines.push_back("Failed to run script."); running = false; return; } std::ofstream logfile("/emuelec/logs/sdlterm.log", std::ios::out | std::ios::trunc); if (!logfile) { std::cerr << "[ERROR] Could not open log file /emuelec/logs/sdlterm.log\n"; } else { logfile << "Output for: " << cmd << "\n\n"; } char buffer[256]; while (fgets(buffer, sizeof(buffer), pipe)) { std::string line(buffer); // Strip trailing newline/carriage return while (!line.empty() && (line.back() == '\n' || line.back() == '\r')) { line.pop_back(); } { std::lock_guard lock(output_mutex); output_lines.push_back(line); } if (logfile) { logfile << line << std::endl; } } if (logfile) { logfile << "All finished.\n"; } pclose(pipe); running = false; } void draw_filled_circle(SDL_Renderer* renderer, int cx, int cy, int radius) { for (int dy = -radius; dy <= radius; ++dy) { int width = static_cast(sqrt(radius * radius - dy * dy)); SDL_RenderDrawLine(renderer, cx - width, cy + dy, cx + width, cy + dy); } } int main(int argc, char* argv[]) { std::string title = "EmuELEC"; std::string run_cmd; std::string run_args; bool wait_after_finish = false; // Parse arguments for (int i = 1; i < argc; ++i) { std::string arg = argv[i]; if (arg == "--title" && i + 1 < argc) { title = std::string("EmuELEC - ") + argv[++i]; } else if (arg == "--run" && i + 1 < argc) { run_cmd = argv[++i]; } else if ((arg == "--runargs" || arg == "--args") && i + 1 < argc) { run_args = argv[++i]; } else if (arg == "--wait") { wait_after_finish = true; } else { std::cerr << "Unknown argument: " << arg << std::endl; std::cerr << "Usage: --title --run <script> [--runargs <args>] [--wait]" << std::endl; return 1; } } if (run_cmd.empty()) { std::cerr << "Usage: --title <title> --run <script> [--runargs <args>] [--wait]" << std::endl; return 1; } std::string full_cmd = "bash -c '" + run_cmd + " " + run_args + "'"; std::cout << "[DEBUG] Full command: " << full_cmd << std::endl; // Initialize SDL if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER) != 0) { std::cerr << "SDL_Init error: " << SDL_GetError() << std::endl; return 1; } if (TTF_Init() == -1) { std::cerr << "TTF_Init error: " << TTF_GetError() << std::endl; SDL_Quit(); return 1; } // Load controller mappings const char* mapping_file = std::getenv("SDL_GAMECONTROLLERCONFIG_FILE"); if (mapping_file) { if (SDL_GameControllerAddMappingsFromFile(mapping_file) == -1) { std::cerr << "Warning: Could not load mappings: " << SDL_GetError() << std::endl; } else { std::cout << "[DEBUG] Loaded controller mappings from: " << mapping_file << std::endl; } } // Open first available game controller SDL_GameController* controller = nullptr; for (int i = 0; i < SDL_NumJoysticks(); ++i) { if (SDL_IsGameController(i)) { controller = SDL_GameControllerOpen(i); if (controller) { std::cout << "Game controller connected: " << SDL_GameControllerName(controller) << std::endl; break; } } } // Create fullscreen window SDL_DisplayMode dm; if (SDL_GetCurrentDisplayMode(0, &dm) != 0) { std::cerr << "SDL_GetCurrentDisplayMode error: " << SDL_GetError() << std::endl; TTF_Quit(); SDL_Quit(); return 1; } SDL_Window* window = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, dm.w, dm.h, SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_SHOWN); if (!window) { std::cerr << "SDL_CreateWindow error: " << SDL_GetError() << std::endl; if (controller) SDL_GameControllerClose(controller); TTF_Quit(); SDL_Quit(); return 1; } SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (!renderer) { std::cerr << "SDL_CreateRenderer error: " << SDL_GetError() << std::endl; SDL_DestroyWindow(window); if (controller) SDL_GameControllerClose(controller); TTF_Quit(); SDL_Quit(); return 1; } TTF_Font* font = TTF_OpenFont("/usr/share/retroarch-assets/ozone/regular.ttf", 18); if (!font) { std::cerr << "TTF_OpenFont error: " << TTF_GetError() << std::endl; SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); if (controller) SDL_GameControllerClose(controller); TTF_Quit(); SDL_Quit(); return 1; } SDL_Color white = {255, 255, 255, 255}; SDL_Color gray = {50, 50, 50, 255}; // Start script thread std::thread script_thread(read_script_output, full_cmd); bool quit = false; SDL_Event e; float angle = 0.0f; const int line_height = 20; const int output_start_y = 50; const int visible_lines = (dm.h - output_start_y) / line_height; while (!quit) { while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { quit = true; } if (!running && wait_after_finish) { if (e.type == SDL_KEYDOWN || e.type == SDL_CONTROLLERBUTTONDOWN) { quit = true; } } } if (!running && !wait_after_finish) { quit = true; } // Clear screen SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_RenderClear(renderer); // Draw title bar SDL_Rect title_bar = {0, 0, dm.w, 40}; SDL_SetRenderDrawColor(renderer, gray.r, gray.g, gray.b, gray.a); SDL_RenderFillRect(renderer, &title_bar); SDL_Surface* title_surface = TTF_RenderText_Blended(font, title.c_str(), white); if (title_surface) { SDL_Texture* title_texture = SDL_CreateTextureFromSurface(renderer, title_surface); if (title_texture) { SDL_Rect title_rect = {10, 10, title_surface->w, title_surface->h}; SDL_RenderCopy(renderer, title_texture, nullptr, &title_rect); SDL_DestroyTexture(title_texture); } SDL_FreeSurface(title_surface); } // Draw output lines { std::lock_guard<std::mutex> lock(output_mutex); int total_lines = static_cast<int>(output_lines.size()); int scroll_offset = 0; if (running) { scroll_offset = std::max(0, total_lines - visible_lines); } else { scroll_offset = std::max(0, total_lines - static_cast<int>(visible_lines / 1.2)); } int lines_to_draw = std::min(visible_lines, total_lines - scroll_offset); for (int i = 0; i < lines_to_draw; ++i) { const std::string& line = output_lines[scroll_offset + i]; if (line.empty()) continue; SDL_Surface* text_surface = TTF_RenderText_Blended(font, line.c_str(), white); if (!text_surface) { std::cerr << "[WARN] Failed to render line: " << line << " - " << TTF_GetError() << std::endl; continue; } SDL_Texture* text_texture = SDL_CreateTextureFromSurface(renderer, text_surface); if (!text_texture) { SDL_FreeSurface(text_surface); continue; } SDL_Rect dst = {10, output_start_y + i * line_height, text_surface->w, text_surface->h}; SDL_RenderCopy(renderer, text_texture, nullptr, &dst); SDL_FreeSurface(text_surface); SDL_DestroyTexture(text_texture); } } // Draw status indicator const int circle_radius = 15; const int circle_x = dm.w - 40; const int circle_y = 25; if (running) { angle += 0.05f; if (angle > 2 * M_PI) angle -= 2 * M_PI; int pulse_radius = circle_radius - static_cast<int>(3 * (1 + sin(angle * 4))); SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255); draw_filled_circle(renderer, circle_x, circle_y, pulse_radius); } else { SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); draw_filled_circle(renderer, circle_x, circle_y, circle_radius); const char* done_msg = wait_after_finish ? "Script finished! Press any key or gamepad button to exit." : "Script finished! Exiting..."; SDL_Surface* done_surface = TTF_RenderText_Blended(font, done_msg, white); if (done_surface) { SDL_Texture* done_texture = SDL_CreateTextureFromSurface(renderer, done_surface); if (done_texture) { SDL_Rect done_rect = {10, dm.h - 40, done_surface->w, done_surface->h}; SDL_RenderCopy(renderer, done_texture, nullptr, &done_rect); SDL_DestroyTexture(done_texture); } SDL_FreeSurface(done_surface); } } SDL_RenderPresent(renderer); SDL_Delay(16); } if (script_thread.joinable()) script_thread.join(); if (controller) SDL_GameControllerClose(controller); TTF_CloseFont(font); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); TTF_Quit(); SDL_Quit(); return 0; } ================================================ FILE: packages/sx05re/tools/sysutils/six/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="six" PKG_VERSION="aa4e90bcd7b7bc13a71dfaebcb2021f4caaa8432" PKG_SHA256="c96447798c18575887c4eddc9bf05fc09ba52d008584f0e5c2d8337795572d61" PKG_LICENSE="OSS" PKG_SITE="https://github.com/benjaminp/six" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host" PKG_LONGDESC="Python 2 and 3 compatibility library " PKG_TOOLCHAIN="manual" pre_make_target() { export PYTHONXCPREFIX="${SYSROOT_PREFIX}/usr" export LDFLAGS="${LDFLAGS} -L${SYSROOT_PREFIX}/usr/lib -L${SYSROOT_PREFIX}/lib" export LDSHARED="${CC} -shared" } make_target() { python setup.py build --cross-compile } makeinstall_target() { python setup.py install --root=${INSTALL} --prefix=/usr } post_makeinstall_target() { find ${INSTALL}/usr/lib/python*/site-packages/ -name "*.py" -exec rm -rf {} ";" } ================================================ FILE: packages/sx05re/tools/sysutils/sixaxis/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="sixaxis" PKG_VERSION="f53b0ca28c35ebd71b54190f33eadcb8c3267186" PKG_SHA256="baf7fd22c86c5a32d5043a6bd8487928d2ae216759414632b1d3a998ba61d922" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/RetroPie/sixaxis" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="emuelec/tools" PKG_LONGDESC="sixaxis helper service " PKG_TOOLCHAIN="make" PKG_IS_ADDON="no" PKG_AUTORECONF="no" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp sixaxis-helper.sh ${INSTALL}/usr/bin/sixaxis-helper.sh cp bins/sixaxis-timeout ${INSTALL}/usr/bin/sixaxis-timeout } post_install() { enable_service sixaxis@.service } ================================================ FILE: packages/sx05re/tools/sysutils/sixaxis/system.d/sixaxis@.service ================================================ [Unit] Description=sixaxis helper (%I) [Service] Type=simple ExecStart=/usr/bin/sixaxis-helper.sh %I [Install] WantedBy=multi-user.target ================================================ FILE: packages/sx05re/tools/sysutils/sixaxis/udev.d/99-sixaxis.rules ================================================ ACTION=="add", SUBSYSTEMS=="input", ATTRS{name}=="*PLAYSTATION(R)3 Controller", TAG+="systemd", ENV{SYSTEMD_WANTS}="sixaxis@%E{DEVNAME}.service", ENV{ID_INPUT_KEY}="" ACTION=="add", SUBSYSTEMS=="input", ATTRS{name}=="*PLAYSTATION(R)3Conteroller", TAG+="systemd", ENV{SYSTEMD_WANTS}="sixaxis@%E{DEVNAME}.service", ENV{ID_INPUT_KEY}="" ACTION=="add", SUBSYSTEMS=="input", ATTRS{name}=="*PLAYSTATION(R)3Conteroller-PANHAI", TAG+="systemd", ENV{SYSTEMD_WANTS}="sixaxis@%E{DEVNAME}.service", ENV{ID_INPUT_KEY}="" ACTION=="add", SUBSYSTEMS=="input", ATTRS{name}=="*PS(R) Gamepad", TAG+="systemd", ENV{SYSTEMD_WANTS}="sixaxis@%E{DEVNAME}.service", ENV{ID_INPUT_KEY}="" ACTION=="add", SUBSYSTEMS=="input", ATTRS{name}=="*PS3 GamePad", TAG+="systemd", ENV{SYSTEMD_WANTS}="sixaxis@%E{DEVNAME}.service", ENV{ID_INPUT_KEY}="" ACTION=="add", SUBSYSTEMS=="input", ATTRS{name}=="Sony Interactive Entertainment Wireless Controller", TAG+="systemd", ENV{SYSTEMD_WANTS}="sixaxis@%E{DEVNAME}.service", ENV{ID_INPUT_KEY}="" ACTION=="add", SUBSYSTEMS=="input", ENV{DEVNAME}=="/dev/input/event*", ATTRS{name}=="*Motion Sensors", RUN+="/bin/rm %E{DEVNAME}", ENV{ID_INPUT_JOYSTICK}="", ENV{ID_INPUT_KEY}="" ================================================ FILE: packages/sx05re/tools/sysutils/sixpair/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="sixpair" PKG_VERSION="23e6e087fe7f013128ce2e0e19a8f4b04fa7a6e8" PKG_SHA256="9fc491060a85a01789a88e4dcb5271806ff6c7fbe62b58f828ac83ed1b4de1fe" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.pabr.org/sixlinux/" PKG_URL="https://github.com/lakkatv/sixpair/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libusb libusb-compat" PKG_SECTION="network" PKG_SHORTDESC="Associate PS3 Sixaxis controller to system bluetoothd via USB" PKG_LONGDESC="Associate PS3 Sixaxis controller to system bluetoothd via USB" PKG_TOOLCHAIN="make" PKG_IS_ADDON="no" PKG_AUTORECONF="no" make_target() { make sixpair LDLIBS=-lusb } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp sixpair ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/tools/sysutils/tcpbridge/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Based on libreelec pycryptodome package PKG_NAME="tcpbridge" PKG_VERSION="b8d11ef8a33f5484fa4f48f5f50801f7418aebe5" PKG_LICENSE="GPL" PKG_SITE="https://github.com/Cacaonut/tcpbridge" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="Python3 dbus-python" PKG_LONGDESC="TCP bridge for data transfer." PKG_TOOLCHAIN="manual" pre_configure_target() { cd ${PKG_BUILD} rm -rf .${TARGET_NAME} export PYTHONXCPREFIX="${SYSROOT_PREFIX}/usr" export LDSHARED="${CC} -shared" } make_target() { python setup.py build } makeinstall_target() { python setup.py install --root=${INSTALL} --prefix=/usr } ================================================ FILE: packages/sx05re/tools/sysutils/triggerhappy/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="triggerhappy" PKG_VERSION="b822888066129350e51ad79f1cf307fa38dae4f7" PKG_SHA256="1b3221963b9adca26eacc5442d8c2422cf2072f8adde1dbd691a69b37a583fb1" PKG_ARCH="any" PKG_LICENSE="GPL3" PKG_SITE="https://github.com/wertarbyte/triggerhappy" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="A lightweight hotkey daemon " PKG_TOOLCHAIN="make" ================================================ FILE: packages/sx05re/tools/sysutils/vim/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vim" PKG_VERSION="9.0.1417" PKG_SHA256="02c67859046f7c0206afb909061763cf40747c6bf40c22bb6efaf9c06be41591" PKG_LICENSE="VIM" PKG_SITE="http://www.vim.org/" PKG_URL="https://github.com/vim/vim/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ncurses" PKG_LONGDESC="Vim is a highly configurable text editor built to enable efficient text editing." PKG_BUILD_FLAGS="-sysroot" PKG_CONFIGURE_OPTS_TARGET="vim_cv_getcwd_broken=no \ vim_cv_memmove_handles_overlap=yes \ vim_cv_stat_ignores_slash=yes \ vim_cv_terminfo=yes \ vim_cv_tgetent=zero \ vim_cv_toupper_broken=no \ vim_cv_tty_group=world \ vim_cv_tty_mode=0620 \ ac_cv_sizeof_int=4 \ ac_cv_small_wchar_t=no \ --datarootdir=/storage/.config/emuelec/configs/vimdata\ --disable-canberra \ --disable-nls \ --enable-selinux=no \ --enable-gui=no \ --with-compiledby=EmuELEC \ --with-features=huge \ --with-tlib=ncurses \ --without-x" PKG_MAKEINSTALL_OPTS_TARGET=VIMRTDIR= pre_configure_target() { cd .. rm -rf .${TARGET_NAME} } make_target() { : } pre_makeinstall_target() { mkdir -p ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/vimdata } post_makeinstall_target() { ( mv ${INSTALL}/storage/.config/emuelec/configs/vimdata/vim/vimrc_example.vim ${INSTALL}/usr/config/emuelec/configs/vimdata/vimrc rm -r ${INSTALL}/storage/ ) } ================================================ FILE: packages/sx05re/tools/sysutils/wget/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="wget" PKG_VERSION="1.20.3" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/mirror/wget" PKG_URL="https://ftp.gnu.org/gnu/wget/wget-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain openssl" PKG_LONGDESC="GNU Wget is a free software package for retrieving files using HTTP, HTTPS, FTP and FTPS" PKG_TOOLCHAIN="configure" pre_configure_target() { PKG_CONFIGURE_OPTS_TARGET+=" --with-ssl=openssl" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/.${TARGET_NAME}/src/wget ${INSTALL}/usr/bin/wget } ================================================ FILE: packages/sx05re/tools/sysutils/xow/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="xow" PKG_VERSION="d335d6024f8380f52767a7de67727d9b2f867871" PKG_SHA256="b841bf298e2e8904033629cf5685938f90add9d9d3a826f1670ac9990b6f1f76" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/medusalix/xow" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libusb" PKG_LONGDESC="Linux driver for the Xbox One wireless dongle " PKG_TOOLCHAIN="make" pre_configure_target() { PKG_MAKE_OPTS_TARGET=" BUILD=RELEASE" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp xow ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/tools/sysutils/yasm/package.mk ================================================ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # # OpenELEC is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # OpenELEC is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC. If not, see <http://www.gnu.org/licenses/>. ################################################################################ PKG_NAME="yasm" PKG_VERSION="1.3.0" PKG_SHA256="3dce6601b495f5b3d45b59f7d2492a340ee7e84b5beca17e48f862502bd5603f" PKG_ARCH="any" PKG_LICENSE="BSD" PKG_SITE="http://www.tortall.net/projects/yasm/" PKG_URL="http://www.tortall.net/projects/yasm/releases/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_SECTION="toolchain/lang" PKG_SHORTDESC="yasm: A complete rewrite of the NASM assembler" PKG_LONGDESC="Yasm is a complete rewrite of the NASM assembler under the new BSD License (some portions are under other licenses, see COPYING for details). It is designed from the ground up to allow for multiple assembler syntaxes to be supported (eg, NASM, TASM, GAS, etc.) in addition to multiple output object formats and even multiple instruction sets. Another primary module of the overall design is an optimizer module." PKG_TOOLCHAIN="configure" PKG_CONFIGURE_OPTS_HOST="--disable-debug \ --disable-warnerror \ --disable-profiling \ --disable-gcov \ --disable-python \ --disable-python-bindings \ --enable-nls \ --disable-rpath \ --without-dmalloc \ --with-gnu-ld \ --without-libiconv-prefix \ --without-libintl-prefix" ================================================ FILE: packages/sx05re/tools/unused/eigen/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="eigen" PKG_VERSION="3.2.10" PKG_SHA256="760e6656426fde71cc48586c971390816f456d30f0b5d7d4ad5274d8d2cb0a6d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://eigen.tuxfamily.org/index.php?title=Main_Page" PKG_URL="http://bitbucket.org/eigen/eigen/get/${PKG_VERSION}.tar.bz2" PKG_SOURCE_DIR="eigen-*" PKG_DEPENDS_TARGET="toolchain cmake:host" PKG_SECTION="xmedia/games" PKG_SHORTDESC="eigen c++ headers" PKG_IS_ADDON="no" PKG_AUTORECONF="no" PKG_TOOLCHAIN="configure" configure_target() { SYSROOT_PREFIX=${SYSROOT_PREFIX} cmake -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CONF} \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_INSTALL_LIBDIR=/usr/lib \ -DCMAKE_INSTALL_LIBDIR_NOARCH=/usr/lib \ -DCMAKE_INSTALL_PREFIX_TOOLCHAIN=${SYSROOT_PREFIX}/usr \ -DCMAKE_PREFIX_PATH=${SYSROOT_PREFIX}/usr \ ${EXTRA_CMAKE_OPTS} \ .. } ================================================ FILE: packages/sx05re/tools/unused/emulators/fba4arm/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="fba4arm" PKG_VERSION="99f4c3f37cd803de8d84dfb046b0b9a760b4f8dd" PKG_SHA256="f1a06091a4ab83cc2ec3490e6d2199a25c8032137bc786b17473fff63c24f7c3" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" PKG_SITE="https://github.com/shantigilbert/FBA4ARM/" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="libretro" PKG_SHORTDESC="Port of Final Burn Alpha to Libretro (v0.2.97.38). With many hacked roms added by SumavisionQ5" PKG_LONGDESC="Currently, FB Alpha supports games on Capcom CPS-1 and CPS-2 hardware, SNK Neo-Geo hardware, Toaplan hardware, Cave hardware, and various games on miscellaneous hardware. " PKG_IS_ADDON="no" PKG_TOOLCHAIN="make" PKG_AUTORECONF="no" make_target() { if [ "${ARCH}" == "arm" ]; then if [[ "${TARGET_FPU}" =~ "neon" ]]; then make -f makefile.libretro CC=${CC} CXX=${CXX} HAVE_NEON=1 profile=performance else make -f makefile.libretro CC=${CC} CXX=${CXX} profile=performance fi else make -f makefile.libretro CC=${CC} CXX=${CXX} profile=accuracy fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp fbalpha_libretro.so ${INSTALL}/usr/lib/libretro/fba4arm_libretro.so } ================================================ FILE: packages/sx05re/tools/unused/emulators/mba.mini.plus/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="mba.mini.plus" PKG_VERSION="0446f417b9434bccf043fb0d2c256303c5bdf2a8" PKG_SHA256="a5c944857fe549522efa02f96fa495b2d3affa49ff3de3e1f81852f1ff9a4eee" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" PKG_SITE="https://github.com/shantigilbert/MBA.mini.Plus-libretro" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="emuelec" PKG_SHORTDESC="M.B.A = MAME's skeleton + FBA's romsets" PKG_LONGDESC="M.B.A-mini from MAME2010-libretro (https://github.com/libretro/mame2010-libretro) after the codes is streamlined, only CPS 1/2, NEOGEO, IREM M92 machines && roms is supported." PKG_TOOLCHAIN="make" if [[ "${ARCH}" == "aarch64" ]]; then PKG_PATCH_DIRS="emuelec-aarch64" fi pre_configure_target() { if [[ "${ARCH}" == "arm" ]]; then if [ "${DEVICE}" = "Amlogic-ng" ]; then PKG_MAKE_OPTS_TARGET="platform=AMLG12B" elif [ "${DEVICE}" = "Amlogic-old" ]; then PKG_MAKE_OPTS_TARGET="platform=AMLGX" fi PKG_MAKE_OPTS_TARGET+=" CC=${CC} LD=${CC}" sed -i -e "s|uname -a|echo armv|" \ -e "s|uname -m|echo armv|" \ -e "s|LIBS = -lm|LIBS = |g" \ -e "s|LIBS = |LIBS = -lm|g" \ makefile else if [ "${DEVICE}" = "Amlogic-ng" ]; then PKG_MAKE_OPTS_TARGET="platform=emuelec-n2" elif [ "${DEVICE}" = "Amlogic-old" ]; then PKG_MAKE_OPTS_TARGET="platform=emuelec" fi PKG_MAKE_OPTS_TARGET+=" CC=${CC} LD=${CC}" sed -i -e "s|uname -a|echo aarch64|" \ -e "s|uname -m|echo aarch64|" \ -e "s|LIBS = -lm|LIBS = |g" \ -e "s|LIBS = |LIBS = -lm|g" \ makefile fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/libretro cp mba_mini_libretro.so ${INSTALL}/usr/lib/libretro/mba_mini_libretro.so } ================================================ FILE: packages/sx05re/tools/unused/emulators/mba.mini.plus/patches/emuelec-aarch64/mba.mini.plus-01-add-emuelec-64b.patch ================================================ --- a/makefile +++ b/makefile @@ -23,7 +23,7 @@ NEOGEO_BIOS = 0 # system platform -UNAME = $(shell uname -a) +UNAME = $(shell echo unix) ifeq ($(platform),) platform = unix @@ -44,7 +44,7 @@ endif # Autodetect PTR64 and ENDIAN -UNAME = $(shell uname -m) +UNAME = $(shell echo aarch64) ifeq ($(firstword $(filter x86_64,$(UNAME))),x86_64) PTR64 = 1 @@ -96,7 +96,7 @@ TARGET_NAME := mba_mini fpic := EXE = -LIBS = +LIBS = -lm CORE_DIR = . CCOMFLAGS += -D__LIBRETRO__ @@ -365,6 +365,32 @@ CORE_DEFINES += -DLOW_END endif +#EmuELEC: 64 bits odroid-n2, amlogic +else ifneq (,$(findstring emuelec,$(platform))) + TARGETLIB := $(TARGET_NAME)_libretro.so + SHARED := -shared -Wl,--version-script=src/osd/retro/link.T + LDFLAGS += $(SHARED) + fpic = -fPIC + LIBS += -lstdc++ -lpthread + ARM_ENABLED = 1 + ALIGNED = 1 + PTR64 = 1 + + CPUFLAGS += -DNO_ASM -DARM_ASM -frename-registers -ftree-vectorize + CFLAGS += -march=armv8-a+crc $(CPUFLAGS) + CXXFLAGS += -march=armv8-a+crc $(CPUFLAGS) + CCOMFLAGS += -march=armv8-a+crc $(CPUFLAGS) + + ifneq (,$(findstring emuelec-n2,$(platform))) + CFLAGS += -mtune=cortex-a73.cortex-a53 + CXXFLAGS += -mtune=cortex-a73.cortex-a53 + CCOMFLAGS += -mtune=cortex-a73.cortex-a53 + else + CFLAGS += -mtune=cortex-a53 + CXXFLAGS += -mtune=cortex-a53 + CCOMFLAGS += -mtune=cortex-a53 + endif + ASFLAGS += $(CFLAGS) -c -frename-registers -fno-strict-aliasing -ffast-math -ftree-vectorize PLATFORM_EXT := unix ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/config/reicast/emu_new.cfg ================================================ [alsa] device = default [audio] disable = 0 [config] Debug.SerialConsoleEnabled = no Dreamcast.Broadcast = 4 Dreamcast.Cable = 3 Dreamcast.ContentPath = Dreamcast.FullMMU = no Dreamcast.Language = 6 Dreamcast.Region = 3 Dynarec.Enabled = yes Dynarec.SmcCheckLevel = 0 Dynarec.idleskip = yes Dynarec.safe-mode = yes Dynarec.unstable-opt = no aica.LimitFPS = yes aica.NoBatch = no aica.NoSound = no pvr.MaxThreads = 3 pvr.SynchronousRendering = yes pvr.rend = 0 rend.Clipping = yes rend.CustomTextures = no rend.DumpTextures = no rend.Fog = yes rend.MaxFilteredTextureSize = 256 rend.ModifierVolumes = yes rend.RenderToTextureBuffer = no rend.RenderToTextureUpscale = 1 rend.ScreenScaling = 100 rend.ShowFPS = no rend.TextureUpscale = 1 rend.WideScreen = no ta.skip = 0 [input] MouseSensitivity = 100 VirtualGamepadVibration = 20 device1 = 0 device1.1 = 1 device1.2 = 1 device2 = 8 device2.1 = 8 device2.2 = 8 device3 = 8 device3.1 = 8 device3.2 = 8 device4 = 8 device4.1 = 8 device4.2 = 8 evdev_device_id_1 = 4 evdev_device_id_2 = 0 evdev_device_id_3 = -1 evdev_device_id_4 = -1 joystick_device_id = -1 maple_/dev/input/event4 = 0 ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/config/reicast/f310.cfg ================================================ [emulator] mapping_name = Logitech Gamepad F310 btn_escape = 316 [dreamcast] btn_a = 304 btn_b = 305 btn_c = 310 btn_d = 311 btn_x = 307 btn_y = 308 btn_z = 318 btn_start = 315 axis_trigger_left = 2 axis_trigger_right = 5 axis_x = 0 axis_y = 1 [compat] axis_dpad1_x = 16 axis_dpad1_x_inverted = no axis_dpad1_y = 17 axis_dpad1_y_inverted = no axis_dpad2_x = 3 axis_dpad2_x_inverted = no axis_dpad2_y = 4 axis_dpad2_y_inverted = no axis_trigger_left_inverted = no axis_trigger_right_inverted = no axis_x_inverted = no axis_y_inverted = no ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/config/reicast/mappings/Logitech Gamepad F310.cfg ================================================ [emulator] mapping_name = Logitech Gamepad F310 btn_escape = 316 [dreamcast] btn_a = 304 btn_b = 305 btn_c = 310 btn_d = 311 btn_x = 307 btn_y = 308 btn_z = 317 btn_start = 315 axis_trigger_left = 2 axis_trigger_right = 5 axis_x = 0 axis_y = 1 [compat] axis_dpad1_x = 16 axis_dpad1_x_inverted = no axis_dpad1_y = 17 axis_dpad1_y_inverted = no axis_dpad2_x = 3 axis_dpad2_x_inverted = no axis_dpad2_y = 4 axis_dpad2_y_inverted = no axis_trigger_left_inverted = no axis_trigger_right_inverted = no axis_x_inverted = no axis_y_inverted = no ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/config/reicast/mappings/controller_gcwz.cfg ================================================ [emulator] mapping_name = GCW Zero btn_escape = 0x01 [dreamcast] btn_a = 0x1D btn_b = 0x38 btn_c = 0x0F btn_d = 0x0E btn_x = 0x2A btn_y = 0x39 btn_start = 0x1C btn_dpad1_left = 0x69 btn_dpad1_right = 0x6A btn_dpad1_up = 0x67 btn_dpad1_down = 0x6C ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/config/reicast/mappings/controller_generic.cfg ================================================ [emulator] mapping_name = Generic Controller btn_escape = 0x13a [dreamcast] btn_a = 0x130 btn_b = 0x131 btn_c = 0x132 btn_d = 0x13d btn_x = 0x133 btn_y = 0x134 btn_z = 0x135 btn_start = 0x13b btn_dpad1_left = 0x220 btn_dpad1_right = 0x221 btn_dpad1_up = 0x222 btn_dpad1_down = 0x223 axis_x = 0x00 axis_y = 0x01 axis_trigger_left = 0x02 axis_trigger_right = 0x05 [compat] btn_trigger_left = 0x136 btn_trigger_right = 0x137 axis_dpad1_x = 0x10 axis_dpad1_y = 0x11 axis_dpad2_x = 0x12 axis_dpad2_y = 0x13 ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/config/reicast/mappings/controller_pandora.cfg ================================================ [emulator] mapping_name = Pandora btn_escape = 139 [dreamcast] btn_a = 109 btn_b = 107 btn_c = 57 btn_x = 102 btn_y = 104 btn_start = 56 btn_dpad1_left = 105 btn_dpad1_right = 106 btn_dpad1_up = 103 btn_dpad1_down = 108 [compat] btn_trigger_left = 54 btn_trigger_right = 97 ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/config/reicast/mappings/controller_xboxdrv.cfg ================================================ [emulator] mapping_name = Xbox 360 Controller (xboxdrv userspace driver) btn_escape = 0x13a [dreamcast] btn_a = 0x130 btn_b = 0x131 btn_c = 0x136 btn_d = 0x137 btn_x = 0x133 btn_y = 0x134 btn_z = 0x13d btn_start = 0x13b axis_x = 0x00 axis_y = 0x01 axis_trigger_left = 0x0a axis_trigger_right = 0x09 [compat] axis_dpad1_x = 0x10 axis_dpad1_y = 0x11 ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/config/reicast/mappings/controller_xpad.cfg ================================================ [emulator] mapping_name = Xbox 360 Controller (xpad driver) btn_escape = 0x13a [dreamcast] btn_a = 0x130 btn_b = 0x131 btn_c = 0x136 btn_d = 0x137 btn_x = 0x133 btn_y = 0x134 btn_z = 0x13d btn_start = 0x13b btn_dpad1_left = 0x2c0 btn_dpad1_right = 0x2c1 btn_dpad1_up = 0x2c2 btn_dpad1_down = 0x2c3 axis_x = 0x00 axis_y = 0x01 axis_trigger_left = 0x02 axis_trigger_right = 0x05 [compat] axis_dpad1_x = 0x10 axis_dpad1_y = 0x11 ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/config/reicast/mappings/keyboard.cfg ================================================ [emulator] mapping_name = Generic Keyboard emu_btn_escape = 1 [dreamcast] btn_a = 30 btn_b = 48 btn_c = 46 btn_d = 32 btn_x = 45 btn_y = 21 btn_z = 44 btn_start = 28 btn_dpad1_left = 105 btn_dpad1_right = 106 btn_dpad1_up = 103 btn_dpad1_down = 108 [compat] btn_trigger_left = 29 btn_trigger_right = 97 ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/config/reicast/x360.cfg ================================================ [emulator] mapping_name = Xbox Gamepad (userspace driver) btn_escape = 0x13a [dreamcast] btn_a = 0x130h btn_b = 0x131h btn_c = btn_d = 0x139h btn_x = 0x133h btn_y = 0x134h btn_z = 0x138h btn_start = 0x13Bh axis_x = 0x00 axis_y = 0x01 axis_trigger_left = 0x0a axis_trigger_right = 0x09 [compat] axis_dpad1_x = 0x10 axis_dpad1_y = 0x11 ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="reicastsa" if [ "${DEVICE}" == "Amlogic-ng" ]; then PKG_VERSION="7e11e7aff6d704de4ad8ad7531f597df058099ac" PKG_SHA256="07978933e040470b1fbb8c887485703f10fb828b583b350e23e834e7b8cee4bc" else PKG_VERSION="cb278e367b5e5635be9ebf45fd77fac2ce2fed7a" PKG_SHA256="74f69c7b1122b178a17840b51a225b8487dfc8bc30dacc9153495e0c88683259" fi PKG_EE_UPDATE="no" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/reicast/reicast-emulator" PKG_URL="https://github.com/reicast/reicast-emulator/archive/${PKG_VERSION}.tar.gz" PKG_SOURCE_DIR="reicast-emulator-${PKG_VERSION}*" PKG_DEPENDS_TARGET="toolchain alsa libpng libevdev python-evdev" PKG_SHORTDESC="Reicast is a multi-platform Sega Dreamcast emulator" PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="-gold" PKG_PATCH_DIRS="${PROJECT}" make_target() { cd shell/linux make CC=${CC} CXX=${CXX} AS=${CC} STRIP=${STRIP} EXTRAFLAGS="-I${PKG_BUILD}/shell/linux-deps/include" platform=odroidc2 reicast.elf } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp reicast.elf ${INSTALL}/usr/bin/reicast cp tools/reicast-joyconfig.py ${INSTALL}/usr/bin/ mkdir -p ${INSTALL}/usr/bin cp -r ${PKG_DIR}/config/* ${INSTALL}/usr/config/ cp -r ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin/ } ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/patches/Amlogic/reicastsa-02-add_platform_OdroidC2.patch ================================================ --- a/shell/linux/Makefile 2019-01-18 11:46:08.000000000 -0600 +++ a/shell/linux/Makefile 2019-01-18 14:05:17.236571691 -0600 @@ -201,6 +201,10 @@ # ODROID-C1 & -C1+ ifneq (,$(findstring odroidc1,$(platform))) MFLAGS += -mtune=cortex-a5 + + # ODROID-C2 + else ifneq (,$(findstring odroidc2,$(platform))) + MFLAGS += -mtune=cortex-a53 # ODROID-U2, -U3, -X & -X2 else ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/patches/Amlogic/reicastsa-03-mali.patch ================================================ diff --git a/core/rend/gles/gles.cpp b/core/rend/gles/gles.cpp index a2bc1be..ebb006b 100755 --- a/core/rend/gles/gles.cpp +++ b/core/rend/gles/gles.cpp @@ -1442,7 +1442,7 @@ bool RenderFrame() bool is_rtt=pvrrc.isRTT; - OSD_HOOK(); + //OSD_HOOK(); //if (FrameCount&7) return; diff --git a/core/sdl/sdl.cpp b/core/sdl/sdl.cpp index af84ef3..6e26744 100644 --- a/core/sdl/sdl.cpp +++ b/core/sdl/sdl.cpp @@ -415,11 +415,8 @@ void sdl_window_create() int window_height = cfgLoadInt("x11","height", WINDOW_HEIGHT); int flags = SDL_WINDOW_OPENGL; - #ifdef TARGET_PANDORA - flags |= SDL_FULLSCREEN; - #else - flags |= SDL_SWSURFACE; - #endif + flags |= SDL_WINDOW_FULLSCREEN; + flags |= SDL_SWSURFACE; #ifdef GLES SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); @@ -434,7 +431,7 @@ void sdl_window_create() SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); + //SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/patches/Amlogic-ng/reicastsa-02-add_platform_OdroidC2.patch ================================================ --- a/shell/linux/Makefile 2019-01-18 11:46:08.000000000 -0600 +++ a/shell/linux/Makefile 2019-01-18 14:05:17.236571691 -0600 @@ -231,6 +231,10 @@ # ODROID-C1 & -C1+ ifneq (,$(findstring odroidc1,$(platform))) MFLAGS += -mtune=cortex-a5 + else ifneq (,$(findstring odroidc2,$(platform))) + MFLAGS += -mtune=cortex-a53 + CFLAGS += -D TARGET_NO_OPENMP + USE_GLES := 1 # ODROID-U2, -U3, -X & -X2 else MFLAGS += -mtune=cortex-a9 @@ -277,9 +281,9 @@ RZDCY_SRC_DIR = $(LOCAL_PATH)/../../core include $(RZDCY_SRC_DIR)/core.mk -LDFLAGS += -g -Wl,-Map,$(notdir $@).map,--gc-sections -Wl,-O3 -Wl,--sort-common -fopenmp - -CFLAGS += $(RZDCY_CFLAGS) -g -O3 -D RELEASE -c -D USES_HOMEDIR -fopenmp #-D NO_REND +LDFLAGS += -g -Wl,-Map,$(notdir $@).map,--gc-sections -Wl,-O3 -Wl,--sort-common + +CFLAGS += $(RZDCY_CFLAGS) -g -O3 -D RELEASE -c -D USES_HOMEDIR #-D NO_REND CFLAGS += -frename-registers -fno-strict-aliasing CFLAGS += -ffast-math -ftree-vectorize ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/patches/Amlogic-ng/reicastsa-03-mali.patch ================================================ diff --git a/core/sdl/sdl.cpp b/core/sdl/sdl.cpp index af84ef3..6e26744 100644 --- a/core/sdl/sdl.cpp +++ b/core/sdl/sdl.cpp @@ -223,11 +223,9 @@ int window_height = cfgLoadInt("x11","height", WINDOW_HEIGHT); int flags = SDL_WINDOW_OPENGL; - #ifdef TARGET_PANDORA + flags |= SDL_FULLSCREEN; - #else flags |= SDL_SWSURFACE | SDL_WINDOW_RESIZABLE; - #endif #ifdef GLES SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); @@ -242,7 +240,7 @@ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); + //SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/patches/Amlogic-ng/reicastsa-05-fix-gles.patch ================================================ diff -ur 1/core/rend/gles/gldraw.cpp 2/core/rend/gles/gldraw.cpp --- 1/core/rend/gles/gldraw.cpp 2019-04-01 07:49:01.000000000 -0600 +++ 2/core/rend/gles/gldraw.cpp 2019-04-04 02:10:32.000000000 -0600 @@ -934,9 +934,10 @@ static void SetupMainVBO() { +#if !defined(GLES) || defined(_ANDROID) if (gl.gl_major >= 3) glBindVertexArray(gl.vbo.vao); - +#endif glBindBuffer(GL_ARRAY_BUFFER, gl.vbo.geometry); glCheck(); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gl.vbo.idxs); glCheck(); @@ -956,9 +957,10 @@ void SetupModvolVBO() { +#if !defined(GLES) || defined(_ANDROID) if (gl.gl_major >= 3) glBindVertexArray(gl.vbo.vao); - +#endif glBindBuffer(GL_ARRAY_BUFFER, gl.vbo.modvols); glCheck(); //setup vertex buffers attrib pointers diff -ur 1/core/rend/gles/gles.cpp 2/core/rend/gles/gles.cpp --- 1/core/rend/gles/gles.cpp 2019-04-01 07:49:01.000000000 -0600 +++ 2/core/rend/gles/gles.cpp 2019-04-04 02:10:32.000000000 -0600 @@ -560,7 +560,10 @@ return false; } #ifdef GLES +// EGL only supports runtime loading with android? TDB +#ifdef _ANDROID load_gles_symbols(); +#endif #else egl_makecurrent(); if (gl3wInit()) @@ -1147,7 +1150,9 @@ //create vao //This is really not "proper", vaos are supposed to be defined once //i keep updating the same one to make the es2 code work in 3.1 context +#if !defined(GLES) || defined(_ANDROID) glGenVertexArrays(1, &gl.vbo.vao); +#endif } //create vbos @@ -1988,8 +1993,10 @@ void DrawOSD(bool clear_screen) { +#if !defined(GLES) || defined(_ANDROID) if (gl.gl_major >= 3) glBindVertexArray(gl.vbo.vao); +#endif glBindBuffer(GL_ARRAY_BUFFER, gl.vbo.geometry); glCheck(); glEnableVertexAttribArray(VERTEX_POS_ARRAY); glVertexAttribPointer(VERTEX_POS_ARRAY, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex,x)); diff -ur 1/core/rend/gles/gles.h 2/core/rend/gles/gles.h --- 1/core/rend/gles/gles.h 2019-04-01 07:49:01.000000000 -0600 +++ 2/core/rend/gles/gles.h 2019-04-04 02:10:32.000000000 -0600 @@ -15,7 +15,9 @@ #endif #include <GLES32/gl32.h> #include <GLES32/gl2ext.h> +#ifdef _ANDROID #include "gl32funcs.h" +#endif #ifndef GL_NV_draw_path //IMGTEC GLES emulation diff -ur 1/core/rend/gles/imgui_impl_opengl3.cpp 2/core/rend/gles/imgui_impl_opengl3.cpp --- 1/core/rend/gles/imgui_impl_opengl3.cpp 2019-04-01 07:49:01.000000000 -0600 +++ 2/core/rend/gles/imgui_impl_opengl3.cpp 2019-04-04 02:10:32.000000000 -0600 @@ -141,6 +141,7 @@ if (save_background) { +#if !defined(GLES) || defined(_ANDROID) if (!gl.is_gles && glReadBuffer != NULL) glReadBuffer(GL_FRONT); @@ -157,6 +158,7 @@ // Copy the current framebuffer into it glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, fb_width, fb_height); +#endif } // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, polygon fill @@ -188,10 +190,12 @@ glcache.UseProgram(g_ShaderHandle); glUniform1i(g_AttribLocationTex, 0); glUniformMatrix4fv(g_AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]); +#if !defined(GLES) || defined(_ANDROID) if (gl.gl_major >= 3 && glBindSampler != NULL) glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise. - +#endif GLuint vao_handle = 0; +#if !defined(GLES) || defined(_ANDROID) if (gl.gl_major >= 3) { // Recreate the VAO every time @@ -199,6 +203,7 @@ glGenVertexArrays(1, &vao_handle); glBindVertexArray(vao_handle); } +#endif glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle); glEnableVertexAttribArray(g_AttribLocationPosition); glEnableVertexAttribArray(g_AttribLocationUV); @@ -247,8 +252,10 @@ idx_buffer_offset += pcmd->ElemCount; } } +#if !defined(GLES) || defined(_ANDROID) if (vao_handle != 0) glDeleteVertexArrays(1, &vao_handle); +#endif } bool ImGui_ImplOpenGL3_CreateFontsTexture() ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/patches/reicastsa-01-libpng-fix-arm-neon.patch ================================================ --- a/core/deps/libpng/pngpriv.h +++ b/core/deps/libpng/pngpriv.h @@ -123,7 +123,7 @@ * Note that gcc-4.9 defines __ARM_NEON instead of __ARM_NEON__, so we * check both variants. */ -# if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \ +# if defined(PNG_ARM_NEON) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \ defined(PNG_ALIGNED_MEMORY_SUPPORTED) # define PNG_ARM_NEON_OPT 2 # else ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/patches/reicastsa-04-fix-neon.patch ================================================ diff --git a/shell/linux/Makefile b/shell/linux/Makefile index 75fc804..6d421a1 100644 --- a/shell/linux/Makefile +++ b/shell/linux/Makefile @@ -155,8 +155,8 @@ else ifneq (,$(findstring pandora,$(platform))) # ODROIDs else ifneq (,$(findstring odroid,$(platform))) - MFLAGS += -marm -mfpu=neon -mfloat-abi=hard -funroll-loops - ASFLAGS += -mfpu=neon -mfloat-abi=hard + MFLAGS += -marm -mfpu=neon-vfpv4 -mfloat-abi=hard -funroll-loops + ASFLAGS += -mfpu=neon-vfpv4 -mfloat-abi=hard CFLAGS += -D TARGET_BEAGLE -D TARGET_LINUX_ARMELv7 -DARM_HARDFP -fsingle-precision-constant USE_GLES := 1 INCS += -I/home/nicolas/dev/batocera/batocera-odroidxu4-414/output/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/ -I../linux-deps/include ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/reicastsa_old/config/reicast/emu_old.cfg ================================================ [audio] backend = auto disable = 0 [config] Debug.SerialConsoleEnabled = 0 Dreamcast.Broadcast = 4 Dreamcast.Cable = 3 Dreamcast.RTC = -2090049557 Dreamcast.Region = 3 Dynarec.Enabled = 1 Dynarec.idleskip = 1 Dynarec.unstable-opt = 0 aica.LimitFPS = 1 aica.NoBatch = 0 aica.NoSound = 0 aica.OldSyncronousDma = no bios.UseReios = 0 pvr.MaxThreads = 3 pvr.Subdivide = 0 pvr.SynchronousRendering = 0 pvr.rend = 0 rend.Clipping = 1 rend.UseMipmaps = 1 rend.WideScreen = 0 ta.skip = 0 [input] evdev_device_id_1 = 4 evdev_device_id_2 = 0 evdev_device_id_3 = -1 evdev_device_id_4 = -1 joystick_device_id = -1 [reios] ElfFile = [testing] ta.HashCheckFile = ta.HashLogFile = [validate] OpenGlChecks = 0 ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/reicastsa_old/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="reicastsa_old" PKG_VERSION="69371070f2c04a832f45e238afd703596f6e19f7" PKG_SHA256="ae1f64a520a1d14281b5745b43105e0d5dc6b37e43c3f594a10a0ece7edc1709" PKG_EE_UPDATE="no" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/reicast/reicast-emulator" PKG_URL="https://github.com/reicast/reicast-emulator/archive/${PKG_VERSION}.tar.gz" PKG_SOURCE_DIR="reicast-emulator-${PKG_VERSION}*" PKG_DEPENDS_TARGET="toolchain alsa libpng libevdev python-evdev" PKG_SHORTDESC="Reicast is a multi-platform Sega Dreamcast emulator" PKG_TOOLCHAIN="make" PKG_BUILD_FLAGS="-gold" PKG_PATCH_DIRS="${PROJECT}" make_target() { cd ${PKG_BUILD}/shell/linux make CC=${CC} CXX=${CXX} AS=${CC} STRIP=${STRIP} EXTRAFLAGS="-I${PKG_BUILD}/shell/linux-deps/include" platform=odroidc2 reicast.elf } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp reicast.elf ${INSTALL}/usr/bin/reicast_old mkdir -p ${INSTALL}/usr/config cp -r ${PKG_DIR}/config/* ${INSTALL}/usr/config/ } ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/reicastsa_old/patches/Amlogic/reicastsa-02-add_platform_OdroidC2.patch ================================================ --- a/shell/linux/Makefile 2019-01-18 11:46:08.000000000 -0600 +++ a/shell/linux/Makefile 2019-01-18 14:05:17.236571691 -0600 @@ -201,6 +201,10 @@ # ODROID-C1 & -C1+ ifneq (,$(findstring odroidc1,$(platform))) MFLAGS += -mtune=cortex-a5 + + else ifneq (,$(findstring odroidc2,$(platform))) # ODROID-C2 + #USE_SDL := 1 + MFLAGS += -mtune=cortex-a53 # ODROID-U2, -U3, -X & -X2 else ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/reicastsa_old/patches/Amlogic-ng/reicastsa-02-add_platform_OdroidC2.patch ================================================ --- a/shell/linux/Makefile 2019-01-18 11:46:08.000000000 -0600 +++ a/shell/linux/Makefile 2019-01-18 14:05:17.236571691 -0600 @@ -204,6 +204,10 @@ # ODROID-C1 & -C1+ ifneq (,$(findstring odroidc1,$(platform))) MFLAGS += -mtune=cortex-a5 + else ifneq (,$(findstring odroidc2,$(platform))) + MFLAGS += -mtune=cortex-a73.cortex-a53 + #CFLAGS += -D TARGET_NO_OPENMP + USE_GLES := 1 # ODROID-U2, -U3, -X & -X2 else ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/reicastsa_old/patches/reicastsa-01-libpng-fix-arm-neon.patch ================================================ --- a/core/deps/libpng/pngpriv.h +++ b/core/deps/libpng/pngpriv.h @@ -123,7 +123,7 @@ * Note that gcc-4.9 defines __ARM_NEON instead of __ARM_NEON__, so we * check both variants. */ -# if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \ +# if defined(PNG_ARM_NEON) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \ defined(PNG_ALIGNED_MEMORY_SUPPORTED) # define PNG_ARM_NEON_OPT 2 # else ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/reicastsa_old/patches/reicastsa-04-fix-neon.patch ================================================ diff --git a/shell/linux/Makefile b/shell/linux/Makefile index 75fc804..6d421a1 100644 --- a/shell/linux/Makefile +++ b/shell/linux/Makefile @@ -155,8 +155,8 @@ else ifneq (,$(findstring pandora,$(platform))) # ODROIDs else ifneq (,$(findstring odroid,$(platform))) - MFLAGS += -marm -mfpu=neon -mfloat-abi=hard -funroll-loops - ASFLAGS += -mfpu=neon -mfloat-abi=hard + MFLAGS += -marm -mfpu=neon-vfpv4 -mfloat-abi=hard -funroll-loops + ASFLAGS += -mfpu=neon-vfpv4 -mfloat-abi=hard CFLAGS += -D TARGET_BEAGLE -D TARGET_LINUX_ARMELv7 -DARM_HARDFP -fsingle-precision-constant USE_GLES := 1 INCS += -I/home/nicolas/dev/batocera/batocera-odroidxu4-414/output/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/ -I../linux-deps/include ================================================ FILE: packages/sx05re/tools/unused/emulators/reicastsa/scripts/reicast.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile REICASTBIN="/usr/bin/reicast" /usr/bin/setres.sh 16 #set reicast BIOS dir to point to /storage/roms/bios/dc if [ ! -L /storage/.local/share/reicast/data ]; then mkdir -p /storage/.local/share/reicast rm -rf /storage/.local/share/reicast/data ln -s /storage/roms/bios/dc /storage/.local/share/reicast/data fi if [ ! -L /storage/.local/share/reicast/mappings ]; then mkdir -p /storage/.local/share/reicast/ ln -sf /storage/.config/reicast/mappings /storage/.local/share/reicast/mappings fi # try to automatically set the gamepad in emu.cfg y=1 for D in `find /dev/input/by-id/ | grep -e event-joystick -e amepad`; do str=$(ls -la $D) i=$((${#str}-1)) DEVICE=$(echo "${str:$i:1}") CFG="/storage/.config/reicast/emu.cfg" sed -i -e "s/^evdev_device_id_$y =.*$/evdev_device_id_$y = $DEVICE/g" $CFG # echo "Device: $y input $DEVICE" y=$((y+1)) if [$y -lt 4]; then break fi done set_audio alsa [[ -f "/ee_s905" ]] && mv /storage/.config/asound.conf /storage/.config/asound.confs ${REICASTBIN} "$1" &>/dev/null [[ -f "/ee_s905" ]] && mv /storage/.config/asound.confs /storage/.config/asound.conf /usr/bin/setres.sh ================================================ FILE: packages/sx05re/tools/unused/fbida/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="fbida" PKG_VERSION="b733a22190c70443fedcd4e87397c426c9d48af6" PKG_SHA256="4aa43acc5c47fac8cb54db787d7a77ad4c20c08e2913162cf52a53ab9533740f" PKG_ARCH="any" PKG_SITE="https://github.com/kraxel/fbida" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libexif pixman libdrm libepoxy tiff fontconfig" PKG_SHORTDESC="The fbida project contains a few applications for viewing and editing images, with the main focus being photos." PKG_LONGDESC="The fbida project contains a few applications for viewing and editing images, with the main focus being photos." PKG_TOOLCHAIN="manual" pre_configure_target() { sed -i "s|cpp -include jpeglib.h|${CPP} -include ${SYSROOT_PREFIX}/usr/include/jpeglib.h|" GNUmakefile sed -i "s|LIRC||" GNUmakefile CFLAGS="${CFLAGS} -I$(get_build_dir libepoxy)/include" CFLAGS="${CFLAGS} -I$(get_build_dir libepoxy)/.${TARGET_NAME}/include" } make_target() { make -f GNUmakefile fbi } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp fbi ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/tools/unused/fbpad/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="fbpad" PKG_VERSION="52b6bed1d8ce6357992e8fff6d53fef3c9fb047c" PKG_SHA256="65ce00aa9709c4fc747499b0c5a8e0d084fa134678a3d781a7634f8d8a2f452f" PKG_LICENSE="MIT" PKG_SITE="https://github.com/aligrudi/fbpad" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A small Linux framebuffer virtual terminal http://litcave.rudi.ir/" PKG_TOOLCHAIN="auto" export CC=${CC} export CFLAGS="-Wall -O2" make_target() { make fbpad if [ "${DEVICE}" == "Amlogic-old" ]; then sed -i "s|unsigned int|unsigned short|" ${PKG_BUILD}/conf.h mv fbpad fbpad32 make fbpad fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin if [ "${DEVICE}" == "Amlogic-old" ]; then cp fbpad32 ${INSTALL}/usr/bin/fbpad cp fbpad ${INSTALL}/usr/bin/fbpad16 else cp fbpad ${INSTALL}/usr/bin/fbpad fi mkdir -p ${INSTALL}/usr/config/emuelec/configs cp courr.tf ${INSTALL}/usr/config/emuelec/configs mkdir -p ${INSTALL}/usr/share/terminfo tic -x ${PKG_BUILD}/fbpad-256 -o ${INSTALL}/usr/share/terminfo } ================================================ FILE: packages/sx05re/tools/unused/fbpad/sources/Makefile ================================================ all: fbpad %.o: %.c conf.h $(CC) -c $(CFLAGS) $< fbpad: fbpad.o term.o pad.o draw.o font.o isdw.o scrsnap.o $(CC) -o $@ $^ $(LDFLAGS) clean: rm -f *.o fbpad ================================================ FILE: packages/sx05re/tools/unused/fbpad/sources/conf.h ================================================ /* framebuffer device */ #define FBDEV "/dev/fb0" /* list of tags */ #define TAGS "xnlhtr01uiva-" #define TAGS_SAVED "" /* programs mapped to m-c, m-m, m-e */ #define SHELL {"bash"} #define EDITOR {"nano"} #define MAIL {"mailx", "-f", "+inbox"} /* TERM variable for launched programs */ #define TERM "fbpad-256" /* fbval_t should match framebuffer depth */ typedef unsigned int fbval_t; /* tinyfont files for regular, italic, and bold fonts */ #define FR "/storage/.config/emuelec/configs/courr.tf" #define FI NULL #define FB NULL /* foreground and background colors */ #define FGCOLOR COLOR2 #define BGCOLOR COLOR0 /* where to write the screen shot */ #define SCRSHOT "/tmp/scr" /* lock command password; NULL disables locking */ #define PASS NULL /* optimized version of fb_val() */ #define FB_VAL(r, g, b) fb_val((r), (g), (b)) /* brighten colors 0-7 for bold text */ #define BRIGHTEN 1 /* black */ #define COLOR0 0x000000 #define COLOR8 0x555555 /* red */ #define COLOR1 0xaa0000 #define COLOR9 0xff5555 /* green */ #define COLOR2 0x00aa00 #define COLORA 0x55ff55 /* yellow */ #define COLOR3 0xaa5500 #define COLORB 0xffff55 /* blue */ #define COLOR4 0x0000aa #define COLORC 0x5555ff /* magenta */ #define COLOR5 0xaa00aa #define COLORD 0xff55ff /* cyan */ #define COLOR6 0x00aaaa #define COLORE 0x55ffff /* white */ #define COLOR7 0xaaaaaa #define COLORF 0xffffff ================================================ FILE: packages/sx05re/tools/unused/fbpad/sources/draw.c ================================================ #include <fcntl.h> #include <linux/fb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <unistd.h> #include "draw.h" #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define NLEVELS (1 << 8) static struct fb_var_screeninfo vinfo; /* linux-specific FB structure */ static struct fb_fix_screeninfo finfo; /* linux-specific FB structure */ static int fd; /* FB device file descriptor */ static void *fb; /* mmap()ed FB memory */ static int bpp; /* bytes per pixel */ static int nr, ng, nb; /* color levels */ static int rl, rr, gl, gr, bl, br; /* shifts per color */ static int fb_len(void) { return finfo.line_length * vinfo.yres_virtual; } static void fb_cmap_save(int save) { static unsigned short red[NLEVELS], green[NLEVELS], blue[NLEVELS]; struct fb_cmap cmap; if (finfo.visual == FB_VISUAL_TRUECOLOR) return; cmap.start = 0; cmap.len = MAX(nr, MAX(ng, nb)); cmap.red = red; cmap.green = green; cmap.blue = blue; cmap.transp = NULL; ioctl(fd, save ? FBIOGETCMAP : FBIOPUTCMAP, &cmap); } void fb_cmap(void) { unsigned short red[NLEVELS], green[NLEVELS], blue[NLEVELS]; struct fb_cmap cmap; int i; if (finfo.visual == FB_VISUAL_TRUECOLOR) return; for (i = 0; i < nr; i++) red[i] = (65535 / (nr - 1)) * i; for (i = 0; i < ng; i++) green[i] = (65535 / (ng - 1)) * i; for (i = 0; i < nb; i++) blue[i] = (65535 / (nb - 1)) * i; cmap.start = 0; cmap.len = MAX(nr, MAX(ng, nb)); cmap.red = red; cmap.green = green; cmap.blue = blue; cmap.transp = NULL; ioctl(fd, FBIOPUTCMAP, &cmap); } unsigned fb_mode(void) { return ((rl < gl) << 22) | ((rl < bl) << 21) | ((gl < bl) << 20) | (bpp << 16) | (vinfo.red.length << 8) | (vinfo.green.length << 4) | (vinfo.blue.length); } static void init_colors(void) { nr = 1 << vinfo.red.length; ng = 1 << vinfo.blue.length; nb = 1 << vinfo.green.length; rr = 8 - vinfo.red.length; rl = vinfo.red.offset; gr = 8 - vinfo.green.length; gl = vinfo.green.offset; br = 8 - vinfo.blue.length; bl = vinfo.blue.offset; } int fb_init(char *dev) { fd = open(dev, O_RDWR); if (fd < 0) goto failed; if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) < 0) goto failed; if (ioctl(fd, FBIOGET_FSCREENINFO, &finfo) < 0) goto failed; fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); bpp = (vinfo.bits_per_pixel + 7) >> 3; fb = mmap(NULL, fb_len(), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); /* emuelec fbfix for n2 */ if (vinfo.yoffset != 0) { vinfo.yoffset = 0; if (ioctl(fd, FBIOPUT_VSCREENINFO, &vinfo)) { printf("Error setting variable information.\n"); exit(4); } } /* emuelec fbfix for n2 */ if (fb == MAP_FAILED) goto failed; init_colors(); fb_cmap_save(1); fb_cmap(); return 0; failed: perror("fb_init()"); close(fd); return 1; } void fb_free(void) { fb_cmap_save(0); munmap(fb, fb_len()); close(fd); } int fb_rows(void) { return vinfo.yres; } int fb_cols(void) { return vinfo.xres; } void *fb_mem(int r) { return fb + (r + vinfo.yoffset) * finfo.line_length + vinfo.xoffset * bpp; } unsigned fb_val(int r, int g, int b) { return ((r >> rr) << rl) | ((g >> gr) << gl) | ((b >> br) << bl); } ================================================ FILE: packages/sx05re/tools/unused/fbpad/sources/fbpad-256 ================================================ fbpad-256, use=linux, U8#0, colors#256, pairs#32767, setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, ================================================ FILE: packages/sx05re/tools/unused/munt_neon/math_neon/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present asakous (https://github.com/asakous) PKG_NAME="math_neon" PKG_VERSION="bc25cd6715796c2c656dca9244f042b79c6bac8c" PKG_ARCH="arm" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/asakous/math_neon" PKG_URL="https://github.com/asakous/math_neon.git" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="This project implements the cmath functions and some optimised matrix functions with the aim of increasing the floating point performance of ARM Cortex A-8 based platforms. As well as implementing the functions in ARM NEON assembly, they sacrifice error checking and some accuracy to achieve better performance" GET_HANDLER_SUPPORT="git" PKG_TOOLCHAIN="make" PKG_MAKE_OPTS_TARGET="all" pre_configure_target() { if [ "${DEVICE}" == "OdroidGoAdvance" ] || [ "${DEVICE}" == "GameForce" ]; then sed -i -e "s/cortex-a7/cortex-a35/" ${PKG_BUILD}/Makefile else sed -i -e "s/cortex-a7/cortex-a53/" ${PKG_BUILD}/Makefile fi } makeinstall_target() { cd ${PKG_BUILD} cp -f ${PKG_BUILD}/libmathneon.a ${SYSROOT_PREFIX}/usr/lib/ } ================================================ FILE: packages/sx05re/tools/unused/munt_neon/package.mk_ ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present asakous (https://github.com/asakous) PKG_NAME="munt_neon" PKG_VERSION="5785a6c9321179cf0544128ea4f740bb59f1928b" PKG_LICENSE="GPL" PKG_SITE="https://github.com/munt/munt" PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain math_neon" PKG_LONGDESC="A software synthesiser emulating pre-GM MIDI devices such as the Roland MT-32." GET_HANDLER_SUPPORT="git" PKG_CMAKE_OPTS_TARGET="-Dmunt_WITH_MT32EMU_QT=0 \ -Dmunt_WITH_MT32EMU_SMF2WAV=0 \ -Dlibmt32emu_SHARED=1" pre_configure_target() { if [ "$DEVICE" == "OdroidGoAdvance" ] || [ "$DEVICE" == "GameForce" ]; then sed -i -e "s/cortex-a7/cortex-a35/" $PKG_BUILD/mt32emu_alsadrv/Makefile else sed -i -e "s/cortex-a7/cortex-a53/" $PKG_BUILD/mt32emu_alsadrv/Makefile fi sed -i -e "s|../libmathneon.a|$(get_build_dir math_neon)/libmathneon.a|" $PKG_BUILD/mt32emu_alsadrv/Makefile sed -i -e "s|/usr/share/mt32-rom-data/|/storage/mt32-rom-data/|" $PKG_BUILD/mt32emu_alsadrv/src/alsadrv.cpp sed -i -e "s|../build/mt32emu/libmt32emu.a|${PKG_BUILD}/.${TARGET_NAME}/mt32emu/libmt32emu.so|" $PKG_BUILD/mt32emu_alsadrv/Makefile } post_configure_target() { cp -rf ${PKG_BUILD}/.${TARGET_NAME}/mt32emu/include/* $SYSROOT_PREFIX/usr/include } pre_makeinstall_target() { PKG_LIBNAME="libmt32emu.so.2" PKG_LIBPATH="$PKG_BUILD/.${TARGET_NAME}/mt32emu/libmt32emu.so*" cp $PKG_LIBPATH $SYSROOT_PREFIX/usr/lib cd $PKG_BUILD/mt32emu_alsadrv/ make mt32d } makeinstall_target() { mkdir -p $INSTALL/usr/bin cp mt32d $INSTALL/usr/bin/mt32d #build systems will not copy .la files so this is pointless mkdir -p $INSTALL/usr/lib cp $PKG_LIBPATH $INSTALL/usr/lib } ================================================ FILE: packages/sx05re/tools/unused/steam-controller/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="steam-controller" PKG_VERSION="60499dc" PKG_SHA256="04a846c6f659fb5efca7747fe78e15c1348b5e0579437bb425f538318289bb80" PKG_REV="102" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/ynsta/steamcontroller" PKG_URL="https://github.com/ynsta/steamcontroller/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 distutilscross:host python-libusb1 enum34 linux:host" PKG_SECTION="driver" PKG_SHORTDESC="A standalone userland driver for the steam controller to be used where steam client can't be installed." PKG_LONGDESC="A standalone userland driver for the steam controller to be used where steam client can't be installed." PKG_TOOLCHAIN="manual" pre_make_target() { export PYTHONXCPREFIX="${SYSROOT_PREFIX}/usr" export LDSHARED="${CC} -shared" } make_target() { python setup.py build } makeinstall_target() { find ${PKG_BUILD}/build/scripts-2.7 -type f -exec sed -i "s|\#\!/mnt.*|\#\!/usr/bin/python|g" {} \; mkdir -p ${INSTALL}/usr/bin/ cp -a ${PKG_BUILD}/build/scripts-2.7/* ${INSTALL}/usr/bin/ mkdir -p ${INSTALL}/usr/lib cp -a ${PKG_BUILD}/build/lib.linux-*-2.7/* ${INSTALL}/usr/lib/ cp -a $(get_build_dir python-libusb1)/build/lib/* ${INSTALL}/usr/lib/ cp -a $(get_build_dir enum34)/build/lib/* ${INSTALL}/usr/lib/ mkdir -p ${INSTALL}/usr/config/emuelec/scinclude/linux if [ -f "$(get_build_dir linux)/usr/include/linux/input-event-codes.h" ]; then cp $(get_build_dir linux)/usr/include/linux/input-event-codes.h ${INSTALL}/usr/config/emuelec/scinclude/linux/ fi cp $(get_build_dir linux)/usr/include/linux/input.h ${INSTALL}/usr/config/emuelec/scinclude/linux/input.h ${TOOLCHAIN}/bin/python -Wi -t -B ${TOOLCHAIN}/lib/${PKG_PYTHON_VERSION}/compileall.py ${INSTALL}/usr/lib/ -f 1>/dev/null find ${INSTALL}/usr/lib/ -name '*.py' -exec rm {} \; } post_install() { enable_service driver.steam-controller.service } ================================================ FILE: packages/sx05re/tools/unused/steam-controller/patches/steamcontroller-0001-fix-include-dir.patch ================================================ commit 8da1123bcbf3ad12b6c9d7975ebbb3f8663fd166 Author: Lukas Rusak <lorusak@gmail.com> Date: Sat Jan 7 13:50:30 2017 -0800 fix include dir diff --git a/src/uinput.py b/src/uinput.py index 684a018..ffc2354 100644 --- a/src/uinput.py +++ b/src/uinput.py @@ -36,10 +36,10 @@ from steamcontroller.tools import get_so_extensions from collections import deque # Get All defines from linux headers -if os.path.exists('/usr/include/linux/input-event-codes.h'): - CHEAD = defines('/usr/include', 'linux/input-event-codes.h') +if os.path.exists('/storage/.config/emuelec/scinclude/linux/input-event-codes.h'): + CHEAD = defines('/storage/.config/emuelec/scinclude', 'linux/input-event-codes.h') else: - CHEAD = defines('/usr/include', 'linux/input.h') + CHEAD = defines('/storage/.config/emuelec/scinclude', 'linux/input.h') # Keys enum contains all keys and button from linux/uinput.h (KEY_* BTN_*) Keys = IntEnum('Keys', {i: CHEAD[i] for i in CHEAD.keys() if (i.startswith('KEY_') or ================================================ FILE: packages/sx05re/tools/unused/steam-controller/patches/steamcontroller-0002-append-python-path.patch ================================================ commit b1bcba9b73d1e5e755ef6cda014ea3cc5a5ba270 Author: Lukas Rusak <lorusak@gmail.com> Date: Sat Jan 7 13:51:01 2017 -0800 append python path diff --git a/scripts/sc-callbacks.py b/scripts/sc-callbacks.py index eaeb658..35a272a 100755 --- a/scripts/sc-callbacks.py +++ b/scripts/sc-callbacks.py @@ -25,6 +25,8 @@ """Steam Controller Callback Mode example""" import sys +sys.path.append('/usr/lib') + from steamcontroller import SteamController, SCButtons from steamcontroller.events import EventMapper, Pos from steamcontroller.uinput import Keys diff --git a/scripts/sc-desktop.py b/scripts/sc-desktop.py index 9eff430..e0b8ec7 100755 --- a/scripts/sc-desktop.py +++ b/scripts/sc-desktop.py @@ -22,6 +22,10 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +import sys + +sys.path.append('/usr/lib') + """Steam Controller Mouse, Keyboard mode""" from steamcontroller import SteamController, SCButtons diff --git a/scripts/sc-dump.py b/scripts/sc-dump.py index b6f2c24..b582771 100755 --- a/scripts/sc-dump.py +++ b/scripts/sc-dump.py @@ -25,6 +25,9 @@ """Steam Controller USB Dumper""" import sys + +sys.path.append('/usr/lib') + from steamcontroller import SteamController def dump(_, sci): diff --git a/scripts/sc-mixed.py b/scripts/sc-mixed.py index 4a9c3c0..5e25af9 100755 --- a/scripts/sc-mixed.py +++ b/scripts/sc-mixed.py @@ -22,6 +22,10 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +import sys + +sys.path.append('/usr/lib') + """Steam Controller XBOX360 Gamepad Emulator""" from steamcontroller import \ diff --git a/scripts/sc-test-cmsg.py b/scripts/sc-test-cmsg.py index 08c8481..a59fbe9 100755 --- a/scripts/sc-test-cmsg.py +++ b/scripts/sc-test-cmsg.py @@ -26,6 +26,9 @@ import sys import struct + +sys.path.append('/usr/lib') + from steamcontroller import SteamController def dump(_, sci): diff --git a/scripts/sc-xbox.py b/scripts/sc-xbox.py index 814c8bc..89d4f55 100755 --- a/scripts/sc-xbox.py +++ b/scripts/sc-xbox.py @@ -22,6 +22,10 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +import sys + +sys.path.append('/usr/lib') + """Steam Controller XBOX360 Gamepad Emulator""" from steamcontroller import \ ================================================ FILE: packages/sx05re/tools/unused/steam-controller/patches/steamcontroller-0003-wait-for-controller-connection.patch ================================================ commit 21abfb33340ba34de9c7266568515fc42608b339 Author: Lukas Rusak <lorusak@gmail.com> Date: Fri Jan 13 14:27:18 2017 -0800 wait for controller diff --git a/src/__init__.py b/src/__init__.py index 1bf111e..353f032 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -24,7 +24,7 @@ import struct from enum import IntEnum from threading import Timer -from time import time +from time import time, sleep VENDOR_ID = 0x28de @@ -121,24 +121,28 @@ class SteamController(object): self._cmsg = [] self._ctx = usb1.USBContext() + _handle = None handle = [] pid = [] endpoint = [] ccidx = [] - for i in range(len(PRODUCT_ID)): - _pid = PRODUCT_ID[i] - _endpoint = ENDPOINT[i] - _ccidx = CONTROLIDX[i] - - _handle = self._ctx.openByVendorIDAndProductID( - VENDOR_ID, _pid, - skip_on_error=True, - ) - if _handle != None: - handle.append(_handle) - pid.append(_pid) - endpoint.append(_endpoint) - ccidx.append(_ccidx) + + while _handle is None: + for i in range(len(PRODUCT_ID)): + _pid = PRODUCT_ID[i] + _endpoint = ENDPOINT[i] + _ccidx = CONTROLIDX[i] + + _handle = self._ctx.openByVendorIDAndProductID( + VENDOR_ID, _pid, + skip_on_error=True, + ) + if _handle != None: + handle.append(_handle) + pid.append(_pid) + endpoint.append(_endpoint) + ccidx.append(_ccidx) + sleep(2) if len(handle) == 0: raise ValueError('No SteamControler Device found') ================================================ FILE: packages/sx05re/tools/unused/steam-controller/patches/steamcontroller-0004-use-run-for-pid-directory.patch ================================================ commit 5947f69820db3ce2d976ac533fb64319637d3f93 Author: Lukas Rusak <lorusak@gmail.com> Date: Sat Jan 7 13:53:36 2017 -0800 use run for pid directory diff --git a/scripts/sc-desktop.py b/scripts/sc-desktop.py index e0b8ec7..ad494d8 100755 --- a/scripts/sc-desktop.py +++ b/scripts/sc-desktop.py @@ -87,9 +87,9 @@ if __name__ == '__main__': parser.add_argument('-i', '--index', type=int, choices=[0,1,2,3], default=None) args = parser.parse_args() if args.index != None: - daemon = SCDaemon('/tmp/steamcontroller{:d}.pid'.format(args.index)) + daemon = SCDaemon('/run/steamcontroller{:d}.pid'.format(args.index)) else: - daemon = SCDaemon('/tmp/steamcontroller.pid') + daemon = SCDaemon('/run/steamcontroller.pid') if 'start' == args.command: daemon.start() diff --git a/scripts/sc-mixed.py b/scripts/sc-mixed.py index 5e25af9..c9139e7 100755 --- a/scripts/sc-mixed.py +++ b/scripts/sc-mixed.py @@ -126,9 +126,9 @@ if __name__ == '__main__': parser.add_argument('-i', '--index', type=int, choices=[0,1,2,3], default=None) args = parser.parse_args() if args.index != None: - daemon = SCDaemon('/tmp/steamcontroller{:d}.pid'.format(args.index)) + daemon = SCDaemon('/run/steamcontroller{:d}.pid'.format(args.index)) else: - daemon = SCDaemon('/tmp/steamcontroller.pid') + daemon = SCDaemon('/run/steamcontroller.pid') if 'start' == args.command: daemon.start() diff --git a/scripts/sc-xbox.py b/scripts/sc-xbox.py index 89d4f55..0c61b4e 100755 --- a/scripts/sc-xbox.py +++ b/scripts/sc-xbox.py @@ -86,9 +86,9 @@ if __name__ == '__main__': parser.add_argument('-i', '--index', type=int, choices=[0,1,2,3], default=None) args = parser.parse_args() if args.index != None: - daemon = SCDaemon('/tmp/steamcontroller{:d}.pid'.format(args.index)) + daemon = SCDaemon('/run/steamcontroller{:d}.pid'.format(args.index)) else: - daemon = SCDaemon('/tmp/steamcontroller.pid') + daemon = SCDaemon('/run/steamcontroller.pid') if 'start' == args.command: daemon.start() ================================================ FILE: packages/sx05re/tools/unused/steam-controller/patches/steamcontroller-0005-steam-client-will-never-be-running.patch ================================================ commit 1467b7cd9d153be6680cc818b10c66967a2f0951 Author: Lukas Rusak <lorusak@gmail.com> Date: Sat Jan 7 14:11:25 2017 -0800 steam client will never be running diff --git a/src/daemon.py b/src/daemon.py index 964c765..fba7792 100644 --- a/src/daemon.py +++ b/src/daemon.py @@ -9,7 +9,6 @@ import time import atexit import signal import syslog -import psutil import traceback import gc @@ -92,16 +91,12 @@ class Daemon(object): self.daemonize() syslog.syslog(syslog.LOG_INFO, '{}: started'.format(os.path.basename(sys.argv[0]))) while True: - # look if steam is running - if len([p for p in psutil.process_iter() if p.name() == 'steam']) == 0: - try: - self.run() - except Exception as e: # pylint: disable=W0703 - syslog.syslog(syslog.LOG_ERR, '{}: {!s}'.format(os.path.basename(sys.argv[0]), e)) - syslog.syslog(syslog.LOG_ERR, traceback.format_exc()) - gc.collect() - else: - syslog.syslog(syslog.LOG_INFO, '{}: steam client is runing'.format(os.path.basename(sys.argv[0]))) + try: + self.run() + except Exception as e: # pylint: disable=W0703 + syslog.syslog(syslog.LOG_ERR, '{}: {!s}'.format(os.path.basename(sys.argv[0]), e)) + syslog.syslog(syslog.LOG_ERR, traceback.format_exc()) + gc.collect() time.sleep(2) def stop(self): ================================================ FILE: packages/sx05re/tools/unused/steam-controller/system.d/driver.steam-controller.service ================================================ [Unit] Description=Steam Controller driver [Service] Type=forking ExecStart=/usr/bin/python /usr/bin/sc-xbox.py start ExecReload=/usr/bin/python /usr/bin/sc-xbox.py restart ExecStop=/usr/bin/python /usr/bin/sc-xbox.py stop PIDFile=/run/steamcontroller.pid Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target ================================================ FILE: packages/sx05re/tools/video/capsimg/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Frank Hartung (supervisedthinking (@) gmail.com) PKG_NAME="capsimg" PKG_VERSION="5d306bb19bc4382367a1e489fb36768fd224b5e6" PKG_SHA256="340a4a167a1d457076d133f14ceb3f8fe20773511c3bc37b1dd633e6b81b2da8" PKG_LICENSE="GPL" PKG_SITE="https://github.com/FrodeSolheim/capsimg" PKG_URL="https://github.com/FrodeSolheim/capsimg/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="SPS Decoder Library 5.1 (formerly IPF Decoder Lib)" PKG_TOOLCHAIN="make" PKG_MAKE_OPTS_TARGET="-C CAPSImg" pre_configure_target() { ./bootstrap.fs ./configure.fs --host=${TARGET_NAME} } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib cp -v CAPSImg/libcapsimage.so.5.1 ${INSTALL}/usr/lib/ ln -sf libcapsimage.so.5.1 ${INSTALL}/usr/lib/libcapsimage.so.5 ln -sf libcapsimage.so.5.1 ${INSTALL}/usr/lib/libcapsimage.so ln -sf libcapsimage.so.5.1 ${INSTALL}/usr/lib/capsimg.so } ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/X11/X.h ================================================ /* Definitions for the X window system likely to be used by applications */ #ifndef X_H #define X_H /*********************************************************** Copyright 1987, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Digital not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ #define X_PROTOCOL 11 /* current protocol version */ #define X_PROTOCOL_REVISION 0 /* current minor version */ /* Resources */ /* * _XSERVER64 must ONLY be defined when compiling X server sources on * systems where unsigned long is not 32 bits, must NOT be used in * client or library code. */ #ifndef _XSERVER64 # ifndef _XTYPEDEF_XID # define _XTYPEDEF_XID typedef unsigned long XID; # endif # ifndef _XTYPEDEF_MASK # define _XTYPEDEF_MASK typedef unsigned long Mask; # endif # ifndef _XTYPEDEF_ATOM # define _XTYPEDEF_ATOM typedef unsigned long Atom; /* Also in Xdefs.h */ # endif typedef unsigned long VisualID; typedef unsigned long Time; #else # include <X11/Xmd.h> # ifndef _XTYPEDEF_XID # define _XTYPEDEF_XID typedef CARD32 XID; # endif # ifndef _XTYPEDEF_MASK # define _XTYPEDEF_MASK typedef CARD32 Mask; # endif # ifndef _XTYPEDEF_ATOM # define _XTYPEDEF_ATOM typedef CARD32 Atom; # endif typedef CARD32 VisualID; typedef CARD32 Time; #endif typedef XID Window; typedef XID Drawable; #ifndef _XTYPEDEF_FONT # define _XTYPEDEF_FONT typedef XID Font; #endif typedef XID Pixmap; typedef XID Cursor; typedef XID Colormap; typedef XID GContext; typedef XID KeySym; typedef unsigned char KeyCode; /***************************************************************** * RESERVED RESOURCE AND CONSTANT DEFINITIONS *****************************************************************/ #ifndef None #define None 0L /* universal null resource or null atom */ #endif #define ParentRelative 1L /* background pixmap in CreateWindow and ChangeWindowAttributes */ #define CopyFromParent 0L /* border pixmap in CreateWindow and ChangeWindowAttributes special VisualID and special window class passed to CreateWindow */ #define PointerWindow 0L /* destination window in SendEvent */ #define InputFocus 1L /* destination window in SendEvent */ #define PointerRoot 1L /* focus window in SetInputFocus */ #define AnyPropertyType 0L /* special Atom, passed to GetProperty */ #define AnyKey 0L /* special Key Code, passed to GrabKey */ #define AnyButton 0L /* special Button Code, passed to GrabButton */ #define AllTemporary 0L /* special Resource ID passed to KillClient */ #define CurrentTime 0L /* special Time */ #define NoSymbol 0L /* special KeySym */ /***************************************************************** * EVENT DEFINITIONS *****************************************************************/ /* Input Event Masks. Used as event-mask window attribute and as arguments to Grab requests. Not to be confused with event names. */ #define NoEventMask 0L #define KeyPressMask (1L<<0) #define KeyReleaseMask (1L<<1) #define ButtonPressMask (1L<<2) #define ButtonReleaseMask (1L<<3) #define EnterWindowMask (1L<<4) #define LeaveWindowMask (1L<<5) #define PointerMotionMask (1L<<6) #define PointerMotionHintMask (1L<<7) #define Button1MotionMask (1L<<8) #define Button2MotionMask (1L<<9) #define Button3MotionMask (1L<<10) #define Button4MotionMask (1L<<11) #define Button5MotionMask (1L<<12) #define ButtonMotionMask (1L<<13) #define KeymapStateMask (1L<<14) #define ExposureMask (1L<<15) #define VisibilityChangeMask (1L<<16) #define StructureNotifyMask (1L<<17) #define ResizeRedirectMask (1L<<18) #define SubstructureNotifyMask (1L<<19) #define SubstructureRedirectMask (1L<<20) #define FocusChangeMask (1L<<21) #define PropertyChangeMask (1L<<22) #define ColormapChangeMask (1L<<23) #define OwnerGrabButtonMask (1L<<24) /* Event names. Used in "type" field in XEvent structures. Not to be confused with event masks above. They start from 2 because 0 and 1 are reserved in the protocol for errors and replies. */ #define KeyPress 2 #define KeyRelease 3 #define ButtonPress 4 #define ButtonRelease 5 #define MotionNotify 6 #define EnterNotify 7 #define LeaveNotify 8 #define FocusIn 9 #define FocusOut 10 #define KeymapNotify 11 #define Expose 12 #define GraphicsExpose 13 #define NoExpose 14 #define VisibilityNotify 15 #define CreateNotify 16 #define DestroyNotify 17 #define UnmapNotify 18 #define MapNotify 19 #define MapRequest 20 #define ReparentNotify 21 #define ConfigureNotify 22 #define ConfigureRequest 23 #define GravityNotify 24 #define ResizeRequest 25 #define CirculateNotify 26 #define CirculateRequest 27 #define PropertyNotify 28 #define SelectionClear 29 #define SelectionRequest 30 #define SelectionNotify 31 #define ColormapNotify 32 #define ClientMessage 33 #define MappingNotify 34 #define GenericEvent 35 #define LASTEvent 36 /* must be bigger than any event # */ /* Key masks. Used as modifiers to GrabButton and GrabKey, results of QueryPointer, state in various key-, mouse-, and button-related events. */ #define ShiftMask (1<<0) #define LockMask (1<<1) #define ControlMask (1<<2) #define Mod1Mask (1<<3) #define Mod2Mask (1<<4) #define Mod3Mask (1<<5) #define Mod4Mask (1<<6) #define Mod5Mask (1<<7) /* modifier names. Used to build a SetModifierMapping request or to read a GetModifierMapping request. These correspond to the masks defined above. */ #define ShiftMapIndex 0 #define LockMapIndex 1 #define ControlMapIndex 2 #define Mod1MapIndex 3 #define Mod2MapIndex 4 #define Mod3MapIndex 5 #define Mod4MapIndex 6 #define Mod5MapIndex 7 /* button masks. Used in same manner as Key masks above. Not to be confused with button names below. */ #define Button1Mask (1<<8) #define Button2Mask (1<<9) #define Button3Mask (1<<10) #define Button4Mask (1<<11) #define Button5Mask (1<<12) #define AnyModifier (1<<15) /* used in GrabButton, GrabKey */ /* button names. Used as arguments to GrabButton and as detail in ButtonPress and ButtonRelease events. Not to be confused with button masks above. Note that 0 is already defined above as "AnyButton". */ #define Button1 1 #define Button2 2 #define Button3 3 #define Button4 4 #define Button5 5 /* Notify modes */ #define NotifyNormal 0 #define NotifyGrab 1 #define NotifyUngrab 2 #define NotifyWhileGrabbed 3 #define NotifyHint 1 /* for MotionNotify events */ /* Notify detail */ #define NotifyAncestor 0 #define NotifyVirtual 1 #define NotifyInferior 2 #define NotifyNonlinear 3 #define NotifyNonlinearVirtual 4 #define NotifyPointer 5 #define NotifyPointerRoot 6 #define NotifyDetailNone 7 /* Visibility notify */ #define VisibilityUnobscured 0 #define VisibilityPartiallyObscured 1 #define VisibilityFullyObscured 2 /* Circulation request */ #define PlaceOnTop 0 #define PlaceOnBottom 1 /* protocol families */ #define FamilyInternet 0 /* IPv4 */ #define FamilyDECnet 1 #define FamilyChaos 2 #define FamilyInternet6 6 /* IPv6 */ /* authentication families not tied to a specific protocol */ #define FamilyServerInterpreted 5 /* Property notification */ #define PropertyNewValue 0 #define PropertyDelete 1 /* Color Map notification */ #define ColormapUninstalled 0 #define ColormapInstalled 1 /* GrabPointer, GrabButton, GrabKeyboard, GrabKey Modes */ #define GrabModeSync 0 #define GrabModeAsync 1 /* GrabPointer, GrabKeyboard reply status */ #define GrabSuccess 0 #define AlreadyGrabbed 1 #define GrabInvalidTime 2 #define GrabNotViewable 3 #define GrabFrozen 4 /* AllowEvents modes */ #define AsyncPointer 0 #define SyncPointer 1 #define ReplayPointer 2 #define AsyncKeyboard 3 #define SyncKeyboard 4 #define ReplayKeyboard 5 #define AsyncBoth 6 #define SyncBoth 7 /* Used in SetInputFocus, GetInputFocus */ #define RevertToNone (int)None #define RevertToPointerRoot (int)PointerRoot #define RevertToParent 2 /***************************************************************** * ERROR CODES *****************************************************************/ #define Success 0 /* everything's okay */ #define BadRequest 1 /* bad request code */ #define BadValue 2 /* int parameter out of range */ #define BadWindow 3 /* parameter not a Window */ #define BadPixmap 4 /* parameter not a Pixmap */ #define BadAtom 5 /* parameter not an Atom */ #define BadCursor 6 /* parameter not a Cursor */ #define BadFont 7 /* parameter not a Font */ #define BadMatch 8 /* parameter mismatch */ #define BadDrawable 9 /* parameter not a Pixmap or Window */ #define BadAccess 10 /* depending on context: - key/button already grabbed - attempt to free an illegal cmap entry - attempt to store into a read-only color map entry. - attempt to modify the access control list from other than the local host. */ #define BadAlloc 11 /* insufficient resources */ #define BadColor 12 /* no such colormap */ #define BadGC 13 /* parameter not a GC */ #define BadIDChoice 14 /* choice not in range or already used */ #define BadName 15 /* font or color name doesn't exist */ #define BadLength 16 /* Request length incorrect */ #define BadImplementation 17 /* server is defective */ #define FirstExtensionError 128 #define LastExtensionError 255 /***************************************************************** * WINDOW DEFINITIONS *****************************************************************/ /* Window classes used by CreateWindow */ /* Note that CopyFromParent is already defined as 0 above */ #define InputOutput 1 #define InputOnly 2 /* Window attributes for CreateWindow and ChangeWindowAttributes */ #define CWBackPixmap (1L<<0) #define CWBackPixel (1L<<1) #define CWBorderPixmap (1L<<2) #define CWBorderPixel (1L<<3) #define CWBitGravity (1L<<4) #define CWWinGravity (1L<<5) #define CWBackingStore (1L<<6) #define CWBackingPlanes (1L<<7) #define CWBackingPixel (1L<<8) #define CWOverrideRedirect (1L<<9) #define CWSaveUnder (1L<<10) #define CWEventMask (1L<<11) #define CWDontPropagate (1L<<12) #define CWColormap (1L<<13) #define CWCursor (1L<<14) /* ConfigureWindow structure */ #define CWX (1<<0) #define CWY (1<<1) #define CWWidth (1<<2) #define CWHeight (1<<3) #define CWBorderWidth (1<<4) #define CWSibling (1<<5) #define CWStackMode (1<<6) /* Bit Gravity */ #define ForgetGravity 0 #define NorthWestGravity 1 #define NorthGravity 2 #define NorthEastGravity 3 #define WestGravity 4 #define CenterGravity 5 #define EastGravity 6 #define SouthWestGravity 7 #define SouthGravity 8 #define SouthEastGravity 9 #define StaticGravity 10 /* Window gravity + bit gravity above */ #define UnmapGravity 0 /* Used in CreateWindow for backing-store hint */ #define NotUseful 0 #define WhenMapped 1 #define Always 2 /* Used in GetWindowAttributes reply */ #define IsUnmapped 0 #define IsUnviewable 1 #define IsViewable 2 /* Used in ChangeSaveSet */ #define SetModeInsert 0 #define SetModeDelete 1 /* Used in ChangeCloseDownMode */ #define DestroyAll 0 #define RetainPermanent 1 #define RetainTemporary 2 /* Window stacking method (in configureWindow) */ #define Above 0 #define Below 1 #define TopIf 2 #define BottomIf 3 #define Opposite 4 /* Circulation direction */ #define RaiseLowest 0 #define LowerHighest 1 /* Property modes */ #define PropModeReplace 0 #define PropModePrepend 1 #define PropModeAppend 2 /***************************************************************** * GRAPHICS DEFINITIONS *****************************************************************/ /* graphics functions, as in GC.alu */ #define GXclear 0x0 /* 0 */ #define GXand 0x1 /* src AND dst */ #define GXandReverse 0x2 /* src AND NOT dst */ #define GXcopy 0x3 /* src */ #define GXandInverted 0x4 /* NOT src AND dst */ #define GXnoop 0x5 /* dst */ #define GXxor 0x6 /* src XOR dst */ #define GXor 0x7 /* src OR dst */ #define GXnor 0x8 /* NOT src AND NOT dst */ #define GXequiv 0x9 /* NOT src XOR dst */ #define GXinvert 0xa /* NOT dst */ #define GXorReverse 0xb /* src OR NOT dst */ #define GXcopyInverted 0xc /* NOT src */ #define GXorInverted 0xd /* NOT src OR dst */ #define GXnand 0xe /* NOT src OR NOT dst */ #define GXset 0xf /* 1 */ /* LineStyle */ #define LineSolid 0 #define LineOnOffDash 1 #define LineDoubleDash 2 /* capStyle */ #define CapNotLast 0 #define CapButt 1 #define CapRound 2 #define CapProjecting 3 /* joinStyle */ #define JoinMiter 0 #define JoinRound 1 #define JoinBevel 2 /* fillStyle */ #define FillSolid 0 #define FillTiled 1 #define FillStippled 2 #define FillOpaqueStippled 3 /* fillRule */ #define EvenOddRule 0 #define WindingRule 1 /* subwindow mode */ #define ClipByChildren 0 #define IncludeInferiors 1 /* SetClipRectangles ordering */ #define Unsorted 0 #define YSorted 1 #define YXSorted 2 #define YXBanded 3 /* CoordinateMode for drawing routines */ #define CoordModeOrigin 0 /* relative to the origin */ #define CoordModePrevious 1 /* relative to previous point */ /* Polygon shapes */ #define Complex 0 /* paths may intersect */ #define Nonconvex 1 /* no paths intersect, but not convex */ #define Convex 2 /* wholly convex */ /* Arc modes for PolyFillArc */ #define ArcChord 0 /* join endpoints of arc */ #define ArcPieSlice 1 /* join endpoints to center of arc */ /* GC components: masks used in CreateGC, CopyGC, ChangeGC, OR'ed into GC.stateChanges */ #define GCFunction (1L<<0) #define GCPlaneMask (1L<<1) #define GCForeground (1L<<2) #define GCBackground (1L<<3) #define GCLineWidth (1L<<4) #define GCLineStyle (1L<<5) #define GCCapStyle (1L<<6) #define GCJoinStyle (1L<<7) #define GCFillStyle (1L<<8) #define GCFillRule (1L<<9) #define GCTile (1L<<10) #define GCStipple (1L<<11) #define GCTileStipXOrigin (1L<<12) #define GCTileStipYOrigin (1L<<13) #define GCFont (1L<<14) #define GCSubwindowMode (1L<<15) #define GCGraphicsExposures (1L<<16) #define GCClipXOrigin (1L<<17) #define GCClipYOrigin (1L<<18) #define GCClipMask (1L<<19) #define GCDashOffset (1L<<20) #define GCDashList (1L<<21) #define GCArcMode (1L<<22) #define GCLastBit 22 /***************************************************************** * FONTS *****************************************************************/ /* used in QueryFont -- draw direction */ #define FontLeftToRight 0 #define FontRightToLeft 1 #define FontChange 255 /***************************************************************** * IMAGING *****************************************************************/ /* ImageFormat -- PutImage, GetImage */ #define XYBitmap 0 /* depth 1, XYFormat */ #define XYPixmap 1 /* depth == drawable depth */ #define ZPixmap 2 /* depth == drawable depth */ /***************************************************************** * COLOR MAP STUFF *****************************************************************/ /* For CreateColormap */ #define AllocNone 0 /* create map with no entries */ #define AllocAll 1 /* allocate entire map writeable */ /* Flags used in StoreNamedColor, StoreColors */ #define DoRed (1<<0) #define DoGreen (1<<1) #define DoBlue (1<<2) /***************************************************************** * CURSOR STUFF *****************************************************************/ /* QueryBestSize Class */ #define CursorShape 0 /* largest size that can be displayed */ #define TileShape 1 /* size tiled fastest */ #define StippleShape 2 /* size stippled fastest */ /***************************************************************** * KEYBOARD/POINTER STUFF *****************************************************************/ #define AutoRepeatModeOff 0 #define AutoRepeatModeOn 1 #define AutoRepeatModeDefault 2 #define LedModeOff 0 #define LedModeOn 1 /* masks for ChangeKeyboardControl */ #define KBKeyClickPercent (1L<<0) #define KBBellPercent (1L<<1) #define KBBellPitch (1L<<2) #define KBBellDuration (1L<<3) #define KBLed (1L<<4) #define KBLedMode (1L<<5) #define KBKey (1L<<6) #define KBAutoRepeatMode (1L<<7) #define MappingSuccess 0 #define MappingBusy 1 #define MappingFailed 2 #define MappingModifier 0 #define MappingKeyboard 1 #define MappingPointer 2 /***************************************************************** * SCREEN SAVER STUFF *****************************************************************/ #define DontPreferBlanking 0 #define PreferBlanking 1 #define DefaultBlanking 2 #define DisableScreenSaver 0 #define DisableScreenInterval 0 #define DontAllowExposures 0 #define AllowExposures 1 #define DefaultExposures 2 /* for ForceScreenSaver */ #define ScreenSaverReset 0 #define ScreenSaverActive 1 /***************************************************************** * HOSTS AND CONNECTIONS *****************************************************************/ /* for ChangeHosts */ #define HostInsert 0 #define HostDelete 1 /* for ChangeAccessControl */ #define EnableAccess 1 #define DisableAccess 0 /* Display classes used in opening the connection * Note that the statically allocated ones are even numbered and the * dynamically changeable ones are odd numbered */ #define StaticGray 0 #define GrayScale 1 #define StaticColor 2 #define PseudoColor 3 #define TrueColor 4 #define DirectColor 5 /* Byte order used in imageByteOrder and bitmapBitOrder */ #define LSBFirst 0 #define MSBFirst 1 #endif /* X_H */ ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/X11/Xatom.h ================================================ #ifndef XATOM_H #define XATOM_H 1 /* THIS IS A GENERATED FILE * * Do not change! Changing this file implies a protocol change! */ #define XA_PRIMARY ((Atom) 1) #define XA_SECONDARY ((Atom) 2) #define XA_ARC ((Atom) 3) #define XA_ATOM ((Atom) 4) #define XA_BITMAP ((Atom) 5) #define XA_CARDINAL ((Atom) 6) #define XA_COLORMAP ((Atom) 7) #define XA_CURSOR ((Atom) 8) #define XA_CUT_BUFFER0 ((Atom) 9) #define XA_CUT_BUFFER1 ((Atom) 10) #define XA_CUT_BUFFER2 ((Atom) 11) #define XA_CUT_BUFFER3 ((Atom) 12) #define XA_CUT_BUFFER4 ((Atom) 13) #define XA_CUT_BUFFER5 ((Atom) 14) #define XA_CUT_BUFFER6 ((Atom) 15) #define XA_CUT_BUFFER7 ((Atom) 16) #define XA_DRAWABLE ((Atom) 17) #define XA_FONT ((Atom) 18) #define XA_INTEGER ((Atom) 19) #define XA_PIXMAP ((Atom) 20) #define XA_POINT ((Atom) 21) #define XA_RECTANGLE ((Atom) 22) #define XA_RESOURCE_MANAGER ((Atom) 23) #define XA_RGB_COLOR_MAP ((Atom) 24) #define XA_RGB_BEST_MAP ((Atom) 25) #define XA_RGB_BLUE_MAP ((Atom) 26) #define XA_RGB_DEFAULT_MAP ((Atom) 27) #define XA_RGB_GRAY_MAP ((Atom) 28) #define XA_RGB_GREEN_MAP ((Atom) 29) #define XA_RGB_RED_MAP ((Atom) 30) #define XA_STRING ((Atom) 31) #define XA_VISUALID ((Atom) 32) #define XA_WINDOW ((Atom) 33) #define XA_WM_COMMAND ((Atom) 34) #define XA_WM_HINTS ((Atom) 35) #define XA_WM_CLIENT_MACHINE ((Atom) 36) #define XA_WM_ICON_NAME ((Atom) 37) #define XA_WM_ICON_SIZE ((Atom) 38) #define XA_WM_NAME ((Atom) 39) #define XA_WM_NORMAL_HINTS ((Atom) 40) #define XA_WM_SIZE_HINTS ((Atom) 41) #define XA_WM_ZOOM_HINTS ((Atom) 42) #define XA_MIN_SPACE ((Atom) 43) #define XA_NORM_SPACE ((Atom) 44) #define XA_MAX_SPACE ((Atom) 45) #define XA_END_SPACE ((Atom) 46) #define XA_SUPERSCRIPT_X ((Atom) 47) #define XA_SUPERSCRIPT_Y ((Atom) 48) #define XA_SUBSCRIPT_X ((Atom) 49) #define XA_SUBSCRIPT_Y ((Atom) 50) #define XA_UNDERLINE_POSITION ((Atom) 51) #define XA_UNDERLINE_THICKNESS ((Atom) 52) #define XA_STRIKEOUT_ASCENT ((Atom) 53) #define XA_STRIKEOUT_DESCENT ((Atom) 54) #define XA_ITALIC_ANGLE ((Atom) 55) #define XA_X_HEIGHT ((Atom) 56) #define XA_QUAD_WIDTH ((Atom) 57) #define XA_WEIGHT ((Atom) 58) #define XA_POINT_SIZE ((Atom) 59) #define XA_RESOLUTION ((Atom) 60) #define XA_COPYRIGHT ((Atom) 61) #define XA_NOTICE ((Atom) 62) #define XA_FONT_NAME ((Atom) 63) #define XA_FAMILY_NAME ((Atom) 64) #define XA_FULL_NAME ((Atom) 65) #define XA_CAP_HEIGHT ((Atom) 66) #define XA_WM_CLASS ((Atom) 67) #define XA_WM_TRANSIENT_FOR ((Atom) 68) #define XA_LAST_PREDEFINED ((Atom) 68) #endif /* XATOM_H */ ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/X11/Xdefs.h ================================================ /*********************************************************** Copyright (c) 1999 The XFree86 Project Inc. All Rights Reserved. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of The XFree86 Project Inc. shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The XFree86 Project Inc.. */ /** ** Types definitions shared between server and clients **/ #ifndef _XDEFS_H #define _XDEFS_H #ifdef _XSERVER64 #include <X11/Xmd.h> #endif #ifndef _XTYPEDEF_ATOM # define _XTYPEDEF_ATOM # ifndef _XSERVER64 typedef unsigned long Atom; # else typedef CARD32 Atom; # endif #endif #ifndef Bool # ifndef _XTYPEDEF_BOOL # define _XTYPEDEF_BOOL typedef int Bool; # endif #endif #ifndef _XTYPEDEF_POINTER # define _XTYPEDEF_POINTER typedef void *pointer; #endif #ifndef _XTYPEDEF_CLIENTPTR typedef struct _Client *ClientPtr; # define _XTYPEDEF_CLIENTPTR #endif #ifndef _XTYPEDEF_XID # define _XTYPEDEF_XID # ifndef _XSERVER64 typedef unsigned long XID; # else typedef CARD32 XID; # endif #endif #ifndef _XTYPEDEF_MASK # define _XTYPEDEF_MASK # ifndef _XSERVER64 typedef unsigned long Mask; # else typedef CARD32 Mask; # endif #endif #ifndef _XTYPEDEF_FONTPTR # define _XTYPEDEF_FONTPTR typedef struct _Font *FontPtr; /* also in fonts/include/font.h */ #endif #ifndef _XTYPEDEF_FONT # define _XTYPEDEF_FONT typedef XID Font; #endif #ifndef _XTYPEDEF_FSID # ifndef _XSERVER64 typedef unsigned long FSID; # else typedef CARD32 FSID; # endif #endif typedef FSID AccContext; /* OS independent time value XXX Should probably go in Xos.h */ typedef struct timeval **OSTimePtr; typedef void (* BlockHandlerProcPtr)(void * /* blockData */, OSTimePtr /* pTimeout */, void * /* pReadmask */); #endif ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/X11/Xfuncproto.h ================================================ /* Xfuncproto.h. Generated from Xfuncproto.h.in by configure. */ /* * Copyright 1989, 1991, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. * */ /* Definitions to make function prototypes manageable */ #ifndef _XFUNCPROTO_H_ #define _XFUNCPROTO_H_ #ifndef NeedFunctionPrototypes #define NeedFunctionPrototypes 1 #endif /* NeedFunctionPrototypes */ #ifndef NeedVarargsPrototypes #define NeedVarargsPrototypes 1 #endif /* NeedVarargsPrototypes */ #if NeedFunctionPrototypes #ifndef NeedNestedPrototypes #define NeedNestedPrototypes 1 #endif /* NeedNestedPrototypes */ #ifndef _Xconst #define _Xconst const #endif /* _Xconst */ /* Function prototype configuration (see configure for more info) */ #ifndef NARROWPROTO #define NARROWPROTO /**/ #endif #ifndef FUNCPROTO #define FUNCPROTO 15 #endif #ifndef NeedWidePrototypes #ifdef NARROWPROTO #define NeedWidePrototypes 0 #else #define NeedWidePrototypes 1 /* default to make interropt. easier */ #endif #endif /* NeedWidePrototypes */ #endif /* NeedFunctionPrototypes */ #ifndef _XFUNCPROTOBEGIN #if defined(__cplusplus) || defined(c_plusplus) /* for C++ V2.0 */ #define _XFUNCPROTOBEGIN extern "C" { /* do not leave open across includes */ #define _XFUNCPROTOEND } #else #define _XFUNCPROTOBEGIN #define _XFUNCPROTOEND #endif #endif /* _XFUNCPROTOBEGIN */ /* Added in X11R6.9, so available in any version of modular xproto */ #if defined(__GNUC__) && (__GNUC__ >= 4) # define _X_SENTINEL(x) __attribute__ ((__sentinel__(x))) #else # define _X_SENTINEL(x) #endif /* GNUC >= 4 */ /* Added in X11R6.9, so available in any version of modular xproto */ #if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__CYGWIN__) # define _X_EXPORT __attribute__((visibility("default"))) # define _X_HIDDEN __attribute__((visibility("hidden"))) # define _X_INTERNAL __attribute__((visibility("internal"))) #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) # define _X_EXPORT __global # define _X_HIDDEN __hidden # define _X_INTERNAL __hidden #else /* not gcc >= 4 and not Sun Studio >= 8 */ # define _X_EXPORT # define _X_HIDDEN # define _X_INTERNAL #endif /* GNUC >= 4 */ /* requires xproto >= 7.0.9 */ #if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 303) # define _X_LIKELY(x) __builtin_expect(!!(x), 1) # define _X_UNLIKELY(x) __builtin_expect(!!(x), 0) #else /* not gcc >= 3.3 */ # define _X_LIKELY(x) (x) # define _X_UNLIKELY(x) (x) #endif /* Added in X11R6.9, so available in any version of modular xproto */ #if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 301) # define _X_DEPRECATED __attribute__((deprecated)) #else /* not gcc >= 3.1 */ # define _X_DEPRECATED #endif /* requires xproto >= 7.0.17 */ #if (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 205)) \ || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) # define _X_NORETURN __attribute((noreturn)) #else # define _X_NORETURN #endif /* GNUC */ /* Added in X11R6.9, so available in any version of modular xproto */ #if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 203) # define _X_ATTRIBUTE_PRINTF(x,y) __attribute__((__format__(__printf__,x,y))) #else /* not gcc >= 2.3 */ # define _X_ATTRIBUTE_PRINTF(x,y) #endif /* requires xproto >= 7.0.22 */ #if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 303) #define _X_NONNULL(args...) __attribute__((nonnull(args))) #else #define _X_NONNULL(...) /* */ #endif /* requires xproto >= 7.0.22 */ #if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 205) #define _X_UNUSED __attribute__((__unused__)) #else #define _X_UNUSED /* */ #endif /* C99 keyword "inline" or equivalent extensions in pre-C99 compilers */ /* requires xproto >= 7.0.9 (introduced in 7.0.8 but didn't support all compilers until 7.0.9) */ #if defined(inline) /* assume autoconf set it correctly */ || \ (defined(__STDC_VERSION__) && (__STDC_VERSION__ - 0 >= 199901L)) /* C99 */ || \ (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)) # define _X_INLINE inline #elif defined(__GNUC__) && !defined(__STRICT_ANSI__) /* gcc w/C89+extensions */ # define _X_INLINE __inline__ #else # define _X_INLINE #endif /* C99 keyword "restrict" or equivalent extensions in pre-C99 compilers */ /* requires xproto >= 7.0.21 */ #ifndef _X_RESTRICT_KYWD # if defined(restrict) /* assume autoconf set it correctly */ || \ (defined(__STDC_VERSION__) && (__STDC_VERSION__ - 0 >= 199901L)) /* C99 */ # define _X_RESTRICT_KYWD restrict # elif defined(__GNUC__) && !defined(__STRICT_ANSI__) /* gcc w/C89+extensions */ # define _X_RESTRICT_KYWD __restrict__ # else # define _X_RESTRICT_KYWD # endif #endif #endif /* _XFUNCPROTO_H_ */ ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/X11/Xlib.h ================================================ /* Copyright 1985, 1986, 1987, 1991, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* * Xlib.h - Header definition and support file for the C subroutine * interface library (Xlib) to the X Window System Protocol (V11). * Structures and symbols starting with "_" are private to the library. */ #ifndef _X11_XLIB_H_ #define _X11_XLIB_H_ #define XlibSpecificationRelease 6 #include <sys/types.h> #if defined(__SCO__) || defined(__UNIXWARE__) #include <stdint.h> #endif #include <X11/X.h> /* applications should not depend on these two headers being included! */ #include <X11/Xfuncproto.h> #include <X11/Xosdefs.h> #ifndef X_WCHAR #include <stddef.h> #else #ifdef __UNIXOS2__ #include <stdlib.h> #else /* replace this with #include or typedef appropriate for your system */ typedef unsigned long wchar_t; #endif #endif #if defined(ISC) && defined(USE_XMBTOWC) #define wctomb(a,b) _Xwctomb(a,b) #define mblen(a,b) _Xmblen(a,b) #ifndef USE_XWCHAR_STRING #define mbtowc(a,b,c) _Xmbtowc(a,b,c) #endif #endif extern int _Xmblen( #ifdef ISC char const *str, size_t len #else char *str, int len #endif ); /* API mentioning "UTF8" or "utf8" is an XFree86 extension, introduced in November 2000. Its presence is indicated through the following macro. */ #define X_HAVE_UTF8_STRING 1 typedef char *XPointer; #define Bool int #define Status int #define True 1 #define False 0 #define QueuedAlready 0 #define QueuedAfterReading 1 #define QueuedAfterFlush 2 #define ConnectionNumber(dpy) (((_XPrivDisplay)dpy)->fd) #define RootWindow(dpy, scr) (ScreenOfDisplay(dpy,scr)->root) #define DefaultScreen(dpy) (((_XPrivDisplay)dpy)->default_screen) #define DefaultRootWindow(dpy) (ScreenOfDisplay(dpy,DefaultScreen(dpy))->root) #define DefaultVisual(dpy, scr) (ScreenOfDisplay(dpy,scr)->root_visual) #define DefaultGC(dpy, scr) (ScreenOfDisplay(dpy,scr)->default_gc) #define BlackPixel(dpy, scr) (ScreenOfDisplay(dpy,scr)->black_pixel) #define WhitePixel(dpy, scr) (ScreenOfDisplay(dpy,scr)->white_pixel) #define AllPlanes ((unsigned long)~0L) #define QLength(dpy) (((_XPrivDisplay)dpy)->qlen) #define DisplayWidth(dpy, scr) (ScreenOfDisplay(dpy,scr)->width) #define DisplayHeight(dpy, scr) (ScreenOfDisplay(dpy,scr)->height) #define DisplayWidthMM(dpy, scr)(ScreenOfDisplay(dpy,scr)->mwidth) #define DisplayHeightMM(dpy, scr)(ScreenOfDisplay(dpy,scr)->mheight) #define DisplayPlanes(dpy, scr) (ScreenOfDisplay(dpy,scr)->root_depth) #define DisplayCells(dpy, scr) (DefaultVisual(dpy,scr)->map_entries) #define ScreenCount(dpy) (((_XPrivDisplay)dpy)->nscreens) #define ServerVendor(dpy) (((_XPrivDisplay)dpy)->vendor) #define ProtocolVersion(dpy) (((_XPrivDisplay)dpy)->proto_major_version) #define ProtocolRevision(dpy) (((_XPrivDisplay)dpy)->proto_minor_version) #define VendorRelease(dpy) (((_XPrivDisplay)dpy)->release) #define DisplayString(dpy) (((_XPrivDisplay)dpy)->display_name) #define DefaultDepth(dpy, scr) (ScreenOfDisplay(dpy,scr)->root_depth) #define DefaultColormap(dpy, scr)(ScreenOfDisplay(dpy,scr)->cmap) #define BitmapUnit(dpy) (((_XPrivDisplay)dpy)->bitmap_unit) #define BitmapBitOrder(dpy) (((_XPrivDisplay)dpy)->bitmap_bit_order) #define BitmapPad(dpy) (((_XPrivDisplay)dpy)->bitmap_pad) #define ImageByteOrder(dpy) (((_XPrivDisplay)dpy)->byte_order) #ifdef CRAY /* unable to get WORD64 without pulling in other symbols */ #define NextRequest(dpy) XNextRequest(dpy) #else #define NextRequest(dpy) (((_XPrivDisplay)dpy)->request + 1) #endif #define LastKnownRequestProcessed(dpy) (((_XPrivDisplay)dpy)->last_request_read) /* macros for screen oriented applications (toolkit) */ #define ScreenOfDisplay(dpy, scr)(&((_XPrivDisplay)dpy)->screens[scr]) #define DefaultScreenOfDisplay(dpy) ScreenOfDisplay(dpy,DefaultScreen(dpy)) #define DisplayOfScreen(s) ((s)->display) #define RootWindowOfScreen(s) ((s)->root) #define BlackPixelOfScreen(s) ((s)->black_pixel) #define WhitePixelOfScreen(s) ((s)->white_pixel) #define DefaultColormapOfScreen(s)((s)->cmap) #define DefaultDepthOfScreen(s) ((s)->root_depth) #define DefaultGCOfScreen(s) ((s)->default_gc) #define DefaultVisualOfScreen(s)((s)->root_visual) #define WidthOfScreen(s) ((s)->width) #define HeightOfScreen(s) ((s)->height) #define WidthMMOfScreen(s) ((s)->mwidth) #define HeightMMOfScreen(s) ((s)->mheight) #define PlanesOfScreen(s) ((s)->root_depth) #define CellsOfScreen(s) (DefaultVisualOfScreen((s))->map_entries) #define MinCmapsOfScreen(s) ((s)->min_maps) #define MaxCmapsOfScreen(s) ((s)->max_maps) #define DoesSaveUnders(s) ((s)->save_unders) #define DoesBackingStore(s) ((s)->backing_store) #define EventMaskOfScreen(s) ((s)->root_input_mask) /* * Extensions need a way to hang private data on some structures. */ typedef struct _XExtData { int number; /* number returned by XRegisterExtension */ struct _XExtData *next; /* next item on list of data for structure */ int (*free_private)( /* called to free private storage */ struct _XExtData *extension ); XPointer private_data; /* data private to this extension. */ } XExtData; /* * This file contains structures used by the extension mechanism. */ typedef struct { /* public to extension, cannot be changed */ int extension; /* extension number */ int major_opcode; /* major op-code assigned by server */ int first_event; /* first event number for the extension */ int first_error; /* first error number for the extension */ } XExtCodes; /* * Data structure for retrieving info about pixmap formats. */ typedef struct { int depth; int bits_per_pixel; int scanline_pad; } XPixmapFormatValues; /* * Data structure for setting graphics context. */ typedef struct { int function; /* logical operation */ unsigned long plane_mask;/* plane mask */ unsigned long foreground;/* foreground pixel */ unsigned long background;/* background pixel */ int line_width; /* line width */ int line_style; /* LineSolid, LineOnOffDash, LineDoubleDash */ int cap_style; /* CapNotLast, CapButt, CapRound, CapProjecting */ int join_style; /* JoinMiter, JoinRound, JoinBevel */ int fill_style; /* FillSolid, FillTiled, FillStippled, FillOpaeueStippled */ int fill_rule; /* EvenOddRule, WindingRule */ int arc_mode; /* ArcChord, ArcPieSlice */ Pixmap tile; /* tile pixmap for tiling operations */ Pixmap stipple; /* stipple 1 plane pixmap for stipping */ int ts_x_origin; /* offset for tile or stipple operations */ int ts_y_origin; Font font; /* default text font for text operations */ int subwindow_mode; /* ClipByChildren, IncludeInferiors */ Bool graphics_exposures;/* boolean, should exposures be generated */ int clip_x_origin; /* origin for clipping */ int clip_y_origin; Pixmap clip_mask; /* bitmap clipping; other calls for rects */ int dash_offset; /* patterned/dashed line information */ char dashes; } XGCValues; /* * Graphics context. The contents of this structure are implementation * dependent. A GC should be treated as opaque by application code. */ typedef struct _XGC #ifdef XLIB_ILLEGAL_ACCESS { XExtData *ext_data; /* hook for extension to hang data */ GContext gid; /* protocol ID for graphics context */ /* there is more to this structure, but it is private to Xlib */ } #endif *GC; /* * Visual structure; contains information about colormapping possible. */ typedef struct { XExtData *ext_data; /* hook for extension to hang data */ VisualID visualid; /* visual id of this visual */ #if defined(__cplusplus) || defined(c_plusplus) int c_class; /* C++ class of screen (monochrome, etc.) */ #else int class; /* class of screen (monochrome, etc.) */ #endif unsigned long red_mask, green_mask, blue_mask; /* mask values */ int bits_per_rgb; /* log base 2 of distinct color values */ int map_entries; /* color map entries */ } Visual; /* * Depth structure; contains information for each possible depth. */ typedef struct { int depth; /* this depth (Z) of the depth */ int nvisuals; /* number of Visual types at this depth */ Visual *visuals; /* list of visuals possible at this depth */ } Depth; /* * Information about the screen. The contents of this structure are * implementation dependent. A Screen should be treated as opaque * by application code. */ struct _XDisplay; /* Forward declare before use for C++ */ typedef struct { XExtData *ext_data; /* hook for extension to hang data */ struct _XDisplay *display;/* back pointer to display structure */ Window root; /* Root window id. */ int width, height; /* width and height of screen */ int mwidth, mheight; /* width and height of in millimeters */ int ndepths; /* number of depths possible */ Depth *depths; /* list of allowable depths on the screen */ int root_depth; /* bits per pixel */ Visual *root_visual; /* root visual */ GC default_gc; /* GC for the root root visual */ Colormap cmap; /* default color map */ unsigned long white_pixel; unsigned long black_pixel; /* White and Black pixel values */ int max_maps, min_maps; /* max and min color maps */ int backing_store; /* Never, WhenMapped, Always */ Bool save_unders; long root_input_mask; /* initial root input mask */ } Screen; /* * Format structure; describes ZFormat data the screen will understand. */ typedef struct { XExtData *ext_data; /* hook for extension to hang data */ int depth; /* depth of this image format */ int bits_per_pixel; /* bits/pixel at this depth */ int scanline_pad; /* scanline must padded to this multiple */ } ScreenFormat; /* * Data structure for setting window attributes. */ typedef struct { Pixmap background_pixmap; /* background or None or ParentRelative */ unsigned long background_pixel; /* background pixel */ Pixmap border_pixmap; /* border of the window */ unsigned long border_pixel; /* border pixel value */ int bit_gravity; /* one of bit gravity values */ int win_gravity; /* one of the window gravity values */ int backing_store; /* NotUseful, WhenMapped, Always */ unsigned long backing_planes;/* planes to be preseved if possible */ unsigned long backing_pixel;/* value to use in restoring planes */ Bool save_under; /* should bits under be saved? (popups) */ long event_mask; /* set of events that should be saved */ long do_not_propagate_mask; /* set of events that should not propagate */ Bool override_redirect; /* boolean value for override-redirect */ Colormap colormap; /* color map to be associated with window */ Cursor cursor; /* cursor to be displayed (or None) */ } XSetWindowAttributes; typedef struct { int x, y; /* location of window */ int width, height; /* width and height of window */ int border_width; /* border width of window */ int depth; /* depth of window */ Visual *visual; /* the associated visual structure */ Window root; /* root of screen containing window */ #if defined(__cplusplus) || defined(c_plusplus) int c_class; /* C++ InputOutput, InputOnly*/ #else int class; /* InputOutput, InputOnly*/ #endif int bit_gravity; /* one of bit gravity values */ int win_gravity; /* one of the window gravity values */ int backing_store; /* NotUseful, WhenMapped, Always */ unsigned long backing_planes;/* planes to be preserved if possible */ unsigned long backing_pixel;/* value to be used when restoring planes */ Bool save_under; /* boolean, should bits under be saved? */ Colormap colormap; /* color map to be associated with window */ Bool map_installed; /* boolean, is color map currently installed*/ int map_state; /* IsUnmapped, IsUnviewable, IsViewable */ long all_event_masks; /* set of events all people have interest in*/ long your_event_mask; /* my event mask */ long do_not_propagate_mask; /* set of events that should not propagate */ Bool override_redirect; /* boolean value for override-redirect */ Screen *screen; /* back pointer to correct screen */ } XWindowAttributes; /* * Data structure for host setting; getting routines. * */ typedef struct { int family; /* for example FamilyInternet */ int length; /* length of address, in bytes */ char *address; /* pointer to where to find the bytes */ } XHostAddress; /* * Data structure for ServerFamilyInterpreted addresses in host routines */ typedef struct { int typelength; /* length of type string, in bytes */ int valuelength; /* length of value string, in bytes */ char *type; /* pointer to where to find the type string */ char *value; /* pointer to where to find the address */ } XServerInterpretedAddress; /* * Data structure for "image" data, used by image manipulation routines. */ typedef struct _XImage { int width, height; /* size of image */ int xoffset; /* number of pixels offset in X direction */ int format; /* XYBitmap, XYPixmap, ZPixmap */ char *data; /* pointer to image data */ int byte_order; /* data byte order, LSBFirst, MSBFirst */ int bitmap_unit; /* quant. of scanline 8, 16, 32 */ int bitmap_bit_order; /* LSBFirst, MSBFirst */ int bitmap_pad; /* 8, 16, 32 either XY or ZPixmap */ int depth; /* depth of image */ int bytes_per_line; /* accelarator to next line */ int bits_per_pixel; /* bits per pixel (ZPixmap) */ unsigned long red_mask; /* bits in z arrangment */ unsigned long green_mask; unsigned long blue_mask; XPointer obdata; /* hook for the object routines to hang on */ struct funcs { /* image manipulation routines */ struct _XImage *(*create_image)( struct _XDisplay* /* display */, Visual* /* visual */, unsigned int /* depth */, int /* format */, int /* offset */, char* /* data */, unsigned int /* width */, unsigned int /* height */, int /* bitmap_pad */, int /* bytes_per_line */); int (*destroy_image) (struct _XImage *); unsigned long (*get_pixel) (struct _XImage *, int, int); int (*put_pixel) (struct _XImage *, int, int, unsigned long); struct _XImage *(*sub_image)(struct _XImage *, int, int, unsigned int, unsigned int); int (*add_pixel) (struct _XImage *, long); } f; } XImage; /* * Data structure for XReconfigureWindow */ typedef struct { int x, y; int width, height; int border_width; Window sibling; int stack_mode; } XWindowChanges; /* * Data structure used by color operations */ typedef struct { unsigned long pixel; unsigned short red, green, blue; char flags; /* do_red, do_green, do_blue */ char pad; } XColor; /* * Data structures for graphics operations. On most machines, these are * congruent with the wire protocol structures, so reformatting the data * can be avoided on these architectures. */ typedef struct { short x1, y1, x2, y2; } XSegment; typedef struct { short x, y; } XPoint; typedef struct { short x, y; unsigned short width, height; } XRectangle; typedef struct { short x, y; unsigned short width, height; short angle1, angle2; } XArc; /* Data structure for XChangeKeyboardControl */ typedef struct { int key_click_percent; int bell_percent; int bell_pitch; int bell_duration; int led; int led_mode; int key; int auto_repeat_mode; /* On, Off, Default */ } XKeyboardControl; /* Data structure for XGetKeyboardControl */ typedef struct { int key_click_percent; int bell_percent; unsigned int bell_pitch, bell_duration; unsigned long led_mask; int global_auto_repeat; char auto_repeats[32]; } XKeyboardState; /* Data structure for XGetMotionEvents. */ typedef struct { Time time; short x, y; } XTimeCoord; /* Data structure for X{Set,Get}ModifierMapping */ typedef struct { int max_keypermod; /* The server's max # of keys per modifier */ KeyCode *modifiermap; /* An 8 by max_keypermod array of modifiers */ } XModifierKeymap; /* * Display datatype maintaining display specific data. * The contents of this structure are implementation dependent. * A Display should be treated as opaque by application code. */ #ifndef XLIB_ILLEGAL_ACCESS typedef struct _XDisplay Display; #endif struct _XPrivate; /* Forward declare before use for C++ */ struct _XrmHashBucketRec; typedef struct #ifdef XLIB_ILLEGAL_ACCESS _XDisplay #endif { XExtData *ext_data; /* hook for extension to hang data */ struct _XPrivate *private1; int fd; /* Network socket. */ int private2; int proto_major_version;/* major version of server's X protocol */ int proto_minor_version;/* minor version of servers X protocol */ char *vendor; /* vendor of the server hardware */ XID private3; XID private4; XID private5; int private6; XID (*resource_alloc)( /* allocator function */ struct _XDisplay* ); int byte_order; /* screen byte order, LSBFirst, MSBFirst */ int bitmap_unit; /* padding and data requirements */ int bitmap_pad; /* padding requirements on bitmaps */ int bitmap_bit_order; /* LeastSignificant or MostSignificant */ int nformats; /* number of pixmap formats in list */ ScreenFormat *pixmap_format; /* pixmap format list */ int private8; int release; /* release of the server */ struct _XPrivate *private9, *private10; int qlen; /* Length of input event queue */ unsigned long last_request_read; /* seq number of last event read */ unsigned long request; /* sequence number of last request. */ XPointer private11; XPointer private12; XPointer private13; XPointer private14; unsigned max_request_size; /* maximum number 32 bit words in request*/ struct _XrmHashBucketRec *db; int (*private15)( struct _XDisplay* ); char *display_name; /* "host:display" string used on this connect*/ int default_screen; /* default screen for operations */ int nscreens; /* number of screens on this server*/ Screen *screens; /* pointer to list of screens */ unsigned long motion_buffer; /* size of motion buffer */ unsigned long private16; int min_keycode; /* minimum defined keycode */ int max_keycode; /* maximum defined keycode */ XPointer private17; XPointer private18; int private19; char *xdefaults; /* contents of defaults from server */ /* there is more to this structure, but it is private to Xlib */ } #ifdef XLIB_ILLEGAL_ACCESS Display, #endif *_XPrivDisplay; #undef _XEVENT_ #ifndef _XEVENT_ /* * Definitions of specific events. */ typedef struct { int type; /* of event */ unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; /* "event" window it is reported relative to */ Window root; /* root window that the event occurred on */ Window subwindow; /* child window */ Time time; /* milliseconds */ int x, y; /* pointer x, y coordinates in event window */ int x_root, y_root; /* coordinates relative to root */ unsigned int state; /* key or button mask */ unsigned int keycode; /* detail */ Bool same_screen; /* same screen flag */ } XKeyEvent; typedef XKeyEvent XKeyPressedEvent; typedef XKeyEvent XKeyReleasedEvent; typedef struct { int type; /* of event */ unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; /* "event" window it is reported relative to */ Window root; /* root window that the event occurred on */ Window subwindow; /* child window */ Time time; /* milliseconds */ int x, y; /* pointer x, y coordinates in event window */ int x_root, y_root; /* coordinates relative to root */ unsigned int state; /* key or button mask */ unsigned int button; /* detail */ Bool same_screen; /* same screen flag */ } XButtonEvent; typedef XButtonEvent XButtonPressedEvent; typedef XButtonEvent XButtonReleasedEvent; typedef struct { int type; /* of event */ unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; /* "event" window reported relative to */ Window root; /* root window that the event occurred on */ Window subwindow; /* child window */ Time time; /* milliseconds */ int x, y; /* pointer x, y coordinates in event window */ int x_root, y_root; /* coordinates relative to root */ unsigned int state; /* key or button mask */ char is_hint; /* detail */ Bool same_screen; /* same screen flag */ } XMotionEvent; typedef XMotionEvent XPointerMovedEvent; typedef struct { int type; /* of event */ unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; /* "event" window reported relative to */ Window root; /* root window that the event occurred on */ Window subwindow; /* child window */ Time time; /* milliseconds */ int x, y; /* pointer x, y coordinates in event window */ int x_root, y_root; /* coordinates relative to root */ int mode; /* NotifyNormal, NotifyGrab, NotifyUngrab */ int detail; /* * NotifyAncestor, NotifyVirtual, NotifyInferior, * NotifyNonlinear,NotifyNonlinearVirtual */ Bool same_screen; /* same screen flag */ Bool focus; /* boolean focus */ unsigned int state; /* key or button mask */ } XCrossingEvent; typedef XCrossingEvent XEnterWindowEvent; typedef XCrossingEvent XLeaveWindowEvent; typedef struct { int type; /* FocusIn or FocusOut */ unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; /* window of event */ int mode; /* NotifyNormal, NotifyWhileGrabbed, NotifyGrab, NotifyUngrab */ int detail; /* * NotifyAncestor, NotifyVirtual, NotifyInferior, * NotifyNonlinear,NotifyNonlinearVirtual, NotifyPointer, * NotifyPointerRoot, NotifyDetailNone */ } XFocusChangeEvent; typedef XFocusChangeEvent XFocusInEvent; typedef XFocusChangeEvent XFocusOutEvent; /* generated on EnterWindow and FocusIn when KeyMapState selected */ typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; char key_vector[32]; } XKeymapEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; int x, y; int width, height; int count; /* if non-zero, at least this many more */ } XExposeEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Drawable drawable; int x, y; int width, height; int count; /* if non-zero, at least this many more */ int major_code; /* core is CopyArea or CopyPlane */ int minor_code; /* not defined in the core */ } XGraphicsExposeEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Drawable drawable; int major_code; /* core is CopyArea or CopyPlane */ int minor_code; /* not defined in the core */ } XNoExposeEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; int state; /* Visibility state */ } XVisibilityEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window parent; /* parent of the window */ Window window; /* window id of window created */ int x, y; /* window location */ int width, height; /* size of window */ int border_width; /* border width */ Bool override_redirect; /* creation should be overridden */ } XCreateWindowEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window event; Window window; } XDestroyWindowEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window event; Window window; Bool from_configure; } XUnmapEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window event; Window window; Bool override_redirect; /* boolean, is override set... */ } XMapEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window parent; Window window; } XMapRequestEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window event; Window window; Window parent; int x, y; Bool override_redirect; } XReparentEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window event; Window window; int x, y; int width, height; int border_width; Window above; Bool override_redirect; } XConfigureEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window event; Window window; int x, y; } XGravityEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; int width, height; } XResizeRequestEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window parent; Window window; int x, y; int width, height; int border_width; Window above; int detail; /* Above, Below, TopIf, BottomIf, Opposite */ unsigned long value_mask; } XConfigureRequestEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window event; Window window; int place; /* PlaceOnTop, PlaceOnBottom */ } XCirculateEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window parent; Window window; int place; /* PlaceOnTop, PlaceOnBottom */ } XCirculateRequestEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; Atom atom; Time time; int state; /* NewValue, Deleted */ } XPropertyEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; Atom selection; Time time; } XSelectionClearEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window owner; Window requestor; Atom selection; Atom target; Atom property; Time time; } XSelectionRequestEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window requestor; Atom selection; Atom target; Atom property; /* ATOM or None */ Time time; } XSelectionEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; Colormap colormap; /* COLORMAP or None */ #if defined(__cplusplus) || defined(c_plusplus) Bool c_new; /* C++ */ #else Bool new; #endif int state; /* ColormapInstalled, ColormapUninstalled */ } XColormapEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; Atom message_type; int format; union { char b[20]; short s[10]; long l[5]; } data; } XClientMessageEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; /* unused */ int request; /* one of MappingModifier, MappingKeyboard, MappingPointer */ int first_keycode; /* first keycode */ int count; /* defines range of change w. first_keycode*/ } XMappingEvent; typedef struct { int type; Display *display; /* Display the event was read from */ XID resourceid; /* resource id */ unsigned long serial; /* serial number of failed request */ unsigned char error_code; /* error code of failed request */ unsigned char request_code; /* Major op-code of failed request */ unsigned char minor_code; /* Minor op-code of failed request */ } XErrorEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display;/* Display the event was read from */ Window window; /* window on which event was requested in event mask */ } XAnyEvent; /*************************************************************** * * GenericEvent. This event is the standard event for all newer extensions. */ typedef struct { int type; /* of event. Always GenericEvent */ unsigned long serial; /* # of last request processed */ Bool send_event; /* true if from SendEvent request */ Display *display; /* Display the event was read from */ int extension; /* major opcode of extension that caused the event */ int evtype; /* actual event type. */ } XGenericEvent; typedef struct { int type; /* of event. Always GenericEvent */ unsigned long serial; /* # of last request processed */ Bool send_event; /* true if from SendEvent request */ Display *display; /* Display the event was read from */ int extension; /* major opcode of extension that caused the event */ int evtype; /* actual event type. */ unsigned int cookie; void *data; } XGenericEventCookie; /* * this union is defined so Xlib can always use the same sized * event structure internally, to avoid memory fragmentation. */ typedef union _XEvent { int type; /* must not be changed; first element */ XAnyEvent xany; XKeyEvent xkey; XButtonEvent xbutton; XMotionEvent xmotion; XCrossingEvent xcrossing; XFocusChangeEvent xfocus; XExposeEvent xexpose; XGraphicsExposeEvent xgraphicsexpose; XNoExposeEvent xnoexpose; XVisibilityEvent xvisibility; XCreateWindowEvent xcreatewindow; XDestroyWindowEvent xdestroywindow; XUnmapEvent xunmap; XMapEvent xmap; XMapRequestEvent xmaprequest; XReparentEvent xreparent; XConfigureEvent xconfigure; XGravityEvent xgravity; XResizeRequestEvent xresizerequest; XConfigureRequestEvent xconfigurerequest; XCirculateEvent xcirculate; XCirculateRequestEvent xcirculaterequest; XPropertyEvent xproperty; XSelectionClearEvent xselectionclear; XSelectionRequestEvent xselectionrequest; XSelectionEvent xselection; XColormapEvent xcolormap; XClientMessageEvent xclient; XMappingEvent xmapping; XErrorEvent xerror; XKeymapEvent xkeymap; XGenericEvent xgeneric; XGenericEventCookie xcookie; long pad[24]; } XEvent; #endif #define XAllocID(dpy) ((*((_XPrivDisplay)dpy)->resource_alloc)((dpy))) /* * per character font metric information. */ typedef struct { short lbearing; /* origin to left edge of raster */ short rbearing; /* origin to right edge of raster */ short width; /* advance to next char's origin */ short ascent; /* baseline to top edge of raster */ short descent; /* baseline to bottom edge of raster */ unsigned short attributes; /* per char flags (not predefined) */ } XCharStruct; /* * To allow arbitrary information with fonts, there are additional properties * returned. */ typedef struct { Atom name; unsigned long card32; } XFontProp; typedef struct { XExtData *ext_data; /* hook for extension to hang data */ Font fid; /* Font id for this font */ unsigned direction; /* hint about direction the font is painted */ unsigned min_char_or_byte2;/* first character */ unsigned max_char_or_byte2;/* last character */ unsigned min_byte1; /* first row that exists */ unsigned max_byte1; /* last row that exists */ Bool all_chars_exist;/* flag if all characters have non-zero size*/ unsigned default_char; /* char to print for undefined character */ int n_properties; /* how many properties there are */ XFontProp *properties; /* pointer to array of additional properties*/ XCharStruct min_bounds; /* minimum bounds over all existing char*/ XCharStruct max_bounds; /* maximum bounds over all existing char*/ XCharStruct *per_char; /* first_char to last_char information */ int ascent; /* log. extent above baseline for spacing */ int descent; /* log. descent below baseline for spacing */ } XFontStruct; /* * PolyText routines take these as arguments. */ typedef struct { char *chars; /* pointer to string */ int nchars; /* number of characters */ int delta; /* delta between strings */ Font font; /* font to print it in, None don't change */ } XTextItem; typedef struct { /* normal 16 bit characters are two bytes */ unsigned char byte1; unsigned char byte2; } XChar2b; typedef struct { XChar2b *chars; /* two byte characters */ int nchars; /* number of characters */ int delta; /* delta between strings */ Font font; /* font to print it in, None don't change */ } XTextItem16; typedef union { Display *display; GC gc; Visual *visual; Screen *screen; ScreenFormat *pixmap_format; XFontStruct *font; } XEDataObject; typedef struct { XRectangle max_ink_extent; XRectangle max_logical_extent; } XFontSetExtents; /* unused: typedef void (*XOMProc)(); */ typedef struct _XOM *XOM; typedef struct _XOC *XOC, *XFontSet; typedef struct { char *chars; int nchars; int delta; XFontSet font_set; } XmbTextItem; typedef struct { wchar_t *chars; int nchars; int delta; XFontSet font_set; } XwcTextItem; #define XNRequiredCharSet "requiredCharSet" #define XNQueryOrientation "queryOrientation" #define XNBaseFontName "baseFontName" #define XNOMAutomatic "omAutomatic" #define XNMissingCharSet "missingCharSet" #define XNDefaultString "defaultString" #define XNOrientation "orientation" #define XNDirectionalDependentDrawing "directionalDependentDrawing" #define XNContextualDrawing "contextualDrawing" #define XNFontInfo "fontInfo" typedef struct { int charset_count; char **charset_list; } XOMCharSetList; typedef enum { XOMOrientation_LTR_TTB, XOMOrientation_RTL_TTB, XOMOrientation_TTB_LTR, XOMOrientation_TTB_RTL, XOMOrientation_Context } XOrientation; typedef struct { int num_orientation; XOrientation *orientation; /* Input Text description */ } XOMOrientation; typedef struct { int num_font; XFontStruct **font_struct_list; char **font_name_list; } XOMFontInfo; typedef struct _XIM *XIM; typedef struct _XIC *XIC; typedef void (*XIMProc)( XIM, XPointer, XPointer ); typedef Bool (*XICProc)( XIC, XPointer, XPointer ); typedef void (*XIDProc)( Display*, XPointer, XPointer ); typedef unsigned long XIMStyle; typedef struct { unsigned short count_styles; XIMStyle *supported_styles; } XIMStyles; #define XIMPreeditArea 0x0001L #define XIMPreeditCallbacks 0x0002L #define XIMPreeditPosition 0x0004L #define XIMPreeditNothing 0x0008L #define XIMPreeditNone 0x0010L #define XIMStatusArea 0x0100L #define XIMStatusCallbacks 0x0200L #define XIMStatusNothing 0x0400L #define XIMStatusNone 0x0800L #define XNVaNestedList "XNVaNestedList" #define XNQueryInputStyle "queryInputStyle" #define XNClientWindow "clientWindow" #define XNInputStyle "inputStyle" #define XNFocusWindow "focusWindow" #define XNResourceName "resourceName" #define XNResourceClass "resourceClass" #define XNGeometryCallback "geometryCallback" #define XNDestroyCallback "destroyCallback" #define XNFilterEvents "filterEvents" #define XNPreeditStartCallback "preeditStartCallback" #define XNPreeditDoneCallback "preeditDoneCallback" #define XNPreeditDrawCallback "preeditDrawCallback" #define XNPreeditCaretCallback "preeditCaretCallback" #define XNPreeditStateNotifyCallback "preeditStateNotifyCallback" #define XNPreeditAttributes "preeditAttributes" #define XNStatusStartCallback "statusStartCallback" #define XNStatusDoneCallback "statusDoneCallback" #define XNStatusDrawCallback "statusDrawCallback" #define XNStatusAttributes "statusAttributes" #define XNArea "area" #define XNAreaNeeded "areaNeeded" #define XNSpotLocation "spotLocation" #define XNColormap "colorMap" #define XNStdColormap "stdColorMap" #define XNForeground "foreground" #define XNBackground "background" #define XNBackgroundPixmap "backgroundPixmap" #define XNFontSet "fontSet" #define XNLineSpace "lineSpace" #define XNCursor "cursor" #define XNQueryIMValuesList "queryIMValuesList" #define XNQueryICValuesList "queryICValuesList" #define XNVisiblePosition "visiblePosition" #define XNR6PreeditCallback "r6PreeditCallback" #define XNStringConversionCallback "stringConversionCallback" #define XNStringConversion "stringConversion" #define XNResetState "resetState" #define XNHotKey "hotKey" #define XNHotKeyState "hotKeyState" #define XNPreeditState "preeditState" #define XNSeparatorofNestedList "separatorofNestedList" #define XBufferOverflow -1 #define XLookupNone 1 #define XLookupChars 2 #define XLookupKeySym 3 #define XLookupBoth 4 typedef void *XVaNestedList; typedef struct { XPointer client_data; XIMProc callback; } XIMCallback; typedef struct { XPointer client_data; XICProc callback; } XICCallback; typedef unsigned long XIMFeedback; #define XIMReverse 1L #define XIMUnderline (1L<<1) #define XIMHighlight (1L<<2) #define XIMPrimary (1L<<5) #define XIMSecondary (1L<<6) #define XIMTertiary (1L<<7) #define XIMVisibleToForward (1L<<8) #define XIMVisibleToBackword (1L<<9) #define XIMVisibleToCenter (1L<<10) typedef struct _XIMText { unsigned short length; XIMFeedback *feedback; Bool encoding_is_wchar; union { char *multi_byte; wchar_t *wide_char; } string; } XIMText; typedef unsigned long XIMPreeditState; #define XIMPreeditUnKnown 0L #define XIMPreeditEnable 1L #define XIMPreeditDisable (1L<<1) typedef struct _XIMPreeditStateNotifyCallbackStruct { XIMPreeditState state; } XIMPreeditStateNotifyCallbackStruct; typedef unsigned long XIMResetState; #define XIMInitialState 1L #define XIMPreserveState (1L<<1) typedef unsigned long XIMStringConversionFeedback; #define XIMStringConversionLeftEdge (0x00000001) #define XIMStringConversionRightEdge (0x00000002) #define XIMStringConversionTopEdge (0x00000004) #define XIMStringConversionBottomEdge (0x00000008) #define XIMStringConversionConcealed (0x00000010) #define XIMStringConversionWrapped (0x00000020) typedef struct _XIMStringConversionText { unsigned short length; XIMStringConversionFeedback *feedback; Bool encoding_is_wchar; union { char *mbs; wchar_t *wcs; } string; } XIMStringConversionText; typedef unsigned short XIMStringConversionPosition; typedef unsigned short XIMStringConversionType; #define XIMStringConversionBuffer (0x0001) #define XIMStringConversionLine (0x0002) #define XIMStringConversionWord (0x0003) #define XIMStringConversionChar (0x0004) typedef unsigned short XIMStringConversionOperation; #define XIMStringConversionSubstitution (0x0001) #define XIMStringConversionRetrieval (0x0002) typedef enum { XIMForwardChar, XIMBackwardChar, XIMForwardWord, XIMBackwardWord, XIMCaretUp, XIMCaretDown, XIMNextLine, XIMPreviousLine, XIMLineStart, XIMLineEnd, XIMAbsolutePosition, XIMDontChange } XIMCaretDirection; typedef struct _XIMStringConversionCallbackStruct { XIMStringConversionPosition position; XIMCaretDirection direction; XIMStringConversionOperation operation; unsigned short factor; XIMStringConversionText *text; } XIMStringConversionCallbackStruct; typedef struct _XIMPreeditDrawCallbackStruct { int caret; /* Cursor offset within pre-edit string */ int chg_first; /* Starting change position */ int chg_length; /* Length of the change in character count */ XIMText *text; } XIMPreeditDrawCallbackStruct; typedef enum { XIMIsInvisible, /* Disable caret feedback */ XIMIsPrimary, /* UI defined caret feedback */ XIMIsSecondary /* UI defined caret feedback */ } XIMCaretStyle; typedef struct _XIMPreeditCaretCallbackStruct { int position; /* Caret offset within pre-edit string */ XIMCaretDirection direction; /* Caret moves direction */ XIMCaretStyle style; /* Feedback of the caret */ } XIMPreeditCaretCallbackStruct; typedef enum { XIMTextType, XIMBitmapType } XIMStatusDataType; typedef struct _XIMStatusDrawCallbackStruct { XIMStatusDataType type; union { XIMText *text; Pixmap bitmap; } data; } XIMStatusDrawCallbackStruct; typedef struct _XIMHotKeyTrigger { KeySym keysym; int modifier; int modifier_mask; } XIMHotKeyTrigger; typedef struct _XIMHotKeyTriggers { int num_hot_key; XIMHotKeyTrigger *key; } XIMHotKeyTriggers; typedef unsigned long XIMHotKeyState; #define XIMHotKeyStateON (0x0001L) #define XIMHotKeyStateOFF (0x0002L) typedef struct { unsigned short count_values; char **supported_values; } XIMValuesList; _XFUNCPROTOBEGIN #if defined(WIN32) && !defined(_XLIBINT_) #define _Xdebug (*_Xdebug_p) #endif extern int _Xdebug; extern XFontStruct *XLoadQueryFont( Display* /* display */, _Xconst char* /* name */ ); extern XFontStruct *XQueryFont( Display* /* display */, XID /* font_ID */ ); extern XTimeCoord *XGetMotionEvents( Display* /* display */, Window /* w */, Time /* start */, Time /* stop */, int* /* nevents_return */ ); extern XModifierKeymap *XDeleteModifiermapEntry( XModifierKeymap* /* modmap */, #if NeedWidePrototypes unsigned int /* keycode_entry */, #else KeyCode /* keycode_entry */, #endif int /* modifier */ ); extern XModifierKeymap *XGetModifierMapping( Display* /* display */ ); extern XModifierKeymap *XInsertModifiermapEntry( XModifierKeymap* /* modmap */, #if NeedWidePrototypes unsigned int /* keycode_entry */, #else KeyCode /* keycode_entry */, #endif int /* modifier */ ); extern XModifierKeymap *XNewModifiermap( int /* max_keys_per_mod */ ); extern XImage *XCreateImage( Display* /* display */, Visual* /* visual */, unsigned int /* depth */, int /* format */, int /* offset */, char* /* data */, unsigned int /* width */, unsigned int /* height */, int /* bitmap_pad */, int /* bytes_per_line */ ); extern Status XInitImage( XImage* /* image */ ); extern XImage *XGetImage( Display* /* display */, Drawable /* d */, int /* x */, int /* y */, unsigned int /* width */, unsigned int /* height */, unsigned long /* plane_mask */, int /* format */ ); extern XImage *XGetSubImage( Display* /* display */, Drawable /* d */, int /* x */, int /* y */, unsigned int /* width */, unsigned int /* height */, unsigned long /* plane_mask */, int /* format */, XImage* /* dest_image */, int /* dest_x */, int /* dest_y */ ); /* * X function declarations. */ extern Display *XOpenDisplay( _Xconst char* /* display_name */ ); extern void XrmInitialize( void ); extern char *XFetchBytes( Display* /* display */, int* /* nbytes_return */ ); extern char *XFetchBuffer( Display* /* display */, int* /* nbytes_return */, int /* buffer */ ); extern char *XGetAtomName( Display* /* display */, Atom /* atom */ ); extern Status XGetAtomNames( Display* /* dpy */, Atom* /* atoms */, int /* count */, char** /* names_return */ ); extern char *XGetDefault( Display* /* display */, _Xconst char* /* program */, _Xconst char* /* option */ ); extern char *XDisplayName( _Xconst char* /* string */ ); extern char *XKeysymToString( KeySym /* keysym */ ); extern int (*XSynchronize( Display* /* display */, Bool /* onoff */ ))( Display* /* display */ ); extern int (*XSetAfterFunction( Display* /* display */, int (*) ( Display* /* display */ ) /* procedure */ ))( Display* /* display */ ); extern Atom XInternAtom( Display* /* display */, _Xconst char* /* atom_name */, Bool /* only_if_exists */ ); extern Status XInternAtoms( Display* /* dpy */, char** /* names */, int /* count */, Bool /* onlyIfExists */, Atom* /* atoms_return */ ); extern Colormap XCopyColormapAndFree( Display* /* display */, Colormap /* colormap */ ); extern Colormap XCreateColormap( Display* /* display */, Window /* w */, Visual* /* visual */, int /* alloc */ ); extern Cursor XCreatePixmapCursor( Display* /* display */, Pixmap /* source */, Pixmap /* mask */, XColor* /* foreground_color */, XColor* /* background_color */, unsigned int /* x */, unsigned int /* y */ ); extern Cursor XCreateGlyphCursor( Display* /* display */, Font /* source_font */, Font /* mask_font */, unsigned int /* source_char */, unsigned int /* mask_char */, XColor _Xconst * /* foreground_color */, XColor _Xconst * /* background_color */ ); extern Cursor XCreateFontCursor( Display* /* display */, unsigned int /* shape */ ); extern Font XLoadFont( Display* /* display */, _Xconst char* /* name */ ); extern GC XCreateGC( Display* /* display */, Drawable /* d */, unsigned long /* valuemask */, XGCValues* /* values */ ); extern GContext XGContextFromGC( GC /* gc */ ); extern void XFlushGC( Display* /* display */, GC /* gc */ ); extern Pixmap XCreatePixmap( Display* /* display */, Drawable /* d */, unsigned int /* width */, unsigned int /* height */, unsigned int /* depth */ ); extern Pixmap XCreateBitmapFromData( Display* /* display */, Drawable /* d */, _Xconst char* /* data */, unsigned int /* width */, unsigned int /* height */ ); extern Pixmap XCreatePixmapFromBitmapData( Display* /* display */, Drawable /* d */, char* /* data */, unsigned int /* width */, unsigned int /* height */, unsigned long /* fg */, unsigned long /* bg */, unsigned int /* depth */ ); extern Window XCreateSimpleWindow( Display* /* display */, Window /* parent */, int /* x */, int /* y */, unsigned int /* width */, unsigned int /* height */, unsigned int /* border_width */, unsigned long /* border */, unsigned long /* background */ ); extern Window XGetSelectionOwner( Display* /* display */, Atom /* selection */ ); extern Window XCreateWindow( Display* /* display */, Window /* parent */, int /* x */, int /* y */, unsigned int /* width */, unsigned int /* height */, unsigned int /* border_width */, int /* depth */, unsigned int /* class */, Visual* /* visual */, unsigned long /* valuemask */, XSetWindowAttributes* /* attributes */ ); extern Colormap *XListInstalledColormaps( Display* /* display */, Window /* w */, int* /* num_return */ ); extern char **XListFonts( Display* /* display */, _Xconst char* /* pattern */, int /* maxnames */, int* /* actual_count_return */ ); extern char **XListFontsWithInfo( Display* /* display */, _Xconst char* /* pattern */, int /* maxnames */, int* /* count_return */, XFontStruct** /* info_return */ ); extern char **XGetFontPath( Display* /* display */, int* /* npaths_return */ ); extern char **XListExtensions( Display* /* display */, int* /* nextensions_return */ ); extern Atom *XListProperties( Display* /* display */, Window /* w */, int* /* num_prop_return */ ); extern XHostAddress *XListHosts( Display* /* display */, int* /* nhosts_return */, Bool* /* state_return */ ); _X_DEPRECATED extern KeySym XKeycodeToKeysym( Display* /* display */, #if NeedWidePrototypes unsigned int /* keycode */, #else KeyCode /* keycode */, #endif int /* index */ ); extern KeySym XLookupKeysym( XKeyEvent* /* key_event */, int /* index */ ); extern KeySym *XGetKeyboardMapping( Display* /* display */, #if NeedWidePrototypes unsigned int /* first_keycode */, #else KeyCode /* first_keycode */, #endif int /* keycode_count */, int* /* keysyms_per_keycode_return */ ); extern KeySym XStringToKeysym( _Xconst char* /* string */ ); extern long XMaxRequestSize( Display* /* display */ ); extern long XExtendedMaxRequestSize( Display* /* display */ ); extern char *XResourceManagerString( Display* /* display */ ); extern char *XScreenResourceString( Screen* /* screen */ ); extern unsigned long XDisplayMotionBufferSize( Display* /* display */ ); extern VisualID XVisualIDFromVisual( Visual* /* visual */ ); /* multithread routines */ extern Status XInitThreads( void ); extern void XLockDisplay( Display* /* display */ ); extern void XUnlockDisplay( Display* /* display */ ); /* routines for dealing with extensions */ extern XExtCodes *XInitExtension( Display* /* display */, _Xconst char* /* name */ ); extern XExtCodes *XAddExtension( Display* /* display */ ); extern XExtData *XFindOnExtensionList( XExtData** /* structure */, int /* number */ ); extern XExtData **XEHeadOfExtensionList( XEDataObject /* object */ ); /* these are routines for which there are also macros */ extern Window XRootWindow( Display* /* display */, int /* screen_number */ ); extern Window XDefaultRootWindow( Display* /* display */ ); extern Window XRootWindowOfScreen( Screen* /* screen */ ); extern Visual *XDefaultVisual( Display* /* display */, int /* screen_number */ ); extern Visual *XDefaultVisualOfScreen( Screen* /* screen */ ); extern GC XDefaultGC( Display* /* display */, int /* screen_number */ ); extern GC XDefaultGCOfScreen( Screen* /* screen */ ); extern unsigned long XBlackPixel( Display* /* display */, int /* screen_number */ ); extern unsigned long XWhitePixel( Display* /* display */, int /* screen_number */ ); extern unsigned long XAllPlanes( void ); extern unsigned long XBlackPixelOfScreen( Screen* /* screen */ ); extern unsigned long XWhitePixelOfScreen( Screen* /* screen */ ); extern unsigned long XNextRequest( Display* /* display */ ); extern unsigned long XLastKnownRequestProcessed( Display* /* display */ ); extern char *XServerVendor( Display* /* display */ ); extern char *XDisplayString( Display* /* display */ ); extern Colormap XDefaultColormap( Display* /* display */, int /* screen_number */ ); extern Colormap XDefaultColormapOfScreen( Screen* /* screen */ ); extern Display *XDisplayOfScreen( Screen* /* screen */ ); extern Screen *XScreenOfDisplay( Display* /* display */, int /* screen_number */ ); extern Screen *XDefaultScreenOfDisplay( Display* /* display */ ); extern long XEventMaskOfScreen( Screen* /* screen */ ); extern int XScreenNumberOfScreen( Screen* /* screen */ ); typedef int (*XErrorHandler) ( /* WARNING, this type not in Xlib spec */ Display* /* display */, XErrorEvent* /* error_event */ ); extern XErrorHandler XSetErrorHandler ( XErrorHandler /* handler */ ); typedef int (*XIOErrorHandler) ( /* WARNING, this type not in Xlib spec */ Display* /* display */ ); extern XIOErrorHandler XSetIOErrorHandler ( XIOErrorHandler /* handler */ ); extern XPixmapFormatValues *XListPixmapFormats( Display* /* display */, int* /* count_return */ ); extern int *XListDepths( Display* /* display */, int /* screen_number */, int* /* count_return */ ); /* ICCCM routines for things that don't require special include files; */ /* other declarations are given in Xutil.h */ extern Status XReconfigureWMWindow( Display* /* display */, Window /* w */, int /* screen_number */, unsigned int /* mask */, XWindowChanges* /* changes */ ); extern Status XGetWMProtocols( Display* /* display */, Window /* w */, Atom** /* protocols_return */, int* /* count_return */ ); extern Status XSetWMProtocols( Display* /* display */, Window /* w */, Atom* /* protocols */, int /* count */ ); extern Status XIconifyWindow( Display* /* display */, Window /* w */, int /* screen_number */ ); extern Status XWithdrawWindow( Display* /* display */, Window /* w */, int /* screen_number */ ); extern Status XGetCommand( Display* /* display */, Window /* w */, char*** /* argv_return */, int* /* argc_return */ ); extern Status XGetWMColormapWindows( Display* /* display */, Window /* w */, Window** /* windows_return */, int* /* count_return */ ); extern Status XSetWMColormapWindows( Display* /* display */, Window /* w */, Window* /* colormap_windows */, int /* count */ ); extern void XFreeStringList( char** /* list */ ); extern int XSetTransientForHint( Display* /* display */, Window /* w */, Window /* prop_window */ ); /* The following are given in alphabetical order */ extern int XActivateScreenSaver( Display* /* display */ ); extern int XAddHost( Display* /* display */, XHostAddress* /* host */ ); extern int XAddHosts( Display* /* display */, XHostAddress* /* hosts */, int /* num_hosts */ ); extern int XAddToExtensionList( struct _XExtData** /* structure */, XExtData* /* ext_data */ ); extern int XAddToSaveSet( Display* /* display */, Window /* w */ ); extern Status XAllocColor( Display* /* display */, Colormap /* colormap */, XColor* /* screen_in_out */ ); extern Status XAllocColorCells( Display* /* display */, Colormap /* colormap */, Bool /* contig */, unsigned long* /* plane_masks_return */, unsigned int /* nplanes */, unsigned long* /* pixels_return */, unsigned int /* npixels */ ); extern Status XAllocColorPlanes( Display* /* display */, Colormap /* colormap */, Bool /* contig */, unsigned long* /* pixels_return */, int /* ncolors */, int /* nreds */, int /* ngreens */, int /* nblues */, unsigned long* /* rmask_return */, unsigned long* /* gmask_return */, unsigned long* /* bmask_return */ ); extern Status XAllocNamedColor( Display* /* display */, Colormap /* colormap */, _Xconst char* /* color_name */, XColor* /* screen_def_return */, XColor* /* exact_def_return */ ); extern int XAllowEvents( Display* /* display */, int /* event_mode */, Time /* time */ ); extern int XAutoRepeatOff( Display* /* display */ ); extern int XAutoRepeatOn( Display* /* display */ ); extern int XBell( Display* /* display */, int /* percent */ ); extern int XBitmapBitOrder( Display* /* display */ ); extern int XBitmapPad( Display* /* display */ ); extern int XBitmapUnit( Display* /* display */ ); extern int XCellsOfScreen( Screen* /* screen */ ); extern int XChangeActivePointerGrab( Display* /* display */, unsigned int /* event_mask */, Cursor /* cursor */, Time /* time */ ); extern int XChangeGC( Display* /* display */, GC /* gc */, unsigned long /* valuemask */, XGCValues* /* values */ ); extern int XChangeKeyboardControl( Display* /* display */, unsigned long /* value_mask */, XKeyboardControl* /* values */ ); extern int XChangeKeyboardMapping( Display* /* display */, int /* first_keycode */, int /* keysyms_per_keycode */, KeySym* /* keysyms */, int /* num_codes */ ); extern int XChangePointerControl( Display* /* display */, Bool /* do_accel */, Bool /* do_threshold */, int /* accel_numerator */, int /* accel_denominator */, int /* threshold */ ); extern int XChangeProperty( Display* /* display */, Window /* w */, Atom /* property */, Atom /* type */, int /* format */, int /* mode */, _Xconst unsigned char* /* data */, int /* nelements */ ); extern int XChangeSaveSet( Display* /* display */, Window /* w */, int /* change_mode */ ); extern int XChangeWindowAttributes( Display* /* display */, Window /* w */, unsigned long /* valuemask */, XSetWindowAttributes* /* attributes */ ); extern Bool XCheckIfEvent( Display* /* display */, XEvent* /* event_return */, Bool (*) ( Display* /* display */, XEvent* /* event */, XPointer /* arg */ ) /* predicate */, XPointer /* arg */ ); extern Bool XCheckMaskEvent( Display* /* display */, long /* event_mask */, XEvent* /* event_return */ ); extern Bool XCheckTypedEvent( Display* /* display */, int /* event_type */, XEvent* /* event_return */ ); extern Bool XCheckTypedWindowEvent( Display* /* display */, Window /* w */, int /* event_type */, XEvent* /* event_return */ ); extern Bool XCheckWindowEvent( Display* /* display */, Window /* w */, long /* event_mask */, XEvent* /* event_return */ ); extern int XCirculateSubwindows( Display* /* display */, Window /* w */, int /* direction */ ); extern int XCirculateSubwindowsDown( Display* /* display */, Window /* w */ ); extern int XCirculateSubwindowsUp( Display* /* display */, Window /* w */ ); extern int XClearArea( Display* /* display */, Window /* w */, int /* x */, int /* y */, unsigned int /* width */, unsigned int /* height */, Bool /* exposures */ ); extern int XClearWindow( Display* /* display */, Window /* w */ ); extern int XCloseDisplay( Display* /* display */ ); extern int XConfigureWindow( Display* /* display */, Window /* w */, unsigned int /* value_mask */, XWindowChanges* /* values */ ); extern int XConnectionNumber( Display* /* display */ ); extern int XConvertSelection( Display* /* display */, Atom /* selection */, Atom /* target */, Atom /* property */, Window /* requestor */, Time /* time */ ); extern int XCopyArea( Display* /* display */, Drawable /* src */, Drawable /* dest */, GC /* gc */, int /* src_x */, int /* src_y */, unsigned int /* width */, unsigned int /* height */, int /* dest_x */, int /* dest_y */ ); extern int XCopyGC( Display* /* display */, GC /* src */, unsigned long /* valuemask */, GC /* dest */ ); extern int XCopyPlane( Display* /* display */, Drawable /* src */, Drawable /* dest */, GC /* gc */, int /* src_x */, int /* src_y */, unsigned int /* width */, unsigned int /* height */, int /* dest_x */, int /* dest_y */, unsigned long /* plane */ ); extern int XDefaultDepth( Display* /* display */, int /* screen_number */ ); extern int XDefaultDepthOfScreen( Screen* /* screen */ ); extern int XDefaultScreen( Display* /* display */ ); extern int XDefineCursor( Display* /* display */, Window /* w */, Cursor /* cursor */ ); extern int XDeleteProperty( Display* /* display */, Window /* w */, Atom /* property */ ); extern int XDestroyWindow( Display* /* display */, Window /* w */ ); extern int XDestroySubwindows( Display* /* display */, Window /* w */ ); extern int XDoesBackingStore( Screen* /* screen */ ); extern Bool XDoesSaveUnders( Screen* /* screen */ ); extern int XDisableAccessControl( Display* /* display */ ); extern int XDisplayCells( Display* /* display */, int /* screen_number */ ); extern int XDisplayHeight( Display* /* display */, int /* screen_number */ ); extern int XDisplayHeightMM( Display* /* display */, int /* screen_number */ ); extern int XDisplayKeycodes( Display* /* display */, int* /* min_keycodes_return */, int* /* max_keycodes_return */ ); extern int XDisplayPlanes( Display* /* display */, int /* screen_number */ ); extern int XDisplayWidth( Display* /* display */, int /* screen_number */ ); extern int XDisplayWidthMM( Display* /* display */, int /* screen_number */ ); extern int XDrawArc( Display* /* display */, Drawable /* d */, GC /* gc */, int /* x */, int /* y */, unsigned int /* width */, unsigned int /* height */, int /* angle1 */, int /* angle2 */ ); extern int XDrawArcs( Display* /* display */, Drawable /* d */, GC /* gc */, XArc* /* arcs */, int /* narcs */ ); extern int XDrawImageString( Display* /* display */, Drawable /* d */, GC /* gc */, int /* x */, int /* y */, _Xconst char* /* string */, int /* length */ ); extern int XDrawImageString16( Display* /* display */, Drawable /* d */, GC /* gc */, int /* x */, int /* y */, _Xconst XChar2b* /* string */, int /* length */ ); extern int XDrawLine( Display* /* display */, Drawable /* d */, GC /* gc */, int /* x1 */, int /* y1 */, int /* x2 */, int /* y2 */ ); extern int XDrawLines( Display* /* display */, Drawable /* d */, GC /* gc */, XPoint* /* points */, int /* npoints */, int /* mode */ ); extern int XDrawPoint( Display* /* display */, Drawable /* d */, GC /* gc */, int /* x */, int /* y */ ); extern int XDrawPoints( Display* /* display */, Drawable /* d */, GC /* gc */, XPoint* /* points */, int /* npoints */, int /* mode */ ); extern int XDrawRectangle( Display* /* display */, Drawable /* d */, GC /* gc */, int /* x */, int /* y */, unsigned int /* width */, unsigned int /* height */ ); extern int XDrawRectangles( Display* /* display */, Drawable /* d */, GC /* gc */, XRectangle* /* rectangles */, int /* nrectangles */ ); extern int XDrawSegments( Display* /* display */, Drawable /* d */, GC /* gc */, XSegment* /* segments */, int /* nsegments */ ); extern int XDrawString( Display* /* display */, Drawable /* d */, GC /* gc */, int /* x */, int /* y */, _Xconst char* /* string */, int /* length */ ); extern int XDrawString16( Display* /* display */, Drawable /* d */, GC /* gc */, int /* x */, int /* y */, _Xconst XChar2b* /* string */, int /* length */ ); extern int XDrawText( Display* /* display */, Drawable /* d */, GC /* gc */, int /* x */, int /* y */, XTextItem* /* items */, int /* nitems */ ); extern int XDrawText16( Display* /* display */, Drawable /* d */, GC /* gc */, int /* x */, int /* y */, XTextItem16* /* items */, int /* nitems */ ); extern int XEnableAccessControl( Display* /* display */ ); extern int XEventsQueued( Display* /* display */, int /* mode */ ); extern Status XFetchName( Display* /* display */, Window /* w */, char** /* window_name_return */ ); extern int XFillArc( Display* /* display */, Drawable /* d */, GC /* gc */, int /* x */, int /* y */, unsigned int /* width */, unsigned int /* height */, int /* angle1 */, int /* angle2 */ ); extern int XFillArcs( Display* /* display */, Drawable /* d */, GC /* gc */, XArc* /* arcs */, int /* narcs */ ); extern int XFillPolygon( Display* /* display */, Drawable /* d */, GC /* gc */, XPoint* /* points */, int /* npoints */, int /* shape */, int /* mode */ ); extern int XFillRectangle( Display* /* display */, Drawable /* d */, GC /* gc */, int /* x */, int /* y */, unsigned int /* width */, unsigned int /* height */ ); extern int XFillRectangles( Display* /* display */, Drawable /* d */, GC /* gc */, XRectangle* /* rectangles */, int /* nrectangles */ ); extern int XFlush( Display* /* display */ ); extern int XForceScreenSaver( Display* /* display */, int /* mode */ ); extern int XFree( void* /* data */ ); extern int XFreeColormap( Display* /* display */, Colormap /* colormap */ ); extern int XFreeColors( Display* /* display */, Colormap /* colormap */, unsigned long* /* pixels */, int /* npixels */, unsigned long /* planes */ ); extern int XFreeCursor( Display* /* display */, Cursor /* cursor */ ); extern int XFreeExtensionList( char** /* list */ ); extern int XFreeFont( Display* /* display */, XFontStruct* /* font_struct */ ); extern int XFreeFontInfo( char** /* names */, XFontStruct* /* free_info */, int /* actual_count */ ); extern int XFreeFontNames( char** /* list */ ); extern int XFreeFontPath( char** /* list */ ); extern int XFreeGC( Display* /* display */, GC /* gc */ ); extern int XFreeModifiermap( XModifierKeymap* /* modmap */ ); extern int XFreePixmap( Display* /* display */, Pixmap /* pixmap */ ); extern int XGeometry( Display* /* display */, int /* screen */, _Xconst char* /* position */, _Xconst char* /* default_position */, unsigned int /* bwidth */, unsigned int /* fwidth */, unsigned int /* fheight */, int /* xadder */, int /* yadder */, int* /* x_return */, int* /* y_return */, int* /* width_return */, int* /* height_return */ ); extern int XGetErrorDatabaseText( Display* /* display */, _Xconst char* /* name */, _Xconst char* /* message */, _Xconst char* /* default_string */, char* /* buffer_return */, int /* length */ ); extern int XGetErrorText( Display* /* display */, int /* code */, char* /* buffer_return */, int /* length */ ); extern Bool XGetFontProperty( XFontStruct* /* font_struct */, Atom /* atom */, unsigned long* /* value_return */ ); extern Status XGetGCValues( Display* /* display */, GC /* gc */, unsigned long /* valuemask */, XGCValues* /* values_return */ ); extern Status XGetGeometry( Display* /* display */, Drawable /* d */, Window* /* root_return */, int* /* x_return */, int* /* y_return */, unsigned int* /* width_return */, unsigned int* /* height_return */, unsigned int* /* border_width_return */, unsigned int* /* depth_return */ ); extern Status XGetIconName( Display* /* display */, Window /* w */, char** /* icon_name_return */ ); extern int XGetInputFocus( Display* /* display */, Window* /* focus_return */, int* /* revert_to_return */ ); extern int XGetKeyboardControl( Display* /* display */, XKeyboardState* /* values_return */ ); extern int XGetPointerControl( Display* /* display */, int* /* accel_numerator_return */, int* /* accel_denominator_return */, int* /* threshold_return */ ); extern int XGetPointerMapping( Display* /* display */, unsigned char* /* map_return */, int /* nmap */ ); extern int XGetScreenSaver( Display* /* display */, int* /* timeout_return */, int* /* interval_return */, int* /* prefer_blanking_return */, int* /* allow_exposures_return */ ); extern Status XGetTransientForHint( Display* /* display */, Window /* w */, Window* /* prop_window_return */ ); extern int XGetWindowProperty( Display* /* display */, Window /* w */, Atom /* property */, long /* long_offset */, long /* long_length */, Bool /* delete */, Atom /* req_type */, Atom* /* actual_type_return */, int* /* actual_format_return */, unsigned long* /* nitems_return */, unsigned long* /* bytes_after_return */, unsigned char** /* prop_return */ ); extern Status XGetWindowAttributes( Display* /* display */, Window /* w */, XWindowAttributes* /* window_attributes_return */ ); extern int XGrabButton( Display* /* display */, unsigned int /* button */, unsigned int /* modifiers */, Window /* grab_window */, Bool /* owner_events */, unsigned int /* event_mask */, int /* pointer_mode */, int /* keyboard_mode */, Window /* confine_to */, Cursor /* cursor */ ); extern int XGrabKey( Display* /* display */, int /* keycode */, unsigned int /* modifiers */, Window /* grab_window */, Bool /* owner_events */, int /* pointer_mode */, int /* keyboard_mode */ ); extern int XGrabKeyboard( Display* /* display */, Window /* grab_window */, Bool /* owner_events */, int /* pointer_mode */, int /* keyboard_mode */, Time /* time */ ); extern int XGrabPointer( Display* /* display */, Window /* grab_window */, Bool /* owner_events */, unsigned int /* event_mask */, int /* pointer_mode */, int /* keyboard_mode */, Window /* confine_to */, Cursor /* cursor */, Time /* time */ ); extern int XGrabServer( Display* /* display */ ); extern int XHeightMMOfScreen( Screen* /* screen */ ); extern int XHeightOfScreen( Screen* /* screen */ ); extern int XIfEvent( Display* /* display */, XEvent* /* event_return */, Bool (*) ( Display* /* display */, XEvent* /* event */, XPointer /* arg */ ) /* predicate */, XPointer /* arg */ ); extern int XImageByteOrder( Display* /* display */ ); extern int XInstallColormap( Display* /* display */, Colormap /* colormap */ ); extern KeyCode XKeysymToKeycode( Display* /* display */, KeySym /* keysym */ ); extern int XKillClient( Display* /* display */, XID /* resource */ ); extern Status XLookupColor( Display* /* display */, Colormap /* colormap */, _Xconst char* /* color_name */, XColor* /* exact_def_return */, XColor* /* screen_def_return */ ); extern int XLowerWindow( Display* /* display */, Window /* w */ ); extern int XMapRaised( Display* /* display */, Window /* w */ ); extern int XMapSubwindows( Display* /* display */, Window /* w */ ); extern int XMapWindow( Display* /* display */, Window /* w */ ); extern int XMaskEvent( Display* /* display */, long /* event_mask */, XEvent* /* event_return */ ); extern int XMaxCmapsOfScreen( Screen* /* screen */ ); extern int XMinCmapsOfScreen( Screen* /* screen */ ); extern int XMoveResizeWindow( Display* /* display */, Window /* w */, int /* x */, int /* y */, unsigned int /* width */, unsigned int /* height */ ); extern int XMoveWindow( Display* /* display */, Window /* w */, int /* x */, int /* y */ ); extern int XNextEvent( Display* /* display */, XEvent* /* event_return */ ); extern int XNoOp( Display* /* display */ ); extern Status XParseColor( Display* /* display */, Colormap /* colormap */, _Xconst char* /* spec */, XColor* /* exact_def_return */ ); extern int XParseGeometry( _Xconst char* /* parsestring */, int* /* x_return */, int* /* y_return */, unsigned int* /* width_return */, unsigned int* /* height_return */ ); extern int XPeekEvent( Display* /* display */, XEvent* /* event_return */ ); extern int XPeekIfEvent( Display* /* display */, XEvent* /* event_return */, Bool (*) ( Display* /* display */, XEvent* /* event */, XPointer /* arg */ ) /* predicate */, XPointer /* arg */ ); extern int XPending( Display* /* display */ ); extern int XPlanesOfScreen( Screen* /* screen */ ); extern int XProtocolRevision( Display* /* display */ ); extern int XProtocolVersion( Display* /* display */ ); extern int XPutBackEvent( Display* /* display */, XEvent* /* event */ ); extern int XPutImage( Display* /* display */, Drawable /* d */, GC /* gc */, XImage* /* image */, int /* src_x */, int /* src_y */, int /* dest_x */, int /* dest_y */, unsigned int /* width */, unsigned int /* height */ ); extern int XQLength( Display* /* display */ ); extern Status XQueryBestCursor( Display* /* display */, Drawable /* d */, unsigned int /* width */, unsigned int /* height */, unsigned int* /* width_return */, unsigned int* /* height_return */ ); extern Status XQueryBestSize( Display* /* display */, int /* class */, Drawable /* which_screen */, unsigned int /* width */, unsigned int /* height */, unsigned int* /* width_return */, unsigned int* /* height_return */ ); extern Status XQueryBestStipple( Display* /* display */, Drawable /* which_screen */, unsigned int /* width */, unsigned int /* height */, unsigned int* /* width_return */, unsigned int* /* height_return */ ); extern Status XQueryBestTile( Display* /* display */, Drawable /* which_screen */, unsigned int /* width */, unsigned int /* height */, unsigned int* /* width_return */, unsigned int* /* height_return */ ); extern int XQueryColor( Display* /* display */, Colormap /* colormap */, XColor* /* def_in_out */ ); extern int XQueryColors( Display* /* display */, Colormap /* colormap */, XColor* /* defs_in_out */, int /* ncolors */ ); extern Bool XQueryExtension( Display* /* display */, _Xconst char* /* name */, int* /* major_opcode_return */, int* /* first_event_return */, int* /* first_error_return */ ); extern int XQueryKeymap( Display* /* display */, char [32] /* keys_return */ ); extern Bool XQueryPointer( Display* /* display */, Window /* w */, Window* /* root_return */, Window* /* child_return */, int* /* root_x_return */, int* /* root_y_return */, int* /* win_x_return */, int* /* win_y_return */, unsigned int* /* mask_return */ ); extern int XQueryTextExtents( Display* /* display */, XID /* font_ID */, _Xconst char* /* string */, int /* nchars */, int* /* direction_return */, int* /* font_ascent_return */, int* /* font_descent_return */, XCharStruct* /* overall_return */ ); extern int XQueryTextExtents16( Display* /* display */, XID /* font_ID */, _Xconst XChar2b* /* string */, int /* nchars */, int* /* direction_return */, int* /* font_ascent_return */, int* /* font_descent_return */, XCharStruct* /* overall_return */ ); extern Status XQueryTree( Display* /* display */, Window /* w */, Window* /* root_return */, Window* /* parent_return */, Window** /* children_return */, unsigned int* /* nchildren_return */ ); extern int XRaiseWindow( Display* /* display */, Window /* w */ ); extern int XReadBitmapFile( Display* /* display */, Drawable /* d */, _Xconst char* /* filename */, unsigned int* /* width_return */, unsigned int* /* height_return */, Pixmap* /* bitmap_return */, int* /* x_hot_return */, int* /* y_hot_return */ ); extern int XReadBitmapFileData( _Xconst char* /* filename */, unsigned int* /* width_return */, unsigned int* /* height_return */, unsigned char** /* data_return */, int* /* x_hot_return */, int* /* y_hot_return */ ); extern int XRebindKeysym( Display* /* display */, KeySym /* keysym */, KeySym* /* list */, int /* mod_count */, _Xconst unsigned char* /* string */, int /* bytes_string */ ); extern int XRecolorCursor( Display* /* display */, Cursor /* cursor */, XColor* /* foreground_color */, XColor* /* background_color */ ); extern int XRefreshKeyboardMapping( XMappingEvent* /* event_map */ ); extern int XRemoveFromSaveSet( Display* /* display */, Window /* w */ ); extern int XRemoveHost( Display* /* display */, XHostAddress* /* host */ ); extern int XRemoveHosts( Display* /* display */, XHostAddress* /* hosts */, int /* num_hosts */ ); extern int XReparentWindow( Display* /* display */, Window /* w */, Window /* parent */, int /* x */, int /* y */ ); extern int XResetScreenSaver( Display* /* display */ ); extern int XResizeWindow( Display* /* display */, Window /* w */, unsigned int /* width */, unsigned int /* height */ ); extern int XRestackWindows( Display* /* display */, Window* /* windows */, int /* nwindows */ ); extern int XRotateBuffers( Display* /* display */, int /* rotate */ ); extern int XRotateWindowProperties( Display* /* display */, Window /* w */, Atom* /* properties */, int /* num_prop */, int /* npositions */ ); extern int XScreenCount( Display* /* display */ ); extern int XSelectInput( Display* /* display */, Window /* w */, long /* event_mask */ ); extern Status XSendEvent( Display* /* display */, Window /* w */, Bool /* propagate */, long /* event_mask */, XEvent* /* event_send */ ); extern int XSetAccessControl( Display* /* display */, int /* mode */ ); extern int XSetArcMode( Display* /* display */, GC /* gc */, int /* arc_mode */ ); extern int XSetBackground( Display* /* display */, GC /* gc */, unsigned long /* background */ ); extern int XSetClipMask( Display* /* display */, GC /* gc */, Pixmap /* pixmap */ ); extern int XSetClipOrigin( Display* /* display */, GC /* gc */, int /* clip_x_origin */, int /* clip_y_origin */ ); extern int XSetClipRectangles( Display* /* display */, GC /* gc */, int /* clip_x_origin */, int /* clip_y_origin */, XRectangle* /* rectangles */, int /* n */, int /* ordering */ ); extern int XSetCloseDownMode( Display* /* display */, int /* close_mode */ ); extern int XSetCommand( Display* /* display */, Window /* w */, char** /* argv */, int /* argc */ ); extern int XSetDashes( Display* /* display */, GC /* gc */, int /* dash_offset */, _Xconst char* /* dash_list */, int /* n */ ); extern int XSetFillRule( Display* /* display */, GC /* gc */, int /* fill_rule */ ); extern int XSetFillStyle( Display* /* display */, GC /* gc */, int /* fill_style */ ); extern int XSetFont( Display* /* display */, GC /* gc */, Font /* font */ ); extern int XSetFontPath( Display* /* display */, char** /* directories */, int /* ndirs */ ); extern int XSetForeground( Display* /* display */, GC /* gc */, unsigned long /* foreground */ ); extern int XSetFunction( Display* /* display */, GC /* gc */, int /* function */ ); extern int XSetGraphicsExposures( Display* /* display */, GC /* gc */, Bool /* graphics_exposures */ ); extern int XSetIconName( Display* /* display */, Window /* w */, _Xconst char* /* icon_name */ ); extern int XSetInputFocus( Display* /* display */, Window /* focus */, int /* revert_to */, Time /* time */ ); extern int XSetLineAttributes( Display* /* display */, GC /* gc */, unsigned int /* line_width */, int /* line_style */, int /* cap_style */, int /* join_style */ ); extern int XSetModifierMapping( Display* /* display */, XModifierKeymap* /* modmap */ ); extern int XSetPlaneMask( Display* /* display */, GC /* gc */, unsigned long /* plane_mask */ ); extern int XSetPointerMapping( Display* /* display */, _Xconst unsigned char* /* map */, int /* nmap */ ); extern int XSetScreenSaver( Display* /* display */, int /* timeout */, int /* interval */, int /* prefer_blanking */, int /* allow_exposures */ ); extern int XSetSelectionOwner( Display* /* display */, Atom /* selection */, Window /* owner */, Time /* time */ ); extern int XSetState( Display* /* display */, GC /* gc */, unsigned long /* foreground */, unsigned long /* background */, int /* function */, unsigned long /* plane_mask */ ); extern int XSetStipple( Display* /* display */, GC /* gc */, Pixmap /* stipple */ ); extern int XSetSubwindowMode( Display* /* display */, GC /* gc */, int /* subwindow_mode */ ); extern int XSetTSOrigin( Display* /* display */, GC /* gc */, int /* ts_x_origin */, int /* ts_y_origin */ ); extern int XSetTile( Display* /* display */, GC /* gc */, Pixmap /* tile */ ); extern int XSetWindowBackground( Display* /* display */, Window /* w */, unsigned long /* background_pixel */ ); extern int XSetWindowBackgroundPixmap( Display* /* display */, Window /* w */, Pixmap /* background_pixmap */ ); extern int XSetWindowBorder( Display* /* display */, Window /* w */, unsigned long /* border_pixel */ ); extern int XSetWindowBorderPixmap( Display* /* display */, Window /* w */, Pixmap /* border_pixmap */ ); extern int XSetWindowBorderWidth( Display* /* display */, Window /* w */, unsigned int /* width */ ); extern int XSetWindowColormap( Display* /* display */, Window /* w */, Colormap /* colormap */ ); extern int XStoreBuffer( Display* /* display */, _Xconst char* /* bytes */, int /* nbytes */, int /* buffer */ ); extern int XStoreBytes( Display* /* display */, _Xconst char* /* bytes */, int /* nbytes */ ); extern int XStoreColor( Display* /* display */, Colormap /* colormap */, XColor* /* color */ ); extern int XStoreColors( Display* /* display */, Colormap /* colormap */, XColor* /* color */, int /* ncolors */ ); extern int XStoreName( Display* /* display */, Window /* w */, _Xconst char* /* window_name */ ); extern int XStoreNamedColor( Display* /* display */, Colormap /* colormap */, _Xconst char* /* color */, unsigned long /* pixel */, int /* flags */ ); extern int XSync( Display* /* display */, Bool /* discard */ ); extern int XTextExtents( XFontStruct* /* font_struct */, _Xconst char* /* string */, int /* nchars */, int* /* direction_return */, int* /* font_ascent_return */, int* /* font_descent_return */, XCharStruct* /* overall_return */ ); extern int XTextExtents16( XFontStruct* /* font_struct */, _Xconst XChar2b* /* string */, int /* nchars */, int* /* direction_return */, int* /* font_ascent_return */, int* /* font_descent_return */, XCharStruct* /* overall_return */ ); extern int XTextWidth( XFontStruct* /* font_struct */, _Xconst char* /* string */, int /* count */ ); extern int XTextWidth16( XFontStruct* /* font_struct */, _Xconst XChar2b* /* string */, int /* count */ ); extern Bool XTranslateCoordinates( Display* /* display */, Window /* src_w */, Window /* dest_w */, int /* src_x */, int /* src_y */, int* /* dest_x_return */, int* /* dest_y_return */, Window* /* child_return */ ); extern int XUndefineCursor( Display* /* display */, Window /* w */ ); extern int XUngrabButton( Display* /* display */, unsigned int /* button */, unsigned int /* modifiers */, Window /* grab_window */ ); extern int XUngrabKey( Display* /* display */, int /* keycode */, unsigned int /* modifiers */, Window /* grab_window */ ); extern int XUngrabKeyboard( Display* /* display */, Time /* time */ ); extern int XUngrabPointer( Display* /* display */, Time /* time */ ); extern int XUngrabServer( Display* /* display */ ); extern int XUninstallColormap( Display* /* display */, Colormap /* colormap */ ); extern int XUnloadFont( Display* /* display */, Font /* font */ ); extern int XUnmapSubwindows( Display* /* display */, Window /* w */ ); extern int XUnmapWindow( Display* /* display */, Window /* w */ ); extern int XVendorRelease( Display* /* display */ ); extern int XWarpPointer( Display* /* display */, Window /* src_w */, Window /* dest_w */, int /* src_x */, int /* src_y */, unsigned int /* src_width */, unsigned int /* src_height */, int /* dest_x */, int /* dest_y */ ); extern int XWidthMMOfScreen( Screen* /* screen */ ); extern int XWidthOfScreen( Screen* /* screen */ ); extern int XWindowEvent( Display* /* display */, Window /* w */, long /* event_mask */, XEvent* /* event_return */ ); extern int XWriteBitmapFile( Display* /* display */, _Xconst char* /* filename */, Pixmap /* bitmap */, unsigned int /* width */, unsigned int /* height */, int /* x_hot */, int /* y_hot */ ); extern Bool XSupportsLocale (void); extern char *XSetLocaleModifiers( const char* /* modifier_list */ ); extern XOM XOpenOM( Display* /* display */, struct _XrmHashBucketRec* /* rdb */, _Xconst char* /* res_name */, _Xconst char* /* res_class */ ); extern Status XCloseOM( XOM /* om */ ); extern char *XSetOMValues( XOM /* om */, ... ) _X_SENTINEL(0); extern char *XGetOMValues( XOM /* om */, ... ) _X_SENTINEL(0); extern Display *XDisplayOfOM( XOM /* om */ ); extern char *XLocaleOfOM( XOM /* om */ ); extern XOC XCreateOC( XOM /* om */, ... ) _X_SENTINEL(0); extern void XDestroyOC( XOC /* oc */ ); extern XOM XOMOfOC( XOC /* oc */ ); extern char *XSetOCValues( XOC /* oc */, ... ) _X_SENTINEL(0); extern char *XGetOCValues( XOC /* oc */, ... ) _X_SENTINEL(0); extern XFontSet XCreateFontSet( Display* /* display */, _Xconst char* /* base_font_name_list */, char*** /* missing_charset_list */, int* /* missing_charset_count */, char** /* def_string */ ); extern void XFreeFontSet( Display* /* display */, XFontSet /* font_set */ ); extern int XFontsOfFontSet( XFontSet /* font_set */, XFontStruct*** /* font_struct_list */, char*** /* font_name_list */ ); extern char *XBaseFontNameListOfFontSet( XFontSet /* font_set */ ); extern char *XLocaleOfFontSet( XFontSet /* font_set */ ); extern Bool XContextDependentDrawing( XFontSet /* font_set */ ); extern Bool XDirectionalDependentDrawing( XFontSet /* font_set */ ); extern Bool XContextualDrawing( XFontSet /* font_set */ ); extern XFontSetExtents *XExtentsOfFontSet( XFontSet /* font_set */ ); extern int XmbTextEscapement( XFontSet /* font_set */, _Xconst char* /* text */, int /* bytes_text */ ); extern int XwcTextEscapement( XFontSet /* font_set */, _Xconst wchar_t* /* text */, int /* num_wchars */ ); extern int Xutf8TextEscapement( XFontSet /* font_set */, _Xconst char* /* text */, int /* bytes_text */ ); extern int XmbTextExtents( XFontSet /* font_set */, _Xconst char* /* text */, int /* bytes_text */, XRectangle* /* overall_ink_return */, XRectangle* /* overall_logical_return */ ); extern int XwcTextExtents( XFontSet /* font_set */, _Xconst wchar_t* /* text */, int /* num_wchars */, XRectangle* /* overall_ink_return */, XRectangle* /* overall_logical_return */ ); extern int Xutf8TextExtents( XFontSet /* font_set */, _Xconst char* /* text */, int /* bytes_text */, XRectangle* /* overall_ink_return */, XRectangle* /* overall_logical_return */ ); extern Status XmbTextPerCharExtents( XFontSet /* font_set */, _Xconst char* /* text */, int /* bytes_text */, XRectangle* /* ink_extents_buffer */, XRectangle* /* logical_extents_buffer */, int /* buffer_size */, int* /* num_chars */, XRectangle* /* overall_ink_return */, XRectangle* /* overall_logical_return */ ); extern Status XwcTextPerCharExtents( XFontSet /* font_set */, _Xconst wchar_t* /* text */, int /* num_wchars */, XRectangle* /* ink_extents_buffer */, XRectangle* /* logical_extents_buffer */, int /* buffer_size */, int* /* num_chars */, XRectangle* /* overall_ink_return */, XRectangle* /* overall_logical_return */ ); extern Status Xutf8TextPerCharExtents( XFontSet /* font_set */, _Xconst char* /* text */, int /* bytes_text */, XRectangle* /* ink_extents_buffer */, XRectangle* /* logical_extents_buffer */, int /* buffer_size */, int* /* num_chars */, XRectangle* /* overall_ink_return */, XRectangle* /* overall_logical_return */ ); extern void XmbDrawText( Display* /* display */, Drawable /* d */, GC /* gc */, int /* x */, int /* y */, XmbTextItem* /* text_items */, int /* nitems */ ); extern void XwcDrawText( Display* /* display */, Drawable /* d */, GC /* gc */, int /* x */, int /* y */, XwcTextItem* /* text_items */, int /* nitems */ ); extern void Xutf8DrawText( Display* /* display */, Drawable /* d */, GC /* gc */, int /* x */, int /* y */, XmbTextItem* /* text_items */, int /* nitems */ ); extern void XmbDrawString( Display* /* display */, Drawable /* d */, XFontSet /* font_set */, GC /* gc */, int /* x */, int /* y */, _Xconst char* /* text */, int /* bytes_text */ ); extern void XwcDrawString( Display* /* display */, Drawable /* d */, XFontSet /* font_set */, GC /* gc */, int /* x */, int /* y */, _Xconst wchar_t* /* text */, int /* num_wchars */ ); extern void Xutf8DrawString( Display* /* display */, Drawable /* d */, XFontSet /* font_set */, GC /* gc */, int /* x */, int /* y */, _Xconst char* /* text */, int /* bytes_text */ ); extern void XmbDrawImageString( Display* /* display */, Drawable /* d */, XFontSet /* font_set */, GC /* gc */, int /* x */, int /* y */, _Xconst char* /* text */, int /* bytes_text */ ); extern void XwcDrawImageString( Display* /* display */, Drawable /* d */, XFontSet /* font_set */, GC /* gc */, int /* x */, int /* y */, _Xconst wchar_t* /* text */, int /* num_wchars */ ); extern void Xutf8DrawImageString( Display* /* display */, Drawable /* d */, XFontSet /* font_set */, GC /* gc */, int /* x */, int /* y */, _Xconst char* /* text */, int /* bytes_text */ ); extern XIM XOpenIM( Display* /* dpy */, struct _XrmHashBucketRec* /* rdb */, char* /* res_name */, char* /* res_class */ ); extern Status XCloseIM( XIM /* im */ ); extern char *XGetIMValues( XIM /* im */, ... ) _X_SENTINEL(0); extern char *XSetIMValues( XIM /* im */, ... ) _X_SENTINEL(0); extern Display *XDisplayOfIM( XIM /* im */ ); extern char *XLocaleOfIM( XIM /* im*/ ); extern XIC XCreateIC( XIM /* im */, ... ) _X_SENTINEL(0); extern void XDestroyIC( XIC /* ic */ ); extern void XSetICFocus( XIC /* ic */ ); extern void XUnsetICFocus( XIC /* ic */ ); extern wchar_t *XwcResetIC( XIC /* ic */ ); extern char *XmbResetIC( XIC /* ic */ ); extern char *Xutf8ResetIC( XIC /* ic */ ); extern char *XSetICValues( XIC /* ic */, ... ) _X_SENTINEL(0); extern char *XGetICValues( XIC /* ic */, ... ) _X_SENTINEL(0); extern XIM XIMOfIC( XIC /* ic */ ); extern Bool XFilterEvent( XEvent* /* event */, Window /* window */ ); extern int XmbLookupString( XIC /* ic */, XKeyPressedEvent* /* event */, char* /* buffer_return */, int /* bytes_buffer */, KeySym* /* keysym_return */, Status* /* status_return */ ); extern int XwcLookupString( XIC /* ic */, XKeyPressedEvent* /* event */, wchar_t* /* buffer_return */, int /* wchars_buffer */, KeySym* /* keysym_return */, Status* /* status_return */ ); extern int Xutf8LookupString( XIC /* ic */, XKeyPressedEvent* /* event */, char* /* buffer_return */, int /* bytes_buffer */, KeySym* /* keysym_return */, Status* /* status_return */ ); extern XVaNestedList XVaCreateNestedList( int /*unused*/, ... ) _X_SENTINEL(0); /* internal connections for IMs */ extern Bool XRegisterIMInstantiateCallback( Display* /* dpy */, struct _XrmHashBucketRec* /* rdb */, char* /* res_name */, char* /* res_class */, XIDProc /* callback */, XPointer /* client_data */ ); extern Bool XUnregisterIMInstantiateCallback( Display* /* dpy */, struct _XrmHashBucketRec* /* rdb */, char* /* res_name */, char* /* res_class */, XIDProc /* callback */, XPointer /* client_data */ ); typedef void (*XConnectionWatchProc)( Display* /* dpy */, XPointer /* client_data */, int /* fd */, Bool /* opening */, /* open or close flag */ XPointer* /* watch_data */ /* open sets, close uses */ ); extern Status XInternalConnectionNumbers( Display* /* dpy */, int** /* fd_return */, int* /* count_return */ ); extern void XProcessInternalConnection( Display* /* dpy */, int /* fd */ ); extern Status XAddConnectionWatch( Display* /* dpy */, XConnectionWatchProc /* callback */, XPointer /* client_data */ ); extern void XRemoveConnectionWatch( Display* /* dpy */, XConnectionWatchProc /* callback */, XPointer /* client_data */ ); extern void XSetAuthorization( char * /* name */, int /* namelen */, char * /* data */, int /* datalen */ ); extern int _Xmbtowc( wchar_t * /* wstr */, #ifdef ISC char const * /* str */, size_t /* len */ #else char * /* str */, int /* len */ #endif ); extern int _Xwctomb( char * /* str */, wchar_t /* wc */ ); extern Bool XGetEventData( Display* /* dpy */, XGenericEventCookie* /* cookie*/ ); extern void XFreeEventData( Display* /* dpy */, XGenericEventCookie* /* cookie*/ ); _XFUNCPROTOEND #endif /* _X11_XLIB_H_ */ ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/X11/Xmd.h ================================================ /*********************************************************** Copyright 1987, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Digital not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ #ifndef XMD_H # define XMD_H 1 /* * Xmd.h: MACHINE DEPENDENT DECLARATIONS. */ /* * Special per-machine configuration flags. */ # if defined(__sun) && defined(__SVR4) # include <sys/isa_defs.h> /* Solaris: defines _LP64 if necessary */ # endif # if defined (_LP64) || defined(__LP64__) || \ defined(__alpha) || defined(__alpha__) || \ defined(__ia64__) || defined(ia64) || \ defined(__sparc64__) || \ defined(__s390x__) || \ defined(__amd64__) || defined(amd64) || \ defined(__powerpc64__) # if !defined(__ILP32__) /* amd64-x32 is 32bit */ # define LONG64 /* 32/64-bit architecture */ # endif /* !__ILP32__ */ # endif /* * Definition of macro used to set constants for size of network structures; * machines with preprocessors that can't handle all of the sz_ symbols * can define this macro to be sizeof(x) if and only if their compiler doesn't * pad out structures (esp. the xTextElt structure which contains only two * one-byte fields). Network structures should always define sz_symbols. * * The sz_ prefix is used instead of something more descriptive so that the * symbols are no more than 32 characters long (which causes problems for some * compilers and preprocessors). * * The extra indirection is to get macro arguments to expand correctly before * the concatenation, rather than afterward. */ # define _SIZEOF(x) sz_##x # define SIZEOF(x) _SIZEOF(x) /* * Bitfield suffixes for the protocol structure elements, if you * need them. Note that bitfields are not guaranteed to be signed * (or even unsigned) according to ANSI C. */ # define B32 /* bitfield not needed on architectures with native 32-bit type */ # define B16 /* bitfield not needed on architectures with native 16-bit type */ # ifdef LONG64 typedef long INT64; typedef int INT32; # else typedef long INT32; # endif typedef short INT16; typedef signed char INT8; # ifdef LONG64 typedef unsigned long CARD64; typedef unsigned int CARD32; # else typedef unsigned long long CARD64; typedef unsigned long CARD32; # endif typedef unsigned short CARD16; typedef unsigned char CARD8; typedef CARD32 BITS32; typedef CARD16 BITS16; typedef CARD8 BYTE; typedef CARD8 BOOL; /* * was definitions for sign-extending bitfields on architectures without * native types smaller than 64-bit, now just backwards compatibility */ # define cvtINT8toInt(val) (val) # define cvtINT16toInt(val) (val) # define cvtINT32toInt(val) (val) # define cvtINT8toShort(val) (val) # define cvtINT16toShort(val) (val) # define cvtINT32toShort(val) (val) # define cvtINT8toLong(val) (val) # define cvtINT16toLong(val) (val) # define cvtINT32toLong(val) (val) /* * this version should leave result of type (t *), but that should only be * used when not in MUSTCOPY */ # define NEXTPTR(p,t) (((t *)(p)) + 1) #endif /* XMD_H */ ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/X11/Xosdefs.h ================================================ /* * O/S-dependent (mis)feature macro definitions * Copyright 1991, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ #ifndef _XOSDEFS_H_ # define _XOSDEFS_H_ /* * X_NOT_POSIX means does not have POSIX header files. Lack of this * symbol does NOT mean that the POSIX environment is the default. * You may still have to define _POSIX_SOURCE to get it. */ # ifdef _SCO_DS # ifndef __SCO__ # define __SCO__ # endif # endif # ifdef __i386__ # ifdef SYSV # if !defined(__SCO__) && \ !defined(__UNIXWARE__) && !defined(__sun) # if !defined(_POSIX_SOURCE) # define X_NOT_POSIX # endif # endif # endif # endif # ifdef __sun /* Imake configs define SVR4 on Solaris, but cc & gcc only define __SVR4 * This check allows non-Imake configured programs to build correctly. */ # if defined(__SVR4) && !defined(SVR4) # define SVR4 1 # endif # ifdef SVR4 /* define this to whatever it needs to be */ # define X_POSIX_C_SOURCE 199300L # endif # endif # ifdef WIN32 # ifndef _POSIX_ # define X_NOT_POSIX # endif # endif # ifdef __APPLE__ # define NULL_NOT_ZERO /* Defining any of these will sanitize the namespace to JUST want is defined by * that particular standard. If that happens, we don't get some expected * prototypes, typedefs, etc (like fd_mask). We can define _DARWIN_C_SOURCE to * loosen our belts a tad. */ # if defined(_XOPEN_SOURCE) || defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) # ifndef _DARWIN_C_SOURCE # define _DARWIN_C_SOURCE # endif # endif # endif # ifdef __GNU__ # ifndef PATH_MAX # define PATH_MAX 4096 # endif # ifndef MAXPATHLEN # define MAXPATHLEN 4096 # endif # endif # if defined(__SCO__) || defined(__UNIXWARE__) # ifndef PATH_MAX # define PATH_MAX 1024 # endif # ifndef MAXPATHLEN # define MAXPATHLEN 1024 # endif # endif # if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) \ || defined(__APPLE__) || defined(__DragonFly__) # ifndef CSRG_BASED # define CSRG_BASED # endif # endif #endif /* _XOSDEFS_H_ */ ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/X11/Xutil.h ================================================ /*********************************************************** Copyright 1987, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Digital not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ #ifndef _X11_XUTIL_H_ #define _X11_XUTIL_H_ /* You must include <X11/Xlib.h> before including this file */ #include <X11/Xlib.h> #include <X11/keysym.h> /* * Bitmask returned by XParseGeometry(). Each bit tells if the corresponding * value (x, y, width, height) was found in the parsed string. */ #define NoValue 0x0000 #define XValue 0x0001 #define YValue 0x0002 #define WidthValue 0x0004 #define HeightValue 0x0008 #define AllValues 0x000F #define XNegative 0x0010 #define YNegative 0x0020 /* * new version containing base_width, base_height, and win_gravity fields; * used with WM_NORMAL_HINTS. */ typedef struct { long flags; /* marks which fields in this structure are defined */ int x, y; /* obsolete for new window mgrs, but clients */ int width, height; /* should set so old wm's don't mess up */ int min_width, min_height; int max_width, max_height; int width_inc, height_inc; struct { int x; /* numerator */ int y; /* denominator */ } min_aspect, max_aspect; int base_width, base_height; /* added by ICCCM version 1 */ int win_gravity; /* added by ICCCM version 1 */ } XSizeHints; /* * The next block of definitions are for window manager properties that * clients and applications use for communication. */ /* flags argument in size hints */ #define USPosition (1L << 0) /* user specified x, y */ #define USSize (1L << 1) /* user specified width, height */ #define PPosition (1L << 2) /* program specified position */ #define PSize (1L << 3) /* program specified size */ #define PMinSize (1L << 4) /* program specified minimum size */ #define PMaxSize (1L << 5) /* program specified maximum size */ #define PResizeInc (1L << 6) /* program specified resize increments */ #define PAspect (1L << 7) /* program specified min and max aspect ratios */ #define PBaseSize (1L << 8) /* program specified base for incrementing */ #define PWinGravity (1L << 9) /* program specified window gravity */ /* obsolete */ #define PAllHints (PPosition|PSize|PMinSize|PMaxSize|PResizeInc|PAspect) typedef struct { long flags; /* marks which fields in this structure are defined */ Bool input; /* does this application rely on the window manager to get keyboard input? */ int initial_state; /* see below */ Pixmap icon_pixmap; /* pixmap to be used as icon */ Window icon_window; /* window to be used as icon */ int icon_x, icon_y; /* initial position of icon */ Pixmap icon_mask; /* icon mask bitmap */ XID window_group; /* id of related window group */ /* this structure may be extended in the future */ } XWMHints; /* definition for flags of XWMHints */ #define InputHint (1L << 0) #define StateHint (1L << 1) #define IconPixmapHint (1L << 2) #define IconWindowHint (1L << 3) #define IconPositionHint (1L << 4) #define IconMaskHint (1L << 5) #define WindowGroupHint (1L << 6) #define AllHints (InputHint|StateHint|IconPixmapHint|IconWindowHint| \ IconPositionHint|IconMaskHint|WindowGroupHint) #define XUrgencyHint (1L << 8) /* definitions for initial window state */ #define WithdrawnState 0 /* for windows that are not mapped */ #define NormalState 1 /* most applications want to start this way */ #define IconicState 3 /* application wants to start as an icon */ /* * Obsolete states no longer defined by ICCCM */ #define DontCareState 0 /* don't know or care */ #define ZoomState 2 /* application wants to start zoomed */ #define InactiveState 4 /* application believes it is seldom used; */ /* some wm's may put it on inactive menu */ /* * new structure for manipulating TEXT properties; used with WM_NAME, * WM_ICON_NAME, WM_CLIENT_MACHINE, and WM_COMMAND. */ typedef struct { unsigned char *value; /* same as Property routines */ Atom encoding; /* prop type */ int format; /* prop data format: 8, 16, or 32 */ unsigned long nitems; /* number of data items in value */ } XTextProperty; #define XNoMemory -1 #define XLocaleNotSupported -2 #define XConverterNotFound -3 typedef enum { XStringStyle, /* STRING */ XCompoundTextStyle, /* COMPOUND_TEXT */ XTextStyle, /* text in owner's encoding (current locale)*/ XStdICCTextStyle, /* STRING, else COMPOUND_TEXT */ /* The following is an XFree86 extension, introduced in November 2000 */ XUTF8StringStyle /* UTF8_STRING */ } XICCEncodingStyle; typedef struct { int min_width, min_height; int max_width, max_height; int width_inc, height_inc; } XIconSize; typedef struct { char *res_name; char *res_class; } XClassHint; #ifdef XUTIL_DEFINE_FUNCTIONS extern int XDestroyImage( XImage *ximage); extern unsigned long XGetPixel( XImage *ximage, int x, int y); extern int XPutPixel( XImage *ximage, int x, int y, unsigned long pixel); extern XImage *XSubImage( XImage *ximage, int x, int y, unsigned int width, unsigned int height); extern int XAddPixel( XImage *ximage, long value); #else /* * These macros are used to give some sugar to the image routines so that * naive people are more comfortable with them. */ #define XDestroyImage(ximage) \ ((*((ximage)->f.destroy_image))((ximage))) #define XGetPixel(ximage, x, y) \ ((*((ximage)->f.get_pixel))((ximage), (x), (y))) #define XPutPixel(ximage, x, y, pixel) \ ((*((ximage)->f.put_pixel))((ximage), (x), (y), (pixel))) #define XSubImage(ximage, x, y, width, height) \ ((*((ximage)->f.sub_image))((ximage), (x), (y), (width), (height))) #define XAddPixel(ximage, value) \ ((*((ximage)->f.add_pixel))((ximage), (value))) #endif /* * Compose sequence status structure, used in calling XLookupString. */ typedef struct _XComposeStatus { XPointer compose_ptr; /* state table pointer */ int chars_matched; /* match state */ } XComposeStatus; /* * Keysym macros, used on Keysyms to test for classes of symbols */ #define IsKeypadKey(keysym) \ (((KeySym)(keysym) >= XK_KP_Space) && ((KeySym)(keysym) <= XK_KP_Equal)) #define IsPrivateKeypadKey(keysym) \ (((KeySym)(keysym) >= 0x11000000) && ((KeySym)(keysym) <= 0x1100FFFF)) #define IsCursorKey(keysym) \ (((KeySym)(keysym) >= XK_Home) && ((KeySym)(keysym) < XK_Select)) #define IsPFKey(keysym) \ (((KeySym)(keysym) >= XK_KP_F1) && ((KeySym)(keysym) <= XK_KP_F4)) #define IsFunctionKey(keysym) \ (((KeySym)(keysym) >= XK_F1) && ((KeySym)(keysym) <= XK_F35)) #define IsMiscFunctionKey(keysym) \ (((KeySym)(keysym) >= XK_Select) && ((KeySym)(keysym) <= XK_Break)) #ifdef XK_XKB_KEYS #define IsModifierKey(keysym) \ ((((KeySym)(keysym) >= XK_Shift_L) && ((KeySym)(keysym) <= XK_Hyper_R)) \ || (((KeySym)(keysym) >= XK_ISO_Lock) && \ ((KeySym)(keysym) <= XK_ISO_Level5_Lock)) \ || ((KeySym)(keysym) == XK_Mode_switch) \ || ((KeySym)(keysym) == XK_Num_Lock)) #else #define IsModifierKey(keysym) \ ((((KeySym)(keysym) >= XK_Shift_L) && ((KeySym)(keysym) <= XK_Hyper_R)) \ || ((KeySym)(keysym) == XK_Mode_switch) \ || ((KeySym)(keysym) == XK_Num_Lock)) #endif /* * opaque reference to Region data type */ typedef struct _XRegion *Region; /* Return values from XRectInRegion() */ #define RectangleOut 0 #define RectangleIn 1 #define RectanglePart 2 /* * Information used by the visual utility routines to find desired visual * type from the many visuals a display may support. */ typedef struct { Visual *visual; VisualID visualid; int screen; int depth; #if defined(__cplusplus) || defined(c_plusplus) int c_class; /* C++ */ #else int class; #endif unsigned long red_mask; unsigned long green_mask; unsigned long blue_mask; int colormap_size; int bits_per_rgb; } XVisualInfo; #define VisualNoMask 0x0 #define VisualIDMask 0x1 #define VisualScreenMask 0x2 #define VisualDepthMask 0x4 #define VisualClassMask 0x8 #define VisualRedMaskMask 0x10 #define VisualGreenMaskMask 0x20 #define VisualBlueMaskMask 0x40 #define VisualColormapSizeMask 0x80 #define VisualBitsPerRGBMask 0x100 #define VisualAllMask 0x1FF /* * This defines a window manager property that clients may use to * share standard color maps of type RGB_COLOR_MAP: */ typedef struct { Colormap colormap; unsigned long red_max; unsigned long red_mult; unsigned long green_max; unsigned long green_mult; unsigned long blue_max; unsigned long blue_mult; unsigned long base_pixel; VisualID visualid; /* added by ICCCM version 1 */ XID killid; /* added by ICCCM version 1 */ } XStandardColormap; #define ReleaseByFreeingColormap ((XID) 1L) /* for killid field above */ /* * return codes for XReadBitmapFile and XWriteBitmapFile */ #define BitmapSuccess 0 #define BitmapOpenFailed 1 #define BitmapFileInvalid 2 #define BitmapNoMemory 3 /**************************************************************** * * Context Management * ****************************************************************/ /* Associative lookup table return codes */ #define XCSUCCESS 0 /* No error. */ #define XCNOMEM 1 /* Out of memory */ #define XCNOENT 2 /* No entry in table */ typedef int XContext; #define XUniqueContext() ((XContext) XrmUniqueQuark()) #define XStringToContext(string) ((XContext) XrmStringToQuark(string)) _XFUNCPROTOBEGIN /* The following declarations are alphabetized. */ extern XClassHint *XAllocClassHint ( void ); extern XIconSize *XAllocIconSize ( void ); extern XSizeHints *XAllocSizeHints ( void ); extern XStandardColormap *XAllocStandardColormap ( void ); extern XWMHints *XAllocWMHints ( void ); extern int XClipBox( Region /* r */, XRectangle* /* rect_return */ ); extern Region XCreateRegion( void ); extern const char *XDefaultString (void); extern int XDeleteContext( Display* /* display */, XID /* rid */, XContext /* context */ ); extern int XDestroyRegion( Region /* r */ ); extern int XEmptyRegion( Region /* r */ ); extern int XEqualRegion( Region /* r1 */, Region /* r2 */ ); extern int XFindContext( Display* /* display */, XID /* rid */, XContext /* context */, XPointer* /* data_return */ ); extern Status XGetClassHint( Display* /* display */, Window /* w */, XClassHint* /* class_hints_return */ ); extern Status XGetIconSizes( Display* /* display */, Window /* w */, XIconSize** /* size_list_return */, int* /* count_return */ ); extern Status XGetNormalHints( Display* /* display */, Window /* w */, XSizeHints* /* hints_return */ ); extern Status XGetRGBColormaps( Display* /* display */, Window /* w */, XStandardColormap** /* stdcmap_return */, int* /* count_return */, Atom /* property */ ); extern Status XGetSizeHints( Display* /* display */, Window /* w */, XSizeHints* /* hints_return */, Atom /* property */ ); extern Status XGetStandardColormap( Display* /* display */, Window /* w */, XStandardColormap* /* colormap_return */, Atom /* property */ ); extern Status XGetTextProperty( Display* /* display */, Window /* window */, XTextProperty* /* text_prop_return */, Atom /* property */ ); extern XVisualInfo *XGetVisualInfo( Display* /* display */, long /* vinfo_mask */, XVisualInfo* /* vinfo_template */, int* /* nitems_return */ ); extern Status XGetWMClientMachine( Display* /* display */, Window /* w */, XTextProperty* /* text_prop_return */ ); extern XWMHints *XGetWMHints( Display* /* display */, Window /* w */ ); extern Status XGetWMIconName( Display* /* display */, Window /* w */, XTextProperty* /* text_prop_return */ ); extern Status XGetWMName( Display* /* display */, Window /* w */, XTextProperty* /* text_prop_return */ ); extern Status XGetWMNormalHints( Display* /* display */, Window /* w */, XSizeHints* /* hints_return */, long* /* supplied_return */ ); extern Status XGetWMSizeHints( Display* /* display */, Window /* w */, XSizeHints* /* hints_return */, long* /* supplied_return */, Atom /* property */ ); extern Status XGetZoomHints( Display* /* display */, Window /* w */, XSizeHints* /* zhints_return */ ); extern int XIntersectRegion( Region /* sra */, Region /* srb */, Region /* dr_return */ ); extern void XConvertCase( KeySym /* sym */, KeySym* /* lower */, KeySym* /* upper */ ); extern int XLookupString( XKeyEvent* /* event_struct */, char* /* buffer_return */, int /* bytes_buffer */, KeySym* /* keysym_return */, XComposeStatus* /* status_in_out */ ); extern Status XMatchVisualInfo( Display* /* display */, int /* screen */, int /* depth */, int /* class */, XVisualInfo* /* vinfo_return */ ); extern int XOffsetRegion( Region /* r */, int /* dx */, int /* dy */ ); extern Bool XPointInRegion( Region /* r */, int /* x */, int /* y */ ); extern Region XPolygonRegion( XPoint* /* points */, int /* n */, int /* fill_rule */ ); extern int XRectInRegion( Region /* r */, int /* x */, int /* y */, unsigned int /* width */, unsigned int /* height */ ); extern int XSaveContext( Display* /* display */, XID /* rid */, XContext /* context */, _Xconst char* /* data */ ); extern int XSetClassHint( Display* /* display */, Window /* w */, XClassHint* /* class_hints */ ); extern int XSetIconSizes( Display* /* display */, Window /* w */, XIconSize* /* size_list */, int /* count */ ); extern int XSetNormalHints( Display* /* display */, Window /* w */, XSizeHints* /* hints */ ); extern void XSetRGBColormaps( Display* /* display */, Window /* w */, XStandardColormap* /* stdcmaps */, int /* count */, Atom /* property */ ); extern int XSetSizeHints( Display* /* display */, Window /* w */, XSizeHints* /* hints */, Atom /* property */ ); extern int XSetStandardProperties( Display* /* display */, Window /* w */, _Xconst char* /* window_name */, _Xconst char* /* icon_name */, Pixmap /* icon_pixmap */, char** /* argv */, int /* argc */, XSizeHints* /* hints */ ); extern void XSetTextProperty( Display* /* display */, Window /* w */, XTextProperty* /* text_prop */, Atom /* property */ ); extern void XSetWMClientMachine( Display* /* display */, Window /* w */, XTextProperty* /* text_prop */ ); extern int XSetWMHints( Display* /* display */, Window /* w */, XWMHints* /* wm_hints */ ); extern void XSetWMIconName( Display* /* display */, Window /* w */, XTextProperty* /* text_prop */ ); extern void XSetWMName( Display* /* display */, Window /* w */, XTextProperty* /* text_prop */ ); extern void XSetWMNormalHints( Display* /* display */, Window /* w */, XSizeHints* /* hints */ ); extern void XSetWMProperties( Display* /* display */, Window /* w */, XTextProperty* /* window_name */, XTextProperty* /* icon_name */, char** /* argv */, int /* argc */, XSizeHints* /* normal_hints */, XWMHints* /* wm_hints */, XClassHint* /* class_hints */ ); extern void XmbSetWMProperties( Display* /* display */, Window /* w */, _Xconst char* /* window_name */, _Xconst char* /* icon_name */, char** /* argv */, int /* argc */, XSizeHints* /* normal_hints */, XWMHints* /* wm_hints */, XClassHint* /* class_hints */ ); extern void Xutf8SetWMProperties( Display* /* display */, Window /* w */, _Xconst char* /* window_name */, _Xconst char* /* icon_name */, char** /* argv */, int /* argc */, XSizeHints* /* normal_hints */, XWMHints* /* wm_hints */, XClassHint* /* class_hints */ ); extern void XSetWMSizeHints( Display* /* display */, Window /* w */, XSizeHints* /* hints */, Atom /* property */ ); extern int XSetRegion( Display* /* display */, GC /* gc */, Region /* r */ ); extern void XSetStandardColormap( Display* /* display */, Window /* w */, XStandardColormap* /* colormap */, Atom /* property */ ); extern int XSetZoomHints( Display* /* display */, Window /* w */, XSizeHints* /* zhints */ ); extern int XShrinkRegion( Region /* r */, int /* dx */, int /* dy */ ); extern Status XStringListToTextProperty( char** /* list */, int /* count */, XTextProperty* /* text_prop_return */ ); extern int XSubtractRegion( Region /* sra */, Region /* srb */, Region /* dr_return */ ); extern int XmbTextListToTextProperty( Display* display, char** list, int count, XICCEncodingStyle style, XTextProperty* text_prop_return ); extern int XwcTextListToTextProperty( Display* display, wchar_t** list, int count, XICCEncodingStyle style, XTextProperty* text_prop_return ); extern int Xutf8TextListToTextProperty( Display* display, char** list, int count, XICCEncodingStyle style, XTextProperty* text_prop_return ); extern void XwcFreeStringList( wchar_t** list ); extern Status XTextPropertyToStringList( XTextProperty* /* text_prop */, char*** /* list_return */, int* /* count_return */ ); extern int XmbTextPropertyToTextList( Display* display, const XTextProperty* text_prop, char*** list_return, int* count_return ); extern int XwcTextPropertyToTextList( Display* display, const XTextProperty* text_prop, wchar_t*** list_return, int* count_return ); extern int Xutf8TextPropertyToTextList( Display* display, const XTextProperty* text_prop, char*** list_return, int* count_return ); extern int XUnionRectWithRegion( XRectangle* /* rectangle */, Region /* src_region */, Region /* dest_region_return */ ); extern int XUnionRegion( Region /* sra */, Region /* srb */, Region /* dr_return */ ); extern int XWMGeometry( Display* /* display */, int /* screen_number */, _Xconst char* /* user_geometry */, _Xconst char* /* default_geometry */, unsigned int /* border_width */, XSizeHints* /* hints */, int* /* x_return */, int* /* y_return */, int* /* width_return */, int* /* height_return */, int* /* gravity_return */ ); extern int XXorRegion( Region /* sra */, Region /* srb */, Region /* dr_return */ ); _XFUNCPROTOEND #endif /* _X11_XUTIL_H_ */ ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/X11/extensions/Xrandr.h ================================================ /* * Copyright © 2000 Compaq Computer Corporation, Inc. * Copyright © 2002 Hewlett-Packard Company, Inc. * Copyright © 2006 Intel Corporation * Copyright © 2008 Red Hat, Inc. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that copyright * notice and this permission notice appear in supporting documentation, and * that the name of the copyright holders not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. The copyright holders make no representations * about the suitability of this software for any purpose. It is provided "as * is" without express or implied warranty. * * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. * * Author: Jim Gettys, HP Labs, Hewlett-Packard, Inc. * Keith Packard, Intel Corporation */ #ifndef _XRANDR_H_ #define _XRANDR_H_ #include <X11/extensions/randr.h> #include <X11/extensions/Xrender.h> #include <X11/Xfuncproto.h> _XFUNCPROTOBEGIN typedef XID RROutput; typedef XID RRCrtc; typedef XID RRMode; typedef XID RRProvider; typedef struct { int width, height; int mwidth, mheight; } XRRScreenSize; /* * Events. */ typedef struct { int type; /* event base */ unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; /* window which selected for this event */ Window root; /* Root window for changed screen */ Time timestamp; /* when the screen change occurred */ Time config_timestamp; /* when the last configuration change */ SizeID size_index; SubpixelOrder subpixel_order; Rotation rotation; int width; int height; int mwidth; int mheight; } XRRScreenChangeNotifyEvent; typedef struct { int type; /* event base */ unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; /* window which selected for this event */ int subtype; /* RRNotify_ subtype */ } XRRNotifyEvent; typedef struct { int type; /* event base */ unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; /* window which selected for this event */ int subtype; /* RRNotify_OutputChange */ RROutput output; /* affected output */ RRCrtc crtc; /* current crtc (or None) */ RRMode mode; /* current mode (or None) */ Rotation rotation; /* current rotation of associated crtc */ Connection connection; /* current connection status */ SubpixelOrder subpixel_order; } XRROutputChangeNotifyEvent; typedef struct { int type; /* event base */ unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; /* window which selected for this event */ int subtype; /* RRNotify_CrtcChange */ RRCrtc crtc; /* current crtc (or None) */ RRMode mode; /* current mode (or None) */ Rotation rotation; /* current rotation of associated crtc */ int x, y; /* position */ unsigned int width, height; /* size */ } XRRCrtcChangeNotifyEvent; typedef struct { int type; /* event base */ unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; /* window which selected for this event */ int subtype; /* RRNotify_OutputProperty */ RROutput output; /* related output */ Atom property; /* changed property */ Time timestamp; /* time of change */ int state; /* NewValue, Deleted */ } XRROutputPropertyNotifyEvent; typedef struct { int type; /* event base */ unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; /* window which selected for this event */ int subtype; /* RRNotify_ProviderChange */ RRProvider provider; /* current provider (or None) */ Time timestamp; /* time of change */ unsigned int current_role; } XRRProviderChangeNotifyEvent; typedef struct { int type; /* event base */ unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; /* window which selected for this event */ int subtype; /* RRNotify_ProviderProperty */ RRProvider provider; /* related provider */ Atom property; /* changed property */ Time timestamp; /* time of change */ int state; /* NewValue, Deleted */ } XRRProviderPropertyNotifyEvent; typedef struct { int type; /* event base */ unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; /* window which selected for this event */ int subtype; /* RRNotify_ResourceChange */ Time timestamp; /* time of change */ } XRRResourceChangeNotifyEvent; /* internal representation is private to the library */ typedef struct _XRRScreenConfiguration XRRScreenConfiguration; Bool XRRQueryExtension (Display *dpy, int *event_base_return, int *error_base_return); Status XRRQueryVersion (Display *dpy, int *major_version_return, int *minor_version_return); XRRScreenConfiguration *XRRGetScreenInfo (Display *dpy, Window window); void XRRFreeScreenConfigInfo (XRRScreenConfiguration *config); /* * Note that screen configuration changes are only permitted if the client can * prove it has up to date configuration information. We are trying to * insist that it become possible for screens to change dynamically, so * we want to ensure the client knows what it is talking about when requesting * changes. */ Status XRRSetScreenConfig (Display *dpy, XRRScreenConfiguration *config, Drawable draw, int size_index, Rotation rotation, Time timestamp); /* added in v1.1, sorry for the lame name */ Status XRRSetScreenConfigAndRate (Display *dpy, XRRScreenConfiguration *config, Drawable draw, int size_index, Rotation rotation, short rate, Time timestamp); Rotation XRRConfigRotations(XRRScreenConfiguration *config, Rotation *current_rotation); Time XRRConfigTimes (XRRScreenConfiguration *config, Time *config_timestamp); XRRScreenSize *XRRConfigSizes(XRRScreenConfiguration *config, int *nsizes); short *XRRConfigRates (XRRScreenConfiguration *config, int sizeID, int *nrates); SizeID XRRConfigCurrentConfiguration (XRRScreenConfiguration *config, Rotation *rotation); short XRRConfigCurrentRate (XRRScreenConfiguration *config); int XRRRootToScreen(Display *dpy, Window root); /* * returns the screen configuration for the specified screen; does a lazy * evalution to delay getting the information, and caches the result. * These routines should be used in preference to XRRGetScreenInfo * to avoid unneeded round trips to the X server. These are new * in protocol version 0.1. */ void XRRSelectInput(Display *dpy, Window window, int mask); /* * the following are always safe to call, even if RandR is not implemented * on a screen */ Rotation XRRRotations(Display *dpy, int screen, Rotation *current_rotation); XRRScreenSize *XRRSizes(Display *dpy, int screen, int *nsizes); short *XRRRates (Display *dpy, int screen, int sizeID, int *nrates); Time XRRTimes (Display *dpy, int screen, Time *config_timestamp); /* Version 1.2 additions */ /* despite returning a Status, this returns 1 for success */ Status XRRGetScreenSizeRange (Display *dpy, Window window, int *minWidth, int *minHeight, int *maxWidth, int *maxHeight); void XRRSetScreenSize (Display *dpy, Window window, int width, int height, int mmWidth, int mmHeight); typedef unsigned long XRRModeFlags; typedef struct _XRRModeInfo { RRMode id; unsigned int width; unsigned int height; unsigned long dotClock; unsigned int hSyncStart; unsigned int hSyncEnd; unsigned int hTotal; unsigned int hSkew; unsigned int vSyncStart; unsigned int vSyncEnd; unsigned int vTotal; char *name; unsigned int nameLength; XRRModeFlags modeFlags; } XRRModeInfo; typedef struct _XRRScreenResources { Time timestamp; Time configTimestamp; int ncrtc; RRCrtc *crtcs; int noutput; RROutput *outputs; int nmode; XRRModeInfo *modes; } XRRScreenResources; XRRScreenResources * XRRGetScreenResources (Display *dpy, Window window); void XRRFreeScreenResources (XRRScreenResources *resources); typedef struct _XRROutputInfo { Time timestamp; RRCrtc crtc; char *name; int nameLen; unsigned long mm_width; unsigned long mm_height; Connection connection; SubpixelOrder subpixel_order; int ncrtc; RRCrtc *crtcs; int nclone; RROutput *clones; int nmode; int npreferred; RRMode *modes; } XRROutputInfo; XRROutputInfo * XRRGetOutputInfo (Display *dpy, XRRScreenResources *resources, RROutput output); void XRRFreeOutputInfo (XRROutputInfo *outputInfo); Atom * XRRListOutputProperties (Display *dpy, RROutput output, int *nprop); typedef struct { Bool pending; Bool range; Bool immutable; int num_values; long *values; } XRRPropertyInfo; XRRPropertyInfo * XRRQueryOutputProperty (Display *dpy, RROutput output, Atom property); void XRRConfigureOutputProperty (Display *dpy, RROutput output, Atom property, Bool pending, Bool range, int num_values, long *values); void XRRChangeOutputProperty (Display *dpy, RROutput output, Atom property, Atom type, int format, int mode, _Xconst unsigned char *data, int nelements); void XRRDeleteOutputProperty (Display *dpy, RROutput output, Atom property); int XRRGetOutputProperty (Display *dpy, RROutput output, Atom property, long offset, long length, Bool _delete, Bool pending, Atom req_type, Atom *actual_type, int *actual_format, unsigned long *nitems, unsigned long *bytes_after, unsigned char **prop); XRRModeInfo * XRRAllocModeInfo (_Xconst char *name, int nameLength); RRMode XRRCreateMode (Display *dpy, Window window, XRRModeInfo *modeInfo); void XRRDestroyMode (Display *dpy, RRMode mode); void XRRAddOutputMode (Display *dpy, RROutput output, RRMode mode); void XRRDeleteOutputMode (Display *dpy, RROutput output, RRMode mode); void XRRFreeModeInfo (XRRModeInfo *modeInfo); typedef struct _XRRCrtcInfo { Time timestamp; int x, y; unsigned int width, height; RRMode mode; Rotation rotation; int noutput; RROutput *outputs; Rotation rotations; int npossible; RROutput *possible; } XRRCrtcInfo; XRRCrtcInfo * XRRGetCrtcInfo (Display *dpy, XRRScreenResources *resources, RRCrtc crtc); void XRRFreeCrtcInfo (XRRCrtcInfo *crtcInfo); Status XRRSetCrtcConfig (Display *dpy, XRRScreenResources *resources, RRCrtc crtc, Time timestamp, int x, int y, RRMode mode, Rotation rotation, RROutput *outputs, int noutputs); int XRRGetCrtcGammaSize (Display *dpy, RRCrtc crtc); typedef struct _XRRCrtcGamma { int size; unsigned short *red; unsigned short *green; unsigned short *blue; } XRRCrtcGamma; XRRCrtcGamma * XRRGetCrtcGamma (Display *dpy, RRCrtc crtc); XRRCrtcGamma * XRRAllocGamma (int size); void XRRSetCrtcGamma (Display *dpy, RRCrtc crtc, XRRCrtcGamma *gamma); void XRRFreeGamma (XRRCrtcGamma *gamma); /* Version 1.3 additions */ XRRScreenResources * XRRGetScreenResourcesCurrent (Display *dpy, Window window); void XRRSetCrtcTransform (Display *dpy, RRCrtc crtc, XTransform *transform, _Xconst char *filter, XFixed *params, int nparams); typedef struct _XRRCrtcTransformAttributes { XTransform pendingTransform; char *pendingFilter; int pendingNparams; XFixed *pendingParams; XTransform currentTransform; char *currentFilter; int currentNparams; XFixed *currentParams; } XRRCrtcTransformAttributes; /* * Get current crtc transforms and filters. * Pass *attributes to XFree to free */ Status XRRGetCrtcTransform (Display *dpy, RRCrtc crtc, XRRCrtcTransformAttributes **attributes); /* * intended to take RRScreenChangeNotify, or * ConfigureNotify (on the root window) * returns 1 if it is an event type it understands, 0 if not */ int XRRUpdateConfiguration(XEvent *event); typedef struct _XRRPanning { Time timestamp; unsigned int left; unsigned int top; unsigned int width; unsigned int height; unsigned int track_left; unsigned int track_top; unsigned int track_width; unsigned int track_height; int border_left; int border_top; int border_right; int border_bottom; } XRRPanning; XRRPanning * XRRGetPanning (Display *dpy, XRRScreenResources *resources, RRCrtc crtc); void XRRFreePanning (XRRPanning *panning); Status XRRSetPanning (Display *dpy, XRRScreenResources *resources, RRCrtc crtc, XRRPanning *panning); void XRRSetOutputPrimary(Display *dpy, Window window, RROutput output); RROutput XRRGetOutputPrimary(Display *dpy, Window window); typedef struct _XRRProviderResources { Time timestamp; int nproviders; RRProvider *providers; } XRRProviderResources; XRRProviderResources * XRRGetProviderResources(Display *dpy, Window window); void XRRFreeProviderResources(XRRProviderResources *resources); typedef struct _XRRProviderInfo { unsigned int capabilities; int ncrtcs; RRCrtc *crtcs; int noutputs; RROutput *outputs; char *name; int nassociatedproviders; RRProvider *associated_providers; unsigned int *associated_capability; int nameLen; } XRRProviderInfo; XRRProviderInfo * XRRGetProviderInfo(Display *dpy, XRRScreenResources *resources, RRProvider provider); void XRRFreeProviderInfo(XRRProviderInfo *provider); int XRRSetProviderOutputSource(Display *dpy, XID provider, XID source_provider); int XRRSetProviderOffloadSink(Display *dpy, XID provider, XID sink_provider); Atom * XRRListProviderProperties (Display *dpy, RRProvider provider, int *nprop); XRRPropertyInfo * XRRQueryProviderProperty (Display *dpy, RRProvider provider, Atom property); void XRRConfigureProviderProperty (Display *dpy, RRProvider provider, Atom property, Bool pending, Bool range, int num_values, long *values); void XRRChangeProviderProperty (Display *dpy, RRProvider provider, Atom property, Atom type, int format, int mode, _Xconst unsigned char *data, int nelements); void XRRDeleteProviderProperty (Display *dpy, RRProvider provider, Atom property); int XRRGetProviderProperty (Display *dpy, RRProvider provider, Atom property, long offset, long length, Bool _delete, Bool pending, Atom req_type, Atom *actual_type, int *actual_format, unsigned long *nitems, unsigned long *bytes_after, unsigned char **prop); typedef struct _XRRMonitorInfo { Atom name; Bool primary; Bool automatic; int noutput; int x; int y; int width; int height; int mwidth; int mheight; RROutput *outputs; } XRRMonitorInfo; XRRMonitorInfo * XRRAllocateMonitor(Display *dpy, int noutput); XRRMonitorInfo * XRRGetMonitors(Display *dpy, Window window, Bool get_active, int *nmonitors); void XRRSetMonitor(Display *dpy, Window window, XRRMonitorInfo *monitor); void XRRDeleteMonitor(Display *dpy, Window window, Atom name); void XRRFreeMonitors(XRRMonitorInfo *monitors); _XFUNCPROTOEND #endif /* _XRANDR_H_ */ ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/X11/extensions/Xrender.h ================================================ /* * * Copyright © 2000 SuSE, Inc. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of SuSE not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. SuSE makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Keith Packard, SuSE, Inc. */ #ifndef _XRENDER_H_ #define _XRENDER_H_ #include <X11/Xlib.h> #include <X11/Xfuncproto.h> #include <X11/Xosdefs.h> #include <X11/Xutil.h> #include <X11/extensions/render.h> typedef struct { short red; short redMask; short green; short greenMask; short blue; short blueMask; short alpha; short alphaMask; } XRenderDirectFormat; typedef struct { PictFormat id; int type; int depth; XRenderDirectFormat direct; Colormap colormap; } XRenderPictFormat; #define PictFormatID (1 << 0) #define PictFormatType (1 << 1) #define PictFormatDepth (1 << 2) #define PictFormatRed (1 << 3) #define PictFormatRedMask (1 << 4) #define PictFormatGreen (1 << 5) #define PictFormatGreenMask (1 << 6) #define PictFormatBlue (1 << 7) #define PictFormatBlueMask (1 << 8) #define PictFormatAlpha (1 << 9) #define PictFormatAlphaMask (1 << 10) #define PictFormatColormap (1 << 11) typedef struct _XRenderPictureAttributes { int repeat; Picture alpha_map; int alpha_x_origin; int alpha_y_origin; int clip_x_origin; int clip_y_origin; Pixmap clip_mask; Bool graphics_exposures; int subwindow_mode; int poly_edge; int poly_mode; Atom dither; Bool component_alpha; } XRenderPictureAttributes; typedef struct { unsigned short red; unsigned short green; unsigned short blue; unsigned short alpha; } XRenderColor; typedef struct _XGlyphInfo { unsigned short width; unsigned short height; short x; short y; short xOff; short yOff; } XGlyphInfo; typedef struct _XGlyphElt8 { GlyphSet glyphset; _Xconst char *chars; int nchars; int xOff; int yOff; } XGlyphElt8; typedef struct _XGlyphElt16 { GlyphSet glyphset; _Xconst unsigned short *chars; int nchars; int xOff; int yOff; } XGlyphElt16; typedef struct _XGlyphElt32 { GlyphSet glyphset; _Xconst unsigned int *chars; int nchars; int xOff; int yOff; } XGlyphElt32; typedef double XDouble; typedef struct _XPointDouble { XDouble x, y; } XPointDouble; #define XDoubleToFixed(f) ((XFixed) ((f) * 65536)) #define XFixedToDouble(f) (((XDouble) (f)) / 65536) typedef int XFixed; typedef struct _XPointFixed { XFixed x, y; } XPointFixed; typedef struct _XLineFixed { XPointFixed p1, p2; } XLineFixed; typedef struct _XTriangle { XPointFixed p1, p2, p3; } XTriangle; typedef struct _XCircle { XFixed x; XFixed y; XFixed radius; } XCircle; typedef struct _XTrapezoid { XFixed top, bottom; XLineFixed left, right; } XTrapezoid; typedef struct _XTransform { XFixed matrix[3][3]; } XTransform; typedef struct _XFilters { int nfilter; char **filter; int nalias; short *alias; } XFilters; typedef struct _XIndexValue { unsigned long pixel; unsigned short red, green, blue, alpha; } XIndexValue; typedef struct _XAnimCursor { Cursor cursor; unsigned long delay; } XAnimCursor; typedef struct _XSpanFix { XFixed left, right, y; } XSpanFix; typedef struct _XTrap { XSpanFix top, bottom; } XTrap; typedef struct _XLinearGradient { XPointFixed p1; XPointFixed p2; } XLinearGradient; typedef struct _XRadialGradient { XCircle inner; XCircle outer; } XRadialGradient; typedef struct _XConicalGradient { XPointFixed center; XFixed angle; /* in degrees */ } XConicalGradient; _XFUNCPROTOBEGIN Bool XRenderQueryExtension (Display *dpy, int *event_basep, int *error_basep); Status XRenderQueryVersion (Display *dpy, int *major_versionp, int *minor_versionp); Status XRenderQueryFormats (Display *dpy); int XRenderQuerySubpixelOrder (Display *dpy, int screen); Bool XRenderSetSubpixelOrder (Display *dpy, int screen, int subpixel); XRenderPictFormat * XRenderFindVisualFormat (Display *dpy, _Xconst Visual *visual); XRenderPictFormat * XRenderFindFormat (Display *dpy, unsigned long mask, _Xconst XRenderPictFormat *templ, int count); #define PictStandardARGB32 0 #define PictStandardRGB24 1 #define PictStandardA8 2 #define PictStandardA4 3 #define PictStandardA1 4 #define PictStandardNUM 5 XRenderPictFormat * XRenderFindStandardFormat (Display *dpy, int format); XIndexValue * XRenderQueryPictIndexValues(Display *dpy, _Xconst XRenderPictFormat *format, int *num); Picture XRenderCreatePicture (Display *dpy, Drawable drawable, _Xconst XRenderPictFormat *format, unsigned long valuemask, _Xconst XRenderPictureAttributes *attributes); void XRenderChangePicture (Display *dpy, Picture picture, unsigned long valuemask, _Xconst XRenderPictureAttributes *attributes); void XRenderSetPictureClipRectangles (Display *dpy, Picture picture, int xOrigin, int yOrigin, _Xconst XRectangle *rects, int n); void XRenderSetPictureClipRegion (Display *dpy, Picture picture, Region r); void XRenderSetPictureTransform (Display *dpy, Picture picture, XTransform *transform); void XRenderFreePicture (Display *dpy, Picture picture); void XRenderComposite (Display *dpy, int op, Picture src, Picture mask, Picture dst, int src_x, int src_y, int mask_x, int mask_y, int dst_x, int dst_y, unsigned int width, unsigned int height); GlyphSet XRenderCreateGlyphSet (Display *dpy, _Xconst XRenderPictFormat *format); GlyphSet XRenderReferenceGlyphSet (Display *dpy, GlyphSet existing); void XRenderFreeGlyphSet (Display *dpy, GlyphSet glyphset); void XRenderAddGlyphs (Display *dpy, GlyphSet glyphset, _Xconst Glyph *gids, _Xconst XGlyphInfo *glyphs, int nglyphs, _Xconst char *images, int nbyte_images); void XRenderFreeGlyphs (Display *dpy, GlyphSet glyphset, _Xconst Glyph *gids, int nglyphs); void XRenderCompositeString8 (Display *dpy, int op, Picture src, Picture dst, _Xconst XRenderPictFormat *maskFormat, GlyphSet glyphset, int xSrc, int ySrc, int xDst, int yDst, _Xconst char *string, int nchar); void XRenderCompositeString16 (Display *dpy, int op, Picture src, Picture dst, _Xconst XRenderPictFormat *maskFormat, GlyphSet glyphset, int xSrc, int ySrc, int xDst, int yDst, _Xconst unsigned short *string, int nchar); void XRenderCompositeString32 (Display *dpy, int op, Picture src, Picture dst, _Xconst XRenderPictFormat *maskFormat, GlyphSet glyphset, int xSrc, int ySrc, int xDst, int yDst, _Xconst unsigned int *string, int nchar); void XRenderCompositeText8 (Display *dpy, int op, Picture src, Picture dst, _Xconst XRenderPictFormat *maskFormat, int xSrc, int ySrc, int xDst, int yDst, _Xconst XGlyphElt8 *elts, int nelt); void XRenderCompositeText16 (Display *dpy, int op, Picture src, Picture dst, _Xconst XRenderPictFormat *maskFormat, int xSrc, int ySrc, int xDst, int yDst, _Xconst XGlyphElt16 *elts, int nelt); void XRenderCompositeText32 (Display *dpy, int op, Picture src, Picture dst, _Xconst XRenderPictFormat *maskFormat, int xSrc, int ySrc, int xDst, int yDst, _Xconst XGlyphElt32 *elts, int nelt); void XRenderFillRectangle (Display *dpy, int op, Picture dst, _Xconst XRenderColor *color, int x, int y, unsigned int width, unsigned int height); void XRenderFillRectangles (Display *dpy, int op, Picture dst, _Xconst XRenderColor *color, _Xconst XRectangle *rectangles, int n_rects); void XRenderCompositeTrapezoids (Display *dpy, int op, Picture src, Picture dst, _Xconst XRenderPictFormat *maskFormat, int xSrc, int ySrc, _Xconst XTrapezoid *traps, int ntrap); void XRenderCompositeTriangles (Display *dpy, int op, Picture src, Picture dst, _Xconst XRenderPictFormat *maskFormat, int xSrc, int ySrc, _Xconst XTriangle *triangles, int ntriangle); void XRenderCompositeTriStrip (Display *dpy, int op, Picture src, Picture dst, _Xconst XRenderPictFormat *maskFormat, int xSrc, int ySrc, _Xconst XPointFixed *points, int npoint); void XRenderCompositeTriFan (Display *dpy, int op, Picture src, Picture dst, _Xconst XRenderPictFormat *maskFormat, int xSrc, int ySrc, _Xconst XPointFixed *points, int npoint); void XRenderCompositeDoublePoly (Display *dpy, int op, Picture src, Picture dst, _Xconst XRenderPictFormat *maskFormat, int xSrc, int ySrc, int xDst, int yDst, _Xconst XPointDouble *fpoints, int npoints, int winding); Status XRenderParseColor(Display *dpy, char *spec, XRenderColor *def); Cursor XRenderCreateCursor (Display *dpy, Picture source, unsigned int x, unsigned int y); XFilters * XRenderQueryFilters (Display *dpy, Drawable drawable); void XRenderSetPictureFilter (Display *dpy, Picture picture, const char *filter, XFixed *params, int nparams); Cursor XRenderCreateAnimCursor (Display *dpy, int ncursor, XAnimCursor *cursors); void XRenderAddTraps (Display *dpy, Picture picture, int xOff, int yOff, _Xconst XTrap *traps, int ntrap); Picture XRenderCreateSolidFill (Display *dpy, const XRenderColor *color); Picture XRenderCreateLinearGradient (Display *dpy, const XLinearGradient *gradient, const XFixed *stops, const XRenderColor *colors, int nstops); Picture XRenderCreateRadialGradient (Display *dpy, const XRadialGradient *gradient, const XFixed *stops, const XRenderColor *colors, int nstops); Picture XRenderCreateConicalGradient (Display *dpy, const XConicalGradient *gradient, const XFixed *stops, const XRenderColor *colors, int nstops); _XFUNCPROTOEND #endif /* _XRENDER_H_ */ ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/X11/extensions/randr.h ================================================ /* * Copyright © 2000 Compaq Computer Corporation * Copyright © 2002 Hewlett Packard Company * Copyright © 2006 Intel Corporation * Copyright © 2008 Red Hat, Inc. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that copyright * notice and this permission notice appear in supporting documentation, and * that the name of the copyright holders not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. The copyright holders make no representations * about the suitability of this software for any purpose. It is provided "as * is" without express or implied warranty. * * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. * * Author: Jim Gettys, HP Labs, Hewlett-Packard, Inc. * Keith Packard, Intel Corporation */ #ifndef _RANDR_H_ #define _RANDR_H_ typedef unsigned short Rotation; typedef unsigned short SizeID; typedef unsigned short SubpixelOrder; typedef unsigned short Connection; typedef unsigned short XRandrRotation; typedef unsigned short XRandrSizeID; typedef unsigned short XRandrSubpixelOrder; typedef unsigned long XRandrModeFlags; #define RANDR_NAME "RANDR" #define RANDR_MAJOR 1 #define RANDR_MINOR 4 #define RRNumberErrors 4 #define RRNumberEvents 2 #define RRNumberRequests 42 #define X_RRQueryVersion 0 /* we skip 1 to make old clients fail pretty immediately */ #define X_RROldGetScreenInfo 1 #define X_RR1_0SetScreenConfig 2 /* V1.0 apps share the same set screen config request id */ #define X_RRSetScreenConfig 2 #define X_RROldScreenChangeSelectInput 3 /* 3 used to be ScreenChangeSelectInput; deprecated */ #define X_RRSelectInput 4 #define X_RRGetScreenInfo 5 /* V1.2 additions */ #define X_RRGetScreenSizeRange 6 #define X_RRSetScreenSize 7 #define X_RRGetScreenResources 8 #define X_RRGetOutputInfo 9 #define X_RRListOutputProperties 10 #define X_RRQueryOutputProperty 11 #define X_RRConfigureOutputProperty 12 #define X_RRChangeOutputProperty 13 #define X_RRDeleteOutputProperty 14 #define X_RRGetOutputProperty 15 #define X_RRCreateMode 16 #define X_RRDestroyMode 17 #define X_RRAddOutputMode 18 #define X_RRDeleteOutputMode 19 #define X_RRGetCrtcInfo 20 #define X_RRSetCrtcConfig 21 #define X_RRGetCrtcGammaSize 22 #define X_RRGetCrtcGamma 23 #define X_RRSetCrtcGamma 24 /* V1.3 additions */ #define X_RRGetScreenResourcesCurrent 25 #define X_RRSetCrtcTransform 26 #define X_RRGetCrtcTransform 27 #define X_RRGetPanning 28 #define X_RRSetPanning 29 #define X_RRSetOutputPrimary 30 #define X_RRGetOutputPrimary 31 #define RRTransformUnit (1L << 0) #define RRTransformScaleUp (1L << 1) #define RRTransformScaleDown (1L << 2) #define RRTransformProjective (1L << 3) /* v1.4 */ #define X_RRGetProviders 32 #define X_RRGetProviderInfo 33 #define X_RRSetProviderOffloadSink 34 #define X_RRSetProviderOutputSource 35 #define X_RRListProviderProperties 36 #define X_RRQueryProviderProperty 37 #define X_RRConfigureProviderProperty 38 #define X_RRChangeProviderProperty 39 #define X_RRDeleteProviderProperty 40 #define X_RRGetProviderProperty 41 /* Event selection bits */ #define RRScreenChangeNotifyMask (1L << 0) /* V1.2 additions */ #define RRCrtcChangeNotifyMask (1L << 1) #define RROutputChangeNotifyMask (1L << 2) #define RROutputPropertyNotifyMask (1L << 3) /* V1.4 additions */ #define RRProviderChangeNotifyMask (1L << 4) #define RRProviderPropertyNotifyMask (1L << 5) #define RRResourceChangeNotifyMask (1L << 6) /* Event codes */ #define RRScreenChangeNotify 0 /* V1.2 additions */ #define RRNotify 1 /* RRNotify Subcodes */ #define RRNotify_CrtcChange 0 #define RRNotify_OutputChange 1 #define RRNotify_OutputProperty 2 #define RRNotify_ProviderChange 3 #define RRNotify_ProviderProperty 4 #define RRNotify_ResourceChange 5 /* used in the rotation field; rotation and reflection in 0.1 proto. */ #define RR_Rotate_0 1 #define RR_Rotate_90 2 #define RR_Rotate_180 4 #define RR_Rotate_270 8 /* new in 1.0 protocol, to allow reflection of screen */ #define RR_Reflect_X 16 #define RR_Reflect_Y 32 #define RRSetConfigSuccess 0 #define RRSetConfigInvalidConfigTime 1 #define RRSetConfigInvalidTime 2 #define RRSetConfigFailed 3 /* new in 1.2 protocol */ #define RR_HSyncPositive 0x00000001 #define RR_HSyncNegative 0x00000002 #define RR_VSyncPositive 0x00000004 #define RR_VSyncNegative 0x00000008 #define RR_Interlace 0x00000010 #define RR_DoubleScan 0x00000020 #define RR_CSync 0x00000040 #define RR_CSyncPositive 0x00000080 #define RR_CSyncNegative 0x00000100 #define RR_HSkewPresent 0x00000200 #define RR_BCast 0x00000400 #define RR_PixelMultiplex 0x00000800 #define RR_DoubleClock 0x00001000 #define RR_ClockDivideBy2 0x00002000 #define RR_Connected 0 #define RR_Disconnected 1 #define RR_UnknownConnection 2 #define BadRROutput 0 #define BadRRCrtc 1 #define BadRRMode 2 #define BadRRProvider 3 /* Conventional RandR output properties */ #define RR_PROPERTY_BACKLIGHT "Backlight" #define RR_PROPERTY_RANDR_EDID "EDID" #define RR_PROPERTY_SIGNAL_FORMAT "SignalFormat" #define RR_PROPERTY_SIGNAL_PROPERTIES "SignalProperties" #define RR_PROPERTY_CONNECTOR_TYPE "ConnectorType" #define RR_PROPERTY_CONNECTOR_NUMBER "ConnectorNumber" #define RR_PROPERTY_COMPATIBILITY_LIST "CompatibilityList" #define RR_PROPERTY_CLONE_LIST "CloneList" #define RR_PROPERTY_BORDER "Border" #define RR_PROPERTY_BORDER_DIMENSIONS "BorderDimensions" /* roles this device can carry out */ #define RR_Capability_None 0 #define RR_Capability_SourceOutput 1 #define RR_Capability_SinkOutput 2 #define RR_Capability_SourceOffload 4 #define RR_Capability_SinkOffload 8 #endif /* _RANDR_H_ */ ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/X11/extensions/render.h ================================================ /* * $XFree86: xc/include/extensions/render.h,v 1.10 2002/11/06 22:47:49 keithp Exp $ * * Copyright © 2000 SuSE, Inc. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of SuSE not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. SuSE makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Keith Packard, SuSE, Inc. */ #ifndef _RENDER_H_ #define _RENDER_H_ #include <X11/Xdefs.h> typedef XID Glyph; typedef XID GlyphSet; typedef XID Picture; typedef XID PictFormat; #define RENDER_NAME "RENDER" #define RENDER_MAJOR 0 #define RENDER_MINOR 11 #define X_RenderQueryVersion 0 #define X_RenderQueryPictFormats 1 #define X_RenderQueryPictIndexValues 2 /* 0.7 */ #define X_RenderQueryDithers 3 #define X_RenderCreatePicture 4 #define X_RenderChangePicture 5 #define X_RenderSetPictureClipRectangles 6 #define X_RenderFreePicture 7 #define X_RenderComposite 8 #define X_RenderScale 9 #define X_RenderTrapezoids 10 #define X_RenderTriangles 11 #define X_RenderTriStrip 12 #define X_RenderTriFan 13 #define X_RenderColorTrapezoids 14 #define X_RenderColorTriangles 15 /* #define X_RenderTransform 16 */ #define X_RenderCreateGlyphSet 17 #define X_RenderReferenceGlyphSet 18 #define X_RenderFreeGlyphSet 19 #define X_RenderAddGlyphs 20 #define X_RenderAddGlyphsFromPicture 21 #define X_RenderFreeGlyphs 22 #define X_RenderCompositeGlyphs8 23 #define X_RenderCompositeGlyphs16 24 #define X_RenderCompositeGlyphs32 25 #define X_RenderFillRectangles 26 /* 0.5 */ #define X_RenderCreateCursor 27 /* 0.6 */ #define X_RenderSetPictureTransform 28 #define X_RenderQueryFilters 29 #define X_RenderSetPictureFilter 30 /* 0.8 */ #define X_RenderCreateAnimCursor 31 /* 0.9 */ #define X_RenderAddTraps 32 /* 0.10 */ #define X_RenderCreateSolidFill 33 #define X_RenderCreateLinearGradient 34 #define X_RenderCreateRadialGradient 35 #define X_RenderCreateConicalGradient 36 #define RenderNumberRequests (X_RenderCreateConicalGradient+1) #define BadPictFormat 0 #define BadPicture 1 #define BadPictOp 2 #define BadGlyphSet 3 #define BadGlyph 4 #define RenderNumberErrors (BadGlyph+1) #define PictTypeIndexed 0 #define PictTypeDirect 1 #define PictOpMinimum 0 #define PictOpClear 0 #define PictOpSrc 1 #define PictOpDst 2 #define PictOpOver 3 #define PictOpOverReverse 4 #define PictOpIn 5 #define PictOpInReverse 6 #define PictOpOut 7 #define PictOpOutReverse 8 #define PictOpAtop 9 #define PictOpAtopReverse 10 #define PictOpXor 11 #define PictOpAdd 12 #define PictOpSaturate 13 #define PictOpMaximum 13 /* * Operators only available in version 0.2 */ #define PictOpDisjointMinimum 0x10 #define PictOpDisjointClear 0x10 #define PictOpDisjointSrc 0x11 #define PictOpDisjointDst 0x12 #define PictOpDisjointOver 0x13 #define PictOpDisjointOverReverse 0x14 #define PictOpDisjointIn 0x15 #define PictOpDisjointInReverse 0x16 #define PictOpDisjointOut 0x17 #define PictOpDisjointOutReverse 0x18 #define PictOpDisjointAtop 0x19 #define PictOpDisjointAtopReverse 0x1a #define PictOpDisjointXor 0x1b #define PictOpDisjointMaximum 0x1b #define PictOpConjointMinimum 0x20 #define PictOpConjointClear 0x20 #define PictOpConjointSrc 0x21 #define PictOpConjointDst 0x22 #define PictOpConjointOver 0x23 #define PictOpConjointOverReverse 0x24 #define PictOpConjointIn 0x25 #define PictOpConjointInReverse 0x26 #define PictOpConjointOut 0x27 #define PictOpConjointOutReverse 0x28 #define PictOpConjointAtop 0x29 #define PictOpConjointAtopReverse 0x2a #define PictOpConjointXor 0x2b #define PictOpConjointMaximum 0x2b /* * Operators only available in version 0.11 */ #define PictOpBlendMinimum 0x30 #define PictOpMultiply 0x30 #define PictOpScreen 0x31 #define PictOpOverlay 0x32 #define PictOpDarken 0x33 #define PictOpLighten 0x34 #define PictOpColorDodge 0x35 #define PictOpColorBurn 0x36 #define PictOpHardLight 0x37 #define PictOpSoftLight 0x38 #define PictOpDifference 0x39 #define PictOpExclusion 0x3a #define PictOpHSLHue 0x3b #define PictOpHSLSaturation 0x3c #define PictOpHSLColor 0x3d #define PictOpHSLLuminosity 0x3e #define PictOpBlendMaximum 0x3e #define PolyEdgeSharp 0 #define PolyEdgeSmooth 1 #define PolyModePrecise 0 #define PolyModeImprecise 1 #define CPRepeat (1 << 0) #define CPAlphaMap (1 << 1) #define CPAlphaXOrigin (1 << 2) #define CPAlphaYOrigin (1 << 3) #define CPClipXOrigin (1 << 4) #define CPClipYOrigin (1 << 5) #define CPClipMask (1 << 6) #define CPGraphicsExposure (1 << 7) #define CPSubwindowMode (1 << 8) #define CPPolyEdge (1 << 9) #define CPPolyMode (1 << 10) #define CPDither (1 << 11) #define CPComponentAlpha (1 << 12) #define CPLastBit 12 /* Filters included in 0.6 */ #define FilterNearest "nearest" #define FilterBilinear "bilinear" /* Filters included in 0.10 */ #define FilterConvolution "convolution" #define FilterFast "fast" #define FilterGood "good" #define FilterBest "best" #define FilterAliasNone -1 /* Subpixel orders included in 0.6 */ #define SubPixelUnknown 0 #define SubPixelHorizontalRGB 1 #define SubPixelHorizontalBGR 2 #define SubPixelVerticalRGB 3 #define SubPixelVerticalBGR 4 #define SubPixelNone 5 /* Extended repeat attributes included in 0.10 */ #define RepeatNone 0 #define RepeatNormal 1 #define RepeatPad 2 #define RepeatReflect 3 #endif /* _RENDER_H_ */ ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/X11/extensions/xf86vm.h ================================================ /* Copyright 1995 Kaleb S. KEITHLEY Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL Kaleb S. KEITHLEY BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Kaleb S. KEITHLEY shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Kaleb S. KEITHLEY */ /* THIS IS NOT AN X CONSORTIUM STANDARD OR AN X PROJECT TEAM SPECIFICATION */ #ifndef _XF86VM_H_ #define _XF86VM_H_ #include <X11/Xmd.h> #define CLKFLAG_PROGRAMABLE 1 #ifdef XF86VIDMODE_EVENTS #define XF86VidModeNotify 0 #define XF86VidModeNumberEvents (XF86VidModeNotify + 1) #define XF86VidModeNotifyMask 0x00000001 #define XF86VidModeNonEvent 0 #define XF86VidModeModeChange 1 #else #define XF86VidModeNumberEvents 0 #endif #define XF86VidModeBadClock 0 #define XF86VidModeBadHTimings 1 #define XF86VidModeBadVTimings 2 #define XF86VidModeModeUnsuitable 3 #define XF86VidModeExtensionDisabled 4 #define XF86VidModeClientNotLocal 5 #define XF86VidModeZoomLocked 6 #define XF86VidModeNumberErrors (XF86VidModeZoomLocked + 1) #define XF86VM_READ_PERMISSION 1 #define XF86VM_WRITE_PERMISSION 2 #endif ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/X11/extensions/xf86vmode.h ================================================ /* Copyright 1995 Kaleb S. KEITHLEY Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL Kaleb S. KEITHLEY BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Kaleb S. KEITHLEY shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Kaleb S. KEITHLEY */ /* THIS IS NOT AN X CONSORTIUM STANDARD OR AN X PROJECT TEAM SPECIFICATION */ #ifndef _XF86VIDMODE_H_ #define _XF86VIDMODE_H_ #include <X11/Xfuncproto.h> #include <X11/Xmd.h> #include <X11/extensions/xf86vm.h> #define CLKFLAG_PROGRAMABLE 1 #ifdef XF86VIDMODE_EVENTS #define XF86VidModeNotify 0 #define XF86VidModeNumberEvents (XF86VidModeNotify + 1) #define XF86VidModeNotifyMask 0x00000001 #define XF86VidModeNonEvent 0 #define XF86VidModeModeChange 1 #else #define XF86VidModeNumberEvents 0 #endif #define XF86VidModeBadClock 0 #define XF86VidModeBadHTimings 1 #define XF86VidModeBadVTimings 2 #define XF86VidModeModeUnsuitable 3 #define XF86VidModeExtensionDisabled 4 #define XF86VidModeClientNotLocal 5 #define XF86VidModeZoomLocked 6 #define XF86VidModeNumberErrors (XF86VidModeZoomLocked + 1) #define XF86VM_READ_PERMISSION 1 #define XF86VM_WRITE_PERMISSION 2 #ifndef _XF86VIDMODE_SERVER_ typedef struct { unsigned short hdisplay; unsigned short hsyncstart; unsigned short hsyncend; unsigned short htotal; unsigned short hskew; unsigned short vdisplay; unsigned short vsyncstart; unsigned short vsyncend; unsigned short vtotal; unsigned int flags; int privsize; #if defined(__cplusplus) || defined(c_plusplus) /* private is a C++ reserved word */ INT32 *c_private; #else INT32 *private; #endif } XF86VidModeModeLine; typedef struct { unsigned int dotclock; unsigned short hdisplay; unsigned short hsyncstart; unsigned short hsyncend; unsigned short htotal; unsigned short hskew; unsigned short vdisplay; unsigned short vsyncstart; unsigned short vsyncend; unsigned short vtotal; unsigned int flags; int privsize; #if defined(__cplusplus) || defined(c_plusplus) /* private is a C++ reserved word */ INT32 *c_private; #else INT32 *private; #endif } XF86VidModeModeInfo; typedef struct { float hi; float lo; } XF86VidModeSyncRange; typedef struct { char* vendor; char* model; float EMPTY; unsigned char nhsync; XF86VidModeSyncRange* hsync; unsigned char nvsync; XF86VidModeSyncRange* vsync; } XF86VidModeMonitor; typedef struct { int type; /* of event */ unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent req */ Display *display; /* Display the event was read from */ Window root; /* root window of event screen */ int state; /* What happened */ int kind; /* What happened */ Bool forced; /* extents of new region */ Time time; /* event timestamp */ } XF86VidModeNotifyEvent; typedef struct { float red; /* Red Gamma value */ float green; /* Green Gamma value */ float blue; /* Blue Gamma value */ } XF86VidModeGamma; #define XF86VidModeSelectNextMode(disp, scr) \ XF86VidModeSwitchMode(disp, scr, 1) #define XF86VidModeSelectPrevMode(disp, scr) \ XF86VidModeSwitchMode(disp, scr, -1) _XFUNCPROTOBEGIN Bool XF86VidModeQueryVersion( Display* /* dpy */, int* /* majorVersion */, int* /* minorVersion */ ); Bool XF86VidModeQueryExtension( Display* /* dpy */, int* /* event_base */, int* /* error_base */ ); Bool XF86VidModeSetClientVersion( Display* /* dpy */ ); Bool XF86VidModeGetModeLine( Display* /* dpy */, int /* screen */, int* /* dotclock */, XF86VidModeModeLine* /* modeline */ ); Bool XF86VidModeGetAllModeLines( Display* /* dpy */, int /* screen */, int* /* modecount */, XF86VidModeModeInfo*** /* modelinesPtr */ ); Bool XF86VidModeAddModeLine( Display* /* dpy */, int /* screen */, XF86VidModeModeInfo* /* new modeline */, XF86VidModeModeInfo* /* after modeline */ ); Bool XF86VidModeDeleteModeLine( Display* /* dpy */, int /* screen */, XF86VidModeModeInfo* /* modeline */ ); Bool XF86VidModeModModeLine( Display* /* dpy */, int /* screen */, XF86VidModeModeLine* /* modeline */ ); Status XF86VidModeValidateModeLine( Display* /* dpy */, int /* screen */, XF86VidModeModeInfo* /* modeline */ ); Bool XF86VidModeSwitchMode( Display* /* dpy */, int /* screen */, int /* zoom */ ); Bool XF86VidModeSwitchToMode( Display* /* dpy */, int /* screen */, XF86VidModeModeInfo* /* modeline */ ); Bool XF86VidModeLockModeSwitch( Display* /* dpy */, int /* screen */, int /* lock */ ); Bool XF86VidModeGetMonitor( Display* /* dpy */, int /* screen */, XF86VidModeMonitor* /* monitor */ ); Bool XF86VidModeGetViewPort( Display* /* dpy */, int /* screen */, int* /* x return */, int* /* y return */ ); Bool XF86VidModeSetViewPort( Display* /* dpy */, int /* screen */, int /* x */, int /* y */ ); Bool XF86VidModeGetDotClocks( Display* /* dpy */, int /* screen */, int* /* flags return */, int* /* number of clocks return */, int* /* max dot clock return */, int** /* clocks return */ ); Bool XF86VidModeGetGamma( Display* /* dpy */, int /* screen */, XF86VidModeGamma* /* Gamma */ ); Bool XF86VidModeSetGamma( Display* /* dpy */, int /* screen */, XF86VidModeGamma* /* Gamma */ ); Bool XF86VidModeSetGammaRamp( Display* /* dpy */, int /* screen */, int /* size */, unsigned short* /* red array */, unsigned short* /* green array */, unsigned short* /* blue array */ ); Bool XF86VidModeGetGammaRamp( Display* /* dpy */, int /* screen */, int /* size */, unsigned short* /* red array */, unsigned short* /* green array */, unsigned short* /* blue array */ ); Bool XF86VidModeGetGammaRampSize( Display* /* dpy */, int /* screen */, int* /* size */ ); Bool XF86VidModeGetPermissions( Display* /* dpy */, int /* screen */, int* /* permissions */ ); _XFUNCPROTOEND #endif #endif ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/X11/keysym.h ================================================ /*********************************************************** Copyright 1987, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Digital not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ /* default keysyms */ #define XK_MISCELLANY #define XK_XKB_KEYS #define XK_LATIN1 #define XK_LATIN2 #define XK_LATIN3 #define XK_LATIN4 #define XK_LATIN8 #define XK_LATIN9 #define XK_CAUCASUS #define XK_GREEK #define XK_KATAKANA #define XK_ARABIC #define XK_CYRILLIC #define XK_HEBREW #define XK_THAI #define XK_KOREAN #define XK_ARMENIAN #define XK_GEORGIAN #define XK_VIETNAMESE #define XK_CURRENCY #define XK_MATHEMATICAL #define XK_BRAILLE #define XK_SINHALA #include <X11/keysymdef.h> ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/X11/keysymdef.h ================================================ /*********************************************************** Copyright 1987, 1994, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Digital not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ /* * The "X11 Window System Protocol" standard defines in Appendix A the * keysym codes. These 29-bit integer values identify characters or * functions associated with each key (e.g., via the visible * engraving) of a keyboard layout. This file assigns mnemonic macro * names for these keysyms. * * This file is also compiled (by src/util/makekeys.c in libX11) into * hash tables that can be accessed with X11 library functions such as * XStringToKeysym() and XKeysymToString(). * * Where a keysym corresponds one-to-one to an ISO 10646 / Unicode * character, this is noted in a comment that provides both the U+xxxx * Unicode position, as well as the official Unicode name of the * character. * * Where the correspondence is either not one-to-one or semantically * unclear, the Unicode position and name are enclosed in * parentheses. Such legacy keysyms should be considered deprecated * and are not recommended for use in future keyboard mappings. * * For any future extension of the keysyms with characters already * found in ISO 10646 / Unicode, the following algorithm shall be * used. The new keysym code position will simply be the character's * Unicode number plus 0x01000000. The keysym values in the range * 0x01000100 to 0x0110ffff are reserved to represent Unicode * characters in the range U+0100 to U+10FFFF. * * While most newer Unicode-based X11 clients do already accept * Unicode-mapped keysyms in the range 0x01000100 to 0x0110ffff, it * will remain necessary for clients -- in the interest of * compatibility with existing servers -- to also understand the * existing legacy keysym values in the range 0x0100 to 0x20ff. * * Where several mnemonic names are defined for the same keysym in this * file, all but the first one listed should be considered deprecated. * * Mnemonic names for keysyms are defined in this file with lines * that match one of these Perl regular expressions: * * /^\#define XK_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\* U+([0-9A-F]{4,6}) (.*) \*\/\s*$/ * /^\#define XK_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\*\(U+([0-9A-F]{4,6}) (.*)\)\*\/\s*$/ * /^\#define XK_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*(\/\*\s*(.*)\s*\*\/)?\s*$/ * * Before adding new keysyms, please do consider the following: In * addition to the keysym names defined in this file, the * XStringToKeysym() and XKeysymToString() functions will also handle * any keysym string of the form "U0020" to "U007E" and "U00A0" to * "U10FFFF" for all possible Unicode characters. In other words, * every possible Unicode character has already a keysym string * defined algorithmically, even if it is not listed here. Therefore, * defining an additional keysym macro is only necessary where a * non-hexadecimal mnemonic name is needed, or where the new keysym * does not represent any existing Unicode character. * * When adding new keysyms to this file, do not forget to also update the * following: * * - the mappings in src/KeyBind.c in the repo * git://anongit.freedesktop.org/xorg/lib/libX11 * * - the protocol specification in specs/XProtocol/X11.keysyms * in the repo git://anongit.freedesktop.org/xorg/doc/xorg-docs * */ #define XK_VoidSymbol 0xffffff /* Void symbol */ #ifdef XK_MISCELLANY /* * TTY function keys, cleverly chosen to map to ASCII, for convenience of * programming, but could have been arbitrary (at the cost of lookup * tables in client code). */ #define XK_BackSpace 0xff08 /* Back space, back char */ #define XK_Tab 0xff09 #define XK_Linefeed 0xff0a /* Linefeed, LF */ #define XK_Clear 0xff0b #define XK_Return 0xff0d /* Return, enter */ #define XK_Pause 0xff13 /* Pause, hold */ #define XK_Scroll_Lock 0xff14 #define XK_Sys_Req 0xff15 #define XK_Escape 0xff1b #define XK_Delete 0xffff /* Delete, rubout */ /* International & multi-key character composition */ #define XK_Multi_key 0xff20 /* Multi-key character compose */ #define XK_Codeinput 0xff37 #define XK_SingleCandidate 0xff3c #define XK_MultipleCandidate 0xff3d #define XK_PreviousCandidate 0xff3e /* Japanese keyboard support */ #define XK_Kanji 0xff21 /* Kanji, Kanji convert */ #define XK_Muhenkan 0xff22 /* Cancel Conversion */ #define XK_Henkan_Mode 0xff23 /* Start/Stop Conversion */ #define XK_Henkan 0xff23 /* Alias for Henkan_Mode */ #define XK_Romaji 0xff24 /* to Romaji */ #define XK_Hiragana 0xff25 /* to Hiragana */ #define XK_Katakana 0xff26 /* to Katakana */ #define XK_Hiragana_Katakana 0xff27 /* Hiragana/Katakana toggle */ #define XK_Zenkaku 0xff28 /* to Zenkaku */ #define XK_Hankaku 0xff29 /* to Hankaku */ #define XK_Zenkaku_Hankaku 0xff2a /* Zenkaku/Hankaku toggle */ #define XK_Touroku 0xff2b /* Add to Dictionary */ #define XK_Massyo 0xff2c /* Delete from Dictionary */ #define XK_Kana_Lock 0xff2d /* Kana Lock */ #define XK_Kana_Shift 0xff2e /* Kana Shift */ #define XK_Eisu_Shift 0xff2f /* Alphanumeric Shift */ #define XK_Eisu_toggle 0xff30 /* Alphanumeric toggle */ #define XK_Kanji_Bangou 0xff37 /* Codeinput */ #define XK_Zen_Koho 0xff3d /* Multiple/All Candidate(s) */ #define XK_Mae_Koho 0xff3e /* Previous Candidate */ /* 0xff31 thru 0xff3f are under XK_KOREAN */ /* Cursor control & motion */ #define XK_Home 0xff50 #define XK_Left 0xff51 /* Move left, left arrow */ #define XK_Up 0xff52 /* Move up, up arrow */ #define XK_Right 0xff53 /* Move right, right arrow */ #define XK_Down 0xff54 /* Move down, down arrow */ #define XK_Prior 0xff55 /* Prior, previous */ #define XK_Page_Up 0xff55 #define XK_Next 0xff56 /* Next */ #define XK_Page_Down 0xff56 #define XK_End 0xff57 /* EOL */ #define XK_Begin 0xff58 /* BOL */ /* Misc functions */ #define XK_Select 0xff60 /* Select, mark */ #define XK_Print 0xff61 #define XK_Execute 0xff62 /* Execute, run, do */ #define XK_Insert 0xff63 /* Insert, insert here */ #define XK_Undo 0xff65 #define XK_Redo 0xff66 /* Redo, again */ #define XK_Menu 0xff67 #define XK_Find 0xff68 /* Find, search */ #define XK_Cancel 0xff69 /* Cancel, stop, abort, exit */ #define XK_Help 0xff6a /* Help */ #define XK_Break 0xff6b #define XK_Mode_switch 0xff7e /* Character set switch */ #define XK_script_switch 0xff7e /* Alias for mode_switch */ #define XK_Num_Lock 0xff7f /* Keypad functions, keypad numbers cleverly chosen to map to ASCII */ #define XK_KP_Space 0xff80 /* Space */ #define XK_KP_Tab 0xff89 #define XK_KP_Enter 0xff8d /* Enter */ #define XK_KP_F1 0xff91 /* PF1, KP_A, ... */ #define XK_KP_F2 0xff92 #define XK_KP_F3 0xff93 #define XK_KP_F4 0xff94 #define XK_KP_Home 0xff95 #define XK_KP_Left 0xff96 #define XK_KP_Up 0xff97 #define XK_KP_Right 0xff98 #define XK_KP_Down 0xff99 #define XK_KP_Prior 0xff9a #define XK_KP_Page_Up 0xff9a #define XK_KP_Next 0xff9b #define XK_KP_Page_Down 0xff9b #define XK_KP_End 0xff9c #define XK_KP_Begin 0xff9d #define XK_KP_Insert 0xff9e #define XK_KP_Delete 0xff9f #define XK_KP_Equal 0xffbd /* Equals */ #define XK_KP_Multiply 0xffaa #define XK_KP_Add 0xffab #define XK_KP_Separator 0xffac /* Separator, often comma */ #define XK_KP_Subtract 0xffad #define XK_KP_Decimal 0xffae #define XK_KP_Divide 0xffaf #define XK_KP_0 0xffb0 #define XK_KP_1 0xffb1 #define XK_KP_2 0xffb2 #define XK_KP_3 0xffb3 #define XK_KP_4 0xffb4 #define XK_KP_5 0xffb5 #define XK_KP_6 0xffb6 #define XK_KP_7 0xffb7 #define XK_KP_8 0xffb8 #define XK_KP_9 0xffb9 /* * Auxiliary functions; note the duplicate definitions for left and right * function keys; Sun keyboards and a few other manufacturers have such * function key groups on the left and/or right sides of the keyboard. * We've not found a keyboard with more than 35 function keys total. */ #define XK_F1 0xffbe #define XK_F2 0xffbf #define XK_F3 0xffc0 #define XK_F4 0xffc1 #define XK_F5 0xffc2 #define XK_F6 0xffc3 #define XK_F7 0xffc4 #define XK_F8 0xffc5 #define XK_F9 0xffc6 #define XK_F10 0xffc7 #define XK_F11 0xffc8 #define XK_L1 0xffc8 #define XK_F12 0xffc9 #define XK_L2 0xffc9 #define XK_F13 0xffca #define XK_L3 0xffca #define XK_F14 0xffcb #define XK_L4 0xffcb #define XK_F15 0xffcc #define XK_L5 0xffcc #define XK_F16 0xffcd #define XK_L6 0xffcd #define XK_F17 0xffce #define XK_L7 0xffce #define XK_F18 0xffcf #define XK_L8 0xffcf #define XK_F19 0xffd0 #define XK_L9 0xffd0 #define XK_F20 0xffd1 #define XK_L10 0xffd1 #define XK_F21 0xffd2 #define XK_R1 0xffd2 #define XK_F22 0xffd3 #define XK_R2 0xffd3 #define XK_F23 0xffd4 #define XK_R3 0xffd4 #define XK_F24 0xffd5 #define XK_R4 0xffd5 #define XK_F25 0xffd6 #define XK_R5 0xffd6 #define XK_F26 0xffd7 #define XK_R6 0xffd7 #define XK_F27 0xffd8 #define XK_R7 0xffd8 #define XK_F28 0xffd9 #define XK_R8 0xffd9 #define XK_F29 0xffda #define XK_R9 0xffda #define XK_F30 0xffdb #define XK_R10 0xffdb #define XK_F31 0xffdc #define XK_R11 0xffdc #define XK_F32 0xffdd #define XK_R12 0xffdd #define XK_F33 0xffde #define XK_R13 0xffde #define XK_F34 0xffdf #define XK_R14 0xffdf #define XK_F35 0xffe0 #define XK_R15 0xffe0 /* Modifiers */ #define XK_Shift_L 0xffe1 /* Left shift */ #define XK_Shift_R 0xffe2 /* Right shift */ #define XK_Control_L 0xffe3 /* Left control */ #define XK_Control_R 0xffe4 /* Right control */ #define XK_Caps_Lock 0xffe5 /* Caps lock */ #define XK_Shift_Lock 0xffe6 /* Shift lock */ #define XK_Meta_L 0xffe7 /* Left meta */ #define XK_Meta_R 0xffe8 /* Right meta */ #define XK_Alt_L 0xffe9 /* Left alt */ #define XK_Alt_R 0xffea /* Right alt */ #define XK_Super_L 0xffeb /* Left super */ #define XK_Super_R 0xffec /* Right super */ #define XK_Hyper_L 0xffed /* Left hyper */ #define XK_Hyper_R 0xffee /* Right hyper */ #endif /* XK_MISCELLANY */ /* * Keyboard (XKB) Extension function and modifier keys * (from Appendix C of "The X Keyboard Extension: Protocol Specification") * Byte 3 = 0xfe */ #ifdef XK_XKB_KEYS #define XK_ISO_Lock 0xfe01 #define XK_ISO_Level2_Latch 0xfe02 #define XK_ISO_Level3_Shift 0xfe03 #define XK_ISO_Level3_Latch 0xfe04 #define XK_ISO_Level3_Lock 0xfe05 #define XK_ISO_Level5_Shift 0xfe11 #define XK_ISO_Level5_Latch 0xfe12 #define XK_ISO_Level5_Lock 0xfe13 #define XK_ISO_Group_Shift 0xff7e /* Alias for mode_switch */ #define XK_ISO_Group_Latch 0xfe06 #define XK_ISO_Group_Lock 0xfe07 #define XK_ISO_Next_Group 0xfe08 #define XK_ISO_Next_Group_Lock 0xfe09 #define XK_ISO_Prev_Group 0xfe0a #define XK_ISO_Prev_Group_Lock 0xfe0b #define XK_ISO_First_Group 0xfe0c #define XK_ISO_First_Group_Lock 0xfe0d #define XK_ISO_Last_Group 0xfe0e #define XK_ISO_Last_Group_Lock 0xfe0f #define XK_ISO_Left_Tab 0xfe20 #define XK_ISO_Move_Line_Up 0xfe21 #define XK_ISO_Move_Line_Down 0xfe22 #define XK_ISO_Partial_Line_Up 0xfe23 #define XK_ISO_Partial_Line_Down 0xfe24 #define XK_ISO_Partial_Space_Left 0xfe25 #define XK_ISO_Partial_Space_Right 0xfe26 #define XK_ISO_Set_Margin_Left 0xfe27 #define XK_ISO_Set_Margin_Right 0xfe28 #define XK_ISO_Release_Margin_Left 0xfe29 #define XK_ISO_Release_Margin_Right 0xfe2a #define XK_ISO_Release_Both_Margins 0xfe2b #define XK_ISO_Fast_Cursor_Left 0xfe2c #define XK_ISO_Fast_Cursor_Right 0xfe2d #define XK_ISO_Fast_Cursor_Up 0xfe2e #define XK_ISO_Fast_Cursor_Down 0xfe2f #define XK_ISO_Continuous_Underline 0xfe30 #define XK_ISO_Discontinuous_Underline 0xfe31 #define XK_ISO_Emphasize 0xfe32 #define XK_ISO_Center_Object 0xfe33 #define XK_ISO_Enter 0xfe34 #define XK_dead_grave 0xfe50 #define XK_dead_acute 0xfe51 #define XK_dead_circumflex 0xfe52 #define XK_dead_tilde 0xfe53 #define XK_dead_perispomeni 0xfe53 /* alias for dead_tilde */ #define XK_dead_macron 0xfe54 #define XK_dead_breve 0xfe55 #define XK_dead_abovedot 0xfe56 #define XK_dead_diaeresis 0xfe57 #define XK_dead_abovering 0xfe58 #define XK_dead_doubleacute 0xfe59 #define XK_dead_caron 0xfe5a #define XK_dead_cedilla 0xfe5b #define XK_dead_ogonek 0xfe5c #define XK_dead_iota 0xfe5d #define XK_dead_voiced_sound 0xfe5e #define XK_dead_semivoiced_sound 0xfe5f #define XK_dead_belowdot 0xfe60 #define XK_dead_hook 0xfe61 #define XK_dead_horn 0xfe62 #define XK_dead_stroke 0xfe63 #define XK_dead_abovecomma 0xfe64 #define XK_dead_psili 0xfe64 /* alias for dead_abovecomma */ #define XK_dead_abovereversedcomma 0xfe65 #define XK_dead_dasia 0xfe65 /* alias for dead_abovereversedcomma */ #define XK_dead_doublegrave 0xfe66 #define XK_dead_belowring 0xfe67 #define XK_dead_belowmacron 0xfe68 #define XK_dead_belowcircumflex 0xfe69 #define XK_dead_belowtilde 0xfe6a #define XK_dead_belowbreve 0xfe6b #define XK_dead_belowdiaeresis 0xfe6c #define XK_dead_invertedbreve 0xfe6d #define XK_dead_belowcomma 0xfe6e #define XK_dead_currency 0xfe6f /* dead vowels for universal syllable entry */ #define XK_dead_a 0xfe80 #define XK_dead_A 0xfe81 #define XK_dead_e 0xfe82 #define XK_dead_E 0xfe83 #define XK_dead_i 0xfe84 #define XK_dead_I 0xfe85 #define XK_dead_o 0xfe86 #define XK_dead_O 0xfe87 #define XK_dead_u 0xfe88 #define XK_dead_U 0xfe89 #define XK_dead_small_schwa 0xfe8a #define XK_dead_capital_schwa 0xfe8b #define XK_First_Virtual_Screen 0xfed0 #define XK_Prev_Virtual_Screen 0xfed1 #define XK_Next_Virtual_Screen 0xfed2 #define XK_Last_Virtual_Screen 0xfed4 #define XK_Terminate_Server 0xfed5 #define XK_AccessX_Enable 0xfe70 #define XK_AccessX_Feedback_Enable 0xfe71 #define XK_RepeatKeys_Enable 0xfe72 #define XK_SlowKeys_Enable 0xfe73 #define XK_BounceKeys_Enable 0xfe74 #define XK_StickyKeys_Enable 0xfe75 #define XK_MouseKeys_Enable 0xfe76 #define XK_MouseKeys_Accel_Enable 0xfe77 #define XK_Overlay1_Enable 0xfe78 #define XK_Overlay2_Enable 0xfe79 #define XK_AudibleBell_Enable 0xfe7a #define XK_Pointer_Left 0xfee0 #define XK_Pointer_Right 0xfee1 #define XK_Pointer_Up 0xfee2 #define XK_Pointer_Down 0xfee3 #define XK_Pointer_UpLeft 0xfee4 #define XK_Pointer_UpRight 0xfee5 #define XK_Pointer_DownLeft 0xfee6 #define XK_Pointer_DownRight 0xfee7 #define XK_Pointer_Button_Dflt 0xfee8 #define XK_Pointer_Button1 0xfee9 #define XK_Pointer_Button2 0xfeea #define XK_Pointer_Button3 0xfeeb #define XK_Pointer_Button4 0xfeec #define XK_Pointer_Button5 0xfeed #define XK_Pointer_DblClick_Dflt 0xfeee #define XK_Pointer_DblClick1 0xfeef #define XK_Pointer_DblClick2 0xfef0 #define XK_Pointer_DblClick3 0xfef1 #define XK_Pointer_DblClick4 0xfef2 #define XK_Pointer_DblClick5 0xfef3 #define XK_Pointer_Drag_Dflt 0xfef4 #define XK_Pointer_Drag1 0xfef5 #define XK_Pointer_Drag2 0xfef6 #define XK_Pointer_Drag3 0xfef7 #define XK_Pointer_Drag4 0xfef8 #define XK_Pointer_Drag5 0xfefd #define XK_Pointer_EnableKeys 0xfef9 #define XK_Pointer_Accelerate 0xfefa #define XK_Pointer_DfltBtnNext 0xfefb #define XK_Pointer_DfltBtnPrev 0xfefc #endif /* XK_XKB_KEYS */ /* * 3270 Terminal Keys * Byte 3 = 0xfd */ #ifdef XK_3270 #define XK_3270_Duplicate 0xfd01 #define XK_3270_FieldMark 0xfd02 #define XK_3270_Right2 0xfd03 #define XK_3270_Left2 0xfd04 #define XK_3270_BackTab 0xfd05 #define XK_3270_EraseEOF 0xfd06 #define XK_3270_EraseInput 0xfd07 #define XK_3270_Reset 0xfd08 #define XK_3270_Quit 0xfd09 #define XK_3270_PA1 0xfd0a #define XK_3270_PA2 0xfd0b #define XK_3270_PA3 0xfd0c #define XK_3270_Test 0xfd0d #define XK_3270_Attn 0xfd0e #define XK_3270_CursorBlink 0xfd0f #define XK_3270_AltCursor 0xfd10 #define XK_3270_KeyClick 0xfd11 #define XK_3270_Jump 0xfd12 #define XK_3270_Ident 0xfd13 #define XK_3270_Rule 0xfd14 #define XK_3270_Copy 0xfd15 #define XK_3270_Play 0xfd16 #define XK_3270_Setup 0xfd17 #define XK_3270_Record 0xfd18 #define XK_3270_ChangeScreen 0xfd19 #define XK_3270_DeleteWord 0xfd1a #define XK_3270_ExSelect 0xfd1b #define XK_3270_CursorSelect 0xfd1c #define XK_3270_PrintScreen 0xfd1d #define XK_3270_Enter 0xfd1e #endif /* XK_3270 */ /* * Latin 1 * (ISO/IEC 8859-1 = Unicode U+0020..U+00FF) * Byte 3 = 0 */ #ifdef XK_LATIN1 #define XK_space 0x0020 /* U+0020 SPACE */ #define XK_exclam 0x0021 /* U+0021 EXCLAMATION MARK */ #define XK_quotedbl 0x0022 /* U+0022 QUOTATION MARK */ #define XK_numbersign 0x0023 /* U+0023 NUMBER SIGN */ #define XK_dollar 0x0024 /* U+0024 DOLLAR SIGN */ #define XK_percent 0x0025 /* U+0025 PERCENT SIGN */ #define XK_ampersand 0x0026 /* U+0026 AMPERSAND */ #define XK_apostrophe 0x0027 /* U+0027 APOSTROPHE */ #define XK_quoteright 0x0027 /* deprecated */ #define XK_parenleft 0x0028 /* U+0028 LEFT PARENTHESIS */ #define XK_parenright 0x0029 /* U+0029 RIGHT PARENTHESIS */ #define XK_asterisk 0x002a /* U+002A ASTERISK */ #define XK_plus 0x002b /* U+002B PLUS SIGN */ #define XK_comma 0x002c /* U+002C COMMA */ #define XK_minus 0x002d /* U+002D HYPHEN-MINUS */ #define XK_period 0x002e /* U+002E FULL STOP */ #define XK_slash 0x002f /* U+002F SOLIDUS */ #define XK_0 0x0030 /* U+0030 DIGIT ZERO */ #define XK_1 0x0031 /* U+0031 DIGIT ONE */ #define XK_2 0x0032 /* U+0032 DIGIT TWO */ #define XK_3 0x0033 /* U+0033 DIGIT THREE */ #define XK_4 0x0034 /* U+0034 DIGIT FOUR */ #define XK_5 0x0035 /* U+0035 DIGIT FIVE */ #define XK_6 0x0036 /* U+0036 DIGIT SIX */ #define XK_7 0x0037 /* U+0037 DIGIT SEVEN */ #define XK_8 0x0038 /* U+0038 DIGIT EIGHT */ #define XK_9 0x0039 /* U+0039 DIGIT NINE */ #define XK_colon 0x003a /* U+003A COLON */ #define XK_semicolon 0x003b /* U+003B SEMICOLON */ #define XK_less 0x003c /* U+003C LESS-THAN SIGN */ #define XK_equal 0x003d /* U+003D EQUALS SIGN */ #define XK_greater 0x003e /* U+003E GREATER-THAN SIGN */ #define XK_question 0x003f /* U+003F QUESTION MARK */ #define XK_at 0x0040 /* U+0040 COMMERCIAL AT */ #define XK_A 0x0041 /* U+0041 LATIN CAPITAL LETTER A */ #define XK_B 0x0042 /* U+0042 LATIN CAPITAL LETTER B */ #define XK_C 0x0043 /* U+0043 LATIN CAPITAL LETTER C */ #define XK_D 0x0044 /* U+0044 LATIN CAPITAL LETTER D */ #define XK_E 0x0045 /* U+0045 LATIN CAPITAL LETTER E */ #define XK_F 0x0046 /* U+0046 LATIN CAPITAL LETTER F */ #define XK_G 0x0047 /* U+0047 LATIN CAPITAL LETTER G */ #define XK_H 0x0048 /* U+0048 LATIN CAPITAL LETTER H */ #define XK_I 0x0049 /* U+0049 LATIN CAPITAL LETTER I */ #define XK_J 0x004a /* U+004A LATIN CAPITAL LETTER J */ #define XK_K 0x004b /* U+004B LATIN CAPITAL LETTER K */ #define XK_L 0x004c /* U+004C LATIN CAPITAL LETTER L */ #define XK_M 0x004d /* U+004D LATIN CAPITAL LETTER M */ #define XK_N 0x004e /* U+004E LATIN CAPITAL LETTER N */ #define XK_O 0x004f /* U+004F LATIN CAPITAL LETTER O */ #define XK_P 0x0050 /* U+0050 LATIN CAPITAL LETTER P */ #define XK_Q 0x0051 /* U+0051 LATIN CAPITAL LETTER Q */ #define XK_R 0x0052 /* U+0052 LATIN CAPITAL LETTER R */ #define XK_S 0x0053 /* U+0053 LATIN CAPITAL LETTER S */ #define XK_T 0x0054 /* U+0054 LATIN CAPITAL LETTER T */ #define XK_U 0x0055 /* U+0055 LATIN CAPITAL LETTER U */ #define XK_V 0x0056 /* U+0056 LATIN CAPITAL LETTER V */ #define XK_W 0x0057 /* U+0057 LATIN CAPITAL LETTER W */ #define XK_X 0x0058 /* U+0058 LATIN CAPITAL LETTER X */ #define XK_Y 0x0059 /* U+0059 LATIN CAPITAL LETTER Y */ #define XK_Z 0x005a /* U+005A LATIN CAPITAL LETTER Z */ #define XK_bracketleft 0x005b /* U+005B LEFT SQUARE BRACKET */ #define XK_backslash 0x005c /* U+005C REVERSE SOLIDUS */ #define XK_bracketright 0x005d /* U+005D RIGHT SQUARE BRACKET */ #define XK_asciicircum 0x005e /* U+005E CIRCUMFLEX ACCENT */ #define XK_underscore 0x005f /* U+005F LOW LINE */ #define XK_grave 0x0060 /* U+0060 GRAVE ACCENT */ #define XK_quoteleft 0x0060 /* deprecated */ #define XK_a 0x0061 /* U+0061 LATIN SMALL LETTER A */ #define XK_b 0x0062 /* U+0062 LATIN SMALL LETTER B */ #define XK_c 0x0063 /* U+0063 LATIN SMALL LETTER C */ #define XK_d 0x0064 /* U+0064 LATIN SMALL LETTER D */ #define XK_e 0x0065 /* U+0065 LATIN SMALL LETTER E */ #define XK_f 0x0066 /* U+0066 LATIN SMALL LETTER F */ #define XK_g 0x0067 /* U+0067 LATIN SMALL LETTER G */ #define XK_h 0x0068 /* U+0068 LATIN SMALL LETTER H */ #define XK_i 0x0069 /* U+0069 LATIN SMALL LETTER I */ #define XK_j 0x006a /* U+006A LATIN SMALL LETTER J */ #define XK_k 0x006b /* U+006B LATIN SMALL LETTER K */ #define XK_l 0x006c /* U+006C LATIN SMALL LETTER L */ #define XK_m 0x006d /* U+006D LATIN SMALL LETTER M */ #define XK_n 0x006e /* U+006E LATIN SMALL LETTER N */ #define XK_o 0x006f /* U+006F LATIN SMALL LETTER O */ #define XK_p 0x0070 /* U+0070 LATIN SMALL LETTER P */ #define XK_q 0x0071 /* U+0071 LATIN SMALL LETTER Q */ #define XK_r 0x0072 /* U+0072 LATIN SMALL LETTER R */ #define XK_s 0x0073 /* U+0073 LATIN SMALL LETTER S */ #define XK_t 0x0074 /* U+0074 LATIN SMALL LETTER T */ #define XK_u 0x0075 /* U+0075 LATIN SMALL LETTER U */ #define XK_v 0x0076 /* U+0076 LATIN SMALL LETTER V */ #define XK_w 0x0077 /* U+0077 LATIN SMALL LETTER W */ #define XK_x 0x0078 /* U+0078 LATIN SMALL LETTER X */ #define XK_y 0x0079 /* U+0079 LATIN SMALL LETTER Y */ #define XK_z 0x007a /* U+007A LATIN SMALL LETTER Z */ #define XK_braceleft 0x007b /* U+007B LEFT CURLY BRACKET */ #define XK_bar 0x007c /* U+007C VERTICAL LINE */ #define XK_braceright 0x007d /* U+007D RIGHT CURLY BRACKET */ #define XK_asciitilde 0x007e /* U+007E TILDE */ #define XK_nobreakspace 0x00a0 /* U+00A0 NO-BREAK SPACE */ #define XK_exclamdown 0x00a1 /* U+00A1 INVERTED EXCLAMATION MARK */ #define XK_cent 0x00a2 /* U+00A2 CENT SIGN */ #define XK_sterling 0x00a3 /* U+00A3 POUND SIGN */ #define XK_currency 0x00a4 /* U+00A4 CURRENCY SIGN */ #define XK_yen 0x00a5 /* U+00A5 YEN SIGN */ #define XK_brokenbar 0x00a6 /* U+00A6 BROKEN BAR */ #define XK_section 0x00a7 /* U+00A7 SECTION SIGN */ #define XK_diaeresis 0x00a8 /* U+00A8 DIAERESIS */ #define XK_copyright 0x00a9 /* U+00A9 COPYRIGHT SIGN */ #define XK_ordfeminine 0x00aa /* U+00AA FEMININE ORDINAL INDICATOR */ #define XK_guillemotleft 0x00ab /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ #define XK_notsign 0x00ac /* U+00AC NOT SIGN */ #define XK_hyphen 0x00ad /* U+00AD SOFT HYPHEN */ #define XK_registered 0x00ae /* U+00AE REGISTERED SIGN */ #define XK_macron 0x00af /* U+00AF MACRON */ #define XK_degree 0x00b0 /* U+00B0 DEGREE SIGN */ #define XK_plusminus 0x00b1 /* U+00B1 PLUS-MINUS SIGN */ #define XK_twosuperior 0x00b2 /* U+00B2 SUPERSCRIPT TWO */ #define XK_threesuperior 0x00b3 /* U+00B3 SUPERSCRIPT THREE */ #define XK_acute 0x00b4 /* U+00B4 ACUTE ACCENT */ #define XK_mu 0x00b5 /* U+00B5 MICRO SIGN */ #define XK_paragraph 0x00b6 /* U+00B6 PILCROW SIGN */ #define XK_periodcentered 0x00b7 /* U+00B7 MIDDLE DOT */ #define XK_cedilla 0x00b8 /* U+00B8 CEDILLA */ #define XK_onesuperior 0x00b9 /* U+00B9 SUPERSCRIPT ONE */ #define XK_masculine 0x00ba /* U+00BA MASCULINE ORDINAL INDICATOR */ #define XK_guillemotright 0x00bb /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ #define XK_onequarter 0x00bc /* U+00BC VULGAR FRACTION ONE QUARTER */ #define XK_onehalf 0x00bd /* U+00BD VULGAR FRACTION ONE HALF */ #define XK_threequarters 0x00be /* U+00BE VULGAR FRACTION THREE QUARTERS */ #define XK_questiondown 0x00bf /* U+00BF INVERTED QUESTION MARK */ #define XK_Agrave 0x00c0 /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */ #define XK_Aacute 0x00c1 /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */ #define XK_Acircumflex 0x00c2 /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ #define XK_Atilde 0x00c3 /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */ #define XK_Adiaeresis 0x00c4 /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */ #define XK_Aring 0x00c5 /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */ #define XK_AE 0x00c6 /* U+00C6 LATIN CAPITAL LETTER AE */ #define XK_Ccedilla 0x00c7 /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */ #define XK_Egrave 0x00c8 /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */ #define XK_Eacute 0x00c9 /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */ #define XK_Ecircumflex 0x00ca /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ #define XK_Ediaeresis 0x00cb /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */ #define XK_Igrave 0x00cc /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */ #define XK_Iacute 0x00cd /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */ #define XK_Icircumflex 0x00ce /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ #define XK_Idiaeresis 0x00cf /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */ #define XK_ETH 0x00d0 /* U+00D0 LATIN CAPITAL LETTER ETH */ #define XK_Eth 0x00d0 /* deprecated */ #define XK_Ntilde 0x00d1 /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */ #define XK_Ograve 0x00d2 /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */ #define XK_Oacute 0x00d3 /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */ #define XK_Ocircumflex 0x00d4 /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ #define XK_Otilde 0x00d5 /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */ #define XK_Odiaeresis 0x00d6 /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */ #define XK_multiply 0x00d7 /* U+00D7 MULTIPLICATION SIGN */ #define XK_Oslash 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ #define XK_Ooblique 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ #define XK_Ugrave 0x00d9 /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */ #define XK_Uacute 0x00da /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */ #define XK_Ucircumflex 0x00db /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ #define XK_Udiaeresis 0x00dc /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */ #define XK_Yacute 0x00dd /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */ #define XK_THORN 0x00de /* U+00DE LATIN CAPITAL LETTER THORN */ #define XK_Thorn 0x00de /* deprecated */ #define XK_ssharp 0x00df /* U+00DF LATIN SMALL LETTER SHARP S */ #define XK_agrave 0x00e0 /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */ #define XK_aacute 0x00e1 /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */ #define XK_acircumflex 0x00e2 /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */ #define XK_atilde 0x00e3 /* U+00E3 LATIN SMALL LETTER A WITH TILDE */ #define XK_adiaeresis 0x00e4 /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */ #define XK_aring 0x00e5 /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */ #define XK_ae 0x00e6 /* U+00E6 LATIN SMALL LETTER AE */ #define XK_ccedilla 0x00e7 /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */ #define XK_egrave 0x00e8 /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */ #define XK_eacute 0x00e9 /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */ #define XK_ecircumflex 0x00ea /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */ #define XK_ediaeresis 0x00eb /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */ #define XK_igrave 0x00ec /* U+00EC LATIN SMALL LETTER I WITH GRAVE */ #define XK_iacute 0x00ed /* U+00ED LATIN SMALL LETTER I WITH ACUTE */ #define XK_icircumflex 0x00ee /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */ #define XK_idiaeresis 0x00ef /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */ #define XK_eth 0x00f0 /* U+00F0 LATIN SMALL LETTER ETH */ #define XK_ntilde 0x00f1 /* U+00F1 LATIN SMALL LETTER N WITH TILDE */ #define XK_ograve 0x00f2 /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */ #define XK_oacute 0x00f3 /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */ #define XK_ocircumflex 0x00f4 /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */ #define XK_otilde 0x00f5 /* U+00F5 LATIN SMALL LETTER O WITH TILDE */ #define XK_odiaeresis 0x00f6 /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */ #define XK_division 0x00f7 /* U+00F7 DIVISION SIGN */ #define XK_oslash 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ #define XK_ooblique 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ #define XK_ugrave 0x00f9 /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */ #define XK_uacute 0x00fa /* U+00FA LATIN SMALL LETTER U WITH ACUTE */ #define XK_ucircumflex 0x00fb /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */ #define XK_udiaeresis 0x00fc /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */ #define XK_yacute 0x00fd /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */ #define XK_thorn 0x00fe /* U+00FE LATIN SMALL LETTER THORN */ #define XK_ydiaeresis 0x00ff /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */ #endif /* XK_LATIN1 */ /* * Latin 2 * Byte 3 = 1 */ #ifdef XK_LATIN2 #define XK_Aogonek 0x01a1 /* U+0104 LATIN CAPITAL LETTER A WITH OGONEK */ #define XK_breve 0x01a2 /* U+02D8 BREVE */ #define XK_Lstroke 0x01a3 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */ #define XK_Lcaron 0x01a5 /* U+013D LATIN CAPITAL LETTER L WITH CARON */ #define XK_Sacute 0x01a6 /* U+015A LATIN CAPITAL LETTER S WITH ACUTE */ #define XK_Scaron 0x01a9 /* U+0160 LATIN CAPITAL LETTER S WITH CARON */ #define XK_Scedilla 0x01aa /* U+015E LATIN CAPITAL LETTER S WITH CEDILLA */ #define XK_Tcaron 0x01ab /* U+0164 LATIN CAPITAL LETTER T WITH CARON */ #define XK_Zacute 0x01ac /* U+0179 LATIN CAPITAL LETTER Z WITH ACUTE */ #define XK_Zcaron 0x01ae /* U+017D LATIN CAPITAL LETTER Z WITH CARON */ #define XK_Zabovedot 0x01af /* U+017B LATIN CAPITAL LETTER Z WITH DOT ABOVE */ #define XK_aogonek 0x01b1 /* U+0105 LATIN SMALL LETTER A WITH OGONEK */ #define XK_ogonek 0x01b2 /* U+02DB OGONEK */ #define XK_lstroke 0x01b3 /* U+0142 LATIN SMALL LETTER L WITH STROKE */ #define XK_lcaron 0x01b5 /* U+013E LATIN SMALL LETTER L WITH CARON */ #define XK_sacute 0x01b6 /* U+015B LATIN SMALL LETTER S WITH ACUTE */ #define XK_caron 0x01b7 /* U+02C7 CARON */ #define XK_scaron 0x01b9 /* U+0161 LATIN SMALL LETTER S WITH CARON */ #define XK_scedilla 0x01ba /* U+015F LATIN SMALL LETTER S WITH CEDILLA */ #define XK_tcaron 0x01bb /* U+0165 LATIN SMALL LETTER T WITH CARON */ #define XK_zacute 0x01bc /* U+017A LATIN SMALL LETTER Z WITH ACUTE */ #define XK_doubleacute 0x01bd /* U+02DD DOUBLE ACUTE ACCENT */ #define XK_zcaron 0x01be /* U+017E LATIN SMALL LETTER Z WITH CARON */ #define XK_zabovedot 0x01bf /* U+017C LATIN SMALL LETTER Z WITH DOT ABOVE */ #define XK_Racute 0x01c0 /* U+0154 LATIN CAPITAL LETTER R WITH ACUTE */ #define XK_Abreve 0x01c3 /* U+0102 LATIN CAPITAL LETTER A WITH BREVE */ #define XK_Lacute 0x01c5 /* U+0139 LATIN CAPITAL LETTER L WITH ACUTE */ #define XK_Cacute 0x01c6 /* U+0106 LATIN CAPITAL LETTER C WITH ACUTE */ #define XK_Ccaron 0x01c8 /* U+010C LATIN CAPITAL LETTER C WITH CARON */ #define XK_Eogonek 0x01ca /* U+0118 LATIN CAPITAL LETTER E WITH OGONEK */ #define XK_Ecaron 0x01cc /* U+011A LATIN CAPITAL LETTER E WITH CARON */ #define XK_Dcaron 0x01cf /* U+010E LATIN CAPITAL LETTER D WITH CARON */ #define XK_Dstroke 0x01d0 /* U+0110 LATIN CAPITAL LETTER D WITH STROKE */ #define XK_Nacute 0x01d1 /* U+0143 LATIN CAPITAL LETTER N WITH ACUTE */ #define XK_Ncaron 0x01d2 /* U+0147 LATIN CAPITAL LETTER N WITH CARON */ #define XK_Odoubleacute 0x01d5 /* U+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ #define XK_Rcaron 0x01d8 /* U+0158 LATIN CAPITAL LETTER R WITH CARON */ #define XK_Uring 0x01d9 /* U+016E LATIN CAPITAL LETTER U WITH RING ABOVE */ #define XK_Udoubleacute 0x01db /* U+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ #define XK_Tcedilla 0x01de /* U+0162 LATIN CAPITAL LETTER T WITH CEDILLA */ #define XK_racute 0x01e0 /* U+0155 LATIN SMALL LETTER R WITH ACUTE */ #define XK_abreve 0x01e3 /* U+0103 LATIN SMALL LETTER A WITH BREVE */ #define XK_lacute 0x01e5 /* U+013A LATIN SMALL LETTER L WITH ACUTE */ #define XK_cacute 0x01e6 /* U+0107 LATIN SMALL LETTER C WITH ACUTE */ #define XK_ccaron 0x01e8 /* U+010D LATIN SMALL LETTER C WITH CARON */ #define XK_eogonek 0x01ea /* U+0119 LATIN SMALL LETTER E WITH OGONEK */ #define XK_ecaron 0x01ec /* U+011B LATIN SMALL LETTER E WITH CARON */ #define XK_dcaron 0x01ef /* U+010F LATIN SMALL LETTER D WITH CARON */ #define XK_dstroke 0x01f0 /* U+0111 LATIN SMALL LETTER D WITH STROKE */ #define XK_nacute 0x01f1 /* U+0144 LATIN SMALL LETTER N WITH ACUTE */ #define XK_ncaron 0x01f2 /* U+0148 LATIN SMALL LETTER N WITH CARON */ #define XK_odoubleacute 0x01f5 /* U+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE */ #define XK_rcaron 0x01f8 /* U+0159 LATIN SMALL LETTER R WITH CARON */ #define XK_uring 0x01f9 /* U+016F LATIN SMALL LETTER U WITH RING ABOVE */ #define XK_udoubleacute 0x01fb /* U+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE */ #define XK_tcedilla 0x01fe /* U+0163 LATIN SMALL LETTER T WITH CEDILLA */ #define XK_abovedot 0x01ff /* U+02D9 DOT ABOVE */ #endif /* XK_LATIN2 */ /* * Latin 3 * Byte 3 = 2 */ #ifdef XK_LATIN3 #define XK_Hstroke 0x02a1 /* U+0126 LATIN CAPITAL LETTER H WITH STROKE */ #define XK_Hcircumflex 0x02a6 /* U+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ #define XK_Iabovedot 0x02a9 /* U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE */ #define XK_Gbreve 0x02ab /* U+011E LATIN CAPITAL LETTER G WITH BREVE */ #define XK_Jcircumflex 0x02ac /* U+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ #define XK_hstroke 0x02b1 /* U+0127 LATIN SMALL LETTER H WITH STROKE */ #define XK_hcircumflex 0x02b6 /* U+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX */ #define XK_idotless 0x02b9 /* U+0131 LATIN SMALL LETTER DOTLESS I */ #define XK_gbreve 0x02bb /* U+011F LATIN SMALL LETTER G WITH BREVE */ #define XK_jcircumflex 0x02bc /* U+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX */ #define XK_Cabovedot 0x02c5 /* U+010A LATIN CAPITAL LETTER C WITH DOT ABOVE */ #define XK_Ccircumflex 0x02c6 /* U+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ #define XK_Gabovedot 0x02d5 /* U+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE */ #define XK_Gcircumflex 0x02d8 /* U+011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ #define XK_Ubreve 0x02dd /* U+016C LATIN CAPITAL LETTER U WITH BREVE */ #define XK_Scircumflex 0x02de /* U+015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ #define XK_cabovedot 0x02e5 /* U+010B LATIN SMALL LETTER C WITH DOT ABOVE */ #define XK_ccircumflex 0x02e6 /* U+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX */ #define XK_gabovedot 0x02f5 /* U+0121 LATIN SMALL LETTER G WITH DOT ABOVE */ #define XK_gcircumflex 0x02f8 /* U+011D LATIN SMALL LETTER G WITH CIRCUMFLEX */ #define XK_ubreve 0x02fd /* U+016D LATIN SMALL LETTER U WITH BREVE */ #define XK_scircumflex 0x02fe /* U+015D LATIN SMALL LETTER S WITH CIRCUMFLEX */ #endif /* XK_LATIN3 */ /* * Latin 4 * Byte 3 = 3 */ #ifdef XK_LATIN4 #define XK_kra 0x03a2 /* U+0138 LATIN SMALL LETTER KRA */ #define XK_kappa 0x03a2 /* deprecated */ #define XK_Rcedilla 0x03a3 /* U+0156 LATIN CAPITAL LETTER R WITH CEDILLA */ #define XK_Itilde 0x03a5 /* U+0128 LATIN CAPITAL LETTER I WITH TILDE */ #define XK_Lcedilla 0x03a6 /* U+013B LATIN CAPITAL LETTER L WITH CEDILLA */ #define XK_Emacron 0x03aa /* U+0112 LATIN CAPITAL LETTER E WITH MACRON */ #define XK_Gcedilla 0x03ab /* U+0122 LATIN CAPITAL LETTER G WITH CEDILLA */ #define XK_Tslash 0x03ac /* U+0166 LATIN CAPITAL LETTER T WITH STROKE */ #define XK_rcedilla 0x03b3 /* U+0157 LATIN SMALL LETTER R WITH CEDILLA */ #define XK_itilde 0x03b5 /* U+0129 LATIN SMALL LETTER I WITH TILDE */ #define XK_lcedilla 0x03b6 /* U+013C LATIN SMALL LETTER L WITH CEDILLA */ #define XK_emacron 0x03ba /* U+0113 LATIN SMALL LETTER E WITH MACRON */ #define XK_gcedilla 0x03bb /* U+0123 LATIN SMALL LETTER G WITH CEDILLA */ #define XK_tslash 0x03bc /* U+0167 LATIN SMALL LETTER T WITH STROKE */ #define XK_ENG 0x03bd /* U+014A LATIN CAPITAL LETTER ENG */ #define XK_eng 0x03bf /* U+014B LATIN SMALL LETTER ENG */ #define XK_Amacron 0x03c0 /* U+0100 LATIN CAPITAL LETTER A WITH MACRON */ #define XK_Iogonek 0x03c7 /* U+012E LATIN CAPITAL LETTER I WITH OGONEK */ #define XK_Eabovedot 0x03cc /* U+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE */ #define XK_Imacron 0x03cf /* U+012A LATIN CAPITAL LETTER I WITH MACRON */ #define XK_Ncedilla 0x03d1 /* U+0145 LATIN CAPITAL LETTER N WITH CEDILLA */ #define XK_Omacron 0x03d2 /* U+014C LATIN CAPITAL LETTER O WITH MACRON */ #define XK_Kcedilla 0x03d3 /* U+0136 LATIN CAPITAL LETTER K WITH CEDILLA */ #define XK_Uogonek 0x03d9 /* U+0172 LATIN CAPITAL LETTER U WITH OGONEK */ #define XK_Utilde 0x03dd /* U+0168 LATIN CAPITAL LETTER U WITH TILDE */ #define XK_Umacron 0x03de /* U+016A LATIN CAPITAL LETTER U WITH MACRON */ #define XK_amacron 0x03e0 /* U+0101 LATIN SMALL LETTER A WITH MACRON */ #define XK_iogonek 0x03e7 /* U+012F LATIN SMALL LETTER I WITH OGONEK */ #define XK_eabovedot 0x03ec /* U+0117 LATIN SMALL LETTER E WITH DOT ABOVE */ #define XK_imacron 0x03ef /* U+012B LATIN SMALL LETTER I WITH MACRON */ #define XK_ncedilla 0x03f1 /* U+0146 LATIN SMALL LETTER N WITH CEDILLA */ #define XK_omacron 0x03f2 /* U+014D LATIN SMALL LETTER O WITH MACRON */ #define XK_kcedilla 0x03f3 /* U+0137 LATIN SMALL LETTER K WITH CEDILLA */ #define XK_uogonek 0x03f9 /* U+0173 LATIN SMALL LETTER U WITH OGONEK */ #define XK_utilde 0x03fd /* U+0169 LATIN SMALL LETTER U WITH TILDE */ #define XK_umacron 0x03fe /* U+016B LATIN SMALL LETTER U WITH MACRON */ #endif /* XK_LATIN4 */ /* * Latin 8 */ #ifdef XK_LATIN8 #define XK_Wcircumflex 0x1000174 /* U+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX */ #define XK_wcircumflex 0x1000175 /* U+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX */ #define XK_Ycircumflex 0x1000176 /* U+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */ #define XK_ycircumflex 0x1000177 /* U+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX */ #define XK_Babovedot 0x1001e02 /* U+1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE */ #define XK_babovedot 0x1001e03 /* U+1E03 LATIN SMALL LETTER B WITH DOT ABOVE */ #define XK_Dabovedot 0x1001e0a /* U+1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE */ #define XK_dabovedot 0x1001e0b /* U+1E0B LATIN SMALL LETTER D WITH DOT ABOVE */ #define XK_Fabovedot 0x1001e1e /* U+1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE */ #define XK_fabovedot 0x1001e1f /* U+1E1F LATIN SMALL LETTER F WITH DOT ABOVE */ #define XK_Mabovedot 0x1001e40 /* U+1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE */ #define XK_mabovedot 0x1001e41 /* U+1E41 LATIN SMALL LETTER M WITH DOT ABOVE */ #define XK_Pabovedot 0x1001e56 /* U+1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE */ #define XK_pabovedot 0x1001e57 /* U+1E57 LATIN SMALL LETTER P WITH DOT ABOVE */ #define XK_Sabovedot 0x1001e60 /* U+1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE */ #define XK_sabovedot 0x1001e61 /* U+1E61 LATIN SMALL LETTER S WITH DOT ABOVE */ #define XK_Tabovedot 0x1001e6a /* U+1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE */ #define XK_tabovedot 0x1001e6b /* U+1E6B LATIN SMALL LETTER T WITH DOT ABOVE */ #define XK_Wgrave 0x1001e80 /* U+1E80 LATIN CAPITAL LETTER W WITH GRAVE */ #define XK_wgrave 0x1001e81 /* U+1E81 LATIN SMALL LETTER W WITH GRAVE */ #define XK_Wacute 0x1001e82 /* U+1E82 LATIN CAPITAL LETTER W WITH ACUTE */ #define XK_wacute 0x1001e83 /* U+1E83 LATIN SMALL LETTER W WITH ACUTE */ #define XK_Wdiaeresis 0x1001e84 /* U+1E84 LATIN CAPITAL LETTER W WITH DIAERESIS */ #define XK_wdiaeresis 0x1001e85 /* U+1E85 LATIN SMALL LETTER W WITH DIAERESIS */ #define XK_Ygrave 0x1001ef2 /* U+1EF2 LATIN CAPITAL LETTER Y WITH GRAVE */ #define XK_ygrave 0x1001ef3 /* U+1EF3 LATIN SMALL LETTER Y WITH GRAVE */ #endif /* XK_LATIN8 */ /* * Latin 9 * Byte 3 = 0x13 */ #ifdef XK_LATIN9 #define XK_OE 0x13bc /* U+0152 LATIN CAPITAL LIGATURE OE */ #define XK_oe 0x13bd /* U+0153 LATIN SMALL LIGATURE OE */ #define XK_Ydiaeresis 0x13be /* U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS */ #endif /* XK_LATIN9 */ /* * Katakana * Byte 3 = 4 */ #ifdef XK_KATAKANA #define XK_overline 0x047e /* U+203E OVERLINE */ #define XK_kana_fullstop 0x04a1 /* U+3002 IDEOGRAPHIC FULL STOP */ #define XK_kana_openingbracket 0x04a2 /* U+300C LEFT CORNER BRACKET */ #define XK_kana_closingbracket 0x04a3 /* U+300D RIGHT CORNER BRACKET */ #define XK_kana_comma 0x04a4 /* U+3001 IDEOGRAPHIC COMMA */ #define XK_kana_conjunctive 0x04a5 /* U+30FB KATAKANA MIDDLE DOT */ #define XK_kana_middledot 0x04a5 /* deprecated */ #define XK_kana_WO 0x04a6 /* U+30F2 KATAKANA LETTER WO */ #define XK_kana_a 0x04a7 /* U+30A1 KATAKANA LETTER SMALL A */ #define XK_kana_i 0x04a8 /* U+30A3 KATAKANA LETTER SMALL I */ #define XK_kana_u 0x04a9 /* U+30A5 KATAKANA LETTER SMALL U */ #define XK_kana_e 0x04aa /* U+30A7 KATAKANA LETTER SMALL E */ #define XK_kana_o 0x04ab /* U+30A9 KATAKANA LETTER SMALL O */ #define XK_kana_ya 0x04ac /* U+30E3 KATAKANA LETTER SMALL YA */ #define XK_kana_yu 0x04ad /* U+30E5 KATAKANA LETTER SMALL YU */ #define XK_kana_yo 0x04ae /* U+30E7 KATAKANA LETTER SMALL YO */ #define XK_kana_tsu 0x04af /* U+30C3 KATAKANA LETTER SMALL TU */ #define XK_kana_tu 0x04af /* deprecated */ #define XK_prolongedsound 0x04b0 /* U+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK */ #define XK_kana_A 0x04b1 /* U+30A2 KATAKANA LETTER A */ #define XK_kana_I 0x04b2 /* U+30A4 KATAKANA LETTER I */ #define XK_kana_U 0x04b3 /* U+30A6 KATAKANA LETTER U */ #define XK_kana_E 0x04b4 /* U+30A8 KATAKANA LETTER E */ #define XK_kana_O 0x04b5 /* U+30AA KATAKANA LETTER O */ #define XK_kana_KA 0x04b6 /* U+30AB KATAKANA LETTER KA */ #define XK_kana_KI 0x04b7 /* U+30AD KATAKANA LETTER KI */ #define XK_kana_KU 0x04b8 /* U+30AF KATAKANA LETTER KU */ #define XK_kana_KE 0x04b9 /* U+30B1 KATAKANA LETTER KE */ #define XK_kana_KO 0x04ba /* U+30B3 KATAKANA LETTER KO */ #define XK_kana_SA 0x04bb /* U+30B5 KATAKANA LETTER SA */ #define XK_kana_SHI 0x04bc /* U+30B7 KATAKANA LETTER SI */ #define XK_kana_SU 0x04bd /* U+30B9 KATAKANA LETTER SU */ #define XK_kana_SE 0x04be /* U+30BB KATAKANA LETTER SE */ #define XK_kana_SO 0x04bf /* U+30BD KATAKANA LETTER SO */ #define XK_kana_TA 0x04c0 /* U+30BF KATAKANA LETTER TA */ #define XK_kana_CHI 0x04c1 /* U+30C1 KATAKANA LETTER TI */ #define XK_kana_TI 0x04c1 /* deprecated */ #define XK_kana_TSU 0x04c2 /* U+30C4 KATAKANA LETTER TU */ #define XK_kana_TU 0x04c2 /* deprecated */ #define XK_kana_TE 0x04c3 /* U+30C6 KATAKANA LETTER TE */ #define XK_kana_TO 0x04c4 /* U+30C8 KATAKANA LETTER TO */ #define XK_kana_NA 0x04c5 /* U+30CA KATAKANA LETTER NA */ #define XK_kana_NI 0x04c6 /* U+30CB KATAKANA LETTER NI */ #define XK_kana_NU 0x04c7 /* U+30CC KATAKANA LETTER NU */ #define XK_kana_NE 0x04c8 /* U+30CD KATAKANA LETTER NE */ #define XK_kana_NO 0x04c9 /* U+30CE KATAKANA LETTER NO */ #define XK_kana_HA 0x04ca /* U+30CF KATAKANA LETTER HA */ #define XK_kana_HI 0x04cb /* U+30D2 KATAKANA LETTER HI */ #define XK_kana_FU 0x04cc /* U+30D5 KATAKANA LETTER HU */ #define XK_kana_HU 0x04cc /* deprecated */ #define XK_kana_HE 0x04cd /* U+30D8 KATAKANA LETTER HE */ #define XK_kana_HO 0x04ce /* U+30DB KATAKANA LETTER HO */ #define XK_kana_MA 0x04cf /* U+30DE KATAKANA LETTER MA */ #define XK_kana_MI 0x04d0 /* U+30DF KATAKANA LETTER MI */ #define XK_kana_MU 0x04d1 /* U+30E0 KATAKANA LETTER MU */ #define XK_kana_ME 0x04d2 /* U+30E1 KATAKANA LETTER ME */ #define XK_kana_MO 0x04d3 /* U+30E2 KATAKANA LETTER MO */ #define XK_kana_YA 0x04d4 /* U+30E4 KATAKANA LETTER YA */ #define XK_kana_YU 0x04d5 /* U+30E6 KATAKANA LETTER YU */ #define XK_kana_YO 0x04d6 /* U+30E8 KATAKANA LETTER YO */ #define XK_kana_RA 0x04d7 /* U+30E9 KATAKANA LETTER RA */ #define XK_kana_RI 0x04d8 /* U+30EA KATAKANA LETTER RI */ #define XK_kana_RU 0x04d9 /* U+30EB KATAKANA LETTER RU */ #define XK_kana_RE 0x04da /* U+30EC KATAKANA LETTER RE */ #define XK_kana_RO 0x04db /* U+30ED KATAKANA LETTER RO */ #define XK_kana_WA 0x04dc /* U+30EF KATAKANA LETTER WA */ #define XK_kana_N 0x04dd /* U+30F3 KATAKANA LETTER N */ #define XK_voicedsound 0x04de /* U+309B KATAKANA-HIRAGANA VOICED SOUND MARK */ #define XK_semivoicedsound 0x04df /* U+309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ #define XK_kana_switch 0xff7e /* Alias for mode_switch */ #endif /* XK_KATAKANA */ /* * Arabic * Byte 3 = 5 */ #ifdef XK_ARABIC #define XK_Farsi_0 0x10006f0 /* U+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO */ #define XK_Farsi_1 0x10006f1 /* U+06F1 EXTENDED ARABIC-INDIC DIGIT ONE */ #define XK_Farsi_2 0x10006f2 /* U+06F2 EXTENDED ARABIC-INDIC DIGIT TWO */ #define XK_Farsi_3 0x10006f3 /* U+06F3 EXTENDED ARABIC-INDIC DIGIT THREE */ #define XK_Farsi_4 0x10006f4 /* U+06F4 EXTENDED ARABIC-INDIC DIGIT FOUR */ #define XK_Farsi_5 0x10006f5 /* U+06F5 EXTENDED ARABIC-INDIC DIGIT FIVE */ #define XK_Farsi_6 0x10006f6 /* U+06F6 EXTENDED ARABIC-INDIC DIGIT SIX */ #define XK_Farsi_7 0x10006f7 /* U+06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN */ #define XK_Farsi_8 0x10006f8 /* U+06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT */ #define XK_Farsi_9 0x10006f9 /* U+06F9 EXTENDED ARABIC-INDIC DIGIT NINE */ #define XK_Arabic_percent 0x100066a /* U+066A ARABIC PERCENT SIGN */ #define XK_Arabic_superscript_alef 0x1000670 /* U+0670 ARABIC LETTER SUPERSCRIPT ALEF */ #define XK_Arabic_tteh 0x1000679 /* U+0679 ARABIC LETTER TTEH */ #define XK_Arabic_peh 0x100067e /* U+067E ARABIC LETTER PEH */ #define XK_Arabic_tcheh 0x1000686 /* U+0686 ARABIC LETTER TCHEH */ #define XK_Arabic_ddal 0x1000688 /* U+0688 ARABIC LETTER DDAL */ #define XK_Arabic_rreh 0x1000691 /* U+0691 ARABIC LETTER RREH */ #define XK_Arabic_comma 0x05ac /* U+060C ARABIC COMMA */ #define XK_Arabic_fullstop 0x10006d4 /* U+06D4 ARABIC FULL STOP */ #define XK_Arabic_0 0x1000660 /* U+0660 ARABIC-INDIC DIGIT ZERO */ #define XK_Arabic_1 0x1000661 /* U+0661 ARABIC-INDIC DIGIT ONE */ #define XK_Arabic_2 0x1000662 /* U+0662 ARABIC-INDIC DIGIT TWO */ #define XK_Arabic_3 0x1000663 /* U+0663 ARABIC-INDIC DIGIT THREE */ #define XK_Arabic_4 0x1000664 /* U+0664 ARABIC-INDIC DIGIT FOUR */ #define XK_Arabic_5 0x1000665 /* U+0665 ARABIC-INDIC DIGIT FIVE */ #define XK_Arabic_6 0x1000666 /* U+0666 ARABIC-INDIC DIGIT SIX */ #define XK_Arabic_7 0x1000667 /* U+0667 ARABIC-INDIC DIGIT SEVEN */ #define XK_Arabic_8 0x1000668 /* U+0668 ARABIC-INDIC DIGIT EIGHT */ #define XK_Arabic_9 0x1000669 /* U+0669 ARABIC-INDIC DIGIT NINE */ #define XK_Arabic_semicolon 0x05bb /* U+061B ARABIC SEMICOLON */ #define XK_Arabic_question_mark 0x05bf /* U+061F ARABIC QUESTION MARK */ #define XK_Arabic_hamza 0x05c1 /* U+0621 ARABIC LETTER HAMZA */ #define XK_Arabic_maddaonalef 0x05c2 /* U+0622 ARABIC LETTER ALEF WITH MADDA ABOVE */ #define XK_Arabic_hamzaonalef 0x05c3 /* U+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE */ #define XK_Arabic_hamzaonwaw 0x05c4 /* U+0624 ARABIC LETTER WAW WITH HAMZA ABOVE */ #define XK_Arabic_hamzaunderalef 0x05c5 /* U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW */ #define XK_Arabic_hamzaonyeh 0x05c6 /* U+0626 ARABIC LETTER YEH WITH HAMZA ABOVE */ #define XK_Arabic_alef 0x05c7 /* U+0627 ARABIC LETTER ALEF */ #define XK_Arabic_beh 0x05c8 /* U+0628 ARABIC LETTER BEH */ #define XK_Arabic_tehmarbuta 0x05c9 /* U+0629 ARABIC LETTER TEH MARBUTA */ #define XK_Arabic_teh 0x05ca /* U+062A ARABIC LETTER TEH */ #define XK_Arabic_theh 0x05cb /* U+062B ARABIC LETTER THEH */ #define XK_Arabic_jeem 0x05cc /* U+062C ARABIC LETTER JEEM */ #define XK_Arabic_hah 0x05cd /* U+062D ARABIC LETTER HAH */ #define XK_Arabic_khah 0x05ce /* U+062E ARABIC LETTER KHAH */ #define XK_Arabic_dal 0x05cf /* U+062F ARABIC LETTER DAL */ #define XK_Arabic_thal 0x05d0 /* U+0630 ARABIC LETTER THAL */ #define XK_Arabic_ra 0x05d1 /* U+0631 ARABIC LETTER REH */ #define XK_Arabic_zain 0x05d2 /* U+0632 ARABIC LETTER ZAIN */ #define XK_Arabic_seen 0x05d3 /* U+0633 ARABIC LETTER SEEN */ #define XK_Arabic_sheen 0x05d4 /* U+0634 ARABIC LETTER SHEEN */ #define XK_Arabic_sad 0x05d5 /* U+0635 ARABIC LETTER SAD */ #define XK_Arabic_dad 0x05d6 /* U+0636 ARABIC LETTER DAD */ #define XK_Arabic_tah 0x05d7 /* U+0637 ARABIC LETTER TAH */ #define XK_Arabic_zah 0x05d8 /* U+0638 ARABIC LETTER ZAH */ #define XK_Arabic_ain 0x05d9 /* U+0639 ARABIC LETTER AIN */ #define XK_Arabic_ghain 0x05da /* U+063A ARABIC LETTER GHAIN */ #define XK_Arabic_tatweel 0x05e0 /* U+0640 ARABIC TATWEEL */ #define XK_Arabic_feh 0x05e1 /* U+0641 ARABIC LETTER FEH */ #define XK_Arabic_qaf 0x05e2 /* U+0642 ARABIC LETTER QAF */ #define XK_Arabic_kaf 0x05e3 /* U+0643 ARABIC LETTER KAF */ #define XK_Arabic_lam 0x05e4 /* U+0644 ARABIC LETTER LAM */ #define XK_Arabic_meem 0x05e5 /* U+0645 ARABIC LETTER MEEM */ #define XK_Arabic_noon 0x05e6 /* U+0646 ARABIC LETTER NOON */ #define XK_Arabic_ha 0x05e7 /* U+0647 ARABIC LETTER HEH */ #define XK_Arabic_heh 0x05e7 /* deprecated */ #define XK_Arabic_waw 0x05e8 /* U+0648 ARABIC LETTER WAW */ #define XK_Arabic_alefmaksura 0x05e9 /* U+0649 ARABIC LETTER ALEF MAKSURA */ #define XK_Arabic_yeh 0x05ea /* U+064A ARABIC LETTER YEH */ #define XK_Arabic_fathatan 0x05eb /* U+064B ARABIC FATHATAN */ #define XK_Arabic_dammatan 0x05ec /* U+064C ARABIC DAMMATAN */ #define XK_Arabic_kasratan 0x05ed /* U+064D ARABIC KASRATAN */ #define XK_Arabic_fatha 0x05ee /* U+064E ARABIC FATHA */ #define XK_Arabic_damma 0x05ef /* U+064F ARABIC DAMMA */ #define XK_Arabic_kasra 0x05f0 /* U+0650 ARABIC KASRA */ #define XK_Arabic_shadda 0x05f1 /* U+0651 ARABIC SHADDA */ #define XK_Arabic_sukun 0x05f2 /* U+0652 ARABIC SUKUN */ #define XK_Arabic_madda_above 0x1000653 /* U+0653 ARABIC MADDAH ABOVE */ #define XK_Arabic_hamza_above 0x1000654 /* U+0654 ARABIC HAMZA ABOVE */ #define XK_Arabic_hamza_below 0x1000655 /* U+0655 ARABIC HAMZA BELOW */ #define XK_Arabic_jeh 0x1000698 /* U+0698 ARABIC LETTER JEH */ #define XK_Arabic_veh 0x10006a4 /* U+06A4 ARABIC LETTER VEH */ #define XK_Arabic_keheh 0x10006a9 /* U+06A9 ARABIC LETTER KEHEH */ #define XK_Arabic_gaf 0x10006af /* U+06AF ARABIC LETTER GAF */ #define XK_Arabic_noon_ghunna 0x10006ba /* U+06BA ARABIC LETTER NOON GHUNNA */ #define XK_Arabic_heh_doachashmee 0x10006be /* U+06BE ARABIC LETTER HEH DOACHASHMEE */ #define XK_Farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */ #define XK_Arabic_farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */ #define XK_Arabic_yeh_baree 0x10006d2 /* U+06D2 ARABIC LETTER YEH BARREE */ #define XK_Arabic_heh_goal 0x10006c1 /* U+06C1 ARABIC LETTER HEH GOAL */ #define XK_Arabic_switch 0xff7e /* Alias for mode_switch */ #endif /* XK_ARABIC */ /* * Cyrillic * Byte 3 = 6 */ #ifdef XK_CYRILLIC #define XK_Cyrillic_GHE_bar 0x1000492 /* U+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE */ #define XK_Cyrillic_ghe_bar 0x1000493 /* U+0493 CYRILLIC SMALL LETTER GHE WITH STROKE */ #define XK_Cyrillic_ZHE_descender 0x1000496 /* U+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER */ #define XK_Cyrillic_zhe_descender 0x1000497 /* U+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER */ #define XK_Cyrillic_KA_descender 0x100049a /* U+049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER */ #define XK_Cyrillic_ka_descender 0x100049b /* U+049B CYRILLIC SMALL LETTER KA WITH DESCENDER */ #define XK_Cyrillic_KA_vertstroke 0x100049c /* U+049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE */ #define XK_Cyrillic_ka_vertstroke 0x100049d /* U+049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE */ #define XK_Cyrillic_EN_descender 0x10004a2 /* U+04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER */ #define XK_Cyrillic_en_descender 0x10004a3 /* U+04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER */ #define XK_Cyrillic_U_straight 0x10004ae /* U+04AE CYRILLIC CAPITAL LETTER STRAIGHT U */ #define XK_Cyrillic_u_straight 0x10004af /* U+04AF CYRILLIC SMALL LETTER STRAIGHT U */ #define XK_Cyrillic_U_straight_bar 0x10004b0 /* U+04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE */ #define XK_Cyrillic_u_straight_bar 0x10004b1 /* U+04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE */ #define XK_Cyrillic_HA_descender 0x10004b2 /* U+04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER */ #define XK_Cyrillic_ha_descender 0x10004b3 /* U+04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER */ #define XK_Cyrillic_CHE_descender 0x10004b6 /* U+04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER */ #define XK_Cyrillic_che_descender 0x10004b7 /* U+04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER */ #define XK_Cyrillic_CHE_vertstroke 0x10004b8 /* U+04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE */ #define XK_Cyrillic_che_vertstroke 0x10004b9 /* U+04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE */ #define XK_Cyrillic_SHHA 0x10004ba /* U+04BA CYRILLIC CAPITAL LETTER SHHA */ #define XK_Cyrillic_shha 0x10004bb /* U+04BB CYRILLIC SMALL LETTER SHHA */ #define XK_Cyrillic_SCHWA 0x10004d8 /* U+04D8 CYRILLIC CAPITAL LETTER SCHWA */ #define XK_Cyrillic_schwa 0x10004d9 /* U+04D9 CYRILLIC SMALL LETTER SCHWA */ #define XK_Cyrillic_I_macron 0x10004e2 /* U+04E2 CYRILLIC CAPITAL LETTER I WITH MACRON */ #define XK_Cyrillic_i_macron 0x10004e3 /* U+04E3 CYRILLIC SMALL LETTER I WITH MACRON */ #define XK_Cyrillic_O_bar 0x10004e8 /* U+04E8 CYRILLIC CAPITAL LETTER BARRED O */ #define XK_Cyrillic_o_bar 0x10004e9 /* U+04E9 CYRILLIC SMALL LETTER BARRED O */ #define XK_Cyrillic_U_macron 0x10004ee /* U+04EE CYRILLIC CAPITAL LETTER U WITH MACRON */ #define XK_Cyrillic_u_macron 0x10004ef /* U+04EF CYRILLIC SMALL LETTER U WITH MACRON */ #define XK_Serbian_dje 0x06a1 /* U+0452 CYRILLIC SMALL LETTER DJE */ #define XK_Macedonia_gje 0x06a2 /* U+0453 CYRILLIC SMALL LETTER GJE */ #define XK_Cyrillic_io 0x06a3 /* U+0451 CYRILLIC SMALL LETTER IO */ #define XK_Ukrainian_ie 0x06a4 /* U+0454 CYRILLIC SMALL LETTER UKRAINIAN IE */ #define XK_Ukranian_je 0x06a4 /* deprecated */ #define XK_Macedonia_dse 0x06a5 /* U+0455 CYRILLIC SMALL LETTER DZE */ #define XK_Ukrainian_i 0x06a6 /* U+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ #define XK_Ukranian_i 0x06a6 /* deprecated */ #define XK_Ukrainian_yi 0x06a7 /* U+0457 CYRILLIC SMALL LETTER YI */ #define XK_Ukranian_yi 0x06a7 /* deprecated */ #define XK_Cyrillic_je 0x06a8 /* U+0458 CYRILLIC SMALL LETTER JE */ #define XK_Serbian_je 0x06a8 /* deprecated */ #define XK_Cyrillic_lje 0x06a9 /* U+0459 CYRILLIC SMALL LETTER LJE */ #define XK_Serbian_lje 0x06a9 /* deprecated */ #define XK_Cyrillic_nje 0x06aa /* U+045A CYRILLIC SMALL LETTER NJE */ #define XK_Serbian_nje 0x06aa /* deprecated */ #define XK_Serbian_tshe 0x06ab /* U+045B CYRILLIC SMALL LETTER TSHE */ #define XK_Macedonia_kje 0x06ac /* U+045C CYRILLIC SMALL LETTER KJE */ #define XK_Ukrainian_ghe_with_upturn 0x06ad /* U+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN */ #define XK_Byelorussian_shortu 0x06ae /* U+045E CYRILLIC SMALL LETTER SHORT U */ #define XK_Cyrillic_dzhe 0x06af /* U+045F CYRILLIC SMALL LETTER DZHE */ #define XK_Serbian_dze 0x06af /* deprecated */ #define XK_numerosign 0x06b0 /* U+2116 NUMERO SIGN */ #define XK_Serbian_DJE 0x06b1 /* U+0402 CYRILLIC CAPITAL LETTER DJE */ #define XK_Macedonia_GJE 0x06b2 /* U+0403 CYRILLIC CAPITAL LETTER GJE */ #define XK_Cyrillic_IO 0x06b3 /* U+0401 CYRILLIC CAPITAL LETTER IO */ #define XK_Ukrainian_IE 0x06b4 /* U+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE */ #define XK_Ukranian_JE 0x06b4 /* deprecated */ #define XK_Macedonia_DSE 0x06b5 /* U+0405 CYRILLIC CAPITAL LETTER DZE */ #define XK_Ukrainian_I 0x06b6 /* U+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ #define XK_Ukranian_I 0x06b6 /* deprecated */ #define XK_Ukrainian_YI 0x06b7 /* U+0407 CYRILLIC CAPITAL LETTER YI */ #define XK_Ukranian_YI 0x06b7 /* deprecated */ #define XK_Cyrillic_JE 0x06b8 /* U+0408 CYRILLIC CAPITAL LETTER JE */ #define XK_Serbian_JE 0x06b8 /* deprecated */ #define XK_Cyrillic_LJE 0x06b9 /* U+0409 CYRILLIC CAPITAL LETTER LJE */ #define XK_Serbian_LJE 0x06b9 /* deprecated */ #define XK_Cyrillic_NJE 0x06ba /* U+040A CYRILLIC CAPITAL LETTER NJE */ #define XK_Serbian_NJE 0x06ba /* deprecated */ #define XK_Serbian_TSHE 0x06bb /* U+040B CYRILLIC CAPITAL LETTER TSHE */ #define XK_Macedonia_KJE 0x06bc /* U+040C CYRILLIC CAPITAL LETTER KJE */ #define XK_Ukrainian_GHE_WITH_UPTURN 0x06bd /* U+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ #define XK_Byelorussian_SHORTU 0x06be /* U+040E CYRILLIC CAPITAL LETTER SHORT U */ #define XK_Cyrillic_DZHE 0x06bf /* U+040F CYRILLIC CAPITAL LETTER DZHE */ #define XK_Serbian_DZE 0x06bf /* deprecated */ #define XK_Cyrillic_yu 0x06c0 /* U+044E CYRILLIC SMALL LETTER YU */ #define XK_Cyrillic_a 0x06c1 /* U+0430 CYRILLIC SMALL LETTER A */ #define XK_Cyrillic_be 0x06c2 /* U+0431 CYRILLIC SMALL LETTER BE */ #define XK_Cyrillic_tse 0x06c3 /* U+0446 CYRILLIC SMALL LETTER TSE */ #define XK_Cyrillic_de 0x06c4 /* U+0434 CYRILLIC SMALL LETTER DE */ #define XK_Cyrillic_ie 0x06c5 /* U+0435 CYRILLIC SMALL LETTER IE */ #define XK_Cyrillic_ef 0x06c6 /* U+0444 CYRILLIC SMALL LETTER EF */ #define XK_Cyrillic_ghe 0x06c7 /* U+0433 CYRILLIC SMALL LETTER GHE */ #define XK_Cyrillic_ha 0x06c8 /* U+0445 CYRILLIC SMALL LETTER HA */ #define XK_Cyrillic_i 0x06c9 /* U+0438 CYRILLIC SMALL LETTER I */ #define XK_Cyrillic_shorti 0x06ca /* U+0439 CYRILLIC SMALL LETTER SHORT I */ #define XK_Cyrillic_ka 0x06cb /* U+043A CYRILLIC SMALL LETTER KA */ #define XK_Cyrillic_el 0x06cc /* U+043B CYRILLIC SMALL LETTER EL */ #define XK_Cyrillic_em 0x06cd /* U+043C CYRILLIC SMALL LETTER EM */ #define XK_Cyrillic_en 0x06ce /* U+043D CYRILLIC SMALL LETTER EN */ #define XK_Cyrillic_o 0x06cf /* U+043E CYRILLIC SMALL LETTER O */ #define XK_Cyrillic_pe 0x06d0 /* U+043F CYRILLIC SMALL LETTER PE */ #define XK_Cyrillic_ya 0x06d1 /* U+044F CYRILLIC SMALL LETTER YA */ #define XK_Cyrillic_er 0x06d2 /* U+0440 CYRILLIC SMALL LETTER ER */ #define XK_Cyrillic_es 0x06d3 /* U+0441 CYRILLIC SMALL LETTER ES */ #define XK_Cyrillic_te 0x06d4 /* U+0442 CYRILLIC SMALL LETTER TE */ #define XK_Cyrillic_u 0x06d5 /* U+0443 CYRILLIC SMALL LETTER U */ #define XK_Cyrillic_zhe 0x06d6 /* U+0436 CYRILLIC SMALL LETTER ZHE */ #define XK_Cyrillic_ve 0x06d7 /* U+0432 CYRILLIC SMALL LETTER VE */ #define XK_Cyrillic_softsign 0x06d8 /* U+044C CYRILLIC SMALL LETTER SOFT SIGN */ #define XK_Cyrillic_yeru 0x06d9 /* U+044B CYRILLIC SMALL LETTER YERU */ #define XK_Cyrillic_ze 0x06da /* U+0437 CYRILLIC SMALL LETTER ZE */ #define XK_Cyrillic_sha 0x06db /* U+0448 CYRILLIC SMALL LETTER SHA */ #define XK_Cyrillic_e 0x06dc /* U+044D CYRILLIC SMALL LETTER E */ #define XK_Cyrillic_shcha 0x06dd /* U+0449 CYRILLIC SMALL LETTER SHCHA */ #define XK_Cyrillic_che 0x06de /* U+0447 CYRILLIC SMALL LETTER CHE */ #define XK_Cyrillic_hardsign 0x06df /* U+044A CYRILLIC SMALL LETTER HARD SIGN */ #define XK_Cyrillic_YU 0x06e0 /* U+042E CYRILLIC CAPITAL LETTER YU */ #define XK_Cyrillic_A 0x06e1 /* U+0410 CYRILLIC CAPITAL LETTER A */ #define XK_Cyrillic_BE 0x06e2 /* U+0411 CYRILLIC CAPITAL LETTER BE */ #define XK_Cyrillic_TSE 0x06e3 /* U+0426 CYRILLIC CAPITAL LETTER TSE */ #define XK_Cyrillic_DE 0x06e4 /* U+0414 CYRILLIC CAPITAL LETTER DE */ #define XK_Cyrillic_IE 0x06e5 /* U+0415 CYRILLIC CAPITAL LETTER IE */ #define XK_Cyrillic_EF 0x06e6 /* U+0424 CYRILLIC CAPITAL LETTER EF */ #define XK_Cyrillic_GHE 0x06e7 /* U+0413 CYRILLIC CAPITAL LETTER GHE */ #define XK_Cyrillic_HA 0x06e8 /* U+0425 CYRILLIC CAPITAL LETTER HA */ #define XK_Cyrillic_I 0x06e9 /* U+0418 CYRILLIC CAPITAL LETTER I */ #define XK_Cyrillic_SHORTI 0x06ea /* U+0419 CYRILLIC CAPITAL LETTER SHORT I */ #define XK_Cyrillic_KA 0x06eb /* U+041A CYRILLIC CAPITAL LETTER KA */ #define XK_Cyrillic_EL 0x06ec /* U+041B CYRILLIC CAPITAL LETTER EL */ #define XK_Cyrillic_EM 0x06ed /* U+041C CYRILLIC CAPITAL LETTER EM */ #define XK_Cyrillic_EN 0x06ee /* U+041D CYRILLIC CAPITAL LETTER EN */ #define XK_Cyrillic_O 0x06ef /* U+041E CYRILLIC CAPITAL LETTER O */ #define XK_Cyrillic_PE 0x06f0 /* U+041F CYRILLIC CAPITAL LETTER PE */ #define XK_Cyrillic_YA 0x06f1 /* U+042F CYRILLIC CAPITAL LETTER YA */ #define XK_Cyrillic_ER 0x06f2 /* U+0420 CYRILLIC CAPITAL LETTER ER */ #define XK_Cyrillic_ES 0x06f3 /* U+0421 CYRILLIC CAPITAL LETTER ES */ #define XK_Cyrillic_TE 0x06f4 /* U+0422 CYRILLIC CAPITAL LETTER TE */ #define XK_Cyrillic_U 0x06f5 /* U+0423 CYRILLIC CAPITAL LETTER U */ #define XK_Cyrillic_ZHE 0x06f6 /* U+0416 CYRILLIC CAPITAL LETTER ZHE */ #define XK_Cyrillic_VE 0x06f7 /* U+0412 CYRILLIC CAPITAL LETTER VE */ #define XK_Cyrillic_SOFTSIGN 0x06f8 /* U+042C CYRILLIC CAPITAL LETTER SOFT SIGN */ #define XK_Cyrillic_YERU 0x06f9 /* U+042B CYRILLIC CAPITAL LETTER YERU */ #define XK_Cyrillic_ZE 0x06fa /* U+0417 CYRILLIC CAPITAL LETTER ZE */ #define XK_Cyrillic_SHA 0x06fb /* U+0428 CYRILLIC CAPITAL LETTER SHA */ #define XK_Cyrillic_E 0x06fc /* U+042D CYRILLIC CAPITAL LETTER E */ #define XK_Cyrillic_SHCHA 0x06fd /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */ #define XK_Cyrillic_CHE 0x06fe /* U+0427 CYRILLIC CAPITAL LETTER CHE */ #define XK_Cyrillic_HARDSIGN 0x06ff /* U+042A CYRILLIC CAPITAL LETTER HARD SIGN */ #endif /* XK_CYRILLIC */ /* * Greek * (based on an early draft of, and not quite identical to, ISO/IEC 8859-7) * Byte 3 = 7 */ #ifdef XK_GREEK #define XK_Greek_ALPHAaccent 0x07a1 /* U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS */ #define XK_Greek_EPSILONaccent 0x07a2 /* U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS */ #define XK_Greek_ETAaccent 0x07a3 /* U+0389 GREEK CAPITAL LETTER ETA WITH TONOS */ #define XK_Greek_IOTAaccent 0x07a4 /* U+038A GREEK CAPITAL LETTER IOTA WITH TONOS */ #define XK_Greek_IOTAdieresis 0x07a5 /* U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ #define XK_Greek_IOTAdiaeresis 0x07a5 /* old typo */ #define XK_Greek_OMICRONaccent 0x07a7 /* U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS */ #define XK_Greek_UPSILONaccent 0x07a8 /* U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS */ #define XK_Greek_UPSILONdieresis 0x07a9 /* U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ #define XK_Greek_OMEGAaccent 0x07ab /* U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS */ #define XK_Greek_accentdieresis 0x07ae /* U+0385 GREEK DIALYTIKA TONOS */ #define XK_Greek_horizbar 0x07af /* U+2015 HORIZONTAL BAR */ #define XK_Greek_alphaaccent 0x07b1 /* U+03AC GREEK SMALL LETTER ALPHA WITH TONOS */ #define XK_Greek_epsilonaccent 0x07b2 /* U+03AD GREEK SMALL LETTER EPSILON WITH TONOS */ #define XK_Greek_etaaccent 0x07b3 /* U+03AE GREEK SMALL LETTER ETA WITH TONOS */ #define XK_Greek_iotaaccent 0x07b4 /* U+03AF GREEK SMALL LETTER IOTA WITH TONOS */ #define XK_Greek_iotadieresis 0x07b5 /* U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA */ #define XK_Greek_iotaaccentdieresis 0x07b6 /* U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ #define XK_Greek_omicronaccent 0x07b7 /* U+03CC GREEK SMALL LETTER OMICRON WITH TONOS */ #define XK_Greek_upsilonaccent 0x07b8 /* U+03CD GREEK SMALL LETTER UPSILON WITH TONOS */ #define XK_Greek_upsilondieresis 0x07b9 /* U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ #define XK_Greek_upsilonaccentdieresis 0x07ba /* U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ #define XK_Greek_omegaaccent 0x07bb /* U+03CE GREEK SMALL LETTER OMEGA WITH TONOS */ #define XK_Greek_ALPHA 0x07c1 /* U+0391 GREEK CAPITAL LETTER ALPHA */ #define XK_Greek_BETA 0x07c2 /* U+0392 GREEK CAPITAL LETTER BETA */ #define XK_Greek_GAMMA 0x07c3 /* U+0393 GREEK CAPITAL LETTER GAMMA */ #define XK_Greek_DELTA 0x07c4 /* U+0394 GREEK CAPITAL LETTER DELTA */ #define XK_Greek_EPSILON 0x07c5 /* U+0395 GREEK CAPITAL LETTER EPSILON */ #define XK_Greek_ZETA 0x07c6 /* U+0396 GREEK CAPITAL LETTER ZETA */ #define XK_Greek_ETA 0x07c7 /* U+0397 GREEK CAPITAL LETTER ETA */ #define XK_Greek_THETA 0x07c8 /* U+0398 GREEK CAPITAL LETTER THETA */ #define XK_Greek_IOTA 0x07c9 /* U+0399 GREEK CAPITAL LETTER IOTA */ #define XK_Greek_KAPPA 0x07ca /* U+039A GREEK CAPITAL LETTER KAPPA */ #define XK_Greek_LAMDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */ #define XK_Greek_LAMBDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */ #define XK_Greek_MU 0x07cc /* U+039C GREEK CAPITAL LETTER MU */ #define XK_Greek_NU 0x07cd /* U+039D GREEK CAPITAL LETTER NU */ #define XK_Greek_XI 0x07ce /* U+039E GREEK CAPITAL LETTER XI */ #define XK_Greek_OMICRON 0x07cf /* U+039F GREEK CAPITAL LETTER OMICRON */ #define XK_Greek_PI 0x07d0 /* U+03A0 GREEK CAPITAL LETTER PI */ #define XK_Greek_RHO 0x07d1 /* U+03A1 GREEK CAPITAL LETTER RHO */ #define XK_Greek_SIGMA 0x07d2 /* U+03A3 GREEK CAPITAL LETTER SIGMA */ #define XK_Greek_TAU 0x07d4 /* U+03A4 GREEK CAPITAL LETTER TAU */ #define XK_Greek_UPSILON 0x07d5 /* U+03A5 GREEK CAPITAL LETTER UPSILON */ #define XK_Greek_PHI 0x07d6 /* U+03A6 GREEK CAPITAL LETTER PHI */ #define XK_Greek_CHI 0x07d7 /* U+03A7 GREEK CAPITAL LETTER CHI */ #define XK_Greek_PSI 0x07d8 /* U+03A8 GREEK CAPITAL LETTER PSI */ #define XK_Greek_OMEGA 0x07d9 /* U+03A9 GREEK CAPITAL LETTER OMEGA */ #define XK_Greek_alpha 0x07e1 /* U+03B1 GREEK SMALL LETTER ALPHA */ #define XK_Greek_beta 0x07e2 /* U+03B2 GREEK SMALL LETTER BETA */ #define XK_Greek_gamma 0x07e3 /* U+03B3 GREEK SMALL LETTER GAMMA */ #define XK_Greek_delta 0x07e4 /* U+03B4 GREEK SMALL LETTER DELTA */ #define XK_Greek_epsilon 0x07e5 /* U+03B5 GREEK SMALL LETTER EPSILON */ #define XK_Greek_zeta 0x07e6 /* U+03B6 GREEK SMALL LETTER ZETA */ #define XK_Greek_eta 0x07e7 /* U+03B7 GREEK SMALL LETTER ETA */ #define XK_Greek_theta 0x07e8 /* U+03B8 GREEK SMALL LETTER THETA */ #define XK_Greek_iota 0x07e9 /* U+03B9 GREEK SMALL LETTER IOTA */ #define XK_Greek_kappa 0x07ea /* U+03BA GREEK SMALL LETTER KAPPA */ #define XK_Greek_lamda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */ #define XK_Greek_lambda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */ #define XK_Greek_mu 0x07ec /* U+03BC GREEK SMALL LETTER MU */ #define XK_Greek_nu 0x07ed /* U+03BD GREEK SMALL LETTER NU */ #define XK_Greek_xi 0x07ee /* U+03BE GREEK SMALL LETTER XI */ #define XK_Greek_omicron 0x07ef /* U+03BF GREEK SMALL LETTER OMICRON */ #define XK_Greek_pi 0x07f0 /* U+03C0 GREEK SMALL LETTER PI */ #define XK_Greek_rho 0x07f1 /* U+03C1 GREEK SMALL LETTER RHO */ #define XK_Greek_sigma 0x07f2 /* U+03C3 GREEK SMALL LETTER SIGMA */ #define XK_Greek_finalsmallsigma 0x07f3 /* U+03C2 GREEK SMALL LETTER FINAL SIGMA */ #define XK_Greek_tau 0x07f4 /* U+03C4 GREEK SMALL LETTER TAU */ #define XK_Greek_upsilon 0x07f5 /* U+03C5 GREEK SMALL LETTER UPSILON */ #define XK_Greek_phi 0x07f6 /* U+03C6 GREEK SMALL LETTER PHI */ #define XK_Greek_chi 0x07f7 /* U+03C7 GREEK SMALL LETTER CHI */ #define XK_Greek_psi 0x07f8 /* U+03C8 GREEK SMALL LETTER PSI */ #define XK_Greek_omega 0x07f9 /* U+03C9 GREEK SMALL LETTER OMEGA */ #define XK_Greek_switch 0xff7e /* Alias for mode_switch */ #endif /* XK_GREEK */ /* * Technical * (from the DEC VT330/VT420 Technical Character Set, http://vt100.net/charsets/technical.html) * Byte 3 = 8 */ #ifdef XK_TECHNICAL #define XK_leftradical 0x08a1 /* U+23B7 RADICAL SYMBOL BOTTOM */ #define XK_topleftradical 0x08a2 /*(U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT)*/ #define XK_horizconnector 0x08a3 /*(U+2500 BOX DRAWINGS LIGHT HORIZONTAL)*/ #define XK_topintegral 0x08a4 /* U+2320 TOP HALF INTEGRAL */ #define XK_botintegral 0x08a5 /* U+2321 BOTTOM HALF INTEGRAL */ #define XK_vertconnector 0x08a6 /*(U+2502 BOX DRAWINGS LIGHT VERTICAL)*/ #define XK_topleftsqbracket 0x08a7 /* U+23A1 LEFT SQUARE BRACKET UPPER CORNER */ #define XK_botleftsqbracket 0x08a8 /* U+23A3 LEFT SQUARE BRACKET LOWER CORNER */ #define XK_toprightsqbracket 0x08a9 /* U+23A4 RIGHT SQUARE BRACKET UPPER CORNER */ #define XK_botrightsqbracket 0x08aa /* U+23A6 RIGHT SQUARE BRACKET LOWER CORNER */ #define XK_topleftparens 0x08ab /* U+239B LEFT PARENTHESIS UPPER HOOK */ #define XK_botleftparens 0x08ac /* U+239D LEFT PARENTHESIS LOWER HOOK */ #define XK_toprightparens 0x08ad /* U+239E RIGHT PARENTHESIS UPPER HOOK */ #define XK_botrightparens 0x08ae /* U+23A0 RIGHT PARENTHESIS LOWER HOOK */ #define XK_leftmiddlecurlybrace 0x08af /* U+23A8 LEFT CURLY BRACKET MIDDLE PIECE */ #define XK_rightmiddlecurlybrace 0x08b0 /* U+23AC RIGHT CURLY BRACKET MIDDLE PIECE */ #define XK_topleftsummation 0x08b1 #define XK_botleftsummation 0x08b2 #define XK_topvertsummationconnector 0x08b3 #define XK_botvertsummationconnector 0x08b4 #define XK_toprightsummation 0x08b5 #define XK_botrightsummation 0x08b6 #define XK_rightmiddlesummation 0x08b7 #define XK_lessthanequal 0x08bc /* U+2264 LESS-THAN OR EQUAL TO */ #define XK_notequal 0x08bd /* U+2260 NOT EQUAL TO */ #define XK_greaterthanequal 0x08be /* U+2265 GREATER-THAN OR EQUAL TO */ #define XK_integral 0x08bf /* U+222B INTEGRAL */ #define XK_therefore 0x08c0 /* U+2234 THEREFORE */ #define XK_variation 0x08c1 /* U+221D PROPORTIONAL TO */ #define XK_infinity 0x08c2 /* U+221E INFINITY */ #define XK_nabla 0x08c5 /* U+2207 NABLA */ #define XK_approximate 0x08c8 /* U+223C TILDE OPERATOR */ #define XK_similarequal 0x08c9 /* U+2243 ASYMPTOTICALLY EQUAL TO */ #define XK_ifonlyif 0x08cd /* U+21D4 LEFT RIGHT DOUBLE ARROW */ #define XK_implies 0x08ce /* U+21D2 RIGHTWARDS DOUBLE ARROW */ #define XK_identical 0x08cf /* U+2261 IDENTICAL TO */ #define XK_radical 0x08d6 /* U+221A SQUARE ROOT */ #define XK_includedin 0x08da /* U+2282 SUBSET OF */ #define XK_includes 0x08db /* U+2283 SUPERSET OF */ #define XK_intersection 0x08dc /* U+2229 INTERSECTION */ #define XK_union 0x08dd /* U+222A UNION */ #define XK_logicaland 0x08de /* U+2227 LOGICAL AND */ #define XK_logicalor 0x08df /* U+2228 LOGICAL OR */ #define XK_partialderivative 0x08ef /* U+2202 PARTIAL DIFFERENTIAL */ #define XK_function 0x08f6 /* U+0192 LATIN SMALL LETTER F WITH HOOK */ #define XK_leftarrow 0x08fb /* U+2190 LEFTWARDS ARROW */ #define XK_uparrow 0x08fc /* U+2191 UPWARDS ARROW */ #define XK_rightarrow 0x08fd /* U+2192 RIGHTWARDS ARROW */ #define XK_downarrow 0x08fe /* U+2193 DOWNWARDS ARROW */ #endif /* XK_TECHNICAL */ /* * Special * (from the DEC VT100 Special Graphics Character Set) * Byte 3 = 9 */ #ifdef XK_SPECIAL #define XK_blank 0x09df #define XK_soliddiamond 0x09e0 /* U+25C6 BLACK DIAMOND */ #define XK_checkerboard 0x09e1 /* U+2592 MEDIUM SHADE */ #define XK_ht 0x09e2 /* U+2409 SYMBOL FOR HORIZONTAL TABULATION */ #define XK_ff 0x09e3 /* U+240C SYMBOL FOR FORM FEED */ #define XK_cr 0x09e4 /* U+240D SYMBOL FOR CARRIAGE RETURN */ #define XK_lf 0x09e5 /* U+240A SYMBOL FOR LINE FEED */ #define XK_nl 0x09e8 /* U+2424 SYMBOL FOR NEWLINE */ #define XK_vt 0x09e9 /* U+240B SYMBOL FOR VERTICAL TABULATION */ #define XK_lowrightcorner 0x09ea /* U+2518 BOX DRAWINGS LIGHT UP AND LEFT */ #define XK_uprightcorner 0x09eb /* U+2510 BOX DRAWINGS LIGHT DOWN AND LEFT */ #define XK_upleftcorner 0x09ec /* U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT */ #define XK_lowleftcorner 0x09ed /* U+2514 BOX DRAWINGS LIGHT UP AND RIGHT */ #define XK_crossinglines 0x09ee /* U+253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ #define XK_horizlinescan1 0x09ef /* U+23BA HORIZONTAL SCAN LINE-1 */ #define XK_horizlinescan3 0x09f0 /* U+23BB HORIZONTAL SCAN LINE-3 */ #define XK_horizlinescan5 0x09f1 /* U+2500 BOX DRAWINGS LIGHT HORIZONTAL */ #define XK_horizlinescan7 0x09f2 /* U+23BC HORIZONTAL SCAN LINE-7 */ #define XK_horizlinescan9 0x09f3 /* U+23BD HORIZONTAL SCAN LINE-9 */ #define XK_leftt 0x09f4 /* U+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ #define XK_rightt 0x09f5 /* U+2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT */ #define XK_bott 0x09f6 /* U+2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL */ #define XK_topt 0x09f7 /* U+252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ #define XK_vertbar 0x09f8 /* U+2502 BOX DRAWINGS LIGHT VERTICAL */ #endif /* XK_SPECIAL */ /* * Publishing * (these are probably from a long forgotten DEC Publishing * font that once shipped with DECwrite) * Byte 3 = 0x0a */ #ifdef XK_PUBLISHING #define XK_emspace 0x0aa1 /* U+2003 EM SPACE */ #define XK_enspace 0x0aa2 /* U+2002 EN SPACE */ #define XK_em3space 0x0aa3 /* U+2004 THREE-PER-EM SPACE */ #define XK_em4space 0x0aa4 /* U+2005 FOUR-PER-EM SPACE */ #define XK_digitspace 0x0aa5 /* U+2007 FIGURE SPACE */ #define XK_punctspace 0x0aa6 /* U+2008 PUNCTUATION SPACE */ #define XK_thinspace 0x0aa7 /* U+2009 THIN SPACE */ #define XK_hairspace 0x0aa8 /* U+200A HAIR SPACE */ #define XK_emdash 0x0aa9 /* U+2014 EM DASH */ #define XK_endash 0x0aaa /* U+2013 EN DASH */ #define XK_signifblank 0x0aac /*(U+2423 OPEN BOX)*/ #define XK_ellipsis 0x0aae /* U+2026 HORIZONTAL ELLIPSIS */ #define XK_doubbaselinedot 0x0aaf /* U+2025 TWO DOT LEADER */ #define XK_onethird 0x0ab0 /* U+2153 VULGAR FRACTION ONE THIRD */ #define XK_twothirds 0x0ab1 /* U+2154 VULGAR FRACTION TWO THIRDS */ #define XK_onefifth 0x0ab2 /* U+2155 VULGAR FRACTION ONE FIFTH */ #define XK_twofifths 0x0ab3 /* U+2156 VULGAR FRACTION TWO FIFTHS */ #define XK_threefifths 0x0ab4 /* U+2157 VULGAR FRACTION THREE FIFTHS */ #define XK_fourfifths 0x0ab5 /* U+2158 VULGAR FRACTION FOUR FIFTHS */ #define XK_onesixth 0x0ab6 /* U+2159 VULGAR FRACTION ONE SIXTH */ #define XK_fivesixths 0x0ab7 /* U+215A VULGAR FRACTION FIVE SIXTHS */ #define XK_careof 0x0ab8 /* U+2105 CARE OF */ #define XK_figdash 0x0abb /* U+2012 FIGURE DASH */ #define XK_leftanglebracket 0x0abc /*(U+27E8 MATHEMATICAL LEFT ANGLE BRACKET)*/ #define XK_decimalpoint 0x0abd /*(U+002E FULL STOP)*/ #define XK_rightanglebracket 0x0abe /*(U+27E9 MATHEMATICAL RIGHT ANGLE BRACKET)*/ #define XK_marker 0x0abf #define XK_oneeighth 0x0ac3 /* U+215B VULGAR FRACTION ONE EIGHTH */ #define XK_threeeighths 0x0ac4 /* U+215C VULGAR FRACTION THREE EIGHTHS */ #define XK_fiveeighths 0x0ac5 /* U+215D VULGAR FRACTION FIVE EIGHTHS */ #define XK_seveneighths 0x0ac6 /* U+215E VULGAR FRACTION SEVEN EIGHTHS */ #define XK_trademark 0x0ac9 /* U+2122 TRADE MARK SIGN */ #define XK_signaturemark 0x0aca /*(U+2613 SALTIRE)*/ #define XK_trademarkincircle 0x0acb #define XK_leftopentriangle 0x0acc /*(U+25C1 WHITE LEFT-POINTING TRIANGLE)*/ #define XK_rightopentriangle 0x0acd /*(U+25B7 WHITE RIGHT-POINTING TRIANGLE)*/ #define XK_emopencircle 0x0ace /*(U+25CB WHITE CIRCLE)*/ #define XK_emopenrectangle 0x0acf /*(U+25AF WHITE VERTICAL RECTANGLE)*/ #define XK_leftsinglequotemark 0x0ad0 /* U+2018 LEFT SINGLE QUOTATION MARK */ #define XK_rightsinglequotemark 0x0ad1 /* U+2019 RIGHT SINGLE QUOTATION MARK */ #define XK_leftdoublequotemark 0x0ad2 /* U+201C LEFT DOUBLE QUOTATION MARK */ #define XK_rightdoublequotemark 0x0ad3 /* U+201D RIGHT DOUBLE QUOTATION MARK */ #define XK_prescription 0x0ad4 /* U+211E PRESCRIPTION TAKE */ #define XK_minutes 0x0ad6 /* U+2032 PRIME */ #define XK_seconds 0x0ad7 /* U+2033 DOUBLE PRIME */ #define XK_latincross 0x0ad9 /* U+271D LATIN CROSS */ #define XK_hexagram 0x0ada #define XK_filledrectbullet 0x0adb /*(U+25AC BLACK RECTANGLE)*/ #define XK_filledlefttribullet 0x0adc /*(U+25C0 BLACK LEFT-POINTING TRIANGLE)*/ #define XK_filledrighttribullet 0x0add /*(U+25B6 BLACK RIGHT-POINTING TRIANGLE)*/ #define XK_emfilledcircle 0x0ade /*(U+25CF BLACK CIRCLE)*/ #define XK_emfilledrect 0x0adf /*(U+25AE BLACK VERTICAL RECTANGLE)*/ #define XK_enopencircbullet 0x0ae0 /*(U+25E6 WHITE BULLET)*/ #define XK_enopensquarebullet 0x0ae1 /*(U+25AB WHITE SMALL SQUARE)*/ #define XK_openrectbullet 0x0ae2 /*(U+25AD WHITE RECTANGLE)*/ #define XK_opentribulletup 0x0ae3 /*(U+25B3 WHITE UP-POINTING TRIANGLE)*/ #define XK_opentribulletdown 0x0ae4 /*(U+25BD WHITE DOWN-POINTING TRIANGLE)*/ #define XK_openstar 0x0ae5 /*(U+2606 WHITE STAR)*/ #define XK_enfilledcircbullet 0x0ae6 /*(U+2022 BULLET)*/ #define XK_enfilledsqbullet 0x0ae7 /*(U+25AA BLACK SMALL SQUARE)*/ #define XK_filledtribulletup 0x0ae8 /*(U+25B2 BLACK UP-POINTING TRIANGLE)*/ #define XK_filledtribulletdown 0x0ae9 /*(U+25BC BLACK DOWN-POINTING TRIANGLE)*/ #define XK_leftpointer 0x0aea /*(U+261C WHITE LEFT POINTING INDEX)*/ #define XK_rightpointer 0x0aeb /*(U+261E WHITE RIGHT POINTING INDEX)*/ #define XK_club 0x0aec /* U+2663 BLACK CLUB SUIT */ #define XK_diamond 0x0aed /* U+2666 BLACK DIAMOND SUIT */ #define XK_heart 0x0aee /* U+2665 BLACK HEART SUIT */ #define XK_maltesecross 0x0af0 /* U+2720 MALTESE CROSS */ #define XK_dagger 0x0af1 /* U+2020 DAGGER */ #define XK_doubledagger 0x0af2 /* U+2021 DOUBLE DAGGER */ #define XK_checkmark 0x0af3 /* U+2713 CHECK MARK */ #define XK_ballotcross 0x0af4 /* U+2717 BALLOT X */ #define XK_musicalsharp 0x0af5 /* U+266F MUSIC SHARP SIGN */ #define XK_musicalflat 0x0af6 /* U+266D MUSIC FLAT SIGN */ #define XK_malesymbol 0x0af7 /* U+2642 MALE SIGN */ #define XK_femalesymbol 0x0af8 /* U+2640 FEMALE SIGN */ #define XK_telephone 0x0af9 /* U+260E BLACK TELEPHONE */ #define XK_telephonerecorder 0x0afa /* U+2315 TELEPHONE RECORDER */ #define XK_phonographcopyright 0x0afb /* U+2117 SOUND RECORDING COPYRIGHT */ #define XK_caret 0x0afc /* U+2038 CARET */ #define XK_singlelowquotemark 0x0afd /* U+201A SINGLE LOW-9 QUOTATION MARK */ #define XK_doublelowquotemark 0x0afe /* U+201E DOUBLE LOW-9 QUOTATION MARK */ #define XK_cursor 0x0aff #endif /* XK_PUBLISHING */ /* * APL * Byte 3 = 0x0b */ #ifdef XK_APL #define XK_leftcaret 0x0ba3 /*(U+003C LESS-THAN SIGN)*/ #define XK_rightcaret 0x0ba6 /*(U+003E GREATER-THAN SIGN)*/ #define XK_downcaret 0x0ba8 /*(U+2228 LOGICAL OR)*/ #define XK_upcaret 0x0ba9 /*(U+2227 LOGICAL AND)*/ #define XK_overbar 0x0bc0 /*(U+00AF MACRON)*/ #define XK_downtack 0x0bc2 /* U+22A4 DOWN TACK */ #define XK_upshoe 0x0bc3 /*(U+2229 INTERSECTION)*/ #define XK_downstile 0x0bc4 /* U+230A LEFT FLOOR */ #define XK_underbar 0x0bc6 /*(U+005F LOW LINE)*/ #define XK_jot 0x0bca /* U+2218 RING OPERATOR */ #define XK_quad 0x0bcc /* U+2395 APL FUNCTIONAL SYMBOL QUAD */ #define XK_uptack 0x0bce /* U+22A5 UP TACK */ #define XK_circle 0x0bcf /* U+25CB WHITE CIRCLE */ #define XK_upstile 0x0bd3 /* U+2308 LEFT CEILING */ #define XK_downshoe 0x0bd6 /*(U+222A UNION)*/ #define XK_rightshoe 0x0bd8 /*(U+2283 SUPERSET OF)*/ #define XK_leftshoe 0x0bda /*(U+2282 SUBSET OF)*/ #define XK_lefttack 0x0bdc /* U+22A3 LEFT TACK */ #define XK_righttack 0x0bfc /* U+22A2 RIGHT TACK */ #endif /* XK_APL */ /* * Hebrew * Byte 3 = 0x0c */ #ifdef XK_HEBREW #define XK_hebrew_doublelowline 0x0cdf /* U+2017 DOUBLE LOW LINE */ #define XK_hebrew_aleph 0x0ce0 /* U+05D0 HEBREW LETTER ALEF */ #define XK_hebrew_bet 0x0ce1 /* U+05D1 HEBREW LETTER BET */ #define XK_hebrew_beth 0x0ce1 /* deprecated */ #define XK_hebrew_gimel 0x0ce2 /* U+05D2 HEBREW LETTER GIMEL */ #define XK_hebrew_gimmel 0x0ce2 /* deprecated */ #define XK_hebrew_dalet 0x0ce3 /* U+05D3 HEBREW LETTER DALET */ #define XK_hebrew_daleth 0x0ce3 /* deprecated */ #define XK_hebrew_he 0x0ce4 /* U+05D4 HEBREW LETTER HE */ #define XK_hebrew_waw 0x0ce5 /* U+05D5 HEBREW LETTER VAV */ #define XK_hebrew_zain 0x0ce6 /* U+05D6 HEBREW LETTER ZAYIN */ #define XK_hebrew_zayin 0x0ce6 /* deprecated */ #define XK_hebrew_chet 0x0ce7 /* U+05D7 HEBREW LETTER HET */ #define XK_hebrew_het 0x0ce7 /* deprecated */ #define XK_hebrew_tet 0x0ce8 /* U+05D8 HEBREW LETTER TET */ #define XK_hebrew_teth 0x0ce8 /* deprecated */ #define XK_hebrew_yod 0x0ce9 /* U+05D9 HEBREW LETTER YOD */ #define XK_hebrew_finalkaph 0x0cea /* U+05DA HEBREW LETTER FINAL KAF */ #define XK_hebrew_kaph 0x0ceb /* U+05DB HEBREW LETTER KAF */ #define XK_hebrew_lamed 0x0cec /* U+05DC HEBREW LETTER LAMED */ #define XK_hebrew_finalmem 0x0ced /* U+05DD HEBREW LETTER FINAL MEM */ #define XK_hebrew_mem 0x0cee /* U+05DE HEBREW LETTER MEM */ #define XK_hebrew_finalnun 0x0cef /* U+05DF HEBREW LETTER FINAL NUN */ #define XK_hebrew_nun 0x0cf0 /* U+05E0 HEBREW LETTER NUN */ #define XK_hebrew_samech 0x0cf1 /* U+05E1 HEBREW LETTER SAMEKH */ #define XK_hebrew_samekh 0x0cf1 /* deprecated */ #define XK_hebrew_ayin 0x0cf2 /* U+05E2 HEBREW LETTER AYIN */ #define XK_hebrew_finalpe 0x0cf3 /* U+05E3 HEBREW LETTER FINAL PE */ #define XK_hebrew_pe 0x0cf4 /* U+05E4 HEBREW LETTER PE */ #define XK_hebrew_finalzade 0x0cf5 /* U+05E5 HEBREW LETTER FINAL TSADI */ #define XK_hebrew_finalzadi 0x0cf5 /* deprecated */ #define XK_hebrew_zade 0x0cf6 /* U+05E6 HEBREW LETTER TSADI */ #define XK_hebrew_zadi 0x0cf6 /* deprecated */ #define XK_hebrew_qoph 0x0cf7 /* U+05E7 HEBREW LETTER QOF */ #define XK_hebrew_kuf 0x0cf7 /* deprecated */ #define XK_hebrew_resh 0x0cf8 /* U+05E8 HEBREW LETTER RESH */ #define XK_hebrew_shin 0x0cf9 /* U+05E9 HEBREW LETTER SHIN */ #define XK_hebrew_taw 0x0cfa /* U+05EA HEBREW LETTER TAV */ #define XK_hebrew_taf 0x0cfa /* deprecated */ #define XK_Hebrew_switch 0xff7e /* Alias for mode_switch */ #endif /* XK_HEBREW */ /* * Thai * Byte 3 = 0x0d */ #ifdef XK_THAI #define XK_Thai_kokai 0x0da1 /* U+0E01 THAI CHARACTER KO KAI */ #define XK_Thai_khokhai 0x0da2 /* U+0E02 THAI CHARACTER KHO KHAI */ #define XK_Thai_khokhuat 0x0da3 /* U+0E03 THAI CHARACTER KHO KHUAT */ #define XK_Thai_khokhwai 0x0da4 /* U+0E04 THAI CHARACTER KHO KHWAI */ #define XK_Thai_khokhon 0x0da5 /* U+0E05 THAI CHARACTER KHO KHON */ #define XK_Thai_khorakhang 0x0da6 /* U+0E06 THAI CHARACTER KHO RAKHANG */ #define XK_Thai_ngongu 0x0da7 /* U+0E07 THAI CHARACTER NGO NGU */ #define XK_Thai_chochan 0x0da8 /* U+0E08 THAI CHARACTER CHO CHAN */ #define XK_Thai_choching 0x0da9 /* U+0E09 THAI CHARACTER CHO CHING */ #define XK_Thai_chochang 0x0daa /* U+0E0A THAI CHARACTER CHO CHANG */ #define XK_Thai_soso 0x0dab /* U+0E0B THAI CHARACTER SO SO */ #define XK_Thai_chochoe 0x0dac /* U+0E0C THAI CHARACTER CHO CHOE */ #define XK_Thai_yoying 0x0dad /* U+0E0D THAI CHARACTER YO YING */ #define XK_Thai_dochada 0x0dae /* U+0E0E THAI CHARACTER DO CHADA */ #define XK_Thai_topatak 0x0daf /* U+0E0F THAI CHARACTER TO PATAK */ #define XK_Thai_thothan 0x0db0 /* U+0E10 THAI CHARACTER THO THAN */ #define XK_Thai_thonangmontho 0x0db1 /* U+0E11 THAI CHARACTER THO NANGMONTHO */ #define XK_Thai_thophuthao 0x0db2 /* U+0E12 THAI CHARACTER THO PHUTHAO */ #define XK_Thai_nonen 0x0db3 /* U+0E13 THAI CHARACTER NO NEN */ #define XK_Thai_dodek 0x0db4 /* U+0E14 THAI CHARACTER DO DEK */ #define XK_Thai_totao 0x0db5 /* U+0E15 THAI CHARACTER TO TAO */ #define XK_Thai_thothung 0x0db6 /* U+0E16 THAI CHARACTER THO THUNG */ #define XK_Thai_thothahan 0x0db7 /* U+0E17 THAI CHARACTER THO THAHAN */ #define XK_Thai_thothong 0x0db8 /* U+0E18 THAI CHARACTER THO THONG */ #define XK_Thai_nonu 0x0db9 /* U+0E19 THAI CHARACTER NO NU */ #define XK_Thai_bobaimai 0x0dba /* U+0E1A THAI CHARACTER BO BAIMAI */ #define XK_Thai_popla 0x0dbb /* U+0E1B THAI CHARACTER PO PLA */ #define XK_Thai_phophung 0x0dbc /* U+0E1C THAI CHARACTER PHO PHUNG */ #define XK_Thai_fofa 0x0dbd /* U+0E1D THAI CHARACTER FO FA */ #define XK_Thai_phophan 0x0dbe /* U+0E1E THAI CHARACTER PHO PHAN */ #define XK_Thai_fofan 0x0dbf /* U+0E1F THAI CHARACTER FO FAN */ #define XK_Thai_phosamphao 0x0dc0 /* U+0E20 THAI CHARACTER PHO SAMPHAO */ #define XK_Thai_moma 0x0dc1 /* U+0E21 THAI CHARACTER MO MA */ #define XK_Thai_yoyak 0x0dc2 /* U+0E22 THAI CHARACTER YO YAK */ #define XK_Thai_rorua 0x0dc3 /* U+0E23 THAI CHARACTER RO RUA */ #define XK_Thai_ru 0x0dc4 /* U+0E24 THAI CHARACTER RU */ #define XK_Thai_loling 0x0dc5 /* U+0E25 THAI CHARACTER LO LING */ #define XK_Thai_lu 0x0dc6 /* U+0E26 THAI CHARACTER LU */ #define XK_Thai_wowaen 0x0dc7 /* U+0E27 THAI CHARACTER WO WAEN */ #define XK_Thai_sosala 0x0dc8 /* U+0E28 THAI CHARACTER SO SALA */ #define XK_Thai_sorusi 0x0dc9 /* U+0E29 THAI CHARACTER SO RUSI */ #define XK_Thai_sosua 0x0dca /* U+0E2A THAI CHARACTER SO SUA */ #define XK_Thai_hohip 0x0dcb /* U+0E2B THAI CHARACTER HO HIP */ #define XK_Thai_lochula 0x0dcc /* U+0E2C THAI CHARACTER LO CHULA */ #define XK_Thai_oang 0x0dcd /* U+0E2D THAI CHARACTER O ANG */ #define XK_Thai_honokhuk 0x0dce /* U+0E2E THAI CHARACTER HO NOKHUK */ #define XK_Thai_paiyannoi 0x0dcf /* U+0E2F THAI CHARACTER PAIYANNOI */ #define XK_Thai_saraa 0x0dd0 /* U+0E30 THAI CHARACTER SARA A */ #define XK_Thai_maihanakat 0x0dd1 /* U+0E31 THAI CHARACTER MAI HAN-AKAT */ #define XK_Thai_saraaa 0x0dd2 /* U+0E32 THAI CHARACTER SARA AA */ #define XK_Thai_saraam 0x0dd3 /* U+0E33 THAI CHARACTER SARA AM */ #define XK_Thai_sarai 0x0dd4 /* U+0E34 THAI CHARACTER SARA I */ #define XK_Thai_saraii 0x0dd5 /* U+0E35 THAI CHARACTER SARA II */ #define XK_Thai_saraue 0x0dd6 /* U+0E36 THAI CHARACTER SARA UE */ #define XK_Thai_sarauee 0x0dd7 /* U+0E37 THAI CHARACTER SARA UEE */ #define XK_Thai_sarau 0x0dd8 /* U+0E38 THAI CHARACTER SARA U */ #define XK_Thai_sarauu 0x0dd9 /* U+0E39 THAI CHARACTER SARA UU */ #define XK_Thai_phinthu 0x0dda /* U+0E3A THAI CHARACTER PHINTHU */ #define XK_Thai_maihanakat_maitho 0x0dde #define XK_Thai_baht 0x0ddf /* U+0E3F THAI CURRENCY SYMBOL BAHT */ #define XK_Thai_sarae 0x0de0 /* U+0E40 THAI CHARACTER SARA E */ #define XK_Thai_saraae 0x0de1 /* U+0E41 THAI CHARACTER SARA AE */ #define XK_Thai_sarao 0x0de2 /* U+0E42 THAI CHARACTER SARA O */ #define XK_Thai_saraaimaimuan 0x0de3 /* U+0E43 THAI CHARACTER SARA AI MAIMUAN */ #define XK_Thai_saraaimaimalai 0x0de4 /* U+0E44 THAI CHARACTER SARA AI MAIMALAI */ #define XK_Thai_lakkhangyao 0x0de5 /* U+0E45 THAI CHARACTER LAKKHANGYAO */ #define XK_Thai_maiyamok 0x0de6 /* U+0E46 THAI CHARACTER MAIYAMOK */ #define XK_Thai_maitaikhu 0x0de7 /* U+0E47 THAI CHARACTER MAITAIKHU */ #define XK_Thai_maiek 0x0de8 /* U+0E48 THAI CHARACTER MAI EK */ #define XK_Thai_maitho 0x0de9 /* U+0E49 THAI CHARACTER MAI THO */ #define XK_Thai_maitri 0x0dea /* U+0E4A THAI CHARACTER MAI TRI */ #define XK_Thai_maichattawa 0x0deb /* U+0E4B THAI CHARACTER MAI CHATTAWA */ #define XK_Thai_thanthakhat 0x0dec /* U+0E4C THAI CHARACTER THANTHAKHAT */ #define XK_Thai_nikhahit 0x0ded /* U+0E4D THAI CHARACTER NIKHAHIT */ #define XK_Thai_leksun 0x0df0 /* U+0E50 THAI DIGIT ZERO */ #define XK_Thai_leknung 0x0df1 /* U+0E51 THAI DIGIT ONE */ #define XK_Thai_leksong 0x0df2 /* U+0E52 THAI DIGIT TWO */ #define XK_Thai_leksam 0x0df3 /* U+0E53 THAI DIGIT THREE */ #define XK_Thai_leksi 0x0df4 /* U+0E54 THAI DIGIT FOUR */ #define XK_Thai_lekha 0x0df5 /* U+0E55 THAI DIGIT FIVE */ #define XK_Thai_lekhok 0x0df6 /* U+0E56 THAI DIGIT SIX */ #define XK_Thai_lekchet 0x0df7 /* U+0E57 THAI DIGIT SEVEN */ #define XK_Thai_lekpaet 0x0df8 /* U+0E58 THAI DIGIT EIGHT */ #define XK_Thai_lekkao 0x0df9 /* U+0E59 THAI DIGIT NINE */ #endif /* XK_THAI */ /* * Korean * Byte 3 = 0x0e */ #ifdef XK_KOREAN #define XK_Hangul 0xff31 /* Hangul start/stop(toggle) */ #define XK_Hangul_Start 0xff32 /* Hangul start */ #define XK_Hangul_End 0xff33 /* Hangul end, English start */ #define XK_Hangul_Hanja 0xff34 /* Start Hangul->Hanja Conversion */ #define XK_Hangul_Jamo 0xff35 /* Hangul Jamo mode */ #define XK_Hangul_Romaja 0xff36 /* Hangul Romaja mode */ #define XK_Hangul_Codeinput 0xff37 /* Hangul code input mode */ #define XK_Hangul_Jeonja 0xff38 /* Jeonja mode */ #define XK_Hangul_Banja 0xff39 /* Banja mode */ #define XK_Hangul_PreHanja 0xff3a /* Pre Hanja conversion */ #define XK_Hangul_PostHanja 0xff3b /* Post Hanja conversion */ #define XK_Hangul_SingleCandidate 0xff3c /* Single candidate */ #define XK_Hangul_MultipleCandidate 0xff3d /* Multiple candidate */ #define XK_Hangul_PreviousCandidate 0xff3e /* Previous candidate */ #define XK_Hangul_Special 0xff3f /* Special symbols */ #define XK_Hangul_switch 0xff7e /* Alias for mode_switch */ /* Hangul Consonant Characters */ #define XK_Hangul_Kiyeog 0x0ea1 #define XK_Hangul_SsangKiyeog 0x0ea2 #define XK_Hangul_KiyeogSios 0x0ea3 #define XK_Hangul_Nieun 0x0ea4 #define XK_Hangul_NieunJieuj 0x0ea5 #define XK_Hangul_NieunHieuh 0x0ea6 #define XK_Hangul_Dikeud 0x0ea7 #define XK_Hangul_SsangDikeud 0x0ea8 #define XK_Hangul_Rieul 0x0ea9 #define XK_Hangul_RieulKiyeog 0x0eaa #define XK_Hangul_RieulMieum 0x0eab #define XK_Hangul_RieulPieub 0x0eac #define XK_Hangul_RieulSios 0x0ead #define XK_Hangul_RieulTieut 0x0eae #define XK_Hangul_RieulPhieuf 0x0eaf #define XK_Hangul_RieulHieuh 0x0eb0 #define XK_Hangul_Mieum 0x0eb1 #define XK_Hangul_Pieub 0x0eb2 #define XK_Hangul_SsangPieub 0x0eb3 #define XK_Hangul_PieubSios 0x0eb4 #define XK_Hangul_Sios 0x0eb5 #define XK_Hangul_SsangSios 0x0eb6 #define XK_Hangul_Ieung 0x0eb7 #define XK_Hangul_Jieuj 0x0eb8 #define XK_Hangul_SsangJieuj 0x0eb9 #define XK_Hangul_Cieuc 0x0eba #define XK_Hangul_Khieuq 0x0ebb #define XK_Hangul_Tieut 0x0ebc #define XK_Hangul_Phieuf 0x0ebd #define XK_Hangul_Hieuh 0x0ebe /* Hangul Vowel Characters */ #define XK_Hangul_A 0x0ebf #define XK_Hangul_AE 0x0ec0 #define XK_Hangul_YA 0x0ec1 #define XK_Hangul_YAE 0x0ec2 #define XK_Hangul_EO 0x0ec3 #define XK_Hangul_E 0x0ec4 #define XK_Hangul_YEO 0x0ec5 #define XK_Hangul_YE 0x0ec6 #define XK_Hangul_O 0x0ec7 #define XK_Hangul_WA 0x0ec8 #define XK_Hangul_WAE 0x0ec9 #define XK_Hangul_OE 0x0eca #define XK_Hangul_YO 0x0ecb #define XK_Hangul_U 0x0ecc #define XK_Hangul_WEO 0x0ecd #define XK_Hangul_WE 0x0ece #define XK_Hangul_WI 0x0ecf #define XK_Hangul_YU 0x0ed0 #define XK_Hangul_EU 0x0ed1 #define XK_Hangul_YI 0x0ed2 #define XK_Hangul_I 0x0ed3 /* Hangul syllable-final (JongSeong) Characters */ #define XK_Hangul_J_Kiyeog 0x0ed4 #define XK_Hangul_J_SsangKiyeog 0x0ed5 #define XK_Hangul_J_KiyeogSios 0x0ed6 #define XK_Hangul_J_Nieun 0x0ed7 #define XK_Hangul_J_NieunJieuj 0x0ed8 #define XK_Hangul_J_NieunHieuh 0x0ed9 #define XK_Hangul_J_Dikeud 0x0eda #define XK_Hangul_J_Rieul 0x0edb #define XK_Hangul_J_RieulKiyeog 0x0edc #define XK_Hangul_J_RieulMieum 0x0edd #define XK_Hangul_J_RieulPieub 0x0ede #define XK_Hangul_J_RieulSios 0x0edf #define XK_Hangul_J_RieulTieut 0x0ee0 #define XK_Hangul_J_RieulPhieuf 0x0ee1 #define XK_Hangul_J_RieulHieuh 0x0ee2 #define XK_Hangul_J_Mieum 0x0ee3 #define XK_Hangul_J_Pieub 0x0ee4 #define XK_Hangul_J_PieubSios 0x0ee5 #define XK_Hangul_J_Sios 0x0ee6 #define XK_Hangul_J_SsangSios 0x0ee7 #define XK_Hangul_J_Ieung 0x0ee8 #define XK_Hangul_J_Jieuj 0x0ee9 #define XK_Hangul_J_Cieuc 0x0eea #define XK_Hangul_J_Khieuq 0x0eeb #define XK_Hangul_J_Tieut 0x0eec #define XK_Hangul_J_Phieuf 0x0eed #define XK_Hangul_J_Hieuh 0x0eee /* Ancient Hangul Consonant Characters */ #define XK_Hangul_RieulYeorinHieuh 0x0eef #define XK_Hangul_SunkyeongeumMieum 0x0ef0 #define XK_Hangul_SunkyeongeumPieub 0x0ef1 #define XK_Hangul_PanSios 0x0ef2 #define XK_Hangul_KkogjiDalrinIeung 0x0ef3 #define XK_Hangul_SunkyeongeumPhieuf 0x0ef4 #define XK_Hangul_YeorinHieuh 0x0ef5 /* Ancient Hangul Vowel Characters */ #define XK_Hangul_AraeA 0x0ef6 #define XK_Hangul_AraeAE 0x0ef7 /* Ancient Hangul syllable-final (JongSeong) Characters */ #define XK_Hangul_J_PanSios 0x0ef8 #define XK_Hangul_J_KkogjiDalrinIeung 0x0ef9 #define XK_Hangul_J_YeorinHieuh 0x0efa /* Korean currency symbol */ #define XK_Korean_Won 0x0eff /*(U+20A9 WON SIGN)*/ #endif /* XK_KOREAN */ /* * Armenian */ #ifdef XK_ARMENIAN #define XK_Armenian_ligature_ew 0x1000587 /* U+0587 ARMENIAN SMALL LIGATURE ECH YIWN */ #define XK_Armenian_full_stop 0x1000589 /* U+0589 ARMENIAN FULL STOP */ #define XK_Armenian_verjaket 0x1000589 /* U+0589 ARMENIAN FULL STOP */ #define XK_Armenian_separation_mark 0x100055d /* U+055D ARMENIAN COMMA */ #define XK_Armenian_but 0x100055d /* U+055D ARMENIAN COMMA */ #define XK_Armenian_hyphen 0x100058a /* U+058A ARMENIAN HYPHEN */ #define XK_Armenian_yentamna 0x100058a /* U+058A ARMENIAN HYPHEN */ #define XK_Armenian_exclam 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */ #define XK_Armenian_amanak 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */ #define XK_Armenian_accent 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */ #define XK_Armenian_shesht 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */ #define XK_Armenian_question 0x100055e /* U+055E ARMENIAN QUESTION MARK */ #define XK_Armenian_paruyk 0x100055e /* U+055E ARMENIAN QUESTION MARK */ #define XK_Armenian_AYB 0x1000531 /* U+0531 ARMENIAN CAPITAL LETTER AYB */ #define XK_Armenian_ayb 0x1000561 /* U+0561 ARMENIAN SMALL LETTER AYB */ #define XK_Armenian_BEN 0x1000532 /* U+0532 ARMENIAN CAPITAL LETTER BEN */ #define XK_Armenian_ben 0x1000562 /* U+0562 ARMENIAN SMALL LETTER BEN */ #define XK_Armenian_GIM 0x1000533 /* U+0533 ARMENIAN CAPITAL LETTER GIM */ #define XK_Armenian_gim 0x1000563 /* U+0563 ARMENIAN SMALL LETTER GIM */ #define XK_Armenian_DA 0x1000534 /* U+0534 ARMENIAN CAPITAL LETTER DA */ #define XK_Armenian_da 0x1000564 /* U+0564 ARMENIAN SMALL LETTER DA */ #define XK_Armenian_YECH 0x1000535 /* U+0535 ARMENIAN CAPITAL LETTER ECH */ #define XK_Armenian_yech 0x1000565 /* U+0565 ARMENIAN SMALL LETTER ECH */ #define XK_Armenian_ZA 0x1000536 /* U+0536 ARMENIAN CAPITAL LETTER ZA */ #define XK_Armenian_za 0x1000566 /* U+0566 ARMENIAN SMALL LETTER ZA */ #define XK_Armenian_E 0x1000537 /* U+0537 ARMENIAN CAPITAL LETTER EH */ #define XK_Armenian_e 0x1000567 /* U+0567 ARMENIAN SMALL LETTER EH */ #define XK_Armenian_AT 0x1000538 /* U+0538 ARMENIAN CAPITAL LETTER ET */ #define XK_Armenian_at 0x1000568 /* U+0568 ARMENIAN SMALL LETTER ET */ #define XK_Armenian_TO 0x1000539 /* U+0539 ARMENIAN CAPITAL LETTER TO */ #define XK_Armenian_to 0x1000569 /* U+0569 ARMENIAN SMALL LETTER TO */ #define XK_Armenian_ZHE 0x100053a /* U+053A ARMENIAN CAPITAL LETTER ZHE */ #define XK_Armenian_zhe 0x100056a /* U+056A ARMENIAN SMALL LETTER ZHE */ #define XK_Armenian_INI 0x100053b /* U+053B ARMENIAN CAPITAL LETTER INI */ #define XK_Armenian_ini 0x100056b /* U+056B ARMENIAN SMALL LETTER INI */ #define XK_Armenian_LYUN 0x100053c /* U+053C ARMENIAN CAPITAL LETTER LIWN */ #define XK_Armenian_lyun 0x100056c /* U+056C ARMENIAN SMALL LETTER LIWN */ #define XK_Armenian_KHE 0x100053d /* U+053D ARMENIAN CAPITAL LETTER XEH */ #define XK_Armenian_khe 0x100056d /* U+056D ARMENIAN SMALL LETTER XEH */ #define XK_Armenian_TSA 0x100053e /* U+053E ARMENIAN CAPITAL LETTER CA */ #define XK_Armenian_tsa 0x100056e /* U+056E ARMENIAN SMALL LETTER CA */ #define XK_Armenian_KEN 0x100053f /* U+053F ARMENIAN CAPITAL LETTER KEN */ #define XK_Armenian_ken 0x100056f /* U+056F ARMENIAN SMALL LETTER KEN */ #define XK_Armenian_HO 0x1000540 /* U+0540 ARMENIAN CAPITAL LETTER HO */ #define XK_Armenian_ho 0x1000570 /* U+0570 ARMENIAN SMALL LETTER HO */ #define XK_Armenian_DZA 0x1000541 /* U+0541 ARMENIAN CAPITAL LETTER JA */ #define XK_Armenian_dza 0x1000571 /* U+0571 ARMENIAN SMALL LETTER JA */ #define XK_Armenian_GHAT 0x1000542 /* U+0542 ARMENIAN CAPITAL LETTER GHAD */ #define XK_Armenian_ghat 0x1000572 /* U+0572 ARMENIAN SMALL LETTER GHAD */ #define XK_Armenian_TCHE 0x1000543 /* U+0543 ARMENIAN CAPITAL LETTER CHEH */ #define XK_Armenian_tche 0x1000573 /* U+0573 ARMENIAN SMALL LETTER CHEH */ #define XK_Armenian_MEN 0x1000544 /* U+0544 ARMENIAN CAPITAL LETTER MEN */ #define XK_Armenian_men 0x1000574 /* U+0574 ARMENIAN SMALL LETTER MEN */ #define XK_Armenian_HI 0x1000545 /* U+0545 ARMENIAN CAPITAL LETTER YI */ #define XK_Armenian_hi 0x1000575 /* U+0575 ARMENIAN SMALL LETTER YI */ #define XK_Armenian_NU 0x1000546 /* U+0546 ARMENIAN CAPITAL LETTER NOW */ #define XK_Armenian_nu 0x1000576 /* U+0576 ARMENIAN SMALL LETTER NOW */ #define XK_Armenian_SHA 0x1000547 /* U+0547 ARMENIAN CAPITAL LETTER SHA */ #define XK_Armenian_sha 0x1000577 /* U+0577 ARMENIAN SMALL LETTER SHA */ #define XK_Armenian_VO 0x1000548 /* U+0548 ARMENIAN CAPITAL LETTER VO */ #define XK_Armenian_vo 0x1000578 /* U+0578 ARMENIAN SMALL LETTER VO */ #define XK_Armenian_CHA 0x1000549 /* U+0549 ARMENIAN CAPITAL LETTER CHA */ #define XK_Armenian_cha 0x1000579 /* U+0579 ARMENIAN SMALL LETTER CHA */ #define XK_Armenian_PE 0x100054a /* U+054A ARMENIAN CAPITAL LETTER PEH */ #define XK_Armenian_pe 0x100057a /* U+057A ARMENIAN SMALL LETTER PEH */ #define XK_Armenian_JE 0x100054b /* U+054B ARMENIAN CAPITAL LETTER JHEH */ #define XK_Armenian_je 0x100057b /* U+057B ARMENIAN SMALL LETTER JHEH */ #define XK_Armenian_RA 0x100054c /* U+054C ARMENIAN CAPITAL LETTER RA */ #define XK_Armenian_ra 0x100057c /* U+057C ARMENIAN SMALL LETTER RA */ #define XK_Armenian_SE 0x100054d /* U+054D ARMENIAN CAPITAL LETTER SEH */ #define XK_Armenian_se 0x100057d /* U+057D ARMENIAN SMALL LETTER SEH */ #define XK_Armenian_VEV 0x100054e /* U+054E ARMENIAN CAPITAL LETTER VEW */ #define XK_Armenian_vev 0x100057e /* U+057E ARMENIAN SMALL LETTER VEW */ #define XK_Armenian_TYUN 0x100054f /* U+054F ARMENIAN CAPITAL LETTER TIWN */ #define XK_Armenian_tyun 0x100057f /* U+057F ARMENIAN SMALL LETTER TIWN */ #define XK_Armenian_RE 0x1000550 /* U+0550 ARMENIAN CAPITAL LETTER REH */ #define XK_Armenian_re 0x1000580 /* U+0580 ARMENIAN SMALL LETTER REH */ #define XK_Armenian_TSO 0x1000551 /* U+0551 ARMENIAN CAPITAL LETTER CO */ #define XK_Armenian_tso 0x1000581 /* U+0581 ARMENIAN SMALL LETTER CO */ #define XK_Armenian_VYUN 0x1000552 /* U+0552 ARMENIAN CAPITAL LETTER YIWN */ #define XK_Armenian_vyun 0x1000582 /* U+0582 ARMENIAN SMALL LETTER YIWN */ #define XK_Armenian_PYUR 0x1000553 /* U+0553 ARMENIAN CAPITAL LETTER PIWR */ #define XK_Armenian_pyur 0x1000583 /* U+0583 ARMENIAN SMALL LETTER PIWR */ #define XK_Armenian_KE 0x1000554 /* U+0554 ARMENIAN CAPITAL LETTER KEH */ #define XK_Armenian_ke 0x1000584 /* U+0584 ARMENIAN SMALL LETTER KEH */ #define XK_Armenian_O 0x1000555 /* U+0555 ARMENIAN CAPITAL LETTER OH */ #define XK_Armenian_o 0x1000585 /* U+0585 ARMENIAN SMALL LETTER OH */ #define XK_Armenian_FE 0x1000556 /* U+0556 ARMENIAN CAPITAL LETTER FEH */ #define XK_Armenian_fe 0x1000586 /* U+0586 ARMENIAN SMALL LETTER FEH */ #define XK_Armenian_apostrophe 0x100055a /* U+055A ARMENIAN APOSTROPHE */ #endif /* XK_ARMENIAN */ /* * Georgian */ #ifdef XK_GEORGIAN #define XK_Georgian_an 0x10010d0 /* U+10D0 GEORGIAN LETTER AN */ #define XK_Georgian_ban 0x10010d1 /* U+10D1 GEORGIAN LETTER BAN */ #define XK_Georgian_gan 0x10010d2 /* U+10D2 GEORGIAN LETTER GAN */ #define XK_Georgian_don 0x10010d3 /* U+10D3 GEORGIAN LETTER DON */ #define XK_Georgian_en 0x10010d4 /* U+10D4 GEORGIAN LETTER EN */ #define XK_Georgian_vin 0x10010d5 /* U+10D5 GEORGIAN LETTER VIN */ #define XK_Georgian_zen 0x10010d6 /* U+10D6 GEORGIAN LETTER ZEN */ #define XK_Georgian_tan 0x10010d7 /* U+10D7 GEORGIAN LETTER TAN */ #define XK_Georgian_in 0x10010d8 /* U+10D8 GEORGIAN LETTER IN */ #define XK_Georgian_kan 0x10010d9 /* U+10D9 GEORGIAN LETTER KAN */ #define XK_Georgian_las 0x10010da /* U+10DA GEORGIAN LETTER LAS */ #define XK_Georgian_man 0x10010db /* U+10DB GEORGIAN LETTER MAN */ #define XK_Georgian_nar 0x10010dc /* U+10DC GEORGIAN LETTER NAR */ #define XK_Georgian_on 0x10010dd /* U+10DD GEORGIAN LETTER ON */ #define XK_Georgian_par 0x10010de /* U+10DE GEORGIAN LETTER PAR */ #define XK_Georgian_zhar 0x10010df /* U+10DF GEORGIAN LETTER ZHAR */ #define XK_Georgian_rae 0x10010e0 /* U+10E0 GEORGIAN LETTER RAE */ #define XK_Georgian_san 0x10010e1 /* U+10E1 GEORGIAN LETTER SAN */ #define XK_Georgian_tar 0x10010e2 /* U+10E2 GEORGIAN LETTER TAR */ #define XK_Georgian_un 0x10010e3 /* U+10E3 GEORGIAN LETTER UN */ #define XK_Georgian_phar 0x10010e4 /* U+10E4 GEORGIAN LETTER PHAR */ #define XK_Georgian_khar 0x10010e5 /* U+10E5 GEORGIAN LETTER KHAR */ #define XK_Georgian_ghan 0x10010e6 /* U+10E6 GEORGIAN LETTER GHAN */ #define XK_Georgian_qar 0x10010e7 /* U+10E7 GEORGIAN LETTER QAR */ #define XK_Georgian_shin 0x10010e8 /* U+10E8 GEORGIAN LETTER SHIN */ #define XK_Georgian_chin 0x10010e9 /* U+10E9 GEORGIAN LETTER CHIN */ #define XK_Georgian_can 0x10010ea /* U+10EA GEORGIAN LETTER CAN */ #define XK_Georgian_jil 0x10010eb /* U+10EB GEORGIAN LETTER JIL */ #define XK_Georgian_cil 0x10010ec /* U+10EC GEORGIAN LETTER CIL */ #define XK_Georgian_char 0x10010ed /* U+10ED GEORGIAN LETTER CHAR */ #define XK_Georgian_xan 0x10010ee /* U+10EE GEORGIAN LETTER XAN */ #define XK_Georgian_jhan 0x10010ef /* U+10EF GEORGIAN LETTER JHAN */ #define XK_Georgian_hae 0x10010f0 /* U+10F0 GEORGIAN LETTER HAE */ #define XK_Georgian_he 0x10010f1 /* U+10F1 GEORGIAN LETTER HE */ #define XK_Georgian_hie 0x10010f2 /* U+10F2 GEORGIAN LETTER HIE */ #define XK_Georgian_we 0x10010f3 /* U+10F3 GEORGIAN LETTER WE */ #define XK_Georgian_har 0x10010f4 /* U+10F4 GEORGIAN LETTER HAR */ #define XK_Georgian_hoe 0x10010f5 /* U+10F5 GEORGIAN LETTER HOE */ #define XK_Georgian_fi 0x10010f6 /* U+10F6 GEORGIAN LETTER FI */ #endif /* XK_GEORGIAN */ /* * Azeri (and other Turkic or Caucasian languages) */ #ifdef XK_CAUCASUS /* latin */ #define XK_Xabovedot 0x1001e8a /* U+1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE */ #define XK_Ibreve 0x100012c /* U+012C LATIN CAPITAL LETTER I WITH BREVE */ #define XK_Zstroke 0x10001b5 /* U+01B5 LATIN CAPITAL LETTER Z WITH STROKE */ #define XK_Gcaron 0x10001e6 /* U+01E6 LATIN CAPITAL LETTER G WITH CARON */ #define XK_Ocaron 0x10001d1 /* U+01D2 LATIN CAPITAL LETTER O WITH CARON */ #define XK_Obarred 0x100019f /* U+019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE */ #define XK_xabovedot 0x1001e8b /* U+1E8B LATIN SMALL LETTER X WITH DOT ABOVE */ #define XK_ibreve 0x100012d /* U+012D LATIN SMALL LETTER I WITH BREVE */ #define XK_zstroke 0x10001b6 /* U+01B6 LATIN SMALL LETTER Z WITH STROKE */ #define XK_gcaron 0x10001e7 /* U+01E7 LATIN SMALL LETTER G WITH CARON */ #define XK_ocaron 0x10001d2 /* U+01D2 LATIN SMALL LETTER O WITH CARON */ #define XK_obarred 0x1000275 /* U+0275 LATIN SMALL LETTER BARRED O */ #define XK_SCHWA 0x100018f /* U+018F LATIN CAPITAL LETTER SCHWA */ #define XK_schwa 0x1000259 /* U+0259 LATIN SMALL LETTER SCHWA */ /* those are not really Caucasus */ /* For Inupiak */ #define XK_Lbelowdot 0x1001e36 /* U+1E36 LATIN CAPITAL LETTER L WITH DOT BELOW */ #define XK_lbelowdot 0x1001e37 /* U+1E37 LATIN SMALL LETTER L WITH DOT BELOW */ #endif /* XK_CAUCASUS */ /* * Vietnamese */ #ifdef XK_VIETNAMESE #define XK_Abelowdot 0x1001ea0 /* U+1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW */ #define XK_abelowdot 0x1001ea1 /* U+1EA1 LATIN SMALL LETTER A WITH DOT BELOW */ #define XK_Ahook 0x1001ea2 /* U+1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE */ #define XK_ahook 0x1001ea3 /* U+1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE */ #define XK_Acircumflexacute 0x1001ea4 /* U+1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */ #define XK_acircumflexacute 0x1001ea5 /* U+1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */ #define XK_Acircumflexgrave 0x1001ea6 /* U+1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */ #define XK_acircumflexgrave 0x1001ea7 /* U+1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */ #define XK_Acircumflexhook 0x1001ea8 /* U+1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ #define XK_acircumflexhook 0x1001ea9 /* U+1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ #define XK_Acircumflextilde 0x1001eaa /* U+1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */ #define XK_acircumflextilde 0x1001eab /* U+1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */ #define XK_Acircumflexbelowdot 0x1001eac /* U+1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ #define XK_acircumflexbelowdot 0x1001ead /* U+1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ #define XK_Abreveacute 0x1001eae /* U+1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */ #define XK_abreveacute 0x1001eaf /* U+1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE */ #define XK_Abrevegrave 0x1001eb0 /* U+1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */ #define XK_abrevegrave 0x1001eb1 /* U+1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE */ #define XK_Abrevehook 0x1001eb2 /* U+1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */ #define XK_abrevehook 0x1001eb3 /* U+1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */ #define XK_Abrevetilde 0x1001eb4 /* U+1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE */ #define XK_abrevetilde 0x1001eb5 /* U+1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE */ #define XK_Abrevebelowdot 0x1001eb6 /* U+1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */ #define XK_abrevebelowdot 0x1001eb7 /* U+1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */ #define XK_Ebelowdot 0x1001eb8 /* U+1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW */ #define XK_ebelowdot 0x1001eb9 /* U+1EB9 LATIN SMALL LETTER E WITH DOT BELOW */ #define XK_Ehook 0x1001eba /* U+1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE */ #define XK_ehook 0x1001ebb /* U+1EBB LATIN SMALL LETTER E WITH HOOK ABOVE */ #define XK_Etilde 0x1001ebc /* U+1EBC LATIN CAPITAL LETTER E WITH TILDE */ #define XK_etilde 0x1001ebd /* U+1EBD LATIN SMALL LETTER E WITH TILDE */ #define XK_Ecircumflexacute 0x1001ebe /* U+1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */ #define XK_ecircumflexacute 0x1001ebf /* U+1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */ #define XK_Ecircumflexgrave 0x1001ec0 /* U+1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */ #define XK_ecircumflexgrave 0x1001ec1 /* U+1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */ #define XK_Ecircumflexhook 0x1001ec2 /* U+1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ #define XK_ecircumflexhook 0x1001ec3 /* U+1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ #define XK_Ecircumflextilde 0x1001ec4 /* U+1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */ #define XK_ecircumflextilde 0x1001ec5 /* U+1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */ #define XK_Ecircumflexbelowdot 0x1001ec6 /* U+1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ #define XK_ecircumflexbelowdot 0x1001ec7 /* U+1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ #define XK_Ihook 0x1001ec8 /* U+1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE */ #define XK_ihook 0x1001ec9 /* U+1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE */ #define XK_Ibelowdot 0x1001eca /* U+1ECA LATIN CAPITAL LETTER I WITH DOT BELOW */ #define XK_ibelowdot 0x1001ecb /* U+1ECB LATIN SMALL LETTER I WITH DOT BELOW */ #define XK_Obelowdot 0x1001ecc /* U+1ECC LATIN CAPITAL LETTER O WITH DOT BELOW */ #define XK_obelowdot 0x1001ecd /* U+1ECD LATIN SMALL LETTER O WITH DOT BELOW */ #define XK_Ohook 0x1001ece /* U+1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE */ #define XK_ohook 0x1001ecf /* U+1ECF LATIN SMALL LETTER O WITH HOOK ABOVE */ #define XK_Ocircumflexacute 0x1001ed0 /* U+1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */ #define XK_ocircumflexacute 0x1001ed1 /* U+1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */ #define XK_Ocircumflexgrave 0x1001ed2 /* U+1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */ #define XK_ocircumflexgrave 0x1001ed3 /* U+1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */ #define XK_Ocircumflexhook 0x1001ed4 /* U+1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ #define XK_ocircumflexhook 0x1001ed5 /* U+1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ #define XK_Ocircumflextilde 0x1001ed6 /* U+1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */ #define XK_ocircumflextilde 0x1001ed7 /* U+1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */ #define XK_Ocircumflexbelowdot 0x1001ed8 /* U+1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ #define XK_ocircumflexbelowdot 0x1001ed9 /* U+1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ #define XK_Ohornacute 0x1001eda /* U+1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE */ #define XK_ohornacute 0x1001edb /* U+1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE */ #define XK_Ohorngrave 0x1001edc /* U+1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE */ #define XK_ohorngrave 0x1001edd /* U+1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE */ #define XK_Ohornhook 0x1001ede /* U+1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */ #define XK_ohornhook 0x1001edf /* U+1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */ #define XK_Ohorntilde 0x1001ee0 /* U+1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE */ #define XK_ohorntilde 0x1001ee1 /* U+1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE */ #define XK_Ohornbelowdot 0x1001ee2 /* U+1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */ #define XK_ohornbelowdot 0x1001ee3 /* U+1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW */ #define XK_Ubelowdot 0x1001ee4 /* U+1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW */ #define XK_ubelowdot 0x1001ee5 /* U+1EE5 LATIN SMALL LETTER U WITH DOT BELOW */ #define XK_Uhook 0x1001ee6 /* U+1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE */ #define XK_uhook 0x1001ee7 /* U+1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE */ #define XK_Uhornacute 0x1001ee8 /* U+1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE */ #define XK_uhornacute 0x1001ee9 /* U+1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE */ #define XK_Uhorngrave 0x1001eea /* U+1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE */ #define XK_uhorngrave 0x1001eeb /* U+1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE */ #define XK_Uhornhook 0x1001eec /* U+1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */ #define XK_uhornhook 0x1001eed /* U+1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */ #define XK_Uhorntilde 0x1001eee /* U+1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE */ #define XK_uhorntilde 0x1001eef /* U+1EEF LATIN SMALL LETTER U WITH HORN AND TILDE */ #define XK_Uhornbelowdot 0x1001ef0 /* U+1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */ #define XK_uhornbelowdot 0x1001ef1 /* U+1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW */ #define XK_Ybelowdot 0x1001ef4 /* U+1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW */ #define XK_ybelowdot 0x1001ef5 /* U+1EF5 LATIN SMALL LETTER Y WITH DOT BELOW */ #define XK_Yhook 0x1001ef6 /* U+1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE */ #define XK_yhook 0x1001ef7 /* U+1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE */ #define XK_Ytilde 0x1001ef8 /* U+1EF8 LATIN CAPITAL LETTER Y WITH TILDE */ #define XK_ytilde 0x1001ef9 /* U+1EF9 LATIN SMALL LETTER Y WITH TILDE */ #define XK_Ohorn 0x10001a0 /* U+01A0 LATIN CAPITAL LETTER O WITH HORN */ #define XK_ohorn 0x10001a1 /* U+01A1 LATIN SMALL LETTER O WITH HORN */ #define XK_Uhorn 0x10001af /* U+01AF LATIN CAPITAL LETTER U WITH HORN */ #define XK_uhorn 0x10001b0 /* U+01B0 LATIN SMALL LETTER U WITH HORN */ #endif /* XK_VIETNAMESE */ #ifdef XK_CURRENCY #define XK_EcuSign 0x10020a0 /* U+20A0 EURO-CURRENCY SIGN */ #define XK_ColonSign 0x10020a1 /* U+20A1 COLON SIGN */ #define XK_CruzeiroSign 0x10020a2 /* U+20A2 CRUZEIRO SIGN */ #define XK_FFrancSign 0x10020a3 /* U+20A3 FRENCH FRANC SIGN */ #define XK_LiraSign 0x10020a4 /* U+20A4 LIRA SIGN */ #define XK_MillSign 0x10020a5 /* U+20A5 MILL SIGN */ #define XK_NairaSign 0x10020a6 /* U+20A6 NAIRA SIGN */ #define XK_PesetaSign 0x10020a7 /* U+20A7 PESETA SIGN */ #define XK_RupeeSign 0x10020a8 /* U+20A8 RUPEE SIGN */ #define XK_WonSign 0x10020a9 /* U+20A9 WON SIGN */ #define XK_NewSheqelSign 0x10020aa /* U+20AA NEW SHEQEL SIGN */ #define XK_DongSign 0x10020ab /* U+20AB DONG SIGN */ #define XK_EuroSign 0x20ac /* U+20AC EURO SIGN */ #endif /* XK_CURRENCY */ #ifdef XK_MATHEMATICAL /* one, two and three are defined above. */ #define XK_zerosuperior 0x1002070 /* U+2070 SUPERSCRIPT ZERO */ #define XK_foursuperior 0x1002074 /* U+2074 SUPERSCRIPT FOUR */ #define XK_fivesuperior 0x1002075 /* U+2075 SUPERSCRIPT FIVE */ #define XK_sixsuperior 0x1002076 /* U+2076 SUPERSCRIPT SIX */ #define XK_sevensuperior 0x1002077 /* U+2077 SUPERSCRIPT SEVEN */ #define XK_eightsuperior 0x1002078 /* U+2078 SUPERSCRIPT EIGHT */ #define XK_ninesuperior 0x1002079 /* U+2079 SUPERSCRIPT NINE */ #define XK_zerosubscript 0x1002080 /* U+2080 SUBSCRIPT ZERO */ #define XK_onesubscript 0x1002081 /* U+2081 SUBSCRIPT ONE */ #define XK_twosubscript 0x1002082 /* U+2082 SUBSCRIPT TWO */ #define XK_threesubscript 0x1002083 /* U+2083 SUBSCRIPT THREE */ #define XK_foursubscript 0x1002084 /* U+2084 SUBSCRIPT FOUR */ #define XK_fivesubscript 0x1002085 /* U+2085 SUBSCRIPT FIVE */ #define XK_sixsubscript 0x1002086 /* U+2086 SUBSCRIPT SIX */ #define XK_sevensubscript 0x1002087 /* U+2087 SUBSCRIPT SEVEN */ #define XK_eightsubscript 0x1002088 /* U+2088 SUBSCRIPT EIGHT */ #define XK_ninesubscript 0x1002089 /* U+2089 SUBSCRIPT NINE */ #define XK_partdifferential 0x1002202 /* U+2202 PARTIAL DIFFERENTIAL */ #define XK_emptyset 0x1002205 /* U+2205 NULL SET */ #define XK_elementof 0x1002208 /* U+2208 ELEMENT OF */ #define XK_notelementof 0x1002209 /* U+2209 NOT AN ELEMENT OF */ #define XK_containsas 0x100220B /* U+220B CONTAINS AS MEMBER */ #define XK_squareroot 0x100221A /* U+221A SQUARE ROOT */ #define XK_cuberoot 0x100221B /* U+221B CUBE ROOT */ #define XK_fourthroot 0x100221C /* U+221C FOURTH ROOT */ #define XK_dintegral 0x100222C /* U+222C DOUBLE INTEGRAL */ #define XK_tintegral 0x100222D /* U+222D TRIPLE INTEGRAL */ #define XK_because 0x1002235 /* U+2235 BECAUSE */ #define XK_approxeq 0x1002248 /* U+2245 ALMOST EQUAL TO */ #define XK_notapproxeq 0x1002247 /* U+2247 NOT ALMOST EQUAL TO */ #define XK_notidentical 0x1002262 /* U+2262 NOT IDENTICAL TO */ #define XK_stricteq 0x1002263 /* U+2263 STRICTLY EQUIVALENT TO */ #endif /* XK_MATHEMATICAL */ #ifdef XK_BRAILLE #define XK_braille_dot_1 0xfff1 #define XK_braille_dot_2 0xfff2 #define XK_braille_dot_3 0xfff3 #define XK_braille_dot_4 0xfff4 #define XK_braille_dot_5 0xfff5 #define XK_braille_dot_6 0xfff6 #define XK_braille_dot_7 0xfff7 #define XK_braille_dot_8 0xfff8 #define XK_braille_dot_9 0xfff9 #define XK_braille_dot_10 0xfffa #define XK_braille_blank 0x1002800 /* U+2800 BRAILLE PATTERN BLANK */ #define XK_braille_dots_1 0x1002801 /* U+2801 BRAILLE PATTERN DOTS-1 */ #define XK_braille_dots_2 0x1002802 /* U+2802 BRAILLE PATTERN DOTS-2 */ #define XK_braille_dots_12 0x1002803 /* U+2803 BRAILLE PATTERN DOTS-12 */ #define XK_braille_dots_3 0x1002804 /* U+2804 BRAILLE PATTERN DOTS-3 */ #define XK_braille_dots_13 0x1002805 /* U+2805 BRAILLE PATTERN DOTS-13 */ #define XK_braille_dots_23 0x1002806 /* U+2806 BRAILLE PATTERN DOTS-23 */ #define XK_braille_dots_123 0x1002807 /* U+2807 BRAILLE PATTERN DOTS-123 */ #define XK_braille_dots_4 0x1002808 /* U+2808 BRAILLE PATTERN DOTS-4 */ #define XK_braille_dots_14 0x1002809 /* U+2809 BRAILLE PATTERN DOTS-14 */ #define XK_braille_dots_24 0x100280a /* U+280a BRAILLE PATTERN DOTS-24 */ #define XK_braille_dots_124 0x100280b /* U+280b BRAILLE PATTERN DOTS-124 */ #define XK_braille_dots_34 0x100280c /* U+280c BRAILLE PATTERN DOTS-34 */ #define XK_braille_dots_134 0x100280d /* U+280d BRAILLE PATTERN DOTS-134 */ #define XK_braille_dots_234 0x100280e /* U+280e BRAILLE PATTERN DOTS-234 */ #define XK_braille_dots_1234 0x100280f /* U+280f BRAILLE PATTERN DOTS-1234 */ #define XK_braille_dots_5 0x1002810 /* U+2810 BRAILLE PATTERN DOTS-5 */ #define XK_braille_dots_15 0x1002811 /* U+2811 BRAILLE PATTERN DOTS-15 */ #define XK_braille_dots_25 0x1002812 /* U+2812 BRAILLE PATTERN DOTS-25 */ #define XK_braille_dots_125 0x1002813 /* U+2813 BRAILLE PATTERN DOTS-125 */ #define XK_braille_dots_35 0x1002814 /* U+2814 BRAILLE PATTERN DOTS-35 */ #define XK_braille_dots_135 0x1002815 /* U+2815 BRAILLE PATTERN DOTS-135 */ #define XK_braille_dots_235 0x1002816 /* U+2816 BRAILLE PATTERN DOTS-235 */ #define XK_braille_dots_1235 0x1002817 /* U+2817 BRAILLE PATTERN DOTS-1235 */ #define XK_braille_dots_45 0x1002818 /* U+2818 BRAILLE PATTERN DOTS-45 */ #define XK_braille_dots_145 0x1002819 /* U+2819 BRAILLE PATTERN DOTS-145 */ #define XK_braille_dots_245 0x100281a /* U+281a BRAILLE PATTERN DOTS-245 */ #define XK_braille_dots_1245 0x100281b /* U+281b BRAILLE PATTERN DOTS-1245 */ #define XK_braille_dots_345 0x100281c /* U+281c BRAILLE PATTERN DOTS-345 */ #define XK_braille_dots_1345 0x100281d /* U+281d BRAILLE PATTERN DOTS-1345 */ #define XK_braille_dots_2345 0x100281e /* U+281e BRAILLE PATTERN DOTS-2345 */ #define XK_braille_dots_12345 0x100281f /* U+281f BRAILLE PATTERN DOTS-12345 */ #define XK_braille_dots_6 0x1002820 /* U+2820 BRAILLE PATTERN DOTS-6 */ #define XK_braille_dots_16 0x1002821 /* U+2821 BRAILLE PATTERN DOTS-16 */ #define XK_braille_dots_26 0x1002822 /* U+2822 BRAILLE PATTERN DOTS-26 */ #define XK_braille_dots_126 0x1002823 /* U+2823 BRAILLE PATTERN DOTS-126 */ #define XK_braille_dots_36 0x1002824 /* U+2824 BRAILLE PATTERN DOTS-36 */ #define XK_braille_dots_136 0x1002825 /* U+2825 BRAILLE PATTERN DOTS-136 */ #define XK_braille_dots_236 0x1002826 /* U+2826 BRAILLE PATTERN DOTS-236 */ #define XK_braille_dots_1236 0x1002827 /* U+2827 BRAILLE PATTERN DOTS-1236 */ #define XK_braille_dots_46 0x1002828 /* U+2828 BRAILLE PATTERN DOTS-46 */ #define XK_braille_dots_146 0x1002829 /* U+2829 BRAILLE PATTERN DOTS-146 */ #define XK_braille_dots_246 0x100282a /* U+282a BRAILLE PATTERN DOTS-246 */ #define XK_braille_dots_1246 0x100282b /* U+282b BRAILLE PATTERN DOTS-1246 */ #define XK_braille_dots_346 0x100282c /* U+282c BRAILLE PATTERN DOTS-346 */ #define XK_braille_dots_1346 0x100282d /* U+282d BRAILLE PATTERN DOTS-1346 */ #define XK_braille_dots_2346 0x100282e /* U+282e BRAILLE PATTERN DOTS-2346 */ #define XK_braille_dots_12346 0x100282f /* U+282f BRAILLE PATTERN DOTS-12346 */ #define XK_braille_dots_56 0x1002830 /* U+2830 BRAILLE PATTERN DOTS-56 */ #define XK_braille_dots_156 0x1002831 /* U+2831 BRAILLE PATTERN DOTS-156 */ #define XK_braille_dots_256 0x1002832 /* U+2832 BRAILLE PATTERN DOTS-256 */ #define XK_braille_dots_1256 0x1002833 /* U+2833 BRAILLE PATTERN DOTS-1256 */ #define XK_braille_dots_356 0x1002834 /* U+2834 BRAILLE PATTERN DOTS-356 */ #define XK_braille_dots_1356 0x1002835 /* U+2835 BRAILLE PATTERN DOTS-1356 */ #define XK_braille_dots_2356 0x1002836 /* U+2836 BRAILLE PATTERN DOTS-2356 */ #define XK_braille_dots_12356 0x1002837 /* U+2837 BRAILLE PATTERN DOTS-12356 */ #define XK_braille_dots_456 0x1002838 /* U+2838 BRAILLE PATTERN DOTS-456 */ #define XK_braille_dots_1456 0x1002839 /* U+2839 BRAILLE PATTERN DOTS-1456 */ #define XK_braille_dots_2456 0x100283a /* U+283a BRAILLE PATTERN DOTS-2456 */ #define XK_braille_dots_12456 0x100283b /* U+283b BRAILLE PATTERN DOTS-12456 */ #define XK_braille_dots_3456 0x100283c /* U+283c BRAILLE PATTERN DOTS-3456 */ #define XK_braille_dots_13456 0x100283d /* U+283d BRAILLE PATTERN DOTS-13456 */ #define XK_braille_dots_23456 0x100283e /* U+283e BRAILLE PATTERN DOTS-23456 */ #define XK_braille_dots_123456 0x100283f /* U+283f BRAILLE PATTERN DOTS-123456 */ #define XK_braille_dots_7 0x1002840 /* U+2840 BRAILLE PATTERN DOTS-7 */ #define XK_braille_dots_17 0x1002841 /* U+2841 BRAILLE PATTERN DOTS-17 */ #define XK_braille_dots_27 0x1002842 /* U+2842 BRAILLE PATTERN DOTS-27 */ #define XK_braille_dots_127 0x1002843 /* U+2843 BRAILLE PATTERN DOTS-127 */ #define XK_braille_dots_37 0x1002844 /* U+2844 BRAILLE PATTERN DOTS-37 */ #define XK_braille_dots_137 0x1002845 /* U+2845 BRAILLE PATTERN DOTS-137 */ #define XK_braille_dots_237 0x1002846 /* U+2846 BRAILLE PATTERN DOTS-237 */ #define XK_braille_dots_1237 0x1002847 /* U+2847 BRAILLE PATTERN DOTS-1237 */ #define XK_braille_dots_47 0x1002848 /* U+2848 BRAILLE PATTERN DOTS-47 */ #define XK_braille_dots_147 0x1002849 /* U+2849 BRAILLE PATTERN DOTS-147 */ #define XK_braille_dots_247 0x100284a /* U+284a BRAILLE PATTERN DOTS-247 */ #define XK_braille_dots_1247 0x100284b /* U+284b BRAILLE PATTERN DOTS-1247 */ #define XK_braille_dots_347 0x100284c /* U+284c BRAILLE PATTERN DOTS-347 */ #define XK_braille_dots_1347 0x100284d /* U+284d BRAILLE PATTERN DOTS-1347 */ #define XK_braille_dots_2347 0x100284e /* U+284e BRAILLE PATTERN DOTS-2347 */ #define XK_braille_dots_12347 0x100284f /* U+284f BRAILLE PATTERN DOTS-12347 */ #define XK_braille_dots_57 0x1002850 /* U+2850 BRAILLE PATTERN DOTS-57 */ #define XK_braille_dots_157 0x1002851 /* U+2851 BRAILLE PATTERN DOTS-157 */ #define XK_braille_dots_257 0x1002852 /* U+2852 BRAILLE PATTERN DOTS-257 */ #define XK_braille_dots_1257 0x1002853 /* U+2853 BRAILLE PATTERN DOTS-1257 */ #define XK_braille_dots_357 0x1002854 /* U+2854 BRAILLE PATTERN DOTS-357 */ #define XK_braille_dots_1357 0x1002855 /* U+2855 BRAILLE PATTERN DOTS-1357 */ #define XK_braille_dots_2357 0x1002856 /* U+2856 BRAILLE PATTERN DOTS-2357 */ #define XK_braille_dots_12357 0x1002857 /* U+2857 BRAILLE PATTERN DOTS-12357 */ #define XK_braille_dots_457 0x1002858 /* U+2858 BRAILLE PATTERN DOTS-457 */ #define XK_braille_dots_1457 0x1002859 /* U+2859 BRAILLE PATTERN DOTS-1457 */ #define XK_braille_dots_2457 0x100285a /* U+285a BRAILLE PATTERN DOTS-2457 */ #define XK_braille_dots_12457 0x100285b /* U+285b BRAILLE PATTERN DOTS-12457 */ #define XK_braille_dots_3457 0x100285c /* U+285c BRAILLE PATTERN DOTS-3457 */ #define XK_braille_dots_13457 0x100285d /* U+285d BRAILLE PATTERN DOTS-13457 */ #define XK_braille_dots_23457 0x100285e /* U+285e BRAILLE PATTERN DOTS-23457 */ #define XK_braille_dots_123457 0x100285f /* U+285f BRAILLE PATTERN DOTS-123457 */ #define XK_braille_dots_67 0x1002860 /* U+2860 BRAILLE PATTERN DOTS-67 */ #define XK_braille_dots_167 0x1002861 /* U+2861 BRAILLE PATTERN DOTS-167 */ #define XK_braille_dots_267 0x1002862 /* U+2862 BRAILLE PATTERN DOTS-267 */ #define XK_braille_dots_1267 0x1002863 /* U+2863 BRAILLE PATTERN DOTS-1267 */ #define XK_braille_dots_367 0x1002864 /* U+2864 BRAILLE PATTERN DOTS-367 */ #define XK_braille_dots_1367 0x1002865 /* U+2865 BRAILLE PATTERN DOTS-1367 */ #define XK_braille_dots_2367 0x1002866 /* U+2866 BRAILLE PATTERN DOTS-2367 */ #define XK_braille_dots_12367 0x1002867 /* U+2867 BRAILLE PATTERN DOTS-12367 */ #define XK_braille_dots_467 0x1002868 /* U+2868 BRAILLE PATTERN DOTS-467 */ #define XK_braille_dots_1467 0x1002869 /* U+2869 BRAILLE PATTERN DOTS-1467 */ #define XK_braille_dots_2467 0x100286a /* U+286a BRAILLE PATTERN DOTS-2467 */ #define XK_braille_dots_12467 0x100286b /* U+286b BRAILLE PATTERN DOTS-12467 */ #define XK_braille_dots_3467 0x100286c /* U+286c BRAILLE PATTERN DOTS-3467 */ #define XK_braille_dots_13467 0x100286d /* U+286d BRAILLE PATTERN DOTS-13467 */ #define XK_braille_dots_23467 0x100286e /* U+286e BRAILLE PATTERN DOTS-23467 */ #define XK_braille_dots_123467 0x100286f /* U+286f BRAILLE PATTERN DOTS-123467 */ #define XK_braille_dots_567 0x1002870 /* U+2870 BRAILLE PATTERN DOTS-567 */ #define XK_braille_dots_1567 0x1002871 /* U+2871 BRAILLE PATTERN DOTS-1567 */ #define XK_braille_dots_2567 0x1002872 /* U+2872 BRAILLE PATTERN DOTS-2567 */ #define XK_braille_dots_12567 0x1002873 /* U+2873 BRAILLE PATTERN DOTS-12567 */ #define XK_braille_dots_3567 0x1002874 /* U+2874 BRAILLE PATTERN DOTS-3567 */ #define XK_braille_dots_13567 0x1002875 /* U+2875 BRAILLE PATTERN DOTS-13567 */ #define XK_braille_dots_23567 0x1002876 /* U+2876 BRAILLE PATTERN DOTS-23567 */ #define XK_braille_dots_123567 0x1002877 /* U+2877 BRAILLE PATTERN DOTS-123567 */ #define XK_braille_dots_4567 0x1002878 /* U+2878 BRAILLE PATTERN DOTS-4567 */ #define XK_braille_dots_14567 0x1002879 /* U+2879 BRAILLE PATTERN DOTS-14567 */ #define XK_braille_dots_24567 0x100287a /* U+287a BRAILLE PATTERN DOTS-24567 */ #define XK_braille_dots_124567 0x100287b /* U+287b BRAILLE PATTERN DOTS-124567 */ #define XK_braille_dots_34567 0x100287c /* U+287c BRAILLE PATTERN DOTS-34567 */ #define XK_braille_dots_134567 0x100287d /* U+287d BRAILLE PATTERN DOTS-134567 */ #define XK_braille_dots_234567 0x100287e /* U+287e BRAILLE PATTERN DOTS-234567 */ #define XK_braille_dots_1234567 0x100287f /* U+287f BRAILLE PATTERN DOTS-1234567 */ #define XK_braille_dots_8 0x1002880 /* U+2880 BRAILLE PATTERN DOTS-8 */ #define XK_braille_dots_18 0x1002881 /* U+2881 BRAILLE PATTERN DOTS-18 */ #define XK_braille_dots_28 0x1002882 /* U+2882 BRAILLE PATTERN DOTS-28 */ #define XK_braille_dots_128 0x1002883 /* U+2883 BRAILLE PATTERN DOTS-128 */ #define XK_braille_dots_38 0x1002884 /* U+2884 BRAILLE PATTERN DOTS-38 */ #define XK_braille_dots_138 0x1002885 /* U+2885 BRAILLE PATTERN DOTS-138 */ #define XK_braille_dots_238 0x1002886 /* U+2886 BRAILLE PATTERN DOTS-238 */ #define XK_braille_dots_1238 0x1002887 /* U+2887 BRAILLE PATTERN DOTS-1238 */ #define XK_braille_dots_48 0x1002888 /* U+2888 BRAILLE PATTERN DOTS-48 */ #define XK_braille_dots_148 0x1002889 /* U+2889 BRAILLE PATTERN DOTS-148 */ #define XK_braille_dots_248 0x100288a /* U+288a BRAILLE PATTERN DOTS-248 */ #define XK_braille_dots_1248 0x100288b /* U+288b BRAILLE PATTERN DOTS-1248 */ #define XK_braille_dots_348 0x100288c /* U+288c BRAILLE PATTERN DOTS-348 */ #define XK_braille_dots_1348 0x100288d /* U+288d BRAILLE PATTERN DOTS-1348 */ #define XK_braille_dots_2348 0x100288e /* U+288e BRAILLE PATTERN DOTS-2348 */ #define XK_braille_dots_12348 0x100288f /* U+288f BRAILLE PATTERN DOTS-12348 */ #define XK_braille_dots_58 0x1002890 /* U+2890 BRAILLE PATTERN DOTS-58 */ #define XK_braille_dots_158 0x1002891 /* U+2891 BRAILLE PATTERN DOTS-158 */ #define XK_braille_dots_258 0x1002892 /* U+2892 BRAILLE PATTERN DOTS-258 */ #define XK_braille_dots_1258 0x1002893 /* U+2893 BRAILLE PATTERN DOTS-1258 */ #define XK_braille_dots_358 0x1002894 /* U+2894 BRAILLE PATTERN DOTS-358 */ #define XK_braille_dots_1358 0x1002895 /* U+2895 BRAILLE PATTERN DOTS-1358 */ #define XK_braille_dots_2358 0x1002896 /* U+2896 BRAILLE PATTERN DOTS-2358 */ #define XK_braille_dots_12358 0x1002897 /* U+2897 BRAILLE PATTERN DOTS-12358 */ #define XK_braille_dots_458 0x1002898 /* U+2898 BRAILLE PATTERN DOTS-458 */ #define XK_braille_dots_1458 0x1002899 /* U+2899 BRAILLE PATTERN DOTS-1458 */ #define XK_braille_dots_2458 0x100289a /* U+289a BRAILLE PATTERN DOTS-2458 */ #define XK_braille_dots_12458 0x100289b /* U+289b BRAILLE PATTERN DOTS-12458 */ #define XK_braille_dots_3458 0x100289c /* U+289c BRAILLE PATTERN DOTS-3458 */ #define XK_braille_dots_13458 0x100289d /* U+289d BRAILLE PATTERN DOTS-13458 */ #define XK_braille_dots_23458 0x100289e /* U+289e BRAILLE PATTERN DOTS-23458 */ #define XK_braille_dots_123458 0x100289f /* U+289f BRAILLE PATTERN DOTS-123458 */ #define XK_braille_dots_68 0x10028a0 /* U+28a0 BRAILLE PATTERN DOTS-68 */ #define XK_braille_dots_168 0x10028a1 /* U+28a1 BRAILLE PATTERN DOTS-168 */ #define XK_braille_dots_268 0x10028a2 /* U+28a2 BRAILLE PATTERN DOTS-268 */ #define XK_braille_dots_1268 0x10028a3 /* U+28a3 BRAILLE PATTERN DOTS-1268 */ #define XK_braille_dots_368 0x10028a4 /* U+28a4 BRAILLE PATTERN DOTS-368 */ #define XK_braille_dots_1368 0x10028a5 /* U+28a5 BRAILLE PATTERN DOTS-1368 */ #define XK_braille_dots_2368 0x10028a6 /* U+28a6 BRAILLE PATTERN DOTS-2368 */ #define XK_braille_dots_12368 0x10028a7 /* U+28a7 BRAILLE PATTERN DOTS-12368 */ #define XK_braille_dots_468 0x10028a8 /* U+28a8 BRAILLE PATTERN DOTS-468 */ #define XK_braille_dots_1468 0x10028a9 /* U+28a9 BRAILLE PATTERN DOTS-1468 */ #define XK_braille_dots_2468 0x10028aa /* U+28aa BRAILLE PATTERN DOTS-2468 */ #define XK_braille_dots_12468 0x10028ab /* U+28ab BRAILLE PATTERN DOTS-12468 */ #define XK_braille_dots_3468 0x10028ac /* U+28ac BRAILLE PATTERN DOTS-3468 */ #define XK_braille_dots_13468 0x10028ad /* U+28ad BRAILLE PATTERN DOTS-13468 */ #define XK_braille_dots_23468 0x10028ae /* U+28ae BRAILLE PATTERN DOTS-23468 */ #define XK_braille_dots_123468 0x10028af /* U+28af BRAILLE PATTERN DOTS-123468 */ #define XK_braille_dots_568 0x10028b0 /* U+28b0 BRAILLE PATTERN DOTS-568 */ #define XK_braille_dots_1568 0x10028b1 /* U+28b1 BRAILLE PATTERN DOTS-1568 */ #define XK_braille_dots_2568 0x10028b2 /* U+28b2 BRAILLE PATTERN DOTS-2568 */ #define XK_braille_dots_12568 0x10028b3 /* U+28b3 BRAILLE PATTERN DOTS-12568 */ #define XK_braille_dots_3568 0x10028b4 /* U+28b4 BRAILLE PATTERN DOTS-3568 */ #define XK_braille_dots_13568 0x10028b5 /* U+28b5 BRAILLE PATTERN DOTS-13568 */ #define XK_braille_dots_23568 0x10028b6 /* U+28b6 BRAILLE PATTERN DOTS-23568 */ #define XK_braille_dots_123568 0x10028b7 /* U+28b7 BRAILLE PATTERN DOTS-123568 */ #define XK_braille_dots_4568 0x10028b8 /* U+28b8 BRAILLE PATTERN DOTS-4568 */ #define XK_braille_dots_14568 0x10028b9 /* U+28b9 BRAILLE PATTERN DOTS-14568 */ #define XK_braille_dots_24568 0x10028ba /* U+28ba BRAILLE PATTERN DOTS-24568 */ #define XK_braille_dots_124568 0x10028bb /* U+28bb BRAILLE PATTERN DOTS-124568 */ #define XK_braille_dots_34568 0x10028bc /* U+28bc BRAILLE PATTERN DOTS-34568 */ #define XK_braille_dots_134568 0x10028bd /* U+28bd BRAILLE PATTERN DOTS-134568 */ #define XK_braille_dots_234568 0x10028be /* U+28be BRAILLE PATTERN DOTS-234568 */ #define XK_braille_dots_1234568 0x10028bf /* U+28bf BRAILLE PATTERN DOTS-1234568 */ #define XK_braille_dots_78 0x10028c0 /* U+28c0 BRAILLE PATTERN DOTS-78 */ #define XK_braille_dots_178 0x10028c1 /* U+28c1 BRAILLE PATTERN DOTS-178 */ #define XK_braille_dots_278 0x10028c2 /* U+28c2 BRAILLE PATTERN DOTS-278 */ #define XK_braille_dots_1278 0x10028c3 /* U+28c3 BRAILLE PATTERN DOTS-1278 */ #define XK_braille_dots_378 0x10028c4 /* U+28c4 BRAILLE PATTERN DOTS-378 */ #define XK_braille_dots_1378 0x10028c5 /* U+28c5 BRAILLE PATTERN DOTS-1378 */ #define XK_braille_dots_2378 0x10028c6 /* U+28c6 BRAILLE PATTERN DOTS-2378 */ #define XK_braille_dots_12378 0x10028c7 /* U+28c7 BRAILLE PATTERN DOTS-12378 */ #define XK_braille_dots_478 0x10028c8 /* U+28c8 BRAILLE PATTERN DOTS-478 */ #define XK_braille_dots_1478 0x10028c9 /* U+28c9 BRAILLE PATTERN DOTS-1478 */ #define XK_braille_dots_2478 0x10028ca /* U+28ca BRAILLE PATTERN DOTS-2478 */ #define XK_braille_dots_12478 0x10028cb /* U+28cb BRAILLE PATTERN DOTS-12478 */ #define XK_braille_dots_3478 0x10028cc /* U+28cc BRAILLE PATTERN DOTS-3478 */ #define XK_braille_dots_13478 0x10028cd /* U+28cd BRAILLE PATTERN DOTS-13478 */ #define XK_braille_dots_23478 0x10028ce /* U+28ce BRAILLE PATTERN DOTS-23478 */ #define XK_braille_dots_123478 0x10028cf /* U+28cf BRAILLE PATTERN DOTS-123478 */ #define XK_braille_dots_578 0x10028d0 /* U+28d0 BRAILLE PATTERN DOTS-578 */ #define XK_braille_dots_1578 0x10028d1 /* U+28d1 BRAILLE PATTERN DOTS-1578 */ #define XK_braille_dots_2578 0x10028d2 /* U+28d2 BRAILLE PATTERN DOTS-2578 */ #define XK_braille_dots_12578 0x10028d3 /* U+28d3 BRAILLE PATTERN DOTS-12578 */ #define XK_braille_dots_3578 0x10028d4 /* U+28d4 BRAILLE PATTERN DOTS-3578 */ #define XK_braille_dots_13578 0x10028d5 /* U+28d5 BRAILLE PATTERN DOTS-13578 */ #define XK_braille_dots_23578 0x10028d6 /* U+28d6 BRAILLE PATTERN DOTS-23578 */ #define XK_braille_dots_123578 0x10028d7 /* U+28d7 BRAILLE PATTERN DOTS-123578 */ #define XK_braille_dots_4578 0x10028d8 /* U+28d8 BRAILLE PATTERN DOTS-4578 */ #define XK_braille_dots_14578 0x10028d9 /* U+28d9 BRAILLE PATTERN DOTS-14578 */ #define XK_braille_dots_24578 0x10028da /* U+28da BRAILLE PATTERN DOTS-24578 */ #define XK_braille_dots_124578 0x10028db /* U+28db BRAILLE PATTERN DOTS-124578 */ #define XK_braille_dots_34578 0x10028dc /* U+28dc BRAILLE PATTERN DOTS-34578 */ #define XK_braille_dots_134578 0x10028dd /* U+28dd BRAILLE PATTERN DOTS-134578 */ #define XK_braille_dots_234578 0x10028de /* U+28de BRAILLE PATTERN DOTS-234578 */ #define XK_braille_dots_1234578 0x10028df /* U+28df BRAILLE PATTERN DOTS-1234578 */ #define XK_braille_dots_678 0x10028e0 /* U+28e0 BRAILLE PATTERN DOTS-678 */ #define XK_braille_dots_1678 0x10028e1 /* U+28e1 BRAILLE PATTERN DOTS-1678 */ #define XK_braille_dots_2678 0x10028e2 /* U+28e2 BRAILLE PATTERN DOTS-2678 */ #define XK_braille_dots_12678 0x10028e3 /* U+28e3 BRAILLE PATTERN DOTS-12678 */ #define XK_braille_dots_3678 0x10028e4 /* U+28e4 BRAILLE PATTERN DOTS-3678 */ #define XK_braille_dots_13678 0x10028e5 /* U+28e5 BRAILLE PATTERN DOTS-13678 */ #define XK_braille_dots_23678 0x10028e6 /* U+28e6 BRAILLE PATTERN DOTS-23678 */ #define XK_braille_dots_123678 0x10028e7 /* U+28e7 BRAILLE PATTERN DOTS-123678 */ #define XK_braille_dots_4678 0x10028e8 /* U+28e8 BRAILLE PATTERN DOTS-4678 */ #define XK_braille_dots_14678 0x10028e9 /* U+28e9 BRAILLE PATTERN DOTS-14678 */ #define XK_braille_dots_24678 0x10028ea /* U+28ea BRAILLE PATTERN DOTS-24678 */ #define XK_braille_dots_124678 0x10028eb /* U+28eb BRAILLE PATTERN DOTS-124678 */ #define XK_braille_dots_34678 0x10028ec /* U+28ec BRAILLE PATTERN DOTS-34678 */ #define XK_braille_dots_134678 0x10028ed /* U+28ed BRAILLE PATTERN DOTS-134678 */ #define XK_braille_dots_234678 0x10028ee /* U+28ee BRAILLE PATTERN DOTS-234678 */ #define XK_braille_dots_1234678 0x10028ef /* U+28ef BRAILLE PATTERN DOTS-1234678 */ #define XK_braille_dots_5678 0x10028f0 /* U+28f0 BRAILLE PATTERN DOTS-5678 */ #define XK_braille_dots_15678 0x10028f1 /* U+28f1 BRAILLE PATTERN DOTS-15678 */ #define XK_braille_dots_25678 0x10028f2 /* U+28f2 BRAILLE PATTERN DOTS-25678 */ #define XK_braille_dots_125678 0x10028f3 /* U+28f3 BRAILLE PATTERN DOTS-125678 */ #define XK_braille_dots_35678 0x10028f4 /* U+28f4 BRAILLE PATTERN DOTS-35678 */ #define XK_braille_dots_135678 0x10028f5 /* U+28f5 BRAILLE PATTERN DOTS-135678 */ #define XK_braille_dots_235678 0x10028f6 /* U+28f6 BRAILLE PATTERN DOTS-235678 */ #define XK_braille_dots_1235678 0x10028f7 /* U+28f7 BRAILLE PATTERN DOTS-1235678 */ #define XK_braille_dots_45678 0x10028f8 /* U+28f8 BRAILLE PATTERN DOTS-45678 */ #define XK_braille_dots_145678 0x10028f9 /* U+28f9 BRAILLE PATTERN DOTS-145678 */ #define XK_braille_dots_245678 0x10028fa /* U+28fa BRAILLE PATTERN DOTS-245678 */ #define XK_braille_dots_1245678 0x10028fb /* U+28fb BRAILLE PATTERN DOTS-1245678 */ #define XK_braille_dots_345678 0x10028fc /* U+28fc BRAILLE PATTERN DOTS-345678 */ #define XK_braille_dots_1345678 0x10028fd /* U+28fd BRAILLE PATTERN DOTS-1345678 */ #define XK_braille_dots_2345678 0x10028fe /* U+28fe BRAILLE PATTERN DOTS-2345678 */ #define XK_braille_dots_12345678 0x10028ff /* U+28ff BRAILLE PATTERN DOTS-12345678 */ #endif /* XK_BRAILLE */ /* * Sinhala (http://unicode.org/charts/PDF/U0D80.pdf) * http://www.nongnu.org/sinhala/doc/transliteration/sinhala-transliteration_6.html */ #ifdef XK_SINHALA #define XK_Sinh_ng 0x1000d82 /* U+0D82 SINHALA ANUSVARAYA */ #define XK_Sinh_h2 0x1000d83 /* U+0D83 SINHALA VISARGAYA */ #define XK_Sinh_a 0x1000d85 /* U+0D85 SINHALA AYANNA */ #define XK_Sinh_aa 0x1000d86 /* U+0D86 SINHALA AAYANNA */ #define XK_Sinh_ae 0x1000d87 /* U+0D87 SINHALA AEYANNA */ #define XK_Sinh_aee 0x1000d88 /* U+0D88 SINHALA AEEYANNA */ #define XK_Sinh_i 0x1000d89 /* U+0D89 SINHALA IYANNA */ #define XK_Sinh_ii 0x1000d8a /* U+0D8A SINHALA IIYANNA */ #define XK_Sinh_u 0x1000d8b /* U+0D8B SINHALA UYANNA */ #define XK_Sinh_uu 0x1000d8c /* U+0D8C SINHALA UUYANNA */ #define XK_Sinh_ri 0x1000d8d /* U+0D8D SINHALA IRUYANNA */ #define XK_Sinh_rii 0x1000d8e /* U+0D8E SINHALA IRUUYANNA */ #define XK_Sinh_lu 0x1000d8f /* U+0D8F SINHALA ILUYANNA */ #define XK_Sinh_luu 0x1000d90 /* U+0D90 SINHALA ILUUYANNA */ #define XK_Sinh_e 0x1000d91 /* U+0D91 SINHALA EYANNA */ #define XK_Sinh_ee 0x1000d92 /* U+0D92 SINHALA EEYANNA */ #define XK_Sinh_ai 0x1000d93 /* U+0D93 SINHALA AIYANNA */ #define XK_Sinh_o 0x1000d94 /* U+0D94 SINHALA OYANNA */ #define XK_Sinh_oo 0x1000d95 /* U+0D95 SINHALA OOYANNA */ #define XK_Sinh_au 0x1000d96 /* U+0D96 SINHALA AUYANNA */ #define XK_Sinh_ka 0x1000d9a /* U+0D9A SINHALA KAYANNA */ #define XK_Sinh_kha 0x1000d9b /* U+0D9B SINHALA MAHA. KAYANNA */ #define XK_Sinh_ga 0x1000d9c /* U+0D9C SINHALA GAYANNA */ #define XK_Sinh_gha 0x1000d9d /* U+0D9D SINHALA MAHA. GAYANNA */ #define XK_Sinh_ng2 0x1000d9e /* U+0D9E SINHALA KANTAJA NAASIKYAYA */ #define XK_Sinh_nga 0x1000d9f /* U+0D9F SINHALA SANYAKA GAYANNA */ #define XK_Sinh_ca 0x1000da0 /* U+0DA0 SINHALA CAYANNA */ #define XK_Sinh_cha 0x1000da1 /* U+0DA1 SINHALA MAHA. CAYANNA */ #define XK_Sinh_ja 0x1000da2 /* U+0DA2 SINHALA JAYANNA */ #define XK_Sinh_jha 0x1000da3 /* U+0DA3 SINHALA MAHA. JAYANNA */ #define XK_Sinh_nya 0x1000da4 /* U+0DA4 SINHALA TAALUJA NAASIKYAYA */ #define XK_Sinh_jnya 0x1000da5 /* U+0DA5 SINHALA TAALUJA SANYOOGA NAASIKYAYA */ #define XK_Sinh_nja 0x1000da6 /* U+0DA6 SINHALA SANYAKA JAYANNA */ #define XK_Sinh_tta 0x1000da7 /* U+0DA7 SINHALA TTAYANNA */ #define XK_Sinh_ttha 0x1000da8 /* U+0DA8 SINHALA MAHA. TTAYANNA */ #define XK_Sinh_dda 0x1000da9 /* U+0DA9 SINHALA DDAYANNA */ #define XK_Sinh_ddha 0x1000daa /* U+0DAA SINHALA MAHA. DDAYANNA */ #define XK_Sinh_nna 0x1000dab /* U+0DAB SINHALA MUURDHAJA NAYANNA */ #define XK_Sinh_ndda 0x1000dac /* U+0DAC SINHALA SANYAKA DDAYANNA */ #define XK_Sinh_tha 0x1000dad /* U+0DAD SINHALA TAYANNA */ #define XK_Sinh_thha 0x1000dae /* U+0DAE SINHALA MAHA. TAYANNA */ #define XK_Sinh_dha 0x1000daf /* U+0DAF SINHALA DAYANNA */ #define XK_Sinh_dhha 0x1000db0 /* U+0DB0 SINHALA MAHA. DAYANNA */ #define XK_Sinh_na 0x1000db1 /* U+0DB1 SINHALA DANTAJA NAYANNA */ #define XK_Sinh_ndha 0x1000db3 /* U+0DB3 SINHALA SANYAKA DAYANNA */ #define XK_Sinh_pa 0x1000db4 /* U+0DB4 SINHALA PAYANNA */ #define XK_Sinh_pha 0x1000db5 /* U+0DB5 SINHALA MAHA. PAYANNA */ #define XK_Sinh_ba 0x1000db6 /* U+0DB6 SINHALA BAYANNA */ #define XK_Sinh_bha 0x1000db7 /* U+0DB7 SINHALA MAHA. BAYANNA */ #define XK_Sinh_ma 0x1000db8 /* U+0DB8 SINHALA MAYANNA */ #define XK_Sinh_mba 0x1000db9 /* U+0DB9 SINHALA AMBA BAYANNA */ #define XK_Sinh_ya 0x1000dba /* U+0DBA SINHALA YAYANNA */ #define XK_Sinh_ra 0x1000dbb /* U+0DBB SINHALA RAYANNA */ #define XK_Sinh_la 0x1000dbd /* U+0DBD SINHALA DANTAJA LAYANNA */ #define XK_Sinh_va 0x1000dc0 /* U+0DC0 SINHALA VAYANNA */ #define XK_Sinh_sha 0x1000dc1 /* U+0DC1 SINHALA TAALUJA SAYANNA */ #define XK_Sinh_ssha 0x1000dc2 /* U+0DC2 SINHALA MUURDHAJA SAYANNA */ #define XK_Sinh_sa 0x1000dc3 /* U+0DC3 SINHALA DANTAJA SAYANNA */ #define XK_Sinh_ha 0x1000dc4 /* U+0DC4 SINHALA HAYANNA */ #define XK_Sinh_lla 0x1000dc5 /* U+0DC5 SINHALA MUURDHAJA LAYANNA */ #define XK_Sinh_fa 0x1000dc6 /* U+0DC6 SINHALA FAYANNA */ #define XK_Sinh_al 0x1000dca /* U+0DCA SINHALA AL-LAKUNA */ #define XK_Sinh_aa2 0x1000dcf /* U+0DCF SINHALA AELA-PILLA */ #define XK_Sinh_ae2 0x1000dd0 /* U+0DD0 SINHALA AEDA-PILLA */ #define XK_Sinh_aee2 0x1000dd1 /* U+0DD1 SINHALA DIGA AEDA-PILLA */ #define XK_Sinh_i2 0x1000dd2 /* U+0DD2 SINHALA IS-PILLA */ #define XK_Sinh_ii2 0x1000dd3 /* U+0DD3 SINHALA DIGA IS-PILLA */ #define XK_Sinh_u2 0x1000dd4 /* U+0DD4 SINHALA PAA-PILLA */ #define XK_Sinh_uu2 0x1000dd6 /* U+0DD6 SINHALA DIGA PAA-PILLA */ #define XK_Sinh_ru2 0x1000dd8 /* U+0DD8 SINHALA GAETTA-PILLA */ #define XK_Sinh_e2 0x1000dd9 /* U+0DD9 SINHALA KOMBUVA */ #define XK_Sinh_ee2 0x1000dda /* U+0DDA SINHALA DIGA KOMBUVA */ #define XK_Sinh_ai2 0x1000ddb /* U+0DDB SINHALA KOMBU DEKA */ #define XK_Sinh_o2 0x1000ddc /* U+0DDC SINHALA KOMBUVA HAA AELA-PILLA*/ #define XK_Sinh_oo2 0x1000ddd /* U+0DDD SINHALA KOMBUVA HAA DIGA AELA-PILLA*/ #define XK_Sinh_au2 0x1000dde /* U+0DDE SINHALA KOMBUVA HAA GAYANUKITTA */ #define XK_Sinh_lu2 0x1000ddf /* U+0DDF SINHALA GAYANUKITTA */ #define XK_Sinh_ruu2 0x1000df2 /* U+0DF2 SINHALA DIGA GAETTA-PILLA */ #define XK_Sinh_luu2 0x1000df3 /* U+0DF3 SINHALA DIGA GAYANUKITTA */ #define XK_Sinh_kunddaliya 0x1000df4 /* U+0DF4 SINHALA KUNDDALIYA */ #endif /* XK_SINHALA */ ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="axe11" PKG_VERSION="77813264827823bcbd617ca0f2b2da3e6abb1e7a" PKG_SHA256="bcdc27316bba492af9f05d25dc07f2a2ac718807393796fc87b2c794bd458e14" PKG_LICENSE="GPL" PKG_SITE="https://github.com/JohnnyonFlame/axe11" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain gl4es" PKG_LONGDESC="A Proof-of-Concept libX11 Shim for Gamemaker Games to run under Box86 with GL4ES (and the necessary set of hacks on top of it)." pre_configure_target() { sed -i "s|sdl2-config|${SYSROOT_PREFIX}/usr/bin/sdl2-config|g" Makefile # Temp copy the X11 header files cp -r ${PKG_DIR}/X11 ${SYSROOT_PREFIX}/usr/include } post_make_target() { # Remove X11 header files rm -rf ${SYSROOT_PREFIX}/usr/include/X11 } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib cp -rf ${PKG_BUILD}/build/libs/*.so ${INSTALL}/usr/lib } ================================================ FILE: packages/sx05re/tools/video/gl4es/axe11/patches/01-EmuELEC-compile-fix.patch ================================================ --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ -CROSS_PREFIX=arm-linux-gnueabihf- -CCACHE?= -CC=$(CCACHE) $(CROSS_PREFIX)gcc +#CROSS_PREFIX=arm-linux-gnueabihf- +#CCACHE?= +#CC=$(CCACHE) $(CROSS_PREFIX)gcc SDL_CONFIG=$(CROSS_PREFIX)pkg-config sdl2 USE_SDL?=1 ================================================ FILE: packages/sx05re/tools/video/gl4es/libglu/gl.pc ================================================ prefix=/usr exec_prefix=${prefix} libdir=/usr/lib includedir=${prefix}/include Name: gl Description: gl4es gl library Version: 0.1.0 Libs: -L${libdir} -lGL Cflags: -I${includedir} ================================================ FILE: packages/sx05re/tools/video/gl4es/libglu/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="libglu" PKG_VERSION="2fed2bda2b725d2b9e32c435b48d5141cc95827f" PKG_SHA256="8a016d32fc1fed742f10ba8e4bc32151598f6273a0dbabec15ba47c44151c879" PKG_LICENSE="GPL" PKG_SITE="https://github.com/ptitSeb/GLU" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain gl4es" PKG_LONGDESC=" GL4ES is a OpenGL 2.1/1.5 to GL ES 2.0/1.1 translation library, with support for Pandora, ODroid, OrangePI, CHIP, Raspberry PI, Android, Emscripten and AmigaOS4. " PKG_CONFIGURE_OPTS_TARGET="--disable-static --enable-shared" pre_configure_target() { cp -rf $(get_install_dir gl4es)/usr/lib/libGL.so* ${SYSROOT_PREFIX}/usr/lib/ cp -rf $(get_build_dir gl4es)/include/GL/gl.h ${SYSROOT_PREFIX}/usr/include/GL/gl.h cp -rf ${PKG_DIR}/gl.pc ${SYSROOT_PREFIX}/usr/lib/pkgconfig } post_install_target() { rm ${SYSROOT_PREFIX}/usr/lib/libGL.so rm ${SYSROOT_PREFIX}/usr/include/GL/gl.h rm ${SYSROOT_PREFIX}/usr/lib/pkgconfig/gl.pc } ================================================ FILE: packages/sx05re/tools/video/gl4es/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="gl4es" PKG_VERSION="83b074dcb0028e239da2ad9789db80cc1d5f2544" PKG_SHA256="2031be77b49398cdf945c110e59530a48113c35fd69c0a7381be21fc9eaccc79" PKG_GIT_CLONE_BRANCH="sk_hacks" PKG_SITE="https://github.com/JohnnyonFlame/gl4es" PKG_LICENSE="GPL" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ${OPENGLES}" PKG_LONGDESC=" GL4ES is a OpenGL 2.1/1.5 to GL ES 2.0/1.1 translation library, with support for Pandora, ODroid, OrangePI, CHIP, Raspberry PI, Android, Emscripten and AmigaOS4. " PKG_TOOLCHAIN="cmake-make" pre_configure_target() { if [[ "${DEVICE}" == "Amlogic"* ]]; then PKG_CMAKE_OPTS_TARGET=" -DNOX11=1 -DODROID=1 -DGBM=OFF -DCMAKE_BUILD_TYPE=Release " else PKG_CMAKE_OPTS_TARGET=" -DNOX11=1 -DODROID=1 -DGBM=ON -DCMAKE_BUILD_TYPE=Release " fi } makeinstall_target(){ mkdir -p ${INSTALL}/usr/lib/ cp ${PKG_BUILD}/lib/libGL.so.1 ${INSTALL}/usr/lib/libGL.so ln -sf libGL.so ${INSTALL}/usr/lib/libGL.so.1 } # If we want to install gl4es to toolchain uncomment the following lines, keep in mind GL will now be available fore the build system and some programs might break, like Scummvm Stand Alone #post_makeinstall_target() { #cp -rf ${INSTALL}/usr/lib/libGL.so.1 ${SYSROOT_PREFIX}/usr/lib/libGL.so #ln -sf ${SYSROOT_PREFIX}/usr/lib/libGL.so ${SYSROOT_PREFIX}/usr/lib/libGL.so.1 #cp -rf ${PKG_BUILD}/include/* ${SYSROOT_PREFIX}/usr/include #cp -rf ${PKG_DIR}/pkgconfig/gl.pc ${SYSROOT_PREFIX}/usr/lib/pkgconfig #} ================================================ FILE: packages/sx05re/tools/video/gl4es/pkgconfig/gl.pc ================================================ prefix=/usr exec_prefix=${prefix} libdir=/usr/lib includedir=${prefix}/include Name: gl Description: gl4es gl library Version: 0.1.0 Libs: -L${libdir} -lGL Cflags: -I${includedir} ================================================ FILE: packages/sx05re/tools/video/imagemagick/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="imagemagick" PKG_VERSION="2c4205d20c5495f15d706c26084eb327d4b859bb" PKG_SHA256="0d038fa15f28e290bb8850c8fc954bc899b007d1ec1d09b88900d4bc14c53e31" PKG_LICENSE="http://www.imagemagick.org/script/license.php" PKG_SITE="https://github.com/ImageMagick/ImageMagick" PKG_URL="https://github.com/ImageMagick/ImageMagick/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Software suite to create, edit, compose, or convert bitmap images" PKG_CONFIGURE_OPTS_TARGET="--disable-openmp \ --disable-static \ --enable-shared \ --with-pango=no \ --with-utilities=yes \ --with-x=no" makeinstall_target() { make install DESTDIR=${INSTALL} ${PKG_MAKEINSTALL_OPTS_TARGET} rm ${INSTALL}/usr/bin/*config } ================================================ FILE: packages/sx05re/tools/video/libdvbpsi/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="libdvbpsi" PKG_VERSION="1.3.0" PKG_SHA256="a2fed1d11980662f919bbd1f29e2462719e0f6227e1a531310bd5a706db0a1fe" PKG_REV="2" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.videolan.org/developers/libdvbpsi.html" PKG_URL="http://download.videolan.org/pub/libdvbpsi/${PKG_VERSION}/libdvbpsi-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="tools" PKG_SHORTDESC="library for MPEG TS and DVB PSI tables decoding and generating" PKG_LONGDESC="libdvbpsi is a simple library designed for MPEG TS and DVB PSI tables decoding and generating." PKG_IS_ADDON="no" PKG_AUTORECONF="yes" PKG_CONFIGURE_OPTS_TARGET="--enable-static --disable-shared" ================================================ FILE: packages/sx05re/tools/video/mpv/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="mpv" PKG_VERSION="bb5b4b1ba61b67da40c85c34376aced9383fc366" PKG_SHA256="452b0368120be80f9d19c766812e0903245c755d59225efa1dfb4d43da779588" PKG_LICENSE="GPLv2+" PKG_SITE="https://github.com/mpv-player/mpv" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ffmpeg SDL2 youtube-dl libass" PKG_LONGDESC="Video player based on MPlayer/mplayer2 https://mpv.io" PKG_TOOLCHAIN="manual" pre_configure_target() { WAFRELEASE="waf-2.0.20" WAFURL="https://waf.io/${WAFRELEASE}" if [ ! -e ${SOURCES}/${PKG_NAME}/waf ]; then wget "${WAFURL}" -O "${SOURCES}/${PKG_NAME}/waf" || echo "Could not download waf $?" chmod +x "${SOURCES}/${PKG_NAME}/waf" fi cp ${SOURCES}/${PKG_NAME}/waf ${PKG_BUILD} } configure_target() { #./bootstrap.py # the bootstrap was failing for some reason. cd ${PKG_BUILD} if [[ "${DEVICE}" == "OdroidGoAdvance" || "${DEVICE}" == "GameForce" ]]; then ./waf configure --enable-sdl2 --enable-sdl2-gamepad --disable-pulse --enable-egl --disable-libbluray --enable-drm --disable-gl else ./waf configure --enable-libmpv-shared --enable-sdl2 --enable-sdl2-gamepad --disable-pulse --enable-egl --disable-libbluray --disable-drm --disable-gl fi } make_target() { ./waf build } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ./build/mpv ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/tools/video/vlc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="vlc" PKG_VERSION="3.0.17.4" PKG_SHA256="8c5a62d88a4fb45c1b095cf10befef217dfa87aedcec5184b9e7d590b6dd4133" PKG_REV="20211025" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.videolan.org" PKG_URL="https://download.videolan.org/pub/videolan/${PKG_NAME}/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libdvbpsi gnutls ffmpeg libmpeg2 zlib flac libvorbis libxml2 pulseaudio mpg123-compat x264" PKG_SHORTDESC="VideoLAN multimedia player and streamer" PKG_LONGDESC="VLC is the VideoLAN project's media player. It plays MPEG, MPEG2, MPEG4, DivX, MOV, WMV, QuickTime, mp3, Ogg/Vorbis files, DVDs, VCDs, and multimedia streams from various network sources." pre_configure_target() { ENABLED_FEATURES="--enable-silent-rules \ --enable-run-as-root \ --enable-sout \ --enable-vlm \ --enable-v4l2 \ --enable-mpc \ --enable-avcodec \ --enable-avformat \ --enable-swscale \ --enable-postproc \ --enable-aa \ --enable-libmpeg2 \ --enable-png \ --enable-jpeg \ --enable-libxml2 \ --enable-alsa \ --enable-udev \ --enable-vlc \ --enable-neon \ --enable-x264 \ --enable-gles2" DISABLED_FEATURES="--disable-dependency-tracking \ --without-contrib \ --disable-nls \ --disable-rpath \ --disable-dbus \ --disable-gprof \ --disable-cprof \ --disable-debug \ --disable-coverage \ --disable-lua \ --disable-notify \ --disable-taglib \ --disable-live555 \ --disable-dc1394 \ --disable-dvdread \ --disable-dvdnav \ --disable-opencv \ --disable-decklink \ --disable-sftp \ --disable-vcd \ --disable-libcddb \ --disable-dvbpsi \ --disable-screen \ --disable-ogg \ --disable-shout\ --disable-mod \ --disable-gme \ --disable-wma-fixed \ --disable-shine \ --disable-omxil \ --disable-mad \ --disable-merge-ffmpeg \ --disable-faad \ --disable-flac \ --disable-twolame \ --disable-realrtsp \ --disable-libtar \ --disable-a52 \ --disable-dca \ --disable-vorbis \ --disable-tremor \ --disable-speex \ --disable-theora \ --disable-schroedinger \ --disable-fluidsynth \ --disable-zvbi \ --disable-telx \ --disable-libass \ --disable-kate \ --disable-tiger \ --disable-libva \ --disable-vdpau \ --without-x \ --disable-xcb \ --disable-xvideo \ --disable-sdl-image \ --disable-freetype \ --disable-fribidi \ --disable-fontconfig \ --disable-svg \ --disable-directx \ --disable-caca \ --disable-oss \ --disable-jack \ --disable-upnp \ --disable-skins2 \ --disable-kai \ --disable-macosx \ --disable-ncurses \ --disable-goom \ --disable-projectm \ --disable-mtp \ --disable-lirc \ --disable-libgcrypt \ --disable-update-check \ --disable-kva \ --disable-bluray \ --disable-samplerate \ --disable-sid \ --disable-crystalhd \ --disable-dxva2 \ --disable-dav1d \ --disable-qt \ --disable-x26410b \ --disable-chromecast \ --disable-static \ --disable-a52 \ --disable-addonmanagermodules \ --disable-aom \ --disable-aribb25 \ --disable-aribsub \ --disable-asdcp \ --disable-bpg \ --disable-caca \ --disable-chromaprint \ --disable-chromecast \ --disable-crystalhd \ --disable-dc1394 \ --disable-dca \ --disable-decklink \ --disable-dsm \ --disable-dv1394 \ --disable-fluidlite \ --disable-gme \ --disable-goom \ --disable-jack \ --disable-kai \ --disable-kate \ --disable-kva \ --disable-libplacebo \ --disable-linsys \ --disable-mfx \ --disable-microdns \ --disable-mmal \ --disable-mtp \ --disable-notify \ --disable-projectm \ --disable-shine \ --disable-shout \ --disable-sndio \ --disable-spatialaudio \ --disable-srt \ --disable-telx \ --disable-tiger \ --disable-twolame \ --disable-vdpau \ --disable-vsxu \ --disable-wasapi \ --disable-x262 \ --disable-zvbi" if [ "${DEVICE}" == "Amlogic-old" ]; then ENABLED_FEATURES+=" --enable-pulse" else DISABLED_FEATURES+=" --disable-pulse" fi PKG_CONFIGURE_OPTS_TARGET="${ENABLED_FEATURES} ${DISABLED_FEATURES}" export LDFLAGS="${LDFLAGS} -lresolv -fopenmp" } post_makeinstall_target() { rm -fr ${INSTALL}/usr/share/applications rm -fr ${INSTALL}/usr/share/icons rm -fr ${INSTALL}/usr/share/kde4 rm -f ${INSTALL}/usr/bin/rvlc rm -f ${INSTALL}/usr/bin/vlc-wrapper mkdir -p ${INSTALL}/usr/config mv -f ${INSTALL}/usr/lib/vlc ${INSTALL}/usr/config ln -sf /storage/.config/vlc ${INSTALL}/usr/lib/vlc } ================================================ FILE: packages/sx05re/tools/video/youtube-dl/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="youtube-dl" PKG_VERSION="2024.08.07" PKG_SHA256="9d6bd98d082338b9c532631270bfdf74ec1c8e8aa8ee37823d377c8817da7f61" PKG_LICENSE="The Unlicense" PKG_SITE="https://github.com/ytdl-org/youtube-dl" PKG_URL="https://github.com/ytdl-org/ytdl-nightly/releases/download/${PKG_VERSION}/youtube-dl" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Command-line program to download videos from YouTube.com and other video sites" PKG_TOOLCHAIN="manual" unpack() { : } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -rf ${SOURCES}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.youtube-dl ${INSTALL}/usr/bin/youtube-dl chmod +x ${INSTALL}/usr/bin/youtube-dl } ================================================ FILE: packages/sx05re/tools/vksdl/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2025-present Diegrosan (https://github.com/Diegrosan) # PKG_NAME="vksdl" PKG_VERSION="1.0" PKG_REV="1" PKG_ARCH="arm aarch64" PKG_LICENSE="GPLv2" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain libevdev SDL2 SDL2_ttf freetype" PKG_LONGDESC="Virtual keyboard daemon for framebuffer devices" PKG_TOOLCHAIN="manual" configure_target() { cp -f ${PKG_DIR}/virtual_keyboard.cpp ${PKG_BUILD} } make_target() { ${CXX} ${CXXFLAGS} -std=c++11 virtual_keyboard.cpp -o virtual_keyboard \ ${LDFLAGS} \ -lSDL2 \ -lSDL2_ttf \ -lSDL2_image \ -lpng \ -levdev \ -lm } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp virtual_keyboard ${INSTALL}/usr/bin } ================================================ FILE: packages/sx05re/tools/vksdl/virtual_keyboard.cpp ================================================ // ------------------------------------------------ // // SPDX-License-Identifier: GPL-2.0-or-later // // Copyright (C) 2025-present BY DIEGROSAN // // --------------------------------------------- // #include <SDL2/SDL.h> #include <SDL2/SDL_ttf.h> #include <vector> #include <map> #include <string> #include <linux/uinput.h> #include <linux/input.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <cstring> #include <cmath> #include <algorithm> // Variáveis globais para resolução (serão definidas dinamicamente) int WINDOW_WIDTH = 1200; int WINDOW_HEIGHT = 500; int DISPLAY_WIDTH = 0; int DISPLAY_HEIGHT = 0; int DISPLAY_OFFSET = 2; // Configurações que dependem da resolução int KEY_SIZE = 45; int KEY_SPACING = 4; int SPECIAL_KEY_WIDTH = 80; int ROW_SPACING = 8; constexpr int DEAD_ZONE = 8000; constexpr float MOVE_THRESHOLD = 0.5f, ANALOG_SENSITIVITY = 1.5f; constexpr Uint32 REPEAT_DELAY = 150, ANALOG_REPEAT_DELAY = 200; // Cores constexpr SDL_Color COLORS[] = { {50, 50, 50, 255}, // KEY_COLOR {80, 120, 255, 255}, // KEY_PRESSED_COLOR {100, 150, 255, 255}, // KEY_SELECTED_COLOR {255, 100, 60, 255}, // KEY_SHIFT_ACTIVE {255, 255, 255, 255}, // TEXT_COLOR {120, 120, 120, 255}, // BORDER_COLOR {255, 255, 255, 255}, // SELECTED_BORDER_COLOR {30, 30, 30, 255} // PREVIEW_BACKGROUND }; // Mapeamento de teclas const std::map<char, int> keymap = { {'a', KEY_A}, {'b', KEY_B}, {'c', KEY_C}, {'d', KEY_D}, {'e', KEY_E}, {'f', KEY_F}, {'g', KEY_G}, {'h', KEY_H}, {'i', KEY_I}, {'j', KEY_J}, {'k', KEY_K}, {'l', KEY_L}, {'m', KEY_M}, {'n', KEY_N}, {'o', KEY_O}, {'p', KEY_P}, {'q', KEY_Q}, {'r', KEY_R}, {'s', KEY_S}, {'t', KEY_T}, {'u', KEY_U}, {'v', KEY_V}, {'w', KEY_W}, {'x', KEY_X}, {'y', KEY_Y}, {'z', KEY_Z}, {'1', KEY_1}, {'2', KEY_2}, {'3', KEY_3}, {'4', KEY_4}, {'5', KEY_5}, {'6', KEY_6}, {'7', KEY_7}, {'8', KEY_8}, {'9', KEY_9}, {'0', KEY_0}, {' ', KEY_SPACE}, {'\b', KEY_BACKSPACE}, {'-', KEY_MINUS}, {'=', KEY_EQUAL}, {'[', KEY_LEFTBRACE}, {']', KEY_RIGHTBRACE}, {'\\', KEY_BACKSLASH}, {';', KEY_SEMICOLON}, {'\'', KEY_APOSTROPHE}, {'`', KEY_GRAVE}, {',', KEY_COMMA}, {'.', KEY_DOT}, {'/', KEY_SLASH}, {'\n', KEY_ENTER}, {'\t', KEY_TAB}, {'!', KEY_1}, {'@', KEY_2}, {'#', KEY_3}, {'$', KEY_4}, {'%', KEY_5}, {'^', KEY_6}, {'&', KEY_7}, {'*', KEY_8}, {'(', KEY_9}, {')', KEY_0}, {'_', KEY_MINUS}, {'+', KEY_EQUAL}, {'{', KEY_LEFTBRACE}, {'}', KEY_RIGHTBRACE}, {'|', KEY_BACKSLASH}, {':', KEY_SEMICOLON}, {'"', KEY_APOSTROPHE}, {'~', KEY_GRAVE}, {'<', KEY_COMMA}, {'>', KEY_DOT}, {'?', KEY_SLASH} }; struct Key { SDL_Rect rect; char primary, secondary; int keycode; int physical_keycode; bool pressed = false, selected = false, is_special = false, is_shift_key = false; std::string display_text; Key(int x, int y, int w, int h, char p, char s, int kc, int pkc, const std::string& text, bool special = false, bool shift_key = false) : rect{x, y, w, h}, primary(p), secondary(s), keycode(kc), physical_keycode(pkc), is_special(special), is_shift_key(shift_key), display_text(text) {} }; // Variáveis globais SDL_Window* window = nullptr; SDL_Renderer* renderer = nullptr; TTF_Font* font = nullptr; SDL_GameController* controller = nullptr; std::vector<Key> keys; std::string input_text; bool shift_pressed = true, close_requested = false, keyboard_visible = false; int selected_key_index = 0, uinput_fd = -1; Uint32 last_button_time = 0, last_analog_move_time = 0; float last_axis_x = 0.0f, last_axis_y = 0.0f; bool analog_moved = false; bool l1_pressed = false; // Track L1 button state // Layout do teclado const char* keyboard_rows[] = {"1234567890-=", "!@#$%^&*()_+", "qwertyuiop[]", "asdfghjkl;'", "zxcvbnm,./"}; // Função para detectar resolução e ajustar tamanhos void detect_resolution_and_scale() { // Inicializa SDL temporariamente apenas para detectar resolução if (SDL_Init(SDL_INIT_VIDEO) < 0) { printf("Erro ao inicializar SDL para detecção de resolução: %s\n", SDL_GetError()); return; } SDL_DisplayMode display_mode; if (SDL_GetCurrentDisplayMode(0, &display_mode) == 0) { DISPLAY_WIDTH = display_mode.w; DISPLAY_HEIGHT = display_mode.h; printf("Resolução detectada: %dx%d\n", DISPLAY_WIDTH, DISPLAY_HEIGHT); // Ajusta tamanhos baseado na resolução if (DISPLAY_WIDTH <= 800) { // Telas pequenas (ex: 800x600) WINDOW_WIDTH = DISPLAY_WIDTH - 50; WINDOW_HEIGHT = std::min(400 / DISPLAY_OFFSET, DISPLAY_HEIGHT - 100); KEY_SIZE = 35; KEY_SPACING = 3; SPECIAL_KEY_WIDTH = 60; ROW_SPACING = 6; } else if (DISPLAY_WIDTH <= 1024) { // Telas médias (ex: 1024x768) WINDOW_WIDTH = DISPLAY_WIDTH - 100; WINDOW_HEIGHT = std::min(450 / DISPLAY_OFFSET, DISPLAY_HEIGHT - 100); KEY_SIZE = 40; KEY_SPACING = 4; SPECIAL_KEY_WIDTH = 70; ROW_SPACING = 7; } else if (DISPLAY_WIDTH <= 1366) { // Telas comuns (ex: 1366x768) WINDOW_WIDTH = std::min(1200 / DISPLAY_OFFSET, DISPLAY_WIDTH - 100); WINDOW_HEIGHT = std::min(500, DISPLAY_HEIGHT - 100); KEY_SIZE = 45; KEY_SPACING = 4; SPECIAL_KEY_WIDTH = 80; ROW_SPACING = 8; } else if (DISPLAY_WIDTH <= 1920) { // Full HD WINDOW_WIDTH = std::min(1400 / DISPLAY_OFFSET, DISPLAY_WIDTH - 400); WINDOW_HEIGHT = std::min(600, DISPLAY_HEIGHT - 150); KEY_SIZE = 50; KEY_SPACING = 5; SPECIAL_KEY_WIDTH = 90; ROW_SPACING = 10; } else { // 4K e superiores WINDOW_WIDTH = std::min(1800 / DISPLAY_OFFSET, DISPLAY_WIDTH - 300); WINDOW_HEIGHT = std::min(800, DISPLAY_HEIGHT - 200); KEY_SIZE = 60; KEY_SPACING = 6; SPECIAL_KEY_WIDTH = 110; ROW_SPACING = 12; } printf("Janela ajustada para: %dx%d\n", WINDOW_WIDTH, WINDOW_HEIGHT); printf("Tamanho das teclas: %d pixels\n", KEY_SIZE); } else { printf("Não foi possível detectar resolução, usando valores padrão\n"); DISPLAY_WIDTH = 800 / DISPLAY_OFFSET; DISPLAY_HEIGHT = 500; } SDL_Quit(); // Finaliza SDL temporária } int setup_uinput() { uinput_fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); if (uinput_fd < 0) uinput_fd = open("/dev/input/uinput", O_WRONLY | O_NONBLOCK); if (uinput_fd < 0) return -1; ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY); ioctl(uinput_fd, UI_SET_EVBIT, EV_SYN); for (const auto& k : keymap) ioctl(uinput_fd, UI_SET_KEYBIT, k.second); int special_keys[] = {KEY_LEFTSHIFT, KEY_RIGHTSHIFT, KEY_LEFTCTRL, KEY_LEFTALT, KEY_ESC, KEY_TAB}; for (int key : special_keys) ioctl(uinput_fd, UI_SET_KEYBIT, key); struct uinput_user_dev uidev = {}; snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "Teclado Virtual Gamepad"); uidev.id = {BUS_USB, 0x6264, 0x5678, 100}; if (write(uinput_fd, &uidev, sizeof(uidev)) < 0 || ioctl(uinput_fd, UI_DEV_CREATE) < 0) { close(uinput_fd); return -1; } usleep(100000); return 0; } void send_key_event(int keycode, bool pressed) { if (uinput_fd < 0) return; struct input_event ev = {}; gettimeofday(&ev.time, nullptr); ev.type = EV_KEY; ev.code = keycode; ev.value = pressed ? 1 : 0; write(uinput_fd, &ev, sizeof(ev)); ev.type = EV_SYN; ev.code = SYN_REPORT; ev.value = 0; write(uinput_fd, &ev, sizeof(ev)); } void update_preview() { if (!keys.empty()) { keys[0].display_text = input_text.empty() ? "Preview..." : input_text; } } void create_keyboard_layout() { keys.clear(); input_text.clear(); // Área de preview - ajustada proporcionalmente int preview_width = (WINDOW_WIDTH - 100) * 2 / 3; keys.emplace_back((WINDOW_WIDTH - preview_width) / 2, 20, preview_width, KEY_SIZE + 15, '\0', '\0', 0, 0, "Preview...", true); int y = 20 + KEY_SIZE + 35; // Ajustado baseado no preview // Teclas especiais struct {int w; char c; int k; const char* t; bool shift;} special_keys[] = { {SPECIAL_KEY_WIDTH, 'X', KEY_ESC, "CLOSE", false}, {SPECIAL_KEY_WIDTH, '\t', KEY_TAB, "TAB", false}, {SPECIAL_KEY_WIDTH, '^', KEY_LEFTSHIFT, "SHIFT", true}, {SPECIAL_KEY_WIDTH, '\b', KEY_BACKSPACE, "DEL", false} }; int special_total_width = 4 * SPECIAL_KEY_WIDTH + 3 * KEY_SPACING; int special_start_x = (WINDOW_WIDTH - special_total_width) / 2; for (int i = 0; i < 4; i++) { auto& sk = special_keys[i]; keys.emplace_back(special_start_x + i * (SPECIAL_KEY_WIDTH + KEY_SPACING), y, sk.w, KEY_SIZE, sk.c, sk.c, sk.k, sk.k, sk.t, true, sk.shift); } y += KEY_SIZE + ROW_SPACING; // Linhas do teclado for (int row = 0; row < 5; row++) { const char* row_chars = keyboard_rows[row]; int key_count = strlen(row_chars); int row_width = key_count * KEY_SIZE + (key_count - 1) * KEY_SPACING; int row_start_x = (WINDOW_WIDTH - row_width) / 2; for (int i = 0; i < key_count; i++) { char primary = row_chars[i]; auto it = keymap.find(primary); if (it != keymap.end()) { int kc = it->second; keys.emplace_back(row_start_x + i * (KEY_SIZE + KEY_SPACING), y, KEY_SIZE, KEY_SIZE, primary, primary, kc, kc, std::string(1, primary)); } } y += KEY_SIZE + ROW_SPACING; } // Barra de espaço e Enter int space_width = KEY_SIZE * 6; int space_x = (WINDOW_WIDTH - space_width - KEY_SPACING - SPECIAL_KEY_WIDTH) / 2; keys.emplace_back(space_x, y, space_width, KEY_SIZE, ' ', ' ', KEY_SPACE, KEY_SPACE, "ESPACE", true); keys.emplace_back(space_x + space_width + KEY_SPACING, y, SPECIAL_KEY_WIDTH, KEY_SIZE, '\n', '\n', KEY_ENTER, KEY_ENTER, "ENTER", true); if (!keys.empty()) { selected_key_index = 2; keys[selected_key_index].selected = true; } } void update_key_display() { for (auto& key : keys) { if (!key.is_special && key.display_text.length() == 1) { char original_char = key.primary; // Para letras (a-z), converta para maiúscula quando shift pressionado if (original_char >= 'a' && original_char <= 'z') { key.display_text = shift_pressed ? std::string(1, original_char - 'a' + 'A') : std::string(1, original_char); } // Para números, símbolos e outros caracteres, manter fixos else { key.display_text = std::string(1, original_char); } } } update_preview(); } void render_key(const Key& key) { if (&key == &keys[0]) { // Área de preview SDL_SetRenderDrawColor(renderer, COLORS[7].r, COLORS[7].g, COLORS[7].b, COLORS[7].a); SDL_RenderFillRect(renderer, &key.rect); SDL_SetRenderDrawColor(renderer, COLORS[5].r, COLORS[5].g, COLORS[5].b, COLORS[5].a); SDL_RenderDrawRect(renderer, &key.rect); if (font) { SDL_Surface* surface = TTF_RenderUTF8_Blended(font, key.display_text.c_str(), COLORS[4]); if (surface) { SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); if (texture) { SDL_Rect text_rect = {key.rect.x + 10, key.rect.y + (key.rect.h - surface->h) / 2, surface->w, surface->h}; SDL_RenderCopy(renderer, texture, nullptr, &text_rect); SDL_DestroyTexture(texture); } SDL_FreeSurface(surface); } } return; } SDL_Color color = COLORS[key.is_shift_key && shift_pressed ? 3 : key.pressed ? 1 : key.selected ? 2 : 0]; SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, color.a); SDL_RenderFillRect(renderer, &key.rect); SDL_SetRenderDrawColor(renderer, COLORS[5].r, COLORS[5].g, COLORS[5].b, COLORS[5].a); SDL_RenderDrawRect(renderer, &key.rect); if (key.selected) { SDL_Rect border = {key.rect.x - 2, key.rect.y - 2, key.rect.w + 4, key.rect.h + 4}; SDL_SetRenderDrawColor(renderer, COLORS[6].r, COLORS[6].g, COLORS[6].b, COLORS[6].a); SDL_RenderDrawRect(renderer, &border); border = {key.rect.x - 1, key.rect.y - 1, key.rect.w + 2, key.rect.h + 2}; SDL_RenderDrawRect(renderer, &border); } if (!font || key.display_text.empty()) return; SDL_Surface* surface = TTF_RenderUTF8_Blended(font, key.display_text.c_str(), COLORS[4]); if (!surface) return; SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); if (texture) { SDL_Rect text_rect = {key.rect.x + (key.rect.w - surface->w) / 2, key.rect.y + (key.rect.h - surface->h) / 2, surface->w, surface->h}; SDL_RenderCopy(renderer, texture, nullptr, &text_rect); SDL_DestroyTexture(texture); } SDL_FreeSurface(surface); } void handle_key_action(int index, bool press) { if (index < 0 || index >= (int)keys.size()) return; Key& key = keys[index]; key.pressed = press; if (press) { if (key.display_text == "CLOSE") { close_requested = true; } else if (key.is_shift_key) { shift_pressed = !shift_pressed; update_key_display(); } else if (key.display_text == "DEL" && !input_text.empty()) { input_text.pop_back(); update_preview(); send_key_event(KEY_BACKSPACE, true); } else if (key.display_text == "ESPACE") { input_text += ' '; update_preview(); send_key_event(KEY_SPACE, true); } else if (key.display_text == "ENTER") { input_text += '\n'; update_preview(); send_key_event(KEY_ENTER, true); } else if (key.display_text == "TAB") { input_text += '\t'; update_preview(); send_key_event(KEY_TAB, true); } else if (key.primary != '\0') { char to_add; // Para letras, use maiúscula/minúscula baseado no shift if (key.primary >= 'a' && key.primary <= 'z') { to_add = shift_pressed ? (key.primary - 'a' + 'A') : key.primary; } // Para números, símbolos e outros caracteres, manter o original else { to_add = key.primary; } input_text += to_add; update_preview(); // Enviar evento do teclado bool needs_shift = false; int keycode_to_send = key.physical_keycode; // Verificar se precisa do shift para letras maiúsculas if (shift_pressed && key.primary >= 'a' && key.primary <= 'z') { needs_shift = true; } if (needs_shift) { send_key_event(KEY_LEFTSHIFT, true); } send_key_event(keycode_to_send, true); } } else { if (key.display_text == "DEL") { send_key_event(KEY_BACKSPACE, false); } else if (key.display_text == "ESPACE") { send_key_event(KEY_SPACE, false); } else if (key.display_text == "ENTER") { send_key_event(KEY_ENTER, false); } else if (key.display_text == "TAB") { send_key_event(KEY_TAB, false); } else if (key.primary != '\0' && key.display_text != "CLOSE") { bool needs_shift = false; // Verificar se precisa do shift para letras maiúsculas if (shift_pressed && key.primary >= 'a' && key.primary <= 'z') { needs_shift = true; } send_key_event(key.physical_keycode, false); if (needs_shift) { send_key_event(KEY_LEFTSHIFT, false); } } } } void navigate_keys(int dir) { if (keys.empty() || !keyboard_visible) return; keys[selected_key_index].selected = false; const SDL_Rect& curr = keys[selected_key_index].rect; int best = selected_key_index; float best_score = 999999.0f; for (size_t i = 0; i < keys.size(); i++) { if (i == (size_t)selected_key_index) continue; const SDL_Rect& tgt = keys[i].rect; int dx = tgt.x + tgt.w/2 - (curr.x + curr.w/2); int dy = tgt.y + tgt.h/2 - (curr.y + curr.h/2); bool valid = false; float score = 0; switch (dir) { case 0: if (dy < -5) { valid = true; score = -dy + abs(dx) * 0.5f; } break; // Up case 1: if (dy > 5) { valid = true; score = dy + abs(dx) * 0.5f; } break; // Down case 2: if (dx < -5) { valid = true; score = -dx + abs(dy) * 0.5f; } break; // Left case 3: if (dx > 5) { valid = true; score = dx + abs(dy) * 0.5f; } break; // Right } if (valid && score < best_score) { best_score = score; best = i; } } selected_key_index = best; keys[selected_key_index].selected = true; } void handle_analog_movement(float x, float y) { if (!keyboard_visible) return; Uint32 now = SDL_GetTicks(); if (fabs(x) < MOVE_THRESHOLD && fabs(y) < MOVE_THRESHOLD) { analog_moved = false; return; } if (analog_moved && (now - last_analog_move_time < ANALOG_REPEAT_DELAY)) return; int dir = (fabs(x) > fabs(y)) ? (x > MOVE_THRESHOLD ? 3 : 2) : (y > MOVE_THRESHOLD ? 1 : 0); navigate_keys(dir); analog_moved = true; last_analog_move_time = now; } bool load_font() { const char* font_paths[] = { "/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf", "/usr/share/fonts/liberation/LiberationSans-Bold.ttf", "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", "/usr/share/fonts/TTF/DejaVuSans-Bold.ttf", "/storage/.config/emuelec/configs/Font.ttf", "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", "arial.ttf" }; // Ajusta tamanho da fonte baseado na resolução int font_size = 16; if (DISPLAY_WIDTH <= 800) font_size = 12; else if (DISPLAY_WIDTH <= 1024) font_size = 14; else if (DISPLAY_WIDTH >= 1920) font_size = 18; for (const char* path : font_paths) { font = TTF_OpenFont(path, font_size); if (font) return true; } return false; } bool init_system() { if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER) < 0 || TTF_Init() == -1) return false; for (int i = 0; i < SDL_NumJoysticks(); i++) { if (SDL_IsGameController(i) && (controller = SDL_GameControllerOpen(i))) break; } SDL_SetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION, "1"); SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengles"); SDL_Rect display; SDL_GetDisplayBounds(0, &display); window = SDL_CreateWindow("Teclado Virtual", display.x + (display.w - WINDOW_WIDTH) / 2, 0, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS); if (!window) return false; renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); if (!renderer) return false; SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); return load_font(); } void cleanup() { if (controller) SDL_GameControllerClose(controller); if (renderer) SDL_DestroyRenderer(renderer); if (window) SDL_DestroyWindow(window); if (font) TTF_CloseFont(font); TTF_Quit(); SDL_Quit(); if (uinput_fd >= 0) { ioctl(uinput_fd, UI_DEV_DESTROY); close(uinput_fd); } } int main() { // Detecta resolução antes de inicializar sistema detect_resolution_and_scale(); if (!init_system()) return 1; if (setup_uinput() < 0) printf("Executando sem uinput (apenas local)\n"); create_keyboard_layout(); update_key_display(); printf("By DiegroSan Teclado virtual iniciado!\n"); printf("Resolução: %dx%d | Janela: %dx%d | Teclas: %dpx\n", DISPLAY_WIDTH, DISPLAY_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT, KEY_SIZE); printf("Controles: Analógico/Setas=navegar, A/Enter=tecla, R3/L3=mostrar/ocultar, L1+Up=mostrar/ocultar\n"); SDL_Event event; while (!close_requested) { Uint32 now = SDL_GetTicks(); while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: close_requested = true; break; case SDL_KEYDOWN: if (!keyboard_visible) break; if (now - last_button_time <= REPEAT_DELAY) break; switch (event.key.keysym.sym) { case SDLK_UP: navigate_keys(0); break; case SDLK_DOWN: navigate_keys(1); break; case SDLK_LEFT: navigate_keys(2); break; case SDLK_RIGHT: navigate_keys(3); break; case SDLK_RETURN: handle_key_action(selected_key_index, true); break; case SDLK_ESCAPE: close_requested = true; break; } last_button_time = now; break; case SDL_KEYUP: if (!keyboard_visible) break; if (event.key.keysym.sym == SDLK_RETURN) { handle_key_action(selected_key_index, false); } break; case SDL_CONTROLLERBUTTONUP: if (event.cbutton.button == SDL_CONTROLLER_BUTTON_A && keyboard_visible) { handle_key_action(selected_key_index, false); } else if (event.cbutton.button == SDL_CONTROLLER_BUTTON_LEFTSHOULDER) { l1_pressed = false; // Track L1 release } break; case SDL_CONTROLLERAXISMOTION: if (event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTX || event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTY) { float val = event.caxis.value / 32768.0f; if (fabs(val) < DEAD_ZONE / 32768.0f) val = 0.0f; else val = (val - (DEAD_ZONE / 32768.0f * (val > 0 ? 1 : -1))) / (1.0f - DEAD_ZONE / 32768.0f); if (event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTX) last_axis_x = val * ANALOG_SENSITIVITY; else last_axis_y = val * ANALOG_SENSITIVITY; handle_analog_movement(last_axis_x, last_axis_y); } break; case SDL_CONTROLLERBUTTONDOWN: if (now - last_button_time <= REPEAT_DELAY) break; if (event.cbutton.button == SDL_CONTROLLER_BUTTON_A) { if (keyboard_visible) { handle_key_action(selected_key_index, true); } } else if (event.cbutton.button == SDL_CONTROLLER_BUTTON_LEFTSHOULDER) { l1_pressed = true; // Track L1 press } else if (event.cbutton.button == SDL_CONTROLLER_BUTTON_RIGHTSTICK || event.cbutton.button == SDL_CONTROLLER_BUTTON_LEFTSTICK) { keyboard_visible = !keyboard_visible; printf("Teclado %s\n", keyboard_visible ? "visível" : "oculto"); } else if (l1_pressed) { // Tratar combinação L1 + D-pad if (event.cbutton.button == SDL_CONTROLLER_BUTTON_DPAD_UP) { keyboard_visible = !keyboard_visible; printf("Teclado %s (L1+D-pad Up)\n", keyboard_visible ? "visível" : "oculto"); l1_pressed = false; // Reset para evitar toggles rápidos } } last_button_time = now; break; } } // Renderização SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); SDL_RenderClear(renderer); if (keyboard_visible) { for (const auto& key : keys) render_key(key); } SDL_RenderPresent(renderer); SDL_Delay(16); } cleanup(); return 0; } ================================================ FILE: packages/sysutils/bash/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="bash" PKG_VERSION="5.2.15" PKG_SHA256="13720965b5f4fc3a0d4b61dd37e7565c741da9a5be24edc2ae00182fc1b3588c" PKG_LICENSE="GPL" PKG_SITE="https://www.gnu.org/software/bash/" PKG_URL="https://ftp.gnu.org/gnu/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ncurses readline" PKG_LONGDESC="Bash is the GNU Project shell - the Bourne Again SHell." PKG_NEED_UNPACK="$(get_pkg_directory busybox)" PKG_CONFIGURE_OPTS_TARGET="--with-curses \ --without-bash-malloc \ --with-installed-readline \ bash_cv_getcwd_malloc=yes \ bash_cv_printf_a_format=yes \ bash_cv_func_sigsetjmp=present \ bash_cv_sys_named_pipes=present" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp bash ${INSTALL}/usr/bin } post_makeinstall_target() { ln -sf /usr/bin/bash ${INSTALL}/usr/bin/sh } ================================================ FILE: packages/sysutils/bkeymaps/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="bkeymaps" PKG_VERSION="1.13" PKG_SHA256="59d41ddb0c7a92d8ac155a82ed2875b7880c8957ea4308afa633c8b81e5b8887" PKG_LICENSE="GPL" PKG_SITE="http://www.alpinelinux.org" PKG_URL="http://dev.alpinelinux.org/archive/bkeymaps/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain busybox" PKG_LONGDESC="bkeymaps: binary keyboard maps for busybox" makeinstall_init() { makeinstall_target } make_target() { : # nothing todo, we install manually } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/keymaps cp -PR bkeymaps/* ${INSTALL}/usr/lib/keymaps } ================================================ FILE: packages/sysutils/busybox/config/busybox-init.conf ================================================ # # Automatically generated make config: don't edit # Busybox version: 1.32.1 # Fri Feb 5 01:01:29 2021 # CONFIG_HAVE_DOT_CONFIG=y # # Settings # # CONFIG_DESKTOP is not set # CONFIG_EXTRA_COMPAT is not set # CONFIG_FEDORA_COMPAT is not set # CONFIG_INCLUDE_SUSv2 is not set CONFIG_LONG_OPTS=y CONFIG_SHOW_USAGE=y CONFIG_FEATURE_VERBOSE_USAGE=y # CONFIG_FEATURE_COMPRESS_USAGE is not set CONFIG_LFS=y # CONFIG_PAM is not set CONFIG_FEATURE_DEVPTS=y # CONFIG_FEATURE_UTMP is not set # CONFIG_FEATURE_WTMP is not set # CONFIG_FEATURE_PIDFILE is not set CONFIG_PID_FILE_PATH="" CONFIG_BUSYBOX=y CONFIG_FEATURE_SHOW_SCRIPT=y # CONFIG_FEATURE_INSTALLER is not set CONFIG_INSTALL_NO_USR=y # CONFIG_FEATURE_SUID is not set # CONFIG_FEATURE_SUID_CONFIG is not set # CONFIG_FEATURE_SUID_CONFIG_QUIET is not set CONFIG_FEATURE_PREFER_APPLETS=y CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" # CONFIG_SELINUX is not set # CONFIG_FEATURE_CLEAN_UP is not set # CONFIG_FEATURE_SYSLOG_INFO is not set # CONFIG_FEATURE_SYSLOG is not set CONFIG_PLATFORM_LINUX=y # # Build Options # # CONFIG_STATIC is not set # CONFIG_PIE is not set # CONFIG_NOMMU is not set # CONFIG_BUILD_LIBBUSYBOX is not set # CONFIG_FEATURE_LIBBUSYBOX_STATIC is not set # CONFIG_FEATURE_INDIVIDUAL is not set # CONFIG_FEATURE_SHARED_BUSYBOX is not set CONFIG_CROSS_COMPILER_PREFIX="" CONFIG_SYSROOT="" CONFIG_EXTRA_CFLAGS="" CONFIG_EXTRA_LDFLAGS="" CONFIG_EXTRA_LDLIBS="-ltirpc -lpthread" # CONFIG_USE_PORTABLE_CODE is not set # CONFIG_STACK_OPTIMIZATION_386 is not set # # Installation Options ("make install" behavior) # # CONFIG_INSTALL_APPLET_SYMLINKS is not set # CONFIG_INSTALL_APPLET_HARDLINKS is not set # CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set CONFIG_INSTALL_APPLET_DONT=y # CONFIG_INSTALL_SH_APPLET_SYMLINK is not set # CONFIG_INSTALL_SH_APPLET_HARDLINK is not set # CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set CONFIG_PREFIX="./_install-initramfs" # # Debugging Options # # CONFIG_DEBUG is not set # CONFIG_DEBUG_PESSIMIZE is not set # CONFIG_DEBUG_SANITIZE is not set # CONFIG_UNIT_TEST is not set # CONFIG_WERROR is not set # CONFIG_WARN_SIMPLE_MSG is not set CONFIG_NO_DEBUG_LIB=y # CONFIG_DMALLOC is not set # CONFIG_EFENCE is not set # # Library Tuning # # CONFIG_FEATURE_USE_BSS_TAIL is not set CONFIG_FLOAT_DURATION=y # CONFIG_FEATURE_RTMINMAX is not set # CONFIG_FEATURE_RTMINMAX_USE_LIBC_DEFINITIONS is not set # CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set CONFIG_FEATURE_BUFFERS_GO_ON_STACK=y # CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set CONFIG_PASSWORD_MINLEN=6 CONFIG_MD5_SMALL=0 CONFIG_SHA3_SMALL=0 CONFIG_FEATURE_FAST_TOP=y # CONFIG_FEATURE_ETC_NETWORKS is not set # CONFIG_FEATURE_ETC_SERVICES is not set CONFIG_FEATURE_EDITING=y CONFIG_FEATURE_EDITING_MAX_LEN=1024 # CONFIG_FEATURE_EDITING_VI is not set CONFIG_FEATURE_EDITING_HISTORY=15 # CONFIG_FEATURE_EDITING_SAVEHISTORY is not set # CONFIG_FEATURE_EDITING_SAVE_ON_EXIT is not set # CONFIG_FEATURE_REVERSE_SEARCH is not set CONFIG_FEATURE_TAB_COMPLETION=y # CONFIG_FEATURE_USERNAME_COMPLETION is not set # CONFIG_FEATURE_EDITING_FANCY_PROMPT is not set # CONFIG_FEATURE_EDITING_WINCH is not set # CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set # CONFIG_LOCALE_SUPPORT is not set CONFIG_UNICODE_SUPPORT=y # CONFIG_UNICODE_USING_LOCALE is not set # CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set CONFIG_SUBST_WCHAR=63 CONFIG_LAST_SUPPORTED_WCHAR=767 # CONFIG_UNICODE_COMBINING_WCHARS is not set # CONFIG_UNICODE_WIDE_WCHARS is not set # CONFIG_UNICODE_BIDI_SUPPORT is not set # CONFIG_UNICODE_NEUTRAL_TABLE is not set # CONFIG_UNICODE_PRESERVE_BROKEN is not set # CONFIG_FEATURE_NON_POSIX_CP is not set CONFIG_FEATURE_VERBOSE_CP_MESSAGE=y CONFIG_FEATURE_USE_SENDFILE=y CONFIG_FEATURE_COPYBUF_KB=4 CONFIG_FEATURE_SKIP_ROOTFS=y # CONFIG_MONOTONIC_SYSCALL is not set # CONFIG_IOCTL_HEX2STR_ERROR is not set # CONFIG_FEATURE_HWIB is not set # # Applets # # # Archival Utilities # CONFIG_FEATURE_SEAMLESS_XZ=y CONFIG_FEATURE_SEAMLESS_LZMA=y CONFIG_FEATURE_SEAMLESS_BZ2=y CONFIG_FEATURE_SEAMLESS_GZ=y # CONFIG_FEATURE_SEAMLESS_Z is not set # CONFIG_AR is not set # CONFIG_FEATURE_AR_LONG_FILENAMES is not set # CONFIG_FEATURE_AR_CREATE is not set # CONFIG_UNCOMPRESS is not set CONFIG_GUNZIP=y # CONFIG_ZCAT is not set # CONFIG_FEATURE_GUNZIP_LONG_OPTIONS is not set # CONFIG_BUNZIP2 is not set # CONFIG_BZCAT is not set # CONFIG_UNLZMA is not set # CONFIG_LZCAT is not set # CONFIG_LZMA is not set # CONFIG_UNXZ is not set # CONFIG_XZCAT is not set # CONFIG_XZ is not set # CONFIG_BZIP2 is not set CONFIG_BZIP2_SMALL=0 # CONFIG_FEATURE_BZIP2_DECOMPRESS is not set # CONFIG_CPIO is not set # CONFIG_FEATURE_CPIO_O is not set # CONFIG_FEATURE_CPIO_P is not set # CONFIG_DPKG is not set # CONFIG_DPKG_DEB is not set CONFIG_GZIP=y # CONFIG_FEATURE_GZIP_LONG_OPTIONS is not set CONFIG_GZIP_FAST=0 CONFIG_FEATURE_GZIP_LEVELS=y CONFIG_FEATURE_GZIP_DECOMPRESS=y # CONFIG_LZOP is not set # CONFIG_UNLZOP is not set # CONFIG_LZOPCAT is not set # CONFIG_LZOP_COMPR_HIGH is not set # CONFIG_RPM is not set # CONFIG_RPM2CPIO is not set CONFIG_TAR=y # CONFIG_FEATURE_TAR_LONG_OPTIONS is not set # CONFIG_FEATURE_TAR_CREATE is not set CONFIG_FEATURE_TAR_AUTODETECT=y # CONFIG_FEATURE_TAR_FROM is not set # CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set # CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y # CONFIG_FEATURE_TAR_TO_COMMAND is not set # CONFIG_FEATURE_TAR_UNAME_GNAME is not set # CONFIG_FEATURE_TAR_NOPRESERVE_TIME is not set # CONFIG_FEATURE_TAR_SELINUX is not set # CONFIG_UNZIP is not set # CONFIG_FEATURE_UNZIP_CDF is not set # CONFIG_FEATURE_UNZIP_BZIP2 is not set # CONFIG_FEATURE_UNZIP_LZMA is not set # CONFIG_FEATURE_UNZIP_XZ is not set # CONFIG_FEATURE_LZMA_FAST is not set # # Coreutils # CONFIG_BASENAME=y CONFIG_CAT=y CONFIG_FEATURE_CATN=y # CONFIG_FEATURE_CATV is not set # CONFIG_CHGRP is not set # CONFIG_CHMOD is not set # CONFIG_CHOWN is not set # CONFIG_FEATURE_CHOWN_LONG_OPTIONS is not set CONFIG_CHROOT=y # CONFIG_CKSUM is not set # CONFIG_COMM is not set CONFIG_CP=y # CONFIG_FEATURE_CP_LONG_OPTIONS is not set # CONFIG_FEATURE_CP_REFLINK is not set CONFIG_CUT=y # CONFIG_DATE is not set # CONFIG_FEATURE_DATE_ISOFMT is not set # CONFIG_FEATURE_DATE_NANO is not set # CONFIG_FEATURE_DATE_COMPAT is not set CONFIG_DD=y CONFIG_FEATURE_DD_SIGNAL_HANDLING=y CONFIG_FEATURE_DD_THIRD_STATUS_LINE=y CONFIG_FEATURE_DD_IBS_OBS=y CONFIG_FEATURE_DD_STATUS=y CONFIG_DF=y # CONFIG_FEATURE_DF_FANCY is not set # CONFIG_DIRNAME is not set # CONFIG_DOS2UNIX is not set # CONFIG_UNIX2DOS is not set # CONFIG_DU is not set # CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K is not set # CONFIG_ECHO is not set CONFIG_FEATURE_FANCY_ECHO=y # CONFIG_ENV is not set # CONFIG_EXPAND is not set # CONFIG_UNEXPAND is not set # CONFIG_EXPR is not set # CONFIG_EXPR_MATH_SUPPORT_64 is not set # CONFIG_FACTOR is not set # CONFIG_FALSE is not set # CONFIG_FOLD is not set CONFIG_HEAD=y # CONFIG_FEATURE_FANCY_HEAD is not set # CONFIG_HOSTID is not set # CONFIG_ID is not set # CONFIG_GROUPS is not set # CONFIG_INSTALL is not set # CONFIG_FEATURE_INSTALL_LONG_OPTIONS is not set # CONFIG_LINK is not set # CONFIG_LN is not set # CONFIG_LOGNAME is not set CONFIG_LS=y # CONFIG_FEATURE_LS_FILETYPES is not set # CONFIG_FEATURE_LS_FOLLOWLINKS is not set # CONFIG_FEATURE_LS_RECURSIVE is not set # CONFIG_FEATURE_LS_WIDTH is not set # CONFIG_FEATURE_LS_SORTFILES is not set # CONFIG_FEATURE_LS_TIMESTAMPS is not set # CONFIG_FEATURE_LS_USERNAME is not set # CONFIG_FEATURE_LS_COLOR is not set # CONFIG_FEATURE_LS_COLOR_IS_DEFAULT is not set CONFIG_MD5SUM=y # CONFIG_SHA1SUM is not set # CONFIG_SHA256SUM is not set # CONFIG_SHA512SUM is not set # CONFIG_SHA3SUM is not set # # Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum # CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y CONFIG_MKDIR=y # CONFIG_MKFIFO is not set CONFIG_MKNOD=y # CONFIG_MKTEMP is not set CONFIG_MV=y CONFIG_NICE=y # CONFIG_NL is not set # CONFIG_NOHUP is not set # CONFIG_NPROC is not set # CONFIG_OD is not set # CONFIG_PASTE is not set # CONFIG_PRINTENV is not set # CONFIG_PRINTF is not set # CONFIG_PWD is not set # CONFIG_READLINK is not set # CONFIG_FEATURE_READLINK_FOLLOW is not set # CONFIG_REALPATH is not set CONFIG_RM=y # CONFIG_RMDIR is not set # CONFIG_SEQ is not set # CONFIG_SHRED is not set # CONFIG_SHUF is not set CONFIG_SLEEP=y # CONFIG_FEATURE_FANCY_SLEEP is not set # CONFIG_SORT is not set # CONFIG_FEATURE_SORT_BIG is not set # CONFIG_FEATURE_SORT_OPTIMIZE_MEMORY is not set # CONFIG_SPLIT is not set # CONFIG_FEATURE_SPLIT_FANCY is not set CONFIG_STAT=y # CONFIG_FEATURE_STAT_FORMAT is not set # CONFIG_FEATURE_STAT_FILESYSTEM is not set # CONFIG_STTY is not set # CONFIG_SUM is not set CONFIG_SYNC=y CONFIG_FEATURE_SYNC_FANCY=y # CONFIG_FSYNC is not set # CONFIG_TAC is not set CONFIG_TAIL=y CONFIG_FEATURE_FANCY_TAIL=y CONFIG_TEE=y CONFIG_FEATURE_TEE_USE_BLOCK_IO=y # CONFIG_TEST is not set # CONFIG_TEST1 is not set # CONFIG_TEST2 is not set CONFIG_FEATURE_TEST_64=y # CONFIG_TIMEOUT is not set # CONFIG_TOUCH is not set # CONFIG_FEATURE_TOUCH_NODEREF is not set # CONFIG_FEATURE_TOUCH_SUSV3 is not set CONFIG_TR=y CONFIG_FEATURE_TR_CLASSES=y CONFIG_FEATURE_TR_EQUIV=y # CONFIG_TRUE is not set # CONFIG_TRUNCATE is not set # CONFIG_TTY is not set CONFIG_UNAME=y CONFIG_UNAME_OSNAME="GNU/Linux" # CONFIG_BB_ARCH is not set # CONFIG_UNIQ is not set # CONFIG_UNLINK is not set CONFIG_USLEEP=y # CONFIG_UUDECODE is not set # CONFIG_BASE64 is not set # CONFIG_UUENCODE is not set # CONFIG_WC is not set # CONFIG_FEATURE_WC_LARGE is not set # CONFIG_WHO is not set # CONFIG_W is not set # CONFIG_USERS is not set # CONFIG_WHOAMI is not set # CONFIG_YES is not set # # Common options # # CONFIG_FEATURE_VERBOSE is not set # # Common options for cp and mv # # CONFIG_FEATURE_PRESERVE_HARDLINKS is not set # # Common options for df, du, ls # # CONFIG_FEATURE_HUMAN_READABLE is not set # # Console Utilities # CONFIG_CHVT=y CONFIG_CLEAR=y # CONFIG_DEALLOCVT is not set # CONFIG_DUMPKMAP is not set # CONFIG_FGCONSOLE is not set # CONFIG_KBD_MODE is not set # CONFIG_LOADFONT is not set CONFIG_SETFONT=y # CONFIG_FEATURE_SETFONT_TEXTUAL_MAP is not set CONFIG_DEFAULT_SETFONT_DIR="/usr/share" # # Common options for loadfont and setfont # CONFIG_FEATURE_LOADFONT_PSF2=y # CONFIG_FEATURE_LOADFONT_RAW is not set CONFIG_LOADKMAP=y # CONFIG_OPENVT is not set # CONFIG_RESET is not set # CONFIG_RESIZE is not set # CONFIG_FEATURE_RESIZE_PRINT is not set # CONFIG_SETCONSOLE is not set # CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS is not set # CONFIG_SETKEYCODES is not set # CONFIG_SETLOGCONS is not set # CONFIG_SHOWKEY is not set # # Debian Utilities # # CONFIG_PIPE_PROGRESS is not set # CONFIG_RUN_PARTS is not set # CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS is not set # CONFIG_FEATURE_RUN_PARTS_FANCY is not set # CONFIG_START_STOP_DAEMON is not set # CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS is not set # CONFIG_FEATURE_START_STOP_DAEMON_FANCY is not set # CONFIG_WHICH is not set # # klibc-utils # # CONFIG_MINIPS is not set # CONFIG_NUKE is not set # CONFIG_RESUME is not set # CONFIG_RUN_INIT is not set # # Editors # CONFIG_AWK=y # CONFIG_FEATURE_AWK_LIBM is not set CONFIG_FEATURE_AWK_GNU_EXTENSIONS=y # CONFIG_CMP is not set # CONFIG_DIFF is not set # CONFIG_FEATURE_DIFF_LONG_OPTIONS is not set # CONFIG_FEATURE_DIFF_DIR is not set # CONFIG_ED is not set # CONFIG_PATCH is not set CONFIG_SED=y CONFIG_VI=y CONFIG_FEATURE_VI_MAX_LEN=4096 # CONFIG_FEATURE_VI_8BIT is not set CONFIG_FEATURE_VI_COLON=y CONFIG_FEATURE_VI_YANKMARK=y CONFIG_FEATURE_VI_SEARCH=y # CONFIG_FEATURE_VI_REGEX_SEARCH is not set CONFIG_FEATURE_VI_USE_SIGNALS=y CONFIG_FEATURE_VI_DOT_CMD=y CONFIG_FEATURE_VI_READONLY=y CONFIG_FEATURE_VI_SETOPTS=y CONFIG_FEATURE_VI_SET=y CONFIG_FEATURE_VI_WIN_RESIZE=y CONFIG_FEATURE_VI_ASK_TERMINAL=y CONFIG_FEATURE_VI_UNDO=y CONFIG_FEATURE_VI_UNDO_QUEUE=y CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=256 CONFIG_FEATURE_ALLOW_EXEC=y # # Finding Utilities # # CONFIG_FIND is not set # CONFIG_FEATURE_FIND_PRINT0 is not set # CONFIG_FEATURE_FIND_MTIME is not set # CONFIG_FEATURE_FIND_MMIN is not set # CONFIG_FEATURE_FIND_PERM is not set # CONFIG_FEATURE_FIND_TYPE is not set # CONFIG_FEATURE_FIND_EXECUTABLE is not set # CONFIG_FEATURE_FIND_XDEV is not set # CONFIG_FEATURE_FIND_MAXDEPTH is not set # CONFIG_FEATURE_FIND_NEWER is not set # CONFIG_FEATURE_FIND_INUM is not set # CONFIG_FEATURE_FIND_EXEC is not set # CONFIG_FEATURE_FIND_EXEC_PLUS is not set # CONFIG_FEATURE_FIND_USER is not set # CONFIG_FEATURE_FIND_GROUP is not set # CONFIG_FEATURE_FIND_NOT is not set # CONFIG_FEATURE_FIND_DEPTH is not set # CONFIG_FEATURE_FIND_PAREN is not set # CONFIG_FEATURE_FIND_SIZE is not set # CONFIG_FEATURE_FIND_PRUNE is not set # CONFIG_FEATURE_FIND_QUIT is not set # CONFIG_FEATURE_FIND_DELETE is not set # CONFIG_FEATURE_FIND_EMPTY is not set # CONFIG_FEATURE_FIND_PATH is not set # CONFIG_FEATURE_FIND_REGEX is not set # CONFIG_FEATURE_FIND_CONTEXT is not set # CONFIG_FEATURE_FIND_LINKS is not set CONFIG_GREP=y # CONFIG_EGREP is not set # CONFIG_FGREP is not set CONFIG_FEATURE_GREP_CONTEXT=y # CONFIG_XARGS is not set # CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set # CONFIG_FEATURE_XARGS_SUPPORT_QUOTES is not set # CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT is not set # CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM is not set # CONFIG_FEATURE_XARGS_SUPPORT_REPL_STR is not set # CONFIG_FEATURE_XARGS_SUPPORT_PARALLEL is not set # CONFIG_FEATURE_XARGS_SUPPORT_ARGS_FILE is not set # # Init Utilities # # CONFIG_BOOTCHARTD is not set # CONFIG_FEATURE_BOOTCHARTD_BLOATED_HEADER is not set # CONFIG_FEATURE_BOOTCHARTD_CONFIG_FILE is not set CONFIG_HALT=y CONFIG_POWEROFF=y CONFIG_REBOOT=y CONFIG_FEATURE_WAIT_FOR_INIT=y # CONFIG_FEATURE_CALL_TELINIT is not set CONFIG_TELINIT_PATH="" # CONFIG_INIT is not set # CONFIG_LINUXRC is not set # CONFIG_FEATURE_USE_INITTAB is not set # CONFIG_FEATURE_KILL_REMOVED is not set CONFIG_FEATURE_KILL_DELAY=0 # CONFIG_FEATURE_INIT_SCTTY is not set # CONFIG_FEATURE_INIT_SYSLOG is not set # CONFIG_FEATURE_INIT_QUIET is not set # CONFIG_FEATURE_INIT_COREDUMPS is not set CONFIG_INIT_TERMINAL_TYPE="" # CONFIG_FEATURE_INIT_MODIFY_CMDLINE is not set # # Login/Password Management Utilities # # CONFIG_FEATURE_SHADOWPASSWDS is not set # CONFIG_USE_BB_PWD_GRP is not set # CONFIG_USE_BB_SHADOW is not set # CONFIG_USE_BB_CRYPT is not set # CONFIG_USE_BB_CRYPT_SHA is not set # CONFIG_ADD_SHELL is not set # CONFIG_REMOVE_SHELL is not set # CONFIG_ADDGROUP is not set # CONFIG_FEATURE_ADDUSER_TO_GROUP is not set # CONFIG_ADDUSER is not set # CONFIG_FEATURE_CHECK_NAMES is not set CONFIG_LAST_ID=0 CONFIG_FIRST_SYSTEM_ID=0 CONFIG_LAST_SYSTEM_ID=0 # CONFIG_CHPASSWD is not set CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="" # CONFIG_CRYPTPW is not set # CONFIG_MKPASSWD is not set # CONFIG_DELUSER is not set # CONFIG_DELGROUP is not set # CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set # CONFIG_GETTY is not set # CONFIG_LOGIN is not set # CONFIG_LOGIN_SESSION_AS_CHILD is not set # CONFIG_LOGIN_SCRIPTS is not set # CONFIG_FEATURE_NOLOGIN is not set # CONFIG_FEATURE_SECURETTY is not set # CONFIG_PASSWD is not set # CONFIG_FEATURE_PASSWD_WEAK_CHECK is not set # CONFIG_SU is not set # CONFIG_FEATURE_SU_SYSLOG is not set # CONFIG_FEATURE_SU_CHECKS_SHELLS is not set # CONFIG_FEATURE_SU_BLANK_PW_NEEDS_SECURE_TTY is not set # CONFIG_SULOGIN is not set # CONFIG_VLOCK is not set # # Linux Ext2 FS Progs # # CONFIG_CHATTR is not set # CONFIG_FSCK is not set # CONFIG_LSATTR is not set # CONFIG_TUNE2FS is not set # # Linux Module Utilities # # CONFIG_MODPROBE_SMALL is not set # CONFIG_DEPMOD is not set CONFIG_INSMOD=y # CONFIG_LSMOD is not set # CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set # CONFIG_MODINFO is not set # CONFIG_MODPROBE is not set # CONFIG_FEATURE_MODPROBE_BLACKLIST is not set # CONFIG_RMMOD is not set # # Options common to multiple modutils # # CONFIG_FEATURE_CMDLINE_MODULE_OPTIONS is not set # CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED is not set # CONFIG_FEATURE_2_4_MODULES is not set # CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set # CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set # CONFIG_FEATURE_INSMOD_LOADINKMEM is not set # CONFIG_FEATURE_INSMOD_LOAD_MAP is not set # CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set # CONFIG_FEATURE_CHECK_TAINTED_MODULE is not set # CONFIG_FEATURE_INSMOD_TRY_MMAP is not set # CONFIG_FEATURE_MODUTILS_ALIAS is not set # CONFIG_FEATURE_MODUTILS_SYMBOLS is not set CONFIG_DEFAULT_MODULES_DIR="" CONFIG_DEFAULT_DEPMOD_FILE="" # # Linux System Utilities # # CONFIG_ACPID is not set # CONFIG_FEATURE_ACPID_COMPAT is not set # CONFIG_BLKDISCARD is not set CONFIG_BLKID=y CONFIG_FEATURE_BLKID_TYPE=y # CONFIG_BLOCKDEV is not set # CONFIG_CAL is not set # CONFIG_CHRT is not set CONFIG_DMESG=y # CONFIG_FEATURE_DMESG_PRETTY is not set # CONFIG_EJECT is not set # CONFIG_FEATURE_EJECT_SCSI is not set # CONFIG_FALLOCATE is not set # CONFIG_FATATTR is not set CONFIG_FBSET=y CONFIG_FEATURE_FBSET_FANCY=y CONFIG_FEATURE_FBSET_READMODE=y # CONFIG_FDFORMAT is not set CONFIG_FDISK=y # CONFIG_FDISK_SUPPORT_LARGE_DISKS is not set CONFIG_FEATURE_FDISK_WRITABLE=y # CONFIG_FEATURE_AIX_LABEL is not set # CONFIG_FEATURE_SGI_LABEL is not set # CONFIG_FEATURE_SUN_LABEL is not set # CONFIG_FEATURE_OSF_LABEL is not set CONFIG_FEATURE_GPT_LABEL=y # CONFIG_FEATURE_FDISK_ADVANCED is not set # CONFIG_FINDFS is not set # CONFIG_FLOCK is not set # CONFIG_FDFLUSH is not set # CONFIG_FREERAMDISK is not set # CONFIG_FSCK_MINIX is not set # CONFIG_FSFREEZE is not set # CONFIG_FSTRIM is not set # CONFIG_GETOPT is not set # CONFIG_FEATURE_GETOPT_LONG is not set # CONFIG_HEXDUMP is not set # CONFIG_FEATURE_HEXDUMP_REVERSE is not set # CONFIG_HD is not set # CONFIG_XXD is not set # CONFIG_HWCLOCK is not set # CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS is not set CONFIG_IONICE=y # CONFIG_IPCRM is not set # CONFIG_IPCS is not set # CONFIG_LAST is not set # CONFIG_FEATURE_LAST_FANCY is not set CONFIG_LOSETUP=y # CONFIG_LSPCI is not set # CONFIG_LSUSB is not set # CONFIG_MDEV is not set # CONFIG_FEATURE_MDEV_CONF is not set # CONFIG_FEATURE_MDEV_RENAME is not set # CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set # CONFIG_FEATURE_MDEV_EXEC is not set # CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set # CONFIG_FEATURE_MDEV_DAEMON is not set # CONFIG_MESG is not set # CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP is not set # CONFIG_MKE2FS is not set # CONFIG_MKFS_EXT2 is not set # CONFIG_MKFS_MINIX is not set # CONFIG_FEATURE_MINIX2 is not set # CONFIG_MKFS_REISER is not set # CONFIG_MKDOSFS is not set # CONFIG_MKFS_VFAT is not set # CONFIG_MKSWAP is not set # CONFIG_FEATURE_MKSWAP_UUID is not set # CONFIG_MORE is not set CONFIG_MOUNT=y CONFIG_FEATURE_MOUNT_FAKE=y # CONFIG_FEATURE_MOUNT_VERBOSE is not set # CONFIG_FEATURE_MOUNT_HELPERS is not set CONFIG_FEATURE_MOUNT_LABEL=y # CONFIG_FEATURE_MOUNT_NFS is not set # CONFIG_FEATURE_MOUNT_CIFS is not set CONFIG_FEATURE_MOUNT_FLAGS=y # CONFIG_FEATURE_MOUNT_FSTAB is not set # CONFIG_FEATURE_MOUNT_OTHERTAB is not set CONFIG_MOUNTPOINT=y # CONFIG_NOLOGIN is not set # CONFIG_NOLOGIN_DEPENDENCIES is not set # CONFIG_NSENTER is not set # CONFIG_PIVOT_ROOT is not set # CONFIG_RDATE is not set # CONFIG_RDEV is not set # CONFIG_READPROFILE is not set # CONFIG_RENICE is not set # CONFIG_REV is not set # CONFIG_RTCWAKE is not set # CONFIG_SCRIPT is not set # CONFIG_SCRIPTREPLAY is not set # CONFIG_SETARCH is not set # CONFIG_LINUX32 is not set # CONFIG_LINUX64 is not set # CONFIG_SETPRIV is not set # CONFIG_FEATURE_SETPRIV_DUMP is not set # CONFIG_FEATURE_SETPRIV_CAPABILITIES is not set # CONFIG_FEATURE_SETPRIV_CAPABILITY_NAMES is not set CONFIG_SETSID=y # CONFIG_SWAPON is not set # CONFIG_FEATURE_SWAPON_DISCARD is not set # CONFIG_FEATURE_SWAPON_PRI is not set # CONFIG_SWAPOFF is not set # CONFIG_FEATURE_SWAPONOFF_LABEL is not set CONFIG_SWITCH_ROOT=y # CONFIG_TASKSET is not set # CONFIG_FEATURE_TASKSET_FANCY is not set # CONFIG_FEATURE_TASKSET_CPULIST is not set CONFIG_UEVENT=y CONFIG_UMOUNT=y CONFIG_FEATURE_UMOUNT_ALL=y # CONFIG_UNSHARE is not set # CONFIG_WALL is not set # # Common options for mount/umount # CONFIG_FEATURE_MOUNT_LOOP=y CONFIG_FEATURE_MOUNT_LOOP_CREATE=y # CONFIG_FEATURE_MTAB_SUPPORT is not set CONFIG_VOLUMEID=y # # Filesystem/Volume identification # # CONFIG_FEATURE_VOLUMEID_BCACHE is not set CONFIG_FEATURE_VOLUMEID_BTRFS=y CONFIG_FEATURE_VOLUMEID_CRAMFS=y CONFIG_FEATURE_VOLUMEID_EXFAT=y CONFIG_FEATURE_VOLUMEID_EXT=y CONFIG_FEATURE_VOLUMEID_F2FS=y CONFIG_FEATURE_VOLUMEID_FAT=y CONFIG_FEATURE_VOLUMEID_HFS=y CONFIG_FEATURE_VOLUMEID_ISO9660=y CONFIG_FEATURE_VOLUMEID_JFS=y # CONFIG_FEATURE_VOLUMEID_LFS is not set CONFIG_FEATURE_VOLUMEID_LINUXRAID=y CONFIG_FEATURE_VOLUMEID_LINUXSWAP=y CONFIG_FEATURE_VOLUMEID_LUKS=y CONFIG_FEATURE_VOLUMEID_MINIX=y CONFIG_FEATURE_VOLUMEID_NILFS=y CONFIG_FEATURE_VOLUMEID_NTFS=y CONFIG_FEATURE_VOLUMEID_OCFS2=y CONFIG_FEATURE_VOLUMEID_REISERFS=y CONFIG_FEATURE_VOLUMEID_ROMFS=y CONFIG_FEATURE_VOLUMEID_SQUASHFS=y CONFIG_FEATURE_VOLUMEID_SYSV=y CONFIG_FEATURE_VOLUMEID_UBIFS=y CONFIG_FEATURE_VOLUMEID_UDF=y CONFIG_FEATURE_VOLUMEID_XFS=y # # Miscellaneous Utilities # # CONFIG_ADJTIMEX is not set # CONFIG_BBCONFIG is not set # CONFIG_FEATURE_COMPRESS_BBCONFIG is not set # CONFIG_BC is not set # CONFIG_DC is not set # CONFIG_FEATURE_DC_BIG is not set # CONFIG_FEATURE_DC_LIBM is not set # CONFIG_FEATURE_BC_INTERACTIVE is not set # CONFIG_FEATURE_BC_LONG_OPTIONS is not set # CONFIG_BEEP is not set CONFIG_FEATURE_BEEP_FREQ=0 CONFIG_FEATURE_BEEP_LENGTH_MS=0 # CONFIG_CHAT is not set # CONFIG_FEATURE_CHAT_NOFAIL is not set # CONFIG_FEATURE_CHAT_TTY_HIFI is not set # CONFIG_FEATURE_CHAT_IMPLICIT_CR is not set # CONFIG_FEATURE_CHAT_SWALLOW_OPTS is not set # CONFIG_FEATURE_CHAT_SEND_ESCAPES is not set # CONFIG_FEATURE_CHAT_VAR_ABORT_LEN is not set # CONFIG_FEATURE_CHAT_CLR_ABORT is not set # CONFIG_CONSPY is not set # CONFIG_CROND is not set # CONFIG_FEATURE_CROND_D is not set # CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set # CONFIG_FEATURE_CROND_SPECIAL_TIMES is not set CONFIG_FEATURE_CROND_DIR="" # CONFIG_CRONTAB is not set # CONFIG_DEVFSD is not set # CONFIG_DEVFSD_MODLOAD is not set # CONFIG_DEVFSD_FG_NP is not set # CONFIG_DEVFSD_VERBOSE is not set # CONFIG_FEATURE_DEVFS is not set # CONFIG_DEVMEM is not set # CONFIG_FBSPLASH is not set CONFIG_FLASH_ERASEALL=y # CONFIG_FLASH_LOCK is not set # CONFIG_FLASH_UNLOCK is not set # CONFIG_FLASHCP is not set # CONFIG_HDPARM is not set # CONFIG_FEATURE_HDPARM_GET_IDENTITY is not set # CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set # CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set # CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set # CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set # CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA is not set # CONFIG_HEXEDIT is not set # CONFIG_I2CGET is not set # CONFIG_I2CSET is not set # CONFIG_I2CDUMP is not set # CONFIG_I2CDETECT is not set # CONFIG_I2CTRANSFER is not set # CONFIG_INOTIFYD is not set CONFIG_LESS=y CONFIG_FEATURE_LESS_MAXLINES=9999999 # CONFIG_FEATURE_LESS_BRACKETS is not set # CONFIG_FEATURE_LESS_FLAGS is not set # CONFIG_FEATURE_LESS_TRUNCATE is not set # CONFIG_FEATURE_LESS_MARKS is not set # CONFIG_FEATURE_LESS_REGEXP is not set # CONFIG_FEATURE_LESS_WINCH is not set # CONFIG_FEATURE_LESS_ASK_TERMINAL is not set # CONFIG_FEATURE_LESS_DASHCMD is not set # CONFIG_FEATURE_LESS_LINENUMS is not set # CONFIG_FEATURE_LESS_RAW is not set # CONFIG_FEATURE_LESS_ENV is not set # CONFIG_LSSCSI is not set # CONFIG_MAKEDEVS is not set # CONFIG_FEATURE_MAKEDEVS_LEAF is not set # CONFIG_FEATURE_MAKEDEVS_TABLE is not set # CONFIG_MAN is not set # CONFIG_MICROCOM is not set # CONFIG_MIM is not set # CONFIG_MT is not set CONFIG_NANDWRITE=y # CONFIG_NANDDUMP is not set # CONFIG_PARTPROBE is not set # CONFIG_RAIDAUTORUN is not set # CONFIG_READAHEAD is not set # CONFIG_RFKILL is not set # CONFIG_RUNLEVEL is not set # CONFIG_RX is not set # CONFIG_SETFATTR is not set # CONFIG_SETSERIAL is not set # CONFIG_STRINGS is not set # CONFIG_TIME is not set # CONFIG_TS is not set # CONFIG_TTYSIZE is not set # CONFIG_UBIATTACH is not set # CONFIG_UBIDETACH is not set # CONFIG_UBIMKVOL is not set # CONFIG_UBIRMVOL is not set # CONFIG_UBIRSVOL is not set # CONFIG_UBIUPDATEVOL is not set # CONFIG_UBIRENAME is not set # CONFIG_VOLNAME is not set # CONFIG_WATCHDOG is not set # # Networking Utilities # # CONFIG_FEATURE_IPV6 is not set # CONFIG_FEATURE_UNIX_LOCAL is not set # CONFIG_FEATURE_PREFER_IPV4_ADDRESS is not set # CONFIG_VERBOSE_RESOLUTION_ERRORS is not set # CONFIG_FEATURE_TLS_SHA1 is not set # CONFIG_ARP is not set # CONFIG_ARPING is not set # CONFIG_BRCTL is not set # CONFIG_FEATURE_BRCTL_FANCY is not set # CONFIG_FEATURE_BRCTL_SHOW is not set # CONFIG_DNSD is not set CONFIG_ETHER_WAKE=y # CONFIG_FTPD is not set # CONFIG_FEATURE_FTPD_WRITE is not set # CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST is not set # CONFIG_FEATURE_FTPD_AUTHENTICATION is not set # CONFIG_FTPGET is not set # CONFIG_FTPPUT is not set # CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set # CONFIG_HOSTNAME is not set # CONFIG_DNSDOMAINNAME is not set # CONFIG_HTTPD is not set # CONFIG_FEATURE_HTTPD_RANGES is not set # CONFIG_FEATURE_HTTPD_SETUID is not set # CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set # CONFIG_FEATURE_HTTPD_AUTH_MD5 is not set # CONFIG_FEATURE_HTTPD_CGI is not set # CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set # CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set # CONFIG_FEATURE_HTTPD_ENCODE_URL_STR is not set # CONFIG_FEATURE_HTTPD_ERROR_PAGES is not set # CONFIG_FEATURE_HTTPD_PROXY is not set # CONFIG_FEATURE_HTTPD_GZIP is not set # CONFIG_IFCONFIG is not set # CONFIG_FEATURE_IFCONFIG_STATUS is not set # CONFIG_FEATURE_IFCONFIG_SLIP is not set # CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set # CONFIG_FEATURE_IFCONFIG_HW is not set # CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set # CONFIG_IFENSLAVE is not set # CONFIG_IFPLUGD is not set # CONFIG_IFUP is not set # CONFIG_IFDOWN is not set CONFIG_IFUPDOWN_IFSTATE_PATH="" # CONFIG_FEATURE_IFUPDOWN_IP is not set # CONFIG_FEATURE_IFUPDOWN_IPV4 is not set # CONFIG_FEATURE_IFUPDOWN_IPV6 is not set # CONFIG_FEATURE_IFUPDOWN_MAPPING is not set # CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set # CONFIG_INETD is not set # CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set # CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set # CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME is not set # CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME is not set # CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN is not set # CONFIG_FEATURE_INETD_RPC is not set # CONFIG_IP is not set # CONFIG_IPADDR is not set # CONFIG_IPLINK is not set # CONFIG_IPROUTE is not set # CONFIG_IPTUNNEL is not set # CONFIG_IPRULE is not set # CONFIG_IPNEIGH is not set # CONFIG_FEATURE_IP_ADDRESS is not set # CONFIG_FEATURE_IP_LINK is not set # CONFIG_FEATURE_IP_ROUTE is not set CONFIG_FEATURE_IP_ROUTE_DIR="" # CONFIG_FEATURE_IP_TUNNEL is not set # CONFIG_FEATURE_IP_RULE is not set # CONFIG_FEATURE_IP_NEIGH is not set # CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set # CONFIG_IPCALC is not set # CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set # CONFIG_FEATURE_IPCALC_FANCY is not set # CONFIG_FAKEIDENTD is not set # CONFIG_NAMEIF is not set # CONFIG_FEATURE_NAMEIF_EXTENDED is not set CONFIG_NBDCLIENT=y # CONFIG_NC is not set # CONFIG_NETCAT is not set # CONFIG_NC_SERVER is not set # CONFIG_NC_EXTRA is not set # CONFIG_NC_110_COMPAT is not set # CONFIG_NETSTAT is not set # CONFIG_FEATURE_NETSTAT_WIDE is not set # CONFIG_FEATURE_NETSTAT_PRG is not set # CONFIG_NSLOOKUP is not set # CONFIG_FEATURE_NSLOOKUP_BIG is not set # CONFIG_FEATURE_NSLOOKUP_LONG_OPTIONS is not set # CONFIG_NTPD is not set # CONFIG_FEATURE_NTPD_SERVER is not set # CONFIG_FEATURE_NTPD_CONF is not set # CONFIG_FEATURE_NTP_AUTH is not set CONFIG_PING=y # CONFIG_PING6 is not set CONFIG_FEATURE_FANCY_PING=y # CONFIG_PSCAN is not set # CONFIG_ROUTE is not set # CONFIG_SLATTACH is not set # CONFIG_SSL_CLIENT is not set # CONFIG_TC is not set # CONFIG_FEATURE_TC_INGRESS is not set # CONFIG_TCPSVD is not set # CONFIG_UDPSVD is not set # CONFIG_TELNET is not set # CONFIG_FEATURE_TELNET_TTYPE is not set # CONFIG_FEATURE_TELNET_AUTOLOGIN is not set # CONFIG_FEATURE_TELNET_WIDTH is not set # CONFIG_TELNETD is not set # CONFIG_FEATURE_TELNETD_STANDALONE is not set # CONFIG_FEATURE_TELNETD_INETD_WAIT is not set # CONFIG_TFTP is not set # CONFIG_FEATURE_TFTP_PROGRESS_BAR is not set # CONFIG_FEATURE_TFTP_HPA_COMPAT is not set # CONFIG_TFTPD is not set # CONFIG_FEATURE_TFTP_GET is not set # CONFIG_FEATURE_TFTP_PUT is not set # CONFIG_FEATURE_TFTP_BLOCKSIZE is not set # CONFIG_TFTP_DEBUG is not set # CONFIG_TLS is not set # CONFIG_TRACEROUTE is not set # CONFIG_TRACEROUTE6 is not set # CONFIG_FEATURE_TRACEROUTE_VERBOSE is not set # CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set # CONFIG_TUNCTL is not set # CONFIG_FEATURE_TUNCTL_UG is not set # CONFIG_VCONFIG is not set # CONFIG_WGET is not set # CONFIG_FEATURE_WGET_LONG_OPTIONS is not set # CONFIG_FEATURE_WGET_STATUSBAR is not set # CONFIG_FEATURE_WGET_AUTHENTICATION is not set # CONFIG_FEATURE_WGET_TIMEOUT is not set # CONFIG_FEATURE_WGET_HTTPS is not set # CONFIG_FEATURE_WGET_OPENSSL is not set # CONFIG_WHOIS is not set # CONFIG_ZCIP is not set # CONFIG_UDHCPD is not set # CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set # CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set CONFIG_DHCPD_LEASES_FILE="" # CONFIG_DUMPLEASES is not set # CONFIG_DHCPRELAY is not set # CONFIG_UDHCPC is not set # CONFIG_FEATURE_UDHCPC_ARPING is not set # CONFIG_FEATURE_UDHCPC_SANITIZEOPT is not set CONFIG_UDHCPC_DEFAULT_SCRIPT="" # CONFIG_UDHCPC6 is not set # CONFIG_FEATURE_UDHCPC6_RFC3646 is not set # CONFIG_FEATURE_UDHCPC6_RFC4704 is not set # CONFIG_FEATURE_UDHCPC6_RFC4833 is not set # CONFIG_FEATURE_UDHCPC6_RFC5970 is not set # CONFIG_FEATURE_UDHCP_PORT is not set CONFIG_UDHCP_DEBUG=0 CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=0 # CONFIG_FEATURE_UDHCP_RFC3397 is not set # CONFIG_FEATURE_UDHCP_8021Q is not set CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="" # # Print Utilities # # CONFIG_LPD is not set # CONFIG_LPR is not set # CONFIG_LPQ is not set # # Mail Utilities # # CONFIG_MAKEMIME is not set # CONFIG_POPMAILDIR is not set # CONFIG_FEATURE_POPMAILDIR_DELIVERY is not set # CONFIG_REFORMIME is not set # CONFIG_FEATURE_REFORMIME_COMPAT is not set # CONFIG_SENDMAIL is not set CONFIG_FEATURE_MIME_CHARSET="" # # Process Utilities # # CONFIG_FREE is not set # CONFIG_FUSER is not set # CONFIG_IOSTAT is not set # CONFIG_KILL is not set # CONFIG_KILLALL is not set # CONFIG_KILLALL5 is not set # CONFIG_LSOF is not set # CONFIG_MPSTAT is not set # CONFIG_NMETER is not set # CONFIG_PGREP is not set # CONFIG_PKILL is not set # CONFIG_PIDOF is not set # CONFIG_FEATURE_PIDOF_SINGLE is not set # CONFIG_FEATURE_PIDOF_OMIT is not set # CONFIG_PMAP is not set # CONFIG_POWERTOP is not set # CONFIG_FEATURE_POWERTOP_INTERACTIVE is not set # CONFIG_PS is not set # CONFIG_FEATURE_PS_WIDE is not set # CONFIG_FEATURE_PS_LONG is not set # CONFIG_FEATURE_PS_TIME is not set # CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set # CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS is not set # CONFIG_PSTREE is not set # CONFIG_PWDX is not set # CONFIG_SMEMCAP is not set # CONFIG_BB_SYSCTL is not set # CONFIG_TOP is not set # CONFIG_FEATURE_TOP_INTERACTIVE is not set # CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE is not set # CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS is not set # CONFIG_FEATURE_TOP_SMP_CPU is not set # CONFIG_FEATURE_TOP_DECIMALS is not set # CONFIG_FEATURE_TOP_SMP_PROCESS is not set # CONFIG_FEATURE_TOPMEM is not set # CONFIG_UPTIME is not set # CONFIG_FEATURE_UPTIME_UTMP_SUPPORT is not set # CONFIG_WATCH is not set # CONFIG_FEATURE_SHOW_THREADS is not set # # Runit Utilities # # CONFIG_CHPST is not set # CONFIG_SETUIDGID is not set # CONFIG_ENVUIDGID is not set # CONFIG_ENVDIR is not set # CONFIG_SOFTLIMIT is not set # CONFIG_RUNSV is not set # CONFIG_RUNSVDIR is not set # CONFIG_FEATURE_RUNSVDIR_LOG is not set # CONFIG_SV is not set CONFIG_SV_DEFAULT_SERVICE_DIR="" # CONFIG_SVC is not set # CONFIG_SVOK is not set # CONFIG_SVLOGD is not set # CONFIG_CHCON is not set # CONFIG_GETENFORCE is not set # CONFIG_GETSEBOOL is not set # CONFIG_LOAD_POLICY is not set # CONFIG_MATCHPATHCON is not set # CONFIG_RUNCON is not set # CONFIG_SELINUXENABLED is not set # CONFIG_SESTATUS is not set # CONFIG_SETENFORCE is not set # CONFIG_SETFILES is not set # CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set # CONFIG_RESTORECON is not set # CONFIG_SETSEBOOL is not set # # Shells # CONFIG_SH_IS_ASH=y # CONFIG_SH_IS_HUSH is not set # CONFIG_SH_IS_NONE is not set # CONFIG_BASH_IS_ASH is not set # CONFIG_BASH_IS_HUSH is not set CONFIG_BASH_IS_NONE=y CONFIG_SHELL_ASH=y CONFIG_ASH=y # CONFIG_ASH_OPTIMIZE_FOR_SIZE is not set CONFIG_ASH_INTERNAL_GLOB=y CONFIG_ASH_BASH_COMPAT=y # CONFIG_ASH_BASH_SOURCE_CURDIR is not set # CONFIG_ASH_BASH_NOT_FOUND_HOOK is not set CONFIG_ASH_JOB_CONTROL=y # CONFIG_ASH_ALIAS is not set # CONFIG_ASH_RANDOM_SUPPORT is not set # CONFIG_ASH_EXPAND_PRMT is not set # CONFIG_ASH_IDLE_TIMEOUT is not set # CONFIG_ASH_MAIL is not set CONFIG_ASH_ECHO=y CONFIG_ASH_PRINTF=y CONFIG_ASH_TEST=y # CONFIG_ASH_HELP is not set CONFIG_ASH_GETOPTS=y # CONFIG_ASH_CMDCMD is not set CONFIG_CTTYHACK=y # CONFIG_HUSH is not set # CONFIG_SHELL_HUSH is not set # CONFIG_HUSH_BASH_COMPAT is not set # CONFIG_HUSH_BRACE_EXPANSION is not set # CONFIG_HUSH_LINENO_VAR is not set # CONFIG_HUSH_BASH_SOURCE_CURDIR is not set # CONFIG_HUSH_INTERACTIVE is not set # CONFIG_HUSH_SAVEHISTORY is not set # CONFIG_HUSH_JOB is not set # CONFIG_HUSH_TICK is not set # CONFIG_HUSH_IF is not set # CONFIG_HUSH_LOOPS is not set # CONFIG_HUSH_CASE is not set # CONFIG_HUSH_FUNCTIONS is not set # CONFIG_HUSH_LOCAL is not set # CONFIG_HUSH_RANDOM_SUPPORT is not set # CONFIG_HUSH_MODE_X is not set # CONFIG_HUSH_ECHO is not set # CONFIG_HUSH_PRINTF is not set # CONFIG_HUSH_TEST is not set # CONFIG_HUSH_HELP is not set # CONFIG_HUSH_EXPORT is not set # CONFIG_HUSH_EXPORT_N is not set # CONFIG_HUSH_READONLY is not set # CONFIG_HUSH_KILL is not set # CONFIG_HUSH_WAIT is not set # CONFIG_HUSH_COMMAND is not set # CONFIG_HUSH_TRAP is not set # CONFIG_HUSH_TYPE is not set # CONFIG_HUSH_TIMES is not set # CONFIG_HUSH_READ is not set # CONFIG_HUSH_SET is not set # CONFIG_HUSH_UNSET is not set # CONFIG_HUSH_ULIMIT is not set # CONFIG_HUSH_UMASK is not set # CONFIG_HUSH_GETOPTS is not set # CONFIG_HUSH_MEMLEAK is not set # # Options common to all shells # CONFIG_FEATURE_SH_MATH=y CONFIG_FEATURE_SH_MATH_64=y CONFIG_FEATURE_SH_MATH_BASE=y CONFIG_FEATURE_SH_EXTRA_QUIET=y CONFIG_FEATURE_SH_STANDALONE=y # CONFIG_FEATURE_SH_NOFORK is not set CONFIG_FEATURE_SH_READ_FRAC=y # CONFIG_FEATURE_SH_HISTFILESIZE is not set # CONFIG_FEATURE_SH_EMBEDDED_SCRIPTS is not set # # System Logging Utilities # # CONFIG_KLOGD is not set # CONFIG_FEATURE_KLOGD_KLOGCTL is not set # CONFIG_LOGGER is not set # CONFIG_LOGREAD is not set # CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING is not set # CONFIG_SYSLOGD is not set # CONFIG_FEATURE_ROTATE_LOGFILE is not set # CONFIG_FEATURE_REMOTE_LOG is not set # CONFIG_FEATURE_SYSLOGD_DUP is not set # CONFIG_FEATURE_SYSLOGD_CFG is not set # CONFIG_FEATURE_SYSLOGD_PRECISE_TIMESTAMPS is not set CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=0 # CONFIG_FEATURE_IPC_SYSLOG is not set CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0 # CONFIG_FEATURE_KMSG_SYSLOG is not set ================================================ FILE: packages/sysutils/busybox/config/busybox-target.conf ================================================ # # Automatically generated make config: don't edit # Busybox version: 1.32.1 # Thu Feb 4 21:33:53 2021 # CONFIG_HAVE_DOT_CONFIG=y # # Settings # CONFIG_DESKTOP=y # CONFIG_EXTRA_COMPAT is not set # CONFIG_FEDORA_COMPAT is not set # CONFIG_INCLUDE_SUSv2 is not set CONFIG_LONG_OPTS=y CONFIG_SHOW_USAGE=y CONFIG_FEATURE_VERBOSE_USAGE=y CONFIG_FEATURE_COMPRESS_USAGE=y CONFIG_LFS=y # CONFIG_PAM is not set CONFIG_FEATURE_DEVPTS=y # CONFIG_FEATURE_UTMP is not set # CONFIG_FEATURE_WTMP is not set CONFIG_FEATURE_PIDFILE=y CONFIG_PID_FILE_PATH="/run" CONFIG_BUSYBOX=y CONFIG_FEATURE_SHOW_SCRIPT=y CONFIG_FEATURE_INSTALLER=y CONFIG_INSTALL_NO_USR=y CONFIG_FEATURE_SUID=y # CONFIG_FEATURE_SUID_CONFIG is not set # CONFIG_FEATURE_SUID_CONFIG_QUIET is not set # CONFIG_FEATURE_PREFER_APPLETS is not set CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" # CONFIG_SELINUX is not set # CONFIG_FEATURE_CLEAN_UP is not set CONFIG_FEATURE_SYSLOG_INFO=y CONFIG_FEATURE_SYSLOG=y CONFIG_PLATFORM_LINUX=y # # Build Options # # CONFIG_STATIC is not set # CONFIG_PIE is not set # CONFIG_NOMMU is not set # CONFIG_BUILD_LIBBUSYBOX is not set # CONFIG_FEATURE_LIBBUSYBOX_STATIC is not set # CONFIG_FEATURE_INDIVIDUAL is not set # CONFIG_FEATURE_SHARED_BUSYBOX is not set CONFIG_CROSS_COMPILER_PREFIX="" CONFIG_SYSROOT="" CONFIG_EXTRA_CFLAGS="" CONFIG_EXTRA_LDFLAGS="" CONFIG_EXTRA_LDLIBS="-ltirpc -lpthread" # CONFIG_USE_PORTABLE_CODE is not set # CONFIG_STACK_OPTIMIZATION_386 is not set # # Installation Options ("make install" behavior) # CONFIG_INSTALL_APPLET_SYMLINKS=y # CONFIG_INSTALL_APPLET_HARDLINKS is not set # CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set # CONFIG_INSTALL_APPLET_DONT is not set # CONFIG_INSTALL_SH_APPLET_SYMLINK is not set # CONFIG_INSTALL_SH_APPLET_HARDLINK is not set # CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set CONFIG_PREFIX="./_install-system" # # Debugging Options # # CONFIG_DEBUG is not set # CONFIG_DEBUG_PESSIMIZE is not set # CONFIG_DEBUG_SANITIZE is not set # CONFIG_UNIT_TEST is not set # CONFIG_WERROR is not set # CONFIG_WARN_SIMPLE_MSG is not set CONFIG_NO_DEBUG_LIB=y # CONFIG_DMALLOC is not set # CONFIG_EFENCE is not set # # Library Tuning # # CONFIG_FEATURE_USE_BSS_TAIL is not set CONFIG_FLOAT_DURATION=y CONFIG_FEATURE_RTMINMAX=y CONFIG_FEATURE_RTMINMAX_USE_LIBC_DEFINITIONS=y # CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set CONFIG_FEATURE_BUFFERS_GO_ON_STACK=y # CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set CONFIG_PASSWORD_MINLEN=6 CONFIG_MD5_SMALL=0 CONFIG_SHA3_SMALL=0 CONFIG_FEATURE_FAST_TOP=y # CONFIG_FEATURE_ETC_NETWORKS is not set # CONFIG_FEATURE_ETC_SERVICES is not set CONFIG_FEATURE_EDITING=y CONFIG_FEATURE_EDITING_MAX_LEN=1024 # CONFIG_FEATURE_EDITING_VI is not set CONFIG_FEATURE_EDITING_HISTORY=9999 CONFIG_FEATURE_EDITING_SAVEHISTORY=y CONFIG_FEATURE_EDITING_SAVE_ON_EXIT=y CONFIG_FEATURE_REVERSE_SEARCH=y CONFIG_FEATURE_TAB_COMPLETION=y CONFIG_FEATURE_USERNAME_COMPLETION=y CONFIG_FEATURE_EDITING_FANCY_PROMPT=y # CONFIG_FEATURE_EDITING_WINCH is not set # CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set CONFIG_LOCALE_SUPPORT=y CONFIG_UNICODE_SUPPORT=y CONFIG_UNICODE_USING_LOCALE=y # CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set CONFIG_SUBST_WCHAR=63 CONFIG_LAST_SUPPORTED_WCHAR=767 # CONFIG_UNICODE_COMBINING_WCHARS is not set CONFIG_UNICODE_WIDE_WCHARS=y # CONFIG_UNICODE_BIDI_SUPPORT is not set # CONFIG_UNICODE_NEUTRAL_TABLE is not set # CONFIG_UNICODE_PRESERVE_BROKEN is not set CONFIG_FEATURE_NON_POSIX_CP=y CONFIG_FEATURE_VERBOSE_CP_MESSAGE=y CONFIG_FEATURE_USE_SENDFILE=y CONFIG_FEATURE_COPYBUF_KB=4 CONFIG_FEATURE_SKIP_ROOTFS=y CONFIG_MONOTONIC_SYSCALL=y # CONFIG_IOCTL_HEX2STR_ERROR is not set # CONFIG_FEATURE_HWIB is not set # # Applets # # # Archival Utilities # CONFIG_FEATURE_SEAMLESS_XZ=y CONFIG_FEATURE_SEAMLESS_LZMA=y CONFIG_FEATURE_SEAMLESS_BZ2=y CONFIG_FEATURE_SEAMLESS_GZ=y # CONFIG_FEATURE_SEAMLESS_Z is not set CONFIG_AR=y CONFIG_FEATURE_AR_LONG_FILENAMES=y CONFIG_FEATURE_AR_CREATE=y # CONFIG_UNCOMPRESS is not set CONFIG_GUNZIP=y CONFIG_ZCAT=y # CONFIG_FEATURE_GUNZIP_LONG_OPTIONS is not set CONFIG_BUNZIP2=y CONFIG_BZCAT=y # CONFIG_UNLZMA is not set # CONFIG_LZCAT is not set # CONFIG_LZMA is not set CONFIG_UNXZ=y CONFIG_XZCAT=y CONFIG_XZ=y CONFIG_BZIP2=y CONFIG_BZIP2_SMALL=8 CONFIG_FEATURE_BZIP2_DECOMPRESS=y CONFIG_CPIO=y CONFIG_FEATURE_CPIO_O=y CONFIG_FEATURE_CPIO_P=y # CONFIG_DPKG is not set # CONFIG_DPKG_DEB is not set CONFIG_GZIP=y CONFIG_FEATURE_GZIP_LONG_OPTIONS=y CONFIG_GZIP_FAST=0 CONFIG_FEATURE_GZIP_LEVELS=y CONFIG_FEATURE_GZIP_DECOMPRESS=y # CONFIG_LZOP is not set # CONFIG_UNLZOP is not set # CONFIG_LZOPCAT is not set # CONFIG_LZOP_COMPR_HIGH is not set # CONFIG_RPM is not set CONFIG_RPM2CPIO=y CONFIG_TAR=y CONFIG_FEATURE_TAR_LONG_OPTIONS=y CONFIG_FEATURE_TAR_CREATE=y CONFIG_FEATURE_TAR_AUTODETECT=y CONFIG_FEATURE_TAR_FROM=y # CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set # CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y CONFIG_FEATURE_TAR_TO_COMMAND=y CONFIG_FEATURE_TAR_UNAME_GNAME=y CONFIG_FEATURE_TAR_NOPRESERVE_TIME=y # CONFIG_FEATURE_TAR_SELINUX is not set CONFIG_UNZIP=y CONFIG_FEATURE_UNZIP_CDF=y # CONFIG_FEATURE_UNZIP_BZIP2 is not set # CONFIG_FEATURE_UNZIP_LZMA is not set # CONFIG_FEATURE_UNZIP_XZ is not set # CONFIG_FEATURE_LZMA_FAST is not set # # Coreutils # CONFIG_BASENAME=y CONFIG_CAT=y CONFIG_FEATURE_CATN=y # CONFIG_FEATURE_CATV is not set # CONFIG_CHGRP is not set CONFIG_CHMOD=y CONFIG_CHOWN=y CONFIG_FEATURE_CHOWN_LONG_OPTIONS=y CONFIG_CHROOT=y # CONFIG_CKSUM is not set # CONFIG_COMM is not set CONFIG_CP=y CONFIG_FEATURE_CP_LONG_OPTIONS=y CONFIG_FEATURE_CP_REFLINK=y CONFIG_CUT=y CONFIG_DATE=y CONFIG_FEATURE_DATE_ISOFMT=y CONFIG_FEATURE_DATE_NANO=y CONFIG_FEATURE_DATE_COMPAT=y CONFIG_DD=y CONFIG_FEATURE_DD_SIGNAL_HANDLING=y CONFIG_FEATURE_DD_THIRD_STATUS_LINE=y CONFIG_FEATURE_DD_IBS_OBS=y CONFIG_FEATURE_DD_STATUS=y CONFIG_DF=y # CONFIG_FEATURE_DF_FANCY is not set CONFIG_DIRNAME=y CONFIG_DOS2UNIX=y CONFIG_UNIX2DOS=y CONFIG_DU=y # CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K is not set # CONFIG_ECHO is not set CONFIG_FEATURE_FANCY_ECHO=y CONFIG_ENV=y # CONFIG_EXPAND is not set # CONFIG_UNEXPAND is not set CONFIG_EXPR=y # CONFIG_EXPR_MATH_SUPPORT_64 is not set # CONFIG_FACTOR is not set # CONFIG_FALSE is not set # CONFIG_FOLD is not set CONFIG_HEAD=y CONFIG_FEATURE_FANCY_HEAD=y # CONFIG_HOSTID is not set CONFIG_ID=y CONFIG_GROUPS=y CONFIG_INSTALL=y CONFIG_FEATURE_INSTALL_LONG_OPTIONS=y # CONFIG_LINK is not set CONFIG_LN=y # CONFIG_LOGNAME is not set CONFIG_LS=y CONFIG_FEATURE_LS_FILETYPES=y CONFIG_FEATURE_LS_FOLLOWLINKS=y CONFIG_FEATURE_LS_RECURSIVE=y # CONFIG_FEATURE_LS_WIDTH is not set CONFIG_FEATURE_LS_SORTFILES=y CONFIG_FEATURE_LS_TIMESTAMPS=y CONFIG_FEATURE_LS_USERNAME=y CONFIG_FEATURE_LS_COLOR=y CONFIG_FEATURE_LS_COLOR_IS_DEFAULT=y CONFIG_MD5SUM=y CONFIG_SHA1SUM=y CONFIG_SHA256SUM=y CONFIG_SHA512SUM=y # CONFIG_SHA3SUM is not set # # Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum # CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y CONFIG_MKDIR=y CONFIG_MKFIFO=y CONFIG_MKNOD=y CONFIG_MKTEMP=y CONFIG_MV=y CONFIG_NICE=y # CONFIG_NL is not set CONFIG_NOHUP=y # CONFIG_NPROC is not set CONFIG_OD=y # CONFIG_PASTE is not set CONFIG_PRINTENV=y # CONFIG_PRINTF is not set CONFIG_PWD=y CONFIG_READLINK=y CONFIG_FEATURE_READLINK_FOLLOW=y CONFIG_REALPATH=y CONFIG_RM=y CONFIG_RMDIR=y CONFIG_SEQ=y # CONFIG_SHRED is not set # CONFIG_SHUF is not set CONFIG_SLEEP=y CONFIG_FEATURE_FANCY_SLEEP=y # CONFIG_SORT is not set # CONFIG_FEATURE_SORT_BIG is not set # CONFIG_FEATURE_SORT_OPTIMIZE_MEMORY is not set # CONFIG_SPLIT is not set # CONFIG_FEATURE_SPLIT_FANCY is not set CONFIG_STAT=y # CONFIG_FEATURE_STAT_FORMAT is not set # CONFIG_FEATURE_STAT_FILESYSTEM is not set # CONFIG_STTY is not set # CONFIG_SUM is not set CONFIG_SYNC=y CONFIG_FEATURE_SYNC_FANCY=y # CONFIG_FSYNC is not set CONFIG_TAC=y CONFIG_TAIL=y CONFIG_FEATURE_FANCY_TAIL=y CONFIG_TEE=y CONFIG_FEATURE_TEE_USE_BLOCK_IO=y # CONFIG_TEST is not set # CONFIG_TEST1 is not set # CONFIG_TEST2 is not set CONFIG_FEATURE_TEST_64=y # CONFIG_TIMEOUT is not set CONFIG_TOUCH=y CONFIG_FEATURE_TOUCH_NODEREF=y CONFIG_FEATURE_TOUCH_SUSV3=y CONFIG_TR=y CONFIG_FEATURE_TR_CLASSES=y CONFIG_FEATURE_TR_EQUIV=y CONFIG_TRUE=y # CONFIG_TRUNCATE is not set # CONFIG_TTY is not set CONFIG_UNAME=y CONFIG_UNAME_OSNAME="GNU/Linux" CONFIG_BB_ARCH=y CONFIG_UNIQ=y # CONFIG_UNLINK is not set CONFIG_USLEEP=y # CONFIG_UUDECODE is not set # CONFIG_BASE64 is not set # CONFIG_UUENCODE is not set CONFIG_WC=y CONFIG_FEATURE_WC_LARGE=y # CONFIG_WHO is not set # CONFIG_W is not set # CONFIG_USERS is not set CONFIG_WHOAMI=y # CONFIG_YES is not set # # Common options # CONFIG_FEATURE_VERBOSE=y # # Common options for cp and mv # # CONFIG_FEATURE_PRESERVE_HARDLINKS is not set # # Common options for df, du, ls # CONFIG_FEATURE_HUMAN_READABLE=y # # Console Utilities # CONFIG_CHVT=y CONFIG_CLEAR=y CONFIG_DEALLOCVT=y # CONFIG_DUMPKMAP is not set CONFIG_FGCONSOLE=y # CONFIG_KBD_MODE is not set # CONFIG_LOADFONT is not set # CONFIG_SETFONT is not set # CONFIG_FEATURE_SETFONT_TEXTUAL_MAP is not set CONFIG_DEFAULT_SETFONT_DIR="" # CONFIG_FEATURE_LOADFONT_PSF2 is not set # CONFIG_FEATURE_LOADFONT_RAW is not set CONFIG_LOADKMAP=y # CONFIG_OPENVT is not set CONFIG_RESET=y # CONFIG_RESIZE is not set # CONFIG_FEATURE_RESIZE_PRINT is not set CONFIG_SETCONSOLE=y CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS=y # CONFIG_SETKEYCODES is not set # CONFIG_SETLOGCONS is not set # CONFIG_SHOWKEY is not set # # Debian Utilities # # CONFIG_PIPE_PROGRESS is not set # CONFIG_RUN_PARTS is not set # CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS is not set # CONFIG_FEATURE_RUN_PARTS_FANCY is not set # CONFIG_START_STOP_DAEMON is not set # CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS is not set # CONFIG_FEATURE_START_STOP_DAEMON_FANCY is not set CONFIG_WHICH=y # # klibc-utils # # CONFIG_MINIPS is not set # CONFIG_NUKE is not set # CONFIG_RESUME is not set # CONFIG_RUN_INIT is not set # # Editors # CONFIG_AWK=y CONFIG_FEATURE_AWK_LIBM=y CONFIG_FEATURE_AWK_GNU_EXTENSIONS=y # CONFIG_CMP is not set # CONFIG_DIFF is not set # CONFIG_FEATURE_DIFF_LONG_OPTIONS is not set # CONFIG_FEATURE_DIFF_DIR is not set # CONFIG_ED is not set # CONFIG_PATCH is not set CONFIG_SED=y CONFIG_VI=y CONFIG_FEATURE_VI_MAX_LEN=4096 CONFIG_FEATURE_VI_8BIT=y CONFIG_FEATURE_VI_COLON=y CONFIG_FEATURE_VI_YANKMARK=y CONFIG_FEATURE_VI_SEARCH=y # CONFIG_FEATURE_VI_REGEX_SEARCH is not set CONFIG_FEATURE_VI_USE_SIGNALS=y CONFIG_FEATURE_VI_DOT_CMD=y CONFIG_FEATURE_VI_READONLY=y CONFIG_FEATURE_VI_SETOPTS=y CONFIG_FEATURE_VI_SET=y CONFIG_FEATURE_VI_WIN_RESIZE=y CONFIG_FEATURE_VI_ASK_TERMINAL=y CONFIG_FEATURE_VI_UNDO=y CONFIG_FEATURE_VI_UNDO_QUEUE=y CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=256 CONFIG_FEATURE_ALLOW_EXEC=y # # Finding Utilities # CONFIG_FIND=y CONFIG_FEATURE_FIND_PRINT0=y CONFIG_FEATURE_FIND_MTIME=y CONFIG_FEATURE_FIND_MMIN=y CONFIG_FEATURE_FIND_PERM=y CONFIG_FEATURE_FIND_TYPE=y CONFIG_FEATURE_FIND_EXECUTABLE=y CONFIG_FEATURE_FIND_XDEV=y CONFIG_FEATURE_FIND_MAXDEPTH=y CONFIG_FEATURE_FIND_NEWER=y CONFIG_FEATURE_FIND_INUM=y CONFIG_FEATURE_FIND_EXEC=y CONFIG_FEATURE_FIND_EXEC_PLUS=y CONFIG_FEATURE_FIND_USER=y CONFIG_FEATURE_FIND_GROUP=y CONFIG_FEATURE_FIND_NOT=y CONFIG_FEATURE_FIND_DEPTH=y CONFIG_FEATURE_FIND_PAREN=y CONFIG_FEATURE_FIND_SIZE=y CONFIG_FEATURE_FIND_PRUNE=y CONFIG_FEATURE_FIND_QUIT=y CONFIG_FEATURE_FIND_DELETE=y CONFIG_FEATURE_FIND_EMPTY=y CONFIG_FEATURE_FIND_PATH=y CONFIG_FEATURE_FIND_REGEX=y # CONFIG_FEATURE_FIND_CONTEXT is not set CONFIG_FEATURE_FIND_LINKS=y CONFIG_GREP=y CONFIG_EGREP=y CONFIG_FGREP=y CONFIG_FEATURE_GREP_CONTEXT=y CONFIG_XARGS=y CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION=y CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y CONFIG_FEATURE_XARGS_SUPPORT_REPL_STR=y CONFIG_FEATURE_XARGS_SUPPORT_PARALLEL=y CONFIG_FEATURE_XARGS_SUPPORT_ARGS_FILE=y # # Init Utilities # # CONFIG_BOOTCHARTD is not set # CONFIG_FEATURE_BOOTCHARTD_BLOATED_HEADER is not set # CONFIG_FEATURE_BOOTCHARTD_CONFIG_FILE is not set # CONFIG_HALT is not set # CONFIG_POWEROFF is not set # CONFIG_REBOOT is not set # CONFIG_FEATURE_WAIT_FOR_INIT is not set # CONFIG_FEATURE_CALL_TELINIT is not set CONFIG_TELINIT_PATH="" # CONFIG_INIT is not set # CONFIG_LINUXRC is not set # CONFIG_FEATURE_USE_INITTAB is not set # CONFIG_FEATURE_KILL_REMOVED is not set CONFIG_FEATURE_KILL_DELAY=0 # CONFIG_FEATURE_INIT_SCTTY is not set # CONFIG_FEATURE_INIT_SYSLOG is not set # CONFIG_FEATURE_INIT_QUIET is not set # CONFIG_FEATURE_INIT_COREDUMPS is not set CONFIG_INIT_TERMINAL_TYPE="" # CONFIG_FEATURE_INIT_MODIFY_CMDLINE is not set # # Login/Password Management Utilities # CONFIG_FEATURE_SHADOWPASSWDS=y # CONFIG_USE_BB_PWD_GRP is not set # CONFIG_USE_BB_SHADOW is not set CONFIG_USE_BB_CRYPT=y CONFIG_USE_BB_CRYPT_SHA=y # CONFIG_ADD_SHELL is not set # CONFIG_REMOVE_SHELL is not set # CONFIG_ADDGROUP is not set # CONFIG_FEATURE_ADDUSER_TO_GROUP is not set # CONFIG_ADDUSER is not set # CONFIG_FEATURE_CHECK_NAMES is not set CONFIG_LAST_ID=0 CONFIG_FIRST_SYSTEM_ID=0 CONFIG_LAST_SYSTEM_ID=0 # CONFIG_CHPASSWD is not set CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="sha512" CONFIG_CRYPTPW=y # CONFIG_MKPASSWD is not set # CONFIG_DELUSER is not set # CONFIG_DELGROUP is not set # CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set # CONFIG_GETTY is not set CONFIG_LOGIN=y # CONFIG_LOGIN_SESSION_AS_CHILD is not set CONFIG_LOGIN_SCRIPTS=y # CONFIG_FEATURE_NOLOGIN is not set # CONFIG_FEATURE_SECURETTY is not set CONFIG_PASSWD=y CONFIG_FEATURE_PASSWD_WEAK_CHECK=y CONFIG_SU=y CONFIG_FEATURE_SU_SYSLOG=y CONFIG_FEATURE_SU_CHECKS_SHELLS=y # CONFIG_FEATURE_SU_BLANK_PW_NEEDS_SECURE_TTY is not set # CONFIG_SULOGIN is not set # CONFIG_VLOCK is not set # # Linux Ext2 FS Progs # # CONFIG_CHATTR is not set # CONFIG_FSCK is not set # CONFIG_LSATTR is not set # CONFIG_TUNE2FS is not set # # Linux Module Utilities # # CONFIG_MODPROBE_SMALL is not set # CONFIG_DEPMOD is not set # CONFIG_INSMOD is not set # CONFIG_LSMOD is not set # CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set # CONFIG_MODINFO is not set # CONFIG_MODPROBE is not set # CONFIG_FEATURE_MODPROBE_BLACKLIST is not set # CONFIG_RMMOD is not set # # Options common to multiple modutils # # CONFIG_FEATURE_CMDLINE_MODULE_OPTIONS is not set # CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED is not set # CONFIG_FEATURE_2_4_MODULES is not set # CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set # CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set # CONFIG_FEATURE_INSMOD_LOADINKMEM is not set # CONFIG_FEATURE_INSMOD_LOAD_MAP is not set # CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set # CONFIG_FEATURE_CHECK_TAINTED_MODULE is not set # CONFIG_FEATURE_INSMOD_TRY_MMAP is not set # CONFIG_FEATURE_MODUTILS_ALIAS is not set # CONFIG_FEATURE_MODUTILS_SYMBOLS is not set CONFIG_DEFAULT_MODULES_DIR="" CONFIG_DEFAULT_DEPMOD_FILE="" # # Linux System Utilities # # CONFIG_ACPID is not set # CONFIG_FEATURE_ACPID_COMPAT is not set # CONFIG_BLKDISCARD is not set # CONFIG_BLKID is not set # CONFIG_FEATURE_BLKID_TYPE is not set # CONFIG_BLOCKDEV is not set # CONFIG_CAL is not set # CONFIG_CHRT is not set CONFIG_DMESG=y CONFIG_FEATURE_DMESG_PRETTY=y CONFIG_EJECT=y CONFIG_FEATURE_EJECT_SCSI=y # CONFIG_FALLOCATE is not set # CONFIG_FATATTR is not set CONFIG_FBSET=y CONFIG_FEATURE_FBSET_FANCY=y CONFIG_FEATURE_FBSET_READMODE=y # CONFIG_FDFORMAT is not set # CONFIG_FDISK is not set # CONFIG_FDISK_SUPPORT_LARGE_DISKS is not set # CONFIG_FEATURE_FDISK_WRITABLE is not set # CONFIG_FEATURE_AIX_LABEL is not set # CONFIG_FEATURE_SGI_LABEL is not set # CONFIG_FEATURE_SUN_LABEL is not set # CONFIG_FEATURE_OSF_LABEL is not set # CONFIG_FEATURE_GPT_LABEL is not set # CONFIG_FEATURE_FDISK_ADVANCED is not set CONFIG_FINDFS=y CONFIG_FLOCK=y # CONFIG_FDFLUSH is not set # CONFIG_FREERAMDISK is not set # CONFIG_FSCK_MINIX is not set # CONFIG_FSFREEZE is not set # CONFIG_FSTRIM is not set CONFIG_GETOPT=y CONFIG_FEATURE_GETOPT_LONG=y CONFIG_HEXDUMP=y # CONFIG_FEATURE_HEXDUMP_REVERSE is not set # CONFIG_HD is not set # CONFIG_XXD is not set CONFIG_HWCLOCK=y # CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS is not set CONFIG_IONICE=y # CONFIG_IPCRM is not set # CONFIG_IPCS is not set # CONFIG_LAST is not set # CONFIG_FEATURE_LAST_FANCY is not set # CONFIG_LOSETUP is not set # CONFIG_LSPCI is not set # CONFIG_LSUSB is not set # CONFIG_MDEV is not set # CONFIG_FEATURE_MDEV_CONF is not set # CONFIG_FEATURE_MDEV_RENAME is not set # CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set # CONFIG_FEATURE_MDEV_EXEC is not set # CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set # CONFIG_FEATURE_MDEV_DAEMON is not set # CONFIG_MESG is not set # CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP is not set # CONFIG_MKE2FS is not set # CONFIG_MKFS_EXT2 is not set # CONFIG_MKFS_MINIX is not set # CONFIG_FEATURE_MINIX2 is not set # CONFIG_MKFS_REISER is not set # CONFIG_MKDOSFS is not set # CONFIG_MKFS_VFAT is not set CONFIG_MKSWAP=y CONFIG_FEATURE_MKSWAP_UUID=y CONFIG_MORE=y CONFIG_MOUNT=y CONFIG_FEATURE_MOUNT_FAKE=y CONFIG_FEATURE_MOUNT_VERBOSE=y CONFIG_FEATURE_MOUNT_HELPERS=y CONFIG_FEATURE_MOUNT_LABEL=y # CONFIG_FEATURE_MOUNT_NFS is not set CONFIG_FEATURE_MOUNT_CIFS=y CONFIG_FEATURE_MOUNT_FLAGS=y # CONFIG_FEATURE_MOUNT_FSTAB is not set # CONFIG_FEATURE_MOUNT_OTHERTAB is not set CONFIG_MOUNTPOINT=y # CONFIG_NOLOGIN is not set # CONFIG_NOLOGIN_DEPENDENCIES is not set # CONFIG_NSENTER is not set # CONFIG_PIVOT_ROOT is not set CONFIG_RDATE=y # CONFIG_RDEV is not set # CONFIG_READPROFILE is not set CONFIG_RENICE=y # CONFIG_REV is not set # CONFIG_RTCWAKE is not set # CONFIG_SCRIPT is not set # CONFIG_SCRIPTREPLAY is not set # CONFIG_SETARCH is not set # CONFIG_LINUX32 is not set # CONFIG_LINUX64 is not set # CONFIG_SETPRIV is not set # CONFIG_FEATURE_SETPRIV_DUMP is not set # CONFIG_FEATURE_SETPRIV_CAPABILITIES is not set # CONFIG_FEATURE_SETPRIV_CAPABILITY_NAMES is not set # CONFIG_SETSID is not set # CONFIG_SWAPON is not set # CONFIG_FEATURE_SWAPON_DISCARD is not set # CONFIG_FEATURE_SWAPON_PRI is not set # CONFIG_SWAPOFF is not set # CONFIG_FEATURE_SWAPONOFF_LABEL is not set CONFIG_SWITCH_ROOT=y # CONFIG_TASKSET is not set # CONFIG_FEATURE_TASKSET_FANCY is not set # CONFIG_FEATURE_TASKSET_CPULIST is not set CONFIG_UEVENT=y CONFIG_UMOUNT=y CONFIG_FEATURE_UMOUNT_ALL=y # CONFIG_UNSHARE is not set # CONFIG_WALL is not set # # Common options for mount/umount # CONFIG_FEATURE_MOUNT_LOOP=y CONFIG_FEATURE_MOUNT_LOOP_CREATE=y # CONFIG_FEATURE_MTAB_SUPPORT is not set CONFIG_VOLUMEID=y # # Filesystem/Volume identification # # CONFIG_FEATURE_VOLUMEID_BCACHE is not set CONFIG_FEATURE_VOLUMEID_BTRFS=y CONFIG_FEATURE_VOLUMEID_CRAMFS=y CONFIG_FEATURE_VOLUMEID_EXFAT=y CONFIG_FEATURE_VOLUMEID_EXT=y CONFIG_FEATURE_VOLUMEID_F2FS=y CONFIG_FEATURE_VOLUMEID_FAT=y CONFIG_FEATURE_VOLUMEID_HFS=y CONFIG_FEATURE_VOLUMEID_ISO9660=y CONFIG_FEATURE_VOLUMEID_JFS=y # CONFIG_FEATURE_VOLUMEID_LFS is not set CONFIG_FEATURE_VOLUMEID_LINUXRAID=y CONFIG_FEATURE_VOLUMEID_LINUXSWAP=y CONFIG_FEATURE_VOLUMEID_LUKS=y CONFIG_FEATURE_VOLUMEID_MINIX=y CONFIG_FEATURE_VOLUMEID_NILFS=y CONFIG_FEATURE_VOLUMEID_NTFS=y CONFIG_FEATURE_VOLUMEID_OCFS2=y CONFIG_FEATURE_VOLUMEID_REISERFS=y CONFIG_FEATURE_VOLUMEID_ROMFS=y # CONFIG_FEATURE_VOLUMEID_SQUASHFS is not set CONFIG_FEATURE_VOLUMEID_SYSV=y CONFIG_FEATURE_VOLUMEID_UBIFS=y CONFIG_FEATURE_VOLUMEID_UDF=y CONFIG_FEATURE_VOLUMEID_XFS=y # # Miscellaneous Utilities # # CONFIG_ADJTIMEX is not set # CONFIG_BBCONFIG is not set # CONFIG_FEATURE_COMPRESS_BBCONFIG is not set # CONFIG_BC is not set # CONFIG_DC is not set # CONFIG_FEATURE_DC_BIG is not set # CONFIG_FEATURE_DC_LIBM is not set # CONFIG_FEATURE_BC_INTERACTIVE is not set # CONFIG_FEATURE_BC_LONG_OPTIONS is not set # CONFIG_BEEP is not set CONFIG_FEATURE_BEEP_FREQ=0 CONFIG_FEATURE_BEEP_LENGTH_MS=0 # CONFIG_CHAT is not set # CONFIG_FEATURE_CHAT_NOFAIL is not set # CONFIG_FEATURE_CHAT_TTY_HIFI is not set # CONFIG_FEATURE_CHAT_IMPLICIT_CR is not set # CONFIG_FEATURE_CHAT_SWALLOW_OPTS is not set # CONFIG_FEATURE_CHAT_SEND_ESCAPES is not set # CONFIG_FEATURE_CHAT_VAR_ABORT_LEN is not set # CONFIG_FEATURE_CHAT_CLR_ABORT is not set # CONFIG_CONSPY is not set CONFIG_CROND=y CONFIG_FEATURE_CROND_D=y # CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set # CONFIG_FEATURE_CROND_SPECIAL_TIMES is not set CONFIG_FEATURE_CROND_DIR="/storage/.cache/cron" CONFIG_CRONTAB=y # CONFIG_DEVFSD is not set # CONFIG_DEVFSD_MODLOAD is not set # CONFIG_DEVFSD_FG_NP is not set # CONFIG_DEVFSD_VERBOSE is not set # CONFIG_FEATURE_DEVFS is not set CONFIG_DEVMEM=y # CONFIG_FBSPLASH is not set CONFIG_FLASH_ERASEALL=y # CONFIG_FLASH_LOCK is not set # CONFIG_FLASH_UNLOCK is not set # CONFIG_FLASHCP is not set # CONFIG_HDPARM is not set # CONFIG_FEATURE_HDPARM_GET_IDENTITY is not set # CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set # CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set # CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set # CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set # CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA is not set # CONFIG_HEXEDIT is not set # CONFIG_I2CGET is not set # CONFIG_I2CSET is not set # CONFIG_I2CDUMP is not set # CONFIG_I2CDETECT is not set # CONFIG_I2CTRANSFER is not set # CONFIG_INOTIFYD is not set CONFIG_LESS=y CONFIG_FEATURE_LESS_MAXLINES=9999999 CONFIG_FEATURE_LESS_BRACKETS=y CONFIG_FEATURE_LESS_FLAGS=y CONFIG_FEATURE_LESS_TRUNCATE=y CONFIG_FEATURE_LESS_MARKS=y CONFIG_FEATURE_LESS_REGEXP=y CONFIG_FEATURE_LESS_WINCH=y CONFIG_FEATURE_LESS_ASK_TERMINAL=y CONFIG_FEATURE_LESS_DASHCMD=y CONFIG_FEATURE_LESS_LINENUMS=y CONFIG_FEATURE_LESS_RAW=y CONFIG_FEATURE_LESS_ENV=y # CONFIG_LSSCSI is not set # CONFIG_MAKEDEVS is not set # CONFIG_FEATURE_MAKEDEVS_LEAF is not set # CONFIG_FEATURE_MAKEDEVS_TABLE is not set # CONFIG_MAN is not set # CONFIG_MICROCOM is not set # CONFIG_MIM is not set # CONFIG_MT is not set CONFIG_NANDWRITE=y # CONFIG_NANDDUMP is not set # CONFIG_PARTPROBE is not set # CONFIG_RAIDAUTORUN is not set # CONFIG_READAHEAD is not set CONFIG_RFKILL=y # CONFIG_RUNLEVEL is not set # CONFIG_RX is not set # CONFIG_SETFATTR is not set CONFIG_SETSERIAL=y # CONFIG_STRINGS is not set CONFIG_TIME=y # CONFIG_TS is not set CONFIG_TTYSIZE=y # CONFIG_UBIATTACH is not set # CONFIG_UBIDETACH is not set # CONFIG_UBIMKVOL is not set # CONFIG_UBIRMVOL is not set # CONFIG_UBIRSVOL is not set # CONFIG_UBIUPDATEVOL is not set # CONFIG_UBIRENAME is not set # CONFIG_VOLNAME is not set # CONFIG_WATCHDOG is not set # # Networking Utilities # CONFIG_FEATURE_IPV6=y # CONFIG_FEATURE_UNIX_LOCAL is not set CONFIG_FEATURE_PREFER_IPV4_ADDRESS=y # CONFIG_VERBOSE_RESOLUTION_ERRORS is not set # CONFIG_FEATURE_TLS_SHA1 is not set CONFIG_ARP=y CONFIG_ARPING=y CONFIG_BRCTL=y CONFIG_FEATURE_BRCTL_FANCY=y CONFIG_FEATURE_BRCTL_SHOW=y # CONFIG_DNSD is not set CONFIG_ETHER_WAKE=y # CONFIG_FTPD is not set # CONFIG_FEATURE_FTPD_WRITE is not set # CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST is not set # CONFIG_FEATURE_FTPD_AUTHENTICATION is not set CONFIG_FTPGET=y CONFIG_FTPPUT=y CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS=y CONFIG_HOSTNAME=y CONFIG_DNSDOMAINNAME=y # CONFIG_HTTPD is not set # CONFIG_FEATURE_HTTPD_RANGES is not set # CONFIG_FEATURE_HTTPD_SETUID is not set # CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set # CONFIG_FEATURE_HTTPD_AUTH_MD5 is not set # CONFIG_FEATURE_HTTPD_CGI is not set # CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set # CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set # CONFIG_FEATURE_HTTPD_ENCODE_URL_STR is not set # CONFIG_FEATURE_HTTPD_ERROR_PAGES is not set # CONFIG_FEATURE_HTTPD_PROXY is not set # CONFIG_FEATURE_HTTPD_GZIP is not set CONFIG_IFCONFIG=y CONFIG_FEATURE_IFCONFIG_STATUS=y # CONFIG_FEATURE_IFCONFIG_SLIP is not set # CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set CONFIG_FEATURE_IFCONFIG_HW=y CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS=y # CONFIG_IFENSLAVE is not set CONFIG_IFPLUGD=y # CONFIG_IFUP is not set # CONFIG_IFDOWN is not set CONFIG_IFUPDOWN_IFSTATE_PATH="" # CONFIG_FEATURE_IFUPDOWN_IP is not set # CONFIG_FEATURE_IFUPDOWN_IPV4 is not set # CONFIG_FEATURE_IFUPDOWN_IPV6 is not set # CONFIG_FEATURE_IFUPDOWN_MAPPING is not set # CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set # CONFIG_INETD is not set # CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set # CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set # CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME is not set # CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME is not set # CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN is not set # CONFIG_FEATURE_INETD_RPC is not set CONFIG_IP=y # CONFIG_IPADDR is not set # CONFIG_IPLINK is not set # CONFIG_IPROUTE is not set # CONFIG_IPTUNNEL is not set # CONFIG_IPRULE is not set # CONFIG_IPNEIGH is not set CONFIG_FEATURE_IP_ADDRESS=y CONFIG_FEATURE_IP_LINK=y CONFIG_FEATURE_IP_ROUTE=y CONFIG_FEATURE_IP_ROUTE_DIR="/storage/.config/iproute2" CONFIG_FEATURE_IP_TUNNEL=y CONFIG_FEATURE_IP_RULE=y # CONFIG_FEATURE_IP_NEIGH is not set # CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set # CONFIG_IPCALC is not set # CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set # CONFIG_FEATURE_IPCALC_FANCY is not set # CONFIG_FAKEIDENTD is not set # CONFIG_NAMEIF is not set # CONFIG_FEATURE_NAMEIF_EXTENDED is not set CONFIG_NBDCLIENT=y CONFIG_NC=y # CONFIG_NETCAT is not set CONFIG_NC_SERVER=y CONFIG_NC_EXTRA=y CONFIG_NC_110_COMPAT=y CONFIG_NETSTAT=y # CONFIG_FEATURE_NETSTAT_WIDE is not set CONFIG_FEATURE_NETSTAT_PRG=y CONFIG_NSLOOKUP=y # CONFIG_FEATURE_NSLOOKUP_BIG is not set # CONFIG_FEATURE_NSLOOKUP_LONG_OPTIONS is not set CONFIG_NTPD=y # CONFIG_FEATURE_NTPD_SERVER is not set CONFIG_FEATURE_NTPD_CONF=y CONFIG_FEATURE_NTP_AUTH=y CONFIG_PING=y CONFIG_PING6=y CONFIG_FEATURE_FANCY_PING=y # CONFIG_PSCAN is not set CONFIG_ROUTE=y # CONFIG_SLATTACH is not set # CONFIG_SSL_CLIENT is not set # CONFIG_TC is not set # CONFIG_FEATURE_TC_INGRESS is not set # CONFIG_TCPSVD is not set # CONFIG_UDPSVD is not set CONFIG_TELNET=y CONFIG_FEATURE_TELNET_TTYPE=y CONFIG_FEATURE_TELNET_AUTOLOGIN=y # CONFIG_FEATURE_TELNET_WIDTH is not set # CONFIG_TELNETD is not set # CONFIG_FEATURE_TELNETD_STANDALONE is not set # CONFIG_FEATURE_TELNETD_INETD_WAIT is not set # CONFIG_TFTP is not set # CONFIG_FEATURE_TFTP_PROGRESS_BAR is not set # CONFIG_FEATURE_TFTP_HPA_COMPAT is not set # CONFIG_TFTPD is not set # CONFIG_FEATURE_TFTP_GET is not set # CONFIG_FEATURE_TFTP_PUT is not set # CONFIG_FEATURE_TFTP_BLOCKSIZE is not set # CONFIG_TFTP_DEBUG is not set # CONFIG_TLS is not set CONFIG_TRACEROUTE=y CONFIG_TRACEROUTE6=y CONFIG_FEATURE_TRACEROUTE_VERBOSE=y # CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set # CONFIG_TUNCTL is not set # CONFIG_FEATURE_TUNCTL_UG is not set CONFIG_VCONFIG=y # CONFIG_WGET is not set # CONFIG_FEATURE_WGET_LONG_OPTIONS is not set # CONFIG_FEATURE_WGET_STATUSBAR is not set # CONFIG_FEATURE_WGET_AUTHENTICATION is not set # CONFIG_FEATURE_WGET_TIMEOUT is not set # CONFIG_FEATURE_WGET_HTTPS is not set # CONFIG_FEATURE_WGET_OPENSSL is not set CONFIG_WHOIS=y # CONFIG_ZCIP is not set # CONFIG_UDHCPD is not set # CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set # CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set CONFIG_DHCPD_LEASES_FILE="" # CONFIG_DUMPLEASES is not set # CONFIG_DHCPRELAY is not set # CONFIG_UDHCPC is not set # CONFIG_FEATURE_UDHCPC_ARPING is not set # CONFIG_FEATURE_UDHCPC_SANITIZEOPT is not set CONFIG_UDHCPC_DEFAULT_SCRIPT="" # CONFIG_UDHCPC6 is not set # CONFIG_FEATURE_UDHCPC6_RFC3646 is not set # CONFIG_FEATURE_UDHCPC6_RFC4704 is not set # CONFIG_FEATURE_UDHCPC6_RFC4833 is not set # CONFIG_FEATURE_UDHCPC6_RFC5970 is not set # CONFIG_FEATURE_UDHCP_PORT is not set CONFIG_UDHCP_DEBUG=0 CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=0 # CONFIG_FEATURE_UDHCP_RFC3397 is not set # CONFIG_FEATURE_UDHCP_8021Q is not set CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="" # # Print Utilities # # CONFIG_LPD is not set # CONFIG_LPR is not set # CONFIG_LPQ is not set # # Mail Utilities # # CONFIG_MAKEMIME is not set # CONFIG_POPMAILDIR is not set # CONFIG_FEATURE_POPMAILDIR_DELIVERY is not set # CONFIG_REFORMIME is not set # CONFIG_FEATURE_REFORMIME_COMPAT is not set # CONFIG_SENDMAIL is not set CONFIG_FEATURE_MIME_CHARSET="" # # Process Utilities # # CONFIG_FREE is not set CONFIG_FUSER=y CONFIG_IOSTAT=y CONFIG_KILL=y CONFIG_KILLALL=y CONFIG_KILLALL5=y CONFIG_LSOF=y CONFIG_MPSTAT=y # CONFIG_NMETER is not set CONFIG_PGREP=y CONFIG_PKILL=y CONFIG_PIDOF=y CONFIG_FEATURE_PIDOF_SINGLE=y CONFIG_FEATURE_PIDOF_OMIT=y CONFIG_PMAP=y # CONFIG_POWERTOP is not set # CONFIG_FEATURE_POWERTOP_INTERACTIVE is not set CONFIG_PS=y # CONFIG_FEATURE_PS_WIDE is not set # CONFIG_FEATURE_PS_LONG is not set CONFIG_FEATURE_PS_TIME=y # CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS=y CONFIG_PSTREE=y CONFIG_PWDX=y CONFIG_SMEMCAP=y CONFIG_BB_SYSCTL=y # CONFIG_TOP is not set # CONFIG_FEATURE_TOP_INTERACTIVE is not set # CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE is not set # CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS is not set # CONFIG_FEATURE_TOP_SMP_CPU is not set # CONFIG_FEATURE_TOP_DECIMALS is not set # CONFIG_FEATURE_TOP_SMP_PROCESS is not set # CONFIG_FEATURE_TOPMEM is not set CONFIG_UPTIME=y # CONFIG_FEATURE_UPTIME_UTMP_SUPPORT is not set CONFIG_WATCH=y CONFIG_FEATURE_SHOW_THREADS=y # # Runit Utilities # # CONFIG_CHPST is not set # CONFIG_SETUIDGID is not set # CONFIG_ENVUIDGID is not set # CONFIG_ENVDIR is not set # CONFIG_SOFTLIMIT is not set # CONFIG_RUNSV is not set # CONFIG_RUNSVDIR is not set # CONFIG_FEATURE_RUNSVDIR_LOG is not set # CONFIG_SV is not set CONFIG_SV_DEFAULT_SERVICE_DIR="" # CONFIG_SVC is not set # CONFIG_SVOK is not set # CONFIG_SVLOGD is not set # CONFIG_CHCON is not set # CONFIG_GETENFORCE is not set # CONFIG_GETSEBOOL is not set # CONFIG_LOAD_POLICY is not set # CONFIG_MATCHPATHCON is not set # CONFIG_RUNCON is not set # CONFIG_SELINUXENABLED is not set # CONFIG_SESTATUS is not set # CONFIG_SETENFORCE is not set # CONFIG_SETFILES is not set # CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set # CONFIG_RESTORECON is not set # CONFIG_SETSEBOOL is not set # # Shells # CONFIG_SH_IS_ASH=y # CONFIG_SH_IS_HUSH is not set # CONFIG_SH_IS_NONE is not set CONFIG_BASH_IS_ASH=y # CONFIG_BASH_IS_HUSH is not set # CONFIG_BASH_IS_NONE is not set CONFIG_SHELL_ASH=y CONFIG_ASH=y # CONFIG_ASH_OPTIMIZE_FOR_SIZE is not set # CONFIG_ASH_INTERNAL_GLOB is not set CONFIG_ASH_BASH_COMPAT=y # CONFIG_ASH_BASH_SOURCE_CURDIR is not set # CONFIG_ASH_BASH_NOT_FOUND_HOOK is not set CONFIG_ASH_JOB_CONTROL=y CONFIG_ASH_ALIAS=y CONFIG_ASH_RANDOM_SUPPORT=y CONFIG_ASH_EXPAND_PRMT=y # CONFIG_ASH_IDLE_TIMEOUT is not set # CONFIG_ASH_MAIL is not set CONFIG_ASH_ECHO=y CONFIG_ASH_PRINTF=y CONFIG_ASH_TEST=y CONFIG_ASH_HELP=y CONFIG_ASH_GETOPTS=y CONFIG_ASH_CMDCMD=y # CONFIG_CTTYHACK is not set # CONFIG_HUSH is not set # CONFIG_SHELL_HUSH is not set # CONFIG_HUSH_BASH_COMPAT is not set # CONFIG_HUSH_BRACE_EXPANSION is not set # CONFIG_HUSH_LINENO_VAR is not set # CONFIG_HUSH_BASH_SOURCE_CURDIR is not set # CONFIG_HUSH_INTERACTIVE is not set # CONFIG_HUSH_SAVEHISTORY is not set # CONFIG_HUSH_JOB is not set # CONFIG_HUSH_TICK is not set # CONFIG_HUSH_IF is not set # CONFIG_HUSH_LOOPS is not set # CONFIG_HUSH_CASE is not set # CONFIG_HUSH_FUNCTIONS is not set # CONFIG_HUSH_LOCAL is not set # CONFIG_HUSH_RANDOM_SUPPORT is not set # CONFIG_HUSH_MODE_X is not set # CONFIG_HUSH_ECHO is not set # CONFIG_HUSH_PRINTF is not set # CONFIG_HUSH_TEST is not set # CONFIG_HUSH_HELP is not set # CONFIG_HUSH_EXPORT is not set # CONFIG_HUSH_EXPORT_N is not set # CONFIG_HUSH_READONLY is not set # CONFIG_HUSH_KILL is not set # CONFIG_HUSH_WAIT is not set # CONFIG_HUSH_COMMAND is not set # CONFIG_HUSH_TRAP is not set # CONFIG_HUSH_TYPE is not set # CONFIG_HUSH_TIMES is not set # CONFIG_HUSH_READ is not set # CONFIG_HUSH_SET is not set # CONFIG_HUSH_UNSET is not set # CONFIG_HUSH_ULIMIT is not set # CONFIG_HUSH_UMASK is not set # CONFIG_HUSH_GETOPTS is not set # CONFIG_HUSH_MEMLEAK is not set # # Options common to all shells # CONFIG_FEATURE_SH_MATH=y CONFIG_FEATURE_SH_MATH_64=y CONFIG_FEATURE_SH_MATH_BASE=y CONFIG_FEATURE_SH_EXTRA_QUIET=y # CONFIG_FEATURE_SH_STANDALONE is not set # CONFIG_FEATURE_SH_NOFORK is not set CONFIG_FEATURE_SH_READ_FRAC=y CONFIG_FEATURE_SH_HISTFILESIZE=y # CONFIG_FEATURE_SH_EMBEDDED_SCRIPTS is not set # # System Logging Utilities # # CONFIG_KLOGD is not set # CONFIG_FEATURE_KLOGD_KLOGCTL is not set CONFIG_LOGGER=y # CONFIG_LOGREAD is not set # CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING is not set # CONFIG_SYSLOGD is not set # CONFIG_FEATURE_ROTATE_LOGFILE is not set # CONFIG_FEATURE_REMOTE_LOG is not set # CONFIG_FEATURE_SYSLOGD_DUP is not set # CONFIG_FEATURE_SYSLOGD_CFG is not set # CONFIG_FEATURE_SYSLOGD_PRECISE_TIMESTAMPS is not set CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=0 # CONFIG_FEATURE_IPC_SYSLOG is not set CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0 # CONFIG_FEATURE_KMSG_SYSLOG is not set ================================================ FILE: packages/sysutils/busybox/config/inputrc ================================================ # /etc/inputrc - global inputrc for libreadline # See readline(3readline) and `info rluserman' for more information. # Be 8 bit clean. set input-meta on set output-meta on # To allow the use of 8bit-characters like the german umlauts, uncomment # the line below. However this makes the meta key not work as a meta key, # which is annoying to those which don't need to type in 8-bit characters. # set convert-meta off # try to enable the application keypad when it is called. Some systems # need this to enable the arrow keys. # set enable-keypad on # see /usr/share/doc/bash/inputrc.arrows for other codes of arrow keys # do not bell on tab-completion # set bell-style none # set bell-style visible # some defaults / modifications for the emacs mode $if mode=emacs # allow the use of the Home/End keys "\e[1~": beginning-of-line "\e[4~": end-of-line # allow the use of the Delete/Insert keys "\e[3~": delete-char "\e[2~": quoted-insert # mappings for "page up" and "page down" to step to the beginning/end # of the history # "\e[5~": beginning-of-history # "\e[6~": end-of-history # alternate mappings for "page up" and "page down" to search the history # "\e[5~": history-search-backward # "\e[6~": history-search-forward # mappings for Ctrl-left-arrow and Ctrl-right-arrow for word moving "\e[1;5C": forward-word "\e[1;5D": backward-word "\e[5C": forward-word "\e[5D": backward-word "\e\e[C": forward-word "\e\e[D": backward-word $if term=rxvt "\e[8~": end-of-line "\eOc": forward-word "\eOd": backward-word $endif # for non RH/Debian xterm, can't hurt for RH/Debian xterm # "\eOH": beginning-of-line # "\eOF": end-of-line # for freebsd console # "\e[H": beginning-of-line # "\e[F": end-of-line $endif ================================================ FILE: packages/sysutils/busybox/config/profile ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # parse command line arguments for arg in $(cat /proc/cmdline); do case $arg in debugging) export DEBUG=yes ;; progress) PROGRESS=yes ;; esac done if [ -e /storage/.cache/debug.libreelec ] ; then export DEBUG=yes fi # functions progress() { if test "$PROGRESS" = yes; then logger -s -t Boot "### $1 ###" else logger -t Boot "### $1 ###" fi } # read config files for config in /etc/profile.d/*; do if [ -f "$config" ] ; then . $config fi done ================================================ FILE: packages/sysutils/busybox/config/suspend-modules.conf ================================================ SUSPEND_MODULES="jme asix anysee rtl8192se imon r8712u cx23885 cdc_acm ddbridge brcmfmac 8812au xpad" ================================================ FILE: packages/sysutils/busybox/default.d/crond.conf ================================================ ================================================ FILE: packages/sysutils/busybox/package.mk ================================================ # 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) PKG_NAME="busybox" PKG_VERSION="1.32.1" PKG_SHA256="9d57c4bd33974140fd4111260468af22856f12f5b5ef7c70c8d9b75c712a0dee" PKG_LICENSE="GPL" PKG_SITE="http://www.busybox.net" PKG_URL="https://busybox.net/downloads/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain hdparm hd-idle dosfstools e2fsprogs zip usbutils parted procps-ng gptfdisk libtirpc cryptsetup" PKG_DEPENDS_INIT="toolchain libtirpc" PKG_LONGDESC="BusyBox combines tiny versions of many common UNIX utilities into a single small executable." PKG_BUILD_FLAGS="-parallel" # nano text editor if [ "${NANO_EDITOR}" = "yes" ]; then PKG_DEPENDS_TARGET+=" nano" fi # nfs support if [ "${NFS_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" rpcbind" fi if [ "${DEVICE}" = "Amlogic-ng" ] || [ "${DEVICE}" = "Amlogic-no" ]; then PKG_DEPENDS_TARGET+=" pciutils" fi pre_build_target() { PKG_MAKE_OPTS_TARGET="ARCH=${TARGET_ARCH} \ HOSTCC=${HOST_CC} \ CROSS_COMPILE=${TARGET_PREFIX} \ KBUILD_VERBOSE=1 \ install" mkdir -p ${PKG_BUILD}/.${TARGET_NAME} cp -RP ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME} } pre_build_init() { PKG_MAKE_OPTS_INIT="ARCH=${TARGET_ARCH} \ HOSTCC=${HOST_CC} \ CROSS_COMPILE=${TARGET_PREFIX} \ KBUILD_VERBOSE=1 \ install" mkdir -p ${PKG_BUILD}/.${TARGET_NAME}-init cp -RP ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME}-init } configure_target() { cd ${PKG_BUILD}/.${TARGET_NAME} find_file_path config/busybox-target.conf cp ${FOUND_PATH} .config # set install dir sed -i -e "s|^CONFIG_PREFIX=.*$|CONFIG_PREFIX=\"${INSTALL}/usr\"|" .config if [ ! "${CRON_SUPPORT}" = "yes" ]; then sed -i -e "s|^CONFIG_CROND=.*$|# CONFIG_CROND is not set|" .config sed -i -e "s|^CONFIG_FEATURE_CROND_D=.*$|# CONFIG_FEATURE_CROND_D is not set|" .config sed -i -e "s|^CONFIG_CRONTAB=.*$|# CONFIG_CRONTAB is not set|" .config sed -i -e "s|^CONFIG_FEATURE_CROND_SPECIAL_TIMES=.*$|# CONFIG_FEATURE_CROND_SPECIAL_TIMES is not set|" .config fi if [ ! "${SAMBA_SUPPORT}" = yes ]; then sed -i -e "s|^CONFIG_FEATURE_MOUNT_CIFS=.*$|# CONFIG_FEATURE_MOUNT_CIFS is not set|" .config fi # optimize for size CFLAGS=$(echo ${CFLAGS} | sed -e "s|-Ofast|-Os|") CFLAGS=$(echo ${CFLAGS} | sed -e "s|-O.|-Os|") CFLAGS+=" -I${SYSROOT_PREFIX}/usr/include/tirpc" LDFLAGS+=" -fwhole-program" make oldconfig } configure_init() { cd ${PKG_BUILD}/.${TARGET_NAME}-init find_file_path config/busybox-init.conf cp ${FOUND_PATH} .config # set install dir sed -i -e "s|^CONFIG_PREFIX=.*$|CONFIG_PREFIX=\"${INSTALL}/usr\"|" .config # optimize for size CFLAGS=$(echo ${CFLAGS} | sed -e "s|-Ofast|-Os|") CFLAGS=$(echo ${CFLAGS} | sed -e "s|-O.|-Os|") CFLAGS+=" -I${SYSROOT_PREFIX}/usr/include/tirpc" LDFLAGS+=" -fwhole-program" make oldconfig } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin if [ ${TARGET_ARCH} = x86_64 ]; then cp ${PKG_DIR}/scripts/getedid ${INSTALL}/usr/bin else cp ${PKG_DIR}/scripts/dump-active-edids-drm ${INSTALL}/usr/bin/dump-active-edids fi cp ${PKG_DIR}/scripts/create-edid-cpio ${INSTALL}/usr/bin/ if [ "${PROJECT}" = "RPi" ]; then cp ${PKG_DIR}/scripts/update-bootloader-edid-rpi ${INSTALL}/usr/bin/update-bootloader-edid cp ${PKG_DIR}/scripts/getedid-drm ${INSTALL}/usr/bin/getedid fi cp ${PKG_DIR}/scripts/createlog ${INSTALL}/usr/bin/ cp ${PKG_DIR}/scripts/dthelper ${INSTALL}/usr/bin ln -sf dthelper ${INSTALL}/usr/bin/dtfile ln -sf dthelper ${INSTALL}/usr/bin/dtflag ln -sf dthelper ${INSTALL}/usr/bin/dtname ln -sf dthelper ${INSTALL}/usr/bin/dtsoc cp ${PKG_DIR}/scripts/ledfix ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/lsb_release ${INSTALL}/usr/bin/ cp ${PKG_DIR}/scripts/apt-get ${INSTALL}/usr/bin/ cp ${PKG_DIR}/scripts/sudo ${INSTALL}/usr/bin/ cp ${PKG_DIR}/scripts/pastebinit ${INSTALL}/usr/bin/ cp ${PKG_DIR}/scripts/convert_dtname ${INSTALL}/usr/bin ln -sf pastebinit ${INSTALL}/usr/bin/paste cp ${PKG_DIR}/scripts/vfd-clock ${INSTALL}/usr/bin/ mkdir -p ${INSTALL}/usr/sbin cp ${PKG_DIR}/scripts/kernel-overlays-setup ${INSTALL}/usr/sbin mkdir -p ${INSTALL}/usr/lib/libreelec cp ${PKG_DIR}/scripts/functions ${INSTALL}/usr/lib/libreelec cp ${PKG_DIR}/scripts/fs-resize ${INSTALL}/usr/lib/libreelec sed -e "s/@DISTRONAME@/${DISTRONAME}/g" \ -i ${INSTALL}/usr/lib/libreelec/fs-resize if listcontains "${FIRMWARE}" "rpi-eeprom"; then cp ${PKG_DIR}/scripts/rpi-flash-firmware ${INSTALL}/usr/lib/libreelec fi mkdir -p ${INSTALL}/usr/lib/systemd/system-generators/ cp ${PKG_DIR}/scripts/libreelec-target-generator ${INSTALL}/usr/lib/systemd/system-generators/ mkdir -p ${INSTALL}/etc cp ${PKG_DIR}/config/profile ${INSTALL}/etc cp ${PKG_DIR}/config/inputrc ${INSTALL}/etc cp ${PKG_DIR}/config/suspend-modules.conf ${INSTALL}/etc # /etc/fstab is needed by... touch ${INSTALL}/etc/fstab # /etc/machine-id, needed by systemd and dbus ln -sf /storage/.cache/systemd-machine-id ${INSTALL}/etc/machine-id # /etc/mtab is needed by udisks etc... ln -sf /proc/self/mounts ${INSTALL}/etc/mtab # create /etc/hostname ln -sf /proc/sys/kernel/hostname ${INSTALL}/etc/hostname # remove bash symbolic link because we use real bash rm ${INSTALL}/usr/bin/bash } post_install() { echo "chmod 4755 ${INSTALL}/usr/bin/busybox" >> ${FAKEROOT_SCRIPT} echo "chmod 000 ${INSTALL}/usr/cache/shadow" >> ${FAKEROOT_SCRIPT} add_user root "${ROOT_PASSWORD}" 0 0 "Root User" "/storage" "/bin/sh" add_group root 0 add_group users 100 add_user nobody x 65534 65534 "Nobody" "/" "/bin/sh" add_group nogroup 65534 enable_service fs-resize.service enable_service ledfix.service enable_service shell.service enable_service show-version.service enable_service vfd-clock.service enable_service var.mount enable_service locale.service listcontains "${FIRMWARE}" "rpi-eeprom" && enable_service rpi-flash-firmware.service # cron support if [ "${CRON_SUPPORT}" = "yes" ]; then mkdir -p ${INSTALL}/usr/lib/systemd/system cp ${PKG_DIR}/system.d.opt/cron.service ${INSTALL}/usr/lib/systemd/system enable_service cron.service mkdir -p ${INSTALL}/usr/share/services cp -P ${PKG_DIR}/default.d/*.conf ${INSTALL}/usr/share/services cp ${PKG_DIR}/system.d.opt/cron-defaults.service ${INSTALL}/usr/lib/systemd/system enable_service cron-defaults.service fi } makeinstall_init() { mkdir -p ${INSTALL}/bin ln -sf busybox ${INSTALL}/usr/bin/sh chmod 4755 ${INSTALL}/usr/bin/busybox mkdir -p ${INSTALL}/etc touch ${INSTALL}/etc/fstab ln -sf /proc/self/mounts ${INSTALL}/etc/mtab if find_file_path initramfs/platform_init; then cp ${FOUND_PATH} ${INSTALL} sed -e "s/@BOOT_LABEL@/${DISTRO_BOOTLABEL}/g" \ -e "s/@DISK_LABEL@/${DISTRO_DISKLABEL}/g" \ -i ${INSTALL}/platform_init chmod 755 ${INSTALL}/platform_init fi cp ${PKG_DIR}/scripts/functions ${INSTALL} cp ${PKG_DIR}/scripts/init ${INSTALL} sed -e "s/@DISTRONAME@/${DISTRONAME}/g" \ -e "s/@KERNEL_NAME@/${KERNEL_NAME}/g" \ -e "s/@SYSTEM_SIZE@/${SYSTEM_SIZE}/g" \ -i ${INSTALL}/init chmod 755 ${INSTALL}/init } ================================================ FILE: packages/sysutils/busybox/patches/busybox-00_halt_no_init.patch ================================================ diff -Naur busybox-1.13.2/init/halt.c busybox-1.13.2a/init/halt.c --- busybox-1.13.2/init/halt.c 2008-11-09 18:28:19.000000000 +0100 +++ busybox-1.13.2a/init/halt.c 2009-02-01 16:38:37.000000000 +0100 @@ -79,7 +79,7 @@ /* Perform action. */ rc = 1; - if (!(flags & 4)) { /* no -f */ + if (ENABLE_INIT && !(flags & 4)) { /* no -f */ //TODO: I tend to think that signalling linuxrc is wrong // pity original author didn't comment on it... if (ENABLE_FEATURE_INITRD) { ================================================ FILE: packages/sysutils/busybox/patches/busybox-02_silence-crond-startup-logging.patch ================================================ From 5f4085ddb16c206b1dc36d481c2aa6684ba392ee Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Thu, 18 Jul 2013 19:26:21 +0300 Subject: [PATCH] silence crond startup logging --- miscutils/crond.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff -Naur busybox-1.23.0/miscutils/crond.c busybox-1.23.0.patch/miscutils/crond.c --- busybox-1.23.0/miscutils/crond.c 2014-10-04 22:35:59.000000000 +0200 +++ busybox-1.23.0.patch/miscutils/crond.c 2014-12-26 23:07:53.386118290 +0100 @@ -1054,7 +1054,6 @@ /* Useful on Android where DEFAULT_SHELL /bin/sh may not exist */ G.default_shell = xstrdup(get_shell_name()); - log8("crond (busybox "BB_VER") started, log level %d", G.log_level); rescan_crontab_dir(); write_pidfile(CONFIG_PID_FILE_PATH "/crond.pid"); #if ENABLE_FEATURE_CROND_SPECIAL_TIMES ================================================ FILE: packages/sysutils/busybox/patches/busybox-03-make_unicode_printable.patch ================================================ # # stolen from OpenWRT # # https://dev.openwrt.org/attachment/ticket/7993/701-make_unicode_printable.patch # --- a/libbb/printable_string.c 2013-01-13 20:06:04.210089516 +0800 +++ b/libbb/printable_string.c 2013-01-13 20:00:27.917211167 +0800 @@ -31,8 +31,6 @@ } if (c < ' ') break; - if (c >= 0x7f) - break; s++; } @@ -45,7 +43,7 @@ unsigned char c = *d; if (c == '\0') break; - if (c < ' ' || c >= 0x7f) + if (c < ' ') *d = '?'; d++; } ================================================ FILE: packages/sysutils/busybox/patches/busybox-04-revert-dd-fsync-change.patch ================================================ From 0a61b6174d86fd0300be7cd4fa0b47ff12735958 Mon Sep 17 00:00:00 2001 From: MilhouseVH <milhouseVH.github@nmacleod.com> Date: Tue, 8 Aug 2017 22:25:03 +0100 Subject: [PATCH] Revert "dd: call fsync() only once before exiting if conv=fsync is specified" This reverts commit dba0dc1999bb1e8bfe64607e2a9385cda361fcb7. --- coreutils/dd.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/coreutils/dd.c b/coreutils/dd.c index d302f35..bf0c4ab 100644 --- a/coreutils/dd.c +++ b/coreutils/dd.c @@ -531,11 +531,11 @@ int dd_main(int argc UNUSED_PARAM, char **argv) if (write_and_stats(ibuf, n, obs, outfile)) goto out_status; } - } - if (G.flags & FLAG_FSYNC) { - if (fsync(ofd) < 0) - goto die_outfile; + if (G.flags & FLAG_FSYNC) { + if (fsync(ofd) < 0) + goto die_outfile; + } } if (ENABLE_FEATURE_DD_IBS_OBS && oc) { -- 2.7.4 ================================================ FILE: packages/sysutils/busybox/patches/busybox-05-update-shadow-or-passwd-not-both.patch ================================================ diff -Naur a/loginutils/passwd.c b/loginutils/passwd.c --- a/loginutils/passwd.c 2017-07-06 08:14:57.000000000 -0700 +++ b/loginutils/passwd.c 2017-09-11 17:06:07.572805135 -0700 @@ -220,7 +220,7 @@ if (rc > 0) /* password in /etc/shadow was updated */ newp = (char*) "x"; - if (rc >= 0) + if (rc == 0) /* 0 = /etc/shadow missing (not an error), >0 = passwd changed in /etc/shadow */ #endif { ================================================ FILE: packages/sysutils/busybox/patches/busybox-06-prevent-root-weak-passwd.patch ================================================ diff --git a/loginutils/passwd.c b/loginutils/passwd.c index 6c643d3..df8859d 100644 --- a/loginutils/passwd.c +++ b/loginutils/passwd.c @@ -69,7 +69,6 @@ static char* new_password(const struct passwd *pw, uid_t myuid, const char *algo goto err_ret; if (ENABLE_FEATURE_PASSWD_WEAK_CHECK && obscure(orig, newp, pw) /* NB: passing NULL orig is ok */ - && myuid != 0 ) { goto err_ret; /* non-root is not allowed to have weak passwd */ } ================================================ FILE: packages/sysutils/busybox/patches/busybox-10-add-MS_BIND-option-when-remouting-bind-mount.patch ================================================ From 5624e803c89ee79afe7c6fd0ef9929110505a800 Mon Sep 17 00:00:00 2001 From: Peter Vicman <peter.vicman@gmail.com> Date: Fri, 20 Sep 2019 18:58:30 +0200 Subject: [PATCH] add MS_BIND option when remouting bind mount when remounting bind mount add explicit MS_BIND to parameters to "hide" bind mount from user's view bind mount is only visible from /proc/self/mountinfo that's why we traverse the lines and using last entry in case multiple sources are mount over same mount point Signed-off-by: Peter Vicman <peter.vicman@gmail.com> --- util-linux/mount.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/util-linux/mount.c b/util-linux/mount.c index 84c85c0..bc3fbda 100644 --- a/util-linux/mount.c +++ b/util-linux/mount.c @@ -1887,6 +1887,50 @@ static int nfsmount(struct mntent *mp, unsigned long vfsflags, char *filteropts) #endif // !ENABLE_FEATURE_MOUNT_NFS +// Check mount point in /proc/self/mountinfo and identify bind mount +// return 1 for bind mount, 0 for normal mount +static int check_bind_mount(struct mntent *mp) +{ +int mnt_dir_len; +char *p; +FILE *fp; +char *line = NULL; +int ret = 0; + + // https://www.kernel.org/doc/Documentation/filesystems/proc.txt + // 21 20 179:20 /coreelec_flash /flash ro,noatime shared:2 - ext4 /dev/data rw,resgid=1065,data=ordered + // 20 22 179:1 / /flash ro,noatime shared:2 - vfat /dev/mmcblk1p1 ro,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro + + fp = fopen("/proc/self/mountinfo", "r"); + if (fp == NULL) + return ret; + + // remove trailing slash + mnt_dir_len = strlen(mp->mnt_dir); + if (mnt_dir_len > 1 && mp->mnt_dir[mnt_dir_len - 1] == '/') { + mnt_dir_len--; + mp->mnt_dir[mnt_dir_len] = '\0'; + } + + while ((line = xmalloc_fgetline(fp)) != NULL) { + // find mount point + p = strstr(line, mp->mnt_dir); + if (p == NULL) + continue; + + // bind mount has folder for root and not just "/" + ret = 0; // always use result from last entry + if (strncmp(p - 2, "/ ", 2) != 0) + ret = 1; + } + + if (line != NULL) + free(line); + + fclose(fp); + return ret; +} + // Mount one directory. Handles CIFS, NFS, loopback, autobind, and filesystem // type detection. Returns 0 for success, nonzero for failure. // NB: mp->xxx fields may be trashed on exit @@ -2058,6 +2102,10 @@ static int singlemount(struct mntent *mp, int ignore_busy) vfsflags |= MS_BIND; } + // add explicit MS_BIND if remounting bind mount + if ((vfsflags & MS_REMOUNT) && (check_bind_mount(mp) == 1)) + vfsflags |= MS_BIND; + // If we know the fstype (or don't need to), jump straight // to the actual mount. if (mp->mnt_type || (vfsflags & (MS_REMOUNT | MS_BIND | MS_MOVE))) { -- 2.7.4 ================================================ FILE: packages/sysutils/busybox/profile.d/10-locale.conf ================================================ # don't overwrite value set by Locale Kodi addon if [ -z "${LOCPATH}" ]; then export LANG="C.UTF-8" export LOCPATH="/storage/.cache/locpath" fi ================================================ FILE: packages/sysutils/busybox/profile.d/98-busybox.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) export HOME="/storage" export PATH="/usr/bin:/usr/sbin" export LD_LIBRARY_PATH="/usr/lib" export HOSTNAME=`cat /etc/hostname` export PS1="\[\e[1;32m\]\h\[\e[1;32m\]:\[\e[1;34m\]\w \[\e[0m\]\\$ " export HISTFILESIZE=200 # k0p case "$TERM" in linux|nxterm|screen|xterm|xterm-color|st-256color) ;; "") export TERM="linux" ;; *) export TERM="xterm" ;; esac # aliases for interactive shell case "$-" in *i*) alias ll='ls -alF' alias h='history' alias jc='journalctl --no-pager' alias mf='mount -o remount,rw /flash' alias umf='mount -o remount,ro /flash' alias sc='systemctl' alias kodi-stop='systemctl stop kodi' alias kodi-start='systemctl start kodi' alias kodi-restart='systemctl restart kodi' alias kodi-mask='systemctl mask kodi' alias kodi-unmask='systemctl unmask kodi' alias kodi-toggle-debug='kodi-send -a ToggleDebug' alias kodi-take-screenshot='kodi-send -a TakeScreenshot' ;; esac ================================================ FILE: packages/sysutils/busybox/scripts/apt-get ================================================ #!/bin/sh # 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 " message="$message\n 'apt-get' is a command to install, update and remove software which" message="$message\n is stored in a non local repo. 'apt-get' does nothing then connecting to such" message="$message\n repo, downloads the software, unpacks the software, updates a big" message="$message\n local database with all filepaths and other informations about the" message="$message\n installed software or removes or updates installed Software." message="$message\n " message="$message\n With LibreELEC it is not possible to change the system for security and" message="$message\n stability reasons so even 'apt-get' would not be able to do this." message="$message\n We also dont have and want to maintain such a repo for various other" message="$message\n great reasons." 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 Kodi's addon browser to enhance your LibreELEC system" echo -e $message exit 1 ================================================ FILE: packages/sysutils/busybox/scripts/convert_dtname ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) DT_ID=${1} if [ -z "${SYSTEM_ROOT}" ]; then MULTIDTB_CONF="/usr/share/bootloader/dtb.conf" else MULTIDTB_CONF="${SYSTEM_ROOT}/usr/share/bootloader/dtb.conf" export PATH="$PATH:${SYSTEM_ROOT}/usr/bin:${SYSTEM_ROOT}/usr/sbin" export LD_LIBRARY_PATH="${SYSTEM_ROOT}/usr/lib" fi if [ -n "${DT_ID}" -a -f ${MULTIDTB_CONF} ]; then # filter obsolete dtb by dtb.conf and migrate to new DT_ID migratedtb_cnt=$(xmlstarlet sel -t -c "count(//dtb/migratedtb)" ${MULTIDTB_CONF}) cnt_m=1 while [ ${cnt_m} -le ${migratedtb_cnt} ]; do migratedtb=$(xmlstarlet sel -t -v "//dtb/migratedtb[${cnt_m}]/@coreelec-dt-id" ${MULTIDTB_CONF}) if [ "${DT_ID}" == "${migratedtb}" ]; then subdevice=$(xmlstarlet sel -t -v "//dtb/migratedtb[${cnt_m}]/@subdevice" ${MULTIDTB_CONF}) migratedtid=$(xmlstarlet sel -t -v "//dtb/migratedtb[${cnt_m}]/migratedtid" ${MULTIDTB_CONF}) migratecmd=$(xmlstarlet sel -t -v "//dtb/migratedtb[${cnt_m}]/migratecmd" ${MULTIDTB_CONF}) DT_ID="${migratedtid}" [ -n "${subdevice}" ] && SUBDEVICE="${subdevice}" [ -n "${migratecmd}" ] && MIGRATE_DTB=$(echo ${migratecmd} | xmlstarlet unesc) break fi cnt_m=$((cnt_m+1)) done # modify DT_ID and SUBDEVICE by dtb.conf if available multidtb_cnt=$(xmlstarlet sel -t -c "count(//dtb/multidtb)" ${MULTIDTB_CONF}) cnt_m=1 while [ ${cnt_m} -le ${multidtb_cnt} ]; do multidtb=$(xmlstarlet sel -t -v "//dtb/multidtb[${cnt_m}]/@name" ${MULTIDTB_CONF}) subdevice=$(xmlstarlet sel -t -v "//dtb/multidtb[${cnt_m}]/@subdevice" ${MULTIDTB_CONF}) files_cnt=$(xmlstarlet sel -t -c "count(//dtb/multidtb[${cnt_m}]/file)" ${MULTIDTB_CONF}) cnt_f=1 while [ ${cnt_f} -le ${files_cnt} ]; do file=$(xmlstarlet sel -t -v "//dtb/multidtb[${cnt_m}]/file[${cnt_f}]" ${MULTIDTB_CONF}) cnt_f=$((cnt_f+1)) if [ "${DT_ID}.dtb" = "${file}" ]; then DT_ID="${multidtb%%.*}" [ -n "${subdevice}" ] && SUBDEVICE="${subdevice}" break 2 fi done cnt_m=$((cnt_m+1)) done fi ================================================ FILE: packages/sysutils/busybox/scripts/create-edid-cpio ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) EDID_DIR="/storage/.config/firmware/edid" EDID_CPIO="/flash/edid.cpio" TMPDIR="/tmp/edid-cpio" if [ "$1" = "-q" ]; then VERBOSE=0 else VERBOSE=1 fi if [ ! -d "${EDID_DIR}" ]; then echo "error: ${EDID_DIR} does not exist" exit 1 fi set -e rm -rf "${TMPDIR}" mkdir -p "${TMPDIR}/usr/lib/firmware" cp -r "${EDID_DIR}" "${TMPDIR}/usr/lib/firmware" cd "${TMPDIR}" mount -o remount,rw /flash find usr -print | cpio -ov -H newc > "${EDID_CPIO}" sync mount -o remount,ro /flash cd /storage rm -rf "${TMPDIR}" if [ "${VERBOSE}" = "1" ]; then echo "successfully created ${EDID_CPIO}" fi ================================================ FILE: packages/sysutils/busybox/scripts/createlog ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # create logfile DATE=`date -u +%Y-%m-%d-%H.%M.%S` BASEDIR="/tmp" LOGDIR="log-$DATE" RELEASE="`cat /etc/release`" GIT="`cat /etc/issue | grep git`" getlog_cmd() { if command -v $1 >/dev/null; then echo "################################################################################" >> $BASEDIR/$LOGDIR/$LOGFILE echo "# ... output of $@" >> $BASEDIR/$LOGDIR/$LOGFILE echo "# LibreELEC release: $RELEASE" >> $BASEDIR/$LOGDIR/$LOGFILE echo "# $GIT" >> $BASEDIR/$LOGDIR/$LOGFILE echo "################################################################################" >> $BASEDIR/$LOGDIR/$LOGFILE $@ >> $BASEDIR/$LOGDIR/$LOGFILE 2>/dev/null echo "" >> $BASEDIR/$LOGDIR/$LOGFILE fi } get_governor_details() { ( cat_all_files /sys/devices/system/cpu cat_all_files /sys/devices/system/cpu/cpufreq for cpun in /sys/devices/system/cpu/cpu[0-9]*; do cat_all_files ${cpun}/cpufreq done ) } cat_all_files() { local adir=$1 local afile var [ -d ${adir} ] || return 0 echo "${adir}" cd ${adir} for afile in $(find . -maxdepth 1 -print | sort); do afile=${afile:2} if [ -n "${afile}" ]; then if [ -d ${afile} ]; then var="<dir>" else var="$(cat ${afile} 2>/dev/null)" fi [ -n "${var}" ] && printf " %-30s : %s\n" "${afile}" "${var}" fi done } rm -rf $BASEDIR/$LOGDIR mkdir -p $BASEDIR/$LOGDIR # kodi.log KODI_LOG_DIR=/storage/.kodi/temp LOGFILE="01_KODI.log" for i in kodi.log kodi.old.log; do [ -f ${KODI_LOG_DIR}/${i} ] && getlog_cmd cat ${KODI_LOG_DIR}/$i done LOGFILE="01_KODI_CRASH.log" for i in `find ${KODI_LOG_DIR} -type f -name "kodi_crashlog_*.log" | sort -r`; do getlog_cmd cat $i done LOGFILE="01_KODI_OTHER.log" for i in `find ${KODI_LOG_DIR} -type f -name "*.log" | sort`; do iname="${i#${KODI_LOG_DIR}/}" [ ${iname} == kodi.log ] && continue [ ${iname} == kodi.old.log ] && continue [ "${iname#kodi_crashlog_}" != "${iname}" ] && continue getlog_cmd cat $i done # System.log LOGFILE="02_System.log" getlog_cmd dmesg getlog_cmd lsmod getlog_cmd ps xa for i in /storage/.config/hwdb.d/*.hwdb \ /storage/.config/modprobe.d/*.conf \ /storage/.config/modules-load.d/*.conf \ /storage/.config/sleep.d/*.power \ /storage/.config/sysctl.d/*.conf \ /storage/.config/udev.rules.d/*.rules \ ; do if [ -f "$i" ] ; then getlog_cmd cat $i fi done if [ -f "/storage/.config/autostart.sh" ] ; then getlog_cmd cat /storage/.config/autostart.sh fi if [ -f "/storage/.config/shutdown.sh" ] ; then getlog_cmd cat /storage/.config/shutdown.sh fi getlog_cmd ls -laR /storage/.config/system.d # note: we dont add .mount units here as they may contan # login credentials for i in /storage/.config/system.d/*.service ; do if [ -f "$i" -a ! -L "$i" ] ; then getlog_cmd cat $i fi done # Hardware.log LOGFILE="03_Hardware.log" getlog_cmd lspci -vvvvnn getlog_cmd lsusb -vvv getlog_cmd lsusb -t getlog_cmd cat /proc/cpuinfo getlog_cmd get_governor_details getlog_cmd cat /proc/meminfo # Audio.log LOGFILE="04_Audio.log" getlog_cmd aplay -l getlog_cmd aplay -L getlog_cmd amixer # Network.log LOGFILE="05_Network.log" getlog_cmd ifconfig -a getlog_cmd netstat -rn getlog_cmd netstat -nalp getlog_cmd connmanctl services getlog_cmd cat /etc/resolv.conf # varlog.log LOGFILE="06_varlog.log" for i in `find /var/log -name journal -prune -o -type f -print`; do getlog_cmd cat $i done # Input.log LOGFILE="07_input.log" getlog_cmd cat /proc/bus/input/devices # make RPi users happy if [ -e /proc/acpi/wakeup ] ; then getlog_cmd cat /proc/acpi/wakeup fi # Filesystem.log LOGFILE="08_Filesystem.log" getlog_cmd cat /proc/mounts getlog_cmd df -h getlog_cmd blkid # Journal (current) LOGFILE="09_Journal-cur.log" getlog_cmd journalctl --no-pager -b -0 # Journal (prev) LOGFILE="10_Journal-prev.log" getlog_cmd journalctl --no-pager -b -1 # addons LOGFILE="11_Addons.log" for i in /storage/.kodi/userdata/addon_data/*/*.log \ /storage/.kodi/userdata/addon_data/*/log/* \ ; do if [ -f "$i" ] ; then getlog_cmd cat $i fi done # pack logfiles mkdir -p /storage/logfiles zip -jq /storage/logfiles/log-$DATE.zip $BASEDIR/$LOGDIR/* # remove logdir rm -rf $BASEDIR/$LOGDIR ================================================ FILE: packages/sysutils/busybox/scripts/dthelper ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) COMPATIBLE=$(cat /proc/device-tree/compatible 2>/dev/null | tr -d '\000' | sed -n -e 's/.*\(allwinner\|amlogic\|fsl\|nxp\|qcom\|raspberrypi\|rockchip\|samsung\).*/\1/p') do_dtfile(){ if [[ -n $(find /flash -name dtb.img) ]]; then DTFILE="/flash/dtb.img" elif [[ -n $(find /flash -name extlinux.conf) ]]; then EXTLINUX=$(find /flash -name extlinux.conf) DTFILE=$(grep FDT "${EXTLINUX}" | sed 's,^ *FDT /,,g') elif [ -e /flash/boot.ini ]; then DTFILE=$(grep -m 1 dtb_name /flash/boot.ini | cut -d \" -f2 | sed 's,/dtb/,,g') elif [ -e /flash/uEnv.ini ]; then DTFILE=$(grep dtb_name /flash/uEnv.ini | sed 's,dtb_name=/dtb/,,g') else do_unknown fi echo "${DTFILE}" } do_dtflag(){ if [ "${COMPATIBLE}" = "raspberrypi" ]; then DTFLAG=$(cat /proc/device-tree/compatible | cut -f1,2 -d',' | head -n 1) PIREV=$(awk '/^Revision/ {sub($3,-6, "", $3); print $3}' /proc/cpuinfo) # truncate to 6-chars case "${PIREV}" in d*) MEMSIZE="-8g" ;; c*) MEMSIZE="-4g" ;; b*) MEMSIZE="-2g" ;; a*) MEMSIZE="-1g" ;; *0002|*0003|*0004|*0005|*0006|*0007|*0008|*0009|*0012) MEMSIZE="-256" ;; 0*|9*) MEMSIZE="-512" ;; *) MEMSIZE="" ;; esac else DTFLAG="unknown" if [ -f /proc/device-tree/coreelec-dt-id ]; then DTFLAG=$(tr -d '\0' < /proc/device-tree/coreelec-dt-id) fi MEMSIZE=$(awk -F " " '/MemTotal:/ {print $2}' /proc/meminfo) if [ "${MEMSIZE}" -lt "524288" ]; then MEMSIZE="-512" else MEMSIZE="" fi fi echo "${DTFLAG}${MEMSIZE}" } do_dtname(){ DTNAME="unknown" if [ -f /proc/device-tree/coreelec-dt-id ]; then DTNAME=$(tr -d '\0' < /proc/device-tree/coreelec-dt-id) fi echo "${DTNAME}" } do_dtsoc(){ DTSOC=$(awk -F', ' '{print $2}' /proc/device-tree/compatible) echo "${DTSOC}" } do_unknown(){ echo "unknown" exit 1 } if [ -n "${COMPATIBLE}" ]; then case $(basename "${0}") in dtfile) do_dtfile ;; dtflag) do_dtflag ;; dtname) do_dtname ;; dtsoc) do_dtsoc ;; esac else do_unknown fi ================================================ FILE: packages/sysutils/busybox/scripts/dump-active-edids-drm ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) EDID_DIR="/storage/.config/firmware/edid" CONNECTORS="" if [ "$1" = "-q" ]; then VERBOSE=0 else VERBOSE=1 fi info() { [ "${VERBOSE}" = "1" ] && echo "$@" } mkdir -p "${EDID_DIR}" for c in /sys/class/drm/card?-* ; do [ ! -d "$c" ] && continue [ ! -e "$c/status" ] && continue if [ $(cat $c/status 2>/dev/null) = "connected" ]; then CONNECTOR=$(basename $c | cut -c 7-) EDID_NAME="edid-${CONNECTOR}.bin" cat $c/edid > "${EDID_DIR}/${EDID_NAME}" 2>/dev/null if [ $? -eq 0 ]; then [ -n "${CONNECTORS}" ] && CONNECTORS="${CONNECTORS} " CONNECTORS="${CONNECTORS}${CONNECTOR}" fi fi done if [ -z "${CONNECTORS}" ]; then info "error: no active connectors found" exit 1 else info "found active connector(s) ${CONNECTORS}" [ "${VERBOSE}" = "0" ] && echo "${CONNECTORS}" fi ================================================ FILE: packages/sysutils/busybox/scripts/fs-resize ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) StartProgressLog() { if [ "$1" = "spinner" ]; then echo "*** $3" >>$LOG fi StartProgress "$@" } if [ -e /storage/.please_resize_me ] ; then . /usr/lib/libreelec/functions hidecursor mount -o remount,rw /flash LOG=/flash/fs-resize.log date -Iseconds >>$LOG # this sh** was never intended to be used # on already installed and runing system if [ -d /storage/.kodi -o -d /storage/.config -o -d /storage/.cache ] ; then rm -f /storage/.please_resize_me sync echo "Resizing is not permitted - the system has already been initialised." | tee -a $LOG mount -o remount,ro /flash StartProgress countdown "Rebooting in 15s... " 15 "NOW" reboot -f fi # get the disk. /storage on 2nd partition echo $(grep "/storage " /proc/mounts) >>$LOG PART=$(grep "/storage " /proc/mounts | cut -d" " -f1 | grep '2$') # get disk: /dev/sdx2 -> /dev/sdx, /dev/mmcblkxp2 -> /dev/mmcblkx case $PART in "/dev/mmcblk"*|"/dev/nvme"*) DISK=$(echo $PART | sed s/p2$//g) ROMS_PART_NAME="${DISK}p3" ;; *) DISK=$(echo $PART | sed s/2$//g) ROMS_PART_NAME="${DISK}3" ;; esac rm -f /storage/.please_resize_me sync echo "DISK: $DISK PART: $PART" >>$LOG # just in case if [ ! -z "$DISK" -a ! -z "$PART" ] ; then umount $PART DISK_NAME=$(basename $DISK) DISK_SECTORS=$(cat "/sys/block/$DISK_NAME/size") # Obtain the disk sectors count, each sector is always 512 Bytes large, independent of the underlying device, according to https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/types.h#n117 DISK_SIZE=$(( $DISK_SECTORS * 512 )) # Calculate the disk actual size, in byte if [ $DISK_SIZE -gt 8589934592 ]; then # The optimal behaviour, this will leave 6GiB to storage, and create the EEROMS partition ROMS_CREATE='yes' STORAGE_END='8GiB' elif [ $DISK_SIZE -gt 3221225472 ]; then # Optionaly omit the EEROMS partition for 4GB cards/drives ROMS_CREATE='' ROMS_OMIT_MANUAL='' STORAGE_END='100%' else # The bare minumum a EmuELEC image itself needs is 2186280960, but after adding in user configs things become uncontrollable, so we don't care about disks with size between 2085MiB and 3GiB echo 'ERROR: You disk is too small! You need to use a USB drive/SD card that is at least 4GB!' echo 'ERROR: You should NOT try to boot up this drive as it is NOT properly resized!' StartProgress countdown "Powering off in 30s... " 30 "NOW" poweroff fi echo "PARTITION RESIZING IN PROGRESS" echo "" echo "Please do not reboot or turn off your @DISTRONAME@ device!" echo "" # identify the partition scheme, and if gpt fix minor issues such as gpt header not at end of disk SCHEME=$(blkid -s PTTYPE -o value $DISK) if [ "$SCHEME" = "gpt" ]; then StartProgressLog spinner "Checking layout... " "sgdisk -e $DISK >>$LOG 2>&1" fi if [ "$ROMS_CREATE" ]; then # EmueELEC Get EEROMS filetype ROM_FS_TYPE="vfat" PARTED_FS_TYPE="fat32" if [ -e "/flash/ee_fstype" ]; then EE_FS_TYPE=$(cat "/flash/ee_fstype") case $EE_FS_TYPE in "ntfs") ROM_FS_TYPE="ntfs" PARTED_FS_TYPE="ntfs" ;; "ext4") ROM_FS_TYPE="ext4" PARTED_FS_TYPE="ext4" ;; "exfat") ROM_FS_TYPE="exfat" PARTED_FS_TYPE="ntfs" ;; "no") ROMS_CREATE='' ROMS_OMIT_MANUAL='yes' STORAGE_END='100%' ;; *) # Failsafe ROM_FS_TYPE="vfat" PARTED_FS_TYPE="fat32" ;; esac fi fi StartProgress spinner "Resizing partition... " "parted -s -a optimal -m $DISK resizepart 2 $STORAGE_END &>/dev/null" StartProgress spinner "Checking file system... " "e2fsck -f -p $PART &>/dev/null" StartProgress spinner "Resizing file system... " "resize2fs $PART &>/dev/null" if [ "$ROMS_CREATE" ]; then StartProgress spinner "Creating EEROMS partition..." "parted -s -a optimal -m $DISK mkpart primary ${PARTED_FS_TYPE} ${STORAGE_END} 100% &>/dev/null" partprobe &>/dev/null case $ROM_FS_TYPE in "ntfs") StartProgress spinner "Formatting EEROMS partition as NTFS..." "mkfs.ntfs -L EEROMS -f ${ROMS_PART_NAME} &>/dev/null" ;; "ext4") StartProgress spinner "Formatting EEROMS partition as EXT4..." "mkfs.ext4 -L EEROMS -t ext4 -O 64bit ${ROMS_PART_NAME} &>/dev/null" ;; "exfat") StartProgress spinner "Formatting EEROMS partition as EXFAT..." "mkfs.exfat -n EEROMS ${ROMS_PART_NAME} &>/dev/null" ;; *) StartProgress spinner "Formatting EEROMS partition as FAT32..." "mkfs.vfat -n EEROMS ${ROMS_PART_NAME} &>/dev/null" ;; esac elif [ "$ROMS_OMIT_MANUAL" ]; then echo 'WARNING: EEROMS partition is omitted manually even your drive size is >=8GB, YOU KNOW WHAT YOU ARE DOING' mount -o rw,remount /flash rm -f /flash/ee_fstype # Mark should be cleaned since the 'no' fstype has no use afterwards else echo 'WARNING: EEROMS partition is omitted for <8GB drives' fi StartProgress countdown "Rebooting in 5s... " 5 "NOW" fi mount -o remount,ro /flash fi reboot -f &>/dev/null ================================================ FILE: packages/sysutils/busybox/scripts/functions ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) # Need a read/write location, as tmp may not always be available mkdir -p /dev/.progress rm -f /dev/.progress/* # Show frame-buffer cursor showcursor() { echo -en "\033[?25h" # show cursor if [ -f /sys/devices/virtual/graphics/fbcon/cursor_blink ] ; then echo 1 > /sys/devices/virtual/graphics/fbcon/cursor_blink fi } # Hide frame-buffer cursor hidecursor() { echo -en "\033[?25l" if [ -f /sys/devices/virtual/graphics/fbcon/cursor_blink ] ; then echo 0 > /sys/devices/virtual/graphics/fbcon/cursor_blink fi } # Start a progress meter # $1: spinner, percent, countdown # $2: message to display # [spinner] # $3: optional command to execute # $4: optional success completion message (nothing if not specified) # $5: optional failure completion message ($4 if not specified) # [percent] # $3: name of filename to be progress monitored # $4: terminal size (in bytes) of $3 when progress is complete # $5: optional command to execute # $6: optional success message (100% if not specified) # $7: optional failure message ($6 if not specified) # [countdown] # $3: number of seconds to start counting down from # $4: optional completion message, default is nothing StartProgress() { local cmdresult=0 # Use files for inter-process communication. # This file is used to indicate a metter is running/active echo > /dev/.progress/run case "$1" in spinner) ProgressTask_Spinner "$2" & if [ -n "$3" ]; then eval "$3" cmdresult=$? [ $cmdresult -eq 0 ] && StopProgress "${4}" || StopProgress "${5:-$4}" fi ;; percent) ProgressTask_Percent "$2" "$3" $4 & if [ -n "$5" ]; then eval "$5" cmdresult=$? [ $cmdresult -eq 0 ] && StopProgress "${6}" || StopProgress "${7:-$6}" fi ;; countdown) ProgressTask_Countdown "$2" $3 "$4" ;; *) echo "Unknown spinner type: $1" return 1 ;; esac return $cmdresult } # Stop a progress meter, displaying optional completion message # $1: optional completion message (appropriate default used if not specified) StopProgress() { # Instruct running progress meter to end, showing specified completion message echo "${1}" > /dev/.progress/stop # Wait for progress meter to stop running while [ -f /dev/.progress/run ]; do usleep 250000 done # Clean up rm -f /dev/.progress/stop return 0 } # Use this task for processes of indeterminate duration ProgressTask_Spinner() { local msg="$1" local spinner="|/-\\|/-\\" local count=0 donemsg echo -n "${msg} " while [ ! -f /dev/.progress/stop ]; do echo -en "\b${spinner:$count:1}" usleep 500000 count=$(((count + 1) % 8)) done donemsg="$(cat /dev/.progress/stop)" echo -e "\b${donemsg:-done}" rm -f /dev/.progress/run exit 0 } # Use this task when transferring a file of known size ProgressTask_Percent() { local msg="$1" filename="$2" fsize=$3 csize donemsg echo -n "${msg} " while [ ! -f /dev/.progress/stop ]; do [ -f ${filename} ] && csize=$(stat -t "${filename}" | awk '{print $2}') || csize=0 echo $csize $fsize | awk '{ printf "\b\b\b\b%3d%%", ($1 * 100 / $2) }' usleep 250000 done donemsg="$(cat /dev/.progress/stop)" echo -e "\b\b\b\b${donemsg:-100%}" rm -f /dev/.progress/run exit 0 } # Use this task to countdown a number of seconds # (needs more work for durations > 99 seconds) ProgressTask_Countdown() { local msg="$1" countfrom=$2 donemsg="$3" echo -n "${msg} " while [ ${countfrom} -gt 0 ]; do echo ${countfrom} | awk '{ printf "\b\b%2d", $1 }' read -r -s -t1 && break countfrom=$((countfrom - 1)) done echo -e "\b\b${donemsg:- }" rm -f /dev/.progress/run return 0 } ================================================ FILE: packages/sysutils/busybox/scripts/getedid ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) # # exit 1 = unsupported GPU # exit 2 = dual boot system # exit 3 = no backup for syslinux.cfg or extlinux.conf # exit 4 = extlinux.conf and syslinux.cfg are available # exit 5 = changes are already made either to extlinux.conf or syslinux.cfg # exit 6 = xorg.conf already exists in /storage/.config # exit 7 = more than a single device detected # Help message and usage explanation help() { echo "This script generates a custom EDID depending on your GPU" echo "" echo "To check which GPU you are using, use: getedid gpu" echo "" echo "To create a custom EDID, just use this script like: getedid create" echo "" echo "If you don't want to use the created EDID file anymore use: getedid delete" echo "" echo "If your hardware or kernel has changed and you want to have a custom EDID again, then you have to delete the old EDID first." echo "For this use: getedid delete " echo "And then use: getedid create" } # check for GPU and store string check_gpu() { if lspci | grep -i vga | grep -i -q -E 'intel|amd' ; then gpu="intel/amd" elif lspci | grep -i vga | grep -i -q nvidia; then gpu="nvidia" else echo "GPU is not supported" exit 1 fi } # run this first if the user already has a custom EDID but want to create a new one (TV or AVR change) del_edid() { if [ "$gpu" = "intel/amd" ]; then check_file if [ -f "$file".old ]; then mount_rw rm "$file" mv "$file".old "$file" rm -f /flash/edid.cpio mount_ro sys_reboot else echo "You don't have a backup file for $file. You did not use this script to create the custom EDID" echo "Therefore we can't be sure the script is working properly. Exiting" exit 3 fi else rm -f /storage/.config/xorg.conf rm -f /storage/.config/xorg.le.backup systemctl restart xorg.service fi } # run main script depending on the GPU run() { if [ "$gpu" = "intel/amd" ]; then intel_amd elif [ "$gpu" = "nvidia" ]; then nvidia fi } # mounting /flash to rw mount_rw() { mount -o remount,rw /flash } # mounting /flash to ro mount_ro() { mount -o remount,ro /flash } # remount /flash to ro and reboot sys_reboot() { mount_ro echo "The system is rebooting in 15 seconds" sleep 15 reboot } # check syslinux.cfg and/or extlinux.conf check_file() { # check boot system if [ -d /sys/firmware/efi -a -f /flash/EFI/BOOT/syslinux.cfg ] ; then sys_boot="UEFI" sys_path="/flash/EFI/BOOT" else sys_boot="BIOS" sys_path="/flash" fi # check which file is available if [ -f "$sys_path/syslinux.cfg" -a -f "$sys_path/extlinux.conf" ]; then echo "Your system contains both a /flash/syslinux.cfg and a /flash/extlinux.conf file" echo "Something is wrong on your system. Exiting" exit 4 elif [ -f "$sys_path/extlinux.conf" ]; then file="$sys_path/extlinux.conf" elif [ -f "$sys_path/syslinux.cfg" ]; then file="$sys_path/syslinux.cfg" else echo "You neither have a extlinux.conf nor do you have a syslinux.cfg." echo "Dual boot systems aren't supported" exit 2 fi } check_content() { # check if changes are already made to $file and exit if yes if grep -q "initrd=/edid.cpio" $file ; then echo "$file has been modified. Please run 'getedid delete' first if you want to modify it again. Exiting." exit 5 fi } create_edid() { # create edid mkdir -p /tmp/cpio/lib/firmware/edid cat "/sys/class/drm/$card/edid" > /tmp/cpio/lib/firmware/edid/edid.bin mkdir -p /storage/.config/firmware/edid cp /tmp/cpio/lib/firmware/edid/edid.bin /storage/.config/firmware/edid # create cpio archive cd /tmp/cpio/ find . -print | cpio -ov -H newc > /storage/edid.cpio } intel_amd() { # check which output is connnected: counter=0 for i in /sys/class/drm/*; do if [ "$(cat "$i"/status 2>/dev/null)" = "connected" ]; then counter=$((counter + 1)) if [ $counter -gt 0 -a $counter -lt 2 ]; then card="$(echo "$i" | cut -d / -f 5)" hdmi="$(echo "$i" | cut -d / -f 5 | sed 's/card[0-9]-//g')" else echo "More than a single device connected. Probably enable \"Disable all other monitors\" at Kodi settings. Aborting!" exit 7 fi fi done # create the edid create_edid # check extlinux.conf and syslinux.cfg check_file check_content # remount /flash to rw mount_rw mv /storage/edid.cpio /flash # make a backup of $file cp "$file" "$file".old # add boot parameters to $file sed -i "/ APPEND/s/$/ initrd=\/edid.cpio drm.edid_firmware=edid\/edid.bin video=$hdmi:D/" "$file" # reboot sys_reboot } nvidia() { # check if xorg.conf already exists if [ -f /storage/.config/xorg.conf -o -f /storage/.config/xorg-nvidia.conf ]; then echo "Existing /storage/.config/xorg.conf detected. Aborting!" exit 6 fi # check for multi-montior setup monitors="$(grep -i -w "connected" /var/log/Xorg.0.log | grep -i -o "dfp-[0-9]" | sort -u | wc -l)" if [ "$monitors" -gt "1" ]; then echo "You have more than a single monitor connected. The script doesn't support a multi-monitor setup. Aborting!" exit 7 fi # set debug and restart Xorg cp /etc/X11/xorg-nvidia.conf /storage/.config/xorg.conf sed -i 's/"ModeDebug" "false"/"ModeDebug" "true"/g' /storage/.config/xorg.conf systemctl restart xorg.service # get port nv_port="$(grep -i -w connected /var/log/Xorg.0.log | grep -i -o "dfp-[0-9]" | sort -u)" nvidia-xconfig --extract-edids-from-file=/var/log/Xorg.0.log --extract-edids-output-file=/storage/.config/edid.bin 1>/dev/null # set mode debug back to false sed -i 's/"ModeDebug" "true"/"ModeDebug" "false"/g' /storage/.config/xorg.conf # set port and uncomment lines sed -i "s/# Option \"ConnectedMonitor\" \"DFP-0\"/ Option \"ConnectedMonitor\" \"$nv_port\"/g" /storage/.config/xorg.conf sed -i "s/# Option \"CustomEDID\" \"DFP-0:\/storage\/.config\/edid.bin\"/ Option \"CustomEDID\" \"$nv_port:\/storage\/.config\/edid.bin\"/g" /storage/.config/xorg.conf sed -i "s/# Option \"IgnoreEDID\" \"false\"/ Option \"IgnoreEDID\" \"false\"/g" /storage/.config/xorg.conf sed -i "s/# Option \"UseEDID\" \"true\"/ Option \"UseEDID\" \"true\"/g" /storage/.config/xorg.conf # restart xorg.service systemctl restart xorg.service } # start script from here case "$1" in 'create') check_gpu run ;; 'gpu') check_gpu echo "$gpu" ;; 'delete') check_gpu del_edid ;; 'help') help ;; *) echo "Usage $0 { create | gpu | delete | help }" ;; esac ================================================ FILE: packages/sysutils/busybox/scripts/getedid-drm ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) usage() { echo "$0 create|delete|help" } delete_edid() { update-bootloader-edid delete if [ $? -eq 0 ]; then echo "successfully removed edid override" else echo "error removing bootloader edid-override options" exit 1 fi } create_edid() { CONNECTORS=$(dump-active-edids -q) if [ $? -ne 0 -o -z "${CONNECTORS}" ]; then echo "error: cannot detemine active connectors" exit 1 fi create-edid-cpio -q if [ $? -ne 0 ]; then echo "error creating edid.cpio" exit 1 fi update-bootloader-edid set ${CONNECTORS} if [ $? -eq 0 ]; then echo "successfully installed edid override for ${CONNECTORS}" else echo "error setting bootloader edid-override options" exit 1 fi } case $1 in create) shift create_edid "$@" ;; delete) delete_edid ;; help) usage ;; *) usage exit 1 ;; esac ================================================ FILE: packages/sysutils/busybox/scripts/init ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2010-2011 Roman Weber (roman@openelec.tv) # Copyright (C) 2012 Yann Cézard (eesprit@free.fr) # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) # create directories /usr/bin/busybox mkdir -p /dev /usr/bin/busybox mkdir -p /proc /usr/bin/busybox mkdir -p /sys /usr/bin/busybox mkdir -p /tmp /usr/bin/busybox mkdir -p /flash /usr/bin/busybox mkdir -p /sysroot /usr/bin/busybox mkdir -p /storage /usr/bin/busybox mkdir -p /run # temp mountpoint for updates /usr/bin/busybox mkdir -p /update # mount all needed special filesystems /usr/bin/busybox mount -t devtmpfs devtmpfs /dev /usr/bin/busybox mount -t proc proc /proc /usr/bin/busybox mount -t sysfs sysfs /sys # /run options have to match what systemd uses by default /usr/bin/busybox mount -t tmpfs -o mode=755,size=20%,nr_inodes=800k,nosuid,nodev,strictatime tmpfs /run UPDATE_ROOT=/storage/.update UPDATE_DIR="$UPDATE_ROOT" UPDATE_KERNEL="KERNEL" UPDATE_SYSTEM="SYSTEM" IMAGE_KERNEL="@KERNEL_NAME@" IMAGE_SYSTEM="SYSTEM" BOOT_STEP="start" MD5_FAILED="0" RUN_FSCK="yes" RUN_FSCK_DISKS="" SYSLINUX_DEFAULT="" GRUB_DEFAULT="" NBD_DEVS="0" FLASH_FREE_MIN="5" LIVE="no" BREAK_TRIPPED="no" BIGFONT="1080" TEE_PID="" FORCE_SPLASH="yes" # Get a serial number if present (eg. RPi) otherwise use MAC address from eth0 MACHINE_UID="$(awk '/^Serial/{s='0000000' $3; print substr(s, length(s) - 7)}' /proc/cpuinfo)" [ -z "$MACHINE_UID" ] && MACHINE_UID="$(cat /sys/class/net/eth0/address 2>/dev/null | tr -d :)" # common functions . /functions # script functions progress() { echo "init: ### ${1::160}" >/dev/kmsg if test "$PROGRESS" = "yes"; then echo "### $1 ###" >&2 fi } echo_to_kmsg() { while IFS= read -r line || [ -n "${line}" ]; do echo "init: ### ${line::160}" >/dev/kmsg done } debug_msg() { echo "$1" >&$SILENT_OUT } debug_shell() { redirect_output_to_screen # restore output to a screen echo "### Starting debugging shell for boot step: $BOOT_STEP... type exit to quit ###" showcursor setsid cttyhack sh } error() { # Display fatal error message # $1:action which caused error, $2:message # Send debug_shell output to stderr, in case caller is redirecting/consuming stdout # Return exitcode=1 so that called may detect when an error has occurred echo "*** Error in $BOOT_STEP: $1: $2 ***" >&2 debug_shell >&2 return 1 } break_after() { # Start debug shell after boot step $1, and all subsequent steps if [ $BREAK_TRIPPED == yes ]; then debug_shell else case $BREAK in all|*$1*) BREAK_TRIPPED=yes debug_shell ;; esac fi } # Mount handlers # All handlers take the following parameters: # $1:target, $2:mountpoint, $3:mount options, [$4:fs type] mount_common() { # Common mount handler, handles block devices and filesystem images MOUNT_OPTIONS="-o $3" [ -n "$4" ] && MOUNT_OPTIONS="-t $4 $MOUNT_OPTIONS" for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15; do ERR_ENV=1 mount $MOUNT_OPTIONS $1 $2 >&$SILENT_OUT 2>&1 [ "$?" -eq "0" ] && ERR_ENV=0 && break usleep 1000000 done [ "$ERR_ENV" -eq "0" ] && return 0 error "mount_common" "Could not mount $1" } get_iscsistart_options() { # Convert kernel commandline ISCSI= options to iscsistart options IFS_SAVE="$IFS" IFS=, for arg in $1; do val="${arg#*=}" case "$arg" in iscsi_initiator=*) option="-i" ;; iscsi_target_name=*) option="-t" ;; iscsi_target_ip=*) option="-a" ;; iscsi_target_port=*) option="-p" ;; iscsi_target_group=*) option="-g" ;; iscsi_username=*) option="-u" ;; iscsi_password=*) option="-w" ;; iscsi_in_username=*) option="-U" ;; iscsi_in_password=*) option="-W" ;; esac echo "$option $val" done IFS="$IFS_SAVE" } mount_iscsi() { # Mount iSCSI target ISCSI_DEV="${1##*,}" ISCSI_OPTIONS="${1%,*}" if [ ! -f "/usr/sbin/iscsistart" ]; then error "iscsistart" "iSCSI support not available" fi if [ "$ISCSI_OPTIONS" = "auto" ]; then progress "Network configuration based on iBFT" /usr/sbin/iscsistart -N >&$SILENT_OUT 2>&1 || error "iscsistart" "Unable to configure network" progress "iSCSI auto connect based on iBFT" /usr/sbin/iscsistart -b >&$SILENT_OUT 2>&1 || error "iscsistart" "Unable to auto connect" else /usr/sbin/iscsistart $(get_iscsistart_options "$ISCSI_OPTIONS") >&$SILENT_OUT 2>&1 || error "iscsistart" "Unable to connect to ISCSI target" fi mount_common "$ISCSI_DEV" "$2" "$3" "$4" } mount_nbd() { # Mount NBD device NBD_SERVER="${1%%:*}" NBD_PORT="${1#*:}" NBD_DEV="/dev/nbd$NBD_DEVS" nbd-client $NBD_SERVER $NBD_PORT $NBD_DEV >&$SILENT_OUT 2>&1 || error "nbd-client" "Could not connect to NBD server $1" mount_common "$NBD_DEV" "$2" "$3" "$4" NBD_DEVS=$(( NBD_DEVS + 1 )) } mount_nfs() { # Mount NFS export NFS_EXPORT="${1%%,*}" NFS_OPTIONS="${1#*,}" [ "$NFS_OPTIONS" = "$1" ] && NFS_OPTIONS= mount_common "$NFS_EXPORT" "$2" "$3,nolock,rsize=32768,wsize=32768,$NFS_OPTIONS" "nfs" } mount_ubifs() { mount_common "$1" "$2" "$3" "ubifs" } # mount_folder "$boot" "/flash" "ro,noatime" # $1:[TYPE=]target, $2:mountpoint, $3:mount options, [$4:fs type] mount_folder() { local target="${1#*=}" mkdir -p /dev/bind_tmp mount_common "$target" "/dev/bind_tmp" "rw,noatime" mount_common "/dev/bind_tmp/coreelec_$(basename $2)" "$2" "bind" umount /dev/bind_tmp [ "$2" = "/flash" ] && mount -o remount,ro /flash [ -z "$(ls -A /dev/bind_tmp)" ] && rm -rf /dev/bind_tmp } mount_part() { # Mount a local or network filesystem # $1:[TYPE=]target, $2:mountpoint, $3:mount options, [$4:fs type] progress "mount filesystem $1 ..." MOUNT_TARGET="${1#*=}" case $1 in /dev/ubi*) MOUNT_CMD="mount_ubifs" MOUNT_TARGET="$1" RUN_FSCK="no" ;; LABEL=*|UUID=*|/*) MOUNT_CMD="mount_common" MOUNT_TARGET="$1" ;; ISCSI=*) MOUNT_CMD="mount_iscsi" ;; NBD=*) MOUNT_CMD="mount_nbd" ;; NFS=*) MOUNT_CMD="mount_nfs" ;; FOLDER=*) MOUNT_CMD="mount_folder" MOUNT_TARGET="$1" ;; *) error "mount_part" "Unknown filesystem $1" ;; esac # Substitute unique identifier if available or remove placeholder MOUNT_TARGET="${MOUNT_TARGET//@UID@/$MACHINE_UID}" $MOUNT_CMD "$MOUNT_TARGET" "$2" "$3" "$4" } mount_sysroot() { if [ "$SYSTEM_TORAM" = "yes" ]; then cp /flash/$IMAGE_SYSTEM /dev/$IMAGE_SYSTEM mount_part "/dev/$IMAGE_SYSTEM" "/sysroot" "ro,loop" else mount_part "/flash/$IMAGE_SYSTEM" "/sysroot" "ro,loop" fi if [ -f /flash/post-sysroot.sh ]; then . /flash/post-sysroot.sh fi } # mount the specified SYSTEM file and output arch from /etc/os-release get_project_arch() { if [ -f ${1}/etc/os-release ]; then . ${1}/etc/os-release echo "${LIBREELEC_ARCH}" fi } # mount the specified SYSTEM file and output version from /etc/os-release get_project_version() { if [ -f ${1}/etc/os-release ]; then . ${1}/etc/os-release echo "${VERSION}" fi } # If the project/arch of current matches the update, then it is considered compatible. # Otherwise, mount the update SYSTEM partition and, if canupdate.sh is available, # call the script to determine if the current update file can be applied on to the # current system - 0 means it is compatible, non-zero that it is not compatible. is_compatible() { local result=1 if [ "${1}" = "${2}" ]; then result=0 else if [ -f /update/usr/share/bootloader/canupdate.sh ]; then sh /update/usr/share/bootloader/canupdate.sh "${1}" "${2}" && result=0 fi fi return ${result} } # determine if the new SYSTEM file is compatible with the current SYSTEM file check_is_compatible() { local update_filename="${1}" local old_project_arch new_project_arch old_project_arch="$(get_project_arch "/sysroot")" || return new_project_arch="$(get_project_arch "/update")" || return # If old or new project/arch isn't available then could be very old (pre-/etc/os-release) build - have to trust it if [ -n "${old_project_arch}" -a -n "${new_project_arch}" ]; then # If the old project/arch is not compatible with the new project/arch then abort... if ! is_compatible "${old_project_arch}" "${new_project_arch}"; then echo "" echo "ERROR: $(basename "${update_filename}") is not compatible with ${old_project_arch} hardware - update cancelled." echo "" echo "Current system: ${old_project_arch}" echo "Update system: ${new_project_arch}" echo "" echo "Create $UPDATE_ROOT/.nocompat to disable compatibility checks and risk a non-booting system." echo "" return 1 fi fi return 0 } display_versions() { local old_project_version new_project_version old_project_version="$(get_project_version "/sysroot")" || return new_project_version="$(get_project_version "/update")" || return if [ -n "${old_project_version}" -a -n "${new_project_version}" ]; then echo "" echo "Updating from ${old_project_version} to ${new_project_version}" echo "" fi return 0 } update_file() { if [ -f "$UPDATE_DIR/$2" -a -f "$3" ]; then mount -o remount,rw /flash rm -f "$3" StartProgress percent "Updating $1... " "$3" $(stat -t "$UPDATE_DIR/$2" | awk '{print $2}') # use dd here with conv=fsync so that all writes are non-buffered # ensuring accurate progress - take the sync hit during the # transfer, rather than when flushing file buffers after the progress # meter declares the transfer already complete dd if=$UPDATE_DIR/$2 of=$3 bs=1M conv=fsync 2>/dev/null StopProgress # loopback file needs writable /flash all the time if [ "${disk%%=*}" != "FILE" ]; then mount -o remount,ro /flash fi sync fi } update_partition() { local result if [ -f "$UPDATE_DIR/$2" -a -b "$3" ]; then StartProgress spinner "Updating $1... " result="$(dd if="$UPDATE_DIR/$2" of="$3" 2>&1)" StopProgress "done" echo "${result}" fi } update_bootloader() { local result export BOOT_ROOT="/flash" export SYSTEM_ROOT="/update" if [ -f $SYSTEM_ROOT/usr/share/bootloader/update.sh ]; then echo "" echo "Updating Boot Files... " sh $SYSTEM_ROOT/usr/share/bootloader/update.sh sync echo "Boot Files Updated." echo "" fi } load_modules() { progress "Loading kernel modules" [ ! -f /etc/modules ] && return for module in $(cat /etc/modules); do progress "Loading kernel module $module" insmod "/usr/lib/modules/$module.ko" || progress "... Failed to load kernel module $module, skipping" done } set_consolefont() { local vres progress "Set console font" if [ -e /dev/fb0 ]; then vres="$(fbset 2>/dev/null | awk '/geometry/ { print $3 }')" if [ $vres -gt "$BIGFONT" ]; then setfont -C /dev/tty0 ter-v32b.psf fi fi } load_splash() { local set_default_res=no local vres if [ ! "$SPLASH" = "no" ]; then progress "Loading bootsplash" if [ -e /dev/fb0 ]; then # Set framebuffer to a custom resolution and/or fallback to default resolution (1024x768-32), if required. if [ ! "$SWITCH_FRAMEBUFFER" = "no" ]; then if [ "$SWITCH_FRAMEBUFFER" = "1080" ]; then SWITCH_FRAMEBUFFER="1920 1080 1920 1080 32" elif [ "$SWITCH_FRAMEBUFFER" = "720" ]; then SWITCH_FRAMEBUFFER="1280 720 1280 720 32" fi # Try setting a custom framebuffer resolution if [ ! "${SWITCH_FRAMEBUFFER:-yes}" = "yes" ]; then fbset -g $SWITCH_FRAMEBUFFER 2>/dev/null && set_default_res=no fi # Set a default resolution if required if [ "$set_default_res" = "yes" ]; then fbset -g 1024 768 1024 768 32 fi fi # load splash if [ -f /splash/splash.conf ]; then . /splash/splash.conf fi # Select splash image based on current native resolution if [ -z "$SPLASHIMAGE" ]; then vres="$(fbset 2>/dev/null | awk '/geometry/ { print $3 }')" for s in /flash/progress/oemsplash-${vres}- \ /flash/progress/oemsplash-1080- \ /flash/progress/oemsplash- \ /flash/oemsplash-${vres}.png \ /flash/oemsplash-1080.png \ /flash/oemsplash.png \ /splash/progress/splash-${vres}- \ /splash/progress/splash-1080- \ /splash/splash-${vres}.png \ /splash/splash-1080.png \ ; do if [ -f "${s}" ]; then SPLASHIMAGE="${s}" break elif [ "$FORCE_SPLASH" = "no" -a -f "${s}config" ]; then SPLASHIMAGE="${s}" break fi done fi if [ -n "$SPLASHIMAGE" ]; then splash-image $SPLASHIMAGE > /dev/null 2>&1 fi debug_msg "Framebuffer vertical res: $vres" debug_msg "Framebuffer splash image: $SPLASHIMAGE" fi fi } do_reboot() { echo "System reboots now..." # stop output redirection [ -n "$TEE_PID" ] && kill $TEE_PID &>/dev/null if [ -s /dev/init.log ]; then mv /dev/init.log /storage/init-previous.log fi redirect_output_to_screen delete_descriptors # syncing filesystem sync # unmount filesystems if /usr/bin/busybox mountpoint -q /flash ; then /usr/bin/busybox umount /flash fi if /usr/bin/busybox mountpoint -q ${UPDATE_ROOT} ; then /usr/bin/busybox umount ${UPDATE_ROOT} > /dev/null 2>&1 fi if /usr/bin/busybox mountpoint -q /storage/roms ; then /usr/bin/busybox umount /storage/roms > /dev/null 2>&1 fi if /usr/bin/busybox mountpoint -q /storage ; then /usr/bin/busybox umount /storage fi usleep 2000000 /usr/bin/busybox reboot } force_fsck() { echo "Filesystem corruption has been detected!" echo "To prevent an automatic repair attempt continuing," echo "press any key or power off your system within the next 120 seconds" echo "" read -t120 -n1 # The exit status is 0 if input is available # The exit status is greater than 128 if the timeout is exceeded if [ $? -ne 0 -o $? -gt 128 ]; then echo "Repairing filesystem..." echo "" /usr/sbin/fsck -T -M -y $RUN_FSCK_DISKS FSCK_RET=$? if [ $(( $FSCK_RET & 8 )) -eq 8 ]; then # fubar echo "Forced fsck failed. Your system is broken beyond repair" echo "Please re-install @DISTRONAME@" echo "" echo "Press enter to shutdown now" echo "" read fubar poweroff fi do_reboot else echo "Shutting down..." sleep 5 sync poweroff fi } fix_bootlabel() { local flash_label [ ! -b /dev/CE_FLASH ] && return 0 flash_label=$(/usr/sbin/fatlabel /dev/CE_FLASH) if [ "${flash_label}" != "CE_FLASH" ]; then progress "wrong eMMC flash label \"${flash_label}\", fixing it" fatlabel /dev/CE_FLASH CE_FLASH 2>&1 | echo_to_kmsg fi } check_disks() { if [ "$RUN_FSCK" = "yes" -a -n "$RUN_FSCK_DISKS" ]; then progress "Checking disk(s): $RUN_FSCK_DISKS" for i in 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0; do /usr/sbin/fsck -T -M -p -a $RUN_FSCK_DISKS >/dev/fsck.latest 2>&1 FSCK_RET=$? cat /dev/fsck.latest >>/dev/fsck.log cat /dev/fsck.latest | echo_to_kmsg rm -f /dev/fsck.latest # FSCK_RET is the bit-wise OR of the exit codes for each filesystem that is checked. if [ $FSCK_RET -ge 16 ]; then progress "General error, continuing..." break elif [ $(( $FSCK_RET & 8 )) -eq 8 ]; then # device not found if [ $i -eq 0 ]; then progress "Device not found, continuing..." else usleep 500000 fi elif [ $(( $FSCK_RET & 4 )) -eq 4 ]; then # errors left force_fsck elif [ $(( $FSCK_RET & 2 )) -eq 2 ]; then # reboot needed echo "Filesystem repaired, reboot needed..." do_reboot elif [ $(( $FSCK_RET & 1 )) -eq 1 ]; then # filesystem errors corrected progress "Filesystem errors corrected , continuing..." break elif [ $FSCK_RET -eq 0 ]; then # no errors found progress "No filesystem errors found, continuing..." break fi done fi } wakeonlan() { if [ "$STORAGE_NETBOOT" = "yes" ]; then wol_ip=${disk%:*} wol_ip=${wol_ip#*=} elif [ "$FLASH_NETBOOT" = "yes" ]; then wol_ip=${boot%:*} wol_ip=${wol_ip#*=} else return 0 fi if [ -n "$wol_ip" -a -n "$wol_mac" -a -n "$wol_wait" ]; then progress "Sending Magic Packet (WOL) if needed" if ! ping -q -c 2 "$wol_ip" &>/dev/null; then ether-wake "$wol_mac" StartProgress countdown "WOL magic packet sent to $wol_ip, waiting $wol_wait seconds... " $wol_wait "done" fi fi } mount_flash() { progress "Mounting flash" wakeonlan mount_part "$boot" "/flash" "ro,noatime" if [ -f /flash/post-flash.sh ]; then . /flash/post-flash.sh fi } cleanup_flash() { progress "Cleaning up flash (if required)" if [ -f /flash/pieeprom.bin -o -f /flash/pieeprom.upd -o -f /flash/vl805.bin ]; then mount -o remount,rw /flash rm -f /flash/pieeprom.bin /flash/pieeprom.upd /flash/pieeprom.sig rm -f /flash/vl805.bin /flash/vl805.sig rm -f /flash/recovery.bin /flash/recovery.[0-9][0-9][0-9] /flash/RECOVERY.[0-9][0-9][0-9] mount -o remount,ro /flash fi } mount_storage() { progress "Mounting storage" if [ "$LIVE" = "yes" ]; then # mount tmpfs and exit early. disk=xx is not allowed in live mode mount -t tmpfs none /storage return fi wakeonlan if [ -n "$disk" ]; then if [ -n "$OVERLAY" ]; then OVERLAY_DIR=$(cat /sys/class/net/eth0/address | tr -d :) mount_part "$disk" "/storage" "rw,noatime" mkdir -p /storage/$OVERLAY_DIR umount /storage # split $disk into $target,$options so we can append $OVERLAY_DIR options="${disk#*,}" target="${disk%%,*}" if [ "$options" = "$disk" ]; then disk="$target/$OVERLAY_DIR" else disk="$target/$OVERLAY_DIR,$options" fi fi if [ -f /flash/mount-storage.sh ]; then . /flash/mount-storage.sh else mount_part "$disk" "/storage" "rw,noatime" fi else # /storage should always be writable mount -t tmpfs none /storage fi } # EmuELEC specific mount_roms() { if /usr/bin/busybox mountpoint -q /storage ; then progress "Mounting roms" if [ -L "/storage/roms" ]; then /usr/bin/busybox rm -f /storage/roms > /dev/null 2>&1 fi /usr/bin/busybox mkdir -p /storage/roms > /dev/null 2>&1 # Get EEROMS filetype ROM_FS_TYPE="vfat" if [ -e "/flash/ee_fstype" ]; then EE_FS_TYPE=$(cat "/flash/ee_fstype") case $EE_FS_TYPE in "ntfs"|"ext4"|"exfat") ROM_FS_TYPE=${EE_FS_TYPE} ;; *) # Failsafe ROM_FS_TYPE="vfat" ;; esac fi if [ "${ROM_FS_TYPE}" == "ntfs" ]; then NTFSMOUNT=$(/sysroot/usr/sbin/blkid --label EEROMS) insmod /sysroot/usr/lib/kernel-overlays/base/lib/modules/$(uname -r)/kernel/fs/fuse/fuse.ko > /dev/null 2>&1 LD_LIBRARY_PATH=/sysroot/usr/lib /sysroot/usr/bin/ntfs-3g ${NTFSMOUNT} /storage/roms > /dev/null 2>&1 else mount -t ${ROM_FS_TYPE} "LABEL=EEROMS" /storage/roms > /dev/null 2>&1 fi # If mounting roms partition was succesful, we bind mount the update folder to use the third partition if /usr/bin/busybox mountpoint -q /storage/roms ; then /usr/bin/busybox mkdir -p /storage/roms/.update > /dev/null 2>&1 /usr/bin/busybox mkdir -p "$UPDATE_ROOT" > /dev/null 2>&1 mount --bind /storage/roms/.update "$UPDATE_ROOT" > /dev/null 2>&1 fi fi # Disable all enabled systemd mount units for /storage/roms and /storage/roms/*, since we will handle them in userland. Starting them then stopping then optionally restarting... It's a huge waste of time and a headache. Especially if the users want to use the systemd-mount for /storage/roms itself yet don't want to use our mount handler, many of them won't even realize storage-roms.mount is definitely up and running at the moment systemd checks for mount units, so their enabled storage-roms.mount won't work at all # The pattern is splitted to two parts since 1) storage-roms*.mount matches storage-romswhatever.mount which is not what we want; 2) storage-roms{-*,}.mount is not supported by the ASH implemented in busybox rm -f /storage/.config/system.d/*.wants/storage-roms-*.mount /storage/.config/system.d/*.wants/storage-roms.mount &>/dev/null } # Make last bootloader label (installer, live, run etc.) as the new default update_bootmenu() { local crnt_default if [ -n "$SYSLINUX_DEFAULT" -a -f /flash/syslinux.cfg ]; then if grep -q "^LABEL $SYSLINUX_DEFAULT\$" /flash/syslinux.cfg; then crnt_default="$(awk '/^DEFAULT/ {print $2}' /flash/syslinux.cfg)" if [ ! "$crnt_default" = "$SYSLINUX_DEFAULT" ]; then progress "Updating /flash/syslinux.cfg [$crnt_default -> $SYSLINUX_DEFAULT]" mount -o remount,rw /flash sed -e "s/^SAY Wait for .* mode/SAY Wait for ${SYSLINUX_DEFAULT} mode/" -i /flash/syslinux.cfg sed -e "s/^DEFAULT .*/DEFAULT $SYSLINUX_DEFAULT/" -i /flash/syslinux.cfg rm -f /flash/EFI/BOOT/syslinux.cfg mount -o remount,ro /flash fi fi fi if [ -n "$GRUB_DEFAULT" -a -f /flash/EFI/BOOT/grub.cfg ]; then if grep -q "^menuentry \"$GRUB_DEFAULT\"" /flash/EFI/BOOT/grub.cfg; then crnt_default="$(awk '/^set default/ {print substr($2,9,19)}' /flash/EFI/BOOT/grub.cfg)" if [ ! "$crnt_default" = "\"$GRUB_DEFAULT\"" ]; then progress "Updating /flash/EFI/BOOT/grub.cfg [$crnt_default -> \"$GRUB_DEFAULT\"]" mount -o remount,rw /flash sed -e "s/^set default=.*/set default=\"$GRUB_DEFAULT\"/" -i /flash/EFI/BOOT/grub.cfg rm -f /flash/grub.cfg mount -o remount,ro /flash fi fi fi } check_out_of_space() { if [ "$(df /storage | awk '/[0-9]%/{print $4}')" -eq "0" ]; then echo "" echo "The $1 is corrupt, or there is not enough" echo "free space on /storage to complete the update!" echo "" echo "Please free up space on your /storage partition" echo "by deleting unecessary files, then try again." echo "" return 0 else echo "" echo "The $1 is corrupt/invalid!" echo "" return 1 fi } do_cleanup() { StartProgress spinner "Cleaning up... " if mountpoint -q /update; then umount /update fi if [ -d $UPDATE_ROOT/.tmp/mnt ]; then if mountpoint -q $UPDATE_ROOT/.tmp/mnt ; then # busybox umount deletes loop device automatically umount $UPDATE_ROOT/.tmp/mnt fi [ -n $LOOP ] && losetup -d $LOOP &>/dev/null fi [ -f "$UPDATE_TAR" ] && rm -f "$UPDATE_TAR" &>/dev/null [ -f "$UPDATE_IMG_GZ" ] && rm -f "$UPDATE_IMG_GZ" &>/dev/null [ -f "$UPDATE_IMG" ] && rm -f "$UPDATE_IMG" &>/dev/null rm -rf $UPDATE_ROOT/.tmp &>/dev/null rm -rf $UPDATE_ROOT/[0-9a-zA-Z]* &>/dev/null rm -f $UPDATE_ROOT/.nocheck $UPDATE_ROOT/.nocompat &>/dev/null sync StopProgress "done" } check_force_splash() { UPDATE_TAR=$(ls -1 "$UPDATE_DIR"/*.tar 2>/dev/null | head -n 1) UPDATE_IMG_GZ=$(ls -1 "$UPDATE_DIR"/*.img.gz 2>/dev/null | head -n 1) UPDATE_IMG=$(ls -1 "$UPDATE_DIR"/*.img 2>/dev/null | head -n 1) BACKUP_FILE=$(ls -1 /storage/.restore/??????????????.tar 2>/dev/null | head -n 1) if [ -f /storage/.config/animation.disable ]; then FORCE_SPLASH="yes" return fi if [ -f /storage/.please_resize_me ]; then FORCE_SPLASH="yes" return fi if [ -f /storage/.cache/reset_soft -o -f /storage/.cache/reset_hard ]; then FORCE_SPLASH="yes" return fi if [ -f "$BACKUP_FILE" ]; then FORCE_SPLASH="yes" return fi if [ -f "$UPDATE_DIR/$UPDATE_KERNEL" -a -f "$UPDATE_DIR/$UPDATE_SYSTEM" ] || [ -f "$UPDATE_TAR" -o -f "$UPDATE_IMG_GZ" -o -f "$UPDATE_IMG" ]; then FORCE_SPLASH="yes" return fi if [ "$UPDATE_DISABLED" = "yes" ]; then FORCE_SPLASH="yes" return fi if [ -d $UPDATE_DIR/.tmp ]; then FORCE_SPLASH="yes" return fi } check_update() { progress "Checking for updates" UPDATE_TAR=$(ls -1 "$UPDATE_DIR"/*.tar 2>/dev/null | head -n 1) UPDATE_IMG_GZ=$(ls -1 "$UPDATE_DIR"/*.img.gz 2>/dev/null | head -n 1) UPDATE_IMG=$(ls -1 "$UPDATE_DIR"/*.img 2>/dev/null | head -n 1) if ! [ -f "$UPDATE_DIR/$UPDATE_KERNEL" -a -f "$UPDATE_DIR/$UPDATE_SYSTEM" ] && ! [ -f "$UPDATE_TAR" -o -f "$UPDATE_IMG_GZ" -o -f "$UPDATE_IMG" ]; then return 0 fi if [ "$UPDATE_DISABLED" = "yes" ]; then echo "Updating is not supported on netboot" do_cleanup StartProgress countdown "Normal startup in 10s... " 10 "NOW" return 0 fi if [ -d $UPDATE_DIR/.tmp ]; then echo "Failed update detected - performing recovery." echo "" do_cleanup StartProgress countdown "Normal startup in 10s... " 10 "NOW" return 0 fi mkdir -p $UPDATE_DIR/.tmp &>/dev/null sync echo "UPDATE IN PROGRESS" echo "" echo "Please do not reboot or turn off your @DISTRONAME@ device!" echo "" if [ -f "$UPDATE_TAR" ]; then TARRESULT="0" echo "Found new .tar archive" UPDATE_FILENAME="$UPDATE_TAR" StartProgress spinner "Extracting contents of archive... " tar -xf "$UPDATE_TAR" -C $UPDATE_DIR/.tmp 1>/dev/null 2>/tmp/tarresult.txt || TARRESULT="1" if [ "${TARRESULT}" -eq "0" ]; then mv $UPDATE_DIR/.tmp/*/target/* $UPDATE_DIR &>/dev/null sync StopProgress "done" else StopProgress "FAILED" echo "Failed to extract contents of archive file!" echo "tar result: '$(cat /tmp/tarresult.txt)'" check_out_of_space "archive" do_cleanup StartProgress countdown "Normal startup in 30s... " 30 "NOW" return 0 fi elif [ -f "$UPDATE_IMG_GZ" -o -f "$UPDATE_IMG" ]; then mkdir -p $UPDATE_DIR/.tmp/mnt &>/dev/null IMG_FILE="$UPDATE_DIR/.tmp/update.img" GZRESULT="0" if [ -f "$UPDATE_IMG_GZ" ]; then echo "Found new compressed image file" UPDATE_FILENAME="$UPDATE_IMG_GZ" StartProgress spinner "Decompressing image file... " gunzip -d -c "$UPDATE_IMG_GZ" 1>$IMG_FILE 2>/tmp/gzresult.txt || GZRESULT="1" sync [ "${GZRESULT}" -eq "0" ] && StopProgress "OK" || StopProgress "FAILED" if [ "${GZRESULT}" -eq "1" ]; then echo "Failed to decompress image file!" echo "gunzip result: '$(cat /tmp/gzresult.txt)'" check_out_of_space "compressed image" do_cleanup StartProgress countdown "Normal startup in 30s... " 30 "NOW" return 0 fi else echo "Found new image file" UPDATE_FILENAME="$UPDATE_IMG" mv "$UPDATE_IMG" $IMG_FILE fi LOOP=$(losetup -f) LOOP_NUM=$(echo $LOOP | sed 's|/dev/loop||') mknod $LOOP b 7 $LOOP_NUM &>/dev/null losetup $LOOP $IMG_FILE # check for MBR partititon OFFSET=$(fdisk -u -l $LOOP 2>/dev/null | awk '/^[ ]*Device/{part=1; next}; part{if ($2 == "*") {print $5} else {print $4} ; exit}') if [ -z "$OFFSET" ]; then # check for GPT partititon OFFSET=$(fdisk -u -l $LOOP 2>/dev/null | awk '/^Number/{part=1; next}; part{print $2; exit}') if [ -z "$OFFSET" ]; then echo "Could not find a valid system partition in image file!" do_cleanup StartProgress countdown "Normal startup in 10s... " 10 "NOW" return 0 fi fi SECTOR_SIZE=$(cat /sys/devices/virtual/block/loop${LOOP_NUM}/queue/hw_sector_size) losetup -d $LOOP sync OFFSET=$(($OFFSET * $SECTOR_SIZE)) # use losetup because busybox mount does not support the -o offset option echo "Mounting system partition..." losetup -o $OFFSET $LOOP $IMG_FILE mount -o ro,loop $LOOP $UPDATE_DIR/.tmp/mnt # don't make temporary files but instead copy # directly from mountpoint to /flash UPDATE_DIR=$UPDATE_ROOT/.tmp/mnt UPDATE_KERNEL="@KERNEL_NAME@" else UPDATE_FILENAME="$UPDATE_DIR/$UPDATE_SYSTEM" fi sync if [ ! -b "/$IMAGE_KERNEL" -a ! -f "/flash/$IMAGE_KERNEL" ] || [ ! -f "/flash/$IMAGE_SYSTEM" ]; then echo "Missing (target) ${IMAGE_KERNEL} or ${IMAGE_SYSTEM}!" do_cleanup StartProgress countdown "Normal startup in 30s... " 30 "NOW" return 0 fi if [ ! -f "$UPDATE_DIR/$UPDATE_KERNEL" -o ! -f "$UPDATE_DIR/$UPDATE_SYSTEM" ]; then echo "Missing (source) ${UPDATE_KERNEL} or ${UPDATE_SYSTEM}!" do_cleanup StartProgress countdown "Normal startup in 30s... " 30 "NOW" return 0 fi # check md5 sums if .nocheck doesn't exist if [ ! -f "$UPDATE_ROOT/.nocheck" ]; then if [ -f "$UPDATE_DIR/${UPDATE_KERNEL}.md5" -a -f "$UPDATE_DIR/${UPDATE_SYSTEM}.md5" ]; then # *.md5 size-check if [ ! -s "$UPDATE_DIR/${UPDATE_KERNEL}.md5" -o ! -s "$UPDATE_DIR/${UPDATE_SYSTEM}.md5" ]; then echo "Zero-sized .md5 file!" MD5_FAILED="1" else sed "s#target/KERNEL#$UPDATE_DIR/$UPDATE_KERNEL#g" "$UPDATE_DIR/${UPDATE_KERNEL}.md5" >"$UPDATE_ROOT/${UPDATE_KERNEL}.check.md5" sed "s#target#$UPDATE_DIR#g" "$UPDATE_DIR/${UPDATE_SYSTEM}.md5" >"$UPDATE_ROOT/${UPDATE_SYSTEM}.check.md5" StartProgress spinner "Checking ${UPDATE_KERNEL}.md5... " if md5sum -sc "$UPDATE_ROOT/${UPDATE_KERNEL}.check.md5"; then StopProgress "OK" else StopProgress "FAILED" MD5_FAILED="1" fi StartProgress spinner "Checking ${UPDATE_SYSTEM}.md5... " if md5sum -sc "$UPDATE_ROOT/${UPDATE_SYSTEM}.check.md5"; then StopProgress "OK" else StopProgress "FAILED" MD5_FAILED="1" fi fi else echo "Missing ${UPDATE_KERNEL}.md5 or ${UPDATE_SYSTEM}.md5!" MD5_FAILED="1" fi if [ "$MD5_FAILED" -eq "1" ]; then echo "md5 check failed!" do_cleanup StartProgress countdown "Normal startup in 30s... " 30 "NOW" return 0 fi fi mount_part "$UPDATE_DIR/$UPDATE_SYSTEM" "/update" "ro,loop" # Verify that the new update is compatible with the current system - this should avoid creating # non-booting systems after (for example) an RPi tar is incorrectly applied to an RPi2 system. if [ ! -f "$UPDATE_ROOT/.nocompat" ]; then if ! check_is_compatible "$UPDATE_FILENAME"; then do_cleanup StartProgress countdown "Normal startup in 60s... " 60 "NOW" return 0 fi fi # get sizes FLASH_FREE=$(df /flash/ | awk '/[0-9]%/{print $4}') FLASH_FREE=$(( $FLASH_FREE * 1024 )) # Disregard kernel size if it's a a block device if [ ! -b "/$IMAGE_KERNEL" ]; then OLD_KERNEL=$(stat -t "/flash/$IMAGE_KERNEL" | awk '{print $2}') else OLD_KERNEL="0" fi OLD_SYSTEM=$(stat -t "/flash/$IMAGE_SYSTEM" | awk '{print $2}') NEW_KERNEL=$(stat -t "$UPDATE_DIR/$UPDATE_KERNEL" | awk '{print $2}') NEW_SYSTEM=$(stat -t "$UPDATE_DIR/$UPDATE_SYSTEM" | awk '{print $2}') # old KERNEL+SYSTEM+free space - new KERNEL+SYSTEM must be higher than 5MB # at least 5MB free after update TMP_SIZE=$((OLD_KERNEL + OLD_SYSTEM + FLASH_FREE - NEW_KERNEL - NEW_SYSTEM)) FLASH_FREE_MIN=$((FLASH_FREE_MIN * 1024 * 1024)) if [ $TMP_SIZE -ge $FLASH_FREE_MIN ]; then echo "Checking size: OK" else echo "Checking size: FAILED" echo "" echo "Your System (FAT) partition is too small for this update," echo "and there is not enough space for the update to be installed!" echo "" echo "You must re-install your system using the disk image of a" echo "current release, or you must re-size your existing partitions" echo "so that the System (FAT) partition is at least @SYSTEM_SIZE@MB in size." echo "" do_cleanup StartProgress countdown "Normal startup in 60s... " 60 "NOW" return 0 fi # all ok, update display_versions if [ -b "/$IMAGE_KERNEL" ]; then update_partition "Kernel" "$UPDATE_KERNEL" "/$IMAGE_KERNEL" else update_file "Kernel" "$UPDATE_KERNEL" "/flash/$IMAGE_KERNEL" fi umount /sysroot update_file "System" "$UPDATE_SYSTEM" "/flash/$IMAGE_SYSTEM" update_bootloader do_cleanup if [ -f /flash/user-update.sh ]; then sync mount -o rw,remount /flash sh /flash/user-update.sh mount -o ro,remount /flash fi do_reboot } prepare_sysroot() { progress "Preparing system" mount --move /flash /sysroot/flash mount --move /storage /sysroot/storage if [ ! -d "/sysroot/usr/lib/kernel-overlays/base/lib/modules/$(uname -r)/" -a -f "/sysroot/usr/lib/systemd/systemd" ]; then echo "" echo "NEVER TOUCH boot= in syslinux.conf / cmdline.txt!" echo "If you don't know what you are doing," echo "your installation is now broken." echo "" StartProgress countdown "Normal startup in 60s... " 60 "NOW" fi [ -f "/sysroot/usr/lib/systemd/systemd" ] || error "final_check" "Could not find systemd!" } amlogic_dtb_exists() { DT_ID=$(sh /sysroot/usr/bin/dtname) # modify DT_ID by dtb.conf if [ -n "$DT_ID" -a -f /sysroot/usr/bin/convert_dtname ]; then [ -n "$SYSTEM_ROOT" ] && SYSTEM_ROOT_ORIG="$SYSTEM_ROOT" SYSTEM_ROOT="/sysroot" . $SYSTEM_ROOT/usr/bin/convert_dtname $DT_ID [ -n "$SYSTEM_ROOT_ORIG" ] && SYSTEM_ROOT="$SYSTEM_ROOT_ORIG" unset SYSTEM_ROOT_ORIG fi DT_FILE=$(ls -1 /sysroot/usr/share/bootloader/device_trees/${DT_ID}.dtb 2>/dev/null | head -n 1) if [ -f "/proc/device-tree/coreelec" ] && [ -n "${DT_ID}" ] && [ -f "${DT_FILE}" ]; then true else false fi } check_amlogic_dtb() { if grep -q "amlogic" /proc/device-tree/compatible; then if grep -q "official" /sysroot/etc/os-release; then progress "Checking Amlogic DTB" if ! amlogic_dtb_exists; then echo "WARNING: Your device-tree is out-of-date!" echo "" echo "Please update it to resume normal startup." echo "" StartProgress countdown "Normal startup in 30s... " 30 "NOW" echo "" fi fi fi } # create pipe and save original descriptors create_output_pipe() { # save original stdout and stderr descriptors exec 4>&1 exec 5>&2 # create pipe and use it with tee mknod /tmp/output_pipe p tee </tmp/output_pipe /dev/init.log & TEE_PID=$! } # redirect stdout and stderr redirect_output_to_pipe() { exec 1>/tmp/output_pipe exec 2>/tmp/output_pipe } # restore original descriptors redirect_output_to_screen() { exec 1>&4 exec 2>&5 } # delete descriptor delete_descriptors() { exec 4>&- exec 5>&- } # Do init tasks to bring up system # set ondemand up_threshold if [ -e /sys/devices/system/cpu/cpufreq/ondemand/up_threshold ]; then echo 50 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold else for f in $(ls /sys/devices/system/cpu/cpufreq/policy*/ondemand/up_threshold 2>/dev/null) ; do echo 50 > $f done fi # run platform_init script if exists if [ -f "./platform_init" ]; then ./platform_init fi # load keymap if set if [ -n "$KEYMAP" ]; then loadkmap < "$KEYMAP" fi # clear screen and hide cursor clear hidecursor create_output_pipe redirect_output_to_pipe # parse command line arguments for arg in $(cat /proc/cmdline); do case $arg in BOOT_IMAGE=*) IMAGE_KERNEL="${arg#*=}" [ "${IMAGE_KERNEL:0:1}" = "/" ] && IMAGE_KERNEL="${IMAGE_KERNEL:1}" ;; SYSTEM_IMAGE=*) IMAGE_SYSTEM="${arg#*=}" [ "${IMAGE_SYSTEM:0:1}" = "/" ] && IMAGE_SYSTEM="${IMAGE_SYSTEM:1}" ;; boot=*) boot="${arg#*=}" case $boot in ISCSI=*|NBD=*|NFS=*) UPDATE_DISABLED=yes FLASH_NETBOOT=yes ;; /dev/*|LABEL=*|UUID=*) RUN_FSCK_DISKS="$RUN_FSCK_DISKS $boot" ;; FOLDER=*) RUN_FSCK_DISKS="$RUN_FSCK_DISKS ${boot#*=}" ;; esac ;; disk=*) disk="${arg#*=}" case $disk in ISCSI=*|NBD=*|NFS=*) STORAGE_NETBOOT=yes ;; /dev/*|LABEL=*|UUID=*) RUN_FSCK_DISKS="$RUN_FSCK_DISKS $disk" ;; FOLDER=*) RUN_FSCK_DISKS="$RUN_FSCK_DISKS ${disk#*=}" ;; esac ;; wol_mac=*) wol_mac="${arg#*=}" ;; wol_wait=*) wol_wait="${arg#*=}" ;; installer) SYSLINUX_DEFAULT="installer" ;; debugging) FORCE_SPLASH="yes" DEBUG=yes ;; nopkmute) MUTE_PRINTK=no ;; keymap=*) KEYMAP=$(ls -1 /usr/lib/keymaps/*/"${arg#*=}".bmap) ;; progress) PROGRESS=yes INIT_ARGS="$INIT_ARGS --show-status=1" ;; nofsck) RUN_FSCK=no ;; nosplash) SPLASH=no ;; toram) SYSTEM_TORAM=yes ;; live) LIVE=yes SYSLINUX_DEFAULT="live" ;; portable) SYSLINUX_DEFAULT="run" ;; grub_live) LIVE=yes GRUB_DEFAULT="Live" ;; grub_portable) GRUB_DEFAULT="Run" ;; overlay) OVERLAY=yes ;; setfbres=*) SWITCH_FRAMEBUFFER="${arg#*=}" SWITCH_FRAMEBUFFER="${SWITCH_FRAMEBUFFER//,/ }" ;; break=*) BREAK="${arg#*=}" ;; bigfont=*) BIGFONT="${arg#*=}" ;; ip=*) KERNEL_IPCONFIG="yes" ;; esac done # hide kernel log messages on console if [ ! "$MUTE_PRINTK" = "no" ]; then echo '1 4 1 7' > /proc/sys/kernel/printk fi if test "$DEBUG" = "yes"; then exec 3>&1 else exec 3>/dev/null fi SILENT_OUT=3 # If the network is up (due to the use of the "ip" kernel parameter) and a DNS # server is known, allow the libc resolver to use it grep '^\(nameserver\|domain\) ' /proc/net/pnp | grep -v '^nameserver 0\.0\.0\.0$' > /etc/resolv.conf if [ "${boot%%=*}" = "FILE" ]; then error "check arguments" "boot argument can't be FILE type..." fi debug_msg "Unique identifier for this client: ${MACHINE_UID:-NOT AVAILABLE}" # main boot sequence for BOOT_STEP in \ load_modules \ set_consolefont \ check_disks \ fix_bootlabel \ mount_flash \ cleanup_flash \ update_bootmenu \ mount_sysroot \ mount_storage \ mount_roms \ check_force_splash \ load_splash \ check_update \ prepare_sysroot \ check_amlogic_dtb; do $BOOT_STEP [ -n "$DEBUG" ] && break_after $BOOT_STEP done BOOT_STEP=final # log if booting from usb / removable storage STORAGE=$(cat /proc/mounts | grep " /sysroot/storage " | awk '{print $1}' | awk -F '/' '{print $3}') FLASH=$(cat /proc/mounts | grep " /sysroot/flash " | awk '{print $1}' | awk -F '/' '{print $3}') for i in $STORAGE $FLASH ; do if [ -n "$i" ]; then removable="/sys/class/block/*/$i/../removable" if [ -e $removable ]; then if [ "$(cat $removable 2>/dev/null)" = "1" ]; then echo "### BIG FAT WARNING" > /dev/kmsg echo "### $i is removable. suspend/resume may not work" > /dev/kmsg fi fi fi done # move some special filesystems /usr/bin/busybox mount --move /dev /sysroot/dev /usr/bin/busybox mount --move /proc /sysroot/proc /usr/bin/busybox mount --move /sys /sysroot/sys /usr/bin/busybox mount --move /run /sysroot/run /usr/bin/busybox rm -fr /tmp # setup kernel overlays /usr/bin/busybox chroot /sysroot /usr/sbin/kernel-overlays-setup # tell OE settings addon to disable updates if [ "$UPDATE_DISABLED" = "yes" ]; then echo "" > /sysroot/dev/.update_disabled fi if [ "$FLASH_NETBOOT" = "yes" ]; then echo "" > /sysroot/dev/.flash_netboot fi if [ "$KERNEL_IPCONFIG" = "yes" ]; then echo "" > /sysroot/dev/.kernel_ipconfig fi # swap can not be used over nfs.(see scripts/mount-swap) if [ "$STORAGE_NETBOOT" = "yes" ]; then echo "" > /sysroot/dev/.storage_netboot fi BACKUP_FILE=$(ls -1 /sysroot/storage/.restore/??????????????.tar 2>/dev/null | head -n 1) if [ -f /sysroot/storage/.please_resize_me ]; then INIT_UNIT="--unit=fs-resize.target" elif [ -f /sysroot/storage/.cache/reset_soft -o -f /sysroot/storage/.cache/reset_hard ]; then INIT_UNIT="--unit=factory-reset.target" elif [ -f "$BACKUP_FILE" ]; then INIT_UNIT="--unit=backup-restore.target" fi # stop output redirection [ -n "$TEE_PID" ] && kill $TEE_PID &>/dev/null if [ -s /sysroot/dev/init.log ]; then mv /sysroot/dev/init.log /sysroot/storage/init.log else rm -f /sysroot/dev/init.log rm -f /sysroot/storage/init.log fi # restore original descriptors and delete descriptors redirect_output_to_screen delete_descriptors # switch to new sysroot and start real init exec /usr/bin/busybox switch_root /sysroot /usr/lib/systemd/systemd $INIT_ARGS $INIT_UNIT error "switch_root" "Error in initramfs. Could not switch to new root" ================================================ FILE: packages/sysutils/busybox/scripts/kernel-overlays-setup ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) SYSTEM_OVERLAYS_DIR=/usr/lib/kernel-overlays OVERLAY_CONFIG_DIR=/storage/.cache/kernel-overlays KVER=$(uname -r) RUNTIME_DIR="/run/kernel-overlays" MODULES_DIR="${RUNTIME_DIR}/modules/${KVER}" FIRMWARE_DIR="${RUNTIME_DIR}/firmware" USER_FIRMWARE_DIR="/storage/.config/firmware" mkdir -p "${MODULES_DIR}" mkdir -p "${FIRMWARE_DIR}" log() { echo "kernel-overlays-setup: $@" > /dev/kmsg } apply_overlay() { case "$1" in /*) modules_overlay_dir="${1}/lib/modules/${KVER}" firmware_overlay_dir="${1}/lib/firmware" ;; *) modules_overlay_dir="${SYSTEM_OVERLAYS_DIR}/${1}/lib/modules/${KVER}" firmware_overlay_dir="${SYSTEM_OVERLAYS_DIR}/${1}/lib/firmware" ;; esac if [ -d "${modules_overlay_dir}" ] ; then GOT_MODULE_OVERLAY="yes" if cp -rfs "${modules_overlay_dir}"/* "${MODULES_DIR}" ; then log "added modules from $modules_overlay_dir" else log "failed to add modules from $modules_overlay_dir" fi fi if [ -d "${firmware_overlay_dir}" ] ; then if cp -rfs "${firmware_overlay_dir}"/* "${FIRMWARE_DIR}" ; then log "added firmware from $firmware_overlay_dir" else log "failed to add firmware from $firmware_overlay_dir" fi fi } # setup system base modules log "setup base modules" apply_overlay base # apply user-configured module overlays if [ -d "${OVERLAY_CONFIG_DIR}" ] ; then log "adding overlays from ${OVERLAY_CONFIG_DIR}" GOT_MODULE_OVERLAY="no" for conf in "${OVERLAY_CONFIG_DIR}/"*.conf ; do if [ -e "$conf" ] ; then log "processing conf $conf" overlay=$(cat "$conf") [ -n "$overlay" ] && apply_overlay "$overlay" fi done if [ "yes" = "$GOT_MODULE_OVERLAY" ] ; then log "running depmod" /usr/sbin/depmod -a >/dev/kmsg 2>&1 fi fi if [ -d "${USER_FIRMWARE_DIR}" ] && [ -n "$(ls ${USER_FIRMWARE_DIR})" ] ; then if cp -rfs "${USER_FIRMWARE_DIR}"/* "${FIRMWARE_DIR}" ; then log "added firmware from ${USER_FIRMWARE_DIR}" else log "failed to add firmware from ${USER_FIRMWARE_DIR}" fi fi log "done" ================================================ FILE: packages/sysutils/busybox/scripts/ledfix ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) # find heartbeat triggers and set them to none case $(dtsoc) in amlogic*) for triggerfile in $(find /sys/devices/platform/leds -name trigger); do trigger=$(awk -F'[][]' '{print $2}' "$triggerfile") if [ "$trigger" = "heartbeat" ]; then echo "none" > "$triggerfile" fi done ;; esac ================================================ FILE: packages/sysutils/busybox/scripts/libreelec-target-generator ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Matthias Reichl <hias@horus.com> # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) EARLY_DIR="$2" log() { echo "libreelec-target-generator: $@" > /dev/kmsg } if [ -z "$EARLY_DIR" ]; then log "error: generator directory missing" exit 1 fi TARGET="" for arg in $(cat /proc/cmdline); do case "$arg" in textmode) TARGET="textmode.target" ;; installer) TARGET="installer.target" ;; esac done BACKUP_EXTENSION_LIST=".tar .tar.gz .tar.bz2 .tar.xz" for extension in $BACKUP_EXTENSION_LIST; do BACKUP_FILE=$(ls -1 /storage/.restore/*${EXTENSION} 2>/dev/null | head -n 1) [ -n "${BACKUP_FILE}" ] && break done if [ -f /storage/.please_resize_me ]; then TARGET="fs-resize.target" elif [ -f /storage/.cache/reset_hard -o -f /storage/.cache/reset_soft ]; then TARGET="factory-reset.target" elif [ -f "$BACKUP_FILE" ]; then TARGET="backup-restore.target" elif [ -f /storage/.rpi_flash_firmware ]; then TARGET="rpi-flash-firmware.target" fi if [ -n "$TARGET" ]; then ln -sT "/usr/lib/systemd/system/$TARGET" "$EARLY_DIR/default.target" 2>/dev/kmsg || log "error creating symlink to $TARGET: $?" fi ================================================ FILE: packages/sysutils/busybox/scripts/lsb_release ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # show release information . /etc/os-release echo "$PRETTY_NAME" ================================================ FILE: packages/sysutils/busybox/scripts/pastebinit ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) cat "$@" | curl -F 'sprunge=<-' https://paste.coreelec.org ================================================ FILE: packages/sysutils/busybox/scripts/rpi-flash-firmware ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) FLAG_FILE="/storage/.rpi_flash_firmware" . /usr/lib/libreelec/functions hidecursor if [ -f "${FLAG_FILE}" ]; then . ${FLAG_FILE} rm -f "${FLAG_FILE}" if ! mount -o remount,rw /flash 2>/dev/null; then echo "ERROR: Unable to mount /flash as a read/write file system." echo echo "Aborting Flash update process - please proceed with a manual update." echo StartProgress countdown "Rebooting in 15s... " 15 "NOW" reboot -f &>/dev/null fi # Install new bootloader and/or USB3 firmware files to /flash # Firmware flashing will occur during the next boot, after # which the system will again reboot. # Old firmware files will be automatically removed by init. CMD_ARGS="" [ "${BOOTLOADER}" = "yes" ] && CMD_ARGS="${CMD_ARGS} -A bootloader" [ "${VL805}" = "yes" ] && CMD_ARGS="${CMD_ARGS} -A vl805" if [ -n "${CMD_ARGS}" ]; then USE_FLASHROM=0 /usr/bin/.rpi-eeprom-update.real ${CMD_ARGS} fi sync mount -o remount,ro /flash fi reboot -f &>/dev/null ================================================ FILE: packages/sysutils/busybox/scripts/sudo ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) message="$message\n There is no working 'sudo'." message="$message\n " message="$message\n On debian/ubuntu/all general purpose linux distributions 'sudo'" message="$message\n allows a permitted user to execute a command as the superuser" message="$message\n or another user, as specified by the security policy" message="$message\n " message="$message\n With LibreELEC you have root access by default, so you dont need 'sudo'" message="$message\n " echo -e $message exit 1 ================================================ FILE: packages/sysutils/busybox/scripts/update-bootloader-edid-rpi ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) EDID_DIR="/storage/.config/firmware/edid" EDID_CPIO="/flash/edid.cpio" CONFIG_TXT="/flash/config.txt" CMDLINE_TXT="/flash/cmdline.txt" usage() { echo "$0 set CONNECTOR... | delete | help" } check_args() { if [ $# -eq 0 ]; then echo "error: no connector(s) specified!" exit 1 fi if [ ! -f "${EDID_CPIO}" ]; then echo "error: ${EDID_CPIO} not present" exit 1 fi for conn in "$@"; do if [ ! -f "${EDID_DIR}/edid-${conn}.bin" ]; then echo "error: ${EDID_DIR}/edid-${conn}.bin not present" exit 1 fi done } cleanup_config_txt() { sed -i "/^initramfs edid\.cpio/d" ${CONFIG_TXT} } get_cleaned_cmdline_txt() { sed \ -e 's| drm\.edid_firmware=[^ ]*||g' \ -e 's| video=[^ ]*||g' \ ${CMDLINE_TXT} } add_initramfs() { # make sure config.txt ends with a newline if [ "$(tail -c 1 ${CONFIG_TXT} | tr -c -d '\n' | tr '\n' 'X')" != "X" ]; then echo "" >> ${CONFIG_TXT} fi echo "initramfs edid.cpio" >> ${CONFIG_TXT} } add_cmdline() { CMDLINE=$(get_cleaned_cmdline_txt) FIRMWARE="" VIDEO="" for conn in "$@"; do VIDEO="${VIDEO} video=${conn}:D" [ -n "${FIRMWARE}" ] && FIRMWARE="${FIRMWARE}," FIRMWARE="${FIRMWARE}${conn}:edid/edid-${conn}.bin" done echo "${CMDLINE} drm.edid_firmware=${FIRMWARE}${VIDEO}" > ${CMDLINE_TXT} } set_edids() { check_args "$@" mount -o remount,rw /flash cleanup_config_txt add_initramfs add_cmdline "$@" mount -o remount,ro /flash } delete_edids() { mount -o remount,rw /flash cleanup_config_txt CMDLINE=$(get_cleaned_cmdline_txt) echo "${CMDLINE}" > ${CMDLINE_TXT} mount -o remount,ro /flash } case $1 in set) shift set_edids "$@" ;; delete) delete_edids ;; help) usage ;; *) usage exit 1 ;; esac ================================================ FILE: packages/sysutils/busybox/scripts/vfd-clock ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) do_start(){ while sleep 1 do printf "%4s" "$(date +'%l %M' | tr -d '[:space:]')" > "$LED_PATH_TEXT" if [ "$LED_COLON" = "off" ]; then echo "1" > "$LED_PATH_COLON" LED_COLON="on" else echo "0" > "$LED_PATH_COLON" LED_COLON="off" fi done } do_stop(){ echo "0" > "$LED_PATH_COLON" echo " " > "$LED_PATH_TEXT" } case $(dtname) in oranth,tx3-mini|oranth,tx9-pro|sunvell,t95z-plus) LED_PATH_COLON="/sys/devices/platform/spi/spi_master/spi0/spi0.0/leds/:colon/brightness" LED_PATH_TEXT="/sys/devices/platform/spi/spi_master/spi0/spi0.0/display_text" ;; default|*) # noop ;; esac if [ -n "$LED_PATH_COLON" ] && [ -n "$LED_PATH_TEXT" ]; then case $1 in start) do_start ;; stop) do_stop ;; esac else exit 0 fi ================================================ FILE: packages/sysutils/busybox/sleep.d.serial/99-suspend-modules.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) if [ -f /storage/.config/suspend-modules.conf ]; then . /storage/.config/suspend-modules.conf custom_modules="${SUSPEND_MODULES}" SUSPEND_MODULES="" fi . /etc/suspend-modules.conf if [ -n "${custom_modules}" ]; then SUSPEND_MODULES="${SUSPEND_MODULES} ${custom_modules}" fi modunload() { local MOD D C USED MODS I local UNL="$(echo $1 |tr - _)" RET=1 while read MOD D C USED D; do [ "$MOD" = "$UNL" ] || continue if [ "$USED" = "-" ]; then # no dependent modules, just try to remove this one. _rmmod "$MOD" $C RET=$? else # modules depend on this one. try to remove them first. MODS=",${USED%,}" while [ -n "${MODS}" ]; do # try to unload the last one first MOD="${MODS##*,}" modunload $MOD && RET=0 # prune the last one from the list MODS="${MODS%,*}" done # if we unloaded at least one module, then let's # try again! [ $RET -eq 0 ] && modunload $MOD RET=$? fi return $RET done < /proc/modules # if we came this far, there was nothing to do, # the module is no longer loaded. return 0 } _rmmod() { if modprobe -r "$1"; then touch "/run/libreelec/suspend/module:$1" return 0 else logger -t suspend-modules "# could not unload '$1', usage count was $2" return 1 fi } resume_modules() { for x in /run/libreelec/suspend/module:* ; do [ -O "${x}" ] || continue modprobe "${x##*:}" &>/dev/null && \ logger -t resume-modules "Reloaded module ${x##*:}." || \ logger -t resume-modules "Could not reload module ${x##*:}." done } suspend_modules() { [ -z "$SUSPEND_MODULES" ] && return 0 # clean up rm -rf /run/libreelec/suspend mkdir -p /run/libreelec/suspend for x in $SUSPEND_MODULES ; do modunload $x && \ logger -t suspend-modules "Unloading kernel module $x: Done" || \ logger -t suspend-modules "Unloading kernel module $x: Failed" done return 0 } case $1 in pre) suspend_modules ;; post) resume_modules ;; esac ================================================ FILE: packages/sysutils/busybox/sysctl.d/99-coredump.conf ================================================ kernel.core_pattern=/storage/.cache/cores/core.%E.%t.%p ================================================ FILE: packages/sysutils/busybox/sysctl.d/cdrom.conf ================================================ dev.cdrom.lock=0 dev.cdrom.autoclose=0 ================================================ FILE: packages/sysutils/busybox/sysctl.d/memory.conf ================================================ vm.min_free_kbytes=16384 ================================================ FILE: packages/sysutils/busybox/system.d/fs-resize.service ================================================ [Unit] Description=FS Resize DefaultDependencies=no [Service] Type=idle ExecStart=/usr/lib/libreelec/fs-resize StandardInput=tty-force StandardOutput=inherit StandardError=inherit ================================================ FILE: packages/sysutils/busybox/system.d/fs-resize.target ================================================ [Unit] Description=FS Resize target Requires=fs-resize.service After=fs-resize.service AllowIsolate=yes ================================================ FILE: packages/sysutils/busybox/system.d/ledfix.service ================================================ [Unit] Description=LEDfix Service After=network-online.target graphical.target Requires=graphical.target Wants=kodi.target [Service] Type=oneshot ExecStart=/bin/sh /usr/bin/ledfix RemainAfterExit=yes StartLimitInterval=0 [Install] WantedBy=kodi.target ================================================ FILE: packages/sysutils/busybox/system.d/locale.service ================================================ [Unit] Description=Compile locale definition files ConditionPathExists=!/storage/.cache/locpath ConditionPathExists=!/storage/.kodi/addons/service.locale/locpath Before=kodi.service [Service] Type=oneshot Environment=HOME=/storage Environment=I18NPATH=/usr/share/i18n ExecStartPre=/bin/mkdir /storage/.cache/locpath ExecStart=/usr/bin/localedef --quiet -i POSIX -f UTF-8 /storage/.cache/locpath/C.UTF-8 SuccessExitStatus=0 1 RemainAfterExit=yes [Install] WantedBy=multi-user.target ================================================ FILE: packages/sysutils/busybox/system.d/rpi-flash-firmware.service ================================================ [Unit] Description=RPi Flash Firmware Requires=tmp.mount var.mount sys-kernel-config.mount After=tmp.mount var.mount sys-kernel-config.mount DefaultDependencies=no [Service] Type=idle ExecStart=/usr/lib/libreelec/rpi-flash-firmware StandardInput=tty-force StandardOutput=inherit StandardError=inherit ================================================ FILE: packages/sysutils/busybox/system.d/rpi-flash-firmware.target ================================================ [Unit] Description=RPi Flash Firmware target Requires=rpi-flash-firmware.service After=rpi-flash-firmware.service AllowIsolate=yes ================================================ FILE: packages/sysutils/busybox/system.d/shell.service ================================================ [Unit] Description=Textmode Shell After=multi-user.target [Service] Environment=TTY=1 WorkingDirectory=/storage ExecStartPre=/bin/sh -c 'echo -en "\033[?25h"' ExecStart=/bin/sh -c 'clear; lsb_release; . /etc/profile; exec /bin/sh' Restart=always RestartSec=0 StandardInput=tty TTYPath=/dev/tty1 TTYReset=yes TTYVHangup=yes KillMode=process IgnoreSIGPIPE=no # bash ignores SIGTERM KillSignal=SIGHUP [Install] WantedBy=textmode.target ================================================ FILE: packages/sysutils/busybox/system.d/show-version.service ================================================ [Unit] Description=Show Version DefaultDependencies=false ConditionKernelCommandLine=!morequiet [Service] Type=oneshot ExecStart=/usr/bin/lsb_release RemainAfterExit=yes StandardOutput=tty [Install] WantedBy=basic.target ================================================ FILE: packages/sysutils/busybox/system.d/storage-log.service ================================================ [Unit] Description=Create Persistent Log Directory on /storage and rotate large logs DefaultDependencies=no RequiresMountsFor=/storage [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/mkdir -p /storage/.cache/log/journal /storage/.cache/journald.conf.d ; \ /usr/bin/find /storage/.cache/log/ -maxdepth 1 -type f -size +512k ! -name '*.old' -exec mv {} {}.old \; ================================================ FILE: packages/sysutils/busybox/system.d/textmode.target ================================================ [Unit] Description=Textmode Requires=multi-user.target After=multi-user.target Conflicts=rescue.target AllowIsolate=yes ================================================ FILE: packages/sysutils/busybox/system.d/var-log.mount ================================================ [Unit] Description=Persistent Log Storage RequiresMountsFor=/var /storage Requires=storage-log.service After=storage-log.service ConditionKernelCommandLine=!installer ConditionKernelCommandLine=|debugging ConditionPathExists=|/storage/.cache/debug.libreelec ConditionPathExists=|/storage/.cache/journald.conf.d/00_settings.conf [Mount] What=/storage/.cache/log Where=/var/log Options=bind ================================================ FILE: packages/sysutils/busybox/system.d/var.mount ================================================ # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. [Unit] Description=Variable Directory Documentation=man:hier(7) Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems DefaultDependencies=no Before=local-fs.target umount.target [Mount] What=tmpfs Where=/var Type=tmpfs [Install] WantedBy=local-fs.target ================================================ FILE: packages/sysutils/busybox/system.d/vfd-clock.service ================================================ [Unit] Description=VFD Clock Service After=network-online.target graphical.target Requires=graphical.target Wants=kodi.target [Service] Type=oneshot ExecStart=/bin/sh /usr/bin/vfd-clock start ExecStopPost=/bin/sh /usr/bin/vfd-clock stop RemainAfterExit=yes StartLimitInterval=0 [Install] WantedBy=kodi.target ================================================ FILE: packages/sysutils/busybox/system.d.opt/cron-defaults.service ================================================ [Unit] Description=Cron defaults After=local-fs.target ConditionPathExists=!/storage/.cache/services/crond.conf ConditionPathExists=!/storage/.cache/services/crond.disabled [Service] Type=oneshot ExecStart=/bin/sh -c 'cp /usr/share/services/crond.conf /storage/.cache/services/' RemainAfterExit=yes ================================================ FILE: packages/sysutils/busybox/system.d.opt/cron.service ================================================ [Unit] Description=Cron daemon After=cron-defaults.service Requires=cron-defaults.service ConditionPathExists=/storage/.cache/services/crond.conf [Service] ExecStartPre=/bin/mkdir -p /storage/.cache/cron/crontabs ExecStart=/sbin/crond -f -S KillMode=process TimeoutStopSec=1s [Install] WantedBy=multi-user.target ================================================ FILE: packages/sysutils/busybox/tmpfiles.d/z_01_busybox.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) d /var/media 0755 root root - - d /storage/backup 0755 root root - - d /storage/.update 0755 root root - - d /storage/.cache/cores 0755 root root - - d /storage/.cache/kernel-overlays 0755 root root - - d /storage/.cache/services 0755 root root - - d /storage/.config 0755 root root - - ================================================ FILE: packages/sysutils/cryptsetup/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020 Jeff Doozan <github@doozan.com> PKG_NAME="cryptsetup" PKG_MAJOR="2.3" PKG_VERSION="$PKG_MAJOR.4" PKG_LICENSE="GPL" PKG_URL="https://www.kernel.org/pub/linux/utils/cryptsetup/v$PKG_MAJOR/$PKG_NAME-$PKG_VERSION.tar.xz" PKG_SHA256="9d16eebb96b53b514778e813019b8dd15fea9fec5aafde9fae5febf59df83773" PKG_LONGDESC="cryptsetup utility for managing LUKS containers" PKG_DEPENDS_HOST="toolchain ccache:host" PKG_DEPENDS_TARGET="toolchain popt libdevmapper util-linux json-c openssl" PKG_CONFIGURE_OPTS_TARGET=" --disable-cryptsetup-reencrypt \ --disable-integritysetup \ --disable-selinux \ --disable-rpath \ --disable-veritysetup \ --disable-udev \ --enable-blkid" ================================================ FILE: packages/sysutils/dbus/package.mk ================================================ # 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="dbus" PKG_VERSION="1.14.0" PKG_SHA256="ccd7cce37596e0a19558fd6648d1272ab43f011d80c8635aea8fd0bad58aebd4" PKG_LICENSE="GPL" PKG_SITE="https://dbus.freedesktop.org" PKG_URL="https://dbus.freedesktop.org/releases/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain expat systemd" PKG_LONGDESC="D-Bus is a message bus, used for sending messages between applications." PKG_TOOLCHAIN="configure" PKG_CONFIGURE_OPTS_TARGET="export ac_cv_have_abstract_sockets=yes \ --with-sysroot=${SYSROOT_PREFIX} \ --libexecdir=/usr/lib/dbus \ --disable-verbose-mode \ --disable-asserts \ --enable-checks \ --disable-tests \ --disable-ansi \ --disable-xml-docs \ --disable-doxygen-docs \ --disable-x11-autolaunch \ --disable-selinux \ --disable-libaudit \ --enable-systemd \ --enable-inotify \ --without-valgrind \ --without-x \ --with-dbus-user=dbus \ --runstatedir=/run \ --with-system-socket=/run/dbus/system_bus_socket" post_makeinstall_target() { rm -rf ${INSTALL}/etc/rc.d rm -rf ${INSTALL}/usr/lib/dbus-1.0/include } post_install() { add_user dbus x 81 81 "System message bus" "/" "/bin/sh" add_group dbus 81 add_group netdev 497 echo "chmod 4750 ${INSTALL}/usr/lib/dbus/dbus-daemon-launch-helper" >> ${FAKEROOT_SCRIPT} echo "chown 0:81 ${INSTALL}/usr/lib/dbus/dbus-daemon-launch-helper" >> ${FAKEROOT_SCRIPT} } ================================================ FILE: packages/sysutils/diskdev_cmds/package.mk ================================================ # 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) PKG_NAME="diskdev_cmds" PKG_VERSION="332.14" PKG_SHA256="a46bec392661a02d9683355baf4442d494e2bcde0ffb094aacc1e57ddc03b3d4" PKG_LICENSE="APSL" PKG_SITE="http://src.gnu-darwin.org/DarwinSourceArchive/expanded/diskdev_cmds/" PKG_URL="http://www.opensource.apple.com/tarballs/diskdev_cmds/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain openssl" PKG_LONGDESC="The fsck and mkfs utliities for hfs and hfsplus filesystems." pre_make_target() { PKG_MAKE_OPTS_TARGET="-f Makefile.lnx CC=${CC}" export CFLAGS="${TARGET_CFLAGS} -g3 -Wall -I${PKG_BUILD}/include -DDEBUG_BUILD=0 -D_FILE_OFFSET_BITS=64 -D LINUX=1 -D BSD=1" } makeinstall_target() { mkdir -p ${INSTALL}/usr/sbin cp fsck_hfs.tproj/fsck_hfs ${INSTALL}/usr/sbin ln -sf fsck_hfs ${INSTALL}/usr/sbin/fsck.hfs ln -sf fsck_hfs ${INSTALL}/usr/sbin/fsck.hfsplus } make_init() { : # we reuse make_target() } ================================================ FILE: packages/sysutils/diskdev_cmds/patches/diskdev_cmds-332.14-main.patch ================================================ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/cache.c diskdev_cmds-332.14-patched/fsck_hfs.tproj/cache.c --- diskdev_cmds-332.14/fsck_hfs.tproj/cache.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/cache.c 2008-07-01 22:30:11.000000000 +0200 @@ -26,7 +26,11 @@ #include <stdlib.h> #include <sys/mman.h> #include <sys/stat.h> +#if LINUX +#include "missing.h" +#else #include <sys/types.h> +#endif /* __LINUX__ */ #include <sys/uio.h> #include <unistd.h> #include <string.h> Files diskdev_cmds-332.14/fsck_hfs.tproj/cache.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/cache.o differ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/BlockCache.c diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/BlockCache.c --- diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/BlockCache.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/BlockCache.c 2008-07-01 22:30:11.000000000 +0200 @@ -20,6 +20,9 @@ * @APPLE_LICENSE_HEADER_END@ */ +#if LINUX +#include "missing.h" +#endif #include "SRuntime.h" #include "Scavenger.h" #include "../cache.h" Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/BlockCache.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/BlockCache.o differ Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/BTreeAllocate.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/BTreeAllocate.o differ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/BTree.c diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/BTree.c --- diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/BTree.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/BTree.c 2008-07-01 22:30:11.000000000 +0200 @@ -1705,7 +1705,9 @@ UInt16 version, BTreeInfoRec *info ) { +#if !LINUX #pragma unused (version) +#endif BTreeControlBlockPtr btreePtr; Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/BTreeMiscOps.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/BTreeMiscOps.o differ Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/BTreeNodeOps.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/BTreeNodeOps.o differ Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/BTree.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/BTree.o differ Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/BTreeScanner.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/BTreeScanner.o differ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/BTreeTreeOps.c diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/BTreeTreeOps.c --- diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/BTreeTreeOps.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/BTreeTreeOps.c 2008-07-01 22:30:11.000000000 +0200 @@ -223,7 +223,7 @@ // if (curNodeNum == 0) { -// Panic("\pSearchTree: curNodeNum is zero!"); + Panic("SearchTree: curNodeNum is zero!"); err = fsBTInvalidNodeErr; goto ErrorExit; } @@ -433,7 +433,7 @@ M_ExitOnError (err); if ( DEBUG_BUILD && updateParent && newRoot ) - DebugStr("\p InsertLevel: New root from primary key, update from secondary key..."); + DebugStr("InsertLevel: New root from primary key, update from secondary key..."); } //////////////////////// Update Parent(s) /////////////////////////////// @@ -448,7 +448,7 @@ secondaryKey = nil; - PanicIf ( (level == btreePtr->treeDepth), "\p InsertLevel: unfinished insert!?"); + PanicIf ( (level == btreePtr->treeDepth), "InsertLevel: unfinished insert!?"); ++level; @@ -456,7 +456,7 @@ index = treePathTable [level].index; parentNodeNum = treePathTable [level].node; - PanicIf ( parentNodeNum == 0, "\p InsertLevel: parent node is zero!?"); + PanicIf ( parentNodeNum == 0, "InsertLevel: parent node is zero!?"); err = GetNode (btreePtr, parentNodeNum, &parentNode); // released as target node in next level up M_ExitOnError (err); @@ -470,7 +470,7 @@ { //debug: check if ptr == targetNodeNum GetRecordByIndex (btreePtr, parentNode.buffer, index, &keyPtr, &recPtr, &recSize); - PanicIf( (*(UInt32 *) recPtr) != targetNodeNum, "\p InsertLevel: parent ptr doesn't match target node!"); + PanicIf( (*(UInt32 *) recPtr) != targetNodeNum, "InsertLevel: parent ptr doesn't match target node!"); // need to delete and re-insert this parent key/ptr // we delete it here and it gets re-inserted in the @@ -532,7 +532,7 @@ (void) ReleaseNode (btreePtr, targetNode); (void) ReleaseNode (btreePtr, &siblingNode); - Panic ("\p InsertLevel: an error occured!"); + Panic ("InsertLevel: an error occured!"); return err; @@ -566,7 +566,7 @@ *rootSplit = false; - PanicIf ( targetNode->buffer == siblingNode->buffer, "\p InsertNode: targetNode == siblingNode, huh?"); + PanicIf ( targetNode->buffer == siblingNode->buffer, "InsertNode: targetNode == siblingNode, huh?"); leftNodeNum = ((NodeDescPtr) targetNode->buffer)->bLink; rightNodeNum = ((NodeDescPtr) targetNode->buffer)->fLink; @@ -606,7 +606,7 @@ if ( leftNodeNum > 0 ) { - PanicIf ( siblingNode->buffer != nil, "\p InsertNode: siblingNode already aquired!"); + PanicIf ( siblingNode->buffer != nil, "InsertNode: siblingNode already aquired!"); if ( siblingNode->buffer == nil ) { @@ -614,7 +614,7 @@ M_ExitOnError (err); } - PanicIf ( ((NodeDescPtr) siblingNode->buffer)->fLink != nodeNum, "\p InsertNode, RotateLeft: invalid sibling link!" ); + PanicIf ( ((NodeDescPtr) siblingNode->buffer)->fLink != nodeNum, "InsertNode, RotateLeft: invalid sibling link!" ); if ( !key->skipRotate ) // are rotates allowed? { @@ -703,7 +703,7 @@ targetNodeNum = treePathTable[level].node; targetNodePtr = targetNode->buffer; - PanicIf (targetNodePtr == nil, "\pDeleteTree: targetNode has nil buffer!"); + PanicIf (targetNodePtr == nil, "DeleteTree: targetNode has nil buffer!"); DeleteRecord (btreePtr, targetNodePtr, index); @@ -797,7 +797,7 @@ //debug: check if ptr == targetNodeNum GetRecordByIndex (btreePtr, parentNode.buffer, index, &keyPtr, &recPtr, &recSize); - PanicIf( (*(UInt32 *) recPtr) != targetNodeNum, "\p DeleteTree: parent ptr doesn't match targetNodeNum!!"); + PanicIf( (*(UInt32 *) recPtr) != targetNodeNum, " DeleteTree: parent ptr doesn't match targetNodeNum!!"); // need to delete and re-insert this parent key/ptr DeleteRecord (btreePtr, parentNode.buffer, index); @@ -1018,7 +1018,7 @@ keyPtr, keyLength, recPtr, recSize); if ( !didItFit ) { - Panic ("\pRotateLeft: InsertKeyRecord (left) returned false!"); + Panic ("RotateLeft: InsertKeyRecord (left) returned false!"); err = fsBTBadRotateErr; goto ErrorExit; } @@ -1031,7 +1031,7 @@ didItFit = RotateRecordLeft (btreePtr, leftNode, rightNode); if ( !didItFit ) { - Panic ("\pRotateLeft: RotateRecordLeft returned false!"); + Panic ("RotateLeft: RotateRecordLeft returned false!"); err = fsBTBadRotateErr; goto ErrorExit; } @@ -1048,7 +1048,7 @@ keyPtr, keyLength, recPtr, recSize); if ( !didItFit ) { - Panic ("\pRotateLeft: InsertKeyRecord (right) returned false!"); + Panic ("RotateLeft: InsertKeyRecord (right) returned false!"); err = fsBTBadRotateErr; goto ErrorExit; } @@ -1117,7 +1117,7 @@ right = rightNode->buffer; left = leftNode->buffer; - PanicIf ( right->bLink != 0 && left == 0, "\p SplitLeft: left sibling missing!?" ); + PanicIf ( right->bLink != 0 && left == 0, " SplitLeft: left sibling missing!?" ); // type should be kLeafNode or kIndexNode @@ -1240,8 +1240,8 @@ Boolean didItFit; UInt16 keyLength; - PanicIf (leftNode == nil, "\pAddNewRootNode: leftNode == nil"); - PanicIf (rightNode == nil, "\pAddNewRootNode: rightNode == nil"); + PanicIf (leftNode == nil, "AddNewRootNode: leftNode == nil"); + PanicIf (rightNode == nil, "AddNewRootNode: rightNode == nil"); /////////////////////// Initialize New Root Node //////////////////////////// @@ -1264,7 +1264,7 @@ didItFit = InsertKeyRecord ( btreePtr, rootNode.buffer, 0, keyPtr, keyLength, (UInt8 *) &rightNode->bLink, 4 ); - PanicIf ( !didItFit, "\pAddNewRootNode:InsertKeyRecord failed for left index record"); + PanicIf ( !didItFit, "AddNewRootNode:InsertKeyRecord failed for left index record"); //////////////////// Insert Right Node Index Record ///////////////////////// @@ -1275,7 +1275,7 @@ didItFit = InsertKeyRecord ( btreePtr, rootNode.buffer, 1, keyPtr, keyLength, (UInt8 *) &leftNode->fLink, 4 ); - PanicIf ( !didItFit, "\pAddNewRootNode:InsertKeyRecord failed for right index record"); + PanicIf ( !didItFit, "AddNewRootNode:InsertKeyRecord failed for right index record"); #if DEBUG_TREEOPS @@ -1355,7 +1355,7 @@ } rightPtr = rightNodePtr->buffer; - PanicIf ( leftPtr->fLink != 0 && rightPtr == 0, "\p SplitRight: right sibling missing!?" ); + PanicIf ( leftPtr->fLink != 0 && rightPtr == 0, "SplitRight: right sibling missing!?" ); // type should be kLeafNode or kIndexNode @@ -1557,7 +1557,7 @@ keyPtr, keyLength, recPtr, recSize); if ( !didItFit ) { - Panic ("\pRotateRight: InsertKeyRecord (left) returned false!"); + Panic ("RotateRight: InsertKeyRecord (left) returned false!"); err = fsBTBadRotateErr; goto ErrorExit; } @@ -1572,7 +1572,7 @@ didItFit = RotateRecordRight( btreePtr, leftNodePtr, rightNodePtr ); if ( !didItFit ) { - Panic ("\pRotateRight: RotateRecordRight returned false!"); + Panic ("RotateRight: RotateRecordRight returned false!"); err = fsBTBadRotateErr; goto ErrorExit; } @@ -1583,7 +1583,7 @@ keyPtr, keyLength, recPtr, recSize); if ( !didItFit ) { - Panic ("\pRotateRight: InsertKeyRecord (left) returned false!"); + Panic ("RotateRight: InsertKeyRecord (left) returned false!"); err = fsBTBadRotateErr; goto ErrorExit; } @@ -1607,7 +1607,7 @@ keyPtr, keyLength, recPtr, recSize); if ( !didItFit ) { - Panic ("\pRotateRight: InsertKeyRecord (right) returned false!"); + Panic ("RotateRight: InsertKeyRecord (right) returned false!"); err = fsBTBadRotateErr; goto ErrorExit; } Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/BTreeTreeOps.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/BTreeTreeOps.o differ Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/CatalogCheck.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/CatalogCheck.o differ Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/HardLinkCheck.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/HardLinkCheck.o differ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/hfs_endian.c diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/hfs_endian.c --- diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/hfs_endian.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/hfs_endian.c 2008-07-02 00:10:48.000000000 +0200 @@ -31,7 +31,11 @@ #include <sys/types.h> #include <sys/stat.h> +#if LINUX +#include "missing.h" +#else #include <architecture/byte_order.h> +#endif #include <hfs/hfs_format.h> #include "Scavenger.h" @@ -194,7 +198,7 @@ BTNodeDescriptor *srcDesc = src->buffer; BTreeControlBlockPtr btcb = fcb->fcbBtree; UInt16 *srcOffs = NULL; - UInt32 i; + int i; int error = 0; // WriteError(fcb->fcbVolume->vcbGPtr, E_BadNode, fcb->fcbFileID, src->blockNum); @@ -433,7 +437,7 @@ BTNodeDescriptor *srcDesc = src->buffer; UInt16 *srcOffs = (UInt16 *)((char *)src->buffer + (src->blockSize - (srcDesc->numRecords * sizeof (UInt16)))); char *nextRecord; /* Points to start of record following current one */ - UInt32 i; + int i; UInt32 j; if (fileID == kHFSExtentsFileID) { @@ -559,7 +563,7 @@ /* Make sure name length is consistent with key length */ if (keyLength < sizeof(srcKey->parentID) + sizeof(srcKey->nodeName.length) + srcKey->nodeName.length*sizeof(srcKey->nodeName.unicode[0])) { - if (debug) printf("hfs_swap_HFSPlusBTInternalNode: catalog record #%d keyLength=%d expected=%lu\n", + if (debug) printf("hfs_swap_HFSPlusBTInternalNode: catalog record #%d keyLength=%d expected=%i\n", srcDesc->numRecords-i, keyLength, sizeof(srcKey->parentID) + sizeof(srcKey->nodeName.length) + srcKey->nodeName.length*sizeof(srcKey->nodeName.unicode[0])); WriteError(fcb->fcbVolume->vcbGPtr, E_KeyLen, fcb->fcbFileID, src->blockNum); @@ -854,7 +858,7 @@ UInt16 *srcOffs = (UInt16 *)((char *)src->buffer + (src->blockSize - (srcDesc->numRecords * sizeof (UInt16)))); char *nextRecord; /* Points to start of record following current one */ - UInt32 i; + int i; UInt32 j; if (fileID == kHFSExtentsFileID) { diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/hfs_endian.h diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/hfs_endian.h --- diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/hfs_endian.h 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/hfs_endian.h 2008-07-01 22:30:11.000000000 +0200 @@ -27,9 +27,14 @@ * * This file prototypes endian swapping routines for the HFS/HFS Plus * volume format. - */ +*/ #include <hfs/hfs_format.h> +#if LINUX +#include <endian.h> +#include <byteswap.h> +#else #include <architecture/byte_order.h> +#endif #include "SRuntime.h" /*********************/ Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/hfs_endian.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/hfs_endian.o differ Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/libdfa.a and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/libdfa.a differ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/Makefile.lnx diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/Makefile.lnx --- diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/Makefile.lnx 1970-01-01 01:00:00.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/Makefile.lnx 2008-07-01 22:30:11.000000000 +0200 @@ -0,0 +1,15 @@ +CFILES = hfs_endian.c BlockCache.c\ + BTree.c BTreeAllocate.c BTreeMiscOps.c \ + BTreeNodeOps.c BTreeScanner.c BTreeTreeOps.c\ + CatalogCheck.c HardLinkCheck.c\ + SBTree.c SControl.c SVerify1.c SVerify2.c\ + SRepair.c SRebuildCatalogBTree.c\ + SUtils.c SKeyCompare.c SDevice.c SExtents.c SAllocate.c\ + SCatalog.c SStubs.c VolumeBitmapCheck.c +OFILES = $(CFILES:.c=.o) + +libdfa.a: $(OFILES) + $(AR) rc $@ $? + +clean: + $(RM) $(OFILES) libdfa.a Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SAllocate.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SAllocate.o differ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SBTree.c diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SBTree.c --- diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SBTree.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SBTree.c 2008-07-01 22:30:11.000000000 +0200 @@ -93,7 +93,7 @@ CopyMemory(&resultIterator->key, foundKey, CalcKeySize(btcb, &resultIterator->key)); // warning, this could overflow user's buffer!!! if ( DEBUG_BUILD && !ValidHFSRecord(data, btcb, *dataSize) ) - DebugStr("\pSearchBTreeRecord: bad record?"); + DebugStr("SearchBTreeRecord: bad record?"); } ErrorExit: @@ -190,7 +190,7 @@ CopyMemory(&iterator->key, key, CalcKeySize(btcb, &iterator->key)); // warning, this could overflow user's buffer!!! if ( DEBUG_BUILD && !ValidHFSRecord(data, btcb, *dataSize) ) - DebugStr("\pGetBTreeRecord: bad record?"); + DebugStr("GetBTreeRecord: bad record?"); } @@ -222,7 +222,7 @@ CopyMemory(key, &iterator.key, CalcKeySize(btcb, (BTreeKey *) key)); // should we range check against maxkeylen? if ( DEBUG_BUILD && !ValidHFSRecord(data, btcb, dataSize) ) - DebugStr("\pInsertBTreeRecord: bad record?"); + DebugStr("InsertBTreeRecord: bad record?"); result = BTInsertRecord( fcb, &iterator, &btRecord, dataSize ); @@ -284,7 +284,7 @@ CopyMemory(key, &iterator.key, CalcKeySize(btcb, (BTreeKey *) key)); // should we range check against maxkeylen? if ( DEBUG_BUILD && !ValidHFSRecord(newData, btcb, dataSize) ) - DebugStr("\pReplaceBTreeRecord: bad record?"); + DebugStr("ReplaceBTreeRecord: bad record?"); result = BTReplaceRecord( fcb, &iterator, &btRecord, dataSize ); @@ -301,7 +301,9 @@ OSStatus SetEndOfForkProc ( SFCB *filePtr, FSSize minEOF, FSSize maxEOF ) { +#if !LINUX #pragma unused (maxEOF) +#endif OSStatus result; UInt32 actualSectorsAdded; @@ -321,7 +323,7 @@ else { if ( DEBUG_BUILD ) - DebugStr("\pSetEndOfForkProc: minEOF is smaller than current size!"); + DebugStr("SetEndOfForkProc: minEOF is smaller than current size!"); return -1; } @@ -347,7 +349,7 @@ // Make sure we got at least as much space as we needed // if (filePtr->fcbLogicalSize < minEOF) { - Panic("\pSetEndOfForkProc: disk too full to extend B-tree file"); + Panic("SetEndOfForkProc: disk too full to extend B-tree file"); return dskFulErr; } @@ -419,7 +421,7 @@ if ( (keyLen < 6) || (keyLen > btcb->maxKeyLength) ) { if ( DEBUG_BUILD ) - DebugStr("\pCheckBTreeKey: bad key length!"); + DebugStr("CheckBTreeKey: bad key length!"); return fsBTInvalidKeyLengthErr; } Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SBTree.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SBTree.o differ Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SCatalog.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SCatalog.o differ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/Scavenger.h diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/Scavenger.h --- diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/Scavenger.h 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/Scavenger.h 2008-07-01 22:30:11.000000000 +0200 @@ -35,11 +35,16 @@ #include "BTreeScanner.h" #include "hfs_endian.h" +#if LINUX +#define XATTR_MAXNAMELEN 127 +#include <limits.h> +#else #include <sys/xattr.h> #include <sys/acl.h> #include <sys/kauth.h> -#include <sys/errno.h> #include <sys/syslimits.h> +#endif +#include <sys/errno.h> #ifdef __cplusplus extern "C" { @@ -1434,4 +1439,8 @@ }; #endif +#if LINUX +#undef XATTR_MAXNAMELEN +#endif + #endif /* __SCAVENGER__ */ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SControl.c diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SControl.c --- diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SControl.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SControl.c 2008-07-01 22:30:11.000000000 +0200 @@ -739,7 +739,7 @@ pointer = (ScavStaticStructures *) AllocateClearMemory( sizeof(ScavStaticStructures) ); if ( pointer == nil ) { if ( GPtr->logLevel >= kDebugLog ) { - printf( "\t error %d - could not allocate %ld bytes of memory \n", + printf( "\t error %d - could not allocate %i bytes of memory \n", R_NoMem, sizeof(ScavStaticStructures) ); } return( R_NoMem ); Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SControl.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SControl.o differ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SDevice.c diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SDevice.c --- diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SDevice.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SDevice.c 2008-07-01 22:30:11.000000000 +0200 @@ -28,24 +28,61 @@ #include <unistd.h> #include <errno.h> #include <sys/ioctl.h> - +#if LINUX +#include <fcntl.h> +#include <sys/stat.h> +#else #include <IOKit/storage/IOMediaBSDClient.h> - +#endif /* LINUX */ #else - #include <Files.h> #include <Device.h> #include <Disks.h> -#endif - +#endif OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize) { #if BSD UInt64 devBlockCount = 0; int devBlockSize = 0; +#if LINUX + struct stat stbuf; + + devBlockSize = 512; +#ifndef BLKGETSIZE +#define BLKGETSIZE _IO(0x12,96) +#endif +#ifndef BLKGETSIZE64 +#define BLKGETSIZE64 _IOR(0x12,114,size_t) +#endif + if (fstat(driveRefNum, &stbuf) < 0){ + printf("Error: %s\n", strerror(errno)); + return(-1); + } + + if (S_ISREG(stbuf.st_mode)) { + devBlockCount = stbuf.st_size / 512; + } + else if (S_ISBLK(stbuf.st_mode)) { + unsigned long size; + u_int64_t size64; + if (!ioctl(driveRefNum, BLKGETSIZE64, &size64)) + devBlockCount = size64 / 512; + else if (!ioctl(driveRefNum, BLKGETSIZE, &size)) + devBlockCount = size; + else{ + printf("Error: %s\n", strerror(errno)); + return(-1); + } + + } + else{ + printf("Device is not a block device"); + return(-1); + } +#elif BSD if (ioctl(driveRefNum, DKIOCGETBLOCKCOUNT, &devBlockCount) < 0) { printf("ioctl(DKIOCGETBLOCKCOUNT) for fd %d: %s\n", driveRefNum, strerror(errno)); return (-1); @@ -55,6 +92,7 @@ printf("ioctl(DKIOCGETBLOCKSIZE) for fd %d: %s\n", driveRefNum, strerror(errno)); return (-1); } +#endif /* BSD */ if (devBlockSize != 512) { *numBlocks = (devBlockCount * (UInt64)devBlockSize) / 512; Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SDevice.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SDevice.o differ Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SExtents.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SExtents.o differ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SKeyCompare.c diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SKeyCompare.c --- diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SKeyCompare.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SKeyCompare.c 2008-07-01 22:30:11.000000000 +0200 @@ -454,7 +454,9 @@ * The name portion of the key is compared using a 16-bit binary comparison. * This is called from the b-tree code. */ +#if !LINUX __private_extern__ +#endif SInt32 CompareAttributeKeys(const AttributeKey *searchKey, const AttributeKey *trialKey) { Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SKeyCompare.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SKeyCompare.o differ Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SRebuildCatalogBTree.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SRebuildCatalogBTree.o differ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SRepair.c diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SRepair.c --- diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SRepair.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SRepair.c 2008-07-01 22:30:11.000000000 +0200 @@ -1593,7 +1593,9 @@ static OSErr FixWrapperExtents( SGlobPtr GPtr, RepairOrderPtr p ) { +#if !LINUX #pragma unused (p) +#endif OSErr err; HFSMasterDirectoryBlock *mdb; Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SRepair.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SRepair.o differ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SRuntime.h diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SRuntime.h --- diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SRuntime.h 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SRuntime.h 2008-07-01 22:30:11.000000000 +0200 @@ -27,8 +27,11 @@ #define __SRUNTIME__ #if BSD - +#if LINUX +#include "missing.h" +#else #include <sys/types.h> +#endif #include <stdlib.h> #include <string.h> #include <stdio.h> @@ -91,10 +94,12 @@ typedef u_int32_t HFSCatalogNodeID; +#if !LINUX enum { false = 0, true = 1 }; +#endif /* OS error codes */ enum { Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SStubs.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SStubs.o differ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SUtils.c diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SUtils.c --- diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SUtils.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SUtils.c 2008-07-01 22:30:11.000000000 +0200 @@ -380,7 +380,8 @@ // GPtr->realVCB Real in-memory vcb //------------------------------------------------------------------------------ -#if !BSD +#if BSD +#if !LINUX OSErr GetVolumeFeatures( SGlobPtr GPtr ) { OSErr err; @@ -418,7 +419,7 @@ return( noErr ); } #endif - +#endif /*------------------------------------------------------------------------------- Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SUtils.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SUtils.o differ Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SVerify1.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SVerify1.o differ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SVerify2.c diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SVerify2.c --- diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SVerify2.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SVerify2.c 2008-07-01 22:30:11.000000000 +0200 @@ -32,7 +32,9 @@ */ #include <sys/ioctl.h> +#if !LINUX #include <sys/disk.h> +#endif #include "BTree.h" #include "BTreePrivate.h" @@ -1240,8 +1242,13 @@ * clump size for read-only media is irrelevant we skip the clump size * check to avoid non useful warnings. */ +#if LINUX + // FIXME + isWriteable = 1; +#else isWriteable = 0; ioctl( GPtr->DrvNum, DKIOCISWRITABLE, &isWriteable ); +#endif if ( isWriteable != 0 && volumeHeader->catalogFile.clumpSize != vcb->vcbCatalogFile->fcbClumpSize ) { PrintError(GPtr, E_InvalidClumpSize, 0); Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/SVerify2.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/SVerify2.o differ Files diskdev_cmds-332.14/fsck_hfs.tproj/dfalib/VolumeBitmapCheck.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/dfalib/VolumeBitmapCheck.o differ Files diskdev_cmds-332.14/fsck_hfs.tproj/fsck_hfs and diskdev_cmds-332.14-patched/fsck_hfs.tproj/fsck_hfs differ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/fsck_hfs.c diskdev_cmds-332.14-patched/fsck_hfs.tproj/fsck_hfs.c --- diskdev_cmds-332.14/fsck_hfs.tproj/fsck_hfs.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/fsck_hfs.c 2008-07-01 22:36:12.000000000 +0200 @@ -24,10 +24,14 @@ #include <sys/types.h> #include <sys/stat.h> #include <sys/param.h> +#if !LINUX #include <sys/ucred.h> +#endif #include <sys/mount.h> #include <sys/ioctl.h> +#if !LINUX #include <sys/disk.h> +#endif #include <hfs/hfs_mount.h> @@ -105,7 +109,7 @@ else progname = *argv; - while ((ch = getopt(argc, argv, "dfglm:npqruy")) != EOF) { + while ((ch = getopt(argc, argv, "dfglm:napqruy")) != EOF) { switch (ch) { case 'd': debug++; @@ -141,6 +145,7 @@ yflag = 0; break; + case 'a': case 'p': preen++; break; @@ -170,10 +175,12 @@ if (guiControl) debug = 0; /* debugging is for command line only */ - +#if LINUX +// FIXME +#else if (signal(SIGINT, SIG_IGN) != SIG_IGN) (void)signal(SIGINT, catch); - +#endif if (argc < 1) { (void) fprintf(stderr, "%s: missing special-device\n", progname); usage(); @@ -194,7 +201,9 @@ int chkLev, repLev, logLev; int blockDevice_fd, canWrite; char *unraw, *mntonname; +#if !LINUX struct statfs *fsinfo; +#endif int fs_fd=-1; // fd to the root-dir of the fs we're checking (only w/lfag == 1) flags = 0; @@ -203,7 +212,9 @@ canWrite = 0; unraw = NULL; mntonname = NULL; - +#if LINUX + // FIXME +#else if (lflag) { result = getmntinfo(&fsinfo, MNT_NOWAIT); @@ -233,7 +244,7 @@ } } } - +#endif if (debug && preen) pwarn("starting\n"); @@ -306,6 +317,9 @@ } } } else { +#if LINUX + // FIXME +#else struct statfs stfs_buf; /* * Check to see if root is mounted read-write. @@ -315,18 +329,24 @@ else flags = 0; ckfini(flags & MNT_RDONLY); +#endif } /* XXX free any allocated memory here */ if (hotroot && fsmodified) { +#if !LINUX struct hfs_mount_args args; +#endif /* * We modified the root. Do a mount update on * it, unless it is read-write, so we can continue. */ if (!preen) printf("\n***** FILE SYSTEM WAS MODIFIED *****\n"); +#if LINUX + // FIXME +#else if (flags & MNT_RDONLY) { bzero(&args, sizeof(args)); flags |= MNT_UPDATE | MNT_RELOAD; @@ -335,6 +355,7 @@ goto ExitThisRoutine; } } +#endif if (!preen) printf("\n***** REBOOT NOW *****\n"); sync(); @@ -380,11 +401,13 @@ printf("Can't stat %s: %s\n", dev, strerror(errno)); return (0); } +#if !LINUX if ((statb.st_mode & S_IFMT) != S_IFCHR) { pfatal("%s is not a character device", dev); if (reply("CONTINUE") == 0) return (0); } +#endif if ((fsreadfd = open(dev, O_RDONLY)) < 0) { printf("Can't open %s: %s\n", dev, strerror(errno)); return (0); @@ -407,10 +430,14 @@ printf("\n"); /* Get device block size to initialize cache */ +#if LINUX + devBlockSize = 512; +#else if (ioctl(fsreadfd, DKIOCGETBLOCKSIZE, &devBlockSize) < 0) { pfatal ("Can't get device block size\n"); return (0); } +#endif /* Initialize the cache */ if (CacheInit (&fscache, fsreadfd, fswritefd, devBlockSize, CACHE_IOSIZE, CACHE_BLOCKS, CACHE_HASHSIZE) != EOK) { @@ -431,11 +458,15 @@ static void getWriteAccess( char *dev, int *blockDevice_fdPtr, int *canWritePtr ) { +#if !LINUX int i; int myMountsCount; +#endif void * myPtr; char * myCharPtr; +#if !LINUX struct statfs * myBufPtr; +#endif void * myNamePtr; myPtr = NULL; @@ -456,18 +487,19 @@ *canWritePtr = 1; goto ExitThisRoutine; } - // get count of mounts then get the info for each +#if LINUX + // FIXME +#else myMountsCount = getfsstat( NULL, 0, MNT_NOWAIT ); if ( myMountsCount < 0 ) goto ExitThisRoutine; - myPtr = (void *) malloc( sizeof(struct statfs) * myMountsCount ); if ( myPtr == NULL ) goto ExitThisRoutine; myMountsCount = getfsstat( myPtr, - (sizeof(struct statfs) * myMountsCount), - MNT_NOWAIT ); + (sizeof(struct statfs) * myMountsCount), + MNT_NOWAIT ); if ( myMountsCount < 0 ) goto ExitThisRoutine; @@ -481,8 +513,8 @@ } myBufPtr++; } +#endif *canWritePtr = 1; // single user will get us here, f_mntfromname is not /dev/diskXXXX - ExitThisRoutine: if ( myPtr != NULL ) free( myPtr ); @@ -504,7 +536,7 @@ (void) fprintf(stderr, " l = live fsck (lock down and test-only)\n"); (void) fprintf(stderr, " m arg = octal mode used when creating lost+found directory \n"); (void) fprintf(stderr, " n = assume a no response \n"); - (void) fprintf(stderr, " p = just fix normal inconsistencies \n"); + (void) fprintf(stderr, " p, a = just fix normal inconsistencies \n"); (void) fprintf(stderr, " q = quick check returns clean, dirty, or failure \n"); (void) fprintf(stderr, " r = rebuild catalog btree \n"); (void) fprintf(stderr, " u = usage \n"); Files diskdev_cmds-332.14/fsck_hfs.tproj/fsck_hfs.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/fsck_hfs.o differ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/Makefile.lnx diskdev_cmds-332.14-patched/fsck_hfs.tproj/Makefile.lnx --- diskdev_cmds-332.14/fsck_hfs.tproj/Makefile.lnx 1970-01-01 01:00:00.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/Makefile.lnx 2008-07-01 22:30:11.000000000 +0200 @@ -0,0 +1,15 @@ +CFILES = fsck_hfs.c strings.c utilities.c cache.c +OFILES = $(CFILES:.c=.o) + +all: fsck_hfs + +fsck_hfs: $(OFILES) dfalib/libdfa.a + +dfalib/libdfa.a: FORCE + $(MAKE) -C dfalib -f Makefile.lnx libdfa.a + +clean: + $(RM) fsck_hfs $(OFILES) + $(MAKE) -C dfalib -f Makefile.lnx clean + +.PHONY : FORCE clean Files diskdev_cmds-332.14/fsck_hfs.tproj/strings.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/strings.o differ diff -druN diskdev_cmds-332.14/fsck_hfs.tproj/utilities.c diskdev_cmds-332.14-patched/fsck_hfs.tproj/utilities.c --- diskdev_cmds-332.14/fsck_hfs.tproj/utilities.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/fsck_hfs.tproj/utilities.c 2008-07-01 22:30:11.000000000 +0200 @@ -183,12 +183,14 @@ printf("Can't stat %s\n", raw); return (origname); } +#if !LINUX if ((stchar.st_mode & S_IFMT) == S_IFCHR) { return (raw); } else { printf("%s is not a character device\n", raw); return (origname); } +#endif } else if ((stblock.st_mode & S_IFMT) == S_IFCHR && !retried) { newname = unrawname(newname); retried++; @@ -214,7 +216,11 @@ *dp = 0; (void)strcpy(rawbuf, name); *dp = '/'; - (void)strcat(rawbuf, "/r"); +#if LINUX + (void)strcat(rawbuf, "/"); +#else + (void)strcat(rawbuf,"/r"); +#endif (void)strcat(rawbuf, &dp[1]); return (rawbuf); Files diskdev_cmds-332.14/fsck_hfs.tproj/utilities.o and diskdev_cmds-332.14-patched/fsck_hfs.tproj/utilities.o differ diff -druN diskdev_cmds-332.14/include/bitstring.h diskdev_cmds-332.14-patched/include/bitstring.h --- diskdev_cmds-332.14/include/bitstring.h 1970-01-01 01:00:00.000000000 +0100 +++ diskdev_cmds-332.14-patched/include/bitstring.h 2008-07-01 22:30:11.000000000 +0200 @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Paul Vixie. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)bitstring.h 8.1 (Berkeley) 7/19/93 + */ + +#ifndef _BITSTRING_H_ +#define _BITSTRING_H_ + +typedef unsigned char bitstr_t; + +/* internal macros */ + /* byte of the bitstring bit is in */ +#define _bit_byte(bit) \ + ((bit) >> 3) + + /* mask for the bit within its byte */ +#define _bit_mask(bit) \ + (1 << ((bit)&0x7)) + +/* external macros */ + /* bytes in a bitstring of nbits bits */ +#define bitstr_size(nbits) \ + ((((nbits) - 1) >> 3) + 1) + + /* allocate a bitstring */ +#define bit_alloc(nbits) \ + (bitstr_t *)calloc(1, \ + (unsigned int)bitstr_size(nbits) * sizeof(bitstr_t)) + + /* allocate a bitstring on the stack */ +#define bit_decl(name, nbits) \ + (name)[bitstr_size(nbits)] + + /* is bit N of bitstring name set? */ +#define bit_test(name, bit) \ + ((name)[_bit_byte(bit)] & _bit_mask(bit)) + + /* set bit N of bitstring name */ +#define bit_set(name, bit) \ + (name)[_bit_byte(bit)] |= _bit_mask(bit) + + /* clear bit N of bitstring name */ +#define bit_clear(name, bit) \ + (name)[_bit_byte(bit)] &= ~_bit_mask(bit) + + /* clear bits start ... stop in bitstring */ +#define bit_nclear(name, start, stop) { \ + register bitstr_t *_name = name; \ + register int _start = start, _stop = stop; \ + register int _startbyte = _bit_byte(_start); \ + register int _stopbyte = _bit_byte(_stop); \ + if (_startbyte == _stopbyte) { \ + _name[_startbyte] &= ((0xff >> (8 - (_start&0x7))) | \ + (0xff << ((_stop&0x7) + 1))); \ + } else { \ + _name[_startbyte] &= 0xff >> (8 - (_start&0x7)); \ + while (++_startbyte < _stopbyte) \ + _name[_startbyte] = 0; \ + _name[_stopbyte] &= 0xff << ((_stop&0x7) + 1); \ + } \ +} + + /* set bits start ... stop in bitstring */ +#define bit_nset(name, start, stop) { \ + register bitstr_t *_name = name; \ + register int _start = start, _stop = stop; \ + register int _startbyte = _bit_byte(_start); \ + register int _stopbyte = _bit_byte(_stop); \ + if (_startbyte == _stopbyte) { \ + _name[_startbyte] |= ((0xff << (_start&0x7)) & \ + (0xff >> (7 - (_stop&0x7)))); \ + } else { \ + _name[_startbyte] |= 0xff << ((_start)&0x7); \ + while (++_startbyte < _stopbyte) \ + _name[_startbyte] = 0xff; \ + _name[_stopbyte] |= 0xff >> (7 - (_stop&0x7)); \ + } \ +} + + /* find first bit clear in name */ +#define bit_ffc(name, nbits, value) { \ + register bitstr_t *_name = name; \ + register int _byte, _nbits = nbits; \ + register int _stopbyte = _bit_byte(_nbits), _value = -1; \ + for (_byte = 0; _byte <= _stopbyte; ++_byte) \ + if (_name[_byte] != 0xff) { \ + _value = _byte << 3; \ + for (_stopbyte = _name[_byte]; (_stopbyte&0x1); \ + ++_value, _stopbyte >>= 1); \ + break; \ + } \ + *(value) = _value; \ +} + + /* find first bit set in name */ +#define bit_ffs(name, nbits, value) { \ + register bitstr_t *_name = name; \ + register int _byte, _nbits = nbits; \ + register int _stopbyte = _bit_byte(_nbits), _value = -1; \ + for (_byte = 0; _byte <= _stopbyte; ++_byte) \ + if (_name[_byte]) { \ + _value = _byte << 3; \ + for (_stopbyte = _name[_byte]; !(_stopbyte&0x1); \ + ++_value, _stopbyte >>= 1); \ + break; \ + } \ + *(value) = _value; \ +} + +#endif /* !_BITSTRING_H_ */ diff -druN diskdev_cmds-332.14/include/hfs/hfs_format.h diskdev_cmds-332.14-patched/include/hfs/hfs_format.h --- diskdev_cmds-332.14/include/hfs/hfs_format.h 1970-01-01 01:00:00.000000000 +0100 +++ diskdev_cmds-332.14-patched/include/hfs/hfs_format.h 2008-07-01 22:30:11.000000000 +0200 @@ -0,0 +1,689 @@ +/* + * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#ifndef __HFS_FORMAT__ +#define __HFS_FORMAT__ + +#include "missing.h" + +#include <sys/appleapiopts.h> + +/* + * hfs_format.c + * + * This file describes the on-disk format for HFS and HFS Plus volumes. + * The HFS Plus volume format is desciibed in detail in Apple Technote 1150. + * + * http://developer.apple.com/technotes/tn/tn1150.html + * + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* some on-disk hfs structures have 68K alignment (misaligned) */ + +#define PACKED_S __attribute__((packed)) + +/* Signatures used to differentiate between HFS and HFS Plus volumes */ +enum { + kHFSSigWord = 0x4244, /* 'BD' in ASCII */ + kHFSPlusSigWord = 0x482B, /* 'H+' in ASCII */ + kHFSXSigWord = 0x4858, /* 'HX' in ASCII */ + + kHFSPlusVersion = 0x0004, /* 'H+' volumes are version 4 only */ + kHFSXVersion = 0x0005, /* 'HX' volumes start with version 5 */ + + kHFSPlusMountVersion = 0x31302E30, /* '10.0' for Mac OS X */ + kHFSJMountVersion = 0x4846534a, /* 'HFSJ' for journaled HFS+ on OS X */ + kFSKMountVersion = 0x46534b21 /* 'FSK!' for failed journal replay */ +}PACKED_S; + + +#ifdef __APPLE_API_PRIVATE +/* + * Mac OS X has a special directory for linked and unlinked files (HFS Plus only). + * This directory and its contents are never exported from the filesystem under + * Mac OS X. + * + * To make this folder name sort last, it has embedded null prefix. + * (0xC0, 0x80 in UTF-8) + */ +#define HFSPLUSMETADATAFOLDER "\xC0\x80\xC0\x80\xC0\x80\xC0\x80HFS+ Private Data" + +/* + * Files in the HFS Private Data folder have one of the following prefixes + * followed by a decimal number (no leading zeros). For indirect nodes this + * number is a 32 bit random number. For unlinked (deleted) files that are + * still open, the number is the file ID for that file. + * + * e.g. iNode7182000 and temp3296 + */ +#define HFS_INODE_PREFIX "iNode" +#define HFS_DELETE_PREFIX "temp" + +#endif /* __APPLE_API_PRIVATE */ + +/* + * Indirect link files (hard links) have the following type/creator. + */ +enum { + kHardLinkFileType = 0x686C6E6B, /* 'hlnk' */ + kHFSPlusCreator = 0x6866732B /* 'hfs+' */ +}PACKED_S; + + +#ifndef _HFSUNISTR255_DEFINED_ +#define _HFSUNISTR255_DEFINED_ +/* Unicode strings are used for HFS Plus file and folder names */ +struct HFSUniStr255 { + u_int16_t length; /* number of unicode characters */ + u_int16_t unicode[255]; /* unicode characters */ +} PACKED_S; +typedef struct HFSUniStr255 HFSUniStr255; +typedef const HFSUniStr255 *ConstHFSUniStr255Param; +#endif /* _HFSUNISTR255_DEFINED_ */ + +enum { + kHFSMaxVolumeNameChars = 27, + kHFSMaxFileNameChars = 31, + kHFSPlusMaxFileNameChars = 255 +}PACKED_S; + + +/* Extent overflow file data structures */ + +/* HFS Extent key */ +struct HFSExtentKey { + u_int8_t keyLength; /* length of key, excluding this field */ + u_int8_t forkType; /* 0 = data fork, FF = resource fork */ + u_int32_t fileID; /* file ID */ + u_int16_t startBlock; /* first file allocation block number in this extent */ +}PACKED_S; +typedef struct HFSExtentKey HFSExtentKey; + +/* HFS Plus Extent key */ +struct HFSPlusExtentKey { + u_int16_t keyLength; /* length of key, excluding this field */ + u_int8_t forkType; /* 0 = data fork, FF = resource fork */ + u_int8_t pad; /* make the other fields align on 32-bit boundary */ + u_int32_t fileID; /* file ID */ + u_int32_t startBlock; /* first file allocation block number in this extent */ +}PACKED_S; +typedef struct HFSPlusExtentKey HFSPlusExtentKey; + +/* Number of extent descriptors per extent record */ +enum { + kHFSExtentDensity = 3, + kHFSPlusExtentDensity = 8 +}PACKED_S; + +/* HFS extent descriptor */ +struct HFSExtentDescriptor { + u_int16_t startBlock; /* first allocation block */ + u_int16_t blockCount; /* number of allocation blocks */ +}PACKED_S; +typedef struct HFSExtentDescriptor HFSExtentDescriptor; + +/* HFS Plus extent descriptor */ +struct HFSPlusExtentDescriptor { + u_int32_t startBlock; /* first allocation block */ + u_int32_t blockCount; /* number of allocation blocks */ +}PACKED_S; +typedef struct HFSPlusExtentDescriptor HFSPlusExtentDescriptor; + +/* HFS extent record */ +typedef HFSExtentDescriptor HFSExtentRecord[3]; + +/* HFS Plus extent record */ +typedef HFSPlusExtentDescriptor HFSPlusExtentRecord[8]; + + +/* Finder information */ +struct FndrFileInfo { + u_int32_t fdType; /* file type */ + u_int32_t fdCreator; /* file creator */ + u_int16_t fdFlags; /* Finder flags */ + struct { + int16_t v; /* file's location */ + int16_t h; + } PACKED_S fdLocation; + int16_t opaque; +}PACKED_S; +typedef struct FndrFileInfo FndrFileInfo; + +struct FndrDirInfo { + struct { /* folder's window rectangle */ + int16_t top; + int16_t left; + int16_t bottom; + int16_t right; + }PACKED_S frRect; + unsigned short frFlags; /* Finder flags */ + struct { + u_int16_t v; /* folder's location */ + u_int16_t h; + }PACKED_S frLocation; + int16_t opaque; +}PACKED_S; +typedef struct FndrDirInfo FndrDirInfo; + +struct FndrOpaqueInfo { + int8_t opaque[16]; +}PACKED_S; +typedef struct FndrOpaqueInfo FndrOpaqueInfo; + + +/* HFS Plus Fork data info - 80 bytes */ +struct HFSPlusForkData { + u_int64_t logicalSize; /* fork's logical size in bytes */ + u_int32_t clumpSize; /* fork's clump size in bytes */ + u_int32_t totalBlocks; /* total blocks used by this fork */ + HFSPlusExtentRecord extents; /* initial set of extents */ +}PACKED_S; +typedef struct HFSPlusForkData HFSPlusForkData; + + +/* Mac OS X has 16 bytes worth of "BSD" info. + * + * Note: Mac OS 9 implementations and applications + * should preserve, but not change, this information. + */ +struct HFSPlusBSDInfo { + u_int32_t ownerID; /* user or group ID of file/folder owner */ + u_int32_t groupID; /* additional user of group ID */ + u_int8_t adminFlags; /* super-user changeable flags */ + u_int8_t ownerFlags; /* owner changeable flags */ + u_int16_t fileMode; /* file type and permission bits */ + union { + u_int32_t iNodeNum; /* indirect node number (hard links only) */ + u_int32_t linkCount; /* links that refer to this indirect node */ + u_int32_t rawDevice; /* special file device (FBLK and FCHR only) */ + }PACKED_S special; +}PACKED_S; +typedef struct HFSPlusBSDInfo HFSPlusBSDInfo; + + +/* Catalog file data structures */ + +enum { + kHFSRootParentID = 1, /* Parent ID of the root folder */ + kHFSRootFolderID = 2, /* Folder ID of the root folder */ + kHFSExtentsFileID = 3, /* File ID of the extents file */ + kHFSCatalogFileID = 4, /* File ID of the catalog file */ + kHFSBadBlockFileID = 5, /* File ID of the bad allocation block file */ + kHFSAllocationFileID = 6, /* File ID of the allocation file (HFS Plus only) */ + kHFSStartupFileID = 7, /* File ID of the startup file (HFS Plus only) */ + kHFSAttributesFileID = 8, /* File ID of the attribute file (HFS Plus only) */ + kHFSRepairCatalogFileID = 14, /* Used when rebuilding Catalog B-tree */ + kHFSBogusExtentFileID = 15, /* Used for exchanging extents in extents file */ + kHFSFirstUserCatalogNodeID = 16 +}PACKED_S; + +/* HFS catalog key */ +struct HFSCatalogKey { + u_int8_t keyLength; /* key length (in bytes) */ + u_int8_t reserved; /* reserved (set to zero) */ + u_int32_t parentID; /* parent folder ID */ + u_int8_t nodeName[kHFSMaxFileNameChars + 1]; /* catalog node name */ +}PACKED_S; +typedef struct HFSCatalogKey HFSCatalogKey; + +/* HFS Plus catalog key */ +struct HFSPlusCatalogKey { + u_int16_t keyLength; /* key length (in bytes) */ + u_int32_t parentID; /* parent folder ID */ + HFSUniStr255 nodeName; /* catalog node name */ +}PACKED_S; +typedef struct HFSPlusCatalogKey HFSPlusCatalogKey; + +/* Catalog record types */ +enum { + /* HFS Catalog Records */ + kHFSFolderRecord = 0x0100, /* Folder record */ + kHFSFileRecord = 0x0200, /* File record */ + kHFSFolderThreadRecord = 0x0300, /* Folder thread record */ + kHFSFileThreadRecord = 0x0400, /* File thread record */ + + /* HFS Plus Catalog Records */ + kHFSPlusFolderRecord = 1, /* Folder record */ + kHFSPlusFileRecord = 2, /* File record */ + kHFSPlusFolderThreadRecord = 3, /* Folder thread record */ + kHFSPlusFileThreadRecord = 4 /* File thread record */ +}PACKED_S; + + +/* Catalog file record flags */ +enum { + kHFSFileLockedBit = 0x0000, /* file is locked and cannot be written to */ + kHFSFileLockedMask = 0x0001, + + kHFSThreadExistsBit = 0x0001, /* a file thread record exists for this file */ + kHFSThreadExistsMask = 0x0002, + + kHFSHasAttributesBit = 0x0002, /* object has extended attributes */ + kHFSHasAttributesMask = 0x0004, + + kHFSHasSecurityBit = 0x0003, /* object has security data (ACLs) */ + kHFSHasSecurityMask = 0x0008 +}PACKED_S; + + +/* HFS catalog folder record - 70 bytes */ +struct HFSCatalogFolder { + int16_t recordType; /* == kHFSFolderRecord */ + u_int16_t flags; /* folder flags */ + u_int16_t valence; /* folder valence */ + u_int32_t folderID; /* folder ID */ + u_int32_t createDate; /* date and time of creation */ + u_int32_t modifyDate; /* date and time of last modification */ + u_int32_t backupDate; /* date and time of last backup */ + FndrDirInfo userInfo; /* Finder information */ + FndrOpaqueInfo finderInfo; /* additional Finder information */ + u_int32_t reserved[4]; /* reserved - initialized as zero */ +}PACKED_S; +typedef struct HFSCatalogFolder HFSCatalogFolder; + +/* HFS Plus catalog folder record - 88 bytes */ +struct HFSPlusCatalogFolder { + int16_t recordType; /* == kHFSPlusFolderRecord */ + u_int16_t flags; /* file flags */ + u_int32_t valence; /* folder's valence (limited to 2^16 in Mac OS) */ + u_int32_t folderID; /* folder ID */ + u_int32_t createDate; /* date and time of creation */ + u_int32_t contentModDate; /* date and time of last content modification */ + u_int32_t attributeModDate; /* date and time of last attribute modification */ + u_int32_t accessDate; /* date and time of last access (MacOS X only) */ + u_int32_t backupDate; /* date and time of last backup */ + HFSPlusBSDInfo bsdInfo; /* permissions (for MacOS X) */ + FndrDirInfo userInfo; /* Finder information */ + FndrOpaqueInfo finderInfo; /* additional Finder information */ + u_int32_t textEncoding; /* hint for name conversions */ + u_int32_t attrBlocks; /* cached count of attribute data blocks */ +}PACKED_S; +typedef struct HFSPlusCatalogFolder HFSPlusCatalogFolder; + +/* HFS catalog file record - 102 bytes */ +struct HFSCatalogFile { + int16_t recordType; /* == kHFSFileRecord */ + u_int8_t flags; /* file flags */ + int8_t fileType; /* file type (unused ?) */ + FndrFileInfo userInfo; /* Finder information */ + u_int32_t fileID; /* file ID */ + u_int16_t dataStartBlock; /* not used - set to zero */ + int32_t dataLogicalSize; /* logical EOF of data fork */ + int32_t dataPhysicalSize; /* physical EOF of data fork */ + u_int16_t rsrcStartBlock; /* not used - set to zero */ + int32_t rsrcLogicalSize; /* logical EOF of resource fork */ + int32_t rsrcPhysicalSize; /* physical EOF of resource fork */ + u_int32_t createDate; /* date and time of creation */ + u_int32_t modifyDate; /* date and time of last modification */ + u_int32_t backupDate; /* date and time of last backup */ + FndrOpaqueInfo finderInfo; /* additional Finder information */ + u_int16_t clumpSize; /* file clump size (not used) */ + HFSExtentRecord dataExtents; /* first data fork extent record */ + HFSExtentRecord rsrcExtents; /* first resource fork extent record */ + u_int32_t reserved; /* reserved - initialized as zero */ +}PACKED_S; +typedef struct HFSCatalogFile HFSCatalogFile; + +/* HFS Plus catalog file record - 248 bytes */ +struct HFSPlusCatalogFile { + int16_t recordType; /* == kHFSPlusFileRecord */ + u_int16_t flags; /* file flags */ + u_int32_t reserved1; /* reserved - initialized as zero */ + u_int32_t fileID; /* file ID */ + u_int32_t createDate; /* date and time of creation */ + u_int32_t contentModDate; /* date and time of last content modification */ + u_int32_t attributeModDate; /* date and time of last attribute modification */ + u_int32_t accessDate; /* date and time of last access (MacOS X only) */ + u_int32_t backupDate; /* date and time of last backup */ + HFSPlusBSDInfo bsdInfo; /* permissions (for MacOS X) */ + FndrFileInfo userInfo; /* Finder information */ + FndrOpaqueInfo finderInfo; /* additional Finder information */ + u_int32_t textEncoding; /* hint for name conversions */ + u_int32_t attrBlocks; /* cached count of attribute data blocks */ + + /* Note: these start on double long (64 bit) boundry */ + HFSPlusForkData dataFork; /* size and block data for data fork */ + HFSPlusForkData resourceFork; /* size and block data for resource fork */ +}PACKED_S; +typedef struct HFSPlusCatalogFile HFSPlusCatalogFile; + +/* HFS catalog thread record - 46 bytes */ +struct HFSCatalogThread { + int16_t recordType; /* == kHFSFolderThreadRecord or kHFSFileThreadRecord */ + int32_t reserved[2]; /* reserved - initialized as zero */ + u_int32_t parentID; /* parent ID for this catalog node */ + u_int8_t nodeName[kHFSMaxFileNameChars + 1]; /* name of this catalog node */ +}PACKED_S; +typedef struct HFSCatalogThread HFSCatalogThread; + +/* HFS Plus catalog thread record -- 264 bytes */ +struct HFSPlusCatalogThread { + int16_t recordType; /* == kHFSPlusFolderThreadRecord or kHFSPlusFileThreadRecord */ + int16_t reserved; /* reserved - initialized as zero */ + u_int32_t parentID; /* parent ID for this catalog node */ + HFSUniStr255 nodeName; /* name of this catalog node (variable length) */ +}PACKED_S; +typedef struct HFSPlusCatalogThread HFSPlusCatalogThread; + +#ifdef __APPLE_API_UNSTABLE +/* + These are the types of records in the attribute B-tree. The values were + chosen so that they wouldn't conflict with the catalog record types. +*/ +enum { + kHFSPlusAttrInlineData = 0x10, /* if size < kAttrOverflowSize */ + kHFSPlusAttrForkData = 0x20, /* if size >= kAttrOverflowSize */ + kHFSPlusAttrExtents = 0x30 /* overflow extents for large attributes */ +}PACKED_S; + + +/* + HFSPlusAttrForkData + For larger attributes, whose value is stored in allocation blocks. + If the attribute has more than 8 extents, there will be additonal + records (of type HFSPlusAttrExtents) for this attribute. +*/ +struct HFSPlusAttrForkData { + u_int32_t recordType; /* == kHFSPlusAttrForkData*/ + u_int32_t reserved; + HFSPlusForkData theFork; /* size and first extents of value*/ +}PACKED_S; +typedef struct HFSPlusAttrForkData HFSPlusAttrForkData; + +/* + HFSPlusAttrExtents + This record contains information about overflow extents for large, + fragmented attributes. +*/ +struct HFSPlusAttrExtents { + u_int32_t recordType; /* == kHFSPlusAttrExtents*/ + u_int32_t reserved; + HFSPlusExtentRecord extents; /* additional extents*/ +}PACKED_S; +typedef struct HFSPlusAttrExtents HFSPlusAttrExtents; + +/* + * Atrributes B-tree Data Record + * + * For small attributes, whose entire value is stored + * within a single B-tree record. + */ +struct HFSPlusAttrData { + u_int32_t recordType; /* == kHFSPlusAttrInlineData */ + u_int32_t reserved[2]; + u_int32_t attrSize; /* size of attribute data in bytes */ + u_int8_t attrData[2]; /* variable length */ +}PACKED_S; +typedef struct HFSPlusAttrData HFSPlusAttrData; + + +/* HFSPlusAttrInlineData is obsolete use HFSPlusAttrData instead */ +struct HFSPlusAttrInlineData { + u_int32_t recordType; + u_int32_t reserved; + u_int32_t logicalSize; + u_int8_t userData[2]; +}PACKED_S; +typedef struct HFSPlusAttrInlineData HFSPlusAttrInlineData; + + +/* A generic Attribute Record*/ +union HFSPlusAttrRecord { + u_int32_t recordType; + HFSPlusAttrInlineData inlineData; /* NOT USED */ + HFSPlusAttrData attrData; + HFSPlusAttrForkData forkData; + HFSPlusAttrExtents overflowExtents; +}PACKED_S; +typedef union HFSPlusAttrRecord HFSPlusAttrRecord; + +/* Attribute key */ +enum { kHFSMaxAttrNameLen = 127 }; +struct HFSPlusAttrKey { + u_int16_t keyLength; /* key length (in bytes) */ + u_int16_t pad; /* set to zero */ + u_int32_t fileID; /* file associated with attribute */ + u_int32_t startBlock; /* first attribue allocation block number for extents */ + u_int16_t attrNameLen; /* number of unicode characters */ + u_int16_t attrName[127]; /* attribute name (Unicode) */ +}PACKED_S; +typedef struct HFSPlusAttrKey HFSPlusAttrKey; + +#define kHFSPlusAttrKeyMaximumLength (sizeof(HFSPlusAttrKey) - sizeof(u_int16_t)) +#define kHFSPlusAttrKeyMinimumLength (kHFSPlusAttrKeyMaximumLength - (127 * sizeof(u_int16_t))) + +#endif /* __APPLE_API_UNSTABLE */ + + +/* Key and node lengths */ +enum { + kHFSPlusExtentKeyMaximumLength = sizeof(HFSPlusExtentKey) - sizeof(u_int16_t), + kHFSExtentKeyMaximumLength = sizeof(HFSExtentKey) - sizeof(u_int8_t), + kHFSPlusCatalogKeyMaximumLength = sizeof(HFSPlusCatalogKey) - sizeof(u_int16_t), + kHFSPlusCatalogKeyMinimumLength = kHFSPlusCatalogKeyMaximumLength - sizeof(HFSUniStr255) + sizeof(u_int16_t), + kHFSCatalogKeyMaximumLength = sizeof(HFSCatalogKey) - sizeof(u_int8_t), + kHFSCatalogKeyMinimumLength = kHFSCatalogKeyMaximumLength - (kHFSMaxFileNameChars + 1) + sizeof(u_int8_t), + kHFSPlusCatalogMinNodeSize = 4096, + kHFSPlusExtentMinNodeSize = 512, + kHFSPlusAttrMinNodeSize = 4096 +}PACKED_S; + +/* HFS and HFS Plus volume attribute bits */ +enum { + /* Bits 0-6 are reserved (always cleared by MountVol call) */ + kHFSVolumeHardwareLockBit = 7, /* volume is locked by hardware */ + kHFSVolumeUnmountedBit = 8, /* volume was successfully unmounted */ + kHFSVolumeSparedBlocksBit = 9, /* volume has bad blocks spared */ + kHFSVolumeNoCacheRequiredBit = 10, /* don't cache volume blocks (i.e. RAM or ROM disk) */ + kHFSBootVolumeInconsistentBit = 11, /* boot volume is inconsistent (System 7.6 and later) */ + kHFSCatalogNodeIDsReusedBit = 12, + kHFSVolumeJournaledBit = 13, /* this volume has a journal on it */ + kHFSVolumeInconsistentBit = 14, /* serious inconsistencies detected at runtime */ + kHFSVolumeSoftwareLockBit = 15, /* volume is locked by software */ + + kHFSVolumeHardwareLockMask = 1 << kHFSVolumeHardwareLockBit, + kHFSVolumeUnmountedMask = 1 << kHFSVolumeUnmountedBit, + kHFSVolumeSparedBlocksMask = 1 << kHFSVolumeSparedBlocksBit, + kHFSVolumeNoCacheRequiredMask = 1 << kHFSVolumeNoCacheRequiredBit, + kHFSBootVolumeInconsistentMask = 1 << kHFSBootVolumeInconsistentBit, + kHFSCatalogNodeIDsReusedMask = 1 << kHFSCatalogNodeIDsReusedBit, + kHFSVolumeJournaledMask = 1 << kHFSVolumeJournaledBit, + kHFSVolumeInconsistentMask = 1 << kHFSVolumeInconsistentBit, + kHFSVolumeSoftwareLockMask = 1 << kHFSVolumeSoftwareLockBit, + kHFSMDBAttributesMask = 0x8380 +}PACKED_S; + + +/* HFS Master Directory Block - 162 bytes */ +/* Stored at sector #2 (3rd sector) and second-to-last sector. */ +struct HFSMasterDirectoryBlock { + u_int16_t drSigWord; /* == kHFSSigWord */ + u_int32_t drCrDate; /* date and time of volume creation */ + u_int32_t drLsMod; /* date and time of last modification */ + u_int16_t drAtrb; /* volume attributes */ + u_int16_t drNmFls; /* number of files in root folder */ + u_int16_t drVBMSt; /* first block of volume bitmap */ + u_int16_t drAllocPtr; /* start of next allocation search */ + u_int16_t drNmAlBlks; /* number of allocation blocks in volume */ + u_int32_t drAlBlkSiz; /* size (in bytes) of allocation blocks */ + u_int32_t drClpSiz; /* default clump size */ + u_int16_t drAlBlSt; /* first allocation block in volume */ + u_int32_t drNxtCNID; /* next unused catalog node ID */ + u_int16_t drFreeBks; /* number of unused allocation blocks */ + u_int8_t drVN[kHFSMaxVolumeNameChars + 1]; /* volume name */ + u_int32_t drVolBkUp; /* date and time of last backup */ + u_int16_t drVSeqNum; /* volume backup sequence number */ + u_int32_t drWrCnt; /* volume write count */ + u_int32_t drXTClpSiz; /* clump size for extents overflow file */ + u_int32_t drCTClpSiz; /* clump size for catalog file */ + u_int16_t drNmRtDirs; /* number of directories in root folder */ + u_int32_t drFilCnt; /* number of files in volume */ + u_int32_t drDirCnt; /* number of directories in volume */ + u_int32_t drFndrInfo[8]; /* information used by the Finder */ + u_int16_t drEmbedSigWord; /* embedded volume signature (formerly drVCSize) */ + HFSExtentDescriptor drEmbedExtent; /* embedded volume location and size (formerly drVBMCSize and drCtlCSize) */ + u_int32_t drXTFlSize; /* size of extents overflow file */ + HFSExtentRecord drXTExtRec; /* extent record for extents overflow file */ + u_int32_t drCTFlSize; /* size of catalog file */ + HFSExtentRecord drCTExtRec; /* extent record for catalog file */ +}PACKED_S; +typedef struct HFSMasterDirectoryBlock HFSMasterDirectoryBlock; + + +#ifdef __APPLE_API_UNSTABLE +#define SET_HFS_TEXT_ENCODING(hint) \ + (0x656e6300 | ((hint) & 0xff)) +#define GET_HFS_TEXT_ENCODING(hint) \ + (((hint) & 0xffffff00) == 0x656e6300 ? (hint) & 0x000000ff : 0xffffffffU) +#endif /* __APPLE_API_UNSTABLE */ + + +/* HFS Plus Volume Header - 512 bytes */ +/* Stored at sector #2 (3rd sector) and second-to-last sector. */ +struct HFSPlusVolumeHeader { + u_int16_t signature; /* == kHFSPlusSigWord */ + u_int16_t version; /* == kHFSPlusVersion */ + u_int32_t attributes; /* volume attributes */ + u_int32_t lastMountedVersion; /* implementation version which last mounted volume */ + u_int32_t journalInfoBlock; /* block addr of journal info (if volume is journaled, zero otherwise) */ + + u_int32_t createDate; /* date and time of volume creation */ + u_int32_t modifyDate; /* date and time of last modification */ + u_int32_t backupDate; /* date and time of last backup */ + u_int32_t checkedDate; /* date and time of last disk check */ + + u_int32_t fileCount; /* number of files in volume */ + u_int32_t folderCount; /* number of directories in volume */ + + u_int32_t blockSize; /* size (in bytes) of allocation blocks */ + u_int32_t totalBlocks; /* number of allocation blocks in volume (includes this header and VBM*/ + u_int32_t freeBlocks; /* number of unused allocation blocks */ + + u_int32_t nextAllocation; /* start of next allocation search */ + u_int32_t rsrcClumpSize; /* default resource fork clump size */ + u_int32_t dataClumpSize; /* default data fork clump size */ + u_int32_t nextCatalogID; /* next unused catalog node ID */ + + u_int32_t writeCount; /* volume write count */ + u_int64_t encodingsBitmap; /* which encodings have been use on this volume */ + + u_int8_t finderInfo[32]; /* information used by the Finder */ + + HFSPlusForkData allocationFile; /* allocation bitmap file */ + HFSPlusForkData extentsFile; /* extents B-tree file */ + HFSPlusForkData catalogFile; /* catalog B-tree file */ + HFSPlusForkData attributesFile; /* extended attributes B-tree file */ + HFSPlusForkData startupFile; /* boot file (secondary loader) */ +}PACKED_S; +typedef struct HFSPlusVolumeHeader HFSPlusVolumeHeader; + + +/* B-tree structures */ + +enum BTreeKeyLimits{ + kMaxKeyLength = 520 +}PACKED_S; + +union BTreeKey{ + u_int8_t length8; + u_int16_t length16; + u_int8_t rawData [kMaxKeyLength+2]; +}PACKED_S; +typedef union BTreeKey BTreeKey; + +/* BTNodeDescriptor -- Every B-tree node starts with these fields. */ +struct BTNodeDescriptor { + u_int32_t fLink; /* next node at this level*/ + u_int32_t bLink; /* previous node at this level*/ + int8_t kind; /* kind of node (leaf, index, header, map)*/ + u_int8_t height; /* zero for header, map; child is one more than parent*/ + u_int16_t numRecords; /* number of records in this node*/ + u_int16_t reserved; /* reserved - initialized as zero */ +}PACKED_S; +typedef struct BTNodeDescriptor BTNodeDescriptor; + +/* Constants for BTNodeDescriptor kind */ +enum { + kBTLeafNode = -1, + kBTIndexNode = 0, + kBTHeaderNode = 1, + kBTMapNode = 2 +}PACKED_S; + +/* BTHeaderRec -- The first record of a B-tree header node */ +struct BTHeaderRec { + u_int16_t treeDepth; /* maximum height (usually leaf nodes) */ + u_int32_t rootNode; /* node number of root node */ + u_int32_t leafRecords; /* number of leaf records in all leaf nodes */ + u_int32_t firstLeafNode; /* node number of first leaf node */ + u_int32_t lastLeafNode; /* node number of last leaf node */ + u_int16_t nodeSize; /* size of a node, in bytes */ + u_int16_t maxKeyLength; /* reserved */ + u_int32_t totalNodes; /* total number of nodes in tree */ + u_int32_t freeNodes; /* number of unused (free) nodes in tree */ + u_int16_t reserved1; /* unused */ + u_int32_t clumpSize; /* reserved */ + u_int8_t btreeType; /* reserved */ + u_int8_t keyCompareType; /* Key string Comparison Type */ + u_int32_t attributes; /* persistent attributes about the tree */ + u_int32_t reserved3[16]; /* reserved */ +}PACKED_S; +typedef struct BTHeaderRec BTHeaderRec; + +/* Constants for BTHeaderRec attributes */ +enum { + kBTBadCloseMask = 0x00000001, /* reserved */ + kBTBigKeysMask = 0x00000002, /* key length field is 16 bits */ + kBTVariableIndexKeysMask = 0x00000004 /* keys in index nodes are variable length */ +}PACKED_S; + + +/* Catalog Key Name Comparison Type */ +enum { + kHFSCaseFolding = 0xCF, /* case folding (case-insensitive) */ + kHFSBinaryCompare = 0xBC /* binary compare (case-sensitive) */ +}PACKED_S; + +/* JournalInfoBlock - Structure that describes where our journal lives */ +struct JournalInfoBlock { + u_int32_t flags; + u_int32_t device_signature[8]; // signature used to locate our device. + u_int64_t offset; // byte offset to the journal on the device + u_int64_t size; // size in bytes of the journal + u_int32_t reserved[32]; +}PACKED_S; +typedef struct JournalInfoBlock JournalInfoBlock; + +enum { + kJIJournalInFSMask = 0x00000001, + kJIJournalOnOtherDeviceMask = 0x00000002, + kJIJournalNeedInitMask = 0x00000004 +}PACKED_S; + +#ifdef __cplusplus +} +#endif + +#endif /* __HFS_FORMAT__ */ diff -druN diskdev_cmds-332.14/include/hfs/hfs_mount.h diskdev_cmds-332.14-patched/include/hfs/hfs_mount.h --- diskdev_cmds-332.14/include/hfs/hfs_mount.h 1970-01-01 01:00:00.000000000 +0100 +++ diskdev_cmds-332.14-patched/include/hfs/hfs_mount.h 2008-07-01 22:30:11.000000000 +0200 @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1997-2002 Apple Computer, Inc. All Rights Reserved + * + */ + +#ifndef _HFS_MOUNT_H_ +#define _HFS_MOUNT_H_ + +#include <sys/appleapiopts.h> + +#include <sys/mount.h> +#include <sys/time.h> + +/* + * Arguments to mount HFS-based filesystems + */ + +#define OVERRIDE_UNKNOWN_PERMISSIONS 0 + +#define UNKNOWNUID ((uid_t)99) +#define UNKNOWNGID ((gid_t)99) +#define UNKNOWNPERMISSIONS (S_IRWXU | S_IROTH | S_IXOTH) /* 705 */ + +#ifdef __APPLE_API_UNSTABLE +struct hfs_mount_args { +#ifndef KERNEL + char *fspec; /* block special device to mount */ +#endif + uid_t hfs_uid; /* uid that owns hfs files (standard HFS only) */ + gid_t hfs_gid; /* gid that owns hfs files (standard HFS only) */ + mode_t hfs_mask; /* mask to be applied for hfs perms (standard HFS only) */ + u_int32_t hfs_encoding; /* encoding for this volume (standard HFS only) */ + struct timezone hfs_timezone; /* user time zone info (standard HFS only) */ + int flags; /* mounting flags, see below */ + int journal_tbuffer_size; /* size in bytes of the journal transaction buffer */ + int journal_flags; /* flags to pass to journal_open/create */ + int journal_disable; /* don't use journaling (potentially dangerous) */ +}; + +#define HFSFSMNT_NOXONFILES 0x1 /* disable execute permissions for files */ +#define HFSFSMNT_WRAPPER 0x2 /* mount HFS wrapper (if it exists) */ +#define HFSFSMNT_EXTENDED_ARGS 0x4 /* indicates new fields after "flags" are valid */ + +/* + * Sysctl values for HFS + */ +#define HFS_ENCODINGBIAS 1 /* encoding matching CJK bias */ +#define HFS_EXTEND_FS 2 +#define HFS_ENCODINGHINT 3 /* guess encoding for string */ +#define HFS_ENABLE_JOURNALING 0x082969 +#define HFS_DISABLE_JOURNALING 0x031272 +#define HFS_GET_JOURNAL_INFO 0x6a6e6c69 +#define HFS_SET_PKG_EXTENSIONS 0x121031 + +#endif /* __APPLE_API_UNSTABLE */ + +#endif /* ! _HFS_MOUNT_H_ */ diff -druN diskdev_cmds-332.14/include/missing.h diskdev_cmds-332.14-patched/include/missing.h --- diskdev_cmds-332.14/include/missing.h 1970-01-01 01:00:00.000000000 +0100 +++ diskdev_cmds-332.14-patched/include/missing.h 2008-07-01 22:30:11.000000000 +0200 @@ -0,0 +1,113 @@ +#ifndef _MISSING_H_ +#define _MISSING_H_ + +#include <endian.h> +#include <byteswap.h> +#include <errno.h> +#include <stdint.h> + +#define MAXBSIZE (256 * 4096) + +#ifndef true +#define true 1 +#endif +#ifndef false +#define false 0 +#endif + +/* Mac types */ + +/* 8 Bit */ +#ifndef UInt8 +#define UInt8 uint8_t +#endif +#ifndef u_int8_t +#define u_int8_t UInt8 +#endif +#ifndef SInt8 +#define SInt8 int8_t +#endif + +/* 16 Bit */ +#ifndef UInt16 +#define UInt16 uint16_t +#endif +#ifndef u_int16_t +#define u_int16_t UInt16 +#endif +#ifndef SInt16 +#define SInt16 int16_t +#endif + +/* 32 Bit */ +#ifndef UInt32 +#define UInt32 uint32_t +#endif +#ifndef u_int32_t +#define u_int32_t UInt32 +#endif +#ifndef SInt32 +#define SInt32 int32_t +#endif + +/* 64 Bit */ +#ifndef UInt64 +#define UInt64 uint64_t +#endif +#ifndef u_int64_t +#define u_int64_t UInt64 +#endif +#ifndef SInt64 +#define SInt64 int64_t +#endif + +#define UniChar u_int16_t +#define Boolean u_int8_t + +#define UF_NODUMP 0x00000001 + +/* syslimits.h */ +#define NAME_MAX 255 + +/* Byteswap stuff */ +#define NXSwapHostLongToBig(x) cpu_to_be64(x) +#define NXSwapBigShortToHost(x) be16_to_cpu(x) +#define OSSwapBigToHostInt16(x) be16_to_cpu(x) +#define NXSwapBigLongToHost(x) be32_to_cpu(x) +#define OSSwapBigToHostInt32(x) be32_to_cpu(x) +#define NXSwapBigLongLongToHost(x) be64_to_cpu(x) +#define OSSwapBigToHostInt64(x) be64_to_cpu(x) + +#if __BYTE_ORDER == __LITTLE_ENDIAN +/* Big Endian Swaps */ +#ifndef be16_to_cpu +#define be16_to_cpu(x) bswap_16(x) +#endif +#ifndef be32_to_cpu +#define be32_to_cpu(x) bswap_32(x) +#endif +#ifndef be64_to_cpu +#define be64_to_cpu(x) bswap_64(x) +#endif +#ifndef cpu_to_be64 +#define cpu_to_be64(x) bswap_64(x) +#endif +#elif __BYTE_ORDER == __BIG_ENDIAN +/* Big endian doesn't swap */ +#ifndef be16_to_cpu +#define be16_to_cpu(x) (x) +#endif +#ifndef be32_to_cpu +#define be32_to_cpu(x) (x) +#endif +#ifndef be64_to_cpu +#define be64_to_cpu(x) (x) +#endif +#ifndef cpu_to_be64 +#define cpu_to_be64(x) (x) +#endif +#endif + +#define KAUTH_FILESEC_XATTR "com.apple.system.Security" + +#endif diff -druN diskdev_cmds-332.14/include/sys/appleapiopts.h diskdev_cmds-332.14-patched/include/sys/appleapiopts.h --- diskdev_cmds-332.14/include/sys/appleapiopts.h 1970-01-01 01:00:00.000000000 +0100 +++ diskdev_cmds-332.14-patched/include/sys/appleapiopts.h 2008-07-01 22:30:11.000000000 +0200 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef __SYS_APPLEAPIOPTS_H__ +#define __SYS_APPLEAPIOPTS_H__ + + +#ifndef __APPLE_API_STANDARD +#define __APPLE_API_STANDARD +#endif /* __APPLE_API_STANDARD */ + +#ifndef __APPLE_API_STABLE +#define __APPLE_API_STABLE +#endif /* __APPLE_API_STABLE */ + +#ifndef __APPLE_API_STRICT_CONFORMANCE + +#ifndef __APPLE_API_EVOLVING +#define __APPLE_API_EVOLVING +#endif /* __APPLE_API_EVOLVING */ + +#ifndef __APPLE_API_UNSTABLE +#define __APPLE_API_UNSTABLE +#endif /* __APPLE_API_UNSTABLE */ + +#ifndef __APPLE_API_PRIVATE +#define __APPLE_API_PRIVATE +#endif /* __APPLE_API_PRIVATE */ + +#ifndef __APPLE_API_OBSOLETE +#define __APPLE_API_OBSOLETE +#endif /* __APPLE_API_OBSOLETE */ + +#endif /* __APPLE_API_STRICT_CONFORMANCE */ + +#endif /* __SYS_APPLEAPIOPTS_H__ */ + diff -druN diskdev_cmds-332.14/Makefile.lnx diskdev_cmds-332.14-patched/Makefile.lnx --- diskdev_cmds-332.14/Makefile.lnx 1970-01-01 01:00:00.000000000 +0100 +++ diskdev_cmds-332.14-patched/Makefile.lnx 2008-07-01 22:30:11.000000000 +0200 @@ -0,0 +1,8 @@ +CC := gcc +CFLAGS := -g3 -Wall -I$(PWD)/include -DDEBUG_BUILD=0 -D_FILE_OFFSET_BITS=64 -D LINUX=1 -D BSD=1 +SUBDIRS := newfs_hfs.tproj fsck_hfs.tproj + +all clean: + for d in $(SUBDIRS); do $(MAKE) -C $$d -f Makefile.lnx $@; done + +export CC CFLAGS diff -druN diskdev_cmds-332.14/newfs_hfs.tproj/hfs_endian.c diskdev_cmds-332.14-patched/newfs_hfs.tproj/hfs_endian.c --- diskdev_cmds-332.14/newfs_hfs.tproj/hfs_endian.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/newfs_hfs.tproj/hfs_endian.c 2008-07-01 22:30:11.000000000 +0200 @@ -30,7 +30,12 @@ #include <sys/types.h> #include <sys/stat.h> +#if LINUX +#include "missing.h" +#else #include <architecture/byte_order.h> +#endif + #include <hfs/hfs_format.h> #include "hfs_endian.h" diff -druN diskdev_cmds-332.14/newfs_hfs.tproj/hfs_endian.h diskdev_cmds-332.14-patched/newfs_hfs.tproj/hfs_endian.h --- diskdev_cmds-332.14/newfs_hfs.tproj/hfs_endian.h 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/newfs_hfs.tproj/hfs_endian.h 2008-07-01 22:30:11.000000000 +0200 @@ -29,7 +29,12 @@ * volume format. */ #include <hfs/hfs_format.h> +#if LINUX +#include <endian.h> +#include <byteswap.h> +#else #include <architecture/byte_order.h> +#endif /*********************/ /* BIG ENDIAN Macros */ Files diskdev_cmds-332.14/newfs_hfs.tproj/hfs_endian.o and diskdev_cmds-332.14-patched/newfs_hfs.tproj/hfs_endian.o differ diff -druN diskdev_cmds-332.14/newfs_hfs.tproj/Makefile.lnx diskdev_cmds-332.14-patched/newfs_hfs.tproj/Makefile.lnx --- diskdev_cmds-332.14/newfs_hfs.tproj/Makefile.lnx 1970-01-01 01:00:00.000000000 +0100 +++ diskdev_cmds-332.14-patched/newfs_hfs.tproj/Makefile.lnx 2008-07-01 22:30:11.000000000 +0200 @@ -0,0 +1,12 @@ +CFILES = hfs_endian.c makehfs.c newfs_hfs.c +OFILES = $(CFILES:.c=.o) + +all: newfs_hfs + +newfs_hfs: $(OFILES) + ${CC} ${CFLAGS} -o newfs_hfs ${OFILES} -lcrypto + +clean: + $(RM) newfs_hfs $(OFILES) + +.PHONY : FORCE clean diff -druN diskdev_cmds-332.14/newfs_hfs.tproj/makehfs.c diskdev_cmds-332.14-patched/newfs_hfs.tproj/makehfs.c --- diskdev_cmds-332.14/newfs_hfs.tproj/makehfs.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/newfs_hfs.tproj/makehfs.c 2008-07-01 22:36:05.000000000 +0200 @@ -31,10 +31,16 @@ #include <sys/param.h> #include <sys/types.h> #include <sys/time.h> +#if LINUX +#include <time.h> +#include "missing.h" +#endif #include <sys/errno.h> #include <sys/stat.h> #include <sys/sysctl.h> +#if !LINUX #include <sys/vmmeter.h> +#endif #include <err.h> #include <errno.h> @@ -47,13 +53,14 @@ #include <openssl/sha.h> +#if !LINUX #include <architecture/byte_order.h> #include <CoreFoundation/CFString.h> #include <CoreFoundation/CFStringEncodingExt.h> extern Boolean _CFStringGetFileSystemRepresentation(CFStringRef string, UInt8 *buffer, CFIndex maxBufLen); - +#endif #include <hfs/hfs_format.h> #include <hfs/hfs_mount.h> @@ -63,7 +70,7 @@ #include "readme.h" -#define HFS_BOOT_DATA "/usr/share/misc/hfsbootdata" +#define HFS_BOOT_DATA "/usr/share/hfsprogs/hfsbootdata" #define HFS_JOURNAL_FILE ".journal" #define HFS_JOURNAL_INFO ".journal_info_block" @@ -129,7 +136,9 @@ static void MarkBitInAllocationBuffer __P((HFSPlusVolumeHeader *header, UInt32 allocationBlock, void* sectorBuffer, UInt32 *sector)); +#if !LINUX static UInt32 GetDefaultEncoding(); +#endif static UInt32 UTCToLocal __P((UInt32 utcTime)); @@ -158,11 +167,14 @@ #define ROUNDUP(x, u) (((x) % (u) == 0) ? (x) : ((x)/(u) + 1) * (u)) -#define ENCODING_TO_BIT(e) \ +#if LINUX +#define ENCODING_TO_BIT(e) (e) +#else +#define ENCODING_TO_BIT(e) ((e) < 48 ? (e) : \ ((e) == kCFStringEncodingMacUkrainian ? 48 : \ ((e) == kCFStringEncodingMacFarsi ? 49 : 0))) - +#endif /* * make_hfs * @@ -528,6 +540,7 @@ * Map UTF-8 input into a Mac encoding. * On conversion errors "untitled" is used as a fallback. */ +#if !LINUX { UniChar unibuf[kHFSMaxVolumeNameChars]; CFStringRef cfstr; @@ -553,7 +566,11 @@ bcopy(&mdbp->drVN[1], defaults->volumeName, mdbp->drVN[0]); defaults->volumeName[mdbp->drVN[0]] = '\0'; } +#endif /* Save the encoding hint in the Finder Info (field 4). */ + mdbp->drVN[0] = strlen(defaults->volumeName); + bcopy(defaults->volumeName,&mdbp->drVN[1],mdbp->drVN[0]); + mdbp->drFndrInfo[4] = SET_HFS_TEXT_ENCODING(defaults->encodingHint); mdbp->drWrCnt = kWriteSeqNum; @@ -1100,9 +1117,11 @@ UInt16 nodeSize; SInt16 offset; UInt32 unicodeBytes; +#if !LINUX UInt8 canonicalName[256]; CFStringRef cfstr; Boolean cfOK; +#endif int index = 0; nodeSize = dp->catalogNodeSize; @@ -1122,7 +1141,9 @@ * First record is always the root directory... */ ckp = (HFSPlusCatalogKey *)((UInt8 *)buffer + offset); - +#if LINUX + ConvertUTF8toUnicode(dp->volumeName, sizeof(ckp->nodeName.unicode), ckp->nodeName.unicode, &ckp->nodeName.length); +#else /* Use CFString functions to get a HFSPlus Canonical name */ cfstr = CFStringCreateWithCString(kCFAllocatorDefault, (char *)dp->volumeName, kCFStringEncodingUTF8); cfOK = _CFStringGetFileSystemRepresentation(cfstr, canonicalName, sizeof(canonicalName)); @@ -1139,6 +1160,7 @@ dp->volumeName, kDefaultVolumeNameStr); } CFRelease(cfstr); +#endif ckp->nodeName.length = SWAP_BE16 (ckp->nodeName.length); unicodeBytes = sizeof(UniChar) * SWAP_BE16 (ckp->nodeName.length); @@ -1821,15 +1843,15 @@ off_t sector; if ((byteCount % driveInfo->sectorSize) != 0) - errx(1, "WriteBuffer: byte count %ld is not sector size multiple", byteCount); + errx(1, "WriteBuffer: byte count %i is not sector size multiple", byteCount); sector = driveInfo->sectorOffset + startingSector; if (lseek(driveInfo->fd, sector * driveInfo->sectorSize, SEEK_SET) < 0) - err(1, "seek (sector %qd)", sector); + err(1, "seek (sector %lld)", sector); if (write(driveInfo->fd, buffer, byteCount) != byteCount) - err(1, "write (sector %qd, %ld bytes)", sector, byteCount); + err(1, "write (sector %lld, %i bytes)", sector, byteCount); } @@ -1913,7 +1935,7 @@ return quotient; } - +#if !LINUX #define __kCFUserEncodingFileName ("/.CFUserTextEncoding") static UInt32 @@ -1939,7 +1961,7 @@ } return 0; } - +#endif static int ConvertUTF8toUnicode(const UInt8* source, UInt32 bufsize, UniChar* unibuf, @@ -2006,6 +2028,9 @@ static int getencodinghint(unsigned char *name) { +#if LINUX + return(0); +#else int mib[3]; size_t buflen = sizeof(int); struct vfsconf vfc; @@ -2023,7 +2048,8 @@ return (hint); error: hint = GetDefaultEncoding(); - return (hint); + return (0); +#endif } @@ -2034,12 +2060,14 @@ unsigned char digest[20]; time_t now; clock_t uptime; - int mib[2]; - int sysdata; - char sysctlstring[128]; size_t datalen; double sysloadavg[3]; +#if !LINUX + int sysdata; + int mib[2]; + char sysctlstring[128]; struct vmtotal sysvmtotal; +#endif do { /* Initialize the SHA-1 context for processing: */ @@ -2052,52 +2080,58 @@ SHA1_Update(&context, &uptime, sizeof(uptime)); /* The kernel's boot time: */ +#if !LINUX mib[0] = CTL_KERN; mib[1] = KERN_BOOTTIME; datalen = sizeof(sysdata); sysctl(mib, 2, &sysdata, &datalen, NULL, 0); SHA1_Update(&context, &sysdata, datalen); - +#endif /* The system's host id: */ +#if !LINUX mib[0] = CTL_KERN; mib[1] = KERN_HOSTID; datalen = sizeof(sysdata); sysctl(mib, 2, &sysdata, &datalen, NULL, 0); SHA1_Update(&context, &sysdata, datalen); - +#endif /* The system's host name: */ +#if !LINUX mib[0] = CTL_KERN; mib[1] = KERN_HOSTNAME; datalen = sizeof(sysctlstring); sysctl(mib, 2, sysctlstring, &datalen, NULL, 0); SHA1_Update(&context, sysctlstring, datalen); - +#endif /* The running kernel's OS release string: */ +#if !LINUX mib[0] = CTL_KERN; mib[1] = KERN_OSRELEASE; datalen = sizeof(sysctlstring); sysctl(mib, 2, sysctlstring, &datalen, NULL, 0); SHA1_Update(&context, sysctlstring, datalen); - +#endif /* The running kernel's version string: */ +#if !LINUX mib[0] = CTL_KERN; mib[1] = KERN_VERSION; datalen = sizeof(sysctlstring); sysctl(mib, 2, sysctlstring, &datalen, NULL, 0); SHA1_Update(&context, sysctlstring, datalen); - +#endif /* The system's load average: */ datalen = sizeof(sysloadavg); getloadavg(sysloadavg, 3); SHA1_Update(&context, &sysloadavg, datalen); /* The system's VM statistics: */ +#if !LINUX mib[0] = CTL_VM; mib[1] = VM_METER; datalen = sizeof(sysvmtotal); sysctl(mib, 2, &sysvmtotal, &datalen, NULL, 0); SHA1_Update(&context, &sysvmtotal, datalen); - +#endif /* The current GMT (26 ASCII characters): */ time(&now); strncpy(randomInputBuffer, asctime(gmtime(&now)), 26); /* "Mon Mar 27 13:46:26 2000" */ Files diskdev_cmds-332.14/newfs_hfs.tproj/makehfs.o and diskdev_cmds-332.14-patched/newfs_hfs.tproj/makehfs.o differ Files diskdev_cmds-332.14/newfs_hfs.tproj/newfs_hfs and diskdev_cmds-332.14-patched/newfs_hfs.tproj/newfs_hfs differ diff -druN diskdev_cmds-332.14/newfs_hfs.tproj/newfs_hfs.8 diskdev_cmds-332.14-patched/newfs_hfs.tproj/newfs_hfs.8 --- diskdev_cmds-332.14/newfs_hfs.tproj/newfs_hfs.8 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/newfs_hfs.tproj/newfs_hfs.8 2008-07-01 22:35:53.000000000 +0200 @@ -93,7 +93,7 @@ option followed by a comma separated list of the form arg=blocks. .Pp -Example: -c c=5000,e=500 +Example: \-c c=5000,e=500 .Bl -tag -width Fl .It Em a=blocks Set the attribute file clump size. @@ -126,7 +126,7 @@ size must be a power of two and no larger than 32768 bytes. .Pp -Example: -n c=8192,e=4096 +Example: \-n c=8192,e=4096 .Bl -tag -width Fl .It Em a=bytes Set the attribute b-tree node size. diff -druN diskdev_cmds-332.14/newfs_hfs.tproj/newfs_hfs.c diskdev_cmds-332.14-patched/newfs_hfs.tproj/newfs_hfs.c --- diskdev_cmds-332.14/newfs_hfs.tproj/newfs_hfs.c 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/newfs_hfs.tproj/newfs_hfs.c 2008-07-01 22:30:11.000000000 +0200 @@ -38,8 +38,13 @@ #include <sys/mount.h> #include <sys/param.h> #include <sys/stat.h> +#if LINUX +#include <time.h> +#endif +#if !LINUX #include <IOKit/storage/IOMediaBSDClient.h> +#endif #include <hfs/hfs_format.h> #include "newfs_hfs.h" @@ -73,7 +78,9 @@ char *progname; char gVolumeName[kHFSPlusMaxFileNameChars + 1] = {kDefaultVolumeNameStr}; -char rawdevice[MAXPATHLEN]; +#if !LINUX +char rawdevice[MAXPATHLEN]; +#endif char blkdevice[MAXPATHLEN]; UInt32 gBlockSize = 0; UInt32 gNextCNID = kHFSFirstUserCatalogNodeID; @@ -137,8 +144,10 @@ extern int optind; int ch; int forceHFS; +#if !LINUX char *cp, *special; struct statfs *mp; +#endif int n; if ((progname = strrchr(*argv, '/'))) @@ -238,7 +247,9 @@ if (argc != 1) usage(); - +#if LINUX + (void) sprintf(blkdevice, "%s", argv[0]); +#else special = argv[0]; cp = strrchr(special, '/'); if (cp != 0) @@ -247,6 +258,7 @@ special++; (void) sprintf(rawdevice, "%sr%s", _PATH_DEV, special); (void) sprintf(blkdevice, "%s%s", _PATH_DEV, special); +#endif if (forceHFS && gJournaled) { fprintf(stderr, "-h -J: incompatible options specified\n"); @@ -268,6 +280,9 @@ /* * Check if target device is aready mounted */ +#if LINUX + // FIXME +#else n = getmntinfo(&mp, MNT_NOWAIT); if (n == 0) fatal("%s: getmntinfo: %s", blkdevice, strerror(errno)); @@ -277,14 +292,19 @@ fatal("%s is mounted on %s", blkdevice, mp->f_mntonname); ++mp; } +#endif - if (hfs_newfs(rawdevice, forceHFS, true) < 0) { + if (hfs_newfs(blkdevice, forceHFS, true) < 0) { +#if LINUX + err(1, NULL); +#else /* On ENXIO error use the block device (to get de-blocking) */ if (errno == ENXIO) { if (hfs_newfs(blkdevice, forceHFS, false) < 0) err(1, NULL); } else err(1, NULL); +#endif } exit(0); @@ -458,7 +478,7 @@ fatal("%s: block size is too small for %lld sectors", optarg, gBlockSize, sectorCount); if (gBlockSize < HFSOPTIMALBLKSIZE) - warnx("Warning: %ld is a non-optimal block size (4096 would be a better choice)", gBlockSize); + warnx("Warning: %i is a non-optimal block size (4096 would be a better choice)", gBlockSize); } } @@ -472,7 +492,9 @@ int fso = 0; int retval = 0; hfsparams_t defaults = {0}; +#if !LINUX u_int64_t maxSectorsPerIO; +#endif if (gNoCreate) { fso = open( device, O_RDONLY | O_NDELAY, 0 ); @@ -485,7 +507,33 @@ if (fstat( fso, &stbuf) < 0) fatal("%s: %s", device, strerror(errno)); +#if LINUX + dip.sectorSize = 512; + dip.sectorsPerIO = 256; +#ifndef BLKGETSIZE +#define BLKGETSIZE _IO(0x12,96) +#endif +#ifndef BLKGETSIZE64 +#define BLKGETSIZE64 _IOR(0x12,114,size_t) +#endif + + if (S_ISREG(stbuf.st_mode)) { + dip.totalSectors = stbuf.st_size / 512; + } + else if (S_ISBLK(stbuf.st_mode)) { + unsigned long size; + u_int64_t size64; + if (!ioctl(fso, BLKGETSIZE64, &size64)) + dip.totalSectors = size64 / 512; + else if (!ioctl(fso, BLKGETSIZE, &size)) + dip.totalSectors = size; + else + fatal("%s: %s", device, strerror(errno)); + } + else + fatal("%s: is not a block device", device); +#else if (ioctl(fso, DKIOCGETBLOCKCOUNT, &dip.totalSectors) < 0) fatal("%s: %s", device, strerror(errno)); @@ -493,14 +541,17 @@ fatal("%s: %s", device, strerror(errno)); if (ioctl(fso, DKIOCGETMAXBLOCKCOUNTWRITE, &maxSectorsPerIO) < 0) - dip.sectorsPerIO = (128 * 1024) / dip.sectorSize; /* use 128K as default */ + dip.sectorsPerIO = (128 * 1024) / dip.sectorSize; /* use 128K as default */ else dip.sectorsPerIO = MIN(maxSectorsPerIO, (1024 * 1024) / dip.sectorSize); +#endif + /* - * The make_hfs code currentlydoes 512 byte sized I/O. + * The make_hfs code currently does 512 byte sized I/O. * If the sector size is bigger than 512, start over * using the block device (to get de-blocking). */ +#if !LINUX if (dip.sectorSize != kBytesPerSector) { if (isRaw) { close(fso); @@ -515,7 +566,8 @@ dip.sectorSize = kBytesPerSector; } } - +#endif + dip.fd = fso; dip.sectorOffset = 0; time(&createtime); @@ -693,7 +745,7 @@ defaults->catalogClumpSize = clumpSize; defaults->catalogNodeSize = catnodesiz; if (gBlockSize < 4096 && gBlockSize < catnodesiz) - warnx("Warning: block size %ld is less than catalog b-tree node size %ld", gBlockSize, catnodesiz); + warnx("Warning: block size %i is less than catalog b-tree node size %i", gBlockSize, catnodesiz); if (extclumpblks == 0) { clumpSize = CalcHFSPlusBTreeClumpSize(gBlockSize, extnodesiz, sectorCount, FALSE); @@ -706,7 +758,7 @@ defaults->extentsClumpSize = clumpSize; defaults->extentsNodeSize = extnodesiz; if (gBlockSize < extnodesiz) - warnx("Warning: block size %ld is less than extents b-tree node size %ld", gBlockSize, extnodesiz); + warnx("Warning: block size %i is less than extents b-tree node size %i", gBlockSize, extnodesiz); if (atrclumpblks == 0) { clumpSize = 0; @@ -754,22 +806,22 @@ if (gNoCreate) { if (!gWrapper) - printf("%qd sectors (%lu bytes per sector)\n", sectorCount, sectorSize); + printf("%lld sectors (%u bytes per sector)\n", sectorCount, sectorSize); printf("HFS Plus format parameters:\n"); printf("\tvolume name: \"%s\"\n", gVolumeName); - printf("\tblock-size: %lu\n", defaults->blockSize); - printf("\ttotal blocks: %lu\n", totalBlocks); + printf("\tblock-size: %u\n", defaults->blockSize); + printf("\ttotal blocks: %u\n", totalBlocks); if (gJournaled) printf("\tjournal-size: %dk\n", (int)defaults->journalSize/1024); - printf("\tfirst free catalog node id: %lu\n", defaults->nextFreeFileID); - printf("\tcatalog b-tree node size: %lu\n", defaults->catalogNodeSize); - printf("\tinitial catalog file size: %lu\n", defaults->catalogClumpSize); - printf("\textents b-tree node size: %lu\n", defaults->extentsNodeSize); - printf("\tinitial extents file size: %lu\n", defaults->extentsClumpSize); - printf("\tinitial allocation file size: %lu (%lu blocks)\n", + printf("\tfirst free catalog node id: %u\n", defaults->nextFreeFileID); + printf("\tcatalog b-tree node size: %u\n", defaults->catalogNodeSize); + printf("\tinitial catalog file size: %u\n", defaults->catalogClumpSize); + printf("\textents b-tree node size: %u\n", defaults->extentsNodeSize); + printf("\tinitial extents file size: %u\n", defaults->extentsClumpSize); + printf("\tinitial allocation file size: %u (%u blocks)\n", defaults->allocationClumpSize, defaults->allocationClumpSize / gBlockSize); - printf("\tdata fork clump size: %lu\n", defaults->dataClumpSize); - printf("\tresource fork clump size: %lu\n", defaults->rsrcClumpSize); + printf("\tdata fork clump size: %u\n", defaults->dataClumpSize); + printf("\tresource fork clump size: %u\n", defaults->rsrcClumpSize); if (defaults->flags & kUseAccessPerms) { printf("\tuser ID: %d\n", (int)defaults->owner); printf("\tgroup ID: %d\n", (int)defaults->group); @@ -844,17 +896,17 @@ } if (gNoCreate) { - printf("%ld sectors at %ld bytes per sector\n", sectorCount, sectorSize); + printf("%i sectors at %i bytes per sector\n", sectorCount, sectorSize); printf("%s format parameters:\n", gWrapper ? "HFS Wrapper" : "HFS"); printf("\tvolume name: \"%s\"\n", gVolumeName); - printf("\tblock-size: %ld\n", defaults->blockSize); - printf("\ttotal blocks: %ld\n", sectorCount / (alBlkSize / sectorSize) ); - printf("\tfirst free catalog node id: %ld\n", defaults->nextFreeFileID); - printf("\tinitial catalog file size: %ld\n", defaults->catalogClumpSize); - printf("\tinitial extents file size: %ld\n", defaults->extentsClumpSize); - printf("\tfile clump size: %ld\n", defaults->dataClumpSize); + printf("\tblock-size: %i\n", defaults->blockSize); + printf("\ttotal blocks: %i\n", sectorCount / (alBlkSize / sectorSize) ); + printf("\tfirst free catalog node id: %i\n", defaults->nextFreeFileID); + printf("\tinitial catalog file size: %i\n", defaults->catalogClumpSize); + printf("\tinitial extents file size: %i\n", defaults->extentsClumpSize); + printf("\tfile clump size: %i\n", defaults->dataClumpSize); if (hfsgrowblks) - printf("\twrapper growable from %ld to %ld sectors\n", sectorCount, hfsgrowblks); + printf("\twrapper growable from %i to %i sectors\n", sectorCount, hfsgrowblks); } } diff -druN diskdev_cmds-332.14/newfs_hfs.tproj/newfs_hfs.h diskdev_cmds-332.14-patched/newfs_hfs.tproj/newfs_hfs.h --- diskdev_cmds-332.14/newfs_hfs.tproj/newfs_hfs.h 2006-02-20 22:45:15.000000000 +0100 +++ diskdev_cmds-332.14-patched/newfs_hfs.tproj/newfs_hfs.h 2008-07-01 22:30:11.000000000 +0200 @@ -19,8 +19,12 @@ * * @APPLE_LICENSE_HEADER_END@ */ - -#include <CoreFoundation/CFBase.h> + +#if LINUX +#include "missing.h" +#else +#include <CoreFoundation/CFBase.h>*/ +#endif /* * Mac OS Finder flags @@ -122,33 +126,33 @@ #define kDTDF_FileID 16 #define kDTDF_Name "Desktop DF" #define kDTDF_Chars 10 -#define kDTDF_Type 'DTFL' -#define kDTDF_Creator 'DMGR' +#define kDTDF_Type 0x4454464C /* 'DTFL' */ +#define kDTDF_Creator 0x444D4752 /* 'DMGR' */ #define kDTDB_FileID 17 #define kDTDB_Name "Desktop DB" #define kDTDB_Chars 10 -#define kDTDB_Type 'BTFL' -#define kDTDB_Creator 'DMGR' +#define kDTDB_Type 0x4254464C /* 'BTFL' */ +#define kDTDB_Creator 0x444D4752 /* 'DMGR' */ #define kDTDB_Size 1024 #define kReadMe_FileID 18 #define kReadMe_Name "ReadMe" #define kReadMe_Chars 6 -#define kReadMe_Type 'ttro' -#define kReadMe_Creator 'ttxt' +#define kReadMe_Type 0x7474726F /* 'ttro' */ +#define kReadMe_Creator 0x74747974 /* 'ttxt' */ #define kFinder_FileID 19 #define kFinder_Name "Finder" #define kFinder_Chars 6 -#define kFinder_Type 'FNDR' -#define kFinder_Creator 'MACS' +#define kFinder_Type 0x464E4452 /* 'FNDR' */ +#define kFinder_Creator 0x4D414353 /* 'MACS' */ #define kSystem_FileID 20 #define kSystem_Name "System" #define kSystem_Chars 6 -#define kSystem_Type 'zsys' -#define kSystem_Creator 'MACS' +#define kSystem_Type 0x7A737973 /* 'zsys' */ +#define kSystem_Creator 0x4D414353 /* 'MACS' */ Files diskdev_cmds-332.14/newfs_hfs.tproj/newfs_hfs.o and diskdev_cmds-332.14-patched/newfs_hfs.tproj/newfs_hfs.o differ ================================================ FILE: packages/sysutils/dosfstools/package.mk ================================================ # 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="dosfstools" PKG_VERSION="4.2" PKG_SHA256="64926eebf90092dca21b14259a5301b7b98e7b1943e8a201c7d726084809b527" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/dosfstools/dosfstools" PKG_URL="https://github.com/dosfstools/dosfstools/releases/download/v${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_DEPENDS_INIT="toolchain" PKG_LONGDESC="dosfstools contains utilities for making and checking MS-DOS FAT filesystems." PKG_CONFIGURE_OPTS_TARGET="--enable-compat-symlinks" PKG_MAKE_OPTS_TARGET="PREFIX=/usr" PKG_MAKEINSTALL_OPTS_TARGET="PREFIX=/usr" PKG_CONFIGURE_OPTS_INIT="--enable-compat-symlinks --without-iconv" PKG_MAKE_OPTS_INIT="PREFIX=/usr" makeinstall_init() { mkdir -p ${INSTALL}/usr/sbin cp -P src/fatlabel ${INSTALL}/usr/sbin cp -P src/fsck.fat ${INSTALL}/usr/sbin ln -sf fsck.fat ${INSTALL}/usr/sbin/fsck.msdos ln -sf fsck.fat ${INSTALL}/usr/sbin/fsck.vfat } makeinstall_host() { mkdir -p ${TOOLCHAIN}/sbin cp src/mkfs.fat ${TOOLCHAIN}/sbin ln -sf mkfs.fat ${TOOLCHAIN}/sbin/mkfs.vfat cp src/fsck.fat ${TOOLCHAIN}/sbin ln -sf fsck.fat ${TOOLCHAIN}/sbin/fsck.vfat cp src/fatlabel ${TOOLCHAIN}/sbin } ================================================ FILE: packages/sysutils/dosfstools/patches/dosfstools-01-silence_backup_boot_sector_diff.patch ================================================ Do not print backup boot sector diff in non interactive mode to avoid log spam. --- a/src/boot.c 2017-01-23 02:16:58.000000000 +0100 +++ a/src/boot.c 2020-02-05 18:32:16.000000000 +0100 @@ -174,6 +174,9 @@ static void check_backup_boot(DOS_FS * f char buf[20]; printf("There are differences between boot sector and its backup.\n"); + if (!interactive) + printf("This is mostly harmless.\n"); + else { printf("This is mostly harmless. Differences: (offset:original/backup)\n "); pos = 2; for (p = (uint8_t *) b, q = (uint8_t *) & b2, i = 0; i < sizeof(b2); @@ -188,6 +191,7 @@ static void check_backup_boot(DOS_FS * f first = 0; } } + } printf("\n"); if (interactive) ================================================ FILE: packages/sysutils/e2fsprogs/package.mk ================================================ # 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) PKG_NAME="e2fsprogs" PKG_VERSION="1.46.6" PKG_SHA256="a77517f19ff5e4e97ede63536566865dd5d48654e13fc145f5f2249ef7c4f4fc" 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" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_DEPENDS_INIT="toolchain" PKG_LONGDESC="The filesystem utilities for the EXT2 filesystem, including e2fsck, mke2fs, dumpe2fs, fsck, and others." PKG_BUILD_FLAGS="-parallel" PKG_CONFIGURE_OPTS_HOST="--prefix=${TOOLCHAIN}/ \ --bindir=${TOOLCHAIN}/bin \ --sbindir=${TOOLCHAIN}/sbin \ --disable-debugfs \ --disable-defrag \ --disable-e2initrd-helper \ --disable-fsck \ --disable-fuse2fs \ --disable-imager \ --disable-nls \ --disable-resizer \ --disable-rpath \ --disable-subset \ --disable-symlink-build \ --disable-symlink-install \ --enable-tls \ --disable-uuidd \ --enable-verbose-makecmds \ --with-crond-dir=no \ --with-gnu-ld \ --without-pthread \ --with-systemd-unit-dir=no \ --with-udev-rules-dir=no" post_unpack() { # Increase minimal inode size to avoid: # "ext4 filesystem being mounted at xxx supports timestamps until 2038 (0x7fffffff)" sed -i 's/inode_size = 128/inode_size = 256/g' ${PKG_BUILD}/misc/mke2fs.conf.in } pre_configure() { PKG_CONFIGURE_OPTS_INIT="BUILD_CC=${HOST_CC} \ --disable-blkid-debug \ --disable-bsd-shlibs \ --disable-debugfs \ --disable-e2initrd-helper \ --disable-elf-shlibs \ --enable-fsck \ --disable-fuse2fs \ --disable-imager \ --disable-jbd-debug \ --enable-libblkid \ --enable-libuuid \ --disable-nls \ --disable-profile \ --enable-resizer \ --disable-rpath \ --disable-subset \ --enable-symlink-build \ --enable-symlink-install \ --disable-testio-debug \ --enable-tls \ --disable-uuidd \ --enable-verbose-makecmds \ --with-crond-dir=no \ --with-gnu-ld \ --without-pthread \ --with-systemd-unit-dir=no \ --with-udev-rules-dir=no" PKG_CONFIGURE_OPTS_TARGET="${PKG_CONFIGURE_OPTS_INIT}" } post_makeinstall_target() { make -C lib/et LIBMODE=644 DESTDIR=${SYSROOT_PREFIX} install rm -rf ${INSTALL}/usr/sbin/badblocks rm -rf ${INSTALL}/usr/sbin/blkid rm -rf ${INSTALL}/usr/sbin/dumpe2fs rm -rf ${INSTALL}/usr/sbin/e2freefrag rm -rf ${INSTALL}/usr/sbin/e2undo rm -rf ${INSTALL}/usr/sbin/e4defrag rm -rf ${INSTALL}/usr/sbin/filefrag rm -rf ${INSTALL}/usr/sbin/fsck rm -rf ${INSTALL}/usr/sbin/logsave rm -rf ${INSTALL}/usr/sbin/mklost+found } makeinstall_init() { mkdir -p ${INSTALL}/usr/sbin cp e2fsck/e2fsck ${INSTALL}/usr/sbin ln -sf e2fsck ${INSTALL}/usr/sbin/fsck.ext2 ln -sf e2fsck ${INSTALL}/usr/sbin/fsck.ext3 ln -sf e2fsck ${INSTALL}/usr/sbin/fsck.ext4 if [ ${INITRAMFS_PARTED_SUPPORT} = "yes" ]; then cp misc/mke2fs ${INSTALL}/usr/sbin ln -sf mke2fs ${INSTALL}/usr/sbin/mkfs.ext2 ln -sf mke2fs ${INSTALL}/usr/sbin/mkfs.ext3 ln -sf mke2fs ${INSTALL}/usr/sbin/mkfs.ext4 fi } makeinstall_host() { make -C lib/et LIBMODE=644 install make -C lib/ext2fs LIBMODE=644 install mkdir -p ${TOOLCHAIN}/sbin cp e2fsck/e2fsck ${TOOLCHAIN}/sbin cp misc/mke2fs ${TOOLCHAIN}/sbin cp misc/tune2fs ${TOOLCHAIN}/sbin } ================================================ FILE: packages/sysutils/entropy/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="entropy" PKG_VERSION="0" PKG_LICENSE="GPL" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A simple way to add entropy at boot" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/entropy cp add-entropy ${INSTALL}/usr/lib/entropy cp add-random-at-shutdown ${INSTALL}/usr/lib/entropy chmod +x ${INSTALL}/usr/lib/entropy/* } post_install() { enable_service add-entropy.service enable_service add-random-at-shutdown.service } ================================================ FILE: packages/sysutils/entropy/sources/add-entropy ================================================ #!/usr/bin/python import os import struct RNDADDENTROPY = 0x40085203 import fcntl def add_entropy(fd, data): add = struct.pack('ii', len(data)*8, len(data)) + data fcntl.ioctl(fd, RNDADDENTROPY, add) if not os.path.isfile("/storage/.cache/random.data"): os.system("dd if=/dev/urandom of=/storage/.cache/random.data count=4 >/dev/null") cache=os.open("/storage/.cache/random.data", os.O_RDONLY) rnd=os.open("/dev/random", os.O_RDWR) while True: data=os.read(cache, 512) if len(data) == 0: break add_entropy(rnd, data) ================================================ FILE: packages/sysutils/entropy/sources/add-random-at-shutdown ================================================ #!/bin/sh dd if=/dev/urandom of=/storage/.cache/random.data count=4 ================================================ FILE: packages/sysutils/entropy/system.d/add-entropy.service ================================================ [Unit] Description=Add random entropy from file DefaultDependencies=no After=systemd-tmpfiles-setup.service Before=systemd-udevd.service [Service] Type=oneshot ExecStart=/usr/lib/entropy/add-entropy RemainAfterExit=yes [Install] WantedBy=basic.target ================================================ FILE: packages/sysutils/entropy/system.d/add-random-at-shutdown.service ================================================ [Unit] Description=Save random entropy at shutdown DefaultDependencies=no Before=systemd-poweroff.service systemd-reboot.service systemd-halt.service [Service] Type=oneshot ExecStart=/usr/lib/entropy/add-random-at-shutdown RemainAfterExit=yes [Install] WantedBy=poweroff.target reboot.target halt.target ================================================ FILE: packages/sysutils/ethmactool/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ethmactool" PKG_VERSION="1.0" PKG_LICENSE="GPLv2" PKG_LONGDESC="ethmactool: udev rule for obtaining real MAC address or creating a persistent MAC from the CPU serial" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/ethmactool-config ${INSTALL}/usr/bin } post_install() { enable_service ethmactool-config.service } ================================================ FILE: packages/sysutils/ethmactool/scripts/ethmactool-config ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) case $DTNAME in radxa,zero*) echo "Skipping configuration, eth0 not detected" exit 0 ;; esac COMPATIBLE=$(/usr/bin/dtsoc) MAC_STEP="" validate_mac() { [ ${#MAC} -eq 12 -a "${MAC}" != "000000000000" ] } fixup_self_mac() { # clear multicast bit and set local assignment bit (IEEE802) MAC=$(printf '%012X' "$(( (0x$MAC & 0xFEFFFFFFFFFF) | 0x020000000000 ))") } from_cmdline() { for arg in $(cat /proc/cmdline | tr -d ':'); do case ${arg} in mac=*) MAC=${arg#*=} ;; esac done } aml_from_efuse_gxbb() { if [ -e /sys/devices/platform/efuse/efuse0/nvmem ]; then MAC=$(od -x -A n -j 0x34 -N 6 /sys/bus/nvmem/devices/efuse0/nvmem | tr -d ' ') MAC=${MAC:2:2}${MAC:0:2}${MAC:6:2}${MAC:4:2}${MAC:10:2}${MAC:8:2} fi } aml_from_efuse_gxl() { if [ -e /sys/devices/platform/efuse/efuse0/nvmem ]; then MAC=$(cat /sys/devices/platform/efuse/efuse0/nvmem) fi } aml_from_cpu_sn() { if [ -e /sys/bus/platform/devices/secure-monitor/serial ]; then MAC=$(cat /sys/bus/platform/devices/secure-monitor/serial 2>/dev/null | cut -b-12) fixup_self_mac elif [ -e /sys/bus/platform/devices/firmware\:secure-monitor/serial ]; then MAC=$(cat /sys/bus/platform/devices/firmware\:secure-monitor/serial 2>/dev/null | cut -b-12) fixup_self_mac fi } from_cpu_sn() { MAC=$(cat /proc/cpuinfo 2>/dev/null | awk '/Serial/ {print substr($3,1,12)}') fixup_self_mac } case $COMPATIBLE in amlogic*) MAC_STEPS="from_cmdline aml_from_efuse_gxbb aml_from_efuse_gxl aml_from_cpu_sn" ;; *) MAC_STEPS="from_cpu_sn" ;; esac for MAC_STEP in $MAC_STEPS ; do $MAC_STEP validate_mac && break done if validate_mac ; then MAC=$(echo "$MAC" | sed 's/\(..\)/\1:/g' | cut -b-17) echo "MAC=${MAC}" > /run/libreelec/ethmactool-$1 /usr/sbin/ip link set dev $1 down /usr/sbin/ip link set dev $1 address $MAC /usr/sbin/ip link set dev $1 up fi ================================================ FILE: packages/sysutils/ethmactool/system.d/ethmactool-config.service ================================================ [Unit] Description=Configure eth0 MAC address Requisite=sys-subsystem-net-devices-eth0.device Before=connman.service [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/ethmactool-config eth0 [Install] WantedBy=multi-user.target ================================================ FILE: packages/sysutils/eventlircd/evmap/03_03eb_0002.evmap ================================================ KEY_VOLDOWN = KEY_VOLUMEDOWN # Volume Down KEY_VOLUP = KEY_VOLUMEUP # Volume Up KEY_CHDOWN = KEY_CHANNELDOWN # Channel Down KEY_CHUP = KEY_CHANNELUP # Channel Up KEY_OK = KEY_ENTER # Direction OK (also used for Enter) KEY_FFORWARD = KEY_FASTFORWARD # Forward KEY_GUIDE = KEY_EPG # EPG ================================================ FILE: packages/sysutils/eventlircd/evmap/03_0419_0001.evmap ================================================ ctrl+shift+alt+KEY_2 = KEY_PVR # TV/DVR ctrl+shift+alt+KEY_H = KEY_PRINT # Print alt+KEY_F4 = KEY_CLOSE # Close ctrl+shift+alt+KEY_3 = KEY_MP3 # Music ctrl+shift+alt+KEY_4 = KEY_MEDIA # Pictures ctrl+shift+alt+KEY_5 = KEY_VIDEO # Videos ctrl+shift+alt+KEY_1 = KEY_CONTEXT_MENU # DVD/Menu ctrl+KEY_B = KEY_PREVIOUS # Previous ctrl+KEY_P = KEY_PLAYPAUSE # Play/Pause ctrl+KEY_F = KEY_NEXT # Next ctrl+shift+KEY_B = KEY_REWIND # Rew ctrl+KEY_S = KEY_STOP # Stop ctrl+shift+KEY_F = KEY_FORWARD # Fwd ctrl+shift+alt+KEY_HOME = KEY_MENU # Home ctrl+KEY_R = KEY_RECORD # Record ctrl+shift+alt+KEY_F = KEY_SHUFFLE # Shuffle ctrl+shift+alt+KEY_B = KEY_MEDIA_REPEAT # Repeat ================================================ FILE: packages/sysutils/eventlircd/evmap/03_046d_c101.evmap ================================================ # Logitech, Inc. UltraX Media Remote # Bus=001 Device=009 Product=046d Version=c101 KEY_KPENTER = KEY_ENTER # Enter/OK KEY_STOPCD = KEY_STOP # Stop KEY_PREVIOUSSONG = KEY_PREVIOUS # Prev KEY_NEXTSONG = KEY_NEXT # Next KEY_PLAYPAUSE = KEY_PLAY # Play/Pause KEY_FASTFORWARD = KEY_FASTFORWARD # Fwd KEY_BACK = KEY_EXIT # Back KEY_AGAIN = KEY_MEDIA_REPEAT # Repeat KEY_PROPS = KEY_INFO # Info/EPG ================================================ FILE: packages/sysutils/eventlircd/evmap/03_05a4_9881.evmap ================================================ KEY_HOMEPAGE = KEY_WWW # WWW KEY_SLEEP = KEY_POWER # Sleep ctrl+shift+KEY_T = KEY_VCR # My TV ctrl+KEY_M = KEY_AUDIO # My Music ctrl+KEY_I = KEY_CAMERA # My Pictures ctrl+KEY_E = KEY_VIDEO # My Videos ctrl+KEY_O = KEY_TUNER # Record TV ctrl+KEY_G = KEY_EPG # Guide ctrl+KEY_T = KEY_TV # Live TV ctrl+shift+KEY_M = KEY_DVD # DVD Menu KEY_PLAYPAUSE = KEY_PLAY # Play (also used for Pause) #KEY_PLAYPAUSE = KEY_PAUSE # Pause (also used for Play) ctrl+shift+KEY_B = KEY_REWIND # Reverse ctrl+shift+KEY_F = KEY_FASTFORWARD # Forward KEY_PREVIOUSSONG = KEY_PREVIOUS # Pre-track KEY_NEXTSONG = KEY_NEXT # Next track KEY_STOPCD = KEY_STOP # Stop ctrl+KEY_R = KEY_RECORD # Record KEY_BACKSPACE = KEY_EXIT # Back BTN_RIGHT = KEY_INFO # Information (also used for Mouse Right) KEY_UP = KEY_UP # Direction Up KEY_DOWN = KEY_DOWN # Direction Down KEY_LEFT = KEY_LEFT # Direction Left KEY_RIGHT = KEY_RIGHT # Direction Right KEY_ENTER = KEY_ENTER # Direction OK (also used for Enter) BTN_MOUSE = BTN_LEFT # Mouse Left #BTN_RIGHT = KEY_INFO # Mouse Right (also used for Information) KEY_VOLUMEUP = KEY_VOLUMEUP # Volume Up KEY_VOLUMEDOWN = KEY_VOLUMEDOWN # Volume Down KEY_PAGEDOWN = KEY_CHANNELDOWN # Channel Up KEY_PAGEUP = KEY_CHANNELUP # Channel Down KEY_MUTE = KEY_MUTE # Mute alt+meta+KEY_ENTER = KEY_MEDIA # Start Key alt+KEY_F4 = KEY_SUBTITLE # Close (used here for Subtitles) KEY_ESC = KEY_DELETE # Clear #KEY_ENTER = KEY_ENTER # Enter (also used for Direction OK) numlock+KEY_KP0 = KEY_NUMERIC_0 # 0 numlock+KEY_KP1 = KEY_NUMERIC_1 # 1 numlock+KEY_KP2 = KEY_NUMERIC_2 # 2 numlock+KEY_KP3 = KEY_NUMERIC_3 # 3 numlock+KEY_KP4 = KEY_NUMERIC_4 # 4 numlock+KEY_KP5 = KEY_NUMERIC_5 # 5 numlock+KEY_KP6 = KEY_NUMERIC_6 # 6 numlock+KEY_KP7 = KEY_NUMERIC_7 # 7 numlock+KEY_KP8 = KEY_NUMERIC_8 # 8 numlock+KEY_KP9 = KEY_NUMERIC_9 # 9 KEY_KPASTERISK = KEY_ZOOM # * numlock+alt+KEY_KP3 = KEY_TEXT # # numlock+alt+KEY_KP5 = NULL # Sent as part #, and we ignore it #The USB interface advertises these events but none of the remote control's #buttons appear to generate them. Therefore, they are set to NULL so that #eventlircd does not advertise them as part of its mouse/joystick device. BTN_MIDDLE = NULL BTN_SIDE = NULL BTN_EXTRA = NULL REL_WHEEL = NULL ================================================ FILE: packages/sysutils/eventlircd/evmap/03_05ac_8241.evmap ================================================ # Apple Infrared Remote Controller KEY_FORWARD = KEY_NEXT # Next KEY_BACK = KEY_PREVIOUS # Prev ================================================ FILE: packages/sysutils/eventlircd/evmap/03_0709_9137.evmap ================================================ # Giada N20 Remote # Bus=0003 Vendor=0709 Product=9137 Version=0111 KEY_BACK = KEY_EXIT # Back KEY_ESC = KEY_CLEAR # Clear KEY_STOPCD = KEY_STOP # Stop KEY_NEXTSONG = KEY_NEXT # Next KEY_PREVIOUSSONG = KEY_PREVIOUS # Prev KEY_REWIND = KEY_REWIND # Rev KEY_FASTFORWARD = KEY_FASTFORWARD # Fwd KEY_COMPOSE = KEY_INFO # Info/EPG KEY_G = KEY_EPG # Guide shift+KEY_3 = KEY_NUMERIC_POUND # Hash (#) shift+KEY_8 = KEY_NUMERIC_STAR # Star (*) ================================================ FILE: packages/sysutils/eventlircd/evmap/03_0755_2626.evmap ================================================ # Remote 0755:2626 Aureal Semiconductor (iRF Media Technology W-01RN USB_V3.1) shift+KEY_8 = KEY_NUMERIC_STAR # * shift+KEY_3 = KEY_NUMERIC_POUND # # ctrl+shift+KEY_B = KEY_REWIND # Rewind ctrl+KEY_LEFT = NULL # Rew (Hide) ctrl+shift+KEY_LEFT = NULL # Rew ctrl+shift+KEY_F = NULL # Fwd (Hide) ctrl+KEY_RIGHT = NULL # Fwd (Hide) ctrl+shift+KEY_RIGHT = NULL # Fwd alt+KEY_LEFT = NULL # Prev ctrl+KEY_PAGEUP = NULL # Prev KEY_PREVIOUSSONG = KEY_PREVIOUS # Replay alt+KEY_DOWN = NULL # Next ctrl+KEY_PAGEDOWN = NULL # Next KEY_NEXTSONG = KEY_NEXT # Skip KEY_SPACE = NULL # Play/Pause KEY_PLAYPAUSE = KEY_PLAY # Play/Pause KEY_DOT = NULL # Stop ctrl+KEY_U = NULL # Stop alt+KEY_U = NULL # Stop KEY_STOPCD = KEY_STOP # Stop KEY_PAGEUP = KEY_CHANNELUP # CH/PG up KEY_PAGEDOWN = KEY_CHANNELDOWN # CH/PG down KEY_HOMEPAGE = KEY_GREEN # Green Key KEY_MAIL = KEY_YELLOW # Yellow Key alt+meta+KEY_ENTER = KEY_MEDIA # Home ctrl+KEY_M = KEY_AUDIO # Music ctrl+KEY_I = KEY_CAMERA # Pictures ctrl+shift+KEY_M = KEY_DVD # DVD/VCD ctrl+KEY_E = KEY_VIDEO # Videos ctrl+KEY_A = KEY_RADIO # Radio ctrl+shift+KEY_T = KEY_TUNER # Tuner KEY_PVR = KEY_TV # PVR meta+KEY_EQUAL = KEY_INFO # Zoom ctrl+KEY_ENTER = NULL # Full Screen (Hide) alt+KEY_ENTER = KEY_ZOOM # Full Screen KEY_OK = KEY_ENTER # Ok KEY_BACKSPACE = KEY_EXIT # BACK alt+KEY_F4 = KEY_CLOSE # Close meta+KEY_D = KEY_INFO # Desktop, remapped to Info in XBMC KEY_COMPOSE = KEY_EPG # More, remapped to Context Menu in XBMC ctrl+KEY_R = KEY_RECORD # Record KEY_ESC = KEY_DELETE # Clear ================================================ FILE: packages/sysutils/eventlircd/evmap/03_0bc7_0006.evmap ================================================ # X10 Remote KEY_OK = KEY_ENTER # Direction OK (also used for Enter) KEY_STOPCD = KEY_STOP # Stop KEY_FASTFORWARD = KEY_FORWARD # Forward KEY_IMAGES = KEY_CAMERA # My Pictures KEY_TV = KEY_TUNER # My TV KEY_SELECT = KEY_MEDIA # Start Key/Select Key KEY_BACK = KEY_EXIT # Back ================================================ FILE: packages/sysutils/eventlircd/evmap/03_1241_e000.evmap ================================================ # 1241:e000 HOLTEK USB receiver # mode 1, keyboard red # keyboard on # mode 2, mouse blue # mouse on shift+KEY_8 = KEY_NUMERIC_STAR # * BTN_LEFT = KEY_NUMERIC_POUND # # alt+KEY_F4 = KEY_POWER # Power ctrl+KEY_R = KEY_RECORD # Record ctrl+KEY_P = KEY_PAUSE # Pause ctrl+shift+KEY_S = KEY_STOP # Stop ctrl+shift+KEY_B = KEY_REWIND # Rev ctrl+shift+KEY_P = KEY_PLAY # Play ctrl+shift+KEY_F = KEY_FASTFORWARD # Fwd KEY_PREVIOUSSONG = KEY_PREVIOUS # Prev KEY_KPASTERISK = KEY_PREVIOUS # Prev KEY_NEXTSONG = KEY_NEXT # Next ctrl+KEY_F = KEY_NEXT # Next KEY_BACKSPACE = KEY_EXIT # BACK/Clear ctrl+KEY_B = KEY_BACK # BACK/Clear BTN_RIGHT = KEY_INFO # Info/EPG KEY_F1 = KEY_INFO # Info/EPG KEY_COMPOSE = KEY_INFO # Info/EPG alt+meta+KEY_ENTER = KEY_MEDIA # Media KEY_F10 = KEY_VOLUMEUP # Vol + KEY_F9 = KEY_VOLUMEDOWN # Vol - KEY_PAGEUP = KEY_CHANNELUP # CH/PG up KEY_PAGEDOWN = KEY_CHANNELDOWN # CH/PG down KEY_F8 = KEY_MUTE # Mute ctrl+shift+KEY_T = KEY_SUBTITLE # Teletext ctrl+shift+KEY_C = KEY_SUBTITLE # Teletext ctrl+KEY_U = KEY_SUBTITLE # Subtitles ctrl+KEY_G = KEY_EPG # Program # remapped to EPG (Contextmenu) ctrl+shift+KEY_M = KEY_DVD # DVD KEY_MP3 = KEY_AUDIO # Music ctrl+KEY_M = KEY_AUDIO # Audio ctrl+KEY_T = KEY_TUNER # LiveTV ctrl+KEY_E = KEY_TUNER # TV ctrl+KEY_O = KEY_PVR # RecordedTV ctrl+KEY_I = KEY_GREEN # Green alt+KEY_TAB = KEY_YELLOW # Yellow ================================================ FILE: packages/sysutils/eventlircd/evmap/03_13ec_0006.evmap ================================================ # Remote 13ec:0006 KEY_SLEEP = KEY_POWER # Power KEY_BACKSPACE = KEY_EXIT # Backspace KEY_PLAYPAUSE = KEY_PLAY # Play/Pause KEY_STOPCD = KEY_STOP # Stop KEY_PREVIOUSSONG = KEY_PREVIOUS # Prev KEY_NEXTSONG = KEY_NEXT # Next KEY_PVR = KEY_MEDIA # Home KEY_AUX = KEY_CAMERA # Photo KEY_MENU = KEY_EPG # Menu (used for XBMC's context menu) KEY_K = KEY_EPG # Title (used for XBMC's context menu) ================================================ FILE: packages/sysutils/eventlircd/evmap/03_147a_e02d.evmap ================================================ KEY_M = KEY_MUTE KEY_R = KEY_VOLUMEDOWN # -/-- key KEY_S = KEY_VOLUMEUP # A/B key KEY_F5 = KEY_RECORD # KEY_RED KEY_F6 = KEY_PREVIOUS # KEY_GREEN KEY_F7 = KEY_NEXT # KEY_YELLOW KEY_F8 = KEY_BLUE KEY_E = KEY_PROGRAM KEY_F = KEY_EXIT KEY_I = KEY_INFO KEY_F9 = KEY_TV KEY_F2 = KEY_MENU KEY_T = KEY_TEXT KEY_P = KEY_PAUSE KEY_V = KEY_ZOOM # EXT ================================================ FILE: packages/sysutils/eventlircd/evmap/03_18b1_0037.evmap ================================================ # Remote 18b1:0037 Petalynx Maxter KEY_PREVIOUSSONG = KEY_PREVIOUS # Prev KEY_NEXTSONG = KEY_NEXT # Next KEY_NEXT = KEY_MENU KEY_PROGRAM = KEY_HOME KEY_PLAYPAUSE = KEY_PLAY # Play/Pause KEY_STOPCD = KEY_STOP # Stop KEY_PAGEUP = KEY_CHANNELUP # CH/PG up KEY_PAGEDOWN = KEY_CHANNELDOWN # CH/PG down KEY_PVR = KEY_TV # PVR KEY_OK = KEY_ENTER # Ok KEY_EXIT = KEY_EXIT # BACK KEY_SLEEP = KEY_POWER # Power KEY_ESC = KEY_ESC # Escape KEY_BACK = KEY_EXIT # Back ================================================ FILE: packages/sysutils/eventlircd/evmap/03_1d57_ac01.evmap ================================================ # 1d57:ac01 MS-Tech shift+KEY_8 = KEY_NUMERIC_STAR # * shift+KEY_3 = KEY_NUMERIC_POUND # # KEY_PAGEUP = KEY_CHANNELUP # CH/PG up KEY_PAGEDOWN = KEY_CHANNELDOWN # CH/PG down ctrl+KEY_F = KEY_NEXT # Next ctrl+KEY_B = KEY_PREVIOUS # Prev alt+KEY_F4 = KEY_EXIT # Exit KEY_BACKSPACE = KEY_EXIT # Back KEY_COMPOSE = KEY_INFO # Info ctrl+KEY_R = KEY_RECORD # Record ctrl+KEY_P = KEY_PAUSE # Pause ctrl+shift+KEY_S = KEY_STOP # Stop ctrl+shift+KEY_B = KEY_REWIND # Rev ctrl+shift+KEY_P = KEY_PLAY # Play ctrl+shift+KEY_F = KEY_FASTFORWARD # Fwd ctrl+shift+KEY_M = KEY_DVD # DVD ctrl+shift+KEY_A = KEY_AUDIO # Audio ctrl+shift+KEY_T = KEY_TUNER # LiveTV ctrl+KEY_U = KEY_SUBTITLE # Subtitles ctrl+KEY_G = KEY_EPG # Guide # remapped to EPG (Contextmenu) alt+KEY_ENTER = KEY_MEDIA # Media/Switch Windows ================================================ FILE: packages/sysutils/eventlircd/evmap/aftvsremote.evmap ================================================ KEY_KPENTER = KEY_OK KEY_UP = KEY_UP KEY_LEFT = KEY_LEFT KEY_RIGHT = KEY_RIGHT KEY_DOWN = KEY_DOWN KEY_MENU = KEY_TITLE KEY_BACK = KEY_BACK KEY_PLAYPAUSE = KEY_PLAY KEY_REWIND = KEY_REWIND KEY_HOMEPAGE = KEY_HOME KEY_FASTFORWARD = KEY_FASTFORWARD ================================================ FILE: packages/sysutils/eventlircd/evmap/bdremoteng.evmap ================================================ BTN_A = KEY_F1 BTN_B = KEY_F2 BTN_C = KEY_F3 BTN_X = KEY_F4 BNT_Y = KEY_F5 BTN_Z = KEY_F6 BTN_START = KEY_ENTER ================================================ FILE: packages/sysutils/eventlircd/evmap/cypress.evmap ================================================ # Cypress Receiver support # Bus=0003 Vendor=04b4 Product=0101 Version=0100 # N: Name="Cypress Cypress USB Keyboard / PS2 Mouse" # Bus=0003 Vendor=04b4 Product=0100 Version=0001 # N: Name="Cyp Se WitheHome" alt+meta+KEY_ENTER = KEY_MEDIA # Start Key ctrl+shift+KEY_P = KEY_PLAY # Play ctrl+KEY_R = KEY_RECORD # Record ctrl+KEY_P = KEY_PAUSE # Pause ctrl+KEY_S = KEY_STOP # Stop ctrl+shift+KEY_S = KEY_STOP # Stop ctrl+shift+KEY_F = KEY_FASTFORWARD # Forward ctrl+shift+KEY_B = KEY_REWIND # Reverse ctrl+shift+KEY_R = KEY_MEDIA_REPEAT # Repeat ctrl+KEY_F = KEY_NEXT # Next track ctrl+KEY_B = KEY_PREVIOUS # Pre-track KEY_PAGEDOWN = KEY_CHANNELDOWN # Channel Up KEY_PAGEUP = KEY_CHANNELUP # Channel Down KEY_KPASTERISK = KEY_NUMERIC_STAR # * shift+KEY_3 = KEY_NUMERIC_POUND # # KEY_BACKSPACE = KEY_EXIT # Back ctrl+KEY_V = KEY_MENU # Menu ctrl+shift+KEY_M = KEY_MENU # Menu KEY_COMPOSE = KEY_INFO # Information (also used for Mouse Right) KEY_F1 = KEY_EPG # Guide (also contextmenu) alt+KEY_ENTER = KEY_ZOOM # Zoom ctrl+KEY_E = KEY_VIDEO # My Videos ctrl+KEY_M = KEY_AUDIO # My Music ctrl+KEY_I = KEY_CAMERA # My Pictures ctrl+KEY_T = KEY_TV # My TV ctrl+shift+KEY_T = KEY_TV # My TV ctrl+KEY_A = KEY_RADIO # Radio ctrl+KEY_O = KEY_TUNER # Record TV ctrl+KEY_N = KEY_DVD # DVD ================================================ FILE: packages/sysutils/eventlircd/evmap/default.evmap ================================================ # nothing to remap ================================================ FILE: packages/sysutils/eventlircd/evmap/mcekbd.evmap ================================================ alt+meta+KEY_ENTER = KEY_MENU KEY_BACKSPACE = KEY_BACK KEY_EQUAL = KEY_CHANNELUP ctrl+KEY_EQUAL = KEY_CHANNELUP KEY_MINUS = KEY_CHANNELDOWN ctrl+KEY_MINUS = KEY_CHANNELDOWN ctrl+shift+KEY_T = KEY_TV ctrl+KEY_M = KEY_MP3 ctrl+KEY_E = KEY_VIDEO ctrl+KEY_I = KEY_MEDIA ctrl+KEY_G = KEY_PROGRAM ctrl+KEY_R = KEY_RECORD ctrl+KEY_D = KEY_MENU ctrl+shift+KEY_M = KEY_DVD ctrl+KEY_O = KEY_VCR ctrl+KEY_A = KEY_RADIO ctrl+KEY_U = KEY_SUBTITLE ctrl+KEY_P = KEY_PAUSE ctrl+shift+KEY_P = KEY_PLAY ctrl+shift+KEY_S = KEY_STOP ctrl+KEY_B = KEY_PREVIOUS ctrl+KEY_F = KEY_NEXT ctrl+shift+KEY_B = KEY_REWIND ctrl+shift+KEY_F = KEY_FORWARD KEY_F8 = KEY_MUTE KEY_F9 = KEY_VOLUMEDOWN KEY_F10 = KEY_VOLUMEUP ctrl+shift+KEY_C = KEY_TEXT ================================================ FILE: packages/sysutils/eventlircd/evmap/ps3remote.evmap ================================================ # PS3 Bluetooth remote KEY_EJECTCD = KEY_EJECT # Eject KEY_AUDIO = KEY_LANGUAGE # Audio KEY_ANGLE = KEY_ZOOM # Angle KEY_CLEAR = KEY_DELETE # Clear KEY_CONTEXT_MENU = KEY_EPG # Pop UP/MENU KEY_ESC = KEY_EXIT # Return KEY_BACK = KEY_EXIT # Back KEY_OPTION = KEY_OPTION # Options KEY_SCREEN = KEY_SCREEN # View BTN_0 = KEY_EXIT # X BTN_TL = KEY_VOLUMEUP # L1 -> Volume Upn BTN_TL2 = KEY_VOLUMEDOWN # L2 -> Volume down BTN_THUMBL = KEY_MUTE # L3 -> Mute KEY_HOMEPAGE = KEY_MEDIA # PS3 Menu KEY_SELECT = KEY_RECORD # Select BTN_START = KEY_ENTER # Start BTN_TR = KEY_CHANNELUP # R1 -> Channel Up BTN_TR2 = KEY_CHANNELDOWN # R2 -> Channel down BTN_THUMBR = KEY_PREVIOUS # R3 -> Previous Channel KEY_FORWARD = KEY_FASTFORWARD # Forward ================================================ FILE: packages/sysutils/eventlircd/evmap/skyqremote.evmap ================================================ # SKY Q bluetooth remote # Bus=0005 Vendor=119b Product=212b Version=0001 # Name="P218ruwido Sky Remote Keyboard" KEY_ESC = KEY_EXIT KEY_HOME = KEY_MEDIA KEY_F5 = KEY_MENU KEY_F10 = KEY_REWIND KEY_F11 = KEY_PLAY KEY_F12 = KEY_FASTFORWARD KEY_F1 = KEY_POWER KEY_F3 = KEY_STOP KEY_KPASTERISK = KEY_MUTE KEY_F9 = KEY_INFO KEY_PAGEUP = KEY_CHANNELUP KEY_PAGEDOWN = KEY_CHANNELDOWN KEY_F15 = KEY_TUNER KEY_F2 = KEY_EPG KEY_KPPLUS = KEY_VOLUMEUP KEY_KPMINUS = KEY_VOLUMEDOWN KEY_F4 = KEY_RED KEY_DELETE = KEY_GREEN KEY_INSERT = KEY_YELLOW KEY_END = KEY_BLUE KEY_F7 = KEY_RECORD ================================================ FILE: packages/sysutils/eventlircd/evmap/spinelplus.evmap ================================================ # 0471:0613 PHILIPS MCE USB IR Receiver- Spinel plus # 0471:206c PHILIPS MCE USB IR Receiver- Spinel plus # 0471:20cc PHILIPS MCE USB IR Receiver- Spinel plus shift+KEY_8 = KEY_NUMERIC_STAR # * shift+KEY_3 = KEY_NUMERIC_POUND # # KEY_SLEEP = KEY_POWER # Sleep # remapped to Power KEY_WAKEUP = KEY_POWER # WakeUp # remapped to Power KEY_STOPCD = KEY_STOP # Stop KEY_PLAYPAUSE = KEY_PLAY # Play/Pause KEY_PREVIOUSSONG = KEY_PREVIOUS # Prev KEY_NEXTSONG = KEY_NEXT # Next KEY_BACK = KEY_EXIT # BACK KEY_PROPS = KEY_INFO # Info/EPG KEY_PROGRAM = KEY_EPG # Program # remapped to EPG (Contextmenu) KEY_ESC = KEY_DELETE # Delete/Clear KEY_HOME = KEY_DELETE # Delete/Clear KEY_MP3 = KEY_AUDIO # Music ================================================ FILE: packages/sysutils/eventlircd/evmap/tevii_s660.evmap ================================================ # TiVii S660 Remote # Bus=0003 Vendor=9022 Product=d660 Version=0000 KEY_OK = KEY_ENTER # Ok KEY_F5 = KEY_ENTER # Enter KEY_PLAYPAUSE = KEY_PLAY # Play/Pause KEY_EPG = KEY_STOP # remap EPG to STOP, because there is no STOP button KEY_OPEN = KEY_NEXT # Next KEY_TIME = KEY_PREVIOUS # Prev KEY_F6 = KEY_MEDIA # HOME KEY_AUDIO = KEY_NUMERIC_POUND # Audio KEY_SUBTITLE = KEY_NUMERIC_STAR # Subtitle KEY_MENU = KEY_EXIT # Menu KEY_BACK = KEY_DELETE # Back KEY_SWITCHVIDEOMODE = KEY_ZOOM # Switch Video Mode (Zoom) KEY_F1 = KEY_VIDEO # Videos KEY_F2 = KEY_AUDIO # Music KEY_F3 = KEY_RADIO # Radio KEY_F4 = KEY_CAMERA # Pictures KEY_TUNER = KEY_TV # Live KEY_PVR = KEY_EPG # Play (EPG/PVR) ================================================ FILE: packages/sysutils/eventlircd/evmap/topseed.evmap ================================================ # Emprex BTX remote control # 046e:5577 BTC Emprex 2 # 046e:5578 BTC Emprex # 04f2:0618 Chicony Wireless # 0766:0204 Topseed Cyberlink # 1784:0004 Topseed 2 RF Combo shift+KEY_8 = KEY_NUMERIC_STAR # * shift+KEY_3 = KEY_NUMERIC_POUND # # KEY_BACK = KEY_EXIT # BACK KEY_ESC = KEY_DELETE # Delete/Clear KEY_SLEEP = KEY_POWER # Power KEY_STOPCD = KEY_STOP # Stop KEY_NEXTSONG = KEY_NEXT # Next KEY_MP3 = KEY_AUDIO # Music KEY_RADIO = KEY_ZOOM # Radio # Remap because we need the zoom key KEY_TV2 = KEY_EPG # EPG KEY_PROGRAM = KEY_SUBTITLE # Program # remapped to Subtitle KEY_PROPS = KEY_INFO # Info/EPG ================================================ FILE: packages/sysutils/eventlircd/evmap/wiimote.evmap ================================================ BTN_A = KEY_ENTER # Ok BTN_B = KEY_EXIT # Back/Exit KEY_PREVIOUS = KEY_VOLUMEDOWN # Vol- KEY_NEXT = KEY_VOLUMEUP # Vol+ BTN_MODE = KEY_MEDIA # Home BTN_1 = KEY_CHANNELUP # Channel Up BTN_2 = KEY_CHANNELDOWN # Channel Down ================================================ FILE: packages/sysutils/eventlircd/evmap/xiaomibtremote.evmap ================================================ KEY_POWER = KEY_MUTE KEY_F5 = KEY_PLAYPAUSE KEY_HOME = KEY_EPG KEY_BACK = KEY_EXIT ================================================ FILE: packages/sysutils/eventlircd/evmap/xiaomibtremoteAM.evmap ================================================ KEY_POWER = KEY_MUTE KEY_COMPOSE = KEY_STOPCD KEY_BACK = KEY_EXIT ================================================ FILE: packages/sysutils/eventlircd/package.mk ================================================ # 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) PKG_NAME="eventlircd" PKG_VERSION="fd511a9cc7de6af4517604fdc2b3f0f5b64c2a81" PKG_SHA256="4c7a93d31845085272e497611159910af69e37a0f70925f36880ba40f4693e23" PKG_LICENSE="GPL" PKG_SITE="https://github.com/LibreELEC/eventlircd" PKG_URL="https://github.com/LibreELEC/eventlircd/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain systemd lirc" PKG_LONGDESC="The eventlircd daemon provides four functions for LIRC devices" PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--with-udev-dir=/usr/lib/udev \ --with-lircd-socket=/run/lirc/lircd" post_makeinstall_target() { # install our own evmap files and udev rules rm -rf ${INSTALL}/etc/eventlircd.d rm -rf ${INSTALL}/usr/lib/udev/rules.d rm -rf ${INSTALL}/usr/lib/udev/lircd_helper mkdir -p ${INSTALL}/etc/eventlircd.d cp ${PKG_DIR}/evmap/*.evmap ${INSTALL}/etc/eventlircd.d } post_install() { enable_service eventlircd.service } ================================================ FILE: packages/sysutils/eventlircd/system.d/eventlircd.service ================================================ [Unit] Description=Eventlirc server daemon [Service] ExecStart=/usr/sbin/eventlircd -f --evmap=/etc/eventlircd.d --socket=/run/lirc/lircd KillMode=process TimeoutStopSec=1s [Install] WantedBy=multi-user.target ================================================ FILE: packages/sysutils/eventlircd/tmpfiles.d/z_62_eventlircd.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) d /run/lirc 0755 root root - - ================================================ FILE: packages/sysutils/eventlircd/udev.d/98-eventlircd.rules ================================================ ################################################################################ # An example udev rules file for eventlircd. # # This rules file does not start eventlircd. Many applications only check for # the lircd socket at application lauch. Therefore, it is better to start # eventlircd in an init script so that eventlircd creates the lircd socket # before any applications that use LIRC launch. ################################################################################ # eventlircd only does something for "add" and "remove" actions. ACTION!="add|remove", GOTO="end" # eventlircd only does something "input" subsystem devices. SUBSYSTEM!="input", GOTO="end" # eventlircd can only handle event devices. KERNEL!="event[0-9]*", GOTO="end" # eventlircd ignores devices created by eventlircd. ATTRS{name}=="eventlircd", GOTO="end" #------------------------------------------------------------------------------- # Ask eventlircd to handle input event devices created by lircd. For this to # work, lircd must be configured to output Linux input events and must be # configured to output key names that conform to the LIRC namespace derived from # the Linux key/button event names. This rule assumes that lircd performs all # key mappings, so the rule does not provide a value for "eventlircd_evmap". # For more information on lircd, see <http://www.lirc.org/>. #------------------------------------------------------------------------------- ATTRS{name}=="lircd", \ ENV{eventlircd_enable}="true" ATTRS{name}=="lircd-uinput", \ ENV{eventlircd_enable}="true" #------------------------------------------------------------------------------- # Ask eventlircd to handle input event devices created by bdremoteng. For this # to work, bdremoteng must be configured to output Linux input events and must # be configured to output key names that conform to LIRC namespace derived # from the Linux key/button event names. For more information on bdremoteng, # see <http://code.google.com/p/bdremote-ng/>. #------------------------------------------------------------------------------- ATTRS{name}=="bdremoteng", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="bdremoteng.evmap" #------------------------------------------------------------------------------- # Ask eventlircd to handle input event devices created by wminput. This rule # assumes that wminput performs all key mappings, so the rule does not provide a # value for "eventlircd_evmap" For more information on wminput, see # <http://abstrakraft.org/cwiid/>. #------------------------------------------------------------------------------- ATTRS{name}=="bdremoteng", \ ENV{eventlircd_enable}="true" #------------------------------------------------------------------------------- # Ask eventlircd to handle input event devices created by ir-core (kernel). #------------------------------------------------------------------------------- SUBSYSTEMS=="rc", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="default.evmap" #------------------------------------------------------------------------------- # Ask eventlircd to handle input event devices. #------------------------------------------------------------------------------- # Xiaomi Mi Box USA remote SUBSYSTEMS=="input", ATTRS{name}=="Xiaomi Remote", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="xiaomibtremote.evmap" # Xiaomi Mi Box aftermarket remote SUBSYSTEMS=="input", ATTRS{name}=="小米蓝牙遥控器", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="xiaomibtremoteAM.evmap" # iMON Ultrabay Front Panel SUBSYSTEMS=="input", ATTRS{name}=="iMON Panel, Knob and Mouse(15c2:ffdc)", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="default.evmap" SUBSYSTEMS=="input", ATTRS{name}=="*ruwido Sky Remote Keyboard", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="skyqremote.evmap" #------------------------------------------------------------------------------- # Ask eventlircd to handle USB HID devices that show up as event devices and are # known to be remote controls. For simplicity, the event map file names have the # format <BUSTYPE>_<VENDOR>_<PRODUCT>.evmap. #------------------------------------------------------------------------------- SUBSYSTEMS=="usb", GOTO="begin-usb" GOTO="end-usb" LABEL="begin-usb" ENV{ID_USB_INTERFACES}=="", IMPORT{builtin}="usb_id" ENV{ID_VENDOR_ID}=="0bc7", ENV{ID_MODEL_ID}=="0006", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="03_$env{ID_VENDOR_ID}_$env{ID_MODEL_ID}.evmap" ENV{ID_VENDOR_ID}=="0419", ENV{ID_MODEL_ID}=="0001", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="03_$env{ID_VENDOR_ID}_$env{ID_MODEL_ID}.evmap" ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c101", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="03_$env{ID_VENDOR_ID}_$env{ID_MODEL_ID}.evmap" ENV{ID_VENDOR_ID}=="046e", ENV{ID_MODEL_ID}=="5577", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="topseed.evmap" ENV{ID_VENDOR_ID}=="046e", ENV{ID_MODEL_ID}=="5578", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="topseed.evmap" ENV{ID_VENDOR_ID}=="04b4", ENV{ID_MODEL_ID}=="0100", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="cypress.evmap" ENV{ID_VENDOR_ID}=="04b4", ENV{ID_MODEL_ID}=="0101", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="cypress.evmap" ENV{ID_VENDOR_ID}=="04f2", ENV{ID_MODEL_ID}=="0618", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="topseed.evmap" ENV{ID_VENDOR_ID}=="0766", ENV{ID_MODEL_ID}=="0204", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="topseed.evmap" ENV{ID_VENDOR_ID}=="1784", ENV{ID_MODEL_ID}=="0004", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="topseed.evmap" ENV{ID_VENDOR_ID}=="03eb", ENV{ID_MODEL_ID}=="0002", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="03_$env{ID_VENDOR_ID}_$env{ID_MODEL_ID}.evmap" ENV{ID_VENDOR_ID}=="05a4", ENV{ID_MODEL_ID}=="9881", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="03_$env{ID_VENDOR_ID}_$env{ID_MODEL_ID}.evmap" ENV{ID_VENDOR_ID}=="0709", ENV{ID_MODEL_ID}=="9137", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="03_$env{ID_VENDOR_ID}_$env{ID_MODEL_ID}.evmap" ENV{ID_VENDOR_ID}=="0755", ENV{ID_MODEL_ID}=="2626", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="03_$env{ID_VENDOR_ID}_$env{ID_MODEL_ID}.evmap" ENV{ID_VENDOR_ID}=="1241", ENV{ID_MODEL_ID}=="e000", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="03_$env{ID_VENDOR_ID}_$env{ID_MODEL_ID}.evmap" ENV{ID_VENDOR_ID}=="13ec", ENV{ID_MODEL_ID}=="0006", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="03_$env{ID_VENDOR_ID}_$env{ID_MODEL_ID}.evmap" ENV{ID_VENDOR_ID}=="147a", ENV{ID_MODEL_ID}=="e02d", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="03_$env{ID_VENDOR_ID}_$env{ID_MODEL_ID}.evmap" ENV{ID_VENDOR_ID}=="18b1", ENV{ID_MODEL_ID}=="0037", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="03_$env{ID_VENDOR_ID}_$env{ID_MODEL_ID}.evmap" ENV{ID_VENDOR_ID}=="1d57", ENV{ID_MODEL_ID}=="ac01", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="03_$env{ID_VENDOR_ID}_$env{ID_MODEL_ID}.evmap" ATTRS{idVendor}=="9022", ATTRS{idProduct}=="d660", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="tevii_s660.evmap" ENV{ID_VENDOR_ID}=="0471", ENV{ID_MODEL_ID}=="0613", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="spinelplus.evmap" ENV{ID_VENDOR_ID}=="0471", ENV{ID_MODEL_ID}=="206c", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="spinelplus.evmap" ENV{ID_VENDOR_ID}=="0471", ENV{ID_MODEL_ID}=="20cc", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="spinelplus.evmap" # Enable wake-on-usb for the USB remotes. RUN+="wakeup_enable" LABEL="end-usb" #------------------------------------------------------------------------------- # Ask eventlircd to handle Bluetooth HID devices that show up as event devices # and are known to be remote controls. For simplicity, the event map file names # have the format <BUSTYPE>_<VENDOR>_<PRODUCT>.evmap. #------------------------------------------------------------------------------- SUBSYSTEMS=="bluetooth", GOTO="begin-bluetooth" GOTO="end-bluetooth" LABEL="begin-bluetooth" ATTRS{name}=="Nintendo Wii Remote", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="wiimote.evmap" ATTRS{name}=="BD Remote Control", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="ps3remote.evmap" #PS3 BD Remote Version 2 (Bluetooth AND infrared 3 in 1 remote) ATTRS{name}=="Sony Computer Entertainment Inc BD Remote Control", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="ps3remote.evmap" # Amazon Fire TV stick remote ATTRS{name}=="Amazon Fire TV Remote", \ ENV{eventlircd_enable}="true", \ ENV{eventlircd_evmap}="aftvsremote.evmap" LABEL="end-bluetooth" # tell libinput to ignore devices handled by eventlircd ENV{eventlircd_enable}=="true", ENV{LIBINPUT_IGNORE_DEVICE}="1" LABEL="end" ================================================ FILE: packages/sysutils/evrepeat/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="evrepeat" PKG_VERSION="0.0.1" PKG_SHA256="f1d14a12d700b9650562f8ec8ca593e6033f2e18b3d1fd1f44af29875152547e" PKG_LICENSE="GPL" PKG_SITE="https://github.com/HiassofT/evrepeat" PKG_URL="https://github.com/HiassofT/evrepeat/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Tool to view and change linux input device repeat settings" ================================================ FILE: packages/sysutils/evrepeat/udev.d/70-input-repeat.rules ================================================ ACTION=="add", SUBSYSTEM=="input", KERNEL=="event[0-9]*", GOTO="start" GOTO="end" LABEL="start" # don't change eventlircd device settings ATTRS{name}=="eventlircd", GOTO="end" # don't change settings of rc remotes SUBSYSTEMS=="rc", GOTO="end" # set default repeat delay to 500ms like rc remotes RUN+="/usr/bin/evrepeat -d 500 $devnode" LABEL="end" ================================================ FILE: packages/sysutils/exfatprogs/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="exfatprogs" PKG_VERSION="1.2.0" PKG_SHA256="56d9a49465deafc367d428afc71c8098705a30ee19a3cdf3c5320650b8880742" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/exfatprogs/exfatprogs" PKG_URL="https://github.com/exfatprogs/exfatprogs/releases/download/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="userspace utilities that contain all of the standard utilities for creating and fixing and debugging exfat filesystems." PKG_TOOLCHAIN="autotools" post_makeinstall_target() { rm -rf ${INSTALL}/usr/share } ================================================ FILE: packages/sysutils/fuse/package.mk ================================================ # 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="fuse" PKG_VERSION="2.9.9" PKG_SHA256="d0e69d5d608cc22ff4843791ad097f554dd32540ddc9bed7638cc6fea7c1b4b5" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libfuse/libfuse/" PKG_URL="https://github.com/libfuse/libfuse/releases/download/${PKG_NAME}-${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="FUSE provides a simple interface for userspace programs to export a virtual filesystem to the Linux kernel." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="MOUNT_FUSE_PATH=/usr/sbin \ --enable-lib \ --enable-util \ --disable-example \ --enable-mtab \ --disable-rpath \ --with-gnu-ld" post_makeinstall_target() { rm -rf ${INSTALL}/etc/init.d rm -rf ${INSTALL}/etc/udev } ================================================ FILE: packages/sysutils/fuse/patches/fuse-0001_aarch64-support.patch ================================================ fuse: add aarch64 support u64/u32 is not defined in sys/types.h, include linux/types.h like the kernel version of fuse.h does. Patch sent to upstream mailing list. Upstream-Status: Submitted Signed-off-by: Riku Voipio <riku.voipio@linaro.org> Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> --- include/fuse_kernel.h | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/include/fuse_kernel.h b/include/fuse_kernel.h index c632b58..e804278 100644 --- a/include/fuse_kernel.h +++ b/include/fuse_kernel.h @@ -88,12 +88,7 @@ #ifndef _LINUX_FUSE_H #define _LINUX_FUSE_H -#include <sys/types.h> -#define __u64 uint64_t -#define __s64 int64_t -#define __u32 uint32_t -#define __s32 int32_t -#define __u16 uint16_t +#include <linux/types.h> /* * Version negotiation: -- 1.8.1.2 ================================================ FILE: packages/sysutils/fuse/patches/fuse-0002-dont-run-update-rc.d.patch ================================================ --- a/util/Makefile.in 2017-06-23 22:47:36.762827097 +0200 +++ b/util/Makefile.in 2017-06-23 22:47:47.358852950 +0200 @@ -734,10 +734,6 @@ $(INSTALL_PROGRAM) $(builddir)/mount.fuse $(DESTDIR)$(MOUNT_FUSE_PATH)/mount.fuse $(MKDIR_P) $(DESTDIR)$(INIT_D_PATH) $(INSTALL_SCRIPT) $(srcdir)/init_script $(DESTDIR)$(INIT_D_PATH)/fuse - @if test -x /usr/sbin/update-rc.d; then \ - echo "/usr/sbin/update-rc.d fuse start 34 S . start 41 0 6 . || true"; \ - /usr/sbin/update-rc.d fuse start 34 S . start 41 0 6 . || true; \ - fi install-data-local: $(MKDIR_P) $(DESTDIR)$(UDEV_RULES_PATH) ================================================ FILE: packages/sysutils/fuse/patches/fuse-0003-build-with-glibc-2.34.patch ================================================ From ae2352bca9b4e607538412da0cc2a9625cd8b692 Mon Sep 17 00:00:00 2001 From: Sam James <sam@gentoo.org> Date: Sat, 24 Jul 2021 22:02:45 +0100 Subject: [PATCH] util/ulockmgr_server.c: conditionally define closefrom (fix glibc-2.34+) closefrom(3) has joined us in glibc-land from *BSD and Solaris. Since it's available in glibc 2.34+, we want to detect it and only define our fallback if the libc doesn't provide it. Bug: https://bugs.gentoo.org/803923 Signed-off-by: Sam James <sam@gentoo.org> --- configure.ac | 1 + util/ulockmgr_server.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/configure.ac b/configure.ac index 9946a0efa..a2d481aa9 100644 --- a/configure.ac +++ b/configure.ac @@ -55,6 +55,7 @@ fi AC_CHECK_FUNCS([fork setxattr fdatasync splice vmsplice utimensat]) AC_CHECK_FUNCS([posix_fallocate]) +AC_CHECK_FUNCS([closefrom]) AC_CHECK_MEMBERS([struct stat.st_atim]) AC_CHECK_MEMBERS([struct stat.st_atimespec]) diff --git a/util/ulockmgr_server.c b/util/ulockmgr_server.c index 273c7d923..a04dac5c6 100644 --- a/util/ulockmgr_server.c +++ b/util/ulockmgr_server.c @@ -22,6 +22,10 @@ #include <sys/socket.h> #include <sys/wait.h> +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + struct message { unsigned intr : 1; unsigned nofd : 1; @@ -124,6 +128,7 @@ static int receive_message(int sock, void *buf, size_t buflen, int *fdp, return res; } +#if !defined(HAVE_CLOSEFROM) static int closefrom(int minfd) { DIR *dir = opendir("/proc/self/fd"); @@ -141,6 +146,7 @@ static int closefrom(int minfd) } return 0; } +#endif static void send_reply(int cfd, struct message *msg) { ================================================ FILE: packages/sysutils/fuse-exfat/package.mk ================================================ # 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="fuse-exfat" PKG_VERSION="1.2.8" PKG_SHA256="1f357e7026407cba6617acd2a0109ede8292e5ede4addd918c65a7b700ef96cb" PKG_LICENSE="GPLv2+" PKG_SITE="https://github.com/relan/exfat" PKG_URL="https://github.com/relan/exfat/releases/download/v$PKG_VERSION/$PKG_NAME-$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain fuse" PKG_LONGDESC="This project aims to provide a full-featured exFAT file system implementation for GNU/Linux other Unix-like systems as a FUSE module." ================================================ FILE: packages/sysutils/fuse3/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="fuse3" PKG_VERSION="3.12.0" PKG_SHA256="33b8a92d6f7a88e6a889f0009206933482f48f3eb85d88cf09ef551313ac7373" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libfuse/libfuse/" PKG_URL="https://github.com/libfuse/libfuse/releases/download/fuse-${PKG_VERSION}/fuse-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain systemd" PKG_LONGDESC="FUSE is an interface for userspace programs to export a filesystem to the Linux kernel." PKG_MESON_OPTS_TARGET="-Ddisable-mtab=false \ -Dutils=true \ -Dexamples=false \ -Duseroot=false \ -Dtests=false" post_makeinstall_target() { rm -rf ${INSTALL}/etc rm -rf ${INSTALL}/usr/lib/udev } ================================================ FILE: packages/sysutils/gptfdisk/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="gptfdisk" PKG_VERSION="1.0.9" PKG_SHA256="dafead2693faeb8e8b97832b23407f6ed5b3219bc1784f482dd855774e2d50c2" PKG_LICENSE="GPL" PKG_SITE="http://www.rodsbooks.com/gdisk/" PKG_URL="https://downloads.sourceforge.net/project/${PKG_NAME}/${PKG_NAME}/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain popt crossguid" PKG_LONGDESC="GPT text-mode partitioning tools" make_target() { make sgdisk "CC=${CC}" "CXX=${CXX}" } makeinstall_target() { mkdir -p ${INSTALL}/usr/sbin/ cp -p sgdisk ${INSTALL}/usr/sbin/ } ================================================ FILE: packages/sysutils/gptfdisk/patches/0001-Fix-failure-crash-of-sgdisk-when-compiled-with-lates.patch ================================================ From 5d5e76d369a412bfb3d2cebb5fc0a7509cef878d Mon Sep 17 00:00:00 2001 From: Rod Smith <rodsmith@rodsbooks.com> Date: Fri, 15 Apr 2022 18:10:14 -0400 Subject: [PATCH 01/12] Fix failure & crash of sgdisk when compiled with latest popt (commit 740; presumably eventually release 1.19) --- NEWS | 8 ++++++++ gptcl.cc | 2 +- support.h | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index c7add56..9e153fd 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,11 @@ +1.0.10 (?/??/2022): +------------------- + +- Fixed problem that caused sgdisk to crash with errors about being unable + to read the disk's partition table when compiled with the latest popt + (commit 740, which is pre-release as I type; presumably version 1.19 and + later once released). + 1.0.9 (4/14/2022): ------------------ diff --git a/gptcl.cc b/gptcl.cc index 34c9421..0d578eb 100644 --- a/gptcl.cc +++ b/gptcl.cc @@ -155,7 +155,7 @@ int GPTDataCL::DoOptions(int argc, char* argv[]) { } // while // Assume first non-option argument is the device filename.... - device = (char*) poptGetArg(poptCon); + device = strdup((char*) poptGetArg(poptCon)); poptResetContext(poptCon); if (device != NULL) { diff --git a/support.h b/support.h index 8ba9ad1..f91f1bc 100644 --- a/support.h +++ b/support.h @@ -8,7 +8,7 @@ #include <stdlib.h> #include <string> -#define GPTFDISK_VERSION "1.0.9" +#define GPTFDISK_VERSION "1.0.9.1" #if defined (__FreeBSD__) || defined (__FreeBSD_kernel__) || defined (__APPLE__) // Darwin (Mac OS) & FreeBSD: disk IOCTLs are different, and there is no lseek64 -- 2.31.1 ================================================ FILE: packages/sysutils/gptfdisk/patches/0002-Updated-guid.cc-to-deal-with-minor-change-in-libuuid.patch ================================================ From 6a8416cbd12d55f882bb751993b94f72d338d96f Mon Sep 17 00:00:00 2001 From: Rod Smith <rodsmith@rodsbooks.com> Date: Sat, 16 Apr 2022 09:32:04 -0400 Subject: [PATCH 02/12] Updated guid.cc to deal with minor change in libuuid --- NEWS | 2 ++ guid.cc | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 9e153fd..9ec7e63 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,8 @@ (commit 740, which is pre-release as I type; presumably version 1.19 and later once released). +- Updated guid.cc to deal with minor change in libuuid. + 1.0.9 (4/14/2022): ------------------ diff --git a/guid.cc b/guid.cc index 1e73ab7..d3e4fd5 100644 --- a/guid.cc +++ b/guid.cc @@ -141,7 +141,7 @@ void GUIDData::Zero(void) { void GUIDData::Randomize(void) { int i, uuidGenerated = 0; -#ifdef _UUID_UUID_H +#if defined (_UUID_UUID_H) || defined (_UL_LIBUUID_UUID_H) uuid_generate(uuidData); ReverseBytes(&uuidData[0], 4); ReverseBytes(&uuidData[4], 2); -- 2.31.1 ================================================ FILE: packages/sysutils/gptfdisk/patches/0003-Updated-URLs-in-man-pages-to-HTTPS-rather-than-HTTP.patch ================================================ From 913f7b48647bdbd23fdc4abccf2168b061273aa4 Mon Sep 17 00:00:00 2001 From: Rod Smith <rodsmith@rodsbooks.com> Date: Tue, 26 Apr 2022 15:46:49 -0400 Subject: [PATCH 03/12] Updated URLs in man pages to HTTPS rather than HTTP --- cgdisk.8 | 8 ++++---- fixparts.8 | 4 ++-- gdisk.8 | 8 ++++---- sgdisk.8 | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/cgdisk.8 b/cgdisk.8 index e3b5cb4..bc83d4b 100644 --- a/cgdisk.8 +++ b/cgdisk.8 @@ -25,7 +25,7 @@ disks. For information on MBR vs. GPT, as well as GPT terminology and structure, see the extended GPT fdisk documentation at -\fIhttp://www.rodsbooks.com/gdisk/\fR or consult Wikipedia. +\fIhttps://www.rodsbooks.com/gdisk/\fR or consult Wikipedia. The \fBcgdisk\fR program employs a user interface similar to that of Linux's \fBcfdisk\fR, but \fBcgdisk\fR modifies GPT partitions. It also has the @@ -389,11 +389,11 @@ Contributors: .BR sgdisk (8), .BR fixparts (8). -\fIhttp://en.wikipedia.org/wiki/GUID_Partition_Table\fR +\fIhttps://en.wikipedia.org/wiki/GUID_Partition_Table\fR -\fIhttp://developer.apple.com/technotes/tn2006/tn2166.html\fR +\fIhttps://developer.apple.com/technotes/tn2006/tn2166.html\fR -\fIhttp://www.rodsbooks.com/gdisk/\fR +\fIhttps://www.rodsbooks.com/gdisk/\fR .SH "AVAILABILITY" The \fBcgdisk\fR command is part of the \fIGPT fdisk\fR package and is diff --git a/fixparts.8 b/fixparts.8 index da7462a..25d05ad 100644 --- a/fixparts.8 +++ b/fixparts.8 @@ -273,9 +273,9 @@ Contributors: .BR gdisk (8), .BR sgdisk (8). -\fIhttp://en.wikipedia.org/wiki/Master_boot_record\fR +\fIhttps://en.wikipedia.org/wiki/Master_boot_record\fR -\fIhttp://www.rodsbooks.com/fixparts/\fR +\fIhttps://www.rodsbooks.com/fixparts/\fR .SH "AVAILABILITY" The \fBfixparts\fR command is part of the \fIGPT fdisk\fR package and is diff --git a/gdisk.8 b/gdisk.8 index b826b89..8c9929b 100644 --- a/gdisk.8 +++ b/gdisk.8 @@ -27,7 +27,7 @@ recovery options require you to understand the distinctions between the main and backup data, as well as between the GPT headers and the partition tables. For information on MBR vs. GPT, as well as GPT terminology and structure, see the extended \fBgdisk\fR documentation at -\fIhttp://www.rodsbooks.com/gdisk/\fR or consult Wikipedia. +\fIhttps://www.rodsbooks.com/gdisk/\fR or consult Wikipedia. The \fBgdisk\fR program employs a user interface similar to that of Linux's \fBfdisk\fR, but \fBgdisk\fR modifies GPT partitions. It also has the @@ -702,11 +702,11 @@ Contributors: .BR sgdisk (8), .BR fixparts (8). -\fIhttp://en.wikipedia.org/wiki/GUID_Partition_Table\fR +\fIhttps://en.wikipedia.org/wiki/GUID_Partition_Table\fR -\fIhttp://developer.apple.com/technotes/tn2006/tn2166.html\fR +\fIhttps://developer.apple.com/technotes/tn2006/tn2166.html\fR -\fIhttp://www.rodsbooks.com/gdisk/\fR +\fIhttps://www.rodsbooks.com/gdisk/\fR .SH "AVAILABILITY" The \fBgdisk\fR command is part of the \fIGPT fdisk\fR package and is diff --git a/sgdisk.8 b/sgdisk.8 index b966a13..4e5a15a 100644 --- a/sgdisk.8 +++ b/sgdisk.8 @@ -23,7 +23,7 @@ recovery options require you to understand the distinctions between the main and backup data, as well as between the GPT headers and the partition tables. For information on MBR vs. GPT, as well as GPT terminology and structure, see the extended \fBgdisk\fR documentation at -\fIhttp://www.rodsbooks.com/gdisk/\fR or consult Wikipedia. +\fIhttps://www.rodsbooks.com/gdisk/\fR or consult Wikipedia. The \fBsgdisk\fR program employs a user interface that's based entirely on the command line, making it suitable for use in scripts or by experts who @@ -632,11 +632,11 @@ Contributors: .BR sfdisk (8), .BR fixparts (8). -\fIhttp://en.wikipedia.org/wiki/GUID_Partition_Table\fR +\fIhttps://en.wikipedia.org/wiki/GUID_Partition_Table\fR -\fIhttp://developer.apple.com/technotes/tn2006/tn2166.html\fR +\fIhttps://developer.apple.com/technotes/tn2006/tn2166.html\fR -\fIhttp://www.rodsbooks.com/gdisk/\fR +\fIhttps://www.rodsbooks.com/gdisk/\fR .SH "AVAILABILITY" The \fBsgdisk\fR command is part of the \fIGPT fdisk\fR package and is -- 2.31.1 ================================================ FILE: packages/sysutils/gptfdisk/patches/0004-Fix-NULL-dereference-when-duplicating-string-argumen.patch ================================================ From f5de3401b974ce103ffd93af8f9d43505a04aaf9 Mon Sep 17 00:00:00 2001 From: Damian Kurek <starfire24680@gmail.com> Date: Thu, 7 Jul 2022 03:39:16 +0000 Subject: [PATCH 04/12] Fix NULL dereference when duplicating string argument poptGetArg can return NULL if there are no additional arguments, which makes strdup dereference NULL on strlen --- gptcl.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gptcl.cc b/gptcl.cc index 0d578eb..ab95239 100644 --- a/gptcl.cc +++ b/gptcl.cc @@ -155,10 +155,11 @@ int GPTDataCL::DoOptions(int argc, char* argv[]) { } // while // Assume first non-option argument is the device filename.... - device = strdup((char*) poptGetArg(poptCon)); - poptResetContext(poptCon); + device = (char*) poptGetArg(poptCon); if (device != NULL) { + device = strdup(device); + poptResetContext(poptCon); JustLooking(); // reset as necessary BeQuiet(); // Tell called functions to be less verbose & interactive if (LoadPartitions((string) device)) { @@ -498,6 +499,7 @@ int GPTDataCL::DoOptions(int argc, char* argv[]) { cerr << "Error encountered; not saving changes.\n"; retval = 4; } // if + free(device); } // if (device != NULL) poptFreeContext(poptCon); return retval; -- 2.31.1 ================================================ FILE: packages/sysutils/gptfdisk/patches/0005-Use-64bit-time_t-on-linux-as-well.patch ================================================ From 7dfa8984f5a30f313d8675ff6097c8592d636d10 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Mon, 12 Dec 2022 12:50:07 -0800 Subject: [PATCH 05/12] Use 64bit time_t on linux as well Alias 64bit version of stat functions to original functions we are already passing -D_FILE_OFFSET_BITS=64 in linux Makefile Signed-off-by: Khem Raj <raj.khem@gmail.com> --- diskio-unix.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/diskio-unix.cc b/diskio-unix.cc index 7780aeb..0897c56 100644 --- a/diskio-unix.cc +++ b/diskio-unix.cc @@ -37,8 +37,12 @@ using namespace std; -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(__linux__) #define off64_t off_t +#define stat64 stat +#define fstat64 fstat +#define lstat64 lstat +#define lseek64 lseek #endif // Returns the official "real" name for a shortened version of same. -- 2.31.1 ================================================ FILE: packages/sysutils/gptfdisk/patches/0006-Allow-partition-dynamically-allocated-by-largest-new.patch ================================================ From caf30c022c5f659bb7a5e52272c6aeca94098c70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Joaqu=C3=ADn=20Shourabi=20Porcel?= <david@djsp.eu> Date: Sat, 28 Jan 2023 16:19:16 +0100 Subject: [PATCH 06/12] Allow partition dynamically allocated by --largest-new to be referenced by other options The documentation for the option --new explains that: > [a] partnum value of 0 causes the program to use the first available > partition number. Subsequent uses of the -A (--attributes), -c > (--change-name), -t (--typecode), and -u (--partition-guid) options > may also use 0 to refer to the same partition. Although the documentation for the option --largest-new does not mention such functionality, I expected it, and was puzzled when it didn't work. --- gptcl.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gptcl.cc b/gptcl.cc index 0d578eb..e8d394a 100644 --- a/gptcl.cc +++ b/gptcl.cc @@ -331,8 +331,10 @@ int GPTDataCL::DoOptions(int argc, char* argv[]) { startSector = FindFirstInLargest(); Align(&startSector); endSector = FindLastInFree(startSector, alignEnd); - if (largestPartNum <= 0) + if (largestPartNum <= 0) { largestPartNum = FindFirstFreePart() + 1; + newPartNum = largestPartNum - 1; + } if (CreatePartition(largestPartNum - 1, startSector, endSector)) { saveData = 1; } else { -- 2.31.1 ================================================ FILE: packages/sysutils/gptfdisk/patches/0007-Document-recent-merge.patch ================================================ From 3c4a9fbd1d71fbd3aff0c83ec3ac9b2a0d9ba748 Mon Sep 17 00:00:00 2001 From: Rod Smith <rodsmith@rodsbooks.com> Date: Sun, 5 Mar 2023 10:57:24 -0500 Subject: [PATCH 07/12] Document recent merge. --- NEWS | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 9ec7e63..f9f7f19 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -1.0.10 (?/??/2022): +1.0.10 (?/??/2023): ------------------- - Fixed problem that caused sgdisk to crash with errors about being unable @@ -8,6 +8,8 @@ - Updated guid.cc to deal with minor change in libuuid. +- Fixed potential NULL derefernce bug in sgdisk. + 1.0.9 (4/14/2022): ------------------ -- 2.31.1 ================================================ FILE: packages/sysutils/gptfdisk/patches/0008-Document-recent-mergest.patch ================================================ From e7a566bd96573b3f71001d0215dab93dcdd120d9 Mon Sep 17 00:00:00 2001 From: Rod Smith <rodsmith@rodsbooks.com> Date: Sun, 5 Mar 2023 11:26:49 -0500 Subject: [PATCH 08/12] Document recent mergest --- NEWS | 7 ++++++- sgdisk.8 | 7 +++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index f9f7f19..8d5b365 100644 --- a/NEWS +++ b/NEWS @@ -8,7 +8,12 @@ - Updated guid.cc to deal with minor change in libuuid. -- Fixed potential NULL derefernce bug in sgdisk. +- Fixed potential NULL derefernce bug in sgdisk. Thanks to Damian Kurek + for this fix. + +- The partition number of "0" can now be used to reference newly-created + partitions when the --largest-new=0 option to sgdisk is used. Thanks to + David Joaqun Shourabi Porcel for this improvement. 1.0.9 (4/14/2022): ------------------ diff --git a/sgdisk.8 b/sgdisk.8 index 4e5a15a..fa53b29 100644 --- a/sgdisk.8 +++ b/sgdisk.8 @@ -370,8 +370,11 @@ to use the first available partition number. Subsequent uses of the .B \-N, \-\-largest\-new=num Create a new partition that fills the largest available block of space on the disk. You can use the \fI\-a\fR (\fI\-\-set\-alignment\fR) option to -adjust the alignment, if desired. A num value of 0 causes the program to -use the first available partition number. +adjust the alignment, if desired. A num value of 0 causes the program to use +the first available partition number. Subsequent uses of the \fI\-A\fR +(\fI\-\-attributes\fR), \fI\-c\fR (\fI\-\-change\-name\fR), \fI\-t\fR +(\fI\-\-typecode\fR), and \fI\-u\fR (\fI\-\-partition\-guid\fR) options may +also use \fI0\fR to refer to the same partition. .TP .B \-o, \-\-clear -- 2.31.1 ================================================ FILE: packages/sysutils/gptfdisk/patches/0009-Do-some-explicit-casts-in-gptcurses.cc-to-eliminate-.patch ================================================ From 42eea87e89bdbf4c4548e88428513717a601e05d Mon Sep 17 00:00:00 2001 From: Rod Smith <rodsmith@rodsbooks.com> Date: Mon, 6 Mar 2023 14:21:35 -0500 Subject: [PATCH 09/12] Do some explicit casts in gptcurses.cc to eliminate compiler warnings. --- NEWS | 3 +++ gptcurses.cc | 13 +++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index 8d5b365..dc1660e 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,9 @@ partitions when the --largest-new=0 option to sgdisk is used. Thanks to David Joaqun Shourabi Porcel for this improvement. +- Make explicit casts in gptcurses.cc to eliminate compiler warnings about + mis-matched types in printw() statements. + 1.0.9 (4/14/2022): ------------------ diff --git a/gptcurses.cc b/gptcurses.cc index 8b0ae91..64cc514 100644 --- a/gptcurses.cc +++ b/gptcurses.cc @@ -333,13 +333,13 @@ void GPTDataCurses::ShowInfo(int partNum) { printw("Partition GUID code: %s (%s)\n", partitions[partNum].GetType().AsString().c_str(), partitions[partNum].GetTypeName().c_str()); printw("Partition unique GUID: %s\n", partitions[partNum].GetUniqueGUID().AsString().c_str()); - printw("First sector: %lld (at %s)\n", partitions[partNum].GetFirstLBA(), + printw("First sector: %llu (at %s)\n", (long long unsigned int) partitions[partNum].GetFirstLBA(), BytesToIeee(partitions[partNum].GetFirstLBA(), blockSize).c_str()); - printw("Last sector: %lld (at %s)\n", partitions[partNum].GetLastLBA(), + printw("Last sector: %llu (at %s)\n", (long long unsigned int) partitions[partNum].GetLastLBA(), BytesToIeee(partitions[partNum].GetLastLBA(), blockSize).c_str()); size = partitions[partNum].GetLastLBA() - partitions[partNum].GetFirstLBA() + 1; - printw("Partition size: %lld sectors (%s)\n", size, BytesToIeee(size, blockSize).c_str()); - printw("Attribute flags: %016llx\n", partitions[partNum].GetAttributes().GetAttributes()); + printw("Partition size: %llu sectors (%s)\n", (long long unsigned int) size, BytesToIeee(size, blockSize).c_str()); + printw("Attribute flags: %016llx\n", (long long unsigned int) partitions[partNum].GetAttributes().GetAttributes()); #ifdef USE_UTF16 partitions[partNum].GetDescription().extract(0, NAME_SIZE , temp, NAME_SIZE ); printw("Partition name: '%s'\n", temp); @@ -447,7 +447,8 @@ void GPTDataCurses::MakeNewPart(void) { clrtoeol(); newFirstLBA = currentSpace->firstLBA; Align(&newFirstLBA); - printw("First sector (%lld-%lld, default = %lld): ", newFirstLBA, currentSpace->lastLBA, newFirstLBA); + printw("First sector (%llu-%llu, default = %llu): ", (long long unsigned int) newFirstLBA, + (long long unsigned int) currentSpace->lastLBA, (long long unsigned int) newFirstLBA); echo(); getnstr(inLine, 79); noecho(); @@ -461,7 +462,7 @@ void GPTDataCurses::MakeNewPart(void) { while ((newLastLBA > currentSpace->lastLBA) || (newLastLBA < newFirstLBA)) { move(LINES - 3, 0); clrtoeol(); - printw("Size in sectors or {KMGTP} (default = %lld): ", size); + printw("Size in sectors or {KMGTP} (default = %llu): ", (long long unsigned int) size); echo(); getnstr(inLine, 79); noecho(); -- 2.31.1 ================================================ FILE: packages/sysutils/gptfdisk/patches/0010-Truncate-decimal-inputs-e.g.-9.5G-becomes-9G.patch ================================================ From e1cc654ef71996d836c5d051278130f50f768f84 Mon Sep 17 00:00:00 2001 From: Rod Smith <rodsmith@rodsbooks.com> Date: Mon, 6 Mar 2023 17:22:32 -0500 Subject: [PATCH 10/12] Truncate decimal inputs (e.g., '9.5G' becomes '9G') --- support.cc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/support.cc b/support.cc index 0d3bd6f..3cbabf7 100644 --- a/support.cc +++ b/support.cc @@ -124,6 +124,8 @@ char GetYN(void) { // inValue works out to something outside the range low-high, returns the // computed value; the calling function is responsible for checking the // validity of this value. +// If inValue contains a decimal number (e.g., "9.5G"), quietly truncate it +// (to "9G" in this example). // NOTE: There's a difference in how GCC and VC++ treat oversized values // (say, "999999999999999999999") read via the ">>" operator; GCC turns // them into the maximum value for the type, whereas VC++ turns them into @@ -158,6 +160,15 @@ uint64_t IeeeToInt(string inValue, uint64_t sSize, uint64_t low, uint64_t high, badInput = 1; inString >> response >> suffix; suffix = toupper(suffix); + foundAt = suffixes.find(suffix); + // If suffix is invalid, try to find a valid one. Done because users + // sometimes enter decimal numbers; when they do, suffix becomes + // '.', and we need to truncate the number and find the real suffix. + while (foundAt > (suffixes.length() - 1) && inString.peek() != -1) { + inString >> suffix; + foundAt = suffixes.find(suffix); + suffix = toupper(suffix); + } // If no response, or if response == 0, use default (def) if ((inValue.length() == 0) || (response == 0)) { @@ -167,7 +178,6 @@ uint64_t IeeeToInt(string inValue, uint64_t sSize, uint64_t low, uint64_t high, } // if // Find multiplication and division factors for the suffix - foundAt = suffixes.find(suffix); if (foundAt != string::npos) { bytesPerUnit = UINT64_C(1) << (10 * (foundAt + 1)); mult = bytesPerUnit / sSize; -- 2.31.1 ================================================ FILE: packages/sysutils/gptfdisk/patches/0011-Document-previous-merge.patch ================================================ From 0e7d63502f6ea68b5c56036c493e72e83b3f145d Mon Sep 17 00:00:00 2001 From: Rod Smith <rodsmith@rodsbooks.com> Date: Mon, 6 Mar 2023 17:28:18 -0500 Subject: [PATCH 11/12] Document previous merge --- NEWS | 7 +++++++ support.h | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index dc1660e..5c6dfa1 100644 --- a/NEWS +++ b/NEWS @@ -18,6 +18,13 @@ - Make explicit casts in gptcurses.cc to eliminate compiler warnings about mis-matched types in printw() statements. +- In previous versions, rEFInd accepted only integer values for partition + start points, end points, and sizes, and it interpreted decimal values + incorrectly. That is, if you typed "+9.5G" as the partition end point, + you'd end up with something just 9 sectors in size. This version now + truncates decimal numbers to their integral values, so you'd get a 9 GiB + partition instead. + 1.0.9 (4/14/2022): ------------------ diff --git a/support.h b/support.h index f91f1bc..4a9f414 100644 --- a/support.h +++ b/support.h @@ -8,7 +8,7 @@ #include <stdlib.h> #include <string> -#define GPTFDISK_VERSION "1.0.9.1" +#define GPTFDISK_VERSION "1.0.9.2" #if defined (__FreeBSD__) || defined (__FreeBSD_kernel__) || defined (__APPLE__) // Darwin (Mac OS) & FreeBSD: disk IOCTLs are different, and there is no lseek64 -- 2.31.1 ================================================ FILE: packages/sysutils/gptfdisk/patches/0012-Minor-code-cleanup-based-on-valgrind-analysis.patch ================================================ From cb4bf320748f701a0ed835d4a410f2960f1ce0bd Mon Sep 17 00:00:00 2001 From: Rod Smith <rodsmith@rodsbooks.com> Date: Fri, 10 Mar 2023 13:28:00 -0500 Subject: [PATCH 12/12] Minor code cleanup based on valgrind analysis --- NEWS | 2 ++ gpt.cc | 1 + 2 files changed, 3 insertions(+) diff --git a/NEWS b/NEWS index 5c6dfa1..29d99e3 100644 --- a/NEWS +++ b/NEWS @@ -18,6 +18,8 @@ - Make explicit casts in gptcurses.cc to eliminate compiler warnings about mis-matched types in printw() statements. +- Minor code cleanup based on valgrind analysis. + - In previous versions, rEFInd accepted only integer values for partition start points, end points, and sizes, and it interpreted decimal values incorrectly. That is, if you typed "+9.5G" as the partition end point, diff --git a/gpt.cc b/gpt.cc index 76cd9ad..24d6918 100644 --- a/gpt.cc +++ b/gpt.cc @@ -80,6 +80,7 @@ GPTData::GPTData(void) { beQuiet = 0; whichWasUsed = use_new; mainHeader.numParts = 0; + mainHeader.firstUsableLBA = 0; mainHeader.lastUsableLBA = 0; numParts = 0; SetGPTSize(NUM_GPT_ENTRIES); -- 2.31.1 ================================================ FILE: packages/sysutils/ir-bpf-decoders/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ir-bpf-decoders" PKG_VERSION="1.22.0" PKG_SHA256="9743e49dd725f9fb7d0410f3481931156d69fd8305184baa883ed94038fc79fc" PKG_LICENSE="GPLv2+" PKG_SITE="https://linuxtv.org/" PKG_URL="https://github.com/LibreELEC/ir-bpf-decoders/archive/v4l-utils-${PKG_VERSION}.tar.gz" PKG_LONGDESC="ir-bpf-decoders: precompiled binaries of IR BPF decoders from v4l-utils utils/keytable/bpf_protocols" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/udev/rc_keymaps/protocols cp ${PKG_BUILD}/*.o ${INSTALL}/usr/lib/udev/rc_keymaps/protocols } ================================================ FILE: packages/sysutils/keyutils/package.mk ================================================ # 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="keyutils" PKG_VERSION="1.6.3" PKG_SHA256="a61d5706136ae4c05bd48f86186bcfdbd88dd8bd5107e3e195c924cfc1b39bb4" PKG_LICENSE="GPL" PKG_SITE="https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/keyutils.git/" PKG_URL="https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/keyutils.git/snapshot/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Keyutils is a set of utilities for managing the key retention facility in the kernel." PKG_BUILD_FLAGS="+pic" PKG_MAKE_OPTS_TARGET="NO_ARLIB=0 NO_SOLIB=1 BINDIR=/usr/bin SBINDIR=/usr/sbin LIBDIR=/usr/lib USRLIBDIR=/usr/lib" PKG_MAKEINSTALL_OPTS_TARGET="${PKG_MAKE_OPTS_TARGET}" post_makeinstall_target() { rm -rf ${INSTALL}/usr/share rmdir ${INSTALL}/etc/request-key.d ln -sf /storage/.config/request-key.d ${INSTALL}/etc/request-key.d } ================================================ FILE: packages/sysutils/keyutils/patches/keyutils-02-cflags.patch ================================================ From d8f15e55b4d357ac0a2b384888080b120600d09d Mon Sep 17 00:00:00 2001 From: vpeter4 <peter.vicman@gmail.com> Date: Wed, 8 Apr 2015 18:27:06 +0200 Subject: [PATCH] cflags --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c904eaf..df0fe3e 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ CPPFLAGS := -I. -CFLAGS := -g -Wall -Werror -CXXFLAGS := -g -Wall -Werror +CFLAGS += -g -Wall -Werror +CXXFLAGS += -g -Wall -Werror INSTALL := install DESTDIR := -- 1.8.1.2 ================================================ FILE: packages/sysutils/kmod/modprobe.d/aliases.conf ================================================ # These are the standard aliases for devices and kernel drivers. # This file does not need to be modified. # # Please file a bug against module-init-tools if a package needs a entry # in this file. # network protocols ########################################################## alias net-pf-1 unix alias net-pf-2 ipv4 alias net-pf-3 ax25 alias net-pf-4 ipx alias net-pf-5 appletalk alias net-pf-6 netrom alias net-pf-7 bridge alias net-pf-8 atm alias net-pf-9 x25 alias net-pf-10 ipv6 alias net-pf-11 rose alias net-pf-12 decnet # 13 NETBEUI alias net-pf-15 af_key alias net-pf-16 af_netlink alias net-pf-17 af_packet # 18 ASH alias net-pf-19 af_econet alias net-pf-20 atm # 22 SNA alias net-pf-23 irda alias net-pf-24 pppoe alias net-pf-25 wanrouter alias net-pf-26 llc alias net-pf-31 bluetooth alias net-pf-16-proto-1 wire alias net-pf-16-proto-3 ip_queue alias net-pf-16-proto-4 tcp_diag alias net-pf-16-proto-8 scsi_transport_iscsi alias net-pf-16-proto-9 audit alias net-pf-16-proto-11 cn alias net-pf-16-proto-13 ip6_queue # executables formats ######################################################## install binfmt-0000 /bin/true alias binfmt-204 binfmt_aout alias binfmt-263 binfmt_aout alias binfmt-264 binfmt_aout alias binfmt-267 binfmt_aout alias binfmt-387 binfmt_aout # block devices ############################################################## alias block-major-3-* ide_generic alias block-major-8-* sd_mod alias block-major-9-* md alias block-major-11-* sr_mod alias block-major-22-* ide_generic alias block-major-33-* ide_generic alias block-major-34-* ide_generic alias block-major-37-* ide_tape alias block-major-44-* ftl alias block-major-46-* pcd alias block-major-47-* pf alias block-major-56-* ide_generic alias block-major-57-* ide_generic alias block-major-58-* lvm_mod alias block-major-88-* ide_generic alias block-major-89-* ide_generic alias block-major-90-* ide_generic alias block-major-91-* ide_generic alias block-major-93-* nftl alias block-major-97-* pg # character devices ########################################################## alias char-major-9-* st alias char-major-10-1 psmouse alias char-major-10-139 openprom alias char-major-10-157 applicom alias char-major-10-181 toshiba alias char-major-10-183 hw_random alias char-major-10-187 irnet alias char-major-10-189 ussp alias char-major-10-250 hci_vhci alias char-major-13-0 joydev alias char-major-13-1 joydev alias char-major-13-2 joydev alias char-major-13-3 joydev alias char-major-13-32 mousedev alias char-major-13-33 mousedev alias char-major-13-34 mousedev alias char-major-13-35 mousedev alias char-major-13-63 mousedev alias char-major-13-64 evdev alias char-major-13-65 evdev alias char-major-13-66 evdev alias char-major-13-67 evdev alias char-major-19-* cyclades alias char-major-20-* cyclades alias char-major-22-* pcxx alias char-major-23-* pcxx alias char-major-27-* ftape alias char-major-34-* scc alias char-major-35-* tclmidi alias char-major-48-* riscom8 alias char-major-49-* riscom8 alias char-major-57-* esp alias char-major-58-* esp alias char-major-63-* kdebug alias char-major-67-* coda alias char-major-75-* specialix alias char-major-76-* specialix alias char-major-81-* videodev alias char-major-83-* vtx alias char-major-89-* i2c_dev alias char-major-90-* mtdchar alias char-major-96-* pt alias char-major-97-* pg alias char-major-107-* 3dfx alias char-major-109-* lvm_mod alias char-major-166-* cdc_acm alias char-major-171-0 raw1394 alias char-major-171-1 video1394 alias char-major-171-2 dv1394 alias char-major-171-3 amdtp alias char-major-180-* usbcore alias char-major-195-* nvidia alias char-major-200-* vxspec alias char-major-202-* msr alias char-major-203-* cpuid alias char-major-206-* osst alias char-major-208-* ussp alias char-major-227-* tub3270 #alias char-major-240-* usb-serial #alias char-major-240-* hsfserial #alias char-major-241-* hsfserial # misc ####################################################################### alias xfrm-type-2-4 xfrm4_tunnel alias xfrm-type-2-50 esp4 alias xfrm-type-2-51 ah4 alias xfrm-type-2-108 ipcomp alias xfrm-type-10-41 xfrm6_tunnel alias xfrm-type-10-50 esp6 alias xfrm-type-10-51 ah6 alias xfrm-type-10-108 ipcomp6 alias bt-proto-0 l2cap alias bt-proto-2 sco alias bt-proto-3 rfcomm alias bt-proto-4 bnep alias bt-proto-5 cmtp alias bt-proto-6 hidp alias bt-proto-7 avdtp alias cipcb0 cipcb alias cipcb1 cipcb alias cipcb2 cipcb alias cipcb3 cipcb alias dummy0 dummy alias dummy1 dummy alias plip0 plip alias plip1 plip alias slip0 slip alias slip1 slip alias tunl0 ipip alias gre0 ip_gre alias usbdevfs usbcore # work around other kernel issues ############################################ # The EHCI driver should be loaded before the ones for low speed controllers # or some devices may be confused when they are disconnected and reconnected. softdep uhci-hcd pre: ehci-hcd softdep ohci-hcd pre: ehci-hcd ================================================ FILE: packages/sysutils/kmod/modprobe.d/i2c.conf ================================================ alias char-major-89 i2c-dev ================================================ FILE: packages/sysutils/kmod/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="kmod" PKG_VERSION="30" PKG_SHA256="f897dd72698dc6ac1ef03255cd0a5734ad932318e4adbaebc7338ef2f5202f9f" PKG_LICENSE="GPL" PKG_SITE="https://git.kernel.org/pub/scm/utils/kernel/kmod/kmod.git" PKG_URL="https://www.kernel.org/pub/linux/utils/kernel/kmod/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="kmod offers the needed flexibility and fine grained control over insertion, removal, configuration and listing of kernel modules." PKG_CONFIGURE_OPTS_HOST="--enable-tools \ --disable-logging \ --disable-debug \ --disable-manpages \ --with-gnu-ld \ --without-xz \ --without-zlib \ --without-zstd" PKG_CONFIGURE_OPTS_TARGET="--enable-tools \ --enable-logging \ --disable-debug \ --disable-manpages \ --with-gnu-ld \ --without-xz \ --without-zlib \ --without-zstd" post_makeinstall_host() { ln -sf kmod ${TOOLCHAIN}/bin/depmod } post_makeinstall_target() { # make symlinks for compatibility mkdir -p ${INSTALL}/usr/sbin ln -sf /usr/bin/kmod ${INSTALL}/usr/sbin/lsmod ln -sf /usr/bin/kmod ${INSTALL}/usr/sbin/insmod ln -sf /usr/bin/kmod ${INSTALL}/usr/sbin/rmmod ln -sf /usr/bin/kmod ${INSTALL}/usr/sbin/modinfo ln -sf /usr/bin/kmod ${INSTALL}/usr/sbin/modprobe ln -sf /usr/bin/kmod ${INSTALL}/usr/sbin/depmod mkdir -p ${INSTALL}/etc ln -sf /storage/.config/modprobe.d ${INSTALL}/etc/modprobe.d # add user modprobe.d dir mkdir -p ${INSTALL}/usr/config/modprobe.d } ================================================ FILE: packages/sysutils/kmod/patches/kmod-02_fix-pkgconf.patch ================================================ From 19b848e18e0eaaec75d3d840b5831b82f7c6b5b5 Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Sat, 16 Aug 2014 13:39:55 +0300 Subject: [PATCH] fix pkgconf --- libkmod/libkmod.pc.in | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libkmod/libkmod.pc.in b/libkmod/libkmod.pc.in index e4fdf21..c4f1465 100644 --- a/libkmod/libkmod.pc.in +++ b/libkmod/libkmod.pc.in @@ -1,7 +1,7 @@ prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include Name: libkmod Description: Library to deal with kernel modules -- 1.7.2.5 ================================================ FILE: packages/sysutils/libdevmapper/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="libdevmapper" PKG_VERSION="2.03.23" PKG_SHA256="74e794a9e9dee1bcf8a2065f65b9196c44fdf321e22d63b98ed7de8c9aa17a5d" PKG_ARCH="any" PKG_LICENSE="GPLv2 LGPL2.1" PKG_SITE="https://sourceware.org/lvm2" PKG_URL="https://sourceware.org/ftp/lvm2/LVM2.$PKG_VERSION.tgz" PKG_SOURCE_DIR="LVM2.$PKG_VERSION" PKG_DEPENDS_TARGET="toolchain libaio util-linux" PKG_SECTION="sysutils" PKG_SHORTDESC="Logical Volume Manager 2 - only libdevmapper library." PKG_BUILD_FLAGS="-gold" LVM2_CONFIG_DEFAULT="ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes \ --disable-use-lvmlockd \ --disable-selinux \ --disable-dbus-service \ --with-cache=none \ --with-thin=none \ --with-clvmd=none \ --with-cluster=none" PKG_CONFIGURE_OPTS_TARGET="$LVM2_CONFIG_DEFAULT \ --with-optimisation=-Os \ --disable-readline \ --disable-applib \ --disable-cmdlib \ --disable-blkid_wiping \ --disable-use-lvmetad \ --with-mirrors=none \ --disable-use-lvmpolld \ --disable-dmeventd \ --disable-dmfilemapd \ --disable-blkdeactivate \ --disable-udev_sync \ --disable-udev_rules \ --disable-pkgconfig \ --disable-fsadm \ --disable-nls" PKG_MAKEINSTALL_OPTS_TARGET="install_dynamic \ install_include \ -C libdm" makeinstall_target() { make install DESTDIR=${SYSROOT_PREFIX} -j1 \ ${PKG_MAKEINSTALL_OPTS_TARGET} M_INSTALL_PROGRAM="-m 755" make install DESTDIR=${INSTALL} \ ${PKG_MAKEINSTALL_OPTS_TARGET} M_INSTALL_PROGRAM="-m 755" } ================================================ FILE: packages/sysutils/libevdev/package.mk ================================================ # 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="libevdev" PKG_VERSION="1.13.0" PKG_SHA256="9edf2006cc86a5055279647c38ec923d11a821ee4dc2c3033e8d20e8ee237cd9" PKG_LICENSE="MIT" PKG_SITE="http://www.freedesktop.org/wiki/Software/libevdev/" PKG_URL="http://www.freedesktop.org/software/libevdev/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="libevdev is a wrapper library for evdev devices." PKG_BUILD_FLAGS="+pic" PKG_MESON_OPTS_TARGET=" \ -Ddefault_library=shared \ -Ddocumentation=disabled \ -Dtests=disabled" post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/sysutils/libhid/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libhid" PKG_VERSION="9bbcb6484c91e2594614412e12ae85a144839634" # 0.2.17 + fixes PKG_SHA256="983c6fa0b46b67805a81eb600a6c4728b645ac7b014b4897d5aa212576105567" PKG_LICENSE="GPL" PKG_SITE="http://libhid.alioth.debian.org/" PKG_URL="https://github.com/chad3814/libhid/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libusb-compat libusb" PKG_LONGDESC="libhid provides a generic and flexible way to access and interact with USB HID devices." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--disable-shared \ --enable-static \ --disable-werror \ --disable-swig" post_makeinstall_target() { rm -rf ${INSTALL}/usr } ================================================ FILE: packages/sysutils/libhid/patches/libhid-0.2.16-automake-1.13.patch ================================================ diff -Naur libhid-0.2.16/configure.ac libhid-0.2.16.patch/configure.ac --- libhid-0.2.16/configure.ac 2007-04-01 22:32:10.000000000 +0200 +++ libhid-0.2.16.patch/configure.ac 2013-01-12 17:23:25.129691249 +0100 @@ -21,7 +21,7 @@ AC_INIT(MD_INIT_NAME, MD_INIT_VERSION, MD_INIT_ADDRESS) -AM_CONFIG_HEADER([config.h]) +AC_CONFIG_HEADERS([config.h]) AC_CONFIG_SRCDIR([include/hid.h]) AC_CONFIG_AUX_DIR([.]) ================================================ FILE: packages/sysutils/libhid/patches/libhid-disable_docs.patch ================================================ --- a/doc/Makefile.am 2014-12-23 16:37:21.000000000 +0000 +++ b/doc/Makefile.am 2020-12-27 02:49:58.084611309 +0000 @@ -1,7 +1,7 @@ # AM_MAKEFLAGS = @MAKEFLAGS@ ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = www man +SUBDIRS = if DOXYGEN all-local: html ================================================ FILE: packages/sysutils/libhid/patches/libhid-use_pkgconfig.patch ================================================ diff -Naur libhid-0.2.16/m4/md_check_libusb018b.m4 libhid-0.2.16.patch/m4/md_check_libusb018b.m4 --- libhid-0.2.16/m4/md_check_libusb018b.m4 2004-05-26 02:37:41.000000000 +0200 +++ libhid-0.2.16.patch/m4/md_check_libusb018b.m4 2016-01-10 00:07:24.000000000 +0100 @@ -2,8 +2,8 @@ [ AC_CHECK_HEADERS([usb.h]) - LIBUSB_CFLAGS="`libusb-config --cflags`" - LIBUSB_LIBS="`libusb-config --libs`" + LIBUSB_CFLAGS="`pkg-config --cflags libusb`" + LIBUSB_LIBS="`pkg-config --libs libusb`" AC_SUBST(LIBUSB_CFLAGS) AC_SUBST(LIBUSB_LIBS) ================================================ FILE: packages/sysutils/libusb/package.mk ================================================ # 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="libusb" PKG_VERSION="1.0.26" PKG_SHA256="12ce7a61fc9854d1d2a1ffe095f7b5fac19ddba095c259e6067a46500381b5a5" PKG_LICENSE="LGPLv2.1" PKG_SITE="http://libusb.info/" PKG_URL="https://github.com/libusb/libusb/releases/download/v${PKG_VERSION}/libusb-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain systemd" PKG_LONGDESC="The libusb project's aim is to create a Library for use by user level applications to USB devices." PKG_CONFIGURE_OPTS_TARGET="--enable-shared \ --enable-static \ --disable-log \ --disable-debug-log \ --enable-udev \ --disable-examples-build" ================================================ FILE: packages/sysutils/libusb-compat/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="libusb-compat" PKG_VERSION="0.1.7" PKG_SHA256="8259f8d5b084fe43c47823a939e955e0ba21942b8d112266c39d228cc14764d6" PKG_LICENSE="GPL" PKG_SITE="https://github.com/libusb/libusb-compat-0.1" PKG_URL="https://github.com/libusb/libusb-compat-0.1/releases/download/v${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libusb" PKG_LONGDESC="The libusb project's aim is to create a Library for use by user level applications to USB devices." PKG_CONFIGURE_OPTS_TARGET="--disable-log \ --disable-debug-log \ --disable-examples-build" post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin sed -e "s:\(['= ]\)/usr:\\1${SYSROOT_PREFIX}/usr:g" -i ${SYSROOT_PREFIX}/usr/bin/libusb-config } ================================================ FILE: packages/sysutils/lirc/config/lirc_options.conf ================================================ # These are the default options to lircd, if installed as # /etc/lirc/lirc_options.conf. See the lircd(8) and lircmd(8) # manpages for info on the different options. # # Some tools including mode2 and irw uses values such as # driver, device, plugindir and loglevel as fallback values # in not defined elsewhere. [lircd] nodaemon = False driver = default device = /dev/lirc0 output = /run/lirc/lircd.socket pidfile = /run/lirc/lircd.pid plugindir = /usr/lib/lirc/plugins permission = 666 allow-simulate = No repeat-max = 600 #effective-user = #listen = [address:]port #connect = host[:port] #loglevel = 6 #release = true #release_suffix = _EVUP #logfile = ... [lircmd] uinput = False nodaemon = False # modinit is not supported in LibreELEC # [modinit] # code = /usr/sbin/modprobe lirc_serial # code1 = /usr/bin/setfacl -m g:lirc:rw /dev/uinput # code2 = ... # [lircd-uinput] # add-release-events = False # release-timeout = 200 # release-suffix = _EVUP ================================================ FILE: packages/sysutils/lirc/default.d/lircd.conf ================================================ ================================================ FILE: packages/sysutils/lirc/package.mk ================================================ # 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="lirc" PKG_VERSION="0.10.2" PKG_SHA256="3d44ec8274881cf262f160805641f0827ffcc20ade0d85e7e6f3b90e0d3d222a" PKG_LICENSE="GPL" PKG_SITE="http://www.lirc.org" PKG_URL="https://sourceforge.net/projects/lirc/files/LIRC/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libftdi1 libusb-compat libxslt alsa-lib" PKG_LONGDESC="LIRC is a package that allows you to decode and send infra-red signals." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--enable-devinput \ --enable-uinput \ --with-gnu-ld \ --without-x \ --runstatedir=/run" pre_configure_target() { export HAVE_WORKING_POLL=yes export HAVE_UINPUT=yes export PYTHON=: export PYTHON_VERSION=${PKG_PYTHON_VERSION#python} if [ -e ${SYSROOT_PREFIX}/usr/include/linux/input-event-codes.h ]; then export DEVINPUT_HEADER=${SYSROOT_PREFIX}/usr/include/linux/input-event-codes.h else export DEVINPUT_HEADER=${SYSROOT_PREFIX}/usr/include/linux/input.h fi } post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { rm -rf ${INSTALL}/usr/lib/systemd rm -rf ${INSTALL}/lib rm -rf ${INSTALL}/usr/share rm -rf ${INSTALL}/etc mkdir -p ${INSTALL}/etc/lirc cp -r ${PKG_DIR}/config/lirc_options.conf ${INSTALL}/etc/lirc ln -s /storage/.config/lircd.conf ${INSTALL}/etc/lirc/lircd.conf mkdir -p ${INSTALL}/usr/lib/libreelec cp ${PKG_DIR}/scripts/lircd_helper ${INSTALL}/usr/lib/libreelec cp ${PKG_DIR}/scripts/lircd_uinput_helper ${INSTALL}/usr/lib/libreelec mkdir -p ${INSTALL}/usr/share/services cp -P ${PKG_DIR}/default.d/*.conf ${INSTALL}/usr/share/services } post_install() { enable_service lircd.socket enable_service lircd.service enable_service lircd-uinput.service } ================================================ FILE: packages/sysutils/lirc/patches/lirc-0001-fix-zotac-poll.patch ================================================ From 79e2494e4880d0446bf837c8bbca0b01baac4ed4 Mon Sep 17 00:00:00 2001 From: Matthias Reichl <hias@horus.com> Date: Wed, 8 Apr 2020 11:27:11 +0200 Subject: [PATCH] plugins/zotac: fix poll timeout poll requires a negative timeout value for infinite waits. See https://sourceforge.net/p/lirc/tickets/327/ Signed-off-by: Matthias Reichl <hias@horus.com> --- plugins/zotac.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/zotac.c b/plugins/zotac.c index ac528c67..4a66acf5 100644 --- a/plugins/zotac.c +++ b/plugins/zotac.c @@ -352,7 +352,7 @@ static void* zotac_repeat(void* arg) if (pressed) sel = curl_poll(&pfd, 1, delay_ms); else - sel = curl_poll(&pfd, 1, 0); + sel = curl_poll(&pfd, 1, -1); switch (sel) { case 1: // Data ready in device's file -- 2.20.1 ================================================ FILE: packages/sysutils/lirc/patches/lirc-0100-disable-python.patch ================================================ diff --git a/Makefile.am b/Makefile.am index 9f3dd143..9619a6eb 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5,7 +5,9 @@ ACLOCAL_AMFLAGS = -I m4 AUTOMAKE_OPTIONS = 1.5 check-news dist-bzip2 -Wno-portability \ subdir-objects +if HAVE_PYTHON include pylint.mak +endif GIT_COMMIT = $(shell git log -1 --pretty=format:%h || echo UNKNOWN) GIT_DATE = $(shell git log -1 --pretty=format:%cd || echo UNKNOWN) @@ -34,13 +36,17 @@ MANTAINERCLEANFILES = config.sub install-sh depcomp py-compile \ AM_DISTCHECK_CONFIGURE_FLAGS = \ --with-systemdsystemunitdir=$${dc_install_base}/lib/systemd/system +if HAVE_PYTHON BUILT_SOURCES = paths.h python-pkg/lirc/config.py python-pkg/VERSION +else +BUILT_SOURCES = paths.h +endif if WITH_SYSTEMDSYSTEMUNITDIR SYSTEMD_DIR = systemd endif -SUBDIRS = lib daemons tools plugins configs doc $(SYSTEMD_DIR) +SUBDIRS = lib daemons tools plugins $(SYSTEMD_DIR) if INSTALL_ETC @@ -61,7 +67,9 @@ endif dist_doc_DATA = VERSION +if HAVE_PYTHON nodist_pkgdata_DATA = $(PYTHON_TARBALL) +endif pkgconfigdir = $(libdir)/pkgconfig dist_pkgconfig_DATA = lirc.pc lirc-driver.pc @@ -71,6 +79,7 @@ nobase_header_HEADERS = include/media/lirc.h \ include/linux/input-event-codes.h header_HEADERS = drivers/irpipe/irpipe.h +if HAVE_PYTHON py_pkgdir = $(pkgdatadir)/python-pkg dist_py_pkg_DATA = python-pkg/setup.py \ python-pkg/README.rst @@ -134,6 +143,8 @@ all-local: $(if $(VERBOSE),,-q) build endif +endif + install-data-hook: $(SED) -i -e '/^plugindir/s|/usr/lib|$(libdir)|' \ $(DESTDIR)$(lirc_confdir)/lirc_options.conf @@ -170,6 +181,7 @@ fix-version: .phony $(SED) -i '/DATE/s/=.*/="$(GIT_DATE)"/' $(distdir)/VERSION $(SED) -i '/REFS/s|=.*|="$(GIT_REFS)"|' $(distdir)/VERSION +if HAVE_PYTHON $(abs_builddir)/python-pkg/setup.py: cp -ar $(top_srcdir)/python-pkg $(abs_builddir) chmod -R u+w python-pkg @@ -193,6 +205,7 @@ python-pkg/lirc/config.py: Makefile $(abs_builddir)/python-pkg/setup.py @echo 'DOCDIR="$(docdir)"' >>$@ @echo 'MODINFO="$(MODINFO)"' >>$@ @echo 'VERSION="$(VERSION)"' >>$@ +endif paths.h: Makefile @echo "#ifndef PATHS_H" >paths.h diff --git a/configure.ac b/configure.ac index 58347d88..48ce5629 100644 --- a/configure.ac +++ b/configure.ac @@ -43,7 +43,8 @@ AC_CHECK_PROG([DOXYGEN],[doxygen],[yes],[no]) AM_CONDITIONAL(HAVE_DOXYGEN, test x$DOXYGEN = xyes) LT_INIT([disable-static]) -AM_PATH_PYTHON([3.1],,) +AM_PATH_PYTHON([3.1],,[:]) +AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != :]) PKG_CHECK_MODULES([PYTHON],[python-${PYTHON_VERSION}m],,[true]) test -z "$PYTHON_LIBS" && \ PKG_CHECK_MODULES([PYTHON], [python-$PYTHON_VERSION],,[true]) @@ -580,6 +581,7 @@ AX_REPORT_CONDITIONAL([DEVEL]) AX_REPORT_CONDITIONAL([LINUX_KERNEL]) AX_REPORT_CONDITIONAL([HAVE_DEVINPUT]) AX_REPORT_CONDITIONAL([WITH_SYSTEMDSYSTEMUNITDIR]) +AX_REPORT_CONDITIONAL([HAVE_PYTHON]) AX_REPORT_CONDITIONAL([HAVE_PYTHON35]) echo diff --git a/tools/Makefile.am b/tools/Makefile.am index abfb9911..8aff1cff 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -71,12 +71,17 @@ xmode2_SOURCES = xmode2.cpp xmode2_LDADD = @X_LIBS@ @X_PRE_LIBS@ -lX11 @X_EXTRA_LIBS@ \ $(LIRC_LIBS) +if HAVE_PYTHON dist_bin_SCRIPTS = lirc-config-tool lirc-init-db +else +dist_bin_SCRIPTS = +endif if HAVE_DEVINPUT dist_bin_SCRIPTS += lirc-make-devinput endif +if HAVE_PYTHON dist_bin_SCRIPTS += pronto2lirc irdb-get irtext2udp lirc-postinstall dist_sbin_SCRIPTS = lircd-setup dist_noinst_SCRIPTS = make_rel_symlink.py check_configs.py @@ -121,6 +126,7 @@ install-data-hook: $(PYTHON) $(srcdir)/make_rel_symlink.py \ $(DESTDIR)/$(pkgdatadir)/configs \ $(DESTDIR)/$(setupdir)/configs +endif uninstall-hook: rm -f $(DESTDIR)/$(bindir)/lirc-setup \ ================================================ FILE: packages/sysutils/lirc/scripts/lircd_helper ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2017 Matthias Reichl (hias@horus.com) if [ -e "/storage/.config/lirc_options.conf" ] ; then LIRCD_OPTIONS="-O /storage/.config/lirc_options.conf" fi exec /usr/sbin/lircd $LIRCD_OPTIONS "$@" /storage/.config/lircd.conf ================================================ FILE: packages/sysutils/lirc/scripts/lircd_uinput_helper ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2017 Matthias Reichl (hias@horus.com) if [ -e "/storage/.config/lirc_options.conf" ] ; then LIRCD_OPTIONS="-O /storage/.config/lirc_options.conf" fi exec /usr/sbin/lircd-uinput $LIRCD_OPTIONS "$@" ================================================ FILE: packages/sysutils/lirc/system.d/lircd-uinput.service ================================================ [Unit] Documentation=http://lirc.org/html/configure.html Description=Forward LIRC button presses as uinput events ConditionPathExists=/storage/.config/lircd.conf After=lircd.service [Service] Type=simple ExecStart=/usr/lib/libreelec/lircd_uinput_helper --add-release-events [Install] WantedBy=multi-user.target ================================================ FILE: packages/sysutils/lirc/system.d/lircd.service ================================================ [Unit] Documentation=http://lirc.org/html/configure.html Description=Flexible IR remote input/output application support ConditionPathExists=/storage/.config/lircd.conf After=network.target [Service] Type=simple ExecStart=/usr/lib/libreelec/lircd_helper --nodaemon [Install] WantedBy=multi-user.target ================================================ FILE: packages/sysutils/lirc/system.d/lircd.socket ================================================ [Socket] ListenStream=/run/lirc/lircd.socket [Install] WantedBy=sockets.target Also=lircd.service ================================================ FILE: packages/sysutils/lirc/tmpfiles.d/z_61_lirc.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) d /run/lirc 0755 root root - - ================================================ FILE: packages/sysutils/ntfs-3g_ntfsprogs/package.mk ================================================ # 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) PKG_NAME="ntfs-3g_ntfsprogs" PKG_VERSION="2021.8.22" PKG_SHA256="5cb9fa93bf2b9685e3f1b598861f6082786e76562989a5752c7379dbe0e989a2" PKG_LICENSE="GPL" PKG_SITE="https://github.com/tuxera/ntfs-3g" PKG_URL="https://github.com/tuxera/ntfs-3g/archive/refs/tags/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain fuse libgcrypt" PKG_LONGDESC="A NTFS driver with read and write support." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+lto" PKG_CONFIGURE_OPTS_TARGET="--exec-prefix=/usr/ \ --disable-dependency-tracking \ --disable-library \ --enable-posix-acls \ --enable-mtab \ --enable-ntfsprogs \ --disable-crypto \ --with-fuse=external \ --with-uuid" post_makeinstall_target() { # dont include ntfsprogs. for i in ${INSTALL}/usr/bin/*; do if [ "$(basename ${i})" != "ntfs-3g" ]; then rm ${i} fi done rm -rf ${INSTALL}/sbin rm -rf ${INSTALL}/usr/sbin/ntfsclone rm -rf ${INSTALL}/usr/sbin/ntfscp rm -rf ${INSTALL}/usr/sbin/ntfsundelete mkdir -p ${INSTALL}/usr/sbin ln -sf /usr/bin/ntfs-3g ${INSTALL}/usr/sbin/mount.ntfs ln -sf /usr/sbin/mkntfs ${INSTALL}/usr/sbin/mkfs.ntfs } ================================================ FILE: packages/sysutils/open-iscsi/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2012 Yann Cézard (eesprit@free.fr) # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="open-iscsi" PKG_VERSION="bf399411ed8a2f4047f928653ac8dd02ffd0f662" PKG_SHA256="92b9f0a27a9a373b14eab7b12f1bfff5d4857695a688dc4434df8e7623354588" PKG_LICENSE="GPL" PKG_SITE="https://github.com/mikechristie/open-iscsi" PKG_URL="https://github.com/mikechristie/open-iscsi/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_INIT="toolchain util-linux" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain open-iscsi:host" PKG_LONGDESC="The open-iscsi package allows you to mount iSCSI targets." PKG_TOOLCHAIN="configure" PKG_BUILD_FLAGS="-sysroot" PKG_MAKE_OPTS_INIT="user" PKG_MAKE_OPTS_TARGET="user" pre_configure_init() { export OPTFLAGS="${CFLAGS} ${LDFLAGS}" } configure_init() { cd utils/open-isns ./configure --host=${TARGET_NAME} \ --build=${HOST_NAME} \ --with-security=no cd ../.. } makeinstall_init() { mkdir -p ${INSTALL}/usr/sbin cp -P ${PKG_BUILD}/usr/iscsistart ${INSTALL}/usr/sbin } pre_configure_host() { export OPTFLAGS="${CFLAGS} ${LDFLAGS}" } configure_host() { : } make_host() { cd ${PKG_BUILD}/utils make iscsi-iname } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp -P ${PKG_BUILD}/utils/iscsi-iname ${TOOLCHAIN}/bin } pre_configure_target() { export OPTFLAGS="${CFLAGS} ${LDFLAGS}" } configure_target() { cd utils/open-isns ./configure --host=${TARGET_NAME} \ --build=${HOST_NAME} \ --with-security=no cd ${PKG_BUILD} } makeinstall_target() { mkdir -p ${INSTALL}/usr/sbin cp -P ${PKG_BUILD}/usr/iscsid ${INSTALL}/usr/sbin cp -P ${PKG_BUILD}/usr/iscsiadm ${INSTALL}/usr/sbin cp -P ${PKG_BUILD}/usr/iscsistart ${INSTALL}/usr/sbin cp -P ${PKG_BUILD}/utils/iscsi-iname ${INSTALL}/usr/sbin mkdir -p ${INSTALL}/etc/iscsi cp -P ${PKG_BUILD}/etc/iscsid.conf ${INSTALL}/etc/iscsi sed -i -e "s:= /sbin/iscsid:= /usr/sbin/iscsid:" ${INSTALL}/etc/iscsi/iscsid.conf echo "InitiatorName=$(${TOOLCHAIN}/bin/iscsi-iname)" > ${INSTALL}/etc/iscsi/initiatorname.iscsi } post_install() { enable_service iscsi-initiator.service } ================================================ FILE: packages/sysutils/open-iscsi/patches/open-iscsi-01_dynamic_linked_iscsistart.patch ================================================ --- a/usr/Makefile 2011-08-05 11:54:52.000000000 +0200 +++ b/usr/Makefile 2011-08-05 11:55:06.000000000 +0200 @@ -63,7 +63,7 @@ iscsistart: $(ISCSI_LIB_SRCS) $(INITIATOR_SRCS) $(FW_BOOT_SRCS) \ iscsistart.o statics.o - $(CC) $(CFLAGS) -static $^ -o $@ + $(CC) $(CFLAGS) $^ -o $@ clean: rm -f *.o $(PROGRAMS) .depend $(LIBSYS) ================================================ FILE: packages/sysutils/open-iscsi/patches/open-iscsi-02-cross_compile.patch ================================================ diff --git a/usr/Makefile b/usr/Makefile index fd14a10..41b7140 100644 --- a/usr/Makefile +++ b/usr/Makefile @@ -66,6 +66,6 @@ clean: rm -f *.o $(PROGRAMS) .depend $(LIBSYS) depend: - gcc $(CFLAGS) -M `ls *.c` > .depend + $(CC) $(CFLAGS) -M `ls *.c` > .depend -include .depend diff --git a/utils/Makefile b/utils/Makefile index 2c7e891..440e24e 100644 --- a/utils/Makefile +++ b/utils/Makefile @@ -12,6 +12,6 @@ clean: rm -f *.o $(PROGRAMS) .depend depend: - gcc $(CFLAGS) -M `ls *.c` > .depend + $(CC) $(CFLAGS) -M `ls *.c` > .depend -include .depend diff --git a/utils/fwparam_ibft/Makefile b/utils/fwparam_ibft/Makefile index c72bb7f..3d2c2a5 100644 --- a/utils/fwparam_ibft/Makefile +++ b/utils/fwparam_ibft/Makefile @@ -38,6 +38,6 @@ clean: $(OBJS): prom_parse.tab.h prom_parse.h fwparam_ibft.h depend: - gcc $(CFLAGS) -M `ls *.c` > .depend + $(CC) $(CFLAGS) -M `ls *.c` > .depend -include .depend diff --git a/utils/open-isns/Makefile.in b/utils/open-isns/Makefile.in index a27199c..a76649f 100644 --- a/utils/open-isns/Makefile.in +++ b/utils/open-isns/Makefile.in @@ -73,9 +73,9 @@ distclean:: rm -rf autom4te.cache $(LIB): $(LIBOBJS) - ar cr $@ $(LIBOBJS) + $(AR) cr $@ $(LIBOBJS) depend: - gcc $(CFLAGS) -M `ls *.c` > .depend + $(CC) $(CFLAGS) -M `ls *.c` > .depend -include .depend diff --git a/utils/sysdeps/Makefile b/utils/sysdeps/Makefile index 53c10e5..effe013 100644 --- a/utils/sysdeps/Makefile +++ b/utils/sysdeps/Makefile @@ -10,6 +10,6 @@ clean: rm -f *.o .depend depend: - gcc $(CFLAGS) -M `ls *.c` > .depend + $(CC) $(CFLAGS) -M `ls *.c` > .depend -include .depend ================================================ FILE: packages/sysutils/open-iscsi/patches/open-iscsi-03_enable-multicast.patch ================================================ From d5b4400d2c50190474a6000d60f05deb95f97e0b Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Thu, 8 Aug 2013 18:08:44 +0300 Subject: [PATCH] enable multicast source: https://groups.google.com/forum/#!msg/open-iscsi/nuLFqxgsHAA/53-JE3gNNjEJ --- usr/iscsi_net_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usr/iscsi_net_util.c b/usr/iscsi_net_util.c index 6d0ebf9..3801ac7 100644 --- a/usr/iscsi_net_util.c +++ b/usr/iscsi_net_util.c @@ -229,7 +229,7 @@ int net_setup_netdev(char *netdev, char *local_ip, char *mask, char *gateway, /* Bring up interface */ memset(&ifr, 0, sizeof(ifr)); strlcpy(ifr.ifr_name, netdev, IFNAMSIZ); - ifr.ifr_flags = IFF_UP | IFF_RUNNING; + ifr.ifr_flags = IFF_UP | IFF_RUNNING | IFF_MULTICAST; if (ioctl(sock, SIOCSIFFLAGS, &ifr) < 0) { log_error("Could not bring up netdev %s (err %d - %s)", netdev, errno, strerror(errno)); -- 1.8.1.2 ================================================ FILE: packages/sysutils/open-iscsi/patches/open-iscsi-04-no_iscsiuio.patch ================================================ diff -Naur open-iscsi-bf39941/Makefile open-iscsi-bf39941.patch/Makefile --- open-iscsi-bf39941/Makefile 2013-08-08 17:06:46.000000000 +0200 +++ open-iscsi-bf39941.patch/Makefile 2013-08-08 18:02:13.009068581 +0200 @@ -26,20 +26,18 @@ all: user -user: utils/open-isns/Makefile iscsiuio/Makefile +user: utils/open-isns/Makefile $(MAKE) -C utils/open-isns $(MAKE) -C utils/sysdeps $(MAKE) -C utils/fwparam_ibft $(MAKE) -C usr $(MAKE) -C utils - $(MAKE) -C iscsiuio @echo @echo "Compilation complete Output file" @echo "----------------------------------- ----------------" @echo "Built iSCSI daemon: usr/iscsid" @echo "Built management application: usr/iscsiadm" @echo "Built boot tool: usr/iscsistart" - @echo "Built iscsiuio daemon: iscsiuio/src/unix/iscsiuio" @echo @echo "Read README file for detailed information." ================================================ FILE: packages/sysutils/open-iscsi/patches/open-iscsi-05-Updates-to-support-gcc-fno-common-option.patch ================================================ From a8ce860b4462fbb22634c34a5d30cd0d482acb22 Mon Sep 17 00:00:00 2001 From: Lee Duncan <lduncan@suse.com> Date: Tue, 28 Jan 2020 16:36:56 -0800 Subject: [PATCH] Updates to support gcc -fno-common option. This meant cleaning up the definition of some global variables, so that they were only defined in one place and refered to as external elsewhere. --- include/iscsi_err.h | 6 ++++-- iscsiuio/configure | 2 +- iscsiuio/configure.ac | 2 +- iscsiuio/src/uip/uip.h | 4 ++-- usr/iscsi_err.c | 2 ++ usr/log.c | 1 + usr/log.h | 2 +- 7 files changed, 12 insertions(+), 7 deletions(-) diff --git a/include/iscsi_err.h b/include/iscsi_err.h index 125f443a2f25..a08f0fbfcea6 100644 --- a/include/iscsi_err.h +++ b/include/iscsi_err.h @@ -4,7 +4,7 @@ #ifndef _ISCSI_ERR_ #define _ISCSI_ERR_ -enum { +enum iscsi_error_list { ISCSI_SUCCESS = 0, /* Generic error */ ISCSI_ERR = 1, @@ -69,7 +69,9 @@ enum { /* Always last. Indicates end of error code space */ ISCSI_MAX_ERR_VAL, -} iscsi_err; +}; + +extern enum iscsi_error_list iscsi_err; extern void iscsi_err_print_msg(int err); extern char *iscsi_err_to_str(int err); diff --git a/iscsiuio/configure b/iscsiuio/configure index 2740598f5f87..e799c377b4ab 100755 --- a/iscsiuio/configure +++ b/iscsiuio/configure @@ -22729,7 +22729,7 @@ echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} done done ;; - default ) echo 'char *build_date = "'`date`'";' > src/unix/build_date.c && echo 'char *build_date;'> src/unix/build_date.h ;; + default ) echo 'char *build_date = "'`date`'";' > src/unix/build_date.c && echo 'extern char *build_date;'> src/unix/build_date.h ;; esac done _ACEOF diff --git a/iscsiuio/configure.ac b/iscsiuio/configure.ac index e9a5e32399ea..f51687bf56b5 100644 --- a/iscsiuio/configure.ac +++ b/iscsiuio/configure.ac @@ -62,7 +62,7 @@ AC_ARG_ENABLE(debug, fi]) AM_CONDITIONAL([DEBUG], [test x$debug = xtrue]) -AC_CONFIG_COMMANDS([default],[[ echo 'char *build_date = "'`date`'";' > src/unix/build_date.c && echo 'char *build_date;'> src/unix/build_date.h]],[[]]) +AC_CONFIG_COMMANDS([default],[[ echo 'char *build_date = "'`date`'";' > src/unix/build_date.c && echo 'extern char *build_date;'> src/unix/build_date.h]],[[]]) AC_PREFIX_DEFAULT() diff --git a/iscsiuio/src/uip/uip.h b/iscsiuio/src/uip/uip.h index 0225f6a456f5..d8e2220bf357 100644 --- a/iscsiuio/src/uip/uip.h +++ b/iscsiuio/src/uip/uip.h @@ -70,8 +70,8 @@ struct uip_stack; typedef u16_t uip_ip4addr_t[2]; typedef u16_t uip_ip6addr_t[8]; -const uip_ip6addr_t all_zeroes_addr6; -const uip_ip4addr_t all_zeroes_addr4; +extern const uip_ip6addr_t all_zeroes_addr6; +extern const uip_ip4addr_t all_zeroes_addr4; #define ETH_BUF(buf) ((struct uip_eth_hdr *)buf) #define VLAN_ETH_BUF(buf) ((struct uip_vlan_eth_hdr *)buf) diff --git a/usr/iscsi_err.c b/usr/iscsi_err.c index 4fe1c53adce0..6b6a4124458a 100644 --- a/usr/iscsi_err.c +++ b/usr/iscsi_err.c @@ -21,6 +21,8 @@ #include "iscsi_err.h" #include "log.h" +enum iscsi_error_list iscsi_err; + static char *iscsi_err_msgs[] = { /* 0 */ "", /* 1 */ "unknown error", diff --git a/usr/log.c b/usr/log.c index 26c61d847793..f7c542eeb191 100644 --- a/usr/log.c +++ b/usr/log.c @@ -33,6 +33,7 @@ char *log_name; int log_level = 0; +struct logarea *la = NULL; static int log_stop_daemon = 0; static void (*log_func)(int prio, void *priv, const char *fmt, va_list ap); diff --git a/usr/log.h b/usr/log.h index 486a08ea08b2..c548791e73a1 100644 --- a/usr/log.h +++ b/usr/log.h @@ -64,7 +64,7 @@ struct logarea { union semun semarg; }; -struct logarea *la; +extern struct logarea *la; extern int log_init(char *program_name, int size, void (*func)(int prio, void *priv, const char *fmt, va_list ap), -- 2.27.0 ================================================ FILE: packages/sysutils/open-iscsi/patches/open-iscsi-06-Fix-attribute.patch ================================================ From 61936357ef7d796c3f4fe95782309268be9e6a31 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Sat, 20 Jun 2020 19:37:42 +0200 Subject: [PATCH] Fix attribute --- include/iscsi_if.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/iscsi_if.h b/include/iscsi_if.h index 20f2bc2961e9..6633bc528555 100644 --- a/include/iscsi_if.h +++ b/include/iscsi_if.h @@ -327,7 +327,7 @@ struct iscsi_iface_param_info { uint8_t iface_type; /* IPv4 or IPv6 */ uint8_t param_type; /* iscsi_param_type */ uint8_t value[0]; /* length sized value follows */ -} __packed; +} __attribute__((__packed__)); /* * To keep the struct iscsi_uevent size the same for userspace code -- 2.27.0 ================================================ FILE: packages/sysutils/open-iscsi/patches/open-iscsi-07-usr-run-for-config.patch ================================================ diff -Naur a/usr/idbm.c b/usr/idbm.c --- a/usr/idbm.c 2013-07-29 12:13:36.000000000 -0700 +++ b/usr/idbm.c 2022-05-03 15:16:35.006014572 -0700 @@ -2647,9 +2647,9 @@ int idbm_init(idbm_get_config_file_fn *fn) { /* make sure root db dir is there */ - if (access(ISCSI_CONFIG_ROOT, F_OK) != 0) { - if (mkdir(ISCSI_CONFIG_ROOT, 0660) != 0) { - log_error("Could not make %s %d\n", ISCSI_CONFIG_ROOT, + if (access(ISCSIVAR, F_OK) != 0) { + if (mkdir(ISCSIVAR, 0770) != 0) { + log_error("Could not make %s %d", ISCSIVAR, errno); return errno; } diff -Naur a/usr/idbm.h b/usr/idbm.h --- a/usr/idbm.h 2013-07-29 12:13:36.000000000 -0700 +++ b/usr/idbm.h 2022-05-03 15:17:18.700644189 -0700 @@ -29,12 +29,13 @@ #include "list.h" #include "flashnode.h" -#define NODE_CONFIG_DIR ISCSI_CONFIG_ROOT"nodes" -#define SLP_CONFIG_DIR ISCSI_CONFIG_ROOT"slp" -#define ISNS_CONFIG_DIR ISCSI_CONFIG_ROOT"isns" -#define STATIC_CONFIG_DIR ISCSI_CONFIG_ROOT"static" -#define FW_CONFIG_DIR ISCSI_CONFIG_ROOT"fw" -#define ST_CONFIG_DIR ISCSI_CONFIG_ROOT"send_targets" +#define ISCSIVAR "/run/iscsi/" +#define NODE_CONFIG_DIR ISCSIVAR"nodes" +#define SLP_CONFIG_DIR ISCSIVAR"slp" +#define ISNS_CONFIG_DIR ISCSIVAR"isns" +#define STATIC_CONFIG_DIR ISCSIVAR"static" +#define FW_CONFIG_DIR ISCSIVAR"fw" +#define ST_CONFIG_DIR ISCSIVAR"send_targets" #define ST_CONFIG_NAME "st_config" #define ISNS_CONFIG_NAME "isns_config" diff -Naur a/usr/iface.h b/usr/iface.h --- a/usr/iface.h 2013-07-29 12:13:36.000000000 -0700 +++ b/usr/iface.h 2022-05-03 15:18:31.164688356 -0700 @@ -20,7 +20,9 @@ #ifndef ISCSI_IFACE_H #define ISCSI_IFACE_H -#define IFACE_CONFIG_DIR ISCSI_CONFIG_ROOT"ifaces" +#include "idbm.h" + +#define IFACE_CONFIG_DIR ISCSIVAR"ifaces" struct iface_rec; struct list_head; ================================================ FILE: packages/sysutils/open-iscsi/system.d/iscsi-initiator.service ================================================ [Unit] Description=Open-iSCSI initiator (i.e. client) service After=syslog.target [Service] ExecStart=/usr/sbin/iscsid -f [Install] WantedBy=multi-user.target ================================================ FILE: packages/sysutils/open-iscsi/tmpfiles.d/iscsi.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022 Team LibreELEC (https://libreelec.tv) d /run/lock/iscsi 0700 root root - f /run/lock/iscsi/lock 0600 root root - ================================================ FILE: packages/sysutils/open-vm-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2011 Anthony Nash (nash.ant@gmail.com) # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="open-vm-tools" PKG_VERSION="12.1.5" PKG_SHA256="678d08b46fba15f2b4c39245b5bc4deec30284d6f13ee279c233bc3d3627ec8a" PKG_ARCH="x86_64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/vmware/open-vm-tools" PKG_URL="https://github.com/vmware/open-vm-tools/archive/stable-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain fuse3 glib:host glib libdnet libtirpc" PKG_LONGDESC="open-vm-tools: open source implementation of VMware Tools" PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--disable-docs \ --disable-tests \ --disable-containerinfo \ --disable-deploypkg \ --without-pam \ --without-gtk2 \ --without-gtkmm \ --without-ssl \ --without-x \ --without-xerces \ --without-icu \ --without-kernel-modules \ --with-fuse=fuse3 \ --with-udev-rules-dir=/usr/lib/udev/rules.d/ \ --with-sysroot=${SYSROOT_PREFIX}" configure_package() { PKG_CONFIGURE_SCRIPT="${PKG_BUILD}/open-vm-tools/configure" } post_unpack() { # Hack to allow package to be bumped without linking against old libraries rm -f ${SYSROOT_PREFIX}/usr/lib/libvmtools* } pre_configure_target() { export LIBS="-ldnet -ltirpc" } post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { rm -rf ${INSTALL}/sbin rm -rf ${INSTALL}/usr/share rm -rf ${INSTALL}/etc/vmware-tools/scripts/vmware/network chmod -x ${INSTALL}/usr/lib/udev/rules.d/*.rules find ${INSTALL}/etc/vmware-tools/ -type f | xargs sed -i '/.*expr.*/d' } post_install() { enable_service vmtoolsd.service enable_service vmware-vmblock-fuse.service } ================================================ FILE: packages/sysutils/open-vm-tools/system.d/vmtoolsd.service ================================================ [Unit] Description=Open Virtual Machine Tools (VMware Tools) ConditionVirtualization=vmware [Service] ExecStart=/usr/bin/vmtoolsd [Install] WantedBy=multi-user.target ================================================ FILE: packages/sysutils/open-vm-tools/system.d/vmware-vmblock-fuse.service ================================================ [Unit] Description=Open Virtual Machine Tools (vmware-vmblock-fuse) ConditionVirtualization=vmware [Service] Type=simple RuntimeDirectory=vmblock-fuse RuntimeDirectoryMode=755 ExecStart=/usr/bin/vmware-vmblock-fuse -d -f -o subtype=vmware-vmblock,default_permissions,allow_other /run/vmblock-fuse [Install] WantedBy=multi-user.target ================================================ FILE: packages/sysutils/parted/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="parted" PKG_VERSION="3.5" PKG_SHA256="4938dd5c1c125f6c78b1f4b3e297526f18ee74aa43d45c248578b1d2470c05a2" PKG_LICENSE="GPL" PKG_SITE="http://www.gnu.org/software/parted/" PKG_URL="http://ftpmirror.gnu.org/parted/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="toolchain:host util-linux:host" PKG_DEPENDS_TARGET="toolchain util-linux parted:host" PKG_DEPENDS_INIT="toolchain util-linux:init parted" PKG_LONGDESC="GNU Parted is a program for creating, destroying, resizing, checking and copying partitions." PKG_CONFIGURE_OPTS_TARGET="--disable-device-mapper \ --disable-shared \ --without-readline \ --disable-rpath \ --with-gnu-ld" PKG_CONFIGURE_OPTS_HOST="${PKG_CONFIGURE_OPTS_TARGET}" pre_configure_init() { : # reuse pre_configure_target() } post_configure_init() { : # reuse post_configure_target() } configure_init() { : # reuse configure_target() } make_init() { : # reuse make_target() } makeinstall_init() { mkdir -p ${INSTALL}/usr/sbin cp ../.${TARGET_NAME}/parted/parted ${INSTALL}/usr/sbin cp ../.${TARGET_NAME}/partprobe/partprobe ${INSTALL}/usr/sbin } pre_configure_target() { export CFLAGS+=" -I${PKG_BUILD}/lib" } post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/sysutils/pciutils/package.mk ================================================ # 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="pciutils" PKG_VERSION="3.9.0" PKG_SHA256="cdea7ae97239dee23249a09c68a19a287a3f109fbeb2c232ebb616cb38599012" PKG_LICENSE="GPL" PKG_SITE="http://mj.ucw.cz/pciutils.shtml" PKG_URL="https://www.kernel.org/pub/software/utils/pciutils/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain kmod systemd" PKG_LONGDESC="Utilities for inspecting devices connected to the PCI bus and the PCI vendor/product ID database." PKG_MAKE_OPTS="PREFIX=/usr SHARED=no STRIP= IDSDIR=/usr/share" make_target() { make OPT="${CFLAGS}" \ CROSS_COMPILE=${TARGET_PREFIX} \ HOST=${TARGET_ARCH}-linux \ ${PKG_MAKE_OPTS} \ ZLIB=no DNS=no LIBKMOD=yes HWDB=yes } makeinstall_target() { make ${PKG_MAKE_OPTS} DESTDIR=${SYSROOT_PREFIX} install make ${PKG_MAKE_OPTS} DESTDIR=${SYSROOT_PREFIX} install-lib make ${PKG_MAKE_OPTS} DESTDIR=${INSTALL} install-lib make ${PKG_MAKE_OPTS} DESTDIR=${INSTALL} install } post_makeinstall_target() { rm -rf ${INSTALL}/usr/sbin/setpci rm -rf ${INSTALL}/usr/sbin/update-pciids rm -rf ${INSTALL}/usr/share } ================================================ FILE: packages/sysutils/pciutils/patches/pciutils-01-fix-pkgconf.patch ================================================ From 4dd9a1b445269aa24626b1cfb85d3c22bc0e64bb Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Sat, 16 Aug 2014 14:25:18 +0300 Subject: [PATCH] fix pkgconf --- lib/libpci.pc.in | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/libpci.pc.in b/lib/libpci.pc.in index 9d7e8a0..38827ba 100644 --- a/lib/libpci.pc.in +++ b/lib/libpci.pc.in @@ -1,7 +1,7 @@ prefix=@PREFIX@ -includedir=@INCDIR@ -libdir=@LIBDIR@ -idsdir=@IDSDIR@ +includedir=${prefix}/include +libdir=${prefix}/lib +idsdir=${prefix}/share Name: libpci Description: libpci -- 1.7.2.5 ================================================ FILE: packages/sysutils/sed/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="sed" PKG_VERSION="4.9" PKG_SHA256="6e226b732e1cd739464ad6862bd1a1aba42d7982922da7a53519631d24975181" PKG_LICENSE="GPL" PKG_SITE="http://www.gnu.org/software/sed/" PKG_URL="https://mirrors.kernel.org/gnu/sed/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="ccache:host" PKG_LONGDESC="The sed (Stream EDitor) editor is a stream or batch (non-interactive) editor." PKG_CONFIGURE_OPTS_HOST="--disable-nls --disable-acl --without-selinux" ================================================ FILE: packages/sysutils/squashfs-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="squashfs-tools" PKG_VERSION="4.5.1" PKG_SHA256="277b6e7f75a4a57f72191295ae62766a10d627a4f5e5f19eadfbc861378deea7" PKG_LICENSE="GPL" PKG_SITE="https://github.com/plougher/squashfs-tools" PKG_URL="https://github.com/plougher/squashfs-tools/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="ccache:host zlib:host lzo:host xz:host zstd:host" PKG_NEED_UNPACK="$(get_pkg_directory zlib) $(get_pkg_directory lzo) $(get_pkg_directory xz) $(get_pkg_directory zstd)" PKG_LONGDESC="Tools for squashfs, a highly compressed read-only filesystem for Linux." PKG_TOOLCHAIN="manual" make_host() { make -C squashfs-tools \ mksquashfs \ XZ_SUPPORT=1 \ LZO_SUPPORT=1 \ ZSTD_SUPPORT=1 \ XATTR_SUPPORT=0 \ XATTR_DEFAULT=0 \ INCLUDEDIR="-I. -I${TOOLCHAIN}/include" } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp squashfs-tools/mksquashfs ${TOOLCHAIN}/bin } ================================================ FILE: packages/sysutils/systemd/config/hosts.conf ================================================ # hosts.conf # This configuration file allows you to manually map hostnames to # IP addresses # Format: <ipaddress> <fqdn> <alias1> <alias2> # Example: 192.168.0.3 libreelec.mynetwork libreelec # NOTE: do not edit /etc/hosts directly # edit /storage/.config/hosts.conf then reboot ================================================ FILE: packages/sysutils/systemd/config/hwdb.d/README ================================================ Hardware Database Files The hwdb files are read from the files located in the system hwdb directory /usr/lib/udev/hwdb.d and the user runtime directory /storage/.config/hwdb.d All hwdb files are collectively sorted and processed in lexical order, regardless of the directories in which they live. However, files with identical filenames replace each other. /usr/lib/udev/hwdb.d/* takes precedence over /storage/.config/hwdb.d/* your files must be named 99-xxxxx.hwdb ================================================ FILE: packages/sysutils/systemd/config/logind.conf.d/README ================================================ LOGIND.CONF(5) logind.conf LOGIND.CONF(5) NAME logind.conf, logind.conf.d - Login manager configuration files SYNOPSIS /etc/systemd/logind.conf /etc/systemd/logind.conf.d/*.conf /run/systemd/logind.conf.d/*.conf /usr/lib/systemd/logind.conf.d/*.conf DESCRIPTION These files configure various parameters of the systemd login manager, systemd-logind.service(8). CONFIGURATION DIRECTORIES AND PRECEDENCE The default configuration is defined during compilation, so a configuration file is only needed when it is necessary to deviate from those defaults. By default, the configuration file in /etc/systemd/ contains commented out entries showing the defaults as a guide to the administrator. This file can be edited to create local overrides. When packages need to customize the configuration, they can install configuration snippets in /usr/lib/systemd/*.conf.d/. Files in /etc/ are reserved for the local administrator, who may use this logic to override the configuration files installed by vendor packages. The main configuration file is read before any of the configuration directories, and has the lowest precedence; entries in a file in any configuration directory override entries in the single configuration file. Files in the *.conf.d/ configuration subdirectories are sorted by their filename in lexicographic order, regardless of which of the subdirectories they reside in. When multiple files specify the same option, for options which accept just a single value, the entry in the file with the lexicographically latest name takes precedence. For options which accept a list of values, entries are collected as they occur in files sorted lexicographically. It is recommended to prefix all filenames in those subdirectories with a two-digit number and a dash, to simplify the ordering of the files. To disable a configuration file supplied by the vendor, the recommended way is to place a symlink to /dev/null in the configuration directory in /etc/, with the same filename as the vendor configuration file. OPTIONS All options are configured in the "[Login]" section: NAutoVTs= Takes a positive integer. Configures how many virtual terminals (VTs) to allocate by default that, when switched to and are previously unused, "autovt" services are automatically spawned on. These services are instantiated from the template unit autovt@.service for the respective VT TTY name, for example, autovt@tty4.service. By default, autovt@.service is linked to getty@.service. In other words, login prompts are started dynamically as the user switches to unused virtual terminals. Hence, this parameter controls how many login "gettys" are available on the VTs. If a VT is already used by some other subsystem (for example, a graphical login), this kind of activation will not be attempted. Note that the VT configured in ReserveVT= is always subject to this kind of activation, even if it is not one of the VTs configured with the NAutoVTs= directive. Defaults to 6. When set to 0, automatic spawning of "autovt" services is disabled. ReserveVT= Takes a positive integer. Identifies one virtual terminal that shall unconditionally be reserved for autovt@.service activation (see above). The VT selected with this option will be marked busy unconditionally, so that no other subsystem will allocate it. This functionality is useful to ensure that, regardless of how many VTs are allocated by other subsystems, one login "getty" is always available. Defaults to 6 (in other words, there will always be a "getty" available on Alt-F6.). When set to 0, VT reservation is disabled. KillUserProcesses= Takes a boolean argument. Configures whether the processes of a user should be killed when the user logs out. If true, the scope unit corresponding to the session and all processes inside that scope will be terminated. If false, the scope is "abandoned", see systemd.scope(5), and processes are not killed. Defaults to "yes", but see the options KillOnlyUsers= and KillExcludeUsers= below. In addition to session processes, user process may run under the user manager unit user@.service. Depending on the linger settings, this may allow users to run processes independent of their login sessions. See the description of enable-linger in loginctl(1). Note that setting KillUserProcesses=yes will break tools like screen(1) and tmux(1), unless they are moved out of the session scope. See example in systemd-run(1). KillOnlyUsers=, KillExcludeUsers= These settings take space-separated lists of usernames that override the KillUserProcesses= setting. A user name may be added to KillExcludeUsers= to exclude the processes in the session scopes of that user from being killed even if KillUserProcesses=yes is set. If KillExcludeUsers= is not set, the "root" user is excluded by default. KillExcludeUsers= may be set to an empty value to override this default. If a user is not excluded, KillOnlyUsers= is checked next. If this setting is specified, only the session scopes of those users will be killed. Otherwise, users are subject to the KillUserProcesses=yes setting. IdleAction= Configures the action to take when the system is idle. Takes one of "ignore", "poweroff", "reboot", "halt", "kexec", "suspend", "hibernate", "hybrid-sleep", and "lock". Defaults to "ignore". Note that this requires that user sessions correctly report the idle status to the system. The system will execute the action after all sessions report that they are idle, no idle inhibitor lock is active, and subsequently, the time configured with IdleActionSec= (see below) has expired. IdleActionSec= Configures the delay after which the action configured in IdleAction= (see above) is taken after the system is idle. InhibitDelayMaxSec= Specifies the maximum time a system shutdown or sleep request is delayed due to an inhibitor lock of type "delay" being active before the inhibitor is ignored and the operation executes anyway. Defaults to 5. HandlePowerKey=, HandleSuspendKey=, HandleHibernateKey=, HandleLidSwitch=, HandleLidSwitchExternalPower=, HandleLidSwitchDocked= Controls how logind shall handle the system power and sleep keys and the lid switch to trigger actions such as system power-off or suspend. Can be one of "ignore", "poweroff", "reboot", "halt", "kexec", "suspend", "hibernate", "hybrid-sleep", and "lock". If "ignore", logind will never handle these keys. If "lock", all running sessions will be screen-locked; otherwise, the specified action will be taken in the respective event. Only input devices with the "power-switch" udev tag will be watched for key/lid switch events. HandlePowerKey= defaults to "poweroff". HandleSuspendKey= and HandleLidSwitch= default to "suspend". HandleLidSwitchExternalPower= is completely ignored by default (for backwards compatibility) — an explicit value must be set before it will be used to determine behaviour. HandleLidSwitchDocked= defaults to "ignore". HandleHibernateKey= defaults to "hibernate". If the system is inserted in a docking station, or if more than one display is connected, the action specified by HandleLidSwitchDocked= occurs; if the system is on external power the action (if any) specified by HandleLidSwitchExternalPower= occurs; otherwise the HandleLidSwitch= action occurs. A different application may disable logind's handling of system power and sleep keys and the lid switch by taking a low-level inhibitor lock ("handle-power-key", "handle-suspend-key", "handle-hibernate-key", "handle-lid-switch"). This is most commonly used by graphical desktop environments to take over suspend and hibernation handling, and to use their own configuration mechanisms. If a low-level inhibitor lock is taken, logind will not take any action when that key or switch is triggered and the Handle*= settings are irrelevant. PowerKeyIgnoreInhibited=, SuspendKeyIgnoreInhibited=, HibernateKeyIgnoreInhibited=, LidSwitchIgnoreInhibited= Controls whether actions that systemd-logind takes when the power and sleep keys and the lid switch are triggered are subject to high-level inhibitor locks ("shutdown", "sleep", "idle"). Low level inhibitor locks ("handle-power-key", "handle-suspend-key", "handle-hibernate-key", "handle-lid-switch"), are always honored, irrespective of this setting. These settings take boolean arguments. If "no", the inhibitor locks taken by applications are respected. If "yes", "shutdown", "sleep", and "idle" inhibitor locks are ignored. PowerKeyIgnoreInhibited=, SuspendKeyIgnoreInhibited=, and HibernateKeyIgnoreInhibited= default to "no". LidSwitchIgnoreInhibited= defaults to "yes". This means that when systemd-logind is handling events by itself (no low level inhibitor locks are taken by another application), the lid switch does not respect suspend blockers by default, but the power and sleep keys do. HoldoffTimeoutSec= Specifies the timeout after system startup or system resume in which systemd will hold off on reacting to lid events. This is required for the system to properly detect any hotplugged devices so systemd can ignore lid events if external monitors, or docks, are connected. If set to 0, systemd will always react immediately, possibly before the kernel fully probed all hotplugged devices. This is safe, as long as you do not care for systemd to account for devices that have been plugged or unplugged while the system was off. Defaults to 30s. RuntimeDirectorySize= Sets the size limit on the $XDG_RUNTIME_DIR runtime directory for each user who logs in. Takes a size in bytes, optionally suffixed with the usual K, G, M, and T suffixes, to the base 1024 (IEC). Alternatively, a numerical percentage suffixed by "%" may be specified, which sets the size limit relative to the amount of physical RAM. Defaults to 10%. Note that this size is a safety limit only. As each runtime directory is a tmpfs file system, it will only consume as much memory as is needed. InhibitorsMax= Controls the maximum number of concurrent inhibitors to permit. Defaults to 8192 (8K). SessionsMax= Controls the maximum number of concurrent user sessions to manage. Defaults to 8192 (8K). Depending on how the pam_systemd.so module is included in the PAM stack configuration, further login sessions will either be refused, or permitted but not tracked by systemd-logind. UserTasksMax= Sets the maximum number of OS tasks each user may run concurrently. This controls the TasksMax= setting of the per-user slice unit, see systemd.resource-control(5) for details. If assigned the special value "infinity", no tasks limit is applied. Defaults to 33%, which equals 10813 with the kernel's defaults on the host, but might be smaller in OS containers. RemoveIPC= Controls whether System V and POSIX IPC objects belonging to the user shall be removed when the user fully logs out. Takes a boolean argument. If enabled, the user may not consume IPC resources after the last of the user's sessions terminated. This covers System V semaphores, shared memory and message queues, as well as POSIX shared memory and message queues. Note that IPC objects of the root user and other system users are excluded from the effect of this setting. Defaults to "yes". SEE ALSO systemd(1), systemd-logind.service(8), loginctl(1), systemd- system.conf(5) systemd 238 LOGIND.CONF(5) ================================================ FILE: packages/sysutils/systemd/config/modules-load.d/README ================================================ Name modules-load.d — Configure kernel modules to load at boot Synopsis /etc/modules-load.d/*.conf /run/modules-load.d/*.conf /usr/lib/modules-load.d/*.conf Description systemd-modules-load.service(8) reads files from the above directories which contain kernel modules to load during boot in a static list. Each configuration file is named in the style of /etc/modules-load.d/program.conf. Note that it is usually a better idea to rely on the automatic module loading by PCI IDs, USB IDs, DMI IDs or similar triggers encoded in the kernel modules themselves instead of static configuration like this. In fact, most modern kernel modules are prepared for automatic loading already. Configuration Format The configuration files should simply contain a list of kernel module names to load, separated by newlines. Empty lines and lines whose first non-whitespace character is # or ; are ignored. Each configuration file shall be named in the style of program.conf. Files in /etc/ override files with the same name in /usr/lib/ and /run/. Files in /run/ override files with the same name in /usr/lib/. Packages should install their configuration files in /usr/lib/, files in /etc/ are reserved for the local administrator, who may use this logic to override the configuration files installed from vendor packages. If the administrator wants to disable a configuration file supplied by the vendor the recommended way is to place a symlink to /dev/null in /etc/modules-load.d/ bearing the same filename. Example Example 1. /etc/modules-load.d/virtio-net.conf example: # Load virtio-net.ko at boot virtio-net See Also systemd(1), systemd-modules-load.service(8), systemd-delta(1), modprobe(8) ================================================ FILE: packages/sysutils/systemd/config/sleep.conf.d/README ================================================ NAME systemd-sleep.conf, sleep.conf.d - Suspend and hibernation configuration file SYNOPSIS /etc/systemd/sleep.conf /etc/systemd/sleep.conf.d/*.conf /run/systemd/sleep.conf.d/*.conf /usr/lib/systemd/sleep.conf.d/*.conf DESCRIPTION systemd supports three general power-saving modes: suspend a low-power state where execution of the OS is paused, and complete power loss might result in lost data, and which is fast to enter and exit. This corresponds to suspend, standby, or freeze states as understood by the kernel. hibernate a low-power state where execution of the OS is paused, and complete power loss does not result in lost data, and which might be slow to enter and exit. This corresponds to the hibernation as understood by the kernel. hybrid-sleep a low-power state where execution of the OS is paused, which might be slow to enter, and on complete power loss does not result in lost data but might be slower to exit in that case. This mode is called suspend-to-both by the kernel. Settings in these files determine what strings will be written to /sys/power/disk and /sys/power/state by systemd-sleep(8) when systemd(1) attempts to suspend or hibernate the machine. CONFIGURATION DIRECTORIES AND PRECEDENCE The default configuration is defined during compilation, so a configuration file is only needed when it is necessary to deviate from those defaults. By default, the configuration file in /etc/systemd/ contains commented out entries showing the defaults as a guide to the administrator. This file can be edited to create local overrides. When packages need to customize the configuration, they can install configuration snippets in /usr/lib/systemd/*.conf.d/. Files in /etc/ are reserved for the local administrator, who may use this logic to override the configuration files installed by vendor packages. The main configuration file is read before any of the configuration directories, and has the lowest precedence; entries in a file in any configuration directory override entries in the single configuration file. Files in the *.conf.d/ configuration subdirectories are sorted by their filename in lexicographic order, regardless of which of the subdirectories they reside in. If multiple files specify the same option, the entry in the file with the lexicographically latest name takes precedence. It is recommended to prefix all filenames in those subdirectories with a two-digit number and a dash, to simplify the ordering of the files. To disable a configuration file supplied by the vendor, the recommended way is to place a symlink to /dev/null in the configuration directory in /etc/, with the same filename as the vendor configuration file. OPTIONS The following options can be configured in the "[Sleep]" section of /etc/systemd/sleep.conf or a sleep.conf.d file: SuspendMode=, HibernateMode=, HybridSleepMode= The string to be written to /sys/power/disk by, respectively, systemd-suspend.service(8), systemd-hibernate.service(8), or systemd-hybrid-sleep.service(8). More than one value can be specified by separating multiple values with whitespace. They will be tried in turn, until one is written without error. If neither succeeds, the operation will be aborted. SuspendState=, HibernateState=, HybridSleepState= The string to be written to /sys/power/state by, respectively, systemd-suspend.service(8), systemd-hibernate.service(8), or systemd-hybrid-sleep.service(8). More than one value can be specified by separating multiple values with whitespace. They will be tried in turn, until one is written without error. If neither succeeds, the operation will be aborted. EXAMPLE: FREEZE Example: to exploit the “freeze” mode added in Linux 3.9, one can use systemctl suspend with [Sleep] SuspendState=freeze SEE ALSO systemd-sleep(8), systemd-suspend.service(8), systemd-hibernate.service(8), systemd-hybrid-sleep.service(8), systemd(1), systemd.directives(7) ================================================ FILE: packages/sysutils/systemd/config/sleep.conf.d/sleep.conf.sample ================================================ [Sleep] SuspendMode=false HibernateMode=false ================================================ FILE: packages/sysutils/systemd/config/sysctl.d/README ================================================ Name sysctl.d — Configure kernel parameters at boot Synopsis /etc/sysctl.d/*.conf /run/sysctl.d/*.conf /usr/lib/sysctl.d/*.conf Description At boot, systemd-sysctl.service(8) reads configuration files from the above directories to configure sysctl(8) kernel parameters. Configuration Format The configuration files contain a list of variable assignments, separated by newlines. Empty lines and lines whose first non-whitespace character is # or ; are ignored. Note that both / and . are accepted as label separators within sysctl variable names. "kernel.domainname=foo" and "kernel/domainname=foo" hence are entirely equivalent. Each configuration file shall be named in the style of program.conf. Files in /etc/ override files with the same name in /usr/lib/ and /run/. Files in /run/ override files with the same name in /usr/lib/. Packages should install their configuration files in /usr/lib/. Files in /etc/ are reserved for the local administrator, who may use this logic to override the configuration files installed by vendor packages. All configuration files are sorted by their filename in alphabetical order, regardless in which of the directories they reside, to guarantee that a specific configuration file takes precedence over another file with an alphabetically later name, if both files contain the same variable setting. If the administrator wants to disable a configuration file supplied by the vendor, the recommended way is to place a symlink to /dev/null in /etc/sysctl.d/ bearing the same filename. Example Example 1. /etc/sysctl.d/domain-name.conf example: # Set kernel YP domain name kernel.domainname=example.com See Also systemd(1), systemd-sysctl.service(8), systemd-delta(1), sysctl(8), sysctl.conf(5) ================================================ FILE: packages/sysutils/systemd/config/system.d/README ================================================ Name systemd.unit — Unit configuration Synopsis service.service, socket.socket, device.device, mount.mount, automount.automount, swap.swap, target.target, path.path, timer.timer, snapshot.snapshot, slice.slice, scope.scope /etc/systemd/system/* /run/systemd/system/* /usr/lib/systemd/system/* ... $HOME/.config/systemd/user/* /etc/systemd/user/* /run/systemd/user/* /usr/lib/systemd/user/* ... Description A unit configuration file encodes information about a service, a socket, a device, a mount point, an automount point, a swap file or partition, a start-up target, a watched file system path, a timer controlled and supervised by systemd(1), a temporary system state snapshot, a resource management slice or a group of externally created processes. The syntax is inspired by XDG Desktop Entry Specification .desktop files, which are in turn inspired by Microsoft Windows .ini files. This man page lists the common configuration options of all the unit types. These options need to be configured in the [Unit] or [Install] sections of the unit files. In addition to the generic [Unit] and [Install] sections described here, each unit may have a type-specific section, e.g. [Service] for a service unit. See the respective man pages for more information: systemd.service(5), systemd.socket(5), systemd.device(5), systemd.mount(5), systemd.automount(5), systemd.swap(5), systemd.target(5), systemd.path(5), systemd.timer(5), systemd.snapshot(5). systemd.slice(5). systemd.scope(5). Unit files are loaded from a set of paths determined during compilation, described in the next section. Unit files may contain additional options on top of those listed here. If systemd encounters an unknown option it will write a warning log message but continue loading the unit. If an option is prefixed with X- it is ignored completely by systemd. Applications may use this to include additional information in the unit files. Boolean arguments used in unit files can be written in various formats. For positive settings the strings 1, yes, true and on are equivalent. For negative settings the strings 0, no, false and off are equivalent. Time span values encoded in unit files can be written in various formats. A stand-alone number specifies a time in seconds. If suffixed with a time unit, the unit is honored. A concatenation of multiple values with units is supported, in which case the values are added up. Example: "50" refers to 50 seconds; "2min 200ms" refers to 2 minutes plus 200 milliseconds, i.e. 120200ms. The following time units are understood: s, min, h, d, w, ms, us. For details see systemd.time(7). Empty lines and lines starting with # or ; are ignored. This may be used for commenting. Lines ending in a backslash are concatenated with the following line while reading and the backslash is replaced by a space character. This may be used to wrap long lines. Along with a unit file foo.service the directory foo.service.wants/ may exist. All unit files symlinked from such a directory are implicitly added as dependencies of type Wanted= to the unit. This is useful to hook units into the start-up of other units, without having to modify their unit files. For details about the semantics of Wanted= see below. The preferred way to create symlinks in the .wants/ directory of a unit file is with the enable command of the systemctl(1) tool which reads information from the [Install] section of unit files (see below). A similar functionality exists for Requires= type dependencies as well, the directory suffix is .requires/ in this case. Along with a unit file foo.service a directory foo.service.d/ may exist. All files with the suffix ".conf" from this directory will be parsed after the file itself is parsed. This is useful to alter or add configuration settings to a unit, without having to modify their unit files. Make sure that the file that is included has the appropriate section headers before any directive. If a line starts with .include followed by a filename, the specified file will be parsed at this point. Make sure that the file that is included has the appropriate section headers before any directives. Note that while systemd offers a flexible dependency system between units it is recommended to use this functionality only sparingly and instead rely on techniques such as bus-based or socket-based activation which make dependencies implicit, resulting in a both simpler and more flexible system. Some unit names reflect paths existing in the file system namespace. Example: a device unit dev-sda.device refers to a device with the device node /dev/sda in the file system namespace. If this applies a special way to escape the path name is used, so that the result is usable as part of a filename. Basically, given a path, "/" is replaced by "-", and all unprintable characters and the "-" are replaced by C-style "\x20" escapes. The root directory "/" is encoded as single dash, while otherwise the initial and ending "/" is removed from all paths during transformation. This escaping is reversible. Optionally, units may be instantiated from a template file at runtime. This allows creation of multiple units from a single configuration file. If systemd looks for a unit configuration file it will first search for the literal unit name in the filesystem. If that yields no success and the unit name contains an "@" character, systemd will look for a unit template that shares the same name but with the instance string (i.e. the part between the "@" character and the suffix) removed. Example: if a service getty@tty3.service is requested and no file by that name is found, systemd will look for getty@.service and instantiate a service from that configuration file if it is found. To refer to the instance string from within the configuration file you may use the special "%i" specifier in many of the configuration options. See below for details. If a unit file is empty (i.e. has the file size 0) or is symlinked to /dev/null its configuration will not be loaded and it appears with a load state of "masked", and cannot be activated. Use this as an effective way to fully disable a unit, making it impossible to start it even manually. The unit file format is covered by the Interface Stability Promise. Unit Load Path Unit files are loaded from a set of paths determined during compilation, described in the two tables below. Unit files found in directories listed earlier override files with the same name in directories lower in the list. When systemd is running in user mode (--user) and the variable $SYSTEMD_UNIT_PATH is set, this contents of this variable overrides the unit load path. Table 1. Load path when running in system mode (--system). Path Description /etc/systemd/system Local configuration /run/systemd/systemd Runtime units /usr/lib/systemd/system Units of installed packages Table 2. Load path when running in user mode (--user). Path Description $HOME/.config/systemd/user User configuration /etc/systemd/user Local configuration /run/systemd/user Runtime units /usr/lib/systemd/user Units of installed packages Additional units might be loaded into systemd ("linked") from directories not on the unit load path. See the link command for systemctl(1). Also, some units are dynamically created via generators Generators. Options Unit file may include a [Unit] section, which carries generic information about the unit that is not dependent on the type of unit: Description= A free-form string describing the unit. This is intended for use in UIs to show descriptive information along with the unit name. Documentation= A space-separated list of URIs referencing documentation for this unit or its configuration. Accepted are only URIs of the types "http://", "https://", "file:", "info:", "man:". For more information about the syntax of these URIs, see uri(7). The URIs should be listed in order of relevance, starting with the most relevant. It is a good idea to first reference documentation that explains what the unit's purpose is, followed by how it is configured, followed by any other related documentation. This option may be specified more than once in which case the specified list of URIs is merged. If the empty string is assigned to this option, the list is reset and all prior assignments will have no effect. Requires= Configures requirement dependencies on other units. If this unit gets activated, the units listed here will be activated as well. If one of the other units gets deactivated or its activation fails, this unit will be deactivated. This option may be specified more than once, in which case requirement dependencies for all listed names are created. Note that requirement dependencies do not influence the order in which services are started or stopped. This has to be configured independently with the After= or Before= options. If a unit foo.service requires a unit bar.service as configured with Requires= and no ordering is configured with After= or Before=, then both units will be started simultaneously and without any delay between them if foo.service is activated. Often it is a better choice to use Wants= instead of Requires= in order to achieve a system that is more robust when dealing with failing services. Note that dependencies of this type may also be configured outside of the unit configuration file by adding a symlink to a .requires/ directory accompanying the unit file. For details see above. RequiresOverridable= Similar to Requires=. Dependencies listed in RequiresOverridable= which cannot be fulfilled or fail to start are ignored if the startup was explicitly requested by the user. If the start-up was pulled in indirectly by some dependency or automatic start-up of units that is not requested by the user this dependency must be fulfilled and otherwise the transaction fails. Hence, this option may be used to configure dependencies that are normally honored unless the user explicitly starts up the unit, in which case whether they failed or not is irrelevant. Requisite=, RequisiteOverridable= Similar to Requires= and RequiresOverridable=, respectively. However, if a unit listed here is not started already it will not be started and the transaction fails immediately. Wants= A weaker version of Requires=. A unit listed in this option will be started if the configuring unit is. However, if the listed unit fails to start up or cannot be added to the transaction this has no impact on the validity of the transaction as a whole. This is the recommended way to hook start-up of one unit to the start-up of another unit. Note that dependencies of this type may also be configured outside of the unit configuration file by adding a symlink to a .wants/ directory accompanying the unit file. For details see above. BindsTo= Configures requirement dependencies, very similar in style to Requires=, however in addition to this behavior it also declares that this unit is stopped when any of the units listed suddenly disappears. Units can suddenly, unexpectedly disappear if a service terminates on its own choice, a device is unplugged or a mount point unmounted without involvement of systemd. PartOf= Configures dependencies similar to Requires=, but limited to stopping and restarting of units. When systemd stops or restarts the units listed here, the action is propagated to this unit. Note that this is a one way dependency - changes to this unit do not affect the listed units. Conflicts= Configures negative requirement dependencies. If a unit has a Conflicts= setting on another unit, starting the former will stop the latter and vice versa. Note that this setting is independent of and orthogonal to the After= and Before= ordering dependencies. If a unit A that conflicts with a unit B is scheduled to be started at the same time as B, the transaction will either fail (in case both are required part of the transaction) or be modified to be fixed (in case one or both jobs are not a required part of the transaction). In the latter case the job that is not the required will be removed, or in case both are not required the unit that conflicts will be started and the unit that is conflicted is stopped. Before=, After= Configures ordering dependencies between units. If a unit foo.service contains a setting Before=bar.service and both units are being started, bar.service's start-up is delayed until foo.service is started up. Note that this setting is independent of and orthogonal to the requirement dependencies as configured by Requires=. It is a common pattern to include a unit name in both the After= and Requires= option in which case the unit listed will be started before the unit that is configured with these options. This option may be specified more than once, in which case ordering dependencies for all listed names are created. After= is the inverse of Before=, i.e. while After= ensures that the configured unit is started after the listed unit finished starting up, Before= ensures the opposite, i.e. that the configured unit is fully started up before the listed unit is started. Note that when two units with an ordering dependency between them are shut down, the inverse of the start-up order is applied. i.e. if a unit is configured with After= on another unit, the former is stopped before the latter if both are shut down. If one unit with an ordering dependency on another unit is shut down while the latter is started up, the shut down is ordered before the start-up regardless whether the ordering dependency is actually of type After= or Before=. If two units have no ordering dependencies between them they are shut down or started up simultaneously, and no ordering takes place. OnFailure= Lists one or more units that are activated when this unit enters the "failed" state. PropagatesReloadTo=, ReloadPropagatedFrom= Lists one or more units where reload requests on the unit will be propagated to/on the other unit will be propagated from. Issuing a reload request on a unit will automatically also enqueue a reload request on all units that the reload request shall be propagated to via these two settings. RequiresMountsFor= Takes a space-separated list of absolute paths. Automatically adds dependencies of type Requires= and After= for all mount units required to access the specified path. OnFailureIsolate= Takes a boolean argument. If true the unit listed in OnFailure= will be enqueued in isolation mode, i.e. all units that are not its dependency will be stopped. If this is set only a single unit may be listed in OnFailure=. Defaults to false. IgnoreOnIsolate= Takes a boolean argument. If true this unit will not be stopped when isolating another unit. Defaults to false. IgnoreOnSnapshot= Takes a boolean argument. If true this unit will not be included in snapshots. Defaults to true for device and snapshot units, false for the others. StopWhenUnneeded= Takes a boolean argument. If true this unit will be stopped when it is no longer used. Note that in order to minimize the work to be executed, systemd will not stop units by default unless they are conflicting with other units, or the user explicitly requested their shut down. If this option is set, a unit will be automatically cleaned up if no other active unit requires it. Defaults to false. RefuseManualStart=, RefuseManualStop= Takes a boolean argument. If true this unit can only be activated or deactivated indirectly. In this case explicit start-up or termination requested by the user is denied, however if it is started or stopped as a dependency of another unit, start-up or termination will succeed. This is mostly a safety feature to ensure that the user does not accidentally activate units that are not intended to be activated explicitly, and not accidentally deactivate units that are not intended to be deactivated. These options default to false. AllowIsolate= Takes a boolean argument. If true this unit may be used with the systemctl isolate command. Otherwise this will be refused. It probably is a good idea to leave this disabled except for target units that shall be used similar to runlevels in SysV init systems, just as a precaution to avoid unusable system states. This option defaults to false. DefaultDependencies= Takes a boolean argument. If true (the default), a few default dependencies will implicitly be created for the unit. The actual dependencies created depend on the unit type. For example, for service units, these dependencies ensure that the service is started only after basic system initialization is completed and is properly terminated on system shutdown. See the respective man pages for details. Generally, only services involved with early boot or late shutdown should set this option to false. It is highly recommended to leave this option enabled for the majority of common units. If set to false, this option does not disable all implicit dependencies, just non-essential ones. JobTimeoutSec= When clients are waiting for a job of this unit to complete, time out after the specified time. If this time limit is reached the job will be cancelled, the unit however will not change state or even enter the "failed" mode. This value defaults to 0 (job timeouts disabled), except for device units. NB: this timeout is independent from any unit-specific timeout (for example, the timeout set with Timeout= in service units) as the job timeout has no effect on the unit itself, only on the job that might be pending for it. Or in other words: unit-specific timeouts are useful to abort unit state changes, and revert them. The job timeout set with this option however is useful to abort only the job waiting for the unit state to change. ConditionPathExists=, ConditionPathExistsGlob=, ConditionPathIsDirectory=, ConditionPathIsSymbolicLink=, ConditionPathIsMountPoint=, ConditionPathIsReadWrite=, ConditionDirectoryNotEmpty=, ConditionFileNotEmpty=, ConditionFileIsExecutable=, ConditionKernelCommandLine=, ConditionVirtualization=, ConditionSecurity=, ConditionCapability=, ConditionHost=, ConditionACPower=, ConditionNull= Before starting a unit verify that the specified condition is true. If it is not true the starting of the unit will be skipped, however all ordering dependencies of it are still respected. A failing condition will not result in the unit being moved into a failure state. The condition is checked at the time the queued start job is to be executed. With ConditionPathExists= a file existence condition is checked before a unit is started. If the specified absolute path name does not exist the condition will fail. If the absolute path name passed to ConditionPathExists= is prefixed with an exclamation mark ("!"), the test is negated, and the unit is only started if the path does not exist. ConditionPathExistsGlob= is similar to ConditionPathExists=, but checks for the existence of at least one file or directory matching the specified globbing pattern. ConditionPathIsDirectory= is similar to ConditionPathExists= but verifies whether a certain path exists and is a directory. ConditionPathIsSymbolicLink= is similar to ConditionPathExists= but verifies whether a certain path exists and is a symbolic link. ConditionPathIsMountPoint= is similar to ConditionPathExists= but verifies whether a certain path exists and is a mount point. ConditionPathIsReadWrite= is similar to ConditionPathExists= but verifies whether the underlying file system is readable and writable (i.e. not mounted read-only). ConditionDirectoryNotEmpty= is similar to ConditionPathExists= but verifies whether a certain path exists and is a non-empty directory. ConditionFileNotEmpty= is similar to ConditionPathExists= but verifies whether a certain path exists and refers to a regular file with a non-zero size. ConditionFileIsExecutable= is similar to ConditionPathExists= but verifies whether a certain path exists, is a regular file and marked executable. Similar, ConditionKernelCommandLine= may be used to check whether a specific kernel command line option is set (or if prefixed with the exclamation mark unset). The argument must either be a single word, or an assignment (i.e. two words, separated "="). In the former case the kernel command line is searched for the word appearing as is, or as left hand side of an assignment. In the latter case the exact assignment is looked for with right and left hand side matching. ConditionVirtualization= may be used to check whether the system is executed in a virtualized environment and optionally test whether it is a specific implementation. Takes either boolean value to check if being executed in any virtualized environment, or one of vm and container to test against a generic type of virtualization solution, or one of qemu, kvm, vmware, microsoft, oracle, xen, bochs, chroot, uml, openvz, lxc, lxc-libvirt, systemd-nspawn to test against a specific implementation. If multiple virtualization technologies are nested only the innermost is considered. The test may be negated by prepending an exclamation mark. ConditionSecurity= may be used to check whether the given security module is enabled on the system. Currently the recognized values values are selinux, apparmor, ima and smack. The test may be negated by prepending an exclamation mark. ConditionCapability= may be used to check whether the given capability exists in the capability bounding set of the service manager (i.e. this does not check whether capability is actually available in the permitted or effective sets, see capabilities(7) for details). Pass a capability name such as "CAP_MKNOD", possibly prefixed with an exclamation mark to negate the check. ConditionHost= may be used to match against the hostname or machine ID of the host. This either takes a hostname string (optionally with shell style globs) which is tested against the locally set hostname as returned by gethostname(2), or a machine ID formatted as string (see machine-id(5)). The test may be negated by prepending an exclamation mark. ConditionACPower= may be used to check whether the system has AC power, or is exclusively battery powered at the time of activation of the unit. This takes a boolean argument. If set to true the condition will hold only if at least one AC connector of the system is connected to a power source, or if no AC connectors are known. Conversely, if set to false the condition will hold only if there is at least one AC connector known and all AC connectors are disconnected from a power source. Finally, ConditionNull= may be used to add a constant condition check value to the unit. It takes a boolean argument. If set to false the condition will always fail, otherwise succeed. If multiple conditions are specified the unit will be executed if all of them apply (i.e. a logical AND is applied). Condition checks can be prefixed with a pipe symbol (|) in which case a condition becomes a triggering condition. If at least one triggering condition is defined for a unit then the unit will be executed if at least one of the triggering conditions apply and all of the non-triggering conditions. If you prefix an argument with the pipe symbol and an exclamation mark the pipe symbol must be passed first, the exclamation second. Except for ConditionPathIsSymbolicLink=, all path checks follow symlinks. If any of these options is assigned the empty string the list of conditions is reset completely, all previous condition settings (of any kind) will have no effect. SourcePath= A path to a configuration file this unit has been generated from. This is primarily useful for implementation of generator tools that convert configuration from an external configuration file format into native unit files. Thus functionality should not be used in normal units. Unit file may include a [Install] section, which carries installation information for the unit. This section is not interpreted by systemd(1) during runtime. It is used exclusively by the enable and disable commands of the systemctl(1) tool during installation of a unit: Alias= Additional names this unit shall be installed under. The names listed here must have the same suffix (i.e. type) as the unit file name. This option may be specified more than once, in which case all listed names are used. At installation time, systemctl enable will create symlinks from these names to the unit filename. WantedBy=, RequiredBy= A symbolic link is created in the .wants/ or .requires/ directory of the listed unit when this unit is activated by systemctl enable. This has the effect that a dependency of type Wants= or Requires= is added from the listed unit to the current unit. The primary result is that the current unit will be started when the listed unit is started. See the description of Wants= and Requires= in the [Unit] section for details. WantedBy=foo.service in a service bar.service is mostly equivalent to Alias=foo.service.wants/bar.service in the same file. In case of template units, systemctl enable must be called with an instance name, and this instance will be added to the .wants/ or .requires/ list of the listed unit. E.g. WantedBy=getty.target in a service getty@.service will result in systemctl enable getty@tty2.service creating a getty.target.wants/getty@tty2.service link to getty@.service. Also= Additional units to install/deinstall when this unit is installed/deinstalled. If the user requests installation/deinstallation of a unit with this option configured, systemctl enable and systemctl disable will automatically install/uninstall units listed in this option as well. The following specifiers are interpreted in the Install section: %n, %N, %p, %i, %U, %u, %m, %H, %b, %v. For their meaning see the next section. Specifiers Many settings resolve specifiers which may be used to write generic unit files referring to runtime or unit parameters that are replaced when the unit files are loaded. The following specifiers are understood: Table 3. Specifiers available in unit files Specifier Meaning Details "%n" Full unit name "%N" Unescaped full unit name "%p" Prefix name For instantiated units this refers to the string before the @. For non-instantiated units this refers to to the name of the unit with the type suffix removed. "%P" Unescaped prefix name "%i" Instance name For instantiated units: this is the string between the "@" character and the suffix. "%I" Unescaped instance name "%f" Unescaped filename This is either the unescaped instance name (if applicable) with / prepended (if applicable), or the prefix name similarly prepended with /. "%c" Control group path of the unit "%r" Root control group path where units are placed. For system instances this usually resolves to /system, except in containers, where the path might be prefixed with the container's root control group. "%R" Parent directory of the control group path where units are placed. For system instances this usually resolves to /, except in containers, where this resolves to the container's root directory. This specifier is particularly useful in the ControlGroup= setting (see systemd.exec(5)). "%t" Runtime socket dir This is either /run (for the system manager) or "$XDG_RUNTIME_DIR" (for user managers). "%u" User name This is the name of the configured user of the unit, or (if none is set) the user running the systemd instance. "%U" User UID This is the UID of the configured user of the unit, or (if none is set) the user running the systemd instance. "%h" User home directory This is the home directory of the configured user of the unit, or (if none is set) the user running the systemd instance. "%s" User shell This is the shell of the configured user of the unit, or (if none is set) the user running the systemd instance. If the user is "root" (UID equal to 0), the shell configured in account database is ignored and /bin/sh is always used. "%m" Machine ID The machine ID of the running system, formatted as string. See machine-id(5) for more information. "%b" Boot ID The boot ID of the running system, formatted as string. See random(4) for more information. "%H" Host name The hostname of the running system. "%v" Kernel release Identical to uname -r output. "%%" Escaped % Single percent sign. See Also systemd(1), systemctl(8), systemd.special(7), systemd.service(5), systemd.socket(5), systemd.device(5), systemd.mount(5), systemd.automount(5), systemd.swap(5), systemd.target(5), systemd.path(5), systemd.timer(5), systemd.snapshot(5), systemd.scope(5), systemd.slice(5), systemd.time(7), capabilities(7), systemd.directives(7), uname(1) ================================================ FILE: packages/sysutils/systemd/config/system.d/cifs.mount.sample ================================================ # This is a sample service script to mount CIFS/SAMBA shares. # Please read carefully the comments in this file. For production usage # you can remove all comments (lines beginning with "#") from this file. [Unit] # The description should be used to explain what this servicefile is for Description=test cifs mount script # if we do network mounts like here we *require* 'network-online.service' # which checks if the network is online Requires=network-online.service # our scripts must start *after* 'network-online.service', on timeout and if # 'network-online.service' fails we can not mount and this scripts fails too After=network-online.service # usually we mount networks shares because we want they avaible *before* XBMC starts. # so XBMC has access to this mounts from beginning. Note: this slows down the boot! Before=kodi.service [Mount] # The share we want mount What=//192.168.0.31/Music # Where we want mount this share Where=/storage/music2 # Any options you usually use with the "-o" parameter in the mount command Options=username=myusername,password=mypassword # filesystem type Type=cifs [Install] # The target is used by 'systemctl enable <name_of_this_file.mount>' to link # this service to a runlevel for starting on boot. usually 'multi-user.target' # is ok here. WantedBy=multi-user.target # Important: # this file must be renamed to <mountpoint>.mount where <mountpoint>, is the FULL path # where the share will be mounted but slashes "/" MUST BE REPLACED with dashes "-" with .mount # as extension. # This means, if we want mount to "/storage/music2" (see above "Where=/storage/music2") # then this file must be renamed to 'storage-music2.mount' and can be enabled via ssh with the # command 'systemctl enable storage-music2.mount' ================================================ FILE: packages/sysutils/systemd/config/system.d/nfs.mount.sample ================================================ # This is a sample service script to mount NFS shares. # Please read carefully the comments in this file. For production usage # you can remove all comments (lines beginning with "#") from this file. [Unit] # The description should be used to explain what this servicefile is for Description=test nfs mount script # if we do network mounts like here we *require* 'network-online.service' # which checks if the network is online Requires=network-online.service # our scripts must start *after* 'network-online.service', on timeout and if # 'network-online.service' fails we can not mount and this scripts fails too After=network-online.service # usually we mount networks shares because we want they avaible *before* XBMC starts. # so XBMC has access to this mounts from beginning. Note: this slows down the boot! Before=kodi.service [Mount] # The share we want mount What=192.168.0.31:/movies # Where we want mount this share Where=/storage/movies2 # Any options you usually use with the "-o" parameter in the mount command Options= # filesystem type (for NFSv4 use Type=nfs4) Type=nfs [Install] # The target is used by 'systemctl enable <name_of_this_file.mount>' to link # this service to a runlevel for starting on boot. usually 'multi-user.target' # is ok here. WantedBy=multi-user.target # Important: # this file must be renamed to <mountpoint>.mount where <mountpoint>, is the FULL path # where the share will be mounted but slashes "/" MUST BE REPLACED with dashes "-" with .mount # as extension. # This means, if we want mount to "/storage/movies2" (see above "Where=/storage/movies2") # then this file must be renamed to 'storage-movies2.mount' and can be enabled via ssh with the # command 'systemctl enable storage-movies2.mount' ================================================ FILE: packages/sysutils/systemd/config/system.d/openvpn.service.sample ================================================ [Unit] Description=OpenVPN Autorun Service [Service] Type=forking Requires=network-online.service After=network-online.service ExecStart=/usr/sbin/openvpn --daemon --config /storage/.config/openvpn.config Restart=always RestartSec=15 [Install] WantedBy=kodi.target # NOTES: # # 1) Edit /storage/.config/openvpn.config to the .config/.conf/.ovpn file # from your VPN service provider and test it works first by connecting at # the console: # # /usr/sbin/openvpn --daemon --config /storage/.config/openvpn.config # # 2) The openvpn.service file must be addeded to the active systemd config # before it will work. This is done by running: # # systemctl enable openvpn.service # # 3) If you suspend/resume your LibreELEC system you will need to stop and # restart the connection with a systemd *.power script, e.g. # # mkdir -p /storage/.config/sleep.d # nano /storage/.config/sleep.d/01-openvpn.power # # Copy the sample script below. Remove # marks except for #!/bin/bash # # #!/bin/sh # case "$1" in # pre) # systemctl stop openvpn.service # ;; # post) # systemctl start openvpn.service # ;; # esac ================================================ FILE: packages/sysutils/systemd/config/timesyncd.conf.d/README ================================================ TIMESYNCD.CONF(5) timesyncd.conf TIMESYNCD.CONF(5) NAME timesyncd.conf, timesyncd.conf.d - Network Time Synchronization configuration files SYNOPSIS /etc/systemd/timesyncd.conf /etc/systemd/timesyncd.conf.d/*.conf /run/systemd/timesyncd.conf.d/*.conf /usr/lib/systemd/timesyncd.conf.d/*.conf DESCRIPTION These configuration files control NTP network time synchronization. See systemd.syntax(5) for a general description of the syntax. CONFIGURATION DIRECTORIES AND PRECEDENCE The default configuration is defined during compilation, so a configuration file is only needed when it is necessary to deviate from those defaults. By default, the configuration file in /etc/systemd/ contains commented out entries showing the defaults as a guide to the administrator. This file can be edited to create local overrides. When packages need to customize the configuration, they can install configuration snippets in /usr/lib/systemd/*.conf.d/. Files in /etc/ are reserved for the local administrator, who may use this logic to override the configuration files installed by vendor packages. The main configuration file is read before any of the configuration directories, and has the lowest precedence; entries in a file in any configuration directory override entries in the single configuration file. Files in the *.conf.d/ configuration subdirectories are sorted by their filename in lexicographic order, regardless of which of the subdirectories they reside in. When multiple files specify the same option, for options which accept just a single value, the entry in the file with the lexicographically latest name takes precedence. For options which accept a list of values, entries are collected as they occur in files sorted lexicographically. It is recommended to prefix all filenames in those subdirectories with a two-digit number and a dash, to simplify the ordering of the files. To disable a configuration file supplied by the vendor, the recommended way is to place a symlink to /dev/null in the configuration directory in /etc/, with the same filename as the vendor configuration file. OPTIONS The following settings are configured in the "[Time]" section: NTP= A space-separated list of NTP server host names or IP addresses. During runtime this list is combined with any per-interface NTP servers acquired from systemd-networkd.service(8). systemd-timesyncd will contact all configured system or per-interface servers in turn until one is found that responds. When the empty string is assigned, the list of NTP servers is reset, and all assignments prior to this one will have no effect. This setting defaults to an empty list. FallbackNTP= A space-separated list of NTP server host names or IP addresses to be used as the fallback NTP servers. Any per-interface NTP servers obtained from systemd-networkd.service(8) take precedence over this setting, as do any servers set via NTP= above. This setting is hence only used if no other NTP server information is known. When the empty string is assigned, the list of NTP servers is reset, and all assignments prior to this one will have no effect. If this option is not given, a compiled-in list of NTP servers is used instead. RootDistanceMaxSec= Maximum acceptable root distance. Takes a time value (in seconds). Defaults to 5 seconds. PollIntervalMinSec=, PollIntervalMaxSec= The minimum and maximum poll intervals for NTP messages. Each setting takes a time value (in seconds). PollIntervalMinSec= must not be smaller than 16 seconds. PollIntervalMaxSec= must be larger than PollIntervalMinSec=. PollIntervalMinSec= defaults to 32 seconds, and PollIntervalMaxSec= defaults to 2048 seconds. SEE ALSO systemd(1), systemd-timesyncd.service(8), systemd-networkd.service(8) systemd 241 TIMESYNCD.CONF(5) ================================================ FILE: packages/sysutils/systemd/config/tmpfiles.d/README ================================================ Name tmpfiles.d — Configuration for creation, deletion and cleaning of volatile and temporary files Synopsis /etc/tmpfiles.d/*.conf /run/tmpfiles.d/*.conf /usr/lib/tmpfiles.d/*.conf Description systemd-tmpfiles uses the configuration files from the above directories to describe the creation, cleaning and removal of volatile and temporary files and directories which usually reside in directories such as /run or /tmp. Configuration Format Each configuration file shall be named in the style of <program>.conf. Files in /etc/ override files with the same name in /usr/lib/ and /run/. Files in /run/ override files with the same name in /usr/lib/. Packages should install their configuration files in /usr/lib/. Files in /etc/ are reserved for the local administrator, who may use this logic to override the configuration files installed by vendor packages. All configuration files are sorted by their filename in alphabetical order, regardless in which of the directories they reside, to guarantee that a specific configuration file takes precedence over another file with an alphabetically later name. If the administrator wants to disable a configuration file supplied by the vendor the recommended way is to place a symlink to /dev/null in /etc/tmpfiles.d/ bearing the same filename. The configuration format is one line per path containing action, path, mode, ownership, age and argument fields: Type Path Mode UID GID Age Argument d /run/user 0755 root root 10d - L /tmp/foobar - - - - /dev/null Type f Create a file if it doesn't exist yet (optionally writing a short string into it, if the argument parameter is passed) F Create or truncate a file (optionally writing a short string into it, if the argument parameter is passed) w Write the argument parameter to a file, if the file exists. Lines of this type accept shell-style globs in place of normal path names. The argument parameter will be written without a trailing newline. C-style backslash escapes are interpreted. d Create a directory if it doesn't exist yet D Create or empty a directory p Create a named pipe (FIFO) if it doesn't exist yet L Create a symlink if it doesn't exist yet c Create a character device node if it doesn't exist yet b Create a block device node if it doesn't exist yet x Ignore a path during cleaning. Use this type to exclude paths from clean-up as controlled with the Age parameter. Note that lines of this type do not influence the effect of r or R lines. Lines of this type accept shell-style globs in place of normal path names. X Ignore a path during cleanup. Use this type to prevent path removal as controlled with the Age parameter. Note that if path is a directory, content of a directory is not excluded from clean-up, only directory itself. Lines of this type accept shell-style globs in place of normal path names. r Remove a file or directory if it exists. This may not be used to remove non-empty directories, use R for that. Lines of this type accept shell-style globs in place of normal path names. R Recursively remove a path and all its subdirectories (if it is a directory). Lines of this type accept shell-style globs in place of normal path names. z Restore SELinux security context label and set ownership and access mode of a file or directory if it exists. Lines of this type accept shell-style globs in place of normal path names. Z Recursively restore SELinux security context label and set ownership and access mode of a path and all its subdirectories (if it is a directory). Lines of this type accept shell-style globs in place of normal path names. Mode The file access mode to use when creating this file or directory. If omitted or when set to - the default is used: 0755 for directories, 0644 for all other file objects. For z, Z lines if omitted or when set to - the file access mode will not be modified. This parameter is ignored for x, r, R, L lines. UID, GID The user and group to use for this file or directory. This may either be a numeric user/group ID or a user or group name. If omitted or when set to - the default 0 (root) is used. For z, Z lines when omitted or when set to - the file ownership will not be modified. These parameters are ignored for x, r, R, L lines. Age The date field, when set, is used to decide what files to delete when cleaning. If a file or directory is older than the current time minus the age field it is deleted. The field format is a series of integers each followed by one of the following postfixes for the respective time units: s, min, h, d, w, ms, m, us If multiple integers and units are specified the time values are summed up. If an integer is given without a unit, s is assumed. When the age is set to zero, the files are cleaned unconditionally. The age field only applies to lines starting with d, D and x. If omitted or set to - no automatic clean-up is done. If the age field starts with a tilde character (~) the clean-up is only applied to files and directories one level inside the directory specified, but not the files and directories immediately inside it. Argument For L lines determines the destination path of the symlink. For c, b determines the major/minor of the device node, with major and minor formatted as integers, separated by :, e.g. "1:3". For f, F, w may be used to specify a short string that is written to the file, suffixed by a newline. Ignored for all other lines. Example Example 1. /etc/tmpfiles.d/screen.conf example screen needs two directories created at boot with specific modes and ownership. d /var/run/screens 1777 root root 10d d /var/run/uscreens 0755 root root 10d12h See Also systemd(1), systemd-tmpfiles(8), systemd-delta(1) ================================================ FILE: packages/sysutils/systemd/config/udev.rules.d/README ================================================ The files in this directory are read by udev(7) and used when events are performed by the kernel. The udev daemon watches this directory with inotify so that changes to these files are automatically picked up, for this reason they must be files and not symlinks to another location as in the case in Debian. Packages do not generally install rules here, this directory is for local rules. If you want to override behaviour of package-supplied rules, which can be found in /usr/lib/udev/rules.d, you can do one of two things: 1) Write your own rules in this directory that assign the name, symlinks, permissions, etc. that you want. Pick a number higher than the rules you want to override, and yours will be used. 2) Copy the file from /usr/lib/udev/rules.d and edit it here; you should generally only do this if you want to prevent a program from being run. If the ordering of files in this directory are not important to you, it's recommended that you simply name your files "descriptive-name.rules" such that they are processed AFTER all numbered rules in both this directory and /usr/lib/udev/rules.d and thus override anything set there. ================================================ FILE: packages/sysutils/systemd/hwdb.d/70-local-keyboard.hwdb ================================================ # alfawise z1 remote evdev:input:b0005v2B54p1603e* KEYBOARD_KEY_c0041=enter # auvipal g9f evdev:input:b0005v045Ep0041* KEYBOARD_KEY_c0041=enter KEYBOARD_KEY_70071=l KEYBOARD_KEY_70070=g KEYBOARD_KEY_7006f=x KEYBOARD_KEY_7006e=i # buzztv bt-300/bt-400 smart remote evdev:input:b0005v0957p1001* KEYBOARD_KEY_c0041=enter KEYBOARD_KEY_c0040=c KEYBOARD_KEY_70040=z KEYBOARD_KEY_70041=esc KEYBOARD_KEY_70042=t KEYBOARD_KEY_70043=e KEYBOARD_KEY_70044=o KEYBOARD_KEY_70045=volumeup KEYBOARD_KEY_70069=volumedown # g7bts remote evdev:input:b0005v045Ep0041e0300* KEYBOARD_KEY_c0041=enter # g20bts remote evdev:input:b0005v2B54p1600e0000* KEYBOARD_KEY_c0041=enter # homatics b21 evdev:input:b0005v0957p0006* # homatics b21 variant (sold with dongle g 4k) evdev:input:b0005v0957p0019* # dune b25 evdev:input:b0005v0957p000A* KEYBOARD_KEY_c0041=enter KEYBOARD_KEY_c009c=up KEYBOARD_KEY_c009d=down KEYBOARD_KEY_c0030=s KEYBOARD_KEY_c008d=e KEYBOARD_KEY_c0221=o KEYBOARD_KEY_c0077=a KEYBOARD_KEY_c0078=l KEYBOARD_KEY_c0079=n KEYBOARD_KEY_c007a=q KEYBOARD_KEY_c0096=v KEYBOARD_KEY_c01bb=z # justboom smart remote evdev:input:b0003v2252p0120* KEYBOARD_KEY_c0041=enter KEYBOARD_KEY_c0040=c # nokia 8010 remotes evdev:input:b0005v1D5A* KEYBOARD_KEY_c0041=enter # nvidia shield remotes evdev:input:b0005v0955p7213* KEYBOARD_KEY_c0041=enter evdev:input:b0005v0955p7217* KEYBOARD_KEY_c0041=enter # o2.cz khamsin bluetooth remote evdev:input:b0005v0217p0000e0110* KEYBOARD_KEY_c0041=enter KEYBOARD_KEY_c0040=c # osmcrf25 remotes evdev:input:b0003v2252p1069* KEYBOARD_KEY_7002e=volumeup KEYBOARD_KEY_7002d=volumedown KEYBOARD_KEY_7000c=kpleftparen KEYBOARD_KEY_70006=kprightparen evdev:input:b0003v2017p1690* KEYBOARD_KEY_7002e=volumeup KEYBOARD_KEY_7002d=volumedown KEYBOARD_KEY_7000c=kpleftparen KEYBOARD_KEY_70006=kprightparen evdev:input:b0003v2017p1689* KEYBOARD_KEY_7002e=volumeup KEYBOARD_KEY_7002d=volumedown KEYBOARD_KEY_7000c=kpleftparen KEYBOARD_KEY_70006=kprightparen evdev:input:b0003v2017p1688* KEYBOARD_KEY_7004a=esc KEYBOARD_KEY_c0060=kpleftparen KEYBOARD_KEY_10084=kprightparen KEYBOARD_KEY_7002e=volumeup KEYBOARD_KEY_7002d=volumedown evdev:input:b0003v2252p1037* KEYBOARD_KEY_7004a=esc KEYBOARD_KEY_c0060=kpleftparen KEYBOARD_KEY_10084=kprightparen # ugoos ur01-ble remote evdev:input:b0005v005Dp0001* KEYBOARD_KEY_c0041=enter # wechip g20 remote evdev:input:b0003v4842p0001* KEYBOARD_KEY_c0041=enter # xaomi remote evdev:input:b0005v2717p32B9e4A4C* KEYBOARD_KEY_c0041=enter # yyykq remote evdev:input:b0005v0416p0300* KEYBOARD_KEY_c0041=enter # zidoo v10 evdev:input:b0005v2B54p1600* KEYBOARD_KEY_c0041=enter ================================================ FILE: packages/sysutils/systemd/package.mk ================================================ # 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) PKG_NAME="systemd" PKG_VERSION="252.6" PKG_SHA256="5f0b391f7e481f9ce0798515f34e85963990d42a27f9f80fc9e7321610b69784" PKG_LICENSE="LGPL2.1+" PKG_SITE="http://www.freedesktop.org/wiki/Software/systemd" PKG_URL="https://github.com/systemd/systemd-stable/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libcap kmod util-linux entropy libidn2 wait-time-sync Jinja2:host" PKG_LONGDESC="A system and session manager for Linux, compatible with SysV and LSB init scripts." PKG_MESON_OPTS_TARGET="--libdir=/usr/lib \ -Drootprefix=/usr \ -Dsplit-usr=false \ -Dsplit-bin=true \ -Ddefault-hierarchy=hybrid \ -Dtty-gid=5 \ -Dtests=false \ -Dseccomp=false \ -Dselinux=false \ -Dapparmor=false \ -Dpolkit=false \ -Dacl=false \ -Daudit=false \ -Dblkid=true \ -Dfdisk=false \ -Dkmod=true \ -Dpam=false \ -Dpwquality=false \ -Dmicrohttpd=false \ -Dlibcryptsetup=false \ -Dlibcurl=false \ -Dlibidn=false \ -Dlibidn2=true \ -Dlibiptc=false \ -Dqrencode=false \ -Dgcrypt=false \ -Dgnutls=false \ -Dopenssl=false \ -Dp11kit=false \ -Delfutils=false \ -Dzlib=false \ -Dbzip2=false \ -Dxz=false \ -Dlz4=false \ -Dxkbcommon=false \ -Dpcre2=false \ -Dglib=false \ -Ddbus=false \ -Ddefault-dnssec=no \ -Dimportd=false \ -Dremote=false \ -Dutmp=true \ -Dhibernate=false \ -Denvironment-d=false \ -Dbinfmt=false \ -Drepart=false \ -Dcoredump=false \ -Dresolve=false \ -Dlogind=true \ -Dhostnamed=true \ -Dlocaled=false \ -Dmachined=false \ -Dportabled=false \ -Duserdb=false \ -Dhomed=false \ -Dnetworkd=false \ -Dtimedated=false \ -Dtimesyncd=true \ -Dfirstboot=false \ -Drandomseed=false \ -Dbacklight=false \ -Dvconsole=false \ -Dquotacheck=false \ -Dsysusers=false \ -Dtmpfiles=true \ -Dhwdb=true \ -Drfkill=false \ -Dldconfig=false \ -Dtpm=false \ -Dima=false \ -Dsmack=false \ -Dgshadow=false \ -Didn=false \ -Dnss-myhostname=false \ -Dnss-mymachines=false \ -Dnss-resolve=false \ -Dnss-systemd=false \ -Dman=false \ -Dhtml=false \ -Dlink-udev-shared=true \ -Dlink-systemctl-shared=true \ -Dlink-networkd-shared=false \ -Dbashcompletiondir=no \ -Dzshcompletiondir=no \ -Dkmod-path=/usr/bin/kmod \ -Dmount-path=/usr/bin/mount \ -Dumount-path=/usr/bin/umount \ -Ddebug-tty=${DEBUG_TTY} \ -Dversion-tag=${PKG_VERSION}" if [ "${PROJECT}" = "Generic" ]; then PKG_MESON_OPTS_TARGET+=" -Defi=true" else PKG_MESON_OPTS_TARGET+=" -Defi=false" fi pre_configure_target() { export TARGET_CFLAGS="${TARGET_CFLAGS} -fno-schedule-insns -fno-schedule-insns2 -Wno-format-truncation" export LC_ALL=en_US.UTF-8 } post_makeinstall_target() { # remove unneeded stuff safe_remove ${INSTALL}/etc/init.d safe_remove ${INSTALL}/etc/systemd/system safe_remove ${INSTALL}/etc/xdg safe_remove ${INSTALL}/etc/X11 safe_remove ${INSTALL}/usr/bin/kernel-install safe_remove ${INSTALL}/usr/lib/kernel/install.d safe_remove ${INSTALL}/usr/lib/rpm safe_remove ${INSTALL}/usr/lib/systemd/user safe_remove ${INSTALL}/usr/lib/tmpfiles.d/etc.conf safe_remove ${INSTALL}/usr/lib/tmpfiles.d/home.conf safe_remove ${INSTALL}/usr/share/factory # remove Network adaper renaming rule, this is confusing safe_remove ${INSTALL}/usr/lib/udev/rules.d/80-net-setup-link.rules safe_remove ${INSTALL}/usr/lib/udev/rules.d/71-seat.rules safe_remove ${INSTALL}/usr/lib/udev/rules.d/73-seat-late.rules # remove getty units, we dont want a console safe_remove ${INSTALL}/usr/lib/systemd/system/autovt@.service safe_remove ${INSTALL}/usr/lib/systemd/system/console-getty.service safe_remove ${INSTALL}/usr/lib/systemd/system/container-getty@.service safe_remove ${INSTALL}/usr/lib/systemd/system/getty.target safe_remove ${INSTALL}/usr/lib/systemd/system/getty@.service safe_remove ${INSTALL}/usr/lib/systemd/system/serial-getty@.service safe_remove ${INSTALL}/usr/lib/systemd/system/*.target.wants/getty.target # remove other notused or nonsense stuff (our /etc is ro) safe_remove ${INSTALL}/usr/lib/systemd/systemd-update-done safe_remove ${INSTALL}/usr/lib/systemd/system/systemd-update-done.service safe_remove ${INSTALL}/usr/lib/systemd/system/*.target.wants/systemd-update-done.service # safe_remove ${INSTALL}/usr/lib/systemd/system/dev-hugepages.mount safe_remove ${INSTALL}/usr/lib/systemd/system/*.target.wants/dev-hugepages.mount # safe_remove ${INSTALL}/usr/lib/systemd/system/systemd-journald-audit.socket safe_remove ${INSTALL}/usr/lib/systemd/system/*.target.wants/systemd-journald-audit.socket # adjust systemd-hwdb-update (we have read-only /etc). sed '/^ConditionNeedsUpdate=.*$/d' -i ${INSTALL}/usr/lib/systemd/system/systemd-hwdb-update.service # remove nspawn safe_remove ${INSTALL}/usr/bin/systemd-nspawn safe_remove ${INSTALL}/usr/lib/systemd/system/systemd-nspawn@.service # remove unneeded generators for gen in ${INSTALL}/usr/lib/systemd/system-generators/*; do case "${gen}" in */systemd-debug-generator) # keep it ;; *) safe_remove "${gen}" ;; esac done # remove catalog safe_remove ${INSTALL}/usr/lib/systemd/catalog # remove partition safe_remove ${INSTALL}/usr/lib/systemd/systemd-growfs safe_remove ${INSTALL}/usr/lib/systemd/systemd-makefs # distro preset policy safe_remove ${INSTALL}/usr/lib/systemd/system-preset/* echo "disable *" > ${INSTALL}/usr/lib/systemd/system-preset/99-default.preset safe_remove ${INSTALL}/usr/lib/systemd/user-preset/* echo "disable *" > ${INSTALL}/usr/lib/systemd/user-preset/90-systemd.preset # remove networkd safe_remove ${INSTALL}/usr/lib/systemd/network # remove systemd-time-wait-sync (not detecting slew time updates, using package wait-time-sync) safe_remove ${INSTALL}/usr/lib/systemd/system/systemd-time-wait-sync.service safe_remove ${INSTALL}/usr/lib/systemd/systemd-time-wait-sync # tune journald.conf sed -e "s,^.*Compress=.*$,Compress=no,g" -i ${INSTALL}/etc/systemd/journald.conf sed -e "s,^.*MaxFileSec=.*$,MaxFileSec=0,g" -i ${INSTALL}/etc/systemd/journald.conf sed -e "s,^.*MaxRetentionSec=.*$,MaxRetentionSec=0,g" -i ${INSTALL}/etc/systemd/journald.conf sed -e "s,^.*RuntimeMaxUse=.*$,RuntimeMaxUse=2M,g" -i ${INSTALL}/etc/systemd/journald.conf sed -e "s,^.*RuntimeMaxFileSize=.*$,RuntimeMaxFileSize=128K,g" -i ${INSTALL}/etc/systemd/journald.conf sed -e "s,^.*SplitMode=.*$,SplitMode=none,g" -i ${INSTALL}/etc/systemd/journald.conf sed -e "s,^.*SystemMaxUse=.*$,SystemMaxUse=10M,g" -i ${INSTALL}/etc/systemd/journald.conf # tune logind.conf sed -e "s,^.*HandleLidSwitch=.*$,HandleLidSwitch=ignore,g" -i ${INSTALL}/etc/systemd/logind.conf if [ "${DISPLAYSERVER}" == "no" && ${DISTRO} != "EmuELEC" ]; then sed -e "s,^.*HandlePowerKey=.*$,HandlePowerKey=poweroff,g" -i ${INSTALL}/etc/systemd/logind.conf else sed -e "s,^.*HandlePowerKey=.*$,HandlePowerKey=ignore,g" -i ${INSTALL}/etc/systemd/logind.conf fi # replace systemd-machine-id-setup with ours safe_remove ${INSTALL}/usr/lib/systemd/system/systemd-machine-id-commit.service safe_remove ${INSTALL}/usr/lib/systemd/system/*.target.wants/systemd-machine-id-commit.service safe_remove ${INSTALL}/usr/bin/systemd-machine-id-setup mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/systemd-machine-id-setup ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/userconfig-setup ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/usercache-setup ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/environment-setup ${INSTALL}/usr/bin # use systemd to set cpufreq governor and tunables find_file_path scripts/cpufreq && cp -PRv ${FOUND_PATH} ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/sbin cp ${PKG_DIR}/scripts/network-base-setup ${INSTALL}/usr/sbin cp ${PKG_DIR}/scripts/systemd-timesyncd-setup ${INSTALL}/usr/sbin # /etc/resolv.conf and /etc/hosts must be writable ln -sf /run/libreelec/resolv.conf ${INSTALL}/etc/resolv.conf ln -sf /run/libreelec/hosts ${INSTALL}/etc/hosts ln -sf /run/libreelec/environment ${INSTALL}/etc/environment # provide 'halt', 'shutdown', 'reboot' & co. ln -sf /usr/bin/systemctl ${INSTALL}/usr/sbin/halt ln -sf /usr/bin/systemctl ${INSTALL}/usr/sbin/poweroff ln -sf /usr/bin/systemctl ${INSTALL}/usr/sbin/reboot ln -sf /usr/bin/systemctl ${INSTALL}/usr/sbin/runlevel ln -sf /usr/bin/systemctl ${INSTALL}/usr/sbin/shutdown ln -sf /usr/bin/systemctl ${INSTALL}/usr/sbin/telinit # strip debug_strip ${INSTALL}/usr # defaults mkdir -p ${INSTALL}/usr/config cp -PR ${PKG_DIR}/config/* ${INSTALL}/usr/config safe_remove ${INSTALL}/etc/modules-load.d ln -sf /storage/.config/modules-load.d ${INSTALL}/etc/modules-load.d ln -sf /storage/.config/logind.conf.d ${INSTALL}/etc/systemd/logind.conf.d ln -sf /storage/.config/sleep.conf.d ${INSTALL}/etc/systemd/sleep.conf.d ln -sf /storage/.config/timesyncd.conf.d ${INSTALL}/etc/systemd/timesyncd.conf.d safe_remove ${INSTALL}/etc/sysctl.d ln -sf /storage/.config/sysctl.d ${INSTALL}/etc/sysctl.d safe_remove ${INSTALL}/etc/tmpfiles.d ln -sf /storage/.config/tmpfiles.d ${INSTALL}/etc/tmpfiles.d safe_remove ${INSTALL}/etc/udev/hwdb.d ln -sf /storage/.config/hwdb.d ${INSTALL}/etc/udev/hwdb.d safe_remove ${INSTALL}/etc/udev/rules.d ln -sf /storage/.config/udev.rules.d ${INSTALL}/etc/udev/rules.d # journald ln -sf /storage/.cache/journald.conf.d ${INSTALL}/usr/lib/systemd/journald.conf.d } post_install() { add_group systemd-journal 190 add_group systemd-timesync 191 add_user systemd-timesync x 191 191 "systemd-timesync" "/" "/bin/false" add_group systemd-network 193 add_user systemd-network x 193 193 "systemd-network" "/" "/bin/sh" add_group audio 63 pipewire add_group cdrom 11 add_group dialout 18 add_group disk 6 add_group floppy 19 add_group kmem 9 add_group kvm 10 add_group lp 7 add_group render 12 add_group tape 33 add_group tty 5 add_group video 39 pipewire add_group utmp 22 add_group input 199 enable_service machine-id.service enable_service debugconfig.service enable_service userconfig.service enable_service usercache.service enable_service envconfig.service enable_service cpufreq.service enable_service network-base.service enable_service systemd-timesyncd.service enable_service systemd-timesyncd-setup.service enable_service debug-shell.service } ================================================ FILE: packages/sysutils/systemd/patches/systemd-0001-move-etc-systemd-system-to-storage-.config-system.d.patch ================================================ commit 43aba5ffffc6d35ed97db035c5818c76652b06de Author: Matthias Reichl <hias@horus.com> Date: Mon Sep 28 23:55:13 2020 +0200 move /etc/systemd/system to /storage/.config/system.d diff --git a/meson.build b/meson.build index dbbddb68e2..4592cd1094 100644 --- a/meson.build +++ b/meson.build @@ -266,7 +266,7 @@ conf.set_quoted('SYSTEMD_UPDATE_HELPER_PATH', rootlibexecdir / 'systemd-update-helper') conf.set_quoted('SYSTEMD_USERWORK_PATH', rootlibexecdir / 'systemd-userwork') conf.set_quoted('SYSTEMD_VERITYSETUP_PATH', rootlibexecdir / 'systemd-veritysetup') -conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', pkgsysconfdir / 'system') +conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', '/storage/.config/system.d') conf.set_quoted('SYSTEM_DATA_UNIT_DIR', systemunitdir) conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir) conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir) ================================================ FILE: packages/sysutils/systemd/patches/systemd-0002-move-hwdb.bin-to-run.patch ================================================ From bf2776b7f9403057cb82c2697e4fca8b554db4bd Mon Sep 17 00:00:00 2001 From: MilhouseVH <milhouseVH.github@nmacleod.com> Date: Thu, 11 Apr 2019 20:00:05 +0100 Subject: [PATCH] move hwdb.bin to /run --- src/shared/hwdb-util.c | 2 +- src/libsystemd/sd-hwdb/hwdb-internal.h | 2 +- units/systemd-hwdb-update.service.in | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/shared/hwdb-util.c b/src/shared/hwdb-util.c index c83575c..6285f3d 100644 --- a/src/shared/hwdb-util.c +++ b/src/shared/hwdb-util.c @@ -21,7 +21,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/hwdb-internal.h b/src/libsystemd/sd-hwdb/hwdb-internal.h index 79fe1a8..0acbf71 100644 --- a/src/libsystemd/sd-hwdb/hwdb-internal.h 2021-07-07 17:41:29.000000000 +0000 +++ b/src/libsystemd/sd-hwdb/hwdb-internal.h 2021-07-08 10:59:13.723718762 +0000 @@ -83,7 +83,7 @@ #define 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" \ _CONF_PATHS_SPLIT_USR_NULSTR("systemd/hwdb/hwdb.bin") \ UDEVLIBEXECDIR "/hwdb.bin\0" 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 @@ 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] -- 2.14.1 ================================================ FILE: packages/sysutils/systemd/patches/systemd-0003-remove-nonexistant-dependency.patch ================================================ From 382709612ae03d6f81049ac72ac2dabd7613763d Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Wed, 18 Feb 2015 18:23:47 +0200 Subject: [PATCH 7/8] remove nonexistant dependency --- units/graphical.target | 1 - 1 file changed, 1 deletion(-) diff --git a/units/graphical.target b/units/graphical.target index 87be97e..b01b46d 100644 --- a/units/graphical.target +++ b/units/graphical.target @@ -11,7 +11,6 @@ Description=Graphical Interface Documentation=man:systemd.special(7) Requires=multi-user.target -Wants=display-manager.service Conflicts=rescue.service rescue.target After=multi-user.target rescue.service rescue.target display-manager.service AllowIsolate=yes -- 1.7.10.4 ================================================ FILE: packages/sysutils/systemd/patches/systemd-0200-persist-persistent-timer-stamps.patch ================================================ From c1bcb16c35724404d30fab53017b757c886e9ab7 Mon Sep 17 00:00:00 2001 From: MilhouseVH <milhouseVH.github@nmacleod.com> Date: Mon, 8 Jan 2018 13:46:51 +0000 Subject: [PATCH] timers: use a persistent filesystem for persistent timers --- src/core/timer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/timer.c b/src/core/timer.c index 03935ee..bfd5c02 100644 --- a/src/core/timer.c +++ b/src/core/timer.c @@ -144,11 +144,11 @@ static int timer_setup_persistent(Timer *t) { if (MANAGER_IS_SYSTEM(UNIT(t)->manager)) { - r = unit_require_mounts_for(UNIT(t), "/var/lib/systemd/timers", UNIT_DEPENDENCY_FILE); + r = unit_require_mounts_for(UNIT(t), "/storage/.cache/systemd/timers", UNIT_DEPENDENCY_FILE); if (r < 0) return r; - stamp_path = strjoin("/var/lib/systemd/timers/stamp-", UNIT(t)->id); + stamp_path = strjoin("/storage/.cache/systemd/timers/stamp-", UNIT(t)->id); } else { const char *e; -- 2.14.1 ================================================ FILE: packages/sysutils/systemd/patches/systemd-0300-config-env-unhide-cursor.patch ================================================ From 49285dae6756b22bc6881c04939f7c43c35b5506 Mon Sep 17 00:00:00 2001 From: MilhouseVH <milhouseVH.github@nmacleod.com> Date: Sat, 29 Jun 2019 00:26:41 +0100 Subject: [PATCH] debug-shell: configure environment, unhide cursor --- units/debug-shell.service.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/units/debug-shell.service.in b/units/debug-shell.service.in index 1127e68..4c3e971 100644 --- a/units/debug-shell.service.in +++ b/units/debug-shell.service.in @@ -15,8 +15,8 @@ IgnoreOnIsolate=yes ConditionPathExists={{DEBUGTTY}} [Service] -Environment=TERM=linux -ExecStart={{SUSHELL}} +Environment=ENV=/etc/profile +ExecStart=/bin/sh -c 'echo -en "\033[?25h"; exec /bin/sh' Restart=always RestartSec=0 StandardInput=tty -- 2.14.1 ================================================ FILE: packages/sysutils/systemd/patches/systemd-0500-Add-working-directory-storage-for-debug-shell.patch ================================================ From c38a2fc53e5ebb3fc4637a168408591003aad0fb Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Mon, 30 Sep 2019 12:20:00 +0200 Subject: [PATCH] Add working directory '/storage' for debug-shell --- units/debug-shell.service.in | 1 + 1 file changed, 1 insertion(+) diff --git a/units/debug-shell.service.in b/units/debug-shell.service.in index 9f3868e106..d5f93f18a6 100644 --- a/units/debug-shell.service.in +++ b/units/debug-shell.service.in @@ -16,6 +16,7 @@ IgnoreOnIsolate=yes ConditionPathExists=@DEBUGTTY@ [Service] +WorkingDirectory=/storage Environment=ENV=/etc/profile ExecStart=/bin/sh -c 'echo -en "\033[?25h"; exec /bin/sh' Restart=always -- 2.17.1 ================================================ FILE: packages/sysutils/systemd/patches/systemd-0600-SDCARDFS_SUPER_MAGIC.patch ================================================ --- a/src/basic/check-filesystems.sh 2022-02-01 21:47:06.181142404 +0100 +++ b/src/basic/check-filesystems.sh 2022-02-01 21:45:58.760989671 +0100 @@ -23,7 +23,8 @@ for fs in $($cpp -dM $includes - </dev/n # STACK_END_MAGIC doesn't refer to a filesystem # mtd_inode was removed in 2015 # futexfs was removed in 2018 - if [[ "$fs" =~ ^(STACK_END_MAGIC|MTD_INODE_FS_MAGIC|FUTEXFS_SUPER_MAGIC)$ ]]; then + # sdcardfs is Android thing + if [[ "$fs" =~ ^(STACK_END_MAGIC|MTD_INODE_FS_MAGIC|FUTEXFS_SUPER_MAGIC|SDCARDFS_SUPER_MAGIC)$ ]]; then continue fi echo "Filesystem found in kernel header but not in $(basename "$filesystems_gperf"): $fs"; ================================================ FILE: packages/sysutils/systemd/patches/systemd-501-Start-debug-service-after-locale-to-ensure-file-syst.patch ================================================ From 74ffc6f540d6bf0046df984f9eea9e5c08486767 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Sat, 5 Nov 2022 18:52:02 +0100 Subject: [PATCH] Start debug service after locale to ensure file system is ready --- units/debug-shell.service.in | 1 + 1 file changed, 1 insertion(+) diff --git a/units/debug-shell.service.in b/units/debug-shell.service.in index bc3a23f..a1bc7e5 100644 --- a/units/debug-shell.service.in +++ b/units/debug-shell.service.in @@ -13,6 +13,7 @@ Documentation=man:systemd-debug-generator(8) DefaultDependencies=no IgnoreOnIsolate=yes ConditionPathExists={{DEBUGTTY}} +After=locale.service [Service] WorkingDirectory=/storage -- 2.38.1 ================================================ FILE: packages/sysutils/systemd/profile.d/90-systemd.conf ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) export SYSTEMD_COLORS=0 ================================================ FILE: packages/sysutils/systemd/scripts/cpufreq ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2015 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) SYS_CPUFREQ_GOV=$( cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor ) SYS_CPUFREQ_DIR="/sys/devices/system/cpu/cpufreq" # Configure frequency scaling properties if [ $SYS_CPUFREQ_GOV = "ondemand" ]; then for policy in ${SYS_CPUFREQ_DIR}/ondemand ${SYS_CPUFREQ_DIR}/policy*/; do if [ -e $policy/up_threshold ]; then echo 50 > $policy/up_threshold fi done fi ================================================ FILE: packages/sysutils/systemd/scripts/environment-setup ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) # read config files for config in /etc/profile.d/*; do if [ -f "$config" ] ; then . $config fi done # generate system-wide environment file cat <<EOF >/run/libreelec/environment PATH=${PATH} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} EOF ================================================ FILE: packages/sysutils/systemd/scripts/network-base-setup ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) check_hosts() { grep -v "^#" /run/libreelec/hosts | grep "${1}" } # setup hostname if [ -f /storage/.cache/hostname ]; then cat /storage/.cache/hostname > /proc/sys/kernel/hostname fi # setup /etc/hosts rm -f /run/libreelec/hosts if [ -f /storage/.config/hosts.conf ]; then cat /storage/.config/hosts.conf > /run/libreelec/hosts # add localhost to hosts if not present LOCALHOST_HOSTS=$(check_hosts "localhost") if [ -z "${LOCALHOST_HOSTS}" ]; then { echo "127.0.0.1 localhost" echo "::1 localhost ip6-localhost ip6-loopback" } >> /run/libreelec/hosts fi # add HOSTNAME to hosts if not present HOSTNAME=$(cat /proc/sys/kernel/hostname) HOSTNAME_HOSTS=$(check_hosts "${HOSTNAME}") if [ -z "${HOSTNAME_HOSTS}" ]; then echo "127.0.1.1 ${HOSTNAME}" >> /run/libreelec/hosts fi fi # setup /etc/resolv.conf rm -f /run/libreelec/resolv.conf if [ -f /storage/.config/resolv.conf ]; then cat /storage/.config/resolv.conf > /run/libreelec/resolv.conf elif [ -f /dev/.kernel_ipconfig ] && [ -f /proc/net/pnp ]; then cat /proc/net/pnp > /run/libreelec/resolv.conf else cat << EOF > /run/libreelec/resolv.conf nameserver 8.8.8.8 nameserver 8.8.4.4 EOF fi ================================================ FILE: packages/sysutils/systemd/scripts/systemd-machine-id-setup ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) # remove old machine-id file [[ -f "/storage/.cache/machine-id" ]] && rm /storage/.cache/machine-id # test systemd-machine-id exists and is 32 hex chars or generate a new uuid MACHINEID="$(cat /storage/.cache/systemd-machine-id 2>/dev/null)" [ "${#MACHINEID}" != "32" ] && MACHINEID= [[ "${MACHINEID//[a-f0-9]/}" != "" ]] && MACHINEID= [ -z "${MACHINEID}" ] && MACHINEID=$(/usr/bin/dbus-uuidgen) # For first boot detection systemd may have overmounted the file umount /storage/.cache/systemd-machine-id >/dev/null 2>&1 # persist uuid mkdir -p /storage/.cache echo "$MACHINEID" > /storage/.cache/systemd-machine-id ================================================ FILE: packages/sysutils/systemd/scripts/systemd-timesyncd-setup ================================================ #!/bin/sh KERNEL_NTP="${1:-/proc/net/ipconfig/ntp_servers}" NTP_SERVERS="" if [ -f /proc/net/ipconfig/ntp_servers ]; then for srv in $(cat /proc/net/ipconfig/ntp_servers); do if [ -n "$srv" -a "$srv" != "0.0.0.0" ]; then if [ -z "$NTP_SERVERS" ]; then NTP_SERVERS="$srv" else NTP_SERVERS="${NTP_SERVERS} $srv" fi fi done if [ -n "$NTP_SERVERS" ]; then mkdir -p /run/systemd/timesyncd.conf.d/ cat << EOF > /run/systemd/timesyncd.conf.d/kernel-ntp-servers.conf [Time] NTP=$NTP_SERVERS EOF fi fi ================================================ FILE: packages/sysutils/systemd/scripts/usercache-setup ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Fix bug in older versions creating file /storage/.cache/services [ -f /storage/.cache/services ] && rm /storage/.cache/services && mkdir -p /storage/.cache/services # Copy cache files, but don't overwrite false | cp -iRp /usr/cache/* /storage/.cache/ &>/dev/null # Merge default and custom shadow file details if [ -f /storage/.cache/shadow -a -f /usr/cache/shadow ]; then # Get existing root details (possibly user defined) userroot="$(grep "^root:" /storage/.cache/shadow)" # Overwrite users shadow file with default details, replacing root with any existing value # If current file is garbage (ie. missing root) then replace it if [ -n "${userroot}" ]; then sed -e "s ^root:.* ${userroot} " /usr/cache/shadow >/storage/.cache/shadow else cp -fp /usr/cache/shadow /storage/.cache/shadow fi # Make sure we have the correct permission chmod 000 /storage/.cache/shadow fi ================================================ FILE: packages/sysutils/systemd/scripts/userconfig-setup ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Remove those sample files that we manage for sample in $(find /storage/.config -name '*.sample' 2>/dev/null); do [ -f /usr/config/${sample:17} ] && rm -f ${sample} done # Copy config files, but don't overwrite - this should replace our sample files false | cp -iRp /usr/config/* /storage/.config/ &>/dev/null ================================================ FILE: packages/sysutils/systemd/system.d/cpufreq.service ================================================ [Unit] Description=Set CPU frequency governor and its tunables ConditionPathExists=/usr/bin/cpufreq [Service] Type=oneshot ExecStart=/usr/bin/cpufreq RemainAfterExit=yes [Install] WantedBy=basic.target ================================================ FILE: packages/sysutils/systemd/system.d/debugconfig.service ================================================ [Unit] Description=Setup debug config DefaultDependencies=no After=systemd-tmpfiles-setup.service ConditionKernelCommandLine=|debugging ConditionPathExists=|/storage/.cache/debug.libreelec [Service] Type=oneshot ExecStart=/bin/sh -c 'cp /usr/share/debugconf/*.conf /run/libreelec/debug' RemainAfterExit=yes [Install] WantedBy=sysinit.target ================================================ FILE: packages/sysutils/systemd/system.d/envconfig.service ================================================ [Unit] Description=Generate system-wide /etc/environment file DefaultDependencies=no After=systemd-tmpfiles-setup.service [Service] Type=oneshot ExecStart=/usr/bin/environment-setup RemainAfterExit=yes [Install] WantedBy=sysinit.target ================================================ FILE: packages/sysutils/systemd/system.d/flash.mount.d/dependencies.conf ================================================ [Unit] DefaultDependencies=no ================================================ FILE: packages/sysutils/systemd/system.d/machine-id.service ================================================ [Unit] Description=Setup machine-id DefaultDependencies=no Conflicts=shutdown.target Before=systemd-journald.service systemd-tmpfiles-setup-dev.service shutdown.target After=local-fs.target [Service] Type=oneshot ExecStart=/usr/bin/systemd-machine-id-setup RemainAfterExit=yes [Install] WantedBy=sysinit.target ================================================ FILE: packages/sysutils/systemd/system.d/network-base.service ================================================ [Unit] Description=Base Network Configuration DefaultDependencies=no After=local-fs.target systemd-tmpfiles-setup.service userconfig.service [Service] Type=oneshot ExecStart=/usr/sbin/network-base-setup RemainAfterExit=yes [Install] WantedBy=network.target ================================================ FILE: packages/sysutils/systemd/system.d/storage.mount.d/dependencies.conf ================================================ [Unit] DefaultDependencies=no ================================================ FILE: packages/sysutils/systemd/system.d/systemd-timesyncd-setup.service ================================================ [Unit] Description=Setup NTP servers for timesyncd DefaultDependencies=no After=systemd-remount-fs.service systemd-sysusers.service [Service] Type=oneshot ExecStart=/usr/sbin/systemd-timesyncd-setup RemainAfterExit=yes [Install] WantedBy=sysinit.target ================================================ FILE: packages/sysutils/systemd/system.d/systemd-timesyncd.service.d/depend-on-kernel-ip-config.conf ================================================ [Unit] ConditionPathExists=/dev/.kernel_ipconfig After=systemd-timesyncd-setup.service network-base.service ================================================ FILE: packages/sysutils/systemd/system.d/usercache.service ================================================ [Unit] Description=Setup User cache dir DefaultDependencies=no After=systemd-tmpfiles-setup.service [Service] Type=oneshot ExecStart=/usr/bin/usercache-setup RemainAfterExit=yes [Install] WantedBy=sysinit.target ================================================ FILE: packages/sysutils/systemd/system.d/userconfig.service ================================================ [Unit] Description=Setup User config dir DefaultDependencies=no After=systemd-tmpfiles-setup.service [Service] Type=oneshot ExecStart=/usr/bin/userconfig-setup RemainAfterExit=yes [Install] WantedBy=sysinit.target ================================================ FILE: packages/sysutils/systemd/tmpfiles.d/z_01_openelec.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) d /run/libreelec 0755 root root - - d /run/libreelec/debug 0755 root root - - ================================================ FILE: packages/sysutils/systemd/udev.d/60-not-joysticks.rules ================================================ SUBSYSTEM=="input", ATTRS{name}=="aml_keypad", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{name}=="Remote+", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" ================================================ FILE: packages/sysutils/terminus-font/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019 Matthias Reichl <hias@horus.com> PKG_NAME="terminus-font" PKG_VERSION="4.49.1" PKG_SHA256="d961c1b781627bf417f9b340693d64fc219e0113ad3a3af1a3424c7aa373ef79" PKG_LICENSE="OFL1_1" PKG_SITE="http://terminus-font.sourceforge.net" PKG_URL="https://downloads.sourceforge.net/project/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION:0:4}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_INIT="toolchain Python3:host" PKG_LONGDESC="This package contains the Terminus Font" PKG_TOOLCHAIN="manual" pre_configure_init() { cd ${PKG_BUILD} rm -rf .${TARGET_NAME}-${TARGET} } configure_init() { ./configure INT=${TOOLCHAIN}/bin/python3 } make_init() { make ter-v32b.psf } makeinstall_init() { mkdir -p ${INSTALL}/usr/share/consolefonts cp ter-v32b.psf ${INSTALL}/usr/share/consolefonts } ================================================ FILE: packages/sysutils/tz/package.mk ================================================ # 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) PKG_NAME="tz" PKG_VERSION="2023d" PKG_SHA256="487df6ff5f4a577fd96568d0fd0a22e8062b0ec59af7ad3e66b5dd23a85cfc1c" PKG_LICENSE="Public Domain" PKG_SITE="http://www.iana.org/time-zones" PKG_URL="https://github.com/eggert/tz/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Time zone and daylight-saving time data." pre_configure_target() { PKG_MAKE_OPTS_TARGET="CC=${HOST_CC} CFLAGS= LDFLAGS=" } makeinstall_target() { make TZDIR="${INSTALL}/usr/share/zoneinfo" REDO=posix_only TOPDIR="${INSTALL}" install } post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin ${INSTALL}/usr/sbin rm -rf ${INSTALL}/etc mkdir -p ${INSTALL}/etc ln -sf /var/run/localtime ${INSTALL}/etc/localtime } post_install() { enable_service tz-data.service } ================================================ FILE: packages/sysutils/tz/system.d/tz-data.service ================================================ [Unit] Description=Setup Timezone data DefaultDependencies=no Before=systemd-udevd.service After=var.mount systemd-tmpfiles-setup.service [Service] Type=oneshot Environment=TIMEZONE=UTC EnvironmentFile=-/storage/.cache/timezone ExecStart=/bin/ln -sf /usr/share/zoneinfo/${TIMEZONE} /var/run/localtime RemainAfterExit=yes StartLimitInterval=0 [Install] WantedBy=sysinit.target ================================================ FILE: packages/sysutils/udevil/config/udevil.conf ================================================ ############################################################################## # # udevil configuration file /etc/udevil/udevil.conf # # This file controls what devices, networks, and files users may mount and # unmount via udevil (set suid). # # IMPORTANT: IT IS POSSIBLE TO CREATE SERIOUS SECURITY PROBLEMS IF THIS FILE # IS MISCONFIGURED - EDIT WITH CARE # # Note: For greater control for specific users, including root, copy this # file to /etc/udevil/udevil-user-USERNAME.conf replacing USERNAME with the # desired username (eg /etc/udevil/udevil-user-jim.conf). # # Format: # OPTION = VALUE[, VALUE, ...] # # DO NOT USE QUOTES except literally # Lines beginning with # are ignored # ############################################################################## # To log all uses of udevil, set log_file to a file path: # log_file = /var/log/udevil.log # Approximate number of days to retain log entries (0=forever, max=60): log_keep_days = 10 # allowed_types determines what fstypes can be passed by a user to the u/mount # program, what device filesystems may be un/mounted implicitly, and what # network filesystems may be un/mounted. # It may also include the 'file' keyword, indicating that the user is allowed # to mount files (eg an ISO file). The $KNOWN_FILESYSTEMS variable may # be included to include common local filesystems as well as those listed in # /etc/filesystems and /proc/filesystems. # allowed_types_USERNAME, if present, is used to override allowed_types for # the specific user 'USERNAME'. For example, to allow user 'jim' to mount # only vfat filesystems, add: # allowed_types_jim = vfat # Setting allowed_types = * does NOT allow all types, as this is a security # risk, but does allow all recognized types. # allowed_types = $KNOWN_FILESYSTEMS, file, cifs, smbfs, nfs, curlftpfs, ftpfs, sshfs, davfs, tmpfs, ramfs allowed_types = $KNOWN_FILESYSTEMS, hfsplus, hfs # allowed_users is a list of users permitted to mount and unmount with udevil. # Wildcards (* or ?) may be used in the usernames. To allow all users, # specify "allowed_users=*". UIDs may be included using the form UID=1000. # For example: allowed_users = carl, UID=1000, pre* # Also note that permission to execute udevil may be limited to users belonging # to the group that owns /usr/bin/udevil, such as 'plugdev' or 'storage', # depending on installation. # allowed_users_FSTYPE, if present, is used to override allowed_users when # mounting or unmounting a specific fstype (eg nfs, ext3, file). # Note that when mounting a file, fstype will always be 'file' regardless of # the internal fstype of the file. # For example, to allow only user 'bob' to mount nfs shares, add: # allowed_users_nfs = bob # The root user is NOT automatically allowed to use udevil in some cases unless # listed here (except for unmounting anything or mounting fstab devices). allowed_users = * # allowed_groups is a list of groups permitted to mount and unmount with # udevil. The user MUST belong to at least one of these groups. Wildcards # or GIDs may NOT be used in group names, but a single * may be used to allow # all groups. # Also note that permission to execute udevil may be limited to users belonging # to the group that owns /usr/bin/udevil, such as 'plugdev' or 'storage', # depending on installation. # allowed_groups_FSTYPE, if present, is used to override allowed_groups when # mounting or unmounting a specific fstype (eg nfs, ext3, file). For example, # to allow only members of the 'network' group to mount smb and nfs shares, # use both of these lines: # allowed_groups_smbfs = network # allowed_groups_nfs = network # The root user is NOT automatically allowed to use udevil in some cases unless # listed here (except for unmounting anything or mounting fstab devices). allowed_groups = * # allowed_media_dirs specifies the media directories in which user mount points # may be located. The first directory which exists and does not contain a # wildcard will be used as the default media directory (normally /media or # /run/media/$USER). # The $USER variable, if included, will be replaced with the username of the # user running udevil. Wildcards may also be used in any directory EXCEPT the # default. Wildcards will not match a / # allowed_media_dirs_FSTYPE, if present, is used to override allowed_media_dirs # when mounting or unmounting a specific fstype (eg ext2, nfs). For example, # to cause /media/network to be used as the default media directory for # nfs and ftpfs mounts, use these two lines: # allowed_media_dirs_nfs = /media/network, /media, /run/media/$USER # allowed_media_dirs_ftpfs = /media/network, /media, /run/media/$USER # NOTE: If you want only the user who mounted a device to have access to it # and be allowed to unmount it, specify /run/media/$USER as the first # allowed media directory. # IMPORTANT: If an allowed file is mounted to a media directory, the user may # be permitted to unmount its associated loop device even though internal. # INCLUDING /MNT HERE IS NOT RECOMMENDED. ALL ALLOWED MEDIA DIRECTORIES # SHOULD BE OWNED AND WRITABLE ONLY BY ROOT. allowed_media_dirs = /media, /var/media, /run/media/$USER # allowed_devices is the first criteria for what block devices users may mount # or unmount. If a device is not listed in allowed_devices, it cannot be # un/mounted (unless in fstab). However, even if a device is listed, other # factors may prevent its use. For example, access to system internal devices # will be denied to normal users even if they are included in allowed_devices. # allowed_devices_FSTYPE, if present, is used to override allowed_devices when # mounting or unmounting a specific fstype (eg ext3, ntfs). For example, to # prevent all block devices containing an ext4 filesystem from being # un/mounted use: # allowed_devices_ext4 = # Note: Wildcards may be used, but a wildcard will never match a /, except # for "allowed_devices=*" which allows any device. The recommended setting is # allowed_devices = /dev/* # WARNING: ALLOWING USERS TO MOUNT DEVICES OUTSIDE OF /dev CAN CAUSE SERIOUS # SECURITY PROBLEMS. DO NOT ALLOW DEVICES IN /dev/shm allowed_devices = /dev/* # allowed_internal_devices causes udevil to treat any listed block devices as # removable, thus allowing normal users to un/mount them (providing they are # also listed in allowed_devices). # allowed_internal_devices_FSTYPE, if present, is used to override # allowed_internal_devices when mounting or unmounting a specific fstype # (eg ext3, ntfs). For example, to allow block devices containing a vfat # filesystem to be un/mounted even if they are system internal devices, use: # allowed_internal_devices_vfat = /dev/sdb* # Some removable esata drives look like internal drives to udevil. To avoid # this problem, they can be treated as removable with this setting. # WARNING: SETTING A SYSTEM DEVICE HERE CAN CAUSE SERIOUS SECURITY PROBLEMS. # allowed_internal_devices = # allowed_internal_uuids and allowed_internal_uuids_FSTYPE work similarly to # allowed_internal_devices, except that UUIDs are specified instead of devices. # For example, to allow un/mounting of an internal filesystem based on UUID: # allowed_internal_uuids = cc0c4489-8def-1e5b-a304-ab87c3cb626c0 # WARNING: SETTING A SYSTEM DEVICE HERE CAN CAUSE SERIOUS SECURITY PROBLEMS. # allowed_internal_uuids = # forbidden_devices is used to prevent block devices from being un/mounted # even if other settings would allow them (except devices in fstab). # forbidden_devices_FSTYPE, if present, is used to override # forbidden_devices when mounting or unmounting a specific fstype # (eg ext3, ntfs). For example, to prevent device /dev/sdd1 from being # mounted when it contains an ntfs filesystem, use: # forbidden_devices_ntfs = /dev/sdd1 # NOTE: device node paths are canonicalized before being tested, so forbidding # a link to a device will have no effect. forbidden_devices = # allowed_networks determines what hosts may be un/mounted by udevil users when # using nfs, cifs, smbfs, curlftpfs, ftpfs, or sshfs. Hosts may be specified # using a hostname (eg myserver.com) or IP address (192.168.1.100). # Wildcards may be used in hostnames and IP addresses, but CIDR notation # (192.168.1.0/16) is NOT supported. IP v6 is supported. For example: # allowed_networks = 127.0.0.1, 192.168.1.*, 10.0.0.*, localmachine, *.okay.com # Or, to prevent un/mounting of any network shares, set: # allowed_networks = # allowed_networks_FSTYPE, if present, is used to override allowed_networks # when mounting or unmounting a specific network fstype (eg nfs, cifs, sshfs, # curlftpfs). For example, to limit nfs and samba shares to only local # networks, use these two lines: # allowed_networks_nfs = 192.168.1.*, 10.0.0.* # allowed_networks_cifs = 192.168.1.*, 10.0.0.* allowed_networks = * # forbidden_networks and forbidden_networks_FSTYPE are used to specify networks # that are never allowed, even if other settings allow them (except fstab). # NO REVERSE LOOKUP IS PERFORMED, so including bad.com will only have an effect # if the user uses that hostname. IP lookup is always performed, so forbidding # an IP address will also forbid all corresponding hostnames. forbidden_networks = # allowed_files is used to determine what files in what directories may be # un/mounted. A user must also have read permission on a file to mount it. # Note: Wildcards may be used, but a wildcard will never match a /, except # for "allowed_files=*" which allows any file. For example, to allow only # files in the /share directory to be mounted, use: # allowed_files = /share/* # NOTE: Specifying allowed_files_FSTYPE will NOT work because the fstype of # files is always 'file'. allowed_files = * # forbidden_files is used to specify files that are never allowed, even if # other settings allow them (except fstab). Specify a full path. # Note: Wildcards may be used, but a wildcard will never match a /, except # for "forbidden_files = *". # NOTE: file paths are canonicalized before being tested, so forbidding # a link to a file will have no effect. forbidden_files = # default_options specifies what options are always included when performing # a mount, in addition to any options the user may specify. # Note: When a device is present in /etc/fstab, and the user does not specify # a mount point, the device is mounted with normal user permissions using # the fstab entry, without these options. # default_options_FSTYPE, if present, is used to override default_options # when mounting a specific fstype (eg ext2, nfs). # The variables $USER, $UID, and $GID are changed to the user's username, UID, # and GID. # FOR GOOD SECURITY, default_options SHOULD ALWAYS INCLUDE: nosuid,noexec,nodev # WARNING: OPTIONS PRESENT OR MISSING CAN CAUSE SERIOUS SECURITY PROBLEMS. default_options = nosuid, noexec, nodev, noatime default_options_file = nosuid, noexec, nodev, noatime, uid=$UID, gid=$GID, ro # mount iso9660 with 'ro' to prevent mount read-only warning default_options_iso9660 = nosuid, noexec, nodev, noatime, uid=$UID, gid=$GID, ro, utf8 default_options_udf = nosuid, noexec, nodev, noatime, uid=$UID, gid=$GID default_options_vfat = nosuid, noexec, nodev, noatime, fmask=0133, dmask=0022, uid=$UID, gid=$GID, utf8 default_options_exfat = nosuid, nodev, noatime, utf8, fmask=0022, dmask=0022, default_options_msdos = nosuid, noexec, nodev, noatime, fmask=0133, dmask=0022, uid=$UID, gid=$GID default_options_umsdos = nosuid, noexec, nodev, noatime, fmask=0133, dmask=0022, uid=$UID, gid=$GID default_options_ntfs = nosuid, noexec, nodev, noatime, big_writes, fmask=0022, dmask=0022, uid=$UID, gid=$GID, utf8 default_options_cifs = nosuid, noexec, nodev, uid=$UID, gid=$GID default_options_smbfs = nosuid, noexec, nodev, uid=$UID, gid=$GID default_options_sshfs = nosuid, noexec, nodev, noatime, uid=$UID, gid=$GID, nonempty, allow_other default_options_curlftpfs = nosuid, noexec, nodev, noatime, uid=$UID, gid=$GID, nonempty, allow_other default_options_ftpfs = nosuid, noexec, nodev, noatime, uid=$UID, gid=$GID default_options_davfs = nosuid, noexec, nodev, uid=$UID, gid=$GID default_options_tmpfs = nosuid, noexec, nodev, noatime, uid=$UID, gid=$GID default_options_ramfs = nosuid, noexec, nodev, noatime, uid=$UID, gid=$GID # allowed_options determines all options that a user may specify when mounting. # All the options used in default_options above must be included here too, or # they will be rejected. If the user attempts to use an option not included # here, an error will result. Wildcards may be used. # allowed_options_FSTYPE, if present, is used to override allowed_options # when mounting a specific fstype (eg ext2, nfs). # The variables $USER, $UID, and $GID are changed to the user's username, UID, # and GID. # If you want to forbid remounts, remove 'remount' from here. # WARNING: OPTIONS HERE CAN CAUSE SERIOUS SECURITY PROBLEMS - CHOOSE CAREFULLY allowed_options = nosuid, noexec, nodev, noatime, big_writes, fmask=0133, dmask=0022, uid=$UID, gid=$GID, ro, rw, sync, flush, iocharset=*, utf8, remount allowed_options_nfs = nosuid, noexec, nodev, noatime, ro, rw, sync, remount, port=*, rsize=*, wsize=*, hard, proto=*, timeo=*, retrans=* allowed_options_cifs = nosuid, noexec, nodev, ro, rw, remount, port=*, user=*, username=*, pass=*, password=*, guest, domain=*, uid=$UID, gid=$GID, credentials=* allowed_options_smbfs = nosuid, noexec, nodev, ro, rw, remount, port=*, user=*, username=*, pass=*, password=*, guest, domain=*, uid=$UID, gid=$GID, credentials=* allowed_options_sshfs = nosuid, noexec, nodev, noatime, ro, rw, uid=$UID, gid=$GID, nonempty, allow_other, idmap=user, BatchMode=yes, port=* allowed_options_curlftpfs = nosuid, noexec, nodev, noatime, ro, rw, uid=$UID, gid=$GID, nonempty, allow_other, user=* allowed_options_ftpfs = nosuid, noexec, nodev, noatime, ro, rw, port=*, user=*, pass=*, ip=*, root=*, uid=$UID, gid=$GID allowed_options_exfat = nosuid, noexec, nodev, noatime, ro, rw, uid=$UID, gid=$GID, utf8, nonempty, fmask=0022, dmask=0022, allowed_options_ntfs = nosuid, noexec, nodev, noatime, big_writes, fmask=0022, dmask=0022, uid=$UID, gid=$GID, ro, rw, utf8 # mount_point_mode, if present and set to a non-empty value, will cause udevil # to set the mode (permissions) on the moint point after mounting If not # specified or if left empty, the mode is not changed. Mode must be octal # starting with a zero (0755). # mount_point_mode_FSTYPE, if present, is used to override mount_point_mode # when mounting a specific fstype (eg ext2, nfs). # NOT SETTING A MODE CAN HAVE SECURITY IMPLICATIONS FOR SOME FSTYPES # mount_point_mode = 0755 # don't set a mode for some types: # mount_point_mode_sshfs = # mount_point_mode_curlftpfs = # mount_point_mode_ftpfs = # Use the settings below to change the default locations of programs used by # udevil, or (advanced topic) to redirect commands to your scripts. # When substituting scripts, make sure they are root-owned and accept the # options used by udevil (for example, the mount_program must accept --fake, # -o, -v, and other options valid to mount.) # Be sure to specify the full path and include NO OPTIONS or other arguments. # These programs may also be specified as configure options when building # udevil. # THESE PROGRAMS ARE RUN AS ROOT # mount_program = /bin/mount # umount_program = /bin/umount # losetup_program = /sbin/losetup # setfacl_program = /usr/bin/setfacl # validate_exec specifies a program or script which provides additional # validation of a mount or unmount command, beyond the checks performed by # udevil. The program is run as a normal user (if root runs udevil, # validate_exec will NOT be run). The program is NOT run if the user is # mounting a device without root priviledges (a device in fstab). # The program is passed the username, a printable description of what is # happening, and the entire udevil command line as the first three arguments. # The program must return an exit status of 0 to allow the mount or unmount # to proceed. If it returns non-zero, the user will be denied permission. # For example, validate_exec might specify a script which notifies you # of the command being run, or performs additional steps to authenticate the # user. # Specify a full path to the program, with NO options or arguments. # validate_exec = # validate_rootexec works similarly to validate_exec, except that the program # is run as root. validate_rootexec will also be run if the root user runs # udevil. If both validate_exec and validate_rootexec are specified, # validate_rootexec will run first, followed by validate_exec. # The program must return an exit status of 0 to allow the mount or unmount # to proceed. If it returns non-zero, the user will be denied permission. # Unless you are familiar with writing root scripts, it is recommended that # rootexec settings NOT be used, as it is easy to inadvertently open exploits. # THIS PROGRAM IS ALWAYS RUN AS ROOT, even if the user running udevil is not. # validate_rootexec = # success_exec is run after a successful mount, remount, or unmount. The # program is run as a normal user (if root runs udevil, success_exec # will NOT be run). # The program is passed the username, a printable description of what action # was taken, and the entire udevil command line as the first three arguments. # The program's exit status is ignored. # For example, success_exec might run a script which informs you of what action # was taken, and might perform further actions. # Specify a full path to the program, with NO options or arguments. # success_exec = # success_rootexec works similarly to success_exec, except that the program is # run as root. success_rootexec will also be run if the root user runs udevil. # If both success_exec and success_rootexec are specified, success_rootexec # will run first, followed by success_exec. # Unless you are familiar with writing root scripts, it is recommended that # rootexec settings NOT be used, as it is easy to inadvertently open exploits. # THIS PROGRAM IS ALWAYS RUN AS ROOT, even if the user running udevil is not. # success_rootexec = ================================================ FILE: packages/sysutils/udevil/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="udevil" PKG_VERSION="0.4.4" PKG_SHA256="ce8c51fd4d589cda7be56e75b42188deeb258c66fc911a9b3a70a3945c157739" PKG_LICENSE="GPL" PKG_SITE="https://github.com/IgnorantGuru/udevil" PKG_URL="https://github.com/IgnorantGuru/udevil/raw/pkg/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain systemd glib" PKG_LONGDESC="Mounts and unmounts removable devices and networks without a password." PKG_CONFIGURE_OPTS_TARGET="--disable-systemd \ --with-mount-prog=/usr/bin/mount \ --with-umount-prog=/usr/bin/umount \ --with-losetup-prog=/usr/sbin/losetup \ --with-setfacl-prog=/usr/bin/setfacl" makeinstall_target() { : # nothing to install } post_makeinstall_target() { mkdir -p ${INSTALL}/etc/udevil cp ${PKG_DIR}/config/udevil.conf ${INSTALL}/etc/udevil ln -sf /storage/.config/udevil.conf ${INSTALL}/etc/udevil/udevil-user-root.conf mkdir -p ${INSTALL}/usr/bin cp -PR src/udevil ${INSTALL}/usr/bin } post_install() { enable_service udevil-mount@.service } ================================================ FILE: packages/sysutils/udevil/patches/udevil-fix-build.patch ================================================ diff -Naur udevil-0.4.4/src/device-info.c udevil-0.4.4.patch/src/device-info.c --- udevil-0.4.4/src/device-info.c 2015-05-04 15:34:32.000000000 +0200 +++ udevil-0.4.4.patch/src/device-info.c 2015-05-23 16:25:50.545362784 +0200 @@ -4,6 +4,7 @@ ************************************************************************** */ #include "device-info.h" +#include <sys/stat.h> static char * _dupv8 (const char *s) ================================================ FILE: packages/sysutils/udevil/system.d/udevil-mount@.service ================================================ [Unit] Description=Udevil mount service [Service] Type=oneshot ExecStart=-/usr/bin/udevil --mount %I ExecStop=-/usr/bin/udevil --umount %I ExecStartPost=-/usr/lib/samba/samba-autoshare ExecStopPost=-/usr/lib/samba/samba-autoshare RemainAfterExit=yes ================================================ FILE: packages/sysutils/udevil/udev.d/95-udevil-mount.rules ================================================ # dont run in "installer" mode IMPORT{cmdline}="installer" ENV{installer}=="1", GOTO="exit" # check for blockdevices, /dev/sd*, /dev/sr*, /dev/mmc*, and /dev/nvme* SUBSYSTEM!="block", KERNEL!="sd*|sr*|mmc*|nvme*", GOTO="exit" # check for special partitions we dont want mount IMPORT{builtin}="blkid" ENV{ID_FS_LABEL}=="EFI|BOOT|Recovery|RECOVERY|SETTINGS|boot|root0|share0", GOTO="exit" # /dev/sd*, /dev/mmc*, and /dev/nvme* with partitions/disk and filesystems only, and /dev/sr* disks only KERNEL=="sd*|mmc*|nvme*", ENV{DEVTYPE}=="partition|disk", ENV{ID_FS_USAGE}=="filesystem", GOTO="harddisk" KERNEL=="sr*", ENV{DEVTYPE}=="disk", GOTO="optical" GOTO="exit" # mount or umount for hdds LABEL="harddisk" ACTION=="add", PROGRAM="/usr/bin/sh -c '/usr/bin/grep -E ^/dev/%k\ /proc/mounts || true'", RESULT=="", RUN+="/usr/bin/systemctl restart udevil-mount@/dev/%k.service" ACTION=="remove", RUN+="/usr/bin/systemctl stop udevil-mount@/dev/%k.service" GOTO="exit" # mount or umount for opticals LABEL="optical" ACTION=="add|change", RUN+="/usr/bin/systemctl restart udevil-mount@/dev/%k.service" GOTO="exit" # Exit LABEL="exit" ================================================ FILE: packages/sysutils/usbutils/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="usbutils" PKG_VERSION="015" PKG_SHA256="c3b451bb1f4ff9f6356cac5a6956a9ac8e85d81651af56a29e689f94fa6fda6e" PKG_LICENSE="GPL" PKG_SITE="http://www.linux-usb.org/" PKG_URL="http://kernel.org/pub/linux/utils/usb/usbutils/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libusb systemd" PKG_LONGDESC="This package contains various utilities for inspecting and setting of devices connected to the USB bus." PKG_TOOLCHAIN="autotools" post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin/lsusb.py rm -rf ${INSTALL}/usr/bin/usbhid-dump } ================================================ FILE: packages/sysutils/util-linux/config/swap.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) # location with write access and no spaces SWAPFILE="${HOME}/.cache/swapfile" # in MiB SWAPFILESIZE="@SWAPFILESIZE@" # set to "yes" to enable SWAP_ENABLED="@SWAP_ENABLED_DEFAULT@" ================================================ FILE: packages/sysutils/util-linux/package.mk ================================================ # 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) PKG_NAME="util-linux" PKG_VERSION="2.38.1" PKG_SHA256="60492a19b44e6cf9a3ddff68325b333b8b52b6c59ce3ebd6a0ecaa4c5117e84f" PKG_LICENSE="GPL" PKG_URL="https://www.kernel.org/pub/linux/utils/util-linux/v$(get_pkg_version_maj_min)/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="ccache:host autoconf:host automake:host intltool:host libtool:host pkg-config:host" PKG_DEPENDS_TARGET="toolchain ncurses" PKG_DEPENDS_INIT="toolchain" PKG_LONGDESC="A large variety of low-level system utilities that are necessary for a Linux system to function." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic:host" UTILLINUX_CONFIG_DEFAULT="--disable-gtk-doc \ --disable-nls \ --disable-rpath \ --enable-tls \ --enable-chsh-only-listed \ --disable-bash-completion \ --disable-colors-default \ --disable-pylibmount \ --disable-pg-bell \ --disable-use-tty-group \ --disable-makeinstall-chown \ --disable-makeinstall-setuid \ --with-gnu-ld \ --without-selinux \ --without-audit \ --without-udev \ --without-ncurses \ --without-ncursesw \ --without-readline \ --without-slang \ --without-tinfo \ --without-utempter \ --without-util \ --without-libz \ --without-user \ --without-systemd \ --without-smack \ --without-python \ --without-systemdsystemunitdir" PKG_CONFIGURE_OPTS_TARGET="${UTILLINUX_CONFIG_DEFAULT} \ --disable-all-programs \ --enable-libuuid \ --enable-libblkid \ --enable-libmount \ --enable-libsmartcols \ --enable-losetup \ --enable-fsck \ --enable-fstrim \ --enable-blkid \ --enable-lsfd \ --enable-lsblk \ --disable-setterm \ --with-ncursesw" if [ "${SWAP_SUPPORT}" = "yes" ]; then PKG_CONFIGURE_OPTS_TARGET+=" --enable-swapon" fi PKG_CONFIGURE_OPTS_HOST="--enable-static \ --disable-shared \ --enable-all-programs \ ${UTILLINUX_CONFIG_DEFAULT} \ --enable-uuidgen \ --enable-libuuid" PKG_CONFIGURE_OPTS_INIT="${UTILLINUX_CONFIG_DEFAULT} \ --disable-all-programs \ --enable-libblkid \ --enable-libmount \ --enable-fsck" if [ "${INITRAMFS_PARTED_SUPPORT}" = "yes" ]; then PKG_CONFIGURE_OPTS_INIT+=" --enable-mkfs --enable-libuuid" fi post_makeinstall_target() { if [ "${SWAP_SUPPORT}" = "yes" ]; then mkdir -p ${INSTALL}/usr/lib/libreelec cp -PR ${PKG_DIR}/scripts/mount-swap ${INSTALL}/usr/lib/libreelec mkdir -p ${INSTALL}/etc cat ${PKG_DIR}/config/swap.conf | \ sed -e "s,@SWAPFILESIZE@,${SWAPFILESIZE},g" \ -e "s,@SWAP_ENABLED_DEFAULT@,${SWAP_ENABLED_DEFAULT},g" \ > ${INSTALL}/etc/swap.conf fi } post_install () { if [ "${SWAP_SUPPORT}" = "yes" ]; then enable_service swap.service fi enable_service fstrim.timer } ================================================ FILE: packages/sysutils/util-linux/patches/util-linux-01-fix-pkgconf.patch ================================================ From 4856beb5186760419bafd1f5686d6492d2d36907 Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Sat, 16 Aug 2014 13:40:57 +0300 Subject: [PATCH] fix pkgconf --- libblkid/blkid.pc.in | 6 +++--- libmount/mount.pc.in | 6 +++--- libsmartcols/smartcols.pc.in | 6 +++--- libuuid/uuid.pc.in | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/libblkid/blkid.pc.in b/libblkid/blkid.pc.in index 40ec8a9..056ae64 100644 --- a/libblkid/blkid.pc.in +++ b/libblkid/blkid.pc.in @@ -1,7 +1,7 @@ prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@usrlib_execdir@ -includedir=@includedir@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include Name: blkid Description: Block device id library diff --git a/libmount/mount.pc.in b/libmount/mount.pc.in index 2c32797..c8112c6 100644 --- a/libmount/mount.pc.in +++ b/libmount/mount.pc.in @@ -1,7 +1,7 @@ prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@usrlib_execdir@ -includedir=@includedir@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include Name: mount Description: mount library diff --git a/libsmartcols/smartcols.pc.in b/libsmartcols/smartcols.pc.in index 0b16739..8f474ef 100644 --- a/libsmartcols/smartcols.pc.in +++ b/libsmartcols/smartcols.pc.in @@ -1,7 +1,7 @@ prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@usrlib_execdir@ -includedir=@includedir@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include Name: smartcols Description: table or tree library diff --git a/libuuid/uuid.pc.in b/libuuid/uuid.pc.in index 875de19..ef1009e 100644 --- a/libuuid/uuid.pc.in +++ b/libuuid/uuid.pc.in @@ -1,7 +1,7 @@ prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@usrlib_execdir@ -includedir=@includedir@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include Name: uuid Description: Universally unique id library -- 1.7.2.5 ================================================ FILE: packages/sysutils/util-linux/scripts/mount-swap ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) . /etc/swap.conf . /etc/profile if [ -f /storage/.config/swap.conf ]; then . /storage/.config/swap.conf fi if [ -e /dev/.storage_netboot ] ; then logger -t Boot "### netbooting... swap disabled ###" exit 0 fi if [ ! "${SWAP_ENABLED}" = "yes" ] ; then logger -t Boot "### swap disabled via configfile ###" exit 0 fi SWAP=$(blkid -t TYPE="swap" -o device) case $1 in create) if [ -z "${SWAP}" ] && [ ! -f "${SWAPFILE}" ]; then mkdir -p "$(dirname ${SWAPFILE})" dd if=/dev/zero of="${SWAPFILE}" bs=1M count="${SWAPFILESIZE}" chmod 0600 "${SWAPFILE}" mkswap "${SWAPFILE}" fi ;; mount) { [ -z "${SWAP}" ] && [ -f "${SWAPFILE}" ]; } && SWAP="${SWAPFILE}" for i in ${SWAP}; do swapon -p 10000 "${i}" done ;; unmount) swapoff -a ;; esac ================================================ FILE: packages/sysutils/util-linux/sysctl.d/swappiness.conf ================================================ vm.swappiness=10 ================================================ FILE: packages/sysutils/util-linux/system.d/fstrim.service ================================================ [Unit] Description=Discard unused blocks on all filesystems [Service] Type=oneshot # don't run immediately on boot when timer event was missed ExecStartPre=-/usr/bin/sleep 20 ExecStart=-/usr/sbin/fstrim --all --verbose --quiet-unsupported ExecStart=-/usr/bin/touch /storage/.cache/fstrim.run ================================================ FILE: packages/sysutils/util-linux/system.d/fstrim.timer ================================================ [Unit] Description=Discard unused blocks once a week [Timer] OnCalendar=weekly AccuracySec=1h Persistent=true [Install] WantedBy=timers.target ================================================ FILE: packages/sysutils/util-linux/system.d/swap.service ================================================ [Unit] Description=Mounting swapfile DefaultDependencies=false Before=swap.target shutdown.target Conflicts=shutdown.target Wants=swap.target ConditionPathExists=/proc/swaps ConditionKernelCommandLine=!noswap ConditionKernelCommandLine=!installer [Service] Environment=HOME=/storage Type=oneshot ExecStartPre=/usr/lib/libreelec/mount-swap create ExecStart=/usr/lib/libreelec/mount-swap mount RemainAfterExit=yes [Install] WantedBy=basic.target ================================================ FILE: packages/sysutils/v4l-utils/config/rc_keymaps/README ================================================ RC keymaps user config dir put your own keymaps for ir-keytable in this directory ================================================ FILE: packages/sysutils/v4l-utils/config/rc_keymaps/protocols/README ================================================ BPF protocol decoders user config dir put your BPF protocol decoders for ir-keytable in this directory ================================================ FILE: packages/sysutils/v4l-utils/config/rc_maps.cfg.sample ================================================ # Keymaps table # # This table creates an association between a keycode file and a kernel # driver. It can be used to automatically override a keycode definition. # # # Format: # driver - name of the driver provided via uevent - use * for any driver # table - RC keymap table, provided via uevent - use * for any table # file - file name. If directory is not specified, it is first looked up # in /storage/.config/rc_keymaps, then /usr/lib/udev/rc_keymaps # # For example: # # driver table file # # gpio-rc-recv rc-streamzap streamzap # gpio-rc-recv * justboom # * rc-rc6-mce rc6_mce_new # * * hauppauge_new ================================================ FILE: packages/sysutils/v4l-utils/keymaps/a95x.toml ================================================ [[protocols]] name = "a95x" protocol = "nec" [protocols.scancodes] 0xdf0c = "KEY_NUMERIC_0" 0xdf54 = "KEY_NUMERIC_1" 0xdf16 = "KEY_NUMERIC_2" 0xdf15 = "KEY_NUMERIC_3" 0xdf50 = "KEY_NUMERIC_4" 0xdf12 = "KEY_NUMERIC_5" 0xdf11 = "KEY_NUMERIC_6" 0xdf4c = "KEY_NUMERIC_7" 0xdf0e = "KEY_NUMERIC_8" 0xdf0d = "KEY_NUMERIC_9" 0xdf06 = "KEY_ENTER" 0xdf1a = "KEY_UP" 0xdf48 = "KEY_DOWN" 0xdf47 = "KEY_LEFT" 0xdf07 = "KEY_RIGHT" 0xdf18 = "KEY_MENU" 0xdf0a = "KEY_BACK" 0xdf5d = "KEY_VOLUMEUP" 0xdf5c = "KEY_VOLUMEDOWN" 0xdf4f = "KEY_NEXT" 0xdf4b = "KEY_PREVIOUS" 0xdf5f = "KEY_INFO" 0xdf01 = "KEY_EPG" 0xdf1c = "KEY_POWER" 0xdf42 = "KEY_HOME" 0xdf41 = "KEY_FAVORITE" 0xdf03 = "KEY_CONTEXT_MENU" 0xdf10 = "KEY_BACK" 0xdff1 = "KEY_SLEEP" 0xdff2 = "KEY_SELECT" 0xdff3 = "KEY_MUTE" 0xdff4 = "KEY_PAGEUP" 0xdff5 = "KEY_PAGEDOWN" 0x07 = "KEY_PAGEDOWN" ================================================ FILE: packages/sysutils/v4l-utils/keymaps/beelink.toml ================================================ [[protocols]] name = "beelink_x2" protocol = "NEC" [protocols.scancodes] 0x804d = "KEY_MUTE" 0x8009 = "KEY_MEDIA" 0x8011 = "KEY_AUDIO" 0x8054 = "KEY_WWW" 0x804e = "KEY_VOLUMEUP" 0x80bb = "KEY_REWIND" 0x80bd = "KEY_FORWARD" 0x8056 = "KEY_VOLUMEDOWN" 0x8053 = "KEY_HOME" 0x801b = "KEY_BACK" 0x8026 = "KEY_UP" 0x8025 = "KEY_LEFT" 0x800d = "KEY_OK" 0x8027 = "KEY_RIGHT" 0x8028 = "KEY_DOWN" 0x8049 = "KEY_MENU" 0x8030 = "KEY_NUMERIC_0" 0x8031 = "KEY_NUMERIC_1" 0x8032 = "KEY_NUMERIC_2" 0x8033 = "KEY_NUMERIC_3" 0x8034 = "KEY_NUMERIC_4" 0x8035 = "KEY_NUMERIC_5" 0x8036 = "KEY_NUMERIC_6" 0x8037 = "KEY_NUMERIC_7" 0x8038 = "KEY_NUMERIC_8" 0x8039 = "KEY_NUMERIC_9" 0x8044 = "KEY_BACKSPACE" 0x8051 = "KEY_POWER" ================================================ FILE: packages/sysutils/v4l-utils/keymaps/beelink_bt_ir.toml ================================================ [[protocols]] name = "beelink_bt_ir" protocol = "nec" [protocols.scancodes] 0x8051 = "KEY_POWER" 0x804d = "KEY_MUTE" 0x8053 = "KEY_HOME" 0x800d = "KEY_OK" 0x8026 = "KEY_UP" 0x8025 = "KEY_LEFT" 0x8027 = "KEY_RIGHT" 0x8028 = "KEY_DOWN" 0x8049 = "KEY_MENU" 0x801b = "KEY_BACK" 0x8056 = "KEY_VOLUMEDOWN" 0x804e = "KEY_VOLUMEUP" 0x8041 = "KEY_CHANNELUP" 0x8042 = "KEY_CHANNELDOWN" 0x8044 = "KEY_DELETE" ================================================ FILE: packages/sysutils/v4l-utils/keymaps/beelink_pwr_only.toml ================================================ [[protocols]] name = "beelink_pwr_only" protocol = "nec" [protocols.scancodes] 0x8051 = "KEY_POWER" 0x59 = "KEY_POWER" ================================================ FILE: packages/sysutils/v4l-utils/keymaps/cubox_i.toml ================================================ [[protocols]] name = "cubox_i" protocol = "rc6" [protocols.scancodes] 0x1f020b0 = "KEY_MEDIA" 0x1f02078 = "KEY_UP" 0x1f02044 = "KEY_ENTER" 0x1f020f8 = "KEY_DOWN" 0x1f02004 = "KEY_LEFT" 0x1f02084 = "KEY_RIGHT" 0x1f020c4 = "KEY_BACKSPACE" 0x1f02068 = "KEY_PLAYPAUSE" 0x1f02064 = "KEY_EPG" ================================================ FILE: packages/sysutils/v4l-utils/keymaps/kvim.toml ================================================ [[protocols]] name = "kvim" protocol = "nec" [protocols.scancodes] 0x14 = "KEY_POWER" 0x07 = "KEY_ENTER" 0x03 = "KEY_UP" 0x02 = "KEY_DOWN" 0x0e = "KEY_LEFT" 0x1a = "KEY_RIGHT" 0x13 = "KEY_MENU" 0x01 = "KEY_BACK" 0x0b = "KEY_VOLUMEUP" 0x58 = "KEY_VOLUMEDOWN" 0x48 = "KEY_HOME" 0x5b = "KEY_CONTEXT_MENU" ================================================ FILE: packages/sysutils/v4l-utils/keymaps/kvim2.toml ================================================ [[protocols]] name = "kvim2" protocol = "nec" [protocols.scancodes] 0x113 = "KEY_1" 0x112 = "KEY_2" 0x110 = "KEY_3" 0x117 = "KEY_4" 0x116 = "KEY_5" 0x114 = "KEY_6" 0x11b = "KEY_7" 0x11a = "KEY_8" 0x118 = "KEY_9" 0x11e = "KEY_0" 0x158 = "KEY_MENU" 0x104 = "KEY_CHANNELUP" 0x106 = "KEY_CHANNELDOWN" 0x148 = "KEY_VOLUMEUP" 0x10b = "KEY_VOLUMEDOWN" 0x150 = "KEY_HOME" 0x115 = "KEY_RIGHT" 0x154 = "KEY_LEFT" 0x159 = "KEY_UP" 0x151 = "KEY_DOWN" 0x155 = "KEY_ENTER" 0x141 = "KEY_MUTE" 0x119 = "KEY_BACK" 0x11d = "KEY_INFO" 0x107 = "KEY_STOP" 0x105 = "KEY_PREVIOUSSONG" 0x101 = "KEY_NEXTSONG" 0x100 = "KEY_POWER" 0x140 = "KEY_REWIND" 0x103 = "KEY_FASTFORWARD" 0x144 = "KEY_PLAYPAUSE" 0x109 = "KEY_FAVORITES" 0x15c = "KEY_EPG" 0x11f = "KEY_RECORD" 0x111 = "KEY_ESC" 0x10a = "KEY_RED" 0x14d = "KEY_GREEN" 0x10e = "KEY_YELLOW" 0x10c = "KEY_BLUE" 0x149 = "KEY_LANGUAGE" 0x108 = "KEY_SUBTITLE" 0x10d = "KEY_CONTEXT_MENU" 0x14c = "KEY_CONFIG" 0x145 = "KEY_COMPOSE" 0x111 = "KEY_TEXT" ================================================ FILE: packages/sysutils/v4l-utils/keymaps/mecool.toml ================================================ [[protocols]] name = "mecool" protocol = "nec" [protocols.scancodes] 0x52 = "KEY_1" 0x50 = "KEY_2" 0x10 = "KEY_3" 0x56 = "KEY_4" 0x54 = "KEY_5" 0x14 = "KEY_6" 0x4e = "KEY_7" 0x4c = "KEY_8" 0x0c = "KEY_9" 0x0f = "KEY_0" 0x45 = "KEY_MENU" 0x55 = "KEY_CHANNELUP" 0x15 = "KEY_CHANNELDOWN" 0x13 = "KEY_VOLUMEUP" 0x17 = "KEY_VOLUMEDOWN" 0x0d = "KEY_HOME" 0x1b = "KEY_RIGHT" 0x5a = "KEY_LEFT" 0x06 = "KEY_UP" 0x16 = "KEY_DOWN" 0x1a = "KEY_ENTER" 0x19 = "KEY_MUTE" 0x05 = "KEY_BACK" 0x02 = "KEY_INFO" 0x44 = "KEY_STOP" 0x08 = "KEY_PREVIOUSSONG" 0x0b = "KEY_NEXTSONG" 0x59 = "KEY_POWER" 0x4a = "KEY_REWIND" 0x48 = "KEY_FASTFORWARD" 0x46 = "KEY_PLAYPAUSE" 0x1f = "KEY_FAVORITES" 0x4d = "KEY_EPG" 0x04 = "KEY_RECORD" 0x51 = "KEY_ESC" 0x42 = "KEY_RED" 0x40 = "KEY_GREEN" 0x00 = "KEY_YELLOW" 0x03 = "KEY_BLUE" 0x01 = "KEY_LANGUAGE" 0x09 = "KEY_SUBTITLE" 0x12 = "KEY_CONTEXT_MENU" 0x11 = "KEY_COMPOSE" 0x58 = "KEY_CONFIG" 0x18 = "KEY_TEXT" ================================================ FILE: packages/sysutils/v4l-utils/keymaps/minix_neo_pwr_only.toml ================================================ [[protocols]] name = "minix_neo_pwr_only" protocol = "nec" [protocols.scancodes] 0x118 = "KEY_POWER" ================================================ FILE: packages/sysutils/v4l-utils/keymaps/tanix.toml ================================================ [[protocols]] name = "tanix" protocol = "nec" [protocols.scancodes] 0x40404d = "KEY_POWER" 0x404043 = "KEY_MUTE" 0x40400b = "KEY_UP" 0x40400e = "KEY_DOWN" 0x404010 = "KEY_LEFT" 0x404011 = "KEY_RIGHT" 0x40400d = "KEY_ENTER" 0x40401a = "KEY_HOME" 0x404045 = "KEY_MENU" 0x404042 = "KEY_BACK" 0x404018 = "KEY_VOLUMEUP" 0x404017 = "KEY_VOLUMEDOWN" 0x404047 = "KEY_PLAYPAUSE" ================================================ FILE: packages/sysutils/v4l-utils/keymaps/xbox_360.toml ================================================ [[protocols]] name = "Xbox 360" protocol = "rc6" variant = "rc6_mce" [protocols.scancodes] 0x800f7400 = "KEY_NUMERIC_0" 0x800f7401 = "KEY_NUMERIC_1" 0x800f7402 = "KEY_NUMERIC_2" 0x800f7403 = "KEY_NUMERIC_3" 0x800f7404 = "KEY_NUMERIC_4" 0x800f7405 = "KEY_NUMERIC_5" 0x800f7406 = "KEY_NUMERIC_6" 0x800f7407 = "KEY_NUMERIC_7" 0x800f7408 = "KEY_NUMERIC_8" 0x800f7409 = "KEY_NUMERIC_9" 0x800f740a = "KEY_DELETE" 0x800f740b = "KEY_ENTER" 0x800f740c = "KEY_SLEEP" 0x800f740d = "KEY_MEDIA" 0x800f7464 = "KEY_MEDIA" 0x800f740e = "KEY_MUTE" 0x800f740f = "KEY_INFO" 0x800f7410 = "KEY_VOLUMEUP" 0x800f7411 = "KEY_VOLUMEDOWN" 0x800f7412 = "KEY_CHANNELUP" 0x800f746C = "KEY_CHANNELUP" 0x800f7413 = "KEY_CHANNELDOWN" 0x800f746D = "KEY_CHANNELDOWN" 0x800f7414 = "KEY_FASTFORWARD" 0x800f7415 = "KEY_REWIND" 0x800f7416 = "KEY_PLAY" 0x800f7417 = "KEY_RECORD" 0x800f7418 = "KEY_PAUSE" 0x800f7419 = "KEY_STOP" 0x800f741a = "KEY_NEXT" 0x800f741b = "KEY_PREVIOUS" 0x800f741c = "KEY_NUMERIC_POUND" 0x800f741d = "KEY_NUMERIC_STAR" 0x800f741e = "KEY_UP" 0x800f741f = "KEY_DOWN" 0x800f7420 = "KEY_LEFT" 0x800f7421 = "KEY_RIGHT" 0x800f7422 = "KEY_OK" 0x800f7423 = "KEY_EXIT" 0x800f7424 = "KEY_DVD" 0x800f744f = "KEY_EPG" 0x800f7427 = "KEY_ZOOM" 0x800f7432 = "KEY_MODE" 0x800f7433 = "KEY_PRESENTATION" 0x800f7428 = "KEY_EJECTCD" 0x800f743a = "KEY_BRIGHTNESSUP" 0x800f7446 = "KEY_TV" 0x800f7447 = "KEY_AUDIO" 0x800f7448 = "KEY_PVR" 0x800f7449 = "KEY_CAMERA" 0x800f744a = "KEY_VIDEO" 0x800f744c = "KEY_LANGUAGE" 0x800f7451 = "KEY_TITLE" 0x800f744e = "KEY_PRINT" 0x800f7450 = "KEY_RADIO" 0x800f745a = "KEY_SUBTITLE" 0x800f7425 = "KEY_RED" 0x800f7466 = "KEY_GREEN" 0x800f7426 = "KEY_YELLOW" 0x800f7468 = "KEY_BLUE" 0x800f7465 = "KEY_POWER2" 0x800f746e = "KEY_PLAYPAUSE" 0x800f746f = "KEY_PLAYER" 0x800f7480 = "KEY_BRIGHTNESSDOWN" 0x800f7481 = "KEY_PLAYPAUSE" ================================================ FILE: packages/sysutils/v4l-utils/keymaps/xbox_one.toml ================================================ [[protocols]] name = "Xbox One" protocol = "nec" variant = "necx" [protocols.scancodes] 0x80d864 = "KEY_MEDIA" 0x80d820 = "KEY_LEFT" 0x80d821 = "KEY_RIGHT" 0x80d81e = "KEY_UP" 0x80d81f = "KEY_DOWN" 0x80d822 = "KEY_OK" 0x80d823 = "KEY_EXIT" 0x80d80e = "KEY_MUTE" 0x80d810 = "KEY_VOLUMEUP" 0x80d811 = "KEY_VOLUMEDOWN" 0x80d812 = "KEY_CHANNELUP" 0x80d813 = "KEY_CHANNELDOWN" 0x80d814 = "KEY_FASTFORWARD" 0x80d815 = "KEY_REWIND" 0x80d870 = "KEY_PLAYPAUSE" 0x80d819 = "KEY_STOP" 0x80d81a = "KEY_NEXT" 0x80d81b = "KEY_PREVIOUS" 0x80d826 = "KEY_INFO" 0x80d86f = "KEY_EPG" 0x80d86e = "KEY_ZOOM" 0x80d801 = "KEY_1" 0x80d802 = "KEY_2" 0x80d803 = "KEY_3" 0x80d804 = "KEY_4" 0x80d805 = "KEY_5" 0x80d806 = "KEY_6" 0x80d807 = "KEY_7" 0x80d808 = "KEY_8" 0x80d809 = "KEY_9" 0x80d800 = "KEY_0" 0x80d817 = "KEY_RECORD" ================================================ FILE: packages/sysutils/v4l-utils/keymaps/zotac.toml ================================================ [[protocols]] name = "zotac" protocol = "rc6" variant = "rc6_mce" [protocols.scancodes] 0x8034048e = "KEY_POWER" 0x8034043d = "KEY_SLEEP" 0x80340400 = "KEY_NUMERIC_0" 0x80340401 = "KEY_NUMERIC_1" 0x80340402 = "KEY_NUMERIC_2" 0x80340403 = "KEY_NUMERIC_3" 0x80340404 = "KEY_NUMERIC_4" 0x80340405 = "KEY_NUMERIC_5" 0x80340406 = "KEY_NUMERIC_6" 0x80340407 = "KEY_NUMERIC_7" 0x80340408 = "KEY_NUMERIC_8" 0x80340409 = "KEY_NUMERIC_9" 0x80340432 = "KEY_NUMERIC_POUND" 0x80340433 = "KEY_NUMERIC_STAR" 0x8034043a = "KEY_DELETE" 0x80340434 = "KEY_ENTER" 0x8034045d = "KEY_MEDIA" 0x8034040d = "KEY_MUTE" 0x803404cb = "KEY_INFO" 0x80340410 = "KEY_VOLUMEUP" 0x80340411 = "KEY_VOLUMEDOWN" 0x8034041e = "KEY_CHANNELUP" 0x8034041f = "KEY_CHANNELDOWN" 0x80340428 = "KEY_FASTFORWARD" 0x80340429 = "KEY_REWIND" 0x8034042c = "KEY_PLAY" 0x80340437 = "KEY_RECORD" 0x80340430 = "KEY_PAUSE" 0x80340431 = "KEY_STOP" 0x80340420 = "KEY_NEXT" 0x80340421 = "KEY_PREVIOUS" 0x80340458 = "KEY_UP" 0x80340459 = "KEY_DOWN" 0x8034045a = "KEY_LEFT" 0x8034045b = "KEY_RIGHT" 0x8034045c = "KEY_OK" 0x80340483 = "KEY_EXIT" 0x8034043e = "KEY_EPG" 0x8034042f = "KEY_TITLE" 0x8034046d = "KEY_RED" 0x8034046e = "KEY_GREEN" 0x8034046f = "KEY_YELLOW" 0x80340470 = "KEY_BLUE" ================================================ FILE: packages/sysutils/v4l-utils/package.mk ================================================ # 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) # with 1.0.0 repeat delay is broken. test on upgrade PKG_NAME="v4l-utils" PKG_VERSION="1.22.1" PKG_SHA256="65c6fbe830a44ca105c443b027182c1b2c9053a91d1e72ad849dfab388b94e31" PKG_LICENSE="GPL" PKG_SITE="http://linuxtv.org/" PKG_URL="http://linuxtv.org/downloads/v4l-utils/${PKG_NAME}-${PKG_VERSION}.tar.bz2" [[ "${DEVICE}" != "Amlogic-old" ]] && PKG_DEPENDS_TARGET="libbpf" PKG_DEPENDS_TARGET="toolchain alsa-lib elfutils gcc-bpf:host ${PKG_DEPENDS_TARGET} systemd zlib" PKG_LONGDESC="Linux V4L2 and DVB API utilities and v4l libraries (libv4l)." PKG_STAMP_VAR="$IR_REMOTE_KEYMAPS" PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--without-jpeg \ --enable-bpf \ --enable-static \ --with-udevdir=/usr/lib/udev/ \ --disable-shared \ --disable-doxygen-doc" pre_configure_target() { # cec-ctl fails to build in subdirs cd ${PKG_BUILD} rm -rf .${TARGET_NAME} } make_target() { make -C utils/keytable CFLAGS="${TARGET_CFLAGS}" make -C utils/ir-ctl CFLAGS="${TARGET_CFLAGS}" if [ "${CEC_FRAMEWORK_SUPPORT}" = "yes" ]; then make -C utils/libcecutil CFLAGS="${TARGET_CFLAGS}" make -C utils/cec-ctl CFLAGS="${TARGET_CFLAGS}" fi make -C lib CFLAGS="${TARGET_CFLAGS}" make -C utils/dvb CFLAGS="${TARGET_CFLAGS}" make -C utils/v4l2-ctl CFLAGS="${TARGET_CFLAGS}" if [ "${LIBREELEC_VERSION}" == "devel" ]; then make -C utils/v4l2-compliance CFLAGS="${TARGET_CFLAGS}" fi } makeinstall_target() { make install DESTDIR=${INSTALL} PREFIX=/usr -C utils/keytable make install DESTDIR=${INSTALL} PREFIX=/usr -C utils/ir-ctl if [ "${CEC_FRAMEWORK_SUPPORT}" = "yes" ]; then make install DESTDIR=${INSTALL} PREFIX=/usr -C utils/cec-ctl fi make install DESTDIR=${INSTALL} PREFIX=/usr -C utils/dvb make install DESTDIR=${INSTALL} PREFIX=/usr -C utils/v4l2-ctl if [ "${LIBREELEC_VERSION}" == "devel" ]; then make install DESTDIR=${INSTALL} PREFIX=/usr -C utils/v4l2-compliance fi cp ${PKG_BUILD}/contrib/lircd2toml.py ${INSTALL}/usr/bin/ } create_multi_keymap() { local f name map name="${1}" shift 1 ( for f in "$@"; do map="${INSTALL}/usr/lib/udev/rc_keymaps/${f}.toml" [ -e "${map}" ] && cat "${map}" done ) > ${INSTALL}/usr/lib/udev/rc_keymaps/${name}.toml } post_makeinstall_target() { local f keymap rm -rf ${INSTALL}/etc/rc_keymaps ln -sf /storage/.config/rc_keymaps ${INSTALL}/etc/rc_keymaps mkdir -p ${INSTALL}/usr/config cp -PR ${PKG_DIR}/config/* ${INSTALL}/usr/config rm -rf ${INSTALL}/usr/lib/udev/rules.d mkdir -p ${INSTALL}/usr/lib/udev/rules.d cp -PR ${PKG_DIR}/udev.d/*.rules ${INSTALL}/usr/lib/udev/rules.d # install additional keymaps without overwriting upstream maps ( set -C for f in ${PKG_DIR}/keymaps/*; do if [ -e ${f} ]; then keymap=$(basename ${f}) cat ${f} > ${INSTALL}/usr/lib/udev/rc_keymaps/${keymap} fi done ) # create multi keymap to support several remotes OOTB if [ -n "${IR_REMOTE_KEYMAPS}" ]; then create_multi_keymap libreelec_multi ${IR_REMOTE_KEYMAPS} # use multi-keymap instead of default one sed -i '/^\*\s*rc-rc6-mce\s*rc6_mce/d' ${INSTALL}/etc/rc_maps.cfg cat << EOF >> ${INSTALL}/etc/rc_maps.cfg # # Custom LibreELEC configuration starts here # # use combined multi-table on MCE receivers # * rc-rc6-mce rc6_mce.toml * rc-rc6-mce libreelec_multi.toml # multi-table for amlogic devices meson-ir rc-empty libreelec_multi.toml EOF fi } ================================================ FILE: packages/sysutils/v4l-utils/patches/v4l-utils-001-disable-doxygen-in-automake.patch ================================================ From 137dd2edea4d6c70b10caebebed4778716070ed2 Mon Sep 17 00:00:00 2001 From: Matthias Reichl <hias@horus.com> Date: Sun, 9 Feb 2020 00:16:29 +0100 Subject: [PATCH] don't include doxygen autotools include Signed-off-by: Matthias Reichl <hias@horus.com> --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index d20dfe0f..05dc8c1a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -10,7 +10,7 @@ EXTRA_DIST = android-config.h sync-with-kernel.sh bootstrap.sh \ doxygen_libdvbv5.cfg include COPYING.libv4l \ COPYING.libdvbv5 README.libv4l README.lib-multi-threading \ TODO.libdvbv5 doc/libdvbv5-index.doc -include $(top_srcdir)/aminclude.am +# include $(top_srcdir)/aminclude.am -- 2.20.1 ================================================ FILE: packages/sysutils/v4l-utils/patches/v4l-utils-002-support-libbpf-1-0-0.patch ================================================ From dce0e3e1e4ea91d3e46098362a880371ec5afe1b Mon Sep 17 00:00:00 2001 From: Sudip Mukherjee <sudipm.mukherjee@gmail.com> Date: Tue, 1 Nov 2022 20:25:28 +0000 Subject: keytable: Convert deprecated libbpf API The libbpf APIs bpf_load_program_xattr(), bpf_create_map_node() and bpf_create_map_in_map_node() have been deprecated since v0.7. Convert them to use bpf_prog_load() and bpf_map_create(). Also, modify config script to add a check for libbpf version. Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com> Signed-off-by: Sean Young <sean@mess.org> --- configure.ac | 2 +- utils/keytable/bpf_load.c | 59 ++++++++++++++++++++++++++--------------------- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/configure.ac b/configure.ac index 05298981..9b7c371d 100644 --- a/configure.ac +++ b/configure.ac @@ -564,7 +564,7 @@ AM_CONDITIONAL([WITH_V4L2_CTL_32], [test x${enable_v4l2_ctl_32} = xyes]) AM_CONDITIONAL([WITH_V4L2_COMPLIANCE], [test x$ac_cv_func_fork = xyes]) AM_CONDITIONAL([WITH_V4L2_COMPLIANCE_LIBV4L], [test x$ac_cv_func_fork = xyes -a x${enable_v4l2_compliance_libv4l} != xno]) AM_CONDITIONAL([WITH_V4L2_COMPLIANCE_32], [test x$ac_cv_func_fork = xyes -a x${enable_v4l2_compliance_32} = xyes]) -PKG_CHECK_MODULES([LIBBPF], [libbpf], [bpf_pc=yes], [bpf_pc=no]) +PKG_CHECK_MODULES([LIBBPF], [libbpf >= 0.7], [bpf_pc=yes], [bpf_pc=no]) AM_CONDITIONAL([WITH_BPF], [test x$enable_bpf != xno -a x$libelf_pkgconfig = xyes -a x$CLANG = xclang -a x$bpf_pc = xyes]) # append -static to libtool compile and link command to enforce static libs diff --git a/utils/keytable/bpf_load.c b/utils/keytable/bpf_load.c index 7c633dac..06098fc3 100644 --- a/utils/keytable/bpf_load.c +++ b/utils/keytable/bpf_load.c @@ -63,19 +63,17 @@ struct bpf_file { static int load_and_attach(int lirc_fd, struct bpf_file *bpf_file, struct bpf_insn *prog, int size) { - struct bpf_load_program_attr load_attr; - int fd, err; + LIBBPF_OPTS(bpf_prog_load_opts, opts); + int fd, err, insn_cnt; - memset(&load_attr, 0, sizeof(struct bpf_load_program_attr)); + insn_cnt = size / sizeof(struct bpf_insn); - load_attr.prog_type = BPF_PROG_TYPE_LIRC_MODE2; - load_attr.expected_attach_type = BPF_LIRC_MODE2; - load_attr.name = bpf_file->name; - load_attr.insns = prog; - load_attr.insns_cnt = size / sizeof(struct bpf_insn); - load_attr.license = bpf_file->license; + opts.expected_attach_type = BPF_LIRC_MODE2; + opts.log_buf = bpf_log_buf; + opts.log_size = LOG_BUF_SIZE; - fd = bpf_load_program_xattr(&load_attr, bpf_log_buf, LOG_BUF_SIZE); + fd = bpf_prog_load(BPF_PROG_TYPE_LIRC_MODE2, bpf_file->name, + bpf_file->license, prog, insn_cnt, &opts); if (fd < 0) { printf("bpf_load_program() err=%m\n%s", bpf_log_buf); return -1; @@ -95,6 +93,9 @@ static int build_raw_map(struct bpf_map_data *map, struct raw_entry *raw, int nu int no_patterns, value_size, fd, key, i; struct raw_entry *e; struct raw_pattern *p; + LIBBPF_OPTS(bpf_map_create_opts, opts, + .map_flags = map->def.map_flags, + ); no_patterns = 0; @@ -110,14 +111,13 @@ static int build_raw_map(struct bpf_map_data *map, struct raw_entry *raw, int nu value_size = sizeof(struct raw_pattern) + max_length * sizeof(short); - fd = bpf_create_map_node(map->def.type, - map->name, - map->def.key_size, - value_size, - no_patterns, - map->def.map_flags, - numa_node); - + opts.numa_node = numa_node; + fd = bpf_map_create(map->def.type, + map->name, + map->def.key_size, + value_size, + no_patterns, + &opts); if (fd < 0) { printf(_("failed to create a map: %d %s\n"), errno, strerror(errno)); @@ -174,27 +174,34 @@ static int load_maps(struct bpf_file *bpf_file, struct raw_entry *raw) if (maps[i].def.type == BPF_MAP_TYPE_ARRAY_OF_MAPS || maps[i].def.type == BPF_MAP_TYPE_HASH_OF_MAPS) { - int inner_map_fd = bpf_file->map_fd[maps[i].def.inner_map_idx]; + LIBBPF_OPTS(bpf_map_create_opts, opts, + .inner_map_fd = bpf_file->map_fd[maps[i].def.inner_map_idx], + .map_flags = maps[i].def.map_flags, + .numa_node = numa_node, + ); - bpf_file->map_fd[i] = bpf_create_map_in_map_node( + bpf_file->map_fd[i] = bpf_map_create( maps[i].def.type, maps[i].name, maps[i].def.key_size, - inner_map_fd, + 4, maps[i].def.max_entries, - maps[i].def.map_flags, - numa_node); + &opts); } else if (!strcmp(maps[i].name, "raw_map")) { bpf_file->map_fd[i] = build_raw_map(&maps[i], raw, numa_node); } else { - bpf_file->map_fd[i] = bpf_create_map_node( + LIBBPF_OPTS(bpf_map_create_opts, opts, + .map_flags = maps[i].def.map_flags, + .numa_node = numa_node, + ); + + bpf_file->map_fd[i] = bpf_map_create( maps[i].def.type, maps[i].name, maps[i].def.key_size, maps[i].def.value_size, maps[i].def.max_entries, - maps[i].def.map_flags, - numa_node); + &opts); } if (bpf_file->map_fd[i] < 0) { -- cgit v1.2.1 ================================================ FILE: packages/sysutils/v4l-utils/patches/v4l-utils-003-add-power-on-argument.patch ================================================ From 43034e79bdd1385f7410361c0e986adfcf2cdae3 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Tue, 8 Dec 2020 09:35:08 -0500 Subject: [PATCH] add-power-on-argument --- utils/keytable/keytable.c | 154 +++++++++++++++++++++++++------------- 1 file changed, 102 insertions(+), 52 deletions(-) diff --git a/utils/keytable/keytable.c b/utils/keytable/keytable.c index 248493a..6f1831a 100644 --- a/utils/keytable/keytable.c +++ b/utils/keytable/keytable.c @@ -141,6 +141,7 @@ enum sysfs_protocols { SYSFS_IMON = (1 << 14), SYSFS_RCMM = (1 << 15), SYSFS_XBOX_DVD = (1 << 16), + SYSFS_IRMP = (1 << 17), SYSFS_INVALID = 0, }; @@ -177,6 +178,7 @@ const struct protocol_map_entry protocol_map[] = { { "imon", NULL, SYSFS_IMON }, { "rc-mm", NULL, SYSFS_RCMM }, { "xbox-dvd", NULL, SYSFS_XBOX_DVD }, + { "irmp", "/irmp_decoder", SYSFS_IRMP }, { NULL, NULL, SYSFS_INVALID }, }; @@ -266,6 +268,7 @@ static const struct argp_option options[] = { {"clear", 'c', 0, 0, N_("Clears the scancode to keycode mappings"), 0}, {"sysdev", 's', N_("SYSDEV"), 0, N_("rc device to control, defaults to rc0 if not specified"), 0}, {"test", 't', 0, 0, N_("test if IR is generating events"), 0}, + {"power-key", 'u', 0, 0, N_("will scan for a compatible power on code"), 0}, {"read", 'r', 0, 0, N_("reads the current scancode/keycode mapping"), 0}, {"write", 'w', N_("KEYMAP"), 0, N_("write (adds) the keymap from the specified file"), 0}, {"set-key", 'k', N_("SCANKEY"), 0, N_("Change scan/key pairs"), 0}, @@ -289,6 +292,7 @@ static int readtable = 0; static int clear = 0; int debug = 0; static int test = 0; +static int poweron = 0; static int delay = -1; static int period = -1; static int test_keymap = 0; @@ -538,6 +542,9 @@ static error_t parse_opt(int k, char *arg, struct argp_state *state) case 't': test++; break; + case 'u': + poweron++; + break; case 'c': clear++; break; @@ -1501,12 +1508,14 @@ static void print_scancodes(const struct lirc_scancode *scancodes, unsigned coun } } -static void test_event(struct rc_device *rc_dev, int fd) +static void test_event(struct rc_device *rc_dev, int fd, int power_on) { struct input_event ev[64]; struct lirc_scancode sc[64]; int rd, i, lircfd = -1; unsigned mode; + unsigned protocol; + unsigned undefined; /* LIRC reports time in monotonic, set event to same */ mode = CLOCK_MONOTONIC; @@ -1526,7 +1535,11 @@ static void test_event(struct rc_device *rc_dev, int fd) } } - printf (_("Testing events. Please, press CTRL-C to abort.\n")); + if (!power_on) + printf (_("Testing events. Please, press CTRL-C to abort.\n")); + else + printf (_("Waiting for IRMP decode event. Please, press CTRL-C to abort.\n")); + while (1) { struct pollfd pollstruct[2] = { { .fd = fd, .events = POLLIN }, @@ -1540,7 +1553,7 @@ static void test_event(struct rc_device *rc_dev, int fd) perror(_("poll returned error")); } - if (lircfd != -1) { + if (lircfd != -1 && !power_on) { rd = read(lircfd, sc, sizeof(sc)); if (rd != -1) { @@ -1561,54 +1574,88 @@ static void test_event(struct rc_device *rc_dev, int fd) return; } - for (i = 0; i < rd / sizeof(struct input_event); i++) { - printf(_("%ld.%06ld: event type %s(0x%02x)"), - ev[i].input_event_sec, ev[i].input_event_usec, - get_event_name(events_type, ev[i].type), ev[i].type); + if (!power_on) { + for (i = 0; i < rd / sizeof(struct input_event); i++) { + printf(_("%ld.%06ld: event type %s(0x%02x)"), + ev[i].input_event_sec, ev[i].input_event_usec, + get_event_name(events_type, ev[i].type), ev[i].type); - switch (ev[i].type) { - case EV_SYN: - printf(".\n"); - break; - case EV_KEY: - printf(_(" key_%s: %s(0x%04x)\n"), - (ev[i].value == 0) ? _("up") : _("down"), - get_event_name(key_events, ev[i].code), - ev[i].code); - break; - case EV_REL: - printf(_(": %s (0x%04x) value=%d\n"), - get_event_name(rel_events, ev[i].code), - ev[i].code, - ev[i].value); - break; - case EV_ABS: - printf(_(": %s (0x%04x) value=%d\n"), - get_event_name(abs_events, ev[i].code), - ev[i].code, - ev[i].value); - break; - case EV_MSC: - if (ev[i].code == MSC_SCAN) - printf(_(": scancode = 0x%02x\n"), ev[i].value); - else - printf(_(": code = %s(0x%02x), value = %d\n"), - get_event_name(msc_events, ev[i].code), + switch (ev[i].type) { + case EV_SYN: + printf(".\n"); + break; + case EV_KEY: + printf(_(" key_%s: %s(0x%04x)\n"), + (ev[i].value == 0) ? _("up") : _("down"), + get_event_name(key_events, ev[i].code), + ev[i].code); + break; + case EV_REL: + printf(_(": %s (0x%04x) value=%d\n"), + get_event_name(rel_events, ev[i].code), + ev[i].code, + ev[i].value); + break; + case EV_ABS: + printf(_(": %s (0x%04x) value=%d\n"), + get_event_name(abs_events, ev[i].code), + ev[i].code, + ev[i].value); + break; + case EV_MSC: + if (ev[i].code == MSC_SCAN) + printf(_(": scancode = 0x%02x\n"), ev[i].value); + else + printf(_(": code = %s(0x%02x), value = %d\n"), + get_event_name(msc_events, ev[i].code), + ev[i].code, ev[i].value); + break; + case EV_REP: + printf(_(": value = %d\n"), ev[i].value); + break; + case EV_SW: + case EV_LED: + case EV_SND: + case EV_FF: + case EV_PWR: + case EV_FF_STATUS: + default: + printf(_(": code = 0x%02x, value = %d\n"), ev[i].code, ev[i].value); - break; - case EV_REP: - printf(_(": value = %d\n"), ev[i].value); - break; - case EV_SW: - case EV_LED: - case EV_SND: - case EV_FF: - case EV_PWR: - case EV_FF_STATUS: - default: - printf(_(": code = 0x%02x, value = %d\n"), - ev[i].code, ev[i].value); - break; + break; + } + } + } else { + for (i = 0; i < rd / sizeof(struct input_event); i++) { + + switch (ev[i].type) { + case EV_MSC: + if (ev[i].code == MSC_SCAN) { + if ((ev[i].value & 0xFFFFFF00) == 0xA0A0A000) { + protocol = ev[i].value & 0xFF; + undefined = 0; + mode = 0; + } + else if ((ev[i].value & 0xFFFFFF00) == 0xB0B0B000) { + protocol = ev[i].value & 0xFF; + undefined = 1; + mode = 0; + } + else if (!mode) { + if (!undefined) { + printf(_("Received IRMP code: remotewakeup='0x%08x', decode_type='0x%x', "), ev[i].value, protocol); + mode = 1; + } + else + printf(_("Received IRMP code: scancode='0x%08x', IRMP protocol = %d, decode_type is undefined!\n"), ev[i].value, protocol); + } + else if (mode) { + printf(_("remotewakeupmask='0x%08x'\n"), ev[i].value); + mode = 0; + } + } + break; + } } } } @@ -2047,7 +2094,7 @@ int main(int argc, char *argv[]) return 0; /* Just list all devices */ - if (!clear && !readtable && !keytable && !ch_proto && !cfg.next && !test && delay < 0 && period < 0 && !bpf_protocol) { + if (!clear && !readtable && !keytable && !ch_proto && !cfg.next && !test && !poweron && delay < 0 && period < 0 && !bpf_protocol) { if (show_sysfs_attribs(&rc_dev, devclass)) return -1; @@ -2153,6 +2200,9 @@ int main(int argc, char *argv[]) /* * Third step: change protocol */ + if (poweron) + ch_proto = SYSFS_IRMP; + if (ch_proto || bpf_protocol) { if (rc_dev.lirc_name) clear_bpf(rc_dev.lirc_name); @@ -2203,8 +2253,8 @@ int main(int argc, char *argv[]) set_rate(fd, new_delay, new_period); } - if (test) - test_event(&rc_dev, fd); + if (test || poweron) + test_event(&rc_dev, fd, poweron); return 0; } -- 2.38.1 ================================================ FILE: packages/sysutils/v4l-utils/patches/v4l-utils-003-enable-bpf-without-clang.patch ================================================ From ff65aa88a1ff3f02cc10e5a6e2af865b0c97f4fc Mon Sep 17 00:00:00 2001 From: Matthias Reichl <hias@horus.com> Date: Sat, 8 Feb 2020 21:42:06 +0100 Subject: [PATCH] disable bpf decoder build and drop bpf dependency on clang Signed-off-by: Matthias Reichl <hias@horus.com> --- configure.ac | 2 +- utils/keytable/Makefile.am | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 3bb1d2a5..7b633473 100644 --- a/configure.ac +++ b/configure.ac @@ -565,7 +565,7 @@ AM_CONDITIONAL([WITH_V4L2_COMPLIANCE_LIBV4L], [test x$ac_cv_func_fork = xyes -a x${enable_v4l2_compliance_libv4l} != xno]) AM_CONDITIONAL([WITH_V4L2_COMPLIANCE_32], [test x$ac_cv_func_fork = xyes -a x${enable_v4l2_compliance_32} = xyes]) PKG_CHECK_MODULES([LIBBPF], [libbpf >= 0.7], [bpf_pc=yes], [bpf_pc=no]) -AM_CONDITIONAL([WITH_BPF], [test x$enable_bpf != xno -a x$libelf_pkgconfig = xyes -a x$CLANG = xclang -a x$bpf_pc = xyes]) +AM_CONDITIONAL([WITH_BPF], [test x$enable_bpf != xno -a x$libelf_pkgconfig = xyes -a x$bpf_pc = xyes]) # append -static to libtool compile and link command to enforce static libs AS_IF([test x$enable_libdvbv5 = xno], [AC_SUBST([ENFORCE_LIBDVBV5_STATIC], ["-static"])]) diff --git a/utils/keytable/Makefile.am b/utils/keytable/Makefile.am index 4724897e..1c209fe2 100644 --- a/utils/keytable/Makefile.am +++ b/utils/keytable/Makefile.am @@ -23,7 +23,7 @@ if WITH_BPF ir_keytable_LDFLAGS += $(LIBELF_LIBS) $(LIBBPF_LIBS) ir_keytable_CFLAGS = $(LIBBPF_CFLAGS) -SUBDIRS = bpf_protocols +# SUBDIRS = bpf_protocols endif EXTRA_DIST = 70-infrared.rules 50-rc_keymap.conf rc_keymaps rc_keymaps_userspace gen_input_events.pl gen_keytables.pl ir-keytable.1 rc_maps.cfg rc_keymap.5 -- 2.20.1 ================================================ FILE: packages/sysutils/v4l-utils/udev.d/70-infrared.rules ================================================ # Automatically load the proper keymaps after the Remote Controller device # creation. # # User-defined rules can be stored in /storage/.config/rc_maps.cfg. If that # file doesn't exist the default rules from /etc/rc_maps.cfg are used. ACTION=="add", KERNEL=="event*", SUBSYSTEM=="input", SUBSYSTEMS=="rc", ENV{.rc_sysdev}="$id", GOTO="begin" GOTO="end" LABEL="begin" ENV{.rc_maps_cfg}="/etc/rc_maps.cfg" TEST=="/storage/.config/rc_maps.cfg", ENV{.rc_maps_cfg}="/storage/.config/rc_maps.cfg" RUN+="/usr/bin/ir-keytable -a $env{.rc_maps_cfg} -s $env{.rc_sysdev}" LABEL="end" ================================================ FILE: packages/sysutils/wait-time-sync/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="wait-time-sync" PKG_VERSION="1.0" PKG_LICENSE="GPL" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A simple tool and systemd service to wait until NTP time is synced" post_install() { enable_service wait-time-sync.service } ================================================ FILE: packages/sysutils/wait-time-sync/sources/Makefile ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) .PHONY: all all: wait-time-sync PREFIX = /usr .PHONY: install install: wait-time-sync install -d $(DESTDIR)$(PREFIX)/bin install $< $(DESTDIR)$(PREFIX)/bin ================================================ FILE: packages/sysutils/wait-time-sync/sources/wait-time-sync.c ================================================ /* SPDX-License-Identifier: GPL-2.0 */ /* Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) */ #include <sys/timex.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <errno.h> #include <limits.h> #define POLL_FREQ 10 void usage(char *name) { if (!name) name = "wait-time-sync"; printf("Usage: %s [-t seconds | --timeout seconds]\n", name); exit(2); } int main(int argc, char** argv) { unsigned timeout = UINT_MAX; int rc = 0; if (argc == 3) { unsigned long val; char *p; if (strcmp(argv[1], "-t") && strcmp(argv[1], "--timeout")) usage(argv[0]); val = strtoul(argv[2], &p, 0); if (*p || val == 0 || val >= UINT_MAX / POLL_FREQ) usage(argv[0]); timeout = (unsigned)val * POLL_FREQ; } else if (argc != 1) usage(argv[0]); for ( ; timeout; --timeout) { struct timex tx = {}; rc = adjtimex(&tx); if (rc != TIME_ERROR) break; usleep(1000000U / POLL_FREQ); } return rc == -1 ? errno : !timeout; } ================================================ FILE: packages/sysutils/wait-time-sync/system.d/wait-time-sync.service ================================================ # SPDX-License-Identifier: LGPL-2.1+ # # This file was part of systemd. # Modified by Team LibreELEC (https://libreelec.tv) # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. [Unit] Description=Wait for Kernel Time Synchronisation ConditionVirtualization=!container DefaultDependencies=no Before=time-sync.target shutdown.target Wants=time-sync.target Conflicts=shutdown.target [Service] Type=oneshot ExecStart=/usr/bin/wait-time-sync TimeoutStartSec=infinity RemainAfterExit=yes [Install] WantedBy=sysinit.target ================================================ FILE: packages/testing/package.mk ================================================ # 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="testing" PKG_VERSION="" PKG_LICENSE="various" PKG_SITE="https://libreelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="virtual" PKG_LONGDESC="testing: Metapackage for various packages to test while developing" ================================================ FILE: packages/textproc/expat/package.mk ================================================ # 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="expat" PKG_VERSION="2.5.0" PKG_SHA256="ef2420f0232c087801abf705e89ae65f6257df6b7931d37846a193ef2e8cdcbe" PKG_LICENSE="OSS" PKG_SITE="https://libexpat.github.io" PKG_URL="https://github.com/libexpat/libexpat/releases/download/R_${PKG_VERSION//./_}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Expat is an XML parser library written in C." PKG_CMAKE_OPTS_TARGET="-DEXPAT_BUILD_DOCS=OFF \ -DEXPAT_BUILD_TOOLS=OFF \ -DEXPAT_BUILD_EXAMPLES=OFF \ -DEXPAT_BUILD_TESTS=OFF \ -DEXPAT_SHARED_LIBS=ON" PKG_CMAKE_OPTS_HOST="-DEXPAT_BUILD_DOCS=OFF \ -DEXPAT_BUILD_TOOLS=OFF \ -DEXPAT_BUILD_EXAMPLES=OFF \ -DEXPAT_BUILD_TESTS=OFF \ -DEXPAT_SHARED_LIBS=ON" ================================================ FILE: packages/textproc/itstool/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="itstool" PKG_VERSION="2.0.7" PKG_SHA256="6b9a7cd29a12bb95598f5750e8763cee78836a1a207f85b74d8b3275b27e87ca" PKG_LICENSE="GPLv3" PKG_SITE="http://itstool.org" PKG_URL="http://files.itstool.org/itstool/itstool-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_HOST="toolchain libxml2:host" PKG_LONGDESC="ITS Tool allows you to translate your XML documents with PO files." PKG_TOOLCHAIN="autotools" ================================================ FILE: packages/textproc/jsoncpp/package.mk ================================================ # 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="jsoncpp" PKG_VERSION="1.9.5" PKG_SHA256="f409856e5920c18d0c2fb85276e24ee607d2a09b5e7d5f0a371368903c275da2" PKG_LICENSE="GPL" PKG_SITE="https://github.com/open-source-parsers/jsoncpp/" PKG_URL="https://github.com/open-source-parsers/jsoncpp/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A C++ library for interacting with JSON." PKG_BUILD_FLAGS="+pic" PKG_MESON_OPTS_TARGET="-Dtests=false \ --default-library static" ================================================ FILE: packages/textproc/libidn2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libidn2" PKG_VERSION="2.3.4" PKG_SHA256="93caba72b4e051d1f8d4f5a076ab63c99b77faee019b72b9783b267986dbb45f" PKG_LICENSE="LGPL3" PKG_SITE="https://www.gnu.org/software/libidn/" PKG_URL="https://ftpmirror.gnu.org/gnu/libidn/libidn2-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Free software implementation of IDNA2008, Punycode and TR46." PKG_CONFIGURE_OPTS_TARGET="--disable-doc \ --enable-shared \ --disable-static" post_makeinstall_target() { safe_remove ${INSTALL}/usr/bin } ================================================ FILE: packages/textproc/libxml2/package.mk ================================================ # 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) PKG_NAME="libxml2" PKG_VERSION="2.10.3" PKG_SHA256="302bbb86400b8505bebfbf7b3d1986e9aa05073198979f258eed4be481ff5f83" PKG_LICENSE="MIT" PKG_SITE="http://xmlsoft.org" PKG_URL="https://gitlab.gnome.org/GNOME/${PKG_NAME}/-/archive/v${PKG_VERSION}/${PKG_NAME}-v${PKG_VERSION}.tar.bz2" PKG_DEPENDS_HOST="zlib:host Python3:host" PKG_DEPENDS_TARGET="toolchain zlib" PKG_LONGDESC="The libxml package contains an XML library, which allows you to manipulate XML files." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_ALL="ac_cv_header_ansidecl_h=no \ --enable-static \ --enable-shared \ --disable-silent-rules \ --enable-ipv6 \ --without-lzma" PKG_CONFIGURE_OPTS_HOST="${PKG_CONFIGURE_OPTS_ALL} \ --with-zlib=${TOOLCHAIN} \ --with-python" PKG_CONFIGURE_OPTS_TARGET="${PKG_CONFIGURE_OPTS_ALL} \ --with-zlib=${SYSROOT_PREFIX}/usr \ --without-python \ --with-sysroot=${SYSROOT_PREFIX}" post_makeinstall_target() { sed -e "s:\(['= ]\)/usr:\\1${SYSROOT_PREFIX}/usr:g" -i ${SYSROOT_PREFIX}/usr/bin/xml2-config rm -rf ${INSTALL}/usr/bin rm -rf ${INSTALL}/usr/lib/xml2Conf.sh } ================================================ FILE: packages/textproc/libxslt/package.mk ================================================ # 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) PKG_NAME="libxslt" PKG_VERSION="1.1.37" PKG_SHA256="6dbeb21aa8c938e6a39010901c0e84122bb87225b4af31f76feb4e3a5b138a5c" PKG_LICENSE="MIT" PKG_SITE="http://xmlsoft.org/xslt/" PKG_URL="https://gitlab.gnome.org/GNOME/${PKG_NAME}/-/archive/v${PKG_VERSION}/${PKG_NAME}-v${PKG_VERSION}.tar.bz2" PKG_DEPENDS_HOST="libxml2:host" PKG_DEPENDS_TARGET="toolchain libxml2" PKG_LONGDESC="A XSLT C library." PKG_BUILD_FLAGS="+pic" PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_HOST=" ac_cv_header_ansidecl_h=no \ ac_cv_header_xlocale_h=no \ --enable-static \ --disable-shared \ --without-python \ --with-libxml-prefix=${TOOLCHAIN} \ --without-crypto" PKG_CONFIGURE_OPTS_TARGET="ac_cv_header_ansidecl_h=no \ ac_cv_header_xlocale_h=no \ --enable-static \ --disable-shared \ --without-python \ --with-libxml-prefix=${SYSROOT_PREFIX}/usr \ --without-crypto" post_makeinstall_target() { sed -e "s:\(['= ]\)/usr:\\1${SYSROOT_PREFIX}/usr:g" -i ${SYSROOT_PREFIX}/usr/bin/xslt-config rm -rf ${INSTALL}/usr/bin/xsltproc rm -rf ${INSTALL}/usr/lib/xsltConf.sh } ================================================ FILE: packages/textproc/nlohmann-json/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nlohmann-json" PKG_VERSION="3.11.2" PKG_SHA256="d69f9deb6a75e2580465c6c4c5111b89c4dc2fa94e3a85fcd2ffcd9a143d9273" PKG_LICENSE="MIT" PKG_SITE="https://nlohmann.github.io/json/" PKG_URL="https://github.com/nlohmann/json/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="JSON for Modern C++" # Meson does not provide nlohmann_json*.cmake files which some projects rely on PKG_TOOLCHAIN="cmake" PKG_CMAKE_OPTS_TARGET="-DJSON_BuildTests=OFF" ================================================ FILE: packages/textproc/pugixml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pugixml" PKG_VERSION="1.13" PKG_SHA256="5c5ad5d7caeb791420408042a7d88c2c6180781bf218feca259fd9d840a888e1" PKG_LICENSE="MIT" PKG_SITE="https://pugixml.org/" PKG_URL="https://github.com/zeux/pugixml/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Light-weight, simple and fast XML parser for C++ with XPath support." PKG_BUILD_FLAGS="+pic" ================================================ FILE: packages/textproc/tinyxml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="tinyxml" PKG_VERSION="2.6.2" PKG_SHA256="8164c9ad48b9028667768a584d62f7760cfbfb90d0dd6214ad174403058da10c" PKG_LICENSE="OSS" PKG_SITE="http://www.grinninglizard.com/tinyxml/" PKG_URL="http://mirrors.xbmc.org/build-deps/sources/${PKG_NAME}-${PKG_VERSION}_2.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="TinyXML is a simple, small, C++ XML parser." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-static --disable-shared --with-pic" post_makeinstall_target() { rm -rf ${INSTALL}/usr } ================================================ FILE: packages/textproc/tinyxml2/package.mk ================================================ # 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="tinyxml2" PKG_VERSION="9.0.0" PKG_SHA256="cc2f1417c308b1f6acc54f88eb70771a0bf65f76282ce5c40e54cfe52952702c" PKG_LICENSE="zlib" PKG_SITE="http://www.grinninglizard.com/tinyxml2/index.html" PKG_URL="https://github.com/leethomason/tinyxml2/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="TinyXML2 is a simple, small, C++ XML parser." PKG_MESON_OPTS_TARGET="-Ddefault_library=static \ -Dtests=false" ================================================ FILE: packages/textproc/xmlstarlet/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="xmlstarlet" PKG_VERSION="1.6.1" PKG_SHA256="15d838c4f3375332fd95554619179b69e4ec91418a3a5296e7c631b7ed19e7ca" PKG_LICENSE="MIT" PKG_SITE="http://xmlstar.sourceforge.net" PKG_URL="http://netcologne.dl.sourceforge.net/project/xmlstar/${PKG_NAME}/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="libxml2:host libxslt:host" PKG_DEPENDS_TARGET="toolchain libxml2 libxslt" PKG_LONGDESC="XMLStarlet is a command-line XML utility which allows the modification and validation of XML documents." PKG_CONFIGURE_OPTS_HOST=" ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes \ --enable-static-libs \ LIBXML_CONFIG=${TOOLCHAIN}/bin/xml2-config \ LIBXSLT_CONFIG=${TOOLCHAIN}/bin/xslt-config \ --with-libxml-include-prefix=${TOOLCHAIN}/include/libxml2 \ --with-libxml-libs-prefix=${TOOLCHAIN}/lib \ --with-libxslt-include-prefix=${TOOLCHAIN}/include \ --with-libxslt-libs-prefix=${TOOLCHAIN}/lib" PKG_CONFIGURE_OPTS_TARGET="ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes \ --enable-static-libs \ LIBXML_CONFIG=${SYSROOT_PREFIX}/usr/bin/xml2-config \ LIBXSLT_CONFIG=${SYSROOT_PREFIX}/usr/bin/xslt-config \ --with-libxml-include-prefix=${SYSROOT_PREFIX}/usr/include/libxml2 \ --with-libxml-libs-prefix=${SYSROOT_PREFIX}/usr/lib \ --with-libxslt-include-prefix=${SYSROOT_PREFIX}/usr/include \ --with-libxslt-libs-prefix=${SYSROOT_PREFIX}/usr/lib" post_makeinstall_host() { ln -sf xml ${TOOLCHAIN}/bin/xmlstarlet } post_makeinstall_target() { ln -sf xml ${INSTALL}/usr/bin/xmlstarlet } ================================================ FILE: packages/textproc/xmlstarlet/patches/xmlstarlet-0001-usage2c.awk-fix-wrong-basename-regexp.patch ================================================ Upstream-Status: Submitted [sourceforge] From 75d789d0ea9716c9a9ae72f42a2fcfa907cf4a12 Mon Sep 17 00:00:00 2001 From: Matthieu Crapet <mcrapet@gmail.com> Date: Mon, 30 Jun 2014 13:52:25 +0200 Subject: [PATCH] usage2c.awk: fix wrong basename regexp Previously not matching with filename argument with absolute path. Signed-off-by: Matthieu Crapet <mcrapet@gmail.com> --- usage2c.awk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/usage2c.awk b/usage2c.awk index 94b897a..9aea212 100755 --- a/usage2c.awk +++ b/usage2c.awk @@ -6,13 +6,13 @@ BEGIN { } # text in src/foo-bar.txt results in -# static const char foo_text[] = { +# static const char foo_bar[] = { # 't', 'h', 'e', ' ', 't', 'e', 'x', 't', ... # } length(command_name) == 0 { command_name = FILENAME; sub(/\.txt$/, "", command_name); - sub(/^([^\/]+\/)*/, "", command_name); + sub(/^.*\//, "", command_name); gsub(/-/, "_", command_name); printf("static const char %s[] = {\n", command_name); progs = 0; -- 2.0.0 ================================================ FILE: packages/tools/amlogic-boot-fip/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="amlogic-boot-fip" PKG_LICENSE="nonfree" PKG_VERSION="e96b6a694380ff07d5a9e4be644ffe254bd18512" PKG_SHA256="2cc06bc7d5647fd8c0025181fa42c4a8ef0ed16b918a1fa2060ea83c22e47b20" PKG_SITE="https://github.com/LibreELEC/amlogic-boot-fip" PKG_URL="https://github.com/LibreELEC/amlogic-boot-fip/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="Firmware Image Package (FIP) sources used to sign Amlogic u-boot binaries in LibreELEC images" PKG_TOOLCHAIN="manual" PKG_STAMP="${UBOOT_SYSTEM}" ================================================ FILE: packages/tools/atf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC PKG_NAME="atf" PKG_VERSION="2.8" PKG_SHA256="42256fa354f32b09972e72e0570a0f73698785927f93163b1d1308c485fcb4a6" PKG_ARCH="arm aarch64" PKG_LICENSE="BSD-3c" PKG_SITE="https://github.com/ARM-software/arm-trusted-firmware" PKG_URL="https://github.com/ARM-software/arm-trusted-firmware/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="ARM Trusted Firmware is a reference implementation of secure world software, including a Secure Monitor executing at Exception Level 3 and various Arm interface standards." PKG_TOOLCHAIN="manual" [ -n "${KERNEL_TOOLCHAIN}" ] && PKG_DEPENDS_TARGET+=" gcc-${KERNEL_TOOLCHAIN}:host" if [ "${ATF_PLATFORM}" = "rk3399" ]; then PKG_DEPENDS_TARGET+=" gcc-arm-none-eabi:host" export M0_CROSS_COMPILE="${TOOLCHAIN}/bin/arm-none-eabi-" fi make_target() { if [ "${ATF_PLATFORM}" = "imx8mq" ]; then CROSS_COMPILE="${TARGET_KERNEL_PREFIX}" LDFLAGS="--no-warn-rwx-segments" CFLAGS="--param=min-pagesize=0" make PLAT=${ATF_PLATFORM} bl31 else CROSS_COMPILE="${TARGET_KERNEL_PREFIX}" LDFLAGS="--no-warn-rwx-segments" CFLAGS="" make PLAT=${ATF_PLATFORM} bl31 fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/share/bootloader cp -a build/${ATF_PLATFORM}/release/${ATF_BL31_BINARY:-bl31.bin} ${INSTALL}/usr/share/bootloader } ================================================ FILE: packages/tools/bcm2835-bootloader/files/config.txt ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) ################################################################################ # Bootloader configuration # config.txt version v1 (do not remove or change this line!) ################################################################################ # For more options and information see # http://rpf.io/configtxt ################################################################################ # Default GPU memory split, 76MB are needed for H264 decoder gpu_mem=76 # Don't send initial active source message. # Avoids bringing CEC (enabled TV) out of standby and channel switch when # rebooting. hdmi_ignore_cec_init=1 [all] ################################################################################ # Use distroconfig-composite.txt instead of distroconfig.txt to enable # composite video output. # The composite video mode needs to be configured in cmdline.txt: # For PAL add: video=Composite-1:720x576@50ie # For NTSC add: video=Composite-1:720x480@60ie ################################################################################ include distroconfig.txt #include distroconfig-composite.txt # uncomment to enable analog audio output #dtparam=audio=on #audio_pwm_mode=1 # uncomment to enable infrared remote receiver connected to GPIO 18 #dtoverlay=gpio-ir,gpio_pin=18 ================================================ FILE: packages/tools/bcm2835-bootloader/files/distroconfig-composite.txt ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team LibreELEC (https://libreelec.tv) # WARNING: DO NOT EDIT THIS FILE - IT WILL BE OVERWRITTEN WHEN UPGRADING! display_auto_detect=1 dtoverlay=vc4-kms-v3d,composite=1 dtoverlay= disable_overscan=1 disable_fw_kms_setup=1 ================================================ FILE: packages/tools/bcm2835-bootloader/files/distroconfig.txt ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) # WARNING: DO NOT EDIT THIS FILE - IT WILL BE OVERWRITTEN WHEN UPGRADING! display_auto_detect=1 dtoverlay=vc4-kms-v3d dtoverlay= disable_overscan=1 disable_fw_kms_setup=1 ================================================ FILE: packages/tools/bcm2835-bootloader/files/update.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) [ -z "$BOOT_ROOT" ] && BOOT_ROOT="/flash" [ -z "$SYSTEM_ROOT" ] && SYSTEM_ROOT="" MIN_CONFIG_TXT_VERSION=1 # mount $BOOT_ROOT r/w mount -o remount,rw $BOOT_ROOT # Something has gone horribly wrong... clean up [ -s $BOOT_ROOT/overlays ] || rm -fr $BOOT_ROOT/overlays $BOOT_ROOT/FSCK*.REC # update bootloader files cp -p $SYSTEM_ROOT/usr/share/bootloader/LICENCE* $BOOT_ROOT for f in bootcode.bin fixup.dat start.elf ; do if [ -f "${SYSTEM_ROOT}/usr/share/bootloader/$f" ]; then cp -p "${SYSTEM_ROOT}/usr/share/bootloader/$f" "${BOOT_ROOT}" fi done rm -f $BOOT_ROOT/bcm283*.dtb # cleanup excess dtb's used by upstream kernels (ie. not LE) cp -p $SYSTEM_ROOT/usr/share/bootloader/*.dtb $BOOT_ROOT cp -pR $SYSTEM_ROOT/usr/share/bootloader/overlays $BOOT_ROOT # cleanup unneeded files rm -rf $BOOT_ROOT/loader.bin rm -rf $BOOT_ROOT/fixup_x.dat rm -rf $BOOT_ROOT/start_x.elf # some config.txt magic if [ ! -f $BOOT_ROOT/config.txt ]; then cp -p $SYSTEM_ROOT/usr/share/bootloader/config.txt $BOOT_ROOT else CONFIG_TXT_VERSION=$( \ grep "^# config.txt version v[0-9]\+" $BOOT_ROOT/config.txt | \ head -n 1 | \ sed 's/^# config.txt version v\([0-9]\+\) .*$/\1/' \ ) if [ ${CONFIG_TXT_VERSION:-0} -lt $MIN_CONFIG_TXT_VERSION ]; then mv -f $BOOT_ROOT/config.txt $BOOT_ROOT/config.txt.old cp -p $SYSTEM_ROOT/usr/share/bootloader/config.txt $BOOT_ROOT/config.txt echo "WARNING incompatible config.txt detected, replacing with default." echo "Previous config.txt has been moved to config.txt.old" fi fi # Add distro config files for distro in "$SYSTEM_ROOT/usr/share/bootloader/distroconfig"*.txt ; do if [ -f "${distro}" ]; then cp -p "${distro}" $BOOT_ROOT fi done # mount $BOOT_ROOT r/o sync mount -o remount,ro $BOOT_ROOT ================================================ FILE: packages/tools/bcm2835-bootloader/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="bcm2835-bootloader" PKG_VERSION="fdb9eafae4b83e553593937eae8e77b0193903c3" PKG_SHA256="ce45b07afce3279f9d31fe12008c5250de4da5491bd9ced2de2f2ebb563aea80" PKG_ARCH="arm aarch64" PKG_LICENSE="nonfree" PKG_SITE="http://www.broadcom.com" PKG_URL="${DISTRO_SRC}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain linux bcmstat" PKG_LONGDESC="bcm2835-bootloader: Tool to create a bootable kernel for RaspberryPi" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/share/bootloader cp -PRv LICENCE* ${INSTALL}/usr/share/bootloader case "${DEVICE}" in RPi4) cp -PRv fixup4x.dat ${INSTALL}/usr/share/bootloader/fixup.dat cp -PRv start4x.elf ${INSTALL}/usr/share/bootloader/start.elf ;; RPi5) ;; *) cp -PRv bootcode.bin ${INSTALL}/usr/share/bootloader cp -PRv fixup_x.dat ${INSTALL}/usr/share/bootloader/fixup.dat cp -PRv start_x.elf ${INSTALL}/usr/share/bootloader/start.elf ;; esac find_file_path bootloader/update.sh ${PKG_DIR}/files/update.sh && cp -PRv ${FOUND_PATH} ${INSTALL}/usr/share/bootloader find_file_path bootloader/canupdate.sh && cp -PRv ${FOUND_PATH} ${INSTALL}/usr/share/bootloader find_file_path config/distroconfig.txt ${PKG_DIR}/files/distroconfig.txt && cp -PRv ${FOUND_PATH} ${INSTALL}/usr/share/bootloader find_file_path config/distroconfig-composite.txt ${PKG_DIR}/files/distroconfig-composite.txt && cp -PRv ${FOUND_PATH} ${INSTALL}/usr/share/bootloader find_file_path config/config.txt ${PKG_DIR}/files/config.txt && cp -PRv ${FOUND_PATH} ${INSTALL}/usr/share/bootloader } ================================================ FILE: packages/tools/bcm2835-bootloader/release ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) mkdir -p $RELEASE_DIR/3rdparty/bootloader cp -PR $INSTALL/usr/share/bootloader/LICENCE* $RELEASE_DIR/3rdparty/bootloader/ for f in bootcode.bin fixup.dat start.elf ; do if [ -f "${INSTALL}/usr/share/bootloader/$f" ]; then cp -PR "${INSTALL}/usr/share/bootloader/$f" "${RELEASE_DIR}/3rdparty/bootloader/" fi done cp -PR $INSTALL/usr/share/bootloader/*.dtb $RELEASE_DIR/3rdparty/bootloader/ cp -PR $INSTALL/usr/share/bootloader/overlays $RELEASE_DIR/3rdparty/bootloader/ if [ -f $INSTALL/usr/share/bootloader/config.txt ]; then cp -PR $INSTALL/usr/share/bootloader/config.txt $RELEASE_DIR/3rdparty/bootloader/ fi for distro in "$INSTALL/usr/share/bootloader/distroconfig"*.txt ; do if [ -f "${distro}" ]; then cp -PR "${distro}" $RELEASE_DIR/3rdparty/bootloader/ fi done ================================================ FILE: packages/tools/bcmstat/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="bcmstat" PKG_VERSION="0.5.5" PKG_SHA256="faf21907c183ec45ca5a7737a220d3275d24a7d8a387344ed1562849b2d67f27" PKG_LICENSE="GPL" PKG_SITE="https://github.com/MilhouseVH/bcmstat" PKG_URL="https://github.com/MilhouseVH/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="Raspberry Pi monitoring script" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -PRv bcmstat.sh ${INSTALL}/usr/bin chmod +x ${INSTALL}/usr/bin/* } ================================================ FILE: packages/tools/crust/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="crust" PKG_VERSION="2e5f355790b5f9cd941f939280adda6b4b6581c0" # 2021-11-05 PKG_SHA256="6e449dfc870141498082d399d5712fa53bb9e6341856e0a75fd9aaad9e15c38c" PKG_ARCH="arm aarch64" PKG_LICENSE="BSD-3c" PKG_SITE="https://github.com/crust-firmware/crust" PKG_URL="https://github.com/crust-firmware/crust/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="Crust: Libre SCP firmware for Allwinner sunxi SoCs" PKG_TOOLCHAIN="manual" PKG_STAMP="${UBOOT_SYSTEM}" if [ ! -z "${UBOOT_SYSTEM}" ]; then PKG_DEPENDS_TARGET="gcc-or1k:host" fi pre_configure_target() { export CROSS_COMPILE="or1k-none-elf-" } make_target() { if [ -z "${UBOOT_SYSTEM}" ]; then echo "crust is only built when building an image" exit 0 fi CRUST_CONFIG=$(${ROOT}/${SCRIPTS}/uboot_helper ${PROJECT} ${DEVICE} ${UBOOT_SYSTEM} crust_config) if [ -z "${CRUST_CONFIG}" ]; then echo "crust_config must be set to build crust firmware" echo "see './scripts/uboot_helper' for more information" exit 0 fi make distclean if [ "${BUILD_WITH_DEBUG}" = "yes" ]; then echo "CONFIG_DEBUG_LOG=y" >> configs/${CRUST_CONFIG} else echo "CONFIG_SERIAL=n" >> configs/${CRUST_CONFIG} fi # Boards with a PMIC need to disable CONFIG_PMIC_SHUTDOWN to get CIR wakeup from suspend echo "CONFIG_PMIC_SHUTDOWN=n" >> configs/${CRUST_CONFIG} echo "CONFIG_CIR=y" >> configs/${CRUST_CONFIG} echo "CONFIG_CEC=y" >> configs/${CRUST_CONFIG} make ${CRUST_CONFIG} BUILDCC=host-gcc make scp } makeinstall_target() { mkdir -p ${INSTALL}/usr/share/bootloader cp -a build/scp/scp.bin ${INSTALL}/usr/share/bootloader } ================================================ FILE: packages/tools/crust/patches/fix-binutils-2-39.patch ================================================ --- a/Makefile 2022-08-09 08:48:15.390323604 +0000 +++ b/Makefile 2022-08-09 08:49:45.623098723 +0000 @@ -84,7 +84,8 @@ -Wl,--fatal-warnings \ -Wl,--gc-sections \ -Wl,--no-dynamic-linker \ - -Wl,--no-undefined + -Wl,--no-undefined \ + -Wl,--no-warn-rwx-segments ############################################################################### ================================================ FILE: packages/tools/crust/patches/fix-stack.patch ================================================ --- a/Makefile 2021-12-15 20:13:00.978559336 +0000 +++ b/Makefile 2021-12-15 20:18:06.344712669 +0000 @@ -25,6 +25,7 @@ -fdata-sections \ -ffunction-sections \ -fno-builtin \ + -fno-stack-protector \ -fno-common \ -fvar-tracking-assignments \ -g$(if $(CONFIG_DEBUG_INFO),gdb,0) \ ================================================ FILE: packages/tools/dt-overlays/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="dt-overlays" PKG_VERSION="4352d87db6e85d285673359e80cce87d5e025c64" PKG_SHA256="754a0c37a41f8e5d9d179eb1df40b84eb48c0a505a37e39fed5f1ceb35e8e120" PKG_LICENSE="GPLv2+ or MIT" PKG_SITE="https://github.com/LibreELEC/dt-overlays" PKG_URL="https://github.com/LibreELEC/dt-overlays/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="dtc:host" PKG_LONGDESC="The Device Tree Overlays" makeinstall_target() { mkdir -p ${INSTALL}/usr/share/bootloader/overlays cp -p overlays/*/*.dtbo ${INSTALL}/usr/share/bootloader/overlays } ================================================ FILE: packages/tools/dtc/package.mk ================================================ # 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) PKG_NAME="dtc" PKG_VERSION="1.6.1" PKG_SHA256="264d355e2e547a4964d55b83b113f89be1aea5e61dbe0547ab798d0fde2be180" PKG_LICENSE="GPL" PKG_SITE="https://git.kernel.org/pub/scm/utils/dtc/dtc.git/" PKG_URL="https://git.kernel.org/pub/scm/utils/dtc/dtc.git/snapshot/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host zlib:host" PKG_DEPENDS_TARGET="toolchain zlib" PKG_LONGDESC="The Device Tree Compiler" PKG_TOOLCHAIN="make" PKG_MAKE_OPTS_TARGET="dtc fdtput fdtget fdtdump libfdt" PKG_MAKE_OPTS_HOST="dtc libfdt" pre_configure_host() { export LDLIBS_dtc="-lz" export EXTRA_CFLAGS="-I${TOOLCHAIN}/include" } pre_make_host() { mkdir -p ${PKG_BUILD}/.${HOST_NAME} cp -a ${PKG_BUILD}/* ${PKG_BUILD}/.${HOST_NAME} cd ${PKG_BUILD}/.${HOST_NAME} } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp -P ${PKG_BUILD}/.${HOST_NAME}/dtc ${TOOLCHAIN}/bin mkdir -p ${TOOLCHAIN}/lib cp -P ${PKG_BUILD}/.${HOST_NAME}/libfdt/{libfdt.so,libfdt.so.1} ${TOOLCHAIN}/lib } pre_make_target() { mkdir -p ${PKG_BUILD}/.${TARGET_NAME} cp -a ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME} cd ${PKG_BUILD}/.${TARGET_NAME} } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -P ${PKG_BUILD}/.${TARGET_NAME}/dtc ${INSTALL}/usr/bin cp -P ${PKG_BUILD}/.${TARGET_NAME}/fdtput ${INSTALL}/usr/bin/ cp -P ${PKG_BUILD}/.${TARGET_NAME}/fdtget ${INSTALL}/usr/bin cp -P ${PKG_BUILD}/.${TARGET_NAME}/fdtdump ${INSTALL}/usr/bin/ mkdir -p ${INSTALL}/usr/{include,lib} cp -P ${PKG_BUILD}/.${TARGET_NAME}/libfdt/libfdt.a ${SYSROOT_PREFIX}/usr/lib cp -P ${PKG_BUILD}/.${TARGET_NAME}/libfdt/fdt.h ${SYSROOT_PREFIX}/usr/include cp -P ${PKG_BUILD}/.${TARGET_NAME}/libfdt/libfdt.h ${SYSROOT_PREFIX}/usr/include cp -P ${PKG_BUILD}/.${TARGET_NAME}/libfdt/libfdt_env.h ${SYSROOT_PREFIX}/usr/include } ================================================ FILE: packages/tools/dtc/patches/dtc-0001-libfdt-soname-version.patch ================================================ diff --git a/libfdt/Makefile.libfdt b/libfdt/Makefile.libfdt index e546397..dd71746 100644 --- a/libfdt/Makefile.libfdt +++ b/libfdt/Makefile.libfdt @@ -10,7 +10,7 @@ LIBFDT_VERSION = version.lds LIBFDT_SRCS = fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c fdt_empty_tree.c \ fdt_addresses.c fdt_overlay.c fdt_check.c LIBFDT_OBJS = $(LIBFDT_SRCS:%.c=%.o) -LIBFDT_LIB = libfdt-$(DTC_VERSION).$(SHAREDLIB_EXT) +LIBFDT_LIB = libfdt.$(SHAREDLIB_EXT) libfdt_clean: @$(VECHO) CLEAN "(libfdt)" ================================================ FILE: packages/tools/dtc/patches/dtc-0002-link-with-libfdt-archive.patch ================================================ diff --git a/Makefile b/Makefile index f02aa19..dcb728d 100644 --- a/Makefile +++ b/Makefile @@ -258,11 +258,11 @@ convert-dtsv0: $(CONVERT_OBJS) fdtdump: $(FDTDUMP_OBJS) -fdtget: $(FDTGET_OBJS) $(LIBFDT_lib) +fdtget: $(FDTGET_OBJS) $(LIBFDT_archive) -fdtput: $(FDTPUT_OBJS) $(LIBFDT_lib) +fdtput: $(FDTPUT_OBJS) $(LIBFDT_archive) -fdtoverlay: $(FDTOVERLAY_OBJS) $(LIBFDT_lib) +fdtoverlay: $(FDTOVERLAY_OBJS) $(LIBFDT_archive) dist: git archive --format=tar --prefix=dtc-$(dtc_version)/ HEAD \ ================================================ FILE: packages/tools/dtc/patches/dtc-0003-Add-Amlogic-multi-dtb-and-add-gzipped-dtb-support.patch ================================================ From 278b492a6e6485758ed7146f21ba8f64d3ac06bc Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Sat, 18 Jul 2020 17:31:58 +0200 Subject: [PATCH] Add Amlogic multi-dtb and add gzipped dtb support fdtget/fdtput: by the parameter '-a' or '--amlogic-dt-id' the amlogic-dt-id can be forced fdtget: by the parameter '-s' or '--scan-multi-dtb' the multi-dtb can be scanned for amlogic-dt-ids --- Makefile | 4 +- Makefile.dtc | 1 + Makefile.utils | 3 + fdtget.c | 111 ++++++++++++++++++++++++++- fdtput.c | 201 ++++++++++++++++++++++++++++++++++++++++++++++++- gzip.c | 199 ++++++++++++++++++++++++++++++++++++++++++++++++ gzip.h | 49 ++++++++++++ util.c | 129 ++++++++++++++++++++++++++++++- util.h | 50 ++++++++++++ 9 files changed, 738 insertions(+), 9 deletions(-) create mode 100644 gzip.c create mode 100644 gzip.h diff --git a/Makefile b/Makefile index dcb728d..ad5585f 100644 --- a/Makefile +++ b/Makefile @@ -21,9 +21,9 @@ CONFIG_LOCALVERSION = ASSUME_MASK ?= 0 CPPFLAGS = -I libfdt -I . -DFDT_ASSUME_MASK=$(ASSUME_MASK) -WARNINGS = -Wall -Wpointer-arith -Wcast-qual -Wnested-externs \ +WARNINGS = -Wall -Wnested-externs \ -Wstrict-prototypes -Wmissing-prototypes -Wredundant-decls -Wshadow -CFLAGS = -g -Os $(SHAREDLIB_CFLAGS) -Werror $(WARNINGS) $(EXTRA_CFLAGS) +CFLAGS = -g -Os $(SHAREDLIB_CFLAGS) -Werror $(WARNINGS) $(EXTRA_CFLAGS) -lz BISON = bison LEX = flex diff --git a/Makefile.dtc b/Makefile.dtc index 9c467b0..b1efc0a 100644 --- a/Makefile.dtc +++ b/Makefile.dtc @@ -13,6 +13,7 @@ DTC_SRCS = \ livetree.c \ srcpos.c \ treesource.c \ + gzip.c \ util.c ifneq ($(NO_YAML),1) diff --git a/Makefile.utils b/Makefile.utils index 9436b34..fbd7e7f 100644 --- a/Makefile.utils +++ b/Makefile.utils @@ -6,6 +6,7 @@ FDTDUMP_SRCS = \ fdtdump.c \ + gzip.c \ util.c FDTDUMP_OBJS = $(FDTDUMP_SRCS:%.c=%.o) @@ -13,6 +14,7 @@ FDTDUMP_OBJS = $(FDTDUMP_SRCS:%.c=%.o) FDTGET_SRCS = \ fdtget.c \ + gzip.c \ util.c FDTGET_OBJS = $(FDTGET_SRCS:%.c=%.o) @@ -20,6 +22,7 @@ FDTGET_OBJS = $(FDTGET_SRCS:%.c=%.o) FDTPUT_SRCS = \ fdtput.c \ + gzip.c \ util.c FDTPUT_OBJS = $(FDTPUT_SRCS:%.c=%.o) diff --git a/fdtget.c b/fdtget.c index 777582e..7c50d44 100644 --- a/fdtget.c +++ b/fdtget.c @@ -15,6 +15,8 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <errno.h> +#include <sys/stat.h> #include <libfdt.h> @@ -24,6 +26,7 @@ enum display_mode { MODE_SHOW_VALUE, /* show values for node properties */ MODE_LIST_PROPS, /* list the properties for a node */ MODE_LIST_SUBNODES, /* list the subnodes of a node */ + MODE_SCAN_MULTIDTB, /* scan and list all single dtbs in a multidtb */ }; /* Holds information which controls our output and options */ @@ -32,6 +35,7 @@ struct display_info { int size; /* data size (1/2/4) */ enum display_mode mode; /* display mode that we are using */ const char *default_val; /* default value if node/property not found */ + char *amlogic_dt_id; /* force amlogic-dt-it for Amlogic multi dtb */ }; static void report_error(const char *where, int err) @@ -256,13 +260,99 @@ static int do_fdtget(struct display_info *disp, const char *filename, char *blob; const char *prop; int i, node; + struct stat sb; + uint32_t fdt_addr = 0; + char amlogic_dt_id[256] = {0}; blob = utilfdt_read(filename, NULL); if (!blob) return -1; + if (*(uint32_t *)blob == AML_DT_HEADER_MAGIC) { + uint32_t dt_total = 0; + uint32_t tmp_fdt_addr = 0; + uint32_t aml_dtb_offset_offset; + uint32_t aml_dtb_header_size; + + if (disp->mode == MODE_SCAN_MULTIDTB) { + utilfdt_get_multidtb_data(blob, &dt_total, &aml_dtb_header_size, &aml_dtb_offset_offset); + // list all dtbs in multidtb + for (i = 0; i < dt_total; i++) { + tmp_fdt_addr = *(uint32_t *)(blob + AML_DT_FIRST_DTB_OFFSET + i * aml_dtb_header_size + aml_dtb_offset_offset); + + if (*(uint32_t *)(blob + tmp_fdt_addr) == DT_HEADER_MAGIC) { + int len; + const struct fdt_property *dt_id = NULL; + node = fdt_path_offset(blob + tmp_fdt_addr, "/"); + if (node < 0) + continue; + + dt_id = fdt_getprop(blob + tmp_fdt_addr, node, "amlogic-dt-id", &len); + if (dt_id < 0) + continue; + + fprintf(stderr, "%d/%d: Found dtb in multi-dtb 'amlogic-dt-id': %s\n", i + 1, dt_total, (const char *)dt_id); + } + } + free(blob); + return 0; + } + + /* get correct dtb in Amlogic multi-dtb by amlogic-dt-id */ + if (disp->amlogic_dt_id || stat(amlogic_dt_id_path, &sb) == 0) { + if (utilfdt_get_amlogic_dt_id(disp->amlogic_dt_id, amlogic_dt_id) < 0) { + free(blob); + return -1; + } + + utilfdt_get_multidtb_data(blob, &dt_total, &aml_dtb_header_size, &aml_dtb_offset_offset); + + // check all dtbs in multidtb + for (i = 0; i < dt_total; i++) { + tmp_fdt_addr = *(uint32_t *)(blob + AML_DT_FIRST_DTB_OFFSET + i * aml_dtb_header_size + aml_dtb_offset_offset); + + if (*(uint32_t *)(blob + tmp_fdt_addr) == DT_HEADER_MAGIC) { + int len; + const struct fdt_property *dt_id = NULL; + node = fdt_path_offset(blob + tmp_fdt_addr, "/"); + if (node < 0) + continue; + + dt_id = fdt_getprop(blob + tmp_fdt_addr, node, "amlogic-dt-id", &len); + if (dt_id < 0) + continue; + + if (len <= strlen(amlogic_dt_id)) + continue; + + // check if correct dtb in multidtb got found + if (!strncmp((const char *)dt_id, amlogic_dt_id, strlen(amlogic_dt_id))) { + fdt_addr = tmp_fdt_addr; + break; + } + } + } + + if (fdt_addr == 0) { + fprintf(stderr, "No matching amlogic-dt-id found for '%s': %d\n", amlogic_dt_id, -ENOENT); + free(blob); + return -1; + } + } + else { + fprintf(stderr, "Amlogic-dt-id needed for Amlogic multi-dtb: %d\n", -ENOENT); + free(blob); + return -1; + } + } + else if (disp->mode == MODE_SCAN_MULTIDTB) { + fprintf(stderr, "File is not a Amlogic multi-dtb file!\n"); + free(blob); + return -1; + } + for (i = 0; i + args_per_step <= arg_count; i += args_per_step) { - node = fdt_path_offset(blob, arg[i]); + node = fdt_path_offset(blob + fdt_addr, arg[i]); if (node < 0) { if (disp->default_val) { puts(disp->default_val); @@ -275,7 +365,7 @@ static int do_fdtget(struct display_info *disp, const char *filename, } prop = args_per_step == 1 ? NULL : arg[i + 1]; - if (show_data_for_item(blob, disp, node, prop)) { + if (show_data_for_item(blob + fdt_addr, disp, node, prop)) { free(blob); return -1; } @@ -294,12 +384,14 @@ static const char usage_synopsis[] = "\n" "Each value is printed on a new line.\n" USAGE_TYPE_MSG; -static const char usage_short_opts[] = "t:pld:" USAGE_COMMON_SHORT_OPTS; +static const char usage_short_opts[] = "t:pld:a:s" USAGE_COMMON_SHORT_OPTS; static struct option const usage_long_opts[] = { {"type", a_argument, NULL, 't'}, {"properties", no_argument, NULL, 'p'}, {"list", no_argument, NULL, 'l'}, {"default", a_argument, NULL, 'd'}, + {"amlogic-dt-id", a_argument, NULL, 'a'}, + {"scan-multi-dtb", no_argument, NULL, 's'}, USAGE_COMMON_LONG_OPTS, }; static const char * const usage_opts_help[] = { @@ -307,6 +399,8 @@ static const char * const usage_opts_help[] = { "List properties for each node", "List subnodes for each node", "Default value to display when the property is missing", + "Forced amlogic-dt-id to be used for multi-dtb", + "Scan and list all single dtb amlogic-dt-ids in multi-dtb", USAGE_COMMON_OPTS_HELP }; @@ -331,6 +425,15 @@ int main(int argc, char *argv[]) usage("invalid type string"); break; + case 'a': + disp.amlogic_dt_id = optarg; + break; + + case 's': + disp.mode = MODE_SCAN_MULTIDTB; + args_per_step = 1; + break; + case 'p': disp.mode = MODE_LIST_PROPS; args_per_step = 1; @@ -356,7 +459,7 @@ int main(int argc, char *argv[]) argc -= optind; /* Allow no arguments, and silently succeed */ - if (!argc) + if (!argc && (disp.mode != MODE_SCAN_MULTIDTB)) return 0; /* Check for node, property arguments */ diff --git a/fdtput.c b/fdtput.c index 428745a..bd907b7 100644 --- a/fdtput.c +++ b/fdtput.c @@ -9,6 +9,9 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <errno.h> +#include <sys/stat.h> +#include <byteswap.h> #include <libfdt.h> @@ -28,6 +31,7 @@ struct display_info { int size; /* data size (1/2/4) */ int verbose; /* verbose output */ int auto_path; /* automatically create all path components */ + char *amlogic_dt_id; /* force amlogic-dt-it for Amlogic multi dtb */ }; @@ -311,18 +315,185 @@ static int delete_node(char *blob, const char *node_name) return 0; } +static void padSpaces(uint8_t *s, int sz) +{ + --sz; + while ( sz >= 0 && s[sz] == 0 ) + { + s[sz] = 0x20; + --sz; + } +} + +static void create_multidtb(char **blob, uint32_t dt_total, uint32_t page_size, char **fdts) +{ + uint32_t totalsize = page_size; + char *multidtb = xmalloc(totalsize); + uint32_t fdt_size = page_size; + uint32_t version = AML_DT_VERSION; + uint32_t offset = 0; + int i, len; + uint32_t blob_old_size; + + if (*(const uint32_t *)(*blob) == AML_DT_HEADER_MAGIC) + blob_old_size = utilfdt_get_multidtb_size(*blob); + else + blob_old_size = fdt_totalsize(*blob); + + memset(multidtb, 0, totalsize); + memcpy(multidtb + offset, AML_DT_MAGIC, sizeof(uint32_t)); + offset += sizeof(uint32_t); + memcpy(multidtb + offset, &version, sizeof(uint32_t)); + offset += sizeof(uint32_t); + memcpy(multidtb + offset, &dt_total, sizeof(uint32_t)); + offset += sizeof(uint32_t); + + + for (i = 0; i < dt_total; i++) { + int tmp_node; + const struct fdt_property *dt_id = NULL; + + if (!fdts[i]) + continue; + + tmp_node = fdt_path_offset(fdts[i], "/"); + if (tmp_node >= 0) + dt_id = fdt_getprop(fdts[i], tmp_node, "amlogic-dt-id", &len); + + if (dt_id) { + uint8_t data[3][INFO_ENTRY_SIZE + 1] = { {0} }; + if (sscanf((const char*)dt_id, "%" INFO_ENTRY_SIZE_S "[^_]_%" INFO_ENTRY_SIZE_S "[^_]_%" INFO_ENTRY_SIZE_S "[^_\"]\"", + data[0], data[1], data[2]) == 3) { + int a; + for (a = 0; a < 3; a++){ + int b; + padSpaces(data[a], INFO_ENTRY_SIZE); + for (b = 0; b < INFO_ENTRY_SIZE/sizeof(uint32_t); ++b) { + uint32_t val = __bswap_32(*(uint32_t *)(&data[a][b * sizeof(uint32_t)])); + memcpy(multidtb + offset, &val, sizeof(uint32_t)); + offset += sizeof(uint32_t); + } + } + } + else + continue; + + memcpy(multidtb + offset, &totalsize, sizeof(uint32_t)); + offset += sizeof(uint32_t); + fdt_size = fdt_totalsize(fdts[i]); + fdt_size += page_size - (fdt_size % page_size); + memcpy(multidtb + offset, &fdt_size, sizeof(uint32_t)); + offset += sizeof(uint32_t); + + totalsize += fdt_size; + multidtb = xrealloc(multidtb, totalsize); + memset(multidtb + (totalsize - fdt_size), 0, fdt_size); + memcpy(multidtb + (totalsize - fdt_size), fdts[i], fdt_totalsize(fdts[i])); + } + } + + if (blob_old_size < totalsize) + *blob = xrealloc(*blob, totalsize); + + memcpy(*blob, multidtb, totalsize); + free(multidtb); +} + static int do_fdtput(struct display_info *disp, const char *filename, char **arg, int arg_count) { char *value = NULL; char *blob; char *node; - int len, ret = 0; + int i, len, ret = 0; + struct stat sb; + uint32_t dt_total = 0; + uint32_t page_size = 0; + uint32_t fdt_addr = 0; + int fdt_count = 0; + char **fdts = NULL; + char *fdt; + char amlogic_dt_id[256] = {0}; blob = utilfdt_read(filename, NULL); if (!blob) return -1; + if (*(uint32_t *)blob == AML_DT_HEADER_MAGIC) { + /* get correct dtb in Amlogic multi-dtb by amlogic-dt-id */ + if (disp->amlogic_dt_id || stat(amlogic_dt_id_path, &sb) == 0) { + uint32_t tmp_fdt_addr = 0; + uint32_t tmp_fdt_size = 0; + uint32_t aml_dtb_offset_offset; + uint32_t aml_dtb_header_size; + + if (utilfdt_get_amlogic_dt_id(disp->amlogic_dt_id, amlogic_dt_id) < 0) { + free(blob); + return -1; + } + + utilfdt_get_multidtb_data(blob, &dt_total, &aml_dtb_header_size, &aml_dtb_offset_offset); + + if (disp->verbose) + fprintf(stderr, "Using amlogic-dt-id: %s, total number of dtbs in multidtb: %d\n", amlogic_dt_id, dt_total); + + fdts = xmalloc(dt_total * sizeof(char *)); + memset(fdts, 0, dt_total * sizeof(char *)); + + // check all dtbs in multidtb + for (i = 0; i < dt_total; i++) { + tmp_fdt_addr = *(uint32_t *)(blob + AML_DT_FIRST_DTB_OFFSET + i * aml_dtb_header_size + aml_dtb_offset_offset); + tmp_fdt_size = fdt_totalsize(blob + tmp_fdt_addr); + + if (!page_size) + page_size = tmp_fdt_addr; + + if (*(uint32_t *)(blob + tmp_fdt_addr) == DT_HEADER_MAGIC) { + int tmp_node; + const struct fdt_property *dt_id = NULL; + tmp_node = fdt_path_offset(blob + tmp_fdt_addr, "/"); + if (tmp_node >= 0) + dt_id = fdt_getprop(blob + tmp_fdt_addr, tmp_node, "amlogic-dt-id", &len); + + // check if correct dtb in multidtb got found + if (dt_id && + (len >= strlen(amlogic_dt_id)) && + (!strncmp((const char *)dt_id, amlogic_dt_id, strlen(amlogic_dt_id)))) { + fdt_addr = tmp_fdt_addr; + } + // make a backup and leave the dtb untouched + else if (fdts) { + fdts[fdt_count] = xmalloc(tmp_fdt_size); + memcpy(fdts[fdt_count], blob + tmp_fdt_addr, tmp_fdt_size); + fdt_count++; + } + } + } + + if (fdt_addr == 0) { + fprintf(stderr, "No matching amlogic-dt-id found for '%s': %d\n", amlogic_dt_id, -ENOENT); + if (fdts) { + for (i = 0; i < (dt_total - 1); i++) + free(fdts[i]); + free(fdts); + } + free(blob); + return -1; + } + } + else { + fprintf(stderr, "Amlogic-dt-id needed for Amlogic multi-dtb: %d\n", -ENOENT); + free(blob); + return -1; + } + } + + // allocate new memory for currently used blob + fdt = blob; + uint32_t fdt_size = fdt_totalsize(blob + fdt_addr); + blob = xmalloc(fdt_size); + memcpy(blob, fdt + fdt_addr, fdt_size); + switch (disp->oper) { case OPER_WRITE_PROP: /* @@ -356,9 +527,30 @@ static int do_fdtput(struct display_info *disp, const char *filename, } if (ret >= 0) { fdt_pack(blob); + + // add single dtb to multidtb before save to file + // free memory allocated before + fdt_size = fdt_totalsize(blob); + if (fdts) { + fdts[fdt_count] = xmalloc(fdt_size); + memcpy(fdts[fdt_count], blob, fdt_size); + free(blob); + blob = fdt; + create_multidtb(&blob, dt_total, page_size, fdts); + } + else { + memcpy(fdt, blob, fdt_size); + free(blob); + blob = fdt; + } ret = utilfdt_write(filename, blob); } + if (fdts) { + for (i = 0; i < (dt_total - 1); i++) + free(fdts[i]); + free(fdts); + } free(blob); if (value) { @@ -378,7 +570,7 @@ static const char usage_synopsis[] = "\n" "The command line arguments are joined together into a single value.\n" USAGE_TYPE_MSG; -static const char usage_short_opts[] = "crdpt:v" USAGE_COMMON_SHORT_OPTS; +static const char usage_short_opts[] = "crdpt:va:" USAGE_COMMON_SHORT_OPTS; static struct option const usage_long_opts[] = { {"create", no_argument, NULL, 'c'}, {"remove", no_argument, NULL, 'r'}, @@ -386,6 +578,7 @@ static struct option const usage_long_opts[] = { {"auto-path", no_argument, NULL, 'p'}, {"type", a_argument, NULL, 't'}, {"verbose", no_argument, NULL, 'v'}, + {"amlogic-dt-id", a_argument, NULL, 'a'}, USAGE_COMMON_LONG_OPTS, }; static const char * const usage_opts_help[] = { @@ -395,6 +588,7 @@ static const char * const usage_opts_help[] = { "Automatically create nodes as needed for the node path", "Type of data", "Display each value decoded from command line", + "Forced amlogic-dt-id to be used for multi-dtb", USAGE_COMMON_OPTS_HELP }; @@ -417,6 +611,9 @@ int main(int argc, char *argv[]) switch (opt) { case_USAGE_COMMON_FLAGS + case 'a': + disp.amlogic_dt_id = optarg; + break; case 'c': disp.oper = OPER_CREATE_NODE; break; diff --git a/gzip.c b/gzip.c new file mode 100644 index 0000000..2ed3ac9 --- /dev/null +++ b/gzip.c @@ -0,0 +1,199 @@ +/* + * Simple tool for CoreELEC installation on eMMC + * + * Copyright (C) 2019 Team CoreELEC, vpeter, Portisch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "gzip.h" + +static void *zalloc(void *x, unsigned items, unsigned size) +{ + void *p; + + size *= items; + size = (size + ZALLOC_ALIGNMENT - 1) & ~(ZALLOC_ALIGNMENT - 1); + + p = malloc (size); + return (p); +} + +static void zfree(void *x, void *addr) +{ + free (addr); +} + +// Uncompress blocks compressed with zlib without headers +static int zunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp, + int stoponerr, int offset) +{ + z_stream s; + int r; + + s.zalloc = zalloc; + s.zfree = zfree; + + r = inflateInit2(&s, -MAX_WBITS); + if (r != Z_OK) { + printf ("Error: inflateInit2() returned %d\n", r); + return -1; + } + + s.next_in = src + offset; + s.avail_in = *lenp - offset; + s.next_out = dst; + s.avail_out = dstlen; + + do { + r = inflate(&s, Z_FINISH); + if (stoponerr == 1 && r != Z_STREAM_END && + (s.avail_out == 0 || r != Z_BUF_ERROR)) { + printf("Error: inflate() returned %d\n", r); + inflateEnd(&s); + return -1; + } + + s.avail_in = *lenp - offset - (int)(s.next_out - (unsigned char*)dst); + } while (r == Z_BUF_ERROR); + + *lenp = s.next_out - (unsigned char *) dst; + inflateEnd(&s); + return 0; +} + +// Compress blocks with zlib +static int zzip(void *dst, unsigned long *lenp, unsigned char *src, + unsigned long srclen, int stoponerr, + int (*func)(unsigned long, unsigned long)) +{ + z_stream s; + int r, flush, orig, window; + unsigned long comp_len, left_len; + + if (!srclen) + return 0; + +#ifndef CONFIG_GZIP + window = MAX_WBITS; +#else + window = 2 * MAX_WBITS; +#endif + orig = *lenp; + s.zalloc = zalloc; + s.zfree = zfree; + s.opaque = Z_NULL; + + r = deflateInit2_(&s, Z_DEFAULT_COMPRESSION, Z_DEFLATED, window, + DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + ZLIB_VERSION, sizeof(z_stream)); + if (r != Z_OK) { + printf ("Error: deflateInit2_() returned %d\n", r); + return -1; + } + + while (srclen > 0) { + comp_len = (srclen > CONFIG_GZIP_COMPRESS_DEF_SZ) ? + CONFIG_GZIP_COMPRESS_DEF_SZ : srclen; + + s.next_in = src; + s.avail_in = comp_len; + flush = (srclen > CONFIG_GZIP_COMPRESS_DEF_SZ)? + Z_NO_FLUSH : Z_FINISH; + + do { + left_len = (*lenp > CONFIG_GZIP_COMPRESS_DEF_SZ) ? + CONFIG_GZIP_COMPRESS_DEF_SZ : *lenp; + s.next_out = dst; + s.avail_out = left_len; + + r = deflate(&s, flush); + if (r == Z_STREAM_ERROR && stoponerr == 1) { + printf("Error: deflate() returned %d\n", r); + r = -1; + goto bail; + } + + if (!func) { + dst += (left_len - s.avail_out); + *lenp -= (left_len - s.avail_out); + } else if (left_len - s.avail_out > 0) { + r = func((unsigned long)dst, + left_len - s.avail_out); + if (r < 0) + goto bail; + } + } while (s.avail_out == 0 && (*lenp > 0)); + + if (s.avail_in) { + printf("Deflate failed to consume %u bytes", s.avail_in); + r = -1; + goto bail; + } + + if (*lenp == 0) { + printf("Deflate need more space to compress " + "left %lu bytes\n", srclen); + r = -1; + goto bail; + } + + srclen -= comp_len; + src += comp_len; + } + + r = 0; +bail: + deflateEnd(&s); + *lenp = orig - *lenp; + return r; +} + +int gzip(void *dst, unsigned long *lenp, + unsigned char *src, unsigned long srclen) +{ + return zzip(dst, lenp, src, srclen, 1, NULL); +} + +int gunzip(void *dst, int dstlen, + unsigned char *src, unsigned long *lenp) +{ + int i, flags; + + // skip header + i = 10; + flags = src[3]; + if (src[2] != Z_DEFLATED || (flags & RESERVED) != 0) { + puts ("Error: Bad gzipped data\n"); + return (-1); + } + + if ((flags & EXTRA_FIELD) != 0) + i = 12 + src[10] + (src[11] << 8); + + if ((flags & ORIG_NAME) != 0) + while (src[i++] != 0) + ; + + if ((flags & COMMENT) != 0) + while (src[i++] != 0) + ; + + if ((flags & HEAD_CRC) != 0) + i += 2; + + if (i >= *lenp) { + puts ("Error: gunzip out of data in header\n"); + return (-1); + } + + return zunzip(dst, dstlen, src, lenp, 1, i); +} diff --git a/gzip.h b/gzip.h new file mode 100644 index 0000000..6a03815 --- /dev/null +++ b/gzip.h @@ -0,0 +1,49 @@ +/* + * Simple tool for CoreELEC installation on eMMC + * + * Copyright (C) 2019 Team CoreELEC, vpeter, Portisch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __ZLIB_H__ +#define __ZLIB_H__ + +#include <stdio.h> +#include <stdlib.h> +#include "zlib.h" + +// enable gzip mode of zlib +#define CONFIG_GZIP + +// Maximum value for memLevel in deflateInit2 +#define DEF_MEM_LEVEL 8 + +#ifndef CONFIG_GZIP_COMPRESS_DEF_SZ +#define CONFIG_GZIP_COMPRESS_DEF_SZ 0x200 +#endif + +#define ZALLOC_ALIGNMENT 16 + +// gzip flag byte +#define ASCII_FLAG 0x01 // bit 0 set: file probably ascii text +#define HEAD_CRC 0x02 // bit 1 set: header CRC present +#define EXTRA_FIELD 0x04 // bit 2 set: extra field present +#define ORIG_NAME 0x08 // bit 3 set: original file name present +#define COMMENT 0x10 // bit 4 set: file comment present +#define RESERVED 0xE0 // bits 5..7: reserved + +extern int gzip(void *dst, unsigned long *lenp, + unsigned char *src, unsigned long srclen); +extern int gunzip(void *dst, int dstlen, + unsigned char *src, unsigned long *lenp); + +#endif diff --git a/util.c b/util.c index 40274fb..ae8feda 100644 --- a/util.c +++ b/util.c @@ -14,6 +14,7 @@ #include <string.h> #include <assert.h> #include <inttypes.h> +#include <time.h> #include <errno.h> #include <fcntl.h> @@ -23,6 +24,8 @@ #include "util.h" #include "version_gen.h" +static void *gzip_buf = NULL; + char *xstrdup(const char *s) { int len = strlen(s) + 1; @@ -238,6 +241,7 @@ int utilfdt_read_err(const char *filename, char **buffp, size_t *len) char *buf = NULL; size_t bufsize = 1024, offset = 0; int ret = 0; + long unsigned int lenup = GUNZIP_BUF_SIZE; *buffp = NULL; if (strcmp(filename, "-") != 0) { @@ -263,6 +267,23 @@ int utilfdt_read_err(const char *filename, char **buffp, size_t *len) offset += ret; } while (ret != 0); + // if dtb is gzipped extract it and replace allocated buffer + if (!ret && IS_GZIP_FORMAT(*(uint32_t *)buf)) { + gzip_buf = xmalloc(GUNZIP_BUF_SIZE); + + ret = gunzip(gzip_buf, GUNZIP_BUF_SIZE, (unsigned char *)buf, &lenup); + if (ret < 0) { + fprintf(stderr, "Failed to decompress gzipped dtb!\n"); + ret = errno; + free(gzip_buf); + } + + if (!ret) { + free(buf); + buf = gzip_buf; + } + } + /* Clean up, including closing stdin; return errno on error */ close(fd); if (ret) @@ -288,6 +309,82 @@ char *utilfdt_read(const char *filename, size_t *len) return buff; } +int utilfdt_get_amlogic_dt_id(char *amlogic_dt_id, char *buf) +{ + // amlogic_dt_id forced or read by sysfs? + if (amlogic_dt_id) + strcpy(buf, amlogic_dt_id); + else { + FILE *fd = fopen(amlogic_dt_id_path, "r"); + + if (!fd) { + fprintf(stderr, "Failed to open amlogic-dt-id: %d\n", -errno); + return -1; + } + + if (fgets(buf, 256, fd) == 0) { + fprintf(stderr, "Failed to read amlogic-dt-id: %d\n", -errno); + return -1; + } + + fclose(fd); + } + return 0; +} + +void utilfdt_get_multidtb_data(const void *blob, uint32_t *dt_total, + uint32_t *dtb_header_size, uint32_t *dtb_offset) +{ + uint32_t dt_tool_version; + uint32_t aml_each_id_length = 0; + + // version control, compatible with v1 + dt_tool_version = *(uint32_t *)(blob + AML_DT_VERSION_OFFSET); + + if (dt_tool_version == 1) + aml_each_id_length = AML_DT_IND_LENGTH_V1; + else if (dt_tool_version == 2) + aml_each_id_length = AML_DT_IND_LENGTH_V2; + + *dtb_offset = aml_each_id_length * AML_DT_ID_VARI_TOTAL; + *dtb_header_size = 8 + (aml_each_id_length * AML_DT_ID_VARI_TOTAL); + + *dt_total = *(uint32_t *)(blob + AML_DT_TOTAL_DTB_OFFSET); +} + +uint32_t utilfdt_get_multidtb_size(const void *blob) +{ + int i; + uint32_t dt_total = 0; + uint32_t page_size = 0; + uint32_t fdt_size = 0; + uint32_t dt_tool_version; + uint32_t aml_each_id_length = 0; + uint32_t aml_dtb_offset_offset; + uint32_t aml_dtb_header_size; + + // version control, compatible with v1 + dt_tool_version = *(const uint32_t *)(blob + AML_DT_VERSION_OFFSET); + + if (dt_tool_version == 1) + aml_each_id_length = AML_DT_IND_LENGTH_V1; + else if (dt_tool_version == 2) + aml_each_id_length = AML_DT_IND_LENGTH_V2; + + aml_dtb_offset_offset = aml_each_id_length * AML_DT_ID_VARI_TOTAL; + aml_dtb_header_size = 8 + (aml_each_id_length * AML_DT_ID_VARI_TOTAL); + + dt_total = *(const uint32_t *)(blob + AML_DT_TOTAL_DTB_OFFSET); + + for (i = 0; i < dt_total; i++) { + if (!page_size) + page_size = *(const uint32_t *)(blob + AML_DT_FIRST_DTB_OFFSET + i * aml_dtb_header_size + aml_dtb_offset_offset); + fdt_size += *(const uint32_t *)(blob + AML_DT_FIRST_DTB_OFFSET + i * aml_dtb_header_size + aml_dtb_offset_offset + 4); + } + + return (fdt_size + page_size); +} + int utilfdt_write_err(const char *filename, const void *blob) { int fd = 1; /* assume stdout */ @@ -295,6 +392,8 @@ int utilfdt_write_err(const char *filename, const void *blob) int offset; int ret = 0; const char *ptr = blob; + long unsigned int lenp = GUNZIP_BUF_SIZE; + void *gzip_multi_buf = NULL; if (strcmp(filename, "-") != 0) { fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); @@ -302,9 +401,35 @@ int utilfdt_write_err(const char *filename, const void *blob) return errno; } - totalsize = fdt_totalsize(blob); + if (*(const uint32_t *)blob == AML_DT_HEADER_MAGIC) + totalsize = utilfdt_get_multidtb_size(blob); + else + totalsize = fdt_totalsize(blob); + offset = 0; + // check if dtb was gzipped when reading + if (gzip_buf) { + time_t now = time(NULL); + gzip_multi_buf = xmalloc(GUNZIP_BUF_SIZE); + + ret = gzip(gzip_multi_buf, &lenp, (unsigned char *)blob, totalsize); + if (ret < 0) { + fprintf(stderr, "Failed to compress dtb!\n"); + ret = -errno; + if (fd != 1) + close(fd); + free(gzip_multi_buf); + return ret < 0 ? -ret : 0; + } + + /* add time because older Amlogic u-boot expects a value at this place */ + memcpy(gzip_multi_buf + 4, &now, 4); + + totalsize = lenp; + ptr = gzip_multi_buf; + } + while (offset < totalsize) { ret = write(fd, ptr + offset, totalsize - offset); if (ret < 0) { @@ -316,6 +441,8 @@ int utilfdt_write_err(const char *filename, const void *blob) /* Close the file/stdin; return errno on error */ if (fd != 1) close(fd); + if (gzip_multi_buf) + free(gzip_multi_buf); return ret < 0 ? -ret : 0; } diff --git a/util.h b/util.h index 5a4172d..51b2b23 100644 --- a/util.h +++ b/util.h @@ -5,6 +5,7 @@ #include <stdarg.h> #include <stdbool.h> #include <getopt.h> +#include "gzip.h" /* * Copyright 2011 The Chromium Authors, All Rights Reserved. @@ -28,6 +29,23 @@ #define stringify(s) stringify_(s) #define stringify_(s) #s +#define amlogic_dt_id_path "/proc/device-tree/amlogic-dt-id" +#define DT_HEADER_MAGIC 0xedfe0dd0 // header of dtb file +#define AML_DT_HEADER_MAGIC 0x5f4c4d41 // "AML_", multi dtbs supported +#define AML_DT_MAGIC "AML_" /* Master DTB magic */ +#define AML_DT_VERSION 2 // AML version +#define IS_GZIP_FORMAT(data) ((data & (0x0000FFFF)) == (0x00008B1F)) +#define GUNZIP_BUF_SIZE (5UL * 1024 * 1024) +#define INFO_ENTRY_SIZE 16 +#define INFO_ENTRY_SIZE_S "16" +#define AML_DT_IND_LENGTH_V1 4 // fixed +#define AML_DT_IND_LENGTH_V2 16 // fixed +#define AML_DT_ID_VARI_TOTAL 3 // total 3 strings +// Latest version: v2 +#define AML_DT_VERSION_OFFSET 4 +#define AML_DT_TOTAL_DTB_OFFSET 8 +#define AML_DT_FIRST_DTB_OFFSET 12 + static inline void NORETURN PRINTF(1, 2) die(const char *str, ...) { va_list ap; @@ -128,6 +146,38 @@ int utilfdt_write(const char *filename, const void *blob); */ int utilfdt_write_err(const char *filename, const void *blob); +/** + * Calculate the totalsize of a multidtb blob and + * returns them. The value returned can be passed to strerror() to obtain + * an error message for the user. + * + * @param blob Poiner to buffer containing fdt + * @return > 0 if ok, else an errno value representing the error + */ +uint32_t utilfdt_get_multidtb_size(const void *blob); + +/** + * Get data of a multidtb blob and returns them. + * + * @param blob Poiner to buffer containing fdt + * @param dt_total Poiner to buffer containing dt_total + * @param dtb_header_size Poiner to buffer containing dtb_header_size + * @param dtb_offset Poiner to buffer containing dtb_offset + */ +void utilfdt_get_multidtb_data(const void *blob, uint32_t *dt_total, + uint32_t *dtb_header_size, uint32_t *dtb_offset); + +/** + * Get amlogic-dt-id what should be used for multidtb + * returns them. The value returned can be passed to strerror() to obtain + * an error message for the user. + * + * @param amlogic_dt_id Poiner to buffer containing forced amlogic-dt-id + * @param buf Poiner to buffer containing char buffer + * @return 0 if ok, else -1 + */ +int utilfdt_get_amlogic_dt_id(char *amlogic_dt_id, char *buf); + /** * Decode a data type string. The purpose of this string * -- 2.29.2 ================================================ FILE: packages/tools/emmctool/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="emmctool" PKG_VERSION="1.0" PKG_LICENSE="GPLv2" PKG_LONGDESC="emmctool: simple tool for writing LibreELEC images to emmc on supported box/board devices" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/emmctool ${INSTALL}/usr/bin } ================================================ FILE: packages/tools/emmctool/scripts/emmctool ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) # ** !!! WARNING !!! WARNING !!! WARNING !!! WARNING !!! WARNING !!! ** # This script is not supported on generic box devices. If you choose to # modify it to run on other hardware and you brick your device you will # receive no support to restore your device. You have been warned! do_backup(){ do_umount echo "info: compressing ${EMMC} to ${2}, this will take time" dd if="${EMMC}" | gzip > of="${2}" echo "info: compressing completed" } do_detect(){ # used on LibreComputer LePotato/LaFrite where pre-formatted modules # must be attached after boot (LibreComputer supports this) else the # device always boots to the pre-installed OS on the module. echo "info: rebinding d0074000.mmc" echo -n d0074000.mmc > /sys/bus/platform/drivers/meson-gx-mmc/unbind echo -n d0074000.mmc > /sys/bus/platform/drivers/meson-gx-mmc/bind sleep 1 parted -s "${EMMC}" print } do_info(){ BOOTINFO=$(dd if="${BOOT}" count=2048 2>/dev/null | strings | grep -e '^U-Boot ' | awk '{print $2}') EMMCINFO=$(dd if="${EMMC}" count=2048 2>/dev/null | strings | grep -e '^U-Boot ' | awk '{print $2}') echo "" if [ -n "${BOOTINFO}" ]; then echo "info: boot device is $BOOT, U-boot version is ${BOOTINFO}" else echo "info: boot device is $BOOT" fi if [ -n "${EMMCINFO}" ]; then echo "info: emmc device is $EMMC, U-boot version is ${EMMCINFO}" else echo "info: emmc device is $EMMC" fi echo "" parted -s "${EMMC}" print echo "" } do_labels(){ if [ -n "${2}" ] && [ -n "${3}" ]; then BOOTLABEL=$(echo "${2}" | awk 'BEGIN { getline; print toupper($0) }') DISKLABEL=$(echo "${3}" | awk 'BEGIN { getline; print toupper($0) }') else BOOTLABEL="BOOT" DISKLABEL="DISK" fi echo "info: using boot=LABEL=${BOOTLABEL} and disk=LABEL=${DISKLABEL}" do_umount echo "info: changing label values on partitions" fatlabel "${EMMC}p1" "${BOOTLABEL}" e2label "${EMMC}p2" "${DISKLABEL}" sleep 1 echo "info: remounting ${EMMC}p1 to /var/media/${BOOTLABEL}" mkdir -p "/var/media/${BOOTLABEL}" mount "${EMMC}p1" "/var/media/${BOOTLABEL}" echo "info: remounting ${EMMC}p2 to /var/media/${DISKLABEL}" mkdir -p "/var/media/${DISKLABEL}" mount "${EMMC}p2" "/var/media/${DISKLABEL}" sleep 1 echo "info: changing label values in extlinux.conf" sed -i "s/boot=LABEL=\w*/boot=LABEL=${BOOTLABEL}/g" "/var/media/${BOOTLABEL}/extlinux/extlinux.conf" sed -i "s/disk=LABEL=\w*/disk=LABEL=${DISKLABEL}/g" "/var/media/${BOOTLABEL}/extlinux/extlinux.conf" sleep 1 echo "" blkid | grep "${EMMC}p" echo "" cat "/var/media/${BOOTLABEL}/extlinux/extlinux.conf" echo "" } do_resize(){ if [ -z "${DISKLABEL}" ]; then DISKLABEL=$(blkid | grep "${EMMC}"p2 | awk -F'"' '{print $2}') fi do_umount echo "info: resizing partition ${EMMC}p2 to 100%" parted -s -m "${EMMC}" resizepart 2 100% || parted -s -m "${EMMC}" resizepart 2 yes 100% sleep 5 do_umount echo "info: checking filesystem" e2fsck -f "${EMMC}p2" sleep 1 echo "info: resizing filesystem" resize2fs "${EMMC}p2" sync sleep 1 echo "info: remounting ${EMMC}p2 to /var/media/${DISKLABEL}" mkdir -p "/var/media/${DISKLABEL}" mount "${EMMC}p2" "/var/media/${DISKLABEL}" sleep 1 if [ -f "/var/media/${DISKLABEL}/.please_resize_me" ]; then rm "/var/media/${DISKLABEL}/.please_resize_me" fi parted -s "${EMMC}" print } do_storage(){ if [ -n "${2}" ]; then DISKLABEL=$(echo "${2}" | awk 'BEGIN { getline; print toupper($0) }') else DISKLABEL="DISK" fi do_umount echo "info: converting emmc for /storage use" parted -s "${EMMC}" mklabel gpt parted -s "${EMMC}" -a min unit s mkpart EMMC_STORAGE ext4 34 100% sleep 1 mkfs.ext4 "${EMMC}p1" sleep 1 e2label "${EMMC}p1" EMMC_STORAGE echo "info: changing label values in extlinux.conf" mount -o remount,rw /flash sleep 1 sed -i "s/disk=LABEL=\w*/disk=LABEL=${DISKLABEL}/g" "/flash/extlinux/extlinux.conf" mount -o remount,ro /flash sleep 1 echo "" blkid | grep "${EMMC}p" echo "" cat "/flash/extlinux/extlinux.conf" echo "" } do_umount(){ for mount in $(grep "${EMMC}" /proc/mounts | awk '{print $1}'); do echo "info: unmounting $mount" umount -f "$mount" sleep 2 done } do_writeprotect(){ echo "info: disabling emmc write protection" echo 0 > "/sys/block/${EMMC}boot0/force_ro" echo 0 > "/sys/block/${EMMC}boot1/force_ro" } do_write(){ do_umount case $(dtname) in radxa,zero*) do_writeprotect ;; esac if [ -e "${2}" ]; then case "${2}" in *box.img.gz|*box.img) echo "error: ${2} is not a bootable image, aborting!" exit 1 ;; *.img.gz) echo "info: writing ${2} to ${EMMC}" gunzip -c "${2}" | dd of="${EMMC}" bs=1M ;; *.img) echo "info: writing ${2} to ${EMMC}" dd if="${2}" of="${EMMC}" bs=1M ;; *) echo "error: ${2} is not a valid image file!" exit 1 esac else echo "error: ${2} not found!" exit 1 fi } do_zero(){ do_umount echo "info: zeroing ${EMMC}, be patient, this will take time" dd if="/dev/zero" of="${EMMC}" bs=1M echo "info: zeroing complete" } do_help(){ echo "" echo "usage: emmctool (w)rite <filename> : write <filename>.img/.img.gz to the eMMC module" echo " (b)backup <filename> : dump the emmc partition to <filename>.img.gz file" echo " (d)etect : detect an eMMC module attached after boot" echo " (i)nfo : show info about the eMMC module" echo " (l)abel <boot> <disk> : change eMMC disk labels to <bootlabel> <disklabel>" echo " (r)esize : resize the storage partition to 100%" echo " (s)storage : convert emmc for use as /storage (boot from sdcard)" echo " (z)ero : zero (erase/wipe) the eMMC module" echo " (h)elp : displays this help message" echo "" } BOOT=$(grep /flash /proc/mounts | awk '{print $1}' | sed 's/p[012]//g') EMMC=$(find /dev -name "mmcblk*rpmb" | sed 's/rpmb//g' | head -n 1) if [ -z "${EMMC}" ]; then echo "error: no emmc module detected!" exit 1 fi case $(dtname) in azw*|bananapi*|friendlyarm*|hardkernel*|khadas*|libretech*|radxa*|wetek*) if [ "${BOOT}" = "${EMMC}" ]; then do_info echo "Your device is booted from the eMMC module!" echo "" exit 1 fi ;; *) echo "Your device is not supported!" echo "" exit 1 ;; esac case "${1}" in backup) do_backup "$@" ;; detect|d) do_detect ;; info|i) do_info ;; labels|l) do_labels "$@" ;; resize|r) do_resize ;; storage|s) do_storage "$@" ;; write|w) do_write "$@" do_resize do_labels ;; zero|z) do_zero ;; *) do_info do_help ;; esac exit ================================================ FILE: packages/tools/exynos-boot-fip/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="exynos-boot-fip" PKG_LICENSE="nonfree" PKG_VERSION="fb7ab5db7329705b2fe1398842d715d1bbeb33d2" PKG_SHA256="271bb3ff90b6e995a55252bfb8de46405cdbd7f506eca2c3e673f911cdb876c1" PKG_SITE="https://github.com/chewitt/exynos-boot-fip" PKG_URL="https://github.com/chewitt/exynos-boot-fip/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="Firmware Image Package (FIP) sources used with Exynos u-boot binaries in LibreELEC images" PKG_TOOLCHAIN="manual" PKG_STAMP="${UBOOT_SYSTEM}" makeinstall_target() { mkdir -p ${INSTALL}/usr/boot cp -P ${PKG_BUILD}/bl1.bin.hardkernel ${INSTALL}/usr/boot cp -P ${PKG_BUILD}/bl2.bin.hardkernel.720k_uboot ${INSTALL}/usr/boot cp -P ${PKG_BUILD}/tzsw.bin.hardkernel ${INSTALL}/usr/boot } ================================================ FILE: packages/tools/flashrom/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="flashrom" PKG_VERSION="1.3.0" PKG_SHA256="a053234453ccd012e79f3443bdcc61625cf97b7fd7cb4cdd8bfbffbe8b149623" PKG_LICENSE="GPL" PKG_SITE="https://www.flashrom.org/Flashrom" PKG_URL="https://download.flashrom.org/releases/${PKG_NAME}-v${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libusb-compat" PKG_LONGDESC="flashrom is a utility for identifying, reading, writing, verifying and erasing flash chips. It is designed to flash BIOS/EFI/coreboot/firmware/optionROM images on mainboards, network/graphics/storage controller cards, and various other programmer devices." PKG_MESON_OPTS_TARGET="--wrap-mode=nodownload \ -Dprogrammer=dummy,serprog,buspirate_spi,pony_spi,linux_mtd,linux_spi" makeinstall_target() { mkdir -p ${INSTALL}/usr/sbin cp flashrom ${INSTALL}/usr/sbin } ================================================ FILE: packages/tools/grub/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="grub" PKG_VERSION="635ef55ed1252f92fe3bf70caefd185dcc507c43" # 2020-12-18 PKG_SHA256="e099d18bdeef5312765f20c6de3384ca9ff03f776f1c7632b1e4bc4d1715a961" PKG_ARCH="x86_64" PKG_LICENSE="GPLv3" PKG_SITE="https://www.gnu.org/software/grub/index.html" PKG_URL="http://git.savannah.gnu.org/cgit/grub.git/snapshot/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain flex freetype:host gettext:host grub:host" PKG_DEPENDS_UNPACK="gnulib" PKG_LONGDESC="GRUB is a Multiboot boot loader." PKG_TOOLCHAIN="configure" pre_configure_host() { unset CFLAGS unset CPPFLAGS unset CXXFLAGS unset LDFLAGS unset CPP cd ${PKG_BUILD} # keep grub synced with gnulib ./bootstrap --gnulib-srcdir=$(get_build_dir gnulib) --copy --no-git --no-bootstrap-sync --skip-po mkdir -p .${HOST_NAME} cd .${HOST_NAME} } pre_configure_target() { PKG_CONFIGURE_OPTS_TARGET="--target=i386-pc-linux \ --disable-nls \ --with-platform=efi" unset CFLAGS unset CPPFLAGS unset CXXFLAGS unset LDFLAGS unset CPP cd ${PKG_BUILD} # keep grub synced with gnulib ./bootstrap --gnulib-srcdir=$(get_build_dir gnulib) --copy --no-git --no-bootstrap-sync --skip-po mkdir -p .${TARGET_NAME} cd .${TARGET_NAME} # configure requires explicit TARGET_PREFIX binaries when cross compiling. export TARGET_CC="${TARGET_PREFIX}gcc" export TARGET_OBJCOPY="${TARGET_PREFIX}objcopy" export TARGET_STRIP="${TARGET_PREFIX}strip" export TARGET_NM="${TARGET_PREFIX}nm" export TARGET_RANLIB="${TARGET_PREFIX}ranlib" } make_target() { make CC=${CC} \ AR=${AR} \ RANLIB=${RANLIB} \ CFLAGS="-I${SYSROOT_PREFIX}/usr/include -fomit-frame-pointer -D_FILE_OFFSET_BITS=64" \ LDFLAGS="-L${SYSROOT_PREFIX}/usr/lib" } makeinstall_target() { ${PKG_BUILD}/.${HOST_NAME}/grub-mkimage -d grub-core -o bootia32.efi -O i386-efi -p /EFI/BOOT \ boot chain configfile ext2 fat linux search efi_gop \ efi_uga part_gpt gzio gettext loadenv loadbios memrw mkdir -p ${INSTALL}/usr/share/grub cp -P bootia32.efi ${INSTALL}/usr/share/grub mkdir -p ${TOOLCHAIN}/share/grub cp -P bootia32.efi ${TOOLCHAIN}/share/grub } ================================================ FILE: packages/tools/grub/patches/grub-0001-Fix-Werror-array-bounds-array-subscript-0-is-outside-array-bounds.patch ================================================ From acffb81485e35e1f28152949a1c6e1d4dbf5172e Mon Sep 17 00:00:00 2001 From: Michael Chang <mchang@suse.com> Date: Mon, 28 Mar 2022 15:00:53 +0800 Subject: build: Fix -Werror=array-bounds array subscript 0 is outside array bounds The GRUB is failing to build with GCC-12 in many places like this: In function 'init_cbfsdisk', inlined from 'grub_mod_init' at ../../grub-core/fs/cbfs.c:391:3: ../../grub-core/fs/cbfs.c:345:7: error: array subscript 0 is outside array bounds of 'grub_uint32_t[0]' {aka 'unsigned int[]'} [-Werror=array-bounds] 345 | ptr = *(grub_uint32_t *) 0xfffffffc; | ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This is caused by GCC regression in 11/12 [1]. In a nut shell, the warning is about detected invalid accesses at non-zero offsets to NULL pointers. Since hardwired constant address is treated as NULL plus an offset in the same underlying code, the warning is therefore triggered. Instead of inserting #pragma all over the places where literal pointers are accessed to avoid diagnosing array-bounds, we can try to borrow the idea from Linux kernel that the absolute_pointer() macro [2][3] is used to disconnect a pointer using literal address from it's original object, hence GCC won't be able to make assumptions on the boundary while doing pointer arithmetic. With that we can greatly reduce the code we have to cover up by making initial literal pointer assignment to use the new wrapper but not having to track everywhere literal pointers are accessed. This also makes code looks cleaner. Please note the grub_absolute_pointer() macro requires to be invoked in a function as long as it is compound expression. Some global variables with literal pointers has been changed to local ones in order to use grub_absolute_pointer() to initialize it. The shuffling is basically done in a selective and careful way that the variable's scope doesn't matter being local or global, for example, the global variable must not get modified at run time throughout. For the record, here's the list of global variables got shuffled in this patch: grub-core/commands/i386/pc/drivemap.c:int13slot grub-core/term/i386/pc/console.c:bios_data_area grub-core/term/ns8250.c:serial_hw_io_addr [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578 [2] https://elixir.bootlin.com/linux/v5.16.14/source/include/linux/compiler.h#L180 [3] https://elixir.bootlin.com/linux/v5.16.14/source/include/linux/compiler-gcc.h#L31 Signed-off-by: Michael Chang <mchang@suse.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> --- grub-core/bus/cs5536.c | 5 +++-- grub-core/commands/acpi.c | 4 ++-- grub-core/commands/efi/loadbios.c | 9 +++++---- grub-core/commands/i386/pc/drivemap.c | 8 +++++--- grub-core/commands/i386/pc/sendkey.c | 12 ++++++------ grub-core/disk/i386/pc/biosdisk.c | 4 ++-- grub-core/fs/cbfs.c | 2 +- grub-core/kern/i386/pc/acpi.c | 4 ++-- grub-core/kern/i386/pc/mmap.c | 2 +- grub-core/loader/i386/multiboot_mbi.c | 2 +- grub-core/loader/multiboot_mbi2.c | 4 ++-- grub-core/mmap/i386/pc/mmap.c | 26 +++++++++++++------------- grub-core/net/drivers/i386/pc/pxe.c | 12 ++++++------ grub-core/term/i386/pc/console.c | 5 ++--- grub-core/term/i386/pc/vga_text.c | 6 +++--- grub-core/term/ns8250.c | 7 ++++++- grub-core/video/i386/pc/vbe.c | 6 +++--- include/grub/types.h | 24 ++++++++++++++++++++++++ 18 files changed, 87 insertions(+), 55 deletions(-) diff --git a/grub-core/bus/cs5536.c b/grub-core/bus/cs5536.c index 8c90ed5..cd0a45e 100644 --- a/grub-core/bus/cs5536.c +++ b/grub-core/bus/cs5536.c @@ -331,8 +331,9 @@ grub_cs5536_init_geode (grub_pci_device_t dev) { volatile grub_uint32_t *oc; - oc = grub_pci_device_map_range (dev, 0x05022000, - GRUB_CS5536_USB_OPTION_REGS_SIZE); + + oc = grub_absolute_pointer (grub_pci_device_map_range (dev, 0x05022000, + GRUB_CS5536_USB_OPTION_REGS_SIZE)); oc[GRUB_CS5536_USB_OPTION_REG_UOCMUX] = (oc[GRUB_CS5536_USB_OPTION_REG_UOCMUX] diff --git a/grub-core/commands/acpi.c b/grub-core/commands/acpi.c index 1215f2a..fda62f4 100644 --- a/grub-core/commands/acpi.c +++ b/grub-core/commands/acpi.c @@ -168,7 +168,7 @@ grub_acpi_create_ebda (void) struct grub_acpi_rsdp_v10 *v1; struct grub_acpi_rsdp_v20 *v2; - ebda = (grub_uint8_t *) (grub_addr_t) ((*((grub_uint16_t *)0x40e)) << 4); + ebda = (grub_uint8_t *) (grub_addr_t) ((*((grub_uint16_t *) grub_absolute_pointer (0x40e))) << 4); grub_dprintf ("acpi", "EBDA @%p\n", ebda); if (ebda) ebda_kb_len = *(grub_uint16_t *) ebda; @@ -298,7 +298,7 @@ grub_acpi_create_ebda (void) *target = 0; grub_dprintf ("acpi", "Switching EBDA\n"); - (*((grub_uint16_t *) 0x40e)) = ((grub_addr_t) targetebda) >> 4; + (*((grub_uint16_t *) grub_absolute_pointer (0x40e))) = ((grub_addr_t) targetebda) >> 4; grub_dprintf ("acpi", "EBDA switched\n"); return GRUB_ERR_NONE; diff --git a/grub-core/commands/efi/loadbios.c b/grub-core/commands/efi/loadbios.c index 5c7725f..574e410 100644 --- a/grub-core/commands/efi/loadbios.c +++ b/grub-core/commands/efi/loadbios.c @@ -46,7 +46,7 @@ enable_rom_area (void) grub_uint32_t *rom_ptr; grub_pci_device_t dev = { .bus = 0, .device = 0, .function = 0}; - rom_ptr = (grub_uint32_t *) VBIOS_ADDR; + rom_ptr = grub_absolute_pointer (VBIOS_ADDR); if (*rom_ptr != BLANK_MEM) { grub_puts_ (N_("ROM image is present.")); @@ -96,8 +96,8 @@ fake_bios_data (int use_rom) void *acpi, *smbios; grub_uint16_t *ebda_seg_ptr, *low_mem_ptr; - ebda_seg_ptr = (grub_uint16_t *) EBDA_SEG_ADDR; - low_mem_ptr = (grub_uint16_t *) LOW_MEM_ADDR; + ebda_seg_ptr = grub_absolute_pointer (EBDA_SEG_ADDR); + low_mem_ptr = grub_absolute_pointer (LOW_MEM_ADDR); if ((*ebda_seg_ptr) || (*low_mem_ptr)) return; @@ -132,7 +132,8 @@ fake_bios_data (int use_rom) *ebda_seg_ptr = FAKE_EBDA_SEG; *low_mem_ptr = (FAKE_EBDA_SEG >> 6); - *((grub_uint16_t *) (FAKE_EBDA_SEG << 4)) = 640 - *low_mem_ptr; + /* *((grub_uint16_t *) (FAKE_EBDA_SEG << 4)) = 640 - *low_mem_ptr; */ + *((grub_uint16_t *) (grub_absolute_pointer (FAKE_EBDA_SEG << 4))) = 640 - *low_mem_ptr; if (acpi) grub_memcpy ((char *) ((FAKE_EBDA_SEG << 4) + 16), acpi, 1024 - 16); diff --git a/grub-core/commands/i386/pc/drivemap.c b/grub-core/commands/i386/pc/drivemap.c index 3fb22dc..a7ee4c9 100644 --- a/grub-core/commands/i386/pc/drivemap.c +++ b/grub-core/commands/i386/pc/drivemap.c @@ -31,9 +31,6 @@ GRUB_MOD_LICENSE ("GPLv3+"); -/* Real mode IVT slot (seg:off far pointer) for interrupt 0x13. */ -static grub_uint32_t *const int13slot = (grub_uint32_t *) (4 * 0x13); - /* Remember to update enum opt_idxs accordingly. */ static const struct grub_arg_option options[] = { /* TRANSLATORS: In this file "mapping" refers to a change GRUB makes so if @@ -280,6 +277,8 @@ install_int13_handler (int noret __attribute__ ((unused))) grub_uint8_t *handler_base = 0; /* Address of the map within the deployed bundle. */ int13map_node_t *handler_map; + /* Real mode IVT slot (seg:off far pointer) for interrupt 0x13. */ + grub_uint32_t *int13slot = (grub_uint32_t *) grub_absolute_pointer (4 * 0x13); int i; int entries = 0; @@ -354,6 +353,9 @@ install_int13_handler (int noret __attribute__ ((unused))) static grub_err_t uninstall_int13_handler (void) { + /* Real mode IVT slot (seg:off far pointer) for interrupt 0x13. */ + grub_uint32_t *int13slot = (grub_uint32_t *) grub_absolute_pointer (4 * 0x13); + if (! grub_drivemap_oldhandler) return GRUB_ERR_NONE; diff --git a/grub-core/commands/i386/pc/sendkey.c b/grub-core/commands/i386/pc/sendkey.c index 184befa..282bb5d 100644 --- a/grub-core/commands/i386/pc/sendkey.c +++ b/grub-core/commands/i386/pc/sendkey.c @@ -216,12 +216,12 @@ static grub_err_t grub_sendkey_postboot (void) { /* For convention: pointer to flags. */ - grub_uint32_t *flags = (grub_uint32_t *) 0x417; + grub_uint32_t *flags = grub_absolute_pointer (0x417); *flags = oldflags; - *((char *) 0x41a) = 0x1e; - *((char *) 0x41c) = 0x1e; + *((char *) grub_absolute_pointer (0x41a)) = 0x1e; + *((char *) grub_absolute_pointer (0x41c)) = 0x1e; return GRUB_ERR_NONE; } @@ -231,13 +231,13 @@ static grub_err_t grub_sendkey_preboot (int noret __attribute__ ((unused))) { /* For convention: pointer to flags. */ - grub_uint32_t *flags = (grub_uint32_t *) 0x417; + grub_uint32_t *flags = grub_absolute_pointer (0x417); oldflags = *flags; /* Set the sendkey. */ - *((char *) 0x41a) = 0x1e; - *((char *) 0x41c) = keylen + 0x1e; + *((char *) grub_absolute_pointer (0x41a)) = 0x1e; + *((char *) grub_absolute_pointer (0x41c)) = keylen + 0x1e; grub_memcpy ((char *) 0x41e, sendkey, 0x20); /* Transform "any ctrl" to "right ctrl" flag. */ diff --git a/grub-core/disk/i386/pc/biosdisk.c b/grub-core/disk/i386/pc/biosdisk.c index 81fd4e8..49e4e8a 100644 --- a/grub-core/disk/i386/pc/biosdisk.c +++ b/grub-core/disk/i386/pc/biosdisk.c @@ -367,7 +367,7 @@ grub_biosdisk_open (const char *name, grub_disk_t disk) if (version) { struct grub_biosdisk_drp *drp - = (struct grub_biosdisk_drp *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; + = (struct grub_biosdisk_drp *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR); /* Clear out the DRP. */ grub_memset (drp, 0, sizeof (*drp)); @@ -654,7 +654,7 @@ grub_disk_biosdisk_fini (void) GRUB_MOD_INIT(biosdisk) { struct grub_biosdisk_cdrp *cdrp - = (struct grub_biosdisk_cdrp *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; + = (struct grub_biosdisk_cdrp *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR); grub_uint8_t boot_drive; if (grub_disk_firmware_is_tainted) diff --git a/grub-core/fs/cbfs.c b/grub-core/fs/cbfs.c index 581215e..8ab7106 100644 --- a/grub-core/fs/cbfs.c +++ b/grub-core/fs/cbfs.c @@ -342,7 +342,7 @@ init_cbfsdisk (void) grub_uint32_t ptr; struct cbfs_header *head; - ptr = *(grub_uint32_t *) 0xfffffffc; + ptr = *((grub_uint32_t *) grub_absolute_pointer (0xfffffffc)); head = (struct cbfs_header *) (grub_addr_t) ptr; grub_dprintf ("cbfs", "head=%p\n", head); diff --git a/grub-core/kern/i386/pc/acpi.c b/grub-core/kern/i386/pc/acpi.c index 297f5d0..0a69eba 100644 --- a/grub-core/kern/i386/pc/acpi.c +++ b/grub-core/kern/i386/pc/acpi.c @@ -27,7 +27,7 @@ grub_machine_acpi_get_rsdpv1 (void) grub_uint8_t *ebda, *ptr; grub_dprintf ("acpi", "Looking for RSDP. Scanning EBDA\n"); - ebda = (grub_uint8_t *) ((* ((grub_uint16_t *) 0x40e)) << 4); + ebda = (grub_uint8_t *) ((* ((grub_uint16_t *) grub_absolute_pointer (0x40e))) << 4); ebda_len = * (grub_uint16_t *) ebda; if (! ebda_len) /* FIXME do we really need this check? */ goto scan_bios; @@ -55,7 +55,7 @@ grub_machine_acpi_get_rsdpv2 (void) grub_uint8_t *ebda, *ptr; grub_dprintf ("acpi", "Looking for RSDP. Scanning EBDA\n"); - ebda = (grub_uint8_t *) ((* ((grub_uint16_t *) 0x40e)) << 4); + ebda = (grub_uint8_t *) ((* ((grub_uint16_t *) grub_absolute_pointer (0x40e))) << 4); ebda_len = * (grub_uint16_t *) ebda; if (! ebda_len) /* FIXME do we really need this check? */ goto scan_bios; diff --git a/grub-core/kern/i386/pc/mmap.c b/grub-core/kern/i386/pc/mmap.c index ef2faa2..53fcf45 100644 --- a/grub-core/kern/i386/pc/mmap.c +++ b/grub-core/kern/i386/pc/mmap.c @@ -143,7 +143,7 @@ grub_machine_mmap_iterate (grub_memory_hook_t hook, void *hook_data) { grub_uint32_t cont = 0; struct grub_machine_mmap_entry *entry - = (struct grub_machine_mmap_entry *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; + = (struct grub_machine_mmap_entry *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR); int e820_works = 0; while (1) diff --git a/grub-core/loader/i386/multiboot_mbi.c b/grub-core/loader/i386/multiboot_mbi.c index ff1a846..11a6e22 100644 --- a/grub-core/loader/i386/multiboot_mbi.c +++ b/grub-core/loader/i386/multiboot_mbi.c @@ -293,7 +293,7 @@ fill_vbe_info (struct multiboot_info *mbi, grub_uint8_t *ptrorig, struct grub_vbe_mode_info_block *mode_info; #if GRUB_MACHINE_HAS_VBE grub_vbe_status_t status; - void *scratch = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; + void *scratch = grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR); status = grub_vbe_bios_get_controller_info (scratch); if (status != GRUB_VBE_STATUS_OK) diff --git a/grub-core/loader/multiboot_mbi2.c b/grub-core/loader/multiboot_mbi2.c index 6d680d6..00a4841 100644 --- a/grub-core/loader/multiboot_mbi2.c +++ b/grub-core/loader/multiboot_mbi2.c @@ -504,7 +504,7 @@ static void fill_vbe_tag (struct multiboot_tag_vbe *tag) { grub_vbe_status_t status; - void *scratch = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; + void *scratch = grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR); tag->type = MULTIBOOT_TAG_TYPE_VBE; tag->size = 0; @@ -577,7 +577,7 @@ retrieve_video_parameters (grub_properly_aligned_t **ptrorig) #if defined (GRUB_MACHINE_PCBIOS) { grub_vbe_status_t status; - void *scratch = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; + void *scratch = grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR); status = grub_vbe_bios_get_mode (scratch); vbe_mode = *(grub_uint32_t *) scratch; if (status != GRUB_VBE_STATUS_OK) diff --git a/grub-core/mmap/i386/pc/mmap.c b/grub-core/mmap/i386/pc/mmap.c index 6ab4f67..b9c5b0a 100644 --- a/grub-core/mmap/i386/pc/mmap.c +++ b/grub-core/mmap/i386/pc/mmap.c @@ -80,13 +80,13 @@ preboot (int noreturn __attribute__ ((unused))) = min (grub_mmap_get_post64 (), 0xfc000000ULL) >> 16; /* Correct BDA. */ - *((grub_uint16_t *) 0x413) = grub_mmap_get_lower () >> 10; + *((grub_uint16_t *) grub_absolute_pointer (0x413)) = grub_mmap_get_lower () >> 10; /* Save old interrupt handlers. */ - grub_machine_mmaphook_int12offset = *((grub_uint16_t *) 0x48); - grub_machine_mmaphook_int12segment = *((grub_uint16_t *) 0x4a); - grub_machine_mmaphook_int15offset = *((grub_uint16_t *) 0x54); - grub_machine_mmaphook_int15segment = *((grub_uint16_t *) 0x56); + grub_machine_mmaphook_int12offset = *((grub_uint16_t *) grub_absolute_pointer (0x48)); + grub_machine_mmaphook_int12segment = *((grub_uint16_t *) grub_absolute_pointer (0x4a)); + grub_machine_mmaphook_int15offset = *((grub_uint16_t *) grub_absolute_pointer (0x54)); + grub_machine_mmaphook_int15segment = *((grub_uint16_t *) grub_absolute_pointer (0x56)); grub_dprintf ("mmap", "hooktarget = %p\n", hooktarget); @@ -94,11 +94,11 @@ preboot (int noreturn __attribute__ ((unused))) grub_memcpy (hooktarget, &grub_machine_mmaphook_start, &grub_machine_mmaphook_end - &grub_machine_mmaphook_start); - *((grub_uint16_t *) 0x4a) = ((grub_addr_t) hooktarget) >> 4; - *((grub_uint16_t *) 0x56) = ((grub_addr_t) hooktarget) >> 4; - *((grub_uint16_t *) 0x48) = &grub_machine_mmaphook_int12 + *((grub_uint16_t *) grub_absolute_pointer (0x4a)) = ((grub_addr_t) hooktarget) >> 4; + *((grub_uint16_t *) grub_absolute_pointer (0x56)) = ((grub_addr_t) hooktarget) >> 4; + *((grub_uint16_t *) grub_absolute_pointer (0x48)) = &grub_machine_mmaphook_int12 - &grub_machine_mmaphook_start; - *((grub_uint16_t *) 0x54) = &grub_machine_mmaphook_int15 + *((grub_uint16_t *) grub_absolute_pointer (0x54)) = &grub_machine_mmaphook_int15 - &grub_machine_mmaphook_start; return GRUB_ERR_NONE; @@ -108,10 +108,10 @@ static grub_err_t preboot_rest (void) { /* Restore old interrupt handlers. */ - *((grub_uint16_t *) 0x48) = grub_machine_mmaphook_int12offset; - *((grub_uint16_t *) 0x4a) = grub_machine_mmaphook_int12segment; - *((grub_uint16_t *) 0x54) = grub_machine_mmaphook_int15offset; - *((grub_uint16_t *) 0x56) = grub_machine_mmaphook_int15segment; + *((grub_uint16_t *) grub_absolute_pointer (0x48)) = grub_machine_mmaphook_int12offset; + *((grub_uint16_t *) grub_absolute_pointer (0x4a)) = grub_machine_mmaphook_int12segment; + *((grub_uint16_t *) grub_absolute_pointer (0x54)) = grub_machine_mmaphook_int15offset; + *((grub_uint16_t *) grub_absolute_pointer (0x56)) = grub_machine_mmaphook_int15segment; return GRUB_ERR_NONE; } diff --git a/grub-core/net/drivers/i386/pc/pxe.c b/grub-core/net/drivers/i386/pc/pxe.c index 997010c..db17186 100644 --- a/grub-core/net/drivers/i386/pc/pxe.c +++ b/grub-core/net/drivers/i386/pc/pxe.c @@ -174,7 +174,7 @@ grub_pxe_recv (struct grub_net_card *dev __attribute__ ((unused))) grub_uint8_t *ptr, *end; struct grub_net_buff *buf; - isr = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; + isr = (void *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR); if (!in_progress) { @@ -256,11 +256,11 @@ grub_pxe_send (struct grub_net_card *dev __attribute__ ((unused)), struct grub_pxe_undi_tbd *tbd; char *buf; - trans = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; + trans = (void *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR); grub_memset (trans, 0, sizeof (*trans)); - tbd = (void *) (GRUB_MEMORY_MACHINE_SCRATCH_ADDR + 128); + tbd = (void *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR + 128); grub_memset (tbd, 0, sizeof (*tbd)); - buf = (void *) (GRUB_MEMORY_MACHINE_SCRATCH_ADDR + 256); + buf = (void *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR + 256); grub_memcpy (buf, pack->data, pack->tail - pack->data); trans->tbd = SEGOFS ((grub_addr_t) tbd); @@ -287,7 +287,7 @@ static grub_err_t grub_pxe_open (struct grub_net_card *dev __attribute__ ((unused))) { struct grub_pxe_undi_open *ou; - ou = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; + ou = (void *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR); grub_memset (ou, 0, sizeof (*ou)); ou->pkt_filter = 4; grub_pxe_call (GRUB_PXENV_UNDI_OPEN, ou, pxe_rm_entry); @@ -382,7 +382,7 @@ GRUB_MOD_INIT(pxe) if (! pxenv) return; - ui = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; + ui = (void *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR); grub_memset (ui, 0, sizeof (*ui)); grub_pxe_call (GRUB_PXENV_UNDI_GET_INFORMATION, ui, pxe_rm_entry); diff --git a/grub-core/term/i386/pc/console.c b/grub-core/term/i386/pc/console.c index d44937c..9403390 100644 --- a/grub-core/term/i386/pc/console.c +++ b/grub-core/term/i386/pc/console.c @@ -238,12 +238,11 @@ grub_console_getkey (struct grub_term_input *term __attribute__ ((unused))) return (regs.eax & 0xff) + (('a' - 1) | GRUB_TERM_CTRL); } -static const struct grub_machine_bios_data_area *bios_data_area = - (struct grub_machine_bios_data_area *) GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR; - static int grub_console_getkeystatus (struct grub_term_input *term __attribute__ ((unused))) { + const struct grub_machine_bios_data_area *bios_data_area = + (struct grub_machine_bios_data_area *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR); /* conveniently GRUB keystatus is modelled after BIOS one. */ return bios_data_area->keyboard_flag_lower & ~0x80; } diff --git a/grub-core/term/i386/pc/vga_text.c b/grub-core/term/i386/pc/vga_text.c index 88fecc5..669d06f 100644 --- a/grub-core/term/i386/pc/vga_text.c +++ b/grub-core/term/i386/pc/vga_text.c @@ -45,15 +45,15 @@ GRUB_MOD_LICENSE ("GPLv3+"); static struct grub_term_coordinate grub_curr_pos; #ifdef __mips__ -#define VGA_TEXT_SCREEN ((grub_uint16_t *) 0xb00b8000) +#define VGA_TEXT_SCREEN ((grub_uint16_t *) grub_absolute_pointer (0xb00b8000)) #define cr_read grub_vga_cr_read #define cr_write grub_vga_cr_write #elif defined (MODE_MDA) -#define VGA_TEXT_SCREEN ((grub_uint16_t *) 0xb0000) +#define VGA_TEXT_SCREEN ((grub_uint16_t *) grub_absolute_pointer (0xb0000)) #define cr_read grub_vga_cr_bw_read #define cr_write grub_vga_cr_bw_write #else -#define VGA_TEXT_SCREEN ((grub_uint16_t *) 0xb8000) +#define VGA_TEXT_SCREEN ((grub_uint16_t *) grub_absolute_pointer (0xb8000)) #define cr_read grub_vga_cr_read #define cr_write grub_vga_cr_write #endif diff --git a/grub-core/term/ns8250.c b/grub-core/term/ns8250.c index 5980183..83b2599 100644 --- a/grub-core/term/ns8250.c +++ b/grub-core/term/ns8250.c @@ -28,7 +28,6 @@ #ifdef GRUB_MACHINE_PCBIOS #include <grub/machine/memory.h> -static const unsigned short *serial_hw_io_addr = (const unsigned short *) GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR; #define GRUB_SERIAL_PORT_NUM 4 #else #include <grub/machine/serial.h> @@ -237,6 +236,9 @@ static struct grub_serial_port com_ports[GRUB_SERIAL_PORT_NUM]; void grub_ns8250_init (void) { +#ifdef GRUB_MACHINE_PCBIOS + const unsigned short *serial_hw_io_addr = (const unsigned short *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR); +#endif unsigned i; for (i = 0; i < GRUB_SERIAL_PORT_NUM; i++) if (serial_hw_io_addr[i]) @@ -272,6 +274,9 @@ grub_ns8250_init (void) grub_port_t grub_ns8250_hw_get_port (const unsigned int unit) { +#ifdef GRUB_MACHINE_PCBIOS + const unsigned short *serial_hw_io_addr = (const unsigned short *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR); +#endif if (unit < GRUB_SERIAL_PORT_NUM && !(dead_ports & (1 << unit))) return serial_hw_io_addr[unit]; diff --git a/grub-core/video/i386/pc/vbe.c b/grub-core/video/i386/pc/vbe.c index 0e65b52..a0bb9af 100644 --- a/grub-core/video/i386/pc/vbe.c +++ b/grub-core/video/i386/pc/vbe.c @@ -514,7 +514,7 @@ grub_vbe_probe (struct grub_vbe_info_block *info_block) /* Use low memory scratch area as temporary storage for VESA BIOS call. */ - vbe_ib = (struct grub_vbe_info_block *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; + vbe_ib = (struct grub_vbe_info_block *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR); /* Prepare info block. */ grub_memset (vbe_ib, 0, sizeof (*vbe_ib)); @@ -574,7 +574,7 @@ grub_vbe_get_preferred_mode (unsigned int *width, unsigned int *height) /* Use low memory scratch area as temporary storage for VESA BIOS calls. */ flat_panel_info = (struct grub_vbe_flat_panel_info *) - (GRUB_MEMORY_MACHINE_SCRATCH_ADDR + sizeof (struct grub_video_edid_info)); + grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR + sizeof (struct grub_video_edid_info)); if (controller_info.version >= 0x200 && (grub_vbe_bios_get_ddc_capabilities (&ddc_level) & 0xff) @@ -676,7 +676,7 @@ grub_vbe_set_video_mode (grub_uint32_t vbe_mode, == GRUB_VBE_MEMORY_MODEL_PACKED_PIXEL) { struct grub_vbe_palette_data *palette - = (struct grub_vbe_palette_data *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; + = (struct grub_vbe_palette_data *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR); unsigned i; /* Make sure that the BIOS can reach the palette. */ diff --git a/include/grub/types.h b/include/grub/types.h index 0a3ff15..5ae0ced 100644 --- a/include/grub/types.h +++ b/include/grub/types.h @@ -340,4 +340,28 @@ static inline void grub_set_unaligned64 (void *ptr, grub_uint64_t val) dd->d = val; } +/* + * The grub_absolute_pointer() macro borrows the idea from Linux kernel of using + * RELOC_HIDE() macro to stop GCC from checking the result of pointer arithmetic + * and also it's conversion to be inside the symbol's boundary [1]. The check + * is sometimes false positive, especially it is controversial to emit the array + * bounds [-Warray-bounds] warning on all hardwired literal pointers since GCC + * 11/12 [2]. Unless a good solution can be settled, for the time being we + * would be in favor of the macro instead of GCC pragmas which cannot match the + * places the warning needs to be ignored in an exact way. + * + * [1] https://lists.linuxcoding.com/kernel/2006-q3/msg17979.html + * [2] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578 + */ +#if defined(__GNUC__) +# define grub_absolute_pointer(val) \ +({ \ + grub_addr_t __ptr; \ + asm ("" : "=r" (__ptr) : "0" ((void *) (val))); \ + (void *) (__ptr); \ +}) +#else +# define grub_absolute_pointer(val) ((void *) (val)) +#endif + #endif /* ! GRUB_TYPES_HEADER */ -- cgit v1.1 ================================================ FILE: packages/tools/grub/patches/grub-0002-lib-reed-solomon-Fix-array-subscript-0-outside-array-bounds.patch ================================================ From 3ce13d974b887338ae972c79b41ff6fc0eee6388 Mon Sep 17 00:00:00 2001 From: Michael Chang <mchang@suse.com> Date: Mon, 28 Mar 2022 15:00:54 +0800 Subject: lib/reed_solomon: Fix array subscript 0 is outside array bounds The grub_absolute_pointer() is a compound expression that can only work within a function. We are out of luck here when the pointer variables require global definition due to ATTRIBUTE_TEXT that have to use fully initialized global definition because of the way linkers work. static gf_single_t * const gf_powx ATTRIBUTE_TEXT = (void *) 0x100000; For the reason given above, use GCC diagnostic pragmas to suppress the array-bounds warning. Signed-off-by: Michael Chang <mchang@suse.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> --- grub-core/lib/reed_solomon.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/grub-core/lib/reed_solomon.c b/grub-core/lib/reed_solomon.c index 82779a2..562bd2e 100644 --- a/grub-core/lib/reed_solomon.c +++ b/grub-core/lib/reed_solomon.c @@ -102,6 +102,11 @@ static gf_single_t errvals[256]; static gf_single_t eqstat[65536 + 256]; #endif +#if __GNUC__ == 12 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Warray-bounds" +#endif + static gf_single_t gf_mul (gf_single_t a, gf_single_t b) { @@ -319,6 +324,10 @@ decode_block (gf_single_t *ptr, grub_size_t s, } } +#if __GNUC__ == 12 +#pragma GCC diagnostic pop +#endif + #if !defined (STANDALONE) static void encode_block (gf_single_t *ptr, grub_size_t s, -- cgit v1.1 ================================================ FILE: packages/tools/grub/patches/grub-gnulib-acprereq-2-64.patch ================================================ --- a/configure.ac 2020-12-18 22:18:04.000000000 +0000 +++ b/configure.ac 2021-01-17 05:55:10.946679960 +0000 @@ -49,7 +49,7 @@ program_prefix="${save_program_prefix}" AM_INIT_AUTOMAKE([1.11]) -AC_PREREQ(2.63) +AC_PREREQ([2.64]) AC_CONFIG_SRCDIR([include/grub/dl.h]) AC_CONFIG_HEADER([config-util.h]) ================================================ FILE: packages/tools/hdparm/package.mk ================================================ # 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) PKG_NAME="hdparm" PKG_VERSION="9.65" PKG_SHA256="d14929f910d060932e717e9382425d47c2e7144235a53713d55a94f7de535a4b" PKG_LICENSE="BSD" PKG_SITE="http://sourceforge.net/projects/hdparm/" PKG_URL="${SOURCEFORGE_SRC}/${PKG_NAME}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Shell utility to access/tune ioctl features of the Linux IDE driver and IDE drives." makeinstall_target() { mkdir -p ${INSTALL}/usr/sbin cp -a ${PKG_BUILD}/hdparm ${INSTALL}/usr/sbin } ================================================ FILE: packages/tools/hdparm/patches/hdparm-9.42-cflags.patch ================================================ diff -Naur hdparm-9.39/Makefile hdparm-9.39.patch/Makefile --- hdparm-9.39/Makefile 2012-01-06 17:05:37.000000000 +0100 +++ hdparm-9.39.patch/Makefile 2012-07-28 05:22:53.271127964 +0200 @@ -13,7 +13,7 @@ CC ?= gcc STRIP ?= strip -CFLAGS := -O2 -W -Wall -Wbad-function-cast -Wcast-align -Wpointer-arith -Wcast-qual -Wshadow -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -fkeep-inline-functions -Wwrite-strings -Waggregate-return -Wnested-externs -Wtrigraphs $(CFLAGS) +CFLAGS := -Wbad-function-cast -Wcast-align -Wpointer-arith -Wcast-qual -Wshadow -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -fkeep-inline-functions -Wwrite-strings -Waggregate-return -Wnested-externs -Wtrigraphs $(CFLAGS) LDFLAGS = -s #LDFLAGS = -s -static ================================================ FILE: packages/tools/hdparm/udev.d/61-cdrom.rules ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # only do anything on block devices which are not removed ACTION!="add|change", GOTO="cdrom_end" # /dev/sr, /dev/sr_mod, /dev/srcutree are not valid KERNEL=="sr|sr_mod|srcutree", GOTO="cdrom_end" # set CDROM speed KERNEL=="sr*", RUN+="/sbin/hdparm -E8 /dev/%k" LABEL="cdrom_end" ================================================ FILE: packages/tools/installer/config/installer.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Disklabel for System and Storage partition DISKLABEL_SYSTEM="System" DISKLABEL_STORAGE="Storage" # Default size of system partition, in MB, eg. 512 PARTSIZE_SYSTEM="@SYSTEM_SIZE@" # Default starting offset for system partition, in sectors (1 sector = 512B), eg. 2048 PARTSIZE_SYSTEM_OFFSET="@SYSTEM_PART_START@" # additional parameters to syslinux SYSLINUX_PARAMETERS="@SYSLINUX_PARAMETERS@" # enable BIOS update function BIOS_UPDATE="no" # BIOS file to program BIOS_FILE="" # location for BIOS backup (with filename) BIOS_BACKUP="" # color scheme to use for Whiptail/Newt # see http://askubuntu.com/questions/776831/whiptail-change-background-color-dynamically-from-magenta WHIPTAIL_COLORS="" ================================================ FILE: packages/tools/installer/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="installer" PKG_VERSION="1" PKG_LICENSE="GPL" PKG_SITE="http://libreelec.tv/" PKG_URL="" PKG_DEPENDS_TARGET="toolchain busybox newt parted e2fsprogs syslinux grub" PKG_LONGDESC="LibreELEC.tv Install manager to install the system on any disk" PKG_TOOLCHAIN="manual" post_install() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/installer ${INSTALL}/usr/bin sed -e "s/@DISTRONAME@/${DISTRONAME}/g" \ -i ${INSTALL}/usr/bin/installer mkdir -p ${INSTALL}/etc find_file_path config/installer.conf cp ${FOUND_PATH} ${INSTALL}/etc sed -e "s/@SYSTEM_SIZE@/${SYSTEM_SIZE}/g" \ -e "s/@SYSTEM_PART_START@/${SYSTEM_PART_START}/g" \ -e "s/@SYSLINUX_PARAMETERS@/${SYSLINUX_PARAMETERS}/g" \ -i ${INSTALL}/etc/installer.conf enable_service installer.service } ================================================ FILE: packages/tools/installer/scripts/installer ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) # some DOCs: # list devices: # cat /proc/partitions | sed -n "s/\ *[0-9][0-9]*\ *[0-9][0-9]*\ *[0-9][0-9]*\ \([a-z]*\)$/\1/p" # list all partitionnumbers from /dev/sda: # parted -m /dev/sda print | grep -v ^/dev | grep -v ^BYT | cut -f1 -d ":" # list device data from /dev/sda: # parted -m /dev/sda print | grep /dev/sda # list mounted partitions: # mount | grep ^/dev # list modelnumber: # parted -m /dev/sda print | grep /dev/sda | cut -f7 -d ":" | sed "s/;//" # list size: # parted -m /dev/sda print | grep /dev/sda | cut -f2 -d ":" # exclude mounted partitions # for i in `cat /proc/mounts | grep ^/dev/ | cut -f1 -d " " | sed "s/[0-9]//"`; do TEST="$TEST `echo "| grep -v $i"`"; done # disable Ctrl+C - can be very dangerous trap '' 2 [ -f /etc/installer.conf ] && . /etc/installer.conf || exit 0 dbglg() { # Acts just like echo cmd, with automatic redirection echo "" >> $LOGFILE echo "#################################################################" >> $LOGFILE echo "# $@" >> $LOGFILE echo "#################################################################" >> $LOGFILE echo "" >> $LOGFILE } log_system_status() { echo "# cat /proc/mounts" cat /proc/mounts echo echo "# df" df echo echo "# df -h" df -h echo echo "# parted -s -m -l" parted -s -m -l echo echo "# blkid" blkid echo echo "# UEFI (if directory exists)" ls -la /sys/firmware/efi echo echo "# Disk sizes (bytes)" grep . /sys/block/*/size echo } get_device_unmount() { # get all unmounted devices # usage: get_devices_unmount # uses: - # provides: DEVICES DEVICES="" DEVICES=$(parted -s -m -l 2>/dev/null | grep -E '^/dev/sd|^/dev/mmcblk|^/dev/nvme' | grep -E -v '^[^:]*rpmb|^[^:]*boot' | cut -f1 -d ":") for i in $(cat /proc/mounts | grep -E '^/dev/sd' | cut -f1 -d " " | sed "s/[0-9].*$//"); do DEVICES=$(echo $DEVICES | sed -e "s|$i||") done for i in $(cat /proc/mounts | grep -E '^/dev/mmcblk' | cut -f1 -d " " | sed "s/p.*$//"); do DEVICES=$(echo $DEVICES | sed -e "s|$i||") done for i in $(cat /proc/mounts | grep -E '^/dev/nvme' | cut -f1 -d " " | sed "s/p.*$//"); do DEVICES=$(echo $DEVICES | sed -e "s|$i||") done } get_partition() { # get all partitions of a specifed device # usage: get_partitions /dev/sda # uses: - # provides: PARTITIONS PARTITIONS=$(parted -s -m $1 print | grep -v ^/dev | grep -v BYT | cut -f1 -d ":") } create_device_list() { # creates device list to use in menus # usage: create_devices_list # uses: get_device_unmount # provides: DEVICE_MODEL, DEVICE_SIZE, DEVICE_LIST, DEVICE_NAME, # DEVICES (get_device_unmount) DEVICE_MODEL="" DEVICE_SIZE="" DEVICE_LIST="" DEVICE_NAME="" get_device_unmount if [ "$DEVICES" = "" ]; then msg_no_device return 1 fi for i in $DEVICES; do DEVICE_MODEL=$(parted -s $i -m print | grep ^$i | cut -f7 -d ":" | sed "s/;//") DEVICE_SIZE=$(parted -s $i -m print | grep ^$i | cut -f2 -d ":") DEVICE_NAME=$(echo $DEVICE_MODEL ${DEVICE_SIZE} | sed 's/ /_/g') DEVICE_LIST="$DEVICE_LIST $i $DEVICE_NAME" done return 0 } do_install_quick() { # show menu MSG_TITLE="QUICK INSTALL MENU" MSG_MENU="\nUse the up/down arrows to select the device you wish to install to.\n\nPlease select a device:" MSG_CANCEL="Back" create_device_list || return whiptail --backtitle "$BACKTITLE" --cancel-button "$MSG_CANCEL" \ $DIALOG_OPTIONS --title "$MSG_TITLE" --menu "$MSG_MENU" 20 50 5 \ $DEVICE_LIST 2> $TMPDIR/device_for_install [ $? -ne 0 ] && return # now we must do everything INSTALL_DEVICE=$(cat "$TMPDIR/device_for_install") INSTALL_DEVICE_FULL=$(echo $DEVICE_LIST | sed "s|.*$INSTALL_DEVICE \([^ ]*\).*|$INSTALL_DEVICE \1|") case $INSTALL_DEVICE in "/dev/mmcblk"*|"/dev/nvme"*) PART1="p1" PART2="p2" ;; *) PART1="1" PART2="2" ;; esac prompt_gpt prompt_backup_unpack # check for confirmation (twice!) MSG_TITLE="Confirmation before installing" MSG_DETAIL="\nIf you continue the contents of the target disk will be wiped out:\n\n$INSTALL_DEVICE_FULL\n\n" DIALOG_OPTIONS="--defaultno" whiptail --backtitle "$BACKTITLE" --title "$MSG_TITLE" \ $DIALOG_OPTIONS --yesno "$MSG_DETAIL" 0 0 [ $? -ne 0 ] && return MSG_TITLE="Confirmation before installing" MSG_DETAIL="\nThis is last chance to abort the installation!\n\nIf you continue the target disk will be wiped out:\n\n$INSTALL_DEVICE_FULL\n\n\n" DIALOG_OPTIONS="--defaultno" whiptail --backtitle "$BACKTITLE" --title "$MSG_TITLE" \ $DIALOG_OPTIONS --yesno "$MSG_DETAIL" 0 0 [ $? -ne 0 ] && return # start the progress bar (whiptail --gauge) { # remove all partitions msg_progress_install "1" "Get all partitions $INSTALL_DEVICE" get_partition $INSTALL_DEVICE 2>>$LOGFILE msg_progress_install "5" "Wiping disk $INSTALL_DEVICE" dd if=/dev/zero of=$INSTALL_DEVICE bs=4096 count=1024 2>>$LOGFILE # create 2 new partitions (first $PARTSIZE_SYSTEM, second rest) msg_progress_install "7" "Creating label on $INSTALL_DEVICE" if [ "$GPT" = "1" ]; then parted -s $INSTALL_DEVICE mklabel gpt >> $LOGFILE 2>&1 else parted -s $INSTALL_DEVICE mklabel msdos >> $LOGFILE 2>&1 fi msg_progress_install "9" "Writing Master Boot Record on $INSTALL_DEVICE" if [ "$GPT" = "1" ]; then cat /usr/share/syslinux/gptmbr.bin > $INSTALL_DEVICE else cat /usr/share/syslinux/mbr.bin > $INSTALL_DEVICE fi partsize_system_start=$PARTSIZE_SYSTEM_OFFSET partsize_system_end=$(((PARTSIZE_SYSTEM * 1024 * 1024 / 512) + partsize_system_start - 1)) partsize_storage_start=$((partsize_system_end + 1)) partsize_storage_end=-1024 msg_progress_install "10" "Creating partition on $INSTALL_DEVICE" if [ "$GPT" = "1" ]; then parted -s $INSTALL_DEVICE unit s mkpart $DISKLABEL_SYSTEM fat16 -- $partsize_system_start $partsize_system_end >> $LOGFILE 2>&1 else parted -s $INSTALL_DEVICE unit s mkpart primary fat16 -- $partsize_system_start $partsize_system_end >> $LOGFILE 2>&1 fi msg_progress_install "13" "Creating partition on $INSTALL_DEVICE" if [ "$GPT" = "1" ]; then parted -s $INSTALL_DEVICE unit s mkpart $DISKLABEL_STORAGE ext4 -- $partsize_storage_start $partsize_storage_end >> $LOGFILE 2>&1 else parted -s $INSTALL_DEVICE unit s mkpart primary ext4 -- $partsize_storage_start $partsize_storage_end >> $LOGFILE 2>&1 fi msg_progress_install "16" "Setup bootflag on partition 1 of $INSTALL_DEVICE" parted -s $INSTALL_DEVICE set 1 boot on >> $LOGFILE 2>&1 if [ "$GPT" = "1" ]; then parted -s $INSTALL_DEVICE set 1 legacy_boot on >> $LOGFILE 2>&1 fi msg_progress_install "20" "Tell the kernel we have a new partition table on $INSTALL_DEVICE" partprobe $INSTALL_DEVICE >> $LOGFILE 2>&1 # create filesystem msg_progress_install "23" "Creating filesystem on ${INSTALL_DEVICE}1" mkfs.vfat -F 16 ${INSTALL_DEVICE}${PART1} >> $LOGFILE 2>&1 msg_progress_install "25" "Set uuid and disklabel $DISKLABEL_SYSTEM on ${INSTALL_DEVICE}${PART1}" dosfslabel ${INSTALL_DEVICE}${PART1} $DISKLABEL_SYSTEM >> $LOGFILE 2>&1 msg_progress_install "28" "Creating filesystem on ${INSTALL_DEVICE}${PART2}" mke2fs -t ext4 -m 0 ${INSTALL_DEVICE}${PART2} >> $LOGFILE 2>&1 msg_progress_install "30" "Set uuid and disklabel $DISKLABEL_STORAGE on ${INSTALL_DEVICE}${PART2}" tune2fs -U random -L $DISKLABEL_STORAGE ${INSTALL_DEVICE}${PART2} >> $LOGFILE 2>&1 UUID_SYSTEM="$(blkid --output udev ${INSTALL_DEVICE}${PART1} | grep ^ID_FS_UUID= | cut -d= -f2)" UUID_STORAGE="$(blkid --output udev ${INSTALL_DEVICE}${PART2} | grep ^ID_FS_UUID= | cut -d= -f2)" echo "" >> $LOGFILE echo "UUID_SYSTEM : ${UUID_SYSTEM}" >> $LOGFILE echo "UUID_STORAGE: ${UUID_STORAGE}" >> $LOGFILE # mount system partition msg_progress_install "35" "Creating $TMPDIR/part1" mkdir -p $TMPDIR/part1 >> $LOGFILE 2>&1 msg_progress_install "40" "Mounting ${INSTALL_DEVICE}${PART1} to $TMPDIR/part1" mount -t vfat ${INSTALL_DEVICE}${PART1} $TMPDIR/part1 >> $LOGFILE 2>&1 # installing syslinux msg_progress_install "50" "Installing syslinux to $TMPDIR/part1" syslinux -i ${INSTALL_DEVICE}${PART1} >> $LOGFILE 2>&1 # install system files msg_progress_install "60" "Installing Kernel" cp "/flash/$IMAGE_KERNEL" $TMPDIR/part1/KERNEL >> $LOGFILE 2>&1 msg_progress_install "65" "Installing System" cp "/flash/$IMAGE_SYSTEM" $TMPDIR/part1/SYSTEM >> $LOGFILE 2>&1 sync # configuring bootloader msg_progress_install "80" "Setup bootloader with boot label = $DISKLABEL_SYSTEM and disk label = $DISKLABEL_STORAGE" mkdir -p $TMPDIR/part1/EFI/BOOT cat << EOF > $TMPDIR/part1/syslinux.cfg DEFAULT linux PROMPT 0 LABEL linux KERNEL /KERNEL APPEND boot=UUID=$UUID_SYSTEM disk=UUID=$UUID_STORAGE $SYSLINUX_PARAMETERS quiet EOF cat << EOF > $TMPDIR/part1/EFI/BOOT/grub.cfg set timeout="0" set default="LibreELEC" menuentry "LibreELEC" { search --set -f /KERNEL linux /KERNEL boot=UUID=$UUID_SYSTEM disk=UUID=$UUID_STORAGE quiet } EOF # uefi boot / hybrid mode cp /usr/share/syslinux/bootx64.efi $TMPDIR/part1/EFI/BOOT cp /usr/share/syslinux/ldlinux.e64 $TMPDIR/part1/EFI/BOOT cp /usr/share/grub/bootia32.efi $TMPDIR/part1/EFI/BOOT sync # umount system partition, remove mountpoint msg_progress_install "85" "Unmount $TMPDIR/part1" umount $TMPDIR/part1 >> $LOGFILE 2>&1 msg_progress_install "87" "Remove $TMPDIR/part1" rmdir $TMPDIR/part1 >> $LOGFILE 2>&1 if [ "$BACKUP_UNPACK" = "1" ]; then # mount storage partition msg_progress_install "89" "Creating $TMPDIR/part2" mkdir -p $TMPDIR/part2 >> $LOGFILE 2>&1 msg_progress_install "90" "Mounting ${INSTALL_DEVICE}${PART2} to $TMPDIR/part2" mount -t ext4 ${INSTALL_DEVICE}${PART2} $TMPDIR/part2 >> $LOGFILE 2>&1 msg_progress_install "92" "Restoring backup" [ -f /flash/backup.tar.bz2 ] && tar -xjf /flash/backup.tar.bz2 -C $TMPDIR/part2 >> $LOGFILE 2>&1 [ -f /flash/backup.zip ] && unzip -qq /flash/backup.zip -d $TMPDIR/part2 >> $LOGFILE 2>&1 sync # umount system partition, remove mountpoint msg_progress_install "97" "Unmount $TMPDIR/part2" umount $TMPDIR/part2 >> $LOGFILE 2>&1 msg_progress_install "100" "Remove $TMPDIR/part2" rmdir $TMPDIR/part2 >> $LOGFILE 2>&1 fi } | whiptail --backtitle "$BACKTITLE" --gauge "Please wait while your system is being setup ..." 6 73 0 # install complete MSG_TITLE="@DISTRONAME@ Install Complete" MSG_DETAIL="You may now remove the install media and reboot.\n" whiptail --backtitle "$BACKTITLE" --title "$MSG_TITLE" --msgbox "$MSG_DETAIL" 7 52 } msg_no_device() { # show a warning dialog if we dont find not mounted devices for install and return to main menu MSG_TITLE="WARNING" MSG_INFOBOX=" No devices were found. " whiptail --backtitle "$BACKTITLE" --title "$MSG_TITLE" --msgbox "$MSG_INFOBOX" 9 73 } msg_progress_install() { # update the whiptail gauge window dbglg "$2" sleep .3 echo XXX echo $1 echo "$2 ..." echo XXX } prompt_gpt() { GPT="0" UEFI="0" # Get size in GB. # 2^41 bytes is the DOS limit (2199023255552 bytes, 2.2TB). Use GUID Partition Table.>= 2200GB INSTALL_DEVICE_SIZE=$(($(cat /sys/block/${INSTALL_DEVICE#/dev/}/size)*512/1000/1000/1000)) if [ "$INSTALL_DEVICE_SIZE" -ge 2200 ] 2>/dev/null; then GPT="1" fi # force gpt + uefi in uefi boot mode if [ -d /sys/firmware/efi ]; then UEFI="1" GPT="1" fi } prompt_backup_unpack() { # Prompt for unpacking backup files to /storage # usage: prompt_backup_unpack # uses: # provides: BACKUP_UNPACK BACKUP_UNPACK="0" if [ -f /flash/backup.tar.bz2 -o -f /flash/backup.zip ]; then MSG_TITLE="Restore backup files" MSG_DETAIL="Restore backup files to storage partition.\nFile backup.tar.bz2 or/and backup.zip exist on\ninstallation USB stick." DIALOG_OPTIONS="--defaultno" if whiptail --backtitle "$BACKTITLE" --title "$MSG_TITLE" $DIALOG_OPTIONS --yesno "$MSG_DETAIL" 0 0; then BACKUP_UNPACK="1" fi fi } menu_main() { # show the mainmenu MSG_TITLE="MAIN MENU" MSG_MENU="\nWelcome to @DISTRONAME@ installation tool! \ \n This tool is used to copy @DISTRONAME@ from the installation media \ to your disk or other device. You'll be up and running in no time! \ Please note that the contents of the disk you choose will be wiped \ out during the installation. \ \n\nPlease select:" MSG_CANCEL="Close" whiptail --backtitle "$BACKTITLE" --cancel-button "$MSG_CANCEL" \ --title "$MSG_TITLE" --menu "$MSG_MENU" 18 73 4 \ 1 "Install @DISTRONAME@" \ 2 "View installation log" \ 3 "Save installation log" \ 4 "Reboot" 2> $TMPDIR/mainmenu case $? in 0) ITEM_MAINMENU=$(cat "$TMPDIR/mainmenu") case $ITEM_MAINMENU in 1) do_install_quick;; 2) logfile_show;; 3) logfile_save;; 4) do_reboot;; esac ;; 1) do_reboot ;; 255) do_poweroff ;; esac } logfile_show() { whiptail --textbox "$LOGFILE" 20 73 --scrolltext --backtitle "$BACKTITLE" } logfile_save() { mount -o remount,rw /flash mkdir -p $(dirname $LOGBACKUP) cp $LOGFILE $LOGBACKUP sync mount -o remount,ro /flash MSG_TITLE="@DISTRONAME@ Log Saved" MSG_DETAIL="Log location: ${LOGBACKUP}\n" whiptail --backtitle "$BACKTITLE" --title "$MSG_TITLE" --msgbox "$MSG_DETAIL" 7 52 } do_reboot() { # reboot on request clear sync reboot -f } do_poweroff() { # powerdown on request clear sync poweroff -f } # setup needed variables OS_VERSION=$(lsb_release) BACKTITLE="@DISTRONAME@ Installer - $OS_VERSION" TMPDIR="/tmp/installer" LOGFILE="$TMPDIR/install.log" LOGBACKUP="/flash/logs/$(date +%Y%m%d%H%M%S).log" export COLORTERM="1" export NEWT_COLORS="$WHIPTAIL_COLORS" IMAGE_KERNEL="KERNEL" IMAGE_SYSTEM="SYSTEM" for arg in $(cat /proc/cmdline); do case $arg in BOOT_IMAGE=*) IMAGE_KERNEL="${arg#*=}" [ "${IMAGE_KERNEL:0:1}" = "/" ] && IMAGE_KERNEL="${IMAGE_KERNEL:1}" ;; SYSTEM_IMAGE=*) IMAGE_SYSTEM="${arg#*=}" [ "${IMAGE_SYSTEM:0:1}" = "/" ] && IMAGE_SYSTEM="${IMAGE_SYSTEM:1}" ;; esac done # prepare temporary directory rm -rf $TMPDIR mkdir -p $TMPDIR #create log file echo "@DISTRONAME@ Installer - $OS_VERSION started at:" > $LOGFILE date >> $LOGFILE dbglg "System status" log_system_status >> $LOGFILE 2>&1 # generate the en_US.UTF-8 locale to enable line drawing mkdir -p $TMPDIR/locale localedef -i en_US -f UTF-8 $TMPDIR/locale/en_US.UTF-8 export LOCPATH=$TMPDIR/locale export LC_ALL=en_US.UTF-8 # main while true; do clear menu_main done # exit cleanly exit 0 ================================================ FILE: packages/tools/installer/system.d/installer.service ================================================ [Unit] Description=XBMC Media Center Requires=installer.target [Service] ExecStart=/usr/bin/installer Type=idle StandardInput=tty-force StandardOutput=inherit StandardError=inherit KillMode=process # Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash # terminates cleanly. KillSignal=SIGHUP [Install] WantedBy=installer.target ================================================ FILE: packages/tools/installer/system.d/installer.target ================================================ [Unit] Description=OpenELEC installer Requires=basic.target After=basic.target Conflicts=rescue.target multi-user.target graphical.target AllowIsolate=yes ================================================ FILE: packages/tools/megatools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) PKG_NAME="megatools" PKG_VERSION="1.10.3" PKG_SHA256="8dc1ca348633fd49de7eb832b323e8dc295f1c55aefb484d30e6475218558bdb" PKG_LICENSE="GPL" PKG_SITE="https://ftp.debian.org/debian/pool/main/m/megatools/megatools_1.10.3.orig.tar.gz" PKG_URL="https://xff.cz/megatools/builds/megatools-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain glib openssl curl" PKG_LONGDESC="Megatools is a collection of programs for accessing Mega.nz service from a command line of your desktop or server." PKG_TOOLCHAIN="configure" PKG_CONFIGURE_OPTS_TARGET="--disable-docs" ================================================ FILE: packages/tools/mkbootimg/package.mk ================================================ # 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="mkbootimg" PKG_VERSION="6668fc24a3130ab003aae9fda95bcd4110617de9" PKG_SHA256="d84870e055414d638a3e7eb4b7a3ebf415899841218f24cb3647d06ecf6ddb17" PKG_LICENSE="GPL" PKG_SITE="https://android.googlesource.com/platform/system/core/+/master/mkbootimg/" PKG_URL="https://github.com/codesnake/mkbootimg/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_LONGDESC="mkbootimg: Creates kernel boot images for Android" makeinstall_host() { mkdir -p ${SYSROOT_PREFIX}/usr/include cp mkbootimg ${TOOLCHAIN}/bin/ } ================================================ FILE: packages/tools/mtools/package.mk ================================================ # 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="mtools" PKG_VERSION="4.0.42" PKG_SHA256="64bfdfde4d82af6b22f3c1c72c3e231cbb618f4c2309cc46f54d16d5502ccf15" PKG_LICENSE="GPL" PKG_SITE="http://www.gnu.org/software/mtools/" PKG_URL="http://ftpmirror.gnu.org/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_HOST="toolchain:host" PKG_LONGDESC="mtools: A collection of utilities to access MS-DOS disks" PKG_TOOLCHAIN="autotools" ================================================ FILE: packages/tools/mtools/patches/mtools-05-fix-install.patch ================================================ removes installing of floppyd, manuals and info should fix occasional mtools installation problems few of us had --- a/Makefile.in 2010-10-17 17:41:09.000000000 +0200 +++ b/Makefile.in 2016-04-28 11:42:28.015052786 +0200 @@ -236,8 +236,8 @@ uninstall-info: cd $(DESTDIR)$(infodir) && rm -f mtools.info* -install: $(DESTDIR)$(bindir)/mtools @BINFLOPPYD@ install-man install-links \ - $(DESTDIR)$(bindir)/mkmanifest install-scripts install-info +install: $(DESTDIR)$(bindir)/mtools install-links \ + $(DESTDIR)$(bindir)/mkmanifest install-scripts uninstall: uninstall-bin uninstall-man uninstall-links \ uninstall-scripts ================================================ FILE: packages/tools/nano/config/nanorc ================================================ include /usr/share/nano/*.nanorc ================================================ FILE: packages/tools/nano/package.mk ================================================ # 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="nano" PKG_VERSION="7.1" PKG_SHA256="57ba751e9b7519f0f6ddee505202e387c75dde440c1f7aa1b9310cc381406836" PKG_LICENSE="GPL" PKG_SITE="https://www.nano-editor.org/" PKG_URL="https://www.nano-editor.org/dist/v${PKG_VERSION%%.*}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain ncurses" PKG_LONGDESC="Nano is an enhanced clone of the Pico text editor." PKG_CONFIGURE_OPTS_TARGET="--disable-utf8 \ --disable-nls \ --disable-libmagic \ --disable-wrapping" post_makeinstall_target() { rm -rf ${INSTALL}/usr/share/nano mkdir -p ${INSTALL}/etc cp -a ${PKG_DIR}/config/* ${INSTALL}/etc/ mkdir -p ${INSTALL}/usr/share/nano for FILE_TYPES in \ css \ html \ java \ javascript \ json \ php \ python \ sh \ xml do cp -a ${PKG_BUILD}/syntax/${FILE_TYPES}.nanorc ${INSTALL}/usr/share/nano/ done } ================================================ FILE: packages/tools/nano/profile.d/52-nano.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) export EDITOR="nano" ================================================ FILE: packages/tools/newt/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="newt" PKG_VERSION="0.52.23" PKG_SHA256="caa372907b14ececfe298f0d512a62f41d33b290610244a58aed07bbc5ada12a" PKG_LICENSE="GPL" PKG_SITE="https://pagure.io/newt" PKG_URL="https://releases.pagure.org/newt/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain slang popt" PKG_LONGDESC="Newt is a programming library for color text mode, widget based user interfaces." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--disable-nls \ --without-python \ --without-tcl" pre_configure_target() { # newt fails to build in subdirs cd ${PKG_BUILD} rm -rf .${TARGET_NAME} } pre_configure_host() { # newt fails to build in subdirs cd ${PKG_BUILD} rm -rf .${HOST_NAME} } ================================================ FILE: packages/tools/plymouth-lite/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="plymouth-lite" PKG_VERSION="0.6.0" PKG_SHA256="fa7b581bdd38c5751668243ff9d2ebaee7c45753358cbb310fb50cfcd3a8081b" PKG_LICENSE="GPL" PKG_SITE="http://www.meego.com" PKG_URL="${DISTRO_SRC}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_INIT="toolchain gcc:init libpng" PKG_LONGDESC="Boot splash screen based on Fedora's Plymouth code" pre_configure_init() { # plymouth-lite dont support to build in subdirs cd ${PKG_BUILD} rm -rf .${TARGET_NAME}-init } makeinstall_init() { mkdir -p ${INSTALL}/usr/bin cp ply-image ${INSTALL}/usr/bin mkdir -p ${INSTALL}/splash find_file_path splash/splash.conf && cp ${FOUND_PATH} ${INSTALL}/splash if [ "${DEVICE}" == "OdroidGoAdvance" ]; then find_file_path "splash/splash-odroidgoa.png" && cp ${FOUND_PATH} ${INSTALL}/splash/splash-1080.png else find_file_path "splash/splash-*.png" && cp ${FOUND_PATH} ${INSTALL}/splash fi } ================================================ FILE: packages/tools/plymouth-lite/patches/plymouth-lite-0.6.0-01-fix-build.patch ================================================ --- plymouth-lite-0.6.0/Makefile~ 2009-07-22 11:22:32.000000000 -0700 +++ plymouth-lite-0.6.0/Makefile 2009-07-22 11:22:32.000000000 -0700 @@ -1,6 +1,6 @@ ply-image: ply-image.c ply-frame-buffer.c Makefile - gcc -O2 -march=core2 -mtune=generic -lm `pkg-config --cflags libpng12` `pkg-config --libs libpng12` ply-image.c ply-frame-buffer.c -o ply-image + $(CC) $(CFLAGS) `pkg-config --cflags libpng` ply-image.c ply-frame-buffer.c -o ply-image -lm `pkg-config --libs libpng` -lm -lz clean: rm -f ply-image *~ gmon.out ================================================ FILE: packages/tools/plymouth-lite/patches/plymouth-lite-0.6.0-02-libpng_1.4.0.patch ================================================ diff -Naur plymouth-lite-0.6.0/ply-image.c plymouth-lite-0.6.0.patch/ply-image.c --- plymouth-lite-0.6.0/ply-image.c 2009-02-19 12:16:36.000000000 +0100 +++ plymouth-lite-0.6.0.patch/ply-image.c 2010-02-08 01:30:05.336856616 +0100 @@ -220,7 +220,7 @@ png_set_palette_to_rgb (png); if ((color_type == PNG_COLOR_TYPE_GRAY) && (bits_per_pixel < 8)) - png_set_gray_1_2_4_to_8 (png); + png_set_expand_gray_1_2_4_to_8 (png); if (png_get_valid (png, info, PNG_INFO_tRNS)) png_set_tRNS_to_alpha (png); ================================================ FILE: packages/tools/plymouth-lite/patches/plymouth-lite-0.6.0-11-cursor.patch ================================================ --- plymouth-lite-0.6.0/ply-image.c~ 2009-03-06 16:20:52.000000000 -0800 +++ plymouth-lite-0.6.0/ply-image.c 2009-03-06 16:20:52.000000000 -0800 @@ -439,7 +439,7 @@ exit_code = 0; -// hide_cursor (); + hide_cursor (); if (argc == 1) image = ply_image_new ("/usr/share/plymouth/splash.png"); ================================================ FILE: packages/tools/plymouth-lite/patches/plymouth-lite-0.6.0-12-resize.patch ================================================ diff -urN plymouth-lite-0.6.0/ply-frame-buffer.c plymouth-lite-0.6.0.change/ply-frame-buffer.c --- plymouth-lite-0.6.0/ply-frame-buffer.c 2009-02-19 19:14:24.000000000 +0800 +++ plymouth-lite-0.6.0.change/ply-frame-buffer.c 2009-06-13 17:44:05.000000000 +0800 @@ -47,41 +47,6 @@ #define PLY_FRAME_BUFFER_DEFAULT_FB_DEVICE_NAME "/dev/fb0" #endif -struct _ply_frame_buffer -{ - char *device_name; - int device_fd; - - char *map_address; - size_t size; - - uint32_t *shadow_buffer; - - uint32_t red_bit_position; - uint32_t green_bit_position; - uint32_t blue_bit_position; - uint32_t alpha_bit_position; - - uint32_t bits_for_red; - uint32_t bits_for_green; - uint32_t bits_for_blue; - uint32_t bits_for_alpha; - - int32_t dither_red; - int32_t dither_green; - int32_t dither_blue; - - unsigned int bytes_per_pixel; - unsigned int row_stride; - - ply_frame_buffer_area_t area; - ply_frame_buffer_area_t area_to_flush; - - void (*flush)(ply_frame_buffer_t *buffer); - - int pause_count; -}; - static bool ply_frame_buffer_open_device (ply_frame_buffer_t *buffer); static void ply_frame_buffer_close_device (ply_frame_buffer_t *buffer); static bool ply_frame_buffer_query_device (ply_frame_buffer_t *buffer); diff -urN plymouth-lite-0.6.0/ply-frame-buffer.h plymouth-lite-0.6.0.change/ply-frame-buffer.h --- plymouth-lite-0.6.0/ply-frame-buffer.h 2009-02-19 17:35:54.000000000 +0800 +++ plymouth-lite-0.6.0.change/ply-frame-buffer.h 2009-06-13 17:31:42.000000000 +0800 @@ -38,6 +38,41 @@ unsigned long height; }; +struct _ply_frame_buffer +{ + char *device_name; + int device_fd; + + char *map_address; + size_t size; + + uint32_t *shadow_buffer; + + uint32_t red_bit_position; + uint32_t green_bit_position; + uint32_t blue_bit_position; + uint32_t alpha_bit_position; + + uint32_t bits_for_red; + uint32_t bits_for_green; + uint32_t bits_for_blue; + uint32_t bits_for_alpha; + + int32_t dither_red; + int32_t dither_green; + int32_t dither_blue; + + unsigned int bytes_per_pixel; + unsigned int row_stride; + + ply_frame_buffer_area_t area; + ply_frame_buffer_area_t area_to_flush; + + void (*flush)(ply_frame_buffer_t *buffer); + + int pause_count; +}; + #define PLY_FRAME_BUFFER_COLOR_TO_PIXEL_VALUE(r,g,b,a) \ (((uint8_t) (CLAMP (a * 255.0, 0.0, 255.0)) << 24) \ | ((uint8_t) (CLAMP (r * 255.0, 0.0, 255.0)) << 16) \ diff -urN plymouth-lite-0.6.0/ply-image.c plymouth-lite-0.6.0.change/ply-image.c --- plymouth-lite-0.6.0/ply-image.c 2009-02-19 19:16:36.000000000 +0800 +++ plymouth-lite-0.6.0.change/ply-image.c 2009-06-13 17:42:52.000000000 +0800 @@ -43,6 +43,7 @@ #include <png.h> #include <linux/fb.h> +#include "ply-frame-buffer.h" #define MIN(a,b) ((a) <= (b)? (a) : (b)) #define MAX(a,b) ((a) >= (b)? (a) : (b)) @@ -464,6 +465,8 @@ return exit_code; } + image = ply_image_resize(image, buffer->area.width, buffer->area.height); + animate_at_time (buffer, image); ply_frame_buffer_close (buffer); ================================================ FILE: packages/tools/plymouth-lite/patches/plymouth-lite-0.6.0-21-16bpp.patch ================================================ --- plymouth-lite-0.6.0/ply-frame-buffer.c 2015-07-02 01:04:37.625076373 +0100 +++ plymouth-lite-0.6.0.patch/ply-frame-buffer.c 2015-07-02 01:04:42.973076293 +0100 @@ -184,6 +184,58 @@ } } +static void +flush_xbgr32 (ply_frame_buffer_t *buffer) +{ + unsigned long x1, y1, x2, y2, x, y; + char *dst, *src; + + x1 = buffer->area_to_flush.x; + y1 = buffer->area_to_flush.y; + x2 = x1 + buffer->area_to_flush.width; + y2 = y1 + buffer->area_to_flush.height; + + for (y = y1; y < y2; y++) + { + dst = &buffer->map_address[(y * buffer->row_stride + x1) * 4]; + src = (char *) &buffer->shadow_buffer[y * buffer->area.width + x1]; + + for (x = x1; x < x2; x++) + { + dst[0] = src[2]; + dst[1] = src[1]; + dst[2] = src[0]; + dst[3] = src[3]; + dst += 4; + src += 4; + } + } +} + +static void +flush_rgb16 (ply_frame_buffer_t *buffer) +{ + unsigned long x1, y1, x2, y2, x, y; + unsigned short *dst; unsigned char *src; + + x1 = buffer->area_to_flush.x; + y1 = buffer->area_to_flush.y; + x2 = x1 + buffer->area_to_flush.width; + y2 = y1 + buffer->area_to_flush.height; + + for (y = y1; y < y2; y++) + { + dst = (unsigned short *)&buffer->map_address[(y * buffer->row_stride + x1) * 2]; + src = (unsigned char *) &buffer->shadow_buffer[y * buffer->area.width + x1]; + + for (x = x1; x < x2; x++) + { + *dst++ = (src[0]>>3) << 0 | (src[1]>>2) << 5 | (src[2]>>3) << 11; + src += 4; + } + } +} + static const char const *p_visual(int visual) { static const char const *visuals[] = @@ -300,6 +352,16 @@ buffer->green_bit_position == 8 && buffer->bits_for_green == 8 && buffer->blue_bit_position == 0 && buffer->bits_for_blue == 8) buffer->flush = flush_xrgb32; + else if (buffer->bytes_per_pixel == 4 && + buffer->red_bit_position == 0 && buffer->bits_for_red == 8 && + buffer->green_bit_position == 8 && buffer->bits_for_green == 8 && + buffer->blue_bit_position == 16 && buffer->bits_for_blue == 8) + buffer->flush = flush_xbgr32; + else if (buffer->bytes_per_pixel == 2 && + buffer->red_bit_position == 11 && buffer->bits_for_red == 5 && + buffer->green_bit_position == 5 && buffer->bits_for_green == 6 && + buffer->blue_bit_position == 0 && buffer->bits_for_blue == 5) + buffer->flush = flush_rgb16; else buffer->flush = flush_generic; ================================================ FILE: packages/tools/plymouth-lite/patches/plymouth-lite-0.6.0-22-link-static.patch ================================================ diff --git a/Makefile b/Makefile index 6ab27ef..17d12a0 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ ply-image: ply-image.c ply-frame-buffer.c Makefile - $(CC) $(CFLAGS) `pkg-config --cflags libpng` ply-image.c ply-frame-buffer.c -o ply-image -lm `pkg-config --libs libpng` -lm -lz + $(CC) $(CFLAGS) -Wl,-Bstatic `pkg-config --cflags libpng` ply-image.c ply-frame-buffer.c -o ply-image `pkg-config --libs libpng` -lz -Wl,-Bdynamic -lc -lm $(LDFLAGS) clean: rm -f ply-image *~ gmon.out @@ -11,4 +11,3 @@ install: ply-image cp ply-image $(DESTDIR)/usr/bin cp splash.png $(DESTDIR)/usr/share/plymouth/splash.png - \ No newline at end of file ================================================ FILE: packages/tools/populatefs/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="populatefs" PKG_VERSION="1.0" PKG_SHA256="e5845404188b5da3afb11229ecb38646cc1562b61400035774dbc237c3b706d2" PKG_LICENSE="GPL" PKG_SITE="https://github.com/lipnitsk/populatefs" PKG_URL="https://github.com/lipnitsk/${PKG_NAME}/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="e2fsprogs:host" PKG_LONGDESC="populatefs: Tool for replacing genext2fs when creating ext4 images" PKG_BUILD_FLAGS="+pic:host" make_host() { make EXTRA_LIBS="-lcom_err -lpthread" } makeinstall_host() { ${STRIP} src/populatefs mkdir -p ${TOOLCHAIN}/sbin cp src/populatefs ${TOOLCHAIN}/sbin } ================================================ FILE: packages/tools/populatefs/patches/fix-compilation-issue.patch ================================================ diff -Nur a/src/mod_path.c b/src/mod_path.c --- a/src/mod_path.c 2016-02-24 04:15:10.000000000 +0100 +++ b/src/mod_path.c 2018-08-22 16:58:11.884462070 +0200 @@ -1,6 +1,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/sysmacros.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> ================================================ FILE: packages/tools/procps-ng/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="procps-ng" PKG_VERSION="3.3.17" PKG_SHA256="8374d281f91e5fc9bb9ea8dc991b25331e3a2b0299b46f22c633f7fb6bcb0764" PKG_LICENSE="GPL" PKG_SITE="https://gitlab.com/procps-ng/procps" 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 \ ac_cv_func_realloc_0_nonnull=yes \ --disable-shared \ --disable-modern-top \ --enable-static" PKG_MAKE_OPTS_TARGET="free top/top proc/libprocps.la proc/libprocps.pc" PKG_MAKEINSTALL_OPTS_TARGET="install-libLTLIBRARIES install-pkgconfigDATA install-proc_libprocps_la_includeHEADERS" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -P ${PKG_BUILD}/.${TARGET_NAME}/free ${INSTALL}/usr/bin cp -P ${PKG_BUILD}/.${TARGET_NAME}/top/top ${INSTALL}/usr/bin make DESTDIR=${SYSROOT_PREFIX} -j1 ${PKG_MAKEINSTALL_OPTS_TARGET} } ================================================ FILE: packages/tools/qemu/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="qemu" PKG_VERSION="7.2.0" PKG_SHA256="5b49ce2687744dad494ae90a898c52204a3406e84d072482a1e1be854eeb2157" PKG_LICENSE="GPL" PKG_SITE="https://www.qemu.org" PKG_URL="https://download.qemu.org/qemu-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="toolchain:host glib:host pixman:host Python3:host zlib:host" PKG_LONGDESC="QEMU is a generic and open source machine emulator and virtualizer." PKG_TOOLCHAIN="configure" pre_configure_host() { HOST_CONFIGURE_OPTS="\ --bindir=${TOOLCHAIN}/bin \ --extra-cflags=-I${TOOLCHAIN}/include \ --extra-ldflags=-L${TOOLCHAIN}/lib \ --libexecdir=${TOOLCHAIN}/lib \ --localstatedir=${TOOLCHAIN}/var \ --prefix=${TOOLCHAIN} \ --sbindir=${TOOLCHAIN}/sbin \ --sysconfdir=${TOOLCHAIN}/etc \ --enable-tools \ --enable-malloc=system \ --disable-attr \ --disable-auth-pam \ --disable-blobs \ --disable-capstone \ --disable-curl \ --disable-debug-info \ --disable-debug-mutex \ --disable-debug-tcg \ --disable-docs \ --disable-gcrypt \ --disable-gnutls \ --disable-system \ --disable-vnc \ --disable-werror \ --disable-xkbcommon \ --disable-zstd \ --target-list=$TARGET_ARCH-linux-user" } makeinstall_host() { mkdir -p $TOOLCHAIN/bin cp ${PKG_BUILD}/.${HOST_NAME}/qemu-img ${TOOLCHAIN}/bin cp ${PKG_BUILD}/.${HOST_NAME}/qemu-${TARGET_ARCH} ${TOOLCHAIN}/bin } ================================================ FILE: packages/tools/rkbin/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rkbin" if [ "$DEVICE" == "OdroidGoAdvance" ] || [ "$DEVICE" == "GameForce" ]; then PKG_VERSION="5e54e6c0bbc0141985aca17adcebf3692cdc7f78" PKG_SHA256="39289966b39c7bd5b2e5031d12f071e1aa80b80dc83c74b8658b3c119b6d5fd5" else PKG_VERSION="b0c100f1a260d807df450019774993c761beb79d" PKG_SHA256="c6ebf8ab556e071e3b067540e95aecff650143f0c97e129cd40c837a4f11a881" fi PKG_ARCH="arm aarch64" PKG_LICENSE="nonfree" PKG_SITE="https://github.com/rockchip-linux/rkbin" PKG_URL="https://github.com/rockchip-linux/rkbin/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="rkbin: Rockchip Firmware and Tool Binaries" PKG_TOOLCHAIN="manual" ================================================ FILE: packages/tools/rpi-eeprom/config/rpi-eeprom-update ================================================ # Use direct path to firmware as update script doesn't dereference sym links. FIRMWARE_ROOT="/usr/lib/kernel-overlays/base/lib/firmware/raspberrypi/bootloader" FIRMWARE_BACKUP_DIR="/storage/.config/rpifw-backup" BOOTFS=${BOOTFS:-/flash} ================================================ FILE: packages/tools/rpi-eeprom/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rpi-eeprom" PKG_VERSION="8855da988935f0c09ed4cc772103d4c5408a1afb" PKG_SHA256="8e41bd0b9d01526a38882a6a73fe78a5460a5dfa5d89ba98f9ed61ab14bdad1d" PKG_LICENSE="BSD-3/custom" PKG_SITE="https://github.com/raspberrypi/rpi-eeprom" PKG_URL="https://github.com/raspberrypi/rpi-eeprom/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="pciutils" PKG_LONGDESC="rpi-eeprom: firmware, config and scripts to update RPi4 SPI bootloader" PKG_TOOLCHAIN="manual" makeinstall_target() { if [ "${DEVICE}" = "RPi4" ]; then _variant="2711" else _variant="2712" fi DESTDIR=${INSTALL}/$(get_kernel_overlay_dir)/lib/firmware/raspberrypi/bootloader-${_variant} mkdir -p ${DESTDIR} _dirs="default latest" for _maindir in ${_dirs}; do for _dir in ${PKG_BUILD}/firmware-${_variant}/${_maindir} ${PKG_BUILD}/firmware-${_variant}/${_maindir}-*; do [ -d "${_dir}" ] || continue _basedir="$(basename "${_dir}")" mkdir -p ${DESTDIR}/${_basedir} cp -PRv ${_dir}/recovery.bin ${DESTDIR}/${_basedir} # Bootloader SPI PKG_FW_FILE="$(ls -1 /${_dir}/pieeprom-* 2>/dev/null | tail -1)" [ -n "${PKG_FW_FILE}" ] && cp -PRv "${PKG_FW_FILE}" ${DESTDIR}/${_basedir} if [ "${DEVICE}" = "RPi4" ]; then # VIA USB3 PKG_FW_FILE="$(ls -1 ${_dir}/vl805-*.bin 2>/dev/null | tail -1)" [ -n "${PKG_FW_FILE}" ] && cp -PRv "${PKG_FW_FILE}" ${DESTDIR}/${_basedir} fi done done # also create legacy naming symlinks ln -s default ${DESTDIR}/critical ln -s latest ${DESTDIR}/stable mkdir -p ${INSTALL}/usr/bin cp -PRv ${PKG_DIR}/source/rpi-eeprom-update ${INSTALL}/usr/bin cp -PRv ${PKG_BUILD}/rpi-eeprom-update ${INSTALL}/usr/bin/.rpi-eeprom-update.real cp -PRv ${PKG_BUILD}/rpi-eeprom-config ${INSTALL}/usr/bin cp -PRv ${PKG_BUILD}/rpi-eeprom-digest ${INSTALL}/usr/bin mkdir -p ${INSTALL}/etc/default cp -PRv ${PKG_DIR}/config/* ${INSTALL}/etc/default } ================================================ FILE: packages/tools/rpi-eeprom/source/rpi-eeprom-update ================================================ #!/bin/sh # If read-only then mount writeable, and restore read-only on exit # This means we don't restore read-only if /flash is already writeable if [ -n "$(grep " /flash " /proc/mounts | grep "[[:space:]]ro[[:space:],]")" ]; then trap "mount -o remount,ro /flash" EXIT mount -o remount,rw /flash fi sh /usr/bin/.rpi-eeprom-update.real $@ ================================================ FILE: packages/tools/splash-image/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020 present Team CoreELEC (https://coreelec.org) PKG_NAME="splash-image" PKG_VERSION="82aaea90d1845e0988371791b5e568b8122ca294" PKG_SHA256="febccc1e6b6a7d5b79ca7e283a1c09ed965001373ce6956e7d3057aca4c92a65" PKG_LICENSE="GPL" PKG_SITE="https://coreelec.org" PKG_URL="https://github.com/CoreELEC/splash-image/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_INIT="toolchain gcc:init glibc libspng zlib" PKG_LONGDESC="Boot splash screen supporting animation by single RGBA png files" makeinstall_init() { mkdir -p $INSTALL/usr/bin cp splash-image $INSTALL/usr/bin mkdir -p $INSTALL/splash/progress find_file_path "splash/${DEVICE}/splash-*.png" && cp ${FOUND_PATH} $INSTALL/splash || : find_file_path "splash/${DEVICE}/progress/splash-*" && cp ${FOUND_PATH} $INSTALL/splash/progress || : } ================================================ FILE: packages/tools/syslinux/package.mk ================================================ # 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) PKG_NAME="syslinux" PKG_VERSION="6.03" PKG_SHA256="26d3986d2bea109d5dc0e4f8c4822a459276cf021125e8c9f23c3cca5d8c850e" PKG_ARCH="x86_64" PKG_LICENSE="GPL" PKG_SITE="http://syslinux.zytor.com/" PKG_URL="http://www.kernel.org/pub/linux/utils/boot/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="util-linux:host" PKG_DEPENDS_TARGET="toolchain util-linux e2fsprogs syslinux:host" PKG_LONGDESC="The SYSLINUX project covers lightweight linux bootloaders." pre_configure_target() { PKG_MAKE_OPTS_TARGET="CC=${CC} AR=${AR} RANLIB=${RANLIB} installer" # Unset all compiler FLAGS unset CFLAGS unset CPPFLAGS unset CXXFLAGS unset LDFLAGS } pre_build_target() { mkdir -p ${PKG_BUILD}/.${TARGET_NAME} cp -RP ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME} } pre_build_host() { mkdir -p ${PKG_BUILD}/.${HOST_NAME} cp -RP ${PKG_BUILD}/* ${PKG_BUILD}/.${HOST_NAME} } pre_make_target() { cd .${TARGET_NAME} } pre_make_host() { cd .${HOST_NAME} } make_host() { make CC=${CC} \ AR=${AR} \ RANLIB=${RANLIB} \ CFLAGS="-I${TOOLCHAIN}/include -I${PKG_BUILD}/libinstaller -I${PKG_BUILD}/libfat -I${PKG_BUILD}/bios -I${PKG_BUILD}/utils -fomit-frame-pointer -D_FILE_OFFSET_BITS=64" \ LDFLAGS="-L${TOOLCHAIN}/lib" \ installer } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp bios/linux/syslinux ${TOOLCHAIN}/bin cp bios/mtools/syslinux ${TOOLCHAIN}/bin/syslinux.mtools mkdir -p ${TOOLCHAIN}/share/syslinux cp bios/mbr/mbr.bin ${TOOLCHAIN}/share/syslinux cp bios/mbr/gptmbr.bin ${TOOLCHAIN}/share/syslinux cp efi64/efi/syslinux.efi ${TOOLCHAIN}/share/syslinux/bootx64.efi cp efi64/com32/elflink/ldlinux/ldlinux.e64 ${TOOLCHAIN}/share/syslinux } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp bios/linux/syslinux ${INSTALL}/usr/bin ${STRIP} ${INSTALL}/usr/bin/syslinux mkdir -p ${INSTALL}/usr/share/syslinux cp bios/mbr/mbr.bin ${INSTALL}/usr/share/syslinux cp bios/mbr/gptmbr.bin ${INSTALL}/usr/share/syslinux cp efi64/efi/syslinux.efi ${INSTALL}/usr/share/syslinux/bootx64.efi cp efi64/com32/elflink/ldlinux/ldlinux.e64 ${INSTALL}/usr/share/syslinux } ================================================ FILE: packages/tools/syslinux/patches/syslinux-0001-fix-build-with-glibc_2.28.patch ================================================ From 1a74985b2a404639b08882c57f3147229605dfd5 Mon Sep 17 00:00:00 2001 From: Mike Frysinger <vapier@gentoo.org> Date: Tue, 19 Apr 2016 06:50:31 -0400 Subject: [PATCH] extlinux: pull in sys/sysmacros.h for major/minor/makedev These functions are defined in sys/sysmacros.h, so add the include to main.c. This is already handled correctly in mountinfo.c. Otherwise we get build failures like: main.o: In function 'find_device_sysfs': extlinux/main.c:1131: undefined reference to 'minor' Signed-off-by: Mike Frysinger <vapier@gentoo.org> Signed-off-by: Gene Cumm <gene.cumm@gmail.com> --- extlinux/main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/extlinux/main.c b/extlinux/main.c index a7ebd49..ebff7ea 100644 --- a/extlinux/main.c +++ b/extlinux/main.c @@ -38,6 +38,7 @@ #include <sysexits.h> #include <sys/ioctl.h> #include <sys/stat.h> +#include <sys/sysmacros.h> #include <sys/types.h> #include <sys/mount.h> #include <sys/vfs.h> -- 2.10.5.GIT ================================================ FILE: packages/tools/syslinux/patches/syslinux-0002-fix-build-with-glibc_2.36.patch ================================================ --- a/libinstaller/linuxioctl.h 2022-07-17 12:45:43.459729359 +0000 +++ b/libinstaller/linuxioctl.h 2022-07-17 12:58:50.204815753 +0000 @@ -16,7 +16,13 @@ #include <linux/fd.h> /* Floppy geometry */ #include <linux/hdreg.h> /* Hard disk geometry */ -#include <linux/fs.h> /* FIGETBSZ, FIBMAP, FS_IOC_* */ +#define FIBMAP _IO(0x00,1) /* bmap access */ +#define FIGETBSZ _IO(0x00,2) /* get the block size used for bmap */ + +#define FS_IOC_GETFLAGS _IOR('f', 1, long) +#define FS_IOC_SETFLAGS _IOW('f', 2, long) + +#define FS_IMMUTABLE_FL 0x00000010 /* Immutable file */ #undef SECTOR_SIZE /* Defined in msdos_fs.h for no good reason */ #undef SECTOR_BITS ================================================ FILE: packages/tools/texturecache.py/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="texturecache.py" PKG_VERSION="2.5.4" PKG_SHA256="0717c2e62dc3f809e8754be2c83d2c7d0f92188741eb425d5377c1d326d25276" PKG_LICENSE="GPL" PKG_SITE="https://github.com/MilhouseVH/texturecache.py" PKG_URL="https://github.com/MilhouseVH/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="The Swiss Army knife for Kodi" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -PRv texturecache.py ${INSTALL}/usr/bin cp -PRv tools/mklocal.py ${INSTALL}/usr/bin chmod +x ${INSTALL}/usr/bin/* } ================================================ FILE: packages/tools/u-boot/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="u-boot" PKG_VERSION="2022.10" PKG_SHA256="50b4482a505bc281ba8470c399a3c26e145e29b23500bc35c50debd7fa46bdf8" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://ftp.denx.de/pub/u-boot/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain openssl:host pkg-config:host Python3:host swig:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_STAMP="${UBOOT_SYSTEM} ${UBOOT_TARGET}" [ -n "${KERNEL_TOOLCHAIN}" ] && PKG_DEPENDS_TARGET+=" gcc-${KERNEL_TOOLCHAIN}:host" if [ -n "${UBOOT_FIRMWARE}" ]; then PKG_DEPENDS_TARGET+=" ${UBOOT_FIRMWARE}" PKG_DEPENDS_UNPACK+=" ${UBOOT_FIRMWARE}" fi PKG_NEED_UNPACK="${PROJECT_DIR}/${PROJECT}/bootloader" [ -n "${DEVICE}" ] && PKG_NEED_UNPACK+=" ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/bootloader" post_patch() { if [ -n "${UBOOT_SYSTEM}" ] && find_file_path bootloader/config; then PKG_CONFIG_FILE="${PKG_BUILD}/configs/$(${ROOT}/${SCRIPTS}/uboot_helper ${PROJECT} ${DEVICE} ${UBOOT_SYSTEM} config)" if [ -f "${PKG_CONFIG_FILE}" ]; then cat ${FOUND_PATH} >> "${PKG_CONFIG_FILE}" fi fi } make_target() { # U-Boot needs host openssl for tools - make sure it finds right one # setup_pkg_config_host is required setup_pkg_config_host if [ -z "${UBOOT_SYSTEM}" ]; then echo "UBOOT_SYSTEM must be set to build an image" echo "see './scripts/uboot_helper' for more information" else [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 DEBUG=${PKG_DEBUG} CROSS_COMPILE="${TARGET_KERNEL_PREFIX}" LDFLAGS="" ARCH=arm make mrproper [ -n "${UBOOT_FIRMWARE}" ] && find_file_path bootloader/firmware && . ${FOUND_PATH} DEBUG=${PKG_DEBUG} CROSS_COMPILE="${TARGET_KERNEL_PREFIX}" LDFLAGS="" ARCH=arm make HOSTCC="${HOST_CC}" HOSTCFLAGS="-I${TOOLCHAIN}/include" HOSTLDFLAGS="${HOST_LDFLAGS}" $(${ROOT}/${SCRIPTS}/uboot_helper ${PROJECT} ${DEVICE} ${UBOOT_SYSTEM} config) DEBUG=${PKG_DEBUG} CROSS_COMPILE="${TARGET_KERNEL_PREFIX}" LDFLAGS="" ARCH=arm _python_sysroot="${TOOLCHAIN}" _python_prefix=/ _python_exec_prefix=/ make ${UBOOT_TARGET} HOSTCC="${HOST_CC}" HOSTCFLAGS="-I${TOOLCHAIN}/include" HOSTLDFLAGS="${HOST_LDFLAGS}" HOSTSTRIP="true" CONFIG_MKIMAGE_DTC_PATH="scripts/dtc/dtc" fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/share/bootloader # Only install u-boot.img et al when building a board specific image if [ -n "${UBOOT_SYSTEM}" ]; then find_file_path bootloader/install && . ${FOUND_PATH} fi # Always install the update script find_file_path bootloader/update.sh && cp -av ${FOUND_PATH} ${INSTALL}/usr/share/bootloader # Always install the canupdate script if find_file_path bootloader/canupdate.sh; then cp -av ${FOUND_PATH} ${INSTALL}/usr/share/bootloader sed -e "s/@PROJECT@/${DEVICE:-${PROJECT}}/g" \ -i ${INSTALL}/usr/share/bootloader/canupdate.sh fi } ================================================ FILE: packages/tools/u-boot-script/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="u-boot-script" PKG_VERSION="1.0" PKG_LICENSE="GPL" PKG_DEPENDS_TARGET="u-boot-tools:host" PKG_TOOLCHAIN="manual" PKG_LONGDESC="Compile scripts for u-boot environment." PKG_NEED_UNPACK="${PROJECT_DIR}/${PROJECT}/bootloader" [ -n "${DEVICE}" ] && PKG_NEED_UNPACK+=" ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/bootloader" make_target() { if find_dir_path bootloader/scripts; then for src in ${FOUND_PATH}/*.src; do mkimage -A ${TARGET_KERNEL_ARCH} -O linux -T script -C none -d "${src}" "$(basename ${src} .src)" done fi } makeinstall_target() { mkdir -p ${INSTALL}/usr/share/bootloader cp -a ${PKG_BUILD}/* ${INSTALL}/usr/share/bootloader/ } ================================================ FILE: packages/tools/u-boot-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="u-boot-tools" PKG_VERSION="$(get_pkg_version u-boot)" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="" PKG_DEPENDS_HOST="ccache:host bison:host flex:host openssl:host pkg-config:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_DEPENDS_UNPACK+=" u-boot" unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/u-boot/u-boot-${PKG_VERSION}.tar.gz -C ${PKG_BUILD} } make_host() { make qemu-x86_64_defconfig HOSTCC="${HOST_CC}" HOSTCFLAGS="-I${TOOLCHAIN}/include" HOSTLDFLAGS="${HOST_LDFLAGS}" make tools-only HOSTCC="${HOST_CC}" HOSTCFLAGS="-I${TOOLCHAIN}/include" HOSTLDFLAGS="${HOST_LDFLAGS}" } make_target() { : # host-only package } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp tools/mkimage ${TOOLCHAIN}/bin } ================================================ FILE: packages/virtual/alsa/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="alsa" PKG_VERSION="" PKG_LICENSE="GPL" PKG_SITE="http://www.alsa-project.org/" PKG_URL="" PKG_DEPENDS_TARGET="toolchain alsa-lib alsa-utils alsa-topology-conf alsa-ucm-conf" PKG_SECTION="virtual" PKG_LONGDESC="Matapackage to install all alsa components." ================================================ FILE: packages/virtual/autotools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="autotools" PKG_VERSION="" PKG_LICENSE="GPL" PKG_SITE="http://www.openelec.tv" PKG_URL="" PKG_DEPENDS_HOST="ccache:host autoconf:host automake:host intltool:host libtool:host autoconf-archive:host" PKG_SECTION="virtual" PKG_LONGDESC="autotools: Metapackage" ================================================ FILE: packages/virtual/corefonts/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="corefonts" PKG_VERSION="" PKG_LICENSE="GPL" PKG_SITE="http://www.openelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="virtual" PKG_LONGDESC="corefonts is a Metapackage for installing fonts" if [ -n "${CUSTOM_FONTS}" ]; then PKG_DEPENDS_TARGET+=" ${CUSTOM_FONTS}" else PKG_DEPENDS_TARGET+=" liberation-fonts-ttf" fi ================================================ FILE: packages/virtual/debug/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="debug" PKG_VERSION="" PKG_LICENSE="GPL" PKG_SITE="http://www.openelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain gdb edid-decode memtester strace" PKG_SECTION="virtual" PKG_LONGDESC="debug is a Metapackage for installing debugging tools" # configure GPU drivers and dependencies: get_graphicdrivers if [ "${VDPAU_SUPPORT}" = "yes" -a "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" vdpauinfo" fi if [ "${VAAPI_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" libva-utils" fi if [ "${VALGRIND}" = "yes" ]; then PKG_DEPENDS_TARGET+=" valgrind" fi if [ "${REMOTE_GDB}" = "yes" ]; then PKG_DEPENDS_TARGET+=" gdb:host" fi ================================================ FILE: packages/virtual/image/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="image" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" PKG_DEPENDS_TARGET="toolchain squashfs-tools:host dosfstools:host fakeroot:host kmod:host mtools:host populatefs:host libc gcc linux linux-drivers linux-firmware ${BOOTLOADER} busybox util-linux corefonts network misc-packages debug exfatprogs" PKG_SECTION="virtual" PKG_LONGDESC="Root package used to build and create complete image" # Bash is default shell PKG_DEPENDS_TARGET+=" bash" # Graphic support [ ! "${DISPLAYSERVER}" = "no" ] && PKG_DEPENDS_TARGET+=" ${DISPLAYSERVER}" # Multimedia support [ ! "${MEDIACENTER}" = "no" ] && PKG_DEPENDS_TARGET+=" mediacenter" # Sound support [ "${ALSA_SUPPORT}" = "yes" ] && PKG_DEPENDS_TARGET+=" alsa" [ "${PULSEAUDIO_SUPPORT}" = "yes" ] && PKG_DEPENDS_TARGET+=" pulseaudio" [ "${PIPEWIRE_SUPPORT}" = "yes" ] && PKG_DEPENDS_TARGET+=" pipewire wireplumber" if [ "${PULSEAUDIO_SUPPORT}" = "yes" -a "${PIPEWIRE_SUPPORT}" = "yes" ]; then die "PULSEAUDIO_SUPPORT and PIPEWIRE_SUPPORT cannot be enabled together" fi # Automounter support [ "${UDEVIL}" = "yes" ] && PKG_DEPENDS_TARGET+=" udevil" # EXFAT support [ "$EXFAT" = "yes" ] && PKG_DEPENDS_TARGET+=" exfat" # HFS filesystem tools [ "${HFSTOOLS}" = "yes" ] && PKG_DEPENDS_TARGET+=" diskdev_cmds" # NTFS 3G support [ "${NTFS3G}" = "yes" ] && PKG_DEPENDS_TARGET+=" ntfs-3g_ntfsprogs" # Remote support [ "${REMOTE_SUPPORT}" = "yes" ] && PKG_DEPENDS_TARGET+=" remote" # Virtual image creation support [ "${PROJECT}" = "Generic" ] && PKG_DEPENDS_TARGET+=" virtual" # Installer support [ "${INSTALLER_SUPPORT}" = "yes" ] && PKG_DEPENDS_TARGET+=" installer" # Devtools... (not for Release) [ "${TESTING}" = "yes" ] && PKG_DEPENDS_TARGET+=" testing" # OEM packages [ "${OEM_SUPPORT}" = "yes" ] && PKG_DEPENDS_TARGET+=" oem" true ================================================ FILE: packages/virtual/initramfs/config/initramfs.conf ================================================ dir /dev 0755 0 0 nod /dev/console 0600 0 0 c 5 1 dir usr 0755 0 0 slink lib usr/lib 0777 0 0 slink bin usr/bin 0777 0 0 slink sbin usr/sbin 0777 0 0 ================================================ FILE: packages/virtual/initramfs/package.mk ================================================ # 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) # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) PKG_NAME="initramfs" PKG_VERSION="" PKG_LICENSE="GPL" PKG_SITE="http://www.openelec.tv" PKG_URL="" PKG_DEPENDS_INIT="libc:init busybox:init splash-image:init util-linux:init e2fsprogs:init dosfstools:init terminus-font:init bkeymaps:init fakeroot:host" PKG_DEPENDS_TARGET="toolchain initramfs:init" PKG_SECTION="virtual" PKG_LONGDESC="Metapackage for installing initramfs" if [ "${ISCSI_SUPPORT}" = yes ]; then PKG_DEPENDS_INIT+=" open-iscsi:init" fi if [ "${INITRAMFS_PARTED_SUPPORT}" = yes ]; then PKG_DEPENDS_INIT+=" parted:init" fi for i in ${PKG_DEPENDS_INIT}; do PKG_NEED_UNPACK+=" $(get_pkg_directory ${i})" done post_install() { if [ "$BUILD_ANDROID_BOOTIMG" = "yes" ]; then ( cd $BUILD/initramfs ln -sfn /usr/lib $BUILD/initramfs/lib ln -sfn /usr/bin $BUILD/initramfs/bin ln -sfn /usr/sbin $BUILD/initramfs/sbin mkdir -p $BUILD/image fakeroot -- sh -c \ "mkdir -p dev; mknod -m 600 dev/console c 5 1; find . | cpio -H newc -ov -R 0:0 > $BUILD/image/initramfs.cpio" ) fi } ================================================ FILE: packages/virtual/libc/package.mk ================================================ # 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="libc" PKG_VERSION="" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain glibc tz libidn2" PKG_DEPENDS_INIT="toolchain glibc:init" PKG_SECTION="virtual" PKG_LONGDESC="Meta package for installing various tools and libs needed for libc" if [ "${ARM_MEM_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" arm-mem" PKG_DEPENDS_INIT+=" arm-mem:init" fi ================================================ FILE: packages/virtual/linux-drivers/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="linux-drivers" PKG_VERSION="" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain ${ADDITIONAL_DRIVERS}" PKG_SECTION="virtual" PKG_LONGDESC="linux-drivers is a Meta package to install additional drivers" if [ "${DRIVER_ADDONS_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${DRIVER_ADDONS} driverselect" fi ================================================ FILE: packages/virtual/linux-firmware/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="linux-firmware" PKG_VERSION="" PKG_LICENSE="GPL" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain ${FIRMWARE}" PKG_SECTION="virtual" PKG_LONGDESC="linux-firmware is a meta-package to install various free firmware drivers" ================================================ FILE: packages/virtual/mediacenter/package.mk ================================================ # 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) PKG_NAME="mediacenter" PKG_VERSION="" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain ${MEDIACENTER}" PKG_SECTION="virtual" PKG_LONGDESC="Mediacenter: Metapackage" if [ "${MEDIACENTER}" = "kodi" ]; then PKG_DEPENDS_TARGET+=" ${MEDIACENTER}-theme-${SKIN_DEFAULT}" for i in ${SKINS}; do PKG_DEPENDS_TARGET+=" ${MEDIACENTER}-theme-${i}" done # python-based tool for kodi management PKG_DEPENDS_TARGET+=" texturecache.py" # some python stuff needed for various addons PKG_DEPENDS_TARGET="${PKG_DEPENDS_TARGET} Pillow \ simplejson \ pycryptodome" # settings addon if [ -n "${DISTRO_PKG_SETTINGS}" ]; then PKG_DEPENDS_TARGET+=" ${DISTRO_PKG_SETTINGS}" fi # other packages PKG_DEPENDS_TARGET+=" xmlstarlet" if [ "${JOYSTICK_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" peripheral.joystick" fi get_graphicdrivers if listcontains "${GRAPHIC_DRIVERS}" "(crocus|i915|iris)"; then PKG_DEPENDS_TARGET+=" intel-vaapi-driver media-driver" fi if listcontains "${GRAPHIC_DRIVERS}" "nvidia-ng"; then PKG_DEPENDS_TARGET+=" nvidia-vaapi-driver" fi fi ================================================ FILE: packages/virtual/misc-packages/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="misc-packages" PKG_VERSION="" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain ${ADDITIONAL_PACKAGES}" PKG_SECTION="virtual" PKG_LONGDESC="misc-packages: Metapackage for miscellaneous packages" # Entware support if [ "$ENTWARE_SUPPORT" = "yes" ]; then ln -sf /storage/.opt $INSTALL/opt PKG_DEPENDS_TARGET+=" entware" fi ================================================ FILE: packages/virtual/network/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="network" PKG_VERSION="" PKG_LICENSE="various" PKG_SITE="https://libreelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain connman netbase ethtool openssh iw wireless-regdb rsync nss" PKG_SECTION="virtual" PKG_LONGDESC="Metapackage for various packages to install network support" if [ "${BLUETOOTH_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" bluez" fi if [ "${SAMBA_SERVER}" = "yes" ] || [ "${SAMBA_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" samba" fi if [ "${OPENVPN_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" openvpn" fi if [ "${WIREGUARD_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" wireguard-tools" if [[ "${DEVICE}" = "Amlogic-n"* ]]; then PKG_DEPENDS_TARGET="${PKG_DEPENDS_TARGET} wireguard-linux-compat" fi fi if [ "${ISCSI_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" open-iscsi" fi ================================================ FILE: packages/virtual/remote/package.mk ================================================ # 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="remote" PKG_VERSION="1" PKG_LICENSE="GPL" PKG_SITE="http://www.openelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain eventlircd libirman v4l-utils evrepeat" PKG_SECTION="virtual" PKG_LONGDESC="Meta package for installing various tools needed for remote support" ================================================ FILE: packages/virtual/toolchain/package.mk ================================================ # 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="toolchain" PKG_VERSION="" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" PKG_URL="" PKG_DEPENDS_HOST="autoconf:host autoconf-archive:host automake:host bison:host configtools:host cmake:host flex:host intltool:host libtool:host ninja:host make:host meson:host openssl:host p7zip:host pigz:host sed:host xmlstarlet:host xz:host" PKG_DEPENDS_TARGET="toolchain:host gcc:host" PKG_SECTION="virtual" PKG_LONGDESC="LibreELEC.tv' toolchain to compile all packages" ================================================ FILE: packages/virtual/virtual/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="virtual" PKG_VERSION="" PKG_LICENSE="GPL" PKG_SITE="http://www.libreelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="qemu:host" PKG_SECTION="virtual" PKG_LONGDESC="virtual is a Meta package to install Virtual project extra dependencies" get_graphicdrivers listcontains "${GRAPHIC_DRIVERS}" "vmware" && PKG_DEPENDS_TARGET+=" open-vm-tools" || true ================================================ FILE: packages/virtual/wl/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="wl" PKG_VERSION="" PKG_LICENSE="OSS" PKG_SITE="https://wayland.freedesktop.org/" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="virtual" PKG_LONGDESC="Wayland is intended as a simpler replacement for X, easier to develop and maintain." # Compositor if [ -n "${WINDOWMANAGER}" -a "${WINDOWMANAGER}" != "no" ]; then PKG_DEPENDS_TARGET+=" ${WINDOWMANAGER}" fi # Tools for wlroots based compositors if [ "${WINDOWMANAGER}" = "sway" ]; then PKG_DEPENDS_TARGET+=" wlr-randr" fi # NVIDIA drivers for Linux if listcontains "${GRAPHIC_DRIVERS}" "nvidia-ng"; then PKG_DEPENDS_TARGET+=" nvidia" fi ================================================ FILE: packages/virtual/x11/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="x11" PKG_VERSION="" PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="" PKG_DEPENDS_TARGET="toolchain xorg-server" PKG_SECTION="virtual" PKG_LONGDESC="X11 is the Windowing system" # Additional packages we need for using xorg-server: # Fonts PKG_DEPENDS_TARGET+=" encodings font-xfree86-type1 font-bitstream-type1 font-misc-misc" # Server PKG_DEPENDS_TARGET+=" xkeyboard-config xkbcomp" # Tools PKG_DEPENDS_TARGET+=" xrandr setxkbmap" if [ -n "${WINDOWMANAGER}" -a "${WINDOWMANAGER}" != "no" ]; then PKG_DEPENDS_TARGET+=" ${WINDOWMANAGER}" fi get_graphicdrivers # Drivers if [ -n "${LIBINPUT}" ]; then PKG_DEPENDS_TARGET+=" xf86-input-libinput" else PKG_DEPENDS_TARGET+=" xf86-input-evdev xf86-input-synaptics" fi for drv in ${XORG_DRIVERS}; do PKG_DEPENDS_TARGET+=" xf86-video-${drv}" done ================================================ FILE: packages/wayland/compositor/sway/config/colorscheme ================================================ ## Base16 Black Metal (Dark Funeral) # Author: metalelf0 (https://github.com/metalelf0) # Source: base16-sway (https://github.com/rkubosz/base16-sway) set $base00 #000000 set $base01 #121212 set $base02 #222222 set $base03 #333333 set $base04 #999999 set $base05 #c1c1c1 set $base06 #999999 set $base07 #c1c1c1 set $base08 #5f8787 set $base09 #aaaaaa set $base0A #5f81a5 set $base0B #d0dfee set $base0C #aaaaaa set $base0D #888888 set $base0E #999999 set $base0F #444444 ================================================ FILE: packages/wayland/compositor/sway/config/config ================================================ # Default config for sway # # Copy this to ~/.config/sway/config and edit it to your liking. # # Read `man 5 sway` for a complete reference. # Load prefered color scheme include colorscheme # Logo key. Use Mod1 for Alt. set $mod Mod4 # Home row direction keys, like vim set $left h set $down j set $up k set $right l # Your preferred terminal emulator set $term foot.sh # Your preferred application launcher # Note: pass the final command to swaymsg so that the resulting window can be opened # on the original workspace that the command was run on. set $highlight $base0A set $prompt $base0B set $menu bemenu-run -p "#" -l 10 --scrollbar autohide -i -w --tf "$prompt" --hf "$highlight" --sf "$highlight" --scf "$highlight" --no-exec | xargs swaymsg exec -- ### Output configuration # # Default wallpaper (more resolutions are available in /usr/share/sway/) output * bg /usr/share/sway/libreelec-wallpaper-2160.png fill # hide_cursor hides the cursor image after the specified timeout (in milliseconds) has elapsed with no activity on that cursor seat * hide_cursor 3000 # # Example configuration: # # output HDMI-A-1 resolution 1920x1080 position 1920,0 # # You can get the names of your outputs by running: swaymsg -t get_outputs ### Idle configuration # # Example configuration: # # exec swayidle -w \ # timeout 300 'swaylock -f -c 000000' \ # timeout 600 'swaymsg "output * dpms off"' resume 'swaymsg "output * dpms on"' \ # before-sleep 'swaylock -f -c 000000' # # This will lock your screen after 300 seconds of inactivity, then turn off # your displays after another 300 seconds, and turn your screens back on when # resumed. It will also lock your screen before your computer goes to sleep. ### Input configuration # # Example configuration: # # input "2:14:SynPS/2_Synaptics_TouchPad" { # dwt enabled # tap enabled # natural_scroll enabled # middle_emulation enabled # } # # You can get the names of your inputs by running: swaymsg -t get_inputs # Read `man 5 sway-input` for more information about this section. # Set keyboard layout (default US) input * { xkb_layout "us" } ### Key bindings # # Basics: # # Start a terminal bindsym $mod+Return exec $term # Kill focused window bindsym $mod+Shift+q kill # Start your launcher bindsym $mod+d exec $menu # Drag floating windows by holding down $mod and left mouse button. # Resize them with right mouse button + $mod. # Despite the name, also works for non-floating windows. # Change normal to inverse to use left mouse button for resizing and right # mouse button for dragging. floating_modifier $mod normal # Reload the configuration file bindsym $mod+Shift+c reload # Exit sway (logs you out of your Wayland session) bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit' # # Moving around: # # Move your focus around bindsym $mod+$left focus left bindsym $mod+$down focus down bindsym $mod+$up focus up bindsym $mod+$right focus right # Or use $mod+[up|down|left|right] bindsym $mod+Left focus left bindsym $mod+Down focus down bindsym $mod+Up focus up bindsym $mod+Right focus right # Move the focused window with the same, but add Shift bindsym $mod+Shift+$left move left bindsym $mod+Shift+$down move down bindsym $mod+Shift+$up move up bindsym $mod+Shift+$right move right # Ditto, with arrow keys bindsym $mod+Shift+Left move left bindsym $mod+Shift+Down move down bindsym $mod+Shift+Up move up bindsym $mod+Shift+Right move right # # Workspaces: # # Switch to workspace bindsym $mod+1 workspace number 1 bindsym $mod+2 workspace number 2 bindsym $mod+3 workspace number 3 bindsym $mod+4 workspace number 4 bindsym $mod+5 workspace number 5 bindsym $mod+6 workspace number 6 bindsym $mod+7 workspace number 7 bindsym $mod+8 workspace number 8 bindsym $mod+9 workspace number 9 bindsym $mod+0 workspace number 10 # Move focused container to workspace bindsym $mod+Shift+1 move container to workspace number 1 bindsym $mod+Shift+2 move container to workspace number 2 bindsym $mod+Shift+3 move container to workspace number 3 bindsym $mod+Shift+4 move container to workspace number 4 bindsym $mod+Shift+5 move container to workspace number 5 bindsym $mod+Shift+6 move container to workspace number 6 bindsym $mod+Shift+7 move container to workspace number 7 bindsym $mod+Shift+8 move container to workspace number 8 bindsym $mod+Shift+9 move container to workspace number 9 bindsym $mod+Shift+0 move container to workspace number 10 # Note: workspaces can have any name you want, not just numbers. # We just use 1-10 as the default. # # Layout stuff: # # You can "split" the current object of your focus with # $mod+b or $mod+v, for horizontal and vertical splits # respectively. bindsym $mod+b splith bindsym $mod+v splitv # Switch the current container between different layout styles bindsym $mod+s layout stacking bindsym $mod+w layout tabbed bindsym $mod+e layout toggle split # Make the current focus fullscreen bindsym $mod+f fullscreen # Toggle the current focus between tiling and floating mode bindsym $mod+Shift+space floating toggle # Swap focus between the tiling area and the floating area bindsym $mod+space focus mode_toggle # Move focus to the parent container bindsym $mod+a focus parent # # Scratchpad: # # Sway has a "scratchpad", which is a bag of holding for windows. # You can send windows there and get them back later. # Move the currently focused window to the scratchpad bindsym $mod+Shift+minus move scratchpad # Show the next scratchpad window or hide the focused scratchpad window. # If there are multiple scratchpad windows, this command cycles through them. bindsym $mod+minus scratchpad show # # Resizing containers: # mode "resize" { # left will shrink the containers width # right will grow the containers width # up will shrink the containers height # down will grow the containers height bindsym $left resize shrink width 10px bindsym $down resize grow height 10px bindsym $up resize shrink height 10px bindsym $right resize grow width 10px # Ditto, with arrow keys bindsym Left resize shrink width 10px bindsym Down resize grow height 10px bindsym Up resize shrink height 10px bindsym Right resize grow width 10px # Return to default mode bindsym Return mode "default" bindsym Escape mode "default" } bindsym $mod+r mode "resize" # # Status Bar: # # Read `man 5 sway-bar` for more information about this section. bar { position top # When the status_command prints a new line to stdout, swaybar updates. # The default just shows the current date and time. status_command while date +'%a %e %b %G - %k:%M'; do sleep 1; done colors { background $base00 separator $base01 statusline $base04 # State Border BG Text focused_workspace $base05 $base0D $base00 active_workspace $base05 $base03 $base00 inactive_workspace $base03 $base01 $base05 urgent_workspace $base08 $base08 $base00 binding_mode $base00 $base0A $base00 } } # Basic color configuration using the Base16 variables for windows and borders. # Property Name Border BG Text Indicator Child Border client.focused $base05 $base0D $base00 $base0D $base0D client.focused_inactive $base01 $base01 $base05 $base03 $base01 client.unfocused $base01 $base00 $base05 $base01 $base01 client.urgent $base08 $base08 $base00 $base08 $base08 client.placeholder $base00 $base00 $base05 $base00 $base00 client.background $base07 # Load etc config include /etc/sway/config.d/* ================================================ FILE: packages/wayland/compositor/sway/config/sway-daemon.conf ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) # Pass config args to Sway e.g. --unsupported-gpu for NVIDIA GPUs SWAY_DAEMON_CONF="" ================================================ FILE: packages/wayland/compositor/sway/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="sway" PKG_VERSION="1.8.1" PKG_SHA256="e9f575761342fc8fe0cfeea80c90f32ddfa8c543572fec179f40922346f47dff" PKG_LICENSE="MIT" PKG_SITE="https://swaywm.org/" PKG_URL="https://github.com/swaywm/sway/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain wayland wayland-protocols libdrm libxkbcommon libinput cairo pango libjpeg-turbo dbus json-c wlroots gdk-pixbuf swaybg foot bemenu" PKG_LONGDESC="i3-compatible Wayland compositor" PKG_MESON_OPTS_TARGET="-Ddefault-wallpaper=false \ -Dzsh-completions=false \ -Dbash-completions=false \ -Dfish-completions=false \ -Dswaybar=true \ -Dswaynag=true \ -Dxwayland=disabled \ -Dtray=disabled \ -Dgdk-pixbuf=enabled \ -Dman-pages=disabled \ -Dsd-bus-provider=auto" pre_configure_target() { # sway does not build without -Wno flags as all warnings being treated as errors export TARGET_CFLAGS=$(echo "${TARGET_CFLAGS} -Wno-unused-variable") } post_makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/sway cp ${PKG_DIR}/scripts/sway.sh ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/sway-config ${INSTALL}/usr/lib/sway # install config & wallpaper mkdir -p ${INSTALL}/usr/share/sway cp ${PKG_DIR}/config/* ${INSTALL}/usr/share/sway find_file_path "splash/splash-2160.png" && cp ${FOUND_PATH} ${INSTALL}/usr/share/sway/libreelec-wallpaper-2160.png # clean up safe_remove ${INSTALL}/etc safe_remove ${INSTALL}/usr/share/wayland-sessions } post_install() { enable_service sway.service } ================================================ FILE: packages/wayland/compositor/sway/patches/sway-100.01-static-ipc-socket.patch ================================================ --- a/sway/ipc-server.c +++ b/sway/ipc-server.c @@ -140,7 +140,7 @@ struct sockaddr_un *ipc_user_sockaddr(vo dir = "/tmp"; } if (path_size <= snprintf(ipc_sockaddr->sun_path, path_size, - "%s/sway-ipc.%u.%i.sock", dir, getuid(), getpid())) { + "%s/sway-ipc.%u.sock", dir, getuid())) { sway_abort("Socket path won't fit into ipc_sockaddr->sun_path"); } ================================================ FILE: packages/wayland/compositor/sway/patches/sway-100.02-allow-running-as-root.patch ================================================ --- a/sway/main.c +++ b/sway/main.c @@ -151,7 +151,8 @@ } static bool detect_suid(void) { - if (geteuid() != 0 && getegid() != 0) { + if (geteuid() == 0 && getegid() == 0) { + sway_log(SWAY_INFO, "Running sway as root user"); return false; } @@ -309,11 +310,6 @@ } } - // SUID operation is deprecated, so block it for now. - if (detect_suid()) { - exit(EXIT_FAILURE); - } - // Since wayland requires XDG_RUNTIME_DIR to be set, abort with just the // clear error message (when not running as an IPC client). if (!getenv("XDG_RUNTIME_DIR") && optind == argc) { @@ -363,6 +359,11 @@ return 0; } + // SUID operation is deprecated, so block it for now. + if (detect_suid()) { + exit(EXIT_FAILURE); + } + detect_proprietary(allow_unsupported_gpu); increase_nofile_limit(); ================================================ FILE: packages/wayland/compositor/sway/patches/sway-100.03-do-not-use-git-version.patch ================================================ --- a/meson.build +++ b/meson.build @@ -158,18 +158,6 @@ add_project_arguments('-DSYSCONFDIR="/@0@"'.format(join_paths(prefix, sysconfdir)), language : 'c') version = '"@0@"'.format(meson.project_version()) -git = find_program('git', native: true, required: false) -if git.found() - git_commit = run_command([git, 'rev-parse', '--short', 'HEAD'], check: false) - git_branch = run_command([git, 'rev-parse', '--abbrev-ref', 'HEAD'], check: false) - if git_commit.returncode() == 0 and git_branch.returncode() == 0 - version = '"@0@-@1@ (" __DATE__ ", branch \'@2@\')"'.format( - meson.project_version(), - git_commit.stdout().strip(), - git_branch.stdout().strip(), - ) - endif -endif add_project_arguments('-DSWAY_VERSION=@0@'.format(version), language: 'c') # Compute the relative path used by compiler invocations. ================================================ FILE: packages/wayland/compositor/sway/profile.d/04-sway.conf ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) export WAYLAND_DISPLAY=wayland-1 export XDG_RUNTIME_DIR=/var/run/0-runtime-dir export SWAYSOCK="${XDG_RUNTIME_DIR}/sway-ipc.0.sock" ================================================ FILE: packages/wayland/compositor/sway/scripts/sway-config ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) export XDG_RUNTIME_DIR=/var/run/0-runtime-dir export WAYLAND_DISPLAY=wayland-1 SWAY_DAEMON_ARGS="" SWAY_RUNTIME_DIR=/var/run/sway SWAY_CONFIG_BASEDIR=/storage/.config/sway SWAY_CONFIG_SHAREDIR=/usr/share/sway SWAY_CONFIG_COLOR=${SWAY_CONFIG_BASEDIR}/colorscheme SWAY_CONFIG_COLOR_DEFAULT=${SWAY_CONFIG_SHAREDIR}/colorscheme SWAY_CONFIG_DAEMON=${SWAY_CONFIG_BASEDIR}/sway-daemon.conf SWAY_CONFIG_DAEMON_DEFAULT=${SWAY_CONFIG_SHAREDIR}/sway-daemon.conf SWAY_CONFIG_USER=${SWAY_CONFIG_BASEDIR}/config SWAY_CONFIG_USER_DEFAULT=${SWAY_CONFIG_SHAREDIR}/config SWAY_CONFIG_RUN=${SWAY_RUNTIME_DIR}/sway-daemon.conf if [ ! -d "$XDG_RUNTIME_DIR" ]; then mkdir "$XDG_RUNTIME_DIR" chmod 0700 "$XDG_RUNTIME_DIR" fi if [ ! -d "$SWAY_RUNTIME_DIR" ]; then mkdir "$SWAY_RUNTIME_DIR" fi if [ ! -f ${SWAY_CONFIG_USER} ]; then mkdir -p ${SWAY_CONFIG_BASEDIR} cp ${SWAY_CONFIG_USER_DEFAULT} ${SWAY_CONFIG_BASEDIR} fi if [ ! -f ${SWAY_CONFIG_COLOR} ]; then cp ${SWAY_CONFIG_COLOR_DEFAULT} ${SWAY_CONFIG_BASEDIR} fi if [ ! -f ${SWAY_CONFIG_DAEMON} ]; then cp ${SWAY_CONFIG_DAEMON_DEFAULT} ${SWAY_CONFIG_BASEDIR} fi if [ -f ${SWAY_CONFIG_DAEMON} ] ; then SWAY_DAEMON_CONF=$(cat ${SWAY_CONFIG_DAEMON} | grep -E '^SWAY_DAEMON_CONF=' | cut -d "\"" -f2) fi echo SWAY_DAEMON_ARGS=\"${SWAY_DAEMON_CONF} ${SWAY_DAEMON_ARGS}\" > ${SWAY_CONFIG_RUN} ================================================ FILE: packages/wayland/compositor/sway/scripts/sway.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) . /run/sway/sway-daemon.conf SWAY_LOG_FILE=/var/log/sway.log if [ ! -z "$(lsmod | grep 'nvidia')" ]; then export WLR_NO_HARDWARE_CURSORS=1 SWAY_GPU_ARGS="--unsupported-gpu" fi # start sway, even if no input devices are connected export WLR_LIBINPUT_NO_DEVICES=1 logger -t Sway "### Starting Sway with -V ${SWAY_GPU_ARGS} ${SWAY_DAEMON_ARGS}" /usr/bin/sway -V ${SWAY_GPU_ARGS} ${SWAY_DAEMON_ARGS} > ${SWAY_LOG_FILE} 2>&1 ================================================ FILE: packages/wayland/compositor/sway/system.d/sway.service ================================================ [Unit] Description=Sway Wayland Compositor Before=graphical.target kodi.service After=multi-user.target ConditionKernelCommandLine=!installer [Service] Environment=HOME=/storage Environment=XDG_RUNTIME_DIR=/var/run/0-runtime-dir EnvironmentFile=/usr/share/sway/sway-daemon.conf EnvironmentFile=-/run/sway/sway-daemon.conf WorkingDirectory=/storage ExecStartPre=-/usr/lib/sway/sway-config ExecStart=/usr/bin/sway.sh Restart=always RestartSec=5 [Install] Alias=display-manager.service WantedBy=graphical.target ================================================ FILE: packages/wayland/lib/fcft/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="fcft" PKG_VERSION="3.1.5" PKG_SHA256="8a7e09c887edce97f8780dba8a060026c3551da48252819400d7af1c5eacf871" PKG_LICENSE="MIT" PKG_SITE="https://codeberg.org/dnkl/fcft" PKG_URL="https://codeberg.org/dnkl/fcft/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain pixman fontconfig freetype tllist" PKG_LONGDESC="A simple library for font loading and glyph rasterization using FontConfig, FreeType and pixman." PKG_MESON_OPTS_TARGET="-Ddocs=disabled \ -Dgrapheme-shaping=disabled \ -Drun-shaping=disabled \ -Dtest-text-shaping=false \ -Dexamples=false" ================================================ FILE: packages/wayland/lib/hwdata/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="hwdata" PKG_VERSION="0.367" PKG_SHA256="7221ee5827775f7ff2cf1ff31008fbe07757c455c0a7c4ff9e8c797d4f382994" PKG_LICENSE="GPL-2.0" PKG_SITE="https://github.com/vcrhonek/hwdata" PKG_URL="https://github.com/vcrhonek/hwdata/archive/refs/tags/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="hwdata contains various hardware identification and configuration data, such as the pci.ids and usb.ids databases" pre_configure_target() { # hwdata fails to build in subdirs cd ${PKG_BUILD} rm -rf .${TARGET_NAME} sed -i "s&@prefix@|&@prefix@|${PKG_INSTALL}&" Makefile sed -i "s&prefix=@prefix@&prefix=/usr&" hwdata.pc.in } ================================================ FILE: packages/wayland/lib/seatd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="seatd" PKG_VERSION="0.7.0" PKG_SHA256="210ddf8efa1149cde4dd35908bef8e9e63c2edaa0cdb5435f2e6db277fafff3c" PKG_LICENSE="MIT" PKG_SITE="https://git.sr.ht/~kennylevinsen/seatd" PKG_URL="https://git.sr.ht/~kennylevinsen/seatd/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain systemd" PKG_LONGDESC="A minimal seat management daemon, and a universal seat management library." PKG_MESON_OPTS_TARGET="-Dlibseat-logind=systemd \ -Dlibseat-seatd=enabled \ -Dlibseat-builtin=disabled \ -Dserver=enabled \ -Dexamples=disabled \ -Dman-pages=disabled" pre_configure_target() { # seatd does not build without -Wno flags as all warnings being treated as errors export TARGET_CFLAGS=$(echo "${TARGET_CFLAGS} -Wno-unused-parameter") } post_install() { enable_service seatd.service } ================================================ FILE: packages/wayland/lib/seatd/system.d/seatd.service ================================================ [Unit] Description=Seat Management Daemon Before=graphical.target sway.service After=multi-user.target ConditionKernelCommandLine=!installer [Service] ExecStart=/usr/bin/seatd -u root Restart=always RestartSec=1 [Install] Alias=seat-management-daemon.service WantedBy=graphical.target ================================================ FILE: packages/wayland/lib/tllist/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tllist" PKG_VERSION="1.1.0" PKG_SHA256="0e7b7094a02550dd80b7243bcffc3671550b0f1d8ba625e4dff52517827d5d23" PKG_LICENSE="MIT" PKG_SITE="https://codeberg.org/dnkl/tllist" PKG_URL="https://codeberg.org/dnkl/tllist/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A C header file only implementation of a typed linked list." ================================================ FILE: packages/wayland/lib/wlroots/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="wlroots" PKG_VERSION="0.16.2" PKG_SHA256="afea2cc740344c4e86749cf4908e07692e183cb14a3db854d24dec454c664b88" PKG_LICENSE="MIT" PKG_SITE="https://gitlab.freedesktop.org/wlroots/wlroots/" PKG_URL="https://gitlab.freedesktop.org/wlroots/wlroots/-/archive/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain hwdata libinput libxkbcommon pixman libdrm wayland wayland-protocols seatd" PKG_LONGDESC="A modular Wayland compositor library" configure_package() { # OpenGLES Support if [ "${OPENGLES_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi } PKG_MESON_OPTS_TARGET="-Dxcb-errors=disabled \ -Dxwayland=disabled \ -Dexamples=false \ -Drenderers=gles2" pre_configure_target() { # wlroots does not build without -Wno flags as all warnings being treated as errors export TARGET_CFLAGS=$(echo "${TARGET_CFLAGS} -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-function") } ================================================ FILE: packages/wayland/libinput/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libinput" PKG_VERSION="1.22.1" PKG_SHA256="e13f6f118cfbbdc0b6e0edd5e3504abd96a8d0e33dc67cba31c6942c449f77af" PKG_LICENSE="GPL" PKG_SITE="https://www.freedesktop.org/wiki/Software/libinput/" PKG_URL="https://gitlab.freedesktop.org/libinput/libinput/-/archive/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain systemd libevdev mtdev" PKG_LONGDESC="libinput is a library to handle input devices in Wayland compositors and to provide a generic X.Org input driver." PKG_MESON_OPTS_TARGET="-Dlibwacom=false \ -Ddebug-gui=false \ -Dtests=false \ -Ddocumentation=false" ================================================ FILE: packages/wayland/libxkbcommon/package.mk ================================================ # 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="libxkbcommon" PKG_VERSION="1.5.0" PKG_SHA256="560f11c4bbbca10f495f3ef7d3a6aa4ca62b4f8fb0b52e7d459d18a26e46e017" PKG_LICENSE="MIT" PKG_SITE="https://xkbcommon.org" PKG_URL="https://xkbcommon.org/download/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain xkeyboard-config libxml2" PKG_LONGDESC="xkbcommon is a library to handle keyboard descriptions." PKG_MESON_OPTS_TARGET="-Denable-docs=false" if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_MESON_OPTS_TARGET+=" -Denable-x11=true \ -Denable-wayland=false" elif [ "${DISPLAYSERVER}" = "wl" ]; then PKG_DEPENDS_TARGET+=" wayland wayland-protocols" PKG_MESON_OPTS_TARGET+=" -Denable-x11=false \ -Denable-wayland=true" else PKG_MESON_OPTS_TARGET+=" -Denable-x11=false \ -Denable-wayland=false" fi pre_configure_target() { if [ "${DISPLAYSERVER}" = "x11" ]; then TARGET_LDFLAGS="${LDFLAGS} -lXau -lxcb" fi } ================================================ FILE: packages/wayland/mtdev/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="mtdev" PKG_VERSION="1.1.6" PKG_SHA256="15d7b28da8ac71d8bc8c9287c2045fd174267bc740bec10cfda332dc1204e0e0" PKG_LICENSE="MIT" PKG_SITE="http://bitmath.org" PKG_URL="http://bitmath.org/code/mtdev/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="The mtdev is a stand-alone library which transforms all variants of kernel MT events to the slotted type B protocol." PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-static --disable-shared" ================================================ FILE: packages/wayland/util/bemenu/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="bemenu" PKG_VERSION="0.6.14" PKG_SHA256="bc945776f94901d0898d19725d3a4c3e1f5bc90712a5bae9ec98d89d24603a9d" PKG_LICENSE="MIT" PKG_SITE="https://github.com/Cloudef/bemenu" PKG_URL="https://github.com/Cloudef/bemenu/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain glib wayland wayland-protocols cairo pango libxkbcommon" PKG_LONGDESC="Dynamic menu library and client program inspired by dmenu" PKG_TOOLCHAIN="make" PKG_MAKE_OPTS_TARGET="PREFIX=/usr clients wayland" makeinstall_target(){ make DESTDIR=${INSTALL} PREFIX=/usr install-libs install-bins install-wayland install-pkgconfig } post_makeinstall_target(){ ln -sf libbemenu.so.${PKG_VERSION} ${INSTALL}/usr/lib/libbemenu.so.0 } ================================================ FILE: packages/wayland/util/foot/config/foot.ini ================================================ # -*- conf -*- # shell=$SHELL (if set, otherwise user's default shell from /etc/passwd) term=xterm # login-shell=no # app-id=foot title=foo terminal # locked-title=no font=monospace:size=12 # font-bold=<bold variant of regular font> # font-italic=<italic variant of regular font> # font-bold-italic=<bold+italic variant of regular font> # line-height=<font metrics> # letter-spacing=0 # horizontal-letter-offset=0 # vertical-letter-offset=0 # underline-offset=<font metrics> # box-drawings-uses-font-glyphs=no dpi-aware=auto # initial-window-size-pixels=700x500 # Or, # initial-window-size-chars=<COLSxROWS> # initial-window-mode=windowed # pad=2x2 # optionally append 'center' # resize-delay-ms=100 # notify=notify-send -a ${app-id} -i ${app-id} ${title} ${body} # bold-text-in-bright=no # bell=none # word-delimiters=,│`|:"'()[]{}<> # selection-target=primary # workers=<number of logical CPUs> [bell] # urgent=no # notify=no # command= # command-focused=no [scrollback] # lines=1000 # multiplier=3.0 # indicator-position=relative # indicator-format= [url] # launch=xdg-open ${url} # label-letters=sadfjklewcmpgh # osc8-underline=url-mode # protocols=http, https, ftp, ftps, file, gemini, gopher # uri-characters=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.,~:;/?#@!$&%*+="' [cursor] style=beam color=000000 eeeeee blink=yes # beam-thickness=1.5 # underline-thickness=<font underline thickness> [mouse] # hide-when-typing=no # alternate-scroll-mode=yes [colors] alpha=0.95 background=000000 foreground=eeeeee regular0=1c1c1c # black regular1=af005f # red regular2=5faf00 # green regular3=d7af5f # yellow regular4=5fafd7 # blue regular5=808080 # magenta regular6=d7875f # cyan regular7=d0d0d0 # white bright0=bcbcbc # bright black bright1=5faf5f # bright red bright2=afd700 # bright green bright3=af87d7 # bright yellow bright4=ffaf00 # bright blue bright5=ff5faf # bright magenta bright6=00afaf # bright cyan bright7=5f8787 # bright white #selection-foreground=1c1c1c #selection-background=af87d7 ## Normal/regular colors (color palette 0-7) # regular0=222222 # black # regular1=cc9393 # red # regular2=7f9f7f # green # regular3=d0bf8f # yellow # regular4=6ca0a3 # blue # regular5=dc8cc3 # magenta # regular6=93e0e3 # cyan # regular7=dcdccc # white ## Bright colors (color palette 8-15) # bright0=666666 # bright black # bright1=dca3a3 # bright red # bright2=bfebbf # bright green # bright3=f0dfaf # bright yellow # bright4=8cd0d3 # bright blue # bright5=fcace3 # bright magenta # bright6=b3ffff # bright cyan # bright7=ffffff # bright white ## dimmed colors (see foot.ini(5) man page) # dim0=<not set> # ... # dim7=<not-set> ## The remaining 256-color palette # 16 = <256-color palette #16> # ... # 255 = <256-color palette #255> ## Misc colors # selection-foreground=<inverse foreground/background> # selection-background=<inverse foreground/background> # jump-labels=<regular0> <regular3> # urls=<regular3> # scrollback-indicator=<regular0> <bright4> [csd] # preferred=server # size=26 # font=<primary font> # color=<foreground color> # border-width=0 # border-color=<csd.color> # button-width=26 # button-color=<background color> # button-minimize-color=<regular4> # button-maximize-color=<regular2> # button-close-color=<regular1> [key-bindings] # scrollback-up-page=Shift+Page_Up # scrollback-up-half-page=none # scrollback-up-line=none # scrollback-down-page=Shift+Page_Down # scrollback-down-half-page=none # scrollback-down-line=none # clipboard-copy=Control+Shift+c # clipboard-paste=Control+Shift+v # primary-paste=Shift+Insert # search-start=Control+Shift+r # font-increase=Control+plus Control+equal Control+KP_Add # font-decrease=Control+minus Control+KP_Subtract # font-reset=Control+0 Control+KP_0 # spawn-terminal=Control+Shift+n # minimize=none # maximize=none # fullscreen=none # pipe-visible=[sh -c "xurls | fuzzel | xargs -r firefox"] none # pipe-scrollback=[sh -c "xurls | fuzzel | xargs -r firefox"] none # pipe-selected=[xargs -r firefox] none # show-urls-launch=Control+Shift+u # show-urls-copy=none # noop=none [search-bindings] # cancel=Control+g Control+c Escape # commit=Return # find-prev=Control+r # find-next=Control+s # cursor-left=Left Control+b # cursor-left-word=Control+Left Mod1+b # cursor-right=Right Control+f # cursor-right-word=Control+Right Mod1+f # cursor-home=Home Control+a # cursor-end=End Control+e # delete-prev=BackSpace # delete-prev-word=Mod1+BackSpace Control+BackSpace # delete-next=Delete # delete-next-word=Mod1+d Control+Delete # extend-to-word-boundary=Control+w # extend-to-next-whitespace=Control+Shift+w # clipboard-paste=Control+v Control+y # primary-paste=Shift+Insert [url-bindings] # cancel=Control+g Control+c Control+d Escape # toggle-url-visible=t [mouse-bindings] # primary-paste=BTN_MIDDLE # select-begin=BTN_LEFT # select-begin-block=Control+BTN_LEFT # select-extend=BTN_RIGHT # select-extend-character-wise=Control+BTN_RIGHT # select-word=BTN_LEFT-2 # select-word-whitespace=Control+BTN_LEFT-2 # select-row=BTN_LEFT-3 ================================================ FILE: packages/wayland/util/foot/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="foot" PKG_VERSION="1.13.1" PKG_SHA256="604f777fdaccfc1ee2d20376cc5688a819dcd6b7113725880cc973194fd6c737" PKG_LICENSE="MIT" PKG_SITE="https://codeberg.org/dnkl/foot/" PKG_URL="https://codeberg.org/dnkl/foot/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain ncurses wayland wayland-protocols pixman fontconfig libxkbcommon fcft" PKG_LONGDESC="A fast, lightweight and minimalistic Wayland terminal emulator" PKG_MESON_OPTS_TARGET="-Ddocs=disabled \ -Dthemes=false \ -Dime=false \ -Dgrapheme-clustering=auto \ -Dterminfo=disabled \ -Ddefault-terminfo=xterm" post_makeinstall_target(){ # clean up safe_remove ${INSTALL}/usr/share/* # install scripts mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/foot.sh ${INSTALL}/usr/bin # install config mkdir -p ${INSTALL}/usr/share/foot cp ${PKG_DIR}/config/foot.ini ${INSTALL}/usr/share/foot } ================================================ FILE: packages/wayland/util/foot/scripts/foot.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) FOOT_CONFIG_DIR=/storage/.config/foot FOOT_CONFIG_DEFAULT=/usr/share/foot/foot.ini FOOT_LOG_FILE=/var/log/foot.log if [ ! -f ${FOOT_CONFIG_DIR}/foot.ini ]; then mkdir -p ${FOOT_CONFIG_DIR} cp ${FOOT_CONFIG_DEFAULT} ${FOOT_CONFIG_DIR} fi if [ -z "${LOCPATH}" ]; then export LOCPATH="/storage/.cache/locpath" fi /usr/bin/foot > ${FOOT_LOG_FILE} 2>&1 ================================================ FILE: packages/wayland/util/swaybg/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="swaybg" PKG_VERSION="1.2.0" PKG_SHA256="cfeab55b983da24352407279556c035b495890422578812d9a9c0bba1dc3ce75" PKG_LICENSE="MIT" PKG_SITE="https://swaywm.org/" PKG_URL="https://github.com/swaywm/swaybg/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain wayland wayland-protocols cairo pango gdk-pixbuf" PKG_LONGDESC="Wallpaper tool for Wayland compositors" PKG_MESON_OPTS_TARGET="-Dgdk-pixbuf=enabled \ -Dman-pages=disabled" pre_configure_target() { # swaybg does not build without -Wno flags as all warnings being treated as errors export TARGET_CFLAGS=$(echo "${TARGET_CFLAGS} -Wno-maybe-uninitialized") } ================================================ FILE: packages/wayland/util/wlr-randr/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="wlr-randr" PKG_VERSION="0.3.0" PKG_SHA256="f6e0bea3b41673adbc0ab707d5d93bfdcd3fc6f43c46377565865c3440f81eb4" PKG_LICENSE="MIT" PKG_SITE="https://git.sr.ht/~emersion/wlr-randr" PKG_URL="https://git.sr.ht/~emersion/wlr-randr/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain wayland" PKG_LONGDESC="Utility to manage outputs of a Wayland compositor." ================================================ FILE: packages/wayland/wayland/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="wayland" PKG_VERSION="1.21.0" PKG_SHA256="6dc64d7fc16837a693a51cfdb2e568db538bfdc9f457d4656285bb9594ef11ac" PKG_LICENSE="OSS" PKG_SITE="https://wayland.freedesktop.org/" PKG_URL="https://gitlab.freedesktop.org/wayland/wayland/-/releases/${PKG_VERSION}/downloads/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="libffi:host expat:host libxml2:host" PKG_DEPENDS_TARGET="toolchain wayland:host libffi expat libxml2" PKG_LONGDESC="a display server protocol" PKG_MESON_OPTS_HOST="-Dlibraries=false \ -Dscanner=true \ -Dtests=false \ -Ddocumentation=false \ -Ddtd_validation=false" PKG_MESON_OPTS_TARGET="-Dlibraries=true \ -Dscanner=false \ -Dtests=false \ -Ddocumentation=false \ -Ddtd_validation=false" pre_configure_target() { # wayland does not build with NDEBUG (requires assert for tests) export TARGET_CFLAGS=$(echo ${TARGET_CFLAGS} | sed -e "s|-DNDEBUG||g") } post_makeinstall_host() { cp ${TOOLCHAIN}/lib/pkgconfig/wayland-scanner.pc ${SYSROOT_PREFIX}/usr/lib/pkgconfig/ } ================================================ FILE: packages/wayland/wayland-protocols/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="wayland-protocols" PKG_VERSION="1.31" PKG_SHA256="a07fa722ed87676ec020d867714bc9a2f24c464da73912f39706eeef5219e238" PKG_LICENSE="OSS" PKG_SITE="https://wayland.freedesktop.org/" PKG_URL="https://gitlab.freedesktop.org/wayland/${PKG_NAME}/-/releases/${PKG_VERSION}/downloads/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain wayland:host" PKG_LONGDESC="Specifications of extended Wayland protocols" PKG_MESON_OPTS_TARGET="-Dtests=false" post_makeinstall_target() { safe_remove ${INSTALL} } ================================================ FILE: packages/wayland/waylandpp/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="waylandpp" PKG_VERSION="1.0.0" PKG_SHA256="b20b45917382c6b87e9380130c9a1a1c563da2f498de5830df12fbce326dd9f5" PKG_LICENSE="GPL" PKG_SITE="https://github.com/NilsBrause/waylandpp" PKG_URL="https://github.com/NilsBrause/waylandpp/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host pugixml:host" PKG_DEPENDS_TARGET="toolchain pugixml:host waylandpp:host wayland" PKG_LONGDESC="Wayland C++ bindings" configure_package() { if [ "${OPENGL_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGL}" elif [ "${OPENGLES_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi } PKG_CMAKE_OPTS_HOST="-DBUILD_SCANNER=ON \ -DBUILD_LIBRARIES=OFF" PKG_CMAKE_OPTS_TARGET="-DBUILD_SCANNER=OFF \ -DBUILD_LIBRARIES=ON \ -DCMAKE_CROSSCOMPILING=ON \ -DWAYLAND_SCANNERPP=${TOOLCHAIN}/bin/wayland-scanner++" ================================================ FILE: packages/wayland/weston/config/weston.ini ================================================ [core] idle-time=0 [shell] background-image=/usr/share/weston/libreelec-wallpaper-2160.png background-type=scale-crop background-color=0x00000000 clock-format=minutes-24h locking=false [launcher] path=/usr/lib/kodi/kodi.bin icon=/usr/share/kodi/media/icon16x16.png [launcher] icon=/usr/share/weston/terminal.png path=/usr/bin/weston-terminal ================================================ FILE: packages/wayland/weston/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="weston" PKG_VERSION="11.0.1" PKG_SHA256="a413f68c252957fc3191c3650823ec356ae8c124ccc0cb440da5cdc4e2cb9e57" PKG_LICENSE="MIT" PKG_SITE="https://wayland.freedesktop.org/" PKG_URL="https://gitlab.freedesktop.org/wayland/weston/uploads/f5648c818fba5432edc3ea63c4db4813/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain wayland wayland-protocols libdrm libxkbcommon libinput cairo pango libjpeg-turbo dbus seatd" PKG_LONGDESC="Reference implementation of a Wayland compositor" PKG_MESON_OPTS_TARGET="-Dbackend-drm=true \ -Dbackend-drm-screencast-vaapi=false \ -Dbackend-headless=false \ -Dbackend-rdp=false \ -Dscreenshare=false \ -Dbackend-wayland=false \ -Dbackend-x11=false \ -Dbackend-default=drm \ -Drenderer-gl=true \ -Dxwayland=false \ -Dsystemd=true \ -Dremoting=false \ -Dpipewire=false \ -Dshell-desktop=true \ -Dshell-fullscreen=false \ -Dshell-ivi=false \ -Dshell-kiosk=false \ -Ddesktop-shell-client-default="weston-desktop-shell" \ -Dcolor-management-lcms=false \ -Dlauncher-logind=false \ -Dlauncher-libseat=true \ -Dimage-jpeg=true \ -Dimage-webp=false \ -Dtools=['terminal'] -Ddemo-clients=false \ -Dsimple-clients=[] \ -Dresize-pool=false \ -Dwcap-decode=false \ -Dtest-junit-xml=false \ -Dtest-skip-is-failure=false \ -Ddoc=false" pre_configure_target() { # weston does not build with NDEBUG (requires assert for tests) export TARGET_CFLAGS=$(echo ${TARGET_CFLAGS} | sed -e "s|-DNDEBUG||g") } post_makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/weston cp ${PKG_DIR}/scripts/weston-config ${INSTALL}/usr/lib/weston mkdir -p ${INSTALL}/usr/share/weston cp ${PKG_DIR}/config/weston.ini ${INSTALL}/usr/share/weston find_file_path "splash/splash-2160.png" && cp ${FOUND_PATH} ${INSTALL}/usr/share/weston/libreelec-wallpaper-2160.png safe_remove ${INSTALL}/usr/share/wayland-sessions } post_install() { enable_service weston.service } ================================================ FILE: packages/wayland/weston/profile.d/04-weston.conf ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) export WAYLAND_DISPLAY=wayland-1 export XDG_RUNTIME_DIR=/var/run/0-runtime-dir ================================================ FILE: packages/wayland/weston/scripts/weston-config ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) export XDG_RUNTIME_DIR=/var/run/0-runtime-dir if [ ! -d "$XDG_RUNTIME_DIR" ]; then mkdir "$XDG_RUNTIME_DIR" chmod 0700 "$XDG_RUNTIME_DIR" fi if [ ! -f /storage/.config/weston.ini ]; then cp /usr/share/weston/weston.ini /storage/.config/weston.ini fi ================================================ FILE: packages/wayland/weston/system.d/weston.service ================================================ [Unit] Description=Weston Launcher Before=graphical.target After=multi-user.target ConditionKernelCommandLine=!installer [Service] Environment=HOME=/storage Environment=XDG_RUNTIME_DIR=/var/run/0-runtime-dir WorkingDirectory=/storage ExecStartPre=-/usr/lib/weston/weston-config ExecStart=/usr/bin/weston --tty=1 --log=/var/log/weston.log Restart=always RestartSec=10 [Install] Alias=display-manager.service WantedBy=graphical.target ================================================ FILE: packages/web/curl/package.mk ================================================ # 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) PKG_NAME="curl" PKG_VERSION="7.86.0" PKG_SHA256="2d61116e5f485581f6d59865377df4463f2e788677ac43222b496d4e49fb627b" PKG_LICENSE="MIT" PKG_SITE="https://curl.haxx.se" PKG_URL="https://curl.haxx.se/download/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain zlib openssl rtmpdump libidn2 nghttp2" PKG_LONGDESC="Client and library for (HTTP, HTTPS, FTP, ...) transfers." PKG_TOOLCHAIN="configure" PKG_CONFIGURE_OPTS_TARGET="ac_cv_lib_rtmp_RTMP_Init=yes \ ac_cv_header_librtmp_rtmp_h=yes \ --disable-debug \ --enable-optimize \ --enable-warnings \ --disable-curldebug \ --disable-ares \ --enable-largefile \ --enable-http \ --enable-ftp \ --enable-file \ --disable-ldap \ --disable-ldaps \ --enable-rtsp \ --enable-proxy \ --disable-dict \ --disable-telnet \ --disable-tftp \ --disable-pop3 \ --disable-imap \ --disable-smb \ --disable-smtp \ --disable-gopher \ --disable-mqtt \ --disable-manual \ --enable-libgcc \ --enable-ipv6 \ --enable-versioned-symbols \ --enable-nonblocking \ --enable-threaded-resolver \ --enable-verbose \ --disable-sspi \ --enable-crypto-auth \ --enable-cookies \ --enable-symbol-hiding \ --disable-soname-bump \ --with-gnu-ld \ --without-krb4 \ --without-spnego \ --without-gssapi \ --with-zlib \ --without-brotli \ --without-zstd \ --without-egd-socket \ --enable-thread \ --with-random=/dev/urandom \ --without-gnutls \ --with-ssl \ --without-mbedtls \ --without-nss \ --with-ca-bundle=/run/libreelec/cacert.pem \ --without-ca-path \ --without-libpsl \ --without-libssh2 \ --with-librtmp \ --with-libidn2 \ --with-nghttp2" post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { rm -rf ${INSTALL}/usr/share/zsh rm -rf ${INSTALL}/usr/bin/${PKG_NAME}-config cp ${PKG_NAME}-config ${TOOLCHAIN}/bin sed -e "s:\(['= ]\)/usr:\\1${PKG_ORIG_SYSROOT_PREFIX}/usr:g" -i ${TOOLCHAIN}/bin/${PKG_NAME}-config chmod +x ${TOOLCHAIN}/bin/${PKG_NAME}-config } ================================================ FILE: packages/web/libmicrohttpd/package.mk ================================================ # 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) PKG_NAME="libmicrohttpd" PKG_VERSION="0.9.75" PKG_SHA256="9278907a6f571b391aab9644fd646a5108ed97311ec66f6359cebbedb0a4e3bb" 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" PKG_DEPENDS_TARGET="toolchain gnutls" PKG_LONGDESC="A small C library that is supposed to make it easy to run an HTTP server as part of another application." PKG_CONFIGURE_OPTS_TARGET="--disable-shared \ --enable-static \ --disable-examples \ --disable-curl \ --enable-https" post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/web/nghttp2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nghttp2" PKG_VERSION="1.51.0" PKG_SHA256="66aa76d97c143f42295405a31413e5e7d157968dad9f957bb4b015b598882e6b" 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" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="nghttp2 is an implementation of HTTP/2 and its header compression algorithm, HPACK." PKG_CMAKE_OPTS_TARGET="-DENABLE_DOC=OFF \ -DENABLE_FAILMALLOC=OFF \ -DENABLE_LIB_ONLY=ON \ -DENABLE_SHARED_LIB=ON \ -DENABLE_STATIC_LIB=OFF" post_makeinstall_target() { rm -r "${INSTALL}/usr/share" } ================================================ FILE: packages/x11/app/setxkbmap/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="setxkbmap" PKG_VERSION="1.3.3" PKG_SHA256="b560c678da6930a0da267304fa3a41cc5df39a96a5e23d06f14984c87b6f587b" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/app/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libX11 libxkbfile xrandr" PKG_LONGDESC="Setxkbmap sets the keyboard using the X Keyboard Extension." ================================================ FILE: packages/x11/app/setxkbmap/udev.d/98-xorg-xkb.rules ================================================ ACTION!="add|change", GOTO="xorg_xkb_end" SUBSYSTEM!="input", GOTO="xorg_xkb_end" KERNEL!="event*", GOTO="xorg_xkb_end" ENV{ID_INPUT_KEY}=="?*", IMPORT{file}="/storage/.cache/xkb/layout" LABEL="xorg_xkb_end" ================================================ FILE: packages/x11/app/xkbcomp/package.mk ================================================ # 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="xkbcomp" PKG_VERSION="1.4.6" PKG_SHA256="fa50d611ef41e034487af7bd8d8c718df53dd18002f591cca16b0384afc58e98" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/app/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros libX11 libxkbfile" PKG_LONGDESC="The xkbcomp keymap compiler converts a description of an XKB keymap into one of several output formats." PKG_CONFIGURE_OPTS_TARGET="--with-xkb-config-root=${XORG_PATH_XKB}" ================================================ FILE: packages/x11/app/xrandr/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="xrandr" PKG_VERSION="1.5.2" PKG_SHA256="c8bee4790d9058bacc4b6246456c58021db58a87ddda1a9d0139bf5f18f1f240" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/app/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros libXrandr" PKG_LONGDESC="Xrandr is a primitive command line interface to the RandR extension and used to set the screen size, orientation and/or reflection." post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin/xkeystone } ================================================ FILE: packages/x11/data/xkeyboard-config/package.mk ================================================ # 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="xkeyboard-config" PKG_VERSION="2.38" PKG_SHA256="0690a91bab86b18868f3eee6d41e9ec4ce6894f655443d490a2184bfac56c872" PKG_LICENSE="MIT" PKG_SITE="https://www.X.org" PKG_URL="https://www.x.org/releases/individual/data/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros" PKG_LONGDESC="X keyboard extension data files." configure_package() { if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" xkbcomp" fi } pre_configure_target() { PKG_MESON_OPTS_TARGET="-Dcompat-rules=true" if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_MESON_OPTS_TARGET+=" -Dxorg-rules-symlinks=true" else PKG_MESON_OPTS_TARGET+=" -Dxorg-rules-symlinks=false" fi } ================================================ FILE: packages/x11/driver/xf86-input-evdev/package.mk ================================================ # 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) PKG_NAME="xf86-input-evdev" PKG_VERSION="2.10.6" PKG_SHA256="8726073e81861bc7b2321e76272cbdbd33c7e1a121535a9827977265b9033ec0" PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/driver/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain xorg-server util-macros libevdev mtdev systemd" PKG_LONGDESC="Evdev is an Xorg input driver for Linux's generic event devices." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--disable-silent-rules \ --with-xorg-module-dir=${XORG_PATH_MODULES} \ --with-gnu-ld" ================================================ FILE: packages/x11/driver/xf86-input-libinput/package.mk ================================================ # 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="xf86-input-libinput" PKG_VERSION="1.2.1" PKG_SHA256="8151db5b9ddb317c0ce92dcb62da9a8db5079e5b8a95b60abc854da21e7e971b" PKG_LICENSE="MIT" PKG_SITE="http://www.freedesktop.org/wiki/Software/libinput/" PKG_URL="http://xorg.freedesktop.org/archive/individual/driver/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libinput" PKG_LONGDESC="This is an X driver based on libinput." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--with-xorg-module-dir=${XORG_PATH_MODULES}" post_makeinstall_target() { mkdir -p ${INSTALL}/usr/share/X11/xorg.conf.d cp ${PKG_BUILD}/conf/*-libinput.conf ${INSTALL}/usr/share/X11/xorg.conf.d } ================================================ FILE: packages/x11/driver/xf86-input-synaptics/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="xf86-input-synaptics" PKG_VERSION="1.9.2" PKG_SHA256="b8fa4aab913fc63754bbd6439e020658c412743a055201ddf212760593962c38" PKG_LICENSE="GPL" PKG_SITE="https://lists.freedesktop.org/mailman/listinfo/xorg" PKG_URL="https://xorg.freedesktop.org/archive/individual/driver/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain xorg-server libXi libXext libevdev" PKG_LONGDESC="Synaptics touchpad driver for X.Org." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--with-xorg-module-dir=${XORG_PATH_MODULES}" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/x11/driver/xf86-video-amdgpu/package.mk ================================================ # 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="xf86-video-amdgpu" PKG_VERSION="22.0.0" PKG_SHA256="9d23fb602915dc3ccde92aa4d1e9485e7e54eaae2f41f485e55eb20761778266" PKG_ARCH="x86_64" PKG_LICENSE="OSS" PKG_SITE="https://www.x.org/wiki/RadeonFeature/" PKG_URL="https://www.x.org/archive/individual/driver/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libdrm xorg-server" PKG_LONGDESC="Xorg driver for AMD Radeon GPUs using the amdgpu kernel driver." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--enable-udev \ --enable-glamor \ --with-xorg-module-dir=${XORG_PATH_MODULES}" post_makeinstall_target() { rm -r ${INSTALL}/usr/share mkdir -p ${INSTALL}/etc/X11 cp ${PKG_BUILD}/conf/10-amdgpu.conf ${INSTALL}/etc/X11/xorg-amdgpu.conf } ================================================ FILE: packages/x11/driver/xf86-video-ati/config/xorg-radeon.conf ================================================ Section "Device" Identifier "AMD Graphics" Driver "radeon" # uncomment the following options to use DRI3 and glamor, otherwise DRI2 and exa # Option "DRI3" "1" # Option "AccelMethod" "glamor" Endsection ================================================ FILE: packages/x11/driver/xf86-video-ati/package.mk ================================================ # 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="xf86-video-ati" PKG_VERSION="19.1.0" PKG_SHA256="659f5a1629eea5f5334d9b39b18e6807a63aa1efa33c1236d9cc53acbb223c49" PKG_ARCH="x86_64" PKG_LICENSE="OSS" PKG_SITE="https://www.x.org/wiki/RadeonFeature/" PKG_URL="http://xorg.freedesktop.org/archive/individual/driver/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain xorg-server" PKG_LONGDESC="ATI/AMD Radeon video driver for the Xorg X server." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--enable-glamor \ --with-xorg-module-dir=${XORG_PATH_MODULES}" post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { mkdir -p ${INSTALL}/etc/X11 cp ${PKG_DIR}/config/*.conf ${INSTALL}/etc/X11 } ================================================ FILE: packages/x11/driver/xf86-video-ati/patches/xf86-video-ati-999.01-fix-gcc-10.patch ================================================ From f223035f4ffcff2a9296d1e907a5193f8e8845a3 Mon Sep 17 00:00:00 2001 From: Adam Jackson <ajax@redhat.com> Date: Tue, 4 Feb 2020 16:38:06 -0500 Subject: [PATCH] Fix link failure with gcc 10 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without the 'extern' this looks like a definition not just a declaration, in every file that includes the header. gcc 10 is stricter about this kind of multiple definition. Reviewed-by: Michel Dänzer <mdaenzer@redhat.com> --- src/drmmode_display.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/drmmode_display.h b/src/drmmode_display.h index 96eaef0a..8cd8a0a6 100644 --- a/src/drmmode_display.h +++ b/src/drmmode_display.h @@ -262,7 +262,7 @@ Bool drmmode_wait_vblank(xf86CrtcPtr crtc, drmVBlankSeqType type, uint64_t *ust, uint32_t *result_seq); -miPointerSpriteFuncRec drmmode_sprite_funcs; +extern miPointerSpriteFuncRec drmmode_sprite_funcs; #endif -- 2.26.2 ================================================ FILE: packages/x11/driver/xf86-video-ati/patches/xf86-video-ati-999.02-cleanup-terminology-to-use-primary-secondary.patch ================================================ From 8da3e4561ef82bb78c9a17b8cd8bf139b9cfd680 Mon Sep 17 00:00:00 2001 From: Dave Airlie <airlied@redhat.com> Date: Mon, 13 Jul 2020 09:11:28 +1000 Subject: [PATCH] ati: cleanup terminology to use primary/secondary The X server changed some API/ABIs here. Based on amdgpu patch by Michel --- man/radeon.man | 2 +- src/compat-api.h | 6 ++++ src/drmmode_display.c | 4 +-- src/evergreen_state.h | 2 +- src/r600_state.h | 2 +- src/radeon.h | 10 +++--- src/radeon_exa.c | 2 +- src/radeon_glamor.c | 2 +- src/radeon_kms.c | 74 +++++++++++++++++++++---------------------- 9 files changed, 55 insertions(+), 49 deletions(-) diff --git a/man/radeon.man b/man/radeon.man index dcebf537..247dcdb7 100644 --- a/man/radeon.man +++ b/man/radeon.man @@ -290,7 +290,7 @@ on. If this option is set, the default value of the property is 'on' or 'off' accordingly. If this option isn't set, the default value of the property is .B auto, which means that TearFree is on for rotated outputs, outputs with RandR -transforms applied and for RandR 1.4 slave outputs, otherwise off. +transforms applied and for RandR 1.4 secondary outputs, otherwise off. .TP .BI "Option \*qAccelMethod\*q \*q" "string" \*q Chooses between available acceleration architectures. Valid values are diff --git a/src/compat-api.h b/src/compat-api.h index f4e7524f..def6d3e4 100644 --- a/src/compat-api.h +++ b/src/compat-api.h @@ -34,4 +34,10 @@ #define BLOCKHANDLER_ARGS pScreen, pTimeout, pReadmask #endif +#if ABI_VIDEODRV_VERSION < SET_ABI_VERSION(25, 2) +#define current_primary current_master +#define primary_pixmap master_pixmap +#define secondary_dst slave_dst +#endif + #endif diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 72f96a0c..3099a729 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -720,7 +720,7 @@ drmmode_crtc_prime_scanout_update(xf86CrtcPtr crtc, DisplayModePtr mode, xorg_list_for_each_entry(dirty, &screen->pixmap_dirty_list, ent) { if (radeon_dirty_src_equals(dirty, drmmode_crtc->prime_scanout_pixmap)) { - dirty->slave_dst = + dirty->secondary_dst = drmmode_crtc->scanout[scanout_id].pixmap; break; } @@ -1356,7 +1356,7 @@ drmmode_set_scanout_pixmap(xf86CrtcPtr crtc, PixmapPtr ppix) xorg_list_for_each_entry(dirty, &screen->pixmap_dirty_list, ent) { if (radeon_dirty_src_equals(dirty, drmmode_crtc->prime_scanout_pixmap)) { - PixmapStopDirtyTracking(dirty->src, dirty->slave_dst); + PixmapStopDirtyTracking(dirty->src, dirty->secondary_dst); break; } } diff --git a/src/evergreen_state.h b/src/evergreen_state.h index 7e54e1c7..34ba87b6 100644 --- a/src/evergreen_state.h +++ b/src/evergreen_state.h @@ -350,7 +350,7 @@ extern void *RADEONEXACreatePixmap2(ScreenPtr pScreen, int width, int height, int *new_pitch); extern void RADEONEXADestroyPixmap(ScreenPtr pScreen, void *driverPriv); extern Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix); -extern Bool RADEONEXASharePixmapBacking(PixmapPtr ppix, ScreenPtr slave, void **handle_p); +extern Bool RADEONEXASharePixmapBacking(PixmapPtr ppix, ScreenPtr secondary, void **handle_p); extern Bool RADEONEXASetSharedPixmapBacking(PixmapPtr ppix, void *handle); #endif diff --git a/src/r600_state.h b/src/r600_state.h index 34345996..567c3ca2 100644 --- a/src/r600_state.h +++ b/src/r600_state.h @@ -321,6 +321,6 @@ extern void *RADEONEXACreatePixmap2(ScreenPtr pScreen, int width, int height, int *new_pitch); extern void RADEONEXADestroyPixmap(ScreenPtr pScreen, void *driverPriv); extern Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix); -extern Bool RADEONEXASharePixmapBacking(PixmapPtr ppix, ScreenPtr slave, void **handle_p); +extern Bool RADEONEXASharePixmapBacking(PixmapPtr ppix, ScreenPtr secondary, void **handle_p); extern Bool RADEONEXASetSharedPixmapBacking(PixmapPtr ppix, void *handle); #endif diff --git a/src/radeon.h b/src/radeon.h index e4a2ba66..68d7756a 100644 --- a/src/radeon.h +++ b/src/radeon.h @@ -182,18 +182,18 @@ typedef enum { static inline ScreenPtr -radeon_master_screen(ScreenPtr screen) +radeon_primary_screen(ScreenPtr screen) { - if (screen->current_master) - return screen->current_master; + if (screen->current_primary) + return screen->current_primary; return screen; } static inline ScreenPtr -radeon_dirty_master(PixmapDirtyUpdatePtr dirty) +radeon_dirty_primary(PixmapDirtyUpdatePtr dirty) { - return radeon_master_screen(dirty->slave_dst->drawable.pScreen); + return radeon_primary_screen(dirty->secondary_dst->drawable.pScreen); } static inline DrawablePtr diff --git a/src/radeon_exa.c b/src/radeon_exa.c index 268155ed..320ff992 100644 --- a/src/radeon_exa.c +++ b/src/radeon_exa.c @@ -282,7 +282,7 @@ void RADEONEXADestroyPixmap(ScreenPtr pScreen, void *driverPriv) free(driverPriv); } -Bool RADEONEXASharePixmapBacking(PixmapPtr ppix, ScreenPtr slave, void **fd_handle) +Bool RADEONEXASharePixmapBacking(PixmapPtr ppix, ScreenPtr seconndary, void **fd_handle) { struct radeon_exa_pixmap_priv *driver_priv = exaGetPixmapDriverPrivate(ppix); diff --git a/src/radeon_glamor.c b/src/radeon_glamor.c index f1098381..ccf99941 100644 --- a/src/radeon_glamor.c +++ b/src/radeon_glamor.c @@ -366,7 +366,7 @@ radeon_glamor_set_pixmap_bo(DrawablePtr drawable, PixmapPtr pixmap) static Bool -radeon_glamor_share_pixmap_backing(PixmapPtr pixmap, ScreenPtr slave, +radeon_glamor_share_pixmap_backing(PixmapPtr pixmap, ScreenPtr secondary, void **handle_p) { ScreenPtr screen = pixmap->drawable.pScreen; diff --git a/src/radeon_kms.c b/src/radeon_kms.c index b3db7c41..62962d61 100644 --- a/src/radeon_kms.c +++ b/src/radeon_kms.c @@ -559,8 +559,8 @@ dirty_region(PixmapDirtyUpdatePtr dirty) if (dirty->rotation != RR_Rotate_0) { dstregion = transform_region(damageregion, &dirty->f_inverse, - dirty->slave_dst->drawable.width, - dirty->slave_dst->drawable.height); + dirty->secondary_dst->drawable.width, + dirty->secondary_dst->drawable.height); } else #endif { @@ -568,7 +568,7 @@ dirty_region(PixmapDirtyUpdatePtr dirty) dstregion = RegionDuplicate(damageregion); RegionTranslate(dstregion, -dirty->x, -dirty->y); - PixmapRegionInit(&pixregion, dirty->slave_dst); + PixmapRegionInit(&pixregion, dirty->secondary_dst); RegionIntersect(dstregion, dstregion, &pixregion); RegionUninit(&pixregion); } @@ -585,8 +585,8 @@ redisplay_dirty(PixmapDirtyUpdatePtr dirty, RegionPtr region) if (RegionNil(region)) goto out; - if (dirty->slave_dst->master_pixmap) - DamageRegionAppend(&dirty->slave_dst->drawable, region); + if (dirty->secondary_dst->primary_pixmap) + DamageRegionAppend(&dirty->secondary_dst->drawable, region); #ifdef HAS_DIRTYTRACKING_ROTATION PixmapSyncDirtyHelper(dirty); @@ -595,8 +595,8 @@ redisplay_dirty(PixmapDirtyUpdatePtr dirty, RegionPtr region) #endif radeon_cs_flush_indirect(src_scrn); - if (dirty->slave_dst->master_pixmap) - DamageRegionProcessPending(&dirty->slave_dst->drawable); + if (dirty->secondary_dst->primary_pixmap) + DamageRegionProcessPending(&dirty->secondary_dst->drawable); out: DamageEmpty(dirty->damage); @@ -613,12 +613,12 @@ radeon_prime_scanout_update_abort(xf86CrtcPtr crtc, void *event_data) void radeon_sync_shared_pixmap(PixmapDirtyUpdatePtr dirty) { - ScreenPtr master_screen = radeon_dirty_master(dirty); + ScreenPtr primary_screen = radeon_dirty_primary(dirty); PixmapDirtyUpdatePtr ent; RegionPtr region; - xorg_list_for_each_entry(ent, &master_screen->pixmap_dirty_list, ent) { - if (!radeon_dirty_src_equals(dirty, ent->slave_dst)) + xorg_list_for_each_entry(ent, &primary_screen->pixmap_dirty_list, ent) { + if (!radeon_dirty_src_equals(dirty, ent->secondary_dst)) continue; region = dirty_region(ent); @@ -631,45 +631,45 @@ radeon_sync_shared_pixmap(PixmapDirtyUpdatePtr dirty) #if HAS_SYNC_SHARED_PIXMAP static Bool -master_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) +primary_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) { - ScreenPtr master_screen = radeon_dirty_master(dirty); + ScreenPtr primary_screen = radeon_dirty_primary(dirty); - return !!master_screen->SyncSharedPixmap; + return !!primary_screen->SyncSharedPixmap; } static Bool -slave_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) +secondary_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) { - ScreenPtr slave_screen = dirty->slave_dst->drawable.pScreen; + ScreenPtr secondary_screen = dirty->secondary_dst->drawable.pScreen; - return !!slave_screen->SyncSharedPixmap; + return !!secondary_screen->SyncSharedPixmap; } static void call_sync_shared_pixmap(PixmapDirtyUpdatePtr dirty) { - ScreenPtr master_screen = radeon_dirty_master(dirty); + ScreenPtr primary_screen = radeon_dirty_primary(dirty); - master_screen->SyncSharedPixmap(dirty); + primary_screen->SyncSharedPixmap(dirty); } #else /* !HAS_SYNC_SHARED_PIXMAP */ static Bool -master_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) +primary_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) { - ScrnInfoPtr master_scrn = xf86ScreenToScrn(radeon_dirty_master(dirty)); + ScrnInfoPtr primary_scrn = xf86ScreenToScrn(radeon_dirty_primary(dirty)); - return master_scrn->driverName == scrn->driverName; + return primary_scrn->driverName == scrn->driverName; } static Bool -slave_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) +secondary_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) { - ScrnInfoPtr slave_scrn = xf86ScreenToScrn(dirty->slave_dst->drawable.pScreen); + ScrnInfoPtr secondary_scrn = xf86ScreenToScrn(dirty->secondary_dst->drawable.pScreen); - return slave_scrn->driverName == scrn->driverName; + return secondary_scrn->driverName == scrn->driverName; } static void @@ -684,12 +684,12 @@ call_sync_shared_pixmap(PixmapDirtyUpdatePtr dirty) static xf86CrtcPtr radeon_prime_dirty_to_crtc(PixmapDirtyUpdatePtr dirty) { - ScreenPtr screen = dirty->slave_dst->drawable.pScreen; + ScreenPtr screen = dirty->secondary_dst->drawable.pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); int c; - /* Find the CRTC which is scanning out from this slave pixmap */ + /* Find the CRTC which is scanning out from this secondary pixmap */ for (c = 0; c < xf86_config->num_crtc; c++) { xf86CrtcPtr xf86_crtc = xf86_config->crtc[c]; drmmode_crtc_private_ptr drmmode_crtc = xf86_crtc->driver_private; @@ -714,7 +714,7 @@ radeon_prime_scanout_do_update(xf86CrtcPtr crtc, unsigned scanout_id) if (radeon_dirty_src_equals(dirty, drmmode_crtc->prime_scanout_pixmap)) { RegionPtr region; - if (master_has_sync_shared_pixmap(scrn, dirty)) + if (primary_has_sync_shared_pixmap(scrn, dirty)) call_sync_shared_pixmap(dirty); region = dirty_region(dirty); @@ -727,7 +727,7 @@ radeon_prime_scanout_do_update(xf86CrtcPtr crtc, unsigned scanout_id) radeon_cs_flush_indirect(scrn); RegionCopy(&drmmode_crtc->scanout_last_region, region); RegionTranslate(region, -crtc->x, -crtc->y); - dirty->slave_dst = drmmode_crtc->scanout[scanout_id].pixmap; + dirty->secondary_dst = drmmode_crtc->scanout[scanout_id].pixmap; } redisplay_dirty(dirty, region); @@ -754,7 +754,7 @@ radeon_prime_scanout_update_handler(xf86CrtcPtr crtc, uint32_t frame, uint64_t u static void radeon_prime_scanout_update(PixmapDirtyUpdatePtr dirty) { - ScreenPtr screen = dirty->slave_dst->drawable.pScreen; + ScreenPtr screen = dirty->secondary_dst->drawable.pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn); xf86CrtcPtr xf86_crtc = radeon_prime_dirty_to_crtc(dirty); @@ -818,7 +818,7 @@ radeon_prime_scanout_update(PixmapDirtyUpdatePtr dirty) static void radeon_prime_scanout_flip(PixmapDirtyUpdatePtr ent) { - ScreenPtr screen = ent->slave_dst->drawable.pScreen; + ScreenPtr screen = ent->secondary_dst->drawable.pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn); xf86CrtcPtr crtc = radeon_prime_dirty_to_crtc(ent); @@ -893,11 +893,11 @@ radeon_dirty_update(ScrnInfoPtr scrn) if (screen->isGPU) { PixmapDirtyUpdatePtr region_ent = ent; - if (master_has_sync_shared_pixmap(scrn, ent)) { - ScreenPtr master_screen = radeon_dirty_master(ent); + if (primary_has_sync_shared_pixmap(scrn, ent)) { + ScreenPtr primary_screen = radeon_dirty_primary(ent); - xorg_list_for_each_entry(region_ent, &master_screen->pixmap_dirty_list, ent) { - if (radeon_dirty_src_equals(ent, region_ent->slave_dst)) + xorg_list_for_each_entry(region_ent, &primary_screen->pixmap_dirty_list, ent) { + if (radeon_dirty_src_equals(ent, region_ent->secondary_dst)) break; } } @@ -921,7 +921,7 @@ radeon_dirty_update(ScrnInfoPtr scrn) RegionDestroy(region); } else { - if (slave_has_sync_shared_pixmap(scrn, ent)) + if (secondary_has_sync_shared_pixmap(scrn, ent)) continue; region = dirty_region(ent); @@ -1216,7 +1216,7 @@ static void RADEONBlockHandler_KMS(BLOCKHANDLER_ARGS_DECL) (*pScreen->BlockHandler) (BLOCKHANDLER_ARGS); pScreen->BlockHandler = RADEONBlockHandler_KMS; - if (!xf86ScreenToScrn(radeon_master_screen(pScreen))->vtSema) + if (!xf86ScreenToScrn(radeon_primary_screen(pScreen))->vtSema) return; if (!pScreen->isGPU) @@ -2584,7 +2584,7 @@ CARD32 cleanup_black_fb(OsTimerPtr timer, CARD32 now, pointer data) xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); int c; - if (xf86ScreenToScrn(radeon_master_screen(screen))->vtSema) + if (xf86ScreenToScrn(radeon_primary_screen(screen))->vtSema) return 0; /* Unreference the all-black FB created by RADEONLeaveVT_KMS. After ================================================ FILE: packages/x11/driver/xf86-video-intel/package.mk ================================================ # 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) PKG_NAME="xf86-video-intel" PKG_VERSION="31486f40f8e8f8923ca0799aea84b58799754564" PKG_SHA256="e47eb678c681d80df138e897ee27c79f9b42e3517d55b1f0684e9a70361c8218" PKG_ARCH="x86_64" PKG_LICENSE="OSS" PKG_SITE="https://www.x.org/wiki/IntelGraphicsDriver/" PKG_URL="https://gitlab.freedesktop.org/xorg/driver/${PKG_NAME}/-/archive/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain libXcomposite libXxf86vm libXdamage libdrm util-macros systemd xorg-server" PKG_LONGDESC="Open-source Xorg graphics driver for Intel graphics." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--disable-backlight \ --disable-backlight-helper \ --disable-gen4asm \ --enable-udev \ --disable-tools \ --enable-dri \ --disable-dri1 \ --enable-dri2 \ --enable-dri3 \ --enable-kms --enable-kms-only \ --disable-ums --disable-ums-only \ --enable-sna \ --enable-uxa \ --disable-xvmc \ --disable-xaa \ --disable-dga \ --disable-tear-free \ --disable-create2 \ --disable-async-swap \ --with-xorg-module-dir=${XORG_PATH_MODULES}" if [ "${VULKAN_SUPPORT}" = "yes" ]; then PKG_CONFIGURE_OPTS_TARGET+=" --with-default-dri=3" else PKG_CONFIGURE_OPTS_TARGET+=" --with-default-dri=2" fi post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { rm -rf ${INSTALL}/usr/share/polkit-1 } ================================================ FILE: packages/x11/driver/xf86-video-intel/patches/xf86-video-intel-100.01-prefer-iris-and-crocus-over-i965.patch ================================================ --- /src/sna/sna_dri2.c +++ /src/sna/sna_dri2.c @@ -3707,8 +3707,10 @@ return has_i830_dri() ? "i830" : "i915"; else if (sna->kgem.gen < 040) return "i915"; + else if (sna->kgem.gen < 0100) + return "crocus"; else - return "i965"; + return "iris"; } return s; ================================================ FILE: packages/x11/driver/xf86-video-nvidia/config/xorg-nvidia.conf ================================================ Section "Device" Identifier "nvidia" Driver "nvidia" Option "DynamicTwinView" "False" Option "NoFlip" "false" Option "NoLogo" "true" Option "ConnectToAcpid" "0" Option "ModeValidation" "NoVesaModes, NoXServerModes" Option "HWCursor" "false" # To put Xorg in debug mode change "false" to "true" in the line below: Option "ModeDebug" "false" # To use a local edid.bin file uncomment the 4 lines below (change DFP-0 to match your card) # Option "ConnectedMonitor" "DFP-0" # Option "CustomEDID" "DFP-0:/storage/.config/edid.bin" # Option "IgnoreEDID" "false" # Option "UseEDID" "true" EndSection Section "Screen" Identifier "screen" Device "nvidia" DefaultDepth 24 Option "ColorRange" "Full" # Option "ColorRange" "Limited" # Option "ColorSpace" "RGB" SubSection "Display" Depth 24 EndSubSection EndSection Section "Extensions" Option "Composite" "false" EndSection ================================================ FILE: packages/x11/driver/xf86-video-nvidia/package.mk ================================================ # 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) PKG_NAME="xf86-video-nvidia" # Remember to run "python3 packages/x11/driver/xf86-video-nvidia/scripts/make_nvidia_udev.py" and commit # changes to "packages/x11/driver/xf86-video-nvidia/udev.d/96-nvidia.rules" whenever bumping version. # The build host may require installation of python3-lxml and python3-requests packages. PKG_VERSION="470.161.03" PKG_SHA256="b318c15d519898fd60c64ef73fdd331045884a1d97d811a25fbced544b5be6ad" PKG_ARCH="x86_64" PKG_LICENSE="nonfree" PKG_SITE="https://www.nvidia.com/en-us/drivers/unix/" PKG_URL="http://us.download.nvidia.com/XFree86/Linux-x86_64/${PKG_VERSION}/NVIDIA-Linux-x86_64-${PKG_VERSION}-no-compat32.run" PKG_DEPENDS_TARGET="util-macros xorg-server libvdpau libglvnd" PKG_LONGDESC="The Xorg driver for NVIDIA GPUs supporting the GeForce 600 Series & above." PKG_TOOLCHAIN="manual" PKG_IS_KERNEL_PKG="yes" if [ "${VULKAN_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${VULKAN} vulkan-tools" fi unpack() { [ -d ${PKG_BUILD} ] && rm -rf ${PKG_BUILD} sh ${SOURCES}/${PKG_NAME}/${PKG_SOURCE_NAME} --extract-only --target ${PKG_BUILD} } make_target() { unset LDFLAGS cd kernel make module CC=${CC} LD=${LD} SYSSRC=$(kernel_path) SYSOUT=$(kernel_path) ${STRIP} --strip-debug nvidia.ko cd .. } makeinstall_target() { # Linux kernel modules mkdir -p ${INSTALL}/usr/lib/nvidia cp -P kernel/nvidia.ko ${INSTALL}/usr/lib/nvidia mkdir -p ${INSTALL}/$(get_full_module_dir)/nvidia ln -sf /var/lib/nvidia.ko ${INSTALL}/$(get_full_module_dir)/nvidia/nvidia.ko cp -P kernel/nvidia-uvm.ko ${INSTALL}/$(get_full_module_dir)/nvidia cp -P kernel/nvidia-modeset.ko ${INSTALL}/$(get_full_module_dir)/nvidia # X driver mkdir -p ${INSTALL}/${XORG_PATH_MODULES}/drivers cp -P nvidia_drv.so ${INSTALL}/${XORG_PATH_MODULES}/drivers/nvidia-main_drv.so ln -sf /var/lib/nvidia_drv.so ${INSTALL}/${XORG_PATH_MODULES}/drivers/nvidia_drv.so # GLX extension module for X mkdir -p ${INSTALL}/${XORG_PATH_MODULES}/extensions # rename to avoid conflicts with X.Org-Server module libglx.so cp -P libglxserver_nvidia.so.${PKG_VERSION} ${INSTALL}/${XORG_PATH_MODULES}/extensions/libglx_nvidia.so # Xorg config mkdir -p ${INSTALL}/etc/X11 cp ${PKG_DIR}/config/*.conf ${INSTALL}/etc/X11 # GLX mkdir -p ${INSTALL}/usr/lib cp -P libGLX_nvidia.so.${PKG_VERSION} ${INSTALL}/usr/lib/libGLX_nvidia.so.0 # GLVND mkdir -p ${INSTALL}/usr/share/glvnd/egl_vendor.d cp -p 10_nvidia.json ${INSTALL}/usr/share/glvnd/egl_vendor.d # OpenGL / EGL mkdir -p ${INSTALL}/usr/lib cp -p libEGL_nvidia.so.${PKG_VERSION} ${INSTALL}/usr/lib/ ln -sf libEGL_nvidia.so.${PKG_VERSION} ${INSTALL}/usr/lib/libEGL_nvidia.so.0 ln -sf libEGL_nvidia.so.0 ${INSTALL}/usr/lib/libEGL_nvidia.so # OpenGL core mkdir -p ${INSTALL}/usr/lib cp -p libnvidia-eglcore.so.${PKG_VERSION} ${INSTALL}/usr/lib/ cp -P libnvidia-glcore.so.${PKG_VERSION} ${INSTALL}/usr/lib cp -p libnvidia-glsi.so.${PKG_VERSION} ${INSTALL}/usr/lib # Install Vulkan ICD & SPIR-V lib if [ "${VULKAN_SUPPORT}" = "yes" ]; then mkdir -p ${INSTALL}/usr/lib cp -P libnvidia-glvkspirv.so.${PKG_VERSION} ${INSTALL}/usr/lib mkdir -p ${INSTALL}/usr/share/vulkan/icd.d cp -P nvidia_icd.json ${INSTALL}/usr/share/vulkan/icd.d mkdir -p ${INSTALL}/usr/share/vulkan/implicit_layer.d cp -P nvidia_layers.json ${INSTALL}/usr/share/vulkan/icd.d fi # nvidia-tls mkdir -p ${INSTALL}/usr/lib cp -P libnvidia-tls.so.${PKG_VERSION} ${INSTALL}/usr/lib # NVIDIA Management Library (NVML) / System Management Interface mkdir -p ${INSTALL}/usr/bin ln -s /var/lib/nvidia-smi ${INSTALL}/usr/bin/nvidia-smi cp nvidia-smi ${INSTALL}/usr/bin/nvidia-main-smi mkdir -p ${INSTALL}/usr/lib cp -P libnvidia-ml.so.${PKG_VERSION} ${INSTALL}/usr/lib ln -sf /var/lib/libnvidia-ml.so.1 ${INSTALL}/usr/lib/libnvidia-ml.so.1 # Tool for manipulating X server configuration files mkdir -p ${INSTALL}/usr/bin ln -s /var/lib/nvidia-xconfig ${INSTALL}/usr/bin/nvidia-xconfig cp nvidia-xconfig ${INSTALL}/usr/bin/nvidia-main-xconfig # VDPAU mkdir -p ${INSTALL}/usr/lib/vdpau cp libvdpau_nvidia.so* ${INSTALL}/usr/lib/vdpau/libvdpau_nvidia-main.so.1 ln -sf /var/lib/libvdpau_nvidia.so ${INSTALL}/usr/lib/vdpau/libvdpau_nvidia.so ln -sf /var/lib/libvdpau_nvidia.so.1 ${INSTALL}/usr/lib/vdpau/libvdpau_nvidia.so.1 # App profiles mkdir -p ${INSTALL}/usr/share/nvidia cp -P nvidia-application-profiles-${PKG_VERSION}-rc ${INSTALL}/usr/share/nvidia } ================================================ FILE: packages/x11/driver/xf86-video-nvidia/scripts/compare_nvidia.py ================================================ #!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv import re import os import requests import sys try: from lxml import html except: print('lxml module not installed.\n\nOn Ubuntu, use "sudo apt install python3-lxml"') sys.exit(1) category = { 1: 'Nvidia Geforce GPUs', 2: 'Nvidia Quadro GPUs', 3: 'Nvidia NVS GPUs', 4: 'Nvidia Tesla GPUs', } versions = [] unique_ids = {} all_ids = {i: [] for i in range(1, len(category))} def id_in_version(id, ids): if any(id == value for value in ids): return "x" else: return " " if len(sys.argv) <= 1: print("Usage: python compare_nvidia.py <version> ...") exit() for version in sys.argv[1:]: versions.append(version) for version in versions: url = 'http://us.download.nvidia.com/XFree86/Linux-x86_64/' + version + '/README/supportedchips.html' headers = { 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1', } page = requests.get(url, headers=headers) tree = html.fromstring(page.content) # These are the tables we want to use (gpu's supported by the current driver) # NVIDIA GeForce GPUs = 1 # NVIDIA Quadro GPUs = 2 # NVIDIA NVS GPUs = 3 # NVIDIA Tesla GPUs = 4 ids = {} unique_ids[version] = {} for table in range(1, len(category)): new_ids = tree.xpath('//html/body/div[@class="appendix"]/div[@class="informaltable"][' + str(table) + ']/table/tbody/tr[starts-with(@id, "devid")]/td[2]//text()') new_labels = tree.xpath('//html/body/div[@class="appendix"]/div[@class="informaltable"][' + str(table) + ']/table/tbody/tr[starts-with(@id, "devid")]/td[1]//text()') # nvidia seems to like to change the way they do things... if not new_ids: new_ids = tree.xpath('//html/body/div[@class="appendix"]/div[@class="informaltable"][' + str(table) + ']/table/tbody/tr[starts-with(@id, "0x")]/td[2]//text()') new_labels = tree.xpath('//html/body/div[@class="appendix"]/div[@class="informaltable"][' + str(table) + ']/table/tbody/tr[starts-with(@id, "0x")]/td[1]//text()') # just to make sure we get the raw id without 0x in front new_ids = [re.sub(r"^0x", '', id) for id in new_ids] # If three IDs are listed, the first is the PCI Device ID, the second is the PCI Subsystem Vendor ID, and the third is the PCI Subsystem Device ID. # We only want the PCI Device ID (the first value) new_ids = [id.split()[0].lower() for id in new_ids] # Sort and remove duplicate ID's ids[table] = sorted(set(zip(new_ids, new_labels))) # Add ids to list of all ids from all drivers being queried all_ids[table].extend(ids[table]) # Add the ids for the specific driver version unique_ids[version] = ids print("%s\t" % ("ID"), end='') for version in versions: print("%s\t" % (version), end='') print("Card Name") print("-----------------------------------------------------------------------------------------------") for table in all_ids: all_ids[table] = sorted(set(all_ids[table])) print("%s" % (category[table])) print("-----------------------------------------------------------------------------------------------") for id in all_ids[table]: print("%s\t" % (id[0]), end='') for version in versions: print("%s\t" % (id_in_version(id, unique_ids[version][table])), end='') print("%s\t" % (id[1]), end='') print("") print("-----------------------------------------------------------------------------------------------\n") ================================================ FILE: packages/x11/driver/xf86-video-nvidia/scripts/make_nvidia_udev.py ================================================ #!/usr/bin/env python3 import os, sys import requests try: from lxml import html except: print('lxml module not installed.\n\nOn Ubuntu, use "sudo apt install python3-lxml"') sys.exit(1) __cwd__ = os.path.dirname(os.path.realpath(__file__)) __rules__ = __cwd__ + '/../udev.d/96-nvidia.rules' __package__ = __cwd__ + '/../package.mk' # Get the Nvidia driver version currently being used for line in open(__package__, 'r'): if "PKG_VERSION" in line: __version__ = line.split('=')[1].replace('"','').strip() break url = 'http://us.download.nvidia.com/XFree86/Linux-x86_64/' + __version__ + '/README/supportedchips.html' headers = { 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1', } page = requests.get(url, headers=headers) tree = html.fromstring(page.content) # These are the tables we want to use (gpu's supported by the current driver) # NVIDIA GeForce GPUs = 1 # NVIDIA Quadro GPUs = 2 # NVIDIA NVS GPUs = 3 # NVIDIA Tesla GPUs = 4 ids = [] for table in range(1, 5): ids = ids + tree.xpath('//html/body/div[@class="appendix"]/div[@class="informaltable"][' + str(table) + ']/table/tbody/tr[starts-with(@id, "devid")]/td[2]//text()') # If three IDs are listed, the first is the PCI Device ID, the second is the PCI Subsystem Vendor ID, and the third is the PCI Subsystem Device ID. # We only want the PCI Device ID (the first value) unique_ids = [] for id in ids: unique_ids.append(id.split()[0].lower()) # Sort and remove duplicate ID's unique_ids = sorted(set(unique_ids)) # Write the rules to the file with open(__rules__, 'w') as f: f.write('ACTION!="add|change", GOTO="end_video"\n') f.write('SUBSYSTEM=="pci", ATTR{class}=="0x030000", ATTR{vendor}=="0x10de", GOTO="subsystem_pci"\n') f.write('GOTO="end_video"\n\n') f.write('LABEL="subsystem_pci"\n') for id in unique_ids: f.write('ATTR{device}=="0x' + str(id) + '", GOTO="configure_nvidia"\n') f.write('GOTO="configure_nvidia-legacy"\n\n') f.write('LABEL="configure_nvidia"\n') f.write('ENV{xorg_driver}="nvidia", TAG+="systemd", ENV{SYSTEMD_WANTS}+="xorg-configure@nvidia.service"\n') f.write('GOTO="end_video"\n\n') f.write('LABEL="configure_nvidia-legacy"\n') f.write('ENV{xorg_driver}="nvidia", TAG+="systemd", ENV{SYSTEMD_WANTS}+="xorg-configure@nvidia-legacy.service"\n') f.write('GOTO="end_video"\n\n') f.write('LABEL="end_video"\n') ================================================ FILE: packages/x11/driver/xf86-video-nvidia/udev.d/96-nvidia.rules ================================================ ACTION!="add|change", GOTO="end_video" SUBSYSTEM=="pci", ATTR{class}=="0x030000", ATTR{vendor}=="0x10de", GOTO="subsystem_pci" GOTO="end_video" LABEL="subsystem_pci" ATTR{device}=="0x0fc0", GOTO="configure_nvidia" ATTR{device}=="0x0fc1", GOTO="configure_nvidia" ATTR{device}=="0x0fc2", GOTO="configure_nvidia" ATTR{device}=="0x0fc6", GOTO="configure_nvidia" ATTR{device}=="0x0fc8", GOTO="configure_nvidia" ATTR{device}=="0x0fc9", GOTO="configure_nvidia" ATTR{device}=="0x0fd2", GOTO="configure_nvidia" ATTR{device}=="0x0fe3", GOTO="configure_nvidia" ATTR{device}=="0x0ff3", GOTO="configure_nvidia" ATTR{device}=="0x0ff9", GOTO="configure_nvidia" ATTR{device}=="0x0ffa", GOTO="configure_nvidia" ATTR{device}=="0x0ffd", GOTO="configure_nvidia" ATTR{device}=="0x0ffe", GOTO="configure_nvidia" ATTR{device}=="0x0fff", GOTO="configure_nvidia" ATTR{device}=="0x1001", GOTO="configure_nvidia" ATTR{device}=="0x1004", GOTO="configure_nvidia" ATTR{device}=="0x1005", GOTO="configure_nvidia" ATTR{device}=="0x1007", GOTO="configure_nvidia" ATTR{device}=="0x1008", GOTO="configure_nvidia" ATTR{device}=="0x100a", GOTO="configure_nvidia" ATTR{device}=="0x100c", GOTO="configure_nvidia" ATTR{device}=="0x1021", GOTO="configure_nvidia" ATTR{device}=="0x1022", GOTO="configure_nvidia" ATTR{device}=="0x1023", GOTO="configure_nvidia" ATTR{device}=="0x1024", GOTO="configure_nvidia" ATTR{device}=="0x1026", GOTO="configure_nvidia" ATTR{device}=="0x1027", GOTO="configure_nvidia" ATTR{device}=="0x1028", GOTO="configure_nvidia" ATTR{device}=="0x1029", GOTO="configure_nvidia" ATTR{device}=="0x102a", GOTO="configure_nvidia" ATTR{device}=="0x102d", GOTO="configure_nvidia" ATTR{device}=="0x103a", GOTO="configure_nvidia" ATTR{device}=="0x103c", GOTO="configure_nvidia" ATTR{device}=="0x1180", GOTO="configure_nvidia" ATTR{device}=="0x1183", GOTO="configure_nvidia" ATTR{device}=="0x1184", GOTO="configure_nvidia" ATTR{device}=="0x1185", GOTO="configure_nvidia" ATTR{device}=="0x1187", GOTO="configure_nvidia" ATTR{device}=="0x1188", GOTO="configure_nvidia" ATTR{device}=="0x1189", GOTO="configure_nvidia" ATTR{device}=="0x118e", GOTO="configure_nvidia" ATTR{device}=="0x118f", GOTO="configure_nvidia" ATTR{device}=="0x1193", GOTO="configure_nvidia" ATTR{device}=="0x1194", GOTO="configure_nvidia" ATTR{device}=="0x1195", GOTO="configure_nvidia" ATTR{device}=="0x1199", GOTO="configure_nvidia" ATTR{device}=="0x11b4", GOTO="configure_nvidia" ATTR{device}=="0x11ba", GOTO="configure_nvidia" ATTR{device}=="0x11c0", GOTO="configure_nvidia" ATTR{device}=="0x11c2", GOTO="configure_nvidia" ATTR{device}=="0x11c3", GOTO="configure_nvidia" ATTR{device}=="0x11c4", GOTO="configure_nvidia" ATTR{device}=="0x11c5", GOTO="configure_nvidia" ATTR{device}=="0x11c6", GOTO="configure_nvidia" ATTR{device}=="0x11c8", GOTO="configure_nvidia" ATTR{device}=="0x11cb", GOTO="configure_nvidia" ATTR{device}=="0x11e3", GOTO="configure_nvidia" ATTR{device}=="0x11fa", GOTO="configure_nvidia" ATTR{device}=="0x1280", GOTO="configure_nvidia" ATTR{device}=="0x1281", GOTO="configure_nvidia" ATTR{device}=="0x1282", GOTO="configure_nvidia" ATTR{device}=="0x1284", GOTO="configure_nvidia" ATTR{device}=="0x1286", GOTO="configure_nvidia" ATTR{device}=="0x1287", GOTO="configure_nvidia" ATTR{device}=="0x1288", GOTO="configure_nvidia" ATTR{device}=="0x1289", GOTO="configure_nvidia" ATTR{device}=="0x128b", GOTO="configure_nvidia" ATTR{device}=="0x1290", GOTO="configure_nvidia" ATTR{device}=="0x1292", GOTO="configure_nvidia" ATTR{device}=="0x1295", GOTO="configure_nvidia" ATTR{device}=="0x1299", GOTO="configure_nvidia" ATTR{device}=="0x1340", GOTO="configure_nvidia" ATTR{device}=="0x1341", GOTO="configure_nvidia" ATTR{device}=="0x1344", GOTO="configure_nvidia" ATTR{device}=="0x1346", GOTO="configure_nvidia" ATTR{device}=="0x1347", GOTO="configure_nvidia" ATTR{device}=="0x1348", GOTO="configure_nvidia" ATTR{device}=="0x1349", GOTO="configure_nvidia" ATTR{device}=="0x134b", GOTO="configure_nvidia" ATTR{device}=="0x134d", GOTO="configure_nvidia" ATTR{device}=="0x134e", GOTO="configure_nvidia" ATTR{device}=="0x134f", GOTO="configure_nvidia" ATTR{device}=="0x137a", GOTO="configure_nvidia" ATTR{device}=="0x137b", GOTO="configure_nvidia" ATTR{device}=="0x137d", GOTO="configure_nvidia" ATTR{device}=="0x1380", GOTO="configure_nvidia" ATTR{device}=="0x1381", GOTO="configure_nvidia" ATTR{device}=="0x1382", GOTO="configure_nvidia" ATTR{device}=="0x1390", GOTO="configure_nvidia" ATTR{device}=="0x1391", GOTO="configure_nvidia" ATTR{device}=="0x1392", GOTO="configure_nvidia" ATTR{device}=="0x1393", GOTO="configure_nvidia" ATTR{device}=="0x1398", GOTO="configure_nvidia" ATTR{device}=="0x1399", GOTO="configure_nvidia" ATTR{device}=="0x139a", GOTO="configure_nvidia" ATTR{device}=="0x139b", GOTO="configure_nvidia" ATTR{device}=="0x139c", GOTO="configure_nvidia" ATTR{device}=="0x139d", GOTO="configure_nvidia" ATTR{device}=="0x13b0", GOTO="configure_nvidia" ATTR{device}=="0x13b1", GOTO="configure_nvidia" ATTR{device}=="0x13b2", GOTO="configure_nvidia" ATTR{device}=="0x13b3", GOTO="configure_nvidia" ATTR{device}=="0x13b4", GOTO="configure_nvidia" ATTR{device}=="0x13b6", GOTO="configure_nvidia" ATTR{device}=="0x13b9", GOTO="configure_nvidia" ATTR{device}=="0x13ba", GOTO="configure_nvidia" ATTR{device}=="0x13bb", GOTO="configure_nvidia" ATTR{device}=="0x13bc", GOTO="configure_nvidia" ATTR{device}=="0x13c0", GOTO="configure_nvidia" ATTR{device}=="0x13c2", GOTO="configure_nvidia" ATTR{device}=="0x13d7", GOTO="configure_nvidia" ATTR{device}=="0x13d8", GOTO="configure_nvidia" ATTR{device}=="0x13d9", GOTO="configure_nvidia" ATTR{device}=="0x13da", GOTO="configure_nvidia" ATTR{device}=="0x13f0", GOTO="configure_nvidia" ATTR{device}=="0x13f1", GOTO="configure_nvidia" ATTR{device}=="0x13f2", GOTO="configure_nvidia" ATTR{device}=="0x13f3", GOTO="configure_nvidia" ATTR{device}=="0x13f8", GOTO="configure_nvidia" ATTR{device}=="0x13f9", GOTO="configure_nvidia" ATTR{device}=="0x13fa", GOTO="configure_nvidia" ATTR{device}=="0x13fb", GOTO="configure_nvidia" ATTR{device}=="0x1401", GOTO="configure_nvidia" ATTR{device}=="0x1402", GOTO="configure_nvidia" ATTR{device}=="0x1406", GOTO="configure_nvidia" ATTR{device}=="0x1407", GOTO="configure_nvidia" ATTR{device}=="0x1427", GOTO="configure_nvidia" ATTR{device}=="0x1430", GOTO="configure_nvidia" ATTR{device}=="0x1431", GOTO="configure_nvidia" ATTR{device}=="0x1436", GOTO="configure_nvidia" ATTR{device}=="0x15f0", GOTO="configure_nvidia" ATTR{device}=="0x15f7", GOTO="configure_nvidia" ATTR{device}=="0x15f8", GOTO="configure_nvidia" ATTR{device}=="0x15f9", GOTO="configure_nvidia" ATTR{device}=="0x1617", GOTO="configure_nvidia" ATTR{device}=="0x1618", GOTO="configure_nvidia" ATTR{device}=="0x1619", GOTO="configure_nvidia" ATTR{device}=="0x161a", GOTO="configure_nvidia" ATTR{device}=="0x1667", GOTO="configure_nvidia" ATTR{device}=="0x174d", GOTO="configure_nvidia" ATTR{device}=="0x174e", GOTO="configure_nvidia" ATTR{device}=="0x179c", GOTO="configure_nvidia" ATTR{device}=="0x17c2", GOTO="configure_nvidia" ATTR{device}=="0x17c8", GOTO="configure_nvidia" ATTR{device}=="0x17f0", GOTO="configure_nvidia" ATTR{device}=="0x17f1", GOTO="configure_nvidia" ATTR{device}=="0x17fd", GOTO="configure_nvidia" ATTR{device}=="0x1b00", GOTO="configure_nvidia" ATTR{device}=="0x1b02", GOTO="configure_nvidia" ATTR{device}=="0x1b06", GOTO="configure_nvidia" ATTR{device}=="0x1b30", GOTO="configure_nvidia" ATTR{device}=="0x1b38", GOTO="configure_nvidia" ATTR{device}=="0x1b80", GOTO="configure_nvidia" ATTR{device}=="0x1b81", GOTO="configure_nvidia" ATTR{device}=="0x1b82", GOTO="configure_nvidia" ATTR{device}=="0x1b83", GOTO="configure_nvidia" ATTR{device}=="0x1b84", GOTO="configure_nvidia" ATTR{device}=="0x1b87", GOTO="configure_nvidia" ATTR{device}=="0x1ba0", GOTO="configure_nvidia" ATTR{device}=="0x1ba1", GOTO="configure_nvidia" ATTR{device}=="0x1ba2", GOTO="configure_nvidia" ATTR{device}=="0x1bb0", GOTO="configure_nvidia" ATTR{device}=="0x1bb1", GOTO="configure_nvidia" ATTR{device}=="0x1bb3", GOTO="configure_nvidia" ATTR{device}=="0x1bb4", GOTO="configure_nvidia" ATTR{device}=="0x1bb5", GOTO="configure_nvidia" ATTR{device}=="0x1bb6", GOTO="configure_nvidia" ATTR{device}=="0x1bb7", GOTO="configure_nvidia" ATTR{device}=="0x1bb8", GOTO="configure_nvidia" ATTR{device}=="0x1bb9", GOTO="configure_nvidia" ATTR{device}=="0x1bbb", GOTO="configure_nvidia" ATTR{device}=="0x1bc7", GOTO="configure_nvidia" ATTR{device}=="0x1be0", GOTO="configure_nvidia" ATTR{device}=="0x1be1", GOTO="configure_nvidia" ATTR{device}=="0x1c02", GOTO="configure_nvidia" ATTR{device}=="0x1c03", GOTO="configure_nvidia" ATTR{device}=="0x1c04", GOTO="configure_nvidia" ATTR{device}=="0x1c06", GOTO="configure_nvidia" ATTR{device}=="0x1c07", GOTO="configure_nvidia" ATTR{device}=="0x1c09", GOTO="configure_nvidia" ATTR{device}=="0x1c20", GOTO="configure_nvidia" ATTR{device}=="0x1c21", GOTO="configure_nvidia" ATTR{device}=="0x1c22", GOTO="configure_nvidia" ATTR{device}=="0x1c23", GOTO="configure_nvidia" ATTR{device}=="0x1c30", GOTO="configure_nvidia" ATTR{device}=="0x1c31", GOTO="configure_nvidia" ATTR{device}=="0x1c60", GOTO="configure_nvidia" ATTR{device}=="0x1c61", GOTO="configure_nvidia" ATTR{device}=="0x1c62", GOTO="configure_nvidia" ATTR{device}=="0x1c81", GOTO="configure_nvidia" ATTR{device}=="0x1c82", GOTO="configure_nvidia" ATTR{device}=="0x1c83", GOTO="configure_nvidia" ATTR{device}=="0x1c8c", GOTO="configure_nvidia" ATTR{device}=="0x1c8d", GOTO="configure_nvidia" ATTR{device}=="0x1c8f", GOTO="configure_nvidia" ATTR{device}=="0x1c90", GOTO="configure_nvidia" ATTR{device}=="0x1c91", GOTO="configure_nvidia" ATTR{device}=="0x1c92", GOTO="configure_nvidia" ATTR{device}=="0x1c94", GOTO="configure_nvidia" ATTR{device}=="0x1c96", GOTO="configure_nvidia" ATTR{device}=="0x1cb1", GOTO="configure_nvidia" ATTR{device}=="0x1cb2", GOTO="configure_nvidia" ATTR{device}=="0x1cb3", GOTO="configure_nvidia" ATTR{device}=="0x1cb6", GOTO="configure_nvidia" ATTR{device}=="0x1cba", GOTO="configure_nvidia" ATTR{device}=="0x1cbb", GOTO="configure_nvidia" ATTR{device}=="0x1cbc", GOTO="configure_nvidia" ATTR{device}=="0x1cbd", GOTO="configure_nvidia" ATTR{device}=="0x1cfa", GOTO="configure_nvidia" ATTR{device}=="0x1cfb", GOTO="configure_nvidia" ATTR{device}=="0x1d01", GOTO="configure_nvidia" ATTR{device}=="0x1d02", GOTO="configure_nvidia" ATTR{device}=="0x1d10", GOTO="configure_nvidia" ATTR{device}=="0x1d11", GOTO="configure_nvidia" ATTR{device}=="0x1d12", GOTO="configure_nvidia" ATTR{device}=="0x1d13", GOTO="configure_nvidia" ATTR{device}=="0x1d16", GOTO="configure_nvidia" ATTR{device}=="0x1d33", GOTO="configure_nvidia" ATTR{device}=="0x1d34", GOTO="configure_nvidia" ATTR{device}=="0x1d52", GOTO="configure_nvidia" ATTR{device}=="0x1d81", GOTO="configure_nvidia" ATTR{device}=="0x1db1", GOTO="configure_nvidia" ATTR{device}=="0x1db3", GOTO="configure_nvidia" ATTR{device}=="0x1db4", GOTO="configure_nvidia" ATTR{device}=="0x1db5", GOTO="configure_nvidia" ATTR{device}=="0x1db6", GOTO="configure_nvidia" ATTR{device}=="0x1db7", GOTO="configure_nvidia" ATTR{device}=="0x1db8", GOTO="configure_nvidia" ATTR{device}=="0x1dba", GOTO="configure_nvidia" ATTR{device}=="0x1df0", GOTO="configure_nvidia" ATTR{device}=="0x1df2", GOTO="configure_nvidia" ATTR{device}=="0x1df5", GOTO="configure_nvidia" ATTR{device}=="0x1df6", GOTO="configure_nvidia" ATTR{device}=="0x1e02", GOTO="configure_nvidia" ATTR{device}=="0x1e04", GOTO="configure_nvidia" ATTR{device}=="0x1e07", GOTO="configure_nvidia" ATTR{device}=="0x1e09", GOTO="configure_nvidia" ATTR{device}=="0x1e30", GOTO="configure_nvidia" ATTR{device}=="0x1e36", GOTO="configure_nvidia" ATTR{device}=="0x1e78", GOTO="configure_nvidia" ATTR{device}=="0x1e81", GOTO="configure_nvidia" ATTR{device}=="0x1e82", GOTO="configure_nvidia" ATTR{device}=="0x1e84", GOTO="configure_nvidia" ATTR{device}=="0x1e87", GOTO="configure_nvidia" ATTR{device}=="0x1e89", GOTO="configure_nvidia" ATTR{device}=="0x1e90", GOTO="configure_nvidia" ATTR{device}=="0x1e91", GOTO="configure_nvidia" ATTR{device}=="0x1e93", GOTO="configure_nvidia" ATTR{device}=="0x1eb0", GOTO="configure_nvidia" ATTR{device}=="0x1eb1", GOTO="configure_nvidia" ATTR{device}=="0x1eb4", GOTO="configure_nvidia" ATTR{device}=="0x1eb5", GOTO="configure_nvidia" ATTR{device}=="0x1eb6", GOTO="configure_nvidia" ATTR{device}=="0x1eb8", GOTO="configure_nvidia" ATTR{device}=="0x1ec2", GOTO="configure_nvidia" ATTR{device}=="0x1ec7", GOTO="configure_nvidia" ATTR{device}=="0x1ed0", GOTO="configure_nvidia" ATTR{device}=="0x1ed1", GOTO="configure_nvidia" ATTR{device}=="0x1ed3", GOTO="configure_nvidia" ATTR{device}=="0x1ef5", GOTO="configure_nvidia" ATTR{device}=="0x1f02", GOTO="configure_nvidia" ATTR{device}=="0x1f03", GOTO="configure_nvidia" ATTR{device}=="0x1f06", GOTO="configure_nvidia" ATTR{device}=="0x1f07", GOTO="configure_nvidia" ATTR{device}=="0x1f08", GOTO="configure_nvidia" ATTR{device}=="0x1f09", GOTO="configure_nvidia" ATTR{device}=="0x1f0a", GOTO="configure_nvidia" ATTR{device}=="0x1f0b", GOTO="configure_nvidia" ATTR{device}=="0x1f10", GOTO="configure_nvidia" ATTR{device}=="0x1f11", GOTO="configure_nvidia" ATTR{device}=="0x1f12", GOTO="configure_nvidia" ATTR{device}=="0x1f14", GOTO="configure_nvidia" ATTR{device}=="0x1f15", GOTO="configure_nvidia" ATTR{device}=="0x1f36", GOTO="configure_nvidia" ATTR{device}=="0x1f42", GOTO="configure_nvidia" ATTR{device}=="0x1f47", GOTO="configure_nvidia" ATTR{device}=="0x1f50", GOTO="configure_nvidia" ATTR{device}=="0x1f51", GOTO="configure_nvidia" ATTR{device}=="0x1f54", GOTO="configure_nvidia" ATTR{device}=="0x1f55", GOTO="configure_nvidia" ATTR{device}=="0x1f76", GOTO="configure_nvidia" ATTR{device}=="0x1f82", GOTO="configure_nvidia" ATTR{device}=="0x1f91", GOTO="configure_nvidia" ATTR{device}=="0x1f95", GOTO="configure_nvidia" ATTR{device}=="0x1f96", GOTO="configure_nvidia" ATTR{device}=="0x1f97", GOTO="configure_nvidia" ATTR{device}=="0x1f98", GOTO="configure_nvidia" ATTR{device}=="0x1f99", GOTO="configure_nvidia" ATTR{device}=="0x1f9c", GOTO="configure_nvidia" ATTR{device}=="0x1f9d", GOTO="configure_nvidia" ATTR{device}=="0x1f9f", GOTO="configure_nvidia" ATTR{device}=="0x1fa0", GOTO="configure_nvidia" ATTR{device}=="0x1fb0", GOTO="configure_nvidia" ATTR{device}=="0x1fb1", GOTO="configure_nvidia" ATTR{device}=="0x1fb2", GOTO="configure_nvidia" ATTR{device}=="0x1fb6", GOTO="configure_nvidia" ATTR{device}=="0x1fb7", GOTO="configure_nvidia" ATTR{device}=="0x1fb8", GOTO="configure_nvidia" ATTR{device}=="0x1fb9", GOTO="configure_nvidia" ATTR{device}=="0x1fba", GOTO="configure_nvidia" ATTR{device}=="0x1fbb", GOTO="configure_nvidia" ATTR{device}=="0x1fbc", GOTO="configure_nvidia" ATTR{device}=="0x1fdd", GOTO="configure_nvidia" ATTR{device}=="0x1ff0", GOTO="configure_nvidia" ATTR{device}=="0x1ff2", GOTO="configure_nvidia" ATTR{device}=="0x1ff9", GOTO="configure_nvidia" ATTR{device}=="0x20b0", GOTO="configure_nvidia" ATTR{device}=="0x20b1", GOTO="configure_nvidia" ATTR{device}=="0x20b2", GOTO="configure_nvidia" ATTR{device}=="0x20b3", GOTO="configure_nvidia" ATTR{device}=="0x20b5", GOTO="configure_nvidia" ATTR{device}=="0x20b6", GOTO="configure_nvidia" ATTR{device}=="0x20b7", GOTO="configure_nvidia" ATTR{device}=="0x20f0", GOTO="configure_nvidia" ATTR{device}=="0x20f1", GOTO="configure_nvidia" ATTR{device}=="0x20f2", GOTO="configure_nvidia" ATTR{device}=="0x2182", GOTO="configure_nvidia" ATTR{device}=="0x2184", GOTO="configure_nvidia" ATTR{device}=="0x2187", GOTO="configure_nvidia" ATTR{device}=="0x2188", GOTO="configure_nvidia" ATTR{device}=="0x2189", GOTO="configure_nvidia" ATTR{device}=="0x2191", GOTO="configure_nvidia" ATTR{device}=="0x2192", GOTO="configure_nvidia" ATTR{device}=="0x21c4", GOTO="configure_nvidia" ATTR{device}=="0x21d1", GOTO="configure_nvidia" ATTR{device}=="0x2203", GOTO="configure_nvidia" ATTR{device}=="0x2204", GOTO="configure_nvidia" ATTR{device}=="0x2206", GOTO="configure_nvidia" ATTR{device}=="0x2208", GOTO="configure_nvidia" ATTR{device}=="0x220a", GOTO="configure_nvidia" ATTR{device}=="0x220d", GOTO="configure_nvidia" ATTR{device}=="0x2216", GOTO="configure_nvidia" ATTR{device}=="0x2230", GOTO="configure_nvidia" ATTR{device}=="0x2231", GOTO="configure_nvidia" ATTR{device}=="0x2232", GOTO="configure_nvidia" ATTR{device}=="0x2235", GOTO="configure_nvidia" ATTR{device}=="0x2236", GOTO="configure_nvidia" ATTR{device}=="0x2237", GOTO="configure_nvidia" ATTR{device}=="0x2414", GOTO="configure_nvidia" ATTR{device}=="0x2420", GOTO="configure_nvidia" ATTR{device}=="0x2438", GOTO="configure_nvidia" ATTR{device}=="0x2460", GOTO="configure_nvidia" ATTR{device}=="0x2482", GOTO="configure_nvidia" ATTR{device}=="0x2484", GOTO="configure_nvidia" ATTR{device}=="0x2486", GOTO="configure_nvidia" ATTR{device}=="0x2487", GOTO="configure_nvidia" ATTR{device}=="0x2488", GOTO="configure_nvidia" ATTR{device}=="0x2489", GOTO="configure_nvidia" ATTR{device}=="0x248a", GOTO="configure_nvidia" ATTR{device}=="0x249c", GOTO="configure_nvidia" ATTR{device}=="0x249d", GOTO="configure_nvidia" ATTR{device}=="0x24a0", GOTO="configure_nvidia" ATTR{device}=="0x24b0", GOTO="configure_nvidia" ATTR{device}=="0x24b6", GOTO="configure_nvidia" ATTR{device}=="0x24b7", GOTO="configure_nvidia" ATTR{device}=="0x24b8", GOTO="configure_nvidia" ATTR{device}=="0x24b9", GOTO="configure_nvidia" ATTR{device}=="0x24ba", GOTO="configure_nvidia" ATTR{device}=="0x24bb", GOTO="configure_nvidia" ATTR{device}=="0x24dc", GOTO="configure_nvidia" ATTR{device}=="0x24dd", GOTO="configure_nvidia" ATTR{device}=="0x24e0", GOTO="configure_nvidia" ATTR{device}=="0x24fa", GOTO="configure_nvidia" ATTR{device}=="0x2503", GOTO="configure_nvidia" ATTR{device}=="0x2504", GOTO="configure_nvidia" ATTR{device}=="0x2507", GOTO="configure_nvidia" ATTR{device}=="0x2508", GOTO="configure_nvidia" ATTR{device}=="0x2520", GOTO="configure_nvidia" ATTR{device}=="0x2523", GOTO="configure_nvidia" ATTR{device}=="0x2531", GOTO="configure_nvidia" ATTR{device}=="0x2560", GOTO="configure_nvidia" ATTR{device}=="0x2563", GOTO="configure_nvidia" ATTR{device}=="0x2571", GOTO="configure_nvidia" ATTR{device}=="0x25a0", GOTO="configure_nvidia" ATTR{device}=="0x25a2", GOTO="configure_nvidia" ATTR{device}=="0x25a5", GOTO="configure_nvidia" ATTR{device}=="0x25a6", GOTO="configure_nvidia" ATTR{device}=="0x25a7", GOTO="configure_nvidia" ATTR{device}=="0x25a9", GOTO="configure_nvidia" ATTR{device}=="0x25b6", GOTO="configure_nvidia" ATTR{device}=="0x25b8", GOTO="configure_nvidia" ATTR{device}=="0x25b9", GOTO="configure_nvidia" ATTR{device}=="0x25ba", GOTO="configure_nvidia" ATTR{device}=="0x25bb", GOTO="configure_nvidia" ATTR{device}=="0x25e0", GOTO="configure_nvidia" ATTR{device}=="0x25e2", GOTO="configure_nvidia" ATTR{device}=="0x25e5", GOTO="configure_nvidia" ATTR{device}=="0x25f9", GOTO="configure_nvidia" ATTR{device}=="0x25fa", GOTO="configure_nvidia" GOTO="configure_nvidia-legacy" LABEL="configure_nvidia" ENV{xorg_driver}="nvidia", TAG+="systemd", ENV{SYSTEMD_WANTS}+="xorg-configure@nvidia.service" GOTO="end_video" LABEL="configure_nvidia-legacy" ENV{xorg_driver}="nvidia", TAG+="systemd", ENV{SYSTEMD_WANTS}+="xorg-configure@nvidia-legacy.service" GOTO="end_video" LABEL="end_video" ================================================ FILE: packages/x11/driver/xf86-video-nvidia-legacy/config/xorg-nvidia-legacy.conf ================================================ Section "Device" Identifier "nvidia" Driver "nvidia" Option "DynamicTwinView" "False" Option "NoFlip" "false" Option "NoLogo" "true" Option "ConnectToAcpid" "0" Option "ModeValidation" "NoVesaModes, NoXServerModes" Option "HWCursor" "false" # To put Xorg in debug mode change "false" to "true" in the line below: Option "ModeDebug" "false" # To use a local edid.bin file uncomment the 4 lines below (change DFP-0 to match your card) # Option "ConnectedMonitor" "DFP-0" # Option "CustomEDID" "DFP-0:/storage/.config/edid.bin" # Option "IgnoreEDID" "false" # Option "UseEDID" "true" EndSection Section "Screen" Identifier "screen" Device "nvidia" DefaultDepth 24 Option "ColorRange" "Full" # Option "ColorRange" "Limited" # Option "ColorSpace" "RGB" SubSection "Display" Depth 24 EndSubSection EndSection Section "Extensions" Option "Composite" "false" EndSection ================================================ FILE: packages/x11/driver/xf86-video-nvidia-legacy/package.mk ================================================ # 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) PKG_NAME="xf86-video-nvidia-legacy" PKG_VERSION="340.108" PKG_SHA256="995d44fef587ff5284497a47a95d71adbee0c13020d615e940ac928f180f5b77" PKG_ARCH="x86_64" PKG_LICENSE="nonfree" PKG_SITE="https://www.nvidia.com/en-us/drivers/unix/" PKG_URL="http://us.download.nvidia.com/XFree86/Linux-x86_64/${PKG_VERSION}/NVIDIA-Linux-x86_64-${PKG_VERSION}-no-compat32.run" PKG_DEPENDS_TARGET="util-macros xorg-server libvdpau" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="The Xorg driver for NVIDIA GPUs supporting the GeForce 500 Series & older devices." PKG_TOOLCHAIN="manual" PKG_IS_KERNEL_PKG="yes" unpack() { [ -d ${PKG_BUILD} ] && rm -rf ${PKG_BUILD} sh ${SOURCES}/${PKG_NAME}/${PKG_SOURCE_NAME} --extract-only --target ${PKG_BUILD} } make_target() { unset LDFLAGS cd kernel make module CC=${CC} LD=${LD} SYSSRC=$(kernel_path) SYSOUT=$(kernel_path) ${STRIP} --strip-debug nvidia.ko cd .. } makeinstall_target() { mkdir -p ${INSTALL}/${XORG_PATH_MODULES}/drivers cp -P nvidia_drv.so ${INSTALL}/${XORG_PATH_MODULES}/drivers/nvidia-legacy_drv.so ln -sf /var/lib/nvidia_drv.so ${INSTALL}/${XORG_PATH_MODULES}/drivers/nvidia_drv.so mkdir -p ${INSTALL}/${XORG_PATH_MODULES}/extensions # rename to not conflicting with Mesa libGL.so cp -P libglx.so* ${INSTALL}/${XORG_PATH_MODULES}/extensions/libglx_nvidia-legacy.so mkdir -p ${INSTALL}/etc/X11 cp ${PKG_DIR}/config/*.conf ${INSTALL}/etc/X11 mkdir -p ${INSTALL}/usr/lib cp -P libnvidia-glcore.so.${PKG_VERSION} ${INSTALL}/usr/lib cp -P libnvidia-ml.so.${PKG_VERSION} ${INSTALL}/usr/lib ln -sf /var/lib/libnvidia-ml.so.1 ${INSTALL}/usr/lib/libnvidia-ml.so.1 cp -P tls/libnvidia-tls.so.${PKG_VERSION} ${INSTALL}/usr/lib # rename to not conflicting with Mesa libGL.so cp -P libGL.so* ${INSTALL}/usr/lib/libGL_nvidia-legacy.so.1 mkdir -p ${INSTALL}/$(get_full_module_dir)/nvidia ln -sf /var/lib/nvidia.ko ${INSTALL}/$(get_full_module_dir)/nvidia/nvidia.ko mkdir -p ${INSTALL}/usr/lib/nvidia-legacy cp kernel/nvidia.ko ${INSTALL}/usr/lib/nvidia-legacy mkdir -p ${INSTALL}/usr/bin ln -s /var/lib/nvidia-smi ${INSTALL}/usr/bin/nvidia-smi cp nvidia-smi ${INSTALL}/usr/bin/nvidia-legacy-smi ln -s /var/lib/nvidia-xconfig ${INSTALL}/usr/bin/nvidia-xconfig cp nvidia-xconfig ${INSTALL}/usr/bin/nvidia-legacy-xconfig mkdir -p ${INSTALL}/usr/lib/vdpau cp libvdpau_nvidia.so* ${INSTALL}/usr/lib/vdpau/libvdpau_nvidia-legacy.so.1 ln -sf /var/lib/libvdpau_nvidia.so ${INSTALL}/usr/lib/vdpau/libvdpau_nvidia.so ln -sf /var/lib/libvdpau_nvidia.so.1 ${INSTALL}/usr/lib/vdpau/libvdpau_nvidia.so.1 } ================================================ FILE: packages/x11/driver/xf86-video-nvidia-legacy/patches/xf86-video-nvidia-legacy-100.01-kernel-5.7.patch ================================================ From 2154cc447a2377cfd60a7b7c5b619e689ebf71b1 Mon Sep 17 00:00:00 2001 From: graysky <graysky@archlinux.us> Date: Thu, 22 Oct 2020 06:58:53 -0400 Subject: [PATCH 1/3] kernel-5.7 credit: https://gitlab.manjaro.org/packages?utf8=%E2%9C%93&filter=nvidia-340xx --- kernel/Makefile | 5 + kernel/conftest.sh | 81 +++++++++++++ kernel/dkms.conf | 8 +- kernel/nv-drm.c | 229 ++++++++++++++++++++++++++++++++++- kernel/nv-linux.h | 49 ++++++++ kernel/nv-procfs.c | 20 +++ kernel/nv-time.h | 9 +- kernel/nv.c | 2 +- kernel/os-interface.c | 8 +- kernel/uvm/Makefile | 1 + kernel/uvm/conftest.sh | 4 + kernel/uvm/nvidia_uvm_lite.c | 29 ++++- 12 files changed, 431 insertions(+), 14 deletions(-) diff --git a/kernel/Makefile b/kernel/Makefile index 125a690..2597080 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -108,12 +108,14 @@ COMPILE_TESTS = \ acquire_console_sem \ console_lock \ kmem_cache_create \ + kmem_cache_create_usercopy \ outer_flush_all \ on_each_cpu \ smp_call_function \ nvmap_support \ acpi_evaluate_integer \ ioremap_cache \ + ioremap_nocache \ ioremap_wc \ proc_dir_entry \ INIT_WORK \ @@ -122,6 +124,7 @@ COMPILE_TESTS = \ pci_domain_nr \ pci_dma_mapping_error \ file_operations \ + proc_ops \ sg_alloc_table \ sg_init_table \ pci_get_domain_bus_and_slot \ @@ -147,6 +150,8 @@ COMPILE_TESTS = \ vm_fault_present \ vm_fault_has_address \ drm_driver_unload_has_int_return_type \ + drm_get_pci_dev \ + drm_pci_init \ drm_legacy_pci_init \ timer_setup \ do_gettimeofday \ diff --git a/kernel/conftest.sh b/kernel/conftest.sh index b7a85f0..a5225e5 100755 --- a/kernel/conftest.sh +++ b/kernel/conftest.sh @@ -176,6 +176,7 @@ test_headers() { FILES="$FILES linux/ktime.h" FILES="$FILES linux/file.h" + FILES_ARCH="$FILES_ARCH asm/pgtable.h" FILES_ARCH="$FILES_ARCH asm/set_memory.h" translate_and_find_header_files $HEADERS $FILES @@ -440,6 +441,9 @@ compile_test() { # Determine if the set_memory_array_uc() function is present. # CODE=" + #if defined(NV_ASM_PGTABLE_H_PRESENT) + #include <asm/pgtable.h> + #endif #if defined(NV_ASM_SET_MEMORY_H_PRESENT) #include <asm/set_memory.h> #else @@ -914,6 +918,21 @@ compile_test() { fi ;; + kmem_cache_create_usercopy) + # + # Determine if the kmem_cache_create_usercopy function exists. + # + # This function was added by: + # 2017-06-10 8eb8284b412906181357c2b0110d879d5af95e52 + CODE=" + #include <linux/slab.h> + void kmem_cache_create_usercopy(void) { + kmem_cache_create_usercopy(); + }" + + compile_check_conftest "$CODE" "NV_KMEM_CACHE_CREATE_USERCOPY_PRESENT" "" "functions" + ;; + smp_call_function) # # Determine if the smp_call_function() function is @@ -1188,6 +1207,22 @@ compile_test() { compile_check_conftest "$CODE" "NV_IOREMAP_CACHE_PRESENT" "" "functions" ;; + ioremap_nocache) + # + # Determine if the ioremap_nocache() function is present. + # + # Removed by commit 4bdc0d676a64 ("remove ioremap_nocache and + # devm_ioremap_nocache") in v5.6 (2020-01-06) + # + CODE=" + #include <asm/io.h> + void conftest_ioremap_nocache(void) { + ioremap_nocache(); + }" + + compile_check_conftest "$CODE" "NV_IOREMAP_NOCACHE_PRESENT" "" "functions" + ;; + ioremap_wc) # # Determine if the ioremap_wc() function is present. @@ -1371,6 +1406,16 @@ compile_test() { compile_check_conftest "$CODE" "NV_FILE_OPERATIONS_HAS_COMPAT_IOCTL" "" "types" ;; + proc_ops) + CODE=" + #include <linux/proc_fs.h> + int conftest_proc_ops(void) { + return offsetof(struct proc_ops, proc_open); + }" + + compile_check_conftest "$CODE" "NV_HAVE_PROC_OPS" "" "types" + ;; + sg_init_table) # # Determine if the sg_init_table() function is present. @@ -2044,6 +2089,42 @@ compile_test() { compile_check_conftest "$CODE" "NV_DRM_DRIVER_UNLOAD_HAS_INT_RETURN_TYPE" "" "types" ;; + drm_get_pci_dev) + # + # Determine if drm_get_pci_dev() is present. + # + CODE=" + #if defined(NV_DRM_DRMP_H_PRESENT) + #include <drm/drmP.h> + #endif + + #if defined(NV_DRM_DRM_PCI_H_PRESENT) + #include <drm/drm_pci.h> + #endif + + void conftest_drm_legacy_pci_init(void) { + drm_get_pci_dev(); + }" + + compile_check_conftest "$CODE" "NV_DRM_GET_PCI_DEV_PRESENT" "" "functions" + ;; + + drm_pci_init) + # + # Determine if drm_pci_init() is present. + # + CODE=" + #if defined(NV_DRM_DRMP_H_PRESENT) + #include <drm/drmP.h> + #endif + + void conftest_drm_legacy_pci_init(void) { + drm_pci_init(); + }" + + compile_check_conftest "$CODE" "NV_DRM_PCI_INIT_PRESENT" "" "functions" + ;; + drm_legacy_pci_init) # # Determine if drm_legacy_pci_init() is present. drm_pci_init() was diff --git a/kernel/dkms.conf b/kernel/dkms.conf index 79a02ae..3140f03 100644 --- a/kernel/dkms.conf +++ b/kernel/dkms.conf @@ -1,7 +1,13 @@ +if [ -x /usr/bin/nproc ]; then + num_cpu_cores=$(nproc) +else + num_cpu_cores=1 +fi + PACKAGE_NAME="nvidia" PACKAGE_VERSION="340.108" BUILT_MODULE_NAME[0]="$PACKAGE_NAME" DEST_MODULE_LOCATION[0]="/kernel/drivers/video" -MAKE[0]="make module KERNEL_UNAME=${kernelver}" +MAKE[0]="make -j$num_cpu_cores module KERNEL_UNAME=${kernelver}" CLEAN="make clean" AUTOINSTALL="yes" diff --git a/kernel/nv-drm.c b/kernel/nv-drm.c index 0d1cdbf..85db07e 100644 --- a/kernel/nv-drm.c +++ b/kernel/nv-drm.c @@ -50,9 +50,236 @@ #if defined(NV_DRM_LEGACY_PCI_INIT_PRESENT) #define nv_drm_pci_init drm_legacy_pci_init #define nv_drm_pci_exit drm_legacy_pci_exit -#else +#elif defined(NV_DRM_PCI_INIT_PRESENT) #define nv_drm_pci_init drm_pci_init #define nv_drm_pci_exit drm_pci_exit +#else +#if defined(NV_DRM_GET_PCI_DEV_PRESENT) +#define nv_drm_get_pci_dev drm_get_pci_dev +#else +#include <drm/drm_agpsupport.h> + +struct nv_drm_agp_head { + struct agp_kern_info agp_info; + struct list_head memory; + unsigned long mode; + struct agp_bridge_data *bridge; + int enabled; + int acquired; + unsigned long base; + int agp_mtrr; + int cant_use_aperture; + unsigned long page_mask; +}; + +struct nv_drm_agp_mem { + unsigned long handle; + struct agp_memory *memory; + unsigned long bound; + int pages; + struct list_head head; +}; + +/* + * Code from drm_agp_init/nv_drm_{free,unbind}_agp + * Extracted from commit: 5b8b9d0c6d0e0f1993c6c56deaf9646942c49d94, file: drivers/gpu/drm/drm_agpsupport.c + */ +struct drm_agp_head *nv_drm_agp_init(struct drm_device *dev) +{ + struct nv_drm_agp_head *head = NULL; + + head = kzalloc(sizeof(*head), GFP_KERNEL); + if (!head) + return NULL; + head->bridge = agp_find_bridge(dev->pdev); + if (!head->bridge) { + head->bridge = agp_backend_acquire(dev->pdev); + if (!head->bridge) { + kfree(head); + return NULL; + } + agp_copy_info(head->bridge, &head->agp_info); + agp_backend_release(head->bridge); + } else { + agp_copy_info(head->bridge, &head->agp_info); + } + if (head->agp_info.chipset == NOT_SUPPORTED) { + kfree(head); + return NULL; + } + INIT_LIST_HEAD(&head->memory); + head->cant_use_aperture = head->agp_info.cant_use_aperture; + head->page_mask = head->agp_info.page_mask; + head->base = head->agp_info.aper_base; + return (struct drm_agp_head *)head; +} + +void nv_drm_free_agp(struct agp_memory *handle, int pages) +{ + agp_free_memory(handle); +} + +int nv_drm_unbind_agp(struct agp_memory *handle) +{ + return agp_unbind_memory(handle); +} + +/* + * Code from drm_pci_agp_{clear,destroy,init}/drm_get_pci_dev + * Extracted from commit: 5b8b9d0c6d0e0f1993c6c56deaf9646942c49d94, file: drivers/gpu/drm/drm_pci.c + */ +static void nv_drm_pci_agp_init(struct drm_device *dev) +{ + if (drm_core_check_feature(dev, DRIVER_USE_AGP)) { + if (pci_find_capability(dev->pdev, PCI_CAP_ID_AGP)) + dev->agp = nv_drm_agp_init(dev); + if (dev->agp) { + dev->agp->agp_mtrr = arch_phys_wc_add( + dev->agp->agp_info.aper_base, + dev->agp->agp_info.aper_size * + 1024 * 1024); + } + } +} + +void nv_drm_legacy_agp_clear(struct drm_device *dev) +{ + struct nv_drm_agp_mem *entry, *tempe; + + if (!dev->agp) + return; + if (!drm_core_check_feature(dev, DRIVER_LEGACY)) + return; + + list_for_each_entry_safe(entry, tempe, &dev->agp->memory, head) { + if (entry->bound) + nv_drm_unbind_agp(entry->memory); + nv_drm_free_agp(entry->memory, entry->pages); + kfree(entry); + } + INIT_LIST_HEAD(&dev->agp->memory); + + if (dev->agp->acquired) + drm_agp_release(dev); + + dev->agp->acquired = 0; + dev->agp->enabled = 0; +} + +void nv_drm_pci_agp_destroy(struct drm_device *dev) +{ + if (dev->agp) { + arch_phys_wc_del(dev->agp->agp_mtrr); + nv_drm_legacy_agp_clear(dev); + kfree(dev->agp); + dev->agp = NULL; + } +} + +static int nv_drm_get_pci_dev(struct pci_dev *pdev, + const struct pci_device_id *ent, + struct drm_driver *driver) +{ + struct drm_device *dev; + int ret; + + DRM_DEBUG("\n"); + + dev = drm_dev_alloc(driver, &pdev->dev); + if (IS_ERR(dev)) + return PTR_ERR(dev); + + ret = pci_enable_device(pdev); + if (ret) + goto err_free; + + dev->pdev = pdev; +#ifdef __alpha__ + dev->hose = pdev->sysdata; +#endif + + if (drm_core_check_feature(dev, DRIVER_MODESET)) + pci_set_drvdata(pdev, dev); + + nv_drm_pci_agp_init(dev); + + ret = drm_dev_register(dev, ent->driver_data); + if (ret) + goto err_agp; + + /* No locking needed since shadow-attach is single-threaded since it may + * only be called from the per-driver module init hook. */ + if (drm_core_check_feature(dev, DRIVER_LEGACY)) + list_add_tail(&dev->legacy_dev_list, &driver->legacy_dev_list); + + return 0; + +err_agp: + nv_drm_pci_agp_destroy(dev); + pci_disable_device(pdev); +err_free: + drm_dev_put(dev); + return ret; +} +#endif + +/* + * Code from drm_legacy_pci_{init,exit} + * Extracted from tag: v5.6.3, file: drivers/gpu/drm/drm_pci.c + */ +int nv_drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver) +{ + struct pci_dev *pdev = NULL; + const struct pci_device_id *pid; + int i; + + DRM_DEBUG("\n"); + + if (WARN_ON(!(driver->driver_features & DRIVER_LEGACY))) + return -EINVAL; + + /* If not using KMS, fall back to stealth mode manual scanning. */ + INIT_LIST_HEAD(&driver->legacy_dev_list); + for (i = 0; pdriver->id_table[i].vendor != 0; i++) { + pid = &pdriver->id_table[i]; + + /* Loop around setting up a DRM device for each PCI device + * matching our ID and device class. If we had the internal + * function that pci_get_subsys and pci_get_class used, we'd + * be able to just pass pid in instead of doing a two-stage + * thing. + */ + pdev = NULL; + while ((pdev = + pci_get_subsys(pid->vendor, pid->device, pid->subvendor, + pid->subdevice, pdev)) != NULL) { + if ((pdev->class & pid->class_mask) != pid->class) + continue; + + /* stealth mode requires a manual probe */ + pci_dev_get(pdev); + nv_drm_get_pci_dev(pdev, pid, driver); + } + } + return 0; +} + +void nv_drm_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver) +{ + struct drm_device *dev, *tmp; + DRM_DEBUG("\n"); + + if (!(driver->driver_features & DRIVER_LEGACY)) { + WARN_ON(1); + } else { + list_for_each_entry_safe(dev, tmp, &driver->legacy_dev_list, + legacy_dev_list) { + list_del(&dev->legacy_dev_list); + drm_put_dev(dev); + } + } + DRM_INFO("Module unloaded\n"); +} #endif extern nv_linux_state_t *nv_linux_devices; diff --git a/kernel/nv-linux.h b/kernel/nv-linux.h index a1d2c68..83e6433 100644 --- a/kernel/nv-linux.h +++ b/kernel/nv-linux.h @@ -688,11 +688,16 @@ extern nv_spinlock_t km_lock; VM_ALLOC_RECORD(ptr, size, "vm_ioremap"); \ } +#if defined(NV_IOREMAP_NOCACHE_PRESENT) #define NV_IOREMAP_NOCACHE(ptr, physaddr, size) \ { \ (ptr) = ioremap_nocache(physaddr, size); \ VM_ALLOC_RECORD(ptr, size, "vm_ioremap_nocache"); \ } +#else +#define NV_IOREMAP_NOCACHE(ptr, physaddr, size) \ + NV_IOREMAP(ptr, physaddr, size) +#endif #if defined(NV_IOREMAP_CACHE_PRESENT) #define NV_IOREMAP_CACHE(ptr, physaddr, size) \ @@ -774,6 +779,17 @@ extern nv_spinlock_t km_lock; #error "NV_KMEM_CACHE_CREATE() undefined (kmem_cache_create() unavailable)!" #endif +#if defined(NV_KMEM_CACHE_CREATE_USERCOPY_PRESENT) +#define NV_KMEM_CACHE_CREATE_USERCOPY(kmem_cache, name, type) \ + { \ + kmem_cache = kmem_cache_create_usercopy(name, sizeof(type), \ + 0, 0, 0, sizeof(type), NULL); \ + } +#else +#define NV_KMEM_CACHE_CREATE_USERCOPY(kmem_cache, name, type) \ + NV_KMEM_CACHE_CREATE(kmem_cache, name, type) +#endif + #define NV_KMEM_CACHE_ALLOC(ptr, kmem_cache, type) \ { \ (ptr) = kmem_cache_alloc(kmem_cache, GFP_KERNEL); \ @@ -1971,6 +1987,19 @@ extern NvU32 nv_assign_gpu_count; }) #endif +#if defined(NV_HAVE_PROC_OPS) +#define NV_CREATE_PROC_FILE(filename,parent,__name,__data) \ + ({ \ + struct proc_dir_entry *__entry; \ + int mode = (S_IFREG | S_IRUGO); \ + const struct proc_ops *fops = &nv_procfs_##__name##_fops; \ + if (fops->proc_write != 0) \ + mode |= S_IWUSR; \ + __entry = NV_CREATE_PROC_ENTRY(filename, mode, parent, fops, \ + __data); \ + __entry; \ + }) +#else #define NV_CREATE_PROC_FILE(filename,parent,__name,__data) \ ({ \ struct proc_dir_entry *__entry; \ @@ -1982,6 +2011,7 @@ extern NvU32 nv_assign_gpu_count; __data); \ __entry; \ }) +#endif /* * proc_mkdir_mode exists in Linux 2.6.9, but isn't exported until Linux 3.0. @@ -2023,6 +2053,24 @@ extern NvU32 nv_assign_gpu_count; remove_proc_entry(entry->name, entry->parent); #endif +#if defined(NV_HAVE_PROC_OPS) +#define NV_DEFINE_PROCFS_SINGLE_FILE(__name) \ + static int nv_procfs_open_##__name( \ + struct inode *inode, \ + struct file *filep \ + ) \ + { \ + return single_open(filep, nv_procfs_read_##__name, \ + NV_PDE_DATA(inode)); \ + } \ + \ + static const struct proc_ops nv_procfs_##__name##_fops = { \ + .proc_open = nv_procfs_open_##__name, \ + .proc_read = seq_read, \ + .proc_lseek = seq_lseek, \ + .proc_release = single_release, \ + }; +#else #define NV_DEFINE_PROCFS_SINGLE_FILE(__name) \ static int nv_procfs_open_##__name( \ struct inode *inode, \ @@ -2040,6 +2088,7 @@ extern NvU32 nv_assign_gpu_count; .llseek = seq_lseek, \ .release = single_release, \ }; +#endif #endif /* CONFIG_PROC_FS */ diff --git a/kernel/nv-procfs.c b/kernel/nv-procfs.c index ebca3e8..9365c3c 100644 --- a/kernel/nv-procfs.c +++ b/kernel/nv-procfs.c @@ -409,6 +409,15 @@ done: return ((status < 0) ? status : (int)count); } +#if defined(NV_HAVE_PROC_OPS) +static struct proc_ops nv_procfs_registry_fops = { + .proc_open = nv_procfs_open_registry, + .proc_read = seq_read, + .proc_write = nv_procfs_write_file, + .proc_lseek = seq_lseek, + .proc_release = nv_procfs_close_registry, +}; +#else static struct file_operations nv_procfs_registry_fops = { .owner = THIS_MODULE, .open = nv_procfs_open_registry, @@ -417,6 +426,7 @@ static struct file_operations nv_procfs_registry_fops = { .llseek = seq_lseek, .release = nv_procfs_close_registry, }; +#endif static int nv_procfs_read_unbind_lock( @@ -538,6 +548,15 @@ done: return rc; } +#if defined(NV_HAVE_PROC_OPS) +static struct proc_ops nv_procfs_unbind_lock_fops = { + .proc_open = nv_procfs_open_unbind_lock, + .proc_read = seq_read, + .proc_write = nv_procfs_write_file, + .proc_lseek = seq_lseek, + .proc_release = nv_procfs_close_unbind_lock, +}; +#else static struct file_operations nv_procfs_unbind_lock_fops = { .owner = THIS_MODULE, .open = nv_procfs_open_unbind_lock, @@ -546,6 +565,7 @@ static struct file_operations nv_procfs_unbind_lock_fops = { .llseek = seq_lseek, .release = nv_procfs_close_unbind_lock, }; +#endif static int nv_procfs_read_text_file( diff --git a/kernel/nv-time.h b/kernel/nv-time.h index a34ceb2..780f8bc 100644 --- a/kernel/nv-time.h +++ b/kernel/nv-time.h @@ -28,7 +28,12 @@ #include <linux/ktime.h> #endif -static inline void nv_gettimeofday(struct timeval *tv) +struct nv_timeval { + __kernel_long_t tv_sec; + __kernel_suseconds_t tv_usec; +}; + +static inline void nv_gettimeofday(struct nv_timeval *tv) { #ifdef NV_DO_GETTIMEOFDAY_PRESENT do_gettimeofday(tv); @@ -37,7 +42,7 @@ static inline void nv_gettimeofday(struct timeval *tv) ktime_get_real_ts64(&now); - *tv = (struct timeval) { + *tv = (struct nv_timeval) { .tv_sec = now.tv_sec, .tv_usec = now.tv_nsec/1000, }; diff --git a/kernel/nv.c b/kernel/nv.c index a167be9..a218f83 100644 --- a/kernel/nv.c +++ b/kernel/nv.c @@ -752,7 +752,7 @@ int __init nvidia_init_module(void) NV_SPIN_LOCK_INIT(&km_lock); #endif - NV_KMEM_CACHE_CREATE(nv_stack_t_cache, NV_STACK_CACHE_STR, nv_stack_t); + NV_KMEM_CACHE_CREATE_USERCOPY(nv_stack_t_cache, NV_STACK_CACHE_STR, nv_stack_t); if (nv_stack_t_cache == NULL) { nv_printf(NV_DBG_ERRORS, "NVRM: stack cache allocation failed!\n"); diff --git a/kernel/os-interface.c b/kernel/os-interface.c index 7190b26..0c0dc05 100644 --- a/kernel/os-interface.c +++ b/kernel/os-interface.c @@ -439,7 +439,7 @@ RM_STATUS NV_API_CALL os_get_current_time( NvU32 *useconds ) { - struct timeval tm; + struct nv_timeval tm; nv_gettimeofday(&tm); @@ -474,7 +474,7 @@ RM_STATUS NV_API_CALL os_delay_us(NvU32 MicroSeconds) unsigned long usec; #ifdef NV_CHECK_DELAY_ACCURACY - struct timeval tm1, tm2; + struct nv_timeval tm1, tm2; nv_gettimeofday(&tm1); #endif @@ -514,9 +514,9 @@ RM_STATUS NV_API_CALL os_delay(NvU32 MilliSeconds) unsigned long MicroSeconds; unsigned long jiffies; unsigned long mdelay_safe_msec; - struct timeval tm_end, tm_aux; + struct nv_timeval tm_end, tm_aux; #ifdef NV_CHECK_DELAY_ACCURACY - struct timeval tm_start; + struct nv_timeval tm_start; #endif nv_gettimeofday(&tm_aux); diff --git a/kernel/uvm/Makefile b/kernel/uvm/Makefile index 0cad8ff..043a08d 100644 --- a/kernel/uvm/Makefile +++ b/kernel/uvm/Makefile @@ -207,6 +207,7 @@ ccflags-y += $(EXTRA_CFLAGS) RM_MODULE_SYMVERS:= $(RM_OUT_DIR)/Module.symvers UVM_MODULE_SYMVERS:= $(obj)/Module.symvers +KBUILD_EXTRA_SYMBOLS:= $(UVM_MODULE_SYMVERS) module $(MODULE_NAME).ko: $(UVM_MODULE_SYMVERS) debug_diagnostics_printing diff --git a/kernel/uvm/conftest.sh b/kernel/uvm/conftest.sh index b7a85f0..33e2a63 100755 --- a/kernel/uvm/conftest.sh +++ b/kernel/uvm/conftest.sh @@ -176,6 +176,7 @@ test_headers() { FILES="$FILES linux/ktime.h" FILES="$FILES linux/file.h" + FILES_ARCH="$FILES_ARCH asm/pgtable.h" FILES_ARCH="$FILES_ARCH asm/set_memory.h" translate_and_find_header_files $HEADERS $FILES @@ -440,6 +441,9 @@ compile_test() { # Determine if the set_memory_array_uc() function is present. # CODE=" + #if defined(NV_ASM_PGTABLE_H_PRESENT) + #include <asm/pgtable.h> + #endif #if defined(NV_ASM_SET_MEMORY_H_PRESENT) #include <asm/set_memory.h> #else diff --git a/kernel/uvm/nvidia_uvm_lite.c b/kernel/uvm/nvidia_uvm_lite.c index 6943e7c..9a7e3b6 100644 --- a/kernel/uvm/nvidia_uvm_lite.c +++ b/kernel/uvm/nvidia_uvm_lite.c @@ -131,8 +131,8 @@ static RM_STATUS _preexisting_error_on_channel(UvmGpuMigrationTracking *pMigTracker, UvmCommitRecord *pRecord); -static void _set_timeout_in_usec(struct timeval *src, - struct timeval *result, +static void _set_timeout_in_usec(struct nv_timeval *src, + struct nv_timeval *result, unsigned long timeoutInUsec) { if (!src || !result) @@ -820,7 +820,13 @@ done: } #if defined(NV_VM_OPERATIONS_STRUCT_HAS_FAULT) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0) +vm_fault_t _fault(struct vm_fault *vmf) +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) +int _fault(struct vm_fault *vmf) +#else int _fault(struct vm_area_struct *vma, struct vm_fault *vmf) +#endif { #if defined(NV_VM_FAULT_HAS_ADDRESS) unsigned long vaddr = vmf->address; @@ -828,8 +834,15 @@ int _fault(struct vm_area_struct *vma, struct vm_fault *vmf) unsigned long vaddr = (unsigned long)vmf->virtual_address; #endif struct page *page = NULL; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0) + vm_fault_t retval; +#else int retval; +#endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) + struct vm_area_struct *vma = vmf->vma; +#endif retval = _fault_common(vma, vaddr, &page, vmf->flags); vmf->page = page; @@ -868,7 +881,13 @@ static struct vm_operations_struct uvmlite_vma_ops = // it's dealing with anonymous mapping (see handle_pte_fault). // #if defined(NV_VM_OPERATIONS_STRUCT_HAS_FAULT) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0) +vm_fault_t _sigbus_fault(struct vm_fault *vmf) +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) +int _sigbus_fault(struct vm_fault *vmf) +#else int _sigbus_fault(struct vm_area_struct *vma, struct vm_fault *vmf) +#endif { vmf->page = NULL; return VM_FAULT_SIGBUS; @@ -1992,9 +2011,9 @@ void umvlite_destroy_per_process_gpu_resources(UvmGpuUuid *gpuUuidStruct) static RM_STATUS _check_ecc_errors(UvmGpuMigrationTracking *pMigTracker, NvBool *pIsEccErrorSet) { - struct timeval eccErrorStartTime = {0}; - struct timeval eccErrorCurrentTime = {0}; - struct timeval eccTimeout = {0}; + struct nv_timeval eccErrorStartTime = {0}; + struct nv_timeval eccErrorCurrentTime = {0}; + struct nv_timeval eccTimeout = {0}; NvBool bEccErrorTimeout = NV_FALSE; NvBool bEccIncomingError = NV_FALSE; unsigned rmInterruptSet = 0; -- 2.29.0 ================================================ FILE: packages/x11/driver/xf86-video-nvidia-legacy/patches/xf86-video-nvidia-legacy-100.02-kernel-5.8.patch ================================================ From 2cc3342b4b3c96bcc4062513011d35c079b009a2 Mon Sep 17 00:00:00 2001 From: graysky <graysky@archlinux.us> Date: Thu, 22 Oct 2020 06:59:59 -0400 Subject: [PATCH 2/3] kernel-5.8 credit: https://launchpad.net/~kelebek333/+archive/ubuntu/nvidia-legacy/+packages extracted from: https://launchpadlibrarian.net/492468557/nvidia-graphics-drivers-340_340.108-1lmtrfocal3_340.108-2lmtrfocal.diff.gz --- kernel/nv-linux.h | 8 ++++++++ kernel/nvidia-modules-common.mk | 1 + kernel/os-mlock.c | 8 ++++++++ kernel/uvm/nvidia_uvm_lite_api.c | 4 ++++ 4 files changed, 21 insertions(+) diff --git a/kernel/nv-linux.h b/kernel/nv-linux.h index 83e6433..d055552 100644 --- a/kernel/nv-linux.h +++ b/kernel/nv-linux.h @@ -669,11 +669,19 @@ extern nv_spinlock_t km_lock; # define KM_FREE_RECORD(a,b,c) #endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0) +#define NV_VMALLOC(ptr, size) \ + { \ + (ptr) = __vmalloc(size, GFP_KERNEL); \ + VM_ALLOC_RECORD(ptr, size, "vm_vmalloc"); \ + } +#else #define NV_VMALLOC(ptr, size) \ { \ (ptr) = __vmalloc(size, GFP_KERNEL, PAGE_KERNEL); \ VM_ALLOC_RECORD(ptr, size, "vm_vmalloc"); \ } +#endif #define NV_VFREE(ptr, size) \ { \ diff --git a/kernel/nvidia-modules-common.mk b/kernel/nvidia-modules-common.mk index b94591b..0e4c228 100644 --- a/kernel/nvidia-modules-common.mk +++ b/kernel/nvidia-modules-common.mk @@ -222,6 +222,7 @@ build-sanity-checks: define BUILD_MODULE_RULE $(1): build-sanity-checks $(3) @echo "NVIDIA: calling KBUILD..."; \ + touch .nv-kernel.o.cmd; \ $$(MAKE) "CC=$$(CC)" NV_MODULE_SUFFIX=$$(strip $(2)) $$(KBUILD_PARAMS) modules; \ echo "NVIDIA: left KBUILD."; \ if ! [ -f $(1) ]; then \ diff --git a/kernel/os-mlock.c b/kernel/os-mlock.c index 8a1fa2f..fc50543 100644 --- a/kernel/os-mlock.c +++ b/kernel/os-mlock.c @@ -44,11 +44,19 @@ RM_STATUS NV_API_CALL os_lock_user_pages( return rmStatus; } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0) + down_read(&mm->mmap_lock); + ret = NV_GET_USER_PAGES((unsigned long)address, + page_count, write, force, user_pages, NULL); + up_read(&mm->mmap_lock); + pinned = ret; +#else down_read(&mm->mmap_sem); ret = NV_GET_USER_PAGES((unsigned long)address, page_count, write, force, user_pages, NULL); up_read(&mm->mmap_sem); pinned = ret; +#endif if (ret < 0) { diff --git a/kernel/uvm/nvidia_uvm_lite_api.c b/kernel/uvm/nvidia_uvm_lite_api.c index 8448eb6..97a4818 100644 --- a/kernel/uvm/nvidia_uvm_lite_api.c +++ b/kernel/uvm/nvidia_uvm_lite_api.c @@ -30,6 +30,10 @@ #include "uvm_gpu_ops_tests.h" #endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0) +#define mmap_sem mmap_lock +#endif + // // nvidia_uvm_lite_api.c // -- 2.29.0 ================================================ FILE: packages/x11/driver/xf86-video-nvidia-legacy/patches/xf86-video-nvidia-legacy-100.03-kernel-5.9.patch ================================================ From fea401df7500bfbead5a42b1e74560dbddf2f5a3 Mon Sep 17 00:00:00 2001 From: graysky <graysky@archlinux.us> Date: Thu, 22 Oct 2020 07:00:35 -0400 Subject: [PATCH 3/3] kernel-5.9 credit: https://github.com/warpme/minimyth2/blob/master/script/nvidia/nvidia-340.108/files/nvidia-340.108-fix-5.9-kernel-compile.patch --- kernel/nv-drm.c | 8 ++++++++ kernel/nv-linux.h | 9 +++++++-- kernel/nv.c | 4 ++++ kernel/uvm/nvidia_uvm_linux.h | 2 ++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/kernel/nv-drm.c b/kernel/nv-drm.c index 85db07e..f0c1299 100644 --- a/kernel/nv-drm.c +++ b/kernel/nv-drm.c @@ -415,7 +415,11 @@ static struct drm_driver nv_drm_driver = { .set_busid = drm_pci_set_busid, #endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0) + .gem_free_object_unlocked = nv_gem_free, +#else .gem_free_object = nv_gem_free, +#endif .prime_handle_to_fd = drm_gem_prime_handle_to_fd, .gem_prime_export = drm_gem_prime_export, @@ -511,8 +515,12 @@ RM_STATUS NV_API_CALL nv_alloc_os_descriptor_handle( #if defined(NV_DRM_GEM_OBJECT_PUT_UNLOCKED_PRESENT) drm_gem_object_put_unlocked(&nv_obj->base); +#else +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0) + drm_gem_object_put_locked(&nv_obj->base); #else drm_gem_object_unreference_unlocked(&nv_obj->base); +#endif #endif status = RM_OK; diff --git a/kernel/nv-linux.h b/kernel/nv-linux.h index d055552..524a8fe 100644 --- a/kernel/nv-linux.h +++ b/kernel/nv-linux.h @@ -136,8 +136,10 @@ #if defined(NVCPU_X86_64) && !defined(HAVE_COMPAT_IOCTL) #include <linux/syscalls.h> /* sys_ioctl() */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 9, 0) #include <linux/ioctl32.h> /* register_ioctl32_conversion() */ #endif +#endif #if !defined(NV_FILE_OPERATIONS_HAS_IOCTL) && \ !defined(NV_FILE_OPERATIONS_HAS_UNLOCKED_IOCTL) @@ -2249,10 +2251,13 @@ static inline NvU64 nv_node_end_pfn(int nid) pages, vmas, NULL); #else - +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0) + return get_user_pages_remote(mm, start, nr_pages, flags, + pages, vmas, NULL); +#else return get_user_pages_remote(tsk, mm, start, nr_pages, flags, pages, vmas); - +#endif #endif } diff --git a/kernel/nv.c b/kernel/nv.c index a218f83..be4e0f8 100644 --- a/kernel/nv.c +++ b/kernel/nv.c @@ -2785,7 +2785,11 @@ nvidia_probe #if defined(CONFIG_VGA_ARB) #if defined(VGA_DEFAULT_DEVICE) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0) + vga_get(VGA_DEFAULT_DEVICE, VGA_RSRC_LEGACY_MASK, 0); +#else vga_tryget(VGA_DEFAULT_DEVICE, VGA_RSRC_LEGACY_MASK); +#endif #endif vga_set_legacy_decoding(dev, VGA_RSRC_NONE); #endif diff --git a/kernel/uvm/nvidia_uvm_linux.h b/kernel/uvm/nvidia_uvm_linux.h index 1625209..efc181f 100644 --- a/kernel/uvm/nvidia_uvm_linux.h +++ b/kernel/uvm/nvidia_uvm_linux.h @@ -158,8 +158,10 @@ #if defined(NVCPU_X86_64) && !defined(HAVE_COMPAT_IOCTL) #include <linux/syscalls.h> /* sys_ioctl() */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 9, 0) #include <linux/ioctl32.h> /* register_ioctl32_conversion() */ #endif +#endif #if !defined(NV_FILE_OPERATIONS_HAS_IOCTL) && \ !defined(NV_FILE_OPERATIONS_HAS_UNLOCKED_IOCTL) -- 2.29.0 ================================================ FILE: packages/x11/driver/xf86-video-nvidia-legacy/patches/xf86-video-nvidia-legacy-100.04-kernel-5.10.patch ================================================ https://github.com/warpme/minimyth2/tree/master/script/nvidia/nvidia-340.108/files diff -Naur NVIDIA-Linux-x86_64-340.108-old/kernel/nv-drm.c NVIDIA-Linux-x86_64-340.108-new/kernel/nv-drm.c --- NVIDIA-Linux-x86_64-340.108-old/kernel/nv-drm.c 2020-12-13 19:10:56.759999937 +0100 +++ NVIDIA-Linux-x86_64-340.108-new/kernel/nv-drm.c 2020-12-13 19:09:02.039999925 +0100 @@ -322,8 +322,11 @@ { struct nv_gem_object *nv_obj = container_of(obj, struct nv_gem_object, base); int page_count = obj->size >> PAGE_SHIFT; - +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) + return drm_prime_pages_to_sg(obj->dev, nv_obj->pages, page_count); +#else return drm_prime_pages_to_sg(nv_obj->pages, page_count); +#endif } static void* nv_gem_prime_vmap( ================================================ FILE: packages/x11/driver/xf86-video-nvidia-legacy/patches/xf86-video-nvidia-legacy-100.05-kernel-5.11.patch ================================================ diff -Naur NVIDIA-Linux-x86_64-340.108-old/kernel/conftest.sh NVIDIA-Linux-x86_64-340.108-new/kernel/conftest.sh --- NVIDIA-Linux-x86_64-340.108-old/kernel/conftest.sh 2021-05-24 20:08:18.743742335 +0200 +++ NVIDIA-Linux-x86_64-340.108-new/kernel/conftest.sh 2021-05-24 20:13:18.019314390 +0200 @@ -1578,21 +1578,21 @@ #include <drm/drm_drv.h> #endif - #if defined(NV_DRM_DRM_PRIME_H_PRESENT) - #include <drm/drm_prime.h> - #endif - #if !defined(CONFIG_DRM) && !defined(CONFIG_DRM_MODULE) #error DRM not enabled #endif + void conftest_drm_available(void) { struct drm_driver drv; - drv.gem_prime_pin = 0; - drv.gem_prime_get_sg_table = 0; - drv.gem_prime_vmap = 0; - drv.gem_prime_vunmap = 0; - (void)drm_gem_prime_import; - (void)drm_gem_prime_export; + + /* 2013-10-02 1bb72532ac260a2d3982b40bdd4c936d779d0d16 */ + (void)drm_dev_alloc; + + /* 2013-10-02 c22f0ace1926da399d9a16dfaf09174c1b03594c */ + (void)drm_dev_register; + + /* 2013-10-02 c3a49737ef7db0bdd4fcf6cf0b7140a883e32b2a */ + (void)drm_dev_unregister; }" compile_check_conftest "$CODE" "NV_DRM_AVAILABLE" "" "generic" diff -Naur NVIDIA-Linux-x86_64-340.108-old/kernel/nv-drm.c NVIDIA-Linux-x86_64-340.108-new/kernel/nv-drm.c --- NVIDIA-Linux-x86_64-340.108-old/kernel/nv-drm.c 2021-05-24 20:08:18.779739237 +0200 +++ NVIDIA-Linux-x86_64-340.108-new/kernel/nv-drm.c 2021-05-24 20:42:13.443288819 +0200 @@ -60,6 +60,8 @@ #else #include <drm/drm_agpsupport.h> +#include "linux/dma-buf.h" + struct nv_drm_agp_head { struct agp_kern_info agp_info; struct list_head memory; @@ -210,8 +212,10 @@ /* No locking needed since shadow-attach is single-threaded since it may * only be called from the per-driver module init hook. */ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 10, 0) if (drm_core_check_feature(dev, DRIVER_LEGACY)) list_add_tail(&dev->legacy_dev_list, &driver->legacy_dev_list); +#endif return 0; @@ -239,8 +243,10 @@ if (WARN_ON(!(driver->driver_features & DRIVER_LEGACY))) return -EINVAL; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 10, 0) /* If not using KMS, fall back to stealth mode manual scanning. */ INIT_LIST_HEAD(&driver->legacy_dev_list); +#endif for (i = 0; pdriver->id_table[i].vendor != 0; i++) { pid = &pdriver->id_table[i]; @@ -273,11 +279,13 @@ if (!(driver->driver_features & DRIVER_LEGACY)) { WARN_ON(1); } else { +#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 10, 0) list_for_each_entry_safe(dev, tmp, &driver->legacy_dev_list, legacy_dev_list) { list_del(&dev->legacy_dev_list); drm_put_dev(dev); } +#endif } DRM_INFO("Module unloaded\n"); } @@ -402,6 +410,39 @@ .llseek = noop_llseek, }; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) +struct sg_table *nv_drm_gem_prime_get_sg_table(struct drm_gem_object *gem) +{ + return nv_gem_prime_get_sg_table(gem); +} + +static int nv_drm_gem_vmap(struct drm_gem_object *gem, + struct dma_buf_map *map) +{ + map->vaddr = nv_gem_prime_vmap(gem); + if (map->vaddr == NULL) { + return -ENOMEM; + } + map->is_iomem = true; + return 0; +} + +static void nv_drm_gem_vunmap(struct drm_gem_object *gem, + struct dma_buf_map *map) +{ + nv_gem_prime_vunmap(gem, map->vaddr); + map->vaddr = NULL; +} + +static struct drm_gem_object_funcs nv_drm_gem_object_funcs = { + .free = nv_gem_free, + .export = drm_gem_prime_export, + .get_sg_table = nv_drm_gem_prime_get_sg_table, + .vmap = nv_drm_gem_vmap, + .vunmap = nv_drm_gem_vunmap, +}; +#endif + static struct drm_driver nv_drm_driver = { .driver_features = DRIVER_GEM @@ -420,17 +461,19 @@ .set_busid = drm_pci_set_busid, #endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0) - .gem_free_object_unlocked = nv_gem_free, -#else +#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 8, 0) .gem_free_object = nv_gem_free, +#elif LINUX_VERSION_CODE <= KERNEL_VERSION(5, 10, 0) + .gem_free_object_unlocked = nv_gem_free, #endif .prime_handle_to_fd = drm_gem_prime_handle_to_fd, +#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 10, 0) .gem_prime_export = drm_gem_prime_export, .gem_prime_get_sg_table = nv_gem_prime_get_sg_table, .gem_prime_vmap = nv_gem_prime_vmap, .gem_prime_vunmap = nv_gem_prime_vunmap, +#endif .name = "nvidia-drm", .desc = "NVIDIA DRM driver", diff -Naur NVIDIA-Linux-x86_64-340.108-old/kernel/nv-linux.h NVIDIA-Linux-x86_64-340.108-new/kernel/nv-linux.h --- NVIDIA-Linux-x86_64-340.108-old/kernel/nv-linux.h 2021-05-24 20:08:18.775739581 +0200 +++ NVIDIA-Linux-x86_64-340.108-new/kernel/nv-linux.h 2021-05-24 20:09:18.748287771 +0200 @@ -119,7 +119,9 @@ #include <asm/tlbflush.h> /* flush_tlb(), flush_tlb_all() */ #include <linux/cpu.h> /* CPU hotplug support */ #endif -#include <asm/kmap_types.h> /* page table entry lookup */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0) + #include <asm/kmap_types.h> /* page table entry lookup */ +#endif #include <linux/pci.h> /* pci_find_class, etc */ #include <linux/interrupt.h> /* tasklets, interrupt helpers */ diff -Naur NVIDIA-Linux-x86_64-340.108-old/kernel/uvm/nvidia_uvm_linux.h NVIDIA-Linux-x86_64-340.108-new/kernel/uvm/nvidia_uvm_linux.h --- NVIDIA-Linux-x86_64-340.108-old/kernel/uvm/nvidia_uvm_linux.h 2021-05-24 20:08:18.775739581 +0200 +++ NVIDIA-Linux-x86_64-340.108-new/kernel/uvm/nvidia_uvm_linux.h 2021-05-24 20:09:18.749287739 +0200 @@ -141,7 +141,9 @@ #if !defined(NV_VMWARE) #include <asm/tlbflush.h> /* flush_tlb(), flush_tlb_all() */ #endif -#include <asm/kmap_types.h> /* page table entry lookup */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0) + #include <asm/kmap_types.h> /* page table entry lookup */ +#endif #include <linux/interrupt.h> /* tasklets, interrupt helpers */ #include <linux/timer.h> ================================================ FILE: packages/x11/driver/xf86-video-nvidia-legacy/patches/xf86-video-nvidia-legacy-100.06-kernel-5.14.patch ================================================ diff -Naur NVIDIA-Linux-x86_64-340.108-no-compat32.5.13/kernel/nv-drm.c NVIDIA-Linux-x86_64-340.108-no-compat32.5.14/kernel/nv-drm.c --- NVIDIA-Linux-x86_64-340.108-no-compat32.5.13/kernel/nv-drm.c 2021-07-25 10:29:29.336505688 +0200 +++ NVIDIA-Linux-x86_64-340.108-no-compat32.5.14/kernel/nv-drm.c 2021-09-16 16:49:10.929858547 +0200 @@ -57,8 +57,11 @@ #if defined(NV_DRM_GET_PCI_DEV_PRESENT) #define nv_drm_get_pci_dev drm_get_pci_dev #else +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0) #include <drm/drm_agpsupport.h> - +#else +#include <drm/drm_legacy.h> +#endif #include "linux/dma-buf.h" struct nv_drm_agp_head { @@ -82,6 +85,11 @@ struct list_head head; }; +struct nv_drm_extra_priv_data { + struct pci_dev *pdev; + struct drm_agp_head *agp; +}; + /* * Code from drm_agp_init/nv_drm_{free,unbind}_agp * Extracted from commit: 5b8b9d0c6d0e0f1993c6c56deaf9646942c49d94, file: drivers/gpu/drm/drm_agpsupport.c @@ -89,13 +97,14 @@ struct drm_agp_head *nv_drm_agp_init(struct drm_device *dev) { struct nv_drm_agp_head *head = NULL; + struct nv_drm_extra_priv_data *extra = dev->dev_private; head = kzalloc(sizeof(*head), GFP_KERNEL); if (!head) return NULL; - head->bridge = agp_find_bridge(dev->pdev); + head->bridge = agp_find_bridge(extra->pdev); if (!head->bridge) { - head->bridge = agp_backend_acquire(dev->pdev); + head->bridge = agp_backend_acquire(extra->pdev); if (!head->bridge) { kfree(head); return NULL; @@ -133,48 +142,71 @@ static void nv_drm_pci_agp_init(struct drm_device *dev) { if (drm_core_check_feature(dev, DRIVER_USE_AGP)) { - if (pci_find_capability(dev->pdev, PCI_CAP_ID_AGP)) - dev->agp = nv_drm_agp_init(dev); - if (dev->agp) { - dev->agp->agp_mtrr = arch_phys_wc_add( - dev->agp->agp_info.aper_base, - dev->agp->agp_info.aper_size * + struct nv_drm_extra_priv_data *extra = dev->dev_private; + + if (pci_find_capability(extra->pdev, PCI_CAP_ID_AGP)) + extra->agp = nv_drm_agp_init(dev); + if (extra->agp) { + extra->agp->agp_mtrr = arch_phys_wc_add( + extra->agp->agp_info.aper_base, + extra->agp->agp_info.aper_size * 1024 * 1024); } } } +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0) + +#else +/* copied from v5.14.5 */ +int nv_drm_legacy_agp_release(struct drm_device *dev) +{ + struct nv_drm_extra_priv_data *extra = dev->dev_private; + + if (!extra->agp || !extra->agp->acquired) + return -EINVAL; + agp_backend_release(extra->agp->bridge); + extra->agp->acquired = 0; + return 0; +} +#endif + void nv_drm_legacy_agp_clear(struct drm_device *dev) { struct nv_drm_agp_mem *entry, *tempe; + struct nv_drm_extra_priv_data *extra = dev->dev_private; - if (!dev->agp) + if (!extra->agp) return; if (!drm_core_check_feature(dev, DRIVER_LEGACY)) return; - list_for_each_entry_safe(entry, tempe, &dev->agp->memory, head) { + list_for_each_entry_safe(entry, tempe, &extra->agp->memory, head) { if (entry->bound) nv_drm_unbind_agp(entry->memory); nv_drm_free_agp(entry->memory, entry->pages); kfree(entry); } - INIT_LIST_HEAD(&dev->agp->memory); + INIT_LIST_HEAD(&extra->agp->memory); - if (dev->agp->acquired) + if (extra->agp->acquired) +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0) drm_agp_release(dev); - - dev->agp->acquired = 0; - dev->agp->enabled = 0; +#else + nv_drm_legacy_agp_release(dev); +#endif + extra->agp->acquired = 0; + extra->agp->enabled = 0; } void nv_drm_pci_agp_destroy(struct drm_device *dev) { - if (dev->agp) { - arch_phys_wc_del(dev->agp->agp_mtrr); + struct nv_drm_extra_priv_data *extra = dev->dev_private; + if (extra->agp) { + arch_phys_wc_del(extra->agp->agp_mtrr); nv_drm_legacy_agp_clear(dev); - kfree(dev->agp); - dev->agp = NULL; + kfree(extra->agp); + extra->agp = NULL; } } @@ -183,6 +215,7 @@ struct drm_driver *driver) { struct drm_device *dev; + struct nv_drm_extra_priv_data *extra; int ret; DRM_DEBUG("\n"); @@ -191,11 +224,18 @@ if (IS_ERR(dev)) return PTR_ERR(dev); + extra = kzalloc(sizeof(*extra), GFP_KERNEL); + if (IS_ERR(extra)) + goto err_free; + + extra->pdev = pdev; + ret = pci_enable_device(pdev); if (ret) - goto err_free; + goto err_free2; - dev->pdev = pdev; + /* use the not used (i hope) dev_private to store deprecated/legacy pointers */ + dev->dev_private = extra; #ifdef __alpha__ dev->hose = pdev->sysdata; #endif @@ -221,6 +261,8 @@ err_agp: nv_drm_pci_agp_destroy(dev); pci_disable_device(pdev); +err_free2: + kfree(extra); err_free: drm_dev_put(dev); return ret; @@ -303,10 +345,11 @@ ) { nv_linux_state_t *nvl; + struct nv_drm_extra_priv_data *extra = dev->dev_private; for (nvl = nv_linux_devices; nvl != NULL; nvl = nvl->next) { - if (nvl->dev == dev->pdev) + if (nvl->dev == extra->pdev) { nvl->drm = dev; return 0; @@ -327,10 +370,11 @@ ) { nv_linux_state_t *nvl; + struct nv_drm_extra_priv_data *extra = dev->dev_private; for (nvl = nv_linux_devices; nvl != NULL; nvl = nvl->next) { - if (nvl->dev == dev->pdev) + if (nvl->dev == extra->pdev) { BUG_ON(nvl->drm != dev); nvl->drm = NULL; diff -Naur NVIDIA-Linux-x86_64-340.108-no-compat32.5.13/kernel/os-interface.c NVIDIA-Linux-x86_64-340.108-no-compat32.5.14/kernel/os-interface.c --- NVIDIA-Linux-x86_64-340.108-no-compat32.5.13/kernel/os-interface.c 2021-07-25 10:29:29.083168593 +0200 +++ NVIDIA-Linux-x86_64-340.108-no-compat32.5.14/kernel/os-interface.c 2021-09-16 13:17:43.345906445 +0200 @@ -549,7 +549,11 @@ // the requested timeout has expired, loop until less // than a jiffie of the desired delay remains. // +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0) + current->__state = TASK_INTERRUPTIBLE; +#else current->state = TASK_INTERRUPTIBLE; +#endif do { schedule_timeout(jiffies); ================================================ FILE: packages/x11/driver/xf86-video-nvidia-legacy/patches/xf86-video-nvidia-legacy-100.07-kernel-5.15.patch ================================================ diff -Naur NVIDIA-Linux-x86_64-340.108-old/kernel/nv-drm.c NVIDIA-Linux-x86_64-340.108-new/kernel/nv-drm.c --- NVIDIA-Linux-x86_64-340.108-old/kernel/nv-drm.c 2021-11-06 20:08:18.779739237 +0200 +++ NVIDIA-Linux-x86_64-340.108-new/kernel/nv-drm.c 2021-11-06 20:42:13.443288819 +0200 @@ -529,7 +529,9 @@ RM_STATUS NV_API_CALL nv_alloc_os_descri #if defined(NV_DRM_GEM_OBJECT_PUT_UNLOCKED_PRESENT) drm_gem_object_put_unlocked(&nv_obj->base); #else -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0) + drm_gem_object_put(&nv_obj->base); +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0) drm_gem_object_put_locked(&nv_obj->base); #else drm_gem_object_unreference_unlocked(&nv_obj->base); ================================================ FILE: packages/x11/driver/xf86-video-nvidia-legacy/patches/xf86-video-nvidia-legacy-100.08-kernel-5.16.patch ================================================ --- a/kernel/os-interface.h 2019-12-11 22:04:24.000000000 +0000 +++ b/kernel/os-interface.h 2022-01-10 02:04:26.740899810 +0000 @@ -24,7 +24,12 @@ * * \***************************************************************************/ +#include <linux/version.h> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) +#include <linux/stdarg.h> +#else #include <stdarg.h> +#endif /* * Define away Microsoft compiler extensions when possible --- a/kernel/nv.h 2019-12-11 22:04:24.000000000 +0000 +++ b/kernel/nv.h 2022-01-10 02:29:07.828733372 +0000 @@ -13,7 +13,12 @@ #define _NV_H_ #include <nvtypes.h> +#include <linux/version.h> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) +#include <linux/stdarg.h> +#else #include <stdarg.h> +#endif #if !defined(NV_MIN) #define NV_MIN(_a,_b) ((_a) < (_b) ? (_a) : (_b)) ================================================ FILE: packages/x11/driver/xf86-video-nvidia-legacy/patches/xf86-video-nvidia-legacy-100.09-kernel-5.17.patch ================================================ --- a/kernel/nv-linux.h 2022-02-20 00:41:53.585928825 +0000 +++ b/kernel/nv-linux.h 2022-02-20 00:43:04.285797471 +0000 @@ -2051,11 +2051,15 @@ __entry; \ }) +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) #if defined(NV_PDE_DATA_PRESENT) # define NV_PDE_DATA(inode) PDE_DATA(inode) #else # define NV_PDE_DATA(inode) PDE(inode)->data #endif +#else +# define NV_PDE_DATA(inode) inode->i_private +#endif #if defined(NV_PROC_REMOVE_PRESENT) # define NV_REMOVE_PROC_ENTRY(entry) \ ================================================ FILE: packages/x11/driver/xf86-video-nvidia-legacy/patches/xf86-video-nvidia-legacy-100.10-kernel-5.18.patch ================================================ diff -Nur a/kernel/nv-vm.c b/kernel/nv-vm.c --- a/kernel/nv-vm.c 2019-12-11 22:04:24.000000000 +0000 +++ b/kernel/nv-vm.c 2022-04-25 01:28:55.889120175 +0000 @@ -169,12 +169,12 @@ static inline int nv_map_sg(struct pci_dev *dev, struct scatterlist *sg) { - return pci_map_sg(dev, sg, 1, PCI_DMA_BIDIRECTIONAL); + return dma_map_sg(&dev->dev, sg, 1, DMA_BIDIRECTIONAL); } static inline void nv_unmap_sg(struct pci_dev *dev, struct scatterlist *sg) { - pci_unmap_sg(dev, sg, 1, PCI_DMA_BIDIRECTIONAL); + dma_unmap_sg(&dev->dev, sg, 1, DMA_BIDIRECTIONAL); } #define NV_MAP_SG_MAX_RETRIES 16 --- a/kernel/nv-dma.c 2019-12-11 22:04:24.000000000 +0000 +++ b/kernel/nv-dma.c 2022-04-25 01:52:11.243235749 +0000 @@ -136,10 +136,10 @@ return status; } - dma_map->sg_map_count = pci_map_sg(dma_map->dev, + dma_map->sg_map_count = dma_map_sg(&dma_map->dev->dev, NV_DMA_MAP_SCATTERLIST(dma_map), NV_DMA_MAP_SCATTERLIST_LENGTH(dma_map), - PCI_DMA_BIDIRECTIONAL); + DMA_BIDIRECTIONAL); if (dma_map->sg_map_count == 0) { nv_printf(NV_DBG_ERRORS, @@ -211,8 +211,8 @@ if (dma_map->sg_map_count != 0) { - pci_unmap_sg(dma_map->dev, NV_DMA_MAP_SCATTERLIST(dma_map), - NV_DMA_MAP_SCATTERLIST_LENGTH(dma_map), PCI_DMA_BIDIRECTIONAL); + dma_unmap_sg(&dma_map->dev->dev, NV_DMA_MAP_SCATTERLIST(dma_map), + NV_DMA_MAP_SCATTERLIST_LENGTH(dma_map), DMA_BIDIRECTIONAL); } *priv = dma_map->user_pages; --- a/kernel/nv-drm.c 2022-04-25 01:59:40.255544206 +0000 +++ b/kernel/nv-drm.c 2022-04-25 02:08:28.231217905 +0000 @@ -459,7 +459,7 @@ } static int nv_drm_gem_vmap(struct drm_gem_object *gem, - struct dma_buf_map *map) + struct iosys_map *map) { map->vaddr = nv_gem_prime_vmap(gem); if (map->vaddr == NULL) { @@ -470,7 +470,7 @@ } static void nv_drm_gem_vunmap(struct drm_gem_object *gem, - struct dma_buf_map *map) + struct iosys_map *map) { nv_gem_prime_vunmap(gem, map->vaddr); map->vaddr = NULL; ================================================ FILE: packages/x11/driver/xf86-video-nvidia-legacy/patches/xf86-video-nvidia-legacy-100.11-kernel-6.0.patch ================================================ --- a/kernel/nv-acpi.c 2019-12-11 22:04:24.000000000 +0000 +++ b/kernel/nv-acpi.c 2022-08-29 08:50:01.383913160 +0000 @@ -16,6 +16,9 @@ #include "nv-reg.h" -#if defined(NV_LINUX_ACPI_EVENTS_SUPPORTED) +#include <linux/version.h> +// Rel.commit "ACPI: bus: Drop unused list heads from struct acpi_device" (Rafael J. Wysocki, 4 Jun 2022) +// Disable ACPI support due to more GPL stuff (acpi_dev_for_each_child is only GPL-exported) +#if defined(NV_LINUX_ACPI_EVENTS_SUPPORTED) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 0, 0)) static RM_STATUS nv_acpi_extract_integer (const union acpi_object *, void *, NvU32, NvU32 *); static RM_STATUS nv_acpi_extract_buffer (const union acpi_object *, void *, NvU32, NvU32 *); static RM_STATUS nv_acpi_extract_package (const union acpi_object *, void *, NvU32, NvU32 *); ================================================ FILE: packages/x11/driver/xf86-video-vmware/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="xf86-video-vmware" PKG_VERSION="13.4.0" PKG_SHA256="aed31ee5ed5ecc6e2226705383e7ad06f7602c1376a295305f376b17af3eb81a" PKG_ARCH="x86_64" PKG_LICENSE="OSS" PKG_SITE="https://www.vmware.com" PKG_URL="https://xorg.freedesktop.org/releases/individual/driver/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain mesa libX11 xorg-server" PKG_LONGDESC="xf86-video-vmware: The Xorg driver for vmware video" PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--enable-vmwarectrl-client \ --with-xorg-module-dir=${XORG_PATH_MODULES}" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/x11/font/encodings/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="encodings" PKG_VERSION="1.0.6" PKG_SHA256="77e301de661f35a622b18f60b555a7e7d8c4d5f43ed41410e830d5ac9084fc26" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/font/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros font-util:host" PKG_LONGDESC="X font encoding meta files." PKG_CONFIGURE_OPTS_TARGET="--enable-gzip-small-encodings \ --enable-gzip-large-encodings \ --with-fontrootdir=/usr/share/fonts" ================================================ FILE: packages/x11/font/font-bitstream-type1/package.mk ================================================ # 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="font-bitstream-type1" PKG_VERSION="1.0.3" PKG_SHA256="c6ea0569adad2c577f140328dc3302e729cb1b1ea90cd0025caf380625f8a688" PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/font/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain util-macros font-xfree86-type1" PKG_LONGDESC="Bitstream font family." PKG_CONFIGURE_OPTS_TARGET="--with-fontrootdir=/usr/share/fonts" post_install() { mkfontdir ${INSTALL}/usr/share/fonts/Type1 mkfontscale ${INSTALL}/usr/share/fonts/Type1 } ================================================ FILE: packages/x11/font/font-cursor-misc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="font-cursor-misc" PKG_VERSION="1.0.3" PKG_SHA256="17363eb35eece2e08144da5f060c70103b59d0972b4f4d77fd84c9a7a2dba635" PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/font/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain util-macros font-util:host" PKG_LONGDESC="X11 cursor fonts." PKG_CONFIGURE_OPTS_TARGET="--with-fontrootdir=/usr/share/fonts" post_install() { mkfontdir ${INSTALL}/usr/share/fonts/misc mkfontscale ${INSTALL}/usr/share/fonts/misc } ================================================ FILE: packages/x11/font/font-misc-misc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="font-misc-misc" PKG_VERSION="1.1.2" PKG_SHA256="b8e77940e4e1769dc47ef1805918d8c9be37c708735832a07204258bacc11794" PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/font/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain util-macros font-util font-cursor-misc" PKG_LONGDESC="A misc. public domain font." PKG_CONFIGURE_OPTS_TARGET="--with-fontrootdir=/usr/share/fonts \ --disable-silent-rules \ --enable-iso8859-1 \ --enable-iso8859-2 \ --disable-iso8859-3 \ --disable-iso8859-4 \ --enable-iso8859-5 \ --enable-iso8859-7 \ --enable-iso8859-8 \ --enable-iso8859-9 \ --disable-iso8859-10 \ --disable-iso8859-11 \ --disable-iso8859-13 \ --enable-iso8859-14 \ --enable-iso8859-15 \ --disable-iso8859-16 \ --disable-koi8-r \ --disable-jisx0201" PKG_MAKE_OPTS_TARGET="UTIL_DIR=${SYSROOT_PREFIX}/usr/share/fonts/util/" makeinstall_target() { mkdir -p ${INSTALL}/usr/share/fonts/misc cp 6x13-ISO8859-1.pcf.gz ${INSTALL}/usr/share/fonts/misc } post_install() { mkfontdir ${INSTALL}/usr/share/fonts/misc mkfontscale ${INSTALL}/usr/share/fonts/misc } ================================================ FILE: packages/x11/font/font-util/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="font-util" PKG_VERSION="1.3.3" PKG_SHA256="e791c890779c40056ab63aaed5e031bb6e2890a98418ca09c534e6261a2eebd2" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/font/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros" PKG_DEPENDS_HOST="util-macros" PKG_LONGDESC="X.org font utilities." PKG_CONFIGURE_OPTS_TARGET="--with-fontrootdir=/usr/share/fonts \ --with-mapdir=/usr/share/fonts/util" post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/x11/font/font-xfree86-type1/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="font-xfree86-type1" PKG_VERSION="1.0.4" PKG_SHA256="caebf42aec7be7f3bd40e0f232d6f34881b853dc84acfcdf7458358701fbe34a" PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/releases/individual/font/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain util-macros" PKG_LONGDESC="A Xfree86 Inc. Type1 font." PKG_CONFIGURE_OPTS_TARGET="--with-fontrootdir=/usr/share/fonts" post_install() { mkfontdir ${INSTALL}/usr/share/fonts/Type1 mkfontscale ${INSTALL}/usr/share/fonts/Type1 } ================================================ FILE: packages/x11/font/liberation-fonts-ttf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="liberation-fonts-ttf" PKG_VERSION="2.1.5" PKG_SHA256="7191c669bf38899f73a2094ed00f7b800553364f90e2637010a69c0e268f25d0" PKG_LICENSE="OFL-1.1" PKG_SITE="https://github.com/liberationfonts/liberation-fonts" PKG_URL="https://github.com/liberationfonts/liberation-fonts/files/7261482/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain util-macros" PKG_LONGDESC="This packages included the high-quality and open-sourced TrueType vector fonts." PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/share/fonts/liberation cp *.ttf ${INSTALL}/usr/share/fonts/liberation } post_install() { mkfontdir ${INSTALL}/usr/share/fonts/liberation mkfontscale ${INSTALL}/usr/share/fonts/liberation } ================================================ FILE: packages/x11/lib/libICE/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libICE" PKG_VERSION="1.1.1" PKG_SHA256="03e77afaf72942c7ac02ccebb19034e6e20f456dcf8dddadfeb572aa5ad3e451" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros xtrans" PKG_LONGDESC="X Inter-Client Exchange (ICE) protocol library." PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared \ --disable-ipv6 \ --without-xmlto" ================================================ FILE: packages/x11/lib/libSM/package.mk ================================================ # 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="libSM" PKG_VERSION="1.2.4" PKG_SHA256="fdcbe51e4d1276b1183da77a8a4e74a137ca203e0bcfb20972dd5f3347e97b84" PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros util-linux libICE" PKG_LONGDESC="This package provides the main interface to the X11 Session Management library." PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared \ --with-libuuid \ --without-xmlto \ --without-fop" ================================================ FILE: packages/x11/lib/libX11/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2017 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libX11" PKG_VERSION="1.8.4" PKG_SHA256="c9a287a5aefa9804ce3cfafcf516fe96ed3f7e8e45c0e2ee59e84c86757df518" PKG_LICENSE="OSS" PKG_SITE="https://www.x.org/" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros xtrans libXau libxcb xorgproto" PKG_LONGDESC="LibX11 is the main X11 library containing all the client-side code to access the X11 windowing system." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="--disable-loadable-i18n \ --disable-loadable-xcursor \ --enable-xthreads \ --disable-xcms \ --enable-xlocale \ --disable-xlocaledir \ --enable-xkb \ --with-keysymdefdir=${SYSROOT_PREFIX}/usr/include/X11 \ --disable-xf86bigfont \ --enable-malloc0returnsnull \ --disable-specs \ --without-xmlto \ --without-fop \ --enable-composecache \ --disable-lint-library \ --disable-ipv6 \ --without-launchd \ --without-lint" ================================================ FILE: packages/x11/lib/libX11/patches/libX11-disable_nls_tests.patch ================================================ diff -Naur libX11-1.6.0/nls/Makefile.am libX11-1.6.0.patch/nls/Makefile.am --- libX11-1.6.0/nls/Makefile.am 2013-06-04 04:21:16.000000000 +0200 +++ libX11-1.6.0.patch/nls/Makefile.am 2013-06-04 17:07:11.962522739 +0200 @@ -36,10 +36,10 @@ < locale.dir.l1 > locale.dir.l2 cat locale.dir.l2 locale.dir.l1 > locale.dir -if HAVE_PERL -LOG_COMPILER = $(PERL) -TESTS = compose-check.pl -endif HAVE_PERL +# if HAVE_PERL +# LOG_COMPILER = $(PERL) +# TESTS = compose-check.pl +# endif HAVE_PERL # Per-locale data files ================================================ FILE: packages/x11/lib/libXau/package.mk ================================================ # 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) PKG_NAME="libXau" PKG_VERSION="1.0.11" PKG_SHA256="f3fa3282f5570c3f6bd620244438dbfbdd580fc80f02f549587a0f8ab329bbeb" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros xorgproto" PKG_LONGDESC="X authorization file management libary" PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-static --disable-shared --enable-xthreads" ================================================ FILE: packages/x11/lib/libXcomposite/package.mk ================================================ # 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) PKG_NAME="libXcomposite" PKG_VERSION="0.4.6" PKG_SHA256="fe40bcf0ae1a09070eba24088a5eb9810efe57453779ec1e20a55080c6dc2c87" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros libXfixes libXext libX11" PKG_LONGDESC="X Composite Library" PKG_BUILD_FLAGS="+pic" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/x11/lib/libXdamage/package.mk ================================================ # 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) PKG_NAME="libXdamage" PKG_VERSION="1.1.6" PKG_SHA256="52733c1f5262fca35f64e7d5060c6fcd81a880ba8e1e65c9621cf0727afb5d11" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros libX11 libXfixes" PKG_LONGDESC="LibXdamage provides an X Window System client interface to the DAMAGE extension to the X protocol." PKG_BUILD_FLAGS="+pic" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/x11/lib/libXext/package.mk ================================================ # 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) PKG_NAME="libXext" PKG_VERSION="1.3.5" PKG_SHA256="db14c0c895c57ea33a8559de8cb2b93dc76c42ea4a39e294d175938a133d7bca" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros libX11" PKG_LONGDESC="LibXext provides an X Window System client interface to several extensions to the X protocol." PKG_CONFIGURE_OPTS_TARGET="--enable-malloc0returnsnull --without-xmlto" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/x11/lib/libXfixes/package.mk ================================================ # 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) PKG_NAME="libXfixes" PKG_VERSION="6.0.0" PKG_SHA256="a7c1a24da53e0b46cac5aea79094b4b2257321c621b258729bc3139149245b4c" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain util-macros libX11" PKG_LONGDESC="X Fixes Library" PKG_BUILD_FLAGS="+pic" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/x11/lib/libXfont2/package.mk ================================================ # 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) PKG_NAME="libXfont2" PKG_VERSION="2.0.6" PKG_SHA256="74ca20017eb0fb3f56d8d5e60685f560fc85e5ff3d84c61c4cb891e40c27aef4" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros xtrans freetype libfontenc" PKG_LONGDESC="X font Library" PKG_CONFIGURE_OPTS_TARGET="--disable-ipv6 \ --enable-freetype \ --enable-builtins \ --disable-pcfformat \ --disable-bdfformat \ --disable-snfformat \ --enable-fc \ --with-gnu-ld \ --without-xmlto" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/x11/lib/libXi/package.mk ================================================ # 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) PKG_NAME="libXi" PKG_VERSION="1.8" PKG_SHA256="2ed181446a61c7337576467870bc5336fc9e222a281122d96c4d39a3298bba00" PKG_LICENSE="OSS" PKG_SITE="http://www.x.org/" PKG_URL="https://www.x.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain util-macros libX11 libXfixes libXext" PKG_LONGDESC="LibXi provides an X Window System client interface to the XINPUT extension to the X protocol." PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-malloc0returnsnull \ --disable-silent-rules \ --disable-docs \ --disable-specs \ --without-xmlto \ --without-fop \ --without-xsltproc \ --without-asciidoc \ --with-gnu-ld" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/x11/lib/libXinerama/package.mk ================================================ # 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) PKG_NAME="libXinerama" PKG_VERSION="1.1.5" PKG_SHA256="5094d1f0fcc1828cb1696d0d39d9e866ae32520c54d01f618f1a3c1e30c2085c" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros libXext" PKG_LONGDESC="libXinerama is the Xinerama library." PKG_CONFIGURE_OPTS_TARGET="--enable-static --disable-shared --enable-malloc0returnsnull" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/x11/lib/libXrandr/package.mk ================================================ # 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) PKG_NAME="libXrandr" PKG_VERSION="1.5.3" PKG_SHA256="897639014a78e1497704d669c5dd5682d721931a4452c89a7ba62676064eb428" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros libX11 libXrender libXext" PKG_LONGDESC="Xrandr is a simple library designed to interface the X Resize and Rotate Extension." PKG_CONFIGURE_OPTS_TARGET="--enable-malloc0returnsnull" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/x11/lib/libXrender/package.mk ================================================ # 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) PKG_NAME="libXrender" PKG_VERSION="0.9.11" PKG_SHA256="bc53759a3a83d1ff702fb59641b3d2f7c56e05051fa0cfa93501166fa782dc24" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros libX11" PKG_LONGDESC="The X Rendering Extension introduces digital image composition within the X Window System." PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-malloc0returnsnull" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/x11/lib/libXt/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libXt" PKG_VERSION="1.2.1" PKG_SHA256="679cc08f1646dbd27f5e48ffe8dd49406102937109130caab02ca32c083a3d60" PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain util-macros libX11 libSM" PKG_LONGDESC="libXt provides the X Toolkit Intrinsics library, an abstract widget library upon which other toolkits are based." PKG_CONFIGURE_OPTS_TARGET="--enable-static \ --disable-shared \ --with-gnu-ld \ --enable-malloc0returnsnull" pre_make_target() { make -C util CC=${HOST_CC} \ CFLAGS="${HOST_CFLAGS} " \ LDFLAGS="${HOST_LDFLAGS}" \ makestrs } ================================================ FILE: packages/x11/lib/libXtst/package.mk ================================================ # 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) PKG_NAME="libXtst" PKG_VERSION="1.2.4" PKG_SHA256="84f5f30b9254b4ffee14b5b0940e2622153b0d3aed8286a3c5b7eeb340ca33c8" PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros libXext libXi libX11" PKG_LONGDESC="The Xtst Library" PKG_CONFIGURE_OPTS_TARGET="--with-gnu-ld --without-xmlto" post_configure_target() { libtool_remove_rpath libtool } ================================================ FILE: packages/x11/lib/libXxf86vm/package.mk ================================================ # 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) PKG_NAME="libXxf86vm" PKG_VERSION="1.1.5" PKG_SHA256="247fef48b3e0e7e67129e41f1e789e8d006ba47dba1c0cdce684b9b703f888e7" PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros libX11 libXext" PKG_LONGDESC="The libxxf86vm provides an interface to the server extension XFree86-VidModeExtension." PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-static --disable-shared --enable-malloc0returnsnull" ================================================ FILE: packages/x11/lib/libfontenc/package.mk ================================================ # 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) PKG_NAME="libfontenc" PKG_VERSION="1.1.7" PKG_SHA256="c0d36991faee06551ddbaf5d99266e97becdc05edfae87a833c3ff7bf73cfec2" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros zlib font-util xorgproto" PKG_LONGDESC="Libfontenc is a library which helps font libraries portably determine and deal with different encodings of fonts." PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--enable-static --disable-shared" ================================================ FILE: packages/x11/lib/libpciaccess/package.mk ================================================ # 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) PKG_NAME="libpciaccess" PKG_VERSION="0.17" PKG_SHA256="74283ba3c974913029e7a547496a29145b07ec51732bbb5b5c58d5025ad95b73" PKG_LICENSE="OSS" PKG_SITE="https://freedesktop.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros zlib" PKG_LONGDESC="X.org libpciaccess library." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="ac_cv_header_asm_mtrr_h=set \ --with-pciids-path=/usr/share \ --with-zlib " pre_configure_target() { CFLAGS+=" -D_LARGEFILE64_SOURCE" } ================================================ FILE: packages/x11/lib/libxcb/package.mk ================================================ # 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="libxcb" PKG_VERSION="1.15" PKG_SHA256="cc38744f817cf6814c847e2df37fcb8997357d72fa4bcbc228ae0fe47219a059" PKG_LICENSE="OSS" PKG_SITE="http://xcb.freedesktop.org" PKG_URL="http://xcb.freedesktop.org/dist/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros Python3:host xcb-proto libpthread-stubs libXau" PKG_LONGDESC="X C-language Bindings library." PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="--disable-screensaver \ --disable-xprint \ --disable-selinux \ --disable-xvmc" pre_configure_target() { PYTHON_LIBDIR=${SYSROOT_PREFIX}/usr/lib/${PKG_PYTHON_VERSION} PYTHON_TOOLCHAIN_PATH=${PYTHON_LIBDIR}/site-packages PKG_CONFIG+=" --define-variable=pythondir=${PYTHON_TOOLCHAIN_PATH}" PKG_CONFIG+=" --define-variable=xcbincludedir=${SYSROOT_PREFIX}/usr/share/xcb" } ================================================ FILE: packages/x11/lib/libxcvt/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libxcvt" PKG_VERSION="0.1.2" PKG_SHA256="0561690544796e25cfbd71806ba1b0d797ffe464e9796411123e79450f71db38" PKG_LICENSE="OSS" PKG_SITE="https://gitlab.freedesktop.org/xorg/lib/libxcvt" PKG_URL="https://www.x.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="libxcvt is a library providing a standalone version of the X server implementation of the VESA CVT standard timing modelines generator." PKG_BUILD_FLAGS="+pic" ================================================ FILE: packages/x11/lib/libxkbfile/package.mk ================================================ # 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) PKG_NAME="libxkbfile" PKG_VERSION="1.1.2" PKG_SHA256="b8a3784fac420b201718047cfb6c2d5ee7e8b9481564c2667b4215f6616644b1" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros libX11" PKG_LONGDESC="Libxkbfile provides an interface to read and manipulate description files for XKB, the X11 keyboard configuration extension." PKG_CONFIGURE_OPTS_TARGET="--enable-static --disable-shared" ================================================ FILE: packages/x11/lib/libxshmfence/package.mk ================================================ # 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) PKG_NAME="libxshmfence" PKG_VERSION="1.3.2" PKG_SHA256="870df257bc40b126d91b5a8f1da6ca8a524555268c50b59c0acd1a27f361606f" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros xorgproto" PKG_LONGDESC="libxshmfence is the Shared memory 'SyncFence' synchronization primitive." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic" ================================================ FILE: packages/x11/lib/pixman/package.mk ================================================ # 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="pixman" PKG_VERSION="0.42.2" PKG_SHA256="5747d2ec498ad0f1594878cc897ef5eb6c29e91c53b899f7f71b506785fc1376" PKG_LICENSE="OSS" PKG_SITE="https://www.x.org/" PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain util-macros" PKG_LONGDESC="Pixman is a generic library for manipulating pixel regions, contains low-level pixel manipulation routines." PKG_TOOLCHAIN="configure" if [ "${TARGET_ARCH}" = arm ]; then if target_has_feature neon; then PIXMAN_NEON="--enable-arm-neon" else PIXMAN_NEON="--disable-arm-neon" fi PIXMAN_CONFIG="--disable-mmx --disable-sse2 --disable-vmx --enable-arm-simd ${PIXMAN_NEON} --disable-arm-iwmmxt" elif [ "${TARGET_ARCH}" = aarch64 ]; then PIXMAN_CONFIG="--disable-mmx --disable-sse2 --disable-vmx --disable-arm-simd --disable-arm-neon --disable-arm-iwmmxt" elif [ "${TARGET_ARCH}" = x86_64 ]; then PIXMAN_CONFIG="--enable-mmx --enable-sse2 --disable-ssse3 --disable-vmx --disable-arm-simd --disable-arm-neon" fi PKG_CONFIGURE_OPTS_TARGET="--disable-openmp \ --disable-loongson-mmi \ ${PIXMAN_CONFIG} \ --disable-mips-dspr2 \ --enable-gcc-inline-asm \ --disable-timers \ --disable-gtk \ --disable-libpng \ --with-gnu-ld" post_makeinstall_target() { cp ${SYSROOT_PREFIX}/usr/lib/pkgconfig/pixman-1.pc \ ${SYSROOT_PREFIX}/usr/lib/pkgconfig/pixman.pc cp -rf ${SYSROOT_PREFIX}/usr/include/pixman-1 \ ${SYSROOT_PREFIX}/usr/include/pixman } ================================================ FILE: packages/x11/lib/xtrans/package.mk ================================================ # 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="xtrans" PKG_VERSION="1.4.0" PKG_SHA256="377c4491593c417946efcd2c7600d1e62639f7a8bbca391887e2c4679807d773" PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain util-macros" PKG_LONGDESC="Abstract network code for X." PKG_CONFIGURE_OPTS_TARGET="--without-xmlto" post_makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/lib/pkgconfig cp xtrans.pc ${SYSROOT_PREFIX}/usr/lib/pkgconfig } ================================================ FILE: packages/x11/other/fluxbox/config/apps ================================================ [app] (name=.*) [maximized] {yes} [end] ================================================ FILE: packages/x11/other/fluxbox/config/init ================================================ ! If you're looking for settings to configure, they won't be saved here until ! you change something in the fluxbox configuration menu. session.keyFile: /storage/.fluxbox/keys session.configVersion: 13 session.screen0.defaultDeco: NONE session.screen0.rootCommand: fbsetroot -solid black session.screen0.autoRaise: True session.screen0.fullMaximization: True session.screen0.workspaces: 0 session.screen0.focusModel: StrictMouseFocus session.screen0.focusNewWindows: True session.screen0.focusLastWindow: True ================================================ FILE: packages/x11/other/fluxbox/config/keys ================================================ # This is all we need # alt-tab Mod1 Tab :NextWindow {groups} (workspace=[current]) Mod1 Shift Tab :PrevWindow {groups} (workspace=[current]) # current window commands Mod1 F10 :Maximize Mod1 F11 :Fullscreen Mod1 Escape :Close # Normal window movement OnTitlebar Move1 :StartMoving OnLeftGrip Move1 :StartResizing bottomleft OnRightGrip Move1 :StartResizing bottomright OnWindowBorder Move1 :StartMoving # alt + left/right click to move/resize a window OnWindow Mod1 Mouse1 :MacroCmd {Raise} {Focus} {StartMoving} OnWindow Mod1 Mouse3 :MacroCmd {Raise} {Focus} {StartResizing NearestCorner} ================================================ FILE: packages/x11/other/fluxbox/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="fluxbox" # dont bump or go back to ratpoison then f*** all 3rdparty stuff. PKG_VERSION="1.3.7" PKG_SHA256="fc8c75fe94c54ed5a5dd3fd4a752109f8949d6df67a48e5b11a261403c382ec0" PKG_LICENSE="OSS" PKG_SITE="http://fluxbox.org/" PKG_URL="http://sourceforge.net/projects/fluxbox/files/fluxbox/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libX11 libXrandr libXext libXrender" PKG_LONGDESC="Fluxbox is a windowmanager for X that was based on the Blackbox 0.61.1 code." PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET="ac_cv_func_realloc_0_nonnull=yes \ ac_cv_func_malloc_0_nonnull=yes \ --disable-toolbar \ --disable-slit \ --disable-systray \ --enable-ewmh \ --disable-xpm \ --disable-xft \ --disable-fribidi \ --disable-debug \ --disable-test \ --disable-nls \ --disable-imlib2" post_install() { enable_service windowmanager.service } post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin/fbrun rm -rf ${INSTALL}/usr/bin/fbsetbg rm -rf ${INSTALL}/usr/bin/fluxbox-generate_menu rm -rf ${INSTALL}/usr/bin/fluxbox-remote rm -rf ${INSTALL}/usr/bin/startfluxbox rm -rf ${INSTALL}/usr/share/fluxbox/styles cp ${PKG_DIR}/config/apps ${INSTALL}/usr/share/fluxbox/ cp ${PKG_DIR}/config/init ${INSTALL}/usr/share/fluxbox/ cp ${PKG_DIR}/config/keys ${INSTALL}/usr/share/fluxbox/ } ================================================ FILE: packages/x11/other/fluxbox/patches/fluxbox-01_hack-avoid-potential-SIGFPE-in-Menu-updateMenu.patch ================================================ From 540dc69955cddd5db24a8a9e16db8162fc0ddd10 Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Fri, 25 Apr 2014 13:02:35 +0300 Subject: [PATCH] hack: avoid potential SIGFPE in Menu::updateMenu() --- src/FbTk/Menu.cc | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff -Naur fluxbox-1.3.7/src/FbTk/Menu.cc fluxbox-1.3.7.patch/src/FbTk/Menu.cc --- fluxbox-1.3.7/src/FbTk/Menu.cc 2015-02-08 11:44:45.357187009 +0100 +++ fluxbox-1.3.7.patch/src/FbTk/Menu.cc 2015-02-15 21:37:37.322872231 +0100 @@ -390,6 +390,7 @@ } void Menu::updateMenu() { + return; // because nobody cares int bevel = theme()->bevelWidth(); int bw = theme()->borderWidth(); ================================================ FILE: packages/x11/other/fluxbox/patches/fluxbox-02_hide-useless-errors.patch ================================================ From 86981018ce0963d93a45270abe379a705a055edf Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Mon, 16 Jun 2014 19:55:02 +0300 Subject: [PATCH] hide useless errors --- src/FbTk/Resource.cc | 2 -- src/FbTk/Resource.hh | 2 -- 2 files changed, 0 insertions(+), 4 deletions(-) diff --git a/src/FbTk/Resource.cc b/src/FbTk/Resource.cc index 4be85de..f7c7273 100644 --- a/src/FbTk/Resource.cc +++ b/src/FbTk/Resource.cc @@ -91,8 +91,6 @@ bool ResourceManager::load(const char *filename) { resource->setFromString(value.addr); else { _FB_USES_NLS; - cerr<<_FBTK_CONSOLETEXT(Error, FailedRead, "Failed to read", "Couldn't load a resource (following)")<<": "<<resource->name()<<endl; - cerr<<_FBTK_CONSOLETEXT(Error, UsingDefault, "Setting default value", "Falling back to default value for resource")<<endl; resource->setDefaultValue(); } } diff --git a/src/FbTk/Resource.hh b/src/FbTk/Resource.hh index 8c9d645..348f7e2 100644 --- a/src/FbTk/Resource.hh +++ b/src/FbTk/Resource.hh @@ -216,8 +216,6 @@ void ResourceManager::addResource(Resource<T> &r) { r.altName().c_str(), &value_type, &value)) { r.setFromString(value.addr); } else { - std::cerr<<"Failed to read: "<<r.name()<<std::endl; - std::cerr<<"Setting default value"<<std::endl; r.setDefaultValue(); } -- 1.7.2.5 ================================================ FILE: packages/x11/other/fluxbox/patches/fluxbox-03_fixes-bug-1138.patch ================================================ From 22866c4d30f5b289c429c5ca88d800200db4fc4f Mon Sep 17 00:00:00 2001 From: John Sennesael <john@aminking.com> Date: Mon, 2 Nov 2015 15:14:32 -0600 Subject: fixes bug #1138 --- util/fluxbox-remote.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/fluxbox-remote.cc b/util/fluxbox-remote.cc index 59852e6..504015b 100644 --- a/util/fluxbox-remote.cc +++ b/util/fluxbox-remote.cc @@ -73,7 +73,7 @@ int main(int argc, char **argv) { if (strcmp(cmd, "result") == 0) { XTextProperty text_prop; if (XGetTextProperty(disp, root, &text_prop, atom_result) != 0 - && text_prop.value > 0 + && text_prop.value != 0 && text_prop.nitems > 0) { printf("%s", text_prop.value); -- cgit v0.11.2 ================================================ FILE: packages/x11/other/fluxbox/patches/fluxbox-dont_build_fbrun.patch ================================================ diff -Naur fluxbox-1.3.6/Makefile.am fluxbox-1.3.6.patch/Makefile.am --- fluxbox-1.3.6/Makefile.am 2015-01-05 15:14:15.320478262 +0100 +++ fluxbox-1.3.6.patch/Makefile.am 2015-01-10 20:39:20.376934793 +0100 @@ -79,7 +79,6 @@ include src/Makemodule.am include src/tests/Makemodule.am include util/Makemodule.am -include util/fbrun/Makemodule.am uninstall-hook: rmdir $(DESTDIR)$(pkgdatadir) ================================================ FILE: packages/x11/other/fluxbox/system.d/windowmanager.service ================================================ [Unit] Description=Fluxbox Window Manager Requires=xorg.service After=xorg.service Before=kodi.service [Service] Environment=DISPLAY=:0 Environment=HOME=/storage ExecStart=/usr/bin/fluxbox KillMode=process Restart=always RestartSec=1 StartLimitInterval=0 TimeoutStopSec=1s [Install] WantedBy=graphical.target ================================================ FILE: packages/x11/other/fontconfig/package.mk ================================================ # 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="fontconfig" PKG_VERSION="2.14.1" PKG_SHA256="ae480e9ca34382790312ff062c625ec70df94d6d9a9366e2b2b3d525f7f90387" PKG_LICENSE="OSS" PKG_SITE="https://www.freedesktop.org/wiki/Software/fontconfig/" PKG_URL="https://www.freedesktop.org/software/fontconfig/release/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain util-linux util-macros freetype libxml2 zlib expat" PKG_LONGDESC="Fontconfig is a library for font customization and configuration." PKG_TOOLCHAIN="configure" PKG_CONFIGURE_OPTS_TARGET="--with-arch=${TARGET_ARCH} \ --with-cache-dir=/storage/.cache/fontconfig \ --with-default-fonts=/usr/share/fonts \ --without-add-fonts \ --disable-dependency-tracking \ --disable-docs \ --disable-rpath" pre_configure_target() { # ensure we dont use '-O3' optimization. CFLAGS=$(echo ${CFLAGS} | sed -e "s|-O3|-O2|") CXXFLAGS=$(echo ${CXXFLAGS} | sed -e "s|-O3|-O2|") CFLAGS+=" -I${PKG_BUILD}" CXXFLAGS+=" -I${PKG_BUILD}" } post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { rm -rf ${INSTALL}/usr/bin } ================================================ FILE: packages/x11/proto/xcb-proto/package.mk ================================================ # 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="xcb-proto" PKG_VERSION="1.15.2" PKG_SHA256="7072beb1f680a2fe3f9e535b797c146d22528990c72f63ddb49d2f350a3653ed" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/proto/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros Python3:host" PKG_LONGDESC="X C-language Bindings protocol headers." post_makeinstall_target() { python_remove_source } ================================================ FILE: packages/x11/proto/xorgproto/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="xorgproto" PKG_VERSION="2022.2" PKG_SHA256="5d13dbf2be08f95323985de53352c4f352713860457b95ccaf894a647ac06b9e" PKG_LICENSE="OSS" PKG_SITE="https://www.X.org" PKG_URL="https://xorg.freedesktop.org/archive/individual/proto/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros" PKG_LONGDESC="combined X.Org X11 Protocol headers" PKG_MESON_OPTS_TARGET="-Dlegacy=false" ================================================ FILE: packages/x11/util/util-macros/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="util-macros" PKG_VERSION="1.19.3" PKG_SHA256="0f812e6e9d2786ba8f54b960ee563c0663ddbe2434bf24ff193f5feab1f31971" PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/util/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="X.org autoconf utilities such as M4 macros." post_makeinstall_target() { rm -rf ${INSTALL}/usr } ================================================ FILE: packages/x11/util/xorg-launch-helper/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="xorg-launch-helper" PKG_VERSION="4" PKG_SHA256="a7f8809a1810212506893ac5c62d8d17fee7a980fb10d59d1bef36f694767be5" PKG_LICENSE="GPL-2" PKG_SITE="https://github.com/sofar/xorg-launch-helper" PKG_URL="http://foo-projects.org/~sofar/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain systemd" PKG_LONGDESC="Xorg-launch-helper is a small utility that transforms the X server process (XOrg) into a daemon." PKG_TOOLCHAIN="autotools" pre_configure_target() { export LIBS="-lsystemd" } post_makeinstall_target() { # do not install systemd services rm -rf ${INSTALL}/usr/lib mkdir -p ${INSTALL}/usr/bin cp -P ${PKG_DIR}/scripts/xorg-launch ${INSTALL}/usr/bin } ================================================ FILE: packages/x11/util/xorg-launch-helper/patches/xorg-launch-helper-automake-1.14.patch ================================================ diff -Naur xorg-launch-helper-4/configure.ac xorg-launch-helper-4.patch/configure.ac --- xorg-launch-helper-4/configure.ac 2012-10-23 21:17:54.000000000 +0200 +++ xorg-launch-helper-4.patch/configure.ac 2013-12-06 15:57:17.948725894 +0100 @@ -3,7 +3,7 @@ AC_PREREQ([2.68]) AC_INIT([xorg-launch-helper], [4], [auke-jan.h.kok@intel.com]) -AM_INIT_AUTOMAKE([-Wall -Werror foreign]) +AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects]) AC_CONFIG_FILES([Makefile]) AC_CONFIG_SRCDIR([src/main.c]) AC_CONFIG_HEADERS([config.h]) ================================================ FILE: packages/x11/util/xorg-launch-helper/patches/xorg-launch-helper-dont-check-for-libsystemd-daemon.patch ================================================ From 9cd13bb39f2a8ce5d458f5a33010b5c9c5edf131 Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Thu, 20 Feb 2014 16:34:57 +0200 Subject: [PATCH] dont check for libsystemd-daemon --- configure.ac | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index ceb8dd8..bc199c5 100644 --- a/configure.ac +++ b/configure.ac @@ -20,9 +20,6 @@ AC_CHECK_LIB([rt], [main], , AC_MSG_ERROR([librt is required but was not found])) PKG_CHECK_MODULES([SYSTEMD], [systemd]) -PKG_CHECK_MODULES([LIBSYSTEMD_DAEMON], [libsystemd-daemon]) -AC_SUBST(LIBSYSTEMD_DAEMON_CFLAGS) -AC_SUBST(LIBSYSTEMD_DAEMON_LIBS) AC_ARG_WITH([systemduserunitdir], AC_HELP_STRING([--with-systemduserunitdir=DIR], [path to systemd user service directory]), [path_systemduserunit=${withval}], -- 1.7.2.5 ================================================ FILE: packages/x11/util/xorg-launch-helper/patches/xorg-launch-helper-increase-timeout.patch ================================================ From 1e220cb2947f5c9ec5d5e35c7e2eb8b7dd728fca Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Fri, 22 Nov 2013 14:18:56 +0200 Subject: [PATCH] increase timeout --- src/main.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index 49e2d43..3c556b5 100644 --- a/src/main.c +++ b/src/main.c @@ -85,14 +85,14 @@ int main(int argc, char **argv) /* setup sighandler for main thread */ clock_gettime(CLOCK_REALTIME, &tv); - tv.tv_sec += 10; + tv.tv_sec += 30; pthread_mutex_lock(¬ify_mutex); err = pthread_cond_timedwait(¬ify_condition, ¬ify_mutex, &tv); pthread_mutex_unlock(¬ify_mutex); if (err == ETIMEDOUT) { - fprintf(stderr, "X server startup timed out (10secs). This indicates an" + fprintf(stderr, "X server startup timed out (30secs). This indicates an" "an issue in the server configuration or drivers.\n"); exit(EXIT_FAILURE); } -- 1.7.2.5 ================================================ FILE: packages/x11/util/xorg-launch-helper/scripts/xorg-launch ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # wait for xorg-configure@.service # max 10 seconds ARGS_FILE="/run/libreelec/xorg-settings.conf" for i in $(seq 1 40) ; do if [ -e "$ARGS_FILE" ] ; then break fi usleep 250000 done if [ -e "$ARGS_FILE" ] ; then . /run/libreelec/xorg-settings.conf exec xorg-launch-helper $@ $XORG_ARGS else echo "" > /dev/tty1 echo "failed to start xorg." > /dev/tty1 echo "is your GPU supported?" > /dev/tty1 echo "" > /dev/tty1 lspci -nn > /dev/tty1 echo "" > /dev/tty1 sleep 30 fi ================================================ FILE: packages/x11/xserver/xorg-server/debug.d/xorg.conf ================================================ XORG_DEBUG="-logverbose 6 -verbose 6" ================================================ FILE: packages/x11/xserver/xorg-server/package.mk ================================================ # 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) PKG_NAME="xorg-server" PKG_VERSION="21.1.7" PKG_SHA256="d9c60b2dd0ec52326ca6ab20db0e490b1ff4f566f59ca742d6532e92795877bb" PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="https://www.x.org/releases/individual/xserver/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros font-util xorgproto libpciaccess libX11 libXfont2 libXinerama libxcvt libxshmfence libxkbfile libdrm openssl freetype pixman systemd xorg-launch-helper" PKG_NEED_UNPACK="$(get_pkg_directory xf86-video-nvidia) $(get_pkg_directory xf86-video-nvidia-legacy)" PKG_LONGDESC="X.Org Server is the free and open-source implementation of the X Window System display server." get_graphicdrivers PKG_MESON_OPTS_TARGET="-Dxorg=true \ -Dxephyr=false \ -Dxnest=false \ -Dxvfb=false \ -Dxwin=false \ -Dxquartz=false \ -Dbuilder_addr=${BUILDER_NAME} \ -Dlog_dir="/var/log" \ -Dmodule_dir=${XORG_PATH_MODULES} \ -Ddefault_font_path="/usr/share/fonts/misc,built-ins" \ -Dxdmcp=false \ -Dxdm-auth-1=false \ -Dsecure-rpc=false \ -Dipv6=false \ -Dinput_thread=true \ -Dxkb_dir=${XORG_PATH_XKB} \ -Dxkb_output_dir="/var/cache/xkb" \ -Dvendor_name="LibreELEC" \ -Dvendor_name_short="LE" \ -Dvendor_web="https://libreelec.tv/" \ -Dlisten_tcp=false \ -Dlisten_unix=true \ -Dlisten_local=false \ -Dint10=x86emu \ -Dpciaccess=true \ -Dudev=true \ -Dudev_kms=true \ -Dhal=false \ -Dsystemd_logind=false \ -Dvgahw=true \ -Ddpms=true \ -Dxf86bigfont=false \ -Dscreensaver=false \ -Dxres=true \ -Dxace=false \ -Dxselinux=false \ -Dxinerama=true \ -Dxcsecurity=false \ -Dxv=true \ -Dxvmc=false \ -Ddga=true \ -Dlinux_apm=false \ -Dlinux_acpi=false \ -Dmitshm=true \ -Dsha1="libcrypto" \ -Ddri2=true \ -Ddri3=true \ -Ddrm=true \ -Dxpbproxy=false \ -Dlibunwind=false \ -Ddocs=false \ -Ddevel-docs=false" if [ ! "${OPENGL}" = "no" ]; then PKG_DEPENDS_TARGET+=" ${OPENGL} libepoxy" PKG_MESON_OPTS_TARGET+=" -Dglx=true \ -Ddri1=true \ -Dglamor=true" else PKG_MESON_OPTS_TARGET+=" -Dglx=false \ -Ddri1=false \ -Dglamor=false" fi if [ "${COMPOSITE_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" libXcomposite" fi post_makeinstall_target() { rm -rf ${INSTALL}/var/cache/xkb mkdir -p ${INSTALL}/usr/lib/xorg cp -P ${PKG_DIR}/scripts/xorg-configure ${INSTALL}/usr/lib/xorg sed -i -e "s|@NVIDIA_VERSION@|$(get_pkg_version xf86-video-nvidia)|g" ${INSTALL}/usr/lib/xorg/xorg-configure sed -i -e "s|@NVIDIA_LEGACY_VERSION@|$(get_pkg_version xf86-video-nvidia-legacy)|g" ${INSTALL}/usr/lib/xorg/xorg-configure if [ ! "${OPENGL}" = "no" ]; then if [ -f ${INSTALL}/usr/lib/xorg/modules/extensions/libglx.so ]; then mv ${INSTALL}/usr/lib/xorg/modules/extensions/libglx.so \ ${INSTALL}/usr/lib/xorg/modules/extensions/libglx_mesa.so # rename for cooperate with nvidia drivers ln -sf /var/lib/libglx.so ${INSTALL}/usr/lib/xorg/modules/extensions/libglx.so fi fi mkdir -p ${INSTALL}/etc/X11 if find_file_path config/xorg.conf; then cp ${FOUND_PATH} ${INSTALL}/etc/X11 fi } post_install() { enable_service xorg.service } ================================================ FILE: packages/x11/xserver/xorg-server/patches/xorg-server-100.01-detect-radeon.patch ================================================ From 7b147dfef7a2ce8247710660d2b95d84100aaad7 Mon Sep 17 00:00:00 2001 From: SupervisedThinking <supervisedthinking@gmail.com> Date: Tue, 19 Oct 2021 18:22:38 +0200 Subject: [PATCH] Detect GPUs as "radeon" instead "ati" --- hw/xfree86/common/xf86pciBus.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/xfree86/common/xf86pciBus.c b/hw/xfree86/common/xf86pciBus.c index aeeed8be66..5c22bd4080 100644 --- a/hw/xfree86/common/xf86pciBus.c +++ b/hw/xfree86/common/xf86pciBus.c @@ -1106,7 +1106,7 @@ xf86VideoPtrToDriverList(struct pci_device *dev, XF86MatchedDrivers *md) driverList[0] = "ast"; break; case 0x1002: - driverList[0] = "ati"; + driverList[0] = "radeon"; break; case 0x102c: driverList[0] = "chips"; ================================================ FILE: packages/x11/xserver/xorg-server/patches/xorg-server-100.02-add-fedora-extra-modes-list.patch ================================================ From aff7aded0cc546491b29b37b093846921ab7378a Mon Sep 17 00:00:00 2001 From: SupervisedThinking <supervisedthinking@gmail.com> Date: Tue, 19 Oct 2021 18:23:20 +0200 Subject: [PATCH] Fedora extra modes list added by Adam Jackson <ajax@redhat.com> --- hw/xfree86/common/extramodes | 59 ++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/hw/xfree86/common/extramodes b/hw/xfree86/common/extramodes index 006b5cba17..3caa3bf015 100644 --- a/hw/xfree86/common/extramodes +++ b/hw/xfree86/common/extramodes @@ -3,16 +3,75 @@ // // $XFree86: xc/programs/Xserver/hw/xfree86/etc/extramodes,v 1.5 2002/06/05 19:43:05 dawes Exp $ // +// NOTE: Please keep all video modes sorted in order of X res, then Y res for +// ease of maintenance and readability. # 832x624 @ 75Hz (74.55Hz) (fix if the official/Apple spec is different) hsync: 49.725kHz ModeLine "832x624" 57.284 832 864 928 1152 624 625 628 667 -Hsync -Vsync +# 1152x864 @ 60.00 Hz (GTF) hsync: 53.70 kHz; pclk: 81.62 MHz +Modeline "1152x864" 81.62 1152 1216 1336 1520 864 865 868 895 -HSync +Vsync + +# 1152x864 @ 70.00 Hz (GTF) hsync: 63.00 kHz; pclk: 96.77 MHz +Modeline "1152x864" 96.77 1152 1224 1344 1536 864 865 868 900 -HSync +Vsync + +# 1152x864 @ 75.00 Hz (GTF) hsync: 67.65 kHz; pclk: 104.99 MHz +Modeline "1152x864" 104.99 1152 1224 1352 1552 864 865 868 902 -HSync +Vsync + +# 1152x864 @ 85.00 Hz (GTF) hsync: 77.10 kHz; pclk: 119.65 MHz +Modeline "1152x864" 119.65 1152 1224 1352 1552 864 865 868 907 -HSync +Vsync + +# 1152x864 @ 85Hz (Red Hat custom modeline) +ModeLine "1152x864" 121.5 1152 1216 1344 1568 864 865 868 911 +hsync -vsync + +# 1152x864 @ 100.00 Hz (GTF) hsync: 91.50 kHz; pclk: 143.47 MHz +Modeline "1152x864" 143.47 1152 1232 1360 1568 864 865 868 915 -HSync +Vsync + +# 1360x768 59.96 Hz (CVT) hsync: 47.37 kHz; pclk: 72.00 MHz +Modeline "1360x768" 72.00 1360 1408 1440 1520 768 771 781 790 +hsync -vsync + +# 1360x768 59.80 Hz (CVT) hsync: 47.72 kHz; pclk: 84.75 MHz +Modeline "1360x768" 84.75 1360 1432 1568 1776 768 771 781 798 -hsync +vsync + # 1400x1050 @ 60Hz (VESA GTF) hsync: 65.5kHz ModeLine "1400x1050" 122.0 1400 1488 1640 1880 1050 1052 1064 1082 +hsync +vsync +# 1400x1050 @ 70.00 Hz (GTF) hsync: 76.51 kHz; pclk: 145.06 MHz +Modeline "1400x1050" 145.06 1400 1496 1648 1896 1050 1051 1054 1093 -HSync +Vsync + # 1400x1050 @ 75Hz (VESA GTF) hsync: 82.2kHz ModeLine "1400x1050" 155.8 1400 1464 1784 1912 1050 1052 1064 1090 +hsync +vsync +# 1400x1050 @ 85.00 Hz (GTF) hsync: 93.76 kHz; pclk: 179.26 MHz +Modeline "1400x1050" 179.26 1400 1504 1656 1912 1050 1051 1054 1103 -HSync +Vsync + +# 1440x900 @ 60.00 Hz (CVT) field rate 59.89 Hz; hsync: 55.93 kHz; pclk: 106.50 MHz +Modeline "1440x900" 106.50 1440 1520 1672 1904 900 903 909 934 -HSync +Vsync + +# 1600x1024 for SGI 1600 SW +ModeLine "1600x1024" 103.125 1600 1600 1656 1664 1024 1024 1029 1030 +Hsync +Vsync + +# 1680x1050 59.88 Hz (CVT 1.76MA-R) hsync: 64.67 kHz; pclk: 119.00 MHz +Modeline "1680x1050" 119.00 1680 1728 1760 1840 1050 1053 1059 1080 +hsync -vsync + +# 1680x1050 59.95 Hz (CVT 1.76MA) hsync: 65.29 kHz; pclk: 146.25 MHz +Modeline "1680x1050" 146.25 1680 1784 1960 2240 1050 1053 1059 1089 -hsync +vsync + +# 1680x1050 69.88 Hz (CVT) hsync: 76.58 kHz; pclk: 174.00 MHz +Modeline "1680x1050" 174.00 1680 1800 1976 2272 1050 1053 1059 1096 -hsync +vsync + +# 1680x1050 74.89 Hz (CVT 1.76MA) hsync: 82.31 kHz; pclk: 187.00 MHz +Modeline "1680x1050" 187.00 1680 1800 1976 2272 1050 1053 1059 1099 -hsync +vsync + +# 1680x1050 84.94 Hz (CVT 1.76MA) hsync: 93.86 kHz; pclk: 214.75 MHz +Modeline "1680x1050" 214.75 1680 1808 1984 2288 1050 1053 1059 1105 -hsync +vsync + +# 1920x1080 59.93 Hz (CVT 2.07M9-R) hsync: 66.59 kHz; pclk: 138.50 MHz +Modeline "1920x1080" 138.50 1920 1968 2000 2080 1080 1083 1088 1111 +hsync -vsync + +# 1920x1200 59.95 Hz (CVT 2.30MA-R) hsync: 74.04 kHz; pclk: 154.00 MHz +Modeline "1920x1200" 154.00 1920 1968 2000 2080 1200 1203 1209 1235 +hsync -vsync + # 1920x1440 @ 85Hz (VESA GTF) hsync: 128.5kHz Modeline "1920x1440" 341.35 1920 2072 2288 2656 1440 1441 1444 1512 -hsync +vsync ================================================ FILE: packages/x11/xserver/xorg-server/profile.d/11-xorg-server.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) DISPLAY=":0.0" export DISPLAY ================================================ FILE: packages/x11/xserver/xorg-server/scripts/xorg-configure ================================================ #!/bin/sh # 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) ################################################################################ # creating needed directories and symlinks ################################################################################ mkdir -p /var/lib mkdir -p /var/run # HACK. we have xorg-configure@%. so nice race # can happen on multi-gpu setups if [ -e /var/run/xorg-configure.done ] ; then exit 0 fi touch /var/run/xorg-configure.done logger -t Xorg "creating needed directories and symlinks for driver: "${1}"" ############################################################################## # setup xorg.conf paths ############################################################################## logger -t Xorg "### setup xorg.conf paths ###" XORG_CONF_USER="/storage/.config/xorg.conf" XORG_CONF_USER_DRV="/storage/.config/xorg-${1}.conf" XORG_CONF_DEFAULT="/etc/X11/xorg.conf" XORG_CONF_DEFAULT_DRV="/etc/X11/xorg-${1}.conf" ############################################################################## # creating start options ############################################################################## logger -t Xorg "### creating start options ###" XORG_ARGS="-s 0 -noreset -allowMouseOpenFail" # load user defined xorg.conf, if exist if [ -f "${XORG_CONF_USER}" ]; then XORG_ARGS="${XORG_ARGS} -config ${XORG_CONF_USER}" elif [ -f "${XORG_CONF_USER_DRV}" ]; then XORG_ARGS="${XORG_ARGS} -config ${XORG_CONF_USER_DRV}" elif [ -f "${XORG_CONF_DEFAULT}" ]; then XORG_ARGS="${XORG_ARGS} -config ${XORG_CONF_DEFAULT}" elif [ -f "$XORG_CONF_DEFAULT_DRV" ]; then XORG_ARGS="${XORG_ARGS} -config ${XORG_CONF_DEFAULT_DRV}" fi ############################################################################## # creating needed directories and symlinks ############################################################################## logger -t Xorg "### creating needed directories and symlinks ###" # Used to support GeForce 600 Series & newer if [ "${1}" = "nvidia" ]; then ln -sf /usr/lib/xorg/modules/extensions/libglx_nvidia.so /var/lib/libglx.so ln -sf /usr/lib/libnvidia-ml.so.@NVIDIA_VERSION@ /var/lib/libnvidia-ml.so.1 ln -sf /usr/lib/xorg/modules/drivers/nvidia-main_drv.so /var/lib/nvidia_drv.so ln -sf /usr/lib/nvidia/nvidia.ko /var/lib/nvidia.ko ln -sf /usr/lib/vdpau/libvdpau_nvidia-main.so.1 /var/lib/libvdpau_nvidia.so.1 ln -sf /usr/lib/vdpau/libvdpau_nvidia-main.so.1 /var/lib/libvdpau_nvidia.so ln -sf /usr/bin/nvidia-main-smi /var/lib/nvidia-smi ln -sf /usr/bin/nvidia-main-xconfig /var/lib/nvidia-xconfig insmod /var/lib/nvidia.ko # GL/GLX (GLVND) ln -sf /usr/lib/libGL_glvnd.so.1 /var/lib/libGL.so ln -sf /usr/lib/libGLX_glvnd.so.0 /var/lib/libGLX.so # indirect rendering ln -sf /usr/lib/libGLX_nvidia.so.0 /var/lib/libGLX_indirect.so.0 XORG_ARGS="${XORG_ARGS} -ignoreABI" # Used to support GeForce 500 Series & older elif [ "${1}" = "nvidia-legacy" ]; then ln -sf /usr/lib/libGL_nvidia-legacy.so.1 /var/lib/libGL.so ln -sf /usr/lib/xorg/modules/extensions/libglx_nvidia-legacy.so /var/lib/libglx.so ln -sf /usr/lib/libnvidia-ml.so.@NVIDIA_LEGACY_VERSION@ /var/lib/libnvidia-ml.so.1 ln -sf /usr/lib/xorg/modules/drivers/nvidia-legacy_drv.so /var/lib/nvidia_drv.so ln -sf /usr/lib/nvidia-legacy/nvidia.ko /var/lib/nvidia.ko ln -sf /usr/lib/vdpau/libvdpau_nvidia-legacy.so.1 /var/lib/libvdpau_nvidia.so.1 ln -sf /usr/lib/vdpau/libvdpau_nvidia-legacy.so.1 /var/lib/libvdpau_nvidia.so ln -sf /usr/bin/nvidia-legacy-smi /var/lib/nvidia-smi ln -sf /usr/bin/nvidia-legacy-xconfig /var/lib/nvidia-xconfig insmod /var/lib/nvidia.ko # GLX (NON-GLVND) ln -sf /usr/lib/libGL_nvidia-legacy.so.1 /var/lib/libGLX.so # indirect rendering ln -sf /usr/lib/libGL_nvidia-legacy.so.1 /var/lib/libGLX_indirect.so.0 XORG_ARGS="${XORG_ARGS} -ignoreABI" # Used for AMD & Intel GPUs supported by MESA 3D else ln -sf /usr/lib/xorg/modules/extensions/libglx_mesa.so /var/lib/libglx.so # GL/GLX (GLVND) ln -sf /usr/lib/libGL_glvnd.so.1 /var/lib/libGL.so ln -sf /usr/lib/libGLX_glvnd.so.0 /var/lib/libGLX.so # indirect rendering ln -sf /usr/lib/libGLX_mesa.so.0 /var/lib/libGLX_indirect.so.0 fi ################################################################################ # setup xorg-settings.conf ################################################################################ logger -t Xorg "### starting Xorg with '${DISPLAY} vt01 ${XORG_ARGS}' ###" mkdir -p /run/libreelec echo "XORG_ARGS=\"${XORG_ARGS}\"" > /run/libreelec/xorg-settings.conf ================================================ FILE: packages/x11/xserver/xorg-server/system.d/xorg-configure@.service ================================================ [Unit] Description=configure Xorg Server for %i ConditionKernelCommandLine=!installer [Service] Type=oneshot ExecStart=/usr/lib/xorg/xorg-configure %i RemainAfterExit=yes ================================================ FILE: packages/x11/xserver/xorg-server/system.d/xorg.service ================================================ [Unit] Description=Xorg Server Before=graphical.target kodi.service After=multi-user.target ConditionKernelCommandLine=!installer [Service] Type=notify EnvironmentFile=-/run/libreelec/debug/xorg.conf ExecStart=/usr/bin/xorg-launch -nolisten tcp vt01 $XORG_DEBUG Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=graphical.target ================================================ FILE: packages/x11/xserver/xorg-server/tmpfiles.d/z_90_xorg-server.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) d /var/cache/xkb 0755 root root - - ================================================ FILE: packages/x11/xserver/xorg-server/udev.d/97-xorg.rules ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) ACTION!="add|change", GOTO="end_video" # xorg_start only does something for subsystem "pci" and "video" class. SUBSYSTEM=="pci", ATTR{class}=="0x030000", GOTO="subsystem_pci" GOTO="end_video" # check for drivers using the pci substem LABEL="subsystem_pci" DRIVER=="i915", ENV{xorg_driver}="i915", TAG+="systemd", ENV{SYSTEMD_WANTS}+="xorg-configure@i915.service" DRIVER=="amdgpu", ENV{xorg_driver}="amdgpu", TAG+="systemd", ENV{SYSTEMD_WANTS}+="xorg-configure@amdgpu.service" DRIVER=="radeon", ENV{xorg_driver}="radeon", TAG+="systemd", ENV{SYSTEMD_WANTS}+="xorg-configure@radeon.service" DRIVER=="vmwgfx", ENV{xorg_driver}="vmware", TAG+="systemd", ENV{SYSTEMD_WANTS}+="xorg-configure@vmware.service" DRIVER=="virtio-pci", ENV{xorg_driver}="modesetting", TAG+="systemd", ENV{SYSTEMD_WANTS}+="xorg-configure@modesetting.service" GOTO="end_video" LABEL="end_video" ================================================ FILE: projects/ARM/README.md ================================================ The ARM project provides device targets used for compiling a common set of binary add-ons for use in ARM SoC projects and devices, and an "everything disabled" distro config to reduce individual or bulk add-on compile time. Current device targets are: - ARMv7 - ARMv8 ================================================ FILE: projects/ARM/devices/ARMv7/options ================================================ ################################################################################ # setup system defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. TARGET_CPU="cortex-a8" TARGET_FLOAT="hard" TARGET_FPU="neon-vfpv3" # OpenGL-ES implementation to use OPENGLES="mesa" # Graphic drivers to use GRAPHIC_DRIVERS="lima" # KODI Player implementation to use KODIPLAYER_DRIVER="$OPENGLES" # Mali GPU family MALI_FAMILY="450" ================================================ FILE: projects/ARM/devices/ARMv8/options ================================================ ################################################################################ # setup device defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc" TARGET_FPU="neon-fp-armv8" ;; esac # OpenGL-ES implementation to use OPENGLES="mesa" # Graphic drivers to use GRAPHIC_DRIVERS="lima" # KODI Player implementation to use KODIPLAYER_DRIVER="$OPENGLES" # Mali GPU family MALI_FAMILY="450" ================================================ FILE: projects/ARM/linux/linux.aarch64.conf ================================================ # dummy ================================================ FILE: projects/ARM/linux/linux.arm.conf ================================================ # dummy ================================================ FILE: projects/ARM/options ================================================ ################################################################################ # setup system defaults ################################################################################ # Bootloader to use (syslinux / u-boot / bcm2835-bootloader) BOOTLOADER="u-boot" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="" # Kernel to use. values can be: LINUX="default" ################################################################################ # setup build defaults ################################################################################ # Project CFLAGS PROJECT_CFLAGS="" # SquashFS compression method (gzip / lzo / xz / zstd) SQUASHFS_COMPRESSION="zstd" ################################################################################ # setup project defaults ################################################################################ # install extra subtitle Fonts for KODI (yes / no) KODI_EXTRA_FONTS="no" # build and install PulseAudio support (yes / no) PULSEAUDIO_SUPPORT="yes" # build and install with BluRay support (yes / no) KODI_BLURAY_SUPPORT="no" # build and install with BD+ support BLURAY_BDPLUS_SUPPORT="no" # build and install with AACS support BLURAY_AACS_SUPPORT="no" # build and install with DVDCSS support KODI_DVDCSS_SUPPORT="no" # additional drivers to install ADDITIONAL_DRIVERS+="" # build and install bluetooth support (yes / no) BLUETOOTH_SUPPORT="no" # build and install with KODI webfrontend (yes / no) KODI_WEBSERVER_SUPPORT="no" # build and install Avahi (Zeroconf) daemon (yes / no) AVAHI_DAEMON="no" # build with UPnP support (yes / no) KODI_UPNP_SUPPORT="no" # build with MySQL support (mariadb / none) KODI_MYSQL_SUPPORT="no" # build xbmc with optical drive support (yes / no) KODI_OPTICAL_SUPPORT="no" # build with AirPlay support (stream videos from iDevices to KODI) (yes / no) KODI_AIRPLAY_SUPPORT="no" # build with AirTunes support (stream music from iDevices to KODI) (yes / no) KODI_AIRTUNES_SUPPORT="no" # build with libnfs support (mounting nfs shares with KODI) (yes / no) KODI_NFS_SUPPORT="no" # build with Samba Client support (mounting SAMBA shares with KODI) (yes / no) KODI_SAMBA_SUPPORT="no" # build with NFS support (mounting nfs shares via the OS) (yes / no) NFS_SUPPORT="no" # build with Samba Client support (mounting samba shares via the OS) (yes / no) SAMBA_SUPPORT="no" # build and install Samba Server (yes / no) SAMBA_SERVER="no" # build and install SFTP Server (yes / no) SFTP_SERVER="no" # build and install OpenVPN support (yes / no) OPENVPN_SUPPORT="no" # build and install WireGuard support (yes / no) WIREGUARD_SUPPORT="no" # build and install diskmounter support (udevil) UDEVIL="no" # build and install hfs filesystem utilities (yes / no) HFSTOOLS="no" # Xorg Graphic drivers to use (all / r300,r600,nvidia) GRAPHIC_DRIVERS="mesa" # build and install remote support (yes / no) REMOTE_SUPPORT="no" # build and install Joystick support (yes / no) JOYSTICK_SUPPORT="no" # build and install CEC adapter support (yes / no) CEC_SUPPORT="no" # build and install CEC framework support (yes / no) CEC_FRAMEWORK_SUPPORT="no" # build and install iSCSI support - iscsistart (yes / no) ISCSI_SUPPORT="no" # build with swap support (yes / no) SWAP_SUPPORT="no" # additional packages to install ADDITIONAL_PACKAGES+="" # build with installer (yes / no) INSTALLER_SUPPORT="no" # build and install nano text editor (yes / no) NANO_EDITOR="no" # cron support (yes / no) CRON_SUPPORT="no" # OpenGL(X) implementation to use (no / mesa) OPENGL="no" # Vulkan implementation to use (vulkan-loader / no) VULKAN="no" # Displayserver to use (wl / no) DISPLAYSERVER="no" # Windowmanager to use (weston / no) WINDOWMANAGER="no" # additional Firmware to use FIRMWARE="" ================================================ FILE: projects/Allwinner/bootloader/config ================================================ # CONFIG_VIDEO_DE2 is not set # CONFIG_USB_EHCI_HCD is not set # CONFIG_USB_OHCI_HCD is not set # CONFIG_SUN8I_EMAC is not set CONFIG_BOOTDELAY=0 CONFIG_MACPWR="" # CONFIG_EFI_LOADER is not set CONFIG_SPL_LOAD_FIT=y CONFIG_SPL_FIT_IMAGE_TINY=y ================================================ FILE: projects/Allwinner/bootloader/firmware ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) [ -n "$ATF_PLATFORM" ] && cp -av $(get_install_dir atf)/usr/share/bootloader/bl31.bin . CRUST_CONFIG=$($ROOT/$SCRIPTS/uboot_helper $PROJECT $DEVICE $UBOOT_SYSTEM crust_config) [ -n "$CRUST_CONFIG" ] && cp -av $(get_install_dir crust)/usr/share/bootloader/scp.bin . # Suppress errors from uboot_helper so u-boot properly builds with and without crust true ================================================ FILE: projects/Allwinner/bootloader/install ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) cp -av u-boot-sunxi-with-spl.bin $INSTALL/usr/share/bootloader ================================================ FILE: projects/Allwinner/bootloader/mkimage ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) if [ -f "$RELEASE_DIR/3rdparty/bootloader/u-boot-sunxi-with-spl.bin" ]; then echo "Writing U-Boot to $(basename $DISK)" dd if="$RELEASE_DIR/3rdparty/bootloader/u-boot-sunxi-with-spl.bin" of="$DISK" bs=1K seek=8 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error fi ================================================ FILE: projects/Allwinner/bootloader/release ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) SRCDIR="$BUILD/image/system/usr/share/bootloader" DSTDIR="$RELEASE_DIR/3rdparty/bootloader" mkdir -p "$DSTDIR/overlays" if [ -n "$UBOOT_SYSTEM" ]; then cp -a "$SRCDIR/u-boot-sunxi-with-spl.bin" "$DSTDIR" fi cp -a "$SRCDIR"/sun*-${DEVICE,,}-*.dtb "$DSTDIR" cp -a "$SRCDIR"/overlays/sun*-${DEVICE,,}-*.dtbo "$DSTDIR"/overlays > /dev/null 2>&1 || true ================================================ FILE: projects/Allwinner/bootloader/update.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) [ -z "$BOOT_ROOT" ] && BOOT_ROOT="/flash" [ -z "$BOOT_PART" ] && BOOT_PART=$(df "$BOOT_ROOT" | tail -1 | awk {' print $1 '}) if [ -z "$BOOT_DISK" ]; then case $BOOT_PART in /dev/sd[a-z][0-9]*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,[0-9]*,,g") ;; /dev/mmcblk*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,p[0-9]*,,g") ;; esac fi # mount $BOOT_ROOT r/w mount -o remount,rw $BOOT_ROOT # update Device Tree Blobs for all_dtb in /flash/*.dtb; do dtb=$(basename $all_dtb) if [ -f $SYSTEM_ROOT/usr/share/bootloader/$dtb ]; then echo "*** updating Device Tree Blob: $dtb ..." cp -p $SYSTEM_ROOT/usr/share/bootloader/$dtb $BOOT_ROOT fi done # update Device Tree Overlays if [ -d $SYSTEM_ROOT/usr/share/bootloader/overlays ]; then echo "*** updating Device Tree Overlays ..." mkdir -p /flash/overlays cp -p $SYSTEM_ROOT/usr/share/bootloader/overlays/* /flash/overlays fi # update bootloader files if [ -f $SYSTEM_ROOT/usr/share/bootloader/u-boot-sunxi-with-spl.bin ]; then echo "*** updating U-Boot on: $BOOT_DISK ..." dd if=$SYSTEM_ROOT/usr/share/bootloader/u-boot-sunxi-with-spl.bin of="$BOOT_DISK" bs=1k seek=8 conv=fsync &>/dev/null fi # mount $BOOT_ROOT r/o sync mount -o remount,ro $BOOT_ROOT ================================================ FILE: projects/Allwinner/devices/A64/options ================================================ ################################################################################ # setup system defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc+crypto" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc" TARGET_FPU="crypto-neon-fp-armv8" ;; esac # Kernel target KERNEL_TARGET="Image" # U-Boot firmware package(s) to use UBOOT_FIRMWARE="atf crust" # ATF platform ATF_PLATFORM="sun50i_a64" # OpenGL-ES implementation to use (no / bcm2835-driver / gpu-viv-bin-mx6q) OPENGLES="mesa" # Mali GPU family MALI_FAMILY="400" # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap) KODIPLAYER_DRIVER="$OPENGLES" # set the addon project ADDON_PROJECT="ARMv8" ================================================ FILE: projects/Allwinner/devices/H2-plus/options ================================================ ################################################################################ # setup system defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in arm) # TARGET_CPU: # arm2 arm250 arm3 arm6 arm60 arm600 arm610 arm620 arm7 arm7m arm7d # arm7dm arm7di arm7dmi arm70 arm700 arm700i arm710 arm710c # arm7100 arm720 arm7500 arm7500fe arm7tdmi arm7tdmi-s arm710t # arm720t arm740t strongarm strongarm110 strongarm1100 # strongarm1110 arm8 arm810 arm9 arm9e arm920 arm920t arm922t # arm946e-s arm966e-s arm968e-s arm926ej-s arm940t arm9tdmi # arm10tdmi arm1020t arm1026ej-s arm10e arm1020e arm1022e # arm1136j-s arm1136jf-s mpcore mpcorenovfp arm1156t2-s # arm1176jz-s arm1176jzf-s cortex-a8 cortex-a9 cortex-r4 # cortex-r4f cortex-m3 cortex-m1 xscale iwmmxt iwmmxt2 ep9312. TARGET_CPU="cortex-a7" # TARGET_FLOAT: # Specifies which floating-point ABI to use. Permissible values are: # soft hard TARGET_FLOAT="hard" # TARGET_FPU: # This specifies what floating point hardware (or hardware emulation) is # available on the target. Permissible names are: # fpa fpe2 fpe3 maverick vfp vfpv3 vfpv3-fp16 vfpv3-d16 vfpv3-d16-fp16 # vfpv3xd vfpv3xd-fp16 neon neon-fp16 vfpv4 vfpv4-d16 fpv4-sp-d16 # neon-vfpv4. TARGET_FPU="neon-vfpv4" ;; esac # Kernel target KERNEL_TARGET="zImage" # U-Boot firmware package(s) to use UBOOT_FIRMWARE="crust" # OpenGL-ES implementation to use (no / bcm2835-driver / gpu-viv-bin-mx6q) OPENGLES="mesa" # Mali GPU family MALI_FAMILY="400" # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap) KODIPLAYER_DRIVER="$OPENGLES" # set the addon project ADDON_PROJECT="ARMv7" ================================================ FILE: projects/Allwinner/devices/H2-plus/patches/u-boot/0001-DO-NOT-MERGE-sunxi-psci-Delegate-PSCI-to-SCPI.patch ================================================ From 470309271de34eb8c24138f1ac15bd37966ed01a Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 9 Oct 2021 23:01:05 -0500 Subject: [PATCH 13/13] [DO NOT MERGE] sunxi: psci: Delegate PSCI to SCPI This adds a new PSCI implementation which communicates with SCP firmware running on the AR100 using the SCPI protocol. This allows it to support the full set of PSCI v1.1 features, including CPU idle states, system suspend, and multiple reset methods. Signed-off-by: Samuel Holland <samuel@sholland.org> --- arch/arm/cpu/armv7/Kconfig | 2 +- arch/arm/cpu/armv7/sunxi/Makefile | 2 +- arch/arm/cpu/armv7/sunxi/psci-scpi.c | 451 +++++++++++++++++++++++++++ 3 files changed, 453 insertions(+), 2 deletions(-) create mode 100644 arch/arm/cpu/armv7/sunxi/psci-scpi.c diff --git a/arch/arm/cpu/armv7/Kconfig b/arch/arm/cpu/armv7/Kconfig index 06b477619334..948f4e8276fe 100644 --- a/arch/arm/cpu/armv7/Kconfig +++ b/arch/arm/cpu/armv7/Kconfig @@ -44,7 +44,7 @@ config ARMV7_PSCI choice prompt "Supported PSCI version" depends on ARMV7_PSCI - default ARMV7_PSCI_0_1 if ARCH_SUNXI + default ARMV7_PSCI_1_1 if ARCH_SUNXI default ARMV7_PSCI_1_0 help Select the supported PSCI version. diff --git a/arch/arm/cpu/armv7/sunxi/Makefile b/arch/arm/cpu/armv7/sunxi/Makefile index 1d40d6a18dca..4a0c16deb459 100644 --- a/arch/arm/cpu/armv7/sunxi/Makefile +++ b/arch/arm/cpu/armv7/sunxi/Makefile @@ -11,7 +11,7 @@ obj-$(CONFIG_MACH_SUN6I) += tzpc.o obj-$(CONFIG_MACH_SUN8I_H3) += tzpc.o ifndef CONFIG_SPL_BUILD -obj-$(CONFIG_ARMV7_PSCI) += psci.o +obj-$(CONFIG_ARMV7_PSCI) += psci-scpi.o endif ifdef CONFIG_SPL_BUILD diff --git a/arch/arm/cpu/armv7/sunxi/psci-scpi.c b/arch/arm/cpu/armv7/sunxi/psci-scpi.c new file mode 100644 index 000000000000..b3849b366e31 --- /dev/null +++ b/arch/arm/cpu/armv7/sunxi/psci-scpi.c @@ -0,0 +1,451 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2016 Chen-Yu Tsai <wens@csie.org> + * Copyright (C) 2018-2021 Samuel Holland <samuel@sholland.org> + */ + +#include <common.h> +#include <asm/arch/cpu.h> +#include <asm/arch/cpucfg.h> +#include <asm/armv7.h> +#include <asm/gic.h> +#include <asm/io.h> +#include <asm/psci.h> +#include <asm/secure.h> +#include <asm/system.h> + +#define GICD_BASE (SUNXI_GIC400_BASE + GIC_DIST_OFFSET) +#define GICC_BASE (SUNXI_GIC400_BASE + GIC_CPU_OFFSET_A15) + +#define HW_ON 0 +#define HW_OFF 1 +#define HW_STANDBY 2 + +#define MPIDR_AFFLVL0(mpidr) (mpidr & 0xf) +#define MPIDR_AFFLVL1(mpidr) (mpidr >> 8 & 0xf) + +#define SCPI_SHMEM_BASE 0x0004be00 +#define SCPI_SHMEM ((struct scpi_shmem *)SCPI_SHMEM_BASE) + +#define SCPI_RX_CHANNEL 1 +#define SCPI_TX_CHANNEL 0 +#define SCPI_VIRTUAL_CHANNEL BIT(0) + +#define SCPI_MESSAGE_SIZE 0x100 +#define SCPI_PAYLOAD_SIZE (SCPI_MESSAGE_SIZE - sizeof(struct scpi_header)) + +#define SUNXI_MSGBOX_BASE 0x01c17000 +#define REMOTE_IRQ_STAT_REG (SUNXI_MSGBOX_BASE + 0x0050) +#define LOCAL_IRQ_STAT_REG (SUNXI_MSGBOX_BASE + 0x0070) +#define MSG_STAT_REG(n) (SUNXI_MSGBOX_BASE + 0x0140 + 0x4 * (n)) +#define MSG_DATA_REG(n) (SUNXI_MSGBOX_BASE + 0x0180 + 0x4 * (n)) + +#define RX_IRQ(n) BIT(0 + 2 * (n)) +#define TX_IRQ(n) BIT(1 + 2 * (n)) + +enum { + CORE_POWER_LEVEL = 0, + CLUSTER_POWER_LEVEL = 1, + CSS_POWER_LEVEL = 2, +}; + +enum { + SCPI_CMD_SCP_READY = 0x01, + SCPI_CMD_SET_CSS_POWER_STATE = 0x03, + SCPI_CMD_GET_CSS_POWER_STATE = 0x04, + SCPI_CMD_SET_SYS_POWER_STATE = 0x05, +}; + +enum { + SCPI_E_OK = 0, + SCPI_E_PARAM = 1, + SCPI_E_ALIGN = 2, + SCPI_E_SIZE = 3, + SCPI_E_HANDLER = 4, + SCPI_E_ACCESS = 5, + SCPI_E_RANGE = 6, + SCPI_E_TIMEOUT = 7, + SCPI_E_NOMEM = 8, + SCPI_E_PWRSTATE = 9, + SCPI_E_SUPPORT = 10, + SCPI_E_DEVICE = 11, + SCPI_E_BUSY = 12, + SCPI_E_OS = 13, + SCPI_E_DATA = 14, + SCPI_E_STATE = 15, +}; + +enum { + SCPI_POWER_ON = 0x00, + SCPI_POWER_RETENTION = 0x01, + SCPI_POWER_OFF = 0x03, +}; + +enum { + SCPI_SYSTEM_SHUTDOWN = 0x00, + SCPI_SYSTEM_REBOOT = 0x01, + SCPI_SYSTEM_RESET = 0x02, +}; + +struct scpi_header { + u8 command; + u8 sender; + u16 size; + u32 status; +}; + +struct scpi_message { + struct scpi_header header; + u8 payload[SCPI_PAYLOAD_SIZE]; +}; + +struct scpi_shmem { + struct scpi_message rx; + struct scpi_message tx; +}; + +static bool __secure_data gic_dist_init; + +static u32 __secure_data lock; + +static inline u32 __secure read_mpidr(void) +{ + u32 val; + + asm volatile ("mrc p15, 0, %0, c0, c0, 5" : "=r" (val)); + + return val; +} + +static void __secure scpi_begin_command(void) +{ + u32 mpidr = read_mpidr(); + + do { + while (readl(&lock)); + writel(mpidr, &lock); + dsb(); + } while (readl(&lock) != mpidr); + while (readl(REMOTE_IRQ_STAT_REG) & RX_IRQ(SCPI_TX_CHANNEL)); +} + +static void __secure scpi_send_command(void) +{ + writel(SCPI_VIRTUAL_CHANNEL, MSG_DATA_REG(SCPI_TX_CHANNEL)); +} + +static void __secure scpi_wait_response(void) +{ + while (!readl(MSG_STAT_REG(SCPI_RX_CHANNEL))); +} + +static void __secure scpi_end_command(void) +{ + while (readl(MSG_STAT_REG(SCPI_RX_CHANNEL))) + readl(MSG_DATA_REG(SCPI_RX_CHANNEL)); + writel(RX_IRQ(SCPI_RX_CHANNEL), LOCAL_IRQ_STAT_REG); + writel(0, &lock); +} + +static void __secure scpi_set_css_power_state(u32 target_cpu, u32 core_state, + u32 cluster_state, u32 css_state) +{ + struct scpi_shmem *shmem = SCPI_SHMEM; + + scpi_begin_command(); + + shmem->tx.header.command = SCPI_CMD_SET_CSS_POWER_STATE; + shmem->tx.header.size = 4; + + shmem->tx.payload[0] = target_cpu >> 4 | target_cpu; + shmem->tx.payload[1] = cluster_state << 4 | core_state; + shmem->tx.payload[2] = css_state; + shmem->tx.payload[3] = 0; + + scpi_send_command(); + scpi_end_command(); +} + +static s32 __secure scpi_get_css_power_state(u32 target_cpu, u8 *core_states, + u8 *cluster_state) +{ + struct scpi_shmem *shmem = SCPI_SHMEM; + u32 cluster = MPIDR_AFFLVL1(target_cpu); + u32 offset; + s32 ret; + + scpi_begin_command(); + + shmem->tx.header.command = SCPI_CMD_GET_CSS_POWER_STATE; + shmem->tx.header.size = 0; + + scpi_send_command(); + scpi_wait_response(); + + for (offset = 0; offset < shmem->rx.header.size; offset += 2) { + if ((shmem->rx.payload[offset] & 0xf) == cluster) { + *cluster_state = shmem->rx.payload[offset+0] >> 4; + *core_states = shmem->rx.payload[offset+1]; + + break; + } + } + + ret = shmem->rx.header.status; + + scpi_end_command(); + + return ret; +} + +static s32 __secure scpi_set_sys_power_state(u32 sys_state) +{ + struct scpi_shmem *shmem = SCPI_SHMEM; + s32 ret; + + scpi_begin_command(); + + shmem->tx.header.command = SCPI_CMD_SET_SYS_POWER_STATE; + shmem->tx.header.size = 1; + + shmem->tx.payload[0] = sys_state; + + scpi_send_command(); + scpi_wait_response(); + + ret = shmem->rx.header.status; + + scpi_end_command(); + + return ret; +} + +void psci_enable_smp(void); + +static s32 __secure psci_suspend_common(u32 pc, u32 context_id, u32 core_state, + u32 cluster_state, u32 css_state) + +{ + u32 target_cpu = read_mpidr(); + + if (core_state == SCPI_POWER_OFF) + psci_save(MPIDR_AFFLVL0(target_cpu), pc, context_id); + if (css_state == SCPI_POWER_OFF) + gic_dist_init = true; + + scpi_set_css_power_state(target_cpu, core_state, + cluster_state, css_state); + + psci_cpu_off_common(); + + wfi(); + + psci_enable_smp(); + + return ARM_PSCI_RET_SUCCESS; +} + +u32 __secure psci_version(void) +{ + return ARM_PSCI_VER_1_1; +} + +s32 __secure psci_cpu_suspend(u32 __always_unused function_id, + u32 power_state, u32 pc, u32 context_id) +{ + return psci_suspend_common(pc, context_id, + power_state >> 0 & 0xf, + power_state >> 4 & 0xf, + power_state >> 8 & 0xf); +} + +s32 __secure psci_cpu_off(void) +{ + u32 pc = 0, context_id = 0; + + return psci_suspend_common(pc, context_id, SCPI_POWER_OFF, + SCPI_POWER_OFF, SCPI_POWER_ON); +} + +s32 __secure psci_cpu_on(u32 __always_unused function_id, + u32 target_cpu, u32 pc, u32 context_id) +{ + psci_save(MPIDR_AFFLVL0(target_cpu), pc, context_id); + + scpi_set_css_power_state(target_cpu, SCPI_POWER_ON, + SCPI_POWER_ON, SCPI_POWER_ON); + + return ARM_PSCI_RET_SUCCESS; +} + +s32 __secure psci_affinity_info(u32 function_id, + u32 target_cpu, u32 power_level) +{ + if (power_level != CORE_POWER_LEVEL) + return ARM_PSCI_RET_INVAL; + + /* This happens to have the same HW_ON/HW_OFF encoding. */ + return psci_node_hw_state(function_id, target_cpu, power_level); +} + +void __secure psci_system_off(void) +{ + scpi_set_sys_power_state(SCPI_SYSTEM_SHUTDOWN); + + /* Wait to be turned off. */ + for (;;) wfi(); +} + +void __secure psci_system_reset(void) +{ + scpi_set_sys_power_state(SCPI_SYSTEM_REBOOT); + + /* Wait to be turned off. */ + for (;;) wfi(); +} + +s32 __secure psci_features(u32 __always_unused function_id, + u32 psci_fid) +{ + switch (psci_fid) { + case ARM_PSCI_0_2_FN_PSCI_VERSION: + case ARM_PSCI_0_2_FN_CPU_SUSPEND: + case ARM_PSCI_0_2_FN_CPU_OFF: + case ARM_PSCI_0_2_FN_CPU_ON: + case ARM_PSCI_0_2_FN_AFFINITY_INFO: + case ARM_PSCI_0_2_FN_SYSTEM_OFF: + case ARM_PSCI_0_2_FN_SYSTEM_RESET: + case ARM_PSCI_1_0_FN_PSCI_FEATURES: + case ARM_PSCI_1_0_FN_CPU_DEFAULT_SUSPEND: + case ARM_PSCI_1_0_FN_NODE_HW_STATE: + case ARM_PSCI_1_0_FN_SYSTEM_SUSPEND: + case ARM_PSCI_1_1_FN_SYSTEM_RESET2: + return ARM_PSCI_RET_SUCCESS; + default: + return ARM_PSCI_RET_NI; + } +} + +s32 __secure psci_cpu_default_suspend(u32 __always_unused function_id, + u32 pc, u32 context_id) +{ + return psci_suspend_common(pc, context_id, SCPI_POWER_OFF, + SCPI_POWER_OFF, SCPI_POWER_RETENTION); +} + +s32 __secure psci_node_hw_state(u32 __always_unused function_id, + u32 target_cpu, u32 power_level) +{ + u32 core = MPIDR_AFFLVL0(target_cpu); + u8 core_states, cluster_state; + + if (power_level >= CSS_POWER_LEVEL) + return HW_ON; + if (scpi_get_css_power_state(target_cpu, &core_states, &cluster_state)) + return ARM_PSCI_RET_NI; + if (power_level == CLUSTER_POWER_LEVEL) { + if (cluster_state == SCPI_POWER_ON) + return HW_ON; + if (cluster_state < SCPI_POWER_OFF) + return HW_STANDBY; + return HW_OFF; + } + + return (core_states & BIT(core)) ? HW_ON : HW_OFF; +} + +s32 __secure psci_system_suspend(u32 __always_unused function_id, + u32 pc, u32 context_id) +{ + return psci_suspend_common(pc, context_id, SCPI_POWER_OFF, + SCPI_POWER_OFF, SCPI_POWER_OFF); +} + +s32 __secure psci_system_reset2(u32 __always_unused function_id, + u32 reset_type, u32 cookie) +{ + s32 ret; + + if (reset_type) + return ARM_PSCI_RET_INVAL; + + ret = scpi_set_sys_power_state(SCPI_SYSTEM_RESET); + if (ret) + return ARM_PSCI_RET_INVAL; + + /* Wait to be turned off. */ + for (;;) wfi(); +} + +/* + * R40 is different from other single cluster SoCs. The secondary core + * entry address register is in the SRAM controller address range. + */ +#define SUN8I_R40_SRAMC_SOFT_ENTRY_REG0 (0xbc) + +#ifdef CONFIG_MACH_SUN8I_R40 +/* secondary core entry address is programmed differently on R40 */ +static void __secure sunxi_set_entry_address(void *entry) +{ + writel((u32)entry, + SUNXI_SRAMC_BASE + SUN8I_R40_SRAMC_SOFT_ENTRY_REG0); +} +#else +static void __secure sunxi_set_entry_address(void *entry) +{ + struct sunxi_cpucfg_reg *cpucfg = + (struct sunxi_cpucfg_reg *)SUNXI_CPUCFG_BASE; + + writel((u32)entry, &cpucfg->priv0); + + if (IS_ENABLED(CONFIG_MACH_SUN8I_H3)) { + /* Redirect CPU 0 to the secure monitor via the resume shim. */ + writel(0x16aaefe8, &cpucfg->super_standy_flag); + writel(0xaa16efe8, &cpucfg->super_standy_flag); + writel(SUNXI_RESUME_BASE, &cpucfg->priv1); + } +} +#endif + +void __secure psci_arch_init(void) +{ + static bool __secure_data one_time_init = true; + + if (one_time_init) { + /* Set secondary core power-on PC. */ + sunxi_set_entry_address(psci_cpu_entry); + + /* Wait for the SCP firmware to boot. */ + scpi_begin_command(); + scpi_wait_response(); + scpi_end_command(); + + one_time_init = false; + } + + /* + * Copied from arch/arm/cpu/armv7/virt-v7.c + * See also gic_resume() in arch/arm/mach-imx/mx7/psci-mx7.c + */ + if (gic_dist_init) { + u32 i, itlinesnr; + + /* enable the GIC distributor */ + writel(readl(GICD_BASE + GICD_CTLR) | 0x03, GICD_BASE + GICD_CTLR); + + /* TYPER[4:0] contains an encoded number of available interrupts */ + itlinesnr = readl(GICD_BASE + GICD_TYPER) & 0x1f; + + /* set all bits in the GIC group registers to one to allow access + * from non-secure state. The first 32 interrupts are private per + * CPU and will be set later when enabling the GIC for each core + */ + for (i = 1; i <= itlinesnr; i++) + writel((unsigned)-1, GICD_BASE + GICD_IGROUPRn + 4 * i); + + gic_dist_init = false; + } + + /* Be cool with non-secure. */ + writel(0xff, GICC_BASE + GICC_PMR); +} -- 2.33.0 ================================================ FILE: projects/Allwinner/devices/H2-plus/patches/u-boot/0007-sunxi-psci-Add-support-for-H3-CPU-0-hotplug.patch ================================================ From f15f4f36e023aaaeacdbebe16736119d1be3ac6b Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 9 Oct 2021 17:12:57 -0500 Subject: [PATCH 07/13] sunxi: psci: Add support for H3 CPU 0 hotplug Due to a bug in the H3 SoC, where the CPU 0 hotplug flag cannot be written, resuming CPU 0 requires using the "Super Standby" code path in the BROM instead of the hotplug path. This path requires jumping to an eGON image in SRAM. Add support to the build system to generate this eGON image and include it in the FIT, and add code to direct the BROM to its location in SRAM. Since the Super Standby code path in the BROM initializes the CPU and AHB1 clocks to 24 MHz, those registers need to be restored after control passes back to U-Boot. Furthermore, because the BROM lowers the AHB1 clock divider to /1 before switching to the lower-frequency parent, PLL_PERIPH0 must be bypassed to prevent AHB1 from temporarily running at 600 MHz. Otherwise, this locks up the SoC. Signed-off-by: Samuel Holland <samuel@sholland.org> --- Makefile | 17 +++++++++++++++++ arch/arm/cpu/armv7/sunxi/psci.c | 31 +++++++++++++++++++++++++++++++ arch/arm/dts/sunxi-u-boot.dtsi | 23 ++++++++++++++++++++++- include/configs/sun8i.h | 4 ++++ 4 files changed, 74 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f911f7034430..9edcadfa9c47 100644 --- a/Makefile +++ b/Makefile @@ -984,6 +984,23 @@ endif endif endif +ifeq ($(CONFIG_MACH_SUN8I_H3)$(CONFIG_ARMV7_PSCI),yy) +INPUTS-$(CONFIG_ARMV7_PSCI) += u-boot-resume.img + +MKIMAGEFLAGS_u-boot-resume.img := -B 0x400 -T sunxi_egon + +u-boot-resume.img: u-boot-resume.bin + $(call if_changed,mkimage) + +OBJCOPYFLAGS_u-boot-resume.bin := -O binary + +u-boot-resume.bin: u-boot-resume.o + $(call if_changed,objcopy) + +u-boot-resume.S: u-boot + @sed -En 's/(0x[[:xdigit:]]+) +psci_cpu_entry/ldr pc, =\1/p' $<.map > $@ +endif + INPUTS-$(CONFIG_X86) += u-boot-x86-start16.bin u-boot-x86-reset16.bin \ $(if $(CONFIG_SPL_X86_16BIT_INIT),spl/u-boot-spl.bin) \ $(if $(CONFIG_TPL_X86_16BIT_INIT),tpl/u-boot-tpl.bin) diff --git a/arch/arm/cpu/armv7/sunxi/psci.c b/arch/arm/cpu/armv7/sunxi/psci.c index 3448fe2edcaa..299bd3ba65e0 100644 --- a/arch/arm/cpu/armv7/sunxi/psci.c +++ b/arch/arm/cpu/armv7/sunxi/psci.c @@ -10,6 +10,7 @@ #include <common.h> #include <asm/cache.h> +#include <asm/arch/clock.h> #include <asm/arch/cpu.h> #include <asm/arch/cpucfg.h> #include <asm/arch/prcm.h> @@ -141,6 +142,13 @@ static void __secure sunxi_set_entry_address(void *entry) (struct sunxi_cpucfg_reg *)SUNXI_CPUCFG_BASE; writel((u32)entry, &cpucfg->priv0); + + if (IS_ENABLED(CONFIG_MACH_SUN8I_H3)) { + /* Redirect CPU 0 to the secure monitor via the resume shim. */ + writel(0x16aaefe8, &cpucfg->super_standy_flag); + writel(0xaa16efe8, &cpucfg->super_standy_flag); + writel(SUNXI_RESUME_BASE, &cpucfg->priv1); + } } #endif @@ -255,9 +263,12 @@ out: int __secure psci_cpu_on(u32 __always_unused unused, u32 mpidr, u32 pc, u32 context_id) { + struct sunxi_ccm_reg *ccu = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE; struct sunxi_cpucfg_reg *cpucfg = (struct sunxi_cpucfg_reg *)SUNXI_CPUCFG_BASE; u32 cpu = (mpidr & 0x3); + u32 cpu_clk; + u32 bus_clk; /* store target PC and context id */ psci_save(cpu, pc, context_id); @@ -274,12 +285,32 @@ int __secure psci_cpu_on(u32 __always_unused unused, u32 mpidr, u32 pc, /* Lock CPU (Disable external debug access) */ clrbits_le32(&cpucfg->dbg_ctrl1, BIT(cpu)); + if (IS_ENABLED(CONFIG_MACH_SUN8I_H3) && cpu == 0) { + /* Save registers that will be clobbered by the BROM. */ + cpu_clk = readl(&ccu->cpu_axi_cfg); + bus_clk = readl(&ccu->ahb1_apb1_div); + + /* Bypass PLL_PERIPH0 so AHB1 frequency does not spike. */ + setbits_le32(&ccu->pll6_cfg, BIT(25)); + } + /* Power up target CPU */ sunxi_cpu_set_power(cpu, true); /* De-assert reset on target CPU */ writel(BIT(1) | BIT(0), &cpucfg->cpu[cpu].rst); + if (IS_ENABLED(CONFIG_MACH_SUN8I_H3) && cpu == 0) { + /* Spin until the BROM has clobbered the clock registers. */ + while (readl(&ccu->ahb1_apb1_div) != 0x00001100); + + /* Restore the registers and turn off PLL_PERIPH0 bypass. */ + writel(cpu_clk, &ccu->cpu_axi_cfg); + writel(bus_clk, &ccu->ahb1_apb1_div); + + clrbits_le32(&ccu->pll6_cfg, BIT(25)); + } + /* Unlock CPU (Disable external debug access) */ setbits_le32(&cpucfg->dbg_ctrl1, BIT(cpu)); diff --git a/arch/arm/dts/sunxi-u-boot.dtsi b/arch/arm/dts/sunxi-u-boot.dtsi index ad1f97632979..a2c74da81aa9 100644 --- a/arch/arm/dts/sunxi-u-boot.dtsi +++ b/arch/arm/dts/sunxi-u-boot.dtsi @@ -6,7 +6,11 @@ #define ARCH "arm" #endif -#if defined(CONFIG_MACH_SUN50I) || defined(CONFIG_MACH_SUN50I_H5) +#if defined(CONFIG_MACH_SUN8I_H3) +#ifdef CONFIG_ARMV7_PSCI +#define RESUME_ADDR SUNXI_RESUME_BASE +#endif +#elif defined(CONFIG_MACH_SUN50I) || defined(CONFIG_MACH_SUN50I_H5) #define BL31_ADDR 0x00044000 #define SCP_ADDR 0x00050000 #elif defined(CONFIG_MACH_SUN50I_H6) @@ -74,6 +78,20 @@ }; #endif +#ifdef RESUME_ADDR + resume { + description = "Super Standby resume image"; + type = "standalone"; + arch = ARCH; + compression = "none"; + load = <RESUME_ADDR>; + + blob-ext { + filename = "u-boot-resume.img"; + }; + }; +#endif + #ifdef SCP_ADDR scp { description = "SCP firmware"; @@ -107,6 +125,9 @@ firmware = "uboot"; #endif loadables = +#ifdef RESUME_ADDR + "resume", +#endif #ifdef SCP_ADDR "scp", #endif diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h index 563635636624..2f0d69bdfce2 100644 --- a/include/configs/sunxi-common.h +++ b/include/configs/sunxi-common.h @@ -15,6 +15,12 @@ #include <asm/arch/cpu.h> #include <linux/stringify.h> +#ifdef SUNXI_SRAM_A2_SIZE +#define SUNXI_RESUME_BASE (CONFIG_ARMV7_SECURE_BASE + \ + CONFIG_ARMV7_SECURE_MAX_SIZE) +#define SUNXI_RESUME_SIZE 1024 +#endif + /* Serial & console */ #define CONFIG_SYS_NS16550_SERIAL /* ns16550 reg in the low bits of cpu reg */ -- 2.33.0 ================================================ FILE: projects/Allwinner/devices/H2-plus/patches/u-boot/0010-sunxi-Enable-support-for-SCP-firmware-on-H3.patch ================================================ From 92657de6d2ac3ae100a4d78cc37c729142f1a59b Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 17 Apr 2021 13:33:54 -0500 Subject: [PATCH 10/13] sunxi: Enable support for SCP firmware on H3 Now that issues with the BROM have been sorted out, we can implement PSCI system suspend on H3 by delegating to SCP firmware. Let's start by including the firmware in the FIT image and starting the coprocessor if valid firmware is loaded. Signed-off-by: Samuel Holland <samuel@sholland.org> --- arch/arm/dts/sunxi-u-boot.dtsi | 1 + board/sunxi/board.c | 8 ++++++++ include/configs/sun8i.h | 3 +++ 3 files changed, 12 insertions(+) diff --git a/arch/arm/dts/sunxi-u-boot.dtsi b/arch/arm/dts/sunxi-u-boot.dtsi index a2c74da81aa9..ce062fe94052 100644 --- a/arch/arm/dts/sunxi-u-boot.dtsi +++ b/arch/arm/dts/sunxi-u-boot.dtsi @@ -9,6 +9,7 @@ #if defined(CONFIG_MACH_SUN8I_H3) #ifdef CONFIG_ARMV7_PSCI #define RESUME_ADDR SUNXI_RESUME_BASE +#define SCP_ADDR SUNXI_SCP_BASE #endif #elif defined(CONFIG_MACH_SUN50I) || defined(CONFIG_MACH_SUN50I_H5) #define BL31_ADDR 0x00044000 diff --git a/board/sunxi/board.c b/board/sunxi/board.c index 2b7d655678d0..a25cd11f1124 100644 --- a/board/sunxi/board.c +++ b/board/sunxi/board.c @@ -18,6 +18,7 @@ #include <init.h> #include <log.h> #include <mmc.h> +#include <remoteproc.h> #include <axp_pmic.h> #include <generic-phy.h> #include <phy-sun4i-usb.h> @@ -957,6 +958,13 @@ int board_late_init(void) usb_ether_init(); #endif +#ifdef SUNXI_SCP_BASE + if (!rproc_load(0, SUNXI_SCP_BASE, SUNXI_SCP_MAX_SIZE)) { + puts("Starting SCP...\n"); + rproc_start(0); + } +#endif + return 0; } diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h index 2f0d69bdfce2..fda5b235a3e0 100644 --- a/include/configs/sunxi-common.h +++ b/include/configs/sunxi-common.h @@ -26,6 +26,9 @@ #define SUNXI_RESUME_BASE (CONFIG_ARMV7_SECURE_BASE + \ CONFIG_ARMV7_SECURE_MAX_SIZE) #define SUNXI_RESUME_SIZE 1024 + +#define SUNXI_SCP_BASE (SUNXI_RESUME_BASE + SUNXI_RESUME_SIZE) +#define SUNXI_SCP_MAX_SIZE (16 * 1024) #endif /* -- 2.33.0 ================================================ FILE: projects/Allwinner/devices/H3/options ================================================ ################################################################################ # setup system defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in arm) # TARGET_CPU: # arm2 arm250 arm3 arm6 arm60 arm600 arm610 arm620 arm7 arm7m arm7d # arm7dm arm7di arm7dmi arm70 arm700 arm700i arm710 arm710c # arm7100 arm720 arm7500 arm7500fe arm7tdmi arm7tdmi-s arm710t # arm720t arm740t strongarm strongarm110 strongarm1100 # strongarm1110 arm8 arm810 arm9 arm9e arm920 arm920t arm922t # arm946e-s arm966e-s arm968e-s arm926ej-s arm940t arm9tdmi # arm10tdmi arm1020t arm1026ej-s arm10e arm1020e arm1022e # arm1136j-s arm1136jf-s mpcore mpcorenovfp arm1156t2-s # arm1176jz-s arm1176jzf-s cortex-a8 cortex-a9 cortex-r4 # cortex-r4f cortex-m3 cortex-m1 xscale iwmmxt iwmmxt2 ep9312. TARGET_CPU="cortex-a7" # TARGET_FLOAT: # Specifies which floating-point ABI to use. Permissible values are: # soft hard TARGET_FLOAT="hard" # TARGET_FPU: # This specifies what floating point hardware (or hardware emulation) is # available on the target. Permissible names are: # fpa fpe2 fpe3 maverick vfp vfpv3 vfpv3-fp16 vfpv3-d16 vfpv3-d16-fp16 # vfpv3xd vfpv3xd-fp16 neon neon-fp16 vfpv4 vfpv4-d16 fpv4-sp-d16 # neon-vfpv4. TARGET_FPU="neon-vfpv4" ;; esac # Kernel target KERNEL_TARGET="zImage" # U-Boot firmware package(s) to use UBOOT_FIRMWARE="crust" # OpenGL-ES implementation to use (no / bcm2835-driver / gpu-viv-bin-mx6q) OPENGLES="mesa" # Mali GPU family MALI_FAMILY="400" # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap) KODIPLAYER_DRIVER="$OPENGLES" # set the addon project ADDON_PROJECT="ARMv7" ================================================ FILE: projects/Allwinner/devices/H3/patches/u-boot/0001-DO-NOT-MERGE-sunxi-psci-Delegate-PSCI-to-SCPI.patch ================================================ From 470309271de34eb8c24138f1ac15bd37966ed01a Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 9 Oct 2021 23:01:05 -0500 Subject: [PATCH 13/13] [DO NOT MERGE] sunxi: psci: Delegate PSCI to SCPI This adds a new PSCI implementation which communicates with SCP firmware running on the AR100 using the SCPI protocol. This allows it to support the full set of PSCI v1.1 features, including CPU idle states, system suspend, and multiple reset methods. Signed-off-by: Samuel Holland <samuel@sholland.org> --- arch/arm/cpu/armv7/Kconfig | 2 +- arch/arm/cpu/armv7/sunxi/Makefile | 2 +- arch/arm/cpu/armv7/sunxi/psci-scpi.c | 451 +++++++++++++++++++++++++++ 3 files changed, 453 insertions(+), 2 deletions(-) create mode 100644 arch/arm/cpu/armv7/sunxi/psci-scpi.c diff --git a/arch/arm/cpu/armv7/Kconfig b/arch/arm/cpu/armv7/Kconfig index 06b477619334..948f4e8276fe 100644 --- a/arch/arm/cpu/armv7/Kconfig +++ b/arch/arm/cpu/armv7/Kconfig @@ -44,7 +44,7 @@ config ARMV7_PSCI choice prompt "Supported PSCI version" depends on ARMV7_PSCI - default ARMV7_PSCI_0_1 if ARCH_SUNXI + default ARMV7_PSCI_1_1 if ARCH_SUNXI default ARMV7_PSCI_1_0 help Select the supported PSCI version. diff --git a/arch/arm/cpu/armv7/sunxi/Makefile b/arch/arm/cpu/armv7/sunxi/Makefile index 1d40d6a18dca..4a0c16deb459 100644 --- a/arch/arm/cpu/armv7/sunxi/Makefile +++ b/arch/arm/cpu/armv7/sunxi/Makefile @@ -13,7 +13,7 @@ obj-$(CONFIG_MACH_SUN6I) += tzpc.o obj-$(CONFIG_MACH_SUN8I) += sram.o ifndef CONFIG_SPL_BUILD -obj-$(CONFIG_ARMV7_PSCI) += psci.o +obj-$(CONFIG_ARMV7_PSCI) += psci-scpi.o endif ifdef CONFIG_SPL_BUILD diff --git a/arch/arm/cpu/armv7/sunxi/psci-scpi.c b/arch/arm/cpu/armv7/sunxi/psci-scpi.c new file mode 100644 index 000000000000..b3849b366e31 --- /dev/null +++ b/arch/arm/cpu/armv7/sunxi/psci-scpi.c @@ -0,0 +1,451 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2016 Chen-Yu Tsai <wens@csie.org> + * Copyright (C) 2018-2021 Samuel Holland <samuel@sholland.org> + */ + +#include <common.h> +#include <asm/arch/cpu.h> +#include <asm/arch/cpucfg.h> +#include <asm/armv7.h> +#include <asm/gic.h> +#include <asm/io.h> +#include <asm/psci.h> +#include <asm/secure.h> +#include <asm/system.h> + +#define GICD_BASE (SUNXI_GIC400_BASE + GIC_DIST_OFFSET) +#define GICC_BASE (SUNXI_GIC400_BASE + GIC_CPU_OFFSET_A15) + +#define HW_ON 0 +#define HW_OFF 1 +#define HW_STANDBY 2 + +#define MPIDR_AFFLVL0(mpidr) (mpidr & 0xf) +#define MPIDR_AFFLVL1(mpidr) (mpidr >> 8 & 0xf) + +#define SCPI_SHMEM_BASE 0x0004be00 +#define SCPI_SHMEM ((struct scpi_shmem *)SCPI_SHMEM_BASE) + +#define SCPI_RX_CHANNEL 1 +#define SCPI_TX_CHANNEL 0 +#define SCPI_VIRTUAL_CHANNEL BIT(0) + +#define SCPI_MESSAGE_SIZE 0x100 +#define SCPI_PAYLOAD_SIZE (SCPI_MESSAGE_SIZE - sizeof(struct scpi_header)) + +#define SUNXI_MSGBOX_BASE 0x01c17000 +#define REMOTE_IRQ_STAT_REG (SUNXI_MSGBOX_BASE + 0x0050) +#define LOCAL_IRQ_STAT_REG (SUNXI_MSGBOX_BASE + 0x0070) +#define MSG_STAT_REG(n) (SUNXI_MSGBOX_BASE + 0x0140 + 0x4 * (n)) +#define MSG_DATA_REG(n) (SUNXI_MSGBOX_BASE + 0x0180 + 0x4 * (n)) + +#define RX_IRQ(n) BIT(0 + 2 * (n)) +#define TX_IRQ(n) BIT(1 + 2 * (n)) + +enum { + CORE_POWER_LEVEL = 0, + CLUSTER_POWER_LEVEL = 1, + CSS_POWER_LEVEL = 2, +}; + +enum { + SCPI_CMD_SCP_READY = 0x01, + SCPI_CMD_SET_CSS_POWER_STATE = 0x03, + SCPI_CMD_GET_CSS_POWER_STATE = 0x04, + SCPI_CMD_SET_SYS_POWER_STATE = 0x05, +}; + +enum { + SCPI_E_OK = 0, + SCPI_E_PARAM = 1, + SCPI_E_ALIGN = 2, + SCPI_E_SIZE = 3, + SCPI_E_HANDLER = 4, + SCPI_E_ACCESS = 5, + SCPI_E_RANGE = 6, + SCPI_E_TIMEOUT = 7, + SCPI_E_NOMEM = 8, + SCPI_E_PWRSTATE = 9, + SCPI_E_SUPPORT = 10, + SCPI_E_DEVICE = 11, + SCPI_E_BUSY = 12, + SCPI_E_OS = 13, + SCPI_E_DATA = 14, + SCPI_E_STATE = 15, +}; + +enum { + SCPI_POWER_ON = 0x00, + SCPI_POWER_RETENTION = 0x01, + SCPI_POWER_OFF = 0x03, +}; + +enum { + SCPI_SYSTEM_SHUTDOWN = 0x00, + SCPI_SYSTEM_REBOOT = 0x01, + SCPI_SYSTEM_RESET = 0x02, +}; + +struct scpi_header { + u8 command; + u8 sender; + u16 size; + u32 status; +}; + +struct scpi_message { + struct scpi_header header; + u8 payload[SCPI_PAYLOAD_SIZE]; +}; + +struct scpi_shmem { + struct scpi_message rx; + struct scpi_message tx; +}; + +static bool __secure_data gic_dist_init; + +static u32 __secure_data lock; + +static inline u32 __secure read_mpidr(void) +{ + u32 val; + + asm volatile ("mrc p15, 0, %0, c0, c0, 5" : "=r" (val)); + + return val; +} + +static void __secure scpi_begin_command(void) +{ + u32 mpidr = read_mpidr(); + + do { + while (readl(&lock)); + writel(mpidr, &lock); + dsb(); + } while (readl(&lock) != mpidr); + while (readl(REMOTE_IRQ_STAT_REG) & RX_IRQ(SCPI_TX_CHANNEL)); +} + +static void __secure scpi_send_command(void) +{ + writel(SCPI_VIRTUAL_CHANNEL, MSG_DATA_REG(SCPI_TX_CHANNEL)); +} + +static void __secure scpi_wait_response(void) +{ + while (!readl(MSG_STAT_REG(SCPI_RX_CHANNEL))); +} + +static void __secure scpi_end_command(void) +{ + while (readl(MSG_STAT_REG(SCPI_RX_CHANNEL))) + readl(MSG_DATA_REG(SCPI_RX_CHANNEL)); + writel(RX_IRQ(SCPI_RX_CHANNEL), LOCAL_IRQ_STAT_REG); + writel(0, &lock); +} + +static void __secure scpi_set_css_power_state(u32 target_cpu, u32 core_state, + u32 cluster_state, u32 css_state) +{ + struct scpi_shmem *shmem = SCPI_SHMEM; + + scpi_begin_command(); + + shmem->tx.header.command = SCPI_CMD_SET_CSS_POWER_STATE; + shmem->tx.header.size = 4; + + shmem->tx.payload[0] = target_cpu >> 4 | target_cpu; + shmem->tx.payload[1] = cluster_state << 4 | core_state; + shmem->tx.payload[2] = css_state; + shmem->tx.payload[3] = 0; + + scpi_send_command(); + scpi_end_command(); +} + +static s32 __secure scpi_get_css_power_state(u32 target_cpu, u8 *core_states, + u8 *cluster_state) +{ + struct scpi_shmem *shmem = SCPI_SHMEM; + u32 cluster = MPIDR_AFFLVL1(target_cpu); + u32 offset; + s32 ret; + + scpi_begin_command(); + + shmem->tx.header.command = SCPI_CMD_GET_CSS_POWER_STATE; + shmem->tx.header.size = 0; + + scpi_send_command(); + scpi_wait_response(); + + for (offset = 0; offset < shmem->rx.header.size; offset += 2) { + if ((shmem->rx.payload[offset] & 0xf) == cluster) { + *cluster_state = shmem->rx.payload[offset+0] >> 4; + *core_states = shmem->rx.payload[offset+1]; + + break; + } + } + + ret = shmem->rx.header.status; + + scpi_end_command(); + + return ret; +} + +static s32 __secure scpi_set_sys_power_state(u32 sys_state) +{ + struct scpi_shmem *shmem = SCPI_SHMEM; + s32 ret; + + scpi_begin_command(); + + shmem->tx.header.command = SCPI_CMD_SET_SYS_POWER_STATE; + shmem->tx.header.size = 1; + + shmem->tx.payload[0] = sys_state; + + scpi_send_command(); + scpi_wait_response(); + + ret = shmem->rx.header.status; + + scpi_end_command(); + + return ret; +} + +void psci_enable_smp(void); + +static s32 __secure psci_suspend_common(u32 pc, u32 context_id, u32 core_state, + u32 cluster_state, u32 css_state) + +{ + u32 target_cpu = read_mpidr(); + + if (core_state == SCPI_POWER_OFF) + psci_save(MPIDR_AFFLVL0(target_cpu), pc, context_id); + if (css_state == SCPI_POWER_OFF) + gic_dist_init = true; + + scpi_set_css_power_state(target_cpu, core_state, + cluster_state, css_state); + + psci_cpu_off_common(); + + wfi(); + + psci_enable_smp(); + + return ARM_PSCI_RET_SUCCESS; +} + +u32 __secure psci_version(void) +{ + return ARM_PSCI_VER_1_1; +} + +s32 __secure psci_cpu_suspend(u32 __always_unused function_id, + u32 power_state, u32 pc, u32 context_id) +{ + return psci_suspend_common(pc, context_id, + power_state >> 0 & 0xf, + power_state >> 4 & 0xf, + power_state >> 8 & 0xf); +} + +s32 __secure psci_cpu_off(void) +{ + u32 pc = 0, context_id = 0; + + return psci_suspend_common(pc, context_id, SCPI_POWER_OFF, + SCPI_POWER_OFF, SCPI_POWER_ON); +} + +s32 __secure psci_cpu_on(u32 __always_unused function_id, + u32 target_cpu, u32 pc, u32 context_id) +{ + psci_save(MPIDR_AFFLVL0(target_cpu), pc, context_id); + + scpi_set_css_power_state(target_cpu, SCPI_POWER_ON, + SCPI_POWER_ON, SCPI_POWER_ON); + + return ARM_PSCI_RET_SUCCESS; +} + +s32 __secure psci_affinity_info(u32 function_id, + u32 target_cpu, u32 power_level) +{ + if (power_level != CORE_POWER_LEVEL) + return ARM_PSCI_RET_INVAL; + + /* This happens to have the same HW_ON/HW_OFF encoding. */ + return psci_node_hw_state(function_id, target_cpu, power_level); +} + +void __secure psci_system_off(void) +{ + scpi_set_sys_power_state(SCPI_SYSTEM_SHUTDOWN); + + /* Wait to be turned off. */ + for (;;) wfi(); +} + +void __secure psci_system_reset(void) +{ + scpi_set_sys_power_state(SCPI_SYSTEM_REBOOT); + + /* Wait to be turned off. */ + for (;;) wfi(); +} + +s32 __secure psci_features(u32 __always_unused function_id, + u32 psci_fid) +{ + switch (psci_fid) { + case ARM_PSCI_0_2_FN_PSCI_VERSION: + case ARM_PSCI_0_2_FN_CPU_SUSPEND: + case ARM_PSCI_0_2_FN_CPU_OFF: + case ARM_PSCI_0_2_FN_CPU_ON: + case ARM_PSCI_0_2_FN_AFFINITY_INFO: + case ARM_PSCI_0_2_FN_SYSTEM_OFF: + case ARM_PSCI_0_2_FN_SYSTEM_RESET: + case ARM_PSCI_1_0_FN_PSCI_FEATURES: + case ARM_PSCI_1_0_FN_CPU_DEFAULT_SUSPEND: + case ARM_PSCI_1_0_FN_NODE_HW_STATE: + case ARM_PSCI_1_0_FN_SYSTEM_SUSPEND: + case ARM_PSCI_1_1_FN_SYSTEM_RESET2: + return ARM_PSCI_RET_SUCCESS; + default: + return ARM_PSCI_RET_NI; + } +} + +s32 __secure psci_cpu_default_suspend(u32 __always_unused function_id, + u32 pc, u32 context_id) +{ + return psci_suspend_common(pc, context_id, SCPI_POWER_OFF, + SCPI_POWER_OFF, SCPI_POWER_RETENTION); +} + +s32 __secure psci_node_hw_state(u32 __always_unused function_id, + u32 target_cpu, u32 power_level) +{ + u32 core = MPIDR_AFFLVL0(target_cpu); + u8 core_states, cluster_state; + + if (power_level >= CSS_POWER_LEVEL) + return HW_ON; + if (scpi_get_css_power_state(target_cpu, &core_states, &cluster_state)) + return ARM_PSCI_RET_NI; + if (power_level == CLUSTER_POWER_LEVEL) { + if (cluster_state == SCPI_POWER_ON) + return HW_ON; + if (cluster_state < SCPI_POWER_OFF) + return HW_STANDBY; + return HW_OFF; + } + + return (core_states & BIT(core)) ? HW_ON : HW_OFF; +} + +s32 __secure psci_system_suspend(u32 __always_unused function_id, + u32 pc, u32 context_id) +{ + return psci_suspend_common(pc, context_id, SCPI_POWER_OFF, + SCPI_POWER_OFF, SCPI_POWER_OFF); +} + +s32 __secure psci_system_reset2(u32 __always_unused function_id, + u32 reset_type, u32 cookie) +{ + s32 ret; + + if (reset_type) + return ARM_PSCI_RET_INVAL; + + ret = scpi_set_sys_power_state(SCPI_SYSTEM_RESET); + if (ret) + return ARM_PSCI_RET_INVAL; + + /* Wait to be turned off. */ + for (;;) wfi(); +} + +/* + * R40 is different from other single cluster SoCs. The secondary core + * entry address register is in the SRAM controller address range. + */ +#define SUN8I_R40_SRAMC_SOFT_ENTRY_REG0 (0xbc) + +#ifdef CONFIG_MACH_SUN8I_R40 +/* secondary core entry address is programmed differently on R40 */ +static void __secure sunxi_set_entry_address(void *entry) +{ + writel((u32)entry, + SUNXI_SRAMC_BASE + SUN8I_R40_SRAMC_SOFT_ENTRY_REG0); +} +#else +static void __secure sunxi_set_entry_address(void *entry) +{ + struct sunxi_cpucfg_reg *cpucfg = + (struct sunxi_cpucfg_reg *)SUNXI_CPUCFG_BASE; + + writel((u32)entry, &cpucfg->priv0); + + if (IS_ENABLED(CONFIG_MACH_SUN8I_H3)) { + /* Redirect CPU 0 to the secure monitor via the resume shim. */ + writel(0x16aaefe8, &cpucfg->super_standy_flag); + writel(0xaa16efe8, &cpucfg->super_standy_flag); + writel(SUNXI_RESUME_BASE, &cpucfg->priv1); + } +} +#endif + +void __secure psci_arch_init(void) +{ + static bool __secure_data one_time_init = true; + + if (one_time_init) { + /* Set secondary core power-on PC. */ + sunxi_set_entry_address(psci_cpu_entry); + + /* Wait for the SCP firmware to boot. */ + scpi_begin_command(); + scpi_wait_response(); + scpi_end_command(); + + one_time_init = false; + } + + /* + * Copied from arch/arm/cpu/armv7/virt-v7.c + * See also gic_resume() in arch/arm/mach-imx/mx7/psci-mx7.c + */ + if (gic_dist_init) { + u32 i, itlinesnr; + + /* enable the GIC distributor */ + writel(readl(GICD_BASE + GICD_CTLR) | 0x03, GICD_BASE + GICD_CTLR); + + /* TYPER[4:0] contains an encoded number of available interrupts */ + itlinesnr = readl(GICD_BASE + GICD_TYPER) & 0x1f; + + /* set all bits in the GIC group registers to one to allow access + * from non-secure state. The first 32 interrupts are private per + * CPU and will be set later when enabling the GIC for each core + */ + for (i = 1; i <= itlinesnr; i++) + writel((unsigned)-1, GICD_BASE + GICD_IGROUPRn + 4 * i); + + gic_dist_init = false; + } + + /* Be cool with non-secure. */ + writel(0xff, GICC_BASE + GICC_PMR); +} -- 2.33.0 ================================================ FILE: projects/Allwinner/devices/H3/patches/u-boot/0007-sunxi-psci-Add-support-for-H3-CPU-0-hotplug.patch ================================================ From f15f4f36e023aaaeacdbebe16736119d1be3ac6b Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 9 Oct 2021 17:12:57 -0500 Subject: [PATCH 07/13] sunxi: psci: Add support for H3 CPU 0 hotplug Due to a bug in the H3 SoC, where the CPU 0 hotplug flag cannot be written, resuming CPU 0 requires using the "Super Standby" code path in the BROM instead of the hotplug path. This path requires jumping to an eGON image in SRAM. Add support to the build system to generate this eGON image and include it in the FIT, and add code to direct the BROM to its location in SRAM. Since the Super Standby code path in the BROM initializes the CPU and AHB1 clocks to 24 MHz, those registers need to be restored after control passes back to U-Boot. Furthermore, because the BROM lowers the AHB1 clock divider to /1 before switching to the lower-frequency parent, PLL_PERIPH0 must be bypassed to prevent AHB1 from temporarily running at 600 MHz. Otherwise, this locks up the SoC. Signed-off-by: Samuel Holland <samuel@sholland.org> --- Makefile | 17 +++++++++++++++++ arch/arm/cpu/armv7/sunxi/psci.c | 31 +++++++++++++++++++++++++++++++ arch/arm/dts/sunxi-u-boot.dtsi | 23 ++++++++++++++++++++++- include/configs/sun8i.h | 4 ++++ 4 files changed, 74 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f911f7034430..9edcadfa9c47 100644 --- a/Makefile +++ b/Makefile @@ -984,6 +984,23 @@ endif endif endif +ifeq ($(CONFIG_MACH_SUN8I_H3)$(CONFIG_ARMV7_PSCI),yy) +INPUTS-$(CONFIG_ARMV7_PSCI) += u-boot-resume.img + +MKIMAGEFLAGS_u-boot-resume.img := -B 0x400 -T sunxi_egon + +u-boot-resume.img: u-boot-resume.bin + $(call if_changed,mkimage) + +OBJCOPYFLAGS_u-boot-resume.bin := -O binary + +u-boot-resume.bin: u-boot-resume.o + $(call if_changed,objcopy) + +u-boot-resume.S: u-boot + @sed -En 's/(0x[[:xdigit:]]+) +psci_cpu_entry/ldr pc, =\1/p' $<.map > $@ +endif + INPUTS-$(CONFIG_X86) += u-boot-x86-start16.bin u-boot-x86-reset16.bin \ $(if $(CONFIG_SPL_X86_16BIT_INIT),spl/u-boot-spl.bin) \ $(if $(CONFIG_TPL_X86_16BIT_INIT),tpl/u-boot-tpl.bin) diff --git a/arch/arm/cpu/armv7/sunxi/psci.c b/arch/arm/cpu/armv7/sunxi/psci.c index 3448fe2edcaa..299bd3ba65e0 100644 --- a/arch/arm/cpu/armv7/sunxi/psci.c +++ b/arch/arm/cpu/armv7/sunxi/psci.c @@ -10,6 +10,7 @@ #include <common.h> #include <asm/cache.h> +#include <asm/arch/clock.h> #include <asm/arch/cpu.h> #include <asm/arch/cpucfg.h> #include <asm/arch/prcm.h> @@ -141,6 +142,13 @@ static void __secure sunxi_set_entry_address(void *entry) (struct sunxi_cpucfg_reg *)SUNXI_CPUCFG_BASE; writel((u32)entry, &cpucfg->priv0); + + if (IS_ENABLED(CONFIG_MACH_SUN8I_H3)) { + /* Redirect CPU 0 to the secure monitor via the resume shim. */ + writel(0x16aaefe8, &cpucfg->super_standy_flag); + writel(0xaa16efe8, &cpucfg->super_standy_flag); + writel(SUNXI_RESUME_BASE, &cpucfg->priv1); + } } #endif @@ -255,9 +263,12 @@ out: int __secure psci_cpu_on(u32 __always_unused unused, u32 mpidr, u32 pc, u32 context_id) { + struct sunxi_ccm_reg *ccu = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE; struct sunxi_cpucfg_reg *cpucfg = (struct sunxi_cpucfg_reg *)SUNXI_CPUCFG_BASE; u32 cpu = (mpidr & 0x3); + u32 cpu_clk; + u32 bus_clk; /* store target PC and context id */ psci_save(cpu, pc, context_id); @@ -274,12 +285,32 @@ int __secure psci_cpu_on(u32 __always_unused unused, u32 mpidr, u32 pc, /* Lock CPU (Disable external debug access) */ clrbits_le32(&cpucfg->dbg_ctrl1, BIT(cpu)); + if (IS_ENABLED(CONFIG_MACH_SUN8I_H3) && cpu == 0) { + /* Save registers that will be clobbered by the BROM. */ + cpu_clk = readl(&ccu->cpu_axi_cfg); + bus_clk = readl(&ccu->ahb1_apb1_div); + + /* Bypass PLL_PERIPH0 so AHB1 frequency does not spike. */ + setbits_le32(&ccu->pll6_cfg, BIT(25)); + } + /* Power up target CPU */ sunxi_cpu_set_power(cpu, true); /* De-assert reset on target CPU */ writel(BIT(1) | BIT(0), &cpucfg->cpu[cpu].rst); + if (IS_ENABLED(CONFIG_MACH_SUN8I_H3) && cpu == 0) { + /* Spin until the BROM has clobbered the clock registers. */ + while (readl(&ccu->ahb1_apb1_div) != 0x00001100); + + /* Restore the registers and turn off PLL_PERIPH0 bypass. */ + writel(cpu_clk, &ccu->cpu_axi_cfg); + writel(bus_clk, &ccu->ahb1_apb1_div); + + clrbits_le32(&ccu->pll6_cfg, BIT(25)); + } + /* Unlock CPU (Disable external debug access) */ setbits_le32(&cpucfg->dbg_ctrl1, BIT(cpu)); diff --git a/arch/arm/dts/sunxi-u-boot.dtsi b/arch/arm/dts/sunxi-u-boot.dtsi index ad1f97632979..a2c74da81aa9 100644 --- a/arch/arm/dts/sunxi-u-boot.dtsi +++ b/arch/arm/dts/sunxi-u-boot.dtsi @@ -6,7 +6,11 @@ #define ARCH "arm" #endif -#if defined(CONFIG_MACH_SUN50I) || defined(CONFIG_MACH_SUN50I_H5) +#if defined(CONFIG_MACH_SUN8I_H3) +#ifdef CONFIG_ARMV7_PSCI +#define RESUME_ADDR SUNXI_RESUME_BASE +#endif +#elif defined(CONFIG_MACH_SUN50I) || defined(CONFIG_MACH_SUN50I_H5) #define BL31_ADDR 0x00044000 #define SCP_ADDR 0x00050000 #elif defined(CONFIG_MACH_SUN50I_H6) @@ -74,6 +78,20 @@ }; #endif +#ifdef RESUME_ADDR + resume { + description = "Super Standby resume image"; + type = "standalone"; + arch = ARCH; + compression = "none"; + load = <RESUME_ADDR>; + + blob-ext { + filename = "u-boot-resume.img"; + }; + }; +#endif + #ifdef SCP_ADDR scp { description = "SCP firmware"; @@ -107,6 +125,9 @@ firmware = "uboot"; #endif loadables = +#ifdef RESUME_ADDR + "resume", +#endif #ifdef SCP_ADDR "scp", #endif diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h index 563635636624..2f0d69bdfce2 100644 --- a/include/configs/sunxi-common.h +++ b/include/configs/sunxi-common.h @@ -15,6 +15,12 @@ #include <asm/arch/cpu.h> #include <linux/stringify.h> +#ifdef SUNXI_SRAM_A2_SIZE +#define SUNXI_RESUME_BASE (CONFIG_ARMV7_SECURE_BASE + \ + CONFIG_ARMV7_SECURE_MAX_SIZE) +#define SUNXI_RESUME_SIZE 1024 +#endif + /* Serial & console */ #define CONFIG_SYS_NS16550_SERIAL /* ns16550 reg in the low bits of cpu reg */ -- 2.33.0 ================================================ FILE: projects/Allwinner/devices/H3/patches/u-boot/0010-sunxi-Enable-support-for-SCP-firmware-on-H3.patch ================================================ From 92657de6d2ac3ae100a4d78cc37c729142f1a59b Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 17 Apr 2021 13:33:54 -0500 Subject: [PATCH 10/13] sunxi: Enable support for SCP firmware on H3 Now that issues with the BROM have been sorted out, we can implement PSCI system suspend on H3 by delegating to SCP firmware. Let's start by including the firmware in the FIT image and starting the coprocessor if valid firmware is loaded. Signed-off-by: Samuel Holland <samuel@sholland.org> --- arch/arm/dts/sunxi-u-boot.dtsi | 1 + board/sunxi/board.c | 8 ++++++++ include/configs/sun8i.h | 3 +++ 3 files changed, 12 insertions(+) diff --git a/arch/arm/dts/sunxi-u-boot.dtsi b/arch/arm/dts/sunxi-u-boot.dtsi index a2c74da81aa9..ce062fe94052 100644 --- a/arch/arm/dts/sunxi-u-boot.dtsi +++ b/arch/arm/dts/sunxi-u-boot.dtsi @@ -9,6 +9,7 @@ #if defined(CONFIG_MACH_SUN8I_H3) #ifdef CONFIG_ARMV7_PSCI #define RESUME_ADDR SUNXI_RESUME_BASE +#define SCP_ADDR SUNXI_SCP_BASE #endif #elif defined(CONFIG_MACH_SUN50I) || defined(CONFIG_MACH_SUN50I_H5) #define BL31_ADDR 0x00044000 diff --git a/board/sunxi/board.c b/board/sunxi/board.c index 2b7d655678d0..a25cd11f1124 100644 --- a/board/sunxi/board.c +++ b/board/sunxi/board.c @@ -18,6 +18,7 @@ #include <init.h> #include <log.h> #include <mmc.h> +#include <remoteproc.h> #include <axp_pmic.h> #include <generic-phy.h> #include <phy-sun4i-usb.h> @@ -957,6 +958,13 @@ int board_late_init(void) usb_ether_init(); #endif +#ifdef SUNXI_SCP_BASE + if (!rproc_load(0, SUNXI_SCP_BASE, SUNXI_SCP_MAX_SIZE)) { + puts("Starting SCP...\n"); + rproc_start(0); + } +#endif + return 0; } diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h index 2f0d69bdfce2..fda5b235a3e0 100644 --- a/include/configs/sunxi-common.h +++ b/include/configs/sunxi-common.h @@ -26,6 +26,9 @@ #define SUNXI_RESUME_BASE (CONFIG_ARMV7_SECURE_BASE + \ CONFIG_ARMV7_SECURE_MAX_SIZE) #define SUNXI_RESUME_SIZE 1024 + +#define SUNXI_SCP_BASE (SUNXI_RESUME_BASE + SUNXI_RESUME_SIZE) +#define SUNXI_SCP_MAX_SIZE (16 * 1024) #endif /* -- 2.33.0 ================================================ FILE: projects/Allwinner/devices/H5/options ================================================ ################################################################################ # setup system defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc+crypto" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc" TARGET_FPU="crypto-neon-fp-armv8" ;; esac # Kernel target KERNEL_TARGET="Image" # U-Boot firmware package(s) to use UBOOT_FIRMWARE="atf crust" # ATF platform ATF_PLATFORM="sun50i_a64" # OpenGL-ES implementation to use OPENGLES="mesa" # Mali GPU family MALI_FAMILY="450" # KODI Player implementation to use KODIPLAYER_DRIVER="$OPENGLES" # set the addon project ADDON_PROJECT="ARMv8" ================================================ FILE: projects/Allwinner/devices/H6/options ================================================ ################################################################################ # setup system defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc+crypto" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc" TARGET_FPU="crypto-neon-fp-armv8" ;; esac # Kernel target KERNEL_TARGET="Image" # U-Boot firmware package(s) to use UBOOT_FIRMWARE="atf crust" # ATF platform ATF_PLATFORM="sun50i_h6" # OpenGL-ES implementation to use (no / bcm2835-driver / gpu-viv-bin-mx6q) OPENGLES="mesa" # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap) KODIPLAYER_DRIVER="$OPENGLES" # set the addon project ADDON_PROJECT="ARMv8" # additional kernel parameters EXTRA_CMDLINE="$EXTRA_CMDLINE" ================================================ FILE: projects/Allwinner/devices/R40/options ================================================ ################################################################################ # setup system defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in arm) # TARGET_CPU: # arm2 arm250 arm3 arm6 arm60 arm600 arm610 arm620 arm7 arm7m arm7d # arm7dm arm7di arm7dmi arm70 arm700 arm700i arm710 arm710c # arm7100 arm720 arm7500 arm7500fe arm7tdmi arm7tdmi-s arm710t # arm720t arm740t strongarm strongarm110 strongarm1100 # strongarm1110 arm8 arm810 arm9 arm9e arm920 arm920t arm922t # arm946e-s arm966e-s arm968e-s arm926ej-s arm940t arm9tdmi # arm10tdmi arm1020t arm1026ej-s arm10e arm1020e arm1022e # arm1136j-s arm1136jf-s mpcore mpcorenovfp arm1156t2-s # arm1176jz-s arm1176jzf-s cortex-a8 cortex-a9 cortex-r4 # cortex-r4f cortex-m3 cortex-m1 xscale iwmmxt iwmmxt2 ep9312. TARGET_CPU="cortex-a7" # TARGET_FLOAT: # Specifies which floating-point ABI to use. Permissible values are: # soft hard TARGET_FLOAT="hard" # TARGET_FPU: # This specifies what floating point hardware (or hardware emulation) is # available on the target. Permissible names are: # fpa fpe2 fpe3 maverick vfp vfpv3 vfpv3-fp16 vfpv3-d16 vfpv3-d16-fp16 # vfpv3xd vfpv3xd-fp16 neon neon-fp16 vfpv4 vfpv4-d16 fpv4-sp-d16 # neon-vfpv4. TARGET_FPU="neon-vfpv4" ;; esac # Kernel target KERNEL_TARGET="zImage" # OpenGL-ES implementation to use (no / bcm2835-driver / gpu-viv-bin-mx6q) OPENGLES="mesa" # Mali GPU family MALI_FAMILY="400" # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap) KODIPLAYER_DRIVER="$OPENGLES" # set the addon project ADDON_PROJECT="ARMv7" ================================================ FILE: projects/Allwinner/filesystem/usr/bin/cputemp ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) TEMP="$(cat /sys/class/thermal/thermal_zone0/temp)" echo "$(( $TEMP / 1000 )) C" ================================================ FILE: projects/Allwinner/filesystem/usr/bin/gputemp ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) if [ -f /sys/class/thermal/thermal_zone1/temp ]; then TEMP="$(cat /sys/class/thermal/thermal_zone1/temp)" else TEMP="$(cat /sys/class/thermal/thermal_zone0/temp)" fi echo "$(( $TEMP / 1000 )) C" ================================================ FILE: projects/Allwinner/filesystem/usr/bin/install2emmc ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) TMP=/tmp/mnt/ SYSTEM_SIZE=@SYSTEM_SIZE@ UUID_SYSTEM="$(date '+%d%m')-$(date '+%M%S')" UUID_STORAGE="$(uuidgen)" BOOT=$(grep /flash /proc/mounts | awk '{print $1}' | sed 's/p[012]//g') DISK="" for TYPE in /sys/class/block/mmcblk*/device/type; do if grep -q "MMC" "${TYPE}"; then DISK="/dev/$(echo "${TYPE}" | awk -F/ '{print $5}')" break fi done if [ -z "${DISK}" ]; then echo "Can't find eMMC module!" exit 1 fi if [ "${BOOT}" = "${DISK}" ]; then echo "Your device is booted from the eMMC module!" exit 1 fi echo "" echo -e "\033[36m===============================" echo "Installing @DISTRONAME@ to eMMC" echo -e "===============================\033[37m" echo "" echo "eMMC found at ${DISK}" echo "" if [ ! -b "${DISK}" ]; then echo "Error: eMMC not found." exit 1 fi echo "" echo -n "WARNING: ALL DATA ON eMMC WILL BE ERASED! Continue (y/N)? " read -n 1 ANSWER if [ ! "${ANSWER}" = "y" ]; then echo "" echo "Aborting..." exit 0 fi echo "" umount ${DISK}* > /dev/null 2>&1 echo "Erasing eMMC ..." dd if=/dev/zero of="${DISK}" bs=1M count=1 conv=fsync > /dev/null 2>&1 echo "Creating partitions" parted -s "${DISK}" mklabel msdos parted -s "${DISK}" -a optimal mkpart primary fat32 0% ${SYSTEM_SIZE}MiB parted -s "${DISK}" set 1 boot on parted -s "${DISK}" -a optimal mkpart primary ext4 ${SYSTEM_SIZE}MiB 100% sync echo "Creating filesystems" dd if=/dev/zero of="${DISK}p1" bs=1M count=1 conv=fsync > /dev/null 2>&1 mkfs.vfat -n SYSTEM -i ${UUID_SYSTEM//-/} ${DISK}p1 > /dev/null 2>&1 dd if=/dev/zero of="${DISK}p2" bs=1M count=1 conv=fsync > /dev/null 2>&1 mkfs.ext4 -L STORAGE -U ${UUID_STORAGE} ${DISK}p2 > /dev/null 2>&1 sync echo "Installing bootloader" dd if="${BOOT}" skip=8 of="${DISK}" bs=1k seek=8 count=768 conv=fsync > /dev/null 2>&1 echo "Copying system files" mkdir -p ${TMP} mount -t vfat ${DISK}p1 ${TMP} cp -R /flash/. ${TMP}/ sync echo "Adjusting partition UUIDs" sed -i "s/boot=UUID=[0-9a-f\-]*/boot=UUID=${UUID_SYSTEM}/g" ${TMP}/extlinux/extlinux.conf sed -i "s/disk=UUID=[0-9a-f\-]*/disk=UUID=${UUID_STORAGE}/g" ${TMP}/extlinux/extlinux.conf umount ${TMP} echo "Done" ================================================ FILE: projects/Allwinner/filesystem/usr/lib/systemd/sleep.conf.d/memonly.conf ================================================ [Sleep] SuspendState=mem ================================================ FILE: projects/Allwinner/filesystem/usr/share/alsa/cards/H3_Audio_Codec.conf ================================================ # # Configuration for H3 analog output # <confdir:pcm/front.conf> H3_Audio_Codec.pcm.front.0 { @args [ CARD ] @args.CARD { type string } type hooks slave.pcm { type hw card $CARD } hooks.0 { type ctl_elems hook_args [ { name "Line Out Playback Volume" lock true preserve true optional false value 31 } { name "Line Out Playback Switch" lock true preserve true optional false value [ on on ] } ] } } ================================================ FILE: projects/Allwinner/filesystem/usr/share/alsa/cards/simple-card.conf ================================================ # # Configuration for HDMI # <confdir:pcm/hdmi.conf> simple-card.pcm.hdmi."allwinner-hdmi" { @args [ CARD DEVICE AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.DEVICE { type integer } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type hooks slave.pcm { type hw card $CARD device $DEVICE } hooks.0 { type ctl_elems hook_args [ { interface PCM name "IEC958 Playback Default" lock true preserve true optional true value [ $AES0 $AES1 $AES2 $AES3 ] } ] } hint.device $DEVICE } simple-card.pcm.hdmi.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } @func refer name { @func concat strings [ "cards.simple-card.pcm.hdmi." { @func card_name card $CARD } ":CARD=" $CARD "," "DEVICE=0," "AES0=" $AES0 "," "AES1=" $AES1 "," "AES2=" $AES2 "," "AES3=" $AES3 ] } default { # point to non-existent device card $CARD device 999 hint.device 999 } } # # Configuration for SPDIF # <confdir:pcm/iec958.conf> simple-card.pcm.iec958."On-board SPDIF" "cards.simple-card.pcm.iec958.sun50i-h6-spdif" simple-card.pcm.iec958."sun50i-h6-spdif" { @args [ CARD DEVICE AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.DEVICE { type integer } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type hooks slave.pcm { type hw card $CARD device $DEVICE } hooks.0 { type ctl_elems hook_args [ { interface PCM name "IEC958 Playback Default" lock true preserve true optional true value [ $AES0 $AES1 $AES2 $AES3 ] } ] } hint.device $DEVICE } simple-card.pcm.iec958.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } @func refer name { @func concat strings [ "cards.simple-card.pcm.iec958." { @func card_name card $CARD } ":CARD=" $CARD "," "DEVICE=0," "AES0=" $AES0 "," "AES1=" $AES1 "," "AES2=" $AES2 "," "AES3=" $AES3 ] } default { # point to non-existent device card $CARD device 999 hint.device 999 } } ================================================ FILE: projects/Allwinner/filesystem/usr/share/alsa/cards/sun50i-a64-audi.conf ================================================ # # Configuration for A64 analog output # <confdir:pcm/front.conf> sun50i-a64-audi.pcm.front.0 { @args [ CARD ] @args.CARD { type string } type hooks slave.pcm { type hw card $CARD } hooks.0 { type ctl_elems hook_args [ { name "Line Out Playback Volume" lock true preserve true optional false value 31 } { name "Line Out Playback Switch" lock true preserve true optional false value [ on on ] } ] } } ================================================ FILE: projects/Allwinner/kodi/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8" ?> <settings version="1"> <section id="system"> <category id="display"> <group id="1"> <setting id="videoscreen.limitedrange"> <default>false</default> <visible>false</visible> </setting> <setting id="videoscreen.limitguisize"> <visible>false</visible> <default>3</default> </setting> </group> </category> <category id="audio"> <group id="1"> <setting id="audiooutput.audiodevice"> <default>ALSA:hdmi:CARD=allwinnerhdmi,DEV=0</default> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/Allwinner/linux/linux.aarch64.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm64 6.1.63 Kernel Configuration # CONFIG_CC_VERSION_TEXT="aarch64-none-elf-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION_AUTO=y CONFIG_BUILD_SALT="" CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_SYSVIPC_COMPAT=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_IRQ_FASTEOI_HIERARCHY_HANDLERS=y CONFIG_GENERIC_IRQ_IPI=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_IRQ_MSI_IOMMU=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_CONTEXT_TRACKING=y CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y # CONFIG_BPF_JIT_ALWAYS_ON is not set CONFIG_BPF_JIT_DEFAULT_ON=y # CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_BPF_PRELOAD is not set # end of BPF subsystem CONFIG_PREEMPT_BUILD=y # CONFIG_PREEMPT_NONE is not set # CONFIG_PREEMPT_VOLUNTARY is not set CONFIG_PREEMPT=y CONFIG_PREEMPT_COUNT=y CONFIG_PREEMPTION=y # CONFIG_PREEMPT_DYNAMIC is not set # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_SCHED_AVG_IRQ=y CONFIG_SCHED_THERMAL_PRESSURE=y CONFIG_BSD_PROCESS_ACCT=y CONFIG_BSD_PROCESS_ACCT_V3=y CONFIG_TASKSTATS=y CONFIG_TASK_DELAY_ACCT=y CONFIG_TASK_XACCT=y CONFIG_TASK_IO_ACCOUNTING=y # CONFIG_PSI is not set # end of CPU/Task time and stats accounting CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y CONFIG_PREEMPT_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_RCU=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=17 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 # CONFIG_PRINTK_INDEX is not set CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # # CONFIG_UCLAMP_TASK is not set # end of Scheduler features CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_CC_HAS_INT128=y CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set CONFIG_CGROUP_PIDS=y # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y # CONFIG_CGROUP_MISC is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_TIME_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_CHECKPOINT_RESTORE is not set CONFIG_SCHED_AUTOGROUP=y # CONFIG_SYSFS_DEPRECATED is not set # CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 # CONFIG_RD_GZIP is not set # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set CONFIG_RD_LZ4=y CONFIG_RD_ZSTD=y CONFIG_INITRAMFS_COMPRESSION_LZ4=y # CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_EXPERT=y CONFIG_UID16=y CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set # CONFIG_SYSFS_SYSCALL is not set CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y 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 CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set # CONFIG_EMBEDDED is not set CONFIG_HAVE_PERF_EVENTS=y # CONFIG_PC104 is not set # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_SYSTEM_DATA_VERIFICATION=y CONFIG_PROFILING=y # end of General setup CONFIG_ARM64=y CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_64BIT=y CONFIG_MMU=y CONFIG_ARM64_PAGE_SHIFT=12 CONFIG_ARM64_CONT_PTE_SHIFT=4 CONFIG_ARM64_CONT_PMD_SHIFT=4 CONFIG_ARCH_MMAP_RND_BITS_MIN=18 CONFIG_ARCH_MMAP_RND_BITS_MAX=33 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_NO_IOPORT_MAP=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_LOCKDEP_SUPPORT=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CSUM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y CONFIG_SMP=y CONFIG_KERNEL_MODE_NEON=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_PGTABLE_LEVELS=4 CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_ARCH_PROC_KCORE_TEXT=y # # Platform selection # # CONFIG_ARCH_ACTIONS is not set CONFIG_ARCH_SUNXI=y # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_APPLE is not set # CONFIG_ARCH_BCM is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_BITMAIN is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_SPARX5 is not set # CONFIG_ARCH_K3 is not set # CONFIG_ARCH_LG1K is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_KEEMBAY is not set # CONFIG_ARCH_MEDIATEK is not set # CONFIG_ARCH_MESON is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_NXP is not set # CONFIG_ARCH_NPCM is not set # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_REALTEK is not set # CONFIG_ARCH_RENESAS is not set # CONFIG_ARCH_ROCKCHIP is not set # CONFIG_ARCH_SEATTLE is not set # CONFIG_ARCH_INTEL_SOCFPGA is not set # CONFIG_ARCH_SYNQUACER is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_SPRD is not set # CONFIG_ARCH_THUNDER is not set # CONFIG_ARCH_THUNDER2 is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_VISCONTI is not set # CONFIG_ARCH_XGENE is not set # CONFIG_ARCH_ZYNQMP is not set # end of Platform selection # # Kernel Features # # # ARM errata workarounds via the alternatives framework # # CONFIG_AMPERE_ERRATUM_AC03_CPU_38 is not set CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y CONFIG_ARM64_ERRATUM_826319=y CONFIG_ARM64_ERRATUM_827319=y CONFIG_ARM64_ERRATUM_824069=y CONFIG_ARM64_ERRATUM_819472=y # CONFIG_ARM64_ERRATUM_832075 is not set # CONFIG_ARM64_ERRATUM_1742098 is not set CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y # CONFIG_ARM64_ERRATUM_1024718 is not set # CONFIG_ARM64_ERRATUM_1418040 is not set # CONFIG_ARM64_ERRATUM_1165522 is not set # CONFIG_ARM64_ERRATUM_1319367 is not set # CONFIG_ARM64_ERRATUM_1530923 is not set # CONFIG_ARM64_ERRATUM_2441007 is not set # CONFIG_ARM64_ERRATUM_1286807 is not set # CONFIG_ARM64_ERRATUM_1463225 is not set # CONFIG_ARM64_ERRATUM_1542419 is not set # CONFIG_ARM64_ERRATUM_1508412 is not set # CONFIG_ARM64_ERRATUM_2051678 is not set # CONFIG_ARM64_ERRATUM_2077057 is not set # CONFIG_ARM64_ERRATUM_2658417 is not set # CONFIG_ARM64_ERRATUM_2054223 is not set # CONFIG_ARM64_ERRATUM_2067961 is not set # CONFIG_ARM64_ERRATUM_2441009 is not set # CONFIG_ARM64_ERRATUM_2966298 is not set # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set # CONFIG_CAVIUM_ERRATUM_27456 is not set # CONFIG_CAVIUM_ERRATUM_30115 is not set # CONFIG_CAVIUM_TX2_ERRATUM_219 is not set # CONFIG_FUJITSU_ERRATUM_010001 is not set # CONFIG_HISILICON_ERRATUM_161600802 is not set # CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set # CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set # CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set # CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set # CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set # CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set # end of ARM errata workarounds via the alternatives framework CONFIG_ARM64_4K_PAGES=y # CONFIG_ARM64_16K_PAGES is not set # CONFIG_ARM64_64K_PAGES is not set # CONFIG_ARM64_VA_BITS_39 is not set CONFIG_ARM64_VA_BITS_48=y CONFIG_ARM64_VA_BITS=48 CONFIG_ARM64_PA_BITS_48=y CONFIG_ARM64_PA_BITS=48 # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_CPU_LITTLE_ENDIAN=y CONFIG_SCHED_MC=y # CONFIG_SCHED_CLUSTER is not set # CONFIG_SCHED_SMT is not set CONFIG_NR_CPUS=8 CONFIG_HOTPLUG_CPU=y # CONFIG_NUMA is not set # CONFIG_HZ_100 is not set CONFIG_HZ_250=y # CONFIG_HZ_300 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=250 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_HW_PERF_EVENTS=y CONFIG_CC_HAVE_SHADOW_CALL_STACK=y # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set CONFIG_KEXEC=y # CONFIG_KEXEC_FILE is not set CONFIG_CRASH_DUMP=y CONFIG_TRANS_TABLE=y # CONFIG_XEN is not set CONFIG_ARCH_FORCE_MAX_ORDER=11 CONFIG_UNMAP_KERNEL_AT_EL0=y CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y CONFIG_RODATA_FULL_DEFAULT_ENABLED=y # CONFIG_ARM64_SW_TTBR0_PAN is not set CONFIG_ARM64_TAGGED_ADDR_ABI=y CONFIG_COMPAT=y CONFIG_KUSER_HELPERS=y # CONFIG_COMPAT_ALIGNMENT_FIXUPS is not set # CONFIG_ARMV8_DEPRECATED is not set # # ARMv8.1 architectural features # # CONFIG_ARM64_HW_AFDBM is not set # CONFIG_ARM64_PAN is not set CONFIG_AS_HAS_LDAPR=y CONFIG_AS_HAS_LSE_ATOMICS=y # CONFIG_ARM64_USE_LSE_ATOMICS is not set # end of ARMv8.1 architectural features # # ARMv8.2 architectural features # CONFIG_AS_HAS_ARMV8_2=y CONFIG_AS_HAS_SHA3=y # CONFIG_ARM64_PMEM is not set # CONFIG_ARM64_RAS_EXTN is not set # CONFIG_ARM64_CNP is not set # end of ARMv8.2 architectural features # # ARMv8.3 architectural features # # CONFIG_ARM64_PTR_AUTH is not set CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y CONFIG_AS_HAS_PAC=y CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y # end of ARMv8.3 architectural features # # ARMv8.4 architectural features # # CONFIG_ARM64_AMU_EXTN is not set CONFIG_AS_HAS_ARMV8_4=y # CONFIG_ARM64_TLB_RANGE is not set # end of ARMv8.4 architectural features # # ARMv8.5 architectural features # CONFIG_AS_HAS_ARMV8_5=y # CONFIG_ARM64_BTI is not set CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y # CONFIG_ARM64_E0PD is not set CONFIG_ARM64_AS_HAS_MTE=y # end of ARMv8.5 architectural features # # ARMv8.7 architectural features # # end of ARMv8.7 architectural features CONFIG_ARM64_SVE=y CONFIG_ARM64_SME=y CONFIG_ARM64_MODULE_PLTS=y # CONFIG_ARM64_PSEUDO_NMI is not set CONFIG_RELOCATABLE=y # CONFIG_RANDOMIZE_BASE is not set CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y CONFIG_STACKPROTECTOR_PER_TASK=y CONFIG_ARCH_NR_GPIO=0 # end of Kernel Features # # Boot options # CONFIG_CMDLINE="" # CONFIG_EFI is not set # end of Boot options # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_SUSPEND_SKIP_SYNC is not set CONFIG_HIBERNATE_CALLBACKS=y CONFIG_HIBERNATION=y CONFIG_HIBERNATION_SNAPSHOT_DEV=y CONFIG_PM_STD_PARTITION="" CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_USERSPACE_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y # CONFIG_PM_DEBUG is not set CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y CONFIG_PM_GENERIC_DOMAINS_SLEEP=y CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_HIBERNATION_HEADER=y CONFIG_ARCH_SUSPEND_POSSIBLE=y # end of Power management options # # CPU Power Management # # # CPU Idle # 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 CONFIG_DT_IDLE_GENPD=y # # ARM CPU Idle Drivers # CONFIG_ARM_PSCI_CPUIDLE=y CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y # end of ARM CPU Idle Drivers # end of CPU Idle # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=m CONFIG_CPU_FREQ_GOV_USERSPACE=m CONFIG_CPU_FREQ_GOV_ONDEMAND=m CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y CONFIG_CPUFREQ_DT_PLATDEV=y CONFIG_ARM_ALLWINNER_SUN50I_CPUFREQ_NVMEM=y CONFIG_ARM_SCPI_CPUFREQ=y # end of CPU Frequency scaling # end of CPU Power Management CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set # # General architecture-dependent options # CONFIG_CRASH_CORE=y CONFIG_KEXEC_CORE=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_HAVE_IOREMAP_PROT=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_KEEPINITRD=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y CONFIG_MMU_GATHER_TABLE_FREE=y CONFIG_MMU_GATHER_RCU_TABLE_FREE=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y # CONFIG_SHADOW_CALL_STACK is not set CONFIG_ARCH_SUPPORTS_LTO_CLANG=y CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y CONFIG_LTO_NONE=y CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=18 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y CONFIG_RANDOMIZE_KSTACK_OFFSET=y # CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_COMPILER_H=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_HAS_RELR=y CONFIG_HAVE_PREEMPT_DYNAMIC=y CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y # CONFIG_GCC_PLUGINS is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_GZIP is not set # CONFIG_MODULE_COMPRESS_XZ is not set # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y # CONFIG_BLOCK_LEGACY_AUTOLOAD is not set CONFIG_BLK_CGROUP_RWSTAT=y CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y CONFIG_BLK_DEV_INTEGRITY=y CONFIG_BLK_DEV_INTEGRITY_T10=y # CONFIG_BLK_DEV_ZONED is not set CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_DEV_THROTTLING_LOW is not set # CONFIG_BLK_WBT is not set CONFIG_BLK_CGROUP_IOLATENCY=y # CONFIG_BLK_CGROUP_IOCOST is not set # CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # # CONFIG_PARTITION_ADVANCED is not set CONFIG_MSDOS_PARTITION=y CONFIG_EFI_PARTITION=y # end of Partition Types CONFIG_BLOCK_COMPAT=y CONFIG_BLK_PM=y CONFIG_BLOCK_HOLDER_DEPRECATED=y CONFIG_BLK_MQ_STACKING=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y # CONFIG_IOSCHED_BFQ is not set # end of IO Schedulers CONFIG_ASN1=y CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y CONFIG_QUEUED_SPINLOCKS=y CONFIG_ARCH_USE_QUEUED_RWLOCKS=y CONFIG_QUEUED_RWLOCKS=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ARCH_BINFMT_ELF_STATE=y CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y CONFIG_ARCH_HAVE_ELF_PROT=y CONFIG_ARCH_USE_GNU_PROPERTY=y CONFIG_ELFCORE=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set CONFIG_BINFMT_SCRIPT=y # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # CONFIG_SWAP=y # CONFIG_ZSWAP is not set # # SLAB allocator options # # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y # end of SLAB allocator options # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set # CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y CONFIG_ARCH_KEEP_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_EXCLUSIVE_SYSTEM_RAM=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_COMPACTION=y CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 # CONFIG_PAGE_REPORTING is not set CONFIG_MIGRATION=y CONFIG_ARCH_ENABLE_THP_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_KSM=y CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y CONFIG_MEMORY_FAILURE=y # CONFIG_HWPOISON_INJECT is not set CONFIG_ARCH_WANTS_THP_SWAP=y CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set CONFIG_THP_SWAP=y # CONFIG_READ_ONLY_THP_FOR_FS is not set CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set CONFIG_CMA_DEBUGFS=y CONFIG_CMA_SYSFS=y CONFIG_CMA_AREAS=7 CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y CONFIG_ARCH_HAS_ZONE_DMA_SET=y CONFIG_ZONE_DMA=y CONFIG_ZONE_DMA32=y CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y CONFIG_SECRETMEM=y # CONFIG_ANON_VMA_NAME is not set # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set CONFIG_LOCK_MM_AND_FIND_VMA=y # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y CONFIG_NET_INGRESS=y CONFIG_NET_EGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_INTERFACE is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_ESP=y # CONFIG_NET_KEY is not set # CONFIG_XDP_SOCKETS is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=y # CONFIG_IP_MROUTE is not set # CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set CONFIG_INET_ESP=y # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=y CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_INET_UDP_DIAG is not set # CONFIG_INET_RAW_DIAG is not set # CONFIG_INET_DIAG_DESTROY is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_IPV6_VTI is not set CONFIG_IPV6_SIT=y # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set CONFIG_IPV6_FOU=m # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set # CONFIG_NETLABEL is not set # CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NET_PTP_CLASSIFY=y # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_EGRESS=y CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_FAMILY_BRIDGE=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set # CONFIG_NETFILTER_NETLINK_LOG is not set # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=m CONFIG_NF_LOG_SYSLOG=m # CONFIG_NF_CONNTRACK_MARK is not set # CONFIG_NF_CONNTRACK_ZONES is not set CONFIG_NF_CONNTRACK_PROCFS=y CONFIG_NF_CONNTRACK_EVENTS=y # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set # CONFIG_NF_CONNTRACK_IRC is not set # CONFIG_NF_CONNTRACK_NETBIOS_NS is not set # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set # CONFIG_NF_CONNTRACK_SIP is not set CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m CONFIG_NF_NAT=m 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 CONFIG_NETFILTER_XTABLES_COMPAT=y # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set CONFIG_NETFILTER_XT_TARGET_LOG=m # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set CONFIG_NETFILTER_XT_MATCH_IPVS=m # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_NETFILTER_XT_MATCH_OWNER is not set # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set # CONFIG_NETFILTER_XT_MATCH_STATE is not set # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set CONFIG_IP_VS=m # CONFIG_IP_VS_IPV6 is not set # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # CONFIG_IP_VS_PROTO_ESP is not set # CONFIG_IP_VS_PROTO_AH is not set # CONFIG_IP_VS_PROTO_SCTP is not set # # IPVS scheduler # CONFIG_IP_VS_RR=m # CONFIG_IP_VS_WRR is not set # CONFIG_IP_VS_LC is not set # CONFIG_IP_VS_WLC is not set # CONFIG_IP_VS_FO is not set # CONFIG_IP_VS_OVF is not set # CONFIG_IP_VS_LBLC is not set # CONFIG_IP_VS_LBLCR is not set # CONFIG_IP_VS_DH is not set # CONFIG_IP_VS_SH is not set # CONFIG_IP_VS_MH is not set # CONFIG_IP_VS_SED is not set # CONFIG_IP_VS_NQ is not set # CONFIG_IP_VS_TWOS is not set # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS MH scheduler # CONFIG_IP_VS_MH_TAB_INDEX=12 # # IPVS application helper # # CONFIG_IP_VS_FTP is not set CONFIG_IP_VS_NFCT=y # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set CONFIG_NF_LOG_IPV4=m CONFIG_NF_REJECT_IPV4=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_SECURITY is not set # CONFIG_IP_NF_ARPTABLES is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m CONFIG_NF_LOG_IPV6=m CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_MATCH_SRH is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set # CONFIG_IP6_NF_SECURITY is not set CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m # CONFIG_IP6_NF_TARGET_NPT is not set # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_CONNTRACK_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y # CONFIG_BRIDGE_MRP is not set # CONFIG_BRIDGE_CFM is not set # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set # CONFIG_NET_SCH_FQ_CODEL is not set # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set # CONFIG_NET_SCH_DEFAULT is not set # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_FLOW is not set CONFIG_NET_CLS_CGROUP=m # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set CONFIG_NET_L3_MASTER_DEV=y # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_STREAM_PARSER is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # end of Network testing # end of Networking options # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=m CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y CONFIG_BT_BNEP=m CONFIG_BT_BNEP_MC_FILTER=y CONFIG_BT_BNEP_PROTO_FILTER=y CONFIG_BT_HIDP=m # CONFIG_BT_HS is not set CONFIG_BT_LE=y CONFIG_BT_LEDS=y # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set # CONFIG_BT_DEBUGFS is not set # CONFIG_BT_SELFTEST is not set # CONFIG_BT_FEATURE_DEBUG is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_QCA=m CONFIG_BT_MTK=m CONFIG_BT_HCIBTUSB=m # CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set CONFIG_BT_HCIBTUSB_BCM=y # CONFIG_BT_HCIBTUSB_MTK is not set CONFIG_BT_HCIBTUSB_RTL=y # CONFIG_BT_HCIBTSDIO is not set CONFIG_BT_HCIUART=m CONFIG_BT_HCIUART_SERDEV=y CONFIG_BT_HCIUART_H4=y CONFIG_BT_HCIUART_NOKIA=m 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_RTL=y CONFIG_BT_HCIUART_QCA=y CONFIG_BT_HCIUART_AG6XX=y CONFIG_BT_HCIUART_MRVL=y CONFIG_BT_HCIBCM203X=m CONFIG_BT_HCIBPA10X=m CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIVHCI=m CONFIG_BT_MRVL=m CONFIG_BT_MRVL_SDIO=m CONFIG_BT_ATH3K=m # CONFIG_BT_MTKSDIO is not set CONFIG_BT_MTKUART=m # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_SPY=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set CONFIG_CFG80211_CRDA_SUPPORT=y CONFIG_CFG80211_WEXT=y CONFIG_LIB80211=m CONFIG_LIB80211_CRYPT_WEP=m CONFIG_LIB80211_CRYPT_CCMP=m # CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=m CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_PAGE_POOL=y # CONFIG_PAGE_POOL_STATS is not set CONFIG_FAILOVER=y CONFIG_ETHTOOL_NETLINK=y # # Device Drivers # CONFIG_ARM_AMBA=y CONFIG_HAVE_PCI=y # CONFIG_PCI is not set # CONFIG_PCCARD is not set # # Generic Driver Options # # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y # CONFIG_DEVTMPFS_SAFE is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set CONFIG_FW_CACHE=y # CONFIG_FW_UPLOAD is not set # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y CONFIG_ALLOW_DEV_COREDUMP=y CONFIG_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_SOC_BUS=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set CONFIG_GENERIC_ARCH_TOPOLOGY=y # end of Generic Driver Options # # Bus devices # CONFIG_BRCMSTB_GISB_ARB=y # CONFIG_MOXTET is not set CONFIG_SUN50I_DE2_BUS=y CONFIG_SUNXI_RSB=y CONFIG_VEXPRESS_CONFIG=y # CONFIG_MHI_BUS is not set # CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # # CONFIG_ARM_SCMI_PROTOCOL is not set # end of ARM System Control and Management Interface Protocol CONFIG_ARM_SCPI_PROTOCOL=y CONFIG_ARM_SCPI_POWER_DOMAIN=y # CONFIG_FIRMWARE_MEMMAP is not set # CONFIG_ARM_FFA_TRANSPORT is not set # CONFIG_GOOGLE_FIRMWARE is not set CONFIG_ARM_PSCI_FW=y # CONFIG_ARM_PSCI_CHECKER is not set CONFIG_HAVE_ARM_SMCCC=y CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y CONFIG_ARM_SMCCC_SOC_ID=y # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set CONFIG_MTD=y # CONFIG_MTD_TESTS is not set # # Partition parsers # # CONFIG_MTD_AR7_PARTS is not set # CONFIG_MTD_CMDLINE_PARTS is not set CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AFS_PARTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set # end of Partition parsers # # User Modules And Translation Layers # CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y # # Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK. # # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # CONFIG_RFD_FTL is not set # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set # CONFIG_MTD_OOPS is not set # CONFIG_MTD_SWAP is not set # CONFIG_MTD_PARTITIONED_MASTER is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # end of RAM/ROM/Flash chip drivers # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_PLATRAM is not set # end of Mapping drivers for chip access # # Self-contained MTD device drivers # # CONFIG_MTD_DATAFLASH is not set # CONFIG_MTD_MCHP23K256 is not set # CONFIG_MTD_MCHP48L640 is not set # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLOCK2MTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOCG3 is not set # end of Self-contained MTD device drivers # # NAND # # CONFIG_MTD_ONENAND is not set # CONFIG_MTD_RAW_NAND is not set # CONFIG_MTD_SPI_NAND is not set # # ECC engine support # # CONFIG_MTD_NAND_ECC_SW_HAMMING is not set # CONFIG_MTD_NAND_ECC_SW_BCH is not set # CONFIG_MTD_NAND_ECC_MXIC is not set # end of ECC engine support # end of NAND # # LPDDR & LPDDR2 PCM memory drivers # # CONFIG_MTD_LPDDR is not set # end of LPDDR & LPDDR2 PCM memory drivers CONFIG_MTD_SPI_NOR=y CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y # CONFIG_MTD_SPI_NOR_SWP_DISABLE is not set CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y # CONFIG_MTD_SPI_NOR_SWP_KEEP is not set # CONFIG_MTD_UBI is not set # CONFIG_MTD_HYPERBUS is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_DYNAMIC=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_RESERVED_MEM=y CONFIG_OF_RESOLVE=y CONFIG_OF_OVERLAY=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_CDROM=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_DRBD is not set CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_RAM is not set # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_UBLK is not set # # NVME Support # # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set # CONFIG_NVME_TARGET is not set # end of NVME Support # # Misc devices # # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set CONFIG_SRAM=y # CONFIG_XILINX_SDFEC is not set # CONFIG_HISI_HIKEY_USB is not set # CONFIG_OPEN_DICE is not set # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set CONFIG_EEPROM_AT25=m # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # CONFIG_ECHO is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_UACCE is not set # CONFIG_PVPANIC is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=m CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set CONFIG_SCSI_CONSTANTS=y # CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_SCAN_ASYNC is not set # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set CONFIG_SCSI_SAS_ATTRS=y CONFIG_SCSI_SAS_LIBSAS=y CONFIG_SCSI_SAS_ATA=y CONFIG_SCSI_SAS_HOST_SMP=y # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set CONFIG_SCSI_HISI_SAS=y # CONFIG_SCSI_HISI_SAS_DEBUGFS_DEFAULT_ENABLE is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_DH is not set # end of SCSI device support CONFIG_ATA=y CONFIG_SATA_HOST=y CONFIG_ATA_VERBOSE_ERROR=y CONFIG_ATA_FORCE=y CONFIG_SATA_PMP=y # # Controllers with non-SFF native interface # CONFIG_SATA_AHCI_PLATFORM=y # CONFIG_AHCI_DWC is not set CONFIG_AHCI_CEVA=y # CONFIG_AHCI_SUNXI is not set CONFIG_AHCI_XGENE=y CONFIG_AHCI_QORIQ=y CONFIG_ATA_SFF=y # # SFF controllers with custom DMA interface # CONFIG_ATA_BMDMA=y # # SATA SFF controllers with BMDMA # # CONFIG_SATA_DWC is not set # # PATA SFF controllers with BMDMA # # # PIO-only SFF controllers # CONFIG_PATA_PLATFORM=y CONFIG_PATA_OF_PLATFORM=y # # Generic fallback / legacy drivers # CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=m # CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m # CONFIG_DM_UNSTRIPED is not set # CONFIG_DM_CRYPT is not set # CONFIG_DM_SNAPSHOT is not set CONFIG_DM_THIN_PROVISIONING=m # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_EBS is not set # CONFIG_DM_ERA is not set # CONFIG_DM_CLONE is not set # CONFIG_DM_MIRROR is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_DUST is not set # CONFIG_DM_UEVENT is not set # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_DM_INTEGRITY is not set # CONFIG_TARGET_CORE is not set CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set CONFIG_DUMMY=m CONFIG_WIREGUARD=m # CONFIG_WIREGUARD_DEBUG is not set # CONFIG_EQUALIZER is not set # 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 # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_AMT is not set # CONFIG_MACSEC is not set # CONFIG_NETCONSOLE is not set CONFIG_TUN=y CONFIG_TAP=m # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m CONFIG_NLMON=m CONFIG_ETHERNET=y CONFIG_NET_VENDOR_ALACRITECH=y CONFIG_NET_VENDOR_ALLWINNER=y # CONFIG_SUN4I_EMAC is not set # CONFIG_ALTERA_TSE is not set CONFIG_NET_VENDOR_AMAZON=y CONFIG_NET_VENDOR_AMD=y CONFIG_AMD_XGBE=y CONFIG_NET_VENDOR_AQUANTIA=y CONFIG_NET_VENDOR_ARC=y # CONFIG_NET_VENDOR_ASIX is not set CONFIG_NET_VENDOR_BROADCOM=y # CONFIG_B44 is not set # CONFIG_BCMGENET is not set # CONFIG_SYSTEMPORT is not set CONFIG_NET_VENDOR_CADENCE=y CONFIG_MACB=y CONFIG_MACB_USE_HWSTAMP=y CONFIG_NET_VENDOR_CAVIUM=y CONFIG_NET_VENDOR_CORTINA=y # CONFIG_GEMINI_ETHERNET is not set # CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_ENGLEDER is not set CONFIG_NET_VENDOR_EZCHIP=y # CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set # CONFIG_NET_VENDOR_FUNGIBLE is not set # CONFIG_NET_VENDOR_GOOGLE is not set CONFIG_NET_VENDOR_HISILICON=y CONFIG_HIX5HD2_GMAC=y # CONFIG_HISI_FEMAC is not set # CONFIG_HIP04_ETH is not set CONFIG_HNS_MDIO=y CONFIG_HNS=y CONFIG_HNS_DSAF=y CONFIG_HNS_ENET=y CONFIG_NET_VENDOR_HUAWEI=y CONFIG_NET_VENDOR_I825XX=y CONFIG_NET_VENDOR_INTEL=y # CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_NET_VENDOR_ADI is not set # CONFIG_NET_VENDOR_LITEX is not set CONFIG_NET_VENDOR_MARVELL=y CONFIG_MVMDIO=y CONFIG_NET_VENDOR_MELLANOX=y # CONFIG_MLXSW_CORE is not set # CONFIG_MLXFW is not set CONFIG_NET_VENDOR_MICREL=y # CONFIG_KS8842 is not set # CONFIG_KS8851 is not set # CONFIG_KS8851_MLL is not set CONFIG_NET_VENDOR_MICROCHIP=y # CONFIG_ENC28J60 is not set # CONFIG_ENCX24J600 is not set CONFIG_NET_VENDOR_MICROSEMI=y # CONFIG_NET_VENDOR_MICROSOFT is not set CONFIG_NET_VENDOR_NI=y # CONFIG_NI_XGE_MANAGEMENT_ENET is not set CONFIG_NET_VENDOR_NATSEMI=y CONFIG_NET_VENDOR_NETRONOME=y CONFIG_NET_VENDOR_8390=y # CONFIG_ETHOC is not set # CONFIG_NET_VENDOR_PENSANDO is not set CONFIG_NET_VENDOR_QUALCOMM=y # CONFIG_QCA7000_SPI is not set # CONFIG_QCA7000_UART is not set CONFIG_QCOM_EMAC=m # CONFIG_RMNET is not set CONFIG_NET_VENDOR_RENESAS=y CONFIG_NET_VENDOR_ROCKER=y CONFIG_NET_VENDOR_SAMSUNG=y # CONFIG_SXGBE_ETH is not set CONFIG_NET_VENDOR_SEEQ=y CONFIG_NET_VENDOR_SOLARFLARE=y CONFIG_NET_VENDOR_SMSC=y CONFIG_SMC91X=y CONFIG_SMSC911X=y CONFIG_NET_VENDOR_SOCIONEXT=y CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=y # CONFIG_STMMAC_SELFTESTS is not set CONFIG_STMMAC_PLATFORM=y # CONFIG_DWMAC_DWC_QOS_ETH is not set CONFIG_DWMAC_GENERIC=y CONFIG_DWMAC_SUNXI=m CONFIG_DWMAC_SUN8I=m # CONFIG_DWMAC_INTEL_PLAT is not set CONFIG_NET_VENDOR_SYNOPSYS=y # CONFIG_DWC_XLGMAC is not set # CONFIG_NET_VENDOR_VERTEXCOM is not set CONFIG_NET_VENDOR_VIA=y # CONFIG_VIA_VELOCITY is not set CONFIG_NET_VENDOR_WIZNET=y # CONFIG_WIZNET_W5100 is not set # CONFIG_WIZNET_W5300 is not set # CONFIG_NET_VENDOR_XILINX is not set CONFIG_PHYLINK=y CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_SFP is not set # # MII PHY device drivers # CONFIG_AC200_PHY=y # CONFIG_AMD_PHY is not set # CONFIG_ADIN_PHY is not set # CONFIG_ADIN1100_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=m # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM54140_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set CONFIG_MARVELL_PHY=m CONFIG_MARVELL_10G_PHY=m # CONFIG_MARVELL_88X2222_PHY is not set # CONFIG_MAXLINEAR_GPHY is not set # CONFIG_MEDIATEK_GE_PHY is not set CONFIG_MICREL_PHY=y CONFIG_MICROCHIP_PHY=m # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set CONFIG_MOTORCOMM_PHY=y # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set CONFIG_AT803X_PHY=m # CONFIG_QSEMI_PHY is not set CONFIG_REALTEK_PHY=y # CONFIG_RENESAS_PHY is not set CONFIG_ROCKCHIP_PHY=y CONFIG_SMSC_PHY=m # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_DP83TD510_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set # CONFIG_PSE_CONTROLLER is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_OF_MDIO=y CONFIG_MDIO_DEVRES=y # CONFIG_MDIO_SUN4I is not set CONFIG_MDIO_BITBANG=y # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MDIO_GPIO is not set # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_OCTEON is not set # CONFIG_MDIO_IPQ4019 is not set # CONFIG_MDIO_IPQ8064 is not set # # MDIO Multiplexers # CONFIG_MDIO_BUS_MUX=y # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set CONFIG_MDIO_BUS_MUX_MMIOREG=y # # PCS device drivers # CONFIG_PCS_XPCS=y # end of PCS device drivers # CONFIG_PPP is not set # CONFIG_SLIP is not set CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set CONFIG_USB_PEGASUS=m CONFIG_USB_RTL8150=m CONFIG_USB_RTL8152=m CONFIG_USB_LAN78XX=m CONFIG_USB_USBNET=m CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m # CONFIG_USB_NET_CDC_EEM is not set CONFIG_USB_NET_CDC_NCM=m # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set CONFIG_USB_NET_DM9601=m # CONFIG_USB_NET_SR9700 is not set CONFIG_USB_NET_SR9800=m CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=m # CONFIG_USB_NET_GL620A is not set CONFIG_USB_NET_NET1080=m CONFIG_USB_NET_PLUSB=m CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m CONFIG_USB_NET_CDC_SUBSET_ENABLE=m CONFIG_USB_NET_CDC_SUBSET=m # CONFIG_USB_ALI_M5632 is not set # CONFIG_USB_AN2720 is not set CONFIG_USB_BELKIN=y CONFIG_USB_ARMLINUX=y # CONFIG_USB_EPSON2888 is not set # CONFIG_USB_KC2190 is not set CONFIG_USB_NET_ZAURUS=m # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set # CONFIG_USB_HSO is not set # CONFIG_USB_NET_INT51X1 is not set # CONFIG_USB_IPHETH is not set # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y # CONFIG_ATH9K is not set CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y # CONFIG_CARL9170_HWRNG is not set CONFIG_ATH6KL=m # CONFIG_ATH6KL_SDIO is not set CONFIG_ATH6KL_USB=m # CONFIG_ATH6KL_DEBUG is not set CONFIG_AR5523=m CONFIG_ATH10K=m CONFIG_ATH10K_CE=y # CONFIG_ATH10K_SDIO is not set CONFIG_ATH10K_USB=m # CONFIG_ATH10K_DEBUG is not set # CONFIG_ATH10K_DEBUGFS is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set CONFIG_WLAN_VENDOR_ATMEL=y CONFIG_AT76C50X_USB=m CONFIG_WLAN_VENDOR_BROADCOM=y # CONFIG_B43 is not set # CONFIG_B43LEGACY is not set CONFIG_BRCMUTIL=m # CONFIG_BRCMSMAC is not set CONFIG_BRCMFMAC=m CONFIG_BRCMFMAC_PROTO_BCDC=y CONFIG_BRCMFMAC_SDIO=y CONFIG_BRCMFMAC_USB=y # CONFIG_BRCM_TRACING is not set # CONFIG_BRCMDBG is not set CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_HOSTAP is not set # CONFIG_P54_COMMON is not set CONFIG_WLAN_VENDOR_MARVELL=y CONFIG_LIBERTAS=m CONFIG_LIBERTAS_USB=m # CONFIG_LIBERTAS_SDIO is not set # CONFIG_LIBERTAS_SPI is not set # CONFIG_LIBERTAS_DEBUG is not set # CONFIG_LIBERTAS_MESH is not set CONFIG_LIBERTAS_THINFIRM=m # CONFIG_LIBERTAS_THINFIRM_DEBUG is not set CONFIG_LIBERTAS_THINFIRM_USB=m CONFIG_MWIFIEX=m CONFIG_MWIFIEX_SDIO=m CONFIG_MWIFIEX_USB=m CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m CONFIG_MT76_CORE=m CONFIG_MT76_LEDS=y CONFIG_MT76_USB=m CONFIG_MT76x02_LIB=m CONFIG_MT76x02_USB=m CONFIG_MT76_CONNAC_LIB=m CONFIG_MT76x0_COMMON=m CONFIG_MT76x0U=m CONFIG_MT76x2_COMMON=m CONFIG_MT76x2U=m CONFIG_MT7615_COMMON=m CONFIG_MT7663_USB_SDIO_COMMON=m CONFIG_MT7663U=m # CONFIG_MT7663S is not set # CONFIG_MT7921S is not set # CONFIG_MT7921U is not set # CONFIG_WLAN_VENDOR_MICROCHIP is not set # CONFIG_WLAN_VENDOR_PURELIFI is not set CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WLAN_VENDOR_REALTEK=y CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y CONFIG_RTL_CARDS=m # CONFIG_RTL8192CU is not set CONFIG_RTL8XXXU=m CONFIG_RTL8XXXU_UNTESTED=y CONFIG_RTW88=m CONFIG_RTW88_CORE=m CONFIG_RTW88_SDIO=m CONFIG_RTW88_USB=m CONFIG_RTW88_8822B=m CONFIG_RTW88_8822C=m CONFIG_RTW88_8723D=m CONFIG_RTW88_8821C=m CONFIG_RTW88_8822BS=m CONFIG_RTW88_8822BU=m CONFIG_RTW88_8822CS=m CONFIG_RTW88_8822CU=m CONFIG_RTW88_8723DU=m CONFIG_RTW88_8821CS=m CONFIG_RTW88_8821CU=m # CONFIG_RTW88_DEBUG is not set # CONFIG_RTW88_DEBUGFS is not set # CONFIG_RTW89 is not set # CONFIG_WLAN_VENDOR_RSI is not set # CONFIG_WLAN_VENDOR_SILABS is not set # CONFIG_WLAN_VENDOR_ST is not set # CONFIG_WLAN_VENDOR_TI is not set CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_USB_ZD1201=m CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set # CONFIG_WLAN_VENDOR_QUANTENNA is not set # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN # CONFIG_NETDEVSIM is not set CONFIG_NET_FAILOVER=y # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_SPARSEKMAP is not set CONFIG_INPUT_MATRIXKMAP=y CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces # # CONFIG_INPUT_MOUSEDEV is not set CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_ADC=m # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=y CONFIG_KEYBOARD_GPIO_POLLED=y # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_PINEPHONE is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_SUN4I_LRADC is not set # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set # CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADC is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set # CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y # CONFIG_JOYSTICK_PSXPAD_SPI is not set # CONFIG_JOYSTICK_PXRC is not set # CONFIG_JOYSTICK_QWIIC is not set # CONFIG_JOYSTICK_FSIA6B is not set # CONFIG_JOYSTICK_SENSEHAT is not set # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y # CONFIG_TOUCHSCREEN_ADS7846 is not set # CONFIG_TOUCHSCREEN_AD7877 is not set # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_ADC is not set # CONFIG_TOUCHSCREEN_AR1021_I2C is not set CONFIG_TOUCHSCREEN_ATMEL_MXT=m # CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_BU21029 is not set # CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set # CONFIG_TOUCHSCREEN_CY8CTMA140 is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set # CONFIG_TOUCHSCREEN_EGALAX is not set # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set # CONFIG_TOUCHSCREEN_EXC3000 is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_HIDEEP is not set # CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_ILITEK is not set # CONFIG_TOUCHSCREEN_S6SY761 is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set # CONFIG_TOUCHSCREEN_ELAN is not set # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MSG2638 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_IMAGIS is not set # CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set # CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2004 is not set # CONFIG_TOUCHSCREEN_TSC2005 is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_RM_TS is not set # CONFIG_TOUCHSCREEN_SILEAD is not set # CONFIG_TOUCHSCREEN_SIS_I2C is not set # CONFIG_TOUCHSCREEN_ST1232 is not set # CONFIG_TOUCHSCREEN_STMFTS is not set # CONFIG_TOUCHSCREEN_SUN4I is not set # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set # CONFIG_TOUCHSCREEN_SX8654 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZET6223 is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set # CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_IQS5XX is not set # CONFIG_TOUCHSCREEN_ZINITIX is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_AXP20X_PEK=y CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set # CONFIG_INPUT_RK805_PWRKEY is not set # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IBM_PANEL is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set CONFIG_RMI4_CORE=m # CONFIG_RMI4_I2C is not set # CONFIG_RMI4_SPI is not set # CONFIG_RMI4_SMB is not set CONFIG_RMI4_F03=y CONFIG_RMI4_F03_SERIO=m CONFIG_RMI4_2D_SENSOR=y CONFIG_RMI4_F11=y CONFIG_RMI4_F12=y CONFIG_RMI4_F30=y # CONFIG_RMI4_F34 is not set # CONFIG_RMI4_F3A is not set # CONFIG_RMI4_F54 is not set # CONFIG_RMI4_F55 is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_SERIO_SERPORT=m CONFIG_SERIO_AMBAKMI=y CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_SERIO_SUN4I_PS2 is not set # CONFIG_SERIO_GPIO_PS2 is not set # CONFIG_USERIO is not set # CONFIG_GAMEPORT is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=16 CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y CONFIG_SERIAL_8250_16550A_VARIANTS=y # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_DMA=y CONFIG_SERIAL_8250_NR_UARTS=4 CONFIG_SERIAL_8250_RUNTIME_UARTS=4 CONFIG_SERIAL_8250_EXTENDED=y # CONFIG_SERIAL_8250_MANY_PORTS is not set CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_RSA is not set CONFIG_SERIAL_8250_DWLIB=y CONFIG_SERIAL_8250_FSL=y CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set CONFIG_SERIAL_OF_PLATFORM=y # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_SIFIVE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set CONFIG_SERIAL_XILINX_PS_UART=y CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_NULL_TTY is not set # CONFIG_HVC_DCC is not set # CONFIG_RPMSG_TTY is not set CONFIG_SERIAL_DEV_BUS=y CONFIG_SERIAL_DEV_CTRL_TTYPORT=y # CONFIG_TTY_PRINTK is not set # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set # CONFIG_IPMB_DEVICE_INTERFACE is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_BA431 is not set # CONFIG_HW_RANDOM_CCTRNG is not set # CONFIG_HW_RANDOM_XIPHERA is not set CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=m CONFIG_DEVMEM=y CONFIG_TCG_TPM=y CONFIG_HW_RANDOM_TPM=y # CONFIG_TCG_TIS is not set # CONFIG_TCG_TIS_SPI is not set # CONFIG_TCG_TIS_I2C is not set # CONFIG_TCG_TIS_I2C_CR50 is not set # CONFIG_TCG_TIS_I2C_ATMEL is not set CONFIG_TCG_TIS_I2C_INFINEON=y # CONFIG_TCG_TIS_I2C_NUVOTON is not set # CONFIG_TCG_VTPM_PROXY is not set # CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TCG_TIS_ST33ZP24_SPI is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_GPMUX is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set CONFIG_I2C_MUX_PCA954x=y # CONFIG_I2C_MUX_PINCTRL is not set # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_DEMUX_PINCTRL is not set # CONFIG_I2C_MUX_MLXCPLD is not set # end of Multiplexer I2C Chip support CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CADENCE is not set # CONFIG_I2C_CBUS_GPIO is not set CONFIG_I2C_DESIGNWARE_CORE=y # CONFIG_I2C_DESIGNWARE_SLAVE is not set CONFIG_I2C_DESIGNWARE_PLATFORM=y # CONFIG_I2C_EMEV2 is not set # CONFIG_I2C_GPIO is not set CONFIG_I2C_MV64XXX=y # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set CONFIG_I2C_RK3X=y # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set CONFIG_I2C_SLAVE=y # CONFIG_I2C_SLAVE_EEPROM is not set # CONFIG_I2C_SLAVE_TESTUNIT is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y CONFIG_SPI_MEM=y # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set # CONFIG_SPI_BITBANG is not set # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_CADENCE_QUADSPI is not set # CONFIG_SPI_CADENCE_XSPI 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_MICROCHIP_CORE is not set # CONFIG_SPI_MICROCHIP_CORE_QSPI 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=y # CONFIG_SPI_MXIC is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_AMD is not set # # SPI Multiplexer support # # CONFIG_SPI_MUX is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=m # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set CONFIG_SPI_DYNAMIC=y # CONFIG_SPMI is not set # CONFIG_HSI is not set CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # CONFIG_PTP_1588_CLOCK_KVM=y # CONFIG_PTP_1588_CLOCK_IDT82P33 is not set # CONFIG_PTP_1588_CLOCK_IDTCM is not set # end of PTP clock support CONFIG_PINCTRL=y CONFIG_GENERIC_PINCTRL_GROUPS=y CONFIG_PINMUX=y CONFIG_GENERIC_PINMUX_FUNCTIONS=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set CONFIG_PINCTRL_AXP209=y # CONFIG_PINCTRL_CY8C95X0 is not set CONFIG_PINCTRL_MAX77620=y # CONFIG_PINCTRL_MCP23S08 is not set # CONFIG_PINCTRL_MICROCHIP_SGPIO is not set # CONFIG_PINCTRL_OCELOT is not set # CONFIG_PINCTRL_RK805 is not set CONFIG_PINCTRL_SINGLE=y # CONFIG_PINCTRL_STMFX is not set # CONFIG_PINCTRL_SX150X is not set # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers CONFIG_PINCTRL_SUNXI=y # CONFIG_PINCTRL_SUN4I_A10 is not set # CONFIG_PINCTRL_SUN5I is not set # CONFIG_PINCTRL_SUN6I_A31 is not set # CONFIG_PINCTRL_SUN6I_A31_R is not set # CONFIG_PINCTRL_SUN8I_A23 is not set # CONFIG_PINCTRL_SUN8I_A33 is not set # CONFIG_PINCTRL_SUN8I_A83T is not set # CONFIG_PINCTRL_SUN8I_A83T_R is not set # CONFIG_PINCTRL_SUN8I_A23_R is not set # CONFIG_PINCTRL_SUN8I_H3 is not set CONFIG_PINCTRL_SUN8I_H3_R=y # CONFIG_PINCTRL_SUN8I_V3S is not set # CONFIG_PINCTRL_SUN9I_A80 is not set # CONFIG_PINCTRL_SUN9I_A80_R is not set # CONFIG_PINCTRL_SUN20I_D1 is not set CONFIG_PINCTRL_SUN50I_A64=y CONFIG_PINCTRL_SUN50I_A64_R=y # CONFIG_PINCTRL_SUN50I_A100 is not set # CONFIG_PINCTRL_SUN50I_A100_R is not set CONFIG_PINCTRL_SUN50I_H5=y CONFIG_PINCTRL_SUN50I_H6=y CONFIG_PINCTRL_SUN50I_H6_R=y CONFIG_PINCTRL_SUN50I_H616=y CONFIG_PINCTRL_SUN50I_H616_R=y CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y CONFIG_GPIO_CDEV=y CONFIG_GPIO_CDEV_V1=y CONFIG_GPIO_GENERIC=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_CADENCE is not set CONFIG_GPIO_DWAPB=y # CONFIG_GPIO_FTGPIO010 is not set CONFIG_GPIO_GENERIC_PLATFORM=y # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HLWD is not set # CONFIG_GPIO_LOGICVC is not set CONFIG_GPIO_MB86S7X=y CONFIG_GPIO_PL061=y # CONFIG_GPIO_SIFIVE is not set # CONFIG_GPIO_SYSCON is not set CONFIG_GPIO_XGENE=y # CONFIG_GPIO_XILINX is not set # CONFIG_GPIO_AMD_FCH is not set # end of Memory mapped GPIO drivers # # I2C GPIO expanders # # 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 CONFIG_GPIO_PCA953X_IRQ=y # CONFIG_GPIO_PCA9570 is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # CONFIG_GPIO_MAX77620=y # end of MFD GPIO expanders # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # end of SPI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers # CONFIG_W1 is not set CONFIG_POWER_RESET=y CONFIG_POWER_RESET_BRCMSTB=y # CONFIG_POWER_RESET_GPIO is not set # CONFIG_POWER_RESET_GPIO_RESTART is not set # CONFIG_POWER_RESET_LTC2952 is not set CONFIG_POWER_RESET_REGULATOR=y # CONFIG_POWER_RESET_RESTART is not set CONFIG_POWER_RESET_VEXPRESS=y CONFIG_POWER_RESET_XGENE=y CONFIG_POWER_RESET_SYSCON=y # CONFIG_POWER_RESET_SYSCON_POWEROFF is not set CONFIG_REBOOT_MODE=y CONFIG_SYSCON_REBOOT_MODE=y # CONFIG_NVMEM_REBOOT_MODE is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SAMSUNG_SDI is not set CONFIG_BATTERY_SBS=m # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set CONFIG_BATTERY_BQ27XXX=y CONFIG_BATTERY_BQ27XXX_I2C=y # CONFIG_BATTERY_BQ27XXX_DT_UPDATES_NVM is not set CONFIG_AXP20X_POWER=y # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set # CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_RK817 is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_UCS1002 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set CONFIG_SENSORS_ARM_SCPI=y # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DRIVETEMP is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_GPIO_FAN is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IIO_HWMON is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX31730 is not set # CONFIG_SENSORS_MAX31760 is not set # CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set CONFIG_SENSORS_LM90=m # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_NZXT_KRAKEN2 is not set # CONFIG_SENSORS_NZXT_SMART2 is not set # CONFIG_SENSORS_OCC_P8_I2C is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set # CONFIG_SENSORS_PWM_FAN is not set # CONFIG_SENSORS_SBTSI is not set # CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set CONFIG_SENSORS_INA2XX=m # CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VEXPRESS is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y # CONFIG_THERMAL_WRITABLE_TRIPS is not set CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set CONFIG_CPU_THERMAL=y CONFIG_CPU_FREQ_THERMAL=y # CONFIG_DEVFREQ_THERMAL is not set CONFIG_THERMAL_EMULATION=y # CONFIG_THERMAL_MMIO is not set # CONFIG_MAX77620_THERMAL is not set CONFIG_SUN8I_THERMAL=y # CONFIG_GENERIC_ADC_THERMAL is not set CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 # CONFIG_WATCHDOG_SYSFS is not set # CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set 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=y # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_MAX77620_WATCHDOG is not set # CONFIG_ARM_SMC_WATCHDOG is not set # CONFIG_MEN_A21_WDT is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y # CONFIG_SSB is not set CONFIG_BCMA_POSSIBLE=y # CONFIG_BCMA is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_SUN4I_GPADC is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AC100 is not set CONFIG_MFD_AC200=y CONFIG_MFD_AXP20X=y CONFIG_MFD_AXP20X_I2C=y CONFIG_MFD_AXP20X_RSB=y # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_GATEWORKS_GSC is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set CONFIG_MFD_HI6421_PMIC=y # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set CONFIG_MFD_MAX77620=y # CONFIG_MFD_MAX77650 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77714 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_OCELOT is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_CPCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_NTXEC is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set CONFIG_MFD_RK808=y # CONFIG_MFD_RN5T618 is not set CONFIG_MFD_SEC_CORE=y # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_STMPE is not set # CONFIG_MFD_SUN6I_PRCM is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set CONFIG_MFD_WL1273_CORE=m # 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 # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ROHM_BD718XX is not set # CONFIG_MFD_ROHM_BD71828 is not set # CONFIG_MFD_ROHM_BD957XMUF is not set # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_MFD_QCOM_PM8008 is not set CONFIG_MFD_VEXPRESS_SYSREG=y # CONFIG_RAVE_SP_CORE is not set # CONFIG_MFD_INTEL_M10_BMC is not set # CONFIG_MFD_RSMU_I2C is not set # CONFIG_MFD_RSMU_SPI is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set CONFIG_REGULATOR_AXP20X=y # CONFIG_REGULATOR_DA9121 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set CONFIG_REGULATOR_FAN53555=y # CONFIG_REGULATOR_FAN53880 is not set CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_HI6421 is not set CONFIG_REGULATOR_HI6421V530=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set CONFIG_REGULATOR_MAX77620=y # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MAX20086 is not set # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MCP16502 is not set # CONFIG_REGULATOR_MP5416 is not set # CONFIG_REGULATOR_MP8859 is not set # CONFIG_REGULATOR_MP886X is not set # CONFIG_REGULATOR_MPQ7920 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PF8X00 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set CONFIG_REGULATOR_PWM=y # CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set CONFIG_REGULATOR_RK808=y # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set # CONFIG_REGULATOR_S2MPA01 is not set CONFIG_REGULATOR_S2MPS11=y # CONFIG_REGULATOR_S5M8767 is not set # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_SY8106A is not set # CONFIG_REGULATOR_SY8824X is not set # CONFIG_REGULATOR_SY8827N is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS6286X is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set CONFIG_REGULATOR_VCTRL=m # CONFIG_REGULATOR_VEXPRESS is not set CONFIG_RC_CORE=y CONFIG_BPF_LIRC_MODE2=y CONFIG_LIRC=y CONFIG_RC_MAP=y CONFIG_RC_DECODERS=y CONFIG_IR_IMON_DECODER=y CONFIG_IR_JVC_DECODER=y CONFIG_IR_MCE_KBD_DECODER=y CONFIG_IR_NEC_DECODER=y CONFIG_IR_RC5_DECODER=y CONFIG_IR_RC6_DECODER=y CONFIG_IR_RCMM_DECODER=y CONFIG_IR_SANYO_DECODER=y CONFIG_IR_SHARP_DECODER=y CONFIG_IR_SONY_DECODER=y CONFIG_IR_XMP_DECODER=y CONFIG_RC_DEVICES=y CONFIG_IR_GPIO_CIR=m CONFIG_IR_GPIO_TX=m # CONFIG_IR_HIX5HD2 is not set CONFIG_IR_IGORPLUGUSB=m CONFIG_IR_IGUANA=m CONFIG_IR_IMON=m CONFIG_IR_IMON_RAW=m CONFIG_IR_MCEUSB=m # CONFIG_IR_PWM_TX is not set CONFIG_IR_REDRAT3=m # CONFIG_IR_SERIAL is not set # CONFIG_IR_SPI is not set CONFIG_IR_STREAMZAP=m CONFIG_IR_SUNXI=m CONFIG_IR_TOY=m CONFIG_IR_TTUSBIR=m CONFIG_RC_ATI_REMOTE=m # CONFIG_RC_LOOPBACK is not set CONFIG_RC_XBOX_DVD=y CONFIG_CEC_CORE=y CONFIG_CEC_NOTIFIER=y CONFIG_CEC_PIN=y # # CEC support # # CONFIG_MEDIA_CEC_RC is not set # CONFIG_CEC_PIN_ERROR_INJ is not set CONFIG_MEDIA_CEC_SUPPORT=y # CONFIG_CEC_CH7322 is not set # CONFIG_CEC_GPIO is not set CONFIG_USB_PULSE8_CEC=m CONFIG_USB_RAINSHADOW_CEC=m # end of CEC support CONFIG_MEDIA_SUPPORT=y CONFIG_MEDIA_SUPPORT_FILTER=y CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y CONFIG_MEDIA_RADIO_SUPPORT=y # CONFIG_MEDIA_SDR_SUPPORT is not set CONFIG_MEDIA_PLATFORM_SUPPORT=y # CONFIG_MEDIA_TEST_SUPPORT is not set # end of Media device types CONFIG_VIDEO_DEV=y CONFIG_MEDIA_CONTROLLER=y CONFIG_DVB_CORE=y # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y CONFIG_VIDEO_V4L2_SUBDEV_API=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_VIDEO_TUNER=m CONFIG_V4L2_H264=m CONFIG_V4L2_VP9=m CONFIG_V4L2_MEM2MEM_DEV=y CONFIG_V4L2_FWNODE=y CONFIG_V4L2_ASYNC=y CONFIG_VIDEOBUF_GEN=m CONFIG_VIDEOBUF_VMALLOC=m # end of Video4Linux options # # Media controller options # CONFIG_MEDIA_CONTROLLER_DVB=y CONFIG_MEDIA_CONTROLLER_REQUEST_API=y # end of Media controller options # # Digital TV options # # CONFIG_DVB_MMAP is not set CONFIG_DVB_NET=y CONFIG_DVB_MAX_ADAPTERS=16 # CONFIG_DVB_DYNAMIC_MINORS is not set # CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set # CONFIG_DVB_ULE_DEBUG is not set # end of Digital TV options # # Media drivers # # # Drivers filtered as selected at 'Filter media drivers' # # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_USB_S2255 is not set # CONFIG_VIDEO_USBTV is not set CONFIG_USB_VIDEO_CLASS=m # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set # # Analog TV USB devices # CONFIG_VIDEO_GO7007=m CONFIG_VIDEO_GO7007_USB=m CONFIG_VIDEO_GO7007_LOADER=m CONFIG_VIDEO_GO7007_USB_S2250_BOARD=m CONFIG_VIDEO_HDPVR=m CONFIG_VIDEO_PVRUSB2=m CONFIG_VIDEO_PVRUSB2_SYSFS=y CONFIG_VIDEO_PVRUSB2_DVB=y # CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set CONFIG_VIDEO_STK1160_COMMON=m CONFIG_VIDEO_STK1160=m # # Analog/digital TV USB devices # CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_AU0828_V4L2=y CONFIG_VIDEO_AU0828_RC=y CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y CONFIG_VIDEO_CX231XX_ALSA=m CONFIG_VIDEO_CX231XX_DVB=m # # Digital TV USB devices # CONFIG_DVB_AS102=m CONFIG_DVB_B2C2_FLEXCOP_USB=m # CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set CONFIG_DVB_USB_V2=m CONFIG_DVB_USB_AF9015=m CONFIG_DVB_USB_AF9035=m CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_AZ6007=m CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_DVBSKY=m CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_GL861=m CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m CONFIG_DVB_USB_ZD1301=m CONFIG_DVB_USB=m # CONFIG_DVB_USB_DEBUG is not set CONFIG_DVB_USB_A800=m CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_CXUSB=m CONFIG_DVB_USB_CXUSB_ANALOG=y CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_DIB3000MC=m CONFIG_DVB_USB_DIBUSB_MB=m CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y CONFIG_DVB_USB_DIBUSB_MC=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_DTT200U=m CONFIG_DVB_USB_DTV5100=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_GP8PSK=m CONFIG_DVB_USB_M920X=m CONFIG_DVB_USB_NOVA_T_USB2=m CONFIG_DVB_USB_OPERA1=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_TTUSB2=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_VP7045=m CONFIG_SMS_USB_DRV=m # # Webcam, TV (analog/digital) USB devices # CONFIG_VIDEO_EM28XX=m CONFIG_VIDEO_EM28XX_V4L2=m CONFIG_VIDEO_EM28XX_ALSA=m CONFIG_VIDEO_EM28XX_DVB=m CONFIG_VIDEO_EM28XX_RC=m CONFIG_RADIO_ADAPTERS=y CONFIG_RADIO_SAA7706H=m CONFIG_RADIO_SHARK=m CONFIG_RADIO_SHARK2=m CONFIG_RADIO_SI4713=m CONFIG_RADIO_TEA575X=m CONFIG_RADIO_TEA5764=m CONFIG_RADIO_TEF6862=m CONFIG_RADIO_WL1273=m CONFIG_USB_DSBR=m CONFIG_USB_KEENE=m CONFIG_USB_MA901=m CONFIG_USB_MR800=m CONFIG_USB_RAREMONO=m CONFIG_RADIO_SI470X=m CONFIG_USB_SI470X=m CONFIG_I2C_SI470X=m CONFIG_USB_SI4713=m CONFIG_PLATFORM_SI4713=m CONFIG_I2C_SI4713=m CONFIG_MEDIA_PLATFORM_DRIVERS=y # CONFIG_V4L_PLATFORM_DRIVERS is not set CONFIG_DVB_PLATFORM_DRIVERS=y CONFIG_V4L_MEM2MEM_DRIVERS=y # CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set # # Allegro DVT media platform drivers # # # Amlogic media platform drivers # # # Amphion drivers # # # Aspeed media platform drivers # # # Atmel media platform drivers # # # Cadence media platform drivers # # CONFIG_VIDEO_CADENCE_CSI2RX is not set # CONFIG_VIDEO_CADENCE_CSI2TX is not set # # Chips&Media media platform drivers # # # Intel media platform drivers # # # Marvell media platform drivers # # # Mediatek media platform drivers # # # NVidia media platform drivers # # # NXP media platform drivers # # # Qualcomm media platform drivers # # # Renesas media platform drivers # # # Rockchip media platform drivers # # # Samsung media platform drivers # # # STMicroelectronics media platform drivers # # # Sunxi media platform drivers # CONFIG_VIDEO_SUN8I_DEINTERLACE=m CONFIG_VIDEO_SUN50I_DEINTERLACE=m CONFIG_VIDEO_SUN8I_ROTATE=m # # Texas Instruments drivers # # # Verisilicon media platform drivers # CONFIG_VIDEO_HANTRO=m CONFIG_VIDEO_HANTRO_SUNXI=y # # VIA media platform drivers # # # Xilinx media platform drivers # # # MMC/SDIO DVB adapters # # CONFIG_SMS_SDIO_DRV is not set CONFIG_MEDIA_COMMON_OPTIONS=y # # common driver options # CONFIG_CYPRESS_FIRMWARE=m CONFIG_TTPCI_EEPROM=m CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_SMS_SIANO_MDTV=m CONFIG_SMS_SIANO_RC=y CONFIG_VIDEOBUF2_CORE=y CONFIG_VIDEOBUF2_V4L2=y CONFIG_VIDEOBUF2_MEMOPS=y CONFIG_VIDEOBUF2_DMA_CONTIG=y CONFIG_VIDEOBUF2_VMALLOC=m # end of Media drivers # # Media ancillary drivers # CONFIG_MEDIA_ATTACH=y # # IR I2C driver auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_IR_I2C=y CONFIG_VIDEO_CAMERA_SENSOR=y # CONFIG_VIDEO_AR0521 is not set # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_HI846 is not set # CONFIG_VIDEO_HI847 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_IMX412 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set CONFIG_VIDEO_MT9V011=m # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set CONFIG_VIDEO_OV2640=m # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5693 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV7251 is not set CONFIG_VIDEO_OV7640=m # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9282 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_M5MOLS is not set # # Lens drivers # # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # Audio decoders, processors and mixers # CONFIG_VIDEO_CS3308=m CONFIG_VIDEO_CS5345=m CONFIG_VIDEO_CS53L32A=m CONFIG_VIDEO_MSP3400=m CONFIG_VIDEO_SONY_BTF_MPX=m CONFIG_VIDEO_TDA1997X=m CONFIG_VIDEO_TDA7432=m CONFIG_VIDEO_TDA9840=m CONFIG_VIDEO_TEA6415C=m CONFIG_VIDEO_TEA6420=m CONFIG_VIDEO_TLV320AIC23B=m CONFIG_VIDEO_TVAUDIO=m CONFIG_VIDEO_UDA1342=m CONFIG_VIDEO_VP27SMPX=m CONFIG_VIDEO_WM8739=m CONFIG_VIDEO_WM8775=m # end of Audio decoders, processors and mixers # # RDS decoders # CONFIG_VIDEO_SAA6588=m # end of RDS decoders # # Video decoders # CONFIG_VIDEO_ADV7180=m CONFIG_VIDEO_ADV7183=m CONFIG_VIDEO_ADV748X=m CONFIG_VIDEO_ADV7604=m CONFIG_VIDEO_ADV7604_CEC=y CONFIG_VIDEO_ADV7842=m CONFIG_VIDEO_ADV7842_CEC=y CONFIG_VIDEO_BT819=m CONFIG_VIDEO_BT856=m CONFIG_VIDEO_BT866=m # CONFIG_VIDEO_ISL7998X is not set CONFIG_VIDEO_KS0127=m CONFIG_VIDEO_MAX9286=m CONFIG_VIDEO_ML86V7667=m CONFIG_VIDEO_SAA7110=m CONFIG_VIDEO_SAA711X=m CONFIG_VIDEO_TC358743=m CONFIG_VIDEO_TC358743_CEC=y CONFIG_VIDEO_TVP514X=m CONFIG_VIDEO_TVP5150=m CONFIG_VIDEO_TVP7002=m CONFIG_VIDEO_TW2804=m CONFIG_VIDEO_TW9903=m CONFIG_VIDEO_TW9906=m CONFIG_VIDEO_TW9910=m CONFIG_VIDEO_VPX3220=m # # Video and audio decoders # CONFIG_VIDEO_SAA717X=m CONFIG_VIDEO_CX25840=m # end of Video decoders # # Video encoders # CONFIG_VIDEO_AD9389B=m CONFIG_VIDEO_ADV7170=m CONFIG_VIDEO_ADV7175=m CONFIG_VIDEO_ADV7343=m CONFIG_VIDEO_ADV7393=m CONFIG_VIDEO_ADV7511=m CONFIG_VIDEO_ADV7511_CEC=y CONFIG_VIDEO_AK881X=m CONFIG_VIDEO_SAA7127=m CONFIG_VIDEO_SAA7185=m CONFIG_VIDEO_THS8200=m # end of Video encoders # # Video improvement chips # CONFIG_VIDEO_UPD64031A=m CONFIG_VIDEO_UPD64083=m # end of Video improvement chips # # Audio/Video compression chips # CONFIG_VIDEO_SAA6752HS=m # end of Audio/Video compression chips # # SDR tuner chips # # end of SDR tuner chips # # Miscellaneous helper chips # CONFIG_VIDEO_I2C=m CONFIG_VIDEO_M52790=m # CONFIG_VIDEO_ST_MIPID02 is not set CONFIG_VIDEO_THS7303=m # end of Miscellaneous helper chips # # Media SPI Adapters # CONFIG_CXD2880_SPI_DRV=m CONFIG_VIDEO_GS1662=m # end of Media SPI Adapters CONFIG_MEDIA_TUNER=y # # Customize TV tuners # CONFIG_MEDIA_TUNER_E4000=m CONFIG_MEDIA_TUNER_FC0011=m CONFIG_MEDIA_TUNER_FC0012=m CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_FC2580=m CONFIG_MEDIA_TUNER_IT913X=m CONFIG_MEDIA_TUNER_M88RS6000T=m CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_MC44S803=y CONFIG_MEDIA_TUNER_MSI001=m CONFIG_MEDIA_TUNER_MT2060=m CONFIG_MEDIA_TUNER_MT2063=m CONFIG_MEDIA_TUNER_MT20XX=y CONFIG_MEDIA_TUNER_MT2131=m CONFIG_MEDIA_TUNER_MT2266=m CONFIG_MEDIA_TUNER_MXL301RF=m CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m CONFIG_MEDIA_TUNER_QM1D1B0004=m CONFIG_MEDIA_TUNER_QM1D1C0042=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_R820T=m CONFIG_MEDIA_TUNER_SI2157=m CONFIG_MEDIA_TUNER_SIMPLE=y CONFIG_MEDIA_TUNER_TDA18212=m CONFIG_MEDIA_TUNER_TDA18218=m CONFIG_MEDIA_TUNER_TDA18250=m CONFIG_MEDIA_TUNER_TDA18271=y CONFIG_MEDIA_TUNER_TDA827X=y CONFIG_MEDIA_TUNER_TDA8290=y CONFIG_MEDIA_TUNER_TDA9887=y CONFIG_MEDIA_TUNER_TEA5761=y CONFIG_MEDIA_TUNER_TEA5767=y CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_MEDIA_TUNER_XC2028=y CONFIG_MEDIA_TUNER_XC4000=y CONFIG_MEDIA_TUNER_XC5000=y # end of Customize TV tuners # # Customise DVB Frontends # # # Multistandard (satellite) frontends # CONFIG_DVB_M88DS3103=m CONFIG_DVB_MXL5XX=m CONFIG_DVB_STB0899=m CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m CONFIG_DVB_STV0910=m CONFIG_DVB_STV6110x=m CONFIG_DVB_STV6111=m # # Multistandard (cable + terrestrial) frontends # CONFIG_DVB_DRXK=m CONFIG_DVB_MN88472=m CONFIG_DVB_MN88473=m CONFIG_DVB_SI2165=m CONFIG_DVB_TDA18271C2DD=m # # DVB-S (satellite) frontends # CONFIG_DVB_CX24110=m CONFIG_DVB_CX24116=m CONFIG_DVB_CX24117=m CONFIG_DVB_CX24120=m CONFIG_DVB_CX24123=m CONFIG_DVB_DS3000=m CONFIG_DVB_MB86A16=m CONFIG_DVB_MT312=m CONFIG_DVB_S5H1420=m CONFIG_DVB_SI21XX=m CONFIG_DVB_STB6000=m CONFIG_DVB_STV0288=m CONFIG_DVB_STV0299=m CONFIG_DVB_STV0900=m CONFIG_DVB_STV6110=m CONFIG_DVB_TDA10071=m CONFIG_DVB_TDA10086=m CONFIG_DVB_TDA8083=m CONFIG_DVB_TDA8261=m CONFIG_DVB_TDA826X=m CONFIG_DVB_TS2020=m CONFIG_DVB_TUA6100=m CONFIG_DVB_TUNER_CX24113=m CONFIG_DVB_TUNER_ITD1000=m CONFIG_DVB_VES1X93=m CONFIG_DVB_ZL10036=m CONFIG_DVB_ZL10039=m # # DVB-T (terrestrial) frontends # CONFIG_DVB_AF9013=m CONFIG_DVB_AS102_FE=m CONFIG_DVB_CX22700=m CONFIG_DVB_CX22702=m CONFIG_DVB_CXD2820R=m CONFIG_DVB_CXD2841ER=m CONFIG_DVB_DIB3000MB=m CONFIG_DVB_DIB3000MC=m CONFIG_DVB_DIB7000M=m CONFIG_DVB_DIB7000P=m CONFIG_DVB_DIB9000=m CONFIG_DVB_DRXD=m CONFIG_DVB_EC100=m CONFIG_DVB_GP8PSK_FE=m CONFIG_DVB_L64781=m CONFIG_DVB_MT352=m CONFIG_DVB_NXT6000=m CONFIG_DVB_RTL2830=m CONFIG_DVB_RTL2832=m CONFIG_DVB_S5H1432=m CONFIG_DVB_SI2168=m CONFIG_DVB_SP887X=m CONFIG_DVB_STV0367=m CONFIG_DVB_TDA10048=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_ZD1301_DEMOD=m CONFIG_DVB_ZL10353=m CONFIG_DVB_CXD2880=m # # DVB-C (cable) frontends # CONFIG_DVB_STV0297=m CONFIG_DVB_TDA10021=m CONFIG_DVB_TDA10023=m CONFIG_DVB_VES1820=m # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # CONFIG_DVB_AU8522=m CONFIG_DVB_AU8522_DTV=m CONFIG_DVB_AU8522_V4L=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LG2160=m CONFIG_DVB_LGDT3305=m CONFIG_DVB_LGDT3306A=m CONFIG_DVB_LGDT330X=m CONFIG_DVB_MXL692=m CONFIG_DVB_NXT200X=m CONFIG_DVB_OR51132=m CONFIG_DVB_OR51211=m CONFIG_DVB_S5H1409=m CONFIG_DVB_S5H1411=m # # ISDB-T (terrestrial) frontends # CONFIG_DVB_DIB8000=m CONFIG_DVB_MB86A20S=m CONFIG_DVB_S921=m # # ISDB-S (satellite) & ISDB-T (terrestrial) frontends # CONFIG_DVB_MN88443X=m CONFIG_DVB_TC90522=m # # Digital terrestrial only tuners/PLL # CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m CONFIG_DVB_TUNER_DIB0090=m # # SEC control devices for DVB-S # CONFIG_DVB_A8293=m CONFIG_DVB_AF9033=m CONFIG_DVB_ASCOT2E=m CONFIG_DVB_ATBM8830=m CONFIG_DVB_HELENE=m CONFIG_DVB_HORUS3A=m CONFIG_DVB_ISL6405=m CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m CONFIG_DVB_IX2505V=m CONFIG_DVB_LGS8GL5=m CONFIG_DVB_LGS8GXX=m CONFIG_DVB_LNBH25=m CONFIG_DVB_LNBH29=m CONFIG_DVB_LNBP21=m CONFIG_DVB_LNBP22=m CONFIG_DVB_M88RS2000=m CONFIG_DVB_TDA665x=m CONFIG_DVB_DRX39XYJ=m # # Common Interface (EN50221) controller drivers # CONFIG_DVB_CXD2099=m CONFIG_DVB_SP2=m # end of Customise DVB Frontends # end of Media ancillary drivers # # Graphics support # CONFIG_DRM=y # CONFIG_DRM_DEBUG_MM is not set CONFIG_DRM_KMS_HELPER=y # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set # CONFIG_DRM_DEBUG_MODESET_LOCK is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_DISPLAY_DP_HELPER=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_GEM_DMA_HELPER=y CONFIG_DRM_GEM_SHMEM_HELPER=m CONFIG_DRM_SCHED=m # # I2C encoder or helper chips # 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 # end of I2C encoder or helper chips # # ARM devices # # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_KOMEDA is not set # end of ARM devices # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_USE_LVDS is not set # CONFIG_DRM_RCAR_USE_MIPI_DSI is not set CONFIG_DRM_SUN4I=y # CONFIG_DRM_SUN6I_DSI is not set CONFIG_DRM_SUN8I_DW_HDMI=y CONFIG_DRM_SUN8I_MIXER=y CONFIG_DRM_SUN8I_TCON_TOP=y CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_ABT_Y030XX067A is not set # CONFIG_DRM_PANEL_ARM_VERSATILE is not set # CONFIG_DRM_PANEL_LVDS is not set # CONFIG_DRM_PANEL_SIMPLE is not set # CONFIG_DRM_PANEL_EDP is not set # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LB035Q02 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set # CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set # CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set # CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set # CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set # CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set # CONFIG_DRM_PANEL_SONY_ACX565AKM is not set # CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set # CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set # CONFIG_DRM_PANEL_TPO_TPG110 is not set # CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set # CONFIG_DRM_LONTIUM_LT9611 is not set # CONFIG_DRM_LONTIUM_LT9611UXC is not set # CONFIG_DRM_ITE_IT66121 is not set # CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NWL_MIPI_DSI is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_PARADE_PS8640 is not set # CONFIG_DRM_SIL_SII8620 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_SII9234 is not set CONFIG_DRM_SIMPLE_BRIDGE=y # CONFIG_DRM_THINE_THC63LVD1024 is not set # CONFIG_DRM_TOSHIBA_TC358762 is not set # CONFIG_DRM_TOSHIBA_TC358764 is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TOSHIBA_TC358768 is not set # CONFIG_DRM_TOSHIBA_TC358775 is not set # CONFIG_DRM_TI_DLPC3433 is not set # CONFIG_DRM_TI_TFP410 is not set # CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set CONFIG_DRM_ANALOGIX_ANX6345=m # CONFIG_DRM_ANALOGIX_ANX78XX is not set CONFIG_DRM_ANALOGIX_DP=m # CONFIG_DRM_ANALOGIX_ANX7625 is not set # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_CDNS_MHDP8546 is not set 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_GP_AUDIO is not set CONFIG_DRM_DW_HDMI_CEC=y # end of Display Interface Bridges # CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_HISI_KIRIN is not set # CONFIG_DRM_LOGICVC is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_PANEL_MIPI_DBI is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9163 is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set # CONFIG_TINYDRM_ILI9486 is not set # CONFIG_TINYDRM_MI0283QT is not set # CONFIG_TINYDRM_REPAPER is not set # CONFIG_TINYDRM_ST7586 is not set # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set CONFIG_DRM_LIMA=m CONFIG_DRM_PANFROST=m # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_DRM_NOMODESET=y # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # end of Frame buffer Devices # # Backlight & LCD device support # CONFIG_LCD_CLASS_DEVICE=m # CONFIG_LCD_L4F00242T03 is not set # CONFIG_LCD_LMS283GF05 is not set # CONFIG_LCD_LTV350QV is not set # CONFIG_LCD_ILI922X is not set # CONFIG_LCD_ILI9320 is not set # CONFIG_LCD_TDO24M is not set # CONFIG_LCD_VGG2432A4 is not set # CONFIG_LCD_PLATFORM is not set # CONFIG_LCD_AMS369FG06 is not set # CONFIG_LCD_LMS501KF03 is not set # CONFIG_LCD_HX8357 is not set # CONFIG_LCD_OTM3225A is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_KTD253 is not set CONFIG_BACKLIGHT_PWM=m # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set CONFIG_BACKLIGHT_LP855X=m # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # CONFIG_BACKLIGHT_LED is not set # end of Backlight & LCD device support CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support # CONFIG_LOGO is not set # end of Graphics support CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y # CONFIG_SND_HRTIMER is not set # CONFIG_SND_DYNAMIC_MINORS is not set CONFIG_SND_SUPPORT_OLD_API=y CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_CTL_INPUT_VALIDATION is not set # CONFIG_SND_SEQUENCER is not set CONFIG_SND_DRIVERS=y # CONFIG_SND_DUMMY is not set # CONFIG_SND_ALOOP is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_SERIAL_GENERIC is not set # CONFIG_SND_MPU401 is not set # # HD-Audio # # end of HD-Audio CONFIG_SND_HDA_PREALLOC_SIZE=64 CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=m CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y # CONFIG_SND_USB_UA101 is not set # CONFIG_SND_USB_CAIAQ is not set # CONFIG_SND_USB_6FIRE is not set # CONFIG_SND_USB_HIFACE is not set # CONFIG_SND_BCD2000 is not set # CONFIG_SND_USB_POD is not set # CONFIG_SND_USB_PODHD is not set # CONFIG_SND_USB_TONEPORT is not set # CONFIG_SND_USB_VARIAX is not set CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y # CONFIG_SND_SOC_ADI is not set # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_AMD_ACP_CONFIG is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # CONFIG_SND_SOC_FSL_AUDMIX is not set # 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_FSL_XCVR is not set # CONFIG_SND_SOC_FSL_RPMSG is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # end of SoC Audio for Freescale CPUs # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_MTK_BTCVSD is not set # CONFIG_SND_SOC_SOF_TOPLEVEL is not set # # STMicroelectronics STM32 SOC audio support # # end of STMicroelectronics STM32 SOC audio support # # Allwinner SoC Audio support # CONFIG_SND_SUN4I_CODEC=y CONFIG_SND_SUN8I_CODEC=y CONFIG_SND_SUN8I_CODEC_ANALOG=y CONFIG_SND_SUN50I_CODEC_ANALOG=y CONFIG_SND_SUN4I_I2S=y CONFIG_SND_SUN4I_SPDIF=y CONFIG_SND_SUN50I_DMIC=y CONFIG_SND_SUN8I_ADDA_PR_REGMAP=y # end of Allwinner 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_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1372_SPI is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set # CONFIG_SND_SOC_ADAU7002 is not set # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4375 is not set # CONFIG_SND_SOC_AK4458 is not set # CONFIG_SND_SOC_AK4554 is not set CONFIG_SND_SOC_AK4613=m # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # 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_CS35L41_SPI is not set # CONFIG_SND_SOC_CS35L41_I2C is not set # CONFIG_SND_SOC_CS35L45_SPI is not set # CONFIG_SND_SOC_CS35L45_I2C 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS42L83 is not set # CONFIG_SND_SOC_CS4234 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # 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_CX2072X is not set # CONFIG_SND_SOC_DA7213 is not set # CONFIG_SND_SOC_DMIC is not set CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_ES7134 is not set # CONFIG_SND_SOC_ES7241 is not set # CONFIG_SND_SOC_ES8316 is not set # CONFIG_SND_SOC_ES8326 is not set # CONFIG_SND_SOC_ES8328_I2C is not set # CONFIG_SND_SOC_ES8328_SPI is not set # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_HDA is not set # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set # CONFIG_SND_SOC_MAX98088 is not set # CONFIG_SND_SOC_MAX98357A is not set # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98520 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX98396 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set # CONFIG_SND_SOC_PCM186X_I2C is not set # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set # CONFIG_SND_SOC_PCM5102A 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_RK817 is not set # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set # CONFIG_SND_SOC_RT5640 is not set # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_RT9120 is not set # CONFIG_SND_SOC_SGTL5000 is not set # CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set # CONFIG_SND_SOC_SIMPLE_MUX is not set CONFIG_SND_SOC_SPDIF=y # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS2780 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805M is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320ADC3XXX is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set # CONFIG_SND_SOC_TLV320AIC3X_I2C is not set # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731_I2C is not set # CONFIG_SND_SOC_WM8731_SPI is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set # 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_WM8940 is not set # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set # CONFIG_SND_SOC_ZL38060 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_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8821 is not set # CONFIG_SND_SOC_NAU8822 is not set # CONFIG_SND_SOC_NAU8824 is not set # CONFIG_SND_SOC_TPA6130A2 is not set # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set # end of CODEC drivers CONFIG_SND_SIMPLE_CARD_UTILS=y CONFIG_SND_SIMPLE_CARD=y CONFIG_SND_AUDIO_GRAPH_CARD=y # CONFIG_SND_AUDIO_GRAPH_CARD2 is not set # CONFIG_SND_TEST_COMPONENT is not set # # HID support # CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set CONFIG_HID_ASUS=m CONFIG_HID_AUREAL=m # CONFIG_HID_BELKIN is not set # CONFIG_HID_BETOP_FF is not set CONFIG_HID_BIGBEN_FF=m CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CREATIVE_SB0540 is not set CONFIG_HID_CYPRESS=y CONFIG_HID_DRAGONRISE=m CONFIG_DRAGONRISE_FF=y # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_FT260 is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set CONFIG_HID_GLORIOUS=m # CONFIG_HID_HOLTEK is not set # CONFIG_HID_VIVALDI is not set # CONFIG_HID_GT683R is not set # CONFIG_HID_KEYTOUCH is not set CONFIG_HID_KYE=m # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set # CONFIG_HID_VRC2 is not set # CONFIG_HID_XIAOMI is not set CONFIG_HID_GYRATION=m # CONFIG_HID_ICADE is not set CONFIG_HID_ITE=y # CONFIG_HID_JABRA is not set CONFIG_HID_TWINHAN=m CONFIG_HID_KENSINGTON=y # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LED is not set # CONFIG_HID_LENOVO is not set # CONFIG_HID_LETSKETCH is not set CONFIG_HID_LOGITECH=y # CONFIG_HID_LOGITECH_DJ is not set CONFIG_HID_LOGITECH_HIDPP=m CONFIG_LOGITECH_FF=y 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_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=m CONFIG_HID_NINTENDO=m CONFIG_NINTENDO_FF=y # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set CONFIG_HID_ORTEK=m CONFIG_HID_OUYA=m CONFIG_HID_PANTHERLORD=m CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=m CONFIG_HID_PETALYNX=m # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PXRC is not set # CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set CONFIG_HID_SAMSUNG=m # CONFIG_HID_SEMITEK is not set # CONFIG_HID_SIGMAMICRO is not set CONFIG_HID_SONY=m CONFIG_SONY_FF=y # CONFIG_HID_SPEEDLINK is not set CONFIG_HID_STEAM=m # CONFIG_HID_STEELSERIES is not set CONFIG_HID_SUNPLUS=m CONFIG_HID_RMI=m # CONFIG_HID_GREENASIA is not set CONFIG_HID_SMARTJOYPLUS=m CONFIG_SMARTJOYPLUS_FF=y CONFIG_HID_TIVO=m CONFIG_HID_TOPSEED=m # CONFIG_HID_TOPRE is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set CONFIG_HID_WIIMOTE=m CONFIG_HID_XINMO=m # CONFIG_HID_ZEROPLUS is not set CONFIG_HID_ZYDACRON=m # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # end of USB HID support # # I2C HID support # # CONFIG_I2C_HID_OF is not set # CONFIG_I2C_HID_OF_ELAN is not set # CONFIG_I2C_HID_OF_GOODIX is not set # end of I2C HID support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y # CONFIG_USB_LED_TRIG is not set CONFIG_USB_ULPI_BUS=y # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_OTG=y # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_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 # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y # CONFIG_USB_XHCI_DBGCAP is not set # CONFIG_USB_XHCI_PCI_RENESAS is not set 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 # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD_PLATFORM=y # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=m # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set CONFIG_USB_UAS=y # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_CDNS_SUPPORT is not set CONFIG_USB_MUSB_HDRC=y # CONFIG_USB_MUSB_HOST is not set # CONFIG_USB_MUSB_GADGET is not set CONFIG_USB_MUSB_DUAL_ROLE=y # # Platform Glue Layer # CONFIG_USB_MUSB_SUNXI=y # # MUSB DMA mode # # CONFIG_MUSB_PIO_ONLY is not set CONFIG_USB_DWC3=y # CONFIG_USB_DWC3_ULPI is not set # CONFIG_USB_DWC3_HOST is not set # CONFIG_USB_DWC3_GADGET is not set CONFIG_USB_DWC3_DUAL_ROLE=y # # Platform Glue Driver Support # CONFIG_USB_DWC3_OF_SIMPLE=y CONFIG_USB_DWC2=y # CONFIG_USB_DWC2_HOST is not set # # Gadget/Dual-role mode requires USB Gadget support to be enabled # # CONFIG_USB_DWC2_PERIPHERAL is not set CONFIG_USB_DWC2_DUAL_ROLE=y # CONFIG_USB_DWC2_DEBUG is not set # CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set CONFIG_USB_CHIPIDEA=y CONFIG_USB_CHIPIDEA_UDC=y CONFIG_USB_CHIPIDEA_HOST=y CONFIG_USB_CHIPIDEA_MSM=y CONFIG_USB_CHIPIDEA_IMX=y CONFIG_USB_CHIPIDEA_GENERIC=y CONFIG_USB_CHIPIDEA_TEGRA=y CONFIG_USB_ISP1760=y CONFIG_USB_ISP1760_HCD=y CONFIG_USB_ISP1761_UDC=y # CONFIG_USB_ISP1760_HOST_ROLE is not set # CONFIG_USB_ISP1760_GADGET_ROLE is not set CONFIG_USB_ISP1760_DUAL_ROLE=y # # USB port drivers # # CONFIG_USB_SERIAL is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HUB_USB251XB is not set CONFIG_USB_HSIC_USB3503=y # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # CONFIG_USB_ONBOARD_HUB is not set # # USB Physical Layer drivers # CONFIG_USB_PHY=y CONFIG_NOP_USB_XCEIV=y # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set CONFIG_USB_ULPI=y CONFIG_USB_ULPI_VIEWPORT=y # end of USB Physical Layer drivers CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GADGET_DEBUG_FILES is not set # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # # USB Peripheral Controller # # CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set CONFIG_USB_SNP_CORE=y CONFIG_USB_SNP_UDC_PLAT=y # CONFIG_USB_M66592 is not set CONFIG_USB_BDC_UDC=y # CONFIG_USB_NET2272 is not set # CONFIG_USB_GADGET_XILINX is not set # CONFIG_USB_MAX3420_UDC is not set # CONFIG_USB_DUMMY_HCD is not set # end of USB Peripheral Controller # CONFIG_USB_CONFIGFS is not set # # USB Gadget precomposed configurations # # CONFIG_USB_ZERO is not set # CONFIG_USB_AUDIO is not set # CONFIG_USB_ETH is not set # CONFIG_USB_G_NCM is not set # CONFIG_USB_GADGETFS is not set # CONFIG_USB_FUNCTIONFS is not set # CONFIG_USB_MASS_STORAGE is not set # CONFIG_USB_G_SERIAL is not set # CONFIG_USB_MIDI_GADGET is not set # CONFIG_USB_G_PRINTER is not set # CONFIG_USB_CDC_COMPOSITE is not set # CONFIG_USB_G_ACM_MS is not set # CONFIG_USB_G_MULTI is not set # CONFIG_USB_G_HID is not set # CONFIG_USB_G_DBGP is not set # CONFIG_USB_G_WEBCAM is not set # CONFIG_USB_RAW_GADGET is not set # end of USB Gadget precomposed configurations # CONFIG_TYPEC is not set CONFIG_USB_ROLE_SWITCH=y CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y # CONFIG_PWRSEQ_SD8787 is not set CONFIG_PWRSEQ_SIMPLE=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_DEBUG is not set CONFIG_MMC_ARMMMCI=y CONFIG_MMC_STM32_SDMMC=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_PLTFM=y CONFIG_MMC_SDHCI_OF_ARASAN=y # CONFIG_MMC_SDHCI_OF_AT91 is not set # CONFIG_MMC_SDHCI_OF_DWCMSHC is not set CONFIG_MMC_SDHCI_CADENCE=y CONFIG_MMC_SDHCI_F_SDH30=y # CONFIG_MMC_SDHCI_MILBEAUT is not set CONFIG_MMC_SPI=y CONFIG_MMC_DW=y CONFIG_MMC_DW_PLTFM=y # CONFIG_MMC_DW_BLUEFIELD is not set CONFIG_MMC_DW_EXYNOS=y CONFIG_MMC_DW_HI3798CV200=y CONFIG_MMC_DW_K3=y # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_SUNXI=y CONFIG_MMC_CQHCI=y # CONFIG_MMC_HSQ is not set # CONFIG_MMC_MTK is not set CONFIG_MMC_SDHCI_XENON=y # CONFIG_MMC_SDHCI_OMAP is not set # CONFIG_MMC_SDHCI_AM654 is not set CONFIG_SCSI_UFSHCD=m # CONFIG_SCSI_UFS_BSG is not set # CONFIG_SCSI_UFS_HPB is not set # CONFIG_SCSI_UFS_HWMON is not set CONFIG_SCSI_UFSHCD_PLATFORM=m # CONFIG_SCSI_UFS_CDNS_PLATFORM is not set # CONFIG_SCSI_UFS_DWC_TC_PLATFORM is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y # CONFIG_LEDS_CLASS_FLASH is not set # CONFIG_LEDS_CLASS_MULTICOLOR is not set # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_AW2013 is not set # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_EL15203000 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP50XX is not set # CONFIG_LEDS_LP55XX_COMMON is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set CONFIG_LEDS_PWM=y # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set CONFIG_LEDS_SYSCON=y # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_SPI_BYTE is not set # CONFIG_LEDS_TI_LMU_COMMON is not set # # Flash and Torch LED drivers # # # RGB LED drivers # # # LED Triggers # CONFIG_LEDS_TRIGGERS=y # CONFIG_LEDS_TRIGGER_TIMER is not set # CONFIG_LEDS_TRIGGER_ONESHOT is not set CONFIG_LEDS_TRIGGER_DISK=y # CONFIG_LEDS_TRIGGER_MTD is not set CONFIG_LEDS_TRIGGER_HEARTBEAT=y # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set CONFIG_LEDS_TRIGGER_CPU=y # CONFIG_LEDS_TRIGGER_ACTIVITY is not set # CONFIG_LEDS_TRIGGER_GPIO is not set CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set CONFIG_LEDS_TRIGGER_PANIC=y # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set # CONFIG_LEDS_TRIGGER_AUDIO is not set # CONFIG_LEDS_TRIGGER_TTY is not set # # Simple LED drivers # # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_SUPPORT=y # CONFIG_EDAC is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # 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 # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_HYM8563 is not set # CONFIG_RTC_DRV_MAX6900 is not set CONFIG_RTC_DRV_MAX77686=y # CONFIG_RTC_DRV_NCT3018Y is not set CONFIG_RTC_DRV_RK808=m # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # 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_RV3032 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 # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # CONFIG_RTC_DRV_DS3232=y CONFIG_RTC_DRV_DS3232_HWMON=y # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # on-CPU RTC drivers # # 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_R7301 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH=y CONFIG_DMA_ENGINE=y CONFIG_DMA_VIRTUAL_CHANNELS=y CONFIG_DMA_OF=y # CONFIG_ALTERA_MSGDMA is not set # CONFIG_AMBA_PL08X is not set 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 # CONFIG_XILINX_DMA is not set # CONFIG_XILINX_ZYNQMP_DMA is not set # CONFIG_XILINX_ZYNQMP_DPDMA is not set CONFIG_QCOM_HIDMA_MGMT=y CONFIG_QCOM_HIDMA=y # CONFIG_DW_DMAC is not set # CONFIG_SF_PDMA is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set CONFIG_DMA_ENGINE_RAID=y # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set CONFIG_DMABUF_HEAPS=y # CONFIG_DMABUF_SYSFS_STATS is not set CONFIG_DMABUF_HEAPS_SYSTEM=y CONFIG_DMABUF_HEAPS_CMA=y # end of DMABUF options # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set # CONFIG_VIRTIO_MENU is not set # CONFIG_VDPA is not set # CONFIG_VHOST_MENU is not set # # Microsoft Hyper-V guest support # # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_RTLLIB is not set CONFIG_RTL8723BS=m # CONFIG_R8712U is not set CONFIG_R8188EU=m # CONFIG_VT6656 is not set # # IIO staging drivers # # # Accelerometers # # CONFIG_ADIS16203 is not set # CONFIG_ADIS16240 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7816 is not set # end of Analog to digital converters # # Analog digital bi-direction converters # # CONFIG_ADT7316 is not set # end of Analog digital bi-direction converters # # Direct Digital Synthesis # # CONFIG_AD9832 is not set # CONFIG_AD9834 is not set # end of Direct Digital Synthesis # # Network Analyzer, Impedance Converters # # CONFIG_AD5933 is not set # end of Network Analyzer, Impedance Converters # # Active energy metering IC # # CONFIG_ADE7854 is not set # end of Active energy metering IC # # Resolver to digital converters # # CONFIG_AD2S1210 is not set # end of Resolver to digital converters # end of IIO staging drivers CONFIG_STAGING_MEDIA=y # CONFIG_VIDEO_MAX96712 is not set CONFIG_VIDEO_SUNXI=y CONFIG_VIDEO_SUNXI_CEDRUS=y CONFIG_STAGING_MEDIA_DEPRECATED=y # CONFIG_VIDEO_CPIA2 is not set # CONFIG_VIDEO_STKWEBCAM is not set CONFIG_VIDEO_TM6000=m CONFIG_VIDEO_TM6000_ALSA=m CONFIG_VIDEO_TM6000_DVB=m # CONFIG_USB_ZR364XX is not set # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_FB_TFT is not set # CONFIG_KS7010 is not set # CONFIG_PI433 is not set # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_FIELDBUS_DEV is not set # CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set # CONFIG_SURFACE_PLATFORMS is not set CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Clock driver for ARM Reference designs # # CONFIG_CLK_ICST is not set # CONFIG_CLK_SP810 is not set # CONFIG_CLK_VEXPRESS_OSC is not set # end of Clock driver for ARM Reference designs # CONFIG_LMK04832 is not set # CONFIG_COMMON_CLK_MAX77686 is not set # CONFIG_COMMON_CLK_MAX9485 is not set # CONFIG_COMMON_CLK_RK808 is not set CONFIG_COMMON_CLK_SCPI=y # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set # CONFIG_COMMON_CLK_S2MPS11 is not set # CONFIG_COMMON_CLK_AXI_CLKGEN is not set # CONFIG_COMMON_CLK_XGENE is not set CONFIG_COMMON_CLK_PWM=y # CONFIG_COMMON_CLK_RS9_PCIE is not set # CONFIG_COMMON_CLK_VC5 is not set # CONFIG_COMMON_CLK_VC7 is not set # CONFIG_COMMON_CLK_FIXED_MMIO is not set CONFIG_SUNXI_CCU=y CONFIG_SUN50I_A64_CCU=y # CONFIG_SUN50I_A100_CCU is not set # CONFIG_SUN50I_A100_R_CCU is not set CONFIG_SUN50I_H6_CCU=y CONFIG_SUN50I_H616_CCU=y CONFIG_SUN50I_H6_R_CCU=y CONFIG_SUN6I_RTC_CCU=y CONFIG_SUN8I_H3_CCU=y CONFIG_SUN8I_DE2_CCU=y CONFIG_SUN8I_R_CCU=y # CONFIG_XILINX_VCU is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set CONFIG_HWSPINLOCK=y CONFIG_HWSPINLOCK_SUN6I=y # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_PROBE=y CONFIG_CLKSRC_MMIO=y CONFIG_SUN4I_TIMER=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y CONFIG_FSL_ERRATUM_A008585=y CONFIG_HISILICON_ERRATUM_161010101=y CONFIG_ARM64_ERRATUM_858921=y CONFIG_SUN50I_ERRATUM_UNKNOWN1=y # CONFIG_MICROCHIP_PIT64B is not set # end of Clock Source drivers CONFIG_MAILBOX=y CONFIG_ARM_MHU=y # CONFIG_ARM_MHU_V2 is not set CONFIG_PLATFORM_MHU=y # CONFIG_PL320_MBOX is not set # CONFIG_ALTERA_MBOX is not set # CONFIG_MAILBOX_TEST is not set CONFIG_SUN6I_MSGBOX=y CONFIG_IOMMU_IOVA=y CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # CONFIG_IOMMU_IO_PGTABLE=y CONFIG_IOMMU_IO_PGTABLE_LPAE=y # CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set # CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set # CONFIG_IOMMU_IO_PGTABLE_DART is not set # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set CONFIG_IOMMU_DEFAULT_DMA_STRICT=y # CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_OF_IOMMU=y CONFIG_IOMMU_DMA=y CONFIG_SUN50I_IOMMU=y # CONFIG_ARM_SMMU is not set # CONFIG_ARM_SMMU_V3 is not set # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # end of Remoteproc drivers # # Rpmsg drivers # CONFIG_RPMSG=y # CONFIG_RPMSG_CHAR is not set # CONFIG_RPMSG_CTRL is not set # CONFIG_RPMSG_NS is not set CONFIG_RPMSG_QCOM_GLINK=y CONFIG_RPMSG_QCOM_GLINK_RPM=y # CONFIG_RPMSG_VIRTIO is not set # end of Rpmsg drivers # CONFIG_SOUNDWIRE is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # end of Amlogic SoC drivers # # Broadcom SoC drivers # CONFIG_SOC_BRCMSTB=y # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # CONFIG_QUICC_ENGINE is not set # CONFIG_FSL_RCPM is not set # end of NXP/Freescale QorIQ SoC drivers # # fujitsu SoC drivers # # end of fujitsu SoC drivers # # i.MX SoC drivers # # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # CONFIG_LITEX_SOC_CONTROLLER is not set # end of Enable LiteX SoC Builder specific drivers # # Qualcomm SoC drivers # # end of Qualcomm SoC drivers CONFIG_SUNXI_MBUS=y CONFIG_SUNXI_SRAM=y CONFIG_SOC_TI=y # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y # CONFIG_DEVFREQ_GOV_PERFORMANCE is not set # CONFIG_DEVFREQ_GOV_POWERSAVE is not set # CONFIG_DEVFREQ_GOV_USERSPACE is not set # CONFIG_DEVFREQ_GOV_PASSIVE is not set # # DEVFREQ Drivers # CONFIG_ARM_SUN8I_A33_MBUS_DEVFREQ=y # CONFIG_PM_DEVFREQ_EVENT is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_FSA9480 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_MEMORY=y # CONFIG_ARM_PL172_MPMC is not set CONFIG_IIO=y CONFIG_IIO_BUFFER=y # CONFIG_IIO_BUFFER_CB is not set # CONFIG_IIO_BUFFER_DMA is not set # CONFIG_IIO_BUFFER_DMAENGINE is not set # CONFIG_IIO_BUFFER_HW_CONSUMER is not set CONFIG_IIO_KFIFO_BUF=m # CONFIG_IIO_TRIGGERED_BUFFER is not set # CONFIG_IIO_CONFIGFS is not set CONFIG_IIO_TRIGGER=y CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # CONFIG_IIO_SW_DEVICE is not set # CONFIG_IIO_SW_TRIGGER is not set # CONFIG_IIO_TRIGGERED_EVENT is not set # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADXL313_I2C is not set # CONFIG_ADXL313_SPI is not set # CONFIG_ADXL345_I2C is not set # CONFIG_ADXL345_SPI is not set # CONFIG_ADXL355_I2C is not set # CONFIG_ADXL355_SPI is not set # CONFIG_ADXL367_SPI is not set # CONFIG_ADXL367_I2C is not set # CONFIG_ADXL372_SPI is not set # CONFIG_ADXL372_I2C is not set # CONFIG_BMA180 is not set # CONFIG_BMA220 is not set # CONFIG_BMA400 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_BMI088_ACCEL is not set # CONFIG_DA280 is not set # CONFIG_DA311 is not set # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_DMARD10 is not set # CONFIG_FXLS8962AF_I2C is not set # CONFIG_FXLS8962AF_SPI is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MC3230 is not set # CONFIG_MMA7455_I2C is not set # CONFIG_MMA7455_SPI is not set # CONFIG_MMA7660 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MSA311 is not set # CONFIG_MXC4005 is not set # CONFIG_MXC6255 is not set # CONFIG_SCA3000 is not set # CONFIG_SCA3300 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7091R5 is not set # CONFIG_AD7124 is not set # CONFIG_AD7192 is not set # CONFIG_AD7266 is not set # CONFIG_AD7280 is not set # CONFIG_AD7291 is not set # CONFIG_AD7292 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_AD7780 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD7949 is not set # CONFIG_AD799X is not set # CONFIG_ADI_AXI_ADC is not set # CONFIG_AXP20X_ADC is not set # CONFIG_AXP288_ADC is not set # CONFIG_CC10001_ADC is not set # CONFIG_ENVELOPE_DETECTOR is not set # CONFIG_HI8435 is not set # CONFIG_HX711 is not set # CONFIG_INA2XX_ADC is not set # CONFIG_LTC2471 is not set # CONFIG_LTC2485 is not set # CONFIG_LTC2496 is not set # CONFIG_LTC2497 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX11100 is not set # CONFIG_MAX1118 is not set # CONFIG_MAX11205 is not set # CONFIG_MAX1241 is not set # CONFIG_MAX1363 is not set # CONFIG_MAX9611 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_MCP3911 is not set # CONFIG_NAU7802 is not set # CONFIG_RICHTEK_RTQ6056 is not set # CONFIG_SD_ADC_MODULATOR is not set # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC0832 is not set # CONFIG_TI_ADC084S021 is not set # CONFIG_TI_ADC12138 is not set # CONFIG_TI_ADC108S102 is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_TI_ADC161S626 is not set # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS7950 is not set # CONFIG_TI_ADS8344 is not set # CONFIG_TI_ADS8688 is not set # CONFIG_TI_ADS124S08 is not set # CONFIG_TI_ADS131E08 is not set # CONFIG_TI_TLC4541 is not set # CONFIG_TI_TSC2046 is not set # CONFIG_VF610_ADC is not set # CONFIG_XILINX_XADC is not set # end of Analog to digital converters # # Analog to digital and digital to analog converters # # CONFIG_AD74413R is not set # end of Analog to digital and digital to analog converters # # Analog Front Ends # # CONFIG_IIO_RESCALE is not set # end of Analog Front Ends # # Amplifiers # # CONFIG_AD8366 is not set # CONFIG_ADA4250 is not set # CONFIG_HMC425 is not set # end of Amplifiers # # Capacitance to digital converters # # CONFIG_AD7150 is not set # CONFIG_AD7746 is not set # end of Capacitance to digital converters # # Chemical Sensors # # CONFIG_ATLAS_PH_SENSOR is not set # CONFIG_ATLAS_EZO_SENSOR is not set # CONFIG_BME680 is not set # CONFIG_CCS811 is not set # CONFIG_IAQCORE is not set # CONFIG_PMS7003 is not set # CONFIG_SCD30_CORE is not set # CONFIG_SCD4X is not set # CONFIG_SENSIRION_SGP30 is not set # CONFIG_SENSIRION_SGP40 is not set # CONFIG_SPS30_I2C is not set # CONFIG_SPS30_SERIAL is not set # CONFIG_SENSEAIR_SUNRISE_CO2 is not set # CONFIG_VZ89X is not set # end of Chemical Sensors # # Hid Sensor IIO Common # # end of Hid Sensor IIO Common # # IIO SCMI Sensors # # end of IIO SCMI Sensors # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # end of SSP Sensor Common # # Digital to analog converters # # CONFIG_AD3552R is not set # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5592R is not set # CONFIG_AD5593R is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_LTC2688 is not set # CONFIG_AD5686_SPI is not set # CONFIG_AD5696_I2C is not set # CONFIG_AD5755 is not set # CONFIG_AD5758 is not set # CONFIG_AD5761 is not set # CONFIG_AD5764 is not set # CONFIG_AD5766 is not set # CONFIG_AD5770R is not set # CONFIG_AD5791 is not set # CONFIG_AD7293 is not set # CONFIG_AD7303 is not set # CONFIG_AD8801 is not set # CONFIG_DPOT_DAC is not set # CONFIG_DS4424 is not set # CONFIG_LTC1660 is not set # CONFIG_LTC2632 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # 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 # end of Digital to analog converters # # IIO dummy driver # # end of IIO dummy driver # # Filters # # CONFIG_ADMV8818 is not set # end of Filters # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # end of Clock Generator/Distribution # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # CONFIG_ADF4371 is not set # CONFIG_ADMV1013 is not set # CONFIG_ADMV1014 is not set # CONFIG_ADMV4420 is not set # CONFIG_ADRF6780 is not set # end of Phase-Locked Loop (PLL) frequency synthesizers # end of Frequency Synthesizers DDS/PLL # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS290 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_FXAS21002C is not set # CONFIG_MPU3050_I2C is not set # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # end of Digital gyroscope sensors # # Health Sensors # # # Heart Rate Monitors # # CONFIG_AFE4403 is not set # CONFIG_AFE4404 is not set # CONFIG_MAX30100 is not set # CONFIG_MAX30102 is not set # end of Heart Rate Monitors # end of Health Sensors # # Humidity sensors # # CONFIG_AM2315 is not set # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HDC2010 is not set # CONFIG_HTS221 is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # end of Humidity sensors # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16460 is not set # CONFIG_ADIS16475 is not set # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set # CONFIG_BOSCH_BNO055_SERIAL is not set # CONFIG_BOSCH_BNO055_I2C is not set # CONFIG_FXOS8700_I2C is not set # CONFIG_FXOS8700_SPI is not set # CONFIG_KMX61 is not set # CONFIG_INV_ICM42600_I2C is not set # CONFIG_INV_ICM42600_SPI is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set # CONFIG_IIO_ST_LSM6DSX is not set # CONFIG_IIO_ST_LSM9DS0 is not set # end of Inertial measurement units # # Light sensors # # CONFIG_ADJD_S311 is not set # CONFIG_ADUX1020 is not set # CONFIG_AL3010 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_AS73211 is not set # CONFIG_BH1750 is not set # CONFIG_BH1780 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM3605 is not set # CONFIG_CM36651 is not set # CONFIG_GP2AP002 is not set # CONFIG_GP2AP020A00F is not set # CONFIG_SENSORS_ISL29018 is not set # CONFIG_SENSORS_ISL29028 is not set # CONFIG_ISL29125 is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_LTRF216A is not set # CONFIG_LV0104CS is not set # CONFIG_MAX44000 is not set # CONFIG_MAX44009 is not set # CONFIG_NOA1305 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1133 is not set # CONFIG_SI1145 is not set # CONFIG_STK3310 is not set # CONFIG_ST_UVIS25 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set # CONFIG_SENSORS_TSL2563 is not set # CONFIG_TSL2583 is not set # CONFIG_TSL2591 is not set # CONFIG_TSL2772 is not set # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VCNL4035 is not set # CONFIG_VEML6030 is not set # CONFIG_VEML6070 is not set # CONFIG_VL6180 is not set # CONFIG_ZOPT2201 is not set # end of Light sensors # # Magnetometer sensors # # CONFIG_AK8974 is not set # CONFIG_AK8975 is not set # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN_I2C is not set # CONFIG_BMC150_MAGN_SPI is not set # CONFIG_MAG3110 is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # CONFIG_SENSORS_RM3100_I2C is not set # CONFIG_SENSORS_RM3100_SPI is not set # CONFIG_YAMAHA_YAS530 is not set # end of Magnetometer sensors # # Multiplexers # # CONFIG_IIO_MUX is not set # end of Multiplexers # # Inclinometer sensors # # end of Inclinometer sensors # # Triggers - standalone # # CONFIG_IIO_INTERRUPT_TRIGGER is not set # CONFIG_IIO_SYSFS_TRIGGER is not set # end of Triggers - standalone # # Linear and angular position sensors # # end of Linear and angular position sensors # # Digital potentiometers # # CONFIG_AD5110 is not set # CONFIG_AD5272 is not set # CONFIG_DS1803 is not set # CONFIG_MAX5432 is not set # CONFIG_MAX5481 is not set # CONFIG_MAX5487 is not set # CONFIG_MCP4018 is not set # CONFIG_MCP4131 is not set # CONFIG_MCP4531 is not set # CONFIG_MCP41010 is not set # CONFIG_TPL0102 is not set # end of Digital potentiometers # # Digital potentiostats # # CONFIG_LMP91000 is not set # end of Digital potentiostats # # Pressure sensors # # CONFIG_ABP060MG is not set # CONFIG_BMP280 is not set # CONFIG_DLHL60D is not set # CONFIG_DPS310 is not set # CONFIG_HP03 is not set # CONFIG_ICP10100 is not set # CONFIG_MPL115_I2C is not set # CONFIG_MPL115_SPI is not set # CONFIG_MPL3115 is not set # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # CONFIG_HP206C is not set # CONFIG_ZPA2326 is not set # end of Pressure sensors # # Lightning sensors # # CONFIG_AS3935 is not set # end of Lightning sensors # # Proximity and distance sensors # # CONFIG_ISL29501 is not set # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_MB1232 is not set # CONFIG_PING is not set # CONFIG_RFD77402 is not set # CONFIG_SRF04 is not set # CONFIG_SX9310 is not set # CONFIG_SX9324 is not set # CONFIG_SX9360 is not set # CONFIG_SX9500 is not set # CONFIG_SRF08 is not set # CONFIG_VCNL3020 is not set # CONFIG_VL53L0X_I2C is not set # end of Proximity and distance sensors # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1200 is not set # end of Resolver to digital converters # # Temperature sensors # # CONFIG_LTC2983 is not set # CONFIG_MAXIM_THERMOCOUPLE is not set # CONFIG_MLX90614 is not set # CONFIG_MLX90632 is not set # CONFIG_TMP006 is not set # CONFIG_TMP007 is not set # CONFIG_TMP117 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_MAX31856 is not set # CONFIG_MAX31865 is not set # end of Temperature sensors CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_DEBUG is not set # CONFIG_PWM_ATMEL_TCB is not set # CONFIG_PWM_CLK is not set # CONFIG_PWM_FSL_FTM is not set # CONFIG_PWM_PCA9685 is not set CONFIG_PWM_SUN4I=y # CONFIG_PWM_XILINX is not set # # IRQ chip support # CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 CONFIG_ARM_GIC_V3=y CONFIG_ARM_GIC_V3_ITS=y # CONFIG_AL_FIC is not set CONFIG_SUN6I_R_INTC=y CONFIG_SUNXI_NMI_INTC=y # CONFIG_XILINX_INTC is not set CONFIG_PARTITION_PERCPU=y # end of IRQ chip support # CONFIG_IPACK_BUS is not set CONFIG_ARCH_HAS_RESET_CONTROLLER=y CONFIG_RESET_CONTROLLER=y CONFIG_RESET_SIMPLE=y CONFIG_RESET_SUNXI=y # CONFIG_RESET_TI_SYSCON is not set # CONFIG_RESET_TI_TPS380X is not set # # PHY Subsystem # CONFIG_GENERIC_PHY=y CONFIG_PHY_XGENE=y # CONFIG_PHY_CAN_TRANSCEIVER is not set 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 # # PHY drivers for Broadcom platforms # # CONFIG_BCM_KONA_USB2_PHY is not set # end of PHY drivers for Broadcom platforms # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_DPHY_RX is not set # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_CADENCE_SALVO is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_LAN966X_SERDES is not set # CONFIG_PHY_CPCAP_USB is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set # CONFIG_PHY_OCELOT_SERDES is not set CONFIG_PHY_QCOM_USB_HS=y # CONFIG_PHY_QCOM_USB_HSIC is not set CONFIG_PHY_SAMSUNG_USB2=y # CONFIG_PHY_TUSB1210 is not set # end of PHY Subsystem # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCI_PMU is not set # CONFIG_ARM_CCN is not set # CONFIG_ARM_CMN is not set CONFIG_ARM_PMU=y # CONFIG_ARM_DSU_PMU is not set # CONFIG_ARM_SPE_PMU is not set # end of Performance monitor support CONFIG_RAS=y # # Android # # CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_LIBNVDIMM is not set # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y # CONFIG_NVMEM_RMEM is not set CONFIG_NVMEM_SUNXI_SID=y CONFIG_NVMEM_U_BOOT_ENV=y # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_FSI is not set # CONFIG_TEE is not set CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set # CONFIG_PECI is not set # CONFIG_HTE is not set # end of Device Drivers # # 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 CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_XFS_FS=m CONFIG_XFS_SUPPORT_V4=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_ONLINE_SCRUB is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_BTRFS_FS_REF_VERIFY is not set # CONFIG_NILFS2_FS is not set CONFIG_F2FS_FS=m CONFIG_F2FS_STAT_FS=y 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_FAULT_INJECTION is not set CONFIG_F2FS_FS_COMPRESSION=y CONFIG_F2FS_FS_LZO=y CONFIG_F2FS_FS_LZORLE=y CONFIG_F2FS_FS_LZ4=y CONFIG_F2FS_FS_LZ4HC=y CONFIG_F2FS_FS_ZSTD=y CONFIG_F2FS_IOSTAT=y # CONFIG_F2FS_UNFAIR_RWSEM is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QUOTA_DEBUG is not set # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS4_FS=y CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=m CONFIG_CUSE=m # CONFIG_VIRTIO_FS is not set CONFIG_OVERLAY_FS=m # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_XINO_AUTO is not set # CONFIG_OVERLAY_FS_METACOPY is not set # # Caches # # CONFIG_FSCACHE is not set # end of Caches # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=y # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=m CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set CONFIG_NTFS3_FS=m # CONFIG_NTFS3_64BIT_CLUSTER is not set # CONFIG_NTFS3_LZX_XPRESS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set CONFIG_PROC_VMCORE=y # CONFIG_PROC_VMCORE_DEVICE_DUMP is not set CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_TMPFS_INODE64 is not set CONFIG_ARCH_SUPPORTS_HUGETLBFS=y # CONFIG_HUGETLBFS is not set CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=y # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS2_FS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y # CONFIG_SQUASHFS_FILE_CACHE is not set CONFIG_SQUASHFS_FILE_DIRECT=y # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y CONFIG_SQUASHFS_XATTR=y CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 CONFIG_PSTORE_DEFLATE_COMPRESS=y # CONFIG_PSTORE_LZO_COMPRESS is not set # CONFIG_PSTORE_LZ4_COMPRESS is not set # CONFIG_PSTORE_LZ4HC_COMPRESS is not set # CONFIG_PSTORE_842_COMPRESS is not set # CONFIG_PSTORE_ZSTD_COMPRESS is not set CONFIG_PSTORE_COMPRESS=y CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" # CONFIG_PSTORE_CONSOLE is not set # CONFIG_PSTORE_PMSG is not set # CONFIG_PSTORE_RAM is not set # CONFIG_PSTORE_BLK is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y # CONFIG_NFS_SWAP is not set CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=m CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" # CONFIG_NFS_V4_1_MIGRATION is not set CONFIG_NFS_V4_SECURITY_LABEL=y CONFIG_ROOT_NFS=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFS_DISABLE_UDP_SUPPORT=y # CONFIG_NFS_V4_2_READ_PLUS is not set # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_COMMON=y CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS2=y CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set CONFIG_CIFS_DEBUG=y # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DEBUG_DUMP_KEYS is not set # CONFIG_CIFS_DFS_UPCALL is not set # CONFIG_CIFS_SWN_UPCALL is not set # CONFIG_CIFS_ROOT is not set # CONFIG_SMB_SERVER is not set CONFIG_SMBFS=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_BIG_KEYS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEY_DH_OPERATIONS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set CONFIG_SECURITY=y CONFIG_SECURITYFS=y # CONFIG_SECURITY_NETWORK is not set # CONFIG_SECURITY_PATH is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_SECURITY_SMACK is not set # CONFIG_SECURITY_TOMOYO is not set # 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_SECURITY_LOCKDOWN_LSM is not set # CONFIG_SECURITY_LANDLOCK is not set CONFIG_INTEGRITY=y # CONFIG_INTEGRITY_SIGNATURE is not set # CONFIG_IMA is not set # CONFIG_EVM is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_LSM="yama,loadpin,safesetid,integrity" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_STACK_ALL_PATTERN is not set # CONFIG_INIT_STACK_ALL_ZERO is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization CONFIG_RANDSTRUCT_NONE=y # end of Kernel hardening options # end of Security options CONFIG_XOR_BLOCKS=m CONFIG_ASYNC_TX_DISABLE_PQ_VAL_DMA=y CONFIG_ASYNC_TX_DISABLE_XOR_VAL_DMA=y CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_ENGINE=y # end of Crypto core or helper # # Public-key cryptography # CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y # CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set CONFIG_CRYPTO_ECC=m CONFIG_CRYPTO_ECDH=m # CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set # end of Public-key cryptography # # Block ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set CONFIG_CRYPTO_SM4=y # CONFIG_CRYPTO_SM4_GENERIC is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_ARC4 is not set CONFIG_CRYPTO_CHACHA20=m CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set CONFIG_CRYPTO_CTR=y # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set CONFIG_CRYPTO_NHPOLY1305=y # end of Length-preserving ciphers and modes # # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y # CONFIG_CRYPTO_ESSIV is not set # end of AEAD (authenticated encryption with associated data) ciphers # # Hashes, digests, and MACs # CONFIG_CRYPTO_BLAKE2B=m CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set CONFIG_CRYPTO_POLYVAL=y # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y CONFIG_CRYPTO_SHA3=m CONFIG_CRYPTO_SM3=y CONFIG_CRYPTO_SM3_GENERIC=m # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_XCBC is not set CONFIG_CRYPTO_XXHASH=m # end of Hashes, digests, and MACs # # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=m CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_CRC64_ROCKSOFT=y # end of CRCs (cyclic redundancy checks) # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_LZO is not set # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # end of Compression # # Random number generation # CONFIG_CRYPTO_ANSI_CPRNG=y CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation # # Userspace interface # CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set CONFIG_CRYPTO_USER_API_AEAD=y CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y CONFIG_CRYPTO_NHPOLY1305_NEON=y CONFIG_CRYPTO_CHACHA20_NEON=y # # Accelerated Cryptographic Algorithms for CPU (arm64) # CONFIG_CRYPTO_GHASH_ARM64_CE=y CONFIG_CRYPTO_POLY1305_NEON=y CONFIG_CRYPTO_SHA1_ARM64_CE=y CONFIG_CRYPTO_SHA256_ARM64=y CONFIG_CRYPTO_SHA2_ARM64_CE=y CONFIG_CRYPTO_SHA512_ARM64=y CONFIG_CRYPTO_SHA512_ARM64_CE=y # CONFIG_CRYPTO_SHA3_ARM64 is not set CONFIG_CRYPTO_SM3_NEON=y # CONFIG_CRYPTO_SM3_ARM64_CE is not set CONFIG_CRYPTO_POLYVAL_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64=y CONFIG_CRYPTO_AES_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64_CE_BLK=y CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y CONFIG_CRYPTO_AES_ARM64_BS=y # CONFIG_CRYPTO_SM4_ARM64_CE is not set CONFIG_CRYPTO_SM4_ARM64_CE_BLK=y CONFIG_CRYPTO_SM4_ARM64_NEON_BLK=y CONFIG_CRYPTO_AES_ARM64_CE_CCM=y CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=y # end of Accelerated Cryptographic Algorithms for CPU (arm64) CONFIG_CRYPTO_HW=y CONFIG_CRYPTO_DEV_ALLWINNER=y # CONFIG_CRYPTO_DEV_SUN4I_SS is not set CONFIG_CRYPTO_DEV_SUN8I_CE=y # CONFIG_CRYPTO_DEV_SUN8I_CE_DEBUG is not set CONFIG_CRYPTO_DEV_SUN8I_CE_HASH=y CONFIG_CRYPTO_DEV_SUN8I_CE_PRNG=y CONFIG_CRYPTO_DEV_SUN8I_CE_TRNG=y CONFIG_CRYPTO_DEV_SUN8I_SS=y # CONFIG_CRYPTO_DEV_SUN8I_SS_DEBUG is not set CONFIG_CRYPTO_DEV_SUN8I_SS_PRNG=y CONFIG_CRYPTO_DEV_SUN8I_SS_HASH=y # CONFIG_CRYPTO_DEV_ATMEL_ECC is not set # CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set # CONFIG_CRYPTO_DEV_CCP is not set # CONFIG_CRYPTO_DEV_SAFEXCEL is not set # CONFIG_CRYPTO_DEV_CCREE is not set # CONFIG_CRYPTO_DEV_HISI_SEC is not set # CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS8_PRIVATE_KEY_PARSER=m CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m CONFIG_RAID6_PQ_BENCHMARK=y CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y # CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y CONFIG_INDIRECT_PIO=y # # Crypto library routines # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y CONFIG_CRYPTO_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=y CONFIG_CRYPTO_LIB_CURVE25519=y CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y CONFIG_CRYPTO_LIB_POLY1305=y CONFIG_CRYPTO_LIB_CHACHA20POLY1305=y CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_CRC_CCITT=m CONFIG_CRC16=y CONFIG_CRC_T10DIF=y CONFIG_CRC64_ROCKSOFT=y CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set CONFIG_CRC64=y # CONFIG_CRC4 is not set CONFIG_CRC7=y CONFIG_LIBCRC32C=m # CONFIG_CRC8 is not set CONFIG_XXHASH=y CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_COMPRESS=m CONFIG_LZ4HC_COMPRESS=m CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=m CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y CONFIG_XZ_DEC_POWERPC=y CONFIG_XZ_DEC_IA64=y CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y CONFIG_XZ_DEC_SPARC=y # CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_LZ4=y CONFIG_DECOMPRESS_ZSTD=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_DMA_DECLARE_COHERENT=y CONFIG_ARCH_HAS_SETUP_DMA_OPS=y CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y CONFIG_SWIOTLB=y # CONFIG_DMA_RESTRICTED_POOL is not set CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_COHERENT_POOL=y CONFIG_DMA_DIRECT_REMAP=y CONFIG_DMA_CMA=y CONFIG_DMA_PERNUMA_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_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y # CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_TIME_NS=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_ARCH_STACKWALK=y CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y # end of Library routines CONFIG_GENERIC_IOREMAP=y CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set # CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set # CONFIG_DYNAMIC_DEBUG is not set # CONFIG_DYNAMIC_DEBUG_CORE is not set CONFIG_SYMBOLIC_ERRNAME=y CONFIG_DEBUG_BUGVERBOSE=y # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Compile-time checks and compiler options # CONFIG_DEBUG_INFO=y CONFIG_AS_HAS_NON_CONST_LEB128=y # CONFIG_DEBUG_INFO_NONE is not set CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_INFO_COMPRESSED is not set # CONFIG_DEBUG_INFO_SPLIT is not set # CONFIG_DEBUG_INFO_BTF is not set # CONFIG_GDB_SCRIPTS is not set CONFIG_FRAME_WARN=2048 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y # CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set CONFIG_HAVE_ARCH_KCSAN=y CONFIG_HAVE_KCSAN_COMPILER=y # CONFIG_KCSAN is not set # end of Generic Kernel Debugging Instruments # # Networking Debugging # # CONFIG_NET_DEV_REFCNT_TRACKER is not set # CONFIG_NET_NS_REFCNT_TRACKER is not set # CONFIG_DEBUG_NET is not set # end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_PTDUMP_DEBUGFS is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM_PGTABLE is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_KASAN_SW_TAGS=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y # CONFIG_KFENCE is not set # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 # CONFIG_SOFTLOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # # CONFIG_SCHED_DEBUG is not set CONFIG_SCHED_INFO=y # CONFIG_SCHEDSTATS is not set # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set # CONFIG_DEBUG_PREEMPT is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_SAMPLES is not set CONFIG_STRICT_DEVMEM=y # CONFIG_IO_STRICT_DEVMEM is not set # # arm64 Debugging # # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_ARM64_RELOC_TEST is not set # CONFIG_CORESIGHT is not set # end of arm64 Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set # CONFIG_TEST_MIN_HEAP is not set # CONFIG_TEST_DIV64 is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_TEST_REF_TRACKER is not set # CONFIG_RBTREE_TEST is not set # CONFIG_REED_SOLOMON_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set # CONFIG_STRING_SELFTEST is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_STRSCPY is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_SCANF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_XARRAY is not set # CONFIG_TEST_MAPLE_TREE is not set # CONFIG_TEST_RHASHTABLE is not set # CONFIG_TEST_SIPHASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_BITOPS is not set # CONFIG_TEST_VMALLOC is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_TEST_BLACKHOLE_DEV is not set # CONFIG_FIND_BIT_BENCHMARK is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_SYSCTL is not set # CONFIG_TEST_UDELAY is not set # CONFIG_TEST_STATIC_KEYS is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMCAT_P is not set # CONFIG_TEST_MEMINIT is not set # CONFIG_TEST_FREE_PAGES is not set CONFIG_ARCH_USE_MEMTEST=y CONFIG_MEMTEST=y # end of Kernel Testing and Coverage # # Rust hacking # # end of Rust hacking # end of Kernel hacking ================================================ FILE: projects/Allwinner/linux/linux.arm.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm 6.1.63 Kernel Configuration # CONFIG_CC_VERSION_TEXT="armv7ve-libreelec-linux-gnueabihf-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION_AUTO=y CONFIG_BUILD_SALT="" CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_LZMA=y CONFIG_HAVE_KERNEL_XZ=y CONFIG_HAVE_KERNEL_LZO=y CONFIG_HAVE_KERNEL_LZ4=y # CONFIG_KERNEL_GZIP is not set # CONFIG_KERNEL_LZMA is not set # CONFIG_KERNEL_XZ is not set # CONFIG_KERNEL_LZO is not set CONFIG_KERNEL_LZ4=y CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_IRQ_FASTEOI_HIERARCHY_HANDLERS=y CONFIG_GENERIC_IRQ_IPI=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_GENERIC_IRQ_MULTI_HANDLER=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_CONTEXT_TRACKING=y CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y # CONFIG_BPF_JIT is not set # CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_BPF_PRELOAD is not set # end of BPF subsystem CONFIG_PREEMPT_BUILD=y # CONFIG_PREEMPT_NONE is not set # CONFIG_PREEMPT_VOLUNTARY is not set CONFIG_PREEMPT=y CONFIG_PREEMPT_COUNT=y CONFIG_PREEMPTION=y # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set CONFIG_SCHED_THERMAL_PRESSURE=y # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_TASKSTATS is not set # CONFIG_PSI is not set # end of CPU/Task time and stats accounting CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y CONFIG_PREEMPT_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_RCU=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem CONFIG_IKCONFIG=m CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=17 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 # CONFIG_PRINTK_INDEX is not set CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # # CONFIG_UCLAMP_TASK is not set # end of Scheduler features CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set CONFIG_CGROUP_PIDS=y # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y # CONFIG_CGROUP_MISC is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" # CONFIG_INITRAMFS_FORCE is not set CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 CONFIG_RD_GZIP=y # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set # CONFIG_RD_LZ4 is not set CONFIG_RD_ZSTD=y # CONFIG_INITRAMFS_COMPRESSION_GZIP is not set # CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set CONFIG_INITRAMFS_COMPRESSION_NONE=y # CONFIG_BOOT_CONFIG is not set CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_EXPERT=y CONFIG_UID16=y CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set CONFIG_SYSFS_SYSCALL=y CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y 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 # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set # CONFIG_EMBEDDED is not set CONFIG_HAVE_PERF_EVENTS=y CONFIG_PERF_USE_VMALLOC=y # CONFIG_PC104 is not set # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_SYSTEM_DATA_VERIFICATION=y # CONFIG_PROFILING is not set # end of General setup CONFIG_ARM=y CONFIG_ARM_HAS_GROUP_RELOCS=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y CONFIG_HAVE_PROC_CPU=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_LOCKDEP_SUPPORT=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_ARM_PATCH_PHYS_VIRT=y CONFIG_GENERIC_BUG=y CONFIG_PGTABLE_LEVELS=2 # # System Type # CONFIG_MMU=y CONFIG_ARCH_MMAP_RND_BITS_MIN=8 CONFIG_ARCH_MMAP_RND_BITS_MAX=16 CONFIG_ARCH_MULTIPLATFORM=y # # Platform selection # # # CPU Core family selection # # CONFIG_ARCH_MULTI_V6 is not set CONFIG_ARCH_MULTI_V7=y CONFIG_ARCH_MULTI_V6_V7=y # end of Platform selection # CONFIG_ARCH_VIRT is not set # CONFIG_ARCH_AIROHA is not set # CONFIG_ARCH_ACTIONS is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_ARTPEC is not set # CONFIG_ARCH_ASPEED is not set # CONFIG_ARCH_AT91 is not set # CONFIG_ARCH_BCM is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_DIGICOLOR is not set # CONFIG_ARCH_DOVE is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_HIGHBANK is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_HPE is not set # CONFIG_ARCH_MXC is not set # 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_MSTARV7 is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_NPCM is not set # # TI OMAP/AM/DM/DRA Family # # CONFIG_ARCH_OMAP3 is not set # CONFIG_ARCH_OMAP4 is not set # CONFIG_SOC_OMAP5 is not set # CONFIG_SOC_AM33XX is not set # CONFIG_SOC_AM43XX is not set # CONFIG_SOC_DRA7XX is not set # end of TI OMAP/AM/DM/DRA Family # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_RDA is not set # CONFIG_ARCH_REALTEK is not set # CONFIG_ARCH_ROCKCHIP is not set # CONFIG_ARCH_S5PV210 is not set # CONFIG_ARCH_RENESAS is not set # CONFIG_ARCH_INTEL_SOCFPGA is not set # CONFIG_PLAT_SPEAR is not set # CONFIG_ARCH_STI is not set # CONFIG_ARCH_STM32 is not set # CONFIG_ARCH_SUNPLUS is not set CONFIG_ARCH_SUNXI=y # CONFIG_MACH_SUN4I is not set # CONFIG_MACH_SUN5I is not set # CONFIG_MACH_SUN6I is not set # CONFIG_MACH_SUN7I is not set CONFIG_MACH_SUN8I=y # CONFIG_MACH_SUN9I is not set CONFIG_ARCH_SUNXI_MC_SMP=y # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_U8500 is not set # CONFIG_ARCH_REALVIEW is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_WM8850 is not set # CONFIG_ARCH_ZYNQ is not set # # Processor Type # CONFIG_CPU_V7=y CONFIG_CPU_THUMB_CAPABLE=y CONFIG_CPU_32v6K=y CONFIG_CPU_32v7=y CONFIG_CPU_ABRT_EV7=y CONFIG_CPU_PABRT_V7=y CONFIG_CPU_CACHE_V7=y CONFIG_CPU_CACHE_VIPT=y CONFIG_CPU_COPY_V6=y CONFIG_CPU_TLB_V7=y CONFIG_CPU_HAS_ASID=y CONFIG_CPU_CP15=y CONFIG_CPU_CP15_MMU=y # # Processor Features # # CONFIG_ARM_LPAE is not set CONFIG_ARM_THUMB=y # CONFIG_ARM_THUMBEE is not set CONFIG_ARM_VIRT_EXT=y CONFIG_SWP_EMULATE=y CONFIG_CPU_LITTLE_ENDIAN=y # CONFIG_CPU_BIG_ENDIAN is not set # CONFIG_CPU_ICACHE_DISABLE is not set # CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND is not set # CONFIG_CPU_BPREDICT_DISABLE is not set CONFIG_CPU_SPECTRE=y # CONFIG_HARDEN_BRANCH_PREDICTOR is not set CONFIG_HARDEN_BRANCH_HISTORY=y CONFIG_KUSER_HELPERS=y CONFIG_VDSO=y CONFIG_OUTER_CACHE=y CONFIG_OUTER_CACHE_SYNC=y CONFIG_MIGHT_HAVE_CACHE_L2X0=y CONFIG_CACHE_L2X0=y # CONFIG_CACHE_L2X0_PMU is not set # CONFIG_PL310_ERRATA_588369 is not set # CONFIG_PL310_ERRATA_727915 is not set # CONFIG_PL310_ERRATA_753970 is not set # CONFIG_PL310_ERRATA_769419 is not set CONFIG_ARM_L1_CACHE_SHIFT_6=y CONFIG_ARM_L1_CACHE_SHIFT=6 CONFIG_ARM_DMA_MEM_BUFFERABLE=y CONFIG_ARM_HEAVY_MB=y CONFIG_DEBUG_ALIGN_RODATA=y # CONFIG_ARM_ERRATA_430973 is not set # CONFIG_ARM_ERRATA_643719 is not set # CONFIG_ARM_ERRATA_720789 is not set # CONFIG_ARM_ERRATA_754322 is not set # CONFIG_ARM_ERRATA_754327 is not set # CONFIG_ARM_ERRATA_764369 is not set # CONFIG_ARM_ERRATA_764319 is not set # CONFIG_ARM_ERRATA_775420 is not set # CONFIG_ARM_ERRATA_798181 is not set # CONFIG_ARM_ERRATA_773022 is not set # CONFIG_ARM_ERRATA_818325_852422 is not set # CONFIG_ARM_ERRATA_821420 is not set # CONFIG_ARM_ERRATA_825619 is not set # CONFIG_ARM_ERRATA_857271 is not set # CONFIG_ARM_ERRATA_852421 is not set # CONFIG_ARM_ERRATA_852423 is not set # CONFIG_ARM_ERRATA_857272 is not set # end of System Type # # Bus support # # CONFIG_ARM_ERRATA_814220 is not set # end of Bus support # # Kernel Features # CONFIG_HAVE_SMP=y CONFIG_SMP=y CONFIG_SMP_ON_UP=y CONFIG_CURRENT_POINTER_IN_TPIDRURO=y CONFIG_IRQSTACKS=y CONFIG_ARM_CPU_TOPOLOGY=y # CONFIG_SCHED_MC is not set # CONFIG_SCHED_SMT is not set CONFIG_HAVE_ARM_ARCH_TIMER=y # CONFIG_MCPM is not set # CONFIG_BIG_LITTLE is not set CONFIG_VMSPLIT_3G=y # CONFIG_VMSPLIT_3G_OPT is not set # CONFIG_VMSPLIT_2G is not set # CONFIG_VMSPLIT_1G is not set CONFIG_PAGE_OFFSET=0xC0000000 CONFIG_NR_CPUS=8 CONFIG_HOTPLUG_CPU=y CONFIG_ARM_PSCI=y CONFIG_ARCH_NR_GPIO=416 CONFIG_HZ_FIXED=0 CONFIG_HZ_100=y # CONFIG_HZ_200 is not set # CONFIG_HZ_250 is not set # CONFIG_HZ_300 is not set # CONFIG_HZ_500 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=100 CONFIG_SCHED_HRTICK=y # CONFIG_THUMB2_KERNEL is not set CONFIG_ARM_PATCH_IDIV=y CONFIG_AEABI=y # CONFIG_OABI_COMPAT is not set CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ARCH_FLATMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_HIGHMEM=y CONFIG_HIGHPTE=y CONFIG_CPU_SW_DOMAIN_PAN=y CONFIG_HW_PERF_EVENTS=y # CONFIG_ARM_MODULE_PLTS is not set CONFIG_ARCH_FORCE_MAX_ORDER=11 CONFIG_ALIGNMENT_TRAP=y # CONFIG_UACCESS_WITH_MEMCPY is not set # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_XEN is not set CONFIG_CC_HAVE_STACKPROTECTOR_TLS=y # end of Kernel Features # # Boot options # CONFIG_USE_OF=y CONFIG_ATAGS=y # CONFIG_UNUSED_BOARD_FILES is not set # CONFIG_DEPRECATED_PARAM_STRUCT is not set CONFIG_ZBOOT_ROM_TEXT=0 CONFIG_ZBOOT_ROM_BSS=0 # CONFIG_ARM_APPENDED_DTB is not set CONFIG_CMDLINE="root=/dev/ram0 rdinit=/init" # CONFIG_CMDLINE_FROM_BOOTLOADER is not set CONFIG_CMDLINE_EXTEND=y # CONFIG_CMDLINE_FORCE is not set # CONFIG_KEXEC is not set # CONFIG_CRASH_DUMP is not set CONFIG_AUTO_ZRELADDR=y # CONFIG_EFI is not set # end of Boot options # # CPU Power Management # # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y # CONFIG_CPU_FREQ_STAT is not set CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y # CONFIG_CPU_FREQ_GOV_USERSPACE is not set CONFIG_CPU_FREQ_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y CONFIG_CPUFREQ_DT_PLATDEV=y # CONFIG_ARM_ALLWINNER_SUN50I_CPUFREQ_NVMEM is not set # end of CPU Frequency scaling # # CPU Idle # 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 # # CONFIG_ARM_CPUIDLE is not set # CONFIG_ARM_PSCI_CPUIDLE is not set # CONFIG_ARM_HIGHBANK_CPUIDLE is not set # end of ARM CPU Idle Drivers # end of CPU Idle # end of CPU Power Management # # Floating point emulation # # # At least one emulation must be selected # CONFIG_VFP=y CONFIG_VFPv3=y CONFIG_NEON=y # CONFIG_KERNEL_MODE_NEON is not set # end of Floating point emulation # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_SUSPEND_SKIP_SYNC is not set # CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_USERSPACE_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y # CONFIG_PM_DEBUG is not set # CONFIG_APM_EMULATION is not set CONFIG_PM_CLK=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_CPU_PM=y # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ARM_CPU_SUSPEND=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y # end of Power management options CONFIG_AS_VFP_VMRS_FPINST=y # # General architecture-dependent options # # CONFIG_KPROBES is not set # CONFIG_JUMP_LABEL is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_ARCH_USE_BUILTIN_BSWAP=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_KEEPINITRD=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_CPU_FINALIZE_INIT=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_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_STACKPROTECTOR=y # CONFIG_STACKPROTECTOR is not set CONFIG_LTO_NONE=y CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_REL=y CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=8 CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_HAVE_ARCH_PFN_VALID=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y # CONFIG_GCC_PLUGINS is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_GZIP is not set # CONFIG_MODULE_COMPRESS_XZ is not set # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y # CONFIG_BLOCK_LEGACY_AUTOLOAD is not set CONFIG_BLK_CGROUP_RWSTAT=y CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_DEV_THROTTLING_LOW is not set # CONFIG_BLK_WBT is not set CONFIG_BLK_CGROUP_IOLATENCY=y # CONFIG_BLK_CGROUP_IOCOST is not set # CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set CONFIG_LDM_PARTITION=y # CONFIG_LDM_DEBUG is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set # end of Partition Types CONFIG_BLK_PM=y CONFIG_BLOCK_HOLDER_DEPRECATED=y CONFIG_BLK_MQ_STACKING=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y # CONFIG_IOSCHED_BFQ is not set # end of IO Schedulers CONFIG_ASN1=y CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_ELF_FDPIC is not set CONFIG_ELFCORE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y CONFIG_ARCH_HAS_BINFMT_FLAT=y # CONFIG_BINFMT_FLAT is not set CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # CONFIG_SWAP=y # CONFIG_ZSWAP is not set # # SLAB allocator options # # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y # end of SLAB allocator options # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set CONFIG_COMPAT_BRK=y CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_ARCH_KEEP_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_COMPACTION=y CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 # CONFIG_PAGE_REPORTING is not set CONFIG_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_BOUNCE=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set CONFIG_CMA_DEBUGFS=y CONFIG_CMA_SYSFS=y CONFIG_CMA_AREAS=7 CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set CONFIG_KMAP_LOCAL=y CONFIG_KMAP_LOCAL_NON_LINEAR_PTE_ARRAY=y # CONFIG_ANON_VMA_NAME is not set # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set CONFIG_LOCK_MM_AND_FIND_VMA=y # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y CONFIG_NET_INGRESS=y CONFIG_NET_EGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_INTERFACE is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_ESP=y # CONFIG_NET_KEY is not set # CONFIG_XDP_SOCKETS is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=y CONFIG_IP_MROUTE_COMMON=y CONFIG_IP_MROUTE=y # CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set # CONFIG_IP_PIMSM_V1 is not set # CONFIG_IP_PIMSM_V2 is not set # CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set CONFIG_INET_ESP=y # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=y # CONFIG_INET_DIAG is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_IPV6_VTI is not set CONFIG_IPV6_SIT=y # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set CONFIG_IPV6_FOU=m # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set # CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NET_PTP_CLASSIFY=y # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_EGRESS=y CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_FAMILY_BRIDGE=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set # CONFIG_NETFILTER_NETLINK_LOG is not set # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=m # CONFIG_NF_LOG_SYSLOG is not set # CONFIG_NF_CONNTRACK_MARK is not set # CONFIG_NF_CONNTRACK_ZONES is not set CONFIG_NF_CONNTRACK_PROCFS=y # CONFIG_NF_CONNTRACK_EVENTS is not set # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set # CONFIG_NF_CONNTRACK_IRC is not set # CONFIG_NF_CONNTRACK_NETBIOS_NS is not set # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set # CONFIG_NF_CONNTRACK_SIP is not set CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m CONFIG_NF_NAT=m 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 # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set CONFIG_NETFILTER_XT_MATCH_IPVS=m # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_NETFILTER_XT_MATCH_OWNER is not set # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set # CONFIG_NETFILTER_XT_MATCH_STATE is not set # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set CONFIG_IP_VS=m # CONFIG_IP_VS_IPV6 is not set # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # CONFIG_IP_VS_PROTO_ESP is not set # CONFIG_IP_VS_PROTO_AH is not set # CONFIG_IP_VS_PROTO_SCTP is not set # # IPVS scheduler # CONFIG_IP_VS_RR=m # CONFIG_IP_VS_WRR is not set # CONFIG_IP_VS_LC is not set # CONFIG_IP_VS_WLC is not set # CONFIG_IP_VS_FO is not set # CONFIG_IP_VS_OVF is not set # CONFIG_IP_VS_LBLC is not set # CONFIG_IP_VS_LBLCR is not set # CONFIG_IP_VS_DH is not set # CONFIG_IP_VS_SH is not set # CONFIG_IP_VS_MH is not set # CONFIG_IP_VS_SED is not set # CONFIG_IP_VS_NQ is not set # CONFIG_IP_VS_TWOS is not set # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS MH scheduler # CONFIG_IP_VS_MH_TAB_INDEX=12 # # IPVS application helper # # CONFIG_IP_VS_FTP is not set CONFIG_IP_VS_NFCT=y # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set CONFIG_NF_REJECT_IPV4=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_ARPTABLES is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m # CONFIG_NF_LOG_IPV6 is not set CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_MATCH_SRH is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m # CONFIG_IP6_NF_TARGET_NPT is not set # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_CONNTRACK_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y # CONFIG_BRIDGE_MRP is not set # CONFIG_BRIDGE_CFM is not set # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set # CONFIG_NET_SCH_FQ_CODEL is not set # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set # CONFIG_NET_SCH_DEFAULT is not set # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_FLOW is not set CONFIG_NET_CLS_CGROUP=m # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set CONFIG_NET_L3_MASTER_DEV=y # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_STREAM_PARSER is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # end of Network testing # end of Networking options # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=m CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y CONFIG_BT_BNEP=m CONFIG_BT_BNEP_MC_FILTER=y CONFIG_BT_BNEP_PROTO_FILTER=y CONFIG_BT_HIDP=m CONFIG_BT_HS=y CONFIG_BT_LE=y CONFIG_BT_LEDS=y # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set # CONFIG_BT_DEBUGFS is not set # CONFIG_BT_SELFTEST is not set # CONFIG_BT_FEATURE_DEBUG is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_QCA=m CONFIG_BT_MTK=m CONFIG_BT_HCIBTUSB=m # CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set CONFIG_BT_HCIBTUSB_BCM=y # CONFIG_BT_HCIBTUSB_MTK is not set 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_RTL=y CONFIG_BT_HCIUART_QCA=y CONFIG_BT_HCIUART_AG6XX=y CONFIG_BT_HCIUART_MRVL=y CONFIG_BT_HCIBCM203X=m CONFIG_BT_HCIBPA10X=m CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIVHCI=m CONFIG_BT_MRVL=m CONFIG_BT_MRVL_SDIO=m CONFIG_BT_ATH3K=m # CONFIG_BT_MTKSDIO is not set CONFIG_BT_MTKUART=m # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_SPY=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set CONFIG_CFG80211_CRDA_SUPPORT=y CONFIG_CFG80211_WEXT=y CONFIG_LIB80211=m CONFIG_LIB80211_CRYPT_WEP=m CONFIG_LIB80211_CRYPT_CCMP=m # CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=m CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y CONFIG_RFKILL_GPIO=m # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_PAGE_POOL=y # CONFIG_PAGE_POOL_STATS is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y # # Device Drivers # CONFIG_HAVE_PCI=y # CONFIG_PCI is not set # CONFIG_PCCARD is not set # # Generic Driver Options # # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y # CONFIG_DEVTMPFS_SAFE is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set CONFIG_FW_CACHE=y # CONFIG_FW_UPLOAD is not set # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y CONFIG_ALLOW_DEV_COREDUMP=y CONFIG_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_SOC_BUS=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set CONFIG_GENERIC_ARCH_TOPOLOGY=y # end of Generic Driver Options # # Bus devices # CONFIG_ARM_CCI=y CONFIG_ARM_CCI400_COMMON=y CONFIG_ARM_CCI400_PORT_CTRL=y # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_MOXTET is not set CONFIG_SUN50I_DE2_BUS=y CONFIG_SUNXI_RSB=y # CONFIG_VEXPRESS_CONFIG is not set # CONFIG_MHI_BUS is not set # CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # # CONFIG_ARM_SCMI_PROTOCOL is not set # end of ARM System Control and Management Interface Protocol # CONFIG_FIRMWARE_MEMMAP is not set # CONFIG_FW_CFG_SYSFS is not set # CONFIG_TRUSTED_FOUNDATIONS is not set # CONFIG_GOOGLE_FIRMWARE is not set CONFIG_ARM_PSCI_FW=y # CONFIG_ARM_PSCI_CHECKER is not set CONFIG_HAVE_ARM_SMCCC=y CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y CONFIG_ARM_SMCCC_SOC_ID=y # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set # CONFIG_MTD is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_DYNAMIC=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_RESERVED_MEM=y CONFIG_OF_RESOLVE=y CONFIG_OF_OVERLAY=y CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_CDROM=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=0 # CONFIG_BLK_DEV_DRBD is not set CONFIG_BLK_DEV_NBD=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=4096 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_UBLK is not set # # NVME Support # # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set # CONFIG_NVME_TARGET is not set # end of NVME Support # # Misc devices # # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set # CONFIG_XILINX_SDFEC is not set # CONFIG_OPEN_DICE is not set # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # CONFIG_ECHO is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_PVPANIC is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=m CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set CONFIG_SCSI_CONSTANTS=y # CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_SCAN_ASYNC is not set # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_DH is not set # end of SCSI device support CONFIG_ATA=y CONFIG_SATA_HOST=y CONFIG_ATA_VERBOSE_ERROR=y CONFIG_ATA_FORCE=y CONFIG_SATA_PMP=y # # Controllers with non-SFF native interface # # CONFIG_SATA_AHCI_PLATFORM is not set # CONFIG_AHCI_DWC is not set # CONFIG_AHCI_CEVA is not set CONFIG_AHCI_SUNXI=y # CONFIG_AHCI_QORIQ is not set CONFIG_ATA_SFF=y # # SFF controllers with custom DMA interface # CONFIG_ATA_BMDMA=y # # SATA SFF controllers with BMDMA # # CONFIG_SATA_DWC is not set # # PATA SFF controllers with BMDMA # # # PIO-only SFF controllers # # CONFIG_PATA_OF_PLATFORM is not set # # Generic fallback / legacy drivers # CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=m # CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m # CONFIG_DM_UNSTRIPED is not set # CONFIG_DM_CRYPT is not set # CONFIG_DM_SNAPSHOT is not set CONFIG_DM_THIN_PROVISIONING=m # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_ERA is not set # CONFIG_DM_CLONE is not set # CONFIG_DM_MIRROR is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_DUST is not set # CONFIG_DM_UEVENT is not set # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_DM_INTEGRITY is not set # CONFIG_TARGET_CORE is not set CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set CONFIG_DUMMY=m CONFIG_WIREGUARD=m # CONFIG_WIREGUARD_DEBUG is not set # CONFIG_EQUALIZER is not set # 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 # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_AMT is not set # CONFIG_MACSEC is not set CONFIG_NETCONSOLE=y # CONFIG_NETCONSOLE_DYNAMIC is not set CONFIG_NETPOLL=y CONFIG_NET_POLL_CONTROLLER=y CONFIG_TUN=y # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m CONFIG_NLMON=m CONFIG_ETHERNET=y CONFIG_NET_VENDOR_ALACRITECH=y CONFIG_NET_VENDOR_ALLWINNER=y CONFIG_SUN4I_EMAC=y # CONFIG_ALTERA_TSE is not set CONFIG_NET_VENDOR_AMAZON=y CONFIG_NET_VENDOR_AQUANTIA=y # CONFIG_NET_VENDOR_ARC is not set # CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_BROADCOM is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CIRRUS is not set CONFIG_NET_VENDOR_CORTINA=y # CONFIG_GEMINI_ETHERNET is not set # CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_ENGLEDER is not set CONFIG_NET_VENDOR_EZCHIP=y # CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set # CONFIG_NET_VENDOR_FARADAY is not set # CONFIG_NET_VENDOR_FUNGIBLE is not set # CONFIG_NET_VENDOR_GOOGLE is not set CONFIG_NET_VENDOR_HISILICON=y # CONFIG_HIX5HD2_GMAC is not set # CONFIG_HISI_FEMAC is not set # CONFIG_HIP04_ETH is not set # CONFIG_HNS_DSAF is not set # CONFIG_HNS_ENET is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_INTEL is not set # CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_NET_VENDOR_ADI is not set # CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set CONFIG_NET_VENDOR_MICROSEMI=y # CONFIG_NET_VENDOR_MICROSOFT is not set CONFIG_NET_VENDOR_NI=y # CONFIG_NI_XGE_MANAGEMENT_ENET is not set # CONFIG_NET_VENDOR_NATSEMI is not set CONFIG_NET_VENDOR_NETRONOME=y # CONFIG_ETHOC is not set # CONFIG_NET_VENDOR_PENSANDO 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 CONFIG_NET_VENDOR_ROCKER=y # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set CONFIG_NET_VENDOR_SOLARFLARE=y # CONFIG_NET_VENDOR_SMSC is not set CONFIG_NET_VENDOR_SOCIONEXT=y CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=y # CONFIG_STMMAC_SELFTESTS is not set 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_INTEL_PLAT is not set CONFIG_NET_VENDOR_SYNOPSYS=y # CONFIG_DWC_XLGMAC is not set # CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set CONFIG_PHYLINK=y CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_SFP is not set # # MII PHY device drivers # # CONFIG_AC200_PHY is not set # CONFIG_AMD_PHY is not set # CONFIG_ADIN_PHY is not set # CONFIG_ADIN1100_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=m # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM54140_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set # CONFIG_MAXLINEAR_GPHY is not set # CONFIG_MEDIATEK_GE_PHY is not set CONFIG_MICREL_PHY=y CONFIG_MICROCHIP_PHY=y CONFIG_MICROCHIP_T1_PHY=y # CONFIG_MICROSEMI_PHY is not set # CONFIG_MOTORCOMM_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_QSEMI_PHY is not set CONFIG_REALTEK_PHY=y # CONFIG_RENESAS_PHY is not set # CONFIG_ROCKCHIP_PHY is not set CONFIG_SMSC_PHY=y # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_DP83TD510_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set CONFIG_MICREL_KS8995MA=y # CONFIG_PSE_CONTROLLER is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_OF_MDIO=y CONFIG_MDIO_DEVRES=y CONFIG_MDIO_SUN4I=y # CONFIG_MDIO_BITBANG is not set # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_IPQ4019 is not set # CONFIG_MDIO_IPQ8064 is not set # # MDIO Multiplexers # CONFIG_MDIO_BUS_MUX=y # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # # PCS device drivers # CONFIG_PCS_XPCS=y # end of PCS device drivers CONFIG_PPP=m CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set CONFIG_PPP_MPPE=m # CONFIG_PPP_MULTILINK is not set CONFIG_PPPOE=m CONFIG_PPP_ASYNC=m CONFIG_PPP_SYNC_TTY=m # CONFIG_SLIP is not set CONFIG_SLHC=m CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set # CONFIG_USB_RTL8150 is not set CONFIG_USB_RTL8152=y # CONFIG_USB_LAN78XX is not set CONFIG_USB_USBNET=m CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m # CONFIG_USB_NET_CDC_EEM is not set CONFIG_USB_NET_CDC_NCM=m # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set # CONFIG_USB_NET_DM9601 is not set # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set # CONFIG_USB_NET_SMSC75XX is not set # CONFIG_USB_NET_SMSC95XX is not set # CONFIG_USB_NET_GL620A is not set CONFIG_USB_NET_NET1080=m # CONFIG_USB_NET_PLUSB is not set # CONFIG_USB_NET_MCS7830 is not set CONFIG_USB_NET_RNDIS_HOST=m CONFIG_USB_NET_CDC_SUBSET_ENABLE=m CONFIG_USB_NET_CDC_SUBSET=m # CONFIG_USB_ALI_M5632 is not set # CONFIG_USB_AN2720 is not set CONFIG_USB_BELKIN=y CONFIG_USB_ARMLINUX=y # CONFIG_USB_EPSON2888 is not set # CONFIG_USB_KC2190 is not set CONFIG_USB_NET_ZAURUS=m # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set # CONFIG_USB_HSO is not set # CONFIG_USB_NET_INT51X1 is not set CONFIG_USB_IPHETH=m # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y # CONFIG_ATH9K is not set CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y CONFIG_CARL9170_HWRNG=y CONFIG_ATH6KL=m # CONFIG_ATH6KL_SDIO is not set CONFIG_ATH6KL_USB=m # CONFIG_ATH6KL_DEBUG is not set CONFIG_AR5523=m CONFIG_ATH10K=m CONFIG_ATH10K_CE=y # CONFIG_ATH10K_SDIO is not set CONFIG_ATH10K_USB=m # CONFIG_ATH10K_DEBUG is not set # CONFIG_ATH10K_DEBUGFS is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set CONFIG_WLAN_VENDOR_ATMEL=y CONFIG_AT76C50X_USB=m CONFIG_WLAN_VENDOR_BROADCOM=y CONFIG_B43=m CONFIG_B43_BCMA=y CONFIG_B43_SSB=y CONFIG_B43_BUSES_BCMA_AND_SSB=y # CONFIG_B43_BUSES_BCMA is not set # CONFIG_B43_BUSES_SSB is not set # CONFIG_B43_SDIO is not set CONFIG_B43_BCMA_PIO=y CONFIG_B43_PIO=y CONFIG_B43_PHY_G=y CONFIG_B43_PHY_N=y CONFIG_B43_PHY_LP=y CONFIG_B43_PHY_HT=y CONFIG_B43_LEDS=y CONFIG_B43_HWRNG=y # CONFIG_B43_DEBUG is not set # CONFIG_B43LEGACY is not set CONFIG_BRCMUTIL=m # CONFIG_BRCMSMAC is not set CONFIG_BRCMFMAC=m CONFIG_BRCMFMAC_PROTO_BCDC=y CONFIG_BRCMFMAC_SDIO=y CONFIG_BRCMFMAC_USB=y # CONFIG_BRCM_TRACING is not set # CONFIG_BRCMDBG is not set CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y # CONFIG_WLAN_VENDOR_INTERSIL is not set CONFIG_WLAN_VENDOR_MARVELL=y CONFIG_LIBERTAS=m CONFIG_LIBERTAS_USB=m # CONFIG_LIBERTAS_SDIO is not set # CONFIG_LIBERTAS_SPI is not set # CONFIG_LIBERTAS_DEBUG is not set # CONFIG_LIBERTAS_MESH is not set CONFIG_LIBERTAS_THINFIRM=m # CONFIG_LIBERTAS_THINFIRM_DEBUG is not set CONFIG_LIBERTAS_THINFIRM_USB=m CONFIG_MWIFIEX=m # CONFIG_MWIFIEX_SDIO is not set CONFIG_MWIFIEX_USB=m CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m CONFIG_MT76_CORE=m CONFIG_MT76_LEDS=y CONFIG_MT76_USB=m CONFIG_MT76x02_LIB=m CONFIG_MT76x02_USB=m CONFIG_MT76_CONNAC_LIB=m CONFIG_MT76x0_COMMON=m CONFIG_MT76x0U=m CONFIG_MT76x2_COMMON=m CONFIG_MT76x2U=m CONFIG_MT7615_COMMON=m CONFIG_MT7663_USB_SDIO_COMMON=m CONFIG_MT7663U=m # CONFIG_MT7663S is not set # CONFIG_MT7921S is not set # CONFIG_MT7921U is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set # CONFIG_WLAN_VENDOR_PURELIFI is not set CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WLAN_VENDOR_REALTEK=y CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y CONFIG_RTL_CARDS=m # CONFIG_RTL8192CU is not set CONFIG_RTL8XXXU=m CONFIG_RTL8XXXU_UNTESTED=y CONFIG_RTW88=m CONFIG_RTW88_CORE=m CONFIG_RTW88_SDIO=m CONFIG_RTW88_USB=m CONFIG_RTW88_8822B=m CONFIG_RTW88_8822C=m CONFIG_RTW88_8723D=m CONFIG_RTW88_8821C=m CONFIG_RTW88_8822BS=m CONFIG_RTW88_8822BU=m CONFIG_RTW88_8822CS=m CONFIG_RTW88_8822CU=m CONFIG_RTW88_8723DU=m CONFIG_RTW88_8821CS=m CONFIG_RTW88_8821CU=m # CONFIG_RTW88_DEBUG is not set # CONFIG_RTW88_DEBUGFS is not set # CONFIG_RTW89 is not set # CONFIG_WLAN_VENDOR_RSI is not set # CONFIG_WLAN_VENDOR_SILABS is not set # CONFIG_WLAN_VENDOR_ST is not set # CONFIG_WLAN_VENDOR_TI is not set CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_USB_ZD1201=m CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set # CONFIG_WLAN_VENDOR_QUANTENNA is not set # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces # # CONFIG_INPUT_MOUSEDEV is not set CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADC is not set # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=y CONFIG_KEYBOARD_GPIO_POLLED=y # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_PINEPHONE is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set CONFIG_KEYBOARD_SUN4I_LRADC=y # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set # CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADC is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set # CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y # CONFIG_JOYSTICK_PSXPAD_SPI is not set # CONFIG_JOYSTICK_PXRC is not set # CONFIG_JOYSTICK_QWIIC is not set # CONFIG_JOYSTICK_FSIA6B is not set # CONFIG_JOYSTICK_SENSEHAT is not set # CONFIG_INPUT_TABLET is not set # CONFIG_INPUT_TOUCHSCREEN is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_AXP20X_PEK=y CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set CONFIG_RMI4_CORE=m # CONFIG_RMI4_I2C is not set # CONFIG_RMI4_SPI is not set # CONFIG_RMI4_SMB is not set CONFIG_RMI4_F03=y CONFIG_RMI4_F03_SERIO=m CONFIG_RMI4_2D_SENSOR=y CONFIG_RMI4_F11=y CONFIG_RMI4_F12=y CONFIG_RMI4_F30=y # CONFIG_RMI4_F34 is not set # CONFIG_RMI4_F3A is not set # CONFIG_RMI4_F54 is not set # CONFIG_RMI4_F55 is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_SERIO_SERPORT=y CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_SERIO_SUN4I_PS2 is not set # CONFIG_SERIO_GPIO_PS2 is not set # CONFIG_USERIO is not set # CONFIG_GAMEPORT is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y CONFIG_SERIAL_8250_16550A_VARIANTS=y # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_DMA=y CONFIG_SERIAL_8250_NR_UARTS=8 CONFIG_SERIAL_8250_RUNTIME_UARTS=8 # CONFIG_SERIAL_8250_EXTENDED is not set CONFIG_SERIAL_8250_DWLIB=y CONFIG_SERIAL_8250_FSL=y CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set CONFIG_SERIAL_OF_PLATFORM=y # # Non-8250 serial port support # # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_SIFIVE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_ST_ASC is not set # CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_NULL_TTY is not set # CONFIG_HVC_DCC is not set CONFIG_SERIAL_DEV_BUS=y CONFIG_SERIAL_DEV_CTRL_TTYPORT=y # CONFIG_TTY_PRINTK is not set # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=m # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_BA431 is not set # CONFIG_HW_RANDOM_CCTRNG is not set # CONFIG_HW_RANDOM_XIPHERA is not set CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=m CONFIG_DEVMEM=y # CONFIG_TCG_TPM is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_GPMUX is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set # CONFIG_I2C_MUX_PINCTRL is not set # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_DEMUX_PINCTRL is not set # CONFIG_I2C_MUX_MLXCPLD is not set # end of Multiplexer I2C Chip support CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CBUS_GPIO is not set # CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_EMEV2 is not set # CONFIG_I2C_GPIO is not set CONFIG_I2C_MV64XXX=y # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_RK3X is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y # CONFIG_SPI_MEM is not set # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set # CONFIG_SPI_BITBANG is not set # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_CADENCE_QUADSPI 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_MICROCHIP_CORE is not set # CONFIG_SPI_MICROCHIP_CORE_QSPI 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 # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_AMD is not set # # SPI Multiplexer support # # CONFIG_SPI_MUX is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=m # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set CONFIG_SPI_DYNAMIC=y # CONFIG_SPMI is not set # CONFIG_HSI is not set CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # CONFIG_PTP_1588_CLOCK_KVM=y # CONFIG_PTP_1588_CLOCK_IDT82P33 is not set # CONFIG_PTP_1588_CLOCK_IDTCM is not set # end of PTP clock support CONFIG_PINCTRL=y CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set CONFIG_PINCTRL_AXP209=y # CONFIG_PINCTRL_CY8C95X0 is not set # CONFIG_PINCTRL_MCP23S08 is not set # CONFIG_PINCTRL_MICROCHIP_SGPIO is not set # CONFIG_PINCTRL_OCELOT is not set # CONFIG_PINCTRL_SINGLE is not set # CONFIG_PINCTRL_STMFX is not set # CONFIG_PINCTRL_SX150X is not set # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers CONFIG_PINCTRL_SUNXI=y CONFIG_PINCTRL_SUN4I_A10=y # CONFIG_PINCTRL_SUN5I is not set # CONFIG_PINCTRL_SUN6I_A31 is not set # CONFIG_PINCTRL_SUN6I_A31_R is not set # CONFIG_PINCTRL_SUN8I_A23 is not set # CONFIG_PINCTRL_SUN8I_A33 is not set # CONFIG_PINCTRL_SUN8I_A83T is not set # CONFIG_PINCTRL_SUN8I_A83T_R is not set # CONFIG_PINCTRL_SUN8I_A23_R is not set CONFIG_PINCTRL_SUN8I_H3=y CONFIG_PINCTRL_SUN8I_H3_R=y # CONFIG_PINCTRL_SUN8I_V3S is not set # CONFIG_PINCTRL_SUN9I_A80 is not set # CONFIG_PINCTRL_SUN9I_A80_R is not set # CONFIG_PINCTRL_SUN20I_D1 is not set # CONFIG_PINCTRL_SUN50I_A64 is not set # CONFIG_PINCTRL_SUN50I_A64_R is not set # CONFIG_PINCTRL_SUN50I_A100 is not set # CONFIG_PINCTRL_SUN50I_A100_R is not set # CONFIG_PINCTRL_SUN50I_H5 is not set # CONFIG_PINCTRL_SUN50I_H6 is not set # CONFIG_PINCTRL_SUN50I_H6_R is not set # CONFIG_PINCTRL_SUN50I_H616 is not set # CONFIG_PINCTRL_SUN50I_H616_R is not set CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y CONFIG_GPIO_CDEV=y CONFIG_GPIO_CDEV_V1=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_CADENCE is not set # CONFIG_GPIO_DWAPB is not set # CONFIG_GPIO_FTGPIO010 is not set # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HLWD is not set # CONFIG_GPIO_LOGICVC is not set # CONFIG_GPIO_MB86S7X is not set # CONFIG_GPIO_MPC8XXX is not set # CONFIG_GPIO_SIFIVE is not set # 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 # end of Memory mapped GPIO drivers # # I2C GPIO expanders # # 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 # CONFIG_GPIO_PCA9570 is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # # CONFIG_HTC_EGPIO is not set # end of MFD GPIO expanders # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # end of SPI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers # CONFIG_W1 is not set # CONFIG_POWER_RESET is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_CHARGER_AXP20X is not set # CONFIG_BATTERY_AXP20X is not set CONFIG_AXP20X_POWER=y # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set # CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_UCS1002 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DRIVETEMP is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_GPIO_FAN is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IIO_HWMON is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX31730 is not set # CONFIG_SENSORS_MAX31760 is not set # CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_NZXT_KRAKEN2 is not set # CONFIG_SENSORS_NZXT_SMART2 is not set # CONFIG_SENSORS_OCC_P8_I2C is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set # CONFIG_SENSORS_PWM_FAN is not set # CONFIG_SENSORS_SBTSI is not set # CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y # CONFIG_THERMAL_WRITABLE_TRIPS is not set CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set CONFIG_CPU_THERMAL=y CONFIG_CPU_FREQ_THERMAL=y CONFIG_DEVFREQ_THERMAL=y # CONFIG_THERMAL_EMULATION is not set # CONFIG_THERMAL_MMIO is not set CONFIG_SUN8I_THERMAL=y CONFIG_GENERIC_ADC_THERMAL=y CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 # CONFIG_WATCHDOG_SYSFS is not set # CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_FTWDT010_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set CONFIG_SUNXI_WATCHDOG=y # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_ARM_SMC_WATCHDOG is not set # CONFIG_MEN_A21_WDT is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y CONFIG_SSB=m CONFIG_SSB_BLOCKIO=y CONFIG_SSB_SDIOHOST_POSSIBLE=y # CONFIG_SSB_SDIOHOST is not set # CONFIG_SSB_DRIVER_GPIO is not set CONFIG_BCMA_POSSIBLE=y CONFIG_BCMA=m CONFIG_BCMA_BLOCKIO=y # CONFIG_BCMA_HOST_SOC is not set # CONFIG_BCMA_DRIVER_GMAC_CMN is not set # CONFIG_BCMA_DRIVER_GPIO is not set # CONFIG_BCMA_DEBUG is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_ACT8945A is not set CONFIG_MFD_SUN4I_GPADC=y # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AC100 is not set # CONFIG_MFD_AC200 is not set CONFIG_MFD_AXP20X=y CONFIG_MFD_AXP20X_I2C=y CONFIG_MFD_AXP20X_RSB=y # CONFIG_MFD_MADERA is not set # CONFIG_MFD_ASIC3 is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_GATEWORKS_GSC is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77620 is not set # CONFIG_MFD_MAX77650 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77714 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_OCELOT is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_CPCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_NTXEC is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_PM8XXX is not set # CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_RK808 is not set # CONFIG_MFD_RN5T618 is not set # CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SUN6I_PRCM=y CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set CONFIG_MFD_WL1273_CORE=m # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TC3589X is not set # 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 # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ROHM_BD718XX is not set # CONFIG_MFD_ROHM_BD71828 is not set # CONFIG_MFD_ROHM_BD957XMUF is not set # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_MFD_QCOM_PM8008 is not set # CONFIG_RAVE_SP_CORE is not set # CONFIG_MFD_INTEL_M10_BMC is not set # CONFIG_MFD_RSMU_I2C is not set # CONFIG_MFD_RSMU_SPI is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set CONFIG_REGULATOR_AXP20X=y # CONFIG_REGULATOR_DA9121 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set # CONFIG_REGULATOR_FAN53880 is not set CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MAX20086 is not set # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MCP16502 is not set # CONFIG_REGULATOR_MP5416 is not set # CONFIG_REGULATOR_MP8859 is not set # CONFIG_REGULATOR_MP886X is not set # CONFIG_REGULATOR_MPQ7920 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PF8X00 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set # CONFIG_REGULATOR_PWM is not set # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set # CONFIG_REGULATOR_SLG51000 is not set CONFIG_REGULATOR_SY8106A=y # CONFIG_REGULATOR_SY8824X is not set # CONFIG_REGULATOR_SY8827N is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS6286X is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_VCTRL is not set CONFIG_RC_CORE=y CONFIG_BPF_LIRC_MODE2=y CONFIG_LIRC=y CONFIG_RC_MAP=y CONFIG_RC_DECODERS=y CONFIG_IR_IMON_DECODER=y CONFIG_IR_JVC_DECODER=y CONFIG_IR_MCE_KBD_DECODER=y CONFIG_IR_NEC_DECODER=y CONFIG_IR_RC5_DECODER=y CONFIG_IR_RC6_DECODER=y CONFIG_IR_RCMM_DECODER=y CONFIG_IR_SANYO_DECODER=y CONFIG_IR_SHARP_DECODER=y CONFIG_IR_SONY_DECODER=y CONFIG_IR_XMP_DECODER=y CONFIG_RC_DEVICES=y CONFIG_IR_GPIO_CIR=m CONFIG_IR_GPIO_TX=m # CONFIG_IR_HIX5HD2 is not set CONFIG_IR_IGORPLUGUSB=m CONFIG_IR_IGUANA=m CONFIG_IR_IMON=m CONFIG_IR_IMON_RAW=m CONFIG_IR_MCEUSB=m # CONFIG_IR_PWM_TX is not set CONFIG_IR_REDRAT3=m # CONFIG_IR_SERIAL is not set # CONFIG_IR_SPI is not set CONFIG_IR_STREAMZAP=m CONFIG_IR_SUNXI=y CONFIG_IR_TOY=m CONFIG_IR_TTUSBIR=m CONFIG_RC_ATI_REMOTE=m # CONFIG_RC_LOOPBACK is not set CONFIG_RC_XBOX_DVD=y CONFIG_CEC_CORE=y CONFIG_CEC_NOTIFIER=y CONFIG_CEC_PIN=y # # CEC support # # CONFIG_MEDIA_CEC_RC is not set # CONFIG_CEC_PIN_ERROR_INJ is not set CONFIG_MEDIA_CEC_SUPPORT=y # CONFIG_CEC_CH7322 is not set CONFIG_CEC_GPIO=m CONFIG_USB_PULSE8_CEC=m CONFIG_USB_RAINSHADOW_CEC=m # end of CEC support CONFIG_MEDIA_SUPPORT=y # CONFIG_MEDIA_SUPPORT_FILTER is not set CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y CONFIG_MEDIA_RADIO_SUPPORT=y CONFIG_MEDIA_SDR_SUPPORT=y CONFIG_MEDIA_PLATFORM_SUPPORT=y CONFIG_MEDIA_TEST_SUPPORT=y # end of Media device types # # Media core support # CONFIG_VIDEO_DEV=y CONFIG_MEDIA_CONTROLLER=y CONFIG_DVB_CORE=y # end of Media core support # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y CONFIG_VIDEO_V4L2_SUBDEV_API=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_VIDEO_TUNER=m CONFIG_V4L2_MEM2MEM_DEV=y CONFIG_V4L2_FWNODE=y CONFIG_V4L2_ASYNC=y CONFIG_VIDEOBUF_GEN=m CONFIG_VIDEOBUF_VMALLOC=m # end of Video4Linux options # # Media controller options # CONFIG_MEDIA_CONTROLLER_DVB=y CONFIG_MEDIA_CONTROLLER_REQUEST_API=y # end of Media controller options # # Digital TV options # # CONFIG_DVB_MMAP is not set CONFIG_DVB_NET=y CONFIG_DVB_MAX_ADAPTERS=16 # CONFIG_DVB_DYNAMIC_MINORS is not set # CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set # CONFIG_DVB_ULE_DEBUG is not set # end of Digital TV options # # Media drivers # # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_USB_S2255 is not set # CONFIG_VIDEO_USBTV is not set CONFIG_USB_VIDEO_CLASS=m # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set # # Analog TV USB devices # CONFIG_VIDEO_GO7007=m CONFIG_VIDEO_GO7007_USB=m CONFIG_VIDEO_GO7007_LOADER=m CONFIG_VIDEO_GO7007_USB_S2250_BOARD=m CONFIG_VIDEO_HDPVR=m CONFIG_VIDEO_PVRUSB2=m CONFIG_VIDEO_PVRUSB2_SYSFS=y CONFIG_VIDEO_PVRUSB2_DVB=y # CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set CONFIG_VIDEO_STK1160_COMMON=m CONFIG_VIDEO_STK1160=m # # Analog/digital TV USB devices # CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_AU0828_V4L2=y CONFIG_VIDEO_AU0828_RC=y # CONFIG_VIDEO_CX231XX is not set # # Digital TV USB devices # CONFIG_DVB_AS102=m CONFIG_DVB_B2C2_FLEXCOP_USB=m # CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set CONFIG_DVB_USB_V2=m CONFIG_DVB_USB_AF9015=m CONFIG_DVB_USB_AF9035=m CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_AZ6007=m CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_DVBSKY=m CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_GL861=m CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m CONFIG_DVB_USB_ZD1301=m CONFIG_DVB_USB=m # CONFIG_DVB_USB_DEBUG is not set CONFIG_DVB_USB_A800=m CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_CXUSB=m CONFIG_DVB_USB_CXUSB_ANALOG=y CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_DIB3000MC=m CONFIG_DVB_USB_DIBUSB_MB=m # CONFIG_DVB_USB_DIBUSB_MB_FAULTY is not set CONFIG_DVB_USB_DIBUSB_MC=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_DTT200U=m CONFIG_DVB_USB_DTV5100=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_GP8PSK=m CONFIG_DVB_USB_M920X=m CONFIG_DVB_USB_NOVA_T_USB2=m CONFIG_DVB_USB_OPERA1=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_TTUSB2=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_VP7045=m CONFIG_SMS_USB_DRV=m # # Webcam, TV (analog/digital) USB devices # # CONFIG_VIDEO_EM28XX is not set # # Software defined radio USB devices # # CONFIG_USB_AIRSPY is not set # CONFIG_USB_HACKRF is not set # CONFIG_USB_MSI2500 is not set CONFIG_RADIO_ADAPTERS=y CONFIG_RADIO_SAA7706H=m CONFIG_RADIO_SHARK=m CONFIG_RADIO_SHARK2=m CONFIG_RADIO_SI4713=m CONFIG_RADIO_TEA575X=m CONFIG_RADIO_TEA5764=m CONFIG_RADIO_TEF6862=m CONFIG_RADIO_WL1273=m CONFIG_USB_DSBR=m CONFIG_USB_KEENE=m CONFIG_USB_MA901=m CONFIG_USB_MR800=m CONFIG_USB_RAREMONO=m CONFIG_RADIO_SI470X=m CONFIG_USB_SI470X=m CONFIG_I2C_SI470X=m CONFIG_USB_SI4713=m CONFIG_PLATFORM_SI4713=m CONFIG_I2C_SI4713=m CONFIG_MEDIA_PLATFORM_DRIVERS=y # CONFIG_V4L_PLATFORM_DRIVERS is not set # CONFIG_SDR_PLATFORM_DRIVERS is not set # CONFIG_DVB_PLATFORM_DRIVERS is not set CONFIG_V4L_MEM2MEM_DRIVERS=y # CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set # # Allegro DVT media platform drivers # # # Amlogic media platform drivers # # # Amphion drivers # # # Aspeed media platform drivers # # # Atmel media platform drivers # # # Cadence media platform drivers # # CONFIG_VIDEO_CADENCE_CSI2RX is not set # CONFIG_VIDEO_CADENCE_CSI2TX is not set # # Chips&Media media platform drivers # # # Intel media platform drivers # # # Marvell media platform drivers # # # Mediatek media platform drivers # # # NVidia media platform drivers # # # NXP media platform drivers # # # Qualcomm media platform drivers # # # Renesas media platform drivers # # # Rockchip media platform drivers # # # Samsung media platform drivers # # # STMicroelectronics media platform drivers # # # Sunxi media platform drivers # CONFIG_VIDEO_SUN8I_DEINTERLACE=m # CONFIG_VIDEO_SUN50I_DEINTERLACE is not set CONFIG_VIDEO_SUN8I_ROTATE=m # # Texas Instruments drivers # # # Verisilicon media platform drivers # # CONFIG_VIDEO_HANTRO is not set # # VIA media platform drivers # # # Xilinx media platform drivers # # # MMC/SDIO DVB adapters # # CONFIG_SMS_SDIO_DRV is not set # CONFIG_V4L_TEST_DRIVERS is not set # CONFIG_DVB_TEST_DRIVERS is not set CONFIG_MEDIA_COMMON_OPTIONS=y # # common driver options # CONFIG_CYPRESS_FIRMWARE=m CONFIG_TTPCI_EEPROM=m CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_SMS_SIANO_MDTV=m CONFIG_SMS_SIANO_RC=y CONFIG_VIDEOBUF2_CORE=y CONFIG_VIDEOBUF2_V4L2=y CONFIG_VIDEOBUF2_MEMOPS=y CONFIG_VIDEOBUF2_DMA_CONTIG=y CONFIG_VIDEOBUF2_VMALLOC=m # end of Media drivers # # Media ancillary drivers # CONFIG_MEDIA_ATTACH=y # # IR I2C driver auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_IR_I2C=y CONFIG_VIDEO_CAMERA_SENSOR=y # CONFIG_VIDEO_AR0521 is not set # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_HI846 is not set # CONFIG_VIDEO_HI847 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_IMX412 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set # CONFIG_VIDEO_MT9V011 is not set # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set # CONFIG_VIDEO_OV2640 is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5693 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV7251 is not set CONFIG_VIDEO_OV7640=m # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9282 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_M5MOLS is not set # # Lens drivers # # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # Audio decoders, processors and mixers # CONFIG_VIDEO_CS3308=m CONFIG_VIDEO_CS5345=m CONFIG_VIDEO_CS53L32A=m CONFIG_VIDEO_MSP3400=m CONFIG_VIDEO_SONY_BTF_MPX=m CONFIG_VIDEO_TDA1997X=m CONFIG_VIDEO_TDA7432=m CONFIG_VIDEO_TDA9840=m CONFIG_VIDEO_TEA6415C=m CONFIG_VIDEO_TEA6420=m CONFIG_VIDEO_TLV320AIC23B=m CONFIG_VIDEO_TVAUDIO=m CONFIG_VIDEO_UDA1342=m CONFIG_VIDEO_VP27SMPX=m CONFIG_VIDEO_WM8739=m CONFIG_VIDEO_WM8775=m # end of Audio decoders, processors and mixers # # RDS decoders # CONFIG_VIDEO_SAA6588=m # end of RDS decoders # # Video decoders # CONFIG_VIDEO_ADV7180=m CONFIG_VIDEO_ADV7183=m CONFIG_VIDEO_ADV748X=m CONFIG_VIDEO_ADV7604=m CONFIG_VIDEO_ADV7604_CEC=y CONFIG_VIDEO_ADV7842=m CONFIG_VIDEO_ADV7842_CEC=y CONFIG_VIDEO_BT819=m CONFIG_VIDEO_BT856=m CONFIG_VIDEO_BT866=m # CONFIG_VIDEO_ISL7998X is not set CONFIG_VIDEO_KS0127=m # CONFIG_VIDEO_MAX9286 is not set CONFIG_VIDEO_ML86V7667=m CONFIG_VIDEO_SAA7110=m CONFIG_VIDEO_SAA711X=m CONFIG_VIDEO_TC358743=m CONFIG_VIDEO_TC358743_CEC=y CONFIG_VIDEO_TVP514X=m CONFIG_VIDEO_TVP5150=m CONFIG_VIDEO_TVP7002=m CONFIG_VIDEO_TW2804=m CONFIG_VIDEO_TW9903=m CONFIG_VIDEO_TW9906=m CONFIG_VIDEO_TW9910=m CONFIG_VIDEO_VPX3220=m # # Video and audio decoders # CONFIG_VIDEO_SAA717X=m CONFIG_VIDEO_CX25840=m # end of Video decoders # # Video encoders # CONFIG_VIDEO_AD9389B=m CONFIG_VIDEO_ADV7170=m CONFIG_VIDEO_ADV7175=m CONFIG_VIDEO_ADV7343=m CONFIG_VIDEO_ADV7393=m CONFIG_VIDEO_ADV7511=m CONFIG_VIDEO_ADV7511_CEC=y CONFIG_VIDEO_AK881X=m CONFIG_VIDEO_SAA7127=m CONFIG_VIDEO_SAA7185=m CONFIG_VIDEO_THS8200=m # end of Video encoders # # Video improvement chips # CONFIG_VIDEO_UPD64031A=m CONFIG_VIDEO_UPD64083=m # end of Video improvement chips # # Audio/Video compression chips # CONFIG_VIDEO_SAA6752HS=m # end of Audio/Video compression chips # # SDR tuner chips # CONFIG_SDR_MAX2175=m # end of SDR tuner chips # # Miscellaneous helper chips # CONFIG_VIDEO_I2C=m CONFIG_VIDEO_M52790=m CONFIG_VIDEO_ST_MIPID02=m CONFIG_VIDEO_THS7303=m # end of Miscellaneous helper chips # # Media SPI Adapters # # CONFIG_CXD2880_SPI_DRV is not set CONFIG_VIDEO_GS1662=m # end of Media SPI Adapters CONFIG_MEDIA_TUNER=y # # Customize TV tuners # CONFIG_MEDIA_TUNER_E4000=m CONFIG_MEDIA_TUNER_FC0011=m CONFIG_MEDIA_TUNER_FC0012=m CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_FC2580=m CONFIG_MEDIA_TUNER_IT913X=m CONFIG_MEDIA_TUNER_M88RS6000T=m CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_MC44S803=y CONFIG_MEDIA_TUNER_MSI001=m CONFIG_MEDIA_TUNER_MT2060=m CONFIG_MEDIA_TUNER_MT2063=m CONFIG_MEDIA_TUNER_MT20XX=y CONFIG_MEDIA_TUNER_MT2131=m CONFIG_MEDIA_TUNER_MT2266=m CONFIG_MEDIA_TUNER_MXL301RF=m CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m CONFIG_MEDIA_TUNER_QM1D1B0004=m CONFIG_MEDIA_TUNER_QM1D1C0042=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_R820T=m CONFIG_MEDIA_TUNER_SI2157=m CONFIG_MEDIA_TUNER_SIMPLE=y CONFIG_MEDIA_TUNER_TDA18212=m CONFIG_MEDIA_TUNER_TDA18218=m CONFIG_MEDIA_TUNER_TDA18250=m CONFIG_MEDIA_TUNER_TDA18271=y CONFIG_MEDIA_TUNER_TDA827X=y CONFIG_MEDIA_TUNER_TDA8290=y CONFIG_MEDIA_TUNER_TDA9887=y CONFIG_MEDIA_TUNER_TEA5761=y CONFIG_MEDIA_TUNER_TEA5767=y CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_MEDIA_TUNER_XC2028=y CONFIG_MEDIA_TUNER_XC4000=y CONFIG_MEDIA_TUNER_XC5000=y # end of Customize TV tuners # # Customise DVB Frontends # # # Multistandard (satellite) frontends # CONFIG_DVB_M88DS3103=m CONFIG_DVB_MXL5XX=m CONFIG_DVB_STB0899=m CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m CONFIG_DVB_STV0910=m CONFIG_DVB_STV6110x=m CONFIG_DVB_STV6111=m # # Multistandard (cable + terrestrial) frontends # CONFIG_DVB_DRXK=m CONFIG_DVB_MN88472=m CONFIG_DVB_MN88473=m CONFIG_DVB_SI2165=m CONFIG_DVB_TDA18271C2DD=m # # DVB-S (satellite) frontends # CONFIG_DVB_CX24110=m CONFIG_DVB_CX24116=m CONFIG_DVB_CX24117=m CONFIG_DVB_CX24120=m CONFIG_DVB_CX24123=m CONFIG_DVB_DS3000=m CONFIG_DVB_MB86A16=m CONFIG_DVB_MT312=m CONFIG_DVB_S5H1420=m CONFIG_DVB_SI21XX=m CONFIG_DVB_STB6000=m CONFIG_DVB_STV0288=m CONFIG_DVB_STV0299=m CONFIG_DVB_STV0900=m CONFIG_DVB_STV6110=m CONFIG_DVB_TDA10071=m CONFIG_DVB_TDA10086=m CONFIG_DVB_TDA8083=m CONFIG_DVB_TDA8261=m CONFIG_DVB_TDA826X=m CONFIG_DVB_TS2020=m CONFIG_DVB_TUA6100=m CONFIG_DVB_TUNER_CX24113=m CONFIG_DVB_TUNER_ITD1000=m CONFIG_DVB_VES1X93=m CONFIG_DVB_ZL10036=m CONFIG_DVB_ZL10039=m # # DVB-T (terrestrial) frontends # CONFIG_DVB_AF9013=m CONFIG_DVB_AS102_FE=m CONFIG_DVB_CX22700=m CONFIG_DVB_CX22702=m CONFIG_DVB_CXD2820R=m CONFIG_DVB_CXD2841ER=m CONFIG_DVB_DIB3000MB=m CONFIG_DVB_DIB3000MC=m CONFIG_DVB_DIB7000M=m CONFIG_DVB_DIB7000P=m CONFIG_DVB_DIB9000=m CONFIG_DVB_DRXD=m CONFIG_DVB_EC100=m CONFIG_DVB_GP8PSK_FE=m CONFIG_DVB_L64781=m CONFIG_DVB_MT352=m CONFIG_DVB_NXT6000=m CONFIG_DVB_RTL2830=m CONFIG_DVB_RTL2832=m CONFIG_DVB_RTL2832_SDR=m CONFIG_DVB_S5H1432=m CONFIG_DVB_SI2168=m CONFIG_DVB_SP887X=m CONFIG_DVB_STV0367=m CONFIG_DVB_TDA10048=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_ZD1301_DEMOD=m CONFIG_DVB_ZL10353=m CONFIG_DVB_CXD2880=m # # DVB-C (cable) frontends # CONFIG_DVB_STV0297=m CONFIG_DVB_TDA10021=m CONFIG_DVB_TDA10023=m CONFIG_DVB_VES1820=m # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # CONFIG_DVB_AU8522=m CONFIG_DVB_AU8522_DTV=m CONFIG_DVB_AU8522_V4L=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LG2160=m CONFIG_DVB_LGDT3305=m CONFIG_DVB_LGDT3306A=m CONFIG_DVB_LGDT330X=m # CONFIG_DVB_MXL692 is not set CONFIG_DVB_NXT200X=m CONFIG_DVB_OR51132=m CONFIG_DVB_OR51211=m CONFIG_DVB_S5H1409=m CONFIG_DVB_S5H1411=m # # ISDB-T (terrestrial) frontends # CONFIG_DVB_DIB8000=m CONFIG_DVB_MB86A20S=m CONFIG_DVB_S921=m # # ISDB-S (satellite) & ISDB-T (terrestrial) frontends # CONFIG_DVB_MN88443X=m CONFIG_DVB_TC90522=m # # Digital terrestrial only tuners/PLL # CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m CONFIG_DVB_TUNER_DIB0090=m # # SEC control devices for DVB-S # CONFIG_DVB_A8293=m CONFIG_DVB_AF9033=m CONFIG_DVB_ASCOT2E=m CONFIG_DVB_ATBM8830=m CONFIG_DVB_HELENE=m CONFIG_DVB_HORUS3A=m CONFIG_DVB_ISL6405=m CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m CONFIG_DVB_IX2505V=m CONFIG_DVB_LGS8GL5=m CONFIG_DVB_LGS8GXX=m CONFIG_DVB_LNBH25=m CONFIG_DVB_LNBH29=m CONFIG_DVB_LNBP21=m CONFIG_DVB_LNBP22=m CONFIG_DVB_M88RS2000=m CONFIG_DVB_TDA665x=m CONFIG_DVB_DRX39XYJ=m # # Common Interface (EN50221) controller drivers # CONFIG_DVB_CXD2099=m CONFIG_DVB_SP2=m # end of Customise DVB Frontends # # Tools to develop new frontends # # CONFIG_DVB_DUMMY_FE is not set # end of Media ancillary drivers # # Graphics support # CONFIG_APERTURE_HELPERS=y # CONFIG_IMX_IPUV3_CORE is not set CONFIG_DRM=y CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DEBUG_MM is not set CONFIG_DRM_KMS_HELPER=y # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set # CONFIG_DRM_DEBUG_MODESET_LOCK is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_GEM_DMA_HELPER=y CONFIG_DRM_GEM_SHMEM_HELPER=m CONFIG_DRM_SCHED=m # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # end of I2C encoder or helper chips # # ARM devices # # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_KOMEDA is not set # end of ARM devices # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set # CONFIG_DRM_EXYNOS is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_ARMADA is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_USE_LVDS is not set # CONFIG_DRM_RCAR_USE_MIPI_DSI is not set CONFIG_DRM_SUN4I=y CONFIG_DRM_SUN4I_HDMI=y CONFIG_DRM_SUN4I_HDMI_CEC=y CONFIG_DRM_SUN4I_BACKEND=y CONFIG_DRM_SUN6I_DSI=y CONFIG_DRM_SUN8I_DW_HDMI=y CONFIG_DRM_SUN8I_MIXER=y CONFIG_DRM_SUN8I_TCON_TOP=y # CONFIG_DRM_OMAP is not set # CONFIG_DRM_TILCDC is not set # CONFIG_DRM_FSL_DCU is not set # CONFIG_DRM_STM is not set CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_ABT_Y030XX067A is not set # CONFIG_DRM_PANEL_ARM_VERSATILE is not set # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LB035Q02 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set # CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set # CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set # CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set # CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set CONFIG_DRM_DISPLAY_CONNECTOR=m # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set # CONFIG_DRM_LONTIUM_LT9611 is not set # CONFIG_DRM_LONTIUM_LT9611UXC is not set # CONFIG_DRM_ITE_IT66121 is not set # CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NWL_MIPI_DSI is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_PARADE_PS8640 is not set # CONFIG_DRM_SIL_SII8620 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_SII9234 is not set CONFIG_DRM_SIMPLE_BRIDGE=m # CONFIG_DRM_THINE_THC63LVD1024 is not set # CONFIG_DRM_TOSHIBA_TC358762 is not set # CONFIG_DRM_TOSHIBA_TC358764 is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TOSHIBA_TC358768 is not set # CONFIG_DRM_TOSHIBA_TC358775 is not set # CONFIG_DRM_TI_DLPC3433 is not set # CONFIG_DRM_TI_TFP410 is not set # CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_ANALOGIX_ANX7625 is not set # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_CDNS_MHDP8546 is not set 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_GP_AUDIO is not set CONFIG_DRM_DW_HDMI_CEC=y # end of Display Interface Bridges # CONFIG_DRM_STI is not set # CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_LOGICVC is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_PANEL_MIPI_DBI is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9163 is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set # CONFIG_TINYDRM_ILI9486 is not set # CONFIG_TINYDRM_MI0283QT is not set # CONFIG_TINYDRM_REPAPER is not set # CONFIG_TINYDRM_ST7586 is not set # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_TVE200 is not set CONFIG_DRM_LIMA=m # CONFIG_DRM_PANFROST is not set # CONFIG_DRM_MCDE is not set # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_DRM_NOMODESET=y # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y # CONFIG_FB_MODE_HELPERS is not set # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set CONFIG_FB_SIMPLE=y # CONFIG_FB_SSD1307 is not set # end of Frame buffer Devices # # Backlight & LCD device support # # CONFIG_LCD_CLASS_DEVICE is not set # CONFIG_BACKLIGHT_CLASS_DEVICE is not set # end of Backlight & LCD device support CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support # CONFIG_LOGO is not set # end of Graphics support CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y # CONFIG_SND_HRTIMER is not set # CONFIG_SND_DYNAMIC_MINORS is not set CONFIG_SND_SUPPORT_OLD_API=y CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_CTL_INPUT_VALIDATION is not set # CONFIG_SND_SEQUENCER is not set CONFIG_SND_DRIVERS=y # CONFIG_SND_DUMMY is not set # CONFIG_SND_ALOOP is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_SERIAL_GENERIC is not set # CONFIG_SND_MPU401 is not set # # HD-Audio # # end of HD-Audio CONFIG_SND_HDA_PREALLOC_SIZE=64 CONFIG_SND_ARM=y CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=m CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y # CONFIG_SND_USB_UA101 is not set # CONFIG_SND_USB_CAIAQ is not set # CONFIG_SND_USB_6FIRE is not set # CONFIG_SND_USB_HIFACE is not set # CONFIG_SND_BCD2000 is not set # CONFIG_SND_USB_POD is not set # CONFIG_SND_USB_PODHD is not set # CONFIG_SND_USB_TONEPORT is not set # CONFIG_SND_USB_VARIAX is not set CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y # CONFIG_SND_SOC_ADI is not set # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_AMD_ACP_CONFIG is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # CONFIG_SND_SOC_FSL_AUDMIX is not set # 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_FSL_XCVR is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # end of SoC Audio for Freescale CPUs # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_MTK_BTCVSD is not set # CONFIG_SND_SOC_SOF_TOPLEVEL is not set # # STMicroelectronics STM32 SOC audio support # # end of STMicroelectronics STM32 SOC audio support # # Allwinner SoC Audio support # CONFIG_SND_SUN4I_CODEC=y CONFIG_SND_SUN8I_CODEC=y CONFIG_SND_SUN8I_CODEC_ANALOG=y CONFIG_SND_SUN4I_I2S=y CONFIG_SND_SUN4I_SPDIF=y # CONFIG_SND_SUN50I_DMIC is not set CONFIG_SND_SUN8I_ADDA_PR_REGMAP=y # end of Allwinner 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_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1372_SPI is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set # CONFIG_SND_SOC_ADAU7002 is not set # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4375 is not set # CONFIG_SND_SOC_AK4458 is not set # CONFIG_SND_SOC_AK4554 is not set # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # 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_CS35L41_SPI is not set # CONFIG_SND_SOC_CS35L41_I2C is not set # CONFIG_SND_SOC_CS35L45_SPI is not set # CONFIG_SND_SOC_CS35L45_I2C 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS42L83 is not set # CONFIG_SND_SOC_CS4234 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # 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_CX2072X is not set # CONFIG_SND_SOC_DA7213 is not set # CONFIG_SND_SOC_DMIC is not set CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_ES7134 is not set # CONFIG_SND_SOC_ES7241 is not set # CONFIG_SND_SOC_ES8316 is not set # CONFIG_SND_SOC_ES8326 is not set # CONFIG_SND_SOC_ES8328_I2C is not set # CONFIG_SND_SOC_ES8328_SPI is not set # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_HDA is not set # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set # CONFIG_SND_SOC_MAX98088 is not set # CONFIG_SND_SOC_MAX98357A is not set # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98520 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX98396 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set # CONFIG_SND_SOC_PCM186X_I2C is not set # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set # CONFIG_SND_SOC_PCM5102A 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_RT5640 is not set # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_RT9120 is not set # CONFIG_SND_SOC_SGTL5000 is not set # CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set # CONFIG_SND_SOC_SIMPLE_MUX is not set CONFIG_SND_SOC_SPDIF=y # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS2780 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805M is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320ADC3XXX is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set # CONFIG_SND_SOC_TLV320AIC3X_I2C is not set # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731_I2C is not set # CONFIG_SND_SOC_WM8731_SPI is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set # 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_WM8940 is not set # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set # CONFIG_SND_SOC_ZL38060 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_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8821 is not set # CONFIG_SND_SOC_NAU8822 is not set # CONFIG_SND_SOC_NAU8824 is not set # CONFIG_SND_SOC_TPA6130A2 is not set # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set # end of CODEC drivers CONFIG_SND_SIMPLE_CARD_UTILS=y CONFIG_SND_SIMPLE_CARD=y CONFIG_SND_AUDIO_GRAPH_CARD=y # CONFIG_SND_AUDIO_GRAPH_CARD2 is not set # CONFIG_SND_TEST_COMPONENT is not set # # HID support # CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set CONFIG_HID_ASUS=m CONFIG_HID_AUREAL=m # CONFIG_HID_BELKIN is not set # CONFIG_HID_BETOP_FF is not set CONFIG_HID_BIGBEN_FF=m CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CREATIVE_SB0540 is not set CONFIG_HID_CYPRESS=y CONFIG_HID_DRAGONRISE=m CONFIG_DRAGONRISE_FF=y # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_FT260 is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set CONFIG_HID_GLORIOUS=m # CONFIG_HID_HOLTEK is not set # CONFIG_HID_VIVALDI is not set # CONFIG_HID_GT683R is not set # CONFIG_HID_KEYTOUCH is not set CONFIG_HID_KYE=m # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set # CONFIG_HID_VRC2 is not set # CONFIG_HID_XIAOMI is not set CONFIG_HID_GYRATION=m # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set # CONFIG_HID_JABRA is not set CONFIG_HID_TWINHAN=m CONFIG_HID_KENSINGTON=y # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LED is not set # CONFIG_HID_LENOVO is not set # CONFIG_HID_LETSKETCH is not set CONFIG_HID_LOGITECH=y # CONFIG_HID_LOGITECH_DJ is not set CONFIG_HID_LOGITECH_HIDPP=m CONFIG_LOGITECH_FF=y 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_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=m CONFIG_HID_NINTENDO=m CONFIG_NINTENDO_FF=y # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set CONFIG_HID_ORTEK=m CONFIG_HID_OUYA=y CONFIG_HID_PANTHERLORD=m CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=m CONFIG_HID_PETALYNX=m # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PXRC is not set # CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set CONFIG_HID_SAMSUNG=m # CONFIG_HID_SEMITEK is not set # CONFIG_HID_SIGMAMICRO is not set CONFIG_HID_SONY=m CONFIG_SONY_FF=y # CONFIG_HID_SPEEDLINK is not set CONFIG_HID_STEAM=m # CONFIG_HID_STEELSERIES is not set CONFIG_HID_SUNPLUS=m CONFIG_HID_RMI=m # CONFIG_HID_GREENASIA is not set CONFIG_HID_SMARTJOYPLUS=m CONFIG_SMARTJOYPLUS_FF=y CONFIG_HID_TIVO=m CONFIG_HID_TOPSEED=m # CONFIG_HID_TOPRE is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set CONFIG_HID_WIIMOTE=m CONFIG_HID_XINMO=m # CONFIG_HID_ZEROPLUS is not set CONFIG_HID_ZYDACRON=m # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # end of USB HID support # # I2C HID support # # CONFIG_I2C_HID_OF is not set # CONFIG_I2C_HID_OF_ELAN is not set # CONFIG_I2C_HID_OF_GOODIX is not set # end of I2C HID support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y # CONFIG_USB_LED_TRIG is not set # CONFIG_USB_ULPI_BUS is not set # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_OTG is not set # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set # CONFIG_USB_LEDS_TRIGGER_USBPORT is not set CONFIG_USB_AUTOSUSPEND_DELAY=2 CONFIG_USB_MON=m # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set # CONFIG_USB_XHCI_HCD is not set 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 # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD_PLATFORM=y # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_BCMA is not set # CONFIG_USB_HCD_SSB is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=m # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set CONFIG_USB_UAS=y # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_CDNS_SUPPORT is not set CONFIG_USB_MUSB_HDRC=y # CONFIG_USB_MUSB_HOST is not set # CONFIG_USB_MUSB_GADGET is not set CONFIG_USB_MUSB_DUAL_ROLE=y # # Platform Glue Layer # CONFIG_USB_MUSB_SUNXI=y # # MUSB DMA mode # # CONFIG_MUSB_PIO_ONLY is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set # CONFIG_USB_CHIPIDEA is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # CONFIG_USB_SERIAL=m # CONFIG_USB_SERIAL_GENERIC is not set # CONFIG_USB_SERIAL_SIMPLE is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set # CONFIG_USB_SERIAL_CH341 is not set # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set # CONFIG_USB_SERIAL_CP210X is not set # CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_EMPEG is not set # CONFIG_USB_SERIAL_FTDI_SIO is not set # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_F81232 is not set # CONFIG_USB_SERIAL_F8153X is not set # CONFIG_USB_SERIAL_GARMIN is not set # CONFIG_USB_SERIAL_IPW is not set # CONFIG_USB_SERIAL_IUU is not set # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set # CONFIG_USB_SERIAL_KEYSPAN is not set # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_METRO is not set # CONFIG_USB_SERIAL_MOS7720 is not set # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MXUPORT is not set # CONFIG_USB_SERIAL_NAVMAN is not set # CONFIG_USB_SERIAL_PL2303 is not set # CONFIG_USB_SERIAL_OTI6858 is not set # CONFIG_USB_SERIAL_QCAUX is not set # CONFIG_USB_SERIAL_QUALCOMM is not set # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SAFE is not set # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_OPTION is not set # CONFIG_USB_SERIAL_OMNINET is not set # CONFIG_USB_SERIAL_OPTICON is not set # CONFIG_USB_SERIAL_XSENS_MT is not set # CONFIG_USB_SERIAL_WISHBONE is not set # CONFIG_USB_SERIAL_SSU100 is not set # CONFIG_USB_SERIAL_QT2 is not set # CONFIG_USB_SERIAL_UPD78F0730 is not set # CONFIG_USB_SERIAL_XR is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HUB_USB251XB is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # CONFIG_USB_ONBOARD_HUB is not set # # USB Physical Layer drivers # CONFIG_USB_PHY=y CONFIG_NOP_USB_XCEIV=y # CONFIG_AM335X_PHY_USB is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set # CONFIG_USB_ULPI is not set # end of USB Physical Layer drivers CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GADGET_DEBUG_FILES is not set # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # # USB Peripheral Controller # # CONFIG_USB_FUSB300 is not set # CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set # CONFIG_USB_SNP_UDC_PLAT is not set # CONFIG_USB_M66592 is not set # CONFIG_USB_BDC_UDC is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_GADGET_XILINX is not set # CONFIG_USB_MAX3420_UDC is not set # CONFIG_USB_DUMMY_HCD is not set # end of USB Peripheral Controller # CONFIG_USB_CONFIGFS is not set # # USB Gadget precomposed configurations # # CONFIG_USB_ZERO is not set # CONFIG_USB_AUDIO is not set # CONFIG_USB_ETH is not set # CONFIG_USB_G_NCM is not set # CONFIG_USB_GADGETFS is not set # CONFIG_USB_FUNCTIONFS is not set # CONFIG_USB_MASS_STORAGE is not set # CONFIG_USB_G_SERIAL is not set # CONFIG_USB_MIDI_GADGET is not set # CONFIG_USB_G_PRINTER is not set # CONFIG_USB_CDC_COMPOSITE is not set # CONFIG_USB_G_ACM_MS is not set # CONFIG_USB_G_MULTI is not set # CONFIG_USB_G_HID is not set # CONFIG_USB_G_DBGP is not set # CONFIG_USB_G_WEBCAM is not set # CONFIG_USB_RAW_GADGET is not set # end of USB Gadget precomposed configurations # CONFIG_TYPEC is not set # CONFIG_USB_ROLE_SWITCH is not set CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y # CONFIG_PWRSEQ_SD8787 is not set CONFIG_PWRSEQ_SIMPLE=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=8 # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_DEBUG is not set # CONFIG_MMC_SDHCI is not set # CONFIG_MMC_SPI is not set # CONFIG_MMC_DW is not set # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_SUNXI=y # CONFIG_MMC_CQHCI is not set # CONFIG_MMC_HSQ is not set # CONFIG_MMC_MTK is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y # CONFIG_LEDS_CLASS_FLASH is not set # CONFIG_LEDS_CLASS_MULTICOLOR is not set # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_AW2013 is not set # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_EL15203000 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP50XX is not set # CONFIG_LEDS_LP55XX_COMMON is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set # CONFIG_LEDS_PWM is not set # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_SYSCON is not set # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_SPI_BYTE is not set # CONFIG_LEDS_TI_LMU_COMMON is not set # # Flash and Torch LED drivers # # # RGB LED drivers # # # LED Triggers # CONFIG_LEDS_TRIGGERS=y # CONFIG_LEDS_TRIGGER_TIMER is not set # CONFIG_LEDS_TRIGGER_ONESHOT is not set CONFIG_LEDS_TRIGGER_DISK=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set # CONFIG_LEDS_TRIGGER_CPU is not set # CONFIG_LEDS_TRIGGER_ACTIVITY is not set # CONFIG_LEDS_TRIGGER_GPIO is not set CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set # CONFIG_LEDS_TRIGGER_PANIC is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set # CONFIG_LEDS_TRIGGER_AUDIO is not set # CONFIG_LEDS_TRIGGER_TTY is not set # # Simple LED drivers # # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_ATOMIC_SCRUB=y CONFIG_EDAC_SUPPORT=y CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # # CONFIG_RTC_INTF_SYSFS is not set # CONFIG_RTC_INTF_PROC is not set CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # 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 # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_HYM8563 is not set # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_NCT3018Y is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # 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_RV3032 is not set # CONFIG_RTC_DRV_RV8803 is not set # CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_CMOS is not set # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # 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_R7301 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_VIRTUAL_CHANNELS=y CONFIG_DMA_OF=y # CONFIG_ALTERA_MSGDMA is not set 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_XILINX_ZYNQMP_DPDMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set # CONFIG_DW_DMAC is not set # CONFIG_SF_PDMA is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set CONFIG_DMABUF_HEAPS=y # CONFIG_DMABUF_SYSFS_STATS is not set CONFIG_DMABUF_HEAPS_SYSTEM=y CONFIG_DMABUF_HEAPS_CMA=y # end of DMABUF options # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set # CONFIG_VIRTIO_MENU is not set # CONFIG_VDPA is not set # CONFIG_VHOST_MENU is not set # # Microsoft Hyper-V guest support # # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_RTLLIB is not set # CONFIG_RTL8723BS is not set # CONFIG_R8712U is not set CONFIG_R8188EU=m # CONFIG_VT6656 is not set # # IIO staging drivers # # # Accelerometers # # CONFIG_ADIS16203 is not set # CONFIG_ADIS16240 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7816 is not set # end of Analog to digital converters # # Analog digital bi-direction converters # # CONFIG_ADT7316 is not set # end of Analog digital bi-direction converters # # Direct Digital Synthesis # # CONFIG_AD9832 is not set # CONFIG_AD9834 is not set # end of Direct Digital Synthesis # # Network Analyzer, Impedance Converters # # CONFIG_AD5933 is not set # end of Network Analyzer, Impedance Converters # # Active energy metering IC # # CONFIG_ADE7854 is not set # end of Active energy metering IC # # Resolver to digital converters # # CONFIG_AD2S1210 is not set # end of Resolver to digital converters # end of IIO staging drivers CONFIG_STAGING_MEDIA=y # CONFIG_VIDEO_MAX96712 is not set CONFIG_VIDEO_SUNXI=y CONFIG_VIDEO_SUNXI_CEDRUS=y CONFIG_STAGING_MEDIA_DEPRECATED=y # CONFIG_VIDEO_CPIA2 is not set # CONFIG_VIDEO_STKWEBCAM is not set CONFIG_VIDEO_TM6000=m CONFIG_VIDEO_TM6000_ALSA=m CONFIG_VIDEO_TM6000_DVB=m # CONFIG_USB_ZR364XX is not set # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_FB_TFT is not set # CONFIG_KS7010 is not set # CONFIG_PI433 is not set # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_FIELDBUS_DEV is not set # CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Clock driver for ARM Reference designs # # CONFIG_CLK_ICST is not set # CONFIG_CLK_SP810 is not set # end of Clock driver for ARM Reference designs # CONFIG_LMK04832 is not set # CONFIG_COMMON_CLK_MAX9485 is not set # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set # CONFIG_COMMON_CLK_AXI_CLKGEN is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_RS9_PCIE is not set # CONFIG_COMMON_CLK_VC5 is not set # CONFIG_COMMON_CLK_VC7 is not set # CONFIG_COMMON_CLK_FIXED_MMIO is not set CONFIG_CLK_SUNXI=y CONFIG_CLK_SUNXI_CLOCKS=y # CONFIG_CLK_SUNXI_PRCM_SUN6I is not set # CONFIG_CLK_SUNXI_PRCM_SUN8I is not set # CONFIG_CLK_SUNXI_PRCM_SUN9I is not set CONFIG_SUNXI_CCU=y # CONFIG_SUN6I_RTC_CCU is not set # CONFIG_SUN8I_A23_CCU is not set # CONFIG_SUN8I_A33_CCU is not set # CONFIG_SUN8I_A83T_CCU is not set CONFIG_SUN8I_H3_CCU=y # CONFIG_SUN8I_V3S_CCU is not set CONFIG_SUN8I_DE2_CCU=y CONFIG_SUN8I_R40_CCU=y CONFIG_SUN8I_R_CCU=y # CONFIG_XILINX_VCU is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set # CONFIG_HWSPINLOCK is not set # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_PROBE=y CONFIG_CLKSRC_MMIO=y CONFIG_SUN4I_TIMER=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y # CONFIG_MICROCHIP_PIT64B is not set # end of Clock Source drivers # CONFIG_MAILBOX is not set # CONFIG_IOMMU_SUPPORT is not set # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # end of Remoteproc drivers # # Rpmsg drivers # # CONFIG_RPMSG_VIRTIO is not set # end of Rpmsg drivers # CONFIG_SOUNDWIRE is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # end of Amlogic SoC drivers # # Broadcom SoC drivers # # CONFIG_SOC_BRCMSTB is not set # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # CONFIG_QUICC_ENGINE is not set # CONFIG_FSL_RCPM is not set # end of NXP/Freescale QorIQ SoC drivers # # fujitsu SoC drivers # # end of fujitsu SoC drivers # # i.MX SoC drivers # # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # CONFIG_LITEX_SOC_CONTROLLER is not set # end of Enable LiteX SoC Builder specific drivers # # Qualcomm SoC drivers # # end of Qualcomm SoC drivers CONFIG_SUNXI_MBUS=y CONFIG_SUNXI_SRAM=y # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y CONFIG_DEVFREQ_GOV_PERFORMANCE=y CONFIG_DEVFREQ_GOV_POWERSAVE=y CONFIG_DEVFREQ_GOV_USERSPACE=y CONFIG_DEVFREQ_GOV_PASSIVE=y # # DEVFREQ Drivers # CONFIG_ARM_SUN8I_A33_MBUS_DEVFREQ=y CONFIG_PM_DEVFREQ_EVENT=y CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_FSA9480 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 # CONFIG_MEMORY is not set CONFIG_IIO=y CONFIG_IIO_BUFFER=y # CONFIG_IIO_BUFFER_CB is not set # CONFIG_IIO_BUFFER_DMA is not set # CONFIG_IIO_BUFFER_DMAENGINE is not set # CONFIG_IIO_BUFFER_HW_CONSUMER is not set # CONFIG_IIO_KFIFO_BUF is not set # CONFIG_IIO_TRIGGERED_BUFFER is not set CONFIG_IIO_CONFIGFS=y # CONFIG_IIO_TRIGGER is not set # CONFIG_IIO_SW_DEVICE is not set CONFIG_IIO_SW_TRIGGER=y # CONFIG_IIO_TRIGGERED_EVENT is not set # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADXL313_I2C is not set # CONFIG_ADXL313_SPI is not set # CONFIG_ADXL345_I2C is not set # CONFIG_ADXL345_SPI is not set # CONFIG_ADXL355_I2C is not set # CONFIG_ADXL355_SPI is not set # CONFIG_ADXL367_SPI is not set # CONFIG_ADXL367_I2C is not set # CONFIG_ADXL372_SPI is not set # CONFIG_ADXL372_I2C is not set # CONFIG_BMA180 is not set # CONFIG_BMA220 is not set # CONFIG_BMA400 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_BMI088_ACCEL is not set # CONFIG_DA280 is not set # CONFIG_DA311 is not set # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_DMARD10 is not set # CONFIG_FXLS8962AF_I2C is not set # CONFIG_FXLS8962AF_SPI is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MC3230 is not set # CONFIG_MMA7455_I2C is not set # CONFIG_MMA7455_SPI is not set # CONFIG_MMA7660 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MSA311 is not set # CONFIG_MXC4005 is not set # CONFIG_MXC6255 is not set # CONFIG_SCA3000 is not set # CONFIG_SCA3300 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7091R5 is not set # CONFIG_AD7124 is not set # CONFIG_AD7192 is not set # CONFIG_AD7266 is not set # CONFIG_AD7280 is not set # CONFIG_AD7291 is not set # CONFIG_AD7292 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_AD7780 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD7949 is not set # CONFIG_AD799X is not set # CONFIG_ADI_AXI_ADC is not set CONFIG_AXP20X_ADC=y # CONFIG_AXP288_ADC is not set # CONFIG_CC10001_ADC is not set # CONFIG_ENVELOPE_DETECTOR is not set # CONFIG_HI8435 is not set # CONFIG_HX711 is not set # CONFIG_INA2XX_ADC is not set # CONFIG_LTC2471 is not set # CONFIG_LTC2485 is not set # CONFIG_LTC2496 is not set # CONFIG_LTC2497 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX11100 is not set # CONFIG_MAX1118 is not set # CONFIG_MAX11205 is not set # CONFIG_MAX1241 is not set # CONFIG_MAX1363 is not set # CONFIG_MAX9611 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_MCP3911 is not set # CONFIG_NAU7802 is not set # CONFIG_RICHTEK_RTQ6056 is not set # CONFIG_SD_ADC_MODULATOR is not set CONFIG_SUN4I_GPADC=y # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC0832 is not set # CONFIG_TI_ADC084S021 is not set # CONFIG_TI_ADC12138 is not set # CONFIG_TI_ADC108S102 is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_TI_ADC161S626 is not set # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS7950 is not set # CONFIG_TI_ADS8344 is not set # CONFIG_TI_ADS8688 is not set # CONFIG_TI_ADS124S08 is not set # CONFIG_TI_ADS131E08 is not set # CONFIG_TI_TLC4541 is not set # CONFIG_TI_TSC2046 is not set # CONFIG_VF610_ADC is not set # CONFIG_XILINX_XADC is not set # end of Analog to digital converters # # Analog to digital and digital to analog converters # # CONFIG_AD74413R is not set # end of Analog to digital and digital to analog converters # # Analog Front Ends # # CONFIG_IIO_RESCALE is not set # end of Analog Front Ends # # Amplifiers # # CONFIG_AD8366 is not set # CONFIG_ADA4250 is not set # CONFIG_HMC425 is not set # end of Amplifiers # # Capacitance to digital converters # # CONFIG_AD7150 is not set # CONFIG_AD7746 is not set # end of Capacitance to digital converters # # Chemical Sensors # # CONFIG_ATLAS_PH_SENSOR is not set # CONFIG_ATLAS_EZO_SENSOR is not set # CONFIG_BME680 is not set # CONFIG_CCS811 is not set # CONFIG_IAQCORE is not set # CONFIG_PMS7003 is not set # CONFIG_SCD30_CORE is not set # CONFIG_SCD4X is not set # CONFIG_SENSIRION_SGP30 is not set # CONFIG_SENSIRION_SGP40 is not set # CONFIG_SPS30_I2C is not set # CONFIG_SPS30_SERIAL is not set # CONFIG_SENSEAIR_SUNRISE_CO2 is not set # CONFIG_VZ89X is not set # end of Chemical Sensors # # Hid Sensor IIO Common # # end of Hid Sensor IIO Common # # IIO SCMI Sensors # # end of IIO SCMI Sensors # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # end of SSP Sensor Common # # Digital to analog converters # # CONFIG_AD3552R is not set # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5592R is not set # CONFIG_AD5593R is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_LTC2688 is not set # CONFIG_AD5686_SPI is not set # CONFIG_AD5696_I2C is not set # CONFIG_AD5755 is not set # CONFIG_AD5758 is not set # CONFIG_AD5761 is not set # CONFIG_AD5764 is not set # CONFIG_AD5766 is not set # CONFIG_AD5770R is not set # CONFIG_AD5791 is not set # CONFIG_AD7293 is not set # CONFIG_AD7303 is not set # CONFIG_AD8801 is not set # CONFIG_DPOT_DAC is not set # CONFIG_DS4424 is not set # CONFIG_LTC1660 is not set # CONFIG_LTC2632 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # 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 # end of Digital to analog converters # # IIO dummy driver # # end of IIO dummy driver # # Filters # # end of Filters # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # end of Clock Generator/Distribution # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # CONFIG_ADF4371 is not set # CONFIG_ADMV1013 is not set # CONFIG_ADMV4420 is not set # CONFIG_ADRF6780 is not set # end of Phase-Locked Loop (PLL) frequency synthesizers # end of Frequency Synthesizers DDS/PLL # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS290 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_FXAS21002C is not set # CONFIG_MPU3050_I2C is not set # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # end of Digital gyroscope sensors # # Health Sensors # # # Heart Rate Monitors # # CONFIG_AFE4403 is not set # CONFIG_AFE4404 is not set # CONFIG_MAX30100 is not set # CONFIG_MAX30102 is not set # end of Heart Rate Monitors # end of Health Sensors # # Humidity sensors # # CONFIG_AM2315 is not set # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HDC2010 is not set # CONFIG_HTS221 is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # end of Humidity sensors # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16460 is not set # CONFIG_ADIS16475 is not set # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set # CONFIG_BOSCH_BNO055_SERIAL is not set # CONFIG_BOSCH_BNO055_I2C is not set # CONFIG_FXOS8700_I2C is not set # CONFIG_FXOS8700_SPI is not set # CONFIG_KMX61 is not set # CONFIG_INV_ICM42600_I2C is not set # CONFIG_INV_ICM42600_SPI is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set # CONFIG_IIO_ST_LSM6DSX is not set # CONFIG_IIO_ST_LSM9DS0 is not set # end of Inertial measurement units # # Light sensors # # CONFIG_ADJD_S311 is not set # CONFIG_ADUX1020 is not set # CONFIG_AL3010 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_AS73211 is not set # CONFIG_BH1750 is not set # CONFIG_BH1780 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM3605 is not set # CONFIG_CM36651 is not set # CONFIG_GP2AP002 is not set # CONFIG_GP2AP020A00F is not set # CONFIG_SENSORS_ISL29018 is not set # CONFIG_SENSORS_ISL29028 is not set # CONFIG_ISL29125 is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_LTRF216A is not set # CONFIG_LV0104CS is not set # CONFIG_MAX44000 is not set # CONFIG_MAX44009 is not set # CONFIG_NOA1305 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1133 is not set # CONFIG_SI1145 is not set # CONFIG_STK3310 is not set # CONFIG_ST_UVIS25 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set # CONFIG_SENSORS_TSL2563 is not set # CONFIG_TSL2583 is not set # CONFIG_TSL2591 is not set # CONFIG_TSL2772 is not set # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VCNL4035 is not set # CONFIG_VEML6030 is not set # CONFIG_VEML6070 is not set # CONFIG_VL6180 is not set # CONFIG_ZOPT2201 is not set # end of Light sensors # # Magnetometer sensors # # CONFIG_AK8974 is not set # CONFIG_AK8975 is not set # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN_I2C is not set # CONFIG_BMC150_MAGN_SPI is not set # CONFIG_MAG3110 is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # CONFIG_SENSORS_RM3100_I2C is not set # CONFIG_SENSORS_RM3100_SPI is not set # CONFIG_YAMAHA_YAS530 is not set # end of Magnetometer sensors # # Multiplexers # # CONFIG_IIO_MUX is not set # end of Multiplexers # # Inclinometer sensors # # end of Inclinometer sensors # # Linear and angular position sensors # # end of Linear and angular position sensors # # Digital potentiometers # # CONFIG_AD5110 is not set # CONFIG_AD5272 is not set # CONFIG_DS1803 is not set # CONFIG_MAX5432 is not set # CONFIG_MAX5481 is not set # CONFIG_MAX5487 is not set # CONFIG_MCP4018 is not set # CONFIG_MCP4131 is not set # CONFIG_MCP4531 is not set # CONFIG_MCP41010 is not set # CONFIG_TPL0102 is not set # end of Digital potentiometers # # Digital potentiostats # # CONFIG_LMP91000 is not set # end of Digital potentiostats # # Pressure sensors # # CONFIG_ABP060MG is not set # CONFIG_BMP280 is not set # CONFIG_DLHL60D is not set # CONFIG_DPS310 is not set # CONFIG_HP03 is not set # CONFIG_ICP10100 is not set # CONFIG_MPL115_I2C is not set # CONFIG_MPL115_SPI is not set # CONFIG_MPL3115 is not set # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # CONFIG_HP206C is not set # CONFIG_ZPA2326 is not set # end of Pressure sensors # # Lightning sensors # # CONFIG_AS3935 is not set # end of Lightning sensors # # Proximity and distance sensors # # CONFIG_ISL29501 is not set # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_MB1232 is not set # CONFIG_PING is not set # CONFIG_RFD77402 is not set # CONFIG_SRF04 is not set # CONFIG_SX9310 is not set # CONFIG_SX9324 is not set # CONFIG_SX9360 is not set # CONFIG_SX9500 is not set # CONFIG_SRF08 is not set # CONFIG_VCNL3020 is not set # CONFIG_VL53L0X_I2C is not set # end of Proximity and distance sensors # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1200 is not set # end of Resolver to digital converters # # Temperature sensors # # CONFIG_LTC2983 is not set # CONFIG_MAXIM_THERMOCOUPLE is not set # CONFIG_MLX90614 is not set # CONFIG_MLX90632 is not set # CONFIG_TMP006 is not set # CONFIG_TMP007 is not set # CONFIG_TMP117 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_MAX31856 is not set # CONFIG_MAX31865 is not set # end of Temperature sensors CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_DEBUG is not set # CONFIG_PWM_ATMEL_TCB is not set # CONFIG_PWM_CLK is not set # CONFIG_PWM_FSL_FTM is not set # CONFIG_PWM_PCA9685 is not set CONFIG_PWM_SUN4I=y # CONFIG_PWM_XILINX is not set # # IRQ chip support # CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 # CONFIG_AL_FIC is not set CONFIG_SUN6I_R_INTC=y CONFIG_SUNXI_NMI_INTC=y # CONFIG_XILINX_INTC is not set # end of IRQ chip support # CONFIG_IPACK_BUS is not set CONFIG_ARCH_HAS_RESET_CONTROLLER=y CONFIG_RESET_CONTROLLER=y CONFIG_RESET_SIMPLE=y CONFIG_RESET_SUNXI=y # CONFIG_RESET_TI_SYSCON is not set # CONFIG_RESET_TI_TPS380X is not set # # PHY Subsystem # CONFIG_GENERIC_PHY=y CONFIG_GENERIC_PHY_MIPI_DPHY=y # CONFIG_PHY_CAN_TRANSCEIVER is not set CONFIG_PHY_SUN4I_USB=y CONFIG_PHY_SUN6I_MIPI_DPHY=y CONFIG_PHY_SUN9I_USB=y CONFIG_PHY_SUN50I_USB3=y # # PHY drivers for Broadcom platforms # # CONFIG_BCM_KONA_USB2_PHY is not set # end of PHY drivers for Broadcom platforms # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_DPHY_RX is not set # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_CADENCE_SALVO is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_LAN966X_SERDES is not set # CONFIG_PHY_CPCAP_USB is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set # CONFIG_PHY_OCELOT_SERDES is not set # end of PHY Subsystem # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCI_PMU is not set # CONFIG_ARM_CCN is not set CONFIG_ARM_PMU=y # end of Performance monitor support # CONFIG_RAS is not set # # Android # # CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y # CONFIG_NVMEM_RMEM is not set CONFIG_NVMEM_SUNXI_SID=y # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_FSI is not set # CONFIG_TEE is not set CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set # CONFIG_PECI is not set # CONFIG_HTE is not set # end of Device Drivers # # 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 CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=m CONFIG_XFS_SUPPORT_V4=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_ONLINE_SCRUB is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_BTRFS_FS_REF_VERIFY is not set # CONFIG_NILFS2_FS is not set CONFIG_F2FS_FS=m CONFIG_F2FS_STAT_FS=y 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_FAULT_INJECTION is not set CONFIG_F2FS_FS_COMPRESSION=y CONFIG_F2FS_FS_LZO=y CONFIG_F2FS_FS_LZORLE=y CONFIG_F2FS_FS_LZ4=y CONFIG_F2FS_FS_LZ4HC=y CONFIG_F2FS_FS_ZSTD=y CONFIG_F2FS_IOSTAT=y # CONFIG_F2FS_UNFAIR_RWSEM is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y # CONFIG_FANOTIFY is not set # CONFIG_QUOTA is not set CONFIG_AUTOFS4_FS=y CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=m # CONFIG_CUSE is not set # CONFIG_VIRTIO_FS is not set CONFIG_OVERLAY_FS=m # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_METACOPY is not set # # Caches # # CONFIG_FSCACHE is not set # end of Caches # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=y # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=m CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set CONFIG_NTFS3_FS=m # CONFIG_NTFS3_LZX_XPRESS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y CONFIG_MEMFD_CREATE=y CONFIG_CONFIGFS_FS=y # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set CONFIG_HFS_FS=y CONFIG_HFSPLUS_FS=y # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y # CONFIG_SQUASHFS_FILE_CACHE is not set CONFIG_SQUASHFS_FILE_DIRECT=y # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y CONFIG_SQUASHFS_XATTR=y CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_PSTORE is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFS_SWAP=y CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=m CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" CONFIG_NFS_V4_1_MIGRATION=y CONFIG_ROOT_NFS=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFS_DISABLE_UDP_SUPPORT=y CONFIG_NFS_V4_2_READ_PLUS=y # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y CONFIG_SUNRPC_SWAP=y # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS2=y CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set CONFIG_CIFS_DEBUG=y # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DEBUG_DUMP_KEYS is not set # CONFIG_CIFS_DFS_UPCALL is not set # CONFIG_CIFS_SWN_UPCALL is not set # CONFIG_CIFS_ROOT is not set # CONFIG_SMB_SERVER is not set CONFIG_SMBFS=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_BIG_KEYS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEY_DH_OPERATIONS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set CONFIG_SECURITYFS=y CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_LSM="yama,loadpin,safesetid,integrity" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_STACK_ALL_PATTERN is not set # CONFIG_INIT_STACK_ALL_ZERO is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization CONFIG_RANDSTRUCT_NONE=y # end of Kernel hardening options # end of Security options CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_ENGINE=m # end of Crypto core or helper # # Public-key cryptography # CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y # CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set CONFIG_CRYPTO_ECC=m CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDSA=m # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set # end of Public-key cryptography # # Block ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SM4_GENERIC is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set CONFIG_CRYPTO_CTR=y # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # end of Length-preserving ciphers and modes # # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y # CONFIG_CRYPTO_ESSIV is not set # end of AEAD (authenticated encryption with associated data) ciphers # # Hashes, digests, and MACs # CONFIG_CRYPTO_BLAKE2B=m CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_XCBC is not set CONFIG_CRYPTO_XXHASH=m # end of Hashes, digests, and MACs # # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=m # CONFIG_CRYPTO_CRCT10DIF is not set # end of CRCs (cyclic redundancy checks) # # Compression # # CONFIG_CRYPTO_DEFLATE is not set # CONFIG_CRYPTO_LZO is not set # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # end of Compression # # Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation # # Userspace interface # CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set CONFIG_CRYPTO_USER_API_AEAD=y CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y # # Accelerated Cryptographic Algorithms for CPU (arm) # CONFIG_CRYPTO_POLY1305_ARM=y CONFIG_CRYPTO_BLAKE2S_ARM=y CONFIG_CRYPTO_SHA1_ARM=y CONFIG_CRYPTO_SHA256_ARM=y CONFIG_CRYPTO_SHA512_ARM=y CONFIG_CRYPTO_AES_ARM=y CONFIG_CRYPTO_CHACHA20_NEON=y # end of Accelerated Cryptographic Algorithms for CPU (arm) CONFIG_CRYPTO_HW=y CONFIG_CRYPTO_DEV_ALLWINNER=y CONFIG_CRYPTO_DEV_SUN4I_SS=m # CONFIG_CRYPTO_DEV_SUN4I_SS_PRNG is not set # CONFIG_CRYPTO_DEV_SUN4I_SS_DEBUG is not set CONFIG_CRYPTO_DEV_SUN8I_CE=m # CONFIG_CRYPTO_DEV_SUN8I_CE_DEBUG is not set CONFIG_CRYPTO_DEV_SUN8I_CE_HASH=y CONFIG_CRYPTO_DEV_SUN8I_CE_PRNG=y CONFIG_CRYPTO_DEV_SUN8I_CE_TRNG=y CONFIG_CRYPTO_DEV_SUN8I_SS=m # CONFIG_CRYPTO_DEV_SUN8I_SS_DEBUG is not set CONFIG_CRYPTO_DEV_SUN8I_SS_PRNG=y CONFIG_CRYPTO_DEV_SUN8I_SS_HASH=y # CONFIG_CRYPTO_DEV_ATMEL_ECC is not set # CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set # CONFIG_CRYPTO_DEV_SAFEXCEL is not set # CONFIG_CRYPTO_DEV_CCREE is not set # CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS8_PRIVATE_KEY_PARSER=m CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m CONFIG_RAID6_PQ_BENCHMARK=y CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_CORDIC=m # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y # # Crypto library routines # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=y CONFIG_CRYPTO_LIB_CURVE25519=y CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y CONFIG_CRYPTO_LIB_POLY1305=y CONFIG_CRYPTO_LIB_CHACHA20POLY1305=y CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_CRC_CCITT=y CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC64_ROCKSOFT is not set CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=m # CONFIG_CRC8 is not set CONFIG_XXHASH=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=m CONFIG_LZO_COMPRESS=m CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_COMPRESS=m CONFIG_LZ4HC_COMPRESS=m CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=m CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y CONFIG_XZ_DEC_POWERPC=y CONFIG_XZ_DEC_IA64=y CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y CONFIG_XZ_DEC_SPARC=y # CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_GZIP=y CONFIG_DECOMPRESS_ZSTD=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_DMA_DECLARE_COHERENT=y CONFIG_ARCH_HAS_SETUP_DMA_OPS=y CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_CMA=y # CONFIG_DMA_PERNUMA_CMA is not set # # Default contiguous memory area size: # CONFIG_CMA_SIZE_MBYTES=320 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_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y # CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_32=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y # end of Library routines CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set # CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set # CONFIG_DYNAMIC_DEBUG is not set # CONFIG_DYNAMIC_DEBUG_CORE is not set CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Compile-time checks and compiler options # CONFIG_AS_HAS_NON_CONST_LEB128=y CONFIG_DEBUG_INFO_NONE=y # CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y # CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set # CONFIG_UBSAN is not set CONFIG_HAVE_KCSAN_COMPILER=y # end of Generic Kernel Debugging Instruments # # Networking Debugging # # CONFIG_NET_DEV_REFCNT_TRACKER is not set # CONFIG_NET_NS_REFCNT_TRACKER is not set # CONFIG_DEBUG_NET is not set # end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set # CONFIG_DEBUG_WX is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set # CONFIG_DEBUG_VM is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_DEBUG_PER_CPU_MAPS is not set # CONFIG_DEBUG_KMAP_LOCAL is not set # CONFIG_DEBUG_HIGHMEM is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y # CONFIG_KFENCE is not set # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 # CONFIG_SOFTLOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # # CONFIG_SCHED_DEBUG is not set # CONFIG_SCHEDSTATS is not set # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set CONFIG_DEBUG_PREEMPT=y # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # end of Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_SAMPLES is not set # CONFIG_STRICT_DEVMEM is not set # # arm Debugging # # CONFIG_ARM_PTDUMP_DEBUGFS is not set # CONFIG_UNWINDER_FRAME_POINTER is not set CONFIG_UNWINDER_ARM=y CONFIG_ARM_UNWIND=y # CONFIG_BACKTRACE_VERBOSE is not set # CONFIG_DEBUG_USER is not set # CONFIG_DEBUG_LL is not set CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_CORESIGHT is not set # end of arm Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set # CONFIG_TEST_MIN_HEAP is not set # CONFIG_TEST_DIV64 is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_TEST_REF_TRACKER is not set # CONFIG_RBTREE_TEST is not set # CONFIG_REED_SOLOMON_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set # CONFIG_STRING_SELFTEST is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_STRSCPY is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_SCANF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_XARRAY is not set # CONFIG_TEST_MAPLE_TREE is not set # CONFIG_TEST_RHASHTABLE is not set # CONFIG_TEST_SIPHASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_BITOPS is not set # CONFIG_TEST_VMALLOC is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_TEST_BLACKHOLE_DEV is not set # CONFIG_FIND_BIT_BENCHMARK is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_SYSCTL is not set # CONFIG_TEST_UDELAY is not set # CONFIG_TEST_STATIC_KEYS is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMCAT_P is not set # CONFIG_TEST_MEMINIT is not set # CONFIG_TEST_FREE_PAGES is not set CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage # # Rust hacking # # end of Rust hacking # end of Kernel hacking ================================================ FILE: projects/Allwinner/options ================================================ ################################################################################ # setup system defaults ################################################################################ # Bootloader to use (syslinux / u-boot / bcm2835-bootloader) BOOTLOADER="u-boot" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="dtbs" # Additional kernel dependencies KERNEL_EXTRA_DEPENDS_TARGET="lz4:host" # Kernel to use. values can be: # default: default mainline kernel LINUX="default" EXTRA_CMDLINE="console=ttyS0,115200 console=tty1" ################################################################################ # setup build defaults ################################################################################ # Project CFLAGS PROJECT_CFLAGS="" # SquashFS compression method (gzip / lzo / xz / zstd) SQUASHFS_COMPRESSION="zstd" ################################################################################ # setup project defaults ################################################################################ # OpenGL(X) implementation to use (no / mesa) OPENGL="no" # Vulkan implementation to use (vulkan-loader / no) VULKAN="no" # Displayserver to use (wl / no) DISPLAYSERVER="no" # Windowmanager to use (weston / no) WINDOWMANAGER="no" # Xorg Graphic drivers to use (all / lima,panfrost) # Space separated list is supported, # e.g. GRAPHIC_DRIVERS="lima panfrost" GRAPHIC_DRIVERS="lima panfrost" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" FIRMWARE="misc-firmware wlan-firmware dvb-firmware brcmfmac_sdio-firmware" # build and install CEC framework support (yes / no) CEC_FRAMEWORK_SUPPORT="yes" # build with installer (yes / no) INSTALLER_SUPPORT="no" # debug tty path DEBUG_TTY="/dev/console" # additional packages to install: ADDITIONAL_PACKAGES+=" dt-overlays" ================================================ FILE: projects/Allwinner/patches/atf/0001-refactor-fdt-introduce-common-fdt_node_is_enabled.patch ================================================ From 49b268ce3036b2645c3a0caeaefb625f7a2d5982 Mon Sep 17 00:00:00 2001 From: Andre Przywara <andre.przywara@arm.com> Date: Fri, 3 Feb 2023 11:11:18 +0000 Subject: [PATCH] refactor(fdt): introduce common fdt_node_is_enabled() There are several users in the tree which want to check whether a given FDT node is enabled or not: the "status" property holds that information. So far all those users provide private implementations, some of them having issues. Export a generic implementation of that function in fdt_wrappers.h, as a "static inline" function to not increase code size. Also replace the existing implementation in Arm's fconf code, which had a tiny bug in needlessly using the property length: "status = [6f 6b 61 79 20];" would pass the check, where it should not. The proper solution is also simpler: status must be a string, and strings must be NUL-terminated in a DT. strcmp() would terminate on the first NUL in *either* of the two strings it compares, so it would never walk beyond the property boundary in the DTB. Change-Id: I9d89093432f127c09add6cf5c93a725bc534e5de Signed-off-by: Andre Przywara <andre.przywara@arm.com> --- include/common/fdt_wrappers.h | 10 ++++++++++ plat/arm/common/fconf/fconf_ethosn_getter.c | 15 --------------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/include/common/fdt_wrappers.h b/include/common/fdt_wrappers.h index 2929fc23d5bb..b16510f3d971 100644 --- a/include/common/fdt_wrappers.h +++ b/include/common/fdt_wrappers.h @@ -10,6 +10,7 @@ #define FDT_WRAPPERS_H #include <libfdt_env.h> +#include <libfdt.h> /* Number of cells, given total length in bytes. Each cell is 4 bytes long */ #define NCELLS(len) ((len) / 4U) @@ -53,6 +54,15 @@ static inline uint32_t fdt_blob_size(const void *dtb) return fdt32_to_cpu(dtb_header[1]); } +static inline bool fdt_node_is_enabled(const void *fdt, int node) +{ + int len; + const void *prop = fdt_getprop(fdt, node, "status", &len); + + /* A non-existing status property means the device is enabled. */ + return (prop == NULL) || (len == 5 && strcmp(prop, "okay") == 0); +} + #define fdt_for_each_compatible_node(dtb, node, compatible_str) \ for (node = fdt_node_offset_by_compatible(dtb, -1, compatible_str); \ node >= 0; \ diff --git a/plat/arm/common/fconf/fconf_ethosn_getter.c b/plat/arm/common/fconf/fconf_ethosn_getter.c index 0b48a9816338..251471e63b6a 100644 --- a/plat/arm/common/fconf/fconf_ethosn_getter.c +++ b/plat/arm/common/fconf/fconf_ethosn_getter.c @@ -20,21 +20,6 @@ struct ethosn_sub_allocator_t { uint32_t stream_id; }; -static bool fdt_node_is_enabled(const void *fdt, int node) -{ - int len; - const char *node_status; - - node_status = fdt_getprop(fdt, node, "status", &len); - if (node_status == NULL || - (len == 5 && /* Includes null character */ - strncmp(node_status, "okay", 4U) == 0)) { - return true; - } - - return false; -} - static bool fdt_node_has_reserved_memory(const void *fdt, int dev_node) { return fdt_get_property(fdt, dev_node, "memory-region", NULL) != NULL; -- 2.39.1 ================================================ FILE: projects/Allwinner/patches/atf/0002-fix-allwinner-check-RSB-availability-in-DT-on-H6.patch ================================================ From 8168cbaf31c876e20197dd3c5401292e24e8ae80 Mon Sep 17 00:00:00 2001 From: Andre Przywara <andre.przywara@arm.com> Date: Wed, 1 Feb 2023 22:28:37 +0000 Subject: [PATCH] fix(allwinner): check RSB availability in DT on H6 At the moment we access the RSB bus on all Allwinner H6 boards unconditionally, even though some boards do not have any PMIC at all, while others have some I2C devices connected to the same pins. The latter case is just fragile, but the first case leads to a hang on at least one board, as reported by Jernej. Scan the devicetree, to check for the availability of the RSB bus node. Proceed only if the RSB DT node is actually enabled. Change-Id: Iea7dcfe3e085e173334d098ec4ddcb6c4b085771 Signed-off-by: Andre Przywara <andre.przywara@arm.com> Reported-by: Jernej Skrabec <jernej.skrabec@gmail.com> --- plat/allwinner/sun50i_h6/sunxi_power.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plat/allwinner/sun50i_h6/sunxi_power.c b/plat/allwinner/sun50i_h6/sunxi_power.c index d298e6b8adaf..1257076dfd1b 100644 --- a/plat/allwinner/sun50i_h6/sunxi_power.c +++ b/plat/allwinner/sun50i_h6/sunxi_power.c @@ -8,8 +8,10 @@ #include <errno.h> #include <common/debug.h> +#include <common/fdt_wrappers.h> #include <drivers/allwinner/axp.h> #include <drivers/allwinner/sunxi_rsb.h> +#include <libfdt.h> #include <lib/mmio.h> #include <sunxi_cpucfg.h> @@ -63,7 +65,12 @@ static int rsb_init(void) int sunxi_pmic_setup(uint16_t socid, const void *fdt) { - int ret; + int node, ret; + + node = fdt_node_offset_by_compatible(fdt, 0, "allwinner,sun8i-a23-rsb"); + if ((node < 0) || !fdt_node_is_enabled(fdt, node)) { + return -ENODEV; + } INFO("PMIC: Probing AXP805 on RSB\n"); -- 2.39.1 ================================================ FILE: projects/Allwinner/patches/atf/0003-sunxi-Don-t-enable-referenced-regulators.patch ================================================ From 89a2da7c8bae95cf9225015489736e2fc434f4d9 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Sat, 2 Jan 2021 16:35:31 +0100 Subject: [PATCH] sunxi: Don't enable referenced regulators This break certain devices which need appropriate power on sequence. --- drivers/allwinner/axp/common.c | 3 --- 1 file changed, 3 deletions(-) --- a/drivers/allwinner/axp/common.c +++ b/drivers/allwinner/axp/common.c @@ -112,9 +112,6 @@ static bool should_enable_regulator(const void *fdt, if (is_node_disabled(fdt, node)) { return false; } - if (fdt_getprop(fdt, node, "phandle", NULL) != NULL) { - return true; - } if (fdt_getprop(fdt, node, "regulator-always-on", NULL) != NULL) { return true; } ================================================ FILE: projects/Allwinner/patches/ffmpeg/0001-WIP-deint-filter.patch ================================================ From 39069d9cc03a42cd497dd6b9756116ff4b684a5d Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Tue, 3 Dec 2019 21:01:18 +0100 Subject: [PATCH] WIP deint filter --- libavfilter/Makefile | 1 + libavfilter/allfilters.c | 1 + libavfilter/vf_deinterlace_v4l2m2m.c | 879 +++++++++++++++++++++++++++ 3 files changed, 881 insertions(+) create mode 100644 libavfilter/vf_deinterlace_v4l2m2m.c diff --git a/libavfilter/Makefile b/libavfilter/Makefile index 512354065305..625fd29f9313 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -218,6 +218,7 @@ OBJS-$(CONFIG_DEFLATE_FILTER) += vf_neighbor.o OBJS-$(CONFIG_DEFLICKER_FILTER) += vf_deflicker.o OBJS-$(CONFIG_DEINTERLACE_QSV_FILTER) += vf_deinterlace_qsv.o OBJS-$(CONFIG_DEINTERLACE_VAAPI_FILTER) += vf_deinterlace_vaapi.o vaapi_vpp.o +OBJS-$(CONFIG_DEINTERLACE_V4L2M2M_FILTER) += vf_deinterlace_v4l2m2m.o OBJS-$(CONFIG_DEJUDDER_FILTER) += vf_dejudder.o OBJS-$(CONFIG_DELOGO_FILTER) += vf_delogo.o OBJS-$(CONFIG_DENOISE_VAAPI_FILTER) += vf_misc_vaapi.o vaapi_vpp.o diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c index 1183e4026751..fe5a2e8c02e8 100644 --- a/libavfilter/allfilters.c +++ b/libavfilter/allfilters.c @@ -204,6 +204,7 @@ extern AVFilter ff_vf_dedot; extern AVFilter ff_vf_deflate; extern AVFilter ff_vf_deflicker; extern AVFilter ff_vf_deinterlace_qsv; +extern AVFilter ff_vf_deinterlace_v4l2m2m; extern AVFilter ff_vf_deinterlace_vaapi; extern AVFilter ff_vf_dejudder; extern AVFilter ff_vf_delogo; diff --git a/libavfilter/vf_deinterlace_v4l2m2m.c b/libavfilter/vf_deinterlace_v4l2m2m.c new file mode 100644 index 000000000000..1029e5b620fd --- /dev/null +++ b/libavfilter/vf_deinterlace_v4l2m2m.c @@ -0,0 +1,879 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * deinterlace video filter - V4L2 M2M + */ + +#include <drm_fourcc.h> + +#include <linux/videodev2.h> + +#include <dirent.h> +#include <fcntl.h> +#include <poll.h> +#include <stdatomic.h> +#include <stdio.h> +#include <string.h> +#include <sys/ioctl.h> +#include <sys/mman.h> +#include <unistd.h> + +#include "libavutil/avassert.h" +#include "libavutil/avstring.h" +#include "libavutil/common.h" +#include "libavutil/hwcontext.h" +#include "libavutil/hwcontext_drm.h" +#include "libavutil/internal.h" +#include "libavutil/mathematics.h" +#include "libavutil/opt.h" +#include "libavutil/pixdesc.h" +#include "libavutil/time.h" + +#include "avfilter.h" +#include "formats.h" +#include "internal.h" +#include "video.h" + +typedef struct V4L2Queue V4L2Queue; +typedef struct DeintV4L2M2MContextShared DeintV4L2M2MContextShared; + +typedef struct V4L2PlaneInfo { + int bytesperline; + size_t length; +} V4L2PlaneInfo; + +typedef struct V4L2Buffer { + int enqueued; + int reenqueue; + int fd; + struct v4l2_buffer buffer; + struct v4l2_plane planes[VIDEO_MAX_PLANES]; + int num_planes; + V4L2PlaneInfo plane_info[VIDEO_MAX_PLANES]; + AVDRMFrameDescriptor drm_frame; + V4L2Queue *q; +} V4L2Buffer; + +typedef struct V4L2Queue { + struct v4l2_format format; + int num_buffers; + V4L2Buffer *buffers; + DeintV4L2M2MContextShared *ctx; +} V4L2Queue; + +typedef struct DeintV4L2M2MContextShared { + int fd; + int done; + int width; + int height; + int orig_width; + int orig_height; + atomic_uint refcount; + + AVBufferRef *hw_frames_ctx; + + int frame_count; + AVFrame *frames[2]; + + V4L2Queue output; + V4L2Queue capture; +} DeintV4L2M2MContextShared; + +typedef struct DeintV4L2M2MContext { + const AVClass *class; + + DeintV4L2M2MContextShared *shared; +} DeintV4L2M2MContext; + +static int deint_v4l2m2m_prepare_context(DeintV4L2M2MContextShared *ctx) +{ + struct v4l2_capability cap; + int ret; + + memset(&cap, 0, sizeof(cap)); + ret = ioctl(ctx->fd, VIDIOC_QUERYCAP, &cap); + if (ret < 0) + return ret; + + if (!(cap.capabilities & V4L2_CAP_STREAMING)) + return AVERROR(EINVAL); + + if (cap.capabilities & V4L2_CAP_VIDEO_M2M) { + ctx->capture.format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + ctx->output.format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; + + return 0; + } + + if (cap.capabilities & V4L2_CAP_VIDEO_M2M_MPLANE) { + ctx->capture.format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; + ctx->output.format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; + + return 0; + } + + return AVERROR(EINVAL); +} + +static int deint_v4l2m2m_try_format(V4L2Queue *queue) +{ + struct v4l2_format *fmt = &queue->format; + DeintV4L2M2MContextShared *ctx = queue->ctx; + int ret, field; + + ret = ioctl(ctx->fd, VIDIOC_G_FMT, fmt); + if (ret) + av_log(NULL, AV_LOG_ERROR, "VIDIOC_G_FMT failed: %d\n", ret); + + if (V4L2_TYPE_IS_OUTPUT(fmt->type)) + field = V4L2_FIELD_INTERLACED_TB; + else + field = V4L2_FIELD_NONE; + + if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { + fmt->fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12; + fmt->fmt.pix_mp.field = field; + fmt->fmt.pix_mp.width = ctx->width; + fmt->fmt.pix_mp.height = ctx->height; + } else { + fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_NV12; + fmt->fmt.pix.field = field; + fmt->fmt.pix.width = ctx->width; + fmt->fmt.pix.height = ctx->height; + } + + ret = ioctl(ctx->fd, VIDIOC_TRY_FMT, fmt); + if (ret) + return AVERROR(EINVAL); + + if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { + if (fmt->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_NV12 || + fmt->fmt.pix_mp.field != field) { + av_log(NULL, AV_LOG_DEBUG, "format not supported for type %d\n", fmt->type); + + return AVERROR(EINVAL); + } + } else { + if (fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_NV12 || + fmt->fmt.pix.field != field) { + av_log(NULL, AV_LOG_DEBUG, "format not supported for type %d\n", fmt->type); + + return AVERROR(EINVAL); + } + } + + return 0; +} + +static int deint_v4l2m2m_set_format(V4L2Queue *queue, uint32_t field, int width, int height) +{ + struct v4l2_format *fmt = &queue->format; + DeintV4L2M2MContextShared *ctx = queue->ctx; + int ret; + + if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { + fmt->fmt.pix_mp.field = field; + fmt->fmt.pix_mp.width = width; + fmt->fmt.pix_mp.height = height; + /* TODO: bytesperline and imagesize */ + } else { + fmt->fmt.pix.field = field; + fmt->fmt.pix.width = width; + fmt->fmt.pix.height = height; + fmt->fmt.pix.sizeimage = 0; + fmt->fmt.pix.bytesperline = 0; + } + + ret = ioctl(ctx->fd, VIDIOC_S_FMT, fmt); + if (ret) + av_log(NULL, AV_LOG_ERROR, "VIDIOC_S_FMT failed: %d\n", ret); + + return ret; +} + +static int deint_v4l2m2m_probe_device(DeintV4L2M2MContextShared *ctx, char *node) +{ + int ret; + + ctx->fd = open(node, O_RDWR | O_NONBLOCK, 0); + if (ctx->fd < 0) + return AVERROR(errno); + + ret = deint_v4l2m2m_prepare_context(ctx); + if (ret) + goto fail; + + ret = deint_v4l2m2m_try_format(&ctx->capture); + if (ret) + goto fail; + + ret = deint_v4l2m2m_try_format(&ctx->output); + if (ret) + goto fail; + + return 0; + +fail: + close(ctx->fd); + ctx->fd = -1; + + return ret; +} + +static int deint_v4l2m2m_find_device(DeintV4L2M2MContextShared *ctx) +{ + int ret = AVERROR(EINVAL); + struct dirent *entry; + char node[PATH_MAX]; + DIR *dirp; + + dirp = opendir("/dev"); + if (!dirp) + return AVERROR(errno); + + for (entry = readdir(dirp); entry; entry = readdir(dirp)) { + + if (strncmp(entry->d_name, "video", 5)) + continue; + + snprintf(node, sizeof(node), "/dev/%s", entry->d_name); + av_log(NULL, AV_LOG_DEBUG, "probing device %s\n", node); + ret = deint_v4l2m2m_probe_device(ctx, node); + if (!ret) + break; + } + + closedir(dirp); + + if (ret) { + av_log(NULL, AV_LOG_ERROR, "Could not find a valid device\n"); + ctx->fd = -1; + + return ret; + } + + av_log(NULL, AV_LOG_INFO, "Using device %s\n", node); + + return 0; +} + +static int deint_v4l2m2m_enqueue_buffer(V4L2Buffer *buf) +{ + int ret; + + ret = ioctl(buf->q->ctx->fd, VIDIOC_QBUF, &buf->buffer); + if (ret < 0) + return AVERROR(errno); + + buf->enqueued = 1; + + return 0; +} + +static int v4l2_buffer_export_drm(V4L2Buffer* avbuf) +{ + struct v4l2_exportbuffer expbuf; + int i, ret; + + for (i = 0; i < avbuf->num_planes; i++) { + memset(&expbuf, 0, sizeof(expbuf)); + + expbuf.index = avbuf->buffer.index; + expbuf.type = avbuf->buffer.type; + expbuf.plane = i; + + ret = ioctl(avbuf->q->ctx->fd, VIDIOC_EXPBUF, &expbuf); + if (ret < 0) + return AVERROR(errno); + + avbuf->fd = expbuf.fd; + + if (V4L2_TYPE_IS_MULTIPLANAR(avbuf->buffer.type)) { + /* drm frame */ + avbuf->drm_frame.objects[i].size = avbuf->buffer.m.planes[i].length; + avbuf->drm_frame.objects[i].fd = expbuf.fd; + avbuf->drm_frame.objects[i].format_modifier = DRM_FORMAT_MOD_LINEAR; + } else { + /* drm frame */ + avbuf->drm_frame.objects[0].size = avbuf->buffer.length; + avbuf->drm_frame.objects[0].fd = expbuf.fd; + avbuf->drm_frame.objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; + } + } + + return 0; +} + +static int deint_v4l2m2m_allocate_buffers(V4L2Queue *queue) +{ + struct v4l2_format *fmt = &queue->format; + DeintV4L2M2MContextShared *ctx = queue->ctx; + struct v4l2_requestbuffers req; + int ret, i, j, multiplanar; + uint32_t memory; + + memory = V4L2_TYPE_IS_OUTPUT(fmt->type) ? + V4L2_MEMORY_DMABUF : V4L2_MEMORY_MMAP; + + multiplanar = V4L2_TYPE_IS_MULTIPLANAR(fmt->type); + + memset(&req, 0, sizeof(req)); + req.count = queue->num_buffers; + req.memory = memory; + req.type = fmt->type; + + ret = ioctl(ctx->fd, VIDIOC_REQBUFS, &req); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "VIDIOC_REQBUFS failed: %s\n", strerror(errno)); + + return AVERROR(errno); + } + + queue->num_buffers = req.count; + queue->buffers = av_mallocz(queue->num_buffers * sizeof(V4L2Buffer)); + if (!queue->buffers) { + av_log(NULL, AV_LOG_ERROR, "malloc enomem\n"); + + return AVERROR(ENOMEM); + } + + for (i = 0; i < queue->num_buffers; i++) { + V4L2Buffer *buf = &queue->buffers[i]; + + buf->enqueued = 0; + buf->fd = -1; + buf->q = queue; + + buf->buffer.type = fmt->type; + buf->buffer.memory = memory; + buf->buffer.index = i; + + if (multiplanar) { + buf->buffer.length = VIDEO_MAX_PLANES; + buf->buffer.m.planes = buf->planes; + } + + ret = ioctl(ctx->fd, VIDIOC_QUERYBUF, &buf->buffer); + if (ret < 0) { + ret = AVERROR(errno); + + goto fail; + } + + if (multiplanar) + buf->num_planes = buf->buffer.length; + else + buf->num_planes = 1; + + for (j = 0; j < buf->num_planes; j++) { + V4L2PlaneInfo *info = &buf->plane_info[j]; + + if (multiplanar) { + info->bytesperline = fmt->fmt.pix_mp.plane_fmt[j].bytesperline; + info->length = buf->buffer.m.planes[j].length; + } else { + info->bytesperline = fmt->fmt.pix.bytesperline; + info->length = buf->buffer.length; + } + } + + if (!V4L2_TYPE_IS_OUTPUT(fmt->type)) { + ret = deint_v4l2m2m_enqueue_buffer(buf); + if (ret) + goto fail; + + ret = v4l2_buffer_export_drm(buf); + if (ret) + goto fail; + } + } + + return 0; + +fail: + for (i = 0; i < queue->num_buffers; i++) + if (queue->buffers[i].fd >= 0) + close(queue->buffers[i].fd); + av_free(queue->buffers); + queue->buffers = NULL; + + return ret; +} + +static int deint_v4l2m2m_streamon(V4L2Queue *queue) +{ + int type = queue->format.type; + int ret; + + ret = ioctl(queue->ctx->fd, VIDIOC_STREAMON, &type); + if (ret < 0) + return AVERROR(errno); + + return 0; +} + +static int deint_v4l2m2m_streamoff(V4L2Queue *queue) +{ + int type = queue->format.type; + int ret; + + ret = ioctl(queue->ctx->fd, VIDIOC_STREAMOFF, &type); + if (ret < 0) + return AVERROR(errno); + + return 0; +} + +static V4L2Buffer* deint_v4l2m2m_dequeue_buffer(V4L2Queue *queue, int timeout) +{ + struct v4l2_plane planes[VIDEO_MAX_PLANES]; + DeintV4L2M2MContextShared *ctx = queue->ctx; + struct v4l2_buffer buf = { 0 }; + V4L2Buffer* avbuf = NULL; + struct pollfd pfd; + short events; + int ret; + + if (V4L2_TYPE_IS_OUTPUT(queue->format.type)) + events = POLLOUT | POLLWRNORM; + else + events = POLLIN | POLLRDNORM; + + pfd.events = events; + pfd.fd = ctx->fd; + + for (;;) { + ret = poll(&pfd, 1, timeout); + if (ret > 0) + break; + if (errno == EINTR) + continue; + return NULL; + } + + if (pfd.revents & POLLERR) + return NULL; + + if (pfd.revents & events) { + memset(&buf, 0, sizeof(buf)); + buf.memory = V4L2_MEMORY_MMAP; + buf.type = queue->format.type; + if (V4L2_TYPE_IS_MULTIPLANAR(queue->format.type)) { + memset(planes, 0, sizeof(planes)); + buf.length = VIDEO_MAX_PLANES; + buf.m.planes = planes; + } + + ret = ioctl(ctx->fd, VIDIOC_DQBUF, &buf); + if (ret) { + if (errno != EAGAIN) + av_log(NULL, AV_LOG_DEBUG, "VIDIOC_DQBUF, errno (%s)\n", + av_err2str(AVERROR(errno))); + return NULL; + } + + avbuf = &queue->buffers[buf.index]; + avbuf->enqueued = 0; + avbuf->buffer = buf; + if (V4L2_TYPE_IS_MULTIPLANAR(queue->format.type)) { + memcpy(avbuf->planes, planes, sizeof(planes)); + avbuf->buffer.m.planes = avbuf->planes; + } + + return avbuf; + } + + return NULL; +} + +static V4L2Buffer *deint_v4l2m2m_find_free_buf(V4L2Queue *queue) +{ + int i; + + for (i = 0; i < queue->num_buffers; i++) + if (!queue->buffers[i].enqueued) + return &queue->buffers[i]; + + return NULL; +} + +static int deint_v4l2m2m_enqueue(V4L2Queue *queue, const AVFrame* frame) +{ + AVDRMFrameDescriptor *drm_desc = (AVDRMFrameDescriptor *)frame->data[0]; + V4L2Buffer *buf; + int i; + + if (V4L2_TYPE_IS_OUTPUT(queue->format.type)) + while (deint_v4l2m2m_dequeue_buffer(queue, 0)); + + buf = deint_v4l2m2m_find_free_buf(queue); + if (!buf) + return AVERROR(ENOMEM); + + if (V4L2_TYPE_IS_MULTIPLANAR(buf->buffer.type)) + for (i = 0; i < drm_desc->nb_objects; i++) + buf->buffer.m.planes[i].m.fd = drm_desc->objects[i].fd; + else + buf->buffer.m.fd = drm_desc->objects[0].fd; + + return deint_v4l2m2m_enqueue_buffer(buf); +} + +static void deint_v4l2m2m_destroy_context(DeintV4L2M2MContextShared *ctx) +{ + if (atomic_fetch_sub(&ctx->refcount, 1) == 1) { + V4L2Queue *capture = &ctx->capture; + V4L2Queue *output = &ctx->output; + int i; + + av_log(NULL, AV_LOG_DEBUG, "%s - destroying context\n", __func__); + + if (ctx->fd >= 0) { + deint_v4l2m2m_streamoff(capture); + deint_v4l2m2m_streamoff(output); + } + + if (capture->buffers) + for (i = 0; i < capture->num_buffers; i++) { + capture->buffers[i].q = NULL; + if (capture->buffers[i].fd >= 0) + close(capture->buffers[i].fd); + } + + for (i = 0; i < ctx->frame_count; i++) + av_frame_free(&ctx->frames[i]); + + av_buffer_unref(&ctx->hw_frames_ctx); + + if (capture->buffers) + av_free(capture->buffers); + + if (output->buffers) + av_free(output->buffers); + + if (ctx->fd >= 0) { + close(ctx->fd); + ctx->fd = -1; + } + + av_free(ctx); + } +} + +static void v4l2_free_buffer(void *opaque, uint8_t *unused) +{ + V4L2Buffer *buf = opaque; + DeintV4L2M2MContextShared *ctx = buf->q->ctx; + + if (!ctx->done) + deint_v4l2m2m_enqueue_buffer(buf); + + deint_v4l2m2m_destroy_context(ctx); +} + +static uint8_t *v4l2_get_drm_frame(V4L2Buffer *avbuf, int height) +{ + AVDRMFrameDescriptor *drm_desc = &avbuf->drm_frame; + AVDRMLayerDescriptor *layer; + + /* fill the DRM frame descriptor */ + drm_desc->nb_objects = avbuf->num_planes; + drm_desc->nb_layers = 1; + + layer = &drm_desc->layers[0]; + layer->nb_planes = avbuf->num_planes; + + for (int i = 0; i < avbuf->num_planes; i++) { + layer->planes[i].object_index = i; + layer->planes[i].offset = 0; + layer->planes[i].pitch = avbuf->plane_info[i].bytesperline; + } + + layer->format = DRM_FORMAT_NV12; + + if (avbuf->num_planes == 1) { + layer->nb_planes = 2; + + layer->planes[1].object_index = 0; + layer->planes[1].offset = avbuf->plane_info[0].bytesperline * height; + layer->planes[1].pitch = avbuf->plane_info[0].bytesperline; + } + + return (uint8_t *)drm_desc; +} + +static int deint_v4l2m2m_dequeue_frame(V4L2Queue *queue, AVFrame* frame, int timeout) +{ + DeintV4L2M2MContextShared *ctx = queue->ctx; + V4L2Buffer* avbuf; + + avbuf = deint_v4l2m2m_dequeue_buffer(queue, timeout); + if (!avbuf) { + av_log(NULL, AV_LOG_ERROR, "dequeueing failed\n"); + return AVERROR(EINVAL); + } + + frame->buf[0] = av_buffer_create((uint8_t *) &avbuf->drm_frame, + sizeof(avbuf->drm_frame), v4l2_free_buffer, + avbuf, AV_BUFFER_FLAG_READONLY); + if (!frame->buf[0]) + return AVERROR(ENOMEM); + + atomic_fetch_add(&ctx->refcount, 1); + + frame->data[0] = (uint8_t *)v4l2_get_drm_frame(avbuf, ctx->orig_height); + frame->format = AV_PIX_FMT_DRM_PRIME; + frame->hw_frames_ctx = av_buffer_ref(ctx->hw_frames_ctx); + frame->height = ctx->height; + frame->width = ctx->width; + + if (avbuf->buffer.flags & V4L2_BUF_FLAG_ERROR) { + av_log(NULL, AV_LOG_ERROR, "driver decode error\n"); + frame->decode_error_flags |= FF_DECODE_ERROR_INVALID_BITSTREAM; + } + + return 0; +} + +static int deint_v4l2m2m_dequeue(AVFilterContext *avctx, AVFrame *input_frame, int field) +{ + DeintV4L2M2MContext *priv = avctx->priv; + DeintV4L2M2MContextShared *ctx = priv->shared; + AVFilterLink *outlink = avctx->outputs[0]; + AVFrame *output_frame; + int err; + + output_frame = av_frame_alloc(); + + if (!output_frame) + return AVERROR(ENOMEM); + + err = deint_v4l2m2m_dequeue_frame(&ctx->capture, output_frame, 500); + if (err < 0) { + av_log(priv, AV_LOG_ERROR, "no frame (field %d)\n", field); + goto fail; + } + + err = av_frame_copy_props(output_frame, input_frame); + if (err < 0) + goto fail; + + output_frame->interlaced_frame = 0; + + if (field == 0) { + output_frame->pts *= 2; + } else { + int64_t cur_pts = ctx->frames[0]->pts; + int64_t next_pts = ctx->frames[1]->pts; + + if (next_pts != AV_NOPTS_VALUE && cur_pts != AV_NOPTS_VALUE) { + output_frame->pts = next_pts + cur_pts; + } else { + output_frame->pts = AV_NOPTS_VALUE; + } + } + av_log(priv, AV_LOG_DEBUG, "pts: %"PRId64" (field %d)\n", output_frame->pts, field); + + return ff_filter_frame(outlink, output_frame); + +fail: + av_frame_free(&output_frame); + return err; +} + +static int deint_v4l2m2m_config_props(AVFilterLink *outlink) +{ + AVFilterLink *inlink = outlink->src->inputs[0]; + AVFilterContext *avctx = outlink->src; + DeintV4L2M2MContext *priv = avctx->priv; + DeintV4L2M2MContextShared *ctx = priv->shared; + int ret; + + ctx->height = avctx->inputs[0]->h; + ctx->width = avctx->inputs[0]->w; + + outlink->frame_rate = av_mul_q(inlink->frame_rate, + (AVRational){ 2, 1 }); + outlink->time_base = av_mul_q(inlink->time_base, + (AVRational){ 1, 2 }); + + ret = deint_v4l2m2m_find_device(ctx); + if (ret) + return ret; + + if (!inlink->hw_frames_ctx) { + av_log(priv, AV_LOG_ERROR, "No hw context provided on input\n"); + return AVERROR(EINVAL); + } + + ctx->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx); + if (!ctx->hw_frames_ctx) + return AVERROR(ENOMEM); + + return 0; +} + +static int deint_v4l2m2m_query_formats(AVFilterContext *avctx) +{ + static const enum AVPixelFormat pixel_formats[] = { + AV_PIX_FMT_DRM_PRIME, + AV_PIX_FMT_NONE, + }; + + return ff_set_common_formats(avctx, ff_make_format_list(pixel_formats)); +} + +static int deint_v4l2m2m_filter_frame(AVFilterLink *link, AVFrame *in) +{ + AVFilterContext *avctx = link->dst; + DeintV4L2M2MContext *priv = avctx->priv; + DeintV4L2M2MContextShared *ctx = priv->shared; + V4L2Queue *capture = &ctx->capture; + V4L2Queue *output = &ctx->output; + int ret; + + av_log(priv, AV_LOG_DEBUG, "input pts: %"PRId64"\n", in->pts); + if (!ctx->frame_count) { + AVDRMFrameDescriptor *drm_desc = (AVDRMFrameDescriptor *)in->data[0]; + unsigned int field; + + ctx->orig_width = drm_desc->layers[0].planes[0].pitch; + ctx->orig_height = drm_desc->layers[0].planes[1].offset / ctx->orig_width; + + if (in->top_field_first) + field = V4L2_FIELD_INTERLACED_TB; + else + field = V4L2_FIELD_INTERLACED_BT; + + ret = deint_v4l2m2m_set_format(output, field, ctx->orig_width, ctx->orig_height); + if (ret) + return ret; + + ret = deint_v4l2m2m_set_format(capture, V4L2_FIELD_NONE, ctx->orig_width, ctx->orig_height); + if (ret) + return ret; + + ret = deint_v4l2m2m_allocate_buffers(capture); + if (ret) + return ret; + + ret = deint_v4l2m2m_streamon(capture); + if (ret) + return ret; + + ret = deint_v4l2m2m_allocate_buffers(output); + if (ret) + return ret; + + ret = deint_v4l2m2m_streamon(output); + if (ret) + return ret; + } + + if (ctx->frame_count < 2) { + ctx->frames[ctx->frame_count++] = in; + } else { + av_frame_free(&ctx->frames[0]); + ctx->frames[0] = ctx->frames[1]; + ctx->frames[1] = in; + } + + ret = deint_v4l2m2m_enqueue(output, in); + if (ret) + return ret; + + if (ctx->frame_count == 2) { + ret = deint_v4l2m2m_dequeue(avctx, ctx->frames[0], 0); + if (ret) + return ret; + + ret = deint_v4l2m2m_dequeue(avctx, ctx->frames[0], 1); + if (ret) + return ret; + } + + return 0; +} + +static av_cold int deint_v4l2m2m_init(AVFilterContext *avctx) +{ + DeintV4L2M2MContext *priv = avctx->priv; + DeintV4L2M2MContextShared *ctx; + + ctx = av_mallocz(sizeof(DeintV4L2M2MContextShared)); + if (!ctx) + return AVERROR(ENOMEM); + + priv->shared = ctx; + ctx->fd = -1; + ctx->output.ctx = ctx; + ctx->output.num_buffers = 6; + ctx->capture.ctx = ctx; + ctx->capture.num_buffers = 6; + ctx->done = 0; + atomic_init(&ctx->refcount, 1); + + return 0; +} + +static void deint_v4l2m2m_uninit(AVFilterContext *avctx) +{ + DeintV4L2M2MContext *priv = avctx->priv; + DeintV4L2M2MContextShared *ctx = priv->shared; + + ctx->done = 1; + deint_v4l2m2m_destroy_context(ctx); +} + +static const AVOption deinterlace_v4l2m2m_options[] = { + { NULL }, +}; + +AVFILTER_DEFINE_CLASS(deinterlace_v4l2m2m); + +static const AVFilterPad deint_v4l2m2m_inputs[] = { + { + .name = "default", + .type = AVMEDIA_TYPE_VIDEO, + .filter_frame = deint_v4l2m2m_filter_frame, + }, + { NULL } +}; + +static const AVFilterPad deint_v4l2m2m_outputs[] = { + { + .name = "default", + .type = AVMEDIA_TYPE_VIDEO, + .config_props = deint_v4l2m2m_config_props, + }, + { NULL } +}; + +AVFilter ff_vf_deinterlace_v4l2m2m = { + .name = "deinterlace_v4l2m2m", + .description = NULL_IF_CONFIG_SMALL("V4L2 M2M deinterlacer"), + .priv_size = sizeof(DeintV4L2M2MContext), + .init = &deint_v4l2m2m_init, + .uninit = &deint_v4l2m2m_uninit, + .query_formats = &deint_v4l2m2m_query_formats, + .inputs = deint_v4l2m2m_inputs, + .outputs = deint_v4l2m2m_outputs, + .priv_class = &deinterlace_v4l2m2m_class, +}; -- 2.29.2 ================================================ FILE: projects/Allwinner/patches/ffmpeg/0002-libavfilter-v4l2deinterlace-dequeue-both-destination.patch ================================================ From 6bea46839ba23bffaa093bb9ed805d571aaa66ea Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Wed, 30 Sep 2020 21:11:34 +0200 Subject: [PATCH] libavfilter: v4l2deinterlace: dequeue both destination buffers on time Signed-off-by: Alex Bee <knaerzche@gmail.com> --- libavfilter/vf_deinterlace_v4l2m2m.c | 140 +++++++++++++++++---------- 1 file changed, 88 insertions(+), 52 deletions(-) diff --git a/libavfilter/vf_deinterlace_v4l2m2m.c b/libavfilter/vf_deinterlace_v4l2m2m.c index 1029e5b620fd..72d28333ffa7 100644 --- a/libavfilter/vf_deinterlace_v4l2m2m.c +++ b/libavfilter/vf_deinterlace_v4l2m2m.c @@ -89,8 +89,14 @@ typedef struct DeintV4L2M2MContextShared { AVBufferRef *hw_frames_ctx; - int frame_count; - AVFrame *frames[2]; + /* + * TODO: check if its really neccessary to hold this + * ref, it's only used for freeing av_frame on decoding + * end/abort + */ + AVFrame *cur_in_frame; + AVFrame *prev_in_frame; + unsigned int field_order; V4L2Queue output; V4L2Queue capture; @@ -557,8 +563,11 @@ static void deint_v4l2m2m_destroy_context(DeintV4L2M2MContextShared *ctx) close(capture->buffers[i].fd); } - for (i = 0; i < ctx->frame_count; i++) - av_frame_free(&ctx->frames[i]); + if (ctx->cur_in_frame) + av_frame_free(&ctx->cur_in_frame); + + if (ctx->prev_in_frame) + av_frame_free(&ctx->prev_in_frame); av_buffer_unref(&ctx->hw_frames_ctx); @@ -652,49 +661,79 @@ static int deint_v4l2m2m_dequeue_frame(V4L2Queue *queue, AVFrame* frame, int tim return 0; } -static int deint_v4l2m2m_dequeue(AVFilterContext *avctx, AVFrame *input_frame, int field) +static int deint_v4l2m2m_dequeue(AVFilterContext *avctx, AVFrame *input_frame) { DeintV4L2M2MContext *priv = avctx->priv; DeintV4L2M2MContextShared *ctx = priv->shared; AVFilterLink *outlink = avctx->outputs[0]; - AVFrame *output_frame; + AVFrame *output_frame_1, *output_frame_2; + int64_t first_pts = AV_NOPTS_VALUE; int err; - output_frame = av_frame_alloc(); + av_log(priv, AV_LOG_DEBUG, "input pts: %"PRId64" (field %d)\n", + input_frame->pts, ctx->field_order); - if (!output_frame) + output_frame_1 = av_frame_alloc(); + if (!output_frame_1) return AVERROR(ENOMEM); - err = deint_v4l2m2m_dequeue_frame(&ctx->capture, output_frame, 500); + err = deint_v4l2m2m_dequeue_frame(&ctx->capture, output_frame_1, 500); if (err < 0) { - av_log(priv, AV_LOG_ERROR, "no frame (field %d)\n", field); - goto fail; + av_log(priv, AV_LOG_ERROR, "no 1st frame (field %d)\n", ctx->field_order); + goto fail_out1; } - err = av_frame_copy_props(output_frame, input_frame); + err = av_frame_copy_props(output_frame_1, input_frame); if (err < 0) - goto fail; + goto fail_out1; - output_frame->interlaced_frame = 0; + output_frame_1->interlaced_frame = 0; - if (field == 0) { - output_frame->pts *= 2; - } else { - int64_t cur_pts = ctx->frames[0]->pts; - int64_t next_pts = ctx->frames[1]->pts; + output_frame_2 = av_frame_alloc(); + if (!output_frame_2) { + err = AVERROR(ENOMEM); + goto fail_out1; + } + + err = deint_v4l2m2m_dequeue_frame(&ctx->capture, output_frame_2, 500); + if (err < 0) { + av_log(priv, AV_LOG_ERROR, "no 2nd frame (field %d)\n", ctx->field_order); + goto fail_out2; + } + + err = av_frame_copy_props(output_frame_2, input_frame); + if (err < 0) + goto fail_out2; + + output_frame_2->interlaced_frame = 0; - if (next_pts != AV_NOPTS_VALUE && cur_pts != AV_NOPTS_VALUE) { - output_frame->pts = next_pts + cur_pts; - } else { - output_frame->pts = AV_NOPTS_VALUE; - } + if (ctx->prev_in_frame && ctx->prev_in_frame->pts != AV_NOPTS_VALUE + && input_frame->pts != AV_NOPTS_VALUE) { + first_pts = (ctx->prev_in_frame->pts + input_frame->pts) / 2; + av_log(priv, AV_LOG_DEBUG, "calculated first pts %"PRId64"\n", first_pts); } - av_log(priv, AV_LOG_DEBUG, "pts: %"PRId64" (field %d)\n", output_frame->pts, field); - return ff_filter_frame(outlink, output_frame); + output_frame_1->pts = first_pts; + + err = ff_filter_frame(outlink, output_frame_1); + if (err < 0) { + av_frame_free(&output_frame_2); + return err; + } + err = ff_filter_frame(outlink, output_frame_2); + + if (err < 0) + return err; + + av_log(priv, AV_LOG_DEBUG, "1st frame pts: %"PRId64" 2nd frame pts: %"PRId64" first pts: %"PRId64" (field %d)\n", + output_frame_1->pts, output_frame_2->pts, first_pts, ctx->field_order); + + return 0; -fail: - av_frame_free(&output_frame); +fail_out2: + av_frame_free(&output_frame_2); +fail_out1: + av_frame_free(&output_frame_1); return err; } @@ -749,20 +788,22 @@ static int deint_v4l2m2m_filter_frame(AVFilterLink *link, AVFrame *in) V4L2Queue *output = &ctx->output; int ret; - av_log(priv, AV_LOG_DEBUG, "input pts: %"PRId64"\n", in->pts); - if (!ctx->frame_count) { + av_log(priv, AV_LOG_DEBUG, "input pts: %"PRId64" field :%d interlaced: %d\n", + in->pts, in->top_field_first, in->interlaced_frame); + + ctx->cur_in_frame = in; + + if (ctx->field_order == V4L2_FIELD_ANY) { AVDRMFrameDescriptor *drm_desc = (AVDRMFrameDescriptor *)in->data[0]; - unsigned int field; - ctx->orig_width = drm_desc->layers[0].planes[0].pitch; ctx->orig_height = drm_desc->layers[0].planes[1].offset / ctx->orig_width; - if (in->top_field_first) - field = V4L2_FIELD_INTERLACED_TB; + if (in->top_field_first) + ctx->field_order = V4L2_FIELD_INTERLACED_TB; else - field = V4L2_FIELD_INTERLACED_BT; + ctx->field_order = V4L2_FIELD_INTERLACED_BT; - ret = deint_v4l2m2m_set_format(output, field, ctx->orig_width, ctx->orig_height); + ret = deint_v4l2m2m_set_format(output, ctx->field_order, ctx->orig_width, ctx->orig_height); if (ret) return ret; @@ -787,27 +828,19 @@ static int deint_v4l2m2m_filter_frame(AVFilterLink *link, AVFrame *in) return ret; } - if (ctx->frame_count < 2) { - ctx->frames[ctx->frame_count++] = in; - } else { - av_frame_free(&ctx->frames[0]); - ctx->frames[0] = ctx->frames[1]; - ctx->frames[1] = in; - } - ret = deint_v4l2m2m_enqueue(output, in); if (ret) return ret; - if (ctx->frame_count == 2) { - ret = deint_v4l2m2m_dequeue(avctx, ctx->frames[0], 0); - if (ret) - return ret; + ret = deint_v4l2m2m_dequeue(avctx, in); + if (ret) + return ret; - ret = deint_v4l2m2m_dequeue(avctx, ctx->frames[0], 1); - if (ret) - return ret; - } + if (ctx->prev_in_frame) + av_frame_free(&ctx->prev_in_frame); + + ctx->prev_in_frame = in; + ctx->cur_in_frame = NULL; return 0; } @@ -828,6 +861,9 @@ static av_cold int deint_v4l2m2m_init(AVFilterContext *avctx) ctx->capture.ctx = ctx; ctx->capture.num_buffers = 6; ctx->done = 0; + ctx->field_order = V4L2_FIELD_ANY; + ctx->cur_in_frame = NULL; + ctx->prev_in_frame = NULL; atomic_init(&ctx->refcount, 1); return 0; -- 2.29.2 ================================================ FILE: projects/Allwinner/patches/ffmpeg/0003-v4l2_request-revert-changes.patch ================================================ From 0770ca82391fb60084080b2fd235cc039a3b8314 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Sun, 25 Apr 2021 10:40:56 +0000 Subject: [PATCH] v4l2_request: revert changes --- libavcodec/v4l2_request.c | 10 +++------- libavcodec/v4l2_request_h264.c | 8 ++++---- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/libavcodec/v4l2_request.c b/libavcodec/v4l2_request.c index 5234b5049b0d..1e513ee5df8d 100644 --- a/libavcodec/v4l2_request.c +++ b/libavcodec/v4l2_request.c @@ -142,14 +142,12 @@ static int v4l2_request_queue_buffer(V4L2RequestContext *ctx, int request_fd, V4 .type = buf->buffer.type, .memory = buf->buffer.memory, .index = buf->index, - .timestamp.tv_usec = ctx->timestamp, + .timestamp.tv_usec = buf->index + 1, .bytesused = buf->used, .request_fd = request_fd, .flags = ((request_fd >= 0) ? V4L2_BUF_FLAG_REQUEST_FD : 0) | flags, }; - buf->buffer.timestamp = buffer.timestamp; - if (V4L2_TYPE_IS_MULTIPLANAR(buf->buffer.type)) { planes[0].bytesused = buf->used; buffer.bytesused = 0; @@ -239,9 +237,6 @@ static int v4l2_request_queue_decode(AVCodecContext *avctx, AVFrame *frame, stru av_log(avctx, AV_LOG_DEBUG, "%s: avctx=%p used=%u controls=%d index=%d fd=%d request_fd=%d first_slice=%d last_slice=%d\n", __func__, avctx, req->output.used, count, req->capture.index, req->capture.fd, req->request_fd, first_slice, last_slice); - if (first_slice) - ctx->timestamp++; - ret = v4l2_request_set_controls(ctx, req->request_fd, control, count); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "%s: set controls failed for request %d, %s (%d)\n", __func__, req->request_fd, strerror(errno), errno); @@ -693,7 +688,6 @@ int ff_v4l2_request_init(AVCodecContext *avctx, uint32_t pixelformat, uint32_t b ctx->media_fd = -1; ctx->video_fd = -1; - ctx->timestamp = 0; udev = udev_new(); if (!udev) { @@ -827,6 +821,8 @@ static int v4l2_request_buffer_alloc(AVCodecContext *avctx, V4L2RequestBuffer *b 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/libavcodec/v4l2_request_h264.c b/libavcodec/v4l2_request_h264.c index 88da8f0a2db0..a14028336a39 100644 --- a/libavcodec/v4l2_request_h264.c +++ b/libavcodec/v4l2_request_h264.c @@ -252,7 +252,7 @@ static int v4l2_request_h264_start_frame(AVCodecContext *avctx, fill_dpb(&controls->decode_params, h); - controls->first_slice = !FIELD_PICTURE(h) || h->first_field; + controls->first_slice = 1; controls->num_slices = 0; return ff_v4l2_request_reset_frame(avctx, h->cur_pic_ptr->f); @@ -383,8 +383,7 @@ static int v4l2_request_h264_decode_slice(AVCodecContext *avctx, const uint8_t * static int v4l2_request_h264_end_frame(AVCodecContext *avctx) { - const H264Context *h = avctx->priv_data; - return v4l2_request_h264_queue_decode(avctx, !FIELD_PICTURE(h) || !h->first_field); + return v4l2_request_h264_queue_decode(avctx, 1); } static int v4l2_request_h264_set_controls(AVCodecContext *avctx) ================================================ FILE: projects/Allwinner/patches/linux/0001-Input-axp20x-pek-allow-wakeup-after-shutdown.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 2 Jan 2021 15:52:27 -0600 Subject: [PATCH] Input: axp20x-pek - allow wakeup after shutdown While the AXP20x PMIC handles the power button itself after shutting down, it is not always possible to use the PMIC's built-in shutdown feature, such as when other wakeup sources are needed (for example, an IR remote or wake-on-LAN) that require firmware support. In that case, the PMIC remains on, but suspended, until the board is powered back on. During this "fake" off state, IRQ configuration is similar to system sleep, where enable_irq_wake() must be call on an IRQ for it to be wakeup capable. Run the suspend callback to arm the power button IRQs during the shutdown process, so the power button works in this state. Signed-off-by: Samuel Holland <samuel@sholland.org> --- drivers/input/misc/axp20x-pek.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) --- a/drivers/input/misc/axp20x-pek.c +++ b/drivers/input/misc/axp20x-pek.c @@ -354,7 +354,7 @@ static int axp20x_pek_probe(struct platf return 0; } -static int __maybe_unused axp20x_pek_suspend(struct device *dev) +static int axp20x_pek_suspend(struct device *dev) { struct axp20x_pek *axp20x_pek = dev_get_drvdata(dev); @@ -413,6 +413,11 @@ static const struct dev_pm_ops axp20x_pe #endif }; +static void axp20x_pek_shutdown(struct platform_device *pdev) +{ + axp20x_pek_suspend(&pdev->dev); +} + static const struct platform_device_id axp_pek_id_match[] = { { .name = "axp20x-pek", @@ -428,6 +433,7 @@ MODULE_DEVICE_TABLE(platform, axp_pek_id static struct platform_driver axp20x_pek_driver = { .probe = axp20x_pek_probe, + .shutdown = axp20x_pek_shutdown, .id_table = axp_pek_id_match, .driver = { .name = "axp20x-pek", ================================================ FILE: projects/Allwinner/patches/linux/0002-clk-Implement-protected-clocks-for-all-OF-clock-prov.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sun, 29 Dec 2019 20:23:28 -0600 Subject: [PATCH] clk: Implement protected-clocks for all OF clock providers This is a generic implementation of the "protected-clocks" property from the common clock binding. It allows firmware to inform the OS about clocks that must not be disabled while the OS is running. This implementation comes with some caveats: 1) Clocks that have CLK_IS_CRITICAL in their init data are prepared/ enabled before they are attached to the clock tree. protected-clocks are only protected once the clock provider is added, which is generally after all of the clocks it provides have been registered. This leaves a window of opportunity where something could disable or modify the clock, such as a driver running on another CPU, or the clock core itself. There is a comment to this effect in __clk_core_init(): /* * Enable CLK_IS_CRITICAL clocks so newly added critical clocks * don't get accidentally disabled when walking the orphan tree and * reparenting clocks */ Similarly, these clocks will be enabled after they are first reparented, unlike other CLK_IS_CRITICAL clocks. See the comment in clk_core_reparent_orphans_nolock(): /* * We need to use __clk_set_parent_before() and _after() to * to properly migrate any prepare/enable count of the orphan * clock. This is important for CLK_IS_CRITICAL clocks, which * are enabled during init but might not have a parent yet. */ Ideally we could detect protected clocks before they are reparented, but there are two problems with that: a) From the clock core's perspective, hw->init is const. b) The clock core doesn't see the device_node until __clk_register is called on the first clock. So the only "race-free" way to detect protected-clocks is to do it in the middle of __clk_register, between when core->flags is initialized and calling __clk_core_init(). That requires scanning the device tree again for each clock, which is part of why I didn't do it that way. 2) __clk_protect needs to be idempotent, for two reasons: a) Clocks with CLK_IS_CRITICAL in their init data are already prepared/enabled, and we don't want to prepare/enable them again. b) of_clk_set_defaults() is called twice for (at least some) clock controllers registered with CLK_OF_DECLARE. It is called first in of_clk_add_provider()/of_clk_add_hw_provider() inside clk_init_cb, and again afterward in of_clk_init(). The second call in of_clk_init() may be unnecessary, but verifying that would require auditing all users of CLK_OF_DECLARE to ensure they called one of the of_clk_add{,_hw}_provider functions. Signed-off-by: Samuel Holland <samuel@sholland.org> --- drivers/clk/clk-conf.c | 54 ++++++++++++++++++++++++++++++++++++++++++ drivers/clk/clk.c | 31 ++++++++++++++++++++++++ drivers/clk/clk.h | 2 ++ 3 files changed, 87 insertions(+) --- a/drivers/clk/clk-conf.c +++ b/drivers/clk/clk-conf.c @@ -11,6 +11,54 @@ #include <linux/of.h> #include <linux/printk.h> +#include "clk.h" + +static int __set_clk_flags(struct device_node *node) +{ + struct of_phandle_args clkspec; + struct property *prop; + int i, index = 0, rc; + const __be32 *cur; + struct clk *clk; + u32 nr_cells; + + rc = of_property_read_u32(node, "#clock-cells", &nr_cells); + if (rc < 0) { + pr_err("clk: missing #clock-cells property on %pOF\n", node); + return rc; + } + + clkspec.np = node; + clkspec.args_count = nr_cells; + + of_property_for_each_u32(node, "protected-clocks", prop, cur, clkspec.args[0]) { + /* read the remainder of the clock specifier */ + for (i = 1; i < nr_cells; ++i) { + cur = of_prop_next_u32(prop, cur, &clkspec.args[i]); + if (!cur) { + pr_err("clk: invalid value of protected-clocks" + " property at %pOF\n", node); + return -EINVAL; + } + } + clk = of_clk_get_from_provider(&clkspec); + if (IS_ERR(clk)) { + if (PTR_ERR(clk) != -EPROBE_DEFER) + pr_err("clk: couldn't get protected clock" + " %u for %pOF\n", index, node); + return PTR_ERR(clk); + } + + rc = __clk_protect(clk); + if (rc < 0) + pr_warn("clk: failed to protect %s: %d\n", + __clk_get_name(clk), rc); + clk_put(clk); + index++; + } + return 0; +} + static int __set_clk_parents(struct device_node *node, bool clk_supplier) { struct of_phandle_args clkspec; @@ -135,6 +183,12 @@ int of_clk_set_defaults(struct device_no if (!node) return 0; + if (clk_supplier) { + rc = __set_clk_flags(node); + if (rc < 0) + return rc; + } + rc = __set_clk_parents(node, clk_supplier); if (rc < 0) return rc; --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -4271,6 +4271,37 @@ struct clk *devm_clk_hw_get_clk(struct d EXPORT_SYMBOL_GPL(devm_clk_hw_get_clk); /* + * clk-conf helpers + */ + +int __clk_protect(struct clk *clk) +{ + struct clk_core *core = clk->core; + int ret = 0; + + clk_prepare_lock(); + + /* + * If CLK_IS_CRITICAL was set in the clock's init data, then + * the clock was already prepared/enabled when it was added. + */ + if (core->flags & CLK_IS_CRITICAL) + goto out; + + core->flags |= CLK_IS_CRITICAL; + ret = clk_core_prepare(core); + if (ret) + goto out; + + ret = clk_core_enable_lock(core); + +out: + clk_prepare_unlock(); + + return ret; +} + +/* * clkdev helpers */ --- a/drivers/clk/clk.h +++ b/drivers/clk/clk.h @@ -24,6 +24,7 @@ struct clk_hw *clk_find_hw(const char *d #ifdef CONFIG_COMMON_CLK struct clk *clk_hw_create_clk(struct device *dev, struct clk_hw *hw, const char *dev_id, const char *con_id); +int __clk_protect(struct clk *clk); void __clk_put(struct clk *clk); #else /* All these casts to avoid ifdefs in clkdev... */ @@ -33,6 +34,7 @@ clk_hw_create_clk(struct device *dev, st { return (struct clk *)hw; } +static inline int __clk_protect(struct clk *clk) { return 0; } static inline void __clk_put(struct clk *clk) { } #endif ================================================ FILE: projects/Allwinner/patches/linux/0003-Revert-clk-qcom-Support-protected-clocks-property.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Mon, 30 Dec 2019 12:39:31 -0600 Subject: [PATCH] Revert "clk: qcom: Support 'protected-clocks' property" Now that protected-clocks is handled in the clk core, this driver-specific implementation is redundant. This reverts commit b181b3b801da8893c8eb706e448dd5111b02de60. Signed-off-by: Samuel Holland <samuel@sholland.org> --- drivers/clk/qcom/common.c | 18 ------------------ 1 file changed, 18 deletions(-) --- a/drivers/clk/qcom/common.c +++ b/drivers/clk/qcom/common.c @@ -194,22 +194,6 @@ int qcom_cc_register_sleep_clk(struct de } EXPORT_SYMBOL_GPL(qcom_cc_register_sleep_clk); -/* Drop 'protected-clocks' from the list of clocks to register */ -static void qcom_cc_drop_protected(struct device *dev, struct qcom_cc *cc) -{ - struct device_node *np = dev->of_node; - struct property *prop; - const __be32 *p; - u32 i; - - of_property_for_each_u32(np, "protected-clocks", prop, p, i) { - if (i >= cc->num_rclks) - continue; - - cc->rclks[i] = NULL; - } -} - static struct clk_hw *qcom_cc_clk_hw_get(struct of_phandle_args *clkspec, void *data) { @@ -272,8 +256,6 @@ int qcom_cc_really_probe(struct platform cc->rclks = rclks; cc->num_rclks = num_clks; - qcom_cc_drop_protected(dev, cc); - for (i = 0; i < num_clk_hws; i++) { ret = devm_clk_hw_register(dev, clk_hws[i]); if (ret) ================================================ FILE: projects/Allwinner/patches/linux/0004-DO-NOT-MERGE-ARM-dts-sunxi-h3-h5-Protect-SCP-clocks.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Wed, 1 Jan 2020 16:03:46 -0600 Subject: [PATCH] [DO NOT MERGE] ARM: dts: sunxi: h3/h5: Protect SCP clocks Signed-off-by: Samuel Holland <samuel@sholland.org> --- arch/arm/boot/dts/sunxi-h3-h5.dtsi | 2 ++ 1 file changed, 2 insertions(+) --- a/arch/arm/boot/dts/sunxi-h3-h5.dtsi +++ b/arch/arm/boot/dts/sunxi-h3-h5.dtsi @@ -388,6 +388,7 @@ reg = <0x01c20000 0x400>; clocks = <&osc24M>, <&rtc 0>; clock-names = "hosc", "losc"; + protected-clocks = <CLK_BUS_MSGBOX>; #clock-cells = <1>; #reset-cells = <1>; }; @@ -876,6 +877,7 @@ clocks = <&osc24M>, <&rtc 0>, <&rtc 2>, <&ccu CLK_PLL_PERIPH0>; clock-names = "hosc", "losc", "iosc", "pll-periph"; + protected-clocks = <CLK_APB0_TWD>; #clock-cells = <1>; #reset-cells = <1>; }; ================================================ FILE: projects/Allwinner/patches/linux/0005-DO-NOT-MERGE-arm64-dts-allwinner-a64-Protect-SCP-clo.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Mon, 30 Dec 2019 15:10:32 -0600 Subject: [PATCH] [DO NOT MERGE] arm64: dts: allwinner: a64: Protect SCP clocks Signed-off-by: Samuel Holland <samuel@sholland.org> --- arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 2 ++ 1 file changed, 2 insertions(+) --- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi @@ -646,6 +646,7 @@ reg = <0x01c20000 0x400>; clocks = <&osc24M>, <&rtc 0>; clock-names = "hosc", "losc"; + protected-clocks = <CLK_BUS_MSGBOX>; #clock-cells = <1>; #reset-cells = <1>; }; @@ -1267,6 +1268,7 @@ clocks = <&osc24M>, <&rtc 0>, <&rtc 2>, <&ccu CLK_PLL_PERIPH0>; clock-names = "hosc", "losc", "iosc", "pll-periph"; + protected-clocks = <CLK_APB0_TWD>; #clock-cells = <1>; #reset-cells = <1>; }; ================================================ FILE: projects/Allwinner/patches/linux/0006-DO-NOT-MERGE-arm64-dts-allwinner-h6-Protect-SCP-cloc.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Wed, 1 Jan 2020 16:04:01 -0600 Subject: [PATCH] [DO NOT MERGE] arm64: dts: allwinner: h6: Protect SCP clocks Signed-off-by: Samuel Holland <samuel@sholland.org> --- arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 2 ++ 1 file changed, 2 insertions(+) --- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi @@ -230,6 +230,7 @@ reg = <0x03001000 0x1000>; clocks = <&osc24M>, <&rtc 0>, <&rtc 2>; clock-names = "hosc", "losc", "iosc"; + protected-clocks = <CLK_BUS_MSGBOX>; #clock-cells = <1>; #reset-cells = <1>; }; @@ -925,6 +926,7 @@ clocks = <&osc24M>, <&rtc 0>, <&rtc 2>, <&ccu CLK_PLL_PERIPH0>; clock-names = "hosc", "losc", "iosc", "pll-periph"; + protected-clocks = <CLK_R_APB1_TWD>; #clock-cells = <1>; #reset-cells = <1>; }; ================================================ FILE: projects/Allwinner/patches/linux/0007-rtc-sun6i-Allow-RTC-wakeup-after-shutdown.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 2 Jan 2021 15:52:27 -0600 Subject: [PATCH] rtc: sun6i: Allow RTC wakeup after shutdown Only IRQs that have enable_irq_wake() called on them can wake the system from sleep or after it has been shut down. Currently, the RTC alarm can only wake the system from sleep. Run the suspend callback to arm the IRQ during the shutdown process, so the RTC alarm also works after shutdown. Signed-off-by: Samuel Holland <samuel@sholland.org> --- drivers/rtc/rtc-sun6i.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) --- a/drivers/rtc/rtc-sun6i.c +++ b/drivers/rtc/rtc-sun6i.c @@ -641,7 +641,6 @@ static const struct rtc_class_ops sun6i_ .alarm_irq_enable = sun6i_rtc_alarm_irq_enable }; -#ifdef CONFIG_PM_SLEEP /* Enable IRQ wake on suspend, to wake up from RTC. */ static int sun6i_rtc_suspend(struct device *dev) { @@ -654,7 +653,7 @@ static int sun6i_rtc_suspend(struct devi } /* Disable IRQ wake on resume. */ -static int sun6i_rtc_resume(struct device *dev) +static int __maybe_unused sun6i_rtc_resume(struct device *dev) { struct sun6i_rtc_dev *chip = dev_get_drvdata(dev); @@ -663,7 +662,6 @@ static int sun6i_rtc_resume(struct devic return 0; } -#endif static SIMPLE_DEV_PM_OPS(sun6i_rtc_pm_ops, sun6i_rtc_suspend, sun6i_rtc_resume); @@ -735,6 +733,11 @@ static int sun6i_rtc_probe(struct platfo return 0; } +static void sun6i_rtc_shutdown(struct platform_device *pdev) +{ + sun6i_rtc_suspend(&pdev->dev); +} + /* * As far as RTC functionality goes, all models are the same. The * datasheets claim that different models have different number of @@ -755,6 +758,7 @@ MODULE_DEVICE_TABLE(of, sun6i_rtc_dt_ids static struct platform_driver sun6i_rtc_driver = { .probe = sun6i_rtc_probe, + .shutdown = sun6i_rtc_shutdown, .driver = { .name = "sun6i-rtc", .of_match_table = sun6i_rtc_dt_ids, ================================================ FILE: projects/Allwinner/patches/linux/0009-firmware-arm_scpi-Support-unidirectional-mailbox-cha.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Tue, 5 Mar 2019 22:02:41 -0600 Subject: [PATCH] firmware: arm_scpi: Support unidirectional mailbox channels Some mailbox controllers have only unidirectional channels, so we need a pair of them for each SCPI channel. If a mbox-names property is present, look for "rx" and "tx" mbox channels; otherwise, the existing behavior is preserved, and a single mbox channel is used for each SCPI channel. Note that since the mailbox framework only supports a single phandle with each name (mbox_request_channel_byname always returns the first one), this new mode only supports a single SCPI channel. Signed-off-by: Samuel Holland <samuel@sholland.org> --- drivers/firmware/arm_scpi.c | 58 +++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 12 deletions(-) --- a/drivers/firmware/arm_scpi.c +++ b/drivers/firmware/arm_scpi.c @@ -231,7 +231,8 @@ struct scpi_xfer { struct scpi_chan { struct mbox_client cl; - struct mbox_chan *chan; + struct mbox_chan *rx_chan; + struct mbox_chan *tx_chan; void __iomem *tx_payload; void __iomem *rx_payload; struct list_head rx_pending; @@ -505,7 +506,7 @@ static int scpi_send_message(u8 idx, voi msg->rx_len = rx_len; reinit_completion(&msg->done); - ret = mbox_send_message(scpi_chan->chan, msg); + ret = mbox_send_message(scpi_chan->tx_chan, msg); if (ret < 0 || !rx_buf) goto out; @@ -856,8 +857,13 @@ static void scpi_free_channels(void *dat struct scpi_drvinfo *info = data; int i; - for (i = 0; i < info->num_chans; i++) - mbox_free_channel(info->channels[i].chan); + for (i = 0; i < info->num_chans; i++) { + struct scpi_chan *pchan = &info->channels[i]; + + if (pchan->tx_chan != pchan->rx_chan) + mbox_free_channel(pchan->tx_chan); + mbox_free_channel(pchan->rx_chan); + } } static int scpi_remove(struct platform_device *pdev) @@ -913,6 +919,7 @@ static int scpi_probe(struct platform_de struct device *dev = &pdev->dev; struct device_node *np = dev->of_node; struct scpi_drvinfo *scpi_drvinfo; + bool use_mbox_names = false; scpi_drvinfo = devm_kzalloc(dev, sizeof(*scpi_drvinfo), GFP_KERNEL); if (!scpi_drvinfo) @@ -926,6 +933,14 @@ static int scpi_probe(struct platform_de dev_err(dev, "no mboxes property in '%pOF'\n", np); return -ENODEV; } + if (of_get_property(dev->of_node, "mbox-names", NULL)) { + use_mbox_names = true; + if (count != 2) { + dev_err(dev, "need exactly 2 mboxes with mbox-names\n"); + return -ENODEV; + } + count /= 2; + } scpi_info->channels = devm_kcalloc(dev, count, sizeof(struct scpi_chan), GFP_KERNEL); @@ -974,15 +989,34 @@ static int scpi_probe(struct platform_de mutex_init(&pchan->xfers_lock); ret = scpi_alloc_xfer_list(dev, pchan); - if (!ret) { - pchan->chan = mbox_request_channel(cl, idx); - if (!IS_ERR(pchan->chan)) - continue; - ret = PTR_ERR(pchan->chan); - if (ret != -EPROBE_DEFER) - dev_err(dev, "failed to get channel%d err %d\n", - idx, ret); + if (ret) + return ret; + + if (use_mbox_names) { + pchan->rx_chan = mbox_request_channel_byname(cl, "rx"); + if (IS_ERR(pchan->rx_chan)) { + ret = PTR_ERR(pchan->rx_chan); + goto fail; + } + pchan->tx_chan = mbox_request_channel_byname(cl, "tx"); + if (IS_ERR(pchan->rx_chan)) { + ret = PTR_ERR(pchan->tx_chan); + goto fail; + } + } else { + pchan->rx_chan = mbox_request_channel(cl, idx); + if (IS_ERR(pchan->rx_chan)) { + ret = PTR_ERR(pchan->rx_chan); + goto fail; + } + pchan->tx_chan = pchan->rx_chan; } + continue; + +fail: + if (ret != -EPROBE_DEFER) + dev_err(dev, "failed to get channel%d err %d\n", + idx, ret); return ret; } ================================================ FILE: projects/Allwinner/patches/linux/0010-ARM-dts-sunxi-h3-h5-Add-SCPI-protocol.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Wed, 1 Jan 2020 16:12:36 -0600 Subject: [PATCH] ARM: dts: sunxi: h3/h5: Add SCPI protocol Signed-off-by: Samuel Holland <samuel@sholland.org> --- arch/arm/boot/dts/sun8i-h3.dtsi | 13 +++++++++++++ arch/arm/boot/dts/sunxi-h3-h5.dtsi | 7 +++++++ arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi | 13 +++++++++++++ 3 files changed, 33 insertions(+) --- a/arch/arm/boot/dts/sun8i-h3.dtsi +++ b/arch/arm/boot/dts/sun8i-h3.dtsi @@ -170,6 +170,19 @@ #size-cells = <1>; ranges; + sram_a2: sram@40000 { + compatible = "mmio-sram"; + reg = <0x00040000 0xc000>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x00040000 0xc000>; + + scpi_sram: scpi-sram@bc00 { + compatible = "arm,scp-shmem"; + reg = <0xbc00 0x200>; + }; + }; + sram_c: sram@1d00000 { compatible = "mmio-sram"; reg = <0x01d00000 0x80000>; --- a/arch/arm/boot/dts/sunxi-h3-h5.dtsi +++ b/arch/arm/boot/dts/sunxi-h3-h5.dtsi @@ -105,6 +105,13 @@ status = "disabled"; }; + scpi_protocol: scpi { + compatible = "arm,scpi"; + mboxes = <&msgbox 2>, <&msgbox 3>; + mbox-names = "tx", "rx"; + shmem = <&scpi_sram>; + }; + soc { compatible = "simple-bus"; #address-cells = <1>; --- a/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi +++ b/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi @@ -86,6 +86,19 @@ #size-cells = <1>; ranges; + sram_a2: sram@40000 { + compatible = "mmio-sram"; + reg = <0x00040000 0x14000>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x00040000 0x14000>; + + scpi_sram: scpi-sram@13c00 { + compatible = "arm,scp-shmem"; + reg = <0x13c00 0x200>; + }; + }; + sram_c1: sram@18000 { compatible = "mmio-sram"; reg = <0x00018000 0x1c000>; ================================================ FILE: projects/Allwinner/patches/linux/0011-arm64-dts-allwinner-a64-Add-SCPI-protocol.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 14 Dec 2019 20:52:53 -0600 Subject: [PATCH] arm64: dts: allwinner: a64: Add SCPI protocol Signed-off-by: Samuel Holland <samuel@sholland.org> --- arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) --- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi @@ -130,6 +130,13 @@ method = "smc"; }; + scpi_protocol: scpi { + compatible = "arm,scpi"; + mboxes = <&msgbox 2>, <&msgbox 3>; + mbox-names = "tx", "rx"; + shmem = <&scpi_sram>; + }; + sound: sound { #address-cells = <1>; #size-cells = <0>; @@ -344,6 +351,19 @@ #size-cells = <1>; ranges; + sram_a2: sram@40000 { + compatible = "mmio-sram"; + reg = <0x00040000 0x14000>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x00040000 0x14000>; + + scpi_sram: scpi-sram@13c00 { + compatible = "arm,scp-shmem"; + reg = <0x13c00 0x200>; + }; + }; + sram_c: sram@18000 { compatible = "mmio-sram"; reg = <0x00018000 0x28000>; ================================================ FILE: projects/Allwinner/patches/linux/0012-arm64-dts-allwinner-h6-Add-SCPI-protocol.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 14 Dec 2019 20:54:40 -0600 Subject: [PATCH] arm64: dts: allwinner: h6: Add SCPI protocol Signed-off-by: Samuel Holland <samuel@sholland.org> --- arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) --- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi @@ -88,6 +88,13 @@ method = "smc"; }; + scpi_protocol: scpi { + compatible = "arm,scpi"; + mboxes = <&msgbox 2>, <&msgbox 3>; + mbox-names = "tx", "rx"; + shmem = <&scpi_sram>; + }; + timer { compatible = "arm,armv8-timer"; arm,no-tick-in-suspend; @@ -196,6 +203,19 @@ #size-cells = <1>; ranges; + sram_a2: sram@100000 { + compatible = "mmio-sram"; + reg = <0x00100000 0x18000>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x00100000 0x18000>; + + scpi_sram: scpi-sram@17c00 { + compatible = "arm,scp-shmem"; + reg = <0x17c00 0x200>; + }; + }; + sram_c: sram@28000 { compatible = "mmio-sram"; reg = <0x00028000 0x1e000>; ================================================ FILE: projects/Allwinner/patches/linux/0013-ASoC-hdmi-codec-fix-channel-allocation.patch ================================================ From 91b69779e0875e58d8973b2938a1cc4b7a1c455b Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sun, 25 Mar 2018 22:17:06 +0200 Subject: [PATCH 22/44] ASoC: hdmi-codec: fix channel allocation --- sound/soc/codecs/hdmi-codec.c | 113 ++++++++++++++++------------------ 1 file changed, 52 insertions(+), 61 deletions(-) --- a/sound/soc/codecs/hdmi-codec.c +++ b/sound/soc/codecs/hdmi-codec.c @@ -194,78 +194,69 @@ static const struct snd_pcm_chmap_elem h */ static const struct hdmi_codec_cea_spk_alloc hdmi_codec_channel_alloc[] = { { .ca_id = 0x00, .n_ch = 2, - .mask = FL | FR}, - /* 2.1 */ - { .ca_id = 0x01, .n_ch = 4, - .mask = FL | FR | LFE}, - /* Dolby Surround */ + .mask = FL | FR }, + { .ca_id = 0x03, .n_ch = 4, + .mask = FL | FR | LFE | FC }, { .ca_id = 0x02, .n_ch = 4, .mask = FL | FR | FC }, - /* surround51 */ + { .ca_id = 0x01, .n_ch = 4, + .mask = FL | FR | LFE }, { .ca_id = 0x0b, .n_ch = 6, - .mask = FL | FR | LFE | FC | RL | RR}, - /* surround40 */ - { .ca_id = 0x08, .n_ch = 6, - .mask = FL | FR | RL | RR }, - /* surround41 */ - { .ca_id = 0x09, .n_ch = 6, - .mask = FL | FR | LFE | RL | RR }, - /* surround50 */ + .mask = FL | FR | LFE | FC | RL | RR }, { .ca_id = 0x0a, .n_ch = 6, .mask = FL | FR | FC | RL | RR }, - /* 6.1 */ - { .ca_id = 0x0f, .n_ch = 8, - .mask = FL | FR | LFE | FC | RL | RR | RC }, - /* surround71 */ + { .ca_id = 0x09, .n_ch = 6, + .mask = FL | FR | LFE | RL | RR }, + { .ca_id = 0x08, .n_ch = 6, + .mask = FL | FR | RL | RR }, + { .ca_id = 0x07, .n_ch = 6, + .mask = FL | FR | LFE | FC | RC }, + { .ca_id = 0x06, .n_ch = 6, + .mask = FL | FR | FC | RC }, + { .ca_id = 0x05, .n_ch = 6, + .mask = FL | FR | LFE | RC }, + { .ca_id = 0x04, .n_ch = 6, + .mask = FL | FR | RC }, { .ca_id = 0x13, .n_ch = 8, .mask = FL | FR | LFE | FC | RL | RR | RLC | RRC }, - /* others */ - { .ca_id = 0x03, .n_ch = 8, - .mask = FL | FR | LFE | FC }, - { .ca_id = 0x04, .n_ch = 8, - .mask = FL | FR | RC}, - { .ca_id = 0x05, .n_ch = 8, - .mask = FL | FR | LFE | RC }, - { .ca_id = 0x06, .n_ch = 8, - .mask = FL | FR | FC | RC }, - { .ca_id = 0x07, .n_ch = 8, - .mask = FL | FR | LFE | FC | RC }, - { .ca_id = 0x0c, .n_ch = 8, - .mask = FL | FR | RC | RL | RR }, - { .ca_id = 0x0d, .n_ch = 8, - .mask = FL | FR | LFE | RL | RR | RC }, - { .ca_id = 0x0e, .n_ch = 8, - .mask = FL | FR | FC | RL | RR | RC }, - { .ca_id = 0x10, .n_ch = 8, - .mask = FL | FR | RL | RR | RLC | RRC }, - { .ca_id = 0x11, .n_ch = 8, - .mask = FL | FR | LFE | RL | RR | RLC | RRC }, + { .ca_id = 0x1f, .n_ch = 8, + .mask = FL | FR | LFE | FC | RL | RR | FLC | FRC }, { .ca_id = 0x12, .n_ch = 8, .mask = FL | FR | FC | RL | RR | RLC | RRC }, - { .ca_id = 0x14, .n_ch = 8, - .mask = FL | FR | FLC | FRC }, - { .ca_id = 0x15, .n_ch = 8, - .mask = FL | FR | LFE | FLC | FRC }, - { .ca_id = 0x16, .n_ch = 8, - .mask = FL | FR | FC | FLC | FRC }, - { .ca_id = 0x17, .n_ch = 8, - .mask = FL | FR | LFE | FC | FLC | FRC }, - { .ca_id = 0x18, .n_ch = 8, - .mask = FL | FR | RC | FLC | FRC }, - { .ca_id = 0x19, .n_ch = 8, - .mask = FL | FR | LFE | RC | FLC | FRC }, - { .ca_id = 0x1a, .n_ch = 8, - .mask = FL | FR | RC | FC | FLC | FRC }, - { .ca_id = 0x1b, .n_ch = 8, - .mask = FL | FR | LFE | RC | FC | FLC | FRC }, - { .ca_id = 0x1c, .n_ch = 8, - .mask = FL | FR | RL | RR | FLC | FRC }, - { .ca_id = 0x1d, .n_ch = 8, - .mask = FL | FR | LFE | RL | RR | FLC | FRC }, { .ca_id = 0x1e, .n_ch = 8, .mask = FL | FR | FC | RL | RR | FLC | FRC }, - { .ca_id = 0x1f, .n_ch = 8, - .mask = FL | FR | LFE | FC | RL | RR | FLC | FRC }, + { .ca_id = 0x11, .n_ch = 8, + .mask = FL | FR | LFE | RL | RR | RLC | RRC }, + { .ca_id = 0x1d, .n_ch = 8, + .mask = FL | FR | LFE | RL | RR | FLC | FRC }, + { .ca_id = 0x10, .n_ch = 8, + .mask = FL | FR | RL | RR | RLC | RRC }, + { .ca_id = 0x1c, .n_ch = 8, + .mask = FL | FR | RL | RR | FLC | FRC }, + { .ca_id = 0x0f, .n_ch = 8, + .mask = FL | FR | LFE | FC | RL | RR | RC }, + { .ca_id = 0x1b, .n_ch = 8, + .mask = FL | FR | LFE | RC | FC | FLC | FRC }, + { .ca_id = 0x0e, .n_ch = 8, + .mask = FL | FR | FC | RL | RR | RC }, + { .ca_id = 0x1a, .n_ch = 8, + .mask = FL | FR | RC | FC | FLC | FRC }, + { .ca_id = 0x0d, .n_ch = 8, + .mask = FL | FR | LFE | RL | RR | RC }, + { .ca_id = 0x19, .n_ch = 8, + .mask = FL | FR | LFE | RC | FLC | FRC }, + { .ca_id = 0x0c, .n_ch = 8, + .mask = FL | FR | RC | RL | RR }, + { .ca_id = 0x18, .n_ch = 8, + .mask = FL | FR | RC | FLC | FRC }, + { .ca_id = 0x17, .n_ch = 8, + .mask = FL | FR | LFE | FC | FLC | FRC }, + { .ca_id = 0x16, .n_ch = 8, + .mask = FL | FR | FC | FLC | FRC }, + { .ca_id = 0x15, .n_ch = 8, + .mask = FL | FR | LFE | FLC | FRC }, + { .ca_id = 0x14, .n_ch = 8, + .mask = FL | FR | FLC | FRC }, }; struct hdmi_codec_priv { ================================================ FILE: projects/Allwinner/patches/linux/0014-drm_call_drm_atomic_helper_shutdown_at_shutdown.patch ================================================ Subject: [PATCH] drm: Call drm_atomic_helper_shutdown() at shutdown time for misc drivers From: Douglas Anderson <dianders@chromium.org> Date: Fri, 01 Sep 2023 16:39:53 -0700 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Based on grepping through the source code these drivers appear to be missing a call to drm_atomic_helper_shutdown() at system shutdown time. Among other things, this means that if a panel is in use that it won't be cleanly powered off at system shutdown time. The fact that we should call drm_atomic_helper_shutdown() in the case of OS shutdown/restart comes straight out of the kernel doc "driver instance overview" in drm_drv.c. All of the drivers in this patch were fairly straightforward to fix since they already had a call to drm_atomic_helper_shutdown() at remove/unbind time but were just lacking one at system shutdown. The only hitch is that some of these drivers use the component model to register/unregister their DRM devices. The shutdown callback is part of the original device. The typical solution here, based on how other DRM drivers do this, is to keep track of whether the device is bound based on drvdata. In most cases the drvdata is the drm_device, so we can just make sure it is NULL when the device is not bound. In some drivers, this required minor code changes. To make things simpler, drm_atomic_helper_shutdown() has been modified to consider a NULL drm_device as a noop in the patch ("drm/atomic-helper: drm_atomic_helper_shutdown(NULL) should be a noop"). Suggested-by: Maxime Ripard <mripard@kernel.org> Signed-off-by: Douglas Anderson <dianders@chromium.org> Acked-by: Maxime Ripard <mripard@kernel.org> Link: https://lore.kernel.org/r/20230901163944.RFT.2.I9115e5d094a43e687978b0699cc1fe9f2a3452ea@changeid --- <snip> diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.c b/drivers/gpu/drm/sun4i/sun4i_drv.c index 6a8dfc022d3c..35d7a7ffd208 100644 --- a/drivers/gpu/drm/sun4i/sun4i_drv.c +++ b/drivers/gpu/drm/sun4i/sun4i_drv.c @@ -413,6 +413,11 @@ static void sun4i_drv_remove(struct platform_device *pdev) component_master_del(&pdev->dev, &sun4i_drv_master_ops); } +static void sun4i_drv_shutdown(struct platform_device *pdev) +{ + drm_atomic_helper_shutdown(platform_get_drvdata(pdev)); +} + static const struct of_device_id sun4i_drv_of_table[] = { { .compatible = "allwinner,sun4i-a10-display-engine" }, { .compatible = "allwinner,sun5i-a10s-display-engine" }, @@ -437,6 +442,7 @@ MODULE_DEVICE_TABLE(of, sun4i_drv_of_table); static struct platform_driver sun4i_drv_platform_driver = { .probe = sun4i_drv_probe, .remove = sun4i_drv_remove, + .shutdown = sun4i_drv_shutdown, .driver = { .name = "sun4i-drm", .of_match_table = sun4i_drv_of_table, <snip> ================================================ FILE: projects/Allwinner/patches/linux/0020-media-cedrus-Add-callback-for-buffer-cleanup.patch ================================================ From b6d288bb8823e11114297d1e406ccd977106aaf9 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Sat, 9 Nov 2019 13:06:15 +0100 Subject: [PATCH 28/44] media: cedrus: Add callback for buffer cleanup Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- drivers/staging/media/sunxi/cedrus/cedrus.h | 1 + drivers/staging/media/sunxi/cedrus/cedrus_video.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) --- a/drivers/staging/media/sunxi/cedrus/cedrus.h +++ b/drivers/staging/media/sunxi/cedrus/cedrus.h @@ -166,6 +166,7 @@ struct cedrus_dec_ops { int (*start)(struct cedrus_ctx *ctx); void (*stop)(struct cedrus_ctx *ctx); void (*trigger)(struct cedrus_ctx *ctx); + void (*buf_cleanup)(struct cedrus_ctx *ctx, struct cedrus_buffer *buf); }; struct cedrus_variant { --- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c @@ -469,6 +469,18 @@ static int cedrus_buf_prepare(struct vb2 return 0; } +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); + struct cedrus_dev *dev = ctx->dev; + struct cedrus_dec_ops *ops = dev->dec_ops[ctx->current_codec]; + + if (!V4L2_TYPE_IS_OUTPUT(vq->type) && ops->buf_cleanup) + ops->buf_cleanup(ctx, + vb2_to_cedrus_buffer(vq->bufs[vb->index])); +} + static int cedrus_start_streaming(struct vb2_queue *vq, unsigned int count) { struct cedrus_ctx *ctx = vb2_get_drv_priv(vq); @@ -551,6 +563,7 @@ static void cedrus_buf_request_complete( static struct vb2_ops cedrus_qops = { .queue_setup = cedrus_queue_setup, .buf_prepare = cedrus_buf_prepare, + .buf_cleanup = cedrus_buf_cleanup, .buf_queue = cedrus_buf_queue, .buf_out_validate = cedrus_buf_out_validate, .buf_request_complete = cedrus_buf_request_complete, ================================================ FILE: projects/Allwinner/patches/linux/0021-media-cedrus-hevc-Improve-buffer-management.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Sat, 9 Nov 2019 13:22:05 +0100 Subject: [PATCH] media: cedrus: hevc: Improve buffer management Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- drivers/staging/media/sunxi/cedrus/cedrus.h | 9 +- .../staging/media/sunxi/cedrus/cedrus_h265.c | 119 ++++++++++-------- 2 files changed, 69 insertions(+), 59 deletions(-) diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h index ab7653c8915e..54a860ec738d 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus.h +++ b/drivers/staging/media/sunxi/cedrus/cedrus.h @@ -106,6 +106,11 @@ struct cedrus_buffer { unsigned int position; enum cedrus_h264_pic_type pic_type; } h264; + struct { + void *mv_col_buf; + dma_addr_t mv_col_buf_dma; + ssize_t mv_col_buf_size; + } h265; } codec; }; @@ -139,10 +144,6 @@ struct cedrus_ctx { ssize_t intra_pred_buf_size; } h264; struct { - void *mv_col_buf; - dma_addr_t mv_col_buf_addr; - ssize_t mv_col_buf_size; - ssize_t mv_col_buf_unit_size; void *neighbor_info_buf; dma_addr_t neighbor_info_buf_addr; void *entry_points_buf; diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c index 4b01d3881214..4d425196d415 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c @@ -91,26 +91,65 @@ static void cedrus_h265_sram_write_data(struct cedrus_dev *dev, void *data, static inline dma_addr_t cedrus_h265_frame_info_mv_col_buf_addr(struct cedrus_ctx *ctx, - unsigned int index, unsigned int field) + unsigned int index, + const struct v4l2_ctrl_hevc_sps *sps) { - return ctx->codec.h265.mv_col_buf_addr + index * - ctx->codec.h265.mv_col_buf_unit_size + - field * ctx->codec.h265.mv_col_buf_unit_size / 2; + struct cedrus_buffer *cedrus_buf = NULL; + struct vb2_buffer *buf = NULL; + struct vb2_queue *vq; + + vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE); + if (vq) + buf = vb2_get_buffer(vq, index); + + if (buf) + cedrus_buf = vb2_to_cedrus_buffer(buf); + + if (!cedrus_buf) + return 0; + + if (!cedrus_buf->codec.h265.mv_col_buf_size) { + unsigned int log2_max_luma_coding_block_size; + unsigned int ctb_size_luma; + + log2_max_luma_coding_block_size = + sps->log2_min_luma_coding_block_size_minus3 + 3 + + sps->log2_diff_max_min_luma_coding_block_size; + ctb_size_luma = 1 << log2_max_luma_coding_block_size; + + cedrus_buf->codec.h265.mv_col_buf_size = + DIV_ROUND_UP(sps->pic_width_in_luma_samples, ctb_size_luma) * + DIV_ROUND_UP(sps->pic_height_in_luma_samples, ctb_size_luma) * + CEDRUS_H265_MV_COL_BUF_UNIT_CTB_SIZE + SZ_1K; + + cedrus_buf->codec.h265.mv_col_buf = + dma_alloc_attrs(ctx->dev->dev, + cedrus_buf->codec.h265.mv_col_buf_size, + &cedrus_buf->codec.h265.mv_col_buf_dma, + GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING); + + if (!cedrus_buf->codec.h265.mv_col_buf) { + cedrus_buf->codec.h265.mv_col_buf_size = 0; + cedrus_buf->codec.h265.mv_col_buf_dma = 0; + } + } + + return cedrus_buf->codec.h265.mv_col_buf_dma; } static void cedrus_h265_frame_info_write_single(struct cedrus_ctx *ctx, unsigned int index, bool field_pic, u32 pic_order_cnt[], - struct vb2_buffer *buf) + struct vb2_buffer *buf, + const struct v4l2_ctrl_hevc_sps *sps) { struct cedrus_dev *dev = ctx->dev; dma_addr_t dst_luma_addr = cedrus_dst_buf_addr(ctx, buf, 0); dma_addr_t dst_chroma_addr = cedrus_dst_buf_addr(ctx, buf, 1); dma_addr_t mv_col_buf_addr[2] = { - cedrus_h265_frame_info_mv_col_buf_addr(ctx, buf->index, 0), - cedrus_h265_frame_info_mv_col_buf_addr(ctx, buf->index, - field_pic ? 1 : 0) + cedrus_h265_frame_info_mv_col_buf_addr(ctx, buf->index, sps), + cedrus_h265_frame_info_mv_col_buf_addr(ctx, buf->index, sps) }; u32 offset = VE_DEC_H265_SRAM_OFFSET_FRAME_INFO + VE_DEC_H265_SRAM_OFFSET_FRAME_INFO_UNIT * index; @@ -134,7 +173,8 @@ static void cedrus_h265_frame_info_write_single(struct cedrus_ctx *ctx, static void cedrus_h265_frame_info_write_dpb(struct cedrus_ctx *ctx, const struct v4l2_hevc_dpb_entry *dpb, - u8 num_active_dpb_entries) + u8 num_active_dpb_entries, + const struct v4l2_ctrl_hevc_sps *sps) { struct vb2_queue *vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE); @@ -149,7 +189,7 @@ static void cedrus_h265_frame_info_write_dpb(struct cedrus_ctx *ctx, cedrus_h265_frame_info_write_single(ctx, i, dpb[i].field_pic, pic_order_cnt, - buf); + buf, sps); } } @@ -388,36 +428,6 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, width_in_ctb_luma = DIV_ROUND_UP(sps->pic_width_in_luma_samples, ctb_size_luma); - /* MV column buffer size and allocation. */ - if (!ctx->codec.h265.mv_col_buf_size) { - unsigned int num_buffers = - run->dst->vb2_buf.vb2_queue->num_buffers; - - /* - * Each CTB requires a MV col buffer with a specific unit size. - * Since the address is given with missing lsb bits, 1 KiB is - * added to each buffer to ensure proper alignment. - */ - ctx->codec.h265.mv_col_buf_unit_size = - DIV_ROUND_UP(ctx->src_fmt.width, ctb_size_luma) * - DIV_ROUND_UP(ctx->src_fmt.height, ctb_size_luma) * - CEDRUS_H265_MV_COL_BUF_UNIT_CTB_SIZE + SZ_1K; - - ctx->codec.h265.mv_col_buf_size = num_buffers * - ctx->codec.h265.mv_col_buf_unit_size; - - /* Buffer is never accessed by CPU, so we can skip kernel mapping. */ - ctx->codec.h265.mv_col_buf = - dma_alloc_attrs(dev->dev, - ctx->codec.h265.mv_col_buf_size, - &ctx->codec.h265.mv_col_buf_addr, - GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING); - if (!ctx->codec.h265.mv_col_buf) { - ctx->codec.h265.mv_col_buf_size = 0; - return -ENOMEM; - } - } - /* Activate H265 engine. */ cedrus_engine_enable(ctx, CEDRUS_CODEC_H265); @@ -672,7 +681,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, /* Write decoded picture buffer in pic list. */ cedrus_h265_frame_info_write_dpb(ctx, decode_params->dpb, - decode_params->num_active_dpb_entries); + decode_params->num_active_dpb_entries, sps); /* Output frame. */ @@ -683,7 +692,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, cedrus_h265_frame_info_write_single(ctx, output_pic_list_index, slice_params->pic_struct != 0, pic_order_cnt, - &run->dst->vb2_buf); + &run->dst->vb2_buf, sps); cedrus_write(dev, VE_DEC_H265_OUTPUT_FRAME_IDX, output_pic_list_index); @@ -732,9 +741,6 @@ static int cedrus_h265_start(struct cedrus_ctx *ctx) { struct cedrus_dev *dev = ctx->dev; - /* The buffer size is calculated at setup time. */ - ctx->codec.h265.mv_col_buf_size = 0; - /* Buffer is never accessed by CPU, so we can skip kernel mapping. */ ctx->codec.h265.neighbor_info_buf = dma_alloc_attrs(dev->dev, CEDRUS_H265_NEIGHBOR_INFO_BUF_SIZE, @@ -761,15 +767,6 @@ static void cedrus_h265_stop(struct cedrus_ctx *ctx) { struct cedrus_dev *dev = ctx->dev; - if (ctx->codec.h265.mv_col_buf_size > 0) { - dma_free_attrs(dev->dev, ctx->codec.h265.mv_col_buf_size, - ctx->codec.h265.mv_col_buf, - ctx->codec.h265.mv_col_buf_addr, - DMA_ATTR_NO_KERNEL_MAPPING); - - ctx->codec.h265.mv_col_buf_size = 0; - } - dma_free_attrs(dev->dev, CEDRUS_H265_NEIGHBOR_INFO_BUF_SIZE, ctx->codec.h265.neighbor_info_buf, ctx->codec.h265.neighbor_info_buf_addr, @@ -786,6 +783,17 @@ static void cedrus_h265_trigger(struct cedrus_ctx *ctx) cedrus_write(dev, VE_DEC_H265_TRIGGER, VE_DEC_H265_TRIGGER_DEC_SLICE); } +static void cedrus_h265_buf_cleanup(struct cedrus_ctx *ctx, + struct cedrus_buffer *buf) +{ + if (buf->codec.h265.mv_col_buf_size) + dma_free_attrs(ctx->dev->dev, + buf->codec.h265.mv_col_buf_size, + buf->codec.h265.mv_col_buf, + buf->codec.h265.mv_col_buf_dma, + DMA_ATTR_NO_KERNEL_MAPPING); +} + struct cedrus_dec_ops cedrus_dec_ops_h265 = { .irq_clear = cedrus_h265_irq_clear, .irq_disable = cedrus_h265_irq_disable, @@ -794,4 +802,5 @@ struct cedrus_dec_ops cedrus_dec_ops_h265 = { .start = cedrus_h265_start, .stop = cedrus_h265_stop, .trigger = cedrus_h265_trigger, + .buf_cleanup = cedrus_h265_buf_cleanup, }; ================================================ FILE: projects/Allwinner/patches/linux/0022-media-cedrus-h264-Improve-buffer-management.patch ================================================ From a881ce25cba8e45c6a86b5a680981c3b14b5b1e1 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Sat, 9 Nov 2019 14:12:42 +0100 Subject: [PATCH 30/44] media: cedrus: h264: Improve buffer management Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- drivers/staging/media/sunxi/cedrus/cedrus.h | 3 + .../staging/media/sunxi/cedrus/cedrus_h264.c | 93 ++++++++----------- 2 files changed, 44 insertions(+), 52 deletions(-) --- a/drivers/staging/media/sunxi/cedrus/cedrus.h +++ b/drivers/staging/media/sunxi/cedrus/cedrus.h @@ -104,6 +104,9 @@ struct cedrus_buffer { struct { unsigned int position; enum cedrus_h264_pic_type pic_type; + void *mv_col_buf; + dma_addr_t mv_col_buf_dma; + ssize_t mv_col_buf_size; } h264; struct { void *mv_col_buf; --- 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(struc } static dma_addr_t cedrus_h264_mv_col_buf_addr(struct cedrus_ctx *ctx, - unsigned int position, + struct cedrus_buffer *buf, unsigned int field) { - dma_addr_t addr = ctx->codec.h264.mv_col_buf_dma; + dma_addr_t addr = buf->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; + /* Adjust for the field */ + if (field) + addr += buf->codec.h264.mv_col_buf_size / 2; return addr; } @@ -76,7 +74,6 @@ static void cedrus_fill_ref_pic(struct c 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); @@ -85,9 +82,9 @@ static void cedrus_fill_ref_pic(struct c 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, @@ -146,6 +143,28 @@ static void cedrus_write_frame_list(stru output_buf = vb2_to_cedrus_buffer(&run->dst->vb2_buf); output_buf->codec.h264.position = position; + if (!output_buf->codec.h264.mv_col_buf_size) { + const struct v4l2_ctrl_h264_sps *sps = run->h264.sps; + unsigned int field_size; + + field_size = DIV_ROUND_UP(ctx->src_fmt.width, 16) * + DIV_ROUND_UP(ctx->src_fmt.height, 16) * 16; + if (!(sps->flags & V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE)) + field_size = field_size * 2; + if (!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY)) + field_size = field_size * 2; + + output_buf->codec.h264.mv_col_buf_size = field_size * 2; + output_buf->codec.h264.mv_col_buf = + dma_alloc_attrs(dev->dev, + output_buf->codec.h264.mv_col_buf_size, + &output_buf->codec.h264.mv_col_buf_dma, + GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING); + + if (!output_buf->codec.h264.mv_col_buf) + output_buf->codec.h264.mv_col_buf_size = 0; + } + if (decode->flags & V4L2_H264_DECODE_PARAM_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) @@ -516,8 +535,6 @@ static int cedrus_h264_start(struct cedr { struct cedrus_dev *dev = ctx->dev; unsigned int pic_info_size; - unsigned int field_size; - unsigned int mv_col_size; int ret; /* Formula for picture buffer size is taken from CedarX source. */ @@ -560,38 +577,6 @@ static int cedrus_h264_start(struct cedr 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_attrs(dev->dev, - ctx->codec.h264.mv_col_buf_size, - &ctx->codec.h264.mv_col_buf_dma, - GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING); - if (!ctx->codec.h264.mv_col_buf) { - ret = -ENOMEM; - goto err_neighbor_buf; - } - if (ctx->src_fmt.width > 2048) { /* * Formulas for deblock and intra prediction buffer sizes @@ -606,7 +592,7 @@ static int cedrus_h264_start(struct cedr GFP_KERNEL); if (!ctx->codec.h264.deblk_buf) { ret = -ENOMEM; - goto err_mv_col_buf; + goto err_neighbor_buf; } /* @@ -633,12 +619,6 @@ err_deblk_buf: ctx->codec.h264.deblk_buf, ctx->codec.h264.deblk_buf_dma); -err_mv_col_buf: - dma_free_attrs(dev->dev, ctx->codec.h264.mv_col_buf_size, - ctx->codec.h264.mv_col_buf, - ctx->codec.h264.mv_col_buf_dma, - DMA_ATTR_NO_KERNEL_MAPPING); - err_neighbor_buf: dma_free_attrs(dev->dev, CEDRUS_NEIGHBOR_INFO_BUF_SIZE, ctx->codec.h264.neighbor_info_buf, @@ -654,10 +635,6 @@ static void cedrus_h264_stop(struct cedr { struct cedrus_dev *dev = ctx->dev; - dma_free_attrs(dev->dev, ctx->codec.h264.mv_col_buf_size, - ctx->codec.h264.mv_col_buf, - ctx->codec.h264.mv_col_buf_dma, - DMA_ATTR_NO_KERNEL_MAPPING); dma_free_attrs(dev->dev, CEDRUS_NEIGHBOR_INFO_BUF_SIZE, ctx->codec.h264.neighbor_info_buf, ctx->codec.h264.neighbor_info_buf_dma, @@ -681,6 +659,17 @@ static void cedrus_h264_trigger(struct c VE_H264_TRIGGER_TYPE_AVC_SLICE_DECODE); } +static void cedrus_h264_buf_cleanup(struct cedrus_ctx *ctx, + struct cedrus_buffer *buf) +{ + if (buf->codec.h264.mv_col_buf_size) + dma_free_attrs(ctx->dev->dev, + buf->codec.h264.mv_col_buf_size, + buf->codec.h264.mv_col_buf, + buf->codec.h264.mv_col_buf_dma, + DMA_ATTR_NO_KERNEL_MAPPING); +} + struct cedrus_dec_ops cedrus_dec_ops_h264 = { .irq_clear = cedrus_h264_irq_clear, .irq_disable = cedrus_h264_irq_disable, @@ -689,4 +677,5 @@ struct cedrus_dec_ops cedrus_dec_ops_h26 .start = cedrus_h264_start, .stop = cedrus_h264_stop, .trigger = cedrus_h264_trigger, + .buf_cleanup = cedrus_h264_buf_cleanup, }; ================================================ FILE: projects/Allwinner/patches/linux/0024-WIP-dw-hdmi-cec-sleep-100ms-on-error.patch ================================================ From f826ffb93b1ba0cfb9a5cfa3403813674331d4e0 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Tue, 26 Feb 2019 20:45:14 +0000 Subject: [PATCH 34/44] 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(-) --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c @@ -4,6 +4,7 @@ * * Copyright (C) 2015-2017 Russell King. */ +#include <linux/delay.h> #include <linux/interrupt.h> #include <linux/io.h> #include <linux/module.h> @@ -129,8 +130,15 @@ static irqreturn_t dw_hdmi_cec_hardirq(i 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) { @@ -141,6 +149,10 @@ static irqreturn_t dw_hdmi_cec_hardirq(i 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) { @@ -173,6 +185,8 @@ static irqreturn_t dw_hdmi_cec_thread(in 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) { ================================================ FILE: projects/Allwinner/patches/linux/0027-drm-sun4i-mixer-Add-caching-support.patch ================================================ From 2e5d4ca1c07ddf06f8c3b18fd73baea7ce711169 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Sun, 19 Jul 2020 11:37:41 +0200 Subject: [PATCH 37/44] drm/sun4i: mixer: Add caching support Most registers are not safe to read out so enable cache in regmap. Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- drivers/gpu/drm/sun4i/sun8i_mixer.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) --- a/drivers/gpu/drm/sun4i/sun8i_mixer.c +++ b/drivers/gpu/drm/sun4i/sun8i_mixer.c @@ -346,11 +346,23 @@ static const struct sunxi_engine_ops sun .layers_init = sun8i_layers_init, }; +static bool sun8i_mixer_volatile_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case SUN8I_MIXER_GLOBAL_STATUS: + case SUN8I_MIXER_GLOBAL_DBUFF: + return true; + } + return false; +} + static const struct regmap_config sun8i_mixer_regmap_config = { + .cache_type = REGCACHE_FLAT, .reg_bits = 32, .val_bits = 32, .reg_stride = 4, .max_register = 0xffffc, /* guessed */ + .volatile_reg = sun8i_mixer_volatile_reg, }; static int sun8i_mixer_of_get_id(struct device_node *node) ================================================ FILE: projects/Allwinner/patches/linux/0028-mfd-Add-support-for-AC200.patch ================================================ From 59adceb6f34521c0f1a229f20ee9961269daa539 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Fri, 16 Aug 2019 16:38:21 +0200 Subject: [PATCH 38/44] mfd: Add support for AC200 Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- drivers/mfd/Kconfig | 9 ++ drivers/mfd/Makefile | 1 + drivers/mfd/ac200.c | 150 +++++++++++++++++++++++++++ include/linux/mfd/ac200.h | 209 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 369 insertions(+) create mode 100644 drivers/mfd/ac200.c create mode 100644 include/linux/mfd/ac200.h --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig @@ -178,6 +178,15 @@ config MFD_AC100 This driver include only the core APIs. You have to select individual components like codecs or RTC under the corresponding menus. +config MFD_AC200 + tristate "X-Powers AC200" + select MFD_CORE + depends on I2C + help + If you say Y here you get support for the X-Powers AC200 IC. + This driver include only the core APIs. You have to select individual + components like Ethernet PHY or RTC under the corresponding menus. + config MFD_AXP20X tristate select MFD_CORE --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile @@ -142,6 +142,7 @@ obj-$(CONFIG_MFD_DA9052_SPI) += da9052-s obj-$(CONFIG_MFD_DA9052_I2C) += da9052-i2c.o obj-$(CONFIG_MFD_AC100) += ac100.o +obj-$(CONFIG_MFD_AC200) += ac200.o obj-$(CONFIG_MFD_AXP20X) += axp20x.o obj-$(CONFIG_MFD_AXP20X_I2C) += axp20x-i2c.o obj-$(CONFIG_MFD_AXP20X_RSB) += axp20x-rsb.o --- /dev/null +++ b/drivers/mfd/ac200.c @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * MFD core driver for X-Powers' AC200 IC + * + * The AC200 is a chip which is co-packaged with Allwinner H6 SoC and + * includes analog audio codec, analog TV encoder, ethernet PHY, eFuse + * and RTC. + * + * Copyright (c) 2019 Jernej Skrabec <jernej.skrabec@siol.net> + * + * Based on AC100 driver with following copyrights: + * Copyright (2016) Chen-Yu Tsai + */ + +#include <linux/i2c.h> +#include <linux/kernel.h> +#include <linux/mfd/core.h> +#include <linux/mfd/ac200.h> +#include <linux/module.h> +#include <linux/of.h> + +static const struct regmap_range_cfg ac200_range_cfg[] = { + { + .range_min = AC200_SYS_VERSION, + .range_max = AC200_IC_CHARA1, + .selector_reg = AC200_TWI_REG_ADDR_H, + .selector_mask = 0xff, + .selector_shift = 0, + .window_start = 0, + .window_len = 256, + } +}; + +static const struct regmap_config ac200_regmap_config = { + .reg_bits = 8, + .val_bits = 16, + .ranges = ac200_range_cfg, + .num_ranges = ARRAY_SIZE(ac200_range_cfg), + .max_register = AC200_IC_CHARA1, +}; + +static struct mfd_cell ac200_cells[] = { + { + .name = "ac200-codec", + .of_compatible = "x-powers,ac200-codec", + }, { + .name = "ac200-efuse", + .of_compatible = "x-powers,ac200-efuse", + }, { + .name = "ac200-ephy", + .of_compatible = "x-powers,ac200-ephy", + }, { + .name = "ac200-rtc", + .of_compatible = "x-powers,ac200-rtc", + }, { + .name = "ac200-tve", + .of_compatible = "x-powers,ac200-tve", + }, +}; + +static int ac200_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) +{ + struct device *dev = &i2c->dev; + struct ac200_dev *ac200; + int ret; + + ac200 = devm_kzalloc(dev, sizeof(*ac200), GFP_KERNEL); + if (!ac200) + return -ENOMEM; + + i2c_set_clientdata(i2c, ac200); + + ac200->clk = devm_clk_get(dev, NULL); + if (IS_ERR(ac200->clk)) { + ret = PTR_ERR(ac200->clk); + dev_err(dev, "Can't obtain the clock: %d\n", ret); + return ret; + } + + ac200->regmap = devm_regmap_init_i2c(i2c, &ac200_regmap_config); + if (IS_ERR(ac200->regmap)) { + ret = PTR_ERR(ac200->regmap); + dev_err(dev, "Regmap init failed: %d\n", ret); + return ret; + } + + ret = clk_prepare_enable(ac200->clk); + if (ret) + return ret; + + ret = regmap_write(ac200->regmap, AC200_SYS_CONTROL, 0); + if (ret) + goto err; + + ret = regmap_write(ac200->regmap, AC200_SYS_CONTROL, 1); + if (ret) + goto err; + + ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE, ac200_cells, + ARRAY_SIZE(ac200_cells), NULL, 0, NULL); + if (ret) { + dev_err(dev, "Failed to add MFD devices: %d\n", ret); + goto err; + } + + return 0; + +err: + clk_disable_unprepare(ac200->clk); + return ret; +} + +void ac200_i2c_remove(struct i2c_client *i2c) +{ + struct ac200_dev *ac200 = i2c_get_clientdata(i2c); + + regmap_write(ac200->regmap, AC200_SYS_CONTROL, 0); + + clk_disable_unprepare(ac200->clk); +} + +static const struct i2c_device_id ac200_ids[] = { + { "ac200", }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(i2c, ac200_ids); + +static const struct of_device_id ac200_of_match[] = { + { .compatible = "x-powers,ac200" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, ac200_of_match); + +static struct i2c_driver ac200_i2c_driver = { + .driver = { + .name = "ac200", + .of_match_table = of_match_ptr(ac200_of_match), + }, + .probe = ac200_i2c_probe, + .remove = ac200_i2c_remove, + .id_table = ac200_ids, +}; +module_i2c_driver(ac200_i2c_driver); + +MODULE_DESCRIPTION("MFD core driver for AC200"); +MODULE_AUTHOR("Jernej Skrabec <jernej.skrabec@siol.net>"); +MODULE_LICENSE("GPL v2"); --- /dev/null +++ b/include/linux/mfd/ac200.h @@ -0,0 +1,209 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * AC200 register list + * + * Copyright (C) 2019 Jernej Skrabec <jernej.skrabec@siol.net> + */ + +#ifndef __LINUX_MFD_AC200_H +#define __LINUX_MFD_AC200_H + +#include <linux/clk.h> +#include <linux/regmap.h> + +/* interface registers (can be accessed from any page) */ +#define AC200_TWI_CHANGE_TO_RSB 0x3E +#define AC200_TWI_PAD_DELAY 0xC4 +#define AC200_TWI_REG_ADDR_H 0xFE + +/* General registers */ +#define AC200_SYS_VERSION 0x0000 +#define AC200_SYS_CONTROL 0x0002 +#define AC200_SYS_IRQ_ENABLE 0x0004 +#define AC200_SYS_IRQ_STATUS 0x0006 +#define AC200_SYS_CLK_CTL 0x0008 +#define AC200_SYS_DLDO_OSC_CTL 0x000A +#define AC200_SYS_PLL_CTL0 0x000C +#define AC200_SYS_PLL_CTL1 0x000E +#define AC200_SYS_AUDIO_CTL0 0x0010 +#define AC200_SYS_AUDIO_CTL1 0x0012 +#define AC200_SYS_EPHY_CTL0 0x0014 +#define AC200_SYS_EPHY_CTL1 0x0016 +#define AC200_SYS_TVE_CTL0 0x0018 +#define AC200_SYS_TVE_CTL1 0x001A + +/* Audio Codec registers */ +#define AC200_AC_SYS_CLK_CTL 0x2000 +#define AC200_SYS_MOD_RST 0x2002 +#define AC200_SYS_SAMP_CTL 0x2004 +#define AC200_I2S_CTL 0x2100 +#define AC200_I2S_CLK 0x2102 +#define AC200_I2S_FMT0 0x2104 +#define AC200_I2S_FMT1 0x2108 +#define AC200_I2S_MIX_SRC 0x2114 +#define AC200_I2S_MIX_GAIN 0x2116 +#define AC200_I2S_DACDAT_DVC 0x2118 +#define AC200_I2S_ADCDAT_DVC 0x211A +#define AC200_AC_DAC_DPC 0x2200 +#define AC200_AC_DAC_MIX_SRC 0x2202 +#define AC200_AC_DAC_MIX_GAIN 0x2204 +#define AC200_DACA_OMIXER_CTRL 0x2220 +#define AC200_OMIXER_SR 0x2222 +#define AC200_LINEOUT_CTRL 0x2224 +#define AC200_AC_ADC_DPC 0x2300 +#define AC200_MBIAS_CTRL 0x2310 +#define AC200_ADC_MIC_CTRL 0x2320 +#define AC200_ADCMIXER_SR 0x2322 +#define AC200_ANALOG_TUNING0 0x232A +#define AC200_ANALOG_TUNING1 0x232C +#define AC200_AC_AGC_SEL 0x2480 +#define AC200_ADC_DAPLCTRL 0x2500 +#define AC200_ADC_DAPRCTRL 0x2502 +#define AC200_ADC_DAPLSTA 0x2504 +#define AC200_ADC_DAPRSTA 0x2506 +#define AC200_ADC_DAPLTL 0x2508 +#define AC200_ADC_DAPRTL 0x250A +#define AC200_ADC_DAPLHAC 0x250C +#define AC200_ADC_DAPLLAC 0x250E +#define AC200_ADC_DAPRHAC 0x2510 +#define AC200_ADC_DAPRLAC 0x2512 +#define AC200_ADC_DAPLDT 0x2514 +#define AC200_ADC_DAPLAT 0x2516 +#define AC200_ADC_DAPRDT 0x2518 +#define AC200_ADC_DAPRAT 0x251A +#define AC200_ADC_DAPNTH 0x251C +#define AC200_ADC_DAPLHNAC 0x251E +#define AC200_ADC_DAPLLNAC 0x2520 +#define AC200_ADC_DAPRHNAC 0x2522 +#define AC200_ADC_DAPRLNAC 0x2524 +#define AC200_AC_DAPHHPFC 0x2526 +#define AC200_AC_DAPLHPFC 0x2528 +#define AC200_AC_DAPOPT 0x252A +#define AC200_AC_DAC_DAPCTRL 0x3000 +#define AC200_AC_DRC_HHPFC 0x3002 +#define AC200_AC_DRC_LHPFC 0x3004 +#define AC200_AC_DRC_CTRL 0x3006 +#define AC200_AC_DRC_LPFHAT 0x3008 +#define AC200_AC_DRC_LPFLAT 0x300A +#define AC200_AC_DRC_RPFHAT 0x300C +#define AC200_AC_DRC_RPFLAT 0x300E +#define AC200_AC_DRC_LPFHRT 0x3010 +#define AC200_AC_DRC_LPFLRT 0x3012 +#define AC200_AC_DRC_RPFHRT 0x3014 +#define AC200_AC_DRC_RPFLRT 0x3016 +#define AC200_AC_DRC_LRMSHAT 0x3018 +#define AC200_AC_DRC_LRMSLAT 0x301A +#define AC200_AC_DRC_RRMSHAT 0x301C +#define AC200_AC_DRC_RRMSLAT 0x301E +#define AC200_AC_DRC_HCT 0x3020 +#define AC200_AC_DRC_LCT 0x3022 +#define AC200_AC_DRC_HKC 0x3024 +#define AC200_AC_DRC_LKC 0x3026 +#define AC200_AC_DRC_HOPC 0x3028 +#define AC200_AC_DRC_LOPC 0x302A +#define AC200_AC_DRC_HLT 0x302C +#define AC200_AC_DRC_LLT 0x302E +#define AC200_AC_DRC_HKI 0x3030 +#define AC200_AC_DRC_LKI 0x3032 +#define AC200_AC_DRC_HOPL 0x3034 +#define AC200_AC_DRC_LOPL 0x3036 +#define AC200_AC_DRC_HET 0x3038 +#define AC200_AC_DRC_LET 0x303A +#define AC200_AC_DRC_HKE 0x303C +#define AC200_AC_DRC_LKE 0x303E +#define AC200_AC_DRC_HOPE 0x3040 +#define AC200_AC_DRC_LOPE 0x3042 +#define AC200_AC_DRC_HKN 0x3044 +#define AC200_AC_DRC_LKN 0x3046 +#define AC200_AC_DRC_SFHAT 0x3048 +#define AC200_AC_DRC_SFLAT 0x304A +#define AC200_AC_DRC_SFHRT 0x304C +#define AC200_AC_DRC_SFLRT 0x304E +#define AC200_AC_DRC_MXGHS 0x3050 +#define AC200_AC_DRC_MXGLS 0x3052 +#define AC200_AC_DRC_MNGHS 0x3054 +#define AC200_AC_DRC_MNGLS 0x3056 +#define AC200_AC_DRC_EPSHC 0x3058 +#define AC200_AC_DRC_EPSLC 0x305A +#define AC200_AC_DRC_HPFHGAIN 0x305E +#define AC200_AC_DRC_HPFLGAIN 0x3060 +#define AC200_AC_DRC_BISTCR 0x3100 +#define AC200_AC_DRC_BISTST 0x3102 + +/* TVE registers */ +#define AC200_TVE_CTL0 0x4000 +#define AC200_TVE_CTL1 0x4002 +#define AC200_TVE_MOD0 0x4004 +#define AC200_TVE_MOD1 0x4006 +#define AC200_TVE_DAC_CFG0 0x4008 +#define AC200_TVE_DAC_CFG1 0x400A +#define AC200_TVE_YC_DELAY 0x400C +#define AC200_TVE_YC_FILTER 0x400E +#define AC200_TVE_BURST_FRQ0 0x4010 +#define AC200_TVE_BURST_FRQ1 0x4012 +#define AC200_TVE_FRONT_PORCH 0x4014 +#define AC200_TVE_BACK_PORCH 0x4016 +#define AC200_TVE_TOTAL_LINE 0x401C +#define AC200_TVE_FIRST_ACTIVE 0x401E +#define AC200_TVE_BLACK_LEVEL 0x4020 +#define AC200_TVE_BLANK_LEVEL 0x4022 +#define AC200_TVE_PLUG_EN 0x4030 +#define AC200_TVE_PLUG_IRQ_EN 0x4032 +#define AC200_TVE_PLUG_IRQ_STA 0x4034 +#define AC200_TVE_PLUG_STA 0x4038 +#define AC200_TVE_PLUG_DEBOUNCE 0x4040 +#define AC200_TVE_DAC_TEST 0x4042 +#define AC200_TVE_PLUG_PULSE_LEVEL 0x40F4 +#define AC200_TVE_PLUG_PULSE_START 0x40F8 +#define AC200_TVE_PLUG_PULSE_PERIOD 0x40FA +#define AC200_TVE_IF_CTL 0x5000 +#define AC200_TVE_IF_TIM0 0x5008 +#define AC200_TVE_IF_TIM1 0x500A +#define AC200_TVE_IF_TIM2 0x500C +#define AC200_TVE_IF_TIM3 0x500E +#define AC200_TVE_IF_SYNC0 0x5010 +#define AC200_TVE_IF_SYNC1 0x5012 +#define AC200_TVE_IF_SYNC2 0x5014 +#define AC200_TVE_IF_TIM4 0x5016 +#define AC200_TVE_IF_STATUS 0x5018 + +/* EPHY registers */ +#define AC200_EPHY_CTL 0x6000 +#define AC200_EPHY_BIST 0x6002 + +/* eFuse registers (0x8000 - 0x9FFF, layout unknown) */ + +/* RTC registers */ +#define AC200_LOSC_CTRL0 0xA000 +#define AC200_LOSC_CTRL1 0xA002 +#define AC200_LOSC_AUTO_SWT_STA 0xA004 +#define AC200_INTOSC_CLK_PRESCAL 0xA008 +#define AC200_RTC_YY_MM_DD0 0xA010 +#define AC200_RTC_YY_MM_DD1 0xA012 +#define AC200_RTC_HH_MM_SS0 0xA014 +#define AC200_RTC_HH_MM_SS1 0xA016 +#define AC200_ALARM0_CUR_VLU0 0xA024 +#define AC200_ALARM0_CUR_VLU1 0xA026 +#define AC200_ALARM0_ENABLE 0xA028 +#define AC200_ALARM0_IRQ_EN 0xA02C +#define AC200_ALARM0_IRQ_STA 0xA030 +#define AC200_ALARM1_WK_HH_MM_SS0 0xA040 +#define AC200_ALARM1_WK_HH_MM_SS1 0xA042 +#define AC200_ALARM1_ENABLE 0xA044 +#define AC200_ALARM1_IRQ_EN 0xA048 +#define AC200_ALARM1_IRQ_STA 0xA04C +#define AC200_ALARM_CONFIG 0xA050 +#define AC200_LOSC_OUT_GATING 0xA060 +#define AC200_GP_DATA(x) (0xA100 + (x) * 2) +#define AC200_RTC_DEB 0xA170 +#define AC200_GPL_HOLD_OUTPUT 0xA180 +#define AC200_VDD_RTC 0xA190 +#define AC200_IC_CHARA0 0xA1F0 +#define AC200_IC_CHARA1 0xA1F2 + +struct ac200_dev { + struct clk *clk; + struct regmap *regmap; +}; + +#endif /* __LINUX_MFD_AC200_H */ ================================================ FILE: projects/Allwinner/patches/linux/0029-net-phy-Add-support-for-AC200-EPHY.patch ================================================ From cbf68fb141747879e2e6c43584c1e1e3b4d77683 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Fri, 16 Aug 2019 16:38:57 +0200 Subject: [PATCH 39/44] net: phy: Add support for AC200 EPHY Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- drivers/net/phy/Kconfig | 7 ++ drivers/net/phy/Makefile | 1 + drivers/net/phy/ac200.c | 234 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 242 insertions(+) create mode 100644 drivers/net/phy/ac200.c --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig @@ -63,6 +63,13 @@ config SFP comment "MII PHY device drivers" +config AC200_PHY + tristate "AC200 EPHY" + depends on NVMEM + depends on OF + help + Fast ethernet PHY as found in X-Powers AC200 multi-function device. + config AMD_PHY tristate "AMD PHYs" help --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile @@ -30,6 +30,7 @@ obj-$(CONFIG_SFP) += sfp.o sfp-obj-$(CONFIG_SFP) += sfp-bus.o obj-y += $(sfp-obj-y) $(sfp-obj-m) +obj-$(CONFIG_AC200_PHY) += ac200.o obj-$(CONFIG_ADIN_PHY) += adin.o obj-$(CONFIG_AMD_PHY) += amd.o aquantia-objs += aquantia_main.o --- /dev/null +++ b/drivers/net/phy/ac200.c @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: GPL-2.0+ +/** + * Driver for AC200 Ethernet PHY + * + * Copyright (c) 2019 Jernej Skrabec <jernej.skrabec@siol.net> + */ + +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/mfd/ac200.h> +#include <linux/nvmem-consumer.h> +#include <linux/of.h> +#include <linux/phy.h> +#include <linux/platform_device.h> + +#define AC200_EPHY_ID 0x00441400 +#define AC200_EPHY_ID_MASK 0x0ffffff0 + +/* macros for system ephy control 0 register */ +#define AC200_EPHY_RESET_INVALID BIT(0) +#define AC200_EPHY_SYSCLK_GATING BIT(1) + +/* macros for system ephy control 1 register */ +#define AC200_EPHY_E_EPHY_MII_IO_EN BIT(0) +#define AC200_EPHY_E_LNK_LED_IO_EN BIT(1) +#define AC200_EPHY_E_SPD_LED_IO_EN BIT(2) +#define AC200_EPHY_E_DPX_LED_IO_EN BIT(3) + +/* macros for ephy control register */ +#define AC200_EPHY_SHUTDOWN BIT(0) +#define AC200_EPHY_LED_POL BIT(1) +#define AC200_EPHY_CLK_SEL BIT(2) +#define AC200_EPHY_ADDR(x) (((x) & 0x1F) << 4) +#define AC200_EPHY_XMII_SEL BIT(11) +#define AC200_EPHY_CALIB(x) (((x) & 0xF) << 12) + +struct ac200_ephy_dev { + struct phy_driver *ephy; + struct regmap *regmap; +}; + +static char *ac200_phy_name = "AC200 EPHY"; + +static void disable_intelligent_ieee(struct phy_device *phydev) +{ + unsigned int value; + + phy_write(phydev, 0x1f, 0x0100); /* switch to page 1 */ + value = phy_read(phydev, 0x17); + value &= ~BIT(3); /* disable IEEE */ + phy_write(phydev, 0x17, value); + phy_write(phydev, 0x1f, 0x0000); /* switch to page 0 */ +} + +static void disable_802_3az_ieee(struct phy_device *phydev) +{ + unsigned int value; + + phy_write(phydev, 0xd, 0x7); + phy_write(phydev, 0xe, 0x3c); + phy_write(phydev, 0xd, BIT(14) | 0x7); + value = phy_read(phydev, 0xe); + value &= ~BIT(1); + phy_write(phydev, 0xd, 0x7); + phy_write(phydev, 0xe, 0x3c); + phy_write(phydev, 0xd, BIT(14) | 0x7); + phy_write(phydev, 0xe, value); + + phy_write(phydev, 0x1f, 0x0200); /* switch to page 2 */ + phy_write(phydev, 0x18, 0x0000); +} + +static int ac200_ephy_config_init(struct phy_device *phydev) +{ + const struct ac200_ephy_dev *priv = phydev->drv->driver_data; + unsigned int value; + int ret; + + phy_write(phydev, 0x1f, 0x0100); /* Switch to Page 1 */ + phy_write(phydev, 0x12, 0x4824); /* Disable APS */ + + phy_write(phydev, 0x1f, 0x0200); /* Switch to Page 2 */ + phy_write(phydev, 0x18, 0x0000); /* PHYAFE TRX optimization */ + + phy_write(phydev, 0x1f, 0x0600); /* Switch to Page 6 */ + phy_write(phydev, 0x14, 0x708f); /* PHYAFE TX optimization */ + phy_write(phydev, 0x13, 0xF000); /* PHYAFE RX optimization */ + phy_write(phydev, 0x15, 0x1530); + + phy_write(phydev, 0x1f, 0x0800); /* Switch to Page 6 */ + phy_write(phydev, 0x18, 0x00bc); /* PHYAFE TRX optimization */ + + disable_intelligent_ieee(phydev); /* Disable Intelligent IEEE */ + disable_802_3az_ieee(phydev); /* Disable 802.3az IEEE */ + phy_write(phydev, 0x1f, 0x0000); /* Switch to Page 0 */ + + value = (phydev->interface == PHY_INTERFACE_MODE_RMII) ? + AC200_EPHY_XMII_SEL : 0; + ret = regmap_update_bits(priv->regmap, AC200_EPHY_CTL, + AC200_EPHY_XMII_SEL, value); + if (ret) + return ret; + + /* FIXME: This is probably H6 specific */ + value = phy_read(phydev, 0x13); + value |= BIT(12); + phy_write(phydev, 0x13, value); + + return 0; +} + +static const struct mdio_device_id __maybe_unused ac200_ephy_phy_tbl[] = { + { AC200_EPHY_ID, AC200_EPHY_ID_MASK }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(mdio, ac200_ephy_phy_tbl); + +static int ac200_ephy_probe(struct platform_device *pdev) +{ + struct ac200_dev *ac200 = dev_get_drvdata(pdev->dev.parent); + struct device *dev = &pdev->dev; + struct ac200_ephy_dev *priv; + struct nvmem_cell *calcell; + struct phy_driver *ephy; + u16 *caldata, calib; + size_t callen; + int ret; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + ephy = devm_kzalloc(dev, sizeof(*ephy), GFP_KERNEL); + if (!ephy) + return -ENOMEM; + + calcell = devm_nvmem_cell_get(dev, "ephy_calib"); + if (IS_ERR(calcell)) { + dev_err(dev, "Unable to find calibration data!\n"); + return PTR_ERR(calcell); + } + + caldata = nvmem_cell_read(calcell, &callen); + if (IS_ERR(caldata)) { + dev_err(dev, "Unable to read calibration data!\n"); + return PTR_ERR(caldata); + } + + if (callen != 2) { + dev_err(dev, "Calibration data has wrong length: 2 != %lu\n", + callen); + kfree(caldata); + return -EINVAL; + } + + calib = *caldata + 3; + kfree(caldata); + + ephy->phy_id = AC200_EPHY_ID; + ephy->phy_id_mask = AC200_EPHY_ID_MASK; + ephy->name = ac200_phy_name; + ephy->driver_data = priv; + ephy->soft_reset = genphy_soft_reset; + ephy->config_init = ac200_ephy_config_init; + ephy->suspend = genphy_suspend; + ephy->resume = genphy_resume; + + priv->ephy = ephy; + priv->regmap = ac200->regmap; + platform_set_drvdata(pdev, priv); + + ret = regmap_write(ac200->regmap, AC200_SYS_EPHY_CTL0, + AC200_EPHY_RESET_INVALID | + AC200_EPHY_SYSCLK_GATING); + if (ret) + return ret; + + ret = regmap_write(ac200->regmap, AC200_SYS_EPHY_CTL1, + AC200_EPHY_E_EPHY_MII_IO_EN | + AC200_EPHY_E_LNK_LED_IO_EN | + AC200_EPHY_E_SPD_LED_IO_EN | + AC200_EPHY_E_DPX_LED_IO_EN); + if (ret) + return ret; + + ret = regmap_write(ac200->regmap, AC200_EPHY_CTL, + AC200_EPHY_LED_POL | + AC200_EPHY_CLK_SEL | + AC200_EPHY_ADDR(1) | + AC200_EPHY_CALIB(calib)); + if (ret) + return ret; + + ret = phy_driver_register(priv->ephy, THIS_MODULE); + if (ret) { + dev_err(dev, "Unable to register phy\n"); + return ret; + } + + return 0; +} + +static int ac200_ephy_remove(struct platform_device *pdev) +{ + struct ac200_ephy_dev *priv = platform_get_drvdata(pdev); + + phy_driver_unregister(priv->ephy); + + regmap_write(priv->regmap, AC200_EPHY_CTL, AC200_EPHY_SHUTDOWN); + regmap_write(priv->regmap, AC200_SYS_EPHY_CTL1, 0); + regmap_write(priv->regmap, AC200_SYS_EPHY_CTL0, 0); + + return 0; +} + +static const struct of_device_id ac200_ephy_match[] = { + { .compatible = "x-powers,ac200-ephy" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, ac200_ephy_match); + +static struct platform_driver ac200_ephy_driver = { + .probe = ac200_ephy_probe, + .remove = ac200_ephy_remove, + .driver = { + .name = "ac200-ephy", + .of_match_table = ac200_ephy_match, + }, +}; +module_platform_driver(ac200_ephy_driver); + +MODULE_AUTHOR("Jernej Skrabec <jernej.skrabec@siol.net>"); +MODULE_DESCRIPTION("AC200 Ethernet PHY driver"); +MODULE_LICENSE("GPL"); ================================================ FILE: projects/Allwinner/patches/linux/0030-wip-H6-deinterlace.patch ================================================ From 91c70ea17b58c9205c35cd43a3dd8266bbe035b1 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Mon, 25 May 2020 19:06:07 +0200 Subject: [PATCH 40/44] wip: H6 deinterlace Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- .../media/platform/sunxi/sunxi50i-di/Kconfig | 14 + drivers/media/platform/sunxi/Makefile | 1 + .../media/platform/sunxi/sun50i-di/Makefile | 2 + .../platform/sunxi/sun50i-di/sun50i-di.c | 1134 +++++++++++++++++ .../platform/sunxi/sun50i-di/sun50i-di.h | 172 +++ 5 files changed, 1322 insertions(+) create mode 100644 drivers/media/platform/sunxi/sun50i-di/Makefile create mode 100644 drivers/media/platform/sunxi/sun50i-di/sun50i-di.c create mode 100644 drivers/media/platform/sunxi/sun50i-di/sun50i-di.h --- /dev/null +++ b/drivers/media/platform/sunxi/sun50i-di/Kconfig @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: GPL-2.0-only +config VIDEO_SUN50I_DEINTERLACE + tristate "Allwinner Deinterlace v2 driver" + depends on V4L_MEM2MEM_DRIVERS + depends on VIDEO_DEV + depends on ARCH_SUNXI || COMPILE_TEST + depends on COMMON_CLK && OF + depends on PM + select VIDEOBUF2_DMA_CONTIG + select V4L2_MEM2MEM_DEV + help + Support for the Allwinner deinterlace v2 unit found on + some SoCs, like H6. + To compile this driver as a module choose m here. --- a/drivers/media/platform/sunxi/Makefile +++ b/drivers/media/platform/sunxi/Makefile @@ -3,4 +3,5 @@ obj-y += sun4i-csi/ obj-y += sun6i-csi/ obj-y += sun8i-di/ +obj-y += sun50i-di/ obj-y += sun8i-rotate/ --- /dev/null +++ b/drivers/media/platform/sunxi/sun50i-di/Makefile @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_VIDEO_SUN50I_DEINTERLACE) += sun50i-di.o --- /dev/null +++ b/drivers/media/platform/sunxi/sun50i-di/sun50i-di.c @@ -0,0 +1,1137 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Allwinner sun50i deinterlacer driver + * + * Copyright (C) 2020 Jernej Skrabec <jernej.skrabec@siol.net> + * + * Based on vim2m driver. + */ + +#include <linux/clk.h> +#include <linux/interrupt.h> +#include <linux/io.h> +#include <linux/iopoll.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/pm_runtime.h> +#include <linux/reset.h> + +#include <media/v4l2-device.h> +#include <media/v4l2-ioctl.h> +#include <media/v4l2-mem2mem.h> + +#include "sun50i-di.h" + +#define FLAG_SIZE (DEINTERLACE_MAX_WIDTH * DEINTERLACE_MAX_HEIGHT / 4) + +static u32 deinterlace_formats[] = { + V4L2_PIX_FMT_NV12, + V4L2_PIX_FMT_NV21, + V4L2_PIX_FMT_YUV420, + V4L2_PIX_FMT_NV16, + V4L2_PIX_FMT_NV61, + V4L2_PIX_FMT_YUV422P +}; + +static inline u32 deinterlace_read(struct deinterlace_dev *dev, u32 reg) +{ + return readl(dev->base + reg); +} + +static inline void deinterlace_write(struct deinterlace_dev *dev, + u32 reg, u32 value) +{ + writel(value, dev->base + reg); +} + +static inline void deinterlace_set_bits(struct deinterlace_dev *dev, + u32 reg, u32 bits) +{ + u32 val = readl(dev->base + reg); + + val |= bits; + + writel(val, dev->base + reg); +} + +static inline void deinterlace_clr_set_bits(struct deinterlace_dev *dev, + u32 reg, u32 clr, u32 set) +{ + u32 val = readl(dev->base + reg); + + val &= ~clr; + val |= set; + + writel(val, dev->base + reg); +} + +static void deinterlace_device_run(void *priv) +{ + u32 width, height, reg, msk, pitch[3], offset[2], fmt; + dma_addr_t buf, prev, curr, next, addr[4][3]; + struct deinterlace_ctx *ctx = priv; + struct deinterlace_dev *dev = ctx->dev; + struct vb2_v4l2_buffer *src, *dst; + unsigned int val; + bool motion; + + src = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); + dst = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); + + v4l2_m2m_buf_copy_metadata(src, dst, true); + + fmt = ctx->src_fmt.pixelformat; + + deinterlace_write(dev, DEINTERLACE_IN_FLAG_ADDR, ctx->flag1_buf_dma); + deinterlace_write(dev, DEINTERLACE_OUT_FLAG_ADDR, ctx->flag2_buf_dma); + deinterlace_write(dev, DEINTERLACE_FLAG_ADDRH, 0); + deinterlace_write(dev, DEINTERLACE_FLAG_PITCH, 0x200); + if (device_iommu_mapped(dev->dev)) + deinterlace_set_bits(dev, DEINTERLACE_CTRL, + DEINTERLACE_CTRL_IOMMU_EN); + + width = ctx->src_fmt.width; + height = ctx->src_fmt.height; + + reg = DEINTERLACE_SIZE_WIDTH(width); + reg |= DEINTERLACE_SIZE_HEIGHT(height); + deinterlace_write(dev, DEINTERLACE_SIZE, reg); + + switch (fmt) { + case V4L2_PIX_FMT_NV12: + case V4L2_PIX_FMT_NV21: + reg = DEINTERLACE_FORMAT_YUV420SP; + break; + case V4L2_PIX_FMT_YUV420: + reg = DEINTERLACE_FORMAT_YUV420P; + break; + case V4L2_PIX_FMT_NV16: + case V4L2_PIX_FMT_NV61: + reg = DEINTERLACE_FORMAT_YUV422SP; + break; + case V4L2_PIX_FMT_YUV422P: + reg = DEINTERLACE_FORMAT_YUV422P; + break; + } + deinterlace_write(dev, DEINTERLACE_FORMAT, reg); + + pitch[0] = ctx->src_fmt.bytesperline; + switch (fmt) { + case V4L2_PIX_FMT_YUV420: + case V4L2_PIX_FMT_YUV422P: + pitch[1] = pitch[0] / 2; + pitch[2] = pitch[1]; + break; + case V4L2_PIX_FMT_NV12: + case V4L2_PIX_FMT_NV21: + case V4L2_PIX_FMT_NV16: + case V4L2_PIX_FMT_NV61: + pitch[1] = pitch[0]; + pitch[2] = 0; + break; + } + + deinterlace_write(dev, DEINTERLACE_IN_PITCH0, pitch[0] * 2); + deinterlace_write(dev, DEINTERLACE_IN_PITCH1, pitch[1] * 2); + deinterlace_write(dev, DEINTERLACE_IN_PITCH2, pitch[2] * 2); + deinterlace_write(dev, DEINTERLACE_OUT_PITCH0, pitch[0]); + deinterlace_write(dev, DEINTERLACE_OUT_PITCH1, pitch[1]); + deinterlace_write(dev, DEINTERLACE_OUT_PITCH2, pitch[2]); + + offset[0] = pitch[0] * height; + switch (fmt) { + case V4L2_PIX_FMT_YUV420: + offset[1] = offset[0] + offset[0] / 4; + break; + case V4L2_PIX_FMT_YUV422P: + offset[1] = offset[0] + offset[0] / 2; + break; + default: + offset[1] = 0; + break; + } + + buf = vb2_dma_contig_plane_dma_addr(&src->vb2_buf, 0); + next = buf; + if (ctx->prev[0]) + buf = vb2_dma_contig_plane_dma_addr(&ctx->prev[0]->vb2_buf, 0); + curr = buf; + if (ctx->prev[1]) + buf = vb2_dma_contig_plane_dma_addr(&ctx->prev[1]->vb2_buf, 0); + prev = buf; + + if (ctx->first_field == 0) { + if (ctx->field == 0) { + addr[0][0] = prev; + addr[0][1] = prev + offset[0]; + addr[0][2] = prev + offset[1]; + addr[1][0] = prev + pitch[0]; + addr[1][1] = prev + offset[0] + pitch[1]; + addr[1][2] = prev + offset[1] + pitch[2]; + addr[2][0] = curr; + addr[2][1] = curr + offset[0]; + addr[2][2] = curr + offset[1]; + addr[3][0] = curr + pitch[0]; + addr[3][1] = curr + offset[0] + pitch[1]; + addr[3][2] = curr + offset[1] + pitch[2]; + } else { + addr[0][0] = prev + pitch[0]; + addr[0][1] = prev + offset[0] + pitch[1]; + addr[0][2] = prev + offset[1] + pitch[2]; + addr[1][0] = curr; + addr[1][1] = curr + offset[0]; + addr[1][2] = curr + offset[1]; + addr[2][0] = curr + pitch[0]; + addr[2][1] = curr + offset[0] + pitch[1]; + addr[2][2] = curr + offset[1] + pitch[2]; + addr[3][0] = next; + addr[3][1] = next + offset[0]; + addr[3][2] = next + offset[1]; + } + } else { + if (ctx->field == 0) { + addr[0][0] = prev; + addr[0][1] = prev + offset[0]; + addr[0][2] = prev + offset[1]; + addr[1][0] = curr + pitch[0]; + addr[1][1] = curr + offset[0] + pitch[1]; + addr[1][2] = curr + offset[1] + pitch[2]; + addr[2][0] = curr; + addr[2][1] = curr + offset[0]; + addr[2][2] = curr + offset[1]; + addr[3][0] = next + pitch[0]; + addr[3][1] = next + offset[0] + pitch[1]; + addr[3][2] = next + offset[1] + pitch[2]; + } else { + addr[0][0] = prev + pitch[0]; + addr[0][1] = prev + offset[0] + pitch[1]; + addr[0][2] = prev + offset[1] + pitch[2]; + addr[1][0] = prev; + addr[1][1] = prev + offset[0]; + addr[1][2] = prev + offset[1]; + addr[2][0] = curr + pitch[0]; + addr[2][1] = curr + offset[0] + pitch[1]; + addr[2][2] = curr + offset[1] + pitch[2]; + addr[3][0] = curr; + addr[3][1] = curr + offset[0]; + addr[3][2] = curr + offset[1]; + } + } + + deinterlace_write(dev, DEINTERLACE_IN0_ADDR0, addr[0][0]); + deinterlace_write(dev, DEINTERLACE_IN0_ADDR1, addr[0][1]); + deinterlace_write(dev, DEINTERLACE_IN0_ADDR2, addr[0][2]); + + deinterlace_write(dev, DEINTERLACE_IN1_ADDR0, addr[1][0]); + deinterlace_write(dev, DEINTERLACE_IN1_ADDR1, addr[1][1]); + deinterlace_write(dev, DEINTERLACE_IN1_ADDR2, addr[1][2]); + + deinterlace_write(dev, DEINTERLACE_IN2_ADDR0, addr[2][0]); + deinterlace_write(dev, DEINTERLACE_IN2_ADDR1, addr[2][1]); + deinterlace_write(dev, DEINTERLACE_IN2_ADDR2, addr[2][2]); + + deinterlace_write(dev, DEINTERLACE_IN3_ADDR0, addr[3][0]); + deinterlace_write(dev, DEINTERLACE_IN3_ADDR1, addr[3][1]); + deinterlace_write(dev, DEINTERLACE_IN3_ADDR2, addr[3][2]); + + buf = vb2_dma_contig_plane_dma_addr(&dst->vb2_buf, 0); + deinterlace_write(dev, DEINTERLACE_OUT_ADDR0, buf); + deinterlace_write(dev, DEINTERLACE_OUT_ADDR1, buf + offset[0]); + deinterlace_write(dev, DEINTERLACE_OUT_ADDR2, buf + offset[1]); + + if (ctx->first_field == 0) + val = 4; + else + val = 5; + + reg = DEINTERLACE_INTP_PARAM0_LUMA_CUR_FAC_MODE(val); + reg |= DEINTERLACE_INTP_PARAM0_CHROMA_CUR_FAC_MODE(val); + msk = DEINTERLACE_INTP_PARAM0_LUMA_CUR_FAC_MODE_MSK; + msk |= DEINTERLACE_INTP_PARAM0_CHROMA_CUR_FAC_MODE_MSK; + deinterlace_clr_set_bits(dev, DEINTERLACE_INTP_PARAM0, msk, reg); + + reg = DEINTERLACE_POLAR_FIELD(ctx->field); + deinterlace_write(dev, DEINTERLACE_POLAR, reg); + + motion = ctx->prev[0] && ctx->prev[1]; + reg = DEINTERLACE_MODE_DEINT_LUMA; + if (motion) + reg |= DEINTERLACE_MODE_MOTION_EN; + reg |= DEINTERLACE_MODE_INTP_EN; + reg |= DEINTERLACE_MODE_AUTO_UPD_MODE(ctx->first_field); + reg |= DEINTERLACE_MODE_DEINT_CHROMA; + if (!motion) + reg |= DEINTERLACE_MODE_FIELD_MODE; + deinterlace_write(dev, DEINTERLACE_MODE, reg); + + deinterlace_set_bits(dev, DEINTERLACE_INT_CTRL, + DEINTERLACE_INT_EN); + + deinterlace_set_bits(dev, DEINTERLACE_CTRL, + DEINTERLACE_CTRL_START); +} + +static int deinterlace_job_ready(void *priv) +{ + struct deinterlace_ctx *ctx = priv; + + return v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx) >= 1 && + v4l2_m2m_num_dst_bufs_ready(ctx->fh.m2m_ctx) >= 2; +} + +static void deinterlace_job_abort(void *priv) +{ + struct deinterlace_ctx *ctx = priv; + + /* Will cancel the transaction in the next interrupt handler */ + ctx->aborting = 1; +} + +static irqreturn_t deinterlace_irq(int irq, void *data) +{ + struct deinterlace_dev *dev = data; + struct vb2_v4l2_buffer *src, *dst; + struct deinterlace_ctx *ctx; + unsigned int val; + + ctx = v4l2_m2m_get_curr_priv(dev->m2m_dev); + if (!ctx) { + v4l2_err(&dev->v4l2_dev, + "Instance released before the end of transaction\n"); + return IRQ_NONE; + } + + val = deinterlace_read(dev, DEINTERLACE_STATUS); + if (!(val & DEINTERLACE_STATUS_FINISHED)) + return IRQ_NONE; + + deinterlace_write(dev, DEINTERLACE_INT_CTRL, 0); + deinterlace_set_bits(dev, DEINTERLACE_STATUS, + DEINTERLACE_STATUS_FINISHED); + deinterlace_clr_set_bits(dev, DEINTERLACE_CTRL, + DEINTERLACE_CTRL_START, 0); + + dst = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); + v4l2_m2m_buf_done(dst, VB2_BUF_STATE_DONE); + + if (ctx->field != ctx->first_field || ctx->aborting) { + ctx->field = ctx->first_field; + + src = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); + if (ctx->prev[1]) + v4l2_m2m_buf_done(ctx->prev[1], VB2_BUF_STATE_DONE); + ctx->prev[1] = ctx->prev[0]; + ctx->prev[0] = src; + + v4l2_m2m_job_finish(ctx->dev->m2m_dev, ctx->fh.m2m_ctx); + } else { + ctx->field = !ctx->first_field; + deinterlace_device_run(ctx); + } + + return IRQ_HANDLED; +} + +static void deinterlace_init(struct deinterlace_dev *dev) +{ + u32 reg; + + deinterlace_write(dev, DEINTERLACE_OUT_PATH, 0); + + reg = DEINTERLACE_MD_PARAM0_MIN_LUMA_TH(4); + reg |= DEINTERLACE_MD_PARAM0_MAX_LUMA_TH(12); + reg |= DEINTERLACE_MD_PARAM0_AVG_LUMA_SHIFT(6); + reg |= DEINTERLACE_MD_PARAM0_TH_SHIFT(1); + deinterlace_write(dev, DEINTERLACE_MD_PARAM0, reg); + + reg = DEINTERLACE_MD_PARAM1_MOV_FAC_NONEDGE(2); + deinterlace_write(dev, DEINTERLACE_MD_PARAM1, reg); + + reg = DEINTERLACE_MD_PARAM2_CHROMA_SPATIAL_TH(128); + reg |= DEINTERLACE_MD_PARAM2_CHROMA_DIFF_TH(5); + reg |= DEINTERLACE_MD_PARAM2_PIX_STATIC_TH(3); + deinterlace_write(dev, DEINTERLACE_MD_PARAM2, reg); + + reg = DEINTERLACE_INTP_PARAM0_ANGLE_LIMIT(20); + reg |= DEINTERLACE_INTP_PARAM0_ANGLE_CONST_TH(5); + reg |= DEINTERLACE_INTP_PARAM0_LUMA_CUR_FAC_MODE(1); + reg |= DEINTERLACE_INTP_PARAM0_CHROMA_CUR_FAC_MODE(1); + deinterlace_write(dev, DEINTERLACE_INTP_PARAM0, reg); + + reg = DEINTERLACE_MD_CH_PARAM_BLEND_MODE(1); + reg |= DEINTERLACE_MD_CH_PARAM_FONT_PRO_EN; + reg |= DEINTERLACE_MD_CH_PARAM_FONT_PRO_TH(48); + reg |= DEINTERLACE_MD_CH_PARAM_FONT_PRO_FAC(4); + deinterlace_write(dev, DEINTERLACE_MD_CH_PARAM, reg); + + reg = DEINTERLACE_INTP_PARAM1_A(4); + reg |= DEINTERLACE_INTP_PARAM1_EN; + reg |= DEINTERLACE_INTP_PARAM1_C(10); + reg |= DEINTERLACE_INTP_PARAM1_CMAX(64); + reg |= DEINTERLACE_INTP_PARAM1_MAXRAT(2); + deinterlace_write(dev, DEINTERLACE_INTP_PARAM1, reg); + + /* only 32-bit addresses are supported, so high bits are always 0 */ + deinterlace_write(dev, DEINTERLACE_IN0_ADDRH, 0); + deinterlace_write(dev, DEINTERLACE_IN1_ADDRH, 0); + deinterlace_write(dev, DEINTERLACE_IN2_ADDRH, 0); + deinterlace_write(dev, DEINTERLACE_IN3_ADDRH, 0); + deinterlace_write(dev, DEINTERLACE_OUT_ADDRH, 0); +} + +static inline struct deinterlace_ctx *deinterlace_file2ctx(struct file *file) +{ + return container_of(file->private_data, struct deinterlace_ctx, fh); +} + +static bool deinterlace_check_format(u32 pixelformat) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(deinterlace_formats); i++) + if (deinterlace_formats[i] == pixelformat) + return true; + + return false; +} + +static void deinterlace_prepare_format(struct v4l2_pix_format *pix_fmt) +{ + unsigned int bytesperline = pix_fmt->bytesperline; + unsigned int height = pix_fmt->height; + unsigned int width = pix_fmt->width; + unsigned int sizeimage; + + width = clamp(width, DEINTERLACE_MIN_WIDTH, + DEINTERLACE_MAX_WIDTH); + height = clamp(height, DEINTERLACE_MIN_HEIGHT, + DEINTERLACE_MAX_HEIGHT); + + /* try to respect userspace wishes about pitch */ + bytesperline = ALIGN(bytesperline, 2); + if (bytesperline < ALIGN(width, 2)) + bytesperline = ALIGN(width, 2); + + /* luma */ + sizeimage = bytesperline * height; + /* chroma */ + switch (pix_fmt->pixelformat) { + case V4L2_PIX_FMT_NV12: + case V4L2_PIX_FMT_NV21: + case V4L2_PIX_FMT_YUV420: + sizeimage += bytesperline * height / 2; + break; + case V4L2_PIX_FMT_NV16: + case V4L2_PIX_FMT_NV61: + case V4L2_PIX_FMT_YUV422P: + sizeimage += bytesperline * height; + break; + } + + if (pix_fmt->sizeimage < sizeimage) + pix_fmt->sizeimage = sizeimage; + + pix_fmt->width = width; + pix_fmt->height = height; + pix_fmt->bytesperline = bytesperline; +} + +static int deinterlace_querycap(struct file *file, void *priv, + struct v4l2_capability *cap) +{ + strscpy(cap->driver, DEINTERLACE_NAME, sizeof(cap->driver)); + strscpy(cap->card, DEINTERLACE_NAME, sizeof(cap->card)); + snprintf(cap->bus_info, sizeof(cap->bus_info), + "platform:%s", DEINTERLACE_NAME); + + return 0; +} + +static int deinterlace_enum_fmt(struct file *file, void *priv, + struct v4l2_fmtdesc *f) +{ + if (f->index < ARRAY_SIZE(deinterlace_formats)) { + f->pixelformat = deinterlace_formats[f->index]; + + return 0; + } + + return -EINVAL; +} + +static int deinterlace_enum_framesizes(struct file *file, void *priv, + struct v4l2_frmsizeenum *fsize) +{ + if (fsize->index != 0) + return -EINVAL; + + if (!deinterlace_check_format(fsize->pixel_format)) + return -EINVAL; + + fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; + fsize->stepwise.min_width = DEINTERLACE_MIN_WIDTH; + fsize->stepwise.min_height = DEINTERLACE_MIN_HEIGHT; + fsize->stepwise.max_width = DEINTERLACE_MAX_WIDTH; + fsize->stepwise.max_height = DEINTERLACE_MAX_HEIGHT; + fsize->stepwise.step_width = 2; + + switch (fsize->pixel_format) { + case V4L2_PIX_FMT_NV12: + case V4L2_PIX_FMT_NV21: + case V4L2_PIX_FMT_YUV420: + fsize->stepwise.step_height = 2; + break; + case V4L2_PIX_FMT_NV16: + case V4L2_PIX_FMT_NV61: + case V4L2_PIX_FMT_YUV422P: + fsize->stepwise.step_height = 1; + break; + } + + return 0; +} + +static int deinterlace_set_cap_format(struct deinterlace_ctx *ctx, + struct v4l2_pix_format *f) +{ + if (!deinterlace_check_format(ctx->src_fmt.pixelformat)) + return -EINVAL; + + f->pixelformat = ctx->src_fmt.pixelformat; + f->field = V4L2_FIELD_NONE; + f->width = ctx->src_fmt.width; + f->height = ctx->src_fmt.height; + + deinterlace_prepare_format(f); + + return 0; +} + +static int deinterlace_g_fmt_vid_cap(struct file *file, void *priv, + struct v4l2_format *f) +{ + struct deinterlace_ctx *ctx = deinterlace_file2ctx(file); + + f->fmt.pix = ctx->dst_fmt; + + return 0; +} + +static int deinterlace_g_fmt_vid_out(struct file *file, void *priv, + struct v4l2_format *f) +{ + struct deinterlace_ctx *ctx = deinterlace_file2ctx(file); + + f->fmt.pix = ctx->src_fmt; + + return 0; +} + +static int deinterlace_try_fmt_vid_cap(struct file *file, void *priv, + struct v4l2_format *f) +{ + struct deinterlace_ctx *ctx = deinterlace_file2ctx(file); + + return deinterlace_set_cap_format(ctx, &f->fmt.pix); +} + +static int deinterlace_try_fmt_vid_out(struct file *file, void *priv, + struct v4l2_format *f) +{ + if (!deinterlace_check_format(f->fmt.pix.pixelformat)) + f->fmt.pix.pixelformat = deinterlace_formats[0]; + + if (f->fmt.pix.field != V4L2_FIELD_INTERLACED_TB && + f->fmt.pix.field != V4L2_FIELD_INTERLACED_BT && + f->fmt.pix.field != V4L2_FIELD_INTERLACED) + f->fmt.pix.field = V4L2_FIELD_INTERLACED; + + deinterlace_prepare_format(&f->fmt.pix); + + return 0; +} + +static int deinterlace_s_fmt_vid_cap(struct file *file, void *priv, + struct v4l2_format *f) +{ + struct deinterlace_ctx *ctx = deinterlace_file2ctx(file); + struct vb2_queue *vq; + int ret; + + ret = deinterlace_try_fmt_vid_cap(file, priv, f); + if (ret) + return ret; + + vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type); + if (vb2_is_busy(vq)) + return -EBUSY; + + ctx->dst_fmt = f->fmt.pix; + + return 0; +} + +static int deinterlace_s_fmt_vid_out(struct file *file, void *priv, + struct v4l2_format *f) +{ + struct deinterlace_ctx *ctx = deinterlace_file2ctx(file); + struct vb2_queue *vq; + int ret; + + ret = deinterlace_try_fmt_vid_out(file, priv, f); + if (ret) + return ret; + + vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type); + if (vb2_is_busy(vq)) + return -EBUSY; + + /* + * Capture queue has to be also checked, because format and size + * depends on output format and size. + */ + vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE); + if (vb2_is_busy(vq)) + return -EBUSY; + + ctx->src_fmt = f->fmt.pix; + + /* Propagate colorspace information to capture. */ + ctx->dst_fmt.colorspace = f->fmt.pix.colorspace; + ctx->dst_fmt.xfer_func = f->fmt.pix.xfer_func; + ctx->dst_fmt.ycbcr_enc = f->fmt.pix.ycbcr_enc; + ctx->dst_fmt.quantization = f->fmt.pix.quantization; + + return deinterlace_set_cap_format(ctx, &ctx->dst_fmt); +} + +static const struct v4l2_ioctl_ops deinterlace_ioctl_ops = { + .vidioc_querycap = deinterlace_querycap, + + .vidioc_enum_framesizes = deinterlace_enum_framesizes, + + .vidioc_enum_fmt_vid_cap = deinterlace_enum_fmt, + .vidioc_g_fmt_vid_cap = deinterlace_g_fmt_vid_cap, + .vidioc_try_fmt_vid_cap = deinterlace_try_fmt_vid_cap, + .vidioc_s_fmt_vid_cap = deinterlace_s_fmt_vid_cap, + + .vidioc_enum_fmt_vid_out = deinterlace_enum_fmt, + .vidioc_g_fmt_vid_out = deinterlace_g_fmt_vid_out, + .vidioc_try_fmt_vid_out = deinterlace_try_fmt_vid_out, + .vidioc_s_fmt_vid_out = deinterlace_s_fmt_vid_out, + + .vidioc_reqbufs = v4l2_m2m_ioctl_reqbufs, + .vidioc_querybuf = v4l2_m2m_ioctl_querybuf, + .vidioc_qbuf = v4l2_m2m_ioctl_qbuf, + .vidioc_dqbuf = v4l2_m2m_ioctl_dqbuf, + .vidioc_prepare_buf = v4l2_m2m_ioctl_prepare_buf, + .vidioc_create_bufs = v4l2_m2m_ioctl_create_bufs, + .vidioc_expbuf = v4l2_m2m_ioctl_expbuf, + + .vidioc_streamon = v4l2_m2m_ioctl_streamon, + .vidioc_streamoff = v4l2_m2m_ioctl_streamoff, +}; + +static int deinterlace_queue_setup(struct vb2_queue *vq, unsigned int *nbuffers, + unsigned int *nplanes, unsigned int sizes[], + struct device *alloc_devs[]) +{ + struct deinterlace_ctx *ctx = vb2_get_drv_priv(vq); + struct v4l2_pix_format *pix_fmt; + + if (V4L2_TYPE_IS_OUTPUT(vq->type)) + pix_fmt = &ctx->src_fmt; + else + pix_fmt = &ctx->dst_fmt; + + if (*nplanes) { + if (sizes[0] < pix_fmt->sizeimage) + return -EINVAL; + } else { + sizes[0] = pix_fmt->sizeimage; + *nplanes = 1; + } + + return 0; +} + +static int deinterlace_buf_prepare(struct vb2_buffer *vb) +{ + struct vb2_queue *vq = vb->vb2_queue; + struct deinterlace_ctx *ctx = vb2_get_drv_priv(vq); + struct v4l2_pix_format *pix_fmt; + + if (V4L2_TYPE_IS_OUTPUT(vq->type)) + pix_fmt = &ctx->src_fmt; + else + pix_fmt = &ctx->dst_fmt; + + if (vb2_plane_size(vb, 0) < pix_fmt->sizeimage) + return -EINVAL; + + vb2_set_plane_payload(vb, 0, pix_fmt->sizeimage); + + return 0; +} + +static void deinterlace_buf_queue(struct vb2_buffer *vb) +{ + struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); + struct deinterlace_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue); + + v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf); +} + +static void deinterlace_queue_cleanup(struct vb2_queue *vq, u32 state) +{ + struct deinterlace_ctx *ctx = vb2_get_drv_priv(vq); + struct vb2_v4l2_buffer *vbuf; + + do { + if (V4L2_TYPE_IS_OUTPUT(vq->type)) + vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); + else + vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); + + if (vbuf) + v4l2_m2m_buf_done(vbuf, state); + } while (vbuf); + + if (V4L2_TYPE_IS_OUTPUT(vq->type)) { + if (ctx->prev[0]) + v4l2_m2m_buf_done(ctx->prev[0], state); + if (ctx->prev[1]) + v4l2_m2m_buf_done(ctx->prev[1], state); + } +} + +static int deinterlace_start_streaming(struct vb2_queue *vq, unsigned int count) +{ + struct deinterlace_ctx *ctx = vb2_get_drv_priv(vq); + struct device *dev = ctx->dev->dev; + int ret; + + if (V4L2_TYPE_IS_OUTPUT(vq->type)) { + ret = pm_runtime_get_sync(dev); + if (ret < 0) { + dev_err(dev, "Failed to enable module\n"); + + goto err_runtime_get; + } + + ctx->first_field = + ctx->src_fmt.field == V4L2_FIELD_INTERLACED_BT; + ctx->field = ctx->first_field; + + ctx->prev[0] = NULL; + ctx->prev[1] = NULL; + ctx->aborting = 0; + + ctx->flag1_buf = dma_alloc_coherent(dev, FLAG_SIZE, + &ctx->flag1_buf_dma, + GFP_KERNEL); + if (!ctx->flag1_buf) { + ret = -ENOMEM; + + goto err_no_mem1; + } + + ctx->flag2_buf = dma_alloc_coherent(dev, FLAG_SIZE, + &ctx->flag2_buf_dma, + GFP_KERNEL); + if (!ctx->flag2_buf) { + ret = -ENOMEM; + + goto err_no_mem2; + } + } + + return 0; + +err_no_mem2: + dma_free_coherent(dev, FLAG_SIZE, ctx->flag1_buf, + ctx->flag1_buf_dma); +err_no_mem1: + pm_runtime_put(dev); +err_runtime_get: + deinterlace_queue_cleanup(vq, VB2_BUF_STATE_QUEUED); + + return ret; +} + +static void deinterlace_stop_streaming(struct vb2_queue *vq) +{ + struct deinterlace_ctx *ctx = vb2_get_drv_priv(vq); + + if (V4L2_TYPE_IS_OUTPUT(vq->type)) { + struct device *dev = ctx->dev->dev; + + dma_free_coherent(dev, FLAG_SIZE, ctx->flag1_buf, + ctx->flag1_buf_dma); + dma_free_coherent(dev, FLAG_SIZE, ctx->flag2_buf, + ctx->flag2_buf_dma); + + pm_runtime_put(dev); + } + + deinterlace_queue_cleanup(vq, VB2_BUF_STATE_ERROR); +} + +static const struct vb2_ops deinterlace_qops = { + .queue_setup = deinterlace_queue_setup, + .buf_prepare = deinterlace_buf_prepare, + .buf_queue = deinterlace_buf_queue, + .start_streaming = deinterlace_start_streaming, + .stop_streaming = deinterlace_stop_streaming, + .wait_prepare = vb2_ops_wait_prepare, + .wait_finish = vb2_ops_wait_finish, +}; + +static int deinterlace_queue_init(void *priv, struct vb2_queue *src_vq, + struct vb2_queue *dst_vq) +{ + struct deinterlace_ctx *ctx = priv; + int ret; + + src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT; + src_vq->io_modes = VB2_MMAP | VB2_DMABUF; + src_vq->drv_priv = ctx; + src_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer); + src_vq->min_buffers_needed = 1; + src_vq->ops = &deinterlace_qops; + src_vq->mem_ops = &vb2_dma_contig_memops; + src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; + src_vq->lock = &ctx->dev->dev_mutex; + src_vq->dev = ctx->dev->dev; + + ret = vb2_queue_init(src_vq); + if (ret) + return ret; + + dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + dst_vq->io_modes = VB2_MMAP | VB2_DMABUF; + dst_vq->drv_priv = ctx; + dst_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer); + dst_vq->min_buffers_needed = 2; + dst_vq->ops = &deinterlace_qops; + dst_vq->mem_ops = &vb2_dma_contig_memops; + dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; + dst_vq->lock = &ctx->dev->dev_mutex; + dst_vq->dev = ctx->dev->dev; + + ret = vb2_queue_init(dst_vq); + if (ret) + return ret; + + return 0; +} + +static int deinterlace_open(struct file *file) +{ + struct deinterlace_dev *dev = video_drvdata(file); + struct deinterlace_ctx *ctx = NULL; + int ret; + + if (mutex_lock_interruptible(&dev->dev_mutex)) + return -ERESTARTSYS; + + ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) { + mutex_unlock(&dev->dev_mutex); + return -ENOMEM; + } + + /* default output format */ + ctx->src_fmt.pixelformat = deinterlace_formats[0]; + ctx->src_fmt.field = V4L2_FIELD_INTERLACED; + ctx->src_fmt.width = 640; + ctx->src_fmt.height = 480; + deinterlace_prepare_format(&ctx->src_fmt); + + /* default capture format */ + ctx->dst_fmt.pixelformat = deinterlace_formats[0]; + ctx->dst_fmt.field = V4L2_FIELD_NONE; + ctx->dst_fmt.width = 640; + ctx->dst_fmt.height = 480; + deinterlace_prepare_format(&ctx->dst_fmt); + + v4l2_fh_init(&ctx->fh, video_devdata(file)); + file->private_data = &ctx->fh; + ctx->dev = dev; + + ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->m2m_dev, ctx, + &deinterlace_queue_init); + if (IS_ERR(ctx->fh.m2m_ctx)) { + ret = PTR_ERR(ctx->fh.m2m_ctx); + goto err_free; + } + + v4l2_fh_add(&ctx->fh); + + mutex_unlock(&dev->dev_mutex); + + return 0; + +err_free: + kfree(ctx); + mutex_unlock(&dev->dev_mutex); + + return ret; +} + +static int deinterlace_release(struct file *file) +{ + struct deinterlace_dev *dev = video_drvdata(file); + struct deinterlace_ctx *ctx = container_of(file->private_data, + struct deinterlace_ctx, fh); + + mutex_lock(&dev->dev_mutex); + + v4l2_fh_del(&ctx->fh); + v4l2_fh_exit(&ctx->fh); + v4l2_m2m_ctx_release(ctx->fh.m2m_ctx); + + kfree(ctx); + + mutex_unlock(&dev->dev_mutex); + + return 0; +} + +static const struct v4l2_file_operations deinterlace_fops = { + .owner = THIS_MODULE, + .open = deinterlace_open, + .release = deinterlace_release, + .poll = v4l2_m2m_fop_poll, + .unlocked_ioctl = video_ioctl2, + .mmap = v4l2_m2m_fop_mmap, +}; + +static const struct video_device deinterlace_video_device = { + .name = DEINTERLACE_NAME, + .vfl_dir = VFL_DIR_M2M, + .fops = &deinterlace_fops, + .ioctl_ops = &deinterlace_ioctl_ops, + .minor = -1, + .release = video_device_release_empty, + .device_caps = V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING, +}; + +static const struct v4l2_m2m_ops deinterlace_m2m_ops = { + .device_run = deinterlace_device_run, + .job_ready = deinterlace_job_ready, + .job_abort = deinterlace_job_abort, +}; + +static int deinterlace_probe(struct platform_device *pdev) +{ + struct deinterlace_dev *dev; + struct video_device *vfd; + struct resource *res; + int irq, ret; + + dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); + if (!dev) + return -ENOMEM; + + dev->vfd = deinterlace_video_device; + dev->dev = &pdev->dev; + + irq = platform_get_irq(pdev, 0); + if (irq <= 0) + return irq; + + ret = devm_request_irq(dev->dev, irq, deinterlace_irq, + 0, dev_name(dev->dev), dev); + if (ret) { + dev_err(dev->dev, "Failed to request IRQ\n"); + + return ret; + } + + ret = of_dma_configure(dev->dev, dev->dev->of_node, true); + if (ret) + return ret; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + dev->base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(dev->base)) + return PTR_ERR(dev->base); + + dev->bus_clk = devm_clk_get(dev->dev, "bus"); + if (IS_ERR(dev->bus_clk)) { + dev_err(dev->dev, "Failed to get bus clock\n"); + + return PTR_ERR(dev->bus_clk); + } + + dev->mod_clk = devm_clk_get(dev->dev, "mod"); + if (IS_ERR(dev->mod_clk)) { + dev_err(dev->dev, "Failed to get mod clock\n"); + + return PTR_ERR(dev->mod_clk); + } + + dev->ram_clk = devm_clk_get(dev->dev, "ram"); + if (IS_ERR(dev->ram_clk)) { + dev_err(dev->dev, "Failed to get ram clock\n"); + + return PTR_ERR(dev->ram_clk); + } + + dev->rstc = devm_reset_control_get(dev->dev, NULL); + if (IS_ERR(dev->rstc)) { + dev_err(dev->dev, "Failed to get reset control\n"); + + return PTR_ERR(dev->rstc); + } + + mutex_init(&dev->dev_mutex); + + ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev); + if (ret) { + dev_err(dev->dev, "Failed to register V4L2 device\n"); + + return ret; + } + + vfd = &dev->vfd; + vfd->lock = &dev->dev_mutex; + vfd->v4l2_dev = &dev->v4l2_dev; + + snprintf(vfd->name, sizeof(vfd->name), "%s", + deinterlace_video_device.name); + video_set_drvdata(vfd, dev); + + ret = video_register_device(vfd, VFL_TYPE_VIDEO, 0); + if (ret) { + v4l2_err(&dev->v4l2_dev, "Failed to register video device\n"); + + goto err_v4l2; + } + + v4l2_info(&dev->v4l2_dev, + "Device registered as /dev/video%d\n", vfd->num); + + dev->m2m_dev = v4l2_m2m_init(&deinterlace_m2m_ops); + if (IS_ERR(dev->m2m_dev)) { + v4l2_err(&dev->v4l2_dev, + "Failed to initialize V4L2 M2M device\n"); + ret = PTR_ERR(dev->m2m_dev); + + goto err_video; + } + + platform_set_drvdata(pdev, dev); + + pm_runtime_enable(dev->dev); + + return 0; + +err_video: + video_unregister_device(&dev->vfd); +err_v4l2: + v4l2_device_unregister(&dev->v4l2_dev); + + return ret; +} + +static int deinterlace_remove(struct platform_device *pdev) +{ + struct deinterlace_dev *dev = platform_get_drvdata(pdev); + + v4l2_m2m_release(dev->m2m_dev); + video_unregister_device(&dev->vfd); + v4l2_device_unregister(&dev->v4l2_dev); + + pm_runtime_force_suspend(&pdev->dev); + + return 0; +} + +static int deinterlace_runtime_resume(struct device *device) +{ + struct deinterlace_dev *dev = dev_get_drvdata(device); + int ret; + + ret = clk_prepare_enable(dev->bus_clk); + if (ret) { + dev_err(dev->dev, "Failed to enable bus clock\n"); + + return ret; + } + + ret = clk_prepare_enable(dev->mod_clk); + if (ret) { + dev_err(dev->dev, "Failed to enable mod clock\n"); + + goto err_bus_clk; + } + + ret = clk_prepare_enable(dev->ram_clk); + if (ret) { + dev_err(dev->dev, "Failed to enable ram clock\n"); + + goto err_mod_clk; + } + + ret = reset_control_deassert(dev->rstc); + if (ret) { + dev_err(dev->dev, "Failed to apply reset\n"); + + goto err_ram_clk; + } + + deinterlace_init(dev); + + return 0; + +err_ram_clk: + clk_disable_unprepare(dev->ram_clk); +err_mod_clk: + clk_disable_unprepare(dev->mod_clk); +err_bus_clk: + clk_disable_unprepare(dev->bus_clk); + + return ret; +} + +static int deinterlace_runtime_suspend(struct device *device) +{ + struct deinterlace_dev *dev = dev_get_drvdata(device); + + reset_control_assert(dev->rstc); + + clk_disable_unprepare(dev->ram_clk); + clk_disable_unprepare(dev->mod_clk); + clk_disable_unprepare(dev->bus_clk); + + return 0; +} + +static const struct of_device_id deinterlace_dt_match[] = { + { .compatible = "allwinner,sun50i-h6-deinterlace" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, deinterlace_dt_match); + +static const struct dev_pm_ops deinterlace_pm_ops = { + .runtime_resume = deinterlace_runtime_resume, + .runtime_suspend = deinterlace_runtime_suspend, +}; + +static struct platform_driver deinterlace_driver = { + .probe = deinterlace_probe, + .remove = deinterlace_remove, + .driver = { + .name = DEINTERLACE_NAME, + .of_match_table = deinterlace_dt_match, + .pm = &deinterlace_pm_ops, + }, +}; +module_platform_driver(deinterlace_driver); + +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Jernej Skrabec <jernej.skrabec@siol.net>"); +MODULE_DESCRIPTION("Allwinner Deinterlace driver"); --- /dev/null +++ b/drivers/media/platform/sunxi/sun50i-di/sun50i-di.h @@ -0,0 +1,172 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Allwinner Deinterlace driver + * + * Copyright (C) 2020 Jernej Skrabec <jernej.skrabec@siol.net> + */ + +#ifndef _SUN8I_DEINTERLACE_H_ +#define _SUN8I_DEINTERLACE_H_ + +#include <media/v4l2-device.h> +#include <media/v4l2-mem2mem.h> +#include <media/videobuf2-v4l2.h> +#include <media/videobuf2-dma-contig.h> + +#include <linux/platform_device.h> + +#define DEINTERLACE_NAME "sun50i-di" + +#define DEINTERLACE_CTRL 0x00 +#define DEINTERLACE_CTRL_START BIT(0) +#define DEINTERLACE_CTRL_IOMMU_EN BIT(16) +#define DEINTERLACE_CTRL_RESET BIT(31) + +#define DEINTERLACE_INT_CTRL 0x04 +#define DEINTERLACE_INT_EN BIT(0) + +#define DEINTERLACE_STATUS 0x08 +#define DEINTERLACE_STATUS_FINISHED BIT(0) +#define DEINTERLACE_STATUS_BUSY BIT(8) + +#define DEINTERLACE_SIZE 0x10 +#define DEINTERLACE_SIZE_WIDTH(w) \ + (((w) - 1) & 0x7ff) +#define DEINTERLACE_SIZE_HEIGHT(h) \ + ((((h) - 1) & 0x7ff) << 16) + +#define DEINTERLACE_FORMAT 0x14 +#define DEINTERLACE_FORMAT_YUV420P 0 +#define DEINTERLACE_FORMAT_YUV420SP 1 +#define DEINTERLACE_FORMAT_YUV422P 2 +#define DEINTERLACE_FORMAT_YUV422SP 3 + +#define DEINTERLACE_POLAR 0x18 +#define DEINTERLACE_POLAR_FIELD(x) ((x) & 1) + +/* all pitch registers accept 16-bit values */ +#define DEINTERLACE_IN_PITCH0 0x20 +#define DEINTERLACE_IN_PITCH1 0x24 +#define DEINTERLACE_IN_PITCH2 0x28 +#define DEINTERLACE_OUT_PITCH0 0x30 +#define DEINTERLACE_OUT_PITCH1 0x34 +#define DEINTERLACE_OUT_PITCH2 0x38 +#define DEINTERLACE_FLAG_PITCH 0x40 +#define DEINTERLACE_IN0_ADDR0 0x50 +#define DEINTERLACE_IN0_ADDR1 0x54 +#define DEINTERLACE_IN0_ADDR2 0x58 +#define DEINTERLACE_IN0_ADDRH 0x5c +#define DEINTERLACE_IN1_ADDR0 0x60 +#define DEINTERLACE_IN1_ADDR1 0x64 +#define DEINTERLACE_IN1_ADDR2 0x68 +#define DEINTERLACE_IN1_ADDRH 0x6c +#define DEINTERLACE_IN2_ADDR0 0x70 +#define DEINTERLACE_IN2_ADDR1 0x74 +#define DEINTERLACE_IN2_ADDR2 0x78 +#define DEINTERLACE_IN2_ADDRH 0x7c +#define DEINTERLACE_IN3_ADDR0 0x80 +#define DEINTERLACE_IN3_ADDR1 0x84 +#define DEINTERLACE_IN3_ADDR2 0x88 +#define DEINTERLACE_IN3_ADDRH 0x8c +#define DEINTERLACE_OUT_ADDR0 0x90 +#define DEINTERLACE_OUT_ADDR1 0x94 +#define DEINTERLACE_OUT_ADDR2 0x98 +#define DEINTERLACE_OUT_ADDRH 0x9c +#define DEINTERLACE_IN_FLAG_ADDR 0xa0 +#define DEINTERLACE_OUT_FLAG_ADDR 0xa4 +#define DEINTERLACE_FLAG_ADDRH 0xa8 + +#define DEINTERLACE_ADDRH0(x) ((x) & 0xff) +#define DEINTERLACE_ADDRH1(x) (((x) & 0xff) << 8) +#define DEINTERLACE_ADDRH2(x) (((x) & 0xff) << 16) + +#define DEINTERLACE_MODE 0xb0 +#define DEINTERLACE_MODE_DEINT_LUMA BIT(0) +#define DEINTERLACE_MODE_MOTION_EN BIT(4) +#define DEINTERLACE_MODE_INTP_EN BIT(5) +#define DEINTERLACE_MODE_AUTO_UPD_MODE(x) (((x) & 3) << 12) +#define DEINTERLACE_MODE_DEINT_CHROMA BIT(16) +#define DEINTERLACE_MODE_FIELD_MODE BIT(31) + +#define DEINTERLACE_MD_PARAM0 0xb4 +#define DEINTERLACE_MD_PARAM0_MIN_LUMA_TH(x) ((x) & 0xff) +#define DEINTERLACE_MD_PARAM0_MAX_LUMA_TH(x) (((x) & 0xff) << 8) +#define DEINTERLACE_MD_PARAM0_AVG_LUMA_SHIFT(x) (((x) & 0xf) << 16) +#define DEINTERLACE_MD_PARAM0_TH_SHIFT(x) (((x) & 0xf) << 24) + +#define DEINTERLACE_MD_PARAM1 0xb8 +#define DEINTERLACE_MD_PARAM1_MOV_FAC_NONEDGE(x) (((x) & 0x3) << 28) + +#define DEINTERLACE_MD_PARAM2 0xbc +#define DEINTERLACE_MD_PARAM2_CHROMA_SPATIAL_TH(x) (((x) & 0xff) << 8) +#define DEINTERLACE_MD_PARAM2_CHROMA_DIFF_TH(x) (((x) & 0xff) << 16) +#define DEINTERLACE_MD_PARAM2_PIX_STATIC_TH(x) (((x) & 0x3) << 28) + +#define DEINTERLACE_INTP_PARAM0 0xc0 +#define DEINTERLACE_INTP_PARAM0_ANGLE_LIMIT(x) ((x) & 0x1f) +#define DEINTERLACE_INTP_PARAM0_ANGLE_CONST_TH(x) (((x) & 7) << 8) +#define DEINTERLACE_INTP_PARAM0_LUMA_CUR_FAC_MODE(x) (((x) & 7) << 16) +#define DEINTERLACE_INTP_PARAM0_LUMA_CUR_FAC_MODE_MSK (7 << 16) +#define DEINTERLACE_INTP_PARAM0_CHROMA_CUR_FAC_MODE(x) (((x) & 7) << 20) +#define DEINTERLACE_INTP_PARAM0_CHROMA_CUR_FAC_MODE_MSK (7 << 20) + +#define DEINTERLACE_MD_CH_PARAM 0xc4 +#define DEINTERLACE_MD_CH_PARAM_BLEND_MODE(x) ((x) & 0xf) +#define DEINTERLACE_MD_CH_PARAM_FONT_PRO_EN BIT(8) +#define DEINTERLACE_MD_CH_PARAM_FONT_PRO_TH(x) (((x) & 0xff) << 16) +#define DEINTERLACE_MD_CH_PARAM_FONT_PRO_FAC(x) (((x) & 0x1f) << 24) + +#define DEINTERLACE_INTP_PARAM1 0xc8 +#define DEINTERLACE_INTP_PARAM1_A(x) ((x) & 7) +#define DEINTERLACE_INTP_PARAM1_EN BIT(3) +#define DEINTERLACE_INTP_PARAM1_C(x) (((x) & 0xf) << 4) +#define DEINTERLACE_INTP_PARAM1_CMAX(x) (((x) & 0xff) << 8) +#define DEINTERLACE_INTP_PARAM1_MAXRAT(x) (((x) & 3) << 16) + +#define DEINTERLACE_OUT_PATH 0x200 + +#define DEINTERLACE_MIN_WIDTH 2U +#define DEINTERLACE_MIN_HEIGHT 2U +#define DEINTERLACE_MAX_WIDTH 2048U +#define DEINTERLACE_MAX_HEIGHT 1100U + +struct deinterlace_ctx { + struct v4l2_fh fh; + struct deinterlace_dev *dev; + + struct v4l2_pix_format src_fmt; + struct v4l2_pix_format dst_fmt; + + void *flag1_buf; + dma_addr_t flag1_buf_dma; + + void *flag2_buf; + dma_addr_t flag2_buf_dma; + + struct vb2_v4l2_buffer *prev[2]; + + unsigned int first_field; + unsigned int field; + + int aborting; +}; + +struct deinterlace_dev { + struct v4l2_device v4l2_dev; + struct video_device vfd; + struct device *dev; + struct v4l2_m2m_dev *m2m_dev; + + /* Device file mutex */ + struct mutex dev_mutex; + + void __iomem *base; + + struct clk *bus_clk; + struct clk *mod_clk; + struct clk *ram_clk; + + struct reset_control *rstc; +}; + +#endif --- a/drivers/media/platform/sunxi/Kconfig 2022-04-17 20:57:31.000000000 +0000 +++ b/drivers/media/platform/sunxi/Kconfig 2022-04-23 13:22:19.652398021 +0000 @@ -5,4 +5,5 @@ source "drivers/media/platform/sunxi/sun4i-csi/Kconfig" source "drivers/media/platform/sunxi/sun6i-csi/Kconfig" source "drivers/media/platform/sunxi/sun8i-di/Kconfig" +source "drivers/media/platform/sunxi/sun50i-di/Kconfig" source "drivers/media/platform/sunxi/sun8i-rotate/Kconfig" ================================================ FILE: projects/Allwinner/patches/linux/0031-arm64-dts-h6-deinterlace.patch ================================================ From c009b3b707bbde30fa6ff49ca3075160524ea7b9 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Tue, 26 May 2020 20:08:27 +0200 Subject: [PATCH 41/44] arm64: dts: h6 deinterlace Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 11 +++++++++++ 1 file changed, 11 insertions(+) --- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi @@ -160,6 +160,18 @@ }; }; + deinterlace: deinterlace@1420000 { + compatible = "allwinner,sun50i-h6-deinterlace"; + reg = <0x01420000 0x2000>; + clocks = <&ccu CLK_BUS_DEINTERLACE>, + <&ccu CLK_DEINTERLACE>, + <&ccu CLK_MBUS_DEINTERLACE>; + clock-names = "bus", "mod", "ram"; + resets = <&ccu RST_BUS_DEINTERLACE>; + interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>; + iommus = <&iommu 2>; + }; + video-codec@1c0e000 { compatible = "allwinner,sun50i-h6-video-engine"; reg = <0x01c0e000 0x2000>; ================================================ FILE: projects/Allwinner/patches/linux/0033-WIP-I2S-multi-channel.patch ================================================ From a19b428a02224e0e01fff4738bbf0632942d18a1 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Fri, 15 Jan 2021 00:13:54 +0100 Subject: [PATCH 43/44] WIP: I2S multi channel Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- sound/soc/sunxi/sun4i-i2s.c | 137 +++++++++++++++++++++++++----------- 1 file changed, 97 insertions(+), 40 deletions(-) --- a/sound/soc/sunxi/sun4i-i2s.c +++ b/sound/soc/sunxi/sun4i-i2s.c @@ -23,7 +23,7 @@ #define SUN4I_I2S_CTRL_REG 0x00 #define SUN4I_I2S_CTRL_SDO_EN_MASK GENMASK(11, 8) -#define SUN4I_I2S_CTRL_SDO_EN(sdo) BIT(8 + (sdo)) +#define SUN4I_I2S_CTRL_SDO_EN(lines) (((1 << (lines)) - 1) << 8) #define SUN4I_I2S_CTRL_MODE_MASK BIT(5) #define SUN4I_I2S_CTRL_MODE_SLAVE (1 << 5) #define SUN4I_I2S_CTRL_MODE_MASTER (0 << 5) @@ -120,8 +120,8 @@ #define SUN8I_I2S_CHAN_CFG_TX_SLOT_NUM_MASK GENMASK(3, 0) #define SUN8I_I2S_CHAN_CFG_TX_SLOT_NUM(chan) ((chan) - 1) -#define SUN8I_I2S_TX_CHAN_MAP_REG 0x44 -#define SUN8I_I2S_TX_CHAN_SEL_REG 0x34 +#define SUN8I_I2S_TX_CHAN_MAP_REG(i) (0x44 + 4 * (i)) +#define SUN8I_I2S_TX_CHAN_SEL_REG(i) (0x34 + 4 * (i)) #define SUN8I_I2S_TX_CHAN_OFFSET_MASK GENMASK(13, 12) #define SUN8I_I2S_TX_CHAN_OFFSET(offset) ((offset) << 12) #define SUN8I_I2S_TX_CHAN_EN_MASK GENMASK(11, 4) @@ -198,7 +198,7 @@ struct sun4i_i2s_quirks { * @slots: channels per frame + padding slots, regardless of format * @slot_width: bits per sample + padding bits, regardless of format */ - int (*set_chan_cfg)(const struct sun4i_i2s *i2s, + int (*set_chan_cfg)(struct sun4i_i2s *i2s, unsigned int channels, unsigned int slots, unsigned int slot_width); int (*set_fmt)(const struct sun4i_i2s *i2s, unsigned int fmt); @@ -214,6 +214,7 @@ struct sun4i_i2s { unsigned int mclk_freq; unsigned int slots; unsigned int slot_width; + unsigned int lines; struct snd_dmaengine_dai_dma_data capture_dma_data; struct snd_dmaengine_dai_dma_data playback_dma_data; @@ -454,7 +455,7 @@ static int sun8i_i2s_get_sr_wss(unsigned return -EINVAL; } -static int sun4i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s, +static int sun4i_i2s_set_chan_cfg(struct sun4i_i2s *i2s, unsigned int channels, unsigned int slots, unsigned int slot_width) { @@ -473,20 +474,42 @@ static int sun4i_i2s_set_chan_cfg(const return 0; } -static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s, +static int sun8i_i2s_set_chan_cfg(struct sun4i_i2s *i2s, unsigned int channels, unsigned int slots, unsigned int slot_width) { - unsigned int lrck_period; + unsigned int lrck_period, val; + int i; + + i2s->lines = (channels + 1) / 2; + + /* Enable the required output lines */ + regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, + SUN4I_I2S_CTRL_SDO_EN_MASK, + SUN4I_I2S_CTRL_SDO_EN(i2s->lines)); /* Map the channels for playback and capture */ - regmap_write(i2s->regmap, SUN8I_I2S_TX_CHAN_MAP_REG, 0x76543210); + regmap_write(i2s->regmap, SUN8I_I2S_TX_CHAN_MAP_REG(0), 0x76543210); + regmap_write(i2s->regmap, SUN8I_I2S_TX_CHAN_MAP_REG(1), 0x32); + regmap_write(i2s->regmap, SUN8I_I2S_TX_CHAN_MAP_REG(2), 0x54); + regmap_write(i2s->regmap, SUN8I_I2S_TX_CHAN_MAP_REG(3), 0x76); regmap_write(i2s->regmap, SUN8I_I2S_RX_CHAN_MAP_REG, 0x76543210); /* Configure the channels */ - regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG, - SUN4I_I2S_CHAN_SEL_MASK, - SUN4I_I2S_CHAN_SEL(channels)); + for (i = 0; i < 4; i++) { + if (channels <= i * 2) + val = 0; + else if (channels == i * 2 + 1) + val = 1; + else + val = 2; + regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG(i), + SUN4I_I2S_CHAN_SEL_MASK | + SUN8I_I2S_TX_CHAN_EN_MASK, + SUN4I_I2S_CHAN_SEL(val) | + SUN8I_I2S_TX_CHAN_EN(val)); + } + regmap_update_bits(i2s->regmap, SUN8I_I2S_RX_CHAN_SEL_REG, SUN4I_I2S_CHAN_SEL_MASK, SUN4I_I2S_CHAN_SEL(channels)); @@ -518,36 +541,54 @@ static int sun8i_i2s_set_chan_cfg(const SUN8I_I2S_FMT0_LRCK_PERIOD_MASK, SUN8I_I2S_FMT0_LRCK_PERIOD(lrck_period)); - regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG, - SUN8I_I2S_TX_CHAN_EN_MASK, - SUN8I_I2S_TX_CHAN_EN(channels)); - return 0; } -static int sun50i_h6_i2s_set_chan_cfg(const struct sun4i_i2s *i2s, +static int sun50i_h6_i2s_set_chan_cfg(struct sun4i_i2s *i2s, unsigned int channels, unsigned int slots, unsigned int slot_width) { - unsigned int lrck_period; + unsigned int lrck_period, val; + int i; + + i2s->lines = (channels + 1) / 2; + + /* Enable the required output lines */ + regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, + SUN4I_I2S_CTRL_SDO_EN_MASK, + SUN4I_I2S_CTRL_SDO_EN(i2s->lines)); /* Map the channels for playback and capture */ regmap_write(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_MAP0_REG(0), 0xFEDCBA98); regmap_write(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_MAP1_REG(0), 0x76543210); + regmap_write(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_MAP1_REG(1), 0x32); + regmap_write(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_MAP1_REG(2), 0x54); + regmap_write(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_MAP1_REG(3), 0x76); if (i2s->variant->num_din_pins > 1) { regmap_write(i2s->regmap, SUN50I_R329_I2S_RX_CHAN_MAP0_REG, 0x0F0E0D0C); regmap_write(i2s->regmap, SUN50I_R329_I2S_RX_CHAN_MAP1_REG, 0x0B0A0908); regmap_write(i2s->regmap, SUN50I_R329_I2S_RX_CHAN_MAP2_REG, 0x07060504); regmap_write(i2s->regmap, SUN50I_R329_I2S_RX_CHAN_MAP3_REG, 0x03020100); } else { regmap_write(i2s->regmap, SUN50I_H6_I2S_RX_CHAN_MAP0_REG, 0xFEDCBA98); regmap_write(i2s->regmap, SUN50I_H6_I2S_RX_CHAN_MAP1_REG, 0x76543210); } /* Configure the channels */ - regmap_update_bits(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_SEL_REG(0), - SUN50I_H6_I2S_TX_CHAN_SEL_MASK, - SUN50I_H6_I2S_TX_CHAN_SEL(channels)); + for (i = 0; i < 4; i++) { + if (channels <= i * 2) + val = 0; + else if (channels == i * 2 + 1) + val = 1; + else + val = 2; + regmap_update_bits(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_SEL_REG(i), + SUN50I_H6_I2S_TX_CHAN_SEL_MASK | + SUN50I_H6_I2S_TX_CHAN_EN_MASK, + SUN50I_H6_I2S_TX_CHAN_SEL(val) | + SUN50I_H6_I2S_TX_CHAN_EN(val)); + } + regmap_update_bits(i2s->regmap, SUN50I_H6_I2S_RX_CHAN_SEL_REG, SUN50I_H6_I2S_TX_CHAN_SEL_MASK, SUN50I_H6_I2S_TX_CHAN_SEL(channels)); @@ -579,10 +620,6 @@ static int sun50i_h6_i2s_set_chan_cfg(co SUN8I_I2S_FMT0_LRCK_PERIOD_MASK, SUN8I_I2S_FMT0_LRCK_PERIOD(lrck_period)); - regmap_update_bits(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_SEL_REG(0), - SUN50I_H6_I2S_TX_CHAN_EN_MASK, - SUN50I_H6_I2S_TX_CHAN_EN(channels)); - return 0; } @@ -727,6 +764,7 @@ static int sun8i_i2s_set_soc_fmt(const s { u32 mode, val; u8 offset; + int i; /* * DAI clock polarity @@ -794,9 +832,10 @@ static int sun8i_i2s_set_soc_fmt(const s regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, SUN8I_I2S_CTRL_MODE_MASK, mode); - regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG, - SUN8I_I2S_TX_CHAN_OFFSET_MASK, - SUN8I_I2S_TX_CHAN_OFFSET(offset)); + for (i = 0; i < 4; i++) + regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG(i), + SUN8I_I2S_TX_CHAN_OFFSET_MASK, + SUN8I_I2S_TX_CHAN_OFFSET(offset)); regmap_update_bits(i2s->regmap, SUN8I_I2S_RX_CHAN_SEL_REG, SUN8I_I2S_TX_CHAN_OFFSET_MASK, SUN8I_I2S_TX_CHAN_OFFSET(offset)); @@ -834,6 +873,7 @@ static int sun50i_h6_i2s_set_soc_fmt(con { u32 mode, val; u8 offset; + int i; /* * DAI clock polarity @@ -901,9 +941,10 @@ static int sun50i_h6_i2s_set_soc_fmt(con regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, SUN8I_I2S_CTRL_MODE_MASK, mode); - regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG, - SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET_MASK, - SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET(offset)); + for (i = 0; i < 4; i++) + regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG(i), + SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET_MASK, + SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET(offset)); regmap_update_bits(i2s->regmap, SUN50I_H6_I2S_RX_CHAN_SEL_REG, SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET_MASK, SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET(offset)); @@ -1212,8 +1253,14 @@ static const struct reg_default sun8i_i2 { SUN4I_I2S_DMA_INT_CTRL_REG, 0x00000000 }, { SUN4I_I2S_CLK_DIV_REG, 0x00000000 }, { SUN8I_I2S_CHAN_CFG_REG, 0x00000000 }, - { SUN8I_I2S_TX_CHAN_SEL_REG, 0x00000000 }, - { SUN8I_I2S_TX_CHAN_MAP_REG, 0x00000000 }, + { SUN8I_I2S_TX_CHAN_SEL_REG(0), 0x00000000 }, + { SUN8I_I2S_TX_CHAN_SEL_REG(1), 0x00000000 }, + { SUN8I_I2S_TX_CHAN_SEL_REG(2), 0x00000000 }, + { SUN8I_I2S_TX_CHAN_SEL_REG(3), 0x00000000 }, + { SUN8I_I2S_TX_CHAN_MAP_REG(0), 0x00000000 }, + { SUN8I_I2S_TX_CHAN_MAP_REG(1), 0x00000000 }, + { SUN8I_I2S_TX_CHAN_MAP_REG(2), 0x00000000 }, + { SUN8I_I2S_TX_CHAN_MAP_REG(3), 0x00000000 }, { SUN8I_I2S_RX_CHAN_SEL_REG, 0x00000000 }, { SUN8I_I2S_RX_CHAN_MAP_REG, 0x00000000 }, }; @@ -1227,8 +1274,17 @@ static const struct reg_default sun50i_h { SUN4I_I2S_CLK_DIV_REG, 0x00000000 }, { SUN8I_I2S_CHAN_CFG_REG, 0x00000000 }, { SUN50I_H6_I2S_TX_CHAN_SEL_REG(0), 0x00000000 }, + { SUN50I_H6_I2S_TX_CHAN_SEL_REG(1), 0x00000000 }, + { SUN50I_H6_I2S_TX_CHAN_SEL_REG(2), 0x00000000 }, + { SUN50I_H6_I2S_TX_CHAN_SEL_REG(3), 0x00000000 }, { SUN50I_H6_I2S_TX_CHAN_MAP0_REG(0), 0x00000000 }, { SUN50I_H6_I2S_TX_CHAN_MAP1_REG(0), 0x00000000 }, + { SUN50I_H6_I2S_TX_CHAN_MAP0_REG(1), 0x00000000 }, + { SUN50I_H6_I2S_TX_CHAN_MAP1_REG(1), 0x00000000 }, + { SUN50I_H6_I2S_TX_CHAN_MAP0_REG(2), 0x00000000 }, + { SUN50I_H6_I2S_TX_CHAN_MAP1_REG(2), 0x00000000 }, + { SUN50I_H6_I2S_TX_CHAN_MAP0_REG(3), 0x00000000 }, + { SUN50I_H6_I2S_TX_CHAN_MAP1_REG(3), 0x00000000 }, { SUN50I_H6_I2S_RX_CHAN_SEL_REG, 0x00000000 }, { SUN50I_H6_I2S_RX_CHAN_MAP0_REG, 0x00000000 }, { SUN50I_H6_I2S_RX_CHAN_MAP1_REG, 0x00000000 }, @@ -1301,7 +1357,7 @@ static int sun4i_i2s_runtime_resume(stru /* Enable the first output line */ regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, SUN4I_I2S_CTRL_SDO_EN_MASK, - SUN4I_I2S_CTRL_SDO_EN(0)); + SUN4I_I2S_CTRL_SDO_EN(i2s->lines)); ret = clk_prepare_enable(i2s->mod_clk); if (ret) { @@ -1562,6 +1618,7 @@ static int sun4i_i2s_probe(struct platfo i2s->capture_dma_data.addr = res->start + SUN4I_I2S_FIFO_RX_REG; i2s->capture_dma_data.maxburst = 8; + i2s->lines = 1; pm_runtime_enable(&pdev->dev); if (!pm_runtime_enabled(&pdev->dev)) { ================================================ FILE: projects/Allwinner/patches/linux/0034-HACK-h3-h5-Add-HDMI-sound-card.patch ================================================ From d0428e1d4b2a1a3d640f6052646e0f8ca7fc2d53 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Sat, 16 Jan 2021 10:57:58 +0100 Subject: [PATCH 44/44] HACK: h3/h5: Add HDMI sound card Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- arch/arm/boot/dts/sunxi-h3-h5.dtsi | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) --- a/arch/arm/boot/dts/sunxi-h3-h5.dtsi +++ b/arch/arm/boot/dts/sunxi-h3-h5.dtsi @@ -77,6 +77,24 @@ }; }; + sound_hdmi: sound { + compatible = "simple-audio-card"; + simple-audio-card,format = "i2s"; + simple-audio-card,name = "allwinner-hdmi"; + simple-audio-card,mclk-fs = <128>; + simple-audio-card,frame-inversion; + + simple-audio-card,codec { + sound-dai = <&hdmi>; + }; + + simple-audio-card,cpu { + sound-dai = <&i2s2>; + dai-tdm-slot-num = <2>; + dai-tdm-slot-width = <32>; + }; + }; + clocks { #address-cells = <1>; #size-cells = <1>; @@ -678,10 +696,9 @@ interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; clocks = <&ccu CLK_BUS_I2S2>, <&ccu CLK_I2S2>; clock-names = "apb", "mod"; - dmas = <&dma 27>; + dmas = <&dma 27>, <&dma 27>; resets = <&ccu RST_BUS_I2S2>; - dma-names = "tx"; - status = "disabled"; + dma-names = "rx", "tx"; }; codec: codec@1c22c00 { @@ -815,6 +832,7 @@ }; hdmi: hdmi@1ee0000 { + #sound-dai-cells = <0>; compatible = "allwinner,sun8i-h3-dw-hdmi", "allwinner,sun8i-a83t-dw-hdmi"; reg = <0x01ee0000 0x10000>; ================================================ FILE: projects/Allwinner/patches/linux/0036-wip-h3-h5-cvbs.patch ================================================ From 24545292c40900c0871381b8697ade70aa9e3bdf Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Wed, 20 Jan 2021 22:15:36 +0100 Subject: [PATCH] wip h3/h5 cvbs --- arch/arm/boot/dts/sun8i-h3.dtsi | 22 +++++ arch/arm/boot/dts/sunxi-h3-h5.dtsi | 95 +++++++++++++++++++- arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi | 22 +++++ drivers/clk/sunxi-ng/ccu-sun8i-h3.c | 14 ++- drivers/gpu/drm/sun4i/Makefile | 2 +- drivers/gpu/drm/sun4i/sun4i_tv.c | 35 +++++++- drivers/gpu/drm/sun4i/sun8i_mixer.c | 44 ++++++++- drivers/gpu/drm/sun4i/sun8i_mixer.h | 5 +- 8 files changed, 227 insertions(+), 12 deletions(-) diff --git a/arch/arm/boot/dts/sun8i-h3.dtsi b/arch/arm/boot/dts/sun8i-h3.dtsi index 448dd325f8c3..d896dc5502f5 100644 --- a/arch/arm/boot/dts/sun8i-h3.dtsi +++ b/arch/arm/boot/dts/sun8i-h3.dtsi @@ -252,6 +252,20 @@ ths: thermal-sensor@1c25000 { nvmem-cell-names = "calibration"; #thermal-sensor-cells = <0>; }; + + tve: tv-encoder@1e00000 { + compatible = "allwinner,sun8i-h3-tv-encoder"; + reg = <0x01e00000 0x1000>; + clocks = <&ccu CLK_BUS_TVE>; + resets = <&ccu RST_BUS_TVE>; + status = "disabled"; + + port { + tve_in_tcon1: endpoint { + remote-endpoint = <&tcon1_out_tve>; + }; + }; + }; }; thermal-zones { @@ -299,6 +313,10 @@ &mbus { compatible = "allwinner,sun8i-h3-mbus"; }; +&mixer1 { + resets = <&display_clocks RST_WB>; +}; + &mmc0 { compatible = "allwinner,sun7i-a20-mmc"; clocks = <&ccu CLK_BUS_MMC0>, @@ -346,3 +364,7 @@ &rtc { &sid { compatible = "allwinner,sun8i-h3-sid"; }; + +&tcon1_out_tve { + remote-endpoint = <&tve_in_tcon1>; +}; diff --git a/arch/arm/boot/dts/sunxi-h3-h5.dtsi b/arch/arm/boot/dts/sunxi-h3-h5.dtsi index 3d37a6a586b6..152029413784 100644 --- a/arch/arm/boot/dts/sunxi-h3-h5.dtsi +++ b/arch/arm/boot/dts/sunxi-h3-h5.dtsi @@ -119,7 +119,7 @@ osc32k: osc32k_clk { de: display-engine { compatible = "allwinner,sun8i-h3-display-engine"; - allwinner,pipelines = <&mixer0>; + allwinner,pipelines = <&mixer0>, <&mixer1>; status = "disabled"; }; @@ -163,11 +163,50 @@ ports { #size-cells = <0>; mixer0_out: port@1 { + #address-cells = <1>; + #size-cells = <0>; reg = <1>; - mixer0_out_tcon0: endpoint { + mixer0_out_tcon0: endpoint@0 { + reg = <0>; remote-endpoint = <&tcon0_in_mixer0>; }; + + mixer0_out_tcon1: endpoint@1 { + reg = <1>; + remote-endpoint = <&tcon1_in_mixer0>; + }; + }; + }; + }; + + mixer1: mixer@1200000 { + compatible = "allwinner,sun8i-h3-de2-mixer-1"; + reg = <0x01200000 0x100000>; + clocks = <&display_clocks CLK_BUS_MIXER1>, + <&display_clocks CLK_MIXER1>; + clock-names = "bus", + "mod"; + /* reset is added by SoC dtsi */ + + ports { + #address-cells = <1>; + #size-cells = <0>; + + mixer1_out: port@1 { + #address-cells = <1>; + #size-cells = <0>; + reg = <1>; + + mixer1_out_tcon0: endpoint@0 { + reg = <0>; + remote-endpoint = <&tcon0_in_mixer1>; + }; + + mixer1_out_tcon1: endpoint@1 { + reg = <1>; + remote-endpoint = <&tcon1_in_mixer1>; + }; }; }; }; @@ -196,11 +235,19 @@ ports { #size-cells = <0>; tcon0_in: port@0 { + #address-cells = <1>; + #size-cells = <0>; reg = <0>; - tcon0_in_mixer0: endpoint { + tcon0_in_mixer0: endpoint@0 { + reg = <0>; remote-endpoint = <&mixer0_out_tcon0>; }; + + tcon0_in_mixer1: endpoint@1 { + reg = <1>; + remote-endpoint = <&mixer1_out_tcon0>; + }; }; tcon0_out: port@1 { @@ -216,6 +263,48 @@ tcon0_out_hdmi: endpoint@1 { }; }; + tcon1: lcd-controller@1c0d000 { + compatible = "allwinner,sun8i-h3-tcon-tv", + "allwinner,sun8i-a83t-tcon-tv"; + reg = <0x01c0d000 0x1000>; + interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&ccu CLK_BUS_TCON1>, <&ccu CLK_TVE>; + clock-names = "ahb", "tcon-ch1"; + resets = <&ccu RST_BUS_TCON1>; + reset-names = "lcd"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + tcon1_in: port@0 { + #address-cells = <1>; + #size-cells = <0>; + reg = <0>; + + tcon1_in_mixer0: endpoint@0 { + reg = <0>; + remote-endpoint = <&mixer0_out_tcon1>; + }; + + tcon1_in_mixer1: endpoint@1 { + reg = <1>; + remote-endpoint = <&mixer1_out_tcon1>; + }; + }; + + tcon1_out: port@1 { + #address-cells = <1>; + #size-cells = <0>; + reg = <1>; + + tcon1_out_tve: endpoint@1 { + reg = <1>; + }; + }; + }; + }; + mmc0: mmc@1c0f000 { /* compatible and clocks are in per SoC .dtsi file */ reg = <0x01c0f000 0x1000>; diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi index 4f00ae227cce..d30c85948ac5 100644 --- a/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi +++ b/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi @@ -197,6 +197,20 @@ ths: thermal-sensor@1c25000 { nvmem-cell-names = "calibration"; #thermal-sensor-cells = <1>; }; + + tve: tv-encoder@1e40000 { + compatible = "allwinner,sun50i-h5-tv-encoder"; + reg = <0x01e40000 0x1000>; + clocks = <&ccu CLK_BUS_TVE>; + resets = <&ccu RST_BUS_TVE>; + status = "disabled"; + + port { + tve_in_tcon1: endpoint { + remote-endpoint = <&tcon1_out_tve>; + }; + }; + }; }; thermal-zones { @@ -250,6 +264,10 @@ &mbus { compatible = "allwinner,sun50i-h5-mbus"; }; +&mixer1 { + resets = <&display_clocks RST_MIXER1>; +}; + &mmc0 { compatible = "allwinner,sun50i-h5-mmc", "allwinner,sun50i-a64-mmc"; @@ -285,3 +303,7 @@ &rtc { &sid { compatible = "allwinner,sun50i-h5-sid"; }; + +&tcon1_out_tve { + remote-endpoint = <&tve_in_tcon1>; +}; diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-h3.c b/drivers/clk/sunxi-ng/ccu-sun8i-h3.c index e058cf691aea..0b0df6d6bc9c 100644 --- a/drivers/clk/sunxi-ng/ccu-sun8i-h3.c +++ b/drivers/clk/sunxi-ng/ccu-sun8i-h3.c @@ -458,8 +458,18 @@ static SUNXI_CCU_M_WITH_MUX_GATE(tcon_clk, "tcon", tcon_parents, CLK_SET_RATE_PARENT); static const char * const tve_parents[] = { "pll-de", "pll-periph1" }; -static SUNXI_CCU_M_WITH_MUX_GATE(tve_clk, "tve", tve_parents, - 0x120, 0, 4, 24, 3, BIT(31), 0); +struct ccu_div tve_clk = { + .enable = BIT(31), + .div = _SUNXI_CCU_DIV(0, 4), + .mux = _SUNXI_CCU_MUX(24, 3), + .fixed_post_div = 16, + .common = { + .reg = 0x120, + .features = CCU_FEATURE_FIXED_POSTDIV, + .hw.init = CLK_HW_INIT_PARENTS("tve", tve_parents, + &ccu_div_ops, 0), + }, +}; static const char * const deinterlace_parents[] = { "pll-periph0", "pll-periph1" }; static SUNXI_CCU_M_WITH_MUX_GATE(deinterlace_clk, "deinterlace", deinterlace_parents, diff --git a/drivers/gpu/drm/sun4i/Makefile b/drivers/gpu/drm/sun4i/Makefile index 0d04f2447b01..7b151994e904 100644 --- a/drivers/gpu/drm/sun4i/Makefile +++ b/drivers/gpu/drm/sun4i/Makefile @@ -16,7 +16,7 @@ sun8i-drm-hdmi-y += sun8i_hdmi_phy_clk.o sun8i-mixer-y += sun8i_mixer.o sun8i_ui_layer.o \ sun8i_vi_layer.o sun8i_ui_scaler.o \ - sun8i_vi_scaler.o sun8i_csc.o + sun8i_vi_scaler.o sun8i_csc.o sun4i_tv.o sun4i-tcon-y += sun4i_crtc.o sun4i-tcon-y += sun4i_dotclock.o diff --git a/drivers/gpu/drm/sun4i/sun4i_tv.c b/drivers/gpu/drm/sun4i/sun4i_tv.c index 94883abe0dfd..9c7090a0d52a 100644 --- a/drivers/gpu/drm/sun4i/sun4i_tv.c +++ b/drivers/gpu/drm/sun4i/sun4i_tv.c @@ -10,6 +10,7 @@ #include <linux/component.h> #include <linux/module.h> #include <linux/of_address.h> +#include <linux/of_device.h> #include <linux/platform_device.h> #include <linux/regmap.h> #include <linux/reset.h> @@ -167,6 +168,11 @@ struct tv_mode { const struct resync_parameters *resync_params; }; +struct sun4i_tv_quirks { + unsigned int calibration; + unsigned int unknown : 1; +}; + struct sun4i_tv { struct drm_connector connector; struct drm_encoder encoder; @@ -527,7 +533,7 @@ static const struct regmap_config sun4i_tv_regmap_config = { .reg_bits = 32, .val_bits = 32, .reg_stride = 4, - .max_register = SUN4I_TVE_WSS_DATA2_REG, + .max_register = 0x400, .name = "tv-encoder", }; @@ -537,13 +543,19 @@ static int sun4i_tv_bind(struct device *dev, struct device *master, struct platform_device *pdev = to_platform_device(dev); struct drm_device *drm = data; struct sun4i_drv *drv = drm->dev_private; + const struct sun4i_tv_quirks *quirks; struct sun4i_tv *tv; void __iomem *regs; int ret; + quirks = of_device_get_match_data(dev); + if (!quirks) + return -EINVAL; + tv = devm_kzalloc(dev, sizeof(*tv), GFP_KERNEL); if (!tv) return -ENOMEM; + tv->drv = drv; dev_set_drvdata(dev, tv); @@ -580,6 +592,11 @@ static int sun4i_tv_bind(struct device *dev, struct device *master, } clk_prepare_enable(tv->clk); + if (quirks->calibration) + regmap_write(tv->regs, 0x304, quirks->calibration); + if (quirks->unknown) + regmap_write(tv->regs, 0x30c, 0x00101110); + drm_encoder_helper_add(&tv->encoder, &sun4i_tv_helper_funcs); ret = drm_simple_encoder_init(drm, &tv->encoder, @@ -648,8 +665,22 @@ static int sun4i_tv_remove(struct platform_device *pdev) return 0; } +static const struct sun4i_tv_quirks a10_quirks = { +}; + +static const struct sun4i_tv_quirks h3_quirks = { + .calibration = 0x02000c00, +}; + +static const struct sun4i_tv_quirks h5_quirks = { + .calibration = 0x02850000, + .unknown = 1, +}; + static const struct of_device_id sun4i_tv_of_table[] = { - { .compatible = "allwinner,sun4i-a10-tv-encoder" }, + { .compatible = "allwinner,sun4i-a10-tv-encoder", .data = &a10_quirks }, + { .compatible = "allwinner,sun8i-h3-tv-encoder", .data = &h3_quirks }, + { .compatible = "allwinner,sun50i-h5-tv-encoder", .data = &h5_quirks }, { } }; MODULE_DEVICE_TABLE(of, sun4i_tv_of_table); diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.c b/drivers/gpu/drm/sun4i/sun8i_mixer.c index f5291170bf5e..490e8e74450f 100644 --- a/drivers/gpu/drm/sun4i/sun8i_mixer.c +++ b/drivers/gpu/drm/sun4i/sun8i_mixer.c @@ -32,6 +32,12 @@ struct de2_fmt_info { u32 de2_fmt; }; +static const u32 sun8i_rgb2yuv_coef[12] = { + 0x00000107, 0x00000204, 0x00000064, 0x00004200, + 0x00001f68, 0x00001ed6, 0x000001c2, 0x00020200, + 0x000001c2, 0x00001e87, 0x00001fb7, 0x00020200, +}; + static const struct de2_fmt_info de2_formats[] = { { .drm_fmt = DRM_FORMAT_ARGB8888, @@ -327,10 +333,29 @@ static void sun8i_mixer_mode_set(struct sunxi_engine *engine, interlaced ? "on" : "off"); } +static void sun8i_mixer_apply_color_correction(struct sunxi_engine *engine) +{ + DRM_DEBUG_DRIVER("Applying RGB to YUV color correction\n"); + + regmap_bulk_write(engine->regs, SUN8I_MIXER_DCSC_COEF_REG(0), + sun8i_rgb2yuv_coef, 12); + regmap_write(engine->regs, SUN8I_MIXER_DCSC_EN, 1); +} + +static void sun8i_mixer_disable_color_correction(struct sunxi_engine *engine) +{ + DRM_DEBUG_DRIVER("Disabling color correction\n"); + + /* Disable color correction */ + regmap_write(engine->regs, SUN8I_MIXER_DCSC_EN, 0); +} + static const struct sunxi_engine_ops sun8i_engine_ops = { - .commit = sun8i_mixer_commit, - .layers_init = sun8i_layers_init, - .mode_set = sun8i_mixer_mode_set, + .commit = sun8i_mixer_commit, + .layers_init = sun8i_layers_init, + .mode_set = sun8i_mixer_mode_set, + .apply_color_correction = sun8i_mixer_apply_color_correction, + .disable_color_correction = sun8i_mixer_disable_color_correction, }; static bool sun8i_mixer_volatile_reg(struct device *dev, unsigned int reg) @@ -600,6 +625,15 @@ static const struct sun8i_mixer_cfg sun8i_h3_mixer0_cfg = { .vi_num = 1, }; +static const struct sun8i_mixer_cfg sun8i_h3_mixer1_cfg = { + .ccsc = 1, + .mod_rate = 432000000, + .scaler_mask = 0x3, + .scanline_yuv = 2048, + .ui_num = 1, + .vi_num = 1, +}; + static const struct sun8i_mixer_cfg sun8i_r40_mixer0_cfg = { .ccsc = CCSC_MIXER0_LAYOUT, .mod_rate = 297000000, @@ -686,6 +720,10 @@ static const struct of_device_id sun8i_mixer_of_table[] = { .compatible = "allwinner,sun8i-h3-de2-mixer-0", .data = &sun8i_h3_mixer0_cfg, }, + { + .compatible = "allwinner,sun8i-h3-de2-mixer-1", + .data = &sun8i_h3_mixer1_cfg, + }, { .compatible = "allwinner,sun8i-r40-de2-mixer-0", .data = &sun8i_r40_mixer0_cfg, diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.h b/drivers/gpu/drm/sun4i/sun8i_mixer.h index 85c94884fb9a..28cdaf0044d9 100644 --- a/drivers/gpu/drm/sun4i/sun8i_mixer.h +++ b/drivers/gpu/drm/sun4i/sun8i_mixer.h @@ -118,6 +118,10 @@ /* format 20 is packed YVU444 10-bit */ /* format 21 is packed YUV444 10-bit */ +/* The DCSC sub-engine is used to do color space conversation */ +#define SUN8I_MIXER_DCSC_EN 0xb0000 +#define SUN8I_MIXER_DCSC_COEF_REG(x) (0xb0010 + 0x4 * (x)) + /* * Sub-engines listed bellow are unused for now. The EN registers are here only * to be used to disable these sub-engines. @@ -128,7 +132,6 @@ #define SUN8I_MIXER_PEAK_EN 0xa6000 #define SUN8I_MIXER_ASE_EN 0xa8000 #define SUN8I_MIXER_FCC_EN 0xaa000 -#define SUN8I_MIXER_DCSC_EN 0xb0000 #define SUN50I_MIXER_FCE_EN 0x70000 #define SUN50I_MIXER_PEAK_EN 0x70800 -- 2.37.3 ================================================ FILE: projects/Allwinner/patches/linux/0039-HACK-a64-Add-HDMI-sound-card.patch ================================================ From ff9ed48eb584e583e20509af6cde1ba80ebd3edd Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Sat, 16 Jan 2021 10:49:00 +0100 Subject: [PATCH] HACK: a64: Add HDMI sound card Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) --- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi @@ -166,6 +166,24 @@ }; }; + sound_hdmi: sound_hdmi { + compatible = "simple-audio-card"; + simple-audio-card,format = "i2s"; + simple-audio-card,name = "allwinner-hdmi"; + simple-audio-card,mclk-fs = <128>; + simple-audio-card,frame-inversion; + + simple-audio-card,codec { + sound-dai = <&hdmi>; + }; + + simple-audio-card,cpu { + sound-dai = <&i2s2>; + dai-tdm-slot-num = <2>; + dai-tdm-slot-width = <32>; + }; + }; + timer { compatible = "arm,armv8-timer"; allwinner,erratum-unknown1; @@ -918,7 +936,6 @@ resets = <&ccu RST_BUS_I2S2>; dma-names = "rx", "tx"; dmas = <&dma 27>, <&dma 27>; - status = "disabled"; }; dai: dai@1c22c00 { @@ -1218,6 +1235,7 @@ }; hdmi: hdmi@1ee0000 { + #sound-dai-cells = <0>; compatible = "allwinner,sun50i-a64-dw-hdmi", "allwinner,sun8i-a83t-dw-hdmi"; reg = <0x01ee0000 0x10000>; ================================================ FILE: projects/Allwinner/patches/linux/0041-bpi-m2u-analog-codec.patch ================================================ From 958ad802878443a2f5f06f5f3c796d163fd03ca9 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Mon, 24 Aug 2020 16:35:54 +0200 Subject: [PATCH 16/17] dts: enable analog codec Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- .../boot/dts/sun8i-r40-bananapi-m2-ultra.dts | 9 ++++ arch/arm/boot/dts/sun8i-r40.dtsi | 42 +++++++++++++++++++ 2 files changed, 51 insertions(+) --- a/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts +++ b/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts @@ -113,6 +113,15 @@ status = "okay"; }; +&codec { + allwinner,audio-routing = + "Headphone", "HP", + "Headphone", "HPCOM", + "MIC1", "Mic", + "Mic", "MBIAS"; + status = "okay"; +}; + &de { status = "okay"; }; --- a/arch/arm/boot/dts/sun8i-r40.dtsi +++ b/arch/arm/boot/dts/sun8i-r40.dtsi @@ -736,6 +736,25 @@ status = "disabled"; }; + codec: codec@01c22c00 { + #sound-dai-cells = <0>; + compatible = "allwinner,sun8i-h3-codec"; + reg = <0x01c22c00 0x300>; + interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&ccu CLK_BUS_CODEC>, <&ccu CLK_CODEC>; + clock-names = "apb", "codec"; + resets = <&ccu RST_BUS_CODEC>; + dmas = <&dma 19>, <&dma 19>; + dma-names = "rx", "tx"; + allwinner,codec-analog-controls = <&codec_analog>; + status = "disabled"; + }; + + codec_analog: codec-analog@01c22f00 { + compatible = "allwinner,sun8i-a23-codec-analog"; + reg = <0x01c22f00 0x4>; + }; + ths: thermal-sensor@1c24c00 { compatible = "allwinner,sun8i-r40-ths"; reg = <0x01c24c00 0x100>; ================================================ FILE: projects/Allwinner/patches/linux/0042-r40-hdmi-audio-wip.patch ================================================ From 4347f8f825bf0a775ab552ca37eaa2204fb65188 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Sun, 16 Aug 2020 11:01:11 +0200 Subject: [PATCH 17/17] r40 hdmi audio wip Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- arch/arm/boot/dts/sun8i-r40.dtsi | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) --- a/arch/arm/boot/dts/sun8i-r40.dtsi +++ b/arch/arm/boot/dts/sun8i-r40.dtsi @@ -111,6 +111,24 @@ status = "disabled"; }; + sound_hdmi: sound { + compatible = "simple-audio-card"; + simple-audio-card,format = "i2s"; + simple-audio-card,name = "allwinner-hdmi"; + simple-audio-card,mclk-fs = <128>; + simple-audio-card,frame-inversion; + + simple-audio-card,codec { + sound-dai = <&hdmi>; + }; + + simple-audio-card,cpu { + sound-dai = <&i2s2>; + dai-tdm-slot-num = <2>; + dai-tdm-slot-width = <32>; + }; + }; + thermal-zones { cpu_thermal: cpu0-thermal { /* milliseconds */ @@ -1186,6 +1217,7 @@ }; hdmi: hdmi@1ee0000 { + #sound-dai-cells = <0>; compatible = "allwinner,sun8i-r40-dw-hdmi", "allwinner,sun8i-a83t-dw-hdmi"; reg = <0x01ee0000 0x10000>; ================================================ FILE: projects/Allwinner/patches/linux/0043-HACK-h6-Add-HDMI-sound-card.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Sat, 16 Jan 2021 10:58:14 +0100 Subject: [PATCH] HACK: h6: Add HDMI sound card Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) --- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi @@ -108,6 +108,24 @@ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>; }; + sound_hdmi: sound { + compatible = "simple-audio-card"; + simple-audio-card,format = "i2s"; + simple-audio-card,name = "allwinner-hdmi"; + simple-audio-card,mclk-fs = <128>; + simple-audio-card,frame-inversion; + + simple-audio-card,codec { + sound-dai = <&hdmi>; + }; + + simple-audio-card,cpu { + sound-dai = <&i2s1>; + dai-tdm-slot-num = <2>; + dai-tdm-slot-width = <32>; + }; + }; + soc { compatible = "simple-bus"; #address-cells = <1>; @@ -664,7 +682,6 @@ dmas = <&dma 4>, <&dma 4>; resets = <&ccu RST_BUS_I2S1>; dma-names = "rx", "tx"; - status = "disabled"; }; spdif: spdif@5093000 { @@ -801,6 +818,7 @@ }; hdmi: hdmi@6000000 { + #sound-dai-cells = <0>; compatible = "allwinner,sun50i-h6-dw-hdmi"; reg = <0x06000000 0x10000>; reg-io-width = <1>; ================================================ FILE: projects/Allwinner/patches/linux/0044-net-stmmac-sun8i-Use-devm_regulator_get-for-PHY-regu.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Ondrej Jirman <megous@megous.com> Date: Wed, 27 Mar 2019 13:21:06 +0100 Subject: [PATCH] net: stmmac: sun8i: Use devm_regulator_get for PHY regulator Use devm_regulator_get instead of devm_regulator_get_optional and rely on dummy supply. This avoids NULL checks before regulator_enable/disable calls. This path also improves error reporting, because we now report both use of dummy supply and error during registration with more detail, instead of generic info level message "No regulator found" that was reported previously on errors and lack of regulator property in DT. Finally, we'll be adding further optional regulators, and the overall code will be simpler. Signed-off-by: Ondrej Jirman <megous@megous.com> --- .../net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c @@ -571,12 +571,10 @@ static int sun8i_dwmac_init(struct platf struct sunxi_priv_data *gmac = priv; int ret; - if (gmac->regulator) { - ret = regulator_enable(gmac->regulator); - if (ret) { - dev_err(&pdev->dev, "Fail to enable regulator\n"); - return ret; - } + ret = regulator_enable(gmac->regulator); + if (ret) { + dev_err(&pdev->dev, "Fail to enable regulator\n"); + return ret; } ret = clk_prepare_enable(gmac->tx_clk); @@ -1045,8 +1043,7 @@ static void sun8i_dwmac_exit(struct plat clk_disable_unprepare(gmac->tx_clk); - if (gmac->regulator) - regulator_disable(gmac->regulator); + regulator_disable(gmac->regulator); } static void sun8i_dwmac_set_mac_loopback(void __iomem *ioaddr, bool enable) @@ -1174,12 +1171,12 @@ static int sun8i_dwmac_probe(struct plat } /* Optional regulator for PHY */ - gmac->regulator = devm_regulator_get_optional(dev, "phy"); + gmac->regulator = devm_regulator_get(dev, "phy"); if (IS_ERR(gmac->regulator)) { - if (PTR_ERR(gmac->regulator) == -EPROBE_DEFER) - return -EPROBE_DEFER; - dev_info(dev, "No regulator found\n"); - gmac->regulator = NULL; + ret = PTR_ERR(gmac->regulator); + if (ret != -EPROBE_DEFER) + dev_err(dev, "Failed to get PHY regulator (%d)\n", ret); + return ret; } /* The "GMAC clock control" register might be located in the ================================================ FILE: projects/Allwinner/patches/linux/0045-net-stmmac-sun8i-Rename-PHY-regulator-variable-to-re.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Ondrej Jirman <megous@megous.com> Date: Tue, 20 Aug 2019 14:29:29 +0200 Subject: [PATCH] net: stmmac: sun8i: Rename PHY regulator variable to regulator_phy We'll be adding further optional regulators, and this makes it clearer what the regulator is for. Signed-off-by: Ondrej Jirman <megous@megous.com> --- .../net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c @@ -57,18 +57,20 @@ struct emac_variant { }; /* struct sunxi_priv_data - hold all sunxi private data - * @ephy_clk: reference to the optional EPHY clock for the internal PHY - * @regulator: reference to the optional regulator - * @rst_ephy: reference to the optional EPHY reset for the internal PHY - * @variant: reference to the current board variant - * @regmap: regmap for using the syscon - * @internal_phy_powered: Does the internal PHY is enabled - * @use_internal_phy: Is the internal PHY selected for use - * @mux_handle: Internal pointer used by mdio-mux lib + * @ephy_clk: reference to the optional EPHY clock for + * the internal PHY + * @regulator_phy: reference to the optional regulator + * @rst_ephy: reference to the optional EPHY reset for + * the internal PHY + * @variant: reference to the current board variant + * @regmap: regmap for using the syscon + * @internal_phy_powered: Does the internal PHY is enabled + * @use_internal_phy: Is the internal PHY selected for use + * @mux_handle: Internal pointer used by mdio-mux lib */ struct sunxi_priv_data { struct clk *ephy_clk; - struct regulator *regulator; + struct regulator *regulator_phy; struct reset_control *rst_ephy; const struct emac_variant *variant; struct regmap_field *regmap_field; @@ -571,9 +573,9 @@ static int sun8i_dwmac_init(struct platf struct sunxi_priv_data *gmac = priv; int ret; - ret = regulator_enable(gmac->regulator); + ret = regulator_enable(gmac->regulator_phy); if (ret) { - dev_err(&pdev->dev, "Fail to enable regulator\n"); + dev_err(&pdev->dev, "Fail to enable PHY regulator\n"); return ret; } @@ -594,8 +596,7 @@ static int sun8i_dwmac_init(struct platf err_disable_clk: clk_disable_unprepare(gmac->tx_clk); err_disable_regulator: - if (gmac->regulator) - regulator_disable(gmac->regulator); + regulator_disable(gmac->regulator_phy); return ret; } @@ -1043,7 +1044,7 @@ static void sun8i_dwmac_exit(struct plat clk_disable_unprepare(gmac->tx_clk); - regulator_disable(gmac->regulator); + regulator_disable(gmac->regulator_phy); } static void sun8i_dwmac_set_mac_loopback(void __iomem *ioaddr, bool enable) @@ -1171,11 +1172,9 @@ static int sun8i_dwmac_probe(struct plat } /* Optional regulator for PHY */ - gmac->regulator = devm_regulator_get(dev, "phy"); - if (IS_ERR(gmac->regulator)) { - ret = PTR_ERR(gmac->regulator); - if (ret != -EPROBE_DEFER) - dev_err(dev, "Failed to get PHY regulator (%d)\n", ret); + gmac->regulator_phy = devm_regulator_get(dev, "phy"); + if (IS_ERR(gmac->regulator_phy)) { + dev_err_probe(dev, ret, "Failed to get PHY regulator\n"); return ret; } ================================================ FILE: projects/Allwinner/patches/linux/0046-net-stmmac-sun8i-Add-support-for-enabling-a-regulato.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Ondrej Jirman <megous@megous.com> Date: Tue, 20 Aug 2019 14:31:38 +0200 Subject: [PATCH] net: stmmac: sun8i: Add support for enabling a regulator for PHY I/O pins 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. Add support for the second optional regulator, "phy-io", to the glue driver. Signed-off-by: Ondrej Jirman <megous@megous.com> --- .../net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c @@ -61,6 +61,8 @@ struct emac_variant { * @ephy_clk: reference to the optional EPHY clock for * the internal PHY * @regulator_phy: reference to the optional regulator + * @regulator_phy_io: reference to the optional regulator for + * PHY I/O pins * @rst_ephy: reference to the optional EPHY reset for * the internal PHY * @variant: reference to the current board variant @@ -73,6 +75,7 @@ struct sunxi_priv_data { struct clk *ephy_clk; struct regulator *regulator_phy; + struct regulator *regulator_phy_io; struct reset_control *rst_ephy; const struct emac_variant *variant; struct regmap_field *regmap_field; @@ -573,10 +576,16 @@ static int sun8i_dwmac_init(struct platf struct sunxi_priv_data *gmac = priv; int ret; + ret = regulator_enable(gmac->regulator_phy_io); + if (ret) { + dev_err(&pdev->dev, "Fail to enable PHY I/O regulator\n"); + return ret; + } + ret = regulator_enable(gmac->regulator_phy); if (ret) { dev_err(&pdev->dev, "Fail to enable PHY regulator\n"); - return ret; + goto err_disable_regulator_phy_io; } ret = clk_prepare_enable(gmac->tx_clk); @@ -597,6 +606,8 @@ err_disable_clk: clk_disable_unprepare(gmac->tx_clk); err_disable_regulator: regulator_disable(gmac->regulator_phy); +err_disable_regulator_phy_io: + regulator_disable(gmac->regulator_phy_io); return ret; } @@ -1045,6 +1056,7 @@ static void sun8i_dwmac_exit(struct plat clk_disable_unprepare(gmac->tx_clk); regulator_disable(gmac->regulator_phy); + regulator_disable(gmac->regulator_phy_io); } static void sun8i_dwmac_set_mac_loopback(void __iomem *ioaddr, bool enable) @@ -1178,6 +1190,15 @@ static int sun8i_dwmac_probe(struct plat return ret; } + /* Optional regulator for PHY I/O pins */ + gmac->regulator_phy_io = devm_regulator_get(dev, "phy-io"); + if (IS_ERR(gmac->regulator_phy_io)) { + ret = PTR_ERR(gmac->regulator_phy_io); + if (ret != -EPROBE_DEFER) + dev_err(dev, "Failed to get PHY I/O regulator (%d)\n", ret); + return ret; + } + /* The "GMAC clock control" register might be located in the * CCU address range (on the R40), or the system control address * range (on most other sun8i and later SoCs). ================================================ FILE: projects/Allwinner/patches/linux/0047-arm64-dts-allwinner-orange-pi-3-Enable-ethernet.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Ondrej Jirman <megous@megous.com> Date: Tue, 20 Aug 2019 14:54:48 +0200 Subject: [PATCH] arm64: dts: allwinner: orange-pi-3: Enable ethernet Orange Pi 3 has two regulators that power the Realtek RTL8211E PHY. According to the datasheet, both regulators need to be enabled at the same time, or that "phy-io" should be enabled slightly earlier than "phy" regulator. RTL8211E/RTL8211EG datasheet says: Note 4: 2.5V (or 1.8/1.5V) RGMII power should be risen simultaneously or slightly earlier than 3.3V power. Rising 2.5V (or 1.8/1.5V) power later than 3.3V power may lead to errors. The driver ensures the regulator enable ordering. The timing is set in DT via startup-delay-us. We also need to wait at least 30ms after power-up/reset, before accessing the PHY registers. All values of RX/TX delay were tested exhaustively and a middle one of the range of working values was chosen. Signed-off-by: Ondrej Jirman <megous@megous.com> --- .../dts/allwinner/sun50i-h6-orangepi-3.dts | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) --- 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; }; chosen { @@ -64,6 +65,15 @@ regulator-always-on; }; + reg_gmac_2v5: gmac-2v5 { + compatible = "regulator-fixed"; + regulator-name = "gmac-2v5"; + regulator-min-microvolt = <2500000>; + regulator-max-microvolt = <2500000>; + enable-active-high; + gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */ + }; + reg_vcc33_wifi: vcc33-wifi { /* Always on 3.3V regulator for WiFi and BT */ compatible = "regulator-fixed"; @@ -128,6 +138,35 @@ }; }; +&emac { + pinctrl-names = "default"; + pinctrl-0 = <&ext_rgmii_pins>; + phy-mode = "rgmii-txid"; + phy-handle = <&ext_rgmii_phy>; + /* + * The board uses 2.5V RGMII signalling. Power sequence to enable + * the phy is to enable GMAC-2V5 and GMAC-3V (aldo2) power rails + * at the same time and to wait 100ms. The driver enables phy-io + * first. Delay is achieved with enable-ramp-delay on reg_aldo2. + */ + phy-supply = <®_aldo2>; + phy-io-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 */ @@ -211,6 +250,7 @@ regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-name = "vcc33-audio-tv-ephy-mac"; + regulator-enable-ramp-delay = <100000>; }; /* ALDO3 is shorted to CLDO1 */ ================================================ FILE: projects/Allwinner/patches/linux/0048-arm64-allwinner-dts-h6-enable-USB3-port-on-Pine-H64.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Icenowy Zheng <icenowy@aosc.io> Date: Mon, 25 Dec 2017 12:10:59 +0800 Subject: [PATCH] arm64: allwinner: dts: h6: enable USB3 port on Pine H64 Pine H64 board have a USB3 port, which is connected to the USB3 pins of the H6 SoC, and the 5V power supply is controlled via GPIO (shared with the power USB ports). Enable this port. Signed-off-by: Icenowy Zheng <icenowy@aosc.io> Reviewed-by: Chen-Yu Tsai <wens@csie.org> --- arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts | 9 +++++++++ 1 file changed, 9 insertions(+) --- a/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts @@ -97,6 +97,10 @@ status = "okay"; }; +&dwc3 { + status = "okay"; +}; + &emac { pinctrl-names = "default"; pinctrl-0 = <&ext_rgmii_pins>; @@ -332,3 +336,8 @@ usb3_vbus-supply = <®_usb_vbus>; status = "okay"; }; + +&usb3phy { + phy-supply = <®_usb_vbus>; + status = "okay"; +}; ================================================ FILE: projects/Allwinner/patches/linux/0049-arm64-dts-allwinner-h6-Add-AC200-EPHY-related-nodes.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Fri, 16 Aug 2019 16:40:20 +0200 Subject: [PATCH] arm64: dts: allwinner: h6: Add AC200 EPHY related nodes Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 56 ++++++++++++++++++++ 1 file changed, 56 insertions(+) --- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi @@ -16,6 +16,16 @@ #address-cells = <1>; #size-cells = <1>; + ac200_pwm_clk: ac200_clk { + compatible = "pwm-clock"; + #clock-cells = <0>; + clock-frequency = <24000000>; + pinctrl-names = "default"; + pinctrl-0 = <&pwm1_pin>; + pwms = <&pwm 1 42 0>; + status = "disabled"; + }; + cpus { #address-cells = <1>; #size-cells = <0>; @@ -319,6 +329,10 @@ cpu_speed_grade: cpu-speed-grade@1c { reg = <0x1c 0x4>; }; + + ephy_calib: ephy_calib@2c { + reg = <0x2c 0x2>; + }; }; timer@3009000 { @@ -373,6 +387,13 @@ drive-strength = <40>; }; + ext_rmii_pins: rmii_pins { + pins = "PA0", "PA1", "PA2", "PA3", "PA4", + "PA5", "PA6", "PA7", "PA8", "PA9"; + function = "emac"; + drive-strength = <40>; + }; + hdmi_pins: hdmi-pins { pins = "PH8", "PH9", "PH10"; function = "hdmi"; @@ -393,6 +414,11 @@ function = "i2c2"; }; + i2c3_pins: i2c3-pins { + pins = "PB17", "PB18"; + function = "i2c3"; + }; + mmc0_pins: mmc0-pins { pins = "PF0", "PF1", "PF2", "PF3", "PF4", "PF5"; @@ -419,6 +445,11 @@ bias-pull-up; }; + pwm1_pin: pwm1-pin { + pins = "PB19"; + function = "pwm1"; + }; + /omit-if-no-ref/ spi0_pins: spi0-pins { pins = "PC0", "PC2", "PC3"; @@ -652,6 +683,31 @@ #size-cells = <0>; }; + i2c3: i2c@5002c00 { + compatible = "allwinner,sun6i-a31-i2c"; + reg = <0x05002c00 0x400>; + interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&ccu CLK_BUS_I2C3>; + resets = <&ccu RST_BUS_I2C3>; + pinctrl-names = "default"; + pinctrl-0 = <&i2c3_pins>; + status = "disabled"; + #address-cells = <1>; + #size-cells = <0>; + + ac200: mfd@10 { + compatible = "x-powers,ac200"; + reg = <0x10>; + clocks = <&ac200_pwm_clk>; + + ac200_ephy: phy { + compatible = "x-powers,ac200-ephy"; + nvmem-cells = <&ephy_calib>; + nvmem-cell-names = "ephy_calib"; + }; + }; + }; + emac: ethernet@5020000 { compatible = "allwinner,sun50i-h6-emac", "allwinner,sun50i-a64-emac"; ================================================ FILE: projects/Allwinner/patches/linux/0051-arm64-dts-allwinner-h6-tanix-tx6-enable-ethernet.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Sat, 24 Aug 2019 01:03:05 +0200 Subject: [PATCH] arm64: dts: allwinner: h6: tanix-tx6: enable ethernet Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- .../dts/allwinner/sun50i-h6-tanix.dtsi | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) --- a/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix.dtsi +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix.dtsi @@ -13,6 +13,7 @@ / { aliases { + ethernet0 = &emac; serial0 = &uart0; }; @@ -54,6 +55,10 @@ }; }; +&ac200_pwm_clk { + status = "okay"; +}; + &cpu0 { cpu-supply = <®_vdd_cpu_gpu>; }; @@ -74,6 +79,14 @@ status = "okay"; }; +&emac { + pinctrl-names = "default"; + pinctrl-0 = <&ext_rmii_pins>; + phy-mode = "rmii"; + phy-handle = <&ext_rmii_phy>; + status = "okay"; +}; + &gpu { mali-supply = <®_vdd_cpu_gpu>; status = "okay"; @@ -89,6 +102,17 @@ }; }; +&i2c3 { + status = "okay"; +}; + +&mdio { + ext_rmii_phy: ethernet-phy@1 { + compatible = "ethernet-phy-ieee802.3-c22"; + reg = <1>; + }; +}; + &mmc0 { pinctrl-names = "default"; pinctrl-0 = <&mmc0_pins>; @@ -119,6 +143,10 @@ vcc-pg-supply = <®_vcc1v8>; }; +&pwm { + status = "okay"; +}; + &r_ir { status = "okay"; }; ================================================ FILE: projects/Allwinner/patches/linux/0052-arm64-allwinner-h6-Enable-USB3-for-OrangePi-Lite2.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Sebastian Meyer <git-commit@mailhell.seb7.de> Date: Mon, 3 Feb 2020 21:27:47 +0100 Subject: [PATCH] arm64: allwinner: h6: Enable USB3 for OrangePi Lite2 Signed-off-by: Sebastian Meyer <git-commit@mailhell.seb7.de> --- .../allwinner/sun50i-h6-orangepi-lite2.dts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) --- a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-lite2.dts +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-lite2.dts @@ -11,6 +11,16 @@ serial1 = &uart1; /* BT-UART */ }; + 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>; /* PL5 USB0-DRVVBUS */ + enable-active-high; + }; + wifi_pwrseq: wifi_pwrseq { compatible = "mmc-pwrseq-simple"; clocks = <&rtc 1>; @@ -20,6 +30,10 @@ }; }; +&dwc3 { + status = "okay"; +}; + &mmc1 { vmmc-supply = <®_cldo2>; vqmmc-supply = <®_bldo3>; @@ -72,3 +86,8 @@ max-speed = <1500000>; }; }; + +&usb3phy { + phy-supply = <®_usb_vbus>; + status = "okay"; +}; ================================================ FILE: projects/Allwinner/patches/linux/0053-mmc-sunxi-fix-unusuable-eMMC-on-some-H6-boards-by-di.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Gonz=C3=A1lez?= <alejandro.gonzalez.correo@gmail.com> Date: Sun, 25 Aug 2019 17:05:58 +0200 Subject: [PATCH] mmc: sunxi: fix unusuable eMMC on some H6 boards by disabling DDR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some Allwinner H6 boards have timing problems when dealing with DDR-capable eMMC cards. These boards include the Pine H64 and Tanix TX6. These timing problems result in out of sync communication between the driver and the eMMC, which renders the memory unsuable for every operation but some basic commmands, like reading the status register. The cause of these timing problems is not yet well known, but they go away by disabling DDR mode operation in the driver. Like on some H5 boards, it might be that the traces are not precise enough to support these speeds. However, Jernej Skrabec compared the BSP driver with this driver, and found that the BSP driver configures pinctrl to operate at 1.8 V when entering DDR mode (although 3.3 V operation is supported), while the mainline kernel lacks any mechanism to switch voltages dynamically. Finally, other possible cause might be some timing parameter that is different on the H6 with respect to other SoCs. Therefore, as this fix works reliably, the kernel lacks the required dynamic pinctrl control for now and a slow eMMC is better than a not working eMMC, just disable DDR operation for now on H6-compatible devices. Signed-off-by: Alejandro González <alejandro.gonzalez.correo@gmail.com> --- drivers/mmc/host/sunxi-mmc.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) --- a/drivers/mmc/host/sunxi-mmc.c +++ b/drivers/mmc/host/sunxi-mmc.c @@ -1421,14 +1421,17 @@ static int sunxi_mmc_probe(struct platfo /* * Some H5 devices do not have signal traces precise enough to - * use HS DDR mode for their eMMC chips. + * use HS DDR mode for their eMMC chips. Other H6 devices operate + * unreliably on HS DDR mode, too. * * We still enable HS DDR modes for all the other controller - * variants that support them. + * variants that support them properly. */ if ((host->cfg->clk_delays || host->use_new_timings) && !of_device_is_compatible(pdev->dev.of_node, - "allwinner,sun50i-h5-emmc")) + "allwinner,sun50i-h5-emmc") && + !of_device_is_compatible(pdev->dev.of_node, + "allwinner,sun50i-h6-emmc")) mmc->caps |= MMC_CAP_1_8V_DDR | MMC_CAP_3_3V_DDR; ret = mmc_of_parse(mmc); ================================================ FILE: projects/Allwinner/patches/linux/0054-arm64-dts-allwinner-h6-tanix-tx6-enable-rtw88-wifi-in-dts.patch ================================================ From ba918badf612c19b4e31a57b2ff4baa06e99d7d5 Mon Sep 17 00:00:00 2001 From: heitbaum <rudi@heitbaum.com> Date: Sun, 23 May 2021 06:37:45 +0000 Subject: [PATCH] Allwinner: linux: add wifi node for rtl8822cs (rtw88) Add and enable dts node for rtw88 (rtl8822cs sdio) # udevadm info /sys/bus/sdio/devices/mmc1\:0001\:1/ P: /devices/platform/soc/4021000.mmc/mmc_host/mmc1/mmc1:0001/mmc1:0001:1 L: 0 E: DEVPATH=/devices/platform/soc/4021000.mmc/mmc_host/mmc1/mmc1:0001/mmc1:0001:1 E: OF_NAME=sdio-wifi E: OF_FULLNAME=/soc/mmc@4021000/sdio-wifi@1 E: OF_COMPATIBLE_N=0 E: SDIO_CLASS=07 E: SDIO_ID=024C:C822 E: SDIO_REVISION=0.0 E: MODALIAS=sdio:c07v024CdC822 E: SUBSYSTEM=sdio --- .../dts/allwinner/sun50i-h6-tanix-tx6.dtsi | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) --- a/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix.dtsi +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix.dtsi @@ -52,6 +52,16 @@ regulator-max-microvolt = <3300000>; }; + 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 = <®_vcc3v3>; + }; + reg_vdd_cpu_gpu: regulator-vdd-cpu-gpu { compatible = "regulator-fixed"; regulator-name = "vdd-cpu-gpu"; @@ -159,6 +169,13 @@ bus-width = <4>; non-removable; status = "okay"; + + rtl8822cs: sdio-wifi@1 { + reg = <1>; + interrupt-parent = <&r_pio>; + interrupts = <1 0 IRQ_TYPE_LEVEL_LOW>; /* PM0 */ + interrupt-names = "host-wake"; + }; }; &mmc2 { ================================================ FILE: projects/Allwinner/patches/linux/0055-WIp-10-bit-HEVC-support.patch ================================================ From 54389b5956af51023b073a08eeb7a746a4a37119 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@siol.net> Date: Sun, 15 Mar 2020 21:35:39 +0100 Subject: [PATCH 31/44] WIp: 10-bit HEVC support Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> --- drivers/staging/media/sunxi/cedrus/cedrus.c | 4 +-- .../staging/media/sunxi/cedrus/cedrus_h265.c | 12 ++++++++ .../staging/media/sunxi/cedrus/cedrus_regs.h | 4 +++ .../staging/media/sunxi/cedrus/cedrus_video.c | 30 +++++++++++++++---- .../staging/media/sunxi/cedrus/cedrus_video.h | 2 +- 5 files changed, 44 insertions(+), 8 deletions(-) --- a/drivers/staging/media/sunxi/cedrus/cedrus.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus.c @@ -289,7 +289,7 @@ static int cedrus_open(struct file *file goto err_ctrls; } ctx->dst_fmt.pixelformat = V4L2_PIX_FMT_NV12_32L32; - cedrus_prepare_format(&ctx->dst_fmt); + cedrus_prepare_format(&ctx->dst_fmt, 0); ctx->src_fmt.pixelformat = V4L2_PIX_FMT_MPEG2_SLICE; /* * TILED_NV12 has more strict requirements, so copy the width and @@ -297,7 +297,7 @@ static int cedrus_open(struct file *file */ ctx->src_fmt.width = ctx->dst_fmt.width; ctx->src_fmt.height = ctx->dst_fmt.height; - cedrus_prepare_format(&ctx->src_fmt); + cedrus_prepare_format(&ctx->src_fmt, 0); v4l2_fh_add(&ctx->fh); --- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c @@ -534,6 +534,18 @@ static void cedrus_h265_setup(struct ced cedrus_write(dev, VE_DEC_H265_DEC_PCM_CTRL, reg); + if (sps->bit_depth_luma_minus8 == 2) { + 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)); + } + /* PPS. */ reg = VE_DEC_H265_DEC_PPS_CTRL0_PPS_CR_QP_OFFSET(pps->pps_cr_qp_offset) | --- a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h +++ b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h @@ -499,6 +499,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) \ SHIFT_AND_MASK_BITS(a, 31, 24) #define VE_DEC_H265_LOW_ADDR_SECONDARY_CHROMA(a) \ --- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c @@ -100,7 +100,7 @@ static struct cedrus_format *cedrus_find return &cedrus_formats[i]; } -void cedrus_prepare_format(struct v4l2_pix_format *pix_fmt) +void cedrus_prepare_format(struct v4l2_pix_format *pix_fmt, int extended) { unsigned int width = pix_fmt->width; unsigned int height = pix_fmt->height; @@ -155,6 +155,17 @@ void cedrus_prepare_format(struct v4l2_p break; } + if (extended) { + unsigned int extra_size; + + 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; + + sizeimage += extra_size; + } + pix_fmt->width = width; pix_fmt->height = height; @@ -247,17 +258,27 @@ static int cedrus_try_fmt_vid_cap(struct struct cedrus_ctx *ctx = cedrus_file2ctx(file); struct cedrus_dev *dev = ctx->dev; struct v4l2_pix_format *pix_fmt = &f->fmt.pix; + const struct v4l2_ctrl_hevc_sps *sps; struct cedrus_format *fmt = cedrus_find_format(pix_fmt->pixelformat, CEDRUS_DECODE_DST, dev->capabilities); + int extended; if (!fmt) return -EINVAL; + sps = cedrus_find_control_data(ctx, V4L2_CID_STATELESS_HEVC_SPS); + + /* The 10-bitHEVC decoder needs extra size on the output buffer. */ + extended = ctx->src_fmt.pixelformat == V4L2_PIX_FMT_HEVC_SLICE && + sps->bit_depth_luma_minus8 == 2; + pix_fmt->pixelformat = fmt->pixelformat; pix_fmt->width = ctx->src_fmt.width; pix_fmt->height = ctx->src_fmt.height; - cedrus_prepare_format(pix_fmt); + + pix_fmt->pixelformat = fmt->pixelformat; + cedrus_prepare_format(pix_fmt, extended); return 0; } @@ -275,8 +296,7 @@ static int cedrus_try_fmt_vid_out(struct if (!fmt) return -EINVAL; - pix_fmt->pixelformat = fmt->pixelformat; - cedrus_prepare_format(pix_fmt); + cedrus_prepare_format(pix_fmt, 0); return 0; } @@ -357,7 +377,7 @@ static int cedrus_s_fmt_vid_out(struct f ctx->dst_fmt.quantization = f->fmt.pix.quantization; ctx->dst_fmt.width = ctx->src_fmt.width; ctx->dst_fmt.height = ctx->src_fmt.height; - cedrus_prepare_format(&ctx->dst_fmt); + cedrus_prepare_format(&ctx->dst_fmt, 0); return 0; } --- a/drivers/staging/media/sunxi/cedrus/cedrus_video.h +++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.h @@ -26,6 +26,6 @@ extern const struct v4l2_ioctl_ops cedru int cedrus_queue_init(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_vq); -void cedrus_prepare_format(struct v4l2_pix_format *pix_fmt); +void cedrus_prepare_format(struct v4l2_pix_format *pix_fmt, int extended); #endif ================================================ FILE: projects/Allwinner/patches/linux/0056-bluetooth-btrtl-add-hci-ver-rtl8822cs.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Rudi Heitbaum <rudi@heitbaum.com> Date: Sat, 15 Jan 2022 08:09:20 +0000 Subject: [PATCH] linux: bluetooth btrtl: add hci_ver 0x8 for rtl8822cs_bt As found on Tanix TX6. Add the missing id hci_ver = 0x8 to the ic_id_table[] Before: [ 11.288818] Bluetooth: hci0: RTL: examining hci_ver=08 hci_rev=000c lmp_ver=08 lmp_subver=8822 [ 11.512883] Bluetooth: hci0: RTL: examining hci_ver=08 hci_rev=000c lmp_ver=08 lmp_subver=8822 [ 11.512940] Bluetooth: hci0: RTL: unknown IC info, lmp subver 8822, hci rev 000c, hci ver 0008 [ 11.512957] Bluetooth: hci0: RTL: no config loaded After: [ 12.642167] Bluetooth: hci0: RTL: examining hci_ver=08 hci_rev=000c lmp_ver=08 lmp_subver=8822 [ 12.671911] Bluetooth: hci0: RTL: rom_version status=0 version=3 [ 12.671961] Bluetooth: hci0: RTL: loading rtl_bt/rtl8822cs_fw.bin [ 12.706248] Bluetooth: hci0: RTL: loading rtl_bt/rtl8822cs_config.bin [ 12.730251] Bluetooth: hci0: RTL: cfg_sz 33, total sz 40737 [ 13.318832] Bluetooth: hci0: RTL: fw version 0x05a91a4a Signed-off-by: Rudi Heitbaum <rudi@heitbaum.com> --- drivers/bluetooth/btrtl.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/bluetooth/btrtl.c b/drivers/bluetooth/btrtl.c --- a/drivers/bluetooth/btrtl.c 2022-01-09 22:55:34.000000000 +0000 +++ b/drivers/bluetooth/btrtl.c 2022-01-15 07:12:21.102080089 +0000 @@ -148,7 +148,15 @@ .fw_name = "rtl_bt/rtl8761bu_fw.bin", .cfg_name = "rtl_bt/rtl8761bu_config" }, + /* 8822C (hci ver 0008) with UART interface */ + { IC_INFO(RTL_ROM_LMP_8822B, 0xc, 0x8, HCI_UART), + .config_needed = true, + .has_rom_version = true, + .has_msft_ext = true, + .fw_name = "rtl_bt/rtl8822cs_fw.bin", + .cfg_name = "rtl_bt/rtl8822cs_config" }, + - /* 8822C with UART interface */ + /* 8822C (hci ver 000a) with UART interface */ { IC_INFO(RTL_ROM_LMP_8822B, 0xc, 0xa, HCI_UART), .config_needed = true, .has_rom_version = true, -- 2.25.1 ================================================ FILE: projects/Allwinner/patches/linux/0057-HACK-Disable-MBUS-due-to-fw_devlink-on.patch ================================================ From a497a69951518aa93bd622755379a6f607e3ce5d Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@gmail.com> Date: Sat, 25 Sep 2021 16:21:41 +0200 Subject: [PATCH] HACK: Disable MBUS due to fw_devlink=on --- arch/arm/boot/dts/sun8i-r40.dtsi | 1 + arch/arm/boot/dts/sun8i-h3.dtsi | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/arm/boot/dts/sun8i-r40.dtsi b/arch/arm/boot/dts/sun8i-r40.dtsi index 291f4784e86c..173edaff4c9b 100644 --- a/arch/arm/boot/dts/sun8i-r40.dtsi +++ b/arch/arm/boot/dts/sun8i-r40.dtsi @@ -949,6 +949,7 @@ mbus: dram-controller@1c62000 { #size-cells = <1>; dma-ranges = <0x00000000 0x40000000 0x80000000>; #interconnect-cells = <1>; + status = "disabled"; }; tcon_top: tcon-top@1c70000 { diff --git a/arch/arm/boot/dts/sun8i-h3.dtsi b/arch/arm/boot/dts/sun8i-h3.dtsi index eac2349a2380..3c08f5ee2780 100644 --- a/arch/arm/boot/dts/sun8i-h3.dtsi +++ b/arch/arm/boot/dts/sun8i-h3.dtsi @@ -297,6 +297,7 @@ &display_clocks { &mbus { compatible = "allwinner,sun8i-h3-mbus"; + status = "disabled"; }; &mmc0 { ================================================ FILE: projects/Allwinner/patches/linux/0058-WIP-OPi3-DT-fixes.patch ================================================ From 59cc76036f42c7f7baa17cb46e6e19cf3a6a62bb Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@gmail.com> Date: Sun, 26 Sep 2021 09:31:45 +0200 Subject: [PATCH] WIP: OPi3 DT fixes --- .../dts/allwinner/sun50i-h6-orangepi-3.dts | 72 +++++++++---------- 1 file changed, 35 insertions(+), 37 deletions(-) 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 c45d7b7fb39a..af92d92d85a3 100644 --- a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts @@ -63,27 +63,7 @@ reg_vcc5v: vcc5v { 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>; - }; - + wifi_pwrseq: wifi-pwrseq { compatible = "mmc-pwrseq-simple"; clocks = <&rtc 1>; @@ -136,8 +116,8 @@ &mmc0 { }; &mmc1 { - vmmc-supply = <®_vcc33_wifi>; - vqmmc-supply = <®_vcc_wifi_io>; + vmmc-supply = <®_cldo2>; + vqmmc-supply = <®_bldo3>; mmc-pwrseq = <&wifi_pwrseq>; bus-width = <4>; non-removable; @@ -172,13 +152,17 @@ &ohci3 { &pio { vcc-pc-supply = <®_bldo2>; vcc-pd-supply = <®_cldo1>; - vcc-pg-supply = <®_vcc_wifi_io>; + vcc-pg-supply = <®_bldo3>; }; &r_ir { status = "okay"; }; +&r_pio { + vcc-pm-supply = <®_bldo3>; +}; + &r_rsb { status = "okay"; @@ -234,13 +218,12 @@ reg_bldo2: bldo2 { regulator-max-microvolt = <1800000>; regulator-name = "vcc-efuse-pcie-hdmi-pc"; }; - - bldo3 { - /* unused */ - }; - - bldo4 { - /* unused */ + + reg_bldo3: bldo3 { + regulator-always-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-name = "vcc-dcxoio"; }; reg_cldo1: cldo1 { @@ -250,19 +233,34 @@ reg_cldo1: cldo1 { regulator-name = "vcc33-io-pd-emmc-sd-usb-uart-2"; }; - cldo2 { - /* unused */ + reg_cldo2: cldo2 { + /* + * This regulator is connected with CLDO3. + * Before the kernel can support synchronized + * enable of coupled regulators, keep them + * both always on as a ugly hack. + */ + regulator-always-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-name = "vcc-wifi-1"; }; cldo3 { - /* unused */ + /* + * This regulator is connected with CLDO2. + * See the comments for CLDO2. + */ + regulator-always-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-name = "vcc-wifi-2"; }; reg_dcdca: dcdca { regulator-always-on; - regulator-min-microvolt = <800000>; - regulator-max-microvolt = <1160000>; - regulator-ramp-delay = <2500>; + regulator-min-microvolt = <810000>; + regulator-max-microvolt = <1080000>; regulator-name = "vdd-cpu"; }; -- 2.33.0 ================================================ FILE: projects/Allwinner/patches/linux/0060-WIP-drm-bridge-synopsys-Fix-CEC-not-working-after-power.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Fri, 22 Oct 2021 11:17:30 +0200 Subject: [PATCH] WIP: drm/bridge: synopsys: Fix CEC not working after power-cyclying This fixes standby -> power-on on Rockchip platform for, at least, RK3288/RK3328/RK3399 where CEC wasn't working after powering on again. It might differ for other phy implementations: The whole HPD-detection part shoud be reworked and we should in general avoid to rely in RX_SENSE phy status (at least for HDMI), since it differs depending on sink's implementation. Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index 92e621f2714f..7551e3ab77d6 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -3179,12 +3179,6 @@ static irqreturn_t dw_hdmi_irq(int irq, void *dev_id) phy_stat & HDMI_PHY_HPD, phy_stat & HDMI_PHY_RX_SENSE); - if ((phy_stat & (HDMI_PHY_RX_SENSE | HDMI_PHY_HPD)) == 0) { - mutex_lock(&hdmi->cec_notifier_mutex); - cec_notifier_phys_addr_invalidate(hdmi->cec_notifier); - mutex_unlock(&hdmi->cec_notifier_mutex); - } - if (phy_stat & HDMI_PHY_HPD) status = connector_status_connected; @@ -3201,6 +3195,14 @@ static irqreturn_t dw_hdmi_irq(int irq, void *dev_id) drm_helper_hpd_irq_event(hdmi->bridge.dev); drm_bridge_hpd_notify(&hdmi->bridge, status); } + + if (status == connector_status_disconnected && + (phy_stat & HDMI_PHY_RX_SENSE) && + (phy_int_pol & HDMI_PHY_RX_SENSE)) { + mutex_lock(&hdmi->cec_notifier_mutex); + cec_notifier_phys_addr_invalidate(hdmi->cec_notifier); + mutex_unlock(&hdmi->cec_notifier_mutex); + } } hdmi_writeb(hdmi, intr_stat, HDMI_IH_PHY_STAT0); ================================================ FILE: projects/Allwinner/patches/linux/0061-media--cedrus--Don-t-CPU-map-source-buffers.patch ================================================ From 566615d14dd8b4a5dbc06f158cb35450b1105e35 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@gmail.com> Date: Tue, 4 Oct 2022 20:36:18 +0200 Subject: [PATCH] media: cedrus: Don't CPU map source buffers There is no need to access source buffers via CPU, so let's disable that. This will lower amount of virtual memory needed on 32-bit ARM SoCs. Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com> --- drivers/staging/media/sunxi/cedrus/cedrus_video.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_video.c b/drivers/staging/media/sunxi/cedrus/cedrus_video.c index f1eb94197a3d6c..8967f221f359f9 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c @@ -601,6 +601,7 @@ int cedrus_queue_init(void *priv, struct vb2_queue *src_vq, src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT; src_vq->io_modes = VB2_MMAP | VB2_DMABUF; + src_vq->dma_attrs = DMA_ATTR_NO_KERNEL_MAPPING; src_vq->drv_priv = ctx; src_vq->buf_struct_size = sizeof(struct cedrus_buffer); src_vq->ops = &cedrus_qops; ================================================ FILE: projects/Allwinner/patches/linux/0063-HACK-SW-CEC-implementation-for-H3.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@gmail.com> Date: Mon, 11 Oct 2021 20:13:41 +0200 Subject: [PATCH] HACK: SW CEC implementation for H3 Many H3 boards lack 32768 Hz external oscillator, so internal RC is used instead. However, it's too unstable for CEC. Use SW implementation instead. That makes it usable, albeit sensitive to cpufreq changes. Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com> --- drivers/gpu/drm/sun4i/Kconfig | 2 + drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h | 13 ++++ drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 83 +++++++++++++++++++++++++- 3 files changed, 96 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/sun4i/Kconfig b/drivers/gpu/drm/sun4i/Kconfig index 5755f0432e77..b93eb2fb52ce 100644 --- a/drivers/gpu/drm/sun4i/Kconfig +++ b/drivers/gpu/drm/sun4i/Kconfig @@ -56,6 +56,8 @@ config DRM_SUN8I_DW_HDMI tristate "Support for Allwinner version of DesignWare HDMI" depends on DRM_SUN4I select DRM_DW_HDMI + select CEC_CORE + select CEC_PIN help Choose this option if you have an Allwinner SoC with the DesignWare HDMI controller with custom HDMI PHY. If M is diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h index bffe1b9cd3dc..61c97619cba1 100644 --- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h +++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h @@ -13,6 +13,8 @@ #include <linux/regmap.h> #include <linux/regulator/consumer.h> #include <linux/reset.h> +#include <media/cec-notifier.h> +#include <media/cec-pin.h> #define SUN8I_HDMI_PHY_DBG_CTRL_REG 0x0000 #define SUN8I_HDMI_PHY_DBG_CTRL_PX_LOCK BIT(0) @@ -145,6 +147,13 @@ #define SUN8I_HDMI_PHY_ANA_STS_RCAL_MASK GENMASK(5, 0) #define SUN8I_HDMI_PHY_CEC_REG 0x003c +#define SUN8I_HDMI_PHY_CEC_PIN_CTRL BIT(7) +/* + * Documentation says that this bit is output enable. However, + * it seems that this bit is actually output disable. + */ +#define SUN8I_HDMI_PHY_CEC_OUT_DIS BIT(2) +#define SUN8I_HDMI_PHY_CEC_IN_DATA BIT(1) struct sun8i_hdmi_phy; @@ -164,6 +173,8 @@ struct sun8i_hdmi_phy_variant { }; struct sun8i_hdmi_phy { + struct cec_adapter *cec_adapter; + struct cec_notifier *cec_notifier; struct clk *clk_bus; struct clk *clk_mod; struct clk *clk_phy; @@ -174,6 +185,8 @@ struct sun8i_hdmi_phy { struct regmap *regs; struct reset_control *rst_phy; const struct sun8i_hdmi_phy_variant *variant; + unsigned int disable_cec : 1; + unsigned int bit_bang_cec : 1; }; struct sun8i_dw_hdmi_quirks { diff --git a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c index b64d93da651d..e2936e7745b8 100644 --- a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c +++ b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c @@ -506,8 +506,9 @@ regmap_update_bits(phy->regs, SUN8I_HDMI_PHY_PLL_CFG1_REG, SUN8I_HDMI_PHY_PLL_CFG1_CKIN_SEL_MSK, 0); - /* set HW control of CEC pins */ - regmap_write(phy->regs, SUN8I_HDMI_PHY_CEC_REG, 0); + /* manual control of CEC pins */ + regmap_write(phy->regs, SUN8I_HDMI_PHY_CEC_REG, + phy->bit_bang_cec ? SUN8I_HDMI_PHY_CEC_PIN_CTRL : 0); /* read calibration data */ regmap_read(phy->regs, SUN8I_HDMI_PHY_ANA_STS_REG, &val); @@ -584,8 +585,47 @@ plat_data->cur_ctr = variant->cur_ctr; plat_data->phy_config = variant->phy_cfg; } + plat_data->disable_cec = phy->disable_cec; } +static int sun8i_hdmi_phy_cec_pin_read(struct cec_adapter *adap) +{ + struct sun8i_hdmi_phy *phy = cec_get_drvdata(adap); + unsigned int val; + + regmap_read(phy->regs, SUN8I_HDMI_PHY_CEC_REG, &val); + + return val & SUN8I_HDMI_PHY_CEC_IN_DATA; +} + +static void sun8i_hdmi_phy_cec_pin_low(struct cec_adapter *adap) +{ + struct sun8i_hdmi_phy *phy = cec_get_drvdata(adap); + + /* Start driving the CEC pin low */ + regmap_write(phy->regs, SUN8I_HDMI_PHY_CEC_REG, + SUN8I_HDMI_PHY_CEC_PIN_CTRL); +} + +static void sun8i_hdmi_phy_cec_pin_high(struct cec_adapter *adap) +{ + struct sun8i_hdmi_phy *phy = cec_get_drvdata(adap); + + /* + * Stop driving the CEC pin, the pull up will take over + * unless another CEC device is driving the pin low. + */ + regmap_write(phy->regs, SUN8I_HDMI_PHY_CEC_REG, + SUN8I_HDMI_PHY_CEC_PIN_CTRL | + SUN8I_HDMI_PHY_CEC_OUT_DIS); +} + +static const struct cec_pin_ops sun8i_hdmi_phy_cec_pin_ops = { + .read = sun8i_hdmi_phy_cec_pin_read, + .low = sun8i_hdmi_phy_cec_pin_low, + .high = sun8i_hdmi_phy_cec_pin_high, +}; + static const struct regmap_config sun8i_hdmi_phy_regmap_config = { .reg_bits = 32, .val_bits = 32, @@ -653,6 +693,7 @@ { struct platform_device *pdev = of_find_device_by_node(node); struct sun8i_hdmi_phy *phy; + int ret; if (!pdev) return -EPROBE_DEFER; @@ -666,8 +707,35 @@ hdmi->phy = phy; put_device(&pdev->dev); + + if (phy->bit_bang_cec) { + phy->cec_adapter = + cec_pin_allocate_adapter(&sun8i_hdmi_phy_cec_pin_ops, + phy, "sun8i-cec", + CEC_CAP_DEFAULTS); + ret = PTR_ERR_OR_ZERO(phy->cec_adapter); + if (ret < 0) + return 0; + + phy->cec_notifier = cec_notifier_cec_adap_register(hdmi->dev, NULL, phy->cec_adapter); + if (!phy->cec_notifier) { + ret = -ENOMEM; + goto err_delete_cec_adapter; + } + + ret = cec_register_adapter(phy->cec_adapter, hdmi->dev); + if (ret < 0) + goto err_put_cec_notifier; + } return 0; + +err_put_cec_notifier: + cec_notifier_cec_adap_unregister(phy->cec_notifier, phy->cec_adapter); +err_delete_cec_adapter: + cec_delete_adapter(phy->cec_adapter); + + return ret; } static int sun8i_hdmi_phy_probe(struct platform_device *pdev) @@ -682,6 +750,14 @@ phy->variant = of_device_get_match_data(dev); phy->dev = dev; + phy->disable_cec = of_machine_is_compatible("roofull,beelink-x2") || + of_machine_is_compatible("friendlyarm,nanopi-m1") || + of_machine_is_compatible("xunlong,orangepi-lite") || + of_machine_is_compatible("xunlong,orangepi-one") || + of_machine_is_compatible("xunlong,orangepi-pc-plus") || + of_machine_is_compatible("xunlong,orangepi-plus2e"); + phy->bit_bang_cec = phy->disable_cec && + !of_machine_is_compatible("roofull,beelink-x2"); regs = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(regs)) @@ -728,8 +804,19 @@ return 0; } +static int sun8i_hdmi_phy_remove(struct platform_device *pdev) +{ + struct sun8i_hdmi_phy *phy = platform_get_drvdata(pdev); + + cec_notifier_cec_adap_unregister(phy->cec_notifier, phy->cec_adapter); + cec_unregister_adapter(phy->cec_adapter); + + return 0; +} + struct platform_driver sun8i_hdmi_phy_driver = { .probe = sun8i_hdmi_phy_probe, + .remove = sun8i_hdmi_phy_remove, .driver = { .name = "sun8i-hdmi-phy", .of_match_table = sun8i_hdmi_phy_of_table, ================================================ FILE: projects/Allwinner/patches/linux/0065-wip-fix-H6-4k-60.patch ================================================ From edc858b1d62ce5ffd8b8d10cc62425af15d48a91 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@gmail.com> Date: Wed, 8 Dec 2021 20:42:45 +0100 Subject: [PATCH] wip: fix H6 4k@60 Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com> --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 7 +++++++ drivers/gpu/drm/bridge/synopsys/dw-hdmi.h | 4 ++++ drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index f08d0fded61f..bcd839a3ce80 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -1488,6 +1488,8 @@ static int hdmi_phy_configure_dwc_hdmi_3d_tx(struct dw_hdmi *hdmi, /* Override and disable clock termination. */ dw_hdmi_phy_i2c_write(hdmi, HDMI_3D_TX_PHY_CKCALCTRL_OVERRIDE, HDMI_3D_TX_PHY_CKCALCTRL); + if (mpixelclock == 594000000) + dw_hdmi_phy_i2c_write(hdmi, 0x8006, HDMI_3D_TX_PHY_MSM_CTRL); return 0; } @@ -2166,6 +2168,8 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, hdmi->hdmi_data.hdcp_enable = 0; hdmi->hdmi_data.video_mode.mdataenablepolarity = true; + hdmi_writeb(hdmi, HDMI_FC_GCP_SET_AVMUTE, HDMI_FC_GCP); + /* HDMI Initialization Step B.1 */ hdmi_av_composer(hdmi, &connector->display_info, mode); @@ -2205,6 +2209,9 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, hdmi_video_sample(hdmi); hdmi_tx_hdcp_config(hdmi); + msleep(100); + hdmi_writeb(hdmi, HDMI_FC_GCP_CLEAR_AVMUTE, HDMI_FC_GCP); + dw_hdmi_clear_overflow(hdmi); return 0; diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h index 1999db05bc3b..05182418efbb 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h @@ -842,6 +842,10 @@ enum { HDMI_FC_AVICONF3_QUANT_RANGE_LIMITED = 0x00, HDMI_FC_AVICONF3_QUANT_RANGE_FULL = 0x04, +/* HDMI_FC_GCP */ + HDMI_FC_GCP_SET_AVMUTE = 0x2, + HDMI_FC_GCP_CLEAR_AVMUTE = 0x1, + /* FC_DBGFORCE field values */ HDMI_FC_DBGFORCE_FORCEAUDIO = 0x10, HDMI_FC_DBGFORCE_FORCEVIDEO = 0x1, diff --git a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c index b64d93da651d..b70bc9de761f 100644 --- a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c +++ b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c @@ -90,7 +90,7 @@ static const struct dw_hdmi_mpll_config sun50i_h6_mpll_cfg[] = { }, }, { 594000000, { - { 0x1a40, 0x0003 }, + { 0x1a7c, 0x0003 }, { 0x3b4c, 0x0003 }, { 0x5a64, 0x0003 }, }, -- 2.34.1 ================================================ FILE: projects/Allwinner/patches/linux/0066-arm64-dts-allwinner-h6-Fix-Cedrus-IOMMU-again.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@gmail.com> Date: Wed, 12 Oct 2022 23:01:04 +0200 Subject: [PATCH] arm64: dts: allwinner: h6: Fix Cedrus IOMMU, again Cedrus actually uses two IOMMU channels. Add the second one. Fixes: 62a8ccf3a248 ("arm64: dts: allwinner: h6: Fix Cedrus IOMMU usage") Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com> --- arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi index e897559d9a89..436cc2a02d1a 100644 --- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi @@ -172,7 +172,7 @@ video-codec@1c0e000 { resets = <&ccu RST_BUS_VE>; interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>; allwinner,sram = <&ve_sram 1>; - iommus = <&iommu 3>; + iommus = <&iommu 1>, <&iommu 3>; }; gpu: gpu@1800000 { ================================================ FILE: projects/Allwinner/patches/linux/0073-iommu-sun50i-Allow-page-sizes-multiple-of-4096.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@gmail.com> Date: Fri, 14 Oct 2022 20:15:43 +0200 Subject: [PATCH] iommu/sun50i: Allow page sizes multiple of 4096 While peripheral supports only 4K page sizes, we can easily emulate support for bigger page sizes, up to 1M. This is done by making multiple entries in map function or clearing multiple entries in unmap. This considerably lowers overhead. Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com> --- drivers/iommu/sun50i-iommu.c | 44 +++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/drivers/iommu/sun50i-iommu.c b/drivers/iommu/sun50i-iommu.c index d7c5e9b1a087..9944266c4f58 100644 --- a/drivers/iommu/sun50i-iommu.c +++ b/drivers/iommu/sun50i-iommu.c @@ -593,10 +593,12 @@ static int sun50i_iommu_map(struct iommu_domain *domain, unsigned long iova, { struct sun50i_iommu_domain *sun50i_domain = to_sun50i_domain(domain); struct sun50i_iommu *iommu = sun50i_domain->iommu; - u32 pte_index; + u32 pte_index, pages, i; u32 *page_table, *pte_addr; int ret = 0; + pages = size / SPAGE_SIZE; + page_table = sun50i_dte_get_page_table(sun50i_domain, iova, gfp); if (IS_ERR(page_table)) { ret = PTR_ERR(page_table); @@ -604,18 +606,21 @@ static int sun50i_iommu_map(struct iommu_domain *domain, unsigned long iova, } pte_index = sun50i_iova_get_pte_index(iova); - pte_addr = &page_table[pte_index]; - if (unlikely(sun50i_pte_is_page_valid(*pte_addr))) { - phys_addr_t page_phys = sun50i_pte_get_page_address(*pte_addr); - dev_err(iommu->dev, - "iova %pad already mapped to %pa cannot remap to %pa prot: %#x\n", - &iova, &page_phys, &paddr, prot); - ret = -EBUSY; - goto out; + for (i = 0; i < pages; i++) { + pte_addr = &page_table[pte_index + i]; + if (unlikely(sun50i_pte_is_page_valid(*pte_addr))) { + phys_addr_t page_phys = sun50i_pte_get_page_address(*pte_addr); + dev_err(iommu->dev, + "iova %pad already mapped to %pa cannot remap to %pa prot: %#x\n", + &iova, &page_phys, &paddr, prot); + ret = -EBUSY; + goto out; + } + *pte_addr = sun50i_mk_pte(paddr, prot); + paddr += SPAGE_SIZE; } - *pte_addr = sun50i_mk_pte(paddr, prot); - sun50i_table_flush(sun50i_domain, pte_addr, 1); + sun50i_table_flush(sun50i_domain, &page_table[pte_index], pages); out: return ret; @@ -626,8 +631,10 @@ static size_t sun50i_iommu_unmap(struct iommu_domain *domain, unsigned long iova { struct sun50i_iommu_domain *sun50i_domain = to_sun50i_domain(domain); phys_addr_t pt_phys; + u32 dte, pages, i; u32 *pte_addr; - u32 dte; + + pages = size / SPAGE_SIZE; dte = sun50i_domain->dt[sun50i_iova_get_dte_index(iova)]; if (!sun50i_dte_is_pt_valid(dte)) @@ -636,13 +643,14 @@ static size_t sun50i_iommu_unmap(struct iommu_domain *domain, unsigned long iova pt_phys = sun50i_dte_get_pt_address(dte); pte_addr = (u32 *)phys_to_virt(pt_phys) + sun50i_iova_get_pte_index(iova); - if (!sun50i_pte_is_page_valid(*pte_addr)) - return 0; + for (i = 0; i < pages; i++) + if (!sun50i_pte_is_page_valid(pte_addr[i])) + return 0; - memset(pte_addr, 0, sizeof(*pte_addr)); - sun50i_table_flush(sun50i_domain, pte_addr, 1); + memset(pte_addr, 0, sizeof(*pte_addr) * pages); + sun50i_table_flush(sun50i_domain, pte_addr, pages); - return SZ_4K; + return size; } static phys_addr_t sun50i_iommu_iova_to_phys(struct iommu_domain *domain, @@ -828,7 +836,7 @@ static int sun50i_iommu_of_xlate(struct device *dev, } static const struct iommu_ops sun50i_iommu_ops = { - .pgsize_bitmap = SZ_4K, + .pgsize_bitmap = 0x1ff000, .device_group = sun50i_iommu_device_group, .domain_alloc = sun50i_iommu_domain_alloc, .of_xlate = sun50i_iommu_of_xlate, ================================================ FILE: projects/Allwinner/patches/linux/0075-Revert-drm-sun4i-dw-hdmi-Fix-ddc-en-GPIO-consumer-co.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@gmail.com> Date: Fri, 14 Oct 2022 23:35:13 +0200 Subject: [PATCH] Revert "drm/sun4i: dw-hdmi: Fix ddc-en GPIO consumer conflict" This reverts commit 920169041baa0a7497ed702aa97d6a2d6285efd3. --- drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c | 54 +++++++++++++++++++++++++-- drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h | 2 + 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c index 477cb6985b4d..a8d75fd7e9f4 100644 --- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c +++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c @@ -93,10 +93,34 @@ 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) { - struct platform_device *pdev = to_platform_device(dev); + struct platform_device *pdev = to_platform_device(dev), *connector_pdev; struct dw_hdmi_plat_data *plat_data; struct drm_device *drm = data; struct device_node *phy_node; @@ -143,16 +167,30 @@ static int sun8i_dw_hdmi_bind(struct device *dev, struct device *master, return dev_err_probe(dev, PTR_ERR(hdmi->regulator), "Couldn't get regulator\n"); + ret = sun8i_dw_hdmi_find_connector_pdev(dev, &connector_pdev); + if (!ret) { + hdmi->ddc_en = gpiod_get_optional(&connector_pdev->dev, + "ddc-en", GPIOD_OUT_HIGH); + platform_device_put(connector_pdev); + + if (IS_ERR(hdmi->ddc_en)) { + dev_err(dev, "Couldn't get ddc-en gpio\n"); + return PTR_ERR(hdmi->ddc_en); + } + } + ret = regulator_enable(hdmi->regulator); if (ret) { dev_err(dev, "Failed to enable regulator\n"); - return ret; + goto err_unref_ddc_en; } + gpiod_set_value(hdmi->ddc_en, 1); + 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_en; } ret = clk_prepare_enable(hdmi->clk_tmds); @@ -207,8 +245,12 @@ 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_regulator: +err_disable_ddc_en: + gpiod_set_value(hdmi->ddc_en, 0); regulator_disable(hdmi->regulator); +err_unref_ddc_en: + if (hdmi->ddc_en) + gpiod_put(hdmi->ddc_en); return ret; } @@ -222,7 +264,11 @@ static void sun8i_dw_hdmi_unbind(struct device *dev, struct device *master, sun8i_hdmi_phy_deinit(hdmi->phy); clk_disable_unprepare(hdmi->clk_tmds); reset_control_assert(hdmi->rst_ctrl); + gpiod_set_value(hdmi->ddc_en, 0); regulator_disable(hdmi->regulator); + + if (hdmi->ddc_en) + gpiod_put(hdmi->ddc_en); } 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 ab80d52a70bb..f082b8ecfe2c 100644 --- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h +++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h @@ -9,6 +9,7 @@ #include <drm/bridge/dw_hdmi.h> #include <drm/drm_encoder.h> #include <linux/clk.h> +#include <linux/gpio/consumer.h> #include <linux/regmap.h> #include <linux/regulator/consumer.h> #include <linux/reset.h> @@ -187,6 +188,7 @@ struct sun8i_dw_hdmi { struct regulator *regulator; const struct sun8i_dw_hdmi_quirks *quirks; struct reset_control *rst_ctrl; + struct gpio_desc *ddc_en; }; extern struct platform_driver sun8i_hdmi_phy_driver; ================================================ FILE: projects/Allwinner/patches/linux/0076-net-phy-add-support-for-motorcomm-yt8531c-phy.patch ================================================ From git@z Thu Jan 1 00:00:00 1970 Subject: [PATCH] net: phy: add support for Motorcomm yt8531C phy From: Peter Geis <pgwipeout@gmail.com> Date: Sun, 09 Oct 2022 22:24:05 +0300 Message-Id: <20221009192405.97118-1-f.kardame@manjaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit This patch adds support for Motorcomm YT8531C which is used in OrangePi 3 LTS, OrangePi 4 LTS and OrangePi 800 Currently being used by Manjaro Arm kernel Signed-off-by: Peter Geis <pgwipeout@gmail.com> Signed-off-by: Furkan Kardame <f.kardame@manjaro.org> --- drivers/net/phy/motorcomm.c | 90 +++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/drivers/net/phy/motorcomm.c b/drivers/net/phy/motorcomm.c index 7e6ac2c5e..cbc8ef15d 100644 --- a/drivers/net/phy/motorcomm.c +++ b/drivers/net/phy/motorcomm.c @@ -10,6 +10,7 @@ #include <linux/phy.h> #define PHY_ID_YT8511 0x0000010a +#define PHY_ID_YT8531 0x4f51e91b #define YT8511_PAGE_SELECT 0x1e #define YT8511_PAGE 0x1f @@ -38,6 +39,38 @@ #define YT8511_DELAY_FE_TX_EN (0xf << 12) #define YT8511_DELAY_FE_TX_DIS (0x2 << 12) +#define YT8531_RGMII_CONFIG1 0xa003 + +/* TX Gig-E Delay is bits 3:0, default 0x1 + * TX Fast-E Delay is bits 7:4, default 0xf + * RX Delay is bits 13:10, default 0x0 + * Delay = 150ps * N + * On = 2000ps, off = 50ps + */ +#define YT8531_DELAY_GE_TX_EN (0xd << 0) +#define YT8531_DELAY_GE_TX_DIS (0x0 << 0) +#define YT8531_DELAY_FE_TX_EN (0xd << 4) +#define YT8531_DELAY_FE_TX_DIS (0x0 << 4) +#define YT8531_DELAY_RX_EN (0xd << 10) +#define YT8531_DELAY_RX_DIS (0x0 << 10) +#define YT8531_DELAY_MASK (GENMASK(13, 10) | GENMASK(7, 0)) + +#define YT8531_SYNCE_CFG 0xa012 + +/* Clk src config is bits 3:1 + * 3b000 src from pll + * 3b001 src from rx_clk + * 3b010 src from serdes + * 3b011 src from ptp_in + * 3b100 src from 25mhz refclk *default* + * 3b101 src from 25mhz ssc + * Clk rate select is bit 4 + * 1b0 25mhz clk output *default* + * 1b1 125mhz clk output + * Clkout enable is bit 6 + */ +#define YT8531_CLKCFG_125M (BIT(6) | BIT(4) | (0x0 < 1)) + static int yt8511_read_page(struct phy_device *phydev) { return __phy_read(phydev, YT8511_PAGE_SELECT); @@ -111,6 +145,51 @@ static int yt8511_config_init(struct phy_device *phydev) return phy_restore_page(phydev, oldpage, ret); } +static int yt8531_config_init(struct phy_device *phydev) +{ + int oldpage, ret = 0; + unsigned int val; + + oldpage = phy_select_page(phydev, YT8531_RGMII_CONFIG1); + if (oldpage < 0) + goto err_restore_page; + + /* set rgmii delay mode */ + switch (phydev->interface) { + case PHY_INTERFACE_MODE_RGMII: + val = YT8531_DELAY_RX_DIS | YT8531_DELAY_GE_TX_DIS | YT8531_DELAY_FE_TX_DIS; + break; + case PHY_INTERFACE_MODE_RGMII_RXID: + val = YT8531_DELAY_RX_EN | YT8531_DELAY_GE_TX_DIS | YT8531_DELAY_FE_TX_DIS; + break; + case PHY_INTERFACE_MODE_RGMII_TXID: + val = YT8531_DELAY_RX_DIS | YT8531_DELAY_GE_TX_EN | YT8531_DELAY_FE_TX_EN; + break; + case PHY_INTERFACE_MODE_RGMII_ID: + val = YT8531_DELAY_RX_EN | YT8531_DELAY_GE_TX_EN | YT8531_DELAY_FE_TX_EN; + break; + default: /* do not support other modes */ + ret = -EOPNOTSUPP; + goto err_restore_page; + } + + ret = __phy_modify(phydev, YT8511_PAGE, YT8531_DELAY_MASK, val); + if (ret < 0) + goto err_restore_page; + + /* set clock mode to 125mhz */ + ret = __phy_write(phydev, YT8511_PAGE_SELECT, YT8531_SYNCE_CFG); + if (ret < 0) + goto err_restore_page; + + ret = __phy_write(phydev, YT8511_PAGE, YT8531_CLKCFG_125M); + if (ret < 0) + goto err_restore_page; + +err_restore_page: + return phy_restore_page(phydev, oldpage, ret); +} + static struct phy_driver motorcomm_phy_drvs[] = { { PHY_ID_MATCH_EXACT(PHY_ID_YT8511), @@ -120,7 +200,16 @@ static struct phy_driver motorcomm_phy_drvs[] = { .resume = genphy_resume, .read_page = yt8511_read_page, .write_page = yt8511_write_page, + }, { + PHY_ID_MATCH_EXACT(PHY_ID_YT8531), + .name = "YT8531 Gigabit Ethernet", + .config_init = yt8531_config_init, + .suspend = genphy_suspend, + .resume = genphy_resume, + .read_page = yt8511_read_page, + .write_page = yt8511_write_page, }, + }; module_phy_driver(motorcomm_phy_drvs); @@ -131,6 +220,7 @@ MODULE_LICENSE("GPL"); static const struct mdio_device_id __maybe_unused motorcomm_tbl[] = { { PHY_ID_MATCH_EXACT(PHY_ID_YT8511) }, + { PHY_ID_MATCH_EXACT(PHY_ID_YT8531) }, { /* sentinal */ } }; -- 2.37.3 ================================================ FILE: projects/Allwinner/patches/linux/0077-OrangePi-3-LTS-support.patch ================================================ From 72b6fa8ce7faa765ad0aa0491f9f4a907107b80e Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@gmail.com> Date: Sun, 29 Jan 2023 22:19:45 +0100 Subject: [PATCH] OrangePi 3 LTS support Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com> --- arch/arm64/boot/dts/allwinner/Makefile | 1 + .../allwinner/sun50i-h6-orangepi-3-lts.dts | 313 ++++++++++++++++++ 2 files changed, 314 insertions(+) create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts diff --git a/arch/arm64/boot/dts/allwinner/Makefile b/arch/arm64/boot/dts/allwinner/Makefile index 6a96494a2e0a..ace8159a6324 100644 --- a/arch/arm64/boot/dts/allwinner/Makefile +++ b/arch/arm64/boot/dts/allwinner/Makefile @@ -32,6 +32,7 @@ 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-beelink-gs1.dtb dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-orangepi-3.dtb +dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-orangepi-3-lts.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-lts.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts new file mode 100644 index 000000000000..6a5df1103a90 --- /dev/null +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +// Copyright (C) 2023 Jernej Skrabec <jernej.skrabec@gmail.com> +// Based on sun50i-h6-orangepi-3.dts, which is: +// Copyright (C) 2019 Ondřej Jirman <megous@megous.com> + +/dts-v1/; + +#include "sun50i-h6.dtsi" +#include "sun50i-h6-cpu-opp.dtsi" + +#include <dt-bindings/gpio/gpio.h> + +/ { + model = "OrangePi 3 LTS"; + compatible = "xunlong,orangepi-3-lts", "allwinner,sun50i-h6"; + + aliases { + ethernet0 = &emac; + serial0 = &uart0; + }; + + chosen { + stdout-path = "serial0:115200n8"; + }; + + connector { + compatible = "hdmi-connector"; + ddc-en-gpios = <&pio 7 2 GPIO_ACTIVE_HIGH>; /* PH2 */ + type = "a"; + + port { + hdmi_con_in: endpoint { + remote-endpoint = <&hdmi_out_con>; + }; + }; + }; + + ext_osc32k: ext_osc32k_clk { + #clock-cells = <0>; + compatible = "fixed-clock"; + clock-frequency = <32768>; + clock-output-names = "ext_osc32k"; + }; + + leds { + compatible = "gpio-leds"; + + led-0 { + label = "orangepi:red:power"; + gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */ + default-state = "on"; + }; + + led-1 { + label = "orangepi:green:status"; + gpios = <&r_pio 0 7 GPIO_ACTIVE_HIGH>; /* PL7 */ + }; + }; + + reg_gmac_3v3: gmac-3v3 { + compatible = "regulator-fixed"; + regulator-name = "gmac-3v3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + startup-delay-us = <150000>; + enable-active-high; + gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */ + }; + + 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>; +}; + +&de { + status = "okay"; +}; + +&dwc3 { + 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_3v3>; + allwinner,rx-delay-ps = <200>; + allwinner,tx-delay-ps = <300>; + status = "okay"; +}; + +&gpu { + mali-supply = <®_dcdcc>; + status = "okay"; +}; + +&hdmi { + hvcc-supply = <®_bldo2>; + 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 { + vmmc-supply = <®_cldo1>; + vqmmc-supply = <®_bldo2>; + cap-mmc-hw-reset; + non-removable; + bus-width = <8>; + status = "okay"; +}; + +&ohci0 { + status = "okay"; +}; + +&ohci3 { + status = "okay"; +}; + +&pio { + vcc-pc-supply = <®_bldo2>; + vcc-pd-supply = <®_cldo1>; + vcc-pg-supply = <®_bldo3>; +}; + +&r_ir { + status = "okay"; +}; + +&r_i2c { + status = "okay"; + + axp805: pmic@36 { + compatible = "x-powers,axp805", "x-powers,axp806"; + reg = <0x36>; + interrupt-parent = <&r_intc>; + interrupts = <GIC_SPI 96 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-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-name = "vcc-efuse-pcie-hdmi-pc"; + }; + + reg_bldo3: bldo3 { + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-name = "vcc-pm-pg-dcxoio-wifi"; + }; + + 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-ramp-delay = <2500>; + regulator-name = "vdd-cpu"; + }; + + reg_dcdcc: dcdcc { + regulator-enable-ramp-delay = <32000>; + regulator-min-microvolt = <810000>; + regulator-max-microvolt = <1080000>; + regulator-ramp-delay = <2500>; + 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 */ + }; + }; + }; +}; + +&rtc { + clocks = <&ext_osc32k>; +}; + +&uart0 { + pinctrl-names = "default"; + pinctrl-0 = <&uart0_ph_pins>; + status = "okay"; +}; + +&usb2otg { + 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"; +}; + +&usb3phy { + status = "okay"; +}; -- 2.39.1 ================================================ FILE: projects/Allwinner/patches/linux/0100-tanix-mmc-rtw88-keep-power-in-suspend.patch ================================================ --- a/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix.dtsi 2022-06-25 14:21:11.340219073 +0000 +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix.dtsi 2022-06-26 09:52:05.018133375 +0000 @@ -168,6 +168,7 @@ mmc-pwrseq = <&wifi_pwrseq>; bus-width = <4>; non-removable; + keep-power-in-suspend; status = "okay"; rtl8822cs: sdio-wifi@1 { ================================================ FILE: projects/Allwinner/patches/linux/0101-Bluetooth-btrtl-Add-support-for-RTL8822BS.patch ================================================ From 32206b30a6b4333ce50d6443585f7b9b65323ef1 Mon Sep 17 00:00:00 2001 From: Rudi Heitbaum <rudi@heitbaum.com> Date: Sun, 14 May 2023 05:16:12 +0000 Subject: [PATCH v2] Bluetooth: btrtl: Add support for RTL8822BS UART Add a RTL8822BS UART with hci_ver = 0x07. This is similar to RTL8822CS observed on the Tanix TX6 Android set-top box. But the previous generation of chip. The RTL8822BS requires the BROKEN_LOCAL_EXT_FEATURES_PAGE_2 quirk. Reported-by: kernel test robot <lkp@intel.com> Closes: https://lore.kernel.org/oe-kbuild-all/202305141828.USyPW8CP-lkp@intel.com/ Signed-off-by: Rudi Heitbaum <rudi@heitbaum.com> --- drivers/bluetooth/btrtl.c | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/bluetooth/btrtl.c b/drivers/bluetooth/btrtl.c index 2915c82d719d..8368858dda70 100644 --- a/drivers/bluetooth/btrtl.c +++ b/drivers/bluetooth/btrtl.c @@ -234,7 +234,15 @@ static const struct id_table ic_id_table[] = { .fw_name = "rtl_bt/rtl8822cu_fw.bin", .cfg_name = "rtl_bt/rtl8822cu_config" }, - /* 8822B */ + /* 8822BS with UART interface */ + { IC_INFO(RTL_ROM_LMP_8822B, 0xb, 0x7, HCI_UART), + .config_needed = true, + .has_rom_version = true, + .has_msft_ext = true, + .fw_name = "rtl_bt/rtl8822bs_fw.bin", + .cfg_name = "rtl_bt/rtl8822bs_config" }, + + /* 8822BU with USB interface */ { IC_INFO(RTL_ROM_LMP_8822B, 0xb, 0x7, HCI_USB), .config_needed = true, .has_rom_version = true, @@ -1182,6 +1190,9 @@ void btrtl_set_quirks(struct hci_dev *hdev, struct btrtl_device_info *btrtl_dev) hci_set_aosp_capable(hdev); break; + case CHIP_ID_8822B: + set_bit(HCI_QUIRK_BROKEN_LOCAL_EXT_FEATURES_PAGE_2, &hdev->quirks); + fallthrough; default: rtl_dev_dbg(hdev, "Central-peripheral role not enabled."); rtl_dev_dbg(hdev, "WBS supported not enabled."); ================================================ FILE: projects/Allwinner/patches/linux/0105-ARM-dts-sun8i-r40-Add-interconnect-to-video-codec.patch ================================================ From 667a93ec571a2a8f2487c258c928936d73b7fa14 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@gmail.com> Date: Sun, 19 Feb 2023 13:02:31 +0100 Subject: [PATCH] ARM: dts: sun8i-r40: Add interconnect to video-codec Video codec needs interconnect, so driver knows that it needs to adjust DMA addresses. Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com> --- arch/arm/boot/dts/sun8i-r40.dtsi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm/boot/dts/sun8i-r40.dtsi b/arch/arm/boot/dts/sun8i-r40.dtsi index 4ef26d8f5340..a5b1f1e3900d 100644 --- a/arch/arm/boot/dts/sun8i-r40.dtsi +++ b/arch/arm/boot/dts/sun8i-r40.dtsi @@ -338,6 +338,8 @@ video-codec@1c0e000 { resets = <&ccu RST_BUS_VE>; interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>; allwinner,sram = <&ve_sram 1>; + interconnects = <&mbus 4>; + interconnect-names = "dma-mem"; }; mmc0: mmc@1c0f000 { -- 2.39.2 ================================================ FILE: projects/Allwinner/patches/linux/0106-media-cedrus-h265-Fix-configuring-bitstream-size.patch ================================================ From 6fba61d436ed9d610e1001860e2fcdf2ccf96803 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@gmail.com> Date: Sat, 7 Oct 2023 08:36:47 +0200 Subject: [PATCH 14/23] media: cedrus: h265: Fix configuring bitstream size bit_size field holds size of slice, not slice + header. Because of HW quirks, driver can't program in just slice, but also preceeding header. But that means that currently used bit_size is wrong (too small). Instead, just use size of whole buffer. There is no harm in doing this. Fixes: 86caab29da78 ("media: cedrus: Add HEVC/H.265 decoding support") Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com> --- drivers/staging/media/sunxi/cedrus/cedrus_h265.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c index fc9297232456..16c822637dc6 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c @@ -454,11 +454,11 @@ static int cedrus_h265_setup(struct cedrus_ctx *ctx, struct cedrus_run *run) unsigned int ctb_addr_x, ctb_addr_y; struct cedrus_buffer *cedrus_buf; dma_addr_t src_buf_addr; - dma_addr_t src_buf_end_addr; u32 chroma_log2_weight_denom; u32 num_entry_point_offsets; u32 output_pic_list_index; u32 pic_order_cnt[2]; + size_t slice_bytes; u8 padding; int count; u32 reg; @@ -468,6 +468,7 @@ static int cedrus_h265_setup(struct cedrus_ctx *ctx, struct cedrus_run *run) decode_params = run->h265.decode_params; pred_weight_table = &slice_params->pred_weight_table; num_entry_point_offsets = slice_params->num_entry_point_offsets; + slice_bytes = vb2_get_plane_payload(&run->src->vb2_buf, 0); /* * If entry points offsets are present, we should get them @@ -490,7 +491,7 @@ static int cedrus_h265_setup(struct cedrus_ctx *ctx, struct cedrus_run *run) cedrus_write(dev, VE_DEC_H265_BITS_OFFSET, 0); - reg = slice_params->bit_size; + reg = slice_bytes * 8; cedrus_write(dev, VE_DEC_H265_BITS_LEN, reg); /* Source beginning and end addresses. */ @@ -504,10 +505,7 @@ static int cedrus_h265_setup(struct cedrus_ctx *ctx, struct cedrus_run *run) cedrus_write(dev, VE_DEC_H265_BITS_ADDR, reg); - src_buf_end_addr = src_buf_addr + - DIV_ROUND_UP(slice_params->bit_size, 8); - - reg = VE_DEC_H265_BITS_END_ADDR_BASE(src_buf_end_addr); + reg = VE_DEC_H265_BITS_END_ADDR_BASE(src_buf_addr + slice_bytes); cedrus_write(dev, VE_DEC_H265_BITS_END_ADDR, reg); /* Coding tree block address */ -- 2.42.0 ================================================ FILE: projects/Allwinner/patches/linux/0107-wip-media-sunxi-sun8i-di-fix-race-condition.patch ================================================ From 239ce64f28fce7cc035a857bb5ed6f51ad6795c8 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@gmail.com> Date: Thu, 19 Oct 2023 19:16:18 +0200 Subject: [PATCH] wip: media: sunxi: sun8i-di: fix race condition Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com> --- .../media/platform/sunxi/sun8i-di/sun8i-di.c | 69 ++++++++++--------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/drivers/media/platform/sunxi/sun8i-di/sun8i-di.c b/drivers/media/platform/sunxi/sun8i-di/sun8i-di.c index 90ab1d77b6a5..f7ff0937828c 100644 --- a/drivers/media/platform/sunxi/sun8i-di/sun8i-di.c +++ b/drivers/media/platform/sunxi/sun8i-di/sun8i-di.c @@ -66,6 +66,7 @@ static void deinterlace_device_run(void *priv) struct vb2_v4l2_buffer *src, *dst; unsigned int hstep, vstep; dma_addr_t addr; + int i; src = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); dst = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); @@ -160,6 +161,26 @@ static void deinterlace_device_run(void *priv) deinterlace_write(dev, DEINTERLACE_CH1_HORZ_FACT, hstep); deinterlace_write(dev, DEINTERLACE_CH1_VERT_FACT, vstep); + /* neutral filter coefficients */ + deinterlace_set_bits(dev, DEINTERLACE_FRM_CTRL, + DEINTERLACE_FRM_CTRL_COEF_ACCESS); + readl_poll_timeout(dev->base + DEINTERLACE_STATUS, val, + val & DEINTERLACE_STATUS_COEF_STATUS, 2, 40); + + for (i = 0; i < 32; i++) { + deinterlace_write(dev, DEINTERLACE_CH0_HORZ_COEF0 + i * 4, + DEINTERLACE_IDENTITY_COEF); + deinterlace_write(dev, DEINTERLACE_CH0_VERT_COEF + i * 4, + DEINTERLACE_IDENTITY_COEF); + deinterlace_write(dev, DEINTERLACE_CH1_HORZ_COEF0 + i * 4, + DEINTERLACE_IDENTITY_COEF); + deinterlace_write(dev, DEINTERLACE_CH1_VERT_COEF + i * 4, + DEINTERLACE_IDENTITY_COEF); + } + + deinterlace_clr_set_bits(dev, DEINTERLACE_FRM_CTRL, + DEINTERLACE_FRM_CTRL_COEF_ACCESS, 0); + deinterlace_clr_set_bits(dev, DEINTERLACE_FIELD_CTRL, DEINTERLACE_FIELD_CTRL_FIELD_CNT_MSK, DEINTERLACE_FIELD_CTRL_FIELD_CNT(ctx->field)); @@ -248,7 +269,6 @@ static irqreturn_t deinterlace_irq(int irq, void *data) static void deinterlace_init(struct deinterlace_dev *dev) { u32 val; - int i; deinterlace_write(dev, DEINTERLACE_BYPASS, DEINTERLACE_BYPASS_CSC); @@ -284,27 +304,7 @@ static void deinterlace_init(struct deinterlace_dev *dev) deinterlace_clr_set_bits(dev, DEINTERLACE_CHROMA_DIFF, DEINTERLACE_CHROMA_DIFF_TH_MSK, - DEINTERLACE_CHROMA_DIFF_TH(5)); - - /* neutral filter coefficients */ - deinterlace_set_bits(dev, DEINTERLACE_FRM_CTRL, - DEINTERLACE_FRM_CTRL_COEF_ACCESS); - readl_poll_timeout(dev->base + DEINTERLACE_STATUS, val, - val & DEINTERLACE_STATUS_COEF_STATUS, 2, 40); - - for (i = 0; i < 32; i++) { - deinterlace_write(dev, DEINTERLACE_CH0_HORZ_COEF0 + i * 4, - DEINTERLACE_IDENTITY_COEF); - deinterlace_write(dev, DEINTERLACE_CH0_VERT_COEF + i * 4, - DEINTERLACE_IDENTITY_COEF); - deinterlace_write(dev, DEINTERLACE_CH1_HORZ_COEF0 + i * 4, - DEINTERLACE_IDENTITY_COEF); - deinterlace_write(dev, DEINTERLACE_CH1_VERT_COEF + i * 4, - DEINTERLACE_IDENTITY_COEF); - } - - deinterlace_clr_set_bits(dev, DEINTERLACE_FRM_CTRL, - DEINTERLACE_FRM_CTRL_COEF_ACCESS, 0); + DEINTERLACE_CHROMA_DIFF_TH(31)); } static inline struct deinterlace_ctx *deinterlace_file2ctx(struct file *file) @@ -929,11 +929,18 @@ static int deinterlace_runtime_resume(struct device *device) return ret; } + ret = reset_control_deassert(dev->rstc); + if (ret) { + dev_err(dev->dev, "Failed to apply reset\n"); + + goto err_exclusive_rate; + } + ret = clk_prepare_enable(dev->bus_clk); if (ret) { dev_err(dev->dev, "Failed to enable bus clock\n"); - goto err_exclusive_rate; + goto err_rst; } ret = clk_prepare_enable(dev->mod_clk); @@ -950,23 +957,16 @@ static int deinterlace_runtime_resume(struct device *device) goto err_mod_clk; } - ret = reset_control_deassert(dev->rstc); - if (ret) { - dev_err(dev->dev, "Failed to apply reset\n"); - - goto err_ram_clk; - } - deinterlace_init(dev); return 0; -err_ram_clk: - clk_disable_unprepare(dev->ram_clk); err_mod_clk: clk_disable_unprepare(dev->mod_clk); err_bus_clk: clk_disable_unprepare(dev->bus_clk); +err_rst: + reset_control_assert(dev->rstc); err_exclusive_rate: clk_rate_exclusive_put(dev->mod_clk); @@ -977,11 +977,12 @@ static int deinterlace_runtime_suspend(struct device *device) { struct deinterlace_dev *dev = dev_get_drvdata(device); - reset_control_assert(dev->rstc); - clk_disable_unprepare(dev->ram_clk); clk_disable_unprepare(dev->mod_clk); clk_disable_unprepare(dev->bus_clk); + + reset_control_assert(dev->rstc); + clk_rate_exclusive_put(dev->mod_clk); return 0; -- 2.42.0 ================================================ FILE: projects/Allwinner/patches/u-boot/0001-Kconfig-Remove-an-impossible-condition.patch ================================================ From 7b4ff873927b131df05449df873cdf91958517a8 Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 9 Oct 2021 10:40:45 -0500 Subject: [PATCH 01/13] Kconfig: Remove an impossible condition ARCH_SUNXI selects BINMAN, so the condition "!BINMAN && ARCH_SUNXI" is impossible. Signed-off-by: Samuel Holland <samuel@sholland.org> --- Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Kconfig b/Kconfig index 931a22806e4e..ede20d74c948 100644 --- a/Kconfig +++ b/Kconfig @@ -359,7 +359,7 @@ config BUILD_TARGET default "u-boot-spl.kwb" if ARCH_MVEBU && SPL default "u-boot-elf.srec" if RCAR_GEN3 default "u-boot.itb" if !BINMAN && SPL_LOAD_FIT && (ARCH_ROCKCHIP || \ - ARCH_SUNXI || RISCV || ARCH_ZYNQMP) + RISCV || ARCH_ZYNQMP) default "u-boot.kwb" if ARCH_KIRKWOOD default "u-boot-with-spl.bin" if ARCH_AT91 && SPL_NAND_SUPPORT default "u-boot-with-spl.imx" if ARCH_MX6 && SPL -- 2.33.0 ================================================ FILE: projects/Allwinner/patches/u-boot/0002-binman-Prevent-entries-in-a-section-from-overlapping.patch ================================================ From a2f92f02abaae9df68759586102438df6f8d5efb Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 9 Oct 2021 10:43:56 -0500 Subject: [PATCH 02/13] binman: Prevent entries in a section from overlapping Currently, if the "offset" property is given for an entry, the section's running offset is completely ignored. This causes entries to overlap if the provided offset is less than the size of the entries earlier in the section. Avoid the overlap by only using the provided offset when it is greater than the running offset. The motivation for this change is the rule used by SPL to find U-Boot on sunxi boards: U-Boot starts 32 KiB after the start of SPL, unless SPL is larger than 32 KiB, in which case U-Boot immediately follows SPL. Signed-off-by: Samuel Holland <samuel@sholland.org> --- tools/binman/entry.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/binman/entry.py b/tools/binman/entry.py index 70222718ea93..61822eb5e44f 100644 --- a/tools/binman/entry.py +++ b/tools/binman/entry.py @@ -404,7 +404,9 @@ class Entry(object): if self.offset_unset: self.Raise('No offset set with offset-unset: should another ' 'entry provide this correct offset?') - self.offset = tools.align(offset, self.align) + elif self.offset > offset: + offset = self.offset + self.offset = tools.align(offset, self.align) needed = self.pad_before + self.contents_size + self.pad_after needed = tools.align(needed, self.align_size) size = self.size -- 2.33.0 ================================================ FILE: projects/Allwinner/patches/u-boot/0003-sunxi-binman-Enable-SPL-FIT-loading-for-32-bit-SoCs.patch ================================================ From 45a9ce4ec981ab55b4a4374879348496877df75d Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 17 Apr 2021 13:33:54 -0500 Subject: [PATCH 03/13] sunxi: binman: Enable SPL FIT loading for 32-bit SoCs Now that Crust (SCP firmware) has support for H3, we need a FIT image to load it. H3 also needs to load a SoC-specific eGon blob to support CPU 0 hotplug. Update the binman description to work on either 32-bit or 64-bit SoCs: - Make BL31 optional, since it is not used on 32-bit SoCs (though BL32 may be used in the future). - Explicitly set the minimum offset of the FIT to 32 KiB, since SPL on some boards is still only 24 KiB large even with FIT support enabled. CONFIG_SPL_PAD_TO cannot be used because it is not defined for H616. FIT unlocks more features (signatures, multiple DTBs, etc.), so enable it by default. A10 (sun4i) only has 24 KiB of SRAM A1, so it needs SPL_FIT_IMAGE_TINY. For simplicity, enable that option everywhere. Signed-off-by: Samuel Holland <samuel@sholland.org> --- arch/arm/Kconfig | 1 + arch/arm/dts/sunxi-u-boot.dtsi | 46 ++++++++++++++++++++++------------ common/spl/Kconfig | 3 +-- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index ebb19272708d..cb321b6afac3 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -1032,6 +1032,7 @@ config ARCH_SUNXI imply SPL_GPIO imply SPL_LIBCOMMON_SUPPORT imply SPL_LIBGENERIC_SUPPORT + imply SPL_LOAD_FIT imply SPL_MMC if MMC imply SPL_POWER imply SPL_SERIAL diff --git a/arch/arm/dts/sunxi-u-boot.dtsi b/arch/arm/dts/sunxi-u-boot.dtsi index 4a6ed3a7dd5c..ad1f97632979 100644 --- a/arch/arm/dts/sunxi-u-boot.dtsi +++ b/arch/arm/dts/sunxi-u-boot.dtsi @@ -1,13 +1,19 @@ #include <config.h> -#ifdef CONFIG_MACH_SUN50I_H6 -#define BL31_ADDR 0x104000 -#define SCP_ADDR 0x114000 +#ifdef CONFIG_ARM64 +#define ARCH "arm64" +#else +#define ARCH "arm" +#endif + +#if defined(CONFIG_MACH_SUN50I) || defined(CONFIG_MACH_SUN50I_H5) +#define BL31_ADDR 0x00044000 +#define SCP_ADDR 0x00050000 +#elif defined(CONFIG_MACH_SUN50I_H6) +#define BL31_ADDR 0x00104000 +#define SCP_ADDR 0x00114000 #elif defined(CONFIG_MACH_SUN50I_H616) -#define BL31_ADDR 0x40000000 -#else -#define BL31_ADDR 0x44000 -#define SCP_ADDR 0x50000 +#define BL31_ADDR 0x40000000 #endif / { @@ -30,30 +36,33 @@ filename = "spl/sunxi-spl.bin"; }; -#ifdef CONFIG_ARM64 +#ifdef CONFIG_SPL_LOAD_FIT fit { - description = "Configuration to load ATF before U-Boot"; + description = "Configuration to load U-Boot and firmware"; + offset = <32768>; #address-cells = <1>; fit,fdt-list = "of-list"; images { uboot { - description = "U-Boot (64-bit)"; + description = "U-Boot"; type = "standalone"; os = "u-boot"; - arch = "arm64"; + arch = ARCH; compression = "none"; load = <CONFIG_SYS_TEXT_BASE>; + entry = <CONFIG_SYS_TEXT_BASE>; u-boot-nodtb { }; }; +#ifdef BL31_ADDR atf { description = "ARM Trusted Firmware"; type = "firmware"; os = "arm-trusted-firmware"; - arch = "arm64"; + arch = ARCH; compression = "none"; load = <BL31_ADDR>; entry = <BL31_ADDR>; @@ -63,6 +72,7 @@ missing-msg = "atf-bl31-sunxi"; }; }; +#endif #ifdef SCP_ADDR scp { @@ -91,19 +101,23 @@ @config-SEQ { description = "NAME"; +#ifdef BL31_ADDR firmware = "atf"; -#ifndef SCP_ADDR - loadables = "uboot"; #else - loadables = "scp", "uboot"; + firmware = "uboot"; #endif + loadables = +#ifdef SCP_ADDR + "scp", +#endif + "uboot"; fdt = "fdt-SEQ"; }; }; }; #else u-boot-img { - offset = <CONFIG_SPL_PAD_TO>; + offset = <32768>; }; #endif }; diff --git a/common/spl/Kconfig b/common/spl/Kconfig index 8a8a971a91e1..374818c05741 100644 --- a/common/spl/Kconfig +++ b/common/spl/Kconfig @@ -442,8 +442,7 @@ config SPL_MD5 config SPL_FIT_IMAGE_TINY bool "Remove functionality from SPL FIT loading to reduce size" depends on SPL_FIT - default y if MACH_SUN50I || MACH_SUN50I_H5 || SUN50I_GEN_H6 - default y if ARCH_IMX8M || ARCH_IMX9 + default y if ARCH_IMX8M || ARCH_IMX9 || ARCH_SUNXI help Enable this to reduce the size of the FIT image loading code in SPL, if space for the SPL binary is very tight. -- 2.33.0 ================================================ FILE: projects/Allwinner/patches/u-boot/0005-sunxi-psci-Avoid-hanging-when-CPU-0-is-hot-unplugged.patch ================================================ From c7bb6bf4bcee8577c3af0e2345c1bdc0925f9468 Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 9 Oct 2021 22:00:22 -0500 Subject: [PATCH 05/13] sunxi: psci: Avoid hanging when CPU 0 is hot-unplugged Do not try to send an SGI from CPU 0 to itself. Since FIQs are masked when entering monitor mode, this will hang. Plus, CPU 0 cannot fully power itself off anyway. Instead, have it turn FIQs back on and continue servicing SGIs from other cores. Signed-off-by: Samuel Holland <samuel@sholland.org> --- arch/arm/cpu/armv7/sunxi/psci.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/arch/arm/cpu/armv7/sunxi/psci.c b/arch/arm/cpu/armv7/sunxi/psci.c index 1ac50f558a40..3448fe2edcaa 100644 --- a/arch/arm/cpu/armv7/sunxi/psci.c +++ b/arch/arm/cpu/armv7/sunxi/psci.c @@ -38,6 +38,15 @@ #define SUN8I_R40_PWR_CLAMP(cpu) (0x120 + (cpu) * 0x4) #define SUN8I_R40_SRAMC_SOFT_ENTRY_REG0 (0xbc) +static inline u32 __secure cp15_read_mpidr(void) +{ + u32 val; + + asm volatile ("mrc p15, 0, %0, c0, c0, 5" : "=r" (val)); + + return val; +} + static void __secure cp15_write_cntp_tval(u32 tval) { asm volatile ("mcr p15, 0, %0, c14, c2, 0" : : "r" (tval)); @@ -281,9 +290,14 @@ s32 __secure psci_cpu_off(void) { psci_cpu_off_common(); - /* Ask CPU0 via SGI15 to pull the rug... */ - writel(BIT(16) | 15, GICD_BASE + GICD_SGIR); - dsb(); + if (cp15_read_mpidr() & 3) { + /* Ask CPU0 via SGI15 to pull the rug... */ + writel(BIT(16) | 15, GICD_BASE + GICD_SGIR); + dsb(); + } else { + /* Unmask FIQs to service SGI15. */ + asm volatile ("cpsie f"); + } /* Wait to be turned off */ while (1) -- 2.33.0 ================================================ FILE: projects/Allwinner/patches/u-boot/0008-remoteproc-Add-a-driver-for-the-Allwinner-AR100.patch ================================================ From 9f1a0739ddd535b25fe07f7be9cc18aeaa5181c7 Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 9 Oct 2021 14:58:27 -0500 Subject: [PATCH 08/13] remoteproc: Add a driver for the Allwinner AR100 Signed-off-by: Samuel Holland <samuel@sholland.org> --- drivers/remoteproc/Kconfig | 9 ++ drivers/remoteproc/Makefile | 1 + drivers/remoteproc/sun6i_ar100_rproc.c | 111 +++++++++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 drivers/remoteproc/sun6i_ar100_rproc.c diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig index 24e536463bbd..9789623ebee5 100644 --- a/drivers/remoteproc/Kconfig +++ b/drivers/remoteproc/Kconfig @@ -41,6 +41,15 @@ config REMOTEPROC_STM32_COPRO Say 'y' here to add support for STM32 Cortex-M4 coprocessors via the remoteproc framework. +config REMOTEPROC_SUN6I_AR100 + bool "Support for Allwinner AR100 SCP" + select REMOTEPROC + depends on ARCH_SUNXI + help + Say 'y' here to support Allwinner's AR100 System Control Processor + (SCP), found in various sun6i/sun8i/sun50i family SoCs, through the + remoteproc framework. + config REMOTEPROC_TI_K3_ARM64 bool "Support for TI's K3 based ARM64 remoteproc driver" select REMOTEPROC diff --git a/drivers/remoteproc/Makefile b/drivers/remoteproc/Makefile index f0e83451d66f..022e64f2053e 100644 --- a/drivers/remoteproc/Makefile +++ b/drivers/remoteproc/Makefile @@ -10,6 +10,7 @@ obj-$(CONFIG_$(SPL_)REMOTEPROC) += rproc-uclass.o rproc-elf-loader.o obj-$(CONFIG_K3_SYSTEM_CONTROLLER) += k3_system_controller.o obj-$(CONFIG_REMOTEPROC_SANDBOX) += sandbox_testproc.o obj-$(CONFIG_REMOTEPROC_STM32_COPRO) += stm32_copro.o +obj-$(CONFIG_REMOTEPROC_SUN6I_AR100) += sun6i_ar100_rproc.o obj-$(CONFIG_REMOTEPROC_TI_K3_ARM64) += ti_k3_arm64_rproc.o obj-$(CONFIG_REMOTEPROC_TI_K3_DSP) += ti_k3_dsp_rproc.o obj-$(CONFIG_REMOTEPROC_TI_K3_R5F) += ti_k3_r5f_rproc.o diff --git a/drivers/remoteproc/sun6i_ar100_rproc.c b/drivers/remoteproc/sun6i_ar100_rproc.c new file mode 100644 index 000000000000..c94f6c752bdd --- /dev/null +++ b/drivers/remoteproc/sun6i_ar100_rproc.c @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include <dm.h> +#include <errno.h> +#include <remoteproc.h> +#include <asm/io.h> + +#define SUNXI_SCP_MAGIC 0xb4400012 + +#define OR1K_VEC_FIRST 0x01 +#define OR1K_VEC_LAST 0x0e +#define OR1K_VEC_ADDR(n) (0x100 * (n)) + +struct sun6i_ar100_rproc_priv { + void *cfg_base; + ulong sram_base; +}; + +static int sun6i_ar100_rproc_load(struct udevice *dev, ulong addr, ulong size) +{ + struct sun6i_ar100_rproc_priv *priv = dev_get_priv(dev); + + /* Check for a valid SCP firmware. */ + if (readl_relaxed(addr) != SUNXI_SCP_MAGIC) + return -ENOENT; + + /* Program exception vectors to the firmware entry point. */ + for (u32 i = OR1K_VEC_FIRST; i <= OR1K_VEC_LAST; ++i) { + ulong vector = priv->sram_base + OR1K_VEC_ADDR(i); + ulong offset = addr - vector; + + writel_relaxed(offset >> 2, vector); + } + + return 0; +} + +static int sun6i_ar100_rproc_start(struct udevice *dev) +{ + struct sun6i_ar100_rproc_priv *priv = dev_get_priv(dev); + + setbits_le32(priv->cfg_base, BIT(0)); + + return 0; +} + +static int sun6i_ar100_rproc_stop(struct udevice *dev) +{ + struct sun6i_ar100_rproc_priv *priv = dev_get_priv(dev); + + clrbits_le32(priv->cfg_base, BIT(0)); + + return 0; +} + +static int sun6i_ar100_rproc_reset(struct udevice *dev) +{ + int ret; + + ret = sun6i_ar100_rproc_stop(dev); + if (ret) + return ret; + + return sun6i_ar100_rproc_start(dev); +} + +static int sun6i_ar100_rproc_is_running(struct udevice *dev) +{ + struct sun6i_ar100_rproc_priv *priv = dev_get_priv(dev); + + return !(readl_relaxed(priv->cfg_base) & BIT(0)); +} + +static const struct dm_rproc_ops sun6i_ar100_rproc_ops = { + .load = sun6i_ar100_rproc_load, + .start = sun6i_ar100_rproc_start, + .stop = sun6i_ar100_rproc_stop, + .reset = sun6i_ar100_rproc_reset, + .is_running = sun6i_ar100_rproc_is_running, +}; + +static int sun6i_ar100_rproc_probe(struct udevice *dev) +{ + struct sun6i_ar100_rproc_priv *priv = dev_get_priv(dev); + struct ofnode_phandle_args sram_handle; + int ret; + + priv->cfg_base = dev_read_addr_ptr(dev); + + ret = dev_read_phandle_with_args(dev, "sram", NULL, 0, 0, &sram_handle); + if (ret) + return ret; + + priv->sram_base = ofnode_get_addr(sram_handle.node); + + return 0; +} + +static const struct udevice_id sun6i_ar100_rproc_ids[] = { + { .compatible = "allwinner,sun6i-a31-ar100" }, + { } +}; + +U_BOOT_DRIVER(sun6i_ar100_rproc) = { + .name = "sun6i_ar100_rproc", + .id = UCLASS_REMOTEPROC, + .of_match = sun6i_ar100_rproc_ids, + .probe = sun6i_ar100_rproc_probe, + .priv_auto = sizeof(struct sun6i_ar100_rproc_priv), + .ops = &sun6i_ar100_rproc_ops, +}; -- 2.33.0 ================================================ FILE: projects/Allwinner/patches/u-boot/0009-arm-dts-sunxi-h3-Add-nodes-for-AR100-remoteproc.patch ================================================ From 910c452284dfbc086d9dfb18feb1b6c1b95f2eeb Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 9 Oct 2021 15:04:16 -0500 Subject: [PATCH 09/13] arm: dts: sunxi: h3: Add nodes for AR100 remoteproc Signed-off-by: Samuel Holland <samuel@sholland.org> --- arch/arm/dts/sun8i-h3.dtsi | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/arch/arm/dts/sun8i-h3.dtsi b/arch/arm/dts/sun8i-h3.dtsi index 4e89701df91f..076f0716da46 100644 --- a/arch/arm/dts/sun8i-h3.dtsi +++ b/arch/arm/dts/sun8i-h3.dtsi @@ -170,6 +170,14 @@ #size-cells = <1>; ranges; + sram_a2: sram@40000 { + compatible = "mmio-sram"; + reg = <0x00040000 0xc000>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x00040000 0xc000>; + }; + sram_c: sram@1d00000 { compatible = "mmio-sram"; reg = <0x01d00000 0x80000>; @@ -239,6 +247,12 @@ nvmem-cell-names = "calibration"; #thermal-sensor-cells = <0>; }; + + remoteproc@1f01c00 { + compatible = "allwinner,sun6i-a31-ar100"; + reg = <0x01f01c00 0x400>; + sram = <&sram_a2>; + }; }; thermal-zones { -- 2.33.0 ================================================ FILE: projects/Allwinner/patches/u-boot/0010-sunxi-Add-OrangePi-3-LTS-board.patch ================================================ From 65a3bafb3f5a8c83b678b59cb4b7bb87d12e7cd0 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@gmail.com> Date: Tue, 7 Feb 2023 17:43:14 +0100 Subject: [PATCH] sunxi: Add OrangePi 3 LTS board Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com> --- arch/arm/dts/Makefile | 1 + arch/arm/dts/sun50i-h6-orangepi-3-lts.dts | 313 ++++++++++++++++++++++ configs/orangepi_3_lts_defconfig | 19 ++ 3 files changed, 333 insertions(+) create mode 100644 arch/arm/dts/sun50i-h6-orangepi-3-lts.dts create mode 100644 configs/orangepi_3_lts_defconfig diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index 965895bc2a3c..501400635fa9 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile @@ -702,6 +702,7 @@ dtb-$(CONFIG_MACH_SUN50I_H5) += \ dtb-$(CONFIG_MACH_SUN50I_H6) += \ sun50i-h6-beelink-gs1.dtb \ sun50i-h6-orangepi-3.dtb \ + sun50i-h6-orangepi-3-lts.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-lts.dts b/arch/arm/dts/sun50i-h6-orangepi-3-lts.dts new file mode 100644 index 000000000000..6a5df1103a90 --- /dev/null +++ b/arch/arm/dts/sun50i-h6-orangepi-3-lts.dts @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +// Copyright (C) 2023 Jernej Skrabec <jernej.skrabec@gmail.com> +// Based on sun50i-h6-orangepi-3.dts, which is: +// Copyright (C) 2019 Ondřej Jirman <megous@megous.com> + +/dts-v1/; + +#include "sun50i-h6.dtsi" +#include "sun50i-h6-cpu-opp.dtsi" + +#include <dt-bindings/gpio/gpio.h> + +/ { + model = "OrangePi 3 LTS"; + compatible = "xunlong,orangepi-3-lts", "allwinner,sun50i-h6"; + + aliases { + ethernet0 = &emac; + serial0 = &uart0; + }; + + chosen { + stdout-path = "serial0:115200n8"; + }; + + connector { + compatible = "hdmi-connector"; + ddc-en-gpios = <&pio 7 2 GPIO_ACTIVE_HIGH>; /* PH2 */ + type = "a"; + + port { + hdmi_con_in: endpoint { + remote-endpoint = <&hdmi_out_con>; + }; + }; + }; + + ext_osc32k: ext_osc32k_clk { + #clock-cells = <0>; + compatible = "fixed-clock"; + clock-frequency = <32768>; + clock-output-names = "ext_osc32k"; + }; + + leds { + compatible = "gpio-leds"; + + led-0 { + label = "orangepi:red:power"; + gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */ + default-state = "on"; + }; + + led-1 { + label = "orangepi:green:status"; + gpios = <&r_pio 0 7 GPIO_ACTIVE_HIGH>; /* PL7 */ + }; + }; + + reg_gmac_3v3: gmac-3v3 { + compatible = "regulator-fixed"; + regulator-name = "gmac-3v3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + startup-delay-us = <150000>; + enable-active-high; + gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */ + }; + + 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>; +}; + +&de { + status = "okay"; +}; + +&dwc3 { + 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_3v3>; + allwinner,rx-delay-ps = <200>; + allwinner,tx-delay-ps = <300>; + status = "okay"; +}; + +&gpu { + mali-supply = <®_dcdcc>; + status = "okay"; +}; + +&hdmi { + hvcc-supply = <®_bldo2>; + 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 { + vmmc-supply = <®_cldo1>; + vqmmc-supply = <®_bldo2>; + cap-mmc-hw-reset; + non-removable; + bus-width = <8>; + status = "okay"; +}; + +&ohci0 { + status = "okay"; +}; + +&ohci3 { + status = "okay"; +}; + +&pio { + vcc-pc-supply = <®_bldo2>; + vcc-pd-supply = <®_cldo1>; + vcc-pg-supply = <®_bldo3>; +}; + +&r_ir { + status = "okay"; +}; + +&r_i2c { + status = "okay"; + + axp805: pmic@36 { + compatible = "x-powers,axp805", "x-powers,axp806"; + reg = <0x36>; + interrupt-parent = <&r_intc>; + interrupts = <GIC_SPI 96 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-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-name = "vcc-efuse-pcie-hdmi-pc"; + }; + + reg_bldo3: bldo3 { + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-name = "vcc-pm-pg-dcxoio-wifi"; + }; + + 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-ramp-delay = <2500>; + regulator-name = "vdd-cpu"; + }; + + reg_dcdcc: dcdcc { + regulator-enable-ramp-delay = <32000>; + regulator-min-microvolt = <810000>; + regulator-max-microvolt = <1080000>; + regulator-ramp-delay = <2500>; + 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 */ + }; + }; + }; +}; + +&rtc { + clocks = <&ext_osc32k>; +}; + +&uart0 { + pinctrl-names = "default"; + pinctrl-0 = <&uart0_ph_pins>; + status = "okay"; +}; + +&usb2otg { + 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"; +}; + +&usb3phy { + status = "okay"; +}; diff --git a/configs/orangepi_3_lts_defconfig b/configs/orangepi_3_lts_defconfig new file mode 100644 index 000000000000..41a9af4ef67a --- /dev/null +++ b/configs/orangepi_3_lts_defconfig @@ -0,0 +1,19 @@ +CONFIG_ARM=y +CONFIG_ARCH_SUNXI=y +CONFIG_DEFAULT_DEVICE_TREE="sun50i-h6-orangepi-3-lts" +CONFIG_SPL=y +CONFIG_MACH_SUN50I_H6=y +CONFIG_SUNXI_DRAM_H6_LPDDR3=y +CONFIG_MMC0_CD_PIN="PF6" +CONFIG_MMC_SUNXI_SLOT_EXTRA=2 +# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set +CONFIG_SPL_STACK=0x118000 +CONFIG_SYS_PBSIZE=1024 +CONFIG_SYS_BOOTM_LEN=0x2000000 +CONFIG_PHY_SUN50I_USB3=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_DWC3=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_DWC3=y +# CONFIG_USB_DWC3_GADGET is not set -- 2.39.1 ================================================ FILE: projects/Allwinner/patches/u-boot/0011-arm-psci-Add-definitions-for-PSCI-v1.1.patch ================================================ From 7719c6f06b698b3a32248dea61710f222ee8d7a1 Mon Sep 17 00:00:00 2001 From: Samuel Holland <samuel@sholland.org> Date: Sat, 9 Oct 2021 22:43:26 -0500 Subject: [PATCH 11/13] arm: psci: Add definitions for PSCI v1.1 Add the new option, function IDs, and prototypes for PSCI v1.1 implementations. In the process, fix some issues with the existing definitions: - Fix the incorrectly-named ARM_PSCI_0_2_FN64_SYSTEM_RESET2. - Replace the deprecated "affinity_level" naming with "power_level". Signed-off-by: Samuel Holland <samuel@sholland.org> --- arch/arm/cpu/armv7/Kconfig | 3 +++ arch/arm/cpu/armv8/fwcall.c | 2 +- arch/arm/include/asm/psci.h | 9 +++++++-- arch/arm/include/asm/system.h | 14 +++++++++----- arch/arm/lib/psci-dt.c | 2 ++ 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/arch/arm/cpu/armv7/Kconfig b/arch/arm/cpu/armv7/Kconfig index 60bb0a9e1ec4..06b477619334 100644 --- a/arch/arm/cpu/armv7/Kconfig +++ b/arch/arm/cpu/armv7/Kconfig @@ -49,6 +49,9 @@ choice help Select the supported PSCI version. +config ARMV7_PSCI_1_1 + bool "PSCI V1.1" + config ARMV7_PSCI_1_0 bool "PSCI V1.0" diff --git a/arch/arm/cpu/armv8/fwcall.c b/arch/arm/cpu/armv8/fwcall.c index 16914dc1eed6..87de09979b18 100644 --- a/arch/arm/cpu/armv8/fwcall.c +++ b/arch/arm/cpu/armv8/fwcall.c @@ -103,7 +103,7 @@ void __noreturn psci_system_reset2(u32 reset_level, u32 cookie) { struct pt_regs regs; - regs.regs[0] = ARM_PSCI_0_2_FN64_SYSTEM_RESET2; + regs.regs[0] = ARM_PSCI_1_1_FN64_SYSTEM_RESET2; regs.regs[1] = PSCI_RESET2_TYPE_VENDOR | reset_level; regs.regs[2] = cookie; if (use_smc_for_psci) diff --git a/arch/arm/include/asm/psci.h b/arch/arm/include/asm/psci.h index 67e9234066b0..aa351867eee7 100644 --- a/arch/arm/include/asm/psci.h +++ b/arch/arm/include/asm/psci.h @@ -22,8 +22,9 @@ #include <linux/bitops.h> #endif -#define ARM_PSCI_VER_1_0 (0x00010000) #define ARM_PSCI_VER_0_2 (0x00000002) +#define ARM_PSCI_VER_1_0 (0x00010000) +#define ARM_PSCI_VER_1_1 (0x00010001) /* PSCI 0.1 interface */ #define ARM_PSCI_FN_BASE 0x95c1ba5e @@ -68,7 +69,6 @@ #define ARM_PSCI_0_2_FN64_AFFINITY_INFO ARM_PSCI_0_2_FN64(4) #define ARM_PSCI_0_2_FN64_MIGRATE ARM_PSCI_0_2_FN64(5) #define ARM_PSCI_0_2_FN64_MIGRATE_INFO_UP_CPU ARM_PSCI_0_2_FN64(7) -#define ARM_PSCI_0_2_FN64_SYSTEM_RESET2 ARM_PSCI_0_2_FN64(18) /* PSCI 1.0 interface */ #define ARM_PSCI_1_0_FN_PSCI_FEATURES ARM_PSCI_0_2_FN(10) @@ -86,6 +86,11 @@ #define ARM_PSCI_1_0_FN64_STAT_RESIDENCY ARM_PSCI_0_2_FN64(16) #define ARM_PSCI_1_0_FN64_STAT_COUNT ARM_PSCI_0_2_FN64(17) +/* PSCI 1.1 interface */ +#define ARM_PSCI_1_1_FN_SYSTEM_RESET2 ARM_PSCI_0_2_FN(18) + +#define ARM_PSCI_1_1_FN64_SYSTEM_RESET2 ARM_PSCI_0_2_FN64(18) + /* 1KB stack per core */ #define ARM_PSCI_STACK_SHIFT 10 #define ARM_PSCI_STACK_SIZE (1 << ARM_PSCI_STACK_SHIFT) diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index f75eea16b36c..02effcc6cc38 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h @@ -556,17 +556,21 @@ void mmu_page_table_flush(unsigned long start, unsigned long stop); #ifdef CONFIG_ARMV7_PSCI void psci_arch_cpu_entry(void); void psci_arch_init(void); + u32 psci_version(void); -s32 psci_features(u32 function_id, u32 psci_fid); +s32 psci_cpu_suspend(u32 function_id, u32 power_state, u32 pc, u32 context_id); s32 psci_cpu_off(void); -s32 psci_cpu_on(u32 function_id, u32 target_cpu, u32 pc, - u32 context_id); -s32 psci_affinity_info(u32 function_id, u32 target_affinity, - u32 lowest_affinity_level); +s32 psci_cpu_on(u32 function_id, u32 target_cpu, u32 pc, u32 context_id); +s32 psci_affinity_info(u32 function_id, u32 target_affinity, u32 power_level); u32 psci_migrate_info_type(void); void psci_system_off(void); void psci_system_reset(void); +s32 psci_features(u32 function_id, u32 psci_fid); +s32 psci_cpu_default_suspend(u32 function_id, u32 pc, u32 context_id); +s32 psci_node_hw_state(u32 function_id, u32 target_cpu, u32 power_level); +s32 psci_system_suspend(u32 function_id, u32 pc, u32 context_id); +s32 psci_system_reset2(u32 function_id, u32 reset_type, u32 cookie); #endif #endif /* __ASSEMBLY__ */ diff --git a/arch/arm/lib/psci-dt.c b/arch/arm/lib/psci-dt.c index 903b3357048a..ea9d1c8355c2 100644 --- a/arch/arm/lib/psci-dt.c +++ b/arch/arm/lib/psci-dt.c @@ -66,6 +66,8 @@ int fdt_psci(void *fdt) init_psci_node: #if CONFIG_IS_ENABLED(ARMV8_SEC_FIRMWARE_SUPPORT) psci_ver = sec_firmware_support_psci_version(); +#elif defined(CONFIG_ARMV7_PSCI_1_1) + psci_ver = ARM_PSCI_VER_1_1; #elif defined(CONFIG_ARMV7_PSCI_1_0) || defined(CONFIG_ARMV8_PSCI) psci_ver = ARM_PSCI_VER_1_0; #elif defined(CONFIG_ARMV7_PSCI_0_2) -- 2.33.0 ================================================ FILE: projects/Allwinner/patches/u-boot/0012-DO-NOT-MERGE-sunxi-Enable-remoteproc-on-H3.patch ================================================ From 3fe205fc0e4c81cddbd3b7adacf29e0819f3672f Mon Sep 17 00:00:00 2001 From: Jernej Skrabec <jernej.skrabec@gmail.com> Date: Tue, 12 Oct 2021 20:45:10 +0200 Subject: [PATCH] [DO NOT MERGE] sunxi: Enable remoteproc on H3 Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com> --- arch/arm/mach-sunxi/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig index 1d4a4fdd0c59..4414b847b7e4 100644 --- a/arch/arm/mach-sunxi/Kconfig +++ b/arch/arm/mach-sunxi/Kconfig @@ -295,6 +295,7 @@ config MACH_SUN8I_H3 select CPU_V7_HAS_VIRT select ARCH_SUPPORT_PSCI select MACH_SUNXI_H3_H5 + select REMOTEPROC_SUN6I_AR100 select ARMV7_BOOT_SEC_DEFAULT if OLD_SUNXI_KERNEL_COMPAT config MACH_SUN8I_R40 -- 2.33.0 ================================================ FILE: projects/Allwinner/patches/u-boot/0013-sunxi-mmc-increase-stabilization-delay-from-1ms-to-20ms.patch ================================================ From: Da Xue <da@libre.computer> Date: Thu, 21 Jul 2022 18:08:21 -0400 Some users experienced problems booting u-boot from SPL hanging here: Trying to boot from MMC1 or Trying to boot from MMC2 This seems to occur with both MicroSD and eMMC modules on ALL-H3-CC. Increasing the delay after mmc reset fixes these boot problems. Some MicroSD cards are impacted more than others so it is possible that MicroSD internals need time to stabilize. Below is some failure data. sandisk ultra 64gb 9/20 with 1ms, 20/20 with 10ms sandisk ultra 16gb 2/20 with 1ms, 20/20 with 10ms sandisk extreme 16gb 6/20 with 10ms, 20/20 with 20ms A quick comparison of schematics show series resistors for ESD protection on the MicroSD GPIOs not present on all H3/H5 boards. It is not known if this is related to the issue. This patch adds a fixed 20ms delay to mmc init to mitigate the problem. If boot time optimization is required and the platform does not require the delay. The delay can be replaced with: writel(SUNXI_MMC_GCTRL_RESET, &priv->reg->gctrl); if (wait_for_bit_le32( &priv->reg->gctrl, SUNXI_MMC_GCTRL_RESET, false, 20, false)) { printf("%s: Timeout\n", __func__); return -ETIMEDOUT; } Signed-off-by: Da Xue <da@libre.computer> --- drivers/mmc/sunxi_mmc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c index 1bb7b6d0e9..f7942b69ce 100644 --- a/drivers/mmc/sunxi_mmc.c +++ b/drivers/mmc/sunxi_mmc.c @@ -297,7 +297,7 @@ static int sunxi_mmc_core_init(struct mmc *mmc) /* Reset controller */ writel(SUNXI_MMC_GCTRL_RESET, &priv->reg->gctrl); - udelay(1000); + udelay(20000); return 0; } ================================================ FILE: projects/Allwinner/patches/u-boot/0014-sunxi-dram-Fix-incorrect-ram-size-detection-for-some-H6-boards.patch ================================================ From: Gunjan Gupta <viraniac@gmail.com> Subject: [PATCH 1/1] sunxi: dram: Fix incorrect ram size detection for some H6 boards Date: Sun, 1 Oct 2023 21:43:32 +0530 On some H6 boards like Orange Pi 3 LTS, some times U-Boot fails to detect ram size correctly. Instead of 2GB thats available, it detects 4GB of ram and then SPL just hangs there making board not to boot further. On debugging, I found that the rows value were being determined correctly, but columns were sometimes off by one value. I found that adding some delay after the mctl_core_init call along with making use of dsb in the start of the mctl_mem_matches solves the issue. Signed-off-by: Gunjan Gupta <viraniac@gmail.com> --- arch/arm/mach-sunxi/dram_helpers.c | 1 + arch/arm/mach-sunxi/dram_sun50i_h6.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/arch/arm/mach-sunxi/dram_helpers.c b/arch/arm/mach-sunxi/dram_helpers.c index cdf2750f1c..5758c58e07 100644 --- a/arch/arm/mach-sunxi/dram_helpers.c +++ b/arch/arm/mach-sunxi/dram_helpers.c @@ -32,6 +32,7 @@ void mctl_await_completion(u32 *reg, u32 mask, u32 val) #ifndef CONFIG_MACH_SUNIV bool mctl_mem_matches(u32 offset) { + dsb(); /* Try to write different values to RAM at two addresses */ writel(0, CFG_SYS_SDRAM_BASE); writel(0xaa55aa55, (ulong)CFG_SYS_SDRAM_BASE + offset); diff --git a/arch/arm/mach-sunxi/dram_sun50i_h6.c b/arch/arm/mach-sunxi/dram_sun50i_h6.c index bff2e42513..a031a845f5 100644 --- a/arch/arm/mach-sunxi/dram_sun50i_h6.c +++ b/arch/arm/mach-sunxi/dram_sun50i_h6.c @@ -623,6 +623,8 @@ static void mctl_auto_detect_dram_size(struct dram_para *para) para->cols = 11; mctl_core_init(para); + udelay(50); + for (para->cols = 8; para->cols < 11; para->cols++) { /* 8 bits per byte and 16/32 bit width */ if (mctl_mem_matches(1 << (para->cols + 1 + ================================================ FILE: projects/Amlogic/README.md ================================================ # Amlogic This project is for Amlogic SoC devices ## Links * http://linux-meson.com ## Useful debug commands * `cat /sys/kernel/debug/cec/cec0/status` * `cat /sys/kernel/debug/clk/clk_summary` * `cat /sys/class/drm/card0-HDMI-A-1/status` * `hexdump -C /sys/class/drm/card0-HDMI-A-1/edid` * `edid-decode /sys/class/drm/card0-HDMI-A-1/edid` * `cat /sys/kernel/debug/dma_buf/bufinfo` ================================================ FILE: projects/Amlogic/bootloader/box.ini ================================================ WETEK-UBOOT-CONFIG # This is a helper file for WeTek Hub and Play2 devices. # It is not used and safe to delete on every other device. fatload mmc 0 1020000 s905_autoscript autoscr 1020000 ================================================ FILE: projects/Amlogic/bootloader/canupdate.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) # detect legacy kernel installs and abort to prevent upgrades case $(uname -r) in 3.14*|4.9*) echo "Updates from Amlogic vendor kernels are not supported!" sleep 10 exit 1 ;; esac # allow upgrades between aarch64 and arm images PROJECT=$("$1" | cut -d. -f1) if [ "$1" = "${PROJECT}.aarch64" -o "$1" = "${PROJECT}.arm" ]; then exit 0 else exit 1 fi ================================================ FILE: projects/Amlogic/bootloader/config ================================================ CONFIG_LZ4=y CONFIG_LZO=y CONFIG_LZMA=y CONFIG_BOOTDELAY=0 CONFIG_EFI_LOADER=n ================================================ FILE: projects/Amlogic/bootloader/install ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) echo "${BOOTLOADER}: creating u-boot.bin" DESTDIR="${PKG_BUILD}/fip" mkdir -p "${DESTDIR}" FIPDIR="$(get_build_dir amlogic-boot-fip)" case "${UBOOT_SYSTEM}" in box|"") # no-op, use vendor booloader ;; *) mkdir "${DESTDIR}/tmp" (cd "${FIPDIR}" || exit; ./build-fip.sh "${UBOOT_SYSTEM}" "$(get_build_dir "${BOOTLOADER}")/u-boot.bin" "${DESTDIR}" "${DESTDIR}/tmp") rm -fr "${DESTDIR}/tmp" ;; esac # Clean up after previous build rm -rf "${INSTALL}"/usr/share/bootloader/boot.ini rm -rf "${INSTALL}"/usr/share/bootloader/u-boot* # Install u-boot mkdir -p "${INSTALL}/usr/share/bootloader" if [ "${UBOOT_SYSTEM}" != "box" ]; then if [ -f "${DESTDIR}/u-boot.bin.sd.bin" ]; then cp -av "${DESTDIR}/u-boot.bin.sd.bin" "${INSTALL}/usr/share/bootloader" # If target/u-boot exists, cache the signed bin [ -d "${ROOT}/target/u-boot" ] && cp -av "${DESTDIR}/u-boot.bin.sd.bin" "${ROOT}/target/u-boot/u-boot.bin.sd.bin-${UBOOT_SYSTEM}" fi if [ -f "${DESTDIR}/u-boot.bin" ]; then cp -av "${DESTDIR}/u-boot.bin" "${INSTALL}/usr/share/bootloader" # If target/u-boot exists, cache the signed bin [ -d "${ROOT}/target/u-boot" ] && cp -av "${DESTDIR}/u-boot.bin" "${ROOT}/target/u-boot/u-boot.bin-${UBOOT_SYSTEM}" fi fi # Install boot.ini if it exists if find_file_path bootloader/"${UBOOT_SYSTEM}".ini; then cp -av "${FOUND_PATH}" "${INSTALL}/usr/share/bootloader/boot.ini" fi ================================================ FILE: projects/Amlogic/bootloader/mkimage ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) . config/options "" mkimage_uboot(){ echo "image: writing u-boot to $(basename $DISK)" dd if="$INSTALL/usr/share/bootloader/u-boot.bin.sd.bin" of="$DISK" conv=fsync,notrunc bs=1 count=440 >"$SAVE_ERROR" 2>&1 || show_error dd if="$INSTALL/usr/share/bootloader/u-boot.bin.sd.bin" of="$DISK" conv=fsync,notrunc bs=512 skip=1 seek=1 >"$SAVE_ERROR" 2>&1 || show_error } mkimage_autoscripts(){ echo "image: copying autoscript files" mcopy -s -o ${RELEASE_DIR}/3rdparty/bootloader/*script :: mcopy -s -o ${RELEASE_DIR}/3rdparty/bootloader/*.scr :: touch "$RELEASE_DIR/3rdparty/bootloader/aml_autoscript.zip" } mkimage_bootini(){ if [ -f ${RELEASE_DIR}/3rdparty/bootloader/boot.ini ]; then echo "image: copying boot.ini" mcopy -s -o ${RELEASE_DIR}/3rdparty/bootloader/boot.ini :: fi } mkimage_uEnv(){ echo "image: creating uEnv.ini" cat << EOF > "${LE_TMP}/uEnv.ini" dtb_name=/dtb/${DTB} bootargs=boot=UUID=${UUID_SYSTEM} disk=UUID=${UUID_STORAGE} quiet ${EXTRA_CMDLINE} EOF mcopy -s "${LE_TMP}/uEnv.ini" :: } mkimage_extlinux(){ echo "image: copying exlinux.conf" mkdir -p "${LE_TMP}/extlinux" cat << EOF > "${LE_TMP}/extlinux/extlinux.conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDT /${DTB} APPEND boot=LABEL=${DISTRO_BOOTLABEL} disk=LABEL=${DISTRO_DISKLABEL} quiet ${EXTRA_CMDLINE} EOF mcopy -s -o "${LE_TMP}/extlinux" :: } mkimage_extlinux_fdtdir(){ echo "image: copying exlinux.conf" mkdir -p "${LE_TMP}/extlinux" cat << EOF > "${LE_TMP}/extlinux/extlinux.conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDTDIR / APPEND boot=LABEL=${DISTRO_BOOTLABEL} disk=LABEL=${DISTRO_DISKLABEL} quiet ${EXTRA_CMDLINE} EOF mcopy -s -o "${LE_TMP}/extlinux" :: } mkimage_dtb(){ if [ "$DTB" != "@@DTB_NAME@@" ]; then echo "image: copying device tree" mcopy -s -o "${RELEASE_DIR}/3rdparty/bootloader/dtb/$DTB" :: if [ "$DTB" = "meson-g12b-odroid-n2.dtb" ]; then mcopy -s -o "${RELEASE_DIR}/3rdparty/bootloader/dtb/meson-g12b-odroid-n2-plus.dtb" :: elif [ "$DTB" = "meson-g12b-gtking.dtb" ]; then mcopy -s -o "${RELEASE_DIR}/3rdparty/bootloader/dtb/meson-g12b-gtking-pro.dtb" :: mcopy -s -o "${RELEASE_DIR}/3rdparty/bootloader/dtb/meson-g12b-gsking-x.dtb" :: elif [ "$DTB" = "meson-gxl-s905x-libretech-cc.dtb" ]; then mcopy -s -o "${RELEASE_DIR}/3rdparty/bootloader/dtb/meson-gxl-s905x-libretech-cc-v2.dtb" :: elif [ "$DTB" = "meson-sm1-odroid-c4.dtb" ]; then mcopy -s -o "${RELEASE_DIR}/3rdparty/bootloader/dtb/meson-sm1-odroid-hc4.dtb" :: fi else echo "image: copying device trees" mcopy -s -o "${RELEASE_DIR}/3rdparty/bootloader/dtb" :: fi } case "${UBOOT_SYSTEM}" in box|"") DTB="@@DTB_NAME@@" mkimage_uEnv mkimage_autoscripts mkimage_bootini mkimage_dtb ;; odroid-n2|odroid-c4) mkimage_uboot mkimage_extlinux_fdtdir mkimage_dtb ;; bananapi*|khadas*|lafrite|lepotato|nanopi-k2|odroid*|radxa*|wetek*) mkimage_uboot mkimage_extlinux mkimage_dtb ;; *) mkimage_uEnv mkimage_autoscripts mkimage_bootini mkimage_extlinux mkimage_uboot mkimage_dtb ;; esac ================================================ FILE: projects/Amlogic/bootloader/release ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) SRCDIR="$BUILD/image/system/usr/share/bootloader" DSTDIR="$RELEASE_DIR/3rdparty/bootloader" mkdir -p "$DSTDIR" cp -a "$SRCDIR"/*.scr "$SRCDIR"/*script "$DSTDIR" if find_file_path "bootloader/${UBOOT_SYSTEM}.ini"; then cp -av "${FOUND_PATH}" "$DSTDIR/boot.ini" fi mkdir -p "$DSTDIR/dtb" case ${DEVICE:-$PROJECT} in AMLGX) cp -a "$SRCDIR"/*gxbb*.dtb "$DSTDIR/dtb" cp -a "$SRCDIR"/*gxl*.dtb "$DSTDIR/dtb" cp -a "$SRCDIR"/*gxm*.dtb "$DSTDIR/dtb" cp -a "$SRCDIR"/*g12a*.dtb "$DSTDIR/dtb" cp -a "$SRCDIR"/*g12b*.dtb "$DSTDIR/dtb" cp -a "$SRCDIR"/*sm1*.dtb "$DSTDIR/dtb" ;; esac ================================================ FILE: projects/Amlogic/bootloader/scripts/aml_autoscript.src ================================================ defenv setenv bootcmd 'run start_autoscript; run storeboot' setenv start_autoscript 'mmcinfo && run start_mmc_autoscript; usb start && run start_usb_autoscript; run start_emmc_autoscript' setenv start_emmc_autoscript 'fatload mmc 1 1020000 emmc_autoscript && autoscr 1020000' setenv start_mmc_autoscript 'fatload mmc 0 1020000 s905_autoscript && autoscr 1020000' setenv start_usb_autoscript 'for usbdev in 0 1 2 3; do fatload usb ${usbdev} 1020000 s905_autoscript && autoscr 1020000; done' setenv system_part b setenv upgrade_step 2 saveenv sleep 1 reboot ================================================ FILE: projects/Amlogic/bootloader/scripts/boot.scr.src ================================================ load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ${prefix}uEnv.ini && env import -t ${kernel_addr_r} ${filesize} load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ${prefix}KERNEL load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${dtb_name} bootm ${kernel_addr_r} - ${fdt_addr_r} ================================================ FILE: projects/Amlogic/bootloader/scripts/emmc_autoscript.src ================================================ setenv env_addr 0x1040000 setenv boot_start 'bootm ${loadaddr} - ${dtb_mem_addr}' setenv addmac 'if printenv mac; then setenv bootargs ${bootargs} mac=${mac}; elif printenv eth_mac; then setenv bootargs ${bootargs} mac=${eth_mac}; fi' setenv try_boot_start 'if fatload ${devtype} ${devnum} ${loadaddr} KERNEL; then fatload ${devtype} ${devnum} ${env_addr} uEnv.ini && env import -t ${env_addr} ${filesize} && run addmac; fatload ${devtype} ${devnum} ${dtb_mem_addr} ${dtb_name} && run boot_start; fi' setenv devtype mmc setenv devnum 1 run try_boot_start ================================================ FILE: projects/Amlogic/bootloader/scripts/s905_autoscript.src ================================================ if fatload mmc 0 0x1000000 u-boot.ext; then go 0x1000000; fi; if fatload usb 0 0x1000000 u-boot.ext; then go 0x1000000; fi; setenv env_addr 0x1040000 setenv boot_start 'bootm ${loadaddr} - ${dtb_mem_addr}' setenv addmac 'if printenv mac; then setenv bootargs ${bootargs} mac=${mac}; elif printenv eth_mac; then setenv bootargs ${bootargs} mac=${eth_mac}; fi' setenv try_boot_start 'if fatload ${devtype} ${devnum} ${loadaddr} KERNEL; then fatload ${devtype} ${devnum} ${env_addr} uEnv.ini && env import -t ${env_addr} ${filesize} && run addmac; fatload ${devtype} ${devnum} ${dtb_mem_addr} ${dtb_name} && run boot_start; fi' setenv devtype mmc setenv devnum 0 run try_boot_start setenv devtype usb for devnum in 0 1 2 3 ; do run try_boot_start ; done ================================================ FILE: projects/Amlogic/bootloader/update.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) [ -z "$SYSTEM_ROOT" ] && SYSTEM_ROOT="" [ -z "$BOOT_ROOT" ] && BOOT_ROOT="/flash" [ -z "$BOOT_PART" ] && BOOT_PART=$(df "$BOOT_ROOT" | tail -1 | awk {' print $1 '}) # identify the boot device if [ -z "$BOOT_DISK" ]; then case $BOOT_PART in /dev/sd[a-z][0-9]*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,[0-9]*,,g") ;; /dev/mmcblk*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,p[0-9]*,,g") ;; esac fi # mount $BOOT_ROOT rw mount -o remount,rw $BOOT_ROOT # update extlinux device trees if [ -f $BOOT_ROOT/extlinux/extlinux.conf ]; then for dtbfile in $BOOT_ROOT/*.dtb ; do dtb=$(basename $dtbfile) echo "Updating $dtb" cp -p $SYSTEM_ROOT/usr/share/bootloader/$dtb $BOOT_ROOT/ 2>/dev/null || true done fi # update box device trees if [ -f $BOOT_ROOT/uEnv.ini ]; then for dtbfile in $BOOT_ROOT/dtb/*.dtb ; do dtb=$(basename $dtbfile) echo "Updating $dtb" cp -p $SYSTEM_ROOT/usr/share/bootloader/$dtb $BOOT_ROOT/dtb/ 2>/dev/null || true done fi # update u-boot scripts if [ -f $BOOT_ROOT/uEnv.ini ]; then for scriptfile in $SYSTEM_ROOT/usr/share/bootloader/*_autoscript* $SYSTEM_ROOT/usr/share/bootloader/*.scr ; do script=$(basename $scriptfile) echo "Updating $script" cp -p $SYSTEM_ROOT/usr/share/bootloader/$script $BOOT_ROOT/ 2>/dev/null || true done fi # mount $BOOT_ROOT ro sync mount -o remount,ro $BOOT_ROOT ================================================ FILE: projects/Amlogic/devices/AMLGX/options ================================================ ################################################################################ # setup device defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc+fp+simd" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc" TARGET_FPU="neon-fp-armv8" ;; esac # OpenGL-ES implementation to use OPENGLES="mesa" # Graphic drivers to use GRAPHIC_DRIVERS="lima panfrost" # KODI Player implementation to use KODIPLAYER_DRIVER="$OPENGLES" # Mali GPU family MALI_FAMILY="450 t820 g31 g52" # Set the addon project ADDON_PROJECT="ARMv8" ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0001-LOCAL-set-meson-gx-cma-pool-to-896MB.patch ================================================ From c5478965aad09d2ebc682438e5474f7606e06eb2 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 13 Apr 2019 05:41:51 +0000 Subject: [PATCH 001/120] LOCAL: set meson-gx cma pool to 896MB This change sets the CMA pool to a larger 896MB! value for vdec use Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi index 80d86780cb6b..7f20b90e11da 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi @@ -58,7 +58,7 @@ secmon_reserved_bl32: secmon@5300000 { linux,cma { compatible = "shared-dma-pool"; reusable; - size = <0x0 0x10000000>; + size = <0x0 0x38000000>; alignment = <0x0 0x400000>; linux,cma-default; }; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0002-LOCAL-set-meson-g12-cma-pool-to-896MB.patch ================================================ From f442bde4d5400279042a90b8af49e4631eac3133 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 14 Aug 2019 19:58:14 +0000 Subject: [PATCH 002/120] LOCAL: set meson-g12 cma pool to 896MB This change sets the CMA pool to a larger 896MB! value for vdec use Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi index 131a8a5a9f5a..d2b6fa8034ea 100644 --- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi @@ -116,7 +116,7 @@ secmon_reserved_bl32: secmon@5300000 { linux,cma { compatible = "shared-dma-pool"; reusable; - size = <0x0 0x10000000>; + size = <0x0 0x38000000>; alignment = <0x0 0x400000>; linux,cma-default; }; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0003-LOCAL-arm64-fix-Kodi-sysinfo-CPU-information.patch ================================================ From 79decc6d434e12c4bb2fc6c88073ab210bc8c8cb Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 13 Apr 2019 05:45:18 +0000 Subject: [PATCH 003/120] LOCAL: arm64: fix Kodi sysinfo CPU information This allows the CPU information to show in the Kodi sysinfo screen, e.g. "ARMv8 Processor rev 4 (v81)" on Amlogic devices Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/kernel/cpuinfo.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c index 28d4f442b0bc..d46cea365be4 100644 --- a/arch/arm64/kernel/cpuinfo.c +++ b/arch/arm64/kernel/cpuinfo.c @@ -170,8 +170,7 @@ static int c_show(struct seq_file *m, void *v) * "processor". Give glibc what it expects. */ seq_printf(m, "processor\t: %d\n", i); - if (compat) - seq_printf(m, "model name\t: ARMv8 Processor rev %d (%s)\n", + seq_printf(m, "model name\t: ARMv8 Processor rev %d (%s)\n", MIDR_REVISION(midr), COMPAT_ELF_PLATFORM); seq_printf(m, "BogoMIPS\t: %lu.%02lu\n", -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0004-LOCAL-arm64-meson-add-Amlogic-Meson-GX-PM-Suspend.patch ================================================ From 4430a4f8e570fc70b2053fc4970758bc0976fda9 Mon Sep 17 00:00:00 2001 From: Neil Armstrong <narmstrong@baylibre.com> Date: Thu, 3 Nov 2016 15:29:23 +0100 Subject: [PATCH 004/120] LOCAL: arm64: meson: add Amlogic Meson GX PM Suspend The Amlogic Meson GX SoCs uses a non-standard argument to the PSCI CPU_SUSPEND call to enter system suspend. Implement such call within platform_suspend_ops. Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> --- drivers/firmware/meson/Kconfig | 6 ++ drivers/firmware/meson/Makefile | 1 + drivers/firmware/meson/meson_gx_pm.c | 86 ++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 drivers/firmware/meson/meson_gx_pm.c diff --git a/drivers/firmware/meson/Kconfig b/drivers/firmware/meson/Kconfig index f2fdd3756648..d3ead92ac61b 100644 --- a/drivers/firmware/meson/Kconfig +++ b/drivers/firmware/meson/Kconfig @@ -9,3 +9,9 @@ config MESON_SM depends on ARM64_4K_PAGES help Say y here to enable the Amlogic secure monitor driver + +config MESON_GX_PM + bool + default ARCH_MESON if ARM64 + help + Say y here to enable the Amlogic GX SoC Power Management diff --git a/drivers/firmware/meson/Makefile b/drivers/firmware/meson/Makefile index c6c09483b622..0193cdfee32f 100644 --- a/drivers/firmware/meson/Makefile +++ b/drivers/firmware/meson/Makefile @@ -1,2 +1,3 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_MESON_SM) += meson_sm.o +obj-$(CONFIG_MESON_GX_PM) += meson_gx_pm.o diff --git a/drivers/firmware/meson/meson_gx_pm.c b/drivers/firmware/meson/meson_gx_pm.c new file mode 100644 index 000000000000..c104c2e4c77f --- /dev/null +++ b/drivers/firmware/meson/meson_gx_pm.c @@ -0,0 +1,86 @@ +/* + * Amlogic Meson GX Power Management + * + * Copyright (c) 2016 Baylibre, SAS. + * Author: Neil Armstrong <narmstrong@baylibre.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + */ + +#include <linux/module.h> +#include <linux/of.h> +#include <linux/platform_device.h> +#include <linux/suspend.h> +#include <linux/arm-smccc.h> + +#include <uapi/linux/psci.h> + +#include <asm/suspend.h> + +/* + * The Amlogic GX SoCs uses a special argument value to the + * PSCI CPU_SUSPEND method to enter SUSPEND_MEM. + */ + +#define MESON_SUSPEND_PARAM 0x0010000 +#define PSCI_FN_NATIVE(version, name) PSCI_##version##_FN64_##name + +static int meson_gx_suspend_finish(unsigned long arg) +{ + struct arm_smccc_res res; + + arm_smccc_smc(PSCI_FN_NATIVE(0_2, CPU_SUSPEND), arg, + virt_to_phys(cpu_resume), 0, 0, 0, 0, 0, &res); + + return res.a0; +} + +static int meson_gx_suspend_enter(suspend_state_t state) +{ + switch (state) { + case PM_SUSPEND_MEM: + return cpu_suspend(MESON_SUSPEND_PARAM, + meson_gx_suspend_finish); + } + + return -EINVAL; +} + +static const struct platform_suspend_ops meson_gx_pm_ops = { + .enter = meson_gx_suspend_enter, + .valid = suspend_valid_only_mem, +}; + +static const struct of_device_id meson_gx_pm_match[] = { + { .compatible = "amlogic,meson-gx-pm", }, + { /* sentinel */ }, +}; +MODULE_DEVICE_TABLE(of, meson_gx_pm_match); + +static int meson_gx_pm_probe(struct platform_device *pdev) +{ + suspend_set_ops(&meson_gx_pm_ops); + + return 0; +} + +static struct platform_driver meson_gx_pm_driver = { + .probe = meson_gx_pm_probe, + .driver = { + .name = "meson-gx-pm", + .of_match_table = meson_gx_pm_match, + }, +}; + +module_platform_driver(meson_gx_pm_driver); + +MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>"); +MODULE_DESCRIPTION("Amlogic Meson GX PM driver"); +MODULE_LICENSE("GPL v2"); -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0005-LOCAL-arm64-dts-meson-add-support-for-GX-PM-and-Virt.patch ================================================ From dbe7af745c89a0824b90c8f0dcf9bb4cc0f48d4c Mon Sep 17 00:00:00 2001 From: Neil Armstrong <narmstrong@baylibre.com> Date: Thu, 3 Nov 2016 15:29:25 +0100 Subject: [PATCH 005/120] LOCAL: arm64: dts: meson: add support for GX PM and Virtual RTC Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> --- arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi index 7f20b90e11da..f39de6ead2fb 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi @@ -221,6 +221,10 @@ sm: secure-monitor { }; }; + system-suspend { + compatible = "amlogic,meson-gx-pm"; + }; + efuse: efuse { compatible = "amlogic,meson-gx-efuse", "amlogic,meson-gxbb-efuse"; #address-cells = <1>; @@ -459,6 +463,11 @@ clkc_AO: clock-controller { }; }; + vrtc: rtc@a8 { + compatible = "amlogic,meson-vrtc"; + reg = <0x0 0x000a8 0x0 0x4>; + }; + cec_AO: cec@100 { compatible = "amlogic,meson-gx-ao-cec"; reg = <0x0 0x00100 0x0 0x14>; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0006-LOCAL-arm64-dts-meson-add-rtc-vrtc-aliases-to-Khadas.patch ================================================ From 08655d3530269d8c17410a6dc3fde69e9c23fe2f Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Thu, 21 Jan 2021 01:35:36 +0000 Subject: [PATCH 006/120] LOCAL: arm64: dts: meson: add rtc/vrtc aliases to Khadas VIM Add aliases to ensure the vrtc time (which normally proves first) is /dev/rtc1 while the onboard rtc chip claims /dev/rtc0. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts index 6ab1cc125b96..24af15e18026 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts @@ -29,6 +29,8 @@ button-function { aliases { serial2 = &uart_AO_B; ethernet0 = ðmac; + rtc0 = &rtc; + rtc1 = &vrtc; }; gpio-keys-polled { -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0007-LOCAL-arm64-dts-meson-add-rtc-vrtc-aliases-to-Khadas.patch ================================================ From 35731fd9e4a198dbd96911828de0270f7f7fcfe9 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 6 Nov 2021 13:01:08 +0000 Subject: [PATCH 007/120] LOCAL: arm64: dts: meson: add rtc/vrtc aliases to Khadas VIM2 Add aliases to ensure the vrtc time (which normally proves first) is /dev/rtc1 while the onboard rtc chip claims /dev/rtc0. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts index f43c45daf7eb..6d396c1be3d6 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts @@ -18,6 +18,8 @@ / { aliases { serial0 = &uart_AO; serial2 = &uart_AO_B; + rtc0 = &rtc; + rtc1 = &vrtc; }; chosen { -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0008-LOCAL-arm64-dts-meson-add-rtc-vrtc-aliases-to-Minix-.patch ================================================ From 54396343f2c349acae2c8c31fd07719f3f71577f Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Mon, 1 Feb 2021 19:27:40 +0000 Subject: [PATCH 008/120] LOCAL: arm64: dts: meson: add rtc/vrtc aliases to Minix NEO U9-H Add node aliases to prevent meson-vrtc from claiming /dev/rtc0 Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/meson-gxm-minix-neo-u9h.dts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-minix-neo-u9h.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-minix-neo-u9h.dts index b8ef3bd8b840..0920e7b096f5 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxm-minix-neo-u9h.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxm-minix-neo-u9h.dts @@ -14,6 +14,11 @@ / { compatible = "minix,neo-u9h", "amlogic,s912", "amlogic,meson-gxm"; model = "Minix Neo U9-H"; + aliases { + rtc0 = &rtc; + rtc1 = &vrtc; + }; + leds { compatible = "gpio-leds"; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0009-LOCAL-ALSA-Assign-internal-PCM-chmap-ELD-IEC958-kctl.patch ================================================ From 6f81de193a1d33648341c8d3a702a070dc71c133 Mon Sep 17 00:00:00 2001 From: Anssi Hannula <anssi.hannula@iki.fi> Date: Sun, 17 Apr 2022 04:37:48 +0000 Subject: [PATCH 009/120] LOCAL: ALSA: Assign internal PCM chmap/ELD/IEC958 kctls to device 0 On SoC sound devices utilizing codec2codec DAI links with a HDMI codec the kctls for chmap, ELD, IEC958 are currently created using the internal PCM device numbers. This causes userspace to not see the actual channel mapping. Affected devices include LibreTech LePotato and Wetek Play 2. The proper fix would be not create these kctls for internal PCMs and instead create them for the real userspace-visible PCMs, somehow forwarding the controls between the HDMI codec and the real PCM. As a workaround, simply use device=0 for all channel map controls and SoC HDMI codec controls for internal PCM devices. Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi> --- sound/core/pcm_lib.c | 5 ++++- sound/soc/codecs/hdmi-codec.c | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index 8b6aeb8a78f7..eee05d447dec 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c @@ -2514,7 +2514,10 @@ int snd_pcm_add_chmap_ctls(struct snd_pcm *pcm, int stream, knew.name = "Playback Channel Map"; else knew.name = "Capture Channel Map"; - knew.device = pcm->device; + if (pcm->internal && pcm->device) + dev_info(pcm->card->dev, "workaround active: internal PCM chmap controls mapped to device 0\n"); + else + knew.device = pcm->device; knew.count = pcm->streams[stream].substream_count; knew.private_value = private_value; info->kctl = snd_ctl_new1(&knew, info); diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c index 0b1cdb2d6049..bbc33161bcca 100644 --- a/sound/soc/codecs/hdmi-codec.c +++ b/sound/soc/codecs/hdmi-codec.c @@ -793,7 +793,8 @@ static int hdmi_codec_pcm_new(struct snd_soc_pcm_runtime *rtd, if (!kctl) return -ENOMEM; - kctl->id.device = rtd->pcm->device; + if (!rtd->pcm->internal) + kctl->id.device = rtd->pcm->device; ret = snd_ctl_add(rtd->card->snd_card, kctl); if (ret < 0) return ret; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0010-LOCAL-usb-hub-disable-autosuspend-for-Genesys-Logic-.patch ================================================ From 6101cde6d49a5d6c4ed4535131dbce78f3523eb9 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Mon, 3 Jan 2022 10:44:17 +0000 Subject: [PATCH 010/120] LOCAL: usb: hub: disable autosuspend for Genesys Logic Hubs Disable autosuspend in Genesys Logic hubs to allow USB devices on the Odroid C2 board to be used. The alternative to this patch is setting usbcore.autosuspend=-1 in boot params. This patch only impacts GXBB devices as GXL/GXM onwards use the newer dwc3 core which does not have the problem. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- drivers/usb/core/hub.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 1abe43ddb75f..7889811e5516 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -5799,7 +5799,7 @@ static const struct usb_device_id hub_id_table[] = { | USB_DEVICE_ID_MATCH_INT_CLASS, .idVendor = USB_VENDOR_GENESYS_LOGIC, .bInterfaceClass = USB_CLASS_HUB, - .driver_info = HUB_QUIRK_CHECK_PORT_AUTOSUSPEND}, + .driver_info = HUB_QUIRK_DISABLE_AUTOSUSPEND}, { .match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT, .idVendor = USB_VENDOR_TEXAS_INSTRUMENTS, -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0011-LOCAL-of-partial-revert-of-fdt.c-changes.patch ================================================ From 012c3d681e1370c701cc666027871817bfc0ec6d Mon Sep 17 00:00:00 2001 From: Stefan Agner <stefan@agner.ch> Date: Wed, 15 Sep 2021 05:00:45 +0000 Subject: [PATCH 011/120] LOCAL: of: partial revert of fdt.c changes This resolves reports similar to the below which are present in dmesg since Linux 5.10; which are also causing crashes in some distros: [ 0.000000] OF: fdt: Reserved memory: failed to reserve memory for node 'secmon@5000000': base 0x0000000005000000, size 3 MiB Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- drivers/of/fdt.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index d1a68b6d03b3..81508e8b34d2 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -480,15 +480,6 @@ static int __init early_init_dt_reserve_memory(phys_addr_t base, phys_addr_t size, bool nomap) { if (nomap) { - /* - * If the memory is already reserved (by another region), we - * should not allow it to be marked nomap, but don't worry - * if the region isn't memory as it won't be mapped. - */ - if (memblock_overlaps_region(&memblock.memory, base, size) && - memblock_is_region_reserved(base, size)) - return -EBUSY; - return memblock_mark_nomap(base, size); } return memblock_reserve(base, size); -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0012-FROMGIT-FIXES-drm-meson-meson_venc-Relax-the-support.patch ================================================ From 8f94ff5bdfe66ddbaafd35beb20b77fd3a1790f8 Mon Sep 17 00:00:00 2001 From: Carlo Caione <ccaione@baylibre.com> Date: Mon, 13 Feb 2023 10:32:09 +0100 Subject: [PATCH 012/120] FROMGIT(FIXES): drm/meson/meson_venc: Relax the supported mode checks Relax a bit the supported modes list by including also 480x1920 and 400x1280. This was actually tested on real hardware and it works correctly. Signed-off-by: Carlo Caione <ccaione@baylibre.com> --- drivers/gpu/drm/meson/meson_venc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/meson/meson_venc.c b/drivers/gpu/drm/meson/meson_venc.c index 3c55ed003359..fcd532db19c1 100644 --- a/drivers/gpu/drm/meson/meson_venc.c +++ b/drivers/gpu/drm/meson/meson_venc.c @@ -866,10 +866,10 @@ meson_venc_hdmi_supported_mode(const struct drm_display_mode *mode) DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_NVSYNC)) return MODE_BAD; - if (mode->hdisplay < 640 || mode->hdisplay > 1920) + if (mode->hdisplay < 400 || mode->hdisplay > 1920) return MODE_BAD_HVALUE; - if (mode->vdisplay < 480 || mode->vdisplay > 1200) + if (mode->vdisplay < 480 || mode->vdisplay > 1920) return MODE_BAD_VVALUE; return MODE_OK; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0014-FROMGIT-6.2-Revert-arm64-dts-meson-sm1-odroid-hc4-di.patch ================================================ From df013bc124b5814849cf5d4d97027432752d976d Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier <nemunaire@nemunai.re> Date: Wed, 4 Jan 2023 15:19:06 +0000 Subject: [PATCH 014/120] FROMGIT(6.2): Revert "arm64: dts: meson-sm1-odroid-hc4: disable unused USB PHY0" This reverts commit 703e84d6615a4a95fb504c8f2e4c9426b86f3930. USB device enumeration was not working on Odroid HC4 as both USB2 PHYs need to be enabled. This is inherited from the GLX USB design [0]. [0]: https://lore.kernel.org/all/20170814224542.18257-1-martin.blumenstingl@googlemail.com/T/ Link: https://lore.kernel.org/all/Y6okoXpwF%2FLZewhv@nemunai.re/ Signed-off-by: Pierre-Olivier Mercier <nemunaire@nemunai.re> --- arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts index 3d642d739c35..74088e7280fe 100644 --- a/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts +++ b/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts @@ -139,10 +139,6 @@ flash@0 { }; &usb { - phys = <&usb2_phy1>; - phy-names = "usb2-phy1"; -}; - -&usb2_phy0 { - status = "disabled"; + phys = <&usb2_phy0>, <&usb2_phy1>; + phy-names = "usb2-phy0", "usb2-phy1"; }; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0015-FROMGIT-6.3-arm64-dts-meson-add-Broadcom-WiFi-to-P21.patch ================================================ From bc574310bb7aad62c46aeee3a7e590df1f5ae0e7 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Thu, 13 Jan 2022 03:50:01 +0000 Subject: [PATCH 015/120] FROMGIT(6.3): arm64: dts: meson: add Broadcom WiFi to P212 dtsi The P212 has a combined WiFi/BT module. The BT side is already enabled in the dtsi but the WiFi side is not. Let's enable the WiFi module. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi index 05cb2f5e5c36..7055057d7942 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi @@ -125,6 +125,11 @@ &sd_emmc_a { vmmc-supply = <&vddao_3v3>; vqmmc-supply = <&vddio_boot>; + + brcmf: wifi@1 { + reg = <1>; + compatible = "brcm,bcm4329-fmac"; + }; }; /* SD card */ -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0016-FROMGIT-6.3-arm64-dts-meson-move-pwm_ef-node-in-P212.patch ================================================ From 127106564fbef4f111b65f556affddef25d73764 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Thu, 13 Jan 2022 03:56:12 +0000 Subject: [PATCH 016/120] FROMGIT(6.3): arm64: dts: meson: move pwm_ef node in P212 dtsi Cosmetic-only change to alpha-sort the pwm_ef node. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../boot/dts/amlogic/meson-gxl-s905x-p212.dtsi | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi index 7055057d7942..a150cc0e18ff 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi @@ -97,6 +97,14 @@ &ir { pinctrl-names = "default"; }; +&pwm_ef { + status = "okay"; + pinctrl-0 = <&pwm_e_pins>; + pinctrl-names = "default"; + clocks = <&clkc CLKID_FCLK_DIV4>; + clock-names = "clkin0"; +}; + &saradc { status = "okay"; vref-supply = <&vddio_ao18>; @@ -170,14 +178,6 @@ &sd_emmc_c { vqmmc-supply = <&vddio_boot>; }; -&pwm_ef { - status = "okay"; - pinctrl-0 = <&pwm_e_pins>; - pinctrl-names = "default"; - clocks = <&clkc CLKID_FCLK_DIV4>; - clock-names = "clkin0"; -}; - /* This is connected to the Bluetooth module: */ &uart_A { status = "okay"; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0017-FROMGIT-6.3-arm64-dts-meson-remove-WiFi-BT-nodes-fro.patch ================================================ From 0097b59b870692e148373b4fe171b227295d296b Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Thu, 13 Jan 2022 03:58:58 +0000 Subject: [PATCH 017/120] FROMGIT(6.3): arm64: dts: meson: remove WiFi/BT nodes from Khadas VIM1 The Broadcom WiFi/BT SDIO nodes are now inherited from the P212 common dtsi so we can remove them from the VIM1 board dts. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../dts/amlogic/meson-gxl-s905x-khadas-vim.dts | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts index 24af15e18026..5ed1e9313003 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts @@ -221,21 +221,6 @@ &pwm_ef { &sd_emmc_a { max-frequency = <100000000>; - - brcmf: wifi@1 { - reg = <1>; - compatible = "brcm,bcm4329-fmac"; - }; -}; - -&uart_A { - bluetooth { - compatible = "brcm,bcm43438-bt"; - shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; - max-speed = <2000000>; - clocks = <&wifi32k>; - clock-names = "lpo"; - }; }; /* This is brought out on the Linux_RX (18) and Linux_TX (19) pins: */ -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0018-FROMGIT-6.3-arm64-dts-meson-add-audio-playback-to-S9.patch ================================================ From da97eaeea4e9583bee58cc05afc29462a7d42403 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Thu, 13 Jan 2022 04:30:44 +0000 Subject: [PATCH 018/120] FROMGIT(6.3): arm64: dts: meson: add audio playback to S905X-P212 dts Add support for the HDMI and Analogue i2s audio outputs. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../boot/dts/amlogic/meson-gxl-s905x-p212.dts | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dts index 2602940c2077..c2bc7cec476d 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dts @@ -7,11 +7,19 @@ /dts-v1/; #include "meson-gxl-s905x-p212.dtsi" +#include <dt-bindings/sound/meson-aiu.h> / { compatible = "amlogic,p212", "amlogic,s905x", "amlogic,meson-gxl"; model = "Amlogic Meson GXL (S905X) P212 Development Board"; + dio2133: analog-amplifier { + compatible = "simple-audio-amplifier"; + sound-name-prefix = "AU2"; + VCC-supply = <&hdmi_5v>; + enable-gpios = <&gpio GPIOH_5 GPIO_ACTIVE_HIGH>; + }; + cvbs-connector { compatible = "composite-video-connector"; @@ -32,6 +40,68 @@ hdmi_connector_in: endpoint { }; }; }; + + sound { + compatible = "amlogic,gx-sound-card"; + model = "S905X-P212"; + audio-aux-devs = <&dio2133>; + audio-widgets = "Line", "Lineout"; + audio-routing = "AU2 INL", "ACODEC LOLN", + "AU2 INR", "ACODEC LORN", + "Lineout", "AU2 OUTL", + "Lineout", "AU2 OUTR"; + assigned-clocks = <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>, + <&clkc CLKID_MPLL2>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&aiu AIU_CPU CPU_I2S_FIFO>; + }; + + dai-link-1 { + sound-dai = <&aiu AIU_CPU CPU_I2S_ENCODER>; + dai-format = "i2s"; + mclk-fs = <256>; + + codec-0 { + sound-dai = <&aiu AIU_HDMI CTRL_I2S>; + }; + + codec-1 { + sound-dai = <&aiu AIU_ACODEC CTRL_I2S>; + }; + }; + + dai-link-2 { + sound-dai = <&aiu AIU_HDMI CTRL_OUT>; + + codec-0 { + sound-dai = <&hdmi_tx>; + }; + }; + + dai-link-3 { + sound-dai = <&aiu AIU_ACODEC CTRL_OUT>; + + codec-0 { + sound-dai = <&acodec>; + }; + }; + }; +}; + +&acodec { + AVDD-supply = <&vddio_ao18>; + status = "okay"; +}; + +&aiu { + status = "okay"; }; &cec_AO { -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0019-FROMGIT-6.3-dt-bindings-reset-meson-g12a-Add-missing.patch ================================================ From 6dafa687717b7d33cdecbc0494cca51f5b754251 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso <tomeu.vizoso@collabora.com> Date: Wed, 30 Nov 2022 12:03:14 +0000 Subject: [PATCH 019/120] FROMGIT(6.3): dt-bindings: reset: meson-g12a: Add missing NNA reset Doesn't appear in the TRM I have, but it is used by the downstream galcore driver. Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> Acked-by: Neil Armstrong <neil.armstrong@linaro.org> Acked-by: Philipp Zabel <p.zabel@pengutronix.de> Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- include/dt-bindings/reset/amlogic,meson-g12a-reset.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/dt-bindings/reset/amlogic,meson-g12a-reset.h b/include/dt-bindings/reset/amlogic,meson-g12a-reset.h index 6d487c5eba2c..45f6b8a951d0 100644 --- a/include/dt-bindings/reset/amlogic,meson-g12a-reset.h +++ b/include/dt-bindings/reset/amlogic,meson-g12a-reset.h @@ -69,7 +69,9 @@ #define RESET_PARSER_FETCH 72 #define RESET_CTL 73 #define RESET_PARSER_TOP 74 -/* 75-77 */ +/* 75 */ +#define RESET_NNA 76 +/* 77 */ #define RESET_DVALIN 78 #define RESET_HDMITX 79 /* 80-95 */ -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0020-FROMGIT-6.3-dt-bindings-power-Add-G12A-NNA-power-dom.patch ================================================ From 7327250ae9d136ee318b4f9d0537b965df324111 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso <tomeu.vizoso@collabora.com> Date: Wed, 30 Nov 2022 12:04:02 +0000 Subject: [PATCH 020/120] FROMGIT(6.3): dt-bindings: power: Add G12A NNA power domain Add define for the NNA power domain for the NPU in the G12A. Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> Acked-by: Neil Armstrong <neil.armstrong@linaro.org> Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- include/dt-bindings/power/meson-g12a-power.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/dt-bindings/power/meson-g12a-power.h b/include/dt-bindings/power/meson-g12a-power.h index bb5e67a842de..93b03bdd60b7 100644 --- a/include/dt-bindings/power/meson-g12a-power.h +++ b/include/dt-bindings/power/meson-g12a-power.h @@ -9,5 +9,6 @@ #define PWRC_G12A_VPU_ID 0 #define PWRC_G12A_ETH_ID 1 +#define PWRC_G12A_NNA_ID 2 #endif -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0021-FROMGIT-6.3-soc-amlogic-meson-pwrc-Add-NNA-power-dom.patch ================================================ From 17a33be46d9bf9f977855c631a6303c99abd002e Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso <tomeu.vizoso@collabora.com> Date: Wed, 30 Nov 2022 12:04:51 +0000 Subject: [PATCH 021/120] FROMGIT(6.3): soc: amlogic: meson-pwrc: Add NNA power domain for A311D Based on power initialization sequence in downstream driver. Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org> Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- drivers/soc/amlogic/meson-ee-pwrc.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/soc/amlogic/meson-ee-pwrc.c b/drivers/soc/amlogic/meson-ee-pwrc.c index dd5f2a13ceb5..dfbf0b1c7d29 100644 --- a/drivers/soc/amlogic/meson-ee-pwrc.c +++ b/drivers/soc/amlogic/meson-ee-pwrc.c @@ -46,6 +46,9 @@ #define HHI_NANOQ_MEM_PD_REG1 (0x47 << 2) #define HHI_VPU_MEM_PD_REG2 (0x4d << 2) +#define G12A_HHI_NANOQ_MEM_PD_REG0 (0x43 << 2) +#define G12A_HHI_NANOQ_MEM_PD_REG1 (0x44 << 2) + struct meson_ee_pwrc; struct meson_ee_pwrc_domain; @@ -106,6 +109,13 @@ static struct meson_ee_pwrc_top_domain sm1_pwrc_usb = SM1_EE_PD(17); static struct meson_ee_pwrc_top_domain sm1_pwrc_pci = SM1_EE_PD(18); static struct meson_ee_pwrc_top_domain sm1_pwrc_ge2d = SM1_EE_PD(19); +static struct meson_ee_pwrc_top_domain g12a_pwrc_nna = { \ + .sleep_reg = GX_AO_RTI_GEN_PWR_SLEEP0, \ + .sleep_mask = BIT(16) | BIT(17), \ + .iso_reg = GX_AO_RTI_GEN_PWR_ISO0, \ + .iso_mask = BIT(16) | BIT(17), \ + }; + /* Memory PD Domains */ #define VPU_MEMPD(__reg) \ @@ -217,6 +227,11 @@ static struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_audio[] = { { HHI_AUDIO_MEM_PD_REG0, GENMASK(27, 26) }, }; +static struct meson_ee_pwrc_mem_domain g12a_pwrc_mem_nna[] = { + { G12A_HHI_NANOQ_MEM_PD_REG0, GENMASK(31, 0) }, + { G12A_HHI_NANOQ_MEM_PD_REG1, GENMASK(23, 0) }, +}; + #define VPU_PD(__name, __top_pd, __mem, __is_pwr_off, __resets, __clks) \ { \ .name = __name, \ @@ -253,6 +268,8 @@ static struct meson_ee_pwrc_domain_desc g12a_pwrc_domains[] = { [PWRC_G12A_VPU_ID] = VPU_PD("VPU", &gx_pwrc_vpu, g12a_pwrc_mem_vpu, pwrc_ee_is_powered_off, 11, 2), [PWRC_G12A_ETH_ID] = MEM_PD("ETH", meson_pwrc_mem_eth), + [PWRC_G12A_NNA_ID] = TOP_PD("NNA", &g12a_pwrc_nna, g12a_pwrc_mem_nna, + pwrc_ee_is_powered_off), }; static struct meson_ee_pwrc_domain_desc gxbb_pwrc_domains[] = { -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0022-FROMGIT-6.3-arm64-dts-Add-DT-node-for-the-VIPNano-QI.patch ================================================ From f34fad413355b9fb666b61cc9e8df7156bbbb7b6 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso <tomeu.vizoso@collabora.com> Date: Wed, 30 Nov 2022 12:05:46 +0000 Subject: [PATCH 022/120] FROMGIT(6.3): arm64: dts: Add DT node for the VIPNano-QI on the A311D This "NPU" is very similar to the Vivante GPUs and Etnaviv works well with it with just a few small changes. Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org> --- arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 12 ++++++++++++ .../dts/amlogic/meson-g12b-a311d-khadas-vim3.dts | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi index d2b6fa8034ea..c90066823250 100644 --- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi @@ -11,6 +11,7 @@ #include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/reset/amlogic,meson-g12a-reset.h> #include <dt-bindings/thermal/thermal.h> +#include <dt-bindings/power/meson-g12a-power.h> / { interrupt-parent = <&gic>; @@ -2484,4 +2485,15 @@ xtal: xtal-clk { #clock-cells = <0>; }; + npu: npu@ff100000 { + status = "disabled"; + compatible = "vivante,gc"; + reg = <0x0 0xff100000 0x0 0x20000>; + interrupts = <0 147 4>; + clocks = <&clkc CLKID_NNA_CORE_CLK>, + <&clkc CLKID_NNA_AXI_CLK>; + clock-names = "core", "bus"; + resets = <&reset RESET_NNA>; + power-domains = <&pwrc PWRC_G12A_NNA_ID>; + }; }; diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-a311d-khadas-vim3.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-a311d-khadas-vim3.dts index 124a80901084..73f3d87dcefd 100644 --- a/arch/arm64/boot/dts/amlogic/meson-g12b-a311d-khadas-vim3.dts +++ b/arch/arm64/boot/dts/amlogic/meson-g12b-a311d-khadas-vim3.dts @@ -15,6 +15,10 @@ / { compatible = "khadas,vim3", "amlogic,a311d", "amlogic,g12b"; }; +&npu { + status = "okay"; +}; + /* * The VIM3 on-board MCU can mux the PCIe/USB3.0 shared differential * lines using a FUSB340TMX USB 3.1 SuperSpeed Data Switch between -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0023-FROMGIT-6.3-drm-etnaviv-Add-nn_core_count-to-chip-fe.patch ================================================ From 32817c57b6cc75595d60ea68ccc0c7c767d46898 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso <tomeu.vizoso@collabora.com> Date: Sat, 3 Dec 2022 06:01:47 +0000 Subject: [PATCH 023/120] FROMGIT(6.3): drm/etnaviv: Add nn_core_count to chip feature struct We will use these for differentiating between GPUs and NPUs, as the downstream driver does. Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> --- drivers/gpu/drm/etnaviv/etnaviv_gpu.h | 3 +++ drivers/gpu/drm/etnaviv/etnaviv_hwdb.c | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h b/drivers/gpu/drm/etnaviv/etnaviv_gpu.h index 85eddd492774..c8f3ad2031ce 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.h @@ -50,6 +50,9 @@ struct etnaviv_chip_identity { /* Number of shader cores. */ u32 shader_core_count; + /* Number of Neural Network cores. */ + u32 nn_core_count; + /* Size of the vertex cache. */ u32 vertex_cache_size; diff --git a/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c b/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c index f2fc645c7956..44df273a5aae 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c @@ -16,6 +16,7 @@ static const struct etnaviv_chip_identity etnaviv_chip_identities[] = { .register_max = 64, .thread_count = 128, .shader_core_count = 1, + .nn_core_count = 0, .vertex_cache_size = 8, .vertex_output_buffer_size = 1024, .pixel_pipes = 1, @@ -47,6 +48,7 @@ static const struct etnaviv_chip_identity etnaviv_chip_identities[] = { .register_max = 64, .thread_count = 512, .shader_core_count = 2, + .nn_core_count = 0, .vertex_cache_size = 16, .vertex_output_buffer_size = 1024, .pixel_pipes = 1, @@ -78,6 +80,7 @@ static const struct etnaviv_chip_identity etnaviv_chip_identities[] = { .register_max = 64, .thread_count = 512, .shader_core_count = 2, + .nn_core_count = 0, .vertex_cache_size = 16, .vertex_output_buffer_size = 1024, .pixel_pipes = 1, @@ -109,6 +112,7 @@ static const struct etnaviv_chip_identity etnaviv_chip_identities[] = { .register_max = 64, .thread_count = 1024, .shader_core_count = 4, + .nn_core_count = 0, .vertex_cache_size = 16, .vertex_output_buffer_size = 1024, .pixel_pipes = 2, -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0024-FROMGIT-6.3-drm-etnaviv-Warn-when-probing-on-NPUs.patch ================================================ From b3155f8944de71787491aa1cedbf079939539de7 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso <tomeu.vizoso@collabora.com> Date: Sat, 3 Dec 2022 06:02:31 +0000 Subject: [PATCH 024/120] FROMGIT(6.3): drm/etnaviv: Warn when probing on NPUs Userspace is still not making full use of the hardware, so we don't know yet if changes to the UAPI won't be needed. Warn about it. Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> --- drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c index f667e7906d1f..2fb70c73cf71 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c @@ -772,6 +772,10 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu) goto fail; } + if (gpu->identity.nn_core_count > 0) + dev_warn(gpu->dev, "etnaviv has been instantiated on a NPU, " + "for which the UAPI is still experimental\n"); + /* Exclude VG cores with FE2.0 */ if (gpu->identity.features & chipFeatures_PIPE_VG && gpu->identity.features & chipFeatures_FE20) { -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0025-FROMGIT-6.3-drm-etnaviv-add-HWDB-entry-for-VIPNano-Q.patch ================================================ From 3e9c8855643486b4f793bd13fbfc759058524062 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso <tomeu.vizoso@collabora.com> Date: Sat, 3 Dec 2022 06:03:16 +0000 Subject: [PATCH 025/120] FROMGIT(6.3): drm/etnaviv: add HWDB entry for VIPNano-QI.7120.0055 This is a compute-only module marketed towards AI and vision acceleration. This particular version can be found on the Amlogic A311D SoC. The feature bits are taken from the Khadas downstream kernel driver 6.4.4.3.310723AAA. Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> --- drivers/gpu/drm/etnaviv/etnaviv_hwdb.c | 31 ++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c b/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c index 44df273a5aae..66b8ad6c7d26 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c @@ -134,6 +134,37 @@ static const struct etnaviv_chip_identity etnaviv_chip_identities[] = { .minor_features10 = 0x90044250, .minor_features11 = 0x00000024, }, + { + .model = 0x8000, + .revision = 0x7120, + .product_id = 0x45080009, + .customer_id = 0x88, + .eco_id = 0, + .stream_count = 8, + .register_max = 64, + .thread_count = 256, + .shader_core_count = 1, + .vertex_cache_size = 16, + .vertex_output_buffer_size = 1024, + .pixel_pipes = 1, + .instruction_count = 512, + .num_constants = 320, + .buffer_size = 0, + .varyings_count = 16, + .features = 0xe0287cac, + .minor_features0 = 0xc1799eff, + .minor_features1 = 0xfefbfadb, + .minor_features2 = 0xeb9d6fbf, + .minor_features3 = 0xedfffced, + .minor_features4 = 0xd30dafc7, + .minor_features5 = 0x7b5ac333, + .minor_features6 = 0xfc8ee200, + .minor_features7 = 0x03fffa6f, + .minor_features8 = 0x00fe0ef0, + .minor_features9 = 0x0088003c, + .minor_features10 = 0x108048c0, + .minor_features11 = 0x00000010, + }, }; bool etnaviv_fill_identity_from_hwdb(struct etnaviv_gpu *gpu) -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0026-FROMGIT-6.3-arm64-dts-Fix-NPU-power-domain-reference.patch ================================================ From 2a3a6c002d0055ae280e94bdcff00088c60e56a6 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso <tomeu.vizoso@collabora.com> Date: Sat, 3 Dec 2022 06:04:00 +0000 Subject: [PATCH 026/120] FROMGIT(6.3): arm64: dts: Fix NPU power domain references in Amlogic G12-based SoCs The power sequence is different between SoCs in that family, so get the right bits for each one. Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> --- arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 2 -- arch/arm64/boot/dts/amlogic/meson-g12b.dtsi | 4 ++++ arch/arm64/boot/dts/amlogic/meson-sm1.dtsi | 4 ++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi index c90066823250..bb2e86073261 100644 --- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi @@ -11,7 +11,6 @@ #include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/reset/amlogic,meson-g12a-reset.h> #include <dt-bindings/thermal/thermal.h> -#include <dt-bindings/power/meson-g12a-power.h> / { interrupt-parent = <&gic>; @@ -2494,6 +2493,5 @@ npu: npu@ff100000 { <&clkc CLKID_NNA_AXI_CLK>; clock-names = "core", "bus"; resets = <&reset RESET_NNA>; - power-domains = <&pwrc PWRC_G12A_NNA_ID>; }; }; diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b.dtsi index ee8fcae9f9f0..886380b5a96f 100644 --- a/arch/arm64/boot/dts/amlogic/meson-g12b.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-g12b.dtsi @@ -139,3 +139,7 @@ map1 { &mali { dma-coherent; }; + +&npu { + power-domains = <&pwrc PWRC_G12A_NNA_ID>; +}; diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1.dtsi b/arch/arm64/boot/dts/amlogic/meson-sm1.dtsi index 80737731af3f..318a16aa4433 100644 --- a/arch/arm64/boot/dts/amlogic/meson-sm1.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-sm1.dtsi @@ -543,3 +543,7 @@ &vpu { &usb { power-domains = <&pwrc PWRC_SM1_USB_ID>; }; + +&npu { + power-domains = <&pwrc PWRC_SM1_NNA_ID>; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0027-FROMGIT-6.3-clk-meson-mpll-Switch-from-.round_rate-t.patch ================================================ From 3a1d65dcdcdd2201dacf97eb5394bec9f4677297 Mon Sep 17 00:00:00 2001 From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Date: Mon, 26 Dec 2022 04:41:46 +0000 Subject: [PATCH 027/120] FROMGIT(6.3): clk: meson: mpll: Switch from .round_rate to .determine_rate clk_ops.round_rate will be removed at some point. It's replacement is .determine_rate. Switch clk-mpll over to use .determine_rate. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- drivers/clk/meson/clk-mpll.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/drivers/clk/meson/clk-mpll.c b/drivers/clk/meson/clk-mpll.c index fc9df4860872..20255e129b37 100644 --- a/drivers/clk/meson/clk-mpll.c +++ b/drivers/clk/meson/clk-mpll.c @@ -87,16 +87,22 @@ static unsigned long mpll_recalc_rate(struct clk_hw *hw, return rate < 0 ? 0 : rate; } -static long mpll_round_rate(struct clk_hw *hw, - unsigned long rate, - unsigned long *parent_rate) +static int mpll_determine_rate(struct clk_hw *hw, struct clk_rate_request *req) { struct clk_regmap *clk = to_clk_regmap(hw); struct meson_clk_mpll_data *mpll = meson_clk_mpll_data(clk); unsigned int sdm, n2; + long rate; + + params_from_rate(req->rate, req->best_parent_rate, &sdm, &n2, + mpll->flags); - params_from_rate(rate, *parent_rate, &sdm, &n2, mpll->flags); - return rate_from_params(*parent_rate, sdm, n2); + rate = rate_from_params(req->best_parent_rate, sdm, n2); + if (rate < 0) + return rate; + + req->rate = rate; + return 0; } static int mpll_set_rate(struct clk_hw *hw, @@ -157,13 +163,13 @@ static int mpll_init(struct clk_hw *hw) const struct clk_ops meson_clk_mpll_ro_ops = { .recalc_rate = mpll_recalc_rate, - .round_rate = mpll_round_rate, + .determine_rate = mpll_determine_rate, }; EXPORT_SYMBOL_GPL(meson_clk_mpll_ro_ops); const struct clk_ops meson_clk_mpll_ops = { .recalc_rate = mpll_recalc_rate, - .round_rate = mpll_round_rate, + .determine_rate = mpll_determine_rate, .set_rate = mpll_set_rate, .init = mpll_init, }; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0028-FROMGIT-6.3-clk-meson-dualdiv-switch-from-.round_rat.patch ================================================ From 6239c914d58c0517ccc5f1386918da94c03c2508 Mon Sep 17 00:00:00 2001 From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Date: Mon, 26 Dec 2022 04:42:41 +0000 Subject: [PATCH 028/120] FROMGIT(6.3): clk: meson: dualdiv: switch from .round_rate to .determine_rate clk_ops.round_rate will be removed at some point. It's replacement is .determine_rate. Switch clk-dualdiv over to use .determine_rate. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- drivers/clk/meson/clk-dualdiv.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/drivers/clk/meson/clk-dualdiv.c b/drivers/clk/meson/clk-dualdiv.c index c5ca23a5e3e8..feae49a8f6dc 100644 --- a/drivers/clk/meson/clk-dualdiv.c +++ b/drivers/clk/meson/clk-dualdiv.c @@ -86,18 +86,23 @@ __dualdiv_get_setting(unsigned long rate, unsigned long parent_rate, return (struct meson_clk_dualdiv_param *)&table[best_i]; } -static long meson_clk_dualdiv_round_rate(struct clk_hw *hw, unsigned long rate, - unsigned long *parent_rate) +static int meson_clk_dualdiv_determine_rate(struct clk_hw *hw, + struct clk_rate_request *req) { struct clk_regmap *clk = to_clk_regmap(hw); struct meson_clk_dualdiv_data *dualdiv = meson_clk_dualdiv_data(clk); - const struct meson_clk_dualdiv_param *setting = - __dualdiv_get_setting(rate, *parent_rate, dualdiv); + const struct meson_clk_dualdiv_param *setting; - if (!setting) - return meson_clk_dualdiv_recalc_rate(hw, *parent_rate); + setting = __dualdiv_get_setting(req->rate, req->best_parent_rate, + dualdiv); + if (setting) + req->rate = __dualdiv_param_to_rate(req->best_parent_rate, + setting); + else + req->rate = meson_clk_dualdiv_recalc_rate(hw, + req->best_parent_rate); - return __dualdiv_param_to_rate(*parent_rate, setting); + return 0; } static int meson_clk_dualdiv_set_rate(struct clk_hw *hw, unsigned long rate, @@ -122,7 +127,7 @@ static int meson_clk_dualdiv_set_rate(struct clk_hw *hw, unsigned long rate, const struct clk_ops meson_clk_dualdiv_ops = { .recalc_rate = meson_clk_dualdiv_recalc_rate, - .round_rate = meson_clk_dualdiv_round_rate, + .determine_rate = meson_clk_dualdiv_determine_rate, .set_rate = meson_clk_dualdiv_set_rate, }; EXPORT_SYMBOL_GPL(meson_clk_dualdiv_ops); -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0029-FROMGIT-6.3-clk-meson-sclk-div-switch-from-.round_ra.patch ================================================ From 450b9f39897989b1f1f9c1efe5a07417d7ef04cf Mon Sep 17 00:00:00 2001 From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Date: Mon, 26 Dec 2022 04:43:33 +0000 Subject: [PATCH 029/120] FROMGIT(6.3): clk: meson: sclk-div: switch from .round_rate to .determine_rate clk_ops.round_rate will be removed at some point. It's replacement is .determine_rate. Switch sclk-div over to use .determine_rate. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- drivers/clk/meson/sclk-div.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/clk/meson/sclk-div.c b/drivers/clk/meson/sclk-div.c index 76d31c0a3342..d12c45c4c261 100644 --- a/drivers/clk/meson/sclk-div.c +++ b/drivers/clk/meson/sclk-div.c @@ -96,16 +96,17 @@ static int sclk_div_bestdiv(struct clk_hw *hw, unsigned long rate, return bestdiv; } -static long sclk_div_round_rate(struct clk_hw *hw, unsigned long rate, - unsigned long *prate) +static int sclk_div_determine_rate(struct clk_hw *hw, + struct clk_rate_request *req) { struct clk_regmap *clk = to_clk_regmap(hw); struct meson_sclk_div_data *sclk = meson_sclk_div_data(clk); int div; - div = sclk_div_bestdiv(hw, rate, prate, sclk); + div = sclk_div_bestdiv(hw, req->rate, &req->best_parent_rate, sclk); + req->rate = DIV_ROUND_UP_ULL((u64)req->best_parent_rate, div); - return DIV_ROUND_UP_ULL((u64)*prate, div); + return 0; } static void sclk_apply_ratio(struct clk_regmap *clk, @@ -237,7 +238,7 @@ static int sclk_div_init(struct clk_hw *hw) const struct clk_ops meson_sclk_div_ops = { .recalc_rate = sclk_div_recalc_rate, - .round_rate = sclk_div_round_rate, + .determine_rate = sclk_div_determine_rate, .set_rate = sclk_div_set_rate, .enable = sclk_div_enable, .disable = sclk_div_disable, -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0030-FROMGIT-6.3-clk-meson-clk-cpu-dyndiv-switch-from-.ro.patch ================================================ From 900d5cb13f3c1b7ced0586497190be1ed96a4742 Mon Sep 17 00:00:00 2001 From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Date: Mon, 26 Dec 2022 04:44:26 +0000 Subject: [PATCH 030/120] FROMGIT(6.3): clk: meson: clk-cpu-dyndiv: switch from .round_rate to .determine_rate clk_ops.round_rate will be removed at some point. It's replacement is .determine_rate. Switch clk-cpu-dyndiv over to use .determine_rate. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- drivers/clk/meson/clk-cpu-dyndiv.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/clk/meson/clk-cpu-dyndiv.c b/drivers/clk/meson/clk-cpu-dyndiv.c index 36976927fe82..8778c149d26a 100644 --- a/drivers/clk/meson/clk-cpu-dyndiv.c +++ b/drivers/clk/meson/clk-cpu-dyndiv.c @@ -27,14 +27,13 @@ static unsigned long meson_clk_cpu_dyndiv_recalc_rate(struct clk_hw *hw, NULL, 0, data->div.width); } -static long meson_clk_cpu_dyndiv_round_rate(struct clk_hw *hw, - unsigned long rate, - unsigned long *prate) +static int meson_clk_cpu_dyndiv_determine_rate(struct clk_hw *hw, + struct clk_rate_request *req) { struct clk_regmap *clk = to_clk_regmap(hw); struct meson_clk_cpu_dyndiv_data *data = meson_clk_cpu_dyndiv_data(clk); - return divider_round_rate(hw, rate, prate, NULL, data->div.width, 0); + return divider_determine_rate(hw, req, NULL, data->div.width, 0); } static int meson_clk_cpu_dyndiv_set_rate(struct clk_hw *hw, unsigned long rate, @@ -63,7 +62,7 @@ static int meson_clk_cpu_dyndiv_set_rate(struct clk_hw *hw, unsigned long rate, const struct clk_ops meson_clk_cpu_dyndiv_ops = { .recalc_rate = meson_clk_cpu_dyndiv_recalc_rate, - .round_rate = meson_clk_cpu_dyndiv_round_rate, + .determine_rate = meson_clk_cpu_dyndiv_determine_rate, .set_rate = meson_clk_cpu_dyndiv_set_rate, }; EXPORT_SYMBOL_GPL(meson_clk_cpu_dyndiv_ops); -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0031-FROMGIT-6.3-arm64-dts-meson-make-dts-use-gpio-fan-ma.patch ================================================ From 6e28630c533846d7c79bb388a1cc1e13650e45b6 Mon Sep 17 00:00:00 2001 From: David Heidelberg <david@ixit.cz> Date: Sat, 27 Nov 2021 07:23:35 +0000 Subject: [PATCH 031/120] FROMGIT(6.3): arm64: dts: meson: make dts use gpio-fan matrix instead of array No functional changes. Adjust to comply with dt-schema requirements and make possible to validate values. Signed-off-by: David Heidelberg <david@ixit.cz> Acked-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts index 6d396c1be3d6..9b0c7e9d0620 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts @@ -54,10 +54,11 @@ gpio_fan: gpio-fan { gpios = <&gpio GPIODV_14 GPIO_ACTIVE_HIGH &gpio GPIODV_15 GPIO_ACTIVE_HIGH>; /* Dummy RPM values since fan is optional */ - gpio-fan,speed-map = <0 0 - 1 1 - 2 2 - 3 3>; + gpio-fan,speed-map = + <0 0>, + <1 1>, + <2 2>, + <3 3>; #cooling-cells = <2>; }; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0032-FROMGIT-6.3-arm64-dts-meson-meson-sm1-bananapi-m5-co.patch ================================================ From 67e3334c533941ed976a3d6390c4553a0a4bf660 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 25 Jan 2023 08:10:48 +0000 Subject: [PATCH 032/120] FROMGIT(6.3): arm64: dts: meson: meson-sm1-bananapi-m5: convert to dtsi Convert the BPI-M5 dts into meson-sm1-bananapi.dtsi to support the addition of new boards based on the same design. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../dts/amlogic/meson-sm1-bananapi-m5.dts | 427 +---------------- .../boot/dts/amlogic/meson-sm1-bananapi.dtsi | 435 ++++++++++++++++++ 2 files changed, 436 insertions(+), 426 deletions(-) create mode 100644 arch/arm64/boot/dts/amlogic/meson-sm1-bananapi.dtsi diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts index 38ebe98ba9c6..34b3238ee0a0 100644 --- a/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts +++ b/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts @@ -6,10 +6,7 @@ /dts-v1/; -#include "meson-sm1.dtsi" -#include <dt-bindings/leds/common.h> -#include <dt-bindings/input/linux-event-codes.h> -#include <dt-bindings/gpio/meson-g12a-gpio.h> +#include "meson-sm1-bananapi.dtsi" #include <dt-bindings/sound/meson-g12a-toacodec.h> #include <dt-bindings/sound/meson-g12a-tohdmitx.h> @@ -17,28 +14,6 @@ / { compatible = "bananapi,bpi-m5", "amlogic,sm1"; model = "Banana Pi BPI-M5"; - adc-keys { - compatible = "adc-keys"; - io-channels = <&saradc 2>; - io-channel-names = "buttons"; - keyup-threshold-microvolt = <1800000>; - - button-sw3 { - label = "SW3"; - linux,code = <BTN_3>; - press-threshold-microvolt = <1700000>; - }; - }; - - aliases { - serial0 = &uart_AO; - ethernet0 = ðmac; - }; - - chosen { - stdout-path = "serial0:115200n8"; - }; - /* TOFIX: handle CVBS_DET on SARADC channel 0 */ cvbs-connector { compatible = "composite-video-connector"; @@ -50,150 +25,6 @@ cvbs_connector_in: endpoint { }; }; - emmc_pwrseq: emmc-pwrseq { - compatible = "mmc-pwrseq-emmc"; - reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>; - }; - - gpio-keys { - compatible = "gpio-keys"; - - key { - label = "SW1"; - linux,code = <BTN_1>; - gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_LOW>; - interrupt-parent = <&gpio_intc>; - interrupts = <3 IRQ_TYPE_EDGE_BOTH>; - }; - }; - - hdmi-connector { - compatible = "hdmi-connector"; - type = "a"; - - port { - hdmi_connector_in: endpoint { - remote-endpoint = <&hdmi_tx_tmds_out>; - }; - }; - }; - - leds { - compatible = "gpio-leds"; - - green { - color = <LED_COLOR_ID_GREEN>; - function = LED_FUNCTION_STATUS; - gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_LOW>; - }; - - blue { - color = <LED_COLOR_ID_BLUE>; - function = LED_FUNCTION_STATUS; - gpios = <&gpio_ao GPIOAO_11 GPIO_ACTIVE_LOW>; - linux,default-trigger = "heartbeat"; - }; - }; - - memory@0 { - device_type = "memory"; - reg = <0x0 0x0 0x0 0x40000000>; - }; - - emmc_1v8: regulator-emmc_1v8 { - compatible = "regulator-fixed"; - regulator-name = "EMMC_1V8"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - vin-supply = <&vddao_3v3>; - regulator-always-on; - }; - - dc_in: regulator-dc_in { - compatible = "regulator-fixed"; - regulator-name = "DC_IN"; - regulator-min-microvolt = <5000000>; - regulator-max-microvolt = <5000000>; - regulator-always-on; - }; - - vddio_c: regulator-vddio_c { - compatible = "regulator-gpio"; - regulator-name = "VDDIO_C"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <3300000>; - - enable-gpio = <&gpio_ao GPIOE_2 GPIO_OPEN_DRAIN>; - enable-active-high; - regulator-always-on; - - gpios = <&gpio_ao GPIOAO_6 GPIO_OPEN_DRAIN>; - gpios-states = <1>; - - states = <1800000 0>, - <3300000 1>; - }; - - tflash_vdd: regulator-tflash_vdd { - compatible = "regulator-fixed"; - regulator-name = "TFLASH_VDD"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - vin-supply = <&dc_in>; - gpio = <&gpio GPIOH_8 GPIO_OPEN_DRAIN>; - enable-active-high; - regulator-always-on; - }; - - vddao_1v8: regulator-vddao_1v8 { - compatible = "regulator-fixed"; - regulator-name = "VDDAO_1V8"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - vin-supply = <&vddao_3v3>; - regulator-always-on; - }; - - vddao_3v3: regulator-vddao_3v3 { - compatible = "regulator-fixed"; - regulator-name = "VDDAO_3V3"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - vin-supply = <&dc_in>; - regulator-always-on; - }; - - vddcpu: regulator-vddcpu { - /* - * SY8120B1ABC DC/DC Regulator. - */ - compatible = "pwm-regulator"; - - regulator-name = "VDDCPU"; - regulator-min-microvolt = <690000>; - regulator-max-microvolt = <1050000>; - - pwm-supply = <&dc_in>; - - pwms = <&pwm_AO_cd 1 1250 0>; - pwm-dutycycle-range = <100 0>; - - regulator-boot-on; - regulator-always-on; - }; - - /* USB Hub Power Enable */ - vl_pwr_en: regulator-vl_pwr_en { - compatible = "regulator-fixed"; - regulator-name = "VL_PWR_EN"; - regulator-min-microvolt = <5000000>; - regulator-max-microvolt = <5000000>; - vin-supply = <&dc_in>; - - gpio = <&gpio GPIOH_6 GPIO_ACTIVE_HIGH>; - enable-active-high; - }; - sound { compatible = "amlogic,axg-sound-card"; model = "BPI-M5"; @@ -319,68 +150,17 @@ &acodec { status = "okay"; }; -&arb { - status = "okay"; -}; &clkc_audio { status = "okay"; }; -&cpu0 { - cpu-supply = <&vddcpu>; - operating-points-v2 = <&cpu_opp_table>; - clocks = <&clkc CLKID_CPU_CLK>; - clock-latency = <50000>; -}; - -&cpu1 { - cpu-supply = <&vddcpu>; - operating-points-v2 = <&cpu_opp_table>; - clocks = <&clkc CLKID_CPU1_CLK>; - clock-latency = <50000>; -}; - -&cpu2 { - cpu-supply = <&vddcpu>; - operating-points-v2 = <&cpu_opp_table>; - clocks = <&clkc CLKID_CPU2_CLK>; - clock-latency = <50000>; -}; - -&cpu3 { - cpu-supply = <&vddcpu>; - operating-points-v2 = <&cpu_opp_table>; - clocks = <&clkc CLKID_CPU3_CLK>; - clock-latency = <50000>; -}; - &cvbs_vdac_port { cvbs_vdac_out: endpoint { remote-endpoint = <&cvbs_connector_in>; }; }; -&ext_mdio { - external_phy: ethernet-phy@0 { - /* Realtek RTL8211F (0x001cc916) */ - reg = <0>; - max-speed = <1000>; - - interrupt-parent = <&gpio_intc>; - /* MAC_INTR on GPIOZ_14 */ - interrupts = <26 IRQ_TYPE_LEVEL_LOW>; - }; -}; - -ðmac { - pinctrl-0 = <ð_pins>, <ð_rgmii_pins>; - pinctrl-names = "default"; - status = "okay"; - phy-mode = "rgmii-txid"; - phy-handle = <&external_phy>; -}; - &frddr_a { status = "okay"; }; @@ -393,192 +173,6 @@ &frddr_c { status = "okay"; }; -&gpio { - gpio-line-names = - /* GPIOZ */ - "ETH_MDIO", /* GPIOZ_0 */ - "ETH_MDC", /* GPIOZ_1 */ - "ETH_RXCLK", /* GPIOZ_2 */ - "ETH_RX_DV", /* GPIOZ_3 */ - "ETH_RXD0", /* GPIOZ_4 */ - "ETH_RXD1", /* GPIOZ_5 */ - "ETH_RXD2", /* GPIOZ_6 */ - "ETH_RXD3", /* GPIOZ_7 */ - "ETH_TXCLK", /* GPIOZ_8 */ - "ETH_TXEN", /* GPIOZ_9 */ - "ETH_TXD0", /* GPIOZ_10 */ - "ETH_TXD1", /* GPIOZ_11 */ - "ETH_TXD2", /* GPIOZ_12 */ - "ETH_TXD3", /* GPIOZ_13 */ - "ETH_INTR", /* GPIOZ_14 */ - "ETH_NRST", /* GPIOZ_15 */ - /* GPIOH */ - "HDMI_SDA", /* GPIOH_0 */ - "HDMI_SCL", /* GPIOH_1 */ - "HDMI_HPD", /* GPIOH_2 */ - "HDMI_CEC", /* GPIOH_3 */ - "VL-RST_N", /* GPIOH_4 */ - "CON1-P36", /* GPIOH_5 */ - "VL-PWREN", /* GPIOH_6 */ - "WiFi_3V3_1V8", /* GPIOH_7 */ - "TFLASH_VDD_EN", /* GPIOH_8 */ - /* BOOT */ - "eMMC_D0", /* BOOT_0 */ - "eMMC_D1", /* BOOT_1 */ - "eMMC_D2", /* BOOT_2 */ - "eMMC_D3", /* BOOT_3 */ - "eMMC_D4", /* BOOT_4 */ - "eMMC_D5", /* BOOT_5 */ - "eMMC_D6", /* BOOT_6 */ - "eMMC_D7", /* BOOT_7 */ - "eMMC_CLK", /* BOOT_8 */ - "", - "eMMC_CMD", /* BOOT_10 */ - "", - "eMMC_RST#", /* BOOT_12 */ - "eMMC_DS", /* BOOT_13 */ - "", "", - /* GPIOC */ - "SD_D0_B", /* GPIOC_0 */ - "SD_D1_B", /* GPIOC_1 */ - "SD_D2_B", /* GPIOC_2 */ - "SD_D3_B", /* GPIOC_3 */ - "SD_CLK_B", /* GPIOC_4 */ - "SD_CMD_B", /* GPIOC_5 */ - "CARD_EN_DET", /* GPIOC_6 */ - "", - /* GPIOA */ - "", "", "", "", "", "", "", "", - "", "", "", "", "", "", - "CON1-P27", /* GPIOA_14 */ - "CON1-P28", /* GPIOA_15 */ - /* GPIOX */ - "CON1-P16", /* GPIOX_0 */ - "CON1-P18", /* GPIOX_1 */ - "CON1-P22", /* GPIOX_2 */ - "CON1-P11", /* GPIOX_3 */ - "CON1-P13", /* GPIOX_4 */ - "CON1-P07", /* GPIOX_5 */ - "CON1-P33", /* GPIOX_6 */ - "CON1-P15", /* GPIOX_7 */ - "CON1-P19", /* GPIOX_8 */ - "CON1-P21", /* GPIOX_9 */ - "CON1-P24", /* GPIOX_10 */ - "CON1-P23", /* GPIOX_11 */ - "CON1-P08", /* GPIOX_12 */ - "CON1-P10", /* GPIOX_13 */ - "CON1-P29", /* GPIOX_14 */ - "CON1-P31", /* GPIOX_15 */ - "CON1-P26", /* GPIOX_16 */ - "CON1-P03", /* GPIOX_17 */ - "CON1-P05", /* GPIOX_18 */ - "CON1-P32"; /* GPIOX_19 */ - - /* - * WARNING: The USB Hub on the BPI-M5 needs a reset signal - * to be turned high in order to be detected by the USB Controller - * This signal should be handled by a USB specific power sequence - * in order to reset the Hub when USB bus is powered down. - */ - usb-hub { - gpio-hog; - gpios = <GPIOH_4 GPIO_ACTIVE_HIGH>; - output-high; - line-name = "usb-hub-reset"; - }; -}; - -&gpio_ao { - gpio-line-names = - /* GPIOAO */ - "DEBUG TX", /* GPIOAO_0 */ - "DEBUG RX", /* GPIOAO_1 */ - "SYS_LED2", /* GPIOAO_2 */ - "UPDATE_KEY", /* GPIOAO_3 */ - "CON1-P40", /* GPIOAO_4 */ - "IR_IN", /* GPIOAO_5 */ - "TF_3V3N_1V8_EN", /* GPIOAO_6 */ - "CON1-P35", /* GPIOAO_7 */ - "CON1-P12", /* GPIOAO_8 */ - "CON1-P37", /* GPIOAO_9 */ - "CON1-P38", /* GPIOAO_10 */ - "SYS_LED", /* GPIOAO_11 */ - /* GPIOE */ - "VDDEE_PWM", /* GPIOE_0 */ - "VDDCPU_PWM", /* GPIOE_1 */ - "TF_PWR_EN"; /* GPIOE_2 */ -}; - -&hdmi_tx { - status = "okay"; - pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>; - pinctrl-names = "default"; - hdmi-supply = <&dc_in>; -}; - -&hdmi_tx_tmds_port { - hdmi_tx_tmds_out: endpoint { - remote-endpoint = <&hdmi_connector_in>; - }; -}; - -&ir { - status = "okay"; - pinctrl-0 = <&remote_input_ao_pins>; - pinctrl-names = "default"; -}; - -&pwm_AO_cd { - pinctrl-0 = <&pwm_ao_d_e_pins>; - pinctrl-names = "default"; - clocks = <&xtal>; - clock-names = "clkin1"; - status = "okay"; -}; - -&saradc { - status = "okay"; - vref-supply = <&vddao_1v8>; -}; - -/* SD card */ -&sd_emmc_b { - status = "okay"; - pinctrl-0 = <&sdcard_c_pins>; - pinctrl-1 = <&sdcard_clk_gate_c_pins>; - pinctrl-names = "default", "clk-gate"; - - bus-width = <4>; - cap-sd-highspeed; - max-frequency = <50000000>; - disable-wp; - - /* TOFIX: SD card is barely usable in SDR modes */ - - cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>; - vmmc-supply = <&tflash_vdd>; - vqmmc-supply = <&vddio_c>; -}; - -/* eMMC */ -&sd_emmc_c { - status = "okay"; - pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>; - pinctrl-1 = <&emmc_clk_gate_pins>; - pinctrl-names = "default", "clk-gate"; - - bus-width = <8>; - cap-mmc-highspeed; - mmc-ddr-1_8v; - mmc-hs200-1_8v; - max-frequency = <200000000>; - disable-wp; - - mmc-pwrseq = <&emmc_pwrseq>; - vmmc-supply = <&vddao_3v3>; - vqmmc-supply = <&emmc_1v8>; -}; - &tdmif_b { status = "okay"; }; @@ -626,22 +220,3 @@ &toddr_b { &toddr_c { status = "okay"; }; - -&uart_AO { - status = "okay"; - pinctrl-0 = <&uart_ao_a_pins>; - pinctrl-names = "default"; -}; - -&usb { - status = "okay"; -}; - -&usb2_phy0 { - phy-supply = <&dc_in>; -}; - -&usb2_phy1 { - /* Enable the hub which is connected to this port */ - phy-supply = <&vl_pwr_en>; -}; diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi.dtsi b/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi.dtsi new file mode 100644 index 000000000000..c914f1148185 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi.dtsi @@ -0,0 +1,435 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2021 BayLibre SAS + * Author: Neil Armstrong <narmstrong@baylibre.com> + */ + +#include "meson-sm1.dtsi" +#include <dt-bindings/leds/common.h> +#include <dt-bindings/input/linux-event-codes.h> +#include <dt-bindings/gpio/meson-g12a-gpio.h> + +/ { + adc_keys { + compatible = "adc-keys"; + io-channels = <&saradc 2>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1800000>; + + key { + label = "SW3"; + linux,code = <BTN_3>; + press-threshold-microvolt = <1700000>; + }; + }; + + aliases { + serial0 = &uart_AO; + ethernet0 = ðmac; + }; + + chosen { + stdout-path = "serial0:115200n8"; + }; + + emmc_pwrseq: emmc-pwrseq { + compatible = "mmc-pwrseq-emmc"; + reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>; + }; + + gpio-keys { + compatible = "gpio-keys"; + + key { + label = "SW1"; + linux,code = <BTN_1>; + gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_LOW>; + interrupt-parent = <&gpio_intc>; + interrupts = <3 IRQ_TYPE_EDGE_BOTH>; + }; + }; + + hdmi-connector { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_connector_in: endpoint { + remote-endpoint = <&hdmi_tx_tmds_out>; + }; + }; + }; + + leds { + compatible = "gpio-leds"; + + led-green { + color = <LED_COLOR_ID_GREEN>; + function = LED_FUNCTION_STATUS; + gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_LOW>; + }; + + led-blue { + color = <LED_COLOR_ID_BLUE>; + function = LED_FUNCTION_STATUS; + gpios = <&gpio_ao GPIOAO_11 GPIO_ACTIVE_LOW>; + linux,default-trigger = "heartbeat"; + }; + }; + + memory@0 { + device_type = "memory"; + reg = <0x0 0x0 0x0 0x40000000>; + }; + + emmc_1v8: regulator-emmc_1v8 { + compatible = "regulator-fixed"; + regulator-name = "EMMC_1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vddao_3v3>; + regulator-always-on; + }; + + dc_in: regulator-dc_in { + compatible = "regulator-fixed"; + regulator-name = "DC_IN"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + regulator-always-on; + }; + + vddio_c: regulator-vddio_c { + compatible = "regulator-gpio"; + regulator-name = "VDDIO_C"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; + + enable-gpio = <&gpio_ao GPIOE_2 GPIO_OPEN_DRAIN>; + enable-active-high; + regulator-always-on; + + gpios = <&gpio_ao GPIOAO_6 GPIO_OPEN_DRAIN>; + gpios-states = <1>; + + states = <1800000 0>, + <3300000 1>; + }; + + tflash_vdd: regulator-tflash_vdd { + compatible = "regulator-fixed"; + regulator-name = "TFLASH_VDD"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&dc_in>; + gpio = <&gpio GPIOH_8 GPIO_OPEN_DRAIN>; + enable-active-high; + regulator-always-on; + }; + + vddao_1v8: regulator-vddao_1v8 { + compatible = "regulator-fixed"; + regulator-name = "VDDAO_1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vddao_3v3>; + regulator-always-on; + }; + + vddao_3v3: regulator-vddao_3v3 { + compatible = "regulator-fixed"; + regulator-name = "VDDAO_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&dc_in>; + regulator-always-on; + }; + + vddcpu: regulator-vddcpu { + /* + * SY8120B1ABC DC/DC Regulator. + */ + compatible = "pwm-regulator"; + + regulator-name = "VDDCPU"; + regulator-min-microvolt = <690000>; + regulator-max-microvolt = <1050000>; + + pwm-supply = <&dc_in>; + + pwms = <&pwm_AO_cd 1 1250 0>; + pwm-dutycycle-range = <100 0>; + + regulator-boot-on; + regulator-always-on; + }; + + /* USB Hub Power Enable */ + vl_pwr_en: regulator-vl_pwr_en { + compatible = "regulator-fixed"; + regulator-name = "VL_PWR_EN"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&dc_in>; + + gpio = <&gpio GPIOH_6 GPIO_ACTIVE_HIGH>; + enable-active-high; + }; +}; + +&arb { + status = "okay"; +}; + +&cpu0 { + cpu-supply = <&vddcpu>; + operating-points-v2 = <&cpu_opp_table>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu1 { + cpu-supply = <&vddcpu>; + operating-points-v2 = <&cpu_opp_table>; + clocks = <&clkc CLKID_CPU1_CLK>; + clock-latency = <50000>; +}; + +&cpu2 { + cpu-supply = <&vddcpu>; + operating-points-v2 = <&cpu_opp_table>; + clocks = <&clkc CLKID_CPU2_CLK>; + clock-latency = <50000>; +}; + +&cpu3 { + cpu-supply = <&vddcpu>; + operating-points-v2 = <&cpu_opp_table>; + clocks = <&clkc CLKID_CPU3_CLK>; + clock-latency = <50000>; +}; + +&ext_mdio { + external_phy: ethernet-phy@0 { + /* Realtek RTL8211F (0x001cc916) */ + reg = <0>; + max-speed = <1000>; + + interrupt-parent = <&gpio_intc>; + /* MAC_INTR on GPIOZ_14 */ + interrupts = <26 IRQ_TYPE_LEVEL_LOW>; + }; +}; + +ðmac { + pinctrl-0 = <ð_pins>, <ð_rgmii_pins>; + pinctrl-names = "default"; + status = "okay"; + phy-mode = "rgmii-txid"; + phy-handle = <&external_phy>; +}; + +&gpio { + gpio-line-names = + /* GPIOZ */ + "ETH_MDIO", /* GPIOZ_0 */ + "ETH_MDC", /* GPIOZ_1 */ + "ETH_RXCLK", /* GPIOZ_2 */ + "ETH_RX_DV", /* GPIOZ_3 */ + "ETH_RXD0", /* GPIOZ_4 */ + "ETH_RXD1", /* GPIOZ_5 */ + "ETH_RXD2", /* GPIOZ_6 */ + "ETH_RXD3", /* GPIOZ_7 */ + "ETH_TXCLK", /* GPIOZ_8 */ + "ETH_TXEN", /* GPIOZ_9 */ + "ETH_TXD0", /* GPIOZ_10 */ + "ETH_TXD1", /* GPIOZ_11 */ + "ETH_TXD2", /* GPIOZ_12 */ + "ETH_TXD3", /* GPIOZ_13 */ + "ETH_INTR", /* GPIOZ_14 */ + "ETH_NRST", /* GPIOZ_15 */ + /* GPIOH */ + "HDMI_SDA", /* GPIOH_0 */ + "HDMI_SCL", /* GPIOH_1 */ + "HDMI_HPD", /* GPIOH_2 */ + "HDMI_CEC", /* GPIOH_3 */ + "VL-RST_N", /* GPIOH_4 */ + "CON1-P36", /* GPIOH_5 */ + "VL-PWREN", /* GPIOH_6 */ + "WiFi_3V3_1V8", /* GPIOH_7 */ + "TFLASH_VDD_EN", /* GPIOH_8 */ + /* BOOT */ + "eMMC_D0", /* BOOT_0 */ + "eMMC_D1", /* BOOT_1 */ + "eMMC_D2", /* BOOT_2 */ + "eMMC_D3", /* BOOT_3 */ + "eMMC_D4", /* BOOT_4 */ + "eMMC_D5", /* BOOT_5 */ + "eMMC_D6", /* BOOT_6 */ + "eMMC_D7", /* BOOT_7 */ + "eMMC_CLK", /* BOOT_8 */ + "", + "eMMC_CMD", /* BOOT_10 */ + "", + "eMMC_RST#", /* BOOT_12 */ + "eMMC_DS", /* BOOT_13 */ + "", "", + /* GPIOC */ + "SD_D0_B", /* GPIOC_0 */ + "SD_D1_B", /* GPIOC_1 */ + "SD_D2_B", /* GPIOC_2 */ + "SD_D3_B", /* GPIOC_3 */ + "SD_CLK_B", /* GPIOC_4 */ + "SD_CMD_B", /* GPIOC_5 */ + "CARD_EN_DET", /* GPIOC_6 */ + "", + /* GPIOA */ + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", + "CON1-P27", /* GPIOA_14 */ + "CON1-P28", /* GPIOA_15 */ + /* GPIOX */ + "CON1-P16", /* GPIOX_0 */ + "CON1-P18", /* GPIOX_1 */ + "CON1-P22", /* GPIOX_2 */ + "CON1-P11", /* GPIOX_3 */ + "CON1-P13", /* GPIOX_4 */ + "CON1-P07", /* GPIOX_5 */ + "CON1-P33", /* GPIOX_6 */ + "CON1-P15", /* GPIOX_7 */ + "CON1-P19", /* GPIOX_8 */ + "CON1-P21", /* GPIOX_9 */ + "CON1-P24", /* GPIOX_10 */ + "CON1-P23", /* GPIOX_11 */ + "CON1-P08", /* GPIOX_12 */ + "CON1-P10", /* GPIOX_13 */ + "CON1-P29", /* GPIOX_14 */ + "CON1-P31", /* GPIOX_15 */ + "CON1-P26", /* GPIOX_16 */ + "CON1-P03", /* GPIOX_17 */ + "CON1-P05", /* GPIOX_18 */ + "CON1-P32"; /* GPIOX_19 */ + + /* + * WARNING: The USB Hub needs a reset signal to be turned high in + * order to be detected by the USB Controller. This signal should + * be handled by a USB specific power sequence to reset the Hub + * when the USB bus is powered down. + */ + usb-hub { + gpio-hog; + gpios = <GPIOH_4 GPIO_ACTIVE_HIGH>; + output-high; + line-name = "usb-hub-reset"; + }; +}; + +&gpio_ao { + gpio-line-names = + /* GPIOAO */ + "DEBUG TX", /* GPIOAO_0 */ + "DEBUG RX", /* GPIOAO_1 */ + "SYS_LED2", /* GPIOAO_2 */ + "UPDATE_KEY", /* GPIOAO_3 */ + "CON1-P40", /* GPIOAO_4 */ + "IR_IN", /* GPIOAO_5 */ + "TF_3V3N_1V8_EN", /* GPIOAO_6 */ + "CON1-P35", /* GPIOAO_7 */ + "CON1-P12", /* GPIOAO_8 */ + "CON1-P37", /* GPIOAO_9 */ + "CON1-P38", /* GPIOAO_10 */ + "SYS_LED", /* GPIOAO_11 */ + /* GPIOE */ + "VDDEE_PWM", /* GPIOE_0 */ + "VDDCPU_PWM", /* GPIOE_1 */ + "TF_PWR_EN"; /* GPIOE_2 */ +}; + +&hdmi_tx { + status = "okay"; + pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>; + pinctrl-names = "default"; + hdmi-supply = <&dc_in>; +}; + +&hdmi_tx_tmds_port { + hdmi_tx_tmds_out: endpoint { + remote-endpoint = <&hdmi_connector_in>; + }; +}; + +&ir { + status = "okay"; + pinctrl-0 = <&remote_input_ao_pins>; + pinctrl-names = "default"; +}; + +&pwm_AO_cd { + pinctrl-0 = <&pwm_ao_d_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin1"; + status = "okay"; +}; + +&saradc { + status = "okay"; + vref-supply = <&vddao_1v8>; +}; + +/* SD card */ +&sd_emmc_b { + status = "okay"; + pinctrl-0 = <&sdcard_c_pins>; + pinctrl-1 = <&sdcard_clk_gate_c_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <4>; + cap-sd-highspeed; + max-frequency = <50000000>; + disable-wp; + + /* TOFIX: SD card is barely usable in SDR modes */ + + cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>; + vmmc-supply = <&tflash_vdd>; + vqmmc-supply = <&vddio_c>; +}; + +/* eMMC */ +&sd_emmc_c { + status = "okay"; + pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>; + pinctrl-1 = <&emmc_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <8>; + cap-mmc-highspeed; + mmc-ddr-1_8v; + mmc-hs200-1_8v; + max-frequency = <200000000>; + disable-wp; + + mmc-pwrseq = <&emmc_pwrseq>; + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&emmc_1v8>; +}; + +&uart_AO { + status = "okay"; + pinctrl-0 = <&uart_ao_a_pins>; + pinctrl-names = "default"; +}; + +&usb { + status = "okay"; +}; + +&usb2_phy0 { + phy-supply = <&dc_in>; +}; + +&usb2_phy1 { + /* Enable the hub which is connected to this port */ + phy-supply = <&vl_pwr_en>; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0033-FROMGIT-6.3-dt-bindings-arm-amlogic-add-support-for-.patch ================================================ From 654df5af5a8feddbb6407c100061a1412a5f8238 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 25 Jan 2023 09:28:27 +0000 Subject: [PATCH 033/120] FROMGIT(6.3): dt-bindings: arm: amlogic: add support for BananaPi M2-Pro BPI-M2-PRO is based upon the BPI-M5 using the Amlogic SM1 (S905X3) chipset. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/arm/amlogic.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml index 9fda2436c618..d63f6b899f25 100644 --- a/Documentation/devicetree/bindings/arm/amlogic.yaml +++ b/Documentation/devicetree/bindings/arm/amlogic.yaml @@ -175,6 +175,7 @@ properties: - enum: - amediatech,x96-air - amediatech,x96-air-gbit + - bananapi,bpi-m2-pro - bananapi,bpi-m5 - cyx,a95xf3-air - cyx,a95xf3-air-gbit -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0034-FROMGIT-6.3-arm64-dts-meson-add-support-for-BananaPi.patch ================================================ From 2c38c04f66a209ef843a74c47d5ad55049a45fee Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 25 Jan 2023 08:13:28 +0000 Subject: [PATCH 034/120] FROMGIT(6.3): arm64: dts: meson: add support for BananaPi M2-Pro BPI-M2-PRO is based upon the BPI-M5 design except for a different physical board layout and the following changes: - USB 3.0 ports reduced from 4x to 2x - 3.5mm Combined CVBS/Audio Jack removed - RTL8821BU WiFi/BT module (internal USB connected) Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/Makefile | 1 + .../dts/amlogic/meson-sm1-bananapi-m2-pro.dts | 98 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m2-pro.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index e213aeebb774..5e5433718c6e 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -59,6 +59,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-gxm-wetek-core2.dtb dtb-$(CONFIG_ARCH_MESON) += meson-s4-s805x2-aq222.dtb dtb-$(CONFIG_ARCH_MESON) += meson-sm1-a95xf3-air-gbit.dtb dtb-$(CONFIG_ARCH_MESON) += meson-sm1-a95xf3-air.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-sm1-bananapi-m2-pro.dtb dtb-$(CONFIG_ARCH_MESON) += meson-sm1-bananapi-m5.dtb dtb-$(CONFIG_ARCH_MESON) += meson-sm1-h96-max.dtb dtb-$(CONFIG_ARCH_MESON) += meson-sm1-khadas-vim3l.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m2-pro.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m2-pro.dts new file mode 100644 index 000000000000..4890d5d9a4f7 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m2-pro.dts @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2021 BayLibre SAS + * Author: Neil Armstrong <narmstrong@baylibre.com> + */ + +/dts-v1/; + +#include "meson-sm1-bananapi.dtsi" +#include <dt-bindings/sound/meson-g12a-tohdmitx.h> + +/ { + compatible = "bananapi,bpi-m2-pro", "amlogic,sm1"; + model = "Banana Pi BPI-M2-PRO"; + + sound { + compatible = "amlogic,axg-sound-card"; + model = "BPI-M2-PRO"; + audio-aux-devs = <&tdmout_b>; + audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1", + "TDMOUT_B IN 1", "FRDDR_B OUT 1", + "TDMOUT_B IN 2", "FRDDR_C OUT 1", + "TDM_B Playback", "TDMOUT_B OUT"; + + assigned-clocks = <&clkc CLKID_MPLL2>, + <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&frddr_a>; + }; + + dai-link-1 { + sound-dai = <&frddr_b>; + }; + + dai-link-2 { + sound-dai = <&frddr_c>; + }; + + /* 8ch hdmi interface */ + dai-link-3 { + sound-dai = <&tdmif_b>; + dai-format = "i2s"; + dai-tdm-slot-tx-mask-0 = <1 1>; + dai-tdm-slot-tx-mask-1 = <1 1>; + dai-tdm-slot-tx-mask-2 = <1 1>; + dai-tdm-slot-tx-mask-3 = <1 1>; + mclk-fs = <256>; + + codec { + sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>; + }; + }; + + /* hdmi glue */ + dai-link-4 { + sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>; + + codec { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&clkc_audio { + status = "okay"; +}; + +&frddr_a { + status = "okay"; +}; + +&frddr_b { + status = "okay"; +}; + +&frddr_c { + status = "okay"; +}; + +&tdmif_b { + status = "okay"; +}; + +&tdmout_b { + status = "okay"; +}; + +&tohdmitx { + status = "okay"; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0035-FROMGIT-6.3-dt-bindings-arm-amlogic-add-support-for-.patch ================================================ From b71a8761891cdca7af133b91aaef4f485e7542b3 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 16 Feb 2022 07:27:07 +0000 Subject: [PATCH 035/120] FROMGIT(6.3): dt-bindings: arm: amlogic: add support for Radxa Zero2 The Radxa Zero2 is a small form-factor SBC using the Amlogic A311D chip. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> --- Documentation/devicetree/bindings/arm/amlogic.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml index d63f6b899f25..7ded40b309a4 100644 --- a/Documentation/devicetree/bindings/arm/amlogic.yaml +++ b/Documentation/devicetree/bindings/arm/amlogic.yaml @@ -154,6 +154,7 @@ properties: items: - enum: - khadas,vim3 + - radxa,zero2 - const: amlogic,a311d - const: amlogic,g12b -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0036-FROMGIT-6.3-arm64-dts-meson-add-support-for-Radxa-Ze.patch ================================================ From 263e11fb9680d32705f0980569dc32a412818488 Mon Sep 17 00:00:00 2001 From: Yuntian Zhang <yt@radxa.com> Date: Fri, 14 Jan 2022 15:50:02 +0000 Subject: [PATCH 036/120] FROMGIT(6.3): arm64: dts: meson: add support for Radxa Zero2 Radxa Zero2 is a small form factor SBC based on the Amlogic A311D chipset that ships in a number of eMMC configurations: - Amlogic A311D (Quad A73 + Dual A53) CPU - 4GB LPDDR4 RAM - 32/64/128GB eMMC - Mali G52-MP4 GPU - HDMI 2.1 output (micro) - BCM4345 WiFi (2.4/5GHz a/b/g/n/ac) and BT 5.0 - 1x USB 2.0 port - Type C (OTG) - 1x USB 3.0 port - Type C (Host) - 1x micro SD Card slot - 40 Pin GPIO header Signed-off-by: Yuntian Zhang <yt@radxa.com> Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/Makefile | 1 + .../dts/amlogic/meson-g12b-radxa-zero2.dts | 489 ++++++++++++++++++ 2 files changed, 490 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index 5e5433718c6e..5d5ec22a469e 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -14,6 +14,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking-pro.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2-plus.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-g12b-radxa-zero2.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-s922x-khadas-vim3.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-ugoos-am6.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-kii-pro.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts new file mode 100644 index 000000000000..9a60c5ec2072 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts @@ -0,0 +1,489 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2019 BayLibre, SAS + * Author: Neil Armstrong <narmstrong@baylibre.com> + * Copyright (c) 2019 Christian Hewitt <christianshewitt@gmail.com> + * Copyright (c) 2022 Radxa Limited + * Author: Yuntian Zhang <yt@radxa.com> + */ + +/dts-v1/; + +#include "meson-g12b-a311d.dtsi" +#include <dt-bindings/input/input.h> +#include <dt-bindings/leds/common.h> +#include <dt-bindings/gpio/meson-g12a-gpio.h> +#include <dt-bindings/sound/meson-g12a-tohdmitx.h> + +/ { + compatible = "radxa,zero2", "amlogic,a311d", "amlogic,g12b"; + model = "Radxa Zero2"; + + aliases { + serial0 = &uart_AO; + serial2 = &uart_A; + }; + + chosen { + stdout-path = "serial0:115200n8"; + }; + + memory@0 { + device_type = "memory"; + reg = <0x0 0x0 0x0 0x80000000>; + }; + + gpio-keys-polled { + compatible = "gpio-keys-polled"; + poll-interval = <100>; + power-button { + label = "power"; + linux,code = <KEY_POWER>; + gpios = <&gpio_ao GPIOAO_3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + }; + }; + + leds { + compatible = "gpio-leds"; + + led-green { + color = <LED_COLOR_ID_GREEN>; + function = LED_FUNCTION_STATUS; + gpios = <&gpio GPIOA_12 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "heartbeat"; + }; + }; + + hdmi-connector { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_connector_in: endpoint { + remote-endpoint = <&hdmi_tx_tmds_out>; + }; + }; + }; + + emmc_pwrseq: emmc-pwrseq { + compatible = "mmc-pwrseq-emmc"; + reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>; + }; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; + clocks = <&wifi32k>; + clock-names = "ext_clock"; + }; + + ao_5v: regulator-ao-5v { + compatible = "regulator-fixed"; + regulator-name = "AO_5V"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + regulator-always-on; + }; + + vcc_1v8: regulator-vcc-1v8 { + compatible = "regulator-fixed"; + regulator-name = "VCC_1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc_3v3>; + regulator-always-on; + }; + + vcc_3v3: regulator-vcc-3v3 { + compatible = "regulator-fixed"; + regulator-name = "VCC_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vddao_3v3>; + regulator-always-on; + /* FIXME: actually controlled by VDDCPU_B_EN */ + }; + + vddao_1v8: regulator-vddao-1v8 { + compatible = "regulator-fixed"; + regulator-name = "VDDIO_AO1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vddao_3v3>; + regulator-always-on; + }; + + vddao_3v3: regulator-vddao-3v3 { + compatible = "regulator-fixed"; + regulator-name = "VDDAO_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&ao_5v>; + regulator-always-on; + }; + + vddcpu_a: regulator-vddcpu-a { + /* + * MP8756GD Regulator. + */ + compatible = "pwm-regulator"; + + regulator-name = "VDDCPU_A"; + regulator-min-microvolt = <730000>; + regulator-max-microvolt = <1022000>; + + pwm-supply = <&ao_5v>; + + pwms = <&pwm_ab 0 1250 0>; + pwm-dutycycle-range = <100 0>; + + regulator-boot-on; + regulator-always-on; + }; + + vddcpu_b: regulator-vddcpu-b { + /* + * Silergy SY8120B1ABC Regulator. + */ + compatible = "pwm-regulator"; + + regulator-name = "VDDCPU_B"; + regulator-min-microvolt = <730000>; + regulator-max-microvolt = <1022000>; + + pwm-supply = <&ao_5v>; + + pwms = <&pwm_AO_cd 1 1250 0>; + pwm-dutycycle-range = <100 0>; + + regulator-boot-on; + regulator-always-on; + }; + + sound { + compatible = "amlogic,axg-sound-card"; + model = "RADXA-ZERO2"; + audio-aux-devs = <&tdmout_b>; + audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1", + "TDMOUT_B IN 1", "FRDDR_B OUT 1", + "TDMOUT_B IN 2", "FRDDR_C OUT 1", + "TDM_B Playback", "TDMOUT_B OUT"; + + assigned-clocks = <&clkc CLKID_MPLL2>, + <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + + dai-link-0 { + sound-dai = <&frddr_a>; + }; + + dai-link-1 { + sound-dai = <&frddr_b>; + }; + + dai-link-2 { + sound-dai = <&frddr_c>; + }; + + /* 8ch hdmi interface */ + dai-link-3 { + sound-dai = <&tdmif_b>; + dai-format = "i2s"; + dai-tdm-slot-tx-mask-0 = <1 1>; + dai-tdm-slot-tx-mask-1 = <1 1>; + dai-tdm-slot-tx-mask-2 = <1 1>; + dai-tdm-slot-tx-mask-3 = <1 1>; + mclk-fs = <256>; + + codec { + sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>; + }; + }; + + /* hdmi glue */ + dai-link-4 { + sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>; + + codec { + sound-dai = <&hdmi_tx>; + }; + }; + }; + + wifi32k: clock-0 { + compatible = "pwm-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */ + }; +}; + +&arb { + status = "okay"; +}; + +&cec_AO { + pinctrl-0 = <&cec_ao_a_h_pins>; + pinctrl-names = "default"; + status = "disabled"; + hdmi-phandle = <&hdmi_tx>; +}; + +&cecb_AO { + pinctrl-0 = <&cec_ao_b_h_pins>; + pinctrl-names = "default"; + status = "okay"; + hdmi-phandle = <&hdmi_tx>; +}; + +&clkc_audio { + status = "okay"; +}; + +&cpu0 { + cpu-supply = <&vddcpu_b>; + operating-points-v2 = <&cpu_opp_table_0>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu1 { + cpu-supply = <&vddcpu_b>; + operating-points-v2 = <&cpu_opp_table_0>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu100 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu101 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu102 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu103 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&frddr_a { + status = "okay"; +}; + +&frddr_b { + status = "okay"; +}; + +&frddr_c { + status = "okay"; +}; + +&gpio { + gpio-line-names = + /* GPIOZ */ + "PIN_27", "PIN_28", "PIN_7", "PIN_11", "PIN_13", "PIN_15", "PIN_18", "PIN_40", + "", "", "", "", "", "", "", "", + /* GPIOH */ + "", "", "", "", "PIN_19", "PIN_21", "PIN_24", "PIN_23", + "", + /* BOOT */ + "", "", "", "", "", "", "", "", + "", "", "", "", "EMMC_PWRSEQ", "", "", "", + /* GPIOC */ + "", "", "", "", "", "", "SD_CD", "PIN_36", + /* GPIOA */ + "PIN_32", "PIN_12", "PIN_35", "", "", "PIN_38", "", "", + "", "", "", "", "LED_GREEN", "PIN_31", "PIN_3", "PIN_5", + /* GPIOX */ + "", "", "", "", "", "", "SDIO_PWRSEQ", "", + "", "", "", "", "", "", "", "", + "", "BT_SHUTDOWN", "", ""; +}; + +&gpio_ao { + gpio-line-names = + /* GPIOAO */ + "PIN_8", "PIN_10", "", "BTN_POWER", "", "", "", "PIN_29", + "PIN_33", "PIN_37", "FAN", "", + /* GPIOE */ + "", "", ""; +}; + +&hdmi_tx { + status = "okay"; + pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>; + pinctrl-names = "default"; + hdmi-supply = <&ao_5v>; +}; + +&hdmi_tx_tmds_port { + hdmi_tx_tmds_out: endpoint { + remote-endpoint = <&hdmi_connector_in>; + }; +}; + +&ir { + status = "disabled"; + pinctrl-0 = <&remote_input_ao_pins>; + pinctrl-names = "default"; +}; + +&pwm_ab { + pinctrl-0 = <&pwm_a_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin0"; + status = "okay"; +}; + +&pwm_ef { + pinctrl-0 = <&pwm_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin2"; + status = "okay"; +}; + +&pwm_AO_ab { + pinctrl-0 = <&pwm_ao_a_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin3"; + status = "okay"; +}; + +&pwm_AO_cd { + pinctrl-0 = <&pwm_ao_d_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin4"; + status = "okay"; +}; + +&saradc { + status = "okay"; + vref-supply = <&vddao_1v8>; +}; + +/* SDIO */ +&sd_emmc_a { + status = "okay"; + pinctrl-0 = <&sdio_pins>; + pinctrl-1 = <&sdio_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + #address-cells = <1>; + #size-cells = <0>; + + bus-width = <4>; + cap-sd-highspeed; + max-frequency = <100000000>; + + non-removable; + disable-wp; + + /* WiFi firmware requires power to be kept while in suspend */ + keep-power-in-suspend; + + mmc-pwrseq = <&sdio_pwrseq>; + + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vddao_1v8>; + + brcmf: wifi@1 { + reg = <1>; + compatible = "brcm,bcm4329-fmac"; + }; +}; + +/* SD card */ +&sd_emmc_b { + status = "okay"; + pinctrl-0 = <&sdcard_c_pins>; + pinctrl-1 = <&sdcard_clk_gate_c_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <4>; + cap-sd-highspeed; + max-frequency = <50000000>; + disable-wp; + + cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>; + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vddao_3v3>; +}; + +/* eMMC */ +&sd_emmc_c { + status = "okay"; + pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>; + pinctrl-1 = <&emmc_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <8>; + cap-mmc-highspeed; + mmc-ddr-1_8v; + mmc-hs200-1_8v; + max-frequency = <200000000>; + disable-wp; + + mmc-pwrseq = <&emmc_pwrseq>; + vmmc-supply = <&vcc_3v3>; + vqmmc-supply = <&vcc_1v8>; +}; + +&tdmif_b { + status = "okay"; +}; + +&tdmout_b { + status = "okay"; +}; + +&tohdmitx { + status = "okay"; +}; + +&uart_A { + status = "okay"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "brcm,bcm43438-bt"; + shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + max-speed = <2000000>; + clocks = <&wifi32k>; + clock-names = "lpo"; + }; +}; + +&uart_AO { + status = "okay"; + pinctrl-0 = <&uart_ao_a_pins>; + pinctrl-names = "default"; +}; + +&usb { + status = "okay"; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0037-FROMGIT-6.4-dt-bindings-net-add-amlogic-gxl-mdio-mul.patch ================================================ From be94b9629bc355647bda972f92e0887d3a94c17f Mon Sep 17 00:00:00 2001 From: Jerome Brunet <jbrunet@baylibre.com> Date: Mon, 30 Jan 2023 16:16:15 +0100 Subject: [PATCH 037/120] FROMGIT(6.4): dt-bindings: net: add amlogic gxl mdio multiplexer Add documentation for the MDIO bus multiplexer found on the Amlogic GXL SoC family Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> --- .../bindings/net/amlogic,gxl-mdio-mux.yaml | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 Documentation/devicetree/bindings/net/amlogic,gxl-mdio-mux.yaml diff --git a/Documentation/devicetree/bindings/net/amlogic,gxl-mdio-mux.yaml b/Documentation/devicetree/bindings/net/amlogic,gxl-mdio-mux.yaml new file mode 100644 index 000000000000..27ae004dbea0 --- /dev/null +++ b/Documentation/devicetree/bindings/net/amlogic,gxl-mdio-mux.yaml @@ -0,0 +1,64 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/net/amlogic,gxl-mdio-mux.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Amlogic GXL MDIO bus multiplexer + +maintainers: + - Jerome Brunet <jbrunet@baylibre.com> + +description: + This is a special case of a MDIO bus multiplexer. It allows to choose between + the internal mdio bus leading to the embedded 10/100 PHY or the external + MDIO bus on the Amlogic GXL SoC family. + +allOf: + - $ref: mdio-mux.yaml# + +properties: + compatible: + const: amlogic,gxl-mdio-mux + + reg: + maxItems: 1 + + clocks: + maxItems: 1 + + clock-names: + items: + - const: ref + +required: + - compatible + - reg + - clocks + - clock-names + +unevaluatedProperties: false + +examples: + - | + eth_phy_mux: mdio@558 { + compatible = "amlogic,gxl-mdio-mux"; + reg = <0x558 0xc>; + #address-cells = <1>; + #size-cells = <0>; + clocks = <&refclk>; + clock-names = "ref"; + mdio-parent-bus = <&mdio0>; + + external_mdio: mdio@0 { + reg = <0x0>; + #address-cells = <1>; + #size-cells = <0>; + }; + + internal_mdio: mdio@1 { + reg = <0x1>; + #address-cells = <1>; + #size-cells = <0>; + }; + }; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0038-FROMGIT-6.4-net-mdio-add-amlogic-gxl-mdio-mux-suppor.patch ================================================ From 7246aabe2dcaced67c24646712e930e931177c71 Mon Sep 17 00:00:00 2001 From: Jerome Brunet <jbrunet@baylibre.com> Date: Mon, 30 Jan 2023 16:16:16 +0100 Subject: [PATCH 038/120] FROMGIT(6.4): net: mdio: add amlogic gxl mdio mux support Add support for the mdio mux and internal phy glue of the GXL SoC family Reported-by: Da Xue <da@lessconfused.com> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> --- drivers/net/mdio/Kconfig | 11 ++ drivers/net/mdio/Makefile | 1 + drivers/net/mdio/mdio-mux-meson-gxl.c | 164 ++++++++++++++++++++++++++ 3 files changed, 176 insertions(+) create mode 100644 drivers/net/mdio/mdio-mux-meson-gxl.c diff --git a/drivers/net/mdio/Kconfig b/drivers/net/mdio/Kconfig index bfa16826a6e1..90309980686e 100644 --- a/drivers/net/mdio/Kconfig +++ b/drivers/net/mdio/Kconfig @@ -215,6 +215,17 @@ config MDIO_BUS_MUX_MESON_G12A the amlogic g12a SoC. The multiplexers connects either the external or the internal MDIO bus to the parent bus. +config MDIO_BUS_MUX_MESON_GXL + tristate "Amlogic GXL based MDIO bus multiplexer" + depends on ARCH_MESON || COMPILE_TEST + depends on OF_MDIO && HAS_IOMEM && COMMON_CLK + select MDIO_BUS_MUX + default m if ARCH_MESON + help + This module provides a driver for the MDIO multiplexer/glue of + the amlogic GXL SoC. The multiplexer connects either the external + or the internal MDIO bus to the parent bus. + config MDIO_BUS_MUX_BCM6368 tristate "Broadcom BCM6368 MDIO bus multiplexers" depends on OF && OF_MDIO && (BMIPS_GENERIC || COMPILE_TEST) diff --git a/drivers/net/mdio/Makefile b/drivers/net/mdio/Makefile index 15f8dc4042ce..7d4cb4c11e4e 100644 --- a/drivers/net/mdio/Makefile +++ b/drivers/net/mdio/Makefile @@ -28,5 +28,6 @@ obj-$(CONFIG_MDIO_BUS_MUX_BCM6368) += mdio-mux-bcm6368.o obj-$(CONFIG_MDIO_BUS_MUX_BCM_IPROC) += mdio-mux-bcm-iproc.o obj-$(CONFIG_MDIO_BUS_MUX_GPIO) += mdio-mux-gpio.o obj-$(CONFIG_MDIO_BUS_MUX_MESON_G12A) += mdio-mux-meson-g12a.o +obj-$(CONFIG_MDIO_BUS_MUX_MESON_GXL) += mdio-mux-meson-gxl.o obj-$(CONFIG_MDIO_BUS_MUX_MMIOREG) += mdio-mux-mmioreg.o obj-$(CONFIG_MDIO_BUS_MUX_MULTIPLEXER) += mdio-mux-multiplexer.o diff --git a/drivers/net/mdio/mdio-mux-meson-gxl.c b/drivers/net/mdio/mdio-mux-meson-gxl.c new file mode 100644 index 000000000000..76188575ca1f --- /dev/null +++ b/drivers/net/mdio/mdio-mux-meson-gxl.c @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2022 Baylibre, SAS. + * Author: Jerome Brunet <jbrunet@baylibre.com> + */ + +#include <linux/bitfield.h> +#include <linux/delay.h> +#include <linux/clk.h> +#include <linux/io.h> +#include <linux/mdio-mux.h> +#include <linux/module.h> +#include <linux/platform_device.h> + +#define ETH_REG2 0x0 +#define REG2_PHYID GENMASK(21, 0) +#define EPHY_GXL_ID 0x110181 +#define REG2_LEDACT GENMASK(23, 22) +#define REG2_LEDLINK GENMASK(25, 24) +#define REG2_DIV4SEL BIT(27) +#define REG2_ADCBYPASS BIT(30) +#define REG2_CLKINSEL BIT(31) +#define ETH_REG3 0x4 +#define REG3_ENH BIT(3) +#define REG3_CFGMODE GENMASK(6, 4) +#define REG3_AUTOMDIX BIT(7) +#define REG3_PHYADDR GENMASK(12, 8) +#define REG3_PWRUPRST BIT(21) +#define REG3_PWRDOWN BIT(22) +#define REG3_LEDPOL BIT(23) +#define REG3_PHYMDI BIT(26) +#define REG3_CLKINEN BIT(29) +#define REG3_PHYIP BIT(30) +#define REG3_PHYEN BIT(31) +#define ETH_REG4 0x8 +#define REG4_PWRUPRSTSIG BIT(0) + +#define MESON_GXL_MDIO_EXTERNAL_ID 0 +#define MESON_GXL_MDIO_INTERNAL_ID 1 + +struct gxl_mdio_mux { + void __iomem *regs; + void *mux_handle; +}; + +static void gxl_enable_internal_mdio(struct gxl_mdio_mux *priv) +{ + u32 val; + + /* Setup the internal phy */ + val = (REG3_ENH | + FIELD_PREP(REG3_CFGMODE, 0x7) | + REG3_AUTOMDIX | + FIELD_PREP(REG3_PHYADDR, 8) | + REG3_LEDPOL | + REG3_PHYMDI | + REG3_CLKINEN | + REG3_PHYIP); + + writel(REG4_PWRUPRSTSIG, priv->regs + ETH_REG4); + writel(val, priv->regs + ETH_REG3); + mdelay(10); + + /* NOTE: The HW kept the phy id configurable at runtime. + * The id below is arbitrary. It is the one used in the vendor code. + * The only constraint is that it must match the one in + * drivers/net/phy/meson-gxl.c to properly match the PHY. + */ + writel(FIELD_PREP(REG2_PHYID, EPHY_GXL_ID), + priv->regs + ETH_REG2); + + /* Enable the internal phy */ + val |= REG3_PHYEN; + writel(val, priv->regs + ETH_REG3); + writel(0, priv->regs + ETH_REG4); + + /* The phy needs a bit of time to power up */ + mdelay(10); +} + +static void gxl_enable_external_mdio(struct gxl_mdio_mux *priv) +{ + /* Reset the mdio bus mux to the external phy */ + writel(0, priv->regs + ETH_REG3); +} + +static int gxl_mdio_switch_fn(int current_child, int desired_child, + void *data) +{ + struct gxl_mdio_mux *priv = dev_get_drvdata(data); + + if (current_child == desired_child) + return 0; + + switch (desired_child) { + case MESON_GXL_MDIO_EXTERNAL_ID: + gxl_enable_external_mdio(priv); + break; + case MESON_GXL_MDIO_INTERNAL_ID: + gxl_enable_internal_mdio(priv); + break; + default: + return -EINVAL; + } + + return 0; +} + +static const struct of_device_id gxl_mdio_mux_match[] = { + { .compatible = "amlogic,gxl-mdio-mux", }, + {}, +}; +MODULE_DEVICE_TABLE(of, gxl_mdio_mux_match); + +static int gxl_mdio_mux_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct gxl_mdio_mux *priv; + struct clk *rclk; + int ret; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + platform_set_drvdata(pdev, priv); + + priv->regs = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(priv->regs)) + return PTR_ERR(priv->regs); + + rclk = devm_clk_get_enabled(dev, "ref"); + if (IS_ERR(rclk)) + return dev_err_probe(dev, PTR_ERR(rclk), + "failed to get reference clock\n"); + + ret = mdio_mux_init(dev, dev->of_node, gxl_mdio_switch_fn, + &priv->mux_handle, dev, NULL); + if (ret) + dev_err_probe(dev, ret, "mdio multiplexer init failed\n"); + + return ret; +} + +static int gxl_mdio_mux_remove(struct platform_device *pdev) +{ + struct gxl_mdio_mux *priv = platform_get_drvdata(pdev); + + mdio_mux_uninit(priv->mux_handle); + + return 0; +} + +static struct platform_driver gxl_mdio_mux_driver = { + .probe = gxl_mdio_mux_probe, + .remove = gxl_mdio_mux_remove, + .driver = { + .name = "gxl-mdio-mux", + .of_match_table = gxl_mdio_mux_match, + }, +}; +module_platform_driver(gxl_mdio_mux_driver); + +MODULE_DESCRIPTION("Amlogic GXL MDIO multiplexer driver"); +MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>"); +MODULE_LICENSE("GPL"); -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0039-FROMGIT-6.4-mmc-meson-gx-remove-meson_mmc_get_cd.patch ================================================ From 3f94f73ae5c31ac0c009e2867a25077cd63df251 Mon Sep 17 00:00:00 2001 From: Heiner Kallweit <hkallweit1@gmail.com> Date: Sun, 12 Feb 2023 22:43:32 +0100 Subject: [PATCH 039/120] FROMGIT(6.4): mmc: meson-gx: remove meson_mmc_get_cd MMC core only checks whether return value of .get_cd() equals zero. Therefore -ENOSYS and 1 are effectively the same and the function can be removed. Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> --- drivers/mmc/host/meson-gx-mmc.c | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c index 5c94ad4661ce..a1051a853f91 100644 --- a/drivers/mmc/host/meson-gx-mmc.c +++ b/drivers/mmc/host/meson-gx-mmc.c @@ -1083,20 +1083,6 @@ static irqreturn_t meson_mmc_irq_thread(int irq, void *dev_id) return IRQ_HANDLED; } -/* - * NOTE: we only need this until the GPIO/pinctrl driver can handle - * interrupts. For now, the MMC core will use this for polling. - */ -static int meson_mmc_get_cd(struct mmc_host *mmc) -{ - int status = mmc_gpio_get_cd(mmc); - - if (status == -ENOSYS) - return 1; /* assume present */ - - return status; -} - static void meson_mmc_cfg_init(struct meson_host *host) { u32 cfg = 0; @@ -1165,7 +1151,7 @@ static void meson_mmc_ack_sdio_irq(struct mmc_host *mmc) static const struct mmc_host_ops meson_mmc_ops = { .request = meson_mmc_request, .set_ios = meson_mmc_set_ios, - .get_cd = meson_mmc_get_cd, + .get_cd = mmc_gpio_get_cd, .pre_req = meson_mmc_pre_req, .post_req = meson_mmc_post_req, .execute_tuning = meson_mmc_resampling_tuning, -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0040-FROMGIT-6.4-media-meson-vdec-remove-redundant-if-sta.patch ================================================ From 5142ba301edc43cc70ca708aafa84cf1b2b32feb Mon Sep 17 00:00:00 2001 From: Benjamin Roszak <benjamin545@gmail.com> Date: Thu, 15 Jul 2021 14:32:33 -0400 Subject: [PATCH 040/120] FROMGIT(6.4): media: meson: vdec: remove redundant if statement Checking if sess->fmt_out->pixfmt is V4L2_PIX_FMT_VP9 was already done as a condition to enter the if statement where this additional check is made. Signed-off-by: Benjamin Roszak <benjamin545@gmail.com> Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- drivers/staging/media/meson/vdec/esparser.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/staging/media/meson/vdec/esparser.c b/drivers/staging/media/meson/vdec/esparser.c index 86ccc8937afc..7b15fc54efe4 100644 --- a/drivers/staging/media/meson/vdec/esparser.c +++ b/drivers/staging/media/meson/vdec/esparser.c @@ -314,8 +314,7 @@ esparser_queue(struct amvdec_session *sess, struct vb2_v4l2_buffer *vbuf) num_dst_bufs = codec_ops->num_pending_bufs(sess); num_dst_bufs += v4l2_m2m_num_dst_bufs_ready(sess->m2m_ctx); - if (sess->fmt_out->pixfmt == V4L2_PIX_FMT_VP9) - num_dst_bufs -= 3; + num_dst_bufs -= 3; if (esparser_vififo_get_free_space(sess) < payload_size || atomic_read(&sess->esparser_queued_bufs) >= num_dst_bufs) -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0041-FROMGIT-6.4-dt-bindings-media-rc-add-rc-dreambox-bin.patch ================================================ From 1b5d94d6c98f76a33fcc98f09a9e2c414cb6c4ee Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 1 Feb 2023 08:53:39 +0000 Subject: [PATCH 041/120] FROMGIT(6.4): dt-bindings: media: rc: add rc-dreambox binding Add a binding for the rc-dreambox remote keymap Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/media/rc.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/media/rc.yaml b/Documentation/devicetree/bindings/media/rc.yaml index e732b7f3a635..e7d2ae5a7eb9 100644 --- a/Documentation/devicetree/bindings/media/rc.yaml +++ b/Documentation/devicetree/bindings/media/rc.yaml @@ -55,6 +55,7 @@ properties: - rc-dm1105-nec - rc-dntv-live-dvb-t - rc-dntv-live-dvbt-pro + - rc-dreambox - rc-dtt200u - rc-dvbsky - rc-dvico-mce -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0042-FROMGIT-6.4-media-rc-add-common-keymap-for-Dreambox-.patch ================================================ From c86408e487a66dc5664c3002da54478eb103228c Mon Sep 17 00:00:00 2001 From: Emanuel Strobel <emanuel.strobel@yahoo.com> Date: Mon, 5 Apr 2021 17:57:57 +0000 Subject: [PATCH 042/120] FROMGIT(6.4): media: rc: add common keymap for Dreambox RC10/RC0 and RC20/RC-BT remotes Add a common keymap for the RC10/RC0 and RC20/RC-BT remotes used with the Dreambox One and Dreambox Two DVB-S/T boxes. The maps are combined since the IR codes do not conflict and both boxes have shipped with both remote designs over time. Both remote types can be programmed to control TVs, so include non-IR keys that are used to switch-to or toggle the remote mode: - DREAM in RC10/RC0 switches to (Dreambox) STB control mode - TV in RC10/RC0 switches to TV control mode - MODE in RC20/RC-BT toggles between STB/TV/BT control modes In the RC20 keymap the Android MIC (voice search) key maps to KEY_HELP and EXIT is mapped to KEY_ESC to replicate the go-backwards navigation behaviour in the Android vendor OS that ships on Dreambox devices. Signed-off-by: Emanuel Strobel <emanuel.strobel@yahoo.com> Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- drivers/media/rc/keymaps/Makefile | 1 + drivers/media/rc/keymaps/rc-dreambox.c | 151 +++++++++++++++++++++++++ include/media/rc-map.h | 1 + 3 files changed, 153 insertions(+) create mode 100644 drivers/media/rc/keymaps/rc-dreambox.c diff --git a/drivers/media/rc/keymaps/Makefile b/drivers/media/rc/keymaps/Makefile index f513ff5caf4e..6931c89fca99 100644 --- a/drivers/media/rc/keymaps/Makefile +++ b/drivers/media/rc/keymaps/Makefile @@ -37,6 +37,7 @@ obj-$(CONFIG_RC_MAP) += \ rc-dm1105-nec.o \ rc-dntv-live-dvb-t.o \ rc-dntv-live-dvbt-pro.o \ + rc-dreambox.o \ rc-dtt200u.o \ rc-dvbsky.o \ rc-dvico-mce.o \ diff --git a/drivers/media/rc/keymaps/rc-dreambox.c b/drivers/media/rc/keymaps/rc-dreambox.c new file mode 100644 index 000000000000..dea024fa3a22 --- /dev/null +++ b/drivers/media/rc/keymaps/rc-dreambox.c @@ -0,0 +1,151 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c) 2021 Emanuel Strobel <emanuel.strobel@yahoo.com> + */ + +#include <media/rc-map.h> +#include <linux/module.h> + +/* + * Keytable for Dreambox RC10/RC0 and RC20/RC-BT remote controls + * + * Keys that are not IR addressable: + * + * // DREAM switches to STB control mode + * // TV switches to TV control mode + * // MODE toggles STB/TV/BT control modes + * + */ + +static struct rc_map_table dreambox[] = { + /* Dreambox RC10/RC0/RCU-BT remote */ + { 0x3200, KEY_POWER }, + + // DREAM + { 0x3290, KEY_HELP }, + // TV + + { 0x3201, KEY_1 }, + { 0x3202, KEY_2 }, + { 0x3203, KEY_3 }, + { 0x3204, KEY_4 }, + { 0x3205, KEY_5 }, + { 0x3206, KEY_6 }, + { 0x3207, KEY_7 }, + { 0x3208, KEY_8 }, + { 0x3209, KEY_9 }, + { 0x320a, KEY_PREVIOUS }, + { 0x320b, KEY_0 }, + { 0x320c, KEY_NEXT }, + + { 0x321f, KEY_RED }, + { 0x3220, KEY_GREEN }, + { 0x3221, KEY_YELLOW }, + { 0x3222, KEY_BLUE }, + + { 0x3210, KEY_INFO }, + { 0x3212, KEY_MENU }, + { 0x320e, KEY_AUDIO }, + { 0x3218, KEY_PVR }, + + { 0x3213, KEY_LEFT }, + { 0x3211, KEY_UP }, + { 0x3215, KEY_RIGHT }, + { 0x3217, KEY_DOWN }, + { 0x3214, KEY_OK }, + + { 0x3219, KEY_VOLUMEUP }, + { 0x321c, KEY_VOLUMEDOWN }, + + { 0x321d, KEY_ESC }, // EXIT + { 0x321a, KEY_MUTE }, + + { 0x321b, KEY_PAGEUP }, + { 0x321e, KEY_PAGEDOWN }, + + { 0x3223, KEY_PREVIOUSSONG }, + { 0x3224, KEY_PLAYPAUSE }, + { 0x3225, KEY_STOP }, + { 0x3226, KEY_NEXTSONG }, + + { 0x3227, KEY_TV }, + { 0x3228, KEY_RADIO }, + { 0x3229, KEY_TEXT }, + { 0x322a, KEY_RECORD }, + + /* Dreambox RC20/RC-BT */ + { 0x3407, KEY_MUTE }, + // MODE + { 0x3401, KEY_POWER }, + + { 0x3432, KEY_PREVIOUSSONG }, + { 0x3433, KEY_PLAYPAUSE }, + { 0x3435, KEY_NEXTSONG }, + + { 0x3436, KEY_RECORD }, + { 0x3434, KEY_STOP }, + { 0x3425, KEY_TEXT }, + + { 0x341f, KEY_RED }, + { 0x3420, KEY_GREEN }, + { 0x3421, KEY_YELLOW }, + { 0x3422, KEY_BLUE }, + + { 0x341b, KEY_INFO }, + { 0x341c, KEY_MENU }, + { 0x3430, KEY_AUDIO }, + { 0x3431, KEY_PVR }, + + { 0x3414, KEY_LEFT }, + { 0x3411, KEY_UP }, + { 0x3416, KEY_RIGHT }, + { 0x3419, KEY_DOWN }, + { 0x3415, KEY_OK }, + + { 0x3413, KEY_VOLUMEUP }, + { 0x3418, KEY_VOLUMEDOWN }, + + { 0x3412, KEY_ESC }, // EXIT + { 0x3426, KEY_HELP }, // MIC + + { 0x3417, KEY_PAGEUP }, + { 0x341a, KEY_PAGEDOWN }, + + { 0x3404, KEY_1 }, + { 0x3405, KEY_2 }, + { 0x3406, KEY_3 }, + { 0x3408, KEY_4 }, + { 0x3409, KEY_5 }, + { 0x340a, KEY_6 }, + { 0x340c, KEY_7 }, + { 0x340d, KEY_8 }, + { 0x340e, KEY_9 }, + { 0x340b, KEY_PREVIOUS }, + { 0x3410, KEY_0 }, + { 0x340f, KEY_NEXT }, +}; + +static struct rc_map_list dreambox_map = { + .map = { + .scan = dreambox, + .size = ARRAY_SIZE(dreambox), + .rc_proto = RC_PROTO_NEC, + .name = RC_MAP_DREAMBOX, + } +}; + +static int __init init_rc_map_dreambox(void) +{ + return rc_map_register(&dreambox_map); +} + +static void __exit exit_rc_map_dreambox(void) +{ + rc_map_unregister(&dreambox_map); +} + +module_init(init_rc_map_dreambox) +module_exit(exit_rc_map_dreambox) + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Emanuel Strobel <emanuel.strobel@yahoo.com>"); diff --git a/include/media/rc-map.h b/include/media/rc-map.h index 793b54342dff..94ee968d4722 100644 --- a/include/media/rc-map.h +++ b/include/media/rc-map.h @@ -241,6 +241,7 @@ struct rc_map *rc_map_get(const char *name); #define RC_MAP_DM1105_NEC "rc-dm1105-nec" #define RC_MAP_DNTV_LIVE_DVB_T "rc-dntv-live-dvb-t" #define RC_MAP_DNTV_LIVE_DVBT_PRO "rc-dntv-live-dvbt-pro" +#define RC_MAP_DREAMBOX "rc-dreambox" #define RC_MAP_DTT200U "rc-dtt200u" #define RC_MAP_DVBSKY "rc-dvbsky" #define RC_MAP_DVICO_MCE "rc-dvico-mce" -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0043-FROMGIT-6.4-dt-bindings-media-rc-add-rc-beelink-mxii.patch ================================================ From b2ab233ef1556f2e210c6fe88ea7fca11b52092c Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 4 Feb 2023 06:42:20 +0000 Subject: [PATCH 043/120] FROMGIT(6.4): dt-bindings: media: rc: add rc-beelink-mxiii Add a binding for the rc-beelink-mxiii remote keymap Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/media/rc.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/media/rc.yaml b/Documentation/devicetree/bindings/media/rc.yaml index e7d2ae5a7eb9..deeda4bb8dae 100644 --- a/Documentation/devicetree/bindings/media/rc.yaml +++ b/Documentation/devicetree/bindings/media/rc.yaml @@ -39,6 +39,7 @@ properties: - rc-avertv-303 - rc-azurewave-ad-tu700 - rc-beelink-gs1 + - rc-beelink-mxiii - rc-behold - rc-behold-columbus - rc-budget-ci-old -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0044-FROMGIT-6.4-media-rc-add-Beelink-Mini-MXIII-keymap.patch ================================================ From 428bfd6a70cdf2dba7e39568e2cb5a3c283c0bb6 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 8 Dec 2021 15:33:47 +0000 Subject: [PATCH 044/120] FROMGIT(6.4): media: rc: add Beelink Mini MXIII keymap Add a keymap for the simple IR (NEC) remote used with the Beelink Mini MXIII Android STB device. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- drivers/media/rc/keymaps/Makefile | 1 + drivers/media/rc/keymaps/rc-beelink-mxiii.c | 57 +++++++++++++++++++++ include/media/rc-map.h | 1 + 3 files changed, 59 insertions(+) create mode 100644 drivers/media/rc/keymaps/rc-beelink-mxiii.c diff --git a/drivers/media/rc/keymaps/Makefile b/drivers/media/rc/keymaps/Makefile index 6931c89fca99..f19558fdab0c 100644 --- a/drivers/media/rc/keymaps/Makefile +++ b/drivers/media/rc/keymaps/Makefile @@ -22,6 +22,7 @@ obj-$(CONFIG_RC_MAP) += \ rc-avertv-303.o \ rc-azurewave-ad-tu700.o \ rc-beelink-gs1.o \ + rc-beelink-mxiii.o \ rc-behold-columbus.o \ rc-behold.o \ rc-budget-ci-old.o \ diff --git a/drivers/media/rc/keymaps/rc-beelink-mxiii.c b/drivers/media/rc/keymaps/rc-beelink-mxiii.c new file mode 100644 index 000000000000..01180cd92205 --- /dev/null +++ b/drivers/media/rc/keymaps/rc-beelink-mxiii.c @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Christian Hewitt <christianshewitt@gmail.com> + * + */ + +#include <media/rc-map.h> +#include <linux/module.h> + +/* + * Keytable for the Beelink Mini MXIII remote control + * + */ + +static struct rc_map_table beelink_mxiii[] = { + { 0xb2dc, KEY_POWER }, + + { 0xb288, KEY_MUTE }, + { 0xb282, KEY_HOME }, + + { 0xb2ca, KEY_UP }, + { 0xb299, KEY_LEFT }, + { 0xb2ce, KEY_OK }, + { 0xb2c1, KEY_RIGHT }, + { 0xb2d2, KEY_DOWN }, + + { 0xb2c5, KEY_MENU }, + { 0xb29a, KEY_BACK }, + + { 0xb281, KEY_VOLUMEDOWN }, + { 0xb280, KEY_VOLUMEUP }, +}; + +static struct rc_map_list beelink_mxiii_map = { + .map = { + .scan = beelink_mxiii, + .size = ARRAY_SIZE(beelink_mxiii), + .rc_proto = RC_PROTO_NEC, + .name = RC_MAP_BEELINK_MXIII, + } +}; + +static int __init init_rc_map_beelink_mxiii(void) +{ + return rc_map_register(&beelink_mxiii_map); +} + +static void __exit exit_rc_map_beelink_mxiii(void) +{ + rc_map_unregister(&beelink_mxiii_map); +} + +module_init(init_rc_map_beelink_mxiii) +module_exit(exit_rc_map_beelink_mxiii) + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Christian Hewitt <christianshewitt@gmail.com"); diff --git a/include/media/rc-map.h b/include/media/rc-map.h index 94ee968d4722..4676545ffd8f 100644 --- a/include/media/rc-map.h +++ b/include/media/rc-map.h @@ -225,6 +225,7 @@ struct rc_map *rc_map_get(const char *name); #define RC_MAP_AVERTV_303 "rc-avertv-303" #define RC_MAP_AZUREWAVE_AD_TU700 "rc-azurewave-ad-tu700" #define RC_MAP_BEELINK_GS1 "rc-beelink-gs1" +#define RC_MAP_BEELINK_MXIII "rc-beelink-mxiii" #define RC_MAP_BEHOLD "rc-behold" #define RC_MAP_BEHOLD_COLUMBUS "rc-behold-columbus" #define RC_MAP_BUDGET_CI_OLD "rc-budget-ci-old" -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0045-FROMGIT-6.4-arm64-dts-meson-gxbb-kii-pro-sort-and-ti.patch ================================================ From 5c659c53668a1a8dbe101959142bb9e468a7cd87 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Fri, 10 Feb 2023 02:16:12 +0000 Subject: [PATCH 045/120] FROMGIT(6.4): arm64: dts: meson: gxbb-kii-pro: sort and tidy the dts Alpha-sort the nodes, move the default line in the LED node to where it's normally found, and remove excess spacing. No functional changes. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> Tested-by: Ferass El Hafidi <vitali64pmemail@protonmail.com> Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org> --- .../boot/dts/amlogic/meson-gxbb-kii-pro.dts | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts index 5f2d4317ecfb..73ad0f5110f3 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts @@ -6,10 +6,10 @@ /dts-v1/; #include "meson-gxbb-p20x.dtsi" - #include <dt-bindings/gpio/gpio.h> #include <dt-bindings/input/input.h> #include <dt-bindings/leds/common.h> + / { compatible = "videostrong,kii-pro", "amlogic,meson-gxbb"; model = "Videostrong KII Pro"; @@ -18,9 +18,9 @@ leds { compatible = "gpio-leds"; led { gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_LOW>; - default-state = "off"; color = <LED_COLOR_ID_RED>; function = LED_FUNCTION_STATUS; + default-state = "off"; }; }; @@ -34,24 +34,8 @@ button-reset { gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_HIGH>; }; }; - }; - - -&uart_A { - status = "okay"; - pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; - pinctrl-names = "default"; - uart-has-rtscts; - - bluetooth { - compatible = "brcm,bcm4335a0"; - }; -}; - - - ðmac { status = "okay"; pinctrl-0 = <ð_rmii_pins>; @@ -78,3 +62,14 @@ eth_phy0: ethernet-phy@0 { &ir { linux,rc-map-name = "rc-videostrong-kii-pro"; }; + +&uart_A { + status = "okay"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "brcm,bcm4335a0"; + }; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0046-FROMGIT-6.4-arm64-dts-meson-gxbb-kii-pro-complete-th.patch ================================================ From eb1e3d228629c1946aef18c7337c5bc0e2694610 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Fri, 10 Feb 2023 02:21:08 +0000 Subject: [PATCH 046/120] FROMGIT(6.4): arm64: dts: meson: gxbb-kii-pro: complete the bluetooth node Add missing content to the bluetooth node to align it with the content used in (all) other GXBB dts files. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> Tested-by: Ferass El Hafidi <vitali64pmemail@protonmail.com> Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org> --- arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts index 73ad0f5110f3..a800e8955c4a 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts @@ -71,5 +71,10 @@ &uart_A { bluetooth { compatible = "brcm,bcm4335a0"; + shutdown-gpios = <&gpio GPIOX_20 GPIO_ACTIVE_HIGH>; + host-wakeup-gpios = <&gpio GPIOX_21 GPIO_ACTIVE_HIGH>; + max-speed = <2000000>; + clocks = <&wifi32k>; + clock-names = "lpo"; }; }; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0047-FROMGIT-6.4-arm64-dts-meson-gxbb-kii-pro-add-initial.patch ================================================ From 52fdf527ce95b5c7347cde0f0105b3003a834ac8 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Fri, 10 Feb 2023 02:29:00 +0000 Subject: [PATCH 047/120] FROMGIT(6.4): arm64: dts: meson: gxbb-kii-pro: add initial audio support Add initial support for HDMI and S/PDIF audio output. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> Tested-by: Ferass El Hafidi <vitali64pmemail@protonmail.com> Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org> --- .../boot/dts/amlogic/meson-gxbb-kii-pro.dts | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts index a800e8955c4a..e238f1f10124 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts @@ -9,11 +9,19 @@ #include <dt-bindings/gpio/gpio.h> #include <dt-bindings/input/input.h> #include <dt-bindings/leds/common.h> +#include <dt-bindings/sound/meson-aiu.h> / { compatible = "videostrong,kii-pro", "amlogic,meson-gxbb"; model = "Videostrong KII Pro"; + spdif_dit: audio-codec-0 { + #sound-dai-cells = <0>; + compatible = "linux,spdif-dit"; + status = "okay"; + sound-name-prefix = "DIT"; + }; + leds { compatible = "gpio-leds"; led { @@ -34,6 +42,58 @@ button-reset { gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_HIGH>; }; }; + + sound { + compatible = "amlogic,gx-sound-card"; + model = "KII-PRO"; + assigned-clocks = <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>, + <&clkc CLKID_MPLL2>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + + dai-link-0 { + sound-dai = <&aiu AIU_CPU CPU_I2S_FIFO>; + }; + + dai-link-1 { + sound-dai = <&aiu AIU_CPU CPU_SPDIF_FIFO>; + }; + + dai-link-2 { + sound-dai = <&aiu AIU_CPU CPU_I2S_ENCODER>; + dai-format = "i2s"; + mclk-fs = <256>; + + codec-0 { + sound-dai = <&aiu AIU_HDMI CTRL_I2S>; + }; + }; + + dai-link-3 { + sound-dai = <&aiu AIU_CPU CPU_SPDIF_ENCODER>; + + codec-0 { + sound-dai = <&spdif_dit>; + }; + }; + + dai-link-4 { + sound-dai = <&aiu AIU_HDMI CTRL_OUT>; + + codec-0 { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&aiu { + status = "okay"; + pinctrl-0 = <&spdif_out_y_pins>; + pinctrl-names = "default"; }; ðmac { -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0048-FROMGIT-6.4-dt-bindings-arm-amlogic-Document-the-boa.patch ================================================ From dafb23b2d7961125dc39553fa6b2ffb1b892a8b5 Mon Sep 17 00:00:00 2001 From: Neil Armstrong <neil.armstrong@linaro.org> Date: Fri, 3 Mar 2023 18:37:57 +0100 Subject: [PATCH 048/120] FROMGIT(6.4): dt-bindings: arm: amlogic: Document the boards with the BPI-CM4 connected The BPI-CM4 module with an Amlogic A311D SoC is a module compatible with the Raspberry Pi CM4 specifications. Document the boards using this module, by specifying the BananaPi CM4 compatible in addition to the baseboard compatible. Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> --- Documentation/devicetree/bindings/arm/amlogic.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml index 7ded40b309a4..94f68e7c85ed 100644 --- a/Documentation/devicetree/bindings/arm/amlogic.yaml +++ b/Documentation/devicetree/bindings/arm/amlogic.yaml @@ -158,6 +158,14 @@ properties: - const: amlogic,a311d - const: amlogic,g12b + - description: Boards using the BPI-CM4 module with Amlogic Meson G12B A311D SoC + items: + - enum: + - bananapi,bpi-cm4io + - const: bananapi,bpi-cm4 + - const: amlogic,a311d + - const: amlogic,g12b + - description: Boards with the Amlogic Meson G12B S922X SoC items: - enum: -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0049-FROMGIT-6.4-arm64-dts-amlogic-Add-initial-support-fo.patch ================================================ From b76cd699a611d0fb168b6204489b8f2e41311b6b Mon Sep 17 00:00:00 2001 From: Neil Armstrong <neil.armstrong@linaro.org> Date: Sat, 4 Mar 2023 07:14:17 +0000 Subject: [PATCH 049/120] FROMGIT(6.4): arm64: dts: amlogic: Add initial support for BPI-CM4 module with BPI-CM4IO baseboard Add support for both the BananaPi BPI-CM4 module and the BananaPi baseboard which is comnpatible with the RaspberryPi CM4IO baseboard. The BananaPi BPI-CM4 module follows the CM4 specifications at [1], but with a single HDMI port and a since DSI output. The current CM4IO baseboard DT should work fine on the Raspberry CM4 baseboard and other derivatives baseboards, but proper DT should be written for other baseboards. The split is done so it's easy to describe a new CM4 baseboard, enabling only the necessary HW used on the baseboard. [1] https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> --- arch/arm64/boot/dts/amlogic/Makefile | 1 + .../amlogic/meson-g12b-bananapi-cm4-cm4io.dts | 165 ++++++++ .../dts/amlogic/meson-g12b-bananapi-cm4.dtsi | 388 ++++++++++++++++++ 3 files changed, 554 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-g12b-bananapi-cm4-cm4io.dts create mode 100644 arch/arm64/boot/dts/amlogic/meson-g12b-bananapi-cm4.dtsi diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index 5d5ec22a469e..f5845e565efb 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -9,6 +9,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-g12a-sei510.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12a-u200.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12a-x96-max.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-a311d-khadas-vim3.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-g12b-bananapi-cm4-cm4io.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gsking-x.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking-pro.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-bananapi-cm4-cm4io.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-bananapi-cm4-cm4io.dts new file mode 100644 index 000000000000..1b0c3881c6a1 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-g12b-bananapi-cm4-cm4io.dts @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2023 Neil Armstrong <neil.armstrong@linaro.org> + */ + +/dts-v1/; + +#include "meson-g12b-bananapi-cm4.dtsi" +#include <dt-bindings/input/input.h> +#include <dt-bindings/leds/common.h> +#include <dt-bindings/sound/meson-g12a-tohdmitx.h> + +/ { + compatible = "bananapi,bpi-cm4io", "bananapi,bpi-cm4", "amlogic,a311d", "amlogic,g12b"; + model = "BananaPi BPI-CM4IO Baseboard with BPI-CM4 Module"; + + aliases { + ethernet0 = ðmac; + i2c0 = &i2c1; + i2c1 = &i2c3; + }; + + adc-keys { + compatible = "adc-keys"; + io-channels = <&saradc 2>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1710000>; + + button-function { + label = "Function"; + linux,code = <KEY_FN>; + press-threshold-microvolt = <10000>; + }; + }; + + hdmi_connector: hdmi-connector { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_connector_in: endpoint { + remote-endpoint = <&hdmi_tx_tmds_out>; + }; + }; + }; + + leds { + compatible = "gpio-leds"; + + led-blue { + color = <LED_COLOR_ID_BLUE>; + function = LED_FUNCTION_STATUS; + gpios = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "heartbeat"; + }; + + led-green { + color = <LED_COLOR_ID_GREEN>; + function = LED_FUNCTION_STATUS; + gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; + }; + }; + + sound { + compatible = "amlogic,axg-sound-card"; + model = "BPI-CM4IO"; + audio-aux-devs = <&tdmout_b>; + audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1", + "TDMOUT_B IN 1", "FRDDR_B OUT 1", + "TDMOUT_B IN 2", "FRDDR_C OUT 1", + "TDM_B Playback", "TDMOUT_B OUT"; + + assigned-clocks = <&clkc CLKID_MPLL2>, + <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + + dai-link-0 { + sound-dai = <&frddr_a>; + }; + + dai-link-1 { + sound-dai = <&frddr_b>; + }; + + dai-link-2 { + sound-dai = <&frddr_c>; + }; + + /* 8ch hdmi interface */ + dai-link-3 { + sound-dai = <&tdmif_b>; + dai-format = "i2s"; + dai-tdm-slot-tx-mask-0 = <1 1>; + dai-tdm-slot-tx-mask-1 = <1 1>; + dai-tdm-slot-tx-mask-2 = <1 1>; + dai-tdm-slot-tx-mask-3 = <1 1>; + mclk-fs = <256>; + + codec { + sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>; + }; + }; + + /* hdmi glue */ + dai-link-4 { + sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>; + + codec { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&cecb_AO { + status = "okay"; +}; + +ðmac { + status = "okay"; +}; + +&hdmi_tx { + status = "okay"; +}; + +&hdmi_tx_tmds_port { + hdmi_tx_tmds_out: endpoint { + remote-endpoint = <&hdmi_connector_in>; + }; +}; + +/* CSI port */ +&i2c1 { + status = "okay"; +}; + +/* DSI port for touchscreen */ +&i2c3 { + status = "okay"; +}; + +/* miniPCIe port with USB + SIM slot */ +&pcie { + status = "okay"; +}; + +&sd_emmc_b { + status = "okay"; +}; + +&tohdmitx { + status = "okay"; +}; + +/* Peripheral Only USB-C port */ +&usb { + dr_mode = "peripheral"; + + status = "okay"; +}; diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-bananapi-cm4.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b-bananapi-cm4.dtsi new file mode 100644 index 000000000000..dc0988c82694 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-g12b-bananapi-cm4.dtsi @@ -0,0 +1,388 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2023 Neil Armstrong <neil.armstrong@linaro.org> + */ + +#include "meson-g12b-a311d.dtsi" +#include <dt-bindings/gpio/meson-g12a-gpio.h> + +/ { + aliases { + serial0 = &uart_AO; + rtc1 = &vrtc; + }; + + chosen { + stdout-path = "serial0:115200n8"; + }; + + emmc_pwrseq: emmc-pwrseq { + compatible = "mmc-pwrseq-emmc"; + reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>; + }; + + memory@0 { + device_type = "memory"; + reg = <0x0 0x0 0x0 0x40000000>; + }; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpio GPIOAO_6 GPIO_ACTIVE_LOW>; + clocks = <&wifi32k>; + clock-names = "ext_clock"; + }; + + emmc_1v8: regulator-emmc_1v8 { + compatible = "regulator-fixed"; + regulator-name = "EMMC_1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vddao_3v3>; + regulator-always-on; + }; + + dc_in: regulator-dc-in { + compatible = "regulator-fixed"; + regulator-name = "DC_IN"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + regulator-always-on; + }; + + vddio_c: regulator-vddio-c { + compatible = "regulator-gpio"; + regulator-name = "VDDIO_C"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; + + enable-gpio = <&gpio_ao GPIOAO_3 GPIO_OPEN_DRAIN>; + enable-active-high; + regulator-always-on; + + gpios = <&gpio_ao GPIOAO_9 GPIO_OPEN_DRAIN>; + gpios-states = <1>; + + states = <1800000 0>, + <3300000 1>; + }; + + vddao_1v8: regulator-vddao-1v8 { + compatible = "regulator-fixed"; + regulator-name = "VDDAO_1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vddao_3v3>; + regulator-always-on; + }; + + vddao_3v3: regulator-vddao-3v3 { + compatible = "regulator-fixed"; + regulator-name = "VDDAO_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&dc_in>; + regulator-always-on; + }; + + vddcpu_a: regulator-vddcpu-a { + /* + * MP8756GD DC/DC Regulator. + */ + compatible = "pwm-regulator"; + + regulator-name = "VDDCPU_A"; + regulator-min-microvolt = <680000>; + regulator-max-microvolt = <1040000>; + + pwm-supply = <&dc_in>; + + pwms = <&pwm_ab 0 1250 0>; + pwm-dutycycle-range = <100 0>; + + regulator-boot-on; + regulator-always-on; + }; + + vddcpu_b: regulator-vddcpu-b { + /* + * SY8120B1ABC DC/DC Regulator. + */ + compatible = "pwm-regulator"; + + regulator-name = "VDDCPU_B"; + regulator-min-microvolt = <680000>; + regulator-max-microvolt = <1040000>; + + pwm-supply = <&dc_in>; + + pwms = <&pwm_AO_cd 1 1250 0>; + pwm-dutycycle-range = <100 0>; + + regulator-boot-on; + regulator-always-on; + }; + + wifi32k: wifi32k { + compatible = "pwm-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */ + }; +}; + +&arb { + status = "okay"; +}; + +&clkc_audio { + status = "okay"; +}; + +&cec_AO { + pinctrl-0 = <&cec_ao_a_h_pins>; + pinctrl-names = "default"; + hdmi-phandle = <&hdmi_tx>; +}; + +&cecb_AO { + pinctrl-0 = <&cec_ao_b_h_pins>; + pinctrl-names = "default"; + hdmi-phandle = <&hdmi_tx>; +}; + +&cpu0 { + cpu-supply = <&vddcpu_b>; + operating-points-v2 = <&cpu_opp_table_0>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu1 { + cpu-supply = <&vddcpu_b>; + operating-points-v2 = <&cpu_opp_table_0>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu100 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu101 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu102 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu103 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&ext_mdio { + external_phy: ethernet-phy@0 { + /* Realtek RTL8211F (0x001cc916) */ + reg = <0>; + max-speed = <1000>; + + interrupt-parent = <&gpio_intc>; + /* MAC_INTR on GPIOZ_14 */ + interrupts = <26 IRQ_TYPE_LEVEL_LOW>; + }; +}; + +/* Ethernet to be enabled in baseboard DT */ +ðmac { + pinctrl-0 = <ð_pins>, <ð_rgmii_pins>; + pinctrl-names = "default"; + phy-mode = "rgmii-txid"; + phy-handle = <&external_phy>; +}; + +&frddr_a { + status = "okay"; +}; + +&frddr_b { + status = "okay"; +}; + +&frddr_c { + status = "okay"; +}; + +/* HDMI to be enabled in baseboard DT */ +&hdmi_tx { + pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>; + pinctrl-names = "default"; + hdmi-supply = <&dc_in>; +}; + +/* "Camera" I2C bus */ +&i2c1 { + pinctrl-0 = <&i2c1_sda_h6_pins>, <&i2c1_sck_h7_pins>; + pinctrl-names = "default"; +}; + +/* Main I2C bus */ +&i2c2 { + pinctrl-0 = <&i2c2_sda_x_pins>, <&i2c2_sck_x_pins>; + pinctrl-names = "default"; +}; + +/* "ID" I2C bus */ +&i2c3 { + pinctrl-0 = <&i2c3_sda_a_pins>, <&i2c3_sck_a_pins>; + pinctrl-names = "default"; +}; + +&pcie { + reset-gpios = <&gpio GPIOA_8 GPIO_ACTIVE_LOW>; +}; + +&pwm_ab { + pinctrl-0 = <&pwm_a_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin0"; + + status = "okay"; +}; + +&pwm_ef { + pinctrl-0 = <&pwm_e_pins>; + pinctrl-names = "default"; + + status = "okay"; +}; + +&pwm_AO_cd { + pinctrl-0 = <&pwm_ao_d_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin1"; + + status = "okay"; +}; + +&saradc { + vref-supply = <&vddao_1v8>; + + status = "okay"; +}; + +/* on-module SDIO WiFi */ +&sd_emmc_a { + pinctrl-0 = <&sdio_pins>; + pinctrl-1 = <&sdio_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + #address-cells = <1>; + #size-cells = <0>; + + bus-width = <4>; + sd-uhs-sdr104; + max-frequency = <50000000>; + + non-removable; + disable-wp; + + /* WiFi firmware requires power in suspend */ + keep-power-in-suspend; + + mmc-pwrseq = <&sdio_pwrseq>; + + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vddao_3v3>; + + status = "okay"; + + rtl8822cs: wifi@1 { + reg = <1>; + }; +}; + +/* SD card to be enabled in baseboard DT */ +&sd_emmc_b { + pinctrl-0 = <&sdcard_c_pins>; + pinctrl-1 = <&sdcard_clk_gate_c_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <4>; + cap-sd-highspeed; + max-frequency = <50000000>; + disable-wp; + + cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>; + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vddio_c>; +}; + +/* on-module eMMC */ +&sd_emmc_c { + pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>; + pinctrl-1 = <&emmc_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <8>; + cap-mmc-highspeed; + mmc-ddr-1_8v; + mmc-hs200-1_8v; + max-frequency = <200000000>; + disable-wp; + + mmc-pwrseq = <&emmc_pwrseq>; + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vddao_1v8>; + + status = "okay"; +}; + +&tdmif_b { + status = "okay"; +}; + +&tdmout_b { + status = "okay"; +}; + +/* on-module UART BT */ +&uart_A { + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + status = "okay"; + + bluetooth { + compatible = "realtek,rtl8822cs-bt"; + enable-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + host-wake-gpios = <&gpio GPIOX_19 GPIO_ACTIVE_HIGH>; + device-wake-gpios = <&gpio GPIOX_18 GPIO_ACTIVE_HIGH>; + }; +}; + +&uart_AO { + pinctrl-0 = <&uart_ao_a_pins>; + pinctrl-names = "default"; + + status = "okay"; +}; + +&usb { + phys = <&usb2_phy0>, <&usb2_phy1>; + phy-names = "usb2-phy0", "usb2-phy1"; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0051-FROMLIST-v5-dt-bindings-vendor-prefixes-Add-Titan-Mi.patch ================================================ From 022946dc830b928d2361e87501c7fca8505d6910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= <afaerber@suse.de> Date: Sun, 20 Feb 2022 08:23:12 +0000 Subject: [PATCH 051/120] FROMLIST(v5): dt-bindings: vendor-prefixes: Add Titan Micro Electronics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Assign vendor prefix "titanmec", matching their domain name. Acked-by: Rob Herring <robh@kernel.org> Signed-off-by: Andreas Färber <afaerber@suse.de> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> --- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml index 6e323a380294..9570cc9e0e06 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.yaml +++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml @@ -1303,6 +1303,8 @@ patternProperties: description: Texas Instruments "^tianma,.*": description: Tianma Micro-electronics Co., Ltd. + "^titanmec,.*": + description: Shenzhen Titan Micro Electronics Co., Ltd. "^tlm,.*": description: Trusted Logic Mobility "^tmt,.*": -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0052-FROMLIST-v5-dt-bindings-auxdisplay-Add-Titan-Micro-E.patch ================================================ From 94060333363a0241442deb5b993655188901840d Mon Sep 17 00:00:00 2001 From: Heiner Kallweit <hkallweit1@gmail.com> Date: Sun, 20 Feb 2022 08:24:47 +0000 Subject: [PATCH 052/120] FROMLIST(v5): dt-bindings: auxdisplay: Add Titan Micro Electronics TM1628 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a YAML schema binding for TM1628 auxdisplay (7/11-segment LED) controller. This patch is partially based on previous RFC work from Andreas Färber <afaerber@suse.de>. Co-developed-by: Andreas Färber <afaerber@suse.de> Signed-off-by: Andreas Färber <afaerber@suse.de> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> --- .../bindings/auxdisplay/titanmec,tm1628.yaml | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 Documentation/devicetree/bindings/auxdisplay/titanmec,tm1628.yaml diff --git a/Documentation/devicetree/bindings/auxdisplay/titanmec,tm1628.yaml b/Documentation/devicetree/bindings/auxdisplay/titanmec,tm1628.yaml new file mode 100644 index 000000000000..d9cbbc950aab --- /dev/null +++ b/Documentation/devicetree/bindings/auxdisplay/titanmec,tm1628.yaml @@ -0,0 +1,82 @@ +# SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/leds/titanmec,tm1628.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Titan Micro Electronics TM1628 LED controller + +properties: + compatible: + enum: + - titanmec,tm1628 + + reg: + maxItems: 1 + + grid: + description: + Mapping of display digit position to grid number. + This implicitly defines the display size. + $ref: /schemas/types.yaml#/definitions/uint8-array + minItems: 1 + maxItems: 7 + + segment-mapping: + description: + Mapping of 7 segment display segments A-G to bit numbers 1-12. + $ref: /schemas/types.yaml#/definitions/uint8-array + minItems: 7 + maxItems: 7 + + "#address-cells": + const: 2 + + "#size-cells": + const: 0 + +required: + - compatible + - reg + +patternProperties: + "^.*@[1-7],([1-9]|1[0-6])$": + type: object + description: | + Properties for a single LED. + + properties: + reg: + description: | + 1-based grid number, followed by 1-based segment bit number. + maxItems: 1 + + required: + - reg + +examples: + - | + #include <dt-bindings/leds/common.h> + + spi { + #address-cells = <1>; + #size-cells = <0>; + + led-controller@0 { + compatible = "titanmec,tm1628"; + reg = <0>; + spi-3-wire; + spi-lsb-first; + spi-max-frequency = <500000>; + grid = /bits/ 8 <4 3 2 1>; + segment-mapping = /bits/ 8 <4 5 6 1 2 3 7>; + #address-cells = <2>; + #size-cells = <0>; + + alarmn@5,4 { + reg = <5 4>; + function = LED_FUNCTION_ALARM; + }; + }; + }; +... -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0053-FROMLIST-v5-docs-ABI-document-tm1628-attribute-displ.patch ================================================ From a53c2bef9b9f389914eb410e73b02b5099266708 Mon Sep 17 00:00:00 2001 From: Heiner Kallweit <hkallweit1@gmail.com> Date: Sun, 20 Feb 2022 08:26:27 +0000 Subject: [PATCH 053/120] FROMLIST(v5): docs: ABI: document tm1628 attribute display-text Document the attribute for reading / writing the text to be displayed on the 7 segment display. Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> --- Documentation/ABI/testing/sysfs-devices-auxdisplay-tm1628 | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-devices-auxdisplay-tm1628 diff --git a/Documentation/ABI/testing/sysfs-devices-auxdisplay-tm1628 b/Documentation/ABI/testing/sysfs-devices-auxdisplay-tm1628 new file mode 100644 index 000000000000..382757e721af --- /dev/null +++ b/Documentation/ABI/testing/sysfs-devices-auxdisplay-tm1628 @@ -0,0 +1,7 @@ +What: /sys/devices/.../display-text +Date: February 2022 +Contact: Heiner Kallweit <hkallweit1@gmail.com> +Description: + The text to be displayed on the 7 segment display. + Any printable character is allowed as input, but some + can not be displayed in a readable way with 7 segments. -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0054-FROMLIST-v5-auxdisplay-add-support-for-Titanmec-TM16.patch ================================================ From e64e545d0880e5617042ae8d28e60a455a689a78 Mon Sep 17 00:00:00 2001 From: Heiner Kallweit <hkallweit1@gmail.com> Date: Mon, 4 Apr 2022 18:51:20 +0000 Subject: [PATCH 054/120] FROMLIST(v5): auxdisplay: add support for Titanmec TM1628 7 segment display controller MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch adds support for the Titanmec TM1628 7 segment display controller. It's based on previous RFC work from Andreas Färber. The RFC version placed the driver in the LED subsystem, but this was NAK'ed by the LED maintainer. Therefore I moved the driver to /drivers/auxdisplay what seems most reasonable to me. Further changes to the RFC version: - Driver can be built also w/o LED class support, for displays that don't have any symbols to be exposed as LED's. - Simplified the code and rewrote a lot of it. - Driver is now kind of a MVP, but functionality should be sufficient for most use cases. - Use the existing 7 segment support in uapi/linux/map_to_7segment.h as suggested by Geert Uytterhoeven. Note: There's a number of chips from other manufacturers that are almost identical, e.g. FD628, SM1628. Only difference I saw so far is that they partially support other display modes. TM1628: 6x12, 7x11 SM1628C: 4x13, 5x12, 6x11, 7x10 For typical displays on devices using these chips this difference shouldn't matter. Successfully tested on a TX3 Mini TV box that has an SM1628C and a display with 4 digits and 7 symbols. Co-developed-by: Andreas Färber <afaerber@suse.de> Signed-off-by: Andreas Färber <afaerber@suse.de> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> --- drivers/auxdisplay/Kconfig | 11 ++ drivers/auxdisplay/Makefile | 1 + drivers/auxdisplay/tm1628.c | 376 ++++++++++++++++++++++++++++++++++++ 3 files changed, 388 insertions(+) create mode 100644 drivers/auxdisplay/tm1628.c diff --git a/drivers/auxdisplay/Kconfig b/drivers/auxdisplay/Kconfig index 64012cda4d12..2764afc5c5d9 100644 --- a/drivers/auxdisplay/Kconfig +++ b/drivers/auxdisplay/Kconfig @@ -203,6 +203,17 @@ config ARM_CHARLCD line and the Linux version on the second line, but that's still useful. +config TM1628 + tristate "TM1628 driver for LED 7/11 segment displays" + depends on SPI + depends on OF || COMPILE_TEST + help + Say Y to enable support for Titan Micro Electronics TM1628 + LED controller. + + It's a 3-wire SPI device controlling a two-dimensional grid of + LEDs. Dimming is applied to all outputs through an internal PWM. + menuconfig PARPORT_PANEL tristate "Parallel port LCD/Keypad Panel support" depends on PARPORT diff --git a/drivers/auxdisplay/Makefile b/drivers/auxdisplay/Makefile index 6968ed4d3f0a..7728e17e1c5a 100644 --- a/drivers/auxdisplay/Makefile +++ b/drivers/auxdisplay/Makefile @@ -14,3 +14,4 @@ obj-$(CONFIG_HT16K33) += ht16k33.o obj-$(CONFIG_PARPORT_PANEL) += panel.o obj-$(CONFIG_LCD2S) += lcd2s.o obj-$(CONFIG_LINEDISP) += line-display.o +obj-$(CONFIG_TM1628) += tm1628.o diff --git a/drivers/auxdisplay/tm1628.c b/drivers/auxdisplay/tm1628.c new file mode 100644 index 000000000000..4d99a7aa077b --- /dev/null +++ b/drivers/auxdisplay/tm1628.c @@ -0,0 +1,376 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Titan Micro Electronics TM1628 LED controller + * + * Copyright (c) 2019 Andreas Färber + * Copyright (c) 2022 Heiner Kallweit + */ + +#include <linux/ctype.h> +#include <linux/delay.h> +#include <linux/leds.h> +#include <linux/module.h> +#include <linux/property.h> +#include <linux/spi/spi.h> +#include <uapi/linux/map_to_7segment.h> + +#define TM1628_CMD_DISPLAY_MODE (0 << 6) +#define TM1628_DISPLAY_MODE_6_12 0x02 +#define TM1628_DISPLAY_MODE_7_11 0x03 + +#define TM1628_CMD_DATA (1 << 6) +#define TM1628_DATA_TEST_MODE BIT(3) +#define TM1628_DATA_FIXED_ADDR BIT(2) +#define TM1628_DATA_WRITE_DATA 0x00 +#define TM1628_DATA_READ_DATA 0x02 + +#define TM1628_CMD_DISPLAY_CTRL (2 << 6) +#define TM1628_DISPLAY_CTRL_DISPLAY_ON BIT(3) + +#define TM1628_CMD_SET_ADDRESS (3 << 6) + +#define TM1628_BRIGHTNESS_MAX 7 +#define NUM_LED_SEGS 7 + +/* Physical limits, depending on the mode the chip may support less */ +#define MAX_GRID_SIZE 7 +#define MAX_SEGMENT_NUM 16 + +struct tm1628_led { + struct led_classdev leddev; + struct tm1628 *ctrl; + u32 grid; + u32 seg; +}; + +struct tm1628 { + struct spi_device *spi; + __le16 data[MAX_GRID_SIZE]; + struct mutex disp_lock; + char text[MAX_GRID_SIZE + 1]; + u8 segment_mapping[NUM_LED_SEGS]; + u8 grid[MAX_GRID_SIZE]; + int grid_size; + struct tm1628_led leds[]; +}; + +/* Command 1: Display Mode Setting */ +static int tm1628_set_display_mode(struct spi_device *spi, u8 grid_mode) +{ + const u8 cmd = TM1628_CMD_DISPLAY_MODE | grid_mode; + + return spi_write(spi, &cmd, 1); +} + +/* Command 3: Address Setting */ +static int tm1628_set_address(struct spi_device *spi, u8 offset) +{ + const u8 cmd = TM1628_CMD_SET_ADDRESS | (offset * sizeof(__le16)); + + return spi_write(spi, &cmd, 1); +} + +/* Command 2: Data Setting */ +static int tm1628_write_data(struct spi_device *spi, unsigned int offset, + unsigned int len) +{ + struct tm1628 *s = spi_get_drvdata(spi); + const u8 cmd = TM1628_CMD_DATA | TM1628_DATA_WRITE_DATA; + struct spi_transfer xfers[] = { + { + .tx_buf = &cmd, + .len = 1, + }, + { + .tx_buf = (__force void *)(s->data + offset), + .len = len * sizeof(__le16), + }, + }; + + if (offset + len > MAX_GRID_SIZE) { + dev_err(&spi->dev, "Invalid data address offset %u len %u\n", + offset, len); + return -EINVAL; + } + + tm1628_set_address(spi, offset); + + return spi_sync_transfer(spi, xfers, ARRAY_SIZE(xfers)); +} + +/* Command 4: Display Control */ +static int tm1628_set_display_ctrl(struct spi_device *spi, bool on) +{ + u8 cmd = TM1628_CMD_DISPLAY_CTRL | TM1628_BRIGHTNESS_MAX; + + if (on) + cmd |= TM1628_DISPLAY_CTRL_DISPLAY_ON; + + return spi_write(spi, &cmd, 1); +} + +static int tm1628_show_text(struct tm1628 *s) +{ + static SEG7_CONVERSION_MAP(map_seg7, MAP_ASCII7SEG_ALPHANUM); + int msg_len, i, ret; + + msg_len = strlen(s->text); + + mutex_lock(&s->disp_lock); + + for (i = 0; i < s->grid_size; i++) { + int pos = s->grid[i] - 1; + int j, char7_raw, char7; + + if (i >= msg_len) { + s->data[pos] = 0; + continue; + } + + char7_raw = map_to_seg7(&map_seg7, s->text[i]); + + for (j = 0, char7 = 0; j < NUM_LED_SEGS; j++) { + if (char7_raw & BIT(j)) + char7 |= BIT(s->segment_mapping[j] - 1); + } + + s->data[pos] = cpu_to_le16(char7); + } + + ret = tm1628_write_data(s->spi, 0, s->grid_size); + + mutex_unlock(&s->disp_lock); + + return ret; +} + +static int tm1628_led_set_brightness(struct led_classdev *led_cdev, + enum led_brightness brightness) +{ + struct tm1628_led *led = container_of(led_cdev, struct tm1628_led, leddev); + struct tm1628 *s = led->ctrl; + int ret, offset = led->grid - 1; + __le16 bit = cpu_to_le16(BIT(led->seg - 1)); + + mutex_lock(&s->disp_lock); + + if (brightness == LED_OFF) + s->data[offset] &= ~bit; + else + s->data[offset] |= bit; + + ret = tm1628_write_data(s->spi, offset, 1); + + mutex_unlock(&s->disp_lock); + + return ret; +} + +static enum led_brightness tm1628_led_get_brightness(struct led_classdev *led_cdev) +{ + struct tm1628_led *led = container_of(led_cdev, struct tm1628_led, leddev); + struct tm1628 *s = led->ctrl; + int offset = led->grid - 1; + __le16 bit = cpu_to_le16(BIT(led->seg - 1)); + bool on; + + mutex_lock(&s->disp_lock); + on = s->data[offset] & bit; + mutex_unlock(&s->disp_lock); + + return on ? LED_ON : LED_OFF; +} + +static int tm1628_register_led(struct tm1628 *s, struct fwnode_handle *node, + u32 grid, u32 seg, struct tm1628_led *led) +{ + struct device *dev = &s->spi->dev; + struct led_init_data init_data = { .fwnode = node }; + + led->ctrl = s; + led->grid = grid; + led->seg = seg; + led->leddev.max_brightness = LED_ON; + led->leddev.brightness_set_blocking = tm1628_led_set_brightness; + led->leddev.brightness_get = tm1628_led_get_brightness; + + return devm_led_classdev_register_ext(dev, &led->leddev, &init_data); +} + +static ssize_t display_text_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct tm1628 *s = dev_get_drvdata(dev); + + return sysfs_emit(buf, "%s\n", s->text); +} + +static ssize_t display_text_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + struct tm1628 *s = dev_get_drvdata(dev); + int ret, i; + + for (i = 0; i < count && i < s->grid_size && isprint(buf[i]); i++) + s->text[i] = buf[i]; + + s->text[i] = '\0'; + + ret = tm1628_show_text(s); + if (ret < 0) + return ret; + + return count; +} + +static const DEVICE_ATTR_RW(display_text); + +static int tm1628_spi_probe(struct spi_device *spi) +{ + struct fwnode_handle *child; + unsigned int num_leds; + struct tm1628 *s; + int ret, i; + + num_leds = device_get_child_node_count(&spi->dev); + + s = devm_kzalloc(&spi->dev, struct_size(s, leds, num_leds), GFP_KERNEL); + if (!s) + return -ENOMEM; + + s->spi = spi; + spi_set_drvdata(spi, s); + + mutex_init(&s->disp_lock); + + /* According to TM1628 datasheet */ + msleep(200); + + /* Clear screen */ + ret = tm1628_write_data(spi, 0, MAX_GRID_SIZE); + if (ret) + return ret; + + /* For now we support 6x12 mode only. This should be sufficient for most use cases */ + ret = tm1628_set_display_mode(spi, TM1628_DISPLAY_MODE_6_12); + if (ret) + return ret; + + ret = tm1628_set_display_ctrl(spi, true); + if (ret) + return ret; + + num_leds = 0; + + if (!IS_REACHABLE(CONFIG_LEDS_CLASS)) + goto no_leds; + + device_for_each_child_node(&spi->dev, child) { + u32 reg[2]; + + ret = fwnode_property_read_u32_array(child, "reg", reg, 2); + if (ret) { + dev_err(&spi->dev, "Reading %s reg property failed (%d)\n", + fwnode_get_name(child), ret); + continue; + } + + if (reg[0] == 0 || reg[0] > MAX_GRID_SIZE) { + dev_err(&spi->dev, "Invalid grid %u at %s\n", + reg[0], fwnode_get_name(child)); + continue; + } + + if (reg[1] == 0 || reg[1] > MAX_SEGMENT_NUM) { + dev_err(&spi->dev, "Invalid segment %u at %s\n", + reg[1], fwnode_get_name(child)); + continue; + } + + ret = tm1628_register_led(s, child, reg[0], reg[1], s->leds + num_leds); + if (ret) { + dev_err(&spi->dev, "Failed to register LED %s (%d)\n", + fwnode_get_name(child), ret); + continue; + } + num_leds++; + } + +no_leds: + ret = device_property_count_u8(&spi->dev, "titanmec,grid"); + if (ret < 1 || ret > MAX_GRID_SIZE) { + dev_err(&spi->dev, "Invalid display length (%d)\n", ret); + return -EINVAL; + } + + s->grid_size = ret; + + ret = device_property_read_u8_array(&spi->dev, "titanmec,grid", s->grid, s->grid_size); + if (ret < 0) + return ret; + + for (i = 0; i < s->grid_size; i++) { + if (s->grid[i] < 1 || s->grid[i] > s->grid_size) + return -EINVAL; + } + + ret = device_property_read_u8_array(&spi->dev, "titanmec,segment-mapping", + s->segment_mapping, NUM_LED_SEGS); + if (ret < 0) + return ret; + + for (i = 0; i < NUM_LED_SEGS; i++) { + if (s->segment_mapping[i] < 1 || s->segment_mapping[i] > MAX_SEGMENT_NUM) + return -EINVAL; + } + + ret = device_create_file(&spi->dev, &dev_attr_display_text); + if (ret) + return ret; + + dev_info(&spi->dev, "Configured display with %u digits and %u symbols\n", + s->grid_size, num_leds); + + return 0; +} + +static void tm1628_spi_remove(struct spi_device *spi) +{ + device_remove_file(&spi->dev, &dev_attr_display_text); + tm1628_set_display_ctrl(spi, false); +} + +static void tm1628_spi_shutdown(struct spi_device *spi) +{ + tm1628_set_display_ctrl(spi, false); +} + +static const struct of_device_id tm1628_spi_of_matches[] = { + { .compatible = "titanmec,tm1628" }, + {} +}; +MODULE_DEVICE_TABLE(of, tm1628_spi_of_matches); + +static const struct spi_device_id tm1628_spi_id_table[] = { + { "tm1628" }, + {}, +}; +MODULE_DEVICE_TABLE(spi, tm1628_spi_id_table); + +static struct spi_driver tm1628_spi_driver = { + .probe = tm1628_spi_probe, + .remove = tm1628_spi_remove, + .shutdown = tm1628_spi_shutdown, + .id_table = tm1628_spi_id_table, + + .driver = { + .name = "tm1628", + .of_match_table = tm1628_spi_of_matches, + }, +}; +module_spi_driver(tm1628_spi_driver); + +MODULE_DESCRIPTION("TM1628 LED controller driver"); +MODULE_AUTHOR("Andreas Färber <afaerber@suse.de>"); +MODULE_AUTHOR("Heiner Kallweit <hkallweit1@gmail.com>"); +MODULE_LICENSE("GPL"); -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0055-FROMLIST-v5-arm64-dts-meson-gxl-s905w-tx3-mini-add-s.patch ================================================ From 136c5d1f6275026217be5741df24816a3875e7a4 Mon Sep 17 00:00:00 2001 From: Heiner Kallweit <hkallweit1@gmail.com> Date: Mon, 4 Apr 2022 18:52:34 +0000 Subject: [PATCH 055/120] FROMLIST(v5): arm64: dts: meson-gxl-s905w-tx3-mini: add support for the 7 segment display This patch adds support for the 7 segment display of the device. Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> --- .../dts/amlogic/meson-gxl-s905w-tx3-mini.dts | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905w-tx3-mini.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905w-tx3-mini.dts index 6705c2082a78..ae0d8d7b1e19 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905w-tx3-mini.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905w-tx3-mini.dts @@ -10,6 +10,7 @@ #include "meson-gxl-s905x.dtsi" #include "meson-gx-p23x-q20x.dtsi" +#include <dt-bindings/leds/common.h> / { compatible = "oranth,tx3-mini", "amlogic,s905w", "amlogic,meson-gxl"; @@ -19,6 +20,64 @@ memory@0 { device_type = "memory"; reg = <0x0 0x0 0x0 0x40000000>; /* 1 GiB or 2 GiB */ }; + + spi { + compatible = "spi-gpio"; + sck-gpios = <&gpio GPIODV_27 GPIO_ACTIVE_HIGH>; + mosi-gpios = <&gpio GPIODV_26 GPIO_ACTIVE_HIGH>; + cs-gpios = <&gpio_ao GPIOAO_4 GPIO_ACTIVE_LOW>; + num-chipselects = <1>; + #address-cells = <1>; + #size-cells = <0>; + + tm1628: led-controller@0 { + compatible = "titanmec,tm1628"; + reg = <0>; + spi-3wire; + spi-lsb-first; + spi-rx-delay-us = <1>; + spi-max-frequency = <500000>; + #address-cells = <2>; + #size-cells = <0>; + + titanmec,segment-mapping = /bits/ 8 <4 5 6 1 2 3 7>; + titanmec,grid = /bits/ 8 <4 3 2 1>; + + alarm@5,1 { + reg = <5 1>; + function = LED_FUNCTION_ALARM; + }; + + usb@5,2 { + reg = <5 2>; + function = LED_FUNCTION_USB; + }; + play@5,3 { + reg = <5 3>; + function = "play"; + }; + + pause@5,4 { + reg = <5 4>; + function = "pause"; + }; + + colon@5,5 { + reg = <5 5>; + function = "colon"; + }; + + lan@5,6 { + reg = <5 6>; + function = LED_FUNCTION_LAN; + }; + + wlan@5,7 { + reg = <5 7>; + function = LED_FUNCTION_WLAN; + }; + }; + }; }; &ir { -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0056-FROMLIST-v5-MAINTAINERS-Add-entry-for-tm1628-auxdisp.patch ================================================ From fbc5936b6016a740768dcd2ac99be9691750e649 Mon Sep 17 00:00:00 2001 From: Heiner Kallweit <hkallweit1@gmail.com> Date: Mon, 4 Apr 2022 18:53:32 +0000 Subject: [PATCH 056/120] FROMLIST(v5): MAINTAINERS: Add entry for tm1628 auxdisplay driver Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> --- MAINTAINERS | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 350d7e3ba94f..93e294dc03c0 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -20728,6 +20728,13 @@ W: http://sourceforge.net/projects/tlan/ F: Documentation/networking/device_drivers/ethernet/ti/tlan.rst F: drivers/net/ethernet/ti/tlan.* +TM1628 LED CONTROLLER DRIVER +M: Heiner Kallweit <hkallweit1@gmail.com> +S: Maintained +F: Documentation/devicetree/bindings/auxdisplay/titanmec,tm1628.yaml +F: Documentation/ABI/testing/sysfs-devices-auxdisplay-tm1628 +F: drivers/auxdisplay/tm1628.c + TM6000 VIDEO4LINUX DRIVER M: Mauro Carvalho Chehab <mchehab@kernel.org> L: linux-media@vger.kernel.org -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0057-FROMLIST-v1-ASoC-hdmi-codec-reorder-channel-allocati.patch ================================================ From fdcff6282a2fcb2afb2751c33f22ea245002b068 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sun, 23 Dec 2018 02:24:38 +0100 Subject: [PATCH 057/120] FROMLIST(v1): ASoC: hdmi-codec: reorder channel allocation list Wrong channel allocation is selected by hdmi_codec_get_ch_alloc_table_idx(). E.g when ELD reports FL|FR|LFE|FC|RL|RR or FL|FR|LFE|FC|RL|RR|RC|RLC|RRC ca_id 0x01 with speaker mask FL|FR|LFE gets selected instead of ca_id 0x03 with speaker mask FL|FR|LFE|FC for 4 channels and ca_id 0x04 with speaker mask FL|FR|RC gets selected instead of ca_id 0x0b with speaker mask FL|FR|LFE|FC|RL|RR for 6 channels Fix this by reorder the channel allocation list with most specific speaker mask at the top. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- sound/soc/codecs/hdmi-codec.c | 140 +++++++++++++++++++--------------- 1 file changed, 77 insertions(+), 63 deletions(-) diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c index bbc33161bcca..7a5c26208149 100644 --- a/sound/soc/codecs/hdmi-codec.c +++ b/sound/soc/codecs/hdmi-codec.c @@ -184,84 +184,97 @@ static const struct snd_pcm_chmap_elem hdmi_codec_8ch_chmaps[] = { /* * hdmi_codec_channel_alloc: speaker configuration available for CEA * - * This is an ordered list that must match with hdmi_codec_8ch_chmaps struct + * This is an ordered list where ca_id must exist in hdmi_codec_8ch_chmaps * The preceding ones have better chances to be selected by * hdmi_codec_get_ch_alloc_table_idx(). */ static const struct hdmi_codec_cea_spk_alloc hdmi_codec_channel_alloc[] = { { .ca_id = 0x00, .n_ch = 2, - .mask = FL | FR}, - /* 2.1 */ - { .ca_id = 0x01, .n_ch = 4, - .mask = FL | FR | LFE}, - /* Dolby Surround */ + .mask = FL | FR }, + { .ca_id = 0x03, .n_ch = 4, + .mask = FL | FR | LFE | FC }, { .ca_id = 0x02, .n_ch = 4, .mask = FL | FR | FC }, - /* surround51 */ + { .ca_id = 0x01, .n_ch = 4, + .mask = FL | FR | LFE }, { .ca_id = 0x0b, .n_ch = 6, - .mask = FL | FR | LFE | FC | RL | RR}, - /* surround40 */ - { .ca_id = 0x08, .n_ch = 6, - .mask = FL | FR | RL | RR }, - /* surround41 */ - { .ca_id = 0x09, .n_ch = 6, - .mask = FL | FR | LFE | RL | RR }, - /* surround50 */ + .mask = FL | FR | LFE | FC | RL | RR }, { .ca_id = 0x0a, .n_ch = 6, .mask = FL | FR | FC | RL | RR }, - /* 6.1 */ - { .ca_id = 0x0f, .n_ch = 8, - .mask = FL | FR | LFE | FC | RL | RR | RC }, - /* surround71 */ + { .ca_id = 0x09, .n_ch = 6, + .mask = FL | FR | LFE | RL | RR }, + { .ca_id = 0x08, .n_ch = 6, + .mask = FL | FR | RL | RR }, + { .ca_id = 0x07, .n_ch = 6, + .mask = FL | FR | LFE | FC | RC }, + { .ca_id = 0x06, .n_ch = 6, + .mask = FL | FR | FC | RC }, + { .ca_id = 0x05, .n_ch = 6, + .mask = FL | FR | LFE | RC }, + { .ca_id = 0x04, .n_ch = 6, + .mask = FL | FR | RC }, { .ca_id = 0x13, .n_ch = 8, .mask = FL | FR | LFE | FC | RL | RR | RLC | RRC }, - /* others */ - { .ca_id = 0x03, .n_ch = 8, - .mask = FL | FR | LFE | FC }, - { .ca_id = 0x04, .n_ch = 8, - .mask = FL | FR | RC}, - { .ca_id = 0x05, .n_ch = 8, - .mask = FL | FR | LFE | RC }, - { .ca_id = 0x06, .n_ch = 8, - .mask = FL | FR | FC | RC }, - { .ca_id = 0x07, .n_ch = 8, - .mask = FL | FR | LFE | FC | RC }, - { .ca_id = 0x0c, .n_ch = 8, - .mask = FL | FR | RC | RL | RR }, - { .ca_id = 0x0d, .n_ch = 8, - .mask = FL | FR | LFE | RL | RR | RC }, - { .ca_id = 0x0e, .n_ch = 8, - .mask = FL | FR | FC | RL | RR | RC }, - { .ca_id = 0x10, .n_ch = 8, - .mask = FL | FR | RL | RR | RLC | RRC }, - { .ca_id = 0x11, .n_ch = 8, - .mask = FL | FR | LFE | RL | RR | RLC | RRC }, + { .ca_id = 0x1f, .n_ch = 8, + .mask = FL | FR | LFE | FC | RL | RR | FLC | FRC }, { .ca_id = 0x12, .n_ch = 8, .mask = FL | FR | FC | RL | RR | RLC | RRC }, - { .ca_id = 0x14, .n_ch = 8, - .mask = FL | FR | FLC | FRC }, - { .ca_id = 0x15, .n_ch = 8, - .mask = FL | FR | LFE | FLC | FRC }, - { .ca_id = 0x16, .n_ch = 8, - .mask = FL | FR | FC | FLC | FRC }, - { .ca_id = 0x17, .n_ch = 8, - .mask = FL | FR | LFE | FC | FLC | FRC }, - { .ca_id = 0x18, .n_ch = 8, - .mask = FL | FR | RC | FLC | FRC }, - { .ca_id = 0x19, .n_ch = 8, - .mask = FL | FR | LFE | RC | FLC | FRC }, - { .ca_id = 0x1a, .n_ch = 8, - .mask = FL | FR | RC | FC | FLC | FRC }, - { .ca_id = 0x1b, .n_ch = 8, - .mask = FL | FR | LFE | RC | FC | FLC | FRC }, - { .ca_id = 0x1c, .n_ch = 8, - .mask = FL | FR | RL | RR | FLC | FRC }, - { .ca_id = 0x1d, .n_ch = 8, - .mask = FL | FR | LFE | RL | RR | FLC | FRC }, { .ca_id = 0x1e, .n_ch = 8, .mask = FL | FR | FC | RL | RR | FLC | FRC }, - { .ca_id = 0x1f, .n_ch = 8, - .mask = FL | FR | LFE | FC | RL | RR | FLC | FRC }, + { .ca_id = 0x11, .n_ch = 8, + .mask = FL | FR | LFE | RL | RR | RLC | RRC }, + { .ca_id = 0x1d, .n_ch = 8, + .mask = FL | FR | LFE | RL | RR | FLC | FRC }, + { .ca_id = 0x10, .n_ch = 8, + .mask = FL | FR | RL | RR | RLC | RRC }, + { .ca_id = 0x1c, .n_ch = 8, + .mask = FL | FR | RL | RR | FLC | FRC }, + { .ca_id = 0x0f, .n_ch = 8, + .mask = FL | FR | LFE | FC | RL | RR | RC }, + { .ca_id = 0x1b, .n_ch = 8, + .mask = FL | FR | LFE | RC | FC | FLC | FRC }, + { .ca_id = 0x0e, .n_ch = 8, + .mask = FL | FR | FC | RL | RR | RC }, + { .ca_id = 0x1a, .n_ch = 8, + .mask = FL | FR | RC | FC | FLC | FRC }, + { .ca_id = 0x0d, .n_ch = 8, + .mask = FL | FR | LFE | RL | RR | RC }, + { .ca_id = 0x19, .n_ch = 8, + .mask = FL | FR | LFE | RC | FLC | FRC }, + { .ca_id = 0x0c, .n_ch = 8, + .mask = FL | FR | RC | RL | RR }, + { .ca_id = 0x18, .n_ch = 8, + .mask = FL | FR | RC | FLC | FRC }, + { .ca_id = 0x17, .n_ch = 8, + .mask = FL | FR | LFE | FC | FLC | FRC }, + { .ca_id = 0x16, .n_ch = 8, + .mask = FL | FR | FC | FLC | FRC }, + { .ca_id = 0x15, .n_ch = 8, + .mask = FL | FR | LFE | FLC | FRC }, + { .ca_id = 0x14, .n_ch = 8, + .mask = FL | FR | FLC | FRC }, + { .ca_id = 0x0b, .n_ch = 8, + .mask = FL | FR | LFE | FC | RL | RR }, + { .ca_id = 0x0a, .n_ch = 8, + .mask = FL | FR | FC | RL | RR }, + { .ca_id = 0x09, .n_ch = 8, + .mask = FL | FR | LFE | RL | RR }, + { .ca_id = 0x08, .n_ch = 8, + .mask = FL | FR | RL | RR }, + { .ca_id = 0x07, .n_ch = 8, + .mask = FL | FR | LFE | FC | RC }, + { .ca_id = 0x06, .n_ch = 8, + .mask = FL | FR | FC | RC }, + { .ca_id = 0x05, .n_ch = 8, + .mask = FL | FR | LFE | RC }, + { .ca_id = 0x04, .n_ch = 8, + .mask = FL | FR | RC }, + { .ca_id = 0x03, .n_ch = 8, + .mask = FL | FR | LFE | FC }, + { .ca_id = 0x02, .n_ch = 8, + .mask = FL | FR | FC }, + { .ca_id = 0x01, .n_ch = 8, + .mask = FL | FR | LFE }, }; struct hdmi_codec_priv { @@ -370,7 +383,8 @@ static int hdmi_codec_chmap_ctl_get(struct snd_kcontrol *kcontrol, struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol); struct hdmi_codec_priv *hcp = info->private_data; - map = info->chmap[hcp->chmap_idx].map; + if (hcp->chmap_idx != HDMI_CODEC_CHMAP_IDX_UNKNOWN) + map = info->chmap[hcp->chmap_idx].map; for (i = 0; i < info->max_channels; i++) { if (hcp->chmap_idx == HDMI_CODEC_CHMAP_IDX_UNKNOWN) -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0058-FROMLIST-v1-media-meson-vdec-esparser-check-parsing-.patch ================================================ From 89e62d3e8515a1f51b415b255b7200bdf8f1209d Mon Sep 17 00:00:00 2001 From: Neil Armstrong <narmstrong@baylibre.com> Date: Mon, 22 Nov 2021 09:15:21 +0000 Subject: [PATCH 058/120] FROMLIST(v1): media: meson: vdec: esparser: check parsing state with hardware write pointer Also check the hardware write pointer to check if ES Parser has stalled. Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- drivers/staging/media/meson/vdec/esparser.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/staging/media/meson/vdec/esparser.c b/drivers/staging/media/meson/vdec/esparser.c index 7b15fc54efe4..1904d58875ad 100644 --- a/drivers/staging/media/meson/vdec/esparser.c +++ b/drivers/staging/media/meson/vdec/esparser.c @@ -300,6 +300,7 @@ esparser_queue(struct amvdec_session *sess, struct vb2_v4l2_buffer *vbuf) u32 num_dst_bufs = 0; u32 offset; u32 pad_size; + u32 wp, wp2; /* * When max ref frame is held by VP9, this should be -= 3 to prevent a @@ -353,15 +354,21 @@ esparser_queue(struct amvdec_session *sess, struct vb2_v4l2_buffer *vbuf) } pad_size = esparser_pad_start_code(core, vb, payload_size); + wp = amvdec_read_parser(core, PARSER_VIDEO_WP); ret = esparser_write_data(core, phy, payload_size + pad_size); + wp2 = amvdec_read_parser(core, PARSER_VIDEO_WP); if (ret <= 0) { - dev_warn(core->dev, "esparser: input parsing error\n"); - amvdec_remove_ts(sess, vb->timestamp); - v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR); amvdec_write_parser(core, PARSER_FETCH_CMD, 0); - return 0; + if (ret < 0 || wp2 == wp) { + dev_err(core->dev, "esparser: input parsing error ret %d (%x <=> %x)\n", + ret, wp, wp2); + amvdec_remove_ts(sess, vb->timestamp); + v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR); + + return 0; + } } atomic_inc(&sess->esparser_queued_bufs); -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0059-FROMLIST-v2-media-meson-vdec-implement-10bit-bitstre.patch ================================================ From 88671c6347d92c258d84e6448d2f0590ed8766d4 Mon Sep 17 00:00:00 2001 From: Benjamin Roszak <benjamin545@gmail.com> Date: Mon, 23 Jan 2023 10:56:46 +0000 Subject: [PATCH 059/120] FROMLIST(v2): media: meson: vdec: implement 10bit bitstream handling In order to support 10bit bitstream decoding, buffers and MMU handling must be cleaned up to support either downscale output from compressed 10bit decoding to uncompressed 8bit NV12 output or to compressed 10bit proprietary encoded frame format. For that, "am21c" name is moved to "amfbc" to reflect the upstream Amlogic Compressed framebuffer modifier naming. Compressed frame buffers allocation is also cleaned up so it can be shared with the HEVC decoder implementation. Signed-off-by: Benjamin Roszak <benjamin545@gmail.com> Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- drivers/staging/media/meson/vdec/codec_h264.c | 3 +- .../media/meson/vdec/codec_hevc_common.c | 161 +++++++++++------- .../media/meson/vdec/codec_hevc_common.h | 3 +- drivers/staging/media/meson/vdec/codec_vp9.c | 35 ++-- drivers/staging/media/meson/vdec/esparser.c | 1 + drivers/staging/media/meson/vdec/vdec.h | 1 + .../staging/media/meson/vdec/vdec_helpers.c | 44 +++-- .../staging/media/meson/vdec/vdec_helpers.h | 10 +- 8 files changed, 161 insertions(+), 97 deletions(-) diff --git a/drivers/staging/media/meson/vdec/codec_h264.c b/drivers/staging/media/meson/vdec/codec_h264.c index c61128fc4bb9..d53c9a464bde 100644 --- a/drivers/staging/media/meson/vdec/codec_h264.c +++ b/drivers/staging/media/meson/vdec/codec_h264.c @@ -353,7 +353,8 @@ static void codec_h264_src_change(struct amvdec_session *sess) frame_width, frame_height, crop_right, crop_bottom); codec_h264_set_par(sess); - amvdec_src_change(sess, frame_width, frame_height, h264->max_refs + 5); + amvdec_src_change(sess, frame_width, frame_height, + h264->max_refs + 5, 8); } /* diff --git a/drivers/staging/media/meson/vdec/codec_hevc_common.c b/drivers/staging/media/meson/vdec/codec_hevc_common.c index 0315cc0911cd..1c74b4837dcb 100644 --- a/drivers/staging/media/meson/vdec/codec_hevc_common.c +++ b/drivers/staging/media/meson/vdec/codec_hevc_common.c @@ -30,8 +30,11 @@ const u16 vdec_hevc_parser_cmd[] = { void codec_hevc_setup_decode_head(struct amvdec_session *sess, int is_10bit) { struct amvdec_core *core = sess->core; - u32 body_size = amvdec_am21c_body_size(sess->width, sess->height); - u32 head_size = amvdec_am21c_head_size(sess->width, sess->height); + u32 use_mmu = codec_hevc_use_mmu(core->platform->revision, + sess->pixfmt_cap, is_10bit); + u32 body_size = amvdec_amfbc_body_size(sess->width, sess->height, + is_10bit, use_mmu); + u32 head_size = amvdec_amfbc_head_size(sess->width, sess->height); if (!codec_hevc_use_fbc(sess->pixfmt_cap, is_10bit)) { /* Enable 2-plane reference read mode */ @@ -39,9 +42,17 @@ void codec_hevc_setup_decode_head(struct amvdec_session *sess, int is_10bit) return; } + /* enable mem saving mode for 8-bit */ + if (!is_10bit) + amvdec_write_dos_bits(core, HEVC_SAO_CTRL5, BIT(9)); + else + amvdec_clear_dos_bits(core, HEVC_SAO_CTRL5, BIT(9)); + if (codec_hevc_use_mmu(core->platform->revision, sess->pixfmt_cap, is_10bit)) amvdec_write_dos(core, HEVCD_MPP_DECOMP_CTL1, BIT(4)); + else if (!is_10bit) + amvdec_write_dos(core, HEVCD_MPP_DECOMP_CTL1, BIT(3)); else amvdec_write_dos(core, HEVCD_MPP_DECOMP_CTL1, 0); @@ -73,7 +84,7 @@ static void codec_hevc_setup_buffers_gxbb(struct amvdec_session *sess, idx = vb->index; - if (codec_hevc_use_downsample(sess->pixfmt_cap, is_10bit)) + if (codec_hevc_use_fbc(sess->pixfmt_cap, is_10bit)) buf_y_paddr = comm->fbc_buffer_paddr[idx]; else buf_y_paddr = vb2_dma_contig_plane_dma_addr(vb, 0); @@ -114,8 +125,8 @@ static void codec_hevc_setup_buffers_gxl(struct amvdec_session *sess, { struct amvdec_core *core = sess->core; struct v4l2_m2m_buffer *buf; - u32 revision = core->platform->revision; u32 pixfmt_cap = sess->pixfmt_cap; + const u32 revision = core->platform->revision; int i; amvdec_write_dos(core, HEVCD_MPP_ANC2AXI_TBL_CONF_ADDR, @@ -127,12 +138,14 @@ static void codec_hevc_setup_buffers_gxl(struct amvdec_session *sess, dma_addr_t buf_uv_paddr = 0; u32 idx = vb->index; - if (codec_hevc_use_mmu(revision, pixfmt_cap, is_10bit)) - buf_y_paddr = comm->mmu_header_paddr[idx]; - else if (codec_hevc_use_downsample(pixfmt_cap, is_10bit)) - buf_y_paddr = comm->fbc_buffer_paddr[idx]; - else + if (codec_hevc_use_downsample(pixfmt_cap, is_10bit)) { + if (codec_hevc_use_mmu(revision, pixfmt_cap, is_10bit)) + buf_y_paddr = comm->mmu_header_paddr[idx]; + else + buf_y_paddr = comm->fbc_buffer_paddr[idx]; + } else { buf_y_paddr = vb2_dma_contig_plane_dma_addr(vb, 0); + } amvdec_write_dos(core, HEVCD_MPP_ANC2AXI_TBL_DATA, buf_y_paddr >> 5); @@ -150,60 +163,67 @@ static void codec_hevc_setup_buffers_gxl(struct amvdec_session *sess, amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_DATA_ADDR, 0); } -void codec_hevc_free_fbc_buffers(struct amvdec_session *sess, +void codec_hevc_free_mmu_headers(struct amvdec_session *sess, struct codec_hevc_common *comm) { struct device *dev = sess->core->dev; - u32 am21_size = amvdec_am21c_size(sess->width, sess->height); int i; for (i = 0; i < MAX_REF_PIC_NUM; ++i) { - if (comm->fbc_buffer_vaddr[i]) { - dma_free_coherent(dev, am21_size, - comm->fbc_buffer_vaddr[i], - comm->fbc_buffer_paddr[i]); - comm->fbc_buffer_vaddr[i] = NULL; + if (comm->mmu_header_vaddr[i]) { + dma_free_coherent(dev, MMU_COMPRESS_HEADER_SIZE, + comm->mmu_header_vaddr[i], + comm->mmu_header_paddr[i]); + comm->mmu_header_vaddr[i] = NULL; } } } -EXPORT_SYMBOL_GPL(codec_hevc_free_fbc_buffers); +EXPORT_SYMBOL_GPL(codec_hevc_free_mmu_headers); -static int codec_hevc_alloc_fbc_buffers(struct amvdec_session *sess, +static int codec_hevc_alloc_mmu_headers(struct amvdec_session *sess, struct codec_hevc_common *comm) { struct device *dev = sess->core->dev; struct v4l2_m2m_buffer *buf; - u32 am21_size = amvdec_am21c_size(sess->width, sess->height); v4l2_m2m_for_each_dst_buf(sess->m2m_ctx, buf) { u32 idx = buf->vb.vb2_buf.index; dma_addr_t paddr; - void *vaddr = dma_alloc_coherent(dev, am21_size, &paddr, - GFP_KERNEL); + void *vaddr = dma_alloc_coherent(dev, MMU_COMPRESS_HEADER_SIZE, + &paddr, GFP_KERNEL); if (!vaddr) { - codec_hevc_free_fbc_buffers(sess, comm); + codec_hevc_free_mmu_headers(sess, comm); return -ENOMEM; } - comm->fbc_buffer_vaddr[idx] = vaddr; - comm->fbc_buffer_paddr[idx] = paddr; + comm->mmu_header_vaddr[idx] = vaddr; + comm->mmu_header_paddr[idx] = paddr; } return 0; } -void codec_hevc_free_mmu_headers(struct amvdec_session *sess, +void codec_hevc_free_fbc_buffers(struct amvdec_session *sess, struct codec_hevc_common *comm) { struct device *dev = sess->core->dev; + u32 use_mmu; + u32 am21_size; int i; + use_mmu = codec_hevc_use_mmu(sess->core->platform->revision, + sess->pixfmt_cap, + sess->bitdepth == 10 ? 1 : 0); + + am21_size = amvdec_amfbc_size(sess->width, sess->height, + sess->bitdepth == 10 ? 1 : 0, use_mmu); + for (i = 0; i < MAX_REF_PIC_NUM; ++i) { - if (comm->mmu_header_vaddr[i]) { - dma_free_coherent(dev, MMU_COMPRESS_HEADER_SIZE, - comm->mmu_header_vaddr[i], - comm->mmu_header_paddr[i]); - comm->mmu_header_vaddr[i] = NULL; + if (comm->fbc_buffer_vaddr[i]) { + dma_free_coherent(dev, am21_size, + comm->fbc_buffer_vaddr[i], + comm->fbc_buffer_paddr[i]); + comm->fbc_buffer_vaddr[i] = NULL; } } @@ -213,33 +233,50 @@ void codec_hevc_free_mmu_headers(struct amvdec_session *sess, comm->mmu_map_paddr); comm->mmu_map_vaddr = NULL; } + + codec_hevc_free_mmu_headers(sess, comm); } -EXPORT_SYMBOL_GPL(codec_hevc_free_mmu_headers); +EXPORT_SYMBOL_GPL(codec_hevc_free_fbc_buffers); -static int codec_hevc_alloc_mmu_headers(struct amvdec_session *sess, +static int codec_hevc_alloc_fbc_buffers(struct amvdec_session *sess, struct codec_hevc_common *comm) { struct device *dev = sess->core->dev; struct v4l2_m2m_buffer *buf; + u32 use_mmu; + u32 am21_size; + const u32 revision = sess->core->platform->revision; + const u32 is_10bit = sess->bitdepth == 10 ? 1 : 0; + int ret; - comm->mmu_map_vaddr = dma_alloc_coherent(dev, MMU_MAP_SIZE, - &comm->mmu_map_paddr, - GFP_KERNEL); - if (!comm->mmu_map_vaddr) - return -ENOMEM; + use_mmu = codec_hevc_use_mmu(revision, sess->pixfmt_cap, + is_10bit); + + am21_size = amvdec_amfbc_size(sess->width, sess->height, + is_10bit, use_mmu); v4l2_m2m_for_each_dst_buf(sess->m2m_ctx, buf) { u32 idx = buf->vb.vb2_buf.index; dma_addr_t paddr; - void *vaddr = dma_alloc_coherent(dev, MMU_COMPRESS_HEADER_SIZE, - &paddr, GFP_KERNEL); + + void *vaddr = dma_alloc_coherent(dev, am21_size, &paddr, + GFP_KERNEL); if (!vaddr) { - codec_hevc_free_mmu_headers(sess, comm); + codec_hevc_free_fbc_buffers(sess, comm); return -ENOMEM; } - comm->mmu_header_vaddr[idx] = vaddr; - comm->mmu_header_paddr[idx] = paddr; + comm->fbc_buffer_vaddr[idx] = vaddr; + comm->fbc_buffer_paddr[idx] = paddr; + } + + if (codec_hevc_use_mmu(revision, sess->pixfmt_cap, is_10bit) && + codec_hevc_use_downsample(sess->pixfmt_cap, is_10bit)) { + ret = codec_hevc_alloc_mmu_headers(sess, comm); + if (ret) { + codec_hevc_free_fbc_buffers(sess, comm); + return ret; + } } return 0; @@ -250,21 +287,24 @@ int codec_hevc_setup_buffers(struct amvdec_session *sess, int is_10bit) { struct amvdec_core *core = sess->core; + struct device *dev = core->dev; int ret; - if (codec_hevc_use_downsample(sess->pixfmt_cap, is_10bit)) { - ret = codec_hevc_alloc_fbc_buffers(sess, comm); - if (ret) - return ret; + if (codec_hevc_use_mmu(core->platform->revision, + sess->pixfmt_cap, is_10bit)) { + comm->mmu_map_vaddr = dma_alloc_coherent(dev, MMU_MAP_SIZE, + &comm->mmu_map_paddr, + GFP_KERNEL); + if (!comm->mmu_map_vaddr) + return -ENOMEM; } if (codec_hevc_use_mmu(core->platform->revision, - sess->pixfmt_cap, is_10bit)) { - ret = codec_hevc_alloc_mmu_headers(sess, comm); - if (ret) { - codec_hevc_free_fbc_buffers(sess, comm); + sess->pixfmt_cap, is_10bit) || + codec_hevc_use_downsample(sess->pixfmt_cap, is_10bit)) { + ret = codec_hevc_alloc_fbc_buffers(sess, comm); + if (ret) return ret; - } } if (core->platform->revision == VDEC_REVISION_GXBB) @@ -278,19 +318,24 @@ EXPORT_SYMBOL_GPL(codec_hevc_setup_buffers); void codec_hevc_fill_mmu_map(struct amvdec_session *sess, struct codec_hevc_common *comm, - struct vb2_buffer *vb) + struct vb2_buffer *vb, + u32 is_10bit) { - u32 size = amvdec_am21c_size(sess->width, sess->height); - u32 nb_pages = size / PAGE_SIZE; + u32 use_mmu; + u32 size; + u32 nb_pages; u32 *mmu_map = comm->mmu_map_vaddr; u32 first_page; u32 i; - if (sess->pixfmt_cap == V4L2_PIX_FMT_NV12M) - first_page = comm->fbc_buffer_paddr[vb->index] >> PAGE_SHIFT; - else - first_page = vb2_dma_contig_plane_dma_addr(vb, 0) >> PAGE_SHIFT; + use_mmu = codec_hevc_use_mmu(sess->core->platform->revision, + sess->pixfmt_cap, is_10bit); + + size = amvdec_amfbc_size(sess->width, sess->height, is_10bit, + use_mmu); + nb_pages = size / PAGE_SIZE; + first_page = comm->fbc_buffer_paddr[vb->index] >> PAGE_SHIFT; for (i = 0; i < nb_pages; ++i) mmu_map[i] = first_page + i; } diff --git a/drivers/staging/media/meson/vdec/codec_hevc_common.h b/drivers/staging/media/meson/vdec/codec_hevc_common.h index cf072b8a9da2..13f9f1d90a94 100644 --- a/drivers/staging/media/meson/vdec/codec_hevc_common.h +++ b/drivers/staging/media/meson/vdec/codec_hevc_common.h @@ -64,6 +64,7 @@ int codec_hevc_setup_buffers(struct amvdec_session *sess, void codec_hevc_fill_mmu_map(struct amvdec_session *sess, struct codec_hevc_common *comm, - struct vb2_buffer *vb); + struct vb2_buffer *vb, + u32 is_10bit); #endif diff --git a/drivers/staging/media/meson/vdec/codec_vp9.c b/drivers/staging/media/meson/vdec/codec_vp9.c index 897f5d7a6aad..33b758cded77 100644 --- a/drivers/staging/media/meson/vdec/codec_vp9.c +++ b/drivers/staging/media/meson/vdec/codec_vp9.c @@ -458,12 +458,6 @@ struct codec_vp9 { struct list_head ref_frames_list; u32 frames_num; - /* In case of downsampling (decoding with FBC but outputting in NV12M), - * we need to allocate additional buffers for FBC. - */ - void *fbc_buffer_vaddr[MAX_REF_PIC_NUM]; - dma_addr_t fbc_buffer_paddr[MAX_REF_PIC_NUM]; - int ref_frame_map[REF_FRAMES]; int next_ref_frame_map[REF_FRAMES]; struct vp9_frame *frame_refs[REFS_PER_FRAME]; @@ -901,11 +895,8 @@ static void codec_vp9_set_sao(struct amvdec_session *sess, buf_y_paddr = vb2_dma_contig_plane_dma_addr(vb, 0); - if (codec_hevc_use_fbc(sess->pixfmt_cap, vp9->is_10bit)) { - val = amvdec_read_dos(core, HEVC_SAO_CTRL5) & ~0xff0200; - amvdec_write_dos(core, HEVC_SAO_CTRL5, val); + if (codec_hevc_use_fbc(sess->pixfmt_cap, vp9->is_10bit)) amvdec_write_dos(core, HEVC_CM_BODY_START_ADDR, buf_y_paddr); - } if (sess->pixfmt_cap == V4L2_PIX_FMT_NV12M) { buf_y_paddr = @@ -920,8 +911,13 @@ static void codec_vp9_set_sao(struct amvdec_session *sess, if (codec_hevc_use_mmu(core->platform->revision, sess->pixfmt_cap, vp9->is_10bit)) { - amvdec_write_dos(core, HEVC_CM_HEADER_START_ADDR, - vp9->common.mmu_header_paddr[vb->index]); + dma_addr_t header_adr; + + if (codec_hevc_use_downsample(sess->pixfmt_cap, vp9->is_10bit)) + header_adr = vp9->common.mmu_header_paddr[vb->index]; + else + header_adr = vb2_dma_contig_plane_dma_addr(vb, 0); + amvdec_write_dos(core, HEVC_CM_HEADER_START_ADDR, header_adr); /* use HEVC_CM_HEADER_START_ADDR */ amvdec_write_dos_bits(core, HEVC_SAO_CTRL5, BIT(10)); } @@ -1148,9 +1144,13 @@ static void codec_vp9_set_mc(struct amvdec_session *sess, { struct amvdec_core *core = sess->core; u32 scale = 0; + u32 use_mmu; u32 sz; int i; + use_mmu = codec_hevc_use_mmu(core->platform->revision, + sess->pixfmt_cap, vp9->is_10bit); + amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_ACCCONFIG_ADDR, 1); codec_vp9_set_refs(sess, vp9); amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_ACCCONFIG_ADDR, @@ -1166,8 +1166,9 @@ static void codec_vp9_set_mc(struct amvdec_session *sess, vp9->frame_refs[i]->height != vp9->height) scale = 1; - sz = amvdec_am21c_body_size(vp9->frame_refs[i]->width, - vp9->frame_refs[i]->height); + sz = amvdec_amfbc_body_size(vp9->frame_refs[i]->width, + vp9->frame_refs[i]->height, + vp9->is_10bit, use_mmu); amvdec_write_dos(core, VP9D_MPP_REFINFO_DATA, vp9->frame_refs[i]->width); @@ -1283,7 +1284,8 @@ static void codec_vp9_process_frame(struct amvdec_session *sess) if (codec_hevc_use_mmu(core->platform->revision, sess->pixfmt_cap, vp9->is_10bit)) codec_hevc_fill_mmu_map(sess, &vp9->common, - &vp9->cur_frame->vbuf->vb2_buf); + &vp9->cur_frame->vbuf->vb2_buf, + vp9->is_10bit); intra_only = param->p.show_frame ? 0 : param->p.intra_only; @@ -2132,7 +2134,8 @@ static irqreturn_t codec_vp9_threaded_isr(struct amvdec_session *sess) codec_vp9_fetch_rpm(sess); if (codec_vp9_process_rpm(vp9)) { - amvdec_src_change(sess, vp9->width, vp9->height, 16); + amvdec_src_change(sess, vp9->width, vp9->height, 16, + vp9->is_10bit ? 10 : 8); /* No frame is actually processed */ vp9->cur_frame = NULL; diff --git a/drivers/staging/media/meson/vdec/esparser.c b/drivers/staging/media/meson/vdec/esparser.c index 1904d58875ad..3cd29ab4f979 100644 --- a/drivers/staging/media/meson/vdec/esparser.c +++ b/drivers/staging/media/meson/vdec/esparser.c @@ -320,6 +320,7 @@ esparser_queue(struct amvdec_session *sess, struct vb2_v4l2_buffer *vbuf) if (esparser_vififo_get_free_space(sess) < payload_size || atomic_read(&sess->esparser_queued_bufs) >= num_dst_bufs) return -EAGAIN; + } else if (esparser_vififo_get_free_space(sess) < payload_size) { return -EAGAIN; } diff --git a/drivers/staging/media/meson/vdec/vdec.h b/drivers/staging/media/meson/vdec/vdec.h index 0906b8fb5cc6..a48170fe4cff 100644 --- a/drivers/staging/media/meson/vdec/vdec.h +++ b/drivers/staging/media/meson/vdec/vdec.h @@ -244,6 +244,7 @@ struct amvdec_session { u32 width; u32 height; u32 colorspace; + u32 bitdepth; u8 ycbcr_enc; u8 quantization; u8 xfer_func; diff --git a/drivers/staging/media/meson/vdec/vdec_helpers.c b/drivers/staging/media/meson/vdec/vdec_helpers.c index 7d2a75653250..fef76142f0c5 100644 --- a/drivers/staging/media/meson/vdec/vdec_helpers.c +++ b/drivers/staging/media/meson/vdec/vdec_helpers.c @@ -50,32 +50,40 @@ void amvdec_write_parser(struct amvdec_core *core, u32 reg, u32 val) } EXPORT_SYMBOL_GPL(amvdec_write_parser); -/* 4 KiB per 64x32 block */ -u32 amvdec_am21c_body_size(u32 width, u32 height) +/* AMFBC body is made out of 64x32 blocks with varying block size */ +u32 amvdec_amfbc_body_size(u32 width, u32 height, u32 is_10bit, u32 use_mmu) { u32 width_64 = ALIGN(width, 64) / 64; u32 height_32 = ALIGN(height, 32) / 32; + u32 blk_size = 4096; - return SZ_4K * width_64 * height_32; + if (!is_10bit) { + if (use_mmu) + blk_size = 3200; + else + blk_size = 3072; + } + + return blk_size * width_64 * height_32; } -EXPORT_SYMBOL_GPL(amvdec_am21c_body_size); +EXPORT_SYMBOL_GPL(amvdec_amfbc_body_size); /* 32 bytes per 128x64 block */ -u32 amvdec_am21c_head_size(u32 width, u32 height) +u32 amvdec_amfbc_head_size(u32 width, u32 height) { u32 width_128 = ALIGN(width, 128) / 128; u32 height_64 = ALIGN(height, 64) / 64; return 32 * width_128 * height_64; } -EXPORT_SYMBOL_GPL(amvdec_am21c_head_size); +EXPORT_SYMBOL_GPL(amvdec_amfbc_head_size); -u32 amvdec_am21c_size(u32 width, u32 height) +u32 amvdec_amfbc_size(u32 width, u32 height, u32 is_10bit, u32 use_mmu) { - return ALIGN(amvdec_am21c_body_size(width, height) + - amvdec_am21c_head_size(width, height), SZ_64K); + return ALIGN(amvdec_amfbc_body_size(width, height, is_10bit, use_mmu) + + amvdec_amfbc_head_size(width, height), SZ_64K); } -EXPORT_SYMBOL_GPL(amvdec_am21c_size); +EXPORT_SYMBOL_GPL(amvdec_amfbc_size); static int canvas_alloc(struct amvdec_session *sess, u8 *canvas_id) { @@ -440,7 +448,7 @@ void amvdec_set_par_from_dar(struct amvdec_session *sess, EXPORT_SYMBOL_GPL(amvdec_set_par_from_dar); void amvdec_src_change(struct amvdec_session *sess, u32 width, - u32 height, u32 dpb_size) + u32 height, u32 dpb_size, u32 bitdepth) { static const struct v4l2_event ev = { .type = V4L2_EVENT_SOURCE_CHANGE, @@ -448,25 +456,27 @@ void amvdec_src_change(struct amvdec_session *sess, u32 width, v4l2_ctrl_s_ctrl(sess->ctrl_min_buf_capture, dpb_size); + sess->bitdepth = bitdepth; + /* * Check if the capture queue is already configured well for our - * usecase. If so, keep decoding with it and do not send the event + * usecase. If so, keep decoding with it. */ if (sess->streamon_cap && sess->width == width && sess->height == height && dpb_size <= sess->num_dst_bufs) { sess->fmt_out->codec_ops->resume(sess); - return; + } else { + sess->status = STATUS_NEEDS_RESUME; + sess->changed_format = 0; } - sess->changed_format = 0; sess->width = width; sess->height = height; - sess->status = STATUS_NEEDS_RESUME; - dev_dbg(sess->core->dev, "Res. changed (%ux%u), DPB size %u\n", - width, height, dpb_size); + dev_dbg(sess->core->dev, "Res. changed (%ux%u), DPB %u, bitdepth %u\n", + width, height, dpb_size, bitdepth); v4l2_event_queue_fh(&sess->fh, &ev); } EXPORT_SYMBOL_GPL(amvdec_src_change); diff --git a/drivers/staging/media/meson/vdec/vdec_helpers.h b/drivers/staging/media/meson/vdec/vdec_helpers.h index 4bf3e61d081b..1a711679d26a 100644 --- a/drivers/staging/media/meson/vdec/vdec_helpers.h +++ b/drivers/staging/media/meson/vdec/vdec_helpers.h @@ -27,9 +27,10 @@ void amvdec_clear_dos_bits(struct amvdec_core *core, u32 reg, u32 val); u32 amvdec_read_parser(struct amvdec_core *core, u32 reg); void amvdec_write_parser(struct amvdec_core *core, u32 reg, u32 val); -u32 amvdec_am21c_body_size(u32 width, u32 height); -u32 amvdec_am21c_head_size(u32 width, u32 height); -u32 amvdec_am21c_size(u32 width, u32 height); +/* Helpers for the Amlogic compressed framebuffer format */ +u32 amvdec_amfbc_body_size(u32 width, u32 height, u32 is_10bit, u32 use_mmu); +u32 amvdec_amfbc_head_size(u32 width, u32 height); +u32 amvdec_amfbc_size(u32 width, u32 height, u32 is_10bit, u32 use_mmu); /** * amvdec_dst_buf_done_idx() - Signal that a buffer is done decoding @@ -77,9 +78,10 @@ void amvdec_set_par_from_dar(struct amvdec_session *sess, * @width: picture width detected by the hardware * @height: picture height detected by the hardware * @dpb_size: Decoded Picture Buffer size (= amount of buffers for decoding) + * @bitdepth: Bit depth (usually 10 or 8) of the coded content */ void amvdec_src_change(struct amvdec_session *sess, u32 width, - u32 height, u32 dpb_size); + u32 height, u32 dpb_size, u32 bitdepth); /** * amvdec_abort() - Abort the current decoding session -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0060-FROMLIST-v2-media-meson-vdec-add-HEVC-decode-codec.patch ================================================ From bc74e7054ac07e488d17c25f7c30660fcff5fb4d Mon Sep 17 00:00:00 2001 From: Maxime Jourdan <mjourdan@baylibre.com> Date: Mon, 23 Jan 2023 11:07:04 +0000 Subject: [PATCH 060/120] FROMLIST(v2): media: meson: vdec: add HEVC decode codec Add initial HEVC codec for the Amlogic GXBB/GXL/GXM SoCs using the common "HEVC" decoder driver. Signed-off-by: Maxime Jourdan <mjourdan@baylibre.com> [codec alignment to upstream changes and frame handling improvements] Signed-off-by: Benjamin Roszak <benjamin545@gmail.com> --- drivers/staging/media/meson/vdec/Makefile | 2 +- drivers/staging/media/meson/vdec/codec_hevc.c | 1462 +++++++++++++++++ drivers/staging/media/meson/vdec/codec_hevc.h | 13 + drivers/staging/media/meson/vdec/esparser.c | 3 +- drivers/staging/media/meson/vdec/hevc_regs.h | 1 + .../staging/media/meson/vdec/vdec_platform.c | 37 + 6 files changed, 1516 insertions(+), 2 deletions(-) create mode 100644 drivers/staging/media/meson/vdec/codec_hevc.c create mode 100644 drivers/staging/media/meson/vdec/codec_hevc.h diff --git a/drivers/staging/media/meson/vdec/Makefile b/drivers/staging/media/meson/vdec/Makefile index 6e726af84ac9..16f848e456b9 100644 --- a/drivers/staging/media/meson/vdec/Makefile +++ b/drivers/staging/media/meson/vdec/Makefile @@ -3,6 +3,6 @@ meson-vdec-objs = esparser.o vdec.o vdec_helpers.o vdec_platform.o meson-vdec-objs += vdec_1.o vdec_hevc.o -meson-vdec-objs += codec_mpeg12.o codec_h264.o codec_hevc_common.o codec_vp9.o +meson-vdec-objs += codec_mpeg12.o codec_h264.o codec_hevc_common.o codec_vp9.o codec_hevc.o obj-$(CONFIG_VIDEO_MESON_VDEC) += meson-vdec.o diff --git a/drivers/staging/media/meson/vdec/codec_hevc.c b/drivers/staging/media/meson/vdec/codec_hevc.c new file mode 100644 index 000000000000..fcaaa1ad50b8 --- /dev/null +++ b/drivers/staging/media/meson/vdec/codec_hevc.c @@ -0,0 +1,1462 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2018 Maxime Jourdan <mjourdan@baylibre.com> + * Copyright (C) 2015 Amlogic, Inc. All rights reserved. + */ + +#include <media/v4l2-mem2mem.h> +#include <media/videobuf2-dma-contig.h> + +#include "codec_hevc.h" +#include "dos_regs.h" +#include "hevc_regs.h" +#include "vdec_helpers.h" +#include "codec_hevc_common.h" + +/* HEVC reg mapping */ +#define HEVC_DEC_STATUS_REG HEVC_ASSIST_SCRATCH_0 + #define HEVC_ACTION_DONE 0xff +#define HEVC_RPM_BUFFER HEVC_ASSIST_SCRATCH_1 +#define HEVC_SHORT_TERM_RPS HEVC_ASSIST_SCRATCH_2 +#define HEVC_VPS_BUFFER HEVC_ASSIST_SCRATCH_3 +#define HEVC_SPS_BUFFER HEVC_ASSIST_SCRATCH_4 +#define HEVC_PPS_BUFFER HEVC_ASSIST_SCRATCH_5 +#define HEVC_SAO_UP HEVC_ASSIST_SCRATCH_6 +#define HEVC_STREAM_SWAP_BUFFER HEVC_ASSIST_SCRATCH_7 +#define H265_MMU_MAP_BUFFER HEVC_ASSIST_SCRATCH_7 +#define HEVC_STREAM_SWAP_BUFFER2 HEVC_ASSIST_SCRATCH_8 +#define HEVC_sao_mem_unit HEVC_ASSIST_SCRATCH_9 +#define HEVC_SAO_ABV HEVC_ASSIST_SCRATCH_A +#define HEVC_sao_vb_size HEVC_ASSIST_SCRATCH_B +#define HEVC_SAO_VB HEVC_ASSIST_SCRATCH_C +#define HEVC_SCALELUT HEVC_ASSIST_SCRATCH_D +#define HEVC_WAIT_FLAG HEVC_ASSIST_SCRATCH_E +#define RPM_CMD_REG HEVC_ASSIST_SCRATCH_F +#define LMEM_DUMP_ADR HEVC_ASSIST_SCRATCH_F +#define DEBUG_REG1 HEVC_ASSIST_SCRATCH_G +#define HEVC_DECODE_MODE2 HEVC_ASSIST_SCRATCH_H +#define NAL_SEARCH_CTL HEVC_ASSIST_SCRATCH_I +#define HEVC_DECODE_MODE HEVC_ASSIST_SCRATCH_J + #define DECODE_MODE_SINGLE 0 +#define DECODE_STOP_POS HEVC_ASSIST_SCRATCH_K +#define HEVC_AUX_ADR HEVC_ASSIST_SCRATCH_L +#define HEVC_AUX_DATA_SIZE HEVC_ASSIST_SCRATCH_M +#define HEVC_DECODE_SIZE HEVC_ASSIST_SCRATCH_N + +#define AMRISC_MAIN_REQ 0x04 + +/* HEVC Constants */ +#define MAX_REF_PIC_NUM 24 +#define MAX_REF_ACTIVE 16 +#define MAX_TILE_COL_NUM 10 +#define MAX_TILE_ROW_NUM 20 +#define MAX_SLICE_NUM 800 +#define INVALID_POC 0x80000000 + +/* HEVC Workspace layout */ +#define MPRED_MV_BUF_SIZE 0x120000 + +#define IPP_SIZE 0x4000 +#define SAO_ABV_SIZE 0x30000 +#define SAO_VB_SIZE 0x30000 +#define SH_TM_RPS_SIZE 0x800 +#define VPS_SIZE 0x800 +#define SPS_SIZE 0x800 +#define PPS_SIZE 0x2000 +#define SAO_UP_SIZE 0x2800 +#define SWAP_BUF_SIZE 0x800 +#define SWAP_BUF2_SIZE 0x800 +#define SCALELUT_SIZE 0x8000 +#define DBLK_PARA_SIZE 0x20000 +#define DBLK_DATA_SIZE 0x80000 +#define DBLK_DATA2_SIZE 0x80000 +#define MMU_VBH_SIZE 0x5000 +#define MPRED_ABV_SIZE 0x8000 +#define MPRED_MV_SIZE (MPRED_MV_BUF_SIZE * MAX_REF_PIC_NUM) +#define RPM_BUF_SIZE 0x100 +#define LMEM_SIZE 0xA00 + +#define IPP_OFFSET 0x00 +#define SAO_ABV_OFFSET (IPP_OFFSET + IPP_SIZE) +#define SAO_VB_OFFSET (SAO_ABV_OFFSET + SAO_ABV_SIZE) +#define SH_TM_RPS_OFFSET (SAO_VB_OFFSET + SAO_VB_SIZE) +#define VPS_OFFSET (SH_TM_RPS_OFFSET + SH_TM_RPS_SIZE) +#define SPS_OFFSET (VPS_OFFSET + VPS_SIZE) +#define PPS_OFFSET (SPS_OFFSET + SPS_SIZE) +#define SAO_UP_OFFSET (PPS_OFFSET + PPS_SIZE) +#define SWAP_BUF_OFFSET (SAO_UP_OFFSET + SAO_UP_SIZE) +#define SWAP_BUF2_OFFSET (SWAP_BUF_OFFSET + SWAP_BUF_SIZE) +#define SCALELUT_OFFSET (SWAP_BUF2_OFFSET + SWAP_BUF2_SIZE) +#define DBLK_PARA_OFFSET (SCALELUT_OFFSET + SCALELUT_SIZE) +#define DBLK_DATA_OFFSET (DBLK_PARA_OFFSET + DBLK_PARA_SIZE) +#define DBLK_DATA2_OFFSET (DBLK_DATA_OFFSET + DBLK_DATA_SIZE) +#define MMU_VBH_OFFSET (DBLK_DATA2_OFFSET + DBLK_DATA2_SIZE) +#define MPRED_ABV_OFFSET (MMU_VBH_OFFSET + MMU_VBH_SIZE) +#define MPRED_MV_OFFSET (MPRED_ABV_OFFSET + MPRED_ABV_SIZE) +#define RPM_OFFSET (MPRED_MV_OFFSET + MPRED_MV_SIZE) +#define LMEM_OFFSET (RPM_OFFSET + RPM_BUF_SIZE) + +/* ISR decode status */ +#define HEVC_DEC_IDLE 0x0 +#define HEVC_NAL_UNIT_VPS 0x1 +#define HEVC_NAL_UNIT_SPS 0x2 +#define HEVC_NAL_UNIT_PPS 0x3 +#define HEVC_NAL_UNIT_CODED_SLICE_SEGMENT 0x4 +#define HEVC_CODED_SLICE_SEGMENT_DAT 0x5 +#define HEVC_SLICE_DECODING 0x6 +#define HEVC_NAL_UNIT_SEI 0x7 +#define HEVC_SLICE_SEGMENT_DONE 0x8 +#define HEVC_NAL_SEARCH_DONE 0x9 +#define HEVC_DECPIC_DATA_DONE 0xa +#define HEVC_DECPIC_DATA_ERROR 0xb +#define HEVC_SEI_DAT 0xc +#define HEVC_SEI_DAT_DONE 0xd + +/* RPM misc_flag0 */ +#define PCM_LOOP_FILTER_DISABLED_FLAG_BIT 0 +#define PCM_ENABLE_FLAG_BIT 1 +#define LOOP_FILER_ACROSS_TILES_ENABLED_FLAG_BIT 2 +#define PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED_FLAG_BIT 3 +#define DEBLOCKING_FILTER_OVERRIDE_ENABLED_FLAG_BIT 4 +#define PPS_DEBLOCKING_FILTER_DISABLED_FLAG_BIT 5 +#define DEBLOCKING_FILTER_OVERRIDE_FLAG_BIT 6 +#define SLICE_DEBLOCKING_FILTER_DISABLED_FLAG_BIT 7 +#define SLICE_SAO_LUMA_FLAG_BIT 8 +#define SLICE_SAO_CHROMA_FLAG_BIT 9 +#define SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED_FLAG_BIT 10 + +/* Constants for HEVC_MPRED_CTRL1 */ +#define AMVP_MAX_NUM_CANDS_MEM 3 +#define AMVP_MAX_NUM_CANDS 2 +#define NUM_CHROMA_MODE 5 +#define DM_CHROMA_IDX 36 + +/* Buffer sizes */ +#define SIZE_WORKSPACE ALIGN(LMEM_OFFSET + LMEM_SIZE, 64 * SZ_1K) +#define SIZE_AUX (SZ_1K * 16) +#define SIZE_FRAME_MMU (0x1200 * 4) +#define RPM_SIZE 0x80 +#define RPS_USED_BIT 14 + +/* Data received from the HW in this form, do not rearrange */ +union rpm_param { + struct { + u16 data[RPM_SIZE]; + } l; + struct { + u16 CUR_RPS[MAX_REF_ACTIVE]; + u16 num_ref_idx_l0_active; + u16 num_ref_idx_l1_active; + u16 slice_type; + u16 slice_temporal_mvp_enable_flag; + u16 dependent_slice_segment_flag; + u16 slice_segment_address; + u16 num_title_rows_minus1; + u16 pic_width_in_luma_samples; + u16 pic_height_in_luma_samples; + u16 log2_min_coding_block_size_minus3; + u16 log2_diff_max_min_coding_block_size; + u16 log2_max_pic_order_cnt_lsb_minus4; + u16 POClsb; + u16 collocated_from_l0_flag; + u16 collocated_ref_idx; + u16 log2_parallel_merge_level; + u16 five_minus_max_num_merge_cand; + u16 sps_num_reorder_pics_0; + u16 modification_flag; + u16 tiles_flags; + u16 num_tile_columns_minus1; + u16 num_tile_rows_minus1; + u16 tile_width[8]; + u16 tile_height[8]; + u16 misc_flag0; + u16 pps_beta_offset_div2; + u16 pps_tc_offset_div2; + u16 slice_beta_offset_div2; + u16 slice_tc_offset_div2; + u16 pps_cb_qp_offset; + u16 pps_cr_qp_offset; + u16 first_slice_segment_in_pic_flag; + u16 m_temporalId; + u16 m_nalUnitType; + u16 vui_num_units_in_tick_hi; + u16 vui_num_units_in_tick_lo; + u16 vui_time_scale_hi; + u16 vui_time_scale_lo; + u16 bit_depth; + u16 profile_etc; + u16 sei_frame_field_info; + u16 video_signal_type; + u16 modification_list[0x20]; + u16 conformance_window_flag; + u16 conf_win_left_offset; + u16 conf_win_right_offset; + u16 conf_win_top_offset; + u16 conf_win_bottom_offset; + u16 chroma_format_idc; + u16 color_description; + u16 aspect_ratio_idc; + u16 sar_width; + u16 sar_height; + } p; +}; + +enum nal_unit_type { + NAL_UNIT_CODED_SLICE_BLA = 16, + NAL_UNIT_CODED_SLICE_BLANT = 17, + NAL_UNIT_CODED_SLICE_BLA_N_LP = 18, + NAL_UNIT_CODED_SLICE_IDR = 19, + NAL_UNIT_CODED_SLICE_IDR_N_LP = 20, +}; + +enum slice_type { + B_SLICE = 0, + P_SLICE = 1, + I_SLICE = 2, +}; + +/* A frame being decoded */ +struct hevc_frame { + struct list_head list; + struct vb2_v4l2_buffer *vbuf; + u32 offset; + u32 poc; + + int referenced; + int show; + u32 num_reorder_pic; + + u32 cur_slice_idx; + u32 cur_slice_type; + + /* 2 lists (L0/L1) ; 800 slices ; 16 refs */ + u32 ref_poc_list[2][MAX_SLICE_NUM][MAX_REF_ACTIVE]; + u32 ref_num[2]; +}; + +struct codec_hevc { + /* Protect the data structure */ + struct mutex lock; + + /* Common part of the HEVC decoder */ + struct codec_hevc_common common; + + /* Buffer for the HEVC Workspace */ + void *workspace_vaddr; + dma_addr_t workspace_paddr; + + /* AUX buffer */ + void *aux_vaddr; + dma_addr_t aux_paddr; + + /* Contains many information parsed from the bitstream */ + union rpm_param rpm_param; + + /* Information computed from the RPM */ + u32 lcu_size; // Largest Coding Unit + u32 lcu_x_num; + u32 lcu_y_num; + u32 lcu_total; + + /* Current Frame being handled */ + struct hevc_frame *cur_frame; + u32 curr_poc; + /* Collocated Reference Picture */ + struct hevc_frame *col_frame; + u32 col_poc; + + /* All ref frames used by the HW at a given time */ + struct list_head ref_frames_list; + u32 frames_num; + + /* Coded resolution reported by the hardware */ + u32 width, height; + /* Resolution minus the conformance window offsets */ + u32 dst_width, dst_height; + + u32 prev_tid0_poc; + u32 slice_segment_addr; + u32 slice_addr; + u32 ldc_flag; + + /* Whether we detected the bitstream as 10-bit */ + int is_10bit; +}; + +static u32 codec_hevc_num_pending_bufs(struct amvdec_session *sess) +{ + struct codec_hevc *hevc; + u32 ret; + + hevc = sess->priv; + if (!hevc) + return 0; + + mutex_lock(&hevc->lock); + ret = hevc->frames_num; + mutex_unlock(&hevc->lock); + + return ret; +} + +/* Update the L0 and L1 reference lists for a given frame */ +static void codec_hevc_update_frame_refs(struct amvdec_session *sess, + struct hevc_frame *frame) +{ + struct codec_hevc *hevc = sess->priv; + union rpm_param *params = &hevc->rpm_param; + int num_ref_idx_l0_active = + (params->p.num_ref_idx_l0_active > MAX_REF_ACTIVE) ? + MAX_REF_ACTIVE : params->p.num_ref_idx_l0_active; + int num_ref_idx_l1_active = + (params->p.num_ref_idx_l1_active > MAX_REF_ACTIVE) ? + MAX_REF_ACTIVE : params->p.num_ref_idx_l1_active; + int ref_picset0[MAX_REF_ACTIVE] = { 0 }; + int ref_picset1[MAX_REF_ACTIVE] = { 0 }; + u16 *mod_list = params->p.modification_list; + int num_neg = 0; + int num_pos = 0; + int total_num; + int i; + + for (i = 0; i < MAX_REF_ACTIVE; i++) { + frame->ref_poc_list[0][frame->cur_slice_idx][i] = 0; + frame->ref_poc_list[1][frame->cur_slice_idx][i] = 0; + } + + for (i = 0; i < MAX_REF_ACTIVE; i++) { + u16 cur_rps = params->p.CUR_RPS[i]; + int delt = cur_rps & ((1 << (RPS_USED_BIT - 1)) - 1); + + if (cur_rps & 0x8000) + break; + + if (!((cur_rps >> RPS_USED_BIT) & 1)) + continue; + + if ((cur_rps >> (RPS_USED_BIT - 1)) & 1) { + ref_picset0[num_neg] = + frame->poc - ((1 << (RPS_USED_BIT - 1)) - delt); + num_neg++; + } else { + ref_picset1[num_pos] = frame->poc + delt; + num_pos++; + } + } + + total_num = num_neg + num_pos; + + if (total_num <= 0) + goto end; + + for (i = 0; i < num_ref_idx_l0_active; i++) { + int cidx; + + if (params->p.modification_flag & 0x1) + cidx = mod_list[i]; + else + cidx = i % total_num; + + frame->ref_poc_list[0][frame->cur_slice_idx][i] = + cidx >= num_neg ? ref_picset1[cidx - num_neg] : + ref_picset0[cidx]; + } + + if (params->p.slice_type != B_SLICE) + goto end; + + if (params->p.modification_flag & 0x2) { + for (i = 0; i < num_ref_idx_l1_active; i++) { + int cidx; + + if (params->p.modification_flag & 0x1) + cidx = mod_list[num_ref_idx_l0_active + i]; + else + cidx = mod_list[i]; + + frame->ref_poc_list[1][frame->cur_slice_idx][i] = + (cidx >= num_pos) ? ref_picset0[cidx - num_pos] + : ref_picset1[cidx]; + } + } else { + for (i = 0; i < num_ref_idx_l1_active; i++) { + int cidx = i % total_num; + + frame->ref_poc_list[1][frame->cur_slice_idx][i] = + cidx >= num_pos ? ref_picset0[cidx - num_pos] : + ref_picset1[cidx]; + } + } + +end: + frame->ref_num[0] = num_ref_idx_l0_active; + frame->ref_num[1] = num_ref_idx_l1_active; + + dev_dbg(sess->core->dev, + "Frame %u; slice %u; slice_type %u; num_l0 %u; num_l1 %u\n", + frame->poc, frame->cur_slice_idx, params->p.slice_type, + frame->ref_num[0], frame->ref_num[1]); +} + +static void codec_hevc_update_ldc_flag(struct codec_hevc *hevc) +{ + struct hevc_frame *frame = hevc->cur_frame; + u32 slice_type = frame->cur_slice_type; + u32 slice_idx = frame->cur_slice_idx; + int i; + + hevc->ldc_flag = 0; + + if (slice_type == I_SLICE) + return; + + hevc->ldc_flag = 1; + for (i = 0; (i < frame->ref_num[0]) && hevc->ldc_flag; i++) { + if (frame->ref_poc_list[0][slice_idx][i] > frame->poc) { + hevc->ldc_flag = 0; + break; + } + } + + if (slice_type == P_SLICE) + return; + + for (i = 0; (i < frame->ref_num[1]) && hevc->ldc_flag; i++) { + if (frame->ref_poc_list[1][slice_idx][i] > frame->poc) { + hevc->ldc_flag = 0; + break; + } + } +} + +/* Tag "old" frames that are no longer referenced */ +static void codec_hevc_update_referenced(struct codec_hevc *hevc) +{ + union rpm_param *param = &hevc->rpm_param; + struct hevc_frame *frame; + int i; + u32 curr_poc = hevc->curr_poc; + + list_for_each_entry(frame, &hevc->ref_frames_list, list) { + int is_referenced = 0; + u32 poc_tmp; + + if (!frame->referenced) + continue; + + for (i = 0; i < MAX_REF_ACTIVE; i++) { + int delt; + + if (param->p.CUR_RPS[i] & 0x8000) + break; + + delt = param->p.CUR_RPS[i] & + ((1 << (RPS_USED_BIT - 1)) - 1); + if (param->p.CUR_RPS[i] & (1 << (RPS_USED_BIT - 1))) { + poc_tmp = curr_poc - + ((1 << (RPS_USED_BIT - 1)) - delt); + } else { + poc_tmp = curr_poc + delt; + } + + if (poc_tmp == frame->poc) { + is_referenced = 1; + break; + } + } + + frame->referenced = is_referenced; + } +} + +static struct hevc_frame * +codec_hevc_get_next_ready_frame(struct codec_hevc *hevc) +{ + struct hevc_frame *tmp, *ret = NULL; + u32 poc = INT_MAX; + + list_for_each_entry(tmp, &hevc->ref_frames_list, list) { + if ((tmp->poc < poc) && tmp->show) { + ret = tmp; + poc = tmp->poc; + } + } + + return ret; +} + +/* Try to output as many frames as possible */ +static void codec_hevc_show_frames(struct amvdec_session *sess) +{ + struct hevc_frame *tmp, *n; + struct codec_hevc *hevc = sess->priv; + + while ((tmp = codec_hevc_get_next_ready_frame(hevc))) { + if (hevc->curr_poc && + (hevc->frames_num <= tmp->num_reorder_pic)) + break; + + dev_dbg(sess->core->dev, "DONE frame poc %u; vbuf %u\n", + tmp->poc, tmp->vbuf->vb2_buf.index); + amvdec_dst_buf_done_offset(sess, tmp->vbuf, tmp->offset, + V4L2_FIELD_NONE, false); + + tmp->show = 0; + hevc->frames_num--; + } + + /* clean output frame buffer */ + list_for_each_entry_safe(tmp, n, &hevc->ref_frames_list, list) { + if (tmp->referenced || tmp->show) + continue; + + list_del(&tmp->list); + kfree(tmp); + } +} + +static int +codec_hevc_setup_workspace(struct amvdec_session *sess, + struct codec_hevc *hevc) +{ + struct amvdec_core *core = sess->core; + u32 revision = core->platform->revision; + dma_addr_t wkaddr; + + /* Allocate some memory for the HEVC decoder's state */ + hevc->workspace_vaddr = dma_alloc_coherent(core->dev, SIZE_WORKSPACE, + &wkaddr, GFP_KERNEL); + if (!hevc->workspace_vaddr) + return -ENOMEM; + + hevc->workspace_paddr = wkaddr; + + amvdec_write_dos(core, HEVCD_IPP_LINEBUFF_BASE, wkaddr + IPP_OFFSET); + amvdec_write_dos(core, HEVC_RPM_BUFFER, wkaddr + RPM_OFFSET); + amvdec_write_dos(core, HEVC_SHORT_TERM_RPS, wkaddr + SH_TM_RPS_OFFSET); + amvdec_write_dos(core, HEVC_VPS_BUFFER, wkaddr + VPS_OFFSET); + amvdec_write_dos(core, HEVC_SPS_BUFFER, wkaddr + SPS_OFFSET); + amvdec_write_dos(core, HEVC_PPS_BUFFER, wkaddr + PPS_OFFSET); + amvdec_write_dos(core, HEVC_SAO_UP, wkaddr + SAO_UP_OFFSET); + + if (codec_hevc_use_mmu(revision, sess->pixfmt_cap, hevc->is_10bit)) { + amvdec_write_dos(core, HEVC_SAO_MMU_VH0_ADDR, + wkaddr + MMU_VBH_OFFSET); + amvdec_write_dos(core, HEVC_SAO_MMU_VH1_ADDR, + wkaddr + MMU_VBH_OFFSET + (MMU_VBH_SIZE / 2)); + + if (revision >= VDEC_REVISION_G12A) + amvdec_write_dos(core, HEVC_ASSIST_MMU_MAP_ADDR, + hevc->common.mmu_map_paddr); + else + amvdec_write_dos(core, H265_MMU_MAP_BUFFER, + hevc->common.mmu_map_paddr); + } else if (revision < VDEC_REVISION_G12A) { + amvdec_write_dos(core, HEVC_STREAM_SWAP_BUFFER, + wkaddr + SWAP_BUF_OFFSET); + amvdec_write_dos(core, HEVC_STREAM_SWAP_BUFFER2, + wkaddr + SWAP_BUF2_OFFSET); + } + + amvdec_write_dos(core, HEVC_SCALELUT, wkaddr + SCALELUT_OFFSET); + amvdec_write_dos(core, HEVC_DBLK_CFG4, wkaddr + DBLK_PARA_OFFSET); + amvdec_write_dos(core, HEVC_DBLK_CFG5, wkaddr + DBLK_DATA_OFFSET); + if (revision >= VDEC_REVISION_G12A) + amvdec_write_dos(core, HEVC_DBLK_CFGE, + wkaddr + DBLK_DATA2_OFFSET); + + amvdec_write_dos(core, LMEM_DUMP_ADR, wkaddr + LMEM_OFFSET); + + return 0; +} + +static int codec_hevc_start(struct amvdec_session *sess) +{ + struct amvdec_core *core = sess->core; + struct codec_hevc *hevc; + u32 val; + int i; + int ret; + + hevc = kzalloc(sizeof(*hevc), GFP_KERNEL); + if (!hevc) + return -ENOMEM; + + INIT_LIST_HEAD(&hevc->ref_frames_list); + hevc->curr_poc = INVALID_POC; + + ret = codec_hevc_setup_workspace(sess, hevc); + if (ret) + goto free_hevc; + + val = BIT(0); /* stream_fetch_enable */ + if (core->platform->revision >= VDEC_REVISION_G12A) + val |= (0xf << 25); /* arwlen_axi_max */ + amvdec_write_dos_bits(core, HEVC_STREAM_CONTROL, val); + + val = amvdec_read_dos(core, HEVC_PARSER_INT_CONTROL) & 0x03ffffff; + val |= (3 << 29) | BIT(27) | BIT(24) | BIT(22) | BIT(7) | BIT(4) | + BIT(0); + amvdec_write_dos(core, HEVC_PARSER_INT_CONTROL, val); + amvdec_write_dos_bits(core, HEVC_SHIFT_STATUS, BIT(1) | BIT(0)); + amvdec_write_dos(core, HEVC_SHIFT_CONTROL, + (3 << 6) | BIT(5) | BIT(2) | BIT(0)); + amvdec_write_dos(core, HEVC_CABAC_CONTROL, 1); + amvdec_write_dos(core, HEVC_PARSER_CORE_CONTROL, 1); + amvdec_write_dos(core, HEVC_DEC_STATUS_REG, 0); + + amvdec_write_dos(core, HEVC_IQIT_SCALELUT_WR_ADDR, 0); + for (i = 0; i < 1024; ++i) + amvdec_write_dos(core, HEVC_IQIT_SCALELUT_DATA, 0); + + amvdec_write_dos(core, HEVC_DECODE_SIZE, 0); + + amvdec_write_dos(core, HEVC_PARSER_CMD_WRITE, BIT(16)); + for (i = 0; i < ARRAY_SIZE(vdec_hevc_parser_cmd); ++i) + amvdec_write_dos(core, HEVC_PARSER_CMD_WRITE, + vdec_hevc_parser_cmd[i]); + + amvdec_write_dos(core, HEVC_PARSER_CMD_SKIP_0, PARSER_CMD_SKIP_CFG_0); + amvdec_write_dos(core, HEVC_PARSER_CMD_SKIP_1, PARSER_CMD_SKIP_CFG_1); + amvdec_write_dos(core, HEVC_PARSER_CMD_SKIP_2, PARSER_CMD_SKIP_CFG_2); + amvdec_write_dos(core, HEVC_PARSER_IF_CONTROL, + BIT(5) | BIT(2) | BIT(0)); + + amvdec_write_dos(core, HEVCD_IPP_TOP_CNTL, BIT(0)); + amvdec_write_dos(core, HEVCD_IPP_TOP_CNTL, BIT(1)); + + amvdec_write_dos(core, HEVC_WAIT_FLAG, 1); + + /* clear mailbox interrupt */ + amvdec_write_dos(core, HEVC_ASSIST_MBOX1_CLR_REG, 1); + /* enable mailbox interrupt */ + amvdec_write_dos(core, HEVC_ASSIST_MBOX1_MASK, 1); + /* disable PSCALE for hardware sharing */ + amvdec_write_dos(core, HEVC_PSCALE_CTRL, 0); + /* Let the uCode do all the parsing */ + amvdec_write_dos(core, NAL_SEARCH_CTL, 0xc); + + amvdec_write_dos(core, DECODE_STOP_POS, 0); + amvdec_write_dos(core, HEVC_DECODE_MODE, DECODE_MODE_SINGLE); + amvdec_write_dos(core, HEVC_DECODE_MODE2, 0); + + /* AUX buffers */ + hevc->aux_vaddr = dma_alloc_coherent(core->dev, SIZE_AUX, + &hevc->aux_paddr, GFP_KERNEL); + if (!hevc->aux_vaddr) { + ret = -ENOMEM; + goto free_hevc; + } + + amvdec_write_dos(core, HEVC_AUX_ADR, hevc->aux_paddr); + amvdec_write_dos(core, HEVC_AUX_DATA_SIZE, + (((SIZE_AUX) >> 4) << 16) | 0); + mutex_init(&hevc->lock); + sess->priv = hevc; + + return 0; + +free_hevc: + kfree(hevc); + return ret; +} + +static void codec_hevc_flush_output(struct amvdec_session *sess) +{ + struct codec_hevc *hevc = sess->priv; + struct hevc_frame *tmp, *n; + + while ((tmp = codec_hevc_get_next_ready_frame(hevc))) { + amvdec_dst_buf_done(sess, tmp->vbuf, V4L2_FIELD_NONE); + tmp->show = 0; + hevc->frames_num--; + } + + list_for_each_entry_safe(tmp, n, &hevc->ref_frames_list, list) { + list_del(&tmp->list); + kfree(tmp); + } +} + +static int codec_hevc_stop(struct amvdec_session *sess) +{ + struct codec_hevc *hevc = sess->priv; + struct amvdec_core *core = sess->core; + + mutex_lock(&hevc->lock); + codec_hevc_flush_output(sess); + + if (hevc->workspace_vaddr) + dma_free_coherent(core->dev, SIZE_WORKSPACE, + hevc->workspace_vaddr, + hevc->workspace_paddr); + + if (hevc->aux_vaddr) + dma_free_coherent(core->dev, SIZE_AUX, + hevc->aux_vaddr, hevc->aux_paddr); + + codec_hevc_free_fbc_buffers(sess, &hevc->common); + mutex_unlock(&hevc->lock); + mutex_destroy(&hevc->lock); + + return 0; +} + +static struct hevc_frame * +codec_hevc_get_frame_by_poc(struct codec_hevc *hevc, u32 poc) +{ + struct hevc_frame *tmp; + + list_for_each_entry(tmp, &hevc->ref_frames_list, list) { + if (tmp->poc == poc) + return tmp; + } + + return NULL; +} + +static struct hevc_frame * +codec_hevc_prepare_new_frame(struct amvdec_session *sess) +{ + struct amvdec_core *core = sess->core; + struct hevc_frame *new_frame = NULL; + struct codec_hevc *hevc = sess->priv; + struct vb2_v4l2_buffer *vbuf; + union rpm_param *params = &hevc->rpm_param; + + new_frame = kzalloc(sizeof(*new_frame), GFP_KERNEL); + if (!new_frame) + return NULL; + + vbuf = v4l2_m2m_dst_buf_remove(sess->m2m_ctx); + if (!vbuf) { + dev_err(sess->core->dev, "No dst buffer available\n"); + return NULL; + } + + new_frame->vbuf = vbuf; + new_frame->referenced = 1; + new_frame->show = 1; + new_frame->poc = hevc->curr_poc; + new_frame->cur_slice_type = params->p.slice_type; + new_frame->num_reorder_pic = params->p.sps_num_reorder_pics_0; + new_frame->offset = amvdec_read_dos(core, HEVC_SHIFT_BYTE_COUNT); + + list_add_tail(&new_frame->list, &hevc->ref_frames_list); + hevc->frames_num++; + + return new_frame; +} + +static void +codec_hevc_set_sao(struct amvdec_session *sess, struct hevc_frame *frame) +{ + struct amvdec_core *core = sess->core; + struct codec_hevc *hevc = sess->priv; + struct vb2_buffer *vb = &frame->vbuf->vb2_buf; + union rpm_param *param = &hevc->rpm_param; + u32 pic_height_cu = + (hevc->height + hevc->lcu_size - 1) / hevc->lcu_size; + u32 sao_mem_unit = (hevc->lcu_size == 16 ? 9 : + hevc->lcu_size == 32 ? 14 : 24) << 4; + u32 sao_vb_size = (sao_mem_unit + (2 << 4)) * pic_height_cu; + u32 misc_flag0 = param->p.misc_flag0; + dma_addr_t buf_y_paddr; + dma_addr_t buf_u_v_paddr; + u32 slice_deblocking_filter_disabled_flag; + u32 val, val_2; + + val = (amvdec_read_dos(core, HEVC_SAO_CTRL0) & ~0xf) | + ilog2(hevc->lcu_size); + amvdec_write_dos(core, HEVC_SAO_CTRL0, val); + + amvdec_write_dos(core, HEVC_SAO_PIC_SIZE, + hevc->width | (hevc->height << 16)); + amvdec_write_dos(core, HEVC_SAO_PIC_SIZE_LCU, + (hevc->lcu_x_num - 1) | (hevc->lcu_y_num - 1) << 16); + + if (codec_hevc_use_downsample(sess->pixfmt_cap, hevc->is_10bit) || + codec_hevc_use_mmu(core->platform->revision, sess->pixfmt_cap, + hevc->is_10bit)) + buf_y_paddr = + hevc->common.fbc_buffer_paddr[vb->index]; + else + buf_y_paddr = + vb2_dma_contig_plane_dma_addr(vb, 0); + + if (codec_hevc_use_fbc(sess->pixfmt_cap, hevc->is_10bit)) { + val = amvdec_read_dos(core, HEVC_SAO_CTRL5) & ~0xff0000; + amvdec_write_dos(core, HEVC_SAO_CTRL5, val); + amvdec_write_dos(core, HEVC_CM_BODY_START_ADDR, buf_y_paddr); + } + + if (sess->pixfmt_cap == V4L2_PIX_FMT_NV12M) { + buf_y_paddr = + vb2_dma_contig_plane_dma_addr(vb, 0); + buf_u_v_paddr = + vb2_dma_contig_plane_dma_addr(vb, 1); + amvdec_write_dos(core, HEVC_SAO_Y_START_ADDR, buf_y_paddr); + amvdec_write_dos(core, HEVC_SAO_C_START_ADDR, buf_u_v_paddr); + amvdec_write_dos(core, HEVC_SAO_Y_WPTR, buf_y_paddr); + amvdec_write_dos(core, HEVC_SAO_C_WPTR, buf_u_v_paddr); + } + + if (codec_hevc_use_mmu(core->platform->revision, sess->pixfmt_cap, + hevc->is_10bit)) { + dma_addr_t header_adr = vb2_dma_contig_plane_dma_addr(vb, 0); + + if (codec_hevc_use_downsample(sess->pixfmt_cap, hevc->is_10bit)) + header_adr = hevc->common.mmu_header_paddr[vb->index]; + amvdec_write_dos(core, HEVC_CM_HEADER_START_ADDR, header_adr); + /* use HEVC_CM_HEADER_START_ADDR */ + amvdec_write_dos_bits(core, HEVC_SAO_CTRL5, BIT(10)); + amvdec_write_dos_bits(core, HEVC_SAO_CTRL9, BIT(0)); + } + + amvdec_write_dos(core, HEVC_SAO_Y_LENGTH, + amvdec_get_output_size(sess)); + amvdec_write_dos(core, HEVC_SAO_C_LENGTH, + (amvdec_get_output_size(sess) / 2)); + + if (frame->cur_slice_idx == 0) { + if (core->platform->revision >= VDEC_REVISION_G12A) { + if (core->platform->revision >= VDEC_REVISION_SM1) + val = 0xfc << 8; + else + val = 0x54 << 8; + + /* enable first, compressed write */ + if (codec_hevc_use_fbc(sess->pixfmt_cap, + hevc->is_10bit)) + val |= BIT(8); + + /* enable second, uncompressed write */ + if (sess->pixfmt_cap == V4L2_PIX_FMT_NV12M) + val |= BIT(9); + + /* dblk pipeline mode=1 for performance */ + if (hevc->width >= 1280) + val |= BIT(4); + + amvdec_write_dos(core, HEVC_DBLK_CFGB, val); + amvdec_write_dos(core, HEVC_DBLK_STS1 + 16, BIT(28)); + } + + amvdec_write_dos(core, HEVC_DBLK_CFG2, + hevc->width | (hevc->height << 16)); + + val = 0; + if ((misc_flag0 >> PCM_ENABLE_FLAG_BIT) & 0x1) + val |= ((misc_flag0 >> + PCM_LOOP_FILTER_DISABLED_FLAG_BIT) & 0x1) << 3; + + val |= (param->p.pps_cb_qp_offset & 0x1f) << 4; + val |= (param->p.pps_cr_qp_offset & 0x1f) << 9; + val |= (hevc->lcu_size == 64) ? 0 : + ((hevc->lcu_size == 32) ? 1 : 2); + amvdec_write_dos(core, HEVC_DBLK_CFG1, val); + } + + val = amvdec_read_dos(core, HEVC_SAO_CTRL1) & ~0x3ff3; + val |= 0xff0; /* Set endianness for 2-bytes swaps (nv12) */ + if (core->platform->revision < VDEC_REVISION_G12A) { + if (!codec_hevc_use_fbc(sess->pixfmt_cap, hevc->is_10bit)) + val |= BIT(0); /* disable cm compression */ + /* TOFIX: Handle Amlogic Framebuffer compression */ + } + + amvdec_write_dos(core, HEVC_SAO_CTRL1, val); + + if (!codec_hevc_use_fbc(sess->pixfmt_cap, hevc->is_10bit)) { + /* no downscale for NV12 */ + val = amvdec_read_dos(core, HEVC_SAO_CTRL5) & ~0xff0000; + amvdec_write_dos(core, HEVC_SAO_CTRL5, val); + } + + val = amvdec_read_dos(core, HEVCD_IPP_AXIIF_CONFIG) & ~0x30; + val |= 0xf; + amvdec_write_dos(core, HEVCD_IPP_AXIIF_CONFIG, val); + + val = 0; + val_2 = amvdec_read_dos(core, HEVC_SAO_CTRL0); + val_2 &= (~0x300); + + slice_deblocking_filter_disabled_flag = (misc_flag0 >> + SLICE_DEBLOCKING_FILTER_DISABLED_FLAG_BIT) & 0x1; + if ((misc_flag0 & (1 << DEBLOCKING_FILTER_OVERRIDE_ENABLED_FLAG_BIT)) && + (misc_flag0 & (1 << DEBLOCKING_FILTER_OVERRIDE_FLAG_BIT))) { + val |= slice_deblocking_filter_disabled_flag << 2; + + if (!slice_deblocking_filter_disabled_flag) { + val |= (param->p.slice_beta_offset_div2 & 0xf) << 3; + val |= (param->p.slice_tc_offset_div2 & 0xf) << 7; + } + } else { + val |= + ((misc_flag0 >> + PPS_DEBLOCKING_FILTER_DISABLED_FLAG_BIT) & 0x1) << 2; + + if (((misc_flag0 >> PPS_DEBLOCKING_FILTER_DISABLED_FLAG_BIT) & + 0x1) == 0) { + val |= (param->p.pps_beta_offset_div2 & 0xf) << 3; + val |= (param->p.pps_tc_offset_div2 & 0xf) << 7; + } + } + if ((misc_flag0 & (1 << PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED_FLAG_BIT)) && + ((misc_flag0 & (1 << SLICE_SAO_LUMA_FLAG_BIT)) || + (misc_flag0 & (1 << SLICE_SAO_CHROMA_FLAG_BIT)) || + (!slice_deblocking_filter_disabled_flag))) { + val |= + ((misc_flag0 >> + SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED_FLAG_BIT) + & 0x1) << 1; + val_2 |= + ((misc_flag0 >> + SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED_FLAG_BIT) + & 0x1) << 9; + } else { + val |= + ((misc_flag0 >> + PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED_FLAG_BIT) + & 0x1) << 1; + val_2 |= + ((misc_flag0 >> + PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED_FLAG_BIT) + & 0x1) << 9; + } + + amvdec_write_dos(core, HEVC_DBLK_CFG9, val); + amvdec_write_dos(core, HEVC_SAO_CTRL0, val_2); + + amvdec_write_dos(core, HEVC_sao_mem_unit, sao_mem_unit); + amvdec_write_dos(core, HEVC_SAO_ABV, + hevc->workspace_paddr + SAO_ABV_OFFSET); + amvdec_write_dos(core, HEVC_sao_vb_size, sao_vb_size); + amvdec_write_dos(core, HEVC_SAO_VB, + hevc->workspace_paddr + SAO_VB_OFFSET); +} + +static dma_addr_t codec_hevc_get_frame_mv_paddr(struct codec_hevc *hevc, + struct hevc_frame *frame) +{ + return hevc->workspace_paddr + MPRED_MV_OFFSET + + (frame->vbuf->vb2_buf.index * MPRED_MV_BUF_SIZE); +} + +static void +codec_hevc_set_mpred_ctrl(struct amvdec_core *core, struct codec_hevc *hevc) +{ + union rpm_param *param = &hevc->rpm_param; + u32 slice_type = param->p.slice_type; + u32 lcu_size_log2 = ilog2(hevc->lcu_size); + u32 val; + + val = slice_type | + MPRED_CTRL0_ABOVE_EN | + MPRED_CTRL0_MV_WR_EN | + MPRED_CTRL0_BUF_LINEAR | + (lcu_size_log2 << 16) | + (3 << 20) | /* cu_size_log2 */ + (param->p.log2_parallel_merge_level << 24); + + if (slice_type != I_SLICE) + val |= MPRED_CTRL0_MV_RD_EN; + + if (param->p.collocated_from_l0_flag) + val |= MPRED_CTRL0_COL_FROM_L0; + + if (param->p.slice_temporal_mvp_enable_flag) + val |= MPRED_CTRL0_TMVP; + + if (hevc->ldc_flag) + val |= MPRED_CTRL0_LDC; + + if (param->p.dependent_slice_segment_flag) + val |= MPRED_CTRL0_NEW_SLI_SEG; + + if (param->p.slice_segment_address == 0) + val |= MPRED_CTRL0_NEW_PIC | + MPRED_CTRL0_NEW_TILE; + + amvdec_write_dos(core, HEVC_MPRED_CTRL0, val); + + val = (5 - param->p.five_minus_max_num_merge_cand) | + (AMVP_MAX_NUM_CANDS << 4) | + (AMVP_MAX_NUM_CANDS_MEM << 8) | + (NUM_CHROMA_MODE << 12) | + (DM_CHROMA_IDX << 16); + amvdec_write_dos(core, HEVC_MPRED_CTRL1, val); +} + +static void codec_hevc_set_mpred_mv(struct amvdec_core *core, + struct codec_hevc *hevc, + struct hevc_frame *frame, + struct hevc_frame *col_frame) +{ + union rpm_param *param = &hevc->rpm_param; + u32 lcu_size_log2 = ilog2(hevc->lcu_size); + u32 mv_mem_unit = lcu_size_log2 == 6 ? 0x200 : + lcu_size_log2 == 5 ? 0x80 : 0x20; + dma_addr_t col_mv_rd_start_addr, col_mv_rd_ptr, col_mv_rd_end_addr; + dma_addr_t mpred_mv_wr_ptr; + + amvdec_read_dos(core, HEVC_MPRED_CURR_LCU); + + col_mv_rd_start_addr = codec_hevc_get_frame_mv_paddr(hevc, col_frame); + mpred_mv_wr_ptr = codec_hevc_get_frame_mv_paddr(hevc, frame) + + (hevc->slice_addr * mv_mem_unit); + col_mv_rd_ptr = col_mv_rd_start_addr + + (hevc->slice_addr * mv_mem_unit); + col_mv_rd_end_addr = col_mv_rd_start_addr + + (hevc->lcu_total * mv_mem_unit); + + amvdec_write_dos(core, HEVC_MPRED_MV_WR_START_ADDR, + codec_hevc_get_frame_mv_paddr(hevc, frame)); + amvdec_write_dos(core, HEVC_MPRED_MV_RD_START_ADDR, + col_mv_rd_start_addr); + + if (param->p.slice_segment_address == 0) { + amvdec_write_dos(core, HEVC_MPRED_ABV_START_ADDR, + hevc->workspace_paddr + MPRED_ABV_OFFSET); + amvdec_write_dos(core, HEVC_MPRED_MV_WPTR, mpred_mv_wr_ptr); + amvdec_write_dos(core, HEVC_MPRED_MV_RPTR, + col_mv_rd_start_addr); + } else { + amvdec_write_dos(core, HEVC_MPRED_MV_RPTR, col_mv_rd_ptr); + } + + amvdec_write_dos(core, HEVC_MPRED_MV_RD_END_ADDR, col_mv_rd_end_addr); +} + +/* Update motion prediction with the current slice */ +static void codec_hevc_set_mpred(struct amvdec_session *sess, + struct hevc_frame *frame, + struct hevc_frame *col_frame) +{ + struct amvdec_core *core = sess->core; + struct codec_hevc *hevc = sess->priv; + u32 *ref_num = frame->ref_num; + u32 *ref_poc_l0 = frame->ref_poc_list[0][frame->cur_slice_idx]; + u32 *ref_poc_l1 = frame->ref_poc_list[1][frame->cur_slice_idx]; + u32 val; + int i; + + codec_hevc_set_mpred_ctrl(core, hevc); + codec_hevc_set_mpred_mv(core, hevc, frame, col_frame); + + amvdec_write_dos(core, HEVC_MPRED_PIC_SIZE, + hevc->width | (hevc->height << 16)); + + val = ((hevc->lcu_x_num - 1) | (hevc->lcu_y_num - 1) << 16); + amvdec_write_dos(core, HEVC_MPRED_PIC_SIZE_LCU, val); + + amvdec_write_dos(core, HEVC_MPRED_REF_NUM, + (ref_num[1] << 8) | ref_num[0]); + amvdec_write_dos(core, HEVC_MPRED_REF_EN_L0, (1 << ref_num[0]) - 1); + amvdec_write_dos(core, HEVC_MPRED_REF_EN_L1, (1 << ref_num[1]) - 1); + + amvdec_write_dos(core, HEVC_MPRED_CUR_POC, hevc->curr_poc); + amvdec_write_dos(core, HEVC_MPRED_COL_POC, hevc->col_poc); + + for (i = 0; i < MAX_REF_ACTIVE; ++i) { + amvdec_write_dos(core, HEVC_MPRED_L0_REF00_POC + i * 4, + ref_poc_l0[i]); + amvdec_write_dos(core, HEVC_MPRED_L1_REF00_POC + i * 4, + ref_poc_l1[i]); + } +} + +/* motion compensation reference cache controller */ +static void codec_hevc_set_mcrcc(struct amvdec_session *sess) +{ + struct amvdec_core *core = sess->core; + struct codec_hevc *hevc = sess->priv; + u32 val, val_2; + int l0_cnt = 0; + int l1_cnt = 0x7fff; + + if (!codec_hevc_use_fbc(sess->pixfmt_cap, hevc->is_10bit)) { + l0_cnt = hevc->cur_frame->ref_num[0]; + l1_cnt = hevc->cur_frame->ref_num[1]; + } + + if (hevc->cur_frame->cur_slice_type == I_SLICE) { + amvdec_write_dos(core, HEVCD_MCRCC_CTL1, 0); + return; + } + + if (hevc->cur_frame->cur_slice_type == P_SLICE) { + amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_ACCCONFIG_ADDR, + BIT(1)); + val = amvdec_read_dos(core, HEVCD_MPP_ANC_CANVAS_DATA_ADDR); + val &= 0xffff; + val |= (val << 16); + amvdec_write_dos(core, HEVCD_MCRCC_CTL2, val); + + if (l0_cnt == 1) { + amvdec_write_dos(core, HEVCD_MCRCC_CTL3, val); + } else { + val = amvdec_read_dos(core, + HEVCD_MPP_ANC_CANVAS_DATA_ADDR); + val &= 0xffff; + val |= (val << 16); + amvdec_write_dos(core, HEVCD_MCRCC_CTL3, val); + } + } else { /* B_SLICE */ + amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_ACCCONFIG_ADDR, 0); + val = amvdec_read_dos(core, HEVCD_MPP_ANC_CANVAS_DATA_ADDR); + val &= 0xffff; + val |= (val << 16); + amvdec_write_dos(core, HEVCD_MCRCC_CTL2, val); + + amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_ACCCONFIG_ADDR, + BIT(12) | BIT(1)); + val_2 = amvdec_read_dos(core, HEVCD_MPP_ANC_CANVAS_DATA_ADDR); + val_2 &= 0xffff; + val_2 |= (val_2 << 16); + if (val == val_2 && l1_cnt > 1) { + val_2 = amvdec_read_dos(core, + HEVCD_MPP_ANC_CANVAS_DATA_ADDR); + val_2 &= 0xffff; + val_2 |= (val_2 << 16); + } + amvdec_write_dos(core, HEVCD_MCRCC_CTL3, val); + } + + /* enable mcrcc progressive-mode */ + amvdec_write_dos(core, HEVCD_MCRCC_CTL1, 0xff0); +} + +static void codec_hevc_set_ref_list(struct amvdec_session *sess, + u32 ref_num, u32 *ref_poc_list) +{ + struct codec_hevc *hevc = sess->priv; + struct hevc_frame *ref_frame; + struct amvdec_core *core = sess->core; + int i; + u32 buf_id_y; + u32 buf_id_uv; + + for (i = 0; i < ref_num; i++) { + ref_frame = codec_hevc_get_frame_by_poc(hevc, ref_poc_list[i]); + + if (!ref_frame) { + dev_warn(core->dev, "Couldn't find ref. frame %u\n", + ref_poc_list[i]); + continue; + } + + if (codec_hevc_use_fbc(sess->pixfmt_cap, hevc->is_10bit)) { + buf_id_y = ref_frame->vbuf->vb2_buf.index; + buf_id_uv = buf_id_y; + } else { + buf_id_y = ref_frame->vbuf->vb2_buf.index * 2; + buf_id_uv = buf_id_y + 1; + } + + amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_DATA_ADDR, + (buf_id_uv << 16) | + (buf_id_uv << 8) | + buf_id_y); + } +} + +static void codec_hevc_set_mc(struct amvdec_session *sess, + struct hevc_frame *frame) +{ + struct amvdec_core *core = sess->core; + + if (frame->cur_slice_type == I_SLICE) + return; + + amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_ACCCONFIG_ADDR, 1); + codec_hevc_set_ref_list(sess, frame->ref_num[0], + frame->ref_poc_list[0][frame->cur_slice_idx]); + + if (frame->cur_slice_type == P_SLICE) + return; + + amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_ACCCONFIG_ADDR, + BIT(12) | BIT(0)); + codec_hevc_set_ref_list(sess, frame->ref_num[1], + frame->ref_poc_list[1][frame->cur_slice_idx]); +} + +static void codec_hevc_update_col_frame(struct codec_hevc *hevc) +{ + struct hevc_frame *cur_frame = hevc->cur_frame; + union rpm_param *param = &hevc->rpm_param; + u32 list_no = 0; + u32 col_ref = param->p.collocated_ref_idx; + u32 col_from_l0 = param->p.collocated_from_l0_flag; + u32 cur_slice_idx = cur_frame->cur_slice_idx; + + if (cur_frame->cur_slice_type == B_SLICE) + list_no = 1 - col_from_l0; + + if (col_ref >= cur_frame->ref_num[list_no]) + hevc->col_poc = INVALID_POC; + else + hevc->col_poc = cur_frame->ref_poc_list[list_no] + [cur_slice_idx] + [col_ref]; + + if (cur_frame->cur_slice_type == I_SLICE) + goto end; + + if (hevc->col_poc != INVALID_POC) + hevc->col_frame = codec_hevc_get_frame_by_poc(hevc, + hevc->col_poc); + else + hevc->col_frame = hevc->cur_frame; + +end: + if (!hevc->col_frame) + hevc->col_frame = hevc->cur_frame; +} + +static void codec_hevc_update_pocs(struct amvdec_session *sess) +{ + struct codec_hevc *hevc = sess->priv; + union rpm_param *param = &hevc->rpm_param; + u32 nal_unit_type = param->p.m_nalUnitType; + u32 temporal_id = param->p.m_temporalId & 0x7; + int max_poc_lsb = + 1 << (param->p.log2_max_pic_order_cnt_lsb_minus4 + 4); + int prev_poc_lsb; + int prev_poc_msb; + int poc_msb; + int poc_lsb = param->p.POClsb; + + if (nal_unit_type == NAL_UNIT_CODED_SLICE_IDR || + nal_unit_type == NAL_UNIT_CODED_SLICE_IDR_N_LP) { + hevc->curr_poc = 0; + if ((temporal_id - 1) == 0) + hevc->prev_tid0_poc = hevc->curr_poc; + + return; + } + + prev_poc_lsb = hevc->prev_tid0_poc % max_poc_lsb; + prev_poc_msb = hevc->prev_tid0_poc - prev_poc_lsb; + + if ((poc_lsb < prev_poc_lsb) && + ((prev_poc_lsb - poc_lsb) >= (max_poc_lsb / 2))) + poc_msb = prev_poc_msb + max_poc_lsb; + else if ((poc_lsb > prev_poc_lsb) && + ((poc_lsb - prev_poc_lsb) > (max_poc_lsb / 2))) + poc_msb = prev_poc_msb - max_poc_lsb; + else + poc_msb = prev_poc_msb; + + if (nal_unit_type == NAL_UNIT_CODED_SLICE_BLA || + nal_unit_type == NAL_UNIT_CODED_SLICE_BLANT || + nal_unit_type == NAL_UNIT_CODED_SLICE_BLA_N_LP) + poc_msb = 0; + + hevc->curr_poc = (poc_msb + poc_lsb); + if ((temporal_id - 1) == 0) + hevc->prev_tid0_poc = hevc->curr_poc; +} + +static void codec_hevc_process_segment_header(struct amvdec_session *sess) +{ + struct codec_hevc *hevc = sess->priv; + union rpm_param *param = &hevc->rpm_param; + + if (param->p.first_slice_segment_in_pic_flag == 0) { + hevc->slice_segment_addr = param->p.slice_segment_address; + if (!param->p.dependent_slice_segment_flag) + hevc->slice_addr = hevc->slice_segment_addr; + } else { + hevc->slice_segment_addr = 0; + hevc->slice_addr = 0; + } + + codec_hevc_update_pocs(sess); +} + +static int codec_hevc_process_segment(struct amvdec_session *sess) +{ + struct codec_hevc *hevc = sess->priv; + struct amvdec_core *core = sess->core; + union rpm_param *param = &hevc->rpm_param; + u32 slice_segment_address = param->p.slice_segment_address; + + /* First slice: new frame */ + if (slice_segment_address == 0) { + codec_hevc_update_referenced(hevc); + codec_hevc_show_frames(sess); + + hevc->cur_frame = codec_hevc_prepare_new_frame(sess); + if (!hevc->cur_frame) + return -1; + } else { + hevc->cur_frame->cur_slice_idx++; + } + + codec_hevc_update_frame_refs(sess, hevc->cur_frame); + codec_hevc_update_col_frame(hevc); + codec_hevc_update_ldc_flag(hevc); + if (codec_hevc_use_mmu(core->platform->revision, sess->pixfmt_cap, + hevc->is_10bit)) + codec_hevc_fill_mmu_map(sess, &hevc->common, + &hevc->cur_frame->vbuf->vb2_buf, + hevc->is_10bit); + codec_hevc_set_mc(sess, hevc->cur_frame); + codec_hevc_set_mcrcc(sess); + codec_hevc_set_mpred(sess, hevc->cur_frame, hevc->col_frame); + codec_hevc_set_sao(sess, hevc->cur_frame); + + amvdec_write_dos_bits(core, HEVC_WAIT_FLAG, BIT(1)); + amvdec_write_dos(core, HEVC_DEC_STATUS_REG, + HEVC_CODED_SLICE_SEGMENT_DAT); + + /* Interrupt the firmware's processor */ + amvdec_write_dos(core, HEVC_MCPU_INTR_REQ, AMRISC_MAIN_REQ); + + return 0; +} + +static int codec_hevc_process_rpm(struct codec_hevc *hevc) +{ + union rpm_param *param = &hevc->rpm_param; + int src_changed = 0; + u32 dst_width, dst_height; + u32 lcu_size; + u32 is_10bit = 0; + + if (param->p.slice_segment_address || + !param->p.pic_width_in_luma_samples || + !param->p.pic_height_in_luma_samples) + return 0; + + if (param->p.bit_depth) + is_10bit = 1; + + hevc->width = param->p.pic_width_in_luma_samples; + hevc->height = param->p.pic_height_in_luma_samples; + dst_width = hevc->width; + dst_height = hevc->height; + + lcu_size = 1 << (param->p.log2_min_coding_block_size_minus3 + + 3 + param->p.log2_diff_max_min_coding_block_size); + + hevc->lcu_x_num = (hevc->width + lcu_size - 1) / lcu_size; + hevc->lcu_y_num = (hevc->height + lcu_size - 1) / lcu_size; + hevc->lcu_total = hevc->lcu_x_num * hevc->lcu_y_num; + + if (param->p.conformance_window_flag) { + u32 sub_width = 1, sub_height = 1; + + switch (param->p.chroma_format_idc) { + case 1: + sub_height = 2; + fallthrough; + case 2: + sub_width = 2; + break; + } + + dst_width -= sub_width * + (param->p.conf_win_left_offset + + param->p.conf_win_right_offset); + dst_height -= sub_height * + (param->p.conf_win_top_offset + + param->p.conf_win_bottom_offset); + } + + if (dst_width != hevc->dst_width || + dst_height != hevc->dst_height || + lcu_size != hevc->lcu_size || + is_10bit != hevc->is_10bit) + src_changed = 1; + + hevc->dst_width = dst_width; + hevc->dst_height = dst_height; + hevc->lcu_size = lcu_size; + hevc->is_10bit = is_10bit; + + return src_changed; +} + +/* + * The RPM section within the workspace contains + * many information regarding the parsed bitstream + */ +static void codec_hevc_fetch_rpm(struct amvdec_session *sess) +{ + struct codec_hevc *hevc = sess->priv; + u16 *rpm_vaddr = hevc->workspace_vaddr + RPM_OFFSET; + int i, j; + + for (i = 0; i < RPM_SIZE; i += 4) { + for (j = 0; j < 4; j++) + hevc->rpm_param.l.data[i + j] = + rpm_vaddr[i + 3 - j]; + } +} + +static void codec_hevc_resume(struct amvdec_session *sess) +{ + struct codec_hevc *hevc = sess->priv; + + if (codec_hevc_setup_buffers(sess, &hevc->common, hevc->is_10bit)) { + amvdec_abort(sess); + return; + } + + codec_hevc_setup_decode_head(sess, hevc->is_10bit); + codec_hevc_process_segment_header(sess); + if (codec_hevc_process_segment(sess)) + amvdec_abort(sess); +} + +static irqreturn_t codec_hevc_threaded_isr(struct amvdec_session *sess) +{ + struct amvdec_core *core = sess->core; + struct codec_hevc *hevc = sess->priv; + u32 dec_status = amvdec_read_dos(core, HEVC_DEC_STATUS_REG); + + if (!hevc) + return IRQ_HANDLED; + + mutex_lock(&hevc->lock); + if (dec_status != HEVC_SLICE_SEGMENT_DONE) { + dev_err(core->dev_dec, "Unrecognized dec_status: %08X\n", + dec_status); + amvdec_abort(sess); + goto unlock; + } + + sess->keyframe_found = 1; + codec_hevc_fetch_rpm(sess); + if (codec_hevc_process_rpm(hevc)) { + amvdec_src_change(sess, hevc->dst_width, hevc->dst_height, 16, + hevc->is_10bit ? 10 : 8); + goto unlock; + } + + codec_hevc_process_segment_header(sess); + if (codec_hevc_process_segment(sess)) + amvdec_abort(sess); + +unlock: + mutex_unlock(&hevc->lock); + return IRQ_HANDLED; +} + +static irqreturn_t codec_hevc_isr(struct amvdec_session *sess) +{ + return IRQ_WAKE_THREAD; +} + +struct amvdec_codec_ops codec_hevc_ops = { + .start = codec_hevc_start, + .stop = codec_hevc_stop, + .isr = codec_hevc_isr, + .threaded_isr = codec_hevc_threaded_isr, + .num_pending_bufs = codec_hevc_num_pending_bufs, + .drain = codec_hevc_flush_output, + .resume = codec_hevc_resume, +}; diff --git a/drivers/staging/media/meson/vdec/codec_hevc.h b/drivers/staging/media/meson/vdec/codec_hevc.h new file mode 100644 index 000000000000..f2f9b2464df1 --- /dev/null +++ b/drivers/staging/media/meson/vdec/codec_hevc.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (C) 2018 Maxime Jourdan <maxi.jourdan@wanadoo.fr> + */ + +#ifndef __MESON_VDEC_CODEC_HEVC_H_ +#define __MESON_VDEC_CODEC_HEVC_H_ + +#include "vdec.h" + +extern struct amvdec_codec_ops codec_hevc_ops; + +#endif diff --git a/drivers/staging/media/meson/vdec/esparser.c b/drivers/staging/media/meson/vdec/esparser.c index 3cd29ab4f979..6988348ce714 100644 --- a/drivers/staging/media/meson/vdec/esparser.c +++ b/drivers/staging/media/meson/vdec/esparser.c @@ -310,7 +310,8 @@ esparser_queue(struct amvdec_session *sess, struct vb2_v4l2_buffer *vbuf) * they could pause when there is no capture buffer available and * resume on this notification. */ - if (sess->fmt_out->pixfmt == V4L2_PIX_FMT_VP9) { + if (sess->fmt_out->pixfmt == V4L2_PIX_FMT_VP9 || + sess->fmt_out->pixfmt == V4L2_PIX_FMT_HEVC) { if (codec_ops->num_pending_bufs) num_dst_bufs = codec_ops->num_pending_bufs(sess); diff --git a/drivers/staging/media/meson/vdec/hevc_regs.h b/drivers/staging/media/meson/vdec/hevc_regs.h index 0392f41a1eed..e7eabdd2b119 100644 --- a/drivers/staging/media/meson/vdec/hevc_regs.h +++ b/drivers/staging/media/meson/vdec/hevc_regs.h @@ -205,6 +205,7 @@ #define HEVC_CM_HEADER_START_ADDR 0xd8a0 #define HEVC_CM_HEADER_LENGTH 0xd8a4 #define HEVC_CM_HEADER_OFFSET 0xd8ac +#define HEVC_SAO_CTRL9 0xd8b4 #define HEVC_SAO_MMU_VH0_ADDR 0xd8e8 #define HEVC_SAO_MMU_VH1_ADDR 0xd8ec diff --git a/drivers/staging/media/meson/vdec/vdec_platform.c b/drivers/staging/media/meson/vdec/vdec_platform.c index 88c9d72e1c83..ea2aa0e8cf0b 100644 --- a/drivers/staging/media/meson/vdec/vdec_platform.c +++ b/drivers/staging/media/meson/vdec/vdec_platform.c @@ -11,10 +11,23 @@ #include "vdec_hevc.h" #include "codec_mpeg12.h" #include "codec_h264.h" +#include "codec_hevc.h" #include "codec_vp9.h" static const struct amvdec_format vdec_formats_gxbb[] = { { + .pixfmt = V4L2_PIX_FMT_HEVC, + .min_buffers = 4, + .max_buffers = 24, + .max_width = 3840, + .max_height = 2160, + .vdec_ops = &vdec_hevc_ops, + .codec_ops = &codec_hevc_ops, + .firmware_path = "meson/vdec/gxl_hevc.bin", + .pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 }, + .flags = V4L2_FMT_FLAG_COMPRESSED | + V4L2_FMT_FLAG_DYN_RESOLUTION, + }, { .pixfmt = V4L2_PIX_FMT_H264, .min_buffers = 2, .max_buffers = 24, @@ -64,6 +77,18 @@ static const struct amvdec_format vdec_formats_gxl[] = { .pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 }, .flags = V4L2_FMT_FLAG_COMPRESSED | V4L2_FMT_FLAG_DYN_RESOLUTION, + }, { + .pixfmt = V4L2_PIX_FMT_HEVC, + .min_buffers = 4, + .max_buffers = 24, + .max_width = 3840, + .max_height = 2160, + .vdec_ops = &vdec_hevc_ops, + .codec_ops = &codec_hevc_ops, + .firmware_path = "meson/vdec/gxl_hevc.bin", + .pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 }, + .flags = V4L2_FMT_FLAG_COMPRESSED | + V4L2_FMT_FLAG_DYN_RESOLUTION, }, { .pixfmt = V4L2_PIX_FMT_H264, .min_buffers = 2, @@ -114,6 +139,18 @@ static const struct amvdec_format vdec_formats_gxm[] = { .pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 }, .flags = V4L2_FMT_FLAG_COMPRESSED | V4L2_FMT_FLAG_DYN_RESOLUTION, + }, { + .pixfmt = V4L2_PIX_FMT_HEVC, + .min_buffers = 4, + .max_buffers = 24, + .max_width = 3840, + .max_height = 2160, + .vdec_ops = &vdec_hevc_ops, + .codec_ops = &codec_hevc_ops, + .firmware_path = "meson/vdec/gxl_hevc.bin", + .pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 }, + .flags = V4L2_FMT_FLAG_COMPRESSED | + V4L2_FMT_FLAG_DYN_RESOLUTION, }, { .pixfmt = V4L2_PIX_FMT_H264, .min_buffers = 2, -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0061-FROMLIST-v2-dt-bindings-serial-amlogic-meson-uart-Ad.patch ================================================ From f9e1f4f9ae2a9390cc8bde8742f4454acc29ff0f Mon Sep 17 00:00:00 2001 From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Date: Wed, 22 Feb 2023 21:41:53 +0100 Subject: [PATCH 061/120] FROMLIST(v2): dt-bindings: serial: amlogic,meson-uart: Add compatible string for G12A Amlogic G12A SoCs gained a new "divide XTAL by 2" bit. Everything else (we know about) is identical to the UART IP on GX (GXBB/GXL/GXM) SoCs. Add a new compatible string for this SoC so this new bit can be managed accordingly while keeping "amlogic,meson-gx-uart" as fallback compatible string. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- .../bindings/serial/amlogic,meson-uart.yaml | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/Documentation/devicetree/bindings/serial/amlogic,meson-uart.yaml b/Documentation/devicetree/bindings/serial/amlogic,meson-uart.yaml index 7822705ad16c..644d52859497 100644 --- a/Documentation/devicetree/bindings/serial/amlogic,meson-uart.yaml +++ b/Documentation/devicetree/bindings/serial/amlogic,meson-uart.yaml @@ -23,21 +23,31 @@ properties: compatible: oneOf: - description: Always-on power domain UART controller - items: + oneOf: + - items: + - enum: + - amlogic,meson6-uart + - amlogic,meson8-uart + - amlogic,meson8b-uart + - amlogic,meson-gx-uart + - amlogic,meson-s4-uart + - const: amlogic,meson-ao-uart + - items: + - const: amlogic,meson-g12a-uart + - const: amlogic,meson-gx-uart + - const: amlogic,meson-ao-uart + - description: Everything-Else power domain UART controller + oneOf: - enum: - amlogic,meson6-uart - amlogic,meson8-uart - amlogic,meson8b-uart - amlogic,meson-gx-uart + - amlogic,meson-g12a-uart - amlogic,meson-s4-uart - - const: amlogic,meson-ao-uart - - description: Everything-Else power domain UART controller - enum: - - amlogic,meson6-uart - - amlogic,meson8-uart - - amlogic,meson8b-uart - - amlogic,meson-gx-uart - - amlogic,meson-s4-uart + - items: + - const: amlogic,meson-g12a-uart + - const: amlogic,meson-gx-uart reg: maxItems: 1 -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0062-FROMLIST-v2-tty-serial-meson-Add-a-new-compatible-st.patch ================================================ From 6784e19cbe62900c5524fe8e2b5b6216f7fb2ae5 Mon Sep 17 00:00:00 2001 From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Date: Wed, 22 Feb 2023 21:44:16 +0100 Subject: [PATCH 062/120] FROMLIST(v2): tty: serial: meson: Add a new compatible string for the G12A SoC Amlogic Meson G12A (and later) SoCs also have the "divide XTAL by 2" bit as the S4 UART controllers. Add a new compatible string for these SoCs and enable the has_xtal_div2 flag for them. Tested-by: Christian Hewitt <christianshewitt@gmail.com> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- drivers/tty/serial/meson_uart.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serial/meson_uart.c b/drivers/tty/serial/meson_uart.c index 056243c12836..931965d2fecc 100644 --- a/drivers/tty/serial/meson_uart.c +++ b/drivers/tty/serial/meson_uart.c @@ -780,7 +780,7 @@ static int meson_uart_remove(struct platform_device *pdev) return 0; } -static struct meson_uart_data s4_uart_data = { +static struct meson_uart_data meson_g12a_uart_data = { .has_xtal_div2 = true, }; @@ -789,9 +789,13 @@ static const struct of_device_id meson_uart_dt_match[] = { { .compatible = "amlogic,meson8-uart" }, { .compatible = "amlogic,meson8b-uart" }, { .compatible = "amlogic,meson-gx-uart" }, + { + .compatible = "amlogic,meson-g12a-uart", + .data = (void *)&meson_g12a_uart_data, + }, { .compatible = "amlogic,meson-s4-uart", - .data = (void *)&s4_uart_data, + .data = (void *)&meson_g12a_uart_data, }, { /* sentinel */ }, }; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0063-FROMLIST-v2-arm64-dts-meson-g12-common-Use-the-G12A-.patch ================================================ From 9bf0bf029cc3ddea57cab66ea49db0d69048ee99 Mon Sep 17 00:00:00 2001 From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Date: Wed, 22 Feb 2023 21:47:16 +0100 Subject: [PATCH 063/120] FROMLIST(v2): arm64: dts: meson-g12-common: Use the G12A UART compatible string Switch meson-12-common.dtsi to use the Meson G12A specific UART compatible string. This enables the "divide XTAL by 2" divider which improves support for UART attached Bluetooth modules (for example RTL8822CS) running at a baud rate of 1500000. Without dividing XTAL (24MHz) by 2 a baud rate of 1500000 cannot be generated cleanly and the resulting jitter breaks communication with the module. Tested-by: Christian Hewitt <christianshewitt@gmail.com> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi index bb2e86073261..ec78283d9a9e 100644 --- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi @@ -2040,7 +2040,8 @@ pwm_AO_cd: pwm@2000 { }; uart_AO: serial@3000 { - compatible = "amlogic,meson-gx-uart", + compatible = "amlogic,meson-g12a-uart", + "amlogic,meson-gx-uart", "amlogic,meson-ao-uart"; reg = <0x0 0x3000 0x0 0x18>; interrupts = <GIC_SPI 193 IRQ_TYPE_EDGE_RISING>; @@ -2050,7 +2051,8 @@ uart_AO: serial@3000 { }; uart_AO_B: serial@4000 { - compatible = "amlogic,meson-gx-uart", + compatible = "amlogic,meson-g12a-uart", + "amlogic,meson-gx-uart", "amlogic,meson-ao-uart"; reg = <0x0 0x4000 0x0 0x18>; interrupts = <GIC_SPI 197 IRQ_TYPE_EDGE_RISING>; @@ -2287,7 +2289,8 @@ clk_msr: clock-measure@18000 { }; uart_C: serial@22000 { - compatible = "amlogic,meson-gx-uart"; + compatible = "amlogic,meson-g12a-uart", + "amlogic,meson-gx-uart"; reg = <0x0 0x22000 0x0 0x18>; interrupts = <GIC_SPI 93 IRQ_TYPE_EDGE_RISING>; clocks = <&xtal>, <&clkc CLKID_UART2>, <&xtal>; @@ -2296,7 +2299,8 @@ uart_C: serial@22000 { }; uart_B: serial@23000 { - compatible = "amlogic,meson-gx-uart"; + compatible = "amlogic,meson-g12a-uart", + "amlogic,meson-gx-uart"; reg = <0x0 0x23000 0x0 0x18>; interrupts = <GIC_SPI 75 IRQ_TYPE_EDGE_RISING>; clocks = <&xtal>, <&clkc CLKID_UART1>, <&xtal>; @@ -2305,7 +2309,8 @@ uart_B: serial@23000 { }; uart_A: serial@24000 { - compatible = "amlogic,meson-gx-uart"; + compatible = "amlogic,meson-g12a-uart", + "amlogic,meson-gx-uart"; reg = <0x0 0x24000 0x0 0x18>; interrupts = <GIC_SPI 26 IRQ_TYPE_EDGE_RISING>; clocks = <&xtal>, <&clkc CLKID_UART0>, <&xtal>; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0064-WIP-media-meson-vdec-disable-MPEG1-MPEG2-hardware-de.patch ================================================ From 866fcbd4b9f8e1f3502ab857a23a7a19f2d0ba9e Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Thu, 5 Jan 2023 15:16:46 +0000 Subject: [PATCH 064/120] WIP: media: meson: vdec: disable MPEG1/MPEG2 hardware decoding The MPEG1/2 decoder is broken and nobody has volunteered to poke code and fix it. As media is almost never over 1080p resolution boards should be able to software decode it. So lets just disable hardware decoding for now. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../staging/media/meson/vdec/vdec_platform.c | 110 ------------------ 1 file changed, 110 deletions(-) diff --git a/drivers/staging/media/meson/vdec/vdec_platform.c b/drivers/staging/media/meson/vdec/vdec_platform.c index ea2aa0e8cf0b..1c0d188929dc 100644 --- a/drivers/staging/media/meson/vdec/vdec_platform.c +++ b/drivers/staging/media/meson/vdec/vdec_platform.c @@ -39,28 +39,6 @@ static const struct amvdec_format vdec_formats_gxbb[] = { .pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 }, .flags = V4L2_FMT_FLAG_COMPRESSED | V4L2_FMT_FLAG_DYN_RESOLUTION, - }, { - .pixfmt = V4L2_PIX_FMT_MPEG1, - .min_buffers = 8, - .max_buffers = 8, - .max_width = 1920, - .max_height = 1080, - .vdec_ops = &vdec_1_ops, - .codec_ops = &codec_mpeg12_ops, - .firmware_path = "meson/vdec/gxl_mpeg12.bin", - .pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 }, - .flags = V4L2_FMT_FLAG_COMPRESSED, - }, { - .pixfmt = V4L2_PIX_FMT_MPEG2, - .min_buffers = 8, - .max_buffers = 8, - .max_width = 1920, - .max_height = 1080, - .vdec_ops = &vdec_1_ops, - .codec_ops = &codec_mpeg12_ops, - .firmware_path = "meson/vdec/gxl_mpeg12.bin", - .pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 }, - .flags = V4L2_FMT_FLAG_COMPRESSED, }, }; @@ -101,28 +79,6 @@ static const struct amvdec_format vdec_formats_gxl[] = { .pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 }, .flags = V4L2_FMT_FLAG_COMPRESSED | V4L2_FMT_FLAG_DYN_RESOLUTION, - }, { - .pixfmt = V4L2_PIX_FMT_MPEG1, - .min_buffers = 8, - .max_buffers = 8, - .max_width = 1920, - .max_height = 1080, - .vdec_ops = &vdec_1_ops, - .codec_ops = &codec_mpeg12_ops, - .firmware_path = "meson/vdec/gxl_mpeg12.bin", - .pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 }, - .flags = V4L2_FMT_FLAG_COMPRESSED, - }, { - .pixfmt = V4L2_PIX_FMT_MPEG2, - .min_buffers = 8, - .max_buffers = 8, - .max_width = 1920, - .max_height = 1080, - .vdec_ops = &vdec_1_ops, - .codec_ops = &codec_mpeg12_ops, - .firmware_path = "meson/vdec/gxl_mpeg12.bin", - .pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 }, - .flags = V4L2_FMT_FLAG_COMPRESSED, }, }; @@ -163,28 +119,6 @@ static const struct amvdec_format vdec_formats_gxm[] = { .pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 }, .flags = V4L2_FMT_FLAG_COMPRESSED | V4L2_FMT_FLAG_DYN_RESOLUTION, - }, { - .pixfmt = V4L2_PIX_FMT_MPEG1, - .min_buffers = 8, - .max_buffers = 8, - .max_width = 1920, - .max_height = 1080, - .vdec_ops = &vdec_1_ops, - .codec_ops = &codec_mpeg12_ops, - .firmware_path = "meson/vdec/gxl_mpeg12.bin", - .pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 }, - .flags = V4L2_FMT_FLAG_COMPRESSED, - }, { - .pixfmt = V4L2_PIX_FMT_MPEG2, - .min_buffers = 8, - .max_buffers = 8, - .max_width = 1920, - .max_height = 1080, - .vdec_ops = &vdec_1_ops, - .codec_ops = &codec_mpeg12_ops, - .firmware_path = "meson/vdec/gxl_mpeg12.bin", - .pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 }, - .flags = V4L2_FMT_FLAG_COMPRESSED, }, }; @@ -213,28 +147,6 @@ static const struct amvdec_format vdec_formats_g12a[] = { .pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 }, .flags = V4L2_FMT_FLAG_COMPRESSED | V4L2_FMT_FLAG_DYN_RESOLUTION, - }, { - .pixfmt = V4L2_PIX_FMT_MPEG1, - .min_buffers = 8, - .max_buffers = 8, - .max_width = 1920, - .max_height = 1080, - .vdec_ops = &vdec_1_ops, - .codec_ops = &codec_mpeg12_ops, - .firmware_path = "meson/vdec/gxl_mpeg12.bin", - .pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 }, - .flags = V4L2_FMT_FLAG_COMPRESSED, - }, { - .pixfmt = V4L2_PIX_FMT_MPEG2, - .min_buffers = 8, - .max_buffers = 8, - .max_width = 1920, - .max_height = 1080, - .vdec_ops = &vdec_1_ops, - .codec_ops = &codec_mpeg12_ops, - .firmware_path = "meson/vdec/gxl_mpeg12.bin", - .pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 }, - .flags = V4L2_FMT_FLAG_COMPRESSED, }, }; @@ -263,28 +175,6 @@ static const struct amvdec_format vdec_formats_sm1[] = { .pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 }, .flags = V4L2_FMT_FLAG_COMPRESSED | V4L2_FMT_FLAG_DYN_RESOLUTION, - }, { - .pixfmt = V4L2_PIX_FMT_MPEG1, - .min_buffers = 8, - .max_buffers = 8, - .max_width = 1920, - .max_height = 1080, - .vdec_ops = &vdec_1_ops, - .codec_ops = &codec_mpeg12_ops, - .firmware_path = "meson/vdec/gxl_mpeg12.bin", - .pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 }, - .flags = V4L2_FMT_FLAG_COMPRESSED, - }, { - .pixfmt = V4L2_PIX_FMT_MPEG2, - .min_buffers = 8, - .max_buffers = 8, - .max_width = 1920, - .max_height = 1080, - .vdec_ops = &vdec_1_ops, - .codec_ops = &codec_mpeg12_ops, - .firmware_path = "meson/vdec/gxl_mpeg12.bin", - .pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 }, - .flags = V4L2_FMT_FLAG_COMPRESSED, }, }; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0065-WIP-arm64-dts-meson-set-p212-p23x-q20x-SDIO-to-100MH.patch ================================================ From 705f27c026178c3cc9af1142fcbea2f686e034a5 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Tue, 18 Jan 2022 15:09:12 +0000 Subject: [PATCH 065/120] WIP: arm64: dts: meson: set p212/p23x/q20x SDIO to 100MHz Amlogic datasheets describe 50MHz max-frequency for SDIO on GXL/GXM but real-world tests on an assortment of GXL and GXM boards show noteable increases in throughput when max-frequency is 100MHz, so let's use it. Before results from a p231 device: Connecting to host 192.168.0.1, port 5201 Reverse mode, remote host 192.168.0.1 is sending [ 5] local 192.168.0.41 port 42550 connected to 192.168.0.1 port 5201 [ ID] Interval Transfer Bitrate [ 5] 0.00-1.00 sec 8.84 MBytes 74.2 Mbits/sec [ 5] 1.00-2.00 sec 9.60 MBytes 80.5 Mbits/sec [ 5] 2.00-3.00 sec 9.07 MBytes 76.1 Mbits/sec [ 5] 3.00-4.00 sec 9.14 MBytes 76.6 Mbits/sec [ 5] 4.00-5.00 sec 9.26 MBytes 77.7 Mbits/sec [ 5] 5.00-6.00 sec 9.08 MBytes 76.2 Mbits/sec [ 5] 6.00-7.00 sec 9.11 MBytes 76.4 Mbits/sec [ 5] 7.00-8.00 sec 8.65 MBytes 72.5 Mbits/sec [ 5] 8.00-9.00 sec 9.24 MBytes 77.5 Mbits/sec [ 5] 9.00-10.00 sec 8.57 MBytes 71.9 Mbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-10.27 sec 94.1 MBytes 76.8 Mbits/sec 0 sender [ 5] 0.00-10.00 sec 90.6 MBytes 76.0 Mbits/sec receiver clock: 50000000 Hz actual clock: 50000000 Hz vdd: 21 (3.3 ~ 3.4 V) bus mode: 2 (push-pull) chip select: 0 (don't care) power mode: 2 (on) bus width: 2 (4 bits) timing spec: 2 (sd high-speed) signal voltage: 1 (1.80 V) driver type: 0 (driver type B) After results from a p231 device: Connecting to host 192.168.0.1, port 5201 Reverse mode, remote host 192.168.0.1 is sending [ 5] local 192.168.0.41 port 58534 connected to 192.168.0.1 port 5201 [ ID] Interval Transfer Bitrate [ 5] 0.00-1.00 sec 12.6 MBytes 106 Mbits/sec [ 5] 1.00-2.00 sec 13.0 MBytes 109 Mbits/sec [ 5] 2.00-3.00 sec 12.8 MBytes 107 Mbits/sec [ 5] 3.00-4.00 sec 13.2 MBytes 111 Mbits/sec [ 5] 4.00-5.00 sec 12.4 MBytes 104 Mbits/sec [ 5] 5.00-6.00 sec 11.2 MBytes 93.9 Mbits/sec [ 5] 6.00-7.00 sec 12.3 MBytes 103 Mbits/sec [ 5] 7.00-8.00 sec 12.3 MBytes 103 Mbits/sec [ 5] 8.00-9.00 sec 12.5 MBytes 105 Mbits/sec [ 5] 9.00-10.00 sec 12.3 MBytes 103 Mbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-10.22 sec 127 MBytes 104 Mbits/sec 0 sender [ 5] 0.00-10.00 sec 125 MBytes 105 Mbits/sec receiver clock: 100000000 Hz actual clock: 100000000 Hz vdd: 21 (3.3 ~ 3.4 V) bus mode: 2 (push-pull) chip select: 0 (don't care) power mode: 2 (on) bus width: 2 (4 bits) timing spec: 6 (sd uhs SDR104) signal voltage: 1 (1.80 V) driver type: 0 (driver type B) Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi | 2 +- arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi index dafc841f7c16..8d315508360d 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi @@ -259,7 +259,7 @@ &sd_emmc_a { bus-width = <4>; cap-sd-highspeed; - max-frequency = <50000000>; + max-frequency = <100000000>; non-removable; disable-wp; diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi index a150cc0e18ff..b3d7b8613d6d 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi @@ -121,7 +121,7 @@ &sd_emmc_a { bus-width = <4>; cap-sd-highspeed; - max-frequency = <50000000>; + max-frequency = <100000000>; non-removable; disable-wp; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0066-WIP-arm64-dts-meson-add-UHS-SDIO-capabilities-to-p21.patch ================================================ From fb0a50ba250cb8b6c328e32b5132f29a7ada0488 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 19 Jan 2022 06:45:06 +0000 Subject: [PATCH 066/120] WIP: arm64: dts: meson: add UHS SDIO capabilities to p212/p23x/q20x Add UHS capabilities to the SDIO node to enable 100MHz speeds. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi | 4 ++++ arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi index 8d315508360d..b0d008fc5f7a 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi @@ -259,6 +259,10 @@ &sd_emmc_a { bus-width = <4>; cap-sd-highspeed; + sd-uhs-sdr12; + sd-uhs-sdr25; + sd-uhs-sdr50; + sd-uhs-sdr104; max-frequency = <100000000>; non-removable; diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi index b3d7b8613d6d..6eec4e81592b 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi @@ -121,6 +121,10 @@ &sd_emmc_a { bus-width = <4>; cap-sd-highspeed; + sd-uhs-sdr12; + sd-uhs-sdr25; + sd-uhs-sdr50; + sd-uhs-sdr104; max-frequency = <100000000>; non-removable; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0067-WIP-arm64-dts-meson-remove-SDIO-node-from-Khadas-VIM.patch ================================================ From dac1058a8890451e943cd3dd82a04b23436928b2 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Tue, 18 Jan 2022 15:18:32 +0000 Subject: [PATCH 067/120] WIP: arm64: dts: meson: remove SDIO node from Khadas VIM1 Now that SDIO 100MHz max-frequency is inherited from the p212 dtsi we can drop the node from the board dts. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts index 5ed1e9313003..fb0dd920882f 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts @@ -219,10 +219,6 @@ &pwm_ef { pinctrl-0 = <&pwm_e_pins>, <&pwm_f_clk_pins>; }; -&sd_emmc_a { - max-frequency = <100000000>; -}; - /* This is brought out on the Linux_RX (18) and Linux_TX (19) pins: */ &uart_AO { status = "okay"; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0068-WIP-arm64-dts-meson-add-audio-playback-to-p201.patch ================================================ From 8aadc1cc8f6f3ff75b071c935e2f885fd735ba81 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Fri, 15 May 2020 07:52:47 +0000 Subject: [PATCH 068/120] WIP: arm64: dts: meson: add audio playback to p201 Add initial audio support limited to HDMI i2s. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../boot/dts/amlogic/meson-gxbb-p201.dts | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-p201.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-p201.dts index 150a82f3b2d7..22bd0070146b 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb-p201.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-p201.dts @@ -8,10 +8,50 @@ /dts-v1/; #include "meson-gxbb-p20x.dtsi" +#include <dt-bindings/sound/meson-aiu.h> / { compatible = "amlogic,p201", "amlogic,meson-gxbb"; model = "Amlogic Meson GXBB P201 Development Board"; + + sound { + compatible = "amlogic,gx-sound-card"; + model = "P201"; + assigned-clocks = <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>, + <&clkc CLKID_MPLL2>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&aiu AIU_CPU CPU_I2S_FIFO>; + }; + + dai-link-1 { + sound-dai = <&aiu AIU_CPU CPU_I2S_ENCODER>; + dai-format = "i2s"; + mclk-fs = <256>; + + codec-0 { + sound-dai = <&aiu AIU_HDMI CTRL_I2S>; + }; + }; + + dai-link-2 { + sound-dai = <&aiu AIU_HDMI CTRL_OUT>; + + codec-0 { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&aiu { + status = "okay"; }; ðmac { -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0069-WIP-arm64-dts-meson-add-audio-playback-to-p200.patch ================================================ From a44b679ac6004a5a9a3c28ed744e597df0c840b5 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Fri, 15 May 2020 07:56:15 +0000 Subject: [PATCH 069/120] WIP: arm64: dts: meson: add audio playback to p200 Add initial support limited to HDMI i2s and SPDIF (LPCM). Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../boot/dts/amlogic/meson-gxbb-p200.dts | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-p200.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-p200.dts index 3c93d1898b40..27b3ab20f070 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb-p200.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-p200.dts @@ -9,11 +9,19 @@ #include "meson-gxbb-p20x.dtsi" #include <dt-bindings/input/input.h> +#include <dt-bindings/sound/meson-aiu.h> / { compatible = "amlogic,p200", "amlogic,meson-gxbb"; model = "Amlogic Meson GXBB P200 Development Board"; + spdif_dit: audio-codec-0 { + #sound-dai-cells = <0>; + compatible = "linux,spdif-dit"; + status = "okay"; + sound-name-prefix = "DIT"; + }; + avdd18_usb_adc: regulator-avdd18_usb_adc { compatible = "regulator-fixed"; regulator-name = "AVDD18_USB_ADC"; @@ -57,6 +65,59 @@ button-menu { press-threshold-microvolt = <0>; /* 0% */ }; }; + + sound { + compatible = "amlogic,gx-sound-card"; + model = "P200"; + assigned-clocks = <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>, + <&clkc CLKID_MPLL2>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&aiu AIU_CPU CPU_I2S_FIFO>; + }; + + dai-link-1 { + sound-dai = <&aiu AIU_CPU CPU_SPDIF_FIFO>; + }; + + dai-link-2 { + sound-dai = <&aiu AIU_CPU CPU_I2S_ENCODER>; + dai-format = "i2s"; + mclk-fs = <256>; + + codec-0 { + sound-dai = <&aiu AIU_HDMI CTRL_I2S>; + }; + }; + + dai-link-3 { + sound-dai = <&aiu AIU_CPU CPU_SPDIF_ENCODER>; + + codec-0 { + sound-dai = <&spdif_dit>; + }; + }; + + dai-link-4 { + sound-dai = <&aiu AIU_HDMI CTRL_OUT>; + + codec-0 { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&aiu { + status = "okay"; + pinctrl-0 = <&spdif_out_y_pins>; + pinctrl-names = "default"; }; ðmac { -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0070-WIP-arm64-dts-meson-add-audio-playback-to-u200.patch ================================================ From 76dfcdd0088bbc374551c52759be7223f8752074 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sun, 17 May 2020 05:00:55 +0000 Subject: [PATCH 070/120] WIP: arm64: dts: meson: add audio playback to u200 Add initial support limited to HDMI i2s and SPDIF (LPCM). Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../boot/dts/amlogic/meson-g12a-u200.dts | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts index 4b5d11e56364..61a85c27a463 100644 --- a/arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts +++ b/arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts @@ -8,6 +8,7 @@ #include "meson-g12a.dtsi" #include <dt-bindings/gpio/gpio.h> #include <dt-bindings/gpio/meson-g12a-gpio.h> +#include <dt-bindings/sound/meson-g12a-tohdmitx.h> / { compatible = "amlogic,u200", "amlogic,g12a"; @@ -18,6 +19,13 @@ aliases { ethernet0 = ðmac; }; + spdif_dit: audio-codec-1 { + #sound-dai-cells = <0>; + compatible = "linux,spdif-dit"; + status = "okay"; + sound-name-prefix = "DIT"; + }; + chosen { stdout-path = "serial0:115200n8"; }; @@ -147,6 +155,90 @@ vddcpu: regulator-vddcpu { regulator-boot-on; regulator-always-on; }; + + sound { + compatible = "amlogic,axg-sound-card"; + model = "U200"; + audio-aux-devs = <&tdmout_b>; + audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1", + "TDMOUT_B IN 1", "FRDDR_B OUT 1", + "TDMOUT_B IN 2", "FRDDR_C OUT 1", + "TDM_B Playback", "TDMOUT_B OUT", + "SPDIFOUT IN 0", "FRDDR_A OUT 3", + "SPDIFOUT IN 1", "FRDDR_B OUT 3", + "SPDIFOUT IN 2", "FRDDR_C OUT 3"; + + assigned-clocks = <&clkc CLKID_MPLL2>, + <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&frddr_a>; + }; + + dai-link-1 { + sound-dai = <&frddr_b>; + }; + + dai-link-2 { + sound-dai = <&frddr_c>; + }; + + /* 8ch hdmi interface */ + dai-link-3 { + sound-dai = <&tdmif_b>; + dai-format = "i2s"; + dai-tdm-slot-tx-mask-0 = <1 1>; + dai-tdm-slot-tx-mask-1 = <1 1>; + dai-tdm-slot-tx-mask-2 = <1 1>; + dai-tdm-slot-tx-mask-3 = <1 1>; + mclk-fs = <256>; + + codec { + sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>; + }; + }; + + /* spdif hdmi or toslink interface */ + dai-link-4 { + sound-dai = <&spdifout>; + + codec-0 { + sound-dai = <&spdif_dit>; + }; + + codec-1 { + sound-dai = <&tohdmitx TOHDMITX_SPDIF_IN_A>; + }; + }; + + /* spdif hdmi interface */ + dai-link-5 { + sound-dai = <&spdifout_b>; + + codec { + sound-dai = <&tohdmitx TOHDMITX_SPDIF_IN_B>; + }; + }; + + /* hdmi glue */ + dai-link-6 { + sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>; + + codec { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&arb { + status = "okay"; }; &cec_AO { @@ -163,6 +255,10 @@ &cecb_AO { hdmi-phandle = <&hdmi_tx>; }; +&clkc_audio { + status = "okay"; +}; + &cpu0 { cpu-supply = <&vddcpu>; operating-points-v2 = <&cpu_opp_table>; @@ -203,6 +299,18 @@ ðmac { phy-mode = "rmii"; }; +&frddr_a { + status = "okay"; +}; + +&frddr_b { + status = "okay"; +}; + +&frddr_c { + status = "okay"; +}; + &hdmi_tx { status = "okay"; pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>; @@ -288,6 +396,28 @@ &sd_emmc_c { vqmmc-supply = <&flash_1v8>; }; +&spdifout { + pinctrl-0 = <&spdif_out_h_pins>; + pinctrl-names = "default"; + status = "okay"; +}; + +&spdifout_b { + status = "okay"; +}; + +&tdmif_b { + status = "okay"; +}; + +&tdmout_b { + status = "okay"; +}; + +&tohdmitx { + status = "okay"; +}; + &uart_AO { status = "okay"; pinctrl-0 = <&uart_ao_a_pins>; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0071-WIP-arm64-dts-meson-add-Headphone-output-to-Beelink-.patch ================================================ From c60ca77b02dd6904ffbd5418138a5880a822b460 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 27 Nov 2021 13:50:06 +0000 Subject: [PATCH 071/120] WIP: arm64: dts: meson: add Headphone output to Beelink GT-King Add support for the Headphone audio DAC built-in to the S922X chip. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../boot/dts/amlogic/meson-g12b-gtking.dts | 120 +++++++++++++++++- 1 file changed, 113 insertions(+), 7 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-gtking.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-gtking.dts index 5d96c1449050..a441975cbfb0 100644 --- a/arch/arm64/boot/dts/amlogic/meson-g12b-gtking.dts +++ b/arch/arm64/boot/dts/amlogic/meson-g12b-gtking.dts @@ -8,6 +8,7 @@ /dts-v1/; #include "meson-g12b-w400.dtsi" +#include <dt-bindings/sound/meson-g12a-toacodec.h> #include <dt-bindings/sound/meson-g12a-tohdmitx.h> / { @@ -29,14 +30,37 @@ spdif_dit: audio-codec-1 { sound { compatible = "amlogic,axg-sound-card"; model = "GTKING"; - audio-aux-devs = <&tdmout_b>; + audio-widgets = "Line", "Lineout"; + audio-aux-devs = <&tdmout_b>, <&tdmout_c>, + <&tdmin_a>, <&tdmin_b>, <&tdmin_c>; audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1", "TDMOUT_B IN 1", "FRDDR_B OUT 1", "TDMOUT_B IN 2", "FRDDR_C OUT 1", "TDM_B Playback", "TDMOUT_B OUT", + "TDMOUT_C IN 0", "FRDDR_A OUT 2", + "TDMOUT_C IN 1", "FRDDR_B OUT 2", + "TDMOUT_C IN 2", "FRDDR_C OUT 2", + "TDM_C Playback", "TDMOUT_C OUT", + "TDMIN_A IN 4", "TDM_B Loopback", + "TDMIN_B IN 4", "TDM_B Loopback", + "TDMIN_C IN 4", "TDM_B Loopback", + "TDMIN_A IN 5", "TDM_C Loopback", + "TDMIN_B IN 5", "TDM_C Loopback", + "TDMIN_C IN 5", "TDM_C Loopback", + "TODDR_A IN 0", "TDMIN_A OUT", + "TODDR_B IN 0", "TDMIN_A OUT", + "TODDR_C IN 0", "TDMIN_A OUT", + "TODDR_A IN 1", "TDMIN_B OUT", + "TODDR_B IN 1", "TDMIN_B OUT", + "TODDR_C IN 1", "TDMIN_B OUT", + "TODDR_A IN 2", "TDMIN_C OUT", + "TODDR_B IN 2", "TDMIN_C OUT", + "TODDR_C IN 2", "TDMIN_C OUT", "SPDIFOUT IN 0", "FRDDR_A OUT 3", "SPDIFOUT IN 1", "FRDDR_B OUT 3", - "SPDIFOUT IN 2", "FRDDR_C OUT 3"; + "SPDIFOUT IN 2", "FRDDR_C OUT 3", + "Lineout", "ACODEC LOLP", + "Lineout", "ACODEC LORP"; assigned-clocks = <&clkc CLKID_MPLL2>, <&clkc CLKID_MPLL0>, @@ -59,8 +83,20 @@ dai-link-2 { sound-dai = <&frddr_c>; }; - /* 8ch hdmi interface */ dai-link-3 { + sound-dai = <&toddr_a>; + }; + + dai-link-4 { + sound-dai = <&toddr_b>; + }; + + dai-link-5 { + sound-dai = <&toddr_c>; + }; + + /* 8ch hdmi interface */ + dai-link-6 { sound-dai = <&tdmif_b>; dai-format = "i2s"; dai-tdm-slot-tx-mask-0 = <1 1>; @@ -69,13 +105,17 @@ dai-link-3 { dai-tdm-slot-tx-mask-3 = <1 1>; mclk-fs = <256>; - codec { + codec-0 { sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>; }; + + codec-1 { + sound-dai = <&toacodec TOACODEC_IN_B>; + }; }; /* spdif hdmi or toslink interface */ - dai-link-4 { + dai-link-7 { sound-dai = <&spdifout>; codec-0 { @@ -88,7 +128,7 @@ codec-1 { }; /* spdif hdmi interface */ - dai-link-5 { + dai-link-8 { sound-dai = <&spdifout_b>; codec { @@ -96,17 +136,47 @@ codec { }; }; + /* i2s jack output interface */ + dai-link-9 { + sound-dai = <&tdmif_c>; + dai-format = "i2s"; + dai-tdm-slot-tx-mask-0 = <1 1>; + mclk-fs = <256>; + + codec-0 { + sound-dai = <&tohdmitx TOHDMITX_I2S_IN_C>; + }; + + codec-1 { + sound-dai = <&toacodec TOACODEC_IN_C>; + }; + }; + /* hdmi glue */ - dai-link-6 { + dai-link-10 { sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>; codec { sound-dai = <&hdmi_tx>; }; }; + + /* acodec glue */ + dai-link-11 { + sound-dai = <&toacodec TOACODEC_OUT>; + + codec { + sound-dai = <&acodec>; + }; + }; }; }; +&acodec { + AVDD-supply = <&vddao_1v8>; + status = "okay"; +}; + &arb { status = "okay"; }; @@ -154,10 +224,46 @@ &tdmif_b { status = "okay"; }; +&tdmif_c { + status = "okay"; +}; + +&tdmin_a { + status = "okay"; +}; + +&tdmin_b { + status = "okay"; +}; + +&tdmin_c { + status = "okay"; +}; + &tdmout_b { status = "okay"; }; +&tdmout_c { + status = "okay"; +}; + +&toacodec { + status = "okay"; +}; + +&toddr_a { + status = "okay"; +}; + +&toddr_b { + status = "okay"; +}; + +&toddr_c { + status = "okay"; +}; + &tohdmitx { status = "okay"; }; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0072-WIP-dt-bindings-arm-amlogic-add-support-for-the-Tani.patch ================================================ From d7ec2bf4d082d383dd2f3a77cbf46bb10261ea59 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 29 Feb 2020 15:13:02 +0000 Subject: [PATCH 072/120] WIP: dt-bindings: arm: amlogic: add support for the Tanix TX5 Max The Oranth (Tanix) TX5 Max is based on the Amlogic U200 reference board with an S905X2 chip. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/arm/amlogic.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml index 94f68e7c85ed..845a5eb56ff3 100644 --- a/Documentation/devicetree/bindings/arm/amlogic.yaml +++ b/Documentation/devicetree/bindings/arm/amlogic.yaml @@ -146,6 +146,7 @@ properties: - enum: - amediatech,x96-max - amlogic,u200 + - oranth,tx5-max - radxa,zero - seirobotics,sei510 - const: amlogic,g12a -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0073-WIP-arm64-dts-meson-add-support-for-the-Tanix-TX5-Ma.patch ================================================ From e842f0a1b8d3454ac9a166c992986fe9bc5af99f Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sun, 20 Oct 2019 04:06:59 +0000 Subject: [PATCH 073/120] WIP: arm64: dts: meson: add support for the Tanix TX5 Max The Tanix TX5 Max is based on the Amlogic U200 reference design using the S905X2 chipset. Hardware specification: - 4GB LPDDR4 RAM - 32GB eMMC storage - 10/100/1000 Base-T Ethernet using External RGMII PHY - 802.11 a/b/g/b/ac + BT 4.1 sdio wireless - HDMI 2.0 (4k@60p) video - Composite video + 2-channel audio output on 3.5mm jack - S/PDIF audio output - 1x USB 3.0 - 1x USB 2.0 - 1x micro SD card slot Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/Makefile | 1 + .../dts/amlogic/meson-g12a-tanix-tx5max.dts | 481 ++++++++++++++++++ 2 files changed, 482 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-g12a-tanix-tx5max.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index f5845e565efb..5897fd0f594b 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -6,6 +6,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-axg-jethome-jethub-j110-rev-3.dtb dtb-$(CONFIG_ARCH_MESON) += meson-axg-s400.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12a-radxa-zero.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12a-sei510.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-g12a-tanix-tx5max.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12a-u200.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12a-x96-max.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-a311d-khadas-vim3.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a-tanix-tx5max.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-tanix-tx5max.dts new file mode 100644 index 000000000000..0e55427ca398 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-g12a-tanix-tx5max.dts @@ -0,0 +1,481 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2018 BayLibre SAS. All rights reserved. + */ + +/dts-v1/; + +#include "meson-g12a.dtsi" +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/gpio/meson-g12a-gpio.h> +#include <dt-bindings/sound/meson-g12a-tohdmitx.h> + +/ { + compatible = "oranth,tx5-max", "amlogic,g12a"; + model = "Tanix TX5 Max"; + + aliases { + serial0 = &uart_AO; + ethernet0 = ðmac; + }; + + spdif_dit: audio-codec-1 { + #sound-dai-cells = <0>; + compatible = "linux,spdif-dit"; + status = "okay"; + sound-name-prefix = "DIT"; + }; + + chosen { + stdout-path = "serial0:115200n8"; + }; + memory@0 { + device_type = "memory"; + reg = <0x0 0x0 0x0 0x40000000>; + }; + + cvbs-connector { + compatible = "composite-video-connector"; + + port { + cvbs_connector_in: endpoint { + remote-endpoint = <&cvbs_vdac_out>; + }; + }; + }; + + hdmi-connector { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_connector_in: endpoint { + remote-endpoint = <&hdmi_tx_tmds_out>; + }; + }; + }; + + emmc_pwrseq: emmc-pwrseq { + compatible = "mmc-pwrseq-emmc"; + reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>; + }; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; + clocks = <&wifi32k>; + clock-names = "ext_clock"; + }; + + flash_1v8: regulator-flash_1v8 { + compatible = "regulator-fixed"; + regulator-name = "FLASH_1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc_3v3>; + regulator-always-on; + }; + + dc_in: regulator-dc_in { + compatible = "regulator-fixed"; + regulator-name = "DC_IN"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + regulator-always-on; + }; + + vcc_1v8: regulator-vcc_1v8 { + compatible = "regulator-fixed"; + regulator-name = "VCC_1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc_3v3>; + regulator-always-on; + }; + + vcc_3v3: regulator-vcc_3v3 { + compatible = "regulator-fixed"; + regulator-name = "VCC_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vddao_3v3>; + regulator-always-on; + /* FIXME: actually controlled by VDDCPU_B_EN */ + }; + + vcc_5v: regulator-vcc_5v { + compatible = "regulator-fixed"; + regulator-name = "VCC_5V"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&dc_in>; + + gpio = <&gpio GPIOH_8 GPIO_OPEN_DRAIN>; + enable-active-low; + }; + + vddao_1v8: regulator-vddao_1v8 { + compatible = "regulator-fixed"; + regulator-name = "VDDAO_1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vddao_3v3>; + regulator-always-on; + }; + + vddao_3v3: regulator-vddao_3v3 { + compatible = "regulator-fixed"; + regulator-name = "VDDAO_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&dc_in>; + regulator-always-on; + }; + + vddcpu: regulator-vddcpu { + compatible = "pwm-regulator"; + + regulator-name = "VDDCPU"; + regulator-min-microvolt = <721000>; + regulator-max-microvolt = <1022000>; + + vin-supply = <&dc_in>; + + pwms = <&pwm_AO_cd 1 1250 0>; + pwm-dutycycle-range = <100 0>; + + regulator-boot-on; + regulator-always-on; + }; + + wifi32k: wifi32k { + compatible = "pwm-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */ + }; + + sound { + compatible = "amlogic,axg-sound-card"; + model = "TANIX-TX5MAX"; + audio-aux-devs = <&tdmout_b>; + audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1", + "TDMOUT_B IN 1", "FRDDR_B OUT 1", + "TDMOUT_B IN 2", "FRDDR_C OUT 1", + "TDM_B Playback", "TDMOUT_B OUT", + "SPDIFOUT IN 0", "FRDDR_A OUT 3", + "SPDIFOUT IN 1", "FRDDR_B OUT 3", + "SPDIFOUT IN 2", "FRDDR_C OUT 3"; + + assigned-clocks = <&clkc CLKID_MPLL2>, + <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&frddr_a>; + }; + + dai-link-1 { + sound-dai = <&frddr_b>; + }; + + dai-link-2 { + sound-dai = <&frddr_c>; + }; + + /* 8ch hdmi interface */ + dai-link-3 { + sound-dai = <&tdmif_b>; + dai-format = "i2s"; + dai-tdm-slot-tx-mask-0 = <1 1>; + dai-tdm-slot-tx-mask-1 = <1 1>; + dai-tdm-slot-tx-mask-2 = <1 1>; + dai-tdm-slot-tx-mask-3 = <1 1>; + mclk-fs = <256>; + + codec { + sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>; + }; + }; + + /* spdif hdmi or toslink interface */ + dai-link-4 { + sound-dai = <&spdifout>; + + codec-0 { + sound-dai = <&spdif_dit>; + }; + + codec-1 { + sound-dai = <&tohdmitx TOHDMITX_SPDIF_IN_A>; + }; + }; + + /* spdif hdmi interface */ + dai-link-5 { + sound-dai = <&spdifout_b>; + + codec { + sound-dai = <&tohdmitx TOHDMITX_SPDIF_IN_B>; + }; + }; + + /* hdmi glue */ + dai-link-6 { + sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>; + + codec { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&arb { + status = "okay"; +}; + +&cec_AO { + pinctrl-0 = <&cec_ao_a_h_pins>; + pinctrl-names = "default"; + status = "disabled"; + hdmi-phandle = <&hdmi_tx>; +}; + +&cecb_AO { + pinctrl-0 = <&cec_ao_b_h_pins>; + pinctrl-names = "default"; + status = "okay"; + hdmi-phandle = <&hdmi_tx>; +}; + +&clkc_audio { + status = "okay"; +}; + +&cpu0 { + cpu-supply = <&vddcpu>; + operating-points-v2 = <&cpu_opp_table>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu1 { + cpu-supply = <&vddcpu>; + operating-points-v2 = <&cpu_opp_table>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu2 { + cpu-supply = <&vddcpu>; + operating-points-v2 = <&cpu_opp_table>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu3 { + cpu-supply = <&vddcpu>; + operating-points-v2 = <&cpu_opp_table>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cvbs_vdac_port { + cvbs_vdac_out: endpoint { + remote-endpoint = <&cvbs_connector_in>; + }; +}; + +&frddr_a { + status = "okay"; +}; + +&frddr_b { + status = "okay"; +}; + +&frddr_c { + status = "okay"; +}; + +&hdmi_tx { + status = "okay"; + pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>; + pinctrl-names = "default"; + hdmi-supply = <&vcc_5v>; +}; + +&hdmi_tx_tmds_port { + hdmi_tx_tmds_out: endpoint { + remote-endpoint = <&hdmi_connector_in>; + }; +}; + +&ir { + status = "okay"; + pinctrl-0 = <&remote_input_ao_pins>; + pinctrl-names = "default"; + linux,rc-map-name = "rc-tx5max"; +}; + +&pwm_AO_cd { + pinctrl-0 = <&pwm_ao_d_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin1"; + status = "okay"; +}; + +&ext_mdio { + external_phy: ethernet-phy@0 { + /* Realtek RTL8211F (0x001cc916) */ + reg = <0>; + max-speed = <1000>; + eee-broken-1000t; + + reset-assert-us = <10000>; + reset-deassert-us = <80000>; + reset-gpios = <&gpio GPIOZ_15 (GPIO_ACTIVE_LOW | GPIO_OPEN_DRAIN)>; + + interrupt-parent = <&gpio_intc>; + /* MAC_INTR on GPIOZ_14 */ + interrupts = <26 IRQ_TYPE_LEVEL_LOW>; + }; +}; + +ðmac { + pinctrl-0 = <ð_pins>, <ð_rgmii_pins>; + pinctrl-names = "default"; + status = "okay"; + phy-mode = "rgmii"; + phy-handle = <&external_phy>; + amlogic,tx-delay-ns = <2>; +}; + +&pwm_ef { + status = "okay"; + pinctrl-0 = <&pwm_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin0"; +}; + +&uart_A { + status = "okay"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "brcm,bcm43438-bt"; + shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + max-speed = <2000000>; + clocks = <&wifi32k>; + clock-names = "lpo"; + }; +}; + +&uart_AO { + status = "okay"; + pinctrl-0 = <&uart_ao_a_pins>; + pinctrl-names = "default"; +}; + +&usb { + status = "okay"; + dr_mode = "host"; +}; + +/* SDIO */ +&sd_emmc_a { + status = "okay"; + pinctrl-0 = <&sdio_pins>; + pinctrl-1 = <&sdio_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + #address-cells = <1>; + #size-cells = <0>; + + bus-width = <4>; + cap-sd-highspeed; + sd-uhs-sdr50; + max-frequency = <100000000>; + + non-removable; + disable-wp; + + /* WiFi firmware requires power to be kept while in suspend */ + keep-power-in-suspend; + + mmc-pwrseq = <&sdio_pwrseq>; + + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vddao_1v8>; + + brcmf: wifi@1 { + reg = <1>; + compatible = "brcm,bcm4329-fmac"; + }; +}; + +/* SD card */ +&sd_emmc_b { + status = "okay"; + pinctrl-0 = <&sdcard_c_pins>; + pinctrl-1 = <&sdcard_clk_gate_c_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <4>; + cap-sd-highspeed; + max-frequency = <100000000>; + disable-wp; + + cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>; + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vddao_3v3>; +}; + +/* eMMC */ +&sd_emmc_c { + status = "okay"; + pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>; + pinctrl-1 = <&emmc_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <8>; + cap-mmc-highspeed; + max-frequency = <100000000>; + non-removable; + disable-wp; + + mmc-pwrseq = <&emmc_pwrseq>; + vmmc-supply = <&vcc_3v3>; + vqmmc-supply = <&flash_1v8>; +}; + +&spdifout { + pinctrl-0 = <&spdif_out_h_pins>; + pinctrl-names = "default"; + status = "okay"; +}; + +&spdifout_b { + status = "okay"; +}; + +&tdmif_b { + status = "okay"; +}; + +&tdmout_b { + status = "okay"; +}; + +&tohdmitx { + status = "okay"; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0074-WIP-arm64-dts-meson-add-multiple-MeCool-device-trees.patch ================================================ From 98656236664654dc5163a60522ed69d7e3f99823 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Mon, 21 Oct 2019 03:58:06 +0000 Subject: [PATCH 074/120] WIP: arm64: dts: meson: add multiple MeCool device trees This adds initial device trees for a range of MeCool devices based on various Amlogic GXBB, GXL and GXM reference designs. The current purpose is to allow devices to be associated with their respective IR remote keymaps. It also prepares for the addition of DVB support in the future. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/Makefile | 11 ++++++ .../dts/amlogic/meson-gxbb-mecool-ki-plus.dts | 34 +++++++++++++++++++ .../dts/amlogic/meson-gxbb-mecool-kii-pro.dts | 34 +++++++++++++++++++ .../meson-gxl-s905d-mecool-ki-plus.dts | 21 ++++++++++++ .../amlogic/meson-gxl-s905d-mecool-ki-pro.dts | 16 +++++++++ .../meson-gxl-s905d-mecool-m8s-plus.dts | 16 +++++++++ 6 files changed, 132 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxbb-mecool-ki-plus.dts create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxbb-mecool-kii-pro.dts create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxl-s905d-mecool-ki-plus.dts create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxl-s905d-mecool-ki-pro.dts create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxl-s905d-mecool-m8s-plus.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index 5897fd0f594b..be7cc188706a 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -20,6 +20,8 @@ dtb-$(CONFIG_ARCH_MESON) += meson-g12b-radxa-zero2.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-s922x-khadas-vim3.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-ugoos-am6.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-kii-pro.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-mecool-ki-plus.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-mecool-kii-pro.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-nanopi-k2.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-nexbox-a95x.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-odroidc2.dtb @@ -33,12 +35,21 @@ dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-wetek-play2.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s805x-libretech-ac.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s805x-p241.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905d-libretech-pc.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905d-mecool-ki-plus.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905d-mecool-ki-pro.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905d-mecool-kii-pro.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905d-mecool-m8s-plus.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905d-p230.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905d-p231.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905d-phicomm-n1.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905d-sml5442tw.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905d-vero4k-plus.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-hwacom-amazetv.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-khadas-vim.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-libretech-cc.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-libretech-cc-v2.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-nexbox-a95x.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-p212.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905w-jethome-jethub-j80.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905w-p281.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905w-tx3-mini.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-mecool-ki-plus.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-mecool-ki-plus.dts new file mode 100644 index 000000000000..cb422633a8f9 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-mecool-ki-plus.dts @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +/* + * Author: Christian Hewitt <christianshewitt@gmail.com> + */ + +#include "meson-gxbb-p201.dts" + +/ { + compatible = "videostrong,gxbb-ki-plus", "amlogic,meson-gxbb"; + model = "MeCool KI Plus"; + + clock: meson_clock { + compatible = "amlogic, gxbb-clock"; + reg = <0x0 0xc883c000 0x0 0x1000>, + <0x0 0xc8100000 0x0 0x1000>; + #clock-cells = <1>; + #reset-cells = <1>; + sys_max = <1536000000>; + }; + + memory@0 { + device_type = "memory"; + reg = <0x0 0x0 0x0 0x40000000>; + }; +}; + +&ir { + linux,rc-map-name = "rc-mecool-ki-plus"; +}; + +&usb_pwr { + gpio = <>; +}; diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-mecool-kii-pro.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-mecool-kii-pro.dts new file mode 100644 index 000000000000..0dbcf0f7dbd9 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-mecool-kii-pro.dts @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +/* + * Author: Christian Hewitt <christianshewitt@gmail.com> + */ + +#include "meson-gxbb-p201.dts" + +/ { + compatible = "videostrong,gxbb-kii-pro", "amlogic,meson-gxbb"; + model = "MeCool KII Pro"; + + clock: meson_clock { + compatible = "amlogic, gxbb-clock"; + reg = <0x0 0xc883c000 0x0 0x1000>, + <0x0 0xc8100000 0x0 0x1000>; + #clock-cells = <1>; + #reset-cells = <1>; + sys_max = <1536000000>; + }; + + memory@0 { + device_type = "memory"; + reg = <0x0 0x0 0x0 0x40000000>; + }; +}; + +&ir { + linux,rc-map-name = "rc-mecool-kii-pro"; +}; + +&usb_pwr { + gpio = <>; +}; diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-mecool-ki-plus.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-mecool-ki-plus.dts new file mode 100644 index 000000000000..b4aed5d0dbdf --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-mecool-ki-plus.dts @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +/* + * Author: Christian Hewitt <christianshewitt@gmail.com> + */ + +#include "meson-gxl-s905d-p231.dts" + +/ { + compatible = "videostrong,gxl-ki-plus", "amlogic,s905d", "amlogic,meson-gxl"; + model = "MeCool KI Plus"; + + memory@0 { + device_type = "memory"; + reg = <0x0 0x0 0x0 0x40000000>; + }; +}; + +&ir { + linux,rc-map-name = "rc-mecool-ki-plus"; +}; diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-mecool-ki-pro.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-mecool-ki-pro.dts new file mode 100644 index 000000000000..af695620728c --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-mecool-ki-pro.dts @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +/* + * Author: Christian Hewitt <christianshewitt@gmail.com> + */ + +#include "meson-gxl-s905d-p230.dts" + +/ { + compatible = "videostrong,gxl-ki-pro", "amlogic,s905d", "amlogic,meson-gxl"; + model = "MeCool KI Pro"; +}; + +&ir { + linux,rc-map-name = "rc-mecool-ki-pro"; +}; diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-mecool-m8s-plus.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-mecool-m8s-plus.dts new file mode 100644 index 000000000000..3ddcf59d2649 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-mecool-m8s-plus.dts @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +/* + * Author: Christian Hewitt <christianshewitt@gmail.com> + */ + +#include "meson-gxl-s905d-p231.dts" + +/ { + compatible = "videostrong,gxl-kii-pro", "amlogic,s905d", "amlogic,meson-gxl"; + model = "MeCool M8S Plus"; +}; + +&ir { + linux,rc-map-name = "rc-mecool-m8s-plus"; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0075-WIP-dt-bindings-arm-amlogic-add-support-for-Minix-NE.patch ================================================ From 821b974dba480063ad5c60d83bd28441ba164f7c Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sun, 11 Apr 2021 05:50:13 +0000 Subject: [PATCH 075/120] WIP: dt-bindings: arm: amlogic: add support for Minix NEO-U1 The Minix NEO-U1 is an Android STB based on the Amlogic P200 (GXBB) reference design with an S905 chip. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/arm/amlogic.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml index 845a5eb56ff3..657af6e662ea 100644 --- a/Documentation/devicetree/bindings/arm/amlogic.yaml +++ b/Documentation/devicetree/bindings/arm/amlogic.yaml @@ -58,6 +58,7 @@ properties: - amlogic,p201 - friendlyarm,nanopi-k2 - hardkernel,odroid-c2 + - minix,neo-u1 - nexbox,a95x - videostrong,kii-pro - wetek,hub -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0076-WIP-arm64-dts-meson-add-initial-device-tree-for-Mini.patch ================================================ From d498d3a2fbd330d5f85f75b0f752351fe6745d53 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sun, 11 Apr 2021 05:52:14 +0000 Subject: [PATCH 076/120] WIP: arm64: dts: meson: add initial device-tree for Minix NEO-U1 The Minix NEO-U1 is an Android STB based on the Amlogic P200 (GXBB) reference design with an S905-H chip and the following specs: - 2GB DDR3 RAM - 16GB eMMC - 10/100/1000 Base-T Ethernet - AP6356 Wireless (802.11 b/g/n/ac, BT 5.0) - HDMI 2.1 video - S/PDIF optical output - ES8323 DAC - 3x USB 2.0 port - 1x USB micro OTG port - RTC chip (hym8563) - IR receiver - 1x Power LED (white) - 1x Update/Reset button (underside) - 1x micro SD card slot Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/Makefile | 1 + .../dts/amlogic/meson-gxbb-minix-neo-u1.dts | 189 ++++++++++++++++++ 2 files changed, 190 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxbb-minix-neo-u1.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index be7cc188706a..c310be848a62 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -22,6 +22,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-g12b-ugoos-am6.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-kii-pro.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-mecool-ki-plus.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-mecool-kii-pro.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-minix-neo-u1.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-nanopi-k2.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-nexbox-a95x.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-odroidc2.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-minix-neo-u1.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-minix-neo-u1.dts new file mode 100644 index 000000000000..5343e90f9f34 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-minix-neo-u1.dts @@ -0,0 +1,189 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2021 Christian Hewitt <christianshewitt@gmail.com> + */ + +/dts-v1/; + +#include "meson-gxbb-p20x.dtsi" +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/input/input.h> +#include <dt-bindings/leds/common.h> +#include <dt-bindings/sound/meson-aiu.h> + +/ { + compatible = "minix,neo-u1", "amlogic,meson-gxbb"; + model = "Minix NEO U1"; + + aliases { + rtc0 = &rtc; + }; + + spdif_dit: audio-codec-0 { + #sound-dai-cells = <0>; + compatible = "linux,spdif-dit"; + status = "okay"; + sound-name-prefix = "DIT"; + }; + + leds { + compatible = "gpio-leds"; + + led-status { + color = <LED_COLOR_ID_WHITE>; + function = LED_FUNCTION_STATUS; + gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_HIGH>; + default-state = "on"; + }; + }; + + gpio-keys-polled { + compatible = "gpio-keys-polled"; + #address-cells = <1>; + #size-cells = <0>; + poll-interval = <20>; + + button-reset { + label = "reset"; + linux,code = <KEY_POWER>; + gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_HIGH>; + }; + }; + + avdd18_usb_adc: regulator-avdd18_usb_adc { + compatible = "regulator-fixed"; + regulator-name = "AVDD18_USB_ADC"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + }; + + sound { + compatible = "amlogic,gx-sound-card"; + model = "MINIX-NEO"; + assigned-clocks = <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>, + <&clkc CLKID_MPLL2>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&aiu AIU_CPU CPU_I2S_FIFO>; + }; + + dai-link-1 { + sound-dai = <&aiu AIU_CPU CPU_SPDIF_FIFO>; + }; + + dai-link-2 { + sound-dai = <&aiu AIU_CPU CPU_I2S_ENCODER>; + dai-format = "i2s"; + mclk-fs = <256>; + + codec-0 { + sound-dai = <&aiu AIU_HDMI CTRL_I2S>; + }; + }; + + dai-link-3 { + sound-dai = <&aiu AIU_CPU CPU_SPDIF_ENCODER>; + + codec-0 { + sound-dai = <&spdif_dit>; + }; + }; + + dai-link-4 { + sound-dai = <&aiu AIU_HDMI CTRL_OUT>; + + codec-0 { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&aiu { + status = "okay"; + pinctrl-0 = <&spdif_out_y_pins>; + pinctrl-names = "default"; +}; + +ðmac { + status = "okay"; + pinctrl-0 = <ð_rgmii_pins>; + pinctrl-names = "default"; + + phy-handle = <ð_phy0>; + phy-mode = "rgmii"; + + amlogic,tx-delay-ns = <2>; + + mdio { + compatible = "snps,dwmac-mdio"; + #address-cells = <1>; + #size-cells = <0>; + + eth_phy0: ethernet-phy@0 { + /* Realtek RTL8211F (0x001cc916) */ + reg = <0>; + + reset-assert-us = <10000>; + reset-deassert-us = <80000>; + reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>; + + interrupt-parent = <&gpio_intc>; + /* MAC_INTR on GPIOZ_15 */ + interrupts = <29 IRQ_TYPE_LEVEL_LOW>; + }; + }; +}; + +&ir { + linux,rc-map-name = "rc-minix-neo"; +}; + +&i2c_A { + status = "okay"; + pinctrl-0 = <&i2c_a_pins>; + pinctrl-names = "default"; +}; + +&i2c_B { + status = "okay"; + pinctrl-0 = <&i2c_b_pins>; + pinctrl-names = "default"; + + rtc: rtc@51 { + status = "okay"; + compatible = "haoyu,hym8563"; + reg = <0x51>; + #clock-cells = <0>; + clock-frequency = <32768>; + clock-output-names = "xin32k"; + wakeup-source; + }; +}; + +&saradc { + status = "okay"; + vref-supply = <&avdd18_usb_adc>; +}; + +/* This is connected to the Bluetooth module: */ +&uart_A { + status = "okay"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "bcm43438-bt"; + shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + max-speed = <2000000>; + clocks = <&wifi32k>; + clock-names = "lpo"; + }; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0077-LOCAL-arm64-dts-meson-add-rtc-vrtc-aliases-to-Minix-.patch ================================================ From e262438bbff7de98affac0b45496fc1e96cab49e Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Fri, 19 Aug 2022 21:32:21 +0000 Subject: [PATCH 077/120] LOCAL: arm64: dts: meson: add rtc/vrtc aliases to Minix NEO-U1 Add node aliases to prevent meson-vrtc from claiming /dev/rtc0 Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/meson-gxbb-minix-neo-u1.dts | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-minix-neo-u1.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-minix-neo-u1.dts index 5343e90f9f34..5900ee92ca28 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb-minix-neo-u1.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-minix-neo-u1.dts @@ -17,6 +17,7 @@ / { aliases { rtc0 = &rtc; + rtc1 = &vrtc; }; spdif_dit: audio-codec-0 { -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0078-WIP-dt-bindings-arm-amlogic-add-support-for-Beelink-.patch ================================================ From 13fcb2cd934993bf97d27f11db35f2a478d173b4 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 8 Dec 2021 15:28:50 +0000 Subject: [PATCH 078/120] WIP: dt-bindings: arm: amlogic: add support for Beelink Mini MXIII The Beelink Mini MXIII is an Android STB based on the Amlogic P200 (GXBB) reference design with an S905 chip. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/arm/amlogic.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml index 657af6e662ea..a0ea076b7b4d 100644 --- a/Documentation/devicetree/bindings/arm/amlogic.yaml +++ b/Documentation/devicetree/bindings/arm/amlogic.yaml @@ -56,6 +56,7 @@ properties: - enum: - amlogic,p200 - amlogic,p201 + - beelink,mini-mxiii - friendlyarm,nanopi-k2 - hardkernel,odroid-c2 - minix,neo-u1 -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0079-WIP-arm64-dts-meson-add-support-for-Beelink-Mini-MXI.patch ================================================ From 7202d36700ce8a77703bcc0d1ee1b0ba1346927a Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 8 Dec 2021 15:26:00 +0000 Subject: [PATCH 079/120] WIP: arm64: dts: meson: add support for Beelink Mini MXIII This is a GXBB board that ships in two variants, one with a Broadcom SDIO module, and a second with RTL8723BS. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/Makefile | 1 + .../amlogic/meson-gxbb-beelink-mini-mxiii.dts | 172 ++++++++++++++++++ 2 files changed, 173 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxbb-beelink-mini-mxiii.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index c310be848a62..f27222c9d292 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -20,6 +20,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-g12b-radxa-zero2.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-s922x-khadas-vim3.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-ugoos-am6.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-kii-pro.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-beelink-mini-mxiii.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-mecool-ki-plus.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-mecool-kii-pro.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-minix-neo-u1.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-beelink-mini-mxiii.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-beelink-mini-mxiii.dts new file mode 100644 index 000000000000..3d99ca93e1d5 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-beelink-mini-mxiii.dts @@ -0,0 +1,172 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2021 Christian Hewitt <christianshewitt@gmail.com> + */ + +/dts-v1/; + +#include "meson-gxbb-p20x.dtsi" +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/input/input.h> +#include <dt-bindings/leds/common.h> +#include <dt-bindings/sound/meson-aiu.h> + +/ { + compatible = "beelink,mini-mxiii", "amlogic,meson-gxbb"; + model = "Beelink Mini MXIII"; + + spdif_dit: audio-codec-0 { + #sound-dai-cells = <0>; + compatible = "linux,spdif-dit"; + status = "okay"; + sound-name-prefix = "DIT"; + }; + + leds { + compatible = "gpio-leds"; + + led-power { + /* Red in Standby */ + color = <LED_COLOR_ID_GREEN>; + function = LED_FUNCTION_POWER; + gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_HIGH>; + default-state = "on"; + }; + }; + + gpio-keys-polled { + compatible = "gpio-keys-polled"; + #address-cells = <1>; + #size-cells = <0>; + poll-interval = <20>; + + button-reset { + label = "reset"; + linux,code = <KEY_POWER>; + gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_HIGH>; + }; + }; + + avdd18_usb_adc: regulator-avdd18_usb_adc { + compatible = "regulator-fixed"; + regulator-name = "AVDD18_USB_ADC"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + }; + + sound { + compatible = "amlogic,gx-sound-card"; + model = "MINI-MXIII"; + assigned-clocks = <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>, + <&clkc CLKID_MPLL2>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&aiu AIU_CPU CPU_I2S_FIFO>; + }; + + dai-link-1 { + sound-dai = <&aiu AIU_CPU CPU_SPDIF_FIFO>; + }; + + dai-link-2 { + sound-dai = <&aiu AIU_CPU CPU_I2S_ENCODER>; + dai-format = "i2s"; + mclk-fs = <256>; + + codec-0 { + sound-dai = <&aiu AIU_HDMI CTRL_I2S>; + }; + }; + + dai-link-3 { + sound-dai = <&aiu AIU_CPU CPU_SPDIF_ENCODER>; + + codec-0 { + sound-dai = <&spdif_dit>; + }; + }; + + dai-link-4 { + sound-dai = <&aiu AIU_HDMI CTRL_OUT>; + + codec-0 { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&aiu { + status = "okay"; + pinctrl-0 = <&spdif_out_y_pins>; + pinctrl-names = "default"; +}; + +ðmac { + status = "okay"; + pinctrl-0 = <ð_rgmii_pins>; + pinctrl-names = "default"; + + phy-handle = <ð_phy0>; + phy-mode = "rgmii"; + + amlogic,tx-delay-ns = <2>; + + mdio { + compatible = "snps,dwmac-mdio"; + #address-cells = <1>; + #size-cells = <0>; + + eth_phy0: ethernet-phy@0 { + /* Realtek RTL8211F (0x001cc916) */ + reg = <0>; + + reset-assert-us = <10000>; + reset-deassert-us = <80000>; + reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>; + + interrupt-parent = <&gpio_intc>; + /* MAC_INTR on GPIOZ_15 */ + interrupts = <29 IRQ_TYPE_LEVEL_LOW>; + }; + }; +}; + +&ir { + linux,rc-map-name = "rc-beelink-mxiii"; +}; + +&saradc { + status = "okay"; + vref-supply = <&avdd18_usb_adc>; +}; + +/* Realtek Wireless SDIO Module */ +&sd_emmc_a { + /delete-node/ brcmf; + + rtl8723bs: wifi@1 { + reg = <1>; + compatible = "realtek,rtl8723bs"; + }; +}; + +/* Connected to the Bluetooth module */ +&uart_A { + status = "okay"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "realtek,rtl8723bs-bt"; + enable-gpios = <&gpio GPIOX_20 GPIO_ACTIVE_HIGH>; + host-wake-gpios = <&gpio GPIOX_21 GPIO_ACTIVE_HIGH>; + }; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0080-WIP-media-rc-add-keymap-for-MeCool-M8S-Pro-W-remote.patch ================================================ From 895414b87c0d4e345c304d48bd39cdf1b3408e81 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sun, 16 Jan 2022 08:48:02 +0000 Subject: [PATCH 080/120] WIP: media: rc: add keymap for MeCool M8S Pro W remote Add a keymap and bindings for the simple IR (NEC) remote used with the MeCool M8S Pro W Android STB device. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../devicetree/bindings/media/rc.yaml | 1 + drivers/media/rc/keymaps/Makefile | 2 + .../media/rc/keymaps/rc-mecool-m8s-pro-w.c | 75 +++++++++++++++++++ include/media/rc-map.h | 1 + 4 files changed, 79 insertions(+) create mode 100644 drivers/media/rc/keymaps/rc-mecool-m8s-pro-w.c diff --git a/Documentation/devicetree/bindings/media/rc.yaml b/Documentation/devicetree/bindings/media/rc.yaml index deeda4bb8dae..37583861376e 100644 --- a/Documentation/devicetree/bindings/media/rc.yaml +++ b/Documentation/devicetree/bindings/media/rc.yaml @@ -95,6 +95,7 @@ properties: - rc-manli - rc-mecool-kii-pro - rc-mecool-kiii-pro + - rc-mecool-m8s-pro-w - rc-medion-x10 - rc-medion-x10-digitainer - rc-medion-x10-or2x diff --git a/drivers/media/rc/keymaps/Makefile b/drivers/media/rc/keymaps/Makefile index f19558fdab0c..f1fba08d8ed4 100644 --- a/drivers/media/rc/keymaps/Makefile +++ b/drivers/media/rc/keymaps/Makefile @@ -76,6 +76,8 @@ obj-$(CONFIG_RC_MAP) += \ rc-manli.o \ rc-mecool-kiii-pro.o \ rc-mecool-kii-pro.o \ + rc-mecool-m8s-pro-w.o \ + rc-medion-x10.o \ rc-medion-x10-digitainer.o \ rc-medion-x10.o \ rc-medion-x10-or2x.o \ diff --git a/drivers/media/rc/keymaps/rc-mecool-m8s-pro-w.c b/drivers/media/rc/keymaps/rc-mecool-m8s-pro-w.c new file mode 100644 index 000000000000..9024b999d5a9 --- /dev/null +++ b/drivers/media/rc/keymaps/rc-mecool-m8s-pro-w.c @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: GPL-2.0+ +// +// Copyright (C) 2022 Christian Hewitt <christianshewitt@gmail.com> + +#include <media/rc-map.h> +#include <linux/module.h> + +// +// Keytable for the MeCool M8S Pro W remote control +// + +static struct rc_map_table mecool_m8s_pro_w[] = { + + { 0x59, KEY_POWER }, + + // TV CONTROLS + + { 0x08, KEY_PREVIOUS }, + { 0x0b, KEY_NEXT }, + { 0x18, KEY_TEXT }, // INTERNET + { 0x19, KEY_MUTE }, + { 0x13, KEY_VOLUMEUP }, + { 0x17, KEY_VOLUMEDOWN }, + + { 0x0d, KEY_HOME }, + { 0x05, KEY_BACK }, + + { 0x06, KEY_UP }, + { 0x5a, KEY_LEFT }, + { 0x1b, KEY_RIGHT }, + { 0x1a, KEY_ENTER }, + { 0x16, KEY_DOWN }, + + { 0x45, KEY_MENU }, + { 0x12, KEY_CONTEXT_MENU }, // MOUSE + + { 0x52, KEY_NUMERIC_1 }, + { 0x50, KEY_NUMERIC_2 }, + { 0x10, KEY_NUMERIC_3 }, + { 0x56, KEY_NUMERIC_4 }, + { 0x54, KEY_NUMERIC_5 }, + { 0x14, KEY_NUMERIC_6 }, + { 0x4e, KEY_NUMERIC_7 }, + { 0x4c, KEY_NUMERIC_8 }, + { 0x0c, KEY_NUMERIC_9 }, + { 0x22, KEY_INFO }, // SEARCH + { 0x0f, KEY_NUMERIC_0 }, + { 0x51, KEY_BACKSPACE }, + +}; + +static struct rc_map_list mecool_m8s_pro_w_map = { + .map = { + .scan = mecool_m8s_pro_w, + .size = ARRAY_SIZE(mecool_m8s_pro_w), + .rc_proto = RC_PROTO_NEC, + .name = RC_MAP_MECOOL_M8S_PRO_W, + } +}; + +static int __init init_rc_map_mecool_m8s_pro_w(void) +{ + return rc_map_register(&mecool_m8s_pro_w_map); +} + +static void __exit exit_rc_map_mecool_m8s_pro_w(void) +{ + rc_map_unregister(&mecool_m8s_pro_w_map); +} + +module_init(init_rc_map_mecool_m8s_pro_w) +module_exit(exit_rc_map_mecool_m8s_pro_w) + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Christian Hewitt <christianshewitt@gmail.com"); diff --git a/include/media/rc-map.h b/include/media/rc-map.h index 4676545ffd8f..4c4eaaf02ac1 100644 --- a/include/media/rc-map.h +++ b/include/media/rc-map.h @@ -282,6 +282,7 @@ struct rc_map *rc_map_get(const char *name); #define RC_MAP_MANLI "rc-manli" #define RC_MAP_MECOOL_KII_PRO "rc-mecool-kii-pro" #define RC_MAP_MECOOL_KIII_PRO "rc-mecool-kiii-pro" +#define RC_MAP_MECOOL_M8S_PRO_W "rc-mecool-m8s-pro-w" #define RC_MAP_MEDION_X10 "rc-medion-x10" #define RC_MAP_MEDION_X10_DIGITAINER "rc-medion-x10-digitainer" #define RC_MAP_MEDION_X10_OR2X "rc-medion-x10-or2x" -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0081-WIP-dt-bindings-arm-amlogic-add-support-for-MeCool-M.patch ================================================ From f16b6edb5e3e984a4dab17906af225280ff6d543 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sun, 16 Jan 2022 08:15:36 +0000 Subject: [PATCH 081/120] WIP: dt-bindings: arm: amlogic: add support for MeCool M8S Pro W The MeCool M8S Pro W is an Android STB based on the Amlogic P281 (GXL) reference design with an S905W chip. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/arm/amlogic.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml index a0ea076b7b4d..70706c8d5ed8 100644 --- a/Documentation/devicetree/bindings/arm/amlogic.yaml +++ b/Documentation/devicetree/bindings/arm/amlogic.yaml @@ -89,6 +89,7 @@ properties: - amlogic,p281 - oranth,tx3-mini - jethome,jethub-j80 + - videostrong,gxl-m8s-pro-w - const: amlogic,s905w - const: amlogic,meson-gxl -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0082-WIP-arm64-dts-meson-add-support-for-MeCool-M8S-Pro-W.patch ================================================ From 8dbd84116d2dd92367fe327292e71104c84f5b0c Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sun, 16 Jan 2022 08:17:41 +0000 Subject: [PATCH 082/120] WIP: arm64: dts: meson: add support for MeCool M8S Pro W MeCool M8S Pro W is an Android STB based on the Amlogic P281 (GXL) reference design with an S905W chip and the following specs: - 2GB DDR3 RAM - 16GB eMMC - 10/100 Base-T Ethernet - SSV6051P Wireless (802.11 b/g/n) - HDMI 2.0 video - 1x 3.5mm AV jack - 2x USB 2.0 port - IR receiver - 1x Power LED (blue) - 1x Update/Reset button (underside) - 1x micro SD card slot Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../meson-gxl-s905w-mecool-m8s-pro-w.dts | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxl-s905w-mecool-m8s-pro-w.dts diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905w-mecool-m8s-pro-w.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905w-mecool-m8s-pro-w.dts new file mode 100644 index 000000000000..a5bbe7315471 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905w-mecool-m8s-pro-w.dts @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2018 Martin Blumenstingl <martin.blumenstingl@googlemail.com>. + * Based on meson-gxl-s905d-p231.dts: + * - Copyright (c) 2016 Endless Computers, Inc. + * Author: Carlo Caione <carlo@endlessm.com> + */ + +/dts-v1/; + +#include "meson-gxl-s905x.dtsi" +#include "meson-gx-p23x-q20x.dtsi" + +/ { + compatible = "videostrong,gxl-m8s-pro-w", "amlogic,s905w", "amlogic,meson-gxl"; + model = "MeCool M8S Pro W"; + + memory@0 { + device_type = "memory"; + reg = <0x0 0x0 0x0 0x80000000>; + }; +}; + +&ir { + linux,rc-map-name = "rc-mecool-m8s-pro-w"; +}; + +&usb { + dr_mode = "host"; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0083-WIP-dt-bindings-arm-amlogic-add-Vero-4K-binding.patch ================================================ From 98ae62b3a7453b7210a56a97b0d78d5772f5d797 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 19 Jan 2022 02:40:20 +0000 Subject: [PATCH 083/120] WIP: dt-bindings: arm: amlogic: add Vero 4K binding Add the board binding for the OSMC Vero 4K STB device Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/arm/amlogic.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml index 70706c8d5ed8..63a2093cb626 100644 --- a/Documentation/devicetree/bindings/arm/amlogic.yaml +++ b/Documentation/devicetree/bindings/arm/amlogic.yaml @@ -102,6 +102,7 @@ properties: - libretech,aml-s905x-cc - libretech,aml-s905x-cc-v2 - nexbox,a95x + - osmc,vero4k - const: amlogic,s905x - const: amlogic,meson-gxl -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0084-WIP-arm64-dts-meson-add-support-for-OSMC-Vero-4K.patch ================================================ From 3cf39f2b0406b2d6c9eaf85e1e8e920448357ba1 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 19 Jan 2022 04:06:17 +0000 Subject: [PATCH 084/120] WIP: arm64: dts: meson: add support for OSMC Vero 4K The OSMC Vero 4K device is based on the Amlogic S905X (P212) reference design with the following specifications: - 2GB DDR4 RAM - 16GB eMMC - HDMI 2.1 video - S/PDIF optical output - AV output - 10/100 Ethernet - AP6255 Wireless (802.11 a/b/g/n/ac, BT 4.2) - 2x USB 2.0 ports (1x OTG) - IR receiver (internal) - IR extender port (external) - 1x micro SD card slot - 1x Power LED (red) - 1x Reset button (in AV jack) Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/Makefile | 1 + .../dts/amlogic/meson-gxl-s905x-vero4k.dts | 180 ++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxl-s905x-vero4k.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index f27222c9d292..2c4c83cc0a04 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -52,6 +52,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-libretech-cc.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-libretech-cc-v2.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-nexbox-a95x.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-p212.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-vero4k.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905w-jethome-jethub-j80.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905w-p281.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905w-tx3-mini.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-vero4k.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-vero4k.dts new file mode 100644 index 000000000000..6196153e424d --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-vero4k.dts @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Author: Christian Hewitt <christianshewitt@gmail.com> + */ + +/dts-v1/; + +#include "meson-gxl-s905x-p212.dtsi" +#include <dt-bindings/input/input.h> +#include <dt-bindings/leds/common.h> +#include <dt-bindings/sound/meson-aiu.h> + +/ { + compatible = "osmc,vero4k", "amlogic,s905x", "amlogic,meson-gxl"; + model = "OSMC Vero 4K"; + + reserved-memory { + /* 32 MiB reserved for ARM Trusted Firmware (BL32) */ + secmon_reserved_bl32: secmon@5300000 { + reg = <0x0 0x05300000 0x0 0x2000000>; + no-map; + }; + }; + + gpio-keys-polled { + compatible = "gpio-keys-polled"; + #address-cells = <1>; + #size-cells = <0>; + poll-interval = <20>; + + button@0 { + label = "power"; + linux,code = <KEY_POWER>; + gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; + }; + }; + + leds { + compatible = "gpio-leds"; + + led-standby { + color = <LED_COLOR_ID_RED>; + function = LED_FUNCTION_POWER; + gpios = <&gpio GPIODV_24 GPIO_ACTIVE_LOW>; + default-state = "off"; + panic-indicator; + }; + }; + + dio2133: analog-amplifier { + compatible = "simple-audio-amplifier"; + sound-name-prefix = "AU2"; + VCC-supply = <&hdmi_5v>; + enable-gpios = <&gpio GPIOH_5 GPIO_ACTIVE_HIGH>; + }; + + cvbs-connector { + compatible = "composite-video-connector"; + + port { + cvbs_connector_in: endpoint { + remote-endpoint = <&cvbs_vdac_out>; + }; + }; + }; + + hdmi-connector { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_connector_in: endpoint { + remote-endpoint = <&hdmi_tx_tmds_out>; + }; + }; + }; + + sound { + compatible = "amlogic,gx-sound-card"; + model = "VERO4K"; + audio-aux-devs = <&dio2133>; + audio-widgets = "Line", "Lineout"; + audio-routing = "AU2 INL", "ACODEC LOLN", + "AU2 INR", "ACODEC LORN", + "Lineout", "AU2 OUTL", + "Lineout", "AU2 OUTR"; + assigned-clocks = <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>, + <&clkc CLKID_MPLL2>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&aiu AIU_CPU CPU_I2S_FIFO>; + }; + + dai-link-1 { + sound-dai = <&aiu AIU_CPU CPU_I2S_ENCODER>; + dai-format = "i2s"; + mclk-fs = <256>; + + codec-0 { + sound-dai = <&aiu AIU_HDMI CTRL_I2S>; + }; + + codec-1 { + sound-dai = <&aiu AIU_ACODEC CTRL_I2S>; + }; + }; + + dai-link-2 { + sound-dai = <&aiu AIU_HDMI CTRL_OUT>; + + codec-0 { + sound-dai = <&hdmi_tx>; + }; + }; + + dai-link-3 { + sound-dai = <&aiu AIU_ACODEC CTRL_OUT>; + + codec-0 { + sound-dai = <&acodec>; + }; + }; + }; +}; + +&acodec { + AVDD-supply = <&vddio_ao18>; + status = "okay"; +}; + +&aiu { + status = "okay"; +}; + +&cec_AO { + status = "okay"; + pinctrl-0 = <&ao_cec_pins>; + pinctrl-names = "default"; + hdmi-phandle = <&hdmi_tx>; +}; + +&cvbs_vdac_port { + cvbs_vdac_out: endpoint { + remote-endpoint = <&cvbs_connector_in>; + }; +}; + +ðmac { + phy-mode = "rmii"; + phy-handle = <&internal_phy>; +}; + +&hdmi_tx { + status = "okay"; + pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>; + pinctrl-names = "default"; + hdmi-supply = <&hdmi_5v>; +}; + +&hdmi_tx_tmds_port { + hdmi_tx_tmds_out: endpoint { + remote-endpoint = <&hdmi_connector_in>; + }; +}; + +&internal_phy { + pinctrl-0 = <ð_link_led_pins>, <ð_act_led_pins>; + pinctrl-names = "default"; +}; + +/* This UART is brought out to the DB9 connector */ +&uart_AO { + status = "okay"; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0085-WIP-arm64-dts-meson-sm1-x96-air-add-RTL8822CS-WiFi-a.patch ================================================ From 98494cbc35117a83cff5e0c23d200243bdff4f43 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Tue, 12 Apr 2022 11:21:21 +0000 Subject: [PATCH 085/120] WIP: arm64: dts: meson: sm1-x96-air: add RTL8822CS WiFi and Bluetooth support Add support for the RTL8822CS WiFi and BT module on the board. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../dts/amlogic/meson-sm1-x96-air-gbit.dts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-x96-air-gbit.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-x96-air-gbit.dts index 7e1a74046ba5..9217db5bdcea 100644 --- a/arch/arm64/boot/dts/amlogic/meson-sm1-x96-air-gbit.dts +++ b/arch/arm64/boot/dts/amlogic/meson-sm1-x96-air-gbit.dts @@ -13,6 +13,10 @@ / { compatible = "amediatech,x96-air-gbit", "amlogic,sm1"; model = "Shenzhen Amediatech Technology Co., Ltd X96 Air"; + aliases { + serial2 = &uart_A; + }; + sound { compatible = "amlogic,axg-sound-card"; model = "X96-AIR"; @@ -120,6 +124,12 @@ &ir { linux,rc-map-name = "rc-x96max"; }; +&sd_emmc_a { + rtl8822cs: wifi@1 { + reg = <1>; + }; +}; + &tdmif_b { status = "okay"; }; @@ -131,3 +141,17 @@ &tdmout_b { &tohdmitx { status = "okay"; }; + +&uart_A { + status = "okay"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "realtek,rtl8822cs-bt"; + enable-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + host-wake-gpios = <&gpio GPIOX_19 GPIO_ACTIVE_HIGH>; + device-wake-gpios = <&gpio GPIOX_18 GPIO_ACTIVE_HIGH>; + }; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0086-WIP-media-rc-add-keymap-for-Venz-V10-remote.patch ================================================ From bbb4c8b01cf73f2e600b1d67b742d515e1f2e6d1 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sun, 10 Apr 2022 11:51:38 +0000 Subject: [PATCH 086/120] WIP: media: rc: add keymap for Venz V10 remote Add a keymap and bindings for the IR (NEC) remote used with the Venz V10 Android STB device. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../devicetree/bindings/media/rc.yaml | 1 + drivers/media/rc/keymaps/Makefile | 1 + drivers/media/rc/keymaps/rc-venz-v10.c | 92 +++++++++++++++++++ include/media/rc-map.h | 1 + 4 files changed, 95 insertions(+) create mode 100644 drivers/media/rc/keymaps/rc-venz-v10.c diff --git a/Documentation/devicetree/bindings/media/rc.yaml b/Documentation/devicetree/bindings/media/rc.yaml index 37583861376e..f390a5d2c82d 100644 --- a/Documentation/devicetree/bindings/media/rc.yaml +++ b/Documentation/devicetree/bindings/media/rc.yaml @@ -152,6 +152,7 @@ properties: - rc-videomate-tv-pvr - rc-videostrong-kii-pro - rc-vega-s9x + - rc-venz-v10 - rc-wetek-hub - rc-wetek-play2 - rc-winfast diff --git a/drivers/media/rc/keymaps/Makefile b/drivers/media/rc/keymaps/Makefile index f1fba08d8ed4..03bc9a8d355e 100644 --- a/drivers/media/rc/keymaps/Makefile +++ b/drivers/media/rc/keymaps/Makefile @@ -129,6 +129,7 @@ obj-$(CONFIG_RC_MAP) += \ rc-twinhan1027.o \ rc-twinhan-dtv-cab-ci.o \ rc-vega-s9x.o \ + rc-venz-v10.o \ rc-videomate-m1f.o \ rc-videomate-s350.o \ rc-videomate-tv-pvr.o \ diff --git a/drivers/media/rc/keymaps/rc-venz-v10.c b/drivers/media/rc/keymaps/rc-venz-v10.c new file mode 100644 index 000000000000..f0a99a31a1d7 --- /dev/null +++ b/drivers/media/rc/keymaps/rc-venz-v10.c @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: GPL-2.0+ +// +// Copyright (C) 2022 Christian Hewitt <christianshewitt@gmail.com> + +#include <media/rc-map.h> +#include <linux/module.h> + +// +// Keytable for the Venz V10 remote control +// + +static struct rc_map_table venz_v10[] = { + { 0x847912, KEY_POWER }, + { 0x847903, KEY_MUTE }, + + { 0x847921, KEY_EPG }, + { 0x847922, KEY_ZOOMIN }, + { 0x847923, KEY_ZOOMOUT }, + { 0x847924, KEY_SCREEN }, // LAUNCHER + + // UP + // DOWN + // LEFT + // RIGHT + + { 0x847904, KEY_FAVORITES }, // TV-SYS + { 0x84790a, KEY_INFO }, // RATIO + { 0x84791f, KEY_LANGUAGE }, // TRACK + { 0x84791e, KEY_SUBTITLE }, // SUB-T + + { 0x847929, KEY_RED }, + { 0x847930, KEY_GREEN }, + { 0x847931, KEY_YELLOW }, + { 0x847932, KEY_BLUE }, + + { 0x847906, KEY_HOME }, + { 0x84791b, KEY_CONFIG }, + + { 0x847905, KEY_UP }, + { 0x847907, KEY_LEFT }, + { 0x847908, KEY_OK }, + { 0x847909, KEY_RIGHT }, + { 0x847900, KEY_DOWN }, + + { 0x847920, KEY_CONTEXT_MENU }, + { 0x84791a, KEY_BACK }, + + { 0x847910, KEY_VOLUMEUP }, + { 0x84790f, KEY_VOLUMEDOWN }, + { 0x847919, KEY_PLAYPAUSE }, + { 0x84791c, KEY_STOP }, + { 0x84791d, KEY_PREVIOUS }, + { 0x847928, KEY_NEXT }, + + { 0x84790b, KEY_1 }, + { 0x84790c, KEY_2 }, + { 0x84790d, KEY_3 }, + { 0x84790e, KEY_4 }, + { 0x847911, KEY_5 }, + { 0x847927, KEY_6 }, + { 0x847913, KEY_7 }, + { 0x847914, KEY_8 }, + { 0x847915, KEY_9 }, + { 0x847916, KEY_MENU }, // MOUSE + { 0x847917, KEY_0 }, + { 0x847918, KEY_DELETE }, +}; + +static struct rc_map_list venz_v10_map = { + .map = { + .scan = venz_v10, + .size = ARRAY_SIZE(venz_v10), + .rc_proto = RC_PROTO_NEC, + .name = RC_MAP_VENZ_V10, + } +}; + +static int __init init_rc_map_venz_v10(void) +{ + return rc_map_register(&venz_v10_map); +} + +static void __exit exit_rc_map_venz_v10(void) +{ + rc_map_unregister(&venz_v10_map); +} + +module_init(init_rc_map_venz_v10) +module_exit(exit_rc_map_venz_v10) + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Christian Hewitt <christianshewitt@gmail.com"); diff --git a/include/media/rc-map.h b/include/media/rc-map.h index 4c4eaaf02ac1..dadd4d27a760 100644 --- a/include/media/rc-map.h +++ b/include/media/rc-map.h @@ -334,6 +334,7 @@ struct rc_map *rc_map_get(const char *name); #define RC_MAP_TT_1500 "rc-tt-1500" #define RC_MAP_TWINHAN_DTV_CAB_CI "rc-twinhan-dtv-cab-ci" #define RC_MAP_TWINHAN_VP1027_DVBS "rc-twinhan1027" +#define RC_MAP_VENZ_V10 "rc-venz-v10" #define RC_MAP_VEGA_S9X "rc-vega-s9x" #define RC_MAP_VIDEOMATE_K100 "rc-videomate-k100" #define RC_MAP_VIDEOMATE_S350 "rc-videomate-s350" -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0087-WIP-dt-bindings-arm-amlogic-add-S905L-and-Venz-V10-b.patch ================================================ From 45cee9708bfc6c1418d3a23513ea7af22bf56bd7 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 9 Apr 2022 06:27:50 +0000 Subject: [PATCH 087/120] WIP: dt-bindings: arm: amlogic: add S905L and Venz V10 bindings Add SOC bindings for S905L devices and the board binding for Venz V10. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/arm/amlogic.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml index 63a2093cb626..5ff3e7f43a51 100644 --- a/Documentation/devicetree/bindings/arm/amlogic.yaml +++ b/Documentation/devicetree/bindings/arm/amlogic.yaml @@ -83,6 +83,13 @@ properties: - const: amlogic,s805x - const: amlogic,meson-gxl + - description: Boards with the Amlogic Meson GXL S905L SoC + items: + - enum: + - venz,v10 + - const: amlogic,s905l + - const: amlogic,meson-gxl + - description: Boards with the Amlogic Meson GXL S905W SoC items: - enum: -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0088-WIP-arm64-dts-meson-add-support-for-Venz-V10.patch ================================================ From 5cd1412e6bb2a6e445b6e6e8bb35c3f2e74bbf4f Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 9 Apr 2022 06:21:58 +0000 Subject: [PATCH 088/120] WIP: arm64: dts: meson: add support for Venz V10 The Venz V10 is an Android STB based on the Amlogic P212 (GXL) reference design with an S905L chip and the following specs: - 1GB DDR3 RAM - 8GB eMMC - 10/100 Base-T Ethernet - RTL8189ES Wireless (802.11 b/g/n) - HDMI 2.0b video - 1x 3.5mm AV jack - 2x USB 2.0 port - IR receiver - 1x Update/Reset button (underside) - 1x micro SD card slot Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/Makefile | 1 + .../dts/amlogic/meson-gxl-s905l-venz-v10.dts | 326 ++++++++++++++++++ 2 files changed, 327 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxl-s905l-venz-v10.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index 2c4c83cc0a04..81e8195509b4 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -46,6 +46,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905d-p231.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905d-phicomm-n1.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905d-sml5442tw.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905d-vero4k-plus.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905l-venz-v10.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-hwacom-amazetv.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-khadas-vim.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-libretech-cc.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905l-venz-v10.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905l-venz-v10.dts new file mode 100644 index 000000000000..553377fce051 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905l-venz-v10.dts @@ -0,0 +1,326 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2016 Endless Computers, Inc. + * Author: Carlo Caione <carlo@endlessm.com> + */ + +/dts-v1/; + +#include "meson-gxl-s905x.dtsi" +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/leds/common.h> +#include <dt-bindings/sound/meson-aiu.h> + +/ { + compatible = "venz,v10", "amlogic,s905l", "amlogic,meson-gxl"; + model = "Venz V10"; + + aliases { + serial0 = &uart_AO; + ethernet0 = ðmac; + wlan0 = &rtl8189; + }; + + chosen { + stdout-path = "serial0:115200n8"; + }; + + memory@0 { + device_type = "memory"; + reg = <0x0 0x0 0x0 0x80000000>; + }; + + dio2133: analog-amplifier { + compatible = "simple-audio-amplifier"; + sound-name-prefix = "AU2"; + VCC-supply = <&hdmi_5v>; + enable-gpios = <&gpio GPIOH_5 GPIO_ACTIVE_HIGH>; + }; + + leds { + compatible = "gpio-leds"; + + led-standby { + color = <LED_COLOR_ID_BLUE>; + function = LED_FUNCTION_POWER; + gpios = <&gpio GPIODV_24 GPIO_ACTIVE_HIGH>; + default-state = "on"; + }; + }; + + cvbs-connector { + compatible = "composite-video-connector"; + + port { + cvbs_connector_in: endpoint { + remote-endpoint = <&cvbs_vdac_out>; + }; + }; + }; + + hdmi-connector { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_connector_in: endpoint { + remote-endpoint = <&hdmi_tx_tmds_out>; + }; + }; + }; + + hdmi_5v: regulator-hdmi-5v { + compatible = "regulator-fixed"; + + regulator-name = "HDMI_5V"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + + gpio = <&gpio GPIOH_3 GPIO_ACTIVE_HIGH>; + enable-active-high; + regulator-always-on; + }; + + vddio_boot: regulator-vddio_boot { + compatible = "regulator-fixed"; + regulator-name = "VDDIO_BOOT"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + }; + + vddao_3v3: regulator-vddao_3v3 { + compatible = "regulator-fixed"; + regulator-name = "VDDAO_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + + vddio_ao18: regulator-vddio_ao18 { + compatible = "regulator-fixed"; + regulator-name = "VDDIO_AO18"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + }; + + vcc_3v3: regulator-vcc_3v3 { + compatible = "regulator-fixed"; + regulator-name = "VCC_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + + emmc_pwrseq: emmc-pwrseq { + compatible = "mmc-pwrseq-emmc"; + reset-gpios = <&gpio BOOT_9 GPIO_ACTIVE_LOW>; + }; + + wifi32k: wifi32k { + compatible = "pwm-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */ + }; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; + clocks = <&wifi32k>; + clock-names = "ext_clock"; + }; + + sound { + compatible = "amlogic,gx-sound-card"; + model = "VENZ-V10"; + audio-aux-devs = <&dio2133>; + audio-widgets = "Line", "Lineout"; + audio-routing = "AU2 INL", "ACODEC LOLN", + "AU2 INR", "ACODEC LORN", + "Lineout", "AU2 OUTL", + "Lineout", "AU2 OUTR"; + assigned-clocks = <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>, + <&clkc CLKID_MPLL2>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&aiu AIU_CPU CPU_I2S_FIFO>; + }; + + dai-link-1 { + sound-dai = <&aiu AIU_CPU CPU_I2S_ENCODER>; + dai-format = "i2s"; + mclk-fs = <256>; + + codec-0 { + sound-dai = <&aiu AIU_HDMI CTRL_I2S>; + }; + + codec-1 { + sound-dai = <&aiu AIU_ACODEC CTRL_I2S>; + }; + }; + + dai-link-2 { + sound-dai = <&aiu AIU_HDMI CTRL_OUT>; + + codec-0 { + sound-dai = <&hdmi_tx>; + }; + }; + + dai-link-3 { + sound-dai = <&aiu AIU_ACODEC CTRL_OUT>; + + codec-0 { + sound-dai = <&acodec>; + }; + }; + }; +}; + +&acodec { + AVDD-supply = <&vddio_ao18>; + status = "okay"; +}; + +&aiu { + status = "okay"; +}; + +&cec_AO { + status = "okay"; + pinctrl-0 = <&ao_cec_pins>; + pinctrl-names = "default"; + hdmi-phandle = <&hdmi_tx>; +}; + +&cvbs_vdac_port { + cvbs_vdac_out: endpoint { + remote-endpoint = <&cvbs_connector_in>; + }; +}; + +ðmac { + status = "okay"; +}; + +&hdmi_tx { + status = "okay"; + pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>; + pinctrl-names = "default"; + hdmi-supply = <&hdmi_5v>; +}; + +&hdmi_tx_tmds_port { + hdmi_tx_tmds_out: endpoint { + remote-endpoint = <&hdmi_connector_in>; + }; +}; + +&ir { + status = "okay"; + pinctrl-0 = <&remote_input_ao_pins>; + pinctrl-names = "default"; + linux,rc-map-name = "rc-venz-v10"; +}; + +&pwm_ef { + status = "okay"; + pinctrl-0 = <&pwm_e_pins>; + pinctrl-names = "default"; + clocks = <&clkc CLKID_FCLK_DIV4>; + clock-names = "clkin0"; +}; + +&saradc { + status = "okay"; + vref-supply = <&vddio_ao18>; +}; + +/* Wireless SDIO Module */ +&sd_emmc_a { + status = "okay"; + pinctrl-0 = <&sdio_pins>; + pinctrl-1 = <&sdio_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + #address-cells = <1>; + #size-cells = <0>; + + bus-width = <4>; + cap-sd-highspeed; + max-frequency = <100000000>; + + non-removable; + disable-wp; + + /* WiFi firmware requires power to be kept while in suspend */ + keep-power-in-suspend; + + mmc-pwrseq = <&sdio_pwrseq>; + + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vddio_boot>; + + rtl8189: wifi@1 { + reg = <1>; + }; +}; + +/* SD card */ +&sd_emmc_b { + status = "okay"; + pinctrl-0 = <&sdcard_pins>; + pinctrl-1 = <&sdcard_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <4>; + cap-sd-highspeed; + max-frequency = <50000000>; + disable-wp; + + cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>; + + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vddio_boot>; +}; + +/* eMMC */ +&sd_emmc_c { + status = "okay"; + pinctrl-0 = <&emmc_pins>, <&emmc_ds_pins>; + pinctrl-1 = <&emmc_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <8>; + cap-mmc-highspeed; + max-frequency = <200000000>; + non-removable; + disable-wp; + mmc-ddr-1_8v; + mmc-hs200-1_8v; + + mmc-pwrseq = <&emmc_pwrseq>; + vmmc-supply = <&vcc_3v3>; + vqmmc-supply = <&vddio_boot>; +}; + +/* This UART is brought out to the DB9 connector */ +&uart_AO { + status = "okay"; + pinctrl-0 = <&uart_ao_a_pins>; + pinctrl-names = "default"; +}; + +&usb { + status = "okay"; + dr_mode = "host"; +}; + +&usb2_phy0 { + /* HDMI_5V is the supply for the USB VBUS */ + phy-supply = <&hdmi_5v>; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0089-WIP-dt-bindings-vendor-prefixes-add-tbee-prefix.patch ================================================ From de812cac86ea6d25dbe3d0e0862f762749519be4 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 6 Jul 2022 05:15:41 +0000 Subject: [PATCH 089/120] WIP: dt-bindings: vendor-prefixes: add tbee prefix QUIDBox, Lda. are the Portuguese manufacturer of 'TBee' branded Android Set-Top Box devices. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml index 9570cc9e0e06..369bd0c826a1 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.yaml +++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml @@ -1263,6 +1263,8 @@ patternProperties: "^synopsys,.*": description: Synopsys, Inc. (deprecated, use snps) deprecated: true + "^tbee,.*": + description: QUIDBox Lda. "^tbs,.*": description: TBS Technologies "^tbs-biometrics,.*": -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0090-WIP-dt-bindings-arm-amlogic-add-TBee-Box-binding.patch ================================================ From 74edd1397576e08df2de0fb5944ddbd85d47172b Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 6 Jul 2022 05:05:11 +0000 Subject: [PATCH 090/120] WIP: dt-bindings: arm: amlogic: add TBee Box binding Add the board binding for the TBee Box. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/arm/amlogic.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml index 5ff3e7f43a51..9e410dc8d0c5 100644 --- a/Documentation/devicetree/bindings/arm/amlogic.yaml +++ b/Documentation/devicetree/bindings/arm/amlogic.yaml @@ -110,6 +110,7 @@ properties: - libretech,aml-s905x-cc-v2 - nexbox,a95x - osmc,vero4k + - tbee,box - const: amlogic,s905x - const: amlogic,meson-gxl -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0091-WIP-arm64-dts-meson-add-support-for-TBee-Box.patch ================================================ From c2965f88c61c79d8cb6378b3c5f7849c7e5fa487 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 6 Jul 2022 05:23:12 +0000 Subject: [PATCH 091/120] WIP: arm64: dts: meson: add support for TBee Box The TBee Box is an Android STB based on the Amlogic P212 (GXL) reference design with an S905X chip and the following specs: - 2GB DDR3 RAM - 16GB eMMC - 10/100 Base-T Ethernet - QCA9377 Wireless (802.11 a/b/g/n, Bluetooth 4.0) - HDMI 2.0b video - 3x USB 2.0 ports - 1x USB WebCam (Sonix Technology) - IR receiver - 1x Update/Reset button (underside) - 1x Power LED (blue, front) - 1x SD card slot (full-size) Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/Makefile | 1 + .../boot/dts/amlogic/meson-gxl-s905x-tbee.dts | 153 ++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxl-s905x-tbee.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index 81e8195509b4..48459c7f8f1e 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -53,6 +53,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-libretech-cc.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-libretech-cc-v2.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-nexbox-a95x.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-p212.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-tbee.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-vero4k.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905w-jethome-jethub-j80.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905w-p281.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-tbee.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-tbee.dts new file mode 100644 index 000000000000..3584d87c1916 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-tbee.dts @@ -0,0 +1,153 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2016 Endless Computers, Inc. + * Author: Carlo Caione <carlo@endlessm.com> + */ + +/dts-v1/; + +#include "meson-gxl-s905x-p212.dtsi" +#include <dt-bindings/sound/meson-aiu.h> + +/ { + compatible = "tbee,box", "amlogic,s905x", "amlogic,meson-gxl"; + model = "TBee-Box"; + + dio2133: analog-amplifier { + compatible = "simple-audio-amplifier"; + sound-name-prefix = "AU2"; + VCC-supply = <&hdmi_5v>; + enable-gpios = <&gpio GPIOH_5 GPIO_ACTIVE_HIGH>; + }; + + cvbs-connector { + compatible = "composite-video-connector"; + + port { + cvbs_connector_in: endpoint { + remote-endpoint = <&cvbs_vdac_out>; + }; + }; + }; + + hdmi-connector { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_connector_in: endpoint { + remote-endpoint = <&hdmi_tx_tmds_out>; + }; + }; + }; + + sound { + compatible = "amlogic,gx-sound-card"; + model = "TBEE-BOX"; + audio-aux-devs = <&dio2133>; + audio-widgets = "Line", "Lineout"; + audio-routing = "AU2 INL", "ACODEC LOLN", + "AU2 INR", "ACODEC LORN", + "Lineout", "AU2 OUTL", + "Lineout", "AU2 OUTR"; + assigned-clocks = <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>, + <&clkc CLKID_MPLL2>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&aiu AIU_CPU CPU_I2S_FIFO>; + }; + + dai-link-1 { + sound-dai = <&aiu AIU_CPU CPU_I2S_ENCODER>; + dai-format = "i2s"; + mclk-fs = <256>; + + codec-0 { + sound-dai = <&aiu AIU_HDMI CTRL_I2S>; + }; + + codec-1 { + sound-dai = <&aiu AIU_ACODEC CTRL_I2S>; + }; + }; + + dai-link-2 { + sound-dai = <&aiu AIU_HDMI CTRL_OUT>; + + codec-0 { + sound-dai = <&hdmi_tx>; + }; + }; + + dai-link-3 { + sound-dai = <&aiu AIU_ACODEC CTRL_OUT>; + + codec-0 { + sound-dai = <&acodec>; + }; + }; + }; +}; + +&acodec { + AVDD-supply = <&vddio_ao18>; + status = "okay"; +}; + +&aiu { + status = "okay"; +}; + +&cec_AO { + status = "okay"; + pinctrl-0 = <&ao_cec_pins>; + pinctrl-names = "default"; + hdmi-phandle = <&hdmi_tx>; +}; + +&cvbs_vdac_port { + cvbs_vdac_out: endpoint { + remote-endpoint = <&cvbs_connector_in>; + }; +}; + +&hdmi_tx { + status = "okay"; + pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>; + pinctrl-names = "default"; + hdmi-supply = <&hdmi_5v>; +}; + +&hdmi_tx_tmds_port { + hdmi_tx_tmds_out: endpoint { + remote-endpoint = <&hdmi_connector_in>; + }; +}; + +/* This is connected to the Bluetooth module: */ +&uart_A { + status = "okay"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "qcom,qca9377-bt"; + enable-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + max-speed = <2000000>; + clocks = <&wifi32k>; + clock-names = "lpo"; + }; +}; + +/* This UART is brought out to the DB9 connector */ +&uart_AO { + status = "okay"; +}; + -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0092-WIP-dt-bindings-arm-amlogic-add-Beelink-GT1-binding.patch ================================================ From 9d8461e4e3f8f54ba7b3a9ced9eb627d4f03376e Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sun, 24 Jul 2022 08:50:28 +0000 Subject: [PATCH 092/120] WIP: dt-bindings: arm: amlogic: add Beelink GT1 binding Add the board binding for the Shenzen AZW (Beelink) GT1 Android Set-Top Box device. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/arm/amlogic.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml index 9e410dc8d0c5..658702b68afe 100644 --- a/Documentation/devicetree/bindings/arm/amlogic.yaml +++ b/Documentation/devicetree/bindings/arm/amlogic.yaml @@ -132,6 +132,7 @@ properties: - enum: - amlogic,q200 - amlogic,q201 + - azw,gt1 - azw,gt1-ultimate - khadas,vim2 - kingnovel,r-box-pro -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0093-WIP-arm64-dts-meson-add-support-for-Beelink-GT1.patch ================================================ From 265a4f2df88d969f26edc1303bc0f6b1527d54d1 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 6 Jul 2022 10:01:03 +0000 Subject: [PATCH 093/120] WIP: arm64: dts: meson: add support for Beelink GT1 The Beelink GT1 is based on the Amlogic S912 (Q200) reference design with the following specifications: - 2GB DDR3 RAM - 16GB eMMC - HDMI 2.1 video - S/PDIF optical output - 10/100/1000 Ethernet - QCA9377 Wireless (802.11 a/b/g/n, BT 4.0) - 2x USB 2.0 ports - IR receiver (internal) - 1x micro SD card slot - 1x Power LED (white) - 1x Reset button (underneath) Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/Makefile | 1 + arch/arm64/boot/dts/amlogic/meson-gxm-gt1.dts | 126 ++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxm-gt1.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index 48459c7f8f1e..187c83c4c61e 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -64,6 +64,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-libretech-cc-v2.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-libretech-cc.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-nexbox-a95x.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-p212.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxm-gt1.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxm-gt1-ultimate.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxm-khadas-vim2.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxm-mecool-kiii-pro.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-gt1.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-gt1.dts new file mode 100644 index 000000000000..c7cdb15a4810 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-gxm-gt1.dts @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) Christian Hewitt <christianshewitt@gmail.com> + */ + +/dts-v1/; + +#include "meson-gxm.dtsi" +#include "meson-gx-p23x-q20x.dtsi" +#include <dt-bindings/input/input.h> +#include <dt-bindings/leds/common.h> + +/ { + compatible = "azw,gt1", "amlogic,s912", "amlogic,meson-gxm"; + model = "Beelink GT1"; + + aliases { + rtc0 = &rtc; + rtc1 = &vrtc; + }; + + leds { + compatible = "gpio-leds"; + + led-white { + color = <LED_COLOR_ID_WHITE>; + function = LED_FUNCTION_POWER; + gpios = <&gpio_ao GPIOAO_9 GPIO_ACTIVE_HIGH>; + default-state = "on"; + panic-indicator; + }; + }; + + adc-keys { + compatible = "adc-keys"; + io-channels = <&saradc 0>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1710000>; + + button-function { + label = "update"; + linux,code = <KEY_VENDOR>; + press-threshold-microvolt = <10000>; + }; + }; +}; + +ðmac { + pinctrl-0 = <ð_pins>; + pinctrl-names = "default"; + + phy-handle = <&external_phy>; + phy-mode = "rgmii"; + + amlogic,tx-delay-ns = <2>; +}; + +&external_mdio { + external_phy: ethernet-phy@0 { + /* Realtek RTL8211F (0x2009087f) */ + reg = <0>; + max-speed = <1000>; + + reset-assert-us = <10000>; + reset-deassert-us = <80000>; + reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>; + + interrupt-parent = <&gpio_intc>; + /* MAC_INTR on GPIOZ_15 */ + interrupts = <25 IRQ_TYPE_LEVEL_LOW>; + }; +}; + +&ir { + linux,rc-map-name = "rc-beelink-gs1"; +}; + +&i2c_B { + status = "okay"; + pinctrl-0 = <&i2c_b_pins>; + pinctrl-names = "default"; + + rtc: rtc@51 { + compatible = "haoyu,hym8563"; + reg = <0x51>; + #clock-cells = <0>; + clock-frequency = <32768>; + clock-output-names = "xin32k"; + wakeup-source; + }; +}; + +&pinctrl_periphs { + /* Ensure the phy irq pin is properly configured as input */ + eth_phy_irq_pin: eth-phy-irq { + mux { + groups = "GPIOZ_15"; + function = "gpio_periphs"; + bias-disable; + output-disable; + }; + }; +}; + +&sd_emmc_a { + /* QCA9377 WiFi */ + ath10k: wifi@1 { + reg = <1>; + compatible = "qcom,ath10k"; + }; +}; + +&uart_A { + status = "okay"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "qcom,qca9377-bt"; + shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + max-speed = <2000000>; + clocks = <&wifi32k>; + clock-names = "lpo"; + }; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0094-WIP-arm64-dts-meson-add-vcc_5v-regulator-to-WeTek-dt.patch ================================================ From 2652e86837fdb21477d62ef1645e463da9139536 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 27 Jul 2022 10:27:10 +0000 Subject: [PATCH 094/120] WIP: arm64: dts: meson: add vcc_5v regulator to WeTek dtsi Add the vcc_5v regulator used by the audio DAC chip Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/meson-gxbb-wetek.dtsi | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek.dtsi index 94dafb955301..caa63f5edf03 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek.dtsi @@ -71,6 +71,13 @@ vddio_ao18: regulator-vddio_ao18 { regulator-always-on; }; + vcc_5v: regulator-vcc_5v { + compatible = "regulator-fixed"; + regulator-name = "VCC_5V"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + }; + vcc_3v3: regulator-vcc_3v3 { compatible = "regulator-fixed"; regulator-name = "VCC_3V3"; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0095-WIP-arm64-dts-meson-add-audio-lineout-to-WeTek-Play2.patch ================================================ From 80342953ec8e2d955dfa2abfa522d0b165e6d1be Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 27 Jul 2022 13:39:23 +0000 Subject: [PATCH 095/120] WIP: arm64: dts: meson: add audio lineout to WeTek Play2 Add support for the ES7134LV headphone output on the WeTek Play2 Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../boot/dts/amlogic/meson-gxbb-wetek-play2.dts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts index 505ffcd8eb76..e206d658d157 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts @@ -21,6 +21,13 @@ spdif_dit: audio-codec-0 { sound-name-prefix = "DIT"; }; + i2s_codec: audio-codec-1 { + #sound-dai-cells = <0>; + compatible = "everest,es7134"; + VDD-supply = <&vcc_5v>; + status = "okay"; + }; + leds { led-wifi { label = "wetek-play:wifi-status"; @@ -74,6 +81,10 @@ dai-link-2 { codec-0 { sound-dai = <&aiu AIU_HDMI CTRL_I2S>; }; + + codec-1 { + sound-dai = <&i2s_codec>; + }; }; dai-link-3 { @@ -96,7 +107,9 @@ codec-0 { &aiu { status = "okay"; - pinctrl-0 = <&spdif_out_y_pins>; + pinctrl-0 = <&i2s_am_clk_pins>, <&i2s_out_ao_clk_pins>, + <&i2s_out_lr_clk_pins>, <&i2s_out_ch01_ao_pins>, + <&spdif_out_y_pins>; pinctrl-names = "default"; }; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0096-WIP-arm64-dts-amlogic-fix-cvbs-disable-on-WeTek-Hub.patch ================================================ From 6c308ef81cfef32b67d12c4f3ab19cc71c19d41e Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Fri, 29 Jul 2022 08:29:20 +0000 Subject: [PATCH 096/120] WIP: arm64: dts: amlogic: fix cvbs disable on WeTek Hub The original submission in commit d537d289de06 ("ARM64: dts: meson-gxbb: Add support for WeTek Hub and Play") shows cvbs output as disabled, but this appears to have been dropped accidentally when moving WeTek boards to a common dtsi. The Hub does not have cvbs hardware so let's fix and reinstate the disable. Fixes fb72c03e0e32 ("ARM64: dts: meson-gxbb-wetek: add a wetek specific dtsi to cleanup hub and play2") Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-hub.dts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-hub.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-hub.dts index 58733017eda8..23bea3fe9501 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-hub.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-hub.dts @@ -13,6 +13,10 @@ / { compatible = "wetek,hub", "amlogic,meson-gxbb"; model = "WeTek Hub"; + cvbs-connector { + status = "disabled"; + }; + sound { compatible = "amlogic,gx-sound-card"; model = "WETEK-HUB"; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0097-WIP-ASoC-dt-bindings-add-compatible-for-es8323-i2c.patch ================================================ From b10501e41c8bede399b8465a9f02de357726f940 Mon Sep 17 00:00:00 2001 From: Romain Perier <romain.perier@collabora.com> Date: Sun, 14 Aug 2022 04:21:16 +0000 Subject: [PATCH 097/120] WIP: ASoC: dt-bindings: add compatible for es8323-i2c Add a compatible for the everest,es8323 audio codec used with a number of Amlogic and Rockchip board devices. Signed-off-by: Romain Perier <romain.perier@collabora.com> Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> Acked-by: Rob Herring <robh@kernel.org> --- Documentation/devicetree/bindings/sound/es8328.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/sound/es8328.txt b/Documentation/devicetree/bindings/sound/es8328.txt index 33fbf058c997..86b6d6e99732 100644 --- a/Documentation/devicetree/bindings/sound/es8328.txt +++ b/Documentation/devicetree/bindings/sound/es8328.txt @@ -4,7 +4,10 @@ This device supports both I2C and SPI. Required properties: - - compatible : Should be "everest,es8328" or "everest,es8388" + - compatible : Should be one of the following: + - "everest,es8323" + - "everest,es8328" + - "everest,es8388" - DVDD-supply : Regulator providing digital core supply voltage 1.8 - 3.6V - AVDD-supply : Regulator providing analog supply voltage 3.3V - PVDD-supply : Regulator providing digital IO supply voltage 1.8 - 3.6V -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0098-WIP-ASoC-codecs-add-support-for-ES8323.patch ================================================ From a1c69fc092755a59b25b7a90be3c97796bc77dc7 Mon Sep 17 00:00:00 2001 From: Romain Perier <romain.perier@collabora.com> Date: Sun, 14 Aug 2022 04:29:32 +0000 Subject: [PATCH 098/120] WIP: ASoC: codecs: add support for ES8323 The ES8323 is compatible with the existing ES8328 codec driver, so add compatibles allowing it to be used. Signed-off-by: Romain Perier <romain.perier@collabora.com> Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- sound/soc/codecs/es8328-i2c.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sound/soc/codecs/es8328-i2c.c b/sound/soc/codecs/es8328-i2c.c index 68072e99fcc7..57c7de5cfa05 100644 --- a/sound/soc/codecs/es8328-i2c.c +++ b/sound/soc/codecs/es8328-i2c.c @@ -16,6 +16,7 @@ #include "es8328.h" static const struct i2c_device_id es8328_id[] = { + { "es8323", 0 }, { "es8328", 0 }, { "es8388", 0 }, { } @@ -23,6 +24,7 @@ static const struct i2c_device_id es8328_id[] = { MODULE_DEVICE_TABLE(i2c, es8328_id); static const struct of_device_id es8328_of_match[] = { + { .compatible = "everest,es8323", }, { .compatible = "everest,es8328", }, { .compatible = "everest,es8388", }, { } -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0099-WIP-dt-bindings-add-dream-vendor-prefix.patch ================================================ From eefcf6ac4648114ce7c0d818ee0a2c32508d09f6 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Mon, 5 Apr 2021 13:47:52 +0000 Subject: [PATCH 099/120] WIP: dt-bindings: add dream vendor prefix Add vendor prefix for Dream Property GmbH Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml index 369bd0c826a1..a585da02832e 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.yaml +++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml @@ -350,6 +350,8 @@ patternProperties: description: DPTechnics "^dragino,.*": description: Dragino Technology Co., Limited + "^dream,.*": + description: Dream Property GmbH "^ds,.*": description: DaSheng, Inc. "^dserve,.*": -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0100-WIP-dt-bindings-arm-amlogic-add-support-for-Dreambox.patch ================================================ From 04dd3e0b7c2b58a169dbfc93dca5e16b1eac18da Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Mon, 5 Apr 2021 13:48:34 +0000 Subject: [PATCH 100/120] WIP: dt-bindings: arm: amlogic: add support for Dreambox One/Two The Dreambox One and Dreambox Two are DVBS/T2 receiver boxes based on the Amlogic W400 reference board with an S922X chip. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/arm/amlogic.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml index 658702b68afe..b7ade343feaf 100644 --- a/Documentation/devicetree/bindings/arm/amlogic.yaml +++ b/Documentation/devicetree/bindings/arm/amlogic.yaml @@ -186,6 +186,8 @@ properties: - azw,gsking-x - azw,gtking - azw,gtking-pro + - dream,dreambox-one + - dream,dreambox-two - hardkernel,odroid-n2 - hardkernel,odroid-n2-plus - khadas,vim3 -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0101-WIP-arm64-dts-meson-add-initial-device-trees-for-Dre.patch ================================================ From 98ea0ea77819bebf2f5cfdb07020edabdd5cfbb0 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Mon, 5 Apr 2021 13:51:20 +0000 Subject: [PATCH 101/120] WIP: arm64: dts: meson: add initial device-trees for Dreambox One/Two Dreambox One and Dreambox Two are based on the Amlogic W400 reference board with an S922X chip and the following specs: - 2GB DDR3 RAM - 16GB eMMC - 10/100/1000 Base-T Ethernet - AP6356 Wireless (802.11 b/g/n/ac, BT 5.0) - HDMI 2.1 video - S/PDIF optical output - 2x DVB-S2/T2 - Smartcard Reader Slot - 2x USB 2.0 port (1x micro-USB for service) - 1x USB 3.0 port - IR receiver - 1x Power LED (blue) - 1x Power button (top) - 1x Update/Reset button (underside) - 1x micro SD card slot Dreambox Two differences: - 3" Colour LCD display (MIPI-DSI) - Common Interface Slot Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/Makefile | 2 + .../dts/amlogic/meson-g12b-dreambox-one.dts | 13 ++ .../dts/amlogic/meson-g12b-dreambox-two.dts | 13 ++ .../boot/dts/amlogic/meson-g12b-dreambox.dtsi | 160 ++++++++++++++++++ 4 files changed, 188 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-g12b-dreambox-one.dts create mode 100644 arch/arm64/boot/dts/amlogic/meson-g12b-dreambox-two.dts create mode 100644 arch/arm64/boot/dts/amlogic/meson-g12b-dreambox.dtsi diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index 187c83c4c61e..bc50ca8b0e79 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -11,6 +11,8 @@ dtb-$(CONFIG_ARCH_MESON) += meson-g12a-u200.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12a-x96-max.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-a311d-khadas-vim3.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-bananapi-cm4-cm4io.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-g12b-dreambox-one.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-g12b-dreambox-two.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gsking-x.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking-pro.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-dreambox-one.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-dreambox-one.dts new file mode 100644 index 000000000000..ce3f18ad044a --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-g12b-dreambox-one.dts @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2019 Christian Hewitt <christianshewitt@gmail.com> + */ + +/dts-v1/; + +#include "meson-g12b-dreambox.dtsi" + +/ { + compatible = "dream,dreambox-one", "amlogic,g12b"; + model = "Dreambox One"; +}; diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-dreambox-two.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-dreambox-two.dts new file mode 100644 index 000000000000..b63bbb01036e --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-g12b-dreambox-two.dts @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2019 Christian Hewitt <christianshewitt@gmail.com> + */ + +/dts-v1/; + +#include "meson-g12b-dreambox.dtsi" + +/ { + compatible = "dream,dreambox-two", "amlogic,g12b"; + model = "Dreambox Two"; +}; diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-dreambox.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b-dreambox.dtsi new file mode 100644 index 000000000000..14b2827b592d --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-g12b-dreambox.dtsi @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2021 Christian Hewitt <christianshewitt@gmail.com> + */ + +#include "meson-g12b-w400.dtsi" +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/leds/common.h> +#include <dt-bindings/sound/meson-g12a-tohdmitx.h> + +/ { + cvbs-connector { + status = "disabled"; + }; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpio GPIOA_11 GPIO_ACTIVE_LOW>; + clocks = <&wifi32k>; + clock-names = "ext_clock"; + }; + + spdif_dit: audio-codec-1 { + #sound-dai-cells = <0>; + compatible = "linux,spdif-dit"; + status = "okay"; + sound-name-prefix = "DIT"; + }; + + sound { + compatible = "amlogic,axg-sound-card"; + model = "DREAMBOX"; + audio-aux-devs = <&tdmout_b>; + audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1", + "TDMOUT_B IN 1", "FRDDR_B OUT 1", + "TDMOUT_B IN 2", "FRDDR_C OUT 1", + "TDM_B Playback", "TDMOUT_B OUT", + "SPDIFOUT IN 0", "FRDDR_A OUT 3", + "SPDIFOUT IN 1", "FRDDR_B OUT 3", + "SPDIFOUT IN 2", "FRDDR_C OUT 3"; + + assigned-clocks = <&clkc CLKID_MPLL2>, + <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&frddr_a>; + }; + + dai-link-1 { + sound-dai = <&frddr_b>; + }; + + dai-link-2 { + sound-dai = <&frddr_c>; + }; + + /* 8ch hdmi interface */ + dai-link-3 { + sound-dai = <&tdmif_b>; + dai-format = "i2s"; + dai-tdm-slot-tx-mask-0 = <1 1>; + dai-tdm-slot-tx-mask-1 = <1 1>; + dai-tdm-slot-tx-mask-2 = <1 1>; + dai-tdm-slot-tx-mask-3 = <1 1>; + mclk-fs = <256>; + + codec { + sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>; + }; + }; + + /* spdif hdmi or toslink interface */ + dai-link-4 { + sound-dai = <&spdifout>; + + codec-0 { + sound-dai = <&spdif_dit>; + }; + + codec-1 { + sound-dai = <&tohdmitx TOHDMITX_SPDIF_IN_A>; + }; + }; + + /* spdif hdmi interface */ + dai-link-5 { + sound-dai = <&spdifout_b>; + + codec { + sound-dai = <&tohdmitx TOHDMITX_SPDIF_IN_B>; + }; + }; + + /* hdmi glue */ + dai-link-6 { + sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>; + + codec { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&arb { + status = "okay"; +}; + +&clkc_audio { + status = "okay"; +}; + +&frddr_a { + status = "okay"; +}; + +&frddr_b { + status = "okay"; +}; + +&frddr_c { + status = "okay"; +}; + +&ir { + linux,rc-map-name = "rc-dreambox"; +}; + +&saradc { + status = "okay"; + vref-supply = <&vddao_1v8>; +}; + +&spdifout { + pinctrl-0 = <&spdif_out_h_pins>; + pinctrl-names = "default"; + status = "okay"; +}; + +&spdifout_b { + status = "okay"; +}; + +&tdmif_b { + status = "okay"; +}; + +&tdmout_b { + status = "okay"; +}; + +&tohdmitx { + status = "okay"; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0102-WIP-dt-bindings-arm-amlogic-add-support-for-Ugoos-AM.patch ================================================ From 740b7806615c9781caa1f40e390b6075764bb85e Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Thu, 15 Dec 2022 04:27:45 +0000 Subject: [PATCH 102/120] WIP: dt-bindings: arm: amlogic: add support for Ugoos AM6 plus The AM6 plus is a revised version of the AM6 Android box based on the Amlogic W400 reference board, but now with an S922XJ to bump CPU speeds (rev C silicon) and add Dolby Vision features. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/arm/amlogic.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml index b7ade343feaf..a1ec954a8b8b 100644 --- a/Documentation/devicetree/bindings/arm/amlogic.yaml +++ b/Documentation/devicetree/bindings/arm/amlogic.yaml @@ -192,6 +192,7 @@ properties: - hardkernel,odroid-n2-plus - khadas,vim3 - ugoos,am6 + - ugoos,am6-plus - const: amlogic,s922x - const: amlogic,g12b -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0103-WIP-arm64-dts-meson-add-support-for-Ugoos-AM6-Plus.patch ================================================ From 65a60781fde14e49a5dd4c422cc909b61542cc50 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Thu, 15 Dec 2022 05:29:31 +0000 Subject: [PATCH 103/120] WIP: arm64: dts: meson: add support for Ugoos AM6 Plus The Ugoos AM6 Plus is based on the Amlogic W400 (G12B) reference design using the S922XJ (S922X rev-C with Dolby Vision license) chipset. Hardware specifications: - 2GB/4GB LPDDR4 RAM - 16GB/32GB eMMC storage - 10/100/1000 Base-T Ethernet using External RGMII PHY - 802.11 a/b/g/b/ac + BT 5.0 sdio wireless (Ampak 6398S) - HDMI 2.0 (4k@60p) video - Composite video + 2-channel audio output on 3.5mm jack - S/PDIF audio output - Aux input - 1x USB 3.0 - 3x USB 2.0 - 1x micro SD card slot - 1x power button (rear) Suggested-by: Furkan Kardame <f.kardame@manjaro.org> Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/Makefile | 1 + .../dts/amlogic/meson-g12b-ugoos-am6-plus.dts | 221 ++++++++++++++++++ 2 files changed, 222 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-g12b-ugoos-am6-plus.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index bc50ca8b0e79..615b1c496a34 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -21,6 +21,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-radxa-zero2.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-s922x-khadas-vim3.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-ugoos-am6.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-g12b-ugoos-am6-plus.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-kii-pro.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-beelink-mini-mxiii.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-mecool-ki-plus.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-ugoos-am6-plus.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-ugoos-am6-plus.dts new file mode 100644 index 000000000000..dd5a9665a996 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-g12b-ugoos-am6-plus.dts @@ -0,0 +1,221 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2019 BayLibre, SAS + * Author: Neil Armstrong <narmstrong@baylibre.com> + * Copyright (c) 2019 Christian Hewitt <christianshewitt@gmail.com> + */ + +/dts-v1/; + +#include "meson-g12b-w400.dtsi" +#include <dt-bindings/sound/meson-g12a-tohdmitx.h> + +/ { + compatible = "ugoos,am6-plus", "amlogic,s922x", "amlogic,g12b"; + model = "Ugoos AM6 Plus"; + + aliases { + rtc0 = &rtc; + rtc1 = &vrtc; + }; + + gpio-keys-polled { + compatible = "gpio-keys-polled"; + poll-interval = <100>; + + power-button { + label = "power"; + linux,code = <KEY_POWER>; + gpios = <&gpio_ao GPIOAO_6 GPIO_ACTIVE_HIGH>; + }; + }; + + leds { + compatible = "gpio-leds"; + + led-green { + label = "power:green"; + gpios = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_HIGH>; + default-state = "on"; + }; + }; + + spdif_dit: audio-codec-1 { + #sound-dai-cells = <0>; + compatible = "linux,spdif-dit"; + status = "okay"; + sound-name-prefix = "DIT"; + }; + + sound { + compatible = "amlogic,axg-sound-card"; + model = "AM6-PLUS"; + audio-aux-devs = <&tdmout_b>; + audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1", + "TDMOUT_B IN 1", "FRDDR_B OUT 1", + "TDMOUT_B IN 2", "FRDDR_C OUT 1", + "TDM_B Playback", "TDMOUT_B OUT", + "SPDIFOUT IN 0", "FRDDR_A OUT 3", + "SPDIFOUT IN 1", "FRDDR_B OUT 3", + "SPDIFOUT IN 2", "FRDDR_C OUT 3"; + + assigned-clocks = <&clkc CLKID_MPLL2>, + <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&frddr_a>; + }; + + dai-link-1 { + sound-dai = <&frddr_b>; + }; + + dai-link-2 { + sound-dai = <&frddr_c>; + }; + + /* 8ch hdmi interface */ + dai-link-3 { + sound-dai = <&tdmif_b>; + dai-format = "i2s"; + dai-tdm-slot-tx-mask-0 = <1 1>; + dai-tdm-slot-tx-mask-1 = <1 1>; + dai-tdm-slot-tx-mask-2 = <1 1>; + dai-tdm-slot-tx-mask-3 = <1 1>; + mclk-fs = <256>; + + codec { + sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>; + }; + }; + + /* spdif hdmi or toslink interface */ + dai-link-4 { + sound-dai = <&spdifout>; + + codec-0 { + sound-dai = <&spdif_dit>; + }; + + codec-1 { + sound-dai = <&tohdmitx TOHDMITX_SPDIF_IN_A>; + }; + }; + + /* spdif hdmi interface */ + dai-link-5 { + sound-dai = <&spdifout_b>; + + codec { + sound-dai = <&tohdmitx TOHDMITX_SPDIF_IN_B>; + }; + }; + + /* hdmi glue */ + dai-link-6 { + sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>; + + codec { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&arb { + status = "okay"; +}; + +&clkc_audio { + status = "okay"; +}; + +&frddr_a { + status = "okay"; +}; + +&frddr_b { + status = "okay"; +}; + +&frddr_c { + status = "okay"; +}; + +&ir { + linux,rc-map-name = "rc-khadas"; +}; + +&i2c3 { + status = "okay"; + pinctrl-0 = <&i2c3_sda_a_pins>, <&i2c3_sck_a_pins>; + pinctrl-names = "default"; + + rtc: rtc@51 { + compatible = "haoyu,hym8563"; + reg = <0x51>; + }; +}; + +&spdifout { + pinctrl-0 = <&spdif_out_h_pins>; + pinctrl-names = "default"; + status = "okay"; +}; + +&spdifout_b { + status = "okay"; +}; + +&tdmif_b { + status = "okay"; +}; + +&tdmout_b { + status = "okay"; +}; + +&tohdmitx { + status = "okay"; +}; + +&uart_A { + status = "okay"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "brcm,bcm43438-bt"; + shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + max-speed = <2000000>; + clocks = <&wifi32k>; + clock-names = "lpo"; + }; +}; + +&uart_AO { + status = "okay"; + pinctrl-0 = <&uart_ao_a_pins>; + pinctrl-names = "default"; +}; + +&usb { + status = "okay"; + dr_mode = "host"; + vbus-supply = <&usb_pwr_en>; +}; + +&usb2_phy0 { + phy-supply = <&usb1_pow>; +}; + +&usb2_phy1 { + phy-supply = <&usb1_pow>; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0104-WIP-arm64-dts-meson-add-support-for-MeCool-M8S-Pro-P.patch ================================================ From ebe052f07c62ef9836b8fbdd6a4a56c70d55587e Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Tue, 24 Jan 2023 16:57:20 +0000 Subject: [PATCH 104/120] WIP: arm64: dts: meson: add support for MeCool M8S Pro Plus This is an S905X device based on the P212 reference design, but with an S908CS WiFi/BT module that is not currently supported. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/Makefile | 1 + .../meson-gxl-s905x-mecool-m8s-pro-plus.dts | 150 ++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxl-s905x-mecool-m8s-pro-plus.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index 615b1c496a34..43ffbe9e359e 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -54,6 +54,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-hwacom-amazetv.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-khadas-vim.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-libretech-cc.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-libretech-cc-v2.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-mecool-m8s-pro-plus.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-nexbox-a95x.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-p212.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxl-s905x-tbee.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-mecool-m8s-pro-plus.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-mecool-m8s-pro-plus.dts new file mode 100644 index 000000000000..84772ce12e00 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-mecool-m8s-pro-plus.dts @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2016 Endless Computers, Inc. + * Author: Carlo Caione <carlo@endlessm.com> + */ + +/dts-v1/; + +#include "meson-gxl-s905x-p212.dtsi" +#include <dt-bindings/sound/meson-aiu.h> + +/ { + compatible = "videostrong,mecool-m8s-pro-plus", "amlogic,s905x", "amlogic,meson-gxl"; + model = "MeCool M8S Pro Plus"; + + dio2133: analog-amplifier { + compatible = "simple-audio-amplifier"; + sound-name-prefix = "AU2"; + VCC-supply = <&hdmi_5v>; + enable-gpios = <&gpio GPIOH_5 GPIO_ACTIVE_HIGH>; + }; + + cvbs-connector { + compatible = "composite-video-connector"; + + port { + cvbs_connector_in: endpoint { + remote-endpoint = <&cvbs_vdac_out>; + }; + }; + }; + + hdmi-connector { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_connector_in: endpoint { + remote-endpoint = <&hdmi_tx_tmds_out>; + }; + }; + }; + + sound { + compatible = "amlogic,gx-sound-card"; + model = "MECOOL-M8S"; + audio-aux-devs = <&dio2133>; + audio-widgets = "Line", "Lineout"; + audio-routing = "AU2 INL", "ACODEC LOLN", + "AU2 INR", "ACODEC LORN", + "Lineout", "AU2 OUTL", + "Lineout", "AU2 OUTR"; + assigned-clocks = <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>, + <&clkc CLKID_MPLL2>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&aiu AIU_CPU CPU_I2S_FIFO>; + }; + + dai-link-1 { + sound-dai = <&aiu AIU_CPU CPU_I2S_ENCODER>; + dai-format = "i2s"; + mclk-fs = <256>; + + codec-0 { + sound-dai = <&aiu AIU_HDMI CTRL_I2S>; + }; + + codec-1 { + sound-dai = <&aiu AIU_ACODEC CTRL_I2S>; + }; + }; + + dai-link-2 { + sound-dai = <&aiu AIU_HDMI CTRL_OUT>; + + codec-0 { + sound-dai = <&hdmi_tx>; + }; + }; + + dai-link-3 { + sound-dai = <&aiu AIU_ACODEC CTRL_OUT>; + + codec-0 { + sound-dai = <&acodec>; + }; + }; + }; +}; + +&acodec { + AVDD-supply = <&vddio_ao18>; + status = "okay"; +}; + +&aiu { + status = "okay"; +}; + +&cec_AO { + status = "okay"; + pinctrl-0 = <&ao_cec_pins>; + pinctrl-names = "default"; + hdmi-phandle = <&hdmi_tx>; +}; + +&cvbs_vdac_port { + cvbs_vdac_out: endpoint { + remote-endpoint = <&cvbs_connector_in>; + }; +}; + +&hdmi_tx { + status = "okay"; + pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>; + pinctrl-names = "default"; + hdmi-supply = <&hdmi_5v>; +}; + +&hdmi_tx_tmds_port { + hdmi_tx_tmds_out: endpoint { + remote-endpoint = <&hdmi_connector_in>; + }; +}; + +&ir { + linux,rc-map-name = "rc-mecool-m8s-pro"; +}; + +/* S9082C WiFi */ +&sd_emmc_a { + status = "disabled"; +}; + +/* S9082C Bluetooth */ +&uart_A { + status = "disabled"; +}; + +/* This UART is brought out to the DB9 connector */ +&uart_AO { + status = "okay"; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0105-WIP-arm64-dts-meson-radxa-zero2-add-pwm-fan-support.patch ================================================ From 84eeb2347773a89ae03b936c4ba36267b6dcb28f Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Mon, 30 Jan 2023 05:09:18 +0000 Subject: [PATCH 105/120] WIP: arm64: dts: meson: radxa-zero2: add pwm-fan support The A311D on Zero2 needs active cooling and the board includes a header to connect a simple fan. Add pwm-fan support with basic thermal properties so the fan runs when connected. Suggested-by: Yuntian Zhang <yt@radxa.com> Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../dts/amlogic/meson-g12b-radxa-zero2.dts | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts index 9a60c5ec2072..567a443356fe 100644 --- a/arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts +++ b/arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts @@ -33,6 +33,15 @@ memory@0 { reg = <0x0 0x0 0x0 0x80000000>; }; + fan0: pwm-fan { + compatible = "pwm-fan"; + #cooling-cells = <2>; + cooling-min-state = <0>; + cooling-max-state = <4>; + cooling-levels = <0 64 128 192 255>; + pwms = <&pwm_AO_ab 0 40000 0>; + }; + gpio-keys-polled { compatible = "gpio-keys-polled"; poll-interval = <100>; @@ -286,6 +295,24 @@ &cpu103 { clock-latency = <50000>; }; +&cpu_thermal { + cooling-maps { + map0 { + trip = <&cpu_passive>; + cooling-device = <&fan0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + }; +}; + +&ddr_thermal { + cooling-maps { + map0 { + trip = <&ddr_passive>; + cooling-device = <&fan0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + }; +}; + &frddr_a { status = "okay"; }; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0106-WIP-dt-bindings-arm-amlogic-add-support-for-Tanix-TX.patch ================================================ From d9dd54c8b2d2f7ec05e42392205a67b20dba4e83 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Thu, 9 Feb 2023 09:59:58 +0000 Subject: [PATCH 106/120] WIP: dt-bindings: arm: amlogic: add support for Tanix TX9 Pro The Oranth Tanix TX9 Pro is an Android STB using the Amlogic S912 chip Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/arm/amlogic.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml index a1ec954a8b8b..dea5d15da404 100644 --- a/Documentation/devicetree/bindings/arm/amlogic.yaml +++ b/Documentation/devicetree/bindings/arm/amlogic.yaml @@ -139,6 +139,7 @@ properties: - libretech,aml-s912-pc - minix,neo-u9h - nexbox,a1 + - oranth,tx9-pro - tronsmart,vega-s96 - videostrong,gxm-kiii-pro - wetek,core2 -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0107-WIP-arm64-dts-meson-add-initial-device-tree-for-Tani.patch ================================================ From 551f6b28a561c121f00222c0f101c75dfad93d4b Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Thu, 9 Feb 2023 10:01:14 +0000 Subject: [PATCH 107/120] WIP: arm64: dts: meson: add initial device-tree for Tanix TX9 Pro Oranth Tanix TX9 Pro is based on the Amlogic Q200 reference design with an S912 chip and the following specs: - 3GB DDR3 RAM - 32GB eMMC - 10/100/1000 Base-T Ethernet - AP6356 Wireless (802.11 b/g/n/ac, BT 5.0) - HDMI 2.0a video - VFD for clock/status - 2x USB 2.0 ports - IR receiver - 1x Power LED (white) - 1x Update/Reset button (underside) - 1x micro SD card slot Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/Makefile | 1 + .../boot/dts/amlogic/meson-gxm-tx9-pro.dts | 90 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxm-tx9-pro.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index 43ffbe9e359e..8b4155e0140c 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -78,6 +78,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-gxm-q200.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxm-q201.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxm-rbox-pro.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxm-s912-libretech-pc.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxm-tx9-pro.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxm-vega-s96.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxm-wetek-core2.dtb dtb-$(CONFIG_ARCH_MESON) += meson-s4-s805x2-aq222.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-tx9-pro.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-tx9-pro.dts new file mode 100644 index 000000000000..9a62176cfe5a --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-gxm-tx9-pro.dts @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2016 Endless Computers, Inc. + * Author: Carlo Caione <carlo@endlessm.com> + */ + +/dts-v1/; + +#include "meson-gxm.dtsi" +#include "meson-gx-p23x-q20x.dtsi" +#include <dt-bindings/input/input.h> + +/ { + compatible = "oranth,tx9-pro", "amlogic,s912", "amlogic,meson-gxm"; + model = "Tanix TX9 Pro"; + + adc-keys { + compatible = "adc-keys"; + io-channels = <&saradc 0>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1710000>; + + button-function { + label = "Update"; + linux,code = <KEY_VENDOR>; + press-threshold-microvolt = <10000>; + }; + }; + + gpio-keys-polled { + compatible = "gpio-keys-polled"; + poll-interval = <100>; + + button { + label = "power"; + linux,code = <KEY_POWER>; + gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_LOW>; + }; + }; +}; + +ðmac { + pinctrl-0 = <ð_pins>; + pinctrl-names = "default"; + phy-handle = <&external_phy>; + amlogic,tx-delay-ns = <2>; + phy-mode = "rgmii"; +}; + +&external_mdio { + external_phy: ethernet-phy@0 { + /* Realtek RTL8211F (0x001cc916) */ + reg = <0>; + max-speed = <1000>; + + reset-assert-us = <10000>; + reset-deassert-us = <80000>; + reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>; + + interrupt-parent = <&gpio_intc>; + /* MAC_INTR on GPIOZ_15 */ + interrupts = <25 IRQ_TYPE_LEVEL_LOW>; + }; +}; + +&ir { + linux,rc-map-name = "rc-tanix-tx3mini"; +}; + +&sd_emmc_a { + brcmf: wifi@1 { + reg = <1>; + compatible = "brcm,bcm4329-fmac"; + }; +}; + +&uart_A { + status = "okay"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "brcm,bcm43438-bt"; + shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + max-speed = <2000000>; + clocks = <&wifi32k>; + clock-names = "lpo"; + }; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0108-WIP-arm64-dts-meson-add-7-segment-display-to-Tanix-T.patch ================================================ From 0b2aaaf3f86a0b904b45cb7ef30ae5804a2b95b9 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Thu, 9 Feb 2023 10:11:39 +0000 Subject: [PATCH 108/120] WIP: arm64: dts: meson: add 7-segment display to Tanix TX9 Pro Add support for the 7-segment VFD display of the device Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../boot/dts/amlogic/meson-gxm-tx9-pro.dts | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-tx9-pro.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-tx9-pro.dts index 9a62176cfe5a..2dcff00794b9 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxm-tx9-pro.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxm-tx9-pro.dts @@ -9,6 +9,7 @@ #include "meson-gxm.dtsi" #include "meson-gx-p23x-q20x.dtsi" #include <dt-bindings/input/input.h> +#include <dt-bindings/leds/common.h> / { compatible = "oranth,tx9-pro", "amlogic,s912", "amlogic,meson-gxm"; @@ -37,6 +38,64 @@ button { gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_LOW>; }; }; + + spi { + compatible = "spi-gpio"; + sck-gpios = <&gpio GPIODV_27 GPIO_ACTIVE_HIGH>; + mosi-gpios = <&gpio GPIODV_26 GPIO_ACTIVE_HIGH>; + cs-gpios = <&gpio GPIODV_4 GPIO_ACTIVE_LOW>; + num-chipselects = <1>; + #address-cells = <1>; + #size-cells = <0>; + + tm1628: led-controller@0 { + compatible = "titanmec,tm1628"; + reg = <0>; + spi-3wire; + spi-lsb-first; + spi-rx-delay-us = <1>; + spi-max-frequency = <500000>; + #address-cells = <2>; + #size-cells = <0>; + + titanmec,segment-mapping = /bits/ 8 <4 5 6 1 2 3 7>; + titanmec,grid = /bits/ 8 <4 3 2 1>; + + alarm@5,1 { + reg = <5 1>; + function = LED_FUNCTION_ALARM; + }; + + usb@5,2 { + reg = <5 2>; + function = LED_FUNCTION_USB; + }; + play@5,3 { + reg = <5 3>; + function = "play"; + }; + + pause@5,4 { + reg = <5 4>; + function = "pause"; + }; + + colon@5,5 { + reg = <5 5>; + function = "colon"; + }; + + lan@5,6 { + reg = <5 6>; + function = LED_FUNCTION_LAN; + }; + + wlan@5,7 { + reg = <5 7>; + function = LED_FUNCTION_WLAN; + }; + }; + }; }; ðmac { -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0109-WIP-net-phy-add-support-for-Maxio-MAE0621A.patch ================================================ From dbcc56c1a71911850208663846c93f80307eb455 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sun, 12 Feb 2023 10:45:54 +0000 Subject: [PATCH 109/120] WIP: net: phy: add support for Maxio MAE0621A Maxio MAE0621A is the external PHY found in some Amlogic set-top box devices based on the S905D chipset. Signed-off-by: Zhao Yang <yang_zhao@maxio-tech.com> Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../net/ethernet/stmicro/stmmac/stmmac_main.c | 7 + drivers/net/phy/Kconfig | 5 + drivers/net/phy/Makefile | 1 + drivers/net/phy/maxio.c | 262 ++++++++++++++++++ drivers/net/phy/phy_device.c | 9 + 5 files changed, 284 insertions(+) create mode 100644 drivers/net/phy/maxio.c diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 84e1740b12f1..ed48b963653e 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -7477,6 +7477,8 @@ static void stmmac_reset_tx_queue(struct stmmac_priv *priv, u32 queue) netdev_tx_reset_queue(netdev_get_tx_queue(priv->dev, queue)); } +#define MAXIO_PHY_MAE0621A_ID 0x7b744411 + /** * stmmac_reset_queues_param - reset queue parameters * @priv: device pointer @@ -7553,6 +7555,11 @@ int stmmac_resume(struct device *dev) stmmac_free_tx_skbufs(priv); stmmac_clear_descriptors(priv, &priv->dma_conf); + if (ndev->phydev->drv->config_init) { + if (ndev->phydev->phy_id == MAXIO_PHY_MAE0621A_ID) + ndev->phydev->drv->config_init(ndev->phydev); + } + stmmac_hw_setup(ndev, false); stmmac_init_coalesce(priv); stmmac_set_rx_mode(ndev); diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index c57a0262fb64..9262cf995743 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig @@ -287,6 +287,11 @@ config AT803X_PHY Currently supports the AR8030, AR8031, AR8033, AR8035 and internal QCA8337(Internal qca8k PHY) model +config MAXIO_PHY + tristate "MAXIO PHYs" + help + Supports the Maxio MAExxxx PHYs. + config QSEMI_PHY tristate "Quality Semiconductor PHYs" help diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile index f7138d3c896b..11fbac4e4b6d 100644 --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile @@ -67,6 +67,7 @@ obj-$(CONFIG_LXT_PHY) += lxt.o obj-$(CONFIG_MARVELL_10G_PHY) += marvell10g.o obj-$(CONFIG_MARVELL_PHY) += marvell.o obj-$(CONFIG_MARVELL_88X2222_PHY) += marvell-88x2222.o +obj-$(CONFIG_MAXIO_PHY) += maxio.o obj-$(CONFIG_MAXLINEAR_GPHY) += mxl-gpy.o obj-$(CONFIG_MEDIATEK_GE_PHY) += mediatek-ge.o obj-$(CONFIG_MESON_GXL_PHY) += meson-gxl.o diff --git a/drivers/net/phy/maxio.c b/drivers/net/phy/maxio.c new file mode 100644 index 000000000000..8d4db24b7ed1 --- /dev/null +++ b/drivers/net/phy/maxio.c @@ -0,0 +1,262 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * ^^ LICENSE TO BE CONFIRMED ^^ + * + * Driver for Maxio PHYs + * + * Copyright (c) 2004 maxio technology, Inc. + * + */ + +#include <linux/bitops.h> +#include <linux/phy.h> +#include <linux/module.h> +#include <linux/delay.h> +#include <linux/device.h> +#include <linux/timer.h> +#include <linux/netdevice.h> + +#define MAXIO_PAGE_SELECT 0x1f +#define MAXIO_MAE0621A_INER 0x12 +#define MAXIO_MAE0621A_INER_LINK_STATUS BIT(4) +#define MAXIO_MAE0621A_INSR 0x1d +#define MAXIO_MAE0621A_TX_DELAY (BIT(6) | BIT(7)) +#define MAXIO_MAE0621A_RX_DELAY (BIT(4) | BIT(5)) +#define MAXIO_MAE0621A_CLK_MODE_REG 0x02 +#define MAXIO_MAE0621A_WORK_STATUS_REG 0x1d + +int maxio_read_paged(struct phy_device *phydev, int page, u32 regnum) +{ + int ret = 0, oldpage; + + oldpage = phy_read(phydev, MAXIO_PAGE_SELECT); + if (oldpage >= 0) { + phy_write(phydev, MAXIO_PAGE_SELECT, page); + ret = phy_read(phydev, regnum); + } + phy_write(phydev, MAXIO_PAGE_SELECT, oldpage); + + return ret; +} + +int maxio_write_paged(struct phy_device *phydev, int page, u32 regnum, u16 val) +{ + int ret = 0, oldpage; + + oldpage = phy_read(phydev, MAXIO_PAGE_SELECT); + if (oldpage >= 0) { + phy_write(phydev, MAXIO_PAGE_SELECT, page); + ret = phy_write(phydev, regnum, val); + } + phy_write(phydev, MAXIO_PAGE_SELECT, oldpage); + + return ret; +} + +static int maxio_mae0621a_clk_init(struct phy_device *phydev) +{ + u32 workmode, clkmode, oldpage; + + oldpage = phy_read(phydev, MAXIO_PAGE_SELECT); + if (oldpage == 0xFFFF) + oldpage = phy_read(phydev, MAXIO_PAGE_SELECT); + + /* soft reset */ + phy_write(phydev, MAXIO_PAGE_SELECT, 0x0); + phy_write(phydev, MII_BMCR, BMCR_RESET | phy_read(phydev, MII_BMCR)); + + /* get workmode */ + phy_write(phydev, MAXIO_PAGE_SELECT, 0xa43); + workmode = phy_read(phydev, MAXIO_MAE0621A_WORK_STATUS_REG); + + /* get clkmode */ + phy_write(phydev, MAXIO_PAGE_SELECT, 0xd92); + clkmode = phy_read(phydev, MAXIO_MAE0621A_CLK_MODE_REG); + + /* abnormal */ + if (0 == (workmode & BIT(5))) { + if (0 == (clkmode & BIT(8))) { + /* oscillator */ + phy_write(phydev, 0x02, clkmode | BIT(8)); + pr_debug("maxio: mae0621a_clk_init clkmode 0x210a: 0x%x\n", + phydev->phy_id); + } else { + /* crystal */ + pr_debug("maxio: mae0621a_clk_init clkmode 0x200a: 0x%x\n", + phydev->phy_id); + phy_write(phydev, 0x02, clkmode & (~BIT(8))); + } + } + + phy_write(phydev, MAXIO_PAGE_SELECT, 0x0); + phy_write(phydev, MAXIO_PAGE_SELECT, oldpage); + + return 0; +} + +static int maxio_read_mmd(struct phy_device *phydev, int devnum, u16 regnum) +{ + int ret = 0, oldpage; + + oldpage = phy_read(phydev, MAXIO_PAGE_SELECT); + + if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV) { + /* eee info */ + phy_write(phydev, MAXIO_PAGE_SELECT, 0); + phy_write(phydev, 0xd, MDIO_MMD_AN); + phy_write(phydev, 0xe, MDIO_AN_EEE_ADV); + phy_write(phydev, 0xd, 0x4000 | MDIO_MMD_AN); + ret = phy_read(phydev, 0x0e); + } else { + ret = -EOPNOTSUPP; + } + phy_write(phydev, MAXIO_PAGE_SELECT, oldpage); + + return ret; +} + +static int maxio_write_mmd(struct phy_device *phydev, int devnum, u16 regnum, u16 val) +{ + int ret = 0, oldpage; + + oldpage = phy_read(phydev, MAXIO_PAGE_SELECT); + + if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV) { + /* eee info */ + phy_write(phydev, MAXIO_PAGE_SELECT, 0); + ret |= phy_write(phydev, 0xd, MDIO_MMD_AN); + ret |= phy_write(phydev, 0xe, MDIO_AN_EEE_ADV); + ret |= phy_write(phydev, 0xd, 0x4000 | MDIO_MMD_AN); + ret |= phy_write(phydev, 0xe, val); + msleep(100); + ret |= genphy_restart_aneg(phydev); + } else { + ret = -EOPNOTSUPP; + } + phy_write(phydev, MAXIO_PAGE_SELECT, oldpage); + + return ret; +} + +static int maxio_mae0621a_config_aneg(struct phy_device *phydev) +{ + return genphy_config_aneg(phydev); +} + +static int maxio_mae0621a_config_init(struct phy_device *phydev) +{ + struct device *dev = &phydev->mdio.dev; + u16 val; + int ret; + u32 broken = 0; + + maxio_mae0621a_clk_init(phydev); + + /* disable eee */ + pr_debug("eee value: 0x%x\n", maxio_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV)); + maxio_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, 0); + pr_debug("eee value: 0x%x\n", maxio_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV)); + broken |= MDIO_EEE_100TX; + broken |= MDIO_EEE_1000T; + phydev->eee_broken_modes = broken; + + /* enable auto_speed_down */ + ret = maxio_write_paged(phydev, 0xd8f, 0x0, 0x300); + + /* adjust tx/rx delay */ + switch (phydev->interface) { + case PHY_INTERFACE_MODE_RGMII: + val = 0x0; + break; + case PHY_INTERFACE_MODE_RGMII_ID: + val = MAXIO_MAE0621A_TX_DELAY | MAXIO_MAE0621A_RX_DELAY; + break; + case PHY_INTERFACE_MODE_RGMII_RXID: + val = MAXIO_MAE0621A_RX_DELAY; + break; + case PHY_INTERFACE_MODE_RGMII_TXID: + val = MAXIO_MAE0621A_TX_DELAY; + break; + default: + /* leave delays as-is. */ + goto delay_skip; + } + + ret = maxio_read_paged(phydev, 0xd96, 0x0); + + if (ret < 0) { + dev_err(dev, "Failed to update the TX delay register\n"); + return ret; + } + ret = maxio_write_paged(phydev, 0xd96, 0x0, val | ret); + + if (ret < 0) { + dev_err(dev, "Failed to update the TX delay register\n"); + return ret; + } else if (ret == 0) { + dev_dbg(dev, + "2ns delay was already %s (by pin-strapping RXD1 or bootloader configuration)\n", + val ? "enabled" : "disabled"); + } +delay_skip: + + phy_write(phydev, MII_BMCR, BMCR_RESET | phy_read(phydev, MII_BMCR)); + msleep(20); + phy_write(phydev, MAXIO_PAGE_SELECT, 0x0); + + return 0; +} + +static int maxio_mae0621a_resume(struct phy_device *phydev) +{ + int ret = genphy_resume(phydev); + + ret |= phy_write(phydev, MII_BMCR, BMCR_RESET | phy_read(phydev, MII_BMCR)); + + msleep(20); + + return ret; +} + +int maxio_mae0621a_suspend(struct phy_device *phydev) +{ + genphy_suspend(phydev); + phy_write(phydev, MAXIO_PAGE_SELECT, 0); + + return 0; +} + +static int maxio_mae0621a_status(struct phy_device *phydev) +{ + return genphy_read_status(phydev); +} + +static int maxio_mae0621a_probe(struct phy_device *phydev) +{ + int ret = maxio_mae0621a_clk_init(phydev); + + mdelay(100); + + return ret; +} + +static struct phy_driver maxio_nc_drvs[] = { + { + .phy_id = 0x7b744411, + .phy_id_mask = 0x7fffffff, + .name = "MAE0621A Gigabit Ethernet", + .features = PHY_GBIT_FEATURES, + .probe = maxio_mae0621a_probe, + .config_init = maxio_mae0621a_config_init, + .config_aneg = maxio_mae0621a_config_aneg, + .read_status = maxio_mae0621a_status, + .suspend = maxio_mae0621a_suspend, + .resume = maxio_mae0621a_resume, + }, +}; + +module_phy_driver(maxio_nc_drvs); + +MODULE_DESCRIPTION("Maxio PHY Driver"); +MODULE_AUTHOR("Zhao Yang <yang_zhao@maxio-tech.com>"); +MODULE_LICENSE("GPL"); diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 8cff61dbc4b5..d27a396b0905 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -844,6 +844,15 @@ static int get_phy_c22_id(struct mii_bus *bus, int addr, u32 *phy_id) { int phy_reg; +#ifdef CONFIG_MAXIO_PHY + /** + * An MDIO connects to multiple PHYs requiring write before read. + * This operation does not affect one MDIO connected to a single PHY + * MII_PHYSID2 is a read-only register and writing to it has no effect + */ + mdiobus_write(bus, addr, MII_PHYSID2, 0); +#endif + /* Grab the bits from PHYIR1, and put them in the upper half */ phy_reg = mdiobus_read(bus, addr, MII_PHYSID1); if (phy_reg < 0) { -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0110-WIP-dt-bindings-add-sunvell-vendor-prefix.patch ================================================ From ecd545158c8a7a097246012838dc9e06cb616c53 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Mon, 13 Feb 2023 11:38:16 +0000 Subject: [PATCH 110/120] WIP: dt-bindings: add sunvell vendor prefix Add vendor prefix for Shenzhen Sunvell Electronics Co., Ltd Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml index a585da02832e..290bc7b7bc5f 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.yaml +++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml @@ -1250,6 +1250,8 @@ patternProperties: description: Sundance DSP Inc. "^sunplus,.*": description: Sunplus Technology Co., Ltd. + "^sunvell,.*": + description: Shenzhen Sunvell Electronics Co., Ltd "^SUNW,.*": description: Sun Microsystems, Inc "^supermicro,.*": -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0111-WIP-dt-bindings-media-rc-add-rc-sunvell-t95z-plus.patch ================================================ From 60054b9f599a0bfca817da045fd8d0458395fd0b Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Mon, 13 Feb 2023 18:36:56 +0000 Subject: [PATCH 111/120] WIP: dt-bindings: media: rc: add rc-sunvell-t95z-plus Add a binding for the rc-sunvell-t95z-plus remote keymap Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/media/rc.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/media/rc.yaml b/Documentation/devicetree/bindings/media/rc.yaml index f390a5d2c82d..98946af589a0 100644 --- a/Documentation/devicetree/bindings/media/rc.yaml +++ b/Documentation/devicetree/bindings/media/rc.yaml @@ -128,6 +128,7 @@ properties: - rc-reddo - rc-snapstream-firefly - rc-streamzap + - rc-sunvell-t95z-plus - rc-su3000 - rc-tanix-tx3mini - rc-tanix-tx5max -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0112-WIP-media-rc-add-keymap-for-Sunvell-T95Z-Plus.patch ================================================ From 2e8380078a0b306ba9f71dcfca1f8c5ccf0152f0 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Mon, 13 Feb 2023 19:03:10 +0000 Subject: [PATCH 112/120] WIP: media: rc: add keymap for Sunvell T95Z Plus Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- drivers/media/rc/keymaps/Makefile | 1 + .../media/rc/keymaps/rc-sunvell-t95z-plus.c | 75 +++++++++++++++++++ include/media/rc-map.h | 1 + 3 files changed, 77 insertions(+) create mode 100644 drivers/media/rc/keymaps/rc-sunvell-t95z-plus.c diff --git a/drivers/media/rc/keymaps/Makefile b/drivers/media/rc/keymaps/Makefile index 03bc9a8d355e..17547c0bcbde 100644 --- a/drivers/media/rc/keymaps/Makefile +++ b/drivers/media/rc/keymaps/Makefile @@ -109,6 +109,7 @@ obj-$(CONFIG_RC_MAP) += \ rc-reddo.o \ rc-snapstream-firefly.o \ rc-streamzap.o \ + rc-sunvell-t95z-plus.o \ rc-su3000.o \ rc-tanix-tx3mini.o \ rc-tanix-tx5max.o \ diff --git a/drivers/media/rc/keymaps/rc-sunvell-t95z-plus.c b/drivers/media/rc/keymaps/rc-sunvell-t95z-plus.c new file mode 100644 index 000000000000..aaaf6b1c0045 --- /dev/null +++ b/drivers/media/rc/keymaps/rc-sunvell-t95z-plus.c @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c) 2023 Christian Hewitt <christianshewitt@gmail.com + */ + +#include <media/rc-map.h> +#include <linux/module.h> + +/* + * Keytable for Sunvell T95Z Plus remote control + * + */ + +static struct rc_map_table sunvell_t95z_plus[] = { + { 0xdf1c, KEY_POWER }, + // TV CONTROLS + + { 0xdf4b, KEY_PREVIOUS }, + { 0xdf01, KEY_SCREEN }, // TV + { 0xdf5d, KEY_VOLUMEUP }, + + { 0xdf4f, KEY_NEXT }, + { 0xdf5f, KEY_FAVORITES }, // KODI + { 0xdf5c, KEY_VOLUMEDOWN }, + + { 0xdf42, KEY_HOME }, + { 0xdf0a, KEY_BACK }, + + { 0xdf1a, KEY_UP }, + { 0xdf47, KEY_LEFT }, + { 0xdf06, KEY_ENTER }, + { 0xdf07, KEY_RIGHT }, + { 0xdf48, KEY_DOWN }, + + { 0xdf03, KEY_INFO }, // MOUSE + { 0xdf18, KEY_MENU }, + + { 0xdf54, KEY_1 }, + { 0xdf16, KEY_2 }, + { 0xdf15, KEY_3 }, + { 0xdf50, KEY_4 }, + { 0xdf12, KEY_5 }, + { 0xdf11, KEY_6 }, + { 0xdf4c, KEY_7 }, + { 0xdf0e, KEY_8 }, + { 0xdf0d, KEY_9 }, + { 0xdf41, KEY_WWW }, // WORLD + { 0xdf0c, KEY_0 }, + { 0xdf10, KEY_DELETE }, +}; + +static struct rc_map_list sunvell_t95z_plus_map = { + .map = { + .scan = sunvell_t95z_plus, + .size = ARRAY_SIZE(sunvell_t95z_plus), + .rc_proto = RC_PROTO_NEC, + .name = RC_MAP_SUNVELL_T95Z_PLUS, + } +}; + +static int __init init_rc_map_sunvell_t95z_plus(void) +{ + return rc_map_register(&sunvell_t95z_plus_map); +} + +static void __exit exit_rc_map_sunvell_t95z_plus(void) +{ + rc_map_unregister(&sunvell_t95z_plus_map); +} + +module_init(init_rc_map_sunvell_t95z_plus) +module_exit(exit_rc_map_sunvell_t95z_plus) + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Christian Hewitt <christianshewitt@gmail.com>"); diff --git a/include/media/rc-map.h b/include/media/rc-map.h index dadd4d27a760..b561b122e498 100644 --- a/include/media/rc-map.h +++ b/include/media/rc-map.h @@ -315,6 +315,7 @@ struct rc_map *rc_map_get(const char *name); #define RC_MAP_REDDO "rc-reddo" #define RC_MAP_SNAPSTREAM_FIREFLY "rc-snapstream-firefly" #define RC_MAP_STREAMZAP "rc-streamzap" +#define RC_MAP_SUNVELL_T95Z_PLUS "rc-sunvell-t95z-plus" #define RC_MAP_SU3000 "rc-su3000" #define RC_MAP_TANIX_TX3MINI "rc-tanix-tx3mini" #define RC_MAP_TANIX_TX5MAX "rc-tanix-tx5max" -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0113-WIP-dt-bindings-arm-amlogic-add-support-for-Sunvell-.patch ================================================ From 3cba9548f0cd3d983ffa349516afdb0adf4a62ee Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Mon, 13 Feb 2023 11:41:09 +0000 Subject: [PATCH 113/120] WIP: dt-bindings: arm: amlogic: add support for Sunvell T95Z Plus Sunvell T95Z Plus is an Android STB based on the Amlogic Q200 reference board with S912 chip. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/arm/amlogic.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml index dea5d15da404..800ecbc6efa6 100644 --- a/Documentation/devicetree/bindings/arm/amlogic.yaml +++ b/Documentation/devicetree/bindings/arm/amlogic.yaml @@ -140,6 +140,7 @@ properties: - minix,neo-u9h - nexbox,a1 - oranth,tx9-pro + - sunvell,t95z-plus - tronsmart,vega-s96 - videostrong,gxm-kiii-pro - wetek,core2 -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0114-WIP-arm64-dts-meson-add-support-for-Sunvell-T95Z-Plu.patch ================================================ From 44e39b9ad7a1094d7cfd788481a219138cf34336 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Mon, 13 Feb 2023 11:46:39 +0000 Subject: [PATCH 114/120] WIP: arm64: dts: meson: add support for Sunvell T95Z Plus Sunvell T95Z Pluz is based on the Amlogic Q200 reference design with an S912 chip and the following specifications: - 2GB DDR3 RAM - 16GB eMMC - 10/100/1000 Base-T Ethernet - AP6255 Wireless (802.11 b/g/n/ac, BT 4.1) - HDMI 2.0a video - FTD628 VFD for clock/status - 2x USB 2.0 ports - IR receiver - 1x Power LED (white) - 1x Update/Reset button (underside) - 1x micro SD card slot Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/Makefile | 1 + .../boot/dts/amlogic/meson-gxm-t95z-plus.dts | 91 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxm-t95z-plus.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index 8b4155e0140c..8ce0c8697c94 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -79,6 +79,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-gxm-q201.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxm-rbox-pro.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxm-s912-libretech-pc.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxm-tx9-pro.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-gxm-t95z-plus.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxm-vega-s96.dtb dtb-$(CONFIG_ARCH_MESON) += meson-gxm-wetek-core2.dtb dtb-$(CONFIG_ARCH_MESON) += meson-s4-s805x2-aq222.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-t95z-plus.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-t95z-plus.dts new file mode 100644 index 000000000000..30ed5b6d325f --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-gxm-t95z-plus.dts @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) Christian Hewitt <christianshewitt@gmail.com> + */ + +/dts-v1/; + +#include "meson-gxm.dtsi" +#include "meson-gx-p23x-q20x.dtsi" +#include <dt-bindings/input/input.h> +#include <dt-bindings/leds/common.h> + +/ { + compatible = "sunvell,t95z-plus", "amlogic,s912", "amlogic,meson-gxm"; + model = "Sunvell T95Z Plus"; + + leds { + compatible = "gpio-leds"; + + led-white { + color = <LED_COLOR_ID_WHITE>; + function = LED_FUNCTION_POWER; + gpios = <&gpio_ao GPIOAO_9 GPIO_ACTIVE_HIGH>; + default-state = "on"; + panic-indicator; + }; + }; + + adc-keys { + compatible = "adc-keys"; + io-channels = <&saradc 0>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1710000>; + + button-function { + label = "update"; + linux,code = <KEY_VENDOR>; + press-threshold-microvolt = <10000>; + }; + }; +}; + +ðmac { + pinctrl-0 = <ð_pins>; + pinctrl-names = "default"; + + phy-handle = <&external_phy>; + phy-mode = "rgmii"; + + amlogic,tx-delay-ns = <2>; +}; + +&external_mdio { + external_phy: ethernet-phy@1 { + /* ZTE ZX2AA500 */ + compatible = "ethernet-phy-id0381.5c11", + "ethernet-phy-ieee802.3-c22"; + reg = <1>; + max-speed = <1000>; + + reset-assert-us = <10000>; + reset-deassert-us = <80000>; + reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>; + + interrupt-parent = <&gpio_intc>; + /* MAC_INTR on GPIOZ_15 */ + interrupts = <25 IRQ_TYPE_LEVEL_LOW>; + }; +}; + +&sd_emmc_a { + brcmf: wifi@1 { + reg = <1>; + compatible = "brcm,bcm4329-fmac"; + }; +}; + +&uart_A { + status = "okay"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "brcm,bcm43438-bt"; + shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + max-speed = <2000000>; + clocks = <&wifi32k>; + clock-names = "lpo"; + }; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0115-WIP-arm64-dts-meson-add-SPI-VFD-to-Sunvell-T95Z-Plus.patch ================================================ From af63c7cf2d001f7c3e86c310e8e0c42e681c1e8a Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Mon, 13 Feb 2023 13:11:14 +0000 Subject: [PATCH 115/120] WIP: arm64: dts: meson: add SPI VFD to Sunvell T95Z Plus making guesses at the config.. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../boot/dts/amlogic/meson-gxm-t95z-plus.dts | 79 ++++++++++++++++++- 1 file changed, 77 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-t95z-plus.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-t95z-plus.dts index 30ed5b6d325f..5f4bd19d5d77 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxm-t95z-plus.dts +++ b/arch/arm64/boot/dts/amlogic/meson-gxm-t95z-plus.dts @@ -17,11 +17,18 @@ / { leds { compatible = "gpio-leds"; - led-white { - color = <LED_COLOR_ID_WHITE>; + led-green { + color = <LED_COLOR_ID_GREEN>; function = LED_FUNCTION_POWER; gpios = <&gpio_ao GPIOAO_9 GPIO_ACTIVE_HIGH>; default-state = "on"; + }; + + led-blue { + color = <LED_COLOR_ID_BLUE>; + function = LED_FUNCTION_POWER; + gpios = <&gpio GPIODV_25 GPIO_ACTIVE_HIGH>; + default-state = "off"; panic-indicator; }; }; @@ -38,6 +45,74 @@ button-function { press-threshold-microvolt = <10000>; }; }; + + spi { + compatible = "spi-gpio"; + + /* T95Z v1 (enabled) */ + sck-gpios = <&gpio GPIODV_22 GPIO_ACTIVE_HIGH>; + mosi-gpios = <&gpio GPIODV_23 GPIO_ACTIVE_HIGH>; + cs-gpios = <&gpio GPIODV_21 GPIO_ACTIVE_LOW>; + + /* T95Z v2 (disabled) + sck-gpios = <&gpio GPIODV_19 GPIO_ACTIVE_HIGH>; + mosi-gpios = <&gpio GPIODV_18 GPIO_ACTIVE_HIGH>; + cs-gpios = <&gpio GPIODV_20 GPIO_ACTIVE_LOW>; + */ + + num-chipselects = <1>; + #address-cells = <1>; + #size-cells = <0>; + + tm1628: led-controller@0 { + compatible = "titanmec,tm1628"; + reg = <0>; + spi-3wire; + spi-lsb-first; + spi-rx-delay-us = <1>; + spi-max-frequency = <500000>; + #address-cells = <2>; + #size-cells = <0>; + + titanmec,segment-mapping = /bits/ 8 <4 5 6 1 2 3 7>; + titanmec,grid = /bits/ 8 <2 3 4 5 1>; + + alarm@1,1 { + reg = <1 1>; + function = LED_FUNCTION_ALARM; + }; + + usb@1,2 { + reg = <1 2>; + function = LED_FUNCTION_USB; + }; + + play@1,3 { + reg = <1 3>; + function = "play"; + }; + + pause@1,4 { + reg = <1 4>; + function = "pause"; + }; + + colon@1,5 { + reg = <1 5>; + function = "colon"; + }; + + lan@1,6 { + reg = <1 6>; + function = LED_FUNCTION_LAN; + }; + + wlan@1,7 { + reg = <1 7>; + function = LED_FUNCTION_WLAN; + }; + }; + }; }; ðmac { -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0116-WIP-dt-bindings-arm-amlogic-add-support-for-BananaPi.patch ================================================ From b5c002dd9e9e461be065de69ee0e6d25ac32eeb4 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Fri, 17 Feb 2023 19:25:18 +0000 Subject: [PATCH 116/120] WIP: dt-bindings: arm: amlogic: add support for BananaPi M2S variants BananaPi M2S ships in two variants with Amlogic S922X or A311D chips. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- Documentation/devicetree/bindings/arm/amlogic.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml index 800ecbc6efa6..fb93a6e51061 100644 --- a/Documentation/devicetree/bindings/arm/amlogic.yaml +++ b/Documentation/devicetree/bindings/arm/amlogic.yaml @@ -169,6 +169,7 @@ properties: - description: Boards with the Amlogic Meson G12B A311D SoC items: - enum: + - bananapi,bpi-m2s - khadas,vim3 - radxa,zero2 - const: amlogic,a311d @@ -188,8 +189,10 @@ properties: - azw,gsking-x - azw,gtking - azw,gtking-pro + - bananapi,bpi-m2s - dream,dreambox-one - dream,dreambox-two + - hardkernel,odroid-go-ultra - hardkernel,odroid-n2 - hardkernel,odroid-n2-plus - khadas,vim3 -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0117-WIP-arm64-dts-meson-add-support-for-BananaPi-M2S-var.patch ================================================ From e3881a15e8b7bae508479ca00187ccc44f6435f2 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Fri, 17 Feb 2023 09:22:24 +0000 Subject: [PATCH 117/120] WIP: arm64: dts: meson: add support for BananaPi M2S variants BananaPi M2S ships in Amlogic S922X and A311D variants with the following common specifications: - 16GB eMMC - HDMI 2.1a video - 2x 10/100/1000 Base-T Ethernet (1x RTL8211F, 1x RTL811H) - 2x USB 2.0 ports - 2x Status LED's (green/blue) - 1x Power/Reset button - 1x micro SD card slot - 40-pin GPIO header - PWM fan header - UART header The S992X variant has: - 2GB LPDDR4 RAM The A311D variant has: - 4GB LPDDR4 RAM - NPU (5.0 TOPS) - MIPI DSI header - MIPI CSI header An optional RTL8822CS SDIO WiFi/BT mezzanine is available for both board variants. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/Makefile | 2 + .../amlogic/meson-g12b-a311d-bananapi-m2s.dts | 37 ++ .../boot/dts/amlogic/meson-g12b-bananapi.dtsi | 521 ++++++++++++++++++ .../amlogic/meson-g12b-s922x-bananapi-m2s.dts | 14 + 4 files changed, 574 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/meson-g12b-a311d-bananapi-m2s.dts create mode 100644 arch/arm64/boot/dts/amlogic/meson-g12b-bananapi.dtsi create mode 100644 arch/arm64/boot/dts/amlogic/meson-g12b-s922x-bananapi-m2s.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index 8ce0c8697c94..172355a2afb0 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -9,6 +9,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-g12a-sei510.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12a-tanix-tx5max.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12a-u200.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12a-x96-max.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-g12b-a311d-bananapi-m2s.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-a311d-khadas-vim3.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-bananapi-cm4-cm4io.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-dreambox-one.dtb @@ -19,6 +20,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2-plus.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-radxa-zero2.dtb +dtb-$(CONFIG_ARCH_MESON) += meson-g12b-s922x-bananapi-m2s.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-s922x-khadas-vim3.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-ugoos-am6.dtb dtb-$(CONFIG_ARCH_MESON) += meson-g12b-ugoos-am6-plus.dtb diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-a311d-bananapi-m2s.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-a311d-bananapi-m2s.dts new file mode 100644 index 000000000000..ac6f7ae1d103 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-g12b-a311d-bananapi-m2s.dts @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2023 Christian Hewitt <christianshewitt@gmail.com> + */ + +/dts-v1/; + +#include "meson-g12b-a311d.dtsi" +#include "meson-g12b-bananapi.dtsi" + +/ { + compatible = "bananapi,bpi-m2s", "amlogic,a311d", "amlogic,g12b"; + model = "BananaPi M2S"; + + aliases { + i2c0 = &i2c1; + i2c1 = &i2c3; + }; +}; + +/* Camera (CSI) bus */ +&i2c1 { + status = "okay"; + pinctrl-0 = <&i2c1_sda_h6_pins>, <&i2c1_sck_h7_pins>; + pinctrl-names = "default"; +}; + +/* Display (DSI) bus */ +&i2c3 { + status = "okay"; + pinctrl-0 = <&i2c3_sda_a_pins>, <&i2c3_sck_a_pins>; + pinctrl-names = "default"; +}; + +&npu { + status = "okay"; +}; diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-bananapi.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b-bananapi.dtsi new file mode 100644 index 000000000000..d02b50a0f7a8 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-g12b-bananapi.dtsi @@ -0,0 +1,521 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2019 BayLibre, SAS + * Author: Neil Armstrong <narmstrong@baylibre.com> + * Copyright (c) 2023 Christian Hewitt <christianshewitt@gmail.com> + */ + +#include <dt-bindings/input/input.h> +#include <dt-bindings/leds/common.h> +#include <dt-bindings/gpio/meson-g12a-gpio.h> +#include <dt-bindings/sound/meson-g12a-tohdmitx.h> + +/ { + aliases { + serial0 = &uart_AO; + ethernet0 = ðmac; + rtc1 = &vrtc; + }; + + chosen { + stdout-path = "serial0:115200n8"; + }; + + memory@0 { + device_type = "memory"; + reg = <0x0 0x0 0x0 0x80000000>; /* 2 GiB or 4 GiB */ + }; + + adc-keys { + compatible = "adc-keys"; + io-channels = <&saradc 2>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1710000>; + + button-function { + label = "RST"; + linux,code = <KEY_POWER>; + press-threshold-microvolt = <10000>; + }; + }; + + emmc_pwrseq: emmc-pwrseq { + compatible = "mmc-pwrseq-emmc"; + reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>; + }; + + fan0: pwm-fan { + compatible = "pwm-fan"; + #cooling-cells = <2>; + cooling-min-state = <0>; + cooling-max-state = <3>; + cooling-levels = <0 120 170 220>; + pwms = <&pwm_cd 1 40000 0>; + }; + + hdmi-connector { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_connector_in: endpoint { + remote-endpoint = <&hdmi_tx_tmds_out>; + }; + }; + }; + + leds { + compatible = "gpio-leds"; + + blue { + color = <LED_COLOR_ID_BLUE>; + function = LED_FUNCTION_STATUS; + gpios = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_LOW>; + linux,default-trigger = "heartbeat"; + }; + + green { + color = <LED_COLOR_ID_GREEN>; + function = LED_FUNCTION_STATUS; + gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_LOW>; + }; + }; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; + clocks = <&wifi32k>; + clock-names = "ext_clock"; + }; + + wifi32k: wifi32k { + compatible = "pwm-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */ + }; + + dc_in: regulator-dc-in { + compatible = "regulator-fixed"; + regulator-name = "DC_IN"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + regulator-always-on; + }; + + vcc_5v: regulator-vcc-5v { + compatible = "regulator-fixed"; + regulator-name = "VCC_5V"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&dc_in>; + + gpio = <&gpio GPIOH_8 GPIO_OPEN_DRAIN>; + enable-active-high; + }; + + vcc_3v3: regulator-vcc-3v3 { + compatible = "regulator-fixed"; + regulator-name = "VCC_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vsys_3v3>; + regulator-always-on; + }; + + vcc_1v8: regulator-vcc-1v8 { + compatible = "regulator-fixed"; + regulator-name = "VCC_1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc_3v3>; + regulator-always-on; + }; + + vddao_1v8: regulator-vddao-1v8 { + compatible = "regulator-fixed"; + regulator-name = "VDDIO_AO1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vsys_3v3>; + regulator-always-on; + }; + + vddcpu_a: regulator-vddcpu-a { + compatible = "pwm-regulator"; + regulator-name = "VDDCPU_A"; + regulator-min-microvolt = <690000>; + regulator-max-microvolt = <1050000>; + pwm-supply = <&dc_in>; + pwms = <&pwm_ab 0 1250 0>; + pwm-dutycycle-range = <100 0>; + regulator-boot-on; + regulator-always-on; + }; + + vddcpu_b: regulator-vddcpu-b { + compatible = "pwm-regulator"; + regulator-name = "VDDCPU_B"; + regulator-min-microvolt = <690000>; + regulator-max-microvolt = <1050000>; + pwm-supply = <&vsys_3v3>; + pwms = <&pwm_AO_cd 1 1250 0>; + pwm-dutycycle-range = <100 0>; + regulator-boot-on; + regulator-always-on; + }; + + vsys_3v3: regulator-vsys-3v3 { + compatible = "regulator-fixed"; + regulator-name = "VSYS_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&dc_in>; + regulator-always-on; + }; + + emmc_1v8: regulator-emmc-1v8 { + compatible = "regulator-fixed"; + regulator-name = "EMMC_AO1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc_3v3>; + regulator-always-on; + }; + + usb_pwr: regulator-usb-pwr { + compatible = "regulator-fixed"; + regulator-name = "USB_PWR"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&vcc_5v>; + + gpio = <&gpio GPIOA_6 GPIO_ACTIVE_HIGH>; + enable-active-high; + }; + + sound { + compatible = "amlogic,axg-sound-card"; + model = "BPI-M2S"; + audio-aux-devs = <&tdmout_b>; + audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1", + "TDMOUT_B IN 1", "FRDDR_B OUT 1", + "TDMOUT_B IN 2", "FRDDR_C OUT 1", + "TDM_B Playback", "TDMOUT_B OUT"; + + assigned-clocks = <&clkc CLKID_MPLL2>, + <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + + dai-link-0 { + sound-dai = <&frddr_a>; + }; + + dai-link-1 { + sound-dai = <&frddr_b>; + }; + + dai-link-2 { + sound-dai = <&frddr_c>; + }; + + /* 8ch hdmi interface */ + dai-link-3 { + sound-dai = <&tdmif_b>; + dai-format = "i2s"; + dai-tdm-slot-tx-mask-0 = <1 1>; + dai-tdm-slot-tx-mask-1 = <1 1>; + dai-tdm-slot-tx-mask-2 = <1 1>; + dai-tdm-slot-tx-mask-3 = <1 1>; + mclk-fs = <256>; + + codec { + sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>; + }; + }; + + /* hdmi glue */ + dai-link-4 { + sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>; + + codec { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&arb { + status = "okay"; +}; + +&clkc_audio { + status = "okay"; +}; + +&cecb_AO { + pinctrl-0 = <&cec_ao_b_h_pins>; + pinctrl-names = "default"; + status = "okay"; + hdmi-phandle = <&hdmi_tx>; +}; + +&cpu0 { + cpu-supply = <&vddcpu_b>; + operating-points-v2 = <&cpu_opp_table_0>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu1 { + cpu-supply = <&vddcpu_b>; + operating-points-v2 = <&cpu_opp_table_0>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu100 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu101 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu102 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu103 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +ðmac { + pinctrl-0 = <ð_pins>, <ð_rgmii_pins>; + pinctrl-names = "default"; + status = "okay"; + phy-mode = "rgmii"; + phy-handle = <&external_phy>; + amlogic,tx-delay-ns = <2>; +}; + +&ext_mdio { + external_phy: ethernet-phy@0 { + /* Realtek RTL8211F (0x001cc916) */ + reg = <0>; + max-speed = <1000>; + + reset-assert-us = <10000>; + reset-deassert-us = <80000>; + reset-gpios = <&gpio GPIOZ_15 (GPIO_ACTIVE_LOW | GPIO_OPEN_DRAIN)>; + + interrupt-parent = <&gpio_intc>; + /* MAC_INTR on GPIOZ_14 */ + interrupts = <26 IRQ_TYPE_LEVEL_LOW>; + }; +}; + +&frddr_a { + status = "okay"; +}; + +&frddr_b { + status = "okay"; +}; + +&frddr_c { + status = "okay"; +}; + +&hdmi_tx { + status = "okay"; + pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>; + pinctrl-names = "default"; + hdmi-supply = <&vcc_5v>; +}; + +&hdmi_tx_tmds_port { + hdmi_tx_tmds_out: endpoint { + remote-endpoint = <&hdmi_connector_in>; + }; +}; + +/* Main i2c bus */ +&i2c2 { + status = "okay"; + pinctrl-0 = <&i2c2_sda_x_pins>, <&i2c2_sck_x_pins>; + pinctrl-names = "default"; +}; + +&pcie { + status = "okay"; + reset-gpios = <&gpio GPIOA_8 GPIO_ACTIVE_LOW>; +}; + +&pwm_ab { + status = "okay"; + pinctrl-0 = <&pwm_a_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin0"; +}; + +&pwm_cd { + status = "okay"; + pinctrl-0 = <&pwm_d_x6_pins>; + pinctrl-names = "default"; + pwm-gpios = <&gpio GPIOAO_10 GPIO_ACTIVE_HIGH>; +}; + +&pwm_ef { + status = "okay"; + pinctrl-0 = <&pwm_e_pins>; + pinctrl-names = "default"; +}; + +&pwm_AO_cd { + pinctrl-0 = <&pwm_ao_d_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin1"; + status = "okay"; +}; + +&saradc { + status = "okay"; + vref-supply = <&vddao_1v8>; +}; + +/* SDIO */ +&sd_emmc_a { + /* enable if WiFi/BT board connected */ + status = "disabled"; + pinctrl-0 = <&sdio_pins>; + pinctrl-1 = <&sdio_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + #address-cells = <1>; + #size-cells = <0>; + + bus-width = <4>; + sd-uhs-sdr104; + max-frequency = <50000000>; + + non-removable; + disable-wp; + + /* WiFi firmware requires power in suspend */ + keep-power-in-suspend; + + mmc-pwrseq = <&sdio_pwrseq>; + + vmmc-supply = <&vsys_3v3>; + vqmmc-supply = <&vddao_1v8>; + + rtl8822cs: wifi@1 { + reg = <1>; + }; +}; + +/* SD card */ +&sd_emmc_b { + status = "okay"; + pinctrl-0 = <&sdcard_c_pins>; + pinctrl-1 = <&sdcard_clk_gate_c_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <4>; + cap-sd-highspeed; + max-frequency = <50000000>; + disable-wp; + + cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>; + vmmc-supply = <&vsys_3v3>; + vqmmc-supply = <&vsys_3v3>; +}; + +/* eMMC */ +&sd_emmc_c { + status = "okay"; + pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>; + pinctrl-1 = <&emmc_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <8>; + cap-mmc-highspeed; + mmc-ddr-1_8v; + mmc-hs200-1_8v; + max-frequency = <200000000>; + disable-wp; + + mmc-pwrseq = <&emmc_pwrseq>; + vmmc-supply = <&vcc_3v3>; + vqmmc-supply = <&emmc_1v8>; +}; + +&tdmif_b { + status = "okay"; +}; + +&tdmout_b { + status = "okay"; +}; + +&tohdmitx { + status = "okay"; +}; + +&uart_A { + /* enable if WiFi/BT board connected */ + status = "disabled"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "realtek,rtl8822cs-bt"; + enable-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + host-wake-gpios = <&gpio GPIOX_19 GPIO_ACTIVE_HIGH>; + device-wake-gpios = <&gpio GPIOX_18 GPIO_ACTIVE_HIGH>; + }; +}; + +&uart_AO { + status = "okay"; + pinctrl-0 = <&uart_ao_a_pins>; + pinctrl-names = "default"; +}; + +&usb2_phy0 { + phy-supply = <&dc_in>; +}; + +&usb2_phy1 { + phy-supply = <&usb_pwr>; +}; + +&usb3_pcie_phy { + phy-supply = <&usb_pwr>; +}; + +&usb { + status = "okay"; + dr_mode = "peripheral"; + phys = <&usb2_phy0>, <&usb2_phy1>; + phy-names = "usb2-phy0", "usb2-phy1"; +}; diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-s922x-bananapi-m2s.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-s922x-bananapi-m2s.dts new file mode 100644 index 000000000000..7f66f263a2ce --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/meson-g12b-s922x-bananapi-m2s.dts @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2023 Christian Hewitt <christianshewitt@gmail.com> + */ + +/dts-v1/; + +#include "meson-g12b-s922x.dtsi" +#include "meson-g12b-bananapi.dtsi" + +/ { + compatible = "bananapi,bpi-m2s", "amlogic,s922x", "amlogic,g12b"; + model = "BananaPi M2S"; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0118-WIP-arm64-dts-meson-p23x-q20x-fix-usb-init-don-t-for.patch ================================================ From eebf83427d051da9c8424ab5c351d98e31256c95 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Tue, 14 Feb 2023 08:28:00 +0000 Subject: [PATCH 118/120] WIP: arm64: dts: meson: p23x-q20x: fix usb init - don't force otg Forcing OTG in the p23x-q20x dtsi causes USB problems on multiple boards: [ 1.246056] dwc2 c9100000.usb: supply vusb_d not found, using dummy regulator [ 1.246442] dwc2 c9100000.usb: supply vusb_a not found, using dummy regulator [ 1.258386] dwc2 c9100000.usb: dwc2_core_reset: HANG! Soft Reset timeout GRSTCTL_CSFTRST [ 1.258404] dwc2: probe of c9100000.usb failed with error -16 Using 'peripheral' mode clears the error but still leaves boards without working USB ports. Using 'host' mode results in working USB ports: [ 1.760353] dwc2 c9100000.usb: supply vusb_d not found, using dummy regulator [ 1.760706] dwc2 c9100000.usb: supply vusb_a not found, using dummy regulator [ 1.761307] dwc2 c9100000.usb: EPs: 7, dedicated fifos, 712 entries in SPRAM Define 'host' dr_mode as a safer default for all GXL/GXM boards that consume the common dtsi. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi index b0d008fc5f7a..025cefd6939a 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi @@ -324,5 +324,5 @@ &uart_AO { &usb { status = "okay"; - dr_mode = "otg"; + dr_mode = "host"; }; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0119-WIP-arm64-dts-meson-add-WiFi-BT-support-to-BananaPi-.patch ================================================ From 9aac0fbe0ef9eb783562b52461504fd221efe92b Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Tue, 7 Mar 2023 13:17:16 +0000 Subject: [PATCH 119/120] WIP: arm64: dts: meson: add WiFi/BT support to BananaPi M5 The BPI-M5 has an optional RTL8822CS WiFi/BT mezzanine board. Describe the board but mark the sd_mmc_a and uart_A nodes disabled so they can be enabled via overlay or fdtput when the baord is connected. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../dts/amlogic/meson-sm1-bananapi-m5.dts | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts index 34b3238ee0a0..0b434572a789 100644 --- a/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts +++ b/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts @@ -25,6 +25,20 @@ cvbs_connector_in: endpoint { }; }; + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; + clocks = <&wifi32k>; + clock-names = "ext_clock"; + }; + + wifi32k: wifi32k { + compatible = "pwm-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */ + }; + sound { compatible = "amlogic,axg-sound-card"; model = "BPI-M5"; @@ -173,6 +187,36 @@ &frddr_c { status = "okay"; }; +/* SDIO */ +&sd_emmc_a { + /* enable if WiFi/BT board connected */ + status = "disabled"; + pinctrl-0 = <&sdio_pins>; + pinctrl-1 = <&sdio_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + #address-cells = <1>; + #size-cells = <0>; + + bus-width = <4>; + sd-uhs-sdr104; + max-frequency = <50000000>; + + non-removable; + disable-wp; + + /* WiFi firmware requires power in suspend */ + keep-power-in-suspend; + + mmc-pwrseq = <&sdio_pwrseq>; + + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vddao_1v8>; + + rtl8822cs: wifi@1 { + reg = <1>; + }; +}; + &tdmif_b { status = "okay"; }; @@ -220,3 +264,18 @@ &toddr_b { &toddr_c { status = "okay"; }; + +&uart_A { + /* enable if WiFi/BT board connected */ + status = "disabled"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "realtek,rtl8822cs-bt"; + enable-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + host-wake-gpios = <&gpio GPIOX_19 GPIO_ACTIVE_HIGH>; + device-wake-gpios = <&gpio GPIOX_18 GPIO_ACTIVE_HIGH>; + }; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0120-WIP-media-meson-vdec-fix-memory-leak-of-new_frame.patch ================================================ From ffd9b1381e35fb4244a7173dfa8fbddfcc37c195 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Tue, 14 Mar 2023 01:13:15 +0000 Subject: [PATCH 120/120] WIP: media: meson: vdec: fix memory leak of 'new_frame' Reported-by: kernel test robot <lkp@intel.com> Reported-by: Dan Carpenter <error27@gmail.com> Link: https://lore.kernel.org/r/202303120441.YFGHDOya-lkp@intel.com/ Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- drivers/staging/media/meson/vdec/codec_hevc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/staging/media/meson/vdec/codec_hevc.c b/drivers/staging/media/meson/vdec/codec_hevc.c index fcaaa1ad50b8..b0d8623c3c7d 100644 --- a/drivers/staging/media/meson/vdec/codec_hevc.c +++ b/drivers/staging/media/meson/vdec/codec_hevc.c @@ -731,6 +731,7 @@ codec_hevc_prepare_new_frame(struct amvdec_session *sess) vbuf = v4l2_m2m_dst_buf_remove(sess->m2m_ctx); if (!vbuf) { dev_err(sess->core->dev, "No dst buffer available\n"); + kfree(new_frame); return NULL; } -- 2.34.1 ================================================ FILE: projects/Amlogic/filesystem/usr/bin/cputemp ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) case $(dtsoc) in amlogic,g12*|amlogic,sm1) TEMP=$(cat /sys/devices/virtual/thermal/thermal_zone1/temp) ;; *) TEMP=$(cat /sys/class/hwmon/hwmon0/temp1_input) ;; esac TEMP="$(( $TEMP / 1000 ))" echo "${TEMP} C" ================================================ FILE: projects/Amlogic/kodi/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8" ?> <settings version="1"> <section id="system"> <category id="display"> <group id="1"> <setting id="videoscreen.screenmode"> <visible>true</visible> <default>0192001080060.00000pstd</default> </setting> <setting id="videoscreen.limitedrange"> <visible>false</visible> </setting> <setting id="videoscreen.limitguisize"> <visible>true</visible> <default>3</default> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/Amlogic/linux/linux.aarch64.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm64 6.1.19 Kernel Configuration # CONFIG_CC_VERSION_TEXT="aarch64-none-elf-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_SYSVIPC_COMPAT=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_IRQ_IPI=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_IRQ_MSI_IOMMU=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_CONTEXT_TRACKING=y CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y # CONFIG_BPF_JIT is not set # CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_BPF_PRELOAD is not set # end of BPF subsystem CONFIG_PREEMPT_BUILD=y # CONFIG_PREEMPT_NONE is not set # CONFIG_PREEMPT_VOLUNTARY is not set CONFIG_PREEMPT=y CONFIG_PREEMPT_COUNT=y CONFIG_PREEMPTION=y # CONFIG_PREEMPT_DYNAMIC is not set # CONFIG_SCHED_CORE is not set # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_SCHED_AVG_IRQ=y # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_TASKSTATS is not set # CONFIG_PSI is not set # end of CPU/Task time and stats accounting CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y CONFIG_PREEMPT_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_RCU=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 # CONFIG_PRINTK_INDEX is not set CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # # end of Scheduler features CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_CC_HAS_INT128=y CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set CONFIG_CGROUP_PIDS=y CONFIG_CGROUP_RDMA=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y # CONFIG_CGROUP_MISC is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_TIME_NS=y CONFIG_IPC_NS=y # CONFIG_USER_NS is not set CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_CHECKPOINT_RESTORE is not set CONFIG_SCHED_AUTOGROUP=y # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 # CONFIG_RD_GZIP is not set # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set # CONFIG_RD_LZ4 is not set # CONFIG_RD_ZSTD is not set CONFIG_INITRAMFS_COMPRESSION_NONE=y CONFIG_BOOT_CONFIG=y # CONFIG_BOOT_CONFIG_EMBED is not set CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_EXPERT=y CONFIG_UID16=y CONFIG_MULTIUSER=y CONFIG_SGETMASK_SYSCALL=y CONFIG_SYSFS_SYSCALL=y CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y 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 CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y # CONFIG_PC104 is not set # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_SYSTEM_DATA_VERIFICATION=y CONFIG_PROFILING=y # end of General setup CONFIG_ARM64=y CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_64BIT=y CONFIG_MMU=y CONFIG_ARM64_PAGE_SHIFT=12 CONFIG_ARM64_CONT_PTE_SHIFT=4 CONFIG_ARM64_CONT_PMD_SHIFT=4 CONFIG_ARCH_MMAP_RND_BITS_MIN=18 CONFIG_ARCH_MMAP_RND_BITS_MAX=33 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_STACKTRACE_SUPPORT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_LOCKDEP_SUPPORT=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CSUM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y CONFIG_SMP=y CONFIG_KERNEL_MODE_NEON=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_PGTABLE_LEVELS=4 CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_ARCH_PROC_KCORE_TEXT=y # # Platform selection # # CONFIG_ARCH_ACTIONS is not set # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_APPLE is not set # CONFIG_ARCH_BCM is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_BITMAIN is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_SPARX5 is not set # CONFIG_ARCH_K3 is not set # CONFIG_ARCH_LG1K is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_KEEMBAY is not set # CONFIG_ARCH_MEDIATEK is not set CONFIG_ARCH_MESON=y # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_NXP is not set # CONFIG_ARCH_NPCM is not set # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_REALTEK is not set # CONFIG_ARCH_RENESAS is not set # CONFIG_ARCH_ROCKCHIP is not set # CONFIG_ARCH_SEATTLE is not set # CONFIG_ARCH_INTEL_SOCFPGA is not set # CONFIG_ARCH_SYNQUACER is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_SPRD is not set # CONFIG_ARCH_THUNDER is not set # CONFIG_ARCH_THUNDER2 is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_VISCONTI is not set # CONFIG_ARCH_XGENE is not set # CONFIG_ARCH_ZYNQMP is not set # end of Platform selection # # Kernel Features # # # ARM errata workarounds via the alternatives framework # CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y CONFIG_ARM64_ERRATUM_826319=y CONFIG_ARM64_ERRATUM_827319=y CONFIG_ARM64_ERRATUM_824069=y CONFIG_ARM64_ERRATUM_819472=y CONFIG_ARM64_ERRATUM_832075=y CONFIG_ARM64_ERRATUM_1742098=y CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y CONFIG_ARM64_ERRATUM_1024718=y CONFIG_ARM64_ERRATUM_1418040=y CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y CONFIG_ARM64_ERRATUM_1165522=y CONFIG_ARM64_ERRATUM_1319367=y CONFIG_ARM64_ERRATUM_1530923=y CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y CONFIG_ARM64_ERRATUM_2441007=y CONFIG_ARM64_ERRATUM_1286807=y CONFIG_ARM64_ERRATUM_1463225=y CONFIG_ARM64_ERRATUM_1542419=y CONFIG_ARM64_ERRATUM_1508412=y CONFIG_ARM64_ERRATUM_2051678=y # CONFIG_ARM64_ERRATUM_2077057 is not set CONFIG_ARM64_ERRATUM_2658417=y CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE=y CONFIG_ARM64_ERRATUM_2054223=y CONFIG_ARM64_ERRATUM_2067961=y CONFIG_ARM64_ERRATUM_2441009=y CONFIG_ARM64_ERRATUM_2457168=y # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set # CONFIG_CAVIUM_ERRATUM_27456 is not set # CONFIG_CAVIUM_ERRATUM_30115 is not set # CONFIG_CAVIUM_TX2_ERRATUM_219 is not set # CONFIG_FUJITSU_ERRATUM_010001 is not set # CONFIG_HISILICON_ERRATUM_161600802 is not set # CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set # CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set # CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set # CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set # CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set # CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set # end of ARM errata workarounds via the alternatives framework CONFIG_ARM64_4K_PAGES=y # CONFIG_ARM64_16K_PAGES is not set # CONFIG_ARM64_64K_PAGES is not set # CONFIG_ARM64_VA_BITS_39 is not set CONFIG_ARM64_VA_BITS_48=y CONFIG_ARM64_VA_BITS=48 CONFIG_ARM64_PA_BITS_48=y CONFIG_ARM64_PA_BITS=48 # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_CPU_LITTLE_ENDIAN=y CONFIG_SCHED_MC=y # CONFIG_SCHED_CLUSTER is not set CONFIG_SCHED_SMT=y CONFIG_NR_CPUS=8 CONFIG_HOTPLUG_CPU=y # CONFIG_NUMA is not set # CONFIG_HZ_100 is not set CONFIG_HZ_250=y # CONFIG_HZ_300 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=250 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_CC_HAVE_SHADOW_CALL_STACK=y # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_KEXEC is not set # CONFIG_KEXEC_FILE is not set # CONFIG_CRASH_DUMP is not set # CONFIG_XEN is not set CONFIG_ARCH_FORCE_MAX_ORDER=11 CONFIG_UNMAP_KERNEL_AT_EL0=y CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y CONFIG_RODATA_FULL_DEFAULT_ENABLED=y # CONFIG_ARM64_SW_TTBR0_PAN is not set CONFIG_ARM64_TAGGED_ADDR_ABI=y CONFIG_COMPAT=y CONFIG_KUSER_HELPERS=y # CONFIG_COMPAT_ALIGNMENT_FIXUPS is not set CONFIG_ARMV8_DEPRECATED=y # CONFIG_SWP_EMULATION is not set # CONFIG_CP15_BARRIER_EMULATION is not set # CONFIG_SETEND_EMULATION is not set # # ARMv8.1 architectural features # CONFIG_ARM64_HW_AFDBM=y CONFIG_ARM64_PAN=y CONFIG_AS_HAS_LDAPR=y CONFIG_AS_HAS_LSE_ATOMICS=y CONFIG_ARM64_LSE_ATOMICS=y CONFIG_ARM64_USE_LSE_ATOMICS=y # end of ARMv8.1 architectural features # # ARMv8.2 architectural features # CONFIG_AS_HAS_ARMV8_2=y CONFIG_AS_HAS_SHA3=y # CONFIG_ARM64_PMEM is not set CONFIG_ARM64_RAS_EXTN=y CONFIG_ARM64_CNP=y # end of ARMv8.2 architectural features # # ARMv8.3 architectural features # CONFIG_ARM64_PTR_AUTH=y CONFIG_ARM64_PTR_AUTH_KERNEL=y CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y CONFIG_AS_HAS_PAC=y CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y # end of ARMv8.3 architectural features # # ARMv8.4 architectural features # CONFIG_ARM64_AMU_EXTN=y CONFIG_AS_HAS_ARMV8_4=y CONFIG_ARM64_TLB_RANGE=y # end of ARMv8.4 architectural features # # ARMv8.5 architectural features # CONFIG_AS_HAS_ARMV8_5=y CONFIG_ARM64_BTI=y CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y CONFIG_ARM64_E0PD=y CONFIG_ARM64_AS_HAS_MTE=y CONFIG_ARM64_MTE=y # end of ARMv8.5 architectural features # # ARMv8.7 architectural features # CONFIG_ARM64_EPAN=y # end of ARMv8.7 architectural features CONFIG_ARM64_SVE=y CONFIG_ARM64_SME=y CONFIG_ARM64_MODULE_PLTS=y CONFIG_ARM64_PSEUDO_NMI=y # CONFIG_ARM64_DEBUG_PRIORITY_MASKING is not set CONFIG_RELOCATABLE=y CONFIG_RANDOMIZE_BASE=y CONFIG_RANDOMIZE_MODULE_REGION_FULL=y CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y CONFIG_STACKPROTECTOR_PER_TASK=y CONFIG_ARCH_NR_GPIO=0 # end of Kernel Features # # Boot options # CONFIG_CMDLINE="" # CONFIG_EFI is not set # end of Boot options # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_SUSPEND_SKIP_SYNC is not set # CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_USERSPACE_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y # CONFIG_PM_DEBUG is not set CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_PM_GENERIC_DOMAINS_SLEEP=y CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y # end of Power management options # # CPU Power Management # # # CPU Idle # CONFIG_CPU_IDLE=y # CONFIG_CPU_IDLE_GOV_LADDER is not set CONFIG_CPU_IDLE_GOV_MENU=y # CONFIG_CPU_IDLE_GOV_TEO is not set # # ARM CPU Idle Drivers # # CONFIG_ARM_PSCI_CPUIDLE is not set # end of ARM CPU Idle Drivers # end of CPU Idle # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y CONFIG_CPUFREQ_DT_PLATDEV=y CONFIG_ARM_SCPI_CPUFREQ=y # end of CPU Frequency scaling # end of CPU Power Management CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set # # General architecture-dependent options # CONFIG_ARCH_HAS_SUBPAGE_FAULTS=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_HAVE_IOREMAP_PROT=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_KEEPINITRD=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y CONFIG_MMU_GATHER_TABLE_FREE=y CONFIG_MMU_GATHER_RCU_TABLE_FREE=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y # CONFIG_SHADOW_CALL_STACK is not set CONFIG_ARCH_SUPPORTS_LTO_CLANG=y CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y CONFIG_LTO_NONE=y CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=18 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y CONFIG_RANDOMIZE_KSTACK_OFFSET=y # CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_COMPILER_H=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_HAS_RELR=y CONFIG_HAVE_PREEMPT_DYNAMIC=y CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_GZIP is not set # CONFIG_MODULE_COMPRESS_XZ is not set # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLOCK_LEGACY_AUTOLOAD=y CONFIG_BLK_CGROUP_RWSTAT=y CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y CONFIG_BLK_DEV_INTEGRITY=y CONFIG_BLK_DEV_INTEGRITY_T10=y # CONFIG_BLK_DEV_ZONED is not set CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_DEV_THROTTLING_LOW is not set # CONFIG_BLK_WBT is not set CONFIG_BLK_CGROUP_IOLATENCY=y # CONFIG_BLK_CGROUP_IOCOST is not set # CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set CONFIG_LDM_PARTITION=y # CONFIG_LDM_DEBUG is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set # end of Partition Types CONFIG_BLOCK_COMPAT=y CONFIG_BLK_MQ_PCI=y CONFIG_BLK_PM=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y # CONFIG_IOSCHED_BFQ is not set # end of IO Schedulers CONFIG_PADATA=y CONFIG_ASN1=y CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y CONFIG_QUEUED_SPINLOCKS=y CONFIG_ARCH_USE_QUEUED_RWLOCKS=y CONFIG_QUEUED_RWLOCKS=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ARCH_BINFMT_ELF_STATE=y CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y CONFIG_ARCH_HAVE_ELF_PROT=y CONFIG_ARCH_USE_GNU_PROPERTY=y CONFIG_ELFCORE=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set CONFIG_BINFMT_SCRIPT=y # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # CONFIG_SWAP=y # CONFIG_ZSWAP is not set # # SLAB allocator options # # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y # end of SLAB allocator options # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set # CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y CONFIG_ARCH_KEEP_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_COMPACTION=y CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 # CONFIG_PAGE_REPORTING is not set CONFIG_MIGRATION=y CONFIG_ARCH_ENABLE_THP_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_PHYS_ADDR_T_64BIT=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y CONFIG_MEMORY_FAILURE=y # CONFIG_HWPOISON_INJECT is not set CONFIG_ARCH_WANTS_THP_SWAP=y CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set CONFIG_THP_SWAP=y # CONFIG_READ_ONLY_THP_FOR_FS is not set CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set CONFIG_CMA_DEBUGFS=y # CONFIG_CMA_SYSFS is not set CONFIG_CMA_AREAS=7 CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y CONFIG_ARCH_HAS_ZONE_DMA_SET=y CONFIG_ZONE_DMA=y CONFIG_ZONE_DMA32=y CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y # CONFIG_ANON_VMA_NAME is not set # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y CONFIG_NET_INGRESS=y CONFIG_NET_EGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set CONFIG_TLS=y # CONFIG_TLS_DEVICE is not set # CONFIG_TLS_TOE is not set # CONFIG_XFRM_USER is not set # CONFIG_NET_KEY is not set # CONFIG_XDP_SOCKETS is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=m CONFIG_IP_MROUTE_COMMON=y CONFIG_IP_MROUTE=y # CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set # CONFIG_IP_PIMSM_V1 is not set # CONFIG_IP_PIMSM_V2 is not set # CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=m # CONFIG_INET_DIAG is not set CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set CONFIG_TCP_CONG_CUBIC=y # CONFIG_TCP_CONG_WESTWOOD is not set CONFIG_TCP_CONG_HTCP=m CONFIG_TCP_CONG_HSTCP=m # CONFIG_TCP_CONG_HYBLA is not set CONFIG_TCP_CONG_VEGAS=m # CONFIG_TCP_CONG_NV is not set CONFIG_TCP_CONG_SCALABLE=m # CONFIG_TCP_CONG_LP is not set CONFIG_TCP_CONG_VENO=m CONFIG_TCP_CONG_YEAH=m CONFIG_TCP_CONG_ILLINOIS=m # CONFIG_TCP_CONG_DCTCP is not set CONFIG_TCP_CONG_CDG=m # CONFIG_TCP_CONG_BBR is not set CONFIG_DEFAULT_CUBIC=y # CONFIG_DEFAULT_RENO is not set CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_IPV6_VTI is not set CONFIG_IPV6_SIT=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set CONFIG_IPV6_FOU=m # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set # CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_EGRESS=y CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_FAMILY_BRIDGE=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set CONFIG_NETFILTER_NETLINK_LOG=m # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=m # CONFIG_NF_LOG_SYSLOG is not set # CONFIG_NF_CONNTRACK_MARK is not set # CONFIG_NF_CONNTRACK_ZONES is not set # CONFIG_NF_CONNTRACK_PROCFS is not set # CONFIG_NF_CONNTRACK_EVENTS is not set # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set # CONFIG_NF_CT_PROTO_DCCP is not set # CONFIG_NF_CT_PROTO_SCTP is not set # CONFIG_NF_CT_PROTO_UDPLITE is not set # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set CONFIG_NF_CONNTRACK_IRC=m CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set CONFIG_NF_CONNTRACK_SIP=m # CONFIG_NF_CONNTRACK_TFTP is not set CONFIG_NF_CT_NETLINK=m # CONFIG_NETFILTER_NETLINK_GLUE_CT is not set CONFIG_NF_NAT=m 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 CONFIG_NETFILTER_XTABLES_COMPAT=y # # Xtables combined modules # # CONFIG_NETFILTER_XT_MARK is not set # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set # CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set CONFIG_NETFILTER_XT_MATCH_IPRANGE=m # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set CONFIG_NETFILTER_XT_MATCH_OWNER=m # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set CONFIG_NETFILTER_XT_MATCH_STATE=m # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set CONFIG_NF_REJECT_IPV4=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set # CONFIG_IP_NF_TARGET_REDIRECT is not set CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_ARPTABLES is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m # CONFIG_NF_LOG_IPV6 is not set CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_MATCH_SRH is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set CONFIG_IP6_NF_NAT=m # CONFIG_IP6_NF_TARGET_MASQUERADE is not set # CONFIG_IP6_NF_TARGET_NPT is not set # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_CONNTRACK_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y # CONFIG_BRIDGE_VLAN_FILTERING is not set # CONFIG_BRIDGE_MRP is not set # CONFIG_BRIDGE_CFM is not set # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set CONFIG_NET_SCH_FQ_CODEL=y # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set # CONFIG_NET_SCH_DEFAULT is not set # # Classification # # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_RSVP is not set # CONFIG_NET_CLS_RSVP6 is not set # CONFIG_NET_CLS_FLOW is not set # CONFIG_NET_CLS_CGROUP is not set # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set # CONFIG_NET_L3_MASTER_DEV is not set # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y # CONFIG_CGROUP_NET_PRIO is not set # CONFIG_CGROUP_NET_CLASSID is not set CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_STREAM_PARSER is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # end of Network testing # end of Networking options # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=m CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y # CONFIG_BT_BNEP is not set CONFIG_BT_HIDP=m CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_LEDS is not set # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set # CONFIG_BT_DEBUGFS is not set # CONFIG_BT_SELFTEST is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_QCA=m CONFIG_BT_MTK=m CONFIG_BT_HCIBTUSB=m # CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set CONFIG_BT_HCIBTUSB_BCM=y CONFIG_BT_HCIBTUSB_MTK=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 is not set # CONFIG_BT_HCIUART_ATH3K is not set # CONFIG_BT_HCIUART_LL is not set CONFIG_BT_HCIUART_3WIRE=y # CONFIG_BT_HCIUART_INTEL is not set CONFIG_BT_HCIUART_BCM=y CONFIG_BT_HCIUART_RTL=y CONFIG_BT_HCIUART_QCA=y # CONFIG_BT_HCIUART_AG6XX is not set # CONFIG_BT_HCIUART_MRVL is not set # CONFIG_BT_HCIBCM203X is not set # CONFIG_BT_HCIBPA10X is not set # CONFIG_BT_HCIBFUSB is not set # CONFIG_BT_HCIVHCI is not set # CONFIG_BT_MRVL is not set # CONFIG_BT_ATH3K is not set CONFIG_BT_MTKSDIO=m CONFIG_BT_MTKUART=m # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set CONFIG_STREAM_PARSER=y # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set # CONFIG_CFG80211_CRDA_SUPPORT is not set CONFIG_CFG80211_WEXT=y CONFIG_LIB80211=m CONFIG_LIB80211_CRYPT_WEP=m CONFIG_LIB80211_CRYPT_CCMP=m # CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=m CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_PAGE_POOL=y # CONFIG_PAGE_POOL_STATS is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y # # Device Drivers # CONFIG_ARM_AMBA=y CONFIG_HAVE_PCI=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y CONFIG_PCI_DOMAINS_GENERIC=y CONFIG_PCI_SYSCALL=y # CONFIG_PCIEPORTBUS is not set CONFIG_PCIEASPM=y CONFIG_PCIEASPM_DEFAULT=y # CONFIG_PCIEASPM_POWERSAVE is not set # CONFIG_PCIEASPM_POWER_SUPERSAVE is not set # CONFIG_PCIEASPM_PERFORMANCE is not set # CONFIG_PCIE_PTM is not set CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y CONFIG_PCI_QUIRKS=y # CONFIG_PCI_DEBUG is not set # CONFIG_PCI_STUB is not set # CONFIG_PCI_IOV is not set # CONFIG_PCI_PRI is not set # CONFIG_PCI_PASID is not set # CONFIG_PCIE_BUS_TUNE_OFF is not set CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set CONFIG_VGA_ARB=y CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # # PCI controller drivers # # CONFIG_PCI_FTPCI100 is not set # CONFIG_PCI_HOST_GENERIC is not set # CONFIG_PCIE_XILINX is not set # CONFIG_PCI_XGENE is not set # CONFIG_PCIE_ALTERA is not set # CONFIG_PCI_HOST_THUNDER_PEM is not set # CONFIG_PCI_HOST_THUNDER_ECAM is not set # CONFIG_PCIE_MICROCHIP_HOST is not set # # DesignWare PCI Core Support # CONFIG_PCIE_DW=y CONFIG_PCIE_DW_HOST=y # CONFIG_PCIE_DW_PLAT_HOST is not set # CONFIG_PCI_HISI is not set # CONFIG_PCIE_KIRIN is not set CONFIG_PCI_MESON=y # CONFIG_PCIE_AL is not set # end of DesignWare PCI Core Support # # Mobiveil PCIe Core Support # # end of Mobiveil PCIe Core Support # # Cadence PCIe controllers support # # CONFIG_PCIE_CADENCE_PLAT_HOST is not set # CONFIG_PCI_J721E_HOST is not set # end of Cadence PCIe controllers support # end of PCI controller drivers # # PCI Endpoint # # CONFIG_PCI_ENDPOINT is not set # end of PCI Endpoint # # PCI switch controller drivers # # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers # CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set # # Generic Driver Options # # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y # CONFIG_DEVTMPFS_SAFE is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set CONFIG_FW_CACHE=y # CONFIG_FW_UPLOAD is not set # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y # CONFIG_ALLOW_DEV_COREDUMP is not set # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_SOC_BUS=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set CONFIG_GENERIC_ARCH_TOPOLOGY=y # end of Generic Driver Options # # Bus devices # # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_MOXTET is not set # CONFIG_VEXPRESS_CONFIG is not set # CONFIG_MHI_BUS is not set # CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # # CONFIG_ARM_SCMI_PROTOCOL is not set # end of ARM System Control and Management Interface Protocol CONFIG_ARM_SCPI_PROTOCOL=y CONFIG_ARM_SCPI_POWER_DOMAIN=y # CONFIG_FIRMWARE_MEMMAP is not set # CONFIG_FW_CFG_SYSFS is not set # CONFIG_ARM_FFA_TRANSPORT is not set # CONFIG_GOOGLE_FIRMWARE is not set CONFIG_MESON_SM=y CONFIG_MESON_GX_PM=y CONFIG_ARM_PSCI_FW=y # CONFIG_ARM_PSCI_CHECKER is not set CONFIG_HAVE_ARM_SMCCC=y CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y CONFIG_ARM_SMCCC_SOC_ID=y # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set CONFIG_MTD=y # CONFIG_MTD_TESTS is not set # # Partition parsers # # CONFIG_MTD_AR7_PARTS is not set # CONFIG_MTD_CMDLINE_PARTS is not set CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AFS_PARTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set # end of Partition parsers # # User Modules And Translation Layers # CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y # # Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK. # # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # CONFIG_RFD_FTL is not set # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set # CONFIG_MTD_OOPS is not set # CONFIG_MTD_SWAP is not set # CONFIG_MTD_PARTITIONED_MASTER is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # end of RAM/ROM/Flash chip drivers # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_INTEL_VR_NOR is not set # CONFIG_MTD_PLATRAM is not set # end of Mapping drivers for chip access # # Self-contained MTD device drivers # # CONFIG_MTD_PMC551 is not set # CONFIG_MTD_DATAFLASH is not set # CONFIG_MTD_MCHP23K256 is not set # CONFIG_MTD_MCHP48L640 is not set # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLOCK2MTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOCG3 is not set # end of Self-contained MTD device drivers # # NAND # # CONFIG_MTD_ONENAND is not set # CONFIG_MTD_RAW_NAND is not set # CONFIG_MTD_SPI_NAND is not set # # ECC engine support # # CONFIG_MTD_NAND_ECC_SW_HAMMING is not set # CONFIG_MTD_NAND_ECC_SW_BCH is not set # CONFIG_MTD_NAND_ECC_MXIC is not set # end of ECC engine support # end of NAND # # LPDDR & LPDDR2 PCM memory drivers # # CONFIG_MTD_LPDDR is not set # end of LPDDR & LPDDR2 PCM memory drivers CONFIG_MTD_SPI_NOR=y CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y # CONFIG_MTD_SPI_NOR_SWP_DISABLE is not set CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y # CONFIG_MTD_SPI_NOR_SWP_KEEP is not set # CONFIG_MTD_UBI is not set # CONFIG_MTD_HYPERBUS is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_DYNAMIC=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_RESERVED_MEM=y CONFIG_OF_RESOLVE=y CONFIG_OF_OVERLAY=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=0 # CONFIG_BLK_DEV_DRBD is not set CONFIG_BLK_DEV_NBD=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=4096 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_UBLK is not set # # NVME Support # # CONFIG_BLK_DEV_NVME is not set # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set # CONFIG_NVME_TARGET is not set # end of NVME Support # # Misc devices # # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_PHANTOM is not set # CONFIG_TIFM_CORE is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HI6421V600_IRQ is not set # CONFIG_HP_ILO is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set # CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set # CONFIG_HISI_HIKEY_USB is not set # CONFIG_OPEN_DICE is not set # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set # # EEPROM support # CONFIG_EEPROM_AT24=m # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # CONFIG_CB710_CORE is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set # CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set # CONFIG_PVPANIC is not set # CONFIG_GP_PCI1XXXX is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=m CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_SCAN_ASYNC is not set # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set CONFIG_SCSI_SAS_ATTRS=y CONFIG_SCSI_SAS_LIBSAS=y CONFIG_SCSI_SAS_HOST_SMP=y # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_CXGB3_ISCSI is not set # CONFIG_SCSI_CXGB4_ISCSI is not set # CONFIG_SCSI_BNX2_ISCSI is not set # CONFIG_BE2ISCSI is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_HPSA is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_3W_SAS is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_HISI_SAS is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set # CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set # CONFIG_SCSI_MPI3MR is not set # CONFIG_SCSI_SMARTPQI is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_MYRB is not set # CONFIG_SCSI_MYRS is not set # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FDOMAIN_PCI is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_STEX is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_IPR is not set # CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLA_ISCSI is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_AM53C974 is not set # CONFIG_SCSI_WD719X is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_PMCRAID is not set # CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_DH is not set # end of SCSI device support CONFIG_ATA=m CONFIG_SATA_HOST=y CONFIG_ATA_VERBOSE_ERROR=y CONFIG_ATA_FORCE=y CONFIG_SATA_PMP=y # # Controllers with non-SFF native interface # CONFIG_SATA_AHCI=m CONFIG_SATA_MOBILE_LPM_POLICY=0 CONFIG_SATA_AHCI_PLATFORM=m # CONFIG_AHCI_DWC is not set # CONFIG_AHCI_CEVA is not set # CONFIG_AHCI_QORIQ is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set CONFIG_ATA_SFF=y # # SFF controllers with custom DMA interface # # CONFIG_PDC_ADMA is not set # CONFIG_SATA_QSTOR is not set # CONFIG_SATA_SX4 is not set CONFIG_ATA_BMDMA=y # # SATA SFF controllers with BMDMA # # CONFIG_ATA_PIIX is not set # CONFIG_SATA_MV is not set # CONFIG_SATA_NV is not set # CONFIG_SATA_PROMISE is not set # CONFIG_SATA_SIL is not set # CONFIG_SATA_SIS is not set # CONFIG_SATA_SVW is not set # CONFIG_SATA_ULI is not set # CONFIG_SATA_VIA is not set # CONFIG_SATA_VITESSE is not set # # PATA SFF controllers with BMDMA # # CONFIG_PATA_ALI is not set # CONFIG_PATA_AMD is not set # CONFIG_PATA_ARTOP is not set # CONFIG_PATA_ATIIXP is not set # CONFIG_PATA_ATP867X is not set # CONFIG_PATA_CMD64X is not set # CONFIG_PATA_CYPRESS is not set # CONFIG_PATA_EFAR is not set # CONFIG_PATA_HPT366 is not set # CONFIG_PATA_HPT37X is not set # CONFIG_PATA_HPT3X2N is not set # CONFIG_PATA_HPT3X3 is not set # CONFIG_PATA_IT8213 is not set # CONFIG_PATA_IT821X is not set # CONFIG_PATA_JMICRON is not set # CONFIG_PATA_MARVELL is not set # CONFIG_PATA_NETCELL is not set # CONFIG_PATA_NINJA32 is not set # CONFIG_PATA_NS87415 is not set # CONFIG_PATA_OLDPIIX is not set # CONFIG_PATA_OPTIDMA is not set # CONFIG_PATA_PDC2027X is not set # CONFIG_PATA_PDC_OLD is not set # CONFIG_PATA_RADISYS is not set # CONFIG_PATA_RDC is not set # CONFIG_PATA_SCH is not set # CONFIG_PATA_SERVERWORKS is not set # CONFIG_PATA_SIL680 is not set # CONFIG_PATA_SIS is not set # CONFIG_PATA_TOSHIBA is not set # CONFIG_PATA_TRIFLEX is not set # CONFIG_PATA_VIA is not set # CONFIG_PATA_WINBOND is not set # # PIO-only SFF controllers # # CONFIG_PATA_CMD640_PCI is not set # CONFIG_PATA_MPIIX is not set # CONFIG_PATA_NS87410 is not set # CONFIG_PATA_OPTI is not set # CONFIG_PATA_OF_PLATFORM is not set # CONFIG_PATA_RZ1000 is not set # # Generic fallback / legacy drivers # # CONFIG_ATA_GENERIC is not set # CONFIG_PATA_LEGACY is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set # CONFIG_BLK_DEV_DM is not set # CONFIG_TARGET_CORE is not set # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # # CONFIG_FIREWIRE is not set # CONFIG_FIREWIRE_NOSY is not set # end of IEEE 1394 (FireWire) support CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set CONFIG_WIREGUARD=m # CONFIG_WIREGUARD_DEBUG is not set # CONFIG_EQUALIZER is not set # CONFIG_NET_FC is not set # CONFIG_NET_TEAM is not set CONFIG_MACVLAN=m # CONFIG_MACVTAP is not set # CONFIG_IPVLAN is not set # CONFIG_VXLAN is not set # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_AMT is not set # CONFIG_MACSEC is not set CONFIG_NETCONSOLE=y CONFIG_NETCONSOLE_DYNAMIC=y CONFIG_NETPOLL=y CONFIG_NET_POLL_CONTROLLER=y CONFIG_TUN=y # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m CONFIG_NLMON=m # CONFIG_ARCNET is not set CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set # CONFIG_NET_VENDOR_AGERE is not set # CONFIG_NET_VENDOR_ALACRITECH is not set # CONFIG_NET_VENDOR_ALTEON is not set # CONFIG_ALTERA_TSE is not set # CONFIG_NET_VENDOR_AMAZON is not set # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set CONFIG_NET_VENDOR_ASIX=y # CONFIG_SPI_AX88796C is not set # CONFIG_NET_VENDOR_ATHEROS is not set # CONFIG_NET_VENDOR_BROADCOM is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set # CONFIG_NET_VENDOR_CORTINA is not set # CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set # CONFIG_NET_VENDOR_ENGLEDER is not set # CONFIG_NET_VENDOR_EZCHIP is not set # CONFIG_NET_VENDOR_FUNGIBLE is not set # CONFIG_NET_VENDOR_GOOGLE is not set # CONFIG_NET_VENDOR_HISILICON is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_INTEL is not set # CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_JME is not set # CONFIG_NET_VENDOR_ADI is not set # CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set # CONFIG_NET_VENDOR_MICROSOFT is not set # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set # CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NETERION is not set # CONFIG_NET_VENDOR_NETRONOME is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set # CONFIG_NET_VENDOR_PACKET_ENGINES is not set # CONFIG_NET_VENDOR_PENSANDO is not set # CONFIG_NET_VENDOR_QLOGIC is not set # CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set CONFIG_NET_VENDOR_REALTEK=y # CONFIG_8139CP is not set # CONFIG_8139TOO is not set CONFIG_R8169=y # CONFIG_NET_VENDOR_RENESAS is not set # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set # CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=y CONFIG_STMMAC_SELFTESTS=y CONFIG_STMMAC_PLATFORM=y # CONFIG_DWMAC_DWC_QOS_ETH is not set CONFIG_DWMAC_GENERIC=y CONFIG_DWMAC_MESON=y # CONFIG_DWMAC_INTEL_PLAT is not set # CONFIG_DWMAC_LOONGSON is not set # CONFIG_STMMAC_PCI is not set # CONFIG_NET_VENDOR_SUN is not set # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set # CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set CONFIG_PHYLINK=y CONFIG_PHYLIB=y CONFIG_SWPHY=y CONFIG_LED_TRIGGER_PHY=y CONFIG_FIXED_PHY=y # CONFIG_SFP is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set CONFIG_MESON_GXL_PHY=y # CONFIG_ADIN_PHY is not set # CONFIG_ADIN1100_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=m # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM54140_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set CONFIG_ICPLUS_PHY=y # CONFIG_LXT_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set CONFIG_MARVELL_PHY=y # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set # CONFIG_MAXLINEAR_GPHY is not set # CONFIG_MEDIATEK_GE_PHY is not set CONFIG_MICREL_PHY=y CONFIG_MICROCHIP_PHY=y # CONFIG_MICROCHIP_T1_PHY is not set CONFIG_MICROSEMI_PHY=y # CONFIG_MOTORCOMM_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set # CONFIG_AT803X_PHY is not set CONFIG_MAXIO_PHY=y # CONFIG_QSEMI_PHY is not set CONFIG_REALTEK_PHY=y # CONFIG_RENESAS_PHY is not set # CONFIG_ROCKCHIP_PHY is not set CONFIG_SMSC_PHY=m # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_DP83TD510_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set # CONFIG_PSE_CONTROLLER is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_OF_MDIO=y CONFIG_MDIO_DEVRES=y CONFIG_MDIO_BITBANG=y # CONFIG_MDIO_BCM_UNIMAC is not set CONFIG_MDIO_GPIO=y # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_OCTEON is not set # CONFIG_MDIO_IPQ4019 is not set # CONFIG_MDIO_IPQ8064 is not set # CONFIG_MDIO_THUNDER is not set # # MDIO Multiplexers # CONFIG_MDIO_BUS_MUX=y CONFIG_MDIO_BUS_MUX_MESON_G12A=y CONFIG_MDIO_BUS_MUX_MESON_GXL=y CONFIG_MDIO_BUS_MUX_GPIO=y CONFIG_MDIO_BUS_MUX_MULTIPLEXER=y CONFIG_MDIO_BUS_MUX_MMIOREG=y # # PCS device drivers # CONFIG_PCS_XPCS=y # end of PCS device drivers CONFIG_PPP=m CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set CONFIG_PPP_MPPE=m # CONFIG_PPP_MULTILINK is not set CONFIG_PPPOE=m CONFIG_PPP_ASYNC=m CONFIG_PPP_SYNC_TTY=m # CONFIG_SLIP is not set CONFIG_SLHC=m CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set CONFIG_USB_RTL8150=y CONFIG_USB_RTL8152=y CONFIG_USB_LAN78XX=m CONFIG_USB_USBNET=m CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m # CONFIG_USB_NET_CDC_EEM is not set # CONFIG_USB_NET_CDC_NCM is not set # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set CONFIG_USB_NET_DM9601=m # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=m # CONFIG_USB_NET_GL620A is not set # CONFIG_USB_NET_NET1080 is not set # CONFIG_USB_NET_PLUSB is not set CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m # CONFIG_USB_NET_CDC_SUBSET is not set CONFIG_USB_NET_ZAURUS=m # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set CONFIG_USB_NET_QMI_WWAN=m CONFIG_USB_HSO=m # CONFIG_USB_NET_INT51X1 is not set CONFIG_USB_IPHETH=m # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y # CONFIG_ADM8211 is not set CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set # CONFIG_ATH5K is not set # CONFIG_ATH5K_PCI is not set CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m # CONFIG_ATH9K_PCI is not set # CONFIG_ATH9K_AHB is not set # CONFIG_ATH9K_DEBUGFS is not set # CONFIG_ATH9K_DYNACK is not set # CONFIG_ATH9K_WOW is not set CONFIG_ATH9K_RFKILL=y CONFIG_ATH9K_CHANNEL_CONTEXT=y CONFIG_ATH9K_PCOEM=y CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_ATH9K_HWRNG=y CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y CONFIG_CARL9170_HWRNG=y CONFIG_ATH6KL=m # CONFIG_ATH6KL_SDIO is not set CONFIG_ATH6KL_USB=m # CONFIG_ATH6KL_DEBUG is not set CONFIG_AR5523=m # CONFIG_WIL6210 is not set CONFIG_ATH10K=m CONFIG_ATH10K_CE=y # CONFIG_ATH10K_PCI is not set CONFIG_ATH10K_SDIO=m CONFIG_ATH10K_USB=m # CONFIG_ATH10K_DEBUG is not set # CONFIG_ATH10K_DEBUGFS is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set # CONFIG_ATH11K is not set CONFIG_WLAN_VENDOR_ATMEL=y # CONFIG_ATMEL is not set # CONFIG_AT76C50X_USB is not set CONFIG_WLAN_VENDOR_BROADCOM=y CONFIG_B43=m CONFIG_B43_BCMA=y CONFIG_B43_SSB=y CONFIG_B43_BUSES_BCMA_AND_SSB=y # CONFIG_B43_BUSES_BCMA is not set # CONFIG_B43_BUSES_SSB is not set CONFIG_B43_PCI_AUTOSELECT=y CONFIG_B43_PCICORE_AUTOSELECT=y # CONFIG_B43_SDIO is not set CONFIG_B43_BCMA_PIO=y CONFIG_B43_PIO=y CONFIG_B43_PHY_G=y CONFIG_B43_PHY_N=y CONFIG_B43_PHY_LP=y CONFIG_B43_PHY_HT=y CONFIG_B43_LEDS=y CONFIG_B43_HWRNG=y # CONFIG_B43_DEBUG is not set # CONFIG_B43LEGACY is not set CONFIG_BRCMUTIL=m # CONFIG_BRCMSMAC is not set CONFIG_BRCMFMAC=m CONFIG_BRCMFMAC_PROTO_BCDC=y CONFIG_BRCMFMAC_SDIO=y # CONFIG_BRCMFMAC_USB is not set # CONFIG_BRCMFMAC_PCIE is not set # CONFIG_BRCM_TRACING is not set CONFIG_BRCMDBG=y CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y # CONFIG_IPW2100 is not set # CONFIG_IPW2200 is not set # CONFIG_IWL4965 is not set # CONFIG_IWL3945 is not set # CONFIG_IWLWIFI is not set CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_HOSTAP is not set # CONFIG_HERMES is not set CONFIG_P54_COMMON=m CONFIG_P54_USB=m # CONFIG_P54_PCI is not set # CONFIG_P54_SPI is not set CONFIG_P54_LEDS=y CONFIG_WLAN_VENDOR_MARVELL=y # CONFIG_LIBERTAS is not set # CONFIG_LIBERTAS_THINFIRM is not set # CONFIG_MWIFIEX is not set # CONFIG_MWL8K is not set CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m CONFIG_MT76_CORE=m CONFIG_MT76_LEDS=y CONFIG_MT76_USB=m CONFIG_MT76_SDIO=m CONFIG_MT76x02_LIB=m CONFIG_MT76x02_USB=m CONFIG_MT76_CONNAC_LIB=m CONFIG_MT76x0_COMMON=m CONFIG_MT76x0U=m # CONFIG_MT76x0E is not set CONFIG_MT76x2_COMMON=m # CONFIG_MT76x2E is not set CONFIG_MT76x2U=m # CONFIG_MT7603E is not set CONFIG_MT7615_COMMON=m # CONFIG_MT7615E is not set CONFIG_MT7663_USB_SDIO_COMMON=m CONFIG_MT7663U=m CONFIG_MT7663S=m # CONFIG_MT7915E is not set # CONFIG_MT7921E is not set # CONFIG_MT7921S is not set # CONFIG_MT7921U is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set # CONFIG_WLAN_VENDOR_PURELIFI is not set CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m # CONFIG_RT2400PCI is not set # CONFIG_RT2500PCI is not set # CONFIG_RT61PCI is not set # CONFIG_RT2800PCI is not set CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WLAN_VENDOR_REALTEK=y # CONFIG_RTL8180 is not set CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y CONFIG_RTL_CARDS=m CONFIG_RTL8192CE=m CONFIG_RTL8192SE=m CONFIG_RTL8192DE=m CONFIG_RTL8723AE=m CONFIG_RTL8723BE=m CONFIG_RTL8188EE=m CONFIG_RTL8192EE=m CONFIG_RTL8821AE=m CONFIG_RTL8192CU=m CONFIG_RTLWIFI=m CONFIG_RTLWIFI_PCI=m CONFIG_RTLWIFI_USB=m CONFIG_RTLWIFI_DEBUG=y CONFIG_RTL8192C_COMMON=m CONFIG_RTL8723_COMMON=m CONFIG_RTLBTCOEXIST=m CONFIG_RTL8XXXU=m CONFIG_RTL8XXXU_UNTESTED=y CONFIG_RTW88=m CONFIG_RTW88_CORE=m CONFIG_RTW88_SDIO=m CONFIG_RTW88_USB=m CONFIG_RTW88_8822B=m CONFIG_RTW88_8822C=m CONFIG_RTW88_8723D=m CONFIG_RTW88_8821C=m # CONFIG_RTW88_8822BE is not set CONFIG_RTW88_8822BS=m CONFIG_RTW88_8822BU=m # CONFIG_RTW88_8822CE is not set CONFIG_RTW88_8822CS=m CONFIG_RTW88_8822CU=m # CONFIG_RTW88_8723DE is not set CONFIG_RTW88_8723DU=m # CONFIG_RTW88_8821CE is not set CONFIG_RTW88_8821CS=m CONFIG_RTW88_8821CU=m # CONFIG_RTW88_DEBUG is not set # CONFIG_RTW88_DEBUGFS is not set # CONFIG_RTW89 is not set CONFIG_WLAN_VENDOR_RSI=y # CONFIG_RSI_91X is not set # CONFIG_WLAN_VENDOR_SILABS is not set # CONFIG_WLAN_VENDOR_ST is not set # CONFIG_WLAN_VENDOR_TI is not set CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_USB_ZD1201=m CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set # CONFIG_WLAN_VENDOR_QUANTENNA is not set # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN # CONFIG_VMXNET3 is not set # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y # CONFIG_INPUT_MOUSEDEV_PSAUX is not set CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADC is not set # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set # CONFIG_KEYBOARD_ATKBD is not set # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=m CONFIG_KEYBOARD_GPIO_POLLED=m # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_PINEPHONE is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set # CONFIG_KEYBOARD_CYPRESS_SF is not set CONFIG_INPUT_MOUSE=y # CONFIG_MOUSE_PS2 is not set # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set # CONFIG_MOUSE_CYAPA is not set # CONFIG_MOUSE_ELAN_I2C is not set # CONFIG_MOUSE_VSXXXAA is not set # CONFIG_MOUSE_GPIO is not set # CONFIG_MOUSE_SYNAPTICS_I2C is not set # CONFIG_MOUSE_SYNAPTICS_USB is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADC is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set # CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y CONFIG_JOYSTICK_PSXPAD_SPI=m CONFIG_JOYSTICK_PSXPAD_SPI_FF=y # CONFIG_JOYSTICK_PXRC is not set # CONFIG_JOYSTICK_QWIIC is not set # CONFIG_JOYSTICK_FSIA6B is not set # CONFIG_JOYSTICK_SENSEHAT is not set # CONFIG_INPUT_TABLET is not set # CONFIG_INPUT_TOUCHSCREEN is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set # CONFIG_INPUT_RK805_PWRKEY is not set CONFIG_INPUT_GPIO_ROTARY_ENCODER=m # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IBM_PANEL is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set CONFIG_RMI4_CORE=y # CONFIG_RMI4_I2C is not set # CONFIG_RMI4_SPI is not set # CONFIG_RMI4_SMB is not set CONFIG_RMI4_F03=y CONFIG_RMI4_F03_SERIO=y CONFIG_RMI4_2D_SENSOR=y CONFIG_RMI4_F11=y CONFIG_RMI4_F12=y CONFIG_RMI4_F30=y # CONFIG_RMI4_F34 is not set # CONFIG_RMI4_F3A is not set # CONFIG_RMI4_F54 is not set # CONFIG_RMI4_F55 is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_AMBAKMI is not set # CONFIG_SERIO_PCIPS2 is not set # CONFIG_SERIO_LIBPS2 is not set # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_SERIO_GPIO_PS2 is not set # CONFIG_USERIO is not set # CONFIG_GAMEPORT is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y # CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set # CONFIG_SERIAL_8250_16550A_VARIANTS is not set # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_PCI=y CONFIG_SERIAL_8250_EXAR=y CONFIG_SERIAL_8250_NR_UARTS=1 CONFIG_SERIAL_8250_RUNTIME_UARTS=0 CONFIG_SERIAL_8250_EXTENDED=y # CONFIG_SERIAL_8250_MANY_PORTS is not set CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_RSA is not set CONFIG_SERIAL_8250_DWLIB=y CONFIG_SERIAL_8250_FSL=y CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set CONFIG_SERIAL_8250_PERICOM=y CONFIG_SERIAL_OF_PLATFORM=y # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set # CONFIG_SERIAL_AMBA_PL011 is not set # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set CONFIG_SERIAL_MESON=y CONFIG_SERIAL_MESON_CONSOLE=y # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_SIFIVE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_RP2 is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set # CONFIG_HVC_DCC is not set CONFIG_SERIAL_DEV_BUS=y CONFIG_SERIAL_DEV_CTRL_TTYPORT=y # CONFIG_TTY_PRINTK is not set # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set # CONFIG_IPMB_DEVICE_INTERFACE is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_BA431 is not set CONFIG_HW_RANDOM_MESON=y CONFIG_HW_RANDOM_OPTEE=m # CONFIG_HW_RANDOM_CCTRNG is not set # CONFIG_HW_RANDOM_XIPHERA is not set CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=y # CONFIG_HW_RANDOM_CN10K is not set # CONFIG_APPLICOM is not set CONFIG_DEVMEM=y CONFIG_DEVPORT=y # CONFIG_TCG_TPM is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set # CONFIG_RANDOM_TRUST_CPU is not set # CONFIG_RANDOM_TRUST_BOOTLOADER is not set # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_GPMUX is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set CONFIG_I2C_MUX_PCA954x=y CONFIG_I2C_MUX_PINCTRL=y # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_DEMUX_PINCTRL is not set # CONFIG_I2C_MUX_MLXCPLD is not set # end of Multiplexer I2C Chip support CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # PC SMBus host controller drivers # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_ISCH is not set # CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_NVIDIA_GPU is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CADENCE is not set # CONFIG_I2C_CBUS_GPIO is not set CONFIG_I2C_DESIGNWARE_CORE=y # CONFIG_I2C_DESIGNWARE_SLAVE is not set CONFIG_I2C_DESIGNWARE_PLATFORM=y # CONFIG_I2C_DESIGNWARE_PCI is not set # CONFIG_I2C_EMEV2 is not set CONFIG_I2C_GPIO=y # CONFIG_I2C_GPIO_FAULT_INJECTOR is not set CONFIG_I2C_MESON=y # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_RK3X is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_THUNDERX is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_PCI1XXXX is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set CONFIG_I2C_SLAVE=y # CONFIG_I2C_SLAVE_EEPROM is not set # CONFIG_I2C_SLAVE_TESTUNIT is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y CONFIG_SPI_MEM=y # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set CONFIG_SPI_BITBANG=y # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_CADENCE_QUADSPI is not set # CONFIG_SPI_CADENCE_XSPI is not set # CONFIG_SPI_DESIGNWARE is not set # CONFIG_SPI_NXP_FLEXSPI is not set CONFIG_SPI_GPIO=y # CONFIG_SPI_FSL_SPI is not set CONFIG_SPI_MESON_SPICC=y CONFIG_SPI_MESON_SPIFC=y # CONFIG_SPI_MICROCHIP_CORE is not set # CONFIG_SPI_MICROCHIP_CORE_QSPI is not set # CONFIG_SPI_OC_TINY is not set CONFIG_SPI_PL022=y # CONFIG_SPI_PXA2XX is not set # CONFIG_SPI_ROCKCHIP is not set # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_SIFIVE is not set # CONFIG_SPI_MXIC is not set # CONFIG_SPI_THUNDERX is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_AMD is not set # # SPI Multiplexer support # # CONFIG_SPI_MUX is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=m # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set CONFIG_SPI_DYNAMIC=y CONFIG_SPMI=y # CONFIG_SPMI_HISI3670 is not set # CONFIG_HSI is not set CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # # end of PTP clock support CONFIG_PINCTRL=y CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_CY8C95X0 is not set # CONFIG_PINCTRL_MCP23S08 is not set # CONFIG_PINCTRL_MICROCHIP_SGPIO is not set # CONFIG_PINCTRL_OCELOT is not set # CONFIG_PINCTRL_RK805 is not set # CONFIG_PINCTRL_SINGLE is not set # CONFIG_PINCTRL_STMFX is not set # CONFIG_PINCTRL_SX150X is not set CONFIG_PINCTRL_MESON=y CONFIG_PINCTRL_MESON_GXBB=y CONFIG_PINCTRL_MESON_GXL=y CONFIG_PINCTRL_MESON8_PMX=y CONFIG_PINCTRL_MESON_AXG=y CONFIG_PINCTRL_MESON_AXG_PMX=y CONFIG_PINCTRL_MESON_G12A=y CONFIG_PINCTRL_MESON_A1=y CONFIG_PINCTRL_MESON_S4=y # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y CONFIG_GPIO_CDEV=y CONFIG_GPIO_CDEV_V1=y CONFIG_GPIO_GENERIC=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_CADENCE is not set CONFIG_GPIO_DWAPB=y # CONFIG_GPIO_EXAR is not set # CONFIG_GPIO_FTGPIO010 is not set CONFIG_GPIO_GENERIC_PLATFORM=y # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HLWD is not set # CONFIG_GPIO_LOGICVC is not set # CONFIG_GPIO_MB86S7X is not set # CONFIG_GPIO_PL061 is not set # CONFIG_GPIO_SIFIVE is not set # CONFIG_GPIO_SYSCON is not set # CONFIG_GPIO_XGENE is not set # CONFIG_GPIO_XILINX is not set # CONFIG_GPIO_AMD_FCH is not set # end of Memory mapped GPIO drivers # # I2C GPIO expanders # # 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=m # CONFIG_GPIO_PCA953X_IRQ is not set # CONFIG_GPIO_PCA9570 is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # # end of MFD GPIO expanders # # PCI GPIO expanders # # CONFIG_GPIO_BT8XX is not set # CONFIG_GPIO_PCI_IDIO_16 is not set # CONFIG_GPIO_PCIE_IDIO_24 is not set # CONFIG_GPIO_RDC321X is not set # end of PCI GPIO expanders # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # end of SPI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers # CONFIG_W1 is not set CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_BRCMSTB is not set CONFIG_POWER_RESET_GPIO=y CONFIG_POWER_RESET_GPIO_RESTART=y # CONFIG_POWER_RESET_LTC2952 is not set CONFIG_POWER_RESET_REGULATOR=y CONFIG_POWER_RESET_RESTART=y # CONFIG_POWER_RESET_XGENE is not set CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_RESET_SYSCON_POWEROFF=y CONFIG_REBOOT_MODE=y CONFIG_SYSCON_REBOOT_MODE=y # CONFIG_NVMEM_REBOOT_MODE is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set # CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_RK817 is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_UCS1002 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set CONFIG_SENSORS_ARM_SCPI=y # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DRIVETEMP is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_I5K_AMB is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set CONFIG_SENSORS_GPIO_FAN=m # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IIO_HWMON is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX31730 is not set # CONFIG_SENSORS_MAX31760 is not set # CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_NZXT_KRAKEN2 is not set # CONFIG_SENSORS_NZXT_SMART2 is not set # CONFIG_SENSORS_OCC_P8_I2C is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set CONFIG_SENSORS_PWM_FAN=m # CONFIG_SENSORS_SBTSI is not set # CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_VT8231 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y # CONFIG_THERMAL_WRITABLE_TRIPS is not set CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set # CONFIG_CPU_THERMAL is not set CONFIG_DEVFREQ_THERMAL=y # CONFIG_THERMAL_EMULATION is not set # CONFIG_THERMAL_MMIO is not set CONFIG_AMLOGIC_THERMAL=y # CONFIG_GENERIC_ADC_THERMAL is not set CONFIG_KHADAS_MCU_FAN_THERMAL=m CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 # CONFIG_WATCHDOG_SYSFS is not set # CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_ARM_SBSA_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set # CONFIG_MAX63XX_WATCHDOG is not set CONFIG_MESON_GXBB_WATCHDOG=y CONFIG_MESON_WATCHDOG=y # CONFIG_ARM_SMC_WATCHDOG is not set # CONFIG_ALIM7101_WDT is not set # CONFIG_I6300ESB_WDT is not set # CONFIG_HP_WATCHDOG is not set # CONFIG_MEN_A21_WDT is not set # # PCI-based Watchdog Cards # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y CONFIG_SSB=m CONFIG_SSB_SPROM=y CONFIG_SSB_BLOCKIO=y CONFIG_SSB_PCIHOST_POSSIBLE=y CONFIG_SSB_PCIHOST=y CONFIG_SSB_B43_PCI_BRIDGE=y CONFIG_SSB_SDIOHOST_POSSIBLE=y # CONFIG_SSB_SDIOHOST is not set CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y CONFIG_SSB_DRIVER_PCICORE=y # CONFIG_SSB_DRIVER_GPIO is not set CONFIG_BCMA_POSSIBLE=y CONFIG_BCMA=m CONFIG_BCMA_BLOCKIO=y CONFIG_BCMA_HOST_PCI_POSSIBLE=y CONFIG_BCMA_HOST_PCI=y # CONFIG_BCMA_HOST_SOC is not set CONFIG_BCMA_DRIVER_PCI=y # CONFIG_BCMA_DRIVER_GMAC_CMN is not set # CONFIG_BCMA_DRIVER_GPIO is not set # CONFIG_BCMA_DEBUG is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_GATEWORKS_GSC is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_MFD_HI6421_SPMI is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77620 is not set # CONFIG_MFD_MAX77650 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77714 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_OCELOT is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_CPCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_NTXEC is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set CONFIG_MFD_RK808=y # CONFIG_MFD_RN5T618 is not set CONFIG_MFD_SEC_CORE=y # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # 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_VX855 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 # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ROHM_BD718XX is not set # CONFIG_MFD_ROHM_BD71828 is not set # CONFIG_MFD_ROHM_BD957XMUF is not set # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set # CONFIG_MFD_ATC260X_I2C is not set CONFIG_MFD_KHADAS_MCU=m # CONFIG_MFD_QCOM_PM8008 is not set # CONFIG_RAVE_SP_CORE is not set # CONFIG_MFD_INTEL_M10_BMC is not set # CONFIG_MFD_RSMU_I2C is not set # CONFIG_MFD_RSMU_SPI is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_DA9121 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set # CONFIG_REGULATOR_FAN53880 is not set CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MAX20086 is not set # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MCP16502 is not set # CONFIG_REGULATOR_MP5416 is not set # CONFIG_REGULATOR_MP8859 is not set # CONFIG_REGULATOR_MP886X is not set # CONFIG_REGULATOR_MPQ7920 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_MT6315 is not set # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PF8X00 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set CONFIG_REGULATOR_PWM=y # CONFIG_REGULATOR_QCOM_SPMI is not set # CONFIG_REGULATOR_QCOM_USB_VBUS is not set # CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set # CONFIG_REGULATOR_RK808 is not set # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set # CONFIG_REGULATOR_S2MPA01 is not set # CONFIG_REGULATOR_S2MPS11 is not set # CONFIG_REGULATOR_S5M8767 is not set # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_SY8106A is not set # CONFIG_REGULATOR_SY8824X is not set # CONFIG_REGULATOR_SY8827N is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS6286X is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_VCTRL is not set # CONFIG_REGULATOR_QCOM_LABIBB is not set CONFIG_RC_CORE=y CONFIG_BPF_LIRC_MODE2=y CONFIG_LIRC=y CONFIG_RC_MAP=m CONFIG_RC_DECODERS=y CONFIG_IR_IMON_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_MCE_KBD_DECODER=m CONFIG_IR_NEC_DECODER=m CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m CONFIG_IR_RCMM_DECODER=m CONFIG_IR_SANYO_DECODER=m CONFIG_IR_SHARP_DECODER=m CONFIG_IR_SONY_DECODER=m CONFIG_IR_XMP_DECODER=m CONFIG_RC_DEVICES=y CONFIG_IR_GPIO_CIR=m CONFIG_IR_GPIO_TX=m # CONFIG_IR_HIX5HD2 is not set CONFIG_IR_IGORPLUGUSB=m CONFIG_IR_IGUANA=m CONFIG_IR_IMON=m CONFIG_IR_IMON_RAW=m CONFIG_IR_MCEUSB=m CONFIG_IR_MESON=m # CONFIG_IR_MESON_TX is not set CONFIG_IR_PWM_TX=m CONFIG_IR_REDRAT3=m # CONFIG_IR_SERIAL is not set # CONFIG_IR_SPI is not set CONFIG_IR_STREAMZAP=m CONFIG_IR_TOY=m CONFIG_IR_TTUSBIR=m CONFIG_RC_ATI_REMOTE=m # CONFIG_RC_LOOPBACK is not set CONFIG_RC_XBOX_DVD=m CONFIG_CEC_CORE=y CONFIG_CEC_NOTIFIER=y # # CEC support # # CONFIG_MEDIA_CEC_RC is not set CONFIG_MEDIA_CEC_SUPPORT=y # CONFIG_CEC_CH7322 is not set CONFIG_CEC_MESON_AO=y CONFIG_CEC_MESON_G12A_AO=y # CONFIG_CEC_GPIO is not set # CONFIG_USB_PULSE8_CEC is not set # CONFIG_USB_RAINSHADOW_CEC is not set # end of CEC support CONFIG_MEDIA_SUPPORT=y # CONFIG_MEDIA_SUPPORT_FILTER is not set CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y CONFIG_MEDIA_RADIO_SUPPORT=y CONFIG_MEDIA_SDR_SUPPORT=y CONFIG_MEDIA_PLATFORM_SUPPORT=y CONFIG_MEDIA_TEST_SUPPORT=y # end of Media device types # # Media core support # CONFIG_VIDEO_DEV=y CONFIG_MEDIA_CONTROLLER=y CONFIG_DVB_CORE=y # end of Media core support # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_VIDEO_TUNER=m CONFIG_V4L2_MEM2MEM_DEV=m # end of Video4Linux options # # Media controller options # CONFIG_MEDIA_CONTROLLER_DVB=y # end of Media controller options # # Digital TV options # # CONFIG_DVB_MMAP is not set CONFIG_DVB_NET=y CONFIG_DVB_MAX_ADAPTERS=8 # CONFIG_DVB_DYNAMIC_MINORS is not set # CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set # CONFIG_DVB_ULE_DEBUG is not set # end of Digital TV options # # Media drivers # # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_USB_S2255 is not set CONFIG_VIDEO_USBTV=m CONFIG_USB_VIDEO_CLASS=m # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set # # Analog TV USB devices # # CONFIG_VIDEO_GO7007 is not set CONFIG_VIDEO_HDPVR=m CONFIG_VIDEO_PVRUSB2=m CONFIG_VIDEO_PVRUSB2_SYSFS=y CONFIG_VIDEO_PVRUSB2_DVB=y # CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set CONFIG_VIDEO_STK1160_COMMON=m CONFIG_VIDEO_STK1160=m # # Analog/digital TV USB devices # CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_AU0828_V4L2=y CONFIG_VIDEO_AU0828_RC=y CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y # CONFIG_VIDEO_CX231XX_ALSA is not set CONFIG_VIDEO_CX231XX_DVB=m # # Digital TV USB devices # CONFIG_DVB_AS102=m CONFIG_DVB_B2C2_FLEXCOP_USB=m # CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set CONFIG_DVB_USB_V2=m CONFIG_DVB_USB_AF9015=m CONFIG_DVB_USB_AF9035=m CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_AZ6007=m CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_DVBSKY=m CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_GL861=m CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m CONFIG_DVB_USB_ZD1301=m CONFIG_DVB_USB=m # CONFIG_DVB_USB_DEBUG is not set CONFIG_DVB_USB_A800=m CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_CXUSB=m # CONFIG_DVB_USB_CXUSB_ANALOG is not set CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_DIB3000MC=m CONFIG_DVB_USB_DIBUSB_MB=m CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y CONFIG_DVB_USB_DIBUSB_MC=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_DTT200U=m CONFIG_DVB_USB_DTV5100=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_GP8PSK=m CONFIG_DVB_USB_M920X=m CONFIG_DVB_USB_NOVA_T_USB2=m CONFIG_DVB_USB_OPERA1=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_TTUSB2=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_VP7045=m CONFIG_SMS_USB_DRV=m # CONFIG_DVB_TTUSB_BUDGET is not set # CONFIG_DVB_TTUSB_DEC is not set # # Webcam, TV (analog/digital) USB devices # CONFIG_VIDEO_EM28XX=m # CONFIG_VIDEO_EM28XX_V4L2 is not set # CONFIG_VIDEO_EM28XX_ALSA is not set CONFIG_VIDEO_EM28XX_DVB=m CONFIG_VIDEO_EM28XX_RC=m # # Software defined radio USB devices # # CONFIG_USB_AIRSPY is not set # CONFIG_USB_HACKRF is not set # CONFIG_USB_MSI2500 is not set # CONFIG_MEDIA_PCI_SUPPORT is not set # CONFIG_RADIO_ADAPTERS is not set CONFIG_MEDIA_PLATFORM_DRIVERS=y # CONFIG_V4L_PLATFORM_DRIVERS is not set # CONFIG_SDR_PLATFORM_DRIVERS is not set # CONFIG_DVB_PLATFORM_DRIVERS is not set CONFIG_V4L_MEM2MEM_DRIVERS=y CONFIG_VIDEO_MEM2MEM_DEINTERLACE=m # # Allegro DVT media platform drivers # # # Amlogic media platform drivers # # CONFIG_VIDEO_MESON_GE2D is not set # # Amphion drivers # # # Aspeed media platform drivers # # # Atmel media platform drivers # # # Cadence media platform drivers # # CONFIG_VIDEO_CADENCE_CSI2RX is not set # CONFIG_VIDEO_CADENCE_CSI2TX is not set # # Chips&Media media platform drivers # # # Intel media platform drivers # # # Marvell media platform drivers # # # Mediatek media platform drivers # # # NVidia media platform drivers # # # NXP media platform drivers # # # Qualcomm media platform drivers # # # Renesas media platform drivers # # # Rockchip media platform drivers # # # Samsung media platform drivers # # # STMicroelectronics media platform drivers # # # Sunxi media platform drivers # # # Texas Instruments drivers # # # Verisilicon media platform drivers # # # VIA media platform drivers # # # Xilinx media platform drivers # # # MMC/SDIO DVB adapters # # CONFIG_SMS_SDIO_DRV is not set # CONFIG_V4L_TEST_DRIVERS is not set # CONFIG_DVB_TEST_DRIVERS is not set CONFIG_MEDIA_COMMON_OPTIONS=y # # common driver options # CONFIG_CYPRESS_FIRMWARE=m CONFIG_TTPCI_EEPROM=m CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_SMS_SIANO_MDTV=m CONFIG_SMS_SIANO_RC=y CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_DMA_CONTIG=m CONFIG_VIDEOBUF2_VMALLOC=m # end of Media drivers # # Media ancillary drivers # CONFIG_MEDIA_ATTACH=y # # IR I2C driver auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_IR_I2C=m # # Camera sensor devices # # CONFIG_VIDEO_AR0521 is not set # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_HI846 is not set # CONFIG_VIDEO_HI847 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_IMX412 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set # CONFIG_VIDEO_MT9V011 is not set # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set # CONFIG_VIDEO_OV2640 is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5693 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV7251 is not set # CONFIG_VIDEO_OV7640 is not set # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9282 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_M5MOLS is not set # end of Camera sensor devices # # Lens drivers # # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # Audio decoders, processors and mixers # # CONFIG_VIDEO_CS3308 is not set # CONFIG_VIDEO_CS5345 is not set CONFIG_VIDEO_CS53L32A=m CONFIG_VIDEO_MSP3400=m # CONFIG_VIDEO_SONY_BTF_MPX is not set # CONFIG_VIDEO_TDA1997X is not set # CONFIG_VIDEO_TDA7432 is not set # CONFIG_VIDEO_TDA9840 is not set # CONFIG_VIDEO_TEA6415C is not set # CONFIG_VIDEO_TEA6420 is not set # CONFIG_VIDEO_TLV320AIC23B is not set # CONFIG_VIDEO_TVAUDIO is not set # CONFIG_VIDEO_UDA1342 is not set # CONFIG_VIDEO_VP27SMPX is not set # CONFIG_VIDEO_WM8739 is not set CONFIG_VIDEO_WM8775=m # end of Audio decoders, processors and mixers # # RDS decoders # # CONFIG_VIDEO_SAA6588 is not set # end of RDS decoders # # Video decoders # # CONFIG_VIDEO_ADV7180 is not set # CONFIG_VIDEO_ADV7183 is not set # CONFIG_VIDEO_ADV748X is not set # CONFIG_VIDEO_ADV7604 is not set # CONFIG_VIDEO_ADV7842 is not set # CONFIG_VIDEO_BT819 is not set # CONFIG_VIDEO_BT856 is not set # CONFIG_VIDEO_BT866 is not set # CONFIG_VIDEO_ISL7998X is not set # CONFIG_VIDEO_KS0127 is not set # CONFIG_VIDEO_MAX9286 is not set # CONFIG_VIDEO_ML86V7667 is not set # CONFIG_VIDEO_SAA7110 is not set CONFIG_VIDEO_SAA711X=m # CONFIG_VIDEO_TC358743 is not set # CONFIG_VIDEO_TVP514X is not set # CONFIG_VIDEO_TVP5150 is not set # CONFIG_VIDEO_TVP7002 is not set # CONFIG_VIDEO_TW2804 is not set # CONFIG_VIDEO_TW9903 is not set # CONFIG_VIDEO_TW9906 is not set # CONFIG_VIDEO_TW9910 is not set # CONFIG_VIDEO_VPX3220 is not set # # Video and audio decoders # # CONFIG_VIDEO_SAA717X is not set CONFIG_VIDEO_CX25840=m # end of Video decoders # # Video encoders # # CONFIG_VIDEO_AD9389B is not set # CONFIG_VIDEO_ADV7170 is not set # CONFIG_VIDEO_ADV7175 is not set # CONFIG_VIDEO_ADV7343 is not set # CONFIG_VIDEO_ADV7393 is not set # CONFIG_VIDEO_ADV7511 is not set # CONFIG_VIDEO_AK881X is not set # CONFIG_VIDEO_SAA7127 is not set # CONFIG_VIDEO_SAA7185 is not set # CONFIG_VIDEO_THS8200 is not set # end of Video encoders # # Video improvement chips # # CONFIG_VIDEO_UPD64031A is not set # CONFIG_VIDEO_UPD64083 is not set # end of Video improvement chips # # Audio/Video compression chips # # CONFIG_VIDEO_SAA6752HS is not set # end of Audio/Video compression chips # # SDR tuner chips # # CONFIG_SDR_MAX2175 is not set # end of SDR tuner chips # # Miscellaneous helper chips # # CONFIG_VIDEO_I2C is not set # CONFIG_VIDEO_M52790 is not set # CONFIG_VIDEO_ST_MIPID02 is not set # CONFIG_VIDEO_THS7303 is not set # end of Miscellaneous helper chips # # Media SPI Adapters # CONFIG_CXD2880_SPI_DRV=m # CONFIG_VIDEO_GS1662 is not set # end of Media SPI Adapters CONFIG_MEDIA_TUNER=y # # Customize TV tuners # CONFIG_MEDIA_TUNER_E4000=m CONFIG_MEDIA_TUNER_FC0011=m CONFIG_MEDIA_TUNER_FC0012=m CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_FC2580=m CONFIG_MEDIA_TUNER_IT913X=m # CONFIG_MEDIA_TUNER_M88RS6000T is not set CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_MC44S803=y # CONFIG_MEDIA_TUNER_MSI001 is not set CONFIG_MEDIA_TUNER_MT2060=m CONFIG_MEDIA_TUNER_MT2063=m CONFIG_MEDIA_TUNER_MT20XX=y # CONFIG_MEDIA_TUNER_MT2131 is not set CONFIG_MEDIA_TUNER_MT2266=m # CONFIG_MEDIA_TUNER_MXL301RF is not set CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m # CONFIG_MEDIA_TUNER_QM1D1B0004 is not set CONFIG_MEDIA_TUNER_QM1D1C0042=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_R820T=m CONFIG_MEDIA_TUNER_SI2157=m CONFIG_MEDIA_TUNER_SIMPLE=y CONFIG_MEDIA_TUNER_TDA18212=m CONFIG_MEDIA_TUNER_TDA18218=m CONFIG_MEDIA_TUNER_TDA18250=m CONFIG_MEDIA_TUNER_TDA18271=y CONFIG_MEDIA_TUNER_TDA827X=y CONFIG_MEDIA_TUNER_TDA8290=y CONFIG_MEDIA_TUNER_TDA9887=y CONFIG_MEDIA_TUNER_TEA5761=y CONFIG_MEDIA_TUNER_TEA5767=y CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_MEDIA_TUNER_XC2028=y CONFIG_MEDIA_TUNER_XC4000=y CONFIG_MEDIA_TUNER_XC5000=y # end of Customize TV tuners # # Customise DVB Frontends # # # Multistandard (satellite) frontends # CONFIG_DVB_M88DS3103=m # CONFIG_DVB_MXL5XX is not set CONFIG_DVB_STB0899=m CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m # CONFIG_DVB_STV0910 is not set CONFIG_DVB_STV6110x=m # CONFIG_DVB_STV6111 is not set # # Multistandard (cable + terrestrial) frontends # CONFIG_DVB_DRXK=m CONFIG_DVB_MN88472=m CONFIG_DVB_MN88473=m CONFIG_DVB_SI2165=m CONFIG_DVB_TDA18271C2DD=m # # DVB-S (satellite) frontends # # CONFIG_DVB_CX24110 is not set CONFIG_DVB_CX24116=m # CONFIG_DVB_CX24117 is not set CONFIG_DVB_CX24120=m CONFIG_DVB_CX24123=m CONFIG_DVB_DS3000=m # CONFIG_DVB_MB86A16 is not set CONFIG_DVB_MT312=m CONFIG_DVB_S5H1420=m CONFIG_DVB_SI21XX=m CONFIG_DVB_STB6000=m CONFIG_DVB_STV0288=m CONFIG_DVB_STV0299=m CONFIG_DVB_STV0900=m CONFIG_DVB_STV6110=m CONFIG_DVB_TDA10071=m CONFIG_DVB_TDA10086=m # CONFIG_DVB_TDA8083 is not set # CONFIG_DVB_TDA8261 is not set CONFIG_DVB_TDA826X=m CONFIG_DVB_TS2020=m # CONFIG_DVB_TUA6100 is not set CONFIG_DVB_TUNER_CX24113=m CONFIG_DVB_TUNER_ITD1000=m # CONFIG_DVB_VES1X93 is not set # CONFIG_DVB_ZL10036 is not set CONFIG_DVB_ZL10039=m # # DVB-T (terrestrial) frontends # CONFIG_DVB_AF9013=m CONFIG_DVB_AS102_FE=m # CONFIG_DVB_CX22700 is not set CONFIG_DVB_CX22702=m CONFIG_DVB_CXD2820R=m CONFIG_DVB_CXD2841ER=m CONFIG_DVB_DIB3000MB=m CONFIG_DVB_DIB3000MC=m CONFIG_DVB_DIB7000M=m CONFIG_DVB_DIB7000P=m # CONFIG_DVB_DIB9000 is not set CONFIG_DVB_DRXD=m CONFIG_DVB_EC100=m CONFIG_DVB_GP8PSK_FE=m # CONFIG_DVB_L64781 is not set CONFIG_DVB_MT352=m CONFIG_DVB_NXT6000=m CONFIG_DVB_RTL2830=m CONFIG_DVB_RTL2832=m CONFIG_DVB_RTL2832_SDR=m # CONFIG_DVB_S5H1432 is not set CONFIG_DVB_SI2168=m # CONFIG_DVB_SP887X is not set # CONFIG_DVB_STV0367 is not set CONFIG_DVB_TDA10048=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_ZD1301_DEMOD=m CONFIG_DVB_ZL10353=m # CONFIG_DVB_CXD2880 is not set # # DVB-C (cable) frontends # CONFIG_DVB_STV0297=m # CONFIG_DVB_TDA10021 is not set CONFIG_DVB_TDA10023=m # CONFIG_DVB_VES1820 is not set # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # CONFIG_DVB_AU8522=m CONFIG_DVB_AU8522_DTV=m CONFIG_DVB_AU8522_V4L=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LG2160=m CONFIG_DVB_LGDT3305=m CONFIG_DVB_LGDT3306A=m CONFIG_DVB_LGDT330X=m CONFIG_DVB_MXL692=m CONFIG_DVB_NXT200X=m # CONFIG_DVB_OR51132 is not set # CONFIG_DVB_OR51211 is not set CONFIG_DVB_S5H1409=m CONFIG_DVB_S5H1411=m # # ISDB-T (terrestrial) frontends # CONFIG_DVB_DIB8000=m CONFIG_DVB_MB86A20S=m CONFIG_DVB_S921=m # # ISDB-S (satellite) & ISDB-T (terrestrial) frontends # # CONFIG_DVB_MN88443X is not set CONFIG_DVB_TC90522=m # # Digital terrestrial only tuners/PLL # CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m CONFIG_DVB_TUNER_DIB0090=m # # SEC control devices for DVB-S # CONFIG_DVB_A8293=m CONFIG_DVB_AF9033=m # CONFIG_DVB_ASCOT2E is not set CONFIG_DVB_ATBM8830=m # CONFIG_DVB_HELENE is not set # CONFIG_DVB_HORUS3A is not set # CONFIG_DVB_ISL6405 is not set CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m CONFIG_DVB_IX2505V=m # CONFIG_DVB_LGS8GL5 is not set CONFIG_DVB_LGS8GXX=m # CONFIG_DVB_LNBH25 is not set # CONFIG_DVB_LNBH29 is not set CONFIG_DVB_LNBP21=m CONFIG_DVB_LNBP22=m CONFIG_DVB_M88RS2000=m # CONFIG_DVB_TDA665x is not set CONFIG_DVB_DRX39XYJ=m # # Common Interface (EN50221) controller drivers # # CONFIG_DVB_CXD2099 is not set CONFIG_DVB_SP2=m # end of Customise DVB Frontends # # Tools to develop new frontends # CONFIG_DVB_DUMMY_FE=m # end of Media ancillary drivers # # Graphics support # CONFIG_APERTURE_HELPERS=y CONFIG_DRM=y # CONFIG_DRM_DEBUG_MM is not set CONFIG_DRM_KMS_HELPER=y # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set CONFIG_DRM_DEBUG_MODESET_LOCK=y CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_GEM_DMA_HELPER=y CONFIG_DRM_GEM_SHMEM_HELPER=m CONFIG_DRM_SCHED=y # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # end of I2C encoder or helper chips # # ARM devices # # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_KOMEDA is not set # end of ARM devices # CONFIG_DRM_RADEON is not set # CONFIG_DRM_AMDGPU is not set # CONFIG_DRM_NOUVEAU is not set # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set # CONFIG_DRM_VMWGFX is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_AST is not set # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_USE_LVDS is not set # CONFIG_DRM_RCAR_USE_MIPI_DSI is not set # CONFIG_DRM_QXL is not set CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_ABT_Y030XX067A is not set # CONFIG_DRM_PANEL_ARM_VERSATILE is not set # CONFIG_DRM_PANEL_LVDS is not set # CONFIG_DRM_PANEL_SIMPLE is not set # CONFIG_DRM_PANEL_EDP is not set # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LB035Q02 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set # CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set # CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set # CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set # CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set # CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set # CONFIG_DRM_PANEL_SONY_ACX565AKM is not set # CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set # CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set # CONFIG_DRM_PANEL_TPO_TPG110 is not set # CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set CONFIG_DRM_DISPLAY_CONNECTOR=y # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set # CONFIG_DRM_LONTIUM_LT9611 is not set # CONFIG_DRM_LONTIUM_LT9611UXC is not set # CONFIG_DRM_ITE_IT66121 is not set # CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NWL_MIPI_DSI is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_PARADE_PS8640 is not set # CONFIG_DRM_SIL_SII8620 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_SII9234 is not set # CONFIG_DRM_SIMPLE_BRIDGE is not set # CONFIG_DRM_THINE_THC63LVD1024 is not set # CONFIG_DRM_TOSHIBA_TC358762 is not set # CONFIG_DRM_TOSHIBA_TC358764 is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TOSHIBA_TC358768 is not set # CONFIG_DRM_TOSHIBA_TC358775 is not set # CONFIG_DRM_TI_DLPC3433 is not set # CONFIG_DRM_TI_TFP410 is not set # CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_ANALOGIX_ANX7625 is not set # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_CDNS_MHDP8546 is not set 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_GP_AUDIO is not set # CONFIG_DRM_DW_HDMI_CEC is not set # end of Display Interface Bridges CONFIG_DRM_ETNAVIV=y CONFIG_DRM_ETNAVIV_THERMAL=y # CONFIG_DRM_HISI_HIBMC is not set # CONFIG_DRM_HISI_KIRIN is not set # CONFIG_DRM_LOGICVC is not set CONFIG_DRM_MESON=y CONFIG_DRM_MESON_DW_HDMI=y # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_BOCHS is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_PANEL_MIPI_DBI is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9163 is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set # CONFIG_TINYDRM_ILI9486 is not set # CONFIG_TINYDRM_MI0283QT is not set # CONFIG_TINYDRM_REPAPER is not set # CONFIG_TINYDRM_ST7586 is not set # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set CONFIG_DRM_LIMA=m CONFIG_DRM_PANFROST=m # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_DRM_NOMODESET=y # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_I740 is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_S3 is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VT8623 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_ARK is not set # CONFIG_FB_PM3 is not set # CONFIG_FB_CARMINE is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set CONFIG_FB_SIMPLE=y # CONFIG_FB_SSD1307 is not set # CONFIG_FB_SM712 is not set # end of Frame buffer Devices # # Backlight & LCD device support # # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_KTD253 is not set # CONFIG_BACKLIGHT_PWM is not set # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set CONFIG_BACKLIGHT_GPIO=y # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # CONFIG_BACKLIGHT_LED is not set # end of Backlight & LCD device support CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support # CONFIG_LOGO is not set # end of Graphics support CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y # CONFIG_SND_HRTIMER is not set CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 CONFIG_SND_SUPPORT_OLD_API=y CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_CTL_INPUT_VALIDATION is not set CONFIG_SND_VMASTER=y # CONFIG_SND_SEQUENCER is not set # CONFIG_SND_DRIVERS is not set # CONFIG_SND_PCI is not set # # HD-Audio # # end of HD-Audio CONFIG_SND_HDA_PREALLOC_SIZE=64 CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=m CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y CONFIG_SND_USB_UA101=m CONFIG_SND_USB_CAIAQ=m CONFIG_SND_USB_CAIAQ_INPUT=y CONFIG_SND_USB_6FIRE=m CONFIG_SND_USB_HIFACE=m CONFIG_SND_BCD2000=m CONFIG_SND_USB_LINE6=m CONFIG_SND_USB_POD=m CONFIG_SND_USB_PODHD=m CONFIG_SND_USB_TONEPORT=m CONFIG_SND_USB_VARIAX=m CONFIG_SND_SOC=y # CONFIG_SND_SOC_ADI is not set # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_AMD_ACP_CONFIG is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # CONFIG_SND_SOC_FSL_AUDMIX is not set # 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_FSL_XCVR is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # end of SoC Audio for Freescale CPUs # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_MTK_BTCVSD is not set # # ASoC support for Amlogic platforms # CONFIG_SND_MESON_AIU=y CONFIG_SND_MESON_AXG_FIFO=y CONFIG_SND_MESON_AXG_FRDDR=y CONFIG_SND_MESON_AXG_TODDR=y CONFIG_SND_MESON_AXG_TDM_FORMATTER=y CONFIG_SND_MESON_AXG_TDM_INTERFACE=y CONFIG_SND_MESON_AXG_TDMIN=y CONFIG_SND_MESON_AXG_TDMOUT=y CONFIG_SND_MESON_AXG_SOUND_CARD=y CONFIG_SND_MESON_AXG_SPDIFOUT=y CONFIG_SND_MESON_AXG_SPDIFIN=y CONFIG_SND_MESON_AXG_PDM=y CONFIG_SND_MESON_CARD_UTILS=y CONFIG_SND_MESON_CODEC_GLUE=y CONFIG_SND_MESON_GX_SOUND_CARD=y CONFIG_SND_MESON_G12A_TOACODEC=y CONFIG_SND_MESON_G12A_TOHDMITX=y CONFIG_SND_SOC_MESON_T9015=y # end of ASoC support for Amlogic platforms # CONFIG_SND_SOC_SOF_TOPLEVEL is not set # # STMicroelectronics STM32 SOC audio support # # end of 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_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1372_SPI is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set # CONFIG_SND_SOC_ADAU7002 is not set # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4375 is not set # CONFIG_SND_SOC_AK4458 is not set # CONFIG_SND_SOC_AK4554 is not set # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # 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_CS35L41_SPI is not set # CONFIG_SND_SOC_CS35L41_I2C is not set # CONFIG_SND_SOC_CS35L45_SPI is not set # CONFIG_SND_SOC_CS35L45_I2C 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS42L83 is not set # CONFIG_SND_SOC_CS4234 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # 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_CX2072X is not set # CONFIG_SND_SOC_DA7213 is not set # CONFIG_SND_SOC_DMIC is not set CONFIG_SND_SOC_HDMI_CODEC=y CONFIG_SND_SOC_ES7134=y # CONFIG_SND_SOC_ES7241 is not set # CONFIG_SND_SOC_ES8316 is not set # CONFIG_SND_SOC_ES8326 is not set CONFIG_SND_SOC_ES8328=y CONFIG_SND_SOC_ES8328_I2C=y # CONFIG_SND_SOC_ES8328_SPI is not set # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_HDA is not set # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set # CONFIG_SND_SOC_MAX98088 is not set CONFIG_SND_SOC_MAX98357A=y # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98520 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX98396 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_ANALOG is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set # CONFIG_SND_SOC_PCM186X_I2C is not set # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set # CONFIG_SND_SOC_PCM5102A 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_RK817 is not set # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set # CONFIG_SND_SOC_RT5640 is not set # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_RT9120 is not set # CONFIG_SND_SOC_SGTL5000 is not set CONFIG_SND_SOC_SIMPLE_AMPLIFIER=y # CONFIG_SND_SOC_SIMPLE_MUX is not set CONFIG_SND_SOC_SPDIF=y # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS2780 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805M is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320ADC3XXX is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set # CONFIG_SND_SOC_TLV320AIC3X_I2C is not set # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731_I2C is not set # CONFIG_SND_SOC_WM8731_SPI is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set # 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_WM8940 is not set # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set # CONFIG_SND_SOC_ZL38060 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_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8821 is not set # CONFIG_SND_SOC_NAU8822 is not set # CONFIG_SND_SOC_NAU8824 is not set # CONFIG_SND_SOC_TPA6130A2 is not set # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set # end of CODEC drivers CONFIG_SND_SIMPLE_CARD_UTILS=y CONFIG_SND_SIMPLE_CARD=y CONFIG_SND_AUDIO_GRAPH_CARD=y # CONFIG_SND_AUDIO_GRAPH_CARD2 is not set # CONFIG_SND_TEST_COMPONENT is not set # # HID support # CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set CONFIG_HID_ASUS=y CONFIG_HID_AUREAL=y # CONFIG_HID_BELKIN is not set # CONFIG_HID_BETOP_FF is not set CONFIG_HID_BIGBEN_FF=m CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CREATIVE_SB0540 is not set CONFIG_HID_CYPRESS=y CONFIG_HID_DRAGONRISE=m CONFIG_DRAGONRISE_FF=y # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_FT260 is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_GLORIOUS is not set # CONFIG_HID_HOLTEK is not set # CONFIG_HID_VIVALDI is not set # CONFIG_HID_GT683R is not set # CONFIG_HID_KEYTOUCH is not set CONFIG_HID_KYE=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set # CONFIG_HID_VRC2 is not set # CONFIG_HID_XIAOMI is not set CONFIG_HID_GYRATION=y # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set # CONFIG_HID_JABRA is not set CONFIG_HID_TWINHAN=y CONFIG_HID_KENSINGTON=y # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LED is not set CONFIG_HID_LENOVO=y # CONFIG_HID_LETSKETCH is not set CONFIG_HID_LOGITECH=y CONFIG_HID_LOGITECH_DJ=y CONFIG_HID_LOGITECH_HIDPP=y CONFIG_LOGITECH_FF=y 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_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=m CONFIG_HID_NINTENDO=y CONFIG_NINTENDO_FF=y # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set CONFIG_HID_ORTEK=y CONFIG_HID_OUYA=y CONFIG_HID_PANTHERLORD=y CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=y CONFIG_HID_PETALYNX=y # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PXRC is not set # CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set CONFIG_HID_SAMSUNG=y # CONFIG_HID_SEMITEK is not set # CONFIG_HID_SIGMAMICRO is not set CONFIG_HID_SONY=y CONFIG_SONY_FF=y # CONFIG_HID_SPEEDLINK is not set CONFIG_HID_STEAM=m # CONFIG_HID_STEELSERIES is not set CONFIG_HID_SUNPLUS=y CONFIG_HID_RMI=y # CONFIG_HID_GREENASIA is not set CONFIG_HID_SMARTJOYPLUS=m CONFIG_SMARTJOYPLUS_FF=y CONFIG_HID_TIVO=y CONFIG_HID_TOPSEED=y # CONFIG_HID_TOPRE is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set CONFIG_HID_WIIMOTE=m CONFIG_HID_XINMO=y # CONFIG_HID_ZEROPLUS is not set CONFIG_HID_ZYDACRON=y # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # end of USB HID support # # I2C HID support # # CONFIG_I2C_HID_OF is not set # CONFIG_I2C_HID_OF_ELAN is not set # CONFIG_I2C_HID_OF_GOODIX is not set # end of I2C HID support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y # CONFIG_USB_LED_TRIG is not set # CONFIG_USB_ULPI_BUS is not set # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y # CONFIG_USB_PCI is not set CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_OTG=y # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_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=m # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y # CONFIG_USB_XHCI_DBGCAP is not set # CONFIG_USB_XHCI_PCI_RENESAS is not set 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 # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD_PLATFORM=y # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_BCMA is not set # CONFIG_USB_HCD_SSB is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=m # CONFIG_USB_PRINTER is not set CONFIG_USB_WDM=m # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set CONFIG_USB_UAS=y # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set CONFIG_USB_DWC3=y # CONFIG_USB_DWC3_HOST is not set # CONFIG_USB_DWC3_GADGET is not set CONFIG_USB_DWC3_DUAL_ROLE=y # # Platform Glue Driver Support # CONFIG_USB_DWC3_MESON_G12A=y CONFIG_USB_DWC3_OF_SIMPLE=y CONFIG_USB_DWC2=y # CONFIG_USB_DWC2_HOST is not set # # Gadget/Dual-role mode requires USB Gadget support to be enabled # # CONFIG_USB_DWC2_PERIPHERAL is not set CONFIG_USB_DWC2_DUAL_ROLE=y # CONFIG_USB_DWC2_DEBUG is not set # CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set # CONFIG_USB_CHIPIDEA is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # CONFIG_USB_SERIAL=m CONFIG_USB_SERIAL_GENERIC=y # CONFIG_USB_SERIAL_SIMPLE is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set CONFIG_USB_SERIAL_CH341=m # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set CONFIG_USB_SERIAL_CP210X=m # CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_EMPEG is not set CONFIG_USB_SERIAL_FTDI_SIO=m # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_F81232 is not set # CONFIG_USB_SERIAL_F8153X is not set # CONFIG_USB_SERIAL_GARMIN is not set # CONFIG_USB_SERIAL_IPW is not set CONFIG_USB_SERIAL_IUU=m # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set # CONFIG_USB_SERIAL_KEYSPAN is not set # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_METRO is not set # CONFIG_USB_SERIAL_MOS7720 is not set # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MXUPORT is not set # CONFIG_USB_SERIAL_NAVMAN is not set CONFIG_USB_SERIAL_PL2303=m # CONFIG_USB_SERIAL_OTI6858 is not set # CONFIG_USB_SERIAL_QCAUX is not set # CONFIG_USB_SERIAL_QUALCOMM is not set # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SAFE is not set # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_OPTION is not set # CONFIG_USB_SERIAL_OMNINET is not set # CONFIG_USB_SERIAL_OPTICON is not set # CONFIG_USB_SERIAL_XSENS_MT is not set # CONFIG_USB_SERIAL_WISHBONE is not set # CONFIG_USB_SERIAL_SSU100 is not set # CONFIG_USB_SERIAL_QT2 is not set # CONFIG_USB_SERIAL_UPD78F0730 is not set # CONFIG_USB_SERIAL_XR is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HUB_USB251XB is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set CONFIG_USB_ONBOARD_HUB=y # # USB Physical Layer drivers # # CONFIG_NOP_USB_XCEIV is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set CONFIG_USB_ULPI=y CONFIG_USB_ULPI_VIEWPORT=y # end of USB Physical Layer drivers CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GADGET_DEBUG_FILES is not set # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # # USB Peripheral Controller # # CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set # CONFIG_USB_SNP_UDC_PLAT is not set # CONFIG_USB_M66592 is not set # CONFIG_USB_BDC_UDC is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_GADGET_XILINX is not set # CONFIG_USB_MAX3420_UDC is not set # CONFIG_USB_DUMMY_HCD is not set # end of USB Peripheral Controller # CONFIG_USB_CONFIGFS is not set # # USB Gadget precomposed configurations # # CONFIG_USB_ZERO is not set # CONFIG_USB_AUDIO is not set # CONFIG_USB_ETH is not set # CONFIG_USB_G_NCM is not set # CONFIG_USB_GADGETFS is not set # CONFIG_USB_FUNCTIONFS is not set # CONFIG_USB_MASS_STORAGE is not set # CONFIG_USB_G_SERIAL is not set # CONFIG_USB_MIDI_GADGET is not set # CONFIG_USB_G_PRINTER is not set # CONFIG_USB_CDC_COMPOSITE is not set # CONFIG_USB_G_ACM_MS is not set # CONFIG_USB_G_MULTI is not set # CONFIG_USB_G_HID is not set # CONFIG_USB_G_DBGP is not set # CONFIG_USB_G_WEBCAM is not set # CONFIG_USB_RAW_GADGET is not set # end of USB Gadget precomposed configurations CONFIG_TYPEC=m CONFIG_TYPEC_TCPM=m CONFIG_TYPEC_TCPCI=m # CONFIG_TYPEC_RT1711H is not set # CONFIG_TYPEC_TCPCI_MAXIM is not set CONFIG_TYPEC_FUSB302=m CONFIG_TYPEC_UCSI=m # CONFIG_UCSI_CCG is not set # CONFIG_UCSI_STM32G0 is not set # CONFIG_TYPEC_TPS6598X is not set # CONFIG_TYPEC_ANX7411 is not set # CONFIG_TYPEC_RT1719 is not set # CONFIG_TYPEC_HD3SS3220 is not set # CONFIG_TYPEC_STUSB160X is not set # CONFIG_TYPEC_WUSB3801 is not set # # USB Type-C Multiplexer/DeMultiplexer Switch support # # CONFIG_TYPEC_MUX_FSA4480 is not set # CONFIG_TYPEC_MUX_PI3USB30532 is not set # end of USB Type-C Multiplexer/DeMultiplexer Switch support # # USB Type-C Alternate Mode drivers # # CONFIG_TYPEC_DP_ALTMODE is not set # end of USB Type-C Alternate Mode drivers CONFIG_USB_ROLE_SWITCH=y CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y CONFIG_PWRSEQ_SIMPLE=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_DEBUG is not set # CONFIG_MMC_ARMMMCI is not set # CONFIG_MMC_SDHCI is not set CONFIG_MMC_MESON_GX=y # CONFIG_MMC_MESON_MX_SDIO is not set # CONFIG_MMC_TIFM_SD is not set CONFIG_MMC_SPI=y # CONFIG_MMC_CB710 is not set # CONFIG_MMC_VIA_SDMMC is not set # CONFIG_MMC_DW is not set # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set # CONFIG_MMC_CQHCI is not set # CONFIG_MMC_HSQ is not set # CONFIG_MMC_TOSHIBA_PCI is not set # CONFIG_MMC_MTK is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y # CONFIG_LEDS_CLASS_FLASH is not set # CONFIG_LEDS_CLASS_MULTICOLOR is not set # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_AW2013 is not set # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_EL15203000 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP50XX is not set # CONFIG_LEDS_LP55XX_COMMON is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set CONFIG_LEDS_PWM=y # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set CONFIG_LEDS_SYSCON=y # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_SPI_BYTE is not set # CONFIG_LEDS_TI_LMU_COMMON is not set # # Flash and Torch LED drivers # # # RGB LED drivers # # # LED Triggers # CONFIG_LEDS_TRIGGERS=y # CONFIG_LEDS_TRIGGER_TIMER is not set # CONFIG_LEDS_TRIGGER_ONESHOT is not set # CONFIG_LEDS_TRIGGER_DISK is not set # CONFIG_LEDS_TRIGGER_MTD is not set CONFIG_LEDS_TRIGGER_HEARTBEAT=y # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set CONFIG_LEDS_TRIGGER_CPU=y # CONFIG_LEDS_TRIGGER_ACTIVITY is not set CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set # CONFIG_LEDS_TRIGGER_PANIC is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set # CONFIG_LEDS_TRIGGER_AUDIO is not set # CONFIG_LEDS_TRIGGER_TTY is not set # # Simple LED drivers # # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_SUPPORT=y # CONFIG_EDAC is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # 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 # CONFIG_RTC_DRV_DS1672 is not set CONFIG_RTC_DRV_HYM8563=m # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_NCT3018Y is not set # CONFIG_RTC_DRV_RK808 is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set CONFIG_RTC_DRV_PCF8563=m # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # 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_RV3032 is not set # CONFIG_RTC_DRV_RV8803 is not set # CONFIG_RTC_DRV_S5M is not set # CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # CONFIG_RTC_DRV_DS3232=y CONFIG_RTC_DRV_DS3232_HWMON=y # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_OPTEE is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # on-CPU RTC drivers # CONFIG_RTC_DRV_MESON_VRTC=m # CONFIG_RTC_DRV_PL030 is not set CONFIG_RTC_DRV_PL031=y # CONFIG_RTC_DRV_CADENCE is not set # CONFIG_RTC_DRV_FTRTC010 is not set # CONFIG_RTC_DRV_R7301 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set CONFIG_UDMABUF=y # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set CONFIG_DMABUF_HEAPS=y # CONFIG_DMABUF_SYSFS_STATS is not set CONFIG_DMABUF_HEAPS_SYSTEM=y CONFIG_DMABUF_HEAPS_CMA=y # end of DMABUF options CONFIG_AUXDISPLAY=y # CONFIG_HD44780 is not set # CONFIG_IMG_ASCII_LCD is not set # CONFIG_HT16K33 is not set # CONFIG_LCD2S is not set CONFIG_TM1628=m # CONFIG_CHARLCD_BL_OFF is not set # CONFIG_CHARLCD_BL_ON is not set CONFIG_CHARLCD_BL_FLASH=y # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set # CONFIG_VIRTIO_MENU is not set # CONFIG_VDPA is not set # CONFIG_VHOST_MENU is not set # # Microsoft Hyper-V guest support # # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set CONFIG_RTL8192U=m CONFIG_RTLLIB=m CONFIG_RTLLIB_CRYPTO_CCMP=m CONFIG_RTLLIB_CRYPTO_TKIP=m CONFIG_RTLLIB_CRYPTO_WEP=m # CONFIG_RTL8192E is not set CONFIG_RTL8723BS=m CONFIG_R8712U=m CONFIG_R8188EU=m # CONFIG_RTS5208 is not set # CONFIG_VT6655 is not set # CONFIG_VT6656 is not set # # IIO staging drivers # # # Accelerometers # # CONFIG_ADIS16203 is not set # CONFIG_ADIS16240 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7816 is not set # end of Analog to digital converters # # Analog digital bi-direction converters # # CONFIG_ADT7316 is not set # end of Analog digital bi-direction converters # # Direct Digital Synthesis # # CONFIG_AD9832 is not set # CONFIG_AD9834 is not set # end of Direct Digital Synthesis # # Network Analyzer, Impedance Converters # # CONFIG_AD5933 is not set # end of Network Analyzer, Impedance Converters # # Active energy metering IC # # CONFIG_ADE7854 is not set # end of Active energy metering IC # # Resolver to digital converters # # CONFIG_AD2S1210 is not set # end of Resolver to digital converters # end of IIO staging drivers # CONFIG_FB_SM750 is not set CONFIG_STAGING_MEDIA=y # CONFIG_VIDEO_MAX96712 is not set CONFIG_VIDEO_MESON_VDEC=m # CONFIG_STAGING_MEDIA_DEPRECATED is not set # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_FB_TFT is not set # CONFIG_KS7010 is not set # CONFIG_PI433 is not set # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_FIELDBUS_DEV is not set # CONFIG_QLGE is not set # CONFIG_VME_BUS is not set # CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set # CONFIG_SURFACE_PLATFORMS is not set CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Clock driver for ARM Reference designs # # CONFIG_CLK_ICST is not set # CONFIG_CLK_SP810 is not set # end of Clock driver for ARM Reference designs # CONFIG_LMK04832 is not set # CONFIG_COMMON_CLK_MAX9485 is not set CONFIG_COMMON_CLK_RK808=y CONFIG_COMMON_CLK_SCPI=y # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set # CONFIG_COMMON_CLK_S2MPS11 is not set # CONFIG_COMMON_CLK_AXI_CLKGEN is not set # CONFIG_COMMON_CLK_XGENE is not set CONFIG_COMMON_CLK_PWM=y # CONFIG_COMMON_CLK_RS9_PCIE is not set # CONFIG_COMMON_CLK_VC5 is not set # CONFIG_COMMON_CLK_VC7 is not set CONFIG_COMMON_CLK_FIXED_MMIO=y # # Clock support for Amlogic platforms # CONFIG_COMMON_CLK_MESON_REGMAP=y CONFIG_COMMON_CLK_MESON_DUALDIV=y CONFIG_COMMON_CLK_MESON_MPLL=y CONFIG_COMMON_CLK_MESON_PHASE=y CONFIG_COMMON_CLK_MESON_PLL=y CONFIG_COMMON_CLK_MESON_SCLK_DIV=y CONFIG_COMMON_CLK_MESON_VID_PLL_DIV=y CONFIG_COMMON_CLK_MESON_AO_CLKC=y CONFIG_COMMON_CLK_MESON_EE_CLKC=y CONFIG_COMMON_CLK_MESON_CPU_DYNDIV=y CONFIG_COMMON_CLK_GXBB=y CONFIG_COMMON_CLK_AXG=y CONFIG_COMMON_CLK_AXG_AUDIO=y CONFIG_COMMON_CLK_G12A=y # end of Clock support for Amlogic platforms # CONFIG_XILINX_VCU is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set # CONFIG_HWSPINLOCK is not set # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_PROBE=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y CONFIG_FSL_ERRATUM_A008585=y # CONFIG_HISILICON_ERRATUM_161010101 is not set CONFIG_ARM64_ERRATUM_858921=y # CONFIG_MICROCHIP_PIT64B is not set # end of Clock Source drivers CONFIG_MAILBOX=y CONFIG_ARM_MHU=y # CONFIG_ARM_MHU_V2 is not set CONFIG_PLATFORM_MHU=y # CONFIG_PL320_MBOX is not set # CONFIG_ALTERA_MBOX is not set # CONFIG_MAILBOX_TEST is not set CONFIG_IOMMU_IOVA=y CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # CONFIG_IOMMU_IO_PGTABLE=y CONFIG_IOMMU_IO_PGTABLE_LPAE=y # CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set # CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set # CONFIG_IOMMU_IO_PGTABLE_DART is not set # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set CONFIG_IOMMU_DEFAULT_DMA_STRICT=y # CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_OF_IOMMU=y CONFIG_IOMMU_DMA=y # CONFIG_ARM_SMMU is not set # CONFIG_ARM_SMMU_V3 is not set # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # end of Remoteproc drivers # # Rpmsg drivers # # CONFIG_RPMSG_QCOM_GLINK_RPM is not set # CONFIG_RPMSG_VIRTIO is not set # end of Rpmsg drivers # CONFIG_SOUNDWIRE is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # CONFIG_MESON_CANVAS=y CONFIG_MESON_CLK_MEASURE=y CONFIG_MESON_GX_SOCINFO=y CONFIG_MESON_GX_PM_DOMAINS=y CONFIG_MESON_EE_PM_DOMAINS=y CONFIG_MESON_SECURE_PM_DOMAINS=y # end of Amlogic SoC drivers # # Broadcom SoC drivers # # CONFIG_SOC_BRCMSTB is not set # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # CONFIG_QUICC_ENGINE is not set # CONFIG_FSL_RCPM is not set # end of NXP/Freescale QorIQ SoC drivers # # fujitsu SoC drivers # # end of fujitsu SoC drivers # # i.MX SoC drivers # # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # CONFIG_LITEX_SOC_CONTROLLER is not set # end of Enable LiteX SoC Builder specific drivers # # Qualcomm SoC drivers # # end of Qualcomm SoC drivers # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=m CONFIG_DEVFREQ_GOV_PERFORMANCE=m # CONFIG_DEVFREQ_GOV_POWERSAVE is not set # CONFIG_DEVFREQ_GOV_USERSPACE is not set # CONFIG_DEVFREQ_GOV_PASSIVE is not set # # DEVFREQ Drivers # # CONFIG_PM_DEVFREQ_EVENT is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_FSA9480 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_TUSB320 is not set # CONFIG_MEMORY is not set CONFIG_IIO=y CONFIG_IIO_BUFFER=y # CONFIG_IIO_BUFFER_CB is not set # CONFIG_IIO_BUFFER_DMA is not set # CONFIG_IIO_BUFFER_DMAENGINE 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 # CONFIG_IIO_SW_DEVICE is not set # CONFIG_IIO_SW_TRIGGER is not set # CONFIG_IIO_TRIGGERED_EVENT is not set # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADXL313_I2C is not set # CONFIG_ADXL313_SPI is not set # CONFIG_ADXL345_I2C is not set # CONFIG_ADXL345_SPI is not set # CONFIG_ADXL355_I2C is not set # CONFIG_ADXL355_SPI is not set # CONFIG_ADXL367_SPI is not set # CONFIG_ADXL367_I2C is not set # CONFIG_ADXL372_SPI is not set # CONFIG_ADXL372_I2C is not set # CONFIG_BMA180 is not set # CONFIG_BMA220 is not set # CONFIG_BMA400 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_BMI088_ACCEL is not set # CONFIG_DA280 is not set # CONFIG_DA311 is not set # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_DMARD10 is not set # CONFIG_FXLS8962AF_I2C is not set # CONFIG_FXLS8962AF_SPI is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MC3230 is not set # CONFIG_MMA7455_I2C is not set # CONFIG_MMA7455_SPI is not set # CONFIG_MMA7660 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MSA311 is not set # CONFIG_MXC4005 is not set # CONFIG_MXC6255 is not set # CONFIG_SCA3000 is not set # CONFIG_SCA3300 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7091R5 is not set # CONFIG_AD7124 is not set # CONFIG_AD7192 is not set # CONFIG_AD7266 is not set # CONFIG_AD7280 is not set # CONFIG_AD7291 is not set # CONFIG_AD7292 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_AD7780 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD7949 is not set # CONFIG_AD799X is not set # CONFIG_ADI_AXI_ADC is not set # CONFIG_CC10001_ADC is not set # CONFIG_ENVELOPE_DETECTOR is not set # CONFIG_HI8435 is not set # CONFIG_HX711 is not set # CONFIG_INA2XX_ADC is not set # CONFIG_LTC2471 is not set # CONFIG_LTC2485 is not set # CONFIG_LTC2496 is not set # CONFIG_LTC2497 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX11100 is not set # CONFIG_MAX1118 is not set # CONFIG_MAX11205 is not set # CONFIG_MAX1241 is not set # CONFIG_MAX1363 is not set # CONFIG_MAX9611 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_MCP3911 is not set CONFIG_MESON_SARADC=y # CONFIG_NAU7802 is not set # CONFIG_QCOM_SPMI_IADC is not set # CONFIG_QCOM_SPMI_VADC is not set # CONFIG_QCOM_SPMI_ADC5 is not set # CONFIG_RICHTEK_RTQ6056 is not set # CONFIG_SD_ADC_MODULATOR is not set # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC0832 is not set # CONFIG_TI_ADC084S021 is not set # CONFIG_TI_ADC12138 is not set # CONFIG_TI_ADC108S102 is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_TI_ADC161S626 is not set # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS7950 is not set # CONFIG_TI_ADS8344 is not set # CONFIG_TI_ADS8688 is not set # CONFIG_TI_ADS124S08 is not set # CONFIG_TI_ADS131E08 is not set # CONFIG_TI_TLC4541 is not set # CONFIG_TI_TSC2046 is not set # CONFIG_VF610_ADC is not set # CONFIG_XILINX_XADC is not set # end of Analog to digital converters # # Analog to digital and digital to analog converters # # CONFIG_AD74413R is not set # end of Analog to digital and digital to analog converters # # Analog Front Ends # # CONFIG_IIO_RESCALE is not set # end of Analog Front Ends # # Amplifiers # # CONFIG_AD8366 is not set # CONFIG_ADA4250 is not set # CONFIG_HMC425 is not set # end of Amplifiers # # Capacitance to digital converters # # CONFIG_AD7150 is not set # CONFIG_AD7746 is not set # end of Capacitance to digital converters # # Chemical Sensors # # CONFIG_ATLAS_PH_SENSOR is not set # CONFIG_ATLAS_EZO_SENSOR is not set # CONFIG_BME680 is not set # CONFIG_CCS811 is not set # CONFIG_IAQCORE is not set # CONFIG_PMS7003 is not set # CONFIG_SCD30_CORE is not set # CONFIG_SCD4X is not set # CONFIG_SENSIRION_SGP30 is not set # CONFIG_SENSIRION_SGP40 is not set # CONFIG_SPS30_I2C is not set # CONFIG_SPS30_SERIAL is not set # CONFIG_SENSEAIR_SUNRISE_CO2 is not set # CONFIG_VZ89X is not set # end of Chemical Sensors # # Hid Sensor IIO Common # # end of Hid Sensor IIO Common # # IIO SCMI Sensors # # end of IIO SCMI Sensors # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # end of SSP Sensor Common # # Digital to analog converters # # CONFIG_AD3552R is not set # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5592R is not set # CONFIG_AD5593R is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_LTC2688 is not set # CONFIG_AD5686_SPI is not set # CONFIG_AD5696_I2C is not set # CONFIG_AD5755 is not set # CONFIG_AD5758 is not set # CONFIG_AD5761 is not set # CONFIG_AD5764 is not set # CONFIG_AD5766 is not set # CONFIG_AD5770R is not set # CONFIG_AD5791 is not set # CONFIG_AD7293 is not set # CONFIG_AD7303 is not set # CONFIG_AD8801 is not set # CONFIG_DPOT_DAC is not set # CONFIG_DS4424 is not set # CONFIG_LTC1660 is not set # CONFIG_LTC2632 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # 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 # end of Digital to analog converters # # IIO dummy driver # # end of IIO dummy driver # # Filters # # CONFIG_ADMV8818 is not set # end of Filters # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # end of Clock Generator/Distribution # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # CONFIG_ADF4371 is not set # CONFIG_ADMV1013 is not set # CONFIG_ADMV1014 is not set # CONFIG_ADMV4420 is not set # CONFIG_ADRF6780 is not set # end of Phase-Locked Loop (PLL) frequency synthesizers # end of Frequency Synthesizers DDS/PLL # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS290 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_FXAS21002C is not set # CONFIG_MPU3050_I2C is not set # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # end of Digital gyroscope sensors # # Health Sensors # # # Heart Rate Monitors # # CONFIG_AFE4403 is not set # CONFIG_AFE4404 is not set # CONFIG_MAX30100 is not set # CONFIG_MAX30102 is not set # end of Heart Rate Monitors # end of Health Sensors # # Humidity sensors # # CONFIG_AM2315 is not set # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HDC2010 is not set # CONFIG_HTS221 is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # end of Humidity sensors # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16460 is not set # CONFIG_ADIS16475 is not set # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set # CONFIG_BOSCH_BNO055_SERIAL is not set # CONFIG_BOSCH_BNO055_I2C is not set # CONFIG_FXOS8700_I2C is not set # CONFIG_FXOS8700_SPI is not set # CONFIG_KMX61 is not set # CONFIG_INV_ICM42600_I2C is not set # CONFIG_INV_ICM42600_SPI is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set # CONFIG_IIO_ST_LSM6DSX is not set # CONFIG_IIO_ST_LSM9DS0 is not set # end of Inertial measurement units # # Light sensors # # CONFIG_ADJD_S311 is not set # CONFIG_ADUX1020 is not set # CONFIG_AL3010 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_AS73211 is not set # CONFIG_BH1750 is not set # CONFIG_BH1780 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM3605 is not set # CONFIG_CM36651 is not set # CONFIG_GP2AP002 is not set # CONFIG_GP2AP020A00F is not set # CONFIG_SENSORS_ISL29018 is not set # CONFIG_SENSORS_ISL29028 is not set # CONFIG_ISL29125 is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_LTRF216A is not set # CONFIG_LV0104CS is not set # CONFIG_MAX44000 is not set # CONFIG_MAX44009 is not set # CONFIG_NOA1305 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1133 is not set # CONFIG_SI1145 is not set # CONFIG_STK3310 is not set # CONFIG_ST_UVIS25 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set # CONFIG_SENSORS_TSL2563 is not set # CONFIG_TSL2583 is not set # CONFIG_TSL2591 is not set # CONFIG_TSL2772 is not set # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VCNL4035 is not set # CONFIG_VEML6030 is not set # CONFIG_VEML6070 is not set # CONFIG_VL6180 is not set # CONFIG_ZOPT2201 is not set # end of Light sensors # # Magnetometer sensors # # CONFIG_AK8974 is not set # CONFIG_AK8975 is not set # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN_I2C is not set # CONFIG_BMC150_MAGN_SPI is not set # CONFIG_MAG3110 is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # CONFIG_SENSORS_RM3100_I2C is not set # CONFIG_SENSORS_RM3100_SPI is not set # CONFIG_YAMAHA_YAS530 is not set # end of Magnetometer sensors # # Multiplexers # # CONFIG_IIO_MUX is not set # end of Multiplexers # # Inclinometer sensors # # end of Inclinometer sensors # # Triggers - standalone # # CONFIG_IIO_INTERRUPT_TRIGGER is not set # CONFIG_IIO_SYSFS_TRIGGER is not set # end of Triggers - standalone # # Linear and angular position sensors # # end of Linear and angular position sensors # # Digital potentiometers # # CONFIG_AD5110 is not set # CONFIG_AD5272 is not set # CONFIG_DS1803 is not set # CONFIG_MAX5432 is not set # CONFIG_MAX5481 is not set # CONFIG_MAX5487 is not set # CONFIG_MCP4018 is not set # CONFIG_MCP4131 is not set # CONFIG_MCP4531 is not set # CONFIG_MCP41010 is not set # CONFIG_TPL0102 is not set # end of Digital potentiometers # # Digital potentiostats # # CONFIG_LMP91000 is not set # end of Digital potentiostats # # Pressure sensors # # CONFIG_ABP060MG is not set # CONFIG_BMP280 is not set # CONFIG_DLHL60D is not set # CONFIG_DPS310 is not set # CONFIG_HP03 is not set # CONFIG_ICP10100 is not set # CONFIG_MPL115_I2C is not set # CONFIG_MPL115_SPI is not set # CONFIG_MPL3115 is not set # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # CONFIG_HP206C is not set # CONFIG_ZPA2326 is not set # end of Pressure sensors # # Lightning sensors # # CONFIG_AS3935 is not set # end of Lightning sensors # # Proximity and distance sensors # # CONFIG_ISL29501 is not set # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_MB1232 is not set # CONFIG_PING is not set # CONFIG_RFD77402 is not set # CONFIG_SRF04 is not set # CONFIG_SX9310 is not set # CONFIG_SX9324 is not set # CONFIG_SX9360 is not set # CONFIG_SX9500 is not set # CONFIG_SRF08 is not set # CONFIG_VCNL3020 is not set # CONFIG_VL53L0X_I2C is not set # end of Proximity and distance sensors # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1200 is not set # end of Resolver to digital converters # # Temperature sensors # # CONFIG_LTC2983 is not set # CONFIG_MAXIM_THERMOCOUPLE is not set # CONFIG_MLX90614 is not set # CONFIG_MLX90632 is not set # CONFIG_TMP006 is not set # CONFIG_TMP007 is not set # CONFIG_TMP117 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_MAX31856 is not set # CONFIG_MAX31865 is not set # end of Temperature sensors # CONFIG_NTB is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_DEBUG is not set # CONFIG_PWM_ATMEL_TCB is not set # CONFIG_PWM_CLK is not set # CONFIG_PWM_DWC is not set # CONFIG_PWM_FSL_FTM is not set CONFIG_PWM_MESON=y # CONFIG_PWM_PCA9685 is not set # CONFIG_PWM_XILINX is not set # # IRQ chip support # CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 CONFIG_ARM_GIC_V2M=y CONFIG_ARM_GIC_V3=y CONFIG_ARM_GIC_V3_ITS=y CONFIG_ARM_GIC_V3_ITS_PCI=y # CONFIG_AL_FIC is not set # CONFIG_XILINX_INTC is not set CONFIG_PARTITION_PERCPU=y CONFIG_MESON_IRQ_GPIO=y # end of IRQ chip support # CONFIG_IPACK_BUS is not set CONFIG_RESET_CONTROLLER=y CONFIG_RESET_MESON=y CONFIG_RESET_MESON_AUDIO_ARB=y # CONFIG_RESET_SIMPLE is not set # CONFIG_RESET_TI_SYSCON is not set # CONFIG_RESET_TI_TPS380X is not set # # PHY Subsystem # CONFIG_GENERIC_PHY=y CONFIG_GENERIC_PHY_MIPI_DPHY=y # CONFIG_PHY_XGENE is not set # CONFIG_PHY_CAN_TRANSCEIVER is not set CONFIG_PHY_MESON8B_USB2=y CONFIG_PHY_MESON_GXL_USB2=y CONFIG_PHY_MESON_G12A_MIPI_DPHY_ANALOG=y CONFIG_PHY_MESON_G12A_USB2=y CONFIG_PHY_MESON_G12A_USB3_PCIE=y CONFIG_PHY_MESON_AXG_PCIE=y CONFIG_PHY_MESON_AXG_MIPI_PCIE_ANALOG=y CONFIG_PHY_MESON_AXG_MIPI_DPHY=y # # PHY drivers for Broadcom platforms # # CONFIG_BCM_KONA_USB2_PHY is not set # end of PHY drivers for Broadcom platforms # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_DPHY_RX is not set # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_CADENCE_SALVO is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_LAN966X_SERDES is not set # CONFIG_PHY_CPCAP_USB is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set # CONFIG_PHY_OCELOT_SERDES is not set # CONFIG_PHY_SAMSUNG_USB2 is not set # end of PHY Subsystem # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCI_PMU is not set # CONFIG_ARM_CCN is not set # CONFIG_ARM_CMN is not set # CONFIG_ARM_PMU is not set # CONFIG_ARM_DSU_PMU is not set # CONFIG_ARM_SPE_PMU is not set # CONFIG_HISI_PCIE_PMU is not set # CONFIG_HNS3_PMU is not set # end of Performance monitor support CONFIG_RAS=y # CONFIG_USB4 is not set # # Android # # CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_LIBNVDIMM is not set # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y CONFIG_NVMEM_MESON_EFUSE=y # CONFIG_NVMEM_MESON_MX_EFUSE is not set # CONFIG_NVMEM_RMEM is not set # CONFIG_NVMEM_SPMI_SDAM is not set # CONFIG_NVMEM_U_BOOT_ENV is not set # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # CONFIG_HISI_PTT is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_FSI is not set CONFIG_TEE=y CONFIG_OPTEE=y CONFIG_MULTIPLEXER=y # # Multiplexer drivers # # CONFIG_MUX_ADG792A is not set # CONFIG_MUX_ADGS1408 is not set # CONFIG_MUX_GPIO is not set # CONFIG_MUX_MMIO is not set # end of Multiplexer drivers CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set # CONFIG_PECI is not set # CONFIG_HTE is not set # end of Device Drivers # # 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 CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=m CONFIG_XFS_SUPPORT_V4=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_ONLINE_SCRUB is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_BTRFS_FS_REF_VERIFY is not set # CONFIG_NILFS2_FS is not set CONFIG_F2FS_FS=m CONFIG_F2FS_STAT_FS=y # CONFIG_F2FS_FS_XATTR is not set CONFIG_F2FS_CHECK_FS=y # CONFIG_F2FS_FAULT_INJECTION is not set # CONFIG_F2FS_FS_COMPRESSION is not set CONFIG_F2FS_IOSTAT=y # CONFIG_F2FS_UNFAIR_RWSEM is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y # CONFIG_QUOTA is not set CONFIG_AUTOFS4_FS=y CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=m # CONFIG_CUSE is not set # CONFIG_VIRTIO_FS is not set CONFIG_OVERLAY_FS=m # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_XINO_AUTO is not set # CONFIG_OVERLAY_FS_METACOPY is not set # # Caches # CONFIG_NETFS_SUPPORT=y # CONFIG_NETFS_STATS is not set CONFIG_FSCACHE=y # CONFIG_FSCACHE_STATS is not set # CONFIG_FSCACHE_DEBUG is not set # CONFIG_CACHEFILES is not set # end of Caches # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=y # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=m CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set CONFIG_NTFS3_FS=m # CONFIG_NTFS3_64BIT_CLUSTER is not set # CONFIG_NTFS3_LZX_XPRESS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_TMPFS_INODE64 is not set CONFIG_ARCH_SUPPORTS_HUGETLBFS=y # CONFIG_HUGETLBFS is not set CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=y # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set CONFIG_HFS_FS=m CONFIG_HFSPLUS_FS=m # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS2_FS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y # CONFIG_SQUASHFS_FILE_CACHE is not set CONFIG_SQUASHFS_FILE_DIRECT=y # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_PSTORE is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y CONFIG_NFS_SWAP=y CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" CONFIG_NFS_V4_1_MIGRATION=y CONFIG_ROOT_NFS=y CONFIG_NFS_FSCACHE=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFS_DISABLE_UDP_SUPPORT=y # CONFIG_NFS_V4_2_READ_PLUS is not set # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_COMMON=y CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y CONFIG_SUNRPC_SWAP=y CONFIG_RPCSEC_GSS_KRB5=m # CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES is not set # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS2=y CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set CONFIG_CIFS_DEBUG=y # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DEBUG_DUMP_KEYS is not set # CONFIG_CIFS_DFS_UPCALL is not set # CONFIG_CIFS_SWN_UPCALL is not set CONFIG_CIFS_FSCACHE=y # CONFIG_CIFS_ROOT is not set # CONFIG_SMB_SERVER is not set CONFIG_SMBFS_COMMON=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_BIG_KEYS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEY_DH_OPERATIONS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_LSM="yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_STACK_ALL_PATTERN is not set # CONFIG_INIT_STACK_ALL_ZERO is not set # CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization CONFIG_RANDSTRUCT_NONE=y # CONFIG_RANDSTRUCT_FULL is not set # CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y CONFIG_CRYPTO_PCRYPT=y CONFIG_CRYPTO_CRYPTD=y # CONFIG_CRYPTO_AUTHENC is not set # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_ENGINE=y # end of Crypto core or helper # # Public-key cryptography # CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y # CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set CONFIG_CRYPTO_ECC=m CONFIG_CRYPTO_ECDH=m # CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set # end of Public-key cryptography # # Block ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set CONFIG_CRYPTO_SM4=y # CONFIG_CRYPTO_SM4_GENERIC is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_ARC4 is not set CONFIG_CRYPTO_CHACHA20=y CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CFB=m CONFIG_CRYPTO_CTR=y CONFIG_CRYPTO_CTS=m CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set CONFIG_CRYPTO_NHPOLY1305=y # end of Length-preserving ciphers and modes # # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=m # CONFIG_CRYPTO_ESSIV is not set # end of AEAD (authenticated encryption with associated data) ciphers # # Hashes, digests, and MACs # CONFIG_CRYPTO_BLAKE2B=m CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y CONFIG_CRYPTO_MICHAEL_MIC=m CONFIG_CRYPTO_POLYVAL=y # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set CONFIG_CRYPTO_SM3=y # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_XCBC is not set CONFIG_CRYPTO_XXHASH=y # end of Hashes, digests, and MACs # # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_CRC64_ROCKSOFT=y # end of CRCs (cyclic redundancy checks) # # Compression # # CONFIG_CRYPTO_DEFLATE is not set # CONFIG_CRYPTO_LZO is not set # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # end of Compression # # Random number generation # CONFIG_CRYPTO_ANSI_CPRNG=y CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation # # Userspace interface # CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set # CONFIG_CRYPTO_USER_API_AEAD is not set CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y CONFIG_CRYPTO_NHPOLY1305_NEON=y CONFIG_CRYPTO_CHACHA20_NEON=y # # Accelerated Cryptographic Algorithms for CPU (arm64) # CONFIG_CRYPTO_GHASH_ARM64_CE=y CONFIG_CRYPTO_POLY1305_NEON=y CONFIG_CRYPTO_SHA1_ARM64_CE=y CONFIG_CRYPTO_SHA256_ARM64=y CONFIG_CRYPTO_SHA2_ARM64_CE=y CONFIG_CRYPTO_SHA512_ARM64=y CONFIG_CRYPTO_SHA512_ARM64_CE=y # CONFIG_CRYPTO_SHA3_ARM64 is not set # CONFIG_CRYPTO_SM3_NEON is not set CONFIG_CRYPTO_SM3_ARM64_CE=y CONFIG_CRYPTO_POLYVAL_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64=y CONFIG_CRYPTO_AES_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64_CE_BLK=y CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y CONFIG_CRYPTO_AES_ARM64_BS=y # CONFIG_CRYPTO_SM4_ARM64_CE is not set CONFIG_CRYPTO_SM4_ARM64_CE_BLK=y CONFIG_CRYPTO_SM4_ARM64_NEON_BLK=y CONFIG_CRYPTO_AES_ARM64_CE_CCM=y CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=y # end of Accelerated Cryptographic Algorithms for CPU (arm64) CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_ATMEL_ECC is not set # CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set # CONFIG_CRYPTO_DEV_CCP is not set # CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set # CONFIG_CRYPTO_DEV_QAT_C3XXX is not set # CONFIG_CRYPTO_DEV_QAT_C62X is not set # CONFIG_CRYPTO_DEV_QAT_4XXX is not set # CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set # CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set # CONFIG_CRYPTO_DEV_QAT_C62XVF is not set # CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set # CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set # CONFIG_CRYPTO_DEV_SAFEXCEL is not set # CONFIG_CRYPTO_DEV_CCREE is not set # CONFIG_CRYPTO_DEV_HISI_SEC is not set CONFIG_CRYPTO_DEV_AMLOGIC_GXL=y # CONFIG_CRYPTO_DEV_AMLOGIC_GXL_DEBUG is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS8_PRIVATE_KEY_PARSER=m CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m # CONFIG_RAID6_PQ_BENCHMARK is not set CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_CORDIC=m # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y # CONFIG_INDIRECT_PIO is not set # # Crypto library routines # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y CONFIG_CRYPTO_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=y CONFIG_CRYPTO_LIB_CURVE25519=y CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y CONFIG_CRYPTO_LIB_POLY1305=y CONFIG_CRYPTO_LIB_CHACHA20POLY1305=y CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_CRC_CCITT=m CONFIG_CRC16=y CONFIG_CRC_T10DIF=y CONFIG_CRC64_ROCKSOFT=y CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set CONFIG_CRC64=y # CONFIG_CRC4 is not set CONFIG_CRC7=y CONFIG_LIBCRC32C=m # CONFIG_CRC8 is not set CONFIG_XXHASH=y CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=m CONFIG_LZO_COMPRESS=m CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=m CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set # CONFIG_XZ_DEC_IA64 is not set # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set # CONFIG_XZ_DEC_MICROLZMA is not set # CONFIG_XZ_DEC_TEST is not set CONFIG_GENERIC_ALLOCATOR=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_DMA_DECLARE_COHERENT=y CONFIG_ARCH_HAS_SETUP_DMA_OPS=y CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y CONFIG_SWIOTLB=y # CONFIG_DMA_RESTRICTED_POOL is not set CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_COHERENT_POOL=y CONFIG_DMA_DIRECT_REMAP=y CONFIG_DMA_CMA=y # CONFIG_DMA_PERNUMA_CMA is not set # # 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_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y # CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_TIME_NS=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_ARCH_STACKWALK=y CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y # end of Library routines CONFIG_GENERIC_IOREMAP=y CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set # CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_SYMBOLIC_ERRNAME=y CONFIG_DEBUG_BUGVERBOSE=y # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Compile-time checks and compiler options # CONFIG_AS_HAS_NON_CONST_LEB128=y CONFIG_DEBUG_INFO_NONE=y # CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=2048 CONFIG_STRIP_ASM_SYMS=y # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y # CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set CONFIG_HAVE_ARCH_KCSAN=y CONFIG_HAVE_KCSAN_COMPILER=y # CONFIG_KCSAN is not set # end of Generic Kernel Debugging Instruments # # Networking Debugging # # CONFIG_NET_DEV_REFCNT_TRACKER is not set # CONFIG_NET_NS_REFCNT_TRACKER is not set # CONFIG_DEBUG_NET is not set # end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_PTDUMP_DEBUGFS is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM_PGTABLE is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y CONFIG_HAVE_ARCH_KASAN_HW_TAGS=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_KASAN_SW_TAGS=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y # CONFIG_KFENCE is not set # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 # CONFIG_SOFTLOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # # CONFIG_SCHED_DEBUG is not set # CONFIG_SCHEDSTATS is not set # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set CONFIG_DEBUG_PREEMPT=y # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set CONFIG_DEBUG_RT_MUTEXES=y CONFIG_DEBUG_SPINLOCK=y CONFIG_DEBUG_MUTEXES=y CONFIG_DEBUG_WW_MUTEX_SLOWPATH=y CONFIG_DEBUG_RWSEMS=y CONFIG_DEBUG_LOCK_ALLOC=y CONFIG_LOCKDEP=y CONFIG_LOCKDEP_BITS=15 CONFIG_LOCKDEP_CHAINS_BITS=16 CONFIG_LOCKDEP_STACK_TRACE_BITS=19 CONFIG_LOCKDEP_STACK_TRACE_HASH_BITS=14 CONFIG_LOCKDEP_CIRCULAR_QUEUE_BITS=12 # CONFIG_DEBUG_LOCKDEP is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_SAMPLES is not set # CONFIG_STRICT_DEVMEM is not set # # arm64 Debugging # # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_ARM64_RELOC_TEST is not set # CONFIG_CORESIGHT is not set # end of arm64 Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_RUNTIME_TESTING_MENU is not set CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage # # Rust hacking # # end of Rust hacking # end of Kernel hacking ================================================ FILE: projects/Amlogic/options ================================================ ################################################################################ # setup system defaults ################################################################################ # Bootloader to use (syslinux / u-boot / bcm2835-bootloader) BOOTLOADER="u-boot" # U-Boot firmware package(s) to use UBOOT_FIRMWARE="amlogic-boot-fip u-boot-script" # Kernel to use LINUX="amlogic" # Kernel target KERNEL_TARGET="uImage.lzo" # Kernel uImage load address KERNEL_UIMAGE_LOADADDR="0x1080000" # Kernel uImage entry address KERNEL_UIMAGE_ENTRYADDR="0x1080000" # Additional kernel make parameters KERNEL_MAKE_EXTRACMD="dtbs" # kernel serial console EXTRA_CMDLINE="systemd.debug_shell=ttyAML0 console=ttyAML0,115200n8 console=tty0" ################################################################################ # setup build defaults ################################################################################ # Project CFLAGS PROJECT_CFLAGS="" # SquashFS compression method (gzip / lzo / xz / zstd) SQUASHFS_COMPRESSION="zstd" ################################################################################ # setup project defaults ################################################################################ # OpenGL(X) implementation to use (no / mesa) OPENGL="no" # Vulkan implementation to use (vulkan-loader / no) VULKAN="no" # Displayserver to use (wl / no) DISPLAYSERVER="no" # Windowmanager to use (weston / no) WINDOWMANAGER="no" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" FIRMWARE="dvb-firmware brcmfmac_sdio-firmware kernel-firmware" # build with installer (yes / no) INSTALLER_SUPPORT="no" # additional drivers to install: # for a list of additional drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS+=" DRIVER1 DRIVER2" ADDITIONAL_DRIVERS+="" # build and install driver addons (yes / no) DRIVER_ADDONS_SUPPORT="no" # driver addons to install: # for a list of additional drivers see packages/linux-driver-addons # Space separated list is supported, DRIVER_ADDONS="crazycat dvb-latest" # additional packages to install: ADDITIONAL_PACKAGES+=" dtc ethmactool emmctool flashrom pciutils" # use the kernel CEC framework for libcec (yes / no) CEC_FRAMEWORK_SUPPORT="yes" # debug tty path DEBUG_TTY="/dev/ttyAML0" ================================================ FILE: projects/Amlogic/packages/systemd/scripts/cpufreq ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2015 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) SYS_CPUFREQ_GOV=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor) if [ "${SYS_CPUFREQ_GOV}" = "ondemand" ]; then for io_is_busy in $(find /sys/devices/system/cpu -name io_is_busy); do echo 1 > "${io_is_busy}" done for up_threshold in $(find /sys/devices/system/cpu -name up_threshold); do echo 50 > "${up_threshold}" done for sampling_rate in $(find /sys/devices/system/cpu -name sampling_rate); do echo 100000 > "${sampling_rate}" done for sampling_down_factor in $(find /sys/devices/system/cpu -name sampling_down_factor); do echo 50 > "${sampling_down_factor}" done else echo "cpufreq: settings not found for current cpu governor." | systemd-cat -p info fi ================================================ FILE: projects/Amlogic/patches/alsa-lib/amlogic-0001-WIP-add-confs-for-gx-sound-card-and-axg-sound-card.patch ================================================ From 34dbf4272c3036a7e8b208ad8dc35a035918af66 Mon Sep 17 00:00:00 2001 From: chewitt <christianshewitt@gmail.com> Date: Thu, 14 May 2020 13:31:34 +0000 Subject: [PATCH 1/2] WIP: add confs for gx-sound-card and axg-sound-card --- src/conf/cards/axg-sound-card.conf | 87 ++++++++++++++++++++++++++++++ src/conf/cards/gx-sound-card.conf | 87 ++++++++++++++++++++++++++++++ 2 files changed, 174 insertions(+) create mode 100644 src/conf/cards/axg-sound-card.conf create mode 100644 src/conf/cards/gx-sound-card.conf diff --git a/src/conf/cards/axg-sound-card.conf b/src/conf/cards/axg-sound-card.conf new file mode 100644 index 00000000..f3caaed0 --- /dev/null +++ b/src/conf/cards/axg-sound-card.conf @@ -0,0 +1,87 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) + +# +# Configuration for Amlogic AXG audio +# + +axg-sound-card.pcm.default { + @args [ CARD ] + @args.CARD { type string } + type softvol + slave.pcm { + type plug + slave { + pcm { + type hw + card $CARD + device 0 + } + } + } + control { + name "PCM Playback Volume" + card $CARD + } +} + +<confdir:pcm/hdmi.conf> + +axg-sound-card.pcm.hdmi.0 { + @args [ CARD AES0 AES1 AES2 AES3 ] + @args.CARD { type string } + @args.AES0 { type integer } + @args.AES1 { type integer } + @args.AES2 { type integer } + @args.AES3 { type integer } + type hooks + slave.pcm { + type hw + card $CARD + device 0 + } + hooks.0 { + type ctl_elems + hook_args [ + { + name "IEC958 Playback Default" + interface PCM + lock true + preserve true + optional true + value [ $AES0 $AES1 $AES2 $AES3 ] + } + ] + } +} + +<confdir:pcm/iec958.conf> + +axg-sound-card.pcm.iec958.0 { + @args [ CARD AES0 AES1 AES2 AES3 ] + @args.CARD { type string } + @args.AES0 { type integer } + @args.AES1 { type integer } + @args.AES2 { type integer } + @args.AES3 { type integer } + type hooks + slave.pcm { + type hw + card $CARD + device 1 + } + hooks.0 { + type ctl_elems + hook_args [ + { + name "IEC958 Playback Default" + interface PCM + lock true + preserve true + optional true + value [ $AES0 $AES1 $AES2 $AES3 ] + } + ] + } + hint.device 1 +} diff --git a/src/conf/cards/gx-sound-card.conf b/src/conf/cards/gx-sound-card.conf new file mode 100644 index 00000000..b669a260 --- /dev/null +++ b/src/conf/cards/gx-sound-card.conf @@ -0,0 +1,87 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) + +# +# Configuration for Amlogic AIU audio +# + +gx-sound-card.pcm.default { + @args [ CARD ] + @args.CARD { type string } + type softvol + slave.pcm { + type plug + slave { + pcm { + type hw + card $CARD + device 0 + } + } + } + control { + name "PCM Playback Volume" + card $CARD + } +} + +<confdir:pcm/hdmi.conf> + +gx-sound-card.pcm.hdmi.0 { + @args [ CARD AES0 AES1 AES2 AES3 ] + @args.CARD { type string } + @args.AES0 { type integer } + @args.AES1 { type integer } + @args.AES2 { type integer } + @args.AES3 { type integer } + type hooks + slave.pcm { + type hw + card $CARD + device 0 + } + hooks.0 { + type ctl_elems + hook_args [ + { + name "IEC958 Playback Default" + interface PCM + lock true + preserve true + optional true + value [ $AES0 $AES1 $AES2 $AES3 ] + } + ] + } +} + +<confdir:pcm/iec958.conf> + +gx-sound-card.pcm.iec958.0 { + @args [ CARD AES0 AES1 AES2 AES3 ] + @args.CARD { type string } + @args.AES0 { type integer } + @args.AES1 { type integer } + @args.AES2 { type integer } + @args.AES3 { type integer } + type hooks + slave.pcm { + type hw + card $CARD + device 1 + } + hooks.0 { + type ctl_elems + hook_args [ + { + name "IEC958 Playback Default" + interface PCM + lock true + preserve true + optional true + value [ $AES0 $AES1 $AES2 $AES3 ] + } + ] + } + hint.device 1 +} -- 2.17.1 ================================================ FILE: projects/Amlogic/patches/alsa-lib/amlogic-0002-WIP-add-Amlogic-cards-to-Makefile.am.patch ================================================ From 2891f697cbfea4f0bf60bc476e78ab25947ac810 Mon Sep 17 00:00:00 2001 From: chewitt <christianshewitt@gmail.com> Date: Fri, 15 May 2020 06:12:43 +0000 Subject: [PATCH 2/2] WIP: add Amlogic cards to Makefile.am --- src/conf/cards/Makefile.am | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/conf/cards/Makefile.am b/src/conf/cards/Makefile.am index 00999f01..dc2881d7 100644 --- a/src/conf/cards/Makefile.am +++ b/src/conf/cards/Makefile.am @@ -12,6 +12,7 @@ cfg_files = aliases.conf \ Audigy2.conf \ Aureon51.conf \ Aureon71.conf \ + axg-sound-card.conf \ CA0106.conf \ CMI8338.conf \ CMI8338-SWIEC.conf \ @@ -29,6 +30,7 @@ cfg_files = aliases.conf \ FWSpeakers.conf \ FireWave.conf \ GUS.conf \ + gx-sound-card.conf \ HDA-Intel.conf \ HdmiLpeAudio.conf \ ICE1712.conf \ -- 2.17.1 ================================================ FILE: projects/Amlogic/patches/ffmpeg/ffmpeg-hevc-001.patch ================================================ From 5da6d4bdf0ce603d48415dcbc657e56a050a8d24 Mon Sep 17 00:00:00 2001 From: John Cox <jc@kynesim.co.uk> Date: Wed, 11 Jan 2023 16:30:37 +0000 Subject: [PATCH] v4l2_m2m_dec: Fix initial pkt send if no extradata --- libavcodec/v4l2_m2m_dec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c index b58657021c..d540d00bdd 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -240,7 +240,7 @@ copy_extradata(AVCodecContext * const avctx, else len = src_len < 0 ? AVERROR(EINVAL) : src_len; - // Zero length is OK but we swant to stop - -ve is error val + // Zero length is OK but we want to stop - -ve is error val if (len <= 0) return len; @@ -533,7 +533,7 @@ static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const if (s->extdata_sent) ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, NULL, 0); - else if (s->extdata_data) + else ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, s->extdata_data, s->extdata_size); if (ret == AVERROR(EAGAIN)) { ================================================ FILE: projects/Amlogic/patches/ffmpeg/ffmpeg-hevc-002.patch ================================================ From 89a5440ab5110d5460c4919865016e66b9dfbc48 Mon Sep 17 00:00:00 2001 From: John Cox <jc@kynesim.co.uk> Date: Wed, 11 Jan 2023 18:34:04 +0000 Subject: [PATCH] Make capture timeout long once we've started getting frames --- libavcodec/v4l2_m2m.h | 1 + libavcodec/v4l2_m2m_dec.c | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h index 058cec5033..87f81febd2 100644 --- a/libavcodec/v4l2_m2m.h +++ b/libavcodec/v4l2_m2m.h @@ -88,6 +88,7 @@ typedef struct V4L2m2mContext { /* null frame/packet received */ int draining; + int running; AVPacket buf_pkt; /* Reference to self; only valid while codec is active. */ diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c index d540d00bdd..6078811404 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -622,7 +622,7 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) const int t = src_rv == NQ_Q_FULL ? -1 : src_rv == NQ_DRAINING ? 300 : - prefer_dq ? 5 : 0; + prefer_dq ? (s->running ? 100 : 5) : 0; // Dequeue frame will unref any previous contents of frame // if it returns success so we don't need an explicit unref @@ -639,6 +639,11 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) } } + if (s->running != (dst_rv == 0) && prefer_dq) { + s->running = (dst_rv == 0); + av_log(avctx, AV_LOG_VERBOSE, "%s running\n", s->running ? "Start" : "Stop"); + } + if (dst_rv == 0) set_best_effort_pts(avctx, &s->pts_stat, frame); @@ -1006,7 +1011,8 @@ static void v4l2_decode_flush(AVCodecContext *avctx) // resend extradata s->extdata_sent = 0; - // clear EOS status vars + // clear status vars + s->running = 0; s->draining = 0; output->done = 0; capture->done = 0; ================================================ FILE: projects/Amlogic/patches/ffmpeg/ffmpeg-hevc-003.patch ================================================ From 840aae6cdcc1b1d3ef11da1c33a7ed6519a64cd6 Mon Sep 17 00:00:00 2001 From: John Cox <jc@kynesim.co.uk> Date: Fri, 13 Jan 2023 17:56:55 +0000 Subject: [PATCH] Be much more relaxed before long timeout --- libavcodec/v4l2_m2m.h | 2 +- libavcodec/v4l2_m2m_dec.c | 20 ++++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h index 87f81febd2..c109b21d08 100644 --- a/libavcodec/v4l2_m2m.h +++ b/libavcodec/v4l2_m2m.h @@ -66,7 +66,7 @@ typedef struct pts_stats_s typedef struct xlat_track_s { unsigned int track_no; - int64_t last_pts; + int64_t last_pts; // Last valid PTS decoded int64_t last_opaque; V4L2m2mTrackEl track_els[FF_V4L2_M2M_TRACK_SIZE]; } xlat_track_t; diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c index 6078811404..2bd113facb 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -590,7 +590,7 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) do { const int pending = xlat_pending(&s->xlat); - const int prefer_dq = (pending > 3); + const int prefer_dq = (pending > 4); const int last_src_rv = src_rv; av_log(avctx, AV_LOG_TRACE, "Pending=%d, src_rv=%d, req_pkt=%d\n", pending, src_rv, s->req_pkt); @@ -619,10 +619,14 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) // (b) enqueue returned a status indicating that decode should be attempted if (dst_rv != 0 && TRY_DQ(src_rv)) { // Pick a timeout depending on state + // The pending count isn't completely reliable so it is good enough + // hint that we want a frame but not good enough to require it in + // all cases; however if it has got > 31 that exceeds its margin of + // error so require a frame to prevent ridiculous levels of latency const int t = src_rv == NQ_Q_FULL ? -1 : src_rv == NQ_DRAINING ? 300 : - prefer_dq ? (s->running ? 100 : 5) : 0; + prefer_dq ? (s->running && pending > 31 ? 100 : 5) : 0; // Dequeue frame will unref any previous contents of frame // if it returns success so we don't need an explicit unref @@ -639,13 +643,13 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) } } - if (s->running != (dst_rv == 0) && prefer_dq) { - s->running = (dst_rv == 0); - av_log(avctx, AV_LOG_VERBOSE, "%s running\n", s->running ? "Start" : "Stop"); - } - - if (dst_rv == 0) + if (dst_rv == 0) { set_best_effort_pts(avctx, &s->pts_stat, frame); + if (!s->running) { + s->running = 1; + av_log(avctx, AV_LOG_VERBOSE, "Decode running\n"); + } + } if (dst_rv == AVERROR(EAGAIN) && src_rv == NQ_DRAINING) { av_log(avctx, AV_LOG_WARNING, "Timeout in drain - assume EOF"); ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0001-LOCAL-configs-meson64-prevent-stdout-stderr-on-video.patch ================================================ From 95ed57b0ca24cde1d7547878101c62f552cb1160 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Fri, 13 Nov 2020 02:09:36 +0000 Subject: [PATCH 01/25] LOCAL: configs: meson64: prevent stdout/stderr on videoconsole Several devices have CONFIG_DM_VIDEO enabled which causes stdout/stderr to appear on videoconsole, so remove videoconsole from STDOUT so that early u-boot boot remains silent unless using the uart/serial console. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- include/configs/meson64.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/configs/meson64.h b/include/configs/meson64.h index 40803ee9da..05b1fcb9fd 100644 --- a/include/configs/meson64.h +++ b/include/configs/meson64.h @@ -18,7 +18,7 @@ /* For splashscreen */ #ifdef CONFIG_DM_VIDEO -#define STDOUT_CFG "vidconsole,serial" +#define STDOUT_CFG "serial" #else #define STDOUT_CFG "serial" #endif -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0002-LOCAL-configs-meson64-remove-amlogic-so-fdtdir-finds.patch ================================================ From d16384b766e1704470f678589e01d288fbb94960 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Thu, 22 Apr 2021 06:52:50 +0000 Subject: [PATCH 02/25] LOCAL: configs: meson64: remove /amlogic so fdtdir finds LE boot files --- include/configs/meson64.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/configs/meson64.h b/include/configs/meson64.h index 05b1fcb9fd..c4af944382 100644 --- a/include/configs/meson64.h +++ b/include/configs/meson64.h @@ -89,7 +89,7 @@ "pxefile_addr_r=0x01080000\0" \ "fdtoverlay_addr_r=0x01000000\0" \ "ramdisk_addr_r=0x13000000\0" \ - "fdtfile=amlogic/" CONFIG_DEFAULT_DEVICE_TREE ".dtb\0" \ + "fdtfile=/" CONFIG_DEFAULT_DEVICE_TREE ".dtb\0" \ BOOTENV #endif -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0003-LOCAL-board-amlogic-odroid-n2-remove-amlogic-prefix-.patch ================================================ From a9fc1d56916fbcf4e00a1dd7543c9f53d697477a Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Tue, 3 Aug 2021 18:42:55 +0000 Subject: [PATCH 03/25] LOCAL: board: amlogic: odroid-n2: remove /amlogic/ prefix for dtb path Remove the /amlogic/ prefix to align with current LE dtb locations. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- board/amlogic/odroid-n2/odroid-n2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/board/amlogic/odroid-n2/odroid-n2.c b/board/amlogic/odroid-n2/odroid-n2.c index 2135457edd..ec1f4efc11 100644 --- a/board/amlogic/odroid-n2/odroid-n2.c +++ b/board/amlogic/odroid-n2/odroid-n2.c @@ -63,7 +63,7 @@ static void odroid_set_fdtfile(char *soc, char *variant) { char s[128]; - snprintf(s, sizeof(s), "amlogic/meson-%s-odroid-%s.dtb", soc, variant); + snprintf(s, sizeof(s), "meson-%s-odroid-%s.dtb", soc, variant); env_set("fdtfile", s); } -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0004-BACKPORT-arm64-dts-meson-nanopi-k2-readd-PHY-reset-p.patch ================================================ From 7d8355053316d3f760a5ac14156e77e27aa5f6d5 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Tue, 25 Oct 2022 14:24:21 +0000 Subject: [PATCH 04/25] BACKPORT: arm64: dts: meson: nanopi-k2: readd PHY reset properties The sync of device-tree/bindings in 11a48a5a18c6 ("Linux 5.6-rc2") causes Ethernet to break on some GXBB boards; the PHY seems to need proper reset timing to function in u-boot and Linux. Re-add the old PHY reset binding for dwmac until we support new bindings in the PHY node. This borrows the same fix applied to the Odroid C2 board [0]. [0] https://lists.denx.de/pipermail/u-boot/2021-April/446658.html Fixes: dd5f2351e99a ("arm64: dts: meson: sync dt and bindings from v5.6-rc2") Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm/dts/meson-gxbb-nanopi-k2-u-boot.dtsi | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/arch/arm/dts/meson-gxbb-nanopi-k2-u-boot.dtsi b/arch/arm/dts/meson-gxbb-nanopi-k2-u-boot.dtsi index c35158d7e9..2a245bbe7f 100644 --- a/arch/arm/dts/meson-gxbb-nanopi-k2-u-boot.dtsi +++ b/arch/arm/dts/meson-gxbb-nanopi-k2-u-boot.dtsi @@ -5,3 +5,10 @@ */ #include "meson-gx-u-boot.dtsi" + +ðmac { + snps,reset-gpio = <&gpio GPIOZ_14 0>; + snps,reset-delays-us = <0 10000 1000000>; + snps,reset-active-low; +}; + -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0005-WIP-ARM-dts-import-WeTek-Hub-Play2-DTs-from-Linux-5..patch ================================================ From f72090a5d057a18fa8bceec0400c212012f56126 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Tue, 20 Apr 2021 05:19:43 +0000 Subject: [PATCH 05/25] WIP: ARM: dts: import WeTek Hub/Play2 DTs from Linux 5.19 Import the WeTek common dtsi and Hub/Play2 device-trees. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm/dts/Makefile | 2 + arch/arm/dts/meson-gxbb-wetek-hub-u-boot.dtsi | 7 + arch/arm/dts/meson-gxbb-wetek-hub.dts | 58 ++++ .../dts/meson-gxbb-wetek-play2-u-boot.dtsi | 7 + arch/arm/dts/meson-gxbb-wetek-play2.dts | 121 ++++++++ arch/arm/dts/meson-gxbb-wetek.dtsi | 292 ++++++++++++++++++ 6 files changed, 487 insertions(+) create mode 100644 arch/arm/dts/meson-gxbb-wetek-hub-u-boot.dtsi create mode 100644 arch/arm/dts/meson-gxbb-wetek-hub.dts create mode 100644 arch/arm/dts/meson-gxbb-wetek-play2-u-boot.dtsi create mode 100644 arch/arm/dts/meson-gxbb-wetek-play2.dts create mode 100644 arch/arm/dts/meson-gxbb-wetek.dtsi diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index 965895bc2a..4a1ac8ecaf 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile @@ -181,6 +181,8 @@ dtb-$(CONFIG_ARCH_MESON) += \ meson-gxbb-nanopi-k2.dtb \ meson-gxbb-p200.dtb \ meson-gxbb-p201.dtb \ + meson-gxbb-wetek-hub.dtb \ + meson-gxbb-wetek-play2.dtb \ meson-gxl-s805x-libretech-ac.dtb \ meson-gxl-s905d-libretech-pc.dtb \ meson-gxl-s905w-jethome-jethub-j80.dtb \ diff --git a/arch/arm/dts/meson-gxbb-wetek-hub-u-boot.dtsi b/arch/arm/dts/meson-gxbb-wetek-hub-u-boot.dtsi new file mode 100644 index 0000000000..c35158d7e9 --- /dev/null +++ b/arch/arm/dts/meson-gxbb-wetek-hub-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2019 BayLibre, SAS. + * Author: Neil Armstrong <narmstrong@baylibre.com> + */ + +#include "meson-gx-u-boot.dtsi" diff --git a/arch/arm/dts/meson-gxbb-wetek-hub.dts b/arch/arm/dts/meson-gxbb-wetek-hub.dts new file mode 100644 index 0000000000..58733017ed --- /dev/null +++ b/arch/arm/dts/meson-gxbb-wetek-hub.dts @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2016 BayLibre, Inc. + * Author: Neil Armstrong <narmstrong@baylibre.com> + */ + +/dts-v1/; + +#include "meson-gxbb-wetek.dtsi" +#include <dt-bindings/sound/meson-aiu.h> + +/ { + compatible = "wetek,hub", "amlogic,meson-gxbb"; + model = "WeTek Hub"; + + sound { + compatible = "amlogic,gx-sound-card"; + model = "WETEK-HUB"; + assigned-clocks = <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>, + <&clkc CLKID_MPLL2>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&aiu AIU_CPU CPU_I2S_FIFO>; + }; + + dai-link-1 { + sound-dai = <&aiu AIU_CPU CPU_I2S_ENCODER>; + dai-format = "i2s"; + mclk-fs = <256>; + + codec-0 { + sound-dai = <&aiu AIU_HDMI CTRL_I2S>; + }; + }; + + dai-link-2 { + sound-dai = <&aiu AIU_HDMI CTRL_OUT>; + + codec-0 { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&aiu { + status = "okay"; +}; + +&ir { + linux,rc-map-name = "rc-wetek-hub"; +}; diff --git a/arch/arm/dts/meson-gxbb-wetek-play2-u-boot.dtsi b/arch/arm/dts/meson-gxbb-wetek-play2-u-boot.dtsi new file mode 100644 index 0000000000..c35158d7e9 --- /dev/null +++ b/arch/arm/dts/meson-gxbb-wetek-play2-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2019 BayLibre, SAS. + * Author: Neil Armstrong <narmstrong@baylibre.com> + */ + +#include "meson-gx-u-boot.dtsi" diff --git a/arch/arm/dts/meson-gxbb-wetek-play2.dts b/arch/arm/dts/meson-gxbb-wetek-play2.dts new file mode 100644 index 0000000000..6eae692792 --- /dev/null +++ b/arch/arm/dts/meson-gxbb-wetek-play2.dts @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2016 BayLibre, Inc. + * Author: Neil Armstrong <narmstrong@baylibre.com> + */ + +/dts-v1/; + +#include "meson-gxbb-wetek.dtsi" +#include <dt-bindings/input/input.h> +#include <dt-bindings/sound/meson-aiu.h> + +/ { + compatible = "wetek,play2", "amlogic,meson-gxbb"; + model = "WeTek Play 2"; + + spdif_dit: audio-codec-0 { + #sound-dai-cells = <0>; + compatible = "linux,spdif-dit"; + status = "okay"; + sound-name-prefix = "DIT"; + }; + + leds { + led-wifi { + label = "wetek-play:wifi-status"; + gpios = <&gpio GPIODV_26 GPIO_ACTIVE_HIGH>; + default-state = "off"; + }; + + led-ethernet { + label = "wetek-play:ethernet-status"; + gpios = <&gpio GPIODV_27 GPIO_ACTIVE_HIGH>; + default-state = "off"; + }; + }; + + gpio-keys-polled { + compatible = "gpio-keys-polled"; + #address-cells = <1>; + #size-cells = <0>; + poll-interval = <100>; + + button@0 { + label = "reset"; + linux,code = <KEY_RESTART>; + gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_LOW>; + }; + }; + + sound { + compatible = "amlogic,gx-sound-card"; + model = "WETEK-PLAY2"; + assigned-clocks = <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>, + <&clkc CLKID_MPLL2>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&aiu AIU_CPU CPU_I2S_FIFO>; + }; + + dai-link-1 { + sound-dai = <&aiu AIU_CPU CPU_SPDIF_FIFO>; + }; + + dai-link-2 { + sound-dai = <&aiu AIU_CPU CPU_I2S_ENCODER>; + dai-format = "i2s"; + mclk-fs = <256>; + + codec-0 { + sound-dai = <&aiu AIU_HDMI CTRL_I2S>; + }; + }; + + dai-link-3 { + sound-dai = <&aiu AIU_CPU CPU_SPDIF_ENCODER>; + + codec-0 { + sound-dai = <&spdif_dit>; + }; + }; + + dai-link-4 { + sound-dai = <&aiu AIU_HDMI CTRL_OUT>; + + codec-0 { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&aiu { + status = "okay"; + pinctrl-0 = <&spdif_out_y_pins>; + pinctrl-names = "default"; +}; + +&i2c_A { + status = "okay"; + pinctrl-0 = <&i2c_a_pins>; + pinctrl-names = "default"; +}; + +&usb1_phy { + status = "okay"; +}; + +&usb1 { + status = "okay"; +}; + +&ir { + linux,rc-map-name = "rc-wetek-play2"; +}; diff --git a/arch/arm/dts/meson-gxbb-wetek.dtsi b/arch/arm/dts/meson-gxbb-wetek.dtsi new file mode 100644 index 0000000000..3c3eeb148e --- /dev/null +++ b/arch/arm/dts/meson-gxbb-wetek.dtsi @@ -0,0 +1,292 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2016 Andreas Färber + * Copyright (c) 2016 BayLibre, Inc. + * Author: Kevin Hilman <khilman@kernel.org> + */ + +#include "meson-gxbb.dtsi" +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/leds/common.h> + +/ { + aliases { + serial0 = &uart_AO; + ethernet0 = ðmac; + }; + + chosen { + stdout-path = "serial0:115200n8"; + }; + + memory@0 { + device_type = "memory"; + reg = <0x0 0x0 0x0 0x40000000>; + }; + + leds { + compatible = "gpio-leds"; + + led-blue { + /* red in suspend or power-off */ + color = <LED_COLOR_ID_BLUE>; + function = LED_FUNCTION_POWER; + gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_HIGH>; + default-state = "on"; + panic-indicator; + }; + }; + + usb_pwr: regulator-usb-pwrs { + compatible = "regulator-fixed"; + + regulator-name = "USB_PWR"; + + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + + gpio = <&gpio GPIODV_24 GPIO_ACTIVE_HIGH>; + enable-active-high; + }; + + vddio_boot: regulator-vddio_boot { + compatible = "regulator-fixed"; + regulator-name = "VDDIO_BOOT"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + }; + + vddao_3v3: regulator-vddao_3v3 { + compatible = "regulator-fixed"; + regulator-name = "VDDAO_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + + vddio_ao18: regulator-vddio_ao18 { + compatible = "regulator-fixed"; + regulator-name = "VDDIO_AO18"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-always-on; + }; + + vcc_3v3: regulator-vcc_3v3 { + compatible = "regulator-fixed"; + regulator-name = "VCC_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + + emmc_pwrseq: emmc-pwrseq { + compatible = "mmc-pwrseq-emmc"; + reset-gpios = <&gpio BOOT_9 GPIO_ACTIVE_LOW>; + }; + + wifi32k: wifi32k { + compatible = "pwm-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */ + }; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; + clocks = <&wifi32k>; + clock-names = "ext_clock"; + }; + + cvbs-connector { + compatible = "composite-video-connector"; + + port { + cvbs_connector_in: endpoint { + remote-endpoint = <&cvbs_vdac_out>; + }; + }; + }; + + hdmi-connector { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_connector_in: endpoint { + remote-endpoint = <&hdmi_tx_tmds_out>; + }; + }; + }; +}; + +&cec_AO { + status = "okay"; + pinctrl-0 = <&ao_cec_pins>; + pinctrl-names = "default"; + hdmi-phandle = <&hdmi_tx>; +}; + +&cvbs_vdac_port { + cvbs_vdac_out: endpoint { + remote-endpoint = <&cvbs_connector_in>; + }; +}; + +ðmac { + status = "okay"; + pinctrl-0 = <ð_rgmii_pins>; + pinctrl-names = "default"; + + phy-handle = <ð_phy0>; + phy-mode = "rgmii"; + + amlogic,tx-delay-ns = <2>; + + mdio { + compatible = "snps,dwmac-mdio"; + #address-cells = <1>; + #size-cells = <0>; + + eth_phy0: ethernet-phy@0 { + /* Realtek RTL8211F (0x001cc916) */ + reg = <0>; + + reset-assert-us = <10000>; + reset-deassert-us = <80000>; + reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>; + + interrupt-parent = <&gpio_intc>; + /* MAC_INTR on GPIOZ_15 */ + interrupts = <29 IRQ_TYPE_LEVEL_LOW>; + }; + }; +}; + +&hdmi_tx { + status = "okay"; + pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>; + pinctrl-names = "default"; + hdmi-supply = <&vddio_ao18>; +}; + +&hdmi_tx_tmds_port { + hdmi_tx_tmds_out: endpoint { + remote-endpoint = <&hdmi_connector_in>; + }; +}; + +&ir { + status = "okay"; + pinctrl-0 = <&remote_input_ao_pins>; + pinctrl-names = "default"; +}; + +&pwm_ef { + status = "okay"; + pinctrl-0 = <&pwm_e_pins>; + pinctrl-names = "default"; + clocks = <&clkc CLKID_FCLK_DIV4>; + clock-names = "clkin0"; +}; + +&saradc { + status = "okay"; + vref-supply = <&vddio_ao18>; +}; + +/* Wireless SDIO Module */ +&sd_emmc_a { + status = "okay"; + pinctrl-0 = <&sdio_pins>; + pinctrl-1 = <&sdio_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + #address-cells = <1>; + #size-cells = <0>; + + bus-width = <4>; + cap-sd-highspeed; + max-frequency = <50000000>; + + non-removable; + disable-wp; + + /* WiFi firmware requires power to be kept while in suspend */ + keep-power-in-suspend; + + mmc-pwrseq = <&sdio_pwrseq>; + + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vddio_boot>; + + brcmf: wifi@1 { + reg = <1>; + compatible = "brcm,bcm4329-fmac"; + }; +}; + +/* SD card */ +&sd_emmc_b { + status = "okay"; + pinctrl-0 = <&sdcard_pins>; + pinctrl-1 = <&sdcard_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <4>; + cap-sd-highspeed; + max-frequency = <100000000>; + disable-wp; + + cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>; + + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vcc_3v3>; +}; + +/* eMMC */ +&sd_emmc_c { + status = "okay"; + pinctrl-0 = <&emmc_pins>, <&emmc_ds_pins>; + pinctrl-1 = <&emmc_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <8>; + cap-mmc-highspeed; + max-frequency = <50000000>; + non-removable; + disable-wp; + mmc-ddr-1_8v; + mmc-hs200-1_8v; + + mmc-pwrseq = <&emmc_pwrseq>; + vmmc-supply = <&vcc_3v3>; + vqmmc-supply = <&vddio_boot>; +}; + +/* This is connected to the Bluetooth module: */ +&uart_A { + status = "okay"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "brcm,bcm43438-bt"; + shutdown-gpios = <&gpio GPIOX_20 GPIO_ACTIVE_HIGH>; + }; +}; + +/* This UART is brought out to the DB9 connector */ +&uart_AO { + status = "okay"; + pinctrl-0 = <&uart_ao_a_pins>; + pinctrl-names = "default"; +}; + +&usb0_phy { + status = "okay"; + phy-supply = <&usb_pwr>; +}; + +&usb0 { + status = "okay"; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0006-WIP-ARM-dts-use-snps-reset-on-WeTek-devices-to-fix-E.patch ================================================ From 4df4197e1eb7e257d0c4dda60a7ff427fbd47c6f Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Tue, 20 Apr 2021 05:29:19 +0000 Subject: [PATCH 06/25] WIP: ARM: dts: use snps,reset on WeTek devices to fix Ethernet The sync of the device tree and dt-bindings from Linux v5.6-rc2 11a48a5a18c6 ("Linux 5.6-rc2") causes Ethernet to break on both WeTek devices. The PHY seems to need proper reset timing to be functional in U-Boot and Linux afterwards. Re-add the old PHY reset bindings for dwmac until we support the new bindings in the PHY node. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm/dts/meson-gxbb-wetek-hub-u-boot.dtsi | 7 +++++++ arch/arm/dts/meson-gxbb-wetek-play2-u-boot.dtsi | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/arch/arm/dts/meson-gxbb-wetek-hub-u-boot.dtsi b/arch/arm/dts/meson-gxbb-wetek-hub-u-boot.dtsi index c35158d7e9..2a245bbe7f 100644 --- a/arch/arm/dts/meson-gxbb-wetek-hub-u-boot.dtsi +++ b/arch/arm/dts/meson-gxbb-wetek-hub-u-boot.dtsi @@ -5,3 +5,10 @@ */ #include "meson-gx-u-boot.dtsi" + +ðmac { + snps,reset-gpio = <&gpio GPIOZ_14 0>; + snps,reset-delays-us = <0 10000 1000000>; + snps,reset-active-low; +}; + diff --git a/arch/arm/dts/meson-gxbb-wetek-play2-u-boot.dtsi b/arch/arm/dts/meson-gxbb-wetek-play2-u-boot.dtsi index c35158d7e9..2a245bbe7f 100644 --- a/arch/arm/dts/meson-gxbb-wetek-play2-u-boot.dtsi +++ b/arch/arm/dts/meson-gxbb-wetek-play2-u-boot.dtsi @@ -5,3 +5,10 @@ */ #include "meson-gx-u-boot.dtsi" + +ðmac { + snps,reset-gpio = <&gpio GPIOZ_14 0>; + snps,reset-delays-us = <0 10000 1000000>; + snps,reset-active-low; +}; + -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0007-WIP-boards-amlogic-add-board-files-for-wetek-gxbb-de.patch ================================================ From cec8965a83baea925ac82ca0be5dac3cc1823915 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Thu, 22 Apr 2021 05:45:29 +0000 Subject: [PATCH 07/25] WIP: boards: amlogic: add board files for wetek-gxbb devices These support the WeTek Hub and Play2 devices. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- board/amlogic/wetek-gxbb/MAINTAINERS | 8 +++++ board/amlogic/wetek-gxbb/Makefile | 6 ++++ board/amlogic/wetek-gxbb/wetek-gxbb.c | 50 +++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 board/amlogic/wetek-gxbb/MAINTAINERS create mode 100644 board/amlogic/wetek-gxbb/Makefile create mode 100644 board/amlogic/wetek-gxbb/wetek-gxbb.c diff --git a/board/amlogic/wetek-gxbb/MAINTAINERS b/board/amlogic/wetek-gxbb/MAINTAINERS new file mode 100644 index 0000000000..8aaa82ce17 --- /dev/null +++ b/board/amlogic/wetek-gxbb/MAINTAINERS @@ -0,0 +1,8 @@ +WETEK-GXBB +M: Christian Hewitt <christianshewitt@gmail.com> +S: Maintained +L: u-boot-amlogic@groups.io +F: board/amlogic/wetek-gxbb/ +F: configs/wetek-hub_defconfig +F: configs/wetek-play2_defconfig +F: doc/board/amlogic/wetek-gxbb.rst diff --git a/board/amlogic/wetek-gxbb/Makefile b/board/amlogic/wetek-gxbb/Makefile new file mode 100644 index 0000000000..7a5266b028 --- /dev/null +++ b/board/amlogic/wetek-gxbb/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0+ +# +# (C) Copyright 2020 BayLibre, SAS +# Author: Neil Armstrong <narmstrong@baylibre.com> + +obj-y := wetek-gxbb.o diff --git a/board/amlogic/wetek-gxbb/wetek-gxbb.c b/board/amlogic/wetek-gxbb/wetek-gxbb.c new file mode 100644 index 0000000000..fb07eefa53 --- /dev/null +++ b/board/amlogic/wetek-gxbb/wetek-gxbb.c @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) Copyright 2016 Beniamino Galvani <b.galvani@gmail.com> + */ + +#include <common.h> +#include <dm.h> +#include <env.h> +#include <init.h> +#include <net.h> +#include <asm/io.h> +#include <asm/arch/gx.h> +#include <asm/arch/sm.h> +#include <asm/arch/eth.h> +#include <asm/arch/mem.h> + +#define EFUSE_MAC_OFFSET 0 +#define EFUSE_MAC_SIZE 12 +#define MAC_ADDR_LEN 6 + +int misc_init_r(void) +{ + u8 mac_addr[MAC_ADDR_LEN]; + char efuse_mac_addr[EFUSE_MAC_SIZE], tmp[3]; + ssize_t len; + + if (!eth_env_get_enetaddr("ethaddr", mac_addr)) { + len = meson_sm_read_efuse(EFUSE_MAC_OFFSET, + efuse_mac_addr, EFUSE_MAC_SIZE); + if (len != EFUSE_MAC_SIZE) + return 0; + + /* MAC is stored in ASCII format, 1bytes = 2characters */ + for (int i = 0; i < 6; i++) { + tmp[0] = efuse_mac_addr[i * 2]; + tmp[1] = efuse_mac_addr[i * 2 + 1]; + tmp[2] = '\0'; + mac_addr[i] = simple_strtoul(tmp, NULL, 16); + } + + if (is_valid_ethaddr(mac_addr)) + eth_env_set_enetaddr("ethaddr", mac_addr); + else + meson_generate_serial_ethaddr(); + + eth_env_get_enetaddr("ethaddr", mac_addr); + } + + return 0; +} -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0008-WIP-boards-amlogic-add-WeTek-Hub-defconfig.patch ================================================ From 8b7dfec310b69a5b7cafacbe11a3ca36b497c78c Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 27 Feb 2021 06:03:00 +0000 Subject: [PATCH 08/25] WIP: boards: amlogic: add WeTek Hub defconfig Signed-of-by: Christian Hewitt <christianshewitt@gmail.com> --- configs/wetek-hub_defconfig | 71 +++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 configs/wetek-hub_defconfig diff --git a/configs/wetek-hub_defconfig b/configs/wetek-hub_defconfig new file mode 100644 index 0000000000..9ad263ca2c --- /dev/null +++ b/configs/wetek-hub_defconfig @@ -0,0 +1,71 @@ +CONFIG_ARM=y +CONFIG_SYS_BOARD="wetek-gxbb" +CONFIG_ARCH_MESON=y +CONFIG_SYS_TEXT_BASE=0x01000000 +CONFIG_SYS_LOAD_ADDR=0x1000000 +CONFIG_NR_DRAM_BANKS=1 +CONFIG_ENV_SIZE=0x2000 +CONFIG_DM_GPIO=y +CONFIG_DEBUG_UART_BASE=0xc81004c0 +CONFIG_DEBUG_UART_CLOCK=24000000 +CONFIG_IDENT_STRING=" wetek-hub" +CONFIG_DEFAULT_DEVICE_TREE="meson-gxbb-wetek-hub" +CONFIG_DEBUG_UART=y +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20000000 +CONFIG_OF_BOARD_SETUP=y +# CONFIG_DISPLAY_CPUINFO is not set +CONFIG_MISC_INIT_R=y +# CONFIG_CMD_BDI is not set +# CONFIG_CMD_IMI is not set +CONFIG_CMD_ADC=y +CONFIG_CMD_GPIO=y +CONFIG_CMD_I2C=y +# CONFIG_CMD_LOADS is not set +CONFIG_CMD_MMC=y +CONFIG_CMD_USB=y +# CONFIG_CMD_SETEXPR is not set +CONFIG_CMD_REGULATOR=y +CONFIG_OF_CONTROL=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_NET_RANDOM_ETHADDR=y +CONFIG_SARADC_MESON=y +CONFIG_DM_I2C=y +CONFIG_SYS_I2C_MESON=y +CONFIG_DM_MMC=y +CONFIG_MMC_MESON_GX=y +CONFIG_PHY_REALTEK=y +CONFIG_DM_ETH=y +CONFIG_ETH_DESIGNWARE_MESON8B=y +CONFIG_PHY=y +CONFIG_MESON_GXBB_USB_PHY=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_MESON_GXBB=y +CONFIG_POWER_DOMAIN=y +CONFIG_MESON_EE_POWER_DOMAIN=y +CONFIG_DM_REGULATOR=y +CONFIG_DM_REGULATOR_FIXED=y +CONFIG_DM_REGULATOR_GPIO=y +CONFIG_DM_RESET=y +CONFIG_DEBUG_UART_ANNOUNCE=y +CONFIG_DEBUG_UART_SKIP_INIT=y +CONFIG_MESON_SERIAL=y +CONFIG_SYSINFO=y +CONFIG_SYSINFO_SMBIOS=y +CONFIG_USB=y +CONFIG_DM_USB=y +CONFIG_USB_DWC2=y +CONFIG_USB_KEYBOARD=y +CONFIG_DM_VIDEO=y +# CONFIG_VIDEO_BPP8 is not set +# CONFIG_VIDEO_BPP16 is not set +CONFIG_SYS_WHITE_ON_BLACK=y +CONFIG_VIDEO_MESON=y +CONFIG_VIDEO_DT_SIMPLEFB=y +CONFIG_SPLASH_SCREEN=y +CONFIG_SPLASH_SCREEN_ALIGN=y +CONFIG_VIDEO_BMP_RLE8=y +CONFIG_BMP_16BPP=y +CONFIG_BMP_24BPP=y +CONFIG_BMP_32BPP=y +CONFIG_OF_LIBFDT_OVERLAY=y -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0009-WIP-boards-amlogic-add-WeTek-Play2-defconfig.patch ================================================ From e45b57304c28592eae3ad386559abb6dd3a7a802 Mon Sep 17 00:00:00 2001 From: chewitt <christianshewitt@gmail.com> Date: Sat, 27 Feb 2021 06:04:00 +0000 Subject: [PATCH 09/25] WIP: boards: amlogic: add WeTek Play2 defconfig Signed-off-by: Christian Hewittt <christianshewitt@gmail.com> --- configs/wetek-play2_defconfig | 71 +++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 configs/wetek-play2_defconfig diff --git a/configs/wetek-play2_defconfig b/configs/wetek-play2_defconfig new file mode 100644 index 0000000000..624679f90c --- /dev/null +++ b/configs/wetek-play2_defconfig @@ -0,0 +1,71 @@ +CONFIG_ARM=y +CONFIG_SYS_BOARD="wetek-gxbb" +CONFIG_ARCH_MESON=y +CONFIG_SYS_TEXT_BASE=0x01000000 +CONFIG_SYS_LOAD_ADDR=0x1000000 +CONFIG_NR_DRAM_BANKS=1 +CONFIG_ENV_SIZE=0x2000 +CONFIG_DM_GPIO=y +CONFIG_DEBUG_UART_BASE=0xc81004c0 +CONFIG_DEBUG_UART_CLOCK=24000000 +CONFIG_IDENT_STRING=" wetek-play2" +CONFIG_DEFAULT_DEVICE_TREE="meson-gxbb-wetek-play2" +CONFIG_DEBUG_UART=y +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20000000 +CONFIG_OF_BOARD_SETUP=y +# CONFIG_DISPLAY_CPUINFO is not set +CONFIG_MISC_INIT_R=y +# CONFIG_CMD_BDI is not set +# CONFIG_CMD_IMI is not set +CONFIG_CMD_ADC=y +CONFIG_CMD_GPIO=y +CONFIG_CMD_I2C=y +# CONFIG_CMD_LOADS is not set +CONFIG_CMD_MMC=y +CONFIG_CMD_USB=y +# CONFIG_CMD_SETEXPR is not set +CONFIG_CMD_REGULATOR=y +CONFIG_OF_CONTROL=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_NET_RANDOM_ETHADDR=y +CONFIG_SARADC_MESON=y +CONFIG_DM_I2C=y +CONFIG_SYS_I2C_MESON=y +CONFIG_DM_MMC=y +CONFIG_MMC_MESON_GX=y +CONFIG_PHY_REALTEK=y +CONFIG_DM_ETH=y +CONFIG_ETH_DESIGNWARE_MESON8B=y +CONFIG_PHY=y +CONFIG_MESON_GXBB_USB_PHY=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_MESON_GXBB=y +CONFIG_POWER_DOMAIN=y +CONFIG_MESON_EE_POWER_DOMAIN=y +CONFIG_DM_REGULATOR=y +CONFIG_DM_REGULATOR_FIXED=y +CONFIG_DM_REGULATOR_GPIO=y +CONFIG_DM_RESET=y +CONFIG_DEBUG_UART_ANNOUNCE=y +CONFIG_DEBUG_UART_SKIP_INIT=y +CONFIG_MESON_SERIAL=y +CONFIG_SYSINFO=y +CONFIG_SYSINFO_SMBIOS=y +CONFIG_USB=y +CONFIG_DM_USB=y +CONFIG_USB_DWC2=y +CONFIG_USB_KEYBOARD=y +CONFIG_DM_VIDEO=y +# CONFIG_VIDEO_BPP8 is not set +# CONFIG_VIDEO_BPP16 is not set +CONFIG_SYS_WHITE_ON_BLACK=y +CONFIG_VIDEO_MESON=y +CONFIG_VIDEO_DT_SIMPLEFB=y +CONFIG_SPLASH_SCREEN=y +CONFIG_SPLASH_SCREEN_ALIGN=y +CONFIG_VIDEO_BMP_RLE8=y +CONFIG_BMP_16BPP=y +CONFIG_BMP_24BPP=y +CONFIG_BMP_32BPP=y +CONFIG_OF_LIBFDT_OVERLAY=y -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0010-WIP-ARM-dts-add-support-for-Radxa-Zero2.patch ================================================ From 7a49690898b3af72646df09784b8cdd9b1b593fd Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 15 Jan 2022 06:17:23 +0000 Subject: [PATCH 10/25] WIP: ARM: dts: add support for Radxa Zero2 Import the initial dts (WIP) from chewitt/amlogic-5.16.y Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm/dts/Makefile | 1 + .../dts/meson-g12b-radxa-zero2-u-boot.dtsi | 7 + arch/arm/dts/meson-g12b-radxa-zero2.dts | 493 ++++++++++++++++++ 3 files changed, 501 insertions(+) create mode 100644 arch/arm/dts/meson-g12b-radxa-zero2-u-boot.dtsi create mode 100644 arch/arm/dts/meson-g12b-radxa-zero2.dts diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index 4a1ac8ecaf..926ae0aae4 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile @@ -202,6 +202,7 @@ dtb-$(CONFIG_ARCH_MESON) += \ meson-g12b-gsking-x.dtb \ meson-g12b-odroid-n2.dtb \ meson-g12b-odroid-n2-plus.dtb \ + meson-g12b-radxa-zero2.dtb \ meson-sm1-bananapi-m5.dtb \ meson-sm1-khadas-vim3l.dtb \ meson-sm1-odroid-c4.dtb \ diff --git a/arch/arm/dts/meson-g12b-radxa-zero2-u-boot.dtsi b/arch/arm/dts/meson-g12b-radxa-zero2-u-boot.dtsi new file mode 100644 index 0000000000..236f2468dc --- /dev/null +++ b/arch/arm/dts/meson-g12b-radxa-zero2-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2019 BayLibre, SAS. + * Author: Neil Armstrong <narmstrong@baylibre.com> + */ + +#include "meson-g12-common-u-boot.dtsi" diff --git a/arch/arm/dts/meson-g12b-radxa-zero2.dts b/arch/arm/dts/meson-g12b-radxa-zero2.dts new file mode 100644 index 0000000000..f0c9ef8592 --- /dev/null +++ b/arch/arm/dts/meson-g12b-radxa-zero2.dts @@ -0,0 +1,493 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2019 BayLibre, SAS + * Author: Neil Armstrong <narmstrong@baylibre.com> + * Copyright (c) 2019 Christian Hewitt <christianshewitt@gmail.com> + * Copyright (c) 2022 Radxa Limited + * Author: Yuntian Zhang <yt@radxa.com> + */ + +/dts-v1/; + +#include "meson-g12b-a311d.dtsi" +#include <dt-bindings/input/input.h> +#include <dt-bindings/leds/common.h> +#include <dt-bindings/gpio/meson-g12a-gpio.h> +#include <dt-bindings/sound/meson-g12a-tohdmitx.h> + +/ { + compatible = "radxa,zero2", "amlogic,a311d", "amlogic,g12b"; + model = "Radxa Zero2"; + + aliases { + serial0 = &uart_AO; + serial2 = &uart_A; + }; + + chosen { + stdout-path = "serial0:115200n8"; + }; + + memory@0 { + device_type = "memory"; + reg = <0x0 0x0 0x0 0x80000000>; + }; + + gpio-keys-polled { + compatible = "gpio-keys-polled"; + poll-interval = <100>; + power-button { + label = "power"; + linux,code = <KEY_POWER>; + gpios = <&gpio_ao GPIOAO_3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + }; + }; + + leds { + compatible = "gpio-leds"; + + led-green { + color = <LED_COLOR_ID_GREEN>; + function = LED_FUNCTION_STATUS; + gpios = <&gpio GPIOA_12 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "heartbeat"; + }; + }; + + cvbs-connector { + status = "disabled"; + compatible = "composite-video-connector"; + + port { + cvbs_connector_in: endpoint { + remote-endpoint = <&cvbs_vdac_out>; + }; + }; + }; + + hdmi-connector { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_connector_in: endpoint { + remote-endpoint = <&hdmi_tx_tmds_out>; + }; + }; + }; + + emmc_pwrseq: emmc-pwrseq { + compatible = "mmc-pwrseq-emmc"; + reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>; + }; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; + clocks = <&wifi32k>; + clock-names = "ext_clock"; + }; + + ao_5v: regulator-ao_5v { + compatible = "regulator-fixed"; + regulator-name = "AO_5V"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + regulator-always-on; + }; + + vcc_1v8: regulator-vcc_1v8 { + compatible = "regulator-fixed"; + regulator-name = "VCC_1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc_3v3>; + regulator-always-on; + }; + + vcc_3v3: regulator-vcc_3v3 { + compatible = "regulator-fixed"; + regulator-name = "VCC_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vddao_3v3>; + regulator-always-on; + /* FIXME: actually controlled by VDDCPU_B_EN */ + }; + + vddao_1v8: regulator-vddao_1v8 { + compatible = "regulator-fixed"; + regulator-name = "VDDIO_AO1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vddao_3v3>; + regulator-always-on; + }; + + vddao_3v3: regulator-vddao_3v3 { + compatible = "regulator-fixed"; + regulator-name = "VDDAO_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&ao_5v>; + regulator-always-on; + }; + + vddcpu_a: regulator-vddcpu-a { + /* + * MP8756GD Regulator. + */ + compatible = "pwm-regulator"; + + regulator-name = "VDDCPU_A"; + regulator-min-microvolt = <730000>; + regulator-max-microvolt = <1022000>; + + pwm-supply = <&ao_5v>; + + pwms = <&pwm_ab 0 1250 0>; + pwm-dutycycle-range = <100 0>; + + regulator-boot-on; + regulator-always-on; + }; + + vddcpu_b: regulator-vddcpu-b { + /* + * Silergy SY8120B1ABC Regulator. + */ + compatible = "pwm-regulator"; + + regulator-name = "VDDCPU_B"; + regulator-min-microvolt = <730000>; + regulator-max-microvolt = <1022000>; + + pwm-supply = <&ao_5v>; + + pwms = <&pwm_AO_cd 1 1250 0>; + pwm-dutycycle-range = <100 0>; + + regulator-boot-on; + regulator-always-on; + }; + + sound { + compatible = "amlogic,axg-sound-card"; + model = "RADXA-ZERO2"; + audio-aux-devs = <&tdmout_b>; + audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1", + "TDMOUT_B IN 1", "FRDDR_B OUT 1", + "TDMOUT_B IN 2", "FRDDR_C OUT 1", + "TDM_B Playback", "TDMOUT_B OUT"; + + assigned-clocks = <&clkc CLKID_MPLL2>, + <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&frddr_a>; + }; + + dai-link-1 { + sound-dai = <&frddr_b>; + }; + + dai-link-2 { + sound-dai = <&frddr_c>; + }; + + /* 8ch hdmi interface */ + dai-link-3 { + sound-dai = <&tdmif_b>; + dai-format = "i2s"; + dai-tdm-slot-tx-mask-0 = <1 1>; + dai-tdm-slot-tx-mask-1 = <1 1>; + dai-tdm-slot-tx-mask-2 = <1 1>; + dai-tdm-slot-tx-mask-3 = <1 1>; + mclk-fs = <256>; + + codec { + sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>; + }; + }; + + /* hdmi glue */ + dai-link-4 { + sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>; + + codec { + sound-dai = <&hdmi_tx>; + }; + }; + }; + + wifi32k: wifi32k { + compatible = "pwm-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */ + }; +}; + +&arb { + status = "okay"; +}; + +&cec_AO { + pinctrl-0 = <&cec_ao_a_h_pins>; + pinctrl-names = "default"; + status = "disabled"; + hdmi-phandle = <&hdmi_tx>; +}; + +&cecb_AO { + pinctrl-0 = <&cec_ao_b_h_pins>; + pinctrl-names = "default"; + status = "okay"; + hdmi-phandle = <&hdmi_tx>; +}; + +&clkc_audio { + status = "okay"; +}; + +&cpu0 { + cpu-supply = <&vddcpu_b>; + operating-points-v2 = <&cpu_opp_table_0>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu1 { + cpu-supply = <&vddcpu_b>; + operating-points-v2 = <&cpu_opp_table_0>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu100 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu101 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu102 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu103 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cvbs_vdac_port { + cvbs_vdac_out: endpoint { + remote-endpoint = <&cvbs_connector_in>; + }; +}; + +&frddr_a { + status = "okay"; +}; + +&frddr_b { + status = "okay"; +}; + +&frddr_c { + status = "okay"; +}; + +&gpio { + gpio-line-names = + /* GPIOZ */ + "PIN_27", "PIN_28", "PIN_7", "PIN_11", "PIN_13", "PIN_15", "PIN_18", "PIN_40", + "", "", "", "", "", "", "", "", + /* GPIOH */ + "", "", "", "", "PIN_19", "PIN_21", "PIN_24", "PIN_23", + "", + /* BOOT */ + "", "", "", "", "", "", "", "", + "", "", "", "", "EMMC_PWRSEQ", "", "", "", + /* GPIOC */ + "", "", "", "", "", "", "SD_CD", "PIN_36", + /* GPIOA */ + "PIN_32", "PIN_12", "PIN_35", "", "", "PIN_38", "", "", + "", "", "", "", "LED_GREEN", "PIN_31", "PIN_3", "PIN_5", + /* GPIOX */ + "", "", "", "", "", "", "SDIO_PWRSEQ", "", + "", "", "", "", "", "", "", "", + "", "BT_SHUTDOWN", "", ""; +}; + +&gpio_ao { + gpio-line-names = + /* GPIOAO */ + "PIN_8", "PIN_10", "", "BTN_POWER", "", "", "", "PIN_29", + "PIN_33", "PIN_37", "FAN", "", + /* GPIOE */ + "", "", ""; +}; + +&hdmi_tx { + status = "okay"; + pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>; + pinctrl-names = "default"; + hdmi-supply = <&ao_5v>; +}; + +&hdmi_tx_tmds_port { + hdmi_tx_tmds_out: endpoint { + remote-endpoint = <&hdmi_connector_in>; + }; +}; + +&ir { + status = "disabled"; + pinctrl-0 = <&remote_input_ao_pins>; + pinctrl-names = "default"; +}; + +&pwm_ab { + pinctrl-0 = <&pwm_a_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin0"; + status = "okay"; +}; + +&pwm_ef { + pinctrl-0 = <&pwm_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin2"; + status = "okay"; +}; + +&pwm_AO_cd { + pinctrl-0 = <&pwm_ao_d_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin4"; + status = "okay"; +}; + +&saradc { + status = "okay"; + vref-supply = <&vddao_1v8>; +}; + +/* SDIO */ +&sd_emmc_a { + status = "okay"; + pinctrl-0 = <&sdio_pins>; + pinctrl-1 = <&sdio_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + #address-cells = <1>; + #size-cells = <0>; + + bus-width = <4>; + cap-sd-highspeed; + max-frequency = <100000000>; + + non-removable; + disable-wp; + + /* WiFi firmware requires power to be kept while in suspend */ + keep-power-in-suspend; + + mmc-pwrseq = <&sdio_pwrseq>; + + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vddao_1v8>; + + brcmf: wifi@1 { + reg = <1>; + compatible = "brcm,bcm4329-fmac"; + }; +}; + +/* SD card */ +&sd_emmc_b { + status = "okay"; + pinctrl-0 = <&sdcard_c_pins>; + pinctrl-1 = <&sdcard_clk_gate_c_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <4>; + cap-sd-highspeed; + max-frequency = <50000000>; + disable-wp; + + cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>; + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vddao_3v3>; +}; + +/* eMMC */ +&sd_emmc_c { + status = "okay"; + pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>; + pinctrl-1 = <&emmc_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <8>; + cap-mmc-highspeed; + mmc-ddr-1_8v; + mmc-hs200-1_8v; + max-frequency = <200000000>; + disable-wp; + + mmc-pwrseq = <&emmc_pwrseq>; + vmmc-supply = <&vcc_3v3>; + vqmmc-supply = <&vcc_1v8>; +}; + +&tdmif_b { + status = "okay"; +}; + +&tdmout_b { + status = "okay"; +}; + +&tohdmitx { + status = "okay"; +}; + +&uart_A { + status = "okay"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "brcm,bcm43438-bt"; + shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + max-speed = <2000000>; + clocks = <&wifi32k>; + clock-names = "lpo"; + }; +}; + +&usb { + status = "okay"; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0011-WIP-boards-amlogic-add-Radxa-Zero2-defconfig.patch ================================================ From e7babbfd6c66c20e81e9d728a6a4384a9a5885dd Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 15 Jan 2022 06:23:29 +0000 Subject: [PATCH 11/25] WIP: boards: amlogic: add Radxa Zero2 defconfig Add a defconfig for the Radxa Zero2 SBC, using an Amlogic A311D chip. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- board/amlogic/w400/MAINTAINERS | 1 + configs/radxa-zero2_defconfig | 77 ++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 configs/radxa-zero2_defconfig diff --git a/board/amlogic/w400/MAINTAINERS b/board/amlogic/w400/MAINTAINERS index 96ccda2001..caad41577d 100644 --- a/board/amlogic/w400/MAINTAINERS +++ b/board/amlogic/w400/MAINTAINERS @@ -3,4 +3,5 @@ M: Neil Armstrong <neil.armstrong@linaro.org> S: Maintained L: u-boot-amlogic@groups.io F: board/amlogic/w400/ +F: configs/radxa-zero2_defconfig F: doc/board/amlogic/w400.rst diff --git a/configs/radxa-zero2_defconfig b/configs/radxa-zero2_defconfig new file mode 100644 index 0000000000..3ef3c9c143 --- /dev/null +++ b/configs/radxa-zero2_defconfig @@ -0,0 +1,77 @@ +CONFIG_ARM=y +CONFIG_ARCH_MESON=y +CONFIG_SYS_TEXT_BASE=0x01000000 +CONFIG_NR_DRAM_BANKS=1 +CONFIG_ENV_SIZE=0x2000 +CONFIG_DM_GPIO=y +CONFIG_DEFAULT_DEVICE_TREE="meson-g12b-radxa-zero2" +CONFIG_MESON_G12A=y +CONFIG_DEBUG_UART_BASE=0xff803000 +CONFIG_DEBUG_UART_CLOCK=24000000 +CONFIG_IDENT_STRING=" radxa-zero2" +CONFIG_SYS_LOAD_ADDR=0x1000000 +CONFIG_DEBUG_UART=y +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20000000 +CONFIG_REMAKE_ELF=y +CONFIG_OF_BOARD_SETUP=y +# CONFIG_DISPLAY_CPUINFO is not set +CONFIG_MISC_INIT_R=y +CONFIG_SYS_MAXARGS=32 +# CONFIG_CMD_BDI is not set +# CONFIG_CMD_IMI is not set +CONFIG_CMD_GPIO=y +# CONFIG_CMD_LOADS is not set +CONFIG_CMD_MMC=y +CONFIG_CMD_USB=y +CONFIG_CMD_USB_MASS_STORAGE=y +# CONFIG_CMD_SETEXPR is not set +CONFIG_CMD_REGULATOR=y +CONFIG_OF_CONTROL=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_NET_RANDOM_ETHADDR=y +CONFIG_MMC_MESON_GX=y +CONFIG_MTD=y +CONFIG_DM_MTD=y +# CONFIG_PHY_REALTEK is not set +CONFIG_DM_MDIO=y +CONFIG_DM_MDIO_MUX=y +# CONFIG_ETH_DESIGNWARE_MESON8B is not set +CONFIG_MDIO_MUX_MESON_G12A=y +CONFIG_MESON_G12A_USB_PHY=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_MESON_G12A=y +CONFIG_POWER_DOMAIN=y +CONFIG_MESON_EE_POWER_DOMAIN=y +CONFIG_DM_REGULATOR=y +CONFIG_DM_REGULATOR_FIXED=y +CONFIG_DM_RESET=y +CONFIG_DEBUG_UART_ANNOUNCE=y +CONFIG_DEBUG_UART_SKIP_INIT=y +CONFIG_MESON_SERIAL=y +CONFIG_USB=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_DWC3=y +CONFIG_USB_DWC3=y +# CONFIG_USB_DWC3_GADGET is not set +CONFIG_USB_DWC3_MESON_G12A=y +CONFIG_USB_KEYBOARD=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_VENDOR_NUM=0x1b8e +CONFIG_USB_GADGET_PRODUCT_NUM=0xfada +CONFIG_USB_GADGET_DWC2_OTG=y +CONFIG_USB_GADGET_DWC2_OTG_PHY_BUS_WIDTH_8=y +CONFIG_USB_GADGET_DOWNLOAD=y +CONFIG_DM_VIDEO=y +# CONFIG_VIDEO_BPP8 is not set +# CONFIG_VIDEO_BPP16 is not set +CONFIG_SYS_WHITE_ON_BLACK=y +CONFIG_VIDEO_MESON=y +CONFIG_VIDEO_DT_SIMPLEFB=y +CONFIG_SPLASH_SCREEN=y +CONFIG_SPLASH_SCREEN_ALIGN=y +CONFIG_VIDEO_BMP_RLE8=y +CONFIG_BMP_16BPP=y +CONFIG_BMP_24BPP=y +CONFIG_BMP_32BPP=y +CONFIG_OF_LIBFDT_OVERLAY=y -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0012-WIP-doc-boards-amlogic-update-for-Radxa-Zero2.patch ================================================ From 2fc65ac09a5698b9e2060890de1cd3310a237658 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 15 Jan 2022 06:35:47 +0000 Subject: [PATCH 12/25] WIP: doc: boards: amlogic: update for Radxa Zero2 Add documentation bits for the Radxa Zero2 Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- board/amlogic/w400/MAINTAINERS | 1 + doc/board/amlogic/index.rst | 3 +- .../{radxa-zero.rst => radxa-zero2.rst} | 29 ++++++++++--------- 3 files changed, 18 insertions(+), 15 deletions(-) rename doc/board/amlogic/{radxa-zero.rst => radxa-zero2.rst} (76%) diff --git a/board/amlogic/w400/MAINTAINERS b/board/amlogic/w400/MAINTAINERS index caad41577d..6e1ef9b8b8 100644 --- a/board/amlogic/w400/MAINTAINERS +++ b/board/amlogic/w400/MAINTAINERS @@ -5,3 +5,4 @@ L: u-boot-amlogic@groups.io F: board/amlogic/w400/ F: configs/radxa-zero2_defconfig F: doc/board/amlogic/w400.rst +F: doc/board/amlogic/radxa-zero2.rst diff --git a/doc/board/amlogic/index.rst b/doc/board/amlogic/index.rst index 4d407f9362..f0b92e4209 100644 --- a/doc/board/amlogic/index.rst +++ b/doc/board/amlogic/index.rst @@ -19,7 +19,7 @@ This matrix concerns the actual source code version. | | Nanopi-K2 | Khadas-VIM | Libretech-PC | JetHub J100 | SEI510 | Khadas-VIM3 | Khadas-VIM3L | | | P200 | LibreTech-CC v1 | WeTek Core2 | | Radxa Zero | GT-King/Pro | Odroid-C4 | | | P201 | LibreTech-AC v2 | | | | GSKing-X | Odroid-HC4 | -| | | JetHub J80 | | | | | BananaPi-M5 | +| | | JetHub J80 | | | | Radxa Zero2 | BananaPi-M5 | +-------------------------------+-----------+-----------------+--------------+-------------+------------+-------------+--------------+ | UART | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | +-------------------------------+-----------+-----------------+--------------+-------------+------------+-------------+--------------+ @@ -110,6 +110,7 @@ Board Documentation p212 q200 radxa-zero + radxa-zero2 s400 sei510 sei610 diff --git a/doc/board/amlogic/radxa-zero.rst b/doc/board/amlogic/radxa-zero2.rst similarity index 76% rename from doc/board/amlogic/radxa-zero.rst rename to doc/board/amlogic/radxa-zero2.rst index f5611f52ec..95a42a05d0 100644 --- a/doc/board/amlogic/radxa-zero.rst +++ b/doc/board/amlogic/radxa-zero2.rst @@ -1,18 +1,17 @@ .. SPDX-License-Identifier: GPL-2.0+ -U-Boot for Radxa Zero -===================== +U-Boot for Radxa Zero2 +====================== -Radxa Zero is a small form factor SBC based on the Amlogic S905Y2 -chipset that ships in a number of RAM/eMMC configurations: +Radxa Zero2 is a small form factor SBC based on the Amlogic A311D +chipset that ships in a number of eMMC configurations: -Boards with 512MB/1GB LPDDR4 RAM have no eMMC storage and BCM43436 -wireless (2.4GHz b/g/n) while 2GB/4GB boards have 8/16/32/64/128GB -eMMC storage and BCM4345 wireless (2.4/5GHz a/b/g/n/ac). - -- Amlogic S905Y2 quad-core Cortex-A53 -- Mali G31-MP2 GPU +- Amlogic A311D (Quad A73 + Dual A53) CPU +- 4GB LPDDR4 RAM +- 32/64/128GB eMMC +- Mali G52-MP4 GPU - HDMI 2.1 output (micro) +- BCM4345 WiFi (2.4/5GHz a/b/g/n/ac) and BT 5.0 - 1x USB 2.0 port - Type C (OTG) - 1x USB 3.0 port - Type C (Host) - 1x micro SD Card slot @@ -20,6 +19,7 @@ eMMC storage and BCM4345 wireless (2.4/5GHz a/b/g/n/ac). Schematics are available on the manufacturer website: +** TO-DO ** (provide updated URL) https://dl.radxa.com/zero/docs/hw/RADAX_ZERO_V13_SCH_20210309.pdf U-Boot compilation @@ -28,7 +28,7 @@ U-Boot compilation .. code-block:: bash $ export CROSS_COMPILE=aarch64-none-elf- - $ make radxa-zero_defconfig + $ make radxa-zero2_defconfig $ make Image creation @@ -42,6 +42,7 @@ git trees published by the board vendor: .. code-block:: bash + ** TO-DO ** UPDATE URLs $ git clone -b radxa-zero-v2021.07 https://github.com/radxa/u-boot.git $ git clone https://github.com/radxa/fip.git @@ -54,11 +55,11 @@ git trees published by the board vendor: $ export CROSS_COMPILE=/opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-elf/bin/aarch64-none-elf- $ export ARCH=arm $ cd u-boot - $ make radxa-zero_defconfig + $ make radxa-zero2_defconfig $ make - $ cp u-boot.bin ../fip/radxa-zero/bl33.bin - $ cd ../fip/radxa-zero + $ cp u-boot.bin ../fip/radxa-zero2/bl33.bin + $ cd ../fip/radxa-zero2 $ make This will generate: -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0013-WIP-ARM-dts-import-Beelink-GT1-DT-from-Linux-5.21.patch ================================================ From 7ce3779954032f9ac2591a02df06282115032cb3 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Thu, 7 Jul 2022 10:24:03 +0000 Subject: [PATCH 13/25] WIP: ARM: dts: import Beelink GT1 DT from Linux 5.21 Import the Beelink GT1 device-tree. Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- .../dts/meson-gxm-gt1-ultimate-u-boot.dtsi | 7 ++ arch/arm/dts/meson-gxm-gt1-ultimate.dts | 91 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 arch/arm/dts/meson-gxm-gt1-ultimate-u-boot.dtsi create mode 100644 arch/arm/dts/meson-gxm-gt1-ultimate.dts diff --git a/arch/arm/dts/meson-gxm-gt1-ultimate-u-boot.dtsi b/arch/arm/dts/meson-gxm-gt1-ultimate-u-boot.dtsi new file mode 100644 index 0000000000..39270ea71c --- /dev/null +++ b/arch/arm/dts/meson-gxm-gt1-ultimate-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2019 BayLibre, SAS. + * Author: Neil Armstrong <narmstrong@baylibre.com> + */ + +#include "meson-gxl-u-boot.dtsi" diff --git a/arch/arm/dts/meson-gxm-gt1-ultimate.dts b/arch/arm/dts/meson-gxm-gt1-ultimate.dts new file mode 100644 index 0000000000..2c267884cc --- /dev/null +++ b/arch/arm/dts/meson-gxm-gt1-ultimate.dts @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) Christian Hewitt <christianshewitt@gmail.com> + */ + +/dts-v1/; + +#include "meson-gxm.dtsi" +#include "meson-gx-p23x-q20x.dtsi" +#include <dt-bindings/input/input.h> +#include <dt-bindings/leds/common.h> + +/ { + compatible = "azw,gt1-ultimate", "amlogic,s912", "amlogic,meson-gxm"; + model = "Beelink GT1 Ultimate"; + + leds { + compatible = "gpio-leds"; + + led-white { + color = <LED_COLOR_ID_WHITE>; + function = LED_FUNCTION_POWER; + gpios = <&gpio_ao GPIOAO_9 GPIO_ACTIVE_HIGH>; + default-state = "on"; + panic-indicator; + }; + }; + + adc-keys { + compatible = "adc-keys"; + io-channels = <&saradc 0>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1710000>; + + button-function { + label = "update"; + linux,code = <KEY_VENDOR>; + press-threshold-microvolt = <10000>; + }; + }; +}; + +ðmac { + pinctrl-0 = <ð_pins>; + pinctrl-names = "default"; + phy-handle = <&external_phy>; + amlogic,tx-delay-ns = <2>; + phy-mode = "rgmii"; +}; + +&external_mdio { + external_phy: ethernet-phy@0 { + /* Realtek RTL8211F (0x001cc916) */ + reg = <0>; + max-speed = <1000>; + + reset-assert-us = <10000>; + reset-deassert-us = <80000>; + reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>; + + interrupt-parent = <&gpio_intc>; + /* MAC_INTR on GPIOZ_15 */ + interrupts = <25 IRQ_TYPE_LEVEL_LOW>; + }; +}; + +&ir { + linux,rc-map-name = "rc-beelink-gs1"; +}; + +&sd_emmc_a { + brcmf: wifi@1 { + reg = <1>; + compatible = "brcm,bcm4329-fmac"; + }; +}; + +&uart_A { + status = "okay"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "brcm,bcm43438-bt"; + shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + max-speed = <2000000>; + clocks = <&wifi32k>; + clock-names = "lpo"; + }; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0014-WIP-boards-amlogic-add-Beelink-GT1-defconfig.patch ================================================ From 7416bc16b956d7b9b2761ac5511c6b51ac8b4ca1 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Thu, 7 Jul 2022 10:27:01 +0000 Subject: [PATCH 14/25] WIP: boards: amlogic: add Beelink GT1 defconfig Add a board config for Beelink GT1 devices Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- configs/beelink-gt1_defconfig | 71 +++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 configs/beelink-gt1_defconfig diff --git a/configs/beelink-gt1_defconfig b/configs/beelink-gt1_defconfig new file mode 100644 index 0000000000..77ffc9aa49 --- /dev/null +++ b/configs/beelink-gt1_defconfig @@ -0,0 +1,71 @@ +CONFIG_ARM=y +CONFIG_ARCH_MESON=y +CONFIG_SYS_TEXT_BASE=0x01000000 +CONFIG_NR_DRAM_BANKS=1 +CONFIG_ENV_SIZE=0x2000 +CONFIG_DM_GPIO=y +CONFIG_DEFAULT_DEVICE_TREE="meson-gxm-gt1-ultimate" +CONFIG_MESON_GXM=y +CONFIG_DEBUG_UART_BASE=0xc81004c0 +CONFIG_DEBUG_UART_CLOCK=24000000 +CONFIG_IDENT_STRING=" beelink-gt1" +CONFIG_SYS_LOAD_ADDR=0x1000000 +CONFIG_DEBUG_UART=y +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20000000 +CONFIG_REMAKE_ELF=y +CONFIG_OF_BOARD_SETUP=y +# CONFIG_DISPLAY_CPUINFO is not set +CONFIG_MISC_INIT_R=y +# CONFIG_CMD_BDI is not set +# CONFIG_CMD_IMI is not set +CONFIG_CMD_ADC=y +CONFIG_CMD_GPIO=y +# CONFIG_CMD_LOADS is not set +CONFIG_CMD_MMC=y +CONFIG_CMD_USB=y +CONFIG_CMD_USB_MASS_STORAGE=y +# CONFIG_CMD_SETEXPR is not set +CONFIG_CMD_REGULATOR=y +CONFIG_OF_CONTROL=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_SARADC_MESON=y +CONFIG_MMC_MESON_GX=y +CONFIG_MTD=y +CONFIG_DM_MTD=y +CONFIG_PHY_REALTEK=y +CONFIG_DM_ETH=y +CONFIG_DM_MDIO=y +CONFIG_DM_MDIO_MUX=y +CONFIG_ETH_DESIGNWARE_MESON8B=y +CONFIG_MDIO_MUX_MMIOREG=y +CONFIG_MESON_GXL_USB_PHY=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_MESON_GXL=y +CONFIG_POWER_DOMAIN=y +CONFIG_MESON_GX_VPU_POWER_DOMAIN=y +CONFIG_DM_REGULATOR=y +CONFIG_DM_REGULATOR_FIXED=y +CONFIG_DM_RESET=y +CONFIG_DEBUG_UART_ANNOUNCE=y +CONFIG_DEBUG_UART_SKIP_INIT=y +CONFIG_MESON_SERIAL=y +CONFIG_USB=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_DWC3=y +CONFIG_USB_DWC3=y +# CONFIG_USB_DWC3_GADGET is not set +CONFIG_USB_DWC3_MESON_GXL=y +CONFIG_USB_KEYBOARD=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_VENDOR_NUM=0x1b8e +CONFIG_USB_GADGET_PRODUCT_NUM=0xfada +CONFIG_USB_GADGET_DWC2_OTG=y +CONFIG_USB_GADGET_DOWNLOAD=y +CONFIG_DM_VIDEO=y +# CONFIG_VIDEO_BPP8 is not set +# CONFIG_VIDEO_BPP16 is not set +CONFIG_SYS_WHITE_ON_BLACK=y +CONFIG_VIDEO_MESON=y +CONFIG_VIDEO_DT_SIMPLEFB=y +CONFIG_OF_LIBFDT_OVERLAY=y -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0015-WIP-doc-boards-amlogic-update-for-Beelink-GT1.patch ================================================ From 5c21b65a0efdae590e0d0ecd1191078725e4abf4 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Thu, 14 Jul 2022 19:38:41 +0000 Subject: [PATCH 15/25] WIP: doc: boards: amlogic: update for Beelink GT1 Add documentation bits for the Beelink GT1 and GT1-Ultimate Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- board/amlogic/q200/MAINTAINERS | 2 + doc/board/amlogic/beelink-gt1.rst | 98 +++++++++++++++++++++++++++++++ doc/board/amlogic/index.rst | 9 +-- 3 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 doc/board/amlogic/beelink-gt1.rst diff --git a/board/amlogic/q200/MAINTAINERS b/board/amlogic/q200/MAINTAINERS index 9c84cca27e..46beffe17f 100644 --- a/board/amlogic/q200/MAINTAINERS +++ b/board/amlogic/q200/MAINTAINERS @@ -4,9 +4,11 @@ S: Maintained L: u-boot-amlogic@groups.io F: board/amlogic/q200/ F: include/configs/q200.h +F: configs/beelink-gt1_defconfig F: configs/khadas-vim2_defconfig F: configs/libretech-s905d-pc_defconfig F: configs/libretech-s912-pc_defconfig F: configs/wetek-core2_defconfig +F: doc/board/amlogic/beelink-gt1.rst F: doc/board/amlogic/khadas-vim2.rst F: doc/board/amlogic/wetek-core2.rst diff --git a/doc/board/amlogic/beelink-gt1.rst b/doc/board/amlogic/beelink-gt1.rst new file mode 100644 index 0000000000..28a7c4366f --- /dev/null +++ b/doc/board/amlogic/beelink-gt1.rst @@ -0,0 +1,98 @@ +.. SPDX-License-Identifier: GPL-2.0+ + +U-Boot for Beelink GT1/GT1-Ultimate +=================================== + +The Shenzen AZW (Beelink) GT1 and GT1-Ultimate are based on the Amlogic +Q200 reference board with an S912 chip. + +- 2GB or 3GB DDR3 RAM +- 32GB eMMC +- HDMI 2.1 video +- S/PDIF optical output +- 10/100/1000 Ethernet +- AP6356S Wireless (802.11 a/b/g/n/ac, BT 4.2) +- 3x USB 2.0 ports +- IR receiver +- 1x micro SD card slot +- 1x Power LED (white) +- 1x Reset button (internal) + +Beelink do not provide public schematics, but have been willing +to share them with known distro developers on request. + +U-Boot compilation +------------------ + +.. code-block:: bash + + $ export CROSS_COMPILE=aarch64-none-elf- + $ make beelink-gt1_defconfig + $ make + +Image creation +-------------- + +Amlogic does not provide sources for the firmware and for tools needed +to create the bootloader image. Beelink have provided the Amlogic SDK +u-boot sources to known distro developers on-request, allowing FIPs to +be generated. The GT1 (2GB) and GT1-Ultimate (3GB) models differ in +RAM size and original Beelink devices use the same spec RAM chips and +can share the same boot FIPs: + +https://github.com/LibreELEC/amlogic-boot-fip/tree/master/beelink-gt1 + +For simplified usage, pleaser refer to :doc:`pre-generated-fip` with codename `beelink-gt1` + +.. code-block:: bash + + $ wget https://github.com/LibreELEC/amlogic-boot-fip/archive/master.zip + $ unzip master.zip + $ export FIPDIR=$PWD/amlogic-boot-fip/beelink-gt1 + +Go back to the mainline U-Boot source tree then: + +.. code-block:: bash + + $ mkdir fip + $ cp $FIPDIR/* fip/ + $ cp u-boot.bin fip/bl33.bin + + $ sh fip/blx_fix.sh \ + fip/bl30.bin \ + fip/zero_tmp \ + fip/bl30_zero.bin \ + fip/bl301.bin \ + fip/bl301_zero.bin \ + fip/bl30_new.bin \ + bl30 + + $ python fip/acs_tool.pyc fip/bl2.bin fip/bl2_acs.bin fip/acs.bin 0 + + $ sh fip/blx_fix.sh \ + fip/bl2_acs.bin \ + fip/zero_tmp \ + fip/bl2_zero.bin \ + fip/bl21.bin \ + fip/bl21_zero.bin \ + fip/bl2_new.bin \ + bl2 + + $ fip/gxl/aml_encrypt_gxl --bl3enc --input fip/bl30_new.bin + $ fip/gxl/aml_encrypt_gxl --bl3enc --input fip/bl31.img + $ fip/gxl/aml_encrypt_gxl --bl3enc --input fip/bl33.bin + $ fip/gxl/aml_encrypt_gxl --bl2sig --input fip/bl2_new.bin --output fip/bl2.n.bin.sig + $ fip/gxl/aml_encrypt_gxl --bootmk \ + --output fip/u-boot.bin \ + --bl2 fip/bl2.n.bin.sig \ + --bl30 fip/bl30_new.bin.enc \ + --bl31 fip/bl31.img.enc \ + --bl33 fip/bl33.bin.enc + +And then write the image to SD or eMMC with: + +.. code-block:: bash + + $ DEV=/dev/your_sd_device + $ dd if=fip/u-boot.bin.sd.bin of=$DEV conv=fsync,notrunc bs=512 skip=1 seek=1 + $ dd if=fip/u-boot.bin.sd.bin of=$DEV conv=fsync,notrunc bs=1 count=440 diff --git a/doc/board/amlogic/index.rst b/doc/board/amlogic/index.rst index f0b92e4209..b8b6f9b98a 100644 --- a/doc/board/amlogic/index.rst +++ b/doc/board/amlogic/index.rst @@ -15,10 +15,10 @@ This matrix concerns the actual source code version. | | | S805X | S905D | | S905D2 | A311D | S905D3 | | | | S905W | | | S905Y2 | | | +===============================+===========+=================+==============+=============+============+=============+==============+ -| Boards | Odroid-C2 | P212 | Khadas VIM2 | S400 | U200 | Odroid-N2 | SEI610 | -| | Nanopi-K2 | Khadas-VIM | Libretech-PC | JetHub J100 | SEI510 | Khadas-VIM3 | Khadas-VIM3L | -| | P200 | LibreTech-CC v1 | WeTek Core2 | | Radxa Zero | GT-King/Pro | Odroid-C4 | -| | P201 | LibreTech-AC v2 | | | | GSKing-X | Odroid-HC4 | +| Boards | Odroid-C2 | P212 | Beelink GT1 | S400 | U200 | Odroid-N2 | SEI610 | +| | Nanopi-K2 | Khadas-VIM | Khadas VIM2 | JetHub J100 | SEI510 | Khadas-VIM3 | Khadas-VIM3L | +| | P200 | LibreTech-CC v1 | Libretech-PC | | Radxa Zero | GT-King/Pro | Odroid-C4 | +| | P201 | LibreTech-AC v2 | WeTek Core2 | | | GSKing-X | Odroid-HC4 | | | | JetHub J80 | | | | Radxa Zero2 | BananaPi-M5 | +-------------------------------+-----------+-----------------+--------------+-------------+------------+-------------+--------------+ | UART | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | @@ -93,6 +93,7 @@ Board Documentation beelink-gtking beelink-gtkingpro + beelink-gt1 jethub-j100 jethub-j80 khadas-vim2 -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0016-WIP-ARM-dts-convert-bananapi-m5-to-dtsi.patch ================================================ From 0addaf5179afa1c985f493035a1dca8f1b23a4ed Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Fri, 17 Feb 2023 05:37:13 +0000 Subject: [PATCH 16/25] WIP: ARM: dts: convert bananapi-m5 to dtsi Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm/dts/meson-sm1-bananapi-m5.dts | 426 +----------------------- arch/arm/dts/meson-sm1-bananapi.dtsi | 435 +++++++++++++++++++++++++ 2 files changed, 436 insertions(+), 425 deletions(-) create mode 100644 arch/arm/dts/meson-sm1-bananapi.dtsi diff --git a/arch/arm/dts/meson-sm1-bananapi-m5.dts b/arch/arm/dts/meson-sm1-bananapi-m5.dts index effaa138b5..34b3238ee0 100644 --- a/arch/arm/dts/meson-sm1-bananapi-m5.dts +++ b/arch/arm/dts/meson-sm1-bananapi-m5.dts @@ -6,10 +6,7 @@ /dts-v1/; -#include "meson-sm1.dtsi" -#include <dt-bindings/leds/common.h> -#include <dt-bindings/input/linux-event-codes.h> -#include <dt-bindings/gpio/meson-g12a-gpio.h> +#include "meson-sm1-bananapi.dtsi" #include <dt-bindings/sound/meson-g12a-toacodec.h> #include <dt-bindings/sound/meson-g12a-tohdmitx.h> @@ -17,28 +14,6 @@ compatible = "bananapi,bpi-m5", "amlogic,sm1"; model = "Banana Pi BPI-M5"; - adc_keys { - compatible = "adc-keys"; - io-channels = <&saradc 2>; - io-channel-names = "buttons"; - keyup-threshold-microvolt = <1800000>; - - key { - label = "SW3"; - linux,code = <BTN_3>; - press-threshold-microvolt = <1700000>; - }; - }; - - aliases { - serial0 = &uart_AO; - ethernet0 = ðmac; - }; - - chosen { - stdout-path = "serial0:115200n8"; - }; - /* TOFIX: handle CVBS_DET on SARADC channel 0 */ cvbs-connector { compatible = "composite-video-connector"; @@ -50,150 +25,6 @@ }; }; - emmc_pwrseq: emmc-pwrseq { - compatible = "mmc-pwrseq-emmc"; - reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>; - }; - - gpio-keys { - compatible = "gpio-keys"; - - key { - label = "SW1"; - linux,code = <BTN_1>; - gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_LOW>; - interrupt-parent = <&gpio_intc>; - interrupts = <3 IRQ_TYPE_EDGE_BOTH>; - }; - }; - - hdmi-connector { - compatible = "hdmi-connector"; - type = "a"; - - port { - hdmi_connector_in: endpoint { - remote-endpoint = <&hdmi_tx_tmds_out>; - }; - }; - }; - - leds { - compatible = "gpio-leds"; - - green { - color = <LED_COLOR_ID_GREEN>; - function = LED_FUNCTION_STATUS; - gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_LOW>; - }; - - blue { - color = <LED_COLOR_ID_BLUE>; - function = LED_FUNCTION_STATUS; - gpios = <&gpio_ao GPIOAO_11 GPIO_ACTIVE_LOW>; - linux,default-trigger = "heartbeat"; - }; - }; - - memory@0 { - device_type = "memory"; - reg = <0x0 0x0 0x0 0x40000000>; - }; - - emmc_1v8: regulator-emmc_1v8 { - compatible = "regulator-fixed"; - regulator-name = "EMMC_1V8"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - vin-supply = <&vddao_3v3>; - regulator-always-on; - }; - - dc_in: regulator-dc_in { - compatible = "regulator-fixed"; - regulator-name = "DC_IN"; - regulator-min-microvolt = <5000000>; - regulator-max-microvolt = <5000000>; - regulator-always-on; - }; - - vddio_c: regulator-vddio_c { - compatible = "regulator-gpio"; - regulator-name = "VDDIO_C"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <3300000>; - - enable-gpio = <&gpio GPIOE_2 GPIO_ACTIVE_HIGH>; - enable-active-high; - regulator-always-on; - - gpios = <&gpio_ao GPIOAO_6 GPIO_OPEN_DRAIN>; - gpios-states = <1>; - - states = <1800000 0>, - <3300000 1>; - }; - - tflash_vdd: regulator-tflash_vdd { - compatible = "regulator-fixed"; - regulator-name = "TFLASH_VDD"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - vin-supply = <&dc_in>; - gpio = <&gpio GPIOH_8 GPIO_OPEN_DRAIN>; - enable-active-high; - regulator-always-on; - }; - - vddao_1v8: regulator-vddao_1v8 { - compatible = "regulator-fixed"; - regulator-name = "VDDAO_1V8"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - vin-supply = <&vddao_3v3>; - regulator-always-on; - }; - - vddao_3v3: regulator-vddao_3v3 { - compatible = "regulator-fixed"; - regulator-name = "VDDAO_3V3"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - vin-supply = <&dc_in>; - regulator-always-on; - }; - - vddcpu: regulator-vddcpu { - /* - * SY8120B1ABC DC/DC Regulator. - */ - compatible = "pwm-regulator"; - - regulator-name = "VDDCPU"; - regulator-min-microvolt = <690000>; - regulator-max-microvolt = <1050000>; - - vin-supply = <&dc_in>; - - pwms = <&pwm_AO_cd 1 1250 0>; - pwm-dutycycle-range = <100 0>; - - regulator-boot-on; - regulator-always-on; - }; - - /* USB Hub Power Enable */ - vl_pwr_en: regulator-vl_pwr_en { - compatible = "regulator-fixed"; - regulator-name = "VL_PWR_EN"; - regulator-min-microvolt = <5000000>; - regulator-max-microvolt = <5000000>; - vin-supply = <&dc_in>; - - gpio = <&gpio GPIOH_6 GPIO_ACTIVE_HIGH>; - enable-active-high; - }; - sound { compatible = "amlogic,axg-sound-card"; model = "BPI-M5"; @@ -319,68 +150,17 @@ status = "okay"; }; -&arb { - status = "okay"; -}; &clkc_audio { status = "okay"; }; -&cpu0 { - cpu-supply = <&vddcpu>; - operating-points-v2 = <&cpu_opp_table>; - clocks = <&clkc CLKID_CPU_CLK>; - clock-latency = <50000>; -}; - -&cpu1 { - cpu-supply = <&vddcpu>; - operating-points-v2 = <&cpu_opp_table>; - clocks = <&clkc CLKID_CPU1_CLK>; - clock-latency = <50000>; -}; - -&cpu2 { - cpu-supply = <&vddcpu>; - operating-points-v2 = <&cpu_opp_table>; - clocks = <&clkc CLKID_CPU2_CLK>; - clock-latency = <50000>; -}; - -&cpu3 { - cpu-supply = <&vddcpu>; - operating-points-v2 = <&cpu_opp_table>; - clocks = <&clkc CLKID_CPU3_CLK>; - clock-latency = <50000>; -}; - &cvbs_vdac_port { cvbs_vdac_out: endpoint { remote-endpoint = <&cvbs_connector_in>; }; }; -&ext_mdio { - external_phy: ethernet-phy@0 { - /* Realtek RTL8211F (0x001cc916) */ - reg = <0>; - max-speed = <1000>; - - interrupt-parent = <&gpio_intc>; - /* MAC_INTR on GPIOZ_14 */ - interrupts = <26 IRQ_TYPE_LEVEL_LOW>; - }; -}; - -ðmac { - pinctrl-0 = <ð_pins>, <ð_rgmii_pins>; - pinctrl-names = "default"; - status = "okay"; - phy-mode = "rgmii-txid"; - phy-handle = <&external_phy>; -}; - &frddr_a { status = "okay"; }; @@ -393,191 +173,6 @@ status = "okay"; }; -&gpio { - gpio-line-names = - /* GPIOZ */ - "ETH_MDIO", /* GPIOZ_0 */ - "ETH_MDC", /* GPIOZ_1 */ - "ETH_RXCLK", /* GPIOZ_2 */ - "ETH_RX_DV", /* GPIOZ_3 */ - "ETH_RXD0", /* GPIOZ_4 */ - "ETH_RXD1", /* GPIOZ_5 */ - "ETH_RXD2", /* GPIOZ_6 */ - "ETH_RXD3", /* GPIOZ_7 */ - "ETH_TXCLK", /* GPIOZ_8 */ - "ETH_TXEN", /* GPIOZ_9 */ - "ETH_TXD0", /* GPIOZ_10 */ - "ETH_TXD1", /* GPIOZ_11 */ - "ETH_TXD2", /* GPIOZ_12 */ - "ETH_TXD3", /* GPIOZ_13 */ - "ETH_INTR", /* GPIOZ_14 */ - "ETH_NRST", /* GPIOZ_15 */ - /* GPIOH */ - "HDMI_SDA", /* GPIOH_0 */ - "HDMI_SCL", /* GPIOH_1 */ - "HDMI_HPD", /* GPIOH_2 */ - "HDMI_CEC", /* GPIOH_3 */ - "VL-RST_N", /* GPIOH_4 */ - "CON1-P36", /* GPIOH_5 */ - "VL-PWREN", /* GPIOH_6 */ - "WiFi_3V3_1V8", /* GPIOH_7 */ - "TFLASH_VDD_EN", /* GPIOH_8 */ - /* BOOT */ - "eMMC_D0", /* BOOT_0 */ - "eMMC_D1", /* BOOT_1 */ - "eMMC_D2", /* BOOT_2 */ - "eMMC_D3", /* BOOT_3 */ - "eMMC_D4", /* BOOT_4 */ - "eMMC_D5", /* BOOT_5 */ - "eMMC_D6", /* BOOT_6 */ - "eMMC_D7", /* BOOT_7 */ - "eMMC_CLK", /* BOOT_8 */ - "", - "eMMC_CMD", /* BOOT_10 */ - "", - "eMMC_RST#", /* BOOT_12 */ - "eMMC_DS", /* BOOT_13 */ - /* GPIOC */ - "SD_D0_B", /* GPIOC_0 */ - "SD_D1_B", /* GPIOC_1 */ - "SD_D2_B", /* GPIOC_2 */ - "SD_D3_B", /* GPIOC_3 */ - "SD_CLK_B", /* GPIOC_4 */ - "SD_CMD_B", /* GPIOC_5 */ - "CARD_EN_DET", /* GPIOC_6 */ - "", - /* GPIOA */ - "", "", "", "", "", "", "", "", - "", "", "", "", "", "", - "CON1-P27", /* GPIOA_14 */ - "CON1-P28", /* GPIOA_15 */ - /* GPIOX */ - "CON1-P16", /* GPIOX_0 */ - "CON1-P18", /* GPIOX_1 */ - "CON1-P22", /* GPIOX_2 */ - "CON1-P11", /* GPIOX_3 */ - "CON1-P13", /* GPIOX_4 */ - "CON1-P07", /* GPIOX_5 */ - "CON1-P33", /* GPIOX_6 */ - "CON1-P15", /* GPIOX_7 */ - "CON1-P19", /* GPIOX_8 */ - "CON1-P21", /* GPIOX_9 */ - "CON1-P24", /* GPIOX_10 */ - "CON1-P23", /* GPIOX_11 */ - "CON1-P08", /* GPIOX_12 */ - "CON1-P10", /* GPIOX_13 */ - "CON1-P29", /* GPIOX_14 */ - "CON1-P31", /* GPIOX_15 */ - "CON1-P26", /* GPIOX_16 */ - "CON1-P03", /* GPIOX_17 */ - "CON1-P05", /* GPIOX_18 */ - "CON1-P32"; /* GPIOX_19 */ - - /* - * WARNING: The USB Hub on the BPI-M5 needs a reset signal - * to be turned high in order to be detected by the USB Controller - * This signal should be handled by a USB specific power sequence - * in order to reset the Hub when USB bus is powered down. - */ - usb-hub { - gpio-hog; - gpios = <GPIOH_4 GPIO_ACTIVE_HIGH>; - output-high; - line-name = "usb-hub-reset"; - }; -}; - -&gpio_ao { - gpio-line-names = - /* GPIOAO */ - "DEBUG TX", /* GPIOAO_0 */ - "DEBUG RX", /* GPIOAO_1 */ - "SYS_LED2", /* GPIOAO_2 */ - "UPDATE_KEY", /* GPIOAO_3 */ - "CON1-P40", /* GPIOAO_4 */ - "IR_IN", /* GPIOAO_5 */ - "TF_3V3N_1V8_EN", /* GPIOAO_6 */ - "CON1-P35", /* GPIOAO_7 */ - "CON1-P12", /* GPIOAO_8 */ - "CON1-P37", /* GPIOAO_9 */ - "CON1-P38", /* GPIOAO_10 */ - "SYS_LED", /* GPIOAO_11 */ - /* GPIOE */ - "VDDEE_PWM", /* GPIOE_0 */ - "VDDCPU_PWM", /* GPIOE_1 */ - "TF_PWR_EN"; /* GPIOE_2 */ -}; - -&hdmi_tx { - status = "okay"; - pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>; - pinctrl-names = "default"; - hdmi-supply = <&dc_in>; -}; - -&hdmi_tx_tmds_port { - hdmi_tx_tmds_out: endpoint { - remote-endpoint = <&hdmi_connector_in>; - }; -}; - -&ir { - status = "okay"; - pinctrl-0 = <&remote_input_ao_pins>; - pinctrl-names = "default"; -}; - -&pwm_AO_cd { - pinctrl-0 = <&pwm_ao_d_e_pins>; - pinctrl-names = "default"; - clocks = <&xtal>; - clock-names = "clkin1"; - status = "okay"; -}; - -&saradc { - status = "okay"; - vref-supply = <&vddao_1v8>; -}; - -/* SD card */ -&sd_emmc_b { - status = "okay"; - pinctrl-0 = <&sdcard_c_pins>; - pinctrl-1 = <&sdcard_clk_gate_c_pins>; - pinctrl-names = "default", "clk-gate"; - - bus-width = <4>; - cap-sd-highspeed; - max-frequency = <50000000>; - disable-wp; - - /* TOFIX: SD card is barely usable in SDR modes */ - - cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>; - vmmc-supply = <&tflash_vdd>; - vqmmc-supply = <&vddio_c>; -}; - -/* eMMC */ -&sd_emmc_c { - status = "okay"; - pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>; - pinctrl-1 = <&emmc_clk_gate_pins>; - pinctrl-names = "default", "clk-gate"; - - bus-width = <8>; - cap-mmc-highspeed; - mmc-ddr-1_8v; - mmc-hs200-1_8v; - max-frequency = <200000000>; - disable-wp; - - mmc-pwrseq = <&emmc_pwrseq>; - vmmc-supply = <&vddao_3v3>; - vqmmc-supply = <&emmc_1v8>; -}; - &tdmif_b { status = "okay"; }; @@ -625,22 +220,3 @@ &toddr_c { status = "okay"; }; - -&uart_AO { - status = "okay"; - pinctrl-0 = <&uart_ao_a_pins>; - pinctrl-names = "default"; -}; - -&usb { - status = "okay"; -}; - -&usb2_phy0 { - phy-supply = <&dc_in>; -}; - -&usb2_phy1 { - /* Enable the hub which is connected to this port */ - phy-supply = <&vl_pwr_en>; -}; diff --git a/arch/arm/dts/meson-sm1-bananapi.dtsi b/arch/arm/dts/meson-sm1-bananapi.dtsi new file mode 100644 index 0000000000..c914f11481 --- /dev/null +++ b/arch/arm/dts/meson-sm1-bananapi.dtsi @@ -0,0 +1,435 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2021 BayLibre SAS + * Author: Neil Armstrong <narmstrong@baylibre.com> + */ + +#include "meson-sm1.dtsi" +#include <dt-bindings/leds/common.h> +#include <dt-bindings/input/linux-event-codes.h> +#include <dt-bindings/gpio/meson-g12a-gpio.h> + +/ { + adc_keys { + compatible = "adc-keys"; + io-channels = <&saradc 2>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1800000>; + + key { + label = "SW3"; + linux,code = <BTN_3>; + press-threshold-microvolt = <1700000>; + }; + }; + + aliases { + serial0 = &uart_AO; + ethernet0 = ðmac; + }; + + chosen { + stdout-path = "serial0:115200n8"; + }; + + emmc_pwrseq: emmc-pwrseq { + compatible = "mmc-pwrseq-emmc"; + reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>; + }; + + gpio-keys { + compatible = "gpio-keys"; + + key { + label = "SW1"; + linux,code = <BTN_1>; + gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_LOW>; + interrupt-parent = <&gpio_intc>; + interrupts = <3 IRQ_TYPE_EDGE_BOTH>; + }; + }; + + hdmi-connector { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_connector_in: endpoint { + remote-endpoint = <&hdmi_tx_tmds_out>; + }; + }; + }; + + leds { + compatible = "gpio-leds"; + + led-green { + color = <LED_COLOR_ID_GREEN>; + function = LED_FUNCTION_STATUS; + gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_LOW>; + }; + + led-blue { + color = <LED_COLOR_ID_BLUE>; + function = LED_FUNCTION_STATUS; + gpios = <&gpio_ao GPIOAO_11 GPIO_ACTIVE_LOW>; + linux,default-trigger = "heartbeat"; + }; + }; + + memory@0 { + device_type = "memory"; + reg = <0x0 0x0 0x0 0x40000000>; + }; + + emmc_1v8: regulator-emmc_1v8 { + compatible = "regulator-fixed"; + regulator-name = "EMMC_1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vddao_3v3>; + regulator-always-on; + }; + + dc_in: regulator-dc_in { + compatible = "regulator-fixed"; + regulator-name = "DC_IN"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + regulator-always-on; + }; + + vddio_c: regulator-vddio_c { + compatible = "regulator-gpio"; + regulator-name = "VDDIO_C"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; + + enable-gpio = <&gpio_ao GPIOE_2 GPIO_OPEN_DRAIN>; + enable-active-high; + regulator-always-on; + + gpios = <&gpio_ao GPIOAO_6 GPIO_OPEN_DRAIN>; + gpios-states = <1>; + + states = <1800000 0>, + <3300000 1>; + }; + + tflash_vdd: regulator-tflash_vdd { + compatible = "regulator-fixed"; + regulator-name = "TFLASH_VDD"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&dc_in>; + gpio = <&gpio GPIOH_8 GPIO_OPEN_DRAIN>; + enable-active-high; + regulator-always-on; + }; + + vddao_1v8: regulator-vddao_1v8 { + compatible = "regulator-fixed"; + regulator-name = "VDDAO_1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vddao_3v3>; + regulator-always-on; + }; + + vddao_3v3: regulator-vddao_3v3 { + compatible = "regulator-fixed"; + regulator-name = "VDDAO_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&dc_in>; + regulator-always-on; + }; + + vddcpu: regulator-vddcpu { + /* + * SY8120B1ABC DC/DC Regulator. + */ + compatible = "pwm-regulator"; + + regulator-name = "VDDCPU"; + regulator-min-microvolt = <690000>; + regulator-max-microvolt = <1050000>; + + pwm-supply = <&dc_in>; + + pwms = <&pwm_AO_cd 1 1250 0>; + pwm-dutycycle-range = <100 0>; + + regulator-boot-on; + regulator-always-on; + }; + + /* USB Hub Power Enable */ + vl_pwr_en: regulator-vl_pwr_en { + compatible = "regulator-fixed"; + regulator-name = "VL_PWR_EN"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&dc_in>; + + gpio = <&gpio GPIOH_6 GPIO_ACTIVE_HIGH>; + enable-active-high; + }; +}; + +&arb { + status = "okay"; +}; + +&cpu0 { + cpu-supply = <&vddcpu>; + operating-points-v2 = <&cpu_opp_table>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu1 { + cpu-supply = <&vddcpu>; + operating-points-v2 = <&cpu_opp_table>; + clocks = <&clkc CLKID_CPU1_CLK>; + clock-latency = <50000>; +}; + +&cpu2 { + cpu-supply = <&vddcpu>; + operating-points-v2 = <&cpu_opp_table>; + clocks = <&clkc CLKID_CPU2_CLK>; + clock-latency = <50000>; +}; + +&cpu3 { + cpu-supply = <&vddcpu>; + operating-points-v2 = <&cpu_opp_table>; + clocks = <&clkc CLKID_CPU3_CLK>; + clock-latency = <50000>; +}; + +&ext_mdio { + external_phy: ethernet-phy@0 { + /* Realtek RTL8211F (0x001cc916) */ + reg = <0>; + max-speed = <1000>; + + interrupt-parent = <&gpio_intc>; + /* MAC_INTR on GPIOZ_14 */ + interrupts = <26 IRQ_TYPE_LEVEL_LOW>; + }; +}; + +ðmac { + pinctrl-0 = <ð_pins>, <ð_rgmii_pins>; + pinctrl-names = "default"; + status = "okay"; + phy-mode = "rgmii-txid"; + phy-handle = <&external_phy>; +}; + +&gpio { + gpio-line-names = + /* GPIOZ */ + "ETH_MDIO", /* GPIOZ_0 */ + "ETH_MDC", /* GPIOZ_1 */ + "ETH_RXCLK", /* GPIOZ_2 */ + "ETH_RX_DV", /* GPIOZ_3 */ + "ETH_RXD0", /* GPIOZ_4 */ + "ETH_RXD1", /* GPIOZ_5 */ + "ETH_RXD2", /* GPIOZ_6 */ + "ETH_RXD3", /* GPIOZ_7 */ + "ETH_TXCLK", /* GPIOZ_8 */ + "ETH_TXEN", /* GPIOZ_9 */ + "ETH_TXD0", /* GPIOZ_10 */ + "ETH_TXD1", /* GPIOZ_11 */ + "ETH_TXD2", /* GPIOZ_12 */ + "ETH_TXD3", /* GPIOZ_13 */ + "ETH_INTR", /* GPIOZ_14 */ + "ETH_NRST", /* GPIOZ_15 */ + /* GPIOH */ + "HDMI_SDA", /* GPIOH_0 */ + "HDMI_SCL", /* GPIOH_1 */ + "HDMI_HPD", /* GPIOH_2 */ + "HDMI_CEC", /* GPIOH_3 */ + "VL-RST_N", /* GPIOH_4 */ + "CON1-P36", /* GPIOH_5 */ + "VL-PWREN", /* GPIOH_6 */ + "WiFi_3V3_1V8", /* GPIOH_7 */ + "TFLASH_VDD_EN", /* GPIOH_8 */ + /* BOOT */ + "eMMC_D0", /* BOOT_0 */ + "eMMC_D1", /* BOOT_1 */ + "eMMC_D2", /* BOOT_2 */ + "eMMC_D3", /* BOOT_3 */ + "eMMC_D4", /* BOOT_4 */ + "eMMC_D5", /* BOOT_5 */ + "eMMC_D6", /* BOOT_6 */ + "eMMC_D7", /* BOOT_7 */ + "eMMC_CLK", /* BOOT_8 */ + "", + "eMMC_CMD", /* BOOT_10 */ + "", + "eMMC_RST#", /* BOOT_12 */ + "eMMC_DS", /* BOOT_13 */ + "", "", + /* GPIOC */ + "SD_D0_B", /* GPIOC_0 */ + "SD_D1_B", /* GPIOC_1 */ + "SD_D2_B", /* GPIOC_2 */ + "SD_D3_B", /* GPIOC_3 */ + "SD_CLK_B", /* GPIOC_4 */ + "SD_CMD_B", /* GPIOC_5 */ + "CARD_EN_DET", /* GPIOC_6 */ + "", + /* GPIOA */ + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", + "CON1-P27", /* GPIOA_14 */ + "CON1-P28", /* GPIOA_15 */ + /* GPIOX */ + "CON1-P16", /* GPIOX_0 */ + "CON1-P18", /* GPIOX_1 */ + "CON1-P22", /* GPIOX_2 */ + "CON1-P11", /* GPIOX_3 */ + "CON1-P13", /* GPIOX_4 */ + "CON1-P07", /* GPIOX_5 */ + "CON1-P33", /* GPIOX_6 */ + "CON1-P15", /* GPIOX_7 */ + "CON1-P19", /* GPIOX_8 */ + "CON1-P21", /* GPIOX_9 */ + "CON1-P24", /* GPIOX_10 */ + "CON1-P23", /* GPIOX_11 */ + "CON1-P08", /* GPIOX_12 */ + "CON1-P10", /* GPIOX_13 */ + "CON1-P29", /* GPIOX_14 */ + "CON1-P31", /* GPIOX_15 */ + "CON1-P26", /* GPIOX_16 */ + "CON1-P03", /* GPIOX_17 */ + "CON1-P05", /* GPIOX_18 */ + "CON1-P32"; /* GPIOX_19 */ + + /* + * WARNING: The USB Hub needs a reset signal to be turned high in + * order to be detected by the USB Controller. This signal should + * be handled by a USB specific power sequence to reset the Hub + * when the USB bus is powered down. + */ + usb-hub { + gpio-hog; + gpios = <GPIOH_4 GPIO_ACTIVE_HIGH>; + output-high; + line-name = "usb-hub-reset"; + }; +}; + +&gpio_ao { + gpio-line-names = + /* GPIOAO */ + "DEBUG TX", /* GPIOAO_0 */ + "DEBUG RX", /* GPIOAO_1 */ + "SYS_LED2", /* GPIOAO_2 */ + "UPDATE_KEY", /* GPIOAO_3 */ + "CON1-P40", /* GPIOAO_4 */ + "IR_IN", /* GPIOAO_5 */ + "TF_3V3N_1V8_EN", /* GPIOAO_6 */ + "CON1-P35", /* GPIOAO_7 */ + "CON1-P12", /* GPIOAO_8 */ + "CON1-P37", /* GPIOAO_9 */ + "CON1-P38", /* GPIOAO_10 */ + "SYS_LED", /* GPIOAO_11 */ + /* GPIOE */ + "VDDEE_PWM", /* GPIOE_0 */ + "VDDCPU_PWM", /* GPIOE_1 */ + "TF_PWR_EN"; /* GPIOE_2 */ +}; + +&hdmi_tx { + status = "okay"; + pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>; + pinctrl-names = "default"; + hdmi-supply = <&dc_in>; +}; + +&hdmi_tx_tmds_port { + hdmi_tx_tmds_out: endpoint { + remote-endpoint = <&hdmi_connector_in>; + }; +}; + +&ir { + status = "okay"; + pinctrl-0 = <&remote_input_ao_pins>; + pinctrl-names = "default"; +}; + +&pwm_AO_cd { + pinctrl-0 = <&pwm_ao_d_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin1"; + status = "okay"; +}; + +&saradc { + status = "okay"; + vref-supply = <&vddao_1v8>; +}; + +/* SD card */ +&sd_emmc_b { + status = "okay"; + pinctrl-0 = <&sdcard_c_pins>; + pinctrl-1 = <&sdcard_clk_gate_c_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <4>; + cap-sd-highspeed; + max-frequency = <50000000>; + disable-wp; + + /* TOFIX: SD card is barely usable in SDR modes */ + + cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>; + vmmc-supply = <&tflash_vdd>; + vqmmc-supply = <&vddio_c>; +}; + +/* eMMC */ +&sd_emmc_c { + status = "okay"; + pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>; + pinctrl-1 = <&emmc_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <8>; + cap-mmc-highspeed; + mmc-ddr-1_8v; + mmc-hs200-1_8v; + max-frequency = <200000000>; + disable-wp; + + mmc-pwrseq = <&emmc_pwrseq>; + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&emmc_1v8>; +}; + +&uart_AO { + status = "okay"; + pinctrl-0 = <&uart_ao_a_pins>; + pinctrl-names = "default"; +}; + +&usb { + status = "okay"; +}; + +&usb2_phy0 { + phy-supply = <&dc_in>; +}; + +&usb2_phy1 { + /* Enable the hub which is connected to this port */ + phy-supply = <&vl_pwr_en>; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0017-WIP-ARM-dts-add-support-for-BananaPi-M2-Pro.patch ================================================ From dbf80e3d843cb58b9098d7c0e24c9ab1208003a7 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Fri, 17 Feb 2023 05:38:46 +0000 Subject: [PATCH 17/25] WIP: ARM: dts: add support for BananaPi M2-Pro Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm/dts/Makefile | 1 + .../dts/meson-sm1-bananapi-m2-pro-u-boot.dtsi | 13 +++ arch/arm/dts/meson-sm1-bananapi-m2-pro.dts | 98 +++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 arch/arm/dts/meson-sm1-bananapi-m2-pro-u-boot.dtsi create mode 100644 arch/arm/dts/meson-sm1-bananapi-m2-pro.dts diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index 926ae0aae4..4e9fa81e18 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile @@ -203,6 +203,7 @@ dtb-$(CONFIG_ARCH_MESON) += \ meson-g12b-odroid-n2.dtb \ meson-g12b-odroid-n2-plus.dtb \ meson-g12b-radxa-zero2.dtb \ + meson-sm1-bananapi-m2-pro.dtb \ meson-sm1-bananapi-m5.dtb \ meson-sm1-khadas-vim3l.dtb \ meson-sm1-odroid-c4.dtb \ diff --git a/arch/arm/dts/meson-sm1-bananapi-m2-pro-u-boot.dtsi b/arch/arm/dts/meson-sm1-bananapi-m2-pro-u-boot.dtsi new file mode 100644 index 0000000000..a86fdb5668 --- /dev/null +++ b/arch/arm/dts/meson-sm1-bananapi-m2-pro-u-boot.dtsi @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2021 BayLibre, SAS + * Author: Neil Armstrong <narmstrong@baylibre.com> + */ + +#include "meson-sm1-u-boot.dtsi" + +ðmac { + snps,reset-gpio = <&gpio GPIOZ_15 (GPIO_ACTIVE_LOW | GPIO_OPEN_DRAIN)>; + snps,reset-delays-us = <0 10000 1000000>; + snps,reset-active-low; +}; diff --git a/arch/arm/dts/meson-sm1-bananapi-m2-pro.dts b/arch/arm/dts/meson-sm1-bananapi-m2-pro.dts new file mode 100644 index 0000000000..4890d5d9a4 --- /dev/null +++ b/arch/arm/dts/meson-sm1-bananapi-m2-pro.dts @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2021 BayLibre SAS + * Author: Neil Armstrong <narmstrong@baylibre.com> + */ + +/dts-v1/; + +#include "meson-sm1-bananapi.dtsi" +#include <dt-bindings/sound/meson-g12a-tohdmitx.h> + +/ { + compatible = "bananapi,bpi-m2-pro", "amlogic,sm1"; + model = "Banana Pi BPI-M2-PRO"; + + sound { + compatible = "amlogic,axg-sound-card"; + model = "BPI-M2-PRO"; + audio-aux-devs = <&tdmout_b>; + audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1", + "TDMOUT_B IN 1", "FRDDR_B OUT 1", + "TDMOUT_B IN 2", "FRDDR_C OUT 1", + "TDM_B Playback", "TDMOUT_B OUT"; + + assigned-clocks = <&clkc CLKID_MPLL2>, + <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + status = "okay"; + + dai-link-0 { + sound-dai = <&frddr_a>; + }; + + dai-link-1 { + sound-dai = <&frddr_b>; + }; + + dai-link-2 { + sound-dai = <&frddr_c>; + }; + + /* 8ch hdmi interface */ + dai-link-3 { + sound-dai = <&tdmif_b>; + dai-format = "i2s"; + dai-tdm-slot-tx-mask-0 = <1 1>; + dai-tdm-slot-tx-mask-1 = <1 1>; + dai-tdm-slot-tx-mask-2 = <1 1>; + dai-tdm-slot-tx-mask-3 = <1 1>; + mclk-fs = <256>; + + codec { + sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>; + }; + }; + + /* hdmi glue */ + dai-link-4 { + sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>; + + codec { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&clkc_audio { + status = "okay"; +}; + +&frddr_a { + status = "okay"; +}; + +&frddr_b { + status = "okay"; +}; + +&frddr_c { + status = "okay"; +}; + +&tdmif_b { + status = "okay"; +}; + +&tdmout_b { + status = "okay"; +}; + +&tohdmitx { + status = "okay"; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0018-WIP-boards-add-BananaPi-M2-Pro-defconfig.patch ================================================ From 0be895d75648124c0bd8d7fce1fe61c3dbacbe5f Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Fri, 17 Feb 2023 05:41:36 +0000 Subject: [PATCH 18/25] WIP: boards: add BananaPi M2-Pro defconfig Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- configs/bananapi-m2-pro_defconfig | 76 +++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 configs/bananapi-m2-pro_defconfig diff --git a/configs/bananapi-m2-pro_defconfig b/configs/bananapi-m2-pro_defconfig new file mode 100644 index 0000000000..1c2b8ab95e --- /dev/null +++ b/configs/bananapi-m2-pro_defconfig @@ -0,0 +1,76 @@ +CONFIG_ARM=y +CONFIG_ARCH_MESON=y +CONFIG_SYS_TEXT_BASE=0x01000000 +CONFIG_NR_DRAM_BANKS=1 +CONFIG_ENV_SIZE=0x2000 +CONFIG_DM_GPIO=y +CONFIG_DEFAULT_DEVICE_TREE="meson-sm1-bananapi-m2-pro" +CONFIG_MESON_G12A=y +CONFIG_DEBUG_UART_BASE=0xff803000 +CONFIG_DEBUG_UART_CLOCK=24000000 +CONFIG_IDENT_STRING="bpi-m2-pro" +CONFIG_SYS_LOAD_ADDR=0x1000000 +CONFIG_DEBUG_UART=y +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20000000 +CONFIG_REMAKE_ELF=y +CONFIG_OF_BOARD_SETUP=y +# CONFIG_DISPLAY_CPUINFO is not set +CONFIG_MISC_INIT_R=y +CONFIG_SYS_MAXARGS=32 +# CONFIG_CMD_BDI is not set +# CONFIG_CMD_IMI is not set +CONFIG_CMD_GPIO=y +# CONFIG_CMD_LOADS is not set +CONFIG_CMD_MMC=y +CONFIG_CMD_USB=y +CONFIG_CMD_USB_MASS_STORAGE=y +# CONFIG_CMD_SETEXPR is not set +CONFIG_CMD_REGULATOR=y +CONFIG_OF_CONTROL=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_ADC=y +CONFIG_SARADC_MESON=y +CONFIG_MMC_MESON_GX=y +CONFIG_PHY_REALTEK=y +CONFIG_DM_MDIO=y +CONFIG_DM_MDIO_MUX=y +CONFIG_ETH_DESIGNWARE_MESON8B=y +CONFIG_MDIO_MUX_MESON_G12A=y +CONFIG_MESON_G12A_USB_PHY=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_MESON_G12A=y +CONFIG_POWER_DOMAIN=y +CONFIG_MESON_EE_POWER_DOMAIN=y +CONFIG_DM_REGULATOR=y +CONFIG_DM_REGULATOR_FIXED=y +CONFIG_DM_RESET=y +CONFIG_DEBUG_UART_ANNOUNCE=y +CONFIG_DEBUG_UART_SKIP_INIT=y +CONFIG_MESON_SERIAL=y +CONFIG_USB=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_DWC3=y +CONFIG_USB_DWC3=y +# CONFIG_USB_DWC3_GADGET is not set +CONFIG_USB_DWC3_MESON_G12A=y +CONFIG_USB_KEYBOARD=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_VENDOR_NUM=0x1b8e +CONFIG_USB_GADGET_PRODUCT_NUM=0xfada +CONFIG_USB_GADGET_DWC2_OTG=y +CONFIG_USB_GADGET_DWC2_OTG_PHY_BUS_WIDTH_8=y +CONFIG_USB_GADGET_DOWNLOAD=y +CONFIG_DM_VIDEO=y +# CONFIG_VIDEO_BPP8 is not set +# CONFIG_VIDEO_BPP16 is not set +CONFIG_SYS_WHITE_ON_BLACK=y +CONFIG_VIDEO_MESON=y +CONFIG_VIDEO_DT_SIMPLEFB=y +CONFIG_SPLASH_SCREEN=y +CONFIG_SPLASH_SCREEN_ALIGN=y +CONFIG_VIDEO_BMP_RLE8=y +CONFIG_BMP_16BPP=y +CONFIG_BMP_24BPP=y +CONFIG_BMP_32BPP=y +CONFIG_OF_LIBFDT_OVERLAY=y -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0019-WIP-docs-boards-amlogic-update-for-BananaPi-M2-Pro.patch ================================================ From b4870c47202687c6a6880b449c97a2e32ec3d278 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Fri, 17 Feb 2023 05:49:44 +0000 Subject: [PATCH 19/25] WIP: docs: boards: amlogic: update for BananaPi M2-Pro Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- board/amlogic/u200/MAINTAINERS | 1 + doc/board/amlogic/index.rst | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/board/amlogic/u200/MAINTAINERS b/board/amlogic/u200/MAINTAINERS index 47cec234a1..2a2d9d4c49 100644 --- a/board/amlogic/u200/MAINTAINERS +++ b/board/amlogic/u200/MAINTAINERS @@ -4,6 +4,7 @@ S: Maintained L: u-boot-amlogic@groups.io F: board/amlogic/u200/ F: configs/u200_defconfig +F: configs/bananapi-m2-pro_defconfig F: configs/bananapi-m5_defconfig F: configs/radxa-zero_defconfig F: doc/board/amlogic/u200.rst diff --git a/doc/board/amlogic/index.rst b/doc/board/amlogic/index.rst index b8b6f9b98a..629284fca9 100644 --- a/doc/board/amlogic/index.rst +++ b/doc/board/amlogic/index.rst @@ -19,7 +19,8 @@ This matrix concerns the actual source code version. | | Nanopi-K2 | Khadas-VIM | Khadas VIM2 | JetHub J100 | SEI510 | Khadas-VIM3 | Khadas-VIM3L | | | P200 | LibreTech-CC v1 | Libretech-PC | | Radxa Zero | GT-King/Pro | Odroid-C4 | | | P201 | LibreTech-AC v2 | WeTek Core2 | | | GSKing-X | Odroid-HC4 | -| | | JetHub J80 | | | | Radxa Zero2 | BananaPi-M5 | +| | | JetHub J80 | | | | Radxa Zero2 | BPi-M2-Pro | +| | | | | | | Radxa Zero2 | BPi-M5 | +-------------------------------+-----------+-----------------+--------------+-------------+------------+-------------+--------------+ | UART | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | +-------------------------------+-----------+-----------------+--------------+-------------+------------+-------------+--------------+ @@ -37,7 +38,7 @@ This matrix concerns the actual source code version. +-------------------------------+-----------+-----------------+--------------+-------------+------------+-------------+--------------+ | Multi-core | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | +-------------------------------+-----------+-----------------+--------------+-------------+------------+-------------+--------------+ -| Fuse access | **Yes** | **Yes** |**Yes** |**Yes** |**Yes** |**Yes** | **Yes** | +| Fuse access | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | +-------------------------------+-----------+-----------------+--------------+-------------+------------+-------------+--------------+ | SPI (FC) | **Yes** | **Yes** | **Yes** | **Yes** |**Yes** | **Yes** | No | +-------------------------------+-----------+-----------------+--------------+-------------+------------+-------------+--------------+ -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0020-WIP-boards-add-BananaPi-M2S-defconfig.patch ================================================ From 665eff902425685a2278e393a89452276e4ea665 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 18 Feb 2023 08:06:04 +0000 Subject: [PATCH 20/25] WIP: boards: add BananaPi M2S defconfig Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- configs/bananapi-m2s_defconfig | 82 ++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 configs/bananapi-m2s_defconfig diff --git a/configs/bananapi-m2s_defconfig b/configs/bananapi-m2s_defconfig new file mode 100644 index 0000000000..7a35ea623d --- /dev/null +++ b/configs/bananapi-m2s_defconfig @@ -0,0 +1,82 @@ +CONFIG_ARM=y +CONFIG_ARCH_MESON=y +CONFIG_SYS_TEXT_BASE=0x01000000 +CONFIG_NR_DRAM_BANKS=1 +CONFIG_ENV_SIZE=0x2000 +CONFIG_DM_GPIO=y +CONFIG_DEFAULT_DEVICE_TREE="meson-g12b-a311d-bananapi-m2s" +CONFIG_MESON_G12A=y +CONFIG_DEBUG_UART_BASE=0xff803000 +CONFIG_DEBUG_UART_CLOCK=24000000 +CONFIG_IDENT_STRING=" bpi-m2s" +CONFIG_SYS_LOAD_ADDR=0x1000000 +CONFIG_DEBUG_UART=y +CONFIG_AHCI=y +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20000000 +CONFIG_REMAKE_ELF=y +CONFIG_OF_BOARD_SETUP=y +# CONFIG_DISPLAY_CPUINFO is not set +CONFIG_MISC_INIT_R=y +CONFIG_SYS_MAXARGS=32 +# CONFIG_CMD_BDI is not set +# CONFIG_CMD_IMI is not set +CONFIG_CMD_GPIO=y +# CONFIG_CMD_LOADS is not set +CONFIG_CMD_MMC=y +CONFIG_CMD_PCI=y +CONFIG_CMD_USB=y +CONFIG_CMD_USB_MASS_STORAGE=y +# CONFIG_CMD_SETEXPR is not set +CONFIG_CMD_REGULATOR=y +CONFIG_OF_CONTROL=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_ADC=y +CONFIG_SARADC_MESON=y +CONFIG_AHCI_PCI=y +CONFIG_MMC_MESON_GX=y +CONFIG_PHY_REALTEK=y +CONFIG_DM_MDIO=y +CONFIG_DM_MDIO_MUX=y +CONFIG_ETH_DESIGNWARE_MESON8B=y +CONFIG_MDIO_MUX_MESON_G12A=y +CONFIG_PCI=y +CONFIG_PCIE_DW_MESON=y +CONFIG_MESON_G12A_USB_PHY=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_MESON_G12A=y +CONFIG_POWER_DOMAIN=y +CONFIG_MESON_EE_POWER_DOMAIN=y +CONFIG_DM_REGULATOR=y +CONFIG_DM_REGULATOR_FIXED=y +CONFIG_DM_REGULATOR_GPIO=y +CONFIG_DM_RESET=y +CONFIG_DEBUG_UART_ANNOUNCE=y +CONFIG_DEBUG_UART_SKIP_INIT=y +CONFIG_MESON_SERIAL=y +CONFIG_USB=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_DWC3=y +CONFIG_USB_DWC3=y +# CONFIG_USB_DWC3_GADGET is not set +CONFIG_USB_DWC3_MESON_G12A=y +CONFIG_USB_KEYBOARD=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_VENDOR_NUM=0x1b8e +CONFIG_USB_GADGET_PRODUCT_NUM=0xfada +CONFIG_USB_GADGET_DWC2_OTG=y +CONFIG_USB_GADGET_DWC2_OTG_PHY_BUS_WIDTH_8=y +CONFIG_USB_GADGET_DOWNLOAD=y +CONFIG_DM_VIDEO=y +# CONFIG_VIDEO_BPP8 is not set +# CONFIG_VIDEO_BPP16 is not set +CONFIG_SYS_WHITE_ON_BLACK=y +CONFIG_VIDEO_MESON=y +CONFIG_VIDEO_DT_SIMPLEFB=y +CONFIG_SPLASH_SCREEN=y +CONFIG_SPLASH_SCREEN_ALIGN=y +CONFIG_VIDEO_BMP_RLE8=y +CONFIG_BMP_16BPP=y +CONFIG_BMP_24BPP=y +CONFIG_BMP_32BPP=y +CONFIG_OF_LIBFDT_OVERLAY=y -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0021-WIP-docs-boards-amlogic-update-for-BananaPi-M2S.patch ================================================ From e1484036ca5e032a9039ed2f361f2b123a8efd64 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 18 Feb 2023 08:08:42 +0000 Subject: [PATCH 21/25] WIP: docs: boards: amlogic: update for BananaPi M2S Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- board/amlogic/w400/MAINTAINERS | 2 ++ doc/board/amlogic/index.rst | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/board/amlogic/w400/MAINTAINERS b/board/amlogic/w400/MAINTAINERS index 6e1ef9b8b8..d4b4d4f91d 100644 --- a/board/amlogic/w400/MAINTAINERS +++ b/board/amlogic/w400/MAINTAINERS @@ -3,6 +3,8 @@ M: Neil Armstrong <neil.armstrong@linaro.org> S: Maintained L: u-boot-amlogic@groups.io F: board/amlogic/w400/ +F: configs/bananapi-m2s_defconfig F: configs/radxa-zero2_defconfig F: doc/board/amlogic/w400.rst +F: doc/board/amlogic/bananapi-m2s.rst F: doc/board/amlogic/radxa-zero2.rst diff --git a/doc/board/amlogic/index.rst b/doc/board/amlogic/index.rst index 629284fca9..fd8d4185f8 100644 --- a/doc/board/amlogic/index.rst +++ b/doc/board/amlogic/index.rst @@ -20,7 +20,7 @@ This matrix concerns the actual source code version. | | P200 | LibreTech-CC v1 | Libretech-PC | | Radxa Zero | GT-King/Pro | Odroid-C4 | | | P201 | LibreTech-AC v2 | WeTek Core2 | | | GSKing-X | Odroid-HC4 | | | | JetHub J80 | | | | Radxa Zero2 | BPi-M2-Pro | -| | | | | | | Radxa Zero2 | BPi-M5 | +| | | | | | | BPI-M2S | BPi-M5 | +-------------------------------+-----------+-----------------+--------------+-------------+------------+-------------+--------------+ | UART | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | +-------------------------------+-----------+-----------------+--------------+-------------+------------+-------------+--------------+ -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0022-WIP-ARM-dts-add-support-for-BananaPi-M2S.patch ================================================ From 821819ff0d9185954b251d5fd197b5b67cdd08d3 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 18 Feb 2023 07:59:25 +0000 Subject: [PATCH 22/25] WIP: ARM: dts: add support for BananaPi M2S Import the device-tree from Linux 6.x Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm/dts/Makefile | 1 + .../arm/dts/meson-g12b-a311d-bananapi-m2s.dts | 14 + arch/arm/dts/meson-g12b-bananapi-u-boot.dtsi | 13 + arch/arm/dts/meson-g12b-bananapi.dtsi | 551 ++++++++++++++++++ .../arm/dts/meson-g12b-s922x-bananapi-m2s.dts | 14 + 5 files changed, 593 insertions(+) create mode 100644 arch/arm/dts/meson-g12b-a311d-bananapi-m2s.dts create mode 100644 arch/arm/dts/meson-g12b-bananapi-u-boot.dtsi create mode 100644 arch/arm/dts/meson-g12b-bananapi.dtsi create mode 100644 arch/arm/dts/meson-g12b-s922x-bananapi-m2s.dts diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index 4e9fa81e18..788fec93a3 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile @@ -196,6 +196,7 @@ dtb-$(CONFIG_ARCH_MESON) += \ meson-g12a-radxa-zero.dtb \ meson-g12a-sei510.dtb \ meson-g12a-u200.dtb \ + meson-g12b-a311d-bananapi-m2s.dtb \ meson-g12b-a311d-khadas-vim3.dtb \ meson-g12b-gtking.dtb \ meson-g12b-gtking-pro.dtb \ diff --git a/arch/arm/dts/meson-g12b-a311d-bananapi-m2s.dts b/arch/arm/dts/meson-g12b-a311d-bananapi-m2s.dts new file mode 100644 index 0000000000..f6c950919b --- /dev/null +++ b/arch/arm/dts/meson-g12b-a311d-bananapi-m2s.dts @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2023 Christian Hewitt <christianshewitt@gmail.com> + */ + +/dts-v1/; + +#include "meson-g12b-a311d.dtsi" +#include "meson-g12b-bananapi.dtsi" + +/ { + compatible = "bananapi,bpi-m2s", "amlogic,a311d", "amlogic,g12b"; + model = "BananaPi M2S"; +}; diff --git a/arch/arm/dts/meson-g12b-bananapi-u-boot.dtsi b/arch/arm/dts/meson-g12b-bananapi-u-boot.dtsi new file mode 100644 index 0000000000..a92f9e9ff1 --- /dev/null +++ b/arch/arm/dts/meson-g12b-bananapi-u-boot.dtsi @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2019 BayLibre, SAS. + * Author: Neil Armstrong <narmstrong@baylibre.com> + */ + +#include "meson-g12-common-u-boot.dtsi" + +/* SARADC is needed for proper board variant detection */ +&saradc { + status = "okay"; + vref-supply = <&vddao_1v8>; +}; diff --git a/arch/arm/dts/meson-g12b-bananapi.dtsi b/arch/arm/dts/meson-g12b-bananapi.dtsi new file mode 100644 index 0000000000..3a9f36ad4e --- /dev/null +++ b/arch/arm/dts/meson-g12b-bananapi.dtsi @@ -0,0 +1,551 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2023 Christian Hewitt <christianshewitt@gmail.com> + */ + +#include <dt-bindings/input/input.h> +#include <dt-bindings/leds/common.h> +#include <dt-bindings/gpio/meson-g12a-gpio.h> +#include <dt-bindings/sound/meson-g12a-tohdmitx.h> + +/ { + aliases { + serial0 = &uart_AO; + serial2 = &uart_A; + ethernet0 = ðmac; + }; + + chosen { + stdout-path = "serial0:115200n8"; + }; + + memory@0 { + device_type = "memory"; + reg = <0x0 0x0 0x0 0x80000000>; + }; + + adc-keys { + compatible = "adc-keys"; + io-channels = <&saradc 2>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1800000>; + + button-function { + label = "RST"; + linux,code = <KEY_POWER>; + press-threshold-microvolt = <40000>; + }; + }; + + emmc_pwrseq: emmc-pwrseq { + compatible = "mmc-pwrseq-emmc"; + reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>; + }; + + fan0: pwm-fan { + compatible = "pwm-fan"; + #cooling-cells = <2>; + cooling-min-state = <0>; + cooling-max-state = <3>; + cooling-levels = <0 120 170 220>; + pwms = <&pwm_cd 1 40000 0>; + }; + + hdmi-connector { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_connector_in: endpoint { + remote-endpoint = <&hdmi_tx_tmds_out>; + }; + }; + }; + + leds { + compatible = "gpio-leds"; + + green { + color = <LED_COLOR_ID_GREEN>; + function = LED_FUNCTION_STATUS; + gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_LOW>; + }; + + blue { + color = <LED_COLOR_ID_BLUE>; + function = LED_FUNCTION_STATUS; + gpios = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_LOW>; + linux,default-trigger = "heartbeat"; + }; + }; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; + clocks = <&wifi32k>; + clock-names = "ext_clock"; + }; + + wifi32k: wifi32k { + compatible = "pwm-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */ + }; + + dc_in: regulator-dc_in { + compatible = "regulator-fixed"; + regulator-name = "DC_IN"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + regulator-always-on; + }; + + vcc_5v: regulator-vcc_5v { + compatible = "regulator-fixed"; + regulator-name = "VCC_5V"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&dc_in>; + + gpio = <&gpio GPIOH_8 GPIO_OPEN_DRAIN>; + enable-active-high; + }; + + vcc_3v3: regulator-vcc_3v3 { + compatible = "regulator-fixed"; + regulator-name = "VCC_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vsys_3v3>; + regulator-always-on; + }; + + vcc_1v8: regulator-vcc_1v8 { + compatible = "regulator-fixed"; + regulator-name = "VCC_1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc_3v3>; + regulator-always-on; + }; + + vddao_1v8: regulator-vddao_1v8 { + compatible = "regulator-fixed"; + regulator-name = "VDDIO_AO1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vsys_3v3>; + regulator-always-on; + }; + + vddcpu_a: regulator-vddcpu-a { + compatible = "pwm-regulator"; + regulator-name = "VDDCPU_A"; + regulator-min-microvolt = <690000>; + regulator-max-microvolt = <1050000>; + pwm-supply = <&dc_in>; + pwms = <&pwm_ab 0 1250 0>; + pwm-dutycycle-range = <100 0>; + regulator-boot-on; + regulator-always-on; + }; + + vddcpu_b: regulator-vddcpu-b { + compatible = "pwm-regulator"; + regulator-name = "VDDCPU_B"; + regulator-min-microvolt = <690000>; + regulator-max-microvolt = <1050000>; + pwm-supply = <&vsys_3v3>; + pwms = <&pwm_AO_cd 1 1250 0>; + pwm-dutycycle-range = <100 0>; + regulator-boot-on; + regulator-always-on; + }; + + vsys_3v3: regulator-vsys_3v3 { + compatible = "regulator-fixed"; + regulator-name = "VSYS_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&dc_in>; + regulator-always-on; + }; + + emmc_1v8: regulator-emmc_1v8 { + compatible = "regulator-fixed"; + regulator-name = "EMMC_AO1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc_3v3>; + regulator-always-on; + }; + + usb_pwr: regulator-usb_pwr { + compatible = "regulator-fixed"; + regulator-name = "USB_PWR"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&vcc_5v>; + + gpio = <&gpio GPIOA_6 GPIO_ACTIVE_HIGH>; + enable-active-high; + }; + + sound { + compatible = "amlogic,axg-sound-card"; + model = "BPI-M2S"; + audio-aux-devs = <&tdmin_a>, <&tdmout_a>; + audio-routing = "TDMOUT_A IN 0", "FRDDR_A OUT 0", + "TDMOUT_A IN 1", "FRDDR_B OUT 0", + "TDMOUT_A IN 2", "FRDDR_C OUT 0", + "TDM_A Playback", "TDMOUT_A OUT", + "TDMIN_A IN 0", "TDM_A Capture", + "TDMIN_A IN 3", "TDM_A Loopback", + "TODDR_A IN 0", "TDMIN_A OUT", + "TODDR_B IN 0", "TDMIN_A OUT", + "TODDR_C IN 0", "TDMIN_A OUT"; + + assigned-clocks = <&clkc CLKID_MPLL2>, + <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + + dai-link-0 { + sound-dai = <&frddr_a>; + }; + + dai-link-1 { + sound-dai = <&frddr_b>; + }; + + dai-link-2 { + sound-dai = <&frddr_c>; + }; + + dai-link-3 { + sound-dai = <&toddr_a>; + }; + + dai-link-4 { + sound-dai = <&toddr_b>; + }; + + dai-link-5 { + sound-dai = <&toddr_c>; + }; + + /* 8ch hdmi interface */ + dai-link-6 { + sound-dai = <&tdmif_a>; + dai-format = "i2s"; + dai-tdm-slot-tx-mask-0 = <1 1>; + dai-tdm-slot-tx-mask-1 = <1 1>; + dai-tdm-slot-tx-mask-2 = <1 1>; + dai-tdm-slot-tx-mask-3 = <1 1>; + mclk-fs = <256>; + + codec { + sound-dai = <&tohdmitx TOHDMITX_I2S_IN_A>; + }; + }; + + /* hdmi glue */ + dai-link-7 { + sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>; + + codec { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&arb { + status = "okay"; +}; + +&clkc_audio { + status = "okay"; +}; + +&cec_AO { + pinctrl-0 = <&cec_ao_a_h_pins>; + pinctrl-names = "default"; + status = "disabled"; + hdmi-phandle = <&hdmi_tx>; +}; + +&cecb_AO { + pinctrl-0 = <&cec_ao_b_h_pins>; + pinctrl-names = "default"; + status = "okay"; + hdmi-phandle = <&hdmi_tx>; +}; + +&cpu0 { + cpu-supply = <&vddcpu_b>; + operating-points-v2 = <&cpu_opp_table_0>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu1 { + cpu-supply = <&vddcpu_b>; + operating-points-v2 = <&cpu_opp_table_0>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu100 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu101 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu102 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu103 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +ðmac { + pinctrl-0 = <ð_pins>, <ð_rgmii_pins>; + pinctrl-names = "default"; + status = "okay"; + phy-mode = "rgmii"; + phy-handle = <&external_phy>; + amlogic,tx-delay-ns = <2>; +}; + +&ext_mdio { + external_phy: ethernet-phy@0 { + /* Realtek RTL8211F (0x001cc916) */ + reg = <0>; + max-speed = <1000>; + + reset-assert-us = <10000>; + reset-deassert-us = <80000>; + reset-gpios = <&gpio GPIOZ_15 (GPIO_ACTIVE_LOW | GPIO_OPEN_DRAIN)>; + + interrupt-parent = <&gpio_intc>; + /* MAC_INTR on GPIOZ_14 */ + interrupts = <26 IRQ_TYPE_LEVEL_LOW>; + }; +}; + +&frddr_a { + status = "okay"; +}; + +&frddr_b { + status = "okay"; +}; + +&frddr_c { + status = "okay"; +}; + +&hdmi_tx { + status = "okay"; + pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>; + pinctrl-names = "default"; + hdmi-supply = <&vcc_5v>; +}; + +&hdmi_tx_tmds_port { + hdmi_tx_tmds_out: endpoint { + remote-endpoint = <&hdmi_connector_in>; + }; +}; + +&pcie { + status = "okay"; + reset-gpios = <&gpio GPIOA_8 GPIO_ACTIVE_LOW>; +}; + +&pwm_ab { + status = "okay"; + pinctrl-0 = <&pwm_a_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin0"; +}; + +&pwm_cd { + status = "okay"; + pinctrl-0 = <&pwm_d_x6_pins>; + pinctrl-names = "default"; + pwm-gpios = <&gpio GPIOAO_10 GPIO_ACTIVE_HIGH>; +}; + +&pwm_ef { + status = "okay"; + pinctrl-0 = <&pwm_e_pins>; + pinctrl-names = "default"; +}; + +&pwm_AO_cd { + pinctrl-0 = <&pwm_ao_d_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin1"; + status = "okay"; +}; + +&saradc { + status = "okay"; + vref-supply = <&vddao_1v8>; +}; + +/* SDIO */ +&sd_emmc_a { + status = "okay"; + pinctrl-0 = <&sdio_pins>; + pinctrl-1 = <&sdio_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + #address-cells = <1>; + #size-cells = <0>; + + bus-width = <4>; + sd-uhs-sdr104; + max-frequency = <50000000>; + + non-removable; + disable-wp; + + /* WiFi firmware requires power to be kept while in suspend */ + keep-power-in-suspend; + + mmc-pwrseq = <&sdio_pwrseq>; + + vmmc-supply = <&vsys_3v3>; + vqmmc-supply = <&vddao_1v8>; + + rtl8822cs: wifi@1 { + reg = <1>; + }; +}; + +/* SD card */ +&sd_emmc_b { + status = "okay"; + pinctrl-0 = <&sdcard_c_pins>; + pinctrl-1 = <&sdcard_clk_gate_c_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <4>; + cap-sd-highspeed; + max-frequency = <50000000>; + disable-wp; + + cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>; + vmmc-supply = <&vsys_3v3>; + vqmmc-supply = <&vsys_3v3>; +}; + +/* eMMC */ +&sd_emmc_c { + status = "okay"; + pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>; + pinctrl-1 = <&emmc_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <8>; + cap-mmc-highspeed; + mmc-ddr-1_8v; + mmc-hs200-1_8v; + max-frequency = <200000000>; + disable-wp; + + mmc-pwrseq = <&emmc_pwrseq>; + vmmc-supply = <&vcc_3v3>; + vqmmc-supply = <&emmc_1v8>; +}; + +&tdmif_a { + status = "okay"; +}; + +&tdmin_a { + status = "okay"; +}; + +&tdmout_a { + status = "okay"; +}; + +&toddr_a { + status = "okay"; +}; + +&toddr_b { + status = "okay"; +}; + +&toddr_c { + status = "okay"; +}; + +&tohdmitx { + status = "okay"; +}; + +&uart_A { + status = "disabled"; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "realtek,rtl8822cs-bt"; + enable-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + host-wake-gpios = <&gpio GPIOX_19 GPIO_ACTIVE_HIGH>; + device-wake-gpios = <&gpio GPIOX_18 GPIO_ACTIVE_HIGH>; + max-speed = <2000000>; + }; +}; + +&uart_AO { + status = "okay"; + pinctrl-0 = <&uart_ao_a_pins>; + pinctrl-names = "default"; +}; + +&usb2_phy0 { + phy-supply = <&dc_in>; +}; + +&usb2_phy1 { + phy-supply = <&usb_pwr>; +}; + +&usb3_pcie_phy { + phy-supply = <&usb_pwr>; +}; + +&usb { + status = "okay"; + dr_mode = "peripheral"; + phys = <&usb2_phy0>, <&usb2_phy1>; + phy-names = "usb2-phy0", "usb2-phy1"; +}; diff --git a/arch/arm/dts/meson-g12b-s922x-bananapi-m2s.dts b/arch/arm/dts/meson-g12b-s922x-bananapi-m2s.dts new file mode 100644 index 0000000000..7f66f263a2 --- /dev/null +++ b/arch/arm/dts/meson-g12b-s922x-bananapi-m2s.dts @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2023 Christian Hewitt <christianshewitt@gmail.com> + */ + +/dts-v1/; + +#include "meson-g12b-s922x.dtsi" +#include "meson-g12b-bananapi.dtsi" + +/ { + compatible = "bananapi,bpi-m2s", "amlogic,s922x", "amlogic,g12b"; + model = "BananaPi M2S"; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0023-WIP-boards-add-BananaPi-CM4IO-defconfig.patch ================================================ From 27b889069d184c4b6678d8dc46eef0788e385823 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 4 Mar 2023 07:33:24 +0000 Subject: [PATCH 23/25] WIP: boards: add BananaPi CM4IO defconfig Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- configs/bananapi-cm4io_defconfig | 82 ++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 configs/bananapi-cm4io_defconfig diff --git a/configs/bananapi-cm4io_defconfig b/configs/bananapi-cm4io_defconfig new file mode 100644 index 0000000000..22442a9351 --- /dev/null +++ b/configs/bananapi-cm4io_defconfig @@ -0,0 +1,82 @@ +CONFIG_ARM=y +CONFIG_ARCH_MESON=y +CONFIG_SYS_TEXT_BASE=0x01000000 +CONFIG_NR_DRAM_BANKS=1 +CONFIG_ENV_SIZE=0x2000 +CONFIG_DM_GPIO=y +CONFIG_DEFAULT_DEVICE_TREE="meson-g12b-bananapi-cm4-cm4io" +CONFIG_MESON_G12A=y +CONFIG_DEBUG_UART_BASE=0xff803000 +CONFIG_DEBUG_UART_CLOCK=24000000 +CONFIG_IDENT_STRING=" bpi-cm4io" +CONFIG_SYS_LOAD_ADDR=0x1000000 +CONFIG_DEBUG_UART=y +CONFIG_AHCI=y +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20000000 +CONFIG_REMAKE_ELF=y +CONFIG_OF_BOARD_SETUP=y +# CONFIG_DISPLAY_CPUINFO is not set +CONFIG_MISC_INIT_R=y +CONFIG_SYS_MAXARGS=32 +# CONFIG_CMD_BDI is not set +# CONFIG_CMD_IMI is not set +CONFIG_CMD_GPIO=y +# CONFIG_CMD_LOADS is not set +CONFIG_CMD_MMC=y +CONFIG_CMD_PCI=y +CONFIG_CMD_USB=y +CONFIG_CMD_USB_MASS_STORAGE=y +# CONFIG_CMD_SETEXPR is not set +CONFIG_CMD_REGULATOR=y +CONFIG_OF_CONTROL=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_ADC=y +CONFIG_SARADC_MESON=y +CONFIG_AHCI_PCI=y +CONFIG_MMC_MESON_GX=y +CONFIG_PHY_REALTEK=y +CONFIG_DM_MDIO=y +CONFIG_DM_MDIO_MUX=y +CONFIG_ETH_DESIGNWARE_MESON8B=y +CONFIG_MDIO_MUX_MESON_G12A=y +CONFIG_PCI=y +CONFIG_PCIE_DW_MESON=y +CONFIG_MESON_G12A_USB_PHY=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_MESON_G12A=y +CONFIG_POWER_DOMAIN=y +CONFIG_MESON_EE_POWER_DOMAIN=y +CONFIG_DM_REGULATOR=y +CONFIG_DM_REGULATOR_FIXED=y +CONFIG_DM_REGULATOR_GPIO=y +CONFIG_DM_RESET=y +CONFIG_DEBUG_UART_ANNOUNCE=y +CONFIG_DEBUG_UART_SKIP_INIT=y +CONFIG_MESON_SERIAL=y +CONFIG_USB=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_DWC3=y +CONFIG_USB_DWC3=y +# CONFIG_USB_DWC3_GADGET is not set +CONFIG_USB_DWC3_MESON_G12A=y +CONFIG_USB_KEYBOARD=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_VENDOR_NUM=0x1b8e +CONFIG_USB_GADGET_PRODUCT_NUM=0xfada +CONFIG_USB_GADGET_DWC2_OTG=y +CONFIG_USB_GADGET_DWC2_OTG_PHY_BUS_WIDTH_8=y +CONFIG_USB_GADGET_DOWNLOAD=y +CONFIG_DM_VIDEO=y +# CONFIG_VIDEO_BPP8 is not set +# CONFIG_VIDEO_BPP16 is not set +CONFIG_SYS_WHITE_ON_BLACK=y +CONFIG_VIDEO_MESON=y +CONFIG_VIDEO_DT_SIMPLEFB=y +CONFIG_SPLASH_SCREEN=y +CONFIG_SPLASH_SCREEN_ALIGN=y +CONFIG_VIDEO_BMP_RLE8=y +CONFIG_BMP_16BPP=y +CONFIG_BMP_24BPP=y +CONFIG_BMP_32BPP=y +CONFIG_OF_LIBFDT_OVERLAY=y -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0024-WIP-docs-boards-amlogic-update-for-BananaPi-CM4IO.patch ================================================ From 80343fe9cb591f3448de8fdf2e33c60bb37af68f Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 4 Mar 2023 07:35:49 +0000 Subject: [PATCH 24/25] WIP: docs: boards: amlogic: update for BananaPi CM4IO Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- board/amlogic/w400/MAINTAINERS | 2 ++ doc/board/amlogic/index.rst | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/board/amlogic/w400/MAINTAINERS b/board/amlogic/w400/MAINTAINERS index d4b4d4f91d..7d9bea8454 100644 --- a/board/amlogic/w400/MAINTAINERS +++ b/board/amlogic/w400/MAINTAINERS @@ -3,8 +3,10 @@ M: Neil Armstrong <neil.armstrong@linaro.org> S: Maintained L: u-boot-amlogic@groups.io F: board/amlogic/w400/ +F: configs/bananapi-cm4io_defconfig F: configs/bananapi-m2s_defconfig F: configs/radxa-zero2_defconfig F: doc/board/amlogic/w400.rst +F: doc/board/amlogic/bananapi-cm4io.rst F: doc/board/amlogic/bananapi-m2s.rst F: doc/board/amlogic/radxa-zero2.rst diff --git a/doc/board/amlogic/index.rst b/doc/board/amlogic/index.rst index fd8d4185f8..f15c86b9ff 100644 --- a/doc/board/amlogic/index.rst +++ b/doc/board/amlogic/index.rst @@ -20,7 +20,8 @@ This matrix concerns the actual source code version. | | P200 | LibreTech-CC v1 | Libretech-PC | | Radxa Zero | GT-King/Pro | Odroid-C4 | | | P201 | LibreTech-AC v2 | WeTek Core2 | | | GSKing-X | Odroid-HC4 | | | | JetHub J80 | | | | Radxa Zero2 | BPi-M2-Pro | -| | | | | | | BPI-M2S | BPi-M5 | +| | | | | | | BPI-CM4IO | BPi-M5 | +| | | | | | | BPI-M2S | | +-------------------------------+-----------+-----------------+--------------+-------------+------------+-------------+--------------+ | UART | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | +-------------------------------+-----------+-----------------+--------------+-------------+------------+-------------+--------------+ -- 2.34.1 ================================================ FILE: projects/Amlogic/patches/u-boot/u-boot-0025-WIP-ARM-dts-add-support-for-BananaPi-CM4IO.patch ================================================ From dd543d9ffb5b860ad4e4e733b596236e2ed0ad7f Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sat, 4 Mar 2023 07:39:41 +0000 Subject: [PATCH 25/25] WIP: ARM: dts: add support for BananaPi CM4IO Import the device-tree from Linux 6.x Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm/dts/Makefile | 1 + .../meson-g12b-bananapi-cm4-cm4io-u-boot.dtsi | 7 + .../arm/dts/meson-g12b-bananapi-cm4-cm4io.dts | 165 ++++++++ arch/arm/dts/meson-g12b-bananapi-cm4.dtsi | 388 ++++++++++++++++++ 4 files changed, 561 insertions(+) create mode 100644 arch/arm/dts/meson-g12b-bananapi-cm4-cm4io-u-boot.dtsi create mode 100644 arch/arm/dts/meson-g12b-bananapi-cm4-cm4io.dts create mode 100644 arch/arm/dts/meson-g12b-bananapi-cm4.dtsi diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index 788fec93a3..9348093806 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile @@ -198,6 +198,7 @@ dtb-$(CONFIG_ARCH_MESON) += \ meson-g12a-u200.dtb \ meson-g12b-a311d-bananapi-m2s.dtb \ meson-g12b-a311d-khadas-vim3.dtb \ + meson-g12b-bananapi-cm4-cm4io.dtb \ meson-g12b-gtking.dtb \ meson-g12b-gtking-pro.dtb \ meson-g12b-gsking-x.dtb \ diff --git a/arch/arm/dts/meson-g12b-bananapi-cm4-cm4io-u-boot.dtsi b/arch/arm/dts/meson-g12b-bananapi-cm4-cm4io-u-boot.dtsi new file mode 100644 index 0000000000..236f2468dc --- /dev/null +++ b/arch/arm/dts/meson-g12b-bananapi-cm4-cm4io-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2019 BayLibre, SAS. + * Author: Neil Armstrong <narmstrong@baylibre.com> + */ + +#include "meson-g12-common-u-boot.dtsi" diff --git a/arch/arm/dts/meson-g12b-bananapi-cm4-cm4io.dts b/arch/arm/dts/meson-g12b-bananapi-cm4-cm4io.dts new file mode 100644 index 0000000000..2c4a5b3f1b --- /dev/null +++ b/arch/arm/dts/meson-g12b-bananapi-cm4-cm4io.dts @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2023 Neil Armstrong <neil.armstrong@linaro.org> + */ + +/dts-v1/; + +#include "meson-g12b-bananapi-cm4.dtsi" +#include <dt-bindings/input/input.h> +#include <dt-bindings/leds/common.h> +#include <dt-bindings/sound/meson-g12a-tohdmitx.h> + +/ { + compatible = "bananapi,bpi-cm4io", "bananapi,bpi-cm4", "amlogic,a311d", "amlogic,g12b"; + model = "BananaPi BPI-CM4IO Baseboard with BPI-CM4 Module"; + + aliases { + ethernet0 = ðmac; + i2c0 = &i2c1; + i2c1 = &i2c3; + }; + + adc-keys { + compatible = "adc-keys"; + io-channels = <&saradc 2>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1710000>; + + button-function { + label = "Function"; + linux,code = <KEY_FN>; + press-threshold-microvolt = <10000>; + }; + }; + + hdmi_connector: hdmi-connector { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_connector_in: endpoint { + remote-endpoint = <&hdmi_tx_tmds_out>; + }; + }; + }; + + leds { + compatible = "gpio-leds"; + + led-blue { + color = <LED_COLOR_ID_BLUE>; + function = LED_FUNCTION_STATUS; + gpios = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "heartbeat"; + }; + + led-green { + color = <LED_COLOR_ID_GREEN>; + function = LED_FUNCTION_STATUS; + gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; + }; + }; + + sound { + compatible = "amlogic,axg-sound-card"; + model = "BPI-CM4IO"; + audio-aux-devs = <&tdmout_b>; + audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 0", + "TDMOUT_B IN 1", "FRDDR_B OUT 0", + "TDMOUT_B IN 2", "FRDDR_C OUT 0", + "TDM_B Playback", "TDMOUT_B OUT"; + + assigned-clocks = <&clkc CLKID_MPLL2>, + <&clkc CLKID_MPLL0>, + <&clkc CLKID_MPLL1>; + assigned-clock-parents = <0>, <0>, <0>; + assigned-clock-rates = <294912000>, + <270950400>, + <393216000>; + + dai-link-0 { + sound-dai = <&frddr_a>; + }; + + dai-link-1 { + sound-dai = <&frddr_b>; + }; + + dai-link-2 { + sound-dai = <&frddr_c>; + }; + + /* 8ch hdmi interface */ + dai-link-3 { + sound-dai = <&tdmif_b>; + dai-format = "i2s"; + dai-tdm-slot-tx-mask-0 = <1 1>; + dai-tdm-slot-tx-mask-1 = <1 1>; + dai-tdm-slot-tx-mask-2 = <1 1>; + dai-tdm-slot-tx-mask-3 = <1 1>; + mclk-fs = <256>; + + codec { + sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>; + }; + }; + + /* hdmi glue */ + dai-link-4 { + sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>; + + codec { + sound-dai = <&hdmi_tx>; + }; + }; + }; +}; + +&cecb_AO { + status = "okay"; +}; + +ðmac { + status = "okay"; +}; + +&hdmi_tx { + status = "okay"; +}; + +&hdmi_tx_tmds_port { + hdmi_tx_tmds_out: endpoint { + remote-endpoint = <&hdmi_connector_in>; + }; +}; + +/* CSI port */ +&i2c1 { + status = "okay"; +}; + +/* DSI port for touchscreen */ +&i2c3 { + status = "okay"; +}; + +/* miniPCIe port with USB + SIM slot */ +&pcie { + status = "okay"; +}; + +&sd_emmc_b { + status = "okay"; +}; + +&tohdmitx { + status = "okay"; +}; + +/* Peripheral Only USB-C port */ +&usb { + dr_mode = "peripheral"; + + status = "okay"; +}; diff --git a/arch/arm/dts/meson-g12b-bananapi-cm4.dtsi b/arch/arm/dts/meson-g12b-bananapi-cm4.dtsi new file mode 100644 index 0000000000..dc0988c826 --- /dev/null +++ b/arch/arm/dts/meson-g12b-bananapi-cm4.dtsi @@ -0,0 +1,388 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2023 Neil Armstrong <neil.armstrong@linaro.org> + */ + +#include "meson-g12b-a311d.dtsi" +#include <dt-bindings/gpio/meson-g12a-gpio.h> + +/ { + aliases { + serial0 = &uart_AO; + rtc1 = &vrtc; + }; + + chosen { + stdout-path = "serial0:115200n8"; + }; + + emmc_pwrseq: emmc-pwrseq { + compatible = "mmc-pwrseq-emmc"; + reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>; + }; + + memory@0 { + device_type = "memory"; + reg = <0x0 0x0 0x0 0x40000000>; + }; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpio GPIOAO_6 GPIO_ACTIVE_LOW>; + clocks = <&wifi32k>; + clock-names = "ext_clock"; + }; + + emmc_1v8: regulator-emmc_1v8 { + compatible = "regulator-fixed"; + regulator-name = "EMMC_1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vddao_3v3>; + regulator-always-on; + }; + + dc_in: regulator-dc-in { + compatible = "regulator-fixed"; + regulator-name = "DC_IN"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + regulator-always-on; + }; + + vddio_c: regulator-vddio-c { + compatible = "regulator-gpio"; + regulator-name = "VDDIO_C"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; + + enable-gpio = <&gpio_ao GPIOAO_3 GPIO_OPEN_DRAIN>; + enable-active-high; + regulator-always-on; + + gpios = <&gpio_ao GPIOAO_9 GPIO_OPEN_DRAIN>; + gpios-states = <1>; + + states = <1800000 0>, + <3300000 1>; + }; + + vddao_1v8: regulator-vddao-1v8 { + compatible = "regulator-fixed"; + regulator-name = "VDDAO_1V8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vddao_3v3>; + regulator-always-on; + }; + + vddao_3v3: regulator-vddao-3v3 { + compatible = "regulator-fixed"; + regulator-name = "VDDAO_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&dc_in>; + regulator-always-on; + }; + + vddcpu_a: regulator-vddcpu-a { + /* + * MP8756GD DC/DC Regulator. + */ + compatible = "pwm-regulator"; + + regulator-name = "VDDCPU_A"; + regulator-min-microvolt = <680000>; + regulator-max-microvolt = <1040000>; + + pwm-supply = <&dc_in>; + + pwms = <&pwm_ab 0 1250 0>; + pwm-dutycycle-range = <100 0>; + + regulator-boot-on; + regulator-always-on; + }; + + vddcpu_b: regulator-vddcpu-b { + /* + * SY8120B1ABC DC/DC Regulator. + */ + compatible = "pwm-regulator"; + + regulator-name = "VDDCPU_B"; + regulator-min-microvolt = <680000>; + regulator-max-microvolt = <1040000>; + + pwm-supply = <&dc_in>; + + pwms = <&pwm_AO_cd 1 1250 0>; + pwm-dutycycle-range = <100 0>; + + regulator-boot-on; + regulator-always-on; + }; + + wifi32k: wifi32k { + compatible = "pwm-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */ + }; +}; + +&arb { + status = "okay"; +}; + +&clkc_audio { + status = "okay"; +}; + +&cec_AO { + pinctrl-0 = <&cec_ao_a_h_pins>; + pinctrl-names = "default"; + hdmi-phandle = <&hdmi_tx>; +}; + +&cecb_AO { + pinctrl-0 = <&cec_ao_b_h_pins>; + pinctrl-names = "default"; + hdmi-phandle = <&hdmi_tx>; +}; + +&cpu0 { + cpu-supply = <&vddcpu_b>; + operating-points-v2 = <&cpu_opp_table_0>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu1 { + cpu-supply = <&vddcpu_b>; + operating-points-v2 = <&cpu_opp_table_0>; + clocks = <&clkc CLKID_CPU_CLK>; + clock-latency = <50000>; +}; + +&cpu100 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu101 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu102 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&cpu103 { + cpu-supply = <&vddcpu_a>; + operating-points-v2 = <&cpub_opp_table_1>; + clocks = <&clkc CLKID_CPUB_CLK>; + clock-latency = <50000>; +}; + +&ext_mdio { + external_phy: ethernet-phy@0 { + /* Realtek RTL8211F (0x001cc916) */ + reg = <0>; + max-speed = <1000>; + + interrupt-parent = <&gpio_intc>; + /* MAC_INTR on GPIOZ_14 */ + interrupts = <26 IRQ_TYPE_LEVEL_LOW>; + }; +}; + +/* Ethernet to be enabled in baseboard DT */ +ðmac { + pinctrl-0 = <ð_pins>, <ð_rgmii_pins>; + pinctrl-names = "default"; + phy-mode = "rgmii-txid"; + phy-handle = <&external_phy>; +}; + +&frddr_a { + status = "okay"; +}; + +&frddr_b { + status = "okay"; +}; + +&frddr_c { + status = "okay"; +}; + +/* HDMI to be enabled in baseboard DT */ +&hdmi_tx { + pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>; + pinctrl-names = "default"; + hdmi-supply = <&dc_in>; +}; + +/* "Camera" I2C bus */ +&i2c1 { + pinctrl-0 = <&i2c1_sda_h6_pins>, <&i2c1_sck_h7_pins>; + pinctrl-names = "default"; +}; + +/* Main I2C bus */ +&i2c2 { + pinctrl-0 = <&i2c2_sda_x_pins>, <&i2c2_sck_x_pins>; + pinctrl-names = "default"; +}; + +/* "ID" I2C bus */ +&i2c3 { + pinctrl-0 = <&i2c3_sda_a_pins>, <&i2c3_sck_a_pins>; + pinctrl-names = "default"; +}; + +&pcie { + reset-gpios = <&gpio GPIOA_8 GPIO_ACTIVE_LOW>; +}; + +&pwm_ab { + pinctrl-0 = <&pwm_a_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin0"; + + status = "okay"; +}; + +&pwm_ef { + pinctrl-0 = <&pwm_e_pins>; + pinctrl-names = "default"; + + status = "okay"; +}; + +&pwm_AO_cd { + pinctrl-0 = <&pwm_ao_d_e_pins>; + pinctrl-names = "default"; + clocks = <&xtal>; + clock-names = "clkin1"; + + status = "okay"; +}; + +&saradc { + vref-supply = <&vddao_1v8>; + + status = "okay"; +}; + +/* on-module SDIO WiFi */ +&sd_emmc_a { + pinctrl-0 = <&sdio_pins>; + pinctrl-1 = <&sdio_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + #address-cells = <1>; + #size-cells = <0>; + + bus-width = <4>; + sd-uhs-sdr104; + max-frequency = <50000000>; + + non-removable; + disable-wp; + + /* WiFi firmware requires power in suspend */ + keep-power-in-suspend; + + mmc-pwrseq = <&sdio_pwrseq>; + + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vddao_3v3>; + + status = "okay"; + + rtl8822cs: wifi@1 { + reg = <1>; + }; +}; + +/* SD card to be enabled in baseboard DT */ +&sd_emmc_b { + pinctrl-0 = <&sdcard_c_pins>; + pinctrl-1 = <&sdcard_clk_gate_c_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <4>; + cap-sd-highspeed; + max-frequency = <50000000>; + disable-wp; + + cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>; + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vddio_c>; +}; + +/* on-module eMMC */ +&sd_emmc_c { + pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>; + pinctrl-1 = <&emmc_clk_gate_pins>; + pinctrl-names = "default", "clk-gate"; + + bus-width = <8>; + cap-mmc-highspeed; + mmc-ddr-1_8v; + mmc-hs200-1_8v; + max-frequency = <200000000>; + disable-wp; + + mmc-pwrseq = <&emmc_pwrseq>; + vmmc-supply = <&vddao_3v3>; + vqmmc-supply = <&vddao_1v8>; + + status = "okay"; +}; + +&tdmif_b { + status = "okay"; +}; + +&tdmout_b { + status = "okay"; +}; + +/* on-module UART BT */ +&uart_A { + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; + pinctrl-names = "default"; + uart-has-rtscts; + + status = "okay"; + + bluetooth { + compatible = "realtek,rtl8822cs-bt"; + enable-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + host-wake-gpios = <&gpio GPIOX_19 GPIO_ACTIVE_HIGH>; + device-wake-gpios = <&gpio GPIOX_18 GPIO_ACTIVE_HIGH>; + }; +}; + +&uart_AO { + pinctrl-0 = <&uart_ao_a_pins>; + pinctrl-names = "default"; + + status = "okay"; +}; + +&usb { + phys = <&usb2_phy0>, <&usb2_phy1>; + phy-names = "usb2-phy0", "usb2-phy1"; +}; -- 2.34.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/LaFrite_boot.ini ================================================ LIBRETECH-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootlabel "EmuELEC" setenv rootopt "BOOT_IMAGE=kernel.img boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv uenv_addr 0x13000000 #showlogo 1080p60hz 1920 1080 boot-logo-1080.bmp.gz fatload ${device} ${mmc_dev}:1 ${loadaddr} kernel.img fatload ${device} ${mmc_dev}:1 ${dtb_mem_addr} dtb.img if fatload ${device} ${mmc_dev}:1 ${uenv_addr} resolution.ini; then env import -t ${uenv_addr} $filesize; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if fatload ${device} ${mmc_dev}:1 ${uenv_addr} config.ini; then env import -t ${uenv_addr} $filesize; fi if test "${keymap}" != ""; then setenv consoleopt "${consoleopt} keymap=${keymap}"; fi setenv displayopt "vout=${vout},en logo=osd0,loaded,0x3dc00000 frac_rate_policy=${frac_rate_policy} native_4k_gui=0 hdr_policy=1 consoleblank=0" setenv bootargs "${consoleopt} ${rootopt} ${displayopt} ${coreelec}" # Device tree modifications bootm start bootm loados bootm fdt bootm prep # Boot the board bootm go ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/LePotato_boot.ini ================================================ LIBRETECH-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootlabel "EmuELEC" setenv rootopt "BOOT_IMAGE=kernel.img boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv emmc_timeout "0" setenv uenv_addr 0x13000000 #showlogo 1080p60hz 1920 1080 boot-logo-1080.bmp.gz fatload ${device} ${mmc_dev}:1 ${loadaddr} kernel.img fatload ${device} ${mmc_dev}:1 ${dtb_mem_addr} dtb.img if fatload ${device} ${mmc_dev}:1 ${uenv_addr} resolution.ini; then env import -t ${uenv_addr} $filesize; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if fatload ${device} ${mmc_dev}:1 ${uenv_addr} config.ini; then env import -t ${uenv_addr} $filesize; fi if test "${emmc_timeout}" = "1"; then showlogo 1080p60hz 1920 1080 timeout-logo-1080.bmp.gz; sleep 30; mmc dev 1; mmc dev 0; fi if test "${keymap}" != ""; then setenv consoleopt "${consoleopt} keymap=${keymap}"; fi setenv displayopt "vout=${vout},en logo=osd0,loaded,0x3dc00000 frac_rate_policy=${frac_rate_policy} native_4k_gui=0 hdr_policy=1 consoleblank=0" setenv bootargs "${consoleopt} ${rootopt} ${displayopt} ${coreelec}" # Device tree modifications bootm start bootm loados bootm fdt bootm prep # Boot the board bootm go ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/Odroid_C4_boot.ini ================================================ ODROIDC4-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootlabel "EmuELEC" setenv remotewakeup "0x23dc4db2" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv native_4k_gui "0" setenv rootopt "BOOT_IMAGE=kernel.img boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" setenv dtb_mem_addr 0x1000000 setenv uenv_addr 0x13000000 if load mmc ${mmc_dev}:1 ${uenv_addr} resolution.ini; then env import -t ${uenv_addr} $filesize; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if load mmc ${mmc_dev}:1 ${uenv_addr} config.ini; then env import -t ${uenv_addr} $filesize; fi if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi setenv irsetup "remotewakeup=${remotewakeup} decode_type=${decode_type} remotewakeupmask=${remotewakeupmask}" if test "${usbopts}" != ""; then setenv usbopts "usbopts=${usbopts}"; fi if test "${usbpower}" != ""; then setenv usbpower "enable_system_power=${usbpower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a55}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a55}"; fi if test "${modeline}" != ""; then setenv cmode "modeline=${modeline}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi if test "${keymap}" != ""; then setenv consoleopt "${consoleopt} keymap=${keymap}"; fi setenv displayopt "vout=${vout},en logo=osd0,loaded,0x3d800000 frac_rate_policy=${frac_rate_policy} native_4k_gui=${native_4k_gui} hdr_policy=1" setenv initargs "${rootopt} ${consoleopt} ${max_freq_a53} ${max_freq_a73} ${wol} ${cec} ${irsetup} ${usbpower} ${gpiopower} ${usbopts} ${cmode}" setenv bootargs "${initargs} ${displayopt} ${coreelec}" load mmc ${mmc_dev}:1 ${loadaddr} kernel.img load mmc ${mmc_dev}:1 ${dtb_mem_addr} dtb.img bootm start booti ${loadaddr} - ${dtb_mem_addr} bootm ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/Odroid_HC4_boot.ini ================================================ ODROIDC4-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootlabel "EmuELEC" setenv remotewakeup "0x23dc4db2" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv heartbeat "1" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv native_4k_gui "0" setenv rootopt "BOOT_IMAGE=kernel.img boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" setenv dtb_mem_addr 0x1000000 setenv uenv_addr 0x13000000 if load mmc ${mmc_dev}:1 ${uenv_addr} resolution.ini; then env import -t ${uenv_addr} $filesize; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if load mmc ${mmc_dev}:1 ${uenv_addr} config.ini; then env import -t ${uenv_addr} $filesize; fi if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi setenv irsetup "remotewakeup=${remotewakeup} decode_type=${decode_type} remotewakeupmask=${remotewakeupmask}" if test "${usbopts}" != ""; then setenv usbopts "usbopts=${usbopts}"; fi if test "${usbpower}" != ""; then setenv usbpower "enable_system_power=${usbpower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a55}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a55}"; fi if test "${modeline}" != ""; then setenv cmode "modeline=${modeline}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi if test "${keymap}" != ""; then setenv consoleopt "${consoleopt} keymap=${keymap}"; fi setenv displayopt "vout=${vout},en logo=osd0,loaded,0x3d800000 frac_rate_policy=${frac_rate_policy} native_4k_gui=${native_4k_gui} hdr_policy=1" setenv initargs "${rootopt} ${consoleopt} ${max_freq_a53} ${max_freq_a73} ${wol} ${cec} ${irsetup} ${usbpower} ${gpiopower} ${usbopts} ${cmode}" setenv bootargs "${initargs} ${displayopt} ${coreelec}" load mmc ${mmc_dev}:1 ${loadaddr} kernel.img load mmc ${mmc_dev}:1 ${dtb_mem_addr} dtb.img bootm start if test "${heartbeat}" = "0"; then fdt set /leds/blueled linux,default-trigger "none"; fi booti ${loadaddr} - ${dtb_mem_addr} bootm ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/Odroid_N2L_boot.ini ================================================ ODROIDN2-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootlabel "EmuELEC" setenv remotewakeup "0x23dc4db2" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv native_4k_gui "0" setenv rootopt "BOOT_IMAGE=kernel.img boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" setenv dtb_mem_addr 0x1000000 setenv uenv_addr 0x13000000 if load mmc ${mmc_dev}:1 ${uenv_addr} resolution.ini; then env import -t ${uenv_addr} $filesize; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if load mmc ${mmc_dev}:1 ${uenv_addr} config.ini; then env import -t ${uenv_addr} $filesize; fi if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi setenv irsetup "remotewakeup=${remotewakeup} decode_type=${decode_type} remotewakeupmask=${remotewakeupmask}" if test "${usbopts}" != ""; then setenv usbopts "usbopts=${usbopts}"; fi if test "${usbpower}" != ""; then setenv usbpower "enable_system_power=${usbpower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a73}" != ""; then setenv max_freq_a73 "max_freq_a73=${max_freq_a73}"; fi if test "${modeline}" != ""; then setenv cmode "modeline=${modeline}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi if test "${keymap}" != ""; then setenv consoleopt "${consoleopt} keymap=${keymap}"; fi setenv displayopt "vout=${vout},en logo=osd0,loaded,0x3d800000 frac_rate_policy=${frac_rate_policy} native_4k_gui=${native_4k_gui} hdr_policy=1" setenv initargs "${rootopt} ${consoleopt} ${max_freq_a53} ${max_freq_a73} ${wol} ${cec} ${irsetup} ${usbpower} ${gpiopower} ${usbopts} ${cmode}" setenv bootargs "${initargs} ${displayopt} ${coreelec}" load mmc ${mmc_dev}:1 ${loadaddr} kernel.img load mmc ${mmc_dev}:1 ${dtb_mem_addr} dtb.img bootm start booti ${loadaddr} - ${dtb_mem_addr} bootm ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/Odroid_N2_boot.ini ================================================ ODROIDN2-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootlabel "EmuELEC" setenv remotewakeup "0x23dc4db2" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv native_4k_gui "0" setenv rootopt "BOOT_IMAGE=kernel.img boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" setenv dtb_mem_addr 0x1000000 setenv uenv_addr 0x13000000 if load mmc ${mmc_dev}:1 ${uenv_addr} resolution.ini; then env import -t ${uenv_addr} $filesize; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if load mmc ${mmc_dev}:1 ${uenv_addr} config.ini; then env import -t ${uenv_addr} $filesize; fi if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi setenv irsetup "remotewakeup=${remotewakeup} decode_type=${decode_type} remotewakeupmask=${remotewakeupmask}" if test "${usbopts}" != ""; then setenv usbopts "usbopts=${usbopts}"; fi if test "${usbpower}" != ""; then setenv usbpower "enable_system_power=${usbpower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a73}" != ""; then setenv max_freq_a73 "max_freq_a73=${max_freq_a73}"; fi if test "${modeline}" != ""; then setenv cmode "modeline=${modeline}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi if test "${keymap}" != ""; then setenv consoleopt "${consoleopt} keymap=${keymap}"; fi setenv displayopt "vout=${vout},en logo=osd0,loaded,0x3d800000 frac_rate_policy=${frac_rate_policy} native_4k_gui=${native_4k_gui} hdr_policy=1" setenv initargs "${rootopt} ${consoleopt} ${max_freq_a53} ${max_freq_a73} ${wol} ${cec} ${irsetup} ${usbpower} ${gpiopower} ${usbopts} ${cmode}" setenv bootargs "${initargs} ${displayopt} ${coreelec}" load mmc ${mmc_dev}:1 ${loadaddr} kernel.img load mmc ${mmc_dev}:1 ${dtb_mem_addr} dtb.img bootm start booti ${loadaddr} - ${dtb_mem_addr} bootm ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/Radxa_Zero2_boot.ini ================================================ RADXA_ZERO2-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootlabel "CoreELEC" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv native_4k_gui "0" setenv rootopt "BOOT_IMAGE=kernel.img boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" setenv dtb_mem_addr 0x1000000 setenv uenv_addr 0x13000000 if load mmc ${mmc_dev}:1 ${uenv_addr} resolution.ini; then env import -t ${uenv_addr} $filesize; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if load mmc ${mmc_dev}:1 ${uenv_addr} config.ini; then env import -t ${uenv_addr} $filesize; fi if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi setenv irsetup "remotewakeup=${remotewakeup} decode_type=${decode_type} remotewakeupmask=${remotewakeupmask}" if test "${usbopts}" != ""; then setenv usbopts "usbopts=${usbopts}"; fi if test "${usbpower}" != ""; then setenv usbpower "enable_system_power=${usbpower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a73}" != ""; then setenv max_freq_a73 "max_freq_a73=${max_freq_a73}"; fi if test "${modeline}" != ""; then setenv cmode "modeline=${modeline}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi if test "${keymap}" != ""; then setenv consoleopt "${consoleopt} keymap=${keymap}"; fi setenv displayopt "vout=${vout},en logo=osd0,loaded,0x3d800000 frac_rate_policy=${frac_rate_policy} native_4k_gui=${native_4k_gui} hdr_policy=1" setenv initargs "${rootopt} ${consoleopt} ${max_freq_a53} ${max_freq_a73} ${wol} ${cec} ${irsetup} ${usbpower} ${gpiopower} ${usbopts} ${cmode}" setenv bootargs "${initargs} ${displayopt} ${coreelec}" load mmc ${mmc_dev}:1 ${loadaddr} kernel.img load mmc ${mmc_dev}:1 ${dtb_mem_addr} dtb.img bootm start booti ${loadaddr} - ${dtb_mem_addr} bootm ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/Radxa_Zero_boot.ini ================================================ RADXA_ZERO-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootlabel "EmuELEC" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv native_4k_gui "0" setenv rootopt "BOOT_IMAGE=kernel.img boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" setenv dtb_mem_addr 0x1000000 setenv uenv_addr 0x13000000 if load mmc ${mmc_dev}:1 ${uenv_addr} resolution.ini; then env import -t ${uenv_addr} $filesize; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if load mmc ${mmc_dev}:1 ${uenv_addr} config.ini; then env import -t ${uenv_addr} $filesize; fi if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi setenv irsetup "remotewakeup=${remotewakeup} decode_type=${decode_type} remotewakeupmask=${remotewakeupmask}" if test "${usbopts}" != ""; then setenv usbopts "usbopts=${usbopts}"; fi if test "${usbpower}" != ""; then setenv usbpower "enable_system_power=${usbpower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a73}" != ""; then setenv max_freq_a73 "max_freq_a73=${max_freq_a73}"; fi if test "${modeline}" != ""; then setenv cmode "modeline=${modeline}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi if test "${keymap}" != ""; then setenv consoleopt "${consoleopt} keymap=${keymap}"; fi setenv displayopt "vout=${vout},en logo=osd0,loaded,0x3d800000 frac_rate_policy=${frac_rate_policy} native_4k_gui=${native_4k_gui} hdr_policy=1" setenv initargs "${rootopt} ${consoleopt} ${max_freq_a53} ${max_freq_a73} ${wol} ${cec} ${irsetup} ${usbpower} ${gpiopower} ${usbopts} ${cmode}" setenv bootargs "${initargs} ${displayopt} ${coreelec}" load mmc ${mmc_dev}:1 ${loadaddr} kernel.img load mmc ${mmc_dev}:1 ${dtb_mem_addr} dtb.img bootm start booti ${loadaddr} - ${dtb_mem_addr} bootm ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/canupdate.sh ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.tv) # detect legacy kernel installs and abort to prevent upgrades if [ "$(uname -r)" = "3.14.29" ]; then echo "Update from 3.14 is not supported!" sleep 10 exit 1 fi DEVICE_OLD=$(echo "${1}" | cut -d. -f1) DEVICE_NEW=$(echo "${2}" | cut -d. -f1) # allow upgrades between aarch64 and arm images on same device if [ "${DEVICE_OLD}" = "${DEVICE_NEW}" ]; then exit 0 else exit 1 fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/config.ini ================================================ #------------------------------------------------------------------------------------------------------ # # config.ini # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # Console Setup # # consoleopt='console=ttyS0,115200 console=tty0 no_console_suspend' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # CPU Frequency Control # # WARNING!!! WARNING!!! WARNING!!! # Before changing anything here please read the wiki entry at: # https://wiki.odroid.com/odroid-n2/application_note/software/set_cpu_freq # # max_freq_a73='1800' # max_freq_a53='1896' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # HDMI CEC Control # Set by CoreELEC Settings # # cec_func_config='7f' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # HDMI CEC OSD Name # Set by CoreELEC Settings # # cec_osd_name='EmuELEC' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # IR setup # Setup a custom keycode to wake the N2/C4 from suspend or poweroff # You can stop kodi and eventlircd and use "ir-keytable -u" to obtain a compatible u-boot # IR keycode # This setting will require a injected bl301 blob. # # remotewakeup='0x31ce4db2' # # decode_type can be one of the following: # NEC='0x0', DUOKAN='0x1', TOSHIBA='0x2', RCA='0x3', RC5='0x4', RC6A='0x5', NEC_TOSHIBA_2IN1='0x6', # NEC_RCA_2IN1='0x7', RCMM='0x8', NEC_RC5_2IN1='0x9', NEC_RC5_2IN1='0xa', RC6='0xb' # This setting will require a injected bl301 blob. # # decode_type='0x0' # NEC # # remote power key mask: # Some IR protocols implement a toggle bit, this can be ignored by the "and" mask: # RC5='0x37ff', RC6='0x1effff', RC6A='0xffff7fff' # This setting will require a injected bl301 blob. # # remotewakeupmask='0xffffffff' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # WOL Setting, 0=off/1=on # Set by CoreELEC Settings # # wol=1 # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # Power Off and Wake Up using GPIO Key Button # Valid options for Odroid N2/C4 are 476,477,478,479,480,481,483,484,485,486,487,488,489,490,491,492 # Valid option for Khadas VIM3 is 503 # # gpiopower=476 # (pin 16 of J2 header) #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # USB specific options # # usbopts='usb-xhci.tablesize=2' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # USB Power Control # Set by CoreELEC Settings # # usbpower=0 # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # HDMI custom mode # You can use this setting to set a custom video mode # modeline "horpixels,verpixels,pixel_clock,hor_freq,ver_freq,hdisp,hsyncstart,hsyncend,htotal,vdisp, # vsyncstart,vsyncend,vtotal,hsync_polarity,vsync_polarity,progress_mode" # # Example for 1920x1080p@60hz # modeline='1920,1080,148500,67500,60,1920,2008,2052,2200,1080,1084,1088,1125,1,1,1' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # VOUT mode # You can use this setting to set a specific video mode at boot. # # vout='1080p60hz' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # Fractional Refresh Rate # You can use this setting to set a fractional refresh rate. So for example if vout mode it set to # 1080p60hz then setting this to 1 will make the refresh rate switch to 59.97hz instead of the modes # default of 60hz. In this example setting it to 0 will keep the modes default of 60hz. # # frac_rate_policy='0' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # Busybox console keyboard layout # Set by CoreELEC Settings # # keymap='uk' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # CoreELEC Developer Options # Valid options are: textmode debugging progress nofsck nosplash noram overlay quiet ssh # # coreelec='quiet' # #------------------------------------------------------------------------------------------------------ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/dtb.conf ================================================ <dtb> <multidtb name="g12b_s922x_beelink_gt_king.dtb" subdevice=""> <file>g12b_s922x_beelink_gt_king_rev_a.dtb</file> <file>g12b_s922x_beelink_gt_king.dtb</file> </multidtb> <multidtb name="g12b_s922x_beelink_gs_king_x.dtb" subdevice=""> <file>g12b_s922x_beelink_gs_king_x_rev_a.dtb</file> <file>g12b_s922x_beelink_gs_king_x.dtb</file> </multidtb> <multidtb name="g12a_s905x2_beelink_gt_mini_a.dtb" subdevice=""> <file>g12a_s905x2_beelink_gt_mini_a_2g.dtb</file> <file>g12a_s905x2_beelink_gt_mini_a_4g.dtb</file> </multidtb> <multidtb name="g12a_s905x2_beelink_gt1_mini.dtb" subdevice=""> <file>g12a_s905x2_beelink_gt1_mini_2g.dtb</file> <file>g12a_s905x2_beelink_gt1_mini_4g.dtb</file> </multidtb> <multidtb name="sm1_s905x3_beelink_gt1mini2.dtb" subdevice=""> <file>sm1_s905x3_beelink_gt1mini2_2g.dtb</file> <file>sm1_s905x3_beelink_gt1mini2_4g.dtb</file> </multidtb> <multidtb name="g12b_s922x_odroid_n2.dtb" subdevice="Odroid_N2"> <file>g12b_s922x_odroid_n2.dtb</file> <file>g12b_s922x_odroid_n2plus.dtb</file> <file>g12b_s922x_odroid_n2plus_rev_c.dtb</file> </multidtb> <multidtb name="g12b_s922x_ugoos_am6.dtb" subdevice=""> <file>g12b_s922x_ugoos_am6_rev_a_2g.dtb</file> <file>g12b_s922x_ugoos_am6_rev_a_4g.dtb</file> <file>g12b_s922x_ugoos_am6_2g.dtb</file> <file>g12b_s922x_ugoos_am6_4g.dtb</file> </multidtb> <multidtb name="g12b_s922x_ugoos_am6b.dtb" subdevice=""> <file>g12b_s922x_ugoos_am6b_rev_a_2g.dtb</file> <file>g12b_s922x_ugoos_am6b_rev_a_4g.dtb</file> <file>g12b_s922x_ugoos_am6b_2g.dtb</file> <file>g12b_s922x_ugoos_am6b_4g.dtb</file> </multidtb> <multidtb name="gxl_p212_lepotato.dtb" subdevice="LePotato"> <file>gxl_p212_1g_lepotato.dtb</file> <file>gxl_p212_2g_lepotato.dtb</file> </multidtb> <multidtb name="g12b_bananapi_m2s.dtb" subdevice=""> <file>g12b_a311d_bananapi_m2s.dtb</file> <file>g12b_s922x_bananapi_m2s.dtb</file> </multidtb> <multidtb name="sc2_s905x4_buzztv_x5.dtb" subdevice=""> <file>sc2_s905x4_buzztv_x5_2g.dtb</file> <file>sc2_s905x4_buzztv_x5_2g_1gbit.dtb</file> <file>sc2_s905x4_buzztv_x5_4g.dtb</file> <file>sc2_s905x4_buzztv_x5_4g_1gbit.dtb</file> </multidtb> <migratedtb coreelec-dt-id="g12b_s922x_odroid_n2_dvb" subdevice="Odroid_N2"> <migratedtid>g12b_s922x_odroid_n2</migratedtid> <migratecmd>fdtput -t s -a g12b_w400_a $BOOT_ROOT/dtb.img /dvb status okay</migratecmd> </migratedtb> <migratedtb coreelec-dt-id="g12b_s922x_odroid_n2plus_dvb" subdevice="Odroid_N2"> <migratedtid>g12b_s922x_odroid_n2plus</migratedtid> <migratecmd>fdtput -t s -a g12b_w400_b $BOOT_ROOT/dtb.img /dvb status okay && fdtput -t s -a g12b_w400_c $BOOT_ROOT/dtb.img /dvb status okay</migratecmd> </migratedtb> <migratedtb coreelec-dt-id="sm1_s905x3_odroid_c4_dvb" subdevice="Odroid_C4"> <migratedtid>sm1_s905x3_odroid_c4</migratedtid> <migratecmd>fdtput -t s $BOOT_ROOT/dtb.img /dvb status okay</migratecmd> </migratedtb> <migratedtb coreelec-dt-id="sm1_s905x3_4g_1gbit_slowsdio" subdevice=""> <migratedtid>sm1_s905x3_4g_1gbit</migratedtid> <migratecmd>fdtput -t s $BOOT_ROOT/dtb.img /sdio/sdio f_max 170000000</migratecmd> </migratedtb> <migratedtb coreelec-dt-id="g12b_s922x_ugoos_am6" subdevice=""> <migratedtid>g12b_s922x_ugoos_am6_2g</migratedtid> </migratedtb> <migratedtb coreelec-dt-id="g12b_s922x_ugoos_am6_rev_a" subdevice=""> <migratedtid>g12b_s922x_ugoos_am6_rev_a_2g</migratedtid> </migratedtb> </dtb> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/dtb.xml ================================================ <?xml version="1.0"?> <dtb-settings version="0"> <sys_led status="on" version="0"> <sys_led_on name="on"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>default-on</value> </cmd> </sys_led_on> <sys_led_heartbeat name="heartbeat"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>heartbeat</value> </cmd> </sys_led_heartbeat> <sys_led_rc_feedback name="rc feedback"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>rc-feedback</value> </cmd> </sys_led_rc_feedback> <sys_led_sd name="sd"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>sd</value> </cmd> </sys_led_sd> <sys_led_emmc name="emmc"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>emmc</value> </cmd> </sys_led_emmc> <sys_led_off name="off"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>none</value> </cmd> </sys_led_off> </sys_led> <red_led status="off" version="0"> <red_led_on name="on"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>default-on</value> </cmd> </red_led_on> <red_led_heartbeat name="heartbeat"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>heartbeat</value> </cmd> </red_led_heartbeat> <red_led_rc_feedback name="rc feedback"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>rc-feedback</value> </cmd> </red_led_rc_feedback> <red_led_sd name="sd"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>sd</value> </cmd> </red_led_sd> <red_led_emmc name="emmc"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>emmc</value> </cmd> </red_led_emmc> <red_led_off name="off"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>none</value> </cmd> </red_led_off> </red_led> <green_led status="off" version="0"> <green_led_on name="on"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>default-on</value> </cmd> </green_led_on> <green_led_heartbeat name="heartbeat"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>heartbeat</value> </cmd> </green_led_heartbeat> <green_led_rc_feedback name="rc feedback"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>rc-feedback</value> </cmd> </green_led_rc_feedback> <green_led_sd name="sd"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>sd</value> </cmd> </green_led_sd> <green_led_emmc name="emmc"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>emmc</value> </cmd> </green_led_emmc> <green_led_off name="off"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>none</value> </cmd> </green_led_off> </green_led> <spicc0 status="off" version="0"> <spicc0_on name="on"> <cmd path="/soc/cbus@ffd00000/spi@13000 status" type="s" > <value>okay</value> </cmd> <cmd path="/soc/cbus@ffd00000/spi@13000/spidev@0 status" type="s" > <value>okay</value> </cmd> </spicc0_on> <spicc0_off name="off"> <cmd path="/soc/cbus@ffd00000/spi@13000 status" type="s" > <value>disabled</value> </cmd> <cmd path="/soc/cbus@ffd00000/spi@13000/spidev@0 status" type="s" > <value>disabled</value> </cmd> </spicc0_off> </spicc0> <spicc1 status="off" version="0"> <spicc1_on name="on"> <cmd path="/soc/cbus@ffd00000/spi@15000 status" type="s" > <value>okay</value> </cmd> <cmd path="/soc/cbus@ffd00000/spi@15000/spidev@0 status" type="s" > <value>okay</value> </cmd> </spicc1_on> <spicc1_off name="off"> <cmd path="/soc/cbus@ffd00000/spi@15000 status" type="s" > <value>disabled</value> </cmd> <cmd path="/soc/cbus@ffd00000/spi@15000/spidev@0 status" type="s" > <value>disabled</value> </cmd> </spicc1_off> </spicc1> <dvb status="off" version="2"> <dvb_on name="on"> <cmd path="/dvb status" type="s" > <value>okay</value> </cmd> </dvb_on> <dvb_off name="off"> <cmd path="/dvb status" type="s" > <value>disabled</value> </cmd> </dvb_off> </dvb> <remote_type status="NEC" version="0"> <remote_type_nec name="NEC"> <cmd path="/meson-remote protocol" type="i" > <value>1</value> </cmd> </remote_type_nec> <remote_type_legacy_nec name="LEGACY NEC"> <cmd path="/meson-remote protocol" type="i" > <value>255</value> </cmd> </remote_type_legacy_nec> <remote_type_duokan name="DUOKAN"> <cmd path="/meson-remote protocol" type="i" > <value>2</value> </cmd> </remote_type_duokan> <remote_type_xmp_1 name="XMP_1"> <cmd path="/meson-remote protocol" type="i" > <value>3</value> </cmd> </remote_type_xmp_1> <remote_type_rc5 name="RC5"> <cmd path="/meson-remote protocol" type="i" > <value>4</value> </cmd> </remote_type_rc5> <remote_type_rc6 name="RC6"> <cmd path="/meson-remote protocol" type="i" > <value>5</value> </cmd> </remote_type_rc6> <remote_type_toshiba name="TOSHIBA"> <cmd path="/meson-remote protocol" type="i" > <value>6</value> </cmd> </remote_type_toshiba> <remote_type_rca name="RCA"> <cmd path="/meson-remote protocol" type="i" > <value>8</value> </cmd> </remote_type_rca> </remote_type> <emmc status="HS200" version="0"> <high_speed name="HS200,HS400"> <cmd path="/emmc/emmc caps2" type="s" > <value>MMC_CAP2_HS200</value> <value>MMC_CAP2_HS400</value> </cmd> </high_speed> <normal_speed name="HS200"> <cmd path="/emmc/emmc caps2" type="s" > <value>MMC_CAP2_HS200</value> </cmd> </normal_speed> </emmc> <slowsdio status="normal" version="0"> <slow_sdio name="slow"> <cmd path="/sdio/sdio f_max" type="u" > <value>170000000</value> </cmd> </slow_sdio> <normal_sdio name="normal"> <cmd path="/sdio/sdio f_max" type="u" > <value>200000000</value> </cmd> </normal_sdio> </slowsdio> <int_ext_phy status="default" dt_id="khadas_vim3" version="1"> <ext_phy name="default"> <cmd path="/ethernet@ff3f0000 internal_phy" type="i" > <value>0</value> </cmd> <cmd path="/ethernet@ff3f0000 mc_val" type="x" > <value>0x1621</value> </cmd> </ext_phy> <int_phy name="M.2 Slot"> <cmd path="/ethernet@ff3f0000 internal_phy" type="i" > <value>1</value> </cmd> <cmd path="/ethernet@ff3f0000 mc_val" type="x" > <value>0x4BE04</value> </cmd> </int_phy> </int_ext_phy> <k_usb3_pcie status="USB3" dt_id="khadas_vim3*" version="0"> <k_usb3 name="USB3"> <cmd path="/usb3phy@ffe09080 status" type="s" > <value>okay</value> </cmd> <cmd path="/pcieA@fc000000 status" type="s" > <value>disabled</value> </cmd> </k_usb3> <k_pcie name="PCIE"> <cmd path="/usb3phy@ffe09080 status" type="s" > <value>disabled</value> </cmd> <cmd path="/pcieA@fc000000 status" type="s" > <value>okay</value> </cmd> </k_pcie> </k_usb3_pcie> <ip1001 status="migrated" dt_id="sm1_s905x3*1gbit" version="1"> <ip1001_n_a name="n/a"> <cmd path="/ethernet@ff3f0000 mc_val" type="x" > <value>0x1621</value> </cmd> <cmd path="/ethernet@ff3f0000 cali_val" type="x" > <value>0x10000</value> </cmd> <cmd path="/ethernet@ff3f0000 rx_delay" type="i" > <value>0</value> </cmd> <cmd path="/ethernet@ff3f0000 auto_cali_idx" type="i" > <value>0</value> </cmd> </ip1001_n_a> <ip1001_a name="assembled"> <cmd path="/ethernet@ff3f0000 mc_val" type="x" > <value>0x1609</value> </cmd> <cmd path="/ethernet@ff3f0000 cali_val" type="x" > <value>0xc0000</value> </cmd> <cmd path="/ethernet@ff3f0000 rx_delay" option="d" /> <cmd path="/ethernet@ff3f0000 auto_cali_idx" option="d" /> </ip1001_a> </ip1001> <smartchip status="migrated" dt_id="gxl_*" version="1"> <smartchip_disabled name="Disabled"> <cmd path="/smartchip_wifi_driver/ compatible" type="s" > <value>smartchip,disabled</value> </cmd> <cmd path="/sdio@d0070000/sdio dmode" option="d" /> </smartchip_disabled> <s9083s name="S-9083"> <cmd path="/smartchip_wifi_driver/ compatible" type="s" > <value>smartchip,s9083s</value> </cmd> <cmd path="/sdio@d0070000/sdio dmode" type="s" > <value>pio</value> </cmd> </s9083s> <s9188s name="S-9188"> <cmd path="/smartchip_wifi_driver/ compatible" type="s" > <value>smartchip,s9188s</value> </cmd> <cmd path="/sdio@d0070000/sdio dmode" type="s" > <value>pio</value> </cmd> </s9188s> <richv300 name="RICHV300"> <cmd path="/smartchip_wifi_driver/ compatible" type="s" > <value>smartchip,richv300s</value> </cmd> <cmd path="/sdio@d0070000/sdio dmode" type="s" > <value>pio</value> </cmd> </richv300> </smartchip> </dtb-settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/mkbootimg ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) DTBIMG_PATH="arch/$TARGET_KERNEL_ARCH/boot" DTB_PATH="${DTBIMG_PATH}/dts/amlogic" ANDROID_BOOTIMG_SECOND="" SUBDEVICES+=" Generic" for device in $SUBDEVICES; do DTB_BLOBS_PATH=${DTB_PATH}/${device} mkdir -p ${DTB_BLOBS_PATH} if [ "$device" = "Generic" ]; then for dtblob in $KERNEL_UBOOT_EXTRA_TARGET; do cp ${DTB_PATH}/$dtblob ${DTB_BLOBS_PATH} 2>/dev/null || : done else MULTIDTB_BLOB="" find_file_path bootloader/dtb.conf MULTIDTB_CONF="${FOUND_PATH}" if [ -f ${MULTIDTB_CONF} ]; then multidtb_cnt=$(xmlstarlet sel -t -c "count(//dtb/multidtb)" ${MULTIDTB_CONF}) cnt_m=1 while [ $cnt_m -le $multidtb_cnt ]; do multidtb=$(xmlstarlet sel -t -v "//dtb/multidtb[$cnt_m]/@name" ${MULTIDTB_CONF}) || : subdevice=$(xmlstarlet sel -t -v "//dtb/multidtb[$cnt_m]/@subdevice" ${MULTIDTB_CONF}) || : if [ "$device" = "$subdevice" ]; then echo "Device tree multidtb subdevice: ${device}, ${multidtb%%.*}.dtb" MULTIDTB_BLOB="${multidtb%%.*}.dtb" break fi cnt_m=$((cnt_m+1)) done fi if [ -n "${MULTIDTB_BLOB}" ]; then cp ${DTB_PATH}/${MULTIDTB_BLOB} ${DTB_BLOBS_PATH}/${device}_dtb.dtb 2>/dev/null || : else cp ${DTB_PATH}/*${device,,}.dtb ${DTB_BLOBS_PATH} 2>/dev/null || : fi fi DTB_BLOBS=($(ls ${DTB_BLOBS_PATH}/*.dtb 2>/dev/null || true)) DTB_BLOBS_COUNT=${#DTB_BLOBS[@]} DTB_BLOB_OUTPUT=${DTBIMG_PATH}/${device}_dtb.img if [ "$DTB_BLOBS_COUNT" -gt 1 ]; then $TOOLCHAIN/bin/dtbTool -c -o ${DTB_BLOB_OUTPUT} -p scripts/dtc/ ${DTB_BLOBS_PATH} elif [ "$DTB_BLOBS_COUNT" -eq 1 ]; then cp -PR $DTB_BLOBS $DTB_BLOB_OUTPUT fi done if [ -f ${DTBIMG_PATH}/Generic_dtb.img ]; then ANDROID_BOOTIMG_SECOND="--second ${DTBIMG_PATH}/Generic_dtb.img" fi LDFLAGS="" mkbootimg --kernel arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET --ramdisk $BUILD/image/initramfs.cpio \ $ANDROID_BOOTIMG_SECOND $ANDROID_BOOTIMG_OPTIONS --output arch/$TARGET_KERNEL_ARCH/boot/boot.img ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/mkimage ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) # copy amlogic autoscript files to part1 if needed if [ "${SUBDEVICE}" != "Odroid_N2" ] && [ "${SUBDEVICE}" != "Odroid_N2L" ] && [ "${SUBDEVICE}" != "Odroid_C4" ] && [ "${SUBDEVICE}" != "Odroid_HC4" ] && [ "${SUBDEVICE}" != "LePotato" ] && [ "${SUBDEVICE}" != "LaFrite" ] && [ "${SUBDEVICE:0:10}" != "Radxa_Zero" ]; then for f in $RELEASE_DIR/3rdparty/bootloader/*autoscript; do [ -e "$f" ] && mcopy "$f" :: done fi if [ -f $RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_cfgload ]; then mcopy -s $RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_cfgload "::/cfgload" fi # copy device trees to part1 for dtb in $RELEASE_DIR/3rdparty/bootloader/device_trees $RELEASE_DIR/3rdparty/bootloader/*.dtb $RELEASE_DIR/3rdparty/bootloader/dtb.img ; do [ -e "$dtb" ] && mcopy -s "$dtb" :: done if [ -f "$RELEASE_DIR/3rdparty/bootloader/config.ini" ]; then mcopy $RELEASE_DIR/3rdparty/bootloader/config.ini :: fi if [ "${SUBDEVICE}" != "Generic" ]; then if [ -f "$RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_dtb.img" ]; then mcopy $RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_dtb.img "::/dtb.img" fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_u-boot" ] && [ "${SUBDEVICE}" != "LaFrite" ] ; then echo "Writing u-boot to $(basename $DISK)" dd if="$RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_u-boot" of="$DISK" conv=fsync,notrunc bs=1 count=112 >"$SAVE_ERROR" 2>&1 || show_error dd if="$RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_u-boot" of="$DISK" conv=fsync,notrunc bs=512 skip=1 seek=1 >"$SAVE_ERROR" 2>&1 || show_error fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_boot.ini" ]; then cp -p "$RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_boot.ini" "$LE_TMP/boot.ini" sed -e "s/@BOOT_UUID@/$UUID_SYSTEM/" \ -e "s/@DISK_UUID@/$UUID_STORAGE/" \ -i "$LE_TMP/boot.ini" mcopy "$LE_TMP/boot.ini" :: fi if [ "${SUBDEVICE}" == "Odroid_N2" -o "${SUBDEVICE}" == "Odroid_N2L" -o "${SUBDEVICE}" == "Odroid_C4" -o "${SUBDEVICE}" == "Odroid_HC4" ]; then if [ -f "$RELEASE_DIR/3rdparty/bootloader/hk-boot-logo-1080.bmp.gz" ]; then mcopy $RELEASE_DIR/3rdparty/bootloader/hk-boot-logo-1080.bmp.gz "::/boot-logo-1080.bmp.gz" fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/timeout-logo-1080.bmp.gz" ]; then mcopy $RELEASE_DIR/3rdparty/bootloader/timeout-logo-1080.bmp.gz :: fi fi if [ "${SUBDEVICE}" == "LePotato" -o "${SUBDEVICE}" == "LaFrite" ]; then if [ -f "$RELEASE_DIR/3rdparty/bootloader/boot-logo-1080.bmp.gz" ]; then mcopy $RELEASE_DIR/3rdparty/bootloader/boot-logo-1080.bmp.gz :: fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/timeout-logo-1080.bmp.gz" ]; then mcopy $RELEASE_DIR/3rdparty/bootloader/timeout-logo-1080.bmp.gz :: fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_chain_u-boot" ]; then mcopy $RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_chain_u-boot "::/u-boot.bin" fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/libretech_chain_boot" ]; then mcopy $RELEASE_DIR/3rdparty/bootloader/libretech_chain_boot "::/boot.scr" fi fi if [ "${SUBDEVICE:0:10}" == "Radxa_Zero" ]; then if [ -f "$RELEASE_DIR/3rdparty/bootloader/radxa-boot-logo-1080.bmp.gz" ]; then mcopy $RELEASE_DIR/3rdparty/bootloader/radxa-boot-logo-1080.bmp.gz "::/boot-logo-1080.bmp.gz" fi fi fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/release ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) mkdir -p $RELEASE_DIR/3rdparty/bootloader cp -a $INSTALL/usr/share/bootloader/* $RELEASE_DIR/3rdparty/bootloader ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/scripts/Generic_cfgload.src ================================================ echo "Using device ${device}, number ${devnr}, partition ${partnr}, EmuELEC on eMMC: ${ce_on_emmc}" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv native_4k_gui "0" setenv rootopt "BOOT_IMAGE=kernel.img boot=LABEL=EMUELEC disk=LABEL=STORAGE" if test "${ce_on_emmc}" = "yes"; then setenv rootopt "BOOT_IMAGE=kernel.img boot=LABEL=CE_FLASH disk=FOLDER=/dev/CE_STORAGE"; fi if fatload ${device} ${devnr}:${partnr} ${loadaddr} resolution.ini; then env import -t ${loadaddr} ${filesize}; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if fatload ${device} ${devnr}:${partnr} ${loadaddr} config.ini; then env import -t ${loadaddr} ${filesize}; fi setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a73}" != ""; then setenv max_freq_a73 "max_freq_a73=${max_freq_a73}"; fi if test "${modeline}" != ""; then setenv cmode "modeline=${modeline}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi if test "${keymap}" != ""; then setenv consoleopt "${consoleopt} keymap=${keymap}"; fi if test "${loadaddr_kernel}" != ""; then setenv loadaddr "${loadaddr_kernel}"; fi setenv displayopt "vout=${vout},en logo=osd0,loaded,${fb_addr} frac_rate_policy=${frac_rate_policy} native_4k_gui=${native_4k_gui} hdmitx=${hdmitx} hdr_policy=1" setenv initargs "${rootopt} ${consoleopt} ${max_freq_a53} ${max_freq_a73} ${wol} ${cec} ${gpiopower} ${usbopts} ${cmode}" setenv bootargs "${bootargs} ${initargs} ${displayopt} ${coreelec}" fatload ${device} ${devnr}:${partnr} ${loadaddr} kernel.img fatload ${device} ${devnr}:${partnr} ${dtb_mem_addr} dtb.img bootm ${loadaddr} bootm start bootm loados bootm prep bootm go ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/scripts/aml_autoscript.src ================================================ defenv setenv bootfromnand 0 setenv upgrade_step 2 setenv ce_on_emmc "no" setenv sddtb 'if fatload mmc 0 ${dtb_mem_addr} dtb.img; then else store dtb read $dtb_mem_addr; fi' setenv usbdtb 'if fatload usb 0 ${dtb_mem_addr} dtb.img; then else store dtb read $dtb_mem_addr; fi' setenv cfgloadsd 'if fatload mmc 0:1 ${loadaddr} cfgload; then setenv device mmc; setenv devnr 0; setenv partnr 1; autoscr ${loadaddr}; fi' setenv cfgloadusb 'if fatload usb 0:1 ${loadaddr} cfgload; then setenv device usb; setenv devnr 0; setenv partnr 1; autoscr ${loadaddr}; fi' setenv cfgloademmc 'for p in 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18; do if fatload mmc 1:${p} ${loadaddr} cfgload; then setenv device mmc; setenv devnr 1; setenv partnr ${p}; setenv ce_on_emmc "yes"; autoscr ${loadaddr}; fi; done;' setenv bootfromsd 'if mmcinfo; then run cfgloadsd; if fatload mmc 0 ${loadaddr} kernel.img; then run sddtb; setenv bootargs ${bootargs} bootfromsd; bootm; fi; fi' setenv bootfromusb 'usb start 0; run cfgloadusb; if fatload usb 0 ${loadaddr} kernel.img; then run usbdtb; setenv bootargs ${bootargs} bootfromusb; bootm; fi' setenv bootfromemmc 'run cfgloademmc' setenv bootcmd 'if test ${bootfromnand} = 1; then setenv bootfromnand 0; saveenv; else run bootfromsd; run bootfromusb; run bootfromemmc; fi; run storeboot' saveenv run storeargs run bootfromsd run bootfromusb run bootfromemmc ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/scripts/libretech_chain_boot.src ================================================ load mmc 0 0x1000000 u-boot.bin load usb 0 0x1000000 u-boot.bin load mmc 1 0x1000000 u-boot.bin go 0x1000000 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/bootloader/update.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) # use chroot because of running xmlstarlet and other binaries build with newer glibc if [ "${SYSTEM_ROOT}" = "/update" ]; then # run from init # unset SYSTEM_ROOT because we are chroot-ing and /update become new / anyway unset SYSTEM_ROOT # mount some folders from old root mount -o bind /tmp /update/var for folder in proc sys dev tmp run flash storage; do [ -d /${folder} ] && mount -o bind /${folder} /update/${folder} done /usr/bin/busybox chroot /update /usr/share/bootloader/update.sh # umount folders for folder in proc sys dev tmp run flash storage; do [ -d /${folder} ] && umount /update/${folder} done umount /update/var # set it back just in case SYSTEM_ROOT="/update" exit 0 fi # change to writable folder cd /tmp [ -z "$BOOT_ROOT" ] && BOOT_ROOT="/flash" [ -z "$BOOT_PART" ] && BOOT_PART=$(df "$BOOT_ROOT" | tail -1 | awk {' print $1 '}) if [ -z "$BOOT_DISK" ]; then case $BOOT_PART in /dev/sd[a-z][0-9]*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,[0-9]*,,g") ;; /dev/mmcblk*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,p[0-9]*,,g") ;; esac fi mount -o rw,remount $BOOT_ROOT DT_ID="" SUBDEVICE="" for arg in $(cat /proc/cmdline); do case $arg in boot=*) boot="${arg#*=}" case $boot in /dev/mmc*) BOOT_UUID="$(blkid $boot | sed 's/.* UUID="//;s/".*//g')" ;; UUID=*|LABEL=*) BOOT_UUID="$(blkid | sed 's/"//g' | grep -m 1 -i " $boot " | sed 's/.* UUID=//;s/ .*//g')" ;; FOLDER=*) BOOT_UUID="$(blkid ${boot#*=} | sed 's/.* UUID="//;s/".*//g')" ;; esac DT_ID=$(dtname) MIGRATE_DTB="" if [ -n "$DT_ID" ]; then SUBDEVICE="Generic" # modify DT_ID, SUBDEVICE and MIGRATE_DTB by dtb.conf [ -f /usr/bin/convert_dtname ] && . /usr/bin/convert_dtname $DT_ID case $DT_ID in *odroid_c4*) SUBDEVICE="Odroid_C4" ;; *odroid_hc4*) SUBDEVICE="Odroid_HC4" ;; *lafrite) SUBDEVICE="LaFrite" ;; *radxa_zero) SUBDEVICE="Radxa_Zero" ;; *radxa_zero2) SUBDEVICE="Radxa_Zero2" ;; esac fi UPDATE_DTB_SOURCE="/usr/share/bootloader/device_trees/$DT_ID.dtb" if [ -n "$DT_ID" -a -f "$UPDATE_DTB_SOURCE" ]; then echo "Updating device tree with $DT_ID.dtb..." case $BOOT_PART in /dev/coreelec) dd if=/dev/zero of=/dev/dtb bs=256k count=1 status=none dd if="$UPDATE_DTB_SOURCE" of=/dev/dtb bs=256k status=none rm -f "$BOOT_ROOT/dtb.img" # this should not exist, remove if it does ;; *) cp -f "$UPDATE_DTB_SOURCE" "$BOOT_ROOT/dtb.img" ;; esac [ -n "$MIGRATE_DTB" ] && eval $MIGRATE_DTB fi for all_dtb in /flash/*.dtb ; do if [ -f $all_dtb ]; then dtb=$(basename $all_dtb) if [ -f /usr/share/bootloader/$dtb ]; then echo "Updating $dtb..." cp -p /usr/share/bootloader/$dtb $BOOT_ROOT fi fi done ;; disk=*) disk="${arg#*=}" case $disk in /dev/mmc*) DISK_UUID="$(blkid $disk | sed 's/.* UUID="//;s/".*//g')" ;; UUID=*|LABEL=*) DISK_UUID="$(blkid | sed 's/"//g' | grep -m 1 -i " $disk " | sed 's/.* UUID=//;s/ .*//g')" ;; FOLDER=*) DISK_UUID="$(blkid ${disk#*=} | sed 's/.* UUID="//;s/".*//g')" ;; esac ;; esac done if [ -d $BOOT_ROOT/device_trees ]; then echo "Updating device_trees folder..." rm $BOOT_ROOT/device_trees/*.dtb cp -p /usr/share/bootloader/device_trees/*.dtb $BOOT_ROOT/device_trees/ fi if [ -f /usr/share/bootloader/${SUBDEVICE}_boot.ini ]; then echo "Updating boot.ini with ${SUBDEVICE}_boot.ini..." cp -p /usr/share/bootloader/${SUBDEVICE}_boot.ini $BOOT_ROOT/boot.ini sed -e "s/@BOOT_UUID@/$BOOT_UUID/" \ -e "s/@DISK_UUID@/$DISK_UUID/" \ -i $BOOT_ROOT/boot.ini fi if [ -f /usr/share/bootloader/config.ini ]; then if [ ! -f $BOOT_ROOT/config.ini ]; then echo "Creating config.ini..." cp -p /usr/share/bootloader/config.ini $BOOT_ROOT/config.ini fi fi if [ -f $BOOT_ROOT/dtb.xml ]; then if [ -f /usr/lib/coreelec/dtb-xml ]; then echo "Updating dtb.img by dtb.xml..." /usr/lib/coreelec/dtb-xml fi fi if [ "${SUBDEVICE}" == "Odroid_N2" -o "${SUBDEVICE}" == "Odroid_N2L" -o "${SUBDEVICE}" == "Odroid_C4" -o "${SUBDEVICE}" == "Odroid_HC4" ]; then if [ -f /usr/share/bootloader/hk-boot-logo-1080.bmp.gz ]; then echo "Updating boot logos..." cp -p /usr/share/bootloader/hk-boot-logo-1080.bmp.gz $BOOT_ROOT/boot-logo-1080.bmp.gz fi fi if [ "${SUBDEVICE}" == "LePotato" -o "${SUBDEVICE}" == "LaFrite" ]; then if [ -f /usr/share/bootloader/boot-logo-1080.bmp.gz ]; then echo "Updating boot logos..." cp -p /usr/share/bootloader/boot-logo-1080.bmp.gz $BOOT_ROOT/boot-logo-1080.bmp.gz fi fi if [ "${SUBDEVICE:0:10}" == "Radxa_Zero" ]; then if [ -f /usr/share/bootloader/radxa-boot-logo-1080.bmp.gz ]; then echo "Updating boot logos..." cp -p /usr/share/bootloader/radxa-boot-logo-1080.bmp.gz $BOOT_ROOT/boot-logo-1080.bmp.gz fi fi if [ -f /usr/share/bootloader/${SUBDEVICE}_u-boot -a ! -e /dev/env ]; then echo "Updating u-boot on: $BOOT_DISK..." dd if=/usr/share/bootloader/${SUBDEVICE}_u-boot of=$BOOT_DISK conv=fsync bs=1 count=112 status=none dd if=/usr/share/bootloader/${SUBDEVICE}_u-boot of=$BOOT_DISK conv=fsync bs=512 skip=1 seek=1 status=none fi if [ -f $BOOT_ROOT/boot.scr ]; then if [ -f /usr/share/bootloader/${SUBDEVICE}_chain_u-boot ]; then echo "Updating chain loaded u-boot..." cp -p /usr/share/bootloader/${SUBDEVICE}_chain_u-boot $BOOT_ROOT/u-boot.bin fi if [ "${SUBDEVICE}" == "LePotato" -o "${SUBDEVICE}" == "LaFrite" ]; then if [ -f /usr/share/bootloader/libretech_chain_boot ]; then echo "Updating boot.scr..." cp -p /usr/share/bootloader/libretech_chain_boot $BOOT_ROOT/boot.scr fi fi fi if [ -f $BOOT_ROOT/aml_autoscript ]; then if [ -f /usr/share/bootloader/aml_autoscript ]; then echo "Updating aml_autoscript..." cp -p /usr/share/bootloader/aml_autoscript $BOOT_ROOT if [ -e /dev/env ]; then mkdir -p /var/lock dd if=$BOOT_ROOT/aml_autoscript bs=72 skip=1 status=none | \ while read line; do cmd=$(echo $line | sed -n "s|^setenv \(.*\)|fw_setenv -c /etc/fw_env.config \1|gp") [ -n "$cmd" ] && eval $cmd done fi fi if [ -f /usr/share/bootloader/${SUBDEVICE}_cfgload ]; then echo "Updating cfgload..." cp -p /usr/share/bootloader/${SUBDEVICE}_cfgload $BOOT_ROOT/cfgload fi /usr/lib/coreelec/check-bl301 if [ ${?} = 1 ]; then echo "Found custom CoreELEC BL301, running inject_bl301 tool..." inject_bl301 -Y &>/dev/null fi fi mount -o ro,remount $BOOT_ROOT # Leave a hint that we just did an update echo "UPDATE" > /storage/.config/boot.hint ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/filesystem/usr/lib/coreelec/smp-affinity.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) SMP="../smp_affinity" MESONIR="`find /proc/irq/ -name ir-meson`" ETH0="`find /proc/irq/ -name eth0`" VDEC0="`find /proc/irq/ -name vdec-0`" VDEC1="`find /proc/irq/ -name vdec-1`" PREDI="`find /proc/irq/ -name pre_di`" AFIFO0="`find /proc/irq/ -name afifo0`" AOCEC="`find /proc/irq/ -name hdmi_aocec*`" USB3="`find /proc/irq/ -name xhci-hcd:usb1`" IRQ="$AOCEC $ETH0 $USB3 $VDEC0 $VDEC1 $AFIFO0 $MESONIR $PREDI" cpu=1 for i in $IRQ; do if [ -f "$i/$SMP" ];then [ ! -d "/sys/devices/system/cpu/cpu$cpu" ] && cpu=1 aff=$((1 << $cpu)) haff=`printf '%x\n' $aff` echo "echo $haff > $i/$SMP" echo $haff > $i/$SMP cpu=$((cpu + 1)) fi done exit 0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/filesystem/usr/lib/kodi/aml-hdmimonitor.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) HDMI_UNPLUGGED=0 while :; do ! grep -q . /sys/class/amhdmitx/amhdmitx0/disp_cap && grep -q 0 /sys/class/amhdmitx/amhdmitx0/hpd_state && HDMI_UNPLUGGED=1 && sleep 2 && continue || break done if [ $HDMI_UNPLUGGED = 1 ] then systemctl restart kodi fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/filesystem/usr/lib/systemd/system/kodi-aml-hdmimonitor.service ================================================ [Unit] Description=Kodi Amlogic HDMI connection monitor After=kodi.service [Service] Type=simple ExecStart=/usr/lib/kodi/aml-hdmimonitor.sh [Install] WantedBy=kodi.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/filesystem/usr/sbin/installtoemmc ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) DISTRO_BOOTLABEL="EMUELEC" DISTRO_DISKLABEL="STORAGE" SYSTEM_PART_START=8192 SYSTEM_SIZE=1500 SYSTEM_PART_END=$(( ${SYSTEM_PART_START} + (${SYSTEM_SIZE} * 1024 * 1024 / 512) - 1 )) STORAGE_PART_START=$(( ${SYSTEM_PART_END} + 1 )) SYSTEM_BLKDEV=$(readlink -f /dev/block/$(mountpoint -d /flash)) BLKDEVNAME=$(ls /sys/class/mmc_host/emmc/emmc*/block 2> /dev/null) BLKDEV="/dev/${BLKDEVNAME}" BOOT_PART="${BLKDEV}p1" STORAGE_PART="${BLKDEV}p2" NEWBOOT=/var/media/NEWBOOT NEWSTORAGE=/var/media/NEWSTORAGE DT_ID=$(dtname) umount_all() { mounted=$(cat /proc/mounts | grep "${BLKDEV}" | awk '{ print $1 }') if [ -n "$mounted" ]; then echo "Unmount all partitions from ${BLKDEVNAME}..." umount $mounted sleep 2 fi } confirm_move() { if [ -z "$BLKDEVNAME" ]; then echo "eMMC not found." exit 0 fi echo "--------------------------------------------------" echo "" echo "This script will now erase the eMMC on your device" echo "All data on this eMMC will be lost forever!" echo "" read -p "Type \"yes\" if you know what you are doing or anything else to exit: " choice case "$choice" in yes) install_to_emmc ;; *) exit 0 ;; esac } install_to_emmc() { #stop kodi echo "Stopping Kodi..." systemctl stop kodi # umount umount_all # nuke it echo "Delete all partitions..." dd if=/dev/zero of=${BLKDEV} bs=512 count=1 # create partitions echo "Create new partitions..." parted -s "${BLKDEV}" mklabel "msdos" parted -s "${BLKDEV}" -a min unit s mkpart primary fat32 "${SYSTEM_PART_START}" "${SYSTEM_PART_END}" parted -s "${BLKDEV}" set 1 boot on parted -s "${BLKDEV}" -a min unit s mkpart primary ext4 "${STORAGE_PART_START}" "100%" sync # Flash u-boot echo "Flash Bootloader..." dd if=/usr/share/bootloader/${DEVICE}_u-boot of=${BLKDEV} conv=fsync bs=1 count=112 status=none dd if=/usr/share/bootloader/${DEVICE}_u-boot of=${BLKDEV} conv=fsync bs=512 skip=1 seek=1 status=none sync # create fs for new /flash echo "Create Filesystem for new flash partition..." mkfs.vfat -n "${DISTRO_BOOTLABEL}" "${BOOT_PART}" ; sync # create fs for new /storage echo "Create Filesystem for new storage partition..." mke2fs -F -q -L "${DISTRO_DISKLABEL}" -t ext4 -m 0 "${STORAGE_PART}" ; sync # umount again umount_all # mount echo "Mount new partitions..." mkdir -p "${NEWBOOT}" "${NEWSTORAGE}" mount "${BOOT_PART}" "${NEWBOOT}" mount "${STORAGE_PART}" "${NEWSTORAGE}" # cp /flash files echo "Copy /flash files to new flash partition..." cp -a /flash/kernel.img /flash/SYSTEM /flash/dtb.img ${NEWBOOT} echo "Copy template boot.ini..." cp -a /usr/share/bootloader/${DEVICE}_boot.ini ${NEWBOOT}/boot.ini echo "Copy config.ini..." if [ -e /flash/config.ini ]; then cp -a /flash/config.ini ${NEWBOOT} else cp -a /usr/share/bootloader/config.ini ${NEWBOOT} fi sync # set our new UUID's BOOT_UUID="$(blkid ${BOOT_PART} | sed 's/.* UUID="//;s/".*//g')" STORAGE_UUID="$(blkid ${STORAGE_PART} | sed 's/.* UUID="//;s/".*//g')" echo "Set UUIDs in new boot.ini..." sed -e "s/@BOOT_UUID@/$BOOT_UUID/" \ -e "s/@DISK_UUID@/$STORAGE_UUID/" \ -i ${NEWBOOT}/boot.ini # check if there is enough space space_available=$(df "${NEWSTORAGE}" | awk 'NR==2 { print $4 }') space_required=$(df "/storage/" | awk 'NR==2 { print $3 }') if [ $space_available -ge $space_required ]; then # rsync userdata echo "Rsync /storage files to new storage partition..." rsync -Pa /storage/ $NEWSTORAGE/ else echo "Not enough space on the new storage partition. Skipping... " fi umount_all echo "All done! Please poweroff your device and remove the SD/USB." echo "Enjoy!" } if [ "$SYSTEM_BLKDEV" = "/dev/block" -o "$SYSTEM_BLKDEV" = "$BOOT_PART" ]; then echo "No no no no no! Don't use that script from eMMC otherwise it will eat your data!" exit 1 fi case $DT_ID in *odroid_n2*) DEVICE="Odroid_N2" ;; *) echo "This script is only for Odroid N2. It won't work on other devices!" exit 1 ;; esac echo $DEVICE if [ "$DEVICE" = "Odroid_N2" ]; then echo "This script will help you move a EmuELEC install on to an Odroid_N2 eMMC module" echo "from an existing EmuELEC install on an SD card or USB drive." echo "" echo "Before begining you will need to have an eMMC properly attached to your N2." echo "You will also need to start your N2 with the boot mode switch in the SPI position" echo "and boot your existing SD card or USB install using the petitboot menu." echo "After you move your EmuELEC install to the eMMC module you can return the" echo "boot mode switch to the MMC position for regular use." echo "" echo "Make sure when adding or removing the eMMC module or when toggling the boot mode" echo "switch that your Odroid N2 is powered off." echo "" read -p "Type \"yes\" if you know what you are doing or anything else to exit: " choice case "$choice" in yes) confirm_move ;; *) exit 0 ;; esac fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/initramfs/platform_init ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) display_mode=$(cat /sys/class/display/mode) # default values display_mode_user="1080p60hz" frac_rate_policy_user="0" for arg in $(cat /proc/cmdline); do case ${arg} in bootfrom*) bootfromext=1 ;; BOOT_IMAGE=*) BOOT_IMAGE=${arg#*=} ;; boot=*) boot=${arg#*=} ;; disk=*) disk=${arg#*=} ;; frac_rate_policy=*) frac_rate_policy_user=${arg#*=} ;; vout=*) vout=${arg#*=} display_mode_user=${vout%%,*} # implementation not yet finished by Amlogic #frac_rate_policy_user="0" #if [ -z ${vout##*frac*} ]; then # frac_rate_policy_user="1" #fi ;; native_4k_gui=*) native_4k_gui=${arg#*=} ;; esac done # Add information where to run CoreELEC from if [ -z "$BOOT_IMAGE" -o -z "$boot" -o -z "$disk" ]; then cmdline=$(cat /proc/cmdline) if [ -n "$bootfromext" ]; then cmdline="$cmdline BOOT_IMAGE=kernel.img boot=LABEL=@BOOT_LABEL@ disk=LABEL=@DISK_LABEL@" fi echo "$cmdline" > /proc/cmdline fi # Enable HDMI output if cable is connected and not already enabled by u-boot if [ "$(cat /sys/class/amhdmitx/amhdmitx0/hpd_state)" != "0" ]; then frac_rate_policy=$(cat /sys/devices/virtual/amhdmitx/amhdmitx0/frac_rate_policy) if [ "${frac_rate_policy}" != "${frac_rate_policy_user}" ]; then display_mode="null" echo "${display_mode}" > /sys/class/display/mode echo "${frac_rate_policy_user}" > /sys/devices/virtual/amhdmitx/amhdmitx0/frac_rate_policy fi if [ "${display_mode}" != "${display_mode_user}" ]; then echo "${display_mode_user}" > /sys/class/display/mode display_mode="${display_mode_user}" fi fi # Set framebuffer geometry to match the resolution case $display_mode in *x*) RES=${display_mode%%[ip]*} X=${RES%%x*} Y=${RES##*x};; 480*) X=720 Y=480 ;; 576*) X=720 Y=576 ;; 720p*) X=1280 Y=720 ;; 2160p*) X=3840 Y=2160 ;; *) X=1920 Y=1080 ;; esac if [ "$native_4k_gui" != "1" -a $X -gt 1920 ]; then X=1920 Y=1080 fi Y_VIRT=$(($Y * 2)) if [[ "${EE_DEVICE}" == "Amlogic" ]]; then fbset -fb /dev/fb0 -g $X $Y 1920 2160 32 else fbset -fb /dev/fb0 -g $X $Y $X $Y_VIRT 32 fi fbset -fb /dev/fb1 -g 32 32 32 32 32 echo 0 > /sys/class/graphics/fb0/free_scale echo 0 > /sys/class/graphics/fb1/free_scale echo 1 > /sys/class/video/disable_video # Enable scaling for 4K output if [ "$native_4k_gui" != "1" ]; then case $display_mode in 4k*|smpte*|2160*) echo 0 0 1919 1079 > /sys/class/graphics/fb0/free_scale_axis echo 0 0 3839 2159 > /sys/class/graphics/fb0/window_axis echo 0x10001 > /sys/class/graphics/fb0/free_scale ;; esac fi # Enable framebuffer device echo 0 > /sys/class/graphics/fb0/blank # Blank fb1 to prevent static noise echo 1 > /sys/class/graphics/fb1/blank ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/kodi/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8" ?> <settings version="1"> <section id="system"> <category id="display"> <group id="1"> <setting id="videoscreen.limitedrange"> <visible>false</visible> </setting> </group> </category> <category id="audio"> <group id="1"> <setting id="audiooutput.config"> <default>3</default> </setting> <setting id="audiooutput.streamnoise"> <default>false</default> </setting> </group> </category> </section> <section id="player"> <category id="videoplayer"> <group id="2"> <setting id="videoplayer.adjustrefreshrate"> <default>2</default> <!-- ADJUST_REFRESHRATE_ON_STARTSTOP --> <constraints> <options> <option label="351">0</option> <!-- ADJUST_REFRESHRATE_OFF --> <option label="36036">2</option> <!-- ADJUST_REFRESHRATE_ON_STARTSTOP --> <option label="36050">3</option> <!-- ADJUST_REFRESHRATE_ON_START --> </options> </constraints> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/kodi/g12x/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8" ?> <settings version="1"> <section id="system"> <category id="audio"> <group id="1"> <setting id="audiooutput.audiodevice"> <default>ALSA:surround71:CARD=AMLAUGESOUND,DEV=0</default> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/kodi/gxx/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8" ?> <settings version="1"> <section id="system"> <category id="audio"> <group id="1"> <setting id="audiooutput.audiodevice"> <default>ALSA:hdmi:CARD=AMLMESONAUDIO,DEV=0</default> </setting> <setting id="audiooutput.streamsilence"> <default>0</default> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/linux/linux.aarch64.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm64 4.9.269 Kernel Configuration # CONFIG_ARM64=y CONFIG_64BIT=y CONFIG_ARCH_PHYS_ADDR_T_64BIT=y CONFIG_MMU=y CONFIG_DEBUG_RODATA=y CONFIG_ARM64_PAGE_SHIFT=12 CONFIG_ARM64_CONT_SHIFT=4 CONFIG_ARCH_MMAP_RND_BITS_MIN=18 CONFIG_ARCH_MMAP_RND_BITS_MAX=24 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_STACKTRACE_SUPPORT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_LOCKDEP_SUPPORT=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CSUM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ZONE_DMA=y CONFIG_HAVE_GENERIC_RCU_GUP=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_SMP=y CONFIG_SWIOTLB=y CONFIG_IOMMU_HELPER=y CONFIG_KERNEL_MODE_NEON=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_PGTABLE_LEVELS=3 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_EXTABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=64 CONFIG_CROSS_COMPILE="" # CONFIG_COMPILE_TEST is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_FHANDLE is not set # CONFIG_USELIB is not set CONFIG_AUDIT=y CONFIG_HAVE_ARCH_AUDITSYSCALL=y CONFIG_AUDITSYSCALL=y CONFIG_AUDIT_WATCH=y CONFIG_AUDIT_TREE=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_HANDLE_DOMAIN_IRQ=y # CONFIG_IRQ_DOMAIN_DEBUG is not set CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y CONFIG_ARCH_CLOCKSOURCE_DATA=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set CONFIG_SCHED_WALT=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set CONFIG_TASKSTATS=y CONFIG_TASK_DELAY_ACCT=y CONFIG_TASK_XACCT=y CONFIG_TASK_IO_ACCOUNTING=y # CONFIG_PSI is not set # # RCU Subsystem # CONFIG_PREEMPT_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y # CONFIG_TASKS_RCU is not set CONFIG_RCU_STALL_COMMON=y # CONFIG_TREE_RCU_TRACE is not set # CONFIG_RCU_EXPEDITE_BOOT is not set CONFIG_BUILD_BIN2C=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=19 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_GENERIC_SCHED_CLOCK=y CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_CGROUPS=y CONFIG_CGROUP_DEBUG=y CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_PIDS=y CONFIG_CGROUP_DEVICE=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_CPUACCT=y # CONFIG_CGROUP_SCHEDTUNE is not set CONFIG_PAGE_COUNTER=y CONFIG_MEMCG=y # CONFIG_MEMCG_SWAP is not set # CONFIG_BLK_CGROUP is not set CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y # CONFIG_CFS_BANDWIDTH is not set CONFIG_RT_GROUP_SCHED=y # CONFIG_CGROUP_PERF is not set CONFIG_CGROUP_BPF=y CONFIG_SOCK_CGROUP_DATA=y # CONFIG_CHECKPOINT_RESTORE is not set CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_SCHED_AUTOGROUP is not set CONFIG_SCHED_TUNE=y CONFIG_DEFAULT_USE_ENERGY_AWARE=y # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE=" " CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 CONFIG_RD_GZIP=y CONFIG_RD_BZIP2=y CONFIG_RD_LZMA=y CONFIG_RD_XZ=y CONFIG_RD_LZO=y CONFIG_RD_LZ4=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_BPF=y CONFIG_EXPERT=y CONFIG_UID16=y CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set CONFIG_SYSFS_SYSCALL=y # CONFIG_SYSCTL_SYSCALL is not set CONFIG_KALLSYMS=y CONFIG_KALLSYMS_ALL=y # CONFIG_KALLSYMS_ABSOLUTE_PERCPU is not set CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_BPF_SYSCALL=y CONFIG_SHMEM=y CONFIG_AIO=y CONFIG_ADVISE_SYSCALLS=y # CONFIG_USERFAULTFD is not set CONFIG_PCI_QUIRKS=y CONFIG_MEMBARRIER=y CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_MEMCG_SYSFS_ON is not set # CONFIG_COMPAT_BRK is not set # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set # CONFIG_SLAB_FREELIST_RANDOM is not set CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_SYSTEM_DATA_VERIFICATION is not set CONFIG_PROFILING=y CONFIG_TRACEPOINTS=y CONFIG_KEXEC_CORE=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set # CONFIG_UPROBES is not set # CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_CLK=y CONFIG_HAVE_DMA_API_DEBUG=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_RCU_TABLE_FREE=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP_FILTER=y CONFIG_HAVE_GCC_PLUGINS=y # CONFIG_GCC_PLUGINS is not set CONFIG_HAVE_CC_STACKPROTECTOR=y # CONFIG_CC_STACKPROTECTOR is not set # CONFIG_CC_STACKPROTECTOR_NONE is not set # CONFIG_CC_STACKPROTECTOR_REGULAR is not set CONFIG_CC_STACKPROTECTOR_STRONG=y # CONFIG_CC_STACKPROTECTOR_STRONG_AMLOGIC is not set # CONFIG_LTO is not set CONFIG_ARCH_SUPPORTS_LTO_CLANG=y CONFIG_LTO_NONE=y # CONFIG_LTO_CLANG is not set CONFIG_HAVE_CONTEXT_TRACKING=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=18 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 # CONFIG_HAVE_ARCH_HASH is not set # CONFIG_ISA_BUS_API is not set CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y # CONFIG_CPU_NO_EFFICIENT_FFS is not set # CONFIG_HAVE_ARCH_VMAP_STACK is not set # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y CONFIG_HAVE_GENERIC_DMA_COHERENT=y CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set CONFIG_MODVERSIONS=y # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set # CONFIG_MODULE_COMPRESS is not set # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLK_DEV_BSG=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_CMDLINE_PARSER is not set # # Partition Types # # CONFIG_PARTITION_ADVANCED is not set CONFIG_MSDOS_PARTITION=y CONFIG_EFI_PARTITION=y CONFIG_BLOCK_COMPAT=y CONFIG_BLK_MQ_PCI=y # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set CONFIG_DEFAULT_NOOP=y CONFIG_DEFAULT_IOSCHED="noop" CONFIG_ASN1=y CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_FREEZER=y # # Platform selection # # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_BCM2835 is not set # CONFIG_ARCH_BCM_IPROC is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_BRCMSTB is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_LAYERSCAPE is not set # CONFIG_ARCH_LG1K is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_MEDIATEK is not set # CONFIG_ARCH_MESON is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_ROCKCHIP is not set # CONFIG_ARCH_SEATTLE is not set # CONFIG_ARCH_RENESAS is not set # CONFIG_ARCH_STRATIX10 is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_SPRD is not set # CONFIG_ARCH_THUNDER is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_VULCAN is not set # CONFIG_ARCH_XGENE is not set # CONFIG_ARCH_ZX is not set # CONFIG_ARCH_ZYNQMP is not set # # Bus support # CONFIG_PCI=y CONFIG_PCI_DOMAINS=y CONFIG_PCI_DOMAINS_GENERIC=y CONFIG_PCI_SYSCALL=y CONFIG_PCIEPORTBUS=y CONFIG_PCIEAER=y # CONFIG_PCIE_ECRC is not set # CONFIG_PCIEAER_INJECT is not set CONFIG_PCIEASPM=y # CONFIG_PCIEASPM_DEBUG is not set CONFIG_PCIEASPM_DEFAULT=y # CONFIG_PCIEASPM_POWERSAVE is not set # CONFIG_PCIEASPM_PERFORMANCE is not set CONFIG_PCIE_PME=y CONFIG_PCIE_DPC=y CONFIG_PCIE_PTM=y CONFIG_PCI_BUS_ADDR_T_64BIT=y CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y # CONFIG_PCI_DEBUG is not set # CONFIG_PCI_REALLOC_ENABLE_AUTO is not set # CONFIG_PCI_STUB is not set # CONFIG_PCI_IOV is not set # CONFIG_PCI_PRI is not set # CONFIG_PCI_PASID is not set # CONFIG_HOTPLUG_PCI is not set # # PCI host controller drivers # CONFIG_PCIE_DW_PLAT=y CONFIG_PCIE_DW=y # CONFIG_PCI_HOST_GENERIC is not set # CONFIG_PCI_HISI is not set # CONFIG_PCI_HOST_THUNDER_PEM is not set # CONFIG_PCI_HOST_THUNDER_ECAM is not set # # Kernel Features # # # ARM errata workarounds via the alternatives framework # CONFIG_ARM64_ERRATUM_826319=y CONFIG_ARM64_ERRATUM_827319=y CONFIG_ARM64_ERRATUM_824069=y CONFIG_ARM64_ERRATUM_819472=y CONFIG_ARM64_ERRATUM_832075=y CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_ERRATUM_1024718=y CONFIG_CAVIUM_ERRATUM_22375=y CONFIG_CAVIUM_ERRATUM_23154=y CONFIG_CAVIUM_ERRATUM_27456=y CONFIG_QCOM_QDF2400_ERRATUM_0065=y CONFIG_ARM64_4K_PAGES=y # CONFIG_ARM64_16K_PAGES is not set # CONFIG_ARM64_64K_PAGES is not set CONFIG_ARM64_VA_BITS_39=y # CONFIG_ARM64_VA_BITS_48 is not set CONFIG_ARM64_VA_BITS=39 # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_SCHED_MC=y # CONFIG_SCHED_SMT is not set CONFIG_NR_CPUS=8 CONFIG_HOTPLUG_CPU=y # CONFIG_NUMA is not set # CONFIG_PREEMPT_NONE is not set # CONFIG_PREEMPT_VOLUNTARY is not set CONFIG_PREEMPT=y CONFIG_PREEMPT_COUNT=y # CONFIG_HZ_100 is not set CONFIG_HZ_250=y # CONFIG_HZ_300 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=250 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_HAVE_ARCH_PFN_VALID=y CONFIG_HW_PERF_EVENTS=y CONFIG_SYS_SUPPORTS_HUGETLBFS=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SPARSEMEM_MANUAL=y CONFIG_SPARSEMEM=y CONFIG_HAVE_MEMORY_PRESENT=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_MEMBLOCK=y CONFIG_NO_BOOTMEM=y CONFIG_MEMORY_ISOLATION=y # CONFIG_HAVE_BOOTMEM_INFO_NODE is not set CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_COMPACTION=y CONFIG_MIGRATION=y CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_BOUNCE=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 # CONFIG_TRANSPARENT_HUGEPAGE is not set # CONFIG_CLEANCACHE is not set # CONFIG_FRONTSWAP is not set CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set CONFIG_CMA_DEBUGFS=y CONFIG_CMA_AREAS=15 # CONFIG_ZPOOL is not set # CONFIG_ZBUD is not set CONFIG_ZSMALLOC=y # CONFIG_PGTABLE_MAPPING is not set # CONFIG_ZSMALLOC_STAT is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_FRAME_VECTOR=y CONFIG_SECCOMP=y # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set CONFIG_KEXEC=y # CONFIG_XEN is not set CONFIG_FORCE_MAX_ZONEORDER=11 # CONFIG_UNMAP_KERNEL_AT_EL0 is not set # CONFIG_HARDEN_BRANCH_PREDICTOR is not set # CONFIG_ARM64_SSBD is not set CONFIG_ARMV8_DEPRECATED=y CONFIG_SWP_EMULATION=y CONFIG_CP15_BARRIER_EMULATION=y CONFIG_SETEND_EMULATION=y # CONFIG_ARM64_SW_TTBR0_PAN is not set # # ARMv8.1 architectural features # CONFIG_ARM64_HW_AFDBM=y CONFIG_ARM64_PAN=y # CONFIG_ARM64_LSE_ATOMICS is not set CONFIG_ARM64_VHE=y # # ARMv8.2 architectural features # CONFIG_ARM64_UAO=y CONFIG_ARM64_MODULE_CMODEL_LARGE=y CONFIG_ARM64_MODULE_PLTS=y CONFIG_RELOCATABLE=y CONFIG_RANDOMIZE_BASE=y # # Boot options # CONFIG_CMDLINE="systemd.show_status=auto" # CONFIG_CMDLINE_FROM_BOOTLOADER is not set CONFIG_CMDLINE_EXTEND=y # CONFIG_CMDLINE_FORCE is not set # CONFIG_EFI is not set # CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE is not set # # Userspace binary formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ELFCORE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y # CONFIG_HAVE_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_COREDUMP=y CONFIG_COMPAT=y CONFIG_SYSVIPC_COMPAT=y CONFIG_KEYS_COMPAT=y # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_SUSPEND_SKIP_SYNC is not set # CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y CONFIG_PM_AUTOSLEEP=y CONFIG_PM_WAKELOCKS=y CONFIG_PM_WAKELOCKS_LIMIT=100 CONFIG_PM_WAKELOCKS_GC=y CONFIG_PM=y # CONFIG_PM_DEBUG is not set CONFIG_PM_OPP=y CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_PM_GENERIC_DOMAINS_SLEEP=y CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y # # CPU Power Management # # # CPU Idle # 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_DT_IDLE_STATES=y # # ARM CPU Idle Drivers # CONFIG_ARM_CPUIDLE=y # CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_STAT_DETAILS is not set CONFIG_CPU_FREQ_TIMES=y CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_GOV_USERSPACE is not set CONFIG_CPU_FREQ_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_GOV_INTERACTIVE is not set # CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set # # CPU frequency scaling drivers # # CONFIG_CPUFREQ_DT is not set CONFIG_ARM_BIG_LITTLE_CPUFREQ=y # CONFIG_ARM_DT_BL_CPUFREQ is not set # CONFIG_ARM_KIRKWOOD_CPUFREQ is not set CONFIG_ARM_SCPI_CPUFREQ=y CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y # CONFIG_UNIX_DIAG is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y CONFIG_XFRM_INTERFACE=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set # CONFIG_NET_KEY is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=m CONFIG_IP_MROUTE=y # CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set # CONFIG_IP_PIMSM_V1 is not set # CONFIG_IP_PIMSM_V2 is not set # CONFIG_SYN_COOKIES is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set CONFIG_INET_ESP=y # CONFIG_INET_IPCOMP is not set # CONFIG_INET_XFRM_TUNNEL is not set CONFIG_INET_TUNNEL=m # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_DIAG is not set CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set CONFIG_TCP_CONG_CUBIC=y # CONFIG_TCP_CONG_WESTWOOD is not set # CONFIG_TCP_CONG_HTCP is not set # CONFIG_TCP_CONG_HSTCP is not set # CONFIG_TCP_CONG_HYBLA is not set # CONFIG_TCP_CONG_VEGAS is not set # CONFIG_TCP_CONG_NV is not set # CONFIG_TCP_CONG_SCALABLE is not set # CONFIG_TCP_CONG_LP is not set # CONFIG_TCP_CONG_VENO is not set # CONFIG_TCP_CONG_YEAH is not set # CONFIG_TCP_CONG_ILLINOIS is not set # CONFIG_TCP_CONG_DCTCP is not set # CONFIG_TCP_CONG_CDG is not set CONFIG_TCP_CONG_BBR=y CONFIG_DEFAULT_CUBIC=y # CONFIG_DEFAULT_BBR is not set # CONFIG_DEFAULT_RENO is not set CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set # CONFIG_INET6_XFRM_MODE_TRANSPORT is not set # CONFIG_INET6_XFRM_MODE_TUNNEL is not set # CONFIG_INET6_XFRM_MODE_BEET is not set # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set CONFIG_IPV6_FOU=m # CONFIG_IPV6_FOU_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set CONFIG_NETLABEL=y # CONFIG_ANDROID_PARANOID_NETWORK is not set CONFIG_NETWORK_SECMARK=y CONFIG_NET_PTP_CLASSIFY=y # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # # CONFIG_NETFILTER_INGRESS is not set CONFIG_NETFILTER_NETLINK=m # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set CONFIG_NETFILTER_NETLINK_LOG=m CONFIG_NF_CONNTRACK=m CONFIG_NF_CONNTRACK_MARK=y # CONFIG_NF_CONNTRACK_SECMARK is not set # CONFIG_NF_CONNTRACK_PROCFS is not set # CONFIG_NF_CONNTRACK_EVENTS is not set # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CT_PROTO_DCCP is not set # CONFIG_NF_CT_PROTO_SCTP is not set # CONFIG_NF_CT_PROTO_UDPLITE is not set # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set CONFIG_NF_CONNTRACK_IRC=m CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set CONFIG_NF_CONNTRACK_SIP=m CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m # CONFIG_NF_CT_NETLINK_TIMEOUT is not set # CONFIG_NETFILTER_NETLINK_GLUE_CT is not set CONFIG_NF_NAT=m CONFIG_NF_NAT_NEEDED=y # CONFIG_NF_NAT_AMANDA is not set CONFIG_NF_NAT_FTP=m CONFIG_NF_NAT_IRC=m CONFIG_NF_NAT_SIP=m CONFIG_NF_NAT_TFTP=m CONFIG_NF_NAT_REDIRECT=m # CONFIG_NF_TABLES is not set CONFIG_NETFILTER_XTABLES=m # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m CONFIG_NETFILTER_XT_CONNMARK=m # CONFIG_NETFILTER_XT_SET is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_AUDIT is not set # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set CONFIG_NETFILTER_XT_TARGET_REDIRECT=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_SECMARK is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m CONFIG_NETFILTER_XT_MATCH_BPF=m # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m CONFIG_NETFILTER_XT_MATCH_CONNMARK=m CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set CONFIG_NETFILTER_XT_MATCH_ECN=m # CONFIG_NETFILTER_XT_MATCH_ESP is not set CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m CONFIG_NETFILTER_XT_MATCH_HELPER=m CONFIG_NETFILTER_XT_MATCH_HL=m # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set CONFIG_NETFILTER_XT_MATCH_IPRANGE=m CONFIG_NETFILTER_XT_MATCH_IPVS=m CONFIG_NETFILTER_XT_MATCH_L2TP=m CONFIG_NETFILTER_XT_MATCH_LENGTH=m CONFIG_NETFILTER_XT_MATCH_LIMIT=m CONFIG_NETFILTER_XT_MATCH_MAC=m CONFIG_NETFILTER_XT_MATCH_MARK=m # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set CONFIG_NETFILTER_XT_MATCH_OWNER=m # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA2 is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set CONFIG_NETFILTER_XT_MATCH_STATE=m # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set CONFIG_IP_SET=m CONFIG_IP_SET_MAX=256 CONFIG_IP_SET_BITMAP_IP=m CONFIG_IP_SET_BITMAP_IPMAC=m CONFIG_IP_SET_BITMAP_PORT=m CONFIG_IP_SET_HASH_IP=m CONFIG_IP_SET_HASH_IPMARK=m CONFIG_IP_SET_HASH_IPPORT=m CONFIG_IP_SET_HASH_IPPORTIP=m CONFIG_IP_SET_HASH_IPPORTNET=m CONFIG_IP_SET_HASH_MAC=m CONFIG_IP_SET_HASH_NETPORTNET=m CONFIG_IP_SET_HASH_NET=m CONFIG_IP_SET_HASH_NETNET=m CONFIG_IP_SET_HASH_NETPORT=m CONFIG_IP_SET_HASH_NETIFACE=m CONFIG_IP_SET_LIST_SET=m CONFIG_IP_VS=m CONFIG_IP_VS_IPV6=y # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # CONFIG_IP_VS_PROTO_AH_ESP is not set # CONFIG_IP_VS_PROTO_ESP is not set # CONFIG_IP_VS_PROTO_AH is not set # CONFIG_IP_VS_PROTO_SCTP is not set # # IPVS scheduler # CONFIG_IP_VS_RR=m # CONFIG_IP_VS_WRR is not set # CONFIG_IP_VS_LC is not set # CONFIG_IP_VS_WLC is not set # CONFIG_IP_VS_FO is not set # CONFIG_IP_VS_OVF is not set # CONFIG_IP_VS_LBLC is not set # CONFIG_IP_VS_LBLCR is not set # CONFIG_IP_VS_DH is not set # CONFIG_IP_VS_SH is not set # CONFIG_IP_VS_SED is not set # CONFIG_IP_VS_NQ is not set # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS application helper # CONFIG_IP_VS_FTP=m CONFIG_IP_VS_NFCT=y CONFIG_IP_VS_PE_SIP=m # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m CONFIG_NF_CONNTRACK_IPV4=m # CONFIG_NF_DUP_IPV4 is not set # 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=m # CONFIG_NF_NAT_PPTP is not set # CONFIG_NF_NAT_H323 is not set CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_SECURITY is not set # CONFIG_IP_NF_ARPTABLES is not set # # IPv6: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV6=m CONFIG_NF_CONNTRACK_IPV6=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_NF_NAT_MASQUERADE_IPV6=m CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set # CONFIG_IP6_NF_SECURITY is not set CONFIG_IP6_NF_NAT=m # CONFIG_IP6_NF_TARGET_MASQUERADE is not set # CONFIG_IP6_NF_TARGET_NPT is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y CONFIG_HAVE_NET_DSA=y # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set # CONFIG_DECNET is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set CONFIG_NET_SCH_FQ_CODEL=y CONFIG_NET_SCH_FQ=y # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # # Classification # # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_TCINDEX is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_RSVP is not set # CONFIG_NET_CLS_RSVP6 is not set # CONFIG_NET_CLS_FLOW is not set # CONFIG_NET_CLS_CGROUP is not set # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set CONFIG_NET_L3_MASTER_DEV=y # CONFIG_NET_NCSI is not set CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_XPS=y # CONFIG_CGROUP_NET_PRIO is not set # CONFIG_CGROUP_NET_CLASSID is not set CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_JIT is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set CONFIG_BT=m CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y # CONFIG_BT_BNEP is not set CONFIG_BT_HIDP=m CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_LEDS is not set # CONFIG_BT_SELFTEST is not set # CONFIG_BT_DEBUGFS is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_QCA=m CONFIG_BT_HCIBTUSB=m CONFIG_BT_HCIBTUSB_BCM=y CONFIG_BT_HCIBTUSB_RTL=y # CONFIG_BT_HCIBTSDIO is not set CONFIG_BT_HCIUART=m CONFIG_BT_HCIUART_H4=y 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 CONFIG_BT_HCIBPA10X=m CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIVHCI=m CONFIG_BT_MRVL=m CONFIG_BT_MRVL_SDIO=m CONFIG_BT_ATH3K=m CONFIG_AF_RXRPC=m # CONFIG_AF_RXRPC_IPV6 is not set # CONFIG_AF_RXRPC_INJECT_LOSS is not set # CONFIG_AF_RXRPC_DEBUG is not set # CONFIG_RXKAD is not set # CONFIG_AF_KCM is not set # CONFIG_STREAM_PARSER is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=y CONFIG_NL80211_TESTMODE=y # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set # CONFIG_CFG80211_INTERNAL_REGDB is not set CONFIG_CFG80211_CRDA_SUPPORT=y CONFIG_CFG80211_WEXT=y CONFIG_LIB80211=m # CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=y CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_MINSTREL_HT=y # CONFIG_MAC80211_RC_MINSTREL_VHT is not set CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 # CONFIG_WIMAX is not set CONFIG_RFKILL=y CONFIG_RFKILL_PM=y CONFIG_RFKILL_LEDS=y # CONFIG_RFKILL_INPUT is not set # CONFIG_RFKILL_REGULATOR is not set # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set CONFIG_CEPH_LIB=m # CONFIG_CEPH_LIB_PRETTYDEBUG is not set # CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set CONFIG_NFC=m CONFIG_NFC_DIGITAL=m CONFIG_NFC_NCI=m CONFIG_NFC_NCI_SPI=m CONFIG_NFC_NCI_UART=m CONFIG_NFC_HCI=m CONFIG_NFC_SHDLC=y # # Near Field Communication (NFC) devices # CONFIG_NFC_TRF7970A=m CONFIG_NFC_SIM=m CONFIG_NFC_PORT100=m CONFIG_NFC_FDP=m CONFIG_NFC_FDP_I2C=m CONFIG_NFC_PN544=m CONFIG_NFC_PN544_I2C=m CONFIG_NFC_PN533=m CONFIG_NFC_PN533_USB=m CONFIG_NFC_PN533_I2C=m CONFIG_NFC_MICROREAD=m CONFIG_NFC_MICROREAD_I2C=m CONFIG_NFC_MRVL=m CONFIG_NFC_MRVL_USB=m CONFIG_NFC_MRVL_UART=m CONFIG_NFC_MRVL_I2C=m CONFIG_NFC_MRVL_SPI=m CONFIG_NFC_ST21NFCA=m CONFIG_NFC_ST21NFCA_I2C=m CONFIG_NFC_ST_NCI=m CONFIG_NFC_ST_NCI_I2C=m CONFIG_NFC_ST_NCI_SPI=m CONFIG_NFC_NXP_NCI=m CONFIG_NFC_NXP_NCI_I2C=m CONFIG_NFC_S3FWRN5=m CONFIG_NFC_S3FWRN5_I2C=m CONFIG_NFC_ST95HF=m CONFIG_LWTUNNEL=y CONFIG_DST_CACHE=y # CONFIG_NET_DEVLINK is not set CONFIG_MAY_USE_DEVLINK=y CONFIG_HAVE_EBPF_JIT=y # # Device Drivers # CONFIG_AMLOGIC_DRIVER=y CONFIG_AMLOGIC_MODIFY=y # CONFIG_AMLOGIC_SYNC_20210524 is not set # # Amlogic Device Drivers # CONFIG_AMLOGIC_CPUFREQ=y CONFIG_AMLOGIC_MESON_CPUFREQ=y CONFIG_AMLOGIC_UART=y CONFIG_AMLOGIC_SERIAL_MESON_CONSOLE=y # CONFIG_AMLOGIC_PRINTK_NOBLOCK_MODE is not set CONFIG_AMLOGIC_IOMAP=y CONFIG_AMLOGIC_PINCTRL=y CONFIG_AMLOGIC_PINCTRL_MESON_GXL=y CONFIG_AMLOGIC_PINCTRL_MESON_AXG=y CONFIG_AMLOGIC_PINCTRL_MESON_TXLX=y CONFIG_AMLOGIC_PINCTRL_MESON_G12A=y # CONFIG_AMLOGIC_PINCTRL_MESON_TXL is not set # CONFIG_AMLOGIC_PINCTRL_MESON_TL1 is not set # CONFIG_AMLOGIC_PINCTRL_MESON_TM2 is not set CONFIG_AMLOGIC_PINCTRL_MESON_SC2=y CONFIG_AMLOGIC_PINCONF_MESON_G12A=y CONFIG_AMLOGIC_PINCTRL_MESON8_PMX=y CONFIG_AMLOGIC_PINCTRL_MESON_AXG_PMX=y # # USB Support # CONFIG_AMLOGIC_USB=y CONFIG_AMLOGIC_USB_DWC_OTG_HCD=y CONFIG_AMLOGIC_USB_HOST_ELECT_TEST=y CONFIG_AMLOGIC_USBPHY=y CONFIG_AMLOGIC_USB2PHY=y CONFIG_AMLOGIC_USB3PHY=y # # I2C Hardware Bus support # CONFIG_AMLOGIC_I2C=y CONFIG_AMLOGIC_I2C_SLAVE=y CONFIG_AMLOGIC_I2C_MASTER=y # # AMLOGIC SPI Hardware bus support # CONFIG_AMLOGIC_SPICC_MASTER=y # CONFIG_AMLOGIC_SPICC_SLAVE is not set CONFIG_AMLOGIC_SEC=y CONFIG_AMLOGIC_CPU_VERSION=y CONFIG_AMLOGIC_MESON64_VERSION=y # CONFIG_AMLOGIC_M8B_MESON32_VERSION is not set CONFIG_AMLOGIC_CPU_INFO=y # # MESON MHU mailbox Support # CONFIG_AMLOGIC_MHU_MBOX=y CONFIG_ARM_SCPI_PROTOCOL=y CONFIG_AMLOGIC_REG_ACCESS=y CONFIG_AMLOGIC_TIMER=y # CONFIG_AMLOGIC_LOCAL_TIMER is not set CONFIG_AMLOGIC_BC_TIMER=y CONFIG_AMLOGIC_CLK=y CONFIG_AMLOGIC_COMMON_CLK_SCPI=y # CONFIG_AMLOGIC_M8B_CLK is not set CONFIG_AMLOGIC_GX_CLK=y # # Amlogic Crypto Support # CONFIG_AMLOGIC_CRYPTO=y CONFIG_AMLOGIC_CRYPTO_DMA=y # CONFIG_AMLOGIC_CRYPTO_BLKMV is not set CONFIG_AMLOGIC_INPUT=y # CONFIG_AMLOGIC_AVIN_DETECT is not set CONFIG_AMLOGIC_INPUT_KEYBOARD=y CONFIG_AMLOGIC_ADC_KEYPADS=y CONFIG_AMLOGIC_GPIO_KEY=y # CONFIG_AMLOGIC_PCA9557_KEYPAD is not set CONFIG_AMLOGIC_REMOTE=y CONFIG_AMLOGIC_MESON_REMOTE=m CONFIG_AMLOGIC_TOUCHSCREEN=y CONFIG_AMLOGIC_TOUCHSCREEN_FTS=y CONFIG_AMLOGIC_TOUCHSCREEN_GT1X=y CONFIG_AMLOGIC_TOUCHSCREEN_GT9XX=y # CONFIG_AMLOGIC_TOUCHSCREEN_HYN_CST2XX is not set # CONFIG_AMLOGIC_SENSOR is not set # # EFUSE Support # CONFIG_AMLOGIC_EFUSE=y # CONFIG_AMLOGIC_EFUSE_WRITE_VERSION_PERMIT is not set CONFIG_AMLOGIC_REBOOT=y CONFIG_AMLOGIC_GX_REBOOT=y # CONFIG_AMLOGIC_M8B_REBOOT is not set CONFIG_AMLOGIC_INTERNAL_PHY=y CONFIG_AMLOGIC_CPU_HOTPLUG=y CONFIG_AMLOGIC_PWM=y CONFIG_AMLOGIC_PWM_V2=y # # Amlogic dvb configuration # # CONFIG_AMLOGIC_DVB is not set CONFIG_AMLOGIC_DVB_COMPAT=y # # Amlogic multimedia configuration # CONFIG_AMLOGIC_MEDIA_ENABLE=y CONFIG_AMLOGIC_MEDIA_COMMON=y CONFIG_AMLOGIC_MEDIA_DRIVERS=y CONFIG_AMLOGIC_MEDIA_MULTI_DEC=y # CONFIG_AMLOGIC_AVSP_LONG_CABAC is not set CONFIG_AMLOGIC_MEDIA_CODEC_MM=y # # Canvas management driver # CONFIG_AMLOGIC_MEDIA_CANVAS=y # # Amlogic GE2D Module # CONFIG_AMLOGIC_MEDIA_GE2D=y # CONFIG_AMLOGIC_MEDIA_GE2D_MORE_SECURITY is not set # # ION support # CONFIG_AMLOGIC_ION=y # # RDMA management driver # CONFIG_AMLOGIC_MEDIA_RDMA=y CONFIG_AMLOGIC_MEDIA_VSYNC_RDMA=y # CONFIG_AMLOGIC_UVM_CORE is not set # CONFIG_AMLOGIC_UVM_ALLOCATOR is not set # CONFIG_AMLOGIC_ION_DELAY_ALLOC is not set CONFIG_AMLOGIC_MEDIA_VFM=y # # Amlogic VPU Driver Support # CONFIG_AMLOGIC_VPU=y # CONFIG_AMLOGIC_VPU_DYNAMIC_ADJ is not set CONFIG_AMLOGIC_VIDEOBUF_RESOURCE=m # # LUT DMA management driver # # CONFIG_AMLOGIC_MEDIA_LUT_DMA is not set # # ResManage driver # # CONFIG_AMLOGIC_MEDIA_RESMANAGE is not set # # VPU SECURITY driver # # CONFIG_AMLOGIC_MEDIA_SECURITY is not set # # Amlogic Video Sink Driver Support # CONFIG_AMLOGIC_MEDIA_VIDEO=y CONFIG_AMLOGIC_MEDIA_VIDEOCAPTURE=y # # Amlogic Vout Driver Support # CONFIG_AMLOGIC_VOUT=y CONFIG_AMLOGIC_VOUT_CLK_SERVE=y CONFIG_AMLOGIC_VDAC=y CONFIG_AMLOGIC_CVBS_OUTPUT=y CONFIG_AMLOGIC_WSS=y # # Amlogic HDMITX Module # CONFIG_AMLOGIC_HDMITX=y # # Amlogic LCD Output Module # CONFIG_AMLOGIC_LCD=y CONFIG_AMLOGIC_LCD_TV=y CONFIG_AMLOGIC_LCD_TABLET=y CONFIG_AMLOGIC_LCD_EXTERN=y # CONFIG_AMLOGIC_LCD_EXTERN_I2C_T5800Q is not set # CONFIG_AMLOGIC_LCD_EXTERN_I2C_ANX6862_7911 is not set # CONFIG_AMLOGIC_LCD_EXTERN_I2C_DLPC3439 is not set # CONFIG_AMLOGIC_LCD_EXTERN_I2C_ANX6345 is not set # CONFIG_AMLOGIC_LCD_EXTERN_I2C_CS602 is not set # CONFIG_AMLOGIC_LCD_EXTERN_SPI_LD070WS2 is not set # CONFIG_AMLOGIC_LCD_EXTERN_MIPI_KD080D13 is not set # CONFIG_AMLOGIC_LCD_EXTERN_MIPI_N070ICN is not set # CONFIG_AMLOGIC_LCD_EXTERN_MIPI_TV070WSM is not set # CONFIG_AMLOGIC_LCD_EXTERN_MIPI_ST7701 is not set # CONFIG_AMLOGIC_LCD_EXTERN_MIPI_P070ACB is not set # CONFIG_AMLOGIC_LCD_EXTERN_MIPI_TL050FHV02CT is not set # # Amlogic Backlight Support # CONFIG_AMLOGIC_BACKLIGHT=y CONFIG_AMLOGIC_BL_EXTERN=y CONFIG_AMLOGIC_BL_EXTERN_I2C_LP8556=y CONFIG_AMLOGIC_BL_EXTERN_MIPI_LT070ME05=y CONFIG_AMLOGIC_LOCAL_DIMMING=y CONFIG_CONFIG_AML_LOCAL_DIMMING_IW7038=y CONFIG_CONFIG_AML_LOCAL_DIMMING_IW7027=y CONFIG_AMLOGIC_VOUT_SERVE=y CONFIG_AMLOGIC_VOUT2_SERVE=y # # Amlogic Peripheral_lcd Support # # CONFIG_AMLOGIC_PERIPHERAL_LCD is not set # # Amlogic OSD Module # CONFIG_AMLOGIC_MEDIA_FB=y # CONFIG_AMLOGIC_MEDIA_FB_OSD_SYNC_FENCE is not set CONFIG_AMLOGIC_MEDIA_FB_OSD_VSYNC_RDMA=y CONFIG_AMLOGIC_MEDIA_FB_OSD2_ENABLE=y CONFIG_AMLOGIC_MEDIA_FB_OSD2_CURSOR=y # # Amlogic OSD_EXT Module # # CONFIG_AMLOGIC_MEDIA_FB_EXT is not set # # Deinterlace driver # CONFIG_AMLOGIC_MEDIA_DEINTERLACE=y # # DI_MULTI driver # # # DI_LOCAL driver # # # Input drivers # # CONFIG_AMLOGIC_MEDIA_VIN is not set # # Amlogic Video Processor Support # CONFIG_AMLOGIC_MEDIA_VIDEO_PROCESSOR=y # # V4L2 Video Support # CONFIG_AMLOGIC_V4L_VIDEO=m # CONFIG_AMLOGIC_V4L_VIDEO2 is not set # # Post Process Manager driver # CONFIG_AMLOGIC_POST_PROCESS_MANAGER=y CONFIG_AMLOGIC_POST_PROCESS_MANAGER_PPSCALER=y # CONFIG_AMLOGIC_POST_PROCESS_MANAGER_3D_PROCESS is not set # # Amlogic ion video support # # CONFIG_AMLOGIC_VIDEOBUF2_ION is not set # # Amlogic picture decoder support # # CONFIG_AMLOGIC_PIC_DEC is not set # # Amlogic videosync support # # CONFIG_AMLOGIC_VIDEOSYNC is not set # # Amlogic v4l video support # # CONFIG_AMLOGIC_V4L_VIDEO3 is not set # # Amlogic video_composer support # # CONFIG_AMLOGIC_VIDEO_COMPOSER is not set # # Amlogic video tunnel support # # CONFIG_AMLOGIC_VIDEO_TUNNEL is not set # # Amlogic Enhancement drivers # CONFIG_AMLOGIC_MEDIA_ENHANCEMENT=y # # Amlogic VECM Drivers # # # Amlogic amvecm Driver # CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_VECM=y # # Amlogic amdolby_vision Drivers # # # Amlogic amdolby_vision Driver # CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION=y # # Amlogic amprime_sl Drivers # # # Amlogic amprime_sl Driver # # CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_PRIME_SL is not set # CONFIG_AMLOGIC_MEDIA_GDC is not set # # Amlogic multimedia algorithm configuration # # CONFIG_AMLOGIC_MEDIA_ALGORITHM is not set # # Amlogic Camera Support # # CONFIG_AMLOGIC_VIDEO_CAPTURE is not set # CONFIG_AMLOGIC_VIDEOIN_MANAGER is not set # CONFIG_AMLOGIC_MEDIA_MSYNC is not set # # Amlogic DTV driver # # CONFIG_AMLOGIC_DTV_DEMOD is not set # # MMC/SD/SDIO Host Controller Drivers # # # Multimedia Card support # CONFIG_AMLOGIC_MMC=y # CONFIG_AMLOGIC_M8B_MMC is not set # # Meson NAND Device Support # CONFIG_AMLOGIC_NAND=y # # Meson8B NAND Device Support # CONFIG_AMLOGIC_VRTC=y CONFIG_AMLOGIC_SMARTCARD=y CONFIG_AMLOGIC_CEC=y CONFIG_AMLOGIC_AO_CEC=y # # unifykey Support # CONFIG_AMLOGIC_UNIFYKEY=y CONFIG_AMLOGIC_V8_UNIFYKEY=y # CONFIG_AMLOGIC_V7_UNIFYKEY is not set # # Amlogic temperature sensor # CONFIG_AMLOGIC_TEMP_SENSOR=y CONFIG_AMLOGIC_GX_TEMP_SENSOR=y CONFIG_AMLOGIC_CPUCORE_THERMAL=y CONFIG_AMLOGIC_GPU_THERMAL=y CONFIG_AMLOGIC_GPUCORE_THERMAL=y # # Audio Interface # CONFIG_AMLOGIC_AMAUDIO=y # # Amlogic Audio Interface V2 # CONFIG_AMLOGIC_AMAUDIO2=y # CONFIG_AMLKARAOKE is not set # # AMLOGIC Audio DSP process # CONFIG_AMLOGIC_AUDIO_DSP=y # # AMLOGIC Audio Info # CONFIG_AMLOGIC_AUDIO_INFO=y # # Meson core pm driver # CONFIG_AMLOGIC_SUSPEND=y CONFIG_AMLOGIC_GX_SUSPEND=y CONFIG_AMLOGIC_LEGACY_EARLY_SUSPEND=y CONFIG_AMLOGIC_LED=y CONFIG_AMLOGIC_LED_SYS=y # CONFIG_AMLOGIC_LEDS_TLC59116 is not set # CONFIG_AMLOGIC_LEDS_STATE is not set CONFIG_AMLOGIC_JTAG=y CONFIG_AMLOGIC_JTAG_MESON=y CONFIG_AMLOGIC_WDT=y CONFIG_AMLOGIC_WDT_MESON=y CONFIG_AMLOGIC_WDT_MESON_V3=y # # ESM Support # CONFIG_AMLOGIC_ESM=y CONFIG_AMLOGIC_WIFI=y CONFIG_AMLOGIC_BT_DEVICE=y # # AMLOGIC DVB EXTERN support # # CONFIG_AMLOGIC_DVB_EXTERN is not set # # DVB AUCPU support # CONFIG_AMLOGIC_AUCPU=y # # AMLOGIC DVB demux/dsc support # CONFIG_AMLOGIC_DVB_DMX=m # # DVB COMPAT support # CONFIG_AMLOGIC_POWER=y # CONFIG_AMLOGIC_PMU_OF is not set # CONFIG_AMLOGIC_PMU is not set # CONFIG_AMLOGIC_M8B_DVFS is not set # # Multimedia Card support # CONFIG_AMLOGIC_PCIE=y # CONFIG_AMLOGIC_IRBLASTER_CORE is not set CONFIG_AMLOGIC_IIO=y # # Analog to digital converters # CONFIG_AMLOGIC_SARADC=y CONFIG_AMLOGIC_DDR_TOOL=y # CONFIG_AMLOGIC_DDR_WINDOW_TOOL is not set CONFIG_AMLOGIC_DDR_BANDWIDTH=y CONFIG_AMLOGIC_DDR_BANDWIDTH_GX=y CONFIG_AMLOGIC_DMC_MONITOR=y CONFIG_AMLOGIC_DMC_MONITOR_GX=y # CONFIG_AMLOGIC_DRM is not set # CONFIG_AMLOGIC_SM is not set CONFIG_AMLOGIC_TEE=y # CONFIG_AMLOGIC_LEDRING is not set CONFIG_AMLOGIC_MEMORY_EXTEND=y # CONFIG_AMLOGIC_PAGE_TRACE is not set CONFIG_AMLOGIC_RAMDUMP=y CONFIG_AMLOGIC_CMA=y # CONFIG_AMLOGIC_VMAP is not set # CONFIG_AMLOGIC_WATCHPOINT is not set CONFIG_AMLOGIC_GPIO_IRQ=y # # Amlogic ATV driver # # CONFIG_AMLOGIC_ATV_DEMOD is not set CONFIG_AMLOGIC_DEBUG=y CONFIG_AMLOGIC_DEBUG_LOCKUP=y # CONFIG_AMLOGIC_DEBUG_ATRACE is not set # CONFIG_AMLOGIC_DEBUG_SCRAMBLER_RAMOOPS is not set # # Amlogic defend img file update support # CONFIG_AMLOGIC_DEFENDKEY=y # CONFIG_AMLOGIC_BATTERY_DUMMY is not set # CONFIG_AMLOGIC_CHARGER_DUMMY is not set # # Meson SPI NOR Flash Support # CONFIG_SPI_AML_SPIFC=y CONFIG_DOLBY_FW=y # CONFIG_AMLOGIC_IRCUT is not set # # AMLOGIC HiFi4DSP process # # CONFIG_AMLOGIC_HIFI4DSP is not set # CONFIG_AMLOGIC_PIXEL_PROBE is not set # # AMLOGIC firmware boot # # CONFIG_AMLOGIC_FIRMWARE is not set CONFIG_AMLOGIC_RESET_MESON=y # # AMLOGIC DVB EXTERN support # # # DVB AUCPU support # # # AMLOGIC DVB demux/dsc support # # # DVB COMPAT support # CONFIG_AMLOGIC_SOC_INFO=y CONFIG_ARM_AMBA=y # # Generic Driver Options # CONFIG_UEVENT_HELPER=y CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set CONFIG_WANT_DEV_COREDUMP=y CONFIG_ALLOW_DEV_COREDUMP=y CONFIG_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_SYS_HYPERVISOR is not set # CONFIG_GENERIC_CPU_DEVICES is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_FENCE_TRACE is not set CONFIG_DMA_CMA=y # # Default contiguous memory area size: # CONFIG_CMA_SIZE_MBYTES=8 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 # # Bus devices # # CONFIG_ARM_CCI400_PMU is not set # CONFIG_ARM_CCI5xx_PMU is not set # CONFIG_ARM_CCN is not set # CONFIG_VEXPRESS_CONFIG is not set CONFIG_CONNECTOR=y CONFIG_PROC_EVENTS=y CONFIG_MTD=y # CONFIG_MTD_TESTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set CONFIG_MTD_CMDLINE_PARTS=y # CONFIG_MTD_AFS_PARTS is not set CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AR7_PARTS is not set # # User Modules And Translation Layers # CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # CONFIG_RFD_FTL is not set # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set CONFIG_MTD_OOPS=y # CONFIG_MTD_SWAP is not set # CONFIG_MTD_PARTITIONED_MASTER is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_CFI_I4 is not set # CONFIG_MTD_CFI_I8 is not set # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_INTEL_VR_NOR is not set # CONFIG_MTD_PLATRAM is not set # # Self-contained MTD device drivers # # CONFIG_MTD_PMC551 is not set # CONFIG_MTD_DATAFLASH is not set # CONFIG_MTD_M25P80 is not set # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLOCK2MTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOCG3 is not set CONFIG_MTD_NAND_IDS=y CONFIG_MTD_NAND_ECC=y # CONFIG_MTD_NAND_ECC_SMC is not set CONFIG_MTD_NAND=y # CONFIG_MTD_NAND_ECC_BCH is not set # CONFIG_MTD_SM_COMMON is not set # CONFIG_MTD_NAND_DENALI_PCI is not set # CONFIG_MTD_NAND_DENALI_DT is not set # CONFIG_MTD_NAND_GPIO is not set # CONFIG_MTD_NAND_OMAP_BCH_BUILD is not set # CONFIG_MTD_NAND_RICOH is not set # CONFIG_MTD_NAND_DISKONCHIP is not set # CONFIG_MTD_NAND_DOCG4 is not set # CONFIG_MTD_NAND_CAFE is not set # CONFIG_MTD_NAND_NANDSIM is not set # CONFIG_MTD_NAND_BRCMNAND is not set # CONFIG_MTD_NAND_PLATFORM is not set # CONFIG_MTD_NAND_HISI504 is not set # CONFIG_MTD_NAND_MTK is not set # CONFIG_MTD_ONENAND is not set # # LPDDR & LPDDR2 PCM memory drivers # # 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_MTD_UBI=y CONFIG_MTD_UBI_WL_THRESHOLD=4096 CONFIG_MTD_UBI_BEB_LIMIT=20 # CONFIG_MTD_UBI_FASTMAP is not set # CONFIG_MTD_UBI_GLUEBI is not set # CONFIG_MTD_UBI_BLOCK is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_ADDRESS=y CONFIG_OF_ADDRESS_PCI=y CONFIG_OF_IRQ=y CONFIG_OF_NET=y CONFIG_OF_MDIO=y CONFIG_OF_PCI=y CONFIG_OF_PCI_IRQ=y CONFIG_OF_RESERVED_MEM=y # CONFIG_OF_OVERLAY is not set CONFIG_PARPORT=y # CONFIG_PARPORT_GSC is not set # CONFIG_PARPORT_AX88796 is not set # CONFIG_PARPORT_1284 is not set CONFIG_PARPORT_ODROID=y CONFIG_PARPORT_NOT_PC=y CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set CONFIG_ZRAM=m # CONFIG_ZRAM_WRITEBACK is not set # CONFIG_ZRAM_MEMORY_TRACKING is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_UMEM is not set # CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_CRYPTOLOOP is not set CONFIG_BLK_DEV_DRBD=m # CONFIG_DRBD_FAULT_INJECTION is not set CONFIG_BLK_DEV_NBD=m # CONFIG_BLK_DEV_SKD is not set # CONFIG_BLK_DEV_OSD is not set # CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=m CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_CDROM_PKTCDVD=m CONFIG_CDROM_PKTCDVD_BUFFERS=8 CONFIG_CDROM_PKTCDVD_WCACHE=y CONFIG_ATA_OVER_ETH=m CONFIG_VIRTIO_BLK=y # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_RSXX is not set CONFIG_NVME_CORE=y CONFIG_BLK_DEV_NVME=y CONFIG_BLK_DEV_NVME_SCSI=y CONFIG_NVME_FABRICS=y CONFIG_NVME_TARGET=y CONFIG_NVME_TARGET_LOOP=y # # Misc devices # CONFIG_SENSORS_LIS3LV02D=m # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_PHANTOM is not set # CONFIG_SGI_IOC4 is not set # CONFIG_TIFM_CORE is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HP_ILO is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_TI_DAC7512 is not set # CONFIG_USB_SWITCH_FSA9480 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set CONFIG_UID_SYS_STATS=y # CONFIG_UID_SYS_STATS_DEBUG is not set # CONFIG_MEMORY_STATE_TIME is not set CONFIG_KHADAS_MCU=y # CONFIG_C2PORT is not set # # EEPROM support # CONFIG_EEPROM_AT24=y CONFIG_EEPROM_AT25=m # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # CONFIG_CB710_CORE is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set CONFIG_SENSORS_LIS3_SPI=m CONFIG_SENSORS_LIS3_I2C=m # # Altera FPGA firmware download module # # CONFIG_ALTERA_STAPL is not set # # Intel MIC Bus Driver # # # SCIF Bus Driver # # # VOP Bus Driver # # # Intel MIC Host Driver # # # Intel MIC Card Driver # # # SCIF Driver # # # Intel MIC Coprocessor State Management (COSM) Drivers # # # VOP Driver # # CONFIG_GENWQE is not set # CONFIG_ECHO is not set # CONFIG_CXL_BASE is not set # CONFIG_CXL_AFU_DRIVER_OPS is not set # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_NETLINK is not set CONFIG_SCSI_MQ_DEFAULT=y CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set # CONFIG_CHR_DEV_OSST is not set CONFIG_BLK_DEV_SR=y CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_CHR_DEV_SCH=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y CONFIG_SCSI_SCAN_ASYNC=y # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_CXGB3_ISCSI is not set # CONFIG_SCSI_CXGB4_ISCSI is not set # CONFIG_SCSI_BNX2_ISCSI is not set # CONFIG_BE2ISCSI is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_HPSA is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_3W_SAS is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_HISI_SAS is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set # CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set # CONFIG_SCSI_SMARTPQI is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_STEX is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_IPR is not set # CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLA_ISCSI is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_AM53C974 is not set # CONFIG_SCSI_WD719X is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_PMCRAID is not set # CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_VIRTIO is not set # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set # CONFIG_SCSI_DH is not set CONFIG_SCSI_OSD_INITIATOR=m CONFIG_SCSI_OSD_ULD=m CONFIG_SCSI_OSD_DPRINT_SENSE=1 # CONFIG_SCSI_OSD_DEBUG is not set CONFIG_HAVE_PATA_PLATFORM=y CONFIG_ATA=y # CONFIG_ATA_NONSTANDARD is not set CONFIG_ATA_VERBOSE_ERROR=y CONFIG_SATA_PMP=y # # Controllers with non-SFF native interface # CONFIG_SATA_AHCI=y CONFIG_SATA_AHCI_PLATFORM=y # CONFIG_AHCI_CEVA is not set # CONFIG_AHCI_QORIQ is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set CONFIG_ATA_SFF=y # # SFF controllers with custom DMA interface # # CONFIG_PDC_ADMA is not set # CONFIG_SATA_QSTOR is not set # CONFIG_SATA_SX4 is not set CONFIG_ATA_BMDMA=y # # SATA SFF controllers with BMDMA # # CONFIG_ATA_PIIX is not set # CONFIG_SATA_MV is not set # CONFIG_SATA_NV is not set # CONFIG_SATA_PROMISE is not set # CONFIG_SATA_SIL is not set # CONFIG_SATA_SIS is not set # CONFIG_SATA_SVW is not set # CONFIG_SATA_ULI is not set # CONFIG_SATA_VIA is not set # CONFIG_SATA_VITESSE is not set # # PATA SFF controllers with BMDMA # # CONFIG_PATA_ALI is not set # CONFIG_PATA_AMD is not set # CONFIG_PATA_ARTOP is not set # CONFIG_PATA_ATIIXP is not set # CONFIG_PATA_ATP867X is not set # CONFIG_PATA_CMD64X is not set # CONFIG_PATA_CYPRESS is not set # CONFIG_PATA_EFAR is not set # CONFIG_PATA_HPT366 is not set # CONFIG_PATA_HPT37X is not set # CONFIG_PATA_HPT3X2N is not set # CONFIG_PATA_HPT3X3 is not set # CONFIG_PATA_IT8213 is not set # CONFIG_PATA_IT821X is not set # CONFIG_PATA_JMICRON is not set # CONFIG_PATA_MARVELL is not set # CONFIG_PATA_NETCELL is not set # CONFIG_PATA_NINJA32 is not set # CONFIG_PATA_NS87415 is not set # CONFIG_PATA_OLDPIIX is not set # CONFIG_PATA_OPTIDMA is not set # CONFIG_PATA_PDC2027X is not set # CONFIG_PATA_PDC_OLD is not set # CONFIG_PATA_RADISYS is not set # CONFIG_PATA_RDC is not set # CONFIG_PATA_SCH is not set # CONFIG_PATA_SERVERWORKS is not set # CONFIG_PATA_SIL680 is not set # CONFIG_PATA_SIS is not set # CONFIG_PATA_TOSHIBA is not set # CONFIG_PATA_TRIFLEX is not set # CONFIG_PATA_VIA is not set # CONFIG_PATA_WINBOND is not set # # PIO-only SFF controllers # # CONFIG_PATA_CMD640_PCI is not set # CONFIG_PATA_MPIIX is not set # CONFIG_PATA_NS87410 is not set # CONFIG_PATA_OPTI is not set # CONFIG_PATA_PLATFORM is not set # CONFIG_PATA_RZ1000 is not set # # Generic fallback / legacy drivers # # CONFIG_ATA_GENERIC is not set # CONFIG_PATA_LEGACY is not set CONFIG_MD=y CONFIG_BLK_DEV_MD=m CONFIG_MD_LINEAR=m CONFIG_MD_RAID0=m CONFIG_MD_RAID1=m CONFIG_MD_RAID10=m CONFIG_MD_RAID456=m CONFIG_MD_MULTIPATH=m CONFIG_MD_FAULTY=m CONFIG_BCACHE=m # CONFIG_BCACHE_DEBUG is not set # CONFIG_BCACHE_CLOSURES_DEBUG is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m CONFIG_DM_MQ_DEFAULT=y CONFIG_DM_DEBUG=y CONFIG_DM_BUFIO=m CONFIG_DM_DEBUG_BLOCK_STACK_TRACING=y CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m CONFIG_DM_CRYPT=m CONFIG_DM_SNAPSHOT=m CONFIG_DM_THIN_PROVISIONING=m CONFIG_DM_CACHE=m CONFIG_DM_CACHE_SMQ=m CONFIG_DM_CACHE_CLEANER=m CONFIG_DM_ERA=m CONFIG_DM_MIRROR=m CONFIG_DM_LOG_USERSPACE=m CONFIG_DM_RAID=m CONFIG_DM_ZERO=m CONFIG_DM_MULTIPATH=m CONFIG_DM_MULTIPATH_QL=m CONFIG_DM_MULTIPATH_ST=m CONFIG_DM_DELAY=m CONFIG_DM_UEVENT=y CONFIG_DM_FLAKEY=m CONFIG_DM_VERITY=m CONFIG_DM_VERITY_FEC=y # CONFIG_DM_SWITCH is not set CONFIG_DM_LOG_WRITES=m CONFIG_DM_VERITY_AVB=m # CONFIG_DM_ANDROID_VERITY_AT_MOST_ONCE_DEFAULT_ENABLED is not set # CONFIG_DM_BOW is not set # CONFIG_TARGET_CORE is not set # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # # CONFIG_FIREWIRE is not set # CONFIG_FIREWIRE_NOSY is not set CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y CONFIG_BONDING=m CONFIG_DUMMY=m CONFIG_EQUALIZER=m # CONFIG_NET_FC is not set CONFIG_NET_TEAM=m CONFIG_NET_TEAM_MODE_BROADCAST=m CONFIG_NET_TEAM_MODE_ROUNDROBIN=m CONFIG_NET_TEAM_MODE_RANDOM=m CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m CONFIG_NET_TEAM_MODE_LOADBALANCE=m CONFIG_MACVLAN=m CONFIG_MACVTAP=m CONFIG_IPVLAN=m CONFIG_VXLAN=m CONFIG_GENEVE=m CONFIG_GTP=m CONFIG_MACSEC=m CONFIG_NETCONSOLE=m # CONFIG_NETCONSOLE_DYNAMIC is not set CONFIG_NETPOLL=y CONFIG_NET_POLL_CONTROLLER=y CONFIG_TUN=m CONFIG_TUN_VNET_CROSS_LE=y CONFIG_VETH=y CONFIG_VIRTIO_NET=m # CONFIG_NLMON is not set # CONFIG_ARCNET is not set # # CAIF transport drivers # # # Distributed Switch Architecture drivers # CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set # CONFIG_NET_VENDOR_AGERE is not set # CONFIG_NET_VENDOR_ALTEON is not set # CONFIG_ALTERA_TSE is not set # CONFIG_NET_VENDOR_AMAZON is not set # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_ARC is not set # CONFIG_NET_VENDOR_ATHEROS is not set # CONFIG_NET_VENDOR_AURORA is not set # CONFIG_NET_CADENCE is not set # CONFIG_NET_VENDOR_BROADCOM is not set # CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set # CONFIG_NET_VENDOR_EZCHIP is not set # CONFIG_NET_VENDOR_EXAR is not set # CONFIG_NET_VENDOR_HISILICON is not set # CONFIG_NET_VENDOR_HP is not set CONFIG_NET_VENDOR_INTEL=y # CONFIG_E100 is not set # CONFIG_E1000 is not set # CONFIG_E1000E is not set # CONFIG_IGB is not set # CONFIG_IGBVF is not set # CONFIG_IXGB is not set # CONFIG_IXGBE is not set # CONFIG_IXGBEVF is not set # CONFIG_I40E is not set # CONFIG_I40EVF is not set # CONFIG_FM10K is not set CONFIG_NET_VENDOR_I825XX=y # CONFIG_JME is not set CONFIG_NET_VENDOR_MARVELL=y # CONFIG_MVMDIO is not set # CONFIG_MVNETA_BM is not set # CONFIG_SKGE is not set # CONFIG_SKY2 is not set # CONFIG_NET_VENDOR_MELLANOX is not set CONFIG_NET_VENDOR_MICREL=y # CONFIG_KS8851 is not set # CONFIG_KS8851_MLL is not set # CONFIG_KSZ884X_PCI is not set CONFIG_NET_VENDOR_MICROCHIP=y # CONFIG_ENC28J60 is not set # CONFIG_ENCX24J600 is not set # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set CONFIG_NET_VENDOR_NATSEMI=y # CONFIG_NATSEMI is not set # CONFIG_NS83820 is not set CONFIG_NET_VENDOR_NETRONOME=y # CONFIG_NFP_NETVF is not set CONFIG_NET_VENDOR_8390=y # CONFIG_NE2K_PCI is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set # CONFIG_NET_PACKET_ENGINE is not set # CONFIG_NET_VENDOR_QLOGIC is not set CONFIG_NET_VENDOR_QUALCOMM=y # CONFIG_QCA7000 is not set # CONFIG_QCOM_EMAC is not set CONFIG_NET_VENDOR_REALTEK=y # CONFIG_8139CP is not set # CONFIG_8139TOO is not set CONFIG_R8169=m CONFIG_NET_VENDOR_RENESAS=y # CONFIG_NET_VENDOR_RDC is not set CONFIG_NET_VENDOR_ROCKER=y CONFIG_NET_VENDOR_SAMSUNG=y # CONFIG_SXGBE_ETH is not set CONFIG_NET_VENDOR_SEEQ=y # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set # CONFIG_SFC is not set CONFIG_NET_VENDOR_SMSC=y # CONFIG_SMC91X is not set # CONFIG_EPIC100 is not set # CONFIG_SMSC911X is not set # CONFIG_SMSC9420 is not set CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=y CONFIG_STMMAC_PLATFORM=y CONFIG_STMMAC_JL2XX1=y CONFIG_DWMAC_GENERIC=y CONFIG_DWMAC_MESON=y CONFIG_AMLOGIC_ETH_PRIVE=y # CONFIG_STMMAC_PCI is not set # CONFIG_NET_VENDOR_SUN is not set CONFIG_NET_VENDOR_SYNOPSYS=y # CONFIG_SYNOPSYS_DWC_ETH_QOS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set CONFIG_NET_VENDOR_VIA=y # CONFIG_VIA_RHINE is not set # CONFIG_VIA_VELOCITY is not set CONFIG_NET_VENDOR_WIZNET=y # CONFIG_WIZNET_W5100 is not set # CONFIG_WIZNET_W5300 is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set CONFIG_PHYLIB=y CONFIG_SWPHY=y # # MDIO bus device drivers # # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MDIO_BITBANG is not set # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_OCTEON is not set # CONFIG_MDIO_THUNDER is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_AQUANTIA_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_BROADCOM_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set CONFIG_FIXED_PHY=y CONFIG_ICPLUS_PHY=y # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MICREL_PHY is not set CONFIG_MICROCHIP_PHY=m # CONFIG_MICROSEMI_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_QSEMI_PHY is not set CONFIG_REALTEK_PHY=y CONFIG_MAXIO_PHY=y # CONFIG_SMSC_PHY is not set # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set CONFIG_PPP=m CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m CONFIG_PPP_FILTER=y CONFIG_PPP_MPPE=m CONFIG_PPP_MULTILINK=y CONFIG_PPPOE=m CONFIG_PPPOLAC=m CONFIG_PPPOPNS=m CONFIG_PPP_ASYNC=m CONFIG_PPP_SYNC_TTY=m CONFIG_SLIP=m CONFIG_SLHC=m CONFIG_SLIP_COMPRESSED=y CONFIG_SLIP_SMART=y CONFIG_SLIP_MODE_SLIP6=y CONFIG_USB_NET_DRIVERS=y CONFIG_USB_CATC=m CONFIG_USB_KAWETH=m CONFIG_USB_PEGASUS=m CONFIG_USB_RTL8150=m # CONFIG_USB_RTL8152 is not set CONFIG_USB_LAN78XX=m CONFIG_USB_USBNET=m CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m CONFIG_USB_NET_CDC_EEM=m CONFIG_USB_NET_CDC_NCM=m CONFIG_USB_NET_HUAWEI_CDC_NCM=m CONFIG_USB_NET_CDC_MBIM=m CONFIG_USB_NET_DM9601=m CONFIG_USB_NET_SR9700=m CONFIG_USB_NET_SR9800=m CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=m CONFIG_USB_NET_GL620A=m CONFIG_USB_NET_NET1080=m CONFIG_USB_NET_PLUSB=m CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m CONFIG_USB_NET_CDC_SUBSET_ENABLE=m CONFIG_USB_NET_CDC_SUBSET=m CONFIG_USB_ALI_M5632=y CONFIG_USB_AN2720=y CONFIG_USB_BELKIN=y CONFIG_USB_ARMLINUX=y CONFIG_USB_EPSON2888=y CONFIG_USB_KC2190=y CONFIG_USB_NET_ZAURUS=m CONFIG_USB_NET_CX82310_ETH=m CONFIG_USB_NET_KALMIA=m CONFIG_USB_NET_QMI_WWAN=m CONFIG_USB_HSO=m CONFIG_USB_NET_INT51X1=m CONFIG_USB_IPHETH=m CONFIG_USB_SIERRA_NET=m CONFIG_USB_VL600=m CONFIG_USB_NET_CH9200=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y # CONFIG_ADM8211 is not set CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set # CONFIG_ATH5K is not set # CONFIG_ATH5K_PCI is not set CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m # CONFIG_ATH9K_PCI is not set # CONFIG_ATH9K_AHB is not set # CONFIG_ATH9K_DEBUGFS is not set # CONFIG_ATH9K_DYNACK is not set # CONFIG_ATH9K_WOW is not set CONFIG_ATH9K_RFKILL=y # CONFIG_ATH9K_CHANNEL_CONTEXT is not set CONFIG_ATH9K_PCOEM=y CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set # CONFIG_ATH9K_HWRNG is not set CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y # CONFIG_CARL9170_HWRNG is not set # CONFIG_ATH6KL is not set CONFIG_AR5523=m # CONFIG_WIL6210 is not set CONFIG_ATH10K=m # CONFIG_ATH10K_PCI is not set # CONFIG_ATH10K_DEBUG is not set # CONFIG_ATH10K_DEBUGFS is not set # CONFIG_ATH10K_TRACING is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set CONFIG_WLAN_VENDOR_ATMEL=y # CONFIG_ATMEL is not set CONFIG_AT76C50X_USB=m CONFIG_WLAN_VENDOR_BROADCOM=y # CONFIG_B43 is not set # CONFIG_B43LEGACY is not set # CONFIG_BRCMSMAC is not set # CONFIG_BRCMFMAC is not set CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y # CONFIG_IPW2100 is not set # CONFIG_IPW2200 is not set # CONFIG_IWL4965 is not set # CONFIG_IWL3945 is not set # CONFIG_IWLWIFI is not set CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_HOSTAP is not set # CONFIG_HERMES is not set # CONFIG_P54_COMMON is not set # CONFIG_PRISM54 is not set CONFIG_WLAN_VENDOR_MARVELL=y # CONFIG_LIBERTAS is not set # CONFIG_LIBERTAS_THINFIRM is not set # CONFIG_MWIFIEX is not set # CONFIG_MWL8K is not set CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m # CONFIG_RT2400PCI is not set # CONFIG_RT2500PCI is not set # CONFIG_RT61PCI is not set # CONFIG_RT2800PCI is not set CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WLAN_VENDOR_REALTEK=y # CONFIG_RTL8180 is not set CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y CONFIG_RTL_CARDS=y # CONFIG_RTL8192CE is not set # CONFIG_RTL8192SE is not set # CONFIG_RTL8192DE is not set # CONFIG_RTL8723AE is not set # CONFIG_RTL8723BE is not set # CONFIG_RTL8188EE is not set # CONFIG_RTL8192EE is not set # CONFIG_RTL8821AE is not set # CONFIG_RTL8192CU is not set CONFIG_RTL8XXXU=m CONFIG_RTL8XXXU_UNTESTED=y CONFIG_WLAN_VENDOR_RSI=y # CONFIG_RSI_91X is not set CONFIG_WLAN_VENDOR_ST=y # CONFIG_CW1200 is not set CONFIG_WLAN_VENDOR_TI=y # CONFIG_WL1251 is not set # CONFIG_WL12XX is not set # CONFIG_WL18XX is not set # CONFIG_WLCORE is not set CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_USB_ZD1201=m CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set # CONFIG_VMXNET3 is not set # CONFIG_ISDN is not set # CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y CONFIG_INPUT_POLLDEV=y # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y CONFIG_INPUT_MOUSEDEV_PSAUX=y CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=m CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # CONFIG_INPUT_KEYRESET is not set # CONFIG_INPUT_KEYCOMBO is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADC is not set # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_LKKBD is not set # CONFIG_KEYBOARD_GPIO is not set # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y CONFIG_MOUSE_PS2_ALPS=y CONFIG_MOUSE_PS2_BYD=y CONFIG_MOUSE_PS2_LOGIPS2PP=y CONFIG_MOUSE_PS2_SYNAPTICS=y CONFIG_MOUSE_PS2_CYPRESS=y CONFIG_MOUSE_PS2_TRACKPOINT=y # CONFIG_MOUSE_PS2_ELANTECH is not set # CONFIG_MOUSE_PS2_SENTELIC is not set # CONFIG_MOUSE_PS2_TOUCHKIT is not set CONFIG_MOUSE_PS2_FOCALTECH=y # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set # CONFIG_MOUSE_CYAPA is not set # CONFIG_MOUSE_ELAN_I2C is not set # CONFIG_MOUSE_VSXXXAA is not set # CONFIG_MOUSE_GPIO is not set # CONFIG_MOUSE_SYNAPTICS_I2C is not set # CONFIG_MOUSE_SYNAPTICS_USB is not set CONFIG_INPUT_JOYSTICK=y CONFIG_JOYSTICK_ANALOG=m CONFIG_JOYSTICK_A3D=m CONFIG_JOYSTICK_ADI=m CONFIG_JOYSTICK_COBRA=m CONFIG_JOYSTICK_GF2K=m CONFIG_JOYSTICK_GRIP=m CONFIG_JOYSTICK_GRIP_MP=m CONFIG_JOYSTICK_GUILLEMOT=m CONFIG_JOYSTICK_INTERACT=m CONFIG_JOYSTICK_SIDEWINDER=m CONFIG_JOYSTICK_TMDC=m CONFIG_JOYSTICK_IFORCE=m CONFIG_JOYSTICK_IFORCE_USB=y CONFIG_JOYSTICK_IFORCE_232=y CONFIG_JOYSTICK_WARRIOR=m CONFIG_JOYSTICK_MAGELLAN=m CONFIG_JOYSTICK_SPACEORB=m CONFIG_JOYSTICK_SPACEBALL=m CONFIG_JOYSTICK_STINGER=m CONFIG_JOYSTICK_TWIDJOY=m CONFIG_JOYSTICK_ZHENHUA=m # CONFIG_JOYSTICK_DB9 is not set CONFIG_JOYSTICK_GAMECON=y # CONFIG_JOYSTICK_TURBOGRAFX is not set CONFIG_JOYSTICK_AS5011=m CONFIG_JOYSTICK_JOYDUMP=m CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y # CONFIG_JOYSTICK_WALKERA0701 is not set # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_PROPERTIES=y CONFIG_TOUCHSCREEN_ADS7846=m # CONFIG_TOUCHSCREEN_AD7877 is not set # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_AR1021_I2C is not set # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set # CONFIG_TOUCHSCREEN_EGALAX is not set # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set # CONFIG_TOUCHSCREEN_ELAN is not set # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set # CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set # CONFIG_TOUCHSCREEN_WM97XX is not set # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2004 is not set # CONFIG_TOUCHSCREEN_TSC2005 is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_RM_TS is not set # CONFIG_TOUCHSCREEN_SILEAD is not set # CONFIG_TOUCHSCREEN_SIS_I2C is not set # CONFIG_TOUCHSCREEN_ST1232 is not set # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set # CONFIG_TOUCHSCREEN_SX8654 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set CONFIG_TOUCHSCREEN_DWAV_USB_MT=m # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_MPU3050 is not set # CONFIG_INPUT_GP2A is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_TILT_POLLED is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_GPIO is not set # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_RMI4_CORE is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_PARKBD is not set # CONFIG_SERIO_AMBAKMI is not set # CONFIG_SERIO_PCIPS2 is not set CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_USERIO is not set CONFIG_GAMEPORT=m # CONFIG_GAMEPORT_NS558 is not set # CONFIG_GAMEPORT_L4 is not set # CONFIG_GAMEPORT_EMU10K1 is not set # CONFIG_GAMEPORT_FM801 is not set # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_NOZOMI is not set # CONFIG_N_GSM is not set # CONFIG_TRACE_SINK is not set # CONFIG_LDISC_AUTOLOAD is not set CONFIG_DEVMEM=y CONFIG_DEVKMEM=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y # CONFIG_SERIAL_8250 is not set # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set # CONFIG_SERIAL_AMBA_PL011 is not set # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_IFX6X60 is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_RP2 is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_TTY_PRINTK is not set CONFIG_HVC_DRIVER=y # CONFIG_HVC_DCC is not set CONFIG_VIRTIO_CONSOLE=m # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_VIRTIO is not set CONFIG_HW_RANDOM_MESON=y # CONFIG_HW_RANDOM_CAVIUM is not set # CONFIG_APPLICOM is not set # # PCMCIA character devices # # CONFIG_RAW_DRIVER is not set # CONFIG_TCG_TPM is not set CONFIG_DEVPORT=y # CONFIG_XILLYBUS is not set # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set # CONFIG_I2C_MUX_PINCTRL is not set # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_DEMUX_PINCTRL is not set CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # PC SMBus host controller drivers # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_ISCH is not set # CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CADENCE is not set # CONFIG_I2C_CBUS_GPIO is not set # CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_DESIGNWARE_PCI is not set # CONFIG_I2C_EMEV2 is not set # CONFIG_I2C_GPIO is not set # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_PXA_PCI is not set # CONFIG_I2C_RK3X is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_THUNDERX is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_PARPORT is not set # CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set CONFIG_SPI=y CONFIG_SPI_DEBUG=y CONFIG_SPI_MASTER=y # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set CONFIG_SPI_BITBANG=y # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_DESIGNWARE is not set CONFIG_SPI_GPIO=y # CONFIG_SPI_FSL_SPI is not set CONFIG_SPI_MESON_SPICC=m # CONFIG_SPI_OC_TINY is not set # CONFIG_SPI_PL022 is not set # CONFIG_SPI_PXA2XX is not set # CONFIG_SPI_PXA2XX_PCI is not set # CONFIG_SPI_ROCKCHIP is not set # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_THUNDERX is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=m # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_DYNAMIC is not set # CONFIG_SPMI is not set # CONFIG_HSI is not set # # PPS support # CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_PARPORT is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # CONFIG_PINCTRL=y # # Pin controllers # CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_AMD is not set # CONFIG_PINCTRL_SINGLE is not set CONFIG_GPIOLIB=y CONFIG_OF_GPIO=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_DWAPB is not set # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_PL061 is not set # CONFIG_GPIO_SYSCON is not set # CONFIG_GPIO_VX855 is not set # CONFIG_GPIO_XGENE is not set # CONFIG_GPIO_XILINX is not set # CONFIG_GPIO_ZX is not set # # I2C GPIO expanders # # CONFIG_GPIO_ADP5588 is not set # CONFIG_GPIO_ADNP is not set # CONFIG_GPIO_MAX7300 is not set # CONFIG_GPIO_MAX732X is not set CONFIG_GPIO_PCA953X=y # CONFIG_GPIO_PCA953X_IRQ is not set CONFIG_GPIO_PCF857X=m # CONFIG_GPIO_SX150X is not set # CONFIG_GPIO_TPIC2810 is not set # CONFIG_GPIO_TS4900 is not set # # MFD GPIO expanders # # # PCI GPIO expanders # # CONFIG_GPIO_AMD8111 is not set # CONFIG_GPIO_BT8XX is not set # CONFIG_GPIO_ML_IOH is not set # CONFIG_GPIO_RDC321X is not set # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # # SPI or I2C GPIO expanders # # CONFIG_GPIO_MCP23S08 is not set # # USB GPIO expanders # CONFIG_W1=m CONFIG_W1_CON=y # # 1-wire Bus Masters # # CONFIG_W1_MASTER_MATROX is not set # CONFIG_W1_MASTER_DS2490 is not set # CONFIG_W1_MASTER_DS2482 is not set # CONFIG_W1_MASTER_DS1WM is not set CONFIG_W1_MASTER_GPIO=m # # 1-wire Slaves # CONFIG_W1_SLAVE_THERM=m # CONFIG_W1_SLAVE_SMEM is not set # CONFIG_W1_SLAVE_DS2408 is not set # CONFIG_W1_SLAVE_DS2413 is not set # CONFIG_W1_SLAVE_DS2406 is not set # CONFIG_W1_SLAVE_DS2423 is not set # CONFIG_W1_SLAVE_DS2431 is not set # CONFIG_W1_SLAVE_DS2433 is not set # CONFIG_W1_SLAVE_DS2760 is not set # CONFIG_W1_SLAVE_DS2780 is not set # CONFIG_W1_SLAVE_DS2781 is not set # CONFIG_W1_SLAVE_DS28E04 is not set # CONFIG_W1_SLAVE_BQ27000 is not set # CONFIG_POWER_AVS is not set CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_GPIO is not set # CONFIG_POWER_RESET_GPIO_RESTART is not set # CONFIG_POWER_RESET_LTC2952 is not set # CONFIG_POWER_RESET_RESTART is not set # CONFIG_POWER_RESET_XGENE is not set # CONFIG_POWER_RESET_SYSCON is not set # CONFIG_POWER_RESET_SYSCON_POWEROFF is not set # CONFIG_SYSCON_REBOOT_MODE is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_TEST_POWER is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_CHARGER_RT9455 is not set CONFIG_HWMON=y # CONFIG_HWMON_VID is not set # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_ARM_SCPI is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_I5K_AMB is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_GPIO_FAN is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IIO_HWMON is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set CONFIG_SENSORS_PWM_FAN=y # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH56XX_COMMON is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS1015 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_VT8231 is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y CONFIG_THERMAL_WRITABLE_TRIPS=y CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set CONFIG_THERMAL_GOV_FAIR_SHARE=y CONFIG_THERMAL_GOV_STEP_WISE=y CONFIG_THERMAL_GOV_BANG_BANG=y CONFIG_THERMAL_GOV_USER_SPACE=y CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y CONFIG_CPU_THERMAL=y # CONFIG_CLOCK_THERMAL is not set CONFIG_DEVFREQ_THERMAL=y # CONFIG_THERMAL_EMULATION is not set # CONFIG_QORIQ_THERMAL is not set # # ACPI INT340X thermal drivers # # CONFIG_GENERIC_ADC_THERMAL is not set CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set # CONFIG_WATCHDOG_SYSFS is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_ARM_SBSA_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_ALIM7101_WDT is not set # CONFIG_I6300ESB_WDT is not set # CONFIG_MEN_A21_WDT is not set # # PCI-based Watchdog Cards # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set CONFIG_SSB_POSSIBLE=y # # Sonics Silicon Backplane # # CONFIG_SSB is not set CONFIG_BCMA_POSSIBLE=y # # Broadcom specific AMBA # # CONFIG_BCMA is not set # # Multifunction device drivers # CONFIG_MFD_CORE=m # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_CROS_EC is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_EXYNOS_LPASS is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_INTEL_SOC_PMIC is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77620 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_UCB1400_CORE is not set # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_RTSX_PCI is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RTSX_USB is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_RK808 is not set # CONFIG_MFD_RN5T618 is not set # CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_SMSC is not set # CONFIG_ABX500_CORE is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_MFD_TPS80031 is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TC3589X is not set # CONFIG_MFD_TMIO is not set # CONFIG_MFD_VX855 is not set # CONFIG_MFD_ARIZONA_I2C is not set # CONFIG_MFD_ARIZONA_SPI is not set # CONFIG_MFD_WM8400 is not set # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_ANATOP is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set # CONFIG_REGULATOR_GPIO is not set # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set CONFIG_REGULATOR_PWM=y # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS6524X is not set CONFIG_MEDIA_SUPPORT=m # # Multimedia core support # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y # CONFIG_MEDIA_RADIO_SUPPORT is not set CONFIG_MEDIA_SDR_SUPPORT=y CONFIG_MEDIA_RC_SUPPORT=y CONFIG_MEDIA_CONTROLLER=y CONFIG_MEDIA_CONTROLLER_DVB=y CONFIG_VIDEO_DEV=m CONFIG_VIDEO_V4L2_SUBDEV_API=y CONFIG_VIDEO_V4L2=m # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set # CONFIG_VIDEO_PCI_SKELETON is not set CONFIG_VIDEO_TUNER=m CONFIG_V4L2_MEM2MEM_DEV=m CONFIG_VIDEOBUF_GEN=m CONFIG_VIDEOBUF_VMALLOC=m CONFIG_VIDEOBUF_DVB=m CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_DMA_CONTIG=m CONFIG_VIDEOBUF2_VMALLOC=m CONFIG_DVB_CORE=m CONFIG_DVB_NET=y CONFIG_TTPCI_EEPROM=m CONFIG_DVB_MAX_ADAPTERS=8 # CONFIG_DVB_DYNAMIC_MINORS is not set # # Media drivers # CONFIG_RC_CORE=m CONFIG_RC_MAP=m CONFIG_RC_DECODERS=y CONFIG_IR_IRMP_DECODER=m CONFIG_LIRC=m CONFIG_IR_LIRC_CODEC=m CONFIG_IR_NEC_DECODER=m CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_SONY_DECODER=m CONFIG_IR_SANYO_DECODER=m CONFIG_IR_SHARP_DECODER=m CONFIG_IR_MCE_KBD_DECODER=m CONFIG_IR_XMP_DECODER=m CONFIG_RC_DEVICES=y CONFIG_RC_ATI_REMOTE=m # CONFIG_IR_HIX5HD2 is not set # CONFIG_IR_IMON is not set CONFIG_IR_MCEUSB=m CONFIG_IR_MESON=m # CONFIG_IR_REDRAT3 is not set # CONFIG_IR_STREAMZAP is not set # CONFIG_IR_IGORPLUGUSB is not set # CONFIG_IR_IGUANA is not set # CONFIG_IR_TTUSBIR is not set # CONFIG_RC_LOOPBACK is not set CONFIG_IR_GPIO_CIR=m CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # CONFIG_USB_VIDEO_CLASS=m CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y CONFIG_USB_GSPCA=m CONFIG_USB_M5602=m CONFIG_USB_STV06XX=m CONFIG_USB_GL860=m CONFIG_USB_GSPCA_BENQ=m CONFIG_USB_GSPCA_CONEX=m CONFIG_USB_GSPCA_CPIA1=m CONFIG_USB_GSPCA_DTCS033=m CONFIG_USB_GSPCA_ETOMS=m CONFIG_USB_GSPCA_FINEPIX=m CONFIG_USB_GSPCA_JEILINJ=m CONFIG_USB_GSPCA_JL2005BCD=m CONFIG_USB_GSPCA_KINECT=m CONFIG_USB_GSPCA_KONICA=m CONFIG_USB_GSPCA_MARS=m CONFIG_USB_GSPCA_MR97310A=m CONFIG_USB_GSPCA_NW80X=m CONFIG_USB_GSPCA_OV519=m CONFIG_USB_GSPCA_OV534=m CONFIG_USB_GSPCA_OV534_9=m CONFIG_USB_GSPCA_PAC207=m CONFIG_USB_GSPCA_PAC7302=m CONFIG_USB_GSPCA_PAC7311=m CONFIG_USB_GSPCA_SE401=m CONFIG_USB_GSPCA_SN9C2028=m CONFIG_USB_GSPCA_SN9C20X=m CONFIG_USB_GSPCA_SONIXB=m CONFIG_USB_GSPCA_SONIXJ=m CONFIG_USB_GSPCA_SPCA500=m CONFIG_USB_GSPCA_SPCA501=m CONFIG_USB_GSPCA_SPCA505=m CONFIG_USB_GSPCA_SPCA506=m CONFIG_USB_GSPCA_SPCA508=m CONFIG_USB_GSPCA_SPCA561=m CONFIG_USB_GSPCA_SPCA1528=m CONFIG_USB_GSPCA_SQ905=m CONFIG_USB_GSPCA_SQ905C=m CONFIG_USB_GSPCA_SQ930X=m CONFIG_USB_GSPCA_STK014=m CONFIG_USB_GSPCA_STK1135=m CONFIG_USB_GSPCA_STV0680=m CONFIG_USB_GSPCA_SUNPLUS=m CONFIG_USB_GSPCA_T613=m CONFIG_USB_GSPCA_TOPRO=m CONFIG_USB_GSPCA_TOUPTEK=m CONFIG_USB_GSPCA_TV8532=m CONFIG_USB_GSPCA_VC032X=m CONFIG_USB_GSPCA_VICAM=m CONFIG_USB_GSPCA_XIRLINK_CIT=m CONFIG_USB_GSPCA_ZC3XX=m CONFIG_USB_PWC=m # CONFIG_USB_PWC_DEBUG is not set CONFIG_USB_PWC_INPUT_EVDEV=y CONFIG_VIDEO_CPIA2=m CONFIG_USB_ZR364XX=m CONFIG_USB_STKWEBCAM=m CONFIG_USB_S2255=m CONFIG_VIDEO_USBTV=m # # Analog TV USB devices # # CONFIG_VIDEO_PVRUSB2 is not set # CONFIG_VIDEO_HDPVR is not set # CONFIG_VIDEO_USBVISION is not set CONFIG_VIDEO_STK1160_COMMON=m # CONFIG_VIDEO_STK1160_AC97 is not set CONFIG_VIDEO_STK1160=m # CONFIG_VIDEO_GO7007 is not set # # Analog/digital TV USB devices # CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_AU0828_V4L2=y CONFIG_VIDEO_AU0828_RC=y CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y CONFIG_VIDEO_CX231XX_ALSA=m CONFIG_VIDEO_CX231XX_DVB=m CONFIG_VIDEO_TM6000=m CONFIG_VIDEO_TM6000_ALSA=m CONFIG_VIDEO_TM6000_DVB=m # # Digital TV USB devices # CONFIG_DVB_USB=m CONFIG_DVB_USB_DEBUG=y CONFIG_DVB_USB_DIB3000MC=m CONFIG_DVB_USB_A800=m CONFIG_DVB_USB_DIBUSB_MB=m CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y CONFIG_DVB_USB_DIBUSB_MC=m CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_CXUSB=m CONFIG_DVB_USB_M920X=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_VP7045=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_GP8PSK=m CONFIG_DVB_USB_NOVA_T_USB2=m CONFIG_DVB_USB_TTUSB2=m CONFIG_DVB_USB_DTT200U=m CONFIG_DVB_USB_OPERA1=m CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_DTV5100=m CONFIG_DVB_USB_FRIIO=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_V2=m CONFIG_DVB_USB_AF9015=m CONFIG_DVB_USB_AF9035=m CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_AZ6007=m CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_GL861=m CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m CONFIG_DVB_USB_DVBSKY=m # CONFIG_DVB_TTUSB_BUDGET is not set # CONFIG_DVB_TTUSB_DEC is not set CONFIG_SMS_USB_DRV=m CONFIG_DVB_B2C2_FLEXCOP_USB=m CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG=y CONFIG_DVB_AS102=m # # Webcam, TV (analog/digital) USB devices # CONFIG_VIDEO_EM28XX=m CONFIG_VIDEO_EM28XX_V4L2=m CONFIG_VIDEO_EM28XX_ALSA=m CONFIG_VIDEO_EM28XX_DVB=m # CONFIG_VIDEO_EM28XX_RC is not set # # Software defined radio USB devices # CONFIG_USB_AIRSPY=m CONFIG_USB_HACKRF=m CONFIG_USB_MSI2500=m # CONFIG_MEDIA_PCI_SUPPORT is not set # CONFIG_V4L_PLATFORM_DRIVERS is not set # CONFIG_V4L_MEM2MEM_DRIVERS is not set # CONFIG_V4L_TEST_DRIVERS is not set # CONFIG_DVB_PLATFORM_DRIVERS is not set # # Supported MMC/SDIO adapters # # CONFIG_SMS_SDIO_DRV is not set CONFIG_MEDIA_COMMON_OPTIONS=y # # common driver options # CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m CONFIG_CYPRESS_FIRMWARE=m CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_DVB_B2C2_FLEXCOP_DEBUG=y CONFIG_SMS_SIANO_MDTV=m CONFIG_SMS_SIANO_RC=y # # Media ancillary drivers (tuners, sensors, i2c, spi, frontends) # CONFIG_MEDIA_SUBDRV_AUTOSELECT=y CONFIG_MEDIA_ATTACH=y CONFIG_VIDEO_IR_I2C=m # # Audio decoders, processors and mixers # CONFIG_VIDEO_MSP3400=m # # RDS decoders # # # Video decoders # CONFIG_VIDEO_SAA711X=m CONFIG_VIDEO_TVP5150=m # # Video and audio decoders # CONFIG_VIDEO_CX25840=m # # Video encoders # # # Camera sensor devices # CONFIG_VIDEO_MT9V011=m # # Flash devices # # # Video improvement chips # # # Audio/Video compression chips # # # Miscellaneous helper chips # # # Sensors used on soc_camera driver # CONFIG_MEDIA_TUNER=m CONFIG_MEDIA_TUNER_SIMPLE=m CONFIG_MEDIA_TUNER_TDA8290=m CONFIG_MEDIA_TUNER_TDA827X=m CONFIG_MEDIA_TUNER_TDA18271=m CONFIG_MEDIA_TUNER_TDA18272=m CONFIG_MEDIA_TUNER_TDA9887=m CONFIG_MEDIA_TUNER_MSI001=m CONFIG_MEDIA_TUNER_MT20XX=m CONFIG_MEDIA_TUNER_MT2060=m CONFIG_MEDIA_TUNER_MT2063=m CONFIG_MEDIA_TUNER_MT2266=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_XC2028=m CONFIG_MEDIA_TUNER_XC5000=m CONFIG_MEDIA_TUNER_XC4000=m CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m CONFIG_MEDIA_TUNER_MC44S803=m CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_TDA18218=m CONFIG_MEDIA_TUNER_FC0011=m CONFIG_MEDIA_TUNER_FC0012=m CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_TDA18212=m CONFIG_MEDIA_TUNER_E4000=m CONFIG_MEDIA_TUNER_FC2580=m CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_MEDIA_TUNER_SI2157=m CONFIG_MEDIA_TUNER_IT913X=m CONFIG_MEDIA_TUNER_R820T=m CONFIG_MEDIA_TUNER_QM1D1C0042=m # # Multistandard (satellite) frontends # CONFIG_DVB_STB0899=m CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m CONFIG_DVB_STV6110x=m CONFIG_DVB_M88DS3103=m # # Multistandard (cable + terrestrial) frontends # CONFIG_DVB_DRXK=m CONFIG_DVB_TDA18271C2DD=m CONFIG_DVB_SI2165=m CONFIG_DVB_MN88472=m CONFIG_DVB_MN88473=m # # DVB-S (satellite) frontends # CONFIG_DVB_CX24123=m CONFIG_DVB_MT312=m CONFIG_DVB_ZL10039=m CONFIG_DVB_S5H1420=m CONFIG_DVB_STV0288=m CONFIG_DVB_STB6000=m CONFIG_DVB_STV0299=m CONFIG_DVB_STV6110=m CONFIG_DVB_STV0900=m CONFIG_DVB_TDA10086=m CONFIG_DVB_TUNER_ITD1000=m CONFIG_DVB_TUNER_CX24113=m CONFIG_DVB_TDA826X=m CONFIG_DVB_CX24116=m CONFIG_DVB_CX24120=m CONFIG_DVB_SI21XX=m CONFIG_DVB_TS2020=m CONFIG_DVB_DS3000=m CONFIG_DVB_TDA10071=m # # DVB-T (terrestrial) frontends # CONFIG_DVB_CX22702=m CONFIG_DVB_DRXD=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_NXT6000=m CONFIG_DVB_MT352=m CONFIG_DVB_ZL10353=m CONFIG_DVB_DIB3000MB=m CONFIG_DVB_DIB3000MC=m CONFIG_DVB_DIB7000M=m CONFIG_DVB_DIB7000P=m CONFIG_DVB_TDA10048=m CONFIG_DVB_AF9013=m CONFIG_DVB_EC100=m CONFIG_DVB_CXD2820R=m CONFIG_DVB_RTL2830=m CONFIG_DVB_RTL2832=m CONFIG_DVB_RTL2832_SDR=m CONFIG_DVB_SI2168=m CONFIG_DVB_AS102_FE=m CONFIG_DVB_GP8PSK_FE=m # # DVB-C (cable) frontends # CONFIG_DVB_TDA10023=m CONFIG_DVB_STV0297=m # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # CONFIG_DVB_NXT200X=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LGDT330X=m CONFIG_DVB_LGDT3305=m CONFIG_DVB_LGDT3306A=m CONFIG_DVB_LG2160=m CONFIG_DVB_S5H1409=m CONFIG_DVB_AU8522=m CONFIG_DVB_AU8522_DTV=m CONFIG_DVB_AU8522_V4L=m CONFIG_DVB_S5H1411=m # # ISDB-T (terrestrial) frontends # CONFIG_DVB_S921=m CONFIG_DVB_DIB8000=m CONFIG_DVB_MB86A20S=m # # ISDB-S (satellite) & ISDB-T (terrestrial) frontends # CONFIG_DVB_TC90522=m # # Digital terrestrial only tuners/PLL # CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m CONFIG_DVB_TUNER_DIB0090=m # # SEC control devices for DVB-S # CONFIG_DVB_DRX39XYJ=m CONFIG_DVB_LNBP21=m CONFIG_DVB_LNBP22=m CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m CONFIG_DVB_A8293=m CONFIG_DVB_SP2=m CONFIG_DVB_LGS8GXX=m CONFIG_DVB_ATBM8830=m CONFIG_DVB_IX2505V=m CONFIG_DVB_M88RS2000=m CONFIG_DVB_AF9033=m # # Tools to develop new frontends # # CONFIG_DVB_DUMMY_FE is not set # # Graphics support # # CONFIG_VGA_ARB is not set CONFIG_DRM=y # CONFIG_DRM_DP_AUX_CHARDEV is not set CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_KMS_FB_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y # CONFIG_DRM_LOAD_EDID_FIRMWARE is not set # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_RADEON is not set # CONFIG_DRM_AMDGPU is not set # # ACP (Audio CoProcessor) Configuration # # CONFIG_DRM_NOUVEAU is not set # CONFIG_DRM_VGEM is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_AST is not set # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_QXL is not set # CONFIG_DRM_BOCHS is not set # CONFIG_DRM_VIRTIO_GPU is not set CONFIG_DRM_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_DUMB_VGA_DAC is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_HISI_KIRIN is not set # CONFIG_DRM_LEGACY is not set # # Frame buffer Devices # CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y # CONFIG_FB_DDC is not set # CONFIG_FB_BOOT_VESA_SUPPORT is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y # CONFIG_FB_SVGALIB is not set # CONFIG_FB_MACMODES is not set CONFIG_FB_BACKLIGHT=y # CONFIG_FB_MODE_HELPERS is not set # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_UVESA is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_I740 is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_S3 is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VT8623 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_ARK is not set # CONFIG_FB_PM3 is not set # CONFIG_FB_CARMINE is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set # CONFIG_FB_BROADSHEET is not set # CONFIG_FB_AUO_K190X is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # CONFIG_FB_SM712 is not set CONFIG_BACKLIGHT_LCD_SUPPORT=y CONFIG_LCD_CLASS_DEVICE=m # CONFIG_LCD_L4F00242T03 is not set # CONFIG_LCD_LMS283GF05 is not set # CONFIG_LCD_LTV350QV is not set # CONFIG_LCD_ILI922X is not set # CONFIG_LCD_ILI9320 is not set # CONFIG_LCD_TDO24M is not set # CONFIG_LCD_VGG2432A4 is not set # CONFIG_LCD_PLATFORM is not set # CONFIG_LCD_S6E63M0 is not set # CONFIG_LCD_LD9040 is not set # CONFIG_LCD_AMS369FG06 is not set # CONFIG_LCD_LMS501KF03 is not set # CONFIG_LCD_HX8357 is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y CONFIG_BACKLIGHT_GENERIC=y # CONFIG_BACKLIGHT_PWM is not set # CONFIG_BACKLIGHT_PM8941_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_VGASTATE is not set CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=m CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_LOGO is not set CONFIG_SOUND=y CONFIG_SOUND_OSS_CORE=y CONFIG_SOUND_OSS_CORE_PRECLAIM=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_HWDEP=y CONFIG_SND_RAWMIDI=y CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y CONFIG_SND_SEQUENCER=y # CONFIG_SND_SEQ_DUMMY is not set CONFIG_SND_OSSEMUL=y CONFIG_SND_MIXER_OSS=m CONFIG_SND_PCM_OSS=m CONFIG_SND_PCM_OSS_PLUGINS=y CONFIG_SND_PCM_TIMER=y # CONFIG_SND_SEQUENCER_OSS is not set CONFIG_SND_HRTIMER=m CONFIG_SND_SEQ_HRTIMER_DEFAULT=y CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 CONFIG_SND_SUPPORT_OLD_API=y CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set # CONFIG_SND_DEBUG is not set CONFIG_SND_VMASTER=y CONFIG_SND_RAWMIDI_SEQ=y # CONFIG_SND_OPL3_LIB_SEQ is not set # CONFIG_SND_OPL4_LIB_SEQ is not set # CONFIG_SND_SBAWE_SEQ is not set # CONFIG_SND_EMU10K1_SEQ is not set CONFIG_SND_MPU401_UART=m CONFIG_SND_AC97_CODEC=m CONFIG_SND_DRIVERS=y CONFIG_SND_DUMMY=m CONFIG_SND_ALOOP=m # CONFIG_SND_VIRMIDI is not set CONFIG_SND_MTPAV=m CONFIG_SND_SERIAL_U16550=m CONFIG_SND_MPU401=m # CONFIG_SND_AC97_POWER_SAVE is not set CONFIG_SND_PCI=y # CONFIG_SND_AD1889 is not set # CONFIG_SND_ALS300 is not set # CONFIG_SND_ALI5451 is not set # CONFIG_SND_ATIIXP is not set # CONFIG_SND_ATIIXP_MODEM is not set # CONFIG_SND_AU8810 is not set # CONFIG_SND_AU8820 is not set # CONFIG_SND_AU8830 is not set # CONFIG_SND_AW2 is not set # CONFIG_SND_AZT3328 is not set # CONFIG_SND_BT87X is not set # CONFIG_SND_CA0106 is not set # CONFIG_SND_CMIPCI is not set # CONFIG_SND_OXYGEN is not set # CONFIG_SND_CS4281 is not set # CONFIG_SND_CS46XX is not set # CONFIG_SND_CTXFI is not set # CONFIG_SND_DARLA20 is not set # CONFIG_SND_GINA20 is not set # CONFIG_SND_LAYLA20 is not set # CONFIG_SND_DARLA24 is not set # CONFIG_SND_GINA24 is not set # CONFIG_SND_LAYLA24 is not set # CONFIG_SND_MONA is not set # CONFIG_SND_MIA is not set # CONFIG_SND_ECHO3G is not set # CONFIG_SND_INDIGO is not set # CONFIG_SND_INDIGOIO is not set # CONFIG_SND_INDIGODJ is not set # CONFIG_SND_INDIGOIOX is not set # CONFIG_SND_INDIGODJX is not set # CONFIG_SND_EMU10K1 is not set # CONFIG_SND_EMU10K1X is not set # CONFIG_SND_ENS1370 is not set # CONFIG_SND_ENS1371 is not set # CONFIG_SND_ES1938 is not set # CONFIG_SND_ES1968 is not set # CONFIG_SND_FM801 is not set # CONFIG_SND_HDSP is not set # CONFIG_SND_HDSPM is not set # CONFIG_SND_ICE1712 is not set # CONFIG_SND_ICE1724 is not set # CONFIG_SND_INTEL8X0 is not set # CONFIG_SND_INTEL8X0M is not set # CONFIG_SND_KORG1212 is not set # CONFIG_SND_LOLA is not set # CONFIG_SND_LX6464ES is not set # CONFIG_SND_MAESTRO3 is not set # CONFIG_SND_MIXART is not set # CONFIG_SND_NM256 is not set # CONFIG_SND_PCXHR is not set # CONFIG_SND_RIPTIDE is not set # CONFIG_SND_RME32 is not set # CONFIG_SND_RME96 is not set # CONFIG_SND_RME9652 is not set # CONFIG_SND_SE6X is not set # CONFIG_SND_SONICVIBES is not set # CONFIG_SND_TRIDENT is not set # CONFIG_SND_VIA82XX is not set # CONFIG_SND_VIA82XX_MODEM is not set # CONFIG_SND_VIRTUOSO is not set # CONFIG_SND_VX222 is not set # CONFIG_SND_YMFPCI is not set # # HD-Audio # # CONFIG_SND_HDA_INTEL is not set CONFIG_SND_HDA_PREALLOC_SIZE=64 CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y CONFIG_SND_USB_UA101=m CONFIG_SND_USB_CAIAQ=m CONFIG_SND_USB_CAIAQ_INPUT=y CONFIG_SND_USB_6FIRE=m CONFIG_SND_USB_HIFACE=m CONFIG_SND_BCD2000=m CONFIG_SND_USB_LINE6=m CONFIG_SND_USB_POD=m CONFIG_SND_USB_PODHD=m CONFIG_SND_USB_TONEPORT=m CONFIG_SND_USB_VARIAX=m CONFIG_SND_SOC=y # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # 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_IMX_AUDMUX is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_XTFPGA_I2S is not set CONFIG_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU7002 is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4554 is not set # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # CONFIG_SND_SOC_CS35L33 is not set # CONFIG_SND_SOC_CS42L51_I2C is not set # CONFIG_SND_SOC_CS42L52 is not set # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # CONFIG_SND_SOC_CS4271_SPI is not set # CONFIG_SND_SOC_CS42XX8_I2C is not set # CONFIG_SND_SOC_CS4349 is not set # CONFIG_SND_SOC_CS53L30 is not set # CONFIG_SND_SOC_ES8328 is not set CONFIG_SND_SOC_ES8388=y # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # 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_RL6231=y # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set CONFIG_SND_SOC_RT5651=y # CONFIG_SND_SOC_RT5677_SPI is not set # CONFIG_SND_SOC_SGTL5000 is not set # CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set CONFIG_SND_SOC_SPDIF=m # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC3X is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731 is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # 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_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_TPA6130A2 is not set CONFIG_AMLOGIC_SND_SOC_CODECS=y CONFIG_AMLOGIC_SND_CODEC_DUMMY_CODEC=y CONFIG_AMLOGIC_SND_CODEC_PCM2BT=y CONFIG_AMLOGIC_SND_CODEC_PDM_DUMMY_CODEC=y CONFIG_AMLOGIC_SND_CODEC_AMLT9015=y # CONFIG_AMLOGIC_SND_CODEC_AMLT9015S is not set # CONFIG_AMLOGIC_SND_CODEC_PMU3 is not set # CONFIG_AMLOGIC_SND_SOC_TAS5805 is not set CONFIG_AMLOGIC_SND_CODEC_TXLX_ACODEC=y # CONFIG_AMLOGIC_SND_CODEC_TL1_ACODEC is not set # CONFIG_AMLOGIC_SND_SOC_TAS5782M is not set CONFIG_AMLOGIC_SND_SOC_TAS5707=y CONFIG_AMLOGIC_SND_SOC_ES8316=y CONFIG_AMLOGIC_SND_SOC_TLV320ADC3101=y CONFIG_AMLOGIC_SND_SOC_PCM186X=y CONFIG_AMLOGIC_SND_SOC_SSM3525=y CONFIG_AMLOGIC_SND_SOC_SSM3515=y CONFIG_AMLOGIC_SND_SOC_TAS575X=y # CONFIG_AMLOGIC_SND_SOC_ES7243 is not set CONFIG_AMLOGIC_SND_SOC_AD82584F=y # CONFIG_AMLOGIC_SND_SOC_CS42528 is not set # CONFIG_SND_SIMPLE_CARD is not set # CONFIG_SND_SIMPLE_SCU_CARD is not set CONFIG_AMLOGIC_SND_SOC=y CONFIG_AMLOGIC_SND_SOC_MESON=y CONFIG_AMLOGIC_SND_SOC_AUGE=y CONFIG_AMLOGIC_SND_SPLIT_MODE=y CONFIG_AMLOGIC_SND_SPLIT_MODE_MMAP=y CONFIG_AMLOGIC_SND_SOC_COMMON=y # CONFIG_SOUND_PRIME is not set CONFIG_AC97_BUS=m # # HID support # CONFIG_HID=y CONFIG_HID_BATTERY_STRENGTH=y CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=m CONFIG_HID_ACRUX=m CONFIG_HID_ACRUX_FF=y CONFIG_HID_APPLE=m CONFIG_HID_APPLEIR=m CONFIG_HID_AUREAL=m CONFIG_HID_BELKIN=m CONFIG_HID_BETOP_FF=m CONFIG_HID_CHERRY=m CONFIG_HID_CHICONY=m CONFIG_HID_CORSAIR=m CONFIG_HID_PRODIKEYS=m CONFIG_HID_CMEDIA=m CONFIG_HID_CP2112=m CONFIG_HID_CYPRESS=m CONFIG_HID_DRAGONRISE=m CONFIG_DRAGONRISE_FF=y CONFIG_HID_EMS_FF=m CONFIG_HID_ELECOM=m CONFIG_HID_ELO=m CONFIG_HID_EZKEY=m CONFIG_HID_GEMBIRD=m CONFIG_HID_GFRM=m CONFIG_HID_HOLTEK=m CONFIG_HOLTEK_FF=y CONFIG_HID_GT683R=m CONFIG_HID_KEYTOUCH=m CONFIG_HID_KYE=m CONFIG_HID_UCLOGIC=m CONFIG_HID_WALTOP=m CONFIG_HID_GYRATION=m CONFIG_HID_ICADE=m CONFIG_HID_TWINHAN=m CONFIG_HID_KENSINGTON=m CONFIG_HID_LCPOWER=m CONFIG_HID_LED=m CONFIG_HID_LENOVO=m CONFIG_HID_LOGITECH=m CONFIG_HID_LOGITECH_DJ=m CONFIG_HID_LOGITECH_HIDPP=m CONFIG_LOGITECH_FF=y CONFIG_LOGIRUMBLEPAD2_FF=y CONFIG_LOGIG940_FF=y # CONFIG_LOGIWHEELS_FF is not set CONFIG_HID_MAGICMOUSE=m CONFIG_HID_MICROSOFT=m CONFIG_HID_MONTEREY=m CONFIG_HID_MULTITOUCH=m # CONFIG_HID_NINTENDO is not set CONFIG_HID_NTRIG=m CONFIG_HID_ORTEK=m CONFIG_HID_PANTHERLORD=m CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=m CONFIG_HID_PETALYNX=m CONFIG_HID_PICOLCD=m CONFIG_HID_PICOLCD_FB=y CONFIG_HID_PICOLCD_BACKLIGHT=y CONFIG_HID_PICOLCD_LCD=y CONFIG_HID_PICOLCD_LEDS=y CONFIG_HID_PICOLCD_CIR=y CONFIG_HID_PLANTRONICS=m CONFIG_HID_PLAYSTATION=m # CONFIG_PLAYSTATION_FF is not set CONFIG_HID_PRIMAX=m CONFIG_HID_ROCCAT=m CONFIG_HID_SAITEK=m CONFIG_HID_SAMSUNG=m CONFIG_HID_SONY=m CONFIG_SONY_FF=y CONFIG_HID_SPEEDLINK=m CONFIG_HID_STEAM=m CONFIG_HID_STEELSERIES=m CONFIG_HID_SUNPLUS=m CONFIG_HID_RMI=m CONFIG_HID_GREENASIA=m CONFIG_GREENASIA_FF=y CONFIG_HID_SMARTJOYPLUS=m CONFIG_SMARTJOYPLUS_FF=y CONFIG_HID_TIVO=m CONFIG_HID_TOPSEED=m CONFIG_HID_THINGM=m CONFIG_HID_THRUSTMASTER=m CONFIG_THRUSTMASTER_FF=y CONFIG_HID_WACOM=m CONFIG_HID_WIIMOTE=m CONFIG_HID_XINMO=m CONFIG_HID_XPADNEO=m CONFIG_HID_ZEROPLUS=m CONFIG_ZEROPLUS_FF=y CONFIG_HID_ZYDACRON=m CONFIG_HID_SENSOR_HUB=m CONFIG_HID_SENSOR_CUSTOM_SENSOR=m CONFIG_HID_ALPS=m # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # # I2C HID support # # CONFIG_I2C_HID is not set CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_OTG is not set # 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_MON is not set # CONFIG_USB_WUSB_CBAF is not set # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y CONFIG_USB_XHCI_PCI=y CONFIG_USB_XHCI_PLATFORM=y CONFIG_USB_EHCI_HCD=y # CONFIG_USB_EHCI_ROOT_HUB_TT is not set CONFIG_USB_EHCI_TT_NEWSCHED=y CONFIG_USB_EHCI_PCI=y # CONFIG_USB_EHCI_HCD_PLATFORM is not set # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_ISP1362_HCD is not set # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD_PCI=y # CONFIG_USB_OHCI_HCD_PLATFORM is not set # CONFIG_USB_UHCI_HCD is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=y # CONFIG_USB_PRINTER is not set CONFIG_USB_WDM=m # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set # CONFIG_USB_UAS is not set # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_MUSB_HDRC is not set CONFIG_USB_DWC3=y CONFIG_USB_DWC3_HOST=y # CONFIG_USB_DWC3_GADGET is not set # CONFIG_USB_DWC3_DUAL_ROLE is not set # # Platform Glue Driver Support # CONFIG_USB_DWC3_PCI=y CONFIG_USB_DWC3_OF_SIMPLE=y # CONFIG_USB_DWC2 is not set # CONFIG_USB_CHIPIDEA is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # CONFIG_USB_SERIAL=y CONFIG_USB_SERIAL_CONSOLE=y CONFIG_USB_SERIAL_GENERIC=y CONFIG_USB_SERIAL_SIMPLE=m CONFIG_USB_SERIAL_AIRCABLE=m CONFIG_USB_SERIAL_ARK3116=m CONFIG_USB_SERIAL_BELKIN=m CONFIG_USB_SERIAL_CH341=m CONFIG_USB_SERIAL_WHITEHEAT=m CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m CONFIG_USB_SERIAL_CP210X=m CONFIG_USB_SERIAL_CYPRESS_M8=m CONFIG_USB_SERIAL_EMPEG=m CONFIG_USB_SERIAL_FTDI_SIO=m CONFIG_USB_SERIAL_VISOR=m CONFIG_USB_SERIAL_IPAQ=m CONFIG_USB_SERIAL_IR=m CONFIG_USB_SERIAL_EDGEPORT=m CONFIG_USB_SERIAL_EDGEPORT_TI=m CONFIG_USB_SERIAL_F81232=m CONFIG_USB_SERIAL_GARMIN=m CONFIG_USB_SERIAL_IPW=m CONFIG_USB_SERIAL_IUU=m CONFIG_USB_SERIAL_KEYSPAN_PDA=m CONFIG_USB_SERIAL_KEYSPAN=m CONFIG_USB_SERIAL_KEYSPAN_MPR=y CONFIG_USB_SERIAL_KEYSPAN_USA28=y CONFIG_USB_SERIAL_KEYSPAN_USA28X=y CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y CONFIG_USB_SERIAL_KEYSPAN_USA19=y CONFIG_USB_SERIAL_KEYSPAN_USA18X=y CONFIG_USB_SERIAL_KEYSPAN_USA19W=y CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y CONFIG_USB_SERIAL_KEYSPAN_USA49W=y CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y CONFIG_USB_SERIAL_KLSI=m CONFIG_USB_SERIAL_KOBIL_SCT=m CONFIG_USB_SERIAL_MCT_U232=m CONFIG_USB_SERIAL_METRO=m CONFIG_USB_SERIAL_MOS7720=m CONFIG_USB_SERIAL_MOS7840=m CONFIG_USB_SERIAL_MXUPORT=m CONFIG_USB_SERIAL_NAVMAN=m CONFIG_USB_SERIAL_PL2303=m CONFIG_USB_SERIAL_OTI6858=m CONFIG_USB_SERIAL_QCAUX=m CONFIG_USB_SERIAL_QUALCOMM=m CONFIG_USB_SERIAL_SPCP8X5=m CONFIG_USB_SERIAL_SAFE=m CONFIG_USB_SERIAL_SAFE_PADDED=y CONFIG_USB_SERIAL_SIERRAWIRELESS=m CONFIG_USB_SERIAL_SYMBOL=m CONFIG_USB_SERIAL_TI=m CONFIG_USB_SERIAL_CYBERJACK=m CONFIG_USB_SERIAL_XIRCOM=m CONFIG_USB_SERIAL_WWAN=m CONFIG_USB_SERIAL_OPTION=m CONFIG_USB_SERIAL_OMNINET=m CONFIG_USB_SERIAL_OPTICON=m CONFIG_USB_SERIAL_XSENS_MT=m CONFIG_USB_SERIAL_WISHBONE=m CONFIG_USB_SERIAL_SSU100=m CONFIG_USB_SERIAL_QT2=m CONFIG_USB_SERIAL_DEBUG=m # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set CONFIG_USB_EZUSB_FX2=m # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # # USB Physical Layer drivers # CONFIG_USB_PHY=y # CONFIG_USB_OTG_WAKELOCK is not set # CONFIG_NOP_USB_XCEIV is not set # CONFIG_USB_GPIO_VBUS is not set CONFIG_USB_ISP1301=y # CONFIG_USB_ULPI is not set # CONFIG_DUAL_ROLE_USB_INTF is not set CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GADGET_DEBUG_FILES is not set # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # # USB Peripheral Controller # # CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set # CONFIG_USB_M66592 is not set # CONFIG_USB_BDC_UDC is not set # CONFIG_USB_AMD5536UDC is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_NET2280 is not set # CONFIG_USB_GOKU is not set # CONFIG_USB_EG20T is not set # CONFIG_USB_GADGET_XILINX is not set # CONFIG_USB_DUMMY_HCD is not set CONFIG_USB_LIBCOMPOSITE=y CONFIG_USB_U_ETHER=y CONFIG_USB_F_RNDIS=y CONFIG_USB_F_FS=y CONFIG_USB_F_MIDI=y CONFIG_USB_F_MTP=y CONFIG_USB_F_PTP=y CONFIG_USB_F_AUDIO_SRC=y CONFIG_USB_F_ACC=y CONFIG_USB_CONFIGFS=y # CONFIG_USB_CONFIGFS_SERIAL is not set # CONFIG_USB_CONFIGFS_ACM is not set # CONFIG_USB_CONFIGFS_OBEX is not set # CONFIG_USB_CONFIGFS_NCM is not set # CONFIG_USB_CONFIGFS_ECM is not set # CONFIG_USB_CONFIGFS_ECM_SUBSET is not set CONFIG_USB_CONFIGFS_RNDIS=y # CONFIG_USB_CONFIGFS_EEM is not set # CONFIG_USB_CONFIGFS_MASS_STORAGE is not set # CONFIG_USB_CONFIGFS_F_LB_SS is not set CONFIG_USB_CONFIGFS_F_FS=y CONFIG_USB_CONFIGFS_F_MTP=y CONFIG_USB_CONFIGFS_F_PTP=y CONFIG_USB_CONFIGFS_F_ACC=y CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y CONFIG_USB_CONFIGFS_UEVENT=y # CONFIG_USB_CONFIGFS_F_UAC1 is not set # CONFIG_USB_CONFIGFS_F_UAC2 is not set CONFIG_USB_CONFIGFS_F_MIDI=y # CONFIG_USB_CONFIGFS_F_HID is not set # CONFIG_USB_CONFIGFS_F_UVC is not set # CONFIG_USB_CONFIGFS_F_PRINTER is not set # CONFIG_USB_LED_TRIG is not set # CONFIG_USB_ULPI_BUS is not set # CONFIG_UWB is not set CONFIG_MMC=y # CONFIG_MMC_DEBUG is not set CONFIG_PWRSEQ_EMMC=y CONFIG_PWRSEQ_SIMPLE=y # CONFIG_MMC_EMBEDDED_SDIO is not set # CONFIG_MMC_PARANOID_SD_INIT is not set # # MMC/SD/SDIO Card Drivers # CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 CONFIG_MMC_BLOCK_BOUNCE=y # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # CONFIG_MMC_SIMULATE_MAX_SPEED is not set # # MMC/SD/SDIO Host Controller Drivers # CONFIG_MMC_ARMMMCI=y # CONFIG_MMC_SDHCI is not set # CONFIG_MMC_TIFM_SD is not set # CONFIG_MMC_SPI is not set # CONFIG_MMC_CB710 is not set # CONFIG_MMC_VIA_SDMMC is not set # CONFIG_MMC_DW is not set # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set # CONFIG_MMC_TOSHIBA_PCI is not set # CONFIG_MMC_MTK is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y # CONFIG_LEDS_CLASS_FLASH is not set # # LED drivers # # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP5521 is not set # CONFIG_LEDS_LP5523 is not set # CONFIG_LEDS_LP5562 is not set # CONFIG_LEDS_LP8501 is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set CONFIG_LEDS_PWM=y # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set CONFIG_LEDS_IS31FL32XX=m # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_SYSCON is not set # # LED Triggers # CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y # CONFIG_LEDS_TRIGGER_DISK is not set # CONFIG_LEDS_TRIGGER_MTD is not set CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_BACKLIGHT=y CONFIG_LEDS_TRIGGER_CPU=y CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # # iptables trigger is under Netfilter config (LED target) # CONFIG_LEDS_TRIGGER_TRANSIENT=y # CONFIG_LEDS_TRIGGER_CAMERA is not set CONFIG_LEDS_TRIGGER_PANIC=y # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_SUPPORT=y # CONFIG_EDAC is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # I2C RTC drivers # # CONFIG_RTC_DRV_ABB5ZES3 is not set # CONFIG_RTC_DRV_ABX80X is not set # CONFIG_RTC_DRV_DS1307 is not set # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set CONFIG_RTC_DRV_HYM8563=y CONFIG_RTC_DRV_HYM8563_SHW_PATCH=y # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set CONFIG_RTC_DRV_PCF8563=y # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # CONFIG_RTC_DRV_RX8581 is not set # CONFIG_RTC_DRV_RX8025 is not set # CONFIG_RTC_DRV_EM3027 is not set # CONFIG_RTC_DRV_RV8803 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RX6110 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_PL030 is not set # CONFIG_RTC_DRV_PL031 is not set # CONFIG_RTC_DRV_SNVS is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_HID_SENSOR_TIME is not set # CONFIG_DMADEVICES is not set # # DMABUF options # CONFIG_SYNC_FILE=y CONFIG_SW_SYNC=y # CONFIG_AUXDISPLAY is not set CONFIG_UIO=y # CONFIG_UIO_CIF is not set CONFIG_UIO_PDRV_GENIRQ=y # CONFIG_UIO_DMEM_GENIRQ is not set # CONFIG_UIO_AEC is not set # CONFIG_UIO_SERCOS3 is not set # CONFIG_UIO_PCI_GENERIC is not set # CONFIG_UIO_NETX is not set # CONFIG_UIO_PRUSS is not set # CONFIG_UIO_MF624 is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set CONFIG_VIRTIO=y # # Virtio drivers # # CONFIG_VIRTIO_PCI is not set # CONFIG_VIRTIO_BALLOON is not set # CONFIG_VIRTIO_INPUT is not set CONFIG_VIRTIO_MMIO=y # CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set # # Microsoft Hyper-V guest support # CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_COMEDI is not set # CONFIG_RTL8192U is not set CONFIG_RTLLIB=m CONFIG_RTLLIB_CRYPTO_CCMP=m CONFIG_RTLLIB_CRYPTO_TKIP=m CONFIG_RTLLIB_CRYPTO_WEP=m # CONFIG_RTL8192E is not set CONFIG_R8712U=m # CONFIG_R8188EU is not set # CONFIG_RTS5208 is not set # CONFIG_VT6655 is not set # CONFIG_VT6656 is not set # # IIO staging drivers # # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16203 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADIS16240 is not set # CONFIG_SCA3000 is not set # # Analog to digital converters # # CONFIG_AD7606 is not set # CONFIG_AD7780 is not set # CONFIG_AD7816 is not set # CONFIG_AD7192 is not set # CONFIG_AD7280 is not set # # Analog digital bi-direction converters # # CONFIG_ADT7316 is not set # # Capacitance to digital converters # # CONFIG_AD7150 is not set # CONFIG_AD7152 is not set # CONFIG_AD7746 is not set # # Direct Digital Synthesis # # CONFIG_AD9832 is not set # CONFIG_AD9834 is not set # # Digital gyroscope sensors # # CONFIG_ADIS16060 is not set # # Network Analyzer, Impedance Converters # # CONFIG_AD5933 is not set # # Light sensors # # CONFIG_SENSORS_ISL29018 is not set # CONFIG_SENSORS_ISL29028 is not set # CONFIG_TSL2583 is not set # CONFIG_TSL2x7x is not set # # Active energy metering IC # # CONFIG_ADE7753 is not set # CONFIG_ADE7754 is not set # CONFIG_ADE7758 is not set # CONFIG_ADE7759 is not set # CONFIG_ADE7854 is not set # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1200 is not set # CONFIG_AD2S1210 is not set # # Triggers - standalone # # CONFIG_FB_SM750 is not set # CONFIG_FB_XGI is not set # # Speakup console speech # # CONFIG_SPEAKUP is not set CONFIG_STAGING_MEDIA=y # CONFIG_MEDIA_CEC is not set # CONFIG_DVB_CXD2099 is not set CONFIG_LIRC_STAGING=y # CONFIG_LIRC_BT829 is not set # CONFIG_LIRC_IMON is not set # CONFIG_LIRC_SASEM is not set # CONFIG_LIRC_SERIAL is not set # CONFIG_LIRC_SIR is not set # CONFIG_LIRC_ZILOG is not set # # Android # # CONFIG_ASHMEM is not set # CONFIG_ANDROID_LOGGER is not set # CONFIG_ANDROID_LOW_MEMORY_KILLER is not set # CONFIG_ANDROID_VSOC is not set CONFIG_ION=y # CONFIG_ION_TEST is not set # CONFIG_ION_DUMMY is not set # CONFIG_ION_OF is not set # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_MTD_SPINAND_MT29F is not set # CONFIG_LNET is not set # CONFIG_DGNC is not set # CONFIG_GS_FPGABOOT is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set CONFIG_FB_TFT=m CONFIG_FB_TFT_AGM1264K_FL=m CONFIG_FB_TFT_BD663474=m CONFIG_FB_TFT_HX8340BN=m CONFIG_FB_TFT_HX8347D=m CONFIG_FB_TFT_HX8353D=m CONFIG_FB_TFT_HX8357D=m CONFIG_FB_TFT_ILI9163=m CONFIG_FB_TFT_ILI9320=m CONFIG_FB_TFT_ILI9325=m CONFIG_FB_TFT_ILI9340=m CONFIG_FB_TFT_ILI9341=m CONFIG_FB_TFT_ILI9481=m CONFIG_FB_TFT_ILI9486=m CONFIG_FB_TFT_PCD8544=m CONFIG_FB_TFT_RA8875=m CONFIG_FB_TFT_S6D02A1=m CONFIG_FB_TFT_S6D1121=m CONFIG_FB_TFT_SSD1289=m CONFIG_FB_TFT_SSD1305=m CONFIG_FB_TFT_SSD1306=m CONFIG_FB_TFT_SSD1325=m CONFIG_FB_TFT_SSD1331=m CONFIG_FB_TFT_SSD1351=m CONFIG_FB_TFT_ST7735R=m CONFIG_FB_TFT_ST7789V=m CONFIG_FB_TFT_TINYLCD=m CONFIG_FB_TFT_TLS8204=m CONFIG_FB_TFT_UC1611=m CONFIG_FB_TFT_UC1701=m CONFIG_FB_TFT_UPD161704=m CONFIG_FB_TFT_WATTEROTT=m CONFIG_FB_FLEX=m CONFIG_FB_TFT_FBTFT_DEVICE=m # CONFIG_FSL_MC_BUS is not set # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set # CONFIG_MOST is not set # CONFIG_KS7010 is not set # CONFIG_GREYBUS is not set # CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Common Clock Framework # # CONFIG_COMMON_CLK_VERSATILE is not set # CONFIG_COMMON_CLK_SCPI is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set # CONFIG_CLK_QORIQ is not set CONFIG_COMMON_CLK_XGENE=y # CONFIG_COMMON_CLK_NXP is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_PXA is not set # CONFIG_COMMON_CLK_PIC32 is not set # # Hardware Spinlock drivers # # # Clock Source drivers # CONFIG_CLKSRC_OF=y CONFIG_CLKSRC_PROBE=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y # CONFIG_ARM_ARCH_TIMER_VCT_ACCESS is not set CONFIG_FSL_ERRATUM_A008585=y # CONFIG_ARM_TIMER_SP804 is not set # CONFIG_ATMEL_PIT is not set # CONFIG_SH_TIMER_CMT is not set # CONFIG_SH_TIMER_MTU2 is not set # CONFIG_SH_TIMER_TMU is not set # CONFIG_EM_TIMER_STI is not set CONFIG_MAILBOX=y # CONFIG_ARM_MHU is not set # CONFIG_PLATFORM_MHU is not set # CONFIG_PL320_MBOX is not set # CONFIG_ALTERA_MBOX is not set # CONFIG_MAILBOX_TEST is not set # CONFIG_BCM_PDC_MBOX is not set CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # # CONFIG_IOMMU_IO_PGTABLE_LPAE is not set # CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set CONFIG_IOMMU_IOVA=y CONFIG_OF_IOMMU=y CONFIG_IOMMU_DMA=y # CONFIG_ARM_SMMU is not set # CONFIG_ARM_SMMU_V3 is not set # # Remoteproc drivers # # CONFIG_STE_MODEM_RPROC is not set # # Rpmsg drivers # # # SOC (System On Chip) specific Drivers # # # Broadcom SoC drivers # # CONFIG_SUNXI_SRAM is not set # CONFIG_SOC_TI is not set CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y CONFIG_DEVFREQ_GOV_PERFORMANCE=y CONFIG_DEVFREQ_GOV_POWERSAVE=y CONFIG_DEVFREQ_GOV_USERSPACE=y # CONFIG_DEVFREQ_GOV_PASSIVE is not set # # DEVFREQ Drivers # # CONFIG_PM_DEVFREQ_EVENT is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_GPIO is not set # CONFIG_EXTCON_MAX3355 is not set # CONFIG_EXTCON_QCOM_SPMI_MISC is not set # CONFIG_EXTCON_RT8973A is not set # CONFIG_EXTCON_SM5502 is not set # CONFIG_EXTCON_USB_GPIO is not set # CONFIG_MEMORY is not set CONFIG_IIO=y CONFIG_IIO_BUFFER=y # CONFIG_IIO_BUFFER_CB is not set CONFIG_IIO_KFIFO_BUF=y # CONFIG_IIO_CONFIGFS is not set # CONFIG_IIO_TRIGGER is not set # CONFIG_IIO_SW_DEVICE is not set # CONFIG_IIO_SW_TRIGGER is not set # # Accelerometers # # CONFIG_BMA180 is not set # CONFIG_BMA220 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_HID_SENSOR_ACCEL_3D is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MC3230 is not set # CONFIG_MMA7455_I2C is not set # CONFIG_MMA7455_SPI is not set # CONFIG_MMA7660 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MXC4005 is not set # CONFIG_MXC6255 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # # Analog to digital converters # # CONFIG_AD7266 is not set # CONFIG_AD7291 is not set # CONFIG_AD7298 is not set # CONFIG_AD7476 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD799X is not set # CONFIG_CC10001_ADC is not set # CONFIG_HI8435 is not set # CONFIG_INA2XX_ADC is not set # CONFIG_LTC2485 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX1363 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_NAU7802 is not set # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC0832 is not set # CONFIG_TI_ADC12138 is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_TI_ADC161S626 is not set # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS8688 is not set # CONFIG_VF610_ADC is not set # # Amplifiers # # CONFIG_AD8366 is not set # # Chemical Sensors # # CONFIG_ATLAS_PH_SENSOR is not set # CONFIG_IAQCORE is not set # CONFIG_VZ89X is not set # # Hid Sensor IIO Common # # CONFIG_HID_SENSOR_IIO_COMMON is not set # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # # Digital to analog converters # # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5592R is not set # CONFIG_AD5593R is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_AD5686 is not set # CONFIG_AD5755 is not set # CONFIG_AD5761 is not set # CONFIG_AD5764 is not set # CONFIG_AD5791 is not set # CONFIG_AD7303 is not set # CONFIG_AD8801 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # CONFIG_VF610_DAC is not set # # IIO dummy driver # # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_HID_SENSOR_GYRO_3D is not set # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # # Health Sensors # # # Heart Rate Monitors # # CONFIG_AFE4403 is not set # CONFIG_AFE4404 is not set # CONFIG_MAX30100 is not set # # Humidity sensors # # CONFIG_AM2315 is not set # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set # CONFIG_KMX61 is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set # # Light sensors # # CONFIG_ADJD_S311 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_BH1750 is not set # CONFIG_BH1780 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM36651 is not set # CONFIG_GP2AP020A00F is not set # CONFIG_ISL29125 is not set # CONFIG_HID_SENSOR_ALS is not set # CONFIG_HID_SENSOR_PROX is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_MAX44000 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1145 is not set # CONFIG_STK3310 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set # CONFIG_SENSORS_TSL2563 is not set # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VEML6070 is not set # # Magnetometer sensors # # CONFIG_AK8974 is not set # CONFIG_AK8975 is not set # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN_I2C is not set # CONFIG_BMC150_MAGN_SPI is not set # CONFIG_MAG3110 is not set # CONFIG_HID_SENSOR_MAGNETOMETER_3D is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # # Inclinometer sensors # # CONFIG_HID_SENSOR_INCLINOMETER_3D is not set # CONFIG_HID_SENSOR_DEVICE_ROTATION is not set # # Digital potentiometers # # CONFIG_DS1803 is not set # CONFIG_MAX5487 is not set # CONFIG_MCP4131 is not set # CONFIG_MCP4531 is not set # CONFIG_TPL0102 is not set # # Pressure sensors # # CONFIG_BMP280 is not set # CONFIG_HID_SENSOR_PRESS is not set # CONFIG_HP03 is not set # CONFIG_MPL115_I2C is not set # CONFIG_MPL115_SPI is not set # CONFIG_MPL3115 is not set # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # CONFIG_HP206C is not set # CONFIG_ZPA2326 is not set # # Lightning sensors # # CONFIG_AS3935 is not set # # Proximity sensors # # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_SX9500 is not set # # Temperature sensors # # CONFIG_MAXIM_THERMOCOUPLE is not set # CONFIG_MLX90614 is not set # CONFIG_TMP006 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_NTB is not set # CONFIG_VME_BUS is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_FSL_FTM is not set CONFIG_PWM_GPIO=y # CONFIG_PWM_PCA9685 is not set CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 CONFIG_ARM_GIC_V2M=y CONFIG_ARM_GIC_V3=y CONFIG_ARM_GIC_V3_ITS=y CONFIG_PARTITION_PERCPU=y # CONFIG_IPACK_BUS is not set CONFIG_RESET_CONTROLLER=y CONFIG_GPIO_RESET_CONTROLLER=y # CONFIG_RESET_ATH79 is not set # CONFIG_RESET_BERLIN is not set # CONFIG_RESET_LPC18XX is not set # CONFIG_RESET_MESON is not set # CONFIG_RESET_PISTACHIO is not set # CONFIG_RESET_SOCFPGA is not set # CONFIG_RESET_STM32 is not set # CONFIG_RESET_SUNXI is not set # CONFIG_TI_SYSCON_RESET is not set # CONFIG_RESET_ZYNQ is not set # CONFIG_FMC is not set # # PHY Subsystem # # CONFIG_GENERIC_PHY is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_BCM_KONA_USB2_PHY is not set # CONFIG_PHY_XGENE is not set # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # CONFIG_ARM_PMU=y CONFIG_RAS=y # CONFIG_THUNDERBOLT is not set # # Android # CONFIG_ANDROID=y # CONFIG_ANDROID_BINDER_IPC is not set # CONFIG_LIBNVDIMM is not set CONFIG_NVMEM=y # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # # FPGA Configuration Support # # CONFIG_FPGA is not set # CONFIG_TEE is not set # # Bootloader Drivers # CONFIG_BL301_MANAGER=y # # Firmware Drivers # CONFIG_ARM_PSCI_FW=y CONFIG_ARM_SCPI_POWER_DOMAIN=y # CONFIG_FIRMWARE_MEMMAP is not set # CONFIG_FW_CFG_SYSFS is not set CONFIG_HAVE_ARM_SMCCC=y # CONFIG_MESON_SM is not set # CONFIG_ACPI is not set # # File systems # CONFIG_DCACHE_WORD_ACCESS=y CONFIG_FS_IOMAP=y # CONFIG_EXT2_FS is not set # CONFIG_EXT3_FS is not set 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 CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=m # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set # CONFIG_FS_DAX is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=m # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y # CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QUOTA_DEBUG is not set CONFIG_QUOTA_TREE=y # CONFIG_QFMT_V1 is not set CONFIG_QFMT_V2=y CONFIG_QUOTACTL=y CONFIG_AUTOFS4_FS=y CONFIG_FUSE_FS=m # CONFIG_CUSE is not set CONFIG_OVERLAY_FS=m # # Caches # CONFIG_FSCACHE=y # CONFIG_FSCACHE_STATS is not set # CONFIG_FSCACHE_HISTOGRAM is not set # CONFIG_FSCACHE_DEBUG is not set # CONFIG_FSCACHE_OBJECT_LIST is not set # CONFIG_CACHEFILES is not set # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=y CONFIG_UDF_NLS=y # # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=936 CONFIG_FAT_DEFAULT_IOCHARSET="utf8" CONFIG_FAT_DEFAULT_UTF8=y CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_CODEPAGE=936 CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" CONFIG_EXFAT_VIRTUAL_XATTR=y CONFIG_EXFAT_VIRTUAL_XATTR_SELINUX_LABEL="u:object_r:exfat:s0" # CONFIG_EXFAT_DEBUG is not set # CONFIG_EXFAT_UEVENT is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_UID=y CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_HUGETLBFS is not set # CONFIG_HUGETLB_PAGE is not set CONFIG_ARCH_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=y CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set # CONFIG_SDCARD_FS is not set CONFIG_HFS_FS=y CONFIG_HFSPLUS_FS=y # CONFIG_HFSPLUS_FS_POSIX_ACL is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS2_FS is not set # CONFIG_UBIFS_FS is not set # CONFIG_LOGFS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y CONFIG_SQUASHFS_FILE_CACHE=y # CONFIG_SQUASHFS_FILE_DIRECT is not set # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_PSTORE is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EXOFS_FS is not set CONFIG_ORE=m CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y CONFIG_NFS_SWAP=y CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=m CONFIG_PNFS_OBJLAYOUT=m CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" CONFIG_NFS_V4_1_MIGRATION=y CONFIG_NFS_V4_SECURITY_LABEL=y CONFIG_ROOT_NFS=y CONFIG_NFS_FSCACHE=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFSD=m CONFIG_NFSD_V3=y # CONFIG_NFSD_V3_ACL is not set # CONFIG_NFSD_V4 is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y CONFIG_SUNRPC_SWAP=y CONFIG_RPCSEC_GSS_KRB5=m # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS=y CONFIG_CIFS_STATS2=y # CONFIG_CIFS_WEAK_PW_HASH is not set # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set # CONFIG_CIFS_DEBUG is not set # CONFIG_CIFS_DFS_UPCALL is not set CONFIG_CIFS_SMB2=y CONFIG_CIFS_SMB311=y CONFIG_CIFS_FSCACHE=y # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set CONFIG_NLS_CODEPAGE_936=y # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_VIRTUALIZATION is not set # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y # # Compile-time checks and compiler options # # CONFIG_DEBUG_INFO is not set CONFIG_ENABLE_WARN_DEPRECATED=y CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=0 # 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 CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_DEBUG_KERNEL=y # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_PAGE_REF is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_ARCH_KASAN=y # CONFIG_KASAN is not set CONFIG_ARCH_HAS_KCOV=y # CONFIG_KCOV is not set # CONFIG_DEBUG_SHIRQ is not set # # Debug Lockups and Hangs # CONFIG_LOCKUP_DETECTOR=y CONFIG_HARDLOCKUP_DETECTOR_OTHER_CPU=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 CONFIG_WQ_WATCHDOG=y # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=5 CONFIG_SCHED_DEBUG=y CONFIG_SCHED_INFO=y CONFIG_PANIC_ON_RT_THROTTLING=y CONFIG_SCHEDSTATS=y CONFIG_SCHED_STACK_END_CHECK=y # CONFIG_DEBUG_TIMEKEEPING is not set CONFIG_TIMER_STATS=y # CONFIG_DEBUG_PREEMPT is not set # # Lock Debugging (spinlocks, mutexes, etc...) # # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set CONFIG_DEBUG_ATOMIC_SLEEP=y # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set CONFIG_STACKTRACE=y # CONFIG_DEBUG_KOBJECT is not set CONFIG_HAVE_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_BUGVERBOSE is not set # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PI_LIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_PROVE_RCU is not set # CONFIG_SPARSE_RCU_POINTER is not set # CONFIG_TORTURE_TEST is not set # CONFIG_RCU_PERF_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set # CONFIG_LATENCYTOP is not set CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y # CONFIG_PREEMPTIRQ_EVENTS is not set # CONFIG_IRQSOFF_TRACER is not set # CONFIG_PREEMPT_TRACER is not set # CONFIG_SCHED_TRACER is not set # CONFIG_HWLAT_TRACER is not set CONFIG_FTRACE_SYSCALLS=y # CONFIG_TRACER_SNAPSHOT is not set CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set CONFIG_STACK_TRACER=y # CONFIG_BLK_DEV_IO_TRACE is not set # CONFIG_PROBE_EVENTS is not set CONFIG_DYNAMIC_FTRACE=y CONFIG_FUNCTION_PROFILER=y CONFIG_FTRACE_MCOUNT_RECORD=y # CONFIG_FTRACE_STARTUP_TEST is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_TRACE_ENUM_MAP_FILE is not set CONFIG_TRACING_EVENTS_GPIO=y # # Runtime Testing # # CONFIG_LKDTM is not set # CONFIG_TEST_LIST_SORT is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_RBTREE_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_ASYNC_RAID6_TEST is not set # CONFIG_TEST_HEXDUMP is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_RHASHTABLE is not set # CONFIG_TEST_HASH is not set # CONFIG_DMA_API_DEBUG is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_UDELAY is not set # CONFIG_MEMTEST is not set # CONFIG_TEST_STATIC_KEYS 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_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_ARCH_WANTS_UBSAN_NO_NULL is not set # CONFIG_UBSAN is not set CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y # CONFIG_STRICT_DEVMEM is not set # CONFIG_ARM64_PTDUMP is not set CONFIG_AMLOGIC_USER_FAULT=y # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set CONFIG_DEBUG_SET_MODULE_RONX=y # CONFIG_DEBUG_ALIGN_RODATA is not set # CONFIG_CORESIGHT is not set # # Security options # CONFIG_KEYS=y # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_BIG_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set # CONFIG_KEY_DH_OPERATIONS is not set CONFIG_SECURITY_DMESG_RESTRICT=y CONFIG_SECURITY_PERF_EVENTS_RESTRICT=y CONFIG_SECURITY=y CONFIG_SECURITYFS=y CONFIG_SECURITY_NETWORK=y # CONFIG_SECURITY_NETWORK_XFRM is not set CONFIG_SECURITY_PATH=y CONFIG_LSM_MMAP_MIN_ADDR=0 CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HAVE_ARCH_HARDENED_USERCOPY=y CONFIG_HARDENED_USERCOPY=y # CONFIG_HARDENED_USERCOPY_PAGESPAN is not set CONFIG_SECURITY_SELINUX=y # CONFIG_SECURITY_SELINUX_BOOTPARAM is not set # CONFIG_SECURITY_SELINUX_DISABLE is not set CONFIG_SECURITY_SELINUX_DEVELOP=y CONFIG_SECURITY_SELINUX_AVC_STATS=y CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0 CONFIG_SECURITY_SMACK=y # CONFIG_SECURITY_SMACK_BRINGUP is not set # CONFIG_SECURITY_SMACK_NETFILTER is not set # CONFIG_SECURITY_SMACK_APPEND_SIGNALS is not set # CONFIG_SECURITY_TOMOYO is not set # CONFIG_SECURITY_APPARMOR is not set # CONFIG_SECURITY_LOADPIN is not set # CONFIG_SECURITY_YAMA 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_SELINUX=y # CONFIG_DEFAULT_SECURITY_SMACK is not set # CONFIG_DEFAULT_SECURITY_DAC is not set CONFIG_DEFAULT_SECURITY="selinux" CONFIG_XOR_BLOCKS=m CONFIG_ASYNC_CORE=m CONFIG_ASYNC_MEMCPY=m CONFIG_ASYNC_XOR=m CONFIG_ASYNC_PQ=m CONFIG_ASYNC_RAID6_RECOV=m CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y # CONFIG_CRYPTO_RSA is not set # CONFIG_CRYPTO_DH is not set # CONFIG_CRYPTO_ECDH is not set CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_WORKQUEUE=y CONFIG_CRYPTO_CRYPTD=y # CONFIG_CRYPTO_MCRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_ABLK_HELPER=y # # Authenticated Encryption with Associated Data # CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y # # Block modes # CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CTR=y CONFIG_CRYPTO_CTS=y CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_ADIANTUM is not set # # Hash modes # CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_VMAC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_GHASH=y # CONFIG_CRYPTO_POLY1305 is not set CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y CONFIG_CRYPTO_MICHAEL_MIC=y # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARC4=y CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_BLOWFISH_COMMON=m CONFIG_CRYPTO_CAMELLIA=m CONFIG_CRYPTO_CAST_COMMON=m CONFIG_CRYPTO_CAST5=m CONFIG_CRYPTO_CAST6=m CONFIG_CRYPTO_DES=y CONFIG_CRYPTO_FCRYPT=m CONFIG_CRYPTO_KHAZAD=m CONFIG_CRYPTO_SALSA20=m CONFIG_CRYPTO_CHACHA20=m CONFIG_CRYPTO_SEED=m CONFIG_CRYPTO_SERPENT=m CONFIG_CRYPTO_TEA=m CONFIG_CRYPTO_TWOFISH=y CONFIG_CRYPTO_TWOFISH_COMMON=y # # Compression # CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_LZO=y CONFIG_CRYPTO_842=m CONFIG_CRYPTO_LZ4=m CONFIG_CRYPTO_LZ4HC=m CONFIG_CRYPTO_ZSTD=m # # Random Number Generation # CONFIG_CRYPTO_ANSI_CPRNG=y CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set # CONFIG_CRYPTO_USER_API_AEAD is not set CONFIG_CRYPTO_HASH_INFO=y CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_CCP is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y # CONFIG_PKCS7_MESSAGE_PARSER is not set # # Certificates for signature checking # # CONFIG_SYSTEM_TRUSTED_KEYRING is not set CONFIG_ARM64_CRYPTO=y CONFIG_CRYPTO_SHA1_ARM64_CE=y CONFIG_CRYPTO_SHA2_ARM64_CE=y CONFIG_CRYPTO_GHASH_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64_CE=y # CONFIG_CRYPTO_AES_ARM64_CE_CCM is not set CONFIG_CRYPTO_AES_ARM64_CE_BLK=y # CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set # CONFIG_CRYPTO_CRC32_ARM64 is not set CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_RATIONAL=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_GENERIC_IO=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_CRC_CCITT=y CONFIG_CRC16=y CONFIG_CRC_T10DIF=y CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set CONFIG_CRC7=y CONFIG_LIBCRC32C=y # CONFIG_CRC8 is not set CONFIG_XXHASH=m CONFIG_AUDIT_GENERIC=y CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y CONFIG_AUDIT_COMPAT_GENERIC=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_842_COMPRESS=m CONFIG_842_DECOMPRESS=m CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_COMPRESS=m CONFIG_LZ4HC_COMPRESS=m CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMPRESS=m CONFIG_ZSTD_DECOMPRESS=m CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y CONFIG_XZ_DEC_POWERPC=y CONFIG_XZ_DEC_IA64=y CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y CONFIG_XZ_DEC_SPARC=y CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_GZIP=y CONFIG_DECOMPRESS_BZIP2=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DECOMPRESS_XZ=y CONFIG_DECOMPRESS_LZO=y CONFIG_DECOMPRESS_LZ4=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_LRU_CACHE=m CONFIG_CLZ_TAB=y # CONFIG_CORDIC is not set # CONFIG_DDR is not set # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_FONT_SUPPORT=m # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y # CONFIG_SG_SPLIT is not set CONFIG_SG_POOL=y CONFIG_ARCH_HAS_SG_CHAIN=y CONFIG_SBITMAP=y ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/options ================================================ ################################################################################ # setup system defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) # TARGET_CPU: # arm2 arm250 arm3 arm6 arm60 arm600 arm610 arm620 arm7 arm7m arm7d # arm7dm arm7di arm7dmi arm70 arm700 arm700i arm710 arm710c # arm7100 arm720 arm7500 arm7500fe arm7tdmi arm7tdmi-s arm710t # arm720t arm740t strongarm strongarm110 strongarm1100 # strongarm1110 arm8 arm810 arm9 arm9e arm920 arm920t arm922t # arm946e-s arm966e-s arm968e-s arm926ej-s arm940t arm9tdmi # arm10tdmi arm1020t arm1026ej-s arm10e arm1020e arm1022e # arm1136j-s arm1136jf-s mpcore mpcorenovfp arm1156t2-s # arm1176jz-s arm1176jzf-s cortex-a8 cortex-a9 cortex-r4 # cortex-r4f cortex-m3 cortex-m1 xscale iwmmxt iwmmxt2 ep9312. # TARGET_KERNEL_ARCH="arm64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a73.cortex-a53" TARGET_CPU_FLAGS="+crc+fp+simd" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc" TARGET_FPU="neon-fp-armv8" ;; esac # Bootloader to use (syslinux / u-boot / atv-bootloader / bcm2835-bootloader) BOOTLOADER="u-boot" # Kernel target KERNEL_TARGET="Image.lzo" # Kernel extra targets to build KERNEL_UBOOT_EXTRA_TARGET="" # Build Android kernel image using mkbootimg BUILD_ANDROID_BOOTIMG="yes" # Additional options to be passed to Android mkbootimg ANDROID_BOOTIMG_OPTIONS="--base 0x0 --kernel_offset 0x1080000" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="dtbs" # Additional kernel dependencies KERNEL_EXTRA_DEPENDS_TARGET="" # Kernel to use. values can be: # default: default mainline kernel LINUX="amlogic-4.9" # kernel image name KERNEL_NAME="kernel.img" ################################################################################ # setup build defaults ################################################################################ # Project CFLAGS PROJECT_CFLAGS="" # SquashFS compression method (gzip / lzo / xz) SQUASHFS_COMPRESSION="lzo" ################################################################################ # setup project defaults ################################################################################ # build and install ALSA Audio support (yes / no) ALSA_SUPPORT="yes" # OpenGL(X) implementation to use (no / Mesa) OPENGL="no" # OpenGL-ES implementation to use (no / bcm2835-driver / gpu-viv-bin-mx6q / opengl-meson) OPENGLES="opengl-meson" # include uvesafb support (yes / no) UVESAFB_SUPPORT="no" # Displayserver to use (x11 / no) DISPLAYSERVER="no" # Windowmanager to use (fluxbox / none) WINDOWMANAGER="none" # Xorg Graphic drivers to use (all / i915,i965,r200,r300,r600,nvidia,nouveau) # Space separated list is supported, # e.g. GRAPHIC_DRIVERS="i915 i965 r300 r600 radeonsi nvidia nouveau" GRAPHIC_DRIVERS="" # Use a vendor specific KODI repo KODI_VENDOR="amlogic-4.9" # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap / libamcodec) KODIPLAYER_DRIVER="libamcodec" # Modules to install in initramfs for early boot INITRAMFS_MODULES="font softcursor bitblit fbcon" # additional drivers to install: # for a list of additinoal drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS+=" uwe5631-aml RTL8812AU RTL8822BU-aml RTL8822CS-aml RTL8822CU-aml RTL8852BS-aml RTL8152-aml w1-aml RTL8192CU RTL8192DU RTL8192EU RTL8188EU RTL8821CU ssv6xxx-aml mt7668-wifi-bt RTL8188FTV-aml RTL8189ES-aml RTL8189FS-aml RTL8723BS-aml RTL8822BS-aml RTL8821CS-aml qca9377-aml qca6174-aml smartchip" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" FIRMWARE="misc-firmware wlan-firmware dvb-firmware brcmfmac_sdio-firmware-aml rtkbt-firmware-aml qca-firmware-aml" # build and install ATV IR remote support (yes / no) ATVCLIENT_SUPPORT="no" # Amlogic IR remote support (yes / no) AMREMOTE_SUPPORT="yes" # build and install iSCSI support - iscsistart (yes / no) ISCSI_SUPPORT="no" # build with installer (yes / no) INSTALLER_SUPPORT="no" # build and install driver addons (yes / no) DRIVER_ADDONS_SUPPORT="no" # driver addons to install: # for a list of additinoal drivers see packages/linux-driver-addons # Space separated list is supported, DRIVER_ADDONS="" # additional packages to install: # Space separated list is supported, # e.g. ADDITIONAL_PACKAGES="PACKAGE1 PACKAGE2" # ADDITIONAL_PACKAGES+="" # add OOTB support for IR remote # IR_REMOTE_KEYMAPS+="" # build with entware installer ENTWARE_SUPPORT="yes" ENTWARE_ARCH="aarch64-k3.10" # CoreELEC Subdevices SUBDEVICES="Odroid_N2 Odroid_N2L Odroid_C4 Odroid_HC4 LePotato LaFrite Radxa_Zero Radxa_Zero2" # TEE supported SoC TEE_SOC="S905X4" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/packages/opengl-meson/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="opengl-meson" PKG_VERSION="7bddce621a0c1e0cc12cfc8b707e93eb37fc0f82" PKG_SHA256="15400e78b918b15743b815c195be472899d4243143e405a7b50d5be1cd07ffd1" PKG_LICENSE="nonfree" PKG_SITE="http://openlinux.amlogic.com:8000/download/ARM/filesystem/" PKG_URL="https://github.com/CoreELEC/opengl-meson/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain opentee_linuxdriver" PKG_LONGDESC="OpenGL ES pre-compiled libraries for Mali GPUs found in Amlogic Meson SoCs." PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib if [[ "${ARCH}" == "arm" ]]; then cp -p lib/eabihf/gondul/r12p0/fbdev/libMali.so ${INSTALL}/usr/lib/libMali.gondul.so cp -p lib/eabihf/dvalin/r12p0/fbdev/libMali.so ${INSTALL}/usr/lib/libMali.dvalin.so cp -p lib/eabihf/m450/r7p0/fbdev/libMali.so ${INSTALL}/usr/lib/libMali.m450.so mkdir -p ${SYSROOT_PREFIX}/usr/lib cp -p lib/eabihf/gondul/r12p0/fbdev/libMali.so ${SYSROOT_PREFIX}/usr/lib else cp -p lib/arm64/gondul/r12p0/fbdev/libMali.so ${INSTALL}/usr/lib/libMali.gondul.so cp -p lib/arm64/dvalin/r12p0/fbdev/libMali.so ${INSTALL}/usr/lib/libMali.dvalin.so cp -p lib/arm64/m450/r7p0/fbdev/libMali.so ${INSTALL}/usr/lib/libMali.m450.so mkdir -p ${SYSROOT_PREFIX}/usr/lib cp -p lib/arm64/gondul/r12p0/fbdev/libMali.so ${SYSROOT_PREFIX}/usr/lib fi ln -sf /var/lib/libMali.so ${INSTALL}/usr/lib/libMali.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libmali.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libmali.so.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libEGL.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libEGL.so.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libEGL.so.1.0.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLES_CM.so.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv1_CM.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv1_CM.so.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv1_CM.so.1.0.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv1_CM.so.1.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv2.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv2.so.2 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv2.so.2.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv2.so.2.0.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so.3 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so.3.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so.3.0.0 # install headers and libraries to TOOLCHAIN cp -rf ${PKG_BUILD}/include/* ${SYSROOT_PREFIX}/usr/include cp -rf ${PKG_BUILD}/pkgconfig/* ${SYSROOT_PREFIX}/usr/lib/pkgconfig cp ${SYSROOT_PREFIX}/usr/include/EGL_platform/platform_fbdev/* ${SYSROOT_PREFIX}/usr/include/EGL rm -rf ${SYSROOT_PREFIX}/usr/include/EGL_platform ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libmali.so ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libMali.so.0 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libEGL.so ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libEGL.so.1 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libEGL.so.1.0.0 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLES_CM.so.1 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv1_CM.so ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv1_CM.so.1 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv1_CM.so.1.0.1 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv1_CM.so.1.1 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv2.so ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv2.so.2 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv2.so.2.0 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv2.so.2.0.0 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv3.so ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv3.so.3 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv3.so.3.0 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv3.so.3.0.0 mkdir -p ${INSTALL}/usr/sbin cp $PKG_DIR/scripts/libmali-overlay-setup ${INSTALL}/usr/sbin } post_install() { enable_service unbind-console.service enable_service libmali.service } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/packages/opengl-meson/scripts/libmali-overlay-setup ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) mkdir -p /var/lib32 if grep -q "g12b" /proc/device-tree/compatible; then ln -sf /usr/lib/libMali.gondul.so /var/lib/libMali.so ln -sf /usr/lib32/libMali.gondul.so /var/lib32/libMali.so elif grep -qE "g12a|sc2" /proc/device-tree/compatible; then ln -sf /usr/lib/libMali.dvalin.so /var/lib/libMali.so ln -sf /usr/lib32/libMali.dvalin.so /var/lib32/libMali.so elif grep -q "Gxl" /proc/device-tree/compatible; then ln -sf /usr/lib/libMali.m450.so /var/lib/libMali.so ln -sf /usr/lib32/libMali.m450.so /var/lib32/libMali.so fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/packages/opengl-meson/sources/pkgconfig/egl.pc ================================================ prefix=/usr exec_prefix=${prefix} libdir=/usr/lib includedir=${prefix}/include Name: egl Description: libhybris EGL library # Set to 7.10 because some package like weston are usually built # against mesa and because of that expect certain version from egl. Version: 7.10 Libs: -L${libdir} -lEGL Cflags: -I${includedir} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/packages/opengl-meson/sources/pkgconfig/glesv1_cm.pc ================================================ prefix=/usr exec_prefix=${prefix} libdir=/usr/lib includedir=${prefix}/include Name: glesv1_cm Description: libhybris OpenGL ES 1.1 library Version: 0.1.0 Libs: -L${libdir} -lGLESv1_CM Cflags: -I${includedir} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/packages/opengl-meson/sources/pkgconfig/glesv2.pc ================================================ prefix=/usr exec_prefix=${prefix} libdir=/usr/lib includedir=${prefix}/include Name: glesv2 Description: libhybris OpenGL ES 2.0 library Version: 0.1.0 Libs: -L${libdir} -lGLESv2 Cflags: -I${includedir} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/packages/opengl-meson/sources/pkgconfig/glesv3.pc ================================================ prefix=/usr exec_prefix=${prefix} libdir=/usr/lib includedir=${prefix}/include Name: glesv3 Description: libhybris OpenGL ES 3.0 library Version: 0.1.0 Libs: -L${libdir} -lGLESv3 Cflags: -I${includedir} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/packages/opengl-meson/system.d/libmali.service ================================================ [Unit] Description=Create libMali overlay for specific AML device After=var.mount Before=kodi.service [Service] Type=oneshot ExecStart=/usr/sbin/libmali-overlay-setup [Install] WantedBy=local-fs.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/packages/opengl-meson/system.d/unbind-console.service ================================================ [Unit] Description=Unbind framebuffer console ConditionPathExists=/sys/class/vtconsole/vtcon1/bind [Service] Type=oneshot ExecStart=/bin/sh -c 'echo 0 > /sys/class/vtconsole/vtcon1/bind' [Install] WantedBy=graphical.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/packages/u-boot/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot" PKG_VERSION="1.0" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" PKG_CANUPDATE="${PROJECT}*" PKG_NEED_UNPACK="$PROJECT_DIR/$PROJECT/bootloader " for PKG_SUBDEVICE in $SUBDEVICES; do if [ "${PKG_SUBDEVICE}" != "Odroid_HC4" ]; then PKG_DEPENDS_TARGET+=" u-boot-${PKG_SUBDEVICE}" PKG_NEED_UNPACK+=" $(get_pkg_directory u-boot-${PKG_SUBDEVICE})" fi done make_target() { : # nothing } makeinstall_target() { mkdir -p $INSTALL/usr/share/bootloader # Always install the update script find_file_path bootloader/update.sh && cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader sed -e "s/@KERNEL_NAME@/$KERNEL_NAME/g" \ -e "s/@LEGACY_KERNEL_NAME@/$LEGACY_KERNEL_NAME/g" \ -e "s/@LEGACY_DTB_NAME@/$LEGACY_DTB_NAME/g" \ -i $INSTALL/usr/share/bootloader/update.sh # Always install the canupdate script if find_file_path bootloader/canupdate.sh; then cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader fi for PKG_SUBDEVICE in $SUBDEVICES; do unset PKG_UBOOTBIN unset PKG_CHAINUBOOTBIN find_file_path bootloader/${PKG_SUBDEVICE}_boot.ini && cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader if [ "${PKG_SUBDEVICE:0:9}" = "Odroid_N2" -o "${PKG_SUBDEVICE}" = "Odroid_C4" -o "${PKG_SUBDEVICE}" = "Odroid_HC4" -o "${PKG_SUBDEVICE:0:10}" = "Radxa_Zero" ]; then if [ "${PKG_SUBDEVICE}" != "Odroid_HC4" ]; then PKG_UBOOTBIN=$(get_build_dir u-boot-${PKG_SUBDEVICE})/sd_fuse/u-boot.bin.sd.bin else PKG_UBOOTBIN=$(get_build_dir u-boot-Odroid_C4)/sd_fuse/u-boot.bin.sd.bin fi elif [ "${PKG_SUBDEVICE}" = "LePotato" ]; then PKG_UBOOTBIN=$(get_build_dir u-boot-${PKG_SUBDEVICE})/fip/u-boot.bin.sd.bin PKG_CHAINUBOOTBIN=$(get_build_dir u-boot-${PKG_SUBDEVICE})/build/u-boot.bin elif [ "${PKG_SUBDEVICE}" = "LaFrite" ]; then PKG_CHAINUBOOTBIN=$(get_build_dir u-boot-${PKG_SUBDEVICE})/build/u-boot.bin fi if [ ${PKG_UBOOTBIN} ]; then cp -av ${PKG_UBOOTBIN} $INSTALL/usr/share/bootloader/${PKG_SUBDEVICE}_u-boot fi if [ ${PKG_CHAINUBOOTBIN} ]; then cp -av ${PKG_CHAINUBOOTBIN} $INSTALL/usr/share/bootloader/${PKG_SUBDEVICE}_chain_u-boot fi done find_file_path bootloader/config.ini && cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader sed -e "s/@PROJECT@/${PKG_CANUPDATE}/g" \ -i $INSTALL/usr/share/bootloader/canupdate.sh # Copy Hardkernel boot logo find_file_path splash/${DEVICE}/hk-boot-logo-1080.bmp.gz && cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader # Copy Radxa boot logo find_file_path splash/${DEVICE}/radxa-boot-logo-1080.bmp.gz && cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/packages/u-boot-LaFrite/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-LaFrite" PKG_VERSION="de12d9be7324f7d26b8721de1eb64715b444bdad" PKG_SHA256="f71d5ecb5e11f6f531ae0182c8f1de55468f990c46afdc5a8361b5311bf7da74" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" configure_package() { PKG_UBOOT_CONFIG="gxl_p241_v1_defconfig" } pre_make_target() { sed -i "s|arm-none-eabi-|arm-eabi-|g" $PKG_BUILD/Makefile $PKG_BUILD/arch/arm/cpu/armv8/gx*/firmware/scp_task/Makefile 2>/dev/null || true } make_target() { [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/:$TOOLCHAIN/lib/gcc-linaro-arm-eabi/bin/:$PATH DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make $PKG_UBOOT_CONFIG DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make HOSTCC="$HOST_CC" HOSTSTRIP="true" } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/packages/u-boot-LePotato/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-LePotato" PKG_VERSION="de12d9be7324f7d26b8721de1eb64715b444bdad" PKG_SHA256="f71d5ecb5e11f6f531ae0182c8f1de55468f990c46afdc5a8361b5311bf7da74" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" configure_package() { PKG_UBOOT_CONFIG="libretech_cc_defconfig" } pre_make_target() { sed -i "s|arm-none-eabi-|arm-eabi-|g" $PKG_BUILD/Makefile $PKG_BUILD/arch/arm/cpu/armv8/gx*/firmware/scp_task/Makefile 2>/dev/null || true } make_target() { [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/:$TOOLCHAIN/lib/gcc-linaro-arm-eabi/bin/:$PATH DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make $PKG_UBOOT_CONFIG DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make HOSTCC="$HOST_CC" HOSTSTRIP="true" } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/packages/u-boot-Odroid_C4/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-Odroid_C4" PKG_VERSION="43d26e1865333916d7889a586948e11b83b2c558" PKG_SHA256="7258b7443d4b8ea2e7d9543c076ecf3cf53c546cff6138cd5f770a536dcabf1f" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" pre_make_target() { sed -i "s|arm-none-eabi-|arm-eabi-|g" $PKG_BUILD/Makefile $PKG_BUILD/arch/arm/cpu/armv8/*/firmware/scp_task/Makefile 2>/dev/null || true } configure_package() { PKG_UBOOT_CONFIG="odroidc4_defconfig" } make_target() { [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/:$TOOLCHAIN/lib/gcc-linaro-arm-eabi/bin/:$PATH DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make $PKG_UBOOT_CONFIG DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make HOSTCC="$HOST_CC" HOSTSTRIP="true" } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/packages/u-boot-Odroid_N2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-Odroid_N2" PKG_VERSION="43d26e1865333916d7889a586948e11b83b2c558" PKG_SHA256="7258b7443d4b8ea2e7d9543c076ecf3cf53c546cff6138cd5f770a536dcabf1f" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" pre_make_target() { sed -i "s|arm-none-eabi-|arm-eabi-|g" $PKG_BUILD/Makefile $PKG_BUILD/arch/arm/cpu/armv8/*/firmware/scp_task/Makefile 2>/dev/null || true } configure_package() { PKG_UBOOT_CONFIG="odroidn2_defconfig" } make_target() { [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/:$TOOLCHAIN/lib/gcc-linaro-arm-eabi/bin/:$PATH DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make $PKG_UBOOT_CONFIG DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make HOSTCC="$HOST_CC" HOSTSTRIP="true" } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/packages/u-boot-Odroid_N2L/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-Odroid_N2L" PKG_VERSION="25aa59079acfc84fec943e18f2240581f6afb8ca" PKG_SHA256="cdc7f418655d45a22d278f568104950cac6970758f4537fbb251e076dc392455" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" pre_make_target() { sed -i "s|arm-none-eabi-|arm-eabi-|g" $PKG_BUILD/Makefile $PKG_BUILD/arch/arm/cpu/armv8/*/firmware/scp_task/Makefile 2>/dev/null || true } configure_package() { PKG_UBOOT_CONFIG="odroidn2l_defconfig" } make_target() { [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/:$TOOLCHAIN/lib/gcc-linaro-arm-eabi/bin/:$PATH DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make $PKG_UBOOT_CONFIG DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make HOSTCC="$HOST_CC" HOSTSTRIP="true" } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/packages/u-boot-Radxa_Zero/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-Radxa_Zero" PKG_VERSION="43d26e1865333916d7889a586948e11b83b2c558" PKG_SHA256="7258b7443d4b8ea2e7d9543c076ecf3cf53c546cff6138cd5f770a536dcabf1f" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" pre_make_target() { sed -i "s|arm-none-eabi-|arm-eabi-|g" $PKG_BUILD/Makefile $PKG_BUILD/arch/arm/cpu/armv8/*/firmware/scp_task/Makefile 2>/dev/null || true } configure_package() { PKG_UBOOT_CONFIG="radxa_zero_defconfig" } make_target() { [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/:$TOOLCHAIN/lib/gcc-linaro-arm-eabi/bin/:$PATH DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make $PKG_UBOOT_CONFIG DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make HOSTCC="$HOST_CC" HOSTSTRIP="true" } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/packages/u-boot-Radxa_Zero2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-Radxa_Zero2" PKG_VERSION="43d26e1865333916d7889a586948e11b83b2c558" PKG_SHA256="7258b7443d4b8ea2e7d9543c076ecf3cf53c546cff6138cd5f770a536dcabf1f" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" pre_make_target() { sed -i "s|arm-none-eabi-|arm-eabi-|g" $PKG_BUILD/Makefile $PKG_BUILD/arch/arm/cpu/armv8/*/firmware/scp_task/Makefile 2>/dev/null || true } configure_package() { PKG_UBOOT_CONFIG="radxa_zero2_defconfig" } make_target() { [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/:$TOOLCHAIN/lib/gcc-linaro-arm-eabi/bin/:$PATH DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make ${PKG_UBOOT_CONFIG} DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make HOSTCC="${HOST_CC}" HOSTSTRIP="true" } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0001-Android-improve-Dolby-Vision-compatibility.patch ================================================ From 9df5de35edf290042854693658f7fb77c14a19c8 Mon Sep 17 00:00:00 2001 From: thexai <58434170+thexai@users.noreply.github.com> Date: Wed, 29 Mar 2023 12:30:11 +0200 Subject: [PATCH 01/21] [Android] improve Dolby Vision compatibility --- .../Video/DVDVideoCodecAndroidMediaCodec.cpp | 8 +++++++- xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.h | 2 ++ .../VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp | 13 ++++++++++++- xbmc/cores/VideoPlayer/DVDStreamInfo.cpp | 8 ++++++++ xbmc/cores/VideoPlayer/DVDStreamInfo.h | 5 ++++- 5 files changed, 33 insertions(+), 3 deletions(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp index 48050cfb9d..0be40dd87c 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp @@ -512,7 +512,13 @@ bool CDVDVideoCodecAndroidMediaCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptio "Display: {}, MediaCodec: {}", displaySupportsDovi, mediaCodecSupportsDovi); - if (displaySupportsDovi && mediaCodecSupportsDovi) + // For Dolby Vision profiles that don't have HDR10 fallback, always use + // the dvhe decoder even if the display not supports Dolby Vision. + // For profiles that has HDR10 fallback (7, 8) is better use HEVC decoder to + // ensure HDR10 output if display is not DV capable. + bool notHasHDR10fallback = (m_hints.dovi.dv_profile == 4 || m_hints.dovi.dv_profile == 5); + + if (mediaCodecSupportsDovi && (displaySupportsDovi || notHasHDR10fallback)) { m_mime = "video/dolby-vision"; m_formatname = isDvhe ? "amc-dvhe" : "amc-dvh1"; diff --git a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.h b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.h index 5bf4da346f..43dcd465fb 100644 --- a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.h +++ b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.h @@ -32,6 +32,7 @@ class IAddonProvider; extern "C" { #include <libavcodec/avcodec.h> +#include <libavutil/dovi_meta.h> #include <libavutil/mastering_display_metadata.h> } @@ -166,6 +167,7 @@ public: std::string stereo_mode; // expected stereo mode StreamHdrType hdr_type = StreamHdrType::HDR_TYPE_NONE; // type of HDR for this stream (hdr10, etc) + AVDOVIDecoderConfigurationRecord dovi{}; bool bInterlaced; // progressive/interlaced flag bool bUnknownIP; // progressive/interlace unknown }; diff --git a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp index 66ff48b731..e88b1f1da3 100644 --- a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +++ b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp @@ -53,8 +53,10 @@ extern "C" #include <stdint.h> #endif -extern "C" { +extern "C" +{ #include <libavutil/dict.h> +#include <libavutil/dovi_meta.h> #include <libavutil/opt.h> } @@ -1719,6 +1721,15 @@ CDemuxStream* CDVDDemuxFFmpeg::AddStream(int streamIdx) int size = 0; uint8_t* side_data = nullptr; + if (st->hdr_type == StreamHdrType::HDR_TYPE_DOLBYVISION) + { + side_data = av_stream_get_side_data(pStream, AV_PKT_DATA_DOVI_CONF, &size); + if (side_data && size) + { + st->dovi = *reinterpret_cast<AVDOVIDecoderConfigurationRecord*>(side_data); + } + } + side_data = av_stream_get_side_data(pStream, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, &size); if (side_data && size) { diff --git a/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp b/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp index 556a9182c3..0bac726df6 100644 --- a/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp +++ b/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp @@ -11,6 +11,8 @@ #include "DVDDemuxers/DVDDemux.h" #include "cores/VideoPlayer/Interface/DemuxCrypto.h" +#include <cstring> + CDVDStreamInfo::CDVDStreamInfo() { extradata = NULL; Clear(); } CDVDStreamInfo::CDVDStreamInfo(const CDVDStreamInfo &right, bool withextradata ) { extradata = NULL; Clear(); Assign(right, withextradata); } CDVDStreamInfo::CDVDStreamInfo(const CDemuxStream &right, bool withextradata ) { extradata = NULL; Clear(); Assign(right, withextradata); } @@ -63,6 +65,7 @@ void CDVDStreamInfo::Clear() masteringMetadata = nullptr; contentLightMetadata = nullptr; stereo_mode.clear(); + dovi = {}; channels = 0; samplerate = 0; @@ -150,6 +153,9 @@ bool CDVDStreamInfo::Equal(const CDVDStreamInfo& right, int compare) else if (contentLightMetadata || right.contentLightMetadata) return false; + if (0 != std::memcmp(&dovi, &right.dovi, sizeof(AVDOVIDecoderConfigurationRecord))) + return false; + // AUDIO if( channels != right.channels || samplerate != right.samplerate @@ -234,6 +240,7 @@ void CDVDStreamInfo::Assign(const CDVDStreamInfo& right, bool withextradata) masteringMetadata = right.masteringMetadata; contentLightMetadata = right.contentLightMetadata; stereo_mode = right.stereo_mode; + dovi = right.dovi; // AUDIO channels = right.channels; @@ -309,6 +316,7 @@ void CDVDStreamInfo::Assign(const CDemuxStream& right, bool withextradata) masteringMetadata = stream->masteringMetaData; contentLightMetadata = stream->contentLightMetaData; stereo_mode = stream->stereo_mode; + dovi = stream->dovi; } else if (right.type == STREAM_SUBTITLE) { diff --git a/xbmc/cores/VideoPlayer/DVDStreamInfo.h b/xbmc/cores/VideoPlayer/DVDStreamInfo.h index 5c30334f8e..8d2989af75 100644 --- a/xbmc/cores/VideoPlayer/DVDStreamInfo.h +++ b/xbmc/cores/VideoPlayer/DVDStreamInfo.h @@ -10,8 +10,10 @@ #include "DVDDemuxers/DVDDemux.h" -extern "C" { +extern "C" +{ #include <libavcodec/avcodec.h> +#include <libavutil/dovi_meta.h> } #include "DVDClock.h" @@ -78,6 +80,7 @@ public: std::shared_ptr<AVMasteringDisplayMetadata> masteringMetadata; std::shared_ptr<AVContentLightMetadata> contentLightMetadata; std::string stereo_mode; // stereoscopic 3d mode + AVDOVIDecoderConfigurationRecord dovi{}; CDVDClock *pClock; // AUDIO -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0002-Improve-Dolby-Vision-detection-for-Android.patch ================================================ From 684e791b37f4a0c60af89c3a28bf1404d4cd0614 Mon Sep 17 00:00:00 2001 From: Serghei Scobici <serghei.scobici@endava.com> Date: Sun, 8 Jan 2023 17:08:09 +0200 Subject: [PATCH 02/21] Improve Dolby Vision detection for Android --- .../DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp | 10 ++++++++++ xbmc/cores/VideoPlayer/DVDStreamInfo.cpp | 4 ++++ xbmc/cores/VideoPlayer/DVDStreamInfo.h | 1 + 3 files changed, 15 insertions(+) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp index 0be40dd87c..ae8943655e 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp @@ -501,6 +501,16 @@ bool CDVDVideoCodecAndroidMediaCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptio bool isDvhe = (m_hints.codec_tag == MKTAG('d', 'v', 'h', 'e')); bool isDvh1 = (m_hints.codec_tag == MKTAG('d', 'v', 'h', '1')); + // some files don't have dvhe or dvh1 tag set up but have Dolby Vision side data + if (!isDvhe && !isDvh1 && m_hints.hdrType == StreamHdrType::HDR_TYPE_DOLBYVISION) + { + // page 10, table 2 from https://professional.dolby.com/siteassets/content-creation/dolby-vision-for-content-creators/dolby-vision-streams-within-the-http-live-streaming-format-v2.0-13-november-2018.pdf + if (m_hints.codec_tag == MKTAG('h', 'v', 'c', '1')) + isDvh1 = true; + else + isDvhe = true; + } + if (isDvhe || isDvh1) { bool displaySupportsDovi = CAndroidUtils::GetDisplayHDRCapabilities().SupportsDolbyVision(); diff --git a/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp b/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp index 0bac726df6..df9dc537fb 100644 --- a/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp +++ b/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp @@ -58,6 +58,7 @@ void CDVDStreamInfo::Clear() ptsinvalid = false; forced_aspect = false; bitsperpixel = 0; + hdrType = StreamHdrType::HDR_TYPE_NONE; colorSpace = AVCOL_SPC_UNSPECIFIED; colorRange = AVCOL_RANGE_UNSPECIFIED; colorPrimaries = AVCOL_PRI_UNSPECIFIED; @@ -109,6 +110,7 @@ bool CDVDStreamInfo::Equal(const CDVDStreamInfo& right, int compare) || bitsperpixel != right.bitsperpixel || bitdepth != right.bitdepth || vfr != right.vfr + || hdrType != right.hdrType || colorSpace != right.colorSpace || colorRange != right.colorRange || colorPrimaries != right.colorPrimaries @@ -233,6 +235,7 @@ void CDVDStreamInfo::Assign(const CDVDStreamInfo& right, bool withextradata) bitdepth = right.bitdepth; vfr = right.vfr; codecOptions = right.codecOptions; + hdrType = right.hdrType; colorSpace = right.colorSpace; colorRange = right.colorRange; colorPrimaries = right.colorPrimaries; @@ -309,6 +312,7 @@ void CDVDStreamInfo::Assign(const CDemuxStream& right, bool withextradata) orientation = stream->iOrientation; bitsperpixel = stream->iBitsPerPixel; bitdepth = stream->bitDepth; + hdrType = stream->hdr_type; colorSpace = stream->colorSpace; colorRange = stream->colorRange; colorPrimaries = stream->colorPrimaries; diff --git a/xbmc/cores/VideoPlayer/DVDStreamInfo.h b/xbmc/cores/VideoPlayer/DVDStreamInfo.h index 8d2989af75..ed94acd6b3 100644 --- a/xbmc/cores/VideoPlayer/DVDStreamInfo.h +++ b/xbmc/cores/VideoPlayer/DVDStreamInfo.h @@ -73,6 +73,7 @@ public: int orientation; // orientation of the video in degrees counter clockwise int bitsperpixel; int bitdepth; + StreamHdrType hdrType; AVColorSpace colorSpace; AVColorRange colorRange; AVColorPrimaries colorPrimaries; -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0003-WinSystemAmlogic-rework-EGL-native-window.patch ================================================ From 8a013649ea33ea8ce2f4bfd432260de1609eb977 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 6 Oct 2022 16:47:58 +0200 Subject: [PATCH 03/21] WinSystemAmlogic: rework EGL native window The <EGL/fbdev_window.h> include was missing and native window was NULL as _FBDEV_WINDOW_H_ was not defined. --- xbmc/windowing/amlogic/WinSystemAmlogic.cpp | 33 ++++++++----------- xbmc/windowing/amlogic/WinSystemAmlogic.h | 4 +-- .../amlogic/WinSystemAmlogicGLESContext.cpp | 2 +- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp index 3d40e6b24d..0a52b95144 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp @@ -38,8 +38,9 @@ using namespace KODI; -CWinSystemAmlogic::CWinSystemAmlogic() : - m_libinput(new CLibInputHandler) +CWinSystemAmlogic::CWinSystemAmlogic() +: m_nativeWindow(NULL) +, m_libinput(new CLibInputHandler) { const char *env_framebuffer = getenv("FRAMEBUFFER"); @@ -53,7 +54,6 @@ CWinSystemAmlogic::CWinSystemAmlogic() : } m_nativeDisplay = EGL_NO_DISPLAY; - m_nativeWindow = static_cast<EGLNativeWindowType>(NULL); m_displayWidth = 0; m_displayHeight = 0; @@ -64,14 +64,6 @@ CWinSystemAmlogic::CWinSystemAmlogic() : m_libinput->Start(); } -CWinSystemAmlogic::~CWinSystemAmlogic() -{ - if(m_nativeWindow) - { - m_nativeWindow = static_cast<EGLNativeWindowType>(NULL); - } -} - bool CWinSystemAmlogic::InitWindowSystem() { const std::shared_ptr<CSettings> settings = CServiceBroker::GetSettingsComponent()->GetSettings(); @@ -146,6 +138,12 @@ bool CWinSystemAmlogic::CreateNewWindow(const std::string& name, m_displayHeight = res.iScreenHeight; m_fRefreshRate = res.fRefreshRate; + if (m_nativeWindow == NULL) + m_nativeWindow = new fbdev_window; + + m_nativeWindow->width = m_nWidth; + m_nativeWindow->height = m_nHeight; + if ((m_bWindowCreated && aml_get_native_resolution(¤t_resolution)) && current_resolution.iWidth == res.iWidth && current_resolution.iHeight == res.iHeight && current_resolution.iScreenWidth == res.iScreenWidth && current_resolution.iScreenHeight == res.iScreenHeight && @@ -175,13 +173,6 @@ bool CWinSystemAmlogic::CreateNewWindow(const std::string& name, m_stereo_mode = stereo_mode; m_bFullScreen = fullScreen; -#ifdef _FBDEV_WINDOW_H_ - fbdev_window *nativeWindow = new fbdev_window; - nativeWindow->width = res.iWidth; - nativeWindow->height = res.iHeight; - m_nativeWindow = static_cast<EGLNativeWindowType>(nativeWindow); -#endif - aml_set_native_resolution(res, m_framebuffer_name, stereo_mode); if (!m_delayDispReset) @@ -199,7 +190,11 @@ bool CWinSystemAmlogic::CreateNewWindow(const std::string& name, bool CWinSystemAmlogic::DestroyWindow() { - m_nativeWindow = static_cast<EGLNativeWindowType>(NULL); + if (m_nativeWindow != NULL) + { + delete(m_nativeWindow); + m_nativeWindow = NULL; + } return true; } diff --git a/xbmc/windowing/amlogic/WinSystemAmlogic.h b/xbmc/windowing/amlogic/WinSystemAmlogic.h index 7cfb2dc7c3..2c70086caa 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogic.h +++ b/xbmc/windowing/amlogic/WinSystemAmlogic.h @@ -14,6 +14,7 @@ #include "windowing/WinSystem.h" #include "threads/SystemClock.h" #include "system_egl.h" +#include <EGL/fbdev_window.h> class IDispResource; @@ -21,7 +22,6 @@ class CWinSystemAmlogic : public CWinSystemBase { public: CWinSystemAmlogic(); - virtual ~CWinSystemAmlogic(); bool InitWindowSystem() override; bool DestroyWindowSystem() override; @@ -42,7 +42,7 @@ public: protected: std::string m_framebuffer_name; EGLDisplay m_nativeDisplay; - EGLNativeWindowType m_nativeWindow; + fbdev_window *m_nativeWindow; int m_displayWidth; int m_displayHeight; diff --git a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp index 16ba54a02f..f6cbac696b 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp @@ -74,7 +74,7 @@ bool CWinSystemAmlogicGLESContext::CreateNewWindow(const std::string& name, return false; } - if (!m_pGLContext.CreateSurface(m_nativeWindow)) + if (!m_pGLContext.CreateSurface(static_cast<EGLNativeWindowType>(m_nativeWindow))) { return false; } -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0004-WinSystemAmlogicGLES-clean-up-GLES-references-on-win.patch ================================================ From abad3ebbbea8de81c7f92d5caea3da94d54b0614 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 26 Jan 2023 11:39:43 +0100 Subject: [PATCH 04/21] WinSystemAmlogicGLES: clean up GLES references on window destroy --- .../amlogic/WinSystemAmlogicGLESContext.cpp | 18 +++++++++++++----- .../amlogic/WinSystemAmlogicGLESContext.h | 2 ++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp index f6cbac696b..39fbaf03a1 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp @@ -58,17 +58,19 @@ bool CWinSystemAmlogicGLESContext::InitWindowSystem() return true; } +bool CWinSystemAmlogicGLESContext::DestroyWindowSystem() +{ + m_pGLContext.DestroyContext(); + m_pGLContext.Destroy(); + return CWinSystemAmlogic::DestroyWindowSystem(); +} + bool CWinSystemAmlogicGLESContext::CreateNewWindow(const std::string& name, bool fullScreen, RESOLUTION_INFO& res) { m_pGLContext.DestroySurface(); - if (!CWinSystemAmlogic::DestroyWindow()) - { - return false; - } - if (!CWinSystemAmlogic::CreateNewWindow(name, fullScreen, res)) { return false; @@ -95,6 +97,12 @@ bool CWinSystemAmlogicGLESContext::CreateNewWindow(const std::string& name, return true; } +bool CWinSystemAmlogicGLESContext::DestroyWindow() +{ + m_pGLContext.DestroySurface(); + return CWinSystemAmlogic::DestroyWindow(); +} + bool CWinSystemAmlogicGLESContext::ResizeWindow(int newWidth, int newHeight, int newLeft, int newTop) { CRenderSystemGLES::ResetRenderSystem(newWidth, newHeight); diff --git a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.h b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.h index d2f0e84e90..7d7467ee1a 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.h +++ b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.h @@ -32,9 +32,11 @@ public: // Implementation of CWinSystemBase via CWinSystemAmlogic CRenderSystemBase *GetRenderSystem() override { return this; } bool InitWindowSystem() override; + bool DestroyWindowSystem() override; bool CreateNewWindow(const std::string& name, bool fullScreen, RESOLUTION_INFO& res) override; + bool DestroyWindow() override; bool ResizeWindow(int newWidth, int newHeight, int newLeft, int newTop) override; bool SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays) override; -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0005-tools-depends-Add-Rust-toolchain-cargo-c-and-libdovi.patch ================================================ From 76387530102fc7c9226e0f4df2561a769f5343aa Mon Sep 17 00:00:00 2001 From: quietvoid <39477805+quietvoid@users.noreply.github.com> Date: Sat, 11 Mar 2023 08:39:55 -0500 Subject: [PATCH 05/21] tools/depends: Add Rust toolchain, cargo-c and libdovi dependencies --- docs/README.Android.md | 4 ++ tools/depends/Makefile.include.in | 1 + tools/depends/configure.ac | 7 +++ tools/depends/native/Makefile | 8 +++- tools/depends/native/cargo-c/CARGO-C-VERSION | 5 ++ tools/depends/native/cargo-c/Makefile | 38 ++++++++++++++++ tools/depends/native/rustup/Makefile | 48 ++++++++++++++++++++ tools/depends/native/rustup/RUSTUP-VERSION | 5 ++ tools/depends/target/Makefile | 4 ++ tools/depends/target/libdovi/LIBDOVI-VERSION | 6 +++ tools/depends/target/libdovi/Makefile | 43 ++++++++++++++++++ 11 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 tools/depends/native/cargo-c/CARGO-C-VERSION create mode 100644 tools/depends/native/cargo-c/Makefile create mode 100644 tools/depends/native/rustup/Makefile create mode 100644 tools/depends/native/rustup/RUSTUP-VERSION create mode 100644 tools/depends/target/libdovi/LIBDOVI-VERSION create mode 100644 tools/depends/target/libdovi/Makefile diff --git a/docs/README.Android.md b/docs/README.Android.md index ecc0dcbbd1..48c7881d4b 100644 --- a/docs/README.Android.md +++ b/docs/README.Android.md @@ -236,6 +236,10 @@ make -j$(getconf _NPROCESSORS_ONLN) ``` FFmpeg configure options, e.g. --enable-vaapi (target) +``` +--enable-libdovi=<yes:no> +``` + enable `libdovi`, for on-the-fly Dolby Vision conversion. Defaults to no. **Android Specific:** diff --git a/tools/depends/Makefile.include.in b/tools/depends/Makefile.include.in index 3a36d20d68..03c27df67b 100644 --- a/tools/depends/Makefile.include.in +++ b/tools/depends/Makefile.include.in @@ -31,6 +31,7 @@ SHA512SUM=@SHA512SUM@ SHA256SUM=@SHA256SUM@ SHASUM=@SHASUM@ HASH_TOOL_FLAGS=-c --status +ENABLE_LIBDOVI=@use_libdovi@ HAS_ZLIB=@has_zlib@ NEED_LIBICONV=@need_libiconv@ diff --git a/tools/depends/configure.ac b/tools/depends/configure.ac index 79ab65900b..929300b31e 100644 --- a/tools/depends/configure.ac +++ b/tools/depends/configure.ac @@ -129,6 +129,11 @@ AC_ARG_WITH([ffmpeg-options], [ffmpeg_options=$withval], [ffmpeg_options=default]) +AC_ARG_ENABLE([libdovi], + [AS_HELP_STRING([--enable-libdovi], + [enable libdovi (optional for android). default is no])], + [use_libdovi=$enableval], + [use_libdovi=no]) if test "$use_ccache" = "yes"; then AC_CHECK_PROG(HAVE_CCACHE,ccache,"yes","no",) @@ -717,6 +722,7 @@ AC_SUBST(host_cxxflags) AC_SUBST(app_rendersystem) AC_SUBST(app_winsystem) AC_SUBST(ffmpeg_options) +AC_SUBST(use_libdovi) [ if test "x$CCACHE" = "x" @@ -853,4 +859,5 @@ echo -e "depends:\t\t $prefix/$deps_dir" if test "$platform_os" = "android"; then echo -e "ndk-api-level:\t $use_ndk_api" echo -e "build-tools:\t $build_tools_path" + echo -e "libdovi:\t $use_libdovi" fi diff --git a/tools/depends/native/Makefile b/tools/depends/native/Makefile index 800270f8a3..7a3db29391 100644 --- a/tools/depends/native/Makefile +++ b/tools/depends/native/Makefile @@ -50,6 +50,12 @@ ifeq ($(OS),linux) endif endif +ifeq ($(OS),android) + ifeq ($(ENABLE_LIBDOVI),yes) + NATIVE += rustup cargo-c + endif +endif + .PHONY: $(NATIVE) native all: native @@ -59,6 +65,7 @@ all: native autoconf-archive: autoconf autoconf: m4 automake: autoconf +cargo-c: pkg-config openssl rustup dpkg: automake gettext libtool pkg-config tar heimdal: libtool JsonSchemaBuilder: automake @@ -102,4 +109,3 @@ test-dependencies: distclean:: for d in $(NATIVE); do $(MAKE) -C $$d distclean; done - diff --git a/tools/depends/native/cargo-c/CARGO-C-VERSION b/tools/depends/native/cargo-c/CARGO-C-VERSION new file mode 100644 index 0000000000..3d470c5729 --- /dev/null +++ b/tools/depends/native/cargo-c/CARGO-C-VERSION @@ -0,0 +1,5 @@ +APPNAME=cargo-c +BASE_URL=https://github.com/lu-zero/cargo-c/archive +VERSION=v0.9.17 +ARCHIVE=$(VERSION).tar.gz +SHA512=529db1de509add6c3ad58932ee16326bf0a2e7d154797adbf2b3755ae98b4f59bf0d01250e75ad4fc63b7ea34579cded7d7c6c3c8b92db6d8e00994062ee136f diff --git a/tools/depends/native/cargo-c/Makefile b/tools/depends/native/cargo-c/Makefile new file mode 100644 index 0000000000..3c12014999 --- /dev/null +++ b/tools/depends/native/cargo-c/Makefile @@ -0,0 +1,38 @@ +include ../../Makefile.include CARGO-C-VERSION ../../download-files.include +DEPS = ../../Makefile.include Makefile CARGO-C-VERSION ../../download-files.include + +PREFIX=$(NATIVEPREFIX) +PLATFORM=$(NATIVEPLATFORM) + +export PKG_CONFIG_PATH=$(PREFIX)/lib/pkgconfig + +APP=$(PLATFORM)/target/release/$(APPNAME) + +CARGO_ENV_VARS = RUSTUP_HOME=$(PREFIX)/.rustup \ + CARGO_HOME=$(PREFIX)/.cargo +CARGO = $(CARGO_ENV_VARS) $(PREFIX)/bin/cargo + +CLEANUP_CMD = [ -e $(PREFIX)/bin/cargo ] \ + && $(CARGO) uninstall cargo-c || true + +all: .installed-$(PLATFORM) + +$(PLATFORM): $(DEPS) | $(TARBALLS_LOCATION)/$(ARCHIVE).$(HASH_TYPE) + rm -rf $(PLATFORM)/*; mkdir -p $(PLATFORM) + cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) + +$(APP): $(PLATFORM) + $(CARGO) build --release --manifest-path $(PLATFORM)/Cargo.toml + +.installed-$(PLATFORM): $(APP) + $(CARGO) install --profile release --path $(PLATFORM) + + touch $@ + +clean: + $(CLEANUP_CMD) + rm -f .installed-$(PLATFORM) + +distclean:: + $(CLEANUP_CMD) + rm -rf $(PLATFORM) .installed-$(PLATFORM) diff --git a/tools/depends/native/rustup/Makefile b/tools/depends/native/rustup/Makefile new file mode 100644 index 0000000000..67c014b97e --- /dev/null +++ b/tools/depends/native/rustup/Makefile @@ -0,0 +1,48 @@ +include ../../Makefile.include RUSTUP-VERSION ../../download-files.include +DEPS = ../../Makefile.include Makefile RUSTUP-VERSION ../../download-files.include + +PREFIX=$(NATIVEPREFIX) +PLATFORM=$(NATIVEPLATFORM) + +export RUSTUP_HOME=$(PREFIX)/.rustup +export CARGO_HOME=$(PREFIX)/.cargo + +APP=$(PLATFORM)/bin/$(APPNAME) + +RUSTUP_ENV_VARS = RUSTUP_HOME=$(PREFIX)/.rustup \ + CARGO_HOME=$(PREFIX)/.cargo +RUSTUP = $(RUSTUP_ENV_VARS) $(PREFIX)/bin/rustup + +CLEANUP_CMD=[ -e $(PREFIX)/bin/rustup ] \ + && $(RUSTUP) self uninstall -y \ + && rm -f $(PREFIX)/bin/rustup \ + && rm -f $(PREFIX)/bin/cargo || true + +all: .installed-$(PLATFORM) + +$(PLATFORM): $(DEPS) | $(TARBALLS_LOCATION)/$(ARCHIVE).$(HASH_TYPE) + rm -rf $(PLATFORM)/*; mkdir -p $(PLATFORM) + cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) + +$(APP): $(PLATFORM) + bash $(PLATFORM)/rustup-init.sh --no-modify-path -y + +.installed-$(PLATFORM): $(APP) + ln -sf $(CARGO_HOME)/bin/rustup $(PREFIX)/bin/rustup + ln -sf $(CARGO_HOME)/bin/cargo $(PREFIX)/bin/cargo + + $(RUSTUP) default stable + +ifeq ($(CROSS_COMPILING),yes) + $(RUSTUP) target add $(HOST) +endif + + touch $@ + +clean: + $(CLEANUP_CMD) + rm -f .installed-$(PLATFORM) + +distclean:: + $(CLEANUP_CMD) + rm -rf $(PLATFORM) .installed-$(PLATFORM) diff --git a/tools/depends/native/rustup/RUSTUP-VERSION b/tools/depends/native/rustup/RUSTUP-VERSION new file mode 100644 index 0000000000..74bd54c23a --- /dev/null +++ b/tools/depends/native/rustup/RUSTUP-VERSION @@ -0,0 +1,5 @@ +APPNAME=rustup +BASE_URL=https://github.com/rust-lang/rustup.rs/archive +VERSION=1.25.1 +ARCHIVE=$(VERSION).tar.gz +SHA512=a77cb34ba0c2e7577c8acbd474197aabaa84e3b64b3c42f1d0c328df55c6accbe412aba9a787f0ea2f0654f085475455c9c488b2b6de34ad8889a2716d1e8d0c diff --git a/tools/depends/target/Makefile b/tools/depends/target/Makefile index 28d122a602..4e18ed08ef 100644 --- a/tools/depends/target/Makefile +++ b/tools/depends/target/Makefile @@ -79,6 +79,10 @@ ifeq ($(OS),android) DEPENDS += dummy-libxbmc libuuid PYMODULE_DEPS = dummy-libxbmc LIBUUID = libuuid + + ifeq ($(ENABLE_LIBDOVI),yes) + DEPENDS += libdovi + endif endif DEPENDS := $(filter-out $(EXCLUDED_DEPENDS),$(DEPENDS)) diff --git a/tools/depends/target/libdovi/LIBDOVI-VERSION b/tools/depends/target/libdovi/LIBDOVI-VERSION new file mode 100644 index 0000000000..1fe73ed11f --- /dev/null +++ b/tools/depends/target/libdovi/LIBDOVI-VERSION @@ -0,0 +1,6 @@ +LIBNAME=libdovi +BASE_URL=https://github.com/quietvoid/dovi_tool/archive +VERSION=libdovi-3.1.2 +ARCHIVE=$(VERSION).tar.gz +SHA512=577d5a5916dedbf222150ddb76219325e0e9a7ae91c5978b1b1fd65048d1f548e29aa8ebbbdc836380ec399e2bc105a722515f783be70837dc6403cb34586bb2 +BYPRODUCT=libdovi.a diff --git a/tools/depends/target/libdovi/Makefile b/tools/depends/target/libdovi/Makefile new file mode 100644 index 0000000000..2d868d2fde --- /dev/null +++ b/tools/depends/target/libdovi/Makefile @@ -0,0 +1,43 @@ +include ../../Makefile.include LIBDOVI-VERSION ../../download-files.include +DEPS = ../../Makefile.include Makefile LIBDOVI-VERSION ../../download-files.include + +LIBDYLIB=$(PLATFORM)/target/$(HOST)/release/$(BYPRODUCT) + +CARGO_ENV_VARS = RUSTUP_HOME=$(NATIVEPREFIX)/.rustup \ + CARGO_HOME=$(NATIVEPREFIX)/.cargo +CARGO = $(CARGO_ENV_VARS) $(NATIVEPREFIX)/bin/cargo + +CARGO_BASE_OPTS = --manifest-path $(PLATFORM)/dolby_vision/Cargo.toml +ifeq ($(CROSS_COMPILING),yes) + CARGO_BASE_OPTS += --target $(HOST) +endif + +CARGO_BUILD_OPTS = --offline \ + --frozen \ + --library-type staticlib \ + --profile release \ + --prefix $(PREFIX) \ + $(CARGO_BASE_OPTS) + +all: .installed-$(PLATFORM) + +$(PLATFORM): $(DEPS) | $(TARBALLS_LOCATION)/$(ARCHIVE).$(HASH_TYPE) + rm -rf $(PLATFORM)/*; mkdir -p $(PLATFORM) + cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) + cd $(PLATFORM); + $(CARGO) fetch $(CARGO_BASE_OPTS) + +$(LIBDYLIB): $(PLATFORM) + $(CARGO) cbuild $(CARGO_BUILD_OPTS) + +.installed-$(PLATFORM): $(LIBDYLIB) + $(CARGO) cinstall $(CARGO_BUILD_OPTS) + + touch $@ + +clean: + cd $(PLATFORM); $(CARGO) clean + rm -f .installed-$(PLATFORM) + +distclean:: + rm -rf $(PLATFORM) .installed-$(PLATFORM) -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0006-Add-libdovi-as-optional-build-dependency.patch ================================================ From e4d478490bdefd7977285e1a5b807525791621c7 Mon Sep 17 00:00:00 2001 From: quietvoid <39477805+quietvoid@users.noreply.github.com> Date: Sat, 11 Mar 2023 08:40:00 -0500 Subject: [PATCH 06/21] Add libdovi as optional build dependency --- cmake/modules/FindLibDovi.cmake | 32 ++++++++++++++++++++++++++++ cmake/platform/android/android.cmake | 1 + 2 files changed, 33 insertions(+) create mode 100644 cmake/modules/FindLibDovi.cmake diff --git a/cmake/modules/FindLibDovi.cmake b/cmake/modules/FindLibDovi.cmake new file mode 100644 index 0000000000..8646ba368a --- /dev/null +++ b/cmake/modules/FindLibDovi.cmake @@ -0,0 +1,32 @@ +# FindDovi +# ------- +# Finds the libdovi library +# +# This will define the following variables:: +# +# LIBDOVI_FOUND - system has libdovi +# LIBDOVI_INCLUDE_DIRS - the libdovi include directories +# LIBDOVI_LIBRARIES - the libdovi libraries +# LIBDOVI_DEFINITIONS - the libdovi compile definitions + +if(PKG_CONFIG_FOUND) + pkg_check_modules(PC_LIBDOVI libdovi QUIET) +endif() + +find_library(LIBDOVI_LIBRARY NAMES dovi libdovi + PATHS ${PC_LIBDOVI_LIBDIR} +) +find_path(LIBDOVI_INCLUDE_DIR NAMES libdovi/rpu_parser.h + PATHS ${PC_LIBDOVI_INCLUDEDIR}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LibDovi + REQUIRED_VARS LIBDOVI_LIBRARY LIBDOVI_INCLUDE_DIR) + +if(LIBDOVI_FOUND) + set(LIBDOVI_INCLUDE_DIRS ${LIBDOVI_INCLUDE_DIR}) + set(LIBDOVI_LIBRARIES ${LIBDOVI_LIBRARY}) + set(LIBDOVI_DEFINITIONS -DHAVE_LIBDOVI=1) +endif() + +mark_as_advanced(LIBDOVI_INCLUDE_DIR LIBDOVI_LIBRARY) diff --git a/cmake/platform/android/android.cmake b/cmake/platform/android/android.cmake index 2c4fbb48f2..ca3fad9dce 100644 --- a/cmake/platform/android/android.cmake +++ b/cmake/platform/android/android.cmake @@ -1,5 +1,6 @@ set(PLATFORM_REQUIRED_DEPS LibAndroidJNI OpenGLES EGL LibZip) set(APP_RENDER_SYSTEM gles) +list(APPEND PLATFORM_OPTIONAL_DEPS LibDovi) # Store SDK compile version set(TARGET_SDK 33) -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0007-Optionally-convert-Dolby-Vision.patch ================================================ From 918640afdbf41fa2670b104346ccb11ee2b2a455 Mon Sep 17 00:00:00 2001 From: quietvoid <39477805+quietvoid@users.noreply.github.com> Date: Sat, 11 Mar 2023 08:40:03 -0500 Subject: [PATCH 07/21] Optionally convert Dolby Vision To improve compatibility --- .../resources/strings.po | 12 +++ system/settings/settings.xml | 9 +++ .../Video/DVDVideoCodecAndroidMediaCodec.cpp | 8 ++ xbmc/settings/Settings.h | 1 + xbmc/utils/BitstreamConverter.cpp | 76 ++++++++++++++++++- xbmc/utils/BitstreamConverter.h | 2 + 6 files changed, 107 insertions(+), 1 deletion(-) diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index 27c0c9e8e9..2b2237e431 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -23613,3 +23613,15 @@ msgstr "" msgctxt "#39189" msgid "Available only with manual subtitle position" msgstr "" + +#. Title of Dolby Vision RPU conversion setting +#: system/settings/settings.xml +msgctxt "#39300" +msgid "Convert Dolby Vision for compatibility" +msgstr "" + +#. Help text for setting "Convert Dolby Vision for compatibility" of label #39300 +#: system/settings/settings.xml +msgctxt "#39301" +msgid "Converts Dolby Vision profile 7 to profile 8.1, ignores enhancement layer" +msgstr "" diff --git a/system/settings/settings.xml b/system/settings/settings.xml index 3621d3225d..12a58527d9 100755 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -228,6 +228,15 @@ <default>true</default> <control type="toggle" /> </setting> + <setting id="videoplayer.convertdovi" type="boolean" label="39300" help="39301"> + <requirement>HAS_MEDIACODEC</requirement> + <level>2</level> + <default>false</default> + <updates> + <update type="change" /> + </updates> + <control type="toggle" /> + </setting> </group> <group id="4" label="14232"> <setting id="videoplayer.stereoscopicplaybackmode" type="integer" label="36520" help="36537"> diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp index ae8943655e..2135e7d6f8 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp @@ -543,7 +543,15 @@ bool CDVDVideoCodecAndroidMediaCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptio { m_bitstream.reset(); } + + if (m_bitstream) + { + bool convertDovi = CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( + CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI); + m_bitstream->SetConvertDovi(convertDovi); + } } + break; } case AV_CODEC_ID_WMV3: diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h index 8ac5485a9b..28e6c9d98d 100644 --- a/xbmc/settings/Settings.h +++ b/xbmc/settings/Settings.h @@ -133,6 +133,7 @@ public: static constexpr auto SETTING_VIDEOPLAYER_USESTAGEFRIGHT = "videoplayer.usestagefright"; static constexpr auto SETTING_VIDEOPLAYER_LIMITGUIUPDATE = "videoplayer.limitguiupdate"; static constexpr auto SETTING_VIDEOPLAYER_SUPPORTMVC = "videoplayer.supportmvc"; + static constexpr auto SETTING_VIDEOPLAYER_CONVERTDOVI = "videoplayer.convertdovi"; static constexpr auto SETTING_MYVIDEOS_SELECTACTION = "myvideos.selectaction"; static constexpr auto SETTING_MYVIDEOS_USETAGS = "myvideos.usetags"; static constexpr auto SETTING_MYVIDEOS_EXTRACTFLAGS = "myvideos.extractflags"; diff --git a/xbmc/utils/BitstreamConverter.cpp b/xbmc/utils/BitstreamConverter.cpp index 52152a4312..c51ac92138 100644 --- a/xbmc/utils/BitstreamConverter.cpp +++ b/xbmc/utils/BitstreamConverter.cpp @@ -20,6 +20,13 @@ #include <algorithm> +extern "C" +{ +#ifdef HAVE_LIBDOVI +#include <libdovi/rpu_parser.h> +#endif +} + enum { AVC_NAL_SLICE=1, AVC_NAL_DPA, @@ -269,6 +276,32 @@ static bool has_sei_recovery_point(const uint8_t *p, const uint8_t *end) return false; } +#ifdef HAVE_LIBDOVI +// The returned data must be freed with `dovi_data_free` +// May be NULL if no conversion was done +static const DoviData* convert_dovi_rpu_nal(uint8_t* buf, uint32_t nal_size) +{ + DoviRpuOpaque* rpu = dovi_parse_unspec62_nalu(buf, nal_size); + const DoviRpuDataHeader* header = dovi_rpu_get_header(rpu); + const DoviData* rpu_data = NULL; + + if (header && header->guessed_profile == 7) + { + int ret = dovi_convert_rpu_with_mode(rpu, 2); + if (ret < 0) + goto done; + + rpu_data = dovi_write_unspec62_nalu(rpu); + } + +done: + dovi_rpu_free_header(header); + dovi_rpu_free(rpu); + + return rpu_data; +} +#endif + //////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////// CBitstreamParser::CBitstreamParser() = default; @@ -336,6 +369,7 @@ CBitstreamConverter::CBitstreamConverter() m_convert_bytestream = false; m_sps_pps_context.sps_pps_data = NULL; m_start_decode = true; + m_convert_dovi = false; } CBitstreamConverter::~CBitstreamConverter() @@ -894,6 +928,10 @@ bool CBitstreamConverter::BitstreamConvert(uint8_t* pData, int iSize, uint8_t ** uint32_t cumul_size = 0; const uint8_t *buf_end = buf + buf_size; +#ifdef HAVE_LIBDOVI + const DoviData* rpu_data = NULL; +#endif + switch (m_codec) { case AV_CODEC_ID_H264: @@ -947,12 +985,48 @@ bool CBitstreamConverter::BitstreamConvert(uint8_t* pData, int iSize, uint8_t ** } else { - BitstreamAllocAndCopy(poutbuf, poutbuf_size, NULL, 0, buf, nal_size, unit_type); + bool write_buf = true; + const uint8_t* buf_to_write = buf; + int32_t final_nal_size = nal_size; + if (!m_sps_pps_context.first_idr && IsSlice(unit_type)) { m_sps_pps_context.first_idr = 1; m_sps_pps_context.idr_sps_pps_seen = 0; } + + if (m_convert_dovi) + { + if (unit_type == HEVC_NAL_UNSPEC62) + { +#ifdef HAVE_LIBDOVI + // Convert the RPU itself + rpu_data = convert_dovi_rpu_nal(buf, nal_size); + if (rpu_data) + { + buf_to_write = rpu_data->data; + final_nal_size = rpu_data->len; + } +#endif + } + else if (unit_type == HEVC_NAL_UNSPEC63) + { + // Ignore the enhancement layer, may or may not help + write_buf = false; + } + } + + if (write_buf) + BitstreamAllocAndCopy(poutbuf, poutbuf_size, NULL, 0, buf_to_write, final_nal_size, + unit_type); + +#ifdef HAVE_LIBDOVI + if (rpu_data) + { + dovi_data_free(rpu_data); + rpu_data = NULL; + } +#endif } buf += nal_size; diff --git a/xbmc/utils/BitstreamConverter.h b/xbmc/utils/BitstreamConverter.h index 355818ed8f..4381599b21 100644 --- a/xbmc/utils/BitstreamConverter.h +++ b/xbmc/utils/BitstreamConverter.h @@ -104,6 +104,7 @@ public: int GetExtraSize() const; void ResetStartDecode(void); bool CanStartDecode() const; + void SetConvertDovi(bool value) { m_convert_dovi = value; } static bool mpeg2_sequence_header(const uint8_t *data, const uint32_t size, mpeg2_sequence *sequence); static bool h264_sequence_header(const uint8_t *data, const uint32_t size, h264_sequence *sequence); @@ -150,4 +151,5 @@ protected: bool m_convert_bytestream; AVCodecID m_codec; bool m_start_decode; + bool m_convert_dovi; }; -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0008-tools-depends-Enable-libdovi-by-default.patch ================================================ From 733957e20ecb3c1694ac5952a85974da11e5ae22 Mon Sep 17 00:00:00 2001 From: quietvoid <39477805+quietvoid@users.noreply.github.com> Date: Sat, 11 Mar 2023 08:40:06 -0500 Subject: [PATCH 08/21] tools/depends: Enable libdovi by default Temporarily --- tools/depends/configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/depends/configure.ac b/tools/depends/configure.ac index 929300b31e..f084ce9d2b 100644 --- a/tools/depends/configure.ac +++ b/tools/depends/configure.ac @@ -133,7 +133,7 @@ AC_ARG_ENABLE([libdovi], [AS_HELP_STRING([--enable-libdovi], [enable libdovi (optional for android). default is no])], [use_libdovi=$enableval], - [use_libdovi=no]) + [use_libdovi=yes]) if test "$use_ccache" = "yes"; then AC_CHECK_PROG(HAVE_CCACHE,ccache,"yes","no",) -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0009-libdovi-use-and-adjust-libdovi-for-Amlogic-linux-pla.patch ================================================ From c3bf4157843319e7c457a89dd02355347d91507e Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 6 Apr 2023 21:07:55 +0200 Subject: [PATCH 09/21] libdovi: use and adjust libdovi for Amlogic linux platform --- cmake/platform/linux/aml.cmake | 1 + system/settings/settings.xml | 9 +++++++-- tools/depends/target/Makefile | 8 ++++---- .../DVDCodecs/Video/DVDVideoCodecAmlogic.cpp | 18 ++++++++++++++++++ 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/cmake/platform/linux/aml.cmake b/cmake/platform/linux/aml.cmake index 4206c283e2..673877bd16 100644 --- a/cmake/platform/linux/aml.cmake +++ b/cmake/platform/linux/aml.cmake @@ -1,2 +1,3 @@ list(APPEND PLATFORM_REQUIRED_DEPS OpenGLES AML EGL LibInput Xkbcommon) set(APP_RENDER_SYSTEM gles) +list(APPEND PLATFORM_OPTIONAL_DEPS LibDovi) diff --git a/system/settings/settings.xml b/system/settings/settings.xml index 12a58527d9..5268475ca7 100755 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -229,9 +229,14 @@ <control type="toggle" /> </setting> <setting id="videoplayer.convertdovi" type="boolean" label="39300" help="39301"> - <requirement>HAS_MEDIACODEC</requirement> + <requirement> + <or> + <condition>HAS_MEDIACODEC</condition> + <condition>HAVE_AMCODEC</condition> + </or> + </requirement> <level>2</level> - <default>false</default> + <default>true</default> <updates> <update type="change" /> </updates> diff --git a/tools/depends/target/Makefile b/tools/depends/target/Makefile index 4e18ed08ef..91ea4db5ef 100644 --- a/tools/depends/target/Makefile +++ b/tools/depends/target/Makefile @@ -79,10 +79,6 @@ ifeq ($(OS),android) DEPENDS += dummy-libxbmc libuuid PYMODULE_DEPS = dummy-libxbmc LIBUUID = libuuid - - ifeq ($(ENABLE_LIBDOVI),yes) - DEPENDS += libdovi - endif endif DEPENDS := $(filter-out $(EXCLUDED_DEPENDS),$(DEPENDS)) @@ -126,6 +122,10 @@ ifeq ($(OS),linux) endif endif +ifeq ($(ENABLE_LIBDOVI),yes) + DEPENDS += libdovi +endif + .PHONY: $(DEPENDS) all: .installed-$(PLATFORM) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp index 4ce0c3e48f..9d518f0051 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp @@ -277,6 +277,24 @@ bool CDVDVideoCodecAmlogic::Open(CDVDStreamInfo &hints, CDVDCodecOptions &option m_pFormatName = "am-h265"; m_bitstream = new CBitstreamConverter(); m_bitstream->Open(m_hints.codec, (uint8_t*)m_hints.extradata, m_hints.extrasize, true); + + // check for hevc-hvcC and convert to h265-annex-b + if (m_hints.extradata && !m_hints.cryptoSession) + { + if (m_bitstream && aml_support_dolby_vision()) + { + bool convertDovi = CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( + CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI); + bool user_dv_disable = CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( + CSettings::SETTING_COREELEC_AMLOGIC_DV_DISABLE); + if (convertDovi && !user_dv_disable) + { + CLog::Log(LOGDEBUG, "{}::{} - HEVC bitstream profile 7 will be converted to profile 8", __MODULE_NAME__, __FUNCTION__); + m_bitstream->SetConvertDovi(convertDovi && !user_dv_disable); + } + } + } + // make sure we do not leak the existing m_hints.extradata free(m_hints.extradata); m_hints.extrasize = m_bitstream->GetExtraSize(); -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0010-AMLCodec-add-support-of-Dolby-Vision.patch ================================================ From 75e4138e9b05ba26a2573b930bda53a6e44ccc5e Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Wed, 29 Mar 2023 16:36:49 +0200 Subject: [PATCH 10/21] AMLCodec: add support of Dolby Vision If 'dovi.ko' is available enable the DV option. --- .../resources/strings.po | 10 +++++ system/settings/settings.xml | 5 +++ .../VideoPlayer/DVDCodecs/Video/AMLCodec.cpp | 45 +++++++++++++++++++ xbmc/settings/Settings.h | 1 + xbmc/utils/AMLUtils.cpp | 20 +++++++++ xbmc/utils/AMLUtils.h | 1 + xbmc/windowing/amlogic/WinSystemAmlogic.cpp | 17 +++++++ 7 files changed, 99 insertions(+) diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index 2b2237e431..285d5d07b2 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -8669,6 +8669,16 @@ msgctxt "#14295" msgid "4:4:4" msgstr "" +#: system/settings/settings.xml +msgctxt "#14296" +msgid "Disable Dolby Vision support" +msgstr "" + +#: system/settings/settings.xml +msgctxt "#14297" +msgid "Use this option to disable Dolby Vision support if available." +msgstr "" + #empty strings from id 14296 to 14300 #. pvr "channels" settings group label diff --git a/system/settings/settings.xml b/system/settings/settings.xml index 5268475ca7..1b95376834 100755 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -3681,6 +3681,11 @@ <dependency type="enable" setting="coreelec.amlogic.sdr2hdr" operator="is">false</dependency> </dependencies> </setting> + <setting id="coreelec.amlogic.disabledolbyvision" type="boolean" label="14296" help="14297"> + <requirement>HAVE_AMCODEC</requirement> + <default>false</default> + <control type="toggle" /> + </setting> </group> </category> <category id="cache" label="439" help="36399"> diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp index 7ae850d048..59777ee196 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp @@ -22,6 +22,7 @@ #include "settings/SettingsComponent.h" #include "utils/AMLUtils.h" #include "utils/log.h" +#include "utils/StreamDetails.h" #include "utils/StringUtils.h" #include "utils/TimeUtils.h" #include "ServiceBroker.h" @@ -110,6 +111,7 @@ typedef struct { void *param; dec_mode_t dec_mode; enum FRAME_BASE_VIDEO_PATH video_path; + unsigned int dv_enable; } aml_generic_param; class DllLibamCodecInterface @@ -218,6 +220,7 @@ public: p_out->am_sysinfo.param = p_in->param; p_out->dec_mode = p_in->dec_mode; p_out->video_path = p_in->video_path; + p_out->dv_enable = p_in->dv_enable; } }; @@ -1965,6 +1968,15 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints) hints.aspect, video_ratio.num, video_ratio.den); CLog::Log(LOGDEBUG, "CAMLCodec::OpenDecoder hints.orientation({:d}), hints.forced_aspect({:d}), hints.extrasize({:d})", hints.orientation, hints.forced_aspect, hints.extrasize); + + std::string hdrType = CStreamDetails::HdrTypeToString(hints.hdrType); + if (hdrType.size()) + CLog::Log(LOGDEBUG, "CAMLCodec::OpenDecoder hdr type: {}", hdrType); + + if (hints.hdrType == StreamHdrType::HDR_TYPE_DOLBYVISION) + CLog::Log(LOGDEBUG, "CAMLCodec::OpenDecoder DOVI: version {:d}.{:d}, profile {:d}", + hints.dovi.dv_version_major, hints.dovi.dv_version_minor, hints.dovi.dv_profile); + m_processInfo.SetVideoDAR(hints.aspect); CLog::Log(LOGDEBUG, "CAMLCodec::OpenDecoder decoder timeout: {:d}s", m_decoder_timeout); @@ -1984,6 +1996,33 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints) am_private->gcodec.dec_mode = STREAM_TYPE_FRAME; am_private->gcodec.video_path = FRAME_BASE_PATH_AMLVIDEO_AMVIDEO; + // enable Dolby Vision driver when 'dovi.ko' is available + bool device_support_dv(aml_support_dolby_vision()); + bool user_dv_disable(CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_COREELEC_AMLOGIC_DV_DISABLE)); + bool dv_enable(device_support_dv && !user_dv_disable && hints.hdrType == StreamHdrType::HDR_TYPE_DOLBYVISION); + CLog::Log(LOGDEBUG, "CAMLCodec::OpenDecoder {}DV support, {}, DV system is {}", device_support_dv ? "" : "no ", + user_dv_disable ? "disabled" : "enabled", dv_enable ? "enabled" : "disabled"); + if (dv_enable) + { + // enable Dolby Vision + CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 1); + + am_private->gcodec.dv_enable = 1; + if (hints.dovi.dv_profile == 7 && !CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( + CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI)) + { + CSysfsPath amdolby_vision_debug{"/sys/class/amdolby_vision/debug"}; + if (amdolby_vision_debug.Exists()) + amdolby_vision_debug.Set("enable_fel 1"); + am_private->gcodec.dec_mode = STREAM_TYPE_STREAM; + } + } + else if (device_support_dv) + { + // disable Dolby Vision + CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 0); + } + // DEC_CONTROL_FLAG_DISABLE_FAST_POC CSysfsPath("/sys/module/amvdec_h264/parameters/dec_control", 4); @@ -2241,6 +2280,12 @@ void CAMLCodec::CloseDecoder() free(am_private->vcodec.config); // return tsync to default so external apps work CSysfsPath("/sys/class/tsync/enable", 1); + // disable Dolby Vision driver + //CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 0); + // don't disable it as it would not switch back to non DV mode anymore + CSysfsPath amdolby_vision_debug{"/sys/class/amdolby_vision/debug"}; + if (amdolby_vision_debug.Exists()) + amdolby_vision_debug.Set("enable_fel 0"); ShowMainVideo(false); diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h index 28e6c9d98d..8e5a31e1d7 100644 --- a/xbmc/settings/Settings.h +++ b/xbmc/settings/Settings.h @@ -441,6 +441,7 @@ public: static constexpr auto SETTING_COREELEC_AMLOGIC_LIMIT_CD = "coreelec.amlogic.limitcd"; static constexpr auto SETTING_COREELEC_AMLOGIC_FORCE_CS = "coreelec.amlogic.forcecs"; static constexpr auto SETTING_COREELEC_AMLOGIC_DISABLEGUISCALING = "coreelec.amlogic.disableguiscaling"; + static constexpr auto SETTING_COREELEC_AMLOGIC_DV_DISABLE = "coreelec.amlogic.disabledolbyvision"; static constexpr auto SETTING_CACHE_HARDDISK = "cache.harddisk"; static constexpr auto SETTING_CACHEVIDEO_DVDROM = "cachevideo.dvdrom"; static constexpr auto SETTING_CACHEVIDEO_LAN = "cachevideo.lan"; diff --git a/xbmc/utils/AMLUtils.cpp b/xbmc/utils/AMLUtils.cpp index 81f74448a8..c9e60d5c5f 100644 --- a/xbmc/utils/AMLUtils.cpp +++ b/xbmc/utils/AMLUtils.cpp @@ -148,6 +148,26 @@ bool aml_support_av1() return (has_av1 == 1); } +bool aml_support_dolby_vision() +{ + static int support_dv = -1; + + if (support_dv == -1) + { + CSysfsPath support_info{"/sys/class/amdolby_vision/support_info"}; + support_dv = 0; + if (support_info.Exists()) + { + support_dv = (int)((support_info.Get<int>().value() & 7) == 7); + CSysfsPath ko_info{"/sys/class/amdolby_vision/ko_info"}; + if (ko_info.Exists()) + CLog::Log(LOGDEBUG, "Amlogic Dolby Vision info: {}", ko_info.Get<std::string>().value().c_str()); + } + } + + return (support_dv == 1); +} + bool aml_has_frac_rate_policy() { static int has_frac_rate_policy = -1; diff --git a/xbmc/utils/AMLUtils.h b/xbmc/utils/AMLUtils.h index bfb06194bc..25e95d6961 100644 --- a/xbmc/utils/AMLUtils.h +++ b/xbmc/utils/AMLUtils.h @@ -56,6 +56,7 @@ bool aml_support_hevc_10bit(); AML_SUPPORT_H264_4K2K aml_support_h264_4k2k(); bool aml_support_vp9(); bool aml_support_av1(); +bool aml_support_dolby_vision(); bool aml_has_frac_rate_policy(); void aml_set_audio_passthrough(bool passthrough); bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res); diff --git a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp index 0a52b95144..616c205e6f 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp @@ -90,6 +90,23 @@ bool CWinSystemAmlogic::InitWindowSystem() CSysfsPath("/sys/module/am_vecm/parameters/hdr_mode", 1); } + if (!aml_support_dolby_vision()) + { + auto setting = settings->GetSetting(CSettings::SETTING_COREELEC_AMLOGIC_DV_DISABLE); + if (setting) + { + setting->SetVisible(false); + settings->SetBool(CSettings::SETTING_COREELEC_AMLOGIC_DV_DISABLE, false); + } + + setting = settings->GetSetting(CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI); + if (setting) + { + setting->SetVisible(false); + settings->SetBool(CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI, true); + } + } + m_nativeDisplay = EGL_DEFAULT_DISPLAY; CDVDVideoCodecAmlogic::Register(); -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0011-libdovi-add-option-to-change-used-mode.patch ================================================ From 0fb60a17b2401ab655f5b2674e902545b144795a Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Tue, 11 Apr 2023 15:06:33 +0200 Subject: [PATCH 11/21] libdovi: add option to change used mode Modes: 0: Don't modify the RPU 1: Converts the RPU to be MEL compatible 2: Converts the RPU to be profile 8.1 compatible. Both luma and chroma mapping curves are set to no-op. This mode handles source profiles 5, 7 and 8. 3: Converts to static profile 8.4 4: Converts to profile 8.1 preserving luma and chroma mapping. Old mode 2 behaviour. Reference: https://github.com/quietvoid/dovi_tool/blob/main/dolby_vision/src/rpu/dovi_rpu.rs --- .../resources/strings.po | 32 ++++++++++++++++++- system/settings/settings.xml | 16 ++++++++-- .../VideoPlayer/DVDCodecs/Video/AMLCodec.cpp | 4 +-- .../DVDCodecs/Video/DVDVideoCodecAmlogic.cpp | 7 ++-- .../Video/DVDVideoCodecAndroidMediaCodec.cpp | 2 +- xbmc/utils/BitstreamConverter.cpp | 8 ++--- xbmc/utils/BitstreamConverter.h | 4 +-- xbmc/windowing/amlogic/WinSystemAmlogic.cpp | 2 +- 8 files changed, 58 insertions(+), 17 deletions(-) diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index 285d5d07b2..3b05260f01 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -23633,5 +23633,35 @@ msgstr "" #. Help text for setting "Convert Dolby Vision for compatibility" of label #39300 #: system/settings/settings.xml msgctxt "#39301" -msgid "Converts Dolby Vision profile 7 to profile 8.1, ignores enhancement layer" +msgid "Converts Dolby Vision profile 7 by chosen mode" +msgstr "" + +#. Enum value for "Convert Dolby Vision for compatibility" of label #39300 +#: system/settings/settings.xml +msgctxt "#39302" +msgid "Lossless" +msgstr "" + +#. Enum value for "Convert Dolby Vision for compatibility" of label #39300 +#: system/settings/settings.xml +msgctxt "#39303" +msgid "Minimal EL" +msgstr "" + +#. Enum value for "Convert Dolby Vision for compatibility" of label #39300 +#: system/settings/settings.xml +msgctxt "#39304" +msgid "Profile 8.1" +msgstr "" + +#. Enum value for "Convert Dolby Vision for compatibility" of label #39300 +#: system/settings/settings.xml +msgctxt "#39305" +msgid "Profile 8.4" +msgstr "" + +#. Enum value for "Convert Dolby Vision for compatibility" of label #39300 +#: system/settings/settings.xml +msgctxt "#39306" +msgid "Profile 8.1 MP" msgstr "" diff --git a/system/settings/settings.xml b/system/settings/settings.xml index 1b95376834..7ede7a22bb 100755 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -228,7 +228,7 @@ <default>true</default> <control type="toggle" /> </setting> - <setting id="videoplayer.convertdovi" type="boolean" label="39300" help="39301"> + <setting id="videoplayer.convertdovi" type="integer" label="39300" help="39301"> <requirement> <or> <condition>HAS_MEDIACODEC</condition> @@ -236,11 +236,21 @@ </or> </requirement> <level>2</level> - <default>true</default> + <default>2</default> <updates> <update type="change" /> </updates> - <control type="toggle" /> + <constraints> + <options> + <option label="39302">0</option> <!-- Lossless --> + <option label="39303">1</option> <!-- ToMel --> + <option label="39304">2</option> <!-- To81 --> + <option label="39305">3</option> <!-- To84 --> + <option label="39306">4</option> <!-- To81MappingPreserved --> + </options> + </constraints> + <control type="spinner" format="string" /> + <control type="edit" format="integer" /> </setting> </group> <group id="4" label="14232"> diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp index 59777ee196..8a7344d805 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp @@ -2008,8 +2008,8 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints) CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 1); am_private->gcodec.dv_enable = 1; - if (hints.dovi.dv_profile == 7 && !CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( - CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI)) + if (hints.dovi.dv_profile == 7 && CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt( + CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI) == 0) { CSysfsPath amdolby_vision_debug{"/sys/class/amdolby_vision/debug"}; if (amdolby_vision_debug.Exists()) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp index 9d518f0051..12f81442d7 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp @@ -283,14 +283,15 @@ bool CDVDVideoCodecAmlogic::Open(CDVDStreamInfo &hints, CDVDCodecOptions &option { if (m_bitstream && aml_support_dolby_vision()) { - bool convertDovi = CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( + int convertDovi = CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt( CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI); bool user_dv_disable = CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( CSettings::SETTING_COREELEC_AMLOGIC_DV_DISABLE); if (convertDovi && !user_dv_disable) { - CLog::Log(LOGDEBUG, "{}::{} - HEVC bitstream profile 7 will be converted to profile 8", __MODULE_NAME__, __FUNCTION__); - m_bitstream->SetConvertDovi(convertDovi && !user_dv_disable); + CLog::Log(LOGDEBUG, "{}::{} - HEVC bitstream profile 7 will be converted by chosen mode {:d}", + __MODULE_NAME__, __FUNCTION__, convertDovi); + m_bitstream->SetConvertDovi(convertDovi); } } } diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp index 2135e7d6f8..bba297770e 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp @@ -546,7 +546,7 @@ bool CDVDVideoCodecAndroidMediaCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptio if (m_bitstream) { - bool convertDovi = CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( + int convertDovi = CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt( CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI); m_bitstream->SetConvertDovi(convertDovi); } diff --git a/xbmc/utils/BitstreamConverter.cpp b/xbmc/utils/BitstreamConverter.cpp index c51ac92138..53cab7c680 100644 --- a/xbmc/utils/BitstreamConverter.cpp +++ b/xbmc/utils/BitstreamConverter.cpp @@ -279,7 +279,7 @@ static bool has_sei_recovery_point(const uint8_t *p, const uint8_t *end) #ifdef HAVE_LIBDOVI // The returned data must be freed with `dovi_data_free` // May be NULL if no conversion was done -static const DoviData* convert_dovi_rpu_nal(uint8_t* buf, uint32_t nal_size) +static const DoviData* convert_dovi_rpu_nal(uint8_t* buf, uint32_t nal_size, int mode) { DoviRpuOpaque* rpu = dovi_parse_unspec62_nalu(buf, nal_size); const DoviRpuDataHeader* header = dovi_rpu_get_header(rpu); @@ -287,7 +287,7 @@ static const DoviData* convert_dovi_rpu_nal(uint8_t* buf, uint32_t nal_size) if (header && header->guessed_profile == 7) { - int ret = dovi_convert_rpu_with_mode(rpu, 2); + int ret = dovi_convert_rpu_with_mode(rpu, mode); if (ret < 0) goto done; @@ -369,7 +369,7 @@ CBitstreamConverter::CBitstreamConverter() m_convert_bytestream = false; m_sps_pps_context.sps_pps_data = NULL; m_start_decode = true; - m_convert_dovi = false; + m_convert_dovi = 0; } CBitstreamConverter::~CBitstreamConverter() @@ -1001,7 +1001,7 @@ bool CBitstreamConverter::BitstreamConvert(uint8_t* pData, int iSize, uint8_t ** { #ifdef HAVE_LIBDOVI // Convert the RPU itself - rpu_data = convert_dovi_rpu_nal(buf, nal_size); + rpu_data = convert_dovi_rpu_nal(buf, nal_size, m_convert_dovi); if (rpu_data) { buf_to_write = rpu_data->data; diff --git a/xbmc/utils/BitstreamConverter.h b/xbmc/utils/BitstreamConverter.h index 4381599b21..bbfa3ed361 100644 --- a/xbmc/utils/BitstreamConverter.h +++ b/xbmc/utils/BitstreamConverter.h @@ -104,7 +104,7 @@ public: int GetExtraSize() const; void ResetStartDecode(void); bool CanStartDecode() const; - void SetConvertDovi(bool value) { m_convert_dovi = value; } + void SetConvertDovi(int value) { m_convert_dovi = value; } static bool mpeg2_sequence_header(const uint8_t *data, const uint32_t size, mpeg2_sequence *sequence); static bool h264_sequence_header(const uint8_t *data, const uint32_t size, h264_sequence *sequence); @@ -151,5 +151,5 @@ protected: bool m_convert_bytestream; AVCodecID m_codec; bool m_start_decode; - bool m_convert_dovi; + int m_convert_dovi; }; diff --git a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp index 616c205e6f..6f57b7efcb 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp @@ -103,7 +103,7 @@ bool CWinSystemAmlogic::InitWindowSystem() if (setting) { setting->SetVisible(false); - settings->SetBool(CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI, true); + settings->SetInt(CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI, 2); } } -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0012-AMLCodec-add-user-setting-player-led.patch ================================================ From d1dc56abe3fff3da1a075e6023aa86265339ef37 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 14 Apr 2023 11:19:44 +0200 Subject: [PATCH 12/21] AMLCodec: add user setting player led Added the option when display led and player led mode is supported by the display. --- .../resource.language.en_gb/resources/strings.po | 12 +++++++++++- system/settings/settings.xml | 6 ++++++ .../VideoPlayer/DVDCodecs/Video/AMLCodec.cpp | 12 ++++++++++++ xbmc/settings/Settings.h | 1 + xbmc/utils/AMLUtils.cpp | 16 ++++++++++++++++ xbmc/utils/AMLUtils.h | 1 + xbmc/windowing/amlogic/WinSystemAmlogic.cpp | 14 ++++++++++++++ 7 files changed, 61 insertions(+), 1 deletion(-) diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index 3b05260f01..4c52795d32 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -8679,7 +8679,17 @@ msgctxt "#14297" msgid "Use this option to disable Dolby Vision support if available." msgstr "" -#empty strings from id 14296 to 14300 +#: system/settings/settings.xml +msgctxt "#14298" +msgid "Use Player Led" +msgstr "" + +#: system/settings/settings.xml +msgctxt "#14299" +msgid "Use Player Led mode (YCbCr 4:2:2) instead Display Led (RGB tunneling) for Dolby Vision." +msgstr "" + +#empty strings from id 14300 to 14300 #. pvr "channels" settings group label #: system/settings/settings.xml diff --git a/system/settings/settings.xml b/system/settings/settings.xml index 7ede7a22bb..d656de67d1 100755 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -3696,6 +3696,12 @@ <default>false</default> <control type="toggle" /> </setting> + <setting id="coreelec.amlogic.useplayerled" type="boolean" label="14298" help="14299"> + <requirement>HAVE_AMCODEC</requirement> + <visible>false</visible> + <default>false</default> + <control type="toggle" /> + </setting> </group> </category> <category id="cache" label="439" help="36399"> diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp index 8a7344d805..1609177451 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp @@ -291,6 +291,8 @@ typedef struct hdr_buf { int size; } hdr_buf_t; +#define FLAG_FORCE_DV_LL (unsigned int)(0x4000) + typedef struct am_packet { AVPacket avpkt; uint64_t avpts; @@ -2007,6 +2009,16 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints) // enable Dolby Vision CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 1); + // force player led mode when enabled + CSysfsPath dolby_vision_flags{"/sys/module/amdolby_vision/parameters/dolby_vision_flags"}; + if (dolby_vision_flags.Exists()) + { + if (CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_COREELEC_AMLOGIC_USE_PLAYERLED)) + dolby_vision_flags.Set(dolby_vision_flags.Get<unsigned int>().value() | FLAG_FORCE_DV_LL); + else + dolby_vision_flags.Set(dolby_vision_flags.Get<unsigned int>().value() & ~(FLAG_FORCE_DV_LL)); + } + am_private->gcodec.dv_enable = 1; if (hints.dovi.dv_profile == 7 && CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt( CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI) == 0) diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h index 8e5a31e1d7..f999b284e9 100644 --- a/xbmc/settings/Settings.h +++ b/xbmc/settings/Settings.h @@ -442,6 +442,7 @@ public: static constexpr auto SETTING_COREELEC_AMLOGIC_FORCE_CS = "coreelec.amlogic.forcecs"; static constexpr auto SETTING_COREELEC_AMLOGIC_DISABLEGUISCALING = "coreelec.amlogic.disableguiscaling"; static constexpr auto SETTING_COREELEC_AMLOGIC_DV_DISABLE = "coreelec.amlogic.disabledolbyvision"; + static constexpr auto SETTING_COREELEC_AMLOGIC_USE_PLAYERLED = "coreelec.amlogic.useplayerled"; static constexpr auto SETTING_CACHE_HARDDISK = "cache.harddisk"; static constexpr auto SETTING_CACHEVIDEO_DVDROM = "cachevideo.dvdrom"; static constexpr auto SETTING_CACHEVIDEO_LAN = "cachevideo.lan"; diff --git a/xbmc/utils/AMLUtils.cpp b/xbmc/utils/AMLUtils.cpp index c9e60d5c5f..fd35427e93 100644 --- a/xbmc/utils/AMLUtils.cpp +++ b/xbmc/utils/AMLUtils.cpp @@ -56,6 +56,22 @@ int aml_get_cpufamily_id() return aml_cpufamily_id; } +bool aml_dv_support_ll() +{ + int support_ll = 0; + CRegExp regexp; + regexp.RegComp("YCbCr_422_12BIT"); + std::string valstr; + CSysfsPath dv_cap{"/sys/devices/virtual/amhdmitx/amhdmitx0/dv_cap"}; + if (dv_cap.Exists()) + { + valstr = dv_cap.Get<std::string>().value(); + support_ll = (regexp.RegFind(valstr) >= 0) ? 1 : 0; + } + + return support_ll; +} + static bool aml_support_vcodec_profile(const char *regex) { int profile = 0; diff --git a/xbmc/utils/AMLUtils.h b/xbmc/utils/AMLUtils.h index 25e95d6961..16f32b2d0a 100644 --- a/xbmc/utils/AMLUtils.h +++ b/xbmc/utils/AMLUtils.h @@ -49,6 +49,7 @@ enum AML_SUPPORT_H264_4K2K #define AML_SM1 0x2B int aml_get_cpufamily_id(); +bool aml_dv_support_ll(); bool aml_support_hevc(); bool aml_support_hevc_4k2k(); bool aml_support_hevc_8k4k(); diff --git a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp index 6f57b7efcb..4c5424d136 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp @@ -99,6 +99,13 @@ bool CWinSystemAmlogic::InitWindowSystem() settings->SetBool(CSettings::SETTING_COREELEC_AMLOGIC_DV_DISABLE, false); } + setting = settings->GetSetting(CSettings::SETTING_COREELEC_AMLOGIC_USE_PLAYERLED); + if (setting) + { + setting->SetVisible(false); + settings->SetBool(CSettings::SETTING_COREELEC_AMLOGIC_USE_PLAYERLED, false); + } + setting = settings->GetSetting(CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI); if (setting) { @@ -106,6 +113,13 @@ bool CWinSystemAmlogic::InitWindowSystem() settings->SetInt(CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI, 2); } } + else if (aml_dv_support_ll()) + { + CLog::Log(LOGDEBUG, "CWinSystemAmlogic::InitWindowSystem -- display do support Dolby Vision Low Latency"); + auto setting = settings->GetSetting(CSettings::SETTING_COREELEC_AMLOGIC_USE_PLAYERLED); + if (setting) + setting->SetVisible(true); + } m_nativeDisplay = EGL_DEFAULT_DISPLAY; -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0013-Always-force-a-mode-switch-on-resolution-change-on-A.patch ================================================ From 077b90bdb547610c24d29da2215325bbae5f1181 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 20 Apr 2023 20:25:25 +0200 Subject: [PATCH 13/21] Always force a mode switch on resolution change on Amlogic platform If the mode switch is really required is checked afterwards in WinSystemAmlogic system. --- xbmc/windowing/GraphicContext.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/xbmc/windowing/GraphicContext.cpp b/xbmc/windowing/GraphicContext.cpp index 2688fb999e..d9538ebf46 100644 --- a/xbmc/windowing/GraphicContext.cpp +++ b/xbmc/windowing/GraphicContext.cpp @@ -398,6 +398,9 @@ void CGraphicContext::SetVideoResolution(RESOLUTION res, bool forceUpdate) void CGraphicContext::SetVideoResolutionInternal(RESOLUTION res, bool forceUpdate) { RESOLUTION lastRes = m_Resolution; +#if defined(HAS_LIBAMCODEC) + forceUpdate = true; +#endif // If the user asked us to guess, go with desktop if (!IsValidResolution(res)) -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0014-AMLCodec-on-Dolby-Vision-playback-stop-wait-until-vi.patch ================================================ From c405fada82ff51a770e18ef5b84b3ac695051d73 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 21 Apr 2023 10:39:45 +0200 Subject: [PATCH 14/21] AMLCodec: on Dolby Vision playback stop wait until video is off The driver need first to clean up on video off. --- .../VideoPlayer/DVDCodecs/Video/AMLCodec.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp index 1609177451..dad0690ef2 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp @@ -2007,7 +2007,7 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints) if (dv_enable) { // enable Dolby Vision - CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 1); + CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 'Y'); // force player led mode when enabled CSysfsPath dolby_vision_flags{"/sys/module/amdolby_vision/parameters/dolby_vision_flags"}; @@ -2032,7 +2032,7 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints) else if (device_support_dv) { // disable Dolby Vision - CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 0); + CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 'N'); } // DEC_CONTROL_FLAG_DISABLE_FAST_POC @@ -2293,8 +2293,19 @@ void CAMLCodec::CloseDecoder() // return tsync to default so external apps work CSysfsPath("/sys/class/tsync/enable", 1); // disable Dolby Vision driver - //CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 0); - // don't disable it as it would not switch back to non DV mode anymore + CSysfsPath dolby_vision_enable{"/sys/module/amdolby_vision/parameters/dolby_vision_enable"}; + if (dolby_vision_enable.Exists() && StringUtils::EqualsNoCase(dolby_vision_enable.Get<std::string>().value(), "Y")) + { + CSysfsPath dv_video_on{"/sys/class/amdolby_vision/dv_video_on"}; + if (dv_video_on.Exists()) + { + std::chrono::time_point<std::chrono::system_clock> now(std::chrono::system_clock::now()); + while(dv_video_on.Get<int>().value() == 1 && (std::chrono::system_clock::now() - now) < std::chrono::seconds(m_decoder_timeout)) + usleep(10000); // wait 10ms + } + dolby_vision_enable.Set('N'); + } + CSysfsPath amdolby_vision_debug{"/sys/class/amdolby_vision/debug"}; if (amdolby_vision_debug.Exists()) amdolby_vision_debug.Set("enable_fel 0"); -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0015-WinSystemAmlogic-rework-mode-switch-mechanism.patch ================================================ From 36a8072f7e006c4e34100e589a05b3e79f3c06af Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 20 Apr 2023 20:22:41 +0200 Subject: [PATCH 15/21] WinSystemAmlogic: rework mode switch mechanism Because of Dolby Vision it is possible resolution and frequency do not change. But if colour subsampling or colour depth is changed a forced mode switch is required. Force mode switch by set mode 'null' In special cases a hard mode reset is needed like 4k420 to 4kDV. --- xbmc/utils/AMLUtils.cpp | 10 +- xbmc/utils/AMLUtils.h | 4 +- xbmc/windowing/amlogic/WinSystemAmlogic.cpp | 46 +++------ xbmc/windowing/amlogic/WinSystemAmlogic.h | 6 +- .../amlogic/WinSystemAmlogicGLESContext.cpp | 99 ++++++++++++++++++- .../amlogic/WinSystemAmlogicGLESContext.h | 5 +- 6 files changed, 124 insertions(+), 46 deletions(-) diff --git a/xbmc/utils/AMLUtils.cpp b/xbmc/utils/AMLUtils.cpp index fd35427e93..33e449408d 100644 --- a/xbmc/utils/AMLUtils.cpp +++ b/xbmc/utils/AMLUtils.cpp @@ -412,12 +412,13 @@ bool aml_get_native_resolution(RESOLUTION_INFO *res) return result; } -bool aml_set_native_resolution(const RESOLUTION_INFO &res, std::string framebuffer_name, const int stereo_mode) +bool aml_set_native_resolution(const RESOLUTION_INFO &res, std::string framebuffer_name, + const int stereo_mode, bool force_mode_switch) { bool result = false; aml_handle_display_stereo_mode(RENDER_STEREO_MODE_OFF); - result = aml_set_display_resolution(res, framebuffer_name); + result = aml_set_display_resolution(res, framebuffer_name, force_mode_switch); aml_handle_scale(res); aml_handle_display_stereo_mode(stereo_mode); @@ -498,7 +499,8 @@ bool aml_probe_resolutions(std::vector<RESOLUTION_INFO> &resolutions) return resolutions.size() > 0; } -bool aml_set_display_resolution(const RESOLUTION_INFO &res, std::string framebuffer_name) +bool aml_set_display_resolution(const RESOLUTION_INFO &res, std::string framebuffer_name, + bool force_mode_switch) { std::string mode = res.strId.c_str(); std::string cur_mode; @@ -525,7 +527,7 @@ bool aml_set_display_resolution(const RESOLUTION_INFO &res, std::string framebuf if (amhdmitx0_frac_rate_policy.Exists()) cur_fractional_rate = amhdmitx0_frac_rate_policy.Get<int>().value(); - if (cur_fractional_rate != fractional_rate) + if ((cur_fractional_rate != fractional_rate) || force_mode_switch) { cur_mode = "null"; if (display_mode.Exists()) diff --git a/xbmc/utils/AMLUtils.h b/xbmc/utils/AMLUtils.h index 16f32b2d0a..a944814642 100644 --- a/xbmc/utils/AMLUtils.h +++ b/xbmc/utils/AMLUtils.h @@ -62,9 +62,9 @@ bool aml_has_frac_rate_policy(); void aml_set_audio_passthrough(bool passthrough); bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res); bool aml_get_native_resolution(RESOLUTION_INFO *res); -bool aml_set_native_resolution(const RESOLUTION_INFO &res, std::string framebuffer_name, const int stereo_mode); +bool aml_set_native_resolution(const RESOLUTION_INFO &res, std::string framebuffer_name, const int stereo_mode, bool force_mode_switch); bool aml_probe_resolutions(std::vector<RESOLUTION_INFO> &resolutions); -bool aml_set_display_resolution(const RESOLUTION_INFO &res, std::string framebuffer_name); +bool aml_set_display_resolution(const RESOLUTION_INFO &res, std::string framebuffer_name, bool force_mode_switch); void aml_handle_scale(const RESOLUTION_INFO &res); void aml_handle_display_stereo_mode(const int stereo_mode); void aml_enable_freeScale(const RESOLUTION_INFO &res); diff --git a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp index 4c5424d136..07447b5a55 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp @@ -41,6 +41,7 @@ using namespace KODI; CWinSystemAmlogic::CWinSystemAmlogic() : m_nativeWindow(NULL) , m_libinput(new CLibInputHandler) +, m_force_mode_switch(false) { const char *env_framebuffer = getenv("FRAMEBUFFER"); @@ -55,9 +56,6 @@ CWinSystemAmlogic::CWinSystemAmlogic() m_nativeDisplay = EGL_NO_DISPLAY; - m_displayWidth = 0; - m_displayHeight = 0; - m_stereo_mode = RENDER_STEREO_MODE_OFF; m_delayDispReset = false; @@ -159,32 +157,15 @@ bool CWinSystemAmlogic::CreateNewWindow(const std::string& name, bool fullScreen, RESOLUTION_INFO& res) { - RESOLUTION_INFO current_resolution; - current_resolution.iWidth = current_resolution.iHeight = 0; - RENDER_STEREO_MODE stereo_mode = CServiceBroker::GetWinSystem()->GetGfxContext().GetStereoMode(); - m_nWidth = res.iWidth; m_nHeight = res.iHeight; - m_displayWidth = res.iScreenWidth; - m_displayHeight = res.iScreenHeight; m_fRefreshRate = res.fRefreshRate; if (m_nativeWindow == NULL) m_nativeWindow = new fbdev_window; - m_nativeWindow->width = m_nWidth; - m_nativeWindow->height = m_nHeight; - - if ((m_bWindowCreated && aml_get_native_resolution(¤t_resolution)) && - current_resolution.iWidth == res.iWidth && current_resolution.iHeight == res.iHeight && - current_resolution.iScreenWidth == res.iScreenWidth && current_resolution.iScreenHeight == res.iScreenHeight && - m_bFullScreen == fullScreen && current_resolution.fRefreshRate == res.fRefreshRate && - (current_resolution.dwFlags & D3DPRESENTFLAG_MODEMASK) == (res.dwFlags & D3DPRESENTFLAG_MODEMASK) && - m_stereo_mode == stereo_mode) - { - CLog::Log(LOGDEBUG, "CWinSystemEGL::CreateNewWindow: No need to create a new window"); - return true; - } + m_nativeWindow->width = res.iWidth; + m_nativeWindow->height = res.iHeight; int delay = CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt("videoscreen.delayrefreshchange"); if (delay > 0) @@ -201,10 +182,9 @@ bool CWinSystemAmlogic::CreateNewWindow(const std::string& name, } } - m_stereo_mode = stereo_mode; - m_bFullScreen = fullScreen; - - aml_set_native_resolution(res, m_framebuffer_name, stereo_mode); + aml_set_native_resolution(res, m_framebuffer_name, m_stereo_mode, m_force_mode_switch); + // reset force mode switch + m_force_mode_switch = false; if (!m_delayDispReset) { @@ -216,6 +196,7 @@ bool CWinSystemAmlogic::CreateNewWindow(const std::string& name, } } + m_bWindowCreated = true; return true; } @@ -227,6 +208,7 @@ bool CWinSystemAmlogic::DestroyWindow() m_nativeWindow = NULL; } + m_bWindowCreated = false; return true; } @@ -310,28 +292,28 @@ bool CWinSystemAmlogic::IsHDRDisplay() { valstr = hdr_cap.Get<std::string>().value(); if (valstr.find("Traditional HDR: 1") != std::string::npos) - hdr_caps.SetHDR10(); + m_hdr_caps.SetHDR10(); if (valstr.find("HDR10Plus Supported: 1") != std::string::npos) - hdr_caps.SetHDR10Plus(); + m_hdr_caps.SetHDR10Plus(); if (valstr.find("Hybrid Log-Gamma: 1") != std::string::npos) - hdr_caps.SetHLG(); + m_hdr_caps.SetHLG(); } if (dv_cap.Exists()) { valstr = dv_cap.Get<std::string>().value(); if (valstr.find("DolbyVision RX support list") != std::string::npos) - hdr_caps.SetDolbyVision(); + m_hdr_caps.SetDolbyVision(); } - return (hdr_caps.SupportsHDR10() | hdr_caps.SupportsHDR10Plus() | hdr_caps.SupportsHLG()); + return (m_hdr_caps.SupportsHDR10() | m_hdr_caps.SupportsHDR10Plus() | m_hdr_caps.SupportsHLG()); } CHDRCapabilities CWinSystemAmlogic::GetDisplayHDRCapabilities() const { - return hdr_caps; + return m_hdr_caps; } bool CWinSystemAmlogic::Hide() diff --git a/xbmc/windowing/amlogic/WinSystemAmlogic.h b/xbmc/windowing/amlogic/WinSystemAmlogic.h index 2c70086caa..6bc5ae5046 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogic.h +++ b/xbmc/windowing/amlogic/WinSystemAmlogic.h @@ -44,9 +44,6 @@ protected: EGLDisplay m_nativeDisplay; fbdev_window *m_nativeWindow; - int m_displayWidth; - int m_displayHeight; - RENDER_STEREO_MODE m_stereo_mode; bool m_delayDispReset; @@ -55,5 +52,6 @@ protected: CCriticalSection m_resourceSection; std::vector<IDispResource*> m_resources; std::unique_ptr<CLibInputHandler> m_libinput; - CHDRCapabilities hdr_caps; + CHDRCapabilities m_hdr_caps; + bool m_force_mode_switch; }; diff --git a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp index 39fbaf03a1..f9d94dc34f 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp @@ -8,13 +8,22 @@ #include "VideoSyncAML.h" #include "WinSystemAmlogicGLESContext.h" +#include "platform/linux/SysfsPath.h" +#include "utils/AMLUtils.h" #include "utils/log.h" #include "threads/SingleLock.h" +#include "windowing/GraphicContext.h" #include "windowing/WindowSystemFactory.h" using namespace KODI; using namespace KODI::WINDOWING::AML; +CWinSystemAmlogicGLESContext::CWinSystemAmlogicGLESContext() +: m_cs(-1) +, m_cd(-1) +{ +} + void CWinSystemAmlogicGLESContext::Register() { KODI::WINDOWING::CWindowSystemFactory::RegisterWindowSystem(CreateWinSystem, "aml"); @@ -69,7 +78,84 @@ bool CWinSystemAmlogicGLESContext::CreateNewWindow(const std::string& name, bool fullScreen, RESOLUTION_INFO& res) { - m_pGLContext.DestroySurface(); + RESOLUTION_INFO current_resolution; + current_resolution.iWidth = current_resolution.iHeight = 0; + RENDER_STEREO_MODE stereo_mode = CServiceBroker::GetWinSystem()->GetGfxContext().GetStereoMode(); + + // check for frac_rate_policy change + int fractional_rate = (res.fRefreshRate == floor(res.fRefreshRate)) ? 0 : 1; + int cur_fractional_rate = fractional_rate; + if (aml_has_frac_rate_policy()) + { + CSysfsPath amhdmitx0_frac_rate_policy{"/sys/class/amhdmitx/amhdmitx0/frac_rate_policy"}; + cur_fractional_rate = amhdmitx0_frac_rate_policy.Get<int>().value(); + + if (cur_fractional_rate != fractional_rate) + amhdmitx0_frac_rate_policy.Set(fractional_rate); + } + + // check for colour subsampling/depth change + CSysfsPath amhdmitx0_cs{"/sys/class/amhdmitx/amhdmitx0/cs"}; + CSysfsPath amhdmitx0_cd{"/sys/class/amhdmitx/amhdmitx0/cd"}; + int cs = 0; + int cd = 0; + if (amhdmitx0_cs.Exists() && amhdmitx0_cd.Exists()) + { + cs = amhdmitx0_cs.Get<int>().value(); + cd = amhdmitx0_cd.Get<int>().value(); + } + + // get current used resolution + if (!aml_get_native_resolution(¤t_resolution)) + { + CLog::Log(LOGERROR, "CWinSystemAmlogicGLESContext::{}: failed to receive current resolution", __FUNCTION__); + return false; + } + + CLog::Log(LOGDEBUG, "CWinSystemAmlogicGLESContext::{}: " + "m_bWindowCreated: {}, " + "frac rate {:d}({:d}), " + "cs: {:d}({:d}), cd: {:d}({:d})", + __FUNCTION__, + m_bWindowCreated, + fractional_rate, cur_fractional_rate, + cs, m_cs, cd, m_cd); + CLog::Log(LOGDEBUG, "CWinSystemAmlogicGLESContext::{}: " + "cur: iWidth: {:04d}, iHeight: {:04d}, iScreenWidth: {:04d}, iScreenHeight: {:04d}, fRefreshRate: {:02.2f}, dwFlags: {:02x}", + __FUNCTION__, + current_resolution.iWidth, current_resolution.iHeight, current_resolution.iScreenWidth, current_resolution.iScreenHeight, + current_resolution.fRefreshRate, current_resolution.dwFlags); + CLog::Log(LOGDEBUG, "CWinSystemAmlogicGLESContext::{}: " + "res: iWidth: {:04d}, iHeight: {:04d}, iScreenWidth: {:04d}, iScreenHeight: {:04d}, fRefreshRate: {:02.2f}, dwFlags: {:02x}", + __FUNCTION__, + res.iWidth, res.iHeight, res.iScreenWidth, res.iScreenHeight, res.fRefreshRate, res.dwFlags); + + // check if mode switch is needed + if (current_resolution.iWidth == res.iWidth && current_resolution.iHeight == res.iHeight && + current_resolution.iScreenWidth == res.iScreenWidth && current_resolution.iScreenHeight == res.iScreenHeight && + m_bFullScreen == fullScreen && current_resolution.fRefreshRate == res.fRefreshRate && + (current_resolution.dwFlags & D3DPRESENTFLAG_MODEMASK) == (res.dwFlags & D3DPRESENTFLAG_MODEMASK) && + m_stereo_mode == stereo_mode && m_bWindowCreated && + ((m_cs != -1 && m_cd != -1) && (m_cs == cs && m_cd == cd)) && + (fractional_rate == cur_fractional_rate)) + { + CLog::Log(LOGDEBUG, "CWinSystemAmlogicGLESContext::{}: No need to create a new window", __FUNCTION__); + return true; + } + + // destroy old window, then create a new one + DestroyWindow(); + + // check if a forced mode switch is required + if ((current_resolution.iWidth == res.iWidth && current_resolution.iHeight == res.iHeight && + current_resolution.iScreenWidth == res.iScreenWidth && current_resolution.iScreenHeight == res.iScreenHeight && + current_resolution.fRefreshRate == res.fRefreshRate) && + (((m_cs != -1 && m_cd != -1) && (m_cs != cs || m_cd != cd)) || + (fractional_rate != cur_fractional_rate))) + { + m_force_mode_switch = true; + CLog::Log(LOGDEBUG, "CWinSystemAmlogicGLESContext::{}: force mode switch", __FUNCTION__); + } if (!CWinSystemAmlogic::CreateNewWindow(name, fullScreen, res)) { @@ -94,6 +180,16 @@ bool CWinSystemAmlogicGLESContext::CreateNewWindow(const std::string& name, (*i)->OnResetDisplay(); } + // backup data after mode switch + if (amhdmitx0_cs.Exists() && amhdmitx0_cd.Exists()) + { + m_cs = amhdmitx0_cs.Get<int>().value(); + m_cd = amhdmitx0_cd.Get<int>().value(); + } + + m_stereo_mode = stereo_mode; + m_bFullScreen = fullScreen; + return true; } @@ -167,4 +263,3 @@ std::unique_ptr<CVideoSync> CWinSystemAmlogicGLESContext::GetVideoSync(void *clo std::unique_ptr<CVideoSync> pVSync(new CVideoSyncAML(clock)); return pVSync; } - diff --git a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.h b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.h index 7d7467ee1a..ef6166692a 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.h +++ b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.h @@ -23,7 +23,7 @@ namespace AML class CWinSystemAmlogicGLESContext : public CWinSystemAmlogic, public CRenderSystemGLES { public: - CWinSystemAmlogicGLESContext() = default; + CWinSystemAmlogicGLESContext(); virtual ~CWinSystemAmlogicGLESContext() = default; static void Register(); @@ -53,7 +53,8 @@ protected: private: CEGLContextUtils m_pGLContext; - + int m_cs; + int m_cd; }; } -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0016-AMLUtils-add-display-DV-support-check.patch ================================================ From e31d8ce8965aef763014ecc5ce00252bb70dd894 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Mon, 22 May 2023 11:23:13 +0200 Subject: [PATCH 16/21] AMLUtils: add display DV support check --- xbmc/utils/AMLUtils.cpp | 16 ++++++++++++++++ xbmc/utils/AMLUtils.h | 1 + 2 files changed, 17 insertions(+) diff --git a/xbmc/utils/AMLUtils.cpp b/xbmc/utils/AMLUtils.cpp index 33e449408d..2d1c1d78b3 100644 --- a/xbmc/utils/AMLUtils.cpp +++ b/xbmc/utils/AMLUtils.cpp @@ -56,6 +56,22 @@ int aml_get_cpufamily_id() return aml_cpufamily_id; } +bool aml_display_support_dv() +{ + int support_dv = 0; + CRegExp regexp; + regexp.RegComp("The Rx don't support DolbyVision"); + std::string valstr; + CSysfsPath dv_cap{"/sys/devices/virtual/amhdmitx/amhdmitx0/dv_cap"}; + if (dv_cap.Exists()) + { + valstr = dv_cap.Get<std::string>().value(); + support_dv = (regexp.RegFind(valstr) >= 0) ? 0 : 1; + } + + return support_dv; +} + bool aml_dv_support_ll() { int support_ll = 0; diff --git a/xbmc/utils/AMLUtils.h b/xbmc/utils/AMLUtils.h index a944814642..2f07acbfa1 100644 --- a/xbmc/utils/AMLUtils.h +++ b/xbmc/utils/AMLUtils.h @@ -49,6 +49,7 @@ enum AML_SUPPORT_H264_4K2K #define AML_SM1 0x2B int aml_get_cpufamily_id(); +bool aml_display_support_dv(); bool aml_dv_support_ll(); bool aml_support_hevc(); bool aml_support_hevc_4k2k(); -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0017-AMLCodec-Restart-codec-in-dec_mode-STREAM_TYPE_FRAME.patch ================================================ From 40f2d0145580ae8c20a431351b4dbe74aae1f928 Mon Sep 17 00:00:00 2001 From: Arthur Liberman <arthur_liberman@hotmail.com> Date: Thu, 28 Dec 2023 00:44:36 +0200 Subject: [PATCH 17/21] AMLCodec: Restart codec in `dec_mode=STREAM_TYPE_FRAME` on DoVi P7 MEL Dolby Vision Profile 7 Minimum Enhancement Layer (MEL) can't use `STREAM_TYPE_STREAM` decoder mode. The kernel can detect MEL content, it sets `is_mel=true` in sysfs, we detect it, and restart the codec in the correct mode --- .../VideoPlayer/DVDCodecs/Video/AMLCodec.cpp | 26 ++++++++++++++++++- .../VideoPlayer/DVDCodecs/Video/AMLCodec.h | 2 ++ .../DVDCodecs/Video/DVDVideoCodecAmlogic.cpp | 12 ++++++++- .../DVDCodecs/Video/DVDVideoCodecAmlogic.h | 1 + 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp index dad0690ef2..3962cb904d 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp @@ -1814,6 +1814,8 @@ CAMLCodec::CAMLCodec(CProcessInfo &processInfo) , m_bufferIndex(-1) , m_state(0) , m_processInfo(processInfo) + , m_is_dv_p7_mel(false) + , m_dolby_vision_wait_delay(0) { am_private = new am_private_t; memset(am_private, 0, sizeof(am_private_t)); @@ -2020,13 +2022,20 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints) } am_private->gcodec.dv_enable = 1; - if (hints.dovi.dv_profile == 7 && CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt( + if (!m_is_dv_p7_mel && hints.dovi.dv_profile == 7 && CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt( CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI) == 0) { CSysfsPath amdolby_vision_debug{"/sys/class/amdolby_vision/debug"}; if (amdolby_vision_debug.Exists()) amdolby_vision_debug.Set("enable_fel 1"); am_private->gcodec.dec_mode = STREAM_TYPE_STREAM; + + CSysfsPath dolby_vision_wait_delay{"/sys/module/amdolby_vision/parameters/dolby_vision_wait_delay"}; + if (dolby_vision_wait_delay.Exists()) + { + m_dolby_vision_wait_delay = dolby_vision_wait_delay.Get<unsigned int>().value(); + CLog::Log(LOGDEBUG, "CAMLCodec::OpenDecoder DoVi P7 MEL detection frame delay got set to {:d} frames", m_dolby_vision_wait_delay); + } } } else if (device_support_dv) @@ -2642,6 +2651,21 @@ CDVDVideoCodec::VCReturn CAMLCodec::GetPicture(VideoPicture *pVideoPicture) CLog::Log(LOGDEBUG, LOGVIDEO, "CAMLCodec::GetPicture: index: {:d}, pts: {:.3f}, dur:{:.3f}ms ar:{:.2f} elf:{:d}ms", m_bufferIndex, pVideoPicture->pts / DVD_TIME_BASE, pVideoPicture->iDuration / 1000, m_hints.aspect, elapsed_since_last_frame.count()); + if (m_dolby_vision_wait_delay > 0 && !m_is_dv_p7_mel) + { + m_dolby_vision_wait_delay--; + CSysfsPath is_mel{"/sys/module/amdolby_vision/parameters/is_mel"}; + if (is_mel.Exists()) + { + if (is_mel.Get<char>().value() == 'Y') + { + CLog::Log(LOGDEBUG, LOGVIDEO, "CAMLCodec::GetPicture: DoVi P7 MEL content detected, request to reopen decoder"); + m_is_dv_p7_mel = true; + return CDVDVideoCodec::VC_REOPEN; + } + } + } + return CDVDVideoCodec::VC_PICTURE; } else if (m_drain) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.h b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.h index cfc6fafe31..2fe9212845 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.h +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.h @@ -109,6 +109,8 @@ private: uint64_t m_cur_pts; uint64_t m_last_pts; uint32_t m_bufferIndex; + bool m_is_dv_p7_mel; + uint32_t m_dolby_vision_wait_delay; CRect m_dst_rect; CRect m_display_rect; diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp index 12f81442d7..c2e8518f2d 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp @@ -436,6 +436,12 @@ void CDVDVideoCodecAmlogic::Reset(void) m_bitstream->ResetStartDecode(); } +void CDVDVideoCodecAmlogic::Reopen(void) +{ + if (m_Codec && !m_Codec->OpenDecoder(m_hints)) + CLog::Log(LOGERROR, "{}: Failed to reopen Amlogic Codec", __MODULE_NAME__); +} + CDVDVideoCodec::VCReturn CDVDVideoCodecAmlogic::GetPicture(VideoPicture* pVideoPicture) { if (!m_Codec) @@ -443,7 +449,11 @@ CDVDVideoCodec::VCReturn CDVDVideoCodecAmlogic::GetPicture(VideoPicture* pVideoP VCReturn retVal = m_Codec->GetPicture(&m_videobuffer); - if (retVal == VC_PICTURE) + if (retVal == VC_REOPEN) + { + m_Codec->CloseDecoder(); + } + else if (retVal == VC_PICTURE) { pVideoPicture->SetParams(m_videobuffer); diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.h b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.h index 8a1d66e485..b0d422909a 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.h +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.h @@ -70,6 +70,7 @@ public: virtual bool Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) override; virtual bool AddData(const DemuxPacket &packet) override; virtual void Reset() override; + virtual void Reopen() override; virtual VCReturn GetPicture(VideoPicture* pVideoPicture) override; virtual void SetSpeed(int iSpeed) override; virtual void SetCodecControl(int flags) override; -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0018-libdovi-change-default-conversion-to-Lossless-for-Am.patch ================================================ From d94ce039a9a6dea04fea7fd7156e41eb67ea4164 Mon Sep 17 00:00:00 2001 From: Arthur Liberman <arthur_liberman@hotmail.com> Date: Fri, 12 Jan 2024 17:21:47 +0200 Subject: [PATCH 18/21] libdovi: change default conversion to Lossless for Amlogic-ng-dv --- system/settings/settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/settings/settings.xml b/system/settings/settings.xml index d656de67d1..7117ac0394 100755 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -236,7 +236,7 @@ </or> </requirement> <level>2</level> - <default>2</default> + <default>0</default> <updates> <update type="change" /> </updates> -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0019-AMLCodec-set-also-dolby_vision_ll_policy-when-force-.patch ================================================ From 979f3c936539d2944585c27d0b79642c1bdbb38f Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Mon, 15 Jan 2024 09:59:43 +0100 Subject: [PATCH 19/21] AMLCodec: set also dolby_vision_ll_policy when force player led 4.9 kernel does require the policy set as well --- xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp index 3962cb904d..7d702cd1c4 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp @@ -292,6 +292,8 @@ typedef struct hdr_buf { } hdr_buf_t; #define FLAG_FORCE_DV_LL (unsigned int)(0x4000) +#define DOLBY_VISION_LL_DISABLE (unsigned int)(0) +#define DOLBY_VISION_LL_YUV422 (unsigned int)(1) typedef struct am_packet { AVPacket avpkt; @@ -2013,12 +2015,19 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints) // force player led mode when enabled CSysfsPath dolby_vision_flags{"/sys/module/amdolby_vision/parameters/dolby_vision_flags"}; - if (dolby_vision_flags.Exists()) + CSysfsPath dolby_vision_ll_policy{"/sys/module/amdolby_vision/parameters/dolby_vision_ll_policy"}; + if (dolby_vision_flags.Exists() && dolby_vision_ll_policy.Exists()) { if (CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_COREELEC_AMLOGIC_USE_PLAYERLED)) + { dolby_vision_flags.Set(dolby_vision_flags.Get<unsigned int>().value() | FLAG_FORCE_DV_LL); + dolby_vision_ll_policy.Set(DOLBY_VISION_LL_YUV422); + } else + { dolby_vision_flags.Set(dolby_vision_flags.Get<unsigned int>().value() & ~(FLAG_FORCE_DV_LL)); + dolby_vision_ll_policy.Set(DOLBY_VISION_LL_DISABLE); + } } am_private->gcodec.dv_enable = 1; -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0020-WinSystemAmlogic-backup-correct-colour-subsampling-a.patch ================================================ From f08632775e1a7cb7629e1fe6b970e3e2141d6ad6 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Tue, 16 Jan 2024 15:27:55 +0100 Subject: [PATCH 20/21] WinSystemAmlogic: backup correct colour subsampling and colour depth --- xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp index f9d94dc34f..16b54d8803 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp @@ -183,8 +183,8 @@ bool CWinSystemAmlogicGLESContext::CreateNewWindow(const std::string& name, // backup data after mode switch if (amhdmitx0_cs.Exists() && amhdmitx0_cd.Exists()) { - m_cs = amhdmitx0_cs.Get<int>().value(); - m_cd = amhdmitx0_cd.Get<int>().value(); + m_cs = cs; + m_cd = cd; } m_stereo_mode = stereo_mode; -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/0021-AMLCodec-marginal-increase-frame-buffer-levels.patch ================================================ From 73a8feac65bcae4e0c55855482cc485edf1630f2 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Tue, 16 Jan 2024 15:38:56 +0100 Subject: [PATCH 21/21] AMLCodec: marginal increase frame buffer levels --- xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp index 7d702cd1c4..dae7e39ea6 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp @@ -2638,7 +2638,7 @@ CDVDVideoCodec::VCReturn CAMLCodec::GetPicture(VideoPicture *pVideoPicture) if (!m_opened) return CDVDVideoCodec::VC_ERROR; - if ((!m_drain && buffer_level > 1.0f) && (ret = DequeueBuffer()) == 0) + if ((!m_drain && buffer_level > 5.0f) && (ret = DequeueBuffer()) == 0) { pVideoPicture->iFlags = 0; m_tp_last_frame = std::chrono::system_clock::now(); @@ -2679,7 +2679,7 @@ CDVDVideoCodec::VCReturn CAMLCodec::GetPicture(VideoPicture *pVideoPicture) } else if (m_drain) return CDVDVideoCodec::VC_EOF; - else if (buffer_level > 2.0f) + else if (buffer_level > 10.0f) return CDVDVideoCodec::VC_NONE; else if (ret != EAGAIN || elapsed_since_last_frame > std::chrono::seconds(m_decoder_timeout)) { -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/kodi/kodi-temp-03-TEMP-fix-OnSettingChanged-signal.patch ================================================ From 1090b59aa68165e67a39895d7d648c7ff286ed8d Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Wed, 17 Feb 2021 07:59:09 +0100 Subject: [PATCH] TEMP: fix OnSettingChanged signal --- xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp b/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp index 73816df648..fbd1f54680 100644 --- a/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp +++ b/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp @@ -104,6 +104,8 @@ void CGUIDialogPeripheralSettings::OnSettingChanged(const std::shared_ptr<const if (!peripheral) return; + peripheral->OnSettingChanged(setting->GetId()); + if (settingId == SETTING_APPEARANCE) { // Get the controller profile of the new appearance -- 2.30.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/0001-g12b_s922z_amazon_2nd_gen_cube_dts.patch ================================================ From ad806b6b591fdf43b586a3323a963ec49a5ff05e Mon Sep 17 00:00:00 2001 Date: Wed, 9 Jul 2025 17:19:53 -0400 Subject: [PATCH] Add DTS for g12b_s922z_amazon_2nd_gen_cube and update Makefile --- arch/arm64/boot/dts/amlogic/Makefile | 1 + .../g12b_s922z_amazon_2nd_gen_cube.dts | 511 ++++++++++++++++++ 2 files changed, 512 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/g12b_s922z_amazon_2nd_gen_cube.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index 9a58fe36b8b4..f216dcf7ca79 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -33,6 +33,7 @@ dtb-$(CONFIG_ARM64) += g12b_s922x_ugoos_am6b_rev_a_2g.dtb dtb-$(CONFIG_ARM64) += g12b_s922x_ugoos_am6b_rev_a_4g.dtb dtb-$(CONFIG_ARM64) += g12b_s922x_x88_king_rev_a.dtb dtb-$(CONFIG_ARM64) += g12b_s922x_bananapi_m2s.dtb +dtb-$(CONFIG_ARM64) += g12b_s922z_amazon_2nd_gen_cube.dtb dtb-$(CONFIG_ARM64) += sc2_s905x4_2g.dtb dtb-$(CONFIG_ARM64) += sc2_s905x4_2g_1gbit.dtb dtb-$(CONFIG_ARM64) += sc2_s905x4_4g.dtb diff --git a/arch/arm64/boot/dts/amlogic/g12b_s922z_amazon_2nd_gen_cube.dts b/arch/arm64/boot/dts/amlogic/g12b_s922z_amazon_2nd_gen_cube.dts new file mode 100644 index 000000000000..b5a54f15ec9b --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/g12b_s922z_amazon_2nd_gen_cube.dts @@ -0,0 +1,511 @@ +#include "coreelec_g12b.dtsi" + +/{ + model = "Amazon Fire TV 2nd gen Cube"; + coreelec-dt-id = "g12b_s922z_amazon_2nd_gen_cube"; + amlogic-dt-id = "g12brevb_raven_2g"; + + + memory@00000000 { + device_type = "memory"; + linux,usable-memory = <0x00 0x00 0x00 0x80000000>; + }; + + reserved-memory { + + linux,secmon { + size = <0x00 0x2400000>; + alloc-ranges = <0x00 0x5000000 0x00 0x2400000>; + /delete-property/ clear-map; + }; + + linux,meson-fb { + alloc-ranges = <0x00 0x7f800000 0x00 0x800000>; + }; + }; + + bifrost { + + dvfs285_cfg { + threshold = <0x64 0xbe>; + }; + + dvfs500_cfg { + threshold = <0xb4 0xdc>; + }; + + dvfs666_cfg { + threshold = <0xd2 0xec>; + }; + + dvfs850_cfg { + threshold = <0xe6 0xff>; + }; + }; + + secmon { + reserve_mem_size = <0x2300000>; + }; + + /delete-node/ ethernet@ff3f0000; + + pinctrl@ff800014 { + + /delete-node/ jtag_apao_pin; + + /delete-node/ spdifout; + + /delete-node/ spdifout_a_mute; + }; + + pinctrl@ff634480 { + + /delete-node/ jtag_apee_pin; + + tdmout_a: tdmout_a { + mux { + groups = "tdma_sclk\0tdma_fs\0tdma_dout0"; + function = "tdma_out"; + }; + }; + + tdmin_a: tdmin_a { + mux { + groups = "tdma_din1"; + function = "tdma_in"; + }; + }; + + tdmc_mclk: tdmc_mclk { + mux { + groups = "mclk1_a"; + function = "mclk1"; + }; + }; + + tdmout_c: tdmout_c { + mux { + groups = "tdmc_sclk_a\0tdmc_fs_a"; + function = "tdmc_out"; + drive-strength = <0x03>; + }; + }; + + tdmin_c: tdmin_c { + mux { + groups = "tdmc_din0_a"; + function = "tdmc_in"; + drive-strength = <0x03>; + }; + }; + + spdifin: spdifin { + mux { + groups = "spdif_in_h"; + function = "spdif_in"; + }; + }; + }; + + usb3phy@ffe09080 { + gpio-vbus-power = "GPIOH_4"; + gpios = <&gpio GPIOH_4 GPIO_ACTIVE_HIGH>; + }; + + /delete-node/ jtag; + + soc { + cbus@ffd00000 { + i2c@1c000 { + /delete-node/ rt5651@1a; + + is31fl3236@3F { + compatible = "issi,is31fl3236,gva"; + reg = <0x3f>; + #address-cells = <1>; + #size-cells = <0>; + + led@1 { + reg_offset = <1>; + label = "led1"; + }; + + led@2 { + reg_offset = <2>; + label = "led2"; + }; + + led@3 { + reg_offset = <3>; + label = "led3"; + }; + + led@4 { + reg_offset = <4>; + label = "led4"; + }; + + led@5 { + reg_offset = <5>; + label = "led5"; + }; + + led@6 { + reg_offset = <6>; + label = "led6"; + }; + + led@7 { + reg_offset = <7>; + label = "led7"; + }; + + led@8 { + reg_offset = <8>; + label = "led8"; + }; + + led@9 { + reg_offset = <9>; + label = "led9"; + }; + + led@10 { + reg_offset = <10>; + label = "led10"; + }; + + led@11 { + reg_offset = <11>; + label = "led11"; + }; + + led@12 { + reg_offset = <12>; + label = "led12"; + }; + + led@13 { + reg_offset = <13>; + label = "led13"; + }; + + led@14 { + reg_offset = <14>; + label = "led14"; + }; + + led@15 { + reg_offset = <15>; + label = "led15"; + }; + }; + }; + }; + + aobus@ff800000 { + + /delete-node/ meson-irblaster@14c; + }; + + audiobus@0xff642000 { + + aml_tdma: tdma { + compatible = "amlogic, g12a-snd-tdma"; + #sound-dai-cells = <0x00>; + dai-tdm-lane-slot-mask-in = <0x00 0x01>; + dai-tdm-lane-slot-mask-out = <0x01 0x00>; + dai-tdm-clk-sel = <0x00>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_A>, + <&clkc CLKID_MPLL1>; + clock-names = "mclk\0clk_srcpll"; + pinctrl-names = "tdm_pins"; + pinctrl-0 = <&tdmout_a>, + <&tdmin_a>; + }; + + tdmb { + clocks = <&clkaudio CLKID_AUDIO_MCLK_B>, + <&clkc CLKID_MPLL0>; + clock-names = "mclk\0clk_srcpll\0samesource_sysclk"; + pinctrl-0 = <&tdmb_mclk>, + <&tdmout_b>; + }; + + spdif { + pinctrl-names = "spdif_pins"; + pinctrl-0 = <&spdifin>; + /delete-property/ pinctrl-1; + }; + }; + }; + + serial@ffd24000 { + status = "disabled"; + }; + + emmc@ffe07000 { + emmc { + /delete-property/ save_para ; + /delete-property/ compute_cmd_delay; + /delete-property/ compute_coef; + gpio_dat3 = <&gpio BOOT_3 GPIO_ACTIVE_HIGH>; + hw_reset = <&gpio BOOT_9 GPIO_ACTIVE_HIGH>; + caps = "MMC_CAP_8_BIT_DATA\0MMC_CAP_MMC_HIGHSPEED\0MMC_CAP_SD_HIGHSPEED\0MMC_CAP_NONREMOVABLE\0MMC_CAP_1_8V_DDR\0MMC_CAP_HW_RESET\0MMC_CAP_ERASE\0MMC_CAP_CMD23\0MMC_CAP_DRIVER_TYPE_A"; + caps2 = "MMC_CAP2_HS200\0MMC_CAP2_HS400"; + }; + }; + + sd@ffe05000 { + interrupts = <0x00 0xbe 0x04>; + + sd { + caps = "MMC_CAP_4_BIT_DATA\0MMC_CAP_MMC_HIGHSPEED\0MMC_CAP_SD_HIGHSPEED\0MMC_CAP_UHS_SDR12\0MMC_CAP_UHS_SDR25\0MMC_CAP_UHS_SDR50\0MMC_CAP_UHS_SDR104"; + vol_switch_def = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + vol_switch = <&gpio GPIOX_19 GPIO_ACTIVE_HIGH>; + vol_switch_delay = <0x96>; + f_max = <0xbebc200>; + }; + + sdio { + caps = "MMC_CAP_4_BIT_DATA\0MMC_CAP_MMC_HIGHSPEED\0MMC_CAP_SD_HIGHSPEED\0MMC_CAP_NONREMOVABLE\0MMC_CAP_UHS_SDR12\0MMC_CAP_UHS_SDR25\0MMC_CAP_UHS_SDR50\0MMC_CAP_UHS_SDR104\0MMC_PM_KEEP_POWER\0MMC_CAP_SDIO_IRQ"; + f_min = <0x61a80>; + f_max = <0xbebc200>; + }; + }; + + sdio@ffe03000 { + mt76x8_pmu_en_gpio = <&gpio GPIOX_15 GPIO_ACTIVE_HIGH>; + }; + + gpioleds { + led_power { + gpios = <&gpio GPIOA_4 GPIO_ACTIVE_HIGH>; + default-state = "on"; + retain-state-shutdown; + }; + }; + + bt-dev { + gpio_en = <&gpio GPIOX_14 GPIO_ACTIVE_HIGH>; + /delete-property/ gpio_reset; + /delete-property/ gpio_hostwake; + }; + + wifi { + power_on_pin = <&gpio GPIOX_15 GPIO_ACTIVE_HIGH>; + power_pin_reset = <0x01>; + /delete-property/ dhd_static_buf; + /delete-property/ pinctrl-names; + /delete-property/ pinctrl-0; + }; + + wifi_pwm_conf { + + pwm_channel1_conf { + pwms = <&pwm_ef 0x00 0x7558 0x00>; + duty-cycle = <0x3aac>; + }; + + pwm_channel2_conf { + pwms = <&pwm_ef 0x02 0x754e 0x00>; + duty-cycle = <0x3aa7>; + }; + }; + + gpio_keypad { + key_num = <0x04>; + key_name = "mute\0action\0volup\0voldown"; + key_code = <0xF0 0x74 0x72 0x73>; + key-gpios = <&gpio GPIOX_16 GPIO_ACTIVE_HIGH>, + <&gpio GPIOX_6 GPIO_ACTIVE_HIGH>, + <&gpio GPIOX_12 GPIO_ACTIVE_HIGH>, + <&gpio GPIOX_13 GPIO_ACTIVE_HIGH>; + interrupts = <0x00 0x46 0x01 0x00 0x47 0x02>; + interrupt-names = "irq_keyup\0irq_keydown"; + detect_mode = <0x00>; + /delete-property/ reg; + }; + + /delete-node/ adc_keypad; + + meson-remote { + demod_enable; + }; + + meson-ir-tx { + compatible = "amlogic,meson-g12a-ir-tx", "amlogic,meson-ir-tx"; + reg = <0x00 0xff80014c 0x00 0x10>; + pinctrl-names = "default"; + pinctrl-0 = <&irblaster_pins>; + interrupts = <0x00 0xc6 0x01>; + clocks = <&clkc CLKID_CLK81>, <&xtal>; + clock-names = "sysclk", "xtal"; + status = "okay"; + }; + + cpu_opp_table0 { + + opp00 { + opp-hz = <0x00 0x5f5e100>; + opp-microvolt = <0xb2778>; + }; + + opp01 { + opp-hz = <0x00 0xee6b280>; + opp-microvolt = <0xb2778>; + }; + + opp02 { + opp-hz = <0x00 0x1dcd6500>; + opp-microvolt = <0xb2778>; + }; + + opp03 { + opp-hz = <0x00 0x27c19cc0>; + opp-microvolt = <0xb2778>; + }; + + opp04 { + opp-hz = <0x00 0x3b9aca00>; + opp-microvolt = <0xb9ca8>; + }; + + opp05 { + opp-hz = <0x00 0x47868c00>; + opp-microvolt = <0xbeac8>; + }; + + opp06 { + opp-hz = <0x00 0x5353c980>; + opp-microvolt = <0xc5ff8>; + }; + + opp07 { + opp-hz = <0x00 0x5a1f4a00>; + opp-microvolt = <0xd2348>; + }; + + opp08 { + opp-hz = <0x00 0x5fd82200>; + opp-microvolt = <0xdbf88>; + }; + + opp09 { + opp-hz = <0x00 0x6590fa00>; + opp-microvolt = <0xe82d8>; + }; + + opp10 { + opp-hz = <0x00 0x71b9c500>; + opp-microvolt = <0xf9830>; + }; + opp11 { + opp-hz = <0x00 0x7829b800>; + opp-microvolt = <0xf9830>; + }; + }; + + cpu_opp_table1 { + + opp00 { + opp-hz = <0x00 0x5f5e100>; + opp-microvolt = <0xb2778>; + }; + + opp01 { + opp-hz = <0x00 0xee6b280>; + opp-microvolt = <0xb2778>; + }; + + opp02 { + opp-hz = <0x00 0x1dcd6500>; + opp-microvolt = <0xb2778>; + }; + + opp03 { + opp-hz = <0x00 0x27c19cc0>; + opp-microvolt = <0xb2778>; + }; + + opp04 { + opp-hz = <0x00 0x3b9aca00>; + opp-microvolt = <0xb2778>; + }; + + opp05 { + opp-hz = <0x00 0x47868c00>; + opp-microvolt = <0xb7598>; + }; + + opp06 { + opp-hz = <0x00 0x5353c980>; + opp-microvolt = <0xbc3b8>; + }; + + opp07 { + opp-hz = <0x00 0x5a1f4a00>; + opp-microvolt = <0xbc3b8>; + }; + + opp08 { + opp-hz = <0x00 0x5fd82200>; + opp-microvolt = <0xbeac8>; + }; + + opp09 { + opp-hz = <0x00 0x6590fa00>; + opp-microvolt = <0xc11d8>; + }; + + opp10 { + opp-hz = <0x00 0x6b49d200>; + opp-microvolt = <0xcae18>; + }; + + opp11 { + opp-hz = <0x00 0x71b9c500>; + opp-microvolt = <0xd2348>; + }; + + opp12 { + opp-hz = <0x00 0x7829b800>; + opp-microvolt = <0xde698>; + }; + + opp13 { + opp-hz = <0x00 0x7d2b7500>; + opp-microvolt = <0xe82d8>; + }; + + opp14 { + opp-hz = <0x00 0x839b6800>; + opp-microvolt = <0xf6d38>; + }; + opp15 { + opp-hz = <0x00 0x89544000>; + opp-microvolt = <0xf6d38>; + }; + + opp16 { + opp-hz = <0x00 0x8f0d1800>; + opp-microvolt = <0xf9830>; + }; + }; + + pwmao_d-regulator { + pwms = <&pwm_AO_cd 0x01 0x4e2 0x00>; + regulator-min-microvolt = <0xb0068>; + regulator-max-microvolt = <0xf9830>; + max-duty-cycle = <0x4e2>; + voltage-table = <0xf9830 0x00 0xf6d38 0x03 0xf4628 0x06 0xf1f18 0x0a 0xef808 0x0d 0xed0f8 0x10 0xea9e8 0x14 0xe82d8 0x17 0xe5bc8 0x1a 0xe34b8 0x1e 0xe0da8 0x21 0xde698 0x24 0xdbf88 0x28 0xd9878 0x2b 0xd7168 0x2e 0xd4a58 0x32 0xd2348 0x35 0xcfc38 0x38 0xcd528 0x3c 0xcae18 0x3f 0xc8708 0x43 0xc5ff8 0x46 0xc38e8 0x49 0xc11d8 0x4c 0xbeac8 0x50 0xbc3b8 0x53 0xb9ca8 0x56 0xb7598 0x5a 0xb4e88 0x5d 0xb2778 0x60 0xb0068 0x64>; + }; + + pwmab_a-regulator { + pwms = <&pwm_ab 0x00 0x4e2 0x00>; + regulator-min-microvolt = <0xb0068>; + regulator-max-microvolt = <0xf9830>; + max-duty-cycle = <0x4e2>; + voltage-table = <0xf9830 0x00 0xf6d38 0x03 0xf4628 0x06 0xf1f18 0x0a 0xef808 0x0d 0xed0f8 0x10 0xea9e8 0x14 0xe82d8 0x17 0xe5bc8 0x1a 0xe34b8 0x1e 0xe0da8 0x21 0xde698 0x24 0xdbf88 0x28 0xd9878 0x2b 0xd7168 0x2e 0xd4a58 0x32 0xd2348 0x35 0xcfc38 0x38 0xcd528 0x3c 0xcae18 0x3f 0xc8708 0x43 0xc5ff8 0x46 0xc38e8 0x49 0xc11d8 0x4c 0xbeac8 0x50 0xbc3b8 0x53 0xb9ca8 0x56 0xb7598 0x5a 0xb4e88 0x5d 0xb2778 0x60 0xb0068 0x64>; + }; +}; -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/0002-amdv-dv-not-enabled-when-dolby_vision_policy-changed.patch ================================================ From 7a4a4a239cdaf507a44539aeef91ccd0f8060e13 Mon Sep 17 00:00:00 2001 From: yao liu <yao.liu@amlogic.com> Date: Thu, 28 Jul 2022 17:20:49 +0800 Subject: [PATCH 02/18] amdv: dv not enabled when dolby_vision_policy changed [1/1] PD#SWPL-89319 Problem: dv not enabled when dolby_vision_policy changed Solution: 1.Config dolby_vision_hdr10_policy for sdr in both always hdr and adaptive hdr mode. SDR processed by dv by default. 2.Add vs12 control for tv, vs12 is not enabled by default, due to some hdr nts test fail. Verify: t7 Change-Id: Ibf14be850214b5af1ba91ef394d16ca63433317c Signed-off-by: yao liu <yao.liu@amlogic.com> --- .../amdolby_vision/amdolby_vision.c | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c index f6a30c011a9c..c59aa708b0c7 100644 --- a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c +++ b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c @@ -137,19 +137,22 @@ static unsigned int last_dolby_vision_policy; /* bit3: follow sink 0: bypass hlg to vpp, 1: process hlg by dolby core */ /* bit4: follow source 0: bypass hlg to vpp, 1: process hlg by dolby core */ /* === SDR === */ -/* bit5: 0: bypass SDR to vpp, 1: process SDR by dolby core */ -/* set by policy_process */ +/* bit5: follow sink 0: bypass SDR to vpp, 1: process SDR by dolby core */ +/* bit6: follow source 0: bypass SDR to vpp, 1: process SDR by dolby core */ #define HDR_BY_DV_F_SINK 0x1 #define HDR_BY_DV_F_SRC 0x2 #define HDRP_BY_DV 0x4 #define HLG_BY_DV_F_SINK 0x8 #define HLG_BY_DV_F_SRC 0x10 -#define SDR_BY_DV 0x20 +#define SDR_BY_DV_F_SINK 0x20 +#define SDR_BY_DV_F_SRC 0x40 -static unsigned int dolby_vision_hdr10_policy = HDR_BY_DV_F_SINK; +static unsigned int dolby_vision_hdr10_policy; module_param(dolby_vision_hdr10_policy, uint, 0664); MODULE_PARM_DESC(dolby_vision_hdr10_policy, "\n dolby_vision_hdr10_policy\n"); -static unsigned int last_dolby_vision_hdr10_policy = HDR_BY_DV_F_SINK; +static unsigned int last_dolby_vision_hdr10_policy; + +static bool enable_amvs12_for_tv; /* enable hdmi dv std to stb core */ static uint hdmi_to_stb_policy = 1; @@ -5455,13 +5458,6 @@ static int dolby_vision_policy_process } } } - if (src_format == FORMAT_SDR && - (mode_change || *mode == dolby_vision_mode)) { - if (*mode == DOLBY_VISION_OUTPUT_MODE_BYPASS) - dolby_vision_hdr10_policy &= ~SDR_BY_DV; - else - dolby_vision_hdr10_policy |= SDR_BY_DV; - } return mode_change; } @@ -5728,14 +5724,6 @@ static int dolby_vision_policy_process mode_change = 1; } } - - if (src_format == FORMAT_SDR && - (mode_change || *mode == dolby_vision_mode)) { - if (*mode == DOLBY_VISION_OUTPUT_MODE_BYPASS) - dolby_vision_hdr10_policy &= ~SDR_BY_DV; - else - dolby_vision_hdr10_policy |= SDR_BY_DV; - } return mode_change; } @@ -10580,16 +10568,20 @@ int get_dolby_vision_hdr_policy(void) /* policy == FOLLOW_SRC, check hdr/hlg policy */ ret |= (dolby_vision_hdr10_policy & HDR_BY_DV_F_SRC) ? 1 : 0; ret |= (dolby_vision_hdr10_policy & HLG_BY_DV_F_SRC) ? 2 : 0; + ret |= (dolby_vision_hdr10_policy & SDR_BY_DV_F_SRC) ? 0x40 : 0; } else if (dolby_vision_policy == DOLBY_VISION_FOLLOW_SINK) { /* policy == FOLLOW_SINK, check hdr/hlg policy */ ret |= (dolby_vision_hdr10_policy & HDR_BY_DV_F_SINK) ? 1 : 0; ret |= (dolby_vision_hdr10_policy & HLG_BY_DV_F_SINK) ? 2 : 0; + ret |= (dolby_vision_hdr10_policy & SDR_BY_DV_F_SINK) ? 0x20 : 0; } else { /* policy == FORCE, check hdr/hlg policy */ ret |= (dolby_vision_hdr10_policy & HDR_BY_DV_F_SRC) ? 1 : 0; ret |= (dolby_vision_hdr10_policy & HLG_BY_DV_F_SRC) ? 2 : 0; ret |= (dolby_vision_hdr10_policy & HDR_BY_DV_F_SINK) ? 1 : 0; ret |= (dolby_vision_hdr10_policy & HLG_BY_DV_F_SINK) ? 2 : 0; + ret |= (dolby_vision_hdr10_policy & SDR_BY_DV_F_SINK) ? 0x20 : 0; + ret |= (dolby_vision_hdr10_policy & SDR_BY_DV_F_SRC) ? 0x40 : 0; } return ret; } @@ -11924,6 +11916,13 @@ int register_dv_functions(const struct dolby_vision_func_s *func) if (!tv_dovi_setting) return -ENOMEM; } + dolby_vision_hdr10_policy |= SDR_BY_DV_F_SINK; + dolby_vision_hdr10_policy |= HDR_BY_DV_F_SINK; + last_dolby_vision_hdr10_policy = dolby_vision_hdr10_policy; + if (ko_info) + pr_info("hdr10_policy %d, ko_info %s\n", + dolby_vision_hdr10_policy, ko_info); + } else if (func->tv_control_path && !p_funcs_tv) { pr_info("*** register_dv_tv_functions\n"); if (!ko_info) { @@ -11966,6 +11965,14 @@ int register_dv_functions(const struct dolby_vision_func_s *func) memset(tv_input_info, 0, sizeof(struct tv_input_info_s)); } + if (enable_amvs12_for_tv) { + dolby_vision_hdr10_policy |= HLG_BY_DV_F_SINK; + dolby_vision_hdr10_policy |= HDR_BY_DV_F_SINK; + } + last_dolby_vision_hdr10_policy = dolby_vision_hdr10_policy; + if (ko_info) + pr_info("hdr10_policy %d, ko_info %s\n", + dolby_vision_hdr10_policy, ko_info); } else { return ret; } @@ -13370,8 +13377,6 @@ static int amdolby_vision_probe(struct platform_device *pdev) pr_info("\n cpu_id=%d tvmode=%d\n", dv_meson_dev.cpu_id, tv_mode); memset(devp, 0, (sizeof(struct amdolby_vision_dev_s))); if (is_meson_tm2_tvmode()) { - dolby_vision_hdr10_policy |= HLG_BY_DV_F_SINK; - pr_info("enable DV HLG when follow sink.\n"); dolby_vision_flags |= FLAG_RX_EMP_VSEM; pr_info("enable DV VSEM.\n"); } -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/0003-hdmitx-forcely-send-bt.2020-for-all-DV-case-1-2.patch ================================================ From 34c8d1baaac620e55bcd1cd565e1ae66a925f995 Mon Sep 17 00:00:00 2001 From: hang cheng <hang.cheng@amlogic.com> Date: Wed, 18 May 2022 16:37:23 +0800 Subject: [PATCH 03/18] hdmitx: forcely send bt.2020 for all DV case [1/2] PD#SWPL-79072 Problem: Dolby Vision IDK2.6 kit chapter 4.4.1 Expected AVI-IF for Dolby Vision output, need BT.2020 under all DV output case Solution: forcely send bt.2020 for all DV case Verify: an400 Change-Id: Ie0b74b4c4196ca4d20bbb07cbce99487f9479162 Signed-off-by: hang cheng <hang.cheng@amlogic.com> --- .../vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index c66d30e2d696..d97b4c2ab736 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -1911,8 +1911,11 @@ void hdmitx_set_vsif_pkt(enum eotf_type type, hdmitx_device.hwop.setpacket(HDMI_PACKET_DRM, NULL, NULL); hdev->hwop.setpacket(HDMI_PACKET_VEND, VEN_DB1, VEN_HB); + /* Dolby Vision Source System-on-Chip Platform Kit Version 2.6: + * 4.4.1 Expected AVI-IF for Dolby Vision output, need BT2020 for DV + */ hdev->hwop.cntlconfig(hdev, CONF_AVI_BT2020, - CLR_AVI_BT2020);/*BT709*/ + SET_AVI_BT2020);/*BT.2020*/ if (tunnel_mode == RGB_8BIT) { hdev->hwop.cntlconfig(hdev, CONF_AVI_RGBYCC_INDIC, @@ -2013,8 +2016,11 @@ void hdmitx_set_vsif_pkt(enum eotf_type type, hdmitx_device.hwop.setpacket(HDMI_PACKET_DRM, NULL, NULL); hdev->hwop.setpacket(HDMI_PACKET_VEND, VEN_DB2, VEN_HB); + /* Dolby Vision Source System-on-Chip Platform Kit Version 2.6: + * 4.4.1 Expected AVI-IF for Dolby Vision output, need BT2020 for DV + */ hdev->hwop.cntlconfig(hdev, CONF_AVI_BT2020, - CLR_AVI_BT2020);/*BT709*/ + SET_AVI_BT2020);/*BT.2020*/ if (tunnel_mode == RGB_8BIT) {/*RGB444*/ hdev->hwop.cntlconfig(hdev, CONF_AVI_RGBYCC_INDIC, @@ -2035,13 +2041,12 @@ void hdmitx_set_vsif_pkt(enum eotf_type type, hdmitx_device.hwop.setpacket(HDMI_PACKET_DRM, NULL, NULL); hdev->hwop.setpacket(HDMI_PACKET_VEND, VEN_DB2, VEN_HB); - if (hdev->rxcap.colorimetry_data & 0xe0) - /*if RX support BT2020, then output BT2020*/ - hdev->hwop.cntlconfig(hdev, CONF_AVI_BT2020, - SET_AVI_BT2020);/*BT2020*/ - else - hdev->hwop.cntlconfig(hdev, CONF_AVI_BT2020, - CLR_AVI_BT2020);/*BT709*/ + /* Dolby vision HDMI Signaling Case25, + * UCD323 not declare bt2020 colorimetry, + * need to forcely send BT.2020 + */ + hdev->hwop.cntlconfig(hdev, CONF_AVI_BT2020, + SET_AVI_BT2020);/*BT2020*/ if (tunnel_mode == RGB_10_12BIT) {/*10/12bit RGB444*/ hdev->hwop.cntlconfig(hdev, CONF_AVI_RGBYCC_INDIC, -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/0004-DT-make-a-copy-from-arm64-to-arm.patch ================================================ From 862503c9dec4dd30c98552d88a2e0ed441be4e4c Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 25 May 2023 14:53:10 +0200 Subject: [PATCH 04/18] DT: make a copy from arm64 to arm --- arch/arm/boot/dts/amlogic/Makefile | 29 +- .../arm/boot/dts/amlogic/coreelec_common.dtsi | 264 ++++++++++++++++++ .../boot/dts/amlogic/coreelec_g12_common.dtsi | 48 ++++ arch/arm/boot/dts/amlogic/coreelec_g12b.dtsi | 64 +++++ .../arm/boot/dts/amlogic/coreelec_g12b_a.dtsi | 64 +++++ .../dts/amlogic/g12b_s922x_minix_u22xj.dts | 119 ++++++++ .../amlogic/g12b_s922x_minix_u22xj_max.dts | 130 +++++++++ .../g12b_s922x_minix_u22xj_max_rev_a.dts | 25 ++ .../dts/amlogic/g12b_s922x_ugoos_am6_2g.dts | 101 +++++++ .../dts/amlogic/g12b_s922x_ugoos_am6_4g.dts | 9 + .../amlogic/g12b_s922x_ugoos_am6_rev_a_2g.dts | 101 +++++++ .../amlogic/g12b_s922x_ugoos_am6_rev_a_4g.dts | 9 + .../dts/amlogic/g12b_s922x_ugoos_am6b_2g.dts | 29 ++ .../dts/amlogic/g12b_s922x_ugoos_am6b_4g.dts | 9 + .../g12b_s922x_ugoos_am6b_rev_a_2g.dts | 29 ++ .../g12b_s922x_ugoos_am6b_rev_a_4g.dts | 9 + 16 files changed, 1025 insertions(+), 14 deletions(-) create mode 100644 arch/arm/boot/dts/amlogic/coreelec_common.dtsi create mode 100644 arch/arm/boot/dts/amlogic/coreelec_g12_common.dtsi create mode 100644 arch/arm/boot/dts/amlogic/coreelec_g12b.dtsi create mode 100644 arch/arm/boot/dts/amlogic/coreelec_g12b_a.dtsi create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj_max.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj_max_rev_a.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_2g.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_4g.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_rev_a_2g.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_rev_a_4g.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_2g.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_4g.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_rev_a_2g.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_rev_a_4g.dts diff --git a/arch/arm/boot/dts/amlogic/Makefile b/arch/arm/boot/dts/amlogic/Makefile index 1d819778d955..a481e8b54b2d 100644 --- a/arch/arm/boot/dts/amlogic/Makefile +++ b/arch/arm/boot/dts/amlogic/Makefile @@ -1,14 +1,15 @@ - -targets += dtbs - -DTB_NAMES := $(subst $\",,$(CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES)) -ifneq ($(DTB_NAMES),) -DTB_LIST := $(addsuffix .dtb,$(DTB_NAMES)) -else -DTB_LIST := $(dtb-y) -endif -targets += $(DTB_LIST) - -dtbs: $(addprefix $(obj)/, $(DTB_LIST)) - -clean-files := *.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_minix_u22xj.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_minix_u22xj_max.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_minix_u22xj_max_rev_a.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_ugoos_am6_2g.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_ugoos_am6_4g.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_ugoos_am6_rev_a_2g.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_ugoos_am6_rev_a_4g.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_ugoos_am6b_2g.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_ugoos_am6b_4g.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_ugoos_am6b_rev_a_2g.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_ugoos_am6b_rev_a_4g.dtb + +always := $(dtb-y) +subdir-y := $(dts-dirs) +clean-files := *.dtb diff --git a/arch/arm/boot/dts/amlogic/coreelec_common.dtsi b/arch/arm/boot/dts/amlogic/coreelec_common.dtsi new file mode 100644 index 000000000000..5e488953a9c0 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/coreelec_common.dtsi @@ -0,0 +1,264 @@ +#include <dt-bindings/media/rc-map.h> + +/{ + coreelec; + /delete-property/ amlogic-dt-id; + + chosen { }; + + reserved-memory { + linux,meson-fb { + alloc-ranges = <0x77800000 0x800000>; + }; + linux,vdin0_cma { + status = "disabled"; + }; + linux,vdin1_cma { + status = "disabled"; + }; + linux,isp_cma { + status = "disabled"; + }; + linux,adapt_cma { + status = "disabled"; + }; + }; + + gpioleds { + status = "okay"; + /delete-node/ net_red; + /delete-node/ net_green; + /delete-node/ remote_led; + sys_led { + /delete-property/ retain-state-suspended; + /delete-property/ default-state; + linux,default-trigger="default-on"; + }; + }; + + codec_mm { + clear-map; + }; + + vcodec_dec { + status = "disable"; + }; + + gpio_keypad { + reg = <0xFF800000 0x400>; + }; + + /delete-node/ auge_sound; + auge_sound { + compatible = "amlogic, g12a-sound-card"; + aml-audio-card,name = "AML-AUGESOUND"; + avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; + + aml-audio-card,dai-link@0 { + mclk-fs = <128>; + cpu { + system-clock-frequency = <6144000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + aml-audio-card,dai-link@1 { + format = "i2s"; + mclk-fs = <256>; + cpu { + dai-tdm-slot-tx-mask = <1 1>; + dai-tdm-slot-rx-mask = <1 1>; + dai-tdm-slot-num = <2>; + dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&amlogic_codec>; + }; + }; + + aml-audio-card,dai-link@2 { + mclk-fs = <128>; + cpu { + system-clock-frequency = <6144000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + aml-audio-card,dai-link@3 { + format = "i2s"; + mclk-fs = <256>; + bitclock-master = <&aml_i2s2hdmi>; + frame-master = <&aml_i2s2hdmi>; + cpu { + sound-dai = <&aml_i2s2hdmi>; + dai-tdm-slot-tx-mask = <1 1>; + dai-tdm-slot-rx-mask = <1 1>; + dai-tdm-slot-num = <2>; + dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + }; + + audiolocker: locker { + status = "okay"; + }; + + /delete-node/ partitions; + /delete-node/ firmware; + + /delete-node/ rc@0xff808040; + /delete-node/ custom_maps; + meson-ir { + compatible = "amlogic,meson6-ir"; + /* Multi-format IR controller */ + reg = <0xff808040 0x44>; + interrupts = <0 196 1>; + pinctrl-names = "default"; + pinctrl-0 = <&remote_pins>; + pulse-inverted; + wakeup_protocol = <NEC>; /* force default NEC by <dt-bindings/media/rc-map.h> */ + status = "okay"; + }; + meson-remote { + compatible = "amlogic, aml_remote"; + dev_name = "meson-remote"; + reg = <0xff808040 0x44>, /*Multi-format IR controller*/ + <0xff808000 0x20>; /*Legacy IR controller*/ + status = "okay"; + protocol = <REMOTE_TYPE_NEC>; + led_blink = <1>; + led_blink_frq = <100>; + interrupts = <0 196 1>; + pinctrl-names = "default"; + pinctrl-0 = <&remote_pins>; + max_frame_time = <200>; /*set software decoder max frame time*/ + }; + + amvideocap { + compatible = "amlogic, amvideocap"; + dev_name = "amvideocap.0"; + status = "okay"; + max_size = <8>;//8M + }; + + openvfd { + compatible = "open,vfd"; + dev_name = "openvfd"; + status = "okay"; + }; + + dummy_venc: dummy_venc { + status = "disabled"; + }; + + /delete-node/ sensor; + /delete-node/ iq; + /delete-node/ demux; + /delete-node/ dvb; + /delete-node/ amvdec_656in; + /delete-node/ aml_cams; + + /delete-node/ lcd; + /delete-node/ lcd_extern; + /delete-node/ backlight; + /delete-node/ bl_pwm_conf; + /delete-node/ bl_extern; +}; + +&meson_fb { + display_size_default = <1920 1080 1920 2160 32>; + mem_size = <0x00800000 0x4b80000 0x100000 0x100000 0x800000>; + mem_alloc = <1>; + 4k2k_fb = <1>; +}; + +&i2c0 { + status = "disabled"; + /delete-node/ gt9xx@5d; + /delete-node/ ftxx@38; + /delete-node/ touchscreen@5d; + /delete-node/ touchscreen@38; +}; + +&i2c2 { + status = "disabled"; + /delete-node/ sensor-i2c@6c; +}; + +&i2c3 { + /delete-node/ ad82584f_62@62; + /delete-node/ tlv320adc3101_32@32; + /delete-node/ bl_extern_i2c; + /delete-node/ tas5707_36@36; +}; + +&audiobus { + aml_i2s2hdmi: i2s2hdmi { + #sound-dai-cells = <0>; + dai-tdm-lane-slot-mask-out = <1 1 1 1>; + dai-tdm-clk-sel = <2>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_C + &clkc CLKID_MPLL2>; + clock-names = "mclk", "clk_srcpll"; + i2s2hdmi = <1>; + status = "okay"; + }; + + /delete-node/ tdma; + /delete-node/ tdm@0; + /delete-node/ tdmc; + /delete-node/ tdm@2; + /delete-node/ tdm@3; + /delete-node/ pdm; +}; + +&pinctrl_periphs { + /delete-node/ tdmout_a; + /delete-node/ tdmin_a; + /delete-node/ tdmc_mclk; + /delete-node/ tdmout_c; + /delete-node/ tdmin_c; + /delete-node/ spdifin; + /delete-node/ pdmin; + /delete-node/ bl_pwm_off_pin; + /delete-node/ clk12_24_z_pins; + /delete-node/ gen_clk_ee_z; + /delete-node/ cam_dvp_pins; +}; + +&pinctrl_aobus { + /delete-node/ dvb_s_ts0_pins; +}; + +&vdin0 { + status = "disabled"; +}; + +&vdin1 { + status = "disabled"; +}; + +/delete-node/ &nand; + +&pcie_A { + status = "disabled"; +}; + +&aocec { + /delete-property/ arc_port_mask; +}; + +&sd_emmc_c { + emmc { + caps2 = "MMC_CAP2_HS200"; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/coreelec_g12_common.dtsi b/arch/arm/boot/dts/amlogic/coreelec_g12_common.dtsi new file mode 100644 index 000000000000..133405c8e6c3 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/coreelec_g12_common.dtsi @@ -0,0 +1,48 @@ +#include "coreelec_common.dtsi" + +/{ + auge_sound { + aml-audio-card,effect = <&audio_effect>; + + aml-audio-card,dai-link@0 { + continuous-clock; + cpu { + sound-dai = <&aml_spdif_b>; + }; + }; + + aml-audio-card,dai-link@1 { + bitclock-master = <&aml_tdmb>; + frame-master = <&aml_tdmb>; + continuous-clock; + cpu { + sound-dai = <&aml_tdmb>; + }; + }; + + aml-audio-card,dai-link@2 { + continuous-clock; + cpu { + sound-dai = <&aml_spdif>; + }; + }; + + aml-audio-card,dai-link@3 { + continuous-clock; + }; + }; +}; + +&audiobus { + aml_i2s2hdmi: i2s2hdmi { + compatible = "amlogic, g12a-snd-tdmc"; + }; + + aml_spdif: spdif { + pinctrl-0 = <&spdifout>; + }; + + aml_spdif_b: spdif_b { + status = "okay"; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/coreelec_g12b.dtsi b/arch/arm/boot/dts/amlogic/coreelec_g12b.dtsi new file mode 100644 index 000000000000..af33b74fa693 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/coreelec_g12b.dtsi @@ -0,0 +1,64 @@ +#include "g12b_a311d_w400.dts" +#include "coreelec_g12_common.dtsi" + +/{ + reserved-memory { + galcore_reserved:linux,galcore { + size = <0x1000000>; + alignment = <0x400000>; + }; + }; + + cpu_opp_table0: cpu_opp_table0 { + opp08 { + opp-hz = /bits/ 64 <1800000000>; + opp-microvolt = <1020000>; + }; + }; + + cpu_opp_table1: cpu_opp_table1 { + opp08 { + opp-hz = /bits/ 64 <1800000000>; + opp-microvolt = <830000>; + }; + opp09 { + opp-hz = /bits/ 64 <1908000000>; + opp-microvolt = <860000>; + }; + opp10 { + opp-hz = /bits/ 64 <2016000000>; + opp-microvolt = <910000>; + }; + opp11 { + opp-hz = /bits/ 64 <2100000000>; + opp-microvolt = <960000>; + }; + opp12 { + opp-hz = /bits/ 64 <2208000000>; + opp-microvolt = <1030000>; + }; + }; +}; + +ðmac { + pinctrl-names = "external_eth_pins"; + pinctrl-0 = <&external_eth_pins>; + internal_phy = <0>; + auto_cali_idx = <0>; + /delete-property/ cali_val; + /delete-property/ mc_val; +}; + +&pinctrl_periphs { + a_uart_pins:a_uart { + mux { + groups = "uart_tx_a", + "uart_rx_a", + "uart_cts_a", + "uart_rts_a"; + function = "uart_a"; + }; + + /delete-node/ mux1; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/coreelec_g12b_a.dtsi b/arch/arm/boot/dts/amlogic/coreelec_g12b_a.dtsi new file mode 100644 index 000000000000..838b40df7243 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/coreelec_g12b_a.dtsi @@ -0,0 +1,64 @@ +#include "g12b_a311d_w400_a.dts" +#include "coreelec_g12_common.dtsi" + +/{ + reserved-memory { + di_cma_reserved:linux,di_cma { + size = <0x0>; + }; + + codec_mm_cma:linux,codec_mm_cma { + size = <0x1b000000>; + }; + + galcore_reserved:linux,galcore { + size = <0x1000000>; + alignment = <0x400000>; + }; + }; + + cpu_opp_table0: cpu_opp_table0 { + opp08 { + opp-hz = /bits/ 64 <1800000000>; + opp-microvolt = <981000>; + }; + }; + + multi-di { + compatible = "amlogic, dim-g12b"; + status = "okay"; + /* 0:use reserved; 1:use cma; 2:use cma as reserved */ + flag_cma = <4>; //<1> + //memory-region = <&di_reserved>; + memory-region = <&di_cma_reserved>; + interrupts = <0 46 1 + 0 40 1>; + interrupt-names = "pre_irq", "post_irq"; + clocks = <&clkc CLKID_VPU_CLKB_TMP_COMP>, + <&clkc CLKID_VPU_CLKB_COMP>; + clock-names = "vpu_clkb_tmp_composite", + "vpu_clkb_composite"; + clock-range = <334 667>; + /* buffer-size = <3621952>;(yuv422 8bit) */ + buffer-size = <4074560>;/*yuv422 fullpack*/ + /* reserve-iomap = "true"; */ + /* if enable nr10bit, set nr10bit-support to 1 */ + post-wr-support = <1>; + nr10bit-support = <1>; + nrds-enable = <1>; + pps-enable = <1>; + }; + + deinterlace { + status = "disable"; + }; +}; + +ðmac { + pinctrl-names = "external_eth_pins"; + pinctrl-0 = <&external_eth_pins>; + internal_phy = <0>; + auto_cali_idx = <0>; + /delete-property/ cali_val; + /delete-property/ mc_val; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj.dts new file mode 100644 index 000000000000..5186afc7baa7 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj.dts @@ -0,0 +1,119 @@ +#include "coreelec_g12b_a.dtsi" + +/{ + model = "Minix U22-XJ"; + coreelec-dt-id = "g12b_s922x_minix_u22xj"; + + memory@00000000 { + linux,usable-memory = <0x0 0xf5000000>; + }; + + /delete-node/ t9015; + /delete-node/ rtc; + + auge_sound { + aml-audio-card,dai-link@1 { + codec { + sound-dai = <&rt5651>; + }; + }; + }; + + /* Minix original gpio driver settings */ + jw_io_init { + compatible = "amlogic, jw_io_control"; + dev_name = "jw_io_control"; + status = "okay"; + hdmi_5v_gpio = <&gpio GPIOH_8 GPIO_ACTIVE_HIGH>; + usb_hub_reset = <&gpio GPIOH_4 GPIO_ACTIVE_HIGH>; + ethernet_reset = <&gpio GPIOZ_15 GPIO_ACTIVE_HIGH>; + ethernet_int = <&gpio GPIOZ_14 GPIO_ACTIVE_HIGH>; + otg_ctl_gpio = <&gpio GPIOC_7 GPIO_ACTIVE_HIGH>; + earphone_ctl_gpio = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_HIGH>; + }; + + gpio-reset { + compatible = "linux,gpio-reset"; + usb_hub_reset { + gpios = <&gpio GPIOH_4 GPIO_ACTIVE_LOW>; + asserted-state = <0>; + duration-ms = <1000>; + }; + }; +}; + +&pinctrl_periphs { + external_eth_pins { + mux { + groups = "eth_mdio", + "eth_mdc", + "eth_rgmii_rx_clk", + "eth_rx_dv", + "eth_rxd0", + "eth_rxd1", + "eth_rxd2_rgmii", + "eth_rxd3_rgmii", + "eth_rgmii_tx_clk", + "eth_txen", + "eth_txd0", + "eth_txd1", + "eth_txd2_rgmii", + "eth_txd3_rgmii"; + }; + }; +}; + +&i2c1 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&i2c1_master_pins3>; + clock-frequency = <100000>; + + /* Minix power control MCU */ + jw_mcu: jw_mcu@15 { + compatible = "everest,jw_mcu"; + reg = <0x15>; + mcu_watchdog_gpio = <&gpio_ao GPIOAO_8 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; + + /* Minix extra control MCU */ + jw_mcu_isp: jw_mcu_isp@35 { + compatible = "everest,jw_mcu_isp"; + reg = <0x35>; + status = "okay"; + }; + + rtc_hym8563: rtc_hym8563@51 { + compatible = "haoyu,hym8563"; + reg = <0x51>; + irq_gpio = <&gpio_ao GPIOAO_6 GPIO_ACTIVE_HIGH>; + }; +}; + +&i2c3 { + rt5651: rt5651@1a { + compatible = "realtek,rt5651"; + #sound-dai-cells = <0>; + reg = <0x1a>; + status = "okay"; + realtek,dmic-en = "false"; + realtek,in2-differential = "false"; + }; +}; + +&sd_emmc_b { + sd { + vol_switch = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; + vol_switch_18 = <1>; + }; +}; + +ðmac { + auto_cali_idx = <1>; +}; + +&usb3_phy_v2 { + gpio-vbus-power = "GPIOH_5"; + gpios = <&gpio GPIOH_5 GPIO_ACTIVE_HIGH>; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj_max.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj_max.dts new file mode 100644 index 000000000000..43ceda52dafc --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj_max.dts @@ -0,0 +1,130 @@ +#include "coreelec_g12b.dtsi" + +/{ + model = "Minix U22-XJ Max"; + coreelec-dt-id = "g12b_s922x_minix_u22xj_max"; + + memory@00000000 { + linux,usable-memory = <0x0 0xf5000000>; + }; + + /delete-node/ t9015; + /delete-node/ rtc; + + auge_sound { + aml-audio-card,dai-link@1 { + codec { + sound-dai = <&es8316>; + }; + }; + }; + + /* Minix original gpio driver settings */ + jw_io_init { + compatible = "amlogic, jw_io_control"; + dev_name = "jw_io_control"; + status = "okay"; + hdmi_5v_gpio = <&gpio GPIOH_8 GPIO_ACTIVE_HIGH>; + usb_hub_reset = <&gpio GPIOH_4 GPIO_ACTIVE_HIGH>; + ethernet_reset = <&gpio GPIOZ_15 GPIO_ACTIVE_HIGH>; + ethernet_int = <&gpio GPIOZ_14 GPIO_ACTIVE_HIGH>; + otg_ctl_gpio = <&gpio GPIOC_7 GPIO_ACTIVE_HIGH>; + earphone_ctl_gpio = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_HIGH>; + }; + + gpio-reset { + compatible = "linux,gpio-reset"; + usb_hub_reset { + gpios = <&gpio GPIOH_4 GPIO_ACTIVE_LOW>; + asserted-state = <0>; + duration-ms = <1000>; + }; + }; +}; + +&pinctrl_periphs { + external_eth_pins { + mux { + groups = "eth_mdio", + "eth_mdc", + "eth_rgmii_rx_clk", + "eth_rx_dv", + "eth_rxd0", + "eth_rxd1", + "eth_rxd2_rgmii", + "eth_rxd3_rgmii", + "eth_rgmii_tx_clk", + "eth_txen", + "eth_txd0", + "eth_txd1", + "eth_txd2_rgmii", + "eth_txd3_rgmii"; + }; + }; +}; + +&i2c1 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&i2c1_master_pins3>; + clock-frequency = <100000>; + + /* Minix power control MCU */ + jw_mcu: jw_mcu@15 { + compatible = "everest,jw_mcu"; + reg = <0x15>; + mcu_watchdog_gpio = <&gpio_ao GPIOAO_8 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; + + /* Minix extra control MCU */ + jw_mcu_isp: jw_mcu_isp@35 { + compatible = "everest,jw_mcu_isp"; + reg = <0x35>; + status = "okay"; + }; + + rtc_hym8563: rtc_hym8563@51 { + compatible = "haoyu,hym8563"; + reg = <0x51>; + irq_gpio = <&gpio_ao GPIOAO_6 GPIO_ACTIVE_HIGH>; + }; +}; + +&i2c3 { + es8316: es8316@10 { + compatible = "everest,es8316"; + #sound-dai-cells = <0>; + reg = <0x10>; + status = "okay"; + }; +}; + +&sd_emmc_b { + sd { + jtag_pin = <&gpio GPIOC_0 GPIO_ACTIVE_HIGH>; + vol_switch = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; + vol_switch_18 = <1>; + }; +}; + +&pinctrl_periphs { + a_uart_pins:a_uart { + mux { + groups = "uart_tx_a", + "uart_rx_a", + "uart_cts_a", + "uart_rts_a"; + }; + /delete-node/ mux1; + }; +}; + +ðmac { + auto_cali_idx = <1>; +}; + +&usb3_phy_v2 { + gpio-vbus-power = "GPIOH_5"; + gpios = <&gpio GPIOH_5 GPIO_ACTIVE_HIGH>; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj_max_rev_a.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj_max_rev_a.dts new file mode 100644 index 000000000000..ead93fb7c127 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj_max_rev_a.dts @@ -0,0 +1,25 @@ +#include "g12b_s922x_minix_u22xj.dts" + +/{ + model = "Minix U22-XJ Max"; + coreelec-dt-id = "g12b_s922x_minix_u22xj_max_rev_a"; + + auge_sound { + aml-audio-card,dai-link@1 { + codec { + sound-dai = <&es8316>; + }; + }; + }; +}; + +&i2c3 { + /delete-node/ rt5651@1a; + + es8316: es8316@10 { + compatible = "everest,es8316"; + #sound-dai-cells = <0>; + reg = <0x10>; + status = "okay"; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_2g.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_2g.dts new file mode 100644 index 000000000000..06a21adb3309 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_2g.dts @@ -0,0 +1,101 @@ +#include "coreelec_g12b.dtsi" + +/{ + model = "UGOOS AM6"; + coreelec-dt-id = "g12b_s922x_ugoos_am6"; + amlogic-dt-id = "g12b_AM6_b2g"; + + memory@00000000 { + linux,usable-memory = <0x000000 0x80000000>; + }; + + auge_sound { + aml-audio-card,dai-link@1 { + codec { + sound-dai = <&rt5651>; + }; + }; + }; + + gpioleds { + green_led { + label = "green_led"; + gpios = <&gpio GPIOC_7 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "default-on"; + }; + }; + + wifi{ + power_on_pin = <&gpio_ao GPIOAO_10 GPIO_ACTIVE_HIGH>; + }; + + gpio_keypad { + key-gpios = <&gpio_ao GPIOAO_6 GPIO_ACTIVE_HIGH>; + }; +}; + +&usb2_phy_v2 { + gpio-vbus-power = "GPIOA_8"; + gpios = <&gpio GPIOA_8 GPIO_ACTIVE_HIGH>; +}; + +&usb3_phy_v2 { + otg = <1>; + default-host; // or default-otg, or nothing for auto + gpio-vbus-power = "GPIOAO_7"; + gpios = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_HIGH>; +}; + +&i2c3 { + rt5651: rt5651@1a { + compatible = "realtek,rt5651"; + #sound-dai-cells = <0>; + reg = <0x1a>; + status = "okay"; + realtek,dmic-en = "false"; + realtek,in2-differential = "false"; + }; + + hym8563: hym8563@51 { + compatible = "haoyu,hym8563"; + reg = <0x51>; + #clock-cells = <0>; + clock-frequency = <32768>; + clock-output-names = "xin32k"; + }; +}; + +&audiobus { + aml_tdmc: tdmc { + pinctrl-0 = </*&tdmc_mclk &tdmout_c &tdmin_c*/>; + }; + + tdm@3 { + status = "disabled"; + }; +}; /* end of audiobus */ + +&pinctrl_aobus { + /delete-node/ spdifout; + /delete-node/ spdifout_a_mute; +}; + +&pinctrl_periphs { + /delete-node/ tdmc_mclk; + /delete-node/ tdmout_c; + /delete-node/ tdmin_c; + + spdifout: spdifout { + mux { /* GPIOA_11 */ + groups = "spdif_out_a11"; + function = "spdif_out"; + }; + }; + + spdifout_a_mute: spdifout_a_mute { + mux { /* GPIOA_11 */ + groups = "GPIOA_11"; + function = "gpio_periphs"; + }; + }; +}; /* end of pinctrl_periphs */ diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_4g.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_4g.dts new file mode 100644 index 000000000000..a0004d876792 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_4g.dts @@ -0,0 +1,9 @@ +#include "g12b_s922x_ugoos_am6_2g.dts" + +/{ + amlogic-dt-id = "g12b_AM6_b4g"; + + memory@00000000 { + linux,usable-memory = <0x000000 0xF5000000>; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_rev_a_2g.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_rev_a_2g.dts new file mode 100644 index 000000000000..5aa71fc3db78 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_rev_a_2g.dts @@ -0,0 +1,101 @@ +#include "coreelec_g12b_a.dtsi" + +/{ + model = "UGOOS AM6"; + coreelec-dt-id = "g12b_s922x_ugoos_am6_rev_a"; + amlogic-dt-id = "g12b_AM6_a2g"; + + memory@00000000 { + linux,usable-memory = <0x000000 0x80000000>; + }; + + auge_sound { + aml-audio-card,dai-link@1 { + codec { + sound-dai = <&rt5651>; + }; + }; + }; + + gpioleds { + green_led { + label = "green_led"; + gpios = <&gpio GPIOC_7 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "default-on"; + }; + }; + + wifi{ + power_on_pin = <&gpio_ao GPIOAO_10 GPIO_ACTIVE_HIGH>; + }; + + gpio_keypad { + key-gpios = <&gpio_ao GPIOAO_6 GPIO_ACTIVE_HIGH>; + }; +}; + +&usb2_phy_v2 { + gpio-vbus-power = "GPIOA_8"; + gpios = <&gpio GPIOA_8 GPIO_ACTIVE_HIGH>; +}; + +&usb3_phy_v2 { + otg = <1>; + default-host; // or default-otg, or nothing for auto + gpio-vbus-power = "GPIOAO_7"; + gpios = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_HIGH>; +}; + +&i2c3 { + rt5651: rt5651@1a { + compatible = "realtek,rt5651"; + #sound-dai-cells = <0>; + reg = <0x1a>; + status = "okay"; + realtek,dmic-en = "false"; + realtek,in2-differential = "false"; + }; + + hym8563: hym8563@51 { + compatible = "haoyu,hym8563"; + reg = <0x51>; + #clock-cells = <0>; + clock-frequency = <32768>; + clock-output-names = "xin32k"; + }; +}; + +&audiobus { + aml_tdmc: tdmc { + pinctrl-0 = </*&tdmc_mclk &tdmout_c &tdmin_c*/>; + }; + + tdm@3 { + status = "disabled"; + }; +}; /* end of audiobus */ + +&pinctrl_aobus { + /delete-node/ spdifout; + /delete-node/ spdifout_a_mute; +}; + +&pinctrl_periphs { + /delete-node/ tdmc_mclk; + /delete-node/ tdmout_c; + /delete-node/ tdmin_c; + + spdifout: spdifout { + mux { /* GPIOA_11 */ + groups = "spdif_out_a11"; + function = "spdif_out"; + }; + }; + + spdifout_a_mute: spdifout_a_mute { + mux { /* GPIOA_11 */ + groups = "GPIOA_11"; + function = "gpio_periphs"; + }; + }; +}; /* end of pinctrl_periphs */ diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_rev_a_4g.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_rev_a_4g.dts new file mode 100644 index 000000000000..f1f1eacef83a --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_rev_a_4g.dts @@ -0,0 +1,9 @@ +#include "g12b_s922x_ugoos_am6_rev_a_2g.dts" + +/{ + amlogic-dt-id = "g12b_AM6_a4g"; + + memory@00000000 { + linux,usable-memory = <0x000000 0xF5000000>; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_2g.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_2g.dts new file mode 100644 index 000000000000..a293658b53b3 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_2g.dts @@ -0,0 +1,29 @@ +#include "g12b_s922x_ugoos_am6_2g.dts" + +/{ + model = "UGOOS AM6B"; + coreelec-dt-id = "g12b_s922x_ugoos_am6b"; + amlogic-dt-id = "g12b_AM6b_b2g"; + + auge_sound { + aml-audio-card,dai-link@1 { + codec { + sound-dai = <&es8388>; + }; + }; + }; +}; + +&i2c3 { + /delete-node/ rt5651@1a; + + es8388: es8388@10 { + status = "okay"; + compatible = "everest,es8388"; + #sound-dai-cells = <0>; + reg = <0x10>; + def-vol = <0x1d>; + def-dacvol = <0x0a>; + aux-det-gpio = <&gpio GPIOH_4 GPIO_ACTIVE_HIGH>; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_4g.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_4g.dts new file mode 100644 index 000000000000..adb06b6cf89a --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_4g.dts @@ -0,0 +1,9 @@ +#include "g12b_s922x_ugoos_am6b_2g.dts" + +/{ + amlogic-dt-id = "g12b_AM6b_b4g"; + + memory@00000000 { + linux,usable-memory = <0x000000 0xF5000000>; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_rev_a_2g.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_rev_a_2g.dts new file mode 100644 index 000000000000..fe5937c28760 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_rev_a_2g.dts @@ -0,0 +1,29 @@ +#include "g12b_s922x_ugoos_am6_rev_a_2g.dts" + +/{ + model = "UGOOS AM6B"; + coreelec-dt-id = "g12b_s922x_ugoos_am6b_rev_a"; + amlogic-dt-id = "g12b_AM6b_a2g"; + + auge_sound { + aml-audio-card,dai-link@1 { + codec { + sound-dai = <&es8388>; + }; + }; + }; +}; + +&i2c3 { + /delete-node/ rt5651@1a; + + es8388: es8388@10 { + status = "okay"; + compatible = "everest,es8388"; + #sound-dai-cells = <0>; + reg = <0x10>; + def-vol = <0x1d>; + def-dacvol = <0x0a>; + aux-det-gpio = <&gpio GPIOH_4 GPIO_ACTIVE_HIGH>; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_rev_a_4g.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_rev_a_4g.dts new file mode 100644 index 000000000000..44d09b2e89d4 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_rev_a_4g.dts @@ -0,0 +1,9 @@ +#include "g12b_s922x_ugoos_am6b_rev_a_2g.dts" + +/{ + amlogic-dt-id = "g12b_AM6b_a4g"; + + memory@00000000 { + linux,usable-memory = <0x000000 0xF5000000>; + }; +}; -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/0007-vfm-change-vfm-path-to-match-CE-for-DV.patch ================================================ From 4a39e55285b046b7858061626b2e085de96050d7 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Wed, 29 Mar 2023 16:40:49 +0200 Subject: [PATCH 07/18] vfm: change vfm path to match CE for DV use FRAME_BASE_PATH_AMLVIDEO_AMVIDEO path --- drivers/amlogic/media/common/vfm/vfm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/amlogic/media/common/vfm/vfm.c b/drivers/amlogic/media/common/vfm/vfm.c index 4c4e81143732..a4661005bdf1 100644 --- a/drivers/amlogic/media/common/vfm/vfm.c +++ b/drivers/amlogic/media/common/vfm/vfm.c @@ -402,7 +402,7 @@ static void vfm_init(void) #ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION char def_dvbl_id[VFM_NAME_LEN] = "dvblpath"; /* char def_dvbl_chain[] = "dvbldec dvbl amvideo";*/ - char def_dvbl_chain[] = "dvbldec amvideo"; + char def_dvbl_chain[] = "dvbldec amlvideo ppmgr deinterlace amvideo"; char def_dvel_id[VFM_NAME_LEN] = "dvelpath"; char def_dvel_chain[] = "dveldec dvel"; -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/0008-auto-cs-do-not-force-vuy420-on-4k-50-60Hz-when-sourc.patch ================================================ From 2fc70ce7b25427b1208f8e2b045be4363df846ea Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 31 Mar 2023 09:30:05 +0200 Subject: [PATCH 08/18] auto cs: do not force vuy420 on 4k/50/60Hz when source is Dolby Vision --- .../vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index d97b4c2ab736..c1b843ccd08b 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -5502,19 +5502,28 @@ static enum vmode_e hdmitx_validate_vmode(char *mode, unsigned int frac) // force 4k50/60Hz to 420 unless manually set if (strstr(hdev->fmt_attr, "rgb") == NULL && + strstr(hdev->fmt_attr, "420") == NULL && strstr(hdev->fmt_attr, "422") == NULL && strstr(hdev->fmt_attr, "444") == NULL) { - switch (hdmitx_edid_vic_tab_map_vic(mode)) { - case HDMI_3840x2160p50_16x9: - case HDMI_3840x2160p60_16x9: - case HDMI_4096x2160p50_256x135: - case HDMI_4096x2160p60_256x135: - case HDMI_3840x2160p50_64x27: - case HDMI_3840x2160p60_64x27: - if (!strstr(mode, "420")) - strncat(mode, "420", 3); + switch (hdev->hdmi_current_eotf_type) { + case EOTF_T_DOLBYVISION: + case EOTF_T_LL_MODE: + case EOTF_T_DV_AHEAD: break; default: + switch (hdmitx_edid_vic_tab_map_vic(mode)) { + case HDMI_3840x2160p50_16x9: + case HDMI_3840x2160p60_16x9: + case HDMI_4096x2160p50_256x135: + case HDMI_4096x2160p60_256x135: + case HDMI_3840x2160p50_64x27: + case HDMI_3840x2160p60_64x27: + if (!strstr(mode, "420")) + strncat(mode, "420", 3); + break; + default: + break; + } break; } } -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/0009-dolby_vision-adjust-DV-policy.patch ================================================ From 01e054d1db36bc47bac9f45c1c770cac1e6412da Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Wed, 12 Apr 2023 15:38:53 +0200 Subject: [PATCH 09/18] dolby_vision: adjust DV policy --- .../amlogic/media/enhancement/amdolby_vision/amdolby_vision.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c index c59aa708b0c7..dc4d2bd2c2e9 100644 --- a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c +++ b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c @@ -123,7 +123,7 @@ MODULE_PARM_DESC(primary_debug, "\n primary_debug\n"); /* else bypass Dolby Vision */ /* #define DOLBY_VISION_FORCE_OUTPUT_MODE 2 */ -static unsigned int dolby_vision_policy = 1; +static unsigned int dolby_vision_policy = DOLBY_VISION_FOLLOW_SOURCE; module_param(dolby_vision_policy, uint, 0664); MODULE_PARM_DESC(dolby_vision_policy, "\n dolby_vision_policy\n"); static unsigned int last_dolby_vision_policy; @@ -147,7 +147,7 @@ static unsigned int last_dolby_vision_policy; #define SDR_BY_DV_F_SINK 0x20 #define SDR_BY_DV_F_SRC 0x40 -static unsigned int dolby_vision_hdr10_policy; +static unsigned int dolby_vision_hdr10_policy = (HDR_BY_DV_F_SRC | HLG_BY_DV_F_SRC | SDR_BY_DV_F_SRC); module_param(dolby_vision_hdr10_policy, uint, 0664); MODULE_PARM_DESC(dolby_vision_hdr10_policy, "\n dolby_vision_hdr10_policy\n"); static unsigned int last_dolby_vision_hdr10_policy; -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/0010-dolby_vision-provide-ATTR-ko_info.patch ================================================ From 917ccf3a49f38dd6db6de142972d6730d4b0d40e Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Tue, 4 Apr 2023 11:52:13 +0200 Subject: [PATCH 10/18] dolby_vision: provide ATTR 'ko_info' --- .../enhancement/amdolby_vision/amdolby_vision.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c index dc4d2bd2c2e9..f19c9cf2b98a 100644 --- a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c +++ b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c @@ -12465,6 +12465,16 @@ static const struct file_operations amdolby_vision_fops = { .poll = amdolby_vision_poll, }; +static ssize_t amdolby_vision_ko_info_show + (struct class *cla, + struct class_attribute *attr, char *buf) +{ + if (ko_info) + return sprintf(buf, "%s", ko_info); + else + return 0; +} + static const char *amdolby_vision_debug_usage_str = { "Usage:\n" "echo dolby_crc 0/1 > /sys/class/amdolby_vision/debug; dolby_crc insert or clr\n" @@ -13230,6 +13240,8 @@ static ssize_t amdolby_vision_crc_show(struct class *cla, } static struct class_attribute amdolby_vision_class_attrs[] = { + __ATTR(ko_info, 0444, + amdolby_vision_ko_info_show, NULL), __ATTR(debug, 0644, amdolby_vision_debug_show, amdolby_vision_debug_store), __ATTR(dv_mode, 0644, -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/0011-hdmitx-force-correct-colour-sampling-on-Dolby-Vision.patch ================================================ From ffabebaefea3f14771aba270cd0fcd7ff0cd475a Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 14 Apr 2023 08:39:30 +0200 Subject: [PATCH 11/18] hdmitx: force correct colour sampling on Dolby Vision 'fmt_attr' is not set in auto mode. It does require to force correct colour sampling and colour depth with Dolby Vision, supported by the used display. --- .../vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c | 143 ++++++++++++++---- 1 file changed, 113 insertions(+), 30 deletions(-) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index c1b843ccd08b..b8a18129638f 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -609,6 +609,7 @@ static int set_disp_mode_auto(void) unsigned char mode[32]; enum hdmi_vic vic = HDMI_Unknown; int colour_depths[] = { 8, 10, 12, 16 }; + char* colour_sampling[] = {"RGB","YUV422","YUV444","YUV420"}; memset(mode, 0, sizeof(mode)); hdev->ready = 0; @@ -674,46 +675,128 @@ static int set_disp_mode_auto(void) hdev->para = para; vic = hdmitx_edid_get_VIC(hdev, mode, 1); - if (strstr(hdev->fmt_attr,"bit") != NULL) { - pr_info("hdmitx: display colourdepth forced by attr to %d bits (VIC: %d)\n", colour_depths[para->cd - COLORDEPTH_24B], vic); - } else { - // parse and set maximum colourdepth given by edid - if (hdev->rxcap.ColorDeepSupport & 0x78 && hdev->para->cs != COLORSPACE_YUV420) { - enum hdmi_color_depth cd; - for (cd = COLORDEPTH_36B; cd >= COLORDEPTH_24B; cd--) { - if (hdev->rxcap.ColorDeepSupport & (1 << (cd - 1))) { - para->cd = cd; - break; + // auto detect colour sampling + if (strstr(hdev->fmt_attr, "rgb") == NULL && + strstr(hdev->fmt_attr, "420") == NULL && + strstr(hdev->fmt_attr, "422") == NULL && + strstr(hdev->fmt_attr, "444") == NULL) { + // force colour subsampling when DV mode + switch (hdev->hdmi_current_eotf_type) { + case EOTF_T_DOLBYVISION: + case EOTF_T_LL_MODE: + case EOTF_T_DV_AHEAD: + { + int cs = para->cs; + switch (hdev->hdmi_current_tunnel_mode) { + case RGB_8BIT: + case RGB_10_12BIT: + para->cs = COLORSPACE_RGB444; + break; + case YUV422_BIT12: + para->cs = COLORSPACE_YUV422; + break; + case YUV444_10_12BIT: + para->cs = COLORSPACE_YUV444; + break; + default: + break; + } + if (cs != para->cs) + pr_info("hdmitx: display colour subsampling is forced to %s by Dolby Vision tunneling\n", + colour_sampling[para->cs]); } - } - } else if (hdev->rxcap.hf_ieeeoui == HF_IEEEOUI) { - if (hdev->rxcap.dc_36bit_420) - para->cd = COLORDEPTH_36B; - else if (hdev->rxcap.dc_30bit_420) - para->cd = COLORDEPTH_30B; - else - para->cd = COLORDEPTH_24B; + break; + default: + break; } + pr_info("hdmitx: display colour subsampling is auto set to %s (VIC: %d)\n", + colour_sampling[para->cs], vic); + } + // auto detect colourdepth + if (strstr(hdev->fmt_attr,"bit") != NULL) { + pr_info("hdmitx: display colourdepth is forced by attr to %d bits (VIC: %d)\n", + colour_depths[para->cd - COLORDEPTH_24B], vic); + } else { + // parse and set maximum colourdepth given by edid // check for colour subsampling limit - switch (vic & 0xff) { - case HDMI_3840x2160p50_16x9: - case HDMI_3840x2160p60_16x9: - case HDMI_4096x2160p50_256x135: - case HDMI_4096x2160p60_256x135: - case HDMI_3840x2160p50_64x27: - case HDMI_3840x2160p60_64x27: - if (para->cs == COLORSPACE_RGB444 || para->cs == COLORSPACE_YUV444) + switch (hdev->hdmi_current_eotf_type) { + case EOTF_T_DOLBYVISION: + case EOTF_T_LL_MODE: + case EOTF_T_DV_AHEAD: { - para->cd = COLORDEPTH_24B; - pr_info("hdmitx: forced colourdepth to %d bits because of current video information code\n", colour_depths[para->cd - COLORDEPTH_24B]); + const struct dv_info *dv_info = &hdev->rxcap.dv_info; + int cd = para->cd; + switch (hdev->hdmi_current_tunnel_mode) { + case RGB_8BIT: + para->cd = COLORDEPTH_24B; + break; + case RGB_10_12BIT: + case YUV444_10_12BIT: + if (dv_info->ver == 2) { + switch (dv_info->sup_10b_12b_444) { + case 1: + para->cd = COLORDEPTH_30B; + break; + case 2: + para->cd = COLORDEPTH_36B; + break; + default: + break; + } + } + break; + case YUV422_BIT12: + para->cd = COLORDEPTH_36B; + break; + default: + break; + } + + if (cd != para->cd) + pr_info("hdmitx: display colourdepth is forced to %d bits because of Dolby Vision sink capability\n", + colour_depths[para->cd - COLORDEPTH_24B]); } break; default: + if (hdev->rxcap.ColorDeepSupport & 0x78 && hdev->para->cs != COLORSPACE_YUV420) { + enum hdmi_color_depth cd; + for (cd = COLORDEPTH_36B; cd >= COLORDEPTH_24B; cd--) { + if (hdev->rxcap.ColorDeepSupport & (1 << (cd - 1))) { + para->cd = cd; + break; + } + } + } else if (hdev->rxcap.hf_ieeeoui == HF_IEEEOUI) { + if (hdev->rxcap.dc_36bit_420) + para->cd = COLORDEPTH_36B; + else if (hdev->rxcap.dc_30bit_420) + para->cd = COLORDEPTH_30B; + else + para->cd = COLORDEPTH_24B; + } + + switch (vic & 0xff) { + case HDMI_3840x2160p50_16x9: + case HDMI_3840x2160p60_16x9: + case HDMI_4096x2160p50_256x135: + case HDMI_4096x2160p60_256x135: + case HDMI_3840x2160p50_64x27: + case HDMI_3840x2160p60_64x27: + if (para->cs == COLORSPACE_RGB444 || para->cs == COLORSPACE_YUV444) + { + para->cd = COLORDEPTH_24B; + pr_info("hdmitx: display colourdepth is forced to %d bits because of current video information code\n", + colour_depths[para->cd - COLORDEPTH_24B]); + } + break; + default: + break; break; + } } - - pr_info("hdmitx: display colourdepth is auto set to %d bits (VIC: %d)\n", colour_depths[para->cd - COLORDEPTH_24B], vic); + pr_info("hdmitx: display colourdepth is auto set to %d bits (VIC: %d)\n", + colour_depths[para->cd - COLORDEPTH_24B], vic); } if (strncmp(info->name, "2160p30hz", strlen("2160p30hz")) == 0) { -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/0012-hdmitx-fix-display-of-current-hdmi-config-with-colou.patch ================================================ From 9a8e71e3e66503f1cc8d3143afe1a8db7a3b0fcc Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 14 Apr 2023 09:54:08 +0200 Subject: [PATCH 12/18] hdmitx: fix display of current hdmi config with colour space 422 --- drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index b8a18129638f..f7d5612727da 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -2580,7 +2580,7 @@ static ssize_t show_config(struct device *dev, para = hdev->para; // YUV422 - if (cs == 1) + if (cs == COLORSPACE_YUV422) cd = (~cd & 0x3); pos += snprintf(buf+pos, PAGE_SIZE, "VIC: %d %s\n", -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/0013-hdmitx-force-YUV444-on-Dolby-Vision-RGB-on-modes-wit.patch ================================================ From 40c1254a2601d4e39656285f5180429e6bb4572a Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Tue, 18 Apr 2023 21:56:59 +0200 Subject: [PATCH 13/18] hdmitx: force YUV444 on Dolby Vision RGB on modes witch Otherwise the TV remain black. Reason need to be identified. --- drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index f7d5612727da..a0e1b9050182 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -690,7 +690,7 @@ static int set_disp_mode_auto(void) switch (hdev->hdmi_current_tunnel_mode) { case RGB_8BIT: case RGB_10_12BIT: - para->cs = COLORSPACE_RGB444; + para->cs = COLORSPACE_YUV444; break; case YUV422_BIT12: para->cs = COLORSPACE_YUV422; -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/0014-hdmitx-provide-colour-subsampling-and-colour-depth-b.patch ================================================ From 425141ac7e62cd3c45c1b4a98e22f8d963324b8b Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 20 Apr 2023 20:46:18 +0200 Subject: [PATCH 14/18] hdmitx: provide colour subsampling and colour depth by sysfs These are used by Kodi to be able to detect if a forced mode switch is needed. --- .../vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index a0e1b9050182..9792c4fa3632 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -909,6 +909,35 @@ ssize_t store_attr(struct device *dev, } /*aud_mode attr*/ +static ssize_t cs_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int pos = 0; + int cs = hdmitx_rd_reg(HDMITX_DWC_FC_AVICONF0) & 0x3; + + pos += + snprintf(buf + pos, PAGE_SIZE, "%d\n", cs); + + return pos; +} + +static ssize_t cd_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int pos = 0; + int cs = hdmitx_rd_reg(HDMITX_DWC_FC_AVICONF0) & 0x3; + int cd = (hdmitx_rd_reg(HDMITX_DWC_TX_INVID0) & 0x6) >> 1; + + // YUV422 + if (cs == COLORSPACE_YUV422) + cd = (~cd & 0x3); + + pos += + snprintf(buf + pos, PAGE_SIZE, "%d\n", cd); + + return pos; +} + void setup_attr(const char *buf) { char attr[16] = {0}; @@ -5470,6 +5499,8 @@ static ssize_t show_hdmi_hsty_config(struct device *dev, static DEVICE_ATTR(disp_mode, 0664, show_disp_mode, store_disp_mode); static DEVICE_ATTR(attr, 0664, show_attr, store_attr); +static DEVICE_ATTR(cs, 0444, cs_show, NULL); +static DEVICE_ATTR(cd, 0444, cd_show, NULL); static DEVICE_ATTR(aud_mode, 0644, show_aud_mode, store_aud_mode); static DEVICE_ATTR(vid_mute, 0644, show_vid_mute, store_vid_mute); static DEVICE_ATTR(edid, 0644, show_edid, store_edid); @@ -6938,6 +6969,8 @@ static int amhdmitx_probe(struct platform_device *pdev) hdmitx_device.hdtx_dev = dev; ret = device_create_file(dev, &dev_attr_disp_mode); ret = device_create_file(dev, &dev_attr_attr); + ret = device_create_file(dev, &dev_attr_cs); + ret = device_create_file(dev, &dev_attr_cd); ret = device_create_file(dev, &dev_attr_aud_mode); ret = device_create_file(dev, &dev_attr_vid_mute); ret = device_create_file(dev, &dev_attr_edid); @@ -7077,6 +7110,8 @@ static int amhdmitx_remove(struct platform_device *pdev) /* Remove the cdev */ device_remove_file(dev, &dev_attr_disp_mode); device_remove_file(dev, &dev_attr_attr); + device_remove_file(dev, &dev_attr_cs); + device_remove_file(dev, &dev_attr_cd); device_remove_file(dev, &dev_attr_aud_mode); device_remove_file(dev, &dev_attr_vid_mute); device_remove_file(dev, &dev_attr_edid); -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/0015-dolby_vision-provide-Dolby-Vision-video-on-by-sysfs.patch ================================================ From 5adfd80ef1d3558af19f926868da714356cee6d6 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 21 Apr 2023 10:37:39 +0200 Subject: [PATCH 15/18] dolby_vision: provide Dolby Vision video on by sysfs --- .../enhancement/amdolby_vision/amdolby_vision.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c index f19c9cf2b98a..c0669107392b 100644 --- a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c +++ b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c @@ -13239,6 +13239,18 @@ static ssize_t amdolby_vision_crc_show(struct class *cla, return sprintf(buf, "%s\n", cur_crc); } +static ssize_t dv_video_on_show + (struct class *cla, + struct class_attribute *attr, + char *buf) +{ + ssize_t len = 0; + + len += sprintf(buf + len, "%d\n", + is_dolby_vision_video_on()); + return len; +} + static struct class_attribute amdolby_vision_class_attrs[] = { __ATTR(ko_info, 0444, amdolby_vision_ko_info_show, NULL), @@ -13286,6 +13298,8 @@ static struct class_attribute amdolby_vision_class_attrs[] = { __ATTR(use_target_lum_from_cfg, 0644, amdolby_vision_use_cfg_target_lum_show, amdolby_vision_use_cfg_target_lum_store), + __ATTR(dv_video_on, 0444, + dv_video_on_show, NULL), __ATTR_NULL }; -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/0016-hdmitx-add-dolby-vision-support-for-display-current-.patch ================================================ From 7f07487547b2e4aa69b09bb0d36849cf2a954b31 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 19 May 2023 10:58:52 +0200 Subject: [PATCH 16/18] hdmitx: add dolby vision support for display current hdmi config --- .../media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index 9792c4fa3632..675564ef3005 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -2590,7 +2590,10 @@ static ssize_t show_config(struct device *dev, struct hdmitx_dev *hdev = &hdmitx_device; int colour_depths[] = { 8, 10, 12, 16 }; char* pix_fmt[] = {"RGB","YUV422","YUV444","YUV420"}; - char* eotf[] = {"SDR","HDR","HDR10","HLG"}; + char* eotf_hdr[] = {"unknown", "HDR10","HLG","HDR","SDR"}; + char* eotf_DV[] = {"unknown", "DV-Std","DV-LL"}; + char* eotf_hdr10p[] = {"unknown", "HDR10+"}; + char* eotf = eotf_hdr[4]; char* range[] = {"default","limited","full"}; char* colourimetry[] = {"default", "BT.601", "BT.709", "xvYCC601","xvYCC709", "sYCC601","Adobe_YCC601","Adobe_RGB","BT.2020c","BT.2020nc","P3 D65","P3 DCI"}; @@ -2612,13 +2615,20 @@ static ssize_t show_config(struct device *dev, if (cs == COLORSPACE_YUV422) cd = (~cd & 0x3); + if (hdmitx_hdr10p_en()) + eotf = eotf_hdr10p[hdmitx_get_cur_hdr10p_st() & ~HDMI_HDR10P_TYPE]; + else if (hdmitx_dv_en()) + eotf = eotf_DV[hdmitx_get_cur_dv_st() & ~HDMI_DV_TYPE]; + else if (hdmitx_hdr_en()) + eotf = eotf_hdr[hdmitx_get_cur_hdr_st() & ~HDMI_HDR_TYPE]; + pos += snprintf(buf+pos, PAGE_SIZE, "VIC: %d %s\n", hdmitx_device.cur_VIC, para->name); pos += snprintf(buf + pos, PAGE_SIZE, "Colour depth: %d-bit\nColourspace: %s\nColour range: %s\nEOTF: %s\nYCC colour range: %s\n", colour_depths[cd], pix_fmt[cs], range[(hdmitx_rd_reg(HDMITX_DWC_FC_AVICONF2) & 0xc) >> 2], - eotf[(hdmitx_rd_reg(HDMITX_DWC_FC_DRM_PB00) & 7)], + eotf, range[((hdmitx_rd_reg(HDMITX_DWC_FC_AVICONF3) & 0xc) >> 2) + 1]); if (((hdmitx_rd_reg(HDMITX_DWC_FC_AVICONF1) & 0xc0) >> 6) < 0x3) pos += snprintf(buf + pos, PAGE_SIZE, "Colourimetry: %s\n", -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/0018-dolby_vision-add-is_mel-sysfs.patch ================================================ From 8a5d9b387b7f53aced94170779d77d1575f0d95c Mon Sep 17 00:00:00 2001 From: Arthur Liberman <arthur_liberman@hotmail.com> Date: Wed, 27 Dec 2023 19:32:42 +0200 Subject: [PATCH 18/18] dolby_vision: add `is_mel` sysfs Set to `true` when DoVi Profile 7 Minimum Enhancement Layer (MEL) content is detected This signals the application that it needs to switch to `dec_mode=STREAM_TYPE_FRAME` --- .../media/enhancement/amdolby_vision/amdolby_vision.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c index c0669107392b..6b20fbe687f7 100644 --- a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c +++ b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c @@ -1392,6 +1392,9 @@ static int force_disable_dv_backlight; static bool dv_control_backlight_status; static bool bypass_all_vpp_pq; static int use_target_lum_from_cfg; +static bool is_mel = false; +module_param(is_mel, bool, 0444); +MODULE_PARM_DESC(is_mel, "\n is_mel\n"); /*0: not debug mode; 1:force bypass vpp pq; 2:force enable vpp pq*/ /*3: force do nothing*/ @@ -8229,7 +8232,7 @@ int dolby_vision_parse_metadata(struct vframe_s *vf, pr_dolby_dbg("bypass mel\n"); } if (ret_flags == 1) - mel_flag = true; + mel_flag = is_mel = true; if (!is_dv_standard_es(req.dv_enhance_exist, ret_flags, w)) { src_format = FORMAT_SDR; @@ -12587,6 +12590,7 @@ static ssize_t amdolby_vision_debug_store if (kstrtoul(parm[1], 10, &val) < 0) return -EINVAL; enable_fel = val; + is_mel = false; pr_info("enable_fel %d\n", enable_fel); } else if (!strcmp(parm[0], "ko_info")) { if (ko_info) -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/linux-010-usbhid-quirks.patch ================================================ diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c index e6cfd32..7aa0ff0 100644 --- a/drivers/hid/usbhid/hid-quirks.c +++ b/drivers/hid/usbhid/hid-quirks.c @@ -163,6 +163,53 @@ static const struct hid_blacklist { { USB_VENDOR_ID_DRACAL_RAPHNET, USB_DEVICE_ID_RAPHNET_2NES2SNES, HID_QUIRK_MULTI_INPUT }, { USB_VENDOR_ID_DRACAL_RAPHNET, USB_DEVICE_ID_RAPHNET_4NES4SNES, HID_QUIRK_MULTI_INPUT }, +// Juyao + { 0x0314,0x0326,0x040 }, + { 0x0314,0x0328,0x040 }, + +// 4NES4SNES + { 0x1781,0x0A9D,0x040 }, + +// Retrolink SNES + { 0x1292,0x5346,0x040 }, + { 0x1292,0x5366,0x040 }, + +// Retrobit Atari to USB Driver + { 0x1292,0x4154,0x040 }, + +// Retrobit Genesis to PC USB Adapter + { 0x1292,0x4745,0x040 }, + +// Retrode + { 0x0403,0x97c1,0x040 }, + +// HuiJia USB GamePad Mayflash Sega Saturn + { 0x0e8f,0x3010,0x040 }, + +// HuiJia USB GamePad Mayflash NES SNES + { 0x0079,0x1804,0x040 }, + +// Mayflash Dreamcast + { 0x0e8f,0x3013,0x040 }, + +// Xin-Mo 2players 20pins + { 0x16c0,0x75e1,0x040 }, + +// Xinmo 18 pins USB THT 2P arcade controller THT 2P arcade controller + { 0x16c0,0x05e1,0x040 }, + +// USB PS2 Adapter GreenAsia Electronics + { 0xe8f,0x1013,0x040 }, + +// HuiJia USB GamePad Mayflash N64 - need test + { 0xe8f,0x3013,0x040 }, + +// XCSOURCE 2 Encoder USB - Twin USB Gamepad + { 0x810,0xe001,0x040 }, + +// 3H Dual Arcade 2Players + { 0x16c0,0x05e0,0x040 }, + { 0, 0 } }; ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/linux-02-fix_bluetooth_reconnect.patch ================================================ From 0996abc14470622eece29b66913b082a2eebe5f2 Mon Sep 17 00:00:00 2001 From: Florian Dollinger <dollinger.florian@gmx.de> Date: Sun, 7 Jan 2018 23:55:52 +0100 Subject: [PATCH] The current L2CAP implementation does not change any options if the other side respons with "unknown options", but does if "unaccepted options" is the answer. It is up to the implementation to decide on the effort spent on config negotiations, therefore the current implementation is correct at this point - but many devices (like Xbox One S controllers) are not useable this way. A workaround for many users therefore is to disable_ertm, since this is often the option which is unknown. I would prefer to try it again with altered options instead of globally disable ERTM. In result, I suggest the following patch. It simply adds a new case (L2CAP_CONF_UNKNOWN), which does nothing but falling through to L2CAP_CONF_UNACCEPT. Signed-off-by: Florian Dollinger <dollinger.florian@gmx.de> --- net/bluetooth/l2cap_core.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 43ba91c44..388d53bfd 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -4208,6 +4208,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, } goto done; + case L2CAP_CONF_UNKNOWN: case L2CAP_CONF_UNACCEPT: if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) { char req[64]; -- 2.15.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/linux-03-stop-hid-generic-from-grabing-xbone.patch ================================================ From 090b784913a5ff0a823510553f97c0d7b1115f57 Mon Sep 17 00:00:00 2001 From: cdu13a <cdu13a@gmail.com> Date: Sat, 23 Nov 2019 14:08:13 -0500 Subject: hid: stop hid-generic from being greedy with the xbox one controller --- drivers/hid/hid-core.c | 2 ++ drivers/hid/hid-ids.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index f5e17e8ce9ba..188c25a30870 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -2004,6 +2004,8 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_600) }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3KV1) }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_XBOX_ONE_S) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_XBOX_ONE_S_2016) }, { HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) }, { HID_USB_DEVICE(USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL) }, { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN) }, diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 8b5d1166416a..4d753184436a 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -745,6 +745,8 @@ #define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP 0x07dd #define USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_JP 0x07e9 #define USB_DEVICE_ID_MS_POWER_COVER 0x07da +#define USB_DEVICE_ID_MS_XBOX_ONE_S 0x02fd +#define USB_DEVICE_ID_MS_XBOX_ONE_S_2016 0x02e0 #define USB_VENDOR_ID_MOJO 0x8282 #define USB_DEVICE_ID_RETRO_ADAPTER 0x3201 -- 2.17.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/linux-04-xpadneo.patch ================================================ From 25d349d6af1eb1637cb82e9627c32f6225b0e912 Mon Sep 17 00:00:00 2001 From: cdu13a <cdu13a@gmail.com> Date: Sat, 23 Nov 2019 14:10:47 -0500 Subject: hid: add xpadneo driver 0.6.0 --- drivers/hid/Kconfig | 7 + drivers/hid/Makefile | 1 + drivers/hid/hid-xpadneo.c | 1415 +++++++++++++++++++++++++++++++++++++ 3 files changed, 1423 insertions(+) create mode 100644 drivers/hid/hid-xpadneo.c diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 8eed456a67be..4d385d46fb4c 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig @@ -909,6 +909,13 @@ config HID_XINMO standard. Currently only supports the Xin-Mo Dual Arcade. Say Y here if you have a Xin-Mo Dual Arcade controller. +config HID_XPADNEO + tristate "XBOX ONE S and X controller over Bluetooth, including FF" + depends on HID + select INPUT_FF_MEMLESS + ---help--- + Support for Xbox One S and X controllers over BT, including force-feedback. + config HID_ZEROPLUS tristate "Zeroplus based game controller support" depends on HID diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile index 86b2b5785fd2..dfdcb2e64cde 100644 --- a/drivers/hid/Makefile +++ b/drivers/hid/Makefile @@ -98,6 +98,7 @@ obj-$(CONFIG_HID_TWINHAN) += hid-twinhan.o obj-$(CONFIG_HID_UCLOGIC) += hid-uclogic.o obj-$(CONFIG_HID_LED) += hid-led.o obj-$(CONFIG_HID_XINMO) += hid-xinmo.o +obj-$(CONFIG_HID_XPADNEO) += hid-xpadneo.o obj-$(CONFIG_HID_ZEROPLUS) += hid-zpff.o obj-$(CONFIG_HID_ZYDACRON) += hid-zydacron.o diff --git a/drivers/hid/hid-xpadneo.c b/drivers/hid/hid-xpadneo.c new file mode 100644 index 000000000000..b4847ab6ee1a --- /dev/null +++ b/drivers/hid/hid-xpadneo.c @@ -0,0 +1,1414 @@ +#define DRV_VER "0.6.0" + +/* + * Force feedback support for XBOX ONE S and X gamepads via Bluetooth + * + * This driver was developed for a student project at fortiss GmbH in Munich. + * Copyright (c) 2017 Florian Dollinger <dollinger.florian@gmx.de> + */ + +#include <linux/hid.h> +#include <linux/power_supply.h> +#include <linux/input.h> /* ff_memless(), ... */ +#include <linux/module.h> /* MODULE_*, module_*, ... */ +#include <linux/slab.h> /* kzalloc(), kfree(), ... */ +#include <linux/delay.h> /* mdelay(), ... */ +#include "hid-ids.h" /* VENDOR_ID... */ + + +#define DEBUG + + +/* Module Information */ +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Florian Dollinger <dollinger.florian@gmx.de>"); +MODULE_DESCRIPTION("Linux kernel driver for Xbox ONE S+ gamepads (BT), incl. FF"); +MODULE_VERSION(DRV_VER); + + +/* Module Parameters, located at /sys/module/hid_xpadneo/parameters */ + +/* NOTE: + * In general it is not guaranteed that a short variable is no more than + * 16 bit long in C, it depends on the computer architecure. But as a kernel + * module parameter it is, since <params.c> does use kstrtou16 for shorts + * since version 3.14 + */ + +#ifdef DEBUG +static u8 param_debug_level; +module_param_named(debug_level, param_debug_level, byte, 0644); +MODULE_PARM_DESC(debug_level, "(u8) Debug information level: 0 (none) to 3+ (most verbose)."); +#endif + +static u8 param_disable_ff; +module_param_named(disable_ff, param_disable_ff, byte, 0644); +MODULE_PARM_DESC(disable_ff, "(u8) Disable FF: 0 (all enabled), 1 (disable main), 2 (disable triggers), 3 (disable all)."); + +#define PARAM_DISABLE_FF_NONE 0 +#define PARAM_DISABLE_FF_MAIN 1 +#define PARAM_DISABLE_FF_TRIGGER 2 +#define PARAM_DISABLE_FF_ALL 3 + +static bool param_combined_z_axis; +module_param_named(combined_z_axis, param_combined_z_axis, bool, 0644); +MODULE_PARM_DESC(combined_z_axis, "(bool) Combine the triggers to form a single axis. 1: combine, 0: do not combine"); + +static u8 param_trigger_rumble_damping = 4; +module_param_named(trigger_rumble_damping, param_trigger_rumble_damping, byte, 0644); +MODULE_PARM_DESC(trigger_rumble_damping, "(u8) Damp the trigger: 1 (none) to 2^8+ (max)"); + +static u16 param_fake_dev_version = 0x1130; +module_param_named(fake_dev_version, param_fake_dev_version, ushort, 0644); +MODULE_PARM_DESC(fake_dev_version, "(u16) Fake device version # to hide from SDL's mappings. 0x0001-0xFFFF: fake version, others: keep original"); + + +/* + * Debug Printk + * + * Prints a debug message to kernel (dmesg) + * only if both is true, this is a DEBUG version and the + * param_debug_level-parameter is equal or higher than the level + * specified in hid_dbg_lvl + */ + +#define DBG_LVL_NONE 0 +#define DBG_LVL_FEW 1 +#define DBG_LVL_SOME 2 +#define DBG_LVL_ALL 3 + + +#ifdef DEBUG +#define hid_dbg_lvl(lvl, fmt_hdev, fmt_str, ...) \ + do { \ + if (param_debug_level >= lvl) \ + hid_dbg(pr_fmt(fmt_hdev), \ + pr_fmt(fmt_str), ##__VA_ARGS__); \ + } while (0) +#define dbg_hex_dump_lvl(lvl, fmt_prefix, data, size) \ + do { \ + if (param_debug_level >= lvl) \ + print_hex_dump(KERN_DEBUG, pr_fmt(fmt_prefix), \ + DUMP_PREFIX_NONE, 32, 1, data, size, false); \ + } while (0) +#else +#define hid_dbg_lvl(lvl, fmt_hdev, fmt_str, ...) \ + no_printk(KERN_DEBUG pr_fmt(fmt_str), ##__VA_ARGS__) +#define dbg_hex_dump_lvl(lvl, fmt_prefix, data, size) \ + no_printk(KERN_DEBUG pr_fmt(fmt_prefix)) +#endif + + +static DEFINE_IDA(xpadneo_device_id_allocator); + +/* + * FF Output Report + * + * This is the structure for the rumble output report. For more information + * about this structure please take a look in the hid-report description. + * Please notice that the structs are __packed, therefore there is no "padding" + * between the elements (they behave more like an array). + * + */ + +enum { + FF_ENABLE_NONE = 0x00, + FF_ENABLE_RIGHT = 0x01, + FF_ENABLE_LEFT = 0x02, + FF_ENABLE_RIGHT_TRIGGER = 0x04, + FF_ENABLE_LEFT_TRIGGER = 0x08, + FF_ENABLE_ALL = 0x0F +}; + +struct ff_data { + u8 enable_actuators; + u8 magnitude_left_trigger; + u8 magnitude_right_trigger; + u8 magnitude_left; + u8 magnitude_right; + u8 duration; + u8 start_delay; + u8 loop_count; +} __packed; + +struct ff_report { + u8 report_id; + struct ff_data ff; +} __packed; + +/* static variables are zeroed => empty initialization struct */ +static const struct ff_data ff_clear; + + +/* + * Device Data + * + * We attach information to hdev, which is therefore nearly globally accessible + * via hid_get_drvdata(hdev). It is attached to the hid_device via + * hid_set_drvdata(hdev) at the probing function. + */ + +enum report_type { + UNKNOWN, + LINUX, + WINDOWS +}; + +// TODO: avoid data duplication + +const char *report_type_text[] = { + "unknown", + "linux/android", + "windows" +}; + + +struct xpadneo_devdata { + /* mutual exclusion */ + spinlock_t lock; + + /* unique physical device id (randomly assigned) */ + int id; + + /* logical device interfaces */ + struct hid_device *hdev; + struct input_dev *idev; + struct power_supply *batt; + + /* report types */ + enum report_type report_descriptor; + enum report_type report_behaviour; + + /* battery information */ + struct power_supply_desc batt_desc; + u8 ps_online; + u8 ps_present; + u8 ps_capacity_level; + u8 ps_status; + + /* axis states */ + s32 last_abs_z; + s32 last_abs_rz; +}; + + +void create_ff_pck (struct ff_report *pck, u8 id, u8 en_act, + u8 mag_lt, u8 mag_rt, u8 mag_l, u8 mag_r, + u8 start_delay) { + + pck->report_id = id; + + pck->ff.enable_actuators = en_act; + pck->ff.magnitude_left_trigger = mag_lt; + pck->ff.magnitude_right_trigger = mag_rt; + pck->ff.magnitude_left = mag_l; + pck->ff.magnitude_right = mag_r; + pck->ff.duration = 0xFF; + pck->ff.start_delay = start_delay; + pck->ff.loop_count = 0xFF; + + /* It is up to the Input-Subsystem to start and stop effects as needed. + * All WE need to do is to play the effect at least 32767 ms long. + * Take a look here: + * https://stackoverflow.com/questions/48034091/ + * We therefore simply play the effect as long as possible, which is + * 2, 55s * 255 = 650, 25s ~ = 10min + */ +} + +/* + * Force Feedback Callback + * + * This function is called by the Input Subsystem. + * The effect data is set in userspace and sent to the driver via ioctl. + */ + +static int xpadneo_ff_play(struct input_dev *dev, void *data, + struct ff_effect *effect) +{ + /* Q: where is drvdata set to hid_device? + * A: hid_hw_start (called in probe) + * -> hid_connect -> hidinput_connect + * -> hidinput_allocate (sets drvdata to hid_device) + */ + + struct ff_report ff_pck; + u16 weak, strong, direction, max, max_damped; + u8 mag_main_right, mag_main_left, mag_trigger_right, mag_trigger_left; + u8 ff_active; + + const int fractions_milli[] + = {1000, 962, 854, 691, 500, 309, 146, 38, 0}; + const int proportions_idx_max = 8; + u8 index_left, index_right; + int fraction_TL, fraction_TR; + u8 trigger_rumble_damping_nonzero; + + enum { + DIRECTION_DOWN = 0x0000, + DIRECTION_LEFT = 0x4000, + DIRECTION_UP = 0x8000, + DIRECTION_RIGHT = 0xC000, + }; + + + struct hid_device *hdev = input_get_drvdata(dev); + + if (param_disable_ff == PARAM_DISABLE_FF_ALL) + return 0; + + if (effect->type != FF_RUMBLE) + return 0; + + /* copy data from effect structure at the very beginning */ + weak = effect->u.rumble.weak_magnitude; + strong = effect->u.rumble.strong_magnitude; + direction = effect->direction; + + hid_dbg_lvl(DBG_LVL_FEW, hdev, "playing effect: strong: %#04x, weak: %#04x, direction: %#04x\n", + strong, weak, direction); + + /* calculate the physical magnitudes */ + mag_main_right = (u8)((weak & 0xFF00) >> 8); /* u16 to u8 */ + mag_main_left = (u8)((strong & 0xFF00) >> 8); /* u16 to u8 */ + + + /* get the proportions from a precalculated cosine table + * calculation goes like: + * cosine(a) * 1000 = {1000, 924, 707, 383, 0, -383, -707, -924, -1000} + * fractions_milli(a) = (1000 + (cosine * 1000)) / 2 + */ + + fraction_TL = 0; + fraction_TR = 0; + + if (direction >= DIRECTION_LEFT && direction <= DIRECTION_RIGHT) { + index_left = (direction - DIRECTION_LEFT) >> 12; + index_right = proportions_idx_max - index_left; + + fraction_TL = fractions_milli[index_left]; + fraction_TR = fractions_milli[index_right]; + } + + /* we want to keep the rumbling at the triggers below the maximum + * of the weak and strong main rumble + */ + max = mag_main_right > mag_main_left ? mag_main_right : mag_main_left; + + /* the user can change the damping at runtime, hence check the range */ + trigger_rumble_damping_nonzero + = param_trigger_rumble_damping == 0 ? 1 : param_trigger_rumble_damping; + + max_damped = max / trigger_rumble_damping_nonzero; + + mag_trigger_left = (u8)((max_damped * fraction_TL) / 1000); + mag_trigger_right = (u8)((max_damped * fraction_TR) / 1000); + + + ff_active = FF_ENABLE_ALL; + + if (param_disable_ff & PARAM_DISABLE_FF_TRIGGER) + ff_active &= ~(FF_ENABLE_LEFT_TRIGGER | FF_ENABLE_RIGHT_TRIGGER); + + if (param_disable_ff & PARAM_DISABLE_FF_MAIN) + ff_active &= ~(FF_ENABLE_LEFT | FF_ENABLE_RIGHT); + + + create_ff_pck( + &ff_pck, 0x03, + ff_active, + mag_trigger_left, mag_trigger_right, + mag_main_left, mag_main_right, + 0); + + + hid_dbg_lvl(DBG_LVL_FEW, hdev, + "active: %#04x, max: %#04x, prop_left: %#04x, prop_right: %#04x, left trigger: %#04x, right: %#04x\n", + ff_active, + max, fraction_TL, fraction_TR, + ff_pck.ff.magnitude_left_trigger, + ff_pck.ff.magnitude_right_trigger); + + hid_hw_output_report(hdev, (u8 *)&ff_pck, sizeof(ff_pck)); + + return 0; +} + + +/* + * Device (Gamepad) Initialization + */ + +static int xpadneo_initDevice(struct hid_device *hdev) +{ + int error; + + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + struct input_dev *idev = xdata->idev; + + + struct ff_report ff_pck; + + /* TODO: outsource that */ + + ff_pck.ff = ff_clear; + + /* 'HELLO' FROM THE OTHER SIDE */ + if (!param_disable_ff) { + ff_pck.report_id = 0x03; + ff_pck.ff.magnitude_right = 0x80; + ff_pck.ff.magnitude_left = 0x40; + ff_pck.ff.magnitude_right_trigger = 0x20; + ff_pck.ff.magnitude_left_trigger = 0x20; + ff_pck.ff.duration = 33; + + ff_pck.ff.enable_actuators = FF_ENABLE_RIGHT; + hid_hw_output_report(hdev, (u8 *)&ff_pck, sizeof(ff_pck)); + mdelay(330); + + ff_pck.ff.enable_actuators = FF_ENABLE_LEFT; + hid_hw_output_report(hdev, (u8 *)&ff_pck, sizeof(ff_pck)); + mdelay(330); + + ff_pck.ff.enable_actuators + = FF_ENABLE_RIGHT_TRIGGER | FF_ENABLE_LEFT_TRIGGER; + hid_hw_output_report(hdev, (u8 *)&ff_pck, sizeof(ff_pck)); + mdelay(330); + } + + + /* Init Input System for Force Feedback (FF) */ + input_set_capability(idev, EV_FF, FF_RUMBLE); + error = input_ff_create_memless(idev, NULL, xpadneo_ff_play); + if (error) + return error; + + + /* + * Set default values, otherwise tools which depend on the joystick + * subsystem, report arbitrary values until the first real event + * TODO: Is this really necessary? + */ + input_report_abs(idev, ABS_X, 0); + input_report_abs(idev, ABS_Y, 0); + input_report_abs(idev, ABS_Z, 0); + input_report_abs(idev, ABS_RX, 0); + input_report_abs(idev, ABS_RY, 0); + input_report_abs(idev, ABS_RZ, 0); + input_report_key(idev, BTN_A, 0); + input_report_key(idev, BTN_B, 0); + input_report_key(idev, BTN_X, 0); + input_report_key(idev, BTN_Y, 0); + input_report_key(idev, BTN_TR, 0); + input_report_key(idev, BTN_TL, 0); + input_report_key(idev, BTN_THUMBL, 0); + input_report_key(idev, BTN_THUMBR, 0); + input_report_key(idev, BTN_START, 0); + input_report_key(idev, BTN_MODE, 0); + input_report_key(idev, ABS_HAT0X, 0); + input_report_key(idev, ABS_HAT0Y, 0); + input_sync(idev); + + /* TODO: - do not hardcode codes and values but + * keep them in the mapping structures + * - maybe initDevice isn't the right place + */ + + return 0; +} + + +/* Callback function which return the available properties to userspace */ +static int battery_get_property(struct power_supply *ps, + enum power_supply_property property, union power_supply_propval *val) +{ + struct xpadneo_devdata *xdata = power_supply_get_drvdata(ps); + unsigned long flags; + u8 capacity_level, present, online, status; + + spin_lock_irqsave(&xdata->lock, flags); + capacity_level = xdata->ps_capacity_level; + present = xdata->ps_present; + online = xdata->ps_online; + status = xdata->ps_status; + spin_unlock_irqrestore(&xdata->lock, flags); + + switch (property) { + case POWER_SUPPLY_PROP_MANUFACTURER: + val->strval = "Microsoft"; + break; + case POWER_SUPPLY_PROP_MODEL_NAME: + val->strval = "Xbox Wireless Controller"; + break; + case POWER_SUPPLY_PROP_PRESENT: + val->intval = present; + break; + case POWER_SUPPLY_PROP_ONLINE: + val->intval = online; + break; + case POWER_SUPPLY_PROP_SCOPE: + val->intval = POWER_SUPPLY_SCOPE_DEVICE; + break; + case POWER_SUPPLY_PROP_CAPACITY_LEVEL: + val->intval = capacity_level; + break; + case POWER_SUPPLY_PROP_STATUS: + val->intval = status; + break; + default: + return -EINVAL; + } + + return 0; +} + + +static int xpadneo_initBatt(struct hid_device *hdev) +{ + int ret = 0; + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + + static enum power_supply_property battery_props[] = { + /* is a power supply available? always true */ + POWER_SUPPLY_PROP_PRESENT, + /* critical, low, normal, high, full */ + POWER_SUPPLY_PROP_CAPACITY_LEVEL, + /* powers a specific device */ + POWER_SUPPLY_PROP_SCOPE, + /* charging (full, plugged), not_charging */ + POWER_SUPPLY_PROP_STATUS, + /* cstring - manufacturer name */ + POWER_SUPPLY_PROP_MANUFACTURER, + /* cstring - model name */ + POWER_SUPPLY_PROP_MODEL_NAME, + POWER_SUPPLY_PROP_ONLINE + }; + + + struct power_supply_config ps_config = { + /* pass the xpadneo_data to the get_property function */ + .drv_data = xdata + }; + + + /* Set up power supply */ + + /* Set the battery capacity to 'full' until we get our first real + * battery event. Prevents false "critical low battery" notifications + */ + xdata->ps_capacity_level = POWER_SUPPLY_CAPACITY_LEVEL_FULL; + + /* NOTE: hdev->uniq is meant to be the MAC address and hence + * it should be unique. Unfortunately, here it is not unique + * neither is it the bluetooth MAC address. + * As a solution we add an unique id for every gamepad. + */ + + xdata->batt_desc.name = kasprintf(GFP_KERNEL, "xpadneo_batt_%pMR_%i", + hdev->uniq, xdata->id); + if (!xdata->batt_desc.name) + return -ENOMEM; + + xdata->batt_desc.type = POWER_SUPPLY_TYPE_BATTERY; + + /* Which properties of the battery are accessible? */ + xdata->batt_desc.properties = battery_props; + xdata->batt_desc.num_properties = ARRAY_SIZE(battery_props); + + /* + * We have to offer a function which returns the current + * property values we defined above. Make sure that + * the get_property functions covers all properties above. + */ + xdata->batt_desc.get_property = battery_get_property; + + + /* Advanced power management emulation */ + xdata->batt_desc.use_for_apm = 0; + + /* Register power supply for our gamepad device */ + xdata->batt = devm_power_supply_register(&hdev->dev, + &xdata->batt_desc, &ps_config); + if (IS_ERR(xdata->batt)) { + ret = PTR_ERR(xdata->batt); + hid_err(hdev, "Unable to register battery device\n"); + goto err_free; + } else { + hid_dbg_lvl(DBG_LVL_SOME, hdev, "battery registered\n"); + } + + power_supply_powers(xdata->batt, &hdev->dev); + +err_free: + kfree(xdata->batt_desc.name); + xdata->batt_desc.name = NULL; + + return ret; +} + + +enum mapping_behaviour { + MAP_IGNORE, /* Completely ignore this field */ + MAP_AUTO, /* Do not really map it, let hid-core decide */ + MAP_STATIC /* Map to the values given */ +}; + +struct input_ev { + /* Map to which input event (EV_KEY, EV_ABS, ...)? */ + u8 event_type; + /* Map to which input code (BTN_A, ABS_X, ...)? */ + u16 input_code; +}; + +u8 map_hid_to_input_windows(struct hid_usage *usage, struct input_ev *map_to) +{ + + /* + * Windows report-descriptor (307 byte): + * + * 05 01 09 05 a1 01 85 01 09 01 a1 00 09 30 09 31 15 00 27 ff + * ff 00 00 95 02 75 10 81 02 c0 09 01 a1 00 09 33 09 34 15 00 + * 27 ff ff 00 00 95 02 75 10 81 02 c0 05 01 09 32 15 00 26 ff + * 03 95 01 75 0a 81 02 15 00 25 00 75 06 95 01 81 03 05 01 09 + * 35 15 00 26 ff 03 95 01 75 0a 81 02 15 00 25 00 75 06 95 01 + * 81 03 05 01 09 39 15 01 25 08 35 00 46 3b 01 66 14 00 75 04 + * 95 01 81 42 75 04 95 01 15 00 25 00 35 00 45 00 65 00 81 03 + * 05 09 19 01 29 0a 15 00 25 01 75 01 95 0a 81 02 15 00 25 00 + * 75 06 95 01 81 03 05 01 09 80 85 02 a1 00 09 85 15 00 25 01 + * 95 01 75 01 81 02 15 00 25 00 75 07 95 01 81 03 c0 05 0f 09 + * 21 85 03 a1 02 09 97 15 00 25 01 75 04 95 01 91 02 15 00 25 + * 00 75 04 95 01 91 03 09 70 15 00 25 64 75 08 95 04 91 02 09 + * 50 66 01 10 55 0e 15 00 26 ff 00 75 08 95 01 91 02 09 a7 15 + * 00 26 ff 00 75 08 95 01 91 02 65 00 55 00 09 7c 15 00 26 ff + * 00 75 08 95 01 91 02 c0 85 04 05 06 09 20 15 00 26 ff 00 75 + * 08 95 01 81 02 c0 00 + */ + + unsigned int hid_usage = usage->hid & HID_USAGE; + unsigned int hid_usage_page = usage->hid & HID_USAGE_PAGE; + + switch (hid_usage_page) { + case HID_UP_BUTTON: + switch (hid_usage) { + case 0x01: + *map_to = (struct input_ev){EV_KEY, BTN_A}; + return MAP_STATIC; + case 0x02: + *map_to = (struct input_ev){EV_KEY, BTN_B}; + return MAP_STATIC; + case 0x03: + *map_to = (struct input_ev){EV_KEY, BTN_X}; + return MAP_STATIC; + case 0x04: + *map_to = (struct input_ev){EV_KEY, BTN_Y}; + return MAP_STATIC; + case 0x05: + *map_to = (struct input_ev){EV_KEY, BTN_TL}; + return MAP_STATIC; + case 0x06: + *map_to = (struct input_ev){EV_KEY, BTN_TR}; + return MAP_STATIC; + case 0x07: + *map_to = (struct input_ev){EV_KEY, BTN_SELECT}; + return MAP_STATIC; + case 0x08: + *map_to = (struct input_ev){EV_KEY, BTN_START}; + return MAP_STATIC; + case 0x09: + *map_to = (struct input_ev){EV_KEY, BTN_THUMBL}; + return MAP_STATIC; + case 0x0A: + *map_to = (struct input_ev){EV_KEY, BTN_THUMBR}; + return MAP_STATIC; + } + case HID_UP_GENDESK: + switch (hid_usage) { + case 0x30: + *map_to = (struct input_ev){EV_ABS, ABS_X}; + return MAP_STATIC; + case 0x31: + *map_to = (struct input_ev){EV_ABS, ABS_Y}; + return MAP_STATIC; + case 0x32: + *map_to = (struct input_ev){EV_ABS, ABS_Z}; + return MAP_STATIC; + case 0x33: + *map_to = (struct input_ev){EV_ABS, ABS_RX}; + return MAP_STATIC; + case 0x34: + *map_to = (struct input_ev){EV_ABS, ABS_RY}; + return MAP_STATIC; + case 0x35: + *map_to = (struct input_ev){EV_ABS, ABS_RZ}; + return MAP_STATIC; + case 0x39: + *map_to = (struct input_ev){0, 0}; + return MAP_AUTO; + case 0x85: + *map_to = (struct input_ev){EV_KEY, BTN_MODE}; + return MAP_STATIC; + } + } + + return MAP_IGNORE; +} + +u8 map_hid_to_input_linux(struct hid_usage *usage, struct input_ev *map_to) +{ + + /* + * Linux report-descriptor (335 byte): + * + * 05 01 09 05 a1 01 85 01 09 01 a1 00 09 30 09 31 15 00 27 ff + * ff 00 00 95 02 75 10 81 02 c0 09 01 a1 00 09 32 09 35 15 00 + * 27 ff ff 00 00 95 02 75 10 81 02 c0 05 02 09 c5 15 00 26 ff + * 03 95 01 75 0a 81 02 15 00 25 00 75 06 95 01 81 03 05 02 09 + * c4 15 00 26 ff 03 95 01 75 0a 81 02 15 00 25 00 75 06 95 01 + * 81 03 05 01 09 39 15 01 25 08 35 00 46 3b 01 66 14 00 75 04 + * 95 01 81 42 75 04 95 01 15 00 25 00 35 00 45 00 65 00 81 03 + * 05 09 19 01 29 0f 15 00 25 01 75 01 95 0f 81 02 15 00 25 00 + * 75 01 95 01 81 03 05 0c 0a 24 02 15 00 25 01 95 01 75 01 81 + * 02 15 00 25 00 75 07 95 01 81 03 05 0c 09 01 85 02 a1 01 05 + * 0c 0a 23 02 15 00 25 01 95 01 75 01 81 02 15 00 25 00 75 07 + * 95 01 81 03 c0 05 0f 09 21 85 03 a1 02 09 97 15 00 25 01 75 + * 04 95 01 91 02 15 00 25 00 75 04 95 01 91 03 09 70 15 00 25 + * 64 75 08 95 04 91 02 09 50 66 01 10 55 0e 15 00 26 ff 00 75 + * 08 95 01 91 02 09 a7 15 00 26 ff 00 75 08 95 01 91 02 65 00 + * 55 00 09 7c 15 00 26 ff 00 75 08 95 01 91 02 c0 85 04 05 06 + * 09 20 15 00 26 ff 00 75 08 95 01 81 02 c0 00 + */ + + unsigned int hid_usage = usage->hid & HID_USAGE; + unsigned int hid_usage_page = usage->hid & HID_USAGE_PAGE; + + switch (hid_usage_page) { + case HID_UP_BUTTON: + switch (hid_usage) { + case 0x01: + *map_to = (struct input_ev){EV_KEY, BTN_A}; + return MAP_STATIC; + case 0x02: + *map_to = (struct input_ev){EV_KEY, BTN_B}; + return MAP_STATIC; + case 0x04: + *map_to = (struct input_ev){EV_KEY, BTN_X}; + return MAP_STATIC; + case 0x05: + *map_to = (struct input_ev){EV_KEY, BTN_Y}; + return MAP_STATIC; + case 0x07: + *map_to = (struct input_ev){EV_KEY, BTN_TL}; + return MAP_STATIC; + case 0x08: + *map_to = (struct input_ev){EV_KEY, BTN_TR}; + return MAP_STATIC; + case 0x0C: + *map_to = (struct input_ev){EV_KEY, BTN_START}; + return MAP_STATIC; + case 0x0E: + *map_to = (struct input_ev){EV_KEY, BTN_THUMBL}; + return MAP_STATIC; + case 0x0F: + *map_to = (struct input_ev){EV_KEY, BTN_THUMBR}; + return MAP_STATIC; + } + case HID_UP_CONSUMER: + switch (hid_usage) { + case 0x223: + *map_to = (struct input_ev){EV_KEY, BTN_MODE}; + return MAP_STATIC; + case 0x224: + *map_to = (struct input_ev){EV_KEY, BTN_SELECT}; + return MAP_STATIC; + } + case HID_UP_GENDESK: + switch (hid_usage) { + case 0x30: + *map_to = (struct input_ev){EV_ABS, ABS_X}; + return MAP_STATIC; + case 0x31: + *map_to = (struct input_ev){EV_ABS, ABS_Y}; + return MAP_STATIC; + case 0x32: + *map_to = (struct input_ev){EV_ABS, ABS_RX}; + return MAP_STATIC; + case 0x35: + *map_to = (struct input_ev){EV_ABS, ABS_RY}; + return MAP_STATIC; + case 0x39: + *map_to = (struct input_ev){0, 0}; + return MAP_AUTO; + } + case HID_UP_SIMULATION: + switch (hid_usage) { + case 0xC4: + *map_to = (struct input_ev){EV_ABS, ABS_RZ}; + return MAP_STATIC; + case 0xC5: + *map_to = (struct input_ev){EV_ABS, ABS_Z}; + return MAP_STATIC; + } + } + + return MAP_IGNORE; +} + + +/* + * Input Mapping Hook + * + * Invoked at input registering before mapping an usage + * (called once for every hid-usage). + */ + +static int xpadneo_mapping(struct hid_device *hdev, struct hid_input *hi, + struct hid_field *field, struct hid_usage *usage, + unsigned long **bit, int *max) +{ + /* Return values */ + enum { + RET_MAP_IGNORE = -1, /* completely ignore this input */ + RET_MAP_AUTO, /* let hid-core autodetect the mapping */ + RET_MAP_STATIC /* mapped by hand, no further processing */ + }; + + struct input_ev map_to; + u8 (*perform_mapping)(struct hid_usage *usage, struct input_ev *map_to); + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + + + switch (xdata->report_descriptor) { + case LINUX: + perform_mapping = map_hid_to_input_linux; + break; + case WINDOWS: + perform_mapping = map_hid_to_input_windows; + break; + default: + return RET_MAP_AUTO; + } + + + switch (perform_mapping(usage, &map_to)) { + case MAP_AUTO: + hid_dbg_lvl(DBG_LVL_FEW, hdev, + "UP: 0x%04X, USG: 0x%04X -> automatically\n", + usage->hid & HID_USAGE_PAGE, usage->hid & HID_USAGE); + + return RET_MAP_AUTO; + + case MAP_IGNORE: + hid_dbg_lvl(DBG_LVL_FEW, hdev, + "UP: 0x%04X, USG: 0x%04X -> ignored\n", + usage->hid & HID_USAGE_PAGE, usage->hid & HID_USAGE); + + return RET_MAP_IGNORE; + + case MAP_STATIC: + hid_dbg_lvl(DBG_LVL_FEW, hdev, + "UP: 0x%04X, USG: 0x%04X -> EV: 0x%03X, INP: 0x%03X\n", + usage->hid & HID_USAGE_PAGE, usage->hid & HID_USAGE, + map_to.event_type, map_to.input_code); + + hid_map_usage_clear(hi, usage, bit, max, + map_to.event_type, map_to.input_code); + return RET_MAP_STATIC; + + } + + /* Something went wrong, ignore this field */ + return RET_MAP_IGNORE; +} + + +/* + * Report Descriptor Fixup Hook + * + * You can either modify the original report in place and just + * return the original start address (rdesc) or you reserve a new + * one and return a pointer to it. In the latter, you mostly have to + * modify the rsize value too. + */ + +static u8 *xpadneo_report_fixup(struct hid_device *hdev, u8 *rdesc, + unsigned int *rsize) +{ + hid_dbg_lvl(DBG_LVL_SOME, hdev, "REPORT (DESCRIPTOR) FIXUP HOOK\n"); + dbg_hex_dump_lvl(DBG_LVL_FEW, "xpadneo: report-descr: ", rdesc, *rsize); + + return rdesc; +} + + +static void parse_raw_event_battery(struct hid_device *hdev, u8 *data, + int reportsize) +{ + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + unsigned long flags; + u8 capacity_level, present, online, status; + + + /* msb ID 04 lsb + * +---+---+---+---+---+---+---+---+ + * | O | R | E | C | M | M | L | L | + * +---+---+---+---+---+---+---+---+ + * + * O: Online + * R: Reserved / Unused + * E: Error (?) / Unknown + * C: Charging, I mean really charging the battery (P 'n C) + * not (only) the power cord powering the controller + * M M: Mode + * 00: Powered by USB + * 01: Powered by (disposable) batteries + * 10: Powered by Play 'n Charge battery pack (only, no cable) + * L L: Capacity Level + * 00: (Super) Critical + * 01: Low + * 10: Medium + * 11: Full + */ + + + /* I think "online" means whether the dev is online or shutting down */ + online = (data[1] & 0x80) >> 7; + + /* The _battery_ is only present if not powered by USB */ + present = ((data[1] & 0x0C) != 0x00); + + /* Capacity level, only valid as long as the battery is present */ + switch (data[1] & 0x03) { + case 0x00: + capacity_level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL; + break; + case 0x01: + capacity_level = POWER_SUPPLY_CAPACITY_LEVEL_LOW; + break; + case 0x02: + capacity_level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL; + break; + case 0x03: + capacity_level = POWER_SUPPLY_CAPACITY_LEVEL_HIGH; + break; + } + + /* Is the (Play 'n Charge) battery charging right now? */ + switch ((data[1] & 0x10) >> 4) { + case 0: + status = POWER_SUPPLY_STATUS_DISCHARGING; + break; + case 1: + status = POWER_SUPPLY_STATUS_CHARGING; + break; + } + + spin_lock_irqsave(&xdata->lock, flags); + xdata->ps_status = status; + xdata->ps_capacity_level = capacity_level; + xdata->ps_online = online; + xdata->ps_present = present; + spin_unlock_irqrestore(&xdata->lock, flags); + + power_supply_changed(xdata->batt); +} + +static void check_report_behaviour(struct hid_device *hdev, u8 *data, + int reportsize) +{ + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + + /* + * The length of the first input report with an ID of 0x01 + * reveals which report-type the controller is actually + * sending (windows: 16, or linux: 17). + */ + if (xdata->report_behaviour == UNKNOWN) { + switch (reportsize) { + case 16: + xdata->report_behaviour = WINDOWS; + break; + case 17: + xdata->report_behaviour = LINUX; + break; + default: + xdata->report_behaviour = UNKNOWN; + break; + } + } + + hid_dbg_lvl(DBG_LVL_SOME, hdev, "desc: %s, beh: %s\n", + report_type_text[xdata->report_descriptor], + report_type_text[xdata->report_behaviour]); + + /* TODO: + * Maybe the best solution would be to replace the report descriptor + * in case that the wrong reports are sent. Unfortunately we do not + * know if the report descriptor is the right one until the first + * report is sent to us. At this time, the report_fixup hook is + * already over and the original descriptor is parsed into hdev + * i.e. report_enum and collection. + * + * The next best solution would be to replace the report with + * ID 0x01 with the right one in report_enum (and collection?). + * I don't know yet how this would works, perhaps like this: + * - create a new report struct + * - fill it by hand + * - add all neccessary fields (automatic way?) + * + * Another way to fix it is: + * - Register another report with a _new_ ID by hand + * (unfortunately we cannot use the same id again) + * - in raw_event: change the ID from 0x01 to the new one if + * necessary. leave it if not. + * + * What we currently do is: + * We examine every report and fire the input events by hand. + * That's not very generic. + * + */ + + + // TODO: + // * remove old report using list operations + // * create new one like they do in hid_register_report + // * add it to output_reports->report_list and array + +} + +/* + * HID Raw Event Hook + */ + +int xpadneo_raw_event(struct hid_device *hdev, struct hid_report *report, + u8 *data, int reportsize) +{ + /* Return Codes */ + enum { + RAWEV_CONT_PROCESSING, /* Let the hid-core autodetect the event */ + RAWEV_STOP_PROCESSING /* Stop further processing */ + }; + + //hid_dbg_lvl(DBG_LVL_SOME, hdev, "RAW EVENT HOOK\n"); + + dbg_hex_dump_lvl(DBG_LVL_SOME, "xpadneo: raw_event: ", data, reportsize); + //hid_dbg_lvl(DBG_LVL_ALL, hdev, "report->size: %d\n", (report->size)/8); + //hid_dbg_lvl(DBG_LVL_ALL, hdev, "data size (wo id): %d\n", reportsize-1); + + + switch (report->id) { + case 01: + check_report_behaviour(hdev, data, reportsize); + break; + case 04: + parse_raw_event_battery(hdev, data, reportsize); + return RAWEV_STOP_PROCESSING; + } + + /* Continue processing */ + return RAWEV_CONT_PROCESSING; +} + + +void xpadneo_report(struct hid_device *hdev, struct hid_report *report) +{ + hid_dbg_lvl(DBG_LVL_SOME, hdev, "REPORT HOOK\n"); +} + + +/* + * Input Configured Hook + * + * We have to fix up the key-bitmap, because there is + * no DPAD_UP, _RIGHT, _DOWN, _LEFT on the device by default + * + */ + +static int xpadneo_input_configured(struct hid_device *hdev, + struct hid_input *hi) +{ + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + + /* set a pointer to the logical input device at the device structure */ + xdata->idev = hi->input; + + hid_dbg_lvl(DBG_LVL_SOME, hdev, "INPUT CONFIGURED HOOK\n"); + + if (param_fake_dev_version) { + xdata->idev->id.version = (u16) param_fake_dev_version; + hid_dbg_lvl(DBG_LVL_FEW, hdev, "Fake device version: 0x%04X\n", + param_fake_dev_version); + } + + + // The HID device descriptor defines a range from 0 to 65535 for all + // absolute axis (like ABS_X), this is in contrary to what the linux + // gamepad specification defines [–32.768; 32.767]. + // Therefore, we have to set the min, max, fuzz and flat values by hand: + + input_set_abs_params(xdata->idev, ABS_X, -32768, 32767, 255, 4095); + input_set_abs_params(xdata->idev, ABS_Y, -32768, 32767, 255, 4095); + + input_set_abs_params(xdata->idev, ABS_RX, -32768, 32767, 255, 4095); + input_set_abs_params(xdata->idev, ABS_RY, -32768, 32767, 255, 4095); + + if (param_combined_z_axis) + input_set_abs_params(xdata->idev, ABS_Z, -1024, 1023, 3, 63); + + // furthermore, we need to translate the incoming events to fit within + // the new range, we will do that in the xpadneo_event() hook. + + // We remove the ABS_RZ event if param_combined_z_axis is enabled + if (param_combined_z_axis) { + __clear_bit(ABS_RZ, xdata->idev->absbit); + } + + return 0; +} + + +/* + * Event Hook + * + * This hook is called whenever an event occurs that is listed on + * xpadneo_driver.usage_table (which is NULL in our case, therefore it is + * invoked on every event). + * + * Before we can send additional input events, we have to enable + * the corresponding keys in xpadneo_input_configured. + */ + +int xpadneo_event(struct hid_device *hdev, struct hid_field *field, + struct hid_usage *usage, __s32 value) +{ + /* Return Codes */ + enum { + EV_CONT_PROCESSING, /* Let the hid-core autodetect the event */ + EV_STOP_PROCESSING /* Stop further processing */ + }; + + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + struct input_dev *idev = xdata->idev; + + u16 usg_type = usage->type; + u16 usg_code = usage->code; + + + hid_dbg_lvl(DBG_LVL_ALL, hdev, + "hid-up: %02x, hid-usg: %02x, input-code: %02x, value: %02x\n", + (usage->hid & HID_USAGE_PAGE), (usage->hid & HID_USAGE), + usage->code, value); + + + // we have to shift the range of the analogues sticks (ABS_X/Y/RX/RY) + // as already explained in xpadneo_input_configured() above + // furthermore we need to combine ABS_Z and ABS_RZ if param_combined_z_axis + // is set + + if (usg_type == EV_ABS) { + if (usg_code == ABS_X || usg_code == ABS_Y + || usg_code == ABS_RX || usg_code == ABS_RY) { + hid_dbg_lvl(DBG_LVL_ALL, hdev, "shifted axis %02x, old value: %i, new value: %i\n", usg_code, value, value - 32768); + input_report_abs(idev, usg_code, value - 32768); + goto sync_and_stop_processing; + } + + if (param_combined_z_axis) { + if (usg_code == ABS_Z || usg_code == ABS_RZ) { + if (usg_code == ABS_Z) + xdata->last_abs_z = value; + if (usg_code == ABS_RZ) + xdata->last_abs_rz = value; + + input_report_abs(idev, ABS_Z, 0 - xdata->last_abs_z + xdata->last_abs_rz); + goto sync_and_stop_processing; + } + } + } + + + + + /* TODO: + * This is a workaround for the wrong report (Windows report but + * Linux descriptor). We would prefer to fixup the descriptor, but we + * cannot fix it anymore at the time we recognize the wrong behaviour, + * hence we will fire the input events by hand. + */ + + if (xdata->report_behaviour == WINDOWS + && xdata->report_descriptor == LINUX) { + + /* + * we fix all buttons by hand. You may think that we + * could do that by using the windows_map too, but it is more + * like an coincidence that this would work in this case: + * It would only, because HID_UP_BUTTONS has no special names + * for the HID_USAGE's, therefore the first button stays 0x01 + * on both reports (windows and linux) - it is a 1: 1 mapping. + * But this is not true in general (i.e. for other USAGE_PAGES) + */ + + if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) { + switch (usage->hid & HID_USAGE) { + case 0x01: + input_report_key(idev, BTN_A, value); + break; + case 0x02: + input_report_key(idev, BTN_B, value); + break; + case 0x03: + input_report_key(idev, BTN_X, value); + break; + case 0x04: + input_report_key(idev, BTN_Y, value); + break; + case 0x05: + input_report_key(idev, BTN_TL, value); + break; + case 0x06: + input_report_key(idev, BTN_TR, value); + break; + case 0x07: + input_report_key(idev, BTN_SELECT, value); + break; + case 0x08: + input_report_key(idev, BTN_START, value); + break; + case 0x09: + input_report_key(idev, BTN_THUMBL, value); + break; + case 0x0A: + input_report_key(idev, BTN_THUMBR, value); + break; + } + + hid_dbg_lvl(DBG_LVL_ALL, hdev, + "hid-upage: %02x, hid-usage: %02x fixed\n", + (usage->hid & HID_USAGE_PAGE), + (usage->hid & HID_USAGE)); + + goto sync_and_stop_processing; + } + } + + return EV_CONT_PROCESSING; + +sync_and_stop_processing: + input_sync(idev); + return EV_STOP_PROCESSING; + +} + + +/* Device Probe and Remove Hook */ + +static int xpadneo_probe_device(struct hid_device *hdev, + const struct hid_device_id *id) +{ + int ret; + struct xpadneo_devdata *xdata; + + hid_dbg_lvl(DBG_LVL_FEW, hdev, "probing device: %s\n", hdev->name); + + + /* + * Create a per-device data structure which is "nearly globally" accessible + * through hid_get_drvdata. The structure is freed automatically + * as soon as hdev->dev (the device) is removed, since we use the devm_ + * derivate. + */ + xdata = devm_kzalloc(&hdev->dev, sizeof(*xdata), GFP_KERNEL); + if (xdata == NULL) + return -ENOMEM; + + xdata->id = ida_simple_get(&xpadneo_device_id_allocator, + 0, 0, GFP_KERNEL); + + xdata->hdev = hdev; + + /* Unknown until first report with ID 01 arrives (see raw_event) */ + xdata->report_behaviour = UNKNOWN; + + switch (hdev->dev_rsize) { + case 307: + xdata->report_descriptor = WINDOWS; + break; + case 335: + xdata->report_descriptor = LINUX; + break; + default: + xdata->report_descriptor = UNKNOWN; + break; + } + + hid_set_drvdata(hdev, xdata); + + + /* Parse the raw report (includes a call to report_fixup) */ + ret = hid_parse(hdev); + if (ret) { + hid_err(hdev, "parse failed\n"); + goto return_error; + } + + /* Debug Output*/ + hid_dbg_lvl(DBG_LVL_FEW, hdev, "driver:\n"); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* version: %s\n", DRV_VER); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "hdev:\n"); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* raw rdesc: (unfixed, see above)\n"); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* raw rsize: %u\n", hdev->dev_rsize); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* bus: 0x%04X\n", hdev->bus); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* report group: %u\n", hdev->group); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* vendor: 0x%08X\n", hdev->vendor); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* version: 0x%08X\n", hdev->version); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* product: 0x%08X\n", hdev->product); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* country: %u\n", hdev->country); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* driverdata: %lu\n", id->driver_data); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* serial: %pMR\n", hdev->uniq); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* physical location: %pMR\n", hdev->phys); + + /* We start our hardware without FF, we will add it afterwards by hand + * HID_CONNECT_DEFAULT = (HID_CONNECT_HIDINPUT | HID_CONNECT_HIDRAW + * | HID_CONNECT_HIDDEV | HID_CONNECT_FF) + * Our Input Device is created automatically since we defined + * HID_CONNECT_HIDINPUT as one of the flags. + */ + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT & ~HID_CONNECT_FF); + if (ret) { + hid_err(hdev, "hw start failed\n"); + goto return_error; + } + + /* Call the device initialization routines */ + ret = xpadneo_initDevice(hdev); + if (ret) { + hid_err(hdev, "device initialization failed\n"); + goto return_error; + } + + ret = xpadneo_initBatt(hdev); + if (ret) { + hid_err(hdev, "battery initialization failed\n"); + goto return_error; + } + + + /* Everything is fine */ + return 0; + +return_error: + return ret; +} + + +static void xpadneo_remove_device(struct hid_device *hdev) +{ + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + + hid_hw_close(hdev); + + /* Cleaning up here */ + ida_simple_remove(&xpadneo_device_id_allocator, xdata->id); + + hid_hw_stop(hdev); + + hid_dbg_lvl(DBG_LVL_FEW, hdev, "Goodbye %s!\n", hdev->name); +} + + + +/* + * Device ID Structure, define all supported devices here + */ + +static const struct hid_device_id xpadneo_devices[] = { + + /* + * The ProductID is somehow related to the Firmware Version, + * but it somehow changed back from 0x02FD (newer fw) to 0x02E0 (older) + * and vice versa on one controller here. + * + * Unfortunately you cannot tell from product id how the gamepad really + * behaves on reports, since the newer firmware supports both mappings + * (the one which is standard in linux and the old one, which is still + * used in windows). + */ + + /* XBOX ONE S / X */ + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, 0x02FD) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, 0x02E0) }, + /* SENTINEL VALUE, indicates the end*/ + { } +}; + +static struct hid_driver xpadneo_driver = { + /* The name of the driver */ + .name = "xpadneo", + + /* Which devices is this driver for */ + .id_table = xpadneo_devices, + + /* Hooked as the input device is configured (before it is registered) + * we need that because we do not configure the input-device ourself + * but leave it up to hid_hw_start() + */ + .input_configured = xpadneo_input_configured, + + /* Invoked on input registering before mapping an usage */ + .input_mapping = xpadneo_mapping, + + /* If usage in usage_table, this hook is called */ + .event = xpadneo_event, + + /* Called before report descriptor parsing (NULL means nop) */ + .report_fixup = xpadneo_report_fixup, + + /* Called when a new device is inserted */ + .probe = xpadneo_probe_device, + + /* Called when a device is removed */ + .remove = xpadneo_remove_device, + + /* If report in report_table, this hook is called */ + .raw_event = xpadneo_raw_event, + + .report = xpadneo_report +}; + +MODULE_DEVICE_TABLE(hid, xpadneo_devices); + + + +/* + * Module Init and Exit + * + * We may replace init and remove by module_hid_driver(xpadneo_driver) + * in future versions, as long as there is nothing special in these two + * functions (but registering and unregistering the driver). Up to now it is + * more useful for us to not "oversimplify" the whole driver-registering thing. + * + * Caution: do not use both! (module_hid_driver and hid_(un)register_driver) + */ + +static int __init xpadneo_initModule(void) +{ + pr_info("%s: hello there!\n", xpadneo_driver.name); + + return hid_register_driver(&xpadneo_driver); +} + +static void __exit xpadneo_exitModule(void) +{ + hid_unregister_driver(&xpadneo_driver); + + ida_destroy(&xpadneo_device_id_allocator); + + pr_info("%s: goodbye!\n", xpadneo_driver.name); +} + +/* + * Tell the driver system which functions to call at initialization and + * removal of the module + */ +module_init(xpadneo_initModule); +module_exit(xpadneo_exitModule); -- 2.17.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/linux-10-add-compatibility-macro-for-input_event_sec.patch ================================================ just define from https://github.com/torvalds/linux/commit/152194fe9c3f03232b9c0d0264793a7fa4af82f8 --- a/include/uapi/linux/input.h 2022-08-05 19:02:56.906792582 +0200 +++ b/include/uapi/linux/input.h 2022-08-05 19:03:30.788834870 +0200 @@ -24,6 +24,8 @@ struct input_event { struct timeval time; +#define input_event_sec time.tv_sec +#define input_event_usec time.tv_usec __u16 type; __u16 code; __s32 value; ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/linux-emmc-partitions.patch ================================================ --- a/drivers/amlogic/mmc/emmc_partitions.c 2022-02-04 10:25:30.000000000 +0100 +++ b/drivers/amlogic/mmc/emmc_partitions.c 2022-02-09 19:02:04.964174188 +0100 @@ -1148,12 +1148,10 @@ static int add_emmc_partition(struct gen ret = add_emmc_each_part(disk, 1+i, offset, size, 0, pp->name); - pr_debug("[%sp%02d] %20s offset 0x%012llx, size 0x%012llx %s\n", + pr_info("[%sp%02d] %20s offset 0x%012llx, size 0x%012llx %s\n", disk->disk_name, 1 + i, pp->name, offset << 9, size << 9, IS_ERR(ret) ? "add fail" : ""); - if (IS_ERR(ret)) - return -1; } else { pr_info("[%s] %s: partition exceeds device capacity:\n", __func__, disk->disk_name); ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/linux-temp-02-fo_on_source.patch ================================================ diff --git a/drivers/amlogic/media/enhancement/amvecm/amcsc.c b/drivers/amlogic/media/enhancement/amvecm/amcsc.c index ac9a91d9fa8c..6e32156a51d6 100644 --- a/drivers/amlogic/media/enhancement/amvecm/amcsc.c +++ b/drivers/amlogic/media/enhancement/amvecm/amcsc.c @@ -3836,8 +3836,7 @@ uint32_t sink_hdr_support(const struct vinfo_s *vinfo) /* when policy == follow sink(0) or force output (2) */ /* use force_output */ - if ((get_force_output() != 0) - && (get_hdr_policy() != 1)) { + if ((get_force_output() != 0)) { switch (get_force_output()) { case BT709: break; ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/linux-uapi-fix_linux-if.h-userspace-compilation-errors.patch ================================================ From 2618be7dccf8739b89e1906b64bd8d551af351e6 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" <ldv@altlinux.org> Date: Mon, 20 Feb 2017 14:58:41 +0300 Subject: [PATCH] uapi: fix linux/if.h userspace compilation errors Include <sys/socket.h> (guarded by ifndef __KERNEL__) to fix the following linux/if.h userspace compilation errors: /usr/include/linux/if.h:234:19: error: field 'ifru_addr' has incomplete type struct sockaddr ifru_addr; /usr/include/linux/if.h:235:19: error: field 'ifru_dstaddr' has incomplete type struct sockaddr ifru_dstaddr; /usr/include/linux/if.h:236:19: error: field 'ifru_broadaddr' has incomplete type struct sockaddr ifru_broadaddr; /usr/include/linux/if.h:237:19: error: field 'ifru_netmask' has incomplete type struct sockaddr ifru_netmask; /usr/include/linux/if.h:238:20: error: field 'ifru_hwaddr' has incomplete type struct sockaddr ifru_hwaddr; This also fixes userspace compilation of the following uapi headers: linux/atmbr2684.h linux/gsmmux.h linux/if_arp.h linux/if_bonding.h linux/if_frad.h linux/if_pppox.h linux/if_tunnel.h linux/netdevice.h linux/route.h linux/wireless.h As no uapi header provides a definition of struct sockaddr, inclusion of <sys/socket.h> seems to be the most conservative and the only safe fix available. All current users of <linux/if.h> are very likely to be including <sys/socket.h> already because the latter is the sole provider of struct sockaddr definition in libc, so adding a uapi header with a definition of struct sockaddr would create a potential conflict with <sys/socket.h>. Replacing struct sockaddr in the definition of struct ifreq with a different type would create a potential incompatibility with current users of struct ifreq who might rely on ifru_addr et al members being of type struct sockaddr. Signed-off-by: Dmitry V. Levin <ldv@altlinux.org> Signed-off-by: David S. Miller <davem@davemloft.net> --- include/uapi/linux/if.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h index 1158a043342ac6..259617a551f251 100644 --- a/include/uapi/linux/if.h +++ b/include/uapi/linux/if.h @@ -24,6 +24,10 @@ #include <linux/socket.h> /* for "struct sockaddr" et al */ #include <linux/compiler.h> /* for "__user" et al */ +#ifndef __KERNEL__ +#include <sys/socket.h> /* for struct sockaddr. */ +#endif + #if __UAPI_DEF_IF_IFNAMSIZ #define IFNAMSIZ 16 #endif /* __UAPI_DEF_IF_IFNAMSIZ */ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/linux-z89-emuelec-set-colordepth.patch ================================================ From f64e727448cd0d16f69009d4f537eb873e87dfae Mon Sep 17 00:00:00 2001 From: "Mauro (mdrjr) Ribeiro" <mauro.ribeiro@hardkernel.com> Date: Thu, 22 Nov 2018 13:40:49 +0900 Subject: [PATCH] osd/fb: set default color format for Linux Change-Id: I1d95d63215d5567673380740528eff65562bc6df --- drivers/amlogic/media/osd/osd_fb.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/amlogic/media/osd/osd_fb.c b/drivers/amlogic/media/osd/osd_fb.c index b5d0698f086e..423120459e43 100644 --- a/drivers/amlogic/media/osd/osd_fb.c +++ b/drivers/amlogic/media/osd/osd_fb.c @@ -221,11 +221,11 @@ static struct fb_var_screeninfo fb_def_var[] = { .yoffset = 0, .bits_per_pixel = 32, .grayscale = 0, - .red = {0, 0, 0}, - .green = {0, 0, 0}, - .blue = {0, 0, 0}, - .transp = {0, 0, 0}, - .nonstd = 0, + .red = {16, 8, 0}, + .green = {8, 8, 0}, + .blue = {0, 8, 0}, + .transp = {24, 0, 0}, + .nonstd = 1, .activate = FB_ACTIVATE_NOW, .height = -1, .width = -1, ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/linux-z90-emuelec-gpio-drivers.patch ================================================ From d2ca448433c91dedc66fdb1d7dd08090519a1262 Mon Sep 17 00:00:00 2001 From: Dongjin Kim <tobetter@gmail.com> Date: Wed, 21 Oct 2020 18:04:44 +0900 Subject: [PATCH] ODROID-COMMON: add drivers GPIO-based Joystick drivers Signed-off-by: Dongjin Kim <tobetter@gmail.com> Change-Id: I0856df4dec6a05f769b0e325ea8f8200f82b8058 --- drivers/input/joystick/gamecon.c | 73 ++++++- drivers/parport/Kconfig | 8 + drivers/parport/Makefile | 3 +- drivers/parport/parport_odroid.c | 330 +++++++++++++++++++++++++++++++ 4 files changed, 412 insertions(+), 2 deletions(-) create mode 100644 drivers/parport/parport_odroid.c diff --git a/drivers/input/joystick/gamecon.c b/drivers/input/joystick/gamecon.c index eae14d512353a..5bdc48a81a046 100644 --- a/drivers/input/joystick/gamecon.c +++ b/drivers/input/joystick/gamecon.c @@ -75,6 +75,7 @@ enum gc_type { GC_PSX, GC_DDR, GC_SNESMOUSE, + GC_GPIO, GC_MAX }; @@ -107,7 +108,7 @@ static const int gc_status_bit[] = { 0x40, 0x80, 0x20, 0x10, 0x08 }; static const char *gc_names[] = { NULL, "SNES pad", "NES pad", "NES FourPort", "Multisystem joystick", "Multisystem 2-button joystick", "N64 controller", "PSX controller", - "PSX DDR controller", "SNES mouse" + "PSX DDR controller", "SNES mouse", "GPIO controller" }; /* @@ -738,6 +739,65 @@ static void gc_psx_process_packet(struct gc *gc) } } +/* + * GPIO support + */ + +#define GC_GPIO_BYTES 12 + +static const short gc_gpio_btn[] = { + BTN_A, BTN_B, BTN_SELECT, BTN_START, BTN_X, BTN_Y, BTN_TL, BTN_TR +}; + +static void gc_gpio_read_packet(struct gc *gc, + int data[GC_GPIO_BYTES]) +{ + int i; + unsigned char val; + unsigned char mask; + unsigned char status_bit[] = { + PARPORT_STATUS_ERROR, + PARPORT_STATUS_SELECT, + PARPORT_STATUS_PAPEROUT, + PARPORT_STATUS_ACK + }; + + val = parport_read_status(gc->pd->port); + for (i = 0; i < 4; i++) + data[i] = (val & status_bit[i]) ? 1 : 0; + + val = parport_read_data(gc->pd->port); + for (mask = 1; i < 12; i++, mask <<= 1) + data[i] = (val & mask) ? 255 : 0; +} + +static void gc_gpio_process_packet(struct gc *gc) +{ + struct gc_pad *pad; + int i; + + for (i = 0; i < GC_MAX_DEVICES; i++) { + pad = &gc->pads[i]; + if (pad->type == GC_GPIO) { + int data[GC_GPIO_BYTES]; + struct input_dev *dev = pad->dev; + int j; + + gc_gpio_read_packet(gc, data); + + input_report_abs(dev, ABS_X, data[2] - data[3]); + input_report_abs(dev, ABS_Y, data[0] - data[1]); + + for (j = 0; j < 8; j++) { + input_report_key(dev, gc_gpio_btn[j], + data[4 + j]); + } + + input_sync(dev); + } + } +} + /* * gc_timer() initiates reads of console pads data. */ @@ -777,6 +837,12 @@ static void gc_timer(unsigned long private) if (gc->pad_count[GC_PSX] || gc->pad_count[GC_DDR]) gc_psx_process_packet(gc); +/* + * GPIO controllers + */ + if (gc->pad_count[GC_GPIO]) + gc_gpio_process_packet(gc); + mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME); } @@ -913,6 +979,11 @@ static int gc_setup_pad(struct gc *gc, int idx, int pad_type) __set_bit(gc_psx_btn[i], input_dev->keybit); break; + + case GC_GPIO: + for (i = 0; i < 8; i++) + __set_bit(gc_gpio_btn[i], input_dev->keybit); + break; } err = input_register_device(pad->dev); diff --git a/drivers/parport/Kconfig b/drivers/parport/Kconfig index 44333bd8f9088..95119230419eb 100644 --- a/drivers/parport/Kconfig +++ b/drivers/parport/Kconfig @@ -159,6 +159,14 @@ config PARPORT_1284 transfer modes. Also say Y if you want device ID information to appear in /proc/sys/dev/parport/*/autoprobe*. It is safe to say N. +config PARPORT_ODROID + tristate "ODROID builtin port" + select PARPORT_NOT_PC + help + Say Y here if you need support for the parallel port hardware on + ODROID-N2/C4 machines. This code is also available as a module + (say M), called parport_odroid. If in doubt, saying N is the safe plan. + config PARPORT_NOT_PC bool diff --git a/drivers/parport/Makefile b/drivers/parport/Makefile index 696b8d4ca8878..4730c1cacaab6 100644 --- a/drivers/parport/Makefile +++ b/drivers/parport/Makefile @@ -18,4 +18,5 @@ obj-$(CONFIG_PARPORT_ATARI) += parport_atari.o obj-$(CONFIG_PARPORT_SUNBPP) += parport_sunbpp.o obj-$(CONFIG_PARPORT_GSC) += parport_gsc.o obj-$(CONFIG_PARPORT_AX88796) += parport_ax88796.o -obj-$(CONFIG_PARPORT_IP32) += parport_ip32.o \ No newline at end of file +obj-$(CONFIG_PARPORT_IP32) += parport_ip32.o +obj-$(CONFIG_PARPORT_ODROID) += parport_odroid.o diff --git a/drivers/parport/parport_odroid.c b/drivers/parport/parport_odroid.c new file mode 100644 index 0000000000000..fe0c326e8cab4 --- /dev/null +++ b/drivers/parport/parport_odroid.c @@ -0,0 +1,330 @@ +/* Low-level parallel port routines for ODROID GPIO + * + * Author: Dongjin Kim <tobetter@gmail.com> + * + */ + +#include <linux/module.h> +#include <linux/init.h> +#include <linux/parport.h> +#include <linux/interrupt.h> +#include <linux/slab.h> +#include <linux/platform_device.h> +#include <linux/gpio/consumer.h> + +#ifdef CONFIG_OF +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/of_gpio.h> +#endif + +struct parport_odroid_private { + int nr_data_gpios; + struct gpio_desc *data_gpios[8]; + char *data_label[8]; + + int nr_status_gpios; + struct gpio_desc *status_gpios[5]; + char *status_label[8]; +}; + +static char *status_label[5] = { + "error", "select", "paperout", "ack", "busy", +}; +static const unsigned char status_mask[] = { + PARPORT_STATUS_ERROR, + PARPORT_STATUS_SELECT, + PARPORT_STATUS_PAPEROUT, + PARPORT_STATUS_ACK, + PARPORT_STATUS_BUSY +}; + +static void odroid_write_data(struct parport *p, unsigned char data) +{ + int i; + unsigned char mask = 1; + struct parport_odroid_private *priv = p->private_data; + + for (i = 0; i < priv->nr_data_gpios; i++, mask <<= 1) + gpiod_direction_output(priv->data_gpios[i], !!(data & mask)); +} + +static unsigned char odroid_read_data(struct parport *p) +{ + int i; + int val; + unsigned char mask = 1; + unsigned char ret = 0; + struct parport_odroid_private *priv = p->private_data; + + for (i = 0; i < priv->nr_data_gpios; i++, mask <<= 1) { + gpiod_direction_input(priv->data_gpios[i]); + val = gpiod_get_value_cansleep(priv->data_gpios[i]); + if (!val) + ret |= mask; + } + + return ret; +} + +static unsigned char control_odroid_to_pc(unsigned char control) +{ + return PARPORT_CONTROL_SELECT | + PARPORT_CONTROL_AUTOFD | PARPORT_CONTROL_STROBE; + /* fake value: interrupt enable, select in, no reset, + no autolf, no strobe - seems to be closest the wiring diagram */ +} + +static void odroid_write_control(struct parport *p, unsigned char control) +{ + /* No implementation possible */ +} + +static unsigned char odroid_read_control( struct parport *p) +{ + return control_odroid_to_pc(0); +} + +static void odroid_init_state(struct pardevice *dev, struct parport_state *s) +{ +} + +static void odroid_save_state(struct parport *p, struct parport_state *s) +{ +} + +static void odroid_restore_state(struct parport *p, struct parport_state *s) +{ +} + +static unsigned char odroid_frob_control(struct parport *p, + unsigned char mask, unsigned char val) +{ + return 0; +} + +static unsigned char odroid_read_status(struct parport *p) +{ + struct parport_odroid_private *priv = p->private_data; + unsigned char status = 0; + int i; + + for (i = 0; i < priv->nr_status_gpios; i++) { + if (gpiod_get_value_cansleep(priv->status_gpios[i])) + status |= status_mask[i]; + } + + return status; +} + +static void odroid_enable_irq(struct parport *p) +{ +} + +static void odroid_disable_irq(struct parport *p) +{ +} + +static void odroid_data_forward(struct parport *p) +{ +} + +static void odroid_data_reverse(struct parport *p) +{ +} + +static struct parport_operations pp_odroid_ops = { + .write_data = odroid_write_data, + .read_data = odroid_read_data, + + .write_control = odroid_write_control, + .read_control = odroid_read_control, + + .init_state = odroid_init_state, + .save_state = odroid_save_state, + .restore_state = odroid_restore_state, + + .frob_control = odroid_frob_control, + .read_status = odroid_read_status, + + .enable_irq = odroid_enable_irq, + .disable_irq = odroid_disable_irq, + + .data_forward = odroid_data_forward, + .data_reverse = odroid_data_reverse, + + .epp_write_data = parport_ieee1284_epp_write_data, + .epp_read_data = parport_ieee1284_epp_read_data, + .epp_write_addr = parport_ieee1284_epp_write_addr, + .epp_read_addr = parport_ieee1284_epp_read_addr, + + .ecp_write_data = parport_ieee1284_ecp_write_data, + .ecp_read_data = parport_ieee1284_ecp_read_data, + .ecp_write_addr = parport_ieee1284_ecp_write_addr, + + .compat_write_data = parport_ieee1284_write_compat, + .nibble_read_data = parport_ieee1284_read_nibble, + .byte_read_data = parport_ieee1284_read_byte, + + .owner = THIS_MODULE, +}; + +static void odroid_free_datas(struct platform_device *pdev) +{ + struct parport *port = platform_get_drvdata(pdev); + struct parport_odroid_private *priv = port->private_data; + int i; + + for (i = 0; i < priv->nr_data_gpios; i++) { + if (priv->data_gpios[i]) + gpiochip_free_own_desc(priv->data_gpios[i]); + } +} + +static void odroid_free_status(struct platform_device *pdev) +{ + struct parport *port = platform_get_drvdata(pdev); + struct parport_odroid_private *priv = port->private_data; + int i; + + for (i = 0; i < priv->nr_data_gpios; i++) { + if (priv->status_gpios[i]) + gpiochip_free_own_desc(priv->status_gpios[i]); + } +} + +static int odroid_parallel_probe(struct platform_device *pdev) +{ + struct parport *p; + struct device_node *np = pdev->dev.of_node; + struct parport_odroid_private *priv; + struct gpio_desc *desc; + char label[64]; + int i; + int err; + + priv = kzalloc(sizeof(struct parport_odroid_private), GFP_KERNEL); + if (!priv) { + printk(KERN_DEBUG "parport_odroid: no memory!\n"); + return -ENOMEM; + } + + priv->nr_data_gpios = of_gpio_named_count(np, "data-gpios"); + if (priv->nr_data_gpios != 8) { + dev_err(&pdev->dev, "parport: invalid data ports"); + err = -EINVAL; + goto err_desc; + } + + for (i = 0; i < priv->nr_data_gpios; i++) { + int gpio = of_get_named_gpio(np, "data-gpios", i); + if (gpio < 0) { + /* FIXME */ + break; + } + + desc = gpio_to_desc(gpio); + + snprintf(label, sizeof(label), "parport:data%d", i); + priv->data_label[i] = kstrdup(label, GFP_KERNEL); + + devm_gpio_request(&pdev->dev, gpio, priv->data_label[i]); + gpiod_direction_input(desc); + gpiod_set_pull(desc, GPIOD_PULL_UP); + + priv->data_gpios[i] = desc; + }; + + priv->nr_status_gpios = of_gpio_named_count(np, "status-gpios"); + if (priv->nr_status_gpios > ARRAY_SIZE(priv->status_gpios)) + priv->nr_status_gpios = ARRAY_SIZE(priv->status_gpios); + + for (i = 0; i < priv->nr_status_gpios; i++) { + int gpio = of_get_named_gpio(np, "status-gpios", i); + + if (gpio < 0) { + err = -EINVAL; + goto err_gpio_status; + } + + desc = gpio_to_desc(gpio); + + snprintf(label, sizeof(label), "parport:%s", status_label[i]); + priv->status_label[i] = kstrdup(label, GFP_KERNEL); + + devm_gpio_request(&pdev->dev, gpio, priv->status_label[i]); + gpiod_direction_input(desc); + gpiod_set_pull(desc, GPIOD_PULL_UP); + + priv->status_gpios[i] = desc; + }; + + p = parport_register_port(0x308, 0, + PARPORT_DMA_NONE, &pp_odroid_ops); + if (!p) { + err = -EINVAL; + goto err_register; + } + + p->private_data = priv; + + parport_announce_port(p); + + platform_set_drvdata(pdev, p); + + return 0; + +err_register: + odroid_free_status(pdev); + +err_gpio_status: + odroid_free_datas(pdev); + +err_desc: + kfree(priv); + return err; +} + +static int odroid_parallel_remove(struct platform_device *pdev) +{ + struct parport *port = platform_get_drvdata(pdev); + struct parport_odroid_private *priv = port->private_data; + + parport_remove_port(port); + parport_put_port(port); + odroid_free_status(pdev); + odroid_free_datas(pdev); + kfree(priv); + + return 0; +} + +#ifdef CONFIG_OF +static const struct of_device_id parport_dt_ids[] = { + { + .compatible = "parport,odroid", + }, + {}, +}; + +MODULE_DEVICE_TABLE(of, parport_dt_ids); +#endif + +static struct platform_driver odroid_parallel_driver = { + .driver = { + .name = "odroid-parallel", +#ifdef CONFIG_OF + .of_match_table = parport_dt_ids, +#endif + }, + .probe = odroid_parallel_probe, + .remove = odroid_parallel_remove, +}; + +module_platform_driver(odroid_parallel_driver); + +MODULE_AUTHOR("Dongjin Kim <tobetter@gmail.com>"); +MODULE_DESCRIPTION("Parport Driver for ODROID GPIO"); +MODULE_SUPPORTED_DEVICE("ODROID GPIO Parallel Port"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:odroid-parallel"); ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/linux-z92-emuelec-gpio-dts.patch ================================================ From de7d91ba65bc83f797d842a1c44c34f8158b9b19 Mon Sep 17 00:00:00 2001 From: Dongjin Kim <tobetter@gmail.com> Date: Fri, 30 Oct 2020 14:05:39 +0900 Subject: [PATCH] ODROID-COMMON: ARM64/dts: add GPIO-based joystick support device tree Signed-off-by: Dongjin Kim <tobetter@gmail.com> Change-Id: I54ebe56b09f5cc66f26718f4486f011fb50dcc0e --- arch/arm64/boot/dts/amlogic/Makefile | 4 ++ .../amlogic/g12b_s922x_odroid_n2_joystick.dts | 41 +++++++++++++++++++ .../g12b_s922x_odroid_n2plus_joystick.dts | 41 +++++++++++++++++++ .../amlogic/sm1_s905x3_odroid_c4_joystick.dts | 41 +++++++++++++++++++ 4 files changed, 127 insertions(+) create mode 100644 arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2_joystick.dts create mode 100644 arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2plus_joystick.dts create mode 100644 arch/arm64/boot/dts/amlogic/sm1_s905x3_odroid_c4_joystick.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index d006c453ac7ff..2a852a303c355 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -57,6 +57,10 @@ dtb-$(CONFIG_ARM64) += coreelec-gxl/gxl_p241_1g.dtb dtb-$(CONFIG_ARM64) += coreelec-gxl/gxl_p241_v2-1g.dtb dtb-$(CONFIG_ARM64) += coreelec-gxl/gxl_p241_1g_lafrite.dtb +dtb-$(CONFIG_ARM64) += g12b_s922x_odroid_n2_joystick.dtb +dtb-$(CONFIG_ARM64) += g12b_s922x_odroid_n2plus_joystick.dtb +dtb-$(CONFIG_ARM64) += sm1_s905x3_odroid_c4_joystick.dtb +dtb-$(CONFIG_ARM64) += g12b_s922x_odroid_n2l_joystick.dtb always := $(dtb-y) subdir-y := $(dts-dirs) clean-files := *.dtb diff --git a/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2_joystick.dts b/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2_joystick.dts new file mode 100644 index 0000000000000..353ad93776acf --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2_joystick.dts @@ -0,0 +1,41 @@ +#include "g12b_s922x_odroid_n2plus.dts" + +/{ + parport0: parport@0 { + compatible = "parport,odroid"; + status = "okay"; + + data-gpios = <&gpio GPIOX_2 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_1 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_8 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_9 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_13 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_16 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_12 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_0 GPIO_ACTIVE_LOW>; + + status-gpios = <&gpio GPIOA_13 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_3 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_4 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_7 GPIO_ACTIVE_LOW>; + }; + + parport1: parport@1 { + compatible = "parport,odroid"; + status = "okay"; + + data-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_LOW>, + <&gpio GPIOA_15 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_6 GPIO_ACTIVE_LOW>, + <&gpio GPIOA_14 GPIO_ACTIVE_LOW>, + <&gpio GPIOA_4 GPIO_ACTIVE_LOW>, + <&gpio GPIOA_12 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_10 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_19 GPIO_ACTIVE_LOW>; + + status-gpios = <&gpio GPIOX_11 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_14 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_15 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_5 GPIO_ACTIVE_LOW>; + }; +}; --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2l_joystick.dts @@ -0,0 +1,41 @@ +#include "g12b_s922x_odroid_n2l.dts" + +/{ + parport0: parport@0 { + compatible = "parport,odroid"; + status = "okay"; + + data-gpios = <&gpio GPIOX_2 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_1 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_8 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_9 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_13 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_16 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_12 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_0 GPIO_ACTIVE_LOW>; + + status-gpios = <&gpio GPIOA_13 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_3 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_4 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_7 GPIO_ACTIVE_LOW>; + }; + + parport1: parport@1 { + compatible = "parport,odroid"; + status = "okay"; + + data-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_LOW>, + <&gpio GPIOA_15 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_6 GPIO_ACTIVE_LOW>, + <&gpio GPIOA_14 GPIO_ACTIVE_LOW>, + <&gpio GPIOA_4 GPIO_ACTIVE_LOW>, + <&gpio GPIOA_12 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_10 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_19 GPIO_ACTIVE_LOW>; + + status-gpios = <&gpio GPIOX_11 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_14 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_15 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_5 GPIO_ACTIVE_LOW>; + }; +}; diff --git a/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2plus_joystick.dts b/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2plus_joystick.dts new file mode 100644 index 0000000000000..353ad93776acf --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2plus_joystick.dts @@ -0,0 +1,41 @@ +#include "g12b_s922x_odroid_n2plus.dts" + +/{ + parport0: parport@0 { + compatible = "parport,odroid"; + status = "okay"; + + data-gpios = <&gpio GPIOX_2 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_1 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_8 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_9 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_13 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_16 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_12 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_0 GPIO_ACTIVE_LOW>; + + status-gpios = <&gpio GPIOA_13 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_3 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_4 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_7 GPIO_ACTIVE_LOW>; + }; + + parport1: parport@1 { + compatible = "parport,odroid"; + status = "okay"; + + data-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_LOW>, + <&gpio GPIOA_15 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_6 GPIO_ACTIVE_LOW>, + <&gpio GPIOA_14 GPIO_ACTIVE_LOW>, + <&gpio GPIOA_4 GPIO_ACTIVE_LOW>, + <&gpio GPIOA_12 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_10 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_19 GPIO_ACTIVE_LOW>; + + status-gpios = <&gpio GPIOX_11 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_14 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_15 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_5 GPIO_ACTIVE_LOW>; + }; +}; diff --git a/arch/arm64/boot/dts/amlogic/sm1_s905x3_odroid_c4_joystick.dts b/arch/arm64/boot/dts/amlogic/sm1_s905x3_odroid_c4_joystick.dts new file mode 100644 index 0000000000000..6246ea3111656 --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/sm1_s905x3_odroid_c4_joystick.dts @@ -0,0 +1,41 @@ +#include "sm1_s905x3_odroid_c4.dts" + +/{ + parport0: parport@0 { + compatible = "parport,odroid"; + status = "okay"; + + data-gpios = <&gpio GPIOX_2 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_1 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_8 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_9 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_13 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_16 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_12 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_0 GPIO_ACTIVE_LOW>; + + status-gpios = <&gpio GPIOX_5 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_3 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_4 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_7 GPIO_ACTIVE_LOW>; + }; + + parport1: parport@1 { + compatible = "parport,odroid"; + status = "okay"; + + data-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_LOW>, + <&gpio GPIOA_15 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_19 GPIO_ACTIVE_LOW>, + <&gpio GPIOA_14 GPIO_ACTIVE_LOW>, + <&gpio GPIOH_6 GPIO_ACTIVE_LOW>, + <&gpio GPIOH_7 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_10 GPIO_ACTIVE_LOW>, + <&gpio GPIOH_5 GPIO_ACTIVE_LOW>; + + status-gpios = <&gpio GPIOX_11 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_14 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_15 GPIO_ACTIVE_LOW>, + <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; + }; +}; ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/linux-z93-emuelec-refresh-rate-fix-1024x768p60hz.patch ================================================ From eb2e483ab16c0399071aa3114a99bd803dc101d4 Mon Sep 17 00:00:00 2001 From: Dongjin Kim <tobetter@gmail.com> Date: Sat, 9 Jan 2021 18:59:03 +0900 Subject: [PATCH] media/hdmitx: improve 1024x768p60hz support This patch will fix the issue of distrosed picture at 60.xHz with certain display hardwares. Signed-off-by: Dongjin Kim <tobetter@gmail.com> --- .../vout/hdmitx/hdmi_tx_20/hw/hdmi_tx_hw.c | 16 +++++ .../media/vout/hdmitx/hdmi_tx_20/hw/hw_clk.c | 2 +- .../media/vout/hdmitx/hdmi_tx_20/hw/hw_g12a.c | 68 ++++++++++++++++++- 3 files changed, 84 insertions(+), 2 deletions(-) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hdmi_tx_hw.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hdmi_tx_hw.c index beae6aea4c9b..4c34abcca8b9 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hdmi_tx_hw.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hdmi_tx_hw.c @@ -1705,6 +1705,22 @@ static void hdmi_tvenc_set(struct hdmitx_vidpara *param) SOF_LINES = 28; TOTAL_FRAMES = 4; break; + case HDMIV_1024x768p60hz: + INTERLACE_MODE = 0; + PIXEL_REPEAT_VENC = 0; + PIXEL_REPEAT_HDMI = 0; + ACTIVE_PIXELS = (1024*(1+PIXEL_REPEAT_HDMI)); + ACTIVE_LINES = (768/(1+INTERLACE_MODE)); + LINES_F0 = 806; + LINES_F1 = 806; + FRONT_PORCH = 24; + HSYNC_PIXELS = 136; + BACK_PORCH = 160; + EOF_LINES = 3; + VSYNC_LINES = 6; + SOF_LINES = 29; + TOTAL_FRAMES = 4; + break; default: break; } diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hw_g12a.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hw_g12a.c index e46b964491b8..9b24cc61f3f9 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hw_g12a.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hw_g12a.c @@ -192,6 +192,29 @@ static void set_hpll_hclk_dongle_5940m(void) pr_info("HPLL: 0x%x\n", hd_read_reg(P_HHI_HDMI_PLL_CNTL0)); } +#define XTAL_FREQ 24000 +#define HDMI_FRAC_MAX_G12A 131072 + +static unsigned int get_g12a_pll_get_frac(unsigned int m, unsigned int pll_freq) +{ + unsigned int parent_freq = XTAL_FREQ; + unsigned int frac_max = HDMI_FRAC_MAX_G12A; + unsigned int frac_m; + unsigned int frac; + + if (pll_freq / m == parent_freq && + pll_freq % m == 0) + return 0; + + frac = div_u64((u64)pll_freq * (u64)frac_max, parent_freq); + frac_m = m * frac_max; + if (frac_m > frac) + return frac_max; + frac -= frac_m; + + return min((u16)frac, (u16)(frac_max - 1)); +} + void set_g12a_hpll_clk_out(unsigned int frac_rate, unsigned int clk) { struct hdmitx_dev *hdev = get_hdmitx_device(); @@ -366,7 +389,50 @@ void set_g12a_hpll_clk_out(unsigned int frac_rate, unsigned int clk) pr_info("HPLL: 0x%x\n", hd_read_reg(P_HHI_HDMI_PLL_CNTL0)); break; default: - pr_info("error hpll clk: %d\n", clk); + { + unsigned int m, m1, m2; + unsigned int ret; + unsigned int frac; + + /* calculate m */ + m = clk / XTAL_FREQ; + m &= 0xff; + hd_write_reg(P_HHI_HDMI_PLL_CNTL0, (m | 0x3b000400)); + pr_info("m1 0x%x, m2 0x%x, m 0x%x\n", m1, m2, m); + + /* calculate frac */ + frac = get_g12a_pll_get_frac(m, clk); + pr_info("m 0x%x, frac 0x%x\n", m, frac); + hd_write_reg(P_HHI_HDMI_PLL_CNTL1, frac); + hd_write_reg(P_HHI_HDMI_PLL_CNTL2, 0x00000000); + + if (m >= 0xf7) { + if (frac < 0x10000) { + hd_write_reg(P_HHI_HDMI_PLL_CNTL3, 0x6a685c00); + hd_write_reg(P_HHI_HDMI_PLL_CNTL4, 0x11551293); + } else { + hd_write_reg(P_HHI_HDMI_PLL_CNTL3, 0xea68dc00); + hd_write_reg(P_HHI_HDMI_PLL_CNTL4, 0x65771290); + } + hd_write_reg(P_HHI_HDMI_PLL_CNTL5, 0x39270000); + hd_write_reg(P_HHI_HDMI_PLL_CNTL6, 0x55540000); + } else { + hd_write_reg(P_HHI_HDMI_PLL_CNTL3, 0x0a691c00); + hd_write_reg(P_HHI_HDMI_PLL_CNTL4, 0x33771290); + hd_write_reg(P_HHI_HDMI_PLL_CNTL5, 0x39270000); + hd_write_reg(P_HHI_HDMI_PLL_CNTL6, 0x50540000); + } + + hd_set_reg_bits(P_HHI_HDMI_PLL_CNTL0, 0x0, 29, 1); + WAIT_FOR_PLL_LOCKED(P_HHI_HDMI_PLL_CNTL0); + pr_info("HPLL: 0x%x\n", hd_read_reg(P_HHI_HDMI_PLL_CNTL0)); + + ret = (((hd_read_reg(P_HHI_HDMI_PLL_CNTL0) >> 30) & 0x3) == 0x3); + if (ret) + pr_info("[%s] HPLL set OK!\n", __func__); + else + pr_info("[%s] Error! Check HPLL track!\n", __func__); + } break; } } -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/linux-z99-emuelec-bluetoothfix_mediatek.patch ================================================ --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -64,6 +64,7 @@ #define BTUSB_BCM2045 0x40000 #define BTUSB_IFNUM_2 0x80000 #define BTUSB_CW6622 0x100000 +#define BTUSB_MEDIATEK 0x200000 static const struct usb_device_id btusb_table[] = { /* Generic Bluetooth USB device */ @@ -80,7 +81,7 @@ .driver_info = BTUSB_BCM_APPLE | BTUSB_IFNUM_2 }, /* MediaTek MT76x0E */ - { USB_DEVICE(0x0e8d, 0x763f) }, + { USB_DEVICE(0x0e8d, 0x763f), .driver_info = BTUSB_MEDIATEK }, /* Broadcom SoftSailing reporting vendor specific */ { USB_DEVICE(0x0a5c, 0x21e1) }, @@ -2917,6 +2918,10 @@ set_bit(HCI_QUIRK_FIXUP_INQUIRY_MODE, &hdev->quirks); set_bit(HCI_QUIRK_BROKEN_LOCAL_COMMANDS, &hdev->quirks); } + + if (id->driver_info & BTUSB_MEDIATEK) { + set_bit(HCI_QUIRK_BROKEN_LOCAL_COMMANDS, &hdev->quirks); + } if (id->driver_info & BTUSB_INTEL_BOOT) { hdev->manufacturer = 2; ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng/patches/linux/linux-z99-emuelec-gpio-fix1.patch ================================================ From 0ee3dd16e9a84a6b1a99cfc1ba68c8e7dc7545d9 Mon Sep 17 00:00:00 2001 From: Dongjin Kim <tobetter@gmail.com> Date: Tue, 10 Nov 2020 03:13:06 +0900 Subject: [PATCH] ODROID-N2: arm64/dts: fix pinctrl conflict of GPIOA_13 for SPDIF Signed-off-by: Dongjin Kim <tobetter@gmail.com> --- .../boot/dts/amlogic/g12b_s922x_odroid_n2_joystick.dts | 9 +++++++++ .../dts/amlogic/g12b_s922x_odroid_n2plus_joystick.dts | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2_joystick.dts b/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2_joystick.dts index 353ad93776acf..9c46f148b11c6 100644 --- a/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2_joystick.dts +++ b/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2_joystick.dts @@ -39,3 +39,12 @@ <&gpio GPIOX_5 GPIO_ACTIVE_LOW>; }; }; + +&pinctrl_periphs { + spdifout: spdifout { + mux {/* GPIOA_11 */ + groups = "spdif_out_a11"; + function = "spdif_out"; + }; + }; +}; diff --git a/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2plus_joystick.dts b/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2plus_joystick.dts index 353ad93776acf..9c46f148b11c6 100644 --- a/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2plus_joystick.dts +++ b/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2plus_joystick.dts @@ -39,3 +39,12 @@ <&gpio GPIOX_5 GPIO_ACTIVE_LOW>; }; }; + +&pinctrl_periphs { + spdifout: spdifout { + mux {/* GPIOA_11 */ + groups = "spdif_out_a11"; + function = "spdif_out"; + }; + }; +}; diff --git a/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2l_joystick.dts b/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2l_joystick.dts index 353ad93776acf..9c46f148b11c6 100644 --- a/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2l_joystick.dts +++ b/arch/arm64/boot/dts/amlogic/g12b_s922x_odroid_n2l_joystick.dts @@ -39,3 +39,12 @@ <&gpio GPIOX_5 GPIO_ACTIVE_LOW>; }; }; + +&pinctrl_periphs { + spdifout: spdifout { + mux {/* GPIOA_11 */ + groups = "spdif_out_a11"; + function = "spdif_out"; + }; + }; +}; ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/bootloader/canupdate.sh ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.tv) # detect legacy kernel installs and abort to prevent upgrades if [[ "$(uname -r)" = "3.14."* ]]; then echo "Update from 3.14 is not supported!" sleep 10 exit 1 fi DEVICE_OLD=$(echo "${1}" | cut -d. -f1) DEVICE_NEW=$(echo "${2}" | cut -d. -f1) # allow upgrades between aarch64 and arm images on same device if [ "${DEVICE_OLD}" = "${DEVICE_NEW}" ]; then exit 0 else exit 1 fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/bootloader/config.ini ================================================ #------------------------------------------------------------------------------------------------------ # # config.ini # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # Console Setup # # consoleopt='console=ttyS0,115200 console=tty0 no_console_suspend' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # CPU Frequency Control # # WARNING!!! WARNING!!! WARNING!!! # Before changing anything here please read the wiki entry at: # https://wiki.odroid.com/odroid-n2/application_note/software/set_cpu_freq # # max_freq_a73='1800' # max_freq_a53='1896' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # HDMI CEC Control # Set by CoreELEC Settings # # cec_func_config='7f' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # HDMI CEC OSD Name # Set by CoreELEC Settings # # cec_osd_name='CoreELEC' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # IR setup # Setup a custom keycode to wake the N2/C4 from suspend or poweroff # You can stop kodi and eventlircd and use "ir-keytable -u" to obtain a compatible u-boot # IR keycode # This setting will require a injected bl301 blob. # # remotewakeup='0x31ce4db2' # # decode_type can be one of the following: # NEC='0x0', DUOKAN='0x1', TOSHIBA='0x2', RCA='0x3', RC5='0x4', RC6A='0x5', NEC_TOSHIBA_2IN1='0x6', # NEC_RCA_2IN1='0x7', RCMM='0x8', NEC_RC5_2IN1='0x9', NEC_RC5_2IN1='0xa', RC6='0xb' # This setting will require a injected bl301 blob. # # decode_type='0x0' # NEC # # remote power key mask: # Some IR protocols implement a toggle bit, this can be ignored by the "and" mask: # RC5='0x37ff', RC6='0x1effff', RC6A='0xffff7fff' # This setting will require a injected bl301 blob. # # remotewakeupmask='0xffffffff' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # WOL Setting, 0=off/1=on # Set by CoreELEC Settings # # wol=1 # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # Power Off and Wake Up using GPIO Key Button # Valid options for Odroid N2/C4 are 476,477,478,479,480,481,483,484,485,486,487,488,489,490,491,492 # Valid option for Khadas VIM3 is 503 # # gpiopower=476 # (pin 16 of J2 header) #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # USB specific options # # usbopts='usb-xhci.tablesize=2' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # USB Power Control # Set by CoreELEC Settings # # usbpower=0 # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # HDMI custom mode # You can use this setting to set a custom video mode # modeline "horpixels,verpixels,pixel_clock,hor_freq,ver_freq,hdisp,hsyncstart,hsyncend,htotal,vdisp, # vsyncstart,vsyncend,vtotal,hsync_polarity,vsync_polarity,progress_mode" # # Example for 1920x1080p@60hz # modeline='1920,1080,148500,67500,60,1920,2008,2052,2200,1080,1084,1088,1125,1,1,1' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # VOUT mode # You can use this setting to set a specific video mode at boot. # # vout='1080p60hz' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # Fractional Refresh Rate # You can use this setting to set a fractional refresh rate. So for example if vout mode it set to # 1080p60hz then setting this to 1 will make the refresh rate switch to 59.97hz instead of the modes # default of 60hz. In this example setting it to 0 will keep the modes default of 60hz. # # frac_rate_policy='0' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # Busybox console keyboard layout # Set by CoreELEC Settings # # keymap='uk' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # CoreELEC Developer Options # Valid options are: textmode debugging progress nofsck nosplash noram overlay quiet ssh # # coreelec='quiet' # #------------------------------------------------------------------------------------------------------ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/bootloader/dtb.conf ================================================ <dtb> <multidtb name="g12b_s922x_ugoos_am6.dtb" subdevice=""> <file>g12b_s922x_ugoos_am6_rev_a_2g.dtb</file> <file>g12b_s922x_ugoos_am6_rev_a_4g.dtb</file> <file>g12b_s922x_ugoos_am6_2g.dtb</file> <file>g12b_s922x_ugoos_am6_4g.dtb</file> </multidtb> <multidtb name="g12b_s922x_ugoos_am6b.dtb" subdevice=""> <file>g12b_s922x_ugoos_am6b_rev_a_2g.dtb</file> <file>g12b_s922x_ugoos_am6b_rev_a_4g.dtb</file> <file>g12b_s922x_ugoos_am6b_2g.dtb</file> <file>g12b_s922x_ugoos_am6b_4g.dtb</file> </multidtb> </dtb> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/bootloader/dtb.xml ================================================ <?xml version="1.0"?> <dtb-settings version="0"> <sys_led status="on" version="0"> <sys_led_on name="on"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>default-on</value> </cmd> </sys_led_on> <sys_led_heartbeat name="heartbeat"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>heartbeat</value> </cmd> </sys_led_heartbeat> <sys_led_rc_feedback name="rc feedback"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>rc-feedback</value> </cmd> </sys_led_rc_feedback> <sys_led_sd name="sd"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>sd</value> </cmd> </sys_led_sd> <sys_led_emmc name="emmc"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>emmc</value> </cmd> </sys_led_emmc> <sys_led_off name="off"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>none</value> </cmd> </sys_led_off> </sys_led> <red_led status="off" version="0"> <red_led_on name="on"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>default-on</value> </cmd> </red_led_on> <red_led_heartbeat name="heartbeat"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>heartbeat</value> </cmd> </red_led_heartbeat> <red_led_rc_feedback name="rc feedback"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>rc-feedback</value> </cmd> </red_led_rc_feedback> <red_led_sd name="sd"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>sd</value> </cmd> </red_led_sd> <red_led_emmc name="emmc"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>emmc</value> </cmd> </red_led_emmc> <red_led_off name="off"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>none</value> </cmd> </red_led_off> </red_led> <green_led status="off" version="0"> <green_led_on name="on"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>default-on</value> </cmd> </green_led_on> <green_led_heartbeat name="heartbeat"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>heartbeat</value> </cmd> </green_led_heartbeat> <green_led_rc_feedback name="rc feedback"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>rc-feedback</value> </cmd> </green_led_rc_feedback> <green_led_sd name="sd"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>sd</value> </cmd> </green_led_sd> <green_led_emmc name="emmc"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>emmc</value> </cmd> </green_led_emmc> <green_led_off name="off"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>none</value> </cmd> </green_led_off> </green_led> <remote_type status="NEC" version="0"> <remote_type_nec name="NEC"> <cmd path="/meson-remote protocol" type="i" > <value>1</value> </cmd> </remote_type_nec> <remote_type_legacy_nec name="LEGACY NEC"> <cmd path="/meson-remote protocol" type="i" > <value>255</value> </cmd> </remote_type_legacy_nec> <remote_type_duokan name="DUOKAN"> <cmd path="/meson-remote protocol" type="i" > <value>2</value> </cmd> </remote_type_duokan> <remote_type_xmp_1 name="XMP_1"> <cmd path="/meson-remote protocol" type="i" > <value>3</value> </cmd> </remote_type_xmp_1> <remote_type_rc5 name="RC5"> <cmd path="/meson-remote protocol" type="i" > <value>4</value> </cmd> </remote_type_rc5> <remote_type_rc6 name="RC6"> <cmd path="/meson-remote protocol" type="i" > <value>5</value> </cmd> </remote_type_rc6> <remote_type_toshiba name="TOSHIBA"> <cmd path="/meson-remote protocol" type="i" > <value>6</value> </cmd> </remote_type_toshiba> <remote_type_rca name="RCA"> <cmd path="/meson-remote protocol" type="i" > <value>8</value> </cmd> </remote_type_rca> </remote_type> <emmc status="HS200" version="0"> <high_speed name="HS200,HS400"> <cmd path="/emmc/emmc caps2" type="s" > <value>MMC_CAP2_HS200</value> <value>MMC_CAP2_HS400</value> </cmd> </high_speed> <normal_speed name="HS200"> <cmd path="/emmc/emmc caps2" type="s" > <value>MMC_CAP2_HS200</value> </cmd> </normal_speed> </emmc> <slowsdio status="normal" version="0"> <slow_sdio name="slow"> <cmd path="/sdio/sdio f_max" type="u" > <value>170000000</value> </cmd> </slow_sdio> <normal_sdio name="normal"> <cmd path="/sdio/sdio f_max" type="u" > <value>200000000</value> </cmd> </normal_sdio> </slowsdio> </dtb-settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/bootloader/mkbootimg ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) DTBIMG_PATH="arch/$TARGET_KERNEL_ARCH/boot" DTB_PATH="${DTBIMG_PATH}/dts/amlogic" ANDROID_BOOTIMG_SECOND="" SUBDEVICES+=" Generic" for device in $SUBDEVICES; do DTB_BLOBS_PATH=${DTB_PATH}/${device} mkdir -p ${DTB_BLOBS_PATH} if [ "$device" = "Generic" ]; then for dtblob in $KERNEL_UBOOT_EXTRA_TARGET; do cp ${DTB_PATH}/$dtblob ${DTB_BLOBS_PATH} 2>/dev/null || : done else MULTIDTB_BLOB="" find_file_path bootloader/dtb.conf MULTIDTB_CONF="${FOUND_PATH}" if [ -f ${MULTIDTB_CONF} ]; then multidtb_cnt=$(xmlstarlet sel -t -c "count(//dtb/multidtb)" ${MULTIDTB_CONF}) cnt_m=1 while [ $cnt_m -le $multidtb_cnt ]; do multidtb=$(xmlstarlet sel -t -v "//dtb/multidtb[$cnt_m]/@name" ${MULTIDTB_CONF}) || : subdevice=$(xmlstarlet sel -t -v "//dtb/multidtb[$cnt_m]/@subdevice" ${MULTIDTB_CONF}) || : if [ "$device" = "$subdevice" ]; then echo "Device tree multidtb subdevice: ${device}, ${multidtb%%.*}.dtb" MULTIDTB_BLOB="${multidtb%%.*}.dtb" break fi cnt_m=$((cnt_m+1)) done fi if [ -n "${MULTIDTB_BLOB}" ]; then cp ${DTB_PATH}/${MULTIDTB_BLOB} ${DTB_BLOBS_PATH}/${device}_dtb.dtb 2>/dev/null || : else cp ${DTB_PATH}/*${device,,}.dtb ${DTB_BLOBS_PATH} 2>/dev/null || : fi fi DTB_BLOBS=($(ls ${DTB_BLOBS_PATH}/*.dtb 2>/dev/null || true)) DTB_BLOBS_COUNT=${#DTB_BLOBS[@]} DTB_BLOB_OUTPUT=${DTBIMG_PATH}/${device}_dtb.img if [ "$DTB_BLOBS_COUNT" -gt 1 ]; then $TOOLCHAIN/bin/dtbTool -c -o ${DTB_BLOB_OUTPUT} -p scripts/dtc/ ${DTB_BLOBS_PATH} elif [ "$DTB_BLOBS_COUNT" -eq 1 ]; then cp -PR $DTB_BLOBS $DTB_BLOB_OUTPUT fi done if [ -f ${DTBIMG_PATH}/Generic_dtb.img ]; then ANDROID_BOOTIMG_SECOND="--second ${DTBIMG_PATH}/Generic_dtb.img" fi LDFLAGS="" mkbootimg --kernel arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET --ramdisk $BUILD/image/initramfs.cpio \ $ANDROID_BOOTIMG_SECOND $ANDROID_BOOTIMG_OPTIONS --output arch/$TARGET_KERNEL_ARCH/boot/boot.img ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/bootloader/mkimage ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) # copy amlogic autoscript files to part1 if needed for f in $RELEASE_DIR/3rdparty/bootloader/*autoscript; do [ -e "$f" ] && mcopy "$f" :: done if [ -f $RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_cfgload ]; then mcopy -s $RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_cfgload "::/cfgload" fi # copy device trees to part1 for dtb in $RELEASE_DIR/3rdparty/bootloader/device_trees $RELEASE_DIR/3rdparty/bootloader/*.dtb $RELEASE_DIR/3rdparty/bootloader/dtb.img ; do [ -e "$dtb" ] && mcopy -s "$dtb" :: done if [ -f "$RELEASE_DIR/3rdparty/bootloader/config.ini" ]; then mcopy $RELEASE_DIR/3rdparty/bootloader/config.ini :: fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/bootloader/release ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) mkdir -p $RELEASE_DIR/3rdparty/bootloader cp -a $INSTALL/usr/share/bootloader/* $RELEASE_DIR/3rdparty/bootloader ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/bootloader/scripts/Generic_cfgload.src ================================================ echo "Using device ${device}, number ${devnr}, partition ${partnr}, CoreELEC on eMMC: ${ce_on_emmc}" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv native_4k_gui "0" setenv rootopt "BOOT_IMAGE=kernel.img boot=LABEL=COREELEC disk=LABEL=STORAGE" if test "${ce_on_emmc}" = "yes"; then setenv rootopt "BOOT_IMAGE=kernel.img boot=LABEL=CE_FLASH disk=FOLDER=/dev/CE_STORAGE"; fi if fatload ${device} ${devnr}:${partnr} ${loadaddr} resolution.ini; then env import -t ${loadaddr} ${filesize}; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if fatload ${device} ${devnr}:${partnr} ${loadaddr} config.ini; then env import -t ${loadaddr} ${filesize}; fi setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a73}" != ""; then setenv max_freq_a73 "max_freq_a73=${max_freq_a73}"; fi if test "${modeline}" != ""; then setenv cmode "modeline=${modeline}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi if test "${keymap}" != ""; then setenv consoleopt "${consoleopt} keymap=${keymap}"; fi if test "${loadaddr_kernel}" != ""; then setenv loadaddr "${loadaddr_kernel}"; fi setenv displayopt "vout=${vout},en logo=osd0,loaded,${fb_addr} frac_rate_policy=${frac_rate_policy} native_4k_gui=${native_4k_gui} hdmitx=${hdmitx} hdr_policy=1" setenv initargs "${rootopt} ${consoleopt} ${max_freq_a53} ${max_freq_a73} ${wol} ${cec} ${gpiopower} ${usbopts} ${cmode}" setenv bootargs "${bootargs} ${initargs} ${displayopt} ${coreelec}" fatload ${device} ${devnr}:${partnr} ${loadaddr} kernel.img fatload ${device} ${devnr}:${partnr} ${dtb_mem_addr} dtb.img bootm ${loadaddr} bootm start bootm loados bootm prep bootm go ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/bootloader/scripts/aml_autoscript.src ================================================ defenv setenv bootfromnand 0 setenv upgrade_step 2 setenv ce_on_emmc "no" setenv sddtb 'if fatload mmc 0 ${dtb_mem_addr} dtb.img; then else store dtb read $dtb_mem_addr; fi' setenv usbdtb 'if fatload usb 0 ${dtb_mem_addr} dtb.img; then else store dtb read $dtb_mem_addr; fi' setenv cfgloadsd 'if fatload mmc 0:1 ${loadaddr} cfgload; then setenv device mmc; setenv devnr 0; setenv partnr 1; autoscr ${loadaddr}; fi' setenv cfgloadusb 'if fatload usb 0:1 ${loadaddr} cfgload; then setenv device usb; setenv devnr 0; setenv partnr 1; autoscr ${loadaddr}; fi' setenv cfgloademmc 'for p in 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18; do if fatload mmc 1:${p} ${loadaddr} cfgload; then setenv device mmc; setenv devnr 1; setenv partnr ${p}; setenv ce_on_emmc "yes"; autoscr ${loadaddr}; fi; done;' setenv bootfromsd 'if mmcinfo; then run cfgloadsd; if fatload mmc 0 ${loadaddr} kernel.img; then run sddtb; setenv bootargs ${bootargs} bootfromsd; bootm; fi; fi' setenv bootfromusb 'usb start 0; run cfgloadusb; if fatload usb 0 ${loadaddr} kernel.img; then run usbdtb; setenv bootargs ${bootargs} bootfromusb; bootm; fi' setenv bootfromemmc 'run cfgloademmc' setenv bootcmd 'if test ${bootfromnand} = 1; then setenv bootfromnand 0; saveenv; else run bootfromsd; run bootfromusb; run bootfromemmc; fi; run storeboot' saveenv run storeargs run bootfromsd run bootfromusb run bootfromemmc ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/bootloader/update.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) # use chroot because of running xmlstarlet and other binaries build with newer glibc if [ "${SYSTEM_ROOT}" = "/update" ]; then # run from init # unset SYSTEM_ROOT because we are chroot-ing and /update become new / anyway unset SYSTEM_ROOT # mount some folders from old root mount -o bind /tmp /update/var for folder in proc sys dev tmp run flash storage; do [ -d /${folder} ] && mount -o bind /${folder} /update/${folder} done /usr/bin/busybox chroot /update /usr/share/bootloader/update.sh # umount folders for folder in proc sys dev tmp run flash storage; do [ -d /${folder} ] && umount /update/${folder} done umount /update/var # set it back just in case SYSTEM_ROOT="/update" exit 0 fi # change to writable folder cd /tmp [ -z "$BOOT_ROOT" ] && BOOT_ROOT="/flash" [ -z "$BOOT_PART" ] && BOOT_PART=$(df "$BOOT_ROOT" | tail -1 | awk {' print $1 '}) if [ -z "$BOOT_DISK" ]; then case $BOOT_PART in /dev/sd[a-z][0-9]*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,[0-9]*,,g") ;; /dev/mmcblk*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,p[0-9]*,,g") ;; esac fi mount -o rw,remount $BOOT_ROOT DT_ID="" SUBDEVICE="" for arg in $(cat /proc/cmdline); do case $arg in boot=*) boot="${arg#*=}" case $boot in /dev/mmc*) BOOT_UUID="$(blkid $boot | sed 's/.* UUID="//;s/".*//g')" ;; UUID=*|LABEL=*) BOOT_UUID="$(blkid | sed 's/"//g' | grep -m 1 -i " $boot " | sed 's/.* UUID=//;s/ .*//g')" ;; FOLDER=*) BOOT_UUID="$(blkid ${boot#*=} | sed 's/.* UUID="//;s/".*//g')" ;; esac DT_ID=$(dtname) MIGRATE_DTB="" if [ -n "$DT_ID" ]; then SUBDEVICE="Generic" # modify DT_ID, SUBDEVICE and MIGRATE_DTB by dtb.conf [ -f /usr/bin/convert_dtname ] && . /usr/bin/convert_dtname $DT_ID fi UPDATE_DTB_SOURCE="/usr/share/bootloader/device_trees/$DT_ID.dtb" if [ -n "$DT_ID" -a -f "$UPDATE_DTB_SOURCE" ]; then echo "Updating device tree with $DT_ID.dtb..." case $BOOT_PART in /dev/coreelec) dd if=/dev/zero of=/dev/dtb bs=256k count=1 status=none dd if="$UPDATE_DTB_SOURCE" of=/dev/dtb bs=256k status=none rm -f "$BOOT_ROOT/dtb.img" # this should not exist, remove if it does ;; *) cp -f "$UPDATE_DTB_SOURCE" "$BOOT_ROOT/dtb.img" ;; esac [ -n "$MIGRATE_DTB" ] && eval $MIGRATE_DTB fi for all_dtb in /flash/*.dtb ; do if [ -f $all_dtb ]; then dtb=$(basename $all_dtb) if [ -f /usr/share/bootloader/$dtb ]; then echo "Updating $dtb..." cp -p /usr/share/bootloader/$dtb $BOOT_ROOT fi fi done ;; disk=*) disk="${arg#*=}" case $disk in /dev/mmc*) DISK_UUID="$(blkid $disk | sed 's/.* UUID="//;s/".*//g')" ;; UUID=*|LABEL=*) DISK_UUID="$(blkid | sed 's/"//g' | grep -m 1 -i " $disk " | sed 's/.* UUID=//;s/ .*//g')" ;; FOLDER=*) DISK_UUID="$(blkid ${disk#*=} | sed 's/.* UUID="//;s/".*//g')" ;; esac ;; esac done if [ -d $BOOT_ROOT/device_trees ]; then echo "Updating device_trees folder..." rm $BOOT_ROOT/device_trees/*.dtb cp -p /usr/share/bootloader/device_trees/*.dtb $BOOT_ROOT/device_trees/ fi if [ -f /usr/share/bootloader/config.ini ]; then if [ ! -f $BOOT_ROOT/config.ini ]; then echo "Creating config.ini..." cp -p /usr/share/bootloader/config.ini $BOOT_ROOT/config.ini fi fi if [ -f $BOOT_ROOT/dtb.xml ]; then if [ -f /usr/lib/coreelec/dtb-xml ]; then echo "Updating dtb.img by dtb.xml..." /usr/lib/coreelec/dtb-xml fi fi if [ -f $BOOT_ROOT/aml_autoscript ]; then if [ -f /usr/share/bootloader/aml_autoscript ]; then echo "Updating aml_autoscript..." cp -p /usr/share/bootloader/aml_autoscript $BOOT_ROOT if [ -e /dev/env ]; then mkdir -p /var/lock dd if=$BOOT_ROOT/aml_autoscript bs=72 skip=1 status=none | \ while read line; do cmd=$(echo $line | sed -n "s|^setenv \(.*\)|fw_setenv -c /etc/fw_env.config \1|gp") [ -n "$cmd" ] && eval $cmd done fi fi if [ -f /usr/share/bootloader/${SUBDEVICE}_cfgload ]; then echo "Updating cfgload..." cp -p /usr/share/bootloader/${SUBDEVICE}_cfgload $BOOT_ROOT/cfgload fi /usr/lib/coreelec/check-bl301 if [ ${?} = 1 ]; then echo "Found custom CoreELEC BL301, running inject_bl301 tool..." inject_bl301 -Y &>/dev/null fi fi mount -o ro,remount $BOOT_ROOT # Leave a hint that we just did an update echo "UPDATE" > /storage/.config/boot.hint ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/filesystem/usr/lib/coreelec/smp-affinity.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) SMP="../smp_affinity" MESONIR="`find /proc/irq/ -name ir-meson`" ETH0="`find /proc/irq/ -name eth0`" VDEC0="`find /proc/irq/ -name vdec-0`" VDEC1="`find /proc/irq/ -name vdec-1`" PREDI="`find /proc/irq/ -name pre_di`" AFIFO0="`find /proc/irq/ -name afifo0`" AOCEC="`find /proc/irq/ -name hdmi_aocec*`" USB3="`find /proc/irq/ -name xhci-hcd:usb1`" IRQ="$AOCEC $ETH0 $USB3 $VDEC0 $VDEC1 $AFIFO0 $MESONIR $PREDI" cpu=1 for i in $IRQ; do if [ -f "$i/$SMP" ];then [ ! -d "/sys/devices/system/cpu/cpu$cpu" ] && cpu=1 aff=$((1 << $cpu)) haff=`printf '%x\n' $aff` echo "echo $haff > $i/$SMP" echo $haff > $i/$SMP cpu=$((cpu + 1)) fi done exit 0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/filesystem/usr/lib/kodi/aml-hdmimonitor.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) HDMI_UNPLUGGED=0 while :; do ! grep -q . /sys/class/amhdmitx/amhdmitx0/disp_cap && grep -q 0 /sys/class/amhdmitx/amhdmitx0/hpd_state && HDMI_UNPLUGGED=1 && sleep 2 && continue || break done if [ $HDMI_UNPLUGGED = 1 ] then systemctl restart kodi fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/filesystem/usr/lib/systemd/system/kodi-aml-hdmimonitor.service ================================================ [Unit] Description=Kodi Amlogic HDMI connection monitor After=kodi.service [Service] Type=simple ExecStart=/usr/lib/kodi/aml-hdmimonitor.sh [Install] WantedBy=kodi.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/initramfs/platform_init ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) display_mode=$(cat /sys/class/display/mode) # default values display_mode_user="1080p60hz" frac_rate_policy_user="0" for arg in $(cat /proc/cmdline); do case ${arg} in bootfrom*) bootfromext=1 ;; BOOT_IMAGE=*) BOOT_IMAGE=${arg#*=} ;; boot=*) boot=${arg#*=} ;; disk=*) disk=${arg#*=} ;; frac_rate_policy=*) frac_rate_policy_user=${arg#*=} ;; vout=*) vout=${arg#*=} display_mode_user=${vout%%,*} # implementation not yet finished by Amlogic #frac_rate_policy_user="0" #if [ -z ${vout##*frac*} ]; then # frac_rate_policy_user="1" #fi ;; native_4k_gui=*) native_4k_gui=${arg#*=} ;; esac done # Add information where to run CoreELEC from if [ -z "$BOOT_IMAGE" -o -z "$boot" -o -z "$disk" ]; then cmdline=$(cat /proc/cmdline) if [ -n "$bootfromext" ]; then cmdline="$cmdline BOOT_IMAGE=kernel.img boot=LABEL=@BOOT_LABEL@ disk=LABEL=@DISK_LABEL@" fi echo "$cmdline" > /proc/cmdline fi # Enable HDMI output if cable is connected and not already enabled by u-boot if [ "$(cat /sys/class/amhdmitx/amhdmitx0/hpd_state)" != "0" ]; then frac_rate_policy=$(cat /sys/devices/virtual/amhdmitx/amhdmitx0/frac_rate_policy) if [ "${frac_rate_policy}" != "${frac_rate_policy_user}" ]; then display_mode="null" echo "${display_mode}" > /sys/class/display/mode echo "${frac_rate_policy_user}" > /sys/devices/virtual/amhdmitx/amhdmitx0/frac_rate_policy fi if [ "${display_mode}" != "${display_mode_user}" ]; then echo "${display_mode_user}" > /sys/class/display/mode display_mode="${display_mode_user}" fi fi # Set framebuffer geometry to match the resolution case $display_mode in *x*) RES=${display_mode%%[ip]*} X=${RES%%x*} Y=${RES##*x};; 480*) X=720 Y=480 ;; 576*) X=720 Y=576 ;; 720p*) X=1280 Y=720 ;; 2160p*) X=3840 Y=2160 ;; *) X=1920 Y=1080 ;; esac if [ "$native_4k_gui" != "1" -a $X -gt 1920 ]; then X=1920 Y=1080 fi Y_VIRT=$(($Y * 2)) fbset -fb /dev/fb0 -g $X $Y $X $Y_VIRT 32 fbset -fb /dev/fb1 -g 32 32 32 32 32 echo 0 > /sys/class/graphics/fb0/free_scale echo 0 > /sys/class/graphics/fb1/free_scale echo 1 > /sys/class/video/disable_video # Enable scaling for 4K output if [ "$native_4k_gui" != "1" ]; then case $display_mode in 4k*|smpte*|2160*) echo 0 0 1919 1079 > /sys/class/graphics/fb0/free_scale_axis echo 0 0 3839 2159 > /sys/class/graphics/fb0/window_axis echo 0x10001 > /sys/class/graphics/fb0/free_scale ;; esac fi # Enable framebuffer device echo 0 > /sys/class/graphics/fb0/blank # Blank fb1 to prevent static noise echo 1 > /sys/class/graphics/fb1/blank ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/kodi/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8" ?> <settings version="1"> <section id="system"> <category id="display"> <group id="1"> <setting id="videoscreen.limitedrange"> <visible>false</visible> </setting> </group> </category> <category id="audio"> <group id="1"> <setting id="audiooutput.config"> <default>3</default> </setting> <setting id="audiooutput.streamnoise"> <default>false</default> </setting> </group> </category> </section> <section id="player"> <category id="videoplayer"> <group id="2"> <setting id="videoplayer.adjustrefreshrate"> <default>2</default> <!-- ADJUST_REFRESHRATE_ON_STARTSTOP --> <constraints> <options> <option label="351">0</option> <!-- ADJUST_REFRESHRATE_OFF --> <option label="36036">2</option> <!-- ADJUST_REFRESHRATE_ON_STARTSTOP --> <option label="36050">3</option> <!-- ADJUST_REFRESHRATE_ON_START --> </options> </constraints> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/kodi/g12x/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8" ?> <settings version="1"> <section id="system"> <category id="audio"> <group id="1"> <setting id="audiooutput.audiodevice"> <default>ALSA:surround71:CARD=AMLAUGESOUND,DEV=0</default> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/kodi/gxx/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8" ?> <settings version="1"> <section id="system"> <category id="audio"> <group id="1"> <setting id="audiooutput.audiodevice"> <default>ALSA:hdmi:CARD=AMLMESONAUDIO,DEV=0</default> </setting> <setting id="audiooutput.streamsilence"> <default>0</default> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/linux/linux.arm.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm 4.9.269 Kernel Configuration # CONFIG_ARM=y CONFIG_ARM_HAS_SG_CHAIN=y CONFIG_MIGHT_HAVE_PCI=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y CONFIG_HAVE_PROC_CPU=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_LOCKDEP_SUPPORT=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_VECTORS_BASE=0xffff0000 # CONFIG_ARM_PATCH_PHYS_VIRT is not set CONFIG_PHYS_OFFSET=0x00000000 CONFIG_GENERIC_BUG=y CONFIG_PGTABLE_LEVELS=2 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_EXTABLE_SORT=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=64 CONFIG_CROSS_COMPILE="" # CONFIG_COMPILE_TEST is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_LZMA=y CONFIG_HAVE_KERNEL_XZ=y CONFIG_HAVE_KERNEL_LZO=y CONFIG_HAVE_KERNEL_LZ4=y # CONFIG_KERNEL_GZIP is not set # CONFIG_KERNEL_LZMA is not set # CONFIG_KERNEL_XZ is not set CONFIG_KERNEL_LZO=y # CONFIG_KERNEL_LZ4 is not set CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_FHANDLE is not set # CONFIG_USELIB is not set CONFIG_AUDIT=y CONFIG_HAVE_ARCH_AUDITSYSCALL=y CONFIG_AUDITSYSCALL=y CONFIG_AUDIT_WATCH=y CONFIG_AUDIT_TREE=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_HANDLE_DOMAIN_IRQ=y # CONFIG_IRQ_DOMAIN_DEBUG is not set CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y CONFIG_ARCH_CLOCKSOURCE_DATA=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set CONFIG_SCHED_WALT=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set CONFIG_TASKSTATS=y CONFIG_TASK_DELAY_ACCT=y CONFIG_TASK_XACCT=y CONFIG_TASK_IO_ACCOUNTING=y # CONFIG_PSI is not set # # RCU Subsystem # CONFIG_PREEMPT_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y # CONFIG_TASKS_RCU is not set CONFIG_RCU_STALL_COMMON=y # CONFIG_TREE_RCU_TRACE is not set # CONFIG_RCU_EXPEDITE_BOOT is not set CONFIG_BUILD_BIN2C=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=19 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_NMI_LOG_BUF_SHIFT=13 CONFIG_GENERIC_SCHED_CLOCK=y CONFIG_CGROUPS=y CONFIG_CGROUP_DEBUG=y CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_PIDS=y CONFIG_CGROUP_DEVICE=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_CPUACCT=y # CONFIG_CGROUP_SCHEDTUNE is not set CONFIG_PAGE_COUNTER=y CONFIG_MEMCG=y # CONFIG_MEMCG_SWAP is not set # CONFIG_BLK_CGROUP is not set CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y # CONFIG_CFS_BANDWIDTH is not set CONFIG_RT_GROUP_SCHED=y # CONFIG_CGROUP_PERF is not set CONFIG_CGROUP_BPF=y CONFIG_SOCK_CGROUP_DATA=y # CONFIG_CHECKPOINT_RESTORE is not set CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_SCHED_AUTOGROUP is not set CONFIG_SCHED_TUNE=y CONFIG_DEFAULT_USE_ENERGY_AWARE=y # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE=" " CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 CONFIG_RD_GZIP=y CONFIG_RD_BZIP2=y CONFIG_RD_LZMA=y CONFIG_RD_XZ=y CONFIG_RD_LZO=y CONFIG_RD_LZ4=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_BPF=y CONFIG_EXPERT=y CONFIG_UID16=y CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set CONFIG_SYSFS_SYSCALL=y # CONFIG_SYSCTL_SYSCALL is not set CONFIG_KALLSYMS=y CONFIG_KALLSYMS_ALL=y # CONFIG_KALLSYMS_ABSOLUTE_PERCPU is not set CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_PRINTK=y CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_BPF_SYSCALL=y CONFIG_SHMEM=y CONFIG_AIO=y CONFIG_ADVISE_SYSCALLS=y # CONFIG_USERFAULTFD is not set CONFIG_PCI_QUIRKS=y CONFIG_MEMBARRIER=y CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y CONFIG_PERF_USE_VMALLOC=y # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_MEMCG_SYSFS_ON is not set # CONFIG_COMPAT_BRK is not set # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set # CONFIG_SLAB_FREELIST_RANDOM is not set CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_SYSTEM_DATA_VERIFICATION is not set CONFIG_PROFILING=y CONFIG_TRACEPOINTS=y CONFIG_KEXEC_CORE=y # CONFIG_OPROFILE is not set CONFIG_HAVE_OPROFILE=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set # CONFIG_UPROBES is not set # CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_ARCH_USE_BUILTIN_BSWAP=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_NMI=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_CLK=y CONFIG_HAVE_DMA_API_DEBUG=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP_FILTER=y CONFIG_HAVE_GCC_PLUGINS=y # CONFIG_GCC_PLUGINS is not set CONFIG_HAVE_CC_STACKPROTECTOR=y # CONFIG_CC_STACKPROTECTOR is not set # CONFIG_CC_STACKPROTECTOR_NONE is not set # CONFIG_CC_STACKPROTECTOR_REGULAR is not set CONFIG_CC_STACKPROTECTOR_STRONG=y # CONFIG_CC_STACKPROTECTOR_STRONG_AMLOGIC is not set # CONFIG_LTO is not set CONFIG_LTO_NONE=y CONFIG_HAVE_CONTEXT_TRACKING=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_REL=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS_MIN=8 CONFIG_ARCH_MMAP_RND_BITS_MAX=16 CONFIG_ARCH_MMAP_RND_BITS=8 # CONFIG_HAVE_ARCH_HASH is not set # CONFIG_ISA_BUS_API is not set CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_OLD_SIGACTION=y # CONFIG_CPU_NO_EFFICIENT_FFS is not set # CONFIG_HAVE_ARCH_VMAP_STACK is not set # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y CONFIG_HAVE_GENERIC_DMA_COHERENT=y CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set CONFIG_MODVERSIONS=y # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set # CONFIG_MODULE_COMPRESS is not set # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_LBDAF=y CONFIG_BLK_DEV_BSG=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_CMDLINE_PARSER is not set # # Partition Types # # CONFIG_PARTITION_ADVANCED is not set CONFIG_MSDOS_PARTITION=y CONFIG_EFI_PARTITION=y CONFIG_BLK_MQ_PCI=y # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set CONFIG_DEFAULT_NOOP=y CONFIG_DEFAULT_IOSCHED="noop" CONFIG_ASN1=y CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_FREEZER=y # # System Type # CONFIG_MMU=y CONFIG_ARCH_MULTIPLATFORM=y # CONFIG_ARCH_GEMINI is not set # CONFIG_ARCH_EBSA110 is not set # CONFIG_ARCH_EP93XX is not set # CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_NETX is not set # CONFIG_ARCH_IOP13XX is not set # CONFIG_ARCH_IOP32X is not set # CONFIG_ARCH_IOP33X is not set # CONFIG_ARCH_IXP4XX is not set # CONFIG_ARCH_DOVE is not set # CONFIG_ARCH_KS8695 is not set # CONFIG_ARCH_W90X900 is not set # CONFIG_ARCH_LPC32XX is not set # CONFIG_ARCH_PXA is not set # CONFIG_ARCH_RPC is not set # CONFIG_ARCH_SA1100 is not set # CONFIG_ARCH_S3C24XX is not set # CONFIG_ARCH_DAVINCI is not set # CONFIG_ARCH_OMAP1 is not set # # Multiple platform selection # # # CPU Core family selection # # CONFIG_ARCH_MULTI_V6 is not set CONFIG_ARCH_MULTI_V7=y CONFIG_ARCH_MULTI_V6_V7=y # CONFIG_ARCH_MULTI_CPU_AUTO is not set CONFIG_ARCH_VIRT=y # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_ARTPEC is not set # CONFIG_ARCH_AT91 is not set # CONFIG_ARCH_BCM is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_DIGICOLOR is not set # CONFIG_ARCH_HIGHBANK is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_KEYSTONE is not set CONFIG_ARCH_MESON=y # CONFIG_MACH_MESON6 is not set # CONFIG_MACH_MESON8 is not set # CONFIG_MACH_MESON8B is not set CONFIG_ARM64_A32=y # CONFIG_ARCH_MXC is not set # CONFIG_ARCH_MEDIATEK is not set # # TI OMAP/AM/DM/DRA Family # # CONFIG_ARCH_OMAP3 is not set # CONFIG_ARCH_OMAP4 is not set # CONFIG_SOC_OMAP5 is not set # CONFIG_SOC_AM33XX is not set # CONFIG_SOC_AM43XX is not set # CONFIG_SOC_DRA7XX is not set # CONFIG_ARCH_MMP is not set # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_REALVIEW is not set # CONFIG_ARCH_ROCKCHIP is not set # CONFIG_ARCH_SOCFPGA is not set # CONFIG_PLAT_SPEAR is not set # CONFIG_ARCH_STI is not set # CONFIG_ARCH_S5PV210 is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_RENESAS is not set # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_SIRF is not set # CONFIG_ARCH_TANGO is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_U8500 is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_WM8850 is not set # CONFIG_ARCH_ZX is not set # CONFIG_ARCH_ZYNQ is not set # # Processor Type # CONFIG_CPU_V7=y CONFIG_CPU_32v6K=y CONFIG_CPU_32v7=y CONFIG_CPU_ABRT_EV7=y CONFIG_CPU_PABRT_V7=y CONFIG_CPU_CACHE_V7=y CONFIG_CPU_CACHE_VIPT=y CONFIG_CPU_COPY_V6=y CONFIG_CPU_TLB_V7=y CONFIG_CPU_HAS_ASID=y CONFIG_CPU_CP15=y CONFIG_CPU_CP15_MMU=y # # Processor Features # # CONFIG_ARM_LPAE is not set # CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set CONFIG_ARM_THUMB=y CONFIG_ARM_THUMBEE=y CONFIG_ARM_VIRT_EXT=y CONFIG_SWP_EMULATE=y # CONFIG_CPU_ICACHE_DISABLE is not set # CONFIG_CPU_BPREDICT_DISABLE is not set CONFIG_CPU_SPECTRE=y # CONFIG_HARDEN_BRANCH_PREDICTOR is not set CONFIG_KUSER_HELPERS=y CONFIG_VDSO=y # CONFIG_CACHE_L2X0 is not set CONFIG_ARM_L1_CACHE_SHIFT_6=y CONFIG_ARM_L1_CACHE_SHIFT=6 CONFIG_ARM_DMA_MEM_BUFFERABLE=y CONFIG_DEBUG_RODATA=y CONFIG_DEBUG_ALIGN_RODATA=y CONFIG_MULTI_IRQ_HANDLER=y # CONFIG_ARM_ERRATA_430973 is not set # CONFIG_ARM_ERRATA_643719 is not set # CONFIG_ARM_ERRATA_720789 is not set # CONFIG_ARM_ERRATA_754322 is not set # CONFIG_ARM_ERRATA_754327 is not set # CONFIG_ARM_ERRATA_764369 is not set # CONFIG_ARM_ERRATA_775420 is not set # CONFIG_ARM_ERRATA_798181 is not set # CONFIG_ARM_ERRATA_773022 is not set # CONFIG_ARM_ERRATA_818325_852422 is not set # CONFIG_ARM_ERRATA_821420 is not set # CONFIG_ARM_ERRATA_825619 is not set # CONFIG_ARM_ERRATA_852421 is not set # CONFIG_ARM_ERRATA_852423 is not set # # Bus support # CONFIG_PCI=y CONFIG_PCI_DOMAINS=y CONFIG_PCI_DOMAINS_GENERIC=y CONFIG_PCI_SYSCALL=y CONFIG_PCIEPORTBUS=y CONFIG_PCIEAER=y # CONFIG_PCIE_ECRC is not set # CONFIG_PCIEAER_INJECT is not set CONFIG_PCIEASPM=y # CONFIG_PCIEASPM_DEBUG is not set CONFIG_PCIEASPM_DEFAULT=y # CONFIG_PCIEASPM_POWERSAVE is not set # CONFIG_PCIEASPM_PERFORMANCE is not set CONFIG_PCIE_PME=y CONFIG_PCIE_DPC=y CONFIG_PCIE_PTM=y CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y # CONFIG_PCI_DEBUG is not set # CONFIG_PCI_REALLOC_ENABLE_AUTO is not set # CONFIG_PCI_STUB is not set # CONFIG_PCI_IOV is not set # CONFIG_PCI_PRI is not set # CONFIG_PCI_PASID is not set # CONFIG_HOTPLUG_PCI is not set # # PCI host controller drivers # CONFIG_PCIE_DW_PLAT=y CONFIG_PCIE_DW=y # CONFIG_PCI_HOST_GENERIC is not set # CONFIG_PCI_LAYERSCAPE is not set # CONFIG_PCIE_ALTERA is not set # CONFIG_PCCARD is not set # # Kernel Features # CONFIG_HAVE_SMP=y CONFIG_SMP=y CONFIG_SMP_ON_UP=y CONFIG_ARM_CPU_TOPOLOGY=y CONFIG_SCHED_MC=y # CONFIG_SCHED_SMT is not set CONFIG_HAVE_ARM_ARCH_TIMER=y # CONFIG_MCPM is not set # CONFIG_BIG_LITTLE is not set CONFIG_VMSPLIT_3G=y # CONFIG_VMSPLIT_3G_OPT is not set # CONFIG_VMSPLIT_2G is not set # CONFIG_VMSPLIT_1G is not set CONFIG_PAGE_OFFSET=0xC0000000 CONFIG_NR_CPUS=8 CONFIG_HOTPLUG_CPU=y CONFIG_ARM_PSCI=y CONFIG_ARCH_NR_GPIO=0 # CONFIG_PREEMPT_NONE is not set # CONFIG_PREEMPT_VOLUNTARY is not set CONFIG_PREEMPT=y CONFIG_PREEMPT_COUNT=y CONFIG_HZ_FIXED=0 # CONFIG_HZ_100 is not set # CONFIG_HZ_200 is not set CONFIG_HZ_250=y # CONFIG_HZ_300 is not set # CONFIG_HZ_500 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=250 CONFIG_SCHED_HRTICK=y # CONFIG_THUMB2_KERNEL is not set CONFIG_ARM_PATCH_IDIV=y CONFIG_AEABI=y # CONFIG_OABI_COMPAT is not set # CONFIG_ARCH_SPARSEMEM_DEFAULT is not set # CONFIG_ARCH_SELECT_MEMORY_MODEL is not set CONFIG_HAVE_ARCH_PFN_VALID=y CONFIG_HIGHMEM=y CONFIG_HIGHPTE=y CONFIG_CPU_SW_DOMAIN_PAN=y CONFIG_HW_PERF_EVENTS=y CONFIG_ARCH_WANT_GENERAL_HUGETLB=y # CONFIG_ARM_MODULE_PLTS is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_HAVE_MEMBLOCK=y CONFIG_NO_BOOTMEM=y CONFIG_MEMORY_ISOLATION=y # CONFIG_HAVE_BOOTMEM_INFO_NODE is not set CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_COMPACTION=y CONFIG_MIGRATION=y # CONFIG_PHYS_ADDR_T_64BIT is not set CONFIG_BOUNCE=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 # CONFIG_CLEANCACHE is not set # CONFIG_FRONTSWAP is not set CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set CONFIG_CMA_DEBUGFS=y CONFIG_CMA_AREAS=15 # CONFIG_ZPOOL is not set # CONFIG_ZBUD is not set CONFIG_ZSMALLOC=y # CONFIG_PGTABLE_MAPPING is not set # CONFIG_ZSMALLOC_STAT is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_FRAME_VECTOR=y CONFIG_FORCE_MAX_ZONEORDER=11 CONFIG_ALIGNMENT_TRAP=y # CONFIG_UACCESS_WITH_MEMCPY is not set CONFIG_SECCOMP=y CONFIG_SWIOTLB=y CONFIG_IOMMU_HELPER=y # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_XEN is not set # CONFIG_ARM_FLUSH_CONSOLE_ON_RESTART is not set # # Boot options # CONFIG_USE_OF=y CONFIG_ATAGS=y # CONFIG_DEPRECATED_PARAM_STRUCT is not set # CONFIG_BUILD_ARM_APPENDED_DTB_IMAGE is not set CONFIG_ZBOOT_ROM_TEXT=0 CONFIG_ZBOOT_ROM_BSS=0 # CONFIG_ARM_APPENDED_DTB is not set CONFIG_CMDLINE="systemd.show_status=auto" # CONFIG_CMDLINE_FROM_BOOTLOADER is not set CONFIG_CMDLINE_EXTEND=y # CONFIG_CMDLINE_FORCE is not set CONFIG_KEXEC=y CONFIG_ATAGS_PROC=y # CONFIG_CRASH_DUMP is not set # CONFIG_AUTO_ZRELADDR is not set # # CPU Power Management # # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_STAT_DETAILS is not set CONFIG_CPU_FREQ_TIMES=y CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_GOV_USERSPACE is not set CONFIG_CPU_FREQ_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set CONFIG_CPU_FREQ_GOV_INTERACTIVE=y CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # # CPU frequency scaling drivers # # CONFIG_CPUFREQ_DT is not set CONFIG_ARM_BIG_LITTLE_CPUFREQ=y # CONFIG_ARM_DT_BL_CPUFREQ is not set # CONFIG_ARM_KIRKWOOD_CPUFREQ is not set CONFIG_ARM_SCPI_CPUFREQ=y # CONFIG_QORIQ_CPUFREQ is not set # # CPU Idle # 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_DT_IDLE_STATES=y # # ARM CPU Idle Drivers # CONFIG_ARM_CPUIDLE=y # CONFIG_ARM_HIGHBANK_CPUIDLE is not set # CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set # # Floating point emulation # # # At least one emulation must be selected # CONFIG_VFP=y CONFIG_VFPv3=y CONFIG_NEON=y CONFIG_KERNEL_MODE_NEON=y # # Userspace binary formats # CONFIG_BINFMT_ELF=y CONFIG_ELFCORE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y # CONFIG_BINFMT_FLAT is not set # CONFIG_HAVE_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_COREDUMP=y # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_SUSPEND_SKIP_SYNC is not set # CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y CONFIG_PM_AUTOSLEEP=y CONFIG_PM_WAKELOCKS=y CONFIG_PM_WAKELOCKS_LIMIT=100 CONFIG_PM_WAKELOCKS_GC=y CONFIG_PM=y # CONFIG_PM_DEBUG is not set # CONFIG_APM_EMULATION is not set CONFIG_PM_OPP=y CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_PM_GENERIC_DOMAINS_SLEEP=y CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ARM_CPU_SUSPEND=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_NET=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y # CONFIG_UNIX_DIAG is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y CONFIG_XFRM_INTERFACE=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set # CONFIG_NET_KEY is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=m CONFIG_IP_MROUTE=y # CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set # CONFIG_IP_PIMSM_V1 is not set # CONFIG_IP_PIMSM_V2 is not set # CONFIG_SYN_COOKIES is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set CONFIG_INET_ESP=y # CONFIG_INET_IPCOMP is not set # CONFIG_INET_XFRM_TUNNEL is not set CONFIG_INET_TUNNEL=m # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_DIAG is not set CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set CONFIG_TCP_CONG_CUBIC=y # CONFIG_TCP_CONG_WESTWOOD is not set # CONFIG_TCP_CONG_HTCP is not set # CONFIG_TCP_CONG_HSTCP is not set # CONFIG_TCP_CONG_HYBLA is not set # CONFIG_TCP_CONG_VEGAS is not set # CONFIG_TCP_CONG_NV is not set # CONFIG_TCP_CONG_SCALABLE is not set # CONFIG_TCP_CONG_LP is not set # CONFIG_TCP_CONG_VENO is not set # CONFIG_TCP_CONG_YEAH is not set # CONFIG_TCP_CONG_ILLINOIS is not set # CONFIG_TCP_CONG_DCTCP is not set # CONFIG_TCP_CONG_CDG is not set CONFIG_TCP_CONG_BBR=y CONFIG_DEFAULT_CUBIC=y # CONFIG_DEFAULT_BBR is not set # CONFIG_DEFAULT_RENO is not set CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set # CONFIG_INET6_XFRM_MODE_TRANSPORT is not set # CONFIG_INET6_XFRM_MODE_TUNNEL is not set # CONFIG_INET6_XFRM_MODE_BEET is not set # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set CONFIG_IPV6_FOU=m # CONFIG_IPV6_FOU_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set CONFIG_NETLABEL=y # CONFIG_ANDROID_PARANOID_NETWORK is not set CONFIG_NETWORK_SECMARK=y CONFIG_NET_PTP_CLASSIFY=y # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # # CONFIG_NETFILTER_INGRESS is not set CONFIG_NETFILTER_NETLINK=m # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set CONFIG_NETFILTER_NETLINK_LOG=m CONFIG_NF_CONNTRACK=m CONFIG_NF_CONNTRACK_MARK=y # CONFIG_NF_CONNTRACK_SECMARK is not set # CONFIG_NF_CONNTRACK_PROCFS is not set # CONFIG_NF_CONNTRACK_EVENTS is not set # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CT_PROTO_DCCP is not set # CONFIG_NF_CT_PROTO_SCTP is not set # CONFIG_NF_CT_PROTO_UDPLITE is not set # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set CONFIG_NF_CONNTRACK_IRC=m CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set CONFIG_NF_CONNTRACK_SIP=m CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m # CONFIG_NF_CT_NETLINK_TIMEOUT is not set # CONFIG_NETFILTER_NETLINK_GLUE_CT is not set CONFIG_NF_NAT=m CONFIG_NF_NAT_NEEDED=y # CONFIG_NF_NAT_AMANDA is not set CONFIG_NF_NAT_FTP=m CONFIG_NF_NAT_IRC=m CONFIG_NF_NAT_SIP=m CONFIG_NF_NAT_TFTP=m CONFIG_NF_NAT_REDIRECT=m # CONFIG_NF_TABLES is not set CONFIG_NETFILTER_XTABLES=m # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m CONFIG_NETFILTER_XT_CONNMARK=m # CONFIG_NETFILTER_XT_SET is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_AUDIT is not set # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set CONFIG_NETFILTER_XT_TARGET_REDIRECT=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_SECMARK is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m CONFIG_NETFILTER_XT_MATCH_BPF=m # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m CONFIG_NETFILTER_XT_MATCH_CONNMARK=m CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set CONFIG_NETFILTER_XT_MATCH_ECN=m # CONFIG_NETFILTER_XT_MATCH_ESP is not set CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m CONFIG_NETFILTER_XT_MATCH_HELPER=m CONFIG_NETFILTER_XT_MATCH_HL=m # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set CONFIG_NETFILTER_XT_MATCH_IPRANGE=m CONFIG_NETFILTER_XT_MATCH_IPVS=m CONFIG_NETFILTER_XT_MATCH_L2TP=m CONFIG_NETFILTER_XT_MATCH_LENGTH=m CONFIG_NETFILTER_XT_MATCH_LIMIT=m CONFIG_NETFILTER_XT_MATCH_MAC=m CONFIG_NETFILTER_XT_MATCH_MARK=m # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set CONFIG_NETFILTER_XT_MATCH_OWNER=m # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA2 is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set CONFIG_NETFILTER_XT_MATCH_STATE=m # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set CONFIG_IP_SET=m CONFIG_IP_SET_MAX=256 CONFIG_IP_SET_BITMAP_IP=m CONFIG_IP_SET_BITMAP_IPMAC=m CONFIG_IP_SET_BITMAP_PORT=m CONFIG_IP_SET_HASH_IP=m CONFIG_IP_SET_HASH_IPMARK=m CONFIG_IP_SET_HASH_IPPORT=m CONFIG_IP_SET_HASH_IPPORTIP=m CONFIG_IP_SET_HASH_IPPORTNET=m CONFIG_IP_SET_HASH_MAC=m CONFIG_IP_SET_HASH_NETPORTNET=m CONFIG_IP_SET_HASH_NET=m CONFIG_IP_SET_HASH_NETNET=m CONFIG_IP_SET_HASH_NETPORT=m CONFIG_IP_SET_HASH_NETIFACE=m CONFIG_IP_SET_LIST_SET=m CONFIG_IP_VS=m CONFIG_IP_VS_IPV6=y # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # CONFIG_IP_VS_PROTO_AH_ESP is not set # CONFIG_IP_VS_PROTO_ESP is not set # CONFIG_IP_VS_PROTO_AH is not set # CONFIG_IP_VS_PROTO_SCTP is not set # # IPVS scheduler # CONFIG_IP_VS_RR=m # CONFIG_IP_VS_WRR is not set # CONFIG_IP_VS_LC is not set # CONFIG_IP_VS_WLC is not set # CONFIG_IP_VS_FO is not set # CONFIG_IP_VS_OVF is not set # CONFIG_IP_VS_LBLC is not set # CONFIG_IP_VS_LBLCR is not set # CONFIG_IP_VS_DH is not set # CONFIG_IP_VS_SH is not set # CONFIG_IP_VS_SED is not set # CONFIG_IP_VS_NQ is not set # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS application helper # CONFIG_IP_VS_FTP=m CONFIG_IP_VS_NFCT=y CONFIG_IP_VS_PE_SIP=m # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m CONFIG_NF_CONNTRACK_IPV4=m # CONFIG_NF_DUP_IPV4 is not set # 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=m # CONFIG_NF_NAT_PPTP is not set # CONFIG_NF_NAT_H323 is not set CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_SECURITY is not set # CONFIG_IP_NF_ARPTABLES is not set # # IPv6: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV6=m CONFIG_NF_CONNTRACK_IPV6=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_NF_NAT_MASQUERADE_IPV6=m CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set # CONFIG_IP6_NF_SECURITY is not set CONFIG_IP6_NF_NAT=m # CONFIG_IP6_NF_TARGET_MASQUERADE is not set # CONFIG_IP6_NF_TARGET_NPT is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y CONFIG_HAVE_NET_DSA=y # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set # CONFIG_DECNET is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set CONFIG_NET_SCH_FQ_CODEL=y CONFIG_NET_SCH_FQ=y # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # # Classification # # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_TCINDEX is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_RSVP is not set # CONFIG_NET_CLS_RSVP6 is not set # CONFIG_NET_CLS_FLOW is not set # CONFIG_NET_CLS_CGROUP is not set # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set CONFIG_NET_L3_MASTER_DEV=y # CONFIG_NET_NCSI is not set CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_XPS=y # CONFIG_CGROUP_NET_PRIO is not set # CONFIG_CGROUP_NET_CLASSID is not set CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_JIT is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set CONFIG_BT=m CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y # CONFIG_BT_BNEP is not set CONFIG_BT_HIDP=m CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_LEDS is not set # CONFIG_BT_SELFTEST is not set # CONFIG_BT_DEBUGFS is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_QCA=m CONFIG_BT_HCIBTUSB=m CONFIG_BT_HCIBTUSB_BCM=y CONFIG_BT_HCIBTUSB_RTL=y # CONFIG_BT_HCIBTSDIO is not set CONFIG_BT_HCIUART=m CONFIG_BT_HCIUART_H4=y 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 CONFIG_BT_HCIBPA10X=m CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIVHCI=m CONFIG_BT_MRVL=m CONFIG_BT_MRVL_SDIO=m CONFIG_BT_ATH3K=m CONFIG_AF_RXRPC=m # CONFIG_AF_RXRPC_IPV6 is not set # CONFIG_AF_RXRPC_INJECT_LOSS is not set # CONFIG_AF_RXRPC_DEBUG is not set # CONFIG_RXKAD is not set # CONFIG_AF_KCM is not set # CONFIG_STREAM_PARSER is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=y CONFIG_NL80211_TESTMODE=y # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set # CONFIG_CFG80211_INTERNAL_REGDB is not set CONFIG_CFG80211_CRDA_SUPPORT=y CONFIG_CFG80211_WEXT=y CONFIG_LIB80211=m # CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=y CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_MINSTREL_HT=y # CONFIG_MAC80211_RC_MINSTREL_VHT is not set CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 # CONFIG_WIMAX is not set CONFIG_RFKILL=y CONFIG_RFKILL_PM=y CONFIG_RFKILL_LEDS=y # CONFIG_RFKILL_INPUT is not set # CONFIG_RFKILL_REGULATOR is not set # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set CONFIG_CEPH_LIB=m # CONFIG_CEPH_LIB_PRETTYDEBUG is not set # CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set CONFIG_NFC=m CONFIG_NFC_DIGITAL=m CONFIG_NFC_NCI=m CONFIG_NFC_NCI_SPI=m CONFIG_NFC_NCI_UART=m CONFIG_NFC_HCI=m CONFIG_NFC_SHDLC=y # # Near Field Communication (NFC) devices # CONFIG_NFC_TRF7970A=m CONFIG_NFC_SIM=m CONFIG_NFC_PORT100=m CONFIG_NFC_FDP=m CONFIG_NFC_FDP_I2C=m CONFIG_NFC_PN544=m CONFIG_NFC_PN544_I2C=m CONFIG_NFC_PN533=m CONFIG_NFC_PN533_USB=m CONFIG_NFC_PN533_I2C=m CONFIG_NFC_MICROREAD=m CONFIG_NFC_MICROREAD_I2C=m CONFIG_NFC_MRVL=m CONFIG_NFC_MRVL_USB=m CONFIG_NFC_MRVL_UART=m CONFIG_NFC_MRVL_I2C=m CONFIG_NFC_MRVL_SPI=m CONFIG_NFC_ST21NFCA=m CONFIG_NFC_ST21NFCA_I2C=m CONFIG_NFC_ST_NCI=m CONFIG_NFC_ST_NCI_I2C=m CONFIG_NFC_ST_NCI_SPI=m CONFIG_NFC_NXP_NCI=m CONFIG_NFC_NXP_NCI_I2C=m CONFIG_NFC_S3FWRN5=m CONFIG_NFC_S3FWRN5_I2C=m CONFIG_NFC_ST95HF=m CONFIG_LWTUNNEL=y CONFIG_DST_CACHE=y # CONFIG_NET_DEVLINK is not set CONFIG_MAY_USE_DEVLINK=y CONFIG_HAVE_CBPF_JIT=y # # Device Drivers # CONFIG_AMLOGIC_DRIVER=y CONFIG_AMLOGIC_MODIFY=y # CONFIG_AMLOGIC_SYNC_20210524 is not set # # Amlogic Device Drivers # CONFIG_AMLOGIC_CPUFREQ=y CONFIG_AMLOGIC_MESON_CPUFREQ=y CONFIG_AMLOGIC_INPUT_BOOST=y CONFIG_AMLOGIC_INPUT_BOOST_DURATION=1000 CONFIG_AMLOGIC_UART=y CONFIG_AMLOGIC_SERIAL_MESON_CONSOLE=y # CONFIG_AMLOGIC_PRINTK_NOBLOCK_MODE is not set CONFIG_AMLOGIC_IOMAP=y CONFIG_AMLOGIC_PINCTRL=y # CONFIG_AMLOGIC_PINCTRL_MESON8B is not set CONFIG_AMLOGIC_PINCTRL_MESON_GXL=y CONFIG_AMLOGIC_PINCTRL_MESON_AXG=y CONFIG_AMLOGIC_PINCTRL_MESON_TXLX=y CONFIG_AMLOGIC_PINCTRL_MESON_G12A=y # CONFIG_AMLOGIC_PINCTRL_MESON_TXL is not set # CONFIG_AMLOGIC_PINCTRL_MESON_TL1 is not set # CONFIG_AMLOGIC_PINCTRL_MESON_TM2 is not set CONFIG_AMLOGIC_PINCTRL_MESON_SC2=y CONFIG_AMLOGIC_PINCONF_MESON_G12A=y CONFIG_AMLOGIC_PINCTRL_MESON8_PMX=y CONFIG_AMLOGIC_PINCTRL_MESON_AXG_PMX=y # # USB Support # CONFIG_AMLOGIC_USB=y CONFIG_AMLOGIC_USB_DWC_OTG_HCD=y CONFIG_AMLOGIC_USB_HOST_ELECT_TEST=y CONFIG_AMLOGIC_USBPHY=y CONFIG_AMLOGIC_USB2PHY=y CONFIG_AMLOGIC_USB3PHY=y # # I2C Hardware Bus support # CONFIG_AMLOGIC_I2C=y CONFIG_AMLOGIC_I2C_SLAVE=y CONFIG_AMLOGIC_I2C_MASTER=y # # AMLOGIC SPI Hardware bus support # CONFIG_AMLOGIC_SPICC_MASTER=y # CONFIG_AMLOGIC_SPICC_SLAVE is not set CONFIG_AMLOGIC_SEC=y CONFIG_AMLOGIC_CPU_VERSION=y CONFIG_AMLOGIC_MESON64_VERSION=y # CONFIG_AMLOGIC_M8B_MESON32_VERSION is not set CONFIG_AMLOGIC_CPU_INFO=y # # MESON MHU mailbox Support # CONFIG_AMLOGIC_MHU_MBOX=y CONFIG_ARM_SCPI_PROTOCOL=y CONFIG_AMLOGIC_REG_ACCESS=y CONFIG_AMLOGIC_TIMER=y # CONFIG_AMLOGIC_LOCAL_TIMER is not set CONFIG_AMLOGIC_BC_TIMER=y CONFIG_AMLOGIC_CLK=y CONFIG_AMLOGIC_COMMON_CLK_SCPI=y # CONFIG_AMLOGIC_M8B_CLK is not set CONFIG_AMLOGIC_GX_CLK=y # # Amlogic Crypto Support # CONFIG_AMLOGIC_CRYPTO=y CONFIG_AMLOGIC_CRYPTO_DMA=y # CONFIG_AMLOGIC_CRYPTO_BLKMV is not set CONFIG_AMLOGIC_INPUT=y # CONFIG_AMLOGIC_AVIN_DETECT is not set CONFIG_AMLOGIC_INPUT_KEYBOARD=y CONFIG_AMLOGIC_ADC_KEYPADS=y CONFIG_AMLOGIC_GPIO_KEY=y # CONFIG_AMLOGIC_PCA9557_KEYPAD is not set CONFIG_AMLOGIC_REMOTE=y CONFIG_AMLOGIC_MESON_REMOTE=m CONFIG_AMLOGIC_TOUCHSCREEN=y CONFIG_AMLOGIC_TOUCHSCREEN_FTS=y CONFIG_AMLOGIC_TOUCHSCREEN_GT1X=y CONFIG_AMLOGIC_TOUCHSCREEN_GT9XX=y # CONFIG_AMLOGIC_TOUCHSCREEN_HYN_CST2XX is not set # CONFIG_AMLOGIC_SENSOR is not set # # EFUSE Support # CONFIG_AMLOGIC_EFUSE=y # CONFIG_AMLOGIC_EFUSE_WRITE_VERSION_PERMIT is not set CONFIG_AMLOGIC_REBOOT=y CONFIG_AMLOGIC_GX_REBOOT=y # CONFIG_AMLOGIC_M8B_REBOOT is not set CONFIG_AMLOGIC_INTERNAL_PHY=y CONFIG_AMLOGIC_CPU_HOTPLUG=y CONFIG_AMLOGIC_PWM=y CONFIG_AMLOGIC_PWM_V2=y # # Amlogic dvb configuration # # CONFIG_AMLOGIC_DVB is not set CONFIG_AMLOGIC_DVB_COMPAT=y # # Amlogic multimedia configuration # CONFIG_AMLOGIC_MEDIA_ENABLE=y CONFIG_AMLOGIC_MEDIA_COMMON=y CONFIG_AMLOGIC_MEDIA_DRIVERS=y CONFIG_AMLOGIC_MEDIA_MULTI_DEC=y # CONFIG_AMLOGIC_AVSP_LONG_CABAC is not set CONFIG_AMLOGIC_MEDIA_CODEC_MM=y # # Canvas management driver # CONFIG_AMLOGIC_MEDIA_CANVAS=y # # Amlogic GE2D Module # CONFIG_AMLOGIC_MEDIA_GE2D=y # CONFIG_AMLOGIC_MEDIA_GE2D_MORE_SECURITY is not set # # ION support # CONFIG_AMLOGIC_ION=y # # RDMA management driver # CONFIG_AMLOGIC_MEDIA_RDMA=y CONFIG_AMLOGIC_MEDIA_VSYNC_RDMA=y # CONFIG_AMLOGIC_UVM_CORE is not set # CONFIG_AMLOGIC_UVM_ALLOCATOR is not set # CONFIG_AMLOGIC_ION_DELAY_ALLOC is not set CONFIG_AMLOGIC_MEDIA_VFM=y # # Amlogic VPU Driver Support # CONFIG_AMLOGIC_VPU=y # CONFIG_AMLOGIC_VPU_DYNAMIC_ADJ is not set CONFIG_AMLOGIC_VIDEOBUF_RESOURCE=m # # LUT DMA management driver # # CONFIG_AMLOGIC_MEDIA_LUT_DMA is not set # # ResManage driver # # CONFIG_AMLOGIC_MEDIA_RESMANAGE is not set # # VPU SECURITY driver # # CONFIG_AMLOGIC_MEDIA_SECURITY is not set # # Amlogic Video Sink Driver Support # CONFIG_AMLOGIC_MEDIA_VIDEO=y CONFIG_AMLOGIC_MEDIA_VIDEOCAPTURE=y # # Amlogic Vout Driver Support # CONFIG_AMLOGIC_VOUT=y CONFIG_AMLOGIC_VOUT_CLK_SERVE=y CONFIG_AMLOGIC_VDAC=y CONFIG_AMLOGIC_CVBS_OUTPUT=y CONFIG_AMLOGIC_WSS=y # # Amlogic HDMITX Module # CONFIG_AMLOGIC_HDMITX=y # # Amlogic LCD Output Module # CONFIG_AMLOGIC_LCD=y CONFIG_AMLOGIC_LCD_TV=y CONFIG_AMLOGIC_LCD_TABLET=y CONFIG_AMLOGIC_LCD_EXTERN=y # CONFIG_AMLOGIC_LCD_EXTERN_I2C_T5800Q is not set # CONFIG_AMLOGIC_LCD_EXTERN_I2C_ANX6862_7911 is not set # CONFIG_AMLOGIC_LCD_EXTERN_I2C_DLPC3439 is not set # CONFIG_AMLOGIC_LCD_EXTERN_I2C_ANX6345 is not set # CONFIG_AMLOGIC_LCD_EXTERN_I2C_CS602 is not set # CONFIG_AMLOGIC_LCD_EXTERN_SPI_LD070WS2 is not set # CONFIG_AMLOGIC_LCD_EXTERN_MIPI_KD080D13 is not set # CONFIG_AMLOGIC_LCD_EXTERN_MIPI_N070ICN is not set # CONFIG_AMLOGIC_LCD_EXTERN_MIPI_TV070WSM is not set # CONFIG_AMLOGIC_LCD_EXTERN_MIPI_ST7701 is not set # CONFIG_AMLOGIC_LCD_EXTERN_MIPI_P070ACB is not set # CONFIG_AMLOGIC_LCD_EXTERN_MIPI_TL050FHV02CT is not set # # Amlogic Backlight Support # CONFIG_AMLOGIC_BACKLIGHT=y CONFIG_AMLOGIC_BL_EXTERN=y CONFIG_AMLOGIC_BL_EXTERN_I2C_LP8556=y CONFIG_AMLOGIC_BL_EXTERN_MIPI_LT070ME05=y CONFIG_AMLOGIC_LOCAL_DIMMING=y CONFIG_CONFIG_AML_LOCAL_DIMMING_IW7038=y CONFIG_CONFIG_AML_LOCAL_DIMMING_IW7027=y CONFIG_AMLOGIC_VOUT_SERVE=y CONFIG_AMLOGIC_VOUT2_SERVE=y # # Amlogic Peripheral_lcd Support # # CONFIG_AMLOGIC_PERIPHERAL_LCD is not set # # Amlogic OSD Module # CONFIG_AMLOGIC_MEDIA_FB=y # CONFIG_AMLOGIC_MEDIA_FB_OSD_SYNC_FENCE is not set CONFIG_AMLOGIC_MEDIA_FB_OSD_VSYNC_RDMA=y CONFIG_AMLOGIC_MEDIA_FB_OSD2_ENABLE=y CONFIG_AMLOGIC_MEDIA_FB_OSD2_CURSOR=y # # Amlogic OSD_EXT Module # # CONFIG_AMLOGIC_MEDIA_FB_EXT is not set # # Deinterlace driver # CONFIG_AMLOGIC_MEDIA_DEINTERLACE=y # # DI_MULTI driver # # # DI_LOCAL driver # # # Input drivers # # CONFIG_AMLOGIC_MEDIA_VIN is not set # # Amlogic Video Processor Support # CONFIG_AMLOGIC_MEDIA_VIDEO_PROCESSOR=y # # V4L2 Video Support # CONFIG_AMLOGIC_V4L_VIDEO=m # CONFIG_AMLOGIC_V4L_VIDEO2 is not set # # Post Process Manager driver # CONFIG_AMLOGIC_POST_PROCESS_MANAGER=y CONFIG_AMLOGIC_POST_PROCESS_MANAGER_PPSCALER=y # CONFIG_AMLOGIC_POST_PROCESS_MANAGER_3D_PROCESS is not set # # Amlogic ion video support # # CONFIG_AMLOGIC_VIDEOBUF2_ION is not set # # Amlogic picture decoder support # # CONFIG_AMLOGIC_PIC_DEC is not set # # Amlogic videosync support # # CONFIG_AMLOGIC_VIDEOSYNC is not set # # Amlogic v4l video support # # CONFIG_AMLOGIC_V4L_VIDEO3 is not set # # Amlogic video_composer support # # CONFIG_AMLOGIC_VIDEO_COMPOSER is not set # # Amlogic video tunnel support # # CONFIG_AMLOGIC_VIDEO_TUNNEL is not set # # Amlogic Enhancement drivers # CONFIG_AMLOGIC_MEDIA_ENHANCEMENT=y # # Amlogic VECM Drivers # # # Amlogic amvecm Driver # CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_VECM=y # # Amlogic amdolby_vision Drivers # # # Amlogic amdolby_vision Driver # CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION=y # # Amlogic amprime_sl Drivers # # # Amlogic amprime_sl Driver # # CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_PRIME_SL is not set # CONFIG_AMLOGIC_MEDIA_GDC is not set # # Amlogic multimedia algorithm configuration # # CONFIG_AMLOGIC_MEDIA_ALGORITHM is not set # # Amlogic Camera Support # # CONFIG_AMLOGIC_VIDEO_CAPTURE is not set # CONFIG_AMLOGIC_VIDEOIN_MANAGER is not set # CONFIG_AMLOGIC_MEDIA_MSYNC is not set # # Amlogic DTV driver # # CONFIG_AMLOGIC_DTV_DEMOD is not set # # MMC/SD/SDIO Host Controller Drivers # # # Multimedia Card support # CONFIG_AMLOGIC_MMC=y # CONFIG_AMLOGIC_M8B_MMC is not set # # Meson NAND Device Support # CONFIG_AMLOGIC_NAND=y # # Meson8B NAND Device Support # CONFIG_AMLOGIC_VRTC=y CONFIG_AMLOGIC_SMARTCARD=y CONFIG_AMLOGIC_CEC=y CONFIG_AMLOGIC_AO_CEC=y # # unifykey Support # CONFIG_AMLOGIC_UNIFYKEY=y CONFIG_AMLOGIC_V8_UNIFYKEY=y # CONFIG_AMLOGIC_V7_UNIFYKEY is not set # # Amlogic temperature sensor # CONFIG_AMLOGIC_TEMP_SENSOR=y CONFIG_AMLOGIC_GX_TEMP_SENSOR=y CONFIG_AMLOGIC_CPUCORE_THERMAL=y CONFIG_AMLOGIC_GPU_THERMAL=y CONFIG_AMLOGIC_GPUCORE_THERMAL=y # # Audio Interface # CONFIG_AMLOGIC_AMAUDIO=y # # Amlogic Audio Interface V2 # CONFIG_AMLOGIC_AMAUDIO2=y # CONFIG_AMLKARAOKE is not set # # AMLOGIC Audio DSP process # CONFIG_AMLOGIC_AUDIO_DSP=y # # AMLOGIC Audio Info # CONFIG_AMLOGIC_AUDIO_INFO=y # # Meson core pm driver # CONFIG_AMLOGIC_SUSPEND=y CONFIG_AMLOGIC_GX_SUSPEND=y # CONFIG_AMLOGIC_M8B_SUSPEND is not set CONFIG_AMLOGIC_LEGACY_EARLY_SUSPEND=y CONFIG_AMLOGIC_LED=y CONFIG_AMLOGIC_LED_SYS=y # CONFIG_AMLOGIC_LEDS_TLC59116 is not set # CONFIG_AMLOGIC_LEDS_STATE is not set CONFIG_AMLOGIC_JTAG=y CONFIG_AMLOGIC_JTAG_MESON=y CONFIG_AMLOGIC_WDT=y CONFIG_AMLOGIC_WDT_MESON=y CONFIG_AMLOGIC_WDT_MESON_V3=y # # ESM Support # CONFIG_AMLOGIC_ESM=y CONFIG_AMLOGIC_WIFI=y CONFIG_AMLOGIC_BT_DEVICE=y # # AMLOGIC DVB EXTERN support # # CONFIG_AMLOGIC_DVB_EXTERN is not set # # DVB AUCPU support # CONFIG_AMLOGIC_AUCPU=y # # AMLOGIC DVB demux/dsc support # CONFIG_AMLOGIC_DVB_DMX=m # # DVB COMPAT support # CONFIG_AMLOGIC_POWER=y # CONFIG_AMLOGIC_PMU_OF is not set # CONFIG_AMLOGIC_PMU is not set # CONFIG_AMLOGIC_M8B_DVFS is not set # # Multimedia Card support # CONFIG_AMLOGIC_PCIE=y # CONFIG_AMLOGIC_IRBLASTER_CORE is not set CONFIG_AMLOGIC_IIO=y # # Analog to digital converters # CONFIG_AMLOGIC_SARADC=y CONFIG_AMLOGIC_DDR_TOOL=y # CONFIG_AMLOGIC_DDR_WINDOW_TOOL is not set CONFIG_AMLOGIC_DDR_BANDWIDTH=y CONFIG_AMLOGIC_DDR_BANDWIDTH_GX=y CONFIG_AMLOGIC_DMC_MONITOR=y CONFIG_AMLOGIC_DMC_MONITOR_GX=y # CONFIG_AMLOGIC_DRM is not set # CONFIG_AMLOGIC_SM is not set CONFIG_AMLOGIC_TEE=y # CONFIG_AMLOGIC_LEDRING is not set CONFIG_AMLOGIC_MEMORY_EXTEND=y # CONFIG_AMLOGIC_PAGE_TRACE is not set CONFIG_AMLOGIC_RAMDUMP=y CONFIG_AMLOGIC_CMA=y # CONFIG_AMLOGIC_VMAP is not set # CONFIG_AMLOGIC_WATCHPOINT is not set CONFIG_AMLOGIC_GPIO_IRQ=y # # Amlogic ATV driver # # CONFIG_AMLOGIC_ATV_DEMOD is not set CONFIG_AMLOGIC_DEBUG=y CONFIG_AMLOGIC_DEBUG_LOCKUP=y # CONFIG_AMLOGIC_DEBUG_ATRACE is not set # CONFIG_AMLOGIC_DEBUG_SCRAMBLER_RAMOOPS is not set # # Amlogic defend img file update support # CONFIG_AMLOGIC_DEFENDKEY=y # CONFIG_AMLOGIC_BATTERY_DUMMY is not set # CONFIG_AMLOGIC_CHARGER_DUMMY is not set # # Meson SPI NOR Flash Support # CONFIG_SPI_AML_SPIFC=y CONFIG_DOLBY_FW=y # CONFIG_AMLOGIC_IRCUT is not set # # AMLOGIC HiFi4DSP process # # CONFIG_AMLOGIC_HIFI4DSP is not set # CONFIG_AMLOGIC_PIXEL_PROBE is not set # # AMLOGIC firmware boot # # CONFIG_AMLOGIC_FIRMWARE is not set CONFIG_AMLOGIC_RESET_MESON=y # # AMLOGIC DVB EXTERN support # # # DVB AUCPU support # # # AMLOGIC DVB demux/dsc support # # # DVB COMPAT support # CONFIG_AMLOGIC_SOC_INFO=y CONFIG_ARM_AMBA=y # # Generic Driver Options # CONFIG_UEVENT_HELPER=y CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set CONFIG_WANT_DEV_COREDUMP=y CONFIG_ALLOW_DEV_COREDUMP=y CONFIG_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_SYS_HYPERVISOR is not set # CONFIG_GENERIC_CPU_DEVICES is not set CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_FENCE_TRACE is not set CONFIG_DMA_CMA=y # # Default contiguous memory area size: # CONFIG_CMA_SIZE_MBYTES=8 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 # # Bus devices # # CONFIG_ARM_CCI400_PMU is not set # CONFIG_ARM_CCI5xx_PMU is not set # CONFIG_ARM_CCN is not set # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_VEXPRESS_CONFIG is not set CONFIG_CONNECTOR=y CONFIG_PROC_EVENTS=y CONFIG_MTD=y # CONFIG_MTD_TESTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set CONFIG_MTD_CMDLINE_PARTS=y # CONFIG_MTD_AFS_PARTS is not set CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AR7_PARTS is not set # # User Modules And Translation Layers # CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # CONFIG_RFD_FTL is not set # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set CONFIG_MTD_OOPS=y # CONFIG_MTD_SWAP is not set # CONFIG_MTD_PARTITIONED_MASTER is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_CFI_I4 is not set # CONFIG_MTD_CFI_I8 is not set # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_INTEL_VR_NOR is not set # CONFIG_MTD_PLATRAM is not set # # Self-contained MTD device drivers # # CONFIG_MTD_PMC551 is not set # CONFIG_MTD_DATAFLASH is not set # CONFIG_MTD_M25P80 is not set # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLOCK2MTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOCG3 is not set CONFIG_MTD_NAND_IDS=y CONFIG_MTD_NAND_ECC=y # CONFIG_MTD_NAND_ECC_SMC is not set CONFIG_MTD_NAND=y # CONFIG_MTD_NAND_ECC_BCH is not set # CONFIG_MTD_SM_COMMON is not set # CONFIG_MTD_NAND_DENALI_PCI is not set # CONFIG_MTD_NAND_DENALI_DT is not set # CONFIG_MTD_NAND_GPIO is not set # CONFIG_MTD_NAND_OMAP_BCH_BUILD is not set # CONFIG_MTD_NAND_RICOH is not set # CONFIG_MTD_NAND_DISKONCHIP is not set # CONFIG_MTD_NAND_DOCG4 is not set # CONFIG_MTD_NAND_CAFE is not set # CONFIG_MTD_NAND_NANDSIM is not set # CONFIG_MTD_NAND_BRCMNAND is not set # CONFIG_MTD_NAND_PLATFORM is not set # CONFIG_MTD_NAND_HISI504 is not set # CONFIG_MTD_NAND_MTK is not set # CONFIG_MTD_ONENAND is not set # # LPDDR & LPDDR2 PCM memory drivers # # CONFIG_MTD_LPDDR is not set # CONFIG_MTD_LPDDR2_NVM 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_MTD_UBI=y CONFIG_MTD_UBI_WL_THRESHOLD=4096 CONFIG_MTD_UBI_BEB_LIMIT=20 # CONFIG_MTD_UBI_FASTMAP is not set # CONFIG_MTD_UBI_GLUEBI is not set # CONFIG_MTD_UBI_BLOCK is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_ADDRESS=y CONFIG_OF_ADDRESS_PCI=y CONFIG_OF_IRQ=y CONFIG_OF_NET=y CONFIG_OF_MDIO=y CONFIG_OF_PCI=y CONFIG_OF_PCI_IRQ=y CONFIG_OF_RESERVED_MEM=y # CONFIG_OF_OVERLAY is not set CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set CONFIG_ZRAM=m # CONFIG_ZRAM_WRITEBACK is not set # CONFIG_ZRAM_MEMORY_TRACKING is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_UMEM is not set # CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_CRYPTOLOOP is not set CONFIG_BLK_DEV_DRBD=m # CONFIG_DRBD_FAULT_INJECTION is not set CONFIG_BLK_DEV_NBD=m # CONFIG_BLK_DEV_OSD is not set # CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=m CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_CDROM_PKTCDVD=m CONFIG_CDROM_PKTCDVD_BUFFERS=8 CONFIG_CDROM_PKTCDVD_WCACHE=y CONFIG_ATA_OVER_ETH=m # CONFIG_MG_DISK is not set CONFIG_VIRTIO_BLK=y # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_RSXX is not set CONFIG_NVME_CORE=y CONFIG_BLK_DEV_NVME=y CONFIG_BLK_DEV_NVME_SCSI=y CONFIG_NVME_FABRICS=y CONFIG_NVME_TARGET=y CONFIG_NVME_TARGET_LOOP=y # # Misc devices # CONFIG_SENSORS_LIS3LV02D=m # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_PHANTOM is not set # CONFIG_SGI_IOC4 is not set # CONFIG_TIFM_CORE is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HP_ILO is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_TI_DAC7512 is not set # CONFIG_USB_SWITCH_FSA9480 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set CONFIG_UID_SYS_STATS=y # CONFIG_UID_SYS_STATS_DEBUG is not set # CONFIG_MEMORY_STATE_TIME is not set CONFIG_KHADAS_MCU=y # CONFIG_C2PORT is not set # # EEPROM support # CONFIG_EEPROM_AT24=y CONFIG_EEPROM_AT25=m # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # CONFIG_CB710_CORE is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set CONFIG_SENSORS_LIS3_SPI=m CONFIG_SENSORS_LIS3_I2C=m # # Altera FPGA firmware download module # # CONFIG_ALTERA_STAPL is not set # # Intel MIC Bus Driver # # # SCIF Bus Driver # # # VOP Bus Driver # # # Intel MIC Host Driver # # # Intel MIC Card Driver # # # SCIF Driver # # # Intel MIC Coprocessor State Management (COSM) Drivers # # # VOP Driver # # CONFIG_ECHO is not set # CONFIG_CXL_BASE is not set # CONFIG_CXL_AFU_DRIVER_OPS is not set CONFIG_HAVE_IDE=y # CONFIG_IDE is not set # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_NETLINK is not set CONFIG_SCSI_MQ_DEFAULT=y CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set # CONFIG_CHR_DEV_OSST is not set CONFIG_BLK_DEV_SR=y CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_CHR_DEV_SCH=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y CONFIG_SCSI_SCAN_ASYNC=y # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_CXGB3_ISCSI is not set # CONFIG_SCSI_CXGB4_ISCSI is not set # CONFIG_SCSI_BNX2_ISCSI is not set # CONFIG_BE2ISCSI is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_HPSA is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_3W_SAS is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set # CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set # CONFIG_SCSI_SMARTPQI is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_STEX is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_IPR is not set # CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLA_ISCSI is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_AM53C974 is not set # CONFIG_SCSI_NSP32 is not set # CONFIG_SCSI_WD719X is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_PMCRAID is not set # CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_VIRTIO is not set # CONFIG_SCSI_DH is not set CONFIG_SCSI_OSD_INITIATOR=m CONFIG_SCSI_OSD_ULD=m CONFIG_SCSI_OSD_DPRINT_SENSE=1 # CONFIG_SCSI_OSD_DEBUG is not set CONFIG_ATA=y # CONFIG_ATA_NONSTANDARD is not set CONFIG_ATA_VERBOSE_ERROR=y CONFIG_SATA_PMP=y # # Controllers with non-SFF native interface # # CONFIG_SATA_AHCI is not set # CONFIG_SATA_AHCI_PLATFORM is not set # CONFIG_AHCI_CEVA is not set # CONFIG_AHCI_QORIQ is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set CONFIG_ATA_SFF=y # # SFF controllers with custom DMA interface # # CONFIG_PDC_ADMA is not set # CONFIG_SATA_QSTOR is not set # CONFIG_SATA_SX4 is not set CONFIG_ATA_BMDMA=y # # SATA SFF controllers with BMDMA # # CONFIG_ATA_PIIX is not set # CONFIG_SATA_MV is not set # CONFIG_SATA_NV is not set # CONFIG_SATA_PROMISE is not set # CONFIG_SATA_SIL is not set # CONFIG_SATA_SIS is not set # CONFIG_SATA_SVW is not set # CONFIG_SATA_ULI is not set # CONFIG_SATA_VIA is not set # CONFIG_SATA_VITESSE is not set # # PATA SFF controllers with BMDMA # # CONFIG_PATA_ALI is not set # CONFIG_PATA_AMD is not set # CONFIG_PATA_ARTOP is not set # CONFIG_PATA_ATIIXP is not set # CONFIG_PATA_ATP867X is not set # CONFIG_PATA_CMD64X is not set # CONFIG_PATA_CYPRESS is not set # CONFIG_PATA_EFAR is not set # CONFIG_PATA_HPT366 is not set # CONFIG_PATA_HPT37X is not set # CONFIG_PATA_HPT3X2N is not set # CONFIG_PATA_HPT3X3 is not set # CONFIG_PATA_IT8213 is not set # CONFIG_PATA_IT821X is not set # CONFIG_PATA_JMICRON is not set # CONFIG_PATA_MARVELL is not set # CONFIG_PATA_NETCELL is not set # CONFIG_PATA_NINJA32 is not set # CONFIG_PATA_NS87415 is not set # CONFIG_PATA_OLDPIIX is not set # CONFIG_PATA_OPTIDMA is not set # CONFIG_PATA_PDC2027X is not set # CONFIG_PATA_PDC_OLD is not set # CONFIG_PATA_RADISYS is not set # CONFIG_PATA_RDC is not set # CONFIG_PATA_SCH is not set # CONFIG_PATA_SERVERWORKS is not set # CONFIG_PATA_SIL680 is not set # CONFIG_PATA_SIS is not set # CONFIG_PATA_TOSHIBA is not set # CONFIG_PATA_TRIFLEX is not set # CONFIG_PATA_VIA is not set # CONFIG_PATA_WINBOND is not set # # PIO-only SFF controllers # # CONFIG_PATA_CMD640_PCI is not set # CONFIG_PATA_MPIIX is not set # CONFIG_PATA_NS87410 is not set # CONFIG_PATA_OPTI is not set # CONFIG_PATA_PLATFORM is not set # CONFIG_PATA_RZ1000 is not set # # Generic fallback / legacy drivers # # CONFIG_ATA_GENERIC is not set # CONFIG_PATA_LEGACY is not set CONFIG_MD=y CONFIG_BLK_DEV_MD=m CONFIG_MD_LINEAR=m CONFIG_MD_RAID0=m CONFIG_MD_RAID1=m CONFIG_MD_RAID10=m CONFIG_MD_RAID456=m CONFIG_MD_MULTIPATH=m CONFIG_MD_FAULTY=m CONFIG_BCACHE=m # CONFIG_BCACHE_DEBUG is not set # CONFIG_BCACHE_CLOSURES_DEBUG is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m CONFIG_DM_MQ_DEFAULT=y CONFIG_DM_DEBUG=y CONFIG_DM_BUFIO=m CONFIG_DM_DEBUG_BLOCK_STACK_TRACING=y CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m CONFIG_DM_CRYPT=m CONFIG_DM_SNAPSHOT=m CONFIG_DM_THIN_PROVISIONING=m CONFIG_DM_CACHE=m CONFIG_DM_CACHE_SMQ=m CONFIG_DM_CACHE_CLEANER=m CONFIG_DM_ERA=m CONFIG_DM_MIRROR=m CONFIG_DM_LOG_USERSPACE=m CONFIG_DM_RAID=m CONFIG_DM_ZERO=m CONFIG_DM_MULTIPATH=m CONFIG_DM_MULTIPATH_QL=m CONFIG_DM_MULTIPATH_ST=m CONFIG_DM_DELAY=m CONFIG_DM_UEVENT=y CONFIG_DM_FLAKEY=m CONFIG_DM_VERITY=m CONFIG_DM_VERITY_FEC=y # CONFIG_DM_SWITCH is not set CONFIG_DM_LOG_WRITES=m CONFIG_DM_VERITY_AVB=m # CONFIG_DM_ANDROID_VERITY_AT_MOST_ONCE_DEFAULT_ENABLED is not set # CONFIG_DM_BOW is not set # CONFIG_TARGET_CORE is not set # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # # CONFIG_FIREWIRE is not set # CONFIG_FIREWIRE_NOSY is not set CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y CONFIG_BONDING=m CONFIG_DUMMY=m CONFIG_EQUALIZER=m # CONFIG_NET_FC is not set CONFIG_NET_TEAM=m CONFIG_NET_TEAM_MODE_BROADCAST=m CONFIG_NET_TEAM_MODE_ROUNDROBIN=m CONFIG_NET_TEAM_MODE_RANDOM=m CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m CONFIG_NET_TEAM_MODE_LOADBALANCE=m CONFIG_MACVLAN=m CONFIG_MACVTAP=m CONFIG_IPVLAN=m CONFIG_VXLAN=m CONFIG_GENEVE=m CONFIG_GTP=m CONFIG_MACSEC=m CONFIG_NETCONSOLE=m # CONFIG_NETCONSOLE_DYNAMIC is not set CONFIG_NETPOLL=y CONFIG_NET_POLL_CONTROLLER=y CONFIG_TUN=m CONFIG_TUN_VNET_CROSS_LE=y CONFIG_VETH=y CONFIG_VIRTIO_NET=m # CONFIG_NLMON is not set # CONFIG_ARCNET is not set # # CAIF transport drivers # # # Distributed Switch Architecture drivers # CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set # CONFIG_NET_VENDOR_AGERE is not set # CONFIG_NET_VENDOR_ALTEON is not set # CONFIG_ALTERA_TSE is not set # CONFIG_NET_VENDOR_AMAZON is not set # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_ARC is not set # CONFIG_NET_VENDOR_ATHEROS is not set # CONFIG_NET_VENDOR_AURORA is not set # CONFIG_NET_CADENCE is not set # CONFIG_NET_VENDOR_BROADCOM is not set # CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CIRRUS is not set # CONFIG_NET_VENDOR_CISCO is not set # CONFIG_DM9000 is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set # CONFIG_NET_VENDOR_EZCHIP is not set # CONFIG_NET_VENDOR_EXAR is not set # CONFIG_NET_VENDOR_FARADAY is not set # CONFIG_NET_VENDOR_HISILICON is not set # CONFIG_NET_VENDOR_HP is not set CONFIG_NET_VENDOR_INTEL=y # CONFIG_E100 is not set # CONFIG_E1000 is not set # CONFIG_E1000E is not set # CONFIG_IGB is not set # CONFIG_IGBVF is not set # CONFIG_IXGB is not set # CONFIG_IXGBE is not set # CONFIG_IXGBEVF is not set # CONFIG_I40E is not set # CONFIG_I40EVF is not set # CONFIG_FM10K is not set CONFIG_NET_VENDOR_I825XX=y # CONFIG_JME is not set CONFIG_NET_VENDOR_MARVELL=y # CONFIG_MVMDIO is not set # CONFIG_MVNETA_BM is not set # CONFIG_SKGE is not set # CONFIG_SKY2 is not set # CONFIG_NET_VENDOR_MELLANOX is not set CONFIG_NET_VENDOR_MICREL=y # CONFIG_KS8851 is not set # CONFIG_KS8851_MLL is not set # CONFIG_KSZ884X_PCI is not set CONFIG_NET_VENDOR_MICROCHIP=y # CONFIG_ENC28J60 is not set # CONFIG_ENCX24J600 is not set # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set CONFIG_NET_VENDOR_NATSEMI=y # CONFIG_NATSEMI is not set # CONFIG_NS83820 is not set CONFIG_NET_VENDOR_NETRONOME=y # CONFIG_NFP_NETVF is not set CONFIG_NET_VENDOR_8390=y # CONFIG_AX88796 is not set # CONFIG_NE2K_PCI is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set # CONFIG_NET_PACKET_ENGINE is not set # CONFIG_NET_VENDOR_QLOGIC is not set CONFIG_NET_VENDOR_QUALCOMM=y # CONFIG_QCA7000 is not set # CONFIG_QCOM_EMAC is not set CONFIG_NET_VENDOR_REALTEK=y # CONFIG_8139CP is not set # CONFIG_8139TOO is not set CONFIG_R8169=m CONFIG_NET_VENDOR_RENESAS=y # CONFIG_NET_VENDOR_RDC is not set CONFIG_NET_VENDOR_ROCKER=y CONFIG_NET_VENDOR_SAMSUNG=y # CONFIG_SXGBE_ETH is not set CONFIG_NET_VENDOR_SEEQ=y # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set # CONFIG_SFC is not set CONFIG_NET_VENDOR_SMSC=y # CONFIG_SMC91X is not set # CONFIG_EPIC100 is not set # CONFIG_SMC911X is not set # CONFIG_SMSC911X is not set # CONFIG_SMSC9420 is not set CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=y CONFIG_STMMAC_PLATFORM=y CONFIG_STMMAC_JL2XX1=y CONFIG_DWMAC_GENERIC=y CONFIG_DWMAC_MESON=y CONFIG_AMLOGIC_ETH_PRIVE=y # CONFIG_STMMAC_PCI is not set # CONFIG_NET_VENDOR_SUN is not set CONFIG_NET_VENDOR_SYNOPSYS=y # CONFIG_SYNOPSYS_DWC_ETH_QOS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set CONFIG_NET_VENDOR_VIA=y # CONFIG_VIA_RHINE is not set # CONFIG_VIA_VELOCITY is not set CONFIG_NET_VENDOR_WIZNET=y # CONFIG_WIZNET_W5100 is not set # CONFIG_WIZNET_W5300 is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set CONFIG_PHYLIB=y CONFIG_SWPHY=y # # MDIO bus device drivers # # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MDIO_BITBANG is not set # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # CONFIG_MDIO_HISI_FEMAC is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_AQUANTIA_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_BROADCOM_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set CONFIG_FIXED_PHY=y CONFIG_ICPLUS_PHY=y # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MICREL_PHY is not set CONFIG_MICROCHIP_PHY=m # CONFIG_MICROSEMI_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_QSEMI_PHY is not set CONFIG_REALTEK_PHY=y CONFIG_MAXIO_PHY=y # CONFIG_SMSC_PHY is not set # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set CONFIG_PPP=m CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m CONFIG_PPP_FILTER=y CONFIG_PPP_MPPE=m CONFIG_PPP_MULTILINK=y CONFIG_PPPOE=m CONFIG_PPPOLAC=m CONFIG_PPPOPNS=m CONFIG_PPP_ASYNC=m CONFIG_PPP_SYNC_TTY=m CONFIG_SLIP=m CONFIG_SLHC=m CONFIG_SLIP_COMPRESSED=y CONFIG_SLIP_SMART=y CONFIG_SLIP_MODE_SLIP6=y CONFIG_USB_NET_DRIVERS=y CONFIG_USB_CATC=m CONFIG_USB_KAWETH=m CONFIG_USB_PEGASUS=m CONFIG_USB_RTL8150=m # CONFIG_USB_RTL8152 is not set CONFIG_USB_LAN78XX=m CONFIG_USB_USBNET=m CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m CONFIG_USB_NET_CDC_EEM=m CONFIG_USB_NET_CDC_NCM=m CONFIG_USB_NET_HUAWEI_CDC_NCM=m CONFIG_USB_NET_CDC_MBIM=m CONFIG_USB_NET_DM9601=m CONFIG_USB_NET_SR9700=m CONFIG_USB_NET_SR9800=m CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=m CONFIG_USB_NET_GL620A=m CONFIG_USB_NET_NET1080=m CONFIG_USB_NET_PLUSB=m CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m CONFIG_USB_NET_CDC_SUBSET_ENABLE=m CONFIG_USB_NET_CDC_SUBSET=m CONFIG_USB_ALI_M5632=y CONFIG_USB_AN2720=y CONFIG_USB_BELKIN=y CONFIG_USB_ARMLINUX=y CONFIG_USB_EPSON2888=y CONFIG_USB_KC2190=y CONFIG_USB_NET_ZAURUS=m CONFIG_USB_NET_CX82310_ETH=m CONFIG_USB_NET_KALMIA=m CONFIG_USB_NET_QMI_WWAN=m CONFIG_USB_HSO=m CONFIG_USB_NET_INT51X1=m CONFIG_USB_IPHETH=m CONFIG_USB_SIERRA_NET=m CONFIG_USB_VL600=m CONFIG_USB_NET_CH9200=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y # CONFIG_ADM8211 is not set CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set # CONFIG_ATH5K is not set # CONFIG_ATH5K_PCI is not set CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m # CONFIG_ATH9K_PCI is not set # CONFIG_ATH9K_AHB is not set # CONFIG_ATH9K_DEBUGFS is not set # CONFIG_ATH9K_DYNACK is not set # CONFIG_ATH9K_WOW is not set CONFIG_ATH9K_RFKILL=y # CONFIG_ATH9K_CHANNEL_CONTEXT is not set CONFIG_ATH9K_PCOEM=y CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set # CONFIG_ATH9K_HWRNG is not set CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y # CONFIG_CARL9170_HWRNG is not set # CONFIG_ATH6KL is not set CONFIG_AR5523=m # CONFIG_WIL6210 is not set CONFIG_ATH10K=m # CONFIG_ATH10K_PCI is not set # CONFIG_ATH10K_DEBUG is not set # CONFIG_ATH10K_DEBUGFS is not set # CONFIG_ATH10K_TRACING is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set CONFIG_WLAN_VENDOR_ATMEL=y # CONFIG_ATMEL is not set CONFIG_AT76C50X_USB=m CONFIG_WLAN_VENDOR_BROADCOM=y # CONFIG_B43 is not set # CONFIG_B43LEGACY is not set # CONFIG_BRCMSMAC is not set # CONFIG_BRCMFMAC is not set CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y # CONFIG_IPW2100 is not set # CONFIG_IPW2200 is not set # CONFIG_IWL4965 is not set # CONFIG_IWL3945 is not set # CONFIG_IWLWIFI is not set CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_HOSTAP is not set # CONFIG_HERMES is not set # CONFIG_P54_COMMON is not set # CONFIG_PRISM54 is not set CONFIG_WLAN_VENDOR_MARVELL=y # CONFIG_LIBERTAS is not set # CONFIG_LIBERTAS_THINFIRM is not set # CONFIG_MWIFIEX is not set # CONFIG_MWL8K is not set CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m # CONFIG_RT2400PCI is not set # CONFIG_RT2500PCI is not set # CONFIG_RT61PCI is not set # CONFIG_RT2800PCI is not set CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WLAN_VENDOR_REALTEK=y # CONFIG_RTL8180 is not set CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y CONFIG_RTL_CARDS=y # CONFIG_RTL8192CE is not set # CONFIG_RTL8192SE is not set # CONFIG_RTL8192DE is not set # CONFIG_RTL8723AE is not set # CONFIG_RTL8723BE is not set # CONFIG_RTL8188EE is not set # CONFIG_RTL8192EE is not set # CONFIG_RTL8821AE is not set # CONFIG_RTL8192CU is not set CONFIG_RTL8XXXU=m CONFIG_RTL8XXXU_UNTESTED=y CONFIG_WLAN_VENDOR_RSI=y # CONFIG_RSI_91X is not set CONFIG_WLAN_VENDOR_ST=y # CONFIG_CW1200 is not set CONFIG_WLAN_VENDOR_TI=y # CONFIG_WL1251 is not set # CONFIG_WL12XX is not set # CONFIG_WL18XX is not set # CONFIG_WLCORE is not set CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_USB_ZD1201=m CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set # CONFIG_VMXNET3 is not set # CONFIG_ISDN is not set # CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y CONFIG_INPUT_POLLDEV=y # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y CONFIG_INPUT_MOUSEDEV_PSAUX=y CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=m CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # CONFIG_INPUT_KEYRESET is not set # CONFIG_INPUT_KEYCOMBO is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADC is not set # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_LKKBD is not set # CONFIG_KEYBOARD_GPIO is not set # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y CONFIG_MOUSE_PS2_ALPS=y CONFIG_MOUSE_PS2_BYD=y CONFIG_MOUSE_PS2_LOGIPS2PP=y CONFIG_MOUSE_PS2_SYNAPTICS=y CONFIG_MOUSE_PS2_CYPRESS=y CONFIG_MOUSE_PS2_TRACKPOINT=y # CONFIG_MOUSE_PS2_ELANTECH is not set # CONFIG_MOUSE_PS2_SENTELIC is not set # CONFIG_MOUSE_PS2_TOUCHKIT is not set CONFIG_MOUSE_PS2_FOCALTECH=y # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set # CONFIG_MOUSE_CYAPA is not set # CONFIG_MOUSE_ELAN_I2C is not set # CONFIG_MOUSE_VSXXXAA is not set # CONFIG_MOUSE_GPIO is not set # CONFIG_MOUSE_SYNAPTICS_I2C is not set # CONFIG_MOUSE_SYNAPTICS_USB is not set CONFIG_INPUT_JOYSTICK=y CONFIG_JOYSTICK_ANALOG=m CONFIG_JOYSTICK_A3D=m CONFIG_JOYSTICK_ADI=m CONFIG_JOYSTICK_COBRA=m CONFIG_JOYSTICK_GF2K=m CONFIG_JOYSTICK_GRIP=m CONFIG_JOYSTICK_GRIP_MP=m CONFIG_JOYSTICK_GUILLEMOT=m CONFIG_JOYSTICK_INTERACT=m CONFIG_JOYSTICK_SIDEWINDER=m CONFIG_JOYSTICK_TMDC=m CONFIG_JOYSTICK_IFORCE=m CONFIG_JOYSTICK_IFORCE_USB=y CONFIG_JOYSTICK_IFORCE_232=y CONFIG_JOYSTICK_WARRIOR=m CONFIG_JOYSTICK_MAGELLAN=m CONFIG_JOYSTICK_SPACEORB=m CONFIG_JOYSTICK_SPACEBALL=m CONFIG_JOYSTICK_STINGER=m CONFIG_JOYSTICK_TWIDJOY=m CONFIG_JOYSTICK_ZHENHUA=m CONFIG_JOYSTICK_AS5011=m CONFIG_JOYSTICK_JOYDUMP=m CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_PROPERTIES=y CONFIG_TOUCHSCREEN_ADS7846=m # CONFIG_TOUCHSCREEN_AD7877 is not set # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_AR1021_I2C is not set # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set # CONFIG_TOUCHSCREEN_EGALAX is not set # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set # CONFIG_TOUCHSCREEN_ELAN is not set # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set # CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set # CONFIG_TOUCHSCREEN_WM97XX is not set # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2004 is not set # CONFIG_TOUCHSCREEN_TSC2005 is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_RM_TS is not set # CONFIG_TOUCHSCREEN_SILEAD is not set # CONFIG_TOUCHSCREEN_SIS_I2C is not set # CONFIG_TOUCHSCREEN_ST1232 is not set # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set # CONFIG_TOUCHSCREEN_SX8654 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set CONFIG_TOUCHSCREEN_DWAV_USB_MT=m # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_MPU3050 is not set # CONFIG_INPUT_GP2A is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_TILT_POLLED is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_GPIO is not set # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_RMI4_CORE is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_AMBAKMI is not set # CONFIG_SERIO_PCIPS2 is not set CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_USERIO is not set CONFIG_GAMEPORT=m # CONFIG_GAMEPORT_NS558 is not set # CONFIG_GAMEPORT_L4 is not set # CONFIG_GAMEPORT_EMU10K1 is not set # CONFIG_GAMEPORT_FM801 is not set # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_NOZOMI is not set # CONFIG_N_GSM is not set # CONFIG_TRACE_SINK is not set # CONFIG_LDISC_AUTOLOAD is not set CONFIG_DEVMEM=y CONFIG_DEVKMEM=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y # CONFIG_SERIAL_8250 is not set # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set # CONFIG_SERIAL_AMBA_PL011 is not set # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MESON is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_BCM63XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_IFX6X60 is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_RP2 is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_ST_ASC is not set # CONFIG_SERIAL_STM32 is not set # CONFIG_TTY_PRINTK is not set CONFIG_HVC_DRIVER=y # CONFIG_HVC_DCC is not set CONFIG_VIRTIO_CONSOLE=m # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_VIRTIO is not set CONFIG_HW_RANDOM_MESON=y # CONFIG_APPLICOM is not set # CONFIG_RAW_DRIVER is not set # CONFIG_TCG_TPM is not set CONFIG_DEVPORT=y # CONFIG_XILLYBUS is not set # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set # CONFIG_I2C_MUX_PINCTRL is not set # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_DEMUX_PINCTRL is not set CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # PC SMBus host controller drivers # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_ISCH is not set # CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CBUS_GPIO is not set # CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_DESIGNWARE_PCI is not set # CONFIG_I2C_EMEV2 is not set # CONFIG_I2C_GPIO is not set # CONFIG_I2C_MESON is not set # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_PXA_PCI is not set # CONFIG_I2C_RK3X is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set CONFIG_SPI=y CONFIG_SPI_DEBUG=y CONFIG_SPI_MASTER=y # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set CONFIG_SPI_BITBANG=y # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_DESIGNWARE is not set CONFIG_SPI_GPIO=y # CONFIG_SPI_FSL_SPI is not set CONFIG_SPI_MESON_SPICC=m CONFIG_SPI_MESON_SPIFC=m # CONFIG_SPI_OC_TINY is not set # CONFIG_SPI_PL022 is not set # CONFIG_SPI_PXA2XX is not set # CONFIG_SPI_PXA2XX_PCI is not set # CONFIG_SPI_ROCKCHIP is not set # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=m # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_DYNAMIC is not set # CONFIG_SPMI is not set # CONFIG_HSI is not set # # PPS support # CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # CONFIG_PINCTRL=y # # Pin controllers # CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_AMD is not set # CONFIG_PINCTRL_SINGLE is not set CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y CONFIG_GPIOLIB=y CONFIG_OF_GPIO=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_DWAPB is not set # CONFIG_GPIO_EM is not set # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_MPC8XXX is not set # CONFIG_GPIO_PL061 is not set # CONFIG_GPIO_SYSCON is not set # CONFIG_GPIO_VX855 is not set # CONFIG_GPIO_XILINX is not set # CONFIG_GPIO_ZEVIO is not set # CONFIG_GPIO_ZX is not set # # I2C GPIO expanders # # CONFIG_GPIO_ADP5588 is not set # CONFIG_GPIO_ADNP is not set # CONFIG_GPIO_MAX7300 is not set # CONFIG_GPIO_MAX732X is not set CONFIG_GPIO_PCA953X=y # CONFIG_GPIO_PCA953X_IRQ is not set CONFIG_GPIO_PCF857X=m # CONFIG_GPIO_SX150X is not set # CONFIG_GPIO_TPIC2810 is not set # CONFIG_GPIO_TS4900 is not set # # MFD GPIO expanders # # CONFIG_HTC_EGPIO is not set # # PCI GPIO expanders # # CONFIG_GPIO_AMD8111 is not set # CONFIG_GPIO_BT8XX is not set # CONFIG_GPIO_ML_IOH is not set # CONFIG_GPIO_RDC321X is not set # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # # SPI or I2C GPIO expanders # # CONFIG_GPIO_MCP23S08 is not set # # USB GPIO expanders # CONFIG_W1=m CONFIG_W1_CON=y # # 1-wire Bus Masters # # CONFIG_W1_MASTER_MATROX is not set # CONFIG_W1_MASTER_DS2490 is not set # CONFIG_W1_MASTER_DS2482 is not set # CONFIG_W1_MASTER_DS1WM is not set CONFIG_W1_MASTER_GPIO=m # # 1-wire Slaves # CONFIG_W1_SLAVE_THERM=m # CONFIG_W1_SLAVE_SMEM is not set # CONFIG_W1_SLAVE_DS2408 is not set # CONFIG_W1_SLAVE_DS2413 is not set # CONFIG_W1_SLAVE_DS2406 is not set # CONFIG_W1_SLAVE_DS2423 is not set # CONFIG_W1_SLAVE_DS2431 is not set # CONFIG_W1_SLAVE_DS2433 is not set # CONFIG_W1_SLAVE_DS2760 is not set # CONFIG_W1_SLAVE_DS2780 is not set # CONFIG_W1_SLAVE_DS2781 is not set # CONFIG_W1_SLAVE_DS28E04 is not set # CONFIG_W1_SLAVE_BQ27000 is not set # CONFIG_POWER_AVS is not set CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_BRCMKONA is not set # CONFIG_POWER_RESET_BRCMSTB is not set # CONFIG_POWER_RESET_GPIO is not set # CONFIG_POWER_RESET_GPIO_RESTART is not set # CONFIG_POWER_RESET_LTC2952 is not set # CONFIG_POWER_RESET_RESTART is not set # CONFIG_POWER_RESET_VERSATILE is not set # CONFIG_POWER_RESET_SYSCON is not set # CONFIG_POWER_RESET_SYSCON_POWEROFF is not set # CONFIG_SYSCON_REBOOT_MODE is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_TEST_POWER is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_CHARGER_RT9455 is not set CONFIG_HWMON=y # CONFIG_HWMON_VID is not set # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_ARM_SCPI is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_I5K_AMB is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_GPIO_FAN is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IIO_HWMON is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set CONFIG_SENSORS_PWM_FAN=y # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH56XX_COMMON is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS1015 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_VT8231 is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y CONFIG_THERMAL_WRITABLE_TRIPS=y CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set CONFIG_THERMAL_GOV_FAIR_SHARE=y CONFIG_THERMAL_GOV_STEP_WISE=y CONFIG_THERMAL_GOV_BANG_BANG=y CONFIG_THERMAL_GOV_USER_SPACE=y CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y CONFIG_CPU_THERMAL=y # CONFIG_CLOCK_THERMAL is not set CONFIG_DEVFREQ_THERMAL=y # CONFIG_THERMAL_EMULATION is not set # CONFIG_QORIQ_THERMAL is not set # # ACPI INT340X thermal drivers # # CONFIG_GENERIC_ADC_THERMAL is not set CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set # CONFIG_WATCHDOG_SYSFS is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_MESON_GXBB_WATCHDOG is not set # CONFIG_MESON_WATCHDOG is not set # CONFIG_ALIM7101_WDT is not set # CONFIG_I6300ESB_WDT is not set # CONFIG_MEN_A21_WDT is not set # # PCI-based Watchdog Cards # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set CONFIG_SSB_POSSIBLE=y # # Sonics Silicon Backplane # # CONFIG_SSB is not set CONFIG_BCMA_POSSIBLE=y # # Broadcom specific AMBA # # CONFIG_BCMA is not set # # Multifunction device drivers # CONFIG_MFD_CORE=m # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_CROS_EC is not set # CONFIG_MFD_ASIC3 is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_EXYNOS_LPASS is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_INTEL_SOC_PMIC is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77620 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_UCB1400_CORE is not set # CONFIG_MFD_PM8921_CORE is not set # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_RTSX_PCI is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RTSX_USB is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_RK808 is not set # CONFIG_MFD_RN5T618 is not set # CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_SMSC is not set # CONFIG_ABX500_CORE is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_MFD_TPS80031 is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TC3589X is not set # CONFIG_MFD_TMIO is not set # CONFIG_MFD_T7L66XB is not set # CONFIG_MFD_TC6387XB is not set # CONFIG_MFD_TC6393XB is not set # CONFIG_MFD_VX855 is not set # CONFIG_MFD_ARIZONA_I2C is not set # CONFIG_MFD_ARIZONA_SPI is not set # CONFIG_MFD_WM8400 is not set # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_ANATOP is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set # CONFIG_REGULATOR_GPIO is not set # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set CONFIG_REGULATOR_PWM=y # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS6524X is not set CONFIG_MEDIA_SUPPORT=m # # Multimedia core support # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y # CONFIG_MEDIA_RADIO_SUPPORT is not set CONFIG_MEDIA_SDR_SUPPORT=y CONFIG_MEDIA_RC_SUPPORT=y CONFIG_MEDIA_CONTROLLER=y CONFIG_MEDIA_CONTROLLER_DVB=y CONFIG_VIDEO_DEV=m CONFIG_VIDEO_V4L2_SUBDEV_API=y CONFIG_VIDEO_V4L2=m # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set # CONFIG_VIDEO_PCI_SKELETON is not set CONFIG_VIDEO_TUNER=m CONFIG_V4L2_MEM2MEM_DEV=m CONFIG_VIDEOBUF_GEN=m CONFIG_VIDEOBUF_VMALLOC=m CONFIG_VIDEOBUF_DVB=m CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_DMA_CONTIG=m CONFIG_VIDEOBUF2_VMALLOC=m CONFIG_DVB_CORE=m CONFIG_DVB_NET=y CONFIG_TTPCI_EEPROM=m CONFIG_DVB_MAX_ADAPTERS=8 # CONFIG_DVB_DYNAMIC_MINORS is not set # # Media drivers # CONFIG_RC_CORE=m CONFIG_RC_MAP=m CONFIG_RC_DECODERS=y CONFIG_IR_IRMP_DECODER=m CONFIG_LIRC=m CONFIG_IR_LIRC_CODEC=m CONFIG_IR_NEC_DECODER=m CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_SONY_DECODER=m CONFIG_IR_SANYO_DECODER=m CONFIG_IR_SHARP_DECODER=m CONFIG_IR_MCE_KBD_DECODER=m CONFIG_IR_XMP_DECODER=m CONFIG_RC_DEVICES=y CONFIG_RC_ATI_REMOTE=m # CONFIG_IR_HIX5HD2 is not set # CONFIG_IR_IMON is not set CONFIG_IR_MCEUSB=m CONFIG_IR_MESON=m # CONFIG_IR_REDRAT3 is not set # CONFIG_IR_STREAMZAP is not set # CONFIG_IR_IGORPLUGUSB is not set # CONFIG_IR_IGUANA is not set # CONFIG_IR_TTUSBIR is not set # CONFIG_RC_LOOPBACK is not set CONFIG_IR_GPIO_CIR=m CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # CONFIG_USB_VIDEO_CLASS=m CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y CONFIG_USB_GSPCA=m CONFIG_USB_M5602=m CONFIG_USB_STV06XX=m CONFIG_USB_GL860=m CONFIG_USB_GSPCA_BENQ=m CONFIG_USB_GSPCA_CONEX=m CONFIG_USB_GSPCA_CPIA1=m CONFIG_USB_GSPCA_DTCS033=m CONFIG_USB_GSPCA_ETOMS=m CONFIG_USB_GSPCA_FINEPIX=m CONFIG_USB_GSPCA_JEILINJ=m CONFIG_USB_GSPCA_JL2005BCD=m CONFIG_USB_GSPCA_KINECT=m CONFIG_USB_GSPCA_KONICA=m CONFIG_USB_GSPCA_MARS=m CONFIG_USB_GSPCA_MR97310A=m CONFIG_USB_GSPCA_NW80X=m CONFIG_USB_GSPCA_OV519=m CONFIG_USB_GSPCA_OV534=m CONFIG_USB_GSPCA_OV534_9=m CONFIG_USB_GSPCA_PAC207=m CONFIG_USB_GSPCA_PAC7302=m CONFIG_USB_GSPCA_PAC7311=m CONFIG_USB_GSPCA_SE401=m CONFIG_USB_GSPCA_SN9C2028=m CONFIG_USB_GSPCA_SN9C20X=m CONFIG_USB_GSPCA_SONIXB=m CONFIG_USB_GSPCA_SONIXJ=m CONFIG_USB_GSPCA_SPCA500=m CONFIG_USB_GSPCA_SPCA501=m CONFIG_USB_GSPCA_SPCA505=m CONFIG_USB_GSPCA_SPCA506=m CONFIG_USB_GSPCA_SPCA508=m CONFIG_USB_GSPCA_SPCA561=m CONFIG_USB_GSPCA_SPCA1528=m CONFIG_USB_GSPCA_SQ905=m CONFIG_USB_GSPCA_SQ905C=m CONFIG_USB_GSPCA_SQ930X=m CONFIG_USB_GSPCA_STK014=m CONFIG_USB_GSPCA_STK1135=m CONFIG_USB_GSPCA_STV0680=m CONFIG_USB_GSPCA_SUNPLUS=m CONFIG_USB_GSPCA_T613=m CONFIG_USB_GSPCA_TOPRO=m CONFIG_USB_GSPCA_TOUPTEK=m CONFIG_USB_GSPCA_TV8532=m CONFIG_USB_GSPCA_VC032X=m CONFIG_USB_GSPCA_VICAM=m CONFIG_USB_GSPCA_XIRLINK_CIT=m CONFIG_USB_GSPCA_ZC3XX=m CONFIG_USB_PWC=m # CONFIG_USB_PWC_DEBUG is not set CONFIG_USB_PWC_INPUT_EVDEV=y CONFIG_VIDEO_CPIA2=m CONFIG_USB_ZR364XX=m CONFIG_USB_STKWEBCAM=m CONFIG_USB_S2255=m CONFIG_VIDEO_USBTV=m # # Analog TV USB devices # # CONFIG_VIDEO_PVRUSB2 is not set # CONFIG_VIDEO_HDPVR is not set # CONFIG_VIDEO_USBVISION is not set CONFIG_VIDEO_STK1160_COMMON=m # CONFIG_VIDEO_STK1160_AC97 is not set CONFIG_VIDEO_STK1160=m # CONFIG_VIDEO_GO7007 is not set # # Analog/digital TV USB devices # CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_AU0828_V4L2=y CONFIG_VIDEO_AU0828_RC=y CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y CONFIG_VIDEO_CX231XX_ALSA=m CONFIG_VIDEO_CX231XX_DVB=m CONFIG_VIDEO_TM6000=m CONFIG_VIDEO_TM6000_ALSA=m CONFIG_VIDEO_TM6000_DVB=m # # Digital TV USB devices # CONFIG_DVB_USB=m CONFIG_DVB_USB_DEBUG=y CONFIG_DVB_USB_DIB3000MC=m CONFIG_DVB_USB_A800=m CONFIG_DVB_USB_DIBUSB_MB=m CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y CONFIG_DVB_USB_DIBUSB_MC=m CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_CXUSB=m CONFIG_DVB_USB_M920X=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_VP7045=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_GP8PSK=m CONFIG_DVB_USB_NOVA_T_USB2=m CONFIG_DVB_USB_TTUSB2=m CONFIG_DVB_USB_DTT200U=m CONFIG_DVB_USB_OPERA1=m CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_DTV5100=m CONFIG_DVB_USB_FRIIO=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_V2=m CONFIG_DVB_USB_AF9015=m CONFIG_DVB_USB_AF9035=m CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_AZ6007=m CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_GL861=m CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m CONFIG_DVB_USB_DVBSKY=m # CONFIG_DVB_TTUSB_BUDGET is not set # CONFIG_DVB_TTUSB_DEC is not set CONFIG_SMS_USB_DRV=m CONFIG_DVB_B2C2_FLEXCOP_USB=m CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG=y CONFIG_DVB_AS102=m # # Webcam, TV (analog/digital) USB devices # CONFIG_VIDEO_EM28XX=m CONFIG_VIDEO_EM28XX_V4L2=m CONFIG_VIDEO_EM28XX_ALSA=m CONFIG_VIDEO_EM28XX_DVB=m # CONFIG_VIDEO_EM28XX_RC is not set # # Software defined radio USB devices # CONFIG_USB_AIRSPY=m CONFIG_USB_HACKRF=m CONFIG_USB_MSI2500=m # CONFIG_MEDIA_PCI_SUPPORT is not set # CONFIG_V4L_PLATFORM_DRIVERS is not set # CONFIG_V4L_MEM2MEM_DRIVERS is not set # CONFIG_V4L_TEST_DRIVERS is not set # CONFIG_DVB_PLATFORM_DRIVERS is not set # # Supported MMC/SDIO adapters # # CONFIG_SMS_SDIO_DRV is not set CONFIG_MEDIA_COMMON_OPTIONS=y # # common driver options # CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m CONFIG_CYPRESS_FIRMWARE=m CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_DVB_B2C2_FLEXCOP_DEBUG=y CONFIG_SMS_SIANO_MDTV=m CONFIG_SMS_SIANO_RC=y # # Media ancillary drivers (tuners, sensors, i2c, spi, frontends) # CONFIG_MEDIA_SUBDRV_AUTOSELECT=y CONFIG_MEDIA_ATTACH=y CONFIG_VIDEO_IR_I2C=m # # Audio decoders, processors and mixers # CONFIG_VIDEO_MSP3400=m # # RDS decoders # # # Video decoders # CONFIG_VIDEO_SAA711X=m CONFIG_VIDEO_TVP5150=m # # Video and audio decoders # CONFIG_VIDEO_CX25840=m # # Video encoders # # # Camera sensor devices # CONFIG_VIDEO_MT9V011=m # # Flash devices # # # Video improvement chips # # # Audio/Video compression chips # # # Miscellaneous helper chips # # # Sensors used on soc_camera driver # CONFIG_MEDIA_TUNER=m CONFIG_MEDIA_TUNER_SIMPLE=m CONFIG_MEDIA_TUNER_TDA8290=m CONFIG_MEDIA_TUNER_TDA827X=m CONFIG_MEDIA_TUNER_TDA18271=m CONFIG_MEDIA_TUNER_TDA18272=m CONFIG_MEDIA_TUNER_TDA9887=m CONFIG_MEDIA_TUNER_MSI001=m CONFIG_MEDIA_TUNER_MT20XX=m CONFIG_MEDIA_TUNER_MT2060=m CONFIG_MEDIA_TUNER_MT2063=m CONFIG_MEDIA_TUNER_MT2266=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_XC2028=m CONFIG_MEDIA_TUNER_XC5000=m CONFIG_MEDIA_TUNER_XC4000=m CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m CONFIG_MEDIA_TUNER_MC44S803=m CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_TDA18218=m CONFIG_MEDIA_TUNER_FC0011=m CONFIG_MEDIA_TUNER_FC0012=m CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_TDA18212=m CONFIG_MEDIA_TUNER_E4000=m CONFIG_MEDIA_TUNER_FC2580=m CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_MEDIA_TUNER_SI2157=m CONFIG_MEDIA_TUNER_IT913X=m CONFIG_MEDIA_TUNER_R820T=m CONFIG_MEDIA_TUNER_QM1D1C0042=m # # Multistandard (satellite) frontends # CONFIG_DVB_STB0899=m CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m CONFIG_DVB_STV6110x=m CONFIG_DVB_M88DS3103=m # # Multistandard (cable + terrestrial) frontends # CONFIG_DVB_DRXK=m CONFIG_DVB_TDA18271C2DD=m CONFIG_DVB_SI2165=m CONFIG_DVB_MN88472=m CONFIG_DVB_MN88473=m # # DVB-S (satellite) frontends # CONFIG_DVB_CX24123=m CONFIG_DVB_MT312=m CONFIG_DVB_ZL10039=m CONFIG_DVB_S5H1420=m CONFIG_DVB_STV0288=m CONFIG_DVB_STB6000=m CONFIG_DVB_STV0299=m CONFIG_DVB_STV6110=m CONFIG_DVB_STV0900=m CONFIG_DVB_TDA10086=m CONFIG_DVB_TUNER_ITD1000=m CONFIG_DVB_TUNER_CX24113=m CONFIG_DVB_TDA826X=m CONFIG_DVB_CX24116=m CONFIG_DVB_CX24120=m CONFIG_DVB_SI21XX=m CONFIG_DVB_TS2020=m CONFIG_DVB_DS3000=m CONFIG_DVB_TDA10071=m # # DVB-T (terrestrial) frontends # CONFIG_DVB_CX22702=m CONFIG_DVB_DRXD=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_NXT6000=m CONFIG_DVB_MT352=m CONFIG_DVB_ZL10353=m CONFIG_DVB_DIB3000MB=m CONFIG_DVB_DIB3000MC=m CONFIG_DVB_DIB7000M=m CONFIG_DVB_DIB7000P=m CONFIG_DVB_TDA10048=m CONFIG_DVB_AF9013=m CONFIG_DVB_EC100=m CONFIG_DVB_CXD2820R=m CONFIG_DVB_RTL2830=m CONFIG_DVB_RTL2832=m CONFIG_DVB_RTL2832_SDR=m CONFIG_DVB_SI2168=m CONFIG_DVB_AS102_FE=m CONFIG_DVB_GP8PSK_FE=m # # DVB-C (cable) frontends # CONFIG_DVB_TDA10023=m CONFIG_DVB_STV0297=m # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # CONFIG_DVB_NXT200X=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LGDT330X=m CONFIG_DVB_LGDT3305=m CONFIG_DVB_LGDT3306A=m CONFIG_DVB_LG2160=m CONFIG_DVB_S5H1409=m CONFIG_DVB_AU8522=m CONFIG_DVB_AU8522_DTV=m CONFIG_DVB_AU8522_V4L=m CONFIG_DVB_S5H1411=m # # ISDB-T (terrestrial) frontends # CONFIG_DVB_S921=m CONFIG_DVB_DIB8000=m CONFIG_DVB_MB86A20S=m # # ISDB-S (satellite) & ISDB-T (terrestrial) frontends # CONFIG_DVB_TC90522=m # # Digital terrestrial only tuners/PLL # CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m CONFIG_DVB_TUNER_DIB0090=m # # SEC control devices for DVB-S # CONFIG_DVB_DRX39XYJ=m CONFIG_DVB_LNBP21=m CONFIG_DVB_LNBP22=m CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m CONFIG_DVB_A8293=m CONFIG_DVB_SP2=m CONFIG_DVB_LGS8GXX=m CONFIG_DVB_ATBM8830=m CONFIG_DVB_IX2505V=m CONFIG_DVB_M88RS2000=m CONFIG_DVB_AF9033=m # # Tools to develop new frontends # # CONFIG_DVB_DUMMY_FE is not set # # Graphics support # # CONFIG_VGA_ARB is not set # CONFIG_IMX_IPUV3_CORE is not set CONFIG_DRM=y # CONFIG_DRM_DP_AUX_CHARDEV is not set CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_KMS_FB_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y # CONFIG_DRM_LOAD_EDID_FIRMWARE is not set # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_RADEON is not set # CONFIG_DRM_AMDGPU is not set # # ACP (Audio CoProcessor) Configuration # # CONFIG_DRM_NOUVEAU is not set # CONFIG_DRM_VGEM is not set # CONFIG_DRM_EXYNOS is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_AST is not set # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_ARMADA is not set # CONFIG_DRM_OMAP is not set # CONFIG_DRM_TILCDC is not set # CONFIG_DRM_QXL is not set # CONFIG_DRM_BOCHS is not set # CONFIG_DRM_VIRTIO_GPU is not set # CONFIG_DRM_FSL_DCU is not set CONFIG_DRM_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_DUMB_VGA_DAC is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_STI is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_LEGACY is not set # # Frame buffer Devices # CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y # CONFIG_FB_DDC is not set # CONFIG_FB_BOOT_VESA_SUPPORT is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y # CONFIG_FB_SVGALIB is not set # CONFIG_FB_MACMODES is not set CONFIG_FB_BACKLIGHT=y # CONFIG_FB_MODE_HELPERS is not set # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_UVESA is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_I740 is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_S3 is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VT8623 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_ARK is not set # CONFIG_FB_PM3 is not set # CONFIG_FB_CARMINE is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set # CONFIG_FB_BROADSHEET is not set # CONFIG_FB_AUO_K190X is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # CONFIG_FB_SM712 is not set CONFIG_BACKLIGHT_LCD_SUPPORT=y CONFIG_LCD_CLASS_DEVICE=m # CONFIG_LCD_L4F00242T03 is not set # CONFIG_LCD_LMS283GF05 is not set # CONFIG_LCD_LTV350QV is not set # CONFIG_LCD_ILI922X is not set # CONFIG_LCD_ILI9320 is not set # CONFIG_LCD_TDO24M is not set # CONFIG_LCD_VGG2432A4 is not set # CONFIG_LCD_PLATFORM is not set # CONFIG_LCD_S6E63M0 is not set # CONFIG_LCD_LD9040 is not set # CONFIG_LCD_AMS369FG06 is not set # CONFIG_LCD_LMS501KF03 is not set # CONFIG_LCD_HX8357 is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y CONFIG_BACKLIGHT_GENERIC=y # CONFIG_BACKLIGHT_PWM is not set # CONFIG_BACKLIGHT_PM8941_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_VGASTATE is not set CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=m CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_LOGO is not set CONFIG_SOUND=y CONFIG_SOUND_OSS_CORE=y CONFIG_SOUND_OSS_CORE_PRECLAIM=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_HWDEP=y CONFIG_SND_RAWMIDI=y CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y CONFIG_SND_SEQUENCER=y # CONFIG_SND_SEQ_DUMMY is not set CONFIG_SND_OSSEMUL=y CONFIG_SND_MIXER_OSS=m CONFIG_SND_PCM_OSS=m CONFIG_SND_PCM_OSS_PLUGINS=y CONFIG_SND_PCM_TIMER=y # CONFIG_SND_SEQUENCER_OSS is not set CONFIG_SND_HRTIMER=m CONFIG_SND_SEQ_HRTIMER_DEFAULT=y CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 CONFIG_SND_SUPPORT_OLD_API=y CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set # CONFIG_SND_DEBUG is not set CONFIG_SND_VMASTER=y CONFIG_SND_RAWMIDI_SEQ=y # CONFIG_SND_OPL3_LIB_SEQ is not set # CONFIG_SND_OPL4_LIB_SEQ is not set # CONFIG_SND_SBAWE_SEQ is not set # CONFIG_SND_EMU10K1_SEQ is not set CONFIG_SND_MPU401_UART=m CONFIG_SND_AC97_CODEC=m CONFIG_SND_DRIVERS=y CONFIG_SND_DUMMY=m CONFIG_SND_ALOOP=m # CONFIG_SND_VIRMIDI is not set CONFIG_SND_MTPAV=m CONFIG_SND_SERIAL_U16550=m CONFIG_SND_MPU401=m # CONFIG_SND_AC97_POWER_SAVE is not set CONFIG_SND_PCI=y # CONFIG_SND_AD1889 is not set # CONFIG_SND_ATIIXP is not set # CONFIG_SND_ATIIXP_MODEM is not set # CONFIG_SND_AU8810 is not set # CONFIG_SND_AU8820 is not set # CONFIG_SND_AU8830 is not set # CONFIG_SND_AW2 is not set # CONFIG_SND_BT87X is not set # CONFIG_SND_CA0106 is not set # CONFIG_SND_CMIPCI is not set # CONFIG_SND_OXYGEN is not set # CONFIG_SND_CS4281 is not set # CONFIG_SND_CS46XX is not set # CONFIG_SND_CTXFI is not set # CONFIG_SND_DARLA20 is not set # CONFIG_SND_GINA20 is not set # CONFIG_SND_LAYLA20 is not set # CONFIG_SND_DARLA24 is not set # CONFIG_SND_GINA24 is not set # CONFIG_SND_LAYLA24 is not set # CONFIG_SND_MONA is not set # CONFIG_SND_MIA is not set # CONFIG_SND_ECHO3G is not set # CONFIG_SND_INDIGO is not set # CONFIG_SND_INDIGOIO is not set # CONFIG_SND_INDIGODJ is not set # CONFIG_SND_INDIGOIOX is not set # CONFIG_SND_INDIGODJX is not set # CONFIG_SND_ENS1370 is not set # CONFIG_SND_ENS1371 is not set # CONFIG_SND_FM801 is not set # CONFIG_SND_HDSP is not set # CONFIG_SND_HDSPM is not set # CONFIG_SND_ICE1724 is not set # CONFIG_SND_INTEL8X0 is not set # CONFIG_SND_INTEL8X0M is not set # CONFIG_SND_KORG1212 is not set # CONFIG_SND_LOLA is not set # CONFIG_SND_LX6464ES is not set # CONFIG_SND_MIXART is not set # CONFIG_SND_NM256 is not set # CONFIG_SND_PCXHR is not set # CONFIG_SND_RIPTIDE is not set # CONFIG_SND_RME32 is not set # CONFIG_SND_RME96 is not set # CONFIG_SND_RME9652 is not set # CONFIG_SND_SE6X is not set # CONFIG_SND_VIA82XX is not set # CONFIG_SND_VIA82XX_MODEM is not set # CONFIG_SND_VIRTUOSO is not set # CONFIG_SND_VX222 is not set # CONFIG_SND_YMFPCI is not set # # HD-Audio # # CONFIG_SND_HDA_INTEL is not set CONFIG_SND_HDA_PREALLOC_SIZE=64 CONFIG_SND_ARM=y # CONFIG_SND_ARMAACI is not set CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y CONFIG_SND_USB_UA101=m CONFIG_SND_USB_CAIAQ=m CONFIG_SND_USB_CAIAQ_INPUT=y CONFIG_SND_USB_6FIRE=m CONFIG_SND_USB_HIFACE=m CONFIG_SND_BCD2000=m CONFIG_SND_USB_LINE6=m CONFIG_SND_USB_POD=m CONFIG_SND_USB_PODHD=m CONFIG_SND_USB_TONEPORT=m CONFIG_SND_USB_VARIAX=m CONFIG_SND_SOC=y # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # 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_IMX_AUDMUX is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_XTFPGA_I2S is not set CONFIG_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU7002 is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4554 is not set # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # CONFIG_SND_SOC_CS35L33 is not set # CONFIG_SND_SOC_CS42L51_I2C is not set # CONFIG_SND_SOC_CS42L52 is not set # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # CONFIG_SND_SOC_CS4271_SPI is not set # CONFIG_SND_SOC_CS42XX8_I2C is not set # CONFIG_SND_SOC_CS4349 is not set # CONFIG_SND_SOC_CS53L30 is not set # CONFIG_SND_SOC_ES8328 is not set CONFIG_SND_SOC_ES8388=y # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # 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_RL6231=y # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set CONFIG_SND_SOC_RT5651=y # CONFIG_SND_SOC_RT5677_SPI is not set # CONFIG_SND_SOC_SGTL5000 is not set # CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set CONFIG_SND_SOC_SPDIF=m # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC3X is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731 is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # 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_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_TPA6130A2 is not set CONFIG_AMLOGIC_SND_SOC_CODECS=y CONFIG_AMLOGIC_SND_CODEC_DUMMY_CODEC=y CONFIG_AMLOGIC_SND_CODEC_PCM2BT=y CONFIG_AMLOGIC_SND_CODEC_PDM_DUMMY_CODEC=y CONFIG_AMLOGIC_SND_CODEC_AMLT9015=y # CONFIG_AMLOGIC_SND_CODEC_AMLT9015S is not set # CONFIG_AMLOGIC_SND_CODEC_PMU3 is not set # CONFIG_AMLOGIC_SND_SOC_TAS5805 is not set CONFIG_AMLOGIC_SND_CODEC_TXLX_ACODEC=y # CONFIG_AMLOGIC_SND_CODEC_TL1_ACODEC is not set # CONFIG_AMLOGIC_SND_SOC_TAS5782M is not set CONFIG_AMLOGIC_SND_SOC_TAS5707=y CONFIG_AMLOGIC_SND_SOC_ES8316=y CONFIG_AMLOGIC_SND_SOC_TLV320ADC3101=y CONFIG_AMLOGIC_SND_SOC_PCM186X=y CONFIG_AMLOGIC_SND_SOC_SSM3525=y CONFIG_AMLOGIC_SND_SOC_SSM3515=y CONFIG_AMLOGIC_SND_SOC_TAS575X=y # CONFIG_AMLOGIC_SND_SOC_ES7243 is not set CONFIG_AMLOGIC_SND_SOC_AD82584F=y # CONFIG_AMLOGIC_SND_SOC_CS42528 is not set # CONFIG_SND_SIMPLE_CARD is not set # CONFIG_SND_SIMPLE_SCU_CARD is not set CONFIG_AMLOGIC_SND_SOC=y CONFIG_AMLOGIC_SND_SOC_MESON=y CONFIG_AMLOGIC_SND_SOC_AUGE=y CONFIG_AMLOGIC_SND_SPLIT_MODE=y # CONFIG_AMLOGIC_SND_SPLIT_MODE_MMAP is not set CONFIG_AMLOGIC_SND_SOC_COMMON=y # CONFIG_SOUND_PRIME is not set CONFIG_AC97_BUS=m # # HID support # CONFIG_HID=y CONFIG_HID_BATTERY_STRENGTH=y CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=m CONFIG_HID_ACRUX=m CONFIG_HID_ACRUX_FF=y CONFIG_HID_APPLE=m CONFIG_HID_APPLEIR=m CONFIG_HID_AUREAL=m CONFIG_HID_BELKIN=m CONFIG_HID_BETOP_FF=m CONFIG_HID_CHERRY=m CONFIG_HID_CHICONY=m CONFIG_HID_CORSAIR=m CONFIG_HID_PRODIKEYS=m CONFIG_HID_CMEDIA=m CONFIG_HID_CP2112=m CONFIG_HID_CYPRESS=m CONFIG_HID_DRAGONRISE=m CONFIG_DRAGONRISE_FF=y CONFIG_HID_EMS_FF=m CONFIG_HID_ELECOM=m CONFIG_HID_ELO=m CONFIG_HID_EZKEY=m CONFIG_HID_GEMBIRD=m CONFIG_HID_GFRM=m CONFIG_HID_HOLTEK=m CONFIG_HOLTEK_FF=y CONFIG_HID_GT683R=m CONFIG_HID_KEYTOUCH=m CONFIG_HID_KYE=m CONFIG_HID_UCLOGIC=m CONFIG_HID_WALTOP=m CONFIG_HID_GYRATION=m CONFIG_HID_ICADE=m CONFIG_HID_TWINHAN=m CONFIG_HID_KENSINGTON=m CONFIG_HID_LCPOWER=m CONFIG_HID_LED=m CONFIG_HID_LENOVO=m CONFIG_HID_LOGITECH=m CONFIG_HID_LOGITECH_DJ=m CONFIG_HID_LOGITECH_HIDPP=m CONFIG_LOGITECH_FF=y CONFIG_LOGIRUMBLEPAD2_FF=y CONFIG_LOGIG940_FF=y # CONFIG_LOGIWHEELS_FF is not set CONFIG_HID_MAGICMOUSE=m CONFIG_HID_MICROSOFT=m CONFIG_HID_MONTEREY=m CONFIG_HID_MULTITOUCH=m # CONFIG_HID_NINTENDO is not set CONFIG_HID_NTRIG=m CONFIG_HID_ORTEK=m CONFIG_HID_PANTHERLORD=m CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=m CONFIG_HID_PETALYNX=m CONFIG_HID_PICOLCD=m CONFIG_HID_PICOLCD_FB=y CONFIG_HID_PICOLCD_BACKLIGHT=y CONFIG_HID_PICOLCD_LCD=y CONFIG_HID_PICOLCD_LEDS=y CONFIG_HID_PICOLCD_CIR=y CONFIG_HID_PLANTRONICS=m CONFIG_HID_PLAYSTATION=m # CONFIG_PLAYSTATION_FF is not set CONFIG_HID_PRIMAX=m CONFIG_HID_ROCCAT=m CONFIG_HID_SAITEK=m CONFIG_HID_SAMSUNG=m CONFIG_HID_SONY=m CONFIG_SONY_FF=y CONFIG_HID_SPEEDLINK=m CONFIG_HID_STEAM=m CONFIG_HID_STEELSERIES=m CONFIG_HID_SUNPLUS=m CONFIG_HID_RMI=m CONFIG_HID_GREENASIA=m CONFIG_GREENASIA_FF=y CONFIG_HID_SMARTJOYPLUS=m CONFIG_SMARTJOYPLUS_FF=y CONFIG_HID_TIVO=m CONFIG_HID_TOPSEED=m CONFIG_HID_THINGM=m CONFIG_HID_THRUSTMASTER=m CONFIG_THRUSTMASTER_FF=y CONFIG_HID_WACOM=m CONFIG_HID_WIIMOTE=m CONFIG_HID_XINMO=m CONFIG_HID_XPADNEO=m CONFIG_HID_ZEROPLUS=m CONFIG_ZEROPLUS_FF=y CONFIG_HID_ZYDACRON=m CONFIG_HID_SENSOR_HUB=m CONFIG_HID_SENSOR_CUSTOM_SENSOR=m CONFIG_HID_ALPS=m # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # # I2C HID support # # CONFIG_I2C_HID is not set CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_OTG is not set # 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_MON is not set # CONFIG_USB_WUSB_CBAF is not set # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y CONFIG_USB_XHCI_PCI=y CONFIG_USB_XHCI_PLATFORM=y CONFIG_USB_EHCI_HCD=y # CONFIG_USB_EHCI_ROOT_HUB_TT is not set CONFIG_USB_EHCI_TT_NEWSCHED=y CONFIG_USB_EHCI_PCI=y # CONFIG_USB_EHCI_HCD_PLATFORM is not set # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_ISP1362_HCD is not set # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD_PCI=y # CONFIG_USB_OHCI_HCD_PLATFORM is not set # CONFIG_USB_UHCI_HCD is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=y # CONFIG_USB_PRINTER is not set CONFIG_USB_WDM=m # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set # CONFIG_USB_UAS is not set # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_MUSB_HDRC is not set CONFIG_USB_DWC3=y CONFIG_USB_DWC3_HOST=y # CONFIG_USB_DWC3_GADGET is not set # CONFIG_USB_DWC3_DUAL_ROLE is not set # # Platform Glue Driver Support # CONFIG_USB_DWC3_PCI=y CONFIG_USB_DWC3_OF_SIMPLE=y # CONFIG_USB_DWC2 is not set # CONFIG_USB_CHIPIDEA is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # CONFIG_USB_SERIAL=y CONFIG_USB_SERIAL_CONSOLE=y CONFIG_USB_SERIAL_GENERIC=y CONFIG_USB_SERIAL_SIMPLE=m CONFIG_USB_SERIAL_AIRCABLE=m CONFIG_USB_SERIAL_ARK3116=m CONFIG_USB_SERIAL_BELKIN=m CONFIG_USB_SERIAL_CH341=m CONFIG_USB_SERIAL_WHITEHEAT=m CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m CONFIG_USB_SERIAL_CP210X=m CONFIG_USB_SERIAL_CYPRESS_M8=m CONFIG_USB_SERIAL_EMPEG=m CONFIG_USB_SERIAL_FTDI_SIO=m CONFIG_USB_SERIAL_VISOR=m CONFIG_USB_SERIAL_IPAQ=m CONFIG_USB_SERIAL_IR=m CONFIG_USB_SERIAL_EDGEPORT=m CONFIG_USB_SERIAL_EDGEPORT_TI=m CONFIG_USB_SERIAL_F81232=m CONFIG_USB_SERIAL_GARMIN=m CONFIG_USB_SERIAL_IPW=m CONFIG_USB_SERIAL_IUU=m CONFIG_USB_SERIAL_KEYSPAN_PDA=m CONFIG_USB_SERIAL_KEYSPAN=m CONFIG_USB_SERIAL_KEYSPAN_MPR=y CONFIG_USB_SERIAL_KEYSPAN_USA28=y CONFIG_USB_SERIAL_KEYSPAN_USA28X=y CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y CONFIG_USB_SERIAL_KEYSPAN_USA19=y CONFIG_USB_SERIAL_KEYSPAN_USA18X=y CONFIG_USB_SERIAL_KEYSPAN_USA19W=y CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y CONFIG_USB_SERIAL_KEYSPAN_USA49W=y CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y CONFIG_USB_SERIAL_KLSI=m CONFIG_USB_SERIAL_KOBIL_SCT=m CONFIG_USB_SERIAL_MCT_U232=m CONFIG_USB_SERIAL_METRO=m CONFIG_USB_SERIAL_MOS7720=m CONFIG_USB_SERIAL_MOS7840=m CONFIG_USB_SERIAL_MXUPORT=m CONFIG_USB_SERIAL_NAVMAN=m CONFIG_USB_SERIAL_PL2303=m CONFIG_USB_SERIAL_OTI6858=m CONFIG_USB_SERIAL_QCAUX=m CONFIG_USB_SERIAL_QUALCOMM=m CONFIG_USB_SERIAL_SPCP8X5=m CONFIG_USB_SERIAL_SAFE=m CONFIG_USB_SERIAL_SAFE_PADDED=y CONFIG_USB_SERIAL_SIERRAWIRELESS=m CONFIG_USB_SERIAL_SYMBOL=m CONFIG_USB_SERIAL_TI=m CONFIG_USB_SERIAL_CYBERJACK=m CONFIG_USB_SERIAL_XIRCOM=m CONFIG_USB_SERIAL_WWAN=m CONFIG_USB_SERIAL_OPTION=m CONFIG_USB_SERIAL_OMNINET=m CONFIG_USB_SERIAL_OPTICON=m CONFIG_USB_SERIAL_XSENS_MT=m CONFIG_USB_SERIAL_WISHBONE=m CONFIG_USB_SERIAL_SSU100=m CONFIG_USB_SERIAL_QT2=m CONFIG_USB_SERIAL_DEBUG=m # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set CONFIG_USB_EZUSB_FX2=m # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # # USB Physical Layer drivers # CONFIG_USB_PHY=y # CONFIG_USB_OTG_WAKELOCK is not set # CONFIG_NOP_USB_XCEIV is not set # CONFIG_USB_GPIO_VBUS is not set CONFIG_USB_ISP1301=y # CONFIG_USB_ULPI is not set # CONFIG_DUAL_ROLE_USB_INTF is not set CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GADGET_DEBUG_FILES is not set # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # # USB Peripheral Controller # # CONFIG_USB_FUSB300 is not set # CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set # CONFIG_USB_M66592 is not set # CONFIG_USB_BDC_UDC is not set # CONFIG_USB_AMD5536UDC is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_NET2280 is not set # CONFIG_USB_GOKU is not set # CONFIG_USB_EG20T is not set # CONFIG_USB_GADGET_XILINX is not set # CONFIG_USB_DUMMY_HCD is not set CONFIG_USB_LIBCOMPOSITE=y CONFIG_USB_U_ETHER=y CONFIG_USB_F_RNDIS=y CONFIG_USB_F_FS=y CONFIG_USB_F_MIDI=y CONFIG_USB_F_MTP=y CONFIG_USB_F_PTP=y CONFIG_USB_F_AUDIO_SRC=y CONFIG_USB_F_ACC=y CONFIG_USB_CONFIGFS=y # CONFIG_USB_CONFIGFS_SERIAL is not set # CONFIG_USB_CONFIGFS_ACM is not set # CONFIG_USB_CONFIGFS_OBEX is not set # CONFIG_USB_CONFIGFS_NCM is not set # CONFIG_USB_CONFIGFS_ECM is not set # CONFIG_USB_CONFIGFS_ECM_SUBSET is not set CONFIG_USB_CONFIGFS_RNDIS=y # CONFIG_USB_CONFIGFS_EEM is not set # CONFIG_USB_CONFIGFS_MASS_STORAGE is not set # CONFIG_USB_CONFIGFS_F_LB_SS is not set CONFIG_USB_CONFIGFS_F_FS=y CONFIG_USB_CONFIGFS_F_MTP=y CONFIG_USB_CONFIGFS_F_PTP=y CONFIG_USB_CONFIGFS_F_ACC=y CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y CONFIG_USB_CONFIGFS_UEVENT=y # CONFIG_USB_CONFIGFS_F_UAC1 is not set # CONFIG_USB_CONFIGFS_F_UAC2 is not set CONFIG_USB_CONFIGFS_F_MIDI=y # CONFIG_USB_CONFIGFS_F_HID is not set # CONFIG_USB_CONFIGFS_F_UVC is not set # CONFIG_USB_CONFIGFS_F_PRINTER is not set # CONFIG_USB_LED_TRIG is not set # CONFIG_USB_ULPI_BUS is not set # CONFIG_UWB is not set CONFIG_MMC=y # CONFIG_MMC_DEBUG is not set CONFIG_PWRSEQ_EMMC=y CONFIG_PWRSEQ_SIMPLE=y # CONFIG_MMC_EMBEDDED_SDIO is not set # CONFIG_MMC_PARANOID_SD_INIT is not set # # MMC/SD/SDIO Card Drivers # CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 CONFIG_MMC_BLOCK_BOUNCE=y # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # CONFIG_MMC_SIMULATE_MAX_SPEED is not set # # MMC/SD/SDIO Host Controller Drivers # CONFIG_MMC_ARMMMCI=y # CONFIG_MMC_SDHCI is not set # CONFIG_MMC_TIFM_SD is not set # CONFIG_MMC_CB710 is not set # CONFIG_MMC_VIA_SDMMC is not set # CONFIG_MMC_DW is not set # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set # CONFIG_MMC_TOSHIBA_PCI is not set # CONFIG_MMC_MTK is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y # CONFIG_LEDS_CLASS_FLASH is not set # # LED drivers # # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP5521 is not set # CONFIG_LEDS_LP5523 is not set # CONFIG_LEDS_LP5562 is not set # CONFIG_LEDS_LP8501 is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set CONFIG_LEDS_PWM=y # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_SYSCON is not set # # LED Triggers # CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y # CONFIG_LEDS_TRIGGER_DISK is not set # CONFIG_LEDS_TRIGGER_MTD is not set CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_BACKLIGHT=y CONFIG_LEDS_TRIGGER_CPU=y CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # # iptables trigger is under Netfilter config (LED target) # CONFIG_LEDS_TRIGGER_TRANSIENT=y # CONFIG_LEDS_TRIGGER_CAMERA is not set CONFIG_LEDS_TRIGGER_PANIC=y # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_ATOMIC_SCRUB=y CONFIG_EDAC_SUPPORT=y # CONFIG_EDAC is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # I2C RTC drivers # # CONFIG_RTC_DRV_ABB5ZES3 is not set # CONFIG_RTC_DRV_ABX80X is not set # CONFIG_RTC_DRV_DS1307 is not set # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set CONFIG_RTC_DRV_HYM8563=y CONFIG_RTC_DRV_HYM8563_SHW_PATCH=y # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set CONFIG_RTC_DRV_PCF8563=y # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # CONFIG_RTC_DRV_RX8581 is not set # CONFIG_RTC_DRV_RX8025 is not set # CONFIG_RTC_DRV_EM3027 is not set # CONFIG_RTC_DRV_RV8803 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RX6110 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_CMOS is not set # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_PL030 is not set # CONFIG_RTC_DRV_PL031 is not set # CONFIG_RTC_DRV_SNVS is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_HID_SENSOR_TIME is not set # CONFIG_DMADEVICES is not set # # DMABUF options # CONFIG_SYNC_FILE=y CONFIG_SW_SYNC=y # CONFIG_AUXDISPLAY is not set CONFIG_UIO=y # CONFIG_UIO_CIF is not set CONFIG_UIO_PDRV_GENIRQ=y # CONFIG_UIO_DMEM_GENIRQ is not set # CONFIG_UIO_AEC is not set # CONFIG_UIO_SERCOS3 is not set # CONFIG_UIO_PCI_GENERIC is not set # CONFIG_UIO_NETX is not set # CONFIG_UIO_PRUSS is not set # CONFIG_UIO_MF624 is not set # CONFIG_VIRT_DRIVERS is not set CONFIG_VIRTIO=y # # Virtio drivers # # CONFIG_VIRTIO_PCI is not set # CONFIG_VIRTIO_BALLOON is not set # CONFIG_VIRTIO_INPUT is not set CONFIG_VIRTIO_MMIO=y # CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set # # Microsoft Hyper-V guest support # CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_COMEDI is not set # CONFIG_RTL8192U is not set CONFIG_RTLLIB=m CONFIG_RTLLIB_CRYPTO_CCMP=m CONFIG_RTLLIB_CRYPTO_TKIP=m CONFIG_RTLLIB_CRYPTO_WEP=m # CONFIG_RTL8192E is not set CONFIG_R8712U=m # CONFIG_R8188EU is not set # CONFIG_RTS5208 is not set # CONFIG_VT6655 is not set # CONFIG_VT6656 is not set # # IIO staging drivers # # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16203 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADIS16240 is not set # CONFIG_SCA3000 is not set # # Analog to digital converters # # CONFIG_AD7606 is not set # CONFIG_AD7780 is not set # CONFIG_AD7816 is not set # CONFIG_AD7192 is not set # CONFIG_AD7280 is not set # # Analog digital bi-direction converters # # CONFIG_ADT7316 is not set # # Capacitance to digital converters # # CONFIG_AD7150 is not set # CONFIG_AD7152 is not set # CONFIG_AD7746 is not set # # Direct Digital Synthesis # # CONFIG_AD9832 is not set # CONFIG_AD9834 is not set # # Digital gyroscope sensors # # CONFIG_ADIS16060 is not set # # Network Analyzer, Impedance Converters # # CONFIG_AD5933 is not set # # Light sensors # # CONFIG_SENSORS_ISL29018 is not set # CONFIG_SENSORS_ISL29028 is not set # CONFIG_TSL2583 is not set # CONFIG_TSL2x7x is not set # # Active energy metering IC # # CONFIG_ADE7753 is not set # CONFIG_ADE7754 is not set # CONFIG_ADE7758 is not set # CONFIG_ADE7759 is not set # CONFIG_ADE7854 is not set # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1200 is not set # CONFIG_AD2S1210 is not set # # Triggers - standalone # # CONFIG_FB_SM750 is not set # CONFIG_FB_XGI is not set # # Speakup console speech # # CONFIG_SPEAKUP is not set CONFIG_STAGING_MEDIA=y # CONFIG_MEDIA_CEC is not set # CONFIG_DVB_CXD2099 is not set CONFIG_LIRC_STAGING=y # CONFIG_LIRC_BT829 is not set # CONFIG_LIRC_IMON is not set # CONFIG_LIRC_SASEM is not set # CONFIG_LIRC_SERIAL is not set # CONFIG_LIRC_SIR is not set # CONFIG_LIRC_ZILOG is not set # # Android # # CONFIG_ASHMEM is not set # CONFIG_ANDROID_LOGGER is not set # CONFIG_ANDROID_LOW_MEMORY_KILLER is not set # CONFIG_ANDROID_VSOC is not set CONFIG_ION=y # CONFIG_ION_TEST is not set # CONFIG_ION_DUMMY is not set # CONFIG_ION_OF is not set # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_MTD_SPINAND_MT29F is not set # CONFIG_LNET is not set # CONFIG_DGNC is not set # CONFIG_GS_FPGABOOT is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set CONFIG_FB_TFT=m CONFIG_FB_TFT_AGM1264K_FL=m CONFIG_FB_TFT_BD663474=m CONFIG_FB_TFT_HX8340BN=m CONFIG_FB_TFT_HX8347D=m CONFIG_FB_TFT_HX8353D=m CONFIG_FB_TFT_HX8357D=m CONFIG_FB_TFT_ILI9163=m CONFIG_FB_TFT_ILI9320=m CONFIG_FB_TFT_ILI9325=m CONFIG_FB_TFT_ILI9340=m CONFIG_FB_TFT_ILI9341=m CONFIG_FB_TFT_ILI9481=m CONFIG_FB_TFT_ILI9486=m CONFIG_FB_TFT_PCD8544=m CONFIG_FB_TFT_RA8875=m CONFIG_FB_TFT_S6D02A1=m CONFIG_FB_TFT_S6D1121=m CONFIG_FB_TFT_SSD1289=m CONFIG_FB_TFT_SSD1305=m CONFIG_FB_TFT_SSD1306=m CONFIG_FB_TFT_SSD1325=m CONFIG_FB_TFT_SSD1331=m CONFIG_FB_TFT_SSD1351=m CONFIG_FB_TFT_ST7735R=m CONFIG_FB_TFT_ST7789V=m CONFIG_FB_TFT_TINYLCD=m CONFIG_FB_TFT_TLS8204=m CONFIG_FB_TFT_UC1611=m CONFIG_FB_TFT_UC1701=m CONFIG_FB_TFT_UPD161704=m CONFIG_FB_TFT_WATTEROTT=m CONFIG_FB_FLEX=m CONFIG_FB_TFT_FBTFT_DEVICE=m # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set # CONFIG_MOST is not set # CONFIG_KS7010 is not set # CONFIG_GREYBUS is not set # CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Common Clock Framework # # CONFIG_COMMON_CLK_SCPI is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set # CONFIG_CLK_QORIQ is not set # CONFIG_COMMON_CLK_NXP is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_PXA is not set # CONFIG_COMMON_CLK_PIC32 is not set # # Hardware Spinlock drivers # # # Clock Source drivers # CONFIG_CLKSRC_OF=y CONFIG_CLKSRC_PROBE=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y CONFIG_ARM_ARCH_TIMER_VCT_ACCESS=y # CONFIG_ARM_TIMER_SP804 is not set # CONFIG_ATMEL_PIT is not set # CONFIG_SH_TIMER_CMT is not set # CONFIG_SH_TIMER_MTU2 is not set # CONFIG_SH_TIMER_TMU is not set # CONFIG_EM_TIMER_STI is not set CONFIG_MAILBOX=y # CONFIG_ARM_MHU is not set # CONFIG_PLATFORM_MHU is not set # CONFIG_PL320_MBOX is not set # CONFIG_ALTERA_MBOX is not set # CONFIG_MAILBOX_TEST is not set CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # # CONFIG_IOMMU_IO_PGTABLE_LPAE is not set # CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set # CONFIG_ARM_SMMU is not set # # Remoteproc drivers # # CONFIG_STE_MODEM_RPROC is not set # # Rpmsg drivers # # # SOC (System On Chip) specific Drivers # # # Broadcom SoC drivers # # CONFIG_SOC_BRCMSTB is not set # CONFIG_SUNXI_SRAM is not set # CONFIG_SOC_TI is not set CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y CONFIG_DEVFREQ_GOV_PERFORMANCE=y CONFIG_DEVFREQ_GOV_POWERSAVE=y CONFIG_DEVFREQ_GOV_USERSPACE=y # CONFIG_DEVFREQ_GOV_PASSIVE is not set # # DEVFREQ Drivers # # CONFIG_PM_DEVFREQ_EVENT is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_GPIO is not set # CONFIG_EXTCON_MAX3355 is not set # CONFIG_EXTCON_QCOM_SPMI_MISC is not set # CONFIG_EXTCON_RT8973A is not set # CONFIG_EXTCON_SM5502 is not set # CONFIG_EXTCON_USB_GPIO is not set # CONFIG_MEMORY is not set CONFIG_IIO=y CONFIG_IIO_BUFFER=y # CONFIG_IIO_BUFFER_CB is not set CONFIG_IIO_KFIFO_BUF=y # CONFIG_IIO_CONFIGFS is not set # CONFIG_IIO_TRIGGER is not set # CONFIG_IIO_SW_DEVICE is not set # CONFIG_IIO_SW_TRIGGER is not set # # Accelerometers # # CONFIG_BMA180 is not set # CONFIG_BMA220 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_HID_SENSOR_ACCEL_3D is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MC3230 is not set # CONFIG_MMA7455_I2C is not set # CONFIG_MMA7455_SPI is not set # CONFIG_MMA7660 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MXC4005 is not set # CONFIG_MXC6255 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # # Analog to digital converters # # CONFIG_AD7266 is not set # CONFIG_AD7291 is not set # CONFIG_AD7298 is not set # CONFIG_AD7476 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD799X is not set # CONFIG_CC10001_ADC is not set # CONFIG_HI8435 is not set # CONFIG_INA2XX_ADC is not set # CONFIG_LTC2485 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX1363 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_NAU7802 is not set # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC0832 is not set # CONFIG_TI_ADC12138 is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_TI_ADC161S626 is not set # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS8688 is not set # CONFIG_VF610_ADC is not set # # Amplifiers # # CONFIG_AD8366 is not set # # Chemical Sensors # # CONFIG_ATLAS_PH_SENSOR is not set # CONFIG_IAQCORE is not set # CONFIG_VZ89X is not set # # Hid Sensor IIO Common # # CONFIG_HID_SENSOR_IIO_COMMON is not set # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # # Digital to analog converters # # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5592R is not set # CONFIG_AD5593R is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_AD5686 is not set # CONFIG_AD5755 is not set # CONFIG_AD5761 is not set # CONFIG_AD5764 is not set # CONFIG_AD5791 is not set # CONFIG_AD7303 is not set # CONFIG_AD8801 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # CONFIG_VF610_DAC is not set # # IIO dummy driver # # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_HID_SENSOR_GYRO_3D is not set # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # # Health Sensors # # # Heart Rate Monitors # # CONFIG_AFE4403 is not set # CONFIG_AFE4404 is not set # CONFIG_MAX30100 is not set # # Humidity sensors # # CONFIG_AM2315 is not set # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set # CONFIG_KMX61 is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set # # Light sensors # # CONFIG_ADJD_S311 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_BH1750 is not set # CONFIG_BH1780 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM36651 is not set # CONFIG_GP2AP020A00F is not set # CONFIG_ISL29125 is not set # CONFIG_HID_SENSOR_ALS is not set # CONFIG_HID_SENSOR_PROX is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_MAX44000 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1145 is not set # CONFIG_STK3310 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set # CONFIG_SENSORS_TSL2563 is not set # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VEML6070 is not set # # Magnetometer sensors # # CONFIG_AK8974 is not set # CONFIG_AK8975 is not set # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN_I2C is not set # CONFIG_BMC150_MAGN_SPI is not set # CONFIG_MAG3110 is not set # CONFIG_HID_SENSOR_MAGNETOMETER_3D is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # # Inclinometer sensors # # CONFIG_HID_SENSOR_INCLINOMETER_3D is not set # CONFIG_HID_SENSOR_DEVICE_ROTATION is not set # # Digital potentiometers # # CONFIG_DS1803 is not set # CONFIG_MAX5487 is not set # CONFIG_MCP4131 is not set # CONFIG_MCP4531 is not set # CONFIG_TPL0102 is not set # # Pressure sensors # # CONFIG_BMP280 is not set # CONFIG_HID_SENSOR_PRESS is not set # CONFIG_HP03 is not set # CONFIG_MPL115_I2C is not set # CONFIG_MPL115_SPI is not set # CONFIG_MPL3115 is not set # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # CONFIG_HP206C is not set # CONFIG_ZPA2326 is not set # # Lightning sensors # # CONFIG_AS3935 is not set # # Proximity sensors # # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_SX9500 is not set # # Temperature sensors # # CONFIG_MAXIM_THERMOCOUPLE is not set # CONFIG_MLX90614 is not set # CONFIG_TMP006 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_NTB is not set # CONFIG_VME_BUS is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_FSL_FTM is not set CONFIG_PWM_GPIO=y CONFIG_PWM_MESON=y # CONFIG_PWM_PCA9685 is not set CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 CONFIG_ARM_GIC_V2M=y CONFIG_ARM_GIC_V3=y CONFIG_PARTITION_PERCPU=y # CONFIG_IPACK_BUS is not set CONFIG_RESET_CONTROLLER=y CONFIG_GPIO_RESET_CONTROLLER=y # CONFIG_RESET_ATH79 is not set # CONFIG_RESET_BERLIN is not set # CONFIG_RESET_LPC18XX is not set # CONFIG_RESET_MESON is not set # CONFIG_RESET_PISTACHIO is not set # CONFIG_RESET_SOCFPGA is not set # CONFIG_RESET_STM32 is not set # CONFIG_RESET_SUNXI is not set # CONFIG_TI_SYSCON_RESET is not set # CONFIG_RESET_ZYNQ is not set # CONFIG_FMC is not set # # PHY Subsystem # # CONFIG_GENERIC_PHY is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_BCM_KONA_USB2_PHY is not set # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # CONFIG_ARM_PMU=y CONFIG_RAS=y # CONFIG_THUNDERBOLT is not set # # Android # CONFIG_ANDROID=y # CONFIG_ANDROID_BINDER_IPC is not set CONFIG_NVMEM=y # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # # FPGA Configuration Support # # CONFIG_FPGA is not set # CONFIG_TEE is not set # # Bootloader Drivers # CONFIG_BL301_MANAGER=y # # Firmware Drivers # CONFIG_ARM_PSCI_FW=y CONFIG_ARM_SCPI_POWER_DOMAIN=y # CONFIG_FIRMWARE_MEMMAP is not set # CONFIG_FW_CFG_SYSFS is not set CONFIG_HAVE_ARM_SMCCC=y # # File systems # CONFIG_DCACHE_WORD_ACCESS=y CONFIG_FS_IOMAP=y # CONFIG_EXT2_FS is not set # CONFIG_EXT3_FS is not set 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 CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=m # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=m # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y # CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QUOTA_DEBUG is not set CONFIG_QUOTA_TREE=y # CONFIG_QFMT_V1 is not set CONFIG_QFMT_V2=y CONFIG_QUOTACTL=y CONFIG_AUTOFS4_FS=y CONFIG_FUSE_FS=m # CONFIG_CUSE is not set CONFIG_OVERLAY_FS=m # # Caches # CONFIG_FSCACHE=y # CONFIG_FSCACHE_STATS is not set # CONFIG_FSCACHE_HISTOGRAM is not set # CONFIG_FSCACHE_DEBUG is not set # CONFIG_FSCACHE_OBJECT_LIST is not set # CONFIG_CACHEFILES is not set # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=y CONFIG_UDF_NLS=y # # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="ascii" # CONFIG_FAT_DEFAULT_UTF8 is not set # CONFIG_EXFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_UID=y CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_HUGETLB_PAGE is not set CONFIG_CONFIGFS_FS=y CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set # CONFIG_SDCARD_FS is not set CONFIG_HFS_FS=y CONFIG_HFSPLUS_FS=y # CONFIG_HFSPLUS_FS_POSIX_ACL is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS2_FS is not set # CONFIG_UBIFS_FS is not set # CONFIG_LOGFS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y CONFIG_SQUASHFS_FILE_CACHE=y # CONFIG_SQUASHFS_FILE_DIRECT is not set # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y CONFIG_PSTORE_ZLIB_COMPRESS=y # CONFIG_PSTORE_LZO_COMPRESS is not set # CONFIG_PSTORE_LZ4_COMPRESS is not set CONFIG_PSTORE_CONSOLE=y # CONFIG_PSTORE_PMSG is not set # CONFIG_PSTORE_FTRACE is not set CONFIG_PSTORE_RAM=y # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EXOFS_FS is not set CONFIG_ORE=m CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y CONFIG_NFS_SWAP=y CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=m CONFIG_PNFS_OBJLAYOUT=m CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" CONFIG_NFS_V4_1_MIGRATION=y CONFIG_NFS_V4_SECURITY_LABEL=y CONFIG_ROOT_NFS=y CONFIG_NFS_FSCACHE=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFSD=m CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y # CONFIG_NFSD_BLOCKLAYOUT is not set # CONFIG_NFSD_SCSILAYOUT is not set # CONFIG_NFSD_FLEXFILELAYOUT is not set CONFIG_NFSD_V4_SECURITY_LABEL=y # CONFIG_NFSD_FAULT_INJECTION is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_ACL_SUPPORT=m CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y CONFIG_SUNRPC_SWAP=y CONFIG_RPCSEC_GSS_KRB5=m # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS=y CONFIG_CIFS_STATS2=y # CONFIG_CIFS_WEAK_PW_HASH is not set # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set # CONFIG_CIFS_DEBUG is not set # CONFIG_CIFS_DFS_UPCALL is not set CONFIG_CIFS_SMB2=y CONFIG_CIFS_SMB311=y CONFIG_CIFS_FSCACHE=y # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y # # Compile-time checks and compiler options # # CONFIG_DEBUG_INFO is not set CONFIG_ENABLE_WARN_DEPRECATED=y CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=0 # 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 CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_FRAME_POINTER=y # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_DEBUG_KERNEL=y # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_PAGE_REF is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set # CONFIG_DEBUG_HIGHMEM is not set CONFIG_HAVE_ARCH_KASAN=y # CONFIG_KASAN is not set # CONFIG_DEBUG_SHIRQ is not set # # Debug Lockups and Hangs # CONFIG_LOCKUP_DETECTOR=y CONFIG_HARDLOCKUP_DETECTOR_OTHER_CPU=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 CONFIG_WQ_WATCHDOG=y # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=5 CONFIG_SCHED_DEBUG=y CONFIG_SCHED_INFO=y CONFIG_PANIC_ON_RT_THROTTLING=y CONFIG_SCHEDSTATS=y CONFIG_SCHED_STACK_END_CHECK=y # CONFIG_DEBUG_TIMEKEEPING is not set CONFIG_TIMER_STATS=y # CONFIG_DEBUG_PREEMPT is not set # # Lock Debugging (spinlocks, mutexes, etc...) # # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set CONFIG_DEBUG_ATOMIC_SLEEP=y # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set CONFIG_STACKTRACE=y # CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_BUGVERBOSE is not set # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PI_LIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_PROVE_RCU is not set # CONFIG_SPARSE_RCU_POINTER is not set # CONFIG_TORTURE_TEST is not set # CONFIG_RCU_PERF_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set # CONFIG_LATENCYTOP is not set CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y # CONFIG_PREEMPTIRQ_EVENTS is not set # CONFIG_IRQSOFF_TRACER is not set # CONFIG_PREEMPT_TRACER is not set # CONFIG_SCHED_TRACER is not set # CONFIG_HWLAT_TRACER is not set CONFIG_FTRACE_SYSCALLS=y # CONFIG_TRACER_SNAPSHOT is not set CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set CONFIG_STACK_TRACER=y # CONFIG_BLK_DEV_IO_TRACE is not set # CONFIG_UPROBE_EVENT is not set # CONFIG_PROBE_EVENTS is not set CONFIG_DYNAMIC_FTRACE=y CONFIG_FUNCTION_PROFILER=y CONFIG_FTRACE_MCOUNT_RECORD=y # CONFIG_FTRACE_STARTUP_TEST is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_TRACE_ENUM_MAP_FILE is not set CONFIG_TRACING_EVENTS_GPIO=y # # Runtime Testing # # CONFIG_LKDTM is not set # CONFIG_TEST_LIST_SORT is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_RBTREE_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_ASYNC_RAID6_TEST is not set # CONFIG_TEST_HEXDUMP is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_RHASHTABLE is not set # CONFIG_TEST_HASH is not set # CONFIG_DMA_API_DEBUG is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_UDELAY is not set # CONFIG_MEMTEST is not set # CONFIG_TEST_STATIC_KEYS 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_ARCH_WANTS_UBSAN_NO_NULL is not set # CONFIG_UBSAN is not set CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y # CONFIG_STRICT_DEVMEM is not set # CONFIG_ARM_PTDUMP is not set CONFIG_AMLOGIC_USER_FAULT=y CONFIG_ARM_UNWIND=y CONFIG_OLD_MCOUNT=y # CONFIG_DEBUG_USER is not set # CONFIG_DEBUG_LL is not set CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" # CONFIG_DEBUG_UART_8250 is not set CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" # CONFIG_PID_IN_CONTEXTIDR is not set CONFIG_DEBUG_SET_MODULE_RONX=y # CONFIG_CORESIGHT is not set # # Security options # CONFIG_KEYS=y # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_BIG_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set # CONFIG_KEY_DH_OPERATIONS is not set CONFIG_SECURITY_DMESG_RESTRICT=y CONFIG_SECURITY_PERF_EVENTS_RESTRICT=y CONFIG_SECURITY=y CONFIG_SECURITYFS=y CONFIG_SECURITY_NETWORK=y # CONFIG_SECURITY_NETWORK_XFRM is not set CONFIG_SECURITY_PATH=y CONFIG_LSM_MMAP_MIN_ADDR=0 CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HAVE_ARCH_HARDENED_USERCOPY=y CONFIG_HARDENED_USERCOPY=y # CONFIG_HARDENED_USERCOPY_PAGESPAN is not set CONFIG_SECURITY_SELINUX=y # CONFIG_SECURITY_SELINUX_BOOTPARAM is not set # CONFIG_SECURITY_SELINUX_DISABLE is not set CONFIG_SECURITY_SELINUX_DEVELOP=y CONFIG_SECURITY_SELINUX_AVC_STATS=y CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0 CONFIG_SECURITY_SMACK=y # CONFIG_SECURITY_SMACK_BRINGUP is not set # CONFIG_SECURITY_SMACK_NETFILTER is not set # CONFIG_SECURITY_SMACK_APPEND_SIGNALS is not set # CONFIG_SECURITY_TOMOYO is not set # CONFIG_SECURITY_APPARMOR is not set # CONFIG_SECURITY_LOADPIN is not set # CONFIG_SECURITY_YAMA 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_SELINUX=y # CONFIG_DEFAULT_SECURITY_SMACK is not set # CONFIG_DEFAULT_SECURITY_DAC is not set CONFIG_DEFAULT_SECURITY="selinux" CONFIG_XOR_BLOCKS=m CONFIG_ASYNC_CORE=m CONFIG_ASYNC_MEMCPY=m CONFIG_ASYNC_XOR=m CONFIG_ASYNC_PQ=m CONFIG_ASYNC_RAID6_RECOV=m CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y # CONFIG_CRYPTO_RSA is not set # CONFIG_CRYPTO_DH is not set # CONFIG_CRYPTO_ECDH is not set CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_WORKQUEUE=y CONFIG_CRYPTO_CRYPTD=y # CONFIG_CRYPTO_MCRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set # # Authenticated Encryption with Associated Data # CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y # # Block modes # CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CTR=y CONFIG_CRYPTO_CTS=y CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_ADIANTUM is not set # # Hash modes # CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_VMAC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_GHASH=y # CONFIG_CRYPTO_POLY1305 is not set CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y CONFIG_CRYPTO_MICHAEL_MIC=y # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARC4=y CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_BLOWFISH_COMMON=m CONFIG_CRYPTO_CAMELLIA=m CONFIG_CRYPTO_CAST_COMMON=m CONFIG_CRYPTO_CAST5=m CONFIG_CRYPTO_CAST6=m CONFIG_CRYPTO_DES=y CONFIG_CRYPTO_FCRYPT=m CONFIG_CRYPTO_KHAZAD=m CONFIG_CRYPTO_SALSA20=m CONFIG_CRYPTO_CHACHA20=m CONFIG_CRYPTO_SEED=m CONFIG_CRYPTO_SERPENT=m CONFIG_CRYPTO_TEA=m CONFIG_CRYPTO_TWOFISH=y CONFIG_CRYPTO_TWOFISH_COMMON=y # # Compression # CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_LZO=y CONFIG_CRYPTO_842=m CONFIG_CRYPTO_LZ4=m CONFIG_CRYPTO_LZ4HC=m CONFIG_CRYPTO_ZSTD=m # # Random Number Generation # CONFIG_CRYPTO_ANSI_CPRNG=y CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set # CONFIG_CRYPTO_USER_API_AEAD is not set CONFIG_CRYPTO_HASH_INFO=y CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_HIFN_795X is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y # CONFIG_PKCS7_MESSAGE_PARSER is not set # # Certificates for signature checking # # CONFIG_SYSTEM_TRUSTED_KEYRING is not set CONFIG_ARM_CRYPTO=y CONFIG_CRYPTO_SHA1_ARM=y # CONFIG_CRYPTO_SHA1_ARM_NEON is not set # CONFIG_CRYPTO_SHA1_ARM_CE is not set # CONFIG_CRYPTO_SHA2_ARM_CE is not set CONFIG_CRYPTO_SHA256_ARM=y # CONFIG_CRYPTO_SHA512_ARM is not set # CONFIG_CRYPTO_AES_ARM is not set # CONFIG_CRYPTO_AES_ARM_BS is not set # CONFIG_CRYPTO_AES_ARM_CE is not set # CONFIG_CRYPTO_GHASH_ARM_CE is not set # CONFIG_CRYPTO_CHACHA20_NEON is not set # CONFIG_CRYPTO_NHPOLY1305_NEON is not set CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_RATIONAL=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_GENERIC_IO=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_CRC_CCITT=y CONFIG_CRC16=y CONFIG_CRC_T10DIF=y CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set CONFIG_CRC7=y CONFIG_LIBCRC32C=y # CONFIG_CRC8 is not set CONFIG_XXHASH=m CONFIG_AUDIT_GENERIC=y # CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set # CONFIG_RANDOM32_SELFTEST is not set CONFIG_842_COMPRESS=m CONFIG_842_DECOMPRESS=m CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_COMPRESS=m CONFIG_LZ4HC_COMPRESS=m CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMPRESS=m CONFIG_ZSTD_DECOMPRESS=m CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y CONFIG_XZ_DEC_POWERPC=y CONFIG_XZ_DEC_IA64=y CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y CONFIG_XZ_DEC_SPARC=y CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_GZIP=y CONFIG_DECOMPRESS_BZIP2=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DECOMPRESS_XZ=y CONFIG_DECOMPRESS_LZO=y CONFIG_DECOMPRESS_LZ4=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_LRU_CACHE=m CONFIG_CLZ_TAB=y # CONFIG_CORDIC is not set # CONFIG_DDR is not set # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_FONT_SUPPORT=m # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y # CONFIG_SG_SPLIT is not set CONFIG_SG_POOL=y CONFIG_ARCH_HAS_SG_CHAIN=y CONFIG_SBITMAP=y # CONFIG_VIRTUALIZATION is not set ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/options ================================================ ################################################################################ # setup system defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) # TARGET_CPU: # arm2 arm250 arm3 arm6 arm60 arm600 arm610 arm620 arm7 arm7m arm7d # arm7dm arm7di arm7dmi arm70 arm700 arm700i arm710 arm710c # arm7100 arm720 arm7500 arm7500fe arm7tdmi arm7tdmi-s arm710t # arm720t arm740t strongarm strongarm110 strongarm1100 # strongarm1110 arm8 arm810 arm9 arm9e arm920 arm920t arm922t # arm946e-s arm966e-s arm968e-s arm926ej-s arm940t arm9tdmi # arm10tdmi arm1020t arm1026ej-s arm10e arm1020e arm1022e # arm1136j-s arm1136jf-s mpcore mpcorenovfp arm1156t2-s # arm1176jz-s arm1176jzf-s cortex-a8 cortex-a9 cortex-r4 # cortex-r4f cortex-m3 cortex-m1 xscale iwmmxt iwmmxt2 ep9312. # TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc+fp+simd" ;; arm) TARGET_KERNEL_ARCH="arm" TARGET_FLOAT="hard" TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc" TARGET_FPU="neon-fp-armv8" ;; esac # Bootloader to use (syslinux / u-boot / atv-bootloader / bcm2835-bootloader) BOOTLOADER="u-boot" # Kernel target KERNEL_TARGET="uImage" # Kernel extra targets to build KERNEL_UBOOT_EXTRA_TARGET="" # Build Android kernel image using mkbootimg BUILD_ANDROID_BOOTIMG="yes" # Additional options to be passed to Android mkbootimg ANDROID_BOOTIMG_OPTIONS="--base 0x0 --kernel_offset 0x1080000" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="dtbs" # Additional kernel dependencies KERNEL_EXTRA_DEPENDS_TARGET="" # Kernel to use. values can be: # default: default mainline kernel LINUX="amlogic-4.9" # kernel image name KERNEL_NAME="kernel.img" ################################################################################ # setup build defaults ################################################################################ # Project CFLAGS PROJECT_CFLAGS="" # SquashFS compression method (gzip / lzo / xz) SQUASHFS_COMPRESSION="lzo" ################################################################################ # setup project defaults ################################################################################ # build and install ALSA Audio support (yes / no) ALSA_SUPPORT="yes" # OpenGL(X) implementation to use (no / Mesa) OPENGL="no" # OpenGL-ES implementation to use (no / bcm2835-driver / gpu-viv-bin-mx6q / opengl-meson) OPENGLES="opengl-meson" # include uvesafb support (yes / no) UVESAFB_SUPPORT="no" # Displayserver to use (x11 / no) DISPLAYSERVER="no" # Windowmanager to use (fluxbox / none) WINDOWMANAGER="none" # Xorg Graphic drivers to use (all / i915,i965,r200,r300,r600,nvidia,nouveau) # Space separated list is supported, # e.g. GRAPHIC_DRIVERS="i915 i965 r300 r600 radeonsi nvidia nouveau" GRAPHIC_DRIVERS="" # Use a vendor specific KODI repo KODI_VENDOR="amlogic-4.9" # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap / libamcodec) KODIPLAYER_DRIVER="libamcodec" # Modules to install in initramfs for early boot INITRAMFS_MODULES="font softcursor bitblit fbcon" # additional drivers to install: # for a list of additinoal drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS+=" RTL8192CU RTL8192DU RTL8192EU RTL8188EU RTL8821CU ssv6xxx-aml mt7668-aml RTL8188FTV-aml RTL8189ES-aml RTL8189FS-aml RTL8723BS-aml RTL8822BS-aml RTL8821CS-aml qca9377-aml qca6174-aml smartchip" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" FIRMWARE="misc-firmware wlan-firmware dvb-firmware brcmfmac_sdio-firmware-aml rtkbt-firmware-aml qca-firmware-aml" # build and install ATV IR remote support (yes / no) ATVCLIENT_SUPPORT="no" # Amlogic IR remote support (yes / no) AMREMOTE_SUPPORT="yes" # build and install iSCSI support - iscsistart (yes / no) ISCSI_SUPPORT="no" # build with installer (yes / no) INSTALLER_SUPPORT="no" # build and install driver addons (yes / no) DRIVER_ADDONS_SUPPORT="no" # driver addons to install: # for a list of additinoal drivers see packages/linux-driver-addons # Space separated list is supported, DRIVER_ADDONS="" # additional packages to install: # Space separated list is supported, # e.g. ADDITIONAL_PACKAGES="PACKAGE1 PACKAGE2" # ADDITIONAL_PACKAGES+="" # add OOTB support for IR remote # IR_REMOTE_KEYMAPS+="" # build with entware installer ENTWARE_SUPPORT="yes" ENTWARE_ARCH="armv7sf-k3.2" # CoreELEC Subdevices SUBDEVICES="" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/packages/opengl-meson/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="opengl-meson" PKG_VERSION="7bddce621a0c1e0cc12cfc8b707e93eb37fc0f82" PKG_SHA256="15400e78b918b15743b815c195be472899d4243143e405a7b50d5be1cd07ffd1" PKG_LICENSE="nonfree" PKG_SITE="http://openlinux.amlogic.com:8000/download/ARM/filesystem/" PKG_URL="https://github.com/CoreELEC/opengl-meson/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain opentee_linuxdriver" PKG_LONGDESC="OpenGL ES pre-compiled libraries for Mali GPUs found in Amlogic Meson SoCs." PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib cp -p lib/eabihf/gondul/r12p0/fbdev/libMali.so ${INSTALL}/usr/lib/libMali.gondul.so ln -sf /var/lib/libMali.so ${INSTALL}/usr/lib/libMali.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libmali.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libmali.so.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libEGL.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libEGL.so.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libEGL.so.1.0.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLES_CM.so.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv1_CM.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv1_CM.so.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv1_CM.so.1.0.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv1_CM.so.1.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv2.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv2.so.2 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv2.so.2.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv2.so.2.0.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so.3 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so.3.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so.3.0.0 mkdir -p ${INSTALL}/usr/sbin cp ${PKG_DIR}/scripts/libmali-overlay-setup ${INSTALL}/usr/sbin # install needed files for compiling mkdir -p ${SYSROOT_PREFIX}/usr/include/EGL cp -pr include/EGL ${SYSROOT_PREFIX}/usr/include cp -pr include/EGL_platform/platform_fbdev/* ${SYSROOT_PREFIX}/usr/include/EGL mkdir -p ${SYSROOT_PREFIX}/usr/include/GLES2 cp -pr include/GLES2 ${SYSROOT_PREFIX}/usr/include mkdir -p ${SYSROOT_PREFIX}/usr/include/KHR cp -pr include/KHR ${SYSROOT_PREFIX}/usr/include mkdir -p ${SYSROOT_PREFIX}/usr/lib cp -pr lib/pkgconfig ${SYSROOT_PREFIX}/usr/lib ln ${INSTALL}/usr/lib/libMali.gondul.so ${SYSROOT_PREFIX}/usr/lib/libEGL.so ln ${INSTALL}/usr/lib/libMali.gondul.so ${SYSROOT_PREFIX}/usr/lib/libGLESv2.so } post_install() { enable_service unbind-console.service enable_service libmali.service } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/packages/opengl-meson/scripts/libmali-overlay-setup ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) if grep -q "g12b" /proc/device-tree/compatible; then ln -sf /usr/lib/libMali.gondul.so /var/lib/libMali.so fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/packages/opengl-meson/system.d/libmali.service ================================================ [Unit] Description=Create libMali overlay for specific AML device After=var.mount Before=kodi.service [Service] Type=oneshot ExecStart=/usr/sbin/libmali-overlay-setup [Install] WantedBy=local-fs.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/packages/opengl-meson/system.d/unbind-console.service ================================================ [Unit] Description=Unbind framebuffer console ConditionPathExists=/sys/class/vtconsole/vtcon1/bind [Service] Type=oneshot ExecStart=/bin/sh -c 'echo 0 > /sys/class/vtconsole/vtcon1/bind' [Install] WantedBy=graphical.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/packages/u-boot/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot" PKG_VERSION="1.0" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" PKG_CANUPDATE="${PROJECT}*" PKG_NEED_UNPACK="$PROJECT_DIR/$PROJECT/bootloader " make_target() { : # nothing } makeinstall_target() { mkdir -p $INSTALL/usr/share/bootloader # Always install the update script find_file_path bootloader/update.sh && cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader sed -e "s/@KERNEL_NAME@/$KERNEL_NAME/g" \ -e "s/@LEGACY_KERNEL_NAME@/$LEGACY_KERNEL_NAME/g" \ -e "s/@LEGACY_DTB_NAME@/$LEGACY_DTB_NAME/g" \ -i $INSTALL/usr/share/bootloader/update.sh # Always install the canupdate script if find_file_path bootloader/canupdate.sh; then cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader fi find_file_path bootloader/config.ini && cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader sed -e "s/@PROJECT@/${PKG_CANUPDATE}/g" \ -i $INSTALL/usr/share/bootloader/canupdate.sh } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0001-Android-improve-Dolby-Vision-compatibility.patch ================================================ From 9df5de35edf290042854693658f7fb77c14a19c8 Mon Sep 17 00:00:00 2001 From: thexai <58434170+thexai@users.noreply.github.com> Date: Wed, 29 Mar 2023 12:30:11 +0200 Subject: [PATCH 01/21] [Android] improve Dolby Vision compatibility --- .../Video/DVDVideoCodecAndroidMediaCodec.cpp | 8 +++++++- xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.h | 2 ++ .../VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp | 13 ++++++++++++- xbmc/cores/VideoPlayer/DVDStreamInfo.cpp | 8 ++++++++ xbmc/cores/VideoPlayer/DVDStreamInfo.h | 5 ++++- 5 files changed, 33 insertions(+), 3 deletions(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp index 48050cfb9d..0be40dd87c 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp @@ -512,7 +512,13 @@ bool CDVDVideoCodecAndroidMediaCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptio "Display: {}, MediaCodec: {}", displaySupportsDovi, mediaCodecSupportsDovi); - if (displaySupportsDovi && mediaCodecSupportsDovi) + // For Dolby Vision profiles that don't have HDR10 fallback, always use + // the dvhe decoder even if the display not supports Dolby Vision. + // For profiles that has HDR10 fallback (7, 8) is better use HEVC decoder to + // ensure HDR10 output if display is not DV capable. + bool notHasHDR10fallback = (m_hints.dovi.dv_profile == 4 || m_hints.dovi.dv_profile == 5); + + if (mediaCodecSupportsDovi && (displaySupportsDovi || notHasHDR10fallback)) { m_mime = "video/dolby-vision"; m_formatname = isDvhe ? "amc-dvhe" : "amc-dvh1"; diff --git a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.h b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.h index 5bf4da346f..43dcd465fb 100644 --- a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.h +++ b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.h @@ -32,6 +32,7 @@ class IAddonProvider; extern "C" { #include <libavcodec/avcodec.h> +#include <libavutil/dovi_meta.h> #include <libavutil/mastering_display_metadata.h> } @@ -166,6 +167,7 @@ public: std::string stereo_mode; // expected stereo mode StreamHdrType hdr_type = StreamHdrType::HDR_TYPE_NONE; // type of HDR for this stream (hdr10, etc) + AVDOVIDecoderConfigurationRecord dovi{}; bool bInterlaced; // progressive/interlaced flag bool bUnknownIP; // progressive/interlace unknown }; diff --git a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp index 66ff48b731..e88b1f1da3 100644 --- a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +++ b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp @@ -53,8 +53,10 @@ extern "C" #include <stdint.h> #endif -extern "C" { +extern "C" +{ #include <libavutil/dict.h> +#include <libavutil/dovi_meta.h> #include <libavutil/opt.h> } @@ -1719,6 +1721,15 @@ CDemuxStream* CDVDDemuxFFmpeg::AddStream(int streamIdx) int size = 0; uint8_t* side_data = nullptr; + if (st->hdr_type == StreamHdrType::HDR_TYPE_DOLBYVISION) + { + side_data = av_stream_get_side_data(pStream, AV_PKT_DATA_DOVI_CONF, &size); + if (side_data && size) + { + st->dovi = *reinterpret_cast<AVDOVIDecoderConfigurationRecord*>(side_data); + } + } + side_data = av_stream_get_side_data(pStream, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, &size); if (side_data && size) { diff --git a/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp b/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp index 556a9182c3..0bac726df6 100644 --- a/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp +++ b/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp @@ -11,6 +11,8 @@ #include "DVDDemuxers/DVDDemux.h" #include "cores/VideoPlayer/Interface/DemuxCrypto.h" +#include <cstring> + CDVDStreamInfo::CDVDStreamInfo() { extradata = NULL; Clear(); } CDVDStreamInfo::CDVDStreamInfo(const CDVDStreamInfo &right, bool withextradata ) { extradata = NULL; Clear(); Assign(right, withextradata); } CDVDStreamInfo::CDVDStreamInfo(const CDemuxStream &right, bool withextradata ) { extradata = NULL; Clear(); Assign(right, withextradata); } @@ -63,6 +65,7 @@ void CDVDStreamInfo::Clear() masteringMetadata = nullptr; contentLightMetadata = nullptr; stereo_mode.clear(); + dovi = {}; channels = 0; samplerate = 0; @@ -150,6 +153,9 @@ bool CDVDStreamInfo::Equal(const CDVDStreamInfo& right, int compare) else if (contentLightMetadata || right.contentLightMetadata) return false; + if (0 != std::memcmp(&dovi, &right.dovi, sizeof(AVDOVIDecoderConfigurationRecord))) + return false; + // AUDIO if( channels != right.channels || samplerate != right.samplerate @@ -234,6 +240,7 @@ void CDVDStreamInfo::Assign(const CDVDStreamInfo& right, bool withextradata) masteringMetadata = right.masteringMetadata; contentLightMetadata = right.contentLightMetadata; stereo_mode = right.stereo_mode; + dovi = right.dovi; // AUDIO channels = right.channels; @@ -309,6 +316,7 @@ void CDVDStreamInfo::Assign(const CDemuxStream& right, bool withextradata) masteringMetadata = stream->masteringMetaData; contentLightMetadata = stream->contentLightMetaData; stereo_mode = stream->stereo_mode; + dovi = stream->dovi; } else if (right.type == STREAM_SUBTITLE) { diff --git a/xbmc/cores/VideoPlayer/DVDStreamInfo.h b/xbmc/cores/VideoPlayer/DVDStreamInfo.h index 5c30334f8e..8d2989af75 100644 --- a/xbmc/cores/VideoPlayer/DVDStreamInfo.h +++ b/xbmc/cores/VideoPlayer/DVDStreamInfo.h @@ -10,8 +10,10 @@ #include "DVDDemuxers/DVDDemux.h" -extern "C" { +extern "C" +{ #include <libavcodec/avcodec.h> +#include <libavutil/dovi_meta.h> } #include "DVDClock.h" @@ -78,6 +80,7 @@ public: std::shared_ptr<AVMasteringDisplayMetadata> masteringMetadata; std::shared_ptr<AVContentLightMetadata> contentLightMetadata; std::string stereo_mode; // stereoscopic 3d mode + AVDOVIDecoderConfigurationRecord dovi{}; CDVDClock *pClock; // AUDIO -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0002-Improve-Dolby-Vision-detection-for-Android.patch ================================================ From 684e791b37f4a0c60af89c3a28bf1404d4cd0614 Mon Sep 17 00:00:00 2001 From: Serghei Scobici <serghei.scobici@endava.com> Date: Sun, 8 Jan 2023 17:08:09 +0200 Subject: [PATCH 02/21] Improve Dolby Vision detection for Android --- .../DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp | 10 ++++++++++ xbmc/cores/VideoPlayer/DVDStreamInfo.cpp | 4 ++++ xbmc/cores/VideoPlayer/DVDStreamInfo.h | 1 + 3 files changed, 15 insertions(+) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp index 0be40dd87c..ae8943655e 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp @@ -501,6 +501,16 @@ bool CDVDVideoCodecAndroidMediaCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptio bool isDvhe = (m_hints.codec_tag == MKTAG('d', 'v', 'h', 'e')); bool isDvh1 = (m_hints.codec_tag == MKTAG('d', 'v', 'h', '1')); + // some files don't have dvhe or dvh1 tag set up but have Dolby Vision side data + if (!isDvhe && !isDvh1 && m_hints.hdrType == StreamHdrType::HDR_TYPE_DOLBYVISION) + { + // page 10, table 2 from https://professional.dolby.com/siteassets/content-creation/dolby-vision-for-content-creators/dolby-vision-streams-within-the-http-live-streaming-format-v2.0-13-november-2018.pdf + if (m_hints.codec_tag == MKTAG('h', 'v', 'c', '1')) + isDvh1 = true; + else + isDvhe = true; + } + if (isDvhe || isDvh1) { bool displaySupportsDovi = CAndroidUtils::GetDisplayHDRCapabilities().SupportsDolbyVision(); diff --git a/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp b/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp index 0bac726df6..df9dc537fb 100644 --- a/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp +++ b/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp @@ -58,6 +58,7 @@ void CDVDStreamInfo::Clear() ptsinvalid = false; forced_aspect = false; bitsperpixel = 0; + hdrType = StreamHdrType::HDR_TYPE_NONE; colorSpace = AVCOL_SPC_UNSPECIFIED; colorRange = AVCOL_RANGE_UNSPECIFIED; colorPrimaries = AVCOL_PRI_UNSPECIFIED; @@ -109,6 +110,7 @@ bool CDVDStreamInfo::Equal(const CDVDStreamInfo& right, int compare) || bitsperpixel != right.bitsperpixel || bitdepth != right.bitdepth || vfr != right.vfr + || hdrType != right.hdrType || colorSpace != right.colorSpace || colorRange != right.colorRange || colorPrimaries != right.colorPrimaries @@ -233,6 +235,7 @@ void CDVDStreamInfo::Assign(const CDVDStreamInfo& right, bool withextradata) bitdepth = right.bitdepth; vfr = right.vfr; codecOptions = right.codecOptions; + hdrType = right.hdrType; colorSpace = right.colorSpace; colorRange = right.colorRange; colorPrimaries = right.colorPrimaries; @@ -309,6 +312,7 @@ void CDVDStreamInfo::Assign(const CDemuxStream& right, bool withextradata) orientation = stream->iOrientation; bitsperpixel = stream->iBitsPerPixel; bitdepth = stream->bitDepth; + hdrType = stream->hdr_type; colorSpace = stream->colorSpace; colorRange = stream->colorRange; colorPrimaries = stream->colorPrimaries; diff --git a/xbmc/cores/VideoPlayer/DVDStreamInfo.h b/xbmc/cores/VideoPlayer/DVDStreamInfo.h index 8d2989af75..ed94acd6b3 100644 --- a/xbmc/cores/VideoPlayer/DVDStreamInfo.h +++ b/xbmc/cores/VideoPlayer/DVDStreamInfo.h @@ -73,6 +73,7 @@ public: int orientation; // orientation of the video in degrees counter clockwise int bitsperpixel; int bitdepth; + StreamHdrType hdrType; AVColorSpace colorSpace; AVColorRange colorRange; AVColorPrimaries colorPrimaries; -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0003-WinSystemAmlogic-rework-EGL-native-window.patch ================================================ From 8a013649ea33ea8ce2f4bfd432260de1609eb977 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 6 Oct 2022 16:47:58 +0200 Subject: [PATCH 03/21] WinSystemAmlogic: rework EGL native window The <EGL/fbdev_window.h> include was missing and native window was NULL as _FBDEV_WINDOW_H_ was not defined. --- xbmc/windowing/amlogic/WinSystemAmlogic.cpp | 33 ++++++++----------- xbmc/windowing/amlogic/WinSystemAmlogic.h | 4 +-- .../amlogic/WinSystemAmlogicGLESContext.cpp | 2 +- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp index 3d40e6b24d..0a52b95144 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp @@ -38,8 +38,9 @@ using namespace KODI; -CWinSystemAmlogic::CWinSystemAmlogic() : - m_libinput(new CLibInputHandler) +CWinSystemAmlogic::CWinSystemAmlogic() +: m_nativeWindow(NULL) +, m_libinput(new CLibInputHandler) { const char *env_framebuffer = getenv("FRAMEBUFFER"); @@ -53,7 +54,6 @@ CWinSystemAmlogic::CWinSystemAmlogic() : } m_nativeDisplay = EGL_NO_DISPLAY; - m_nativeWindow = static_cast<EGLNativeWindowType>(NULL); m_displayWidth = 0; m_displayHeight = 0; @@ -64,14 +64,6 @@ CWinSystemAmlogic::CWinSystemAmlogic() : m_libinput->Start(); } -CWinSystemAmlogic::~CWinSystemAmlogic() -{ - if(m_nativeWindow) - { - m_nativeWindow = static_cast<EGLNativeWindowType>(NULL); - } -} - bool CWinSystemAmlogic::InitWindowSystem() { const std::shared_ptr<CSettings> settings = CServiceBroker::GetSettingsComponent()->GetSettings(); @@ -146,6 +138,12 @@ bool CWinSystemAmlogic::CreateNewWindow(const std::string& name, m_displayHeight = res.iScreenHeight; m_fRefreshRate = res.fRefreshRate; + if (m_nativeWindow == NULL) + m_nativeWindow = new fbdev_window; + + m_nativeWindow->width = m_nWidth; + m_nativeWindow->height = m_nHeight; + if ((m_bWindowCreated && aml_get_native_resolution(¤t_resolution)) && current_resolution.iWidth == res.iWidth && current_resolution.iHeight == res.iHeight && current_resolution.iScreenWidth == res.iScreenWidth && current_resolution.iScreenHeight == res.iScreenHeight && @@ -175,13 +173,6 @@ bool CWinSystemAmlogic::CreateNewWindow(const std::string& name, m_stereo_mode = stereo_mode; m_bFullScreen = fullScreen; -#ifdef _FBDEV_WINDOW_H_ - fbdev_window *nativeWindow = new fbdev_window; - nativeWindow->width = res.iWidth; - nativeWindow->height = res.iHeight; - m_nativeWindow = static_cast<EGLNativeWindowType>(nativeWindow); -#endif - aml_set_native_resolution(res, m_framebuffer_name, stereo_mode); if (!m_delayDispReset) @@ -199,7 +190,11 @@ bool CWinSystemAmlogic::CreateNewWindow(const std::string& name, bool CWinSystemAmlogic::DestroyWindow() { - m_nativeWindow = static_cast<EGLNativeWindowType>(NULL); + if (m_nativeWindow != NULL) + { + delete(m_nativeWindow); + m_nativeWindow = NULL; + } return true; } diff --git a/xbmc/windowing/amlogic/WinSystemAmlogic.h b/xbmc/windowing/amlogic/WinSystemAmlogic.h index 7cfb2dc7c3..2c70086caa 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogic.h +++ b/xbmc/windowing/amlogic/WinSystemAmlogic.h @@ -14,6 +14,7 @@ #include "windowing/WinSystem.h" #include "threads/SystemClock.h" #include "system_egl.h" +#include <EGL/fbdev_window.h> class IDispResource; @@ -21,7 +22,6 @@ class CWinSystemAmlogic : public CWinSystemBase { public: CWinSystemAmlogic(); - virtual ~CWinSystemAmlogic(); bool InitWindowSystem() override; bool DestroyWindowSystem() override; @@ -42,7 +42,7 @@ public: protected: std::string m_framebuffer_name; EGLDisplay m_nativeDisplay; - EGLNativeWindowType m_nativeWindow; + fbdev_window *m_nativeWindow; int m_displayWidth; int m_displayHeight; diff --git a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp index 16ba54a02f..f6cbac696b 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp @@ -74,7 +74,7 @@ bool CWinSystemAmlogicGLESContext::CreateNewWindow(const std::string& name, return false; } - if (!m_pGLContext.CreateSurface(m_nativeWindow)) + if (!m_pGLContext.CreateSurface(static_cast<EGLNativeWindowType>(m_nativeWindow))) { return false; } -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0004-WinSystemAmlogicGLES-clean-up-GLES-references-on-win.patch ================================================ From abad3ebbbea8de81c7f92d5caea3da94d54b0614 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 26 Jan 2023 11:39:43 +0100 Subject: [PATCH 04/21] WinSystemAmlogicGLES: clean up GLES references on window destroy --- .../amlogic/WinSystemAmlogicGLESContext.cpp | 18 +++++++++++++----- .../amlogic/WinSystemAmlogicGLESContext.h | 2 ++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp index f6cbac696b..39fbaf03a1 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp @@ -58,17 +58,19 @@ bool CWinSystemAmlogicGLESContext::InitWindowSystem() return true; } +bool CWinSystemAmlogicGLESContext::DestroyWindowSystem() +{ + m_pGLContext.DestroyContext(); + m_pGLContext.Destroy(); + return CWinSystemAmlogic::DestroyWindowSystem(); +} + bool CWinSystemAmlogicGLESContext::CreateNewWindow(const std::string& name, bool fullScreen, RESOLUTION_INFO& res) { m_pGLContext.DestroySurface(); - if (!CWinSystemAmlogic::DestroyWindow()) - { - return false; - } - if (!CWinSystemAmlogic::CreateNewWindow(name, fullScreen, res)) { return false; @@ -95,6 +97,12 @@ bool CWinSystemAmlogicGLESContext::CreateNewWindow(const std::string& name, return true; } +bool CWinSystemAmlogicGLESContext::DestroyWindow() +{ + m_pGLContext.DestroySurface(); + return CWinSystemAmlogic::DestroyWindow(); +} + bool CWinSystemAmlogicGLESContext::ResizeWindow(int newWidth, int newHeight, int newLeft, int newTop) { CRenderSystemGLES::ResetRenderSystem(newWidth, newHeight); diff --git a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.h b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.h index d2f0e84e90..7d7467ee1a 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.h +++ b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.h @@ -32,9 +32,11 @@ public: // Implementation of CWinSystemBase via CWinSystemAmlogic CRenderSystemBase *GetRenderSystem() override { return this; } bool InitWindowSystem() override; + bool DestroyWindowSystem() override; bool CreateNewWindow(const std::string& name, bool fullScreen, RESOLUTION_INFO& res) override; + bool DestroyWindow() override; bool ResizeWindow(int newWidth, int newHeight, int newLeft, int newTop) override; bool SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays) override; -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0005-tools-depends-Add-Rust-toolchain-cargo-c-and-libdovi.patch ================================================ From 76387530102fc7c9226e0f4df2561a769f5343aa Mon Sep 17 00:00:00 2001 From: quietvoid <39477805+quietvoid@users.noreply.github.com> Date: Sat, 11 Mar 2023 08:39:55 -0500 Subject: [PATCH 05/21] tools/depends: Add Rust toolchain, cargo-c and libdovi dependencies --- docs/README.Android.md | 4 ++ tools/depends/Makefile.include.in | 1 + tools/depends/configure.ac | 7 +++ tools/depends/native/Makefile | 8 +++- tools/depends/native/cargo-c/CARGO-C-VERSION | 5 ++ tools/depends/native/cargo-c/Makefile | 38 ++++++++++++++++ tools/depends/native/rustup/Makefile | 48 ++++++++++++++++++++ tools/depends/native/rustup/RUSTUP-VERSION | 5 ++ tools/depends/target/Makefile | 4 ++ tools/depends/target/libdovi/LIBDOVI-VERSION | 6 +++ tools/depends/target/libdovi/Makefile | 43 ++++++++++++++++++ 11 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 tools/depends/native/cargo-c/CARGO-C-VERSION create mode 100644 tools/depends/native/cargo-c/Makefile create mode 100644 tools/depends/native/rustup/Makefile create mode 100644 tools/depends/native/rustup/RUSTUP-VERSION create mode 100644 tools/depends/target/libdovi/LIBDOVI-VERSION create mode 100644 tools/depends/target/libdovi/Makefile diff --git a/docs/README.Android.md b/docs/README.Android.md index ecc0dcbbd1..48c7881d4b 100644 --- a/docs/README.Android.md +++ b/docs/README.Android.md @@ -236,6 +236,10 @@ make -j$(getconf _NPROCESSORS_ONLN) ``` FFmpeg configure options, e.g. --enable-vaapi (target) +``` +--enable-libdovi=<yes:no> +``` + enable `libdovi`, for on-the-fly Dolby Vision conversion. Defaults to no. **Android Specific:** diff --git a/tools/depends/Makefile.include.in b/tools/depends/Makefile.include.in index 3a36d20d68..03c27df67b 100644 --- a/tools/depends/Makefile.include.in +++ b/tools/depends/Makefile.include.in @@ -31,6 +31,7 @@ SHA512SUM=@SHA512SUM@ SHA256SUM=@SHA256SUM@ SHASUM=@SHASUM@ HASH_TOOL_FLAGS=-c --status +ENABLE_LIBDOVI=@use_libdovi@ HAS_ZLIB=@has_zlib@ NEED_LIBICONV=@need_libiconv@ diff --git a/tools/depends/configure.ac b/tools/depends/configure.ac index 79ab65900b..929300b31e 100644 --- a/tools/depends/configure.ac +++ b/tools/depends/configure.ac @@ -129,6 +129,11 @@ AC_ARG_WITH([ffmpeg-options], [ffmpeg_options=$withval], [ffmpeg_options=default]) +AC_ARG_ENABLE([libdovi], + [AS_HELP_STRING([--enable-libdovi], + [enable libdovi (optional for android). default is no])], + [use_libdovi=$enableval], + [use_libdovi=no]) if test "$use_ccache" = "yes"; then AC_CHECK_PROG(HAVE_CCACHE,ccache,"yes","no",) @@ -717,6 +722,7 @@ AC_SUBST(host_cxxflags) AC_SUBST(app_rendersystem) AC_SUBST(app_winsystem) AC_SUBST(ffmpeg_options) +AC_SUBST(use_libdovi) [ if test "x$CCACHE" = "x" @@ -853,4 +859,5 @@ echo -e "depends:\t\t $prefix/$deps_dir" if test "$platform_os" = "android"; then echo -e "ndk-api-level:\t $use_ndk_api" echo -e "build-tools:\t $build_tools_path" + echo -e "libdovi:\t $use_libdovi" fi diff --git a/tools/depends/native/Makefile b/tools/depends/native/Makefile index 800270f8a3..7a3db29391 100644 --- a/tools/depends/native/Makefile +++ b/tools/depends/native/Makefile @@ -50,6 +50,12 @@ ifeq ($(OS),linux) endif endif +ifeq ($(OS),android) + ifeq ($(ENABLE_LIBDOVI),yes) + NATIVE += rustup cargo-c + endif +endif + .PHONY: $(NATIVE) native all: native @@ -59,6 +65,7 @@ all: native autoconf-archive: autoconf autoconf: m4 automake: autoconf +cargo-c: pkg-config openssl rustup dpkg: automake gettext libtool pkg-config tar heimdal: libtool JsonSchemaBuilder: automake @@ -102,4 +109,3 @@ test-dependencies: distclean:: for d in $(NATIVE); do $(MAKE) -C $$d distclean; done - diff --git a/tools/depends/native/cargo-c/CARGO-C-VERSION b/tools/depends/native/cargo-c/CARGO-C-VERSION new file mode 100644 index 0000000000..3d470c5729 --- /dev/null +++ b/tools/depends/native/cargo-c/CARGO-C-VERSION @@ -0,0 +1,5 @@ +APPNAME=cargo-c +BASE_URL=https://github.com/lu-zero/cargo-c/archive +VERSION=v0.9.17 +ARCHIVE=$(VERSION).tar.gz +SHA512=529db1de509add6c3ad58932ee16326bf0a2e7d154797adbf2b3755ae98b4f59bf0d01250e75ad4fc63b7ea34579cded7d7c6c3c8b92db6d8e00994062ee136f diff --git a/tools/depends/native/cargo-c/Makefile b/tools/depends/native/cargo-c/Makefile new file mode 100644 index 0000000000..3c12014999 --- /dev/null +++ b/tools/depends/native/cargo-c/Makefile @@ -0,0 +1,38 @@ +include ../../Makefile.include CARGO-C-VERSION ../../download-files.include +DEPS = ../../Makefile.include Makefile CARGO-C-VERSION ../../download-files.include + +PREFIX=$(NATIVEPREFIX) +PLATFORM=$(NATIVEPLATFORM) + +export PKG_CONFIG_PATH=$(PREFIX)/lib/pkgconfig + +APP=$(PLATFORM)/target/release/$(APPNAME) + +CARGO_ENV_VARS = RUSTUP_HOME=$(PREFIX)/.rustup \ + CARGO_HOME=$(PREFIX)/.cargo +CARGO = $(CARGO_ENV_VARS) $(PREFIX)/bin/cargo + +CLEANUP_CMD = [ -e $(PREFIX)/bin/cargo ] \ + && $(CARGO) uninstall cargo-c || true + +all: .installed-$(PLATFORM) + +$(PLATFORM): $(DEPS) | $(TARBALLS_LOCATION)/$(ARCHIVE).$(HASH_TYPE) + rm -rf $(PLATFORM)/*; mkdir -p $(PLATFORM) + cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) + +$(APP): $(PLATFORM) + $(CARGO) build --release --manifest-path $(PLATFORM)/Cargo.toml + +.installed-$(PLATFORM): $(APP) + $(CARGO) install --profile release --path $(PLATFORM) + + touch $@ + +clean: + $(CLEANUP_CMD) + rm -f .installed-$(PLATFORM) + +distclean:: + $(CLEANUP_CMD) + rm -rf $(PLATFORM) .installed-$(PLATFORM) diff --git a/tools/depends/native/rustup/Makefile b/tools/depends/native/rustup/Makefile new file mode 100644 index 0000000000..67c014b97e --- /dev/null +++ b/tools/depends/native/rustup/Makefile @@ -0,0 +1,48 @@ +include ../../Makefile.include RUSTUP-VERSION ../../download-files.include +DEPS = ../../Makefile.include Makefile RUSTUP-VERSION ../../download-files.include + +PREFIX=$(NATIVEPREFIX) +PLATFORM=$(NATIVEPLATFORM) + +export RUSTUP_HOME=$(PREFIX)/.rustup +export CARGO_HOME=$(PREFIX)/.cargo + +APP=$(PLATFORM)/bin/$(APPNAME) + +RUSTUP_ENV_VARS = RUSTUP_HOME=$(PREFIX)/.rustup \ + CARGO_HOME=$(PREFIX)/.cargo +RUSTUP = $(RUSTUP_ENV_VARS) $(PREFIX)/bin/rustup + +CLEANUP_CMD=[ -e $(PREFIX)/bin/rustup ] \ + && $(RUSTUP) self uninstall -y \ + && rm -f $(PREFIX)/bin/rustup \ + && rm -f $(PREFIX)/bin/cargo || true + +all: .installed-$(PLATFORM) + +$(PLATFORM): $(DEPS) | $(TARBALLS_LOCATION)/$(ARCHIVE).$(HASH_TYPE) + rm -rf $(PLATFORM)/*; mkdir -p $(PLATFORM) + cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) + +$(APP): $(PLATFORM) + bash $(PLATFORM)/rustup-init.sh --no-modify-path -y + +.installed-$(PLATFORM): $(APP) + ln -sf $(CARGO_HOME)/bin/rustup $(PREFIX)/bin/rustup + ln -sf $(CARGO_HOME)/bin/cargo $(PREFIX)/bin/cargo + + $(RUSTUP) default stable + +ifeq ($(CROSS_COMPILING),yes) + $(RUSTUP) target add $(HOST) +endif + + touch $@ + +clean: + $(CLEANUP_CMD) + rm -f .installed-$(PLATFORM) + +distclean:: + $(CLEANUP_CMD) + rm -rf $(PLATFORM) .installed-$(PLATFORM) diff --git a/tools/depends/native/rustup/RUSTUP-VERSION b/tools/depends/native/rustup/RUSTUP-VERSION new file mode 100644 index 0000000000..74bd54c23a --- /dev/null +++ b/tools/depends/native/rustup/RUSTUP-VERSION @@ -0,0 +1,5 @@ +APPNAME=rustup +BASE_URL=https://github.com/rust-lang/rustup.rs/archive +VERSION=1.25.1 +ARCHIVE=$(VERSION).tar.gz +SHA512=a77cb34ba0c2e7577c8acbd474197aabaa84e3b64b3c42f1d0c328df55c6accbe412aba9a787f0ea2f0654f085475455c9c488b2b6de34ad8889a2716d1e8d0c diff --git a/tools/depends/target/Makefile b/tools/depends/target/Makefile index 28d122a602..4e18ed08ef 100644 --- a/tools/depends/target/Makefile +++ b/tools/depends/target/Makefile @@ -79,6 +79,10 @@ ifeq ($(OS),android) DEPENDS += dummy-libxbmc libuuid PYMODULE_DEPS = dummy-libxbmc LIBUUID = libuuid + + ifeq ($(ENABLE_LIBDOVI),yes) + DEPENDS += libdovi + endif endif DEPENDS := $(filter-out $(EXCLUDED_DEPENDS),$(DEPENDS)) diff --git a/tools/depends/target/libdovi/LIBDOVI-VERSION b/tools/depends/target/libdovi/LIBDOVI-VERSION new file mode 100644 index 0000000000..1fe73ed11f --- /dev/null +++ b/tools/depends/target/libdovi/LIBDOVI-VERSION @@ -0,0 +1,6 @@ +LIBNAME=libdovi +BASE_URL=https://github.com/quietvoid/dovi_tool/archive +VERSION=libdovi-3.1.2 +ARCHIVE=$(VERSION).tar.gz +SHA512=577d5a5916dedbf222150ddb76219325e0e9a7ae91c5978b1b1fd65048d1f548e29aa8ebbbdc836380ec399e2bc105a722515f783be70837dc6403cb34586bb2 +BYPRODUCT=libdovi.a diff --git a/tools/depends/target/libdovi/Makefile b/tools/depends/target/libdovi/Makefile new file mode 100644 index 0000000000..2d868d2fde --- /dev/null +++ b/tools/depends/target/libdovi/Makefile @@ -0,0 +1,43 @@ +include ../../Makefile.include LIBDOVI-VERSION ../../download-files.include +DEPS = ../../Makefile.include Makefile LIBDOVI-VERSION ../../download-files.include + +LIBDYLIB=$(PLATFORM)/target/$(HOST)/release/$(BYPRODUCT) + +CARGO_ENV_VARS = RUSTUP_HOME=$(NATIVEPREFIX)/.rustup \ + CARGO_HOME=$(NATIVEPREFIX)/.cargo +CARGO = $(CARGO_ENV_VARS) $(NATIVEPREFIX)/bin/cargo + +CARGO_BASE_OPTS = --manifest-path $(PLATFORM)/dolby_vision/Cargo.toml +ifeq ($(CROSS_COMPILING),yes) + CARGO_BASE_OPTS += --target $(HOST) +endif + +CARGO_BUILD_OPTS = --offline \ + --frozen \ + --library-type staticlib \ + --profile release \ + --prefix $(PREFIX) \ + $(CARGO_BASE_OPTS) + +all: .installed-$(PLATFORM) + +$(PLATFORM): $(DEPS) | $(TARBALLS_LOCATION)/$(ARCHIVE).$(HASH_TYPE) + rm -rf $(PLATFORM)/*; mkdir -p $(PLATFORM) + cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) + cd $(PLATFORM); + $(CARGO) fetch $(CARGO_BASE_OPTS) + +$(LIBDYLIB): $(PLATFORM) + $(CARGO) cbuild $(CARGO_BUILD_OPTS) + +.installed-$(PLATFORM): $(LIBDYLIB) + $(CARGO) cinstall $(CARGO_BUILD_OPTS) + + touch $@ + +clean: + cd $(PLATFORM); $(CARGO) clean + rm -f .installed-$(PLATFORM) + +distclean:: + rm -rf $(PLATFORM) .installed-$(PLATFORM) -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0006-Add-libdovi-as-optional-build-dependency.patch ================================================ From e4d478490bdefd7977285e1a5b807525791621c7 Mon Sep 17 00:00:00 2001 From: quietvoid <39477805+quietvoid@users.noreply.github.com> Date: Sat, 11 Mar 2023 08:40:00 -0500 Subject: [PATCH 06/21] Add libdovi as optional build dependency --- cmake/modules/FindLibDovi.cmake | 32 ++++++++++++++++++++++++++++ cmake/platform/android/android.cmake | 1 + 2 files changed, 33 insertions(+) create mode 100644 cmake/modules/FindLibDovi.cmake diff --git a/cmake/modules/FindLibDovi.cmake b/cmake/modules/FindLibDovi.cmake new file mode 100644 index 0000000000..8646ba368a --- /dev/null +++ b/cmake/modules/FindLibDovi.cmake @@ -0,0 +1,32 @@ +# FindDovi +# ------- +# Finds the libdovi library +# +# This will define the following variables:: +# +# LIBDOVI_FOUND - system has libdovi +# LIBDOVI_INCLUDE_DIRS - the libdovi include directories +# LIBDOVI_LIBRARIES - the libdovi libraries +# LIBDOVI_DEFINITIONS - the libdovi compile definitions + +if(PKG_CONFIG_FOUND) + pkg_check_modules(PC_LIBDOVI libdovi QUIET) +endif() + +find_library(LIBDOVI_LIBRARY NAMES dovi libdovi + PATHS ${PC_LIBDOVI_LIBDIR} +) +find_path(LIBDOVI_INCLUDE_DIR NAMES libdovi/rpu_parser.h + PATHS ${PC_LIBDOVI_INCLUDEDIR}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LibDovi + REQUIRED_VARS LIBDOVI_LIBRARY LIBDOVI_INCLUDE_DIR) + +if(LIBDOVI_FOUND) + set(LIBDOVI_INCLUDE_DIRS ${LIBDOVI_INCLUDE_DIR}) + set(LIBDOVI_LIBRARIES ${LIBDOVI_LIBRARY}) + set(LIBDOVI_DEFINITIONS -DHAVE_LIBDOVI=1) +endif() + +mark_as_advanced(LIBDOVI_INCLUDE_DIR LIBDOVI_LIBRARY) diff --git a/cmake/platform/android/android.cmake b/cmake/platform/android/android.cmake index 2c4fbb48f2..ca3fad9dce 100644 --- a/cmake/platform/android/android.cmake +++ b/cmake/platform/android/android.cmake @@ -1,5 +1,6 @@ set(PLATFORM_REQUIRED_DEPS LibAndroidJNI OpenGLES EGL LibZip) set(APP_RENDER_SYSTEM gles) +list(APPEND PLATFORM_OPTIONAL_DEPS LibDovi) # Store SDK compile version set(TARGET_SDK 33) -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0007-Optionally-convert-Dolby-Vision.patch ================================================ From 918640afdbf41fa2670b104346ccb11ee2b2a455 Mon Sep 17 00:00:00 2001 From: quietvoid <39477805+quietvoid@users.noreply.github.com> Date: Sat, 11 Mar 2023 08:40:03 -0500 Subject: [PATCH 07/21] Optionally convert Dolby Vision To improve compatibility --- .../resources/strings.po | 12 +++ system/settings/settings.xml | 9 +++ .../Video/DVDVideoCodecAndroidMediaCodec.cpp | 8 ++ xbmc/settings/Settings.h | 1 + xbmc/utils/BitstreamConverter.cpp | 76 ++++++++++++++++++- xbmc/utils/BitstreamConverter.h | 2 + 6 files changed, 107 insertions(+), 1 deletion(-) diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index 27c0c9e8e9..2b2237e431 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -23613,3 +23613,15 @@ msgstr "" msgctxt "#39189" msgid "Available only with manual subtitle position" msgstr "" + +#. Title of Dolby Vision RPU conversion setting +#: system/settings/settings.xml +msgctxt "#39300" +msgid "Convert Dolby Vision for compatibility" +msgstr "" + +#. Help text for setting "Convert Dolby Vision for compatibility" of label #39300 +#: system/settings/settings.xml +msgctxt "#39301" +msgid "Converts Dolby Vision profile 7 to profile 8.1, ignores enhancement layer" +msgstr "" diff --git a/system/settings/settings.xml b/system/settings/settings.xml index 3621d3225d..12a58527d9 100755 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -228,6 +228,15 @@ <default>true</default> <control type="toggle" /> </setting> + <setting id="videoplayer.convertdovi" type="boolean" label="39300" help="39301"> + <requirement>HAS_MEDIACODEC</requirement> + <level>2</level> + <default>false</default> + <updates> + <update type="change" /> + </updates> + <control type="toggle" /> + </setting> </group> <group id="4" label="14232"> <setting id="videoplayer.stereoscopicplaybackmode" type="integer" label="36520" help="36537"> diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp index ae8943655e..2135e7d6f8 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp @@ -543,7 +543,15 @@ bool CDVDVideoCodecAndroidMediaCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptio { m_bitstream.reset(); } + + if (m_bitstream) + { + bool convertDovi = CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( + CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI); + m_bitstream->SetConvertDovi(convertDovi); + } } + break; } case AV_CODEC_ID_WMV3: diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h index 8ac5485a9b..28e6c9d98d 100644 --- a/xbmc/settings/Settings.h +++ b/xbmc/settings/Settings.h @@ -133,6 +133,7 @@ public: static constexpr auto SETTING_VIDEOPLAYER_USESTAGEFRIGHT = "videoplayer.usestagefright"; static constexpr auto SETTING_VIDEOPLAYER_LIMITGUIUPDATE = "videoplayer.limitguiupdate"; static constexpr auto SETTING_VIDEOPLAYER_SUPPORTMVC = "videoplayer.supportmvc"; + static constexpr auto SETTING_VIDEOPLAYER_CONVERTDOVI = "videoplayer.convertdovi"; static constexpr auto SETTING_MYVIDEOS_SELECTACTION = "myvideos.selectaction"; static constexpr auto SETTING_MYVIDEOS_USETAGS = "myvideos.usetags"; static constexpr auto SETTING_MYVIDEOS_EXTRACTFLAGS = "myvideos.extractflags"; diff --git a/xbmc/utils/BitstreamConverter.cpp b/xbmc/utils/BitstreamConverter.cpp index 52152a4312..c51ac92138 100644 --- a/xbmc/utils/BitstreamConverter.cpp +++ b/xbmc/utils/BitstreamConverter.cpp @@ -20,6 +20,13 @@ #include <algorithm> +extern "C" +{ +#ifdef HAVE_LIBDOVI +#include <libdovi/rpu_parser.h> +#endif +} + enum { AVC_NAL_SLICE=1, AVC_NAL_DPA, @@ -269,6 +276,32 @@ static bool has_sei_recovery_point(const uint8_t *p, const uint8_t *end) return false; } +#ifdef HAVE_LIBDOVI +// The returned data must be freed with `dovi_data_free` +// May be NULL if no conversion was done +static const DoviData* convert_dovi_rpu_nal(uint8_t* buf, uint32_t nal_size) +{ + DoviRpuOpaque* rpu = dovi_parse_unspec62_nalu(buf, nal_size); + const DoviRpuDataHeader* header = dovi_rpu_get_header(rpu); + const DoviData* rpu_data = NULL; + + if (header && header->guessed_profile == 7) + { + int ret = dovi_convert_rpu_with_mode(rpu, 2); + if (ret < 0) + goto done; + + rpu_data = dovi_write_unspec62_nalu(rpu); + } + +done: + dovi_rpu_free_header(header); + dovi_rpu_free(rpu); + + return rpu_data; +} +#endif + //////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////// CBitstreamParser::CBitstreamParser() = default; @@ -336,6 +369,7 @@ CBitstreamConverter::CBitstreamConverter() m_convert_bytestream = false; m_sps_pps_context.sps_pps_data = NULL; m_start_decode = true; + m_convert_dovi = false; } CBitstreamConverter::~CBitstreamConverter() @@ -894,6 +928,10 @@ bool CBitstreamConverter::BitstreamConvert(uint8_t* pData, int iSize, uint8_t ** uint32_t cumul_size = 0; const uint8_t *buf_end = buf + buf_size; +#ifdef HAVE_LIBDOVI + const DoviData* rpu_data = NULL; +#endif + switch (m_codec) { case AV_CODEC_ID_H264: @@ -947,12 +985,48 @@ bool CBitstreamConverter::BitstreamConvert(uint8_t* pData, int iSize, uint8_t ** } else { - BitstreamAllocAndCopy(poutbuf, poutbuf_size, NULL, 0, buf, nal_size, unit_type); + bool write_buf = true; + const uint8_t* buf_to_write = buf; + int32_t final_nal_size = nal_size; + if (!m_sps_pps_context.first_idr && IsSlice(unit_type)) { m_sps_pps_context.first_idr = 1; m_sps_pps_context.idr_sps_pps_seen = 0; } + + if (m_convert_dovi) + { + if (unit_type == HEVC_NAL_UNSPEC62) + { +#ifdef HAVE_LIBDOVI + // Convert the RPU itself + rpu_data = convert_dovi_rpu_nal(buf, nal_size); + if (rpu_data) + { + buf_to_write = rpu_data->data; + final_nal_size = rpu_data->len; + } +#endif + } + else if (unit_type == HEVC_NAL_UNSPEC63) + { + // Ignore the enhancement layer, may or may not help + write_buf = false; + } + } + + if (write_buf) + BitstreamAllocAndCopy(poutbuf, poutbuf_size, NULL, 0, buf_to_write, final_nal_size, + unit_type); + +#ifdef HAVE_LIBDOVI + if (rpu_data) + { + dovi_data_free(rpu_data); + rpu_data = NULL; + } +#endif } buf += nal_size; diff --git a/xbmc/utils/BitstreamConverter.h b/xbmc/utils/BitstreamConverter.h index 355818ed8f..4381599b21 100644 --- a/xbmc/utils/BitstreamConverter.h +++ b/xbmc/utils/BitstreamConverter.h @@ -104,6 +104,7 @@ public: int GetExtraSize() const; void ResetStartDecode(void); bool CanStartDecode() const; + void SetConvertDovi(bool value) { m_convert_dovi = value; } static bool mpeg2_sequence_header(const uint8_t *data, const uint32_t size, mpeg2_sequence *sequence); static bool h264_sequence_header(const uint8_t *data, const uint32_t size, h264_sequence *sequence); @@ -150,4 +151,5 @@ protected: bool m_convert_bytestream; AVCodecID m_codec; bool m_start_decode; + bool m_convert_dovi; }; -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0008-tools-depends-Enable-libdovi-by-default.patch ================================================ From 733957e20ecb3c1694ac5952a85974da11e5ae22 Mon Sep 17 00:00:00 2001 From: quietvoid <39477805+quietvoid@users.noreply.github.com> Date: Sat, 11 Mar 2023 08:40:06 -0500 Subject: [PATCH 08/21] tools/depends: Enable libdovi by default Temporarily --- tools/depends/configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/depends/configure.ac b/tools/depends/configure.ac index 929300b31e..f084ce9d2b 100644 --- a/tools/depends/configure.ac +++ b/tools/depends/configure.ac @@ -133,7 +133,7 @@ AC_ARG_ENABLE([libdovi], [AS_HELP_STRING([--enable-libdovi], [enable libdovi (optional for android). default is no])], [use_libdovi=$enableval], - [use_libdovi=no]) + [use_libdovi=yes]) if test "$use_ccache" = "yes"; then AC_CHECK_PROG(HAVE_CCACHE,ccache,"yes","no",) -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0009-libdovi-use-and-adjust-libdovi-for-Amlogic-linux-pla.patch ================================================ From c3bf4157843319e7c457a89dd02355347d91507e Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 6 Apr 2023 21:07:55 +0200 Subject: [PATCH 09/21] libdovi: use and adjust libdovi for Amlogic linux platform --- cmake/platform/linux/aml.cmake | 1 + system/settings/settings.xml | 9 +++++++-- tools/depends/target/Makefile | 8 ++++---- .../DVDCodecs/Video/DVDVideoCodecAmlogic.cpp | 18 ++++++++++++++++++ 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/cmake/platform/linux/aml.cmake b/cmake/platform/linux/aml.cmake index 4206c283e2..673877bd16 100644 --- a/cmake/platform/linux/aml.cmake +++ b/cmake/platform/linux/aml.cmake @@ -1,2 +1,3 @@ list(APPEND PLATFORM_REQUIRED_DEPS OpenGLES AML EGL LibInput Xkbcommon) set(APP_RENDER_SYSTEM gles) +list(APPEND PLATFORM_OPTIONAL_DEPS LibDovi) diff --git a/system/settings/settings.xml b/system/settings/settings.xml index 12a58527d9..5268475ca7 100755 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -229,9 +229,14 @@ <control type="toggle" /> </setting> <setting id="videoplayer.convertdovi" type="boolean" label="39300" help="39301"> - <requirement>HAS_MEDIACODEC</requirement> + <requirement> + <or> + <condition>HAS_MEDIACODEC</condition> + <condition>HAVE_AMCODEC</condition> + </or> + </requirement> <level>2</level> - <default>false</default> + <default>true</default> <updates> <update type="change" /> </updates> diff --git a/tools/depends/target/Makefile b/tools/depends/target/Makefile index 4e18ed08ef..91ea4db5ef 100644 --- a/tools/depends/target/Makefile +++ b/tools/depends/target/Makefile @@ -79,10 +79,6 @@ ifeq ($(OS),android) DEPENDS += dummy-libxbmc libuuid PYMODULE_DEPS = dummy-libxbmc LIBUUID = libuuid - - ifeq ($(ENABLE_LIBDOVI),yes) - DEPENDS += libdovi - endif endif DEPENDS := $(filter-out $(EXCLUDED_DEPENDS),$(DEPENDS)) @@ -126,6 +122,10 @@ ifeq ($(OS),linux) endif endif +ifeq ($(ENABLE_LIBDOVI),yes) + DEPENDS += libdovi +endif + .PHONY: $(DEPENDS) all: .installed-$(PLATFORM) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp index 4ce0c3e48f..9d518f0051 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp @@ -277,6 +277,24 @@ bool CDVDVideoCodecAmlogic::Open(CDVDStreamInfo &hints, CDVDCodecOptions &option m_pFormatName = "am-h265"; m_bitstream = new CBitstreamConverter(); m_bitstream->Open(m_hints.codec, (uint8_t*)m_hints.extradata, m_hints.extrasize, true); + + // check for hevc-hvcC and convert to h265-annex-b + if (m_hints.extradata && !m_hints.cryptoSession) + { + if (m_bitstream && aml_support_dolby_vision()) + { + bool convertDovi = CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( + CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI); + bool user_dv_disable = CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( + CSettings::SETTING_COREELEC_AMLOGIC_DV_DISABLE); + if (convertDovi && !user_dv_disable) + { + CLog::Log(LOGDEBUG, "{}::{} - HEVC bitstream profile 7 will be converted to profile 8", __MODULE_NAME__, __FUNCTION__); + m_bitstream->SetConvertDovi(convertDovi && !user_dv_disable); + } + } + } + // make sure we do not leak the existing m_hints.extradata free(m_hints.extradata); m_hints.extrasize = m_bitstream->GetExtraSize(); -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0010-AMLCodec-add-support-of-Dolby-Vision.patch ================================================ From 75e4138e9b05ba26a2573b930bda53a6e44ccc5e Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Wed, 29 Mar 2023 16:36:49 +0200 Subject: [PATCH 10/21] AMLCodec: add support of Dolby Vision If 'dovi.ko' is available enable the DV option. --- .../resources/strings.po | 10 +++++ system/settings/settings.xml | 5 +++ .../VideoPlayer/DVDCodecs/Video/AMLCodec.cpp | 45 +++++++++++++++++++ xbmc/settings/Settings.h | 1 + xbmc/utils/AMLUtils.cpp | 20 +++++++++ xbmc/utils/AMLUtils.h | 1 + xbmc/windowing/amlogic/WinSystemAmlogic.cpp | 17 +++++++ 7 files changed, 99 insertions(+) diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index 2b2237e431..285d5d07b2 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -8669,6 +8669,16 @@ msgctxt "#14295" msgid "4:4:4" msgstr "" +#: system/settings/settings.xml +msgctxt "#14296" +msgid "Disable Dolby Vision support" +msgstr "" + +#: system/settings/settings.xml +msgctxt "#14297" +msgid "Use this option to disable Dolby Vision support if available." +msgstr "" + #empty strings from id 14296 to 14300 #. pvr "channels" settings group label diff --git a/system/settings/settings.xml b/system/settings/settings.xml index 5268475ca7..1b95376834 100755 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -3681,6 +3681,11 @@ <dependency type="enable" setting="coreelec.amlogic.sdr2hdr" operator="is">false</dependency> </dependencies> </setting> + <setting id="coreelec.amlogic.disabledolbyvision" type="boolean" label="14296" help="14297"> + <requirement>HAVE_AMCODEC</requirement> + <default>false</default> + <control type="toggle" /> + </setting> </group> </category> <category id="cache" label="439" help="36399"> diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp index 7ae850d048..59777ee196 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp @@ -22,6 +22,7 @@ #include "settings/SettingsComponent.h" #include "utils/AMLUtils.h" #include "utils/log.h" +#include "utils/StreamDetails.h" #include "utils/StringUtils.h" #include "utils/TimeUtils.h" #include "ServiceBroker.h" @@ -110,6 +111,7 @@ typedef struct { void *param; dec_mode_t dec_mode; enum FRAME_BASE_VIDEO_PATH video_path; + unsigned int dv_enable; } aml_generic_param; class DllLibamCodecInterface @@ -218,6 +220,7 @@ public: p_out->am_sysinfo.param = p_in->param; p_out->dec_mode = p_in->dec_mode; p_out->video_path = p_in->video_path; + p_out->dv_enable = p_in->dv_enable; } }; @@ -1965,6 +1968,15 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints) hints.aspect, video_ratio.num, video_ratio.den); CLog::Log(LOGDEBUG, "CAMLCodec::OpenDecoder hints.orientation({:d}), hints.forced_aspect({:d}), hints.extrasize({:d})", hints.orientation, hints.forced_aspect, hints.extrasize); + + std::string hdrType = CStreamDetails::HdrTypeToString(hints.hdrType); + if (hdrType.size()) + CLog::Log(LOGDEBUG, "CAMLCodec::OpenDecoder hdr type: {}", hdrType); + + if (hints.hdrType == StreamHdrType::HDR_TYPE_DOLBYVISION) + CLog::Log(LOGDEBUG, "CAMLCodec::OpenDecoder DOVI: version {:d}.{:d}, profile {:d}", + hints.dovi.dv_version_major, hints.dovi.dv_version_minor, hints.dovi.dv_profile); + m_processInfo.SetVideoDAR(hints.aspect); CLog::Log(LOGDEBUG, "CAMLCodec::OpenDecoder decoder timeout: {:d}s", m_decoder_timeout); @@ -1984,6 +1996,33 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints) am_private->gcodec.dec_mode = STREAM_TYPE_FRAME; am_private->gcodec.video_path = FRAME_BASE_PATH_AMLVIDEO_AMVIDEO; + // enable Dolby Vision driver when 'dovi.ko' is available + bool device_support_dv(aml_support_dolby_vision()); + bool user_dv_disable(CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_COREELEC_AMLOGIC_DV_DISABLE)); + bool dv_enable(device_support_dv && !user_dv_disable && hints.hdrType == StreamHdrType::HDR_TYPE_DOLBYVISION); + CLog::Log(LOGDEBUG, "CAMLCodec::OpenDecoder {}DV support, {}, DV system is {}", device_support_dv ? "" : "no ", + user_dv_disable ? "disabled" : "enabled", dv_enable ? "enabled" : "disabled"); + if (dv_enable) + { + // enable Dolby Vision + CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 1); + + am_private->gcodec.dv_enable = 1; + if (hints.dovi.dv_profile == 7 && !CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( + CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI)) + { + CSysfsPath amdolby_vision_debug{"/sys/class/amdolby_vision/debug"}; + if (amdolby_vision_debug.Exists()) + amdolby_vision_debug.Set("enable_fel 1"); + am_private->gcodec.dec_mode = STREAM_TYPE_STREAM; + } + } + else if (device_support_dv) + { + // disable Dolby Vision + CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 0); + } + // DEC_CONTROL_FLAG_DISABLE_FAST_POC CSysfsPath("/sys/module/amvdec_h264/parameters/dec_control", 4); @@ -2241,6 +2280,12 @@ void CAMLCodec::CloseDecoder() free(am_private->vcodec.config); // return tsync to default so external apps work CSysfsPath("/sys/class/tsync/enable", 1); + // disable Dolby Vision driver + //CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 0); + // don't disable it as it would not switch back to non DV mode anymore + CSysfsPath amdolby_vision_debug{"/sys/class/amdolby_vision/debug"}; + if (amdolby_vision_debug.Exists()) + amdolby_vision_debug.Set("enable_fel 0"); ShowMainVideo(false); diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h index 28e6c9d98d..8e5a31e1d7 100644 --- a/xbmc/settings/Settings.h +++ b/xbmc/settings/Settings.h @@ -441,6 +441,7 @@ public: static constexpr auto SETTING_COREELEC_AMLOGIC_LIMIT_CD = "coreelec.amlogic.limitcd"; static constexpr auto SETTING_COREELEC_AMLOGIC_FORCE_CS = "coreelec.amlogic.forcecs"; static constexpr auto SETTING_COREELEC_AMLOGIC_DISABLEGUISCALING = "coreelec.amlogic.disableguiscaling"; + static constexpr auto SETTING_COREELEC_AMLOGIC_DV_DISABLE = "coreelec.amlogic.disabledolbyvision"; static constexpr auto SETTING_CACHE_HARDDISK = "cache.harddisk"; static constexpr auto SETTING_CACHEVIDEO_DVDROM = "cachevideo.dvdrom"; static constexpr auto SETTING_CACHEVIDEO_LAN = "cachevideo.lan"; diff --git a/xbmc/utils/AMLUtils.cpp b/xbmc/utils/AMLUtils.cpp index 81f74448a8..c9e60d5c5f 100644 --- a/xbmc/utils/AMLUtils.cpp +++ b/xbmc/utils/AMLUtils.cpp @@ -148,6 +148,26 @@ bool aml_support_av1() return (has_av1 == 1); } +bool aml_support_dolby_vision() +{ + static int support_dv = -1; + + if (support_dv == -1) + { + CSysfsPath support_info{"/sys/class/amdolby_vision/support_info"}; + support_dv = 0; + if (support_info.Exists()) + { + support_dv = (int)((support_info.Get<int>().value() & 7) == 7); + CSysfsPath ko_info{"/sys/class/amdolby_vision/ko_info"}; + if (ko_info.Exists()) + CLog::Log(LOGDEBUG, "Amlogic Dolby Vision info: {}", ko_info.Get<std::string>().value().c_str()); + } + } + + return (support_dv == 1); +} + bool aml_has_frac_rate_policy() { static int has_frac_rate_policy = -1; diff --git a/xbmc/utils/AMLUtils.h b/xbmc/utils/AMLUtils.h index bfb06194bc..25e95d6961 100644 --- a/xbmc/utils/AMLUtils.h +++ b/xbmc/utils/AMLUtils.h @@ -56,6 +56,7 @@ bool aml_support_hevc_10bit(); AML_SUPPORT_H264_4K2K aml_support_h264_4k2k(); bool aml_support_vp9(); bool aml_support_av1(); +bool aml_support_dolby_vision(); bool aml_has_frac_rate_policy(); void aml_set_audio_passthrough(bool passthrough); bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res); diff --git a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp index 0a52b95144..616c205e6f 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp @@ -90,6 +90,23 @@ bool CWinSystemAmlogic::InitWindowSystem() CSysfsPath("/sys/module/am_vecm/parameters/hdr_mode", 1); } + if (!aml_support_dolby_vision()) + { + auto setting = settings->GetSetting(CSettings::SETTING_COREELEC_AMLOGIC_DV_DISABLE); + if (setting) + { + setting->SetVisible(false); + settings->SetBool(CSettings::SETTING_COREELEC_AMLOGIC_DV_DISABLE, false); + } + + setting = settings->GetSetting(CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI); + if (setting) + { + setting->SetVisible(false); + settings->SetBool(CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI, true); + } + } + m_nativeDisplay = EGL_DEFAULT_DISPLAY; CDVDVideoCodecAmlogic::Register(); -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0011-libdovi-add-option-to-change-used-mode.patch ================================================ From 0fb60a17b2401ab655f5b2674e902545b144795a Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Tue, 11 Apr 2023 15:06:33 +0200 Subject: [PATCH 11/21] libdovi: add option to change used mode Modes: 0: Don't modify the RPU 1: Converts the RPU to be MEL compatible 2: Converts the RPU to be profile 8.1 compatible. Both luma and chroma mapping curves are set to no-op. This mode handles source profiles 5, 7 and 8. 3: Converts to static profile 8.4 4: Converts to profile 8.1 preserving luma and chroma mapping. Old mode 2 behaviour. Reference: https://github.com/quietvoid/dovi_tool/blob/main/dolby_vision/src/rpu/dovi_rpu.rs --- .../resources/strings.po | 32 ++++++++++++++++++- system/settings/settings.xml | 16 ++++++++-- .../VideoPlayer/DVDCodecs/Video/AMLCodec.cpp | 4 +-- .../DVDCodecs/Video/DVDVideoCodecAmlogic.cpp | 7 ++-- .../Video/DVDVideoCodecAndroidMediaCodec.cpp | 2 +- xbmc/utils/BitstreamConverter.cpp | 8 ++--- xbmc/utils/BitstreamConverter.h | 4 +-- xbmc/windowing/amlogic/WinSystemAmlogic.cpp | 2 +- 8 files changed, 58 insertions(+), 17 deletions(-) diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index 285d5d07b2..3b05260f01 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -23633,5 +23633,35 @@ msgstr "" #. Help text for setting "Convert Dolby Vision for compatibility" of label #39300 #: system/settings/settings.xml msgctxt "#39301" -msgid "Converts Dolby Vision profile 7 to profile 8.1, ignores enhancement layer" +msgid "Converts Dolby Vision profile 7 by chosen mode" +msgstr "" + +#. Enum value for "Convert Dolby Vision for compatibility" of label #39300 +#: system/settings/settings.xml +msgctxt "#39302" +msgid "Lossless" +msgstr "" + +#. Enum value for "Convert Dolby Vision for compatibility" of label #39300 +#: system/settings/settings.xml +msgctxt "#39303" +msgid "Minimal EL" +msgstr "" + +#. Enum value for "Convert Dolby Vision for compatibility" of label #39300 +#: system/settings/settings.xml +msgctxt "#39304" +msgid "Profile 8.1" +msgstr "" + +#. Enum value for "Convert Dolby Vision for compatibility" of label #39300 +#: system/settings/settings.xml +msgctxt "#39305" +msgid "Profile 8.4" +msgstr "" + +#. Enum value for "Convert Dolby Vision for compatibility" of label #39300 +#: system/settings/settings.xml +msgctxt "#39306" +msgid "Profile 8.1 MP" msgstr "" diff --git a/system/settings/settings.xml b/system/settings/settings.xml index 1b95376834..7ede7a22bb 100755 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -228,7 +228,7 @@ <default>true</default> <control type="toggle" /> </setting> - <setting id="videoplayer.convertdovi" type="boolean" label="39300" help="39301"> + <setting id="videoplayer.convertdovi" type="integer" label="39300" help="39301"> <requirement> <or> <condition>HAS_MEDIACODEC</condition> @@ -236,11 +236,21 @@ </or> </requirement> <level>2</level> - <default>true</default> + <default>2</default> <updates> <update type="change" /> </updates> - <control type="toggle" /> + <constraints> + <options> + <option label="39302">0</option> <!-- Lossless --> + <option label="39303">1</option> <!-- ToMel --> + <option label="39304">2</option> <!-- To81 --> + <option label="39305">3</option> <!-- To84 --> + <option label="39306">4</option> <!-- To81MappingPreserved --> + </options> + </constraints> + <control type="spinner" format="string" /> + <control type="edit" format="integer" /> </setting> </group> <group id="4" label="14232"> diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp index 59777ee196..8a7344d805 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp @@ -2008,8 +2008,8 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints) CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 1); am_private->gcodec.dv_enable = 1; - if (hints.dovi.dv_profile == 7 && !CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( - CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI)) + if (hints.dovi.dv_profile == 7 && CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt( + CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI) == 0) { CSysfsPath amdolby_vision_debug{"/sys/class/amdolby_vision/debug"}; if (amdolby_vision_debug.Exists()) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp index 9d518f0051..12f81442d7 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp @@ -283,14 +283,15 @@ bool CDVDVideoCodecAmlogic::Open(CDVDStreamInfo &hints, CDVDCodecOptions &option { if (m_bitstream && aml_support_dolby_vision()) { - bool convertDovi = CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( + int convertDovi = CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt( CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI); bool user_dv_disable = CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( CSettings::SETTING_COREELEC_AMLOGIC_DV_DISABLE); if (convertDovi && !user_dv_disable) { - CLog::Log(LOGDEBUG, "{}::{} - HEVC bitstream profile 7 will be converted to profile 8", __MODULE_NAME__, __FUNCTION__); - m_bitstream->SetConvertDovi(convertDovi && !user_dv_disable); + CLog::Log(LOGDEBUG, "{}::{} - HEVC bitstream profile 7 will be converted by chosen mode {:d}", + __MODULE_NAME__, __FUNCTION__, convertDovi); + m_bitstream->SetConvertDovi(convertDovi); } } } diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp index 2135e7d6f8..bba297770e 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp @@ -546,7 +546,7 @@ bool CDVDVideoCodecAndroidMediaCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptio if (m_bitstream) { - bool convertDovi = CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( + int convertDovi = CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt( CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI); m_bitstream->SetConvertDovi(convertDovi); } diff --git a/xbmc/utils/BitstreamConverter.cpp b/xbmc/utils/BitstreamConverter.cpp index c51ac92138..53cab7c680 100644 --- a/xbmc/utils/BitstreamConverter.cpp +++ b/xbmc/utils/BitstreamConverter.cpp @@ -279,7 +279,7 @@ static bool has_sei_recovery_point(const uint8_t *p, const uint8_t *end) #ifdef HAVE_LIBDOVI // The returned data must be freed with `dovi_data_free` // May be NULL if no conversion was done -static const DoviData* convert_dovi_rpu_nal(uint8_t* buf, uint32_t nal_size) +static const DoviData* convert_dovi_rpu_nal(uint8_t* buf, uint32_t nal_size, int mode) { DoviRpuOpaque* rpu = dovi_parse_unspec62_nalu(buf, nal_size); const DoviRpuDataHeader* header = dovi_rpu_get_header(rpu); @@ -287,7 +287,7 @@ static const DoviData* convert_dovi_rpu_nal(uint8_t* buf, uint32_t nal_size) if (header && header->guessed_profile == 7) { - int ret = dovi_convert_rpu_with_mode(rpu, 2); + int ret = dovi_convert_rpu_with_mode(rpu, mode); if (ret < 0) goto done; @@ -369,7 +369,7 @@ CBitstreamConverter::CBitstreamConverter() m_convert_bytestream = false; m_sps_pps_context.sps_pps_data = NULL; m_start_decode = true; - m_convert_dovi = false; + m_convert_dovi = 0; } CBitstreamConverter::~CBitstreamConverter() @@ -1001,7 +1001,7 @@ bool CBitstreamConverter::BitstreamConvert(uint8_t* pData, int iSize, uint8_t ** { #ifdef HAVE_LIBDOVI // Convert the RPU itself - rpu_data = convert_dovi_rpu_nal(buf, nal_size); + rpu_data = convert_dovi_rpu_nal(buf, nal_size, m_convert_dovi); if (rpu_data) { buf_to_write = rpu_data->data; diff --git a/xbmc/utils/BitstreamConverter.h b/xbmc/utils/BitstreamConverter.h index 4381599b21..bbfa3ed361 100644 --- a/xbmc/utils/BitstreamConverter.h +++ b/xbmc/utils/BitstreamConverter.h @@ -104,7 +104,7 @@ public: int GetExtraSize() const; void ResetStartDecode(void); bool CanStartDecode() const; - void SetConvertDovi(bool value) { m_convert_dovi = value; } + void SetConvertDovi(int value) { m_convert_dovi = value; } static bool mpeg2_sequence_header(const uint8_t *data, const uint32_t size, mpeg2_sequence *sequence); static bool h264_sequence_header(const uint8_t *data, const uint32_t size, h264_sequence *sequence); @@ -151,5 +151,5 @@ protected: bool m_convert_bytestream; AVCodecID m_codec; bool m_start_decode; - bool m_convert_dovi; + int m_convert_dovi; }; diff --git a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp index 616c205e6f..6f57b7efcb 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp @@ -103,7 +103,7 @@ bool CWinSystemAmlogic::InitWindowSystem() if (setting) { setting->SetVisible(false); - settings->SetBool(CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI, true); + settings->SetInt(CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI, 2); } } -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0012-AMLCodec-add-user-setting-player-led.patch ================================================ From d1dc56abe3fff3da1a075e6023aa86265339ef37 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 14 Apr 2023 11:19:44 +0200 Subject: [PATCH 12/21] AMLCodec: add user setting player led Added the option when display led and player led mode is supported by the display. --- .../resource.language.en_gb/resources/strings.po | 12 +++++++++++- system/settings/settings.xml | 6 ++++++ .../VideoPlayer/DVDCodecs/Video/AMLCodec.cpp | 12 ++++++++++++ xbmc/settings/Settings.h | 1 + xbmc/utils/AMLUtils.cpp | 16 ++++++++++++++++ xbmc/utils/AMLUtils.h | 1 + xbmc/windowing/amlogic/WinSystemAmlogic.cpp | 14 ++++++++++++++ 7 files changed, 61 insertions(+), 1 deletion(-) diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index 3b05260f01..4c52795d32 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -8679,7 +8679,17 @@ msgctxt "#14297" msgid "Use this option to disable Dolby Vision support if available." msgstr "" -#empty strings from id 14296 to 14300 +#: system/settings/settings.xml +msgctxt "#14298" +msgid "Use Player Led" +msgstr "" + +#: system/settings/settings.xml +msgctxt "#14299" +msgid "Use Player Led mode (YCbCr 4:2:2) instead Display Led (RGB tunneling) for Dolby Vision." +msgstr "" + +#empty strings from id 14300 to 14300 #. pvr "channels" settings group label #: system/settings/settings.xml diff --git a/system/settings/settings.xml b/system/settings/settings.xml index 7ede7a22bb..d656de67d1 100755 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -3696,6 +3696,12 @@ <default>false</default> <control type="toggle" /> </setting> + <setting id="coreelec.amlogic.useplayerled" type="boolean" label="14298" help="14299"> + <requirement>HAVE_AMCODEC</requirement> + <visible>false</visible> + <default>false</default> + <control type="toggle" /> + </setting> </group> </category> <category id="cache" label="439" help="36399"> diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp index 8a7344d805..1609177451 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp @@ -291,6 +291,8 @@ typedef struct hdr_buf { int size; } hdr_buf_t; +#define FLAG_FORCE_DV_LL (unsigned int)(0x4000) + typedef struct am_packet { AVPacket avpkt; uint64_t avpts; @@ -2007,6 +2009,16 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints) // enable Dolby Vision CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 1); + // force player led mode when enabled + CSysfsPath dolby_vision_flags{"/sys/module/amdolby_vision/parameters/dolby_vision_flags"}; + if (dolby_vision_flags.Exists()) + { + if (CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_COREELEC_AMLOGIC_USE_PLAYERLED)) + dolby_vision_flags.Set(dolby_vision_flags.Get<unsigned int>().value() | FLAG_FORCE_DV_LL); + else + dolby_vision_flags.Set(dolby_vision_flags.Get<unsigned int>().value() & ~(FLAG_FORCE_DV_LL)); + } + am_private->gcodec.dv_enable = 1; if (hints.dovi.dv_profile == 7 && CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt( CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI) == 0) diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h index 8e5a31e1d7..f999b284e9 100644 --- a/xbmc/settings/Settings.h +++ b/xbmc/settings/Settings.h @@ -442,6 +442,7 @@ public: static constexpr auto SETTING_COREELEC_AMLOGIC_FORCE_CS = "coreelec.amlogic.forcecs"; static constexpr auto SETTING_COREELEC_AMLOGIC_DISABLEGUISCALING = "coreelec.amlogic.disableguiscaling"; static constexpr auto SETTING_COREELEC_AMLOGIC_DV_DISABLE = "coreelec.amlogic.disabledolbyvision"; + static constexpr auto SETTING_COREELEC_AMLOGIC_USE_PLAYERLED = "coreelec.amlogic.useplayerled"; static constexpr auto SETTING_CACHE_HARDDISK = "cache.harddisk"; static constexpr auto SETTING_CACHEVIDEO_DVDROM = "cachevideo.dvdrom"; static constexpr auto SETTING_CACHEVIDEO_LAN = "cachevideo.lan"; diff --git a/xbmc/utils/AMLUtils.cpp b/xbmc/utils/AMLUtils.cpp index c9e60d5c5f..fd35427e93 100644 --- a/xbmc/utils/AMLUtils.cpp +++ b/xbmc/utils/AMLUtils.cpp @@ -56,6 +56,22 @@ int aml_get_cpufamily_id() return aml_cpufamily_id; } +bool aml_dv_support_ll() +{ + int support_ll = 0; + CRegExp regexp; + regexp.RegComp("YCbCr_422_12BIT"); + std::string valstr; + CSysfsPath dv_cap{"/sys/devices/virtual/amhdmitx/amhdmitx0/dv_cap"}; + if (dv_cap.Exists()) + { + valstr = dv_cap.Get<std::string>().value(); + support_ll = (regexp.RegFind(valstr) >= 0) ? 1 : 0; + } + + return support_ll; +} + static bool aml_support_vcodec_profile(const char *regex) { int profile = 0; diff --git a/xbmc/utils/AMLUtils.h b/xbmc/utils/AMLUtils.h index 25e95d6961..16f32b2d0a 100644 --- a/xbmc/utils/AMLUtils.h +++ b/xbmc/utils/AMLUtils.h @@ -49,6 +49,7 @@ enum AML_SUPPORT_H264_4K2K #define AML_SM1 0x2B int aml_get_cpufamily_id(); +bool aml_dv_support_ll(); bool aml_support_hevc(); bool aml_support_hevc_4k2k(); bool aml_support_hevc_8k4k(); diff --git a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp index 6f57b7efcb..4c5424d136 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp @@ -99,6 +99,13 @@ bool CWinSystemAmlogic::InitWindowSystem() settings->SetBool(CSettings::SETTING_COREELEC_AMLOGIC_DV_DISABLE, false); } + setting = settings->GetSetting(CSettings::SETTING_COREELEC_AMLOGIC_USE_PLAYERLED); + if (setting) + { + setting->SetVisible(false); + settings->SetBool(CSettings::SETTING_COREELEC_AMLOGIC_USE_PLAYERLED, false); + } + setting = settings->GetSetting(CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI); if (setting) { @@ -106,6 +113,13 @@ bool CWinSystemAmlogic::InitWindowSystem() settings->SetInt(CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI, 2); } } + else if (aml_dv_support_ll()) + { + CLog::Log(LOGDEBUG, "CWinSystemAmlogic::InitWindowSystem -- display do support Dolby Vision Low Latency"); + auto setting = settings->GetSetting(CSettings::SETTING_COREELEC_AMLOGIC_USE_PLAYERLED); + if (setting) + setting->SetVisible(true); + } m_nativeDisplay = EGL_DEFAULT_DISPLAY; -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0013-Always-force-a-mode-switch-on-resolution-change-on-A.patch ================================================ From 077b90bdb547610c24d29da2215325bbae5f1181 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 20 Apr 2023 20:25:25 +0200 Subject: [PATCH 13/21] Always force a mode switch on resolution change on Amlogic platform If the mode switch is really required is checked afterwards in WinSystemAmlogic system. --- xbmc/windowing/GraphicContext.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/xbmc/windowing/GraphicContext.cpp b/xbmc/windowing/GraphicContext.cpp index 2688fb999e..d9538ebf46 100644 --- a/xbmc/windowing/GraphicContext.cpp +++ b/xbmc/windowing/GraphicContext.cpp @@ -398,6 +398,9 @@ void CGraphicContext::SetVideoResolution(RESOLUTION res, bool forceUpdate) void CGraphicContext::SetVideoResolutionInternal(RESOLUTION res, bool forceUpdate) { RESOLUTION lastRes = m_Resolution; +#if defined(HAS_LIBAMCODEC) + forceUpdate = true; +#endif // If the user asked us to guess, go with desktop if (!IsValidResolution(res)) -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0014-AMLCodec-on-Dolby-Vision-playback-stop-wait-until-vi.patch ================================================ From c405fada82ff51a770e18ef5b84b3ac695051d73 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 21 Apr 2023 10:39:45 +0200 Subject: [PATCH 14/21] AMLCodec: on Dolby Vision playback stop wait until video is off The driver need first to clean up on video off. --- .../VideoPlayer/DVDCodecs/Video/AMLCodec.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp index 1609177451..dad0690ef2 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp @@ -2007,7 +2007,7 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints) if (dv_enable) { // enable Dolby Vision - CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 1); + CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 'Y'); // force player led mode when enabled CSysfsPath dolby_vision_flags{"/sys/module/amdolby_vision/parameters/dolby_vision_flags"}; @@ -2032,7 +2032,7 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints) else if (device_support_dv) { // disable Dolby Vision - CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 0); + CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 'N'); } // DEC_CONTROL_FLAG_DISABLE_FAST_POC @@ -2293,8 +2293,19 @@ void CAMLCodec::CloseDecoder() // return tsync to default so external apps work CSysfsPath("/sys/class/tsync/enable", 1); // disable Dolby Vision driver - //CSysfsPath("/sys/module/amdolby_vision/parameters/dolby_vision_enable", 0); - // don't disable it as it would not switch back to non DV mode anymore + CSysfsPath dolby_vision_enable{"/sys/module/amdolby_vision/parameters/dolby_vision_enable"}; + if (dolby_vision_enable.Exists() && StringUtils::EqualsNoCase(dolby_vision_enable.Get<std::string>().value(), "Y")) + { + CSysfsPath dv_video_on{"/sys/class/amdolby_vision/dv_video_on"}; + if (dv_video_on.Exists()) + { + std::chrono::time_point<std::chrono::system_clock> now(std::chrono::system_clock::now()); + while(dv_video_on.Get<int>().value() == 1 && (std::chrono::system_clock::now() - now) < std::chrono::seconds(m_decoder_timeout)) + usleep(10000); // wait 10ms + } + dolby_vision_enable.Set('N'); + } + CSysfsPath amdolby_vision_debug{"/sys/class/amdolby_vision/debug"}; if (amdolby_vision_debug.Exists()) amdolby_vision_debug.Set("enable_fel 0"); -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0015-WinSystemAmlogic-rework-mode-switch-mechanism.patch ================================================ From 36a8072f7e006c4e34100e589a05b3e79f3c06af Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 20 Apr 2023 20:22:41 +0200 Subject: [PATCH 15/21] WinSystemAmlogic: rework mode switch mechanism Because of Dolby Vision it is possible resolution and frequency do not change. But if colour subsampling or colour depth is changed a forced mode switch is required. Force mode switch by set mode 'null' In special cases a hard mode reset is needed like 4k420 to 4kDV. --- xbmc/utils/AMLUtils.cpp | 10 +- xbmc/utils/AMLUtils.h | 4 +- xbmc/windowing/amlogic/WinSystemAmlogic.cpp | 46 +++------ xbmc/windowing/amlogic/WinSystemAmlogic.h | 6 +- .../amlogic/WinSystemAmlogicGLESContext.cpp | 99 ++++++++++++++++++- .../amlogic/WinSystemAmlogicGLESContext.h | 5 +- 6 files changed, 124 insertions(+), 46 deletions(-) diff --git a/xbmc/utils/AMLUtils.cpp b/xbmc/utils/AMLUtils.cpp index fd35427e93..33e449408d 100644 --- a/xbmc/utils/AMLUtils.cpp +++ b/xbmc/utils/AMLUtils.cpp @@ -412,12 +412,13 @@ bool aml_get_native_resolution(RESOLUTION_INFO *res) return result; } -bool aml_set_native_resolution(const RESOLUTION_INFO &res, std::string framebuffer_name, const int stereo_mode) +bool aml_set_native_resolution(const RESOLUTION_INFO &res, std::string framebuffer_name, + const int stereo_mode, bool force_mode_switch) { bool result = false; aml_handle_display_stereo_mode(RENDER_STEREO_MODE_OFF); - result = aml_set_display_resolution(res, framebuffer_name); + result = aml_set_display_resolution(res, framebuffer_name, force_mode_switch); aml_handle_scale(res); aml_handle_display_stereo_mode(stereo_mode); @@ -498,7 +499,8 @@ bool aml_probe_resolutions(std::vector<RESOLUTION_INFO> &resolutions) return resolutions.size() > 0; } -bool aml_set_display_resolution(const RESOLUTION_INFO &res, std::string framebuffer_name) +bool aml_set_display_resolution(const RESOLUTION_INFO &res, std::string framebuffer_name, + bool force_mode_switch) { std::string mode = res.strId.c_str(); std::string cur_mode; @@ -525,7 +527,7 @@ bool aml_set_display_resolution(const RESOLUTION_INFO &res, std::string framebuf if (amhdmitx0_frac_rate_policy.Exists()) cur_fractional_rate = amhdmitx0_frac_rate_policy.Get<int>().value(); - if (cur_fractional_rate != fractional_rate) + if ((cur_fractional_rate != fractional_rate) || force_mode_switch) { cur_mode = "null"; if (display_mode.Exists()) diff --git a/xbmc/utils/AMLUtils.h b/xbmc/utils/AMLUtils.h index 16f32b2d0a..a944814642 100644 --- a/xbmc/utils/AMLUtils.h +++ b/xbmc/utils/AMLUtils.h @@ -62,9 +62,9 @@ bool aml_has_frac_rate_policy(); void aml_set_audio_passthrough(bool passthrough); bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res); bool aml_get_native_resolution(RESOLUTION_INFO *res); -bool aml_set_native_resolution(const RESOLUTION_INFO &res, std::string framebuffer_name, const int stereo_mode); +bool aml_set_native_resolution(const RESOLUTION_INFO &res, std::string framebuffer_name, const int stereo_mode, bool force_mode_switch); bool aml_probe_resolutions(std::vector<RESOLUTION_INFO> &resolutions); -bool aml_set_display_resolution(const RESOLUTION_INFO &res, std::string framebuffer_name); +bool aml_set_display_resolution(const RESOLUTION_INFO &res, std::string framebuffer_name, bool force_mode_switch); void aml_handle_scale(const RESOLUTION_INFO &res); void aml_handle_display_stereo_mode(const int stereo_mode); void aml_enable_freeScale(const RESOLUTION_INFO &res); diff --git a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp index 4c5424d136..07447b5a55 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogic.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogic.cpp @@ -41,6 +41,7 @@ using namespace KODI; CWinSystemAmlogic::CWinSystemAmlogic() : m_nativeWindow(NULL) , m_libinput(new CLibInputHandler) +, m_force_mode_switch(false) { const char *env_framebuffer = getenv("FRAMEBUFFER"); @@ -55,9 +56,6 @@ CWinSystemAmlogic::CWinSystemAmlogic() m_nativeDisplay = EGL_NO_DISPLAY; - m_displayWidth = 0; - m_displayHeight = 0; - m_stereo_mode = RENDER_STEREO_MODE_OFF; m_delayDispReset = false; @@ -159,32 +157,15 @@ bool CWinSystemAmlogic::CreateNewWindow(const std::string& name, bool fullScreen, RESOLUTION_INFO& res) { - RESOLUTION_INFO current_resolution; - current_resolution.iWidth = current_resolution.iHeight = 0; - RENDER_STEREO_MODE stereo_mode = CServiceBroker::GetWinSystem()->GetGfxContext().GetStereoMode(); - m_nWidth = res.iWidth; m_nHeight = res.iHeight; - m_displayWidth = res.iScreenWidth; - m_displayHeight = res.iScreenHeight; m_fRefreshRate = res.fRefreshRate; if (m_nativeWindow == NULL) m_nativeWindow = new fbdev_window; - m_nativeWindow->width = m_nWidth; - m_nativeWindow->height = m_nHeight; - - if ((m_bWindowCreated && aml_get_native_resolution(¤t_resolution)) && - current_resolution.iWidth == res.iWidth && current_resolution.iHeight == res.iHeight && - current_resolution.iScreenWidth == res.iScreenWidth && current_resolution.iScreenHeight == res.iScreenHeight && - m_bFullScreen == fullScreen && current_resolution.fRefreshRate == res.fRefreshRate && - (current_resolution.dwFlags & D3DPRESENTFLAG_MODEMASK) == (res.dwFlags & D3DPRESENTFLAG_MODEMASK) && - m_stereo_mode == stereo_mode) - { - CLog::Log(LOGDEBUG, "CWinSystemEGL::CreateNewWindow: No need to create a new window"); - return true; - } + m_nativeWindow->width = res.iWidth; + m_nativeWindow->height = res.iHeight; int delay = CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt("videoscreen.delayrefreshchange"); if (delay > 0) @@ -201,10 +182,9 @@ bool CWinSystemAmlogic::CreateNewWindow(const std::string& name, } } - m_stereo_mode = stereo_mode; - m_bFullScreen = fullScreen; - - aml_set_native_resolution(res, m_framebuffer_name, stereo_mode); + aml_set_native_resolution(res, m_framebuffer_name, m_stereo_mode, m_force_mode_switch); + // reset force mode switch + m_force_mode_switch = false; if (!m_delayDispReset) { @@ -216,6 +196,7 @@ bool CWinSystemAmlogic::CreateNewWindow(const std::string& name, } } + m_bWindowCreated = true; return true; } @@ -227,6 +208,7 @@ bool CWinSystemAmlogic::DestroyWindow() m_nativeWindow = NULL; } + m_bWindowCreated = false; return true; } @@ -310,28 +292,28 @@ bool CWinSystemAmlogic::IsHDRDisplay() { valstr = hdr_cap.Get<std::string>().value(); if (valstr.find("Traditional HDR: 1") != std::string::npos) - hdr_caps.SetHDR10(); + m_hdr_caps.SetHDR10(); if (valstr.find("HDR10Plus Supported: 1") != std::string::npos) - hdr_caps.SetHDR10Plus(); + m_hdr_caps.SetHDR10Plus(); if (valstr.find("Hybrid Log-Gamma: 1") != std::string::npos) - hdr_caps.SetHLG(); + m_hdr_caps.SetHLG(); } if (dv_cap.Exists()) { valstr = dv_cap.Get<std::string>().value(); if (valstr.find("DolbyVision RX support list") != std::string::npos) - hdr_caps.SetDolbyVision(); + m_hdr_caps.SetDolbyVision(); } - return (hdr_caps.SupportsHDR10() | hdr_caps.SupportsHDR10Plus() | hdr_caps.SupportsHLG()); + return (m_hdr_caps.SupportsHDR10() | m_hdr_caps.SupportsHDR10Plus() | m_hdr_caps.SupportsHLG()); } CHDRCapabilities CWinSystemAmlogic::GetDisplayHDRCapabilities() const { - return hdr_caps; + return m_hdr_caps; } bool CWinSystemAmlogic::Hide() diff --git a/xbmc/windowing/amlogic/WinSystemAmlogic.h b/xbmc/windowing/amlogic/WinSystemAmlogic.h index 2c70086caa..6bc5ae5046 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogic.h +++ b/xbmc/windowing/amlogic/WinSystemAmlogic.h @@ -44,9 +44,6 @@ protected: EGLDisplay m_nativeDisplay; fbdev_window *m_nativeWindow; - int m_displayWidth; - int m_displayHeight; - RENDER_STEREO_MODE m_stereo_mode; bool m_delayDispReset; @@ -55,5 +52,6 @@ protected: CCriticalSection m_resourceSection; std::vector<IDispResource*> m_resources; std::unique_ptr<CLibInputHandler> m_libinput; - CHDRCapabilities hdr_caps; + CHDRCapabilities m_hdr_caps; + bool m_force_mode_switch; }; diff --git a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp index 39fbaf03a1..f9d94dc34f 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp @@ -8,13 +8,22 @@ #include "VideoSyncAML.h" #include "WinSystemAmlogicGLESContext.h" +#include "platform/linux/SysfsPath.h" +#include "utils/AMLUtils.h" #include "utils/log.h" #include "threads/SingleLock.h" +#include "windowing/GraphicContext.h" #include "windowing/WindowSystemFactory.h" using namespace KODI; using namespace KODI::WINDOWING::AML; +CWinSystemAmlogicGLESContext::CWinSystemAmlogicGLESContext() +: m_cs(-1) +, m_cd(-1) +{ +} + void CWinSystemAmlogicGLESContext::Register() { KODI::WINDOWING::CWindowSystemFactory::RegisterWindowSystem(CreateWinSystem, "aml"); @@ -69,7 +78,84 @@ bool CWinSystemAmlogicGLESContext::CreateNewWindow(const std::string& name, bool fullScreen, RESOLUTION_INFO& res) { - m_pGLContext.DestroySurface(); + RESOLUTION_INFO current_resolution; + current_resolution.iWidth = current_resolution.iHeight = 0; + RENDER_STEREO_MODE stereo_mode = CServiceBroker::GetWinSystem()->GetGfxContext().GetStereoMode(); + + // check for frac_rate_policy change + int fractional_rate = (res.fRefreshRate == floor(res.fRefreshRate)) ? 0 : 1; + int cur_fractional_rate = fractional_rate; + if (aml_has_frac_rate_policy()) + { + CSysfsPath amhdmitx0_frac_rate_policy{"/sys/class/amhdmitx/amhdmitx0/frac_rate_policy"}; + cur_fractional_rate = amhdmitx0_frac_rate_policy.Get<int>().value(); + + if (cur_fractional_rate != fractional_rate) + amhdmitx0_frac_rate_policy.Set(fractional_rate); + } + + // check for colour subsampling/depth change + CSysfsPath amhdmitx0_cs{"/sys/class/amhdmitx/amhdmitx0/cs"}; + CSysfsPath amhdmitx0_cd{"/sys/class/amhdmitx/amhdmitx0/cd"}; + int cs = 0; + int cd = 0; + if (amhdmitx0_cs.Exists() && amhdmitx0_cd.Exists()) + { + cs = amhdmitx0_cs.Get<int>().value(); + cd = amhdmitx0_cd.Get<int>().value(); + } + + // get current used resolution + if (!aml_get_native_resolution(¤t_resolution)) + { + CLog::Log(LOGERROR, "CWinSystemAmlogicGLESContext::{}: failed to receive current resolution", __FUNCTION__); + return false; + } + + CLog::Log(LOGDEBUG, "CWinSystemAmlogicGLESContext::{}: " + "m_bWindowCreated: {}, " + "frac rate {:d}({:d}), " + "cs: {:d}({:d}), cd: {:d}({:d})", + __FUNCTION__, + m_bWindowCreated, + fractional_rate, cur_fractional_rate, + cs, m_cs, cd, m_cd); + CLog::Log(LOGDEBUG, "CWinSystemAmlogicGLESContext::{}: " + "cur: iWidth: {:04d}, iHeight: {:04d}, iScreenWidth: {:04d}, iScreenHeight: {:04d}, fRefreshRate: {:02.2f}, dwFlags: {:02x}", + __FUNCTION__, + current_resolution.iWidth, current_resolution.iHeight, current_resolution.iScreenWidth, current_resolution.iScreenHeight, + current_resolution.fRefreshRate, current_resolution.dwFlags); + CLog::Log(LOGDEBUG, "CWinSystemAmlogicGLESContext::{}: " + "res: iWidth: {:04d}, iHeight: {:04d}, iScreenWidth: {:04d}, iScreenHeight: {:04d}, fRefreshRate: {:02.2f}, dwFlags: {:02x}", + __FUNCTION__, + res.iWidth, res.iHeight, res.iScreenWidth, res.iScreenHeight, res.fRefreshRate, res.dwFlags); + + // check if mode switch is needed + if (current_resolution.iWidth == res.iWidth && current_resolution.iHeight == res.iHeight && + current_resolution.iScreenWidth == res.iScreenWidth && current_resolution.iScreenHeight == res.iScreenHeight && + m_bFullScreen == fullScreen && current_resolution.fRefreshRate == res.fRefreshRate && + (current_resolution.dwFlags & D3DPRESENTFLAG_MODEMASK) == (res.dwFlags & D3DPRESENTFLAG_MODEMASK) && + m_stereo_mode == stereo_mode && m_bWindowCreated && + ((m_cs != -1 && m_cd != -1) && (m_cs == cs && m_cd == cd)) && + (fractional_rate == cur_fractional_rate)) + { + CLog::Log(LOGDEBUG, "CWinSystemAmlogicGLESContext::{}: No need to create a new window", __FUNCTION__); + return true; + } + + // destroy old window, then create a new one + DestroyWindow(); + + // check if a forced mode switch is required + if ((current_resolution.iWidth == res.iWidth && current_resolution.iHeight == res.iHeight && + current_resolution.iScreenWidth == res.iScreenWidth && current_resolution.iScreenHeight == res.iScreenHeight && + current_resolution.fRefreshRate == res.fRefreshRate) && + (((m_cs != -1 && m_cd != -1) && (m_cs != cs || m_cd != cd)) || + (fractional_rate != cur_fractional_rate))) + { + m_force_mode_switch = true; + CLog::Log(LOGDEBUG, "CWinSystemAmlogicGLESContext::{}: force mode switch", __FUNCTION__); + } if (!CWinSystemAmlogic::CreateNewWindow(name, fullScreen, res)) { @@ -94,6 +180,16 @@ bool CWinSystemAmlogicGLESContext::CreateNewWindow(const std::string& name, (*i)->OnResetDisplay(); } + // backup data after mode switch + if (amhdmitx0_cs.Exists() && amhdmitx0_cd.Exists()) + { + m_cs = amhdmitx0_cs.Get<int>().value(); + m_cd = amhdmitx0_cd.Get<int>().value(); + } + + m_stereo_mode = stereo_mode; + m_bFullScreen = fullScreen; + return true; } @@ -167,4 +263,3 @@ std::unique_ptr<CVideoSync> CWinSystemAmlogicGLESContext::GetVideoSync(void *clo std::unique_ptr<CVideoSync> pVSync(new CVideoSyncAML(clock)); return pVSync; } - diff --git a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.h b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.h index 7d7467ee1a..ef6166692a 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.h +++ b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.h @@ -23,7 +23,7 @@ namespace AML class CWinSystemAmlogicGLESContext : public CWinSystemAmlogic, public CRenderSystemGLES { public: - CWinSystemAmlogicGLESContext() = default; + CWinSystemAmlogicGLESContext(); virtual ~CWinSystemAmlogicGLESContext() = default; static void Register(); @@ -53,7 +53,8 @@ protected: private: CEGLContextUtils m_pGLContext; - + int m_cs; + int m_cd; }; } -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0016-AMLUtils-add-display-DV-support-check.patch ================================================ From e31d8ce8965aef763014ecc5ce00252bb70dd894 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Mon, 22 May 2023 11:23:13 +0200 Subject: [PATCH 16/21] AMLUtils: add display DV support check --- xbmc/utils/AMLUtils.cpp | 16 ++++++++++++++++ xbmc/utils/AMLUtils.h | 1 + 2 files changed, 17 insertions(+) diff --git a/xbmc/utils/AMLUtils.cpp b/xbmc/utils/AMLUtils.cpp index 33e449408d..2d1c1d78b3 100644 --- a/xbmc/utils/AMLUtils.cpp +++ b/xbmc/utils/AMLUtils.cpp @@ -56,6 +56,22 @@ int aml_get_cpufamily_id() return aml_cpufamily_id; } +bool aml_display_support_dv() +{ + int support_dv = 0; + CRegExp regexp; + regexp.RegComp("The Rx don't support DolbyVision"); + std::string valstr; + CSysfsPath dv_cap{"/sys/devices/virtual/amhdmitx/amhdmitx0/dv_cap"}; + if (dv_cap.Exists()) + { + valstr = dv_cap.Get<std::string>().value(); + support_dv = (regexp.RegFind(valstr) >= 0) ? 0 : 1; + } + + return support_dv; +} + bool aml_dv_support_ll() { int support_ll = 0; diff --git a/xbmc/utils/AMLUtils.h b/xbmc/utils/AMLUtils.h index a944814642..2f07acbfa1 100644 --- a/xbmc/utils/AMLUtils.h +++ b/xbmc/utils/AMLUtils.h @@ -49,6 +49,7 @@ enum AML_SUPPORT_H264_4K2K #define AML_SM1 0x2B int aml_get_cpufamily_id(); +bool aml_display_support_dv(); bool aml_dv_support_ll(); bool aml_support_hevc(); bool aml_support_hevc_4k2k(); -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0017-AMLCodec-Restart-codec-in-dec_mode-STREAM_TYPE_FRAME.patch ================================================ From 40f2d0145580ae8c20a431351b4dbe74aae1f928 Mon Sep 17 00:00:00 2001 From: Arthur Liberman <arthur_liberman@hotmail.com> Date: Thu, 28 Dec 2023 00:44:36 +0200 Subject: [PATCH 17/21] AMLCodec: Restart codec in `dec_mode=STREAM_TYPE_FRAME` on DoVi P7 MEL Dolby Vision Profile 7 Minimum Enhancement Layer (MEL) can't use `STREAM_TYPE_STREAM` decoder mode. The kernel can detect MEL content, it sets `is_mel=true` in sysfs, we detect it, and restart the codec in the correct mode --- .../VideoPlayer/DVDCodecs/Video/AMLCodec.cpp | 26 ++++++++++++++++++- .../VideoPlayer/DVDCodecs/Video/AMLCodec.h | 2 ++ .../DVDCodecs/Video/DVDVideoCodecAmlogic.cpp | 12 ++++++++- .../DVDCodecs/Video/DVDVideoCodecAmlogic.h | 1 + 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp index dad0690ef2..3962cb904d 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp @@ -1814,6 +1814,8 @@ CAMLCodec::CAMLCodec(CProcessInfo &processInfo) , m_bufferIndex(-1) , m_state(0) , m_processInfo(processInfo) + , m_is_dv_p7_mel(false) + , m_dolby_vision_wait_delay(0) { am_private = new am_private_t; memset(am_private, 0, sizeof(am_private_t)); @@ -2020,13 +2022,20 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints) } am_private->gcodec.dv_enable = 1; - if (hints.dovi.dv_profile == 7 && CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt( + if (!m_is_dv_p7_mel && hints.dovi.dv_profile == 7 && CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt( CSettings::SETTING_VIDEOPLAYER_CONVERTDOVI) == 0) { CSysfsPath amdolby_vision_debug{"/sys/class/amdolby_vision/debug"}; if (amdolby_vision_debug.Exists()) amdolby_vision_debug.Set("enable_fel 1"); am_private->gcodec.dec_mode = STREAM_TYPE_STREAM; + + CSysfsPath dolby_vision_wait_delay{"/sys/module/amdolby_vision/parameters/dolby_vision_wait_delay"}; + if (dolby_vision_wait_delay.Exists()) + { + m_dolby_vision_wait_delay = dolby_vision_wait_delay.Get<unsigned int>().value(); + CLog::Log(LOGDEBUG, "CAMLCodec::OpenDecoder DoVi P7 MEL detection frame delay got set to {:d} frames", m_dolby_vision_wait_delay); + } } } else if (device_support_dv) @@ -2642,6 +2651,21 @@ CDVDVideoCodec::VCReturn CAMLCodec::GetPicture(VideoPicture *pVideoPicture) CLog::Log(LOGDEBUG, LOGVIDEO, "CAMLCodec::GetPicture: index: {:d}, pts: {:.3f}, dur:{:.3f}ms ar:{:.2f} elf:{:d}ms", m_bufferIndex, pVideoPicture->pts / DVD_TIME_BASE, pVideoPicture->iDuration / 1000, m_hints.aspect, elapsed_since_last_frame.count()); + if (m_dolby_vision_wait_delay > 0 && !m_is_dv_p7_mel) + { + m_dolby_vision_wait_delay--; + CSysfsPath is_mel{"/sys/module/amdolby_vision/parameters/is_mel"}; + if (is_mel.Exists()) + { + if (is_mel.Get<char>().value() == 'Y') + { + CLog::Log(LOGDEBUG, LOGVIDEO, "CAMLCodec::GetPicture: DoVi P7 MEL content detected, request to reopen decoder"); + m_is_dv_p7_mel = true; + return CDVDVideoCodec::VC_REOPEN; + } + } + } + return CDVDVideoCodec::VC_PICTURE; } else if (m_drain) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.h b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.h index cfc6fafe31..2fe9212845 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.h +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.h @@ -109,6 +109,8 @@ private: uint64_t m_cur_pts; uint64_t m_last_pts; uint32_t m_bufferIndex; + bool m_is_dv_p7_mel; + uint32_t m_dolby_vision_wait_delay; CRect m_dst_rect; CRect m_display_rect; diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp index 12f81442d7..c2e8518f2d 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp @@ -436,6 +436,12 @@ void CDVDVideoCodecAmlogic::Reset(void) m_bitstream->ResetStartDecode(); } +void CDVDVideoCodecAmlogic::Reopen(void) +{ + if (m_Codec && !m_Codec->OpenDecoder(m_hints)) + CLog::Log(LOGERROR, "{}: Failed to reopen Amlogic Codec", __MODULE_NAME__); +} + CDVDVideoCodec::VCReturn CDVDVideoCodecAmlogic::GetPicture(VideoPicture* pVideoPicture) { if (!m_Codec) @@ -443,7 +449,11 @@ CDVDVideoCodec::VCReturn CDVDVideoCodecAmlogic::GetPicture(VideoPicture* pVideoP VCReturn retVal = m_Codec->GetPicture(&m_videobuffer); - if (retVal == VC_PICTURE) + if (retVal == VC_REOPEN) + { + m_Codec->CloseDecoder(); + } + else if (retVal == VC_PICTURE) { pVideoPicture->SetParams(m_videobuffer); diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.h b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.h index 8a1d66e485..b0d422909a 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.h +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.h @@ -70,6 +70,7 @@ public: virtual bool Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) override; virtual bool AddData(const DemuxPacket &packet) override; virtual void Reset() override; + virtual void Reopen() override; virtual VCReturn GetPicture(VideoPicture* pVideoPicture) override; virtual void SetSpeed(int iSpeed) override; virtual void SetCodecControl(int flags) override; -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0018-libdovi-change-default-conversion-to-Lossless-for-Am.patch ================================================ From d94ce039a9a6dea04fea7fd7156e41eb67ea4164 Mon Sep 17 00:00:00 2001 From: Arthur Liberman <arthur_liberman@hotmail.com> Date: Fri, 12 Jan 2024 17:21:47 +0200 Subject: [PATCH 18/21] libdovi: change default conversion to Lossless for Amlogic-ng-dv --- system/settings/settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/settings/settings.xml b/system/settings/settings.xml index d656de67d1..7117ac0394 100755 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -236,7 +236,7 @@ </or> </requirement> <level>2</level> - <default>2</default> + <default>0</default> <updates> <update type="change" /> </updates> -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0019-AMLCodec-set-also-dolby_vision_ll_policy-when-force-.patch ================================================ From 979f3c936539d2944585c27d0b79642c1bdbb38f Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Mon, 15 Jan 2024 09:59:43 +0100 Subject: [PATCH 19/21] AMLCodec: set also dolby_vision_ll_policy when force player led 4.9 kernel does require the policy set as well --- xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp index 3962cb904d..7d702cd1c4 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp @@ -292,6 +292,8 @@ typedef struct hdr_buf { } hdr_buf_t; #define FLAG_FORCE_DV_LL (unsigned int)(0x4000) +#define DOLBY_VISION_LL_DISABLE (unsigned int)(0) +#define DOLBY_VISION_LL_YUV422 (unsigned int)(1) typedef struct am_packet { AVPacket avpkt; @@ -2013,12 +2015,19 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints) // force player led mode when enabled CSysfsPath dolby_vision_flags{"/sys/module/amdolby_vision/parameters/dolby_vision_flags"}; - if (dolby_vision_flags.Exists()) + CSysfsPath dolby_vision_ll_policy{"/sys/module/amdolby_vision/parameters/dolby_vision_ll_policy"}; + if (dolby_vision_flags.Exists() && dolby_vision_ll_policy.Exists()) { if (CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_COREELEC_AMLOGIC_USE_PLAYERLED)) + { dolby_vision_flags.Set(dolby_vision_flags.Get<unsigned int>().value() | FLAG_FORCE_DV_LL); + dolby_vision_ll_policy.Set(DOLBY_VISION_LL_YUV422); + } else + { dolby_vision_flags.Set(dolby_vision_flags.Get<unsigned int>().value() & ~(FLAG_FORCE_DV_LL)); + dolby_vision_ll_policy.Set(DOLBY_VISION_LL_DISABLE); + } } am_private->gcodec.dv_enable = 1; -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0020-WinSystemAmlogic-backup-correct-colour-subsampling-a.patch ================================================ From f08632775e1a7cb7629e1fe6b970e3e2141d6ad6 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Tue, 16 Jan 2024 15:27:55 +0100 Subject: [PATCH 20/21] WinSystemAmlogic: backup correct colour subsampling and colour depth --- xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp index f9d94dc34f..16b54d8803 100644 --- a/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp +++ b/xbmc/windowing/amlogic/WinSystemAmlogicGLESContext.cpp @@ -183,8 +183,8 @@ bool CWinSystemAmlogicGLESContext::CreateNewWindow(const std::string& name, // backup data after mode switch if (amhdmitx0_cs.Exists() && amhdmitx0_cd.Exists()) { - m_cs = amhdmitx0_cs.Get<int>().value(); - m_cd = amhdmitx0_cd.Get<int>().value(); + m_cs = cs; + m_cd = cd; } m_stereo_mode = stereo_mode; -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/0021-AMLCodec-marginal-increase-frame-buffer-levels.patch ================================================ From 73a8feac65bcae4e0c55855482cc485edf1630f2 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Tue, 16 Jan 2024 15:38:56 +0100 Subject: [PATCH 21/21] AMLCodec: marginal increase frame buffer levels --- xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp index 7d702cd1c4..dae7e39ea6 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AMLCodec.cpp @@ -2638,7 +2638,7 @@ CDVDVideoCodec::VCReturn CAMLCodec::GetPicture(VideoPicture *pVideoPicture) if (!m_opened) return CDVDVideoCodec::VC_ERROR; - if ((!m_drain && buffer_level > 1.0f) && (ret = DequeueBuffer()) == 0) + if ((!m_drain && buffer_level > 5.0f) && (ret = DequeueBuffer()) == 0) { pVideoPicture->iFlags = 0; m_tp_last_frame = std::chrono::system_clock::now(); @@ -2679,7 +2679,7 @@ CDVDVideoCodec::VCReturn CAMLCodec::GetPicture(VideoPicture *pVideoPicture) } else if (m_drain) return CDVDVideoCodec::VC_EOF; - else if (buffer_level > 2.0f) + else if (buffer_level > 10.0f) return CDVDVideoCodec::VC_NONE; else if (ret != EAGAIN || elapsed_since_last_frame > std::chrono::seconds(m_decoder_timeout)) { -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/kodi/kodi-temp-03-TEMP-fix-OnSettingChanged-signal.patch ================================================ From 1090b59aa68165e67a39895d7d648c7ff286ed8d Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Wed, 17 Feb 2021 07:59:09 +0100 Subject: [PATCH] TEMP: fix OnSettingChanged signal --- xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp b/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp index 73816df648..fbd1f54680 100644 --- a/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp +++ b/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp @@ -104,6 +104,8 @@ void CGUIDialogPeripheralSettings::OnSettingChanged(const std::shared_ptr<const if (!peripheral) return; + peripheral->OnSettingChanged(setting->GetId()); + if (settingId == SETTING_APPEARANCE) { // Get the controller profile of the new appearance -- 2.30.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0001-Revert-hdmitx-fix-reading-hdmitx-register-when-uboot.patch ================================================ From 9906ee56e075be59d290e79f20ef131fd6cc41f4 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 26 May 2023 10:11:56 +0200 Subject: [PATCH 01/18] Revert "hdmitx: fix reading hdmitx register when uboot is older" This reverts commit ed885563805e1fabaf09113ef33f9d3709ace217. --- .../media/vout/hdmitx/hdmi_tx_20/hw/reg_ops.c | 105 +----------------- 1 file changed, 1 insertion(+), 104 deletions(-) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/reg_ops.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/reg_ops.c index b4c5724917f4..cd425c29e72b 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/reg_ops.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/reg_ops.c @@ -33,7 +33,6 @@ #include <linux/amlogic/media/vout/hdmi_tx/hdmi_tx_module.h> #include <linux/arm-smccc.h> #include "common.h" -#include "mach_reg.h" #include "hdmi_tx_reg.h" #include "reg_ops.h" #include "mach_reg.h" @@ -470,74 +469,6 @@ unsigned int hdmitx_rd_reg_normal(unsigned int addr) return data; } -#define __asmeq(x, y) ".ifnc " x "," y " ; .err ; .endif\n\t" - -void sec_reg_write(unsigned int *addr, unsigned int value) -{ - register long x0 asm("x0") = 0x82000019; - register long x1 asm("x1") = (unsigned long)addr; - register long x2 asm("x2") = value; - asm volatile( - __asmeq("%0", "x0") - __asmeq("%1", "x1") - __asmeq("%2", "x2") - "smc #0\n" - : : "r"(x0), "r"(x1), "r"(x2) - ); -} - -unsigned int sec_reg_read(unsigned int *addr) -{ - register long x0 asm("x0") = 0x82000018; - register long x1 asm("x1") = (unsigned long)addr; - asm volatile( - __asmeq("%0", "x0") - __asmeq("%1", "x1") - "smc #0\n" - : "+r"(x0) : "r"(x1) - ); - return (unsigned int)(x0&0xffffffff); -} - -static DEFINE_SPINLOCK(reg_lock); - -unsigned int hdmitx_rd_reg_old(unsigned int addr) -{ - unsigned int data = 0; - unsigned long offset = (addr & DWC_OFFSET_MASK) >> 24; - unsigned long flags, fiq_flag; - if (addr & SEC_OFFSET) { - addr = addr & 0xffff; - sec_reg_write((unsigned int *)(unsigned long) - TO_PHY_ADDR(P_HDMITX_ADDR_PORT_SEC + offset), addr); - sec_reg_write((unsigned int *)(unsigned long) - TO_PHY_ADDR(P_HDMITX_ADDR_PORT_SEC + offset), addr); - data = sec_reg_read((unsigned int *)(unsigned long) - TO_PHY_ADDR(P_HDMITX_DATA_PORT_SEC + offset)); - } else { - addr = addr & 0xffff; - spin_lock_irqsave(®_lock, flags); - raw_local_save_flags(fiq_flag); - local_fiq_disable(); - -/* - * If addr is located at 0x5020 ~ 0x667e in DWC, - * then should operate twice - */ - hd_write_reg(P_HDMITX_ADDR_PORT + offset, addr); - hd_write_reg(P_HDMITX_ADDR_PORT + offset, addr); - data = hd_read_reg(P_HDMITX_DATA_PORT + offset); - data = hd_read_reg(P_HDMITX_DATA_PORT + offset); - - raw_local_irq_restore(fiq_flag); - spin_unlock_irqrestore(®_lock, flags); - } - - pr_debug(REG "%s rd[0x%x] 0x%x\n", offset ? "DWC" : "TOP", - addr, data); - return data; -} - unsigned int hdmitx_rd_reg_g12a(unsigned int addr) { unsigned int large_offset = addr >> 24; @@ -578,8 +509,6 @@ unsigned int hdmitx_rd_reg(unsigned int addr) if (hdev->chip_type >= MESON_CPU_ID_G12A) data = hdmitx_rd_reg_g12a(addr); - else if (hdev->chip_type == MESON_CPU_ID_GXL) - data = hdmitx_rd_reg_old(addr); else data = hdmitx_rd_reg_normal(addr); return data; @@ -605,36 +534,6 @@ void hdmitx_wr_reg_normal(unsigned int addr, unsigned int data) addr, data); } -void hdmitx_wr_reg_old(unsigned int addr, unsigned int data) -{ - unsigned long flags, fiq_flag; - unsigned long offset = (addr & DWC_OFFSET_MASK) >> 24; - - if (addr & SEC_OFFSET) { - addr = addr & 0xffff; - sec_reg_write((unsigned int *)(unsigned long) - TO_PHY_ADDR(P_HDMITX_ADDR_PORT_SEC + offset), addr); - sec_reg_write((unsigned int *)(unsigned long) - TO_PHY_ADDR(P_HDMITX_ADDR_PORT_SEC + offset), addr); - sec_reg_write((unsigned int *)(unsigned long) - TO_PHY_ADDR(P_HDMITX_DATA_PORT_SEC + offset), data); - } else { - addr = addr & 0xffff; - spin_lock_irqsave(®_lock, flags); - raw_local_save_flags(fiq_flag); - local_fiq_disable(); - - hd_write_reg(P_HDMITX_ADDR_PORT + offset, addr); - hd_write_reg(P_HDMITX_ADDR_PORT + offset, addr); - hd_write_reg(P_HDMITX_DATA_PORT + offset, data); - raw_local_irq_restore(fiq_flag); - spin_unlock_irqrestore(®_lock, flags); - } - - pr_debug("%s wr[0x%x] 0x%x\n", offset ? "DWC" : "TOP", - addr, data); -} - void hdmitx_wr_reg_g12a(unsigned int addr, unsigned int data) { unsigned int large_offset = addr >> 24; @@ -671,9 +570,7 @@ void hdmitx_wr_reg(unsigned int addr, unsigned int data) if (hdev->chip_type >= MESON_CPU_ID_G12A) hdmitx_wr_reg_g12a(addr, data); - else if (hdev->chip_type == MESON_CPU_ID_GXL) - hdmitx_wr_reg_old(addr, data); - else + else hdmitx_wr_reg_normal(addr, data); } EXPORT_SYMBOL(hdmitx_wr_reg); -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0002-amdv-dv-not-enabled-when-dolby_vision_policy-changed.patch ================================================ From 7a4a4a239cdaf507a44539aeef91ccd0f8060e13 Mon Sep 17 00:00:00 2001 From: yao liu <yao.liu@amlogic.com> Date: Thu, 28 Jul 2022 17:20:49 +0800 Subject: [PATCH 02/18] amdv: dv not enabled when dolby_vision_policy changed [1/1] PD#SWPL-89319 Problem: dv not enabled when dolby_vision_policy changed Solution: 1.Config dolby_vision_hdr10_policy for sdr in both always hdr and adaptive hdr mode. SDR processed by dv by default. 2.Add vs12 control for tv, vs12 is not enabled by default, due to some hdr nts test fail. Verify: t7 Change-Id: Ibf14be850214b5af1ba91ef394d16ca63433317c Signed-off-by: yao liu <yao.liu@amlogic.com> --- .../amdolby_vision/amdolby_vision.c | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c index f6a30c011a9c..c59aa708b0c7 100644 --- a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c +++ b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c @@ -137,19 +137,22 @@ static unsigned int last_dolby_vision_policy; /* bit3: follow sink 0: bypass hlg to vpp, 1: process hlg by dolby core */ /* bit4: follow source 0: bypass hlg to vpp, 1: process hlg by dolby core */ /* === SDR === */ -/* bit5: 0: bypass SDR to vpp, 1: process SDR by dolby core */ -/* set by policy_process */ +/* bit5: follow sink 0: bypass SDR to vpp, 1: process SDR by dolby core */ +/* bit6: follow source 0: bypass SDR to vpp, 1: process SDR by dolby core */ #define HDR_BY_DV_F_SINK 0x1 #define HDR_BY_DV_F_SRC 0x2 #define HDRP_BY_DV 0x4 #define HLG_BY_DV_F_SINK 0x8 #define HLG_BY_DV_F_SRC 0x10 -#define SDR_BY_DV 0x20 +#define SDR_BY_DV_F_SINK 0x20 +#define SDR_BY_DV_F_SRC 0x40 -static unsigned int dolby_vision_hdr10_policy = HDR_BY_DV_F_SINK; +static unsigned int dolby_vision_hdr10_policy; module_param(dolby_vision_hdr10_policy, uint, 0664); MODULE_PARM_DESC(dolby_vision_hdr10_policy, "\n dolby_vision_hdr10_policy\n"); -static unsigned int last_dolby_vision_hdr10_policy = HDR_BY_DV_F_SINK; +static unsigned int last_dolby_vision_hdr10_policy; + +static bool enable_amvs12_for_tv; /* enable hdmi dv std to stb core */ static uint hdmi_to_stb_policy = 1; @@ -5455,13 +5458,6 @@ static int dolby_vision_policy_process } } } - if (src_format == FORMAT_SDR && - (mode_change || *mode == dolby_vision_mode)) { - if (*mode == DOLBY_VISION_OUTPUT_MODE_BYPASS) - dolby_vision_hdr10_policy &= ~SDR_BY_DV; - else - dolby_vision_hdr10_policy |= SDR_BY_DV; - } return mode_change; } @@ -5728,14 +5724,6 @@ static int dolby_vision_policy_process mode_change = 1; } } - - if (src_format == FORMAT_SDR && - (mode_change || *mode == dolby_vision_mode)) { - if (*mode == DOLBY_VISION_OUTPUT_MODE_BYPASS) - dolby_vision_hdr10_policy &= ~SDR_BY_DV; - else - dolby_vision_hdr10_policy |= SDR_BY_DV; - } return mode_change; } @@ -10580,16 +10568,20 @@ int get_dolby_vision_hdr_policy(void) /* policy == FOLLOW_SRC, check hdr/hlg policy */ ret |= (dolby_vision_hdr10_policy & HDR_BY_DV_F_SRC) ? 1 : 0; ret |= (dolby_vision_hdr10_policy & HLG_BY_DV_F_SRC) ? 2 : 0; + ret |= (dolby_vision_hdr10_policy & SDR_BY_DV_F_SRC) ? 0x40 : 0; } else if (dolby_vision_policy == DOLBY_VISION_FOLLOW_SINK) { /* policy == FOLLOW_SINK, check hdr/hlg policy */ ret |= (dolby_vision_hdr10_policy & HDR_BY_DV_F_SINK) ? 1 : 0; ret |= (dolby_vision_hdr10_policy & HLG_BY_DV_F_SINK) ? 2 : 0; + ret |= (dolby_vision_hdr10_policy & SDR_BY_DV_F_SINK) ? 0x20 : 0; } else { /* policy == FORCE, check hdr/hlg policy */ ret |= (dolby_vision_hdr10_policy & HDR_BY_DV_F_SRC) ? 1 : 0; ret |= (dolby_vision_hdr10_policy & HLG_BY_DV_F_SRC) ? 2 : 0; ret |= (dolby_vision_hdr10_policy & HDR_BY_DV_F_SINK) ? 1 : 0; ret |= (dolby_vision_hdr10_policy & HLG_BY_DV_F_SINK) ? 2 : 0; + ret |= (dolby_vision_hdr10_policy & SDR_BY_DV_F_SINK) ? 0x20 : 0; + ret |= (dolby_vision_hdr10_policy & SDR_BY_DV_F_SRC) ? 0x40 : 0; } return ret; } @@ -11924,6 +11916,13 @@ int register_dv_functions(const struct dolby_vision_func_s *func) if (!tv_dovi_setting) return -ENOMEM; } + dolby_vision_hdr10_policy |= SDR_BY_DV_F_SINK; + dolby_vision_hdr10_policy |= HDR_BY_DV_F_SINK; + last_dolby_vision_hdr10_policy = dolby_vision_hdr10_policy; + if (ko_info) + pr_info("hdr10_policy %d, ko_info %s\n", + dolby_vision_hdr10_policy, ko_info); + } else if (func->tv_control_path && !p_funcs_tv) { pr_info("*** register_dv_tv_functions\n"); if (!ko_info) { @@ -11966,6 +11965,14 @@ int register_dv_functions(const struct dolby_vision_func_s *func) memset(tv_input_info, 0, sizeof(struct tv_input_info_s)); } + if (enable_amvs12_for_tv) { + dolby_vision_hdr10_policy |= HLG_BY_DV_F_SINK; + dolby_vision_hdr10_policy |= HDR_BY_DV_F_SINK; + } + last_dolby_vision_hdr10_policy = dolby_vision_hdr10_policy; + if (ko_info) + pr_info("hdr10_policy %d, ko_info %s\n", + dolby_vision_hdr10_policy, ko_info); } else { return ret; } @@ -13370,8 +13377,6 @@ static int amdolby_vision_probe(struct platform_device *pdev) pr_info("\n cpu_id=%d tvmode=%d\n", dv_meson_dev.cpu_id, tv_mode); memset(devp, 0, (sizeof(struct amdolby_vision_dev_s))); if (is_meson_tm2_tvmode()) { - dolby_vision_hdr10_policy |= HLG_BY_DV_F_SINK; - pr_info("enable DV HLG when follow sink.\n"); dolby_vision_flags |= FLAG_RX_EMP_VSEM; pr_info("enable DV VSEM.\n"); } -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0003-hdmitx-forcely-send-bt.2020-for-all-DV-case-1-2.patch ================================================ From 34c8d1baaac620e55bcd1cd565e1ae66a925f995 Mon Sep 17 00:00:00 2001 From: hang cheng <hang.cheng@amlogic.com> Date: Wed, 18 May 2022 16:37:23 +0800 Subject: [PATCH 03/18] hdmitx: forcely send bt.2020 for all DV case [1/2] PD#SWPL-79072 Problem: Dolby Vision IDK2.6 kit chapter 4.4.1 Expected AVI-IF for Dolby Vision output, need BT.2020 under all DV output case Solution: forcely send bt.2020 for all DV case Verify: an400 Change-Id: Ie0b74b4c4196ca4d20bbb07cbce99487f9479162 Signed-off-by: hang cheng <hang.cheng@amlogic.com> --- .../vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index c66d30e2d696..d97b4c2ab736 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -1911,8 +1911,11 @@ void hdmitx_set_vsif_pkt(enum eotf_type type, hdmitx_device.hwop.setpacket(HDMI_PACKET_DRM, NULL, NULL); hdev->hwop.setpacket(HDMI_PACKET_VEND, VEN_DB1, VEN_HB); + /* Dolby Vision Source System-on-Chip Platform Kit Version 2.6: + * 4.4.1 Expected AVI-IF for Dolby Vision output, need BT2020 for DV + */ hdev->hwop.cntlconfig(hdev, CONF_AVI_BT2020, - CLR_AVI_BT2020);/*BT709*/ + SET_AVI_BT2020);/*BT.2020*/ if (tunnel_mode == RGB_8BIT) { hdev->hwop.cntlconfig(hdev, CONF_AVI_RGBYCC_INDIC, @@ -2013,8 +2016,11 @@ void hdmitx_set_vsif_pkt(enum eotf_type type, hdmitx_device.hwop.setpacket(HDMI_PACKET_DRM, NULL, NULL); hdev->hwop.setpacket(HDMI_PACKET_VEND, VEN_DB2, VEN_HB); + /* Dolby Vision Source System-on-Chip Platform Kit Version 2.6: + * 4.4.1 Expected AVI-IF for Dolby Vision output, need BT2020 for DV + */ hdev->hwop.cntlconfig(hdev, CONF_AVI_BT2020, - CLR_AVI_BT2020);/*BT709*/ + SET_AVI_BT2020);/*BT.2020*/ if (tunnel_mode == RGB_8BIT) {/*RGB444*/ hdev->hwop.cntlconfig(hdev, CONF_AVI_RGBYCC_INDIC, @@ -2035,13 +2041,12 @@ void hdmitx_set_vsif_pkt(enum eotf_type type, hdmitx_device.hwop.setpacket(HDMI_PACKET_DRM, NULL, NULL); hdev->hwop.setpacket(HDMI_PACKET_VEND, VEN_DB2, VEN_HB); - if (hdev->rxcap.colorimetry_data & 0xe0) - /*if RX support BT2020, then output BT2020*/ - hdev->hwop.cntlconfig(hdev, CONF_AVI_BT2020, - SET_AVI_BT2020);/*BT2020*/ - else - hdev->hwop.cntlconfig(hdev, CONF_AVI_BT2020, - CLR_AVI_BT2020);/*BT709*/ + /* Dolby vision HDMI Signaling Case25, + * UCD323 not declare bt2020 colorimetry, + * need to forcely send BT.2020 + */ + hdev->hwop.cntlconfig(hdev, CONF_AVI_BT2020, + SET_AVI_BT2020);/*BT2020*/ if (tunnel_mode == RGB_10_12BIT) {/*10/12bit RGB444*/ hdev->hwop.cntlconfig(hdev, CONF_AVI_RGBYCC_INDIC, -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0004-DT-make-a-copy-from-arm64-to-arm.patch ================================================ From 862503c9dec4dd30c98552d88a2e0ed441be4e4c Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 25 May 2023 14:53:10 +0200 Subject: [PATCH 04/18] DT: make a copy from arm64 to arm --- arch/arm/boot/dts/amlogic/Makefile | 29 +- .../arm/boot/dts/amlogic/coreelec_common.dtsi | 264 ++++++++++++++++++ .../boot/dts/amlogic/coreelec_g12_common.dtsi | 48 ++++ arch/arm/boot/dts/amlogic/coreelec_g12b.dtsi | 64 +++++ .../arm/boot/dts/amlogic/coreelec_g12b_a.dtsi | 64 +++++ .../dts/amlogic/g12b_s922x_minix_u22xj.dts | 119 ++++++++ .../amlogic/g12b_s922x_minix_u22xj_max.dts | 130 +++++++++ .../g12b_s922x_minix_u22xj_max_rev_a.dts | 25 ++ .../dts/amlogic/g12b_s922x_ugoos_am6_2g.dts | 101 +++++++ .../dts/amlogic/g12b_s922x_ugoos_am6_4g.dts | 9 + .../amlogic/g12b_s922x_ugoos_am6_rev_a_2g.dts | 101 +++++++ .../amlogic/g12b_s922x_ugoos_am6_rev_a_4g.dts | 9 + .../dts/amlogic/g12b_s922x_ugoos_am6b_2g.dts | 29 ++ .../dts/amlogic/g12b_s922x_ugoos_am6b_4g.dts | 9 + .../g12b_s922x_ugoos_am6b_rev_a_2g.dts | 29 ++ .../g12b_s922x_ugoos_am6b_rev_a_4g.dts | 9 + 16 files changed, 1025 insertions(+), 14 deletions(-) create mode 100644 arch/arm/boot/dts/amlogic/coreelec_common.dtsi create mode 100644 arch/arm/boot/dts/amlogic/coreelec_g12_common.dtsi create mode 100644 arch/arm/boot/dts/amlogic/coreelec_g12b.dtsi create mode 100644 arch/arm/boot/dts/amlogic/coreelec_g12b_a.dtsi create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj_max.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj_max_rev_a.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_2g.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_4g.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_rev_a_2g.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_rev_a_4g.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_2g.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_4g.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_rev_a_2g.dts create mode 100644 arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_rev_a_4g.dts diff --git a/arch/arm/boot/dts/amlogic/Makefile b/arch/arm/boot/dts/amlogic/Makefile index 1d819778d955..a481e8b54b2d 100644 --- a/arch/arm/boot/dts/amlogic/Makefile +++ b/arch/arm/boot/dts/amlogic/Makefile @@ -1,14 +1,15 @@ - -targets += dtbs - -DTB_NAMES := $(subst $\",,$(CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES)) -ifneq ($(DTB_NAMES),) -DTB_LIST := $(addsuffix .dtb,$(DTB_NAMES)) -else -DTB_LIST := $(dtb-y) -endif -targets += $(DTB_LIST) - -dtbs: $(addprefix $(obj)/, $(DTB_LIST)) - -clean-files := *.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_minix_u22xj.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_minix_u22xj_max.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_minix_u22xj_max_rev_a.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_ugoos_am6_2g.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_ugoos_am6_4g.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_ugoos_am6_rev_a_2g.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_ugoos_am6_rev_a_4g.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_ugoos_am6b_2g.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_ugoos_am6b_4g.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_ugoos_am6b_rev_a_2g.dtb +dtb-$(CONFIG_ARM64_A32) += g12b_s922x_ugoos_am6b_rev_a_4g.dtb + +always := $(dtb-y) +subdir-y := $(dts-dirs) +clean-files := *.dtb diff --git a/arch/arm/boot/dts/amlogic/coreelec_common.dtsi b/arch/arm/boot/dts/amlogic/coreelec_common.dtsi new file mode 100644 index 000000000000..5e488953a9c0 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/coreelec_common.dtsi @@ -0,0 +1,264 @@ +#include <dt-bindings/media/rc-map.h> + +/{ + coreelec; + /delete-property/ amlogic-dt-id; + + chosen { }; + + reserved-memory { + linux,meson-fb { + alloc-ranges = <0x77800000 0x800000>; + }; + linux,vdin0_cma { + status = "disabled"; + }; + linux,vdin1_cma { + status = "disabled"; + }; + linux,isp_cma { + status = "disabled"; + }; + linux,adapt_cma { + status = "disabled"; + }; + }; + + gpioleds { + status = "okay"; + /delete-node/ net_red; + /delete-node/ net_green; + /delete-node/ remote_led; + sys_led { + /delete-property/ retain-state-suspended; + /delete-property/ default-state; + linux,default-trigger="default-on"; + }; + }; + + codec_mm { + clear-map; + }; + + vcodec_dec { + status = "disable"; + }; + + gpio_keypad { + reg = <0xFF800000 0x400>; + }; + + /delete-node/ auge_sound; + auge_sound { + compatible = "amlogic, g12a-sound-card"; + aml-audio-card,name = "AML-AUGESOUND"; + avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; + + aml-audio-card,dai-link@0 { + mclk-fs = <128>; + cpu { + system-clock-frequency = <6144000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + aml-audio-card,dai-link@1 { + format = "i2s"; + mclk-fs = <256>; + cpu { + dai-tdm-slot-tx-mask = <1 1>; + dai-tdm-slot-rx-mask = <1 1>; + dai-tdm-slot-num = <2>; + dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&amlogic_codec>; + }; + }; + + aml-audio-card,dai-link@2 { + mclk-fs = <128>; + cpu { + system-clock-frequency = <6144000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + aml-audio-card,dai-link@3 { + format = "i2s"; + mclk-fs = <256>; + bitclock-master = <&aml_i2s2hdmi>; + frame-master = <&aml_i2s2hdmi>; + cpu { + sound-dai = <&aml_i2s2hdmi>; + dai-tdm-slot-tx-mask = <1 1>; + dai-tdm-slot-rx-mask = <1 1>; + dai-tdm-slot-num = <2>; + dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + }; + + audiolocker: locker { + status = "okay"; + }; + + /delete-node/ partitions; + /delete-node/ firmware; + + /delete-node/ rc@0xff808040; + /delete-node/ custom_maps; + meson-ir { + compatible = "amlogic,meson6-ir"; + /* Multi-format IR controller */ + reg = <0xff808040 0x44>; + interrupts = <0 196 1>; + pinctrl-names = "default"; + pinctrl-0 = <&remote_pins>; + pulse-inverted; + wakeup_protocol = <NEC>; /* force default NEC by <dt-bindings/media/rc-map.h> */ + status = "okay"; + }; + meson-remote { + compatible = "amlogic, aml_remote"; + dev_name = "meson-remote"; + reg = <0xff808040 0x44>, /*Multi-format IR controller*/ + <0xff808000 0x20>; /*Legacy IR controller*/ + status = "okay"; + protocol = <REMOTE_TYPE_NEC>; + led_blink = <1>; + led_blink_frq = <100>; + interrupts = <0 196 1>; + pinctrl-names = "default"; + pinctrl-0 = <&remote_pins>; + max_frame_time = <200>; /*set software decoder max frame time*/ + }; + + amvideocap { + compatible = "amlogic, amvideocap"; + dev_name = "amvideocap.0"; + status = "okay"; + max_size = <8>;//8M + }; + + openvfd { + compatible = "open,vfd"; + dev_name = "openvfd"; + status = "okay"; + }; + + dummy_venc: dummy_venc { + status = "disabled"; + }; + + /delete-node/ sensor; + /delete-node/ iq; + /delete-node/ demux; + /delete-node/ dvb; + /delete-node/ amvdec_656in; + /delete-node/ aml_cams; + + /delete-node/ lcd; + /delete-node/ lcd_extern; + /delete-node/ backlight; + /delete-node/ bl_pwm_conf; + /delete-node/ bl_extern; +}; + +&meson_fb { + display_size_default = <1920 1080 1920 2160 32>; + mem_size = <0x00800000 0x4b80000 0x100000 0x100000 0x800000>; + mem_alloc = <1>; + 4k2k_fb = <1>; +}; + +&i2c0 { + status = "disabled"; + /delete-node/ gt9xx@5d; + /delete-node/ ftxx@38; + /delete-node/ touchscreen@5d; + /delete-node/ touchscreen@38; +}; + +&i2c2 { + status = "disabled"; + /delete-node/ sensor-i2c@6c; +}; + +&i2c3 { + /delete-node/ ad82584f_62@62; + /delete-node/ tlv320adc3101_32@32; + /delete-node/ bl_extern_i2c; + /delete-node/ tas5707_36@36; +}; + +&audiobus { + aml_i2s2hdmi: i2s2hdmi { + #sound-dai-cells = <0>; + dai-tdm-lane-slot-mask-out = <1 1 1 1>; + dai-tdm-clk-sel = <2>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_C + &clkc CLKID_MPLL2>; + clock-names = "mclk", "clk_srcpll"; + i2s2hdmi = <1>; + status = "okay"; + }; + + /delete-node/ tdma; + /delete-node/ tdm@0; + /delete-node/ tdmc; + /delete-node/ tdm@2; + /delete-node/ tdm@3; + /delete-node/ pdm; +}; + +&pinctrl_periphs { + /delete-node/ tdmout_a; + /delete-node/ tdmin_a; + /delete-node/ tdmc_mclk; + /delete-node/ tdmout_c; + /delete-node/ tdmin_c; + /delete-node/ spdifin; + /delete-node/ pdmin; + /delete-node/ bl_pwm_off_pin; + /delete-node/ clk12_24_z_pins; + /delete-node/ gen_clk_ee_z; + /delete-node/ cam_dvp_pins; +}; + +&pinctrl_aobus { + /delete-node/ dvb_s_ts0_pins; +}; + +&vdin0 { + status = "disabled"; +}; + +&vdin1 { + status = "disabled"; +}; + +/delete-node/ &nand; + +&pcie_A { + status = "disabled"; +}; + +&aocec { + /delete-property/ arc_port_mask; +}; + +&sd_emmc_c { + emmc { + caps2 = "MMC_CAP2_HS200"; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/coreelec_g12_common.dtsi b/arch/arm/boot/dts/amlogic/coreelec_g12_common.dtsi new file mode 100644 index 000000000000..133405c8e6c3 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/coreelec_g12_common.dtsi @@ -0,0 +1,48 @@ +#include "coreelec_common.dtsi" + +/{ + auge_sound { + aml-audio-card,effect = <&audio_effect>; + + aml-audio-card,dai-link@0 { + continuous-clock; + cpu { + sound-dai = <&aml_spdif_b>; + }; + }; + + aml-audio-card,dai-link@1 { + bitclock-master = <&aml_tdmb>; + frame-master = <&aml_tdmb>; + continuous-clock; + cpu { + sound-dai = <&aml_tdmb>; + }; + }; + + aml-audio-card,dai-link@2 { + continuous-clock; + cpu { + sound-dai = <&aml_spdif>; + }; + }; + + aml-audio-card,dai-link@3 { + continuous-clock; + }; + }; +}; + +&audiobus { + aml_i2s2hdmi: i2s2hdmi { + compatible = "amlogic, g12a-snd-tdmc"; + }; + + aml_spdif: spdif { + pinctrl-0 = <&spdifout>; + }; + + aml_spdif_b: spdif_b { + status = "okay"; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/coreelec_g12b.dtsi b/arch/arm/boot/dts/amlogic/coreelec_g12b.dtsi new file mode 100644 index 000000000000..af33b74fa693 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/coreelec_g12b.dtsi @@ -0,0 +1,64 @@ +#include "g12b_a311d_w400.dts" +#include "coreelec_g12_common.dtsi" + +/{ + reserved-memory { + galcore_reserved:linux,galcore { + size = <0x1000000>; + alignment = <0x400000>; + }; + }; + + cpu_opp_table0: cpu_opp_table0 { + opp08 { + opp-hz = /bits/ 64 <1800000000>; + opp-microvolt = <1020000>; + }; + }; + + cpu_opp_table1: cpu_opp_table1 { + opp08 { + opp-hz = /bits/ 64 <1800000000>; + opp-microvolt = <830000>; + }; + opp09 { + opp-hz = /bits/ 64 <1908000000>; + opp-microvolt = <860000>; + }; + opp10 { + opp-hz = /bits/ 64 <2016000000>; + opp-microvolt = <910000>; + }; + opp11 { + opp-hz = /bits/ 64 <2100000000>; + opp-microvolt = <960000>; + }; + opp12 { + opp-hz = /bits/ 64 <2208000000>; + opp-microvolt = <1030000>; + }; + }; +}; + +ðmac { + pinctrl-names = "external_eth_pins"; + pinctrl-0 = <&external_eth_pins>; + internal_phy = <0>; + auto_cali_idx = <0>; + /delete-property/ cali_val; + /delete-property/ mc_val; +}; + +&pinctrl_periphs { + a_uart_pins:a_uart { + mux { + groups = "uart_tx_a", + "uart_rx_a", + "uart_cts_a", + "uart_rts_a"; + function = "uart_a"; + }; + + /delete-node/ mux1; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/coreelec_g12b_a.dtsi b/arch/arm/boot/dts/amlogic/coreelec_g12b_a.dtsi new file mode 100644 index 000000000000..838b40df7243 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/coreelec_g12b_a.dtsi @@ -0,0 +1,64 @@ +#include "g12b_a311d_w400_a.dts" +#include "coreelec_g12_common.dtsi" + +/{ + reserved-memory { + di_cma_reserved:linux,di_cma { + size = <0x0>; + }; + + codec_mm_cma:linux,codec_mm_cma { + size = <0x1b000000>; + }; + + galcore_reserved:linux,galcore { + size = <0x1000000>; + alignment = <0x400000>; + }; + }; + + cpu_opp_table0: cpu_opp_table0 { + opp08 { + opp-hz = /bits/ 64 <1800000000>; + opp-microvolt = <981000>; + }; + }; + + multi-di { + compatible = "amlogic, dim-g12b"; + status = "okay"; + /* 0:use reserved; 1:use cma; 2:use cma as reserved */ + flag_cma = <4>; //<1> + //memory-region = <&di_reserved>; + memory-region = <&di_cma_reserved>; + interrupts = <0 46 1 + 0 40 1>; + interrupt-names = "pre_irq", "post_irq"; + clocks = <&clkc CLKID_VPU_CLKB_TMP_COMP>, + <&clkc CLKID_VPU_CLKB_COMP>; + clock-names = "vpu_clkb_tmp_composite", + "vpu_clkb_composite"; + clock-range = <334 667>; + /* buffer-size = <3621952>;(yuv422 8bit) */ + buffer-size = <4074560>;/*yuv422 fullpack*/ + /* reserve-iomap = "true"; */ + /* if enable nr10bit, set nr10bit-support to 1 */ + post-wr-support = <1>; + nr10bit-support = <1>; + nrds-enable = <1>; + pps-enable = <1>; + }; + + deinterlace { + status = "disable"; + }; +}; + +ðmac { + pinctrl-names = "external_eth_pins"; + pinctrl-0 = <&external_eth_pins>; + internal_phy = <0>; + auto_cali_idx = <0>; + /delete-property/ cali_val; + /delete-property/ mc_val; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj.dts new file mode 100644 index 000000000000..5186afc7baa7 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj.dts @@ -0,0 +1,119 @@ +#include "coreelec_g12b_a.dtsi" + +/{ + model = "Minix U22-XJ"; + coreelec-dt-id = "g12b_s922x_minix_u22xj"; + + memory@00000000 { + linux,usable-memory = <0x0 0xf5000000>; + }; + + /delete-node/ t9015; + /delete-node/ rtc; + + auge_sound { + aml-audio-card,dai-link@1 { + codec { + sound-dai = <&rt5651>; + }; + }; + }; + + /* Minix original gpio driver settings */ + jw_io_init { + compatible = "amlogic, jw_io_control"; + dev_name = "jw_io_control"; + status = "okay"; + hdmi_5v_gpio = <&gpio GPIOH_8 GPIO_ACTIVE_HIGH>; + usb_hub_reset = <&gpio GPIOH_4 GPIO_ACTIVE_HIGH>; + ethernet_reset = <&gpio GPIOZ_15 GPIO_ACTIVE_HIGH>; + ethernet_int = <&gpio GPIOZ_14 GPIO_ACTIVE_HIGH>; + otg_ctl_gpio = <&gpio GPIOC_7 GPIO_ACTIVE_HIGH>; + earphone_ctl_gpio = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_HIGH>; + }; + + gpio-reset { + compatible = "linux,gpio-reset"; + usb_hub_reset { + gpios = <&gpio GPIOH_4 GPIO_ACTIVE_LOW>; + asserted-state = <0>; + duration-ms = <1000>; + }; + }; +}; + +&pinctrl_periphs { + external_eth_pins { + mux { + groups = "eth_mdio", + "eth_mdc", + "eth_rgmii_rx_clk", + "eth_rx_dv", + "eth_rxd0", + "eth_rxd1", + "eth_rxd2_rgmii", + "eth_rxd3_rgmii", + "eth_rgmii_tx_clk", + "eth_txen", + "eth_txd0", + "eth_txd1", + "eth_txd2_rgmii", + "eth_txd3_rgmii"; + }; + }; +}; + +&i2c1 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&i2c1_master_pins3>; + clock-frequency = <100000>; + + /* Minix power control MCU */ + jw_mcu: jw_mcu@15 { + compatible = "everest,jw_mcu"; + reg = <0x15>; + mcu_watchdog_gpio = <&gpio_ao GPIOAO_8 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; + + /* Minix extra control MCU */ + jw_mcu_isp: jw_mcu_isp@35 { + compatible = "everest,jw_mcu_isp"; + reg = <0x35>; + status = "okay"; + }; + + rtc_hym8563: rtc_hym8563@51 { + compatible = "haoyu,hym8563"; + reg = <0x51>; + irq_gpio = <&gpio_ao GPIOAO_6 GPIO_ACTIVE_HIGH>; + }; +}; + +&i2c3 { + rt5651: rt5651@1a { + compatible = "realtek,rt5651"; + #sound-dai-cells = <0>; + reg = <0x1a>; + status = "okay"; + realtek,dmic-en = "false"; + realtek,in2-differential = "false"; + }; +}; + +&sd_emmc_b { + sd { + vol_switch = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; + vol_switch_18 = <1>; + }; +}; + +ðmac { + auto_cali_idx = <1>; +}; + +&usb3_phy_v2 { + gpio-vbus-power = "GPIOH_5"; + gpios = <&gpio GPIOH_5 GPIO_ACTIVE_HIGH>; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj_max.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj_max.dts new file mode 100644 index 000000000000..43ceda52dafc --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj_max.dts @@ -0,0 +1,130 @@ +#include "coreelec_g12b.dtsi" + +/{ + model = "Minix U22-XJ Max"; + coreelec-dt-id = "g12b_s922x_minix_u22xj_max"; + + memory@00000000 { + linux,usable-memory = <0x0 0xf5000000>; + }; + + /delete-node/ t9015; + /delete-node/ rtc; + + auge_sound { + aml-audio-card,dai-link@1 { + codec { + sound-dai = <&es8316>; + }; + }; + }; + + /* Minix original gpio driver settings */ + jw_io_init { + compatible = "amlogic, jw_io_control"; + dev_name = "jw_io_control"; + status = "okay"; + hdmi_5v_gpio = <&gpio GPIOH_8 GPIO_ACTIVE_HIGH>; + usb_hub_reset = <&gpio GPIOH_4 GPIO_ACTIVE_HIGH>; + ethernet_reset = <&gpio GPIOZ_15 GPIO_ACTIVE_HIGH>; + ethernet_int = <&gpio GPIOZ_14 GPIO_ACTIVE_HIGH>; + otg_ctl_gpio = <&gpio GPIOC_7 GPIO_ACTIVE_HIGH>; + earphone_ctl_gpio = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_HIGH>; + }; + + gpio-reset { + compatible = "linux,gpio-reset"; + usb_hub_reset { + gpios = <&gpio GPIOH_4 GPIO_ACTIVE_LOW>; + asserted-state = <0>; + duration-ms = <1000>; + }; + }; +}; + +&pinctrl_periphs { + external_eth_pins { + mux { + groups = "eth_mdio", + "eth_mdc", + "eth_rgmii_rx_clk", + "eth_rx_dv", + "eth_rxd0", + "eth_rxd1", + "eth_rxd2_rgmii", + "eth_rxd3_rgmii", + "eth_rgmii_tx_clk", + "eth_txen", + "eth_txd0", + "eth_txd1", + "eth_txd2_rgmii", + "eth_txd3_rgmii"; + }; + }; +}; + +&i2c1 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&i2c1_master_pins3>; + clock-frequency = <100000>; + + /* Minix power control MCU */ + jw_mcu: jw_mcu@15 { + compatible = "everest,jw_mcu"; + reg = <0x15>; + mcu_watchdog_gpio = <&gpio_ao GPIOAO_8 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; + + /* Minix extra control MCU */ + jw_mcu_isp: jw_mcu_isp@35 { + compatible = "everest,jw_mcu_isp"; + reg = <0x35>; + status = "okay"; + }; + + rtc_hym8563: rtc_hym8563@51 { + compatible = "haoyu,hym8563"; + reg = <0x51>; + irq_gpio = <&gpio_ao GPIOAO_6 GPIO_ACTIVE_HIGH>; + }; +}; + +&i2c3 { + es8316: es8316@10 { + compatible = "everest,es8316"; + #sound-dai-cells = <0>; + reg = <0x10>; + status = "okay"; + }; +}; + +&sd_emmc_b { + sd { + jtag_pin = <&gpio GPIOC_0 GPIO_ACTIVE_HIGH>; + vol_switch = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; + vol_switch_18 = <1>; + }; +}; + +&pinctrl_periphs { + a_uart_pins:a_uart { + mux { + groups = "uart_tx_a", + "uart_rx_a", + "uart_cts_a", + "uart_rts_a"; + }; + /delete-node/ mux1; + }; +}; + +ðmac { + auto_cali_idx = <1>; +}; + +&usb3_phy_v2 { + gpio-vbus-power = "GPIOH_5"; + gpios = <&gpio GPIOH_5 GPIO_ACTIVE_HIGH>; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj_max_rev_a.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj_max_rev_a.dts new file mode 100644 index 000000000000..ead93fb7c127 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_minix_u22xj_max_rev_a.dts @@ -0,0 +1,25 @@ +#include "g12b_s922x_minix_u22xj.dts" + +/{ + model = "Minix U22-XJ Max"; + coreelec-dt-id = "g12b_s922x_minix_u22xj_max_rev_a"; + + auge_sound { + aml-audio-card,dai-link@1 { + codec { + sound-dai = <&es8316>; + }; + }; + }; +}; + +&i2c3 { + /delete-node/ rt5651@1a; + + es8316: es8316@10 { + compatible = "everest,es8316"; + #sound-dai-cells = <0>; + reg = <0x10>; + status = "okay"; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_2g.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_2g.dts new file mode 100644 index 000000000000..06a21adb3309 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_2g.dts @@ -0,0 +1,101 @@ +#include "coreelec_g12b.dtsi" + +/{ + model = "UGOOS AM6"; + coreelec-dt-id = "g12b_s922x_ugoos_am6"; + amlogic-dt-id = "g12b_AM6_b2g"; + + memory@00000000 { + linux,usable-memory = <0x000000 0x80000000>; + }; + + auge_sound { + aml-audio-card,dai-link@1 { + codec { + sound-dai = <&rt5651>; + }; + }; + }; + + gpioleds { + green_led { + label = "green_led"; + gpios = <&gpio GPIOC_7 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "default-on"; + }; + }; + + wifi{ + power_on_pin = <&gpio_ao GPIOAO_10 GPIO_ACTIVE_HIGH>; + }; + + gpio_keypad { + key-gpios = <&gpio_ao GPIOAO_6 GPIO_ACTIVE_HIGH>; + }; +}; + +&usb2_phy_v2 { + gpio-vbus-power = "GPIOA_8"; + gpios = <&gpio GPIOA_8 GPIO_ACTIVE_HIGH>; +}; + +&usb3_phy_v2 { + otg = <1>; + default-host; // or default-otg, or nothing for auto + gpio-vbus-power = "GPIOAO_7"; + gpios = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_HIGH>; +}; + +&i2c3 { + rt5651: rt5651@1a { + compatible = "realtek,rt5651"; + #sound-dai-cells = <0>; + reg = <0x1a>; + status = "okay"; + realtek,dmic-en = "false"; + realtek,in2-differential = "false"; + }; + + hym8563: hym8563@51 { + compatible = "haoyu,hym8563"; + reg = <0x51>; + #clock-cells = <0>; + clock-frequency = <32768>; + clock-output-names = "xin32k"; + }; +}; + +&audiobus { + aml_tdmc: tdmc { + pinctrl-0 = </*&tdmc_mclk &tdmout_c &tdmin_c*/>; + }; + + tdm@3 { + status = "disabled"; + }; +}; /* end of audiobus */ + +&pinctrl_aobus { + /delete-node/ spdifout; + /delete-node/ spdifout_a_mute; +}; + +&pinctrl_periphs { + /delete-node/ tdmc_mclk; + /delete-node/ tdmout_c; + /delete-node/ tdmin_c; + + spdifout: spdifout { + mux { /* GPIOA_11 */ + groups = "spdif_out_a11"; + function = "spdif_out"; + }; + }; + + spdifout_a_mute: spdifout_a_mute { + mux { /* GPIOA_11 */ + groups = "GPIOA_11"; + function = "gpio_periphs"; + }; + }; +}; /* end of pinctrl_periphs */ diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_4g.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_4g.dts new file mode 100644 index 000000000000..a0004d876792 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_4g.dts @@ -0,0 +1,9 @@ +#include "g12b_s922x_ugoos_am6_2g.dts" + +/{ + amlogic-dt-id = "g12b_AM6_b4g"; + + memory@00000000 { + linux,usable-memory = <0x000000 0xF5000000>; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_rev_a_2g.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_rev_a_2g.dts new file mode 100644 index 000000000000..5aa71fc3db78 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_rev_a_2g.dts @@ -0,0 +1,101 @@ +#include "coreelec_g12b_a.dtsi" + +/{ + model = "UGOOS AM6"; + coreelec-dt-id = "g12b_s922x_ugoos_am6_rev_a"; + amlogic-dt-id = "g12b_AM6_a2g"; + + memory@00000000 { + linux,usable-memory = <0x000000 0x80000000>; + }; + + auge_sound { + aml-audio-card,dai-link@1 { + codec { + sound-dai = <&rt5651>; + }; + }; + }; + + gpioleds { + green_led { + label = "green_led"; + gpios = <&gpio GPIOC_7 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "default-on"; + }; + }; + + wifi{ + power_on_pin = <&gpio_ao GPIOAO_10 GPIO_ACTIVE_HIGH>; + }; + + gpio_keypad { + key-gpios = <&gpio_ao GPIOAO_6 GPIO_ACTIVE_HIGH>; + }; +}; + +&usb2_phy_v2 { + gpio-vbus-power = "GPIOA_8"; + gpios = <&gpio GPIOA_8 GPIO_ACTIVE_HIGH>; +}; + +&usb3_phy_v2 { + otg = <1>; + default-host; // or default-otg, or nothing for auto + gpio-vbus-power = "GPIOAO_7"; + gpios = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_HIGH>; +}; + +&i2c3 { + rt5651: rt5651@1a { + compatible = "realtek,rt5651"; + #sound-dai-cells = <0>; + reg = <0x1a>; + status = "okay"; + realtek,dmic-en = "false"; + realtek,in2-differential = "false"; + }; + + hym8563: hym8563@51 { + compatible = "haoyu,hym8563"; + reg = <0x51>; + #clock-cells = <0>; + clock-frequency = <32768>; + clock-output-names = "xin32k"; + }; +}; + +&audiobus { + aml_tdmc: tdmc { + pinctrl-0 = </*&tdmc_mclk &tdmout_c &tdmin_c*/>; + }; + + tdm@3 { + status = "disabled"; + }; +}; /* end of audiobus */ + +&pinctrl_aobus { + /delete-node/ spdifout; + /delete-node/ spdifout_a_mute; +}; + +&pinctrl_periphs { + /delete-node/ tdmc_mclk; + /delete-node/ tdmout_c; + /delete-node/ tdmin_c; + + spdifout: spdifout { + mux { /* GPIOA_11 */ + groups = "spdif_out_a11"; + function = "spdif_out"; + }; + }; + + spdifout_a_mute: spdifout_a_mute { + mux { /* GPIOA_11 */ + groups = "GPIOA_11"; + function = "gpio_periphs"; + }; + }; +}; /* end of pinctrl_periphs */ diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_rev_a_4g.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_rev_a_4g.dts new file mode 100644 index 000000000000..f1f1eacef83a --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6_rev_a_4g.dts @@ -0,0 +1,9 @@ +#include "g12b_s922x_ugoos_am6_rev_a_2g.dts" + +/{ + amlogic-dt-id = "g12b_AM6_a4g"; + + memory@00000000 { + linux,usable-memory = <0x000000 0xF5000000>; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_2g.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_2g.dts new file mode 100644 index 000000000000..a293658b53b3 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_2g.dts @@ -0,0 +1,29 @@ +#include "g12b_s922x_ugoos_am6_2g.dts" + +/{ + model = "UGOOS AM6B"; + coreelec-dt-id = "g12b_s922x_ugoos_am6b"; + amlogic-dt-id = "g12b_AM6b_b2g"; + + auge_sound { + aml-audio-card,dai-link@1 { + codec { + sound-dai = <&es8388>; + }; + }; + }; +}; + +&i2c3 { + /delete-node/ rt5651@1a; + + es8388: es8388@10 { + status = "okay"; + compatible = "everest,es8388"; + #sound-dai-cells = <0>; + reg = <0x10>; + def-vol = <0x1d>; + def-dacvol = <0x0a>; + aux-det-gpio = <&gpio GPIOH_4 GPIO_ACTIVE_HIGH>; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_4g.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_4g.dts new file mode 100644 index 000000000000..adb06b6cf89a --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_4g.dts @@ -0,0 +1,9 @@ +#include "g12b_s922x_ugoos_am6b_2g.dts" + +/{ + amlogic-dt-id = "g12b_AM6b_b4g"; + + memory@00000000 { + linux,usable-memory = <0x000000 0xF5000000>; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_rev_a_2g.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_rev_a_2g.dts new file mode 100644 index 000000000000..fe5937c28760 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_rev_a_2g.dts @@ -0,0 +1,29 @@ +#include "g12b_s922x_ugoos_am6_rev_a_2g.dts" + +/{ + model = "UGOOS AM6B"; + coreelec-dt-id = "g12b_s922x_ugoos_am6b_rev_a"; + amlogic-dt-id = "g12b_AM6b_a2g"; + + auge_sound { + aml-audio-card,dai-link@1 { + codec { + sound-dai = <&es8388>; + }; + }; + }; +}; + +&i2c3 { + /delete-node/ rt5651@1a; + + es8388: es8388@10 { + status = "okay"; + compatible = "everest,es8388"; + #sound-dai-cells = <0>; + reg = <0x10>; + def-vol = <0x1d>; + def-dacvol = <0x0a>; + aux-det-gpio = <&gpio GPIOH_4 GPIO_ACTIVE_HIGH>; + }; +}; diff --git a/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_rev_a_4g.dts b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_rev_a_4g.dts new file mode 100644 index 000000000000..44d09b2e89d4 --- /dev/null +++ b/arch/arm/boot/dts/amlogic/g12b_s922x_ugoos_am6b_rev_a_4g.dts @@ -0,0 +1,9 @@ +#include "g12b_s922x_ugoos_am6b_rev_a_2g.dts" + +/{ + amlogic-dt-id = "g12b_AM6b_a4g"; + + memory@00000000 { + linux,usable-memory = <0x000000 0xF5000000>; + }; +}; -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0005-arm-error-static-declaration-of-machine_name-follows.patch ================================================ From 7cf9c6d4875104988e7cf7734125c0d152c16c08 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Wed, 10 May 2023 21:10:44 +0200 Subject: [PATCH 05/18] arm: error: static declaration of 'machine_name' follows non-static declaration --- arch/arm/kernel/setup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index db1fe8cda3d2..570393723cbf 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -165,7 +165,7 @@ char elf_platform[ELF_PLATFORM_SIZE]; EXPORT_SYMBOL(elf_platform); static const char *cpu_name; -static const char *machine_name; +const char *machine_name; static char __initdata cmd_line[COMMAND_LINE_SIZE]; const struct machine_desc *machine_desc __initdata; -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0006-arm-config-item-AMLOGIC_DVB_COMPAT-is-needed-for-com.patch ================================================ From a5c9df98141bf2c4181e4eca69c22cde1deaaf6b Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 11 May 2023 15:53:08 +0200 Subject: [PATCH 06/18] arm: config item AMLOGIC_DVB_COMPAT is needed for compile --- drivers/amlogic/dvb/Kconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/amlogic/dvb/Kconfig b/drivers/amlogic/dvb/Kconfig index 9214af6708bc..f5eeb5da09d1 100644 --- a/drivers/amlogic/dvb/Kconfig +++ b/drivers/amlogic/dvb/Kconfig @@ -30,7 +30,6 @@ endmenu menu "DVB COMPAT support" config AMLOGIC_DVB_COMPAT bool "Amlogic DVB drivers" - depends on COMPAT help select it to support amlogic dvb driver endmenu -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0007-vfm-change-vfm-path-to-match-CE-for-DV.patch ================================================ From 4a39e55285b046b7858061626b2e085de96050d7 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Wed, 29 Mar 2023 16:40:49 +0200 Subject: [PATCH 07/18] vfm: change vfm path to match CE for DV use FRAME_BASE_PATH_AMLVIDEO_AMVIDEO path --- drivers/amlogic/media/common/vfm/vfm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/amlogic/media/common/vfm/vfm.c b/drivers/amlogic/media/common/vfm/vfm.c index 4c4e81143732..a4661005bdf1 100644 --- a/drivers/amlogic/media/common/vfm/vfm.c +++ b/drivers/amlogic/media/common/vfm/vfm.c @@ -402,7 +402,7 @@ static void vfm_init(void) #ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION char def_dvbl_id[VFM_NAME_LEN] = "dvblpath"; /* char def_dvbl_chain[] = "dvbldec dvbl amvideo";*/ - char def_dvbl_chain[] = "dvbldec amvideo"; + char def_dvbl_chain[] = "dvbldec amlvideo ppmgr deinterlace amvideo"; char def_dvel_id[VFM_NAME_LEN] = "dvelpath"; char def_dvel_chain[] = "dveldec dvel"; -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0008-auto-cs-do-not-force-vuy420-on-4k-50-60Hz-when-sourc.patch ================================================ From 2fc70ce7b25427b1208f8e2b045be4363df846ea Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 31 Mar 2023 09:30:05 +0200 Subject: [PATCH 08/18] auto cs: do not force vuy420 on 4k/50/60Hz when source is Dolby Vision --- .../vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index d97b4c2ab736..c1b843ccd08b 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -5502,19 +5502,28 @@ static enum vmode_e hdmitx_validate_vmode(char *mode, unsigned int frac) // force 4k50/60Hz to 420 unless manually set if (strstr(hdev->fmt_attr, "rgb") == NULL && + strstr(hdev->fmt_attr, "420") == NULL && strstr(hdev->fmt_attr, "422") == NULL && strstr(hdev->fmt_attr, "444") == NULL) { - switch (hdmitx_edid_vic_tab_map_vic(mode)) { - case HDMI_3840x2160p50_16x9: - case HDMI_3840x2160p60_16x9: - case HDMI_4096x2160p50_256x135: - case HDMI_4096x2160p60_256x135: - case HDMI_3840x2160p50_64x27: - case HDMI_3840x2160p60_64x27: - if (!strstr(mode, "420")) - strncat(mode, "420", 3); + switch (hdev->hdmi_current_eotf_type) { + case EOTF_T_DOLBYVISION: + case EOTF_T_LL_MODE: + case EOTF_T_DV_AHEAD: break; default: + switch (hdmitx_edid_vic_tab_map_vic(mode)) { + case HDMI_3840x2160p50_16x9: + case HDMI_3840x2160p60_16x9: + case HDMI_4096x2160p50_256x135: + case HDMI_4096x2160p60_256x135: + case HDMI_3840x2160p50_64x27: + case HDMI_3840x2160p60_64x27: + if (!strstr(mode, "420")) + strncat(mode, "420", 3); + break; + default: + break; + } break; } } -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0009-dolby_vision-adjust-DV-policy.patch ================================================ From 01e054d1db36bc47bac9f45c1c770cac1e6412da Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Wed, 12 Apr 2023 15:38:53 +0200 Subject: [PATCH 09/18] dolby_vision: adjust DV policy --- .../amlogic/media/enhancement/amdolby_vision/amdolby_vision.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c index c59aa708b0c7..dc4d2bd2c2e9 100644 --- a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c +++ b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c @@ -123,7 +123,7 @@ MODULE_PARM_DESC(primary_debug, "\n primary_debug\n"); /* else bypass Dolby Vision */ /* #define DOLBY_VISION_FORCE_OUTPUT_MODE 2 */ -static unsigned int dolby_vision_policy = 1; +static unsigned int dolby_vision_policy = DOLBY_VISION_FOLLOW_SOURCE; module_param(dolby_vision_policy, uint, 0664); MODULE_PARM_DESC(dolby_vision_policy, "\n dolby_vision_policy\n"); static unsigned int last_dolby_vision_policy; @@ -147,7 +147,7 @@ static unsigned int last_dolby_vision_policy; #define SDR_BY_DV_F_SINK 0x20 #define SDR_BY_DV_F_SRC 0x40 -static unsigned int dolby_vision_hdr10_policy; +static unsigned int dolby_vision_hdr10_policy = (HDR_BY_DV_F_SRC | HLG_BY_DV_F_SRC | SDR_BY_DV_F_SRC); module_param(dolby_vision_hdr10_policy, uint, 0664); MODULE_PARM_DESC(dolby_vision_hdr10_policy, "\n dolby_vision_hdr10_policy\n"); static unsigned int last_dolby_vision_hdr10_policy; -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0010-dolby_vision-provide-ATTR-ko_info.patch ================================================ From 917ccf3a49f38dd6db6de142972d6730d4b0d40e Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Tue, 4 Apr 2023 11:52:13 +0200 Subject: [PATCH 10/18] dolby_vision: provide ATTR 'ko_info' --- .../enhancement/amdolby_vision/amdolby_vision.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c index dc4d2bd2c2e9..f19c9cf2b98a 100644 --- a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c +++ b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c @@ -12465,6 +12465,16 @@ static const struct file_operations amdolby_vision_fops = { .poll = amdolby_vision_poll, }; +static ssize_t amdolby_vision_ko_info_show + (struct class *cla, + struct class_attribute *attr, char *buf) +{ + if (ko_info) + return sprintf(buf, "%s", ko_info); + else + return 0; +} + static const char *amdolby_vision_debug_usage_str = { "Usage:\n" "echo dolby_crc 0/1 > /sys/class/amdolby_vision/debug; dolby_crc insert or clr\n" @@ -13230,6 +13240,8 @@ static ssize_t amdolby_vision_crc_show(struct class *cla, } static struct class_attribute amdolby_vision_class_attrs[] = { + __ATTR(ko_info, 0444, + amdolby_vision_ko_info_show, NULL), __ATTR(debug, 0644, amdolby_vision_debug_show, amdolby_vision_debug_store), __ATTR(dv_mode, 0644, -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0011-hdmitx-force-correct-colour-sampling-on-Dolby-Vision.patch ================================================ From ffabebaefea3f14771aba270cd0fcd7ff0cd475a Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 14 Apr 2023 08:39:30 +0200 Subject: [PATCH 11/18] hdmitx: force correct colour sampling on Dolby Vision 'fmt_attr' is not set in auto mode. It does require to force correct colour sampling and colour depth with Dolby Vision, supported by the used display. --- .../vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c | 143 ++++++++++++++---- 1 file changed, 113 insertions(+), 30 deletions(-) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index c1b843ccd08b..b8a18129638f 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -609,6 +609,7 @@ static int set_disp_mode_auto(void) unsigned char mode[32]; enum hdmi_vic vic = HDMI_Unknown; int colour_depths[] = { 8, 10, 12, 16 }; + char* colour_sampling[] = {"RGB","YUV422","YUV444","YUV420"}; memset(mode, 0, sizeof(mode)); hdev->ready = 0; @@ -674,46 +675,128 @@ static int set_disp_mode_auto(void) hdev->para = para; vic = hdmitx_edid_get_VIC(hdev, mode, 1); - if (strstr(hdev->fmt_attr,"bit") != NULL) { - pr_info("hdmitx: display colourdepth forced by attr to %d bits (VIC: %d)\n", colour_depths[para->cd - COLORDEPTH_24B], vic); - } else { - // parse and set maximum colourdepth given by edid - if (hdev->rxcap.ColorDeepSupport & 0x78 && hdev->para->cs != COLORSPACE_YUV420) { - enum hdmi_color_depth cd; - for (cd = COLORDEPTH_36B; cd >= COLORDEPTH_24B; cd--) { - if (hdev->rxcap.ColorDeepSupport & (1 << (cd - 1))) { - para->cd = cd; - break; + // auto detect colour sampling + if (strstr(hdev->fmt_attr, "rgb") == NULL && + strstr(hdev->fmt_attr, "420") == NULL && + strstr(hdev->fmt_attr, "422") == NULL && + strstr(hdev->fmt_attr, "444") == NULL) { + // force colour subsampling when DV mode + switch (hdev->hdmi_current_eotf_type) { + case EOTF_T_DOLBYVISION: + case EOTF_T_LL_MODE: + case EOTF_T_DV_AHEAD: + { + int cs = para->cs; + switch (hdev->hdmi_current_tunnel_mode) { + case RGB_8BIT: + case RGB_10_12BIT: + para->cs = COLORSPACE_RGB444; + break; + case YUV422_BIT12: + para->cs = COLORSPACE_YUV422; + break; + case YUV444_10_12BIT: + para->cs = COLORSPACE_YUV444; + break; + default: + break; + } + if (cs != para->cs) + pr_info("hdmitx: display colour subsampling is forced to %s by Dolby Vision tunneling\n", + colour_sampling[para->cs]); } - } - } else if (hdev->rxcap.hf_ieeeoui == HF_IEEEOUI) { - if (hdev->rxcap.dc_36bit_420) - para->cd = COLORDEPTH_36B; - else if (hdev->rxcap.dc_30bit_420) - para->cd = COLORDEPTH_30B; - else - para->cd = COLORDEPTH_24B; + break; + default: + break; } + pr_info("hdmitx: display colour subsampling is auto set to %s (VIC: %d)\n", + colour_sampling[para->cs], vic); + } + // auto detect colourdepth + if (strstr(hdev->fmt_attr,"bit") != NULL) { + pr_info("hdmitx: display colourdepth is forced by attr to %d bits (VIC: %d)\n", + colour_depths[para->cd - COLORDEPTH_24B], vic); + } else { + // parse and set maximum colourdepth given by edid // check for colour subsampling limit - switch (vic & 0xff) { - case HDMI_3840x2160p50_16x9: - case HDMI_3840x2160p60_16x9: - case HDMI_4096x2160p50_256x135: - case HDMI_4096x2160p60_256x135: - case HDMI_3840x2160p50_64x27: - case HDMI_3840x2160p60_64x27: - if (para->cs == COLORSPACE_RGB444 || para->cs == COLORSPACE_YUV444) + switch (hdev->hdmi_current_eotf_type) { + case EOTF_T_DOLBYVISION: + case EOTF_T_LL_MODE: + case EOTF_T_DV_AHEAD: { - para->cd = COLORDEPTH_24B; - pr_info("hdmitx: forced colourdepth to %d bits because of current video information code\n", colour_depths[para->cd - COLORDEPTH_24B]); + const struct dv_info *dv_info = &hdev->rxcap.dv_info; + int cd = para->cd; + switch (hdev->hdmi_current_tunnel_mode) { + case RGB_8BIT: + para->cd = COLORDEPTH_24B; + break; + case RGB_10_12BIT: + case YUV444_10_12BIT: + if (dv_info->ver == 2) { + switch (dv_info->sup_10b_12b_444) { + case 1: + para->cd = COLORDEPTH_30B; + break; + case 2: + para->cd = COLORDEPTH_36B; + break; + default: + break; + } + } + break; + case YUV422_BIT12: + para->cd = COLORDEPTH_36B; + break; + default: + break; + } + + if (cd != para->cd) + pr_info("hdmitx: display colourdepth is forced to %d bits because of Dolby Vision sink capability\n", + colour_depths[para->cd - COLORDEPTH_24B]); } break; default: + if (hdev->rxcap.ColorDeepSupport & 0x78 && hdev->para->cs != COLORSPACE_YUV420) { + enum hdmi_color_depth cd; + for (cd = COLORDEPTH_36B; cd >= COLORDEPTH_24B; cd--) { + if (hdev->rxcap.ColorDeepSupport & (1 << (cd - 1))) { + para->cd = cd; + break; + } + } + } else if (hdev->rxcap.hf_ieeeoui == HF_IEEEOUI) { + if (hdev->rxcap.dc_36bit_420) + para->cd = COLORDEPTH_36B; + else if (hdev->rxcap.dc_30bit_420) + para->cd = COLORDEPTH_30B; + else + para->cd = COLORDEPTH_24B; + } + + switch (vic & 0xff) { + case HDMI_3840x2160p50_16x9: + case HDMI_3840x2160p60_16x9: + case HDMI_4096x2160p50_256x135: + case HDMI_4096x2160p60_256x135: + case HDMI_3840x2160p50_64x27: + case HDMI_3840x2160p60_64x27: + if (para->cs == COLORSPACE_RGB444 || para->cs == COLORSPACE_YUV444) + { + para->cd = COLORDEPTH_24B; + pr_info("hdmitx: display colourdepth is forced to %d bits because of current video information code\n", + colour_depths[para->cd - COLORDEPTH_24B]); + } + break; + default: + break; break; + } } - - pr_info("hdmitx: display colourdepth is auto set to %d bits (VIC: %d)\n", colour_depths[para->cd - COLORDEPTH_24B], vic); + pr_info("hdmitx: display colourdepth is auto set to %d bits (VIC: %d)\n", + colour_depths[para->cd - COLORDEPTH_24B], vic); } if (strncmp(info->name, "2160p30hz", strlen("2160p30hz")) == 0) { -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0012-hdmitx-fix-display-of-current-hdmi-config-with-colou.patch ================================================ From 9a8e71e3e66503f1cc8d3143afe1a8db7a3b0fcc Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 14 Apr 2023 09:54:08 +0200 Subject: [PATCH 12/18] hdmitx: fix display of current hdmi config with colour space 422 --- drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index b8a18129638f..f7d5612727da 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -2580,7 +2580,7 @@ static ssize_t show_config(struct device *dev, para = hdev->para; // YUV422 - if (cs == 1) + if (cs == COLORSPACE_YUV422) cd = (~cd & 0x3); pos += snprintf(buf+pos, PAGE_SIZE, "VIC: %d %s\n", -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0013-hdmitx-force-YUV444-on-Dolby-Vision-RGB-on-modes-wit.patch ================================================ From 40c1254a2601d4e39656285f5180429e6bb4572a Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Tue, 18 Apr 2023 21:56:59 +0200 Subject: [PATCH 13/18] hdmitx: force YUV444 on Dolby Vision RGB on modes witch Otherwise the TV remain black. Reason need to be identified. --- drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index f7d5612727da..a0e1b9050182 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -690,7 +690,7 @@ static int set_disp_mode_auto(void) switch (hdev->hdmi_current_tunnel_mode) { case RGB_8BIT: case RGB_10_12BIT: - para->cs = COLORSPACE_RGB444; + para->cs = COLORSPACE_YUV444; break; case YUV422_BIT12: para->cs = COLORSPACE_YUV422; -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0014-hdmitx-provide-colour-subsampling-and-colour-depth-b.patch ================================================ From 425141ac7e62cd3c45c1b4a98e22f8d963324b8b Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 20 Apr 2023 20:46:18 +0200 Subject: [PATCH 14/18] hdmitx: provide colour subsampling and colour depth by sysfs These are used by Kodi to be able to detect if a forced mode switch is needed. --- .../vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index a0e1b9050182..9792c4fa3632 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -909,6 +909,35 @@ ssize_t store_attr(struct device *dev, } /*aud_mode attr*/ +static ssize_t cs_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int pos = 0; + int cs = hdmitx_rd_reg(HDMITX_DWC_FC_AVICONF0) & 0x3; + + pos += + snprintf(buf + pos, PAGE_SIZE, "%d\n", cs); + + return pos; +} + +static ssize_t cd_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int pos = 0; + int cs = hdmitx_rd_reg(HDMITX_DWC_FC_AVICONF0) & 0x3; + int cd = (hdmitx_rd_reg(HDMITX_DWC_TX_INVID0) & 0x6) >> 1; + + // YUV422 + if (cs == COLORSPACE_YUV422) + cd = (~cd & 0x3); + + pos += + snprintf(buf + pos, PAGE_SIZE, "%d\n", cd); + + return pos; +} + void setup_attr(const char *buf) { char attr[16] = {0}; @@ -5470,6 +5499,8 @@ static ssize_t show_hdmi_hsty_config(struct device *dev, static DEVICE_ATTR(disp_mode, 0664, show_disp_mode, store_disp_mode); static DEVICE_ATTR(attr, 0664, show_attr, store_attr); +static DEVICE_ATTR(cs, 0444, cs_show, NULL); +static DEVICE_ATTR(cd, 0444, cd_show, NULL); static DEVICE_ATTR(aud_mode, 0644, show_aud_mode, store_aud_mode); static DEVICE_ATTR(vid_mute, 0644, show_vid_mute, store_vid_mute); static DEVICE_ATTR(edid, 0644, show_edid, store_edid); @@ -6938,6 +6969,8 @@ static int amhdmitx_probe(struct platform_device *pdev) hdmitx_device.hdtx_dev = dev; ret = device_create_file(dev, &dev_attr_disp_mode); ret = device_create_file(dev, &dev_attr_attr); + ret = device_create_file(dev, &dev_attr_cs); + ret = device_create_file(dev, &dev_attr_cd); ret = device_create_file(dev, &dev_attr_aud_mode); ret = device_create_file(dev, &dev_attr_vid_mute); ret = device_create_file(dev, &dev_attr_edid); @@ -7077,6 +7110,8 @@ static int amhdmitx_remove(struct platform_device *pdev) /* Remove the cdev */ device_remove_file(dev, &dev_attr_disp_mode); device_remove_file(dev, &dev_attr_attr); + device_remove_file(dev, &dev_attr_cs); + device_remove_file(dev, &dev_attr_cd); device_remove_file(dev, &dev_attr_aud_mode); device_remove_file(dev, &dev_attr_vid_mute); device_remove_file(dev, &dev_attr_edid); -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0015-dolby_vision-provide-Dolby-Vision-video-on-by-sysfs.patch ================================================ From 5adfd80ef1d3558af19f926868da714356cee6d6 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 21 Apr 2023 10:37:39 +0200 Subject: [PATCH 15/18] dolby_vision: provide Dolby Vision video on by sysfs --- .../enhancement/amdolby_vision/amdolby_vision.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c index f19c9cf2b98a..c0669107392b 100644 --- a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c +++ b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c @@ -13239,6 +13239,18 @@ static ssize_t amdolby_vision_crc_show(struct class *cla, return sprintf(buf, "%s\n", cur_crc); } +static ssize_t dv_video_on_show + (struct class *cla, + struct class_attribute *attr, + char *buf) +{ + ssize_t len = 0; + + len += sprintf(buf + len, "%d\n", + is_dolby_vision_video_on()); + return len; +} + static struct class_attribute amdolby_vision_class_attrs[] = { __ATTR(ko_info, 0444, amdolby_vision_ko_info_show, NULL), @@ -13286,6 +13298,8 @@ static struct class_attribute amdolby_vision_class_attrs[] = { __ATTR(use_target_lum_from_cfg, 0644, amdolby_vision_use_cfg_target_lum_show, amdolby_vision_use_cfg_target_lum_store), + __ATTR(dv_video_on, 0444, + dv_video_on_show, NULL), __ATTR_NULL }; -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0016-hdmitx-add-dolby-vision-support-for-display-current-.patch ================================================ From 7f07487547b2e4aa69b09bb0d36849cf2a954b31 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 19 May 2023 10:58:52 +0200 Subject: [PATCH 16/18] hdmitx: add dolby vision support for display current hdmi config --- .../media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index 9792c4fa3632..675564ef3005 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -2590,7 +2590,10 @@ static ssize_t show_config(struct device *dev, struct hdmitx_dev *hdev = &hdmitx_device; int colour_depths[] = { 8, 10, 12, 16 }; char* pix_fmt[] = {"RGB","YUV422","YUV444","YUV420"}; - char* eotf[] = {"SDR","HDR","HDR10","HLG"}; + char* eotf_hdr[] = {"unknown", "HDR10","HLG","HDR","SDR"}; + char* eotf_DV[] = {"unknown", "DV-Std","DV-LL"}; + char* eotf_hdr10p[] = {"unknown", "HDR10+"}; + char* eotf = eotf_hdr[4]; char* range[] = {"default","limited","full"}; char* colourimetry[] = {"default", "BT.601", "BT.709", "xvYCC601","xvYCC709", "sYCC601","Adobe_YCC601","Adobe_RGB","BT.2020c","BT.2020nc","P3 D65","P3 DCI"}; @@ -2612,13 +2615,20 @@ static ssize_t show_config(struct device *dev, if (cs == COLORSPACE_YUV422) cd = (~cd & 0x3); + if (hdmitx_hdr10p_en()) + eotf = eotf_hdr10p[hdmitx_get_cur_hdr10p_st() & ~HDMI_HDR10P_TYPE]; + else if (hdmitx_dv_en()) + eotf = eotf_DV[hdmitx_get_cur_dv_st() & ~HDMI_DV_TYPE]; + else if (hdmitx_hdr_en()) + eotf = eotf_hdr[hdmitx_get_cur_hdr_st() & ~HDMI_HDR_TYPE]; + pos += snprintf(buf+pos, PAGE_SIZE, "VIC: %d %s\n", hdmitx_device.cur_VIC, para->name); pos += snprintf(buf + pos, PAGE_SIZE, "Colour depth: %d-bit\nColourspace: %s\nColour range: %s\nEOTF: %s\nYCC colour range: %s\n", colour_depths[cd], pix_fmt[cs], range[(hdmitx_rd_reg(HDMITX_DWC_FC_AVICONF2) & 0xc) >> 2], - eotf[(hdmitx_rd_reg(HDMITX_DWC_FC_DRM_PB00) & 7)], + eotf, range[((hdmitx_rd_reg(HDMITX_DWC_FC_AVICONF3) & 0xc) >> 2) + 1]); if (((hdmitx_rd_reg(HDMITX_DWC_FC_AVICONF1) & 0xc0) >> 6) < 0x3) pos += snprintf(buf + pos, PAGE_SIZE, "Colourimetry: %s\n", -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0017-ARM-8933-1-replace-Sun-Solaris-style-flag-on-section.patch ================================================ From e161ae5e989f53c353fccd335b15c00d42329fee Mon Sep 17 00:00:00 2001 From: Nick Desaulniers <ndesaulniers@google.com> Date: Mon, 4 Nov 2019 19:31:45 +0100 Subject: [PATCH 17/18] ARM: 8933/1: replace Sun/Solaris style flag on section directive It looks like a section directive was using "Solaris style" to declare the section flags. Replace this with the GNU style so that Clang's integrated assembler can assemble this directive. The modified instances were identified via: $ ag \.section | grep # Link: https://ftp.gnu.org/old-gnu/Manuals/gas-2.9.1/html_chapter/as_7.html#SEC119 Link: https://github.com/ClangBuiltLinux/linux/issues/744 Link: https://bugs.llvm.org/show_bug.cgi?id=43759 Link: https://reviews.llvm.org/D69296 Acked-by: Nicolas Pitre <nico@fluxnic.net> Reviewed-by: Ard Biesheuvel <ardb@kernel.org> Reviewed-by: Stefan Agner <stefan@agner.ch> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> Suggested-by: Fangrui Song <maskray@google.com> Suggested-by: Jian Cai <jiancai@google.com> Suggested-by: Peter Smith <peter.smith@linaro.org> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> --- arch/arm/boot/bootp/init.S | 2 +- arch/arm/boot/compressed/big-endian.S | 2 +- arch/arm/boot/compressed/head.S | 2 +- arch/arm/boot/compressed/piggy.S | 2 +- arch/arm/mm/proc-arm1020.S | 2 +- arch/arm/mm/proc-arm1020e.S | 2 +- arch/arm/mm/proc-arm1022.S | 2 +- arch/arm/mm/proc-arm1026.S | 2 +- arch/arm/mm/proc-arm720.S | 2 +- arch/arm/mm/proc-arm740.S | 2 +- arch/arm/mm/proc-arm7tdmi.S | 2 +- arch/arm/mm/proc-arm920.S | 2 +- arch/arm/mm/proc-arm922.S | 2 +- arch/arm/mm/proc-arm925.S | 2 +- arch/arm/mm/proc-arm926.S | 2 +- arch/arm/mm/proc-arm940.S | 2 +- arch/arm/mm/proc-arm946.S | 2 +- arch/arm/mm/proc-arm9tdmi.S | 2 +- arch/arm/mm/proc-fa526.S | 2 +- arch/arm/mm/proc-feroceon.S | 2 +- arch/arm/mm/proc-mohawk.S | 2 +- arch/arm/mm/proc-sa110.S | 2 +- arch/arm/mm/proc-sa1100.S | 2 +- arch/arm/mm/proc-v6.S | 2 +- arch/arm/mm/proc-v7.S | 2 +- arch/arm/mm/proc-v7m.S | 4 ++-- arch/arm/mm/proc-xsc3.S | 2 +- arch/arm/mm/proc-xscale.S | 2 +- 28 files changed, 29 insertions(+), 29 deletions(-) diff --git a/arch/arm/boot/bootp/init.S b/arch/arm/boot/bootp/init.S index 78b508075161..868eeeaaa46e 100644 --- a/arch/arm/boot/bootp/init.S +++ b/arch/arm/boot/bootp/init.S @@ -16,7 +16,7 @@ * size immediately following the kernel, we could build this into * a binary blob, and concatenate the zImage using the cat command. */ - .section .start,#alloc,#execinstr + .section .start, "ax" .type _start, #function .globl _start diff --git a/arch/arm/boot/compressed/big-endian.S b/arch/arm/boot/compressed/big-endian.S index 25ab26f1c6f0..f22428e275f8 100644 --- a/arch/arm/boot/compressed/big-endian.S +++ b/arch/arm/boot/compressed/big-endian.S @@ -5,7 +5,7 @@ * Author: Nicolas Pitre */ - .section ".start", #alloc, #execinstr + .section ".start", "ax" mrc p15, 0, r0, c1, c0, 0 @ read control reg orr r0, r0, #(1 << 7) @ enable big endian mode diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index 6e7180dfa4ed..328451fcbb6c 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S @@ -114,7 +114,7 @@ #endif .endm - .section ".start", #alloc, #execinstr + .section ".start", "ax" /* * sort out different calling conventions */ diff --git a/arch/arm/boot/compressed/piggy.S b/arch/arm/boot/compressed/piggy.S index f72088495f43..74274a3bd28e 100644 --- a/arch/arm/boot/compressed/piggy.S +++ b/arch/arm/boot/compressed/piggy.S @@ -1,4 +1,4 @@ - .section .piggydata,#alloc + .section .piggydata,"a" .globl input_data input_data: .incbin "arch/arm/boot/compressed/piggy_data" diff --git a/arch/arm/mm/proc-arm1020.S b/arch/arm/mm/proc-arm1020.S index 774ef1323554..4773490177c9 100644 --- a/arch/arm/mm/proc-arm1020.S +++ b/arch/arm/mm/proc-arm1020.S @@ -505,7 +505,7 @@ cpu_arm1020_name: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .type __arm1020_proc_info,#object __arm1020_proc_info: diff --git a/arch/arm/mm/proc-arm1020e.S b/arch/arm/mm/proc-arm1020e.S index ae3c27b71594..928e8ca58f40 100644 --- a/arch/arm/mm/proc-arm1020e.S +++ b/arch/arm/mm/proc-arm1020e.S @@ -463,7 +463,7 @@ arm1020e_crval: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .type __arm1020e_proc_info,#object __arm1020e_proc_info: diff --git a/arch/arm/mm/proc-arm1022.S b/arch/arm/mm/proc-arm1022.S index dbb2413fe04d..385584c3d222 100644 --- a/arch/arm/mm/proc-arm1022.S +++ b/arch/arm/mm/proc-arm1022.S @@ -448,7 +448,7 @@ arm1022_crval: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .type __arm1022_proc_info,#object __arm1022_proc_info: diff --git a/arch/arm/mm/proc-arm1026.S b/arch/arm/mm/proc-arm1026.S index 0b37b2cef9d3..29cc81857373 100644 --- a/arch/arm/mm/proc-arm1026.S +++ b/arch/arm/mm/proc-arm1026.S @@ -442,7 +442,7 @@ arm1026_crval: string cpu_arm1026_name, "ARM1026EJ-S" .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .type __arm1026_proc_info,#object __arm1026_proc_info: diff --git a/arch/arm/mm/proc-arm720.S b/arch/arm/mm/proc-arm720.S index 3651cd70e418..c08cd1b0a1d0 100644 --- a/arch/arm/mm/proc-arm720.S +++ b/arch/arm/mm/proc-arm720.S @@ -186,7 +186,7 @@ arm720_crval: * See <asm/procinfo.h> for a definition of this structure. */ - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .macro arm720_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cpu_flush:req .type __\name\()_proc_info,#object diff --git a/arch/arm/mm/proc-arm740.S b/arch/arm/mm/proc-arm740.S index 024fb7732407..6eed87103b95 100644 --- a/arch/arm/mm/proc-arm740.S +++ b/arch/arm/mm/proc-arm740.S @@ -132,7 +132,7 @@ __arm740_setup: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .type __arm740_proc_info,#object __arm740_proc_info: .long 0x41807400 diff --git a/arch/arm/mm/proc-arm7tdmi.S b/arch/arm/mm/proc-arm7tdmi.S index 25472d94426d..beb64a7ccb38 100644 --- a/arch/arm/mm/proc-arm7tdmi.S +++ b/arch/arm/mm/proc-arm7tdmi.S @@ -76,7 +76,7 @@ __arm7tdmi_setup: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .macro arm7tdmi_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, \ extra_hwcaps=0 diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S index 7a14bd4414c9..5d4319708362 100644 --- a/arch/arm/mm/proc-arm920.S +++ b/arch/arm/mm/proc-arm920.S @@ -448,7 +448,7 @@ arm920_crval: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .type __arm920_proc_info,#object __arm920_proc_info: diff --git a/arch/arm/mm/proc-arm922.S b/arch/arm/mm/proc-arm922.S index edccfcdcd551..7e22ca780b36 100644 --- a/arch/arm/mm/proc-arm922.S +++ b/arch/arm/mm/proc-arm922.S @@ -426,7 +426,7 @@ arm922_crval: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .type __arm922_proc_info,#object __arm922_proc_info: diff --git a/arch/arm/mm/proc-arm925.S b/arch/arm/mm/proc-arm925.S index 32a47cc19076..d343e77b8456 100644 --- a/arch/arm/mm/proc-arm925.S +++ b/arch/arm/mm/proc-arm925.S @@ -491,7 +491,7 @@ arm925_crval: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .macro arm925_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cache .type __\name\()_proc_info,#object diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S index fb827c633693..8cf78c608c42 100644 --- a/arch/arm/mm/proc-arm926.S +++ b/arch/arm/mm/proc-arm926.S @@ -474,7 +474,7 @@ arm926_crval: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .type __arm926_proc_info,#object __arm926_proc_info: diff --git a/arch/arm/mm/proc-arm940.S b/arch/arm/mm/proc-arm940.S index ee5b66f847c4..631ae64eeccd 100644 --- a/arch/arm/mm/proc-arm940.S +++ b/arch/arm/mm/proc-arm940.S @@ -344,7 +344,7 @@ __arm940_setup: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .type __arm940_proc_info,#object __arm940_proc_info: diff --git a/arch/arm/mm/proc-arm946.S b/arch/arm/mm/proc-arm946.S index 7361837edc31..033ad7402d67 100644 --- a/arch/arm/mm/proc-arm946.S +++ b/arch/arm/mm/proc-arm946.S @@ -399,7 +399,7 @@ __arm946_setup: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .type __arm946_proc_info,#object __arm946_proc_info: .long 0x41009460 diff --git a/arch/arm/mm/proc-arm9tdmi.S b/arch/arm/mm/proc-arm9tdmi.S index 7fac8c612134..2195468ccd76 100644 --- a/arch/arm/mm/proc-arm9tdmi.S +++ b/arch/arm/mm/proc-arm9tdmi.S @@ -70,7 +70,7 @@ __arm9tdmi_setup: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .macro arm9tdmi_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req .type __\name\()_proc_info, #object diff --git a/arch/arm/mm/proc-fa526.S b/arch/arm/mm/proc-fa526.S index 4001b73af4ee..fd3e5dd94e59 100644 --- a/arch/arm/mm/proc-fa526.S +++ b/arch/arm/mm/proc-fa526.S @@ -190,7 +190,7 @@ fa526_cr1_set: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .type __fa526_proc_info,#object __fa526_proc_info: diff --git a/arch/arm/mm/proc-feroceon.S b/arch/arm/mm/proc-feroceon.S index 92e08bf37aad..685d324a74d3 100644 --- a/arch/arm/mm/proc-feroceon.S +++ b/arch/arm/mm/proc-feroceon.S @@ -584,7 +584,7 @@ feroceon_crval: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .macro feroceon_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cache:req .type __\name\()_proc_info,#object diff --git a/arch/arm/mm/proc-mohawk.S b/arch/arm/mm/proc-mohawk.S index 6f07d2ef4ff2..9182321a586a 100644 --- a/arch/arm/mm/proc-mohawk.S +++ b/arch/arm/mm/proc-mohawk.S @@ -429,7 +429,7 @@ mohawk_crval: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .type __88sv331x_proc_info,#object __88sv331x_proc_info: diff --git a/arch/arm/mm/proc-sa110.S b/arch/arm/mm/proc-sa110.S index ee2ce496239f..093ad2ceff28 100644 --- a/arch/arm/mm/proc-sa110.S +++ b/arch/arm/mm/proc-sa110.S @@ -199,7 +199,7 @@ sa110_crval: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .type __sa110_proc_info,#object __sa110_proc_info: diff --git a/arch/arm/mm/proc-sa1100.S b/arch/arm/mm/proc-sa1100.S index 222d5836f666..12b8fcab4b59 100644 --- a/arch/arm/mm/proc-sa1100.S +++ b/arch/arm/mm/proc-sa1100.S @@ -242,7 +242,7 @@ sa1100_crval: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .macro sa1100_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req .type __\name\()_proc_info,#object diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index 06d890a2342b..32f4df0915ef 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S @@ -264,7 +264,7 @@ v6_crval: string cpu_elf_name, "v6" .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" /* * Match any ARMv6 processor core. diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 850c22bca19c..156fc195a332 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S @@ -631,7 +631,7 @@ __v7_setup_stack: string cpu_elf_name, "v7" .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" /* * Standard v7 proc info content diff --git a/arch/arm/mm/proc-v7m.S b/arch/arm/mm/proc-v7m.S index 50497778c2e5..ae038a76d9b8 100644 --- a/arch/arm/mm/proc-v7m.S +++ b/arch/arm/mm/proc-v7m.S @@ -96,7 +96,7 @@ ENTRY(cpu_cm7_proc_fin) ret lr ENDPROC(cpu_cm7_proc_fin) - .section ".init.text", #alloc, #execinstr + .section ".init.text", "ax" __v7m_cm7_setup: mov r8, #(V7M_SCB_CCR_DC | V7M_SCB_CCR_IC| V7M_SCB_CCR_BP) @@ -177,7 +177,7 @@ ENDPROC(__v7m_setup) string cpu_elf_name "v7m" string cpu_v7m_name "ARMv7-M" - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .macro __v7m_proc name, initfunc, cache_fns = nop_cache_fns, hwcaps = 0, proc_fns = v7m_processor_functions .long 0 /* proc_info_list.__cpu_mm_mmu_flags */ diff --git a/arch/arm/mm/proc-xsc3.S b/arch/arm/mm/proc-xsc3.S index 293dcc2c441f..da96e4de1353 100644 --- a/arch/arm/mm/proc-xsc3.S +++ b/arch/arm/mm/proc-xsc3.S @@ -499,7 +499,7 @@ xsc3_crval: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .macro xsc3_proc_info name:req, cpu_val:req, cpu_mask:req .type __\name\()_proc_info,#object diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S index b6bbfdb6dfdc..b9620d02dc01 100644 --- a/arch/arm/mm/proc-xscale.S +++ b/arch/arm/mm/proc-xscale.S @@ -612,7 +612,7 @@ xscale_crval: .align - .section ".proc.info.init", #alloc + .section ".proc.info.init", "a" .macro xscale_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cache .type __\name\()_proc_info,#object -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/0018-dolby_vision-add-is_mel-sysfs.patch ================================================ From 8a5d9b387b7f53aced94170779d77d1575f0d95c Mon Sep 17 00:00:00 2001 From: Arthur Liberman <arthur_liberman@hotmail.com> Date: Wed, 27 Dec 2023 19:32:42 +0200 Subject: [PATCH 18/18] dolby_vision: add `is_mel` sysfs Set to `true` when DoVi Profile 7 Minimum Enhancement Layer (MEL) content is detected This signals the application that it needs to switch to `dec_mode=STREAM_TYPE_FRAME` --- .../media/enhancement/amdolby_vision/amdolby_vision.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c index c0669107392b..6b20fbe687f7 100644 --- a/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c +++ b/drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c @@ -1392,6 +1392,9 @@ static int force_disable_dv_backlight; static bool dv_control_backlight_status; static bool bypass_all_vpp_pq; static int use_target_lum_from_cfg; +static bool is_mel = false; +module_param(is_mel, bool, 0444); +MODULE_PARM_DESC(is_mel, "\n is_mel\n"); /*0: not debug mode; 1:force bypass vpp pq; 2:force enable vpp pq*/ /*3: force do nothing*/ @@ -8229,7 +8232,7 @@ int dolby_vision_parse_metadata(struct vframe_s *vf, pr_dolby_dbg("bypass mel\n"); } if (ret_flags == 1) - mel_flag = true; + mel_flag = is_mel = true; if (!is_dv_standard_es(req.dv_enhance_exist, ret_flags, w)) { src_format = FORMAT_SDR; @@ -12587,6 +12590,7 @@ static ssize_t amdolby_vision_debug_store if (kstrtoul(parm[1], 10, &val) < 0) return -EINVAL; enable_fel = val; + is_mel = false; pr_info("enable_fel %d\n", enable_fel); } else if (!strcmp(parm[0], "ko_info")) { if (ko_info) -- 2.25.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/linux-02-fix_bluetooth_reconnect.patch ================================================ From 0996abc14470622eece29b66913b082a2eebe5f2 Mon Sep 17 00:00:00 2001 From: Florian Dollinger <dollinger.florian@gmx.de> Date: Sun, 7 Jan 2018 23:55:52 +0100 Subject: [PATCH] The current L2CAP implementation does not change any options if the other side respons with "unknown options", but does if "unaccepted options" is the answer. It is up to the implementation to decide on the effort spent on config negotiations, therefore the current implementation is correct at this point - but many devices (like Xbox One S controllers) are not useable this way. A workaround for many users therefore is to disable_ertm, since this is often the option which is unknown. I would prefer to try it again with altered options instead of globally disable ERTM. In result, I suggest the following patch. It simply adds a new case (L2CAP_CONF_UNKNOWN), which does nothing but falling through to L2CAP_CONF_UNACCEPT. Signed-off-by: Florian Dollinger <dollinger.florian@gmx.de> --- net/bluetooth/l2cap_core.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 43ba91c44..388d53bfd 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -4208,6 +4208,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, } goto done; + case L2CAP_CONF_UNKNOWN: case L2CAP_CONF_UNACCEPT: if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) { char req[64]; -- 2.15.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/linux-03-stop-hid-generic-from-grabing-xbone.patch ================================================ From 090b784913a5ff0a823510553f97c0d7b1115f57 Mon Sep 17 00:00:00 2001 From: cdu13a <cdu13a@gmail.com> Date: Sat, 23 Nov 2019 14:08:13 -0500 Subject: hid: stop hid-generic from being greedy with the xbox one controller --- drivers/hid/hid-core.c | 2 ++ drivers/hid/hid-ids.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index f5e17e8ce9ba..188c25a30870 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -2004,6 +2004,8 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_600) }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3KV1) }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_XBOX_ONE_S) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_XBOX_ONE_S_2016) }, { HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) }, { HID_USB_DEVICE(USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL) }, { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN) }, diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 8b5d1166416a..4d753184436a 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -745,6 +745,8 @@ #define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP 0x07dd #define USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_JP 0x07e9 #define USB_DEVICE_ID_MS_POWER_COVER 0x07da +#define USB_DEVICE_ID_MS_XBOX_ONE_S 0x02fd +#define USB_DEVICE_ID_MS_XBOX_ONE_S_2016 0x02e0 #define USB_VENDOR_ID_MOJO 0x8282 #define USB_DEVICE_ID_RETRO_ADAPTER 0x3201 -- 2.17.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/linux-04-xpadneo.patch ================================================ From 25d349d6af1eb1637cb82e9627c32f6225b0e912 Mon Sep 17 00:00:00 2001 From: cdu13a <cdu13a@gmail.com> Date: Sat, 23 Nov 2019 14:10:47 -0500 Subject: hid: add xpadneo driver 0.6.0 --- drivers/hid/Kconfig | 7 + drivers/hid/Makefile | 1 + drivers/hid/hid-xpadneo.c | 1415 +++++++++++++++++++++++++++++++++++++ 3 files changed, 1423 insertions(+) create mode 100644 drivers/hid/hid-xpadneo.c diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 8eed456a67be..4d385d46fb4c 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig @@ -909,6 +909,13 @@ config HID_XINMO standard. Currently only supports the Xin-Mo Dual Arcade. Say Y here if you have a Xin-Mo Dual Arcade controller. +config HID_XPADNEO + tristate "XBOX ONE S and X controller over Bluetooth, including FF" + depends on HID + select INPUT_FF_MEMLESS + ---help--- + Support for Xbox One S and X controllers over BT, including force-feedback. + config HID_ZEROPLUS tristate "Zeroplus based game controller support" depends on HID diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile index 86b2b5785fd2..dfdcb2e64cde 100644 --- a/drivers/hid/Makefile +++ b/drivers/hid/Makefile @@ -98,6 +98,7 @@ obj-$(CONFIG_HID_TWINHAN) += hid-twinhan.o obj-$(CONFIG_HID_UCLOGIC) += hid-uclogic.o obj-$(CONFIG_HID_LED) += hid-led.o obj-$(CONFIG_HID_XINMO) += hid-xinmo.o +obj-$(CONFIG_HID_XPADNEO) += hid-xpadneo.o obj-$(CONFIG_HID_ZEROPLUS) += hid-zpff.o obj-$(CONFIG_HID_ZYDACRON) += hid-zydacron.o diff --git a/drivers/hid/hid-xpadneo.c b/drivers/hid/hid-xpadneo.c new file mode 100644 index 000000000000..b4847ab6ee1a --- /dev/null +++ b/drivers/hid/hid-xpadneo.c @@ -0,0 +1,1414 @@ +#define DRV_VER "0.6.0" + +/* + * Force feedback support for XBOX ONE S and X gamepads via Bluetooth + * + * This driver was developed for a student project at fortiss GmbH in Munich. + * Copyright (c) 2017 Florian Dollinger <dollinger.florian@gmx.de> + */ + +#include <linux/hid.h> +#include <linux/power_supply.h> +#include <linux/input.h> /* ff_memless(), ... */ +#include <linux/module.h> /* MODULE_*, module_*, ... */ +#include <linux/slab.h> /* kzalloc(), kfree(), ... */ +#include <linux/delay.h> /* mdelay(), ... */ +#include "hid-ids.h" /* VENDOR_ID... */ + + +#define DEBUG + + +/* Module Information */ +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Florian Dollinger <dollinger.florian@gmx.de>"); +MODULE_DESCRIPTION("Linux kernel driver for Xbox ONE S+ gamepads (BT), incl. FF"); +MODULE_VERSION(DRV_VER); + + +/* Module Parameters, located at /sys/module/hid_xpadneo/parameters */ + +/* NOTE: + * In general it is not guaranteed that a short variable is no more than + * 16 bit long in C, it depends on the computer architecure. But as a kernel + * module parameter it is, since <params.c> does use kstrtou16 for shorts + * since version 3.14 + */ + +#ifdef DEBUG +static u8 param_debug_level; +module_param_named(debug_level, param_debug_level, byte, 0644); +MODULE_PARM_DESC(debug_level, "(u8) Debug information level: 0 (none) to 3+ (most verbose)."); +#endif + +static u8 param_disable_ff; +module_param_named(disable_ff, param_disable_ff, byte, 0644); +MODULE_PARM_DESC(disable_ff, "(u8) Disable FF: 0 (all enabled), 1 (disable main), 2 (disable triggers), 3 (disable all)."); + +#define PARAM_DISABLE_FF_NONE 0 +#define PARAM_DISABLE_FF_MAIN 1 +#define PARAM_DISABLE_FF_TRIGGER 2 +#define PARAM_DISABLE_FF_ALL 3 + +static bool param_combined_z_axis; +module_param_named(combined_z_axis, param_combined_z_axis, bool, 0644); +MODULE_PARM_DESC(combined_z_axis, "(bool) Combine the triggers to form a single axis. 1: combine, 0: do not combine"); + +static u8 param_trigger_rumble_damping = 4; +module_param_named(trigger_rumble_damping, param_trigger_rumble_damping, byte, 0644); +MODULE_PARM_DESC(trigger_rumble_damping, "(u8) Damp the trigger: 1 (none) to 2^8+ (max)"); + +static u16 param_fake_dev_version = 0x1130; +module_param_named(fake_dev_version, param_fake_dev_version, ushort, 0644); +MODULE_PARM_DESC(fake_dev_version, "(u16) Fake device version # to hide from SDL's mappings. 0x0001-0xFFFF: fake version, others: keep original"); + + +/* + * Debug Printk + * + * Prints a debug message to kernel (dmesg) + * only if both is true, this is a DEBUG version and the + * param_debug_level-parameter is equal or higher than the level + * specified in hid_dbg_lvl + */ + +#define DBG_LVL_NONE 0 +#define DBG_LVL_FEW 1 +#define DBG_LVL_SOME 2 +#define DBG_LVL_ALL 3 + + +#ifdef DEBUG +#define hid_dbg_lvl(lvl, fmt_hdev, fmt_str, ...) \ + do { \ + if (param_debug_level >= lvl) \ + hid_dbg(pr_fmt(fmt_hdev), \ + pr_fmt(fmt_str), ##__VA_ARGS__); \ + } while (0) +#define dbg_hex_dump_lvl(lvl, fmt_prefix, data, size) \ + do { \ + if (param_debug_level >= lvl) \ + print_hex_dump(KERN_DEBUG, pr_fmt(fmt_prefix), \ + DUMP_PREFIX_NONE, 32, 1, data, size, false); \ + } while (0) +#else +#define hid_dbg_lvl(lvl, fmt_hdev, fmt_str, ...) \ + no_printk(KERN_DEBUG pr_fmt(fmt_str), ##__VA_ARGS__) +#define dbg_hex_dump_lvl(lvl, fmt_prefix, data, size) \ + no_printk(KERN_DEBUG pr_fmt(fmt_prefix)) +#endif + + +static DEFINE_IDA(xpadneo_device_id_allocator); + +/* + * FF Output Report + * + * This is the structure for the rumble output report. For more information + * about this structure please take a look in the hid-report description. + * Please notice that the structs are __packed, therefore there is no "padding" + * between the elements (they behave more like an array). + * + */ + +enum { + FF_ENABLE_NONE = 0x00, + FF_ENABLE_RIGHT = 0x01, + FF_ENABLE_LEFT = 0x02, + FF_ENABLE_RIGHT_TRIGGER = 0x04, + FF_ENABLE_LEFT_TRIGGER = 0x08, + FF_ENABLE_ALL = 0x0F +}; + +struct ff_data { + u8 enable_actuators; + u8 magnitude_left_trigger; + u8 magnitude_right_trigger; + u8 magnitude_left; + u8 magnitude_right; + u8 duration; + u8 start_delay; + u8 loop_count; +} __packed; + +struct ff_report { + u8 report_id; + struct ff_data ff; +} __packed; + +/* static variables are zeroed => empty initialization struct */ +static const struct ff_data ff_clear; + + +/* + * Device Data + * + * We attach information to hdev, which is therefore nearly globally accessible + * via hid_get_drvdata(hdev). It is attached to the hid_device via + * hid_set_drvdata(hdev) at the probing function. + */ + +enum report_type { + UNKNOWN, + LINUX, + WINDOWS +}; + +// TODO: avoid data duplication + +const char *report_type_text[] = { + "unknown", + "linux/android", + "windows" +}; + + +struct xpadneo_devdata { + /* mutual exclusion */ + spinlock_t lock; + + /* unique physical device id (randomly assigned) */ + int id; + + /* logical device interfaces */ + struct hid_device *hdev; + struct input_dev *idev; + struct power_supply *batt; + + /* report types */ + enum report_type report_descriptor; + enum report_type report_behaviour; + + /* battery information */ + struct power_supply_desc batt_desc; + u8 ps_online; + u8 ps_present; + u8 ps_capacity_level; + u8 ps_status; + + /* axis states */ + s32 last_abs_z; + s32 last_abs_rz; +}; + + +void create_ff_pck (struct ff_report *pck, u8 id, u8 en_act, + u8 mag_lt, u8 mag_rt, u8 mag_l, u8 mag_r, + u8 start_delay) { + + pck->report_id = id; + + pck->ff.enable_actuators = en_act; + pck->ff.magnitude_left_trigger = mag_lt; + pck->ff.magnitude_right_trigger = mag_rt; + pck->ff.magnitude_left = mag_l; + pck->ff.magnitude_right = mag_r; + pck->ff.duration = 0xFF; + pck->ff.start_delay = start_delay; + pck->ff.loop_count = 0xFF; + + /* It is up to the Input-Subsystem to start and stop effects as needed. + * All WE need to do is to play the effect at least 32767 ms long. + * Take a look here: + * https://stackoverflow.com/questions/48034091/ + * We therefore simply play the effect as long as possible, which is + * 2, 55s * 255 = 650, 25s ~ = 10min + */ +} + +/* + * Force Feedback Callback + * + * This function is called by the Input Subsystem. + * The effect data is set in userspace and sent to the driver via ioctl. + */ + +static int xpadneo_ff_play(struct input_dev *dev, void *data, + struct ff_effect *effect) +{ + /* Q: where is drvdata set to hid_device? + * A: hid_hw_start (called in probe) + * -> hid_connect -> hidinput_connect + * -> hidinput_allocate (sets drvdata to hid_device) + */ + + struct ff_report ff_pck; + u16 weak, strong, direction, max, max_damped; + u8 mag_main_right, mag_main_left, mag_trigger_right, mag_trigger_left; + u8 ff_active; + + const int fractions_milli[] + = {1000, 962, 854, 691, 500, 309, 146, 38, 0}; + const int proportions_idx_max = 8; + u8 index_left, index_right; + int fraction_TL, fraction_TR; + u8 trigger_rumble_damping_nonzero; + + enum { + DIRECTION_DOWN = 0x0000, + DIRECTION_LEFT = 0x4000, + DIRECTION_UP = 0x8000, + DIRECTION_RIGHT = 0xC000, + }; + + + struct hid_device *hdev = input_get_drvdata(dev); + + if (param_disable_ff == PARAM_DISABLE_FF_ALL) + return 0; + + if (effect->type != FF_RUMBLE) + return 0; + + /* copy data from effect structure at the very beginning */ + weak = effect->u.rumble.weak_magnitude; + strong = effect->u.rumble.strong_magnitude; + direction = effect->direction; + + hid_dbg_lvl(DBG_LVL_FEW, hdev, "playing effect: strong: %#04x, weak: %#04x, direction: %#04x\n", + strong, weak, direction); + + /* calculate the physical magnitudes */ + mag_main_right = (u8)((weak & 0xFF00) >> 8); /* u16 to u8 */ + mag_main_left = (u8)((strong & 0xFF00) >> 8); /* u16 to u8 */ + + + /* get the proportions from a precalculated cosine table + * calculation goes like: + * cosine(a) * 1000 = {1000, 924, 707, 383, 0, -383, -707, -924, -1000} + * fractions_milli(a) = (1000 + (cosine * 1000)) / 2 + */ + + fraction_TL = 0; + fraction_TR = 0; + + if (direction >= DIRECTION_LEFT && direction <= DIRECTION_RIGHT) { + index_left = (direction - DIRECTION_LEFT) >> 12; + index_right = proportions_idx_max - index_left; + + fraction_TL = fractions_milli[index_left]; + fraction_TR = fractions_milli[index_right]; + } + + /* we want to keep the rumbling at the triggers below the maximum + * of the weak and strong main rumble + */ + max = mag_main_right > mag_main_left ? mag_main_right : mag_main_left; + + /* the user can change the damping at runtime, hence check the range */ + trigger_rumble_damping_nonzero + = param_trigger_rumble_damping == 0 ? 1 : param_trigger_rumble_damping; + + max_damped = max / trigger_rumble_damping_nonzero; + + mag_trigger_left = (u8)((max_damped * fraction_TL) / 1000); + mag_trigger_right = (u8)((max_damped * fraction_TR) / 1000); + + + ff_active = FF_ENABLE_ALL; + + if (param_disable_ff & PARAM_DISABLE_FF_TRIGGER) + ff_active &= ~(FF_ENABLE_LEFT_TRIGGER | FF_ENABLE_RIGHT_TRIGGER); + + if (param_disable_ff & PARAM_DISABLE_FF_MAIN) + ff_active &= ~(FF_ENABLE_LEFT | FF_ENABLE_RIGHT); + + + create_ff_pck( + &ff_pck, 0x03, + ff_active, + mag_trigger_left, mag_trigger_right, + mag_main_left, mag_main_right, + 0); + + + hid_dbg_lvl(DBG_LVL_FEW, hdev, + "active: %#04x, max: %#04x, prop_left: %#04x, prop_right: %#04x, left trigger: %#04x, right: %#04x\n", + ff_active, + max, fraction_TL, fraction_TR, + ff_pck.ff.magnitude_left_trigger, + ff_pck.ff.magnitude_right_trigger); + + hid_hw_output_report(hdev, (u8 *)&ff_pck, sizeof(ff_pck)); + + return 0; +} + + +/* + * Device (Gamepad) Initialization + */ + +static int xpadneo_initDevice(struct hid_device *hdev) +{ + int error; + + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + struct input_dev *idev = xdata->idev; + + + struct ff_report ff_pck; + + /* TODO: outsource that */ + + ff_pck.ff = ff_clear; + + /* 'HELLO' FROM THE OTHER SIDE */ + if (!param_disable_ff) { + ff_pck.report_id = 0x03; + ff_pck.ff.magnitude_right = 0x80; + ff_pck.ff.magnitude_left = 0x40; + ff_pck.ff.magnitude_right_trigger = 0x20; + ff_pck.ff.magnitude_left_trigger = 0x20; + ff_pck.ff.duration = 33; + + ff_pck.ff.enable_actuators = FF_ENABLE_RIGHT; + hid_hw_output_report(hdev, (u8 *)&ff_pck, sizeof(ff_pck)); + mdelay(330); + + ff_pck.ff.enable_actuators = FF_ENABLE_LEFT; + hid_hw_output_report(hdev, (u8 *)&ff_pck, sizeof(ff_pck)); + mdelay(330); + + ff_pck.ff.enable_actuators + = FF_ENABLE_RIGHT_TRIGGER | FF_ENABLE_LEFT_TRIGGER; + hid_hw_output_report(hdev, (u8 *)&ff_pck, sizeof(ff_pck)); + mdelay(330); + } + + + /* Init Input System for Force Feedback (FF) */ + input_set_capability(idev, EV_FF, FF_RUMBLE); + error = input_ff_create_memless(idev, NULL, xpadneo_ff_play); + if (error) + return error; + + + /* + * Set default values, otherwise tools which depend on the joystick + * subsystem, report arbitrary values until the first real event + * TODO: Is this really necessary? + */ + input_report_abs(idev, ABS_X, 0); + input_report_abs(idev, ABS_Y, 0); + input_report_abs(idev, ABS_Z, 0); + input_report_abs(idev, ABS_RX, 0); + input_report_abs(idev, ABS_RY, 0); + input_report_abs(idev, ABS_RZ, 0); + input_report_key(idev, BTN_A, 0); + input_report_key(idev, BTN_B, 0); + input_report_key(idev, BTN_X, 0); + input_report_key(idev, BTN_Y, 0); + input_report_key(idev, BTN_TR, 0); + input_report_key(idev, BTN_TL, 0); + input_report_key(idev, BTN_THUMBL, 0); + input_report_key(idev, BTN_THUMBR, 0); + input_report_key(idev, BTN_START, 0); + input_report_key(idev, BTN_MODE, 0); + input_report_key(idev, ABS_HAT0X, 0); + input_report_key(idev, ABS_HAT0Y, 0); + input_sync(idev); + + /* TODO: - do not hardcode codes and values but + * keep them in the mapping structures + * - maybe initDevice isn't the right place + */ + + return 0; +} + + +/* Callback function which return the available properties to userspace */ +static int battery_get_property(struct power_supply *ps, + enum power_supply_property property, union power_supply_propval *val) +{ + struct xpadneo_devdata *xdata = power_supply_get_drvdata(ps); + unsigned long flags; + u8 capacity_level, present, online, status; + + spin_lock_irqsave(&xdata->lock, flags); + capacity_level = xdata->ps_capacity_level; + present = xdata->ps_present; + online = xdata->ps_online; + status = xdata->ps_status; + spin_unlock_irqrestore(&xdata->lock, flags); + + switch (property) { + case POWER_SUPPLY_PROP_MANUFACTURER: + val->strval = "Microsoft"; + break; + case POWER_SUPPLY_PROP_MODEL_NAME: + val->strval = "Xbox Wireless Controller"; + break; + case POWER_SUPPLY_PROP_PRESENT: + val->intval = present; + break; + case POWER_SUPPLY_PROP_ONLINE: + val->intval = online; + break; + case POWER_SUPPLY_PROP_SCOPE: + val->intval = POWER_SUPPLY_SCOPE_DEVICE; + break; + case POWER_SUPPLY_PROP_CAPACITY_LEVEL: + val->intval = capacity_level; + break; + case POWER_SUPPLY_PROP_STATUS: + val->intval = status; + break; + default: + return -EINVAL; + } + + return 0; +} + + +static int xpadneo_initBatt(struct hid_device *hdev) +{ + int ret = 0; + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + + static enum power_supply_property battery_props[] = { + /* is a power supply available? always true */ + POWER_SUPPLY_PROP_PRESENT, + /* critical, low, normal, high, full */ + POWER_SUPPLY_PROP_CAPACITY_LEVEL, + /* powers a specific device */ + POWER_SUPPLY_PROP_SCOPE, + /* charging (full, plugged), not_charging */ + POWER_SUPPLY_PROP_STATUS, + /* cstring - manufacturer name */ + POWER_SUPPLY_PROP_MANUFACTURER, + /* cstring - model name */ + POWER_SUPPLY_PROP_MODEL_NAME, + POWER_SUPPLY_PROP_ONLINE + }; + + + struct power_supply_config ps_config = { + /* pass the xpadneo_data to the get_property function */ + .drv_data = xdata + }; + + + /* Set up power supply */ + + /* Set the battery capacity to 'full' until we get our first real + * battery event. Prevents false "critical low battery" notifications + */ + xdata->ps_capacity_level = POWER_SUPPLY_CAPACITY_LEVEL_FULL; + + /* NOTE: hdev->uniq is meant to be the MAC address and hence + * it should be unique. Unfortunately, here it is not unique + * neither is it the bluetooth MAC address. + * As a solution we add an unique id for every gamepad. + */ + + xdata->batt_desc.name = kasprintf(GFP_KERNEL, "xpadneo_batt_%pMR_%i", + hdev->uniq, xdata->id); + if (!xdata->batt_desc.name) + return -ENOMEM; + + xdata->batt_desc.type = POWER_SUPPLY_TYPE_BATTERY; + + /* Which properties of the battery are accessible? */ + xdata->batt_desc.properties = battery_props; + xdata->batt_desc.num_properties = ARRAY_SIZE(battery_props); + + /* + * We have to offer a function which returns the current + * property values we defined above. Make sure that + * the get_property functions covers all properties above. + */ + xdata->batt_desc.get_property = battery_get_property; + + + /* Advanced power management emulation */ + xdata->batt_desc.use_for_apm = 0; + + /* Register power supply for our gamepad device */ + xdata->batt = devm_power_supply_register(&hdev->dev, + &xdata->batt_desc, &ps_config); + if (IS_ERR(xdata->batt)) { + ret = PTR_ERR(xdata->batt); + hid_err(hdev, "Unable to register battery device\n"); + goto err_free; + } else { + hid_dbg_lvl(DBG_LVL_SOME, hdev, "battery registered\n"); + } + + power_supply_powers(xdata->batt, &hdev->dev); + +err_free: + kfree(xdata->batt_desc.name); + xdata->batt_desc.name = NULL; + + return ret; +} + + +enum mapping_behaviour { + MAP_IGNORE, /* Completely ignore this field */ + MAP_AUTO, /* Do not really map it, let hid-core decide */ + MAP_STATIC /* Map to the values given */ +}; + +struct input_ev { + /* Map to which input event (EV_KEY, EV_ABS, ...)? */ + u8 event_type; + /* Map to which input code (BTN_A, ABS_X, ...)? */ + u16 input_code; +}; + +u8 map_hid_to_input_windows(struct hid_usage *usage, struct input_ev *map_to) +{ + + /* + * Windows report-descriptor (307 byte): + * + * 05 01 09 05 a1 01 85 01 09 01 a1 00 09 30 09 31 15 00 27 ff + * ff 00 00 95 02 75 10 81 02 c0 09 01 a1 00 09 33 09 34 15 00 + * 27 ff ff 00 00 95 02 75 10 81 02 c0 05 01 09 32 15 00 26 ff + * 03 95 01 75 0a 81 02 15 00 25 00 75 06 95 01 81 03 05 01 09 + * 35 15 00 26 ff 03 95 01 75 0a 81 02 15 00 25 00 75 06 95 01 + * 81 03 05 01 09 39 15 01 25 08 35 00 46 3b 01 66 14 00 75 04 + * 95 01 81 42 75 04 95 01 15 00 25 00 35 00 45 00 65 00 81 03 + * 05 09 19 01 29 0a 15 00 25 01 75 01 95 0a 81 02 15 00 25 00 + * 75 06 95 01 81 03 05 01 09 80 85 02 a1 00 09 85 15 00 25 01 + * 95 01 75 01 81 02 15 00 25 00 75 07 95 01 81 03 c0 05 0f 09 + * 21 85 03 a1 02 09 97 15 00 25 01 75 04 95 01 91 02 15 00 25 + * 00 75 04 95 01 91 03 09 70 15 00 25 64 75 08 95 04 91 02 09 + * 50 66 01 10 55 0e 15 00 26 ff 00 75 08 95 01 91 02 09 a7 15 + * 00 26 ff 00 75 08 95 01 91 02 65 00 55 00 09 7c 15 00 26 ff + * 00 75 08 95 01 91 02 c0 85 04 05 06 09 20 15 00 26 ff 00 75 + * 08 95 01 81 02 c0 00 + */ + + unsigned int hid_usage = usage->hid & HID_USAGE; + unsigned int hid_usage_page = usage->hid & HID_USAGE_PAGE; + + switch (hid_usage_page) { + case HID_UP_BUTTON: + switch (hid_usage) { + case 0x01: + *map_to = (struct input_ev){EV_KEY, BTN_A}; + return MAP_STATIC; + case 0x02: + *map_to = (struct input_ev){EV_KEY, BTN_B}; + return MAP_STATIC; + case 0x03: + *map_to = (struct input_ev){EV_KEY, BTN_X}; + return MAP_STATIC; + case 0x04: + *map_to = (struct input_ev){EV_KEY, BTN_Y}; + return MAP_STATIC; + case 0x05: + *map_to = (struct input_ev){EV_KEY, BTN_TL}; + return MAP_STATIC; + case 0x06: + *map_to = (struct input_ev){EV_KEY, BTN_TR}; + return MAP_STATIC; + case 0x07: + *map_to = (struct input_ev){EV_KEY, BTN_SELECT}; + return MAP_STATIC; + case 0x08: + *map_to = (struct input_ev){EV_KEY, BTN_START}; + return MAP_STATIC; + case 0x09: + *map_to = (struct input_ev){EV_KEY, BTN_THUMBL}; + return MAP_STATIC; + case 0x0A: + *map_to = (struct input_ev){EV_KEY, BTN_THUMBR}; + return MAP_STATIC; + } + case HID_UP_GENDESK: + switch (hid_usage) { + case 0x30: + *map_to = (struct input_ev){EV_ABS, ABS_X}; + return MAP_STATIC; + case 0x31: + *map_to = (struct input_ev){EV_ABS, ABS_Y}; + return MAP_STATIC; + case 0x32: + *map_to = (struct input_ev){EV_ABS, ABS_Z}; + return MAP_STATIC; + case 0x33: + *map_to = (struct input_ev){EV_ABS, ABS_RX}; + return MAP_STATIC; + case 0x34: + *map_to = (struct input_ev){EV_ABS, ABS_RY}; + return MAP_STATIC; + case 0x35: + *map_to = (struct input_ev){EV_ABS, ABS_RZ}; + return MAP_STATIC; + case 0x39: + *map_to = (struct input_ev){0, 0}; + return MAP_AUTO; + case 0x85: + *map_to = (struct input_ev){EV_KEY, BTN_MODE}; + return MAP_STATIC; + } + } + + return MAP_IGNORE; +} + +u8 map_hid_to_input_linux(struct hid_usage *usage, struct input_ev *map_to) +{ + + /* + * Linux report-descriptor (335 byte): + * + * 05 01 09 05 a1 01 85 01 09 01 a1 00 09 30 09 31 15 00 27 ff + * ff 00 00 95 02 75 10 81 02 c0 09 01 a1 00 09 32 09 35 15 00 + * 27 ff ff 00 00 95 02 75 10 81 02 c0 05 02 09 c5 15 00 26 ff + * 03 95 01 75 0a 81 02 15 00 25 00 75 06 95 01 81 03 05 02 09 + * c4 15 00 26 ff 03 95 01 75 0a 81 02 15 00 25 00 75 06 95 01 + * 81 03 05 01 09 39 15 01 25 08 35 00 46 3b 01 66 14 00 75 04 + * 95 01 81 42 75 04 95 01 15 00 25 00 35 00 45 00 65 00 81 03 + * 05 09 19 01 29 0f 15 00 25 01 75 01 95 0f 81 02 15 00 25 00 + * 75 01 95 01 81 03 05 0c 0a 24 02 15 00 25 01 95 01 75 01 81 + * 02 15 00 25 00 75 07 95 01 81 03 05 0c 09 01 85 02 a1 01 05 + * 0c 0a 23 02 15 00 25 01 95 01 75 01 81 02 15 00 25 00 75 07 + * 95 01 81 03 c0 05 0f 09 21 85 03 a1 02 09 97 15 00 25 01 75 + * 04 95 01 91 02 15 00 25 00 75 04 95 01 91 03 09 70 15 00 25 + * 64 75 08 95 04 91 02 09 50 66 01 10 55 0e 15 00 26 ff 00 75 + * 08 95 01 91 02 09 a7 15 00 26 ff 00 75 08 95 01 91 02 65 00 + * 55 00 09 7c 15 00 26 ff 00 75 08 95 01 91 02 c0 85 04 05 06 + * 09 20 15 00 26 ff 00 75 08 95 01 81 02 c0 00 + */ + + unsigned int hid_usage = usage->hid & HID_USAGE; + unsigned int hid_usage_page = usage->hid & HID_USAGE_PAGE; + + switch (hid_usage_page) { + case HID_UP_BUTTON: + switch (hid_usage) { + case 0x01: + *map_to = (struct input_ev){EV_KEY, BTN_A}; + return MAP_STATIC; + case 0x02: + *map_to = (struct input_ev){EV_KEY, BTN_B}; + return MAP_STATIC; + case 0x04: + *map_to = (struct input_ev){EV_KEY, BTN_X}; + return MAP_STATIC; + case 0x05: + *map_to = (struct input_ev){EV_KEY, BTN_Y}; + return MAP_STATIC; + case 0x07: + *map_to = (struct input_ev){EV_KEY, BTN_TL}; + return MAP_STATIC; + case 0x08: + *map_to = (struct input_ev){EV_KEY, BTN_TR}; + return MAP_STATIC; + case 0x0C: + *map_to = (struct input_ev){EV_KEY, BTN_START}; + return MAP_STATIC; + case 0x0E: + *map_to = (struct input_ev){EV_KEY, BTN_THUMBL}; + return MAP_STATIC; + case 0x0F: + *map_to = (struct input_ev){EV_KEY, BTN_THUMBR}; + return MAP_STATIC; + } + case HID_UP_CONSUMER: + switch (hid_usage) { + case 0x223: + *map_to = (struct input_ev){EV_KEY, BTN_MODE}; + return MAP_STATIC; + case 0x224: + *map_to = (struct input_ev){EV_KEY, BTN_SELECT}; + return MAP_STATIC; + } + case HID_UP_GENDESK: + switch (hid_usage) { + case 0x30: + *map_to = (struct input_ev){EV_ABS, ABS_X}; + return MAP_STATIC; + case 0x31: + *map_to = (struct input_ev){EV_ABS, ABS_Y}; + return MAP_STATIC; + case 0x32: + *map_to = (struct input_ev){EV_ABS, ABS_RX}; + return MAP_STATIC; + case 0x35: + *map_to = (struct input_ev){EV_ABS, ABS_RY}; + return MAP_STATIC; + case 0x39: + *map_to = (struct input_ev){0, 0}; + return MAP_AUTO; + } + case HID_UP_SIMULATION: + switch (hid_usage) { + case 0xC4: + *map_to = (struct input_ev){EV_ABS, ABS_RZ}; + return MAP_STATIC; + case 0xC5: + *map_to = (struct input_ev){EV_ABS, ABS_Z}; + return MAP_STATIC; + } + } + + return MAP_IGNORE; +} + + +/* + * Input Mapping Hook + * + * Invoked at input registering before mapping an usage + * (called once for every hid-usage). + */ + +static int xpadneo_mapping(struct hid_device *hdev, struct hid_input *hi, + struct hid_field *field, struct hid_usage *usage, + unsigned long **bit, int *max) +{ + /* Return values */ + enum { + RET_MAP_IGNORE = -1, /* completely ignore this input */ + RET_MAP_AUTO, /* let hid-core autodetect the mapping */ + RET_MAP_STATIC /* mapped by hand, no further processing */ + }; + + struct input_ev map_to; + u8 (*perform_mapping)(struct hid_usage *usage, struct input_ev *map_to); + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + + + switch (xdata->report_descriptor) { + case LINUX: + perform_mapping = map_hid_to_input_linux; + break; + case WINDOWS: + perform_mapping = map_hid_to_input_windows; + break; + default: + return RET_MAP_AUTO; + } + + + switch (perform_mapping(usage, &map_to)) { + case MAP_AUTO: + hid_dbg_lvl(DBG_LVL_FEW, hdev, + "UP: 0x%04X, USG: 0x%04X -> automatically\n", + usage->hid & HID_USAGE_PAGE, usage->hid & HID_USAGE); + + return RET_MAP_AUTO; + + case MAP_IGNORE: + hid_dbg_lvl(DBG_LVL_FEW, hdev, + "UP: 0x%04X, USG: 0x%04X -> ignored\n", + usage->hid & HID_USAGE_PAGE, usage->hid & HID_USAGE); + + return RET_MAP_IGNORE; + + case MAP_STATIC: + hid_dbg_lvl(DBG_LVL_FEW, hdev, + "UP: 0x%04X, USG: 0x%04X -> EV: 0x%03X, INP: 0x%03X\n", + usage->hid & HID_USAGE_PAGE, usage->hid & HID_USAGE, + map_to.event_type, map_to.input_code); + + hid_map_usage_clear(hi, usage, bit, max, + map_to.event_type, map_to.input_code); + return RET_MAP_STATIC; + + } + + /* Something went wrong, ignore this field */ + return RET_MAP_IGNORE; +} + + +/* + * Report Descriptor Fixup Hook + * + * You can either modify the original report in place and just + * return the original start address (rdesc) or you reserve a new + * one and return a pointer to it. In the latter, you mostly have to + * modify the rsize value too. + */ + +static u8 *xpadneo_report_fixup(struct hid_device *hdev, u8 *rdesc, + unsigned int *rsize) +{ + hid_dbg_lvl(DBG_LVL_SOME, hdev, "REPORT (DESCRIPTOR) FIXUP HOOK\n"); + dbg_hex_dump_lvl(DBG_LVL_FEW, "xpadneo: report-descr: ", rdesc, *rsize); + + return rdesc; +} + + +static void parse_raw_event_battery(struct hid_device *hdev, u8 *data, + int reportsize) +{ + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + unsigned long flags; + u8 capacity_level, present, online, status; + + + /* msb ID 04 lsb + * +---+---+---+---+---+---+---+---+ + * | O | R | E | C | M | M | L | L | + * +---+---+---+---+---+---+---+---+ + * + * O: Online + * R: Reserved / Unused + * E: Error (?) / Unknown + * C: Charging, I mean really charging the battery (P 'n C) + * not (only) the power cord powering the controller + * M M: Mode + * 00: Powered by USB + * 01: Powered by (disposable) batteries + * 10: Powered by Play 'n Charge battery pack (only, no cable) + * L L: Capacity Level + * 00: (Super) Critical + * 01: Low + * 10: Medium + * 11: Full + */ + + + /* I think "online" means whether the dev is online or shutting down */ + online = (data[1] & 0x80) >> 7; + + /* The _battery_ is only present if not powered by USB */ + present = ((data[1] & 0x0C) != 0x00); + + /* Capacity level, only valid as long as the battery is present */ + switch (data[1] & 0x03) { + case 0x00: + capacity_level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL; + break; + case 0x01: + capacity_level = POWER_SUPPLY_CAPACITY_LEVEL_LOW; + break; + case 0x02: + capacity_level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL; + break; + case 0x03: + capacity_level = POWER_SUPPLY_CAPACITY_LEVEL_HIGH; + break; + } + + /* Is the (Play 'n Charge) battery charging right now? */ + switch ((data[1] & 0x10) >> 4) { + case 0: + status = POWER_SUPPLY_STATUS_DISCHARGING; + break; + case 1: + status = POWER_SUPPLY_STATUS_CHARGING; + break; + } + + spin_lock_irqsave(&xdata->lock, flags); + xdata->ps_status = status; + xdata->ps_capacity_level = capacity_level; + xdata->ps_online = online; + xdata->ps_present = present; + spin_unlock_irqrestore(&xdata->lock, flags); + + power_supply_changed(xdata->batt); +} + +static void check_report_behaviour(struct hid_device *hdev, u8 *data, + int reportsize) +{ + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + + /* + * The length of the first input report with an ID of 0x01 + * reveals which report-type the controller is actually + * sending (windows: 16, or linux: 17). + */ + if (xdata->report_behaviour == UNKNOWN) { + switch (reportsize) { + case 16: + xdata->report_behaviour = WINDOWS; + break; + case 17: + xdata->report_behaviour = LINUX; + break; + default: + xdata->report_behaviour = UNKNOWN; + break; + } + } + + hid_dbg_lvl(DBG_LVL_SOME, hdev, "desc: %s, beh: %s\n", + report_type_text[xdata->report_descriptor], + report_type_text[xdata->report_behaviour]); + + /* TODO: + * Maybe the best solution would be to replace the report descriptor + * in case that the wrong reports are sent. Unfortunately we do not + * know if the report descriptor is the right one until the first + * report is sent to us. At this time, the report_fixup hook is + * already over and the original descriptor is parsed into hdev + * i.e. report_enum and collection. + * + * The next best solution would be to replace the report with + * ID 0x01 with the right one in report_enum (and collection?). + * I don't know yet how this would works, perhaps like this: + * - create a new report struct + * - fill it by hand + * - add all neccessary fields (automatic way?) + * + * Another way to fix it is: + * - Register another report with a _new_ ID by hand + * (unfortunately we cannot use the same id again) + * - in raw_event: change the ID from 0x01 to the new one if + * necessary. leave it if not. + * + * What we currently do is: + * We examine every report and fire the input events by hand. + * That's not very generic. + * + */ + + + // TODO: + // * remove old report using list operations + // * create new one like they do in hid_register_report + // * add it to output_reports->report_list and array + +} + +/* + * HID Raw Event Hook + */ + +int xpadneo_raw_event(struct hid_device *hdev, struct hid_report *report, + u8 *data, int reportsize) +{ + /* Return Codes */ + enum { + RAWEV_CONT_PROCESSING, /* Let the hid-core autodetect the event */ + RAWEV_STOP_PROCESSING /* Stop further processing */ + }; + + //hid_dbg_lvl(DBG_LVL_SOME, hdev, "RAW EVENT HOOK\n"); + + dbg_hex_dump_lvl(DBG_LVL_SOME, "xpadneo: raw_event: ", data, reportsize); + //hid_dbg_lvl(DBG_LVL_ALL, hdev, "report->size: %d\n", (report->size)/8); + //hid_dbg_lvl(DBG_LVL_ALL, hdev, "data size (wo id): %d\n", reportsize-1); + + + switch (report->id) { + case 01: + check_report_behaviour(hdev, data, reportsize); + break; + case 04: + parse_raw_event_battery(hdev, data, reportsize); + return RAWEV_STOP_PROCESSING; + } + + /* Continue processing */ + return RAWEV_CONT_PROCESSING; +} + + +void xpadneo_report(struct hid_device *hdev, struct hid_report *report) +{ + hid_dbg_lvl(DBG_LVL_SOME, hdev, "REPORT HOOK\n"); +} + + +/* + * Input Configured Hook + * + * We have to fix up the key-bitmap, because there is + * no DPAD_UP, _RIGHT, _DOWN, _LEFT on the device by default + * + */ + +static int xpadneo_input_configured(struct hid_device *hdev, + struct hid_input *hi) +{ + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + + /* set a pointer to the logical input device at the device structure */ + xdata->idev = hi->input; + + hid_dbg_lvl(DBG_LVL_SOME, hdev, "INPUT CONFIGURED HOOK\n"); + + if (param_fake_dev_version) { + xdata->idev->id.version = (u16) param_fake_dev_version; + hid_dbg_lvl(DBG_LVL_FEW, hdev, "Fake device version: 0x%04X\n", + param_fake_dev_version); + } + + + // The HID device descriptor defines a range from 0 to 65535 for all + // absolute axis (like ABS_X), this is in contrary to what the linux + // gamepad specification defines [–32.768; 32.767]. + // Therefore, we have to set the min, max, fuzz and flat values by hand: + + input_set_abs_params(xdata->idev, ABS_X, -32768, 32767, 255, 4095); + input_set_abs_params(xdata->idev, ABS_Y, -32768, 32767, 255, 4095); + + input_set_abs_params(xdata->idev, ABS_RX, -32768, 32767, 255, 4095); + input_set_abs_params(xdata->idev, ABS_RY, -32768, 32767, 255, 4095); + + if (param_combined_z_axis) + input_set_abs_params(xdata->idev, ABS_Z, -1024, 1023, 3, 63); + + // furthermore, we need to translate the incoming events to fit within + // the new range, we will do that in the xpadneo_event() hook. + + // We remove the ABS_RZ event if param_combined_z_axis is enabled + if (param_combined_z_axis) { + __clear_bit(ABS_RZ, xdata->idev->absbit); + } + + return 0; +} + + +/* + * Event Hook + * + * This hook is called whenever an event occurs that is listed on + * xpadneo_driver.usage_table (which is NULL in our case, therefore it is + * invoked on every event). + * + * Before we can send additional input events, we have to enable + * the corresponding keys in xpadneo_input_configured. + */ + +int xpadneo_event(struct hid_device *hdev, struct hid_field *field, + struct hid_usage *usage, __s32 value) +{ + /* Return Codes */ + enum { + EV_CONT_PROCESSING, /* Let the hid-core autodetect the event */ + EV_STOP_PROCESSING /* Stop further processing */ + }; + + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + struct input_dev *idev = xdata->idev; + + u16 usg_type = usage->type; + u16 usg_code = usage->code; + + + hid_dbg_lvl(DBG_LVL_ALL, hdev, + "hid-up: %02x, hid-usg: %02x, input-code: %02x, value: %02x\n", + (usage->hid & HID_USAGE_PAGE), (usage->hid & HID_USAGE), + usage->code, value); + + + // we have to shift the range of the analogues sticks (ABS_X/Y/RX/RY) + // as already explained in xpadneo_input_configured() above + // furthermore we need to combine ABS_Z and ABS_RZ if param_combined_z_axis + // is set + + if (usg_type == EV_ABS) { + if (usg_code == ABS_X || usg_code == ABS_Y + || usg_code == ABS_RX || usg_code == ABS_RY) { + hid_dbg_lvl(DBG_LVL_ALL, hdev, "shifted axis %02x, old value: %i, new value: %i\n", usg_code, value, value - 32768); + input_report_abs(idev, usg_code, value - 32768); + goto sync_and_stop_processing; + } + + if (param_combined_z_axis) { + if (usg_code == ABS_Z || usg_code == ABS_RZ) { + if (usg_code == ABS_Z) + xdata->last_abs_z = value; + if (usg_code == ABS_RZ) + xdata->last_abs_rz = value; + + input_report_abs(idev, ABS_Z, 0 - xdata->last_abs_z + xdata->last_abs_rz); + goto sync_and_stop_processing; + } + } + } + + + + + /* TODO: + * This is a workaround for the wrong report (Windows report but + * Linux descriptor). We would prefer to fixup the descriptor, but we + * cannot fix it anymore at the time we recognize the wrong behaviour, + * hence we will fire the input events by hand. + */ + + if (xdata->report_behaviour == WINDOWS + && xdata->report_descriptor == LINUX) { + + /* + * we fix all buttons by hand. You may think that we + * could do that by using the windows_map too, but it is more + * like an coincidence that this would work in this case: + * It would only, because HID_UP_BUTTONS has no special names + * for the HID_USAGE's, therefore the first button stays 0x01 + * on both reports (windows and linux) - it is a 1: 1 mapping. + * But this is not true in general (i.e. for other USAGE_PAGES) + */ + + if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) { + switch (usage->hid & HID_USAGE) { + case 0x01: + input_report_key(idev, BTN_A, value); + break; + case 0x02: + input_report_key(idev, BTN_B, value); + break; + case 0x03: + input_report_key(idev, BTN_X, value); + break; + case 0x04: + input_report_key(idev, BTN_Y, value); + break; + case 0x05: + input_report_key(idev, BTN_TL, value); + break; + case 0x06: + input_report_key(idev, BTN_TR, value); + break; + case 0x07: + input_report_key(idev, BTN_SELECT, value); + break; + case 0x08: + input_report_key(idev, BTN_START, value); + break; + case 0x09: + input_report_key(idev, BTN_THUMBL, value); + break; + case 0x0A: + input_report_key(idev, BTN_THUMBR, value); + break; + } + + hid_dbg_lvl(DBG_LVL_ALL, hdev, + "hid-upage: %02x, hid-usage: %02x fixed\n", + (usage->hid & HID_USAGE_PAGE), + (usage->hid & HID_USAGE)); + + goto sync_and_stop_processing; + } + } + + return EV_CONT_PROCESSING; + +sync_and_stop_processing: + input_sync(idev); + return EV_STOP_PROCESSING; + +} + + +/* Device Probe and Remove Hook */ + +static int xpadneo_probe_device(struct hid_device *hdev, + const struct hid_device_id *id) +{ + int ret; + struct xpadneo_devdata *xdata; + + hid_dbg_lvl(DBG_LVL_FEW, hdev, "probing device: %s\n", hdev->name); + + + /* + * Create a per-device data structure which is "nearly globally" accessible + * through hid_get_drvdata. The structure is freed automatically + * as soon as hdev->dev (the device) is removed, since we use the devm_ + * derivate. + */ + xdata = devm_kzalloc(&hdev->dev, sizeof(*xdata), GFP_KERNEL); + if (xdata == NULL) + return -ENOMEM; + + xdata->id = ida_simple_get(&xpadneo_device_id_allocator, + 0, 0, GFP_KERNEL); + + xdata->hdev = hdev; + + /* Unknown until first report with ID 01 arrives (see raw_event) */ + xdata->report_behaviour = UNKNOWN; + + switch (hdev->dev_rsize) { + case 307: + xdata->report_descriptor = WINDOWS; + break; + case 335: + xdata->report_descriptor = LINUX; + break; + default: + xdata->report_descriptor = UNKNOWN; + break; + } + + hid_set_drvdata(hdev, xdata); + + + /* Parse the raw report (includes a call to report_fixup) */ + ret = hid_parse(hdev); + if (ret) { + hid_err(hdev, "parse failed\n"); + goto return_error; + } + + /* Debug Output*/ + hid_dbg_lvl(DBG_LVL_FEW, hdev, "driver:\n"); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* version: %s\n", DRV_VER); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "hdev:\n"); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* raw rdesc: (unfixed, see above)\n"); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* raw rsize: %u\n", hdev->dev_rsize); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* bus: 0x%04X\n", hdev->bus); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* report group: %u\n", hdev->group); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* vendor: 0x%08X\n", hdev->vendor); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* version: 0x%08X\n", hdev->version); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* product: 0x%08X\n", hdev->product); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* country: %u\n", hdev->country); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* driverdata: %lu\n", id->driver_data); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* serial: %pMR\n", hdev->uniq); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* physical location: %pMR\n", hdev->phys); + + /* We start our hardware without FF, we will add it afterwards by hand + * HID_CONNECT_DEFAULT = (HID_CONNECT_HIDINPUT | HID_CONNECT_HIDRAW + * | HID_CONNECT_HIDDEV | HID_CONNECT_FF) + * Our Input Device is created automatically since we defined + * HID_CONNECT_HIDINPUT as one of the flags. + */ + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT & ~HID_CONNECT_FF); + if (ret) { + hid_err(hdev, "hw start failed\n"); + goto return_error; + } + + /* Call the device initialization routines */ + ret = xpadneo_initDevice(hdev); + if (ret) { + hid_err(hdev, "device initialization failed\n"); + goto return_error; + } + + ret = xpadneo_initBatt(hdev); + if (ret) { + hid_err(hdev, "battery initialization failed\n"); + goto return_error; + } + + + /* Everything is fine */ + return 0; + +return_error: + return ret; +} + + +static void xpadneo_remove_device(struct hid_device *hdev) +{ + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + + hid_hw_close(hdev); + + /* Cleaning up here */ + ida_simple_remove(&xpadneo_device_id_allocator, xdata->id); + + hid_hw_stop(hdev); + + hid_dbg_lvl(DBG_LVL_FEW, hdev, "Goodbye %s!\n", hdev->name); +} + + + +/* + * Device ID Structure, define all supported devices here + */ + +static const struct hid_device_id xpadneo_devices[] = { + + /* + * The ProductID is somehow related to the Firmware Version, + * but it somehow changed back from 0x02FD (newer fw) to 0x02E0 (older) + * and vice versa on one controller here. + * + * Unfortunately you cannot tell from product id how the gamepad really + * behaves on reports, since the newer firmware supports both mappings + * (the one which is standard in linux and the old one, which is still + * used in windows). + */ + + /* XBOX ONE S / X */ + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, 0x02FD) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, 0x02E0) }, + /* SENTINEL VALUE, indicates the end*/ + { } +}; + +static struct hid_driver xpadneo_driver = { + /* The name of the driver */ + .name = "xpadneo", + + /* Which devices is this driver for */ + .id_table = xpadneo_devices, + + /* Hooked as the input device is configured (before it is registered) + * we need that because we do not configure the input-device ourself + * but leave it up to hid_hw_start() + */ + .input_configured = xpadneo_input_configured, + + /* Invoked on input registering before mapping an usage */ + .input_mapping = xpadneo_mapping, + + /* If usage in usage_table, this hook is called */ + .event = xpadneo_event, + + /* Called before report descriptor parsing (NULL means nop) */ + .report_fixup = xpadneo_report_fixup, + + /* Called when a new device is inserted */ + .probe = xpadneo_probe_device, + + /* Called when a device is removed */ + .remove = xpadneo_remove_device, + + /* If report in report_table, this hook is called */ + .raw_event = xpadneo_raw_event, + + .report = xpadneo_report +}; + +MODULE_DEVICE_TABLE(hid, xpadneo_devices); + + + +/* + * Module Init and Exit + * + * We may replace init and remove by module_hid_driver(xpadneo_driver) + * in future versions, as long as there is nothing special in these two + * functions (but registering and unregistering the driver). Up to now it is + * more useful for us to not "oversimplify" the whole driver-registering thing. + * + * Caution: do not use both! (module_hid_driver and hid_(un)register_driver) + */ + +static int __init xpadneo_initModule(void) +{ + pr_info("%s: hello there!\n", xpadneo_driver.name); + + return hid_register_driver(&xpadneo_driver); +} + +static void __exit xpadneo_exitModule(void) +{ + hid_unregister_driver(&xpadneo_driver); + + ida_destroy(&xpadneo_device_id_allocator); + + pr_info("%s: goodbye!\n", xpadneo_driver.name); +} + +/* + * Tell the driver system which functions to call at initialization and + * removal of the module + */ +module_init(xpadneo_initModule); +module_exit(xpadneo_exitModule); -- 2.17.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/linux-10-add-compatibility-macro-for-input_event_sec.patch ================================================ just define from https://github.com/torvalds/linux/commit/152194fe9c3f03232b9c0d0264793a7fa4af82f8 --- a/include/uapi/linux/input.h 2022-08-05 19:02:56.906792582 +0200 +++ b/include/uapi/linux/input.h 2022-08-05 19:03:30.788834870 +0200 @@ -24,6 +24,8 @@ struct input_event { struct timeval time; +#define input_event_sec time.tv_sec +#define input_event_usec time.tv_usec __u16 type; __u16 code; __s32 value; ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/linux-netlink-fix_add-variables-needed-for-iwd-package.patch ================================================ From 617fa738d27dddecaaee795a5ce3b19b73d013ea Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Wed, 24 May 2023 12:59:57 +0200 Subject: [PATCH] netlink: add variables needed for 'iwd' package --- include/uapi/linux/netlink.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/include/uapi/linux/netlink.h b/include/uapi/linux/netlink.h index b5b4fd791fc8..12ba27180dbf 100644 --- a/include/uapi/linux/netlink.h +++ b/include/uapi/linux/netlink.h @@ -68,6 +68,10 @@ struct nlmsghdr { #define NLM_F_CREATE 0x400 /* Create, if it does not exist */ #define NLM_F_APPEND 0x800 /* Add to end of list */ +/* ACK message flags. */ +#define NLM_F_CAPPED 0x100 +#define NLM_F_ACK_TLVS 0x200 + /* 4.4BSD ADD NLM_F_CREATE|NLM_F_EXCL 4.4BSD CHANGE NLM_F_REPLACE @@ -102,6 +106,28 @@ struct nlmsgerr { struct nlmsghdr msg; }; +/** + * enum nlmsgerr_attrs - nlmsgerr attributes + * @NLMSGERR_ATTR_UNUSED: unused + * @NLMSGERR_ATTR_MSG: error message string (string) + * @NLMSGERR_ATTR_OFFS: offset of the invalid attribute in the original + * message, counting from the beginning of the header (u32) + * @NLMSGERR_ATTR_COOKIE: arbitrary subsystem specific cookie to + * be used - in the success case - to identify a created + * object or operation or similar (binary) + * @__NLMSGERR_ATTR_MAX: number of attributes + * @NLMSGERR_ATTR_MAX: highest attribute number + */ +enum nlmsgerr_attrs { + NLMSGERR_ATTR_UNUSED, + NLMSGERR_ATTR_MSG, + NLMSGERR_ATTR_OFFS, + NLMSGERR_ATTR_COOKIE, + + __NLMSGERR_ATTR_MAX, + NLMSGERR_ATTR_MAX = __NLMSGERR_ATTR_MAX - 1 +}; + #define NETLINK_ADD_MEMBERSHIP 1 #define NETLINK_DROP_MEMBERSHIP 2 #define NETLINK_PKTINFO 3 @@ -114,6 +140,7 @@ struct nlmsgerr { #define NETLINK_LISTEN_ALL_NSID 8 #define NETLINK_LIST_MEMBERSHIPS 9 #define NETLINK_CAP_ACK 10 +#define NETLINK_EXT_ACK 11 struct nl_pktinfo { __u32 group; -- 2.40.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/linux-temp-02-fo_on_source.patch ================================================ diff --git a/drivers/amlogic/media/enhancement/amvecm/amcsc.c b/drivers/amlogic/media/enhancement/amvecm/amcsc.c index ac9a91d9fa8c..6e32156a51d6 100644 --- a/drivers/amlogic/media/enhancement/amvecm/amcsc.c +++ b/drivers/amlogic/media/enhancement/amvecm/amcsc.c @@ -3836,8 +3836,7 @@ uint32_t sink_hdr_support(const struct vinfo_s *vinfo) /* when policy == follow sink(0) or force output (2) */ /* use force_output */ - if ((get_force_output() != 0) - && (get_hdr_policy() != 1)) { + if ((get_force_output() != 0)) { switch (get_force_output()) { case BT709: break; ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/linux/linux-uapi-fix_linux-if.h-userspace-compilation-errors.patch ================================================ From 2618be7dccf8739b89e1906b64bd8d551af351e6 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" <ldv@altlinux.org> Date: Mon, 20 Feb 2017 14:58:41 +0300 Subject: [PATCH] uapi: fix linux/if.h userspace compilation errors Include <sys/socket.h> (guarded by ifndef __KERNEL__) to fix the following linux/if.h userspace compilation errors: /usr/include/linux/if.h:234:19: error: field 'ifru_addr' has incomplete type struct sockaddr ifru_addr; /usr/include/linux/if.h:235:19: error: field 'ifru_dstaddr' has incomplete type struct sockaddr ifru_dstaddr; /usr/include/linux/if.h:236:19: error: field 'ifru_broadaddr' has incomplete type struct sockaddr ifru_broadaddr; /usr/include/linux/if.h:237:19: error: field 'ifru_netmask' has incomplete type struct sockaddr ifru_netmask; /usr/include/linux/if.h:238:20: error: field 'ifru_hwaddr' has incomplete type struct sockaddr ifru_hwaddr; This also fixes userspace compilation of the following uapi headers: linux/atmbr2684.h linux/gsmmux.h linux/if_arp.h linux/if_bonding.h linux/if_frad.h linux/if_pppox.h linux/if_tunnel.h linux/netdevice.h linux/route.h linux/wireless.h As no uapi header provides a definition of struct sockaddr, inclusion of <sys/socket.h> seems to be the most conservative and the only safe fix available. All current users of <linux/if.h> are very likely to be including <sys/socket.h> already because the latter is the sole provider of struct sockaddr definition in libc, so adding a uapi header with a definition of struct sockaddr would create a potential conflict with <sys/socket.h>. Replacing struct sockaddr in the definition of struct ifreq with a different type would create a potential incompatibility with current users of struct ifreq who might rely on ifru_addr et al members being of type struct sockaddr. Signed-off-by: Dmitry V. Levin <ldv@altlinux.org> Signed-off-by: David S. Miller <davem@davemloft.net> --- include/uapi/linux/if.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h index 1158a043342ac6..259617a551f251 100644 --- a/include/uapi/linux/if.h +++ b/include/uapi/linux/if.h @@ -24,6 +24,10 @@ #include <linux/socket.h> /* for "struct sockaddr" et al */ #include <linux/compiler.h> /* for "__user" et al */ +#ifndef __KERNEL__ +#include <sys/socket.h> /* for struct sockaddr. */ +#endif + #if __UAPI_DEF_IF_IFNAMSIZ #define IFNAMSIZ 16 #endif /* __UAPI_DEF_IF_IFNAMSIZ */ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-ng-dv/patches/systemd/systemd-ignore-sdcardfs-from-linux.patch ================================================ ignore sdcardfs from Android Linux --- a/src/basic/check-filesystems.sh 2022-02-01 21:47:06.181142404 +0100 +++ b/src/basic/check-filesystems.sh 2022-02-01 21:45:58.760989671 +0100 @@ -23,7 +23,8 @@ for fs in $($cpp -dM $includes - </dev/n # STACK_END_MAGIC doesn't refer to a filesystem # mtd_inode was removed in 2015 # futexfs was removed in 2018 - if [[ "$fs" =~ ^(STACK_END_MAGIC|MTD_INODE_FS_MAGIC|FUTEXFS_SUPER_MAGIC)$ ]]; then + # sdcardfs is Android fs + if [[ "$fs" =~ ^(STACK_END_MAGIC|MTD_INODE_FS_MAGIC|FUTEXFS_SUPER_MAGIC|SDCARDFS_SUPER_MAGIC)$ ]]; then continue fi echo "Filesystem found in kernel header but not in $(basename "$filesystems_gperf"): $fs"; ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/Alta_boot.ini ================================================ ALTA-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootlabel "CoreELEC" setenv remotewakeup "0xe31cdf00" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv rootopt "BOOT_IMAGE=kernel.img boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" setenv dtb_mem_addr 0x1000000 setenv uenv_addr 0x13000000 setenv loadaddr 0x02000000 if load mmc ${mmc_dev}:1 ${uenv_addr} resolution.ini; then env import -t ${uenv_addr} $filesize; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if load mmc ${mmc_dev}:1 ${uenv_addr} config.ini; then env import -t ${uenv_addr} $filesize; fi if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi setenv irsetup "remotewakeup=${remotewakeup} decode_type=${decode_type} remotewakeupmask=${remotewakeupmask}" if test "${kernel_hdmimode}" != ""; then setenv vout "${kernel_hdmimode}"; fi if test "${usbpower}" != ""; then setenv usbpower "enable_system_power=${usbpower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a73}" != ""; then setenv max_freq_a73 "max_freq_a73=${max_freq_a73}"; fi if test "${keymap}" != ""; then setenv keymap "keymap=${keymap}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi setenv displayopt "vout=${vout},dis frac_rate_policy=${frac_rate_policy} hdmitx=${hdmitx} hdr_policy=1 hdr_priority=0" setenv initargs "${rootopt} ${consoleopt} ${keymap} ${max_freq_a53} ${max_freq_a73} ${wol} ${cec} ${gpiopower} ${irsetup} ${usbpower} ${usbopts}" setenv bootargs "${bootargs} ${initargs} ${displayopt} ${coreelec}" load mmc ${mmc_dev}:1 ${loadaddr} kernel.img load mmc ${mmc_dev}:1 ${dtb_mem_addr} dtb.img bootm ${loadaddr} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/Khadas_VIM1S_boot.ini ================================================ KHADAS-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootlabel "CoreELEC" setenv remotewakeup "0xeb14ff00" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" # set device type: mmc (SD, eMMC) or usb (USB) setenv device ${devtype} # set mmc/usb device number # u-boot SD 0, linux 1 # eMMC 1, linux 0 # eMMC-USB 0 or 1 setenv mmc_dev ${devnum} # set linux device for eMMC and SD, seems boot device is always same for 5.15.137 setenv linux_dev "mmcblk0p" if test "${devtype}" = "usb"; then setenv linux_dev "sda"; fi # setenv rootopt "boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" # to have same image on SD, eMMC or USB and still mount correct device from linux use partitions directly setenv rootopt "boot=/dev/${linux_dev}1 disk=/dev/${linux_dev}2" if fatload ${device} ${mmc_dev}:1 ${loadaddr} resolution.ini; then env import -t ${loadaddr} ${filesize}; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if fatload ${device} ${mmc_dev}:1 ${loadaddr} config.ini; then env import -t ${loadaddr} ${filesize}; fi if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi setenv irsetup "remotewakeup=${remotewakeup} decode_type=${decode_type} remotewakeupmask=${remotewakeupmask}" if test "${kernel_hdmimode}" != ""; then setenv vout "${kernel_hdmimode}"; fi if test "${usbpower}" != ""; then setenv usbpower "enable_system_power=${usbpower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a73}" != ""; then setenv max_freq_a73 "max_freq_a73=${max_freq_a73}"; fi if test "${keymap}" != ""; then setenv keymap "keymap=${keymap}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi if test "${loadaddr_kernel}" != ""; then setenv loadaddr_kernel "0x02000000"; setenv loadaddr "${loadaddr_kernel}"; fi setenv displayopt "vout=${vout},dis frac_rate_policy=${frac_rate_policy} hdmitx=${hdmitx} hdr_policy=1 hdr_priority=0" setenv initargs "${rootopt} ${keymap} ${max_freq_a53} ${max_freq_a73} ${wol} ${cec} ${gpiopower} ${irsetup} ${usbpower} ${usbopts}" setenv bootargs "${bootargs} ${initargs} ${displayopt} ${coreelec}" fatload ${device} ${mmc_dev}:1 ${loadaddr} kernel.img fatload ${device} ${mmc_dev}:1 ${dtb_mem_addr} dtb.img bootm ${loadaddr} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/Khadas_VIM4_boot.ini ================================================ KHADAS-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootlabel "CoreELEC" setenv remotewakeup "0xeb14ff00" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" # set device type: mmc (SD, eMMC) or usb (USB) setenv device ${devtype} # set mmc/usb device number # u-boot SD 0, linux 1 # eMMC 1, linux 0 # eMMC-USB 0 or 1 setenv mmc_dev ${devnum} # set linux device for eMMC and SD, seems boot device is always same for 5.15.137 setenv linux_dev "mmcblk0p" if test "${devtype}" = "usb"; then setenv linux_dev "sda"; fi # setenv rootopt "boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" # to have same image on SD, eMMC or USB and still mount correct device from linux use partitions directly setenv rootopt "boot=/dev/${linux_dev}1 disk=/dev/${linux_dev}2" if fatload ${device} ${mmc_dev}:1 ${loadaddr} resolution.ini; then env import -t ${loadaddr} ${filesize}; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if fatload ${device} ${mmc_dev}:1 ${loadaddr} config.ini; then env import -t ${loadaddr} ${filesize}; fi if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi setenv irsetup "remotewakeup=${remotewakeup} decode_type=${decode_type} remotewakeupmask=${remotewakeupmask}" if test "${kernel_hdmimode}" != ""; then setenv vout "${kernel_hdmimode}"; fi if test "${usbpower}" != ""; then setenv usbpower "enable_system_power=${usbpower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a73}" != ""; then setenv max_freq_a73 "max_freq_a73=${max_freq_a73}"; fi if test "${keymap}" != ""; then setenv keymap "keymap=${keymap}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi if test "${loadaddr_kernel}" != ""; then setenv loadaddr_kernel "0x02000000"; setenv loadaddr "${loadaddr_kernel}"; fi setenv displayopt "vout=${vout},dis frac_rate_policy=${frac_rate_policy} hdmitx=${hdmitx} hdr_policy=1 hdr_priority=0" setenv initargs "${rootopt} ${keymap} ${max_freq_a53} ${max_freq_a73} ${wol} ${cec} ${gpiopower} ${irsetup} ${usbpower} ${usbopts}" setenv bootargs "${bootargs} ${initargs} ${displayopt} ${coreelec}" fatload ${device} ${mmc_dev}:1 ${loadaddr} kernel.img fatload ${device} ${mmc_dev}:1 ${dtb_mem_addr} dtb.img bootm ${loadaddr} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/Odroid_C4_boot.ini ================================================ ODROIDC4-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootlabel "CoreELEC" setenv remotewakeup "0x23dc4db2" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv rootopt "BOOT_IMAGE=kernel.img boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" setenv dtb_mem_addr 0x1000000 setenv uenv_addr 0x13000000 setenv loadaddr 0x02000000 if load mmc ${mmc_dev}:1 ${uenv_addr} resolution.ini; then env import -t ${uenv_addr} $filesize; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if load mmc ${mmc_dev}:1 ${uenv_addr} config.ini; then env import -t ${uenv_addr} $filesize; fi if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi setenv irsetup "remotewakeup=${remotewakeup} decode_type=${decode_type} remotewakeupmask=${remotewakeupmask}" if test "${kernel_hdmimode}" != ""; then setenv vout "${kernel_hdmimode}"; fi if test "${usbpower}" != ""; then setenv usbpower "enable_system_power=${usbpower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a73}" != ""; then setenv max_freq_a73 "max_freq_a73=${max_freq_a73}"; fi if test "${keymap}" != ""; then setenv keymap "keymap=${keymap}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi setenv displayopt "vout=${vout},dis frac_rate_policy=${frac_rate_policy} hdmitx=${hdmitx} hdr_policy=1 hdr_priority=0" setenv initargs "${rootopt} ${consoleopt} ${keymap} ${max_freq_a53} ${max_freq_a73} ${wol} ${cec} ${gpiopower} ${irsetup} ${usbpower} ${usbopts}" setenv bootargs "${bootargs} ${initargs} ${displayopt} ${coreelec}" load mmc ${mmc_dev}:1 ${loadaddr} kernel.img load mmc ${mmc_dev}:1 ${dtb_mem_addr} dtb.img bootm ${loadaddr} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/Odroid_N2_boot.ini ================================================ ODROIDN2-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootlabel "CoreELEC" setenv remotewakeup "0x23dc4db2" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv rootopt "BOOT_IMAGE=kernel.img boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" setenv dtb_mem_addr 0x1000000 setenv uenv_addr 0x13000000 setenv loadaddr 0x02000000 if load mmc ${mmc_dev}:1 ${uenv_addr} resolution.ini; then env import -t ${uenv_addr} $filesize; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if load mmc ${mmc_dev}:1 ${uenv_addr} config.ini; then env import -t ${uenv_addr} $filesize; fi if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi setenv irsetup "remotewakeup=${remotewakeup} decode_type=${decode_type} remotewakeupmask=${remotewakeupmask}" if test "${kernel_hdmimode}" != ""; then setenv vout "${kernel_hdmimode}"; fi if test "${usbpower}" != ""; then setenv usbpower "enable_system_power=${usbpower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a73}" != ""; then setenv max_freq_a73 "max_freq_a73=${max_freq_a73}"; fi if test "${keymap}" != ""; then setenv keymap "keymap=${keymap}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi setenv displayopt "vout=${vout},dis frac_rate_policy=${frac_rate_policy} hdmitx=${hdmitx} hdr_policy=1 hdr_priority=0" setenv initargs "${rootopt} ${consoleopt} ${keymap} ${max_freq_a53} ${max_freq_a73} ${wol} ${cec} ${gpiopower} ${irsetup} ${usbpower} ${usbopts}" setenv bootargs "${bootargs} ${initargs} ${displayopt} ${coreelec}" load mmc ${mmc_dev}:1 ${loadaddr} kernel.img load mmc ${mmc_dev}:1 ${dtb_mem_addr} dtb.img bootm ${loadaddr} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/Radxa_Zero2_boot.ini ================================================ RADXA_ZERO2-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootlabel "CoreELEC" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv rootopt "BOOT_IMAGE=kernel.img boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" setenv dtb_mem_addr 0x1000000 setenv uenv_addr 0x13000000 setenv loadaddr 0x02000000 if load mmc ${mmc_dev}:1 ${uenv_addr} resolution.ini; then env import -t ${uenv_addr} $filesize; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if load mmc ${mmc_dev}:1 ${uenv_addr} config.ini; then env import -t ${uenv_addr} $filesize; fi if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi setenv irsetup "remotewakeup=${remotewakeup} decode_type=${decode_type} remotewakeupmask=${remotewakeupmask}" if test "${usbopts}" != ""; then setenv usbopts "usbopts=${usbopts}"; fi if test "${usbpower}" != ""; then setenv usbpower "enable_system_power=${usbpower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a73}" != ""; then setenv max_freq_a73 "max_freq_a73=${max_freq_a73}"; fi if test "${modeline}" != ""; then setenv cmode "modeline=${modeline}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi if test "${keymap}" != ""; then setenv consoleopt "${consoleopt} keymap=${keymap}"; fi setenv displayopt "vout=${vout},en logo=osd0,loaded,0x3d800000 frac_rate_policy=${frac_rate_policy} native_4k_gui=${native_4k_gui} hdr_policy=1" setenv initargs "${rootopt} ${consoleopt} ${max_freq_a53} ${max_freq_a73} ${wol} ${cec} ${irsetup} ${usbpower} ${gpiopower} ${usbopts} ${cmode}" setenv bootargs "${initargs} ${displayopt} ${coreelec}" load mmc ${mmc_dev}:1 ${loadaddr} kernel.img load mmc ${mmc_dev}:1 ${dtb_mem_addr} dtb.img bootm ${loadaddr} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/Radxa_Zero_boot.ini ================================================ RADXA_ZERO-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootlabel "CoreELEC" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv rootopt "BOOT_IMAGE=kernel.img boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" setenv dtb_mem_addr 0x1000000 setenv uenv_addr 0x13000000 setenv loadaddr 0x02000000 if load mmc ${mmc_dev}:1 ${uenv_addr} resolution.ini; then env import -t ${uenv_addr} $filesize; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if load mmc ${mmc_dev}:1 ${uenv_addr} config.ini; then env import -t ${uenv_addr} $filesize; fi if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi setenv irsetup "remotewakeup=${remotewakeup} decode_type=${decode_type} remotewakeupmask=${remotewakeupmask}" if test "${usbopts}" != ""; then setenv usbopts "usbopts=${usbopts}"; fi if test "${usbpower}" != ""; then setenv usbpower "enable_system_power=${usbpower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a73}" != ""; then setenv max_freq_a73 "max_freq_a73=${max_freq_a73}"; fi if test "${modeline}" != ""; then setenv cmode "modeline=${modeline}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi if test "${keymap}" != ""; then setenv consoleopt "${consoleopt} keymap=${keymap}"; fi setenv displayopt "vout=${vout},en logo=osd0,loaded,0x3d800000 frac_rate_policy=${frac_rate_policy} native_4k_gui=${native_4k_gui} hdr_policy=1" setenv initargs "${rootopt} ${consoleopt} ${max_freq_a53} ${max_freq_a73} ${wol} ${cec} ${irsetup} ${usbpower} ${gpiopower} ${usbopts} ${cmode}" setenv bootargs "${initargs} ${displayopt} ${coreelec}" load mmc ${mmc_dev}:1 ${loadaddr} kernel.img load mmc ${mmc_dev}:1 ${dtb_mem_addr} dtb.img bootm ${loadaddr} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/Solitude_boot.ini ================================================ SOLITUDE-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootlabel "CoreELEC" setenv remotewakeup "0xe31cdf00" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv rootopt "BOOT_IMAGE=kernel.img boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" setenv dtb_mem_addr 0x1000000 setenv uenv_addr 0x13000000 setenv loadaddr 0x02000000 if load mmc ${mmc_dev}:1 ${uenv_addr} resolution.ini; then env import -t ${uenv_addr} $filesize; fi if test "${allfmt_names}" != ""; then for name in ${allfmt_names}; do if test "${kernel_hdmimode}" = ${name}; then setenv vout ${name}; fi; done; fi if load mmc ${mmc_dev}:1 ${uenv_addr} config.ini; then env import -t ${uenv_addr} $filesize; fi if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi setenv irsetup "remotewakeup=${remotewakeup} decode_type=${decode_type} remotewakeupmask=${remotewakeupmask}" if test "${kernel_hdmimode}" != ""; then setenv vout "${kernel_hdmimode}"; fi if test "${usbpower}" != ""; then setenv usbpower "enable_system_power=${usbpower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a73}" != ""; then setenv max_freq_a73 "max_freq_a73=${max_freq_a73}"; fi if test "${keymap}" != ""; then setenv keymap "keymap=${keymap}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi setenv displayopt "vout=${vout},dis frac_rate_policy=${frac_rate_policy} hdmitx=${hdmitx} hdr_policy=1 hdr_priority=0" setenv initargs "${rootopt} ${consoleopt} ${keymap} ${max_freq_a53} ${max_freq_a73} ${wol} ${cec} ${gpiopower} ${irsetup} ${usbpower} ${usbopts}" setenv bootargs "${bootargs} ${initargs} ${displayopt} ${coreelec}" load mmc ${mmc_dev}:1 ${loadaddr} kernel.img load mmc ${mmc_dev}:1 ${dtb_mem_addr} dtb.img bootm ${loadaddr} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/canupdate.sh ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.tv) # detect legacy kernel installs and abort to prevent upgrades if [[ "$(uname -r)" = "3.14."* ]] || [[ "$(uname -r)" = "4.9."* ]]; then echo "Update from older kernel is not supported!" sleep 10 exit 1 fi DEVICE_OLD=$(echo "${1}" | cut -d. -f1) DEVICE_NEW=$(echo "${2}" | cut -d. -f1) # allow upgrades between aarch64 and arm images on same device if [ "${DEVICE_OLD}" = "${DEVICE_NEW}" ]; then exit 0 else exit 1 fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/config.ini ================================================ #------------------------------------------------------------------------------------------------------ # # config.ini # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # Console Setup # # consoleopt='console=tty0 no_console_suspend' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # CPU Frequency Control # # WARNING!!! WARNING!!! WARNING!!! # Before changing anything here please read the wiki entry at: # https://wiki.odroid.com/odroid-n2/application_note/software/set_cpu_freq # # max_freq_a73='1800' # max_freq_a53='1896' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # HDMI CEC Control # Set by CoreELEC Settings # # cec_func_config='7f' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # IR setup # Setup a custom keycode to wake the Amlogic device from suspend or poweroff # You can stop kodi and eventlircd and use "ir-keytable -u" to obtain a compatible u-boot # IR keycode # This setting will require a injected bl30 blob. # # remotewakeup='0x31ce4db2' # # decode_type can be one of the following: # NEC='0x0', RC5='0x4', RC6A='0x5', RC6='0xb' # This setting will require a injected bl30 blob. # # decode_type='0x0' # NEC # # remote power key mask: # Some IR protocols implement a toggle bit, this can be ignored by the "and" mask: # RC5='0x37ff', RC6='0x1effff', RC6A='0xffff7fff' # This setting will require a injected bl30 blob. # # remotewakeupmask='0xffffffff' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # Power Off and Wake Up using GPIO Key Button # Define a gpio by string, like 'GPIOD_4' for Khadas VIM4 as example # This setting will require a injected bl30 blob. # # gpiopower='GPIOD_4' #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # USB specific options # # usbopts='usb-xhci.tablesize=2' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # USB Power Control # Set by CoreELEC Settings # # usbpower=0 # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # VOUT mode # You can use this setting to set a specific video mode at boot. Você pode usar esta configuração para definir um modo de vídeo específico na inicialização. # >> HDMI << # vout='1080p60hz' # >> Video rca p2 << # vout='576cvbs' # vout='480cvbs' #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # Fractional Refresh Rate # You can use this setting to set a fractional refresh rate. So for example if vout mode it set to # 1080p60hz then setting this to 1 will make the refresh rate switch to 59.97hz instead of the modes # default of 60hz. In this example setting it to 0 will keep the modes default of 60hz. # # frac_rate_policy='0' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # Busybox console keyboard layout # Set by CoreELEC Settings # # keymap='uk' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # CoreELEC Developer Options # Valid options are: textmode debugging progress nofsck nosplash noram overlay quiet ssh # # coreelec='quiet' # #------------------------------------------------------------------------------------------------------ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/dtb.conf ================================================ <dtb> <multidtb name="g12a_s905x2_beelink_gt_mini_a.dtb" subdevice=""> <file>g12a_s905x2_beelink_gt_mini_a_2g.dtb</file> <file>g12a_s905x2_beelink_gt_mini_a_4g.dtb</file> </multidtb> <multidtb name="g12a_s905x2_beelink_gt1_mini.dtb" subdevice=""> <file>g12a_s905x2_beelink_gt1_mini_2g.dtb</file> <file>g12a_s905x2_beelink_gt1_mini_4g.dtb</file> </multidtb> <multidtb name="g12b_bananapi_m2s.dtb" subdevice=""> <file>g12b_a311d_bananapi_m2s.dtb</file> <file>g12b_s922x_bananapi_m2s.dtb</file> </multidtb> <multidtb name="g12b_s922x_ugoos_am6.dtb" subdevice=""> <file>g12b_s922x_ugoos_am6_2g.dtb</file> <file>g12b_s922x_ugoos_am6_4g.dtb</file> </multidtb> <multidtb name="g12b_s922x_ugoos_am6b.dtb" subdevice=""> <file>g12b_s922x_ugoos_am6b_2g.dtb</file> <file>g12b_s922x_ugoos_am6b_4g.dtb</file> </multidtb> <multidtb name="s4_s905y4_buzztv_hd5.dtb" subdevice=""> <file>s4_s905y4_buzztv_hd5_2g.dtb</file> <file>s4_s905y4_buzztv_hd5_4g.dtb</file> </multidtb> <multidtb name="s5_s928x_ugoos_am8.dtb" subdevice=""> <file>s5_s928x_ugoos_am8_4g.dtb</file> <file>s5_s928x_ugoos_am8_8g.dtb</file> </multidtb> <multidtb name="s5_s928x_x96_x10.dtb" subdevice=""> <file>s5_s928x_x96_x10_4g.dtb</file> <file>s5_s928x_x96_x10_8g.dtb</file> </multidtb> <multidtb name="sc2_s905x4_buzztv_x5.dtb" subdevice=""> <file>sc2_s905x4_buzztv_x5_2g.dtb</file> <file>sc2_s905x4_buzztv_x5_2g_1gbit.dtb</file> <file>sc2_s905x4_buzztv_x5_4g.dtb</file> <file>sc2_s905x4_buzztv_x5_4g_1gbit.dtb</file> </multidtb> <multidtb name="sc2_s905x4_sei_smb_280.dtb" subdevice=""> <file>sc2_s905x4_sei_smb_280_id5.dtb</file> <file>sc2_s905x4_sei_smb_280_id6.dtb</file> <file>sc2_s905x4_sei_smb_280_id7.dtb</file> </multidtb> <multidtb name="sm1_s905x3_beelink_gt1mini2.dtb" subdevice=""> <file>sm1_s905x3_beelink_gt1mini2_2g.dtb</file> <file>sm1_s905x3_beelink_gt1mini2_4g.dtb</file> </multidtb> <multidtb name="t7_a311d2_beelink_gt_king_ii.dtb" subdevice=""> <file>t7_a311d2_beelink_gt_king_ii_4g.dtb</file> <file>t7_a311d2_beelink_gt_king_ii_8g.dtb</file> </multidtb> <multidtb name="t7_a311d2_khadas_vim4.dtb" subdevice=""> <file>t7_a311d2_khadas_vim4.dtb</file> <file>t7c_a311d2_khadas_vim4n.dtb</file> </multidtb> <!--migrate DT from older project--> <migratedtb coreelec-dt-id="g12b_s922x_beelink_gt_king_rev_a" subdevice=""> <migratedtid>g12b_s922x_beelink_gt_king</migratedtid> </migratedtb> <migratedtb coreelec-dt-id="g12b_s922x_beelink_gs_king_x_rev_a" subdevice=""> <migratedtid>g12b_s922x_beelink_gs_king_x</migratedtid> </migratedtb> <migratedtb coreelec-dt-id="g12b_s922x_minix_u22xj" subdevice=""> <migratedtid>g12b_s922x_minix_u22xj_max</migratedtid> </migratedtb> <migratedtb coreelec-dt-id="g12b_s922x_minix_u22xj_max_rev_a" subdevice=""> <migratedtid>g12b_s922x_minix_u22xj_max</migratedtid> </migratedtb> <migratedtb coreelec-dt-id="g12b_s922x_odroid_n2plus" subdevice=""> <migratedtid>g12b_s922x_odroid_n2</migratedtid> </migratedtb> <migratedtb coreelec-dt-id="g12b_s922x_odroid_n2plus_rev_c" subdevice=""> <migratedtid>g12b_s922x_odroid_n2</migratedtid> </migratedtb> <migratedtb coreelec-dt-id="g12b_s922x_ugoos_am6_rev_a_2g" subdevice=""> <migratedtid>g12b_s922x_ugoos_am6_2g</migratedtid> </migratedtb> <migratedtb coreelec-dt-id="g12b_s922x_ugoos_am6_rev_a_4g" subdevice=""> <migratedtid>g12b_s922x_ugoos_am6_4g</migratedtid> </migratedtb> <migratedtb coreelec-dt-id="g12b_s922x_ugoos_am6b_rev_a_2g" subdevice=""> <migratedtid>g12b_s922x_ugoos_am6b_2g</migratedtid> </migratedtb> <migratedtb coreelec-dt-id="g12b_s922x_ugoos_am6b_rev_a_4g" subdevice=""> <migratedtid>g12b_s922x_ugoos_am6b_4g</migratedtid> </migratedtb> </dtb> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/dtb.xml ================================================ <?xml version="1.0"?> <dtb-settings version="0"> <sys_led status="on" version="0"> <sys_led_on name="on"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>default-on</value> </cmd> </sys_led_on> <sys_led_heartbeat name="heartbeat"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>heartbeat</value> </cmd> </sys_led_heartbeat> <sys_led_rc_feedback name="rc feedback"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>rc-feedback</value> </cmd> </sys_led_rc_feedback> <sys_led_sd name="sd"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>mmc1</value> </cmd> </sys_led_sd> <sys_led_emmc name="emmc"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>mmc0</value> </cmd> </sys_led_emmc> <sys_led_off name="off"> <cmd path="/gpioleds/sys_led linux,default-trigger" type="s" > <value>none</value> </cmd> </sys_led_off> </sys_led> <red_led status="off" version="0"> <red_led_on name="on"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>default-on</value> </cmd> </red_led_on> <red_led_heartbeat name="heartbeat"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>heartbeat</value> </cmd> </red_led_heartbeat> <red_led_rc_feedback name="rc feedback"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>rc-feedback</value> </cmd> </red_led_rc_feedback> <red_led_sd name="sd"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>mmc1</value> </cmd> </red_led_sd> <red_led_emmc name="emmc"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>mmc0</value> </cmd> </red_led_emmc> <red_led_off name="off"> <cmd path="/gpioleds/red_led linux,default-trigger" type="s" > <value>none</value> </cmd> </red_led_off> </red_led> <green_led status="off" version="0"> <green_led_on name="on"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>default-on</value> </cmd> </green_led_on> <green_led_heartbeat name="heartbeat"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>heartbeat</value> </cmd> </green_led_heartbeat> <green_led_rc_feedback name="rc feedback"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>rc-feedback</value> </cmd> </green_led_rc_feedback> <green_led_sd name="sd"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>mmc1</value> </cmd> </green_led_sd> <green_led_emmc name="emmc"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>mmc0</value> </cmd> </green_led_emmc> <green_led_off name="off"> <cmd path="/gpioleds/green_led linux,default-trigger" type="s" > <value>none</value> </cmd> </green_led_off> </green_led> <bct3236_led status="on" version="0"> <bct3236_led_on name="on"> <cmd path="/soc/apb4@fe000000/i2c@6c000/bct3236@3c linux,default-trigger" type="s" > <value>default-on</value> </cmd> </bct3236_led_on> <bct3236_led_off name="off"> <cmd path="/soc/apb4@fe000000/i2c@6c000/bct3236@3c linux,default-trigger" type="s" > <value>none</value> </cmd> </bct3236_led_off> </bct3236_led> <remote_type status="NEC" version="0"> <remote_type_nec name="NEC"> <cmd path="/meson-remote protocol" type="i" > <value>1</value> </cmd> </remote_type_nec> <remote_type_legacy_nec name="LEGACY NEC"> <cmd path="/meson-remote protocol" type="i" > <value>255</value> </cmd> </remote_type_legacy_nec> <remote_type_duokan name="DUOKAN"> <cmd path="/meson-remote protocol" type="i" > <value>2</value> </cmd> </remote_type_duokan> <remote_type_xmp_1 name="XMP_1"> <cmd path="/meson-remote protocol" type="i" > <value>3</value> </cmd> </remote_type_xmp_1> <remote_type_rc5 name="RC5"> <cmd path="/meson-remote protocol" type="i" > <value>4</value> </cmd> </remote_type_rc5> <remote_type_rc6 name="RC6"> <cmd path="/meson-remote protocol" type="i" > <value>5</value> </cmd> </remote_type_rc6> <remote_type_toshiba name="TOSHIBA"> <cmd path="/meson-remote protocol" type="i" > <value>6</value> </cmd> </remote_type_toshiba> <remote_type_rca name="RCA"> <cmd path="/meson-remote protocol" type="i" > <value>8</value> </cmd> </remote_type_rca> </remote_type> <motorcomm status="migrated" dt_id="sc2_s905x4*1gbit" version="0"> <motorcomm_n_a name="n/a"> <cmd path="/soc/ethernet@fdc00000 internal_phy" type="i" > <value>2</value> </cmd> </motorcomm_n_a> <motorcomm_a name="assembled"> <cmd path="/soc/ethernet@fdc00000 internal_phy" type="i" > <value>0</value> </cmd> </motorcomm_a> </motorcomm> <wol status="migrated" version="0"> <wol_on name="on"> <cmd path="/soc/ethernet@fdc00000 wol" type="i" > <value>1</value> </cmd> </wol_on> <wol_off name="off"> <cmd path="/soc/ethernet@fdc00000 wol" type="i" > <value>0</value> </cmd> </wol_off> </wol> <custom_edid status="custom" version="0"> <edid name="custom"> <cmd path="/amhdmitx custom_edid" type="s"> <value/> </cmd> </edid> </custom_edid> </dtb-settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/mkbootimg ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) DTBIMG_PATH="common_drivers/arch/${TARGET_KERNEL_ARCH}/boot" DTB_PATH="${DTBIMG_PATH}/dts/amlogic" ANDROID_BOOTIMG_SECOND="" SUBDEVICES+=" Generic" for device in ${SUBDEVICES}; do DTB_BLOBS_PATH=${DTB_PATH}/${device} mkdir -p ${DTB_BLOBS_PATH} if [ "${device}" = "Generic" ]; then for dtblob in ${KERNEL_UBOOT_EXTRA_TARGET}; do cp ${DTB_PATH}/${dtblob} ${DTB_BLOBS_PATH} 2>/dev/null || : done else MULTIDTB_BLOB="" find_file_path bootloader/dtb.conf MULTIDTB_CONF="${FOUND_PATH}" if [ -f ${MULTIDTB_CONF} ]; then multidtb_cnt=$(xmlstarlet sel -t -c "count(//dtb/multidtb)" ${MULTIDTB_CONF}) cnt_m=1 while [ ${cnt_m} -le ${multidtb_cnt} ]; do multidtb=$(xmlstarlet sel -t -v "//dtb/multidtb[${cnt_m}]/@name" ${MULTIDTB_CONF}) || : subdevice=$(xmlstarlet sel -t -v "//dtb/multidtb[${cnt_m}]/@subdevice" ${MULTIDTB_CONF}) || : if [ "${device}" = "${subdevice}" ]; then echo "Device tree multidtb subdevice: ${device}, ${multidtb%%.*}.dtb" MULTIDTB_BLOB="${multidtb%%.*}.dtb" break fi cnt_m=$((cnt_m+1)) done fi if [ -n "${MULTIDTB_BLOB}" ]; then cp ${DTB_PATH}/${MULTIDTB_BLOB} ${DTB_BLOBS_PATH}/${device}_dtb.dtb 2>/dev/null || : else cp ${DTB_PATH}/*${device,,}.dtb ${DTB_BLOBS_PATH} 2>/dev/null || : fi fi DTB_BLOBS=($(ls ${DTB_BLOBS_PATH}/*.dtb 2>/dev/null || true)) DTB_BLOBS_COUNT=${#DTB_BLOBS[@]} DTB_BLOB_OUTPUT=${DTBIMG_PATH}/${device}_dtb.img if [ "${DTB_BLOBS_COUNT}" -gt 1 ]; then ${TOOLCHAIN}/bin/dtbTool -c -o ${DTB_BLOB_OUTPUT} -p scripts/dtc/ ${DTB_BLOBS_PATH} elif [ "${DTB_BLOBS_COUNT}" -eq 1 ]; then cp -PR ${DTB_BLOBS} ${DTB_BLOB_OUTPUT} fi done if [ -f ${DTBIMG_PATH}/Generic_dtb.img ]; then ANDROID_BOOTIMG_SECOND="--second ${DTBIMG_PATH}/Generic_dtb.img" fi RAMDISK=${BUILD}/image/initramfs.cpio echo echo "Compressing initramfs.cpio with zstd" stat -c " %s bytes %n" ${RAMDISK} # with 3 as default compresion zstd -q -f ${RAMDISK} RAMDISK=${RAMDISK}.zst stat -c " %s bytes %n" ${RAMDISK} LDFLAGS="" mkbootimg --kernel arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET} --ramdisk ${RAMDISK} \ ${ANDROID_BOOTIMG_SECOND} ${ANDROID_BOOTIMG_OPTIONS} --output arch/${TARGET_KERNEL_ARCH}/boot/boot.img ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/mkimage ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) mcopy_file_exist() { [ -f "${1}" ] && mcopy "${1}" "${2}" } # setup subdevice configuration . ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/bootloader/subdevice_config.sh ${SUBDEVICE} # copy device trees to part1 for dtb in ${RELEASE_DIR}/3rdparty/bootloader/device_trees ${RELEASE_DIR}/3rdparty/bootloader/*.dtb ${RELEASE_DIR}/3rdparty/bootloader/dtb.img ; do # it is a folder [ -e "${dtb}" ] && mcopy -s "${dtb}" "::" done # copy device dtb to part1 mcopy_file_exist "${RELEASE_DIR}/3rdparty/bootloader/${DEVICE_DTB}" "::/dtb.img" # copy config.ini to part1 mcopy_file_exist "${RELEASE_DIR}/3rdparty/bootloader/config.ini" "::" if [ -f "${RELEASE_DIR}/3rdparty/bootloader/${DEVICE_BOOT_INI}" ]; then # using own bootloader, copy device boot.ini to part1 cp -p "${RELEASE_DIR}/3rdparty/bootloader/${DEVICE_BOOT_INI}" "${LE_TMP}/boot.ini" sed -e "s/@BOOT_UUID@/${UUID_SYSTEM}/" \ -e "s/@DISK_UUID@/${UUID_STORAGE}/" \ -i "${LE_TMP}/boot.ini" mcopy "${LE_TMP}/boot.ini" "::" # copy logos to part1 mcopy_file_exist "${RELEASE_DIR}/3rdparty/bootloader/${DEVICE_BOOT_LOGO}" "::/boot-logo-1080.bmp.gz" mcopy_file_exist "${RELEASE_DIR}/3rdparty/bootloader/${DEVICE_TIMEOUT_LOGO}" "::/timeout-logo-1080.bmp.gz" # write u-boot to part1 if [ -f "${RELEASE_DIR}/3rdparty/bootloader/${DEVICE_UBOOT}" ]; then echo "image: writing u-boot to disk image" dd if="${RELEASE_DIR}/3rdparty/bootloader/${DEVICE_UBOOT}" of="${DISK}" conv=fsync,notrunc bs=1 count=112 >"${SAVE_ERROR}" 2>&1 || show_error dd if="${RELEASE_DIR}/3rdparty/bootloader/${DEVICE_UBOOT}" of="${DISK}" conv=fsync,notrunc bs=512 skip=1 seek=1 >"${SAVE_ERROR}" 2>&1 || show_error fi fi if [ -f "${RELEASE_DIR}/3rdparty/bootloader/${DEVICE_CFGLOAD}" ]; then # using Android bootloader # copy amlogic cfgload file to part1 mcopy "${RELEASE_DIR}/3rdparty/bootloader/${DEVICE_CFGLOAD}" "::/cfgload" # copy amlogic autoscript file to part1 mcopy_file_exist "${RELEASE_DIR}/3rdparty/bootloader/aml_autoscript" "::/aml_autoscript" fi # copy chain u-boot to part1 mcopy_file_exist "${RELEASE_DIR}/3rdparty/bootloader/${DEVICE_CHAIN_UBOOT}" "::/u-boot.bin" mcopy_file_exist "${RELEASE_DIR}/3rdparty/bootloader/${DEVICE_BOOT_SCR}" "::/boot.scr" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/release ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) mkdir -p ${RELEASE_DIR}/3rdparty/bootloader cp -a ${INSTALL}/usr/share/bootloader/* ${RELEASE_DIR}/3rdparty/bootloader ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/scripts/Generic_cfgload.src ================================================ echo "Using device ${device}, number ${devnr}, partition ${partnr}, EmuELEC on eMMC: ${ce_on_emmc}" setenv remotewakeup "0xffffffff" setenv decode_type "0" setenv remotewakeupmask "0xffffffff" setenv coreelec "quiet" setenv vout "1080p60hz" setenv frac_rate_policy "0" setenv consoleopt "console=tty0 no_console_suspend" setenv rootopt "BOOT_IMAGE=kernel.img boot=LABEL=EMUELEC disk=LABEL=STORAGE" if test "${ce_on_emmc}" = "yes"; then setenv rootopt "BOOT_IMAGE=kernel.img boot=LABEL=CE_FLASH disk=FOLDER=/dev/CE_STORAGE"; fi if fatload ${device} ${devnr}:${partnr} ${loadaddr} resolution.ini; then env import -t ${loadaddr} ${filesize}; fi if fatload ${device} ${devnr}:${partnr} ${loadaddr} config.ini; then env import -t ${loadaddr} ${filesize}; fi if test "${cec_func_config}" != ""; then setenv cec "hdmitx=cec${cec_func_config}"; fi if test "${gpiopower}" != ""; then setenv gpiopower "gpiopower=${gpiopower}"; fi setenv irsetup "remotewakeup=${remotewakeup} decode_type=${decode_type} remotewakeupmask=${remotewakeupmask}" if test "${kernel_hdmimode}" != ""; then setenv vout "${kernel_hdmimode}"; fi if test "${usbpower}" != ""; then setenv usbpower "enable_system_power=${usbpower}"; fi if test "${max_freq_a53}" != ""; then setenv max_freq_a53 "max_freq_a53=${max_freq_a53}"; fi if test "${max_freq_a73}" != ""; then setenv max_freq_a73 "max_freq_a73=${max_freq_a73}"; fi if test "${keymap}" != ""; then setenv consoleopt "${consoleopt} keymap=${keymap}"; fi if test "${wol}" != ""; then setenv wol "enable_wol=${wol}"; fi if test "${mac}" = "" && test "${ethaddr}" != ""; then setenv localmac "mac=${ethaddr}"; fi if test "${loadaddr_kernel}" != ""; then setenv loadaddr_kernel "0x02000000"; setenv loadaddr "${loadaddr_kernel}"; fi setenv displayopt "vout=${vout},dis logo=osd0,loaded,${fb_addr} frac_rate_policy=${frac_rate_policy} hdmitx=${hdmitx} hdr_policy=1 hdr_priority=0" setenv initargs "${rootopt} ${consoleopt} ${max_freq_a53} ${max_freq_a73} ${wol} ${localmac} ${cec} ${gpiopower} ${irsetup} ${usbpower} ${usbopts}" setenv bootargs "${bootargs} ${initargs} ${displayopt} ${coreelec}" fatload ${device} ${devnr}:${partnr} ${loadaddr} kernel.img fatload ${device} ${devnr}:${partnr} ${dtb_mem_addr} dtb.img bootm ${loadaddr} bootm start bootm loados bootm prep bootm go ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/scripts/aml_autoscript.src ================================================ defenv setenv bootfromnand 0 setenv upgrade_step 2 setenv ce_on_emmc "no" setenv cfgloadsd 'if fatload mmc 0:1 ${loadaddr} cfgload; then setenv device mmc; setenv devnr 0; setenv partnr 1; source ${loadaddr}; autoscr ${loadaddr}; fi' setenv cfgloadusb 'if fatload usb 0:1 ${loadaddr} cfgload; then setenv device usb; setenv devnr 0; setenv partnr 1; source ${loadaddr}; autoscr ${loadaddr}; fi' setenv cfgloademmc 'for p in 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F; do if fatload mmc 1:${p} ${loadaddr} cfgload; then setenv device mmc; setenv devnr 1; setenv partnr ${p}; setenv ce_on_emmc "yes"; source ${loadaddr}; autoscr ${loadaddr}; fi; done;' setenv bootfromsd 'if mmcinfo; then run cfgloadsd; fi' setenv bootfromusb 'usb start; if usb storage; then run cfgloadusb; fi' setenv bootfromemmc 'run cfgloademmc' setenv bootcmd 'if test ${bootfromnand} = 1; then setenv bootfromnand 0; saveenv; else run bootfromsd; run bootfromusb; run bootfromemmc; fi; run storeboot' if test "${fdtaddr}" = ""; then setenv fdtaddr ${dtb_mem_addr}; fi saveenv run storeargs run bootfromsd run bootfromusb run bootfromemmc ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/subdevice_config.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) unset DEVICE_CFGLOAD unset DEVICE_BOOT_LOGO unset DEVICE_TIMEOUT_LOGO unset DEVICE_DTB unset DEVICE_UBOOT unset DEVICE_CHAIN_UBOOT unset DEVICE_BOOT_INI unset DEVICE_BOOT_SCR unset DEVICE_UBOOT_BIN unset DEVICE_CHAIN_UBOOT_BIN case ${1} in Odroid_C4) DEVICE_BOOT_LOGO="odroid_boot-logo.bmp.gz" DEVICE_DTB="device_trees/sm1_s905x3_odroid_c4.dtb" DEVICE_UBOOT="${1}_u-boot" DEVICE_BOOT_INI="${1}_boot.ini" [ -n "${2}" ] && DEVICE_UBOOT_BIN="$(get_build_dir u-boot-${1})/sd_fuse/u-boot.bin.sd.bin" ;; Odroid_N2) DEVICE_BOOT_LOGO="odroid_boot-logo.bmp.gz" DEVICE_DTB="device_trees/g12b_s922x_odroid_n2.dtb" DEVICE_UBOOT="${1}_u-boot" DEVICE_BOOT_INI="${1}_boot.ini" [ -n "${2}" ] && DEVICE_UBOOT_BIN="$(get_build_dir u-boot-${1})/sd_fuse/u-boot.bin.sd.bin" ;; Khadas_VIM4) DEVICE_CFGLOAD="Generic_cfgload" # used for generic image DEVICE_BOOT_LOGO="khadas_vim4-boot-logo.bmp.gz" DEVICE_DTB="device_trees/t7_a311d2_khadas_vim4.dtb" DEVICE_UBOOT="${1}_u-boot" DEVICE_BOOT_INI="${1}_boot.ini" [ -n "${2}" ] && DEVICE_UBOOT_BIN="$(get_build_dir u-boot-${1})/build/u-boot.bin.sd.bin.signed" ;; Khadas_VIM1S) DEVICE_CFGLOAD="Generic_cfgload" # used for generic image DEVICE_BOOT_LOGO="khadas_vim1s-boot-logo.bmp.gz" DEVICE_DTB="device_trees/s4_s905y4_khadas_vim1s.dtb" DEVICE_UBOOT="${1}_u-boot" DEVICE_BOOT_INI="${1}_boot.ini" [ -n "${2}" ] && DEVICE_UBOOT_BIN="$(get_build_dir u-boot-${1})/build/u-boot.bin.sd.bin.signed" ;; Radxa_Zero) DEVICE_BOOT_LOGO="radxa-boot-logo.bmp.gz" DEVICE_DTB="device_trees/g12a_s905y2_radxa_zero.dtb" DEVICE_UBOOT="${1}_u-boot" DEVICE_BOOT_INI="${1}_boot.ini" [ -n "${2}" ] && DEVICE_UBOOT_BIN="$(get_build_dir u-boot-${1})/sd_fuse/u-boot.bin.sd.bin" ;; Radxa_Zero2) DEVICE_BOOT_LOGO="radxa-boot-logo.bmp.gz" DEVICE_DTB="device_trees/g12b_a311d_radxa_zero2.dtb" DEVICE_UBOOT="${1}_u-boot" DEVICE_BOOT_INI="${1}_boot.ini" [ -n "${2}" ] && DEVICE_UBOOT_BIN="$(get_build_dir u-boot-${1})/sd_fuse/u-boot.bin.sd.bin" ;; Alta) DEVICE_BOOT_LOGO="libre-computer_boot-logo.bmp.gz" DEVICE_DTB="device_trees/g12b_a311d_libre_computer_alta.dtb" DEVICE_UBOOT="${1}_u-boot" DEVICE_BOOT_INI="${1}_boot.ini" [ -n "${2}" ] && DEVICE_UBOOT_BIN="$(get_build_dir u-boot-${1})/sd_fuse/u-boot.bin.sd.bin" ;; Solitude) DEVICE_BOOT_LOGO="libre-computer_boot-logo.bmp.gz" DEVICE_DTB="device_trees/sm1_s905d3_libre_computer_solitude.dtb" DEVICE_UBOOT="${1}_u-boot" DEVICE_BOOT_INI="${1}_boot.ini" [ -n "${2}" ] && DEVICE_UBOOT_BIN="$(get_build_dir u-boot-${1})/sd_fuse/u-boot.bin.sd.bin" ;; Generic) DEVICE_CFGLOAD="${1}_cfgload" ;; esac ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/bootloader/update.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) # use chroot because of running xmlstarlet and other binaries build with newer glibc if [ "${SYSTEM_ROOT}" = "/update" ]; then # run from init # unset SYSTEM_ROOT because we are chroot-ing and /update become new / anyway unset SYSTEM_ROOT # mount some folders from old root mount -o bind /tmp /update/var for folder in proc sys dev tmp run flash storage; do [ -d /${folder} ] && mount -o bind /${folder} /update/${folder} done /usr/bin/busybox chroot /update /usr/share/bootloader/update.sh # umount folders for folder in proc sys dev tmp run flash storage; do [ -d /${folder} ] && umount /update/${folder} done umount /update/var # set it back just in case SYSTEM_ROOT="/update" exit 0 fi # change to writable folder cd /tmp [ -z "${BOOT_ROOT}" ] && BOOT_ROOT="/flash" [ -z "${BOOT_PART}" ] && BOOT_PART=$(df "${BOOT_ROOT}" | tail -1 | awk {' print $1 '}) if [ -z "${BOOT_DISK}" ]; then case ${BOOT_PART} in /dev/sd[a-z]1) BOOT_DISK=$(echo ${BOOT_PART} | sed -e "s,1$,,g") ;; /dev/mmcblk[0-9]p1) BOOT_DISK=$(echo ${BOOT_PART} | sed -e "s,p1$,,g") ;; *) BOOT_DISK="" ;; esac fi # must be block device with minor 0 if [ -n "${BOOT_DISK}" ]; then disk_minor=$(stat -t ${BOOT_DISK} 2>/dev/null | awk '{print $11}') if [ ! -b "${BOOT_DISK}" -o "${disk_minor}" != "0" ]; then BOOT_DISK="" fi fi mount -o rw,remount ${BOOT_ROOT} DT_ID="" SUBDEVICE="" for arg in $(cat /proc/cmdline); do case ${arg} in boot=*) boot="${arg#*=}" case ${boot} in /dev/mmc*) BOOT_UUID="$(blkid ${boot} | sed 's/.* UUID="//;s/".*//g')" ;; UUID=*|LABEL=*) BOOT_UUID="$(blkid | sed 's/"//g' | grep -m 1 -i " ${boot} " | sed 's/.* UUID=//;s/ .*//g')" ;; FOLDER=*) BOOT_UUID="$(blkid ${boot#*=} | sed 's/.* UUID="//;s/".*//g')" ;; esac DT_ID=$(dtname) MIGRATE_DTB="" if [ -n "${DT_ID}" ]; then SUBDEVICE="Generic" # modify DT_ID, SUBDEVICE and MIGRATE_DTB by dtb.conf [ -f /usr/bin/convert_dtname ] && . /usr/bin/convert_dtname ${DT_ID} case ${DT_ID} in *odroid_c4*) SUBDEVICE="Odroid_C4" ;; *odroid_n2*) SUBDEVICE="Odroid_N2" ;; *khadas_vim4*) SUBDEVICE="Khadas_VIM4" ;; *khadas_vim1s*) SUBDEVICE="Khadas_VIM1S" ;; *radxa_zero) SUBDEVICE="Radxa_Zero" ;; *radxa_zero2) SUBDEVICE="Radxa_Zero2" ;; *libre_computer_alta) SUBDEVICE="Alta" ;; *libre_computer_solitude) SUBDEVICE="Solitude" ;; esac fi # setup subdevice configuration . /usr/share/bootloader/subdevice_config.sh ${SUBDEVICE} UPDATE_DTB_SOURCE="/usr/share/bootloader/device_trees/${DT_ID}.dtb" if [ -n "${DT_ID}" -a -f "${UPDATE_DTB_SOURCE}" ]; then echo "Updating device tree with ${DT_ID}.dtb..." case ${BOOT_PART} in /dev/coreelec) dd if=/dev/zero of=/dev/dtb bs=256k count=1 status=none dd if="${UPDATE_DTB_SOURCE}" of=/dev/dtb bs=256k status=none rm -f "${BOOT_ROOT}/dtb.img" # this should not exist, remove if it does ;; *) cp -f "${UPDATE_DTB_SOURCE}" "${BOOT_ROOT}/dtb.img" ;; esac [ -n "${MIGRATE_DTB}" ] && eval ${MIGRATE_DTB} fi for all_dtb in /flash/*.dtb ; do if [ -f ${all_dtb} ]; then dtb=$(basename ${all_dtb}) if [ -f /usr/share/bootloader/${dtb} ]; then echo "Updating ${dtb}..." cp -p /usr/share/bootloader/${dtb} ${BOOT_ROOT} fi fi done ;; disk=*) disk="${arg#*=}" case ${disk} in /dev/mmc*) DISK_UUID="$(blkid ${disk} | sed 's/.* UUID="//;s/".*//g')" ;; UUID=*|LABEL=*) DISK_UUID="$(blkid | sed 's/"//g' | grep -m 1 -i " ${disk} " | sed 's/.* UUID=//;s/ .*//g')" ;; FOLDER=*) DISK_UUID="$(blkid ${disk#*=} | sed 's/.* UUID="//;s/".*//g')" ;; esac ;; esac done if [ -d ${BOOT_ROOT}/device_trees ]; then echo "Updating device_trees folder..." rm ${BOOT_ROOT}/device_trees/*.dtb cp -p /usr/share/bootloader/device_trees/*.dtb ${BOOT_ROOT}/device_trees/ fi if [ -f /usr/share/bootloader/config.ini ]; then if [ ! -f ${BOOT_ROOT}/config.ini ]; then echo "Creating config.ini..." cp -p /usr/share/bootloader/config.ini ${BOOT_ROOT}/config.ini fi fi if [ -f ${BOOT_ROOT}/dtb.xml ]; then if [ -f /usr/lib/coreelec/dtb-xml ]; then echo "Updating dtb.img by dtb.xml..." /usr/lib/coreelec/dtb-xml fi fi if [ -f ${BOOT_ROOT}/boot.scr ]; then if [ -f /usr/share/bootloader/${DEVICE_CHAIN_UBOOT} ]; then echo "Updating chain loaded u-boot..." cp -p /usr/share/bootloader/${DEVICE_CHAIN_UBOOT} ${BOOT_ROOT}/u-boot.bin fi if [ -f /usr/share/bootloader/${DEVICE_BOOT_SCR} ]; then echo "Updating boot.scr..." cp -p /usr/share/bootloader/${DEVICE_BOOT_SCR} ${BOOT_ROOT}/boot.scr fi fi if [ -f ${BOOT_ROOT}/cfgload ]; then if [ -f /usr/share/bootloader/${DEVICE_CFGLOAD} ]; then echo "Updating cfgload..." cp -p /usr/share/bootloader/${DEVICE_CFGLOAD} ${BOOT_ROOT}/cfgload fi if [ -f /usr/share/bootloader/aml_autoscript ]; then echo "Updating aml_autoscript..." cp -p /usr/share/bootloader/aml_autoscript ${BOOT_ROOT} if [ -e /dev/env ]; then mkdir -p /var/lock dd if=${BOOT_ROOT}/aml_autoscript bs=72 skip=1 status=none | \ while read line; do cmd=$(echo ${line} | sed -n "s|^setenv \(.*\)|fw_setenv -c /etc/fw_env.config \1|gp") [ -n "${cmd}" ] && eval ${cmd} done fi fi /usr/lib/coreelec/check-bl301 if [ ${?} = 1 ]; then echo "Found custom CoreELEC BL30, running inject_bl301 tool..." inject_bl301 -Y &>/dev/null fi fi if [ -f ${BOOT_ROOT}/boot.ini ]; then if [ -f /usr/share/bootloader/${DEVICE_BOOT_INI} ]; then echo "Updating boot.ini with ${DEVICE_BOOT_INI}..." cp -p /usr/share/bootloader/${DEVICE_BOOT_INI} ${BOOT_ROOT}/boot.ini sed -e "s/@BOOT_UUID@/${BOOT_UUID}/" \ -e "s/@DISK_UUID@/${DISK_UUID}/" \ -i ${BOOT_ROOT}/boot.ini fi if [ -f /usr/share/bootloader/${DEVICE_BOOT_LOGO} ]; then echo "Updating boot logos with ${DEVICE_BOOT_LOGO}..." cp -p /usr/share/bootloader/${DEVICE_BOOT_LOGO} ${BOOT_ROOT}/boot-logo-1080.bmp.gz fi if [ -f /usr/share/bootloader/${DEVICE_UBOOT} -a -n "${BOOT_DISK}" ]; then echo "Updating u-boot on ${BOOT_DISK} with ${DEVICE_UBOOT}..." dd if=/usr/share/bootloader/${DEVICE_UBOOT} of=${BOOT_DISK} conv=fsync bs=1 count=112 status=none dd if=/usr/share/bootloader/${DEVICE_UBOOT} of=${BOOT_DISK} conv=fsync bs=512 skip=1 seek=1 status=none fi fi mount -o ro,remount ${BOOT_ROOT} # Leave a hint that we just did an update echo "UPDATE" > /storage/.config/boot.hint ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/etc/dbus-1/system.d/coreelec.settings-xdbus-stoploop.conf ================================================ <!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> <busconfig> <policy user="root"> <allow own="com.service.coreelec.settings.xdbus.stoploop"/> </policy> </busconfig> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/etc/lirc/lircd.conf.d/odroid-amremote.conf ================================================ begin remote name odroid_amremote bits 16 flags SPACE_ENC|CONST_LENGTH eps 30 aeps 100 header 9000 4500 one 563 1687 zero 563 562 ptrail 563 repeat 9000 2250 pre_data_bits 16 pre_data 0x4DB2 gap 0 suppress_repeat 1 begin codes KEY_POWER 0x3BC4 KEY_MUTE 0x11EE KEY_HOME 0x41BE KEY_OK 0x738C KEY_LEFT 0x9966 KEY_RIGHT 0x837C KEY_UP 0x53AC KEY_DOWN 0x4BB4 KEY_BACK 0x59A6 KEY_MENU 0xA35C KEY_VOLUMEDOWN 0x817E KEY_VOLUMEUP 0x01FE end codes end remote ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/bin/cputemp ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) TEMP="$(cat /sys/class/thermal/thermal_zone0/temp)" echo "$(( $TEMP / 1000 )) C" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/bin/gputemp ================================================ cputemp ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/lib/coreelec/smp-affinity.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) SMP="../smp_affinity" MESONIR="`find /proc/irq/ -name *meson*ir`" ETH0="`find /proc/irq/ -name eth0`" VDEC0="`find /proc/irq/ -name vdec-0`" VDEC1="`find /proc/irq/ -name vdec-1`" PREDI="`find /proc/irq/ -name pre_di`" AFIFO0="`find /proc/irq/ -name afifo0`" AOCEC="`find /proc/irq/ -name hdmi_aocec*`" USB3="`find /proc/irq/ -name xhci-hcd:usb1`" IRQ="$AOCEC $ETH0 $USB3 $VDEC0 $VDEC1 $AFIFO0 $MESONIR $PREDI" cpu=1 for i in $IRQ; do if [ -f "$i/$SMP" ];then [ ! -d "/sys/devices/system/cpu/cpu$cpu" ] && cpu=1 aff=$((1 << $cpu)) haff=`printf '%x\n' $aff` echo "echo $haff > $i/$SMP" echo $haff > $i/$SMP cpu=$((cpu + 1)) fi done exit 0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/lib/modprobe.d/disable-ir-remotes.conf ================================================ blacklist meson-ir blacklist meson-remote ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/lib/modprobe.d/mali.conf ================================================ options mali mali_shared_mem_size=0x40000000 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/lib/modules-load.d/amlvideodri.conf ================================================ amlvideodri ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/lib/systemd/sleep.conf.d/sleep.conf ================================================ [Sleep] HibernateMode=false ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/lib/systemd/system/smp-affinity.service ================================================ [Unit] Description=Set smp_affinity from script Before=kodi.service After=graphical.target ConditionPathExists=/usr/lib/coreelec/smp-affinity.sh [Service] Type=oneshot ExecStart=-/bin/sh /usr/lib/coreelec/smp-affinity.sh RemainAfterExit=yes [Install] WantedBy=kodi.service ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/lib/systemd/system-shutdown/disk-park.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) function disk_park() { [ -z "$PARK_WAIT" ] && PARK_WAIT="10" echo "disk-park: suspend disks: $PARK_HDD, park time: ${PARK_WAIT}s" >/dev/kmsg wait=0 for dev in /sys/block/sd* ; do [ ! -e $dev ] && continue DEV="${dev##*/}" [ "$(udevadm info --query=all --name=$DEV | awk -F "=" '/ID_MODEL=/{print index($2, "SSD")}')" != "0" ] && continue [ -n "$(hdparm -C /dev/$DEV | grep 'standby')" ] && continue echo "disk-park: suspend disk /dev/$DEV" >/dev/kmsg hdparm -y /dev/$DEV >/dev/null && wait=$PARK_WAIT done if [ "$wait" = "0" ]; then echo "disk-park: no disk got sent to suspend" >/dev/kmsg else sleep $wait fi } [ -e /run/disk-park.dat ] && . /run/disk-park.dat || exit 0 [ -z "$PARK_HDD" ] && exit 0 case "$1" in reboot|post) # do not park disks when rebooting or on suspend resume ;; *) disk_park ;; esac ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/lib/systemd/system-sleep/disk-park.sh ================================================ ../system-shutdown/disk-park.sh ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/lib/systemd/system-sleep/reset_usb_hub.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) case "$1" in pre) # <do something on suspend> ;; post) # <do something on resume> DT_ID=$(dtname) case $DT_ID in *odroid_n2plus*) wol="$(cat /flash/config.ini | awk -F "=" '/^wol=/{gsub(/"|\047/,"",$2); print $2}')" if [ "$wol" == "1" ]; then echo "reset" > /sys/devices/platform/gpio-reset/reset-usb_hub/control fi ;; esac ;; esac ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/lib/udev/rules.d/99-spidev.rules ================================================ KERNEL=="spidev*", SUBSYSTEMS=="spidev", SYMLINK+="spidev0.0" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/lib/udev/rules.d/99-xpadneo.rules ================================================ # XPADNEO UDEV BINDING # by atar-axis (dollinger.florian@gmx.de) # in general those files with a higher leading number are processed # and executed _later_, that means assignment in those files can overwrite # assignments in other rules which are parsed earlier # every block is a rule. rules are collected from the .rules files # according to their name. on every kernel uevent, all rules are # compared to that event - one by one. # kernel versions manual binding (bind/unbind) bind uevent hid_generic greedy hid_microsoft support gamepad method # --------------- ---------------------------- -------------- ------------------ --------------------- ------- ------ # [ ... - 2.6.13 [ no no yes no * rmmod (not supported in xpadneo) # [ 2.6.13 - 4.14 [ yes no yes no * 1: add, hid_generic # [ 4.14 - 4.16 [ yes yes yes no * 2: bind, hid_generc # [ 4.16 - 4.20 [ yes yes no no * automatic # [ 4.20 - ... ] yes yes no yes 02FD 3: bind, microsoft # 02E0 automatic ACTION=="add", \ KERNEL=="0005:045E:02FD.*|0005:045E:02E0.*", \ SUBSYSTEM=="hid", \ RUN:="/bin/sh -c 'echo xpadneo udev: $kernel > /dev/kmsg; modprobe hid_xpadneo; echo $kernel > /sys/bus/hid/drivers/hid-generic/unbind; echo $kernel > /sys/bus/hid/drivers/microsoft/unbind; echo $kernel > /sys/bus/hid/drivers/xpadneo/bind; echo xpadneo udev: ok > /dev/kmsg'" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/sbin/installtointernal ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) message="$message\n There is no working 'installtointernal'." message="$message\n " message="$message\n On CoreELEC -ng releases 'installtointernal' has been replaced" message="$message\n by 'ceemmc'" message="$message\n " message="$message\n Please refer to the following link for more information:" message="$message\n https://discourse.coreelec.org/t/how-to-use-the-team-coreelec-ceemmc-tool/7630" message="$message\n " echo -e $message exit 1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/sbin/update-ce ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present Team CoreELEC (https://coreelec.org) do_cleanup () { echo echo "update canceled" echo cd /storage/.update rm -fr temp } do_reboot () { cd /storage/.update mv temp/* . rmdir temp if [ "${nocompat}" = "nocompat" -o "${nocompat}" = ".nocompat" ]; then touch .nocompat fi echo -e "\nsyncing...\n" sync echo -e "rebooting...\n" reboot exit 0 } show_error () { do_cleanup sync echo -e "\ndownload error...\n" exit 1 } function ctrl_c() { echo do_cleanup exit 1 } trap ctrl_c INT url="${1}" file=$(readlink -f "${1}") # get full path nocompat="${2}" mkdir -p /storage/.update/temp cd /storage/.update/temp echo case "${url}" in https://mega\.nz/*) echo megadl "${url}" [ $? -eq 0 ] && do_reboot || show_error ;; *://*) case "${url}" in *\.tar|*\.img.gz) curl -f -L -O "${url}" [ $? -eq 0 ] && do_reboot || show_error ;; *) echo echo "error: wrong url format <${url}>" echo exit 1 ;; esac ;; *) if [ -n "${file}" ]; then if [ -f "${file}" ]; then case "${file}" in *\.tar|*\.img.gz) echo -e "\ncopying file ${file}" cp "${file}" . [ $? -eq 0 ] && do_reboot || show_error ;; *) echo echo "error: wrong file format <${file}>" echo exit 1 ;; esac else echo echo "error: file <${file}> does not exist" echo exit 1 fi fi echo echo "update-ce: missing url" echo echo "Usage: update-ce <url> [nocompat]" echo " <url> mega/http/ftp url or local file .tar or .img.gz" echo " [nocompat] disable compatibility checks and risk a non-booting system" echo exit 1 ;; esac ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/share/alsa/cards/AML-AUGESOUND.conf ================================================ # # Configuration for Amlogic AUGE Audio # AML-AUGESOUND.pcm.default { @args [ CARD ] @args.CARD { type string } type softvol slave.pcm { type plug slave { pcm { type hw card $CARD device 1 } } } control { name "PCM Playback Volume" card $CARD } } <confdir:pcm/surround71.conf> AML-AUGESOUND.pcm.surround71.0 { @args [ CARD ] @args.CARD { type string } type softvol slave.pcm { type plug slave { pcm { type hw card $CARD device 3 } } } control { name "LPCM Playback Volume" card $CARD } } <confdir:pcm/hdmi.conf> AML-AUGESOUND.pcm.hdmi.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type hooks slave.pcm { type hw card $CARD device 0 format S16_LE } hooks.0 { type ctl_elems hook_args [ { interface MIXER name "IEC958 Playback Default" lock true preserve true optional true value [ $AES0 $AES1 $AES2 $AES3 ] } ] } } <confdir:pcm/iec958.conf> AML-AUGESOUND.pcm.iec958.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type hooks slave.pcm { type hw card $CARD device 2 format S16_LE } hooks.0 { type ctl_elems hook_args [ { interface MIXER name "IEC958 Playback Default" lock true preserve true optional true value [ $AES0 $AES1 $AES2 $AES3 ] } ] } } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/filesystem/usr/share/alsa/cards/AML-MESONAUDIO.conf ================================================ # # Configuration for Amlogic MESONAUDIO Audio # AML-MESONAUDIO.pcm.default { @args [ CARD ] @args.CARD { type string } type softvol slave.pcm { type plug slave { pcm { type hw card $CARD device 0 } } } control { name "PCM Playback Volume" card $CARD } } <confdir:pcm/hdmi.conf> AML-MESONAUDIO.pcm.hdmi.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type hooks slave.pcm { type hw card $CARD device 1 format S16_LE } hooks.0 { type ctl_elems hook_args [ { interface MIXER name "IEC958 Playback Default" lock true preserve true optional true value [ $AES0 $AES1 $AES2 $AES3 ] } ] } } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/initramfs/platform_init ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) display_mode=$(cat /sys/class/display/mode) # default values display_mode_user="1080p60hz" frac_rate_policy_user="0" for arg in $(cat /proc/cmdline); do case ${arg} in frac_rate_policy=*) frac_rate_policy_user=${arg#*=} ;; vout=*) vout=${arg#*=} display_mode_user=${vout%%,*} # implementation not yet finished by Amlogic #frac_rate_policy_user="0" #if [ -z ${vout##*frac*} ]; then # frac_rate_policy_user="1" #fi ;; esac done # Enable HDMI output if cable is connected and not already enabled by u-boot if [ "$(cat /sys/class/amhdmitx/amhdmitx0/hpd_state)" != "0" ]; then frac_rate_policy=$(cat /sys/devices/virtual/amhdmitx/amhdmitx0/frac_rate_policy) if [ "${frac_rate_policy}" != "${frac_rate_policy_user}" ]; then display_mode="null" echo "${display_mode}" > /sys/class/display/mode echo "${frac_rate_policy_user}" > /sys/devices/virtual/amhdmitx/amhdmitx0/frac_rate_policy fi if [ "${display_mode}" != "${display_mode_user}" ]; then echo "${display_mode_user}" > /sys/class/display/mode display_mode="${display_mode_user}" fi fi # Set framebuffer geometry to match the resolution case ${display_mode} in *x*) RES=${display_mode%%[ip]*} X=${RES%%x*} Y=${RES##*x};; 480*) X=720 Y=480 ;; 576*) X=720 Y=576 ;; 720p*) X=1280 Y=720 ;; 2160p*) X=3840 Y=2160 ;; *) X=1920 Y=1080 ;; esac Y_VIRT=$((${Y} * 2)) fbset -fb /dev/fb0 -g ${X} ${Y} ${X} ${Y_VIRT} 32 # Enable framebuffer device echo 0 > /sys/class/graphics/fb0/blank ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/kodi/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8" ?> <settings version="1"> <section id="system"> <category id="display"> <group id="1"> <setting id="videoscreen.limitedrange"> <visible>false</visible> </setting> </group> </category> <category id="audio"> <group id="1"> <setting id="audiooutput.config"> <default>3</default> </setting> <setting id="audiooutput.streamnoise"> <default>false</default> </setting> <setting id="audiooutput.audiodevice"> <default>ALSA:surround71:CARD=AMLAUGESOUND,DEV=0</default> </setting> </group> </category> </section> <section id="player"> <category id="videoplayer"> <group id="2"> <setting id="videoplayer.adjustrefreshrate"> <default>2</default> <!-- ADJUST_REFRESHRATE_ON_STARTSTOP --> <constraints> <options> <option label="351">0</option> <!-- ADJUST_REFRESHRATE_OFF --> <option label="36036">2</option> <!-- ADJUST_REFRESHRATE_ON_STARTSTOP --> <option label="36050">3</option> <!-- ADJUST_REFRESHRATE_ON_START --> </options> </constraints> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/linux/linux.aarch64.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm64 5.15.153 Kernel Configuration # CONFIG_CC_VERSION_TEXT="aarch64-libreelec-linux-gnu-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=128 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION_AUTO=y CONFIG_BUILD_SALT="" CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="EmuELEC" CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y CONFIG_WATCH_QUEUE=y CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set CONFIG_AUDIT=y CONFIG_HAVE_ARCH_AUDITSYSCALL=y CONFIG_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_IRQ_IPI=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_IRQ_MSI_IOMMU=y CONFIG_HANDLE_DOMAIN_IRQ=y CONFIG_ARCH_WANTS_IRQ_RAW=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y # CONFIG_BPF_JIT_ALWAYS_ON is not set CONFIG_BPF_JIT_DEFAULT_ON=y # CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_BPF_PRELOAD is not set # CONFIG_BPF_LSM is not set # end of BPF subsystem # CONFIG_PREEMPT_NONE is not set # CONFIG_PREEMPT_VOLUNTARY is not set CONFIG_PREEMPT=y CONFIG_PREEMPT_COUNT=y CONFIG_PREEMPTION=y # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_SCHED_AVG_IRQ=y CONFIG_SCHED_THERMAL_PRESSURE=y # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_TASKSTATS=y CONFIG_TASK_DELAY_ACCT=y CONFIG_TASK_XACCT=y CONFIG_TASK_IO_ACCOUNTING=y # CONFIG_PSI is not set # end of CPU/Task time and stats accounting # CONFIG_CPU_ISOLATION is not set # # RCU Subsystem # CONFIG_TREE_RCU=y CONFIG_PREEMPT_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_RCU=y CONFIG_TASKS_RUDE_RCU=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y CONFIG_RCU_BOOT_END_DELAY=20000 # end of RCU Subsystem CONFIG_IKCONFIG=m CONFIG_IKCONFIG_PROC=y CONFIG_IKHEADERS=y CONFIG_LOG_BUF_SHIFT=19 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 # CONFIG_PRINTK_INDEX is not set CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # # end of Scheduler features CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_CC_HAS_INT128=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y CONFIG_MEMCG=y CONFIG_MEMCG_SWAP=y CONFIG_MEMCG_KMEM=y # CONFIG_BLK_CGROUP is not set CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y # CONFIG_CFS_BANDWIDTH is not set CONFIG_RT_GROUP_SCHED=y CONFIG_CGROUP_PIDS=y CONFIG_CGROUP_RDMA=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y # CONFIG_CGROUP_PERF is not set CONFIG_CGROUP_BPF=y CONFIG_CGROUP_MISC=y # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_TIME_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_RT_SOFTINT_OPTIMIZATION is not set # CONFIG_SYSFS_DEPRECATED is not set # CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="" # CONFIG_INITRAMFS_FORCE is not set CONFIG_RD_GZIP=y CONFIG_RD_BZIP2=y CONFIG_RD_LZMA=y CONFIG_RD_XZ=y CONFIG_RD_LZO=y CONFIG_RD_LZ4=y CONFIG_RD_ZSTD=y # CONFIG_BOOT_CONFIG is not set CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y # CONFIG_EXPERT is not set CONFIG_UID16=y CONFIG_MULTIUSER=y CONFIG_SYSFS_SYSCALL=y CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_HAVE_FUTEX_CMPXCHG=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y 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 CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_BASE_RELATIVE=y # CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_EMBEDDED is not set CONFIG_HAVE_PERF_EVENTS=y # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLUB_DEBUG=y # CONFIG_COMPAT_BRK is not set # CONFIG_SLAB is not set CONFIG_SLUB=y CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set CONFIG_SLUB_CPU_PARTIAL=y CONFIG_SYSTEM_DATA_VERIFICATION=y CONFIG_PROFILING=y CONFIG_TRACEPOINTS=y # end of General setup CONFIG_ARM64=y CONFIG_64BIT=y CONFIG_MMU=y CONFIG_ARM64_PAGE_SHIFT=12 CONFIG_ARM64_CONT_PTE_SHIFT=4 CONFIG_ARM64_CONT_PMD_SHIFT=4 CONFIG_ARCH_MMAP_RND_BITS_MIN=18 CONFIG_ARCH_MMAP_RND_BITS_MAX=24 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_STACKTRACE_SUPPORT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_LOCKDEP_SUPPORT=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CSUM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y CONFIG_SMP=y CONFIG_KERNEL_MODE_NEON=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_PGTABLE_LEVELS=3 CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_ARCH_PROC_KCORE_TEXT=y # # Platform selection # # CONFIG_ARCH_ACTIONS is not set # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_APPLE is not set # CONFIG_ARCH_BCM2835 is not set # CONFIG_ARCH_BCM4908 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_SPARX5 is not set # CONFIG_ARCH_K3 is not set # CONFIG_ARCH_LAYERSCAPE is not set # CONFIG_ARCH_LG1K is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_KEEMBAY is not set # CONFIG_ARCH_MEDIATEK is not set CONFIG_ARCH_MESON=y # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_MXC is not set # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_REALTEK is not set # CONFIG_ARCH_RENESAS is not set # CONFIG_ARCH_ROCKCHIP is not set # CONFIG_ARCH_S32 is not set # CONFIG_ARCH_SEATTLE is not set # CONFIG_ARCH_INTEL_SOCFPGA is not set # CONFIG_ARCH_SYNQUACER is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_SPRD is not set # CONFIG_ARCH_THUNDER is not set # CONFIG_ARCH_THUNDER2 is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_VISCONTI is not set # CONFIG_ARCH_XGENE is not set # CONFIG_ARCH_ZYNQMP is not set # end of Platform selection # # Kernel Features # # # ARM errata workarounds via the alternatives framework # CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y CONFIG_ARM64_ERRATUM_826319=y CONFIG_ARM64_ERRATUM_827319=y CONFIG_ARM64_ERRATUM_824069=y CONFIG_ARM64_ERRATUM_819472=y CONFIG_ARM64_ERRATUM_832075=y CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y CONFIG_ARM64_ERRATUM_1024718=y CONFIG_ARM64_ERRATUM_1418040=y CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y CONFIG_ARM64_ERRATUM_1165522=y CONFIG_ARM64_ERRATUM_1319367=y CONFIG_ARM64_ERRATUM_1530923=y CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y CONFIG_ARM64_ERRATUM_2441007=y CONFIG_ARM64_ERRATUM_1286807=y CONFIG_ARM64_ERRATUM_1463225=y CONFIG_ARM64_ERRATUM_1508412=y CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE=y CONFIG_ARM64_ERRATUM_2054223=y CONFIG_ARM64_ERRATUM_2067961=y CONFIG_ARM64_ERRATUM_2441009=y CONFIG_ARM64_ERRATUM_2457168=y CONFIG_CAVIUM_ERRATUM_22375=y CONFIG_CAVIUM_ERRATUM_23154=y CONFIG_FUJITSU_ERRATUM_010001=y CONFIG_HISILICON_ERRATUM_161600802=y CONFIG_QCOM_FALKOR_ERRATUM_1003=y CONFIG_QCOM_FALKOR_ERRATUM_1009=y CONFIG_QCOM_QDF2400_ERRATUM_0065=y CONFIG_QCOM_FALKOR_ERRATUM_E1041=y # CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set CONFIG_SOCIONEXT_SYNQUACER_PREITS=y # end of ARM errata workarounds via the alternatives framework CONFIG_ARM64_4K_PAGES=y # CONFIG_ARM64_16K_PAGES is not set # CONFIG_ARM64_64K_PAGES is not set CONFIG_ARM64_VA_BITS_39=y # CONFIG_ARM64_VA_BITS_48 is not set CONFIG_ARM64_VA_BITS=39 CONFIG_ARM64_PA_BITS_48=y CONFIG_ARM64_PA_BITS=48 # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_CPU_LITTLE_ENDIAN=y CONFIG_SCHED_MC=y # CONFIG_SCHED_SMT is not set CONFIG_NR_CPUS=8 CONFIG_HOTPLUG_CPU=y # CONFIG_NUMA is not set # CONFIG_HZ_100 is not set CONFIG_HZ_250=y # CONFIG_HZ_300 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=250 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_HW_PERF_EVENTS=y CONFIG_CC_HAVE_SHADOW_CALL_STACK=y # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_KEXEC is not set # CONFIG_KEXEC_FILE is not set # CONFIG_CRASH_DUMP is not set # CONFIG_XEN is not set CONFIG_FORCE_MAX_ZONEORDER=11 CONFIG_UNMAP_KERNEL_AT_EL0=y CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y CONFIG_RODATA_FULL_DEFAULT_ENABLED=y CONFIG_ARM64_SW_TTBR0_PAN=y CONFIG_ARM64_TAGGED_ADDR_ABI=y CONFIG_COMPAT=y CONFIG_KUSER_HELPERS=y CONFIG_ARMV8_DEPRECATED=y CONFIG_SWP_EMULATION=y CONFIG_CP15_BARRIER_EMULATION=y CONFIG_SETEND_EMULATION=y # # ARMv8.1 architectural features # CONFIG_ARM64_HW_AFDBM=y CONFIG_ARM64_PAN=y CONFIG_AS_HAS_LDAPR=y CONFIG_AS_HAS_LSE_ATOMICS=y CONFIG_ARM64_LSE_ATOMICS=y CONFIG_ARM64_USE_LSE_ATOMICS=y # end of ARMv8.1 architectural features # # ARMv8.2 architectural features # # CONFIG_ARM64_PMEM is not set CONFIG_ARM64_RAS_EXTN=y CONFIG_ARM64_CNP=y # end of ARMv8.2 architectural features # # ARMv8.3 architectural features # CONFIG_ARM64_PTR_AUTH=y CONFIG_ARM64_PTR_AUTH_KERNEL=y CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y CONFIG_AS_HAS_PAC=y CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y # end of ARMv8.3 architectural features # # ARMv8.4 architectural features # CONFIG_ARM64_AMU_EXTN=y CONFIG_AS_HAS_ARMV8_4=y CONFIG_ARM64_TLB_RANGE=y CONFIG_ARM64_MPAM=y # end of ARMv8.4 architectural features # # ARMv8.5 architectural features # CONFIG_AS_HAS_ARMV8_5=y # CONFIG_ARM64_BTI is not set CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y # CONFIG_ARM64_E0PD is not set # CONFIG_ARCH_RANDOM is not set CONFIG_ARM64_AS_HAS_MTE=y CONFIG_ARM64_MTE=y # end of ARMv8.5 architectural features # # ARMv8.7 architectural features # # CONFIG_ARM64_EPAN is not set # end of ARMv8.7 architectural features CONFIG_ARM64_SVE=y CONFIG_ARM64_MODULE_PLTS=y # CONFIG_ARM64_PSEUDO_NMI is not set CONFIG_RELOCATABLE=y CONFIG_RANDOMIZE_BASE=y CONFIG_RANDOMIZE_MODULE_REGION_FULL=y CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y CONFIG_STACKPROTECTOR_PER_TASK=y # end of Kernel Features # # Boot options # CONFIG_CMDLINE="systemd.show_status=auto" # CONFIG_CMDLINE_FROM_BOOTLOADER is not set CONFIG_CMDLINE_EXTEND=y # CONFIG_CMDLINE_FORCE is not set # CONFIG_EFI is not set # end of Boot options CONFIG_SYSVIPC_COMPAT=y # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set CONFIG_PM_WAKELOCKS=y CONFIG_PM_WAKELOCKS_LIMIT=100 # CONFIG_PM_WAKELOCKS_GC is not set CONFIG_PM=y CONFIG_PM_DEBUG=y # CONFIG_PM_ADVANCED_DEBUG is not set # CONFIG_PM_TEST_SUSPEND is not set CONFIG_PM_SLEEP_DEBUG=y CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_PM_GENERIC_DOMAINS_SLEEP=y CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y CONFIG_ENERGY_MODEL=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y # end of Power management options # # CPU Power Management # # # CPU Idle # 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 # # ARM CPU Idle Drivers # CONFIG_ARM_CPUIDLE=y CONFIG_ARM_PSCI_CPUIDLE=y CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y # end of ARM CPU Idle Drivers # end of CPU Idle # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y CONFIG_CPU_FREQ_TIMES=y CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_GOV_USERSPACE is not set CONFIG_CPU_FREQ_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set # # CPU frequency scaling drivers # # CONFIG_CPUFREQ_DT is not set # CONFIG_CPUFREQ_DUMMY is not set CONFIG_ARM_SCPI_CPUFREQ=y # end of CPU Frequency scaling # end of CPU Power Management CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set CONFIG_ARM64_CRYPTO=y CONFIG_CRYPTO_SHA256_ARM64=y # CONFIG_CRYPTO_SHA512_ARM64 is not set CONFIG_CRYPTO_SHA1_ARM64_CE=y CONFIG_CRYPTO_SHA2_ARM64_CE=y # CONFIG_CRYPTO_SHA512_ARM64_CE is not set # CONFIG_CRYPTO_SHA3_ARM64 is not set # CONFIG_CRYPTO_SM3_ARM64_CE is not set # CONFIG_CRYPTO_SM4_ARM64_CE is not set CONFIG_CRYPTO_GHASH_ARM64_CE=y # CONFIG_CRYPTO_POLYVAL_ARM64_CE is not set # CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set CONFIG_CRYPTO_AES_ARM64=y CONFIG_CRYPTO_AES_ARM64_CE=y # CONFIG_CRYPTO_AES_ARM64_CE_CCM is not set CONFIG_CRYPTO_AES_ARM64_CE_BLK=y # CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set CONFIG_CRYPTO_CHACHA20_NEON=y CONFIG_CRYPTO_POLY1305_NEON=y # CONFIG_CRYPTO_NHPOLY1305_NEON is not set # CONFIG_CRYPTO_AES_ARM64_BS is not set # # General architecture-dependent options # CONFIG_CRASH_CORE=y CONFIG_KPROBES=y CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set CONFIG_UPROBES=y CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_KRETPROBES=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_KEEPINITRD=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y CONFIG_MMU_GATHER_TABLE_FREE=y CONFIG_MMU_GATHER_RCU_TABLE_FREE=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y CONFIG_ARCH_SUPPORTS_LTO_CLANG=y CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y CONFIG_LTO_NONE=y CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_CONTEXT_TRACKING=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=18 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y # CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_COMPILER_H=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_HAS_RELR=y CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # CONFIG_GCC_PLUGIN_RANDSTRUCT is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set CONFIG_MODVERSIONS=y CONFIG_ASM_MODVERSIONS=y # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SCMVERSION is not set # CONFIG_MODULE_SIG is not set CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_GZIP is not set # CONFIG_MODULE_COMPRESS_XZ is not set # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/usr/sbin/modprobe" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLK_DEV_BSG_COMMON=y # CONFIG_BLK_DEV_BSGLIB is not set CONFIG_BLK_DEV_INTEGRITY=y CONFIG_BLK_DEV_INTEGRITY_T10=y # CONFIG_BLK_DEV_ZONED is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_DEBUG_FS is not set # CONFIG_BLK_SED_OPAL is not set CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y # # Partition Types # # CONFIG_PARTITION_ADVANCED is not set CONFIG_MSDOS_PARTITION=y CONFIG_EFI_PARTITION=y # end of Partition Types CONFIG_BLOCK_COMPAT=y CONFIG_BLK_MQ_PCI=y CONFIG_BLK_PM=y CONFIG_BLOCK_HOLDER_DEPRECATED=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y # CONFIG_IOSCHED_BFQ is not set # end of IO Schedulers CONFIG_ASN1=y CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y CONFIG_QUEUED_SPINLOCKS=y CONFIG_ARCH_USE_QUEUED_RWLOCKS=y CONFIG_QUEUED_RWLOCKS=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y CONFIG_GKI_HIDDEN_DRM_CONFIGS=y # CONFIG_GKI_HIDDEN_REGMAP_CONFIGS is not set # CONFIG_GKI_HIDDEN_CRYPTO_CONFIGS is not set # CONFIG_GKI_HIDDEN_SND_CONFIGS is not set # CONFIG_GKI_HIDDEN_SND_SOC_CONFIGS is not set # CONFIG_GKI_HIDDEN_MMC_CONFIGS is not set # CONFIG_GKI_HIDDEN_GPIO_CONFIGS is not set # CONFIG_GKI_HIDDEN_QCOM_CONFIGS is not set # CONFIG_GKI_HIDDEN_MEDIA_CONFIGS is not set # CONFIG_GKI_HIDDEN_VIRTUAL_CONFIGS is not set # CONFIG_GKI_LEGACY_WEXT_ALLCONFIG is not set # CONFIG_GKI_HIDDEN_USB_CONFIGS is not set # CONFIG_GKI_HIDDEN_SOC_BUS_CONFIGS is not set # CONFIG_GKI_HIDDEN_RPMSG_CONFIGS is not set # CONFIG_GKI_HIDDEN_GPU_CONFIGS is not set # CONFIG_GKI_HIDDEN_IRQ_CONFIGS is not set # CONFIG_GKI_HIDDEN_HYPERVISOR_CONFIGS is not set # CONFIG_GKI_HIDDEN_NET_CONFIGS is not set # CONFIG_GKI_HIDDEN_PHY_CONFIGS is not set # CONFIG_GKI_HIDDEN_MM_CONFIGS is not set # CONFIG_GKI_HIDDEN_ETHERNET_CONFIGS is not set # CONFIG_GKI_HIDDEN_DMA_CONFIGS is not set # CONFIG_GKI_HACKS_TO_FIX is not set CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ARCH_BINFMT_ELF_STATE=y CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y CONFIG_ARCH_HAVE_ELF_PROT=y CONFIG_ARCH_USE_GNU_PROPERTY=y CONFIG_ELFCORE=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set CONFIG_BINFMT_SCRIPT=y # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y CONFIG_ARCH_KEEP_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_COMPACTION=y CONFIG_PAGE_REPORTING=y CONFIG_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set # CONFIG_TRANSPARENT_HUGEPAGE is not set # CONFIG_CLEANCACHE is not set # CONFIG_FRONTSWAP is not set CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set CONFIG_CMA_DEBUGFS=y CONFIG_CMA_SYSFS=y CONFIG_CMA_AREAS=12 # CONFIG_ZPOOL is not set CONFIG_ZSMALLOC=y # CONFIG_ZSMALLOC_STAT is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_ARCH_HAS_PTE_DEVMAP=y CONFIG_ZONE_DMA=y CONFIG_ZONE_DMA32=y CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y CONFIG_SECRETMEM=y CONFIG_ARCH_HAS_IOREMAP_PHYS_HOOKS=y # CONFIG_ANON_VMA_NAME is not set # CONFIG_LRU_GEN is not set # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring CONFIG_ARCH_SUPPORTS_SPECULATIVE_PAGE_FAULT=y CONFIG_SPECULATIVE_PAGE_FAULT=y # end of Memory Management options CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y CONFIG_NET_INGRESS=y CONFIG_NET_EGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=m CONFIG_XFRM_USER=m CONFIG_XFRM_INTERFACE=m # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set CONFIG_XFRM_STATISTICS=y CONFIG_XFRM_AH=m CONFIG_XFRM_ESP=m CONFIG_XFRM_IPCOMP=m CONFIG_NET_KEY=m # CONFIG_NET_KEY_MIGRATE is not set CONFIG_XDP_SOCKETS=y # CONFIG_XDP_SOCKETS_DIAG is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set CONFIG_NET_IPGRE_DEMUX=m CONFIG_NET_IP_TUNNEL=m # CONFIG_NET_IPGRE is not set # CONFIG_IP_MROUTE is not set # CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m # CONFIG_NET_FOU is not set # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set CONFIG_INET_ESP=m # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=m CONFIG_INET_DIAG=m CONFIG_INET_TCP_DIAG=m CONFIG_INET_UDP_DIAG=m # CONFIG_INET_RAW_DIAG is not set CONFIG_INET_DIAG_DESTROY=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y CONFIG_IPV6_OPTIMISTIC_DAD=y CONFIG_INET6_AH=m CONFIG_INET6_ESP=m # CONFIG_INET6_ESP_OFFLOAD is not set # CONFIG_INET6_ESPINTCP is not set CONFIG_INET6_IPCOMP=m CONFIG_IPV6_MIP6=m # CONFIG_IPV6_ILA is not set CONFIG_INET6_XFRM_TUNNEL=m CONFIG_INET6_TUNNEL=m # CONFIG_IPV6_VTI is not set CONFIG_IPV6_SIT=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_GRE is not set CONFIG_IPV6_MULTIPLE_TABLES=y # CONFIG_IPV6_SUBTREES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set # CONFIG_NETLABEL is not set # CONFIG_MPTCP is not set CONFIG_NETWORK_SECMARK=y CONFIG_NET_PTP_CLASSIFY=y # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_FAMILY_BRIDGE=y CONFIG_NETFILTER_FAMILY_ARP=y # CONFIG_NETFILTER_NETLINK_ACCT is not set CONFIG_NETFILTER_NETLINK_QUEUE=m CONFIG_NETFILTER_NETLINK_LOG=m # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=m CONFIG_NF_LOG_SYSLOG=m CONFIG_NETFILTER_CONNCOUNT=m CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_SECMARK=y # CONFIG_NF_CONNTRACK_ZONES is not set # CONFIG_NF_CONNTRACK_PROCFS is not set CONFIG_NF_CONNTRACK_EVENTS=y # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_GRE=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set # CONFIG_NF_CONNTRACK_IRC is not set CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m # CONFIG_NF_CONNTRACK_SNMP is not set CONFIG_NF_CONNTRACK_PPTP=m # CONFIG_NF_CONNTRACK_SANE is not set # CONFIG_NF_CONNTRACK_SIP is not set CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m # CONFIG_NETFILTER_NETLINK_GLUE_CT is not set CONFIG_NF_NAT=m 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 CONFIG_NETFILTER_XTABLES_COMPAT=y # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m CONFIG_NETFILTER_XT_CONNMARK=m # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_AUDIT is not set # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m CONFIG_NETFILTER_XT_TARGET_CT=m # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m CONFIG_NETFILTER_XT_TARGET_NETMAP=m # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set CONFIG_NETFILTER_XT_TARGET_NOTRACK=m # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set CONFIG_NETFILTER_XT_TARGET_TRACE=m # CONFIG_NETFILTER_XT_TARGET_SECMARK is not set CONFIG_NETFILTER_XT_TARGET_TCPMSS=m # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m CONFIG_NETFILTER_XT_MATCH_BPF=m # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m CONFIG_NETFILTER_XT_MATCH_CONNMARK=m CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set CONFIG_NETFILTER_XT_MATCH_ECN=m # CONFIG_NETFILTER_XT_MATCH_ESP is not set CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m CONFIG_NETFILTER_XT_MATCH_HELPER=m CONFIG_NETFILTER_XT_MATCH_HL=m # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set CONFIG_NETFILTER_XT_MATCH_IPRANGE=m CONFIG_NETFILTER_XT_MATCH_IPVS=m CONFIG_NETFILTER_XT_MATCH_L2TP=m CONFIG_NETFILTER_XT_MATCH_LENGTH=m CONFIG_NETFILTER_XT_MATCH_LIMIT=m CONFIG_NETFILTER_XT_MATCH_MAC=m CONFIG_NETFILTER_XT_MATCH_MARK=m CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set CONFIG_NETFILTER_XT_MATCH_OWNER=m # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA2 is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set CONFIG_NETFILTER_XT_MATCH_STATE=m # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set CONFIG_NETFILTER_XT_MATCH_TCPMSS=m # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set CONFIG_IP_VS=m CONFIG_IP_VS_IPV6=y # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # CONFIG_IP_VS_PROTO_ESP is not set # CONFIG_IP_VS_PROTO_AH is not set # CONFIG_IP_VS_PROTO_SCTP is not set # # IPVS scheduler # CONFIG_IP_VS_RR=m # CONFIG_IP_VS_WRR is not set # CONFIG_IP_VS_LC is not set # CONFIG_IP_VS_WLC is not set # CONFIG_IP_VS_FO is not set # CONFIG_IP_VS_OVF is not set # CONFIG_IP_VS_LBLC is not set # CONFIG_IP_VS_LBLCR is not set # CONFIG_IP_VS_DH is not set # CONFIG_IP_VS_SH is not set # CONFIG_IP_VS_MH is not set # CONFIG_IP_VS_SED is not set # CONFIG_IP_VS_NQ is not set # CONFIG_IP_VS_TWOS is not set # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS MH scheduler # CONFIG_IP_VS_MH_TAB_INDEX=12 # # IPVS application helper # CONFIG_IP_VS_FTP=m CONFIG_IP_VS_NFCT=y # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m CONFIG_NF_SOCKET_IPV4=m CONFIG_NF_TPROXY_IPV4=m # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set CONFIG_NF_REJECT_IPV4=m CONFIG_NF_NAT_PPTP=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set CONFIG_IP_NF_MATCH_ECN=m # CONFIG_IP_NF_MATCH_RPFILTER is not set CONFIG_IP_NF_MATCH_TTL=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_NETMAP=m CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set CONFIG_IP_NF_RAW=m CONFIG_IP_NF_SECURITY=m CONFIG_IP_NF_ARPTABLES=m CONFIG_IP_NF_ARPFILTER=m CONFIG_IP_NF_ARP_MANGLE=m # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m CONFIG_NF_LOG_IPV6=m CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_MATCH_SRH is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set # CONFIG_IP6_NF_SECURITY is not set CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m # CONFIG_IP6_NF_TARGET_NPT is not set # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_CONNTRACK_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_L2TP=m CONFIG_L2TP_DEBUGFS=m CONFIG_L2TP_V3=y CONFIG_L2TP_IP=m CONFIG_L2TP_ETH=m CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y # CONFIG_BRIDGE_MRP is not set # CONFIG_BRIDGE_CFM is not set # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_HTB=y # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set CONFIG_NET_SCH_NETEM=y # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set # CONFIG_NET_SCH_FQ_CODEL is not set # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set CONFIG_NET_SCH_INGRESS=y # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set # CONFIG_NET_SCH_DEFAULT is not set # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set CONFIG_NET_CLS_U32=y # CONFIG_CLS_U32_PERF is not set # CONFIG_CLS_U32_MARK is not set # CONFIG_NET_CLS_FLOW is not set # CONFIG_NET_CLS_CGROUP is not set CONFIG_NET_CLS_BPF=y # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 # CONFIG_NET_EMATCH_CMP is not set # CONFIG_NET_EMATCH_NBYTE is not set CONFIG_NET_EMATCH_U32=y # CONFIG_NET_EMATCH_META is not set # CONFIG_NET_EMATCH_TEXT is not set # CONFIG_NET_EMATCH_IPT is not set CONFIG_NET_CLS_ACT=y # CONFIG_NET_ACT_POLICE is not set # CONFIG_NET_ACT_GACT is not set # CONFIG_NET_ACT_MIRRED is not set # CONFIG_NET_ACT_SAMPLE is not set # CONFIG_NET_ACT_IPT is not set # CONFIG_NET_ACT_NAT is not set # CONFIG_NET_ACT_PEDIT is not set # CONFIG_NET_ACT_SIMP is not set # CONFIG_NET_ACT_SKBEDIT is not set # CONFIG_NET_ACT_CSUM is not set # CONFIG_NET_ACT_MPLS is not set # CONFIG_NET_ACT_VLAN is not set # CONFIG_NET_ACT_BPF is not set # CONFIG_NET_ACT_CONNMARK is not set # CONFIG_NET_ACT_CTINFO is not set # CONFIG_NET_ACT_SKBMOD is not set # CONFIG_NET_ACT_IFE is not set # CONFIG_NET_ACT_TUNNEL_KEY is not set # CONFIG_NET_ACT_GATE is not set # CONFIG_NET_TC_SKB_EXT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set CONFIG_NET_L3_MASTER_DEV=y # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set # CONFIG_PCPU_DEV_REFCNT is not set CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y # CONFIG_CGROUP_NET_PRIO is not set # CONFIG_CGROUP_NET_CLASSID is not set CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_STREAM_PARSER is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # end of Network testing # end of Networking options # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=m CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y # CONFIG_BT_BNEP is not set CONFIG_BT_HIDP=m CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_LEDS is not set # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set # CONFIG_BT_DEBUGFS is not set # CONFIG_BT_SELFTEST is not set # # Bluetooth device drivers # 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_MTK=y CONFIG_BT_HCIBTUSB_RTL=y # CONFIG_BT_HCIBTSDIO is not set 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 CONFIG_BT_HCIBPA10X=m CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIVHCI=m CONFIG_BT_MRVL=m CONFIG_BT_MRVL_SDIO=m CONFIG_BT_ATH3K=m # CONFIG_BT_MTKSDIO is not set # CONFIG_BT_MTKUART is not set # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=y # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y # CONFIG_CFG80211_DEFAULT_PS is not set # CONFIG_CFG80211_DEBUGFS is not set CONFIG_CFG80211_CRDA_SUPPORT=y # CONFIG_CFG80211_WEXT is not set CONFIG_MAC80211=y CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" CONFIG_MAC80211_MESH=y CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=y CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_PAGE_POOL=y # CONFIG_FAILOVER is not set # CONFIG_ETHTOOL_NETLINK is not set # # Device Drivers # CONFIG_ARM_AMBA=y CONFIG_HAVE_PCI=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y CONFIG_PCI_DOMAINS_GENERIC=y CONFIG_PCI_SYSCALL=y CONFIG_PCIEPORTBUS=y # CONFIG_PCIEAER is not set CONFIG_PCIEASPM=y CONFIG_PCIEASPM_DEFAULT=y # CONFIG_PCIEASPM_POWERSAVE is not set # CONFIG_PCIEASPM_POWER_SUPERSAVE is not set # CONFIG_PCIEASPM_PERFORMANCE is not set CONFIG_PCIE_PME=y # CONFIG_PCIE_PTM is not set CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y CONFIG_PCI_QUIRKS=y # CONFIG_PCI_DEBUG is not set # CONFIG_PCI_STUB is not set # CONFIG_PCI_IOV is not set # CONFIG_PCI_PRI is not set # CONFIG_PCI_PASID is not set # CONFIG_HOTPLUG_PCI is not set # # PCI controller drivers # # CONFIG_PCI_FTPCI100 is not set # CONFIG_PCI_HOST_GENERIC is not set # CONFIG_PCIE_XILINX is not set # CONFIG_PCI_XGENE is not set # CONFIG_PCIE_ALTERA is not set # CONFIG_PCI_HOST_THUNDER_PEM is not set # CONFIG_PCI_HOST_THUNDER_ECAM is not set # CONFIG_PCIE_MICROCHIP_HOST is not set # # DesignWare PCI Core Support # CONFIG_PCIE_DW=y CONFIG_PCIE_DW_HOST=y CONFIG_PCIE_DW_PLAT=y CONFIG_PCIE_DW_PLAT_HOST=y # CONFIG_PCIE_DW_PLAT_EP is not set # CONFIG_PCI_HISI is not set # CONFIG_PCIE_KIRIN is not set # CONFIG_PCI_MESON is not set # CONFIG_PCIE_AL is not set # end of DesignWare PCI Core Support # # Mobiveil PCIe Core Support # # end of Mobiveil PCIe Core Support # # Cadence PCIe controllers support # # CONFIG_PCIE_CADENCE_PLAT_HOST is not set # CONFIG_PCIE_CADENCE_PLAT_EP is not set # CONFIG_PCI_J721E_HOST is not set # CONFIG_PCI_J721E_EP is not set # end of Cadence PCIe controllers support # end of PCI controller drivers # # PCI Endpoint # CONFIG_PCI_ENDPOINT=y # CONFIG_PCI_ENDPOINT_CONFIGFS is not set # CONFIG_PCI_EPF_TEST is not set # CONFIG_PCI_EPF_NTB is not set # CONFIG_PCI_EPF_VNTB is not set # end of PCI Endpoint # # PCI switch controller drivers # # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers # CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER=y CONFIG_UEVENT_HELPER_PATH="" CONFIG_DEVTMPFS=y # CONFIG_DEVTMPFS_MOUNT is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set # CONFIG_FW_CACHE is not set # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y CONFIG_ALLOW_DEV_COREDUMP=y CONFIG_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y # CONFIG_REGMAP_SPMI is not set CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set CONFIG_GENERIC_ARCH_TOPOLOGY=y # end of Generic Driver Options # # Bus devices # # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_MOXTET is not set # CONFIG_VEXPRESS_CONFIG is not set # CONFIG_MHI_BUS is not set # end of Bus devices # CONFIG_CONNECTOR is not set # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # # CONFIG_ARM_SCMI_PROTOCOL is not set # end of ARM System Control and Management Interface Protocol CONFIG_ARM_SCPI_PROTOCOL=y # CONFIG_ARM_SCPI_POWER_DOMAIN is not set # CONFIG_FW_CFG_SYSFS is not set # CONFIG_ARM_FFA_TRANSPORT is not set # CONFIG_GOOGLE_FIRMWARE is not set # CONFIG_MESON_SM is not set CONFIG_ARM_PSCI_FW=y # CONFIG_ARM_PSCI_CHECKER is not set CONFIG_HAVE_ARM_SMCCC=y CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y # CONFIG_ARM_SMCCC_SOC_ID is not set # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set CONFIG_MTD=y # CONFIG_MTD_TESTS is not set # # Partition parsers # # CONFIG_MTD_AR7_PARTS is not set # CONFIG_MTD_CMDLINE_PARTS is not set CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AFS_PARTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set # end of Partition parsers # # User Modules And Translation Layers # CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y # # Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK. # # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # CONFIG_RFD_FTL is not set # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set # CONFIG_MTD_OOPS is not set # CONFIG_MTD_SWAP is not set # CONFIG_MTD_PARTITIONED_MASTER is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # end of RAM/ROM/Flash chip drivers # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_INTEL_VR_NOR is not set # CONFIG_MTD_PLATRAM is not set # end of Mapping drivers for chip access # # Self-contained MTD device drivers # # CONFIG_MTD_PMC551 is not set # CONFIG_MTD_DATAFLASH is not set # CONFIG_MTD_MCHP23K256 is not set # CONFIG_MTD_MCHP48L640 is not set # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLOCK2MTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOCG3 is not set # end of Self-contained MTD device drivers # # NAND # CONFIG_MTD_NAND_CORE=y # CONFIG_MTD_ONENAND is not set CONFIG_MTD_RAW_NAND=y # # Raw/parallel NAND flash controllers # # CONFIG_MTD_NAND_DENALI_PCI is not set # CONFIG_MTD_NAND_DENALI_DT is not set # CONFIG_MTD_NAND_CAFE is not set # CONFIG_MTD_NAND_BRCMNAND is not set # CONFIG_MTD_NAND_MXIC is not set # CONFIG_MTD_NAND_MESON is not set # CONFIG_MTD_NAND_GPIO is not set # CONFIG_MTD_NAND_PLATFORM is not set # CONFIG_MTD_NAND_CADENCE is not set # CONFIG_MTD_NAND_ARASAN is not set # CONFIG_MTD_NAND_INTEL_LGM is not set # # Misc # # CONFIG_MTD_NAND_NANDSIM is not set # CONFIG_MTD_NAND_RICOH is not set # CONFIG_MTD_NAND_DISKONCHIP is not set # CONFIG_MTD_SPI_NAND is not set # # ECC engine support # CONFIG_MTD_NAND_ECC=y CONFIG_MTD_NAND_ECC_SW_HAMMING=y # CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC is not set # CONFIG_MTD_NAND_ECC_SW_BCH is not set # end of ECC engine support # end of NAND # # LPDDR & LPDDR2 PCM memory drivers # # CONFIG_MTD_LPDDR is not set # end of LPDDR & LPDDR2 PCM memory drivers # CONFIG_MTD_SPI_NOR is not set # CONFIG_MTD_UBI is not set # CONFIG_MTD_HYPERBUS is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_DYNAMIC=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_RESERVED_MEM=y # CONFIG_OF_OVERLAY is not set # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set CONFIG_ZRAM=m # CONFIG_ZRAM_DEF_COMP_LZORLE is not set # CONFIG_ZRAM_DEF_COMP_LZ4 is not set CONFIG_ZRAM_DEF_COMP_LZO=y CONFIG_ZRAM_DEF_COMP="lzo" # CONFIG_ZRAM_WRITEBACK is not set # CONFIG_ZRAM_MEMORY_TRACKING is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=16 # CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=8192 CONFIG_CDROM_PKTCDVD=m CONFIG_CDROM_PKTCDVD_BUFFERS=8 CONFIG_CDROM_PKTCDVD_WCACHE=y CONFIG_ATA_OVER_ETH=m # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_RSXX is not set # # NVME Support # CONFIG_NVME_CORE=m CONFIG_BLK_DEV_NVME=m CONFIG_NVME_MULTIPATH=y # CONFIG_NVME_HWMON is not set CONFIG_NVME_FABRICS=m CONFIG_NVME_FC=m CONFIG_NVME_TCP=m CONFIG_NVME_TARGET=m # CONFIG_NVME_TARGET_PASSTHRU is not set CONFIG_NVME_TARGET_LOOP=m CONFIG_NVME_TARGET_FC=m # CONFIG_NVME_TARGET_FCLOOP is not set CONFIG_NVME_TARGET_TCP=m # end of NVME Support # # Misc devices # # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_PHANTOM is not set # CONFIG_TIFM_CORE is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HI6421V600_IRQ is not set # CONFIG_HP_ILO is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set # CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set CONFIG_UID_SYS_STATS=y # CONFIG_HISI_HIKEY_USB is not set # CONFIG_OPEN_DICE is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # CONFIG_CB710_CORE is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set # CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set # CONFIG_PVPANIC is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=y CONFIG_BLK_DEV_BSG=y CONFIG_CHR_DEV_SCH=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y CONFIG_SCSI_SCAN_ASYNC=y # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_CXGB3_ISCSI is not set # CONFIG_SCSI_CXGB4_ISCSI is not set # CONFIG_SCSI_BNX2_ISCSI is not set # CONFIG_BE2ISCSI is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_HPSA is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_3W_SAS is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_HISI_SAS is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set # CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set # CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set # CONFIG_SCSI_MPI3MR is not set # CONFIG_SCSI_SMARTPQI is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_UFS_HWMON is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_MYRB is not set # CONFIG_SCSI_MYRS is not set # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FDOMAIN_PCI is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_STEX is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_IPR is not set # CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLA_ISCSI is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_AM53C974 is not set # CONFIG_SCSI_WD719X is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_PMCRAID is not set # CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_DH is not set # end of SCSI device support CONFIG_HAVE_PATA_PLATFORM=y CONFIG_ATA=y CONFIG_ATA_VERBOSE_ERROR=y CONFIG_ATA_FORCE=y # # Controllers with non-SFF native interface # # CONFIG_SATA_AHCI is not set # CONFIG_SATA_AHCI_PLATFORM is not set # CONFIG_AHCI_CEVA is not set # CONFIG_AHCI_QORIQ is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set CONFIG_ATA_SFF=y # # SFF controllers with custom DMA interface # # CONFIG_PDC_ADMA is not set # CONFIG_SATA_QSTOR is not set # CONFIG_SATA_SX4 is not set CONFIG_ATA_BMDMA=y # # SATA SFF controllers with BMDMA # # CONFIG_ATA_PIIX is not set # CONFIG_SATA_MV is not set # CONFIG_SATA_NV is not set # CONFIG_SATA_PROMISE is not set # CONFIG_SATA_SIL is not set # CONFIG_SATA_SIS is not set # CONFIG_SATA_SVW is not set # CONFIG_SATA_ULI is not set # CONFIG_SATA_VIA is not set # CONFIG_SATA_VITESSE is not set # # PATA SFF controllers with BMDMA # # CONFIG_PATA_ALI is not set # CONFIG_PATA_AMD is not set # CONFIG_PATA_ARTOP is not set # CONFIG_PATA_ATIIXP is not set # CONFIG_PATA_ATP867X is not set # CONFIG_PATA_CMD64X is not set # CONFIG_PATA_CYPRESS is not set # CONFIG_PATA_EFAR is not set # CONFIG_PATA_HPT366 is not set # CONFIG_PATA_HPT37X is not set # CONFIG_PATA_HPT3X2N is not set # CONFIG_PATA_HPT3X3 is not set # CONFIG_PATA_IT8213 is not set # CONFIG_PATA_IT821X is not set # CONFIG_PATA_JMICRON is not set # CONFIG_PATA_MARVELL is not set # CONFIG_PATA_NETCELL is not set # CONFIG_PATA_NINJA32 is not set # CONFIG_PATA_NS87415 is not set # CONFIG_PATA_OLDPIIX is not set # CONFIG_PATA_OPTIDMA is not set # CONFIG_PATA_PDC2027X is not set # CONFIG_PATA_PDC_OLD is not set # CONFIG_PATA_RADISYS is not set # CONFIG_PATA_RDC is not set # CONFIG_PATA_SCH is not set # CONFIG_PATA_SERVERWORKS is not set # CONFIG_PATA_SIL680 is not set # CONFIG_PATA_SIS is not set # CONFIG_PATA_TOSHIBA is not set # CONFIG_PATA_TRIFLEX is not set # CONFIG_PATA_VIA is not set # CONFIG_PATA_WINBOND is not set # # PIO-only SFF controllers # # CONFIG_PATA_CMD640_PCI is not set # CONFIG_PATA_MPIIX is not set # CONFIG_PATA_NS87410 is not set # CONFIG_PATA_OPTI is not set # CONFIG_PATA_PLATFORM is not set # CONFIG_PATA_RZ1000 is not set # # Generic fallback / legacy drivers # # CONFIG_ATA_GENERIC is not set # CONFIG_PATA_LEGACY is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=m # CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m # CONFIG_DM_UNSTRIPED is not set CONFIG_DM_CRYPT=m CONFIG_DM_DEFAULT_KEY=m CONFIG_DM_SNAPSHOT=m CONFIG_DM_THIN_PROVISIONING=m # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_EBS is not set # CONFIG_DM_ERA is not set # CONFIG_DM_CLONE is not set # CONFIG_DM_MIRROR is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_DUST is not set CONFIG_DM_UEVENT=y # CONFIG_DM_FLAKEY is not set CONFIG_DM_VERITY=m # CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG is not set CONFIG_DM_VERITY_FEC=y # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_DM_INTEGRITY is not set CONFIG_DM_BOW=m CONFIG_DM_USER=m # CONFIG_TARGET_CORE is not set # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # # CONFIG_FIREWIRE is not set # CONFIG_FIREWIRE_NOSY is not set # end of IEEE 1394 (FireWire) support CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set CONFIG_DUMMY=m # CONFIG_WIREGUARD is not set # CONFIG_EQUALIZER is not set # CONFIG_NET_FC is not set # CONFIG_NET_TEAM is not set CONFIG_MACVLAN=m CONFIG_MACVTAP=m CONFIG_IPVLAN_L3S=y CONFIG_IPVLAN=m CONFIG_IPVTAP=m CONFIG_VXLAN=m # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_MACSEC is not set # CONFIG_NETCONSOLE is not set CONFIG_TUN=y CONFIG_TAP=m # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m # CONFIG_NLMON is not set CONFIG_NET_VRF=m # CONFIG_ARCNET is not set CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set # CONFIG_NET_VENDOR_AGERE is not set # CONFIG_NET_VENDOR_ALACRITECH is not set # CONFIG_NET_VENDOR_ALTEON is not set # CONFIG_ALTERA_TSE is not set # CONFIG_NET_VENDOR_AMAZON is not set # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set # CONFIG_NET_VENDOR_ATHEROS is not set # CONFIG_NET_VENDOR_BROADCOM is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set # CONFIG_NET_VENDOR_CORTINA is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set # CONFIG_NET_VENDOR_EZCHIP is not set # CONFIG_NET_VENDOR_GOOGLE is not set # CONFIG_NET_VENDOR_HISILICON is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_INTEL is not set # CONFIG_JME is not set # CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set # CONFIG_NET_VENDOR_MICROSOFT is not set # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set # CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NETERION is not set # CONFIG_NET_VENDOR_NETRONOME is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set # CONFIG_NET_VENDOR_PACKET_ENGINES is not set # CONFIG_NET_VENDOR_PENSANDO is not set # CONFIG_NET_VENDOR_QLOGIC is not set # CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_REALTEK is not set # CONFIG_NET_VENDOR_RENESAS is not set # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set # CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=y # CONFIG_STMMAC_SELFTESTS is not set CONFIG_STMMAC_PLATFORM=y CONFIG_DWMAC_DWC_QOS_ETH=y # CONFIG_DWMAC_GENERIC is not set CONFIG_DWMAC_MESON=y CONFIG_AMLOGIC_ETH_PRIVE=y # CONFIG_DWMAC_INTEL_PLAT is not set # CONFIG_DWMAC_LOONGSON is not set # CONFIG_STMMAC_PCI is not set # CONFIG_NET_VENDOR_SUN is not set # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set CONFIG_PHYLINK=y CONFIG_PHYLIB=y CONFIG_SWPHY=y CONFIG_LED_TRIGGER_PHY=y CONFIG_FIXED_PHY=y # CONFIG_SFP is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_MESON_GXL_PHY is not set # CONFIG_ADIN_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=m # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM54140_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_LXT_PHY is not set CONFIG_INTEL_XWAY_PHY=y CONFIG_JLSEMI_PHY=y # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set CONFIG_MAXLINEAR_GPHY=y CONFIG_MEDIATEK_GE_PHY=y # CONFIG_MICREL_PHY is not set CONFIG_MICROCHIP_PHY=m # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set CONFIG_MOTORCOMM_PHY=y # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_QSEMI_PHY is not set # CONFIG_REALTEK_PHY is not set # CONFIG_RENESAS_PHY is not set # CONFIG_ROCKCHIP_PHY is not set CONFIG_MAXIO_PHY=y CONFIG_SMSC_PHY=m # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_OF_MDIO=y CONFIG_MDIO_DEVRES=y # CONFIG_MDIO_BITBANG is not set # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_OCTEON is not set # CONFIG_MDIO_IPQ4019 is not set # CONFIG_MDIO_IPQ8064 is not set # CONFIG_MDIO_THUNDER is not set # # MDIO Multiplexers # CONFIG_MDIO_BUS_MUX=y # CONFIG_MDIO_BUS_MUX_MESON_G12A is not set # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # # PCS device drivers # CONFIG_PCS_XPCS=y # end of PCS device drivers CONFIG_PPP=y CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set CONFIG_PPP_MPPE=m # CONFIG_PPP_MULTILINK is not set # CONFIG_PPPOE is not set CONFIG_PPTP=m CONFIG_PPPOL2TP=m # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_SLIP is not set CONFIG_SLHC=y CONFIG_USB_NET_DRIVERS=y CONFIG_USB_CATC=m CONFIG_USB_KAWETH=m CONFIG_USB_PEGASUS=m CONFIG_USB_RTL8150=m # CONFIG_USB_RTL8152 is not set CONFIG_USB_LAN78XX=m CONFIG_USB_USBNET=m CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m CONFIG_USB_NET_CDC_EEM=m CONFIG_USB_NET_CDC_NCM=m CONFIG_USB_NET_HUAWEI_CDC_NCM=m CONFIG_USB_NET_CDC_MBIM=m CONFIG_USB_NET_DM9601=m CONFIG_USB_NET_SR9700=m CONFIG_USB_NET_SR9800=m CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=m CONFIG_USB_NET_GL620A=m CONFIG_USB_NET_NET1080=m CONFIG_USB_NET_PLUSB=m CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m CONFIG_USB_NET_CDC_SUBSET_ENABLE=m CONFIG_USB_NET_CDC_SUBSET=m CONFIG_USB_ALI_M5632=y CONFIG_USB_AN2720=y CONFIG_USB_BELKIN=y CONFIG_USB_ARMLINUX=y CONFIG_USB_EPSON2888=y CONFIG_USB_KC2190=y CONFIG_USB_NET_ZAURUS=m CONFIG_USB_NET_CX82310_ETH=m CONFIG_USB_NET_KALMIA=m CONFIG_USB_NET_QMI_WWAN=m CONFIG_USB_HSO=m CONFIG_USB_NET_INT51X1=m CONFIG_USB_IPHETH=m CONFIG_USB_SIERRA_NET=m CONFIG_USB_VL600=m CONFIG_USB_NET_CH9200=m CONFIG_USB_NET_AQC111=m CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y # CONFIG_ADM8211 is not set CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set # CONFIG_ATH5K is not set # CONFIG_ATH5K_PCI is not set CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m CONFIG_ATH9K_PCI=y # CONFIG_ATH9K_AHB is not set # CONFIG_ATH9K_DEBUGFS is not set # CONFIG_ATH9K_DYNACK is not set # CONFIG_ATH9K_WOW is not set CONFIG_ATH9K_RFKILL=y # CONFIG_ATH9K_CHANNEL_CONTEXT is not set CONFIG_ATH9K_PCOEM=y # CONFIG_ATH9K_PCI_NO_EEPROM is not set CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_ATH9K_HWRNG=y CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y CONFIG_CARL9170_HWRNG=y CONFIG_ATH6KL=m CONFIG_ATH6KL_SDIO=m CONFIG_ATH6KL_USB=m # CONFIG_ATH6KL_DEBUG is not set # CONFIG_ATH6KL_TRACING is not set CONFIG_AR5523=m # CONFIG_WIL6210 is not set CONFIG_ATH10K=m CONFIG_ATH10K_CE=y # CONFIG_ATH10K_PCI is not set CONFIG_ATH10K_SDIO=m CONFIG_ATH10K_USB=m # CONFIG_ATH10K_DEBUG is not set # CONFIG_ATH10K_DEBUGFS is not set # CONFIG_ATH10K_TRACING is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set CONFIG_WLAN_VENDOR_ATMEL=y # CONFIG_ATMEL is not set # CONFIG_AT76C50X_USB is not set CONFIG_WLAN_VENDOR_BROADCOM=y # CONFIG_B43 is not set # CONFIG_B43LEGACY is not set # CONFIG_BRCMSMAC is not set # CONFIG_BRCMFMAC is not set CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y # CONFIG_IPW2100 is not set # CONFIG_IPW2200 is not set # CONFIG_IWL4965 is not set # CONFIG_IWL3945 is not set # CONFIG_IWLWIFI is not set CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_HOSTAP is not set # CONFIG_HERMES is not set # CONFIG_P54_COMMON is not set CONFIG_WLAN_VENDOR_MARVELL=y # CONFIG_LIBERTAS is not set # CONFIG_LIBERTAS_THINFIRM is not set # CONFIG_MWIFIEX is not set # CONFIG_MWL8K is not set CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m # CONFIG_MT76x0U is not set # CONFIG_MT76x0E is not set # CONFIG_MT76x2E is not set # CONFIG_MT76x2U is not set # CONFIG_MT7603E is not set # CONFIG_MT7615E is not set # CONFIG_MT7663U is not set # CONFIG_MT7663S is not set # CONFIG_MT7915E is not set # CONFIG_MT7921E is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m # CONFIG_RT2400PCI is not set # CONFIG_RT2500PCI is not set # CONFIG_RT61PCI is not set # CONFIG_RT2800PCI is not set CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WLAN_VENDOR_REALTEK=y # CONFIG_RTL8180 is not set CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y CONFIG_RTL_CARDS=y CONFIG_RTL8192CE=m CONFIG_RTL8192SE=m CONFIG_RTL8192DE=m CONFIG_RTL8723AE=m CONFIG_RTL8723BE=m CONFIG_RTL8188EE=m CONFIG_RTL8192EE=m CONFIG_RTL8821AE=m CONFIG_RTL8192CU=m CONFIG_RTLWIFI=m CONFIG_RTLWIFI_PCI=m CONFIG_RTLWIFI_USB=m CONFIG_RTLWIFI_DEBUG=y CONFIG_RTL8192C_COMMON=m CONFIG_RTL8723_COMMON=m CONFIG_RTLBTCOEXIST=m CONFIG_RTL8XXXU=m CONFIG_RTL8XXXU_UNTESTED=y # CONFIG_RTW88 is not set CONFIG_WLAN_VENDOR_RSI=y # CONFIG_RSI_91X is not set # CONFIG_WLAN_VENDOR_ST is not set # CONFIG_WLAN_VENDOR_TI is not set CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_USB_ZD1201=m # CONFIG_ZD1211RW is not set # CONFIG_WLAN_VENDOR_QUANTENNA is not set # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN # CONFIG_VMXNET3 is not set # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y CONFIG_INPUT_MOUSEDEV_PSAUX=y CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=m CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADC is not set # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set # CONFIG_KEYBOARD_ATKBD is not set # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set # CONFIG_KEYBOARD_GPIO is not set # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set # CONFIG_INPUT_MOUSE is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADC is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set # CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set CONFIG_JOYSTICK_XPAD=y CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y # CONFIG_JOYSTICK_PSXPAD_SPI is not set # CONFIG_JOYSTICK_PXRC is not set # CONFIG_JOYSTICK_QWIIC is not set # CONFIG_JOYSTICK_FSIA6B is not set # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y # CONFIG_TOUCHSCREEN_ADS7846 is not set # CONFIG_TOUCHSCREEN_AD7877 is not set # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_ADC is not set # CONFIG_TOUCHSCREEN_AR1021_I2C is not set # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_BU21029 is not set # CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set # CONFIG_TOUCHSCREEN_CY8CTMA140 is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set # CONFIG_TOUCHSCREEN_EGALAX is not set # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set # CONFIG_TOUCHSCREEN_EXC3000 is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_HIDEEP is not set # CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_ILITEK is not set # CONFIG_TOUCHSCREEN_S6SY761 is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set # CONFIG_TOUCHSCREEN_ELAN is not set # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MSG2638 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set # CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2004 is not set # CONFIG_TOUCHSCREEN_TSC2005 is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_RM_TS is not set # CONFIG_TOUCHSCREEN_SILEAD is not set # CONFIG_TOUCHSCREEN_SIS_I2C is not set # CONFIG_TOUCHSCREEN_ST1232 is not set # CONFIG_TOUCHSCREEN_STMFTS is not set # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set # CONFIG_TOUCHSCREEN_SX8654 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZET6223 is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_IQS5XX is not set # CONFIG_TOUCHSCREEN_ZINITIX is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_RMI4_CORE is not set # # Hardware I/O ports # # CONFIG_SERIO is not set # CONFIG_GAMEPORT is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y # CONFIG_SERIAL_8250 is not set # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set # CONFIG_SERIAL_AMBA_PL011 is not set # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MESON is not set # CONFIG_SERIAL_SAMSUNG is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_SIFIVE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_BCM63XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_RP2 is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_SPRD is not set # end of Serial drivers # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set # CONFIG_HVC_DCC is not set CONFIG_SERIAL_DEV_BUS=m # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_BA431 is not set # CONFIG_HW_RANDOM_MESON is not set # CONFIG_HW_RANDOM_CCTRNG is not set # CONFIG_HW_RANDOM_XIPHERA is not set # CONFIG_HW_RANDOM_ARM_SMCCC_TRNG is not set # CONFIG_APPLICOM is not set CONFIG_DEVMEM=y # CONFIG_DEVPORT is not set # CONFIG_TCG_TPM is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set # CONFIG_RANDOM_TRUST_BOOTLOADER is not set # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # CONFIG_I2C_ARB_GPIO_CHALLENGE=m CONFIG_I2C_MUX_GPIO=m CONFIG_I2C_MUX_GPMUX=m CONFIG_I2C_MUX_LTC4306=m CONFIG_I2C_MUX_PCA9541=m CONFIG_I2C_MUX_PCA954x=m CONFIG_I2C_MUX_PINCTRL=m CONFIG_I2C_MUX_REG=m CONFIG_I2C_DEMUX_PINCTRL=m CONFIG_I2C_MUX_MLXCPLD=m # end of Multiplexer I2C Chip support # CONFIG_I2C_HELPER_AUTO is not set # CONFIG_I2C_SMBUS is not set # # I2C Algorithms # CONFIG_I2C_ALGOBIT=y # CONFIG_I2C_ALGOPCF is not set # CONFIG_I2C_ALGOPCA is not set # end of I2C Algorithms # # I2C Hardware Bus support # # # PC SMBus host controller drivers # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_ISCH is not set # CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_NVIDIA_GPU is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CADENCE is not set # CONFIG_I2C_CBUS_GPIO is not set # CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_DESIGNWARE_PCI is not set # CONFIG_I2C_EMEV2 is not set # CONFIG_I2C_GPIO is not set # CONFIG_I2C_MESON is not set # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_RK3X is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_THUNDERX is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y CONFIG_SPI_MEM=y # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set # CONFIG_SPI_BITBANG is not set # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_CADENCE_QUADSPI 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_MESON_SPICC is not set # CONFIG_SPI_MESON_SPIFC is not set # CONFIG_SPI_OC_TINY is not set # CONFIG_SPI_PL022 is not set # CONFIG_SPI_PXA2XX is not set # CONFIG_SPI_ROCKCHIP is not set # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_SIFIVE is not set # CONFIG_SPI_MXIC is not set # CONFIG_SPI_THUNDERX is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_AMD is not set # # SPI Multiplexer support # # CONFIG_SPI_MUX is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=y # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set CONFIG_SPI_DYNAMIC=y CONFIG_SPMI=y # CONFIG_SPMI_HISI3670 is not set # CONFIG_HSI is not set CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # # CONFIG_PTP_1588_CLOCK_KVM is not set # CONFIG_PTP_1588_CLOCK_IDT82P33 is not set # CONFIG_PTP_1588_CLOCK_IDTCM is not set # end of PTP clock support CONFIG_PINCTRL=y CONFIG_GENERIC_PINCTRL_GROUPS=y CONFIG_PINMUX=y CONFIG_GENERIC_PINMUX_FUNCTIONS=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_MCP23S08 is not set CONFIG_PINCTRL_SINGLE=y # CONFIG_PINCTRL_SX150X is not set # CONFIG_PINCTRL_STMFX is not set # CONFIG_PINCTRL_OCELOT is not set # CONFIG_PINCTRL_MICROCHIP_SGPIO is not set # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers # CONFIG_PINCTRL_MESON is not set CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_CDEV=y # CONFIG_GPIO_CDEV_V1 is not set # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_CADENCE is not set # CONFIG_GPIO_DWAPB is not set # CONFIG_GPIO_FTGPIO010 is not set # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HLWD is not set # CONFIG_GPIO_LOGICVC is not set # CONFIG_GPIO_MB86S7X is not set # CONFIG_GPIO_PL061 is not set # CONFIG_GPIO_SAMA5D2_PIOBU is not set # CONFIG_GPIO_SIFIVE is not set # CONFIG_GPIO_SYSCON is not set # CONFIG_GPIO_XGENE is not set # CONFIG_GPIO_XILINX is not set # CONFIG_GPIO_AMD_FCH is not set # end of Memory mapped GPIO drivers # # 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 # CONFIG_GPIO_PCA953X_IRQ is not set # CONFIG_GPIO_PCA9570 is not set CONFIG_GPIO_PCF857X=m # CONFIG_GPIO_TPIC2810 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # # end of MFD GPIO expanders # # PCI GPIO expanders # # CONFIG_GPIO_BT8XX is not set # CONFIG_GPIO_PCI_IDIO_16 is not set # CONFIG_GPIO_PCIE_IDIO_24 is not set # CONFIG_GPIO_RDC321X is not set # end of PCI GPIO expanders # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # end of SPI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_MOCKUP is not set # end of Virtual GPIO drivers # CONFIG_W1 is not set CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_BRCMSTB is not set # CONFIG_POWER_RESET_GPIO is not set # CONFIG_POWER_RESET_GPIO_RESTART is not set # CONFIG_POWER_RESET_LTC2952 is not set # CONFIG_POWER_RESET_REGULATOR is not set # CONFIG_POWER_RESET_RESTART is not set # CONFIG_POWER_RESET_XGENE is not set # CONFIG_POWER_RESET_SYSCON is not set # CONFIG_POWER_RESET_SYSCON_POWEROFF is not set # CONFIG_SYSCON_REBOOT_MODE is not set # CONFIG_NVMEM_REBOOT_MODE is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_UCS1002 is not set # CONFIG_CHARGER_BD99954 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set # CONFIG_SENSORS_ARM_SCPI is not set # CONFIG_SENSORS_ASPEED is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DRIVETEMP is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_I5K_AMB is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_GPIO_FAN is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IIO_HWMON is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX31730 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_NZXT_KRAKEN2 is not set # CONFIG_SENSORS_OCC_P8_I2C is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set CONFIG_SENSORS_PWM_FAN=y # CONFIG_SENSORS_SBTSI is not set # CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_VT8231 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=200 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y CONFIG_THERMAL_WRITABLE_TRIPS=y CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set CONFIG_THERMAL_GOV_FAIR_SHARE=y CONFIG_THERMAL_GOV_STEP_WISE=y CONFIG_THERMAL_GOV_BANG_BANG=y CONFIG_THERMAL_GOV_USER_SPACE=y CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y CONFIG_CPU_THERMAL=y CONFIG_CPU_FREQ_THERMAL=y CONFIG_DEVFREQ_THERMAL=y # CONFIG_THERMAL_EMULATION is not set # CONFIG_THERMAL_MMIO is not set CONFIG_AMLOGIC_THERMAL=y # CONFIG_GENERIC_ADC_THERMAL is not set CONFIG_KHADAS_MCU_FAN_THERMAL=y CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 # CONFIG_WATCHDOG_SYSFS is not set # CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_ARM_SBSA_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set # CONFIG_MAX63XX_WATCHDOG is not set CONFIG_MESON_GXBB_WATCHDOG=y # CONFIG_MESON_WATCHDOG is not set # CONFIG_ARM_SMC_WATCHDOG is not set # CONFIG_ALIM7101_WDT is not set # CONFIG_I6300ESB_WDT is not set # CONFIG_MEN_A21_WDT is not set # # PCI-based Watchdog Cards # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y CONFIG_SSB=m CONFIG_SSB_SPROM=y CONFIG_SSB_PCIHOST_POSSIBLE=y CONFIG_SSB_PCIHOST=y CONFIG_SSB_SDIOHOST_POSSIBLE=y # CONFIG_SSB_SDIOHOST is not set CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y CONFIG_SSB_DRIVER_PCICORE=y # CONFIG_SSB_DRIVER_GPIO is not set CONFIG_BCMA_POSSIBLE=y CONFIG_BCMA=m CONFIG_BCMA_HOST_PCI_POSSIBLE=y CONFIG_BCMA_HOST_PCI=y # CONFIG_BCMA_HOST_SOC is not set CONFIG_BCMA_DRIVER_PCI=y # CONFIG_BCMA_DRIVER_GMAC_CMN is not set # CONFIG_BCMA_DRIVER_GPIO is not set # CONFIG_BCMA_DEBUG is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_GATEWORKS_GSC is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_MFD_HI6421_SPMI is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_MFD_INTEL_PMT is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77620 is not set # CONFIG_MFD_MAX77650 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_CPCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_NTXEC is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_RK808 is not set # CONFIG_MFD_RN5T618 is not set # CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_MFD_TPS80031 is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # 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_VX855 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 # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set CONFIG_MFD_ROHM_BD718XX=y # CONFIG_MFD_ROHM_BD70528 is not set # CONFIG_MFD_ROHM_BD71828 is not set # CONFIG_MFD_ROHM_BD957XMUF is not set # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set # CONFIG_MFD_ATC260X_I2C is not set CONFIG_MFD_KHADAS_MCU=y # CONFIG_MFD_QCOM_PM8008 is not set # CONFIG_RAVE_SP_CORE is not set # CONFIG_MFD_INTEL_M10_BMC is not set # CONFIG_MFD_RSMU_I2C is not set # CONFIG_MFD_RSMU_SPI is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set CONFIG_REGULATOR_BD718XX=y # CONFIG_REGULATOR_DA9121 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set # CONFIG_REGULATOR_FAN53880 is not set CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MCP16502 is not set # CONFIG_REGULATOR_MP5416 is not set # CONFIG_REGULATOR_MP8859 is not set # CONFIG_REGULATOR_MP886X is not set # CONFIG_REGULATOR_MPQ7920 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_MT6315 is not set # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PF8X00 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set CONFIG_REGULATOR_PWM=y # CONFIG_REGULATOR_QCOM_SPMI is not set # CONFIG_REGULATOR_QCOM_USB_VBUS is not set # CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set CONFIG_REGULATOR_ROHM=y # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_SY8106A is not set # CONFIG_REGULATOR_SY8824X is not set # CONFIG_REGULATOR_SY8827N is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set CONFIG_REGULATOR_VCTRL=y # CONFIG_REGULATOR_QCOM_LABIBB is not set CONFIG_RC_CORE=m CONFIG_RC_MAP=m CONFIG_LIRC=y CONFIG_RC_DECODERS=y CONFIG_IR_IRMP_DECODER=m CONFIG_IR_NEC_DECODER=m CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_SONY_DECODER=m CONFIG_IR_SANYO_DECODER=m CONFIG_IR_SHARP_DECODER=m CONFIG_IR_MCE_KBD_DECODER=m CONFIG_IR_XMP_DECODER=m CONFIG_IR_IMON_DECODER=m CONFIG_IR_RCMM_DECODER=m CONFIG_RC_DEVICES=y CONFIG_RC_ATI_REMOTE=m # CONFIG_IR_HIX5HD2 is not set # CONFIG_IR_IMON is not set # CONFIG_IR_IMON_RAW is not set CONFIG_IR_MCEUSB=m CONFIG_IR_MESON=m # CONFIG_IR_MESON_TX is not set # CONFIG_IR_REDRAT3 is not set # CONFIG_IR_SPI is not set # CONFIG_IR_STREAMZAP is not set # CONFIG_IR_IGORPLUGUSB is not set # CONFIG_IR_IGUANA is not set # CONFIG_IR_TTUSBIR is not set # CONFIG_RC_LOOPBACK is not set CONFIG_IR_GPIO_CIR=m # CONFIG_IR_GPIO_TX is not set # CONFIG_IR_PWM_TX is not set # CONFIG_IR_SERIAL is not set # CONFIG_IR_SIR is not set # CONFIG_RC_XBOX_DVD is not set # CONFIG_IR_TOY is not set CONFIG_CEC_CORE=y CONFIG_CEC_NOTIFIER=y CONFIG_MEDIA_CEC_SUPPORT=y # CONFIG_CEC_CH7322 is not set CONFIG_CEC_MESON_AO=y CONFIG_CEC_MESON_G12A_AO=y # CONFIG_CEC_GPIO is not set # CONFIG_USB_PULSE8_CEC is not set # CONFIG_USB_RAINSHADOW_CEC is not set CONFIG_MEDIA_SUPPORT=y # CONFIG_MEDIA_SUPPORT_FILTER is not set CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y # CONFIG_MEDIA_RADIO_SUPPORT is not set # CONFIG_MEDIA_SDR_SUPPORT is not set # CONFIG_MEDIA_PLATFORM_SUPPORT is not set # CONFIG_MEDIA_TEST_SUPPORT is not set # end of Media device types # # Media core support # CONFIG_VIDEO_DEV=y CONFIG_MEDIA_CONTROLLER=y CONFIG_DVB_CORE=y # end of Media core support # # Video4Linux options # CONFIG_VIDEO_V4L2=y CONFIG_VIDEO_V4L2_I2C=y CONFIG_VIDEO_V4L2_SUBDEV_API=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_VIDEO_TUNER=m CONFIG_V4L2_MEM2MEM_DEV=y # CONFIG_V4L2_FLASH_LED_CLASS is not set CONFIG_V4L2_FWNODE=y CONFIG_V4L2_ASYNC=y CONFIG_VIDEOBUF_GEN=y CONFIG_VIDEOBUF_VMALLOC=y # CONFIG_AMLOGIC_V4L2 is not set # end of Video4Linux options # # Media controller options # CONFIG_MEDIA_CONTROLLER_DVB=y # end of Media controller options # # Digital TV options # # CONFIG_DVB_MMAP is not set CONFIG_DVB_NET=y CONFIG_DVB_MAX_ADAPTERS=16 # CONFIG_DVB_DYNAMIC_MINORS is not set # CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set # CONFIG_DVB_ULE_DEBUG is not set # end of Digital TV options # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # CONFIG_USB_VIDEO_CLASS=y CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_VIDEO_CPIA2 is not set # CONFIG_USB_ZR364XX is not set # CONFIG_USB_STKWEBCAM is not set # CONFIG_USB_S2255 is not set # CONFIG_VIDEO_USBTV is not set # # Analog TV USB devices # CONFIG_VIDEO_PVRUSB2=m CONFIG_VIDEO_PVRUSB2_SYSFS=y CONFIG_VIDEO_PVRUSB2_DVB=y # CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set CONFIG_VIDEO_HDPVR=m CONFIG_VIDEO_STK1160_COMMON=m CONFIG_VIDEO_STK1160=m # CONFIG_VIDEO_GO7007 is not set # # Analog/digital TV USB devices # CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_AU0828_V4L2=y CONFIG_VIDEO_AU0828_RC=y CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y CONFIG_VIDEO_CX231XX_ALSA=m CONFIG_VIDEO_CX231XX_DVB=m CONFIG_VIDEO_TM6000=m CONFIG_VIDEO_TM6000_ALSA=m CONFIG_VIDEO_TM6000_DVB=m # # Digital TV USB devices # CONFIG_DVB_USB=m # CONFIG_DVB_USB_DEBUG is not set CONFIG_DVB_USB_DIB3000MC=m CONFIG_DVB_USB_A800=m CONFIG_DVB_USB_DIBUSB_MB=m CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y CONFIG_DVB_USB_DIBUSB_MC=m CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_CXUSB=m CONFIG_DVB_USB_CXUSB_ANALOG=y CONFIG_DVB_USB_M920X=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_VP7045=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_GP8PSK=m CONFIG_DVB_USB_NOVA_T_USB2=m CONFIG_DVB_USB_TTUSB2=m CONFIG_DVB_USB_DTT200U=m CONFIG_DVB_USB_OPERA1=m CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_DTV5100=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_TBS5520SE=m CONFIG_DVB_USB_TBS5580=m CONFIG_DVB_USB_TBS5930=m CONFIG_DVB_USB_TBS5530=m CONFIG_DVB_USB_TBS5230=m CONFIG_DVB_USB_TBS5931=m CONFIG_DVB_USB_TBSQBOX2CI=m CONFIG_DVB_USB_V2=m CONFIG_DVB_USB_AF9015=m CONFIG_DVB_USB_AF9035=m CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_AZ6007=m CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_GL861=m CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m CONFIG_DVB_USB_DVBSKY=m CONFIG_DVB_USB_ZD1301=m CONFIG_DVB_TTUSB_BUDGET=m CONFIG_DVB_TTUSB_DEC=m CONFIG_SMS_USB_DRV=m CONFIG_DVB_B2C2_FLEXCOP_USB=m CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG=y CONFIG_DVB_AS102=m # # Webcam, TV (analog/digital) USB devices # CONFIG_VIDEO_EM28XX=m CONFIG_VIDEO_EM28XX_V4L2=m CONFIG_VIDEO_EM28XX_ALSA=m CONFIG_VIDEO_EM28XX_DVB=m # CONFIG_VIDEO_EM28XX_RC is not set # CONFIG_MEDIA_PCI_SUPPORT is not set CONFIG_MEDIA_COMMON_OPTIONS=y # # common driver options # CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m CONFIG_TTPCI_EEPROM=m CONFIG_CYPRESS_FIRMWARE=m CONFIG_VIDEOBUF2_CORE=y CONFIG_VIDEOBUF2_V4L2=y CONFIG_VIDEOBUF2_MEMOPS=y CONFIG_VIDEOBUF2_DMA_CONTIG=y CONFIG_VIDEOBUF2_VMALLOC=y CONFIG_VIDEOBUF2_DMA_SG=y CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_DVB_B2C2_FLEXCOP_DEBUG=y CONFIG_SMS_SIANO_MDTV=m CONFIG_SMS_SIANO_RC=y # end of Media drivers CONFIG_MEDIA_HIDE_ANCILLARY_SUBDRV=y # # Media ancillary drivers # CONFIG_MEDIA_ATTACH=y # # IR I2C driver auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_IR_I2C=m # # audio, video and radio I2C drivers auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_MSP3400=m CONFIG_VIDEO_CS53L32A=m CONFIG_VIDEO_WM8775=m CONFIG_VIDEO_SAA711X=m CONFIG_VIDEO_TVP5150=m # # Video and audio decoders # CONFIG_VIDEO_CX25840=m # # Camera sensor devices # # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_IMX412 is not set # CONFIG_VIDEO_OV02A10 is not set CONFIG_VIDEO_OV2640=m # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV7251 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7640 is not set # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9282 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set CONFIG_VIDEO_MT9V011=m # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_M5MOLS is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_S5C73M3 is not set # end of Camera sensor devices # # Lens drivers # # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # SPI I2C drivers auto-selected by 'Autoselect ancillary drivers' # # # Media SPI Adapters # # CONFIG_CXD2880_SPI_DRV is not set # end of Media SPI Adapters CONFIG_MEDIA_TUNER=y # # Tuner drivers auto-selected by 'Autoselect ancillary drivers' # CONFIG_MEDIA_TUNER_SIMPLE=y CONFIG_MEDIA_TUNER_TDA18250=m CONFIG_MEDIA_TUNER_TDA8290=y CONFIG_MEDIA_TUNER_TDA827X=y CONFIG_MEDIA_TUNER_TDA18271=y CONFIG_MEDIA_TUNER_TDA9887=y CONFIG_MEDIA_TUNER_MT20XX=y CONFIG_MEDIA_TUNER_MT2060=m CONFIG_MEDIA_TUNER_MT2063=m CONFIG_MEDIA_TUNER_MT2266=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_XC2028=y CONFIG_MEDIA_TUNER_XC5000=y CONFIG_MEDIA_TUNER_XC4000=y CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m CONFIG_MEDIA_TUNER_MC44S803=y CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_TDA18218=m CONFIG_MEDIA_TUNER_FC0011=m CONFIG_MEDIA_TUNER_FC0012=m CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_TDA18212=m CONFIG_MEDIA_TUNER_E4000=m CONFIG_MEDIA_TUNER_FC2580=m CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_MEDIA_TUNER_SI2157=m CONFIG_MEDIA_TUNER_IT913X=m CONFIG_MEDIA_TUNER_R820T=m CONFIG_MEDIA_TUNER_QM1D1C0042=m CONFIG_MEDIA_TUNER_AV201X=m # # DVB Frontend drivers auto-selected by 'Autoselect ancillary drivers' # # # Multistandard (satellite) frontends # CONFIG_DVB_STB0899=m CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m CONFIG_DVB_STV6110x=m CONFIG_DVB_TAS2101=m CONFIG_DVB_GX1133=m CONFIG_DVB_M88DS3103=m # # Multistandard (cable + terrestrial) frontends # CONFIG_DVB_DRXK=m CONFIG_DVB_TDA18271C2DD=m CONFIG_DVB_SI2165=m CONFIG_DVB_MN88472=m CONFIG_DVB_MN88473=m # # DVB-S (satellite) frontends # CONFIG_DVB_CX24123=m CONFIG_DVB_MT312=m CONFIG_DVB_ZL10039=m CONFIG_DVB_S5H1420=m CONFIG_DVB_STV0288=m CONFIG_DVB_STB6000=m CONFIG_DVB_STV0299=m CONFIG_DVB_STV6110=m CONFIG_DVB_STV0900=m CONFIG_DVB_TDA8083=m CONFIG_DVB_TDA10086=m CONFIG_DVB_TUNER_ITD1000=m CONFIG_DVB_TUNER_CX24113=m CONFIG_DVB_TDA826X=m CONFIG_DVB_CX24116=m CONFIG_DVB_CX24120=m CONFIG_DVB_SI21XX=m CONFIG_DVB_SI2183=m CONFIG_DVB_TS2020=m CONFIG_DVB_DS3000=m CONFIG_DVB_TDA10071=m # # DVB-T (terrestrial) frontends # CONFIG_DVB_CX22700=m CONFIG_DVB_CX22702=m CONFIG_DVB_DRXD=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_NXT6000=m CONFIG_DVB_MT352=m CONFIG_DVB_ZL10353=m CONFIG_DVB_DIB3000MB=m CONFIG_DVB_DIB3000MC=m CONFIG_DVB_DIB7000M=m CONFIG_DVB_DIB7000P=m CONFIG_DVB_TDA10048=m CONFIG_DVB_AF9013=m CONFIG_DVB_EC100=m CONFIG_DVB_CXD2820R=m CONFIG_DVB_CXD2841ER=m CONFIG_DVB_RTL2830=m CONFIG_DVB_RTL2832=m CONFIG_DVB_SI2168=m CONFIG_DVB_CXD2878=m CONFIG_DVB_AS102_FE=m CONFIG_DVB_ZD1301_DEMOD=m CONFIG_DVB_M88RS6060=m CONFIG_DVB_GP8PSK_FE=m # # DVB-C (cable) frontends # CONFIG_DVB_VES1820=m CONFIG_DVB_TDA10023=m CONFIG_DVB_STV0297=m # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # CONFIG_DVB_NXT200X=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LGDT330X=m CONFIG_DVB_LGDT3305=m CONFIG_DVB_LGDT3306A=m CONFIG_DVB_LG2160=m CONFIG_DVB_S5H1409=m CONFIG_DVB_AU8522=m CONFIG_DVB_AU8522_DTV=m CONFIG_DVB_AU8522_V4L=m CONFIG_DVB_S5H1411=m CONFIG_DVB_MXL692=m # # ISDB-T (terrestrial) frontends # CONFIG_DVB_S921=m CONFIG_DVB_DIB8000=m CONFIG_DVB_MB86A20S=m # # ISDB-S (satellite) & ISDB-T (terrestrial) frontends # CONFIG_DVB_TC90522=m # # Digital terrestrial only tuners/PLL # CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m CONFIG_DVB_TUNER_DIB0090=m # # SEC control devices for DVB-S # CONFIG_DVB_DRX39XYJ=m CONFIG_DVB_LNBP21=m CONFIG_DVB_LNBP22=m CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m CONFIG_DVB_A8293=m CONFIG_DVB_LGS8GXX=m CONFIG_DVB_ATBM8830=m CONFIG_DVB_IX2505V=m CONFIG_DVB_M88RS2000=m CONFIG_DVB_AF9033=m # # Common Interface (EN50221) controller drivers # CONFIG_DVB_SP2=m # end of Media ancillary drivers # # Graphics support # CONFIG_VGA_ARB=y CONFIG_VGA_ARB_MAX_GPUS=16 CONFIG_DRM=y CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DEBUG_MM is not set # CONFIG_DRM_DEBUG_SELFTEST is not set CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_LOAD_EDID_FIRMWARE is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_TTM=y CONFIG_DRM_GEM_CMA_HELPER=y CONFIG_DRM_KMS_CMA_HELPER=y CONFIG_DRM_GEM_SHMEM_HELPER=y # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # end of I2C encoder or helper chips # # ARM devices # # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_KOMEDA is not set # end of ARM devices # CONFIG_DRM_RADEON is not set # CONFIG_DRM_AMDGPU is not set # CONFIG_DRM_NOUVEAU is not set # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set # CONFIG_DRM_VMWGFX is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_AST is not set # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_USE_LVDS is not set # CONFIG_DRM_QXL is not set # CONFIG_DRM_VIRTIO_GPU is not set CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_ABT_Y030XX067A is not set # CONFIG_DRM_PANEL_ARM_VERSATILE is not set # CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set # CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set # CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set # CONFIG_DRM_PANEL_DSI_CM is not set # CONFIG_DRM_PANEL_LVDS is not set # CONFIG_DRM_PANEL_SIMPLE is not set # CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set # CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set # CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set # CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set # CONFIG_DRM_PANEL_KHADAS_TS050 is not set # CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set # CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set # CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LB035Q02 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set # CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set # CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set # CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set # CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set # CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set # CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set # CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set # CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set # CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set # CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set # CONFIG_DRM_PANEL_RONBO_RB070D30 is not set # CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set # CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set # CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set # CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set # CONFIG_DRM_PANEL_SONY_ACX424AKP is not set # CONFIG_DRM_PANEL_SONY_ACX565AKM is not set # CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set # CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set # CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set # CONFIG_DRM_PANEL_TPO_TPG110 is not set # CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set # CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set # CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set # CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9611 is not set # CONFIG_DRM_LONTIUM_LT9611UXC is not set # CONFIG_DRM_ITE_IT66121 is not set # CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NWL_MIPI_DSI is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_PARADE_PS8640 is not set # CONFIG_DRM_SIL_SII8620 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_SII9234 is not set # CONFIG_DRM_SIMPLE_BRIDGE is not set # CONFIG_DRM_THINE_THC63LVD1024 is not set # CONFIG_DRM_TOSHIBA_TC358762 is not set # CONFIG_DRM_TOSHIBA_TC358764 is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TOSHIBA_TC358768 is not set # CONFIG_DRM_TOSHIBA_TC358775 is not set # CONFIG_DRM_TI_TFP410 is not set # CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_ANALOGIX_ANX7625 is not set # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_CDNS_MHDP8546 is not set # end of Display Interface Bridges # CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_HISI_HIBMC is not set # CONFIG_DRM_HISI_KIRIN is not set # CONFIG_DRM_MESON is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_BOCHS is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set # CONFIG_TINYDRM_ILI9486 is not set # CONFIG_TINYDRM_MI0283QT is not set # CONFIG_TINYDRM_REPAPER is not set # CONFIG_TINYDRM_ST7586 is not set # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_LIMA is not set # CONFIG_DRM_PANFROST is not set # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y # CONFIG_FB_MODE_HELPERS is not set # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_I740 is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_S3 is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VT8623 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_ARK is not set # CONFIG_FB_PM3 is not set # CONFIG_FB_CARMINE is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # CONFIG_FB_SM712 is not set # end of Frame buffer Devices # # Backlight & LCD device support # CONFIG_LCD_CLASS_DEVICE=y # CONFIG_LCD_L4F00242T03 is not set # CONFIG_LCD_LMS283GF05 is not set # CONFIG_LCD_LTV350QV is not set # CONFIG_LCD_ILI922X is not set # CONFIG_LCD_ILI9320 is not set # CONFIG_LCD_TDO24M is not set # CONFIG_LCD_VGG2432A4 is not set # CONFIG_LCD_PLATFORM is not set # CONFIG_LCD_AMS369FG06 is not set # CONFIG_LCD_LMS501KF03 is not set # CONFIG_LCD_HX8357 is not set # CONFIG_LCD_OTM3225A is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_KTD253 is not set # CONFIG_BACKLIGHT_PWM is not set # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # CONFIG_BACKLIGHT_LED is not set # end of Backlight & LCD device support CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER=y # end of Console display driver support # CONFIG_LOGO is not set # end of Graphics support CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_HWDEP=y CONFIG_SND_RAWMIDI=y CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y # CONFIG_SND_HRTIMER is not set CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 # CONFIG_SND_SUPPORT_OLD_API is not set CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_SEQUENCER is not set # CONFIG_SND_DRIVERS is not set # CONFIG_SND_PCI is not set # # HD-Audio # # end of HD-Audio CONFIG_SND_HDA_PREALLOC_SIZE=64 CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y # CONFIG_SND_USB_UA101 is not set # CONFIG_SND_USB_CAIAQ is not set # CONFIG_SND_USB_6FIRE is not set # CONFIG_SND_USB_HIFACE is not set # CONFIG_SND_BCD2000 is not set # CONFIG_SND_USB_POD is not set # CONFIG_SND_USB_PODHD is not set # CONFIG_SND_USB_TONEPORT is not set # CONFIG_SND_USB_VARIAX is not set CONFIG_SND_SOC=y # CONFIG_SND_SOC_ADI is not set # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # CONFIG_SND_SOC_FSL_AUDMIX is not set # 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_FSL_XCVR is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # end of SoC Audio for Freescale CPUs # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_MTK_BTCVSD is not set # # ASoC support for Amlogic platforms # CONFIG_SND_MESON_AIU=y # CONFIG_SND_MESON_AXG_FRDDR is not set # CONFIG_SND_MESON_AXG_TODDR is not set # CONFIG_SND_MESON_AXG_TDMIN is not set # CONFIG_SND_MESON_AXG_TDMOUT is not set # CONFIG_SND_MESON_AXG_SOUND_CARD is not set # CONFIG_SND_MESON_AXG_SPDIFOUT is not set # CONFIG_SND_MESON_AXG_SPDIFIN is not set # CONFIG_SND_MESON_AXG_PDM is not set CONFIG_SND_MESON_CARD_UTILS=y CONFIG_SND_MESON_CODEC_GLUE=y CONFIG_SND_MESON_GX_SOUND_CARD=y CONFIG_SND_MESON_G12A_TOACODEC=y # CONFIG_SND_MESON_G12A_TOHDMITX is not set CONFIG_SND_SOC_MESON_T9015=y # end of ASoC support for Amlogic platforms # CONFIG_SND_SOC_SOF_TOPLEVEL is not set # # STMicroelectronics STM32 SOC audio support # # end of 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_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1372_SPI is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set # CONFIG_SND_SOC_ADAU7002 is not set # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4458 is not set # CONFIG_SND_SOC_AK4554 is not set # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS4234 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # 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_CX2072X is not set # CONFIG_SND_SOC_DA7213 is not set # CONFIG_SND_SOC_DMIC is not set # CONFIG_SND_SOC_ES7134 is not set # CONFIG_SND_SOC_ES7241 is not set CONFIG_SND_SOC_ES8316=y # CONFIG_SND_SOC_ES8328_I2C is not set # CONFIG_SND_SOC_ES8328_SPI is not set # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set # CONFIG_SND_SOC_MAX98088 is not set # CONFIG_SND_SOC_MAX98357A is not set # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_ANALOG is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set # CONFIG_SND_SOC_PCM186X_I2C is not set # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set # CONFIG_SND_SOC_PCM5102A 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_RL6231=y # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set # CONFIG_SND_SOC_RT5640 is not set CONFIG_SND_SOC_RT5651=y # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_SGTL5000 is not set # CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set # CONFIG_SND_SOC_SIMPLE_MUX is not set CONFIG_SND_SOC_SPDIF=m # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set # CONFIG_SND_SOC_TLV320AIC3X_I2C is not set # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731 is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set # 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 # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set # CONFIG_SND_SOC_ZL38060 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_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8822 is not set # CONFIG_SND_SOC_NAU8824 is not set # CONFIG_SND_SOC_TPA6130A2 is not set # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set # end of CODEC drivers # CONFIG_SND_SIMPLE_CARD is not set # CONFIG_SND_AUDIO_GRAPH_CARD is not set # # HID support # CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set # CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_ASUS is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set # CONFIG_HID_BETOP_FF is not set # CONFIG_HID_BIGBEN_FF is not set # CONFIG_HID_CHERRY is not set # CONFIG_HID_CHICONY is not set # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CREATIVE_SB0540 is not set # CONFIG_HID_CYPRESS is not set # CONFIG_HID_DRAGONRISE is not set # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set # CONFIG_HID_EZKEY is not set CONFIG_HID_FIRETV=m # CONFIG_HID_FT260 is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_GLORIOUS is not set # CONFIG_HID_HOLTEK is not set # CONFIG_HID_VIVALDI 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 is not set # CONFIG_HID_JABRA is not set # CONFIG_HID_TWINHAN is not set # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LED is not set # CONFIG_HID_LENOVO is not set # CONFIG_HID_LOGITECH 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 # CONFIG_HID_MONTEREY is not set CONFIG_HID_MULTITOUCH=y CONFIG_HID_NINTENDO=y # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set # CONFIG_HID_ORTEK is not set # CONFIG_HID_PANTHERLORD is not set # CONFIG_HID_PENMOUNT is not set # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PLAYSTATION is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set # CONFIG_HID_SEMITEK is not set CONFIG_HID_SONY=y # CONFIG_SONY_FF is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set # CONFIG_HID_SUNPLUS is not set # CONFIG_HID_RMI is not set # CONFIG_HID_GREENASIA is not set # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set # CONFIG_HID_WIIMOTE is not set # CONFIG_HID_XINMO is not set # CONFIG_HID_XPADNEO is not set # CONFIG_HID_ZEROPLUS is not set # CONFIG_HID_ZYDACRON is not set # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # end of USB HID support # # I2C HID support # # CONFIG_I2C_HID_OF is not set # CONFIG_I2C_HID_OF_GOODIX is not set # end of I2C HID support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y # CONFIG_USB_LED_TRIG is not set # CONFIG_USB_ULPI_BUS is not set # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_PCI=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_OTG is not set # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_LEDS_TRIGGER_USBPORT is not set CONFIG_USB_AUTOSUSPEND_DELAY=2 # CONFIG_USB_MON is not set # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y # CONFIG_USB_XHCI_DBGCAP is not set CONFIG_USB_XHCI_PCI=y # CONFIG_USB_XHCI_PCI_RENESAS is not set CONFIG_USB_XHCI_PLATFORM=y CONFIG_USB_EHCI_HCD=y # CONFIG_USB_EHCI_ROOT_HUB_TT is not set 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 # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set # CONFIG_USB_OHCI_HCD is not set # CONFIG_USB_UHCI_HCD is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_BCMA is not set # CONFIG_USB_HCD_SSB is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=m # CONFIG_USB_PRINTER is not set CONFIG_USB_WDM=m # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set CONFIG_USB_UAS=y # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set CONFIG_USB_DWC3=y CONFIG_USB_DWC3_HOST=y # CONFIG_USB_DWC3_GADGET is not set # CONFIG_USB_DWC3_DUAL_ROLE is not set # # Platform Glue Driver Support # CONFIG_USB_DWC3_HAPS=y CONFIG_USB_DWC3_MESON_G12A=y CONFIG_USB_DWC3_OF_SIMPLE=y # CONFIG_USB_DWC2 is not set # CONFIG_USB_CHIPIDEA is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # CONFIG_USB_SERIAL=y CONFIG_USB_SERIAL_CONSOLE=y CONFIG_USB_SERIAL_GENERIC=y CONFIG_USB_SERIAL_SIMPLE=m CONFIG_USB_SERIAL_AIRCABLE=m CONFIG_USB_SERIAL_ARK3116=m CONFIG_USB_SERIAL_BELKIN=m CONFIG_USB_SERIAL_CH341=m CONFIG_USB_SERIAL_WHITEHEAT=m CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m CONFIG_USB_SERIAL_CP210X=m CONFIG_USB_SERIAL_CYPRESS_M8=m CONFIG_USB_SERIAL_EMPEG=m CONFIG_USB_SERIAL_FTDI_SIO=m CONFIG_USB_SERIAL_VISOR=m CONFIG_USB_SERIAL_IPAQ=m CONFIG_USB_SERIAL_IR=m CONFIG_USB_SERIAL_EDGEPORT=m CONFIG_USB_SERIAL_EDGEPORT_TI=m CONFIG_USB_SERIAL_F81232=m CONFIG_USB_SERIAL_F8153X=m CONFIG_USB_SERIAL_GARMIN=m CONFIG_USB_SERIAL_IPW=m CONFIG_USB_SERIAL_IUU=m CONFIG_USB_SERIAL_KEYSPAN_PDA=m CONFIG_USB_SERIAL_KEYSPAN=m CONFIG_USB_SERIAL_KLSI=m CONFIG_USB_SERIAL_KOBIL_SCT=m CONFIG_USB_SERIAL_MCT_U232=m CONFIG_USB_SERIAL_METRO=m CONFIG_USB_SERIAL_MOS7720=m CONFIG_USB_SERIAL_MOS7840=m CONFIG_USB_SERIAL_MXUPORT=m CONFIG_USB_SERIAL_NAVMAN=m CONFIG_USB_SERIAL_PL2303=m CONFIG_USB_SERIAL_OTI6858=m CONFIG_USB_SERIAL_QCAUX=m CONFIG_USB_SERIAL_QUALCOMM=m CONFIG_USB_SERIAL_SPCP8X5=m CONFIG_USB_SERIAL_SAFE=m CONFIG_USB_SERIAL_SAFE_PADDED=y CONFIG_USB_SERIAL_SIERRAWIRELESS=m CONFIG_USB_SERIAL_SYMBOL=m CONFIG_USB_SERIAL_TI=m CONFIG_USB_SERIAL_CYBERJACK=m CONFIG_USB_SERIAL_WWAN=m CONFIG_USB_SERIAL_OPTION=m CONFIG_USB_SERIAL_OMNINET=m CONFIG_USB_SERIAL_OPTICON=m CONFIG_USB_SERIAL_XSENS_MT=m CONFIG_USB_SERIAL_WISHBONE=m CONFIG_USB_SERIAL_SSU100=m CONFIG_USB_SERIAL_QT2=m CONFIG_USB_SERIAL_UPD78F0730=m CONFIG_USB_SERIAL_XR=m CONFIG_USB_SERIAL_DEBUG=m # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set CONFIG_USB_EZUSB_FX2=m # CONFIG_USB_HUB_USB251XB is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # # USB Physical Layer drivers # CONFIG_USB_PHY=y # CONFIG_NOP_USB_XCEIV is not set CONFIG_USB_GPIO_VBUS=y # CONFIG_USB_ISP1301 is not set CONFIG_USB_ULPI=y CONFIG_USB_ULPI_VIEWPORT=y # end of USB Physical Layer drivers CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GADGET_DEBUG_FILES is not set # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # # USB Peripheral Controller # # CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set CONFIG_USB_SNP_CORE=y CONFIG_USB_SNP_UDC_PLAT=y # CONFIG_USB_M66592 is not set CONFIG_USB_BDC_UDC=y # CONFIG_USB_AMD5536UDC is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_NET2280 is not set # CONFIG_USB_GOKU is not set # CONFIG_USB_EG20T is not set # CONFIG_USB_GADGET_XILINX is not set # CONFIG_USB_MAX3420_UDC is not set # CONFIG_USB_DUMMY_HCD is not set # end of USB Peripheral Controller CONFIG_USB_LIBCOMPOSITE=y CONFIG_USB_U_ETHER=y CONFIG_USB_F_RNDIS=y CONFIG_USB_F_MASS_STORAGE=y CONFIG_USB_F_FS=y CONFIG_USB_F_MIDI=y CONFIG_USB_F_ACC=y CONFIG_USB_F_AUDIO_SRC=y CONFIG_USB_CONFIGFS=y CONFIG_USB_CONFIGFS_UEVENT=y # CONFIG_USB_CONFIGFS_SERIAL is not set # CONFIG_USB_CONFIGFS_ACM is not set # CONFIG_USB_CONFIGFS_OBEX is not set # CONFIG_USB_CONFIGFS_NCM is not set # CONFIG_USB_CONFIGFS_ECM is not set # CONFIG_USB_CONFIGFS_ECM_SUBSET is not set CONFIG_USB_CONFIGFS_RNDIS=y # CONFIG_USB_CONFIGFS_EEM is not set CONFIG_USB_CONFIGFS_MASS_STORAGE=y # CONFIG_USB_CONFIGFS_F_LB_SS is not set CONFIG_USB_CONFIGFS_F_FS=y CONFIG_USB_CONFIGFS_F_ACC=y CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y # CONFIG_USB_CONFIGFS_F_UAC1 is not set # CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set # CONFIG_USB_CONFIGFS_F_UAC2 is not set CONFIG_USB_CONFIGFS_F_MIDI=y # CONFIG_USB_CONFIGFS_F_HID is not set # CONFIG_USB_CONFIGFS_F_UVC is not set # CONFIG_USB_CONFIGFS_F_PRINTER is not set # # USB Gadget precomposed configurations # # CONFIG_USB_ZERO is not set # CONFIG_USB_AUDIO is not set # CONFIG_USB_ETH is not set # CONFIG_USB_G_NCM is not set # CONFIG_USB_GADGETFS is not set # CONFIG_USB_FUNCTIONFS is not set # CONFIG_USB_MASS_STORAGE is not set # CONFIG_USB_G_SERIAL is not set # CONFIG_USB_MIDI_GADGET is not set # CONFIG_USB_G_PRINTER is not set # CONFIG_USB_CDC_COMPOSITE is not set # CONFIG_USB_G_ACM_MS is not set # CONFIG_USB_G_MULTI is not set # CONFIG_USB_G_HID is not set # CONFIG_USB_G_DBGP is not set # CONFIG_USB_G_WEBCAM is not set # CONFIG_USB_RAW_GADGET is not set # end of USB Gadget precomposed configurations CONFIG_TYPEC=m CONFIG_TYPEC_TCPM=m CONFIG_TYPEC_TCPCI=m # CONFIG_TYPEC_RT1711H is not set # CONFIG_TYPEC_TCPCI_MAXIM is not set CONFIG_TYPEC_FUSB302=m CONFIG_TYPEC_UCSI=m # CONFIG_UCSI_CCG is not set # CONFIG_TYPEC_TPS6598X is not set # CONFIG_TYPEC_HD3SS3220 is not set # CONFIG_TYPEC_STUSB160X is not set # # USB Type-C Multiplexer/DeMultiplexer Switch support # # CONFIG_TYPEC_MUX_PI3USB30532 is not set # end of USB Type-C Multiplexer/DeMultiplexer Switch support # # USB Type-C Alternate Mode drivers # # CONFIG_TYPEC_DP_ALTMODE is not set # end of USB Type-C Alternate Mode drivers CONFIG_USB_ROLE_SWITCH=y CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y # CONFIG_PWRSEQ_SD8787 is not set # CONFIG_PWRSEQ_SIMPLE is not set CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set CONFIG_MMC_CRYPTO=y # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_DEBUG is not set # CONFIG_MMC_ARMMMCI is not set # CONFIG_MMC_SDHCI is not set # CONFIG_MMC_MESON_GX is not set # CONFIG_MMC_MESON_MX_SDIO is not set # CONFIG_MMC_TIFM_SD is not set # CONFIG_MMC_SPI is not set # CONFIG_MMC_CB710 is not set # CONFIG_MMC_VIA_SDMMC is not set # CONFIG_MMC_DW is not set # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_CQHCI=y # CONFIG_MMC_HSQ is not set # CONFIG_MMC_TOSHIBA_PCI is not set # CONFIG_MMC_MTK is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y CONFIG_LEDS_CLASS_FLASH=y CONFIG_LEDS_CLASS_MULTICOLOR=y # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_AW2013 is not set # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_EL15203000 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP50XX is not set # CONFIG_LEDS_LP55XX_COMMON is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set CONFIG_LEDS_PWM=y # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set CONFIG_LEDS_TCA6507=m # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set CONFIG_LEDS_IS31FL32XX=m # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_SYSCON is not set # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_SPI_BYTE is not set # CONFIG_LEDS_TI_LMU_COMMON is not set # # Flash and Torch LED drivers # # CONFIG_LEDS_AAT1290 is not set # CONFIG_LEDS_AS3645A is not set # CONFIG_LEDS_KTD2692 is not set # CONFIG_LEDS_LM3601X is not set # CONFIG_LEDS_RT4505 is not set # CONFIG_LEDS_RT8515 is not set # CONFIG_LEDS_SGM3140 is not set # # LED Triggers # CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y # CONFIG_LEDS_TRIGGER_DISK is not set # CONFIG_LEDS_TRIGGER_MTD is not set CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_BACKLIGHT=y CONFIG_LEDS_TRIGGER_CPU=y CONFIG_LEDS_TRIGGER_ACTIVITY=y CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # # iptables trigger is under Netfilter config (LED target) # CONFIG_LEDS_TRIGGER_TRANSIENT=y # CONFIG_LEDS_TRIGGER_CAMERA is not set CONFIG_LEDS_TRIGGER_PANIC=y # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set # CONFIG_LEDS_TRIGGER_AUDIO is not set # CONFIG_LEDS_TRIGGER_TTY is not set # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_SUPPORT=y CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y # CONFIG_RTC_INTF_PROC is not set CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # 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 # CONFIG_RTC_DRV_DS1672 is not set CONFIG_RTC_DRV_HYM8563=y CONFIG_RTC_DRV_HYM8563_SHW_PATCH=y # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # 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_RV3032 is not set # CONFIG_RTC_DRV_RV8803 is not set # CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_MESON_VRTC is not set # CONFIG_RTC_DRV_PL030 is not set # CONFIG_RTC_DRV_PL031 is not set # CONFIG_RTC_DRV_CADENCE is not set # CONFIG_RTC_DRV_FTRTC010 is not set # CONFIG_RTC_DRV_R7301 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # # DMABUF options # CONFIG_SYNC_FILE=y CONFIG_SW_SYNC=y # CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set CONFIG_DMABUF_HEAPS=y # CONFIG_DMABUF_SYSFS_STATS is not set # CONFIG_DMABUF_HEAPS_DEFERRED_FREE is not set # CONFIG_DMABUF_HEAPS_PAGE_POOL is not set # CONFIG_DMABUF_HEAPS_CMA is not set # end of DMABUF options # CONFIG_AUXDISPLAY is not set CONFIG_UIO=y # CONFIG_UIO_CIF is not set # CONFIG_UIO_PDRV_GENIRQ is not set # CONFIG_UIO_DMEM_GENIRQ is not set # CONFIG_UIO_AEC is not set # CONFIG_UIO_SERCOS3 is not set # CONFIG_UIO_PCI_GENERIC is not set # CONFIG_UIO_NETX is not set # CONFIG_UIO_PRUSS is not set # CONFIG_UIO_MF624 is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set CONFIG_VIRTIO_MENU=y # CONFIG_VIRTIO_PCI is not set # CONFIG_VIRTIO_MMIO is not set # CONFIG_VIRTIO_DMA_SHARED_BUFFER is not set # CONFIG_VDPA is not set # CONFIG_VHOST_MENU is not set # # Microsoft Hyper-V guest support # # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_RTL8192U is not set # CONFIG_RTLLIB is not set # CONFIG_RTL8723BS is not set # CONFIG_R8712U is not set # CONFIG_R8188EU is not set # CONFIG_RTS5208 is not set # CONFIG_VT6655 is not set # CONFIG_VT6656 is not set # # IIO staging drivers # # # Accelerometers # # CONFIG_ADIS16203 is not set # CONFIG_ADIS16240 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7816 is not set # CONFIG_AD7280 is not set # end of Analog to digital converters # # Analog digital bi-direction converters # # CONFIG_ADT7316 is not set # end of Analog digital bi-direction converters # # Capacitance to digital converters # # CONFIG_AD7746 is not set # end of Capacitance to digital converters # # Direct Digital Synthesis # # CONFIG_AD9832 is not set # CONFIG_AD9834 is not set # end of Direct Digital Synthesis # # Network Analyzer, Impedance Converters # # CONFIG_AD5933 is not set # end of Network Analyzer, Impedance Converters # # Active energy metering IC # # CONFIG_ADE7854 is not set # end of Active energy metering IC # # Resolver to digital converters # # CONFIG_AD2S1210 is not set # end of Resolver to digital converters # end of IIO staging drivers # CONFIG_FB_SM750 is not set # CONFIG_STAGING_MEDIA is not set # # Android # CONFIG_ASHMEM=y CONFIG_DEBUG_KINFO=y # end of Android # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_GS_FPGABOOT is not set # CONFIG_UNISYSSPAR is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set # CONFIG_FB_TFT is not set # CONFIG_KS7010 is not set # CONFIG_PI433 is not set # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_FIELDBUS_DEV is not set # CONFIG_QLGE is not set # CONFIG_WFX is not set # CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Clock driver for ARM Reference designs # # CONFIG_ICST is not set # CONFIG_CLK_SP810 is not set # end of Clock driver for ARM Reference designs # CONFIG_LMK04832 is not set # CONFIG_COMMON_CLK_MAX9485 is not set CONFIG_COMMON_CLK_SCPI=y # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set # CONFIG_COMMON_CLK_AXI_CLKGEN is not set # CONFIG_COMMON_CLK_XGENE is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_VC5 is not set CONFIG_COMMON_CLK_BD718XX=y # CONFIG_COMMON_CLK_FIXED_MMIO is not set # # Clock support for Amlogic platforms # # CONFIG_COMMON_CLK_GXBB is not set # CONFIG_COMMON_CLK_AXG is not set # CONFIG_COMMON_CLK_AXG_AUDIO is not set # CONFIG_COMMON_CLK_G12A is not set # end of Clock support for Amlogic platforms # CONFIG_XILINX_VCU is not set CONFIG_HWSPINLOCK=y # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_PROBE=y # CONFIG_SUN4I_TIMER is not set CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y CONFIG_FSL_ERRATUM_A008585=y CONFIG_HISILICON_ERRATUM_161010101=y CONFIG_ARM64_ERRATUM_858921=y # CONFIG_MICROCHIP_PIT64B is not set # end of Clock Source drivers CONFIG_MAILBOX=y # CONFIG_ARM_MHU is not set # CONFIG_ARM_MHU_V2 is not set # CONFIG_PLATFORM_MHU is not set # CONFIG_PL320_MBOX is not set # CONFIG_ALTERA_MBOX is not set # CONFIG_MAILBOX_TEST is not set CONFIG_IOMMU_IOVA=y CONFIG_IOASID=y CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # CONFIG_IOMMU_IO_PGTABLE=y CONFIG_IOMMU_IO_PGTABLE_LPAE=y # CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set # CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set CONFIG_IOMMU_DEFAULT_DMA_STRICT=y # CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_OF_IOMMU=y CONFIG_IOMMU_DMA=y CONFIG_IOMMU_SVA_LIB=y # CONFIG_ARM_SMMU is not set CONFIG_ARM_SMMU_V3=y CONFIG_ARM_SMMU_V3_SVA=y # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # end of Remoteproc drivers # # Rpmsg drivers # # CONFIG_RPMSG_QCOM_GLINK_RPM is not set # CONFIG_RPMSG_VIRTIO is not set # end of Rpmsg drivers # CONFIG_SOUNDWIRE is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # CONFIG_MESON_CANVAS is not set # CONFIG_MESON_CLK_MEASURE is not set # CONFIG_MESON_GX_SOCINFO is not set # CONFIG_MESON_GX_PM_DOMAINS is not set # CONFIG_MESON_EE_PM_DOMAINS is not set # end of Amlogic SoC drivers # # Broadcom SoC drivers # # CONFIG_SOC_BRCMSTB is not set # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # CONFIG_QUICC_ENGINE is not set # CONFIG_FSL_RCPM is not set # end of NXP/Freescale QorIQ SoC drivers # # i.MX SoC drivers # # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # CONFIG_LITEX_SOC_CONTROLLER is not set # end of Enable LiteX SoC Builder specific drivers # # Qualcomm SoC drivers # # end of Qualcomm SoC drivers # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y CONFIG_DEVFREQ_GOV_PERFORMANCE=y CONFIG_DEVFREQ_GOV_POWERSAVE=y CONFIG_DEVFREQ_GOV_USERSPACE=y # CONFIG_DEVFREQ_GOV_PASSIVE is not set # # DEVFREQ Drivers # # CONFIG_PM_DEVFREQ_EVENT is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_FSA9480 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_TUSB320 is not set # CONFIG_MEMORY is not set CONFIG_IIO=y CONFIG_IIO_BUFFER=y # CONFIG_IIO_BUFFER_CB is not set # CONFIG_IIO_BUFFER_DMA is not set # CONFIG_IIO_BUFFER_DMAENGINE is not set # CONFIG_IIO_BUFFER_HW_CONSUMER is not set # CONFIG_IIO_KFIFO_BUF is not set # CONFIG_IIO_TRIGGERED_BUFFER is not set # CONFIG_IIO_CONFIGFS is not set CONFIG_IIO_TRIGGER=y CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # CONFIG_IIO_SW_DEVICE is not set # CONFIG_IIO_SW_TRIGGER is not set # CONFIG_IIO_TRIGGERED_EVENT is not set # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADXL345_I2C is not set # CONFIG_ADXL345_SPI is not set # CONFIG_ADXL372_SPI is not set # CONFIG_ADXL372_I2C is not set # CONFIG_BMA180 is not set # CONFIG_BMA220 is not set # CONFIG_BMA400 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_BMI088_ACCEL is not set # CONFIG_DA280 is not set # CONFIG_DA311 is not set # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_DMARD10 is not set # CONFIG_FXLS8962AF_I2C is not set # CONFIG_FXLS8962AF_SPI is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MC3230 is not set # CONFIG_MMA7455_I2C is not set # CONFIG_MMA7455_SPI is not set # CONFIG_MMA7660 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MXC4005 is not set # CONFIG_MXC6255 is not set # CONFIG_SCA3000 is not set # CONFIG_SCA3300 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7091R5 is not set # CONFIG_AD7124 is not set # CONFIG_AD7192 is not set # CONFIG_AD7266 is not set # CONFIG_AD7291 is not set # CONFIG_AD7292 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_AD7780 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD7949 is not set # CONFIG_AD799X is not set # CONFIG_ADI_AXI_ADC is not set # CONFIG_CC10001_ADC is not set # CONFIG_ENVELOPE_DETECTOR is not set # CONFIG_HI8435 is not set # CONFIG_HX711 is not set # CONFIG_INA2XX_ADC is not set # CONFIG_LTC2471 is not set # CONFIG_LTC2485 is not set # CONFIG_LTC2496 is not set # CONFIG_LTC2497 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX11100 is not set # CONFIG_MAX1118 is not set # CONFIG_MAX1241 is not set # CONFIG_MAX1363 is not set # CONFIG_MAX9611 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_MCP3911 is not set # CONFIG_MESON_SARADC is not set # CONFIG_NAU7802 is not set # CONFIG_QCOM_SPMI_IADC is not set # CONFIG_QCOM_SPMI_VADC is not set # CONFIG_QCOM_SPMI_ADC5 is not set # CONFIG_SD_ADC_MODULATOR is not set # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC0832 is not set # CONFIG_TI_ADC084S021 is not set # CONFIG_TI_ADC12138 is not set # CONFIG_TI_ADC108S102 is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_TI_ADC161S626 is not set # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS7950 is not set # CONFIG_TI_ADS8344 is not set # CONFIG_TI_ADS8688 is not set # CONFIG_TI_ADS124S08 is not set # CONFIG_TI_ADS131E08 is not set # CONFIG_TI_TLC4541 is not set # CONFIG_TI_TSC2046 is not set # CONFIG_VF610_ADC is not set # CONFIG_XILINX_XADC is not set # end of Analog to digital converters # # Analog to digital and digital to analog converters # # end of Analog to digital and digital to analog converters # # Analog Front Ends # # CONFIG_IIO_RESCALE is not set # end of Analog Front Ends # # Amplifiers # # CONFIG_AD8366 is not set # CONFIG_HMC425 is not set # end of Amplifiers # # Capacitance to digital converters # # CONFIG_AD7150 is not set # end of Capacitance to digital converters # # Chemical Sensors # # CONFIG_ATLAS_PH_SENSOR is not set # CONFIG_ATLAS_EZO_SENSOR is not set # CONFIG_BME680 is not set # CONFIG_CCS811 is not set # CONFIG_IAQCORE is not set # CONFIG_PMS7003 is not set # CONFIG_SCD30_CORE is not set # CONFIG_SENSIRION_SGP30 is not set # CONFIG_SENSIRION_SGP40 is not set # CONFIG_SPS30_I2C is not set # CONFIG_SPS30_SERIAL is not set # CONFIG_VZ89X is not set # end of Chemical Sensors # # Hid Sensor IIO Common # # end of Hid Sensor IIO Common # # IIO SCMI Sensors # # end of IIO SCMI Sensors # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # end of SSP Sensor Common # # Digital to analog converters # # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5592R is not set # CONFIG_AD5593R is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_AD5686_SPI is not set # CONFIG_AD5696_I2C is not set # CONFIG_AD5755 is not set # CONFIG_AD5758 is not set # CONFIG_AD5761 is not set # CONFIG_AD5764 is not set # CONFIG_AD5766 is not set # CONFIG_AD5770R is not set # CONFIG_AD5791 is not set # CONFIG_AD7303 is not set # CONFIG_AD8801 is not set # CONFIG_DPOT_DAC is not set # CONFIG_DS4424 is not set # CONFIG_LTC1660 is not set # CONFIG_LTC2632 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # 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 # end of Digital to analog converters # # IIO dummy driver # # end of IIO dummy driver # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # end of Clock Generator/Distribution # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # CONFIG_ADF4371 is not set # end of Phase-Locked Loop (PLL) frequency synthesizers # end of Frequency Synthesizers DDS/PLL # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS290 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_FXAS21002C is not set # CONFIG_MPU3050_I2C is not set # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # end of Digital gyroscope sensors # # Health Sensors # # # Heart Rate Monitors # # CONFIG_AFE4403 is not set # CONFIG_AFE4404 is not set # CONFIG_MAX30100 is not set # CONFIG_MAX30102 is not set # end of Heart Rate Monitors # end of Health Sensors # # Humidity sensors # # CONFIG_AM2315 is not set # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HDC2010 is not set # CONFIG_HTS221 is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # end of Humidity sensors # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16460 is not set # CONFIG_ADIS16475 is not set # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set # CONFIG_FXOS8700_I2C is not set # CONFIG_FXOS8700_SPI is not set # CONFIG_KMX61 is not set # CONFIG_INV_ICM42600_I2C is not set # CONFIG_INV_ICM42600_SPI is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set # CONFIG_IIO_ST_LSM6DSX is not set # CONFIG_IIO_ST_LSM9DS0 is not set # end of Inertial measurement units # # Light sensors # # CONFIG_ADJD_S311 is not set # CONFIG_ADUX1020 is not set # CONFIG_AL3010 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_AS73211 is not set # CONFIG_BH1750 is not set # CONFIG_BH1780 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM3605 is not set # CONFIG_CM36651 is not set # CONFIG_GP2AP002 is not set # CONFIG_GP2AP020A00F is not set # CONFIG_SENSORS_ISL29018 is not set # CONFIG_SENSORS_ISL29028 is not set # CONFIG_ISL29125 is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_LV0104CS is not set # CONFIG_MAX44000 is not set # CONFIG_MAX44009 is not set # CONFIG_NOA1305 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1133 is not set # CONFIG_SI1145 is not set # CONFIG_STK3310 is not set # CONFIG_ST_UVIS25 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set # CONFIG_SENSORS_TSL2563 is not set # CONFIG_TSL2583 is not set # CONFIG_TSL2591 is not set # CONFIG_TSL2772 is not set # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VCNL4035 is not set # CONFIG_VEML6030 is not set # CONFIG_VEML6070 is not set # CONFIG_VL6180 is not set # CONFIG_ZOPT2201 is not set # end of Light sensors # # Magnetometer sensors # # CONFIG_AK8974 is not set # CONFIG_AK8975 is not set # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN_I2C is not set # CONFIG_BMC150_MAGN_SPI is not set # CONFIG_MAG3110 is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # CONFIG_SENSORS_RM3100_I2C is not set # CONFIG_SENSORS_RM3100_SPI is not set # CONFIG_YAMAHA_YAS530 is not set # end of Magnetometer sensors # # Multiplexers # # CONFIG_IIO_MUX is not set # end of Multiplexers # # Inclinometer sensors # # end of Inclinometer sensors # # Triggers - standalone # # CONFIG_IIO_INTERRUPT_TRIGGER is not set # CONFIG_IIO_SYSFS_TRIGGER is not set # end of Triggers - standalone # # Linear and angular position sensors # # end of Linear and angular position sensors # # Digital potentiometers # # CONFIG_AD5110 is not set # CONFIG_AD5272 is not set # CONFIG_DS1803 is not set # CONFIG_MAX5432 is not set # CONFIG_MAX5481 is not set # CONFIG_MAX5487 is not set # CONFIG_MCP4018 is not set # CONFIG_MCP4131 is not set # CONFIG_MCP4531 is not set # CONFIG_MCP41010 is not set # CONFIG_TPL0102 is not set # end of Digital potentiometers # # Digital potentiostats # # CONFIG_LMP91000 is not set # end of Digital potentiostats # # Pressure sensors # # CONFIG_ABP060MG is not set # CONFIG_BMP280 is not set # CONFIG_DLHL60D is not set # CONFIG_DPS310 is not set # CONFIG_HP03 is not set # CONFIG_ICP10100 is not set # CONFIG_MPL115_I2C is not set # CONFIG_MPL115_SPI is not set # CONFIG_MPL3115 is not set # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # CONFIG_HP206C is not set # CONFIG_ZPA2326 is not set # end of Pressure sensors # # Lightning sensors # # CONFIG_AS3935 is not set # end of Lightning sensors # # Proximity and distance sensors # # CONFIG_ISL29501 is not set # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_MB1232 is not set # CONFIG_PING is not set # CONFIG_RFD77402 is not set # CONFIG_SRF04 is not set # CONFIG_SX9310 is not set # CONFIG_SX9500 is not set # CONFIG_SRF08 is not set # CONFIG_VCNL3020 is not set # CONFIG_VL53L0X_I2C is not set # end of Proximity and distance sensors # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1200 is not set # end of Resolver to digital converters # # Temperature sensors # # CONFIG_LTC2983 is not set # CONFIG_MAXIM_THERMOCOUPLE is not set # CONFIG_MLX90614 is not set # CONFIG_MLX90632 is not set # CONFIG_TMP006 is not set # CONFIG_TMP007 is not set # CONFIG_TMP117 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_MAX31856 is not set # end of Temperature sensors # CONFIG_NTB is not set # CONFIG_VME_BUS is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_DEBUG is not set # CONFIG_PWM_ATMEL_TCB is not set # CONFIG_PWM_DWC is not set # CONFIG_PWM_FSL_FTM is not set CONFIG_PWM_GPIO=y # CONFIG_PWM_MESON is not set # CONFIG_PWM_PCA9685 is not set # # IRQ chip support # CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 CONFIG_ARM_GIC_V2M=y CONFIG_ARM_GIC_V3=y CONFIG_ARM_GIC_V3_ITS=y CONFIG_ARM_GIC_V3_ITS_PCI=y # CONFIG_AL_FIC is not set CONFIG_PARTITION_PERCPU=y # CONFIG_MESON_IRQ_GPIO is not set # end of IRQ chip support # CONFIG_IPACK_BUS is not set CONFIG_RESET_CONTROLLER=y CONFIG_GPIO_RESET_CONTROLLER=y # CONFIG_RESET_MESON is not set # CONFIG_RESET_MESON_AUDIO_ARB is not set # CONFIG_RESET_TI_SYSCON is not set # # PHY Subsystem # # CONFIG_GENERIC_PHY is not set # CONFIG_PHY_XGENE is not set # CONFIG_PHY_CAN_TRANSCEIVER is not set # CONFIG_PHY_MESON8B_USB2 is not set # CONFIG_PHY_MESON_GXL_USB2 is not set # CONFIG_PHY_MESON_G12A_USB2 is not set # CONFIG_PHY_MESON_G12A_USB3_PCIE is not set # CONFIG_PHY_MESON_AXG_PCIE is not set # CONFIG_PHY_MESON_AXG_MIPI_PCIE_ANALOG is not set # CONFIG_PHY_MESON_AXG_MIPI_DPHY is not set # CONFIG_BCM_KONA_USB2_PHY is not set # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_CADENCE_SALVO is not set # CONFIG_PHY_FSL_IMX8MQ_USB is not set # CONFIG_PHY_MIXEL_MIPI_DPHY is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_CPCAP_USB is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set # CONFIG_PHY_OCELOT_SERDES is not set # end of PHY Subsystem # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCI_PMU is not set # CONFIG_ARM_CCN is not set # CONFIG_ARM_CMN is not set CONFIG_ARM_PMU=y CONFIG_ARM_DSU_PMU=y # CONFIG_ARM_SPE_PMU is not set # end of Performance monitor support # CONFIG_RAS is not set # CONFIG_USB4 is not set # # Android # CONFIG_ANDROID=y CONFIG_ANDROID_BINDER_IPC=y CONFIG_ANDROID_BINDERFS=y CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder" # CONFIG_ANDROID_BINDER_IPC_SELFTEST is not set # CONFIG_ANDROID_DEBUG_SYMBOLS is not set CONFIG_ANDROID_VENDOR_HOOKS=y CONFIG_ANDROID_KABI_RESERVE=y CONFIG_ANDROID_VENDOR_OEM_DATA=y # end of Android # CONFIG_LIBNVDIMM is not set # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y # CONFIG_NVMEM_SPMI_SDAM is not set # CONFIG_MESON_MX_EFUSE is not set # CONFIG_NVMEM_RMEM is not set # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_FSI is not set # CONFIG_TEE is not set CONFIG_MULTIPLEXER=m # # Multiplexer drivers # CONFIG_MUX_ADG792A=m CONFIG_MUX_ADGS1408=m CONFIG_MUX_GPIO=m CONFIG_MUX_MMIO=m # end of Multiplexer drivers CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set CONFIG_AMLOGIC_DRIVER=y CONFIG_AMLOGIC_BREAK_GKI_20=y CONFIG_AMLOGIC_BREAK_GKI=y CONFIG_AMLOGIC_MODIFY=y CONFIG_AMLOGIC_IN_KERNEL_MODULES=y CONFIG_AMLOGIC_KERNEL_VERSION=13515 # # Amlogic Device Drivers # CONFIG_AMLOGIC_SERIAL_MESON=y CONFIG_AMLOGIC_SERIAL_EARLY_CONSOLE=y CONFIG_AMLOGIC_SERIAL_MESON_CONSOLE=y # # Clock support for Amlogic platforms # CONFIG_AMLOGIC_COMMON_CLK=y CONFIG_AMLOGIC_COMMON_CLK_MESON_REGMAP=y CONFIG_AMLOGIC_COMMON_CLK_MESON_DUALDIV=y CONFIG_AMLOGIC_COMMON_CLK_MESON_MPLL=y CONFIG_AMLOGIC_COMMON_CLK_MESON_PHASE=y CONFIG_AMLOGIC_COMMON_CLK_MESON_PLL=y CONFIG_AMLOGIC_COMMON_CLK_MESON_SCLK_DIV=y CONFIG_AMLOGIC_COMMON_CLK_MESON_VID_PLL_DIV=y CONFIG_AMLOGIC_COMMON_CLK_MESON_AO_CLKC=y CONFIG_AMLOGIC_COMMON_CLK_MESON_EE_CLKC=y CONFIG_AMLOGIC_COMMON_CLK_MESON_CPU_DYNDIV=y CONFIG_AMLOGIC_MESON_CLK_MEASURE=y CONFIG_AMLOGIC_CLK_DEBUG=y CONFIG_AMLOGIC_COMMON_CLK_S4=y CONFIG_AMLOGIC_COMMON_CLK_SC2=y # CONFIG_AMLOGIC_COMMON_CLK_C2 is not set # CONFIG_AMLOGIC_COMMON_CLK_C3 is not set # CONFIG_AMLOGIC_COMMON_CLK_A1 is not set # CONFIG_AMLOGIC_COMMON_CLK_T3 is not set CONFIG_AMLOGIC_COMMON_CLK_T7=y # CONFIG_AMLOGIC_COMMON_CLK_T5M is not set CONFIG_AMLOGIC_COMMON_CLK_G12A=y CONFIG_AMLOGIC_COMMON_CLK_S5=y # CONFIG_AMLOGIC_COMMON_CLK_T5W is not set # CONFIG_AMLOGIC_COMMON_CLK_T3X is not set # CONFIG_AMLOGIC_COMMON_CLK_TXHD2 is not set # CONFIG_AMLOGIC_COMMON_CLK_C1 is not set # CONFIG_AMLOGIC_COMMON_CLK_S1A is not set # CONFIG_AMLOGIC_COMMON_CLK_T5D is not set # CONFIG_AMLOGIC_COMMON_CLK_TM2 is not set CONFIG_AMLOGIC_COMMON_CLK_S7=y CONFIG_AMLOGIC_COMMON_CLK_S7D=y CONFIG_AMLOGIC_COMMON_CLK_S6=y # CONFIG_AMLOGIC_COMMON_CLK_T6D is not set # end of Clock support for Amlogic platforms CONFIG_AMLOGIC_SECMON=y # CONFIG_AMLOGIC_DOLBY_FW is not set CONFIG_AMLOGIC_DRM=y CONFIG_AMLOGIC_DRM_VPU=y # CONFIG_AMLOGIC_DRM_PANEL is not set CONFIG_AMLOGIC_DRM_USE_ION=y CONFIG_AMLOGIC_DRM_EMULATE_FBDEV=y # # Amlogic multimedia configuration # CONFIG_AMLOGIC_MEDIA_MODULE=y CONFIG_AMLOGIC_MEDIA_ENABLE=y CONFIG_AMLOGIC_MEDIA_COMMON=y CONFIG_AMLOGIC_MEDIA_DRIVERS=y CONFIG_AMLOGIC_MEDIA_MULTI_DEC=y # CONFIG_AMLOGIC_MEDIA_NO_PARSER is not set # # Canvas management driver # CONFIG_AMLOGIC_MEDIA_CANVAS=y # end of Canvas management driver # # Amlogic GE2D Module # CONFIG_AMLOGIC_MEDIA_GE2D=y # CONFIG_AMLOGIC_MEDIA_GE2D_MORE_SECURITY is not set # end of Amlogic GE2D Module # # ION support # CONFIG_AMLOGIC_ION_DEV=y CONFIG_AMLOGIC_ION=y CONFIG_AMLOGIC_ION_SYSTEM_HEAP=y # end of ION support # # Amlogic VPU Driver Support # CONFIG_AMLOGIC_VPU=y CONFIG_AMLOGIC_VPU_DYNAMIC_ADJ=y # end of Amlogic VPU Driver Support # # RDMA management driver # CONFIG_AMLOGIC_MEDIA_RDMA=y CONFIG_AMLOGIC_MEDIA_VSYNC_RDMA=y # end of RDMA management driver CONFIG_AMLOGIC_MEDIA_VFM=y CONFIG_AMLOGIC_MEDIA_CODEC_MM=y CONFIG_AMLOGIC_VIDEOBUF_RESOURCE=y # CONFIG_AMLOGIC_MEDIA_V4L2 is not set CONFIG_AMLOGIC_UVM_CORE=y CONFIG_AMLOGIC_UVM_ALLOCATOR=y # # LUT DMA management driver # CONFIG_AMLOGIC_MEDIA_LUT_DMA=y # end of LUT DMA management driver # # VPU SECURITY driver # CONFIG_AMLOGIC_MEDIA_SECURITY=y # end of VPU SECURITY driver # # ResManage driver # CONFIG_AMLOGIC_MEDIA_RESMANAGE=y # end of ResManage driver # # Amlogic dma-buf support # # CONFIG_AMLOGIC_SECURE_DMABUF is not set # CONFIG_AMLOGIC_HEAP_CMA is not set # CONFIG_AMLOGIC_HEAP_CODEC_MM is not set # end of Amlogic dma-buf support # CONFIG_AMLOGIC_HEAP_SECURE is not set # # SW_SYNC driver # CONFIG_AMLOGIC_MEDIA_SW_SYNC=y # end of SW_SYNC driver # # Amlogic VICP Module # CONFIG_AMLOGIC_MEDIA_VICP=y # end of Amlogic VICP Module # # MediaProxy driver # # CONFIG_AMLOGIC_MEDIA_PROXY is not set # end of MediaProxy driver # # Amlogic Vout Driver Support # CONFIG_AMLOGIC_VOUT=y CONFIG_AMLOGIC_VOUT_CLK_SERVE=y CONFIG_AMLOGIC_VOUT_SERVE=y CONFIG_AMLOGIC_VOUT2_SERVE=y CONFIG_AMLOGIC_VOUT3_SERVE=y # # Amlogic DisplayPort Output Module # # CONFIG_AMLOGIC_DisplayPort_TX is not set # end of Amlogic DisplayPort Output Module # # Amlogic LCD Output Module # CONFIG_AMLOGIC_LCD=y CONFIG_AMLOGIC_LCD_TV=y CONFIG_AMLOGIC_LCD_TABLET=y # # Amlogic Backlight Support # # CONFIG_AMLOGIC_BACKLIGHT is not set # end of Amlogic Backlight Support CONFIG_AMLOGIC_LCD_EXTERN=y # CONFIG_AMLOGIC_LCD_EXTERN_I2C_ANX6862_7911 is not set # CONFIG_AMLOGIC_LCD_EXTERN_I2C_CS602 is not set # CONFIG_AMLOGIC_LCD_EXTERN_I2C_OLED is not set # # Amlogic Ambilight Support # # CONFIG_AMLOGIC_AMBILIGHT is not set # end of Amlogic Ambilight Support # end of Amlogic LCD Output Module # # Amlogic HDMITX Common Module # CONFIG_AMLOGIC_HDMITX_COMMON=y # end of Amlogic HDMITX Common Module # # Amlogic Peripheral_lcd Support # # CONFIG_AMLOGIC_PERIPHERAL_LCD is not set # end of Amlogic Peripheral_lcd Support # # Amlogic DSC_ENCODER Module # # CONFIG_AMLOGIC_DSC is not set # end of Amlogic DSC_ENCODER Module # # Amlogic HDMITX Module # CONFIG_AMLOGIC_HDMITX21=y # end of Amlogic HDMITX Module # # Amlogic HDMITX Module # CONFIG_AMLOGIC_HDMITX=y # end of Amlogic HDMITX Module CONFIG_AMLOGIC_CVBS_OUTPUT=y CONFIG_AMLOGIC_WSS=y CONFIG_AMLOGIC_VOUT_CC_BYPASS=y CONFIG_AMLOGIC_VDAC=y # end of Amlogic Vout Driver Support # # Amlogic Camera Support # # CONFIG_AMLOGIC_VIDEO_CAPTURE is not set # CONFIG_AMLOGIC_VIDEO_CAPTURE_OV5640 is not set # CONFIG_AMLOGIC_MEDIA_CAMERA_UTILS is not set # end of Amlogic Camera Support # # Amlogic Video Sink Driver Support # CONFIG_AMLOGIC_MEDIA_VIDEO=y CONFIG_AMLOGIC_MEDIA_VIDEOCAPTURE=y # CONFIG_AMLOGIC_MEDIA_DUMMY_PROVIDER is not set # end of Amlogic Video Sink Driver Support # # Amlogic VRR Drivers # # # Amlogic VRR Driver # CONFIG_AMLOGIC_MEDIA_VRR=y # end of Amlogic VRR Driver # # Amlogic OSD Module # CONFIG_AMLOGIC_MEDIA_FB=y CONFIG_AMLOGIC_MEDIA_FB_OSD_SYNC_FENCE=y # CONFIG_AMLOGIC_MEDIA_FB_OSD_VSYNC_RDMA is not set CONFIG_AMLOGIC_MEDIA_FB_OSD2_ENABLE=y CONFIG_AMLOGIC_MEDIA_FB_OSD2_CURSOR=y # end of Amlogic OSD Module # # Deinterlace driver # CONFIG_AMLOGIC_MEDIA_DEINTERLACE=y # end of Deinterlace driver # # DI_MULTI driver # # end of DI_MULTI driver # # DI_LOCAL driver # # end of DI_LOCAL driver # # Amlogic Video Processor Support # CONFIG_AMLOGIC_MEDIA_VIDEO_PROCESSOR=y # # Amlogic picture decoder support # CONFIG_AMLOGIC_PIC_DEC=y # end of Amlogic picture decoder support # # Post Process Manager driver # CONFIG_AMLOGIC_POST_PROCESS_MANAGER=y # end of Post Process Manager driver # # Video frame queue Support # CONFIG_AMLOGIC_MEDIA_UTILS=y # end of Video frame queue Support # # Amlogic videosync support # CONFIG_AMLOGIC_VIDEOSYNC=y # end of Amlogic videosync support # # V4L2 Video Support # CONFIG_AMLOGIC_V4L_VIDEO=y CONFIG_AMLOGIC_V4L_VIDEO2=y # end of V4L2 Video Support # # Amlogic ion video support # CONFIG_AMLOGIC_VIDEOBUF2_ION=y CONFIG_AMLOGIC_IONVIDEO=y # end of Amlogic ion video support # # Amlogic v4l video support # CONFIG_AMLOGIC_V4L_VIDEO3=y # end of Amlogic v4l video support # # Amlogic video_composer support # CONFIG_AMLOGIC_VIDEO_COMPOSER=y # end of Amlogic video_composer support # # Amlogic video tunnel support # # CONFIG_AMLOGIC_VIDEO_TUNNEL is not set # end of Amlogic video tunnel support # # V4L2 Video Support # # CONFIG_AMLOGIC_VDETECT is not set # end of V4L2 Video Support # # Amlogic videoqueue support # # CONFIG_AMLOGIC_VIDEOQUEUE is not set # end of Amlogic videoqueue support # # Amlogic video_pp_common support # CONFIG_AMLOGIC_VIDEO_PP_COMMON=y # end of Amlogic video_pp_common support # # Amlogic di_process support # CONFIG_AMLOGIC_DI_PROCESS=y # end of Amlogic di_process support # end of Amlogic Video Processor Support # # Amlogic Enhancement drivers # CONFIG_AMLOGIC_MEDIA_ENHANCEMENT=y # # Amlogic amdolby_vision Drivers # # # Amlogic amdolby_vision Driver # CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION=y # end of Amlogic amdolby_vision Driver # # Amlogic VECM Drivers # # # Amlogic amvecm Driver # CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_VECM=y # end of Amlogic amvecm Driver # end of Amlogic Enhancement drivers CONFIG_AMLOGIC_MEDIA_FRAME_SYNC=y CONFIG_AMLOGIC_MEDIA_GDC=y # # Input drivers # CONFIG_AMLOGIC_MEDIA_VIN=y # # Tvin drivers # CONFIG_AMLOGIC_MEDIA_TVIN=y CONFIG_AMLOGIC_MEDIA_VDIN=y CONFIG_AMLOGIC_MEDIA_TVIN_AFE=y # CONFIG_AMLOGIC_ADC_DOUBLE_SAMPLING_FOR_CVBS is not set CONFIG_AMLOGIC_MEDIA_TVIN_VBI=y CONFIG_AMLOGIC_MEDIA_TVIN_AVDETECT=y CONFIG_AMLOGIC_MEDIA_VIUIN=y CONFIG_AMLOGIC_MEDIA_TVIN_BT656=y # CONFIG_AMLOGIC_MEDIA_TVIN_CSI is not set CONFIG_AMLOGIC_MEDIA_TVIN_HDMI=y # CONFIG_AMLOGIC_MEDIA_TVIN_DSC_DEC is not set # CONFIG_AMLOGIC_TVIN_USE_DEBUG_FILE is not set CONFIG_AMLOGIC_MEDIA_ADC=y # end of Input drivers CONFIG_AMLOGIC_CEC=y CONFIG_AMLOGIC_AO_CEC=y # CONFIG_AMLOGIC_LINUX_STD_CEC is not set # # ESM Support # CONFIG_AMLOGIC_ESM=y # end of ESM Support # # Amlogic ATV driver # CONFIG_AMLOGIC_ATV_DEMOD=y # end of Amlogic ATV driver # CONFIG_AMLOGIC_MEDIA_MSYNC is not set # # Amlogic DTV driver # CONFIG_AMLOGIC_DTV_DEMOD=y # end of Amlogic DTV driver CONFIG_AMLOGIC_MEDIA_FRC=y # # Amlogic di v4l support # CONFIG_AMLOGIC_DI_V4L=y # end of Amlogic di v4l support # # DI_MINI driver # # end of DI_MINI driver # end of Amlogic multimedia configuration CONFIG_AMLOGIC_POWER=y CONFIG_AMLOGIC_POWER_EE=y # CONFIG_AMLOGIC_POWER_PMIC is not set CONFIG_AMLOGIC_CPU_INFO=y CONFIG_AMLOGIC_SHOW_CPU_CHIPID=y # # Meson core pm driver # CONFIG_AMLOGIC_PM=y CONFIG_AMLOGIC_GX_SUSPEND=y CONFIG_AMLOGIC_LEGACY_EARLY_SUSPEND=y CONFIG_AMLOGIC_GX_REBOOT=y # end of Meson core pm driver CONFIG_AMLOGIC_GPIO=y CONFIG_AMLOGIC_GPIOLIB=y CONFIG_AMLOGIC_GPIOLIB_SYSFS=y CONFIG_AMLOGIC_GPIO_DEBUG=y CONFIG_AMLOGIC_MESON_IRQ_GPIO=y CONFIG_AMLOGIC_PINCTRL_MESON=y CONFIG_AMLOGIC_PINCTRL_MESON_S4=y # CONFIG_AMLOGIC_PINCTRL_MESON_C2 is not set # CONFIG_AMLOGIC_PINCTRL_MESON_C3 is not set # CONFIG_AMLOGIC_PINCTRL_MESON_A1 is not set CONFIG_AMLOGIC_PINCTRL_MESON_SC2=y # CONFIG_AMLOGIC_PINCTRL_MESON_T3 is not set CONFIG_AMLOGIC_PINCTRL_MESON_T7=y # CONFIG_AMLOGIC_PINCTRL_MESON_T5M is not set CONFIG_AMLOGIC_PINCTRL_MESON_G12A=y CONFIG_AMLOGIC_PINCTRL_MESON_S5=y # CONFIG_AMLOGIC_PINCTRL_MESON_T5W is not set # CONFIG_AMLOGIC_PINCTRL_MESON_T3X is not set # CONFIG_AMLOGIC_PINCTRL_MESON_TXHD2 is not set # CONFIG_AMLOGIC_PINCTRL_MESON_C1 is not set # CONFIG_AMLOGIC_PINCTRL_MESON_S1A is not set # CONFIG_AMLOGIC_PINCTRL_MESON_T5D is not set # CONFIG_AMLOGIC_PINCTRL_MESON_TM2 is not set CONFIG_AMLOGIC_PINCTRL_MESON_S7=y CONFIG_AMLOGIC_PINCTRL_MESON_S7D=y CONFIG_AMLOGIC_PINCTRL_MESON_S6=y # CONFIG_AMLOGIC_PINCTRL_MESON_T6D is not set # CONFIG_AMLOGIC_GPIO_PMIC is not set CONFIG_AMLOGIC_INPUT=m # CONFIG_AMLOGIC_GPIO_KEY is not set # CONFIG_AMLOGIC_CKS05_TOUCH_KEYPADS is not set CONFIG_AMLOGIC_MESON_IR=y # CONFIG_AMLOGIC_INPUT_PMIC is not set # # I2C Hardware Bus support # CONFIG_AMLOGIC_I2C_MESON=y # end of I2C Hardware Bus support CONFIG_AMLOGIC_SPI=y CONFIG_AMLOGIC_SPI_MESON_SPICC=y CONFIG_AMLOGIC_SPI_MESON_SPICC_V2=y # CONFIG_SPICC_TEST is not set CONFIG_AMLOGIC_SPI_MESON_SPIFC=y CONFIG_AMLOGIC_SPI_MESON_SPIFC_V2=y # CONFIG_AMLOGIC_SPI_MESON_SPICC_SLAVE is not set # CONFIG_AMLOGIC_SPI_NFC is not set CONFIG_AMLOGIC_TEE=y CONFIG_AMLOGIC_AMLTEE=y # # TEE drivers # CONFIG_AMLOGIC_OPTEE=y # end of TEE drivers # CONFIG_AMLOGIC_WATERMARK is not set CONFIG_AMLOGIC_GKI_TOOL=m CONFIG_AMLOGIC_PWM=y CONFIG_AMLOGIC_PWM_MESON=y CONFIG_AMLOGIC_PWM_MESON_TEE=y CONFIG_AMLOGIC_MESON_CPUFREQ=y CONFIG_AMLOGIC_EFUSE_UNIFYKEY=y CONFIG_AMLOGIC_EFUSE=y CONFIG_AMLOGIC_UNIFYKEY=y # CONFIG_AMLOGIC_EFUSE_BURN is not set CONFIG_AMLOGIC_DEFENDKEY=y # # MESON MHU mailbox Support # CONFIG_AMLOGIC_MHU_MBOX=y # end of MESON MHU mailbox Support CONFIG_AMLOGIC_JTAG_MESON=y # # Watchdog Device Drivers # # CONFIG_AMLOGIC_MESON_GXBB_WATCHDOG is not set # CONFIG_AMLOGIC_ARM_SMC_WATCHDOG is not set CONFIG_AMLOGIC_MEMORY_EXTEND=y CONFIG_AMLOGIC_PAGE_TRACE=y # CONFIG_AMLOGIC_PAGE_TRACE_INLINE is not set # CONFIG_AMLOGIC_SLAB_TRACE is not set CONFIG_AMLOGIC_CMA=y # CONFIG_AMLOGIC_MEM_DEBUG is not set CONFIG_AMLOGIC_STACKPROTECTOR=y # CONFIG_AMLOGIC_VMAP is not set CONFIG_AMLOGIC_USER_FAULT=y CONFIG_AMLOGIC_ZSTD=y CONFIG_AMLOGIC_MEMORY_STAT=y # CONFIG_AMLOGIC_CMA_DIS is not set CONFIG_AMLOGIC_MEMORY_OPT=y # CONFIG_AMLOGIC_PIN_LOCKED_FILE is not set # CONFIG_AMLOGIC_PIN_LOCKED_FILE_V2 is not set # CONFIG_AMLOGIC_PCIE_DMA_OPS is not set CONFIG_AMLOGIC_FAKE_SMMU=y # CONFIG_AMLOGIC_DTB_NODE_OPT is not set # CONFIG_AMLOGIC_KALLSYM_OPT is not set # CONFIG_AMLOGIC_PRINTK_OPT is not set # CONFIG_AMLOGIC_KHEADERS_OPT is not set # # Meson core memory debug driver # CONFIG_AMLOGIC_MEMORY_DEBUG=y CONFIG_AMLOGIC_FILE_CACHE=y # CONFIG_AMLOGIC_WATCHPOINT is not set CONFIG_AMLOGIC_REG_ACCESS=y CONFIG_AMLOGIC_DDR_TOOL=y CONFIG_AMLOGIC_DDR_BANDWIDTH=y # CONFIG_AMLOGIC_DDR_BANDWIDTH_GXL is not set # CONFIG_AMLOGIC_DDR_BANDWIDTH_GX is not set CONFIG_AMLOGIC_DDR_BANDWIDTH_G12=y CONFIG_AMLOGIC_DDR_BANDWIDTH_T7=y # CONFIG_AMLOGIC_DDR_BANDWIDTH_A1 is not set CONFIG_AMLOGIC_DDR_BANDWIDTH_T5=y CONFIG_AMLOGIC_DDR_BANDWIDTH_S4=y CONFIG_AMLOGIC_DDR_BANDWIDTH_S5=y CONFIG_AMLOGIC_DDR_BANDWIDTH_S6=y # CONFIG_AMLOGIC_DDR_BANDWIDTH_C3 is not set # CONFIG_AMLOGIC_DDR_BANDWIDTH_T5M is not set # CONFIG_AMLOGIC_DDR_BANDWIDTH_TXHD2 is not set # CONFIG_AMLOGIC_DDR_BANDWIDTH_S1A is not set CONFIG_AMLOGIC_DDR_BANDWIDTH_S7=y # CONFIG_AMLOGIC_DDR_BANDWIDTH_T6D is not set CONFIG_AMLOGIC_DMC_MONITOR=y CONFIG_AMLOGIC_DMC_DEV_ACCESS=y CONFIG_AMLOGIC_DMC_MONITOR_G12=y # CONFIG_AMLOGIC_DMC_MONITOR_TM2 is not set # CONFIG_AMLOGIC_DMC_MONITOR_GX is not set # CONFIG_AMLOGIC_DMC_MONITOR_C1 is not set # CONFIG_AMLOGIC_DMC_MONITOR_C2 is not set CONFIG_AMLOGIC_DMC_MONITOR_T7=y CONFIG_AMLOGIC_DMC_MONITOR_S4=y CONFIG_AMLOGIC_DMC_MONITOR_S5=y CONFIG_AMLOGIC_DMC_MONITOR_S6=y # CONFIG_AMLOGIC_DMC_MONITOR_C3 is not set # CONFIG_AMLOGIC_DMC_MONITOR_T5M is not set # CONFIG_AMLOGIC_DMC_MONITOR_S1A is not set # CONFIG_AMLOGIC_DMC_MONITOR_TXHD2 is not set CONFIG_AMLOGIC_DMC_MONITOR_S7=y # CONFIG_AMLOGIC_DMC_MONITOR_T6D is not set CONFIG_AMLOGIC_RAMDUMP=y # end of Meson core memory debug driver # # Analog to digital converters # # CONFIG_AMLOGIC_ADC is not set # end of Analog to digital converters # # Character devices # CONFIG_AMLOGIC_HW_RANDOM_MESON=y # end of Character devices # CONFIG_AMLOGIC_SOC_INFO is not set CONFIG_AMLOGIC_RESET_MESON=y CONFIG_AMLOGIC_DOS_RESET_MESON=y # # RTC drivers # CONFIG_AMLOGIC_RTC=y CONFIG_AMLOGIC_RTC_DRV_MESON_VRTC=y CONFIG_AMLOGIC_MESON_RTC=y # # RTC_PMIC6B SUPPORT # # end of RTC_PMIC6B SUPPORT # CONFIG_AMLOGIC_IRBLASTER is not set # # Amlogic Thermal and Cooling devices # CONFIG_AMLOGIC_AMLOGIC_THERMAL=y CONFIG_AMLOGIC_COOLDEV=y CONFIG_AMLOGIC_CPUCORE_THERMAL=y CONFIG_AMLOGIC_GPU_THERMAL=y CONFIG_AMLOGIC_GPUCORE_THERMAL=y CONFIG_AMLOGIC_DDR_THERMAL=y CONFIG_AMLOGIC_MEDIA_THERMAL=y # end of Amlogic Thermal and Cooling devices CONFIG_AMLOGIC_MMC_MESON_GX=y CONFIG_AMLOGIC_MMC_CQHCI=y CONFIG_AMLOGIC_HOST_DRIVER=y CONFIG_AMLOGIC_DEBUG=y CONFIG_AMLOGIC_BGKI_DEBUG_MISC=y CONFIG_AMLOGIC_DEBUG_ATRACE=y CONFIG_AMLOGIC_BOOT_TIME=y CONFIG_AMLOGIC_DEBUG_FILE=y # CONFIG_AMLOGIC_DEBUG_TEST is not set # CONFIG_AMLOGIC_DEBUG_HLD is not set # CONFIG_AMLOGIC_DEBUG_MHZ is not set # CONFIG_AMLOGIC_HOTPLUG_ARM_CPU0 is not set CONFIG_AMLOGIC_AUDIO_UTILS=y CONFIG_AMLOGIC_GKI_CONFIG=y # CONFIG_AMLOGIC_ENV_DEBUG is not set # CONFIG_AMLOGIC_ZAPPER_NET_CUT is not set # CONFIG_AMLOGIC_ZAPPER_CUT is not set # CONFIG_AMLOGIC_ZAPPER_CUT_C1A is not set # CONFIG_AMLOGIC_REMOVE_OLD is not set # CONFIG_AMLOGIC_C3_REMOVE is not set # CONFIG_AMLOGIC_DEBUG_IOTRACE is not set # CONFIG_AMLOGIC_ARMV8_AARCH32 is not set # CONFIG_AMLOGIC_APU is not set # CONFIG_AMLOGIC_BGKI_SCHED_SYSCTL is not set # CONFIG_AMLOGIC_DEBUG_ISOLCPUS is not set # CONFIG_AMLOGIC_F2FS_OPTIMIZATION is not set CONFIG_AMLOGIC_MEDIA_CAMERA=y # CONFIG_AMLOGIC_FREERTOS is not set # CONFIG_AMLOGIC_AUTO_CAPTURE is not set # # USB Support # CONFIG_AMLOGIC_USB=y CONFIG_AMLOGIC_COMMON_USB=y CONFIG_AMLOGIC_USB_SUPPORT=y CONFIG_AMLOGIC_USB_DWC_OTG_HCD=y CONFIG_AMLOGIC_CRG=y CONFIG_AMLOGIC_USBPHY=y CONFIG_AMLOGIC_USB2PHY=y CONFIG_AMLOGIC_USB3PHY=y CONFIG_AMLOGIC_USBPHYC2=y CONFIG_AMLOGIC_BC=y CONFIG_AMLOGIC_CC=y # end of USB Support # # Amlogic Crypto Support # CONFIG_AMLOGIC_CRYPTO_DMA=y # end of Amlogic Crypto Support CONFIG_AMLOGIC_WIRELESS=y CONFIG_AMLOGIC_BLUETOOTH=y # CONFIG_AMLOGIC_BT_WAKE_NOT_REPORT is not set CONFIG_AMLOGIC_WIFI=y CONFIG_AMLOGIC_PWM_32K=y CONFIG_AMLOGIC_RFKILL_INIT_SW_UNBLOCK=y CONFIG_AMLOGIC_MDIO_G12A=y CONFIG_AMLOGIC_INPHY=y CONFIG_AMLOGIC_REALTEK=y CONFIG_AMLOGIC_LINUX_BT_SMP=y CONFIG_AMLOGIC_LINUX_BT_SUPPORT_WAKEUP=y # CONFIG_AMLOGIC_MTD_SPI_NOR is not set CONFIG_AMLOGIC_MTD_SPI_NAND=y CONFIG_AMLOGIC_MTD_NAND=y CONFIG_AMLOGIC_MTD_COMMON=y CONFIG_AMLOGIC_MTD_RESV=y # CONFIG_AMLOGIC_NAND is not set CONFIG_AMLOGIC_DVB_CONFIG=y CONFIG_AMLOGIC_DVB_EXTERN=y # CONFIG_AMLOGIC_DVB_DSM is not set CONFIG_AMLOGIC_DVB_COMPAT=y # CONFIG_AMLOGIC_DVB_EXTERN_TUNER is not set CONFIG_AMLOGIC_AUCPU=y # CONFIG_AMLOGIC_SMARTCARD is not set CONFIG_AMLOGIC_DVB_DMX=m CONFIG_AMLOGIC_DVB_DUMMY_FRONTEND=m # # Amlogic PCI Support # CONFIG_AMLOGIC_PCIE=y CONFIG_AMLOGIC_PCIE_V2_HOST=y CONFIG_AMLOGIC_PCIE_V3_HOST=y # end of Amlogic PCI Support CONFIG_AMLOGIC_LED=y # CONFIG_AMLOGIC_LEDS_TLC59116 is not set # CONFIG_AMLOGIC_LEDS_AW9523B is not set # CONFIG_AMLOGIC_LEDS_STATE is not set # CONFIG_AMLOGIC_LEDS_DCON is not set # CONFIG_AMLOGIC_LEDS_FD650 is not set CONFIG_AMLOGIC_LEDS_BCT3236=y # # AMLOGIC DVB CI support # # CONFIG_AMLOGIC_DVB_CI is not set # end of AMLOGIC DVB CI support # CONFIG_AMLOGIC_USBCAM is not set # # MESON hw spin lock Support # CONFIG_AMLOGIC_HWSPINLOCK=y # end of MESON hw spin lock Support # CONFIG_AMLOGIC_ANDROID_LOGGER is not set # CONFIG_ANDROID_LOW_MEMORY_KILLER is not set # CONFIG_AMLOGIC_LMK is not set # CONFIG_AMLOGIC_YAFFS_FS is not set # CONFIG_AMLOGIC_MFD is not set # CONFIG_AMLOGIC_REGULATOR is not set CONFIG_AMLOGIC_PWM_REGULATOR=y # CONFIG_AMLOGIC_AUDIO_BRIDGE is not set # # Amlogic multimedia algorithm configuration # CONFIG_AMLOGIC_MEDIA_ALGORITHM=y # end of Amlogic multimedia algorithm configuration # CONFIG_AMLOGIC_SOC_TIMESTAMP is not set # CONFIG_AMLOGIC_SECKEY is not set # CONFIG_AMLOGIC_TRUSTED_KEYS is not set # CONFIG_AMLOGIC_TRUSTED_KEYS_TEE is not set # CONFIG_AMLOGIC_AMFC is not set CONFIG_AMFC_BASE=0xfe024000 # CONFIG_AMLOGIC_EROFS is not set CONFIG_AMLOGIC_EROFS_CRYPTO_MAX_PAGES=32 # CONFIG_AMLOGIC_ADD_RUMBLE is not set # CONFIG_AMLOGIC_FDTO_REMOVE_NODE is not set # # Bootloader Drivers # CONFIG_BL30_MANAGER=y # end of Bootloader Drivers # end of Amlogic Device Drivers CONFIG_AMLOGIC_SND_SOC=y # CONFIG_AMLOGIC_AUDIO_CUT is not set CONFIG_AMLOGIC_SND_SOC_AUGE=y CONFIG_AMLOGIC_SND_SOC_COMMON=y # # Audio Interface # CONFIG_AMLOGIC_AMAUDIO=y # end of Audio Interface # # AMLOGIC Audio DSP process # CONFIG_AMLOGIC_AUDIO_DSP=y # end of AMLOGIC Audio DSP process CONFIG_AMLOGIC_AUDIO_INFO=y CONFIG_AMLOGIC_SND_SOC_CODECS=y CONFIG_AMLOGIC_SND_CODEC_DUMMY_CODEC=y CONFIG_AMLOGIC_SND_CODEC_PCM2BT=y CONFIG_AMLOGIC_SND_CODEC_AMLT9015=y # CONFIG_AMLOGIC_SND_CODEC_AMLT9015S is not set # CONFIG_AMLOGIC_SND_CODEC_PMU3 is not set CONFIG_AMLOGIC_SND_CODEC_TXLX_ACODEC=y CONFIG_AMLOGIC_SND_CODEC_TL1_ACODEC=y CONFIG_AMLOGIC_SND_CODEC_T6D_ACODEC=y # CONFIG_AMLOGIC_SND_CODEC_A1_ACODEC is not set CONFIG_AMLOGIC_SND_SOC_AD82128=y CONFIG_AMLOIC_SND_SOC_AD82088D=y CONFIG_AMLOGIC_SND_SOC_TAS5805=y CONFIG_AMLOGIC_SND_SOC_PA1=y # CONFIG_AMLOGIC_SND_SOC_TAS5782M is not set CONFIG_AMLOGIC_SND_SOC_TAS5707=y # CONFIG_AMLOGIC_SND_SOC_TLV320ADC3101 is not set # CONFIG_AMLOGIC_SND_SOC_SY6026L is not set CONFIG_AMLOGIC_SND_SOC_PCM186X=y CONFIG_AMLOGIC_SND_SOC_SSM3525=y CONFIG_AMLOGIC_SND_SOC_SSM3515=y CONFIG_AMLOGIC_SND_SOC_TAS575X=y # CONFIG_AMLOGIC_SND_SOC_ES7243 is not set CONFIG_AMLOGIC_SND_SOC_ES8388=y CONFIG_AMLOGIC_SND_SOC_AD82584F=y # CONFIG_AMLOGIC_SND_SOC_AD82120B is not set # CONFIG_AMLOGIC_SND_SOC_CS42528 is not set # CONFIG_AMLOGIC_SAMPLES_DEBUG_FILE_TEST is not set # end of Device Drivers # # File systems # CONFIG_DCACHE_WORD_ACCESS=y # CONFIG_VALIDATE_FS_PARSER is not set CONFIG_FS_IOMAP=y # CONFIG_EXT2_FS is not set # CONFIG_EXT3_FS is not set CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=m CONFIG_XFS_SUPPORT_V4=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_ONLINE_SCRUB is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_BTRFS_FS_REF_VERIFY is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set # CONFIG_FS_DAX is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y CONFIG_FS_ENCRYPTION=y CONFIG_FS_ENCRYPTION_ALGS=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y CONFIG_FS_VERITY=y # CONFIG_FS_VERITY_DEBUG is not set CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y # CONFIG_FANOTIFY is not set CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QUOTA_DEBUG is not set CONFIG_QUOTA_TREE=y # CONFIG_QFMT_V1 is not set CONFIG_QFMT_V2=y CONFIG_QUOTACTL=y # CONFIG_AUTOFS4_FS is not set CONFIG_AUTOFS_FS=m CONFIG_FUSE_FS=y # CONFIG_CUSE is not set # CONFIG_VIRTIO_FS is not set # CONFIG_FUSE_BPF is not set CONFIG_OVERLAY_FS=m # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_XINO_AUTO is not set # CONFIG_OVERLAY_FS_METACOPY is not set # CONFIG_INCREMENTAL_FS is not set # # Caches # # CONFIG_FSCACHE is not set # end of Caches # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=m CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=m # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set CONFIG_NTFS3_FS=y # CONFIG_NTFS3_64BIT_CLUSTER is not set # CONFIG_NTFS3_LZX_XPRESS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_TMPFS_INODE64 is not set CONFIG_ARCH_SUPPORTS_HUGETLBFS=y # CONFIG_HUGETLBFS is not set CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=y # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS2_FS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y CONFIG_SQUASHFS_FILE_CACHE=y # CONFIG_SQUASHFS_FILE_DIRECT is not set # CONFIG_SQUASHFS_DECOMP_SINGLE=y CONFIG_SQUASHFS_DECOMP_MULTI=y CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 CONFIG_PSTORE_DEFLATE_COMPRESS=y # CONFIG_PSTORE_LZO_COMPRESS is not set # CONFIG_PSTORE_LZ4_COMPRESS is not set # CONFIG_PSTORE_LZ4HC_COMPRESS is not set # CONFIG_PSTORE_842_COMPRESS is not set # CONFIG_PSTORE_ZSTD_COMPRESS is not set CONFIG_PSTORE_COMPRESS=y CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" CONFIG_PSTORE_CONSOLE=y CONFIG_PSTORE_PMSG=y CONFIG_PSTORE_FTRACE=y CONFIG_PSTORE_RAM=y # CONFIG_PSTORE_BLK is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_EROFS_FS=y # CONFIG_EROFS_FS_DEBUG is not set CONFIG_EROFS_FS_XATTR=y CONFIG_EROFS_FS_POSIX_ACL=y CONFIG_EROFS_FS_SECURITY=y CONFIG_EROFS_FS_ZIP=y # CONFIG_EROFS_FS_ZIP_LZMA is not set # CONFIG_EROFS_FS_PCPU_KTHREAD is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y CONFIG_NFS_SWAP=y CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=m CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" CONFIG_NFS_V4_1_MIGRATION=y CONFIG_NFS_V4_SECURITY_LABEL=y CONFIG_ROOT_NFS=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y # CONFIG_NFS_DISABLE_UDP_SUPPORT is not set CONFIG_NFS_V4_2_READ_PLUS=y CONFIG_NFSD=m CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y # CONFIG_NFSD_BLOCKLAYOUT is not set # CONFIG_NFSD_SCSILAYOUT is not set # CONFIG_NFSD_FLEXFILELAYOUT is not set CONFIG_NFSD_V4_2_INTER_SSC=y CONFIG_NFSD_V4_SECURITY_LABEL=y CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_ACL_SUPPORT=m CONFIG_NFS_COMMON=y CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y CONFIG_SUNRPC_SWAP=y # CONFIG_RPCSEC_GSS_KRB5 is not set # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS2=y CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set # CONFIG_CIFS_DEBUG is not set # CONFIG_CIFS_DFS_UPCALL is not set # CONFIG_CIFS_SWN_UPCALL is not set # CONFIG_CIFS_ROOT is not set # CONFIG_SMB_SERVER is not set CONFIG_SMBFS_COMMON=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_BIG_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set # CONFIG_KEY_DH_OPERATIONS is not set # CONFIG_KEY_NOTIFICATIONS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set CONFIG_SECURITY=y # CONFIG_SECURITYFS is not set CONFIG_SECURITY_NETWORK=y # CONFIG_SECURITY_NETWORK_XFRM is not set # CONFIG_SECURITY_PATH is not set CONFIG_LSM_MMAP_MIN_ADDR=32768 CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y # CONFIG_HARDENED_USERCOPY_FALLBACK is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_SECURITY_SELINUX=y # CONFIG_SECURITY_SELINUX_BOOTPARAM is not set # CONFIG_SECURITY_SELINUX_DISABLE is not set CONFIG_SECURITY_SELINUX_DEVELOP=y # CONFIG_SECURITY_SELINUX_AVC_STATS is not set CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0 CONFIG_SECURITY_SELINUX_SIDTAB_HASH_BITS=9 CONFIG_SECURITY_SELINUX_SID2STR_CACHE_SIZE=256 # CONFIG_SECURITY_SMACK is not set # CONFIG_SECURITY_TOMOYO is not set # 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_SECURITY_LOCKDOWN_LSM is not set # CONFIG_SECURITY_LANDLOCK is not set # CONFIG_INTEGRITY is not set CONFIG_DEFAULT_SECURITY_SELINUX=y # CONFIG_DEFAULT_SECURITY_DAC is not set CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y # CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set # CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set # CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set # CONFIG_INIT_STACK_ALL_PATTERN is not set # CONFIG_INIT_STACK_ALL_ZERO is not set # CONFIG_GCC_PLUGIN_STACKLEAK is not set CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization # end of Kernel hardening options # end of Security options CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_FIPS140=y CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y CONFIG_CRYPTO_USER=y CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set # # Public-key cryptography # CONFIG_CRYPTO_RSA=y # CONFIG_CRYPTO_DH is not set CONFIG_CRYPTO_ECC=y CONFIG_CRYPTO_ECDH=y CONFIG_CRYPTO_ECDSA=y # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set # # Authenticated Encryption with Associated Data # CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y # CONFIG_CRYPTO_CHACHA20POLY1305 is not set # CONFIG_CRYPTO_AEGIS128 is not set CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y # # Block modes # CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set CONFIG_CRYPTO_CTR=y CONFIG_CRYPTO_CTS=y CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_HCTR2 is not set CONFIG_CRYPTO_ESSIV=y # # Hash modes # CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_VMAC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_CRC32 is not set CONFIG_CRYPTO_XXHASH=m CONFIG_CRYPTO_BLAKE2B=m CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_GHASH=y # CONFIG_CRYPTO_POLY1305 is not set CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set # CONFIG_CRYPTO_SM3 is not set # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_CHACHA20 is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SM4 is not set # CONFIG_CRYPTO_TWOFISH is not set # # Compression # CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_LZO=y # CONFIG_CRYPTO_842 is not set CONFIG_CRYPTO_LZ4=y # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # # Random Number Generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y CONFIG_CRYPTO_USER_API_RNG=y # CONFIG_CRYPTO_USER_API_RNG_CAVP is not set CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_ATMEL_ECC is not set # CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set # CONFIG_CRYPTO_DEV_CCP is not set # CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set # CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set # CONFIG_CRYPTO_DEV_SAFEXCEL is not set # CONFIG_CRYPTO_DEV_CCREE is not set # CONFIG_CRYPTO_DEV_HISI_SEC is not set # CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y # CONFIG_PKCS8_PRIVATE_KEY_PARSER is not set CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m CONFIG_RAID6_PQ_BENCHMARK=y CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_CORDIC=m # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y # CONFIG_INDIRECT_PIO is not set # # Crypto library routines # CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=y CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y CONFIG_CRYPTO_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=y CONFIG_CRYPTO_LIB_CURVE25519=y CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y CONFIG_CRYPTO_LIB_POLY1305=y CONFIG_CRYPTO_LIB_CHACHA20POLY1305=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_LIB_MEMNEQ=y # CONFIG_TRACE_MMIO_ACCESS is not set CONFIG_CRC_CCITT=m CONFIG_CRC16=y CONFIG_CRC_T10DIF=y CONFIG_CRC_ITU_T=m CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y # CONFIG_CRC8 is not set CONFIG_XXHASH=y CONFIG_AUDIT_GENERIC=y CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y CONFIG_AUDIT_COMPAT_GENERIC=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_COMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMPRESS=m CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_DECOMPRESS_GZIP=y CONFIG_DECOMPRESS_BZIP2=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DECOMPRESS_XZ=y CONFIG_DECOMPRESS_LZO=y CONFIG_DECOMPRESS_LZ4=y CONFIG_DECOMPRESS_ZSTD=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_INTERVAL_TREE=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_DMA_DECLARE_COHERENT=y CONFIG_ARCH_HAS_SETUP_DMA_OPS=y CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y CONFIG_SWIOTLB=y CONFIG_DMA_RESTRICTED_POOL=y CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_COHERENT_POOL=y CONFIG_DMA_REMAP=y CONFIG_DMA_DIRECT_REMAP=y CONFIG_DMA_CMA=y # CONFIG_DMA_PERNUMA_CMA is not set # # Default contiguous memory area size: # CONFIG_CMA_SIZE_MBYTES=8 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=4 # CONFIG_DMA_API_DEBUG is not set # CONFIG_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_TIME_NS=y CONFIG_FONT_SUPPORT=y CONFIG_FONTS=y CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y # CONFIG_FONT_6x11 is not set # CONFIG_FONT_7x14 is not set # CONFIG_FONT_PEARL_8x8 is not set # CONFIG_FONT_ACORN_8x8 is not set # CONFIG_FONT_MINI_4x6 is not set # CONFIG_FONT_6x10 is not set # CONFIG_FONT_10x18 is not set # CONFIG_FONT_SUN8x16 is not set # CONFIG_FONT_SUN12x22 is not set CONFIG_FONT_TER16x32=y # CONFIG_FONT_6x8 is not set CONFIG_SG_POOL=y CONFIG_ARCH_STACKWALK=y CONFIG_SBITMAP=y # end of Library routines CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set CONFIG_STACKTRACE_BUILD_ID=y CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_SYMBOLIC_ERRNAME=y CONFIG_DEBUG_BUGVERBOSE=y # end of printk and dmesg options CONFIG_AS_HAS_NON_CONST_LEB128=y # # Compile-time checks and compiler options # CONFIG_DEBUG_INFO=y # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_INFO_COMPRESSED is not set # CONFIG_DEBUG_INFO_SPLIT is not set CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set # CONFIG_DEBUG_INFO_BTF is not set # CONFIG_GDB_SCRIPTS is not set CONFIG_FRAME_WARN=2048 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set CONFIG_HAVE_KCSAN_COMPILER=y # end of Generic Kernel Debugging Instruments CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Memory Debugging # CONFIG_PAGE_EXTENSION=y # CONFIG_DEBUG_PAGEALLOC is not set # CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_PINNER is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_PAGE_REF is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_PTDUMP_DEBUGFS is not set # CONFIG_SPECULATIVE_PAGE_FAULT_STATS is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM_PGTABLE is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y CONFIG_HAVE_ARCH_KASAN_HW_TAGS=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_KASAN_SW_TAGS=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y # CONFIG_KFENCE is not set # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # CONFIG_PANIC_ON_OOPS=y CONFIG_PANIC_ON_OOPS_VALUE=1 CONFIG_PANIC_TIMEOUT=5 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=1 # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # CONFIG_SCHED_DEBUG=y CONFIG_SCHED_INFO=y CONFIG_SCHEDSTATS=y # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set # CONFIG_DEBUG_PREEMPT is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set CONFIG_DEBUG_ATOMIC_SLEEP=y # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # CONFIG_DEBUG_LIST=y # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set CONFIG_BUG_ON_DATA_CORRUPTION=y # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y # CONFIG_BOOTTIME_TRACING is not set CONFIG_FUNCTION_TRACER=y # CONFIG_FUNCTION_GRAPH_TRACER is not set CONFIG_DYNAMIC_FTRACE=y CONFIG_DYNAMIC_FTRACE_WITH_REGS=y # CONFIG_FUNCTION_PROFILER is not set # CONFIG_STACK_TRACER is not set # CONFIG_IRQSOFF_TRACER is not set # CONFIG_PREEMPT_TRACER is not set # CONFIG_SCHED_TRACER is not set # CONFIG_HWLAT_TRACER is not set # CONFIG_OSNOISE_TRACER is not set # CONFIG_TIMERLAT_TRACER is not set CONFIG_FTRACE_SYSCALLS=y # CONFIG_TRACER_SNAPSHOT is not set CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set # CONFIG_BLK_DEV_IO_TRACE is not set CONFIG_KPROBE_EVENTS=y # CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set CONFIG_UPROBE_EVENTS=y CONFIG_BPF_EVENTS=y CONFIG_DYNAMIC_EVENTS=y CONFIG_PROBE_EVENTS=y CONFIG_FTRACE_MCOUNT_RECORD=y CONFIG_FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY=y # CONFIG_SYNTH_EVENTS is not set # CONFIG_HIST_TRIGGERS is not set # CONFIG_TRACE_EVENT_INJECT is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_TRACE_EVAL_MAP_FILE is not set # CONFIG_FTRACE_RECORD_RECURSION is not set # CONFIG_FTRACE_STARTUP_TEST is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set # CONFIG_PREEMPTIRQ_DELAY_TEST is not set # CONFIG_KPROBE_EVENT_GEN_TEST is not set # CONFIG_SAMPLES is not set # CONFIG_STRICT_DEVMEM is not set # # arm64 Debugging # # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_ARM64_RELOC_TEST is not set # CONFIG_CORESIGHT is not set # end of arm64 Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FUNCTION_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y CONFIG_KCOV=y # CONFIG_KCOV_ENABLE_COMPARISONS is not set # CONFIG_KCOV_INSTRUMENT_ALL is not set CONFIG_KCOV_IRQ_AREA_SIZE=0x40000 CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set # CONFIG_TEST_MIN_HEAP is not set # CONFIG_TEST_DIV64 is not set # CONFIG_KPROBES_SANITY_TEST is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_RBTREE_TEST is not set # CONFIG_REED_SOLOMON_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set # CONFIG_STRING_SELFTEST is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_STRSCPY is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_SCANF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_XARRAY is not set # CONFIG_TEST_OVERFLOW is not set # CONFIG_TEST_RHASHTABLE is not set # CONFIG_TEST_HASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_BITOPS is not set # CONFIG_TEST_VMALLOC is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_TEST_BLACKHOLE_DEV is not set # CONFIG_FIND_BIT_BENCHMARK is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_SYSCTL is not set # CONFIG_TEST_UDELAY is not set # 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_TEST_MEMINIT is not set # CONFIG_TEST_FREE_PAGES is not set CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage # end of Kernel hacking ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/options ================================================ ################################################################################ # setup system defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case ${TARGET_ARCH} in aarch64) # TARGET_CPU: # arm2 arm250 arm3 arm6 arm60 arm600 arm610 arm620 arm7 arm7m arm7d # arm7dm arm7di arm7dmi arm70 arm700 arm700i arm710 arm710c # arm7100 arm720 arm7500 arm7500fe arm7tdmi arm7tdmi-s arm710t # arm720t arm740t strongarm strongarm110 strongarm1100 # strongarm1110 arm8 arm810 arm9 arm9e arm920 arm920t arm922t # arm946e-s arm966e-s arm968e-s arm926ej-s arm940t arm9tdmi # arm10tdmi arm1020t arm1026ej-s arm10e arm1020e arm1022e # arm1136j-s arm1136jf-s mpcore mpcorenovfp arm1156t2-s # arm1176jz-s arm1176jzf-s cortex-a8 cortex-a9 cortex-r4 # cortex-r4f cortex-m3 cortex-m1 xscale iwmmxt iwmmxt2 ep9312. # TARGET_CPU="cortex-a73.cortex-a53" TARGET_CPU_FLAGS="+crc+fp+simd" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc" TARGET_FPU="neon-fp-armv8" ;; esac # Bootloader to use (syslinux / u-boot / atv-bootloader / bcm2835-bootloader) BOOTLOADER="u-boot" # Kernel target KERNEL_TARGET="Image.lzo" # Kernel extra targets to build KERNEL_UBOOT_EXTRA_TARGET="" # Build Android kernel image using mkbootimg BUILD_ANDROID_BOOTIMG="yes" # Additional options to be passed to Android mkbootimg ANDROID_BOOTIMG_OPTIONS="--base 0x0 --kernel_offset 0x1080000" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="dtbs" # Additional kernel dependencies KERNEL_EXTRA_DEPENDS_TARGET="" # Kernel to use. values can be: # default: default mainline kernel LINUX="amlogic-5.15" # kernel image name KERNEL_NAME="kernel.img" # CODENAME BASED KERNEL OS_CODENAME="Piers" ################################################################################ # setup build defaults ################################################################################ # Project CFLAGS PROJECT_CFLAGS="" # SquashFS compression method (gzip / lzo / xz) SQUASHFS_COMPRESSION="lzo" ################################################################################ # setup project defaults ################################################################################ # build and install ALSA Audio support (yes / no) ALSA_SUPPORT="yes" # OpenGL(X) implementation to use (no / Mesa) OPENGL="no" # OpenGL-ES implementation to use (no / bcm2835-driver / gpu-viv-bin-mx6q / opengl-meson) OPENGLES="opengl-meson" # include uvesafb support (yes / no) UVESAFB_SUPPORT="no" # Displayserver to use (x11 / no) DISPLAYSERVER="no" # Windowmanager to use (fluxbox / none) WINDOWMANAGER="none" # Xorg Graphic drivers to use (all / i915,i965,r200,r300,r600,nvidia,nouveau) # Space separated list is supported, # e.g. GRAPHIC_DRIVERS="i915 i965 r300 r600 radeonsi nvidia nouveau" GRAPHIC_DRIVERS="" # Use a vendor specific KODI repo KODI_VENDOR="amlogic-5.15" # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap / libamcodec) KODIPLAYER_DRIVER="libamcodec" # Modules to install in initramfs for early boot INITRAMFS_MODULES="" # additional drivers to install: # for a list of additinoal drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="gpu-aml openvfd-driver media_modules-aml wifi_dummy-aml ap6xxx-aml aic8800-sdio RTW88 RTL8189FS RTL8852BE-aml RTL8723DS-aml RTL8851BU RTL8852BS-aml mt76 mt7668-wifi-bt w1-aml" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" FIRMWARE="misc-firmware wlan-firmware dvb-firmware brcmfmac_sdio-firmware-aml rtkbt-firmware-aml qca-firmware-aml" # build and install ATV IR remote support (yes / no) ATVCLIENT_SUPPORT="no" # Amlogic IR remote support (yes / no) AMREMOTE_SUPPORT="yes" # build and install iSCSI support - iscsistart (yes / no) ISCSI_SUPPORT="no" # build with installer (yes / no) INSTALLER_SUPPORT="no" # build and install driver addons (yes / no) DRIVER_ADDONS_SUPPORT="no" # driver addons to install: # for a list of additinoal drivers see packages/linux-driver-addons # Space separated list is supported, DRIVER_ADDONS="" # additional packages to install: # Space separated list is supported, # e.g. ADDITIONAL_PACKAGES="PACKAGE1 PACKAGE2" ADDITIONAL_PACKAGES="u-boot-script dtc CoreELEC-Debug-Scripts inject_bl301 ceemmc nfs-utils dtb-xml megatools tmate parse-android-dynparts" # add OOTB support for IR remote # IR_REMOTE_KEYMAPS+="" # build with entware installer ENTWARE_SUPPORT="yes" ENTWARE_ARCH="aarch64-k3.10" # CoreELEC Subdevices #Khadas_VIM4 Khadas_VIM1S Odroid_C4 Odroid_N2 Radxa_Zero Radxa_Zero2 Alta Solitude SUBDEVICES="Khadas_VIM4 Khadas_VIM1S Odroid_C4 Odroid_N2 Radxa_Zero Radxa_Zero2 Alta Solitude" # TEE supported SoC TEE_SOC="S928X A311D2 S905W2 S905X4 S905Y4" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/addon-depends/jsonschema/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) PKG_NAME="jsonschema" PKG_VERSION="4.23.0" PKG_SHA256="d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4" PKG_LICENSE="MIT" PKG_SITE="https://pypi.org/project/jsonschema/" PKG_URL="https://files.pythonhosted.org/packages/source/${PKG_NAME:0:1}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="Python3:host" PKG_LONGDESC="An implementation of JSON Schema validation for Python." PKG_TOOLCHAIN="manual" makeinstall_host() { cp -r ${PKG_BUILD}/jsonschema ${TOOLCHAIN}/lib/${PKG_PYTHON_VERSION}/site-packages } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/addon-depends/mbedtls/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) PKG_NAME="mbedtls" PKG_VERSION="3.5.2" PKG_SHA256="35890edf1a2c7a7e29eac3118d43302c3e1173e0df0ebaf5db56126dabe5bb05" PKG_LICENSE="Apache 2.0" PKG_SITE="https://github.com/Mbed-TLS/mbedtls" PKG_URL="https://github.com/Mbed-TLS/mbedtls/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain jsonschema:host Jinja2:host" PKG_LONGDESC="Mbed TLS is a C library that implements cryptographic primitives, X.509 certificate manipulation and the SSL/TLS and DTLS protocols." PKG_CMAKE_OPTS_TARGET="-DCMAKE_BUILD_TYPE=Release \ -DUSE_SHARED_MBEDTLS_LIBRARY=OFF \ -DUSE_STATIC_MBEDTLS_LIBRARY=ON \ -DENABLE_TESTING=OFF \ -DENABLE_PROGRAMS=OFF \ -DLINK_WITH_PTHREAD=ON \ -Wno-dev" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/addon-depends/qmdnsengine/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="qmdnsengine" PKG_VERSION="0ca80117e853671d909b3cec9e2bdcac85a13b9f" PKG_SHA256="3ae288458e3fc1c1e636869aaca0fd5c77bdd6aec6fd4d62217d0f46acd4042c" PKG_LICENSE="MIT" PKG_SITE="https://github.com/nitroshare/qmdnsengine" PKG_URL="https://github.com/nitroshare/qmdnsengine/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain qt-everywhere" PKG_LONGDESC="Library provides an implementation of multicast DNS as per RFC 6762." PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=OFF" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/addon-depends/qt-everywhere/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="qt-everywhere" PKG_VERSION="5.15.13" PKG_SHA256="9550ec8fc758d3d8d9090e261329700ddcd712e2dda97e5fcfeabfac22bea2ca" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://qt-project.org" PKG_URL="http://download.qt.io/archive/qt/${PKG_VERSION%.*}/${PKG_VERSION}/single/${PKG_NAME}-opensource-src-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="pcre2 zlib openssl libjpeg-turbo" PKG_SOURCE_DIR="${PKG_NAME}-src-${PKG_VERSION}" PKG_LONGDESC="A cross-platform application and UI framework" PKG_CONFIGURE_OPTS_TARGET="-prefix /usr -sysroot "${SYSROOT_PREFIX}" -hostprefix "${TOOLCHAIN}" -device linux-libreelec-g++ -opensource -confirm-license -release -static -make libs -force-pkg-config -openssl-linked -no-accessibility -system-sqlite -no-sql-mysql -system-zlib -no-mtdev -system-libjpeg -qt-libpng -no-harfbuzz -no-libproxy -system-pcre -no-glib -silent -no-cups -no-iconv -no-evdev -no-tslib -no-icu -no-strip -no-fontconfig -dbus -no-opengl -no-libudev -no-libinput -no-eglfs -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtconnectivity -skip qtdeclarative -skip qtdoc -skip qtgraphicaleffects -skip qtimageformats -skip qtlocation -skip qtmacextras -skip qtmultimedia -skip qtquickcontrols -skip qtquickcontrols2 -skip qtscript -skip qtsensors -skip qtserialbus -skip qtsvg -skip qttranslations -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtwinextras -skip qtx11extras -skip qtxmlpatterns" post_unpack() { # HOST_CFLAGS_DBUS is set to SYSROOT_PREFIX/usr/include # from libsystemd.pc which is required by dbus-1.pc # this fails to build some host tools # with -no-dbus this workaround is not needed sed -i "s|QT_HOST_CFLAGS_DBUS|QT_HOST_CFLAGS_DBUS_IGNORED|" \ ${PKG_BUILD}/qtbase/configure.json } configure_target() { QMAKE_CONF_DIR="qtbase/mkspecs/devices/linux-libreelec-g++" cd .. mkdir -p ${QMAKE_CONF_DIR} cat >"${QMAKE_CONF_DIR}/qmake.conf" <<EOF MAKEFILE_GENERATOR = UNIX CONFIG += incremental QMAKE_INCREMENTAL_STYLE = sublib include(../../common/linux.conf) include(../../common/gcc-base-unix.conf) include(../../common/g++-unix.conf) load(device_config) QMAKE_CC = ${CC} QMAKE_CXX = ${CXX} QMAKE_LINK = ${CXX} QMAKE_LINK_SHLIB = ${CXX} QMAKE_AR = ${AR} cqs QMAKE_OBJCOPY = ${OBJCOPY} QMAKE_NM = ${NM} -P QMAKE_STRIP = ${STRIP} QMAKE_CFLAGS = ${CFLAGS} QMAKE_CXXFLAGS = ${CXXFLAGS} QMAKE_LFLAGS = ${LDFLAGS} load(qt_config) EOF cat >"${QMAKE_CONF_DIR}/qplatformdefs.h" <<EOF #include "../../linux-g++/qplatformdefs.h" EOF unset CC CXX LD RANLIB AR AS CPPFLAGS CFLAGS LDFLAGS CXXFLAGS ./configure ${PKG_CONFIGURE_OPTS_TARGET} } post_makeinstall_target() { # Qt installs directly to $SYSROOT_PREFIX so don't rely on scripts/build fixing this up # PKG_ORIG_SYSROOT_PREFIX will be undefined when performing a legacy build sed -e "s:\(['= ]\)/usr:\\1${PKG_ORIG_SYSROOT_PREFIX:-${SYSROOT_PREFIX}}/usr:g" -i "${PKG_ORIG_SYSROOT_PREFIX:-${SYSROOT_PREFIX}}/usr/lib"/libQt*.la } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/addon-depends/qt-everywhere/patches/xkb_fix_build_with_libxkbcommon_1_6_0_and_later.patch ================================================ From: Liang Qi <liang.qi@qt.io> Date: Tue, 10 Oct 2023 12:08:48 +0000 (+0200) Subject: xkb: fix build with libxkbcommon 1.6.0 and later X-Git-Url: https://codereview.qt-project.org/gitweb?p=qt%2Fqtbase.git;a=commitdiff_plain;h=8af35d27e8f02bbb99aef4ac495ed406e50e3cca;hp=260ac1891ac87fa9967be11debbbeba7e3f1e03d xkb: fix build with libxkbcommon 1.6.0 and later A few XKB_KEY_dead_* defines got removed from 1.6.0. See also https://github.com/xkbcommon/libxkbcommon/blob/6073565903488cb5b9a8d37fdc4a7c2f9d7ad04d/NEWS#L9-L14 https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/merge_requests/70/diffs?commit_id=cb44799b72f611eb4c9d7cc185bc3b09e070be08 Pick-to: 6.6 6.5 6.2 5.15 Fixes: QTBUG-117950 Change-Id: I55861868f2bb29c553d68365fa9b9b6ed01c9aea Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io> --- diff --git a/qtbase/src/platformsupport/input/xkbcommon/qxkbcommon.cpp b/qtbase/src/platformsupport/input/xkbcommon/qxkbcommon.cpp index 26d87c5ff599..7b611790c677 100644 --- a/qtbase/src/platformsupport/input/xkbcommon/qxkbcommon.cpp +++ b/qtbase/src/platformsupport/input/xkbcommon/qxkbcommon.cpp @@ -237,10 +237,14 @@ static constexpr const auto KeyTbl = qMakeArray( Xkb2Qt<XKB_KEY_dead_small_schwa, Qt::Key_Dead_Small_Schwa>, Xkb2Qt<XKB_KEY_dead_capital_schwa, Qt::Key_Dead_Capital_Schwa>, Xkb2Qt<XKB_KEY_dead_greek, Qt::Key_Dead_Greek>, +/* The following four XKB_KEY_dead keys got removed in libxkbcommon 1.6.0 + The define check is kind of version check here. */ +#ifdef XKB_KEY_dead_lowline Xkb2Qt<XKB_KEY_dead_lowline, Qt::Key_Dead_Lowline>, Xkb2Qt<XKB_KEY_dead_aboveverticalline, Qt::Key_Dead_Aboveverticalline>, Xkb2Qt<XKB_KEY_dead_belowverticalline, Qt::Key_Dead_Belowverticalline>, Xkb2Qt<XKB_KEY_dead_longsolidusoverlay, Qt::Key_Dead_Longsolidusoverlay>, +#endif // Special keys from X.org - This include multimedia keys, // wireless/bluetooth/uwb keys, special launcher keys, etc. ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/aml-vnc/changelog.txt ================================================ 22.0.0 - add missing service alias - hide password on settings page 21.0.6 - bump package to 1.2.0 21.0.5 - replace package source git repository - creating a source directory with the necessary files and their modifications - modify the service start script to be compatible with the new binary - add Hungarian translation of the add-on - restart service on settings change 21.0.4 - performance fixes 21.0.3 - fix resolution issue when used other than native 21.0.2 - add option to set desktop name (hostname by default) 21.0.1 - make IPv6 listen port consistent with IPv4 port 20.1.0 - fix password authentication when building with openssl >=3.0.0 20.0.104 - update language strings file 103 - improvements 102 - libvncserver bump 101 - CoreELEC rebrand 100 - Initial release ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/aml-vnc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="aml-vnc" PKG_VERSION="1.2.0" PKG_SHA256="38009d0ea84868c7e077eb7594f2808bf5acdae3b7e691cb73fb800e9489d064" PKG_REV="0" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/dtechsrv/aml-vnc-server/" PKG_URL="https://github.com/dtechsrv/aml-vnc-server/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libvncserver" PKG_SECTION="service" PKG_SHORTDESC="Amlogic VNC server" PKG_LONGDESC="Amlogic VNC server is a Virtual Network Computing (VNC) server for Amlogic devices" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Amlogic VNC" PKG_ADDON_TYPE="xbmc.service" pre_configure_target() { export CFLAGS+=" -Wno-stringop-truncation" } makeinstall_target() { : } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/{bin,lib} cp -P ${PKG_BUILD}/aml-vnc ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp $(get_build_dir libvncserver)/.${TARGET_NAME}/libvncserver.so.? ${ADDON_BUILD}/${PKG_ADDON_ID}/lib } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/aml-vnc/source/bin/aml-vnc.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2016-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) . /etc/profile oe_setup_addon service.aml-vnc if [ ${AML_VNC_PORT} != "5900" ] ; then export VNC_PORT="${AML_VNC_PORT}" fi if [ ${AML_VNC_AUTH} == "true" ] ; then export VNC_PASSWORD="${AML_VNC_PWD}" fi if [ ${AML_VNC_STAT} == "true" ] ; then export VNC_SERVERNAME="${AML_VNC_NAME}" fi exec aml-vnc ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/aml-vnc/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == "__main__": Monitor().waitForAbort() ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/aml-vnc/source/power.d/aml-vnc.power ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2016-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) . /etc/profile SERVICE="service.aml-vnc.service" case "$1" in pre) if systemctl is-active "$SERVICE" &>/dev/null ; then systemctl stop "$SERVICE" fi ;; post) if systemctl is-enabled "$SERVICE" &>/dev/null ; then systemctl start "$SERVICE" fi ;; esac ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/aml-vnc/source/resources/language/resource.language.en_gb/strings.po ================================================ # Kodi Media Center language file # Addon Name: Amlogic VNC Server # Addon id: service.aml-vnc # Addon Provider: Team CoreELEC msgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgctxt "#30000" msgid "Server settings" msgstr "" msgctxt "#30001" msgid "Port" msgstr "" msgctxt "#30002" msgid "Use authentication" msgstr "" msgctxt "#30003" msgid "Password" msgstr "" msgctxt "#30004" msgid "Use static name instead of hostname" msgstr "" msgctxt "#30005" msgid "Name to be displayed" msgstr "" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/aml-vnc/source/resources/language/resource.language.hu_hu/strings.po ================================================ # Kodi Media Center language file # Addon Name: Amlogic VNC Server # Addon id: service.aml-vnc # Addon Provider: Team CoreELEC msgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hu_HU\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "Server settings" msgstr "Szerver beállítások" msgctxt "#30001" msgid "Port" msgstr "" msgctxt "#30002" msgid "Use authentication" msgstr "Hitelesítés használata" msgctxt "#30003" msgid "Password" msgstr "Jelszó" msgctxt "#30004" msgid "Use static name instead of hostname" msgstr "Statikus név használata a hosztnév helyett" msgctxt "#30005" msgid "Name to be displayed" msgstr "Megjelenített név" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/aml-vnc/source/resources/settings.xml ================================================ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <settings> <category label="30000"> <setting type="lsep" /> <setting id="AML_VNC_PORT" type="number" label="30001" default="5900" /> <setting id="AML_VNC_AUTH" type="bool" label="30002" default="true" /> <setting id="AML_VNC_PWD" type="text" label="30003" option="hidden" default="coreelec" visible="eq(-1,true)" /> <setting id="AML_VNC_STAT" type="bool" label="30004" default="false" /> <setting id="AML_VNC_NAME" type="text" label="30005" default="CoreELEC" enable="eq(-1,true)" /> </category> </settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/aml-vnc/source/settings-default.xml ================================================ <settings> <setting id="AML_VNC_PORT" value="5900" /> <setting id="AML_VNC_AUTH" value="true" /> <setting id="AML_VNC_PWD" value="coreelec" /> <setting id="AML_VNC_STAT" value="false" /> <setting id="AML_VNC_NAME" value="CoreELEC" /> </settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/aml-vnc/source/system.d/service.aml-vnc.service ================================================ [Unit] Description=aml-vnc After=graphical.target [Service] ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.aml-vnc/bin/aml-vnc.start" TimeoutStopSec=1 Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=kodi.target Alias=aml-vnc.service ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/homatics-leds/LICENSE.txt ================================================ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/homatics-leds/addon.xml ================================================ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="@PKG_ADDON_ID@" name="@ADDON_NAME@" version="@ADDON_VERSION@" provider-name="@PROVIDER_NAME@"> <requires> <import addon="xbmc.python" version="3.0.0"/> </requires> <extension point="xbmc.python.pluginsource" library="default.py"> <provides>executable</provides> </extension> <extension point="xbmc.service" library="service.py"> <provides/> </extension> <extension point="xbmc.addon.metadata"> <summary lang="de_DE">Homatics LED Kit Modus</summary> <summary lang="en_GB">Homatics LED Kit mode</summary> <summary lang="hu_HU">Homatics LED Kit üzemmód</summary> <description lang="de_DE"> Mit diesem Addon können die LEDs in den Knight-Rider-Modus gesetzt werden, oder ihre Farbe kann einfach angepasst werden... Danke an vpeter und FoLeY für die Unterstützung... hex grün 122e04, blau 101010, lila 800080, gelb ff4600, tiefblau 0d00bf, magenta d8007a, orange f50e00, ff0000 rot, 00000 keine Farbe </description> <description lang="en_GB"> With this addon, the LEDs can be set to knight rider mode, or their color can be simply customized... Thanks to vpeter and FoLeY for the support... hex green 122e04, blue 101010, purple 800080, yellow ff4600, deepblue 0d00bf, magenta d8007a, orange f50e00, ff0000 red, 00000 no color </description> <description lang="hu_HU"> A kiegészítővel beállíthatóak a ledek knight Rider módba, vagy simán testreszabható a színük ... Köszönet vpeter-nek, és FoLeY-nak a támogatásért... hex green 122e04, blue 101010, purple 800080, yellow ff4600, deepblue 0d00bf, magenta d8007a, orange f50e00, ff0000 red, 00000 no color </description> <disclaimer> </disclaimer> <platform>all</platform> <news> 21.0.2 - added german translation 21.0.1 - added language strings </news> <assets> <icon>resources/icon.png</icon> <fanart>resources/fanart.jpg</fanart> </assets> </extension> </addon> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/homatics-leds/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) PKG_NAME="homatics-leds" PKG_VERSION="0.1" PKG_SHA256="" PKG_REV="2" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://coreelec.org" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="service" PKG_SHORTDESC="Homatics LED Kit mode" PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Homatics LEDs" PKG_ADDON_TYPE="xbmc.service" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/resources cp ${PKG_DIR}/LICENSE.txt ${ADDON_BUILD}/${PKG_ADDON_ID} cp ${PKG_DIR}/addon.xml ${ADDON_BUILD}/${PKG_ADDON_ID} # set only version (revision will be added by buildsystem) sed -e "s|@ADDON_VERSION@|${ADDON_VERSION}|g" \ -i ${ADDON_BUILD}/${PKG_ADDON_ID}/addon.xml } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/homatics-leds/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) import urllib.request, urllib.parse, urllib.error import urllib.parse import sys import xbmc import xbmcgui import xbmcplugin import xbmcaddon import os import subprocess ADDON_ID = 'service.homatics-leds' addon = xbmcaddon.Addon(ADDON_ID) base_url = sys.argv[0] addon_handle = int(sys.argv[1]) args = urllib.parse.parse_qs(sys.argv[2][1:]) def build_url(query): return base_url + '?' + urllib.parse.urlencode(query) addon_icon = 'special://home/addons/service.homatics-leds/resources/icon.png' addon_icon1 = 'special://home/addons/service.homatics-leds/resources/icon1.png' addon_icon2 = 'special://home/addons/service.homatics-leds/resources/icon2.png' addon_icon3 = 'special://home/addons/service.homatics-leds/resources/icon3.png' addon_icon4 = 'special://home/addons/service.homatics-leds/resources/icon4.png' addon_icon5 = 'special://home/addons/service.homatics-leds/resources/icon5.png' addon_icon6 = 'special://home/addons/service.homatics-leds/resources/icon6.png' addon_icon7 = 'special://home/addons/service.homatics-leds/resources/icon7.png' addon_icon8 = 'special://home/addons/service.homatics-leds/resources/icon8.png' addon_icon9 = 'special://home/addons/service.homatics-leds/resources/icon9.png' mode = args.get('mode', None) if mode is None: url = build_url({'mode': 'red', 'foldername': 'LEDs red'}) li = xbmcgui.ListItem(addon.getLocalizedString(32009)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon1, 'thumb' : addon_icon1}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) url = build_url({'mode': 'blue', 'foldername': 'LEDs blue'}) li = xbmcgui.ListItem(addon.getLocalizedString(32010)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon2, 'thumb' : addon_icon2}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) url = build_url({'mode': 'green', 'foldername': 'LEDs green'}) li = xbmcgui.ListItem(addon.getLocalizedString(32011)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon3, 'thumb' : addon_icon3}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) url = build_url({'mode': 'purple', 'foldername': 'LEDs purple'}) li = xbmcgui.ListItem(addon.getLocalizedString(32012)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon4, 'thumb' : addon_icon4}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) url = build_url({'mode': 'yellow', 'foldername': 'LEDs yellow'}) li = xbmcgui.ListItem(addon.getLocalizedString(32013)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon5, 'thumb' : addon_icon5}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) url = build_url({'mode': 'deepblue', 'foldername': 'LEDs deepblue'}) li = xbmcgui.ListItem(addon.getLocalizedString(32014)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon6, 'thumb' : addon_icon6}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) url = build_url({'mode': 'magenta', 'foldername': 'LEDs magenta'}) li = xbmcgui.ListItem(addon.getLocalizedString(32015)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon7, 'thumb' : addon_icon7}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) url = build_url({'mode': 'orange', 'foldername': 'LEDs orange'}) li = xbmcgui.ListItem(addon.getLocalizedString(32016)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon8, 'thumb' : addon_icon8}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) url = build_url({'mode': 'purpleN', 'foldername': 'LEDs straight purple'}) li = xbmcgui.ListItem(addon.getLocalizedString(32017)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon9, 'thumb' : addon_icon9}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) xbmcplugin.endOfDirectory(addon_handle) elif mode[0] == 'red' or mode[0] == 'orange' or mode[0] == 'green' or mode[0] == 'magenta' or mode[0] == 'deepblue' or mode[0] == 'blue' or mode[0] == 'purple' or mode[0] == 'yellow': xbmc.log('mode[0] %s' % mode[0], level=xbmc.LOGERROR) addon.setSetting('strip_color', mode[0]) addon.setSetting('solid_color_type_on', 'name') addon.setSetting('solid_effect', 'effect') xbmc.executeJSONRPC('{"jsonrpc":"2.0","method":"Addons.SetAddonEnabled","id":8,"params":{"addonid":"%s","enabled":false}}'% ADDON_ID) xbmc.sleep(2000) xbmc.executeJSONRPC('{"jsonrpc":"2.0","method":"Addons.SetAddonEnabled","id":8,"params":{"addonid":"%s","enabled":true}}'% ADDON_ID) elif mode[0] == 'purpleN': xbmc.log('mode[0] %s' % 'purpleN', level=xbmc.LOGERROR) addon.setSetting('strip_color', 'purple') addon.setSetting('solid_color_type_on', 'name') addon.setSetting('solid_effect', 'solid') xbmc.executeJSONRPC('{"jsonrpc":"2.0","method":"Addons.SetAddonEnabled","id":8,"params":{"addonid":"%s","enabled":false}}'% ADDON_ID) xbmc.sleep(2000) xbmc.executeJSONRPC('{"jsonrpc":"2.0","method":"Addons.SetAddonEnabled","id":8,"params":{"addonid":"%s","enabled":true}}'% ADDON_ID) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/homatics-leds/source/resources/language/resource.language.de_de/strings.po ================================================ # Kodi Media Center language file # Addon Name: Homatics LED setup # Addon id: service.homatics-leds # Addon Provider: Team CoreELEC msgid "" msgstr "" msgctxt "#32000" msgid "LED" msgstr "" msgctxt "#32001" msgid "Effect color" msgstr "Farbe des Effekts" msgctxt "#32002" msgid "Effect or solid" msgstr "Effekt oder Einfarbig" msgctxt "#32003" msgid "Color by name or hex" msgstr "Farbe nach Name oder HEX" msgctxt "#32004" msgid "Solid color On" msgstr "LED-Farbe: Eingeschaltet" msgctxt "#32005" msgid "Solid color Off" msgstr "LED-Farbe: Ausgeschaltet" msgctxt "#32006" msgid "Solid color Suspend" msgstr "LED-Farbe: Schlafmodus" msgctxt "#32007" msgid "Number of LEDs On" msgstr "Anzahl der eingeschalteten LEDs" msgctxt "#32009" msgid "Set red Knight Rider effect" msgstr "Knight-Rider-Effekt: Rot" msgctxt "#32010" msgid "Set blue Knight Rider effect" msgstr "Knight-Rider-Effekt: Blau" msgctxt "#32011" msgid "Set green Knight Rider effect" msgstr "Knight-Rider-Effekt: Grün" msgctxt "#32012" msgid "Set purple Knight Rider effect" msgstr "Knight-Rider-Effekt: Lila" msgctxt "#32013" msgid "Set yellow Knight Rider effect" msgstr "Knight-Rider-Effekt: Gelb" msgctxt "#32014" msgid "Set deepblue Knight Rider effect" msgstr "Knight-Rider-Effekt: Tiefblau" msgctxt "#32015" msgid "Set magenta Knight Rider effect" msgstr "Knight-Rider-Effekt: Magenta" msgctxt "#32016" msgid "Set orange Knight Rider effect" msgstr "Knight-Rider-Effekt: Orange" msgctxt "#32017" msgid "Set straight purple color" msgstr "Einfarbige Farbe: Lila" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/homatics-leds/source/resources/language/resource.language.en_gb/strings.po ================================================ # Kodi Media Center language file # Addon Name: Homatics LED setup # Addon id: service.homatics-leds # Addon Provider: Team CoreELEC msgid "" msgstr "" msgctxt "#32000" msgid "LED" msgstr "" msgctxt "#32001" msgid "Effect color" msgstr "" msgctxt "#32002" msgid "Effect or solid" msgstr "" msgctxt "#32003" msgid "Color by name or hex" msgstr "" msgctxt "#32004" msgid "Solid color On" msgstr "" msgctxt "#32005" msgid "Solid color Off" msgstr "" msgctxt "#32006" msgid "Solid color Suspend" msgstr "" msgctxt "#32007" msgid "Number of LEDs On" msgstr "" msgctxt "#32009" msgid "Set red Knight Rider effect" msgstr "" msgctxt "#32010" msgid "Set blue Knight Rider effect" msgstr "" msgctxt "#32011" msgid "Set green Knight Rider effect" msgstr "" msgctxt "#32012" msgid "Set purple Knight Rider effect" msgstr "" msgctxt "#32013" msgid "Set yellow Knight Rider effect" msgstr "" msgctxt "#32014" msgid "Set deepblue Knight Rider effect" msgstr "" msgctxt "#32015" msgid "Set magenta Knight Rider effect" msgstr "" msgctxt "#32016" msgid "Set orange Knight Rider effect" msgstr "" msgctxt "#32017" msgid "Set straight purple color" msgstr "" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/homatics-leds/source/resources/language/resource.language.hu_hu/strings.po ================================================ Kodi Media Center language file # Addon Name: Homatics LED setup # Addon id: service.homatics-leds # Addon Provider: Team CoreELEC msgid "" msgstr "" msgctxt "#32000" msgid "LED" msgstr "" msgctxt "#32001" msgid "Effect color" msgstr "Ledek színe" msgctxt "#32002" msgid "Effect or solid" msgstr "Effekt vagy egyszerű szín" msgctxt "#32003" msgid "Color by name or hex" msgstr "Szín neve vagy hex kód" msgctxt "#32004" msgid "Solid color On" msgstr "Led színe: box bekapcsolva" msgctxt "#32005" msgid "Solid color Off" msgstr "Led színe: box kikapcsolva" msgctxt "#32006" msgid "Solid color Suspend" msgstr "Led színe: box alvó állapot" msgctxt "#32007" msgid "Number of LEDs On" msgstr "Ledek száma" msgctxt "#32009" msgid "Set red Knight Rider effect" msgstr "Vörös Knight rider effekt beállítása" msgctxt "#32010" msgid "Set blue Knight Rider effect" msgstr "Kék Knight rider effekt" msgctxt "#32011" msgid "Set green Knight Rider effect" msgstr "Zöld Knight rider effekt" msgctxt "#32012" msgid "Set purple Knight Rider effect" msgstr "Lila Knight rider effekt" msgctxt "#32013" msgid "Set yellow Knight Rider effect" msgstr "Sárga Knight rider effekt" msgctxt "#32014" msgid "Set deepblue Knight Rider effect" msgstr "Sötétkék Knight rider effekt" msgctxt "#32015" msgid "Set magenta Knight Rider effect" msgstr "Magenta Knight rider effekt" msgctxt "#32016" msgid "Set orange Knight Rider effect" msgstr "Narancs Knight rider effekt" msgctxt "#32017" msgid "Set straight purple color" msgstr "Állíts be sima lila színt" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/homatics-leds/source/resources/settings.xml ================================================ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <settings> <category label="32000"> <setting type="lsep" /> <setting label="32001" type="labelenum" id="strip_color" values="red|yellow|purple|blue|deepblue|magenta|green|orange" default="red"/> <setting label="32007" type="labelenum" id="number_leds" values="1|all|8|6|4|2" default="all"/> <setting label="32002" type="labelenum" id="solid_effect" values="effect|solid" default="effect"/> <setting label="32003" type="labelenum" id="solid_color_type_on" values="name|hex" default="name"/> <setting label="32004" type="text" id="color_on" default="101010"/> <setting label="32005" type="text" id="color_off" default="000000"/> <setting label="32006" type="text" id="color_suspend" default="800080"/> </category> </settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/homatics-leds/source/service.py ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) from time import sleep import os.path from threading import Thread, Event import xbmc, xbmcaddon sysfs = '/sys/devices/platform/soc/fe000000.apb4/fe06c000.i2c/i2c-3/3-003c/leds/bct3236/' leds_count = 10 # do not change delay = 90 # in milliseconds ##################################################################### def myLog(msg, level = xbmc.LOGINFO): xbmc.log(addonid + ': ' + msg, level) ##################################################################### def write_sysfs(which, data): if os.path.isfile(sysfs + which): with open(sysfs + which, 'w') as file: file.write(data) ##################################################################### def led_on(pos, pos_min, pos_max, color): out_arr = [] out_str = '' for i in range(leds_count): out_arr.append('000000') if pos >= 0: out_arr[pos] = color elif pos_min >= 0 and pos_max >= 0: for pos in range(pos_min, pos_max + 1): out_arr[pos] = color for i in range(leds_count): out_str += out_arr[i] + ' ' #myLog('out_str: %s' % out_str) write_sysfs('colors', out_str) ##################################################################### class myEffectThread(Thread): def __init__(self, color, run_daemon_mode = False): Thread.__init__(self) self.stop_event = Event() self.running = True self.color = color myLog('myEffectThread color %s' % self.color) def stop_event_is_set(self): if self.stop_event.is_set(): self.stop_event.clear() self.running = False myLog('myEffectThread stopping') led_on(-1, -1, -1, '') return True else: return False def stop(self): self.stop_event.set() def stop_and_join(self): self.stop() try: self.join() except: pass def run(self): while self.running: if self.stop_event_is_set(): break # to right for i in range(0, leds_count, 1): led_on(i, -1, -1, self.color) sleep(delay / 1000.0) if self.stop_event_is_set(): break sleep(delay / 1000.0) # to left for i in range(9, -1, -1): led_on(i, -1, -1, self.color) sleep(delay / 1000.0) if self.stop_event_is_set(): break sleep(delay / 1000.0) ##################################################################### def setup(): solid_effect = xbmcaddon.Addon().getSetting('solid_effect') myLog('solid_effect %s' % solid_effect) # set on/off/suspend colors and then start effect if active set_solid() if solid_effect == 'effect': myLog('setup effect') strip_color = xbmcaddon.Addon().getSetting('strip_color') strip_color = color_name_to_hex(strip_color) my_effect_thread = myEffectThread(strip_color, True) my_effect_thread.start() else: myLog('setup solid') my_effect_thread = None return my_effect_thread ##################################################################### def set_solid(): color_on = xbmcaddon.Addon().getSetting('color_on') color_off = xbmcaddon.Addon().getSetting('color_off') color_suspend = xbmcaddon.Addon().getSetting('color_suspend') number_leds = xbmcaddon.Addon().getSetting('number_leds') solid_color_type_on = xbmcaddon.Addon().getSetting('solid_color_type_on') if solid_color_type_on == 'name': color_on = xbmcaddon.Addon().getSetting('strip_color') color_on = color_name_to_hex(color_on) if number_leds == 'all': number_leds = 10 else: number_leds = int(number_leds) myLog('set_solid color_on %s' % color_on) myLog('set_solid color_off %s' % color_off) myLog('set_solid color_suspend %s' % color_suspend) myLog('set_solid number_leds %d' % number_leds) write_sysfs('edge_color_on', color_on) write_sysfs('edge_color_off', color_off) write_sysfs('edge_color_suspend', color_suspend) # set only some LEDs on if number_leds == 1: led_on(4, -1, -1, color_on) elif number_leds == 2: led_on(-1, 4, 5, color_on) elif number_leds == 4: led_on(-1, 3, 6, color_on) elif number_leds == 6: led_on(-1, 2, 7, color_on) elif number_leds == 8: led_on(-1, 1, 8, color_on) ##################################################################### def color_name_to_hex(color): if color == 'green': return '122e04' elif color == 'blue': return '101010' elif color == 'purple': return '800080' elif color == 'yellow': return 'ff4600' elif color == 'deepblue': return '0d00bf' elif color == 'magenta': return 'd8007a' elif color == 'orange': return 'f50e00' else: return 'ff0000' # red ##################################################################### class xbmcMonitor(xbmc.Monitor): def __init__(self, thread): xbmc.Monitor.__init__(self) self.my_effect_thread = thread def onSettingsChanged(self): myLog('settings changed, restart') if self.my_effect_thread is not None: self.my_effect_thread.stop_and_join() self.my_effect_thread = setup() def onNotification(self, sender, method, data): myLog('notification %s' % (method)) if method == 'System.OnWake': if self.my_effect_thread is None: # set on/off/suspend colors set_solid() elif method == 'System.OnQuit': # set on/off/suspend colors which will be changed to off color set_solid() ##################################################################### if __name__ == '__main__': addonid = xbmcaddon.Addon().getAddonInfo('id') led_on(-1, -1, -1, '') my_effect_thread = setup() monitor = xbmcMonitor(my_effect_thread) while not monitor.abortRequested(): if monitor.waitForAbort(5): if my_effect_thread is not None: my_effect_thread.stop_and_join() myLog('finished') break ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/homatics-leds/source/settings-default.xml ================================================ <settings> <setting id="strip_color" value="red" /> <setting id="static_effect" value="effect" /> <setting id="number_leds" value="all" /> </settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/hyperion.ng/changelog.txt ================================================ 115 - Add support for new fb decoder 114 - Update to 2.0.16 113 - Update to 2.0.15 112 - fix dependencies and add new suspend/resume support suspend/resume support by PR hyperion-project/hyperion.ng#1535 111 - Update to 2.0.14 110 - Update to 2.0.13 109 - Update to 2.0.12 108 - Update to 2.0.0-alpha.11 ... 101 - Add Platform script 100 - Initial Release @e438bc6 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/hyperion.ng/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="hyperion.ng" PKG_VERSION="2.0.16" PKG_SHA256="966a5494b75708c04213e1c28aff5c9a909b689ccc19d52c6c708a270b00ca8a" PKG_REV="116" PKG_LICENSE="GPL" PKG_SITE="https://github.com/hyperion-project/hyperion.ng" PKG_URL="https://github.com/hyperion-project/hyperion.ng/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 libusb qt-everywhere protobuf flatbuffers:host flatbuffers libjpeg-turbo qmdnsengine mbedtls alsa-lib" PKG_SECTION="service" PKG_SHORTDESC="Hyperion.NG: an AmbiLight controller" PKG_LONGDESC="Hyperion.NG($PKG_VERSION) is an modern opensource AmbiLight implementation." PKG_IS_ADDON="yes" PKG_ADDON_NAME="Hyperion.NG" PKG_ADDON_TYPE="xbmc.service" PKG_CMAKE_OPTS_TARGET="-DCMAKE_NO_SYSTEM_FROM_IMPORTED=ON \ -DCMAKE_BUILD_TYPE=Release \ -DUSE_SYSTEM_PROTO_LIBS=ON \ -DUSE_SYSTEM_FLATBUFFERS_LIBS=ON \ -DUSE_SYSTEM_QMDNS_LIBS=ON \ -DUSE_SYSTEM_MBEDTLS_LIBS=ON \ -DPLATFORM=amlogic \ -DENABLE_AMLOGIC=ON \ -DENABLE_DISPMANX=OFF \ -DENABLE_CEC=OFF \ -DENABLE_FB=ON \ -DENABLE_DEV_WS281XPWM=OFF \ -DENABLE_X11=OFF \ -DENABLE_V4L2=ON \ -DENABLE_OSX=OFF \ -DENABLE_DEV_SPI=ON \ -DENABLE_MDNS=ON \ -DENABLE_DEV_TINKERFORGE=OFF \ -DENABLE_TESTS=OFF \ -DENABLE_DEPLOY_DEPENDENCIES=OFF \ -Wno-dev" addon() { mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/bin cp $PKG_BUILD/.$TARGET_NAME/bin/* $ADDON_BUILD/$PKG_ADDON_ID/bin } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/hyperion.ng/patches/0001-Remove-unused-libs-for-Amlogic-platform.patch ================================================ From 156cfd51d056643a846c594ef6a5d5ebd7bd0a8e Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Sun, 17 Nov 2019 09:20:38 +0100 Subject: [PATCH 1/2] Remove unused libs for Amlogic platform --- src/hyperion-aml/CMakeLists.txt | 4 ---- src/hyperion-framebuffer/CMakeLists.txt | 4 ---- src/hyperion-remote/CMakeLists.txt | 4 ---- src/hyperion-v4l2/CMakeLists.txt | 4 ---- src/hyperiond/CMakeLists.txt | 4 ---- 5 files changed, 20 deletions(-) diff --git a/src/hyperion-aml/CMakeLists.txt b/src/hyperion-aml/CMakeLists.txt index 40b04df3..fea62f34 100644 --- a/src/hyperion-aml/CMakeLists.txt +++ b/src/hyperion-aml/CMakeLists.txt @@ -23,10 +23,6 @@ else() target_link_libraries(${PROJECT_NAME} ssdp) endif() -if(ENABLE_AMLOGIC) - target_link_libraries(${PROJECT_NAME} pcre16 dl z) -endif() - install (TARGETS ${PROJECT_NAME} DESTINATION "share/hyperion/bin" COMPONENT "hyperion_aml") if(CMAKE_HOST_UNIX) diff --git a/src/hyperion-framebuffer/CMakeLists.txt b/src/hyperion-framebuffer/CMakeLists.txt index a9470f5c..8ac51da4 100644 --- a/src/hyperion-framebuffer/CMakeLists.txt +++ b/src/hyperion-framebuffer/CMakeLists.txt @@ -22,10 +22,6 @@ else() target_link_libraries(${PROJECT_NAME} ssdp) endif() -if(ENABLE_AMLOGIC) - target_link_libraries(${PROJECT_NAME} pcre16 dl z) -endif() - install (TARGETS ${PROJECT_NAME} DESTINATION "share/hyperion/bin" COMPONENT "hyperion_framebuffer") if(CMAKE_HOST_UNIX) diff --git a/src/hyperion-remote/CMakeLists.txt b/src/hyperion-remote/CMakeLists.txt index ef60a7dc..8046fc15 100644 --- a/src/hyperion-remote/CMakeLists.txt +++ b/src/hyperion-remote/CMakeLists.txt @@ -21,10 +21,6 @@ target_link_libraries(${PROJECT_NAME} Qt${QT_VERSION_MAJOR}::Widgets ) -if(ENABLE_AMLOGIC) - target_link_libraries(${PROJECT_NAME} pcre16 dl z) -endif() - if(ENABLE_MDNS) target_link_libraries(${PROJECT_NAME} mdns) else() diff --git a/src/hyperion-v4l2/CMakeLists.txt b/src/hyperion-v4l2/CMakeLists.txt index 37189cdc..92aadb28 100644 --- a/src/hyperion-v4l2/CMakeLists.txt +++ b/src/hyperion-v4l2/CMakeLists.txt @@ -22,10 +22,6 @@ else() target_link_libraries(${PROJECT_NAME} ssdp) endif() -if(ENABLE_AMLOGIC) - target_link_libraries(${PROJECT_NAME} pcre16 dl z) -endif() - install (TARGETS ${PROJECT_NAME} DESTINATION "share/hyperion/bin" COMPONENT "hyperion_v4l2") if(CMAKE_HOST_UNIX) diff --git a/src/hyperiond/CMakeLists.txt b/src/hyperiond/CMakeLists.txt index 79a0b221..8ecbce4c 100644 --- a/src/hyperiond/CMakeLists.txt +++ b/src/hyperiond/CMakeLists.txt @@ -71,10 +71,6 @@ if(ENABLE_PROTOBUF_SERVER) target_link_libraries(${PROJECT_NAME} protoserver) endif() -if(ENABLE_AMLOGIC) - target_link_libraries(${PROJECT_NAME} pcre16 dl z) -endif(ENABLE_AMLOGIC) - if(ENABLE_DISPMANX) target_link_libraries(${PROJECT_NAME} dispmanx-grabber) endif (ENABLE_DISPMANX) -- 2.43.2 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/hyperion.ng/patches/0002-Embed-image-format-plugins-at-Amlogic-platform.patch ================================================ From 2e0ddd267d196e1e65e0cdbf5e2933c57a1db278 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Sun, 17 Nov 2019 09:20:38 +0100 Subject: [PATCH 2/2] Embed image format plugins at Amlogic platform --- libsrc/db/CMakeLists.txt | 6 ++++++ src/hyperiond/hyperiond.cpp | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/libsrc/db/CMakeLists.txt b/libsrc/db/CMakeLists.txt index 1beb3fe5..a72ce10f 100644 --- a/libsrc/db/CMakeLists.txt +++ b/libsrc/db/CMakeLists.txt @@ -12,3 +12,9 @@ target_link_libraries(database hyperion-utils Qt${QT_VERSION_MAJOR}::Sql ) + +if (ENABLE_AMLOGIC) + target_link_libraries(database + ${plugin_libs} + ) +endif() diff --git a/src/hyperiond/hyperiond.cpp b/src/hyperiond/hyperiond.cpp index 6c71475d..f40d6d2c 100644 --- a/src/hyperiond/hyperiond.cpp +++ b/src/hyperiond/hyperiond.cpp @@ -26,6 +26,11 @@ #include <webserver/WebServer.h> #include "hyperiond.h" +#ifdef ENABLE_AMLOGIC +#include <QtPlugin> +Q_IMPORT_PLUGIN(QGifPlugin) +#endif + // Flatbuffer Server #ifdef ENABLE_FLATBUF_SERVER #include <flatbufserver/FlatBufferServer.h> -- 2.43.2 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/hyperion.ng/source/bin/hyperiond.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) . /etc/profile oe_setup_addon service.hyperion.ng exec hyperiond --userdata $ADDON_HOME & echo $! > /run/hyperiond.pid if [ -f "/usr/bin/Xorg" ]; then exec hyperion-x11 & fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/hyperion.ng/source/bin/platform.sh ================================================ #!/bin/sh DECODERS=" amvdec_h265 amvdec_h265_fb amvdec_vp9 amvdec_vp9_fb amvdec_av1 amvdec_av1_fb" case "$1" in start) double_write_mode=3 ;; stop) double_write_mode=0 ;; *) exit 0 ;; esac for DECODER in ${DECODERS}; do [ -d "/sys/module/${DECODER}" ] && echo ${double_write_mode} > /sys/module/${DECODER}/parameters/double_write_mode || : done ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/hyperion.ng/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) import xbmc monitor = xbmc.Monitor() monitor.waitForAbort() ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/hyperion.ng/source/system.d/service.hyperion.ng.service ================================================ [Unit] Description=Hyperion.NG service After=graphical.target [Service] Type=forking ExecStartPre=/bin/sh -c "exec sh /storage/.kodi/addons/service.hyperion.ng/bin/platform.sh start" ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.hyperion.ng/bin/hyperiond.start" ExecReload=/bin/kill -HUP $MAINPID ExecStopPost=/bin/sh -c "exec sh /storage/.kodi/addons/service.hyperion.ng/bin/platform.sh stop" PIDFile=/run/hyperiond.pid TimeoutStopSec=2 Restart=always RestartSec=10 StartLimitInterval=0 [Install] WantedBy=default.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/addons/service/openvfd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Arthur Liberman (arthur_liberman@hotmail.com) PKG_NAME="openvfd" PKG_VERSION="1.0.6" PKG_SHA256="e531781921dbea3bed52304ccbf8722d85fc2141abeda11a0a2f405ecf7ff8b9" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/arthur-liberman/service.openvfd" PKG_URL="https://github.com/arthur-liberman/service.openvfd/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="service" PKG_SHORTDESC="OpenVFD: Service for controlling VFD displays" PKG_LONGDESC="OpenVFD: Service for controlling VFD displays, e.g. Display icons (Ethernet/WiFi connection status) Time, Date, Playback time" PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.service" addon() { mkdir -p $ADDON_BUILD/$PKG_ADDON_ID cp -PR $PKG_BUILD/* $ADDON_BUILD/$PKG_ADDON_ID } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/devel/msgpack-c/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="msgpack-c" PKG_VERSION="c3df1bb26ebdd01d618ecca7ae2d6b4e37d5abd7" PKG_SHA256="581442dd9b94de53b75eb3de3cc0bb96c52e6690125223ecf4fff407772d3949" PKG_LICENSE="MIT" PKG_SITE="https://github.com/msgpack/msgpack-c" PKG_URL="https://github.com/msgpack/msgpack-c/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Its like JSON but fast and small." PKG_CMAKE_OPTS_TARGET="-DMSGPACK_ENABLE_SHARED=OFF \ -DMSGPACK_ENABLE_STATIC=ON" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/lang/clang/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2024-present Team CoreELEC (https://coreelec.org) PKG_NAME="clang" # Android 14, Android U, 'Upside Down Cake' PKG_VERSION="r487747c" # sha changes with every download PKG_SHA256="" PKG_LICENSE="Apache License 2.0 with LLVM Exceptions" PKG_SITE="https://android.googlesource.com" PKG_URL="https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/+archive/refs/tags/android-14.0.0_r0.118/clang-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="" PKG_LONGDESC="Android Clang compiler" PKG_TOOLCHAIN="manual" unpack() { mkdir -p ${TOOLCHAIN}/lib/${PKG_NAME} tar -xf ${SOURCES}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz -C ${TOOLCHAIN}/lib/${PKG_NAME} } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/lang/gcc-linaro-aarch64-elf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="gcc-linaro-aarch64-elf" PKG_VERSION="4.9.4-2017.01" PKG_LICENSE="GPL" PKG_SITE="" PKG_DEPENDS_HOST="ccache:host" PKG_LONGDESC="Linaro Aarch64 GNU Linux Binary Toolchain" PKG_TOOLCHAIN="manual" if [ "${MACHINE_HARDWARE_NAME}" = "aarch64" ]; then PKG_SHA256="7b2082188cd94f35ae2185d0c37c22d0100982f5a8e1875b9b03c416ec653fd1" PKG_URL="https://sources.coreelec.org/gcc-linaro-${PKG_VERSION}-aarch64-elf.tar.xz" else PKG_SHA256="00c79aaf7ff9b1c22f7b0443a730056b3936561a4206af187ef61a4e3cab1716" PKG_URL="https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/aarch64-elf/gcc-linaro-${PKG_VERSION}-x86_64_aarch64-elf.tar.xz" fi makeinstall_host() { mkdir -p $TOOLCHAIN/lib/gcc-linaro-aarch64-elf/ cp -a * $TOOLCHAIN/lib/gcc-linaro-aarch64-elf } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/lang/gcc-linaro-arm-eabi/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="gcc-linaro-arm-eabi" PKG_VERSION="4.9.4-2017.01" PKG_LICENSE="GPL" PKG_SITE="" PKG_DEPENDS_HOST="ccache:host" PKG_LONGDESC="Linaro ARM GNU Linux Binary Toolchain" PKG_TOOLCHAIN="manual" if [ "${MACHINE_HARDWARE_NAME}" = "aarch64" ]; then PKG_SHA256="4b9a62d912de4c1fd2153e6652fbd296a62ac081515b6625edf3b8e0388ac6dd" PKG_URL="https://sources.coreelec.org/gcc-linaro-${PKG_VERSION}-arm-eabi.tar.xz" else PKG_SHA256="5fa170a74db172dca098c70ae58f4c08d2fca0232ce135530b2ef4996326b4bd" PKG_URL="https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-eabi/gcc-linaro-${PKG_VERSION}-x86_64_arm-eabi.tar.xz" fi makeinstall_host() { mkdir -p $TOOLCHAIN/lib/gcc-linaro-arm-eabi/ cp -a * $TOOLCHAIN/lib/gcc-linaro-arm-eabi } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/lang/gcc-riscv-none-embed/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="gcc-riscv-none-embed" PKG_VERSION="8.3.0-1.2" PKG_SHA256="079a88d7f7c18cfd735a9ed1f0eefa28ab28d3007b5f7591920ab25225c89248" PKG_LICENSE="MIT" PKG_SITE="https://github.com/xpack-dev-tools/riscv-none-embed-gcc-xpack" PKG_URL="https://github.com/xpack-dev-tools/riscv-none-embed-gcc-xpack/releases/download/v${PKG_VERSION}/xpack-riscv-none-embed-gcc-${PKG_VERSION}-linux-x64.tar.gz" PKG_DEPENDS_HOST="ccache:host" PKG_LONGDESC="RISC-V GCC" PKG_TOOLCHAIN="manual" unpack() { mkdir -p ${PKG_BUILD} mkdir -p ${TOOLCHAIN}/lib/${PKG_NAME} tar --strip-components=1 -xf ${SOURCES}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz -C ${TOOLCHAIN}/lib/${PKG_NAME} } makeinstall_host() { : # nothing, unpacked directly to toolchain } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/lang/gcc7-linaro-aarch64-elf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="gcc7-linaro-aarch64-elf" PKG_VERSION="7.5.0-2019.12" PKG_SHA256="73689fb3e71beeecebd6434d60efad4cb926153d48399e4d16fb45395d9c81a0" PKG_LICENSE="GPL" PKG_SITE="https://www.linaro.org/" PKG_URL="https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-elf/gcc-linaro-${PKG_VERSION}-x86_64_aarch64-elf.tar.xz" PKG_DEPENDS_HOST="ccache:host" PKG_LONGDESC="Linaro Aarch64 GNU Linux Binary Toolchain" PKG_TOOLCHAIN="manual" unpack() { mkdir -p ${PKG_BUILD} mkdir -p ${TOOLCHAIN}/lib/${PKG_NAME} tar --strip-components=1 -xf ${SOURCES}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.xz -C ${TOOLCHAIN}/lib/${PKG_NAME} } makeinstall_host() { : # nothing, unpacked directly to toolchain } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/lib32/lib32-glibc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) # 2024-present Diegrosan (https://github.com/Diegrosan) PKG_NAME="lib32-glibc" PKG_VERSION="$(get_pkg_version glibc)" PKG_NEED_UNPACK="$(get_pkg_directory glibc)" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="https://www.gnu.org/software/libc/" PKG_URL="" PKG_DEPENDS_TARGET="ccache:host autotools:host lib32-linux-headers lib32-gcc:bootstrap pigz:host glibc Python3:host" # Make sure both 64 and 32 are built PKG_LONGDESC="The Glibc package contains the main C library, for multilib ARM." GLIBC_DIRECTORY="$(get_pkg_directory glibc)" PKG_NEED_UNPACK+=" ${GLIBC_DIRECTORY}" PKG_PATCH_DIRS+=" ${GLIBC_DIRECTORY}/patches ${GLIBC_DIRECTORY}/patches/arm" PKG_BUILD_FLAGS="-gold lib32" case "${LINUX}" in amlogic-4.9|rk356x-4.19|OdroidM1-4.19) OPT_ENABLE_KERNEL=4.9.0 ;; gameforce-4.4|rockchip-4.4|odroid-go-a-4.4) OPT_ENABLE_KERNEL=4.4.0 ;; amlogic-5.4) OPT_ENABLE_KERNEL=5.4.0 ;; amlogic-5.15) OPT_ENABLE_KERNEL=5.15.0 ;; amlogic-3.14) OPT_ENABLE_KERNEL=3.0.0 ;; *) OPT_ENABLE_KERNEL=5.10.0 ;; esac PKG_CONFIGURE_OPTS_TARGET="BASH_SHELL=/bin/sh \ ac_cv_path_PERL=no \ ac_cv_prog_MAKEINFO= \ --libexecdir=/usr/lib/glibc \ --cache-file=config.cache \ --disable-profile \ --disable-sanity-checks \ --enable-add-ons \ --enable-bind-now \ --with-elf \ --with-tls \ --with-__thread \ --with-binutils=${BUILD}/toolchain/bin \ --with-headers=${LIB32_SYSROOT_PREFIX}/usr/include \ --enable-kernel=${OPT_ENABLE_KERNEL} \ --without-cvs \ --without-gd \ --disable-build-nscd \ --disable-nscd \ --disable-timezone-tools \ --disable-statx" if build_with_debug; then PKG_CONFIGURE_OPTS_TARGET+=" --enable-debug" else PKG_CONFIGURE_OPTS_TARGET+=" --disable-debug" fi unpack() { ${SCRIPTS}/get glibc mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/glibc/glibc-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_unpack() { find "${PKG_BUILD}" -type f -name '*.py' -exec sed -e '1s,^#![[:space:]]*/usr/bin/python.*,#!/usr/bin/env python3,' -i {} \; } pre_configure_target() { # Filter out some problematic *FLAGS export CFLAGS=$(echo ${CFLAGS} | sed -e "s|-ffast-math||g") export CFLAGS=$(echo ${CFLAGS} | sed -e "s|-Ofast|-O2|g") export CFLAGS=$(echo ${CFLAGS} | sed -e "s|-O.|-O2|g") # Removing all Werror flags export CFLAGS=$(echo ${CFLAGS} | sed -e "s|-Werror=[^ ]*||g") export CFLAGS=$(echo ${CFLAGS} | sed -e "s|-Werror||g") # Adding -Wno-error to all warnings export CFLAGS="${CFLAGS} -Wno-error -Wno-error=return-type -Wno-error=undef" export CFLAGS=$(echo ${CFLAGS} | sed -e "s|-Wunused-but-set-variable||g") export CFLAGS="${CFLAGS} -Wno-unused-variable" if [ -n "${PROJECT_CFLAGS}" ]; then export CFLAGS=$(echo ${CFLAGS} | sed -e "s|${PROJECT_CFLAGS}||g") fi export LDFLAGS=$(echo ${LDFLAGS} | sed -e "s|-ffast-math||g") export LDFLAGS=$(echo ${LDFLAGS} | sed -e "s|-Ofast|-O2|g") export LDFLAGS=$(echo ${LDFLAGS} | sed -e "s|-O.|-O2|g") export LDFLAGS=$(echo ${LDFLAGS} | sed -e "s|-Werror=[^ ]*||g") export LDFLAGS=$(echo ${LDFLAGS} | sed -e "s|-Werror||g") export LDFLAGS=$(echo ${LDFLAGS} | sed -e "s|-Wl,--as-needed||") unset LD_LIBRARY_PATH # set some CFLAGS we need export CFLAGS="${CFLAGS} -g -fno-stack-protector" export BUILD_CC=${HOST_CC} export OBJDUMP_FOR_HOST=objdump # disable warnings like errors export ac_cv_prog_cc_g=no export ac_cv_prog_cc_werror=no export libc_cv_warnings_as_errors=no cat >config.cache <<EOF libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes libc_cv_ssp=no libc_cv_ssp_strong=no libc_cv_slibdir=/usr/lib libc_cv_warnings_as_errors=no EOF cat >configparms <<EOF libdir=/usr/lib slibdir=/usr/lib sbindir=/usr/bin rootsbindir=/usr/bin build-programs=no enable-werror=no EOF } post_makeinstall_target() { safe_remove ${INSTALL}/etc safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include safe_remove ${INSTALL}/usr/lib/audit safe_remove ${INSTALL}/usr/lib/*.o safe_remove ${INSTALL}/usr/share safe_remove ${INSTALL}/var mkdir -p "${INSTALL}/etc/ld.so.conf.d" echo "/usr/lib32" > "${INSTALL}/etc/ld.so.conf.d/lib32-glibc.conf" # printf "/emuelec/lib32\n/emuelec/lib\n" > "${INSTALL}/etc/ld.so.conf.d/emuelec.conf" mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/lib32/lib32-libdrm/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-2022 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-libdrm" PKG_VERSION="$(get_pkg_version libdrm)" PKG_NEED_UNPACK="$(get_pkg_directory libdrm)" PKG_ARCH="aarch64" PKG_LICENSE="GPL" PKG_SITE="http://dri.freedesktop.org" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain lib32-libpciaccess" PKG_PATCH_DIRS+=" $(get_pkg_directory libdrm)/patches" PKG_LONGDESC="The userspace interface library to kernel DRM services." PKG_TOOLCHAIN="meson" PKG_BUILD_FLAGS="lib32" get_graphicdrivers PKG_MESON_OPTS_TARGET="-Dnouveau=disabled \ -Domap=disabled \ -Dexynos=disabled \ -Dtegra=disabled \ -Dcairo-tests=disabled \ -Dman-pages=disabled \ -Dvalgrind=disabled \ -Dfreedreno-kgsl=false \ -Dinstall-test-programs=true \ -Dudev=false" unpack() { ${SCRIPTS}/get libdrm mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf ${SOURCES}/libdrm/libdrm-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } post_makeinstall_target() { # We don't need any binary, since we only want lib32 safe_remove ${INSTALL}/usr/bin safe_remove ${INSTALL}/usr/include safe_remove ${INSTALL}/usr/share mv ${INSTALL}/usr/lib ${INSTALL}/usr/lib32 } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/lib32/lib32-opengl-meson/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) # Copyright (C) 2022-present 7Ji (https://github.com/7Ji) PKG_NAME="lib32-opengl-meson" PKG_VERSION="$(get_pkg_version opengl-meson)" PKG_NEED_UNPACK="$(get_pkg_directory opengl-meson)" PKG_ARCH="aarch64" PKG_LICENSE="nonfree" PKG_SITE="http://openlinux.amlogic.com:8000/download/ARM/filesystem/" PKG_URL="" PKG_DEPENDS_TARGET="lib32-toolchain opengl-meson lib32-libdrm" PKG_LONGDESC="OpenGL ES pre-compiled libraries for Mali GPUs found in Amlogic Meson SoCs." PKG_PATCH_DIRS+=" $(get_pkg_directory opengl-meson)/patches" PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="lib32" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib32 mkdir -p ${SYSROOT_PREFIX}/usr/lib local DIR_MESON="$(get_build_dir opengl-meson)" local DIR_ARM=${DIR_MESON}/lib/eabihf local DIR_ARM_local=${PKG_DIR}/src/eabihf local SINGLE_LIBMALI='no' cp -p ${DIR_ARM_local}/gondul/r12p0/fbdev/libMali.so ${INSTALL}/usr/lib32/libMali.gondul.g12b.so cp -p ${DIR_ARM_local}/dvalin/r12p0/fbdev/libMali.so ${INSTALL}/usr/lib32/libMali.dvalin.g12a.so cp -p ${DIR_ARM}/gondul/r37p0/fbdev/libMali_r1p0.so ${INSTALL}/usr/lib32/libMali.gondul.so cp -p ${DIR_ARM}/dvalin/r37p0/fbdev/libMali.so ${INSTALL}/usr/lib32/libMali.dvalin.so cp -p ${DIR_ARM}/valhall/r41p0/fbdev/libMali.so ${INSTALL}/usr/lib32/libMali.valhall.so cp -p ${DIR_ARM}/gondul/r37p0/fbdev/libMali_r1p0.so ${SYSROOT_PREFIX}/usr/lib/libMali.so if [[ "${SINGLE_LIBMALI}" == 'no' ]]; then ln -sf /var/lib32/libMali.so ${INSTALL}/usr/lib32/libMali.so fi local LINK_LIST="libmali.so \ libmali.so.0 \ libEGL.so \ libEGL.so.1 \ libEGL.so.1.0.0 \ libGLES_CM.so.1 \ libGLESv1_CM.so \ libGLESv1_CM.so.1 \ libGLESv1_CM.so.1.0.1 \ libGLESv1_CM.so.1.1 \ libGLESv2.so \ libGLESv2.so.2 \ libGLESv2.so.2.0 \ libGLESv2.so.2.0.0 \ libGLESv3.so \ libGLESv3.so.3 \ libGLESv3.so.3.0 \ libGLESv3.so.3.0.0" local LINK_NAME for LINK_NAME in ${LINK_LIST}; do ln -sf libMali.so ${INSTALL}/usr/lib32/${LINK_NAME} ln -sf libMali.so ${SYSROOT_PREFIX}/usr/lib/${LINK_NAME} done # install headers and libraries to TOOLCHAIN cp -rf ${DIR_MESON}/include/* ${SYSROOT_PREFIX}/usr/include cp -rf "$(get_build_dir opengl-meson)/lib/pkgconfig/"* ${SYSROOT_PREFIX}/usr/lib/pkgconfig cp ${SYSROOT_PREFIX}/usr/include/EGL_platform/platform_fbdev/* ${SYSROOT_PREFIX}/usr/include/EGL rm -rf ${SYSROOT_PREFIX}/usr/include/EGL_platform } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Copyright (C) 2024-present Team CoreELEC (https://coreelec.org) PKG_NAME="linux" PKG_VERSION="e67465e6f777ebfaee29e3150770f12cbd677819" PKG_SHA256="297e9384f4f8d010f6437d8fc62e023092984180ff11afb9a27fc38bb5804c63" PKG_LICENSE="GPL" PKG_SITE="http://www.kernel.org" PKG_URL="https://github.com/CoreELEC/linux-amlogic/archive/${PKG_VERSION}.tar.gz" PKG_GIT_BRANCH="5.15.153_202501" PKG_BUILD_PERF="no" PKG_DEPENDS_HOST="ccache:host rsync:host openssl:host" PKG_DEPENDS_TARGET="toolchain linux:host kmod:host xz:host keyutils aml-dtbtools:host aml-dtbtools ${KERNEL_EXTRA_DEPENDS_TARGET}" PKG_NEED_UNPACK="${LINUX_DEPENDS} $(get_pkg_directory initramfs) $(get_pkg_variable initramfs PKG_NEED_UNPACK)" PKG_DEPENDS_UNPACK="bl30 common_drivers" 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_PATCH_DIRS="${LINUX}" PKG_KERNEL_CFG_FILE=$(kernel_config_path) || die if [ "${KERNEL_COMPILER}" = "clang" ]; then PKG_DEPENDS_TARGET+=" clang:host" fi if [ -n "${KERNEL_TOOLCHAIN}" ]; then PKG_DEPENDS_HOST="${PKG_DEPENDS_HOST} gcc-${KERNEL_TOOLCHAIN}:host" PKG_DEPENDS_TARGET="${PKG_DEPENDS_TARGET} gcc-${KERNEL_TOOLCHAIN}:host" HEADERS_ARCH=${TARGET_ARCH} fi if [ "${PKG_BUILD_PERF}" != "no" ] && grep -q ^CONFIG_PERF_EVENTS= ${PKG_KERNEL_CFG_FILE} ; then PKG_BUILD_PERF="yes" PKG_DEPENDS_TARGET="${PKG_DEPENDS_TARGET} binutils elfutils libunwind zlib openssl" fi if [ "${TARGET_ARCH}" = "x86_64" ]; then PKG_DEPENDS_TARGET="${PKG_DEPENDS_TARGET} elfutils:host" PKG_DEPENDS_UNPACK+=" intel-ucode kernel-firmware" fi if [[ "${KERNEL_TARGET}" = uImage* ]]; then PKG_DEPENDS_TARGET="${PKG_DEPENDS_TARGET} u-boot-tools:host" fi if [ "${BUILD_ANDROID_BOOTIMG}" = "yes" ]; then PKG_DEPENDS_TARGET="${PKG_DEPENDS_TARGET} mkbootimg:host" fi # Ensure that the dependencies of initramfs:target are built correctly, but # we don't want to add initramfs:target as a direct dependency as we install # this "manually" from within linux:target for pkg in $(get_pkg_variable initramfs PKG_DEPENDS_TARGET); do ! listcontains "${PKG_DEPENDS_TARGET}" "${pkg}" && PKG_DEPENDS_TARGET+=" ${pkg}" || true done post_unpack() { mkdir -p ${PKG_BUILD}/.git/hooks mkdir -p ${PKG_BUILD}/common_drivers/.git/hooks cp -r $(get_build_dir common_drivers)/* ${PKG_BUILD}/common_drivers # make modules folder with version number only touch ${PKG_BUILD}/.scmversion # show correct common_drivers build info in dmesg echo "$(get_pkg_variable common_drivers PKG_VERSION)" >${PKG_BUILD}/common_drivers/.scmversion } post_patch() { # linux was already built and its build dir autoremoved - prepare it again for kernel packages if [ -d ${PKG_INSTALL}/.image ]; then cp -p ${PKG_INSTALL}/.image/.config ${PKG_BUILD} kernel_make -C ${PKG_BUILD} prepare # restore the required Module.symvers from an earlier build cp -p ${PKG_INSTALL}/.image/Module.symvers ${PKG_BUILD} else cp ${PKG_KERNEL_CFG_FILE} ${PKG_BUILD}/.config sed -i -e "s|@INITRAMFS_SOURCE@|$(kernel_initramfs_confs) ${BUILD}/initramfs|" ${PKG_BUILD}/.config # set default hostname based on ${DISTRONAME} sed -i -e "s|@DISTRONAME@|${DISTRONAME}|g" ${PKG_BUILD}/.config # disable swap support if not enabled if [ ! "${SWAP_SUPPORT}" = yes ]; then sed -i -e "s|^CONFIG_SWAP=.*$|# CONFIG_SWAP is not set|" ${PKG_BUILD}/.config fi # disable nfs support if not enabled if [ ! "${NFS_SUPPORT}" = yes ]; then sed -i -e "s|^CONFIG_NFS_FS=.*$|# CONFIG_NFS_FS is not set|" ${PKG_BUILD}/.config fi # disable cifs support if not enabled if [ ! "${SAMBA_SUPPORT}" = yes ]; then sed -i -e "s|^CONFIG_CIFS=.*$|# CONFIG_CIFS is not set|" ${PKG_BUILD}/.config fi # disable iscsi support if not enabled if [ ! "${ISCSI_SUPPORT}" = yes ]; then sed -i -e "s|^CONFIG_SCSI_ISCSI_ATTRS=.*$|# CONFIG_SCSI_ISCSI_ATTRS is not set|" ${PKG_BUILD}/.config sed -i -e "s|^CONFIG_ISCSI_TCP=.*$|# CONFIG_ISCSI_TCP is not set|" ${PKG_BUILD}/.config sed -i -e "s|^CONFIG_ISCSI_BOOT_SYSFS=.*$|# CONFIG_ISCSI_BOOT_SYSFS is not set|" ${PKG_BUILD}/.config sed -i -e "s|^CONFIG_ISCSI_IBFT_FIND=.*$|# CONFIG_ISCSI_IBFT_FIND is not set|" ${PKG_BUILD}/.config sed -i -e "s|^CONFIG_ISCSI_IBFT=.*$|# CONFIG_ISCSI_IBFT is not set|" ${PKG_BUILD}/.config fi # disable lima/panfrost if libmali is configured if [ "${OPENGLES}" = "libmali" ]; then sed -e "s|^CONFIG_DRM_LIMA=.*$|# CONFIG_DRM_LIMA is not set|" -i ${PKG_BUILD}/.config sed -e "s|^CONFIG_DRM_PANFROST=.*$|# CONFIG_DRM_PANFROST is not set|" -i ${PKG_BUILD}/.config fi # disable wireguard support if not enabled if [ ! "${WIREGUARD_SUPPORT}" = yes ]; then sed -e "s|^CONFIG_WIREGUARD=.*$|# CONFIG_WIREGUARD is not set|" -i ${PKG_BUILD}/.config fi # 5.4.125 kernel compile errors sed -e 's|^KBUILD_CFLAGS += $(call cc-option,-Wimplicit-fallthrough,).*||' \ -e 's|^KBUILD_CFLAGS := \(.*\)|KBUILD_CFLAGS := -Wno-format -Wno-unused-function -Wno-misleading-indentation \1|' \ -e 's|^KBUILD_LDFLAGS :=|KBUILD_LDFLAGS := $(call ld-option,--no-warn-rwx-segments)|' \ -i ${PKG_BUILD}/Makefile sed -i 's|-z norelro||' ${PKG_BUILD}/arch/arm64/Makefile fi } make_host() { : } makeinstall_host() { make \ ARCH=${HEADERS_ARCH:-${TARGET_KERNEL_ARCH}} \ HOSTCC="${TOOLCHAIN}/bin/host-gcc" \ HOSTCXX="${TOOLCHAIN}/bin/host-g++" \ HOSTCFLAGS="${HOST_CFLAGS}" \ HOSTCXXFLAGS="${HOST_CXXFLAGS}" \ HOSTLDFLAGS="${HOST_LDFLAGS}" \ INSTALL_HDR_PATH=dest \ headers_install mkdir -p ${SYSROOT_PREFIX}/usr/include cp -R dest/include/* ${SYSROOT_PREFIX}/usr/include } build_gpio_data() { cat << EOF > common_drivers/drivers/bootloader/gpio_data.h typedef struct bl30_gpio { char name[16]; uint32_t number; } bl30_gpio_t; typedef struct bl30_gpios_soc { enum meson_cpuid_type_e cpuid; bl30_gpio_t gpio[256]; } bl30_gpios_soc_t; bl30_gpios_soc_t bl30_gpios[3] = { EOF for soc_dir in $(get_build_dir bl30)/demos/amlogic/n200/include/*; do if [ -d ${soc_dir} -a -e "${soc_dir}/gpio-data.h" ]; then soc_type="$(basename ${soc_dir})" printf "#ifdef MESON_CPU_MAJOR_ID_${soc_type^^}\n" >>common_drivers/drivers/bootloader/gpio_data.h printf " /* soc ${soc_type} */\n" >>common_drivers/drivers/bootloader/gpio_data.h printf " { MESON_CPU_MAJOR_ID_${soc_type^^},\n {\n" >>common_drivers/drivers/bootloader/gpio_data.h cat "${soc_dir}/gpio-data.h" | awk \ '/^#define\s*GPIO._/ { printf(" { \"%s\", %d },\n", $2, $3)}' \ >>common_drivers/drivers/bootloader/gpio_data.h printf " }\n },\n" >>common_drivers/drivers/bootloader/gpio_data.h printf "#endif\n" >>common_drivers/drivers/bootloader/gpio_data.h fi done printf "};\n" >>common_drivers/drivers/bootloader/gpio_data.h } pre_make_target() { pkg_lock_status "ACTIVE" "linux:target" "build" build_gpio_data if [ "${TARGET_ARCH}" = "x86_64" ]; then # copy some extra firmware to linux tree mkdir -p ${PKG_BUILD}/external-firmware cp -a $(get_build_dir kernel-firmware)/.copied-firmware/{amdgpu,amd-ucode,i915,radeon,e100,rtl_nic} ${PKG_BUILD}/external-firmware cp -a $(get_build_dir intel-ucode)/intel-ucode ${PKG_BUILD}/external-firmware FW_LIST="$(find ${PKG_BUILD}/external-firmware \( -type f -o -type l \) \( -iname '*.bin' -o -iname '*.fw' -o -path '*/intel-ucode/*' \) | sed 's|.*external-firmware/||' | sort | xargs)" sed -i "s|CONFIG_EXTRA_FIRMWARE=.*|CONFIG_EXTRA_FIRMWARE=\"${FW_LIST}\"|" ${PKG_BUILD}/.config fi kernel_make oldconfig } make_target() { # 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 if [ -z "${KERNEL_UIMAGE_LOADADDR}" -o -z "${KERNEL_UIMAGE_ENTRYADDR}" ]; then die "ERROR: KERNEL_UIMAGE_LOADADDR and KERNEL_UIMAGE_ENTRYADDR have to be set to build uImage - aborting" fi KERNEL_UIMAGE_TARGET="${KERNEL_TARGET}" KERNEL_TARGET="${KERNEL_TARGET/uImage/Image}" fi rm -rf ${BUILD}/initramfs rm -f ${STAMPS_INSTALL}/initramfs/install_target ${STAMPS_INSTALL}/*/install_init if [ -n "${INITRAMFS_MODULES}" ]; then # build and install modules because some of them are needed in initramfs kernel_make modules kernel_make INSTALL_MOD_PATH=${INSTALL}/$(get_kernel_overlay_dir) modules_install rm -f ${INSTALL}/$(get_kernel_overlay_dir)/lib/modules/*/build rm -f ${INSTALL}/$(get_kernel_overlay_dir)/lib/modules/*/source mkdir -p ${BUILD}/initramfs/etc mkdir -p ${BUILD}/initramfs/usr/lib/modules for i in ${INITRAMFS_MODULES}; do module=$(find ${INSTALL}/$(get_full_module_dir)/kernel -name ${i}.ko) if [ -n "${module}" ]; then echo ${i} >> ${BUILD}/initramfs/etc/modules cp ${module} ${BUILD}/initramfs/usr/lib/modules fi done fi # create initramfs.cpio needed by Android boot image ( cd ${ROOT} ${SCRIPTS}/install initramfs ) # clean out dtb's DTB_PATH="common_drivers/arch/${TARGET_KERNEL_ARCH}/boot/dts/amlogic" rm -f ${DTB_PATH}/*.dtb # the modules target is required to get a proper Module.symvers # file with symbols from built-in and external modules. # Without that it'll contain only the symbols from the kernel kernel_make ${KERNEL_TARGET} ${KERNEL_MAKE_EXTRACMD} modules if [ -z "${INITRAMFS_MODULES}" ]; then # need to install modules here kernel_make INSTALL_MOD_PATH=${INSTALL}/$(get_kernel_overlay_dir) modules_install rm -f ${INSTALL}/$(get_kernel_overlay_dir)/lib/modules/*/build rm -f ${INSTALL}/$(get_kernel_overlay_dir)/lib/modules/*/source fi # collect all device tree in 'coreelec' subfolders cp ${DTB_PATH}/coreelec-*/*.dtb ${DTB_PATH} 2>/dev/null || : # combine Amlogic multidtb by dtb.conf find_file_path bootloader/dtb.conf MULTIDTB_CONF="${FOUND_PATH}" if [ -f ${MULTIDTB_CONF} ]; then multidtb_cnt=$(xmlstarlet sel -t -c "count(//dtb/multidtb)" ${MULTIDTB_CONF}) cnt_m=1 while [ ${cnt_m} -le ${multidtb_cnt} ]; do multidtb=$(xmlstarlet sel -t -v "//dtb/multidtb[${cnt_m}]/@name" ${MULTIDTB_CONF}) echo echo "Making multidtb ${multidtb}" rm -fr "${DTB_PATH}/dtbtool_input" mkdir ${DTB_PATH}/dtbtool_input files_cnt=$(xmlstarlet sel -t -c "count(//dtb/multidtb[${cnt_m}]/file)" ${MULTIDTB_CONF}) cnt_f=1 while [ ${cnt_f} -le ${files_cnt} ]; do file=$(xmlstarlet sel -t -v "//dtb/multidtb[${cnt_m}]/file[${cnt_f}]" ${MULTIDTB_CONF}) cnt_f=$((cnt_f+1)) mv ${DTB_PATH}/${file} ${DTB_PATH}/dtbtool_input done dtbTool -c -o ${DTB_PATH}/${multidtb} ${DTB_PATH}/dtbtool_input rm -fr "${DTB_PATH}/dtbtool_input" cnt_m=$((cnt_m+1)) done mkdir -p ${INSTALL}/usr/share/bootloader install -m 0644 ${MULTIDTB_CONF} ${INSTALL}/usr/share/bootloader fi if [ "${BUILD_ANDROID_BOOTIMG}" = "yes" ]; then find_file_path bootloader/mkbootimg && source ${FOUND_PATH} mv -f arch/${TARGET_KERNEL_ARCH}/boot/boot.img arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET} fi if [ "${PKG_BUILD_PERF}" = "yes" ] ; then ( cd tools/perf # arch specific perf build args case "${TARGET_ARCH}" in x86_64) PERF_BUILD_ARGS="ARCH=x86" ;; aarch64) PERF_BUILD_ARGS="ARCH=arm64" ;; *) PERF_BUILD_ARGS="ARCH=${TARGET_ARCH}" ;; esac WERROR=0 \ NO_LIBPERL=1 \ NO_LIBPYTHON=1 \ NO_SLANG=1 \ NO_GTK2=1 \ NO_LIBNUMA=1 \ NO_LIBAUDIT=1 \ NO_LZMA=1 \ NO_SDT=1 \ CROSS_COMPILE="${TARGET_PREFIX}" \ JOBS="${CONCURRENCY_MAKE_LEVEL}" \ make ${PERF_BUILD_ARGS} mkdir -p ${INSTALL}/usr/bin cp perf ${INSTALL}/usr/bin ) fi if [ -n "${KERNEL_UIMAGE_TARGET}" ] ; then # determine compression used for kernel image KERNEL_UIMAGE_COMP=${KERNEL_UIMAGE_TARGET:7} KERNEL_UIMAGE_COMP=$(echo ${KERNEL_UIMAGE_COMP:-none} | sed 's/gz/gzip/; s/bz2/bzip2/') # calculate new load address to make kernel Image unpack to memory area after compressed image if [ "${KERNEL_UIMAGE_COMP}" != "none" ] ; then COMPRESSED_SIZE=$(stat -t "arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET}" | awk '{print $2}') # align to 1 MiB COMPRESSED_SIZE=$(( ((${COMPRESSED_SIZE} - 1 >> 20) + 1) << 20 )) PKG_KERNEL_UIMAGE_LOADADDR=$(printf '%X' "$(( ${KERNEL_UIMAGE_LOADADDR} + ${COMPRESSED_SIZE} ))") PKG_KERNEL_UIMAGE_ENTRYADDR=$(printf '%X' "$(( ${KERNEL_UIMAGE_ENTRYADDR} + ${COMPRESSED_SIZE} ))") else PKG_KERNEL_UIMAGE_LOADADDR=${KERNEL_UIMAGE_LOADADDR} PKG_KERNEL_UIMAGE_ENTRYADDR=${KERNEL_UIMAGE_ENTRYADDR} fi mkimage -A ${TARGET_KERNEL_ARCH} \ -O linux \ -T kernel \ -C ${KERNEL_UIMAGE_COMP} \ -a ${PKG_KERNEL_UIMAGE_LOADADDR} \ -e ${PKG_KERNEL_UIMAGE_ENTRYADDR} \ -d arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET} \ arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_UIMAGE_TARGET} KERNEL_TARGET="${KERNEL_UIMAGE_TARGET}" fi } makeinstall_target() { mkdir -p ${INSTALL}/.image cp -p arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET} System.map .config Module.symvers ${INSTALL}/.image/ if [ "${BOOTLOADER}" = "u-boot" ]; then mkdir -p ${INSTALL}/usr/share/bootloader/device_trees if [ -d common_drivers/arch/${TARGET_KERNEL_ARCH}/boot/dts/amlogic ]; then cp common_drivers/arch/${TARGET_KERNEL_ARCH}/boot/*dtb.img ${INSTALL}/usr/share/bootloader/ 2>/dev/null || : cp common_drivers/arch/${TARGET_KERNEL_ARCH}/boot/dts/amlogic/*.dtb ${INSTALL}/usr/share/bootloader/device_trees 2>/dev/null || : fi elif [ "${BOOTLOADER}" = "bcm2835-bootloader" ]; then mkdir -p ${INSTALL}/usr/share/bootloader/overlays # install platform dtbs, but remove upstream kernel dtbs (i.e. without downstream # drivers and decent USB support) as these are not required by LibreELEC cp -p common_drivers/arch/${TARGET_KERNEL_ARCH}/boot/dts/*.dtb ${INSTALL}/usr/share/bootloader rm -f ${INSTALL}/usr/share/bootloader/bcm283*.dtb # install overlay dtbs for dtb in common_drivers/arch/${TARGET_KERNEL_ARCH}/boot/dts/overlays/*.dtb \ common_drivers/arch/${TARGET_KERNEL_ARCH}/boot/dts/overlays/*.dtbo; do cp ${dtb} ${INSTALL}/usr/share/bootloader/overlays 2>/dev/null || : done cp -p common_drivers/arch/${TARGET_KERNEL_ARCH}/boot/dts/overlays/README ${INSTALL}/usr/share/bootloader/overlays fi } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux/patches/linux-004_lower_undefined_mode_timeout.patch ================================================ diff -Naur linux-2.6.23-rc9.orig/arch/i386/boot/tty.c linux-2.6.23-rc9/arch/i386/boot/tty.c --- linux-2.6.23-rc9.orig/arch/x86/boot/tty.c 2007-10-06 12:26:14.000000000 +0200 +++ linux-2.6.23-rc9/arch/x86/boot/tty.c 2007-10-06 12:37:47.000000000 +0200 @@ -92,7 +92,7 @@ int getchar_timeout(void) { - int cnt = 30; + int cnt = 3; int t0, t1; t0 = gettime(); diff -Naur linux-2.6.23-rc9.orig/arch/i386/boot/video.c linux-2.6.23-rc9/arch/i386/boot/video.c --- linux-2.6.23-rc9.orig/arch/x86/boot/video.c 2007-10-06 12:26:14.000000000 +0200 +++ linux-2.6.23-rc9/arch/x86/boot/video.c 2007-10-06 12:36:05.000000000 +0200 @@ -329,7 +329,7 @@ unsigned int sel; puts("Press <ENTER> to see video modes available, " - "<SPACE> to continue, or wait 30 sec\n"); + "<SPACE> to continue, or wait 3 sec\n"); kbd_flush(); while (1) { ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux/patches/linux-007_die_floppy_die.patch ================================================ From 4ff58b642f80dedb20533978123d89b5ac9b1ed5 Mon Sep 17 00:00:00 2001 From: Kyle McMartin <kyle@phobos.i.jkkm.org> Date: Tue, 30 Mar 2010 00:04:29 -0400 Subject: die-floppy-die Kill the floppy.ko pnp modalias. We were surviving just fine without autoloading floppy drivers, tyvm. Please feel free to register all complaints in the wastepaper bin. --- drivers/block/floppy.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 90c4038..f4a0b90 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -4619,8 +4619,7 @@ static const struct pnp_device_id floppy_pnpids[] = { {"PNP0700", 0}, {} }; - -MODULE_DEVICE_TABLE(pnp, floppy_pnpids); +/* MODULE_DEVICE_TABLE(pnp, floppy_pnpids); */ #else -- 1.7.0.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux/patches/linux-009_disable_i8042_check_on_apple_mac.patch ================================================ From 2a79554c864ac58fa2ad982f0fcee2cc2aa33eb5 Mon Sep 17 00:00:00 2001 From: Bastien Nocera <hadess@hadess.net> Date: Thu, 20 May 2010 10:30:31 -0400 Subject: Disable i8042 checks on Intel Apple Macs As those computers never had any i8042 controllers, and the current lookup code could potentially lock up/hang/wait for timeout for long periods of time. Fixes intermittent hangs on boot on a MacbookAir1,1 Signed-off-by: Bastien Nocera <hadess@hadess.net> --- drivers/input/serio/i8042.c | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-) diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index 6440a8f..4d7cf98 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c @@ -1451,6 +1451,22 @@ static struct platform_driver i8042_driver = { .shutdown = i8042_shutdown, }; +#ifdef CONFIG_DMI +static struct dmi_system_id __initdata dmi_system_table[] = { + { + .matches = { + DMI_MATCH(DMI_BIOS_VENDOR, "Apple Computer, Inc.") + }, + }, + { + .matches = { + DMI_MATCH(DMI_BIOS_VENDOR, "Apple Inc.") + }, + }, + {} +}; +#endif /*CONFIG_DMI*/ + static int __init i8042_init(void) { struct platform_device *pdev; @@ -1458,6 +1474,12 @@ static int __init i8042_init(void) dbg_init(); +#ifdef CONFIG_DMI + /* Intel Apple Macs never have an i8042 controller */ + if (dmi_check_system(dmi_system_table) > 0) + return -ENODEV; +#endif /*CONFIG_DMI*/ + err = i8042_platform_init(); if (err) return err; -- 1.7.0.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux/sysctl.d/network.conf ================================================ net.ipv4.tcp_no_metrics_save=1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux/sysctl.d/qdisc.conf ================================================ net.core.default_qdisc = fq_codel ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux/udev.d/30-disable-wakeup.rules ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) ACTION!="add|change", GOTO="end" DRIVER=="ehci-pci|xhci_hcd", RUN+="/usr/bin/sh -c 'echo disabled > /sys/${devpath}/power/wakeup'" LABEL="end" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux/udev.d/40-modeswitch.rules ================================================ ../../../../../packages/linux/udev.d/40-modeswitch.rules ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-driver-addons/dvb/AVL6862/changelog.txt ================================================ 100 - Initial add-on ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-driver-addons/dvb/AVL6862/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present Team CoreELEC (https://coreelec.org) PKG_NAME="AVL6862" PKG_VERSION="a0c5005e05f62dee62e38ba5c30e34852eef5523" PKG_SHA256="5a21bd73117c01c3dc5e914630242fe6c5f77c005bcef29f7bdf64b34b806e27" PKG_REV="1" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC" PKG_URL="https://github.com/CoreELEC/media_tree_aml/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain media_modules-aml" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="AVL6862 driver for Amlogic DVB Frontend" PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_IS_KERNEL_PKG="yes" PKG_ADDON_IS_STANDALONE="yes" PKG_ADDON_NAME="AVL6862 driver for Amlogic DVB Frontend" PKG_ADDON_TYPE="xbmc.service" PKG_ADDON_VERSION="${ADDON_VERSION}.${PKG_REV}" make_target() { kernel_make -C $(kernel_path) M=${PKG_BUILD} \ CONFIG_MESON_DVB=m \ KCFLAGS=-Wno-implicit-fallthrough \ KBUILD_EXTRA_SYMBOLS=$(get_build_dir media_modules-aml)/drivers/Module.symvers } makeinstall_target() { install_driver_addon_files "${PKG_BUILD}" } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-driver-addons/dvb/AVL6862/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2024-present Team CoreELEC (https://coreelec.org) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-driver-addons/dvb/AVL6862/source/system.d/amlogic-dvb.service ================================================ [Unit] Description=Amlogic DVB module loader ConditionPathExists=/proc/device-tree/dvb/ After=kernel-overlays.service [Service] Type=oneshot ExecStart=-/bin/sh -c "[ ! -f '/proc/device-tree/dvb/status' -a $(tr -d '\\0' < /proc/device-tree/dvb/compatible) = "amlogic,dvb" ] && /sbin/modprobe aml_fe" ExecStart=-/bin/sh -c "[ -f '/proc/device-tree/dvb/status' -a $(tr -d '\\0' < /proc/device-tree/dvb/status) = "okay" ] && /sbin/modprobe aml_fe" [Install] WantedBy=basic.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/RTL8851BU/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present Team CoreELEC (https://coreelec.org) PKG_NAME="RTL8851BU" PKG_VERSION="f94ea820634d3bd050009e861952d3b8eeef869a" PKG_SHA256="43393114cc428e0b9b64eb87e88037a926daed1e6f6af92f7ad945138b9f4d5a" PKG_LICENSE="GPL" PKG_SITE="https://github.com/neatojones/RTL8851bu" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="Realtek RTL8851BU Linux driver" PKG_IS_KERNEL_PKG="yes" pre_make_target() { unset LDFLAGS } make_target() { kernel_make \ ARCH=${TARGET_KERNEL_ARCH} \ KSRC=$(kernel_path) \ CROSS_COMPILE=${TARGET_KERNEL_PREFIX} \ CONFIG_RTW_DEBUG=n } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} cp *.ko ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/RTL8851BU/patches/RTL8851BU-0001-fix.patch ================================================ diff --git a/include/drv_conf.h b/include/drv_conf.h index 5ad652e..f1ae864 100755 --- a/include/drv_conf.h +++ b/include/drv_conf.h @@ -711,8 +711,4 @@ power down etc.) in last time, we can unmark this flag to avoid some unpredictab */ #define RTW_WKARD_TRIGGER_FRAME_PARSER -#if !defined(strlcpy) -#define strlcpy(a, b, c) strscpy(a, b, c) -#endif - #endif /* __DRV_CONF_H__ */ diff --git a/include/osdep_service_linux.h b/include/osdep_service_linux.h index b15cbc9..4d43be4 100755 --- a/include/osdep_service_linux.h +++ b/include/osdep_service_linux.h @@ -1082,11 +1082,6 @@ static inline void rtw_dump_stack(void) #endif #endif -#ifndef static_assert -#define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr) -#define __static_assert(expr, msg, ...) _Static_assert(expr, msg) -#endif - #ifdef CONFIG_PCI_HCI /* Extended Capabilities (PCI-X 2.0 and Express) */ #ifndef PCI_EXT_CAP_ID_L1SS diff --git a/os_dep/linux/os_ch_utils.c b/os_dep/linux/os_ch_utils.c index 5ec049f..a725e75 100644 --- a/os_dep/linux/os_ch_utils.c +++ b/os_dep/linux/os_ch_utils.c @@ -115,7 +115,6 @@ const enum nl80211_band _rtw_band_to_nl80211_band[] = { [BAND_ON_6G] = NUM_NL80211_BANDS, #endif }; -static_assert(ARRAY_SIZE(_rtw_band_to_nl80211_band) >= BAND_MAX); const enum band_type _nl80211_band_to_rtw_band[] = { [NL80211_BAND_2GHZ] = BAND_ON_24G, @@ -137,7 +136,6 @@ const enum band_type _nl80211_band_to_rtw_band[] = { [NL80211_BAND_LC] = BAND_MAX, /* light communication band (placeholder) */ #endif }; -static_assert(ARRAY_SIZE(_nl80211_band_to_rtw_band) >= NUM_NL80211_BANDS); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) const char *nl80211_chan_width_str(enum nl80211_chan_width cwidth) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/RTL8851BU/patches/RTL8851BU-0002-Fix-compiling-for-Amlogic-5.15.119.patch ================================================ From 0c438fad4d255bffece393c8fd9dc57ec7a52d79 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Mon, 25 Nov 2024 11:44:36 +0100 Subject: [PATCH] Fix compiling for Amlogic 5.15.119 --- os_dep/linux/ioctl_cfg80211.c | 24 ++++++++++++------------ os_dep/linux/wifi_regd.c | 6 +++--- os_dep/osdep_service_linux.c | 4 ++++ 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/os_dep/linux/ioctl_cfg80211.c b/os_dep/linux/ioctl_cfg80211.c index 4f124b1..b18e22c 100644 --- a/os_dep/linux/ioctl_cfg80211.c +++ b/os_dep/linux/ioctl_cfg80211.c @@ -235,7 +235,7 @@ u8 rtw_cfg80211_ch_switch_notify(_adapter *adapter, #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) struct cfg80211_chan_def chdef; - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)) || defined(CONFIG_MLD_KERNEL_PATCH) + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) || defined(CONFIG_MLD_KERNEL_PATCH) u16 punct_bitmap = 0; /*TBD*/ #endif @@ -268,7 +268,7 @@ u8 rtw_cfg80211_ch_switch_notify(_adapter *adapter, if (!rtw_cfg80211_allow_ch_switch_notify(adapter)) goto exit; - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 9, 0)) + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 9, 0)) cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, link_id, punct_bitmap); #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) /* ToDo CONFIG_RTW_MLD */ @@ -1030,7 +1030,7 @@ check_bss: #endif #if defined(CPTCFG_VERSION) || LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) - #if defined(CONFIG_MLD_KERNEL_PATCH) || LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + #if defined(CONFIG_MLD_KERNEL_PATCH) || LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119) /* ToDo CONFIG_RTW_MLD */ roam_info.links[0].bssid = cur_network->network.MacAddress; #else @@ -1812,7 +1812,7 @@ exit: } static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) || defined(CONFIG_MLD_KERNEL_PATCH) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) || defined(CONFIG_MLD_KERNEL_PATCH) , int link_id #endif , u8 key_index @@ -1979,7 +1979,7 @@ addkey_end: } static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) || defined(CONFIG_MLD_KERNEL_PATCH) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) || defined(CONFIG_MLD_KERNEL_PATCH) , int link_id #endif , u8 keyid @@ -2180,7 +2180,7 @@ exit: } static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) || defined(CONFIG_MLD_KERNEL_PATCH) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) || defined(CONFIG_MLD_KERNEL_PATCH) , int link_id #endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) @@ -2206,7 +2206,7 @@ static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev } static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, struct net_device *ndev -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) || defined(CONFIG_MLD_KERNEL_PATCH) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) || defined(CONFIG_MLD_KERNEL_PATCH) , int link_id #endif , u8 key_index @@ -2261,7 +2261,7 @@ static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, struct net_device * #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30)) int cfg80211_rtw_set_default_mgmt_key(struct wiphy *wiphy, struct net_device *ndev -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) || defined(CONFIG_MLD_KERNEL_PATCH) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) || defined(CONFIG_MLD_KERNEL_PATCH) , int link_id #endif , u8 key_index) @@ -5704,7 +5704,7 @@ static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *nd } static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || defined(CONFIG_MLD_KERNEL_PATCH) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) || defined(CONFIG_MLD_KERNEL_PATCH) , unsigned int link_id #endif ) @@ -6706,7 +6706,7 @@ static int cfg80211_rtw_set_monitor_channel(struct wiphy *wiphy #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) static int cfg80211_rtw_get_channel(struct wiphy *wiphy, struct wireless_dev *wdev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || defined(CONFIG_MLD_KERNEL_PATCH) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) || defined(CONFIG_MLD_KERNEL_PATCH) unsigned int link_id, #endif struct cfg80211_chan_def *chandef) @@ -8588,7 +8588,7 @@ void dump_mesh_config(void *sel, const struct mesh_config *conf) RTW_PRINT_SEL(sel, "path_refresh_time:%u\n", conf->path_refresh_time); RTW_PRINT_SEL(sel, "min_discovery_timeout:%u\n", conf->min_discovery_timeout); RTW_PRINT_SEL(sel, "dot11MeshHWMPactivePathTimeout:%u\n", conf->dot11MeshHWMPactivePathTimeout); - RTW_PRINT_SEL(sel, "dot11MeshHWMPpreqMinInterval:%u\n", conf->dot11MeshHWMPpreqMinInterval); + RTW_PRINT_SEL(sel, "dot11MeshHWMPpreqMinInterval:%u\n", conf->dot11MeshHWMPpreqMinInterval); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)) RTW_PRINT_SEL(sel, "dot11MeshHWMPperrMinInterval:%u\n", conf->dot11MeshHWMPperrMinInterval); #endif @@ -11313,7 +11313,7 @@ void rtw_wdev_unregister(struct wireless_dev *wdev) rtw_cfg80211_indicate_scan_done(adapter, _TRUE); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) || defined(COMPAT_KERNEL_RELEASE) - #if (defined(CONFIG_MLD_KERNEL_PATCH) || (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2))) + #if (defined(CONFIG_MLD_KERNEL_PATCH) || (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119))) /* ToDo CONFIG_RTW_MLD */ if (wdev->valid_links && wdev->links[0].client.current_bss) #else diff --git a/os_dep/linux/wifi_regd.c b/os_dep/linux/wifi_regd.c index 06458c8..a8cdbad 100644 --- a/os_dep/linux/wifi_regd.c +++ b/os_dep/linux/wifi_regd.c @@ -149,10 +149,10 @@ static void rtw_regd_schedule_dfs_chan_update(struct wiphy *wiphy) rtw_regd_set_du_chdef(wiphy); } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 9, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 9, 0)) /* ToDo CONFIG_RTW_MLD */ cfg80211_ch_switch_notify(wiphy_data->du_wdev->netdev, &wiphy_data->du_chdef, 0, 0); -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) cfg80211_ch_switch_notify(wiphy_data->du_wdev->netdev, &wiphy_data->du_chdef, 0); #else cfg80211_ch_switch_notify(wiphy_data->du_wdev->netdev, &wiphy_data->du_chdef); @@ -1054,7 +1054,7 @@ static void rtw_cfg80211_cac_event(struct rf_ctl_t *rfctl, u8 band_idx continue; if (!iface->rtw_wdev) continue; -#if defined(CONFIG_MLD_KERNEL_PATCH) || (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) +#if defined(CONFIG_MLD_KERNEL_PATCH) || (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) async = !((iface->rtw_wdev)->links[0].ap.chandef.chan); #else async = !iface->rtw_wdev->chandef.chan; diff --git a/os_dep/osdep_service_linux.c b/os_dep/osdep_service_linux.c index b1bc4b1..012bc56 100644 --- a/os_dep/osdep_service_linux.c +++ b/os_dep/osdep_service_linux.c @@ -15,6 +15,10 @@ #define _OSDEP_SERVICE_LINUX_C_ #include <drv_types.h> +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) +MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); +#endif + #ifdef DBG_MEMORY_LEAK ATOMIC_T _malloc_cnt = ATOMIC_INIT(0); ATOMIC_T _malloc_size = ATOMIC_INIT(0); -- 2.43.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/RTW88/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) PKG_NAME="RTW88" PKG_VERSION="dd5df33fc26f04705acf3e8b1ac70f3db6cdc008" PKG_SHA256="cacbd7249fdae9d2dda354d572704e7a2666317206abe684fc976d592e5ed49b" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/lwfinger/rtw88" PKG_URL="https://github.com/lwfinger/rtw88/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="Latest Realtek WiFi 5 Codes on Linux" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" make_target() { kernel_make -C ${PKG_BUILD} \ M=${PKG_BUILD} \ KSRC=$(kernel_path) } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} find ${PKG_BUILD}/ -name \*.ko -not -path '*/\.*' -exec cp {} ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} \; } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/RTW88/patches/0001-8822cs-add-0x024C-0xD821.patch ================================================ From 9643604d5edbe8feb528239f32d13c8a5a022555 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Tue, 5 Dec 2023 14:27:13 +0100 Subject: [PATCH 1/2] 8822cs: add 0x024C 0xD821 --- rtw8822cs.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtw8822cs.c b/rtw8822cs.c index 5d68b9a..32d682d 100644 --- a/rtw8822cs.c +++ b/rtw8822cs.c @@ -11,6 +11,8 @@ static const struct sdio_device_id rtw_8822cs_id_table[] = { { + SDIO_DEVICE(SDIO_VENDOR_ID_REALTEK, + SDIO_DEVICE_ID_REALTEK_RTW8821DS), SDIO_DEVICE(SDIO_VENDOR_ID_REALTEK, SDIO_DEVICE_ID_REALTEK_RTW8822CS), .driver_data = (kernel_ulong_t)&rtw8822c_hw_spec, -- 2.42.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/aic8800-sdio/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2024-present Team CoreELEC (https://coreelec.org) PKG_NAME="aic8800-sdio" PKG_VERSION="bf2b14e8357f65e6fa84da2905ea5c0756c7791c" PKG_SHA256="2623b85b977d7792d0bc765d4a47d32028bd328756bca2b3f75536366389be62" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/radxa-pkg/aic8800" PKG_URL="https://github.com/radxa-pkg/aic8800/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="AIC8800 SDIO WiFi and Bluetooth drivers" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" make_target() { kernel_make -C ${PKG_BUILD}/src/SDIO/driver_fw/driver/aic8800 \ M=${PKG_BUILD}/src/SDIO/driver_fw/driver/aic8800 \ PWD=${PKG_BUILD}/src/SDIO/driver_fw/driver/aic8800 \ KDIR=$(kernel_path) \ CONFIG_PLATFORM_AMLOGIC=y \ CONFIG_PLATFORM_UBUNTU=n \ CONFIG_AIC_FW_PATH=/lib/firmware/aic8800D80 \ modules } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} cp ${PKG_BUILD}/src/SDIO/driver_fw/driver/aic8800/*/*.ko ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} mkdir -p ${INSTALL}/$(get_full_firmware_dir)/aic8800D80 cp ${PKG_BUILD}/src/SDIO/driver_fw/fw/aic8800/* ${INSTALL}/$(get_full_firmware_dir)/aic8800D80 } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/aic8800-sdio/patches/aic8800-sdio-fixes.patch ================================================ From 39abee3ef0e84e21e3a5bc1d863475547e5dc500 Mon Sep 17 00:00:00 2001 From: Peter <peter.vicman@gmail.com> Date: Thu, 29 Feb 2024 12:07:46 +0100 Subject: [PATCH] fix from forum and fix for linux 5.15.119 --- src/SDIO/driver_fw/driver/aic8800/aic8800_bsp/aicsdio.c | 2 +- src/SDIO/driver_fw/driver/aic8800/aic8800_fdrv/rwnx_compat.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SDIO/driver_fw/driver/aic8800/aic8800_bsp/aicsdio.c b/src/SDIO/driver_fw/driver/aic8800/aic8800_bsp/aicsdio.c index b95e754..599bda3 100644 --- a/src/SDIO/driver_fw/driver/aic8800/aic8800_bsp/aicsdio.c +++ b/src/SDIO/driver_fw/driver/aic8800/aic8800_bsp/aicsdio.c @@ -486,7 +486,7 @@ static int aicbsp_platform_power_on(void) extern_wifi_set_enable(1); mdelay(200); sdio_reinit(); - set_power_control_lock(1); + //set_power_control_lock(1); #endif #ifdef CONFIG_PLATFORM_ROCKCHIP2 diff --git a/src/SDIO/driver_fw/driver/aic8800/aic8800_fdrv/rwnx_compat.h b/src/SDIO/driver_fw/driver/aic8800/aic8800_fdrv/rwnx_compat.h index 9287eca..10e3697 100644 --- a/src/SDIO/driver_fw/driver/aic8800/aic8800_fdrv/rwnx_compat.h +++ b/src/SDIO/driver_fw/driver/aic8800/aic8800_fdrv/rwnx_compat.h @@ -43,7 +43,7 @@ #define HIGH_KERNEL_VERSION KERNEL_VERSION(5, 15, 41) #define HIGH_KERNEL_VERSION2 KERNEL_VERSION(5, 15, 41) #define HIGH_KERNEL_VERSION3 KERNEL_VERSION(5, 15, 104) -#define HIGH_KERNEL_VERSION4 KERNEL_VERSION(6, 1, 0) +#define HIGH_KERNEL_VERSION4 KERNEL_VERSION(5, 15, 119) #else #define HIGH_KERNEL_VERSION KERNEL_VERSION(6, 0, 0) #define HIGH_KERNEL_VERSION2 KERNEL_VERSION(6, 1, 0) -- 2.41.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/RTL8723DS-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2024-present Team CoreELEC (https://coreelec.org) PKG_NAME="RTL8723DS-aml" PKG_VERSION="75b11e99be6cc02cea6a00310633b191de962098" PKG_SHA256="93324f12e415e13f7b4c9359dcf8231fb4a4a7b459a01504828bfe1ee220502a" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/lwfinger/rtl8723ds" PKG_URL="https://github.com/lwfinger/rtl8723ds/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="Realtek RTL8723DS Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" post_unpack() { sed -i 's/#define DEFAULT_RANDOM_MACADDR.*/#define DEFAULT_RANDOM_MACADDR 0/g' ${PKG_BUILD}/core/rtw_ieee80211.c } make_target() { kernel_make -C ${PKG_BUILD} \ M=${PKG_BUILD} \ KSRC=$(kernel_path) \ modules } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} find ${PKG_BUILD}/ -name \*.ko -not -path '*/\.*' -exec cp {} ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} \; } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/RTL8723DS-aml/patches/0001-Fix-for-Amlogic-kernel-5.15.119.patch ================================================ diff -aurNp a/os_dep/linux/ioctl_cfg80211.c b/os_dep/linux/ioctl_cfg80211.c --- a/os_dep/linux/ioctl_cfg80211.c 2024-04-30 09:34:21.186379067 +0200 +++ b/os_dep/linux/ioctl_cfg80211.c 2024-04-30 09:38:20.291254173 +0200 @@ -743,7 +743,7 @@ check_bss: #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) -#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 0, 0) +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 78) roam_info.bssid = cur_network->network.MacAddress; #else roam_info.links[0].bssid = cur_network->network.MacAddress; @@ -1387,7 +1387,7 @@ exit: } static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78) , int link_id #endif , u8 key_index @@ -1526,7 +1526,7 @@ addkey_end: } static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78) , int link_id #endif , u8 keyid @@ -1561,7 +1561,7 @@ static int cfg80211_rtw_get_key(struct w static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78) int link_id, #endif u8 key_index, bool pairwise, const u8 *mac_addr) @@ -1584,7 +1584,7 @@ static int cfg80211_rtw_del_key(struct w static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, struct net_device *ndev, -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78) int link_id, #endif u8 key_index @@ -4201,7 +4201,7 @@ static int cfg80211_rtw_change_beacon(st return ret; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev, unsigned int link_id) #else static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev) @@ -7070,7 +7070,7 @@ void rtw_wdev_unregister(struct wireless RTW_INFO(FUNC_ADPT_FMT" clear connected by cfg80211_disconnected\n", FUNC_ADPT_ARG(adapter)); cfg80211_disconnected(adapter->pnetdev, 0, NULL, 0, locally_generated, GFP_ATOMIC); } -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(5, 19, 0)) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 78)) if (wdev->current_bss) { u8 locally_generated = 1; RTW_INFO(FUNC_ADPT_FMT" clear current_bss by cfg80211_disconnected\n", FUNC_ADPT_ARG(adapter)); diff -aurNp a/os_dep/osdep_service.c b/os_dep/osdep_service.c --- a/os_dep/osdep_service.c 2024-04-30 09:34:21.190379120 +0200 +++ b/os_dep/osdep_service.c 2024-04-30 09:40:58.346774274 +0200 @@ -1218,6 +1218,9 @@ static int closeFile(struct file *fp) return 0; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) +MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); +#endif static int readFile(struct file *fp, char *buf, int len) { int rlen = 0, sum = 0; ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/RTL8852BE-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) PKG_NAME="RTL8852BE-aml" PKG_VERSION="b28630b2cd48748cb74d02cc3fce238ec6fef411" PKG_SHA256="52c0e32e3917a3160e4c468a7bbe9fa21fd75c1ac0eb73883309e4e1cd11f61e" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/RTL8852BE-aml" PKG_URL="https://github.com/CoreELEC/RTL8852BE-aml/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="Realtek RTL8852BE-aml Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" make_target() { kernel_make -C ${PKG_BUILD}/rtl8852BE \ M=${PKG_BUILD}/rtl8852BE \ KSRC=$(kernel_path) \ OUT_DIR= \ CONFIG_RTKM=m \ CONFIG_SDIO_HCI=n \ CONFIG_PCI_HCI=y \ CONFIG_POWER_SAVE=n \ CONFIG_RTW_DEBUG=n \ modules } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} find ${PKG_BUILD}/ -name \*.ko -not -path '*/\.*' -exec cp {} ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} \; } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/RTL8852BS-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="RTL8852BS-aml" PKG_VERSION="dd202f37cbffb0e93ba15746d373a87228334e5f" PKG_SHA256="0acc9c0eb4203e690b4254cd563526b7aabfc7d43ec85dc7f2f5ef54212e0b41" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/Stane1983/rtl8852bs-aml" PKG_URL="https://github.com/Stane1983/rtl8852bs-aml/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="Realtek RTL8852BS Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" post_unpack() { sed -i 's/#define DEFAULT_RANDOM_MACADDR.*/#define DEFAULT_RANDOM_MACADDR 0/g' ${PKG_BUILD}/core/rtw_ieee80211.c } make_target() { kernel_make -C ${PKG_BUILD} \ M=${PKG_BUILD} \ KSRC=$(kernel_path) \ CONFIG_POWER_SAVE=n \ CONFIG_RTW_DEBUG=n \ modules } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} find ${PKG_BUILD}/ -name \*.ko -not -path '*/\.*' -exec cp {} ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} \; } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/ap6xxx-aml/modprobe.d/dhd_sdio.conf ================================================ options dhd_sdio firmware_path=/usr/lib/firmware/brcm/ nvram_path=/usr/lib/firmware/brcm/ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/ap6xxx-aml/modprobe.d/dhdpci.conf ================================================ options dhdpci firmware_path=/usr/lib/firmware/brcm/pcie/ nvram_path=/usr/lib/firmware/brcm/pcie/ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/ap6xxx-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="ap6xxx-aml" PKG_VERSION="7a64f4c3f0435e56b8e02c7bff0a77f11d650089" PKG_SHA256="44a8a71f12d141377adaa6fec1bfd207e6cdcef467caf92b862aa4037aca8a8e" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_URL="https://github.com/CoreELEC/ap6xxx-aml/archive/${PKG_VERSION}.tar.gz" PKG_SITE="https://github.com/CoreELEC/ap6xxx-aml" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="ap6xxx: Linux drivers for AP6xxx WLAN chips used in some devices based on Amlogic SoCs" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" make_target() { echo echo "building ap6275s and others" kernel_make -C ${PKG_BUILD}/bcmdhd.101.10.591.x \ M=${PKG_BUILD}/bcmdhd.101.10.591.x \ PWD=${PKG_BUILD}/bcmdhd.101.10.591.x \ KERNEL_SRC=$(kernel_path) \ CONFIG_BCMDHD_DISABLE_WOWLAN=y \ CONFIG_BCMDHD_SDIO=y \ bcmdhd_sdio echo "building ap6275p" kernel_make -C ${PKG_BUILD}/bcmdhd.101.10.591.x \ M=${PKG_BUILD}/bcmdhd.101.10.591.x \ PWD=${PKG_BUILD}/bcmdhd.101.10.591.x \ KERNEL_SRC=$(kernel_path) \ CONFIG_BCMDHD_DISABLE_WOWLAN=y \ CONFIG_BCMDHD_PCIE=y \ bcmdhd_pcie } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} cp ${PKG_BUILD}/*/*.ko ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/common_drivers/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present Team CoreELEC (https://coreelec.org) PKG_NAME="common_drivers" PKG_VERSION="a4e76c15585749bb4f6008535d015a163b763989" PKG_SHA256="593e7ab037fd3b2156ae43694385b27e1c0274d8073ae3927bfc0e1df01f7f29" PKG_LICENSE="GPL-2.0+ OR MIT" PKG_SITE="https://coreelec.org" PKG_URL="https://github.com/CoreELEC/common_drivers/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="" PKG_LONGDESC="${PKG_NAME}: extra drivers for amlogic" PKG_TOOLCHAIN="manual" make_target() { : } makeinstall_target() { : } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/media_modules-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="media_modules-aml" PKG_VERSION="ca9530ef9110f3ae54d5d7019588ec057a667f3b" PKG_SHA256="d1b6019daec6e47872ba6142b5af0847b645f6998696b22c54e25404db86a5c9" PKG_LICENSE="GPL" PKG_SITE="https://coreelec.org" PKG_URL="https://github.com/CoreELEC/media_modules-aml/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="${PKG_NAME}: Linux driver" PKG_TOOLCHAIN="manual" pre_make_target() { unset LDFLAGS } make_target() { kernel_make -C $(kernel_path) M=${PKG_BUILD}/drivers \ EXTRA_CFLAGS="-DLIMIT_DECODE_INSTANCE=1" \ CONFIG_AMLOGIC_MEDIA_VDEC_MPEG2_MULTI=m \ CONFIG_AMLOGIC_MEDIA_VDEC_MPEG4_MULTI=m \ CONFIG_AMLOGIC_MEDIA_VDEC_VC1=m \ CONFIG_AMLOGIC_MEDIA_VDEC_H264_MULTI=m \ CONFIG_AMLOGIC_MEDIA_VDEC_H264_MVC=m \ CONFIG_AMLOGIC_MEDIA_VDEC_H265=m \ CONFIG_AMLOGIC_MEDIA_VDEC_H266=m \ CONFIG_AMLOGIC_MEDIA_VDEC_VP9=m \ CONFIG_AMLOGIC_MEDIA_VDEC_MJPEG_MULTI=m \ CONFIG_AMLOGIC_MEDIA_VDEC_AVS_MULTI=m \ CONFIG_AMLOGIC_MEDIA_VDEC_AVS2=m \ CONFIG_AMLOGIC_MEDIA_VDEC_AVS3=m \ CONFIG_AMLOGIC_MEDIA_VDEC_AV1=m \ CONFIG_AMLOGIC_MEDIA_VDEC_VP9_FB=m \ CONFIG_AMLOGIC_MEDIA_VDEC_H265_FB=m \ CONFIG_AMLOGIC_MEDIA_VDEC_AV1_FB=m \ CONFIG_AMLOGIC_MEDIA_VDEC_AVS2_FB=m } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} find ${PKG_BUILD}/ -name \*.ko -not -path '*/\.*' -exec cp {} ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} \; mkdir -p ${INSTALL}/$(get_full_firmware_dir)/video/NO_TEE for soc in ${TEE_SOC}; do cp -PR ${PKG_BUILD}/firmware/${soc} ${INSTALL}/$(get_full_firmware_dir)/video done if [ -f "${PKG_BUILD}/firmware/NO_TEE/video_ucode.bin" ]; then cp -PR ${PKG_BUILD}/firmware/NO_TEE/video_ucode.bin ${INSTALL}/$(get_full_firmware_dir)/video/NO_TEE else cp -PR ${PKG_BUILD}/firmware/video_ucode.bin ${INSTALL}/$(get_full_firmware_dir)/video/NO_TEE fi mkdir -p ${INSTALL}/usr/lib/coreelec install -m 0755 ${PKG_DIR}/scripts/media_modules-aml.sh ${INSTALL}/usr/lib/coreelec/media_modules-aml install -m 0755 ${PKG_DIR}/scripts/read-firmware-version.sh ${INSTALL}/usr/lib/coreelec/read-firmware-version } post_install() { enable_service media_modules-aml.service } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/media_modules-aml/scripts/media_modules-aml.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) source /usr/lib/coreelec/read-firmware-version SET_ANDROID_FIRMWARE="/sys/class/firmware_codec/android_firmware_version" modprobe -q amvdec_ports modprobe -q amvdec_avs modprobe -q amvdec_avs2 modprobe -q amvdec_avs3 modprobe -q amvdec_mavs modprobe -q amvdec_h264 modprobe -q amvdec_h264mvc modprobe -q amvdec_mh264 modprobe -q amvdec_h265 modprobe -q amvdec_h266 modprobe -q amvdec_mjpeg modprobe -q amvdec_mmjpeg modprobe -q amvdec_mpeg12 modprobe -q amvdec_mmpeg12 modprobe -q amvdec_mpeg4 modprobe -q amvdec_mmpeg4 modprobe -q amvdec_real modprobe -q amvdec_vc1 modprobe -q amvdec_av1 modprobe -q amvdec_vp9 modprobe -q amvdec_vp9_fb modprobe -q amvdec_h265_fb modprobe -q amvdec_av1_fb modprobe -q amvdec_avs2_fb if [ -f ${SET_ANDROID_FIRMWARE} ]; then read_firmware_version /vendor/lib/firmware/video/video_ucode.bin &>/dev/null echo "Android firmware version: ${minor}.${batch}" echo "${minor}.${batch}" > "${SET_ANDROID_FIRMWARE}" fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/media_modules-aml/scripts/read-firmware-version.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2025-present Team CoreELEC (https://coreelec.org) read_firmware_version() { local firmware_file="${1}" minor=0 batch=0 if [ -f "${firmware_file}" ]; then local offset=0 magic=$(echo $(hexdump -e '1/4 "%s"' -n 4 -s ${offset} ${firmware_file}) | rev) if [[ ${magic} != 'NEWP' && ${magic} != 'PACK' ]]; then offset=256 magic=$(echo $(hexdump -e '1/4 "%s"' -n 4 -s ${offset} ${firmware_file}) | rev) if [[ ${magic} != 'PACK' ]]; then break fi fi minor=$(hexdump -e '"%d"' -n 1 -s $((16 + ${offset})) ${firmware_file}) batch=$(hexdump -e '"%d"' -n 1 -s $((20 + ${offset})) ${firmware_file}) fi echo 'minor="${minor}"; batch="${batch}"' } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/media_modules-aml/system.d/media_modules-aml.service ================================================ [Unit] Description=Amlogic media_modules-aml service Before=kodi.service After=opentee_linuxdriver.service [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/lib/coreelec/media_modules-aml [Install] WantedBy=multi-user.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/mt76/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2025-present Team CoreELEC (https://coreelec.org) PKG_NAME="mt76" PKG_VERSION="8c7afc3c2f62d55b375bfb8c8e1d940a5eabb5b2" PKG_SHA256="dfdd52ba852354fa1faa724d753c7d417a4c2775aa263af0eb74ca7fa49407ee" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/mt76" PKG_URL="https://github.com/CoreELEC/mt76/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="MediaTek Linux v5.15 dev WiFi/BT drivers" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" make_target() { cd ${PKG_BUILD}/bluetooth kernel_make \ KCFLAGS="-DCONFIG_BT_MTK" \ KERNEL_SRC=$(kernel_path) echo cd ${PKG_BUILD}/mt76 kernel_make \ CONFIG_MT76x0_COMMON=m \ CONFIG_MT76x0U=m \ CONFIG_MT76x2_COMMON=m \ CONFIG_MT76x2U=m \ CONFIG_MT7615_COMMON=m \ CONFIG_MT7663_USB_SDIO_COMMON=m \ CONFIG_MT7663S=m \ CONFIG_MT7663U=m \ CONFIG_MT7921_COMMON=m \ CONFIG_MT7921S=m \ KCFLAGS="-DCONFIG_MT76_LEDS" \ KERNEL_SRC=$(kernel_path) } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} find ${PKG_BUILD}/ -name \*.ko -not -path '*/\.*' -exec cp {} ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} \; } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/mt7668-wifi-bt/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present Team CoreELEC (https://coreelec.org) PKG_NAME="mt7668-wifi-bt" PKG_VERSION="8039c882e313782c8b3e9594fcc9ee89a003fce4" PKG_SHA256="5f04e8289b4384e56c7c27072bb0f53c6198d195fdda2f8bcf62e58aa2aa489e" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/noob404yt/mt7668-wifi-bt" PKG_URL="https://github.com/CoreELEC/MT7668/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="WiFi & Bluetooth Drivers for MT7668" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" make_target() { cd ${PKG_BUILD}/MT7668-Bluetooth kernel_make EXTRA_CFLAGS="-w" \ KCFLAGS="-Wno-int-conversion" \ KERNEL_SRC=$(kernel_path) echo cd ${PKG_BUILD}/MT7668-WiFi kernel_make EXTRA_CFLAGS="-w" \ KCFLAGS="-Wno-incompatible-function-pointer-types" \ KERNELDIR=$(kernel_path) } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} find ${PKG_BUILD}/ -name \*.ko -not -path '*/\.*' -exec cp {} ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} \; mkdir -p ${INSTALL}/$(get_full_firmware_dir) cp ${PKG_BUILD}/MT7668-WiFi/7668_firmware/* ${INSTALL}/$(get_full_firmware_dir) } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/opentee_linuxdriver/filesystem/aarch64/usr/lib/libteec.so.1 ================================================ libteec.so.1.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/opentee_linuxdriver/filesystem/arm/usr/lib/libteec.so.1 ================================================ libteec.so.1.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/opentee_linuxdriver/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="opentee_linuxdriver" PKG_VERSION="0.1" PKG_SHA256="" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC" PKG_DEPENDS_TARGET="toolchain linux" PKG_LONGDESC="OP-TEE SECPU FW Loader" PKG_TOOLCHAIN="manual" make_target() { : } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/ta ln -sf /var/lib/optee_armtz ${INSTALL}/usr/lib/optee_armtz for soc in ${TEE_SOC}; do DIRSOC="$(get_pkg_directory ${PKG_NAME})/filesystem/${ARCH}/ta/v3.8/dev/${soc}" [ -d ${DIRSOC} ] && cp -rP ${DIRSOC} ${INSTALL}/usr/lib/ta done mkdir -p ${INSTALL}/usr/lib/coreelec install -m 0755 ${PKG_DIR}/scripts/tee-loader.sh ${INSTALL}/usr/lib/coreelec/tee-loader install -m 0755 ${PKG_DIR}/scripts/dovi-loader.sh ${INSTALL}/usr/lib/coreelec/dovi-loader cp -rP $(get_pkg_directory ${PKG_NAME})/filesystem/${ARCH}/usr ${INSTALL} } post_install() { enable_service opentee_linuxdriver.service # create mount points for Android partitions # must be /vendor because .ta file is used by absolute path mkdir -p ${INSTALL}/android/odm mkdir -p ${INSTALL}/android/oem mkdir -p ${INSTALL}/android/system mkdir -p ${INSTALL}/android/vendor ln -sf /android/system/system ${INSTALL}/system ln -sf /android/vendor ${INSTALL}/vendor } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/opentee_linuxdriver/scripts/dovi-loader.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) # get coreelec release information source /etc/os-release message() { >&2 echo "${@}" } # Return 1 if given kernel version is lower than current dovi.ko module version check_dovi_version() { version_higher=$(modinfo $1 | awk '/vermagic:/ {split($2, ver, "-"); print ver[1]}' | awk -F '.' \ -v ker_ver=$2 -v maj_ver=$3 -v min_ver=$4 '{ if ($1 > ker_ver) { print "Y"; } else if ($1 < ker_ver) { print "N"; } else { if ($2 > maj_ver) { print "Y"; } else if ($2 < maj_ver) { print "N"; } else { if ($3 >= min_ver) { print "Y"; } else { print "N"; } } } }') if [ "$version_higher" = "Y" ]; then return 0 else return 1 fi } insmod_dovi() { [ ! -f ${DOVI_KO_ANDROID} ] && return 1 modinfo ${DOVI_KO_ANDROID} if check_dovi_version ${DOVI_KO_ANDROID} 5 15 137; then message "loading dovi module from android partition" insmod ${DOVI_KO_ANDROID} else cat > /tmp/dovi.message << 'EOF' [TITLE]CoreELEC Dolby Vision Media Playback[/TITLE] [B][COLOR red]Android Dolby Vision kernel module is not compatible[/COLOR][/B] [COLOR red]No Dolby Vision media playback possible![/COLOR] Please upgrade Android firmware of your device to minimum Linux kernel version '5.15.137'. Dolby Vision media will be displayed in HDR instead Dolby Vision until the firmware fulfill the minimum requirements. EOF fi return 0 } load_dovi() { # local dovi.ko for DOVI_KO_STORAGE in /storage/.config/dovi.ko \ /flash/dovi.ko \ /storage/dovi.ko \ ; do if [ -f ${DOVI_KO_STORAGE} ]; then message "loading dovi module from ce partition" modinfo ${DOVI_KO_STORAGE} insmod ${DOVI_KO_STORAGE} && return fi done # Android 12 if [ -b /dev/oem ]; then mountpoint -q /android/oem || mount -o ro /dev/oem /android/oem DOVI_KO_ANDROID="/android/oem/overlay/dovi.ko" insmod_dovi && return fi # Android 11 # if mounted from tee-loader don't mount/unmount from dovi-loader if ! ls /dev/mapper/dynpart-* &>/dev/null && [ -b /dev/super ]; then dmsetup create --concise "$(parse-android-dynparts /dev/super)" systemctl set-environment dmsetup_remove=yes fi local active_slot=$(fw_printenv active_slot 2>/dev/null | awk -F '=' '/active_slot=/ {print $2}') if [ -b /dev/mapper/dynpart-system_a ]; then active_slot="_a" elif [ -b /dev/mapper/dynpart-system_b ]; then active_slot="_b" else active_slot="" fi if [ -b /dev/mapper/dynpart-odm${active_slot} ]; then mountpoint -q /android/odm || mount -o ro /dev/mapper/dynpart-odm${active_slot} /android/odm DOVI_KO_ANDROID="/android/odm/lib/modules/dovi.ko" insmod_dovi && return fi # older Android mountpoint -q /android/vendor || mount -o ro /dev/vendor /android/vendor for DOVI_KO_ANDROID in /android/vendor/lib/modules/dovi.ko \ /android/vendor/lib/modules/dovi_vs10.ko \ ; do insmod_dovi && return done cleanup_dovi } cleanup_dovi() { rmmod dovi 2>/dev/null mountpoint -q /android/odm && umount /android/odm mountpoint -q /android/oem && umount /android/oem mountpoint -q /android/vendor && umount /android/vendor # unmount only if mounted from this script [ "${dmsetup_remove}" = "yes" ] && \ ls /dev/mapper/dynpart-* &>/dev/null && dmsetup remove /dev/mapper/dynpart-* } message "run dovi '${1}'" case "${1}" in start) load_dovi ;; stop) cleanup ;; esac exit 0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/opentee_linuxdriver/scripts/tee-loader.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) # get coreelec release information source /etc/os-release source /usr/lib/coreelec/read-firmware-version VIDEO_UCODE_BIN_PATH=/lib/firmware/video/video_ucode.bin TEE_SUPPLICANT_PID_FILE=/var/run/tee-supplicant.pid message() { >&2 echo "${@}" } android_wrapper() { local android_arch=$(od -An -t x1 -j 4 -N 1 /vendor/bin/tee-supplicant | tr -d '[:space:]') local bit64="" local arg_exec="" [ "${android_arch}" = "02" ] && bit64="64" # 01 for 32-bit, 02 for 64 bit if [ "${1}" = "exec" ]; then arg_exec="exec" shift fi LD_LIBRARY_PATH=/system/lib${bit64}/bootstrap:/system/lib${bit64}:/vendor/lib${bit64} \ ${arg_exec} \ /system/bin/bootstrap/linker${bit64} \ ${@} return ${?} } run_tee_from_coreelec() { message "run tee from coreelec start" local SOC=$(awk '/SoC[ \t]*:/ {printf "%s", $3}' /proc/cpuinfo) if [ -z "${SOC}" ]; then message "SoC architecture unknown" return 1 fi mkdir -p /var/lib ln -sfn /usr/lib/ta/${SOC} /var/lib/optee_armtz [ -f $(dirname ${VIDEO_UCODE_BIN_PATH})/${SOC}/video_ucode.bin ] && \ ln -sfn ${SOC}/video_ucode.bin ${VIDEO_UCODE_BIN_PATH} tee-supplicant & echo ${!} >${TEE_SUPPLICANT_PID_FILE} # wait for tee-supplicant process to start sleep 5 tee_preload_fw ${VIDEO_UCODE_BIN_PATH} local rv=${?} message "run tee from coreelec end" return ${rv} } run_tee_from_android() { message "run tee from android start" ! ls /dev/mapper/dynpart-* &>/dev/null && dmsetup create --concise "$(parse-android-dynparts /dev/super)" local active_slot=$(fw_printenv active_slot 2>/dev/null | awk -F '=' '/active_slot=/ {print $2}') message "fw active slot: '${active_slot}'" if [ -b /dev/mapper/dynpart-system_a ]; then active_slot="_a" elif [ -b /dev/mapper/dynpart-system_b ]; then active_slot="_b" else active_slot="" fi message "active slot: '${active_slot}'" mountpoint -q /android/system || mount -o ro /dev/mapper/dynpart-system${active_slot} /android/system mountpoint -q /android/vendor || mount -o ro /dev/mapper/dynpart-vendor${active_slot} /android/vendor read_firmware_version /vendor${VIDEO_UCODE_BIN_PATH} &>/dev/null message "Android ucode version: '${minor}.${batch}'" if [[ ${minor} -gt 4 || ( ${minor} -eq 4 && ${batch} -ge 1 ) ]]; then message "run tee from android end" return 2 fi cat > /tmp/firmware.message << EOF Firmware version '${minor}.${batch}' found. Please update Android to enable the best possible media support. EOF if [ ! -x /vendor/bin/tee-supplicant ]; then message "tee-supplicant does not exist on android" message "run tee from android end" return 1 fi android_wrapper exec /vendor/bin/tee-supplicant & echo ${!} >${TEE_SUPPLICANT_PID_FILE} # wait for tee-supplicant process to start sleep 5 ln -sfn /vendor${VIDEO_UCODE_BIN_PATH} ${VIDEO_UCODE_BIN_PATH} android_wrapper /vendor/bin/tee_preload_fw ${VIDEO_UCODE_BIN_PATH} local rv=${?} message "run tee from android end" return ${rv} } cleanup_tee() { message "cleanup tee start" # process is killed by systemd if [ -r ${TEE_SUPPLICANT_PID_FILE} ]; then local tee_pid=$(cat ${TEE_SUPPLICANT_PID_FILE}) kill -s 0 ${tee_pid} 2>/dev/null && kill -KILL ${tee_pid} rm -f ${TEE_SUPPLICANT_PID_FILE} fi mountpoint -q /android/system && umount /android/system mountpoint -q /android/vendor && umount /android/vendor ls /dev/mapper/dynpart-* &>/dev/null && dmsetup remove /dev/mapper/dynpart-* message "cleanup tee end" } # run only if SoC is minimum SC2 (0x32) architecture SERIAL_THIS=$(awk '/^Serial[ \t]*:/ {printf "%d", "0x" substr($3,0,2)}' /proc/cpuinfo) SERIAL_SC2=$(printf "%d" "0x32") if [ ${SERIAL_THIS} -lt ${SERIAL_SC2} ]; then echo 1 > $(realpath /sys/module/*tee/parameters/disable_flag) message "tee not needed (SoC is less than SC2 (0x32) architecture)" ln -sfn NO_TEE/video_ucode.bin ${VIDEO_UCODE_BIN_PATH} exit 0 fi case "${1}" in start) if [ -b /dev/super ]; then run_tee_from_android rv=${?} [ ${rv} -eq 0 ] && exit 0 if [ ${rv} -eq 1 ]; then message "using tee from android failed, trying from coreelec" cleanup_tee elif [ ${rv} -eq 2 ]; then message "tee from android match SCS version, trying from coreelec" fi fi run_tee_from_coreelec [ ${?} -eq 0 ] && exit 0 if [ ! -b /dev/super ]; then exit 0; fi cat > /tmp/tee.message << 'EOF' [TITLE]CoreELEC Media Playback[/TITLE] [B][COLOR red]Missing partition 'super' on eMMC![/COLOR][/B] [COLOR red]No media playback possible![/COLOR] Current Android installed on eMMC does not have 'super' partition which is required for media playback in CoreELEC. Android must be reinstalled on your device to satisfy the requirements. If you have a CoreELEC internal install by the tool 'ceemmc' it is possible to perform the internal install again after Android is restored. Please ensure you have done a backup of your data before perform any recovery step. EOF message "using tee from coreelec failed" cleanup_tee ;; stop) cleanup_tee ;; esac ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/opentee_linuxdriver/system.d/opentee_linuxdriver.service ================================================ [Unit] Description=Optee TEE-Supplicant and Video Firmware Preload service Before=kodi.service After=local-fs.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/lib/coreelec/tee-loader start ExecStart=/usr/lib/coreelec/dovi-loader start ExecStop=/usr/lib/coreelec/dovi-loader stop ExecStop=/usr/lib/coreelec/tee-loader stop [Install] WantedBy=multi-user.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/w1-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="w1-aml" PKG_VERSION="87d7603a6ec06688a3bb6bc68d9daad300e32de3" PKG_SHA256="a3f1aad71b82b3bf08ee4936dced1844bcb57fe0a814811754aa99981c44b3c6" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/w1-aml" PKG_URL="https://github.com/CoreELEC/w1-aml/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="Amlogic W150S1 Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" make_target() { if [ "${TARGET_KERNEL_ARCH}" = "arm" ]; then kernel_make -C $(kernel_path) M=${PKG_BUILD}/project_w1/vmac else ccflags="-mno-outline-atomics -Wno-unused-variable -Wno-unused-but-set-variable -Wno-strict-prototypes" kernel_make -C $(kernel_path) M=${PKG_BUILD}/project_w1/vmac \ subdir-ccflags-y="${ccflags}" fi } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} find ${PKG_BUILD}/project_w1/vmac/ -name \*.ko -not -path '*/\.*' -exec cp {} ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} \; mkdir -p ${INSTALL}/$(get_full_firmware_dir)/w1 cp ${PKG_BUILD}/project_w1/vmac/aml_wifi*.txt ${INSTALL}/$(get_full_firmware_dir)/w1 } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/w1-aml/udev.d/80-aml_sdio.rules ================================================ ### Amlogic W150S1 ### this driver is split in two individual kernel modules ENV{MODALIAS}=="?*", ENV{SUBSYSTEM}=="sdio", ENV{SDIO_ID}=="8888:8888", GOTO="load_module" GOTO="end" LABEL="load_module" ENV{MODALIAS}=="?*", ENV{SUBSYSTEM}=="sdio", RUN{builtin}+="kmod load aml_sdio", RUN{builtin}+="kmod load vlsicomm" LABEL="end" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/wifi_dummy-aml/modules-load.d/wifi_dummy.conf ================================================ wifi_dummy ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/wifi_dummy-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="wifi_dummy-aml" PKG_VERSION="1.0" PKG_SHA256="" PKG_LICENSE="GPL" PKG_SITE="https://coreelec.org" PKG_URL="" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="${PKG_NAME}: Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" make_target() { kernel_make -C $(kernel_path) M=${PKG_BUILD} } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} cp ${PKG_BUILD}/wifi_dummy.ko ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/wifi_dummy-aml/sources/Makefile ================================================ obj-m += wifi_dummy.o ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/amlogic/wifi_dummy-aml/sources/wifi_dummy.c ================================================ #include <linux/delay.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/of_address.h> #include <linux/version.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("kszaq"); MODULE_DESCRIPTION("Amlogic WiFi power on and SDIO/PCIe rescan module"); extern void extern_wifi_set_enable(int); extern void sdio_reinit(void); #undef CONFIG_PCI #ifdef CONFIG_PCI extern void set_usb_wifi_power(int); extern void pci_remove(void); extern void pci_reinit(void); #endif /* name sdio name sdio name sd1 full_name sdio@fe088000 full_name /sdio@ffe03000 full_name /sd1@ffe05000 name pcie name pcieA full_name pcie@e0000000 full_name /pcieA@fc000000 */ static bool device_enabled(const char *path, const char *prefix) { struct device_node *parent_node; struct device_node *child; bool ret = false; int len; /*pr_info("wifi_dummy: path=%s prefix=%s\n", path, prefix);*/ parent_node = of_find_node_by_path(path); if (parent_node) { for_each_child_of_node(parent_node, child) { /*pr_info("wifi_dummy: full_name=%s, name=%s\n", child->full_name, child->name);*/ if (!strncmp(child->name, prefix, strlen(prefix))) { len = strlen(child->name); if (child->full_name[0] == '/') len++; /* include '/' */ if (strlen(child->full_name) > len && child->full_name[len] == '@') { if (of_device_is_available(child)) { pr_info("wifi_dummy: found enabled %s\n", child->full_name); ret = true; break; } else { pr_info("wifi_dummy: found disabled %s\n", child->full_name); } } } } of_node_put(parent_node); } return ret; } static int __init wifi_dummy_init(void) { bool sdio_en = false; bool pcie_en = false; pr_info("wifi_dummy: Triggered SDIO/PCIe WiFi power on and bus rescan\n"); sdio_en = device_enabled("/soc", "sdio"); pcie_en = device_enabled("/soc", "pcie"); sdio_en |= device_enabled("/", "sdio"); pcie_en |= device_enabled("/", "pcie"); sdio_en |= device_enabled("/", "sd2"); if (!sdio_en && !pcie_en) { pr_info("wifi_dummy: SDIO/PCIe not enabled\n"); return -ENODEV; } pr_info("wifi_dummy: SDIO %s, PCIe %s\n", sdio_en ? "enabled" : "disabled", pcie_en ? "enabled" : "disabled"); #ifdef CONFIG_PCI if (pcie_en) { pci_remove(); set_usb_wifi_power(0); } #endif if (sdio_en) { extern_wifi_set_enable(0); msleep(300); extern_wifi_set_enable(1); } else { msleep(300); } #ifdef CONFIG_PCI if (pcie_en) set_usb_wifi_power(1); #endif msleep(300); if (sdio_en) sdio_reinit(); #ifdef CONFIG_PCI if (pcie_en) pci_reinit(); #endif return -ENODEV; } static void __exit wifi_dummy_cleanup(void) { /* unused */ } module_init(wifi_dummy_init); module_exit(wifi_dummy_cleanup); ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/gpu-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="gpu-aml" PKG_VERSION="ecf394cb42126b08da5b2abbbc3e07ae10850024" PKG_SHA256="86715698649650478f107210f285d4308ce28c472102c9322f580ef7a5051f27" PKG_LICENSE="GPL" PKG_SITE="https://coreelec.org" PKG_URL="https://github.com/CoreELEC/gpu-aml/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="gpu-aml: Linux drivers for Mali GPUs found in Amlogic Meson SoCs" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" pre_make_target() { GPU_DRIVERS_ARCHITECTURE_REVISION="bifrost/r37p0 valhall/r41p0" } make_target() { for driver_arch_rev in ${GPU_DRIVERS_ARCHITECTURE_REVISION}; do echo echo "building ${driver_arch_rev}" kernel_make -C $(kernel_path) M=${PKG_BUILD}/${driver_arch_rev}/kernel/drivers/gpu/arm \ CONFIG_MALI_MIDGARD=m CONFIG_MALI_PLATFORM_NAME="devicetree" \ EXTRA_CFLAGS="-I${PKG_BUILD}/${driver_arch_rev}/kernel/include -DCONFIG_MALI_LOW_MEM=0" done } makeinstall_target() { for driver_arch_rev in ${GPU_DRIVERS_ARCHITECTURE_REVISION}; do echo echo "modules install ${driver_arch_rev}" driver_arch=${driver_arch_rev%%/*} kernel_make -C $(kernel_path) M=${PKG_BUILD}/${driver_arch_rev}/kernel/drivers/gpu/arm \ INSTALL_MOD_PATH=${INSTALL}/$(get_kernel_overlay_dir) INSTALL_MOD_STRIP=1 DEPMOD=: \ modules_install mv ${INSTALL}/$(get_kernel_overlay_dir)/lib/modules/$(get_module_dir)/extra/midgard/mali_kbase.ko \ ${INSTALL}/$(get_kernel_overlay_dir)/lib/modules/$(get_module_dir)/extra/midgard/mali_kbase_${driver_arch}.ko done } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/openvfd-driver/openvfd.conf.d/hc4.conf ================================================ vfd_gpio_clk='0,0,0xFF' vfd_gpio_dat='0,0,0xFF' vfd_gpio_stb='0,0,0xFF' vfd_gpio_protocol='1,2' vfd_chars='0,1,2,3,4' vfd_dot_bits='0,1,2,3,4,5,6' vfd_display_type='0x3F,0x3C,0x20,0xFD' ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/openvfd-driver/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Arthur Liberman (arthur_liberman@hotmail.com) PKG_NAME="openvfd-driver" PKG_VERSION="3118dda3aeb5b2f02b0ac0b5d30cbef58947a805" PKG_SHA256="fd0f38d059536e30000d3e2de3802ee97f8eeb7aac74143f0e588f803921a5ad" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/arthur-liberman/linux_openvfd" PKG_URL="https://github.com/arthur-liberman/linux_openvfd/archive/$PKG_VERSION.tar.gz" PKG_SOURCE_DIR="linux_openvfd-$PKG_VERSION*" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="openvfd-driver: an open source Linux driver for VFD displays" PKG_TOOLCHAIN="manual" make_target() { kernel_make -C "$(kernel_path)" M="$PKG_BUILD/driver" CFLAGS+=" -Wno-implicit-function-declaration" make OpenVFDService } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; mkdir -p $INSTALL/usr/sbin cp -P OpenVFDService $INSTALL/usr/sbin mkdir -p $INSTALL/usr/lib/coreelec cp $PKG_DIR/scripts/* $INSTALL/usr/lib/coreelec/ mkdir -p $INSTALL/etc/openvfd.conf.d/ cp $PKG_DIR/openvfd.conf.d/* $INSTALL/etc/openvfd.conf.d/ } post_install() { enable_service openvfd.service } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/openvfd-driver/scripts/openvfd-start ================================================ #!/bin/sh OSRELEASEFILE="/etc/os-release" USRCONFFILE="/storage/.config/vfd.conf" SYSCONFDIR="/etc/openvfd.conf.d" PROC_DT="/proc/device-tree" DT_ID=$(dtname) case $DT_ID in *odroid_hc4*) SYSCONFFILE="$SYSCONFDIR/hc4.conf" ;; esac if [ "$(tr -d '\0' < $PROC_DT/openvfd/compatible)" = "open,vfd" ]; then if [ -f "$USRCONFFILE" ]; then source "$USRCONFFILE" elif [ -f "$SYSCONFFILE" ]; then source "$SYSCONFFILE" else exit 0 fi OS_SPLASH_OPT="" if [ -f "$OSRELEASEFILE" ]; then source "$OSRELEASEFILE" OS_SPLASH_OPT="-s CE${VERSION_ID%%.*}" fi /sbin/modprobe openvfd vfd_gpio_clk=${vfd_gpio_clk} \ vfd_gpio_dat=${vfd_gpio_dat} \ vfd_gpio_stb=${vfd_gpio_stb:-0,0,0xFF} \ vfd_gpio0=${vfd_gpio0:-0,0,0xFF} \ vfd_gpio1=${vfd_gpio1:-0,0,0xFF} \ vfd_gpio2=${vfd_gpio2:-0,0,0xFF} \ vfd_gpio3=${vfd_gpio3:-0,0,0xFF} \ vfd_gpio_protocol=${vfd_gpio_protocol:-0,0} \ vfd_chars=${vfd_chars} vfd_dot_bits=${vfd_dot_bits} \ vfd_display_type=${vfd_display_type} /usr/sbin/OpenVFDService $OS_SPLASH_OPT ${clock_12h_format:+-12h} fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-drivers/openvfd-driver/system.d/openvfd.service ================================================ [Unit] Description=OpenVFD Service ConditionPathExists=/proc/device-tree/openvfd/ After=local-fs.target [Service] ExecStart=/usr/lib/coreelec/openvfd-start ExecStop=/bin/kill -TERM $MAINPID ExecStopPost=-/usr/sbin/rmmod openvfd RemainAfterExit=yes [Install] WantedBy=basic.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-firmware/amlogic/bl30/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="bl30" PKG_VERSION="02fffaea206644f493e8477bf03ce77e49df58b8" PKG_SHA256="ff1b0139008ef76045014822bfa67699a0150cc2e7583c071bb5057a619c9c80" PKG_LICENSE="GPL" PKG_SITE="https://coreelec.org" PKG_URL="https://github.com/CoreELEC/bl30/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" make_target() { unset CFLAGS LDFLAGS [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=${TOOLCHAIN}/lib/gcc7-linaro-aarch64-elf/bin:${TOOLCHAIN}/lib/gcc-riscv-none-embed/bin:${PATH} for soc_dir in ${PKG_BUILD}/demos/amlogic/n200/*; do if [ -d ${soc_dir} ]; then soc="$(basename ${soc_dir})" for board in ${PKG_BUILD}/demos/amlogic/n200/${soc}/*; do if [ -d ${board} -a -e ${board}/config.mk ]; then echo "Start building bl30 blob for" `basename "${board}"`", ${soc^^}" /bin/bash mk `basename "${board}"` ${soc} fi done fi done } makeinstall_target() { mkdir -p ${INSTALL}/usr/share/bootloader/bl30 find ${PKG_BUILD}/ -name \*.bin -not -path '*/\.*' \ -exec cp {} ${INSTALL}/usr/share/bootloader/bl30 \; } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-firmware/amlogic/qca-firmware-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team CoreELEC (https://coreelec.org) PKG_NAME="qca-firmware-aml" PKG_VERSION="56716df3468fd87ade0ac98af5ec687376e9b4ef" PKG_SHA256="4f3dd7ad50695c3f8205e38a1a703801d6033fcfda969c55606589229738178e" PKG_ARCH="arm aarch64" PKG_LICENSE="BSD-3c" PKG_SITE="https://github.com/CoreELEC/qca-firmware-aml" PKG_URL="https://github.com/CoreELEC/qca-firmware-aml/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="qca Linux firmware" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_firmware_dir) cp -a * ${INSTALL}/$(get_full_firmware_dir) # create a default firmware.conf for loading bluetooth NVM binaries # Possible parameter: # DEEP_SLEEP: Disable = 0 / Enable = 1 # PCM: Master = 0 / Slave = 1 mkdir -p ${INSTALL}/etc/bluetooth echo "DEEP_SLEEP=0 " > ${INSTALL}/etc/bluetooth/firmware.conf } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-firmware/amlogic/qca-firmware-aml/system.d/qca-firmware-aml.service ================================================ [Unit] Description=Attach /dev/ttyS1 to BlueZ stack using qca type Wants=bluetooth.service Before=bluetooth.service After=dev-ttyS1.device StartLimitInterval=60 StartLimitBurst=2 [Service] Type=simple ExecStartPre=/usr/sbin/rfkill unblock bluetooth ExecStart=/usr/bin/hciattach -n -s 115200 /dev/ttyS1 qca 2000000 ExecStopPost=/usr/sbin/rfkill block bluetooth Restart=always RestartSec=2 LimitNPROC=1 TimeoutStopSec=1s ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-firmware/amlogic/qca-firmware-aml/udev.d/80-qca-firmware-aml.rules ================================================ ################################################################################ # udev rules file for loading qca-firmware-aml ################################################################################ ACTION=="add", SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x0271", ATTRS{device}=="0x0[578]0?", \ TAG+="systemd", ENV{SYSTEMD_WANTS}+="qca-firmware-aml.service" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-firmware/amlogic/rtkbt-firmware-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="rtkbt-firmware-aml" PKG_VERSION="4d95579f256383af2df39d796f38a91ee6ec0b80" PKG_SHA256="7a2884532969f84596f469cde599b8ecc026e80263ae64c9faf0e22a0332f569" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/rtkbt-firmware-aml" PKG_URL="https://github.com/CoreELEC/rtkbt-firmware-aml/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain rtk_hciattach" PKG_LONGDESC="Realtek BT Linux firmware" PKG_TOOLCHAIN="manual" makeinstall_target() { FWDIR=$INSTALL/$(get_full_firmware_dir)/rtlbt mkdir -p $FWDIR cp -a $PKG_BUILD/* $FWDIR } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-firmware/amlogic/rtkbt-firmware-aml/system.d/rtkbt-firmware-aml.service ================================================ [Unit] Description=Attach /dev/ttyS1 to BlueZ stack using rtk_h5 type Wants=bluetooth.service Before=bluetooth.service After=dev-ttyS1.device [Service] Type=simple ExecStartPre=/usr/sbin/rfkill unblock bluetooth ExecStart=/usr/bin/rtk_hciattach -n -s 115200 /dev/ttyS1 rtk_h5 ExecStopPost=/usr/sbin/rfkill block bluetooth ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-firmware/amlogic/rtkbt-firmware-aml/udev.d/80-rtkbt-firmware-aml.rules ================================================ ################################################################################ # udev rules file for loading realtek bt firmware ################################################################################ ACTION!="add", GOTO="end" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x024c", ATTRS{device}=="0xb723", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rtkbt-firmware-aml.service" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x024c", ATTRS{device}=="0xb822", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rtkbt-firmware-aml.service" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x024c", ATTRS{device}=="0xc822", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rtkbt-firmware-aml.service" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x024c", ATTRS{device}=="0xb852", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rtkbt-firmware-aml.service" SUBSYSTEMS=="pci", ENV{PCI_ID}=="10EC:B852", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rtkbt-firmware-aml.service" GOTO="end" LABEL="end" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-firmware/brcmfmac_sdio-firmware-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="brcmfmac_sdio-firmware-aml" PKG_VERSION="8ce52bb7d022ee0645c681f84fbbb475f34475d5" PKG_SHA256="ee846cb9a45b095f76c33fe0395a8ccde4c90b38f041e3f994f617c51a02ed79" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/brcmfmac_sdio-firmware-aml" PKG_URL="https://github.com/CoreELEC/brcmfmac_sdio-firmware-aml/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Firmware for brcm bluetooth chips used in some Amlogic based devices." makeinstall_target() { DESTDIR=$INSTALL FWDIR=$INSTALL/$(get_kernel_overlay_dir) make install cd $INSTALL/$(get_full_firmware_dir)/brcm for f in *.hcd; do ln -sr $f $(grep --text -o 'BCM[24]\S*' $f).hcd 2>/dev/null || true ln -sr $f $(grep --text -o 'BCM[24]\S*' $f | cut -c4-).hcd 2>/dev/null || true ln -sr $f $(echo $f | sed -r 's/[^.]*/\U&/') 2>/dev/null || true done ln -sr bcm4335_V0343.0353.hcd bcm4335a0.hcd 2>/dev/null || true ln -sr bcm4335_V0343.0353.hcd BCM4335A0.hcd 2>/dev/null || true } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-firmware/brcmfmac_sdio-firmware-aml/system.d/brcmfmac_sdio-firmware-aml.service ================================================ [Unit] Description=Attach /dev/ttyS1 to BlueZ stack using bcm43xx type Wants=bluetooth.service Before=bluetooth.service After=dev-ttyS1.device [Service] Type=simple ExecStartPre=/usr/sbin/rfkill unblock bluetooth ExecStart=/usr/bin/hciattach -n -s 115200 /dev/ttyS1 bcm43xx 2000000 ExecStopPost=/usr/sbin/rfkill block bluetooth ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-firmware/brcmfmac_sdio-firmware-aml/system.d/brcmfmac_sdio-firmware@.service ================================================ [Unit] Description=Broadcom sdio firmware update for %I Wants=bluetooth.service Before=bluetooth.service After=dev-ttyS1.device [Service] Type=simple ExecStart=/usr/bin/brcm_patchram_plus --patchram /usr/lib/kernel-overlays/base/lib/firmware/brcm/%I.hcd --baudrate 2000000 --use_baudrate_for_download /dev/ttyS1 --enable_hci --no2bytes --tosleep=50000 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-firmware/brcmfmac_sdio-firmware-aml/udev.d/80-brcmfmac_pci.rules ================================================ ################################################################################ # udev rules file for loading brcmfmac_sdio-firmware-aml ################################################################################ ### Broadcom AP6275p/BCM43752 bluetooth device SUBSYSTEMS=="pci", ATTRS{vendor}=="0x14e4", ACTION=="add", \ TAG+="systemd", ENV{SYSTEMD_WANTS}+="brcmfmac_sdio-firmware-aml.service" LABEL="end" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-firmware/brcmfmac_sdio-firmware-aml/udev.d/80-brcmfmac_sdio.rules ================================================ ################################################################################ # udev rules file for loading brcmfmac_sdio-firmware-aml ################################################################################ ### Broadcom bcm43362/bcm20710a1 bluetooth device SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x02d0", ATTRS{device}=="0xa962", ACTION=="add", \ TAG+="systemd", ENV{SYSTEMD_WANTS}+="brcmfmac_sdio-firmware@bcm20710a1.service", GOTO="end" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x02d0", ACTION=="add", \ TAG+="systemd", ENV{SYSTEMD_WANTS}+="brcmfmac_sdio-firmware-aml.service" LABEL="end" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/linux-firmware/wlan-firmware/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="wlan-firmware" PKG_VERSION="2142727" PKG_SHA256="d03e3108ef18ec10774b601d06d8445aebbd3c39f8ea3ab2b20a26c62af3500f" PKG_LICENSE="Free-to-use" PKG_SITE="https://github.com/LibreELEC/wlan-firmware" PKG_URL="https://github.com/LibreELEC/wlan-firmware/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain rfkill" PKG_LONGDESC="wlan-firmware: firmwares for various WLAN drivers" PKG_TOOLCHAIN="manual" makeinstall_target() { DESTDIR=$INSTALL/$(get_kernel_overlay_dir) ./install } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/CoreELEC-settings/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="CoreELEC-settings" PKG_VERSION="8e7c1855c68e7f9c63dccdca31091299007a37a4" PKG_SHA256="3e4c61fe18ac223afb70cfa7568a3c5781567469ae3a5292ce9be57d885598f8" PKG_LICENSE="GPL" PKG_SITE="https://coreelec.org" PKG_URL="https://github.com/CoreELEC/service.coreelec.settings/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 connman pygobject dbus-python bkeymaps" PKG_LONGDESC="CoreELEC-settings: is a settings dialog for CoreELEC" PKG_MAKE_OPTS_TARGET="DISTRONAME=${DISTRONAME} \ ADDON_VERSION=${ADDON_VERSION} \ ROOT_PASSWORD=${ROOT_PASSWORD}" post_makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/coreelec cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/lib/coreelec ADDON_INSTALL_DIR=${INSTALL}/usr/share/kodi/addons/service.coreelec.settings python_compile ${ADDON_INSTALL_DIR}/resources/lib/ python_compile ${ADDON_INSTALL_DIR}/oe.py } post_install() { enable_service backup-restore.service enable_service factory-reset.service } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/CoreELEC-settings/scripts/backup-restore ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /usr/lib/libreelec/functions # Get NAME, which is DISTRONAME, ie. CoreELEC . /etc/os-release hidecursor BACKUP_FILE=`ls -1 /storage/.restore/??????????????.tar 2>/dev/null | tail -1` if [ -f "${BACKUP_FILE}" ] ; then echo "RESTORE IN PROGRESS" echo "" echo "Please do not reboot or turn off your ${NAME} device!" echo "" StartProgress spinner "Checking backup file... " tar tf ${BACKUP_FILE} &>/dev/null ret=$? if [ ${ret} -eq 0 ] ; then StopProgress "OK" echo echo "This may take some time to complete, please be patient." echo StartProgress spinner "Restoring... " rm -rf /storage/.kodi &>/dev/null rm -rf /storage/.cache &>/dev/null rm -rf /storage/.config &>/dev/null tar xf ${BACKUP_FILE} -C / &>/dev/null rm -f ${BACKUP_FILE} &>/dev/null # Leave a hint that we just did a restore echo "RESTORE" > /storage/.config/boot.hint sync StopProgress "done!" echo StartProgress countdown "Rebooting in 5s... " 5 "NOW" else StopProgress "FAILED" echo echo "Backup file is not valid, or corrupt." echo StartProgress spinner "Removing file to allow normal restart... " rm -f ${BACKUP_FILE} &>/dev/null sync StopProgress "done" echo StartProgress countdown "Rebooting in 30s... " 30 "NOW" fi fi sync reboot -f ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/CoreELEC-settings/scripts/factory-reset ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /usr/lib/libreelec/functions # Get NAME, which is DISTRONAME, ie. CoreELEC . /etc/os-release hidecursor label= target= uuid= ceemmc= get_target() { for arg in $(cat /proc/cmdline); do case ${arg} in disk=*) disk="${arg#*=}" case ${disk} in LABEL=*) label="${disk#*=}" target="$(blkid -L ${label})" ;; UUID=*) uuid="${disk#*=}" target="$(blkid -U ${uuid})" ;; FOLDER=*) ceemmc="yes" target="${disk#*=}" ;; /*) target="${disk}" ;; esac ;; esac done } show_reset_msg() { echo "RESET IN PROGRESS" echo "" echo "Please do not reboot or turn off your ${NAME} device!" echo "" } if [ -f /storage/.cache/reset_hard ] ; then # hard reset rm -f /storage/.cache/reset_hard get_target if [ ! -z ${target} ] ; then show_reset_msg StartProgress spinner "Performing hard reset... " if [ "${ceemmc}" = "yes" ] ; then # storage is just subfolder on Android data partition rm -rf /storage/* &>/dev/null rm -rf /storage/.[!.]* &>/dev/null else umount /storage mke2fs -t ext4 -m 0 ${target} &>/dev/null if [ ! -z ${label} ] ; then tune2fs -U random -L ${label} ${target} &>/dev/null fi if [ ! -z ${uuid} ] ; then tune2fs -U ${uuid} ${target} &>/dev/null fi fi StopProgress "done!" echo StartProgress countdown "Rebooting in 5s... " 5 "NOW" fi elif [ -f /storage/.cache/reset_soft ] ; then # soft reset rm -f /storage/.cache/reset_soft get_target if [ ! -z ${target} ] ; then show_reset_msg StartProgress spinner "Performing soft reset... " rm -rf /storage/.??* &>/dev/null # Leave a hint that we just did a soft reset mkdir -p /storage/.config echo "RESET-SOFT" > /storage/.config/boot.hint StopProgress "done!" echo StartProgress countdown "Rebooting in 5s... " 5 "NOW" fi fi sync reboot -f ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/CoreELEC-settings/system.d/backup-restore.service ================================================ [Unit] Description=Restoring Backup DefaultDependencies=no [Service] Type=idle ExecStart=/usr/lib/coreelec/backup-restore StandardInput=tty-force StandardOutput=inherit StandardError=inherit ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/CoreELEC-settings/system.d/backup-restore.target ================================================ [Unit] Description=Restoring Backup target Requires=backup-restore.service After=backup-restore.service AllowIsolate=yes ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/CoreELEC-settings/system.d/factory-reset.service ================================================ [Unit] Description=Factory reset DefaultDependencies=no [Service] Type=idle ExecStart=/usr/lib/coreelec/factory-reset StandardInput=tty-force StandardOutput=inherit StandardError=inherit ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/CoreELEC-settings/system.d/factory-reset.target ================================================ [Unit] Description=Factory reset target Requires=factory-reset.service After=factory-reset.service AllowIsolate=yes ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/config/advancedsettings.xml ================================================ <advancedsettings> <cputempcommand>/usr/bin/cputemp</cputempcommand> <gputempcommand>/usr/bin/gputemp</gputempcommand> <showexitbutton>false</showexitbutton> <remotedelay>1</remotedelay> <samba> <clienttimeout>30</clienttimeout> </samba> <splash>false</splash> </advancedsettings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/config/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8" ?> <settings version="1"> <section id="games"> <category id="gamesgeneral"> <group id="1"> <setting id="gamesgeneral.enablerewind"> <default>false</default> </setting> </group> </category> </section> <section id="system"> <category id="display"> <group id="1"> <setting id="videoscreen.screen"> <visible>false</visible> </setting> </group> <group id="3"> <setting id="videoscreen.noofbuffers"> <default>2</default> </setting> </group> </category> <category id="audio"> <group id="1"> <setting id="audiooutput.volumesteps"> <default>20</default> </setting> </group> </category> <category id="logging"> <group id="1"> <setting id="debug.screenshotpath"> <default>/storage/screenshots/</default> </setting> </group> </category> </section> <section id="services"> <category id="airplay"> <group id="1"> <setting id="services.airplay"> <default>true</default> </setting> </group> </category> <category id="smb"> <group id="2"> <setting id="smb.maxprotocol"> <default>0</default> </setting> </group> </category> </section> <section id="pvr"> <category id="epg"> <group id="2"> <setting id="epg.preventupdateswhileplayingtv"> <default>true</default> </setting> <setting id="epg.ignoredbforclient"> <default>true</default> </setting> </group> </category> <category id="pvrplayback"> <group id="1"> <setting id="pvrplayback.signalquality"> <default>false</default> </setting> </group> </category> <category id="pvrpowermanagement"> <group id="1"> <setting id="pvrpowermanagement.setwakeupcmd"> <default>/usr/bin/setwakeup.sh</default> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/config/guisettings.xml ================================================ <settings version="2"> <general> <settinglevel>2</settinglevel> </general> </settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/config/kodi.conf.in ================================================ KODI_AE_SINK=@KODI_AE_SINK@ HOME=/storage KODI_TEMP=/storage/.kodi/temp KODI_HOME=/usr/share/kodi/ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/config/network_wait ================================================ WAIT_NETWORK="true" WAIT_NETWORK_TIME="10" WAIT_NETWORK_DEFAULT="true" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/config/repository.coreelec/addon.xml ================================================ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="@ADDON_REPO_ID@" name="@ADDON_REPO_NAME@" version="@ADDON_VERSION@" provider-name="CoreELEC"> <extension point="xbmc.addon.repository" name="@ADDON_REPO_NAME@"> <dir> <info>@ADDON_URL@/addons.xml.gz</info> <checksum verify="sha256">@ADDON_URL@/addons.xml.gz?sha256</checksum> <datadir>@ADDON_URL@</datadir> </dir> </extension> <extension point="xbmc.addon.metadata"> <summary>@ADDON_REPO_NAME@</summary> <description>The CoreELEC add-on repository contains Kodi PVR Clients and Servers, Screensavers, Visualisations, and more. Add-ons in this repository are maintained and supported by CoreELEC staff and YOU the community. If you find a broken or non-working add-on please report it via the forums, or help by submitting fixes via GitHub.</description> <platform>all</platform> </extension> </addon> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/config/sources.xml ================================================ <sources> <video> <default pathversion="1"></default> <source> <name>Videos</name> <path pathversion="1">/storage/videos/</path> <allowsharing>true</allowsharing> </source> <source> <name>TV Shows</name> <path pathversion="1">/storage/tvshows/</path> <allowsharing>true</allowsharing> </source> </video> <music> <default pathversion="1"></default> <source> <name>Music</name> <path pathversion="1">/storage/music/</path> <allowsharing>true</allowsharing> </source> </music> <pictures> <default pathversion="1"></default> <source> <name>Pictures</name> <path pathversion="1">/storage/pictures/</path> <allowsharing>true</allowsharing> </source> </pictures> </sources> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/debug.d/kodi.conf ================================================ KODI_DEBUG="--debug" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2022-present Team CoreELEC (https://coreelec.tv) PKG_NAME="kodi" PKG_VERSION="9678a65b02c9a5c56552d5831f52f16ff5245583" PKG_SHA256="2d1af54f5900f9a3355192b39725df1812aa2e6f9bc711262ec82f8e6f24344c" PKG_LICENSE="GPL" PKG_SITE="http://www.kodi.tv" PKG_URL="https://github.com/CoreELEC/xbmc/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain JsonSchemaBuilder:host TexturePacker:host Python3 zlib systemd lzo pcre2 swig:host libass curl exiv2 fontconfig fribidi tinyxml tinyxml2 libjpeg-turbo freetype libcdio taglib libxml2 libxslt rapidjson sqlite ffmpeg crossguid libfmt lirc libfstrcmp flatbuffers:host flatbuffers libudfread spdlog obu_util libdovi" PKG_DEPENDS_UNPACK="commons-lang3 commons-text groovy" PKG_DEPENDS_HOST="toolchain" PKG_LONGDESC="A free and open source cross-platform media player." PKG_BUILD_FLAGS="+speed" post_unpack() { if [ -f ${DISTRO_DIR}/${DISTRO}/splash/${DEVICE}/splash-1080.png ]; then rm -rf $(get_build_dir ${PKG_NAME})/media/splash.* cp -PR ${DISTRO_DIR}/${DISTRO}/splash/${DEVICE}/splash-1080.png $(get_build_dir ${PKG_NAME})/media/splash.png fi sed -e "s|@ADDON_REPO_ID@|${ADDON_REPO_ID}|g" -i $(get_build_dir ${PKG_NAME})/version.txt sed -e "s|@ADDON_SERVER_URL@|${ADDON_SERVER_URL}|g" -i $(get_build_dir ${PKG_NAME})/version.txt # don't build internal TexturePacker sed -i 's|set(INTERNAL_TEXTUREPACKER_INSTALLABLE TRUE|set(INTERNAL_TEXTUREPACKER_INSTALLABLE FALSE|' \ $(get_build_dir ${PKG_NAME})/cmake/modules/buildtools/FindTexturePacker.cmake } configure_package() { # Single threaded LTO is very slow so rely on Kodi for parallel LTO support if [ "${LTO_SUPPORT}" = "yes" ] && ! build_with_debug; then PKG_KODI_USE_LTO="-DUSE_LTO=${CONCURRENCY_MAKE_LEVEL}" fi # Set linker options case $(get_target_linker) in gold) PKG_KODI_LINKER="-DENABLE_GOLD=ON \ -DENABLE_MOLD=OFF" ;; mold) PKG_KODI_LINKER="-DENABLE_GOLD=OFF \ -DENABLE_MOLD=ON \ -DMOLD_EXECUTABLE=${TOOLCHAIN}/${TARGET_NAME}/bin/mold" ;; *) PKG_KODI_LINKER="-DENABLE_GOLD=OFF \ -DENABLE_MOLD=OFF" ;; esac get_graphicdrivers PKG_DEPENDS_TARGET+=" dbus" if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" libX11 libXext libdrm libXrandr" KODI_PLATFORM="-DCORE_PLATFORM_NAME=x11 \ -DAPP_RENDER_SYSTEM=gl" elif [ "${DISPLAYSERVER}" = "wl" ]; then PKG_DEPENDS_TARGET+=" wayland waylandpp" PKG_PATCH_DIRS+=" wayland" CFLAGS+=" -DEGL_NO_X11" CXXFLAGS+=" -DEGL_NO_X11" KODI_PLATFORM="-DCORE_PLATFORM_NAME=wayland \ -DAPP_RENDER_SYSTEM=gles \ -DWAYLANDPP_SCANNER=${TOOLCHAIN}/bin/wayland-scanner++ \ -DWAYLANDPP_PROTOCOLS_DIR=${SYSROOT_PREFIX}/usr/share/waylandpp/protocols" fi if [ ! "${OPENGL}" = "no" ]; then PKG_DEPENDS_TARGET+=" ${OPENGL} glu" fi if [ "${OPENGLES_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi if [ "${KODI_ALSA_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" alsa-lib" KODI_ALSA="-DENABLE_ALSA=ON" else KODI_ALSA="-DENABLE_ALSA=OFF" fi if [ "${KODI_PULSEAUDIO_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" pulseaudio" KODI_PULSEAUDIO="-DENABLE_PULSEAUDIO=ON" else KODI_PULSEAUDIO="-DENABLE_PULSEAUDIO=OFF" fi if [ "${ESPEAK_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" espeak-ng" fi if [ "${KODI_PIPEWIRE_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" pipewire" KODI_PIPEWIRE="-DENABLE_PIPEWIRE=ON" if [ "${KODI_PULSEAUDIO_SUPPORT}" = "yes" -o "${KODI_ALSA_SUPPORT}" = "yes" ]; then die "KODI_PULSEAUDIO_SUPPORT and KODI_ALSA_SUPPORT cannot be used with KODI_PIPEWIRE_SUPPORT" fi else KODI_PIPEWIRE="-DENABLE_PIPEWIRE=OFF" fi if [ "${CEC_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libcec" KODI_CEC="-DENABLE_CEC=ON" else 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 KODI_OPTICAL="-DENABLE_OPTICAL=OFF" fi if [ "${KODI_BLURAY_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libbluray" KODI_BLURAY="-DENABLE_BLURAY=ON" else KODI_BLURAY="-DENABLE_BLURAY=OFF" fi if [ "${AVAHI_DAEMON}" = yes ]; then PKG_DEPENDS_TARGET+=" avahi nss-mdns" KODI_AVAHI="-DENABLE_AVAHI=ON" else KODI_AVAHI="-DENABLE_AVAHI=OFF" fi case "${KODI_MYSQL_SUPPORT}" in mysql) PKG_DEPENDS_TARGET+=" mysql" KODI_MYSQL="-DENABLE_MYSQLCLIENT=ON -DENABLE_MARIADBCLIENT=OFF" ;; mariadb) PKG_DEPENDS_TARGET+=" mariadb-connector-c" KODI_MYSQL="-DENABLE_MARIADBCLIENT=ON -DENABLE_MYSQLCLIENT=OFF" ;; *) KODI_MYSQL="-DENABLE_MYSQLCLIENT=OFF -DENABLE_MARIADBCLIENT=OFF" ;; esac if [ "${KODI_AIRPLAY_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libplist" KODI_AIRPLAY="-DENABLE_PLIST=ON" else KODI_AIRPLAY="-DENABLE_PLIST=OFF" fi if [ "${KODI_AIRTUNES_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libshairplay" KODI_AIRTUNES="-DENABLE_AIRTUNES=ON" else KODI_AIRTUNES="-DENABLE_AIRTUNES=OFF" fi if [ "${KODI_NFS_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libnfs" KODI_NFS="-DENABLE_NFS=ON" else KODI_NFS="-DENABLE_NFS=OFF" fi if [ "${KODI_SAMBA_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" samba" KODI_SAMBA="-DENABLE_SMBCLIENT=ON" else KODI_SAMBA="-DENABLE_SMBCLIENT=OFF" fi if [ "${KODI_WEBSERVER_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libmicrohttpd" fi if [ "${KODI_UPNP_SUPPORT}" = yes ]; then KODI_UPNP="-DENABLE_UPNP=ON" else KODI_UPNP="-DENABLE_UPNP=OFF" fi if [ "${TARGET_ARCH}" = "aarch64" -o "${TARGET_ARCH}" = "arm" ]; then if target_has_feature neon; then KODI_NEON="-DENABLE_NEON=ON" else KODI_NEON="-DENABLE_NEON=OFF" fi else KODI_NEON="" fi if [ "${VDPAU_SUPPORT}" = "yes" -a "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" libvdpau" KODI_VDPAU="-DENABLE_VDPAU=ON" else KODI_VDPAU="-DENABLE_VDPAU=OFF" fi if [ "${VAAPI_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libva" KODI_VAAPI="-DENABLE_VAAPI=ON" else KODI_VAAPI="-DENABLE_VAAPI=OFF" fi if [ "${TARGET_ARCH}" = "x86_64" ]; then KODI_ARCH="-DWITH_CPU=${TARGET_ARCH}" else KODI_ARCH="-DWITH_ARCH=${TARGET_ARCH}" fi if [ ! "${KODIPLAYER_DRIVER}" = "default" -a "${DISPLAYSERVER}" = "no" ]; then PKG_DEPENDS_TARGET+=" ${KODIPLAYER_DRIVER} libinput libxkbcommon" if [ "${OPENGLES_SUPPORT}" = yes -a "${KODIPLAYER_DRIVER}" = "${OPENGLES}" ]; then KODI_PLATFORM="-DCORE_PLATFORM_NAME=gbm -DAPP_RENDER_SYSTEM=gles" CFLAGS+=" -DEGL_NO_X11" CXXFLAGS+=" -DEGL_NO_X11" if [ "${PROJECT}" = "Generic" ]; then PKG_APPLIANCE_XML="${PKG_DIR}/config/appliance-gbm-generic.xml" else PKG_APPLIANCE_XML="${PKG_DIR}/config/appliance-gbm.xml" fi elif [ "${KODIPLAYER_DRIVER}" = libamcodec ]; then KODI_PLATFORM="-DCORE_PLATFORM_NAME=aml -DAPP_RENDER_SYSTEM=gles" fi fi PKG_CMAKE_OPTS_TARGET="-DNATIVEPREFIX=${TOOLCHAIN} \ -DWITH_TEXTUREPACKER=${TOOLCHAIN}/bin/TexturePacker \ -DWITH_JSONSCHEMABUILDER=${TOOLCHAIN}/bin/JsonSchemaBuilder \ -DSWIG_EXECUTABLE=${TOOLCHAIN}/bin/swig \ -DPYTHON_EXECUTABLE=${TOOLCHAIN}/bin/${PKG_PYTHON_VERSION} \ -DPYTHON_INCLUDE_DIRS=${SYSROOT_PREFIX}/usr/include/${PKG_PYTHON_VERSION} \ -DGIT_VERSION=${PKG_VERSION} \ -DFFMPEG_PATH=${SYSROOT_PREFIX}/usr \ -DENABLE_INTERNAL_CROSSGUID=OFF \ -DENABLE_INTERNAL_EXIV2=OFF \ -DENABLE_INTERNAL_FFMPEG=OFF \ -DENABLE_INTERNAL_FLATBUFFERS=OFF \ -DENABLE_INTERNAL_RapidJSON=OFF \ -DENABLE_INTERNAL_SPDLOG=OFF \ -DENABLE_INTERNAL_UDFREAD=OFF \ -DENABLE_UDEV=ON \ -DENABLE_DBUS=ON \ -DENABLE_XSLT=ON \ -DENABLE_CCACHE=OFF \ -DENABLE_LIRCCLIENT=ON \ -DENABLE_EVENTCLIENTS=ON \ -DENABLE_DEBUGFISSION=OFF \ -DENABLE_APP_AUTONAME=OFF \ -DENABLE_TESTING=OFF \ -DENABLE_LCMS2=OFF \ -DADDONS_CONFIGURE_AT_STARTUP=OFF \ -DENABLE_LIBDOVI=ON \ -Dgroovy_SOURCE_DIR=$(get_build_dir groovy) \ -Dapache-commons-lang_SOURCE_DIR=$(get_build_dir commons-lang3) \ -Dapache-commons-text_SOURCE_DIR=$(get_build_dir commons-text) \ -DPCRE2_USE_STATIC_LIBS=ON \ ${PKG_KODI_USE_LTO} \ ${PKG_KODI_LINKER} \ ${KODI_ARCH} \ ${KODI_NEON} \ ${KODI_VDPAU} \ ${KODI_VAAPI} \ ${KODI_CEC} \ ${KODI_PLATFORM} \ ${KODI_SAMBA} \ ${KODI_NFS} \ ${KODI_AVAHI} \ ${KODI_UPNP} \ ${KODI_MYSQL} \ ${KODI_AIRPLAY} \ ${KODI_AIRTUNES} \ ${KODI_OPTICAL} \ ${KODI_BLURAY} \ ${KODI_ALSA} \ ${KODI_PULSEAUDIO} \ ${KODI_PIPEWIRE}" } prepare_libdvd_library() { # arg1 is library name libdvdcss/libdvdnav/libdvdread local LIBRARY_VERSION="$(awk -F= '/VERSION=/ {print $2}' ${PKG_BUILD}/tools/depends/target/${1}/${1^^}-VERSION)" local LIBRARY_SHA512="$(awk -F= '/SHA512=/ {print $2}' ${PKG_BUILD}/tools/depends/target/${1}/${1^^}-VERSION)" local LIBRARY_ARCHIVE="${SOURCES}/${1}/${1}-${LIBRARY_VERSION}.tar.gz" if [ -f "${LIBRARY_ARCHIVE}" ]; then local LIBRARY_ARCHIVE_SHA512="$(sha512sum "${LIBRARY_ARCHIVE}" | cut -d ' ' -f 1)" if [ "${LIBRARY_ARCHIVE_SHA512}" = "${LIBRARY_SHA512}" ]; then KODI_LIBDVD+=" -D${1^^}_URL=${LIBRARY_ARCHIVE}" fi fi } configure_host() { setup_toolchain target:cmake cmake ${CMAKE_GENERATOR_NINJA} \ -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CONF} \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \ -DHEADERS_ONLY=ON \ ${KODI_ARCH} \ ${KODI_NEON} \ ${KODI_PLATFORM} .. } make_host() { : } makeinstall_host() { DESTDIR=${SYSROOT_PREFIX} cmake -DCMAKE_INSTALL_COMPONENT="kodi-addon-dev" -P cmake_install.cmake # more binaddons cross compile badness meh sed -e "s:INCLUDE_DIR /usr/include/kodi:INCLUDE_DIR ${SYSROOT_PREFIX}/usr/include/kodi:g" \ -e "s:CMAKE_MODULE_PATH /usr/lib/kodi /usr/share/kodi/cmake:CMAKE_MODULE_PATH ${SYSROOT_PREFIX}/usr/share/kodi/cmake:g" \ -i ${SYSROOT_PREFIX}/usr/lib/kodi/cmake/KodiConfig.cmake } pre_configure_target() { export LIBS="${LIBS} -lncurses" if [ "${KODI_DVDCSS_SUPPORT}" = yes ]; then KODI_LIBDVD="-DENABLE_DVDCSS=ON" prepare_libdvd_library libdvdcss else KODI_LIBDVD="-DENABLE_DVDCSS=OFF" fi prepare_libdvd_library libdvdnav prepare_libdvd_library libdvdread PKG_CMAKE_OPTS_TARGET+=" ${KODI_LIBDVD}" } post_make_target() { for libname in libdvdcss libdvdnav libdvdread; do if [ -f "${PKG_BUILD}/.${TARGET_NAME}/build/download/${libname}"* ]; then mkdir -p "${SOURCES}/${libname}" cp "${PKG_BUILD}/.${TARGET_NAME}/build/download/${libname}"* "${SOURCES}/${libname}" fi done } post_makeinstall_target() { mkdir -p ${INSTALL}/.noinstall mv ${INSTALL}/usr/share/kodi/addons/skin.estuary \ ${INSTALL}/usr/share/kodi/addons/service.xbmc.versioncheck \ ${INSTALL}/.noinstall rm -rf ${INSTALL}/usr/bin/kodi rm -rf ${INSTALL}/usr/bin/kodi-standalone rm -rf ${INSTALL}/usr/bin/xbmc rm -rf ${INSTALL}/usr/bin/xbmc-standalone rm -rf ${INSTALL}/usr/share/kodi/cmake rm -rf ${INSTALL}/usr/share/applications rm -rf ${INSTALL}/usr/share/icons rm -rf ${INSTALL}/usr/share/pixmaps rm -rf ${INSTALL}/usr/share/xsessions mkdir -p ${INSTALL}/usr/lib/kodi cp ${PKG_DIR}/scripts/kodi-config ${INSTALL}/usr/lib/kodi cp ${PKG_DIR}/scripts/kodi-after ${INSTALL}/usr/lib/kodi cp ${PKG_DIR}/scripts/kodi-safe-mode ${INSTALL}/usr/lib/kodi cp ${PKG_DIR}/scripts/kodi.sh ${INSTALL}/usr/lib/kodi # Configure safe mode triggers - default 5 restarts within 900 seconds/15 minutes sed -e "s|@KODI_MAX_RESTARTS@|${KODI_MAX_RESTARTS:-5}|g" \ -e "s|@KODI_MAX_SECONDS@|${KODI_MAX_SECONDS:-900}|g" \ -i ${INSTALL}/usr/lib/kodi/kodi.sh if [ "${KODI_PIPEWIRE_SUPPORT}" = "yes" ]; then KODI_AE_SINK="PIPEWIRE" elif [ "${KODI_PULSEAUDIO_SUPPORT}" = "yes" -a "${KODI_ALSA_SUPPORT}" = "yes" ]; then KODI_AE_SINK="ALSA+PULSE" elif [ "${KODI_PULSEAUDIO_SUPPORT}" = "yes" -a "${KODI_ALSA_SUPPORT}" != "yes" ]; then KODI_AE_SINK="PULSE" elif [ "${KODI_PULSEAUDIO_SUPPORT}" != "yes" -a "${KODI_ALSA_SUPPORT}" = "yes" ]; then KODI_AE_SINK="ALSA" fi # adjust audio output device to what was built sed "s/@KODI_AE_SINK@/${KODI_AE_SINK}/" ${PKG_DIR}/config/kodi.conf.in > ${INSTALL}/usr/lib/kodi/kodi.conf # set default display environment if [ "${DISPLAYSERVER}" = "x11" ]; then echo "DISPLAY=:0.0" >>${INSTALL}/usr/lib/kodi/kodi.conf elif [ "${DISPLAYSERVER}" = "wl" ]; then echo "WAYLAND_DISPLAY=wayland-1" >>${INSTALL}/usr/lib/kodi/kodi.conf fi # nvidia: Enable USLEEP to reduce CPU load while rendering if listcontains "${GRAPHIC_DRIVERS}" "nvidia" || listcontains "${GRAPHIC_DRIVERS}" "nvidia-legacy"; then echo "__GL_YIELD=USLEEP" >>${INSTALL}/usr/lib/kodi/kodi.conf fi mkdir -p ${INSTALL}/usr/sbin cp ${PKG_DIR}/scripts/service-addon-wrapper ${INSTALL}/usr/sbin mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/kodi-remote ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/setwakeup.sh ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/pastekodi ${INSTALL}/usr/bin ln -sf /usr/bin/pastekodi ${INSTALL}/usr/bin/pastecrash mkdir -p ${INSTALL}/usr/share/kodi/addons cp -R ${PKG_DIR}/config/repository.coreelec ${INSTALL}/usr/share/kodi/addons/${ADDON_REPO_ID} sed -e "s|@ADDON_URL@|${ADDON_URL}|g" -i ${INSTALL}/usr/share/kodi/addons/${ADDON_REPO_ID}/addon.xml sed -e "s|@ADDON_REPO_ID@|${ADDON_REPO_ID}|g" -i ${INSTALL}/usr/share/kodi/addons/${ADDON_REPO_ID}/addon.xml sed -e "s|@ADDON_REPO_NAME@|${ADDON_REPO_NAME}|g" -i ${INSTALL}/usr/share/kodi/addons/${ADDON_REPO_ID}/addon.xml sed -e "s|@ADDON_VERSION@|${ADDON_VERSION}|g" -i ${INSTALL}/usr/share/kodi/addons/${ADDON_REPO_ID}/addon.xml mkdir -p ${INSTALL}/usr/share/kodi/config ln -sf /run/libreelec/cacert.pem ${INSTALL}/usr/share/kodi/system/certs/cacert.pem mkdir -p ${INSTALL}/usr/share/kodi/system/settings ${PKG_DIR}/scripts/xml_merge.py ${PKG_DIR}/config/guisettings.xml \ ${PROJECT_DIR}/${PROJECT}/kodi/guisettings.xml \ ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/kodi/guisettings.xml \ >${INSTALL}/usr/share/kodi/config/guisettings.xml ${PKG_DIR}/scripts/xml_merge.py ${PKG_DIR}/config/sources.xml \ ${PROJECT_DIR}/${PROJECT}/kodi/sources.xml \ ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/kodi/sources.xml \ >${INSTALL}/usr/share/kodi/config/sources.xml ${PKG_DIR}/scripts/xml_merge.py ${PKG_DIR}/config/advancedsettings.xml \ ${PROJECT_DIR}/${PROJECT}/kodi/advancedsettings.xml \ ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/kodi/advancedsettings.xml \ >${INSTALL}/usr/share/kodi/system/advancedsettings.xml ${PKG_DIR}/scripts/xml_merge.py ${PKG_DIR}/config/appliance.xml \ ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/kodi/appliance.xml \ >${INSTALL}/usr/share/kodi/system/settings/appliance.xml mkdir -p ${INSTALL}/usr/cache/coreelec cp ${PKG_DIR}/config/network_wait ${INSTALL}/usr/cache/coreelec # update addon manifest ADDON_MANIFEST=${INSTALL}/usr/share/kodi/system/addon-manifest.xml xmlstarlet ed -L -d "/addons/addon[text()='service.xbmc.versioncheck']" ${ADDON_MANIFEST} xmlstarlet ed -L --subnode "/addons" -t elem -n "addon" -v "${ADDON_REPO_ID}" ${ADDON_MANIFEST} if [ -n "${DISTRO_PKG_SETTINGS}" ]; then xmlstarlet ed -L --subnode "/addons" -t elem -n "addon" -v "${DISTRO_PKG_SETTINGS_ID}" ${ADDON_MANIFEST} fi # more binaddons cross compile badness meh sed -e "s:INCLUDE_DIR /usr/include/kodi:INCLUDE_DIR ${SYSROOT_PREFIX}/usr/include/kodi:g" \ -e "s:CMAKE_MODULE_PATH /usr/lib/kodi /usr/share/kodi/cmake:CMAKE_MODULE_PATH ${SYSROOT_PREFIX}/usr/share/kodi/cmake:g" \ -i ${SYSROOT_PREFIX}/usr/lib/kodi/cmake/KodiConfig.cmake if [ "${KODI_EXTRA_FONTS}" = yes ]; then mkdir -p ${INSTALL}/usr/share/kodi/media/Fonts cp ${PKG_DIR}/fonts/*.ttf ${INSTALL}/usr/share/kodi/media/Fonts fi # Compile kodi Python site-packages to .pyc bytecode, and remove .py source code python_compile ${INSTALL}/usr/lib/${PKG_PYTHON_VERSION}/site-packages/kodi debug_strip ${INSTALL}/usr/lib/kodi/kodi.bin } post_install() { enable_service kodi.target enable_service kodi-autostart.service enable_service kodi-cleanlogs.service enable_service kodi-halt.service enable_service kodi-poweroff.service enable_service kodi-reboot.service enable_service kodi-waitonnetwork.service enable_service kodi.service enable_service kodi-lirc-suspend.service enable_service kodi-cleanpackagecache.service } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/profile.d/00-addons.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # addons profile.d/*.profile for config in /storage/.kodi/addons/*/profile.d/*.profile; do if [ -f "${config}" ] ; then . ${config} fi done oe_setup_addon() { if [ ! -z ${1} ] ; then DEF="/storage/.kodi/addons/${1}/settings-default.xml" CUR="/storage/.kodi/userdata/addon_data/${1}/settings.xml" # export some useful variables ADDON_DIR="${HOME}/.kodi/addons/${1}" ADDON_HOME="${HOME}/.kodi/userdata/addon_data/${1}" ADDON_LOG_FILE="${ADDON_HOME}/service.log" [ ! -d ${ADDON_HOME} ] && mkdir -p ${ADDON_HOME} # copy defaults if [ -f "${DEF}" -a ! -f "${CUR}" ] ; then cp "${DEF}" "${CUR}" fi # parse config for xml_file in "${DEF}" "${CUR}"; do if [ -f "${xml_file}" ]; then XML_SETTINGS_VER="$(xmlstarlet sel -t -m settings -v @version ${xml_file})" if [ "${XML_SETTINGS_VER}" = "2" ]; then eval $(xmlstarlet sel -t -m settings/setting -v @id -o "=" -v . -n "${xml_file}" | sed -e "s/'/'\\\\''/g; s/=/='/; s/$/'/") else eval $(xmlstarlet sel -t -m settings -m setting -v @id -o "=" -v @value -n "${xml_file}" | sed -e "s/'/'\\\\''/g; s/=/='/; s/$/'/") fi fi done fi } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/profile.d/99-kodi.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # PATH for addon in /storage/.kodi/addons/*/bin /usr/lib/kodi/addons/*/bin; do [ -d "${addon}" ] && PATH="${PATH}:${addon}" done export PATH # LD_LIBRARY_PATH for addon in /storage/.kodi/addons/*/lib /usr/lib/kodi/addons/*/lib; do [ -d "${addon}" ] && LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${addon}" done export LD_LIBRARY_PATH ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/scripts/kodi-after ================================================ #!/bin/sh # # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Team CoreELEC (https://coreelec.org) BOOT_STATUS=${HOME}/.config/boot.status BOOT_HINT=${HOME}/.config/boot.hint BOOT_STATE="$(cat ${BOOT_STATUS} 2>/dev/null)" process_boot_hint() { if [ "${BOOT_STATE}" = "OK" ]; then echo "OK" > ${BOOT_HINT} fi return 0 } process_boot_hint exit 0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/scripts/kodi-config ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) KODI_ROOT=${HOME}/.kodi BOOT_STATE="$(cat ${HOME}/.config/boot.status 2>/dev/null)" # May not exist if testing a clean /storage/.kodi without rebooting mkdir -p ${KODI_ROOT}/userdata # hack: make addon-bins executable # done in kodi on addon install. but just in case.. chmod +x ${KODI_ROOT}/addons/*/bin/* 2>/dev/null # remove any user installed CE repo [ -d ${KODI_ROOT}/addons/repository.coreelec ] && rm -rf ${KODI_ROOT}/addons/repository.coreelec # setup Kodi sources if [ ! -f ${KODI_ROOT}/userdata/sources.xml ]; then if [ -f /usr/share/kodi/config/sources.xml ]; then cp /usr/share/kodi/config/sources.xml ${KODI_ROOT}/userdata fi fi #choose libCEC version, default is libcec package version ln -sf /usr/lib/libcec.so.6.0.2 /var/lib/libcec.so.6 # common setup guisettings if [ ! -f ${KODI_ROOT}/userdata/guisettings.xml ] ; then if [ -f /usr/share/kodi/config/guisettings.xml ]; then cp /usr/share/kodi/config/guisettings.xml ${KODI_ROOT}/userdata fi if [ "${BOOT_STATE}" = "SAFE" ]; then [ ! -f ${KODI_ROOT}/userdata/guisettings.xml ] && echo '<settings version="2"></settings>' > ${KODI_ROOT}/userdata/guisettings.xml xmlstarlet ed --omit-decl --inplace -s settings -t elem -n setting -v "maroon" -i settings/setting -t attr -n id -v lookandfeel.skincolors ${KODI_ROOT}/userdata/guisettings.xml fi fi KODI_ARGS="" echo "KODI_ARGS=\"${KODI_ARGS}\"" > /run/libreelec/kodi.conf if [ "$(uname -m)" = "x86_64" ]; then echo "MALLOC_MMAP_THRESHOLD_=524288" >> /run/libreelec/kodi.conf else #arm echo "MALLOC_MMAP_THRESHOLD_=8192" >> /run/libreelec/kodi.conf fi if [ -f /storage/.config/kodi.conf ] ; then cat /storage/.config/kodi.conf >>/run/libreelec/kodi.conf fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/scripts/kodi-remote ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) echo "Supported keys: ← ↑ ↓ → Left | Up | Down | Right Context Menu c Player Debug d Fullscreen f Info i Codec Info o Pause p Screenshot s Skin Debug t Stop x Volume Down - Volume Up + Back Backspace Select Enter Quit Remote q or ctrl+c " com() { kodi-send --action="${1}" > /dev/null 2>&1 echo -ne "\r${1}\e[K"; } while true; do read -r -sn1 k case "${k}" in A) com "Up";; B) com "Down";; C) com "Right";; D) com "Left";; c) com "ContextMenu";; d) com "PlayerDebug";; f) com "FullScreen";; i) com "Info";; o) com "CodecInfo";; p) com "Pause";; s) com "TakeScreenshot";; t) com "Skin.ToggleDebug";; x) com "Stop";; -) com "VolumeDown";; +) com "VolumeUp";; $'\177') com "Back";; "") com "Select";; q) exit esac done ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/scripts/kodi-safe-mode ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) KODI_ROOT=${HOME}/.kodi KODI_ROOT_FAILED=${KODI_ROOT}.FAILED BOOT_STATUS=${HOME}/.config/boot.status process_boot_status() { BOOT_STATE="$(cat ${BOOT_STATUS} 2>/dev/null)" if [ "${BOOT_STATE}" = "SAFE" ]; then if [ ! -d ${KODI_ROOT_FAILED} ]; then # entering safe mode - rename failed .kodi, and restart with clean .kodi mv ${KODI_ROOT} ${KODI_ROOT_FAILED} reboot else # exiting safe mode - restore failed .kodi rm -fr ${KODI_ROOT} mv ${KODI_ROOT_FAILED} ${KODI_ROOT} echo "OK" > ${BOOT_STATUS} fi else echo "OK" > ${BOOT_STATUS} fi return 0 } process_boot_status exit 0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/scripts/kodi.sh ================================================ #!/bin/sh # Copyright (C) 2008-2013 Team XBMC # http://xbmc.org # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. . /etc/profile trap cleanup TERM KODI_ROOT=${HOME}/.kodi SAVED_ARGS="${@}" CRASHLOG_DIR=${KODI_ROOT}/temp BOOT_STATUS=${HOME}/.config/boot.status NOSAFE_MODE=${HOME}/.config/safemode.disable CRASH_HIST=/run/libreelec/crashes.dat KODI_MAX_RESTARTS=@KODI_MAX_RESTARTS@ KODI_MAX_SECONDS=@KODI_MAX_SECONDS@ cleanup() { # make systemd happy by not exiting immediately but # wait for kodi to exit while killall -0 kodi.bin &>/dev/null; do sleep 0.5 done } command_exists() { command -v ${1} &>/dev/null } single_stacktrace() { # core filename is "core.*kodi.bin.*" find "${1}" -name 'core.*kodi.bin.*' | while read core; do echo "=====> Core file: "${core}"" >> ${FILE} echo " =========================================" >> ${FILE} if [ -f /storage/.config/debug.enhanced ]; then gdb /usr/lib/kodi/kodi.bin --core="${core}" --batch -ex "thread apply all bt full" -ex "info registers" -ex "set print asm-demangle on" -ex "disassemble" 2>/dev/null >> ${FILE} else gdb /usr/lib/kodi/kodi.bin --core="${core}" --batch -ex "thread apply all bt" 2>/dev/null >> ${FILE} fi rm -f "${core}" done } detect_crash_loop() { # use monotonic time (in case date/time changes after booting) NOW_TIME=$(awk '/^now/ {print int(${3} / 1000000000)}' /proc/timer_list) echo "${NOW_TIME}" >> ${CRASH_HIST} NUM_RESTARTS=$(wc -l ${CRASH_HIST} | cut -d' ' -f1) FIRST_RESTART_TIME=$(tail -n ${KODI_MAX_RESTARTS} ${CRASH_HIST} | head -n 1) # kodi restart loop detected? fail this kodi install if [ ${NUM_RESTARTS} -ge ${KODI_MAX_RESTARTS} -a ${KODI_MAX_SECONDS} -ge $((NOW_TIME - FIRST_RESTART_TIME)) ]; then return 0 else return 1 fi } activate_safe_mode() { [ -f ${NOSAFE_MODE} ] && return 0 BOOT_STATE="$(cat ${BOOT_STATUS} 2>/dev/null)" if [ "${BOOT_STATE:-OK}" = "OK" ]; then # generate logfiles zip for the failed kodi /usr/bin/createlog lastlog=$(ls -1 /storage/logfiles/*.zip | tail -n 1) mv ${lastlog} /storage/logfiles/log-$(date -u +%Y-%m-%d-%H.%M.%S)-FAILED.zip echo "SAFE" > ${BOOT_STATUS} fi return 0 } print_crash_report() { mkdir -p ${CRASHLOG_DIR} DATE=`date +%Y%m%d%H%M%S` FILE="${CRASHLOG_DIR}/.kodi_crashlog.log" echo "############## kodi CRASH LOG ###############" > ${FILE} echo >> ${FILE} echo "################ SYSTEM INFO ################" >> ${FILE} echo -n " Date: " >> ${FILE} date >> ${FILE} echo " kodi Options: ${SAVED_ARGS}" >> ${FILE} echo -n " Arch: " >> ${FILE} uname -m >> ${FILE} echo -n " Kernel: " >> ${FILE} uname -rvs >> ${FILE} echo -n " Release: " >> ${FILE} . /etc/os-release echo ${NAME} ${VERSION} >> ${FILE} echo "############## END SYSTEM INFO ##############" >> ${FILE} echo >> ${FILE} echo "############### STACK TRACE #################" >> ${FILE} if command_exists gdb; then single_stacktrace /storage/.cache/cores else echo "gdb not installed, can't get stack trace." >> ${FILE} fi echo "############# END STACK TRACE ###############" >> ${FILE} echo >> ${FILE} echo "################# LOG FILE ##################" >> ${FILE} echo >> ${FILE} cat ${KODI_ROOT}/temp/kodi.log >> ${FILE} echo >> ${FILE} echo "############### END LOG FILE ################" >> ${FILE} echo >> ${FILE} echo "############ END kodi CRASH LOG #############" >> ${FILE} OFILE="${FILE}" FILE="${CRASHLOG_DIR}/kodi_crashlog_${DATE}.log" mv "${OFILE}" "${FILE}" ln -sf "$(basename ${FILE})" "${CRASHLOG_DIR}/kodi_crash.log" echo "Crash report available at ${FILE}" } if command_exists gdb; then ulimit -c unlimited fi # clean up any stale cores. just in case find /storage/.cache/cores -type f -delete # clean zero-byte database files that prevent migration/startup for file in ${KODI_ROOT}/userdata/Database/*.db; do if [ -e "${file}" ]; then [ -s ${file} ] || rm -f ${file} fi done if [ -n "${KODI_AE_SINK}" ]; then echo "KODI_AE_SINK env variable is deprecated and will be removed in the future." echo "Use the --audio-backend command line switch instead." if [ "${KODI_AE_SINK}" = "PIPEWIRE" ]; then ENV_ARGS="--audio-backend=pipewire" elif [ "${KODI_AE_SINK}" = "PULSE" ]; then ENV_ARGS="--audio-backend=pulseaudio" elif [ "${KODI_AE_SINK}" = "ALSA" ]; then ENV_ARGS="--audio-backend=alsa" elif [ "${KODI_AE_SINK}" = "SNDIO" ]; then ENV_ARGS="--audio-backend=sndio" elif [ "${KODI_AE_SINK}" = "ALSA+PULSE" ]; then ENV_ARGS="--audio-backend=alsa+pulseaudio" fi fi /usr/lib/kodi/kodi.bin ${ENV_ARGS} ${SAVED_ARGS} RET=$? if [ $(( (${RET} >= 131 && ${RET} <= 136) || ${RET} == 139 )) = "1" ] ; then # Crashed with core dump print_crash_report # Cleanup. Keep only youngest 10 reports but current in any case rm -f $(ls -1t ${CRASHLOG_DIR}/kodi_crashlog_*.log | grep -v "${FILE}" | tail -n +10) # Enable safe mode if a crash loop is detected detect_crash_loop && activate_safe_mode fi # Filter Kodi powerdown/restartapp/reboot codes to satisfy systemd [ "${RET}" -ge 64 -a "${RET}" -le 66 ] && RET=0 exit ${RET} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/scripts/pastekodi ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2019-present Team CoreELEC (https://coreelec.org) cat_data() { echo "========== ${1} ==========" cat } cat_file() { if [ -f "${1}" ]; then cat "${1}" | cat_data "${2:-${1}}" fi } usage() { [ -n "${1}" ] && echo "Unknown argument: ${1}" cat <<EOF Usage: ${0} [-c] [-h] -c send output to stdout not via /usr/bin/pastebinit -h this help message EOF exit 1 } OUTPUT="/usr/bin/pastebinit" while getopts ":hc" opt; do case ${opt} in c) OUTPUT="cat";; ?) usage "${OPTARG}";; h) usage;; esac done source /etc/os-release SYSTEM_ARCH="${COREELEC_ARCH#*.}" # If running in SAFE mode, send FAILED logs if [ "$(cat "/storage/.config/boot.status" 2>/dev/null)" = "SAFE" ]; then KODI_ROOT="/storage/.kodi.FAILED/temp" else KODI_ROOT="/storage/.kodi/temp" fi if [ "$(basename ${0})" = "pastekodi" ]; then LOG_TYPE="System" LOG_FILE="${KODI_ROOT}/kodi.log" else LOG_TYPE="Crash" LOG_FILE="${KODI_ROOT}/kodi_crash.log" fi ( echo "${LOG_TYPE} log output for: $(lsb_release)" if [ "${SYSTEM_ARCH}" = "x86_64" ]; then if [ -d "/sys/firmware/efi" ]; then echo "Firmware Boot Mode: EFI" else echo "Firmware Boot Mode: BIOS" fi fi if [ "${COREELEC_PROJECT}" = "RPi" ]; then echo "RPi Hardware Revision: $(vcgencmd otp_dump | grep 30: | cut -d: -f2)" fi cat_file "${LOG_FILE}" journalctl -a -b -0 -o short-precise | cat_data "journalctl -a -b -0" if [ "${COREELEC_PROJECT}" = "RPi" ]; then bootloader_version="$(vcgencmd bootloader_version)" if ! echo "${bootloader_version}" | grep -q "Command not registered"; then echo "${bootloader_version}" | cat_data "Bootloader version" fi fi cat_file "/flash/config.txt" # RPi cat_file "/flash/distroconfig.txt" # RPi cat_file "/flash/cmdline.txt" # RPi cat_file "/flash/syslinux.cfg" # x86 BIOS cat_file "/flash/EFI/BOOT/syslinux.cfg" # x86 EFI cat_file "/flash/extlinux.conf" # x86 legacy cat_file "/flash/extlinux/extlinux.conf" # u-boot cat_file "${KODI_ROOT}/.smb/smb.conf" cat_file "${KODI_ROOT}/.smb/user.conf" cat_file "/run/samba/smb.conf" pem_sys="$(sha256sum /etc/ssl/cacert.pem.system | cut -d' ' -f1)" pem_run="$(sha256sum /run/libreelec/cacert.pem | cut -d' ' -f1)" if [ "${pem_sys}" = "${pem_run}" ]; then cat_data "/run/libreelec/cacert.pem is default" </dev/null else cat_file /run/libreelec/cacert.pem "/run/libreelec/cacert.pem (modified)" fi if [ "${COREELEC_PROJECT}" = "Amlogic-ce" ]; then ce-debug -l | cat_data "ce-debug -l" fi ) | ${OUTPUT} 2>/dev/null ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/scripts/service-addon-wrapper ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) if [ $# -ne 3 ] ; then echo "${0} usage: context addon-id addon-path" exit 1 fi CONTEXT="${1}" ADDON_ID="${2}" ADDON_PATH="${3}" if [ ! -d /storage/.config/system.d ] ; then mkdir -p /storage/.config/system.d fi SERVICE_FILE="${ADDON_PATH}/system.d/${ADDON_ID}.service" if [ -f "${SERVICE_FILE}" ] ; then case "${CONTEXT}" in enable) systemctl enable "${SERVICE_FILE}" chmod +x "${ADDON_PATH}/bin"/* systemctl start "${ADDON_ID}.service" ;; disable | pre-uninstall) systemctl stop "${ADDON_ID}.service" systemctl disable "${ADDON_ID}.service" ;; post-update) # post-update is triggered on update, # make sure to stop and re-install service systemctl stop "${ADDON_ID}.service" systemctl disable "${ADDON_ID}.service" systemctl enable "${SERVICE_FILE}" chmod +x "${ADDON_PATH}/bin"/* systemctl start "${ADDON_ID}.service" ;; restart) systemctl restart "${ADDON_ID}.service" ;; reload) systemctl reload "${ADDON_ID}.service" ;; *) echo "${0}: unknown service context ${CONTEXT}" exit 1 ;; esac fi if [ ! -d /storage/.cache/kernel-overlays ] ; then mkdir -p /storage/.cache/kernel-overlays fi # kernel-overlay addons built into the image have their # files installed in the default /usr/lib/kernel-overlays # location, not inside the kodi addon dir case "${ADDON_PATH}" in /usr/share/kodi/addons/*) OVERLAY_PATH="/usr/lib/kernel-overlays/${ADDON_ID}" ;; *) OVERLAY_PATH="${ADDON_PATH}/kernel-overlay" ;; esac create_overlay_conf() { rm -f "${OVERLAY_CONF}" echo "${OVERLAY_PATH}" > "${OVERLAY_CONF}" } if [ -d "${OVERLAY_PATH}" ] ; then OVERLAY_CONF="/storage/.cache/kernel-overlays/50-${ADDON_ID}.conf" case "${CONTEXT}" in enable | post-update ) create_overlay_conf ;; disable | pre-uninstall ) rm -f "${OVERLAY_CONF}" ;; update ) if [ -e "${OVERLAY_CONF}" ] ; then create_overlay_conf fi ;; *) echo "${0}: unknown overlay context ${CONTEXT}" exit 1 ;; esac fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/scripts/setwakeup.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) if [ -f /sys/class/rtc/rtc0/wakealarm ]; then logger -t setwakeup.sh "### Setting system wakeup time ###" echo 0 > /sys/class/rtc/rtc0/wakealarm echo ${1} > /sys/class/rtc/rtc0/wakealarm logger -t setwakeup.sh "### $(cat /proc/driver/rtc) ###" fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/scripts/xml_merge.py ================================================ #!/usr/bin/env python3 # taken from http://stackoverflow.com/a/14879370 with minor modifications from __future__ import print_function import os import sys import xml.dom.minidom from xml.etree import ElementTree as et def printerr(*args, **kwargs): print(*args, file=sys.stderr, **kwargs) class hashabledict(dict): def __hash__(self): return hash(tuple(sorted(self.items()))) class XMLCombiner(object): def __init__(self, filenames): if len(filenames) == 0: raise Exception('No filenames!') try: self.roots = [] for f in filenames: self.roots.append(et.parse(f).getroot()) except xml.etree.ElementTree.ParseError: printerr("ERROR: Unable to parse XML file %s" % f) raise def prettyPrint(self, etree_xml): minidom = xml.dom.minidom.parseString(et.tostring(etree_xml)) return "\n".join([line for line in minidom.toprettyxml(indent=" ", encoding="utf-8").decode('utf-8').split('\n') if line.strip() != ""]) def combine(self): for r in self.roots[1:]: self.combine_element(self.roots[0], r) return self.prettyPrint(self.roots[0]) def combine_element(self, one, other): mapping = {(el.tag, hashabledict(el.attrib)): el for el in one} for el in other: if len(el) == 0: try: mapping[(el.tag, hashabledict(el.attrib))].text = el.text except KeyError: mapping[(el.tag, hashabledict(el.attrib))] = el one.append(el) else: try: self.combine_element(mapping[(el.tag, hashabledict(el.attrib))], el) except KeyError: mapping[(el.tag, hashabledict(el.attrib))] = el one.append(el) if __name__ == '__main__': xmlfiles = [file for file in sys.argv[1:] if os.path.exists(file)] r = XMLCombiner(xmlfiles).combine() print(r) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/sleep.d/openelec-sleep.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /etc/profile run_scripts() { list_scripts ${1} for script in ${SCRIPTS} ; do progress "running sleep script ${script} (${1})..." sh /usr/lib/systemd/system-sleep.serial/${script} ${1} done } list_scripts() { case ${1} in pre) SCRIPTS=$(ls /usr/lib/systemd/system-sleep.serial/ | sort) ;; post) SCRIPTS=$(ls /usr/lib/systemd/system-sleep.serial/ | sort -r) ;; esac } run_scripts ${1} exit 0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/sleep.d/wifi.power ================================================ #!/bin/sh case "${1}" in pre) ;; post) connmanctl disable wifi sleep 5 connmanctl enable wifi ;; esac ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/sleep.d.serial/10-addon-sleep.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /etc/profile # see https://wiki.archlinux.org/index.php/Power_Management#Hooks_in_.2Fusr.2Flib.2Fsystemd.2Fsystem-sleep for script in ${HOME}/.kodi/addons/*/sleep.d/*.power; do if [ -f ${script} ]; then progress "running addon sleep script ${script} (${@})..." sh ${script} ${@} fi done exit 0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/sleep.d.serial/20-custom-sleep.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) . /etc/profile # see https://wiki.archlinux.org/index.php/Power_Management#Hooks_in_.2Fusr.2Flib.2Fsystemd.2Fsystem-sleep for script in ${HOME}/.config/sleep.d/*.power; do if [ -f ${script} ]; then progress "running custom sleep script ${script} (${@})..." sh ${script} ${@} fi done exit 0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/system.d/kodi-autostart.service ================================================ [Unit] Description=Kodi user autostart script Before=kodi.service After=network-online.target graphical.target [Service] Type=oneshot Environment=HOME=/storage ExecStart=-/bin/sh -c ". /etc/profile; test -f /storage/.config/autostart.sh && exec /bin/sh /storage/.config/autostart.sh" ExecStop=-/bin/sh -c ". /etc/profile; test -f /storage/.config/autostop.sh && exec /bin/sh /storage/.config/autostop.sh" RemainAfterExit=yes TimeoutStopSec=5min [Install] WantedBy=kodi.service ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/system.d/kodi-cleanlogs.service ================================================ [Unit] Description=Kodi clean debug logs ConditionKernelCommandLine=!debugging ConditionPathExists=!/storage/.cache/debug.libreelec Before=kodi.service [Service] Type=oneshot ExecStart=-/bin/sh -c 'rm -rf /storage/.kodi/userdata/addon_data/*/*.log /storage/.kodi/userdata/addon_data/*/log/*' RemainAfterExit=yes [Install] WantedBy=kodi.service ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/system.d/kodi-cleanpackagecache.service ================================================ [Unit] Description=Kodi clean package cache ConditionPathExists=/storage/.kodi/addons/packages Before=kodi.service [Service] Type=oneshot ExecStart=-/bin/sh -c 'rm -rf /storage/.kodi/addons/packages' RemainAfterExit=yes [Install] WantedBy=kodi.service ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/system.d/kodi-halt.service ================================================ [Unit] Description=Kodi halt script After=kodi.service Before=systemd-halt.service DefaultDependencies=no [Service] Type=oneshot Environment=HOME=/storage ExecStartPre=-/usr/lib/kodi/kodi-after ExecStart=-/bin/sh -c ". /etc/profile; exec /bin/sh /storage/.config/shutdown.sh halt" RemainAfterExit=yes [Install] WantedBy=halt.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/system.d/kodi-lirc-suspend.service ================================================ [Unit] Description=LIRC sleep hook Before=sleep.target StopWhenUnneeded=yes [Service] Type=oneshot RemainAfterExit=yes ExecStart=-/usr/bin/kodi-send --host=127.0.0.1 -a "LIRC.Stop" ExecStop=-/usr/bin/kodi-send --host=127.0.0.1 -a "LIRC.Start" [Install] WantedBy=sleep.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/system.d/kodi-poweroff.service ================================================ [Unit] Description=Kodi poweroff script After=kodi.service Before=systemd-poweroff.service DefaultDependencies=no [Service] Type=oneshot Environment=HOME=/storage ExecStartPre=-/usr/lib/kodi/kodi-after ExecStart=-/bin/sh -c ". /etc/profile; exec /bin/sh /storage/.config/shutdown.sh poweroff" RemainAfterExit=yes [Install] WantedBy=poweroff.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/system.d/kodi-reboot.service ================================================ [Unit] Description=Kodi reboot script After=kodi.service Before=systemd-reboot.service DefaultDependencies=no [Service] Type=oneshot Environment=HOME=/storage ExecStartPre=-/usr/lib/kodi/kodi-after ExecStart=-/bin/sh -c ". /etc/profile; exec /bin/sh /storage/.config/shutdown.sh reboot" RemainAfterExit=yes [Install] WantedBy=reboot.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/system.d/kodi-waitonnetwork.service ================================================ [Unit] Description=Wait on network After=connman.service Before=network-online.target DefaultDependencies=no Conflicts=shutdown.target ConditionFileNotEmpty=/storage/.cache/coreelec/network_wait ConditionPathExists=!/dev/.kernel_ipconfig ConditionPathExists=/storage/.kodi/userdata/addon_data/service.coreelec.settings/oe_settings.xml [Service] Type=oneshot EnvironmentFile=/storage/.cache/coreelec/network_wait ExecStart=/usr/bin/wait-time-sync --timeout ${WAIT_NETWORK_TIME} StandardOutput=tty RemainAfterExit=yes SuccessExitStatus=1 [Install] WantedBy=network-online.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/system.d/kodi.service ================================================ [Unit] Description=Kodi Media Center After=network-online.target graphical.target Requires=graphical.target Wants=network-online.target [Service] EnvironmentFile=/usr/lib/kodi/kodi.conf EnvironmentFile=-/run/libreelec/kodi.conf EnvironmentFile=-/run/libreelec/debug/kodi.conf ExecStartPre=-/usr/lib/kodi/kodi-config ExecStart=/usr/lib/kodi/kodi.sh --standalone -fs ${KODI_ARGS} ${KODI_DEBUG} ExecStop=/bin/kill -TERM ${MAINPID} ExecStopPost=-/usr/lib/kodi/kodi-safe-mode TimeoutStopSec=30 Restart=always RestartSec=2 StartLimitInterval=0 LimitNOFILE=16384 TimeoutStartSec=300 [Install] WantedBy=kodi.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/system.d/kodi.target ================================================ [Unit] Description=Kodi Mediacenter Interface Requires=multi-user.target graphical.target network-online.target After=network-online.target graphical.target Wants=network-online.target Conflicts=rescue.target AllowIsolate=yes [Install] Alias=default.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/tmpfiles.d/kodi-userdirs.conf ================================================ # 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) d /storage/downloads 0755 root root - - d /storage/emulators 0755 root root - - d /storage/music 0755 root root - - d /storage/picons/tvh 0755 root root - - d /storage/picons/vdr 0755 root root - - d /storage/pictures 0755 root root - - d /storage/recordings 0755 root root - - d /storage/screenshots 0755 root root - - d /storage/tvshows 0755 root root - - d /storage/videos 0755 root root - - d /storage/.kodi/userdata 0755 root root - - ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/mediacenter/kodi/tmpfiles.d/kodi.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) d /run/kodi 0755 root root - - ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/multimedia/libamcodec/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="libamcodec" PKG_VERSION="ae029843502409bd5d4dfe31193f2421384281bc" PKG_SHA256="236d611e574b7c7e7955dc5580ef9426a09e22d6b4efdee7aa9d73084d4ce24b" PKG_LICENSE="proprietary" PKG_SITE="http://openlinux.amlogic.com" PKG_SOURCE_NAME="libamcodec-aarch64-${PKG_VERSION}.tar.xz" PKG_URL="https://sources.coreelec.org/${PKG_SOURCE_NAME}" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="libamplayer: Interface library for Amlogic media codecs" PKG_TOOLCHAIN="manual" make_target() { cp -PR * $SYSROOT_PREFIX } makeinstall_target() { mkdir -p $INSTALL/usr cp -PR usr/lib $INSTALL/usr } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/multimedia/libdovi/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) PKG_NAME="libdovi" PKG_VERSION="3.3.1" PKG_SITE="https://github.com/quietvoid/dovi_tool" PKG_DEPENDS_TARGET="toolchain" if [ "${BUILD_FROM_SRC}" = "yes" ]; then PKG_SHA256="4cd7a4c418fd8af1da13278ce7524c15b7fdf61e1fe53663aa291c68c5062777" PKG_URL="https://github.com/quietvoid/dovi_tool/archive/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET+=" cargo-c:host" else case "${TARGET_ARCH}" in "arm") PKG_SHA256="9dc360de883c627014e8f36fe92950033e49ade1f94d596f58f0b26aab978fe1" ;; "aarch64") PKG_SHA256="e6e0bb82198a58a58cd38bbb2a6d286ff9d024ad35f490ff4b127ea415521457" ;; esac PKG_SOURCE_NAME="${PKG_NAME}-${ARCH}-${PKG_VERSION}.tar.xz" PKG_URL="https://sources.coreelec.org/${PKG_SOURCE_NAME}" fi PKG_LICENSE="MIT" PKG_LONGDESC="dovi_tool is a CLI tool combining multiple utilities for working with Dolby Vision." PKG_TOOLCHAIN="manual" if [ "${BUILD_FROM_SRC}" = "yes" ]; then pre_make_target() { CARGO_BASE_OPTS="--manifest-path ${PKG_BUILD}/dolby_vision/Cargo.toml \ --target ${TARGET_NAME}" CARGO_BUILD_OPTS="--library-type staticlib \ --profile release \ --prefix /usr ${CARGO_BASE_OPTS}" } make_target() { cargo fetch ${CARGO_BASE_OPTS} cargo cbuild ${CARGO_BUILD_OPTS} } makeinstall_target() { cargo cinstall ${CARGO_BUILD_OPTS} --destdir ${SYSROOT_PREFIX} cargo cinstall ${CARGO_BUILD_OPTS} --destdir ${INSTALL} } else make_target() { cp -PR * ${SYSROOT_PREFIX} } makeinstall_target() { : # } fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/multimedia/obu_util/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="obu_util" PKG_VERSION="0.1" PKG_SHA256="" PKG_LICENSE="GPL" PKG_SITE="https://aomedia.googlesource.com/aom/+/refs/tags/v3.3.0/av1/common/obu_util.c" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="av1 obu_util" PKG_TOOLCHAIN="manual" make_target() { ${CC} *.c -c -I. ${CFLAGS} ${AR} -rcs libobu_util.a *.o ${RANLIB} libobu_util.a } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/{lib,include} cp libobu_util.a ${SYSROOT_PREFIX}/usr/lib cp obu_util.h aom_codec.h aom_image.h aom_integer.h ${SYSROOT_PREFIX}/usr/include } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/multimedia/obu_util/sources/aom_codec.h ================================================ /* * Copyright (c) 2016, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ /////////////////////////////////////////////////////////////////////////////// // Internal implementation details /////////////////////////////////////////////////////////////////////////////// // // There are two levels of interfaces used to access the AOM codec: the // the aom_codec_iface and the aom_codec_ctx. // // 1. aom_codec_iface_t // (Related files: aom/aom_codec.h, aom/src/aom_codec.c, // aom/internal/aom_codec_internal.h, av1/av1_cx_iface.c, // av1/av1_dx_iface.c) // // Used to initialize the codec context, which contains the configuration for // for modifying the encoder/decoder during run-time. See the other // documentation in this header file for more details. For the most part, // users will call helper functions, such as aom_codec_iface_name, // aom_codec_get_caps, etc., to interact with it. // // The main purpose of the aom_codec_iface_t is to provide a way to generate // a default codec config, find out what capabilities the implementation has, // and create an aom_codec_ctx_t (which is actually used to interact with the // codec). // // Note that the implementations for the AV1 algorithm are located in // av1/av1_cx_iface.c and av1/av1_dx_iface.c // // // 2. aom_codec_ctx_t // (Related files: aom/aom_codec.h, av1/av1_cx_iface.c, av1/av1_dx_iface.c, // aom/aomcx.h, aom/aomdx.h, aom/src/aom_encoder.c, aom/src/aom_decoder.c) // // The actual interface between user code and the codec. It stores the name // of the codec, a pointer back to the aom_codec_iface_t that initialized it, // initialization flags, a config for either encoder or the decoder, and a // pointer to internal data. // // The codec is configured / queried through calls to aom_codec_control, // which takes a control ID (listed in aomcx.h and aomdx.h) and a parameter. // In the case of "getter" control IDs, the parameter is modified to have // the requested value; in the case of "setter" control IDs, the codec's // configuration is changed based on the parameter. Note that a aom_codec_err_t // is returned, which indicates if the operation was successful or not. // // Note that for the encoder, the aom_codec_alg_priv_t points to the // the aom_codec_alg_priv structure in av1/av1_cx_iface.c, and for the decoder, // the struct in av1/av1_dx_iface.c. Variables such as AV1_COMP cpi are stored // here and also used in the core algorithm. // // At the end, aom_codec_destroy should be called for each initialized // aom_codec_ctx_t. /*!\defgroup codec Common Algorithm Interface * This abstraction allows applications to easily support multiple video * formats with minimal code duplication. This section describes the interface * common to all codecs (both encoders and decoders). * @{ */ /*!\file * \brief Describes the codec algorithm interface to applications. * * This file describes the interface between an application and a * video codec algorithm. * * An application instantiates a specific codec instance by using * aom_codec_dec_init() or aom_codec_enc_init() and a pointer to the * algorithm's interface structure: * <pre> * my_app.c: * extern aom_codec_iface_t my_codec; * { * aom_codec_ctx_t algo; * int threads = 4; * aom_codec_dec_cfg_t cfg = { threads, 0, 0, 1 }; * res = aom_codec_dec_init(&algo, &my_codec, &cfg, 0); * } * </pre> * * Once initialized, the instance is managed using other functions from * the aom_codec_* family. */ #ifndef AOM_AOM_AOM_CODEC_H_ #define AOM_AOM_AOM_CODEC_H_ #ifdef __cplusplus extern "C" { #endif #include "aom_image.h" #include "aom_integer.h" /*!\brief Decorator indicating a function is deprecated */ #ifndef AOM_DEPRECATED #if defined(__GNUC__) && __GNUC__ #define AOM_DEPRECATED __attribute__((deprecated)) #elif defined(_MSC_VER) #define AOM_DEPRECATED #else #define AOM_DEPRECATED #endif #endif /* AOM_DEPRECATED */ #ifndef AOM_DECLSPEC_DEPRECATED #if defined(__GNUC__) && __GNUC__ #define AOM_DECLSPEC_DEPRECATED /**< \copydoc #AOM_DEPRECATED */ #elif defined(_MSC_VER) /*!\brief \copydoc #AOM_DEPRECATED */ #define AOM_DECLSPEC_DEPRECATED __declspec(deprecated) #else #define AOM_DECLSPEC_DEPRECATED /**< \copydoc #AOM_DEPRECATED */ #endif #endif /* AOM_DECLSPEC_DEPRECATED */ /*!\brief Decorator indicating a function is potentially unused */ #ifdef AOM_UNUSED #elif defined(__GNUC__) || defined(__clang__) #define AOM_UNUSED __attribute__((unused)) #else #define AOM_UNUSED #endif /*!\brief Decorator indicating that given struct/union/enum is packed */ #ifndef ATTRIBUTE_PACKED #if defined(__GNUC__) && __GNUC__ #define ATTRIBUTE_PACKED __attribute__((packed)) #elif defined(_MSC_VER) #define ATTRIBUTE_PACKED #else #define ATTRIBUTE_PACKED #endif #endif /* ATTRIBUTE_PACKED */ /*!\brief Current ABI version number * * \internal * If this file is altered in any way that changes the ABI, this value * must be bumped. Examples include, but are not limited to, changing * types, removing or reassigning enums, adding/removing/rearranging * fields to structures */ #define AOM_CODEC_ABI_VERSION (7 + AOM_IMAGE_ABI_VERSION) /**<\hideinitializer*/ /*!\brief Algorithm return codes */ typedef enum { /*!\brief Operation completed without error */ AOM_CODEC_OK, /*!\brief Unspecified error */ AOM_CODEC_ERROR, /*!\brief Memory operation failed */ AOM_CODEC_MEM_ERROR, /*!\brief ABI version mismatch */ AOM_CODEC_ABI_MISMATCH, /*!\brief Algorithm does not have required capability */ AOM_CODEC_INCAPABLE, /*!\brief The given bitstream is not supported. * * The bitstream was unable to be parsed at the highest level. The decoder * is unable to proceed. This error \ref SHOULD be treated as fatal to the * stream. */ AOM_CODEC_UNSUP_BITSTREAM, /*!\brief Encoded bitstream uses an unsupported feature * * The decoder does not implement a feature required by the encoder. This * return code should only be used for features that prevent future * pictures from being properly decoded. This error \ref MAY be treated as * fatal to the stream or \ref MAY be treated as fatal to the current GOP. */ AOM_CODEC_UNSUP_FEATURE, /*!\brief The coded data for this stream is corrupt or incomplete * * There was a problem decoding the current frame. This return code * should only be used for failures that prevent future pictures from * being properly decoded. This error \ref MAY be treated as fatal to the * stream or \ref MAY be treated as fatal to the current GOP. If decoding * is continued for the current GOP, artifacts may be present. */ AOM_CODEC_CORRUPT_FRAME, /*!\brief An application-supplied parameter is not valid. * */ AOM_CODEC_INVALID_PARAM, /*!\brief An iterator reached the end of list. * */ AOM_CODEC_LIST_END } aom_codec_err_t; /*! \brief Codec capabilities bitfield * * Each codec advertises the capabilities it supports as part of its * ::aom_codec_iface_t interface structure. Capabilities are extra interfaces * or functionality, and are not required to be supported. * * The available flags are specified by AOM_CODEC_CAP_* defines. */ typedef long aom_codec_caps_t; #define AOM_CODEC_CAP_DECODER 0x1 /**< Is a decoder */ #define AOM_CODEC_CAP_ENCODER 0x2 /**< Is an encoder */ /*! \brief Initialization-time Feature Enabling * * Certain codec features must be known at initialization time, to allow for * proper memory allocation. * * The available flags are specified by AOM_CODEC_USE_* defines. */ typedef long aom_codec_flags_t; /*!\brief Time Stamp Type * * An integer, which when multiplied by the stream's time base, provides * the absolute time of a sample. */ typedef int64_t aom_codec_pts_t; /*!\brief Codec interface structure. * * Contains function pointers and other data private to the codec * implementation. This structure is opaque to the application. Common * functions used with this structure: * - aom_codec_iface_name(aom_codec_iface_t *iface): get the * name of the codec * - aom_codec_get_caps(aom_codec_iface_t *iface): returns * the capabilities of the codec * - aom_codec_enc_config_default: generate the default config for * initializing the encoder (see documention in aom_encoder.h) * - aom_codec_dec_init, aom_codec_enc_init: initialize the codec context * structure (see documentation on aom_codec_ctx). * * To get access to the AV1 encoder and decoder, use aom_codec_av1_cx() and * aom_codec_av1_dx(). */ typedef const struct aom_codec_iface aom_codec_iface_t; /*!\brief Codec private data structure. * * Contains data private to the codec implementation. This structure is opaque * to the application. */ typedef struct aom_codec_priv aom_codec_priv_t; /*!\brief Compressed Frame Flags * * This type represents a bitfield containing information about a compressed * frame that may be useful to an application. The most significant 16 bits * can be used by an algorithm to provide additional detail, for example to * support frame types that are codec specific (MPEG-1 D-frames for example) */ typedef uint32_t aom_codec_frame_flags_t; #define AOM_FRAME_IS_KEY 0x1 /**< frame is the start of a GOP */ /*!\brief frame can be dropped without affecting the stream (no future frame * depends on this one) */ #define AOM_FRAME_IS_DROPPABLE 0x2 /*!\brief this is an INTRA_ONLY frame */ #define AOM_FRAME_IS_INTRAONLY 0x10 /*!\brief this is an S-frame */ #define AOM_FRAME_IS_SWITCH 0x20 /*!\brief this is an error-resilient frame */ #define AOM_FRAME_IS_ERROR_RESILIENT 0x40 /*!\brief this is a key-frame dependent recovery-point frame */ #define AOM_FRAME_IS_DELAYED_RANDOM_ACCESS_POINT 0x80 /*!\brief Iterator * * Opaque storage used for iterating over lists. */ typedef const void *aom_codec_iter_t; /*!\brief Codec context structure * * All codecs \ref MUST support this context structure fully. In general, * this data should be considered private to the codec algorithm, and * not be manipulated or examined by the calling application. Applications * may reference the 'name' member to get a printable description of the * algorithm. */ typedef struct aom_codec_ctx { const char *name; /**< Printable interface name */ aom_codec_iface_t *iface; /**< Interface pointers */ aom_codec_err_t err; /**< Last returned error */ const char *err_detail; /**< Detailed info, if available */ aom_codec_flags_t init_flags; /**< Flags passed at init time */ union { /**< Decoder Configuration Pointer */ const struct aom_codec_dec_cfg *dec; /**< Encoder Configuration Pointer */ const struct aom_codec_enc_cfg *enc; const void *raw; } config; /**< Configuration pointer aliasing union */ aom_codec_priv_t *priv; /**< Algorithm private storage */ } aom_codec_ctx_t; /*!\brief Bit depth for codec * * * This enumeration determines the bit depth of the codec. */ typedef enum aom_bit_depth { AOM_BITS_8 = 8, /**< 8 bits */ AOM_BITS_10 = 10, /**< 10 bits */ AOM_BITS_12 = 12, /**< 12 bits */ } aom_bit_depth_t; /*!\brief Superblock size selection. * * Defines the superblock size used for encoding. The superblock size can * either be fixed at 64x64 or 128x128 pixels, or it can be dynamically * selected by the encoder for each frame. */ typedef enum aom_superblock_size { AOM_SUPERBLOCK_SIZE_64X64, /**< Always use 64x64 superblocks. */ AOM_SUPERBLOCK_SIZE_128X128, /**< Always use 128x128 superblocks. */ AOM_SUPERBLOCK_SIZE_DYNAMIC /**< Select superblock size dynamically. */ } aom_superblock_size_t; /* * Library Version Number Interface * * For example, see the following sample return values: * aom_codec_version() (1<<16 | 2<<8 | 3) * aom_codec_version_str() "v1.2.3-rc1-16-gec6a1ba" * aom_codec_version_extra_str() "rc1-16-gec6a1ba" */ /*!\brief Return the version information (as an integer) * * Returns a packed encoding of the library version number. This will only * include the major.minor.patch component of the version number. Note that this * encoded value should be accessed through the macros provided, as the encoding * may change in the future. * */ int aom_codec_version(void); /*!\brief Return the major version number */ #define aom_codec_version_major() ((aom_codec_version() >> 16) & 0xff) /*!\brief Return the minor version number */ #define aom_codec_version_minor() ((aom_codec_version() >> 8) & 0xff) /*!\brief Return the patch version number */ #define aom_codec_version_patch() ((aom_codec_version() >> 0) & 0xff) /*!\brief Return the version information (as a string) * * Returns a printable string containing the full library version number. This * may contain additional text following the three digit version number, as to * indicate release candidates, prerelease versions, etc. * */ const char *aom_codec_version_str(void); /*!\brief Return the version information (as a string) * * Returns a printable "extra string". This is the component of the string * returned by aom_codec_version_str() following the three digit version number. * */ const char *aom_codec_version_extra_str(void); /*!\brief Return the build configuration * * Returns a printable string containing an encoded version of the build * configuration. This may be useful to aom support. * */ const char *aom_codec_build_config(void); /*!\brief Return the name for a given interface * * Returns a human readable string for name of the given codec interface. * * \param[in] iface Interface pointer * */ const char *aom_codec_iface_name(aom_codec_iface_t *iface); /*!\brief Convert error number to printable string * * Returns a human readable string for the last error returned by the * algorithm. The returned error will be one line and will not contain * any newline characters. * * * \param[in] err Error number. * */ const char *aom_codec_err_to_string(aom_codec_err_t err); /*!\brief Retrieve error synopsis for codec context * * Returns a human readable string for the last error returned by the * algorithm. The returned error will be one line and will not contain * any newline characters. * * * \param[in] ctx Pointer to this instance's context. * */ const char *aom_codec_error(aom_codec_ctx_t *ctx); /*!\brief Retrieve detailed error information for codec context * * Returns a human readable string providing detailed information about * the last error. * * \param[in] ctx Pointer to this instance's context. * * \retval NULL * No detailed information is available. */ const char *aom_codec_error_detail(aom_codec_ctx_t *ctx); /* REQUIRED FUNCTIONS * * The following functions are required to be implemented for all codecs. * They represent the base case functionality expected of all codecs. */ /*!\brief Destroy a codec instance * * Destroys a codec context, freeing any associated memory buffers. * * \param[in] ctx Pointer to this instance's context * * \retval #AOM_CODEC_OK * The codec algorithm initialized. * \retval #AOM_CODEC_MEM_ERROR * Memory allocation failed. */ aom_codec_err_t aom_codec_destroy(aom_codec_ctx_t *ctx); /*!\brief Get the capabilities of an algorithm. * * Retrieves the capabilities bitfield from the algorithm's interface. * * \param[in] iface Pointer to the algorithm interface * */ aom_codec_caps_t aom_codec_get_caps(aom_codec_iface_t *iface); /*!\name Codec Control * * The aom_codec_control function exchanges algorithm specific data with the * codec instance. Additionally, the macro AOM_CODEC_CONTROL_TYPECHECKED is * provided, which will type-check the parameter against the control ID before * calling aom_codec_control - note that this macro requires the control ID * to be directly encoded in it, e.g., * AOM_CODEC_CONTROL_TYPECHECKED(&ctx, AOME_SET_CPUUSED, 8). * * The codec control IDs can be found in aom.h, aomcx.h, and aomdx.h * (defined as aom_com_control_id, aome_enc_control_id, and aom_dec_control_id). * @{ */ /*!\brief Algorithm Control * * aom_codec_control takes a context, a control ID, and a third parameter * (with varying type). If the context is non-null and an error occurs, * ctx->err will be set to the same value as the return value. * * \param[in] ctx Pointer to this instance's context * \param[in] ctrl_id Algorithm specific control identifier. * Must be nonzero. * * \retval #AOM_CODEC_OK * The control request was processed. * \retval #AOM_CODEC_ERROR * The control request was not processed. * \retval #AOM_CODEC_INVALID_PARAM * The control ID was zero, or the data was not valid. */ aom_codec_err_t aom_codec_control(aom_codec_ctx_t *ctx, int ctrl_id, ...); /*!\brief Key & Value API * * aom_codec_set_option() takes a context, a key (option name) and a value. If * the context is non-null and an error occurs, ctx->err will be set to the same * value as the return value. * * \param[in] ctx Pointer to this instance's context * \param[in] name The name of the option (key) * \param[in] value The value of the option * * \retval #AOM_CODEC_OK * The value of the option was set. * \retval #AOM_CODEC_INVALID_PARAM * The data was not valid. * \retval #AOM_CODEC_ERROR * The option was not successfully set. */ aom_codec_err_t aom_codec_set_option(aom_codec_ctx_t *ctx, const char *name, const char *value); /*!\brief aom_codec_control wrapper macro (adds type-checking, less flexible) * * This macro allows for type safe conversions across the variadic parameter * to aom_codec_control(). However, it requires the explicit control ID * be passed in (it cannot be passed in via a variable) -- otherwise a compiler * error will occur. After the type checking, it calls aom_codec_control. */ #define AOM_CODEC_CONTROL_TYPECHECKED(ctx, id, data) \ aom_codec_control_typechecked_##id(ctx, id, data) /**<\hideinitializer*/ /*!\brief Creates typechecking mechanisms for aom_codec_control * * It defines a static function with the correctly typed arguments as a wrapper * to the type-unsafe aom_codec_control function. It also creates a typedef * for each type. */ #define AOM_CTRL_USE_TYPE(id, typ) \ static aom_codec_err_t aom_codec_control_typechecked_##id( \ aom_codec_ctx_t *, int, typ) AOM_UNUSED; \ static aom_codec_err_t aom_codec_control_typechecked_##id( \ aom_codec_ctx_t *ctx, int ctrl, typ data) { \ return aom_codec_control(ctx, ctrl, data); \ } /**<\hideinitializer*/ \ typedef typ aom_codec_control_type_##id; /*!@} end Codec Control group */ /*!\brief OBU types. */ typedef enum ATTRIBUTE_PACKED { OBU_SEQUENCE_HEADER = 1, OBU_TEMPORAL_DELIMITER = 2, OBU_FRAME_HEADER = 3, OBU_TILE_GROUP = 4, OBU_METADATA = 5, OBU_FRAME = 6, OBU_REDUNDANT_FRAME_HEADER = 7, OBU_TILE_LIST = 8, OBU_PADDING = 15, } OBU_TYPE; /*!\brief OBU metadata types. */ typedef enum { OBU_METADATA_TYPE_AOM_RESERVED_0 = 0, OBU_METADATA_TYPE_HDR_CLL = 1, OBU_METADATA_TYPE_HDR_MDCV = 2, OBU_METADATA_TYPE_SCALABILITY = 3, OBU_METADATA_TYPE_ITUT_T35 = 4, OBU_METADATA_TYPE_TIMECODE = 5, } OBU_METADATA_TYPE; /*!\brief Returns string representation of OBU_TYPE. * * \param[in] type The OBU_TYPE to convert to string. */ const char *aom_obu_type_to_string(OBU_TYPE type); /*!@} - end defgroup codec*/ #ifdef __cplusplus } #endif #endif // AOM_AOM_AOM_CODEC_H_ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/multimedia/obu_util/sources/aom_config.h ================================================ /* * copied from https://raw.githubusercontent.com/SDWebImage/libaom-Xcode/master/generate/config/aom_config.h */ /* * Copyright (c) 2021, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_CONFIG_H_ #define AOM_CONFIG_H_ #define ARCH_ARM 1 #define ARCH_MIPS 0 #define ARCH_PPC 0 #define ARCH_X86 0 #define ARCH_X86_64 0 #define CONFIG_ACCOUNTING 0 #define CONFIG_ANALYZER 0 #define CONFIG_AV1_DECODER 1 #define CONFIG_AV1_ENCODER 0 #define CONFIG_AV1_HIGHBITDEPTH 1 #define CONFIG_BIG_ENDIAN 0 #define CONFIG_BITSTREAM_DEBUG 0 #define CONFIG_COEFFICIENT_RANGE_CHECKING 0 #define CONFIG_COLLECT_COMPONENT_TIMING 0 #define CONFIG_COLLECT_PARTITION_STATS 0 #define CONFIG_COLLECT_RD_STATS 0 #define CONFIG_DEBUG 0 #define CONFIG_DENOISE 1 #define CONFIG_DISABLE_FULL_PIXEL_SPLIT_8X8 1 #define CONFIG_DIST_8X8 0 #define CONFIG_ENTROPY_STATS 0 #define CONFIG_GCC 1 #define CONFIG_GCOV 0 #define CONFIG_GPROF 0 #define CONFIG_HTB_TRELLIS 0 #define CONFIG_INSPECTION 0 #define CONFIG_INTERNAL_STATS 0 #define CONFIG_INTER_STATS_ONLY 0 #define CONFIG_LIBYUV 1 #define CONFIG_LPF_MASK 0 #define CONFIG_MAX_DECODE_PROFILE 2 #define CONFIG_MISMATCH_DEBUG 0 #define CONFIG_MULTITHREAD 1 #define CONFIG_NN_V2 0 #define CONFIG_NORMAL_TILE_MODE 0 #define CONFIG_OS_SUPPORT 1 #define CONFIG_PIC 0 #define CONFIG_RD_DEBUG 0 #define CONFIG_REALTIME_ONLY 0 #define CONFIG_RUNTIME_CPU_DETECT 1 #define CONFIG_SHARED 0 #define CONFIG_SHARP_SETTINGS 0 #define CONFIG_SIZE_LIMIT 0 #define CONFIG_SPATIAL_RESAMPLING 1 #define CONFIG_SPEED_STATS 0 #define CONFIG_SUPERRES_IN_RECODE 1 #define CONFIG_TUNE_VMAF 1 #define CONFIG_WEBM_IO 1 #define DECODE_HEIGHT_LIMIT 0 #define DECODE_WIDTH_LIMIT 0 #define FORCE_HIGHBITDEPTH_DECODING 0 #define HAVE_AVX 0 #define HAVE_AVX2 0 #define HAVE_DSPR2 0 #define HAVE_FEXCEPT 0 #define HAVE_MIPS32 0 #define HAVE_MIPS64 0 #define HAVE_MMX 0 #define HAVE_MSA 0 #define HAVE_NEON 1 #define HAVE_PTHREAD_H 1 #define HAVE_SSE 0 #define HAVE_SSE2 0 #define HAVE_SSE3 0 #define HAVE_SSE4_1 0 #define HAVE_SSE4_2 0 #define HAVE_SSSE3 0 #define HAVE_UNISTD_H 1 #define HAVE_VSX 0 #define HAVE_WXWIDGETS 0 #define INLINE inline #endif // AOM_CONFIG_H_ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/multimedia/obu_util/sources/aom_config.h-orig.h ================================================ // from https://raw.githubusercontent.com/SDWebImage/libaom-Xcode/master/generate/config/aom_config.h /* * Copyright (c) 2021, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_CONFIG_H_ #define AOM_CONFIG_H_ #define ARCH_ARM 0 #define ARCH_MIPS 0 #define ARCH_PPC 0 #define ARCH_X86 0 #define ARCH_X86_64 0 #define CONFIG_ACCOUNTING 0 #define CONFIG_ANALYZER 0 #define CONFIG_AV1_DECODER 1 #define CONFIG_AV1_ENCODER 1 #define CONFIG_AV1_HIGHBITDEPTH 1 #define CONFIG_BIG_ENDIAN 0 #define CONFIG_BITSTREAM_DEBUG 0 #define CONFIG_COEFFICIENT_RANGE_CHECKING 0 #define CONFIG_COLLECT_COMPONENT_TIMING 0 #define CONFIG_COLLECT_PARTITION_STATS 0 #define CONFIG_COLLECT_RD_STATS 0 #define CONFIG_DEBUG 0 #define CONFIG_DENOISE 1 #define CONFIG_DISABLE_FULL_PIXEL_SPLIT_8X8 1 #define CONFIG_DIST_8X8 0 #define CONFIG_ENTROPY_STATS 0 #define CONFIG_GCC 1 #define CONFIG_GCOV 0 #define CONFIG_GPROF 0 #define CONFIG_HTB_TRELLIS 0 #define CONFIG_INSPECTION 0 #define CONFIG_INTERNAL_STATS 0 #define CONFIG_INTER_STATS_ONLY 0 #define CONFIG_LIBYUV 1 #define CONFIG_LPF_MASK 0 #define CONFIG_MAX_DECODE_PROFILE 2 #define CONFIG_MISMATCH_DEBUG 0 #define CONFIG_MULTITHREAD 1 #define CONFIG_NN_V2 0 #define CONFIG_NORMAL_TILE_MODE 0 #define CONFIG_OS_SUPPORT 1 #define CONFIG_PIC 0 #define CONFIG_RD_DEBUG 0 #define CONFIG_REALTIME_ONLY 0 #define CONFIG_RUNTIME_CPU_DETECT 1 #define CONFIG_SHARED 0 #define CONFIG_SHARP_SETTINGS 0 #define CONFIG_SIZE_LIMIT 0 #define CONFIG_SPATIAL_RESAMPLING 1 #define CONFIG_SPEED_STATS 0 #define CONFIG_SUPERRES_IN_RECODE 1 #define CONFIG_TUNE_VMAF 1 #define CONFIG_WEBM_IO 1 #define DECODE_HEIGHT_LIMIT 0 #define DECODE_WIDTH_LIMIT 0 #define FORCE_HIGHBITDEPTH_DECODING 0 #define HAVE_AVX 0 #define HAVE_AVX2 0 #define HAVE_DSPR2 0 #define HAVE_FEXCEPT 0 #define HAVE_MIPS32 0 #define HAVE_MIPS64 0 #define HAVE_MMX 0 #define HAVE_MSA 0 #define HAVE_NEON 0 #define HAVE_PTHREAD_H 1 #define HAVE_SSE 0 #define HAVE_SSE2 0 #define HAVE_SSE3 0 #define HAVE_SSE4_1 0 #define HAVE_SSE4_2 0 #define HAVE_SSSE3 0 #define HAVE_UNISTD_H 1 #define HAVE_VSX 0 #define HAVE_WXWIDGETS 0 #define INLINE inline #endif // AOM_CONFIG_H_ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/multimedia/obu_util/sources/aom_image.h ================================================ /* * Copyright (c) 2016, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ /*!\file * \brief Describes the aom image descriptor and associated operations * */ #ifndef AOM_AOM_AOM_IMAGE_H_ #define AOM_AOM_AOM_IMAGE_H_ #ifdef __cplusplus extern "C" { #endif #include "aom_integer.h" /*!\brief Current ABI version number * * \internal * If this file is altered in any way that changes the ABI, this value * must be bumped. Examples include, but are not limited to, changing * types, removing or reassigning enums, adding/removing/rearranging * fields to structures */ #define AOM_IMAGE_ABI_VERSION (9) /**<\hideinitializer*/ #define AOM_IMG_FMT_PLANAR 0x100 /**< Image is a planar format. */ #define AOM_IMG_FMT_UV_FLIP 0x200 /**< V plane precedes U in memory. */ /** 0x400 used to signal alpha channel, skipping for backwards compatibility. */ #define AOM_IMG_FMT_HIGHBITDEPTH 0x800 /**< Image uses 16bit framebuffer. */ /*!\brief List of supported image formats */ typedef enum aom_img_fmt { AOM_IMG_FMT_NONE, AOM_IMG_FMT_YV12 = AOM_IMG_FMT_PLANAR | AOM_IMG_FMT_UV_FLIP | 1, /**< planar YVU */ AOM_IMG_FMT_I420 = AOM_IMG_FMT_PLANAR | 2, AOM_IMG_FMT_AOMYV12 = AOM_IMG_FMT_PLANAR | AOM_IMG_FMT_UV_FLIP | 3, /** < planar 4:2:0 format with aom color space */ AOM_IMG_FMT_AOMI420 = AOM_IMG_FMT_PLANAR | 4, AOM_IMG_FMT_I422 = AOM_IMG_FMT_PLANAR | 5, AOM_IMG_FMT_I444 = AOM_IMG_FMT_PLANAR | 6, AOM_IMG_FMT_I42016 = AOM_IMG_FMT_I420 | AOM_IMG_FMT_HIGHBITDEPTH, AOM_IMG_FMT_YV1216 = AOM_IMG_FMT_YV12 | AOM_IMG_FMT_HIGHBITDEPTH, AOM_IMG_FMT_I42216 = AOM_IMG_FMT_I422 | AOM_IMG_FMT_HIGHBITDEPTH, AOM_IMG_FMT_I44416 = AOM_IMG_FMT_I444 | AOM_IMG_FMT_HIGHBITDEPTH, } aom_img_fmt_t; /**< alias for enum aom_img_fmt */ /*!\brief List of supported color primaries */ typedef enum aom_color_primaries { AOM_CICP_CP_RESERVED_0 = 0, /**< For future use */ AOM_CICP_CP_BT_709 = 1, /**< BT.709 */ AOM_CICP_CP_UNSPECIFIED = 2, /**< Unspecified */ AOM_CICP_CP_RESERVED_3 = 3, /**< For future use */ AOM_CICP_CP_BT_470_M = 4, /**< BT.470 System M (historical) */ AOM_CICP_CP_BT_470_B_G = 5, /**< BT.470 System B, G (historical) */ AOM_CICP_CP_BT_601 = 6, /**< BT.601 */ AOM_CICP_CP_SMPTE_240 = 7, /**< SMPTE 240 */ AOM_CICP_CP_GENERIC_FILM = 8, /**< Generic film (color filters using illuminant C) */ AOM_CICP_CP_BT_2020 = 9, /**< BT.2020, BT.2100 */ AOM_CICP_CP_XYZ = 10, /**< SMPTE 428 (CIE 1921 XYZ) */ AOM_CICP_CP_SMPTE_431 = 11, /**< SMPTE RP 431-2 */ AOM_CICP_CP_SMPTE_432 = 12, /**< SMPTE EG 432-1 */ AOM_CICP_CP_RESERVED_13 = 13, /**< For future use (values 13 - 21) */ AOM_CICP_CP_EBU_3213 = 22, /**< EBU Tech. 3213-E */ AOM_CICP_CP_RESERVED_23 = 23 /**< For future use (values 23 - 255) */ } aom_color_primaries_t; /**< alias for enum aom_color_primaries */ /*!\brief List of supported transfer functions */ typedef enum aom_transfer_characteristics { AOM_CICP_TC_RESERVED_0 = 0, /**< For future use */ AOM_CICP_TC_BT_709 = 1, /**< BT.709 */ AOM_CICP_TC_UNSPECIFIED = 2, /**< Unspecified */ AOM_CICP_TC_RESERVED_3 = 3, /**< For future use */ AOM_CICP_TC_BT_470_M = 4, /**< BT.470 System M (historical) */ AOM_CICP_TC_BT_470_B_G = 5, /**< BT.470 System B, G (historical) */ AOM_CICP_TC_BT_601 = 6, /**< BT.601 */ AOM_CICP_TC_SMPTE_240 = 7, /**< SMPTE 240 M */ AOM_CICP_TC_LINEAR = 8, /**< Linear */ AOM_CICP_TC_LOG_100 = 9, /**< Logarithmic (100 : 1 range) */ AOM_CICP_TC_LOG_100_SQRT10 = 10, /**< Logarithmic (100 * Sqrt(10) : 1 range) */ AOM_CICP_TC_IEC_61966 = 11, /**< IEC 61966-2-4 */ AOM_CICP_TC_BT_1361 = 12, /**< BT.1361 */ AOM_CICP_TC_SRGB = 13, /**< sRGB or sYCC*/ AOM_CICP_TC_BT_2020_10_BIT = 14, /**< BT.2020 10-bit systems */ AOM_CICP_TC_BT_2020_12_BIT = 15, /**< BT.2020 12-bit systems */ AOM_CICP_TC_SMPTE_2084 = 16, /**< SMPTE ST 2084, ITU BT.2100 PQ */ AOM_CICP_TC_SMPTE_428 = 17, /**< SMPTE ST 428 */ AOM_CICP_TC_HLG = 18, /**< BT.2100 HLG, ARIB STD-B67 */ AOM_CICP_TC_RESERVED_19 = 19 /**< For future use (values 19-255) */ } aom_transfer_characteristics_t; /**< alias for enum aom_transfer_function */ /*!\brief List of supported matrix coefficients */ typedef enum aom_matrix_coefficients { AOM_CICP_MC_IDENTITY = 0, /**< Identity matrix */ AOM_CICP_MC_BT_709 = 1, /**< BT.709 */ AOM_CICP_MC_UNSPECIFIED = 2, /**< Unspecified */ AOM_CICP_MC_RESERVED_3 = 3, /**< For future use */ AOM_CICP_MC_FCC = 4, /**< US FCC 73.628 */ AOM_CICP_MC_BT_470_B_G = 5, /**< BT.470 System B, G (historical) */ AOM_CICP_MC_BT_601 = 6, /**< BT.601 */ AOM_CICP_MC_SMPTE_240 = 7, /**< SMPTE 240 M */ AOM_CICP_MC_SMPTE_YCGCO = 8, /**< YCgCo */ AOM_CICP_MC_BT_2020_NCL = 9, /**< BT.2020 non-constant luminance, BT.2100 YCbCr */ AOM_CICP_MC_BT_2020_CL = 10, /**< BT.2020 constant luminance */ AOM_CICP_MC_SMPTE_2085 = 11, /**< SMPTE ST 2085 YDzDx */ AOM_CICP_MC_CHROMAT_NCL = 12, /**< Chromaticity-derived non-constant luminance */ AOM_CICP_MC_CHROMAT_CL = 13, /**< Chromaticity-derived constant luminance */ AOM_CICP_MC_ICTCP = 14, /**< BT.2100 ICtCp */ AOM_CICP_MC_RESERVED_15 = 15 /**< For future use (values 15-255) */ } aom_matrix_coefficients_t; /*!\brief List of supported color range */ typedef enum aom_color_range { AOM_CR_STUDIO_RANGE = 0, /**< Y [16..235], UV [16..240] */ AOM_CR_FULL_RANGE = 1 /**< YUV/RGB [0..255] */ } aom_color_range_t; /**< alias for enum aom_color_range */ /*!\brief List of chroma sample positions */ typedef enum aom_chroma_sample_position { AOM_CSP_UNKNOWN = 0, /**< Unknown */ AOM_CSP_VERTICAL = 1, /**< Horizontally co-located with luma(0, 0)*/ /**< sample, between two vertical samples */ AOM_CSP_COLOCATED = 2, /**< Co-located with luma(0, 0) sample */ AOM_CSP_RESERVED = 3 /**< Reserved value */ } aom_chroma_sample_position_t; /**< alias for enum aom_transfer_function */ /*!\brief List of insert flags for Metadata * * These flags control how the library treats metadata during encode. * * While encoding, when metadata is added to an aom_image via * aom_img_add_metadata(), the flag passed along with the metadata will * determine where the metadata OBU will be placed in the encoded OBU stream. * Metadata will be emitted into the output stream within the next temporal unit * if it satisfies the specified insertion flag. * * During decoding, when the library encounters a metadata OBU, it is always * flagged as AOM_MIF_ANY_FRAME and emitted with the next output aom_image. */ typedef enum aom_metadata_insert_flags { AOM_MIF_NON_KEY_FRAME = 0, /**< Adds metadata if it's not keyframe */ AOM_MIF_KEY_FRAME = 1, /**< Adds metadata only if it's a keyframe */ AOM_MIF_ANY_FRAME = 2 /**< Adds metadata to any type of frame */ } aom_metadata_insert_flags_t; /*!\brief Array of aom_metadata structs for an image. */ typedef struct aom_metadata_array aom_metadata_array_t; /*!\brief Metadata payload. */ typedef struct aom_metadata { uint32_t type; /**< Metadata type */ uint8_t *payload; /**< Metadata payload data */ size_t sz; /**< Metadata payload size */ aom_metadata_insert_flags_t insert_flag; /**< Metadata insertion flag */ } aom_metadata_t; /**\brief Image Descriptor */ typedef struct aom_image { aom_img_fmt_t fmt; /**< Image Format */ aom_color_primaries_t cp; /**< CICP Color Primaries */ aom_transfer_characteristics_t tc; /**< CICP Transfer Characteristics */ aom_matrix_coefficients_t mc; /**< CICP Matrix Coefficients */ int monochrome; /**< Whether image is monochrome */ aom_chroma_sample_position_t csp; /**< chroma sample position */ aom_color_range_t range; /**< Color Range */ /* Image storage dimensions */ unsigned int w; /**< Stored image width */ unsigned int h; /**< Stored image height */ unsigned int bit_depth; /**< Stored image bit-depth */ /* Image display dimensions */ unsigned int d_w; /**< Displayed image width */ unsigned int d_h; /**< Displayed image height */ /* Image intended rendering dimensions */ unsigned int r_w; /**< Intended rendering image width */ unsigned int r_h; /**< Intended rendering image height */ /* Chroma subsampling info */ unsigned int x_chroma_shift; /**< subsampling order, X */ unsigned int y_chroma_shift; /**< subsampling order, Y */ /* Image data pointers. */ #define AOM_PLANE_PACKED 0 /**< To be used for all packed formats */ #define AOM_PLANE_Y 0 /**< Y (Luminance) plane */ #define AOM_PLANE_U 1 /**< U (Chroma) plane */ #define AOM_PLANE_V 2 /**< V (Chroma) plane */ unsigned char *planes[3]; /**< pointer to the top left pixel for each plane */ int stride[3]; /**< stride between rows for each plane */ size_t sz; /**< data size */ int bps; /**< bits per sample (for packed formats) */ int temporal_id; /**< Temporal layer Id of image */ int spatial_id; /**< Spatial layer Id of image */ /*!\brief The following member may be set by the application to associate * data with this image. */ void *user_priv; /* The following members should be treated as private. */ unsigned char *img_data; /**< private */ int img_data_owner; /**< private */ int self_allocd; /**< private */ aom_metadata_array_t *metadata; /**< Metadata payloads associated with the image. */ void *fb_priv; /**< Frame buffer data associated with the image. */ } aom_image_t; /**< alias for struct aom_image */ /*!\brief Open a descriptor, allocating storage for the underlying image * * Returns a descriptor for storing an image of the given format. The * storage for the image is allocated on the heap. * * \param[in] img Pointer to storage for descriptor. If this parameter * is NULL, the storage for the descriptor will be * allocated on the heap. * \param[in] fmt Format for the image * \param[in] d_w Width of the image * \param[in] d_h Height of the image * \param[in] align Alignment, in bytes, of the image buffer and * each row in the image (stride). * * \return Returns a pointer to the initialized image descriptor. If the img * parameter is non-null, the value of the img parameter will be * returned. */ aom_image_t *aom_img_alloc(aom_image_t *img, aom_img_fmt_t fmt, unsigned int d_w, unsigned int d_h, unsigned int align); /*!\brief Open a descriptor, using existing storage for the underlying image * * Returns a descriptor for storing an image of the given format. The * storage for the image has been allocated elsewhere, and a descriptor is * desired to "wrap" that storage. * * \param[in] img Pointer to storage for descriptor. If this parameter * is NULL, the storage for the descriptor will be * allocated on the heap. * \param[in] fmt Format for the image * \param[in] d_w Width of the image * \param[in] d_h Height of the image * \param[in] align Alignment, in bytes, of each row in the image * (stride). * \param[in] img_data Storage to use for the image * * \return Returns a pointer to the initialized image descriptor. If the img * parameter is non-null, the value of the img parameter will be * returned. */ aom_image_t *aom_img_wrap(aom_image_t *img, aom_img_fmt_t fmt, unsigned int d_w, unsigned int d_h, unsigned int align, unsigned char *img_data); /*!\brief Open a descriptor, allocating storage for the underlying image with a * border * * Returns a descriptor for storing an image of the given format and its * borders. The storage for the image is allocated on the heap. * * \param[in] img Pointer to storage for descriptor. If this parameter * is NULL, the storage for the descriptor will be * allocated on the heap. * \param[in] fmt Format for the image * \param[in] d_w Width of the image * \param[in] d_h Height of the image * \param[in] align Alignment, in bytes, of the image buffer and * each row in the image (stride). * \param[in] size_align Alignment, in pixels, of the image width and height. * \param[in] border A border that is padded on four sides of the image. * * \return Returns a pointer to the initialized image descriptor. If the img * parameter is non-null, the value of the img parameter will be * returned. */ aom_image_t *aom_img_alloc_with_border(aom_image_t *img, aom_img_fmt_t fmt, unsigned int d_w, unsigned int d_h, unsigned int align, unsigned int size_align, unsigned int border); /*!\brief Set the rectangle identifying the displayed portion of the image * * Updates the displayed rectangle (aka viewport) on the image surface to * match the specified coordinates and size. Specifically, sets img->d_w, * img->d_h, and elements of the img->planes[] array. * * \param[in] img Image descriptor * \param[in] x leftmost column * \param[in] y topmost row * \param[in] w width * \param[in] h height * \param[in] border A border that is padded on four sides of the image. * * \return 0 if the requested rectangle is valid, nonzero (-1) otherwise. */ int aom_img_set_rect(aom_image_t *img, unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned int border); /*!\brief Flip the image vertically (top for bottom) * * Adjusts the image descriptor's pointers and strides to make the image * be referenced upside-down. * * \param[in] img Image descriptor */ void aom_img_flip(aom_image_t *img); /*!\brief Close an image descriptor * * Frees all allocated storage associated with an image descriptor. * * \param[in] img Image descriptor */ void aom_img_free(aom_image_t *img); /*!\brief Get the width of a plane * * Get the width of a plane of an image * * \param[in] img Image descriptor * \param[in] plane Plane index */ int aom_img_plane_width(const aom_image_t *img, int plane); /*!\brief Get the height of a plane * * Get the height of a plane of an image * * \param[in] img Image descriptor * \param[in] plane Plane index */ int aom_img_plane_height(const aom_image_t *img, int plane); /*!\brief Add metadata to image. * * Adds metadata to aom_image_t. * Function makes a copy of the provided data parameter. * Metadata insertion point is controlled by insert_flag. * * \param[in] img Image descriptor * \param[in] type Metadata type * \param[in] data Metadata contents * \param[in] sz Metadata contents size * \param[in] insert_flag Metadata insert flag * * \return Returns 0 on success. If img or data is NULL, sz is 0, or memory * allocation fails, it returns -1. */ int aom_img_add_metadata(aom_image_t *img, uint32_t type, const uint8_t *data, size_t sz, aom_metadata_insert_flags_t insert_flag); /*!\brief Return a metadata payload stored within the image metadata array. * * Gets the metadata (aom_metadata_t) at the indicated index in the image * metadata array. * * \param[in] img Pointer to image descriptor to get metadata from * \param[in] index Metadata index to get from metadata array * * \return Returns a const pointer to the selected metadata, if img and/or index * is invalid, it returns NULL. */ const aom_metadata_t *aom_img_get_metadata(const aom_image_t *img, size_t index); /*!\brief Return the number of metadata blocks within the image. * * Gets the number of metadata blocks contained within the provided image * metadata array. * * \param[in] img Pointer to image descriptor to get metadata number * from. * * \return Returns the size of the metadata array. If img or metadata is NULL, * it returns 0. */ size_t aom_img_num_metadata(const aom_image_t *img); /*!\brief Remove metadata from image. * * Removes all metadata in image metadata list and sets metadata list pointer * to NULL. * * \param[in] img Image descriptor */ void aom_img_remove_metadata(aom_image_t *img); /*!\brief Allocate memory for aom_metadata struct. * * Allocates storage for the metadata payload, sets its type and copies the * payload data into the aom_metadata struct. A metadata payload buffer of size * sz is allocated and sz bytes are copied from data into the payload buffer. * * \param[in] type Metadata type * \param[in] data Metadata data pointer * \param[in] sz Metadata size * \param[in] insert_flag Metadata insert flag * * \return Returns the newly allocated aom_metadata struct. If data is NULL, * sz is 0, or memory allocation fails, it returns NULL. */ aom_metadata_t *aom_img_metadata_alloc(uint32_t type, const uint8_t *data, size_t sz, aom_metadata_insert_flags_t insert_flag); /*!\brief Free metadata struct. * * Free metadata struct and its buffer. * * \param[in] metadata Metadata struct pointer */ void aom_img_metadata_free(aom_metadata_t *metadata); #ifdef __cplusplus } // extern "C" #endif #endif // AOM_AOM_AOM_IMAGE_H_ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/multimedia/obu_util/sources/aom_integer.c ================================================ /* * Copyright (c) 2018, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #include <assert.h> #include "aom_integer.h" static const size_t kMaximumLeb128Size = 8; static const uint8_t kLeb128ByteMask = 0x7f; // Binary: 01111111 // Disallow values larger than 32-bits to ensure consistent behavior on 32 and // 64 bit targets: value is typically used to determine buffer allocation size // when decoded. static const uint64_t kMaximumLeb128Value = UINT32_MAX; size_t aom_uleb_size_in_bytes(uint64_t value) { size_t size = 0; do { ++size; } while ((value >>= 7) != 0); return size; } int aom_uleb_decode(const uint8_t *buffer, size_t available, uint64_t *value, size_t *length) { if (buffer && value) { *value = 0; for (size_t i = 0; i < kMaximumLeb128Size && i < available; ++i) { const uint8_t decoded_byte = *(buffer + i) & kLeb128ByteMask; *value |= ((uint64_t)decoded_byte) << (i * 7); if ((*(buffer + i) >> 7) == 0) { if (length) { *length = i + 1; } // Fail on values larger than 32-bits to ensure consistent behavior on // 32 and 64 bit targets: value is typically used to determine buffer // allocation size. if (*value > UINT32_MAX) return -1; return 0; } } } // If we get here, either the buffer/value pointers were invalid, // or we ran over the available space return -1; } int aom_uleb_encode(uint64_t value, size_t available, uint8_t *coded_value, size_t *coded_size) { const size_t leb_size = aom_uleb_size_in_bytes(value); if (value > kMaximumLeb128Value || leb_size > kMaximumLeb128Size || leb_size > available || !coded_value || !coded_size) { return -1; } for (size_t i = 0; i < leb_size; ++i) { uint8_t byte = value & 0x7f; value >>= 7; if (value != 0) byte |= 0x80; // Signal that more bytes follow. *(coded_value + i) = byte; } *coded_size = leb_size; return 0; } int aom_uleb_encode_fixed_size(uint64_t value, size_t available, size_t pad_to_size, uint8_t *coded_value, size_t *coded_size) { if (value > kMaximumLeb128Value || !coded_value || !coded_size || available < pad_to_size || pad_to_size > kMaximumLeb128Size) { return -1; } const uint64_t limit = 1ULL << (7 * pad_to_size); if (value >= limit) { // Can't encode 'value' within 'pad_to_size' bytes return -1; } for (size_t i = 0; i < pad_to_size; ++i) { uint8_t byte = value & 0x7f; value >>= 7; if (i < pad_to_size - 1) byte |= 0x80; // Signal that more bytes follow. *(coded_value + i) = byte; } assert(value == 0); *coded_size = pad_to_size; return 0; } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/multimedia/obu_util/sources/aom_integer.h ================================================ /* * Copyright (c) 2016, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_AOM_AOM_INTEGER_H_ #define AOM_AOM_AOM_INTEGER_H_ /* get ptrdiff_t, size_t, wchar_t, NULL */ #include <stddef.h> #if defined(_MSC_VER) #define AOM_FORCE_INLINE __forceinline #define AOM_INLINE __inline #else #define AOM_FORCE_INLINE __inline__ __attribute__((always_inline)) #define AOM_INLINE inline #endif /* Assume platforms have the C99 standard integer types. */ #if defined(__cplusplus) #if !defined(__STDC_FORMAT_MACROS) #define __STDC_FORMAT_MACROS #endif #if !defined(__STDC_LIMIT_MACROS) #define __STDC_LIMIT_MACROS #endif #endif // __cplusplus #include <stdint.h> #include <inttypes.h> #if defined(__cplusplus) extern "C" { #endif // __cplusplus // Returns size of uint64_t when encoded using LEB128. size_t aom_uleb_size_in_bytes(uint64_t value); // Returns 0 on success, -1 on decode failure. // On success, 'value' stores the decoded LEB128 value and 'length' stores // the number of bytes decoded. int aom_uleb_decode(const uint8_t *buffer, size_t available, uint64_t *value, size_t *length); // Encodes LEB128 integer. Returns 0 when successful, and -1 upon failure. int aom_uleb_encode(uint64_t value, size_t available, uint8_t *coded_value, size_t *coded_size); // Encodes LEB128 integer to size specified. Returns 0 when successful, and -1 // upon failure. // Note: This will write exactly pad_to_size bytes; if the value cannot be // encoded in this many bytes, then this will fail. int aom_uleb_encode_fixed_size(uint64_t value, size_t available, size_t pad_to_size, uint8_t *coded_value, size_t *coded_size); #if defined(__cplusplus) } // extern "C" #endif // __cplusplus #endif // AOM_AOM_AOM_INTEGER_H_ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/multimedia/obu_util/sources/bitops.h ================================================ /* * Copyright (c) 2016, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_AOM_PORTS_BITOPS_H_ #define AOM_AOM_PORTS_BITOPS_H_ #include <assert.h> #include "msvc.h" #include "aom_config.h" #ifdef _MSC_VER #if defined(_M_X64) || defined(_M_IX86) #include <intrin.h> #define USE_MSC_INTRINSICS #endif #endif #ifdef __cplusplus extern "C" { #endif // get_msb: // Returns (int)floor(log2(n)). n must be > 0. // These versions of get_msb() are only valid when n != 0 because all // of the optimized versions are undefined when n == 0: // https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html // use GNU builtins where available. #if defined(__GNUC__) && \ ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4) static INLINE int get_msb(unsigned int n) { assert(n != 0); return 31 ^ __builtin_clz(n); } #elif defined(USE_MSC_INTRINSICS) #pragma intrinsic(_BitScanReverse) static INLINE int get_msb(unsigned int n) { unsigned long first_set_bit; assert(n != 0); _BitScanReverse(&first_set_bit, n); return first_set_bit; } #undef USE_MSC_INTRINSICS #else static INLINE int get_msb(unsigned int n) { int log = 0; unsigned int value = n; int i; assert(n != 0); for (i = 4; i >= 0; --i) { const int shift = (1 << i); const unsigned int x = value >> shift; if (x != 0) { value = x; log += shift; } } return log; } #endif #ifdef __cplusplus } // extern "C" #endif #endif // AOM_AOM_PORTS_BITOPS_H_ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/multimedia/obu_util/sources/bitreader_buffer.c ================================================ /* * Copyright (c) 2016, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #include <assert.h> #include "aom_config.h" #include "bitreader_buffer.h" #include "recenter.h" #include "bitops.h" size_t aom_rb_bytes_read(const struct aom_read_bit_buffer *rb) { return (rb->bit_offset + 7) >> 3; } int aom_rb_read_bit(struct aom_read_bit_buffer *rb) { const uint32_t off = rb->bit_offset; const uint32_t p = off >> 3; const int q = 7 - (int)(off & 0x7); if (rb->bit_buffer + p < rb->bit_buffer_end) { const int bit = (rb->bit_buffer[p] >> q) & 1; rb->bit_offset = off + 1; return bit; } else { if (rb->error_handler) rb->error_handler(rb->error_handler_data); return 0; } } int aom_rb_read_literal(struct aom_read_bit_buffer *rb, int bits) { assert(bits <= 31); int value = 0, bit; for (bit = bits - 1; bit >= 0; bit--) value |= aom_rb_read_bit(rb) << bit; return value; } uint32_t aom_rb_read_unsigned_literal(struct aom_read_bit_buffer *rb, int bits) { assert(bits <= 32); uint32_t value = 0; int bit; for (bit = bits - 1; bit >= 0; bit--) value |= (uint32_t)aom_rb_read_bit(rb) << bit; return value; } int aom_rb_read_inv_signed_literal(struct aom_read_bit_buffer *rb, int bits) { const int nbits = sizeof(unsigned) * 8 - bits - 1; const unsigned value = (unsigned)aom_rb_read_literal(rb, bits + 1) << nbits; return ((int)value) >> nbits; } uint32_t aom_rb_read_uvlc(struct aom_read_bit_buffer *rb) { int leading_zeros = 0; while (leading_zeros < 32 && !aom_rb_read_bit(rb)) ++leading_zeros; // Maximum 32 bits. if (leading_zeros == 32) return UINT32_MAX; const uint32_t base = (1u << leading_zeros) - 1; const uint32_t value = aom_rb_read_literal(rb, leading_zeros); return base + value; } static uint16_t aom_rb_read_primitive_quniform(struct aom_read_bit_buffer *rb, uint16_t n) { if (n <= 1) return 0; const int l = get_msb(n) + 1; const int m = (1 << l) - n; const int v = aom_rb_read_literal(rb, l - 1); return v < m ? v : (v << 1) - m + aom_rb_read_bit(rb); } static uint16_t aom_rb_read_primitive_subexpfin(struct aom_read_bit_buffer *rb, uint16_t n, uint16_t k) { int i = 0; int mk = 0; while (1) { int b = (i ? k + i - 1 : k); int a = (1 << b); if (n <= mk + 3 * a) { return aom_rb_read_primitive_quniform(rb, n - mk) + mk; } if (!aom_rb_read_bit(rb)) { return aom_rb_read_literal(rb, b) + mk; } i = i + 1; mk += a; } assert(0); return 0; } static uint16_t aom_rb_read_primitive_refsubexpfin( struct aom_read_bit_buffer *rb, uint16_t n, uint16_t k, uint16_t ref) { return inv_recenter_finite_nonneg(n, ref, aom_rb_read_primitive_subexpfin(rb, n, k)); } int16_t aom_rb_read_signed_primitive_refsubexpfin( struct aom_read_bit_buffer *rb, uint16_t n, uint16_t k, int16_t ref) { ref += n - 1; const uint16_t scaled_n = (n << 1) - 1; return aom_rb_read_primitive_refsubexpfin(rb, scaled_n, k, ref) - n + 1; } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/multimedia/obu_util/sources/bitreader_buffer.h ================================================ /* * Copyright (c) 2016, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_AOM_DSP_BITREADER_BUFFER_H_ #define AOM_AOM_DSP_BITREADER_BUFFER_H_ #include <limits.h> #include "aom_integer.h" #ifdef __cplusplus extern "C" { #endif typedef void (*aom_rb_error_handler)(void *data); struct aom_read_bit_buffer { const uint8_t *bit_buffer; const uint8_t *bit_buffer_end; uint32_t bit_offset; void *error_handler_data; aom_rb_error_handler error_handler; }; size_t aom_rb_bytes_read(const struct aom_read_bit_buffer *rb); int aom_rb_read_bit(struct aom_read_bit_buffer *rb); int aom_rb_read_literal(struct aom_read_bit_buffer *rb, int bits); uint32_t aom_rb_read_unsigned_literal(struct aom_read_bit_buffer *rb, int bits); int aom_rb_read_inv_signed_literal(struct aom_read_bit_buffer *rb, int bits); uint32_t aom_rb_read_uvlc(struct aom_read_bit_buffer *rb); int16_t aom_rb_read_signed_primitive_refsubexpfin( struct aom_read_bit_buffer *rb, uint16_t n, uint16_t k, int16_t ref); #ifdef __cplusplus } // extern "C" #endif #endif // AOM_AOM_DSP_BITREADER_BUFFER_H_ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/multimedia/obu_util/sources/msvc.h ================================================ /* * Copyright (c) 2016, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_AOM_PORTS_MSVC_H_ #define AOM_AOM_PORTS_MSVC_H_ #ifdef _MSC_VER #include "aom_config.h" #if _MSC_VER < 1900 // VS2015 provides snprintf #define snprintf _snprintf #endif // _MSC_VER < 1900 #if _MSC_VER < 1800 // VS2013 provides round #include <math.h> static INLINE double round(double x) { if (x < 0) return ceil(x - 0.5); else return floor(x + 0.5); } static INLINE float roundf(float x) { if (x < 0) return (float)ceil(x - 0.5f); else return (float)floor(x + 0.5f); } static INLINE long lroundf(float x) { if (x < 0) return (long)(x - 0.5f); else return (long)(x + 0.5f); } #endif // _MSC_VER < 1800 #if HAVE_AVX #include <immintrin.h> // Note: // _mm256_insert_epi16 intrinsics is available from vs2017. // We define this macro for vs2015 and earlier. The // intrinsics used here are in vs2015 document: // https://msdn.microsoft.com/en-us/library/hh977022.aspx // Input parameters: // a: __m256i, // d: int16_t, // indx: imm8 (0 - 15) #if _MSC_VER <= 1900 #define _mm256_insert_epi16(a, d, indx) \ _mm256_insertf128_si256( \ a, \ _mm_insert_epi16(_mm256_extractf128_si256(a, indx >> 3), d, indx % 8), \ indx >> 3) static INLINE int _mm256_extract_epi32(__m256i a, const int i) { return a.m256i_i32[i & 7]; } static INLINE __m256i _mm256_insert_epi32(__m256i a, int b, const int i) { __m256i c = a; c.m256i_i32[i & 7] = b; return c; } #endif // _MSC_VER <= 1900 #endif // HAVE_AVX #endif // _MSC_VER #endif // AOM_AOM_PORTS_MSVC_H_ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/multimedia/obu_util/sources/obu_util.c ================================================ /* * Copyright (c) 2018, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #include <assert.h> #include "obu_util.h" #include "bitreader_buffer.h" static aom_codec_err_t read_obu_size(const uint8_t *data, size_t bytes_available, size_t *const obu_size, size_t *const length_field_size) { uint64_t u_obu_size = 0; if (aom_uleb_decode(data, bytes_available, &u_obu_size, length_field_size) != 0) { return AOM_CODEC_CORRUPT_FRAME; } if (u_obu_size > UINT32_MAX) return AOM_CODEC_CORRUPT_FRAME; *obu_size = (size_t)u_obu_size; return AOM_CODEC_OK; } // Parses OBU header and stores values in 'header'. static aom_codec_err_t read_obu_header(struct aom_read_bit_buffer *rb, int is_annexb, ObuHeader *header) { if (!rb || !header) return AOM_CODEC_INVALID_PARAM; const ptrdiff_t bit_buffer_byte_length = rb->bit_buffer_end - rb->bit_buffer; if (bit_buffer_byte_length < 1) return AOM_CODEC_CORRUPT_FRAME; header->size = 1; if (aom_rb_read_bit(rb) != 0) { // Forbidden bit. Must not be set. return AOM_CODEC_CORRUPT_FRAME; } header->type = (OBU_TYPE)aom_rb_read_literal(rb, 4); header->has_extension = aom_rb_read_bit(rb); header->has_size_field = aom_rb_read_bit(rb); if (!header->has_size_field && !is_annexb) { // section 5 obu streams must have obu_size field set. return AOM_CODEC_UNSUP_BITSTREAM; } // obu_reserved_1bit must be set to 0. The value is ignored by a decoder. aom_rb_read_bit(rb); if (header->has_extension) { if (bit_buffer_byte_length == 1) return AOM_CODEC_CORRUPT_FRAME; header->size += 1; header->temporal_layer_id = aom_rb_read_literal(rb, 3); header->spatial_layer_id = aom_rb_read_literal(rb, 2); // extension_header_reserved_3bits must be set to 0. The value is ignored by // a decoder. aom_rb_read_literal(rb, 3); } else { header->temporal_layer_id = 0; header->spatial_layer_id = 0; } return AOM_CODEC_OK; } aom_codec_err_t aom_read_obu_header(uint8_t *buffer, size_t buffer_length, size_t *consumed, ObuHeader *header, int is_annexb) { if (buffer_length < 1 || !consumed || !header) return AOM_CODEC_INVALID_PARAM; // TODO(tomfinegan): Set the error handler here and throughout this file, and // confirm parsing work done via aom_read_bit_buffer is successful. struct aom_read_bit_buffer rb = { buffer, buffer + buffer_length, 0, NULL, NULL }; aom_codec_err_t parse_result = read_obu_header(&rb, is_annexb, header); if (parse_result == AOM_CODEC_OK) *consumed = header->size; return parse_result; } aom_codec_err_t aom_read_obu_header_and_size(const uint8_t *data, size_t bytes_available, int is_annexb, ObuHeader *obu_header, size_t *const payload_size, size_t *const bytes_read) { size_t length_field_size_obu = 0; size_t length_field_size_payload = 0; size_t obu_size = 0; aom_codec_err_t status; if (is_annexb) { // Size field comes before the OBU header, and includes the OBU header status = read_obu_size(data, bytes_available, &obu_size, &length_field_size_obu); if (status != AOM_CODEC_OK) return status; } struct aom_read_bit_buffer rb = { data + length_field_size_obu, data + bytes_available, 0, NULL, NULL }; status = read_obu_header(&rb, is_annexb, obu_header); if (status != AOM_CODEC_OK) return status; if (!obu_header->has_size_field) { assert(is_annexb); // Derive the payload size from the data we've already read if (obu_size < obu_header->size) return AOM_CODEC_CORRUPT_FRAME; *payload_size = obu_size - obu_header->size; } else { // Size field comes after the OBU header, and is just the payload size status = read_obu_size( data + length_field_size_obu + obu_header->size, bytes_available - length_field_size_obu - obu_header->size, payload_size, &length_field_size_payload); if (status != AOM_CODEC_OK) return status; } *bytes_read = length_field_size_obu + obu_header->size + length_field_size_payload; return AOM_CODEC_OK; } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/multimedia/obu_util/sources/obu_util.h ================================================ /* * Copyright (c) 2018, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_AV1_COMMON_OBU_UTIL_H_ #define AOM_AV1_COMMON_OBU_UTIL_H_ #include "aom_codec.h" #ifdef __cplusplus extern "C" { #endif typedef struct { size_t size; // Size (1 or 2 bytes) of the OBU header (including the // optional OBU extension header) in the bitstream. OBU_TYPE type; int has_size_field; int has_extension; // Whether the optional OBU extension header is present. // The following fields come from the OBU extension header. They are set to 0 // if has_extension is false. int temporal_layer_id; int spatial_layer_id; } ObuHeader; aom_codec_err_t aom_read_obu_header(uint8_t *buffer, size_t buffer_length, size_t *consumed, ObuHeader *header, int is_annexb); aom_codec_err_t aom_read_obu_header_and_size(const uint8_t *data, size_t bytes_available, int is_annexb, ObuHeader *obu_header, size_t *const payload_size, size_t *const bytes_read); #ifdef __cplusplus } // extern "C" #endif #endif // AOM_AV1_COMMON_OBU_UTIL_H_ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/multimedia/obu_util/sources/recenter.h ================================================ /* * Copyright (c) 2018, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_AOM_DSP_RECENTER_H_ #define AOM_AOM_DSP_RECENTER_H_ #include "aom_config.h" #include "aom_integer.h" // Inverse recenters a non-negative literal v around a reference r static INLINE uint16_t inv_recenter_nonneg(uint16_t r, uint16_t v) { if (v > (r << 1)) return v; else if ((v & 1) == 0) return (v >> 1) + r; else return r - ((v + 1) >> 1); } // Inverse recenters a non-negative literal v in [0, n-1] around a // reference r also in [0, n-1] static INLINE uint16_t inv_recenter_finite_nonneg(uint16_t n, uint16_t r, uint16_t v) { if ((r << 1) <= n) { return inv_recenter_nonneg(r, v); } else { return n - 1 - inv_recenter_nonneg(n - 1 - r, v); } } // Recenters a non-negative literal v around a reference r static INLINE uint16_t recenter_nonneg(uint16_t r, uint16_t v) { if (v > (r << 1)) return v; else if (v >= r) return ((v - r) << 1); else return ((r - v) << 1) - 1; } // Recenters a non-negative literal v in [0, n-1] around a // reference r also in [0, n-1] static INLINE uint16_t recenter_finite_nonneg(uint16_t n, uint16_t r, uint16_t v) { if ((r << 1) <= n) { return recenter_nonneg(r, v); } else { return recenter_nonneg(n - 1 - r, n - 1 - v); } } #endif // AOM_AOM_DSP_RECENTER_H_ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/network/rfkill/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rfkill" PKG_VERSION="0.5" PKG_SHA256="e0ae3004215e39a6c5c36e0726558740728d16f67ebdb8bea621250f6091d86a" PKG_LICENSE="GPL" PKG_SITE="https://wireless.wiki.kernel.org/en/users/documentation/rfkill" PKG_URL="https://www.kernel.org/pub/software/network/rfkill/$PKG_NAME-$PKG_VERSION.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A small userspace tool to query the state of the rfkill switches, buttons and subsystem interfaces." ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/network/rfkill/patches/rfkill-0001-fix-version-sh.patch ================================================ diff -Naur a/version.sh b/version.sh --- a/version.sh +++ b/version.sh @@ -12,19 +12,6 @@ if test "x$SUFFIX" != 'x'; then v="$VERSION$SUFFIX" -elif head=`git rev-parse --verify HEAD 2>/dev/null`; then - git update-index --refresh --unmerged > /dev/null - descr=$(git describe 2>/dev/null || echo "v$VERSION") - - # on git builds check that the version number above - # is correct... - [ "${descr%%-*}" = "v$VERSION" ] || exit 2 - - echo -n 'const char rfkill_version[] = "' > "$OUT" - v="${descr#v}" - if git diff-index --name-only HEAD | read dummy ; then - v="$v"-dirty - fi else v="$VERSION" fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/opengl-meson/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="opengl-meson" PKG_VERSION="8bfb8ebe38f615907852ada7ff375a04f53f3e81" PKG_SHA256="9468dad254ef7b2486f738f594c5a78fbb1926a6661923ae10054d9960978ec7" PKG_LICENSE="nonfree" PKG_SITE="http://openlinux.amlogic.com:8000/download/ARM/filesystem/" PKG_URL="https://github.com/CoreELEC/opengl-meson/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libdrm opentee_linuxdriver" PKG_LONGDESC="OpenGL ES pre-compiled libraries for Mali GPUs found in Amlogic Meson SoCs." PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib cp -p lib/arm64/gondul/r12p0/fbdev/libMali.so ${INSTALL}/usr/lib/libMali.gondul.g12b.so cp -p lib/arm64/dvalin/r12p0/fbdev/libMali.so ${INSTALL}/usr/lib/libMali.dvalin.g12a.so cp -p lib/arm64/gondul/r37p0/fbdev/libMali_r1p0.so ${INSTALL}/usr/lib/libMali.gondul.so cp -p lib/arm64/dvalin/r37p0/fbdev/libMali.so ${INSTALL}/usr/lib/libMali.dvalin.so cp -p lib/arm64/valhall/r41p0/fbdev/libMali.so ${INSTALL}/usr/lib/libMali.valhall.so mkdir -p ${SYSROOT_PREFIX}/usr/lib cp -p lib/arm64/gondul/r37p0/fbdev/libMali_r1p0.so ${SYSROOT_PREFIX}/usr/lib/libMali.so ln -sf /var/lib/libMali.so ${INSTALL}/usr/lib/libMali.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libmali.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libmali.so.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libEGL.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libEGL.so.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libEGL.so.1.0.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLES_CM.so.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv1_CM.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv1_CM.so.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv1_CM.so.1.0.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv1_CM.so.1.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv2.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv2.so.2 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv2.so.2.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv2.so.2.0.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so.3 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so.3.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so.3.0.0 # install headers and libraries to TOOLCHAIN cp -rf ${PKG_BUILD}/include/* ${SYSROOT_PREFIX}/usr/include cp -rf ${PKG_BUILD}/pkgconfig/* ${SYSROOT_PREFIX}/usr/lib/pkgconfig cp ${SYSROOT_PREFIX}/usr/include/EGL_platform/platform_fbdev/* ${SYSROOT_PREFIX}/usr/include/EGL rm -rf ${SYSROOT_PREFIX}/usr/include/EGL_platform ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libmali.so ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libMali.so.0 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libEGL.so ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libEGL.so.1 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libEGL.so.1.0.0 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLES_CM.so.1 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv1_CM.so ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv1_CM.so.1 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv1_CM.so.1.0.1 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv1_CM.so.1.1 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv2.so ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv2.so.2 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv2.so.2.0 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv2.so.2.0.0 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv3.so ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv3.so.3 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv3.so.3.0 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv3.so.3.0.0 mkdir -p ${INSTALL}/usr/sbin cp ${PKG_DIR}/scripts/libmali-overlay-setup ${INSTALL}/usr/sbin # install needed files for compiling mkdir -p ${SYSROOT_PREFIX}/usr/include/EGL cp -pr include/EGL ${SYSROOT_PREFIX}/usr/include cp -pr include/EGL_platform/platform_fbdev/* ${SYSROOT_PREFIX}/usr/include/EGL mkdir -p ${SYSROOT_PREFIX}/usr/include/GLES2 cp -pr include/GLES2 ${SYSROOT_PREFIX}/usr/include mkdir -p ${SYSROOT_PREFIX}/usr/include/GLES3 cp -pr include/GLES3 ${SYSROOT_PREFIX}/usr/include mkdir -p ${SYSROOT_PREFIX}/usr/include/KHR cp -pr include/KHR ${SYSROOT_PREFIX}/usr/include } post_install() { enable_service unbind-console.service enable_service libmali.service } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/opengl-meson/scripts/libmali-overlay-setup ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) mkdir -p /var/lib32 if grep -qE "sc2|s4" /proc/device-tree/compatible; then ln -sf /usr/lib/libMali.dvalin.so /var/lib/libMali.so ln -sf /usr/lib32/libMali.dvalin.so /var/lib32/libMali.so elif grep -q "t7" /proc/device-tree/compatible; then ln -sf /usr/lib/libMali.gondul.so /var/lib/libMali.so ln -sf /usr/lib32/libMali.gondul.so /var/lib32/libMali.so elif grep -q "g12b" /proc/device-tree/compatible; then ln -sf /usr/lib/libMali.gondul.g12b.so /var/lib/libMali.so ln -sf /usr/lib32/libMali.gondul.g12b.so /var/lib32/libMali.so elif grep -q "g12a" /proc/device-tree/compatible; then ln -sf /usr/lib/libMali.dvalin.g12a.so /var/lib/libMali.so ln -sf /usr/lib32/libMali.dvalin.g12a.so /var/lib32/libMali.so elif grep -q "s5" /proc/device-tree/compatible; then ln -sf /usr/lib/libMali.valhall.so /var/lib/libMali.so ln -sf /usr/lib32/libMali.valhall.so /var/lib32/libMali.so fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/opengl-meson/sources/pkgconfig/egl.pc ================================================ prefix=/usr exec_prefix=/usr libdir=${exec_prefix}/lib includedir=${prefix}/include Name: egl Description: Amlogic implementation of EGL Version: 0.99 Libs: -L${libdir} -lEGL -lGLESv2 Cflags: -I${includedir}/ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/opengl-meson/sources/pkgconfig/glesv1_cm.pc ================================================ prefix=/usr exec_prefix=${prefix} libdir=/usr/lib includedir=${prefix}/include Name: glesv1_cm Description: libhybris OpenGL ES 1.1 library Version: 0.1.0 Libs: -L${libdir} -lGLESv1_CM Cflags: -I${includedir} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/opengl-meson/sources/pkgconfig/glesv2.pc ================================================ prefix=/usr exec_prefix=/usr libdir=${exec_prefix}/lib includedir=${prefix}/include Name: glesv2 Description: Amlogic implementation of OpenGL ESv2 Version: 0.99 Libs: -L${libdir} -lGLESv2 Cflags: -I${includedir}/ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/opengl-meson/sources/pkgconfig/glesv3.pc ================================================ prefix=/usr exec_prefix=${prefix} libdir=/usr/lib includedir=${prefix}/include Name: glesv3 Description: libhybris OpenGL ES 3.0 library Version: 0.1.0 Libs: -L${libdir} -lGLESv3 Cflags: -I${includedir} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/opengl-meson/system.d/libmali.service ================================================ [Unit] Description=Create libMali overlay for specific AML device After=var.mount Before=emuelec-autostart.service [Service] Type=oneshot ExecStart=/usr/sbin/libmali-overlay-setup [Install] WantedBy=local-fs.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/opengl-meson/system.d/unbind-console.service ================================================ [Unit] Description=Unbind framebuffer console ConditionPathExists=/sys/class/vtconsole/vtcon1/bind [Service] Type=oneshot ExecStart=/bin/sh -c 'echo 0 > /sys/class/vtconsole/vtcon1/bind' [Install] WantedBy=graphical.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/parse-android-dynparts/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="parse-android-dynparts" PKG_VERSION="c8837c1cd0c4fbc29641980b71079fc4f3cabcc0" PKG_SHA256="5a9df34c2078ff947a478723e8b06dc427bc71c238125657a913536acb29146a" PKG_LICENSE="Apache-2.0 license" PKG_SITE="https://github.com/tchebb/parse-android-dynparts" PKG_URL="https://github.com/tchebb/parse-android-dynparts/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain openssl" PKG_LONGDESC="Tool mounts super.img files with a standard Linux userspace tools." PKG_CMAKE_OPTS_TARGET="-DCMAKE_CXX_FLAGS=-D_FILE_OFFSET_BITS=64" makeinstall_target() { mkdir -p ${INSTALL}/usr/sbin cp ${PKG_BUILD}/.${TARGET_NAME}/parse-android-dynparts ${INSTALL}/usr/sbin } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/parse-android-dynparts/patches/remove-warning-skip-zero-length-partition.patch ================================================ --- a/main.cpp 2021-04-14 23:31:17.000000000 +0200 +++ b/main.cpp 2022-10-20 15:57:48.632068796 +0200 @@ -30,8 +30,6 @@ int main(int argc, char* argv[]) { // Code structure taken from Android's system/core/fs_mgr/fs_mgr_dm_linear.cpp for (auto partition : metadata->partitions) { if (!partition.num_extents) { - cerr << "Skipping zero-length logical partition: " - << GetPartitionName(partition) << endl; continue; } if (partition.attributes & LP_PARTITION_ATTR_DISABLED) { ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/sysutils/amremote/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="amremote" PKG_VERSION="455eb8ef8507acf899d4723c022de1c981bb697e" PKG_SHA256="985bd796995cd756b0edcc34a88e31392a21c04b6c9a4a46e20f4bca19ab1511" PKG_LICENSE="other" PKG_SITE="http://www.amlogic.com" PKG_URL="https://github.com/CoreELEC/amremote/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain usbutils" PKG_LONGDESC="amremote - IR remote configuration utility for Amlogic-based devices" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp remotecfg ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/lib/coreelec cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/lib/coreelec } post_install() { enable_service remote-config.service } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/sysutils/amremote/scripts/remote-config ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) remap_keys () { [ ! -f "$1" ] && return sed -i 's/ 15[^0-9]*$/ 1/ s/ 63[^0-9]*$/ 90/ s/ 97[^0-9]*$/ 28/ s/ 102[^0-9]*$/ 172/ s/ 125[^0-9]*$/ 46/ s/ 128[^0-9]*$/ 45/ s/ 139[^0-9]*$/ 46/ s/ 142[^0-9]*$/ 116/ s/ 143[^0-9]*$/ 116/ s/ 158[^0-9]*$/ 1/ s/ 183[^0-9]*$/ 59/ s/ 184[^0-9]*$/ 399/ s/ 185[^0-9]*$/ 400/ s/ 186[^0-9]*$/ 60/ s/ 232[^0-9]*$/ 28/ s/ 240[^0-9]*$/ 164/ s/ 241[^0-9]*$/ 163/ s/ 242[^0-9]*$/ 165/ s/ 244[^0-9]*$/ 208/ s/ 245[^0-9]*$/ 168/ s/ 264[^0-9]*$/ 63/ s/ 704[^0-9]*$/ 116/' \ "$1" } [ ! -e "/proc/device-tree/meson-ir/compatible" -o ! -e "/proc/device-tree/meson-remote/compatible" ] && exit if [ -f "/flash/remote.disable" -o -f "/storage/.config/remote.disable" ]; then echo "remote control disabled by user" exit 0 fi if [ -f "/flash/remote.force_meson_ir" -o -f "/storage/.config/remote.force_meson_ir" ]; then force_meson_ir="yes" else force_meson_ir="no" fi if [ -f "/flash/remote.conf" ]; then REMOTE_CONF_DIR="/flash" elif [ -f "/storage/.config/remote.conf" ]; then REMOTE_CONF_DIR="/storage/.config" else REMOTE_CONF_DIR="" if [ -d "/proc/device-tree/custom_maps" -a "$force_meson_ir" = "no" ]; then MAP_NAME=$(tr -d '\0' 2>/dev/null < /proc/device-tree/custom_maps/map_0/mapname) echo "using meson-remote, with pre-defined map '$MAP_NAME' from dtb" modprobe meson-remote touch /run/use-meson-remote exit 0 fi fi if [ -d "$REMOTE_CONF_DIR" ]; then echo "using meson-remote, conf from $REMOTE_CONF_DIR" if [ -d "/proc/device-tree/custom_maps" ]; then MAP_NAME=$(tr -d '\0' 2>/dev/null < /proc/device-tree/custom_maps/map_0/mapname) echo "also using pre-defined map '$MAP_NAME' from dtb" fi modprobe meson-remote touch /run/use-meson-remote for f in $REMOTE_CONF_DIR/remote*.conf; do echo "configuring remote with $f" cp "$f" /tmp/remote.conf remap_keys /tmp/remote.conf remotecfg /tmp/remote.conf rm -f /tmp/remote.conf done else echo "using meson-ir" modprobe meson-ir touch /run/use-meson-ir fi exit 0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/sysutils/amremote/system.d/remote-config.service ================================================ [Unit] Description=IR remote control support Before=graphical.target kodi.service After=multi-user.target ConditionPathExists=/proc/device-tree/meson-ir/compatible ConditionPathExists=/proc/device-tree/meson-remote/compatible [Service] Type=oneshot ExecStart=/usr/lib/coreelec/remote-config [Install] WantedBy=graphical.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/sysutils/dtb-xml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) PKG_NAME="dtb-xml" PKG_VERSION="1.0" PKG_LICENSE="GPL" PKG_SITE="https://coreelec.org" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Tool to handle custom dtb.img tweaks" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/coreelec mkdir -p ${INSTALL}/usr/share/bootloader install -m 0755 ${PKG_DIR}/scripts/dtb-xml.sh ${INSTALL}/usr/lib/coreelec/dtb-xml install -m 0644 ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/bootloader/dtb.xml ${INSTALL}/usr/share/bootloader/dtb.xml } post_install() { enable_service dtb-xml.service } # --------------------------------------- # No /flash/dtb.xml exist: # On first access of a variable by 'get_dtbxml_value' or 'get_dtbxml_multivalues' # by CE settings current defined default values are read by dtb-xml.sh and # migrated to /flash/dtb.xml. # # If a matching command value is found the option is set in dtb.xml. If no # matching value or the path is not found in dtb.img it get set to 'migrated'. # On next access of a option set to 'migrated' the dtb-xml.sh script try again # to read current value from dtb.img as it maybe turn to applicable after a # update of dtb.img by system update. # # /flash/dtb.xml get only be edited by dtb-xml.sh script and remain untouched # on update of the system. When a update is done user defined values are # applied to /flash/dtb.img by dtb.xml directly so no extra reboot is required. # # Any option node in /flash/dtb.xml can be forced updated by a tar update by # changing 'version' of a option node. So Team CoreELEC is still able to # maintain user /flash/dtb.xml. # # On bricked devices: remove /flash/dtb.xml and copy default dtb.img on /flash ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/sysutils/dtb-xml/scripts/dtb-xml.sh ================================================ #!/bin/sh # # SPDX-License-Identifier: GPL-3.0-or-later # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) # # Update dtb.img by dtb.xml # ##################################################### # # Command Line Arguments # -v = Show verbose output # -m = migrate dtb.img settings to dtb.xml # ##################################################### verbose=0 changed=0 migrate=0 edid=0 BOOT_ROOT='/flash' amlogic_dt_id='' while [ $# -ne 0 ]; do arg="$1" case "$arg" in -v) verbose=1 ;; -m) migrate=1 ;; -e) edid=1 ;; *) echo "Unknown option: '$arg'" exit ;; esac [ $# -gt 0 ] && shift done xml_file="$BOOT_ROOT/dtb.xml" default_xml_file="/usr/share/bootloader/dtb.xml" dtb_file="$BOOT_ROOT/dtb.img" [ -f /proc/device-tree/amlogic-dt-id ] && amlogic_dt_id=$(tr -d '\0' < /proc/device-tree/amlogic-dt-id) DT_ID=$(dtname) edid_bin_file="/storage/.config/edid.bin" ######################################################### # edid_to_xml ######################################################### # Return 1 if dtb.img needs to be updated function edid_to_xml() { ret=0 if [ ! -f ${xml_file} ]; then log "File '${xml_file}' doesn't exist" return ${ret} fi # check the presence of the node node_name=$(xmlstarlet sel -t -m '/dtb-settings/custom_edid/edid/cmd/value' -v "name()" ${xml_file}) if [ -z "${node_name}" ]; then log "Node 'custom_edid' doesn't exist" return ${ret} fi # read value from xml, this returns error code on empty node xml_file_hex=$(xmlstarlet sel -t -v '/dtb-settings/custom_edid/edid/cmd/value' ${xml_file}) if [ -f ${edid_bin_file} ]; then # read binary file edid.bin to hex string edid_bin_hex=$(xxd -c 8192 -p ${edid_bin_file} | tr -d '\n') edid_bin_hex_hdr=$(echo ${edid_bin_hex} | head -c 16) if [ "${edid_bin_hex_hdr}" != "00ffffffffffff00" ]; then log "Found text 'edid.bin' file" edid_bin_hex=$(cat ${edid_bin_file} | tr -d '\r\n') else log "Found binary 'edid.bin' file" fi else log "No 'edid.bin' file found" edid_bin_hex="" fi # compare value from file and xml if [ "${edid_bin_hex}" != "${xml_file_hex}" ]; then log "Update 'custom_edid' with '${edid_bin_hex}'" xmlstarlet ed -L -u '/dtb-settings/custom_edid/edid/cmd/value' -v "${edid_bin_hex}" ${xml_file} ret=1 fi log "Done" return ${ret} } ######################################################### # check_linux_version ######################################################### # Return 1 if given kernel version is lower than current kernel version function check_linux_version() { version_higher=$(uname -r | awk -F '.' \ -v ker_ver=$1 -v maj_ver=$2 -v min_ver=$3 '{ if ($1 > ker_ver) { print "Y"; } else if ($1 < ker_ver) { print "N"; } else { if ($2 > maj_ver) { print "Y"; } else if ($2 < maj_ver) { print "N"; } else { if ($3 >= min_ver) { print "Y"; } else { print "N"; } } } }') if [ "$version_higher" = "Y" ]; then return 0 else return 1 fi } ######################################################### # log ######################################################### function log() { [ "$verbose" == 1 ] && echo "$@" } ######################################################### # update_migrated_xml ######################################################### # Update a specified option node if value in dtb.img # become applicable by parameter: $update_node function update_migrated_xml() { update_node="$1" log " try to update migrated node '$update_node' by dtb.img" option_nodes=$(xmlstarlet sel -t -m "//$update_node/*" -v "name()" -n $xml_file) # check all options for specified migrated option node for option in $option_nodes; do cmd_count=$(xmlstarlet sel -t -c "count(//$update_node/$option/cmd)" $xml_file) if [ "$cmd_count" == 0 ]; then continue fi # check all commands for this current node of BOOT_ROOT dtb.xml if all commands are equal to dtb.img for cnt in $(seq 1 $cmd_count); do cmd_path=$(xmlstarlet sel -t -v "//$update_node/$option/cmd[$cnt]/@path" $xml_file) fdt_option=$(xmlstarlet sel -t -v "//$update_node/$option/cmd[$cnt]/@option" $xml_file) fdt_option=${fdt_option:-"t"} cmd_type=$(xmlstarlet sel -t -m "//$update_node/$option/cmd[$cnt]" -v "concat('-$fdt_option ', @type)" $xml_file) case "$fdt_option" in t) act_value=$(fdtget $amlogic_dt_id $cmd_type $dtb_file $cmd_path 2>/dev/null) if [ "$?" == 0 ]; then cmd_value=$(xmlstarlet sel -t -m "//$update_node/$option" -m "cmd[$cnt]/value" -v "concat(.,' ')" $xml_file) [ -n "$cmd_value" ] && cmd_value=${cmd_value::-1} [ -n "$cmd_value" ] && cmd_value=${cmd_value#"0x"} if [ "$act_value" != "$cmd_value" ]; then continue 2 fi else continue 2 fi ;; d|r) [ -n "$(fdtget $amlogic_dt_id $dtb_file $cmd_path 2>/dev/null)" ] && continue 2 ;; esac done # option status changed to applicable, update BOOT_ROOT dtb.xml by current status name_option=$(xmlstarlet sel -t -v "//$update_node/$option/@name" -n $xml_file) xmlstarlet ed -L -u "//$update_node/@status" -v "$name_option" $xml_file xmlstarlet ed -L -d "//$update_node/${update_node}_migrated" $xml_file changed=1 log " option status changed from '$node_status' to '$name_option'" node_status="$name_option" break done # option is still not applicable if [ "$changed" == 0 ]; then log " option status stay unchanged at '$node_status'" fi log "" } ######################################################### # migrate_dtb_to_xml ######################################################### # Migrate BOOT_ROOT dtb.xml from dtb.img # # * If no BOOT_ROOT dtb.xml does exist the current values # from dtb.img are migrated by reading each single # option status value from current dtb.img # * If no matching option is found in BOOT_ROOT dtb.xml # set the option status to 'migrated' function migrate_dtb_to_xml() { log "" log "Migrate dtb.xml from dtb.img" log "" # loop through all BOOT_ROOT dtb.xml options root_nodes=$(xmlstarlet sel -t -m '/*/*' -v "name()" -n $xml_file) for node in $root_nodes; do node_status=$(xmlstarlet sel -t -v "//$node/@status" $xml_file) log "------------------------------------------" log " node: $node, status: '$node_status'" option_nodes=$(xmlstarlet sel -t -m "//$node/*" -v "name()" -n $xml_file) name_option_available=0 # check if the node apply at all by dt_id # if not skip any further check and set to 'migrated' node_dt_id=$(xmlstarlet sel -t -v "//$node/@dt_id" $xml_file) if [ -n "$node_dt_id" ]; then log " dt_id: $node_dt_id, coreelec-dt-id: $DT_ID" dt_id_match=0 for dt_id in $node_dt_id; do eval " case \$DT_ID in *"$dt_id"*) dt_id_match=1 ;; esac " done if [ "$dt_id_match" == 0 -o -z "$DT_ID" ]; then option_nodes="" fi fi for option in $option_nodes; do cmd_count=$(xmlstarlet sel -t -c "count(//$node/$option/cmd)" $xml_file) cmd_remove_exist=$(xmlstarlet sel -t -m "//$node/$option/cmd" -i '@option="d"' -o "1" -b -i '@option="r"' -o "1" $xml_file) # check all commands for this current node of BOOT_ROOT dtb.xml if all commands are equal to dtb.img for cnt in $(seq 1 $cmd_count); do cmd_path=$(xmlstarlet sel -t -v "//$node/$option/cmd[$cnt]/@path" $xml_file) fdt_option=$(xmlstarlet sel -t -v "//$update_node/$option/cmd[$cnt]/@option" $xml_file) fdt_option=${fdt_option:-"t"} cmd_type=$(xmlstarlet sel -t -m "//$node/$option/cmd[$cnt]" -v "concat('-$fdt_option ', @type)" $xml_file) case "$fdt_option" in t) act_value=$(fdtget $amlogic_dt_id $cmd_type $dtb_file $cmd_path 2>/dev/null) if [ "$?" == 0 ]; then cmd_value=$(xmlstarlet sel -t -m "//$node/$option" -m "cmd[$cnt]/value" -v "concat(.,' ')" $xml_file) [ -n "$cmd_value" ] && cmd_value=${cmd_value::-1} [ -n "$cmd_value" ] && cmd_value=${cmd_value#"0x"} if [ "$act_value" != "$cmd_value" ]; then continue 2 fi else continue 2 fi ;; d|r) [ -z "$(fdtget $amlogic_dt_id $dtb_file $cmd_path 2>/dev/null)" -a -n "$cmd_remove_exist" ] || continue 2 ;; esac done name_option_available=1 name_option=$(xmlstarlet sel -t -v "//$node/$option/@name" -n $xml_file) # if option is available set current status in BOOT_ROOT dtb.xml if [ "$node_status" != "$name_option" ]; then # special handling to migrate heartbeat setting from config.ini on Odroid devices case $node in sys_led) case $DT_ID in *odroid*) log " detected Odroid device, migrate heartbeat led setting from config.ini" heartbeat="$( cat /flash/config.ini | awk -F "=" '/^heartbeat=/{gsub(/"|\047/,"",$2); print $2}')" if [ "$heartbeat" == "0" ]; then name_option="off" fdtput $amlogic_dt_id -t s $dtb_file /gpioleds/sys_led linux,default-trigger none echo none > /sys/class/leds/sys_led/trigger fi ;; esac ;; wol) if check_linux_version 5 15 137; then wol="$( cat /flash/config.ini | awk -F "=" '/^wol=/{gsub(/"|\047/,"",$2); print $2}')" log " migrate WOL setting ($wol) from config.ini" if [ "$wol" == "1" ]; then name_option="on" fdtput $amlogic_dt_id -t i $dtb_file /soc/ethernet@fdc00000 wol 1 fi fi ;; esac log " migrate dtb.xml node '$node' to '$name_option'" xmlstarlet ed -L -u "//$node/@status" -v "$name_option" $xml_file continue 2 else log " option status already set, do not migrate option" fi done # if the option is not available in dtb.img set option status to 'migrated' with current dtb.img value if [ "$name_option_available" == 0 ]; then xmlstarlet ed -L -s "//$node" -t elem -n "${node}_migrated" $xml_file xmlstarlet ed -L -u "//$node/@status" -v "migrated" $xml_file xmlstarlet ed -L -i "//${node}_migrated" -t attr -n "name" -v "migrated" $xml_file log " option not applicable by default dtb.xml, migrate to '${node}_migrated'" fi done log "------------------------------------------" log "" } ######################################################### # update_dtb_by_dtb_xml ######################################################### # Update dtb.img by BOOT_ROOT dtb.xml # # * Check if the option in BOOT_ROOT dtb.xml does include # commands at all # * Check if the option in BOOT_ROOT dtb.xml commands are # different and update dtb.img if needed # * If dtb.img path is not found set the option to # 'migrated' as not applicable # * If option is set to 'migrated' check if it became # applicable after dtb.img update function update_dtb_by_dtb_xml() { root_nodes=$(xmlstarlet sel -t -m '/*/*' -v "name()" -n $xml_file) log "" for node in $root_nodes; do log "------------------------------------------" log " node: $node" node_status=$(xmlstarlet sel -t -v "//$node/@status" $xml_file) log " status: $node_status" node_dt_id=$(xmlstarlet sel -t -v "//$node/@dt_id" $xml_file) # check if dt_id is set for this node # if yes compare if the setting does apply for this $dtb_file # if not skip node and set to 'migrated' to hide the option in CoreELEC settings if [ -n "$node_dt_id" ]; then log " dt_id: $node_dt_id" log " coreelec-dt-id: $DT_ID" dt_id_match=0 for dt_id in $node_dt_id; do eval " case \$DT_ID in *"$dt_id"*) dt_id_match=1 ;; esac " done if [ "$dt_id_match" == 0 -o -z "$DT_ID" ]; then log "" log " not applicable as dt_id does not match" log "" xmlstarlet ed -L -u "//$node/@status" -v "migrated" $xml_file continue fi fi log "" # check if node is 'migrated' and update if possible if [ "$node_status" == "migrated" ]; then update_migrated_xml $node fi # check if node does include commands to be executed cmd_count=$(xmlstarlet sel -t -c "count(//$node/node()[@name='$node_status']/cmd)" $xml_file) cmd_remove_exist=$(xmlstarlet sel -t -m "//$node/*/cmd" -i '@option="d"' -o "1" -b -i '@option="r"' -o "1" $xml_file) if [ "$cmd_count" == 0 ]; then log " no cmd for node status '$node_status' found" continue fi # check all commands for this current node of BOOT_ROOT dtb.xml if all commands are equal to dtb.img for cnt in $(seq 1 $cmd_count); do cmd_path=$(xmlstarlet sel -t -v "//$node/node()[@name='$node_status']/cmd[$cnt]/@path" $xml_file) fdt_option=$(xmlstarlet sel -t -v "//$node/node()[@name='$node_status']/cmd[$cnt]/@option" $xml_file) fdt_option=${fdt_option:-"t"} cmd_type=$(xmlstarlet sel -t -m "//$node/node()[@name='$node_status']/cmd[$cnt]" -v "concat('-${fdt_option} ', @type)" $xml_file) # check if node commands does exist in dtb.img at all case "$fdt_option" in t) act_value=$(fdtget $amlogic_dt_id $cmd_type $dtb_file $cmd_path 2>/dev/null) if [ "$?" == "0" -o -z "$act_value" -a -n "$cmd_remove_exist" ]; then cmd_value=$(xmlstarlet sel -t -m "//$node/node()[@name='$node_status']" -m "cmd[$cnt]/value" -v "concat('\"', .,'\" ')" $xml_file) [ -n "$cmd_value" ] && cmd_value=${cmd_value::-1} cmd="fdtput $amlogic_dt_id $cmd_type $dtb_file $cmd_path $cmd_value" cmd_value="${cmd_value//\"}" [ -n "$cmd_value" ] && cmd_value=${cmd_value#"0x"} # check if dtb.img value does match with current BOOT_ROOT dtb.xml status if [ "$act_value" != "$cmd_value" ]; then eval $cmd log " cmd[$cnt]: changed, $cmd_path: '$act_value' -> '$cmd_value', result: $?" changed=1 else log " cmd[$cnt]: unchanged, $cmd_path: '$cmd_value' == '$act_value'" fi else log " not applicable" xmlstarlet ed -L -u "//$node/@status" -v "migrated" $xml_file continue 2 fi ;; d|r) if [ -z "$(fdtget $amlogic_dt_id $dtb_file $cmd_path 2>/dev/null)" ]; then log " cmd[$cnt]: unchanged, still not exist" else cmd="fdtput $amlogic_dt_id $cmd_type $dtb_file $cmd_path" eval $cmd log " cmd[$cnt]: changed, $cmd_path: run option '$fdt_option', result: $?" changed=1 fi ;; esac done done log "------------------------------------------" log "" } ######################################################### # update_dtb_xml ######################################################### # Update BOOT_ROOT dtb.xml by default dtb.xml # # * Update whole BOOT_ROOT dtb.xml by default dtb.xml # if dtb-settings version is higher # * Check if a new node got introduced by default dtb.xml # * Check if default dtb.xml version is higher than # BOOT_ROOT dtb.xml version and update if needed function update_dtb_xml() { root_node_version=$(xmlstarlet sel -t -v "//dtb-settings/@version" $xml_file) default_root_node_version=$(xmlstarlet sel -t -v "//dtb-settings/@version" $default_xml_file) log "" log "------------------------------------------" log " dtb-settings version: $root_node_version" log " dtb-settings default version: $default_root_node_version" # default dtb.xml version changed, overwrite BOOT_ROOT dtb.xml if [ $root_node_version -lt $default_root_node_version ]; then log " update complete dtb.xml by default dtb.xml" cp -p $default_xml_file $xml_file fi root_nodes=$(xmlstarlet sel -t -m '/*/*' -v "name()" -n $xml_file) default_root_nodes=$(xmlstarlet sel -t -m '/*/*' -v "name()" -n $default_xml_file) # compare all default dtb.xml nodes with BOOT_ROOT dtb.xml for default_node in $default_root_nodes; do log "------------------------------------------" log " default node: $default_node" default_node_status=$(xmlstarlet sel -t -v "//$default_node/@status" $default_xml_file) default_node_version=$(xmlstarlet sel -t -v "//$default_node/@version" $default_xml_file) log " default status: $default_node_status, version: $default_node_version" node_status=$(xmlstarlet sel -t -v "//$default_node/@status" $xml_file) # new node in default dtb.xml found, copy whole node if [ -z "$node_status" ]; then log " node in current dtb.xml not found, get it from default dtb.xml" new_node=$(xmlstarlet sel -t -c "//$default_node" $default_xml_file) xmlstarlet ed --subnode "/dtb-settings" -t text -n "" -v "$new_node" $xml_file | \ xmlstarlet unesc | xmlstarlet format > tmp_file mv tmp_file $xml_file # node already exist in BOOT_ROOT dtb.xml, check if version update else node_version=$(xmlstarlet sel -t -v "//$default_node/@version" $xml_file) log " status: $node_status, version: $node_version" # newer version update node if [ $node_version -lt $default_node_version ]; then log " update node to version $default_node_version" xmlstarlet ed -L -d "//$default_node" $xml_file new_node=$(xmlstarlet sel -t -c "//$default_node" $default_xml_file) xmlstarlet ed --subnode "/dtb-settings" -t text -n "" -v "$new_node" $xml_file | \ xmlstarlet unesc | xmlstarlet format > tmp_file mv tmp_file $xml_file option_nodes=$(xmlstarlet sel -t -m "//$default_node/*" -v "name()" -n $xml_file) # check if old status still apply and set it if true for option in $option_nodes; do option_node_name=$(xmlstarlet sel -t -v "//$default_node/$option/@name" $xml_file) if [ "$node_status" == "$option_node_name" ]; then xmlstarlet ed -L -u "//$default_node/@status" -v "$node_status" $xml_file log " updated node status to: $node_status" continue 2 fi done fi fi done # compare all user dtb.xml nodes with default dtb.xml for node in $root_nodes; do log "------------------------------------------" log " node: $node" node_status=$(xmlstarlet sel -t -v "//$node/@status" $default_xml_file) if [ -z "$node_status" ]; then xmlstarlet ed -L -d "//$node" $xml_file log " node got removed by default dtb.xml" else log " node still in use by default dtb.xml" fi done log "------------------------------------------" log "" } ######################################################### # main script ######################################################### if [ ! -f $dtb_file ]; then log "Error, not found: $dtb_file, exit now" exit 2 fi # check if BOOT_ROOT is mounted as 'ro' grep -q " $BOOT_ROOT vfat ro," /proc/mounts rw="$?" # remount as 'rw' if needed if [ "$rw" == "0" ]; then log "Try to remount '$BOOT_ROOT' in 'rw' mode" mount -o rw,remount "$BOOT_ROOT" if [ "$?" != "0" ]; then echo "Failed to remount '$BOOT_ROOT' in 'rw' mode" exit 12 fi fi # copy default dtb.xml to BOOT_ROOT if not found if [ ! -f $xml_file ]; then if [ -f $default_xml_file ]; then log "Creating dtb.xml..." cp -p $default_xml_file $xml_file else log "Error, not found: '$default_xml_file', exit now" exit 2 fi fi if [ -n "$amlogic_dt_id" ]; then log "Using amlogic-dt-id: $amlogic_dt_id" amlogic_dt_id="-a $amlogic_dt_id" fi # handle script parameter if [ "$migrate" == 1 ]; then migrate_dtb_to_xml elif [ "$edid" == 1 ]; then log "Try parsing of custom edid.bin" edid_to_xml if [ "$?" = "1" ]; then update_dtb_xml update_dtb_by_dtb_xml fi else update_dtb_xml update_dtb_by_dtb_xml fi # remount as 'ro' if it was 'ro' before if [ "$rw" == "0" ]; then log "Try to remount '$BOOT_ROOT' in 'ro' mode" mount -o ro,remount "$BOOT_ROOT" if [ "$?" != "0" ]; then echo "Failed to remount '$BOOT_ROOT' in 'ro' mode" exit 12 fi fi exit $changed ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/sysutils/dtb-xml/system.d/dtb-xml.service ================================================ [Unit] Description=Copy user edid to dtb [Service] Type=oneshot RemainAfterExit=true ExecStop=-/usr/lib/coreelec/dtb-xml -e [Install] WantedBy=multi-user.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/sysutils/inject_bl301/config/bl301.conf ================================================ #################################################################### # CoreELEC inject_bl301 config # # # # coreelec-dt-id blob definition: # # # # [substring coreelec-dt-id] = [substring BL301 blob binary] # # # # [substring coreelec-dt-id] = [] -> "Not supported" # # # # Multiple sections are possible. Do not edit! # #################################################################### [BL301] odroid= radxa= khadas_vim1s=Khadas_VIM1S khadas_vim3=Khadas_VIM3 khadas_vim4=Khadas_VIM4 bananapi_m5=Bananapi_M5 bananapi_m2pro=Bananapi_M2Pro ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/sysutils/inject_bl301/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="inject_bl301" PKG_VERSION="fdd519917b8c257ea56cced7e962a2a89f60fb37" PKG_SOURCE_NAME="${PKG_NAME}-${ARCH}-${PKG_VERSION}.tar.xz" PKG_LICENSE="proprietary" PKG_SITE="https://coreelec.org" PKG_URL="https://sources.coreelec.org/${PKG_SOURCE_NAME}" PKG_DEPENDS_TARGET="toolchain bl30" PKG_LONGDESC="Tool to inject bootloader blob BL30.bin on internal eMMC" PKG_TOOLCHAIN="manual" case "${ARCH}" in arm) PKG_SHA256="5be388fd4728b5d44a9f68321aa840bba94b5e050d58a04b77320885f2851281" ;; aarch64) PKG_SHA256="04a38b47264cccf2dbdf8f9f1a9606740687d3e30d4d21a02b0845901dcde456" ;; esac makeinstall_target() { mkdir -p ${INSTALL}/usr/sbin mkdir -p ${INSTALL}/usr/lib/coreelec mkdir -p ${INSTALL}/etc/inject_bl301 install -m 0755 inject_bl301 ${INSTALL}/usr/sbin/inject_bl301 install -m 0755 ${PKG_DIR}/scripts/check-bl301.sh ${INSTALL}/usr/lib/coreelec/check-bl301 install -m 0755 ${PKG_DIR}/scripts/update-bl301.sh ${INSTALL}/usr/lib/coreelec/update-bl301 install -m 0644 ${PKG_DIR}/config/bl301.conf ${INSTALL}/etc/inject_bl301/bl301.conf } post_install() { enable_service update-bl301.service } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/sysutils/inject_bl301/scripts/check-bl301.sh ================================================ #!/bin/sh # # SPDX-License-Identifier: GPL-3.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) # # Detect BL301 injection # ##################################################### # # Comand Line Arguments # -v = Show verbose output # ##################################################### VERBOSE=0 INSTALLED=0 if [ "${1}" = "-v" ]; then VERBOSE=1 fi if [ -e /usr/sbin/inject_bl301 ]; then inject_bl301 -i if [ ${?} = 1 ]; then INSTALLED=1 fi fi if [ "${VERBOSE}" = 1 ]; then if [ "${INSTALLED}" = 1 ]; then echo "CoreELEC BL30 Installed" else echo "CoreELEC BL30 Not found" fi fi exit ${INSTALLED} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/sysutils/inject_bl301/scripts/update-bl301.sh ================================================ #!/bin/sh # # SPDX-License-Identifier: GPL-3.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) # # Update BL301 injection # ##################################################### # # Comand Line Arguments # -v = Show verbose output # ##################################################### VERBOSE=0 INSTALLED=0 UPDATE=1 RET=0 if [ "${1}" = "-v" ]; then VERBOSE=1 fi if [ -e /usr/lib/coreelec/check-bl301 ]; then /usr/lib/coreelec/check-bl301 INSTALLED=${?} if [ "${INSTALLED}" = 1 ]; then touch /run/bl301_injected fi fi if [ -e /usr/sbin/inject_bl301 ] && [ "${INSTALLED}" = 1 ]; then inject_bl301 -Y > /storage/update-bl301.log UPDATE=${?} fi if [ "${VERBOSE}" = 1 ]; then if [ "${INSTALLED}" = 1 ] && [ "${UPDATE}" = 0 ]; then echo "CoreELEC BL301 got updated" elif [ "${INSTALLED}" = 1 ] && [ "${UPDATE}" = 1 ]; then echo "CoreELEC BL301 installed but no update needed" elif [ "${INSTALLED}" = 1 ]; then echo "CoreELEC BL301 installed but error on update: " ${UPDATE} RET=${UPDATE} elif [ "${INSTALLED}" = 0 ]; then echo "CoreELEC BL301 not installed" fi fi if [ "${INSTALLED}" = 1 ] && [ "${UPDATE}" = 0 ]; then sync && reboot fi exit ${RET} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/sysutils/inject_bl301/system.d/update-bl301.service ================================================ [Unit] Description=CoreELEC BL301 Update Service [Service] Type=oneshot ExecStart=/usr/lib/coreelec/update-bl301 -v RemainAfterExit=no [Install] WantedBy=basic.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/sysutils/tmate/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="tmate" PKG_VERSION="ac919516f4f1b10ec928e20b3a5034d18f609d68" PKG_SHA256="a3acd7880e2cca0b2a3bd2d0071ae8ec2aeb0326ccf699b57f519d4a6d0258a2" PKG_LICENSE="BSD" PKG_SITE="https://github.com/tmate-io/tmate" PKG_URL="https://github.com/tmate-io/tmate/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libevent libssh msgpack-c" PKG_LONGDESC="Instant terminal sharing." PKG_TOOLCHAIN="autotools" pre_configure_target() { export LIBS+=" -lz -lcrypto" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp tmate ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/lib/libreelec cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/lib/libreelec } post_install() { enable_service tmate.service } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/sysutils/tmate/patches/path-adjustments.patch ================================================ set socket path for easier usage of display command --- a/tmux.c 2022-08-07 03:30:02.000000000 +0200 +++ b/tmux.c 2022-10-27 19:09:38.616947150 +0200 @@ -265,6 +265,9 @@ main(int argc, char **argv) #endif label = path = NULL; + + path = xstrdup("/var/run/tmate.sock"); + while ((opt = getopt(argc, argv, "h2c:CdFf:lL:qS:uUVvk:n:r:a:")) != -1) { switch (opt) { case '2': ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/sysutils/tmate/scripts/tmate-pre.sh ================================================ #!/bin/sh # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) [ -z "${TMATE_CONF}" ] && exit 1 for arg in $(cat /proc/cmdline); do case $arg in tmate) TMATE_INVITE=true ;; esac done MACHINE_ID=$(cat /storage/.cache/systemd-machine-id) [ -z "${MACHINE_ID}" ] && MACHINE_ID="$(openssl rand -hex 16)" [ -z "${TMATE_USERNAME}" ] && TMATE_USERNAME="${MACHINE_ID}" TMATE_PUBLIC_KEY_CE="/var/run/tmate_id_ed25519_ce.pub" TMATE_PUBLIC_KEY_USER="/storage/.config/tmate_id_ed25519_user" if [ ! -f ${TMATE_PUBLIC_KEY_USER}.pub ]; then ssh-keygen -t ed25519 -N "" -f ${TMATE_PUBLIC_KEY_USER} mv ${TMATE_PUBLIC_KEY_USER} ${TMATE_PUBLIC_KEY_USER}.priv fi if [ "${TMATE_INVITE}" = "true" ]; then curl --max-time 5 -o ${TMATE_PUBLIC_KEY_CE} \ https://coreelec.org/tmate_id_ed25519_ce.pub cat << EOF > "${TMATE_CONF}" set tmate-webhook-url "https://tmate-webhook.coreelec.org" set tmate-webhook-userdata "${TMATE_USERNAME}" set tmate-session-name "${MACHINE_ID}" set tmate-api-key "tmk-GBXefJkTxSAW60efR5u6Z0cxrM" set tmate-authorized-keys "${TMATE_PUBLIC_KEY_CE}" EOF elif [ "${TMATE_SSH_KEY}" = "User key" ]; then cat << EOF > "${TMATE_CONF}" set tmate-session-name "${MACHINE_ID}" set tmate-api-key "tmk-GBXefJkTxSAW60efR5u6Z0cxrM" set tmate-authorized-keys "${TMATE_PUBLIC_KEY_USER}.pub" EOF else echo "" > "${TMATE_CONF}" fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/sysutils/tmate/system.d/tmate.service ================================================ [Unit] Description=Tmate terminal sharing After=machine-id.service network-online.target ConditionKernelCommandLine=|tmate ConditionPathExists=|/storage/.cache/services/tmate.conf [Service] Type=simple Environment="TMATE_CONF=/var/run/tmate.conf" EnvironmentFile=-/storage/.cache/services/tmate.conf ExecStartPre=/usr/lib/libreelec/tmate-pre.sh ExecStart=/bin/sh -c ". /etc/profile; /usr/bin/tmate -f ${TMATE_CONF} -F" ExecStop=/bin/kill -TERM ${MAINPID} [Install] WantedBy=multi-user.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/CoreELEC-Debug-Scripts/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="CoreELEC-Debug-Scripts" PKG_VERSION="1c7ff1b8c477c6ba0411d16ab0c15e0b3c3b3ff0" PKG_SHA256="0ace545ae4db56f8631b6311c8af09f71f99782c3145a8ab9406bb955392098e" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/CoreELEC-Debug-Scripts" PKG_URL="https://github.com/CoreELEC/CoreELEC-Debug-Scripts/archive/${PKG_VERSION}.tar.gz" PKG_SOURCE_NAME="${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_LONGDESC="A set of scripts to help debug user issues with CoreELEC" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin install -m 0755 debug-scripts-helper.sh ${INSTALL}/usr/bin/debug-scripts-helper.sh install -m 0755 dispinfo.sh ${INSTALL}/usr/bin/dispinfo install -m 0755 remoteinfo.sh ${INSTALL}/usr/bin/remoteinfo install -m 0755 audinfo.sh ${INSTALL}/usr/bin/audinfo install -m 0755 ce-debug.sh ${INSTALL}/usr/bin/ce-debug } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/aml-dtbtools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) PKG_NAME="aml-dtbtools" PKG_VERSION="cce100f" PKG_SHA256="8bcaa83fcc9e85c9c04930e7411447d96a97da0809c5ecd9af91c8b554133c41" PKG_LICENSE="free" PKG_SITE="https://github.com/Wilhansen/aml-dtbtools" PKG_URL="https://github.com/Wilhansen/aml-dtbtools/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="gcc:host zlib:host dtc:host" PKG_DEPENDS_TARGET="toolchain zlib dtc" PKG_LONGDESC="AML DTB Tools" PKG_MAKE_OPTS_HOST="dtbTool" PKG_MAKE_OPTS_TARGET="dtbTool dtbSplit" pre_make_host() { rm -f ${PKG_MAKE_OPTS_HOST} } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp dtbTool ${TOOLCHAIN}/bin } pre_make_target() { rm -f ${PKG_MAKE_OPTS_TARGET} } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp dtbTool dtbSplit ${INSTALL}/usr/bin } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/aml-dtbtools/patches/0001-change-permisson-on-output-file.patch ================================================ From a2b989862cef8a0f64e3c4b2f5ed7f08b776eb17 Mon Sep 17 00:00:00 2001 From: Peter Vicman <peter.vicman@gmail.com> Date: Wed, 29 Jul 2020 09:57:32 +0200 Subject: [PATCH 1/2] change permisson on output file --- dtbTool.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dtbTool.c b/dtbTool.c index 385a03e..3335025 100644 --- a/dtbTool.c +++ b/dtbTool.c @@ -377,7 +377,7 @@ int main(int argc, char **argv) flen = strlen(dp->d_name); if ((flen > 4) && (strncmp(&dp->d_name[flen-4], ".dtb", 4) == 0)) { - log_info("Found file: %s ... ", dp->d_name); + log_info("Found file: %s\n ", dp->d_name); flen = strlen(input_dir) + strlen(dp->d_name) + 1; filename = (char *)malloc(flen); @@ -439,7 +439,7 @@ int main(int argc, char **argv) log_info("\nGenerating master DTB... "); - out_fd = open(output_file, O_WRONLY|O_CREAT | O_TRUNC, S_IRUSR|S_IWUSR); + out_fd = open(output_file, O_WRONLY|O_CREAT | O_TRUNC, 0664); if (!out_fd < 0) { log_err("Cannot create '%s'\n", output_file); rc = RC_ERROR; @@ -529,11 +529,11 @@ int main(int argc, char **argv) close(out_fd); if (expected != wrote) { - log_err("error writing output file, please rerun: size mismatch %d vs %d\n", + log_err("error writing output file, please rerun: size mismatch %lu vs %lu\n", expected, wrote); rc = RC_ERROR; } else - log_dbg("Total wrote %u bytes\n", wrote); + log_dbg("Total wrote %lu bytes\n", wrote); if (rc != RC_SUCCESS) unlink(output_file); -- 2.17.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/aml-dtbtools/patches/0002-add-gzip-compression-support.patch ================================================ From c642408b37b00dd9184445114a488796e0abf2e9 Mon Sep 17 00:00:00 2001 From: Peter Vicman <peter.vicman@gmail.com> Date: Wed, 29 Jul 2020 10:00:36 +0200 Subject: [PATCH 2/2] add gzip compression support --- Makefile | 6 +- dtbSplit.cpp | 83 +++++++++++++++++++-- dtbTool.c | 83 +++++++++++++++++++-- gzip.c | 199 +++++++++++++++++++++++++++++++++++++++++++++++++++ gzip.h | 52 ++++++++++++++ 5 files changed, 411 insertions(+), 12 deletions(-) create mode 100644 gzip.c create mode 100644 gzip.h diff --git a/Makefile b/Makefile index c28230b..7352475 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,9 @@ all: dtbTool dtbSplit dtbTool: dtbTool.c - $(CC) -o dtbTool dtbTool.c + $(CC) $(CFLAGS) $(LDFLAGS) -o dtbTool dtbTool.c gzip.c -lz dtbSplit: dtbSplit.cpp - $(CXX) -o dtbSplit -std=c++11 dtbSplit.cpp + $(CC) $(CFLAGS) -c gzip.c -Wno-pointer-arith + $(CXX) $(CXXFLAGS) -c dtbSplit.cpp -std=c++11 + $(CXX) $(CXXFLAGS) $(LDFLAGS) -o dtbSplit -std=c++11 dtbSplit.o gzip.o -lz diff --git a/dtbSplit.cpp b/dtbSplit.cpp index c92dea7..b234a34 100644 --- a/dtbSplit.cpp +++ b/dtbSplit.cpp @@ -34,10 +34,18 @@ #include <string> #include <cstdio> #include <vector> +#include <streambuf> + +#include <arpa/inet.h> +extern "C" { + #include "gzip.h" +} + using namespace std; #define AML_DT_HEADER 0x5f4c4d41 #define DT_HEADER_MAGIC 0xedfe0dd0 +#define IS_GZIP_FORMAT(data) ((data & (0x0000FFFF)) == (0x00008B1F)) #define AML_DT_ID_VARI_TOTAL 3 #pragma pack(push, 1) @@ -81,7 +89,7 @@ uint32_t swap_bytes_u32(uint32_t b) { (b << 24); } template<unsigned int ID_SIZE> -void dumpData(const uint32_t entries, const string &dest, ifstream &dtb) { +void dumpData(const uint32_t entries, const string &dest, stringstream &dtb) { typedef HeaderEntry<ID_SIZE> HeaderType; vector<HeaderType> headers; @@ -112,13 +120,13 @@ void dumpData(const uint32_t entries, const string &dest, ifstream &dtb) { } else { id.write(h.soc, sizeof(h.soc)); } - id << '-'; + id << '_'; if ( h.plat[ID_SIZE-1] == 0 ) { id << h.plat; } else { id.write(h.plat, sizeof(h.plat)); } - id << '-'; + id << '_'; if ( h.vari[ID_SIZE-1] == 0 ) { id << h.vari; } else { @@ -140,31 +148,90 @@ void dumpData(const uint32_t entries, const string &dest, ifstream &dtb) { dtb.seekg(h.offset); vector<char> data(dtheader.totalsize); dtb.read(data.data(), data.size()); - ofstream output(dest + id.str() + ".dtb", ios::binary); + ofstream output(dest + "_" + id.str() + ".dtb", ios::binary); output.write(data.data(), data.size()); } } int main(int argc, char **argv) { + unsigned char *bufIn; + unsigned char *bufOut; + long unsigned int lenup = GUNZIP_BUF_SIZE; + int ret; + stringstream dtb(std::stringstream::in | std::stringstream::out); + if ( argc < 3 ) { cerr << "Usage: " << argv[0] << " boot.img out_prefix\n"; return 1; } - ifstream dtb(argv[1], ios::binary); - if ( !dtb ) { + bufIn = (unsigned char *) calloc(1, GUNZIP_BUF_SIZE); + if (bufIn == NULL) { + cerr << "Cannot allocate memmory, compression skipped" << endl; + return 1; + } + + bufOut = (unsigned char *) calloc(1, GUNZIP_BUF_SIZE); + if (bufOut == NULL) { + cerr << "Cannot allocate memmory, compression skipped" << endl; + free(bufIn); + return 1; + } + + ifstream dtbFile(argv[1], ios::binary); + if ( !dtbFile ) { cerr << "Unable to open dtb file: " << argv[2] << endl; + free(bufIn); + free(bufOut); return 1; } + string dest; if ( argc > 2 ) { dest = argv[2]; } + Header header; + dtbFile.read((char*)&header, sizeof(header)); + + if ( IS_GZIP_FORMAT(header.magic) ) { + dtbFile.seekg(0, dtbFile.end); + size_t length = dtbFile.tellg(); + dtbFile.seekg(0, dtbFile.beg); + length -= dtbFile.tellg(); + + if (length > GUNZIP_BUF_SIZE) { + cerr << "Dtb file too big." << endl; + free(bufIn); + free(bufOut); + return 1; + } + + dtbFile.read((char *) bufIn, length); + ret = gunzip(bufOut, GUNZIP_BUF_SIZE, (unsigned char *)bufIn, &lenup); + if (ret != 0) { + cerr << "gzip error." << endl; + free(bufIn); + free(bufOut); + return 1; + } + + for (unsigned i=0; i<lenup; ++i) + dtb << bufOut[i]; + } else { + dtbFile.seekg(0); + + char ch; + while (dtbFile.get(ch)) + dtb << ch; + } + dtb.read((char*)&header, sizeof(header)); if ( header.magic != AML_DT_HEADER ) { cerr << "Invalid AML DTB header." << endl; + free(bufIn); + free(bufOut); return 1; } cout << "DTB Version: " << header.version << " entries: " << header.entry_count << endl; @@ -175,8 +242,12 @@ int main(int argc, char **argv) { dumpData<16>(header.entry_count, dest, dtb); } else { cerr << "Unrecognized DTB version" << endl; + free(bufIn); + free(bufOut); return 1; } + free(bufIn); + free(bufOut); return 0; } \ No newline at end of file diff --git a/dtbTool.c b/dtbTool.c index 3335025..dcfc76c 100644 --- a/dtbTool.c +++ b/dtbTool.c @@ -39,6 +39,8 @@ #include <getopt.h> #include <errno.h> #include <unistd.h> +#include <time.h> +#include "gzip.h" #define AML_DT_MAGIC "AML_" /* Master DTB magic */ #define AML_DT_VERSION 2 /* AML version */ @@ -76,9 +78,74 @@ struct chipInfo_t *chip_list; char *input_dir; char *output_file; char *dtc_path; +int compress_dtb; int verbose; int page_size = PAGE_SIZE_DEF; +void compress_file(char *output_file) +{ + FILE *pFile; + unsigned char *bufIn; + unsigned char *bufOut; + long unsigned int bufOutLenp = GUNZIP_BUF_SIZE; + int r; + unsigned long bufInLen; + time_t now = time(NULL); + + log_info("Compressing master DTB... "); + + bufIn = calloc(1, GUNZIP_BUF_SIZE); + if (bufIn == NULL) { + log_err("Cannot allocate memmory, compression skipped\n"); + return; + } + + bufOut = calloc(1, GUNZIP_BUF_SIZE); + if (bufOut == NULL) { + log_err("Cannot allocate memmory, compression skipped\n"); + free(bufIn); + return; + } + + pFile = fopen(output_file, "rb+"); + if (pFile == NULL) { + log_err("Cannot open '%s'\n", output_file); + free(bufIn); + free(bufOut); + return; + } + + bufInLen = fread(bufIn, 1, GUNZIP_BUF_SIZE, pFile); + if (bufInLen <= 0) { + log_err("Cannot read '%s'\n", output_file); + fclose(pFile); + free(bufIn); + free(bufOut); + return; + } + + r = gzip(bufOut, &bufOutLenp, bufIn, bufInLen); + if (r < 0) { + log_err("Failed to compress data to dtb: %d!\n", r); + fclose(pFile); + free(bufIn); + free(bufOut); + return; + } + + /* add time because Amlogic in u-boot expects it for multidtb */ + memcpy(&bufOut[4], &now, 4); + + rewind(pFile); + r = ftruncate(fileno(pFile), 0); + fwrite(bufOut, 1, bufOutLenp, pFile); + fclose(pFile); + + free(bufIn); + free(bufOut); + log_info("completed\n"); +} + int entry_cmp(uint8_t *a, uint8_t *b) { return memcmp(a, b, INFO_ENTRY_SIZE); @@ -108,6 +175,7 @@ void print_help() log_info(" --output-file/-o output file\n"); log_info(" --dtc-path/-p path to dtc\n"); log_info(" --page-size/-s page size in bytes\n"); + log_info(" --compress/-c compress dtb\n"); log_info(" --verbose/-v verbose\n"); log_info(" --help/-h this help screen\n"); } @@ -120,12 +188,13 @@ int parse_commandline(int argc, char *const argv[]) {"output-file", 1, 0, 'o'}, {"dtc-path", 1, 0, 'p'}, {"page-size", 1, 0, 's'}, + {"compress", 0, 0, 'c'}, {"verbose", 0, 0, 'v'}, {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; - while ((c = getopt_long(argc, argv, "-o:p:s:vh", long_options, NULL)) + while ((c = getopt_long(argc, argv, "-o:p:s:cvh", long_options, NULL)) != -1) { switch (c) { case 1: @@ -155,6 +224,9 @@ int parse_commandline(int argc, char *const argv[]) return RC_ERROR; } break; + case 'c': + compress_dtb = 1; + break; case 'v': verbose = 1; break; @@ -440,7 +512,7 @@ int main(int argc, char **argv) log_info("\nGenerating master DTB... "); out_fd = open(output_file, O_WRONLY|O_CREAT | O_TRUNC, 0664); - if (!out_fd < 0) { + if (out_fd < 0) { log_err("Cannot create '%s'\n", output_file); rc = RC_ERROR; goto cleanup; @@ -529,17 +601,20 @@ int main(int argc, char **argv) close(out_fd); if (expected != wrote) { - log_err("error writing output file, please rerun: size mismatch %lu vs %lu\n", + log_err("error writing output file, please rerun: size mismatch %zu vs %zu\n", expected, wrote); rc = RC_ERROR; } else - log_dbg("Total wrote %lu bytes\n", wrote); + log_dbg("Total wrote %zu bytes\n", wrote); if (rc != RC_SUCCESS) unlink(output_file); else log_info("completed\n"); + if (compress_dtb) + compress_file(output_file); + cleanup: free(filler); chip_deleteall(); diff --git a/gzip.c b/gzip.c new file mode 100644 index 0000000..457ab6c --- /dev/null +++ b/gzip.c @@ -0,0 +1,199 @@ +/* + * Simple tool for CoreELEC installation on eMMC + * + * Copyright (C) 2019 Team CoreELEC, vpeter, Portisch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "gzip.h" + +static void *zalloc(void *x, unsigned items, unsigned size) +{ + void *p; + + size *= items; + size = (size + ZALLOC_ALIGNMENT - 1) & ~(ZALLOC_ALIGNMENT - 1); + + p = malloc (size); + return (p); +} + +static void zfree(void *x, void *addr) +{ + free (addr); +} + +// Uncompress blocks compressed with zlib without headers +static int zunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp, + int stoponerr, int offset) +{ + z_stream s; + int r; + + s.zalloc = zalloc; + s.zfree = zfree; + + r = inflateInit2(&s, -MAX_WBITS); + if (r != Z_OK) { + printf ("Error: inflateInit2() returned %d\n", r); + return -1; + } + + s.next_in = src + offset; + s.avail_in = *lenp - offset; + s.next_out = (unsigned char *)dst; + s.avail_out = dstlen; + + do { + r = inflate(&s, Z_FINISH); + if (stoponerr == 1 && r != Z_STREAM_END && + (s.avail_out == 0 || r != Z_BUF_ERROR)) { + printf("Error: inflate() returned %d\n", r); + inflateEnd(&s); + return -1; + } + + s.avail_in = *lenp - offset - (int)(s.next_out - (unsigned char*)dst); + } while (r == Z_BUF_ERROR); + + *lenp = s.next_out - (unsigned char *) dst; + inflateEnd(&s); + return 0; +} + +// Compress blocks with zlib +static int zzip(void *dst, unsigned long *lenp, unsigned char *src, + unsigned long srclen, int stoponerr, + int (*func)(unsigned long, unsigned long)) +{ + z_stream s; + int r, flush, orig, window; + unsigned long comp_len, left_len; + + if (!srclen) + return 0; + +#ifndef CONFIG_GZIP + window = MAX_WBITS; +#else + window = 2 * MAX_WBITS; +#endif + orig = *lenp; + s.zalloc = zalloc; + s.zfree = zfree; + s.opaque = Z_NULL; + + r = deflateInit2_(&s, Z_DEFAULT_COMPRESSION, Z_DEFLATED, window, + DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + ZLIB_VERSION, sizeof(z_stream)); + if (r != Z_OK) { + printf ("Error: deflateInit2_() returned %d\n", r); + return -1; + } + + while (srclen > 0) { + comp_len = (srclen > CONFIG_GZIP_COMPRESS_DEF_SZ) ? + CONFIG_GZIP_COMPRESS_DEF_SZ : srclen; + + s.next_in = src; + s.avail_in = comp_len; + flush = (srclen > CONFIG_GZIP_COMPRESS_DEF_SZ)? + Z_NO_FLUSH : Z_FINISH; + + do { + left_len = (*lenp > CONFIG_GZIP_COMPRESS_DEF_SZ) ? + CONFIG_GZIP_COMPRESS_DEF_SZ : *lenp; + s.next_out = (unsigned char *)dst; + s.avail_out = left_len; + + r = deflate(&s, flush); + if (r == Z_STREAM_ERROR && stoponerr == 1) { + printf("Error: deflate() returned %d\n", r); + r = -1; + goto bail; + } + + if (!func) { + dst += (left_len - s.avail_out); + *lenp -= (left_len - s.avail_out); + } else if (left_len - s.avail_out > 0) { + r = func((unsigned long)dst, + left_len - s.avail_out); + if (r < 0) + goto bail; + } + } while (s.avail_out == 0 && (*lenp > 0)); + + if (s.avail_in) { + printf("Deflate failed to consume %u bytes", s.avail_in); + r = -1; + goto bail; + } + + if (*lenp == 0) { + printf("Deflate need more space to compress " + "left %lu bytes\n", srclen); + r = -1; + goto bail; + } + + srclen -= comp_len; + src += comp_len; + } + + r = 0; +bail: + deflateEnd(&s); + *lenp = orig - *lenp; + return r; +} + +int gzip(void *dst, unsigned long *lenp, + unsigned char *src, unsigned long srclen) +{ + return zzip(dst, lenp, src, srclen, 1, NULL); +} + +int gunzip(void *dst, int dstlen, + unsigned char *src, unsigned long *lenp) +{ + int i, flags; + + // skip header + i = 10; + flags = src[3]; + if (src[2] != Z_DEFLATED || (flags & RESERVED) != 0) { + puts ("Error: Bad gzipped data\n"); + return (-1); + } + + if ((flags & EXTRA_FIELD) != 0) + i = 12 + src[10] + (src[11] << 8); + + if ((flags & ORIG_NAME) != 0) + while (src[i++] != 0) + ; + + if ((flags & COMMENT) != 0) + while (src[i++] != 0) + ; + + if ((flags & HEAD_CRC) != 0) + i += 2; + + if (i >= *lenp) { + puts ("Error: gunzip out of data in header\n"); + return (-1); + } + + return zunzip(dst, dstlen, src, lenp, 1, i); +} diff --git a/gzip.h b/gzip.h new file mode 100644 index 0000000..47d3f53 --- /dev/null +++ b/gzip.h @@ -0,0 +1,52 @@ +/* + * Simple tool for CoreELEC installation on eMMC + * + * Copyright (C) 2019 Team CoreELEC, vpeter, Portisch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __ZLIB_H__ +#define __ZLIB_H__ + +#include <stdio.h> +#include <stdlib.h> +#include "zlib.h" + +// enable gzip mode of zlib +#define CONFIG_GZIP + +// Maximum value for memLevel in deflateInit2 +#define DEF_MEM_LEVEL 8 + +#ifndef CONFIG_GZIP_COMPRESS_DEF_SZ +#define CONFIG_GZIP_COMPRESS_DEF_SZ 0x200 +#endif + +#define ZALLOC_ALIGNMENT 16 + +// gzip flag byte +#define ASCII_FLAG 0x01 // bit 0 set: file probably ascii text +#define HEAD_CRC 0x02 // bit 1 set: header CRC present +#define EXTRA_FIELD 0x04 // bit 2 set: extra field present +#define ORIG_NAME 0x08 // bit 3 set: original file name present +#define COMMENT 0x10 // bit 4 set: file comment present +#define RESERVED 0xE0 // bits 5..7: reserved + +#define SZ_1M 0x00100000UL +#define GUNZIP_BUF_SIZE (SZ_1M * 5UL) + +extern int gzip(void *dst, unsigned long *lenp, + unsigned char *src, unsigned long srclen); +extern int gunzip(void *dst, int dstlen, + unsigned char *src, unsigned long *lenp); + +#endif -- 2.17.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/ceemmc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Team CoreELEC (https://coreelec.org) PKG_NAME="ceemmc" PKG_VERSION="bc480ecc38077c10f825b089564f42a7ed1f5c0c" PKG_SHA256="aca90a9faaeee54d781b4d131b87a01cfa656a9db94e7b458f44608bab4c4e01" PKG_LICENSE="proprietary" PKG_SITE="https://coreelec.org" PKG_SOURCE_NAME="ceemmc-aarch64-${PKG_VERSION}.tar.xz" PKG_URL="https://sources.coreelec.org/${PKG_SOURCE_NAME}" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Tool to install CoreELEC on internal eMMC" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/sbin install -m 0755 ceemmc ${INSTALL}/usr/sbin/ceemmc } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/entware/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="entware" PKG_VERSION="" PKG_LICENSE="GPL" PKG_SITE="https://github.com/Entware/Entware" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="tools" PKG_LONGDESC="entware: A software repository that offers various software programs that can be installed on your device" PKG_TOOLCHAIN="manual" post_install() { mkdir -p $INSTALL/usr/sbin cp -P $PKG_DIR/scripts/installentware $INSTALL/usr/sbin # Replace Entware Arch sed -e "s/@ENTWARE_ARCH@/$ENTWARE_ARCH/g" \ -i $INSTALL/usr/sbin/installentware enable_service entware.service } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/entware/profile.d/99-entware.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) case $- in *i*) if [ -f /opt/etc/profile ]; then # remove locale which interfere with CoreELEC if grep -Eq '^export LANG=|^export LC_ALL=' /opt/etc/profile; then sed -e "s|^export LANG=\(.*\)|#CE export LANG=\1|g" \ -e "s|^export LC_ALL=\(.*\)|#CE export LC_ALL=\1|g" \ -i /opt/etc/profile fi . /opt/etc/profile fi ;; *) ;; esac ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/entware/scripts/installentware ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) export PATH=/opt/bin:/opt/sbin:$PATH [ ! -d /storage/.opt ] && mkdir -p /storage/.opt if [ ! -f /opt/bin/opkg ]; then wget -O - http://bin.entware.net/@ENTWARE_ARCH@/installer/generic.sh | /bin/sh echo "" read -p "Would you like to reboot now to finish installation (recommended) [y/N]? " choice case "$choice" in [yY]*) reboot ;; esac else echo "Entware is already installed." fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/entware/system.d/entware.service ================================================ [Unit] Description=Entware service After=systemd-tmpfiles-setup.service network-online.target Before=kodi.service Requires=network-online.target ConditionPathExists=/opt/etc/init.d/rc.unslung [Service] Type=oneshot ExecStart=/opt/etc/init.d/rc.unslung start ExecStop=/opt/etc/init.d/rc.unslung stop RemainAfterExit=yes [Install] WantedBy=multi-user.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/rtk_hciattach/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="rtk_hciattach" PKG_VERSION="3d0ed39cfdd24343715057e93134cd63b7321827" PKG_SHA256="6c5908e4e07fe4a74c54f5b58f01bdbeffc2aa2f8b529c5f32ce897e087edf7a" PKG_LICENSE="GPL" PKG_SITE="https://github.com/Caesar-github/rkwifibt" PKG_URL="https://github.com/Caesar-github/rkwifibt/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Realtek BT FW loader" PKG_TOOLCHAIN="make" unpack() { mkdir -p $PKG_BUILD tar --strip-components=3 -xf $SOURCES/$PKG_NAME/$PKG_NAME-$PKG_VERSION.tar.gz -C $PKG_BUILD rkwifibt-$PKG_VERSION/realtek/rtk_hciattach } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/rtk_hciattach/patches/rtk_hciattach-01-Makefile.patch ================================================ --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -CFLAGS := -Wall -g +CFLAGS := -g #CC := $(CROSS_COMPLE)gcc all: rtk_hciattach OBJS := hciattach.o hciattach_rtk.o hciattach_h4.o rtb_fwc.o @@ -12,6 +12,10 @@ clean: rm -f $(OBJS) rtk_hciattach +install: + install -m 755 -d $(DESTDIR)/usr/bin + install -m 755 rtk_hciattach $(DESTDIR)/usr/bin + tags: FORCE ctags -R find ./ -name "*.h" -o -name "*.c" -o -name "*.cc" -o -name "*.cpp" > cscope.files ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/rtk_hciattach/patches/rtk_hciattach-02-change-location-of-btaddr-file.patch ================================================ From ca8ab97b2d72632858867110d76b1d06123485c9 Mon Sep 17 00:00:00 2001 From: Stanislav Vlasic <svlasic@gmail.com> Date: Mon, 15 Aug 2022 00:06:37 +0200 Subject: [PATCH] Change location of btaddr file --- realtek/rtk_hciattach/rtb_fwc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtb_fwc.c b/rtb_fwc.c index 5e9e370..cac9309 100644 --- a/rtb_fwc.c +++ b/rtb_fwc.c @@ -39,7 +39,7 @@ #define FIRMWARE_DIRECTORY "/lib/firmware/rtlbt/" #define BT_CONFIG_DIRECTORY "/lib/firmware/rtlbt/" #define EXTRA_CONFIG_FILE "/opt/rtk_btconfig.txt" -#define BT_ADDR_FILE "/opt/bdaddr" +#define BT_ADDR_FILE "/storage/.config/btaddr" #define BDADDR_STRING_LEN 17 struct list_head { -- 2.37.2 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/u-boot-Alta/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-Alta" PKG_VERSION="93399925229437d08403c8eab7d3351bc7ec849b" PKG_SHA256="ee4587e2e6c41954aa82ea3c99a2f9c4e96944afd3017d4742156dfec50c9d5b" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" pre_make_target() { sed -i "s|arm-none-eabi-|arm-eabi-|g" $PKG_BUILD/Makefile $PKG_BUILD/arch/arm/cpu/armv8/*/firmware/scp_task/Makefile 2>/dev/null || true } configure_package() { PKG_UBOOT_CONFIG="alta_defconfig" } make_target() { [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/:$TOOLCHAIN/lib/gcc-linaro-arm-eabi/bin/:$PATH DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make ${PKG_UBOOT_CONFIG} DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make HOSTCC="${HOST_CC}" HOSTSTRIP="true" } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/u-boot-Khadas_VIM1S/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-Khadas_VIM1S" PKG_VERSION="be24ec376835d55d8897161c69ad21dbab50ca30" PKG_SHA256="36e02b0c607dcfd11949b3c85fa9d629f1d184e7d2835cb3668e4cc0e793a894" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc7-linaro-aarch64-elf:host gcc-riscv-none-embed:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" make_target() { unset CFLAGS LDFLAGS [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=${TOOLCHAIN}/lib/gcc7-linaro-aarch64-elf/bin:${TOOLCHAIN}/lib/gcc-riscv-none-embed/bin:${PATH} DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm make kvim1s_defconfig DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm make HOSTCC="${HOST_CC}" HOSTSTRIP="true" CROSS_COMPILE=aarch64-elf- CROSS_COMPILE_PATH="" source fip/mk_script.sh kvim1s ${PKG_BUILD} } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/u-boot-Khadas_VIM4/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-Khadas_VIM4" PKG_VERSION="be24ec376835d55d8897161c69ad21dbab50ca30" PKG_SHA256="36e02b0c607dcfd11949b3c85fa9d629f1d184e7d2835cb3668e4cc0e793a894" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc7-linaro-aarch64-elf:host gcc-riscv-none-embed:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" make_target() { unset CFLAGS LDFLAGS [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=${TOOLCHAIN}/lib/gcc7-linaro-aarch64-elf/bin:${TOOLCHAIN}/lib/gcc-riscv-none-embed/bin:${PATH} DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm make kvim4_defconfig DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm make HOSTCC="${HOST_CC}" HOSTSTRIP="true" source fip/mk_script.sh kvim4 ${PKG_BUILD} } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/u-boot-Odroid_C4/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-Odroid_C4" PKG_VERSION="93399925229437d08403c8eab7d3351bc7ec849b" PKG_SHA256="ee4587e2e6c41954aa82ea3c99a2f9c4e96944afd3017d4742156dfec50c9d5b" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" pre_make_target() { sed -i "s|arm-none-eabi-|arm-eabi-|g" $PKG_BUILD/Makefile $PKG_BUILD/arch/arm/cpu/armv8/*/firmware/scp_task/Makefile 2>/dev/null || true } configure_package() { PKG_UBOOT_CONFIG="odroidc4_defconfig" } make_target() { [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/:$TOOLCHAIN/lib/gcc-linaro-arm-eabi/bin/:$PATH DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make $PKG_UBOOT_CONFIG DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make HOSTCC="$HOST_CC" HOSTSTRIP="true" } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/u-boot-Odroid_N2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-Odroid_N2" PKG_VERSION="93399925229437d08403c8eab7d3351bc7ec849b" PKG_SHA256="ee4587e2e6c41954aa82ea3c99a2f9c4e96944afd3017d4742156dfec50c9d5b" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" pre_make_target() { sed -i "s|arm-none-eabi-|arm-eabi-|g" $PKG_BUILD/Makefile $PKG_BUILD/arch/arm/cpu/armv8/*/firmware/scp_task/Makefile 2>/dev/null || true } configure_package() { PKG_UBOOT_CONFIG="odroidn2_defconfig" } make_target() { [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/:$TOOLCHAIN/lib/gcc-linaro-arm-eabi/bin/:$PATH DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make $PKG_UBOOT_CONFIG DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make HOSTCC="$HOST_CC" HOSTSTRIP="true" } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/u-boot-Radxa_Zero/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-Radxa_Zero" PKG_VERSION="93399925229437d08403c8eab7d3351bc7ec849b" PKG_SHA256="ee4587e2e6c41954aa82ea3c99a2f9c4e96944afd3017d4742156dfec50c9d5b" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" pre_make_target() { sed -i "s|arm-none-eabi-|arm-eabi-|g" $PKG_BUILD/Makefile $PKG_BUILD/arch/arm/cpu/armv8/*/firmware/scp_task/Makefile 2>/dev/null || true } configure_package() { PKG_UBOOT_CONFIG="radxa_zero_defconfig" } make_target() { [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/:$TOOLCHAIN/lib/gcc-linaro-arm-eabi/bin/:$PATH DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make $PKG_UBOOT_CONFIG DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make HOSTCC="$HOST_CC" HOSTSTRIP="true" } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/u-boot-Radxa_Zero2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-Radxa_Zero2" PKG_VERSION="93399925229437d08403c8eab7d3351bc7ec849b" PKG_SHA256="ee4587e2e6c41954aa82ea3c99a2f9c4e96944afd3017d4742156dfec50c9d5b" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" pre_make_target() { sed -i "s|arm-none-eabi-|arm-eabi-|g" $PKG_BUILD/Makefile $PKG_BUILD/arch/arm/cpu/armv8/*/firmware/scp_task/Makefile 2>/dev/null || true } configure_package() { PKG_UBOOT_CONFIG="radxa_zero2_defconfig" } make_target() { [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/:$TOOLCHAIN/lib/gcc-linaro-arm-eabi/bin/:$PATH DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make ${PKG_UBOOT_CONFIG} DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make HOSTCC="${HOST_CC}" HOSTSTRIP="true" } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/u-boot-Solitude/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-Solitude" PKG_VERSION="93399925229437d08403c8eab7d3351bc7ec849b" PKG_SHA256="ee4587e2e6c41954aa82ea3c99a2f9c4e96944afd3017d4742156dfec50c9d5b" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" pre_make_target() { sed -i "s|arm-none-eabi-|arm-eabi-|g" $PKG_BUILD/Makefile $PKG_BUILD/arch/arm/cpu/armv8/*/firmware/scp_task/Makefile 2>/dev/null || true } configure_package() { PKG_UBOOT_CONFIG="solitude_defconfig" } make_target() { [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/:$TOOLCHAIN/lib/gcc-linaro-arm-eabi/bin/:$PATH DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make ${PKG_UBOOT_CONFIG} DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make HOSTCC="${HOST_CC}" HOSTSTRIP="true" } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/u-boot-script/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="u-boot-script" PKG_VERSION="1.0" PKG_LICENSE="GPL" PKG_DEPENDS_TARGET="u-boot-tools" PKG_TOOLCHAIN="manual" PKG_LONGDESC="Compile scripts for u-boot environment." PKG_NEED_UNPACK="$PROJECT_DIR/$PROJECT/bootloader" [ -n "$DEVICE" ] && PKG_NEED_UNPACK+=" $PROJECT_DIR/$PROJECT/devices/$DEVICE/bootloader" make_target() { if find_dir_path bootloader/scripts ; then for src in $FOUND_PATH/*.src ; do mkimage -A $TARGET_KERNEL_ARCH -O linux -T script -C none -d "$src" "$(basename $src .src)" done fi } makeinstall_target() { mkdir -p $INSTALL/usr/share/bootloader cp -a $PKG_BUILD/* $INSTALL/usr/share/bootloader/ } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/u-boot-tools/config/fw_env.config ================================================ # Configuration file for fw_(printenv/setenv) utility. # Up to two entries are valid, in this case the redundant # environment sector is assumed present. # Notice, that the "Number of sectors" is not required on NOR and SPI-dataflash. # Futhermore, if the Flash sector size is ommitted, this value is assumed to # be the same as the Environment size, which is valid for NOR and SPI-dataflash # NOR example # MTD device name Device offset Env. size Flash sector size Number of sectors #/dev/mtd1 0x0000 0x4000 0x4000 #/dev/mtd2 0x0000 0x4000 0x4000 # MTD SPI-dataflash example # MTD device name Device offset Env. size Flash sector size Number of sectors #/dev/mtd5 0x4200 0x4200 #/dev/mtd6 0x4200 0x4200 # NAND example #/dev/mtd0 0x4000 0x4000 0x20000 2 # Block device example #/dev/mmcblk0 0xc0000 0x20000 # VFAT example #/boot/uboot.env 0x0000 0x4000 # Amlogic NAND /dev/nand_env 0x000000 0x10000 0x10000 # Amlogic eMMC /dev/env 0x000000 0x10000 0x10000 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/u-boot-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="u-boot-tools" PKG_VERSION="2016.03" PKG_SHA256="e49337262ecac44dbdeac140f2c6ebd1eba345e0162b0464172e7f05583ed7bb" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="ftp://ftp.denx.de/pub/u-boot/u-boot-$PKG_VERSION.tar.bz2" PKG_DEPENDS_HOST="gcc:host" PKG_DEPENDS_TARGET="toolchain u-boot-tools:host" PKG_LICENSE="GPL" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." make_host() { make mrproper make dummy_defconfig make tools-only } make_target() { CROSS_COMPILE="$TARGET_PREFIX" LDFLAGS="" ARCH=arm make dummy_defconfig CROSS_COMPILE="$TARGET_PREFIX" LDFLAGS="" ARCH=arm make env } makeinstall_host() { mkdir -p $TOOLCHAIN/bin cp tools/mkimage $TOOLCHAIN/bin } makeinstall_target() { mkdir -p $INSTALL/etc cp $PKG_DIR/config/fw_env.config $INSTALL/etc/fw_env.config mkdir -p $INSTALL/usr/sbin cp tools/env/fw_printenv $INSTALL/usr/sbin/fw_printenv cp tools/env/fw_printenv $INSTALL/usr/sbin/fw_setenv } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/u-boot-tools/patches/u-boot-tools-0001-dummy_defconfig.patch ================================================ --- a/configs/dummy_defconfig +++ b/configs/dummy_defconfig @@ -0,0 +1,2 @@ +CONFIG_ARM=y + ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/u-boot-tools/patches/u-boot-tools-0002-allow-multiple-entries.patch ================================================ --- u-boot-tools-2016.01/tools/env/fw_env.c.orig 2016-01-12 15:06:54.000000000 +0100 +++ u-boot-tools-2016.01/tools/env/fw_env.c 2016-03-22 09:47:07.014381827 +0100 @@ -1453,6 +1453,7 @@ int rc; char dump[128]; char *devname; + int fd_test; fp = fopen (fname, "r"); if (fp == NULL) @@ -1473,6 +1474,12 @@ if (rc < 3) continue; + fd_test = open (devname, O_RDWR); + if (fd_test < 0) + continue; + if (close (fd_test)) + continue; + DEVNAME(i) = devname; if (rc < 4) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/tools/u-boot-tools/patches/u-boot-tools-0003-nand_env-hack.patch ================================================ diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index 8b0317a..575f12a 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -888,12 +888,13 @@ static int flash_write_buf (int dev, int fd, void *buf, size_t count, } } - if (lseek (fd, blockstart, SEEK_SET) == -1) { - fprintf (stderr, - "Seek error on %s: %s\n", - DEVNAME (dev), strerror (errno)); - return -1; - } + if (blockstart != 0) + if (lseek (fd, blockstart, SEEK_SET) == -1) { + fprintf (stderr, + "Seek error on %s: %s\n", + DEVNAME (dev), strerror (errno)); + return -1; + } #ifdef DEBUG fprintf(stderr, "Write 0x%x bytes at 0x%llx\n", erasesize, @@ -1025,25 +1026,8 @@ static int flash_read (int fd) return -1; } - if (S_ISCHR(st.st_mode)) { - rc = ioctl(fd, MEMGETINFO, &mtdinfo); - if (rc < 0) { - fprintf(stderr, "Cannot get MTD information for %s\n", - DEVNAME(dev_current)); - return -1; - } - if (mtdinfo.type != MTD_NORFLASH && - mtdinfo.type != MTD_NANDFLASH && - mtdinfo.type != MTD_DATAFLASH && - mtdinfo.type != MTD_UBIVOLUME) { - fprintf (stderr, "Unsupported flash type %u on %s\n", - mtdinfo.type, DEVNAME(dev_current)); - return -1; - } - } else { - memset(&mtdinfo, 0, sizeof(mtdinfo)); - mtdinfo.type = MTD_ABSENT; - } + memset(&mtdinfo, 0, sizeof(mtdinfo)); + mtdinfo.type = MTD_ABSENT; DEVTYPE(dev_current) = mtdinfo.type; ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/u-boot/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot" PKG_VERSION="1.0" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" PKG_CANUPDATE="${PROJECT}*" PKG_NEED_UNPACK="${PROJECT_DIR}/${PROJECT}/bootloader" [ -n "${DEVICE}" ] && PKG_NEED_UNPACK+=" ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/bootloader" for PKG_SUBDEVICE in ${SUBDEVICES}; do PKG_DEPENDS_TARGET+=" u-boot-${PKG_SUBDEVICE}" PKG_NEED_UNPACK+=" $(get_pkg_directory u-boot-${PKG_SUBDEVICE})" PKG_NEED_UNPACK+=" $(get_build_dir u-boot-${PKG_SUBDEVICE})/build/u-boot.bin" done make_target() { : # nothing } makeinstall_target() { mkdir -p ${INSTALL}/usr/share/bootloader # Always install the update script find_file_path bootloader/update.sh && cp -av ${FOUND_PATH} ${INSTALL}/usr/share/bootloader sed -e "s/@KERNEL_NAME@/${KERNEL_NAME}/g" \ -e "s/@LEGACY_KERNEL_NAME@/${LEGACY_KERNEL_NAME}/g" \ -e "s/@LEGACY_DTB_NAME@/${LEGACY_DTB_NAME}/g" \ -i ${INSTALL}/usr/share/bootloader/update.sh # Always install the canupdate script if find_file_path bootloader/canupdate.sh; then cp -av ${FOUND_PATH} ${INSTALL}/usr/share/bootloader fi # Always install the subdevice config script if find_file_path bootloader/subdevice_config.sh; then cp -av ${FOUND_PATH} ${INSTALL}/usr/share/bootloader fi for PKG_SUBDEVICE in ${SUBDEVICES}; do . ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/bootloader/subdevice_config.sh ${PKG_SUBDEVICE} ${PKG_NAME} find_file_path bootloader/${DEVICE_BOOT_INI} && cp -av ${FOUND_PATH} ${INSTALL}/usr/share/bootloader if [ ${DEVICE_UBOOT_BIN} ]; then cp -av ${DEVICE_UBOOT_BIN} ${INSTALL}/usr/share/bootloader/${DEVICE_UBOOT} fi if [ ${DEVICE_CHAIN_UBOOT_BIN} ]; then cp -av ${DEVICE_CHAIN_UBOOT_BIN} ${INSTALL}/usr/share/bootloader/${DEVICE_CHAIN_UBOOT} fi # Copy boot logo if [ ! -f ${INSTALL}/usr/share/bootloader/${DEVICE_BOOT_LOGO} ]; then find_file_path splash/${DEVICE}/${DEVICE_BOOT_LOGO} && cp -av ${FOUND_PATH} ${INSTALL}/usr/share/bootloader fi if [ ! -f ${INSTALL}/usr/share/bootloader/${DEVICE_TIMEOUT_LOGO} ]; then find_file_path splash/${DEVICE}/${DEVICE_TIMEOUT_LOGO} && cp -av ${FOUND_PATH} ${INSTALL}/usr/share/bootloader fi done find_file_path bootloader/config.ini && cp -av ${FOUND_PATH} ${INSTALL}/usr/share/bootloader sed -e "s/@PROJECT@/${PKG_CANUPDATE}/g" \ -i ${INSTALL}/usr/share/bootloader/canupdate.sh } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/packages/virtual/remote/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="remote" PKG_VERSION="1" PKG_LICENSE="GPL" PKG_SITE="http://www.openelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain eventlircd libirman v4l-utils evrepeat" PKG_SECTION="virtual" PKG_LONGDESC="Meta package for installing various tools needed for remote support" if [ "$AMREMOTE_SUPPORT" = "yes" ]; then PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET amremote" fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/patches/RTL8852BS-aml/0001-Fix-build-for-Amlogic-kernel-version-5.15.119.patch ================================================ --- a/core/rtw_br_ext.c 2022-08-14 21:13:04.000000000 +0200 +++ b/core/rtw_br_ext.c 2024-04-12 19:34:27.382104473 +0200 @@ -14,10 +14,14 @@ *****************************************************************************/ #define _RTW_BR_EXT_C_ +#include <generated/uapi/linux/version.h> + #ifdef __KERNEL__ #include <linux/if_arp.h> #include <net/ip.h> - #include <net/ipx.h> +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) + #include <net/ipx.h> +#endif #include <linux/atalk.h> #include <linux/udp.h> #include <linux/if_pppox.h> @@ -886,6 +886,7 @@ int nat25_db_handle(_adapter *priv, stru } } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) /*---------------------------------------------------*/ /* Handle IPX and Apple Talk frame */ /*---------------------------------------------------*/ @@ -1106,6 +1107,7 @@ int nat25_db_handle(_adapter *priv, stru return -1; } +#endif /*---------------------------------------------------*/ /* Handle PPPoE frame */ --- a/os_dep/linux/ioctl_cfg80211.c 2022-08-14 21:13:04.000000000 +0200 +++ b/os_dep/linux/ioctl_cfg80211.c 2024-04-12 19:36:47.294313677 +0200 @@ -465,7 +465,17 @@ u8 rtw_cfg80211_ch_switch_notify(_adapte * called by others with block-tx. */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) +/* for aml +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)) */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) + cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0, 0, false, 0); +#else + cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0, 0, false); +#endif +#else cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0, false); +#endif #else cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0); #endif @@ -476,7 +486,17 @@ u8 rtw_cfg80211_ch_switch_notify(_adapte if (!rtw_cfg80211_allow_ch_switch_notify(adapter)) goto exit; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) +/* for aml +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)) */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) + cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, 0, 0); +#else + cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, 0); +#endif +#else cfg80211_ch_switch_notify(adapter->pnetdev, &chdef); +#endif #else int freq = rtw_ch2freq(ch); @@ -1164,7 +1173,12 @@ check_bss: #endif #if defined(CPTCFG_VERSION) || LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) + roam_info.links[0].bssid = cur_network->network.MacAddress; +#else roam_info.bssid = cur_network->network.MacAddress; +#endif + roam_info.req_ie = pmlmepriv->assoc_req + sizeof(struct rtw_ieee80211_hdr_3addr) + 2; roam_info.req_ie_len = pmlmepriv->assoc_req_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 2; roam_info.resp_ie = pmlmepriv->assoc_rsp + sizeof(struct rtw_ieee80211_hdr_3addr) + 6; @@ -1908,6 +1922,9 @@ exit: } static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) + , int link_id +#endif , u8 key_index #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) , bool pairwise @@ -2070,6 +2087,9 @@ addkey_end: } static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) + , int link_id +#endif , u8 keyid #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) , bool pairwise @@ -2258,6 +2278,9 @@ exit: } static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) + int link_id, +#endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) u8 key_index, bool pairwise, const u8 *mac_addr) #else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) */ @@ -2278,11 +2301,16 @@ static int cfg80211_rtw_del_key(struct w } static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, - struct net_device *ndev, u8 key_index + struct net_device *ndev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) + int link_id, +#endif + u8 key_index #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) || defined(COMPAT_KERNEL_RELEASE) , bool unicast, bool multicast #endif ) + { _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); struct security_priv *psecuritypriv = &padapter->securitypriv; @@ -2326,7 +2354,12 @@ static int cfg80211_rtw_set_default_key( #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30)) int cfg80211_rtw_set_default_mgmt_key(struct wiphy *wiphy, - struct net_device *ndev, u8 key_index) + struct net_device *ndev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) + int link_id, +#endif + u8 key_index) + { #define SET_DEF_KEY_PARAM_FMT " key_index=%d" #define SET_DEF_KEY_PARAM_ARG , key_index @@ -5380,7 +5413,12 @@ static int cfg80211_rtw_change_beacon(st return ret; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) +static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev, + unsigned int link_id) +#else static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev) +#endif { _adapter *adapter = (_adapter *)rtw_netdev_priv(ndev); @@ -6328,7 +6366,12 @@ static int cfg80211_rtw_set_monitor_chan #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) static int cfg80211_rtw_get_channel(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) + struct wireless_dev *wdev, unsigned int link_id, +#else struct wireless_dev *wdev, +#endif + struct cfg80211_chan_def *chandef) { _adapter *padapter = wiphy_to_adapter(wiphy); @@ -10482,7 +10525,11 @@ void rtw_wdev_unregister(struct wireless rtw_cfg80211_indicate_scan_done(adapter, _TRUE); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) || defined(COMPAT_KERNEL_RELEASE) + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) + if (wdev->links[0].client.current_bss) { + #else if (wdev->current_bss) { + #endif RTW_INFO(FUNC_ADPT_FMT" clear current_bss by cfg80211_disconnected\n", FUNC_ADPT_ARG(adapter)); rtw_cfg80211_indicate_disconnect(adapter, 0, 1); } --- a/os_dep/linux/recv_linux.c 2022-08-14 21:13:04.000000000 +0200 +++ b/os_dep/linux/recv_linux.c 2024-04-12 19:09:51.233708199 +0200 @@ -338,8 +338,15 @@ static int napi_recv(_adapter *padapter, #ifdef CONFIG_RTW_GRO if (pregistrypriv->en_gro) { + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) + rtw_napi_gro_receive(&padapter->napi, pskb); + rx_ok = _TRUE; +#else if (rtw_napi_gro_receive(&padapter->napi, pskb) != GRO_DROP) rx_ok = _TRUE; +#endif + goto next; } #endif /* CONFIG_RTW_GRO */ --- a/os_dep/osdep_service_linux.c 2022-08-14 21:13:04.000000000 +0200 +++ b/os_dep/osdep_service_linux.c 2024-04-12 19:40:50.780332187 +0200 @@ -442,6 +442,9 @@ static int readFile(struct file *fp, cha } #ifndef CONFIG_RTW_ANDROID +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) +MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); +#endif static int writeFile(struct file *fp, char *buf, int len) { int wlen = 0, sum = 0; ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/patches/kodi/kodi-04-pvr-catchup-lower-optimization.patch ================================================ From 33a6a06b40281cc8668202cd2ded027624af914b Mon Sep 17 00:00:00 2001 From: Peter <peter.vicman@gmail.com> Date: Sun, 21 Apr 2024 15:01:33 +0200 Subject: [PATCH] make pvr.iptvsimple/inputstream.ffmpegdirect catchup working checked the difference with Ghidra but don't understand why optimization level 3 fails with this method on aarch64 --- xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp b/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp index 6a4c121..07fdc88 100644 --- a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp +++ b/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp @@ -588,6 +588,9 @@ void CInputStreamAddon::SetSpeed(int speed) m_ifc.inputstream->toAddon->demux_set_speed(m_ifc.inputstream, speed); } +#pragma GCC push_options +#pragma GCC optimize ("O1") + bool CInputStreamAddon::SeekTime(double time, bool backward, double* startpts) { if (!m_ifc.inputstream->toAddon->demux_seek_time) @@ -608,6 +611,8 @@ bool CInputStreamAddon::SeekTime(double time, bool backward, double* startpts) return m_ifc.inputstream->toAddon->demux_seek_time(m_ifc.inputstream, time, backward, startpts); } +#pragma GCC pop_options + void CInputStreamAddon::AbortDemux() { if (m_ifc.inputstream->toAddon->demux_abort) -- 2.41.0.dirty ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/patches/kodi/kodi-05-libdvd-upnp-remove-warnings.patch ================================================ remove distracted warnings warning: 'gcc_struct' attribute directive ignored this is due to 'gcc_struct' being undefined for arm remove messages when files are installed -- Installing: /some/destination/path -- Up-to-date: /some/destination/path diff --git a/cmake/modules/FindLibDvdCSS.cmake b/cmake/modules/FindLibDvdCSS.cmake index deed2de5ac..9b4c418b81 100644 --- a/cmake/modules/FindLibDvdCSS.cmake +++ b/cmake/modules/FindLibDvdCSS.cmake @@ -51,6 +51,8 @@ if(NOT TARGET LibDvdCSS::LibDvdCSS) endif() endif() + string(APPEND LIBDVDCSS_CFLAGS " -Wno-array-parameter") + if(CORE_SYSTEM_NAME MATCHES windows) set(CMAKE_ARGS -DDUMMY_DEFINE=ON ${LIBDVD_ADDITIONAL_ARGS}) @@ -72,7 +74,7 @@ if(NOT TARGET LibDvdCSS::LibDvdCSS) --prefix=${DEPENDS_PATH} --libdir=${DEPENDS_PATH}/lib "CC=${CMAKE_C_COMPILER}" - "CFLAGS=${CMAKE_C_FLAGS}" + "CFLAGS=${CMAKE_C_FLAGS} ${LIBDVDCSS_CFLAGS}" "LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${LIBDVDCSS_FLAGS}") set(BUILD_COMMAND ${MAKE_EXECUTABLE}) set(INSTALL_COMMAND ${MAKE_EXECUTABLE} install) diff --git a/cmake/modules/FindLibDvdNav.cmake b/cmake/modules/FindLibDvdNav.cmake index 503f559e10..bf070db8d3 100644 --- a/cmake/modules/FindLibDvdNav.cmake +++ b/cmake/modules/FindLibDvdNav.cmake @@ -47,6 +47,7 @@ if(NOT TARGET LibDvdNav::LibDvdNav) endif() string(APPEND LIBDVDNAV_CFLAGS "-D_XBMC") + string(APPEND LIBDVDNAV_CFLAGS " -Wno-double-promotion -Wno-return-type") if(APPLE) set(LIBDVDNAV_LDFLAGS "-framework CoreFoundation") diff --git a/cmake/modules/FindLibDvdRead.cmake b/cmake/modules/FindLibDvdRead.cmake index 4dead2d137..1a3ceb70cc 100644 --- a/cmake/modules/FindLibDvdRead.cmake +++ b/cmake/modules/FindLibDvdRead.cmake @@ -74,6 +74,13 @@ if(NOT TARGET LibDvdRead::LibDvdRead) endif() find_program(MAKE_EXECUTABLE make REQUIRED) + if(ARCH STREQUAL arm OR ARCH STREQUAL aarch64) + string(APPEND LIBDVDREAD_CFLAGS " -Wno-double-promotion -Wno-builtin-macro-redefined") + string(APPEND LIBDVDREAD_CFLAGS " -Wno-address-of-packed-member") + set (PATCH_COMMAND sed -i "s|((packed,gcc_struct))|((packed))|" src/dvdread/ifo_types.h && + sed -i "s|-Wsign-compare|-Wno-sign-compare|" configure.ac) + endif() + set(CONFIGURE_COMMAND ${AUTORECONF} -vif COMMAND ac_cv_path_GIT= ./configure --target=${HOST_ARCH} diff --git a/cmake/scripts/linux/Install.cmake b/cmake/scripts/linux/Install.cmake index a1974b2261..aa67ff0dd1 100644 --- a/cmake/scripts/linux/Install.cmake +++ b/cmake/scripts/linux/Install.cmake @@ -4,6 +4,9 @@ else() set(USE_X11 0) endif() +# print neither "Installing" nor "Up-to-date" messages +set(CMAKE_INSTALL_MESSAGE NEVER) + # CMake config set(APP_BINARY ${APP_NAME_LC}${APP_BINARY_SUFFIX}) set(APP_PREFIX ${prefix}) diff --git a/lib/libUPnP/CMakeLists.txt b/lib/libUPnP/CMakeLists.txt index 313893e41d..a33d9a7d4d 100644 --- a/lib/libUPnP/CMakeLists.txt +++ b/lib/libUPnP/CMakeLists.txt @@ -134,3 +134,7 @@ target_link_libraries(lib${APP_NAME_LC} PUBLIC upnp) if(CORE_SYSTEM_NAME STREQUAL windowsstore) set_target_properties(upnp PROPERTIES STATIC_LIBRARY_FLAGS "/ignore:4264") endif() + +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-nonnull-compare -Wno-unused-label -Wno-double-promotion") +# need only for CE21 +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-copy") ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/patches/kodi/kodi-temp-03-TEMP-fix-OnSettingChanged-signal.patch ================================================ From 1090b59aa68165e67a39895d7d648c7ff286ed8d Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Wed, 17 Feb 2021 07:59:09 +0100 Subject: [PATCH] TEMP: fix OnSettingChanged signal --- xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp b/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp index 73816df648..fbd1f54680 100644 --- a/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp +++ b/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp @@ -104,6 +104,8 @@ void CGUIDialogPeripheralSettings::OnSettingChanged(const std::shared_ptr<const if (!peripheral) return; + peripheral->OnSettingChanged(setting->GetId()); + if (settingId == SETTING_APPEARANCE) { // Get the controller profile of the new appearance -- 2.30.0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/patches/linux/amlogic-0003-HACK-arm64-fix-Kodi-sysinfo-CPU-information.patch ================================================ From 0b3ddc882dfbb2b05b2bee78525d692824efb765 Mon Sep 17 00:00:00 2001 From: chewitt <github@chrishewitt.net> Date: Sat, 13 Apr 2019 05:45:18 +0000 Subject: [PATCH 03/88] HACK: arm64: fix Kodi sysinfo CPU information This allows the CPU information to show in the Kodi sysinfo screen, e.g. "ARMv8 Processor rev 4 (v81)" on Amlogic devices Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm64/kernel/cpuinfo.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c index 77605aec25fe..d69b4e486098 100644 --- a/arch/arm64/kernel/cpuinfo.c +++ b/arch/arm64/kernel/cpuinfo.c @@ -148,8 +148,7 @@ static int c_show(struct seq_file *m, void *v) * "processor". Give glibc what it expects. */ seq_printf(m, "processor\t: %d\n", i); - if (compat) - seq_printf(m, "model name\t: ARMv8 Processor rev %d (%s)\n", + seq_printf(m, "model name\t: ARMv8 Processor rev %d (%s)\n", MIDR_REVISION(midr), COMPAT_ELF_PLATFORM); seq_printf(m, "BogoMIPS\t: %lu.%02lu\n", -- 2.17.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-no/patches/linux/linux-04-xpadneo.patch ================================================ From 25d349d6af1eb1637cb82e9627c32f6225b0e912 Mon Sep 17 00:00:00 2001 From: cdu13a <cdu13a@gmail.com> Date: Sat, 23 Nov 2019 14:10:47 -0500 Subject: hid: add xpadneo driver 0.6.0 --- drivers/hid/Kconfig | 7 + drivers/hid/Makefile | 1 + drivers/hid/hid-xpadneo.c | 1415 +++++++++++++++++++++++++++++++++++++ 3 files changed, 1423 insertions(+) create mode 100644 drivers/hid/hid-xpadneo.c diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 8eed456a67be..4d385d46fb4c 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig @@ -909,6 +909,13 @@ config HID_XINMO standard. Currently only supports the Xin-Mo Dual Arcade. Say Y here if you have a Xin-Mo Dual Arcade controller. +config HID_XPADNEO + tristate "XBOX ONE S and X controller over Bluetooth, including FF" + depends on HID + select INPUT_FF_MEMLESS + help + Support for Xbox One S and X controllers over BT, including force-feedback. + config HID_ZEROPLUS tristate "Zeroplus based game controller support" depends on HID diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile index 86b2b5785fd2..dfdcb2e64cde 100644 --- a/drivers/hid/Makefile +++ b/drivers/hid/Makefile @@ -98,6 +98,7 @@ obj-$(CONFIG_HID_TWINHAN) += hid-twinhan.o obj-$(CONFIG_HID_UCLOGIC) += hid-uclogic.o obj-$(CONFIG_HID_LED) += hid-led.o obj-$(CONFIG_HID_XINMO) += hid-xinmo.o +obj-$(CONFIG_HID_XPADNEO) += hid-xpadneo.o obj-$(CONFIG_HID_ZEROPLUS) += hid-zpff.o obj-$(CONFIG_HID_ZYDACRON) += hid-zydacron.o diff --git a/drivers/hid/hid-xpadneo.c b/drivers/hid/hid-xpadneo.c new file mode 100644 index 000000000000..b4847ab6ee1a --- /dev/null +++ b/drivers/hid/hid-xpadneo.c @@ -0,0 +1,1414 @@ +#define DRV_VER "0.6.0" + +/* + * Force feedback support for XBOX ONE S and X gamepads via Bluetooth + * + * This driver was developed for a student project at fortiss GmbH in Munich. + * Copyright (c) 2017 Florian Dollinger <dollinger.florian@gmx.de> + */ + +#include <linux/hid.h> +#include <linux/power_supply.h> +#include <linux/input.h> /* ff_memless(), ... */ +#include <linux/module.h> /* MODULE_*, module_*, ... */ +#include <linux/slab.h> /* kzalloc(), kfree(), ... */ +#include <linux/delay.h> /* mdelay(), ... */ +#include "hid-ids.h" /* VENDOR_ID... */ + + +#define DEBUG + + +/* Module Information */ +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Florian Dollinger <dollinger.florian@gmx.de>"); +MODULE_DESCRIPTION("Linux kernel driver for Xbox ONE S+ gamepads (BT), incl. FF"); +MODULE_VERSION(DRV_VER); + + +/* Module Parameters, located at /sys/module/hid_xpadneo/parameters */ + +/* NOTE: + * In general it is not guaranteed that a short variable is no more than + * 16 bit long in C, it depends on the computer architecure. But as a kernel + * module parameter it is, since <params.c> does use kstrtou16 for shorts + * since version 3.14 + */ + +#ifdef DEBUG +static u8 param_debug_level; +module_param_named(debug_level, param_debug_level, byte, 0644); +MODULE_PARM_DESC(debug_level, "(u8) Debug information level: 0 (none) to 3+ (most verbose)."); +#endif + +static u8 param_disable_ff; +module_param_named(disable_ff, param_disable_ff, byte, 0644); +MODULE_PARM_DESC(disable_ff, "(u8) Disable FF: 0 (all enabled), 1 (disable main), 2 (disable triggers), 3 (disable all)."); + +#define PARAM_DISABLE_FF_NONE 0 +#define PARAM_DISABLE_FF_MAIN 1 +#define PARAM_DISABLE_FF_TRIGGER 2 +#define PARAM_DISABLE_FF_ALL 3 + +static bool param_combined_z_axis; +module_param_named(combined_z_axis, param_combined_z_axis, bool, 0644); +MODULE_PARM_DESC(combined_z_axis, "(bool) Combine the triggers to form a single axis. 1: combine, 0: do not combine"); + +static u8 param_trigger_rumble_damping = 4; +module_param_named(trigger_rumble_damping, param_trigger_rumble_damping, byte, 0644); +MODULE_PARM_DESC(trigger_rumble_damping, "(u8) Damp the trigger: 1 (none) to 2^8+ (max)"); + +static u16 param_fake_dev_version = 0x1130; +module_param_named(fake_dev_version, param_fake_dev_version, ushort, 0644); +MODULE_PARM_DESC(fake_dev_version, "(u16) Fake device version # to hide from SDL's mappings. 0x0001-0xFFFF: fake version, others: keep original"); + + +/* + * Debug Printk + * + * Prints a debug message to kernel (dmesg) + * only if both is true, this is a DEBUG version and the + * param_debug_level-parameter is equal or higher than the level + * specified in hid_dbg_lvl + */ + +#define DBG_LVL_NONE 0 +#define DBG_LVL_FEW 1 +#define DBG_LVL_SOME 2 +#define DBG_LVL_ALL 3 + + +#ifdef DEBUG +#define hid_dbg_lvl(lvl, fmt_hdev, fmt_str, ...) \ + do { \ + if (param_debug_level >= lvl) \ + hid_dbg(pr_fmt(fmt_hdev), \ + pr_fmt(fmt_str), ##__VA_ARGS__); \ + } while (0) +#define dbg_hex_dump_lvl(lvl, fmt_prefix, data, size) \ + do { \ + if (param_debug_level >= lvl) \ + print_hex_dump(KERN_DEBUG, pr_fmt(fmt_prefix), \ + DUMP_PREFIX_NONE, 32, 1, data, size, false); \ + } while (0) +#else +#define hid_dbg_lvl(lvl, fmt_hdev, fmt_str, ...) \ + no_printk(KERN_DEBUG pr_fmt(fmt_str), ##__VA_ARGS__) +#define dbg_hex_dump_lvl(lvl, fmt_prefix, data, size) \ + no_printk(KERN_DEBUG pr_fmt(fmt_prefix)) +#endif + + +static DEFINE_IDA(xpadneo_device_id_allocator); + +/* + * FF Output Report + * + * This is the structure for the rumble output report. For more information + * about this structure please take a look in the hid-report description. + * Please notice that the structs are __packed, therefore there is no "padding" + * between the elements (they behave more like an array). + * + */ + +enum { + FF_ENABLE_NONE = 0x00, + FF_ENABLE_RIGHT = 0x01, + FF_ENABLE_LEFT = 0x02, + FF_ENABLE_RIGHT_TRIGGER = 0x04, + FF_ENABLE_LEFT_TRIGGER = 0x08, + FF_ENABLE_ALL = 0x0F +}; + +struct ff_data { + u8 enable_actuators; + u8 magnitude_left_trigger; + u8 magnitude_right_trigger; + u8 magnitude_left; + u8 magnitude_right; + u8 duration; + u8 start_delay; + u8 loop_count; +} __packed; + +struct ff_report { + u8 report_id; + struct ff_data ff; +} __packed; + +/* static variables are zeroed => empty initialization struct */ +static const struct ff_data ff_clear; + + +/* + * Device Data + * + * We attach information to hdev, which is therefore nearly globally accessible + * via hid_get_drvdata(hdev). It is attached to the hid_device via + * hid_set_drvdata(hdev) at the probing function. + */ + +enum report_type { + UNKNOWN, + LINUX, + WINDOWS +}; + +// TODO: avoid data duplication + +const char *report_type_text[] = { + "unknown", + "linux/android", + "windows" +}; + + +struct xpadneo_devdata { + /* mutual exclusion */ + spinlock_t lock; + + /* unique physical device id (randomly assigned) */ + int id; + + /* logical device interfaces */ + struct hid_device *hdev; + struct input_dev *idev; + struct power_supply *batt; + + /* report types */ + enum report_type report_descriptor; + enum report_type report_behaviour; + + /* battery information */ + struct power_supply_desc batt_desc; + u8 ps_online; + u8 ps_present; + u8 ps_capacity_level; + u8 ps_status; + + /* axis states */ + s32 last_abs_z; + s32 last_abs_rz; +}; + + +void create_ff_pck (struct ff_report *pck, u8 id, u8 en_act, + u8 mag_lt, u8 mag_rt, u8 mag_l, u8 mag_r, + u8 start_delay) { + + pck->report_id = id; + + pck->ff.enable_actuators = en_act; + pck->ff.magnitude_left_trigger = mag_lt; + pck->ff.magnitude_right_trigger = mag_rt; + pck->ff.magnitude_left = mag_l; + pck->ff.magnitude_right = mag_r; + pck->ff.duration = 0xFF; + pck->ff.start_delay = start_delay; + pck->ff.loop_count = 0xFF; + + /* It is up to the Input-Subsystem to start and stop effects as needed. + * All WE need to do is to play the effect at least 32767 ms long. + * Take a look here: + * https://stackoverflow.com/questions/48034091/ + * We therefore simply play the effect as long as possible, which is + * 2, 55s * 255 = 650, 25s ~ = 10min + */ +} + +/* + * Force Feedback Callback + * + * This function is called by the Input Subsystem. + * The effect data is set in userspace and sent to the driver via ioctl. + */ + +static int xpadneo_ff_play(struct input_dev *dev, void *data, + struct ff_effect *effect) +{ + /* Q: where is drvdata set to hid_device? + * A: hid_hw_start (called in probe) + * -> hid_connect -> hidinput_connect + * -> hidinput_allocate (sets drvdata to hid_device) + */ + + struct ff_report ff_pck; + u16 weak, strong, direction, max, max_damped; + u8 mag_main_right, mag_main_left, mag_trigger_right, mag_trigger_left; + u8 ff_active; + + const int fractions_milli[] + = {1000, 962, 854, 691, 500, 309, 146, 38, 0}; + const int proportions_idx_max = 8; + u8 index_left, index_right; + int fraction_TL, fraction_TR; + u8 trigger_rumble_damping_nonzero; + + enum { + DIRECTION_DOWN = 0x0000, + DIRECTION_LEFT = 0x4000, + DIRECTION_UP = 0x8000, + DIRECTION_RIGHT = 0xC000, + }; + + + struct hid_device *hdev = input_get_drvdata(dev); + + if (param_disable_ff == PARAM_DISABLE_FF_ALL) + return 0; + + if (effect->type != FF_RUMBLE) + return 0; + + /* copy data from effect structure at the very beginning */ + weak = effect->u.rumble.weak_magnitude; + strong = effect->u.rumble.strong_magnitude; + direction = effect->direction; + + hid_dbg_lvl(DBG_LVL_FEW, hdev, "playing effect: strong: %#04x, weak: %#04x, direction: %#04x\n", + strong, weak, direction); + + /* calculate the physical magnitudes */ + mag_main_right = (u8)((weak & 0xFF00) >> 8); /* u16 to u8 */ + mag_main_left = (u8)((strong & 0xFF00) >> 8); /* u16 to u8 */ + + + /* get the proportions from a precalculated cosine table + * calculation goes like: + * cosine(a) * 1000 = {1000, 924, 707, 383, 0, -383, -707, -924, -1000} + * fractions_milli(a) = (1000 + (cosine * 1000)) / 2 + */ + + fraction_TL = 0; + fraction_TR = 0; + + if (direction >= DIRECTION_LEFT && direction <= DIRECTION_RIGHT) { + index_left = (direction - DIRECTION_LEFT) >> 12; + index_right = proportions_idx_max - index_left; + + fraction_TL = fractions_milli[index_left]; + fraction_TR = fractions_milli[index_right]; + } + + /* we want to keep the rumbling at the triggers below the maximum + * of the weak and strong main rumble + */ + max = mag_main_right > mag_main_left ? mag_main_right : mag_main_left; + + /* the user can change the damping at runtime, hence check the range */ + trigger_rumble_damping_nonzero + = param_trigger_rumble_damping == 0 ? 1 : param_trigger_rumble_damping; + + max_damped = max / trigger_rumble_damping_nonzero; + + mag_trigger_left = (u8)((max_damped * fraction_TL) / 1000); + mag_trigger_right = (u8)((max_damped * fraction_TR) / 1000); + + + ff_active = FF_ENABLE_ALL; + + if (param_disable_ff & PARAM_DISABLE_FF_TRIGGER) + ff_active &= ~(FF_ENABLE_LEFT_TRIGGER | FF_ENABLE_RIGHT_TRIGGER); + + if (param_disable_ff & PARAM_DISABLE_FF_MAIN) + ff_active &= ~(FF_ENABLE_LEFT | FF_ENABLE_RIGHT); + + + create_ff_pck( + &ff_pck, 0x03, + ff_active, + mag_trigger_left, mag_trigger_right, + mag_main_left, mag_main_right, + 0); + + + hid_dbg_lvl(DBG_LVL_FEW, hdev, + "active: %#04x, max: %#04x, prop_left: %#04x, prop_right: %#04x, left trigger: %#04x, right: %#04x\n", + ff_active, + max, fraction_TL, fraction_TR, + ff_pck.ff.magnitude_left_trigger, + ff_pck.ff.magnitude_right_trigger); + + hid_hw_output_report(hdev, (u8 *)&ff_pck, sizeof(ff_pck)); + + return 0; +} + + +/* + * Device (Gamepad) Initialization + */ + +static int xpadneo_initDevice(struct hid_device *hdev) +{ + int error; + + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + struct input_dev *idev = xdata->idev; + + + struct ff_report ff_pck; + + /* TODO: outsource that */ + + ff_pck.ff = ff_clear; + + /* 'HELLO' FROM THE OTHER SIDE */ + if (!param_disable_ff) { + ff_pck.report_id = 0x03; + ff_pck.ff.magnitude_right = 0x80; + ff_pck.ff.magnitude_left = 0x40; + ff_pck.ff.magnitude_right_trigger = 0x20; + ff_pck.ff.magnitude_left_trigger = 0x20; + ff_pck.ff.duration = 33; + + ff_pck.ff.enable_actuators = FF_ENABLE_RIGHT; + hid_hw_output_report(hdev, (u8 *)&ff_pck, sizeof(ff_pck)); + mdelay(330); + + ff_pck.ff.enable_actuators = FF_ENABLE_LEFT; + hid_hw_output_report(hdev, (u8 *)&ff_pck, sizeof(ff_pck)); + mdelay(330); + + ff_pck.ff.enable_actuators + = FF_ENABLE_RIGHT_TRIGGER | FF_ENABLE_LEFT_TRIGGER; + hid_hw_output_report(hdev, (u8 *)&ff_pck, sizeof(ff_pck)); + mdelay(330); + } + + + /* Init Input System for Force Feedback (FF) */ + input_set_capability(idev, EV_FF, FF_RUMBLE); + error = input_ff_create_memless(idev, NULL, xpadneo_ff_play); + if (error) + return error; + + + /* + * Set default values, otherwise tools which depend on the joystick + * subsystem, report arbitrary values until the first real event + * TODO: Is this really necessary? + */ + input_report_abs(idev, ABS_X, 0); + input_report_abs(idev, ABS_Y, 0); + input_report_abs(idev, ABS_Z, 0); + input_report_abs(idev, ABS_RX, 0); + input_report_abs(idev, ABS_RY, 0); + input_report_abs(idev, ABS_RZ, 0); + input_report_key(idev, BTN_A, 0); + input_report_key(idev, BTN_B, 0); + input_report_key(idev, BTN_X, 0); + input_report_key(idev, BTN_Y, 0); + input_report_key(idev, BTN_TR, 0); + input_report_key(idev, BTN_TL, 0); + input_report_key(idev, BTN_THUMBL, 0); + input_report_key(idev, BTN_THUMBR, 0); + input_report_key(idev, BTN_START, 0); + input_report_key(idev, BTN_MODE, 0); + input_report_key(idev, ABS_HAT0X, 0); + input_report_key(idev, ABS_HAT0Y, 0); + input_sync(idev); + + /* TODO: - do not hardcode codes and values but + * keep them in the mapping structures + * - maybe initDevice isn't the right place + */ + + return 0; +} + + +/* Callback function which return the available properties to userspace */ +static int battery_get_property(struct power_supply *ps, + enum power_supply_property property, union power_supply_propval *val) +{ + struct xpadneo_devdata *xdata = power_supply_get_drvdata(ps); + unsigned long flags; + u8 capacity_level, present, online, status; + + spin_lock_irqsave(&xdata->lock, flags); + capacity_level = xdata->ps_capacity_level; + present = xdata->ps_present; + online = xdata->ps_online; + status = xdata->ps_status; + spin_unlock_irqrestore(&xdata->lock, flags); + + switch (property) { + case POWER_SUPPLY_PROP_MANUFACTURER: + val->strval = "Microsoft"; + break; + case POWER_SUPPLY_PROP_MODEL_NAME: + val->strval = "Xbox Wireless Controller"; + break; + case POWER_SUPPLY_PROP_PRESENT: + val->intval = present; + break; + case POWER_SUPPLY_PROP_ONLINE: + val->intval = online; + break; + case POWER_SUPPLY_PROP_SCOPE: + val->intval = POWER_SUPPLY_SCOPE_DEVICE; + break; + case POWER_SUPPLY_PROP_CAPACITY_LEVEL: + val->intval = capacity_level; + break; + case POWER_SUPPLY_PROP_STATUS: + val->intval = status; + break; + default: + return -EINVAL; + } + + return 0; +} + + +static int xpadneo_initBatt(struct hid_device *hdev) +{ + int ret = 0; + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + + static enum power_supply_property battery_props[] = { + /* is a power supply available? always true */ + POWER_SUPPLY_PROP_PRESENT, + /* critical, low, normal, high, full */ + POWER_SUPPLY_PROP_CAPACITY_LEVEL, + /* powers a specific device */ + POWER_SUPPLY_PROP_SCOPE, + /* charging (full, plugged), not_charging */ + POWER_SUPPLY_PROP_STATUS, + /* cstring - manufacturer name */ + POWER_SUPPLY_PROP_MANUFACTURER, + /* cstring - model name */ + POWER_SUPPLY_PROP_MODEL_NAME, + POWER_SUPPLY_PROP_ONLINE + }; + + + struct power_supply_config ps_config = { + /* pass the xpadneo_data to the get_property function */ + .drv_data = xdata + }; + + + /* Set up power supply */ + + /* Set the battery capacity to 'full' until we get our first real + * battery event. Prevents false "critical low battery" notifications + */ + xdata->ps_capacity_level = POWER_SUPPLY_CAPACITY_LEVEL_FULL; + + /* NOTE: hdev->uniq is meant to be the MAC address and hence + * it should be unique. Unfortunately, here it is not unique + * neither is it the bluetooth MAC address. + * As a solution we add an unique id for every gamepad. + */ + + xdata->batt_desc.name = kasprintf(GFP_KERNEL, "xpadneo_batt_%pMR_%i", + hdev->uniq, xdata->id); + if (!xdata->batt_desc.name) + return -ENOMEM; + + xdata->batt_desc.type = POWER_SUPPLY_TYPE_BATTERY; + + /* Which properties of the battery are accessible? */ + xdata->batt_desc.properties = battery_props; + xdata->batt_desc.num_properties = ARRAY_SIZE(battery_props); + + /* + * We have to offer a function which returns the current + * property values we defined above. Make sure that + * the get_property functions covers all properties above. + */ + xdata->batt_desc.get_property = battery_get_property; + + + /* Advanced power management emulation */ + xdata->batt_desc.use_for_apm = 0; + + /* Register power supply for our gamepad device */ + xdata->batt = devm_power_supply_register(&hdev->dev, + &xdata->batt_desc, &ps_config); + if (IS_ERR(xdata->batt)) { + ret = PTR_ERR(xdata->batt); + hid_err(hdev, "Unable to register battery device\n"); + goto err_free; + } else { + hid_dbg_lvl(DBG_LVL_SOME, hdev, "battery registered\n"); + } + + power_supply_powers(xdata->batt, &hdev->dev); + +err_free: + kfree(xdata->batt_desc.name); + xdata->batt_desc.name = NULL; + + return ret; +} + + +enum mapping_behaviour { + MAP_IGNORE, /* Completely ignore this field */ + MAP_AUTO, /* Do not really map it, let hid-core decide */ + MAP_STATIC /* Map to the values given */ +}; + +struct input_ev { + /* Map to which input event (EV_KEY, EV_ABS, ...)? */ + u8 event_type; + /* Map to which input code (BTN_A, ABS_X, ...)? */ + u16 input_code; +}; + +u8 map_hid_to_input_windows(struct hid_usage *usage, struct input_ev *map_to) +{ + + /* + * Windows report-descriptor (307 byte): + * + * 05 01 09 05 a1 01 85 01 09 01 a1 00 09 30 09 31 15 00 27 ff + * ff 00 00 95 02 75 10 81 02 c0 09 01 a1 00 09 33 09 34 15 00 + * 27 ff ff 00 00 95 02 75 10 81 02 c0 05 01 09 32 15 00 26 ff + * 03 95 01 75 0a 81 02 15 00 25 00 75 06 95 01 81 03 05 01 09 + * 35 15 00 26 ff 03 95 01 75 0a 81 02 15 00 25 00 75 06 95 01 + * 81 03 05 01 09 39 15 01 25 08 35 00 46 3b 01 66 14 00 75 04 + * 95 01 81 42 75 04 95 01 15 00 25 00 35 00 45 00 65 00 81 03 + * 05 09 19 01 29 0a 15 00 25 01 75 01 95 0a 81 02 15 00 25 00 + * 75 06 95 01 81 03 05 01 09 80 85 02 a1 00 09 85 15 00 25 01 + * 95 01 75 01 81 02 15 00 25 00 75 07 95 01 81 03 c0 05 0f 09 + * 21 85 03 a1 02 09 97 15 00 25 01 75 04 95 01 91 02 15 00 25 + * 00 75 04 95 01 91 03 09 70 15 00 25 64 75 08 95 04 91 02 09 + * 50 66 01 10 55 0e 15 00 26 ff 00 75 08 95 01 91 02 09 a7 15 + * 00 26 ff 00 75 08 95 01 91 02 65 00 55 00 09 7c 15 00 26 ff + * 00 75 08 95 01 91 02 c0 85 04 05 06 09 20 15 00 26 ff 00 75 + * 08 95 01 81 02 c0 00 + */ + + unsigned int hid_usage = usage->hid & HID_USAGE; + unsigned int hid_usage_page = usage->hid & HID_USAGE_PAGE; + + switch (hid_usage_page) { + case HID_UP_BUTTON: + switch (hid_usage) { + case 0x01: + *map_to = (struct input_ev){EV_KEY, BTN_A}; + return MAP_STATIC; + case 0x02: + *map_to = (struct input_ev){EV_KEY, BTN_B}; + return MAP_STATIC; + case 0x03: + *map_to = (struct input_ev){EV_KEY, BTN_X}; + return MAP_STATIC; + case 0x04: + *map_to = (struct input_ev){EV_KEY, BTN_Y}; + return MAP_STATIC; + case 0x05: + *map_to = (struct input_ev){EV_KEY, BTN_TL}; + return MAP_STATIC; + case 0x06: + *map_to = (struct input_ev){EV_KEY, BTN_TR}; + return MAP_STATIC; + case 0x07: + *map_to = (struct input_ev){EV_KEY, BTN_SELECT}; + return MAP_STATIC; + case 0x08: + *map_to = (struct input_ev){EV_KEY, BTN_START}; + return MAP_STATIC; + case 0x09: + *map_to = (struct input_ev){EV_KEY, BTN_THUMBL}; + return MAP_STATIC; + case 0x0A: + *map_to = (struct input_ev){EV_KEY, BTN_THUMBR}; + return MAP_STATIC; + } + case HID_UP_GENDESK: + switch (hid_usage) { + case 0x30: + *map_to = (struct input_ev){EV_ABS, ABS_X}; + return MAP_STATIC; + case 0x31: + *map_to = (struct input_ev){EV_ABS, ABS_Y}; + return MAP_STATIC; + case 0x32: + *map_to = (struct input_ev){EV_ABS, ABS_Z}; + return MAP_STATIC; + case 0x33: + *map_to = (struct input_ev){EV_ABS, ABS_RX}; + return MAP_STATIC; + case 0x34: + *map_to = (struct input_ev){EV_ABS, ABS_RY}; + return MAP_STATIC; + case 0x35: + *map_to = (struct input_ev){EV_ABS, ABS_RZ}; + return MAP_STATIC; + case 0x39: + *map_to = (struct input_ev){0, 0}; + return MAP_AUTO; + case 0x85: + *map_to = (struct input_ev){EV_KEY, BTN_MODE}; + return MAP_STATIC; + } + } + + return MAP_IGNORE; +} + +u8 map_hid_to_input_linux(struct hid_usage *usage, struct input_ev *map_to) +{ + + /* + * Linux report-descriptor (335 byte): + * + * 05 01 09 05 a1 01 85 01 09 01 a1 00 09 30 09 31 15 00 27 ff + * ff 00 00 95 02 75 10 81 02 c0 09 01 a1 00 09 32 09 35 15 00 + * 27 ff ff 00 00 95 02 75 10 81 02 c0 05 02 09 c5 15 00 26 ff + * 03 95 01 75 0a 81 02 15 00 25 00 75 06 95 01 81 03 05 02 09 + * c4 15 00 26 ff 03 95 01 75 0a 81 02 15 00 25 00 75 06 95 01 + * 81 03 05 01 09 39 15 01 25 08 35 00 46 3b 01 66 14 00 75 04 + * 95 01 81 42 75 04 95 01 15 00 25 00 35 00 45 00 65 00 81 03 + * 05 09 19 01 29 0f 15 00 25 01 75 01 95 0f 81 02 15 00 25 00 + * 75 01 95 01 81 03 05 0c 0a 24 02 15 00 25 01 95 01 75 01 81 + * 02 15 00 25 00 75 07 95 01 81 03 05 0c 09 01 85 02 a1 01 05 + * 0c 0a 23 02 15 00 25 01 95 01 75 01 81 02 15 00 25 00 75 07 + * 95 01 81 03 c0 05 0f 09 21 85 03 a1 02 09 97 15 00 25 01 75 + * 04 95 01 91 02 15 00 25 00 75 04 95 01 91 03 09 70 15 00 25 + * 64 75 08 95 04 91 02 09 50 66 01 10 55 0e 15 00 26 ff 00 75 + * 08 95 01 91 02 09 a7 15 00 26 ff 00 75 08 95 01 91 02 65 00 + * 55 00 09 7c 15 00 26 ff 00 75 08 95 01 91 02 c0 85 04 05 06 + * 09 20 15 00 26 ff 00 75 08 95 01 81 02 c0 00 + */ + + unsigned int hid_usage = usage->hid & HID_USAGE; + unsigned int hid_usage_page = usage->hid & HID_USAGE_PAGE; + + switch (hid_usage_page) { + case HID_UP_BUTTON: + switch (hid_usage) { + case 0x01: + *map_to = (struct input_ev){EV_KEY, BTN_A}; + return MAP_STATIC; + case 0x02: + *map_to = (struct input_ev){EV_KEY, BTN_B}; + return MAP_STATIC; + case 0x04: + *map_to = (struct input_ev){EV_KEY, BTN_X}; + return MAP_STATIC; + case 0x05: + *map_to = (struct input_ev){EV_KEY, BTN_Y}; + return MAP_STATIC; + case 0x07: + *map_to = (struct input_ev){EV_KEY, BTN_TL}; + return MAP_STATIC; + case 0x08: + *map_to = (struct input_ev){EV_KEY, BTN_TR}; + return MAP_STATIC; + case 0x0C: + *map_to = (struct input_ev){EV_KEY, BTN_START}; + return MAP_STATIC; + case 0x0E: + *map_to = (struct input_ev){EV_KEY, BTN_THUMBL}; + return MAP_STATIC; + case 0x0F: + *map_to = (struct input_ev){EV_KEY, BTN_THUMBR}; + return MAP_STATIC; + } + case HID_UP_CONSUMER: + switch (hid_usage) { + case 0x223: + *map_to = (struct input_ev){EV_KEY, BTN_MODE}; + return MAP_STATIC; + case 0x224: + *map_to = (struct input_ev){EV_KEY, BTN_SELECT}; + return MAP_STATIC; + } + case HID_UP_GENDESK: + switch (hid_usage) { + case 0x30: + *map_to = (struct input_ev){EV_ABS, ABS_X}; + return MAP_STATIC; + case 0x31: + *map_to = (struct input_ev){EV_ABS, ABS_Y}; + return MAP_STATIC; + case 0x32: + *map_to = (struct input_ev){EV_ABS, ABS_RX}; + return MAP_STATIC; + case 0x35: + *map_to = (struct input_ev){EV_ABS, ABS_RY}; + return MAP_STATIC; + case 0x39: + *map_to = (struct input_ev){0, 0}; + return MAP_AUTO; + } + case HID_UP_SIMULATION: + switch (hid_usage) { + case 0xC4: + *map_to = (struct input_ev){EV_ABS, ABS_RZ}; + return MAP_STATIC; + case 0xC5: + *map_to = (struct input_ev){EV_ABS, ABS_Z}; + return MAP_STATIC; + } + } + + return MAP_IGNORE; +} + + +/* + * Input Mapping Hook + * + * Invoked at input registering before mapping an usage + * (called once for every hid-usage). + */ + +static int xpadneo_mapping(struct hid_device *hdev, struct hid_input *hi, + struct hid_field *field, struct hid_usage *usage, + unsigned long **bit, int *max) +{ + /* Return values */ + enum { + RET_MAP_IGNORE = -1, /* completely ignore this input */ + RET_MAP_AUTO, /* let hid-core autodetect the mapping */ + RET_MAP_STATIC /* mapped by hand, no further processing */ + }; + + struct input_ev map_to; + u8 (*perform_mapping)(struct hid_usage *usage, struct input_ev *map_to); + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + + + switch (xdata->report_descriptor) { + case LINUX: + perform_mapping = map_hid_to_input_linux; + break; + case WINDOWS: + perform_mapping = map_hid_to_input_windows; + break; + default: + return RET_MAP_AUTO; + } + + + switch (perform_mapping(usage, &map_to)) { + case MAP_AUTO: + hid_dbg_lvl(DBG_LVL_FEW, hdev, + "UP: 0x%04X, USG: 0x%04X -> automatically\n", + usage->hid & HID_USAGE_PAGE, usage->hid & HID_USAGE); + + return RET_MAP_AUTO; + + case MAP_IGNORE: + hid_dbg_lvl(DBG_LVL_FEW, hdev, + "UP: 0x%04X, USG: 0x%04X -> ignored\n", + usage->hid & HID_USAGE_PAGE, usage->hid & HID_USAGE); + + return RET_MAP_IGNORE; + + case MAP_STATIC: + hid_dbg_lvl(DBG_LVL_FEW, hdev, + "UP: 0x%04X, USG: 0x%04X -> EV: 0x%03X, INP: 0x%03X\n", + usage->hid & HID_USAGE_PAGE, usage->hid & HID_USAGE, + map_to.event_type, map_to.input_code); + + hid_map_usage_clear(hi, usage, bit, max, + map_to.event_type, map_to.input_code); + return RET_MAP_STATIC; + + } + + /* Something went wrong, ignore this field */ + return RET_MAP_IGNORE; +} + + +/* + * Report Descriptor Fixup Hook + * + * You can either modify the original report in place and just + * return the original start address (rdesc) or you reserve a new + * one and return a pointer to it. In the latter, you mostly have to + * modify the rsize value too. + */ + +static u8 *xpadneo_report_fixup(struct hid_device *hdev, u8 *rdesc, + unsigned int *rsize) +{ + hid_dbg_lvl(DBG_LVL_SOME, hdev, "REPORT (DESCRIPTOR) FIXUP HOOK\n"); + dbg_hex_dump_lvl(DBG_LVL_FEW, "xpadneo: report-descr: ", rdesc, *rsize); + + return rdesc; +} + + +static void parse_raw_event_battery(struct hid_device *hdev, u8 *data, + int reportsize) +{ + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + unsigned long flags; + u8 capacity_level, present, online, status; + + + /* msb ID 04 lsb + * +---+---+---+---+---+---+---+---+ + * | O | R | E | C | M | M | L | L | + * +---+---+---+---+---+---+---+---+ + * + * O: Online + * R: Reserved / Unused + * E: Error (?) / Unknown + * C: Charging, I mean really charging the battery (P 'n C) + * not (only) the power cord powering the controller + * M M: Mode + * 00: Powered by USB + * 01: Powered by (disposable) batteries + * 10: Powered by Play 'n Charge battery pack (only, no cable) + * L L: Capacity Level + * 00: (Super) Critical + * 01: Low + * 10: Medium + * 11: Full + */ + + + /* I think "online" means whether the dev is online or shutting down */ + online = (data[1] & 0x80) >> 7; + + /* The _battery_ is only present if not powered by USB */ + present = ((data[1] & 0x0C) != 0x00); + + /* Capacity level, only valid as long as the battery is present */ + switch (data[1] & 0x03) { + case 0x00: + capacity_level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL; + break; + case 0x01: + capacity_level = POWER_SUPPLY_CAPACITY_LEVEL_LOW; + break; + case 0x02: + capacity_level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL; + break; + case 0x03: + capacity_level = POWER_SUPPLY_CAPACITY_LEVEL_HIGH; + break; + } + + /* Is the (Play 'n Charge) battery charging right now? */ + switch ((data[1] & 0x10) >> 4) { + case 0: + status = POWER_SUPPLY_STATUS_DISCHARGING; + break; + case 1: + status = POWER_SUPPLY_STATUS_CHARGING; + break; + } + + spin_lock_irqsave(&xdata->lock, flags); + xdata->ps_status = status; + xdata->ps_capacity_level = capacity_level; + xdata->ps_online = online; + xdata->ps_present = present; + spin_unlock_irqrestore(&xdata->lock, flags); + + power_supply_changed(xdata->batt); +} + +static void check_report_behaviour(struct hid_device *hdev, u8 *data, + int reportsize) +{ + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + + /* + * The length of the first input report with an ID of 0x01 + * reveals which report-type the controller is actually + * sending (windows: 16, or linux: 17). + */ + if (xdata->report_behaviour == UNKNOWN) { + switch (reportsize) { + case 16: + xdata->report_behaviour = WINDOWS; + break; + case 17: + xdata->report_behaviour = LINUX; + break; + default: + xdata->report_behaviour = UNKNOWN; + break; + } + } + + hid_dbg_lvl(DBG_LVL_SOME, hdev, "desc: %s, beh: %s\n", + report_type_text[xdata->report_descriptor], + report_type_text[xdata->report_behaviour]); + + /* TODO: + * Maybe the best solution would be to replace the report descriptor + * in case that the wrong reports are sent. Unfortunately we do not + * know if the report descriptor is the right one until the first + * report is sent to us. At this time, the report_fixup hook is + * already over and the original descriptor is parsed into hdev + * i.e. report_enum and collection. + * + * The next best solution would be to replace the report with + * ID 0x01 with the right one in report_enum (and collection?). + * I don't know yet how this would works, perhaps like this: + * - create a new report struct + * - fill it by hand + * - add all neccessary fields (automatic way?) + * + * Another way to fix it is: + * - Register another report with a _new_ ID by hand + * (unfortunately we cannot use the same id again) + * - in raw_event: change the ID from 0x01 to the new one if + * necessary. leave it if not. + * + * What we currently do is: + * We examine every report and fire the input events by hand. + * That's not very generic. + * + */ + + + // TODO: + // * remove old report using list operations + // * create new one like they do in hid_register_report + // * add it to output_reports->report_list and array + +} + +/* + * HID Raw Event Hook + */ + +int xpadneo_raw_event(struct hid_device *hdev, struct hid_report *report, + u8 *data, int reportsize) +{ + /* Return Codes */ + enum { + RAWEV_CONT_PROCESSING, /* Let the hid-core autodetect the event */ + RAWEV_STOP_PROCESSING /* Stop further processing */ + }; + + //hid_dbg_lvl(DBG_LVL_SOME, hdev, "RAW EVENT HOOK\n"); + + dbg_hex_dump_lvl(DBG_LVL_SOME, "xpadneo: raw_event: ", data, reportsize); + //hid_dbg_lvl(DBG_LVL_ALL, hdev, "report->size: %d\n", (report->size)/8); + //hid_dbg_lvl(DBG_LVL_ALL, hdev, "data size (wo id): %d\n", reportsize-1); + + + switch (report->id) { + case 01: + check_report_behaviour(hdev, data, reportsize); + break; + case 04: + parse_raw_event_battery(hdev, data, reportsize); + return RAWEV_STOP_PROCESSING; + } + + /* Continue processing */ + return RAWEV_CONT_PROCESSING; +} + + +void xpadneo_report(struct hid_device *hdev, struct hid_report *report) +{ + hid_dbg_lvl(DBG_LVL_SOME, hdev, "REPORT HOOK\n"); +} + + +/* + * Input Configured Hook + * + * We have to fix up the key-bitmap, because there is + * no DPAD_UP, _RIGHT, _DOWN, _LEFT on the device by default + * + */ + +static int xpadneo_input_configured(struct hid_device *hdev, + struct hid_input *hi) +{ + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + + /* set a pointer to the logical input device at the device structure */ + xdata->idev = hi->input; + + hid_dbg_lvl(DBG_LVL_SOME, hdev, "INPUT CONFIGURED HOOK\n"); + + if (param_fake_dev_version) { + xdata->idev->id.version = (u16) param_fake_dev_version; + hid_dbg_lvl(DBG_LVL_FEW, hdev, "Fake device version: 0x%04X\n", + param_fake_dev_version); + } + + + // The HID device descriptor defines a range from 0 to 65535 for all + // absolute axis (like ABS_X), this is in contrary to what the linux + // gamepad specification defines [–32.768; 32.767]. + // Therefore, we have to set the min, max, fuzz and flat values by hand: + + input_set_abs_params(xdata->idev, ABS_X, -32768, 32767, 255, 4095); + input_set_abs_params(xdata->idev, ABS_Y, -32768, 32767, 255, 4095); + + input_set_abs_params(xdata->idev, ABS_RX, -32768, 32767, 255, 4095); + input_set_abs_params(xdata->idev, ABS_RY, -32768, 32767, 255, 4095); + + if (param_combined_z_axis) + input_set_abs_params(xdata->idev, ABS_Z, -1024, 1023, 3, 63); + + // furthermore, we need to translate the incoming events to fit within + // the new range, we will do that in the xpadneo_event() hook. + + // We remove the ABS_RZ event if param_combined_z_axis is enabled + if (param_combined_z_axis) { + __clear_bit(ABS_RZ, xdata->idev->absbit); + } + + return 0; +} + + +/* + * Event Hook + * + * This hook is called whenever an event occurs that is listed on + * xpadneo_driver.usage_table (which is NULL in our case, therefore it is + * invoked on every event). + * + * Before we can send additional input events, we have to enable + * the corresponding keys in xpadneo_input_configured. + */ + +int xpadneo_event(struct hid_device *hdev, struct hid_field *field, + struct hid_usage *usage, __s32 value) +{ + /* Return Codes */ + enum { + EV_CONT_PROCESSING, /* Let the hid-core autodetect the event */ + EV_STOP_PROCESSING /* Stop further processing */ + }; + + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + struct input_dev *idev = xdata->idev; + + u16 usg_type = usage->type; + u16 usg_code = usage->code; + + + hid_dbg_lvl(DBG_LVL_ALL, hdev, + "hid-up: %02x, hid-usg: %02x, input-code: %02x, value: %02x\n", + (usage->hid & HID_USAGE_PAGE), (usage->hid & HID_USAGE), + usage->code, value); + + + // we have to shift the range of the analogues sticks (ABS_X/Y/RX/RY) + // as already explained in xpadneo_input_configured() above + // furthermore we need to combine ABS_Z and ABS_RZ if param_combined_z_axis + // is set + + if (usg_type == EV_ABS) { + if (usg_code == ABS_X || usg_code == ABS_Y + || usg_code == ABS_RX || usg_code == ABS_RY) { + hid_dbg_lvl(DBG_LVL_ALL, hdev, "shifted axis %02x, old value: %i, new value: %i\n", usg_code, value, value - 32768); + input_report_abs(idev, usg_code, value - 32768); + goto sync_and_stop_processing; + } + + if (param_combined_z_axis) { + if (usg_code == ABS_Z || usg_code == ABS_RZ) { + if (usg_code == ABS_Z) + xdata->last_abs_z = value; + if (usg_code == ABS_RZ) + xdata->last_abs_rz = value; + + input_report_abs(idev, ABS_Z, 0 - xdata->last_abs_z + xdata->last_abs_rz); + goto sync_and_stop_processing; + } + } + } + + + + + /* TODO: + * This is a workaround for the wrong report (Windows report but + * Linux descriptor). We would prefer to fixup the descriptor, but we + * cannot fix it anymore at the time we recognize the wrong behaviour, + * hence we will fire the input events by hand. + */ + + if (xdata->report_behaviour == WINDOWS + && xdata->report_descriptor == LINUX) { + + /* + * we fix all buttons by hand. You may think that we + * could do that by using the windows_map too, but it is more + * like an coincidence that this would work in this case: + * It would only, because HID_UP_BUTTONS has no special names + * for the HID_USAGE's, therefore the first button stays 0x01 + * on both reports (windows and linux) - it is a 1: 1 mapping. + * But this is not true in general (i.e. for other USAGE_PAGES) + */ + + if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) { + switch (usage->hid & HID_USAGE) { + case 0x01: + input_report_key(idev, BTN_A, value); + break; + case 0x02: + input_report_key(idev, BTN_B, value); + break; + case 0x03: + input_report_key(idev, BTN_X, value); + break; + case 0x04: + input_report_key(idev, BTN_Y, value); + break; + case 0x05: + input_report_key(idev, BTN_TL, value); + break; + case 0x06: + input_report_key(idev, BTN_TR, value); + break; + case 0x07: + input_report_key(idev, BTN_SELECT, value); + break; + case 0x08: + input_report_key(idev, BTN_START, value); + break; + case 0x09: + input_report_key(idev, BTN_THUMBL, value); + break; + case 0x0A: + input_report_key(idev, BTN_THUMBR, value); + break; + } + + hid_dbg_lvl(DBG_LVL_ALL, hdev, + "hid-upage: %02x, hid-usage: %02x fixed\n", + (usage->hid & HID_USAGE_PAGE), + (usage->hid & HID_USAGE)); + + goto sync_and_stop_processing; + } + } + + return EV_CONT_PROCESSING; + +sync_and_stop_processing: + input_sync(idev); + return EV_STOP_PROCESSING; + +} + + +/* Device Probe and Remove Hook */ + +static int xpadneo_probe_device(struct hid_device *hdev, + const struct hid_device_id *id) +{ + int ret; + struct xpadneo_devdata *xdata; + + hid_dbg_lvl(DBG_LVL_FEW, hdev, "probing device: %s\n", hdev->name); + + + /* + * Create a per-device data structure which is "nearly globally" accessible + * through hid_get_drvdata. The structure is freed automatically + * as soon as hdev->dev (the device) is removed, since we use the devm_ + * derivate. + */ + xdata = devm_kzalloc(&hdev->dev, sizeof(*xdata), GFP_KERNEL); + if (xdata == NULL) + return -ENOMEM; + + xdata->id = ida_simple_get(&xpadneo_device_id_allocator, + 0, 0, GFP_KERNEL); + + xdata->hdev = hdev; + + /* Unknown until first report with ID 01 arrives (see raw_event) */ + xdata->report_behaviour = UNKNOWN; + + switch (hdev->dev_rsize) { + case 307: + xdata->report_descriptor = WINDOWS; + break; + case 335: + xdata->report_descriptor = LINUX; + break; + default: + xdata->report_descriptor = UNKNOWN; + break; + } + + hid_set_drvdata(hdev, xdata); + + + /* Parse the raw report (includes a call to report_fixup) */ + ret = hid_parse(hdev); + if (ret) { + hid_err(hdev, "parse failed\n"); + goto return_error; + } + + /* Debug Output*/ + hid_dbg_lvl(DBG_LVL_FEW, hdev, "driver:\n"); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* version: %s\n", DRV_VER); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "hdev:\n"); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* raw rdesc: (unfixed, see above)\n"); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* raw rsize: %u\n", hdev->dev_rsize); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* bus: 0x%04X\n", hdev->bus); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* report group: %u\n", hdev->group); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* vendor: 0x%08X\n", hdev->vendor); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* version: 0x%08X\n", hdev->version); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* product: 0x%08X\n", hdev->product); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* country: %u\n", hdev->country); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* driverdata: %lu\n", id->driver_data); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* serial: %pMR\n", hdev->uniq); + hid_dbg_lvl(DBG_LVL_FEW, hdev, "* physical location: %pMR\n", hdev->phys); + + /* We start our hardware without FF, we will add it afterwards by hand + * HID_CONNECT_DEFAULT = (HID_CONNECT_HIDINPUT | HID_CONNECT_HIDRAW + * | HID_CONNECT_HIDDEV | HID_CONNECT_FF) + * Our Input Device is created automatically since we defined + * HID_CONNECT_HIDINPUT as one of the flags. + */ + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT & ~HID_CONNECT_FF); + if (ret) { + hid_err(hdev, "hw start failed\n"); + goto return_error; + } + + /* Call the device initialization routines */ + ret = xpadneo_initDevice(hdev); + if (ret) { + hid_err(hdev, "device initialization failed\n"); + goto return_error; + } + + ret = xpadneo_initBatt(hdev); + if (ret) { + hid_err(hdev, "battery initialization failed\n"); + goto return_error; + } + + + /* Everything is fine */ + return 0; + +return_error: + return ret; +} + + +static void xpadneo_remove_device(struct hid_device *hdev) +{ + struct xpadneo_devdata *xdata = hid_get_drvdata(hdev); + + hid_hw_close(hdev); + + /* Cleaning up here */ + ida_simple_remove(&xpadneo_device_id_allocator, xdata->id); + + hid_hw_stop(hdev); + + hid_dbg_lvl(DBG_LVL_FEW, hdev, "Goodbye %s!\n", hdev->name); +} + + + +/* + * Device ID Structure, define all supported devices here + */ + +static const struct hid_device_id xpadneo_devices[] = { + + /* + * The ProductID is somehow related to the Firmware Version, + * but it somehow changed back from 0x02FD (newer fw) to 0x02E0 (older) + * and vice versa on one controller here. + * + * Unfortunately you cannot tell from product id how the gamepad really + * behaves on reports, since the newer firmware supports both mappings + * (the one which is standard in linux and the old one, which is still + * used in windows). + */ + + /* XBOX ONE S / X */ + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, 0x02FD) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, 0x02E0) }, + /* SENTINEL VALUE, indicates the end*/ + { } +}; + +static struct hid_driver xpadneo_driver = { + /* The name of the driver */ + .name = "xpadneo", + + /* Which devices is this driver for */ + .id_table = xpadneo_devices, + + /* Hooked as the input device is configured (before it is registered) + * we need that because we do not configure the input-device ourself + * but leave it up to hid_hw_start() + */ + .input_configured = xpadneo_input_configured, + + /* Invoked on input registering before mapping an usage */ + .input_mapping = xpadneo_mapping, + + /* If usage in usage_table, this hook is called */ + .event = xpadneo_event, + + /* Called before report descriptor parsing (NULL means nop) */ + .report_fixup = xpadneo_report_fixup, + + /* Called when a new device is inserted */ + .probe = xpadneo_probe_device, + + /* Called when a device is removed */ + .remove = xpadneo_remove_device, + + /* If report in report_table, this hook is called */ + .raw_event = xpadneo_raw_event, + + .report = xpadneo_report +}; + +MODULE_DEVICE_TABLE(hid, xpadneo_devices); + + + +/* + * Module Init and Exit + * + * We may replace init and remove by module_hid_driver(xpadneo_driver) + * in future versions, as long as there is nothing special in these two + * functions (but registering and unregistering the driver). Up to now it is + * more useful for us to not "oversimplify" the whole driver-registering thing. + * + * Caution: do not use both! (module_hid_driver and hid_(un)register_driver) + */ + +static int __init xpadneo_initModule(void) +{ + pr_info("%s: hello there!\n", xpadneo_driver.name); + + return hid_register_driver(&xpadneo_driver); +} + +static void __exit xpadneo_exitModule(void) +{ + hid_unregister_driver(&xpadneo_driver); + + ida_destroy(&xpadneo_device_id_allocator); + + pr_info("%s: goodbye!\n", xpadneo_driver.name); +} + +/* + * Tell the driver system which functions to call at initialization and + * removal of the module + */ +module_init(xpadneo_initModule); +module_exit(xpadneo_exitModule); -- 2.17.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/bootloader/LePotato_boot.ini ================================================ LIBRETECH-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootrootfs "BOOT_IMAGE=kernel.img boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" setenv coreelec "quiet" setenv hdmi_cec "1" setenv wol "1" setenv emmc_timeout "0" setenv uenv_addr 0x13000000 showlogo 1080p60hz 1920 1080 boot-logo-1080.bmp.gz fatload mmc ${mmc_dev}:1 ${loadaddr} kernel.img fatload mmc ${mmc_dev}:1 ${dtb_mem_addr} dtb.img if fatload mmc ${mmc_dev}:1 ${uenv_addr} config.ini; then env import -t ${uenv_addr} $filesize; fi if test "${emmc_timeout}" = "1"; then showlogo 1080p60hz 1920 1080 timeout-logo-1080.bmp.gz; sleep 30; mmc dev 1; mmc dev 0; fi setenv libretech "logo=osd1,loaded,0x3f800000,1080p60hz vout=1080p60hz,enable vout_mode=hdmi hdmimode=1080p60hz cvbsmode=nocvbs consoleblank=0" if test "${hdmi_cec}" = "1"; then setenv cec "hdmitx=cec3f"; fi setenv bootargs "${consoltopt} ${bootrootfs} ${libretech} ${cec} ${coreelec}" # Device tree modifications bootm start bootm loados bootm fdt if test "${wol}" = "1"; then fdt set "/ethernet@0xc9410000" wol <1>; else fdt set "/ethernet@0xc9410000" wol <0>; fi bootm prep # Boot the board bootm go ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/bootloader/Odroid_C2_boot.ini ================================================ ODROIDC2-UBOOT-CONFIG #------------------------------------------------------------------------------------------------------ # # boot.ini # # WARNING DO NOT MODIFY THIS FILE! ALL CHANGES WILL BE LOST WITH THE NEXT UPDATE! # Set your own settings in config.ini # #------------------------------------------------------------------------------------------------------ setenv bootrootfs "BOOT_IMAGE=kernel.img boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@" setenv consoleopt "console=ttyS0,115200 console=tty0 no_console_suspend" setenv coreelec "quiet" setenv hdmi_cec "1" setenv max_freq "1536" setenv rtc_shield "0" setenv loadaddr 0x11000000 setenv dtb_mem_addr 0x1000000 setenv uenv_addr 0x13000000 fatload mmc 0:1 ${loadaddr} kernel.img fatload mmc 0:1 ${dtb_mem_addr} dtb.img if fatload mmc 0:1 ${uenv_addr} config.ini; then env import -t ${uenv_addr} $filesize; fi setenv device "logo=osd1,loaded,0x3f800000,1080p60hz vout=1080p60hz,enable vout_mode=hdmi hdmimode=1080p60hz cvbsmode=nocvbs mac=${ethaddr} consoleblank=0 max_freq=${max_freq}" if test "${hdmi_cec}" = "1"; then setenv cec "hdmitx=cec3f"; fi setenv bootargs "${consoleopt} ${bootrootfs} ${device} ${cec} ${coreelec}" # Device tree modifications bootm start bootm loados bootm fdt if test "${rtc_shield}" = "1"; then fdt set "/i2c@c1108500/pcf8563@51" status okay; else fdt set "/i2c@c1108500/pcf8563@51" status disabled; fi # Remove aml partition layout from device tree (required for eMMC boot) fdt rm /partitions bootm prep # Boot the board bootm go ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/bootloader/canupdate.sh ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.tv) # Detect newer kernel installs and abort to prevent downgrades if [ "$(uname -r)" != "3.14.29" ]; then echo "Downgrading to 3.14 kernel is not supported!" sleep 10 exit 1 fi case $1 in @PROJECT@|S905*|S912*) exit 0 ;; *) exit 1 ;; esac ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/bootloader/config.ini ================================================ #------------------------------------------------------------------------------------------------------ # # config.ini # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # Console Setup # # consoleopt='console=ttyS0,115200 console=tty0 no_console_suspend' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # CPU Frequency Control # # WARNING!!! WARNING!!! WARNING!!! # Before changing anything here please read the wiki entry at: # http://odroid.com/dokuwiki/doku.php?id=en:c2_set_cpu_freq # # max_freq='1536' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # HDMI CEC Control, 0=disable/1=enable # # hdmi_cec='1' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # RTC Shield Control for Odroid C2, 0=off/1=on # # rtc_shield='0' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # WOL Setting for LePotato, 0=off/1=on # # wol='1' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # EMMC Timeout for LePotato # BL1 is configured to boot from eMMC before SD-card, this option is useful if you have another OS # installed on to an eMMC as it will delay bootup by 30s allowing you to boot from an SD-card and # attach the eMMC during this time, u-boot will then boot from the SD-card and the eMMC will be # be available to the OS allowing you to use installtoemmc or browse the eMMC contents. # # emmc_timeout='1' # #------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------ # # CoreELEC Developer Options # Valid options are: textmode debugging progress nofsck nosplash noram overlay quiet ssh # # coreelec='quiet' # #------------------------------------------------------------------------------------------------------ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/bootloader/dtb.conf ================================================ <dtb> </dtb> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/bootloader/mkbootimg ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) DTBIMG_PATH="arch/$TARGET_KERNEL_ARCH/boot" DTB_PATH="${DTBIMG_PATH}/dts/amlogic" ANDROID_BOOTIMG_SECOND="" SUBDEVICES+=" Generic" for device in $SUBDEVICES; do DTB_BLOBS_PATH=${DTB_PATH}/${device} mkdir -p ${DTB_BLOBS_PATH} if [ "$device" = "Generic" ]; then for dtblob in $KERNEL_UBOOT_EXTRA_TARGET; do cp ${DTB_PATH}/$dtblob ${DTB_BLOBS_PATH} 2>/dev/null || : done else cp ${DTB_PATH}/*${device,,}.dtb ${DTB_BLOBS_PATH} 2>/dev/null || : fi DTB_BLOBS=($(ls ${DTB_BLOBS_PATH}/*.dtb 2>/dev/null || true)) DTB_BLOBS_COUNT=${#DTB_BLOBS[@]} DTB_BLOB_OUTPUT=${DTBIMG_PATH}/${device}_dtb.img if [ "$DTB_BLOBS_COUNT" -gt 1 ]; then $TOOLCHAIN/bin/dtbTool -o ${DTB_BLOB_OUTPUT} -p scripts/dtc/ ${DTB_BLOBS_PATH} elif [ "$DTB_BLOBS_COUNT" -eq 1 ]; then cp -PR $DTB_BLOBS $DTB_BLOB_OUTPUT fi done if [ -f ${DTBIMG_PATH}/Generic_dtb.img ]; then ANDROID_BOOTIMG_SECOND="--second ${DTBIMG_PATH}/Generic_dtb.img" fi LDFLAGS="" mkbootimg --kernel arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET --ramdisk $BUILD/image/initramfs.cpio \ $ANDROID_BOOTIMG_SECOND $ANDROID_BOOTIMG_OPTIONS --output arch/$TARGET_KERNEL_ARCH/boot/boot.img ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/bootloader/mkimage ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) # copy amlogic autoscript files to part1 for Generic img only if [ "${SUBDEVICE}" == "Generic" ]; then for f in $RELEASE_DIR/3rdparty/bootloader/*autoscript; do [ -e "$f" ] && mcopy "$f" :: done fi # copy device trees to part1 for dtb in $RELEASE_DIR/3rdparty/bootloader/device_trees $RELEASE_DIR/3rdparty/bootloader/*.dtb $RELEASE_DIR/3rdparty/bootloader/dtb.img ; do [ -e "$dtb" ] && mcopy -s "$dtb" :: done if [ -n ${SUBDEVICE} ]; then if [ -f "$RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_dtb.img" ]; then mcopy $RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_dtb.img "::/dtb.img" fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_u-boot" ]; then echo "Writing u-boot to $(basename $DISK)" dd if="$RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_u-boot" of="$DISK" conv=fsync,notrunc bs=1 count=112 >"$SAVE_ERROR" 2>&1 || show_error dd if="$RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_u-boot" of="$DISK" conv=fsync,notrunc bs=512 skip=1 seek=1 >"$SAVE_ERROR" 2>&1 || show_error fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_boot.ini" ]; then cp -p "$RELEASE_DIR/3rdparty/bootloader/${SUBDEVICE}_boot.ini" "$LE_TMP/boot.ini" sed -e "s/@BOOT_UUID@/$UUID_SYSTEM/" \ -e "s/@DISK_UUID@/$UUID_STORAGE/" \ -i "$LE_TMP/boot.ini" mcopy "$LE_TMP/boot.ini" :: if [ -f "$RELEASE_DIR/3rdparty/bootloader/config.ini" ]; then mcopy $RELEASE_DIR/3rdparty/bootloader/config.ini :: fi fi if [ "${SUBDEVICE}" == "Odroid_C2" ]; then if [ -f "$RELEASE_DIR/3rdparty/bootloader/boot-logo.bmp.gz" ]; then mcopy $RELEASE_DIR/3rdparty/bootloader/boot-logo.bmp.gz :: fi fi if [ "${SUBDEVICE}" == "LePotato" ]; then if [ -f "$RELEASE_DIR/3rdparty/bootloader/boot-logo-1080.bmp.gz" ]; then mcopy $RELEASE_DIR/3rdparty/bootloader/boot-logo-1080.bmp.gz :: fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/timeout-logo-1080.bmp.gz" ]; then mcopy $RELEASE_DIR/3rdparty/bootloader/timeout-logo-1080.bmp.gz :: fi fi fi # Include older alternative kernel for Amlogic-old mcopy $RELEASE_DIR/3rdparty/bootloader/old_ee_3.14_kernel.7z :: ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/bootloader/release ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018 Team LibreELEC (https://libreelec.tv) mkdir -p $RELEASE_DIR/3rdparty/bootloader cp -a $INSTALL/usr/share/bootloader/* $RELEASE_DIR/3rdparty/bootloader ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/bootloader/scripts/aml_autoscript.src ================================================ defenv setenv bootfromnand 0 setenv upgrade_step 2 setenv sddtb 'if fatload mmc 0 ${dtb_mem_addr} dtb.img; then else store dtb read $dtb_mem_addr; fi' setenv usbdtb 'if fatload usb 0 ${dtb_mem_addr} dtb.img; then else store dtb read $dtb_mem_addr; fi' setenv bootfromsd 'mmcinfo; if fatload mmc 0 ${loadaddr} kernel.img; then run sddtb; setenv bootargs ${bootargs} bootfromsd; bootm; fi' setenv bootfromusb 'usb start 0; if fatload usb 0 ${loadaddr} kernel.img; then run usbdtb; setenv bootargs ${bootargs} bootfromusb; bootm; fi' setenv bootcmd 'if test ${bootfromnand} = 1; then setenv bootfromnand 0; saveenv; else run bootfromsd; run bootfromusb; fi; run storeboot' saveenv run storeargs run bootfromsd run bootfromusb ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/bootloader/update.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) [ -z "$SYSTEM_ROOT" ] && SYSTEM_ROOT="" [ -z "$BOOT_ROOT" ] && BOOT_ROOT="/flash" [ -z "$BOOT_PART" ] && BOOT_PART=$(df "$BOOT_ROOT" | tail -1 | awk {' print $1 '}) if [ -z "$BOOT_DISK" ]; then case $BOOT_PART in /dev/sd[a-z][0-9]*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,[0-9]*,,g") ;; /dev/mmcblk*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,p[0-9]*,,g") ;; esac fi mount -o rw,remount $BOOT_ROOT SUBDEVICE="" for arg in $(cat /proc/cmdline); do case $arg in boot=*) boot="${arg#*=}" case $boot in /dev/mmc*) BOOT_UUID="$(blkid $boot | sed 's/.* UUID="//;s/".*//g')" ;; UUID=*|LABEL=*) BOOT_UUID="$(blkid | sed 's/"//g' | grep -m 1 -i " $boot " | sed 's/.* UUID=//;s/ .*//g')" ;; esac if [ -f "/proc/device-tree/coreelec-dt-id" ]; then DT_ID=$(cat /proc/device-tree/coreelec-dt-id) elif [ -f "/proc/device-tree/le-dt-id" ]; then DT_ID=$(cat /proc/device-tree/le-dt-id) fi if [ -n "$DT_ID" ]; then case $DT_ID in *lepotato) SUBDEVICE="LePotato" ;; *odroid*c2) SUBDEVICE="Odroid_C2" DT_ID="gxbb_p200_2g_odroid_c2" ;; esac fi if [ -n "$DT_ID" -a -f "$SYSTEM_ROOT/usr/share/bootloader/device_trees/$DT_ID.dtb" ]; then UPDATE_DTB_SOURCE="$SYSTEM_ROOT/usr/share/bootloader/device_trees/$DT_ID.dtb" fi if [ -f "$UPDATE_DTB_SOURCE" ]; then echo "Updating device tree from $UPDATE_DTB_SOURCE..." case $boot in /dev/system) dd if=/dev/zero of=/dev/dtb bs=256k count=1 status=none dd if="$UPDATE_DTB_SOURCE" of=/dev/dtb bs=256k status=none ;; /dev/mmc*|LABEL=*|UUID=*) cp -f "$UPDATE_DTB_SOURCE" "$BOOT_ROOT/dtb.img" ;; esac fi for all_dtb in /flash/*.dtb ; do if [ -f $all_dtb ]; then dtb=$(basename $all_dtb) if [ -f $SYSTEM_ROOT/usr/share/bootloader/$dtb ]; then echo "Updating $dtb..." cp -p $SYSTEM_ROOT/usr/share/bootloader/$dtb $BOOT_ROOT fi fi done ;; disk=*) disk="${arg#*=}" case $disk in /dev/mmc*) DISK_UUID="$(blkid $disk | sed 's/.* UUID="//;s/".*//g')" ;; UUID=*|LABEL=*) DISK_UUID="$(blkid | sed 's/"//g' | grep -m 1 -i " $disk " | sed 's/.* UUID=//;s/ .*//g')" ;; esac ;; esac done if [ -d $BOOT_ROOT/device_trees ]; then echo "Updating device_trees folder..." rm $BOOT_ROOT/device_trees/*.dtb cp -p $SYSTEM_ROOT/usr/share/bootloader/device_trees/*.dtb $BOOT_ROOT/device_trees/ fi if [ -f $SYSTEM_ROOT/usr/share/bootloader/${SUBDEVICE}_boot.ini ]; then echo "Updating boot.ini..." cp -p $SYSTEM_ROOT/usr/share/bootloader/${SUBDEVICE}_boot.ini $BOOT_ROOT/boot.ini sed -e "s/@BOOT_UUID@/$BOOT_UUID/" \ -e "s/@DISK_UUID@/$DISK_UUID/" \ -i $BOOT_ROOT/boot.ini if [ -f $SYSTEM_ROOT/usr/share/bootloader/config.ini ]; then if [ ! -f $BOOT_ROOT/config.ini ]; then echo "Creating config.ini..." cp -p $SYSTEM_ROOT/usr/share/bootloader/config.ini $BOOT_ROOT/config.ini fi fi fi if [ "${SUBDEVICE}" == "Odroid_C2" ]; then if [ -f $SYSTEM_ROOT/usr/share/bootloader/boot-logo.bmp.gz ]; then echo "Updating boot logo..." cp -p $SYSTEM_ROOT/usr/share/bootloader/boot-logo.bmp.gz $BOOT_ROOT fi fi if [ "${SUBDEVICE}" == "LePotato" ]; then if [ -f $SYSTEM_ROOT/usr/share/bootloader/boot-logo-1080.bmp.gz ]; then echo "Updating boot logos..." cp -p $SYSTEM_ROOT/usr/share/bootloader/boot-logo-1080.bmp.gz $BOOT_ROOT fi if [ -f $SYSTEM_ROOT/usr/share/bootloader/timeout-logo-1080.bmp.gz ]; then cp -p $SYSTEM_ROOT/usr/share/bootloader/timeout-logo-1080.bmp.gz $BOOT_ROOT fi fi if [ -f $SYSTEM_ROOT/usr/share/bootloader/${SUBDEVICE}_u-boot -a ! -e /dev/system -a ! -e /dev/boot ]; then echo "Updating u-boot on: $BOOT_DISK..." dd if=$SYSTEM_ROOT/usr/share/bootloader/${SUBDEVICE}_u-boot of=$BOOT_DISK conv=fsync bs=1 count=112 status=none dd if=$SYSTEM_ROOT/usr/share/bootloader/${SUBDEVICE}_u-boot of=$BOOT_DISK conv=fsync bs=512 skip=1 seek=1 status=none fi if [ -f $BOOT_ROOT/aml_autoscript ]; then if [ -f $SYSTEM_ROOT/usr/share/bootloader/aml_autoscript ]; then echo "Updating aml_autoscript..." cp -p $SYSTEM_ROOT/usr/share/bootloader/aml_autoscript $BOOT_ROOT fi fi if [ ! -f $BOOT_ROOT/@KERNEL_NAME@ -a -f $BOOT_ROOT/@LEGACY_KERNEL_NAME@ ]; then echo "Updating Legacy Kernel name..." cp -p $BOOT_ROOT/@LEGACY_KERNEL_NAME@ $BOOT_ROOT/@KERNEL_NAME@ cp -p $BOOT_ROOT/@LEGACY_KERNEL_NAME@.md5 $BOOT_ROOT/@KERNEL_NAME@.md5 fi if [ ! -f $BOOT_ROOT/dtb.img -a -f $BOOT_ROOT/@LEGACY_DTB_NAME@ ]; then echo "Updating Legacy dtb name..." cp -p $BOOT_ROOT/@LEGACY_DTB_NAME@ $BOOT_ROOT/dtb.img fi mount -o ro,remount $BOOT_ROOT # Leave a hint that we just did an update echo "UPDATE" >/storage/.config/boot.hint ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/etc/lirc/lircd.conf.d/odroid-amremote.conf ================================================ begin remote name odroid_amremote bits 16 flags SPACE_ENC|CONST_LENGTH eps 30 aeps 100 header 9000 4500 one 563 1687 zero 563 562 ptrail 563 repeat 9000 2250 pre_data_bits 16 pre_data 0x4DB2 gap 0 suppress_repeat 1 begin codes KEY_POWER 0x3BC4 KEY_MUTE 0x11EE KEY_HOME 0x41BE KEY_OK 0x738C KEY_LEFT 0x9966 KEY_RIGHT 0x837C KEY_UP 0x53AC KEY_DOWN 0x4BB4 KEY_BACK 0x59A6 KEY_MENU 0xA35C KEY_VOLUMEDOWN 0x817E KEY_VOLUMEUP 0x01FE end codes end remote ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/usr/bin/cputemp ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018 Team LibreELEC (https://libreelec.tv) TEMP="$(cat /sys/class/thermal/thermal_zone0/temp)" echo "$(( $TEMP / 1000 )) C" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/usr/lib/kodi/aml-hdmimonitor.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2016-2018 kszaq (kszaquitto@gmail.com) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) HDMI_UNPLUGGED=0 while :; do ! grep -q . /sys/class/amhdmitx/amhdmitx0/disp_cap && grep -q 0 /sys/class/amhdmitx/amhdmitx0/hpd_state && HDMI_UNPLUGGED=1 && sleep 2 && continue || break done if [ $HDMI_UNPLUGGED = 1 ] then systemctl restart kodi fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/usr/lib/modprobe.d/disable-ir-remotes.conf ================================================ blacklist meson-ir blacklist meson-remote ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/usr/lib/modprobe.d/mali.conf ================================================ options mali mali_shared_mem_size=0x40000000 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/usr/lib/modules-load.d/amlvideodri.conf ================================================ amlvideodri ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/usr/lib/modules-load.d/wifi_dummy.conf ================================================ wifi_dummy ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/usr/lib/systemd/sleep.conf.d/sleep.conf ================================================ [Sleep] SuspendMode=false HibernateMode=false ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/usr/lib/systemd/system/amlogic-dvb.service ================================================ [Unit] Description=Amlogic DVB module loader ConditionPathExists=/proc/device-tree/dvbfe/dtv_demod0 After=kernel-overlays.service [Service] Type=simple ExecStart=/bin/sh -c '[ `cat /proc/device-tree/dvbfe/dtv_demod0` = "Avl6211" ] && /sbin/modprobe aml_fe' [Install] WantedBy=basic.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/usr/lib/systemd/system/fstrim.service ================================================ [Unit] Description=Apply TRIM on all trimmable mounts [Service] Type=simple ExecStart=-/usr/sbin/fstrim -a -v [Install] WantedBy=basic.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/usr/lib/systemd/system/kodi-aml-hdmimonitor.service ================================================ [Unit] Description=Kodi Amlogic HDMI connection monitor After=kodi.service [Service] Type=simple ExecStart=/usr/lib/kodi/aml-hdmimonitor.sh [Install] WantedBy=kodi.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/usr/lib/systemd/system/wetekdvb.service ================================================ [Unit] Description=WeTek DVB module loader ConditionPathExists=/proc/device-tree/dvb/dev_name After=kernel-overlays.service [Service] Type=simple ExecStart=/bin/sh -c '[ `cat /proc/device-tree/dvb/dev_name` = "wetek-dvb" ] && /sbin/modprobe wetekdvb' [Install] WantedBy=basic.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/usr/lib/udev/rules.d/99-spidev.rules ================================================ KERNEL=="spidev*", SUBSYSTEMS=="spidev", SYMLINK+="spidev0.0" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/usr/sbin/installtointernal ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2016-2018 kszaq (kszaquitto@gmail.com) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) IMAGE_KERNEL="/flash/kernel.img" IMAGE_SYSTEM="/flash/SYSTEM" IMAGE_DTB="/flash/dtb.img" BACKUP_DATE=$(date +%Y%m%d%H%M%S) install_to_nand() { if [ -f $IMAGE_KERNEL -a -f $IMAGE_SYSTEM ] ; then if grep -q /dev/system /proc/mounts ; then echo "Unmounting SYSTEM partiton." umount -f /dev/system fi mkdir -p /tmp/system mount -o rw,remount /flash if [ -e /dev/dtb ] ; then echo -n "Backing up device tree..." dd if=/dev/dtb of="/flash/dtb$BACKUP_DATE.img" bs=256k conv=fsync 2> /dev/null echo "done." fi if [ -e /dev/recovery ] ; then echo -n "Backing up recovery partition..." dd if=/dev/recovery of="/flash/recovery$BACKUP_DATE.img" bs=64k conv=fsync 2> /dev/null echo "done." fi echo -n "Formatting SYSTEM partition..." mke2fs -F -q -t ext4 -m 0 /dev/system || exit 1 e2fsck -n /dev/system || exit 1 echo "done." echo -n "Writing kernel image..." dd if="$IMAGE_KERNEL" of=/dev/boot bs=1M 2> /dev/null echo "done." echo -n "Copying SYSTEM files..." mount -o rw /dev/system /tmp/system cp $IMAGE_SYSTEM /tmp/system && sync echo "done." umount /tmp/system if [ -f $IMAGE_DTB ] ; then echo -n "Writing device tree image..." dd if=/dev/zero of=/dev/dtb bs=256k count=1 2> /dev/null dd if="$IMAGE_DTB" of=/dev/dtb bs=256k 2> /dev/null echo "done." fi read -p "Do you want to copy your user data to internal data partition? [Y/n] " choice case "$choice" in [nN]*) read -p "Do you want to format DATA partition? [Y/n] " choice case "$choice" in [nN]*) ;; *) echo -n "Formatting DATA partition..." mke2fs -F -q -t ext4 -m 0 /dev/data > /dev/null e2fsck -n /dev/data &> /dev/null echo "done." esac ;; *) echo -n "Formatting DATA partition..." mke2fs -F -q -t ext4 -m 0 /dev/data > /dev/null e2fsck -n /dev/data &> /dev/null echo "done." echo -n "Stopping Kodi..." systemctl stop kodi echo "done." echo "Copying user data..." mkdir -p /tmp/data mount -o rw /dev/data /tmp/data cp -pPRv /storage/. /tmp/data ;; esac echo "All done!" echo "WARNING: If your internal memory layout is different from standard Amlogic, you have to perform this operation again!" echo "Your system will reboot from internal memory." echo "" read -p "Would you like to reboot now [y/N]? " choice case "$choice" in [yY]*) if /usr/sbin/fw_printenv whereToBootFrom > /dev/null 2>&1; then /usr/sbin/fw_setenv whereToBootFrom internal; fi /usr/sbin/fw_setenv bootfromnand 1 /usr/sbin/reboot switch_system ;; esac else echo "No EmuELEC image found on /flash! Exiting..." fi } if [ ! -e /dev/boot -o ! -e /dev/system -o ! -e /dev/data -o ! -e /dev/dtb ]; then echo "One of BOOT, SYTEM, DATA or DTB partitions is missing." echo "Make sure that you are using a correct device tree and a device with internal memory!" echo "" echo "Not all devices are compatible with installtointernal due to unsupported NAND/eMMC" echo "chips being used by some manufacturers." exit 0 fi echo "This script will erase BOOT, SYSTEM, DATA and DTB on your device" echo "and install EmuELEC that you booted from SD card/USB drive." echo "" echo "It will create a backup of device tree and recovery partition on your boot media." echo "" echo "WARNING: The script does not have any safeguards, you will not receive any" echo "support for problems that you may encounter if you proceed!" echo "" read -p "Type \"yes\" if you know what you are doing or anything else to exit: " choice case "$choice" in yes) install_to_nand ;; esac ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/usr/sbin/lepotatotoemmc ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) DISTRO_BOOTLABEL="COREELEC" DISTRO_DISKLABEL="STORAGE" SYSTEM_PART_START=8192 SYSTEM_SIZE=512 SYSTEM_PART_END=$(( ${SYSTEM_PART_START} + (${SYSTEM_SIZE} * 1024 * 1024 / 512) - 1 )) STORAGE_PART_START=$(( ${SYSTEM_PART_END} + 1 )) SYSTEM_BLKDEV=$(readlink -f /dev/block/$(mountpoint -d /flash)) BLKDEVNAME=$(ls /sys/class/mmc_host/emmc/emmc*/block 2> /dev/null) BLKDEV="/dev/${BLKDEVNAME}" BOOT_PART="${BLKDEV}p1" STORAGE_PART="${BLKDEV}p2" NEWBOOT=/var/media/NEWBOOT NEWSTORAGE=/var/media/NEWSTORAGE LE_DT_ID=$(cat /proc/device-tree/le-dt-id) toggle_emmc_timeout(){ mount -o remount,rw /flash if ! $(grep "^emmc_timeout=1$" /flash/config.ini >/dev/null); then echo "Enabling eMMC timeout..." echo "emmc_timeout=1" >> /flash/config.ini echo "Please reboot with eMMC removed and insert when the boot splash appears." else echo "Disabling eMMC timeout..." sed -i '/^emmc_timeout\=1$/d' /flash/config.ini fi mount -o remount,ro /flash } umount_all() { mounted=$(cat /proc/mounts | grep "${BLKDEV}" | awk '{ print $1 }') if [ -n "$mounted" ]; then echo "Unmount all partitions from ${BLKDEVNAME}..." umount $mounted sleep 2 fi } install_to_emmc() { # disable emmc_timeout toggle_emmc_timeout #stop kodi echo "Stopping Kodi..." systemctl stop kodi # umount umount_all # nuke it echo "Delete all partitions..." dd if=/dev/zero of=${BLKDEV} bs=512 count=1 # create partitions echo "Create new partitions..." parted -s "${BLKDEV}" mklabel "msdos" parted -s "${BLKDEV}" -a min unit s mkpart primary fat32 "${SYSTEM_PART_START}" "${SYSTEM_PART_END}" parted -s "${BLKDEV}" set 1 boot on parted -s "${BLKDEV}" -a min unit s mkpart primary ext4 "${STORAGE_PART_START}" "100%" sync # Flash u-boot echo "Flash Bootloader..." dd if=/usr/share/bootloader/LePotato_u-boot of=$BLKDEV conv=fsync bs=1 count=112 status=none dd if=/usr/share/bootloader/LePotato_u-boot of=$BLKDEV conv=fsync bs=512 skip=1 seek=1 status=none sync # create fs for new /flash echo "Create Filesystem for new flash partition..." mkfs.vfat -n "${DISTRO_BOOTLABEL}" "${BOOT_PART}" ; sync # create fs for new /storage echo "Create Filesystem for new storage partition..." mke2fs -F -q -L "${DISTRO_DISKLABEL}" -t ext4 -m 0 "${STORAGE_PART}" ; sync # umount again umount_all # mount echo "Mount new partitions..." mkdir -p "${NEWBOOT}" "${NEWSTORAGE}" mount "${BOOT_PART}" "${NEWBOOT}" mount "${STORAGE_PART}" "${NEWSTORAGE}" # cp /flash files echo "Copy /flash files to new flash partition..." cp -a /flash/kernel.img /flash/SYSTEM /flash/dtb.img ${NEWBOOT} echo "Copy template boot.ini..." cp -a /usr/share/bootloader/${DEVICE}_boot.ini ${NEWBOOT}/boot.ini echo "Copy config.ini..." if [ -e /flash/config.ini ]; then cp -a /flash/config.ini ${NEWBOOT} else cp -a /usr/share/bootloader/config.ini ${NEWBOOT} fi sync # set our new UUID's BOOT_UUID="$(blkid ${BOOT_PART} | sed 's/.* UUID="//;s/".*//g')" STORAGE_UUID="$(blkid ${STORAGE_PART} | sed 's/.* UUID="//;s/".*//g')" echo "Set UUIDs in new boot.ini..." sed -e "s/@BOOT_UUID@/$BOOT_UUID/" \ -e "s/@DISK_UUID@/$STORAGE_UUID/" \ -i ${NEWBOOT}/boot.ini # check if there is enough space space_available=$(df "${NEWSTORAGE}" | awk 'NR==2 { print $4 }') space_required=$(df "/storage/" | awk 'NR==2 { print $3 }') if [ $space_available -ge $space_required ]; then # rsync userdata echo "Rsync /storage files to new storage partition..." rsync -Pa /storage/ $NEWSTORAGE/ else echo "Not enough space on the new storage partition. Skipping... " fi umount_all echo "All done! Please poweroff your device and remove the SD/USB." echo "Enjoy!" } if [ "$SYSTEM_BLKDEV" = "/dev/block" -o "$SYSTEM_BLKDEV" = "$BOOT_PART" ]; then echo "No no no no no! Don't use that script from eMMC otherwise it will eat your data!" exit 1 fi case $LE_DT_ID in *lepotato) DEVICE="LePotato" ;; *) echo "This script is only for LePotato. It won't work on other devices!" exit 1 ;; esac if ! $(grep "^emmc_timeout=1$" /flash/config.ini >/dev/null); then echo "This script will help you to install CoreELEC on a LePotato eMMC from" echo "within a running CE on SD card or USB drive." echo "" echo "First we will set a 30s timout for u-boot." echo "Please reboot CoreELEC from SD/USB without the eMMC plugged in." echo "You will see the boot splash with the words: 30s: Please insert the eMMC." echo "After the 30s timeout CoreELEC will boot as normal and you will have to run this" echo "script again to continue. If you don't manage to insert the eMMC in time just reboot and try again." read -p "Type \"yes\" if you know what you are doing or anything else to exit: " choice case "$choice" in yes) toggle_emmc_timeout && exit 0;; *) exit 0 ;; esac fi if [ -z "$BLKDEVNAME" ]; then echo "eMMC not found. Please reboot with your eMMC removed and insert it after the bootsplash appears." exit 0 fi echo "This script will now erase the eMMC on your device" echo "All data on this eMMC will be lost forever!" echo "" read -p "Type \"yes\" if you know what you are doing or anything else to exit: " choice case "$choice" in yes) install_to_emmc ;; *) exit 0 ;; esac ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/usr/sbin/rebootfromnand ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2016-2018 kszaq (kszaquitto@gmail.com) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) if /usr/sbin/fw_printenv whereToBootFrom > /dev/null 2>&1; then /usr/sbin/fw_setenv whereToBootFrom internal; fi /usr/sbin/fw_setenv bootfromnand 1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/filesystem/usr/share/alsa/cards/AML-M8AUDIO.conf ================================================ # # Configuration for Amlogic M8 Audio # AML-M8AUDIO.pcm.default { @args [ CARD ] @args.CARD { type string } type softvol slave.pcm { type plug slave { pcm { type hw card $CARD device 0 } } } control { name "PCM Playback Volume" card $CARD } } <confdir:pcm/hdmi.conf> AML-M8AUDIO.pcm.hdmi.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type hooks slave.pcm { type hw card $CARD device 1 format S16_LE } hooks.0 { type ctl_elems hook_args [ { interface MIXER name "IEC958 Playback Default" lock true preserve true optional true value [ $AES0 $AES1 $AES2 $AES3 ] } ] } } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/initramfs/platform_init ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) display_mode=$(cat /sys/class/display/mode) for arg in $(cat /proc/cmdline); do case ${arg} in bootfrom*) bootfromext=1 ;; BOOT_IMAGE=*) BOOT_IMAGE=${arg#*=} ;; boot=*) boot=${arg#*=} ;; disk=*) disk=${arg#*=} ;; hdmimode=*) hdmimode=${arg#*=} ;; esac done # Add information where to run CoreELEC from if [ -z "$BOOT_IMAGE" -o -z "$boot" -o -z "$disk" ]; then cmdline=$(cat /proc/cmdline) if [ -n "$bootfromext" ]; then cmdline="$cmdline BOOT_IMAGE=kernel.img boot=LABEL=@BOOT_LABEL@ disk=LABEL=@DISK_LABEL@" else cmdline="$cmdline BOOT_IMAGE=/dev/boot boot=/dev/system disk=/dev/data" fi echo "$cmdline" > /proc/cmdline fi # Enable HDMI output if cable is connected and not already enabled by u-boot if [ "$(cat /sys/class/amhdmitx/amhdmitx0/hpd_state)" != "0" ] && [ "$display_mode" != "$hdmimode" ]; then echo "$hdmimode" > /sys/class/display/mode display_mode="$hdmimode" fi # Set framebuffer geometry to match the resolution case $display_mode in 480*) X=720 Y=480 ;; 576*) X=720 Y=576 ;; 720p*) X=1280 Y=720 ;; *) X=1920 Y=1080 ;; esac fbset -fb /dev/fb0 -g $X $Y 1920 2160 32 fbset -fb /dev/fb1 -g 32 32 32 32 32 echo 0 > /sys/class/graphics/fb0/free_scale echo 0 > /sys/class/graphics/fb1/free_scale echo 1 > /sys/class/video/disable_video # Enable scaling for 4K output case $display_mode in 4k*|smpte*|2160*) echo 0 0 1919 1079 > /sys/class/graphics/fb0/free_scale_axis echo 0 0 3839 2159 > /sys/class/graphics/fb0/window_axis echo 1920 > /sys/class/graphics/fb0/scale_width echo 1080 > /sys/class/graphics/fb0/scale_height echo 0x10001 > /sys/class/graphics/fb0/free_scale ;; esac # Include deinterlacer into default VFM map echo rm default > /sys/class/vfm/map echo add default decoder ppmgr deinterlace amvideo > /sys/class/vfm/map # Enable framebuffer device echo 0 > /sys/class/graphics/fb0/blank # Blank fb1 to prevent static noise echo 1 > /sys/class/graphics/fb1/blank # set smp_affinity # Binary Hex # CPU 0 0001 1 # CPU 1 0010 2 # CPU 2 0100 4 # CPU 3 1000 8 echo 2 > /proc/irq/231/smp_affinity # hdmi_aocec echo 4 > /proc/irq/63/smp_affinity # dwc_otg, dwc_otg_hcd:usb1 echo 8 > /proc/irq/62/smp_affinity # dwc_otg, dwc_otg_hcd:usb2, dwc_otg_pcd # DEC_CONTROL_FLAG_DISABLE_FAST_POC echo 4 > /sys/module/amvdec_h264/parameters/dec_control echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy # S912: Set 1GHz minimum CPU speed for both clusters if [ -f /proc/device-tree/t82x@d00c0000/compatible ] ; then echo 1000000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq echo 1000000 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/kodi/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8" ?> <settings version="1"> <section id="system"> <category id="display"> <group id="1"> <setting id="videoscreen.limitedrange"> <visible>false</visible> </setting> </group> </category> <category id="audio"> <group id="1"> <setting id="audiooutput.config"> <default>3</default> </setting> <setting id="audiooutput.streamsilence"> <default>0</default> </setting> <setting id="audiooutput.streamnoise"> <default>false</default> </setting> </group> </category> </section> <section id="player"> <category id="videoplayer"> <group id="2"> <setting id="videoplayer.adjustrefreshrate"> <default>2</default> <!-- ADJUST_REFRESHRATE_ON_STARTSTOP --> <constraints> <options> <option label="351">0</option> <!-- ADJUST_REFRESHRATE_OFF --> <option label="36036">2</option> <!-- ADJUST_REFRESHRATE_ON_STARTSTOP --> <option label="36050">3</option> <!-- ADJUST_REFRESHRATE_ON_START --> </options> </constraints> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/linux/linux.aarch64.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm64 3.14.29 Kernel Configuration # CONFIG_ARM64=y CONFIG_ARM64_HAS_SG_CHAIN=y CONFIG_64BIT=y CONFIG_ARCH_PHYS_ADDR_T_64BIT=y CONFIG_MMU=y CONFIG_ARCH_MMAP_RND_BITS_MIN=18 CONFIG_ARCH_MMAP_RND_BITS_MAX=24 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_NO_IOPORT=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_LOCKDEP_SUPPORT=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CSUM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_SWIOTLB=y CONFIG_IOMMU_HELPER=y CONFIG_KERNEL_MODE_NEON=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_EXTABLE_SORT=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 CONFIG_CROSS_COMPILE="" # CONFIG_COMPILE_TEST is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y CONFIG_FHANDLE=y # CONFIG_AUDIT is not set # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_IRQ_DOMAIN=y # CONFIG_IRQ_DOMAIN_DEBUG is not set CONFIG_SPARSE_IRQ=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_TASKSTATS is not set # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_PREEMPT_RCU is not set CONFIG_RCU_STALL_COMMON=y # CONFIG_RCU_USER_QS is not set CONFIG_RCU_FANOUT=64 CONFIG_RCU_FANOUT_LEAF=16 # CONFIG_RCU_FANOUT_EXACT is not set # CONFIG_RCU_FAST_NO_HZ is not set CONFIG_TREE_RCU_TRACE=y # CONFIG_RCU_NOCB_CPU is not set CONFIG_IKCONFIG=m CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=17 CONFIG_GENERIC_SCHED_CLOCK=y CONFIG_CGROUPS=y # CONFIG_CGROUP_DEBUG is not set CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_DEVICE=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_CPUACCT=y CONFIG_RESOURCE_COUNTERS=y CONFIG_MEMCG=y CONFIG_MEMCG_SWAP=y CONFIG_MEMCG_SWAP_ENABLED=y CONFIG_MEMCG_KMEM=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y # CONFIG_CFS_BANDWIDTH is not set # CONFIG_RT_GROUP_SCHED is not set CONFIG_BLK_CGROUP=y # CONFIG_DEBUG_BLK_CGROUP is not set # CONFIG_CHECKPOINT_RESTORE is not set CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_SCHED_AUTOGROUP is not set CONFIG_MM_OWNER=y # CONFIG_SYSFS_DEPRECATED is not set # CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE=" " CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 # CONFIG_RD_GZIP is not set # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set # CONFIG_RD_XZ is not set CONFIG_RD_LZO=y # CONFIG_RD_LZ4 is not set CONFIG_INITRAMFS_COMPRESSION_NONE=y # CONFIG_INITRAMFS_COMPRESSION_LZO is not set # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_SYSCTL=y CONFIG_ANON_INODES=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_EXPERT=y CONFIG_UID16=y # CONFIG_SYSCTL_SYSCALL is not set CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y CONFIG_PERF_USE_VMALLOC=y # # Kernel Performance Events And Counters # # CONFIG_PERF_EVENTS is not set CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLUB_DEBUG=y # CONFIG_COMPAT_BRK is not set # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_SYSTEM_TRUSTED_KEYRING is not set # CONFIG_PROFILING is not set CONFIG_TRACEPOINTS=y CONFIG_JUMP_LABEL=y # CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_ATTRS=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_HAVE_CLK=y CONFIG_HAVE_DMA_API_DEBUG=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y # CONFIG_CC_STACKPROTECTOR is not set CONFIG_HAVE_CONTEXT_TRACKING=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=18 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_HAVE_GENERIC_DMA_COHERENT=y CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set CONFIG_STOP_MACHINE=y CONFIG_BLOCK=y CONFIG_BLK_DEV_BSG=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_CMDLINE_PARSER is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set CONFIG_LDM_PARTITION=y # CONFIG_LDM_DEBUG is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set CONFIG_BLOCK_COMPAT=y # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y # CONFIG_CFQ_GROUP_IOSCHED is not set # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set CONFIG_DEFAULT_NOOP=y CONFIG_DEFAULT_IOSCHED="noop" CONFIG_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_INLINE_READ_UNLOCK=y CONFIG_INLINE_READ_UNLOCK_IRQ=y CONFIG_INLINE_WRITE_UNLOCK=y CONFIG_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_FREEZER=y # # Platform selection # # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_XGENE is not set CONFIG_ARCH_MESON64_ODROIDC2=y # # Bus support # CONFIG_ARM_AMBA=y # # ARM errata workarounds via the alternatives framework # CONFIG_ARM64_ERRATUM_845719=y # CONFIG_ARM64_ERRATUM_843419 is not set CONFIG_ARM64_ERRATUM_835769=y # # Kernel Features # # CONFIG_ARM64_64K_PAGES is not set # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_SMP=y CONFIG_SCHED_MC=y # CONFIG_SCHED_SMT is not set # CONFIG_DISABLE_CPU_SCHED_DOMAIN_BALANCE is not set CONFIG_SCHED_HMP=y # CONFIG_SCHED_HMP_PRIO_FILTER is not set CONFIG_HMP_FAST_CPU_MASK="" CONFIG_HMP_SLOW_CPU_MASK="" CONFIG_HMP_VARIABLE_SCALE=y CONFIG_HMP_FREQUENCY_INVARIANT_SCALE=y # CONFIG_SCHED_HMP_LITTLE_PACKING is not set CONFIG_NR_CPUS=8 CONFIG_HOTPLUG_CPU=y CONFIG_SWP_EMULATE=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set CONFIG_HZ=100 CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_HAVE_ARCH_PFN_VALID=y CONFIG_ARMV7_COMPAT=y CONFIG_ARMV7_COMPAT_CPUINFO=y CONFIG_SYS_SUPPORTS_HUGETLBFS=y CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SPARSEMEM_MANUAL=y CONFIG_SPARSEMEM=y CONFIG_HAVE_MEMORY_PRESENT=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_MEMBLOCK=y CONFIG_NO_BOOTMEM=y CONFIG_MEMORY_ISOLATION=y # CONFIG_HAVE_BOOTMEM_INFO_NODE is not set CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_COMPACTION=y CONFIG_MIGRATION=y CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_ZONE_DMA_FLAG=0 # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 # CONFIG_TRANSPARENT_HUGEPAGE is not set CONFIG_CROSS_MEMORY_ATTACH=y CONFIG_CLEANCACHE=y CONFIG_FRONTSWAP=y CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set CONFIG_CMA_AREAS=7 # CONFIG_ZBUD is not set # CONFIG_ZSWAP is not set CONFIG_ZSMALLOC=y # CONFIG_ZSMALLOC_STAT is not set CONFIG_PGTABLE_MAPPING=y CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_KEXEC is not set # CONFIG_CRASH_DUMP is not set # CONFIG_XEN is not set CONFIG_FORCE_MAX_ZONEORDER=11 # CONFIG_SECCOMP is not set # # Boot options # CONFIG_CMDLINE="console=tty0 systemd.show_status=auto" # CONFIG_CMDLINE_FROM_BOOTLOADER is not set CONFIG_CMDLINE_EXTEND=y # CONFIG_CMDLINE_FORCE is not set # CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE is not set # # Userspace binary formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y # CONFIG_HAVE_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_COREDUMP=y CONFIG_COMPAT=y CONFIG_SYSVIPC_COMPAT=y CONFIG_KEYS_COMPAT=y # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y CONFIG_HAS_WAKELOCK=y CONFIG_HAS_EARLYSUSPEND=y CONFIG_WAKELOCK=y CONFIG_WAKELOCK_STAT=y CONFIG_USER_WAKELOCK=y CONFIG_EARLYSUSPEND=y CONFIG_FORCE_POWER_ON_STATE_AFTER_RESUME=y CONFIG_NO_USER_SPACE_SCREEN_ACCESS_CONTROL=y # CONFIG_CONSOLE_EARLYSUSPEND is not set # CONFIG_FB_EARLYSUSPEND is not set CONFIG_HIBERNATE_CALLBACKS=y CONFIG_HIBERNATION=y CONFIG_PM_STD_PARTITION="" CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set # CONFIG_PM_RUNTIME is not set CONFIG_PM=y # CONFIG_PM_DEBUG is not set CONFIG_ARCH_HAS_OPP=y CONFIG_PM_OPP=y CONFIG_PM_CLK=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_CPU_PM=y # CONFIG_SUSPEND_TIME is not set # CONFIG_MK_SNAPSHOT_ONLY is not set # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_STAT_DETAILS is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_DEFAULT_GOV_HOTPLUG is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_GOV_USERSPACE is not set CONFIG_CPU_FREQ_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_GOV_HOTPLUG is not set # CONFIG_CPU_FREQ_GOV_INTERACTIVE is not set # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set # CONFIG_GENERIC_CPUFREQ_CPU0 is not set # # ARM CPU frequency scaling drivers # CONFIG_ARM_BIG_LITTLE_CPUFREQ=y # CONFIG_ARM_DT_BL_CPUFREQ is not set CONFIG_ARM_SCPI_CPUFREQ=y # CONFIG_ARM_KIRKWOOD_CPUFREQ is not set CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARM64_CPU_SUSPEND=y # # CPU Power Management # # # CPU Idle # # CONFIG_CPU_IDLE is not set # CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y # CONFIG_UNIX_DIAG is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=m # CONFIG_XFRM_USER is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_NET_KEY=m # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=m CONFIG_IP_MROUTE=y # CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set # CONFIG_IP_PIMSM_V1 is not set # CONFIG_IP_PIMSM_V2 is not set # CONFIG_SYN_COOKIES is not set # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_INET_XFRM_TUNNEL is not set CONFIG_INET_TUNNEL=m # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set CONFIG_INET_LRO=y # CONFIG_INET_DIAG is not set CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set CONFIG_TCP_CONG_CUBIC=y # CONFIG_TCP_CONG_WESTWOOD is not set CONFIG_TCP_CONG_HTCP=m CONFIG_TCP_CONG_HSTCP=m # CONFIG_TCP_CONG_HYBLA is not set CONFIG_TCP_CONG_VEGAS=m CONFIG_TCP_CONG_SCALABLE=m # CONFIG_TCP_CONG_LP is not set CONFIG_TCP_CONG_VENO=m CONFIG_TCP_CONG_YEAH=m CONFIG_TCP_CONG_ILLINOIS=m CONFIG_DEFAULT_CUBIC=y # CONFIG_DEFAULT_RENO is not set CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set # CONFIG_INET6_XFRM_MODE_TRANSPORT is not set # CONFIG_INET6_XFRM_MODE_TUNNEL is not set # CONFIG_INET6_XFRM_MODE_BEET is not set # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_GRE is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_ANDROID_PARANOID_NETWORK is not set # CONFIG_NET_ACTIVITY_STATS is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=m # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set CONFIG_NETFILTER_NETLINK_LOG=m CONFIG_NF_CONNTRACK=m # CONFIG_NF_CONNTRACK_MARK is not set # CONFIG_NF_CONNTRACK_PROCFS is not set # CONFIG_NF_CONNTRACK_EVENTS is not set # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CT_PROTO_DCCP is not set # CONFIG_NF_CT_PROTO_SCTP is not set # CONFIG_NF_CT_PROTO_UDPLITE is not set # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set CONFIG_NF_CONNTRACK_IRC=m CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set CONFIG_NF_CONNTRACK_SIP=m # CONFIG_NF_CONNTRACK_TFTP is not set CONFIG_NF_CT_NETLINK=m # CONFIG_NF_CT_NETLINK_TIMEOUT is not set CONFIG_NF_NAT=m CONFIG_NF_NAT_NEEDED=y # CONFIG_NF_NAT_AMANDA is not set CONFIG_NF_NAT_FTP=m CONFIG_NF_NAT_IRC=m CONFIG_NF_NAT_SIP=m # CONFIG_NF_NAT_TFTP is not set # CONFIG_NF_TABLES is not set CONFIG_NETFILTER_XTABLES=m # # Xtables combined modules # # CONFIG_NETFILTER_XT_MARK is not set # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set # CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set CONFIG_NETFILTER_XT_MATCH_IPRANGE=m # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set CONFIG_NETFILTER_XT_MATCH_OWNER=m # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA2 is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set CONFIG_NETFILTER_XT_MATCH_STATE=m # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # CONFIG_IP_SET is not set # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m CONFIG_NF_CONNTRACK_IPV4=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set # CONFIG_IP_NF_TARGET_ULOG is not set CONFIG_NF_NAT_IPV4=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set # CONFIG_IP_NF_TARGET_REDIRECT is not set # CONFIG_NF_NAT_PPTP is not set # CONFIG_NF_NAT_H323 is not set # CONFIG_IP_NF_MANGLE is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_ARPTABLES is not set # # IPv6: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV6=m CONFIG_NF_CONNTRACK_IPV6=m CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RT is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set # CONFIG_IP6_NF_MANGLE is not set # CONFIG_IP6_NF_RAW is not set CONFIG_NF_NAT_IPV6=m # CONFIG_IP6_NF_TARGET_MASQUERADE is not set # CONFIG_IP6_NF_TARGET_NPT is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y # CONFIG_BRIDGE_VLAN_FILTERING is not set CONFIG_HAVE_NET_DSA=y CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set # CONFIG_DECNET is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_IEEE802154 is not set CONFIG_6LOWPAN_IPHC=m CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set CONFIG_NET_SCH_FQ_CODEL=y # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # # Classification # # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_TCINDEX is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_RSVP is not set # CONFIG_NET_CLS_RSVP6 is not set # CONFIG_NET_CLS_FLOW is not set # CONFIG_NET_CLS_CGROUP is not set # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_MMAP is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_NET_MPLS_GSO is not set # CONFIG_HSR is not set CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_XPS=y CONFIG_CGROUP_NET_PRIO=y # CONFIG_CGROUP_NET_CLASSID is not set CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set CONFIG_BT=m CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y CONFIG_BT_BNEP=m CONFIG_BT_BNEP_MC_FILTER=y CONFIG_BT_BNEP_PROTO_FILTER=y CONFIG_BT_HIDP=m # # Bluetooth device drivers # CONFIG_BT_HCIBTUSB=m CONFIG_BT_HCIBTSDIO=m CONFIG_BT_HCIUART=m CONFIG_BT_HCIUART_H4=y CONFIG_BT_HCIUART_BCSP=y CONFIG_BT_HCIUART_ATH3K=y CONFIG_BT_HCIUART_LL=y CONFIG_BT_HCIUART_3WIRE=y CONFIG_BT_HCIBCM203X=m CONFIG_BT_HCIBPA10X=m CONFIG_BT_HCIBFUSB=m # CONFIG_BT_HCIVHCI is not set CONFIG_BT_MRVL=m CONFIG_BT_MRVL_SDIO=m CONFIG_BT_ATH3K=m # CONFIG_AF_RXRPC is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_REG_DEBUG is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set # CONFIG_CFG80211_DEFAULT_PS is not set # CONFIG_CFG80211_DEBUGFS is not set # CONFIG_CFG80211_INTERNAL_REGDB is not set CONFIG_CFG80211_WEXT=y # CONFIG_LIB80211 is not set CONFIG_MAC80211=m CONFIG_MAC80211_HAS_RC=y # CONFIG_MAC80211_RC_PID is not set CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_MINSTREL_HT=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set # CONFIG_WIMAX is not set CONFIG_RFKILL=y CONFIG_RFKILL_PM=y CONFIG_RFKILL_LEDS=y # CONFIG_RFKILL_INPUT is not set # CONFIG_RFKILL_REGULATOR is not set # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # # Device Drivers # # # Amlogic Device Drivers # CONFIG_MESON_TIMER=y # CONFIG_MESON_LOCAL_TIMER is not set CONFIG_MESON_BC_TIMER=y CONFIG_AM_UART=y CONFIG_SERIAL_MESON_CONSOLE=y # CONFIG_PRINTK_NOBLOCK_MODE is not set CONFIG_AML_CPU_VERSION=y CONFIG_AML_MESON64_VERSION=y # CONFIG_AML_M8_VERSION is not set CONFIG_AMLOGIC_IOMAP=y CONFIG_PINCTRL_AMLOGIC=y # # USB Support # CONFIG_AMLOGIC_USB=y CONFIG_USB_DWC_OTG_HCD=m CONFIG_USB_HOST_ELECT_TEST=y # # I2C Hardware Bus support # CONFIG_I2C_AML=y # CONFIG_I2C_SLAVE_AML is not set # CONFIG_I2C_SW_AML is not set # CONFIG_BCM2079X_I2C is not set CONFIG_AMLOGIC_PWM=y CONFIG_PWM_MESON=y # # HDMI TX Support # CONFIG_AML_HDMI_TX=y CONFIG_AML_HDMI_TX_20=y # CONFIG_AML_HDMI_TX_14 is not set # CONFIG_AML_RTC is not set CONFIG_AML_VRTC=y # CONFIG_AM_IRBLASTER is not set # CONFIG_AML_DEBUG is not set CONFIG_AML_REG_ACCESS=y # # Power Management Support # # CONFIG_AML_POWER_SUPPORT is not set # CONFIG_AML_PMU_ALGORITHM_SUPPORT is not set CONFIG_AML_PMU4=y # # Ethernet Support # # CONFIG_AM_PHY is not set CONFIG_PHYLIB=y # # MMC/SD/SDIO Host Controller Drivers # # # Multimedia Card support # CONFIG_MMC_AML=y # CONFIG_MMC_AML_DEBUG is not set # CONFIG_AML_MMC_DEBUG_FORCE_SINGLE_BLOCK_RW is not set # # Amlogic VPU Drivers # # # Amlogic VPU Driver # CONFIG_AML_VPU=y # CONFIG_AML_VPU_DYNAMIC_ADJ is not set # # ION support # CONFIG_AMLOGIC_ION=y # # Amlogic Display Driver # CONFIG_AML_DISPLAY=y # # Amlogic VOUT Module # CONFIG_AM_VOUT=y CONFIG_AM_TV_OUTPUT=y CONFIG_AML_VOUT_FRAMERATE_AUTOMATION=y # CONFIG_AML_VOUT_CC_BYPASS is not set # CONFIG_AML_VDAC_HW_SWITCH is not set CONFIG_AML_WSS=y # # Amlogic OSD Module # CONFIG_AM_FB=y CONFIG_FB_OSD_SUPPORT_SYNC_FENCE=y CONFIG_FB_OSD_VSYNC_RDMA=y CONFIG_FB_OSD2_ENABLE=y CONFIG_FB_OSD2_CURSOR=y # # Amlogic VOUT2 Module # # CONFIG_AM_VOUT2 is not set # CONFIG_AM_TV_OUTPUT2 is not set # # Amlogic OSD_EXT Module # # CONFIG_AM_FB_EXT is not set # # Amlogic GE2D Module # CONFIG_AM_GE2D=y # CONFIG_AM_GE2D_MORE_SECURITY is not set CONFIG_AM_LOGO=y # # Amlogic LCD Output Module # # CONFIG_AML_LCD is not set # # Amlogic Backlight Support # # CONFIG_AML_BACKLIGHT is not set CONFIG_AMLOGIC_LED=m CONFIG_AML_LED_SYS=m CONFIG_AML_LED_PWM=m CONFIG_AML_LED_TRIGGER_BREATHE=m CONFIG_AML_LED_TRIGGER_SCPI=m CONFIG_AML_LED_TRIGGER_SCPISTOP=m CONFIG_AML_LED_TRIGGER_DISTURB=m # # Canvas management driver # CONFIG_AML_CANVAS=y CONFIG_AMLOGIC_CLK=y CONFIG_AMLOGIC_SEC=y # CONFIG_AML_SERR is not set CONFIG_AMLOGIC_SECURITY_KEY=y CONFIG_AM_PTSSERVER=y # CONFIG_H264_4K2K_SINGLE_CORE is not set CONFIG_VSYNC_RDMA=y # CONFIG_TVIN_VIUIN is not set CONFIG_AM_VIDEO=y # CONFIG_AM_VIDEO2 is not set # CONFIG_SUPPORT_VIDEO_ON_VPP2 is not set CONFIG_GE2D_KEEP_FRAME=y # # Video Decoders # # CONFIG_MULTI_DEC is not set CONFIG_AM_VDEC_MPEG12=y CONFIG_AM_VDEC_MPEG4=y # CONFIG_AM_VDEC_MMPEG4 is not set CONFIG_AM_VDEC_VC1=y CONFIG_AM_VDEC_H264=y # CONFIG_AM_VDEC_MH264 is not set CONFIG_AM_VDEC_H264MVC=y CONFIG_AM_VDEC_H264_4K2K=y CONFIG_AM_VDEC_H265=y CONFIG_AM_VDEC_VP9=y CONFIG_AM_VDEC_MJPEG=y # CONFIG_AM_ENCODER is not set # CONFIG_AM_JPEG_ENCODER is not set # CONFIG_AM_PIC_DEC is not set CONFIG_AM_VDEC_REAL=y CONFIG_AM_VDEC_AVS=y # CONFIG_AM_JPEGDEC is not set CONFIG_AM_TIMESYNC=y CONFIG_AM_STREAMING=y CONFIG_AM_SUBTITLE=y CONFIG_AM_VIDEOCAPTURE=y # CONFIG_AM_HEVCENC is not set # # Deinterlace driver # CONFIG_DEINTERLACE=y # CONFIG_AM_DEINTERLACE_SD_ONLY is not set CONFIG_AML_VFM=y # # EFUSE Support # CONFIG_EFUSE=y # CONFIG_EFUSE_WRITE_VERSION_PERMIT is not set # # key management Support # CONFIG_KEY_MANAGE=y # # Audio Interface # CONFIG_AMAUDIO=y # # Amlogic Audio Interface V2 # CONFIG_AMAUDIO2=y # # Audio dsp process # CONFIG_AML_AUDIO_DSP=y # # Post Process Manager driver # CONFIG_POST_PROCESS_MANAGER=y CONFIG_POST_PROCESS_MANAGER_PPSCALER=y # CONFIG_POST_PROCESS_MANAGER_3D_PROCESS is not set # # Amlogic Wifi Driver # CONFIG_AM_WIFI=y CONFIG_BCMDHD_USE_STATIC_BUF=y # CONFIG_RTL8189ES is not set # CONFIG_RTL8189FS is not set # CONFIG_RTL8192EU is not set # CONFIG_RTL8723AU is not set # CONFIG_RTL8723BS is not set # CONFIG_RTL8821AU is not set # CONFIG_RTL8812AU is not set # CONFIG_RTL8192CU is not set # CONFIG_RTL8192DU is not set # CONFIG_RTL8188EU is not set # CONFIG_RTL8822BU is not set # CONFIG_BCMDHD is not set CONFIG_AML_POWER_RESET=y # CONFIG_M8_POWER_RESET is not set CONFIG_GXBB_POWER_RESET=y # # Amlogic Bt Rfkill Driver # CONFIG_BT_DEVICE=y # CONFIG_BLUESLEEP is not set # # Amlogic ion video support # # CONFIG_VIDEOBUF2_ION is not set # CONFIG_AMLOGIC_IONVIDEO is not set # # V4L2 Video Support # CONFIG_V4L_AMLOGIC_VIDEO=m # CONFIG_V4L_AMLOGIC_VIDEO2 is not set # # Amlogic TVIN Drivers # CONFIG_TVIN=y # CONFIG_TVIN_VDIN is not set # CONFIG_TVIN_AFE is not set CONFIG_TVIN_HDMI=y # CONFIG_TVIN_HDMI_CEC is not set # CONFIG_TVIN_HDMI_EXT is not set # CONFIG_TVIN_BT656 is not set # CONFIG_VIUIN is not set # CONFIG_TVIN_ISP is not set # # Amlogic VECM Drivers # # # Amlogic amvecm Driver # CONFIG_AM_VECM=y CONFIG_AML_NAND=y CONFIG_AML_NEXT_GEN_NAND=y CONFIG_AML_NFTL_NEW=y CONFIG_AML_NAND_KEY=y # CONFIG_SECURE_NAND is not set CONFIG_AM_INPUT=y CONFIG_AM_SARADC=y CONFIG_MESON_NEW_INPUT_REMOTE=y CONFIG_NEW_AM_REMOTE=m CONFIG_MESON_INPUT_KEYBOARD=y # CONFIG_ADC_KEYPADS_AM is not set CONFIG_AML_GPIO_KEY=y # CONFIG_SENSOR_DEVICES is not set # CONFIG_AMLOGIC_AVIN_DETECT is not set # CONFIG_AMLOGIC_MESON_CPUFREQ is not set CONFIG_AMLOGIC_SCPI_CPUFREQ=y CONFIG_MESON_SUSPEND=y # CONFIG_M8M2_SUSPEND is not set CONFIG_GXBB_SUSPEND=y # # AVL6862 dvb driver # CONFIG_AVL6862=m # # WeTek Play driver # CONFIG_WETEK=m # # MESON MHU mailbox Support # CONFIG_MESON_MHU_MBOX=y CONFIG_ARM_SCPI_PROTOCOL=y # # RDMA management driver # CONFIG_AML_RDMA=y # # Amlogic temperature sensor # CONFIG_AML_TEMP_SENSOR=y # CONFIG_AUDIO_DATA is not set CONFIG_INSTABOOT=y # CONFIG_INSTABOOT_MEM_MG is not set # # Amlogic Camera Support # # CONFIG_VIDEO_AMLOGIC_CAPTURE is not set CONFIG_AML_CODEC_MM=y # CONFIG_AML_WDT is not set # # AMLOGIC SPI Hardware bus support # CONFIG_AMLOGIC_SPICC_MASTER=y # CONFIG_AMLOGIC_JTAG is not set CONFIG_AMLOGIC_CPU_INFO=y # # defend img file update support # # CONFIG_DEFEND_IMG is not set # # AO CEC Support # CONFIG_AML_AO_CEC=y # # Amlogic Crypto Support # # CONFIG_CRYPTO_AML is not set # # ESM Support # # CONFIG_AML_ESM is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/mdev" CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" CONFIG_FW_LOADER_USER_HELPER=y # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_SYS_HYPERVISOR is not set # CONFIG_GENERIC_CPU_DEVICES is not set CONFIG_HAVE_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_DMA_SHARED_BUFFER=y CONFIG_DMA_CMA=y # # Default contiguous memory area size: # CONFIG_CMA_SIZE_MBYTES=8 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 # # Bus devices # # CONFIG_CONNECTOR is not set CONFIG_MTD=y # CONFIG_MTD_TESTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set # CONFIG_MTD_CMDLINE_PARTS is not set CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AR7_PARTS is not set # # User Modules And Translation Layers # CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # CONFIG_RFD_FTL is not set # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set # CONFIG_MTD_OOPS is not set # CONFIG_MTD_SWAP is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_CFI_I4 is not set # CONFIG_MTD_CFI_I8 is not set # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_PLATRAM is not set # # Self-contained MTD device drivers # # CONFIG_MTD_DATAFLASH is not set # CONFIG_MTD_M25P80 is not set # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLOCK2MTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOCG3 is not set CONFIG_MTD_NAND_IDS=y CONFIG_MTD_NAND_ECC=y # CONFIG_MTD_NAND_ECC_SMC is not set CONFIG_MTD_NAND=y # CONFIG_MTD_NAND_ECC_BCH is not set # CONFIG_MTD_SM_COMMON is not set # CONFIG_MTD_NAND_DENALI is not set # CONFIG_MTD_NAND_GPIO is not set # CONFIG_MTD_NAND_DISKONCHIP is not set # CONFIG_MTD_NAND_DOCG4 is not set # CONFIG_MTD_NAND_NANDSIM is not set # CONFIG_MTD_NAND_PLATFORM is not set # CONFIG_MTD_ONENAND is not set # # LPDDR flash memory drivers # # CONFIG_MTD_LPDDR is not set CONFIG_MTD_UBI=y CONFIG_MTD_UBI_WL_THRESHOLD=4096 CONFIG_MTD_UBI_BEB_LIMIT=20 # CONFIG_MTD_UBI_FASTMAP is not set # CONFIG_MTD_UBI_GLUEBI is not set CONFIG_DTC=y CONFIG_OF=y # # Device Tree and Open Firmware support # CONFIG_PROC_DEVICETREE=y # CONFIG_OF_SELFTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_NET=y CONFIG_OF_MDIO=y CONFIG_OF_MTD=y CONFIG_OF_RESERVED_MEM=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_ZRAM=y # CONFIG_ZRAM_DEBUG is not set # CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_RAM is not set # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set CONFIG_VIRTIO_BLK=y # CONFIG_BLK_DEV_RBD is not set # # Misc devices # # CONFIG_SENSORS_LIS3LV02D is not set # CONFIG_AD525X_DPOT is not set # CONFIG_ATMEL_PWM is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_ICS932S401 is not set # CONFIG_ATMEL_SSC is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1780 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_TI_DAC7512 is not set # CONFIG_UID_STAT is not set # CONFIG_BMP085_I2C is not set # CONFIG_BMP085_SPI is not set # CONFIG_USB_SWITCH_FSA9480 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # # Altera FPGA firmware download module # # CONFIG_ALTERA_STAPL is not set # # Intel MIC Host Driver # # # Intel MIC Card Driver # # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_TGT is not set # CONFIG_SCSI_NETLINK is not set # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set # CONFIG_CHR_DEV_OSST is not set CONFIG_BLK_DEV_SR=m # CONFIG_BLK_DEV_SR_VENDOR is not set # CONFIG_CHR_DEV_SG is not set # CONFIG_CHR_DEV_SCH is not set CONFIG_SCSI_MULTI_LUN=y # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_SCAN_ASYNC is not set # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_LIBFC is not set # CONFIG_LIBFCOE is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_VIRTIO is not set # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set # CONFIG_SCSI_DH is not set # CONFIG_SCSI_OSD_INITIATOR is not set CONFIG_HAVE_PATA_PLATFORM=y # CONFIG_ATA is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=m CONFIG_DM_CRYPT=m CONFIG_DM_SNAPSHOT=m # CONFIG_DM_THIN_PROVISIONING is not set # CONFIG_DM_CACHE is not set # CONFIG_DM_MIRROR is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_UEVENT is not set # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_TARGET_CORE is not set CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set # CONFIG_EQUALIZER is not set # CONFIG_NET_TEAM is not set CONFIG_MACVLAN=m # CONFIG_MACVTAP is not set CONFIG_VXLAN=m CONFIG_NETCONSOLE=y CONFIG_NETCONSOLE_DYNAMIC=y CONFIG_NETPOLL=y # CONFIG_NETPOLL_TRAP is not set CONFIG_NET_POLL_CONTROLLER=y CONFIG_TUN=y CONFIG_VETH=m # CONFIG_VIRTIO_NET is not set # CONFIG_NLMON is not set # # CAIF transport drivers # # # Distributed Switch Architecture drivers # # CONFIG_NET_DSA_MV88E6XXX is not set # CONFIG_NET_DSA_MV88E6060 is not set # CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set # CONFIG_NET_DSA_MV88E6131 is not set # CONFIG_NET_DSA_MV88E6123_61_65 is not set CONFIG_ETHERNET=y CONFIG_NET_VENDOR_ARC=y # CONFIG_ARC_EMAC is not set # CONFIG_NET_CADENCE is not set # CONFIG_NET_VENDOR_BROADCOM is not set # CONFIG_NET_CALXEDA_XGMAC is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_INTEL is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_ETHOC is not set # CONFIG_SH_ETH is not set # CONFIG_NET_VENDOR_SEEQ is not set # CONFIG_NET_VENDOR_SMSC is not set CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=y CONFIG_STMMAC_PLATFORM=y CONFIG_DWMAC_MESON=y # CONFIG_STMMAC_DEBUG_FS is not set # CONFIG_STMMAC_DA is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # # MII PHY device drivers # CONFIG_AMLOGIC_PHY=y # CONFIG_AT803X_PHY is not set # CONFIG_AMD_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_QSEMI_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_SMSC_PHY is not set # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM87XX_PHY is not set CONFIG_ICPLUS_PHY=y CONFIG_REALTEK_PHY=y # CONFIG_NATIONAL_PHY is not set # CONFIG_STE10XP is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MICREL_PHY is not set # CONFIG_FIXED_PHY is not set # CONFIG_MDIO_BITBANG is not set # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # CONFIG_MICREL_KS8995MA is not set CONFIG_PPP=y CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set CONFIG_PPP_MPPE=m # CONFIG_PPP_MULTILINK is not set CONFIG_PPPOE=m CONFIG_PPPOLAC=y CONFIG_PPPOPNS=y CONFIG_PPP_ASYNC=m # CONFIG_PPP_SYNC_TTY is not set # CONFIG_SLIP is not set CONFIG_SLHC=y # # USB Network Adapters # # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set # CONFIG_USB_RTL8150 is not set # CONFIG_USB_RTL8152 is not set CONFIG_USB_USBNET=y CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m # CONFIG_USB_NET_CDC_EEM is not set # CONFIG_USB_NET_CDC_NCM is not set # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set CONFIG_USB_NET_DM9601=m # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=y # CONFIG_USB_NET_GL620A is not set # CONFIG_USB_NET_NET1080 is not set # CONFIG_USB_NET_PLUSB is not set CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m # CONFIG_USB_NET_CDC_SUBSET is not set # CONFIG_USB_NET_ZAURUS is not set # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set # CONFIG_USB_HSO is not set # CONFIG_USB_NET_INT51X1 is not set CONFIG_USB_IPHETH=m # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set CONFIG_WLAN=y # CONFIG_LIBERTAS_THINFIRM is not set # CONFIG_AT76C50X_USB is not set CONFIG_USB_ZD1201=m CONFIG_USB_NET_RNDIS_WLAN=m CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y # CONFIG_MAC80211_HWSIM is not set # CONFIG_WIFI_CONTROL_FUNC is not set CONFIG_ATH_COMMON=m CONFIG_ATH_CARDS=m # CONFIG_ATH_DEBUG is not set CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m CONFIG_ATH9K_AHB=y # CONFIG_ATH9K_DEBUGFS is not set # CONFIG_ATH9K_WOW is not set # CONFIG_ATH9K_LEGACY_RATE_CONTROL is not set CONFIG_ATH9K_RFKILL=y CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y CONFIG_CARL9170_HWRNG=y CONFIG_ATH6KL=m # CONFIG_ATH6KL_SDIO is not set CONFIG_ATH6KL_USB=m # CONFIG_ATH6KL_DEBUG is not set # CONFIG_ATH6KL_TRACING is not set CONFIG_AR5523=m # CONFIG_ATH10K is not set # CONFIG_WCN36XX is not set CONFIG_B43=m CONFIG_B43_SSB=y # CONFIG_B43_SDIO is not set CONFIG_B43_PIO=y CONFIG_B43_PHY_N=y CONFIG_B43_PHY_LP=y CONFIG_B43_LEDS=y CONFIG_B43_HWRNG=y # CONFIG_B43_DEBUG is not set # CONFIG_B43LEGACY is not set CONFIG_BRCMUTIL=m # CONFIG_BRCMSMAC is not set CONFIG_BRCMFMAC=m # CONFIG_BRCMFMAC_SDIO is not set CONFIG_BRCMFMAC_USB=y # CONFIG_BRCM_TRACING is not set # CONFIG_BRCMDBG is not set # CONFIG_HOSTAP is not set # CONFIG_LIBERTAS is not set CONFIG_P54_COMMON=m CONFIG_P54_USB=m # CONFIG_P54_SPI is not set CONFIG_P54_LEDS=y CONFIG_RT2X00=m CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_RTL_CARDS=m # CONFIG_WL_TI is not set CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set # CONFIG_MWIFIEX is not set # CONFIG_CW1200 is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_POLLDEV is not set # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y # CONFIG_INPUT_MOUSEDEV_PSAUX is not set CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # CONFIG_INPUT_KEYRESET is not set # CONFIG_INPUT_KEYCOMBO is not set # # Input Device Drivers # # CONFIG_INPUT_KEYBOARD is not set # CONFIG_INPUT_MOUSE is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set # CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_ADS7846=m # CONFIG_TOUCHSCREEN_AD7877 is not set # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set CONFIG_TOUCHSCREEN_EGALAX=m # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set # CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WM97XX is not set CONFIG_TOUCHSCREEN_USB_COMPOSITE=m CONFIG_TOUCHSCREEN_USB_EGALAX=y CONFIG_TOUCHSCREEN_USB_PANJIT=y CONFIG_TOUCHSCREEN_USB_3M=y CONFIG_TOUCHSCREEN_USB_ITM=y CONFIG_TOUCHSCREEN_USB_ETURBO=y CONFIG_TOUCHSCREEN_USB_GUNZE=y CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y CONFIG_TOUCHSCREEN_USB_IRTOUCH=y CONFIG_TOUCHSCREEN_USB_IDEALTEK=y CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y CONFIG_TOUCHSCREEN_USB_GOTOP=y CONFIG_TOUCHSCREEN_USB_JASTEC=y CONFIG_TOUCHSCREEN_USB_ELO=y CONFIG_TOUCHSCREEN_USB_E2I=y CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y CONFIG_TOUCHSCREEN_USB_NEXIO=y CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2005 is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_W90X900 is not set CONFIG_TOUCHSCREEN_ST1232=m # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set CONFIG_TOUCHSCREEN_DWAV_USB_MT=m CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_MPU3050 is not set # CONFIG_INPUT_GP2A is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_TILT_POLLED is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYCHORD is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set CONFIG_INPUT_UINPUT=y CONFIG_INPUT_GPIO=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_CMA3000 is not set # # Hardware I/O ports # # CONFIG_SERIO is not set # CONFIG_GAMEPORT is not set # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y CONFIG_DEVPTS_MULTIPLE_INSTANCES=y # CONFIG_LEGACY_PTYS is not set # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_TRACE_SINK is not set CONFIG_DEVMEM=y CONFIG_DEVKMEM=y # # Serial drivers # # CONFIG_SERIAL_8250 is not set # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set # CONFIG_SERIAL_AMBA_PL011 is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_TIMBERDALE is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_IFX6X60 is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SUPPORT_SYSRQ is not set CONFIG_TTY_PRINTK=y # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_ATMEL is not set CONFIG_HW_RANDOM_MESON=y # CONFIG_HW_RANDOM_VIRTIO is not set # CONFIG_HW_RANDOM_EXYNOS is not set # CONFIG_R3964 is not set # # PCMCIA character devices # # CONFIG_RAW_DRIVER is not set # CONFIG_TCG_TPM is not set CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set # CONFIG_I2C_MUX_PINCTRL is not set CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CBUS_GPIO is not set # CONFIG_I2C_DESIGNWARE_PLATFORM is not set CONFIG_I2C_GPIO=y # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_PXA_PCI is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_STUB is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set CONFIG_SPI_BITBANG=y CONFIG_SPI_GPIO=y # CONFIG_SPI_FSL_SPI is not set # CONFIG_SPI_OC_TINY is not set # CONFIG_SPI_PL022 is not set # CONFIG_SPI_PXA2XX_PCI is not set # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_DESIGNWARE is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=y # CONFIG_SPI_TLE62X0 is not set # CONFIG_HSI is not set # # PPS support # CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # CONFIG_PINCTRL=y # # Pin controllers # CONFIG_PINMUX=y CONFIG_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_CAPRI is not set # CONFIG_PINCTRL_MSM8X74 is not set # CONFIG_PINCTRL_SINGLE is not set CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y CONFIG_ARCH_REQUIRE_GPIOLIB=y CONFIG_GPIOLIB=y CONFIG_GPIO_DEVRES=y CONFIG_OF_GPIO=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y # # Memory mapped GPIO drivers: # # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_PL061 is not set # CONFIG_GPIO_SCH311X is not set # CONFIG_GPIO_TS5500 is not set # CONFIG_GPIO_GRGPIO is not set # # I2C GPIO expanders: # # CONFIG_GPIO_MAX7300 is not set # CONFIG_GPIO_MAX732X is not set # CONFIG_GPIO_PCA953X is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_SX150X is not set # CONFIG_GPIO_ADP5588 is not set # CONFIG_GPIO_ADNP is not set # # PCI GPIO expanders: # # # SPI GPIO expanders: # # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MCP23S08 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_74X164 is not set # # AC97 GPIO expanders: # # # LPC GPIO expanders: # # # MODULbus GPIO expanders: # # CONFIG_GPIO_BCM_KONA is not set # # USB GPIO expanders: # # CONFIG_W1 is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SBS is not set # CONFIG_BATTERY_BQ27x00 is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_SMB347 is not set CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_GPIO is not set CONFIG_POWER_RESET_VEXPRESS=y # CONFIG_POWER_RESET_XGENE is not set # CONFIG_POWER_AVS is not set CONFIG_HWMON=y # CONFIG_HWMON_VID is not set # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_GPIO_FAN is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_HTU21 is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH56XX_COMMON is not set # CONFIG_SENSORS_ADS1015 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_VEXPRESS is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y CONFIG_THERMAL_WRITABLE_TRIPS=y # CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE is not set # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR=y # CONFIG_THERMAL_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_GOV_STEP_WISE is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y CONFIG_CPU_THERMAL=y CONFIG_DEVFREQ_THERMAL=y CONFIG_CPUCORE_THERMAL=y CONFIG_GPU_THERMAL=y CONFIG_GPUCORE_THERMAL=y # CONFIG_THERMAL_EMULATION is not set # # Texas Instruments thermal drivers # # CONFIG_WATCHDOG is not set CONFIG_SSB_POSSIBLE=y # # Sonics Silicon Backplane # CONFIG_SSB=m CONFIG_SSB_BLOCKIO=y CONFIG_SSB_SDIOHOST_POSSIBLE=y # CONFIG_SSB_SDIOHOST is not set # CONFIG_SSB_SILENT is not set # CONFIG_SSB_DEBUG is not set # CONFIG_SSB_DRIVER_GPIO is not set CONFIG_BCMA_POSSIBLE=y # # Broadcom specific AMBA # # CONFIG_BCMA is not set # # Multifunction device drivers # # CONFIG_MFD_CORE is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_CROS_EC is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_UCB1400_CORE is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SMSC is not set # CONFIG_ABX500_CORE is not set # CONFIG_MFD_STMPE is not set # CONFIG_MFD_SYSCON is not set # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_MFD_TPS80031 is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TC3589X is not set # CONFIG_MFD_TMIO is not set # CONFIG_MFD_ARIZONA_I2C is not set # CONFIG_MFD_ARIZONA_SPI is not set # CONFIG_MFD_WM8400 is not set # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set CONFIG_VEXPRESS_CONFIG=y CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set # CONFIG_REGULATOR_FIXED_VOLTAGE is not set # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_FAN53555 is not set # CONFIG_REGULATOR_GPIO is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_VEXPRESS is not set CONFIG_MEDIA_SUPPORT=m # # Multimedia core support # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y # CONFIG_MEDIA_RADIO_SUPPORT is not set CONFIG_MEDIA_RC_SUPPORT=y # CONFIG_MEDIA_CONTROLLER is not set CONFIG_VIDEO_DEV=m CONFIG_VIDEO_V4L2=m # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_VIDEO_TUNER=m CONFIG_VIDEOBUF_GEN=m CONFIG_VIDEOBUF_RESOURCE=m CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_VMALLOC=m CONFIG_DVB_CORE=m CONFIG_DVB_NET=y CONFIG_TTPCI_EEPROM=m CONFIG_DVB_MAX_ADAPTERS=8 # CONFIG_DVB_DYNAMIC_MINORS is not set # # Media drivers # CONFIG_RC_CORE=m CONFIG_RC_MAP=m CONFIG_RC_DECODERS=y CONFIG_LIRC=m CONFIG_IR_LIRC_CODEC=m CONFIG_IR_NEC_DECODER=m CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_SONY_DECODER=m CONFIG_IR_RC5_SZ_DECODER=m CONFIG_IR_SANYO_DECODER=m CONFIG_IR_MCE_KBD_DECODER=m CONFIG_RC_DEVICES=y CONFIG_RC_ATI_REMOTE=m CONFIG_IR_IMON=m CONFIG_IR_MCEUSB=m CONFIG_IR_MESON=m CONFIG_IR_REDRAT3=m CONFIG_IR_STREAMZAP=m CONFIG_IR_IGUANA=m CONFIG_IR_TTUSBIR=m # CONFIG_RC_LOOPBACK is not set CONFIG_IR_GPIO_CIR=m CONFIG_IR_GPIOPLUG_CIR=m CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # CONFIG_USB_VIDEO_CLASS=m CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y CONFIG_USB_GSPCA=m # CONFIG_USB_M5602 is not set # CONFIG_USB_STV06XX is not set # CONFIG_USB_GL860 is not set # CONFIG_USB_GSPCA_BENQ is not set # CONFIG_USB_GSPCA_CONEX is not set # CONFIG_USB_GSPCA_CPIA1 is not set # CONFIG_USB_GSPCA_ETOMS is not set # CONFIG_USB_GSPCA_FINEPIX is not set # CONFIG_USB_GSPCA_JEILINJ is not set # CONFIG_USB_GSPCA_JL2005BCD is not set # CONFIG_USB_GSPCA_KINECT is not set # CONFIG_USB_GSPCA_KONICA is not set # CONFIG_USB_GSPCA_MARS is not set # CONFIG_USB_GSPCA_MR97310A is not set # CONFIG_USB_GSPCA_NW80X is not set # CONFIG_USB_GSPCA_OV519 is not set # CONFIG_USB_GSPCA_OV534 is not set # CONFIG_USB_GSPCA_OV534_9 is not set # CONFIG_USB_GSPCA_PAC207 is not set # CONFIG_USB_GSPCA_PAC7302 is not set # CONFIG_USB_GSPCA_PAC7311 is not set # CONFIG_USB_GSPCA_SE401 is not set # CONFIG_USB_GSPCA_SN9C2028 is not set # CONFIG_USB_GSPCA_SN9C20X is not set # CONFIG_USB_GSPCA_SONIXB is not set # CONFIG_USB_GSPCA_SONIXJ is not set # CONFIG_USB_GSPCA_SPCA500 is not set # CONFIG_USB_GSPCA_SPCA501 is not set # CONFIG_USB_GSPCA_SPCA505 is not set # CONFIG_USB_GSPCA_SPCA506 is not set # CONFIG_USB_GSPCA_SPCA508 is not set # CONFIG_USB_GSPCA_SPCA561 is not set # CONFIG_USB_GSPCA_SPCA1528 is not set # CONFIG_USB_GSPCA_SQ905 is not set # CONFIG_USB_GSPCA_SQ905C is not set # CONFIG_USB_GSPCA_SQ930X is not set # CONFIG_USB_GSPCA_STK014 is not set # CONFIG_USB_GSPCA_STK1135 is not set # CONFIG_USB_GSPCA_STV0680 is not set # CONFIG_USB_GSPCA_SUNPLUS is not set # CONFIG_USB_GSPCA_T613 is not set # CONFIG_USB_GSPCA_TOPRO is not set # CONFIG_USB_GSPCA_TV8532 is not set # CONFIG_USB_GSPCA_VC032X is not set # CONFIG_USB_GSPCA_VICAM is not set # CONFIG_USB_GSPCA_XIRLINK_CIT is not set # CONFIG_USB_GSPCA_ZC3XX is not set # CONFIG_USB_PWC is not set # CONFIG_VIDEO_CPIA2 is not set # CONFIG_USB_ZR364XX is not set # CONFIG_USB_STKWEBCAM is not set # CONFIG_USB_S2255 is not set # CONFIG_VIDEO_USBTV is not set # # Analog TV USB devices # # CONFIG_VIDEO_PVRUSB2 is not set # CONFIG_VIDEO_HDPVR is not set # CONFIG_VIDEO_TLG2300 is not set # CONFIG_VIDEO_USBVISION is not set CONFIG_VIDEO_STK1160_COMMON=m # CONFIG_VIDEO_STK1160_AC97 is not set CONFIG_VIDEO_STK1160=m # # Analog/digital TV USB devices # # CONFIG_VIDEO_AU0828 is not set # CONFIG_VIDEO_CX231XX is not set # CONFIG_VIDEO_TM6000 is not set # # Digital TV USB devices # CONFIG_DVB_USB=m # CONFIG_DVB_USB_DEBUG is not set CONFIG_DVB_USB_A800=m CONFIG_DVB_USB_DIBUSB_MB=m CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y CONFIG_DVB_USB_DIBUSB_MC=m CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_CXUSB=m CONFIG_DVB_USB_M920X=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_VP7045=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_GP8PSK=m CONFIG_DVB_USB_NOVA_T_USB2=m CONFIG_DVB_USB_TTUSB2=m CONFIG_DVB_USB_DTT200U=m # CONFIG_DVB_USB_OPERA1 is not set CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_DTV5100=m CONFIG_DVB_USB_FRIIO=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_V2=m CONFIG_DVB_USB_AF9015=m CONFIG_DVB_USB_AF9035=m CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_AZ6007=m CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_GL861=m # CONFIG_DVB_USB_IT913X is not set CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m CONFIG_SMS_USB_DRV=m CONFIG_DVB_B2C2_FLEXCOP_USB=m CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG=y # # Webcam, TV (analog/digital) USB devices # CONFIG_VIDEO_EM28XX=m # CONFIG_VIDEO_EM28XX_V4L2 is not set # CONFIG_VIDEO_EM28XX_ALSA is not set CONFIG_VIDEO_EM28XX_DVB=m CONFIG_VIDEO_EM28XX_RC=m CONFIG_V4L_PLATFORM_DRIVERS=y # CONFIG_SOC_CAMERA is not set # CONFIG_V4L_MEM2MEM_DRIVERS is not set # CONFIG_V4L_TEST_DRIVERS is not set # # Supported MMC/SDIO adapters # # CONFIG_SMS_SDIO_DRV is not set CONFIG_MEDIA_COMMON_OPTIONS=y # # common driver options # CONFIG_VIDEO_TVEEPROM=m CONFIG_CYPRESS_FIRMWARE=m CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_DVB_B2C2_FLEXCOP_DEBUG=y CONFIG_SMS_SIANO_MDTV=m CONFIG_SMS_SIANO_RC=y # # Media ancillary drivers (tuners, sensors, i2c, frontends) # CONFIG_MEDIA_SUBDRV_AUTOSELECT=y CONFIG_MEDIA_ATTACH=y CONFIG_VIDEO_IR_I2C=m # # Audio decoders, processors and mixers # # # RDS decoders # # # Video decoders # CONFIG_VIDEO_SAA711X=m # # Video and audio decoders # # # Video encoders # # # Camera sensor devices # # # Flash devices # # # Video improvement chips # # # Audio/Video compression chips # # # Miscellaneous helper chips # # # Sensors used on soc_camera driver # CONFIG_MEDIA_TUNER=m CONFIG_MEDIA_TUNER_SIMPLE=m CONFIG_MEDIA_TUNER_TDA8290=m CONFIG_MEDIA_TUNER_TDA827X=m CONFIG_MEDIA_TUNER_TDA18271=m CONFIG_MEDIA_TUNER_TDA9887=m CONFIG_MEDIA_TUNER_MT20XX=m CONFIG_MEDIA_TUNER_MT2060=m CONFIG_MEDIA_TUNER_MT2063=m CONFIG_MEDIA_TUNER_MT2266=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_XC2028=m CONFIG_MEDIA_TUNER_XC5000=m CONFIG_MEDIA_TUNER_XC4000=m CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m CONFIG_MEDIA_TUNER_MC44S803=m CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_TDA18218=m CONFIG_MEDIA_TUNER_FC0011=m CONFIG_MEDIA_TUNER_FC0012=m CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_TDA18212=m CONFIG_MEDIA_TUNER_E4000=m CONFIG_MEDIA_TUNER_FC2580=m CONFIG_MEDIA_TUNER_M88TS2022=m CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_MEDIA_TUNER_IT913X=m CONFIG_MEDIA_TUNER_R820T=m # # Multistandard (satellite) frontends # CONFIG_DVB_STB0899=m CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m CONFIG_DVB_STV6110x=m CONFIG_DVB_M88DS3103=m # # Multistandard (cable + terrestrial) frontends # CONFIG_DVB_DRXK=m CONFIG_DVB_TDA18271C2DD=m # # DVB-S (satellite) frontends # CONFIG_DVB_CX24123=m CONFIG_DVB_MT312=m CONFIG_DVB_ZL10039=m CONFIG_DVB_S5H1420=m CONFIG_DVB_STV0288=m CONFIG_DVB_STB6000=m CONFIG_DVB_STV0299=m CONFIG_DVB_STV6110=m CONFIG_DVB_STV0900=m CONFIG_DVB_TDA10086=m CONFIG_DVB_TUNER_ITD1000=m CONFIG_DVB_TUNER_CX24113=m CONFIG_DVB_TDA826X=m CONFIG_DVB_CX24116=m CONFIG_DVB_SI21XX=m CONFIG_DVB_TS2020=m CONFIG_DVB_DS3000=m CONFIG_DVB_TDA10071=m # # DVB-T (terrestrial) frontends # CONFIG_DVB_CX22702=m CONFIG_DVB_DRXD=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_NXT6000=m CONFIG_DVB_MT352=m CONFIG_DVB_ZL10353=m CONFIG_DVB_DIB3000MB=m CONFIG_DVB_DIB3000MC=m CONFIG_DVB_DIB7000M=m CONFIG_DVB_DIB7000P=m CONFIG_DVB_TDA10048=m CONFIG_DVB_AF9013=m CONFIG_DVB_EC100=m CONFIG_DVB_CXD2820R=m CONFIG_DVB_RTL2830=m CONFIG_DVB_RTL2832=m # # DVB-C (cable) frontends # CONFIG_DVB_TDA10023=m CONFIG_DVB_STV0297=m # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # CONFIG_DVB_NXT200X=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LGDT330X=m CONFIG_DVB_LGDT3305=m CONFIG_DVB_LG2160=m CONFIG_DVB_S5H1409=m CONFIG_DVB_S5H1411=m # # ISDB-T (terrestrial) frontends # CONFIG_DVB_S921=m CONFIG_DVB_DIB8000=m CONFIG_DVB_MB86A20S=m # # Digital terrestrial only tuners/PLL # CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m CONFIG_DVB_TUNER_DIB0090=m # # SEC control devices for DVB-S # CONFIG_DVB_LNBP21=m CONFIG_DVB_LNBP22=m CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m CONFIG_DVB_A8293=m CONFIG_DVB_LGS8GXX=m CONFIG_DVB_ATBM8830=m CONFIG_DVB_IX2505V=m CONFIG_DVB_M88RS2000=m CONFIG_DVB_AF9033=m # # Tools to develop new frontends # # CONFIG_DVB_DUMMY_FE is not set # # Graphics support # # CONFIG_DRM is not set # CONFIG_VGASTATE is not set # CONFIG_VIDEO_OUTPUT_CONTROL is not set # CONFIG_VEXPRESS_DVI_CONTROL is not set CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set # CONFIG_FB_DDC is not set # CONFIG_FB_BOOT_VESA_SUPPORT is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set CONFIG_FB_SYS_FILLRECT=m CONFIG_FB_SYS_COPYAREA=m CONFIG_FB_SYS_IMAGEBLIT=m # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=m CONFIG_FB_DEFERRED_IO=y # CONFIG_FB_SVGALIB is not set # CONFIG_FB_MACMODES is not set # CONFIG_FB_BACKLIGHT is not set CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_SMSCUFX is not set CONFIG_FB_UDL=m # CONFIG_FB_GOLDFISH is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_BROADSHEET is not set # CONFIG_FB_AUO_K190X is not set # CONFIG_FB_SIMPLE is not set # CONFIG_EXYNOS_VIDEO is not set # CONFIG_BACKLIGHT_LCD_SUPPORT is not set # CONFIG_ADF is not set # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=m # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_LOGO is not set # CONFIG_FB_SSD1307 is not set CONFIG_SOUND=y # CONFIG_SOUND_OSS_CORE is not set CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_COMPRESS_OFFLOAD=y CONFIG_SND_JACK=y CONFIG_SND_SEQUENCER=y CONFIG_SND_SEQ_DUMMY=n CONFIG_SND_SEQUENCER_OSS=n CONFIG_SND_SEQ_HRTIMER_DEFAULT=y # CONFIG_SND_MIXER_OSS is not set # CONFIG_SND_PCM_OSS is not set CONFIG_SND_HRTIMER=m CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 # CONFIG_SND_SUPPORT_OLD_API is not set # CONFIG_SND_VERBOSE_PROCFS is not set # CONFIG_SND_VERBOSE_PRINTK is not set # CONFIG_SND_DEBUG is not set CONFIG_SND_VMASTER=y CONFIG_SND_RAWMIDI_SEQ=y # CONFIG_SND_OPL3_LIB_SEQ is not set # CONFIG_SND_OPL4_LIB_SEQ is not set # CONFIG_SND_SBAWE_SEQ is not set # CONFIG_SND_EMU10K1_SEQ is not set CONFIG_SND_AC97_CODEC=m # CONFIG_SND_DRIVERS is not set # CONFIG_SND_SPI is not set CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=m CONFIG_SND_USB_UA101=m CONFIG_SND_USB_CAIAQ=m CONFIG_SND_USB_CAIAQ_INPUT=y CONFIG_SND_USB_6FIRE=m # CONFIG_SND_USB_HIFACE is not set CONFIG_SND_SOC=y # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_DESIGNWARE_I2S is not set CONFIG_SND_AML_M8_SOC=y CONFIG_SND_AML_M8=y CONFIG_SND_AML_SPLIT_MODE=y # CONFIG_SND_AML_SPLIT_MODE_MMAP is not set CONFIG_SND_SOC_I2C_AND_SPI=y CONFIG_SND_SOC_DUMMY_CODEC=y CONFIG_SND_SOC_TAS5707=y CONFIG_SND_SOC_TAS5717=y CONFIG_SND_SOC_TAS5731=y CONFIG_SND_SOC_AMLPMU4=y CONFIG_SND_SOC_ES8323=y CONFIG_SND_SOC_PCM2BT=y CONFIG_SND_SOC_AMLT9015=y CONFIG_SND_SOC_AMLT9015S=y # CONFIG_SND_SIMPLE_CARD is not set # CONFIG_SOUND_PRIME is not set CONFIG_AC97_BUS=m # # HID support # CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set CONFIG_HID_AUREAL=y CONFIG_HID_BELKIN=y CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_DIA_REMOTE is not set # CONFIG_HID_PRODIKEYS is not set CONFIG_HID_CYPRESS=y CONFIG_HID_DRAGONRISE=m CONFIG_DRAGONRISE_FF=y # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_HOLTEK is not set # CONFIG_HID_HUION is not set # CONFIG_HID_KEYTOUCH is not set CONFIG_HID_KYE=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set CONFIG_HID_GYRATION=y # CONFIG_HID_ICADE is not set CONFIG_HID_TWINHAN=y CONFIG_HID_KENSINGTON=y CONFIG_HID_LCPOWER=y CONFIG_HID_LENOVO_TPKBD=m CONFIG_HID_LOGITECH=y CONFIG_HID_LOGITECH_DJ=y CONFIG_LOGITECH_FF=y CONFIG_LOGIRUMBLEPAD2_FF=y CONFIG_LOGIG940_FF=y CONFIG_LOGIWHEELS_FF=y # CONFIG_HID_MAGICMOUSE is not set CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=y # CONFIG_HID_NTRIG is not set CONFIG_HID_ORTEK=y CONFIG_HID_PANTHERLORD=y CONFIG_PANTHERLORD_FF=y CONFIG_HID_PETALYNX=y CONFIG_HID_PICOLCD=m CONFIG_HID_PICOLCD_FB=y CONFIG_HID_PICOLCD_LEDS=y # CONFIG_HID_PICOLCD_CIR is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set CONFIG_HID_SAMSUNG=y CONFIG_HID_SONY=y CONFIG_SONY_FF=y # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEELSERIES is not set CONFIG_HID_SUNPLUS=y # CONFIG_HID_GREENASIA is not set # CONFIG_HID_SMARTJOYPLUS is not set CONFIG_HID_TIVO=y CONFIG_HID_TOPSEED=y # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_WACOM is not set CONFIG_HID_WIIMOTE=m CONFIG_HID_XINMO=m # CONFIG_HID_ZEROPLUS is not set CONFIG_HID_ZYDACRON=y # CONFIG_HID_SENSOR_HUB is not set # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # # I2C HID support # # CONFIG_I2C_HID is not set CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y # CONFIG_USB_DEBUG is not set CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_OTG_WHITELIST is not set # CONFIG_USB_OTG_BLACKLIST_HUB is not set # CONFIG_USB_MON is not set # CONFIG_USB_WUSB_CBAF is not set # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y CONFIG_USB_XHCI_PLATFORM=y CONFIG_USB_EHCI_HCD=y # CONFIG_USB_EHCI_ROOT_HUB_TT is not set CONFIG_USB_EHCI_TT_NEWSCHED=y CONFIG_USB_EHCI_HCD_SYNOPSYS=y # CONFIG_USB_EHCI_HCD_PLATFORM is not set # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_ISP1760_HCD is not set # CONFIG_USB_ISP1362_HCD is not set # CONFIG_USB_FUSBH200_HCD is not set # CONFIG_USB_FOTG210_HCD is not set CONFIG_USB_OHCI_HCD=y # CONFIG_USB_OHCI_HCD_PLATFORM is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_SSB is not set # CONFIG_USB_HCD_TEST_MODE is not set # CONFIG_USB_RENESAS_USBHS is not set # # USB Device Class drivers # CONFIG_USB_ACM=m # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USB_MUSB_HDRC is not set CONFIG_USB_DWC3=y CONFIG_USB_DWC3_HOST=y # CONFIG_USB_DWC3_GADGET is not set # CONFIG_USB_DWC3_DUAL_ROLE is not set # # Platform Glue Driver Support # # CONFIG_USB_DWC3_EXYNOS is not set # CONFIG_USB_DWC3_KEYSTONE is not set # # Debugging features # # CONFIG_USB_DWC3_DEBUG is not set # CONFIG_DWC3_HOST_USB3_LPM_ENABLE is not set # CONFIG_USB_DWC2 is not set # CONFIG_USB_CHIPIDEA is not set # # USB port drivers # CONFIG_USB_SERIAL=y CONFIG_USB_SERIAL_CONSOLE=y CONFIG_USB_SERIAL_GENERIC=y # CONFIG_USB_SERIAL_SIMPLE is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set CONFIG_USB_SERIAL_CH341=m # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set CONFIG_USB_SERIAL_CP210X=m # CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_EMPEG is not set CONFIG_USB_SERIAL_FTDI_SIO=m # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_F81232 is not set # CONFIG_USB_SERIAL_GARMIN is not set # CONFIG_USB_SERIAL_IPW is not set CONFIG_USB_SERIAL_IUU=m # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set # CONFIG_USB_SERIAL_KEYSPAN is not set # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_METRO is not set # CONFIG_USB_SERIAL_MOS7720 is not set # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MXUPORT is not set # CONFIG_USB_SERIAL_NAVMAN is not set CONFIG_USB_SERIAL_PL2303=y # CONFIG_USB_SERIAL_OTI6858 is not set # CONFIG_USB_SERIAL_QCAUX is not set # CONFIG_USB_SERIAL_QUALCOMM is not set # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SAFE is not set # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_XIRCOM is not set # CONFIG_USB_SERIAL_OPTION is not set # CONFIG_USB_SERIAL_OMNINET is not set # CONFIG_USB_SERIAL_OPTICON is not set # CONFIG_USB_SERIAL_XSENS_MT is not set # CONFIG_USB_SERIAL_WISHBONE is not set # CONFIG_USB_SERIAL_ZTE is not set # CONFIG_USB_SERIAL_SSU100 is not set # CONFIG_USB_SERIAL_QT2 is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_RIO500 is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_LED is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HSIC_USB3503 is not set # # USB Physical Layer drivers # CONFIG_USB_PHY=y # CONFIG_USB_OTG_FSM is not set # CONFIG_USB_OTG_WAKELOCK is not set # CONFIG_NOP_USB_XCEIV is not set # CONFIG_SAMSUNG_USB2PHY is not set # CONFIG_SAMSUNG_USB3PHY is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set # CONFIG_USB_RCAR_PHY is not set # CONFIG_USB_ULPI is not set CONFIG_AMLOGIC_USBPHY=y CONFIG_AMLOGIC_USB2PHY=y CONFIG_AMLOGIC_USB3PHY=y CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GADGET_DEBUG_FILES is not set # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # # USB Peripheral Controller # # CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set # CONFIG_USB_M66592 is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_DUMMY_HCD is not set CONFIG_USB_LIBCOMPOSITE=m CONFIG_USB_U_ETHER=m CONFIG_USB_F_ECM=m CONFIG_USB_F_EEM=m CONFIG_USB_F_SUBSET=m CONFIG_USB_F_RNDIS=m # CONFIG_USB_CONFIGFS is not set # CONFIG_USB_ZERO is not set # CONFIG_USB_AUDIO is not set CONFIG_USB_ETH=m CONFIG_USB_ETH_RNDIS=y CONFIG_USB_ETH_EEM=y # CONFIG_USB_G_NCM is not set # CONFIG_USB_GADGETFS is not set # CONFIG_USB_FUNCTIONFS is not set # CONFIG_USB_MASS_STORAGE is not set # CONFIG_USB_G_SERIAL is not set # CONFIG_USB_MIDI_GADGET is not set # CONFIG_USB_G_PRINTER is not set # CONFIG_USB_CDC_COMPOSITE is not set # CONFIG_USB_G_ACM_MS is not set # CONFIG_USB_G_MULTI is not set # CONFIG_USB_G_HID is not set # CONFIG_USB_G_DBGP is not set # CONFIG_USB_G_WEBCAM is not set CONFIG_MMC=y # CONFIG_MMC_DEBUG is not set CONFIG_PXP_MMC=y CONFIG_MMC_UNSAFE_RESUME=y # CONFIG_MMC_CLKGATE is not set # CONFIG_MMC_EMBEDDED_SDIO is not set # CONFIG_MMC_PARANOID_SD_INIT is not set # # MMC/SD/SDIO Card Drivers # CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 CONFIG_MMC_BLOCK_BOUNCE=y # CONFIG_MMC_BLOCK_DEFERRED_RESUME is not set # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # CONFIG_MMC_ARMMMCI=y # CONFIG_MMC_SDHCI is not set # CONFIG_MMC_SDHCI_PXAV3 is not set # CONFIG_MMC_SDHCI_PXAV2 is not set # CONFIG_MMC_SPI is not set # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y # # LED drivers # # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP5521 is not set # CONFIG_LEDS_LP5523 is not set # CONFIG_LEDS_LP5562 is not set # CONFIG_LEDS_LP8501 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_PCA9685 is not set # CONFIG_LEDS_DAC124S085 is not set # CONFIG_LEDS_PWM is not set # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_OT200 is not set # CONFIG_LEDS_BLINKM is not set # # LED Triggers # CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set CONFIG_LEDS_TRIGGER_OFF=y CONFIG_LEDS_TRIGGER_CPU=y CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set CONFIG_SWITCH=y # CONFIG_SWITCH_GPIO is not set # CONFIG_ACCESSIBILITY is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_SYSTOHC=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # I2C RTC drivers # CONFIG_RTC_DRV_DS1307=m # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_HYM8563 is not set CONFIG_RTC_DRV_AML_HYM8563=y # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12057 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_PCF8523 is not set CONFIG_RTC_DRV_PCF8563=y # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8581 is not set # CONFIG_RTC_DRV_RX8025 is not set # CONFIG_RTC_DRV_EM3027 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_DS3234 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_RX4581 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_DS2404 is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_PL030 is not set # CONFIG_RTC_DRV_PL031 is not set # CONFIG_RTC_DRV_SNVS is not set # CONFIG_RTC_DRV_MOXART is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_HID_SENSOR_TIME is not set # CONFIG_DMADEVICES is not set # CONFIG_AUXDISPLAY is not set CONFIG_UIO=y # CONFIG_UIO_PDRV_GENIRQ is not set # CONFIG_UIO_DMEM_GENIRQ is not set # CONFIG_VIRT_DRIVERS is not set CONFIG_VIRTIO=y # # Virtio drivers # # CONFIG_VIRTIO_BALLOON is not set CONFIG_VIRTIO_MMIO=y # CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set # # Microsoft Hyper-V guest support # CONFIG_STAGING=y # CONFIG_USBIP_CORE is not set # CONFIG_W35UND is not set # CONFIG_PRISM2_USB is not set # CONFIG_ECHO is not set # CONFIG_COMEDI is not set # CONFIG_RTLLIB is not set CONFIG_R8712U=m # CONFIG_R8188EU is not set # CONFIG_RTS5139 is not set # CONFIG_TRANZPORT is not set # CONFIG_LINE6_USB is not set # CONFIG_USB_SERIAL_QUATECH2 is not set CONFIG_VT6656=m # CONFIG_USB_ENESTORAGE is not set # CONFIG_BCM_WIMAX is not set # CONFIG_FT1000 is not set # # Speakup console speech # # CONFIG_SPEAKUP is not set # CONFIG_TOUCHSCREEN_CLEARPAD_TM1217 is not set # CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set # CONFIG_STAGING_MEDIA is not set # # Android # CONFIG_ANDROID=y # CONFIG_ANDROID_BINDER_IPC is not set CONFIG_ASHMEM=y # CONFIG_ANDROID_LOGGER is not set # CONFIG_ANDROID_TIMED_OUTPUT is not set # CONFIG_ANDROID_LOW_MEMORY_KILLER is not set # CONFIG_ANDROID_INTF_ALARM_DEV is not set CONFIG_SYNC=y CONFIG_SW_SYNC=y CONFIG_SW_SYNC_USER=y CONFIG_ION=y # CONFIG_ION_TEST is not set # CONFIG_ION_DUMMY is not set # CONFIG_FIQ_DEBUGGER is not set # CONFIG_FIQ_WATCHDOG is not set # CONFIG_USB_WPAN_HCD is not set # CONFIG_WIMAX_GDM72XX is not set # CONFIG_LTE_GDM724X is not set # CONFIG_CED1401 is not set # CONFIG_DGRP is not set # CONFIG_MTD_SPINAND_MT29F is not set # CONFIG_LUSTRE_FS is not set # CONFIG_XILLYBUS is not set # CONFIG_DGAP is not set CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Common Clock Framework # CONFIG_COMMON_CLK_VERSATILE=y # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI570 is not set CONFIG_COMMON_CLK_XGENE=y CONFIG_COMMON_CLK_SCPI=y # CONFIG_COMMON_CLK_QCOM is not set # # Hardware Spinlock drivers # CONFIG_CLKSRC_OF=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y CONFIG_MAILBOX=y # CONFIG_PL320_MBOX is not set CONFIG_IOMMU_SUPPORT=y CONFIG_OF_IOMMU=y # CONFIG_ARM_SMMU is not set # # Remoteproc drivers # # CONFIG_STE_MODEM_RPROC is not set # # Rpmsg drivers # CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y CONFIG_DEVFREQ_GOV_PERFORMANCE=y CONFIG_DEVFREQ_GOV_POWERSAVE=y CONFIG_DEVFREQ_GOV_USERSPACE=y # # DEVFREQ Drivers # # CONFIG_EXTCON is not set # CONFIG_MEMORY is not set # CONFIG_IIO is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_PCA9685 is not set CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_V3=y # CONFIG_IPACK_BUS is not set CONFIG_RESET_CONTROLLER=y # CONFIG_FMC is not set # # PHY Subsystem # # CONFIG_GENERIC_PHY is not set # CONFIG_PHY_EXYNOS_MIPI_VIDEO is not set # CONFIG_PHY_EXYNOS_DP_VIDEO is not set # CONFIG_POWERCAP is not set # CONFIG_CORESIGHT is not set # # File systems # CONFIG_DCACHE_WORD_ACCESS=y # CONFIG_EXT2_FS is not set # CONFIG_EXT3_FS is not set CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT23=y # CONFIG_EXT4_FS_POSIX_ACL is not set # CONFIG_EXT4_FS_SECURITY is not set # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=m # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m # CONFIG_BTRFS_FS_POSIX_ACL is not set # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_NILFS2_FS is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y CONFIG_FILE_LOCKING=y CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y # CONFIG_QUOTA is not set # CONFIG_QUOTACTL is not set CONFIG_AUTOFS4_FS=y CONFIG_FUSE_FS=m # CONFIG_CUSE is not set CONFIG_OVERLAY_FS=y # # Caches # CONFIG_FSCACHE=y # CONFIG_FSCACHE_STATS is not set # CONFIG_FSCACHE_HISTOGRAM is not set # CONFIG_FSCACHE_DEBUG is not set # CONFIG_FSCACHE_OBJECT_LIST is not set # CONFIG_CACHEFILES is not set # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=m CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=m CONFIG_UDF_NLS=y # # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=936 CONFIG_FAT_DEFAULT_IOCHARSET="utf8" CONFIG_FAT_DEFAULT_UTF8=y CONFIG_EXFAT_FS=y CONFIG_EXFAT_DISCARD=y CONFIG_EXFAT_DELAYED_SYNC=n CONFIG_EXFAT_KERNEL_DEBUG=n CONFIG_EXFAT_DEBUG_MSG=n CONFIG_EXFAT_DEFAULT_CODEPAGE=936 CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" CONFIG_EXFAT_VIRTUAL_XATTR=y CONFIG_EXFAT_VIRTUAL_XATTR_SELINUX_LABEL="u:object_r:exfat:s0" CONFIG_EXFAT_DEBUG=n CONFIG_EXFAT_UEVENT=n # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_HUGETLBFS is not set # CONFIG_HUGETLB_PAGE is not set CONFIG_CONFIGFS_FS=y CONFIG_MISC_FILESYSTEMS=y # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set CONFIG_HFS_FS=m CONFIG_HFSPLUS_FS=m # CONFIG_HFSPLUS_FS_POSIX_ACL is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS2_FS is not set CONFIG_UBIFS_FS=m # CONFIG_UBIFS_FS_ADVANCED_COMPR is not set CONFIG_UBIFS_FS_LZO=y CONFIG_UBIFS_FS_ZLIB=y # CONFIG_LOGFS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y # CONFIG_SQUASHFS_FILE_CACHE is not set CONFIG_SQUASHFS_FILE_DIRECT=y # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y # CONFIG_SQUASHFS_XATTR is not set # CONFIG_SQUASHFS_ZLIB is not set CONFIG_SQUASHFS_LZO=y # CONFIG_SQUASHFS_XZ is not set # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y # CONFIG_PSTORE_CONSOLE is not set CONFIG_PSTORE_PMSG=y # CONFIG_PSTORE_FTRACE is not set CONFIG_PSTORE_RAM=y # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_F2FS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y CONFIG_NFS_SWAP=y CONFIG_NFS_V4_1=y # CONFIG_NFS_V4_2 is not set CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=m CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" # CONFIG_NFS_V4_1_MIGRATION is not set CONFIG_ROOT_NFS=y CONFIG_NFS_FSCACHE=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFSD=m CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_NFSD_FAULT_INJECTION=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_ACL_SUPPORT=m CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y CONFIG_SUNRPC_SWAP=y CONFIG_RPCSEC_GSS_KRB5=m # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=m CONFIG_CIFS_STATS=y CONFIG_CIFS_STATS2=y # CONFIG_CIFS_WEAK_PW_HASH is not set # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set # CONFIG_CIFS_DEBUG is not set # CONFIG_CIFS_DFS_UPCALL is not set CONFIG_CIFS_SMB2=y CONFIG_CIFS_FSCACHE=y # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set CONFIG_NLS_CODEPAGE_936=y # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_VIRTUALIZATION is not set # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y # # Compile-time checks and compiler options # # CONFIG_DEBUG_INFO is not set CONFIG_ENABLE_WARN_DEPRECATED=y CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 CONFIG_STRIP_ASM_SYMS=y # CONFIG_READABLE_ASM is not set # CONFIG_UNUSED_SYMBOLS is not set CONFIG_DEBUG_FS=y # CONFIG_HEADERS_CHECK is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # CONFIG_MAGIC_SYSRQ is not set CONFIG_DEBUG_KERNEL=y # # Memory Debugging # # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set # CONFIG_DEBUG_SHIRQ is not set # # Debug Lockups and Hangs # # CONFIG_LOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 # CONFIG_SCHED_DEBUG is not set # CONFIG_SCHEDSTATS is not set CONFIG_TIMER_STATS=y # # Lock Debugging (spinlocks, mutexes, etc...) # # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_RT_MUTEX_TESTER is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set CONFIG_STACKTRACE=y # CONFIG_DEBUG_KOBJECT is not set CONFIG_HAVE_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_WRITECOUNT is not set # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_SPARSE_RCU_POINTER is not set # CONFIG_RCU_TORTURE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=60 # CONFIG_RCU_CPU_STALL_INFO is not set CONFIG_RCU_TRACE=y # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y # CONFIG_IRQSOFF_TRACER is not set # CONFIG_SCHED_TRACER is not set # CONFIG_FTRACE_SYSCALLS is not set # CONFIG_TRACER_SNAPSHOT is not set CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set # CONFIG_STACK_TRACER is not set # CONFIG_BLK_DEV_IO_TRACE is not set # CONFIG_PROBE_EVENTS is not set CONFIG_DYNAMIC_FTRACE=y # CONFIG_FUNCTION_PROFILER is not set CONFIG_FTRACE_MCOUNT_RECORD=y # CONFIG_FTRACE_STARTUP_TEST is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # # Runtime Testing # # CONFIG_LKDTM is not set # CONFIG_TEST_LIST_SORT is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_RBTREE_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_DMA_API_DEBUG is not set # CONFIG_TEST_MODULE is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_CHECK_ISR_TIME is not set # CONFIG_SAMPLES is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_EARLY_PRINTK=y # CONFIG_PID_IN_CONTEXTIDR is not set # # Security options # CONFIG_KEYS=y # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_BIG_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set # CONFIG_KEYS_DEBUG_PROC_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set CONFIG_SECURITYFS=y CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_DEFAULT_SECURITY="" CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=m CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=m CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_PCOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y CONFIG_CRYPTO_USER=y CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=m # CONFIG_CRYPTO_NULL is not set # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_WORKQUEUE=y CONFIG_CRYPTO_CRYPTD=m # CONFIG_CRYPTO_AUTHENC is not set # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_ABLK_HELPER=m # # Authenticated Encryption with Associated Data # CONFIG_CRYPTO_CCM=m # CONFIG_CRYPTO_GCM is not set CONFIG_CRYPTO_SEQIV=m # # Block modes # CONFIG_CRYPTO_CBC=m CONFIG_CRYPTO_CTR=m CONFIG_CRYPTO_CTS=m CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=m # # Hash modes # CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_VMAC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_CRC32 is not set CONFIG_CRYPTO_CRCT10DIF=m # CONFIG_CRYPTO_GHASH is not set CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=m CONFIG_CRYPTO_SHA256=y # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_ANUBIS is not set CONFIG_CRYPTO_ARC4=y # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_ZLIB is not set CONFIG_CRYPTO_LZO=y # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # # Random Number Generation # CONFIG_CRYPTO_ANSI_CPRNG=m CONFIG_CRYPTO_USER_API=m # CONFIG_CRYPTO_USER_API_HASH is not set CONFIG_CRYPTO_USER_API_SKCIPHER=m CONFIG_CRYPTO_HW=y # CONFIG_ASYMMETRIC_KEY_TYPE is not set CONFIG_ARM64_CRYPTO=y CONFIG_CRYPTO_SHA1_ARM64_CE=m CONFIG_CRYPTO_SHA2_ARM64_CE=m CONFIG_CRYPTO_GHASH_ARM64_CE=m CONFIG_CRYPTO_AES_ARM64_CE=m CONFIG_CRYPTO_AES_ARM64_CE_CCM=m CONFIG_CRYPTO_AES_ARM64_CE_BLK=m # CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m CONFIG_BITREVERSE=y CONFIG_RATIONAL=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_GENERIC_IOMAP=y CONFIG_GENERIC_IO=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_CRC_CCITT=m CONFIG_CRC16=y CONFIG_CRC_T10DIF=m CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=m # CONFIG_CRC8 is not set # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_XZ_DEC=y # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set # CONFIG_XZ_DEC_IA64 is not set # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set # CONFIG_XZ_DEC_BCJ is not set # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_LZO=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_DMA=y CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_NLATTR=y CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y CONFIG_AVERAGE=y # CONFIG_CORDIC is not set # CONFIG_DDR is not set CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_FONT_SUPPORT=m # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/options ================================================ ################################################################################ # setup system defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) # TARGET_CPU: # arm2 arm250 arm3 arm6 arm60 arm600 arm610 arm620 arm7 arm7m arm7d # arm7dm arm7di arm7dmi arm70 arm700 arm700i arm710 arm710c # arm7100 arm720 arm7500 arm7500fe arm7tdmi arm7tdmi-s arm710t # arm720t arm740t strongarm strongarm110 strongarm1100 # strongarm1110 arm8 arm810 arm9 arm9e arm920 arm920t arm922t # arm946e-s arm966e-s arm968e-s arm926ej-s arm940t arm9tdmi # arm10tdmi arm1020t arm1026ej-s arm10e arm1020e arm1022e # arm1136j-s arm1136jf-s mpcore mpcorenovfp arm1156t2-s # arm1176jz-s arm1176jzf-s cortex-a8 cortex-a9 cortex-r4 # cortex-r4f cortex-m3 cortex-m1 xscale iwmmxt iwmmxt2 ep9312. # TARGET_KERNEL_ARCH="arm64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc+fp+simd" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc" TARGET_FPU="neon-fp-armv8" ;; esac # Bootloader to use (syslinux / u-boot / atv-bootloader / bcm2835-bootloader) BOOTLOADER="u-boot" # u-boot version to use (default) UBOOT_VERSION="vendor" # Target Configfile for u-boot UBOOT_CONFIGFILE="boot.ini" # Kernel target KERNEL_TARGET="Image.lzo" # Kernel extra targets to build KERNEL_UBOOT_EXTRA_TARGET="gxbb_p200.dtb gxbb_p200_2G.dtb gxl_p212_1g.dtb gxl_p212_2g.dtb gxl_p230_2g.dtb" # Build Android kernel image using mkbootimg BUILD_ANDROID_BOOTIMG="yes" # Additional options to be passed to Android mkbootimg ANDROID_BOOTIMG_OPTIONS="--base 0x0 --kernel_offset 0x1080000" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="" # Additional kernel dependencies KERNEL_EXTRA_DEPENDS_TARGET="device-trees-amlogic" # Kernel to use. values can be: # default: default mainline kernel LINUX="amlogic-3.14" # kernel image name KERNEL_NAME="kernel.img" # legacy kernel image name LEGACY_KERNEL_NAME="KERNEL" # legacy dtb image name LEGACY_DTB_NAME="meson64_odroidc2.dtb" ################################################################################ # setup build defaults ################################################################################ # Project CFLAGS PROJECT_CFLAGS="" # SquashFS compression method (gzip / lzo / xz) SQUASHFS_COMPRESSION="lzo" ################################################################################ # setup project defaults ################################################################################ # build and install ALSA Audio support (yes / no) ALSA_SUPPORT="yes" # OpenGL(X) implementation to use (no / Mesa) OPENGL="no" # OpenGL-ES implementation to use (no / bcm2835-driver / gpu-viv-bin-mx6q / opengl-meson) OPENGLES="opengl-meson" # include uvesafb support (yes / no) UVESAFB_SUPPORT="no" # Displayserver to use (x11 / no) DISPLAYSERVER="no" # Windowmanager to use (fluxbox / none) WINDOWMANAGER="none" # Xorg Graphic drivers to use (all / i915,i965,r200,r300,r600,nvidia,nouveau) # Space separated list is supported, # e.g. GRAPHIC_DRIVERS="i915 i965 r300 r600 radeonsi nvidia nouveau" GRAPHIC_DRIVERS="" # Use a vendor specific KODI repo KODI_VENDOR="amlogic-3.14" # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap / libamcodec) KODIPLAYER_DRIVER="libamcodec" # Modules to install in initramfs for early boot INITRAMFS_MODULES="font softcursor bitblit fbcon dwc_otg" # additional drivers to install: # for a list of additinoal drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="gpu-aml kvimfan-aml openvfd-driver wifi_dummy-aml ap6xxx-aml mt7601u-aml mt7603u-aml mt7610u-aml qca9377-aml ssv6xxx-aml-3.14 RTL8188EU-aml RTL8189ES-aml RTL8189FS-aml RTL8192CU RTL8192DU RTL8192EU RTL8152-aml RTL8723BS-aml RTL8723DS-aml RTL8812AU RTL8814AU RTL8821CU RTL8822BU-aml RTL8822BS-aml" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" FIRMWARE="misc-firmware wlan-firmware dvb-firmware brcmfmac_sdio-firmware-aml qca9377-firmware-aml rtl8723bs_bt rtl8822b_bt" # build and install ATV IR remote support (yes / no) ATVCLIENT_SUPPORT="no" # Amlogic IR remote support (yes / no) AMREMOTE_SUPPORT="yes" # build and install iSCSI support - iscsistart (yes / no) ISCSI_SUPPORT="no" # build with installer (yes / no) INSTALLER_SUPPORT="no" # build and install driver addons (yes / no) DRIVER_ADDONS_SUPPORT="yes" # driver addons to install: # for a list of additinoal drivers see packages/linux-driver-addons # Space separated list is supported, DRIVER_ADDONS="" # debug tty path DEBUG_TTY="/dev/ttyS0" # additional packages to install: # Space separated list is supported, # e.g. ADDITIONAL_PACKAGES="PACKAGE1 PACKAGE2" ADDITIONAL_PACKAGES="u-boot-script dtc u-boot-tools-aml CoreELEC-Debug-Scripts old_ee_3.14_kernel" # add OOTB support for IR remote IR_REMOTE_KEYMAPS="$IR_REMOTE_KEYMAPS odroid wetek_hub wetek_play_2 tanix" # build with entware installer ENTWARE_SUPPORT="yes" ENTWARE_ARCH="aarch64-k3.10" # CoreELEC Subdevices SUBDEVICES="LePotato Odroid_C2" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/android-headers/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="android-headers" PKG_VERSION="25" PKG_SHA256="1e0ecdf56c33aaa523109254e2c475878d8cfc5795ebd4bb5ecbaf80926f4fe9" PKG_LICENSE="Apache" PKG_SITE="https://android.googlesource.com/" PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Android Platform Headers from AOSP releases." PKG_TOOLCHAIN="manual" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/debug.d/bluez.conf ================================================ BLUEZ_DEBUG="--debug" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/debug.d/obexd.conf ================================================ OBEXD_DEBUG="--debug" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/default.d/bluez.conf ================================================ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="bluez" PKG_VERSION="5.50" PKG_SHA256="c44b776660bf78e664e388b979da152976296e444dece833f3ddbd5be5a3b1b4" PKG_LICENSE="GPL" PKG_SITE="http://www.bluez.org/" PKG_URL="https://git.kernel.org/pub/scm/bluetooth/bluez.git/snapshot/$PKG_NAME-$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain dbus glib readline systemd" PKG_LONGDESC="Bluetooth Tools and System Daemons for Linux." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+lto" if build_with_debug; then BLUEZ_CONFIG="--enable-debug" else BLUEZ_CONFIG="--disable-debug" fi BLUEZ_CONFIG="$BLUEZ_CONFIG --enable-monitor --enable-test" PKG_CONFIGURE_OPTS_TARGET="--disable-dependency-tracking \ --disable-silent-rules \ --enable-library \ --enable-udev \ --disable-cups \ --disable-obex \ --enable-client \ --enable-systemd \ --enable-tools --enable-deprecated \ --enable-datafiles \ --disable-experimental \ --enable-sixaxis \ --with-gnu-ld \ $BLUEZ_CONFIG \ storagedir=/storage/.cache/bluetooth" pre_configure_target() { # bluez fails to build in subdirs cd $PKG_BUILD rm -rf .$TARGET_NAME export LIBS="-lncurses -ltinfo" } post_makeinstall_target() { rm -rf $INSTALL/usr/lib/systemd rm -rf $INSTALL/usr/bin/bccmd rm -rf $INSTALL/usr/bin/bluemoon rm -rf $INSTALL/usr/bin/ciptool rm -rf $INSTALL/usr/share/dbus-1 mkdir -p $INSTALL/etc/bluetooth cp src/main.conf $INSTALL/etc/bluetooth sed -i $INSTALL/etc/bluetooth/main.conf \ -e "s|^#\[Policy\]|\[Policy\]|g" \ -e "s|^#AutoEnable.*|AutoEnable=true|g" mkdir -p $INSTALL/usr/share/services cp -P $PKG_DIR/default.d/*.conf $INSTALL/usr/share/services # bluez looks in /etc/firmware/ ln -sf /usr/lib/firmware $INSTALL/etc/firmware # pulseaudio checks for bluez via pkgconfig but lib is not actually needed sed -i 's/-lbluetooth//g' ${PKG_BUILD}/lib/bluez.pc cp -P ${PKG_BUILD}/lib/bluez.pc ${SYSROOT_PREFIX}/usr/lib/pkgconfig } post_install() { enable_service bluetooth-defaults.service enable_service bluetooth.service enable_service obex.service } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/patches/0001-obexd-client-sync.c-fix-conflict-with-unistd.c.patch ================================================ From 0e112d627d96e89fdd39f28b8d3c35b0663d816b Mon Sep 17 00:00:00 2001 From: 7Ji <pugokushin@gmail.com> Date: Wed, 22 Jun 2022 09:37:15 +0800 Subject: [PATCH 1/2] obexd/client/sync.c: fix conflict with unistd.c --- obexd/client/sync.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/obexd/client/sync.c b/obexd/client/sync.c index 548c318c3..55fed759d 100644 --- a/obexd/client/sync.c +++ b/obexd/client/sync.c @@ -222,7 +222,7 @@ static void sync_remove(struct obc_session *session) g_dbus_unregister_interface(conn, path, SYNC_INTERFACE); } -static struct obc_driver sync = { +static struct obc_driver sync_driver = { .service = "SYNC", .uuid = SYNC_UUID, .target = OBEX_SYNC_UUID, @@ -241,7 +241,7 @@ int sync_init(void) if (!conn) return -EIO; - err = obc_driver_register(&sync); + err = obc_driver_register(&sync_driver); if (err < 0) { dbus_connection_unref(conn); conn = NULL; @@ -258,5 +258,5 @@ void sync_exit(void) dbus_connection_unref(conn); conn = NULL; - obc_driver_unregister(&sync); + obc_driver_unregister(&sync_driver); } -- 2.36.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/patches/0002-profiles-audio-media.c-fix-conflict-with-unistd.c.patch ================================================ From 630a2f2a3eaa372c0dbd9a21fb9c00f0576ec442 Mon Sep 17 00:00:00 2001 From: 7Ji <pugokushin@gmail.com> Date: Wed, 22 Jun 2022 09:39:07 +0800 Subject: [PATCH 2/2] profiles/audio/media.c: fix conflict with unistd.c --- profiles/audio/media.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/profiles/audio/media.c b/profiles/audio/media.c index 23d15611b..72ed57cb1 100644 --- a/profiles/audio/media.c +++ b/profiles/audio/media.c @@ -1238,7 +1238,7 @@ static bool stop(void *user_data) return media_player_send(mp, "Stop"); } -static bool pause(void *user_data) +static bool bool_pause(void *user_data) { struct media_player *mp = user_data; @@ -1288,7 +1288,7 @@ static struct avrcp_player_cb player_cb = { .set_volume = set_volume, .play = play, .stop = stop, - .pause = pause, + .pause = bool_pause, .next = next, .previous = previous, }; -- 2.36.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/patches/bluez-01_add-obexd-policy.patch ================================================ diff -Naur bluez-5.29/src/bluetooth.conf bluez-5.29.patch/src/bluetooth.conf --- bluez-5.29/src/bluetooth.conf 2015-03-11 11:01:57.000000000 +0100 +++ bluez-5.29.patch/src/bluetooth.conf 2015-03-31 12:02:20.128341381 +0200 @@ -22,20 +22,37 @@ <allow send_interface="org.bluez.GattDescriptor1"/> <allow send_interface="org.freedesktop.DBus.ObjectManager"/> <allow send_interface="org.freedesktop.DBus.Properties"/> + + <allow own="org.bluez.obex"/> + <allow send_destination="org.bluez.obex"/> + <allow send_interface="org.bluez.obex.Agent1"/> + <allow send_interface="org.bluez.obex.Client1"/> + <allow send_interface="org.bluez.obex.Session1"/> + <allow send_interface="org.bluez.obex.Transfer1"/> + <allow send_interface="org.bluez.obex.ObjectPush1"/> + <allow send_interface="org.bluez.obex.FileTransfer1"/> + <allow send_interface="org.bluez.obex.PhonebookAccess1"/> + <allow send_interface="org.bluez.obex.Synchronization1"/> + <allow send_interface="org.bluez.obex.MessageAccess1"/> + <allow send_interface="org.bluez.obex.Message1"/> </policy> + <policy at_console="true"> <allow send_destination="org.bluez"/> + <allow send_destination="org.bluez.obex"/> </policy> <!-- allow users of lp group (printing subsystem) to communicate with bluetoothd --> <policy group="lp"> <allow send_destination="org.bluez"/> + <allow send_destination="org.bluez.obex"/> </policy> <policy context="default"> <deny send_destination="org.bluez"/> + <deny send_destination="org.bluez.obex"/> </policy> </busconfig> ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/patches/bluez-02_obexd-use-system-bus.patch ================================================ From 20dfa1079c088236bcd63f1a986956b488177ebf Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Tue, 6 Aug 2013 11:18:09 +0300 Subject: [PATCH] obexd: use system bus --- obexd/src/manager.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/obexd/src/manager.c b/obexd/src/manager.c index dbfbef8..9a29f8c 100644 --- a/obexd/src/manager.c +++ b/obexd/src/manager.c @@ -569,7 +569,7 @@ gboolean manager_init(void) dbus_error_init(&err); - connection = g_dbus_setup_bus(DBUS_BUS_SESSION, OBEXD_SERVICE, &err); + connection = g_dbus_setup_bus(DBUS_BUS_SYSTEM, OBEXD_SERVICE, &err); if (connection == NULL) { if (dbus_error_is_set(&err) == TRUE) { fprintf(stderr, "%s\n", err.message); -- 1.7.2.5 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/patches/bluez-03_storagedir.patch ================================================ diff -Naur bluez-5.7/configure.ac bluez-5.7.patch/configure.ac --- bluez-5.7/configure.ac 2013-06-26 18:17:07.000000000 +0200 +++ bluez-5.7.patch/configure.ac 2013-07-12 20:21:17.000000000 +0200 @@ -238,10 +238,13 @@ prefix="${ac_default_prefix}" fi -if (test "$localstatedir" = '${prefix}/var'); then - storagedir="${prefix}/var/lib/bluetooth" -else - storagedir="${localstatedir}/lib/bluetooth" + +if (test "x$storagedir" = 'x'); then + if (test "$localstatedir" = '${prefix}/var'); then + storagedir="${prefix}/var/lib/bluetooth" + else + storagedir="${localstatedir}/lib/bluetooth" + fi fi AC_DEFINE_UNQUOTED(STORAGEDIR, "${storagedir}", [Directory for the storage files]) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/patches/bluez-04_work-around-Logitech-diNovo-Edge-keyboard-firmware-i.patch ================================================ From aa73bf5039dfd2cf0a52dd6fd22501d955cc1a00 Mon Sep 17 00:00:00 2001 From: Tommy <mesilliac@gmail.com> Date: Thu, 10 Jan 2013 09:18:43 +0100 Subject: [PATCH] work around Logitech diNovo Edge keyboard firmware issue https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/269851 --- tools/hid2hci.rules | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/tools/hid2hci.rules b/tools/hid2hci.rules index db6bb03..7db4572 100644 --- a/tools/hid2hci.rules +++ b/tools/hid2hci.rules @@ -11,7 +11,10 @@ ATTR{bInterfaceClass}=="03", ATTR{bInterfaceSubClass}=="01", ATTR{bInterfaceProt RUN+="hid2hci --method=dell --devpath=%p", ENV{HID2HCI_SWITCH}="1" # Logitech devices -KERNEL=="hiddev*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c70[345abce]|c71[34bc]", \ +KERNEL=="hiddev*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c70[345abce]|c71[3bc]", \ + RUN+="hid2hci --method=logitech-hid --devpath=%p" +# Logitech, Inc. diNovo Edge Keyboard +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c714", \ RUN+="hid2hci --method=logitech-hid --devpath=%p" ENV{DEVTYPE}!="usb_device", GOTO="hid2hci_end" -- 1.8.0.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/patches/bluez-05-046d-c52b-Logitech-Inc.-Unifying-Receiver.patch ================================================ From 50f34d1b65c2fb6c557e2b802e908986e8ec0b74 Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Fri, 7 Feb 2014 12:50:29 +0200 Subject: [PATCH] 046d:c52b Logitech, Inc. Unifying Receiver --- tools/hid2hci.rules | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/tools/hid2hci.rules b/tools/hid2hci.rules index 7db4572..1feca6e 100644 --- a/tools/hid2hci.rules +++ b/tools/hid2hci.rules @@ -16,6 +16,9 @@ KERNEL=="hiddev*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c70[345abce]|c71[ # Logitech, Inc. diNovo Edge Keyboard KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c714", \ RUN+="hid2hci --method=logitech-hid --devpath=%p" +# Logitech, Inc. Unifying Receiver +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c52b", \ + RUN+="hid2hci --method=logitech-hid --devpath=%p" ENV{DEVTYPE}!="usb_device", GOTO="hid2hci_end" -- 1.7.2.5 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/patches/bluez-06-broadcom-fixes.patch ================================================ From 874990be3b958bd3d5d5f61989f8d6314be3358a Mon Sep 17 00:00:00 2001 From: Phil Elwell <phil@raspberrypi.org> Date: Tue, 16 Feb 2016 16:40:46 +0000 Subject: [PATCH 1/4] bcm43xx: Add bcm43xx-3wire variant --- tools/hciattach.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/hciattach.c b/tools/hciattach.c index 1904ac5..835d5ff 100644 --- a/tools/hciattach.c +++ b/tools/hciattach.c @@ -1144,6 +1144,9 @@ struct uart_t uart[] = { { "bcm43xx", 0x0000, 0x0000, HCI_UART_H4, 115200, 3000000, FLOW_CTL, DISABLE_PM, NULL, bcm43xx, NULL }, + { "bcm43xx-3wire", 0x0000, 0x0000, HCI_UART_3WIRE, 115200, 3000000, + 0, DISABLE_PM, NULL, bcm43xx, NULL }, + { "ath3k", 0x0000, 0x0000, HCI_UART_ATH3K, 115200, 115200, FLOW_CTL, DISABLE_PM, NULL, ath3k_ps, ath3k_pm }, -- 1.9.1 From 74e6869ecce13b1066741ba995fc47b437c4c72f Mon Sep 17 00:00:00 2001 From: Phil Elwell <phil@raspberrypi.org> Date: Wed, 20 Jan 2016 16:00:37 +0000 Subject: [PATCH 3/4] Increase firmware load timeout to 30s --- tools/hciattach.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/hciattach.c b/tools/hciattach.c index 9391458..b1168d4 100644 --- a/tools/hciattach.c +++ b/tools/hciattach.c @@ -1287,7 +1287,7 @@ int main(int argc, char *argv[]) { struct uart_t *u = NULL; int detach, printpid, raw, opt, i, n, ld, err; - int to = 10; + int to = 30; int init_speed = 0; int send_break = 0; pid_t pid; -- 1.9.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/patches/bluez-07-broadcom-dont-set-speed-before-loading.patch ================================================ diff -Naur a/tools/hciattach_bcm43xx.c b/tools/hciattach_bcm43xx.c --- a/tools/hciattach_bcm43xx.c 2016-02-25 18:23:15.468717720 +0000 +++ b/tools/hciattach_bcm43xx.c 2016-02-25 18:24:08.028997243 +0000 @@ -368,9 +368,6 @@ if (bcm43xx_locate_patch(FIRMWARE_DIR, chip_name, fw_path)) { fprintf(stderr, "Patch not found, continue anyway\n"); } else { - if (bcm43xx_set_speed(fd, ti, speed)) - return -1; - if (bcm43xx_load_firmware(fd, fw_path)) return -1; @@ -379,6 +376,7 @@ perror("Can't set host baud rate"); return -1; } + sleep(1); if (bcm43xx_reset(fd)) return -1; ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/patches/bluez-08-hciattach-retry-device-reset-when-no-response.patch ================================================ From d4eafedce242f6c96b46b5a3122a39cc8d2f1373 Mon Sep 17 00:00:00 2001 From: meijjaa <jjmeijer88@gmail.com> Date: Mon, 23 Jan 2017 22:35:33 +0100 Subject: [PATCH] hciattach: retry device reset when no response Some bcm chips need a couple of retries to reset. Currently init will just timeout after a failed reset. Signed-off-by: meijjaa <jjmeijer88@gmail.com> --- tools/hciattach_bcm43xx.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tools/hciattach_bcm43xx.c b/tools/hciattach_bcm43xx.c index 81f38cb..4fd01e2 100644 --- a/tools/hciattach_bcm43xx.c +++ b/tools/hciattach_bcm43xx.c @@ -35,6 +35,7 @@ #include <dirent.h> #include <time.h> #include <limits.h> +#include <signal.h> #include "lib/bluetooth.h" #include "lib/hci.h" @@ -97,21 +98,31 @@ fail: return -1; } +int _fd; +void expired(int sig) +{ + unsigned char cmd[] = { HCI_COMMAND_PKT, 0x03, 0x0C, 0x00 }; + write(_fd, cmd, sizeof(cmd)) != sizeof(cmd); + alarm(4); +} + static int bcm43xx_reset(int fd) { unsigned char cmd[] = { HCI_COMMAND_PKT, 0x03, 0x0C, 0x00 }; unsigned char resp[CC_MIN_SIZE]; + _fd = fd; + signal(SIGALRM, expired); if (write(fd, cmd, sizeof(cmd)) != sizeof(cmd)) { fprintf(stderr, "Failed to write reset command\n"); return -1; } - + alarm(4); if (read_hci_event(fd, resp, sizeof(resp)) < CC_MIN_SIZE) { fprintf(stderr, "Failed to reset chip, invalid HCI event\n"); return -1; } - + alarm(0); if (resp[4] != cmd[1] || resp[5] != cmd[2] || resp[6] != CMD_SUCCESS) { fprintf(stderr, "Failed to reset chip, command failure\n"); return -1; -- 2.7.4 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/patches/bluez-09-hciattach-more-verbose.patch ================================================ --- a/tools/hciattach_bcm43xx.c +++ b/tools/hciattach_bcm43xx.c @@ -366,7 +366,7 @@ return -1; if (bcm43xx_locate_patch(FIRMWARE_DIR, chip_name, fw_path)) { - fprintf(stderr, "Patch not found, continue anyway\n"); + fprintf(stderr, "Patch not found for chip %s, continue anyway\n", chip_name); } else { if (bcm43xx_load_firmware(fd, fw_path)) return -1; ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/patches/bluez-11_sixaxis-fix-PID-navigation-controller.patch ================================================ From: Szymon Janc <szymon.janc@...> Subject: [PATCH 1/5] sixaxis: Fix PID for Navigation Controller Newsgroups: gmane.linux.bluez.kernel Date: 2015-06-15 18:28:26 GMT (36 weeks, 4 days, 21 hours and 32 minutes ago) Navigation Controller is using PID 0x042f over USB but PID 0x0268 (same as Dualshock 3) over BT. --- plugins/sixaxis.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) --- a/plugins/sixaxis.c +++ b/plugins/sixaxis.c @@ -363,7 +363,13 @@ info("sixaxis: setting up new device"); btd_device_device_set_name(device, cp->name); - btd_device_set_pnpid(device, cp->source, cp->vid, cp->pid, cp->version); + + /* if device reports different pid/vid on BT prefer those over USB */ + if (cp->bt_pid) + btd_device_set_pnpid(device, cp->source, cp->vid, cp->bt_pid, cp->version); + else + btd_device_set_pnpid(device, cp->source, cp->vid, cp->pid, cp->version); + btd_device_set_temporary(device, true); closure = g_new0(struct authentication_closure, 1); --- a/profiles/input/sixaxis.h +++ b/profiles/input/sixaxis.h @@ -38,6 +38,7 @@ uint16_t vid; uint16_t pid; uint16_t version; + uint16_t bt_pid; CablePairingType type; }; @@ -59,6 +60,7 @@ .vid = 0x054c, .pid = 0x042f, .version = 0x0000, + .bt_pid = 0x0268, .type = CABLE_PAIRING_SIXAXIS, }, { -- 2.1.4 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/patches/bluez-12-fix-obexd-after-5_50.patch ================================================ diff --git a/Makefile.obexd b/Makefile.obexd index cd3ace4..89f1609 100644 --- a/Makefile.obexd +++ b/Makefile.obexd @@ -8,8 +8,6 @@ endif EXTRA_DIST += obexd/src/obex.service.in obexd/src/org.bluez.obex.service -if OBEX - obex_plugindir = $(libdir)/obex/plugins obexd_builtin_modules = @@ -33,6 +31,8 @@ obexd_builtin_sources += obexd/plugins/opp.c obexd_builtin_modules += ftp obexd_builtin_sources += obexd/plugins/ftp.c obexd/plugins/ftp.h +if OBEX + obexd_builtin_modules += irmc obexd_builtin_sources += obexd/plugins/irmc.c @@ -47,6 +47,8 @@ obexd_builtin_sources += obexd/plugins/mas.c obexd/src/map_ap.h \ obexd/plugins/messages.h \ obexd/plugins/messages-dummy.c +endif + obexd_builtin_modules += mns obexd_builtin_sources += obexd/client/mns.c obexd/src/map_ap.h \ obexd/client/map-event.h @@ -90,8 +92,6 @@ obexd_src_obexd_CFLAGS = $(AM_CFLAGS) @GLIB_CFLAGS@ @DBUS_CFLAGS@ \ obexd_src_obexd_CPPFLAGS = -I$(builddir)/lib -I$(builddir)/obexd/src -endif - obexd_src_obexd_SHORTNAME = obexd obexd_builtin_files = obexd/src/builtin.h $(obexd_builtin_nodist) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/patches/bluez-20-sixaxis-autotrust.patch ================================================ --- a/plugins/sixaxis.c +++ b/plugins/sixaxis.c @@ -370,6 +370,7 @@ else btd_device_set_pnpid(device, cp->source, cp->vid, cp->pid, cp->version); + btd_device_set_trusted(device, true); btd_device_set_temporary(device, true); closure = g_new0(struct authentication_closure, 1); ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/patches/bluez-21-hciattach-add-QCA9377-Tuffello-support.patch ================================================ From b42a087411199d7f480f1683bddd3206c5fd17b1 Mon Sep 17 00:00:00 2001 From: Gary Bisson <gary.bisson@boundarydevices.com> Date: Wed, 17 Aug 2016 11:36:28 +0200 Subject: [PATCH] hciattach: add QCA9377 Tuffello support From CodeAurora repository: https://source.codeaurora.org/quic/la/platform/external/bluetooth/bluez/ Modifications: - code indentation - remove verbose traces - use H4 protocol instead of IBS Also squashed: hciattach_rome: simplify baudrate setting hciattach_rome: do not override module internal MAC address hciattach_rome: force IBS to disabled in NVM hciattach_rome: display ROM and TLV info by default Signed-off-by: Gary Bisson <gary.bisson@boundarydevices.com> --- Makefile.tools | 1 + android/Android.mk | 1 + tools/hciattach.c | 12 + tools/hciattach.h | 1 + tools/hciattach_rome.c | 1872 ++++++++++++++++++++++++++++++++++++++++ tools/hciattach_rome.h | 388 +++++++++ 6 files changed, 2275 insertions(+) create mode 100644 tools/hciattach_rome.c create mode 100644 tools/hciattach_rome.h diff --git a/Makefile.tools b/Makefile.tools index b7b422506..e0e995089 100644 --- a/Makefile.tools +++ b/Makefile.tools @@ -304,6 +304,7 @@ tools_hciattach_SOURCES = tools/hciattach.c tools/hciattach.h \ tools/hciattach_ti.c \ tools/hciattach_tialt.c \ tools/hciattach_ath3k.c \ + tools/hciattach_rome.c \ tools/hciattach_qualcomm.c \ tools/hciattach_intel.c \ tools/hciattach_bcm43xx.c diff --git a/android/Android.mk b/android/Android.mk index 76a826b47..01599c04b 100644 --- a/android/Android.mk +++ b/android/Android.mk @@ -696,6 +696,7 @@ LOCAL_SRC_FILES := \ bluez/tools/hciattach_ti.c \ bluez/tools/hciattach_tialt.c \ bluez/tools/hciattach_ath3k.c \ + bluez/tools/hciattach_rome.c \ bluez/tools/hciattach_qualcomm.c \ bluez/tools/hciattach_intel.c \ bluez/tools/hciattach_bcm43xx.c \ diff --git a/tools/hciattach.c b/tools/hciattach.c index fad176c9b..02a65c692 100644 --- a/tools/hciattach.c +++ b/tools/hciattach.c @@ -263,6 +263,11 @@ static int ath3k_pm(int fd, struct uart_t *u, struct termios *ti) return ath3k_post(fd, u->pm); } +static int qca(int fd, struct uart_t *u, struct termios *ti) +{ + return qca_soc_init(fd, u->speed, u->bdaddr); +} + static int qualcomm(int fd, struct uart_t *u, struct termios *ti) { return qualcomm_init(fd, u->speed, ti, u->bdaddr); @@ -1093,6 +1098,10 @@ struct uart_t uart[] = { { "ath3k", 0x0000, 0x0000, HCI_UART_ATH3K, 115200, 115200, FLOW_CTL, DISABLE_PM, NULL, ath3k_ps, ath3k_pm }, + /* QCA ROME */ + { "qca", 0x0000, 0x0000, HCI_UART_H4, 115200, 115200, + FLOW_CTL, DISABLE_PM, NULL, qca, NULL }, + /* QUALCOMM BTS */ { "qualcomm", 0x0000, 0x0000, HCI_UART_H4, 115200, 115200, FLOW_CTL, DISABLE_PM, NULL, qualcomm, NULL }, @@ -1145,6 +1154,9 @@ static int init_uart(char *dev, struct uart_t *u, int send_break, int raw) if (u->flags & AMP_DEV) flags |= 1 << HCI_UART_CREATE_AMP; + if (!strncmp(u->type, "qca", 3)) + flags |= 1 << HCI_UART_RESET_ON_INIT; + fd = open(dev, O_RDWR | O_NOCTTY); if (fd < 0) { perror("Can't open serial port"); diff --git a/tools/hciattach.h b/tools/hciattach.h index 249aab49e..85c801ccf 100644 --- a/tools/hciattach.h +++ b/tools/hciattach.h @@ -65,6 +65,7 @@ int bgb2xx_init(int dd, bdaddr_t *bdaddr); int ath3k_init(int fd, int speed, int init_speed, char *bdaddr, struct termios *ti); int ath3k_post(int fd, int pm); +int qca_soc_init(int fd, int speed, char *bdaddr); int qualcomm_init(int fd, int speed, struct termios *ti, const char *bdaddr); int intel_init(int fd, int init_speed, int *speed, struct termios *ti); int bcm43xx_init(int fd, int def_speed, int speed, struct termios *ti, diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c new file mode 100644 index 000000000..9a7f222c4 --- /dev/null +++ b/tools/hciattach_rome.c @@ -0,0 +1,1872 @@ +/* + * + * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Not a Contribution. + * + * Copyright 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you + * may not use this file except in compliance with the License. You may + * obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. + * + */ + +/****************************************************************************** + * + * Filename: hciattach_rome.c + * + * Description: Contains controller-specific functions, like + * firmware patch download + * low power mode operations + * + ******************************************************************************/ + +#define MODULE_HAS_MAC_ADDR +#define LOG_TAG "bt_vendor" +#include <stdio.h> +#include <unistd.h> +#include <sys/socket.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/ioctl.h> +#include <signal.h> +#include <time.h> +#include <errno.h> +#include <fcntl.h> +#include <dirent.h> +#include <ctype.h> +#include <stdlib.h> +#include <string.h> +#include <termios.h> +#include <bluetooth/bluetooth.h> +#include "hciattach_rome.h" +#include "hciattach.h" + +/****************************************************************************** + ** Variables + ******************************************************************************/ +FILE *file; +unsigned char *phdr_buffer; +unsigned char *pdata_buffer = NULL; +patch_info rampatch_patch_info; +int rome_ver = ROME_VER_UNKNOWN; +unsigned char gTlv_type; +unsigned char gtlv_dwndcfg; +char *rampatch_file_path; +char *nvm_file_path; +vnd_userial_cb_t vnd_userial; +unsigned char wait_vsc_evt = TRUE; + +/***************************************************************************** + ** Functions + *****************************************************************************/ + +/******************************************************************************* + ** + ** Function userial_to_tcio_baud + ** + ** Description helper function converts USERIAL baud rates into TCIO + ** conforming baud rates + ** + ** Returns TRUE/FALSE + ** + *******************************************************************************/ +unsigned char userial_to_tcio_baud(unsigned char cfg_baud, unsigned int *baud) +{ + if (cfg_baud == USERIAL_BAUD_115200) + *baud = B115200; + else if (cfg_baud == USERIAL_BAUD_4M) + *baud = B4000000; + else if (cfg_baud == USERIAL_BAUD_3M) + *baud = B3000000; + else if (cfg_baud == USERIAL_BAUD_2M) + *baud = B2000000; + else if (cfg_baud == USERIAL_BAUD_1M) + *baud = B1000000; + else if (cfg_baud == USERIAL_BAUD_921600) + *baud = B921600; + else if (cfg_baud == USERIAL_BAUD_460800) + *baud = B460800; + else if (cfg_baud == USERIAL_BAUD_230400) + *baud = B230400; + else if (cfg_baud == USERIAL_BAUD_57600) + *baud = B57600; + else if (cfg_baud == USERIAL_BAUD_19200) + *baud = B19200; + else if (cfg_baud == USERIAL_BAUD_9600) + *baud = B9600; + else if (cfg_baud == USERIAL_BAUD_1200) + *baud = B1200; + else if (cfg_baud == USERIAL_BAUD_600) + *baud = B600; + else { + fprintf(stderr, "userial vendor open: unsupported baud idx %i\n", cfg_baud); + *baud = B115200; + return FALSE; + } + + return TRUE; +} + + +/******************************************************************************* + ** + ** Function userial_vendor_set_baud + ** + ** Description Set new baud rate + ** + ** Returns None + ** + *******************************************************************************/ +void userial_vendor_set_baud(unsigned char userial_baud) +{ + unsigned int tcio_baud; + + if (tcgetattr(vnd_userial.fd, &vnd_userial.termios) < 0) { + perror("Can't get port settings"); + return; + } + cfmakeraw(&vnd_userial.termios); + vnd_userial.termios.c_cflag |= CLOCAL; + vnd_userial.termios.c_cflag |= CREAD; + vnd_userial.termios.c_cflag |= CS8; + tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios); + + userial_to_tcio_baud(userial_baud, &tcio_baud); + + cfsetospeed(&vnd_userial.termios, tcio_baud); + cfsetispeed(&vnd_userial.termios, tcio_baud); + tcsetattr(vnd_userial.fd, TCSADRAIN, &vnd_userial.termios); /* don't change speed until last write done */ + +} + + +/******************************************************************************* + ** + ** Function userial_vendor_ioctl + ** + ** Description ioctl inteface + ** + ** Returns None + ** + *******************************************************************************/ +int userial_vendor_ioctl(int fd, userial_vendor_ioctl_op_t op, int *p_data) +{ + int err = -1; + struct termios ti; + + if (tcgetattr(fd, &ti) < 0) { + perror("Can't get port settings"); + return -1; + } + cfmakeraw(&ti); + ti.c_cflag |= CLOCAL; + ti.c_cflag |= CREAD; + ti.c_cflag |= CS8; + + switch(op) { +#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) + case USERIAL_OP_ASSERT_BT_WAKE: + VNDUSERIALDBG("## userial_vendor_ioctl: Asserting BT_Wake ##"); + err = ioctl(fd, USERIAL_IOCTL_BT_WAKE_ASSERT, NULL); + break; + + case USERIAL_OP_DEASSERT_BT_WAKE: + VNDUSERIALDBG("## userial_vendor_ioctl: De-asserting BT_Wake ##"); + err = ioctl(fd, USERIAL_IOCTL_BT_WAKE_DEASSERT, NULL); + break; + + case USERIAL_OP_GET_BT_WAKE_STATE: + err = ioctl(fd, USERIAL_IOCTL_BT_WAKE_GET_ST, p_data); + break; +#endif // (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) + case USERIAL_OP_FLOW_ON: + ti.c_cflag |= CRTSCTS; + if (err = tcsetattr(fd, TCSANOW, &ti) < 0) { + perror("Can't set port settings"); + return -1; + } + + break; + + case USERIAL_OP_FLOW_OFF: + ti.c_cflag &= ~CRTSCTS; + if (err = tcsetattr(fd, TCSANOW, &ti) < 0) { + fprintf(stderr, "Can't set port settings"); + return -1; + } + break; + + default: + break; + } + + return err; +} + + +int get_vs_hci_event(unsigned char *rsp) +{ + int err = 0, soc_id =0; + unsigned char paramlen = 0; + + if ( (rsp[EVENTCODE_OFFSET] == VSEVENT_CODE) || (rsp[EVENTCODE_OFFSET] == EVT_CMD_COMPLETE)) + PR_DBG("%s: Received HCI-Vendor Specific event\n", __FUNCTION__); + else { + fprintf(stderr, "%s: Failed to receive HCI-Vendor Specific event\n", __FUNCTION__); + err = -EIO; + goto failed; + } + + /* Check the status of the operation */ + switch ( rsp[CMD_RSP_OFFSET] ) { + case EDL_CMD_REQ_RES_EVT: + switch(rsp[RSP_TYPE_OFFSET]) { + case EDL_PATCH_VER_RES_EVT: + case EDL_APP_VER_RES_EVT: + PR_INFO("Current Product ID\t\t: 0x%08x\n", + (unsigned int)(rsp[PATCH_PROD_ID_OFFSET +3] << 24 | + rsp[PATCH_PROD_ID_OFFSET+2] << 16 | + rsp[PATCH_PROD_ID_OFFSET+1] << 8 | + rsp[PATCH_PROD_ID_OFFSET] )); + + /* Patch Version indicates FW patch version */ + PR_INFO("Current Patch Version\t\t: 0x%04x\n", + (unsigned short)(rsp[PATCH_PATCH_VER_OFFSET + 1] << 8 | + rsp[PATCH_PATCH_VER_OFFSET] )); + + /* ROM Build Version indicates ROM build version like 1.0/1.1/2.0 */ + rome_ver = (int)(rsp[PATCH_ROM_BUILD_VER_OFFSET + 1] << 8 | + rsp[PATCH_ROM_BUILD_VER_OFFSET]); + PR_INFO("Current ROM Build Version\t: 0x%04x\n", rome_ver); + + /* In case rome 1.0/1.1, there is no SOC ID version available */ + if (paramlen - 10) { + soc_id = (unsigned int)(rsp[PATCH_SOC_VER_OFFSET +3] << 24 | + rsp[PATCH_SOC_VER_OFFSET+2] << 16 | + rsp[PATCH_SOC_VER_OFFSET+1] << 8 | + rsp[PATCH_SOC_VER_OFFSET]); + PR_INFO("Current SOC Version\t\t: 0x%08x\n", soc_id); + } + + /* Rome Chipset Version can be decided by Patch version and SOC version, + Upper 2 bytes will be used for Patch version and Lower 2 bytes will be + used for SOC as combination for BT host driver */ + rome_ver = (rome_ver << 16) | (soc_id & 0x0000ffff); + break; + case EDL_TVL_DNLD_RES_EVT: + case EDL_CMD_EXE_STATUS_EVT: + switch (err = rsp[CMD_STATUS_OFFSET]) { + case HCI_CMD_SUCCESS: + PR_DBG("%s: Download Packet successfully!\n", __FUNCTION__); + break; + case PATCH_LEN_ERROR: + fprintf(stderr, "%s: Invalid patch length argument passed for EDL PATCH " + "SET REQ cmd\n", __FUNCTION__); + break; + case PATCH_VER_ERROR: + fprintf(stderr, "%s: Invalid patch version argument passed for EDL PATCH " + "SET REQ cmd\n", __FUNCTION__); + break; + case PATCH_CRC_ERROR: + fprintf(stderr, "%s: CRC check of patch failed!!!\n", __FUNCTION__); + break; + case PATCH_NOT_FOUND: + fprintf(stderr, "%s: Invalid patch data!!!\n", __FUNCTION__); + break; + case TLV_TYPE_ERROR: + fprintf(stderr, "%s: TLV Type Error !!!\n", __FUNCTION__); + break; + default: + fprintf(stderr, "%s: Undefined error (0x%x)", __FUNCTION__, err); + break; + } + break; + } + break; + + case NVM_ACCESS_CODE: + PR_DBG("%s: NVM Access Code!!!\n", __FUNCTION__); + err = HCI_CMD_SUCCESS; + break; + case EDL_SET_BAUDRATE_RSP_EVT: + /* Rome 1.1 has bug with the response, so it should ignore it. */ + if (rsp[BAUDRATE_RSP_STATUS_OFFSET] != BAUDRATE_CHANGE_SUCCESS) { + fprintf(stderr, "%s: Set Baudrate request failed - 0x%x\n", __FUNCTION__, + rsp[CMD_STATUS_OFFSET]); + err = -1; + } + break; + default: + fprintf(stderr, "%s: Not a valid status!!!\n", __FUNCTION__); + err = -1; + break; + } + +failed: + return err; +} + + +int wait_for_data(int fd, int maxTimeOut) +{ + fd_set infids; + struct timeval timeout; + + if (maxTimeOut <= 0) { + fprintf(stderr, "%s: Invalid timeout value specified", __func__); + return -EINVAL; + } + + FD_ZERO (&infids); + FD_SET (fd, &infids); + timeout.tv_sec = maxTimeOut; + timeout.tv_usec = 0; + + /* Check whether data is available in TTY buffer before calling read() */ + if (select (fd + 1, &infids, NULL, NULL, &timeout) < 1) { + fprintf(stderr, "%s: Timing out on select for %d secs.\n", __FUNCTION__, maxTimeOut); + return -1; + } + + return 1; +} + +/* + * Read an VS HCI event from the given file descriptor. + */ +int read_vs_hci_event(int fd, unsigned char* buf, int size) +{ + int remain, r, retry = 0; + int count = 0; + + if (size <= 0) { + fprintf(stderr, "Invalid size arguement!\n"); + return -1; + } + + /* Check whether data is available in TTY buffer before calling read() */ + if (wait_for_data(fd, SELECT_TIMEOUT) < 1) + return -1; + + /* The first byte identifies the packet type. For HCI event packets, it + * should be 0x04, so we read until we get to the 0x04. */ + /* It will keep reading until find 0x04 byte */ + while (1) { + /* Read UART Buffer for HCI-DATA */ + r = read(fd, buf, 1); + if (r <= 0) { + fprintf(stderr, "%s: read() failed. error: %d\n", + __FUNCTION__, r); + return -1; + } + + /* Check if received data is HCI-DATA or not. + * If not HCI-DATA, then retry reading the UART Buffer once. + * Sometimes there could be corruption on the UART lines and to + * avoid that retry once reading the UART Buffer for HCI-DATA. + */ + if (buf[0] == 0x04) { /* Recvd. HCI DATA */ + retry = 0; + break; + } + else if (retry < MAX_RETRY_CNT) { /* Retry mechanism */ + retry++; + fprintf(stderr, "%s: Not an HCI-VS-Event! buf[0]: %d", + __FUNCTION__, buf[0]); + if (wait_for_data(fd, SELECT_TIMEOUT) < 1) + return -1; + else /* Data available in UART Buffer: Continue to read */ + continue; + } + else { /* RETRY failed : Exiting with failure */ + fprintf(stderr, "%s: RETRY failed!", __FUNCTION__); + return -1; + } + } + count++; + + /* The next two bytes are the event code and parameter total length. */ + while (count < 3) { + r = read(fd, buf + count, 3 - count); + if ((r <= 0) || (buf[1] != 0xFF )) { + fprintf(stderr, "It is not VS event !!\n"); + return -1; + } + count += r; + } + + /* Now we read the parameters. */ + if (buf[2] < (size - 3)) + remain = buf[2]; + else + remain = size - 3; + + while ((count - 3) < remain) { + r = read(fd, buf + count, remain - (count - 3)); + if (r <= 0) + return -1; + count += r; + } + + /* Check if the set patch command is successful or not */ + if (get_vs_hci_event(buf) != HCI_CMD_SUCCESS) + return -1; + + return count; +} + + +int hci_send_vs_cmd(int fd, unsigned char *cmd, unsigned char *rsp, int size) +{ + int ret = 0; + + /* Send the HCI command packet to UART for transmission */ + ret = write(fd, cmd, size); + if (ret != size) { + fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, ret); + goto failed; + } + + if (wait_vsc_evt) { + /* Check for response from the Controller */ + if (read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE) < 0) { + ret = -ETIMEDOUT; + fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); + goto failed; + } + } + +failed: + return ret; +} + +void frame_hci_cmd_pkt( + unsigned char *cmd, + int edl_cmd, unsigned int p_base_addr, + int segtNo, int size + ) +{ + int offset = 0; + hci_command_hdr *cmd_hdr; + + memset(cmd, 0x0, HCI_MAX_CMD_SIZE); + + cmd_hdr = (void *) (cmd + 1); + + cmd[0] = HCI_COMMAND_PKT; + cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, HCI_PATCH_CMD_OCF); + cmd_hdr->plen = size; + cmd[4] = edl_cmd; + + switch (edl_cmd) { + case EDL_PATCH_SET_REQ_CMD: + /* Copy the patch header info as CMD params */ + memcpy(&cmd[5], phdr_buffer, PATCH_HDR_LEN); + PR_DBG("%s: Sending EDL_PATCH_SET_REQ_CMD\n", __FUNCTION__); + PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", + segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); + break; + case EDL_PATCH_DLD_REQ_CMD: + offset = ((segtNo - 1) * MAX_DATA_PER_SEGMENT); + p_base_addr += offset; + cmd_hdr->plen = (size + 6); + cmd[5] = (size + 4); + cmd[6] = EXTRACT_BYTE(p_base_addr, 0); + cmd[7] = EXTRACT_BYTE(p_base_addr, 1); + cmd[8] = EXTRACT_BYTE(p_base_addr, 2); + cmd[9] = EXTRACT_BYTE(p_base_addr, 3); + memcpy(&cmd[10], (pdata_buffer + offset), size); + + PR_DBG("%s: Sending EDL_PATCH_DLD_REQ_CMD: size: %d bytes\n", + __FUNCTION__, size); + PR_DBG("HCI-CMD %d:\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t" + "0x%x\t0x%x\t0x%x\t\n", segtNo, cmd[0], cmd[1], cmd[2], + cmd[3], cmd[4], cmd[5], cmd[6], cmd[7], cmd[8], cmd[9]); + break; + case EDL_PATCH_ATCH_REQ_CMD: + PR_DBG("%s: Sending EDL_PATCH_ATTACH_REQ_CMD\n", __FUNCTION__); + PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", + segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); + break; + case EDL_PATCH_RST_REQ_CMD: + PR_DBG("%s: Sending EDL_PATCH_RESET_REQ_CMD\n", __FUNCTION__); + PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", + segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); + break; + case EDL_PATCH_VER_REQ_CMD: + PR_DBG("%s: Sending EDL_PATCH_VER_REQ_CMD\n", __FUNCTION__); + PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", + segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); + break; + case EDL_PATCH_TLV_REQ_CMD: + PR_DBG("%s: Sending EDL_PATCH_TLV_REQ_CMD\n", __FUNCTION__); + /* Parameter Total Length */ + cmd[3] = size +2; + + /* TLV Segment Length */ + cmd[5] = size; + PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", + segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4], cmd[5]); + offset = (segtNo * MAX_SIZE_PER_TLV_SEGMENT); + memcpy(&cmd[6], (pdata_buffer + offset), size); + break; + default: + fprintf(stderr, "%s: Unknown EDL CMD !!!\n", __FUNCTION__); + } +} + +void rome_extract_patch_header_info(unsigned char *buf) +{ + int index; + + /* Extract patch id */ + for (index = 0; index < 4; index++) + rampatch_patch_info.patch_id |= + (LSH(buf[index + P_ID_OFFSET], (index * 8))); + + /* Extract (ROM and BUILD) version information */ + for (index = 0; index < 2; index++) + rampatch_patch_info.patch_ver.rom_version |= + (LSH(buf[index + P_ROME_VER_OFFSET], (index * 8))); + + for (index = 0; index < 2; index++) + rampatch_patch_info.patch_ver.build_version |= + (LSH(buf[index + P_BUILD_VER_OFFSET], (index * 8))); + + /* Extract patch base and entry addresses */ + for (index = 0; index < 4; index++) + rampatch_patch_info.patch_base_addr |= + (LSH(buf[index + P_BASE_ADDR_OFFSET], (index * 8))); + + /* Patch BASE & ENTRY addresses are same */ + rampatch_patch_info.patch_entry_addr = rampatch_patch_info.patch_base_addr; + + /* Extract total length of the patch payload */ + for (index = 0; index < 4; index++) + rampatch_patch_info.patch_length |= + (LSH(buf[index + P_LEN_OFFSET], (index * 8))); + + /* Extract the CRC checksum of the patch payload */ + for (index = 0; index < 4; index++) + rampatch_patch_info.patch_crc |= + (LSH(buf[index + P_CRC_OFFSET], (index * 8))); + + /* Extract patch control value */ + for (index = 0; index < 4; index++) + rampatch_patch_info.patch_ctrl |= + (LSH(buf[index + P_CONTROL_OFFSET], (index * 8))); + + fprintf(stderr, "PATCH_ID\t : 0x%x\n", rampatch_patch_info.patch_id); + fprintf(stderr, "ROM_VERSION\t : 0x%x\n", rampatch_patch_info.patch_ver.rom_version); + fprintf(stderr, "BUILD_VERSION\t : 0x%x\n", rampatch_patch_info.patch_ver.build_version); + fprintf(stderr, "PATCH_LENGTH\t : 0x%x\n", rampatch_patch_info.patch_length); + fprintf(stderr, "PATCH_CRC\t : 0x%x\n", rampatch_patch_info.patch_crc); + fprintf(stderr, "PATCH_CONTROL\t : 0x%x\n", rampatch_patch_info.patch_ctrl); + fprintf(stderr, "PATCH_BASE_ADDR\t : 0x%x\n", rampatch_patch_info.patch_base_addr); + +} + +int rome_edl_set_patch_request(int fd) +{ + int size, err; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + + /* Frame the HCI CMD to be sent to the Controller */ + frame_hci_cmd_pkt(cmd, EDL_PATCH_SET_REQ_CMD, 0, + -1, PATCH_HDR_LEN + 1); + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); + if (err != size) { + fprintf(stderr, "Failed to set the patch info to the Controller!\n"); + goto error; + } + + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__); + goto error; + } +error: + return err; +} + +int rome_edl_patch_download_request(int fd) +{ + int no_of_patch_segment; + int index = 1, err = 0, size = 0; + unsigned int p_base_addr; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + + no_of_patch_segment = (rampatch_patch_info.patch_length / + MAX_DATA_PER_SEGMENT); + + /* Initialize the patch base address from the one read from bin file */ + p_base_addr = rampatch_patch_info.patch_base_addr; + + /* + * Depending upon size of the patch payload, download the patches in + * segments with a max. size of 239 bytes + */ + for (index = 1; index <= no_of_patch_segment; index++) { + /* Frame the HCI CMD PKT to be sent to Controller*/ + frame_hci_cmd_pkt(cmd, EDL_PATCH_DLD_REQ_CMD, p_base_addr, + index, MAX_DATA_PER_SEGMENT); + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Initialize the RSP packet everytime to 0 */ + memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); + if (err != size) { + fprintf(stderr, "Failed to send the patch payload to the Controller!\n"); + goto error; + } + + /* Read Command Complete Event */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to downlaod patch segment: %d!\n", + __FUNCTION__, index); + goto error; + } + } + + /* Check if any pending patch data to be sent */ + size = (rampatch_patch_info.patch_length < MAX_DATA_PER_SEGMENT) ? + rampatch_patch_info.patch_length : + (rampatch_patch_info.patch_length % MAX_DATA_PER_SEGMENT); + + if (size) { + /* Frame the HCI CMD PKT to be sent to Controller*/ + frame_hci_cmd_pkt(cmd, EDL_PATCH_DLD_REQ_CMD, p_base_addr, index, size); + + /* Initialize the RSP packet everytime to 0 */ + memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); + if (err != size) { + fprintf(stderr, "Failed to send the patch payload to the Controller!\n"); + goto error; + } + + /* Read Command Complete Event */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to downlaod patch segment: %d!\n", + __FUNCTION__, index); + goto error; + } + } + +error: + return err; +} + +static int rome_download_rampatch(int fd) +{ + int c, size, index, ret = -1; + + /* Get handle to the RAMPATCH binary file */ + fprintf(stderr, "%s: Getting handle to the RAMPATCH binary file from %s\n", __FUNCTION__, ROME_FW_PATH); + file = fopen(ROME_FW_PATH, "r"); + if (file == NULL) { + fprintf(stderr, "%s: Failed to get handle to the RAMPATCH bin file!\n", + __FUNCTION__); + return -ENFILE; + } + + /* Allocate memory for the patch headder info */ + fprintf(stderr, "%s: Allocating memory for the patch header\n", __FUNCTION__); + phdr_buffer = (unsigned char *) malloc(PATCH_HDR_LEN + 1); + if (phdr_buffer == NULL) { + fprintf(stderr, "%s: Failed to allocate memory for patch header\n", + __FUNCTION__); + goto phdr_alloc_failed; + } + for (index = 0; index < PATCH_HDR_LEN + 1; index++) + phdr_buffer[index] = 0x0; + + /* Read 28 bytes of patch header information */ + fprintf(stderr, "%s: Reading patch header info\n", __FUNCTION__); + index = 0; + do { + c = fgetc (file); + phdr_buffer[index++] = (unsigned char)c; + } while (index != PATCH_HDR_LEN); + + /* Save the patch header info into local structure */ + fprintf(stderr, "%s: Saving patch hdr. info\n", __FUNCTION__); + rome_extract_patch_header_info((unsigned char *)phdr_buffer); + + /* Set the patch header info onto the Controller */ + ret = rome_edl_set_patch_request(fd); + if (ret < 0) { + fprintf(stderr, "%s: Error setting the patchheader info!\n", __FUNCTION__); + goto pdata_alloc_failed; + } + + /* Allocate memory for the patch payload */ + fprintf(stderr, "%s: Allocating memory for patch payload\n", __FUNCTION__); + size = rampatch_patch_info.patch_length; + pdata_buffer = (unsigned char *) malloc(size+1); + if (pdata_buffer == NULL) { + fprintf(stderr, "%s: Failed to allocate memory for patch payload\n", + __FUNCTION__); + goto pdata_alloc_failed; + } + for (index = 0; index < size+1; index++) + pdata_buffer[index] = 0x0; + + /* Read the patch data from Rampatch binary image */ + fprintf(stderr, "%s: Reading patch payload from RAMPATCH file\n", __FUNCTION__); + index = 0; + do { + c = fgetc (file); + pdata_buffer[index++] = (unsigned char)c; + } while (c != EOF); + + /* Downloading patches in segments to controller */ + ret = rome_edl_patch_download_request(fd); + if (ret < 0) { + fprintf(stderr, "%s: Error downloading patch segments!\n", __FUNCTION__); + goto cleanup; + } +cleanup: + free(pdata_buffer); +pdata_alloc_failed: + free(phdr_buffer); +phdr_alloc_failed: + fclose(file); + + return ret; +} + +int rome_attach_rampatch(int fd) +{ + int size, err; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + + /* Frame the HCI CMD to be sent to the Controller */ + frame_hci_cmd_pkt(cmd, EDL_PATCH_ATCH_REQ_CMD, 0, + -1, EDL_PATCH_CMD_LEN); + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); + if (err != size) { + fprintf(stderr, "Failed to attach the patch payload to the Controller!\n"); + goto error; + } + + /* Read Command Complete Event */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to attach the patch segment(s)\n", __FUNCTION__); + goto error; + } +error: + return err; +} + +int rome_rampatch_reset(int fd) +{ + int size, err = 0; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + struct timespec tm = { 0, 100*1000*1000 }; /* 100 ms */ + + /* Frame the HCI CMD to be sent to the Controller */ + frame_hci_cmd_pkt(cmd, EDL_PATCH_RST_REQ_CMD, 0, + -1, EDL_PATCH_CMD_LEN); + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); + + /* Send HCI Command packet to Controller */ + err = write(fd, cmd, size); + if (err != size) { + fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); + goto error; + } + + /* + * Controller doesn't sends any response for the patch reset + * command. HOST has to wait for 100ms before proceeding. + */ + nanosleep(&tm, NULL); + +error: + return err; +} + +int get_value_from_config(char *file_path,char *param) +{ + FILE *pfile = NULL; + char *line = NULL; + char *pch = NULL; + char param_str[20]; + int bytes_read = 0, position; + int ret = -1; + + if (!file_path || !param) { + fprintf(stderr,"Invalid arguments\n"); + return -EINVAL; + } + + pfile = fopen(file_path, "r" ); + if (!pfile) { + fprintf(stderr, "Failed to open %s\n", file_path); + return ret; + } + + while (getline(&line, &bytes_read, pfile) > 0 ) { + if (line[0] != '#' && line[0] != '\n') { + pch = memchr(line, '=', strlen(line)); + if (pch != NULL) { + position = pch - line; + strncpy(param_str, line, position); + if (strncmp(param_str, param, position) == 0) { + ret = atoi(pch + 1); + break; + } + } + } + } + free(line); + fclose(pfile); + return ret; +} + +int read_bd_address(unsigned char *bdaddr) +{ + int fd = -1; + int readPtr = 0; + unsigned char data[BD_ADDR_LEN]; + + /* Open the persist file for reading device address*/ + fd = open("/etc/bluetooth/.bt_nv.bin", O_RDONLY); + if (fd < 0) { + fprintf(stderr, "%s: Open failed: Programming default BD ADDR\n", __func__); + return -1; + } + + /* Read the NVM Header : fp will be advanced by readPtr number of bytes */ + readPtr = read(fd, data, PERSIST_HEADER_LEN); + if (readPtr > 0) + fprintf(stderr, "%s: Persist header data: %02x \t %02x \t %02x\n", __func__, + data[NVITEM], data[RDWR_PROT], data[NVITEM_SIZE]); + else { + fprintf(stderr, "%s: Read from persist memory failed : Programming default" + " BD ADDR\n"); + close(fd); + return -1; + } + + /* Check for BD ADDR length before programming */ + if (data[NVITEM_SIZE] != BD_ADDR_LEN) { + fprintf(stderr, "Invalid BD ADDR: Programming default BD ADDR!\n"); + close(fd); + return -1; + } + + /* Read the BD ADDR info */ + readPtr = read(fd, data, BD_ADDR_LEN); + if (readPtr > 0) + fprintf(stderr, "BD-ADDR: ==> %02x:%02x:%02x:%02x:%02x:%02x\n", data[0], + data[1], data[2], data[3], data[4], data[5]); + else { + fprintf(stderr, "%s: Read from persist memory failed : Programming default" + " BD ADDR\n"); + close(fd); + return -1; + } + memcpy(bdaddr, data, BD_ADDR_LEN); + close(fd); + return 0; +} + +int isSpeedValid(int speed, unsigned char *baud_rate) +{ + switch(speed) { + case 9600: + *baud_rate = BAUDRATE_9600; + break; + case 19200: + *baud_rate = BAUDRATE_19200; + break; + case 57600: + *baud_rate = BAUDRATE_57600; + break; + case 115200: + *baud_rate = BAUDRATE_115200; + break; + case 230400: + *baud_rate = BAUDRATE_230400; + break; + case 460800: + *baud_rate = BAUDRATE_460800; + break; + case 921600: + *baud_rate = BAUDRATE_921600; + break; + case 1000000: + *baud_rate = BAUDRATE_1000000; + break; + case 2000000: + *baud_rate = BAUDRATE_2000000; + break; + case 3000000: + *baud_rate = BAUDRATE_3000000; + break; + case 4000000: + *baud_rate = BAUDRATE_4000000; + break; + case 300: + case 600: + case 1200: + case 2400: + default: + fprintf(stderr, "Invalid baudrate, default to 115200!\n"); + *baud_rate = BAUDRATE_115200; + break; + } + return -1; +} + +int rome_get_tlv_file(char *file_path, unsigned char baud_rate) +{ + FILE * pFile; + long fileSize; + int readSize, nvm_length, nvm_index, i; + unsigned short nvm_tag_len; + tlv_patch_info *ptlv_header; + tlv_nvm_hdr *nvm_ptr; + unsigned char data_buf[PRINT_BUF_SIZE]={0,}; + unsigned char *nvm_byte_ptr; + unsigned char bdaddr[6]; + unsigned short pcm_value, ibs_value; + unsigned short deep_sleep_value; + + pFile = fopen ( file_path , "r" ); + if (pFile==NULL) { + fprintf(stderr, "%s File Open Fail\n", file_path); + return -1; + } + + /* Get File Size */ + fseek (pFile , 0 , SEEK_END); + + if ((fileSize = ftell(pFile)) < 0) { + fprintf(stderr, "%s: fail to get current file position\n", file_path); + fclose(pFile); + return -1; + } + + if (fileSize == 0) { + fprintf(stderr, "%s: no content in the file\n", file_path); + fclose(pFile); + return -1; + } + + rewind (pFile); + + pdata_buffer = (unsigned char*) malloc (sizeof(char)*fileSize); + if (pdata_buffer == NULL) { + fprintf(stderr, "Allocated Memory failed\n"); + fclose (pFile); + return -1; + } + + /* Copy file into allocated buffer */ + readSize = fread (pdata_buffer,1,fileSize,pFile); + + /* File Close */ + fclose (pFile); + + if (readSize != fileSize) { + fprintf(stderr, "Read file size(%d) not matched with actual file size (%ld bytes)\n",readSize,fileSize); + return -1; + } + + ptlv_header = (tlv_patch_info *) pdata_buffer; + + /* To handle different event between rampatch and NVM */ + gTlv_type = ptlv_header->tlv_type; + gtlv_dwndcfg = ptlv_header->tlv.patch.dwnd_cfg; + + if (ptlv_header->tlv_type == TLV_TYPE_PATCH) { + PR_INFO("====================================================\n"); + PR_INFO("TLV Type : 0x%x\n", ptlv_header->tlv_type); + PR_INFO("Length : %d bytes\n", (ptlv_header->tlv_length1) | + (ptlv_header->tlv_length2 << 8) | + (ptlv_header->tlv_length3 << 16)); + PR_INFO("Total Length : %d bytes\n", ptlv_header->tlv.patch.tlv_data_len); + PR_INFO("Patch Data Length : %d bytes\n",ptlv_header->tlv.patch.tlv_patch_data_len); + PR_INFO("Signing Format Version : 0x%x\n", ptlv_header->tlv.patch.sign_ver); + PR_INFO("Signature Algorithm : 0x%x\n", ptlv_header->tlv.patch.sign_algorithm); + PR_INFO("Event Handling : 0x%x\n", ptlv_header->tlv.patch.dwnd_cfg); + PR_INFO("Reserved : 0x%x\n", ptlv_header->tlv.patch.reserved1); + PR_INFO("Product ID : 0x%04x\n", ptlv_header->tlv.patch.prod_id); + PR_INFO("Rom Build Version : 0x%04x\n", ptlv_header->tlv.patch.build_ver); + PR_INFO("Patch Version : 0x%04x\n", ptlv_header->tlv.patch.patch_ver); + PR_INFO("Reserved : 0x%x\n", ptlv_header->tlv.patch.reserved2); + PR_INFO("Patch Entry Address : 0x%x\n", (ptlv_header->tlv.patch.patch_entry_addr)); + PR_INFO("====================================================\n"); + + } else if (ptlv_header->tlv_type == TLV_TYPE_NVM) { + PR_INFO("====================================================\n"); + PR_INFO("TLV Type : 0x%x\n", ptlv_header->tlv_type); + PR_INFO("Length : %d bytes\n", nvm_length = + (ptlv_header->tlv_length1) | + (ptlv_header->tlv_length2 << 8) | + (ptlv_header->tlv_length3 << 16)); + + if (nvm_length <= 0) + return readSize; + + for(nvm_byte_ptr=(unsigned char *)(nvm_ptr = &(ptlv_header->tlv.nvm)), nvm_index=0; + nvm_index < nvm_length ; nvm_ptr = (tlv_nvm_hdr *) nvm_byte_ptr) { + PR_DBG("TAG ID\t\t\t : %d\n", nvm_ptr->tag_id); + PR_DBG("TAG Length\t\t\t : %d\n", nvm_tag_len = nvm_ptr->tag_len); + PR_DBG("TAG Pointer\t\t\t : %d\n", nvm_ptr->tag_ptr); + PR_DBG("TAG Extended Flag\t\t : %d\n", nvm_ptr->tag_ex_flag); + + /* Increase nvm_index to NVM data */ + nvm_index+=sizeof(tlv_nvm_hdr); + nvm_byte_ptr+=sizeof(tlv_nvm_hdr); + +#ifndef MODULE_HAS_MAC_ADDR + /* Write BD Address */ + if (nvm_ptr->tag_id == TAG_NUM_2 && read_bd_address(bdaddr) == 0) { + memcpy(nvm_byte_ptr, bdaddr, 6); + PR_INFO("Overriding default BD ADDR with user" + " programmed BD Address: %02x:%02x:%02x:%02x:%02x:%02x\n", + *nvm_byte_ptr, *(nvm_byte_ptr+1), *(nvm_byte_ptr+2), + *(nvm_byte_ptr+3), *(nvm_byte_ptr+4), *(nvm_byte_ptr+5)); + } +#else + /* Remove it from NVM data */ + if (nvm_ptr->tag_id == TAG_NUM_2) { + int nvm_size = nvm_ptr->tag_len + sizeof(tlv_nvm_hdr); + PR_INFO("Skip BD Address from NVM\n"); + nvm_index += nvm_ptr->tag_len; + nvm_byte_ptr += nvm_ptr->tag_len; + memmove(nvm_ptr, nvm_byte_ptr, nvm_length - nvm_index); + nvm_length -= nvm_size; + nvm_byte_ptr -= nvm_size; + readSize -= nvm_size; + nvm_index -= nvm_size; + continue; + } +#endif + + if (nvm_ptr->tag_id == TAG_NUM_17) { + PR_DBG("Forcing IBS to be disabled\n"); + nvm_byte_ptr[FWCONF_IBS_VAL_OFFSET] &= + (~(FWCONF_IBS_ENABLE << FWCONF_IBS_VAL_BIT)); + if (baud_rate != nvm_byte_ptr[FWCONF_BAUD_VAL_OFFSET]) { + PR_INFO("Change Vendor Baud from 0x%02x to 0x%02x\n", + nvm_byte_ptr[FWCONF_BAUD_VAL_OFFSET], baud_rate); + nvm_byte_ptr[FWCONF_BAUD_VAL_OFFSET] = baud_rate; + } + } + + if (nvm_ptr->tag_id == TAG_NUM_27) { + if ((deep_sleep_value = + get_value_from_config(FW_CONFIG_FILE_PATH, "DEEP_SLEEP")) >= 0) { + if (deep_sleep_value == FWCONF_DEEP_SLEEP_DISABLE) { + nvm_byte_ptr[FWCONF_DEEP_SLEEP_BYTE_OFFSET] &= + (~(1 << FWCONF_DEEP_SLEEP_BIT_OFFSET)); + } else if (deep_sleep_value == FWCONF_DEEP_SLEEP_ENABLE) { + nvm_byte_ptr[FWCONF_DEEP_SLEEP_BYTE_OFFSET] |= + (1 << FWCONF_DEEP_SLEEP_BIT_OFFSET); + } else { + fprintf(stderr, "Ignoring invalid deep sleep config value\n"); + } + } + } + + /* Read from file and check what PCM Configuration is required: + * Master = 0 /Slave = 1 */ + /* Override PCM configuration */ + if (nvm_ptr->tag_id == TAG_NUM_44) { + if ((pcm_value = + get_value_from_config(FW_CONFIG_FILE_PATH, "PCM")) >= 0) { + + if (pcm_value == FWCONF_PCM_SLAVE) { + nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_1] |= + (1 << FWCONF_PCM_ROLE_BIT_OFFSET); + nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_2] |= + (1 << FWCONF_PCM_ROLE_BIT_OFFSET); + } else if (pcm_value == FWCONF_PCM_MASTER) { + nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_1] &= + (~(1 << FWCONF_PCM_ROLE_BIT_OFFSET)); + nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_2] &= + (~(1 << FWCONF_PCM_ROLE_BIT_OFFSET)); + } + } + } + + for(i =0;(i<nvm_ptr->tag_len && (i*3 + 2) < PRINT_BUF_SIZE);i++) + snprintf((char *) data_buf, PRINT_BUF_SIZE, "%s%.02x ", + (char *)data_buf, *(nvm_byte_ptr + i)); + + PR_DBG("TAG Data\t\t\t : %s\n", data_buf); + + /* Clear buffer */ + memset(data_buf, 0x0, PRINT_BUF_SIZE); + + /* increased by tag_len */ + nvm_index+=nvm_ptr->tag_len; + nvm_byte_ptr +=nvm_ptr->tag_len; + } + + PR_INFO("====================================================\n"); + + } else { + fprintf(stderr, "TLV Header type is unknown (%d) \n", ptlv_header->tlv_type); + } + + return readSize; +} + +int rome_tlv_dnld_segment(int fd, int index, int seg_size, unsigned char wait_cc_evt) +{ + int size=0, err = -1; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + + /* Frame the HCI CMD PKT to be sent to Controller*/ + frame_hci_cmd_pkt(cmd, EDL_PATCH_TLV_REQ_CMD, 0, index, seg_size); + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Initialize the RSP packet everytime to 0 */ + memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); + if (err != size) { + fprintf(stderr, "Failed to send the patch payload to the Controller! 0x%x\n", err); + return err; + } + + if (wait_cc_evt) { + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to downlaod patch segment: %d!\n", __FUNCTION__, index); + return err; + } + } + + return err; +} + +int rome_tlv_dnld_req(int fd, int tlv_size) +{ + int total_segment, remain_size, i, err = -1; + unsigned char wait_cc_evt = FALSE; + unsigned int rom = rome_ver >> 16; + + total_segment = tlv_size/MAX_SIZE_PER_TLV_SEGMENT; + remain_size = (tlv_size < MAX_SIZE_PER_TLV_SEGMENT)?\ + tlv_size: (tlv_size%MAX_SIZE_PER_TLV_SEGMENT); + + if (gTlv_type == TLV_TYPE_PATCH) { + /* Prior to Rome version 3.2(including inital few rampatch release of + * Rome 3.2), the event handling mechanism is ROME_SKIP_EVT_NONE. After + * few release of rampatch for Rome 3.2, the mechamism is changed to + * ROME_SKIP_EVT_VSE_CC. Rest of the mechanism is not used for now + */ + switch (gtlv_dwndcfg) + { + case ROME_SKIP_EVT_NONE: + wait_vsc_evt = TRUE; + wait_cc_evt = TRUE; + PR_DBG("%s: Event handling type: ROME_SKIP_EVT_NONE", __func__); + break; + case ROME_SKIP_EVT_VSE_CC: + wait_vsc_evt = FALSE; + wait_cc_evt = FALSE; + PR_DBG("%s: Event handling type: ROME_SKIP_EVT_VSE_CC", __func__); + break; + /* Not handled for now */ + case ROME_SKIP_EVT_VSE: + case ROME_SKIP_EVT_CC: + default: + fprintf(stderr, "%s: Unsupported Event handling: %d", __func__, gtlv_dwndcfg); + break; + } + } else { + wait_vsc_evt = TRUE; + wait_cc_evt = TRUE; + } + + for(i = 0; i < total_segment; i++) { + if ((i+1) == total_segment) { + if ((rom >= ROME_PATCH_VER_0100) && (rom < ROME_PATCH_VER_0302) && + (gTlv_type == TLV_TYPE_PATCH)) { + /* If the Rome version is from 1.1 to 3.1 + * 1. No CCE for the last command segment but all other segment + * 2. All the command segments get VSE including the last one + */ + wait_cc_evt = !remain_size ? FALSE: TRUE; + } else if ((rom == ROME_PATCH_VER_0302) && + (gTlv_type == TLV_TYPE_PATCH)) { + /* If the Rome version is 3.2 + * 1. None of the command segments receive CCE + * 2. No command segments receive VSE except the last one + * 3. If gtlv_dwndcfg is ROME_SKIP_EVT_NONE then the logic is + * same as Rome 2.1, 2.2, 3.0 + */ + if (gtlv_dwndcfg == ROME_SKIP_EVT_NONE) { + wait_cc_evt = !remain_size ? FALSE: TRUE; + } else if (gtlv_dwndcfg == ROME_SKIP_EVT_VSE_CC) { + wait_vsc_evt = !remain_size ? TRUE: FALSE; + } + } + } + + if ((err = rome_tlv_dnld_segment(fd, i, MAX_SIZE_PER_TLV_SEGMENT, wait_cc_evt )) < 0) + goto error; + } + + if ((rom >= ROME_PATCH_VER_0100) && (rom < ROME_PATCH_VER_0302) && + (gTlv_type == TLV_TYPE_PATCH)) { + /* If the Rome version is from 1.1 to 3.1 + * 1. No CCE for the last command segment but all other segment + * 2. All the command segments get VSE including the last one + */ + wait_cc_evt = remain_size ? FALSE: TRUE; + } else if ((rom == ROME_PATCH_VER_0302) && (gTlv_type == TLV_TYPE_PATCH)) { + /* If the Rome version is 3.2 + * 1. None of the command segments receive CCE + * 2. No command segments receive VSE except the last one + * 3. If gtlv_dwndcfg is ROME_SKIP_EVT_NONE then the logic is + * same as Rome 2.1, 2.2, 3.0 + */ + if (gtlv_dwndcfg == ROME_SKIP_EVT_NONE) { + wait_cc_evt = remain_size ? FALSE: TRUE; + } else if (gtlv_dwndcfg == ROME_SKIP_EVT_VSE_CC) { + wait_vsc_evt = remain_size ? TRUE: FALSE; + } + } + + if (remain_size) err =rome_tlv_dnld_segment(fd, i, remain_size, wait_cc_evt); + +error: + return err; +} + +int rome_download_tlv_file(int fd, unsigned char baud_rate) +{ + int tlv_size, err = -1; + + /* Rampatch TLV file Downloading */ + pdata_buffer = NULL; + + if ((tlv_size = rome_get_tlv_file(rampatch_file_path, baud_rate)) < 0) + goto error; + + if ((err = rome_tlv_dnld_req(fd, tlv_size)) < 0) + goto error; + + if (pdata_buffer != NULL) { + free (pdata_buffer); + pdata_buffer = NULL; + } + + /* NVM TLV file Downloading */ + if ((tlv_size = rome_get_tlv_file(nvm_file_path, baud_rate)) < 0) + goto error; + + if ((err = rome_tlv_dnld_req(fd, tlv_size)) < 0) + goto error; + +error: + if (pdata_buffer != NULL) + free (pdata_buffer); + + return err; +} + +int rome_1_0_nvm_tag_dnld(int fd) +{ + int i, size, err = 0; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + +#if (NVM_VERSION >= ROME_1_0_100019) + unsigned char cmds[MAX_TAG_CMD][HCI_MAX_CMD_SIZE] = + { + /* Tag 2 */ /* BD Address */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 9, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 2, + /* Tag Len */ 6, + /* Tag Value */ 0x77,0x78,0x23,0x01,0x56,0x22 + }, + /* Tag 6 */ /* Bluetooth Support Features */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 11, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 6, + /* Tag Len */ 8, + /* Tag Value */ 0xFF,0xFE,0x8B,0xFE,0xD8,0x3F,0x5B,0x8B + }, + /* Tag 17 */ /* HCI Transport Layer Setting */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 11, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 17, + /* Tag Len */ 8, + /* Tag Value */ 0x82,0x01,0x0E,0x08,0x04,0x32,0x0A,0x00 + }, + /* Tag 35 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 58, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 35, + /* Tag Len */ 55, + /* Tag Value */ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x58, 0x59, + 0x0E, 0x0E, 0x16, 0x16, 0x16, 0x1E, 0x26, 0x5F, 0x2F, 0x5F, + 0x0E, 0x0E, 0x16, 0x16, 0x16, 0x1E, 0x26, 0x5F, 0x2F, 0x5F, + 0x0C, 0x18, 0x14, 0x24, 0x40, 0x4C, 0x70, 0x80, 0x80, 0x80, + 0x0C, 0x18, 0x14, 0x24, 0x40, 0x4C, 0x70, 0x80, 0x80, 0x80, + 0x1B, 0x14, 0x01, 0x04, 0x48 + }, + /* Tag 36 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 15, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 36, + /* Tag Len */ 12, + /* Tag Value */ 0x0F,0x00,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x00 + }, + /* Tag 39 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 7, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 39, + /* Tag Len */ 4, + /* Tag Value */ 0x12,0x00,0x00,0x00 + }, + /* Tag 41 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 91, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 41, + /* Tag Len */ 88, + /* Tag Value */ 0x15, 0x00, 0x00, 0x00, 0xF6, 0x02, 0x00, 0x00, 0x76, 0x00, + 0x1E, 0x00, 0x29, 0x02, 0x1F, 0x00, 0x61, 0x00, 0x1A, 0x00, + 0x76, 0x00, 0x1E, 0x00, 0x7D, 0x00, 0x40, 0x00, 0x91, 0x00, + 0x06, 0x00, 0x92, 0x00, 0x03, 0x00, 0xA6, 0x01, 0x50, 0x00, + 0xAA, 0x01, 0x15, 0x00, 0xAB, 0x01, 0x0A, 0x00, 0xAC, 0x01, + 0x00, 0x00, 0xB0, 0x01, 0xC5, 0x00, 0xB3, 0x01, 0x03, 0x00, + 0xB4, 0x01, 0x13, 0x00, 0xB5, 0x01, 0x0C, 0x00, 0xC5, 0x01, + 0x0D, 0x00, 0xC6, 0x01, 0x10, 0x00, 0xCA, 0x01, 0x2B, 0x00, + 0xCB, 0x01, 0x5F, 0x00, 0xCC, 0x01, 0x48, 0x00 + }, + /* Tag 42 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 63, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 42, + /* Tag Len */ 60, + /* Tag Value */ 0xD7, 0xC0, 0x00, 0x00, 0x8F, 0x5C, 0x02, 0x00, 0x80, 0x47, + 0x60, 0x0C, 0x70, 0x4C, 0x00, 0x00, 0x00, 0x01, 0x1F, 0x01, + 0x42, 0x01, 0x69, 0x01, 0x95, 0x01, 0xC7, 0x01, 0xFE, 0x01, + 0x3D, 0x02, 0x83, 0x02, 0xD1, 0x02, 0x29, 0x03, 0x00, 0x0A, + 0x10, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x7F, 0x00, 0xFD, 0x00, + 0xF9, 0x01, 0xF1, 0x03, 0xDE, 0x07, 0x00, 0x00, 0x9A, 0x01 + }, + /* Tag 84 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 153, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 84, + /* Tag Len */ 150, + /* Tag Value */ 0x7C, 0x6A, 0x59, 0x47, 0x19, 0x36, 0x35, 0x25, 0x25, 0x28, + 0x2C, 0x2B, 0x2B, 0x28, 0x2C, 0x28, 0x29, 0x28, 0x29, 0x28, + 0x29, 0x29, 0x2C, 0x29, 0x2C, 0x29, 0x2C, 0x28, 0x29, 0x28, + 0x29, 0x28, 0x29, 0x2A, 0x00, 0x00, 0x2C, 0x2A, 0x2C, 0x18, + 0x98, 0x98, 0x98, 0x98, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, + 0x1E, 0x13, 0x1E, 0x1E, 0x1E, 0x1E, 0x13, 0x13, 0x11, 0x13, + 0x1E, 0x1E, 0x13, 0x12, 0x12, 0x12, 0x11, 0x12, 0x1F, 0x12, + 0x12, 0x12, 0x10, 0x0C, 0x18, 0x0D, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x0C, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x0D, + 0x0E, 0x0D, 0x01, 0x01, 0x0D, 0x0D, 0x0D, 0x0D, 0x0F, 0x0D, + 0x10, 0x0D, 0x0D, 0x0D, 0x0D, 0x10, 0x05, 0x10, 0x03, 0x00, + 0x7E, 0x7B, 0x7B, 0x72, 0x71, 0x50, 0x50, 0x50, 0x00, 0x40, + 0x60, 0x60, 0x30, 0x08, 0x02, 0x0F, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x16, 0x16, 0x08, 0x08, 0x00, + 0x00, 0x00, 0x1E, 0x34, 0x2B, 0x1B, 0x23, 0x2B, 0x15, 0x0D + }, + /* Tag 85 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 119, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 85, + /* Tag Len */ 116, + /* Tag Value */ 0x03, 0x00, 0x38, 0x00, 0x45, 0x77, 0x00, 0xE8, 0x00, 0x59, + 0x01, 0xCA, 0x01, 0x3B, 0x02, 0xAC, 0x02, 0x1D, 0x03, 0x8E, + 0x03, 0x00, 0x89, 0x01, 0x0E, 0x02, 0x5C, 0x02, 0xD7, 0x02, + 0xF8, 0x08, 0x01, 0x00, 0x1F, 0x00, 0x0A, 0x02, 0x55, 0x02, + 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xD7, 0x00, 0x00, + 0x00, 0x1E, 0xDE, 0x00, 0x00, 0x00, 0x14, 0x0F, 0x0A, 0x0F, + 0x0A, 0x0C, 0x0C, 0x0C, 0x0C, 0x04, 0x04, 0x04, 0x0C, 0x0C, + 0x0C, 0x0C, 0x06, 0x06, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x01, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, + 0x06, 0x0F, 0x14, 0x05, 0x47, 0xCF, 0x77, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xAC, 0x7C, 0xFF, 0x40, 0x00, 0x00, 0x00, + 0x12, 0x04, 0x04, 0x01, 0x04, 0x03 + }, + {TAG_END} + }; +#elif (NVM_VERSION == ROME_1_0_6002) + unsigned char cmds[MAX_TAG_CMD][HCI_MAX_CMD_SIZE] = + { + /* Tag 2 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 9, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 2, + /* Tag Len */ 6, + /* Tag Value */ 0x77,0x78,0x23,0x01,0x56,0x22 /* BD Address */ + }, + /* Tag 6 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 11, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 6, + /* Tag Len */ 8, + /* Tag Value */ 0xFF,0xFE,0x8B,0xFE,0xD8,0x3F,0x5B,0x8B + }, + /* Tag 17 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 11, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 17, + /* Tag Len */ 8, + /* Tag Value */ 0x82,0x01,0x0E,0x08,0x04,0x32,0x0A,0x00 + }, + /* Tag 36 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 15, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 36, + /* Tag Len */ 12, + /* Tag Value */ 0x0F,0x00,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x00 + }, + + /* Tag 39 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 7, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 39, + /* Tag Len */ 4, + /* Tag Value */ 0x12,0x00,0x00,0x00 + }, + + /* Tag 41 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 199, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 41, + /* Tag Len */ 196, + /* Tag Value */ 0x30,0x00,0x00,0x00,0xD5,0x00,0x0E,0x00,0xD6,0x00,0x0E,0x00, + 0xD7,0x00,0x16,0x00,0xD8,0x00,0x16,0x00,0xD9,0x00,0x16,0x00, + 0xDA,0x00,0x1E,0x00,0xDB,0x00,0x26,0x00,0xDC,0x00,0x5F,0x00, + 0xDD,0x00,0x2F,0x00,0xDE,0x00,0x5F,0x00,0xE0,0x00,0x0E,0x00, + 0xE1,0x00,0x0E,0x00,0xE2,0x00,0x16,0x00,0xE3,0x00,0x16,0x00, + 0xE4,0x00,0x16,0x00,0xE5,0x00,0x1E,0x00,0xE6,0x00,0x26,0x00, + 0xE7,0x00,0x5F,0x00,0xE8,0x00,0x2F,0x00,0xE9,0x00,0x5F,0x00, + 0xEC,0x00,0x0C,0x00,0xED,0x00,0x08,0x00,0xEE,0x00,0x14,0x00, + 0xEF,0x00,0x24,0x00,0xF0,0x00,0x40,0x00,0xF1,0x00,0x4C,0x00, + 0xF2,0x00,0x70,0x00,0xF3,0x00,0x80,0x00,0xF4,0x00,0x80,0x00, + 0xF5,0x00,0x80,0x00,0xF8,0x00,0x0C,0x00,0xF9,0x00,0x18,0x00, + 0xFA,0x00,0x14,0x00,0xFB,0x00,0x24,0x00,0xFC,0x00,0x40,0x00, + 0xFD,0x00,0x4C,0x00,0xFE,0x00,0x70,0x00,0xFF,0x00,0x80,0x00, + 0x00,0x01,0x80,0x00,0x01,0x01,0x80,0x00,0x04,0x01,0x1B,0x00, + 0x05,0x01,0x14,0x00,0x06,0x01,0x01,0x00,0x07,0x01,0x04,0x00, + 0x08,0x01,0x00,0x00,0x09,0x01,0x00,0x00,0x0A,0x01,0x03,0x00, + 0x0B,0x01,0x03,0x00 + }, + + /* Tag 44 */ + { /* Packet Type */HCI_COMMAND_PKT, + /* Opcode */ 0x0b,0xfc, + /* Total Len */ 44, + /* NVM CMD */ NVM_ACCESS_SET, + /* Tag Num */ 44, + /* Tag Len */ 41, + /* Tag Value */ 0x6F,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0xFF,0x10,0x02,0x02, + 0x01,0x00,0x14,0x01,0x06,0x28,0xA0,0x62,0x03,0x64,0x01,0x01, + 0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0xFF,0x10,0x02,0x01, + 0x00,0x14,0x01,0x02,0x03 + }, + {TAG_END} + }; +#endif + + for (i=0; (i < MAX_TAG_CMD) && (cmds[i][0] != TAG_END); i++) { + /* Write BD Address */ + if (cmds[i][TAG_NUM_OFFSET] == TAG_NUM_2){ + memcpy(&cmds[i][TAG_BDADDR_OFFSET], vnd_local_bd_addr, 6); + fprintf(stderr, "BD Address: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", + cmds[i][TAG_BDADDR_OFFSET ], cmds[i][TAG_BDADDR_OFFSET + 1], + cmds[i][TAG_BDADDR_OFFSET + 2], cmds[i][TAG_BDADDR_OFFSET + 3], + cmds[i][TAG_BDADDR_OFFSET + 4], cmds[i][TAG_BDADDR_OFFSET + 5]); + } + size = cmds[i][3] + HCI_COMMAND_HDR_SIZE + 1; + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)&cmds[i][0], rsp, size); + if (err != size) { + fprintf(stderr, "Failed to attach the patch payload to the Controller!\n"); + goto error; + } + + /* Read Command Complete Event - This is extra routine for ROME 1.0. From ROM 2.0, it should be removed. */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to get patch version(s)\n", __FUNCTION__); + goto error; + } + } + +error: + return err; +} + + + +int rome_patch_ver_req(int fd) +{ + int size, err = 0; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + + /* Frame the HCI CMD to be sent to the Controller */ + frame_hci_cmd_pkt(cmd, EDL_PATCH_VER_REQ_CMD, 0, + -1, EDL_PATCH_CMD_LEN); + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); + if (err != size) { + fprintf(stderr, "Failed to attach the patch payload to the Controller!\n"); + goto error; + } + + /* Read Command Complete Event - This is extra routine for ROME 1.0. From ROM 2.0, it should be removed. */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to get patch version(s)\n", __FUNCTION__); + goto error; + } +error: + return err; + +} + +static void flow_control(int fd, int opt) +{ + struct termios c_opt; + + ioctl(fd, TIOCMGET, &c_opt); + c_opt.c_cc[VTIME] = 0; /* inter-character timer unused */ + c_opt.c_cc[VMIN] = 0; /* blocking read until 8 chars received */ + c_opt.c_cflag &= ~CSIZE; + c_opt.c_cflag |= (CS8 | CLOCAL | CREAD); + if (opt == MSM_ENABLE_FLOW_CTRL) + c_opt.c_cflag |= CRTSCTS; + else if (opt == MSM_DISABLE_FLOW_CTRL) + c_opt.c_cflag &= ~CRTSCTS; + else { + fprintf(stderr, "%s: Incorrect option passed for TIOCMSET\n", __func__); + return; + } + c_opt.c_iflag = IGNPAR; + c_opt.c_oflag = 0; + c_opt.c_lflag = 0; + ioctl(fd, TIOCMSET, &c_opt); +} + + +int rome_set_baudrate_req(int fd, unsigned char baud_rate) +{ + int size, err = 0; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + hci_command_hdr *cmd_hdr; + int flags; + + memset(cmd, 0x0, HCI_MAX_CMD_SIZE); + + cmd_hdr = (void *) (cmd + 1); + cmd[0] = HCI_COMMAND_PKT; + cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, EDL_SET_BAUDRATE_CMD_OCF); + cmd_hdr->plen = VSC_SET_BAUDRATE_REQ_LEN; + cmd[4] = baud_rate; + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_SET_BAUDRATE_REQ_LEN); + + /* Flow off during baudrate change */ + flow_control(fd, MSM_DISABLE_FLOW_CTRL); + + /* Send the HCI command packet to UART for transmission */ + err = write(fd, cmd, size); + if (err != size) { + fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); + goto error; + } + /* Change Local UART baudrate to high speed UART */ + userial_vendor_set_baud(baud_rate); + + /* Flow on after changing local uart baudrate */ + flow_control(fd, MSM_ENABLE_FLOW_CTRL); + + /* Check for response from the Controller */ + if ((err = read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE)) < 0) { + fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); + goto error; + } + + /* Wait for command complete event */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__); + goto error; + } +error: + return err; + +} + + +int rome_hci_reset_req(int fd, char baud) +{ + int size, err = 0; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + hci_command_hdr *cmd_hdr; + int flags; + + memset(cmd, 0x0, HCI_MAX_CMD_SIZE); + + cmd_hdr = (void *) (cmd + 1); + cmd[0] = HCI_COMMAND_PKT; + cmd_hdr->opcode = HCI_RESET; + cmd_hdr->plen = 0; + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE); + + /* Flow off during baudrate change */ + flow_control(fd, MSM_DISABLE_FLOW_CTRL); + + /* Send the HCI command packet to UART for transmission */ + err = write(fd, cmd, size); + if (err != size) { + fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); + goto error; + } + + /* Change Local UART baudrate to high speed UART */ + userial_vendor_set_baud(baud); + + /* Flow on after changing local uart baudrate */ + flow_control(fd, MSM_ENABLE_FLOW_CTRL); + + /* Wait for command complete event */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__); + goto error; + } + +error: + return err; + +} + +int qca_soc_init(int fd, int speed, char *bdaddr) +{ + int err = -1; + int ret = 0; + int size; + unsigned char baud_rate = 0; + + vnd_userial.fd = fd; + + /* Get Rome version information */ + if ((err = rome_patch_ver_req(fd)) < 0) { + fprintf(stderr, "%s: Fail to get Rome Version (0x%x)\n", __FUNCTION__, err); + ret = -1; + goto error; + } + + fprintf(stderr, "%s: Rome Version (0x%08x)\n", __FUNCTION__, rome_ver); + + switch (rome_ver){ + case ROME_VER_1_0: + /* Set and Download the RAMPATCH */ + fprintf(stderr, "%s: Setting Patch Header & Downloading Patches\n", __FUNCTION__); + err = rome_download_rampatch(fd); + if (err < 0) { + fprintf(stderr, "%s: DOWNLOAD RAMPATCH failed!\n", __FUNCTION__); + ret = -1; + goto error; + } + + /* Attach the RAMPATCH */ + fprintf(stderr, "%s: Attaching the patches\n", __FUNCTION__); + err = rome_attach_rampatch(fd); + if (err < 0) { + fprintf(stderr, "%s: ATTACH RAMPATCH failed!\n", __FUNCTION__); + ret = -1; + goto error; + } + + /* Send Reset */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); + err = rome_rampatch_reset(fd); + if (err < 0) { + fprintf(stderr, "Failed to RESET after RAMPATCH upgrade!\n"); + ret = -1; + goto error; + } + + /* NVM download */ + fprintf(stderr, "%s: Downloading NVM\n", __FUNCTION__); + err = rome_1_0_nvm_tag_dnld(fd); + if (err < 0) { + fprintf(stderr, "Downloading NVM Failed !!\n"); + ret = -1; + goto error; + } + + /* Change baud rate 115.2 kbps to 3Mbps*/ + err = rome_hci_reset_req(fd, baud_rate); + if (err < 0) { + fprintf(stderr, "HCI Reset Failed !!\n"); + ret = -1; + goto error; + } + break; + case ROME_VER_1_1: + rampatch_file_path = ROME_RAMPATCH_TLV_PATH; + nvm_file_path = ROME_NVM_TLV_PATH; + goto download; + case ROME_VER_1_3: + rampatch_file_path = ROME_RAMPATCH_TLV_1_0_3_PATH; + nvm_file_path = ROME_NVM_TLV_1_0_3_PATH; + goto download; + case ROME_VER_2_1: + rampatch_file_path = ROME_RAMPATCH_TLV_2_0_1_PATH; + nvm_file_path = ROME_NVM_TLV_2_0_1_PATH; + goto download; + case ROME_VER_3_0: + rampatch_file_path = ROME_RAMPATCH_TLV_3_0_0_PATH; + nvm_file_path = ROME_NVM_TLV_3_0_0_PATH; + goto download; + case ROME_VER_3_2: + rampatch_file_path = ROME_RAMPATCH_TLV_3_0_2_PATH; + nvm_file_path = ROME_NVM_TLV_3_0_2_PATH; + goto download; + case TUFELLO_VER_1_0: + rampatch_file_path = TF_RAMPATCH_TLV_1_0_0_PATH; + nvm_file_path = TF_NVM_TLV_1_0_0_PATH; + goto download; + case TUFELLO_VER_1_1: + rampatch_file_path = TF_RAMPATCH_TLV_1_0_1_PATH; + nvm_file_path = TF_NVM_TLV_1_0_1_PATH; +download: + isSpeedValid(speed, &baud_rate); + if (baud_rate < 0) { + ret = -1; + goto error; + } + + /* Donwload TLV files (rampatch, NVM) */ + err = rome_download_tlv_file(fd, baud_rate); + if (err < 0) { + fprintf(stderr, "%s: Download TLV file failed!\n", __FUNCTION__); + ret = -1; + goto error; + } + + /* + * Overriding the baud rate value in NVM file with the user + * requested baud rate, since default baud rate in NVM file is 3M. + */ + err = rome_set_baudrate_req(fd, baud_rate); + if (err < 0) { + fprintf(stderr, "%s: Baud rate change failed!\n", __FUNCTION__); + ret = -1; + goto error; + } + + /* Perform HCI reset here*/ + err = rome_hci_reset_req(fd, baud_rate); + if (err < 0) { + fprintf(stderr, "HCI Reset Failed !!!\n"); + ret = -1; + goto error; + } + + break; + case ROME_VER_UNKNOWN: + default: + fprintf(stderr, "%s: Detected unknown ROME version\n", __FUNCTION__); + ret = -1; + break; + } + +error: + return ret; +} diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h new file mode 100644 index 000000000..597743e0b --- /dev/null +++ b/tools/hciattach_rome.h @@ -0,0 +1,388 @@ +/* + * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. + * Not a Contribution. + * Copyright 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef HW_ROME_H +#define HW_ROME_H + +/****************************************************************************** +** Constants & Macros +******************************************************************************/ +#define HCI_MAX_CMD_SIZE 260 +#define HCI_MAX_EVENT_SIZE 260 +#define PRINT_BUF_SIZE ((HCI_MAX_CMD_SIZE * 3) + 2) +/* HCI Command/Event Opcode */ +#define HCI_RESET 0x0C03 +#define EVT_CMD_COMPLETE 0x0E +/* HCI Packet types */ +#define HCI_COMMAND_PKT 0x01 +#define HCI_ACLDATA_PKT 0x02 +#define HCI_SCODATA_PKT 0x03 +#define HCI_EVENT_PKT 0x04 +#define HCI_VENDOR_PKT 0xff +#define cmd_opcode_pack(ogf, ocf) (unsigned short)((ocf & 0x03ff)|(ogf << 10)) + +#define NVITEM 0 +#define RDWR_PROT 1 +#define NVITEM_SIZE 2 +#define PERSIST_HEADER_LEN 3 +#define BD_ADDR_LEN 6 +#define MSM_DISABLE_FLOW_CTRL 0 +#define MSM_ENABLE_FLOW_CTRL 1 + +#ifdef _PLATFORM_MDM_ +#define USERIAL_OP_CLK_ON 0x5441 +#define USERIAL_OP_CLK_OFF 0x5442 +#endif + +#define PR_INFO(fmt, arg...) printf(fmt, ## arg) +#ifdef DEBUG + #define PR_DBG(fmt, arg...) printf(fmt, ## arg) +#else + #define PR_DBG(fmt, arg...) +#endif + +unsigned char vnd_local_bd_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +typedef enum { + USERIAL_OP_FLOW_ON, + USERIAL_OP_FLOW_OFF, + USERIAL_OP_NOP, +} userial_vendor_ioctl_op_t; + + +/* vendor serial control block */ +typedef struct +{ + int fd; /* fd to Bluetooth device */ + struct termios termios; /* serial terminal of BT port */ + char port_name[256]; +} vnd_userial_cb_t; + +/**** baud rates ****/ +#define USERIAL_BAUD_300 0 +#define USERIAL_BAUD_600 1 +#define USERIAL_BAUD_1200 2 +#define USERIAL_BAUD_2400 3 +#define USERIAL_BAUD_9600 4 +#define USERIAL_BAUD_19200 5 +#define USERIAL_BAUD_57600 6 +#define USERIAL_BAUD_115200 7 +#define USERIAL_BAUD_230400 8 +#define USERIAL_BAUD_460800 9 +#define USERIAL_BAUD_921600 10 +#define USERIAL_BAUD_1M 11 +#define USERIAL_BAUD_1_5M 12 +#define USERIAL_BAUD_2M 13 +#define USERIAL_BAUD_3M 14 +#define USERIAL_BAUD_4M 15 +#define USERIAL_BAUD_AUTO 16 + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +#define HCI_CHG_BAUD_CMD_OCF 0x0C +#define HCI_VENDOR_CMD_OGF 0x3F +#define WRITE_BDADDR_CMD_LEN 14 +#define WRITE_BAUD_CMD_LEN 6 +#define MAX_CMD_LEN WRITE_BDADDR_CMD_LEN +#define GET_VERSION_OCF 0x1E + +#define PS_HDR_LEN 4 +#define HCI_VENDOR_CMD_OGF 0x3F +#define HCI_PS_CMD_OCF 0x0B + +#define HCI_COMMAND_HDR_SIZE 3 +#define EVT_CMD_COMPLETE_SIZE 3 +#define EVT_CMD_STATUS 0x0F +#define EVT_CMD_STATUS_SIZE 4 +#define HCI_EVENT_HDR_SIZE 2 +#define HCI_EV_SUCCESS 0x00 +/* HCI Socket options */ +#define HCI_DATA_DIR 1 +#define HCI_FILTER 2 +#define HCI_TIME_STAMP 3 + +#define P_ID_OFFSET (0) +#define HCI_CMD_IND (1) +#define EVENTCODE_OFFSET (1) +#define EVT_PLEN (2) +#define PLEN (3) +#define CMD_RSP_OFFSET (3) +#define RSP_TYPE_OFFSET (4) +#define BAUDRATE_RSP_STATUS_OFFSET (4) +#define CMD_STATUS_OFFSET (5) +#define P_ROME_VER_OFFSET (4) +#define P_BUILD_VER_OFFSET (6) +#define P_BASE_ADDR_OFFSET (8) +#define P_ENTRY_ADDR_OFFSET (12) +#define P_LEN_OFFSET (16) +#define P_CRC_OFFSET (20) +#define P_CONTROL_OFFSET (24) +#define PATCH_HDR_LEN (28) +#define MAX_DATA_PER_SEGMENT (239) +#define VSEVENT_CODE (0xFF) +#define HC_VS_MAX_CMD_EVENT (0xFF) +#define PATCH_PROD_ID_OFFSET (5) +#define PATCH_PATCH_VER_OFFSET (9) +#define PATCH_ROM_BUILD_VER_OFFSET (11) +#define PATCH_SOC_VER_OFFSET (13) +#define MAX_SIZE_PER_TLV_SEGMENT (243) + +/* VS Opcode */ +#define HCI_PATCH_CMD_OCF (0) +#define EDL_SET_BAUDRATE_CMD_OCF (0x48) + +/* VS Commands */ +#define VSC_SET_BAUDRATE_REQ_LEN (1) +#define EDL_PATCH_CMD_LEN (1) +#define EDL_PATCH_CMD_REQ_LEN (1) +#define EDL_PATCH_DLD_REQ_CMD (0x01) +#define EDL_PATCH_RST_REQ_CMD (0x05) +#define EDL_PATCH_SET_REQ_CMD (0x16) +#define EDL_PATCH_ATCH_REQ_CMD (0x17) +#define EDL_PATCH_VER_REQ_CMD (0x19) +#define EDL_PATCH_TLV_REQ_CMD (0x1E) +#define VSC_DISABLE_IBS_LEN (0x04) + +/* VS Event */ +#define EDL_CMD_REQ_RES_EVT (0x00) +#define EDL_CMD_EXE_STATUS_EVT (0x00) +#define EDL_SET_BAUDRATE_RSP_EVT (0x92) +#define EDL_PATCH_VER_RES_EVT (0x19) +#define EDL_TVL_DNLD_RES_EVT (0x04) +#define EDL_APP_VER_RES_EVT (0x02) + +/* Status Codes of HCI CMD execution*/ +#define HCI_CMD_SUCCESS (0x0) +#define PATCH_LEN_ERROR (0x1) +#define PATCH_VER_ERROR (0x2) +#define PATCH_CRC_ERROR (0x3) +#define PATCH_NOT_FOUND (0x4) +#define TLV_TYPE_ERROR (0x10) +#define NVM_ACCESS_CODE (0x0B) +#define BAUDRATE_CHANGE_SUCCESS (1) + +/* TLV_TYPE */ +#define TLV_TYPE_PATCH (1) +#define TLV_TYPE_NVM (2) + +/* NVM */ +#define MAX_TAG_CMD 30 +#define TAG_END 0xFF +#define NVM_ACCESS_SET 0x01 +#define TAG_NUM_OFFSET 5 +#define TAG_NUM_2 2 +#define TAG_NUM_17 (17) +#define TAG_NUM_27 27 +#define TAG_NUM_44 44 +#define TAG_BDADDR_OFFSET 7 + +/* FW PCM Configuration */ +#define FWCONF_PCM_MS_OFFSET_1 9 +#define FWCONF_PCM_MS_OFFSET_2 33 +#define FWCONF_PCM_SLAVE 1 +#define FWCONF_PCM_MASTER 0 +#define FWCONF_PCM_ROLE_BIT_OFFSET 4 + +/* FW HCI Transport Layer Configuration */ +#define FWCONF_IBS_DISABLE (0) +#define FWCONF_IBS_ENABLE (1) +#define FWCONF_IBS_VAL_BIT (7) +#define FWCONF_IBS_VAL_OFFSET (0) +#define FWCONF_BAUD_VAL_OFFSET (2) + +/* FW DEEP SLEEP Configuration */ +#define FWCONF_DEEP_SLEEP_DISABLE 0 +#define FWCONF_DEEP_SLEEP_ENABLE 1 +#define FWCONF_DEEP_SLEEP_BYTE_OFFSET 0 +#define FWCONF_DEEP_SLEEP_BIT_OFFSET 0 + +#define MAX_RETRY_CNT 1 +#define SELECT_TIMEOUT 3 + +/* NVM Tags specifically used for ROME 1.0 */ +#define ROME_1_0_100022_1 0x101000221 +#define ROME_1_0_100019 0x101000190 +#define ROME_1_0_6002 0x100600200 + +/* Default NVM Version setting for ROME 1.0 */ +#define NVM_VERSION ROME_1_0_100022_1 + + +#define LSH(val, n) ((unsigned int)(val) << (n)) +#define EXTRACT_BYTE(val, pos) (char) (((val) >> (8 * (pos))) & 0xFF) +#define CALC_SEG_SIZE(len, max) ((plen) % (max))?((plen/max)+1) : ((plen) / (max)) + +#define ROME_FW_PATH "/lib/firmware/rampatch.img" +#define ROME_RAMPATCH_TLV_PATH "/lib/firmware/rampatch_tlv.img" +#define ROME_NVM_TLV_PATH "/lib/firmware/nvm_tlv.bin" +#define ROME_RAMPATCH_TLV_1_0_3_PATH "/lib/firmware/rampatch_tlv_1.3.tlv" +#define ROME_NVM_TLV_1_0_3_PATH "/lib/firmware/nvm_tlv_1.3.bin" +#define ROME_RAMPATCH_TLV_2_0_1_PATH "/lib/firmware/rampatch_tlv_2.1.tlv" +#define ROME_NVM_TLV_2_0_1_PATH "/lib/firmware/nvm_tlv_2.1.bin" +#define ROME_RAMPATCH_TLV_3_0_0_PATH "/lib/firmware/rampatch_tlv_3.0.tlv" +#define ROME_NVM_TLV_3_0_0_PATH "/lib/firmware/nvm_tlv_3.0.bin" +#define ROME_RAMPATCH_TLV_3_0_2_PATH "/lib/firmware/btfw32.tlv" +#define ROME_NVM_TLV_3_0_2_PATH "/lib/firmware/btnv32.bin" +#ifdef _PLATFORM_MDM_ +#define TF_RAMPATCH_TLV_1_0_0_PATH "/lib/firmware/rampatch_tlv_tf_1.0.tlv" +#define TF_NVM_TLV_1_0_0_PATH "/lib/firmware/nvm_tlv_tf_1.0.bin" +#define TF_RAMPATCH_TLV_1_0_1_PATH "/lib/firmware/tfbtfw11.tlv" +#define TF_NVM_TLV_1_0_1_PATH "/lib/firmware/tfbtnv11.bin" +#else +#define TF_RAMPATCH_TLV_1_0_0_PATH "/lib/firmware/qca/rampatch_tlv_tf_1.0.tlv" +#define TF_NVM_TLV_1_0_0_PATH "/lib/firmware/qca/nvm_tlv_tf_1.0.bin" +#define TF_RAMPATCH_TLV_1_0_1_PATH "/lib/firmware/qca/tfbtfw11.tlv" +#define TF_NVM_TLV_1_0_1_PATH "/lib/firmware/qca/tfbtnv11.bin" +#endif + +/* This header value in rampatch file decides event handling mechanism in the HOST */ +#define ROME_SKIP_EVT_NONE 0x00 +#define ROME_SKIP_EVT_VSE 0x01 +#define ROME_SKIP_EVT_CC 0x02 +#define ROME_SKIP_EVT_VSE_CC 0x03 + +#define FW_CONFIG_FILE_PATH "/etc/bluetooth/firmware.conf" +/****************************************************************************** +** Local type definitions +******************************************************************************/ + +typedef struct { + unsigned char ncmd; + unsigned short opcode; +} __attribute__ ((packed)) evt_cmd_complete; + +typedef struct { + unsigned char status; + unsigned char ncmd; + unsigned short opcode; +} __attribute__ ((packed)) evt_cmd_status; + +typedef struct { + unsigned short opcode; + unsigned char plen; +} __attribute__ ((packed)) hci_command_hdr; + +typedef struct { + unsigned char evt; + unsigned char plen; +} __attribute__ ((packed)) hci_event_hdr; +typedef struct { + unsigned short rom_version; + unsigned short build_version; +} __attribute__ ((packed)) patch_version; + +typedef struct { + unsigned int patch_id; + patch_version patch_ver; + unsigned int patch_base_addr; + unsigned int patch_entry_addr; + unsigned short patch_length; + int patch_crc; + unsigned short patch_ctrl; +} __attribute__ ((packed)) patch_info; + +typedef struct { + unsigned int tlv_data_len; + unsigned int tlv_patch_data_len; + unsigned char sign_ver; + unsigned char sign_algorithm; + unsigned char dwnd_cfg; + unsigned char reserved1; + unsigned short prod_id; + unsigned short build_ver; + unsigned short patch_ver; + unsigned short reserved2; + unsigned int patch_entry_addr; +} __attribute__ ((packed)) tlv_patch_hdr; + +typedef struct { + unsigned short tag_id; + unsigned short tag_len; + unsigned int tag_ptr; + unsigned int tag_ex_flag; +} __attribute__ ((packed)) tlv_nvm_hdr; + +typedef struct { + unsigned char tlv_type; + unsigned char tlv_length1; + unsigned char tlv_length2; + unsigned char tlv_length3; + + union{ + tlv_patch_hdr patch; + tlv_nvm_hdr nvm; + }tlv; +} __attribute__ ((packed)) tlv_patch_info; + +enum{ + BAUDRATE_115200 = 0x00, + BAUDRATE_57600 = 0x01, + BAUDRATE_38400 = 0x02, + BAUDRATE_19200 = 0x03, + BAUDRATE_9600 = 0x04, + BAUDRATE_230400 = 0x05, + BAUDRATE_250000 = 0x06, + BAUDRATE_460800 = 0x07, + BAUDRATE_500000 = 0x08, + BAUDRATE_720000 = 0x09, + BAUDRATE_921600 = 0x0A, + BAUDRATE_1000000 = 0x0B, + BAUDRATE_1250000 = 0x0C, + BAUDRATE_2000000 = 0x0D, + BAUDRATE_3000000 = 0x0E, + BAUDRATE_4000000 = 0x0F, + BAUDRATE_1600000 = 0x10, + BAUDRATE_3200000 = 0x11, + BAUDRATE_3500000 = 0x12, + BAUDRATE_AUTO = 0xFE, + BAUDRATE_Reserved = 0xFF +}; + +enum{ + ROME_PATCH_VER_0100 = 0x0100, + ROME_PATCH_VER_0101 = 0x0101, + ROME_PATCH_VER_0200 = 0x0200, + ROME_PATCH_VER_0300 = 0x0300, + ROME_PATCH_VER_0302 = 0x0302 + }; + +enum{ + ROME_SOC_ID_00 = 0x00000000, + ROME_SOC_ID_11 = 0x00000011, + ROME_SOC_ID_13 = 0x00000013, + ROME_SOC_ID_22 = 0x00000022, + ROME_SOC_ID_23 = 0x00000023, + ROME_SOC_ID_44 = 0x00000044 +}; + +enum{ + ROME_VER_UNKNOWN = 0, + ROME_VER_1_0 = ((ROME_PATCH_VER_0100 << 16 ) | ROME_SOC_ID_00 ), + ROME_VER_1_1 = ((ROME_PATCH_VER_0101 << 16 ) | ROME_SOC_ID_00 ), + ROME_VER_1_3 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_00 ), + ROME_VER_2_1 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_11 ), + ROME_VER_3_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_22 ), + ROME_VER_3_2 = ((ROME_PATCH_VER_0302 << 16 ) | ROME_SOC_ID_44 ), + TUFELLO_VER_1_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_13 ), + TUFELLO_VER_1_1 = ((ROME_PATCH_VER_0302 << 16 ) | ROME_SOC_ID_23 ) +}; +#endif /* HW_ROME_H */ ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/system.d/bluetooth-defaults.service ================================================ [Unit] Description=Bluetooth defaults After=local-fs.target ConditionPathExists=!/storage/.cache/services/bluez.conf ConditionPathExists=!/storage/.cache/services/bluez.disabled [Service] Type=oneshot ExecStart=/bin/sh -c 'cp /usr/share/services/bluez.conf /storage/.cache/services/' RemainAfterExit=yes ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/system.d/bluetooth.service ================================================ [Unit] Description=Bluetooth service After=syslog.target bluetooth-defaults.service Requires=bluetooth-defaults.service ConditionPathExists=/storage/.cache/services/bluez.conf [Service] Type=dbus BusName=org.bluez NotifyAccess=main EnvironmentFile=/storage/.cache/services/bluez.conf EnvironmentFile=-/run/libreelec/debug/bluez.conf ExecStart=/usr/lib/bluetooth/bluetoothd $BLUEZ_ARGS $BLUEZ_DEBUG CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW LimitNPROC=1 TimeoutStopSec=1s Restart=on-failure RestartSec=2 StartLimitInterval=0 [Install] WantedBy=bluetooth.target Alias=dbus-org.bluez.service ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/system.d/obex.service ================================================ [Unit] Description=Bluetooth service Requires=bluetooth.target bluetooth.service After=bluetooth.service ConditionPathExists=/storage/.cache/services/obexd.conf ConditionPathExists=/storage/.cache/services/bluez.conf [Service] EnvironmentFile=/storage/.cache/services/obexd.conf EnvironmentFile=-/run/libreelec/debug/obexd.conf ExecStartPre=/bin/sh -c 'mkdir -p $OBEXD_ROOT' ExecStart=/usr/lib/bluetooth/obexd -r $OBEXD_ROOT $OBEXD_DEBUG TimeoutStopSec=1s [Install] WantedBy=bluetooth.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/bluez/tmpfiles.d/z_05_bluez.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) d /storage/.cache/bluetooth 0755 root root - - ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/device-trees-amlogic/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="device-trees-amlogic" PKG_VERSION="cdfe64399f04ef958b4bd8ac629026007c9dd900" PKG_SHA256="f7e01f869d99db1d5d3f6f2002fed77969c5d78abb8cc34b4a4539da801c069c" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/device-trees-amlogic" PKG_URL="https://github.com/CoreELEC/device-trees-amlogic/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_DEPENDS_UNPACK="linux" PKG_LONGDESC="Device trees for Amlogic devices." # some unpack recursive loop happen with yes maybe because already unpacked from linux # don't set no either #PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" make_target() { # Enter kernel directory pushd $BUILD/build/linux-$(kernel_version) > /dev/null # Device trees already present in kernel tree we want to include EXTRA_TREES=( \ gxbb_p200 gxbb_p200_2G gxbb_p201 gxbb_p200_1G_wetek_hub gxbb_p200_2G_wetek_play_2 \ gxl_p212_1g gxl_p212_2g gxl_p230_2g gxl_p281_1g gxm_q200_2g gxm_q201_1g gxm_q201_2g \ ) # Add trees to the list for f in ${EXTRA_TREES[@]}; do DTB_LIST="$DTB_LIST $f.dtb" done # Copy all device trees to kernel source folder and create a list cp -f $PKG_BUILD/*.dts* arch/$TARGET_KERNEL_ARCH/boot/dts/amlogic/ for f in $PKG_BUILD/*.dts; do DTB_NAME="$(basename $f .dts).dtb" DTB_LIST="$DTB_LIST $DTB_NAME" done # Compile device trees kernel_make $DTB_LIST cp arch/$TARGET_KERNEL_ARCH/boot/dts/amlogic/*.dtb $PKG_BUILD popd > /dev/null } makeinstall_target() { mkdir -p $INSTALL/usr/share/bootloader/device_trees cp -a $PKG_BUILD/*.dtb $INSTALL/usr/share/bootloader/device_trees } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/iptables/config/README ================================================ To create your own set of Netfilters you can save your rules in: /storage/.config/iptables/rules.v4 for ipv4 /storage/.config/iptables/rules.v6 for ipv6 To modify tables, edit with nano then save with: iptables-save >/storage/.config/iptables/rules.v4 ip6tables-save >/storage/.config/iptables/rules.v6 To disable iptables use the following command: systemctl mask iptables To enable iptables again: systemctl unmask iptables ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/iptables/config/home.v4 ================================================ *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] :DOCKER-USER - [0:0] :private-subnets - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i tether -p udp -m conntrack --ctstate NEW -j ACCEPT -A INPUT -j private-subnets -A FORWARD -i tether -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT -A FORWARD -o tether -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A DOCKER-USER -j private-subnets -A private-subnets -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A private-subnets -s 10.0.0.0/8 -i eth+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 172.16.0.0/12 -i eth+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 192.168.0.0/16 -i eth+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 10.0.0.0/8 -i en+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 172.16.0.0/12 -i en+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 192.168.0.0/16 -i en+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 10.0.0.0/8 -i wl+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 172.16.0.0/12 -i wl+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 192.168.0.0/16 -i wl+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 10.0.0.0/8 -i tether -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 172.16.0.0/12 -i tether -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 192.168.0.0/16 -i tether -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 10.0.0.0/8 -i docker+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 172.16.0.0/12 -i docker+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 192.168.0.0/16 -i docker+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -j REJECT --reject-with icmp-port-unreachable COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/iptables/config/home.v6 ================================================ *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] :DOCKER-USER - [0:0] :private-subnets - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i tether -p udp -m conntrack --ctstate NEW -j ACCEPT -A INPUT -j private-subnets -A FORWARD -i tether -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT -A FORWARD -o tether -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A DOCKER-USER -j private-subnets -A private-subnets -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A private-subnets -s fc00::/7 -i eth+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s fc00::/7 -i en+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s fc00::/7 -i wl+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s fc00::/7 -i tether -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s fc00::/7 -i docker+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -j REJECT --reject-with icmp6-port-unreachable COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/iptables/config/public.v4 ================================================ # Netfilter rules for public "untrusted" networks *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] :DOCKER-USER - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Allow tethered Wifi AP -A INPUT -i tether -p udp -m conntrack --ctstate NEW -j ACCEPT -A INPUT -i tether -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i tether -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i tether -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -o tether -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Block DOCKER -A DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j RETURN -A DOCKER-USER -j REJECT --reject-with icmp-port-unreachable COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/iptables/config/public.v6 ================================================ # Netfilter Rules for trusted home networks. *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] :DOCKER-USER - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Allow tethered Wifi AP -A INPUT -i tether -p udp -m conntrack --ctstate NEW -j ACCEPT -A INPUT -i tether -s fc00::/7 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i tether -s fc00::/7 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i tether -s fc00::/7 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -o tether -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A DOCKER-USER -j REJECT --reject-with icmp6-port-unreachable COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/iptables/package.mk ================================================ # 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) PKG_NAME="iptables" PKG_VERSION="1.8.7" PKG_SHA256="c109c96bb04998cd44156622d36f8e04b140701ec60531a10668cfdff5e8d8f0" PKG_LICENSE="GPL" PKG_SITE="https://www.netfilter.org/" PKG_URL="https://www.netfilter.org/projects/iptables/files/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain linux:host libmnl libnftnl" PKG_LONGDESC="IP packet filter administration." PKG_TOOLCHAIN="autotools" post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { mkdir -p ${INSTALL}/usr/config/iptables/ cp -PR ${PKG_DIR}/config/README ${INSTALL}/usr/config/iptables/ mkdir -p ${INSTALL}/etc/iptables/ cp -PR ${PKG_DIR}/config/* ${INSTALL}/etc/iptables/ mkdir -p ${INSTALL}/usr/lib/libreelec cp ${PKG_DIR}/scripts/iptables_helper ${INSTALL}/usr/lib/libreelec } post_install() { enable_service iptables.service } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/iptables/scripts/iptables_helper ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) IPTABLES4="/usr/sbin/iptables" IPTABLES6="/usr/sbin/ip6tables" IPTABLES_CMDS="$IPTABLES4 $IPTABLES6" PUBLIC_RULES="/etc/iptables/public.v" HOME_RULES="/etc/iptables/home.v" CUSTOM_RULES="/storage/.config/iptables/rules.v" DOCKER="service.system.docker.service" SYSTEMCTL="/usr/bin/systemctl" CONNMANCTL="/usr/bin/connmanctl" check_docker() { $SYSTEMCTL is-active --quiet $DOCKER && $SYSTEMCTL restart $DOCKER } get_technology_config() { $CONNMANCTL technologies | awk -v pattern="^/.*/technology/$1$" -e 'BEGIN {S=0}; /^\/.*/ {S=0}; $0 ~ pattern {S=1}; S==1 {print $0}' } check_tether() { for technology in wifi ethernet; do if get_technology_config $technology | grep -q 'Tethering = True'; then $CONNMANCTL tether $technology off sleep 1 $CONNMANCTL tether $technology on break fi done } flush() { for cmd in $IPTABLES_CMDS; do $cmd -F $cmd -X $cmd -t nat -F $cmd -t nat -X $cmd -t mangle -F $cmd -t mangle -X $cmd -P INPUT ACCEPT $cmd -P FORWARD ACCEPT $cmd -P OUTPUT ACCEPT done check_docker check_tether } enable() { for cmd in $IPTABLES_CMDS; do case "$cmd" in *6*) rules="$RULES6" ipv="6" ;; *) rules="$RULES4" ipv="4" ;; esac if [ -e "$rules" ]; then "$cmd-restore" "$rules" fi done check_docker check_tether } if [ "$1" = "enable" ]; then case "${RULES}" in "none") flush ;; "public") RULES4="${PUBLIC_RULES}4" RULES6="${PUBLIC_RULES}6" ;; "home") RULES4="${HOME_RULES}4" RULES6="${HOME_RULES}6" ;; "custom") RULES4="${CUSTOM_RULES}4" RULES6="${CUSTOM_RULES}6" ;; *) exit 1 ;; esac enable elif [ "$1" = "disable" ]; then flush else exit 1 fi exit 0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/iptables/system.d/iptables.service ================================================ [Unit] Description=IPTABLES Packet Filtering ConditionPathExists=/usr/lib/libreelec/iptables_helper ConditionPathExists=|/storage/.cache/services/iptables.conf Before=network.target Wants=network.target [Service] Type=oneshot EnvironmentFile=-/storage/.cache/services/iptables.conf ExecStart=/usr/lib/libreelec/iptables_helper enable ExecReload=/usr/lib/libreelec/iptables_helper enable ExecStop=/usr/lib/libreelec/iptables_helper disable RemainAfterExit=yes [Install] WantedBy=multi-user.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/kvimfan-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="kvimfan-aml" PKG_VERSION="1.0" PKG_SHA256="" PKG_LICENSE="GPL" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Khadas VIM2 fan control service" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" pre_make_target() { unset LDFLAGS } make_target() { kernel_make -C "$(kernel_path)" M="$PKG_BUILD" } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; } post_install() { enable_service kvimfan.service } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/kvimfan-aml/sources/Makefile ================================================ obj-m := khadas-fan.o ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/kvimfan-aml/sources/khadas-fan.c ================================================ /* * gpio-fan.c - driver for fans controlled by GPIO. */ #include <linux/module.h> #include <linux/init.h> #include <linux/platform_device.h> #include <linux/err.h> #include <linux/gpio.h> #include <linux/of_platform.h> #include <linux/of_gpio.h> #include <linux/time.h> #include <linux/workqueue.h> #define KHADAS_FAN_TRIG_TEMP_LEVEL0 50 // 50 degree if not set #define KHADAS_FAN_TRIG_TEMP_LEVEL1 60 // 60 degree if not set #define KHADAS_FAN_TRIG_TEMP_LEVEL2 70 // 70 degree if not set #define KHADAS_FAN_TRIG_MAXTEMP 80 #define KHADAS_FAN_LOOP_SECS 30 * HZ // 30 seconds #define KHADAS_FAN_LOOP_PULSE 2 // 20 msec #define KHADAS_FAN_TEST_LOOP_SECS 5 * HZ // 5 seconds #define KHADAS_FAN_LOOP_NODELAY_SECS 0 #define KHADAS_FAN_GPIO_OFF 0 #define KHADAS_FAN_GPIO_ON 1 enum khadas_fan_mode { KHADAS_FAN_STATE_MANUAL = 0, KHADAS_FAN_STATE_AUTO, }; enum khadas_fan_level { KHADAS_FAN_LEVEL_0 = 0, KHADAS_FAN_LEVEL_1, KHADAS_FAN_LEVEL_2, KHADAS_FAN_LEVEL_3, }; enum khadas_fan_enable { KHADAS_FAN_DISABLE = 0, KHADAS_FAN_ENABLE, }; struct khadas_fan_data { struct platform_device *pdev; struct class *class; struct delayed_work work; struct delayed_work fan_test_work; enum khadas_fan_enable enable; enum khadas_fan_mode mode; enum khadas_fan_level level; int ctrl_gpio0; int ctrl_gpio1; int trig_temp_level0; int trig_temp_level1; int trig_temp_level2; int last_level; int temp; }; struct khadas_fan_data *fan_data = NULL; void khadas_fan_level_set(struct khadas_fan_data *fan_data, int level ) { if(3 == fan_data->last_level){ gpio_set_value(fan_data->ctrl_gpio0, KHADAS_FAN_GPIO_ON); gpio_set_value(fan_data->ctrl_gpio1, KHADAS_FAN_GPIO_OFF); }else if(2 == fan_data->last_level){ gpio_set_value(fan_data->ctrl_gpio0, KHADAS_FAN_GPIO_OFF); gpio_set_value(fan_data->ctrl_gpio1, KHADAS_FAN_GPIO_ON); }else if(1 == fan_data->last_level){ gpio_set_value(fan_data->ctrl_gpio0, KHADAS_FAN_GPIO_ON); gpio_set_value(fan_data->ctrl_gpio1, KHADAS_FAN_GPIO_ON); }else{ gpio_set_value(fan_data->ctrl_gpio0, KHADAS_FAN_GPIO_OFF); gpio_set_value(fan_data->ctrl_gpio1, KHADAS_FAN_GPIO_OFF); } if (fan_data->last_level > 3 && level > 3) fan_data->last_level--; else fan_data->last_level = level; } extern int get_cpu_temp(void); static void fan_work_func(struct work_struct *_work) { struct khadas_fan_data *fan_data = container_of(_work, struct khadas_fan_data, work.work); int temp, level =1; temp = get_cpu_temp(); if(temp < 0){ schedule_delayed_work(&fan_data->work, KHADAS_FAN_LOOP_PULSE); return; } fan_data->temp = fan_data->temp ? (fan_data->temp + temp) / 2 : temp; if (fan_data->temp < fan_data->trig_temp_level0) level = 0; else if (fan_data->temp < fan_data->trig_temp_level0 + 2) level = 6; else if (fan_data->temp < fan_data->trig_temp_level0 + 4) level = 5; else if (fan_data->temp < fan_data->trig_temp_level0 + 6) level = 4; else if (fan_data->temp < fan_data->trig_temp_level1) level = 3; else if (fan_data->temp < fan_data->trig_temp_level2) level = 2; khadas_fan_level_set(fan_data, level); if (level > 3) schedule_delayed_work(&fan_data->work, KHADAS_FAN_LOOP_PULSE); else schedule_delayed_work(&fan_data->work, KHADAS_FAN_LOOP_SECS); } static void khadas_fan_set(struct khadas_fan_data *fan_data) { cancel_delayed_work(&fan_data->work); if (fan_data->enable == KHADAS_FAN_DISABLE) { fan_data->last_level = 0; khadas_fan_level_set(fan_data,0); return; } switch (fan_data->mode) { case KHADAS_FAN_STATE_MANUAL: switch(fan_data->level){ case KHADAS_FAN_LEVEL_1: fan_data->last_level = 3; khadas_fan_level_set(fan_data,3); break; case KHADAS_FAN_LEVEL_2: fan_data->last_level = 2; khadas_fan_level_set(fan_data,2); break; case KHADAS_FAN_LEVEL_3: fan_data->last_level = 1; khadas_fan_level_set(fan_data,1); break; default: fan_data->last_level = 0; khadas_fan_level_set(fan_data,0); break; } break; case KHADAS_FAN_STATE_AUTO: // FIXME: achieve with a better way schedule_delayed_work(&fan_data->work, KHADAS_FAN_LOOP_PULSE); break; default: break; } } static ssize_t fan_enable_show(struct class *cls, struct class_attribute *attr, char *buf) { return sprintf(buf, "Fan enable: %d\n", fan_data->enable); } static ssize_t fan_enable_store(struct class *cls, struct class_attribute *attr, const char *buf, size_t count) { int enable; if (kstrtoint(buf, 0, &enable)) return -EINVAL; // 0: manual, 1: auto if( enable >= 0 && enable < 2 ){ fan_data->enable = enable; khadas_fan_set(fan_data); } return count; } static ssize_t fan_mode_show(struct class *cls, struct class_attribute *attr, char *buf) { return sprintf(buf, "Fan mode: %d\n", fan_data->mode); } static ssize_t fan_mode_store(struct class *cls, struct class_attribute *attr, const char *buf, size_t count) { int mode; if (kstrtoint(buf, 0, &mode)) return -EINVAL; // 0: manual, 1: auto if( mode >= 0 && mode < 2 ){ fan_data->mode = mode; khadas_fan_set(fan_data); } return count; } static ssize_t fan_level_show(struct class *cls, struct class_attribute *attr, char *buf) { return sprintf(buf, "Fan level: %d\n", fan_data->level); } static ssize_t fan_level_store(struct class *cls, struct class_attribute *attr, const char *buf, size_t count) { int level; if (kstrtoint(buf, 0, &level)) return -EINVAL; if( level >= 0 && level < 4){ fan_data->level = level; fan_data->last_level = level; khadas_fan_set(fan_data); } return count; } static ssize_t fan_temp_show(struct class *cls, struct class_attribute *attr, char *buf) { int temp = -EINVAL; temp = get_cpu_temp(); return sprintf(buf, "cpu_temp:%d \nFan trigger temperature: pulse-level:%d level0:%d level1:%d level2:%d\n", temp, fan_data->trig_temp_level0, fan_data->trig_temp_level0 + 6, fan_data->trig_temp_level1, fan_data->trig_temp_level2); } static struct class_attribute fan_class_attrs[] = { __ATTR(enable, 0644, fan_enable_show, fan_enable_store), __ATTR(mode, 0644, fan_mode_show, fan_mode_store), __ATTR(level, 0644, fan_level_show, fan_level_store), __ATTR(temp, 0444, fan_temp_show, NULL), }; static int khadas_fan_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; int ret; int i; printk("khadas_fan_probe\n"); fan_data = devm_kzalloc(dev, sizeof(struct khadas_fan_data), GFP_KERNEL); if (!fan_data) return -ENOMEM; ret = of_property_read_u32(dev->of_node, "trig_temp_level0", &fan_data->trig_temp_level0); if (ret < 0) fan_data->trig_temp_level0 = KHADAS_FAN_TRIG_TEMP_LEVEL0; ret = of_property_read_u32(dev->of_node, "trig_temp_level1", &fan_data->trig_temp_level1); if (ret < 0) fan_data->trig_temp_level1 = KHADAS_FAN_TRIG_TEMP_LEVEL1; ret = of_property_read_u32(dev->of_node, "trig_temp_level2", &fan_data->trig_temp_level2); if (ret < 0) fan_data->trig_temp_level2 = KHADAS_FAN_TRIG_TEMP_LEVEL2; fan_data->ctrl_gpio0 = of_get_named_gpio(dev->of_node, "fan_ctl0", 0); fan_data->ctrl_gpio1 = of_get_named_gpio(dev->of_node, "fan_ctl1", 0); if ((gpio_request(fan_data->ctrl_gpio0, "FAN") != 0)|| (gpio_request(fan_data->ctrl_gpio1, "FAN") != 0)) return -EIO; gpio_direction_output(fan_data->ctrl_gpio0, KHADAS_FAN_GPIO_OFF); gpio_direction_output(fan_data->ctrl_gpio1, KHADAS_FAN_GPIO_OFF); fan_data->mode = KHADAS_FAN_STATE_AUTO; fan_data->level = KHADAS_FAN_LEVEL_0; fan_data->enable = KHADAS_FAN_ENABLE; fan_data->last_level = 0; fan_data->temp = 0; INIT_DELAYED_WORK(&fan_data->work, fan_work_func); khadas_fan_level_set(fan_data,0); schedule_delayed_work(&fan_data->work, KHADAS_FAN_TEST_LOOP_SECS); fan_data->pdev = pdev; platform_set_drvdata(pdev, fan_data); fan_data->class = class_create(THIS_MODULE, "fan"); if (IS_ERR(fan_data->class)) { return PTR_ERR(fan_data->class); } for (i = 0; i < ARRAY_SIZE(fan_class_attrs); i++){ ret = class_create_file(fan_data->class, &fan_class_attrs[i]); if(0!=ret){ printk("khadas_fan_probe,class_create_file%d failed \n", i); } } dev_info(dev, "trigger temperature is level0:%d, level1:%d, level2:%d.\n", fan_data->trig_temp_level0, fan_data->trig_temp_level1, fan_data->trig_temp_level2); return 0; } static int khadas_fan_remove(struct platform_device *pdev) { fan_data->enable = KHADAS_FAN_DISABLE; khadas_fan_set(fan_data); return 0; } static void khadas_fan_shutdown(struct platform_device *pdev) { fan_data->enable = KHADAS_FAN_DISABLE; khadas_fan_set(fan_data); } #ifdef CONFIG_PM static int khadas_fan_suspend(struct platform_device *pdev, pm_message_t state) { cancel_delayed_work(&fan_data->work); fan_data->last_level = 0; khadas_fan_level_set(fan_data, 0); return 0; } static int khadas_fan_resume(struct platform_device *pdev) { khadas_fan_set(fan_data); return 0; } #endif static struct of_device_id of_khadas_fan_match[] = { { .compatible = "fanctl", }, {}, }; static struct platform_driver khadas_fan_driver = { .probe = khadas_fan_probe, #ifdef CONFIG_PM .suspend = khadas_fan_suspend, .resume = khadas_fan_resume, #endif .remove = khadas_fan_remove, .shutdown = khadas_fan_shutdown, .driver = { .name = "fanctl", .owner = THIS_MODULE, .of_match_table = of_match_ptr(of_khadas_fan_match), }, }; module_platform_driver(khadas_fan_driver); MODULE_AUTHOR("kenny <kenny@khadas.com>"); MODULE_DESCRIPTION("khadas GPIO Fan driver"); MODULE_LICENSE("GPL"); ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/kvimfan-aml/system.d/kvimfan.service ================================================ [Unit] Description=Khadas VIM fan control module loader ConditionPathExists=/proc/device-tree/fan/compatible After=kernel-overlays.service [Service] Type=oneshot ExecStart=/bin/sh -c '[ `cat /proc/device-tree/fan/compatible` = "fanctl" ] && /sbin/modprobe khadas_fan' RemainAfterExit=yes [Install] WantedBy=basic.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/RTL8188EU-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="RTL8188EU-aml" PKG_VERSION="2d358c5" PKG_SHA256="adf31d56d3a94bca814f1bd0de24af61fae85d25a259124b5d16c1d23cc72c91" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/khadas/android_hardware_wifi_realtek_drivers_8188eu" PKG_URL="https://github.com/khadas/android_hardware_wifi_realtek_drivers_8188eu/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Realtek RTL8188EU Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" post_unpack() { sed -i 's/-DCONFIG_CONCURRENT_MODE//g; s/^CONFIG_POWER_SAVING.*$/CONFIG_POWER_SAVING = n/g; s/^CONFIG_RTW_DEBUG.*/CONFIG_RTW_DEBUG = n/g' $PKG_BUILD/*/Makefile sed -i 's/^#define CONFIG_DEBUG.*//g' $PKG_BUILD/*/include/autoconf.h sed -i 's/#define DEFAULT_RANDOM_MACADDR.*1/#define DEFAULT_RANDOM_MACADDR 0/g' $PKG_BUILD/*/core/rtw_ieee80211.c } make_target() { LDFLAGS="" make -C $(kernel_path) M=$PKG_BUILD/rtl8xxx_EU \ ARCH=$TARGET_KERNEL_ARCH \ KSRC=$(kernel_path) \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ USER_EXTRA_CFLAGS="-fgnu89-inline" } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/RTL8188EU-aml/patches/RTL8188EU-aml-0001-Add-support-for-a-few-USB-dongles.patch ================================================ From b67364bd4236f890238fb44df1bbba228b42ffe1 Mon Sep 17 00:00:00 2001 From: kszaq <kszaquitto@gmail.com> Date: Mon, 2 Oct 2017 11:13:42 +0200 Subject: [PATCH] Add support for a few USB dongles --- rtl8xxx_EU/os_dep/linux/usb_intf.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rtl8xxx_EU/os_dep/linux/usb_intf.c b/rtl8xxx_EU/os_dep/linux/usb_intf.c index 2fbffd6..4892838 100755 --- a/rtl8xxx_EU/os_dep/linux/usb_intf.c +++ b/rtl8xxx_EU/os_dep/linux/usb_intf.c @@ -138,6 +138,12 @@ static struct usb_device_id rtw_usb_id_tbl[] = { /*=== Customer ID ===*/ /****** 8188EUS ********/ {USB_DEVICE(0x07B8, 0x8179), .driver_info = RTL8188E}, /* Abocom - Abocom */ + {USB_DEVICE(0x0DF6, 0x0076), .driver_info = RTL8188E}, /* Sitecom N150 v2 */ + {USB_DEVICE(0x2001, 0x330F), .driver_info = RTL8188E}, /* DLink DWA-125 REV D1 */ + {USB_DEVICE(0x2001, 0x3310), .driver_info = RTL8188E}, /* Dlink DWA-123 REV D1 */ + {USB_DEVICE(0x2001, 0x3311), .driver_info = RTL8188E}, /* DLink GO-USB-N150 REV B1 */ + {USB_DEVICE(0x056E, 0x4008), .driver_info = RTL8188E}, /* Elecom WDC-150SU2M */ + {USB_DEVICE(0x2357, 0x010c), .driver_info = RTL8188E}, /* TP-Link TL-WN722N v2 */ #endif #ifdef CONFIG_RTL8812A -- 2.7.4 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/RTL8723DS-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="RTL8723DS-aml" PKG_VERSION="fb4adf7" PKG_SHA256="00da0a7773286df38e8785be2891025e4fa6c4ff5ace9450e54cae85f143847e" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/khadas/android_hardware_wifi_realtek_drivers_8723ds" PKG_URL="https://github.com/khadas/android_hardware_wifi_realtek_drivers_8723ds/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Realtek RTL8723DS Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" post_unpack() { sed -i 's/-DCONFIG_CONCURRENT_MODE//g; s/^CONFIG_POWER_SAVING.*$/CONFIG_POWER_SAVING = n/g; s/^CONFIG_RTW_DEBUG.*/CONFIG_RTW_DEBUG = n/g' $PKG_BUILD/*/Makefile sed -i 's/^#define CONFIG_DEBUG.*//g' $PKG_BUILD/*/include/autoconf.h sed -i 's/#define DEFAULT_RANDOM_MACADDR.*1/#define DEFAULT_RANDOM_MACADDR 0/g' $PKG_BUILD/*/core/rtw_ieee80211.c } pre_make_target() { unset LDFLAGS } make_target() { make -C $(kernel_path) M=$PKG_BUILD/rtl8723DS \ ARCH=$TARGET_KERNEL_ARCH \ KSRC=$(kernel_path) \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ USER_EXTRA_CFLAGS="-fgnu89-inline" } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/RTL8821CU/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="RTL8821CU" PKG_LICENSE="GPL" PKG_SITE="https://github.com/smp79/rtl8821CU" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_SECTION="driver" PKG_LONGDESC="Realtek RTL8821CU Linux driver" PKG_IS_KERNEL_PKG="yes" case "$LINUX" in amlogic-3.14) PKG_VERSION="178fcbf4f1bf5b94580b5708016d0b2c2ded1720" PKG_SHA256="29d3e053dd1fad37ee03de65e4ed2b25a4fb9aaf8bb6bd435da477753d03ad26" PKG_URL="https://github.com/smp79/rtl8821CU/archive/$PKG_VERSION.tar.gz" PKG_SOURCE_DIR="rtl8821CU-$PKG_VERSION*" ;; amlogic-4.9|odroid-go-a-4.4) PKG_VERSION="f7910283478ac1b508ff163d30e4b374bf99f7cb" PKG_SHA256="b2128cbc23ecf9b17bbbd9652a2453d73403276a56b11eb8a795d168156cd53e" PKG_URL="https://github.com/smp79/rtl8821CU/archive/$PKG_VERSION.tar.gz" PKG_SOURCE_DIR="rtl8821CU-$PKG_VERSION*" ;; esac pre_make_target() { unset LDFLAGS } make_target() { make \ ARCH=$TARGET_KERNEL_ARCH \ KSRC=$(kernel_path) \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ CONFIG_POWER_SAVING=n } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME cp *.ko $INSTALL/$(get_full_module_dir)/$PKG_NAME } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/mt7601u-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mt7601u-aml" PKG_VERSION="4e61a61" PKG_SHA256="814a63d8654f87a76cc06425ad2120daa32646f5220341a26296e4a6643b013a" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/khadas/android_hardware_wifi_mtk_drivers_mt7601" PKG_URL="https://github.com/khadas/android_hardware_wifi_mtk_drivers_mt7601/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="mt7601u Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" pre_make_target() { unset LDFLAGS } make_target() { make -C $(kernel_path) M=$PKG_BUILD \ ARCH=$TARGET_KERNEL_ARCH \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; mkdir -p $INSTALL/$(get_full_firmware_dir) cp $PKG_BUILD/RT2870STA_7601.dat $INSTALL/$(get_full_firmware_dir) } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/mt7601u-aml/patches/mt7601u-aml-001-firmware-path.patch ================================================ diff --git a/include/os/rt_linux.h b/include/os/rt_linux.h index 0303698..36dd603 100755 --- a/include/os/rt_linux.h +++ b/include/os/rt_linux.h @@ -159,7 +159,7 @@ typedef struct usb_ctrlrequest devctrlrequest; #ifdef ALLWINNER #define STA_PROFILE_PATH "/system/vendor/modules/RT2870STA_7601.dat" #else -#define STA_PROFILE_PATH "/system/etc/wifi/RT2870STA_7601.dat" +#define STA_PROFILE_PATH "/lib/firmware/RT2870STA_7601.dat" #endif #define STA_DRIVER_VERSION "JEDI.L0.MP1.mt7601u.v1.2" #define DRIVER_ROLE "STA" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/mt7603u-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mt7603u-aml" PKG_VERSION="0c53dfb" PKG_SHA256="9e3eab02f3c3dd7de373c5d631c2069771e6ad783ecda36a484030ab4ec0ccec" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/khadas/android_hardware_wifi_mtk_drivers_mt7603" PKG_URL="https://github.com/khadas/android_hardware_wifi_mtk_drivers_mt7603/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="mt7603u Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" pre_make_target() { unset LDFLAGS } make_target() { make LINUX_SRC=$(kernel_path) \ ARCH=$TARGET_KERNEL_ARCH \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ RT28xx_DIR=$PKG_BUILD \ -f $PKG_BUILD/Makefile } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; mkdir -p $INSTALL/$(get_full_firmware_dir) cp $PKG_BUILD/conf/MT7603USTA.dat $INSTALL/$(get_full_firmware_dir) } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/mt7603u-aml/patches/mt7603u-aml-001-firmware-path.patch ================================================ diff --git a/include/os/rt_linux.h b/include/os/rt_linux.h index 9ddc4ea..258907a 100755 --- a/include/os/rt_linux.h +++ b/include/os/rt_linux.h @@ -201,7 +201,7 @@ typedef struct usb_ctrlrequest devctrlrequest; #ifdef CONFIG_STA_SUPPORT #ifdef RTMP_MAC_PCI -#define STA_PROFILE_PATH "/system/etc/wifi/RT2870STA_7603.dat" +#define STA_PROFILE_PATH "/lib/firmware/RT2870STA_7603.dat" #define STA_DRIVER_VERSION "3.0.0.0" #ifdef MULTIPLE_CARD_SUPPORT #define CARD_INFO_PATH "/etc/Wireless/RT2860STA/RT2860STACard.dat" @@ -210,12 +210,12 @@ typedef struct usb_ctrlrequest devctrlrequest; #ifdef RTMP_MAC_USB #ifdef HE_BD_CFG80211_SUPPORT -#define STA_PROFILE_PATH "/system/etc/wifi/RT2870STA_7603.dat" +#define STA_PROFILE_PATH "/lib/firmware/RT2870STA_7603.dat" #else #ifdef USE_CHIP_DEPENDENT_PROFILE_NAME -#define STA_PROFILE_PATH "/system/etc/wifi/RT2870STA_7603.dat" +#define STA_PROFILE_PATH "/lib/firmware/RT2870STA_7603.dat" #else -#define STA_PROFILE_PATH "/system/etc/wifi/RT2870STA_7603.dat" +#define STA_PROFILE_PATH "/lib/firmware/RT2870STA_7603.dat" #endif /* USE_CHIP_DEPENDENT_PROFILE_NAME */ #endif /* HE_BD_CFG80211_SUPPORT */ #define STA_DRIVER_VERSION "JEDI.L0.MP1.mt7603u.v1.8" @@ -227,7 +227,7 @@ typedef struct usb_ctrlrequest devctrlrequest; #ifdef RTMP_MAC_SDIO -#define STA_PROFILE_PATH "/system/etc/wifi/RT2870STA_7603.dat" +#define STA_PROFILE_PATH "/lib/firmware/RT2870STA_7603.dat" #define STA_DRIVER_VERSION "3.0.0.0" #ifdef MULTIPLE_CARD_SUPPORT #define CARD_INFO_PATH "/etc/Wireless/RT2870STA/RT2870STACard.dat" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/mt7603u-aml/patches/mt7603u-aml-002-fix-building.patch ================================================ diff --git a/Makefile b/Makefile index 65d0a5c..7fc16f4 100755 --- a/Makefile +++ b/Makefile @@ -234,7 +234,7 @@ endif ifeq ($(PREALLOC), YES) #build prealloc.ko cp -f $(RT28xx_DIR)/os/linux/Makefile.6.prealloc $(RT28xx_DIR)/os/linux/Makefile - $(MAKE) ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules + $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules endif cp -f $(RT28xx_DIR)/os/linux/Makefile.6 $(RT28xx_DIR)/os/linux/Makefile ifeq ($(PLATFORM),DM6446) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/mt7603u-aml/patches/mt7603u-aml-003-fix-build-the-vpeter-way.patch ================================================ diff --git a/Makefile b/Makefile index 65d0a5c..9f665ba 100755 --- a/Makefile +++ b/Makefile @@ -184,7 +184,7 @@ THREADX: $(MAKE) -C $(RT28xx_DIR)/os/Threadx -f $(RT28xx_DIR)/os/ThreadX/Makefile LINUX: -ifneq (,$(findstring 2.4,$(LINUX_SRC))) +ifneq (,) ifeq ($(OSABL),YES) cp -f os/linux/Makefile.4.util $(RT28xx_DIR)/os/linux/Makefile @@ -330,7 +330,7 @@ endif uninstall: ifeq ($(TARGET), LINUX) -ifneq (,$(findstring 2.4,$(LINUX_SRC))) +ifneq (,) $(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.4 uninstall else $(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.6 uninstall @@ -339,7 +339,7 @@ endif install: ifeq ($(TARGET), LINUX) -ifneq (,$(findstring 2.4,$(LINUX_SRC))) +ifneq (,) $(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.4 install else $(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.6 install @@ -347,7 +347,7 @@ endif endif libwapi: -ifneq (,$(findstring 2.4,$(LINUX_SRC))) +ifneq (,) cp -f os/linux/Makefile.libwapi.4 $(RT28xx_DIR)/os/linux/Makefile $(MAKE) -C $(RT28xx_DIR)/os/linux/ else @@ -357,7 +357,7 @@ endif osutil: ifeq ($(OSABL),YES) -ifneq (,$(findstring 2.4,$(LINUX_SRC))) +ifneq (,) cp -f os/linux/Makefile.4.util $(RT28xx_DIR)/os/linux/Makefile $(MAKE) -C $(RT28xx_DIR)/os/linux/ else @@ -371,7 +371,7 @@ endif osnet: ifeq ($(OSABL),YES) -ifneq (,$(findstring 2.4,$(LINUX_SRC))) +ifneq (,) cp -f os/linux/Makefile.4.netif $(RT28xx_DIR)/os/linux/Makefile $(MAKE) -C $(RT28xx_DIR)/os/linux/ else @@ -384,7 +384,7 @@ endif endif osdrv: -ifneq (,$(findstring 2.4,$(LINUX_SRC))) +ifneq (,) cp -f os/linux/Makefile.4 $(RT28xx_DIR)/os/linux/Makefile $(MAKE) -C $(RT28xx_DIR)/os/linux/ else ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/mt7610u-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.tv) PKG_NAME="mt7610u-aml" PKG_VERSION="c7a38f2bdde7a9e70f5d0753d4810f32dd1f6720" PKG_SHA256="84bfa9aa8b56f7db4b43fac56a6b9e267bf8cb13f94aeff22d1aa38a7a965e86" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/osmc/mt7610u" PKG_URL="https://github.com/osmc/mt7610u/archive/$PKG_VERSION.tar.gz" PKG_SOURCE_DIR="mt7610u-$PKG_VERSION/mt7610u" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="mt7610u Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" pre_make_target() { unset LDFLAGS } make_target() { make LINUX_SRC=$(kernel_path) \ ARCH=$TARGET_KERNEL_ARCH \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ RT28xx_DIR=$PKG_BUILD \ -f $PKG_BUILD/Makefile } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/mt7610u-aml/patches/mt7610u-0001-fix-cross-compiling.patch ================================================ diff --git a/Makefile b/Makefile index 38fcc3e..91a6aec 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ OSABL = NO ifneq ($(TARGET),THREADX) #RT28xx_DIR = home directory of RT28xx source code -RT28xx_DIR = $(shell pwd) +RT28xx_DIR ?= $(shell pwd) endif include $(RT28xx_DIR)/os/linux/config.mk @@ -196,11 +196,12 @@ endif ifeq ($(PLATFORM),PC) # Linux 2.6 -LINUX_SRC = /lib/modules/$(shell uname -r)/build +LINUX_SRC ?= /lib/modules/$(shell uname -r)/build # Linux 2.4 Change to your local setting #LINUX_SRC = /usr/src/linux-2.4 -LINUX_SRC_MODULE = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless/ -CROSS_COMPILE = +LINUX_SRC_MODULE ?= /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless/ +CROSS_COMPILE ?=aarch64-linux-gnu- +ARCH ?=arm64 endif ifeq ($(PLATFORM),INTELP6) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/mt7610u-aml/patches/mt7610u-0002-support-more-cards.patch ================================================ diff --git a/common/rtusb_dev_id.c b/common/rtusb_dev_id.c index 1855e06..8146402 100644 --- a/common/rtusb_dev_id.c +++ b/common/rtusb_dev_id.c @@ -36,7 +36,27 @@ /* module table */ USB_DEVICE_ID rtusb_dev_id[] = { #ifdef MT76x0 - {USB_DEVICE(0x0E8D,0x7610)}, /* MT7610U */ + { USB_DEVICE(0x148F, 0x7610) }, /* MT7610U */ + { USB_DEVICE(0x13B1, 0x003E) }, /* Linksys AE6000 */ + { USB_DEVICE(0x0E8D, 0x7610) }, /* Sabrent NTWLAC */ + { USB_DEVICE(0x7392, 0xa711) }, /* Edimax 7711mac */ + { USB_DEVICE(0x7392, 0xb711) }, /* Edimax / Elecom */ + { USB_DEVICE(0x148f, 0x761a) }, /* TP-Link TL-WDN5200 */ + { USB_DEVICE(0x148f, 0x760a) }, /* TP-Link unknown */ + { USB_DEVICE(0x0b05, 0x17d1) }, /* Asus USB-AC51 */ + { USB_DEVICE(0x0b05, 0x17db) }, /* Asus USB-AC50 */ + { USB_DEVICE(0x0df6, 0x0075) }, /* Sitecom WLA-3100 */ + { USB_DEVICE(0x2019, 0xab31) }, /* Planex GW-450D */ + { USB_DEVICE(0x2001, 0x3d02) }, /* D-LINK DWA-171 rev B1 */ + { USB_DEVICE(0x0586, 0x3425) }, /* Zyxel NWD6505 */ + { USB_DEVICE(0x07b8, 0x7610) }, /* AboCom AU7212 */ + { USB_DEVICE(0x04bb, 0x0951) }, /* I-O DATA WN-AC433UK */ + { USB_DEVICE(0x057c, 0x8502) }, /* AVM FRITZ!WLAN USB Stick AC 430 */ + { USB_DEVICE(0x293c, 0x5702) }, /* Comcast Xfinity KXW02AAA */ + { USB_DEVICE(0x20f4, 0x806b) }, /* TRENDnet TEW-806UBH */ + { USB_DEVICE(0x7392, 0xc711) }, /* Devolo Wifi ac Stick */ + { USB_DEVICE(0x0df6, 0x0079) }, /* Sitecom Europe B.V. ac Stick */ + { USB_DEVICE(0x2357, 0x0105) }, /* TP-LINK Archer T1U */ #endif { }/* Terminating entry */ }; ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/mt7610u-aml/patches/mt7610u-aml-003-fix-build-the-vpeter-way.patch ================================================ diff --git a/Makefile b/Makefile index 38fcc3e..3836bb3 100644 --- a/Makefile +++ b/Makefile @@ -340,7 +340,7 @@ THREADX: $(MAKE) -C $(RT28xx_DIR)/os/Threadx -f $(RT28xx_DIR)/os/ThreadX/Makefile LINUX: -ifneq (,$(findstring 2.4,$(LINUX_SRC))) +ifneq (,) ifeq ($(OSABL),YES) cp -f os/linux/Makefile.4.util $(RT28xx_DIR)/os/linux/Makefile @@ -468,7 +468,7 @@ endif uninstall: ifeq ($(TARGET), LINUX) -ifneq (,$(findstring 2.4,$(LINUX_SRC))) +ifneq (,) $(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.4 uninstall else $(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.6 uninstall @@ -477,7 +477,7 @@ endif install: ifeq ($(TARGET), LINUX) -ifneq (,$(findstring 2.4,$(LINUX_SRC))) +ifneq (,) $(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.4 install else $(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.6 install @@ -485,7 +485,7 @@ endif endif libwapi: -ifneq (,$(findstring 2.4,$(LINUX_SRC))) +ifneq (,) cp -f os/linux/Makefile.libwapi.4 $(RT28xx_DIR)/os/linux/Makefile $(MAKE) -C $(RT28xx_DIR)/os/linux/ else @@ -495,7 +495,7 @@ endif osutil: ifeq ($(OSABL),YES) -ifneq (,$(findstring 2.4,$(LINUX_SRC))) +ifneq (,) cp -f os/linux/Makefile.4.util $(RT28xx_DIR)/os/linux/Makefile $(MAKE) -C $(RT28xx_DIR)/os/linux/ else @@ -506,7 +506,7 @@ endif osnet: ifeq ($(OSABL),YES) -ifneq (,$(findstring 2.4,$(LINUX_SRC))) +ifneq (,) cp -f os/linux/Makefile.4.netif $(RT28xx_DIR)/os/linux/Makefile $(MAKE) -C $(RT28xx_DIR)/os/linux/ else @@ -516,7 +516,7 @@ endif endif osdrv: -ifneq (,$(findstring 2.4,$(LINUX_SRC))) +ifneq (,) cp -f os/linux/Makefile.4 $(RT28xx_DIR)/os/linux/Makefile $(MAKE) -C $(RT28xx_DIR)/os/linux/ else diff --git a/os/linux/config.mk b/os/linux/config.mk index 4ffdfd7..956fe85 100644 --- a/os/linux/config.mk +++ b/os/linux/config.mk @@ -894,7 +894,7 @@ WFLAGS += -DRT_BIG_ENDIAN -DINF_TWINPASS endif ifeq ($(PLATFORM),INF_DANUBE) -ifneq (,$(findstring 2.4,$(LINUX_SRC))) +ifneq (,) # Linux 2.4 WFLAGS += -DINF_DANUBE -DRT_BIG_ENDIAN else @@ -998,7 +998,7 @@ export CFLAGS endif ifeq ($(PLATFORM),INF_DANUBE) - ifneq (,$(findstring 2.4,$(LINUX_SRC))) + ifneq (,) CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic else CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic @@ -1032,7 +1032,7 @@ export CFLAGS endif ifeq ($(PLATFORM),PC) - ifneq (,$(findstring 2.4,$(LINUX_SRC))) + ifneq (,) # Linux 2.4 CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS) export CFLAGS @@ -1098,7 +1098,7 @@ export CFLAGS endif ifeq ($(PLATFORM),MT85XX) - ifneq (,$(findstring 2.4,$(LINUX_SRC))) + ifneq (,) # Linux 2.4 CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS) export CFLAGS @@ -1120,7 +1120,7 @@ ifeq ($(PLATFORM),MT85XX) endif ifeq ($(PLATFORM),NXP_TV550) - ifneq (,$(findstring 2.4,$(LINUX_SRC))) + ifneq (,) # Linux 2.4 CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=mips -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS) export CFLAGS ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/mt7668-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.tv) PKG_NAME="mt7668-aml" PKG_VERSION="fd76e10404b220c552fc7951f5a359b56d599e3b" PKG_SHA256="1fb62a608b9ce8ba8157a8025ba0d76ad1d085510b27982e4af33575d2841308" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/khadas/android_hardware_wifi_mtk_drivers_mt7668" PKG_URL="https://github.com/khadas/android_hardware_wifi_mtk_drivers_mt7668/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="mt7668 Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" pre_make_target() { unset LDFLAGS } make_target() { make EXTRA_CFLAGS="-w" \ KERNELDIR=$(kernel_path) \ ARCH=$TARGET_KERNEL_ARCH \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ -f $PKG_BUILD/Makefile } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; mkdir -p $INSTALL/$(get_full_firmware_dir) cp $PKG_BUILD/7668_firmware/* $INSTALL/$(get_full_firmware_dir) } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/rtl8822b_bt/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="rtl8822b_bt" PKG_VERSION="4dfa50ab6150aa51a6e03bbcd479c8d2e68bfa2b" PKG_SHA256="bf9205c4ac1a5893cdbd3ca98ab82e5636244fef50e375fc0148a3db7153fe51" PKG_LICENSE="GPL" PKG_SITE="https://github.com/ChalesYu/rtl8822bs-aml" PKG_URL="https://github.com/ChalesYu/rtl8822bs-aml/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain rkbin" PKG_LONGDESC="RTL8822B BT Linux firmware" PKG_TOOLCHAIN="manual" unpack() { mkdir -p $PKG_BUILD tar --strip-components=2 -xf $SOURCES/$PKG_NAME/$PKG_NAME-$PKG_VERSION.tar.gz -C $PKG_BUILD rtl8822bs-aml-$PKG_VERSION/bluetooth } makeinstall_target() { mkdir -p $INSTALL/usr/bin cp -a $(get_build_dir rkbin)/firmware/bin/rtk_hciattach $INSTALL/usr/bin/8822b_hciattach mkdir -p $INSTALL/$(get_full_firmware_dir)/rtlbt cp -a $PKG_BUILD/rtl8822b_config.bin $INSTALL/$(get_full_firmware_dir)/rtlbt/rtl8822b_config cp -a $PKG_BUILD/rtl8822b_fw.bin $INSTALL/$(get_full_firmware_dir)/rtlbt/rtl8822b_fw } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/rtl8822b_bt/system.d/rtl8822b_bt-firmware.service ================================================ [Unit] Description=Attach /dev/ttyS1 to BlueZ stack Wants=bluetooth.service Before=bluetooth.service After=dev-ttyS1.device [Service] Type=simple ExecStartPre=/usr/sbin/rfkill unblock bluetooth ExecStart=/usr/bin/8822b_hciattach -n -s 115200 /dev/ttyS1 rtk_h5 ExecStopPost=/usr/sbin/rfkill block bluetooth ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/rtl8822b_bt/udev.d/80-rtl8822b_bt.rules ================================================ ################################################################################ # udev rules file for loading rtl8822b_bt-firmware ################################################################################ ACTION!="add", GOTO="end" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x024c", ATTRS{device}=="0xb822", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rtl8822b_bt-firmware.service" GOTO="end" LABEL="end" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/ssv6xxx-aml-3.14/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ssv6xxx-aml-3.14" PKG_VERSION="1041e7d" PKG_SHA256="1d96db8eec06c8a2c43f2c8024cc573e2bbce08fb0504fd9b6671224335e7d5f" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="http://libreelec.tv" PKG_URL="https://sources.libreelec.tv/devel/ssv6xxx-aml-1041e7d.tar.xz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="ssv6xxx Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" pre_configure_target() { sed -i 's,hw_cap_p2p = on,hw_cap_p2p = off,g' firmware/ssv6051-wifi.cfg } pre_make_target() { unset LDFLAGS } make_target() { if [ "$TARGET_KERNEL_ARCH" = "arm64" ]; then PLATFORM="aml-s905" else PLATFORM="aml-s805" fi cd $PKG_BUILD ./ver_info.pl include/ssv_version.h cp Makefile.android Makefile sed -i 's,PLATFORMS =,PLATFORMS = '"$PLATFORM"',g' Makefile make module SSV_ARCH="$TARGET_KERNEL_ARCH" \ SSV_CROSS="$TARGET_KERNEL_PREFIX" \ SSV_KERNEL_PATH="$(kernel_path)" } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; mkdir -p $INSTALL/$(get_full_firmware_dir)/ssv6051 cp $PKG_BUILD/firmware/* $INSTALL/$(get_full_firmware_dir)/ssv6051 } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/linux-drivers/ssv6xxx-aml-3.14/patches/ssv6xxx-aml-3.14-001-fix-build-and-firmware-path.patch ================================================ diff --git a/Makefile.android b/Makefile.android index 82211e1..0deeee5 100755 --- a/Makefile.android +++ b/Makefile.android @@ -2,10 +2,8 @@ PLATFORMS = KBUILD_TOP := $(PWD) -SSV_PATH=$(ANDROID_BUILD_TOP)/hardware/wifi/icomm/ssv6xxx/ssv6051/ - -include $(SSV_PATH)/ssv6051.cfg -include $(SSV_PATH)/platform-config.mak +include ${KBUILD_TOP}/ssv6051.cfg +include ${KBUILD_TOP}/platform-config.mak PWD := $(shell pwd) @@ -69,7 +67,7 @@ obj-$(CONFIG_SSV6200_CORE) += $(KMODULE_NAME).o all:module strip module: - make -C $(SSV_KERNEL_PATH) ARCH=$(SSV_ARCH) CROSS_COMPILE=$(SSV_CROSS) \ + $(MAKE) -C $(SSV_KERNEL_PATH) ARCH=$(SSV_ARCH) CROSS_COMPILE=$(SSV_CROSS) \ EXTRA_CFLAGS="$(EXTRA_CFLAGS)" M=$(PWD) modules install: @@ -92,6 +90,6 @@ ifneq ($(SSV_STRIP),) endif clean: - make -C $(SSV_KERNEL_PATH) ARCH=$(SSV_ARCH) CROSS_COMPILE=$(SSV_CROSS) \ + $(MAKE) -C $(SSV_KERNEL_PATH) ARCH=$(SSV_ARCH) CROSS_COMPILE=$(SSV_CROSS) \ M=$(PWD) clean rm $(DEF_PARSER_H) diff --git a/firmware/ssv6051-wifi.cfg b/firmware/ssv6051-wifi.cfg index 6c3a823..9c623a0 100755 --- a/firmware/ssv6051-wifi.cfg +++ b/firmware/ssv6051-wifi.cfg @@ -11,7 +11,7 @@ # Priority.3 default firmware ################################################## -firmware_path = /system/etc/wifi/ssv6051/ +firmware_path = /usr/lib/firmware/ssv6051/ ############################################################ # MAC address diff --git a/platform-config.mak b/platform-config.mak index bf35b70..f02e2b5 100755 --- a/platform-config.mak +++ b/platform-config.mak @@ -5,7 +5,7 @@ CONFIG_SSV6200_CORE=m ########################################################################### # Compiler options # ########################################################################### -ccflags-y += -Werror +# ccflags-y += -Werror # Enable -g to help debug. Deassembly from .o to .S would help to track to # the problomatic line from call stack dump. diff --git a/ssv6051.cfg b/ssv6051.cfg index 7cf12c2..a6960fa 100755 --- a/ssv6051.cfg +++ b/ssv6051.cfg @@ -16,6 +16,6 @@ ccflags-y += -DCONFIG_SSV_RSSI #SSV_CROSS = $(ANDROID_BUILD_TOP)/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android- #SSV_KERNEL_PATH = $(ANDROID_BUILD_TOP)/out/target/product/p201/obj/KERNEL_OBJ/ -SSV_ARCH = arm64 +#SSV_ARCH = arm64 #KMODDESTDIR = $(MODDESTDIR) diff --git a/ssvdevice/ssvdevice.c b/ssvdevice/ssvdevice.c index ff4305e..375827f 100755 --- a/ssvdevice/ssvdevice.c +++ b/ssvdevice/ssvdevice.c @@ -35,7 +35,7 @@ MODULE_AUTHOR("iComm Semiconductor Co., Ltd"); MODULE_DESCRIPTION("Shared library for SSV wireless LAN cards."); MODULE_LICENSE("Dual BSD/GPL"); -static char *stacfgpath = NULL; +static char *stacfgpath = "/usr/lib/firmware/ssv6051/ssv6051-wifi.cfg"; EXPORT_SYMBOL(stacfgpath); module_param(stacfgpath, charp, 0000); MODULE_PARM_DESC(stacfgpath, "Get path of sta cfg"); ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/old_ee_3.14_kernel/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="old_ee_3.14_kernel" PKG_VERSION="1" PKG_SITE="" PKG_URL="" PKG_LONGDESC="Old alternative kernel for Amlogic-old" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/share/bootloader cp ${PKG_BUILD}/* ${INSTALL}/usr/share/bootloader } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/opengl-meson/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="opengl-meson" PKG_VERSION="7bddce621a0c1e0cc12cfc8b707e93eb37fc0f82" PKG_SHA256="15400e78b918b15743b815c195be472899d4243143e405a7b50d5be1cd07ffd1" PKG_LICENSE="nonfree" PKG_SITE="http://openlinux.amlogic.com:8000/download/ARM/filesystem/" PKG_URL="https://github.com/CoreELEC/opengl-meson/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="OpenGL ES pre-compiled libraries for Mali GPUs found in Amlogic Meson SoCs." PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib if [[ "${ARCH}" == "arm" ]]; then cp -p lib/eabihf/m450/r7p0/fbdev/libMali.so ${INSTALL}/usr/lib/libMali.so mkdir -p ${SYSROOT_PREFIX}/usr/lib cp -p lib/eabihf/m450/r7p0/fbdev/libMali.so ${SYSROOT_PREFIX}/usr/lib else cp -p lib/arm64/m450/r7p0/fbdev/libMali.so ${INSTALL}/usr/lib mkdir -p ${SYSROOT_PREFIX}/usr/lib cp -p lib/arm64/m450/r7p0/fbdev/libMali.so ${SYSROOT_PREFIX}/usr/lib fi ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libmali.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libmali.so.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libEGL.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libEGL.so.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libEGL.so.1.0.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLES_CM.so.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv1_CM.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv1_CM.so.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv1_CM.so.1.0.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv1_CM.so.1.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv2.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv2.so.2 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv2.so.2.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv2.so.2.0.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so.3 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so.3.1 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so.3.0 ln -sf /usr/lib/libMali.so ${INSTALL}/usr/lib/libGLESv3.so.3.0.0 # install headers and libraries to TOOLCHAIN cp -rf ${PKG_BUILD}/include/* ${SYSROOT_PREFIX}/usr/include cp -rf ${PKG_BUILD}/pkgconfig/* ${SYSROOT_PREFIX}/usr/lib/pkgconfig cp ${SYSROOT_PREFIX}/usr/include/EGL_platform/platform_fbdev/* ${SYSROOT_PREFIX}/usr/include/EGL rm -rf ${SYSROOT_PREFIX}/usr/include/EGL_platform ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libmali.so ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libMali.so.0 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libEGL.so ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libEGL.so.1 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libEGL.so.1.0.0 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLES_CM.so.1 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv1_CM.so ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv1_CM.so.1 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv1_CM.so.1.0.1 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv1_CM.so.1.1 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv2.so ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv2.so.2 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv2.so.2.0 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv2.so.2.0.0 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv3.so ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv3.so.1 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv3.so.3 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv3.so.3.0 ln -sf ${SYSROOT_PREFIX}/usr/lib/libMali.so ${SYSROOT_PREFIX}/usr/lib/libGLESv3.so.3.0.0 # mkdir -p ${INSTALL}/usr/sbin # cp $PKG_DIR/scripts/libmali-overlay-setup ${INSTALL}/usr/sbin } post_install() { enable_service unbind-console.service # enable_service libmali.service } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/opengl-meson/scripts/libmali-overlay-setup ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) mkdir -p /var/lib32 ln -sf /usr/lib/libMali.so /var/lib/libMali.so ln -sf /usr/lib32/libMali.m450.so /var/lib32/libMali.so ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/opengl-meson/sources/pkgconfig/egl.pc ================================================ prefix=/usr exec_prefix=${prefix} libdir=/usr/lib includedir=${prefix}/include Name: egl Description: libhybris EGL library # Set to 7.10 because some package like weston are usually built # against mesa and because of that expect certain version from egl. Version: 7.10 Libs: -L${libdir} -lEGL Cflags: -I${includedir} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/opengl-meson/sources/pkgconfig/glesv1_cm.pc ================================================ prefix=/usr exec_prefix=${prefix} libdir=/usr/lib includedir=${prefix}/include Name: glesv1_cm Description: libhybris OpenGL ES 1.1 library Version: 0.1.0 Libs: -L${libdir} -lGLESv1_CM Cflags: -I${includedir} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/opengl-meson/sources/pkgconfig/glesv2.pc ================================================ prefix=/usr exec_prefix=${prefix} libdir=/usr/lib includedir=${prefix}/include Name: glesv2 Description: libhybris OpenGL ES 2.0 library Version: 0.1.0 Libs: -L${libdir} -lGLESv2 Cflags: -I${includedir} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/opengl-meson/sources/pkgconfig/glesv3.pc ================================================ prefix=/usr exec_prefix=${prefix} libdir=/usr/lib includedir=${prefix}/include Name: glesv3 Description: libhybris OpenGL ES 3.0 library Version: 0.1.0 Libs: -L${libdir} -lGLESv3 Cflags: -I${includedir} ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/opengl-meson/system.d/unbind-console.service ================================================ [Unit] Description=Unbind framebuffer console ConditionPathExists=/sys/class/vtconsole/vtcon1/bind [Service] Type=oneshot ExecStart=/bin/sh -c 'echo 0 > /sys/class/vtconsole/vtcon1/bind' [Install] WantedBy=graphical.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/opengl-meson/system.d-disabled/libmali.service ================================================ [Unit] Description=Create libMali overlay for specific AML device After=var.mount Before=kodi.service [Service] Type=oneshot ExecStart=/usr/sbin/libmali-overlay-setup [Install] WantedBy=local-fs.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/qca9377-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="qca9377-aml" PKG_VERSION="311e24939b53d0cbaf303cde3ed1dc22349602a9" PKG_SHA256="238e0174ec5ca3f87c184fade5eb7d1e4522d6af279aac6bd87f8bab24fc13ad" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://boundarydevices.com/new-silex-wifi-802-11ac-bt4-1-module/" PKG_URL="https://github.com/boundarydevices/qcacld-2.0/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="qca9377 Linux Driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" PKG_PATCH_DIRS="$LINUX" post_unpack() { sed -i 's,-Wall,,g; s,-Werror,,g' $PKG_BUILD/Kbuild sed -i 's,CDEFINES :=,CDEFINES := -Wno-misleading-indentation -Wno-unused-variable -Wno-unused-function,g' $PKG_BUILD/Kbuild } pre_make_target() { unset LDFLAGS unset CFLAGS } make_target() { make KERNEL_SRC="$(kernel_path)" \ ARCH=$TARGET_KERNEL_ARCH \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/qca9377-aml/patches/amlogic-3.14/patch.patch ================================================ From 7d4ee23fb20cc5e17d8d79db20a0d6704ac3df6c Mon Sep 17 00:00:00 2001 From: kszaq <kszaquitto@gmail.com> Date: Tue, 10 Jan 2017 22:43:12 +0100 Subject: [PATCH] Modify SDIO and firmware handling to support chips used in Amlogic devices --- CORE/HDD/src/wlan_hdd_cfg.c | 10 +- CORE/HDD/src/wlan_hdd_main.c | 180 ++++++++++++++++++++- CORE/SERVICES/BMI/ol_fw.c | 8 +- CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c | 6 - .../sdio/linux/native_sdio/include/hif_internal.h | 2 +- CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c | 62 +++---- 6 files changed, 209 insertions(+), 59 deletions(-) diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c index 14524ef..439b18a 100644 --- a/CORE/HDD/src/wlan_hdd_cfg.c +++ b/CORE/HDD/src/wlan_hdd_cfg.c @@ -60,6 +60,8 @@ #include <pmcApi.h> #include <wlan_hdd_misc.h> +extern int qca_request_firmware(const struct firmware **firmware_p, const char *name,struct device *device); + static char *mac_param; module_param_named(mac, mac_param, charp, S_IRUGO); MODULE_PARM_DESC(mac, "mac address override"); @@ -4411,11 +4413,11 @@ VOS_STATUS hdd_parse_config_ini(hdd_context_t* pHddCtx) memset(cfgIniTable, 0, sizeof(cfgIniTable)); - status = request_firmware(&fw, WLAN_INI_FILE, pHddCtx->parent_dev); + status = qca_request_firmware(&fw, WLAN_INI_FILE, pHddCtx->parent_dev); if(status) { - printk("%s: request_firmware failed %d",__func__, status); + printk("%s: qca_request_firmware failed %d",__func__, status); vos_status = VOS_STATUS_E_FAILURE; goto config_exit; } @@ -5104,11 +5106,11 @@ VOS_STATUS hdd_update_mac_config(hdd_context_t *pHddCtx) } memset(macTable, 0, sizeof(macTable)); - status = request_firmware(&fw, WLAN_MAC_FILE, pHddCtx->parent_dev); + status = qca_request_firmware(&fw, WLAN_MAC_FILE, pHddCtx->parent_dev); if (status) { - hddLog(VOS_TRACE_LEVEL_WARN, "%s: request_firmware failed %d", + hddLog(VOS_TRACE_LEVEL_WARN, "%s: qca_request_firmware failed %d", __func__, status); vos_status = VOS_STATUS_E_FAILURE; return vos_status; diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index 00db789..7926902 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -239,6 +239,163 @@ static VOS_STATUS hdd_parse_ese_beacon_req(tANI_U8 *pValue, /* * Android DRIVER command structures */ +//tkun add + typedef char A_CHAR; + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) + #define GET_INODE_FROM_FILEP(filp) \ + (filp)->f_path.dentry->d_inode + #else + #define GET_INODE_FROM_FILEP(filp) \ + (filp)->f_dentry->d_inode + #endif +// #define A_MALLOC(size) kmalloc((size), GFP_KERNEL) + #define A_MALLOC_NOWAIT(size) kmalloc((size), GFP_ATOMIC) +// #define A_FREE(addr) kfree(addr);addr=NULL; +//#define A_MEMCPY(dst, src, len) memcpy((dst), (src), (len)) +// #define A_MEMZERO(addr, len) memset((addr), 0, (len)) + #define A_MEMCMP(addr1, addr2, len) memcmp((addr1), (addr2), (len)) + #define A_ROUND_UP(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) + + char qcafwpath[256] = "/lib/firmware"; + + int android_readwrite_file(const A_CHAR *filename, A_CHAR *rbuf, const A_CHAR *wbuf, size_t length) + { + int ret = 0; + struct file *filp = (struct file *)-ENOENT; + mm_segment_t oldfs; + oldfs = get_fs(); + set_fs(KERNEL_DS); + + // printk("%s: filename %s \n",__func__,filename); + do { + int mode = (wbuf) ? O_RDWR : O_RDONLY; + filp = filp_open(filename, mode, S_IRUSR); + if (IS_ERR(filp) || !filp->f_op) { + printk("%s: file %s filp_open error\n", __FUNCTION__, filename); + ret = -ENOENT; + break; + } + + if (length==0) { + /* Read the length of the file only */ + struct inode *inode; + + inode = GET_INODE_FROM_FILEP(filp); + if (!inode) { + // printk("%s: Get inode from %s failed\n", __FUNCTION__, filen ame); + ret = -ENOENT; + break; + } + ret = i_size_read(inode->i_mapping->host); + break; + } + + if (wbuf) { + if ( (ret=filp->f_op->write(filp, wbuf, length, &filp->f_pos)) < 0) { +// printk("%s: Write %u bytes to file %s error %d\n", __FUNCTION__, + // length, filename, ret); + break; + } + } else { + if ( (ret=filp->f_op->read(filp, rbuf, length, &filp->f_pos)) < 0) { +// printk ("%s: Read %u bytes from file %s error %d\n", __FUNCTION__, + // length, filename, ret); + break; + } + } + } while (0); + + if (!IS_ERR(filp)) { + filp_close(filp, NULL); + } + set_fs(oldfs); + + return ret; + } + + + int android_request_firmware(const struct firmware **firmware_p, const char *name,struct device *device) + { + int ret = 0; + struct firmware *firmware; + char filename[256]; + const char *raw_filename = name; + *firmware_p = firmware = A_MALLOC(sizeof(*firmware)); + if (!firmware) + return -ENOMEM; + A_MEMZERO(firmware, sizeof(*firmware)); + do { + size_t length, bufsize, bmisize; + + if (snprintf(filename, sizeof(filename), "%s/%s", qcafwpath, + raw_filename) >= sizeof(filename)) { + printk("snprintf: %s/%s\n", qcafwpath, raw_filename); + ret = -1; + break; + } + if ( (ret=android_readwrite_file(filename, NULL, NULL, 0)) < 0) { + break; + } else { + length = ret; + } + + if (strcmp(raw_filename, "softmac") == 0) { + bufsize = length = 17; + } else { + bufsize = ALIGN(length, PAGE_SIZE); + bmisize = A_ROUND_UP(length, 4); + bufsize = max(bmisize, bufsize); + } + firmware->data = vmalloc(bufsize); + firmware->size = length; + + // printk("AR6K: %s(): raw_filename=%s, bufsize=%d\n", __FUNCTION__, ra w_filename, bufsize); + + if (!firmware->data) { + printk("%s: Cannot allocate buffer for firmware\n", __FUNCTION__); + ret = -ENOMEM; + break; + } + + if ( (ret=android_readwrite_file(filename, (char*)firmware->data, NULL, length)) != length) { +// printk("%s: file read error, ret %d request %d\n", __FUNCTION__,ret,length); +// ret = -1; + break; + } + + } while (0); + + if (ret<0) { + if (firmware) { + if (firmware->data) + vfree(firmware->data); + A_FREE(firmware); + } + *firmware_p = NULL; + } else { + ret = 0; + } + return ret; + } + + void android_release_firmware(const struct firmware *firmware) + { + if (firmware) { + if (firmware->data) + vfree(firmware->data); + kfree(firmware); + } + } +extern int qca_request_firmware(const struct firmware **firmware_p,const char *name,struct device *device) + { + // int uevent = 1; + + //return _request_firmware(firmware_p, name, device, uevent, false); + + return android_request_firmware(firmware_p, name,device); + + + } struct android_wifi_reassoc_params { unsigned char bssid[18]; int channel; @@ -7801,7 +7958,7 @@ VOS_STATUS hdd_get_cfg_file_size(v_VOID_t *pCtx, char *pFileName, v_SIZE_t *pBuf ENTER(); - status = request_firmware(&pHddCtx->fw, pFileName, pHddCtx->parent_dev); + status = qca_request_firmware(&pHddCtx->fw, pFileName, pHddCtx->parent_dev); if(status || !pHddCtx->fw || !pHddCtx->fw->data) { hddLog(VOS_TRACE_LEVEL_FATAL,"%s: CFG download failed",__func__); @@ -7842,7 +7999,7 @@ VOS_STATUS hdd_read_cfg_file(v_VOID_t *pCtx, char *pFileName, ENTER(); - status = request_firmware(&pHddCtx->fw, pFileName, pHddCtx->parent_dev); + status = qca_request_firmware(&pHddCtx->fw, pFileName, pHddCtx->parent_dev); if(status || !pHddCtx->fw || !pHddCtx->fw->data) { hddLog(VOS_TRACE_LEVEL_FATAL,"%s: CFG download failed",__func__); @@ -12886,15 +13043,34 @@ static int hdd_driver_init( void) \return - 0 for success, non zero for failure --------------------------------------------------------------------------*/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) +extern int wifi_setup_dt(void); +extern void wifi_teardown_dt(void); +#endif +extern void extern_wifi_set_enable(int is_on); +extern void sdio_reinit(void); + #ifdef MODULE static int __init hdd_module_init ( void) { +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) + wifi_setup_dt(); +#endif + extern_wifi_set_enable(0); + mdelay(200); + extern_wifi_set_enable(1); + mdelay(200); +sdio_reinit(); + return hdd_driver_init(); } #else /* #ifdef MODULE */ static int __init hdd_module_init ( void) { /* Driver initialization is delayed to fwpath_changed_handler */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) +wifi_teardown_dt(); +#endif return 0; } #endif /* #ifdef MODULE */ diff --git a/CORE/SERVICES/BMI/ol_fw.c b/CORE/SERVICES/BMI/ol_fw.c index 466dbbc..95f1aee 100644 --- a/CORE/SERVICES/BMI/ol_fw.c +++ b/CORE/SERVICES/BMI/ol_fw.c @@ -118,7 +118,7 @@ static int ol_get_fw_files_for_target(struct ol_fw_files *pfw_files, return 0; } #endif - +extern int qca_request_firmware(const struct firmware **firmware_p, const char *name,struct device *device); #ifdef HIF_USB static A_STATUS ol_usb_extra_initialization(struct ol_softc *scn); #endif @@ -164,7 +164,7 @@ static int ol_transfer_single_bin_file(struct ol_softc *scn, __func__)); } - if (request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) + if (qca_request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) { AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Failed to get %s\n", @@ -492,7 +492,7 @@ static int ol_transfer_bin_file(struct ol_softc *scn, ATH_BIN_FILE file, break; } - if (request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) + if (qca_request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) { printk("%s: Failed to get %s\n", __func__, filename); @@ -506,7 +506,7 @@ static int ol_transfer_bin_file(struct ol_softc *scn, ATH_BIN_FILE file, filename = scn->fw_files.board_data; printk("%s: Trying to load default %s\n", __func__, filename); - if (request_firmware(&fw_entry, filename, + if (qca_request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) { printk("%s: Failed to get %s\n", __func__, filename); diff --git a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c index c99020e..6bafed8 100644 --- a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c +++ b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c @@ -234,12 +234,6 @@ ath_hif_sdio_remove(void *context, void *hif_handle) { ENTER(); - if (!sc) { - VOS_TRACE(VOS_MODULE_ID_HIF, VOS_TRACE_LEVEL_ERROR, - "Global SDIO context is NULL"); - return A_ERROR; - } - athdiag_procfs_remove(); #ifndef TARGET_DUMP_FOR_NON_QC_PLATFORM diff --git a/CORE/SERVICES/HIF/sdio/linux/native_sdio/include/hif_internal.h b/CORE/SERVICES/HIF/sdio/linux/native_sdio/include/hif_internal.h index 382e38c..234bc09 100644 --- a/CORE/SERVICES/HIF/sdio/linux/native_sdio/include/hif_internal.h +++ b/CORE/SERVICES/HIF/sdio/linux/native_sdio/include/hif_internal.h @@ -112,7 +112,7 @@ struct hif_device { A_BOOL swap_mailbox; }; -#define HIF_DMA_BUFFER_SIZE (4 * 1024) +#define HIF_DMA_BUFFER_SIZE (56 * 1024) #define CMD53_FIXED_ADDRESS 1 #define CMD53_INCR_ADDRESS 2 diff --git a/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c b/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c index 1c54002..03401fd 100644 --- a/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c +++ b/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c @@ -64,7 +64,8 @@ ((request->request & HIF_WRITE)&& \ (request->address >= 0x1000 && request->address < 0x1FFFF)) #endif -unsigned int mmcbusmode = 0; +//unsigned int mmcbusmode = 0; +unsigned int mmcbusmode = 5; module_param(mmcbusmode, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); MODULE_PARM_DESC(mmcbusmode, "Set MMC driver Bus Mode: 1-SDR12, 2-SDR25, 3-SDR50, 4-DDR50, 5-SDR104"); EXPORT_SYMBOL(mmcbusmode); @@ -74,7 +75,9 @@ module_param(mmcbuswidth, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); MODULE_PARM_DESC(mmcbuswidth, "Set MMC driver Bus Width: 1-1Bit, 4-4Bit, 8-8Bit"); EXPORT_SYMBOL(mmcbuswidth); -unsigned int mmcclock = 0; +//unsigned int mmcclock = 0; +//unsigned int mmcclock = 166666666; +unsigned int mmcclock = 200000000; module_param(mmcclock, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); MODULE_PARM_DESC(mmcclock, "Set MMC driver Clock value"); EXPORT_SYMBOL(mmcclock); @@ -95,7 +98,7 @@ unsigned int asyncintdelay = 2; module_param(asyncintdelay, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); MODULE_PARM_DESC(asyncintdelay, "Delay clock count for aysnc interrupt, 2 is default, vaild values are 1 and 2"); #else -unsigned int asyncintdelay = 0; +unsigned int asyncintdelay = 2; module_param(asyncintdelay, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); MODULE_PARM_DESC(asyncintdelay, "Delay clock count for aysnc interrupt, 0 is default, vaild values are 1 and 2"); #endif @@ -412,12 +415,6 @@ __HIFReadWrite(HIF_DEVICE *device, tbuffer = device->dma_buffer; /* copy the write data to the dma buffer */ AR_DEBUG_ASSERT(length <= HIF_DMA_BUFFER_SIZE); - if (length > HIF_DMA_BUFFER_SIZE) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, - ("AR6000: Invalid write length: %d\n", length)); - status = A_EINVAL; - break; - } memcpy(tbuffer, buffer, length); bounced = TRUE; } else { @@ -440,12 +437,6 @@ __HIFReadWrite(HIF_DEVICE *device, if (BUFFER_NEEDS_BOUNCE(buffer)) { AR_DEBUG_ASSERT(device->dma_buffer != NULL); AR_DEBUG_ASSERT(length <= HIF_DMA_BUFFER_SIZE); - if (length > HIF_DMA_BUFFER_SIZE) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, - ("AR6000: Invalid read length: %d\n", length)); - status = A_EINVAL; - break; - } tbuffer = device->dma_buffer; bounced = TRUE; } else { @@ -695,7 +686,7 @@ static int async_task(void *param) complete_and_exit(&device->async_completion, 0); return 0; } -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)) +#if 1 static A_INT32 IssueSDCommand(HIF_DEVICE *device, A_UINT32 opcode, A_UINT32 arg, A_UINT32 flags, A_UINT32 *resp) { struct mmc_command cmd; @@ -719,6 +710,7 @@ static A_INT32 IssueSDCommand(HIF_DEVICE *device, A_UINT32 opcode, A_UINT32 arg, return err; } #endif +//extern int sdio_reset_comm(struct mmc_card *card); A_STATUS ReinitSDIO(HIF_DEVICE *device) { A_INT32 err = 0; @@ -733,10 +725,12 @@ A_STATUS ReinitSDIO(HIF_DEVICE *device) host = card->host; AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("AR6000: +ReinitSDIO \n")); + +// err = sdio_reset_comm(card); +#if 1 sdio_claim_host(func); do { -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)) /* 2.6.32 kernel does part of the SDIO initalization upon resume */ A_BOOL lt_2_6_32 = (LINUX_VERSION_CODE<KERNEL_VERSION(2,6,32)); if (lt_2_6_32) { @@ -783,19 +777,10 @@ A_STATUS ReinitSDIO(HIF_DEVICE *device) break; } - if (!host->ocr) { - /* Issue CMD5, arg = 0 */ - err = IssueSDCommand(device, SD_IO_SEND_OP_COND, 0, (MMC_RSP_R4 | MMC_CMD_BCR), &resp); - if (err) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("ReinitSDIO: CMD5 failed : %d \n",err)); - break; - } - host->ocr = resp; - } /* Issue CMD5, arg = ocr. Wait till card is ready */ for (i=0;i<100;i++) { - err = IssueSDCommand(device, SD_IO_SEND_OP_COND, host->ocr, (MMC_RSP_R4 | MMC_CMD_BCR), &resp); + err = IssueSDCommand(device, SD_IO_SEND_OP_COND, 0, (MMC_RSP_R4 | MMC_CMD_BCR), &resp); if (err) { AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("ReinitSDIO: CMD5 failed : %d \n",err)); break; @@ -828,7 +813,7 @@ A_STATUS ReinitSDIO(HIF_DEVICE *device) break; } } -#endif + /* Enable high speed */ if (card->host->caps & MMC_CAP_SD_HIGHSPEED) { AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("ReinitSDIO: Set high speed mode\n")); @@ -891,7 +876,7 @@ A_STATUS ReinitSDIO(HIF_DEVICE *device) sdio_release_host(func); AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("AR6000: -ReinitSDIO \n")); - +#endif return (err) ? A_ERROR : A_OK; } @@ -1320,6 +1305,7 @@ static int hifDeviceInserted(struct sdio_func *func, const struct sdio_device_id /* TODO: MMC SDIO3.0 Setting should also be modified in ReInit() function when Power Manage work. */ +#if 1 { A_UINT32 clock, clock_set = 12500000; #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0) @@ -1576,7 +1562,7 @@ TODO: MMC SDIO3.0 Setting should also be modified in ReInit() function when Powe sdio_release_host(func); } - +#endif spin_lock_init(&device->lock); spin_lock_init(&device->asynclock); @@ -2068,12 +2054,10 @@ static int hifDeviceSuspend(struct device *dev) return -1; } } else { - if (wma_suspend_target(temp_module, 0)) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, ("PDEV Suspend Failed\n")); - return -1; - } + if (wma_suspend_target(temp_module, 0)) { + printk(KERN_ERR "wma_suspend_target failed.\n"); + } } - if (pm_flag & MMC_PM_WAKE_SDIO_IRQ){ AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("hifDeviceSuspend: wow enter\n")); config = HIF_DEVICE_POWER_DOWN; @@ -2293,9 +2277,7 @@ static HIF_DEVICE * addHifDevice(struct sdio_func *func) { HIF_DEVICE *hifdevice = NULL; -#if(LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0)) && !defined(WITH_BACKPORTS) int ret = 0; -#endif ENTER(); AR_DEBUG_ASSERT(func != NULL); hifdevice = (HIF_DEVICE *)A_MALLOC(sizeof(HIF_DEVICE)); @@ -2308,13 +2290,9 @@ addHifDevice(struct sdio_func *func) hifdevice->func = func; hifdevice->powerConfig = HIF_DEVICE_POWER_UP; hifdevice->DeviceState = HIF_DEVICE_STATE_ON; -#if(LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0)) && !defined(WITH_BACKPORTS) ret = sdio_set_drvdata(func, hifdevice); + EXIT("status %d", ret); -#else - sdio_set_drvdata(func, hifdevice); - EXIT(); -#endif return hifdevice; } -- 2.7.4 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/qca9377-aml/udev.d/99-qca9377-wireless.rules ================================================ ACTION=="add|change", SUBSYSTEM=="net", ENV{INTERFACE}=="wlan*", ATTRS{vendor}=="0x0271", RUN+="/usr/bin/systemctl restart connman.service" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/qca9377-firmware-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="qca9377-firmware-aml" PKG_VERSION="1.0.0-3" PKG_SHA256="9a9f214943e77e89ce8fc8c0dc5b41bc253478a9d92383a76590993df861f36d" PKG_ARCH="arm aarch64" PKG_LICENSE="BSD-3c" PKG_SITE="http://linode.boundarydevices.com/repos/apt/ubuntu-relx/pool/main/q/qca-firmware/" PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="qca9377 Linux firmware" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p $INSTALL/$(get_full_firmware_dir) cp -a * $INSTALL/$(get_full_firmware_dir) } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/qca9377-firmware-aml/udev.d/80-qca-firmware-aml.rules ================================================ ################################################################################ # udev rules file for loading qca9377-firmware-aml ################################################################################ ACTION=="add", SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x0271", ATTRS{device}=="0x0701", \ TAG+="systemd", ENV{SYSTEMD_WANTS}+="qca9377-firmware-aml.service" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/config/hosts.conf ================================================ # hosts.conf # This configuration file allows you to manually map hostnames to # IP addresses # Format: <ipaddress> <hostname1> <hostname2> # Example: 192.168.0.3 libreelec libreelec.mynetwork # NOTE: do not edit /etc/hosts directly # edit /storage/.config/hosts.conf then reboot ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/config/hwdb.d/README ================================================ Hardware Database Files The hwdb files are read from the files located in the system hwdb directory /usr/lib/udev/hwdb.d and the user runtime directory /storage/.config/hwdb.d All hwdb files are collectively sorted and processed in lexical order, regardless of the directories in which they live. However, files with identical filenames replace each other. /usr/lib/udev/hwdb.d/* takes precedence over /storage/.config/hwdb.d/* your files must be named 99-xxxxx.hwdb ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/config/logind.conf.d/README ================================================ LOGIND.CONF(5) logind.conf LOGIND.CONF(5) NAME logind.conf, logind.conf.d - Login manager configuration files SYNOPSIS /etc/systemd/logind.conf /etc/systemd/logind.conf.d/*.conf /run/systemd/logind.conf.d/*.conf /usr/lib/systemd/logind.conf.d/*.conf DESCRIPTION These files configure various parameters of the systemd login manager, systemd-logind.service(8). CONFIGURATION DIRECTORIES AND PRECEDENCE The default configuration is defined during compilation, so a configuration file is only needed when it is necessary to deviate from those defaults. By default, the configuration file in /etc/systemd/ contains commented out entries showing the defaults as a guide to the administrator. This file can be edited to create local overrides. When packages need to customize the configuration, they can install configuration snippets in /usr/lib/systemd/*.conf.d/. Files in /etc/ are reserved for the local administrator, who may use this logic to override the configuration files installed by vendor packages. The main configuration file is read before any of the configuration directories, and has the lowest precedence; entries in a file in any configuration directory override entries in the single configuration file. Files in the *.conf.d/ configuration subdirectories are sorted by their filename in lexicographic order, regardless of which of the subdirectories they reside in. When multiple files specify the same option, for options which accept just a single value, the entry in the file with the lexicographically latest name takes precedence. For options which accept a list of values, entries are collected as they occur in files sorted lexicographically. It is recommended to prefix all filenames in those subdirectories with a two-digit number and a dash, to simplify the ordering of the files. To disable a configuration file supplied by the vendor, the recommended way is to place a symlink to /dev/null in the configuration directory in /etc/, with the same filename as the vendor configuration file. OPTIONS All options are configured in the "[Login]" section: NAutoVTs= Takes a positive integer. Configures how many virtual terminals (VTs) to allocate by default that, when switched to and are previously unused, "autovt" services are automatically spawned on. These services are instantiated from the template unit autovt@.service for the respective VT TTY name, for example, autovt@tty4.service. By default, autovt@.service is linked to getty@.service. In other words, login prompts are started dynamically as the user switches to unused virtual terminals. Hence, this parameter controls how many login "gettys" are available on the VTs. If a VT is already used by some other subsystem (for example, a graphical login), this kind of activation will not be attempted. Note that the VT configured in ReserveVT= is always subject to this kind of activation, even if it is not one of the VTs configured with the NAutoVTs= directive. Defaults to 6. When set to 0, automatic spawning of "autovt" services is disabled. ReserveVT= Takes a positive integer. Identifies one virtual terminal that shall unconditionally be reserved for autovt@.service activation (see above). The VT selected with this option will be marked busy unconditionally, so that no other subsystem will allocate it. This functionality is useful to ensure that, regardless of how many VTs are allocated by other subsystems, one login "getty" is always available. Defaults to 6 (in other words, there will always be a "getty" available on Alt-F6.). When set to 0, VT reservation is disabled. KillUserProcesses= Takes a boolean argument. Configures whether the processes of a user should be killed when the user logs out. If true, the scope unit corresponding to the session and all processes inside that scope will be terminated. If false, the scope is "abandoned", see systemd.scope(5), and processes are not killed. Defaults to "yes", but see the options KillOnlyUsers= and KillExcludeUsers= below. In addition to session processes, user process may run under the user manager unit user@.service. Depending on the linger settings, this may allow users to run processes independent of their login sessions. See the description of enable-linger in loginctl(1). Note that setting KillUserProcesses=yes will break tools like screen(1) and tmux(1), unless they are moved out of the session scope. See example in systemd-run(1). KillOnlyUsers=, KillExcludeUsers= These settings take space-separated lists of usernames that override the KillUserProcesses= setting. A user name may be added to KillExcludeUsers= to exclude the processes in the session scopes of that user from being killed even if KillUserProcesses=yes is set. If KillExcludeUsers= is not set, the "root" user is excluded by default. KillExcludeUsers= may be set to an empty value to override this default. If a user is not excluded, KillOnlyUsers= is checked next. If this setting is specified, only the session scopes of those users will be killed. Otherwise, users are subject to the KillUserProcesses=yes setting. IdleAction= Configures the action to take when the system is idle. Takes one of "ignore", "poweroff", "reboot", "halt", "kexec", "suspend", "hibernate", "hybrid-sleep", and "lock". Defaults to "ignore". Note that this requires that user sessions correctly report the idle status to the system. The system will execute the action after all sessions report that they are idle, no idle inhibitor lock is active, and subsequently, the time configured with IdleActionSec= (see below) has expired. IdleActionSec= Configures the delay after which the action configured in IdleAction= (see above) is taken after the system is idle. InhibitDelayMaxSec= Specifies the maximum time a system shutdown or sleep request is delayed due to an inhibitor lock of type "delay" being active before the inhibitor is ignored and the operation executes anyway. Defaults to 5. HandlePowerKey=, HandleSuspendKey=, HandleHibernateKey=, HandleLidSwitch=, HandleLidSwitchExternalPower=, HandleLidSwitchDocked= Controls how logind shall handle the system power and sleep keys and the lid switch to trigger actions such as system power-off or suspend. Can be one of "ignore", "poweroff", "reboot", "halt", "kexec", "suspend", "hibernate", "hybrid-sleep", and "lock". If "ignore", logind will never handle these keys. If "lock", all running sessions will be screen-locked; otherwise, the specified action will be taken in the respective event. Only input devices with the "power-switch" udev tag will be watched for key/lid switch events. HandlePowerKey= defaults to "poweroff". HandleSuspendKey= and HandleLidSwitch= default to "suspend". HandleLidSwitchExternalPower= is completely ignored by default (for backwards compatibility) — an explicit value must be set before it will be used to determine behaviour. HandleLidSwitchDocked= defaults to "ignore". HandleHibernateKey= defaults to "hibernate". If the system is inserted in a docking station, or if more than one display is connected, the action specified by HandleLidSwitchDocked= occurs; if the system is on external power the action (if any) specified by HandleLidSwitchExternalPower= occurs; otherwise the HandleLidSwitch= action occurs. A different application may disable logind's handling of system power and sleep keys and the lid switch by taking a low-level inhibitor lock ("handle-power-key", "handle-suspend-key", "handle-hibernate-key", "handle-lid-switch"). This is most commonly used by graphical desktop environments to take over suspend and hibernation handling, and to use their own configuration mechanisms. If a low-level inhibitor lock is taken, logind will not take any action when that key or switch is triggered and the Handle*= settings are irrelevant. PowerKeyIgnoreInhibited=, SuspendKeyIgnoreInhibited=, HibernateKeyIgnoreInhibited=, LidSwitchIgnoreInhibited= Controls whether actions that systemd-logind takes when the power and sleep keys and the lid switch are triggered are subject to high-level inhibitor locks ("shutdown", "sleep", "idle"). Low level inhibitor locks ("handle-power-key", "handle-suspend-key", "handle-hibernate-key", "handle-lid-switch"), are always honored, irrespective of this setting. These settings take boolean arguments. If "no", the inhibitor locks taken by applications are respected. If "yes", "shutdown", "sleep", and "idle" inhibitor locks are ignored. PowerKeyIgnoreInhibited=, SuspendKeyIgnoreInhibited=, and HibernateKeyIgnoreInhibited= default to "no". LidSwitchIgnoreInhibited= defaults to "yes". This means that when systemd-logind is handling events by itself (no low level inhibitor locks are taken by another application), the lid switch does not respect suspend blockers by default, but the power and sleep keys do. HoldoffTimeoutSec= Specifies the timeout after system startup or system resume in which systemd will hold off on reacting to lid events. This is required for the system to properly detect any hotplugged devices so systemd can ignore lid events if external monitors, or docks, are connected. If set to 0, systemd will always react immediately, possibly before the kernel fully probed all hotplugged devices. This is safe, as long as you do not care for systemd to account for devices that have been plugged or unplugged while the system was off. Defaults to 30s. RuntimeDirectorySize= Sets the size limit on the $XDG_RUNTIME_DIR runtime directory for each user who logs in. Takes a size in bytes, optionally suffixed with the usual K, G, M, and T suffixes, to the base 1024 (IEC). Alternatively, a numerical percentage suffixed by "%" may be specified, which sets the size limit relative to the amount of physical RAM. Defaults to 10%. Note that this size is a safety limit only. As each runtime directory is a tmpfs file system, it will only consume as much memory as is needed. InhibitorsMax= Controls the maximum number of concurrent inhibitors to permit. Defaults to 8192 (8K). SessionsMax= Controls the maximum number of concurrent user sessions to manage. Defaults to 8192 (8K). Depending on how the pam_systemd.so module is included in the PAM stack configuration, further login sessions will either be refused, or permitted but not tracked by systemd-logind. UserTasksMax= Sets the maximum number of OS tasks each user may run concurrently. This controls the TasksMax= setting of the per-user slice unit, see systemd.resource-control(5) for details. If assigned the special value "infinity", no tasks limit is applied. Defaults to 33%, which equals 10813 with the kernel's defaults on the host, but might be smaller in OS containers. RemoveIPC= Controls whether System V and POSIX IPC objects belonging to the user shall be removed when the user fully logs out. Takes a boolean argument. If enabled, the user may not consume IPC resources after the last of the user's sessions terminated. This covers System V semaphores, shared memory and message queues, as well as POSIX shared memory and message queues. Note that IPC objects of the root user and other system users are excluded from the effect of this setting. Defaults to "yes". SEE ALSO systemd(1), systemd-logind.service(8), loginctl(1), systemd- system.conf(5) systemd 238 LOGIND.CONF(5) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/config/modules-load.d/README ================================================ Name modules-load.d — Configure kernel modules to load at boot Synopsis /etc/modules-load.d/*.conf /run/modules-load.d/*.conf /usr/lib/modules-load.d/*.conf Description systemd-modules-load.service(8) reads files from the above directories which contain kernel modules to load during boot in a static list. Each configuration file is named in the style of /etc/modules-load.d/program.conf. Note that it is usually a better idea to rely on the automatic module loading by PCI IDs, USB IDs, DMI IDs or similar triggers encoded in the kernel modules themselves instead of static configuration like this. In fact, most modern kernel modules are prepared for automatic loading already. Configuration Format The configuration files should simply contain a list of kernel module names to load, separated by newlines. Empty lines and lines whose first non-whitespace character is # or ; are ignored. Each configuration file shall be named in the style of program.conf. Files in /etc/ override files with the same name in /usr/lib/ and /run/. Files in /run/ override files with the same name in /usr/lib/. Packages should install their configuration files in /usr/lib/, files in /etc/ are reserved for the local administrator, who may use this logic to override the configuration files installed from vendor packages. If the administrator wants to disable a configuration file supplied by the vendor the recommended way is to place a symlink to /dev/null in /etc/modules-load.d/ bearing the same filename. Example Example 1. /etc/modules-load.d/virtio-net.conf example: # Load virtio-net.ko at boot virtio-net See Also systemd(1), systemd-modules-load.service(8), systemd-delta(1), modprobe(8) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/config/sleep.conf.d/README ================================================ NAME systemd-sleep.conf, sleep.conf.d - Suspend and hibernation configuration file SYNOPSIS /etc/systemd/sleep.conf /etc/systemd/sleep.conf.d/*.conf /run/systemd/sleep.conf.d/*.conf /usr/lib/systemd/sleep.conf.d/*.conf DESCRIPTION systemd supports three general power-saving modes: suspend a low-power state where execution of the OS is paused, and complete power loss might result in lost data, and which is fast to enter and exit. This corresponds to suspend, standby, or freeze states as understood by the kernel. hibernate a low-power state where execution of the OS is paused, and complete power loss does not result in lost data, and which might be slow to enter and exit. This corresponds to the hibernation as understood by the kernel. hybrid-sleep a low-power state where execution of the OS is paused, which might be slow to enter, and on complete power loss does not result in lost data but might be slower to exit in that case. This mode is called suspend-to-both by the kernel. Settings in these files determine what strings will be written to /sys/power/disk and /sys/power/state by systemd-sleep(8) when systemd(1) attempts to suspend or hibernate the machine. CONFIGURATION DIRECTORIES AND PRECEDENCE The default configuration is defined during compilation, so a configuration file is only needed when it is necessary to deviate from those defaults. By default, the configuration file in /etc/systemd/ contains commented out entries showing the defaults as a guide to the administrator. This file can be edited to create local overrides. When packages need to customize the configuration, they can install configuration snippets in /usr/lib/systemd/*.conf.d/. Files in /etc/ are reserved for the local administrator, who may use this logic to override the configuration files installed by vendor packages. The main configuration file is read before any of the configuration directories, and has the lowest precedence; entries in a file in any configuration directory override entries in the single configuration file. Files in the *.conf.d/ configuration subdirectories are sorted by their filename in lexicographic order, regardless of which of the subdirectories they reside in. If multiple files specify the same option, the entry in the file with the lexicographically latest name takes precedence. It is recommended to prefix all filenames in those subdirectories with a two-digit number and a dash, to simplify the ordering of the files. To disable a configuration file supplied by the vendor, the recommended way is to place a symlink to /dev/null in the configuration directory in /etc/, with the same filename as the vendor configuration file. OPTIONS The following options can be configured in the "[Sleep]" section of /etc/systemd/sleep.conf or a sleep.conf.d file: SuspendMode=, HibernateMode=, HybridSleepMode= The string to be written to /sys/power/disk by, respectively, systemd-suspend.service(8), systemd-hibernate.service(8), or systemd-hybrid-sleep.service(8). More than one value can be specified by separating multiple values with whitespace. They will be tried in turn, until one is written without error. If neither succeeds, the operation will be aborted. SuspendState=, HibernateState=, HybridSleepState= The string to be written to /sys/power/state by, respectively, systemd-suspend.service(8), systemd-hibernate.service(8), or systemd-hybrid-sleep.service(8). More than one value can be specified by separating multiple values with whitespace. They will be tried in turn, until one is written without error. If neither succeeds, the operation will be aborted. EXAMPLE: FREEZE Example: to exploit the “freeze” mode added in Linux 3.9, one can use systemctl suspend with [Sleep] SuspendState=freeze SEE ALSO systemd-sleep(8), systemd-suspend.service(8), systemd-hibernate.service(8), systemd-hybrid-sleep.service(8), systemd(1), systemd.directives(7) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/config/sleep.conf.d/sleep.conf.sample ================================================ [Sleep] SuspendMode=false HibernateMode=false ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/config/sysctl.d/README ================================================ Name sysctl.d — Configure kernel parameters at boot Synopsis /etc/sysctl.d/*.conf /run/sysctl.d/*.conf /usr/lib/sysctl.d/*.conf Description At boot, systemd-sysctl.service(8) reads configuration files from the above directories to configure sysctl(8) kernel parameters. Configuration Format The configuration files contain a list of variable assignments, separated by newlines. Empty lines and lines whose first non-whitespace character is # or ; are ignored. Note that both / and . are accepted as label separators within sysctl variable names. "kernel.domainname=foo" and "kernel/domainname=foo" hence are entirely equivalent. Each configuration file shall be named in the style of program.conf. Files in /etc/ override files with the same name in /usr/lib/ and /run/. Files in /run/ override files with the same name in /usr/lib/. Packages should install their configuration files in /usr/lib/. Files in /etc/ are reserved for the local administrator, who may use this logic to override the configuration files installed by vendor packages. All configuration files are sorted by their filename in alphabetical order, regardless in which of the directories they reside, to guarantee that a specific configuration file takes precedence over another file with an alphabetically later name, if both files contain the same variable setting. If the administrator wants to disable a configuration file supplied by the vendor, the recommended way is to place a symlink to /dev/null in /etc/sysctl.d/ bearing the same filename. Example Example 1. /etc/sysctl.d/domain-name.conf example: # Set kernel YP domain name kernel.domainname=example.com See Also systemd(1), systemd-sysctl.service(8), systemd-delta(1), sysctl(8), sysctl.conf(5) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/config/sysctl.d/qdisc.conf.sample ================================================ # This is a sample service script to switch to BBR TCP congestion control. # Please read carefully the comments in this file. For production usage # you can remove all comments (lines beginning with "#") from this file. # Switch to Fair Queue packet scheduler and BBR TCP congestion control net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr # Important: # This file must be renamed to qdisc.conf to overlap existing /usr/lib/sysctl.d/qdisc.conf ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/config/system.d/README ================================================ Name systemd.unit — Unit configuration Synopsis service.service, socket.socket, device.device, mount.mount, automount.automount, swap.swap, target.target, path.path, timer.timer, snapshot.snapshot, slice.slice, scope.scope /etc/systemd/system/* /run/systemd/system/* /usr/lib/systemd/system/* ... $HOME/.config/systemd/user/* /etc/systemd/user/* /run/systemd/user/* /usr/lib/systemd/user/* ... Description A unit configuration file encodes information about a service, a socket, a device, a mount point, an automount point, a swap file or partition, a start-up target, a watched file system path, a timer controlled and supervised by systemd(1), a temporary system state snapshot, a resource management slice or a group of externally created processes. The syntax is inspired by XDG Desktop Entry Specification .desktop files, which are in turn inspired by Microsoft Windows .ini files. This man page lists the common configuration options of all the unit types. These options need to be configured in the [Unit] or [Install] sections of the unit files. In addition to the generic [Unit] and [Install] sections described here, each unit may have a type-specific section, e.g. [Service] for a service unit. See the respective man pages for more information: systemd.service(5), systemd.socket(5), systemd.device(5), systemd.mount(5), systemd.automount(5), systemd.swap(5), systemd.target(5), systemd.path(5), systemd.timer(5), systemd.snapshot(5). systemd.slice(5). systemd.scope(5). Unit files are loaded from a set of paths determined during compilation, described in the next section. Unit files may contain additional options on top of those listed here. If systemd encounters an unknown option it will write a warning log message but continue loading the unit. If an option is prefixed with X- it is ignored completely by systemd. Applications may use this to include additional information in the unit files. Boolean arguments used in unit files can be written in various formats. For positive settings the strings 1, yes, true and on are equivalent. For negative settings the strings 0, no, false and off are equivalent. Time span values encoded in unit files can be written in various formats. A stand-alone number specifies a time in seconds. If suffixed with a time unit, the unit is honored. A concatenation of multiple values with units is supported, in which case the values are added up. Example: "50" refers to 50 seconds; "2min 200ms" refers to 2 minutes plus 200 milliseconds, i.e. 120200ms. The following time units are understood: s, min, h, d, w, ms, us. For details see systemd.time(7). Empty lines and lines starting with # or ; are ignored. This may be used for commenting. Lines ending in a backslash are concatenated with the following line while reading and the backslash is replaced by a space character. This may be used to wrap long lines. Along with a unit file foo.service the directory foo.service.wants/ may exist. All unit files symlinked from such a directory are implicitly added as dependencies of type Wanted= to the unit. This is useful to hook units into the start-up of other units, without having to modify their unit files. For details about the semantics of Wanted= see below. The preferred way to create symlinks in the .wants/ directory of a unit file is with the enable command of the systemctl(1) tool which reads information from the [Install] section of unit files (see below). A similar functionality exists for Requires= type dependencies as well, the directory suffix is .requires/ in this case. Along with a unit file foo.service a directory foo.service.d/ may exist. All files with the suffix ".conf" from this directory will be parsed after the file itself is parsed. This is useful to alter or add configuration settings to a unit, without having to modify their unit files. Make sure that the file that is included has the appropriate section headers before any directive. If a line starts with .include followed by a filename, the specified file will be parsed at this point. Make sure that the file that is included has the appropriate section headers before any directives. Note that while systemd offers a flexible dependency system between units it is recommended to use this functionality only sparingly and instead rely on techniques such as bus-based or socket-based activation which make dependencies implicit, resulting in a both simpler and more flexible system. Some unit names reflect paths existing in the file system namespace. Example: a device unit dev-sda.device refers to a device with the device node /dev/sda in the file system namespace. If this applies a special way to escape the path name is used, so that the result is usable as part of a filename. Basically, given a path, "/" is replaced by "-", and all unprintable characters and the "-" are replaced by C-style "\x20" escapes. The root directory "/" is encoded as single dash, while otherwise the initial and ending "/" is removed from all paths during transformation. This escaping is reversible. Optionally, units may be instantiated from a template file at runtime. This allows creation of multiple units from a single configuration file. If systemd looks for a unit configuration file it will first search for the literal unit name in the filesystem. If that yields no success and the unit name contains an "@" character, systemd will look for a unit template that shares the same name but with the instance string (i.e. the part between the "@" character and the suffix) removed. Example: if a service getty@tty3.service is requested and no file by that name is found, systemd will look for getty@.service and instantiate a service from that configuration file if it is found. To refer to the instance string from within the configuration file you may use the special "%i" specifier in many of the configuration options. See below for details. If a unit file is empty (i.e. has the file size 0) or is symlinked to /dev/null its configuration will not be loaded and it appears with a load state of "masked", and cannot be activated. Use this as an effective way to fully disable a unit, making it impossible to start it even manually. The unit file format is covered by the Interface Stability Promise. Unit Load Path Unit files are loaded from a set of paths determined during compilation, described in the two tables below. Unit files found in directories listed earlier override files with the same name in directories lower in the list. When systemd is running in user mode (--user) and the variable $SYSTEMD_UNIT_PATH is set, this contents of this variable overrides the unit load path. Table 1. Load path when running in system mode (--system). Path Description /etc/systemd/system Local configuration /run/systemd/systemd Runtime units /usr/lib/systemd/system Units of installed packages Table 2. Load path when running in user mode (--user). Path Description $HOME/.config/systemd/user User configuration /etc/systemd/user Local configuration /run/systemd/user Runtime units /usr/lib/systemd/user Units of installed packages Additional units might be loaded into systemd ("linked") from directories not on the unit load path. See the link command for systemctl(1). Also, some units are dynamically created via generators Generators. Options Unit file may include a [Unit] section, which carries generic information about the unit that is not dependent on the type of unit: Description= A free-form string describing the unit. This is intended for use in UIs to show descriptive information along with the unit name. Documentation= A space-separated list of URIs referencing documentation for this unit or its configuration. Accepted are only URIs of the types "http://", "https://", "file:", "info:", "man:". For more information about the syntax of these URIs, see uri(7). The URIs should be listed in order of relevance, starting with the most relevant. It is a good idea to first reference documentation that explains what the unit's purpose is, followed by how it is configured, followed by any other related documentation. This option may be specified more than once in which case the specified list of URIs is merged. If the empty string is assigned to this option, the list is reset and all prior assignments will have no effect. Requires= Configures requirement dependencies on other units. If this unit gets activated, the units listed here will be activated as well. If one of the other units gets deactivated or its activation fails, this unit will be deactivated. This option may be specified more than once, in which case requirement dependencies for all listed names are created. Note that requirement dependencies do not influence the order in which services are started or stopped. This has to be configured independently with the After= or Before= options. If a unit foo.service requires a unit bar.service as configured with Requires= and no ordering is configured with After= or Before=, then both units will be started simultaneously and without any delay between them if foo.service is activated. Often it is a better choice to use Wants= instead of Requires= in order to achieve a system that is more robust when dealing with failing services. Note that dependencies of this type may also be configured outside of the unit configuration file by adding a symlink to a .requires/ directory accompanying the unit file. For details see above. RequiresOverridable= Similar to Requires=. Dependencies listed in RequiresOverridable= which cannot be fulfilled or fail to start are ignored if the startup was explicitly requested by the user. If the start-up was pulled in indirectly by some dependency or automatic start-up of units that is not requested by the user this dependency must be fulfilled and otherwise the transaction fails. Hence, this option may be used to configure dependencies that are normally honored unless the user explicitly starts up the unit, in which case whether they failed or not is irrelevant. Requisite=, RequisiteOverridable= Similar to Requires= and RequiresOverridable=, respectively. However, if a unit listed here is not started already it will not be started and the transaction fails immediately. Wants= A weaker version of Requires=. A unit listed in this option will be started if the configuring unit is. However, if the listed unit fails to start up or cannot be added to the transaction this has no impact on the validity of the transaction as a whole. This is the recommended way to hook start-up of one unit to the start-up of another unit. Note that dependencies of this type may also be configured outside of the unit configuration file by adding a symlink to a .wants/ directory accompanying the unit file. For details see above. BindsTo= Configures requirement dependencies, very similar in style to Requires=, however in addition to this behavior it also declares that this unit is stopped when any of the units listed suddenly disappears. Units can suddenly, unexpectedly disappear if a service terminates on its own choice, a device is unplugged or a mount point unmounted without involvement of systemd. PartOf= Configures dependencies similar to Requires=, but limited to stopping and restarting of units. When systemd stops or restarts the units listed here, the action is propagated to this unit. Note that this is a one way dependency - changes to this unit do not affect the listed units. Conflicts= Configures negative requirement dependencies. If a unit has a Conflicts= setting on another unit, starting the former will stop the latter and vice versa. Note that this setting is independent of and orthogonal to the After= and Before= ordering dependencies. If a unit A that conflicts with a unit B is scheduled to be started at the same time as B, the transaction will either fail (in case both are required part of the transaction) or be modified to be fixed (in case one or both jobs are not a required part of the transaction). In the latter case the job that is not the required will be removed, or in case both are not required the unit that conflicts will be started and the unit that is conflicted is stopped. Before=, After= Configures ordering dependencies between units. If a unit foo.service contains a setting Before=bar.service and both units are being started, bar.service's start-up is delayed until foo.service is started up. Note that this setting is independent of and orthogonal to the requirement dependencies as configured by Requires=. It is a common pattern to include a unit name in both the After= and Requires= option in which case the unit listed will be started before the unit that is configured with these options. This option may be specified more than once, in which case ordering dependencies for all listed names are created. After= is the inverse of Before=, i.e. while After= ensures that the configured unit is started after the listed unit finished starting up, Before= ensures the opposite, i.e. that the configured unit is fully started up before the listed unit is started. Note that when two units with an ordering dependency between them are shut down, the inverse of the start-up order is applied. i.e. if a unit is configured with After= on another unit, the former is stopped before the latter if both are shut down. If one unit with an ordering dependency on another unit is shut down while the latter is started up, the shut down is ordered before the start-up regardless whether the ordering dependency is actually of type After= or Before=. If two units have no ordering dependencies between them they are shut down or started up simultaneously, and no ordering takes place. OnFailure= Lists one or more units that are activated when this unit enters the "failed" state. PropagatesReloadTo=, ReloadPropagatedFrom= Lists one or more units where reload requests on the unit will be propagated to/on the other unit will be propagated from. Issuing a reload request on a unit will automatically also enqueue a reload request on all units that the reload request shall be propagated to via these two settings. RequiresMountsFor= Takes a space-separated list of absolute paths. Automatically adds dependencies of type Requires= and After= for all mount units required to access the specified path. OnFailureIsolate= Takes a boolean argument. If true the unit listed in OnFailure= will be enqueued in isolation mode, i.e. all units that are not its dependency will be stopped. If this is set only a single unit may be listed in OnFailure=. Defaults to false. IgnoreOnIsolate= Takes a boolean argument. If true this unit will not be stopped when isolating another unit. Defaults to false. IgnoreOnSnapshot= Takes a boolean argument. If true this unit will not be included in snapshots. Defaults to true for device and snapshot units, false for the others. StopWhenUnneeded= Takes a boolean argument. If true this unit will be stopped when it is no longer used. Note that in order to minimize the work to be executed, systemd will not stop units by default unless they are conflicting with other units, or the user explicitly requested their shut down. If this option is set, a unit will be automatically cleaned up if no other active unit requires it. Defaults to false. RefuseManualStart=, RefuseManualStop= Takes a boolean argument. If true this unit can only be activated or deactivated indirectly. In this case explicit start-up or termination requested by the user is denied, however if it is started or stopped as a dependency of another unit, start-up or termination will succeed. This is mostly a safety feature to ensure that the user does not accidentally activate units that are not intended to be activated explicitly, and not accidentally deactivate units that are not intended to be deactivated. These options default to false. AllowIsolate= Takes a boolean argument. If true this unit may be used with the systemctl isolate command. Otherwise this will be refused. It probably is a good idea to leave this disabled except for target units that shall be used similar to runlevels in SysV init systems, just as a precaution to avoid unusable system states. This option defaults to false. DefaultDependencies= Takes a boolean argument. If true (the default), a few default dependencies will implicitly be created for the unit. The actual dependencies created depend on the unit type. For example, for service units, these dependencies ensure that the service is started only after basic system initialization is completed and is properly terminated on system shutdown. See the respective man pages for details. Generally, only services involved with early boot or late shutdown should set this option to false. It is highly recommended to leave this option enabled for the majority of common units. If set to false, this option does not disable all implicit dependencies, just non-essential ones. JobTimeoutSec= When clients are waiting for a job of this unit to complete, time out after the specified time. If this time limit is reached the job will be cancelled, the unit however will not change state or even enter the "failed" mode. This value defaults to 0 (job timeouts disabled), except for device units. NB: this timeout is independent from any unit-specific timeout (for example, the timeout set with Timeout= in service units) as the job timeout has no effect on the unit itself, only on the job that might be pending for it. Or in other words: unit-specific timeouts are useful to abort unit state changes, and revert them. The job timeout set with this option however is useful to abort only the job waiting for the unit state to change. ConditionPathExists=, ConditionPathExistsGlob=, ConditionPathIsDirectory=, ConditionPathIsSymbolicLink=, ConditionPathIsMountPoint=, ConditionPathIsReadWrite=, ConditionDirectoryNotEmpty=, ConditionFileNotEmpty=, ConditionFileIsExecutable=, ConditionKernelCommandLine=, ConditionVirtualization=, ConditionSecurity=, ConditionCapability=, ConditionHost=, ConditionACPower=, ConditionNull= Before starting a unit verify that the specified condition is true. If it is not true the starting of the unit will be skipped, however all ordering dependencies of it are still respected. A failing condition will not result in the unit being moved into a failure state. The condition is checked at the time the queued start job is to be executed. With ConditionPathExists= a file existence condition is checked before a unit is started. If the specified absolute path name does not exist the condition will fail. If the absolute path name passed to ConditionPathExists= is prefixed with an exclamation mark ("!"), the test is negated, and the unit is only started if the path does not exist. ConditionPathExistsGlob= is similar to ConditionPathExists=, but checks for the existence of at least one file or directory matching the specified globbing pattern. ConditionPathIsDirectory= is similar to ConditionPathExists= but verifies whether a certain path exists and is a directory. ConditionPathIsSymbolicLink= is similar to ConditionPathExists= but verifies whether a certain path exists and is a symbolic link. ConditionPathIsMountPoint= is similar to ConditionPathExists= but verifies whether a certain path exists and is a mount point. ConditionPathIsReadWrite= is similar to ConditionPathExists= but verifies whether the underlying file system is readable and writable (i.e. not mounted read-only). ConditionDirectoryNotEmpty= is similar to ConditionPathExists= but verifies whether a certain path exists and is a non-empty directory. ConditionFileNotEmpty= is similar to ConditionPathExists= but verifies whether a certain path exists and refers to a regular file with a non-zero size. ConditionFileIsExecutable= is similar to ConditionPathExists= but verifies whether a certain path exists, is a regular file and marked executable. Similar, ConditionKernelCommandLine= may be used to check whether a specific kernel command line option is set (or if prefixed with the exclamation mark unset). The argument must either be a single word, or an assignment (i.e. two words, separated "="). In the former case the kernel command line is searched for the word appearing as is, or as left hand side of an assignment. In the latter case the exact assignment is looked for with right and left hand side matching. ConditionVirtualization= may be used to check whether the system is executed in a virtualized environment and optionally test whether it is a specific implementation. Takes either boolean value to check if being executed in any virtualized environment, or one of vm and container to test against a generic type of virtualization solution, or one of qemu, kvm, vmware, microsoft, oracle, xen, bochs, chroot, uml, openvz, lxc, lxc-libvirt, systemd-nspawn to test against a specific implementation. If multiple virtualization technologies are nested only the innermost is considered. The test may be negated by prepending an exclamation mark. ConditionSecurity= may be used to check whether the given security module is enabled on the system. Currently the recognized values values are selinux, apparmor, ima and smack. The test may be negated by prepending an exclamation mark. ConditionCapability= may be used to check whether the given capability exists in the capability bounding set of the service manager (i.e. this does not check whether capability is actually available in the permitted or effective sets, see capabilities(7) for details). Pass a capability name such as "CAP_MKNOD", possibly prefixed with an exclamation mark to negate the check. ConditionHost= may be used to match against the hostname or machine ID of the host. This either takes a hostname string (optionally with shell style globs) which is tested against the locally set hostname as returned by gethostname(2), or a machine ID formatted as string (see machine-id(5)). The test may be negated by prepending an exclamation mark. ConditionACPower= may be used to check whether the system has AC power, or is exclusively battery powered at the time of activation of the unit. This takes a boolean argument. If set to true the condition will hold only if at least one AC connector of the system is connected to a power source, or if no AC connectors are known. Conversely, if set to false the condition will hold only if there is at least one AC connector known and all AC connectors are disconnected from a power source. Finally, ConditionNull= may be used to add a constant condition check value to the unit. It takes a boolean argument. If set to false the condition will always fail, otherwise succeed. If multiple conditions are specified the unit will be executed if all of them apply (i.e. a logical AND is applied). Condition checks can be prefixed with a pipe symbol (|) in which case a condition becomes a triggering condition. If at least one triggering condition is defined for a unit then the unit will be executed if at least one of the triggering conditions apply and all of the non-triggering conditions. If you prefix an argument with the pipe symbol and an exclamation mark the pipe symbol must be passed first, the exclamation second. Except for ConditionPathIsSymbolicLink=, all path checks follow symlinks. If any of these options is assigned the empty string the list of conditions is reset completely, all previous condition settings (of any kind) will have no effect. SourcePath= A path to a configuration file this unit has been generated from. This is primarily useful for implementation of generator tools that convert configuration from an external configuration file format into native unit files. Thus functionality should not be used in normal units. Unit file may include a [Install] section, which carries installation information for the unit. This section is not interpreted by systemd(1) during runtime. It is used exclusively by the enable and disable commands of the systemctl(1) tool during installation of a unit: Alias= Additional names this unit shall be installed under. The names listed here must have the same suffix (i.e. type) as the unit file name. This option may be specified more than once, in which case all listed names are used. At installation time, systemctl enable will create symlinks from these names to the unit filename. WantedBy=, RequiredBy= A symbolic link is created in the .wants/ or .requires/ directory of the listed unit when this unit is activated by systemctl enable. This has the effect that a dependency of type Wants= or Requires= is added from the listed unit to the current unit. The primary result is that the current unit will be started when the listed unit is started. See the description of Wants= and Requires= in the [Unit] section for details. WantedBy=foo.service in a service bar.service is mostly equivalent to Alias=foo.service.wants/bar.service in the same file. In case of template units, systemctl enable must be called with an instance name, and this instance will be added to the .wants/ or .requires/ list of the listed unit. E.g. WantedBy=getty.target in a service getty@.service will result in systemctl enable getty@tty2.service creating a getty.target.wants/getty@tty2.service link to getty@.service. Also= Additional units to install/deinstall when this unit is installed/deinstalled. If the user requests installation/deinstallation of a unit with this option configured, systemctl enable and systemctl disable will automatically install/uninstall units listed in this option as well. The following specifiers are interpreted in the Install section: %n, %N, %p, %i, %U, %u, %m, %H, %b, %v. For their meaning see the next section. Specifiers Many settings resolve specifiers which may be used to write generic unit files referring to runtime or unit parameters that are replaced when the unit files are loaded. The following specifiers are understood: Table 3. Specifiers available in unit files Specifier Meaning Details "%n" Full unit name "%N" Unescaped full unit name "%p" Prefix name For instantiated units this refers to the string before the @. For non-instantiated units this refers to to the name of the unit with the type suffix removed. "%P" Unescaped prefix name "%i" Instance name For instantiated units: this is the string between the "@" character and the suffix. "%I" Unescaped instance name "%f" Unescaped filename This is either the unescaped instance name (if applicable) with / prepended (if applicable), or the prefix name similarly prepended with /. "%c" Control group path of the unit "%r" Root control group path where units are placed. For system instances this usually resolves to /system, except in containers, where the path might be prefixed with the container's root control group. "%R" Parent directory of the control group path where units are placed. For system instances this usually resolves to /, except in containers, where this resolves to the container's root directory. This specifier is particularly useful in the ControlGroup= setting (see systemd.exec(5)). "%t" Runtime socket dir This is either /run (for the system manager) or "$XDG_RUNTIME_DIR" (for user managers). "%u" User name This is the name of the configured user of the unit, or (if none is set) the user running the systemd instance. "%U" User UID This is the UID of the configured user of the unit, or (if none is set) the user running the systemd instance. "%h" User home directory This is the home directory of the configured user of the unit, or (if none is set) the user running the systemd instance. "%s" User shell This is the shell of the configured user of the unit, or (if none is set) the user running the systemd instance. If the user is "root" (UID equal to 0), the shell configured in account database is ignored and /bin/sh is always used. "%m" Machine ID The machine ID of the running system, formatted as string. See machine-id(5) for more information. "%b" Boot ID The boot ID of the running system, formatted as string. See random(4) for more information. "%H" Host name The hostname of the running system. "%v" Kernel release Identical to uname -r output. "%%" Escaped % Single percent sign. See Also systemd(1), systemctl(8), systemd.special(7), systemd.service(5), systemd.socket(5), systemd.device(5), systemd.mount(5), systemd.automount(5), systemd.swap(5), systemd.target(5), systemd.path(5), systemd.timer(5), systemd.snapshot(5), systemd.scope(5), systemd.slice(5), systemd.time(7), capabilities(7), systemd.directives(7), uname(1) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/config/system.d/cifs.mount.sample ================================================ # This is a sample service script to mount CIFS/SAMBA shares. # Please read carefully the comments in this file. For production usage # you can remove all comments (lines beginning with "#") from this file. [Unit] # The description should be used to explain what this servicefile is for Description=test cifs mount script # if we do network mounts like here we *require* 'network-online.service' # which checks if the network is online Requires=network-online.service # our scripts must start *after* 'network-online.service', on timeout and if # 'network-online.service' fails we can not mount and this scripts fails too After=network-online.service # usually we mount networks shares because we want they avaible *before* XBMC starts. # so XBMC has access to this mounts from beginning. Note: this slows down the boot! Before=kodi.service [Mount] # The share we want mount What=//192.168.0.31/Music # Where we want mount this share Where=/storage/music2 # Any options you usually use with the "-o" parameter in the mount command Options=username=myusername,password=mypassword # filesystem type Type=cifs [Install] # The target is used by 'systemctl enable <name_of_this_file.mount>' to link # this service to a runlevel for starting on boot. usually 'multi-user.target' # is ok here. WantedBy=multi-user.target # Important: # this file must be renamed to <mountpoint>.mount where <mountpoint>, is the FULL path # where the share will be mounted but slashes "/" MUST BE REPLACED with dashes "-" with .mount # as extension. # This means, if we want mount to "/storage/music2" (see above "Where=/storage/music2") # then this file must be renamed to 'storage-music2.mount' and can be enabled via ssh with the # command 'systemctl enable storage-music2.mount' ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/config/system.d/nfs.mount.sample ================================================ # This is a sample service script to mount NFS shares. # Please read carefully the comments in this file. For production usage # you can remove all comments (lines beginning with "#") from this file. [Unit] # The description should be used to explain what this servicefile is for Description=test nfs mount script # if we do network mounts like here we *require* 'network-online.service' # which checks if the network is online Requires=network-online.service # our scripts must start *after* 'network-online.service', on timeout and if # 'network-online.service' fails we can not mount and this scripts fails too After=network-online.service # usually we mount networks shares because we want they avaible *before* XBMC starts. # so XBMC has access to this mounts from beginning. Note: this slows down the boot! Before=kodi.service [Mount] # The share we want mount What=192.168.0.31:/movies # Where we want mount this share Where=/storage/movies2 # Any options you usually use with the "-o" parameter in the mount command Options= # filesystem type Type=nfs [Install] # The target is used by 'systemctl enable <name_of_this_file.mount>' to link # this service to a runlevel for starting on boot. usually 'multi-user.target' # is ok here. WantedBy=multi-user.target # Important: # this file must be renamed to <mountpoint>.mount where <mountpoint>, is the FULL path # where the share will be mounted but slashes "/" MUST BE REPLACED with dashes "-" with .mount # as extension. # This means, if we want mount to "/storage/movies2" (see above "Where=/storage/movies2") # then this file must be renamed to 'storage-movies2.mount' and can be enabled via ssh with the # command 'systemctl enable storage-movies2.mount' ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/config/system.d/openvpn.service.sample ================================================ [Unit] Description=OpenVPN Autorun Service [Service] Type=forking Requires=network-online.service After=network-online.service ExecStart=/usr/sbin/openvpn --daemon --config /storage/.config/openvpn.config Restart=always RestartSec=15 [Install] WantedBy=kodi.target # NOTES: # # 1) Edit /storage/.config/openvpn.config to the .config/.conf/.ovpn file # from your VPN service provider and test it works first by connecting at # the console: # # /usr/sbin/openvpn --daemon --config /storage/.config/openvpn.config # # 2) The openvpn.service file must be addeded to the active systemd config # before it will work. This is done by running: # # systemctl enable openvpn.service # # 3) If you suspend/resume your LibreELEC system you will need to stop and # restart the connection with a systemd *.power script, e.g. # # mkdir -p /storage/.config/sleep.d # nano /storage/.config/sleep.d/01-openvpn.power # # Copy the sample script below. Remove # marks except for #!/bin/bash # # #!/bin/sh # case "$1" in # pre) # systemctl stop openvpn.service # ;; # post) # systemctl start openvpn.service # ;; # esac ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/config/timesyncd.conf.d/README ================================================ TIMESYNCD.CONF(5) timesyncd.conf TIMESYNCD.CONF(5) NAME timesyncd.conf, timesyncd.conf.d - Network Time Synchronization configuration files SYNOPSIS /etc/systemd/timesyncd.conf /etc/systemd/timesyncd.conf.d/*.conf /run/systemd/timesyncd.conf.d/*.conf /usr/lib/systemd/timesyncd.conf.d/*.conf DESCRIPTION These configuration files control NTP network time synchronization. See systemd.syntax(5) for a general description of the syntax. CONFIGURATION DIRECTORIES AND PRECEDENCE The default configuration is defined during compilation, so a configuration file is only needed when it is necessary to deviate from those defaults. By default, the configuration file in /etc/systemd/ contains commented out entries showing the defaults as a guide to the administrator. This file can be edited to create local overrides. When packages need to customize the configuration, they can install configuration snippets in /usr/lib/systemd/*.conf.d/. Files in /etc/ are reserved for the local administrator, who may use this logic to override the configuration files installed by vendor packages. The main configuration file is read before any of the configuration directories, and has the lowest precedence; entries in a file in any configuration directory override entries in the single configuration file. Files in the *.conf.d/ configuration subdirectories are sorted by their filename in lexicographic order, regardless of which of the subdirectories they reside in. When multiple files specify the same option, for options which accept just a single value, the entry in the file with the lexicographically latest name takes precedence. For options which accept a list of values, entries are collected as they occur in files sorted lexicographically. It is recommended to prefix all filenames in those subdirectories with a two-digit number and a dash, to simplify the ordering of the files. To disable a configuration file supplied by the vendor, the recommended way is to place a symlink to /dev/null in the configuration directory in /etc/, with the same filename as the vendor configuration file. OPTIONS The following settings are configured in the "[Time]" section: NTP= A space-separated list of NTP server host names or IP addresses. During runtime this list is combined with any per-interface NTP servers acquired from systemd-networkd.service(8). systemd-timesyncd will contact all configured system or per-interface servers in turn until one is found that responds. When the empty string is assigned, the list of NTP servers is reset, and all assignments prior to this one will have no effect. This setting defaults to an empty list. FallbackNTP= A space-separated list of NTP server host names or IP addresses to be used as the fallback NTP servers. Any per-interface NTP servers obtained from systemd-networkd.service(8) take precedence over this setting, as do any servers set via NTP= above. This setting is hence only used if no other NTP server information is known. When the empty string is assigned, the list of NTP servers is reset, and all assignments prior to this one will have no effect. If this option is not given, a compiled-in list of NTP servers is used instead. RootDistanceMaxSec= Maximum acceptable root distance. Takes a time value (in seconds). Defaults to 5 seconds. PollIntervalMinSec=, PollIntervalMaxSec= The minimum and maximum poll intervals for NTP messages. Each setting takes a time value (in seconds). PollIntervalMinSec= must not be smaller than 16 seconds. PollIntervalMaxSec= must be larger than PollIntervalMinSec=. PollIntervalMinSec= defaults to 32 seconds, and PollIntervalMaxSec= defaults to 2048 seconds. SEE ALSO systemd(1), systemd-timesyncd.service(8), systemd-networkd.service(8) systemd 241 TIMESYNCD.CONF(5) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/config/tmpfiles.d/README ================================================ Name tmpfiles.d — Configuration for creation, deletion and cleaning of volatile and temporary files Synopsis /etc/tmpfiles.d/*.conf /run/tmpfiles.d/*.conf /usr/lib/tmpfiles.d/*.conf Description systemd-tmpfiles uses the configuration files from the above directories to describe the creation, cleaning and removal of volatile and temporary files and directories which usually reside in directories such as /run or /tmp. Configuration Format Each configuration file shall be named in the style of <program>.conf. Files in /etc/ override files with the same name in /usr/lib/ and /run/. Files in /run/ override files with the same name in /usr/lib/. Packages should install their configuration files in /usr/lib/. Files in /etc/ are reserved for the local administrator, who may use this logic to override the configuration files installed by vendor packages. All configuration files are sorted by their filename in alphabetical order, regardless in which of the directories they reside, to guarantee that a specific configuration file takes precedence over another file with an alphabetically later name. If the administrator wants to disable a configuration file supplied by the vendor the recommended way is to place a symlink to /dev/null in /etc/tmpfiles.d/ bearing the same filename. The configuration format is one line per path containing action, path, mode, ownership, age and argument fields: Type Path Mode UID GID Age Argument d /run/user 0755 root root 10d - L /tmp/foobar - - - - /dev/null Type f Create a file if it doesn't exist yet (optionally writing a short string into it, if the argument parameter is passed) F Create or truncate a file (optionally writing a short string into it, if the argument parameter is passed) w Write the argument parameter to a file, if the file exists. Lines of this type accept shell-style globs in place of normal path names. The argument parameter will be written without a trailing newline. C-style backslash escapes are interpreted. d Create a directory if it doesn't exist yet D Create or empty a directory p Create a named pipe (FIFO) if it doesn't exist yet L Create a symlink if it doesn't exist yet c Create a character device node if it doesn't exist yet b Create a block device node if it doesn't exist yet x Ignore a path during cleaning. Use this type to exclude paths from clean-up as controlled with the Age parameter. Note that lines of this type do not influence the effect of r or R lines. Lines of this type accept shell-style globs in place of normal path names. X Ignore a path during cleanup. Use this type to prevent path removal as controlled with the Age parameter. Note that if path is a directory, content of a directory is not excluded from clean-up, only directory itself. Lines of this type accept shell-style globs in place of normal path names. r Remove a file or directory if it exists. This may not be used to remove non-empty directories, use R for that. Lines of this type accept shell-style globs in place of normal path names. R Recursively remove a path and all its subdirectories (if it is a directory). Lines of this type accept shell-style globs in place of normal path names. z Restore SELinux security context label and set ownership and access mode of a file or directory if it exists. Lines of this type accept shell-style globs in place of normal path names. Z Recursively restore SELinux security context label and set ownership and access mode of a path and all its subdirectories (if it is a directory). Lines of this type accept shell-style globs in place of normal path names. Mode The file access mode to use when creating this file or directory. If omitted or when set to - the default is used: 0755 for directories, 0644 for all other file objects. For z, Z lines if omitted or when set to - the file access mode will not be modified. This parameter is ignored for x, r, R, L lines. UID, GID The user and group to use for this file or directory. This may either be a numeric user/group ID or a user or group name. If omitted or when set to - the default 0 (root) is used. For z, Z lines when omitted or when set to - the file ownership will not be modified. These parameters are ignored for x, r, R, L lines. Age The date field, when set, is used to decide what files to delete when cleaning. If a file or directory is older than the current time minus the age field it is deleted. The field format is a series of integers each followed by one of the following postfixes for the respective time units: s, min, h, d, w, ms, m, us If multiple integers and units are specified the time values are summed up. If an integer is given without a unit, s is assumed. When the age is set to zero, the files are cleaned unconditionally. The age field only applies to lines starting with d, D and x. If omitted or set to - no automatic clean-up is done. If the age field starts with a tilde character (~) the clean-up is only applied to files and directories one level inside the directory specified, but not the files and directories immediately inside it. Argument For L lines determines the destination path of the symlink. For c, b determines the major/minor of the device node, with major and minor formatted as integers, separated by :, e.g. "1:3". For f, F, w may be used to specify a short string that is written to the file, suffixed by a newline. Ignored for all other lines. Example Example 1. /etc/tmpfiles.d/screen.conf example screen needs two directories created at boot with specific modes and ownership. d /var/run/screens 1777 root root 10d d /var/run/uscreens 0755 root root 10d12h See Also systemd(1), systemd-tmpfiles(8), systemd-delta(1) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/config/udev.rules.d/README ================================================ The files in this directory are read by udev(7) and used when events are performed by the kernel. The udev daemon watches this directory with inotify so that changes to these files are automatically picked up, for this reason they must be files and not symlinks to another location as in the case in Debian. Packages do not generally install rules here, this directory is for local rules. If you want to override behaviour of package-supplied rules, which can be found in /usr/lib/udev/rules.d, you can do one of two things: 1) Write your own rules in this directory that assign the name, symlinks, permissions, etc. that you want. Pick a number higher than the rules you want to override, and yours will be used. 2) Copy the file from /usr/lib/udev/rules.d and edit it here; you should generally only do this if you want to prevent a program from being run. If the ordering of files in this directory are not important to you, it's recommended that you simply name your files "descriptive-name.rules" such that they are processed AFTER all numbered rules in both this directory and /usr/lib/udev/rules.d and thus override anything set there. ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/hwdb.d/70-local-keyboard.hwdb ================================================ # o2.cz bluetooth remote evdev:input:b0005v0217p0000e0110* KEYBOARD_KEY_c0041=enter # OK button ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="systemd" 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" PKG_DEPENDS_TARGET="toolchain libcap kmod util-linux entropy libidn2" PKG_LONGDESC="A system and session manager for Linux, compatible with SysV and LSB init scripts." if [ "${DEVICE}" = "Amlogic-old" ]; then PKG_PATCH_DIRS="amlogic" fi if [ "$DEVICE" != "OdroidGoAdvance" ] && [ "$DEVICE" != "GameForce" ]; then PKG_DEPENDS_TARGET+=" wait-time-sync" fi PKG_MESON_OPTS_TARGET="--libdir=/usr/lib \ -Drootprefix=/usr \ -Dsplit-usr=false \ -Dsplit-bin=true \ -Ddefault-hierarchy=hybrid \ -Dtty-gid=5 \ -Dtests=false \ -Dseccomp=false \ -Dselinux=false \ -Dapparmor=false \ -Dpolkit=false \ -Dacl=false \ -Daudit=false \ -Dblkid=true \ -Dkmod=true \ -Dpam=false \ -Dmicrohttpd=false \ -Dlibcryptsetup=false \ -Dlibcurl=false \ -Dlibidn=false \ -Dlibidn2=true \ -Dlibiptc=false \ -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 \ -Dimportd=false \ -Dremote=false \ -Dutmp=false \ -Dhibernate=false \ -Denvironment-d=false \ -Dbinfmt=false \ -Dcoredump=false \ -Dresolve=false \ -Dlogind=true \ -Dhostnamed=true \ -Dlocaled=false \ -Dmachined=false \ -Dnetworkd=false \ -Dtimedated=false \ -Dtimesyncd=true \ -Dfirstboot=false \ -Drandomseed=false \ -Dbacklight=false \ -Dvconsole=false \ -Dquotacheck=false \ -Dsysusers=false \ -Dtmpfiles=true \ -Dhwdb=true \ -Drfkill=false \ -Dldconfig=false \ -Defi=false \ -Dtpm=false \ -Dima=false \ -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 \ -Dkmod-path=/usr/bin/kmod \ -Dmount-path=/usr/bin/mount \ -Dumount-path=/usr/bin/umount \ -Ddebug-tty=$DEBUG_TTY \ -Dversion-tag=${PKG_VERSION}" pre_configure_target() { export CFLAGS="$CFLAGS -fno-schedule-insns -fno-schedule-insns2 -Wno-format-truncation" export LC_ALL=en_US.UTF-8 } post_makeinstall_target() { # remove unneeded stuff safe_remove $INSTALL/etc/init.d safe_remove $INSTALL/etc/pam.d safe_remove $INSTALL/etc/systemd/system safe_remove $INSTALL/etc/xdg safe_remove $INSTALL/etc/X11 safe_remove $INSTALL/usr/bin/kernel-install safe_remove $INSTALL/usr/lib/kernel/install.d safe_remove $INSTALL/usr/lib/rpm safe_remove $INSTALL/usr/lib/systemd/user safe_remove $INSTALL/usr/lib/tmpfiles.d/etc.conf safe_remove $INSTALL/usr/lib/tmpfiles.d/home.conf safe_remove $INSTALL/usr/share/factory # clean up hwdb safe_remove $INSTALL/usr/lib/udev/hwdb.d/20-OUI.hwdb safe_remove $INSTALL/usr/lib/udev/hwdb.d/20-acpi-vendor.hwdb safe_remove $INSTALL/usr/lib/udev/hwdb.d/20-bluetooth-vendor-product.hwdb safe_remove $INSTALL/usr/lib/udev/hwdb.d/20-net-ifname.hwdb safe_remove $INSTALL/usr/lib/udev/hwdb.d/20-sdio-classes.hwdb safe_remove $INSTALL/usr/lib/udev/hwdb.d/20-sdio-vendor-model.hwdb # remove Network adaper renaming rule, this is confusing safe_remove $INSTALL/usr/lib/udev/rules.d/80-net-setup-link.rules # remove the uaccess rules as we don't build systemd with ACL (see https://github.com/systemd/systemd/issues/4107) safe_remove $INSTALL/usr/lib/udev/rules.d/71-seat.rules safe_remove $INSTALL/usr/lib/udev/rules.d/73-seat-late.rules # remove getty units, we dont want a console safe_remove $INSTALL/usr/lib/systemd/system/autovt@.service safe_remove $INSTALL/usr/lib/systemd/system/console-getty.service safe_remove $INSTALL/usr/lib/systemd/system/container-getty@.service safe_remove $INSTALL/usr/lib/systemd/system/getty.target safe_remove $INSTALL/usr/lib/systemd/system/getty@.service safe_remove $INSTALL/usr/lib/systemd/system/serial-getty@.service safe_remove $INSTALL/usr/lib/systemd/system/*.target.wants/getty.target # remove other notused or nonsense stuff (our /etc is ro) safe_remove $INSTALL/usr/lib/systemd/systemd-update-done safe_remove $INSTALL/usr/lib/systemd/system/systemd-update-done.service safe_remove $INSTALL/usr/lib/systemd/system/*.target.wants/systemd-update-done.service # remove nspawn safe_remove $INSTALL/usr/bin/systemd-nspawn safe_remove $INSTALL/usr/lib/systemd/system/systemd-nspawn@.service # remove unneeded generators for gen in $INSTALL/usr/lib/systemd/system-generators/*; do case "$gen" in */systemd-debug-generator) # keep it ;; *) safe_remove "$gen" ;; esac done # remove catalog safe_remove $INSTALL/usr/lib/systemd/catalog # remove partition safe_remove $INSTALL/usr/lib/systemd/systemd-growfs safe_remove $INSTALL/usr/lib/systemd/systemd-makefs # distro preset policy safe_remove $INSTALL/usr/lib/systemd/system-preset/* echo "disable *" > $INSTALL/usr/lib/systemd/system-preset/99-default.preset safe_remove $INSTALL/usr/lib/systemd/user-preset/* echo "disable *" > $INSTALL/usr/lib/systemd/user-preset/90-systemd.preset # remove networkd safe_remove $INSTALL/usr/lib/systemd/network # remove systemd-time-wait-sync (not detecting slew time updates, using package wait-time-sync) safe_remove $INSTALL/usr/lib/systemd/system/systemd-time-wait-sync.service safe_remove $INSTALL/usr/lib/systemd/systemd-time-wait-sync # tune journald.conf sed -e "s,^.*Compress=.*$,Compress=no,g" -i $INSTALL/etc/systemd/journald.conf sed -e "s,^.*SplitMode=.*$,SplitMode=none,g" -i $INSTALL/etc/systemd/journald.conf sed -e "s,^.*RuntimeMaxUse=.*$,RuntimeMaxUse=2M,g" -i $INSTALL/etc/systemd/journald.conf sed -e "s,^.*RuntimeMaxFileSize=.*$,RuntimeMaxFileSize=128K,g" -i $INSTALL/etc/systemd/journald.conf sed -e "s,^.*SystemMaxUse=.*$,SystemMaxUse=10M,g" -i $INSTALL/etc/systemd/journald.conf # tune logind.conf sed -e "s,^.*HandleLidSwitch=.*$,HandleLidSwitch=ignore,g" -i $INSTALL/etc/systemd/logind.conf sed -e "s,^.*HandlePowerKey=.*$,HandlePowerKey=ignore,g" -i $INSTALL/etc/systemd/logind.conf # replace systemd-machine-id-setup with ours safe_remove $INSTALL/usr/lib/systemd/system/systemd-machine-id-commit.service safe_remove $INSTALL/usr/lib/systemd/system/*.target.wants/systemd-machine-id-commit.service safe_remove $INSTALL/usr/bin/systemd-machine-id-setup mkdir -p $INSTALL/usr/bin cp $PKG_DIR/scripts/systemd-machine-id-setup $INSTALL/usr/bin cp $PKG_DIR/scripts/userconfig-setup $INSTALL/usr/bin cp $PKG_DIR/scripts/usercache-setup $INSTALL/usr/bin mkdir -p $INSTALL/usr/sbin cp $PKG_DIR/scripts/kernel-overlays-setup $INSTALL/usr/sbin cp $PKG_DIR/scripts/network-base-setup $INSTALL/usr/sbin cp $PKG_DIR/scripts/systemd-timesyncd-setup $INSTALL/usr/sbin # /etc/resolv.conf and /etc/hosts must be writable ln -sf /run/libreelec/resolv.conf $INSTALL/etc/resolv.conf ln -sf /run/libreelec/hosts $INSTALL/etc/hosts # provide 'halt', 'shutdown', 'reboot' & co. ln -sf /usr/bin/systemctl $INSTALL/usr/sbin/halt ln -sf /usr/bin/systemctl $INSTALL/usr/sbin/poweroff ln -sf /usr/bin/systemctl $INSTALL/usr/sbin/reboot ln -sf /usr/bin/systemctl $INSTALL/usr/sbin/runlevel ln -sf /usr/bin/systemctl $INSTALL/usr/sbin/shutdown ln -sf /usr/bin/systemctl $INSTALL/usr/sbin/telinit # strip debug_strip $INSTALL/usr # defaults mkdir -p $INSTALL/usr/config cp -PR $PKG_DIR/config/* $INSTALL/usr/config safe_remove $INSTALL/etc/modules-load.d ln -sf /storage/.config/modules-load.d $INSTALL/etc/modules-load.d ln -sf /storage/.config/logind.conf.d $INSTALL/etc/systemd/logind.conf.d ln -sf /storage/.config/sleep.conf.d $INSTALL/etc/systemd/sleep.conf.d ln -sf /storage/.config/timesyncd.conf.d $INSTALL/etc/systemd/timesyncd.conf.d safe_remove $INSTALL/etc/sysctl.d ln -sf /storage/.config/sysctl.d $INSTALL/etc/sysctl.d safe_remove $INSTALL/etc/tmpfiles.d ln -sf /storage/.config/tmpfiles.d $INSTALL/etc/tmpfiles.d safe_remove $INSTALL/etc/udev/hwdb.d ln -sf /storage/.config/hwdb.d $INSTALL/etc/udev/hwdb.d safe_remove $INSTALL/etc/udev/rules.d ln -sf /storage/.config/udev.rules.d $INSTALL/etc/udev/rules.d } post_install() { add_group systemd-journal 190 add_group systemd-timesync 191 add_user systemd-timesync x 191 191 "systemd-timesync" "/" "/bin/false" add_group systemd-network 193 add_user systemd-network x 193 193 "systemd-network" "/" "/bin/sh" add_group audio 63 add_group cdrom 11 add_group dialout 18 add_group disk 6 add_group floppy 19 add_group kmem 9 add_group lp 7 add_group tape 33 add_group tty 5 add_group video 39 add_group utmp 22 add_group input 199 enable_service machine-id.service enable_service debugconfig.service enable_service userconfig.service enable_service usercache.service enable_service kernel-overlays.service enable_service hwdb.service enable_service network-base.service enable_service systemd-timesyncd.service enable_service systemd-timesyncd-setup.service enable_service debug-shell.service } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/patches/amlogic/systemd-0203-syscall_397_doesnt_exists_on_3.14.patch ================================================ --- a/src/basic/missing_syscall.h 2018-05-22 17:52:31.996229634 +0200 +++ b/src/basic/missing_syscall.h 2018-05-23 00:23:03.774696689 +0200 @@ -414,37 +414,14 @@ /* ======================================================================= */ -#if !HAVE_STATX -# ifndef __NR_statx -# if defined __aarch64__ || defined __arm__ -# define __NR_statx 397 -# elif defined __alpha__ -# define __NR_statx 522 -# elif defined __i386__ || defined __powerpc64__ -# define __NR_statx 383 -# elif defined __sparc__ -# define __NR_statx 360 -# elif defined __x86_64__ -# define __NR_statx 332 -# else -# warning "__NR_statx not defined for your architecture" -# endif -# endif - -struct statx; -#endif - /* This typedef is supposed to be always defined. */ typedef struct statx struct_statx; #if !HAVE_STATX +struct statx; static inline ssize_t missing_statx(int dfd, const char *filename, unsigned flags, unsigned int mask, struct statx *buffer) { -# ifdef __NR_statx - return syscall(__NR_statx, dfd, filename, flags, mask, buffer); -# else errno = ENOSYS; return -1; -# endif } # define statx missing_statx ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/patches/amlogic/systemd-9999.1-backport.patch ================================================ From c7af754aa65eb84b6bb5018bda355891fa8183bd Mon Sep 17 00:00:00 2001 From: Yu Watanabe <watanabe.yu+github@gmail.com> Date: Wed, 10 Apr 2019 19:55:53 +0900 Subject: [PATCH] tree-wide: drop several missing_*.h and import relevant headers from kernel-5.0 --- meson.build | 93 - src/basic/arphrd-list.c | 3 +- src/basic/btrfs-util.c | 3 +- src/basic/generate-arphrd-list.sh | 2 +- src/basic/linux/README | 3 + src/basic/linux/btrfs.h | 945 +++++ src/basic/linux/btrfs_tree.h | 974 +++++ src/basic/linux/can/vxcan.h | 13 + src/basic/linux/fib_rules.h | 90 + src/basic/linux/fou.h | 42 + src/basic/linux/if.h | 294 ++ src/basic/linux/if_addr.h | 72 + src/basic/linux/if_arp.h | 164 + src/basic/linux/if_bonding.h | 131 + src/basic/linux/if_bridge.h | 316 ++ src/basic/linux/if_link.h | 1024 ++++++ src/basic/linux/if_tun.h | 113 + src/basic/linux/if_tunnel.h | 183 + src/basic/linux/libc-compat.h | 267 ++ src/basic/linux/netlink.h | 252 ++ src/basic/linux/rtnetlink.h | 751 ++++ src/basic/linux/wireguard.h | 190 + src/basic/meson.build | 29 +- src/basic/missing.h | 1 - src/basic/missing_btrfs.h | 22 - src/basic/missing_btrfs_tree.h | 109 - src/basic/missing_ethtool.h | 131 - src/basic/missing_fib_rules.h | 45 - src/basic/missing_fou.h | 55 - src/basic/missing_if_bridge.h | 21 - src/basic/missing_if_link.h | 393 --- src/basic/missing_if_tunnel.h | 59 - src/basic/missing_network.h | 144 +- src/basic/missing_vxcan.h | 12 - src/core/bpf-devices.c | 2 +- src/core/bpf-firewall.c | 2 +- src/libsystemd/sd-netlink/netlink-types.c | 12 +- src/network/netdev/fou-tunnel.h | 3 - src/network/netdev/ipvlan.h | 1 - src/network/netdev/tunnel.c | 6 +- src/network/netdev/vxcan.c | 3 - src/network/netdev/wireguard.c | 1 - src/network/netdev/wireguard.h | 3 +- src/network/networkd-brvlan.c | 1 - src/network/networkd-network.c | 4 +- src/network/networkd-routing-policy-rule.h | 1 - src/partition/growfs.c | 1 + src/resolve/resolved-link.c | 3 +- src/shared/dissect-image.c | 3 +- src/shared/linux/README | 8 + src/shared/linux/auto_dev-ioctl.h | 33 +- src/shared/linux/bpf.h | 3536 ++++++++++++++----- src/shared/linux/bpf_common.h | 14 +- src/shared/linux/bpf_insn.h | 205 ++ src/shared/{linux-3.13 => linux}/dm-ioctl.h | 12 +- src/shared/linux/ethtool.h | 1843 ++++++++++ src/shared/linux/libbpf.h | 207 -- src/shared/linux/netdevice.h | 66 + src/shared/meson.build | 8 +- src/shared/wireguard-netlink.h | 179 - src/shutdown/umount.c | 2 +- src/test/test-arphrd-list.c | 3 +- src/test/test-bpf.c | 2 +- src/test/test-netlink-manual.c | 3 +- src/udev/net/ethtool-util.h | 1 - src/udev/net/link-config.c | 2 +- src/udev/udev-builtin-btrfs.c | 2 +- 67 files changed, 10771 insertions(+), 2347 deletions(-) create mode 100644 src/basic/linux/README create mode 100644 src/basic/linux/btrfs.h create mode 100644 src/basic/linux/btrfs_tree.h create mode 100644 src/basic/linux/can/vxcan.h create mode 100644 src/basic/linux/fib_rules.h create mode 100644 src/basic/linux/fou.h create mode 100644 src/basic/linux/if.h create mode 100644 src/basic/linux/if_addr.h create mode 100644 src/basic/linux/if_arp.h create mode 100644 src/basic/linux/if_bonding.h create mode 100644 src/basic/linux/if_bridge.h create mode 100644 src/basic/linux/if_link.h create mode 100644 src/basic/linux/if_tun.h create mode 100644 src/basic/linux/if_tunnel.h create mode 100644 src/basic/linux/libc-compat.h create mode 100644 src/basic/linux/netlink.h create mode 100644 src/basic/linux/rtnetlink.h create mode 100644 src/basic/linux/wireguard.h delete mode 100644 src/basic/missing_btrfs.h delete mode 100644 src/basic/missing_btrfs_tree.h delete mode 100644 src/basic/missing_ethtool.h delete mode 100644 src/basic/missing_fib_rules.h delete mode 100644 src/basic/missing_fou.h delete mode 100644 src/basic/missing_if_bridge.h delete mode 100644 src/basic/missing_if_link.h delete mode 100644 src/basic/missing_if_tunnel.h delete mode 100644 src/basic/missing_vxcan.h create mode 100644 src/shared/linux/README create mode 100644 src/shared/linux/bpf_insn.h rename src/shared/{linux-3.13 => linux}/dm-ioctl.h (96%) create mode 100644 src/shared/linux/ethtool.h delete mode 100644 src/shared/linux/libbpf.h create mode 100644 src/shared/linux/netdevice.h delete mode 100644 src/shared/wireguard-netlink.h diff --git a/meson.build b/meson.build index 79195c97484..15e3394b91d 100644 --- a/meson.build +++ b/meson.build @@ -454,96 +454,6 @@ endforeach conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h) -foreach decl : [['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'], - ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'], - ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'], - ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'], - ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'], - ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'], - ['FRA_TUN_ID', 'linux/fib_rules.h'], - ['FRA_SUPPRESS_PREFIXLEN', 'linux/fib_rules.h'], - ['FRA_PAD', 'linux/fib_rules.h'], - ['FRA_L3MDEV', 'linux/fib_rules.h'], - ['FRA_UID_RANGE', 'linux/fib_rules.h'], - ['FRA_DPORT_RANGE', 'linux/fib_rules.h'], - ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'], - ['FOU_CMD_GET', 'linux/fou.h'], - ['IFA_FLAGS', 'linux/if_addr.h'], - ['IFLA_BRIDGE_VLAN_TUNNEL_INFO', 'linux/if_bridge.h'], - ['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'], - ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'], - ['IN6_ADDR_GEN_MODE_RANDOM', 'linux/if_link.h'], - ['IFLA_IPVLAN_MODE', 'linux/if_link.h'], - ['IPVLAN_MODE_L3S', 'linux/if_link.h'], - ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'], - ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'], - ['IFLA_CARRIER_CHANGES', 'linux/if_link.h'], - ['IFLA_PHYS_SWITCH_ID', 'linux/if_link.h'], - ['IFLA_LINK_NETNSID', 'linux/if_link.h'], - ['IFLA_PHYS_PORT_NAME', 'linux/if_link.h'], - ['IFLA_PROTO_DOWN', 'linux/if_link.h'], - ['IFLA_GSO_MAX_SIZE', 'linux/if_link.h'], - ['IFLA_PAD', 'linux/if_link.h'], - ['IFLA_XDP', 'linux/if_link.h'], - ['IFLA_EVENT', 'linux/if_link.h'], - ['IFLA_IF_NETNSID', 'linux/if_link.h'], - ['IFLA_TARGET_NETNSID', 'linux/if_link.h'], - ['IFLA_NEW_IFINDEX', 'linux/if_link.h'], - ['IFLA_MAX_MTU', 'linux/if_link.h'], - ['IFLA_BOND_MODE', 'linux/if_link.h'], - ['IFLA_BOND_ACTIVE_SLAVE', 'linux/if_link.h'], - ['IFLA_BOND_AD_INFO', 'linux/if_link.h'], - ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'], - ['IFLA_BOND_TLB_DYNAMIC_LB', 'linux/if_link.h'], - ['IFLA_VXLAN_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'], - ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'], - ['IFLA_VXLAN_COLLECT_METADATA', 'linux/if_link.h'], - ['IFLA_VXLAN_LABEL', 'linux/if_link.h'], - ['IFLA_VXLAN_GPE', 'linux/if_link.h'], - ['IFLA_VXLAN_TTL_INHERIT', 'linux/if_link.h'], - ['IFLA_GENEVE_TOS', 'linux/if_link.h'], - ['IFLA_GENEVE_COLLECT_METADATA', 'linux/if_link.h'], - ['IFLA_GENEVE_REMOTE6', 'linux/if_link.h'], - ['IFLA_GENEVE_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'], - ['IFLA_GENEVE_LABEL', 'linux/if_link.h'], - ['IFLA_GENEVE_TTL_INHERIT', 'linux/if_link.h'], - ['IFLA_BR_MAX_AGE', 'linux/if_link.h'], - ['IFLA_BR_PRIORITY', 'linux/if_link.h'], - ['IFLA_BR_VLAN_PROTOCOL', 'linux/if_link.h'], - ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'], - ['IFLA_BR_VLAN_STATS_ENABLED', 'linux/if_link.h'], - ['IFLA_BR_MCAST_STATS_ENABLED', 'linux/if_link.h'], - ['IFLA_BR_MCAST_MLD_VERSION', 'linux/if_link.h'], - ['IFLA_BR_VLAN_STATS_PER_PORT', 'linux/if_link.h'], - ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'], - ['IFLA_BRPORT_PROXYARP_WIFI', 'linux/if_link.h'], - ['IFLA_BRPORT_MULTICAST_ROUTER', 'linux/if_link.h'], - ['IFLA_BRPORT_PAD', 'linux/if_link.h'], - ['IFLA_BRPORT_MCAST_FLOOD', 'linux/if_link.h'], - ['IFLA_BRPORT_VLAN_TUNNEL', 'linux/if_link.h'], - ['IFLA_BRPORT_BCAST_FLOOD', 'linux/if_link.h'], - ['IFLA_BRPORT_NEIGH_SUPPRESS', 'linux/if_link.h'], - ['IFLA_BRPORT_ISOLATED', 'linux/if_link.h'], - ['IFLA_BRPORT_BACKUP_PORT', 'linux/if_link.h'], - ['IFLA_VRF_TABLE', 'linux/if_link.h'], - # if_tunnel.h is buggy and cannot be included on its own - ['IFLA_VTI_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'], - ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'], - ['IFLA_IPTUN_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'], - ['IFLA_IPTUN_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'], - ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'], - ['IFLA_GRE_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'], - ['IFLA_GRE_IGNORE_DF', 'linux/if_tunnel.h', '#include <net/if.h>'], - ['IFLA_GRE_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'], - ['IFLA_GRE_ERSPAN_INDEX', 'linux/if_tunnel.h', '#include <net/if.h>'], - ['IFLA_GRE_ERSPAN_HWID', 'linux/if_tunnel.h', '#include <net/if.h>'], - ['LO_FLAGS_PARTSCAN', 'linux/loop.h'], - ] - prefix = decl.length() > 2 ? decl[2] : '' - have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix) - conf.set10('HAVE_' + decl[0], have) -endforeach - foreach ident : ['secure_getenv', '__secure_getenv'] conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident)) endforeach @@ -680,11 +590,8 @@ if not cc.has_header('sys/capability.h') error('POSIX caps headers not found') endif foreach header : ['crypt.h', - 'linux/btrfs_tree.h', - 'linux/fou.h', 'linux/memfd.h', 'linux/vm_sockets.h', - 'linux/can/vxcan.h', 'sys/auxv.h', 'valgrind/memcheck.h', 'valgrind/valgrind.h', diff --git a/src/basic/arphrd-list.c b/src/basic/arphrd-list.c index b6e2486b67b..b9a9cb7ed41 100644 --- a/src/basic/arphrd-list.c +++ b/src/basic/arphrd-list.c @@ -1,12 +1,11 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ #include <errno.h> -#include <net/if_arp.h> +#include <linux/if_arp.h> #include <string.h> #include "arphrd-list.h" #include "macro.h" -#include "missing_network.h" static const struct arphrd_name* lookup_arphrd(register const char *str, register GPERF_LEN_TYPE len); diff --git a/src/basic/btrfs-util.c b/src/basic/btrfs-util.c index b1519cc4eb4..db6c0c3f1e4 100644 --- a/src/basic/btrfs-util.c +++ b/src/basic/btrfs-util.c @@ -3,8 +3,10 @@ #include <errno.h> #include <fcntl.h> #include <inttypes.h> +#include <linux/btrfs_tree.h> #include <linux/fs.h> #include <linux/loop.h> +#include <linux/magic.h> #include <stddef.h> #include <stdio.h> #include <stdlib.h> @@ -26,7 +28,6 @@ #include "fs-util.h" #include "io-util.h" #include "macro.h" -#include "missing.h" #include "path-util.h" #include "rm-rf.h" #include "smack-util.h" diff --git a/src/basic/generate-arphrd-list.sh b/src/basic/generate-arphrd-list.sh index e6e874a8fd0..6db931c52b5 100755 --- a/src/basic/generate-arphrd-list.sh +++ b/src/basic/generate-arphrd-list.sh @@ -1,6 +1,6 @@ #!/bin/sh set -eu -$1 -dM -include net/if_arp.h -include "$2" -include "$3" - </dev/null | \ +$1 -dM -include linux/if_arp.h -include "$2" - </dev/null | \ awk '/^#define[ \t]+ARPHRD_[^ \t]+[ \t]+[^ \t]/ { print $2; }' | \ sed -e 's/ARPHRD_//' diff --git a/src/basic/linux/README b/src/basic/linux/README new file mode 100644 index 00000000000..f849f349512 --- /dev/null +++ b/src/basic/linux/README @@ -0,0 +1,3 @@ +The files in this directory are copied from kernel-5.0, and the following modifications are applied: +- btrfs.h: drop '__user' attributes +- if.h: drop '#include <linux/compiler.h>' and '__user' attributes diff --git a/src/basic/linux/btrfs.h b/src/basic/linux/btrfs.h new file mode 100644 index 00000000000..22455c4cd79 --- /dev/null +++ b/src/basic/linux/btrfs.h @@ -0,0 +1,945 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * Copyright (C) 2007 Oracle. All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License v2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 021110-1307, USA. + */ + +#ifndef _UAPI_LINUX_BTRFS_H +#define _UAPI_LINUX_BTRFS_H +#include <linux/types.h> +#include <linux/ioctl.h> + +#define BTRFS_IOCTL_MAGIC 0x94 +#define BTRFS_VOL_NAME_MAX 255 +#define BTRFS_LABEL_SIZE 256 + +/* this should be 4k */ +#define BTRFS_PATH_NAME_MAX 4087 +struct btrfs_ioctl_vol_args { + __s64 fd; + char name[BTRFS_PATH_NAME_MAX + 1]; +}; + +#define BTRFS_DEVICE_PATH_NAME_MAX 1024 +#define BTRFS_SUBVOL_NAME_MAX 4039 + +#define BTRFS_SUBVOL_CREATE_ASYNC (1ULL << 0) +#define BTRFS_SUBVOL_RDONLY (1ULL << 1) +#define BTRFS_SUBVOL_QGROUP_INHERIT (1ULL << 2) + +#define BTRFS_DEVICE_SPEC_BY_ID (1ULL << 3) + +#define BTRFS_VOL_ARG_V2_FLAGS_SUPPORTED \ + (BTRFS_SUBVOL_CREATE_ASYNC | \ + BTRFS_SUBVOL_RDONLY | \ + BTRFS_SUBVOL_QGROUP_INHERIT | \ + BTRFS_DEVICE_SPEC_BY_ID) + +#define BTRFS_FSID_SIZE 16 +#define BTRFS_UUID_SIZE 16 +#define BTRFS_UUID_UNPARSED_SIZE 37 + +/* + * flags definition for qgroup limits + * + * Used by: + * struct btrfs_qgroup_limit.flags + * struct btrfs_qgroup_limit_item.flags + */ +#define BTRFS_QGROUP_LIMIT_MAX_RFER (1ULL << 0) +#define BTRFS_QGROUP_LIMIT_MAX_EXCL (1ULL << 1) +#define BTRFS_QGROUP_LIMIT_RSV_RFER (1ULL << 2) +#define BTRFS_QGROUP_LIMIT_RSV_EXCL (1ULL << 3) +#define BTRFS_QGROUP_LIMIT_RFER_CMPR (1ULL << 4) +#define BTRFS_QGROUP_LIMIT_EXCL_CMPR (1ULL << 5) + +struct btrfs_qgroup_limit { + __u64 flags; + __u64 max_rfer; + __u64 max_excl; + __u64 rsv_rfer; + __u64 rsv_excl; +}; + +/* + * flags definition for qgroup inheritance + * + * Used by: + * struct btrfs_qgroup_inherit.flags + */ +#define BTRFS_QGROUP_INHERIT_SET_LIMITS (1ULL << 0) + +struct btrfs_qgroup_inherit { + __u64 flags; + __u64 num_qgroups; + __u64 num_ref_copies; + __u64 num_excl_copies; + struct btrfs_qgroup_limit lim; + __u64 qgroups[0]; +}; + +struct btrfs_ioctl_qgroup_limit_args { + __u64 qgroupid; + struct btrfs_qgroup_limit lim; +}; + +/* + * flags for subvolumes + * + * Used by: + * struct btrfs_ioctl_vol_args_v2.flags + * + * BTRFS_SUBVOL_RDONLY is also provided/consumed by the following ioctls: + * - BTRFS_IOC_SUBVOL_GETFLAGS + * - BTRFS_IOC_SUBVOL_SETFLAGS + */ + +struct btrfs_ioctl_vol_args_v2 { + __s64 fd; + __u64 transid; + __u64 flags; + union { + struct { + __u64 size; + struct btrfs_qgroup_inherit *qgroup_inherit; + }; + __u64 unused[4]; + }; + union { + char name[BTRFS_SUBVOL_NAME_MAX + 1]; + __u64 devid; + }; +}; + +/* + * structure to report errors and progress to userspace, either as a + * result of a finished scrub, a canceled scrub or a progress inquiry + */ +struct btrfs_scrub_progress { + __u64 data_extents_scrubbed; /* # of data extents scrubbed */ + __u64 tree_extents_scrubbed; /* # of tree extents scrubbed */ + __u64 data_bytes_scrubbed; /* # of data bytes scrubbed */ + __u64 tree_bytes_scrubbed; /* # of tree bytes scrubbed */ + __u64 read_errors; /* # of read errors encountered (EIO) */ + __u64 csum_errors; /* # of failed csum checks */ + __u64 verify_errors; /* # of occurences, where the metadata + * of a tree block did not match the + * expected values, like generation or + * logical */ + __u64 no_csum; /* # of 4k data block for which no csum + * is present, probably the result of + * data written with nodatasum */ + __u64 csum_discards; /* # of csum for which no data was found + * in the extent tree. */ + __u64 super_errors; /* # of bad super blocks encountered */ + __u64 malloc_errors; /* # of internal kmalloc errors. These + * will likely cause an incomplete + * scrub */ + __u64 uncorrectable_errors; /* # of errors where either no intact + * copy was found or the writeback + * failed */ + __u64 corrected_errors; /* # of errors corrected */ + __u64 last_physical; /* last physical address scrubbed. In + * case a scrub was aborted, this can + * be used to restart the scrub */ + __u64 unverified_errors; /* # of occurences where a read for a + * full (64k) bio failed, but the re- + * check succeeded for each 4k piece. + * Intermittent error. */ +}; + +#define BTRFS_SCRUB_READONLY 1 +struct btrfs_ioctl_scrub_args { + __u64 devid; /* in */ + __u64 start; /* in */ + __u64 end; /* in */ + __u64 flags; /* in */ + struct btrfs_scrub_progress progress; /* out */ + /* pad to 1k */ + __u64 unused[(1024-32-sizeof(struct btrfs_scrub_progress))/8]; +}; + +#define BTRFS_IOCTL_DEV_REPLACE_CONT_READING_FROM_SRCDEV_MODE_ALWAYS 0 +#define BTRFS_IOCTL_DEV_REPLACE_CONT_READING_FROM_SRCDEV_MODE_AVOID 1 +struct btrfs_ioctl_dev_replace_start_params { + __u64 srcdevid; /* in, if 0, use srcdev_name instead */ + __u64 cont_reading_from_srcdev_mode; /* in, see #define + * above */ + __u8 srcdev_name[BTRFS_DEVICE_PATH_NAME_MAX + 1]; /* in */ + __u8 tgtdev_name[BTRFS_DEVICE_PATH_NAME_MAX + 1]; /* in */ +}; + +#define BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED 0 +#define BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED 1 +#define BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED 2 +#define BTRFS_IOCTL_DEV_REPLACE_STATE_CANCELED 3 +#define BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED 4 +struct btrfs_ioctl_dev_replace_status_params { + __u64 replace_state; /* out, see #define above */ + __u64 progress_1000; /* out, 0 <= x <= 1000 */ + __u64 time_started; /* out, seconds since 1-Jan-1970 */ + __u64 time_stopped; /* out, seconds since 1-Jan-1970 */ + __u64 num_write_errors; /* out */ + __u64 num_uncorrectable_read_errors; /* out */ +}; + +#define BTRFS_IOCTL_DEV_REPLACE_CMD_START 0 +#define BTRFS_IOCTL_DEV_REPLACE_CMD_STATUS 1 +#define BTRFS_IOCTL_DEV_REPLACE_CMD_CANCEL 2 +#define BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR 0 +#define BTRFS_IOCTL_DEV_REPLACE_RESULT_NOT_STARTED 1 +#define BTRFS_IOCTL_DEV_REPLACE_RESULT_ALREADY_STARTED 2 +#define BTRFS_IOCTL_DEV_REPLACE_RESULT_SCRUB_INPROGRESS 3 +struct btrfs_ioctl_dev_replace_args { + __u64 cmd; /* in */ + __u64 result; /* out */ + + union { + struct btrfs_ioctl_dev_replace_start_params start; + struct btrfs_ioctl_dev_replace_status_params status; + }; /* in/out */ + + __u64 spare[64]; +}; + +struct btrfs_ioctl_dev_info_args { + __u64 devid; /* in/out */ + __u8 uuid[BTRFS_UUID_SIZE]; /* in/out */ + __u64 bytes_used; /* out */ + __u64 total_bytes; /* out */ + __u64 unused[379]; /* pad to 4k */ + __u8 path[BTRFS_DEVICE_PATH_NAME_MAX]; /* out */ +}; + +struct btrfs_ioctl_fs_info_args { + __u64 max_id; /* out */ + __u64 num_devices; /* out */ + __u8 fsid[BTRFS_FSID_SIZE]; /* out */ + __u32 nodesize; /* out */ + __u32 sectorsize; /* out */ + __u32 clone_alignment; /* out */ + __u32 reserved32; + __u64 reserved[122]; /* pad to 1k */ +}; + +/* + * feature flags + * + * Used by: + * struct btrfs_ioctl_feature_flags + */ +#define BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE (1ULL << 0) +/* + * Older kernels (< 4.9) on big-endian systems produced broken free space tree + * bitmaps, and btrfs-progs also used to corrupt the free space tree (versions + * < 4.7.3). If this bit is clear, then the free space tree cannot be trusted. + * btrfs-progs can also intentionally clear this bit to ask the kernel to + * rebuild the free space tree, however this might not work on older kernels + * that do not know about this bit. If not sure, clear the cache manually on + * first mount when booting older kernel versions. + */ +#define BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID (1ULL << 1) + +#define BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF (1ULL << 0) +#define BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL (1ULL << 1) +#define BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS (1ULL << 2) +#define BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO (1ULL << 3) +#define BTRFS_FEATURE_INCOMPAT_COMPRESS_ZSTD (1ULL << 4) + +/* + * older kernels tried to do bigger metadata blocks, but the + * code was pretty buggy. Lets not let them try anymore. + */ +#define BTRFS_FEATURE_INCOMPAT_BIG_METADATA (1ULL << 5) + +#define BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF (1ULL << 6) +#define BTRFS_FEATURE_INCOMPAT_RAID56 (1ULL << 7) +#define BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA (1ULL << 8) +#define BTRFS_FEATURE_INCOMPAT_NO_HOLES (1ULL << 9) +#define BTRFS_FEATURE_INCOMPAT_METADATA_UUID (1ULL << 10) + +struct btrfs_ioctl_feature_flags { + __u64 compat_flags; + __u64 compat_ro_flags; + __u64 incompat_flags; +}; + +/* balance control ioctl modes */ +#define BTRFS_BALANCE_CTL_PAUSE 1 +#define BTRFS_BALANCE_CTL_CANCEL 2 + +/* + * this is packed, because it should be exactly the same as its disk + * byte order counterpart (struct btrfs_disk_balance_args) + */ +struct btrfs_balance_args { + __u64 profiles; + union { + __u64 usage; + struct { + __u32 usage_min; + __u32 usage_max; + }; + }; + __u64 devid; + __u64 pstart; + __u64 pend; + __u64 vstart; + __u64 vend; + + __u64 target; + + __u64 flags; + + /* + * BTRFS_BALANCE_ARGS_LIMIT with value 'limit' + * BTRFS_BALANCE_ARGS_LIMIT_RANGE - the extend version can use minimum + * and maximum + */ + union { + __u64 limit; /* limit number of processed chunks */ + struct { + __u32 limit_min; + __u32 limit_max; + }; + }; + + /* + * Process chunks that cross stripes_min..stripes_max devices, + * BTRFS_BALANCE_ARGS_STRIPES_RANGE + */ + __u32 stripes_min; + __u32 stripes_max; + + __u64 unused[6]; +} __attribute__ ((__packed__)); + +/* report balance progress to userspace */ +struct btrfs_balance_progress { + __u64 expected; /* estimated # of chunks that will be + * relocated to fulfill the request */ + __u64 considered; /* # of chunks we have considered so far */ + __u64 completed; /* # of chunks relocated so far */ +}; + +/* + * flags definition for balance + * + * Restriper's general type filter + * + * Used by: + * btrfs_ioctl_balance_args.flags + * btrfs_balance_control.flags (internal) + */ +#define BTRFS_BALANCE_DATA (1ULL << 0) +#define BTRFS_BALANCE_SYSTEM (1ULL << 1) +#define BTRFS_BALANCE_METADATA (1ULL << 2) + +#define BTRFS_BALANCE_TYPE_MASK (BTRFS_BALANCE_DATA | \ + BTRFS_BALANCE_SYSTEM | \ + BTRFS_BALANCE_METADATA) + +#define BTRFS_BALANCE_FORCE (1ULL << 3) +#define BTRFS_BALANCE_RESUME (1ULL << 4) + +/* + * flags definitions for per-type balance args + * + * Balance filters + * + * Used by: + * struct btrfs_balance_args + */ +#define BTRFS_BALANCE_ARGS_PROFILES (1ULL << 0) +#define BTRFS_BALANCE_ARGS_USAGE (1ULL << 1) +#define BTRFS_BALANCE_ARGS_DEVID (1ULL << 2) +#define BTRFS_BALANCE_ARGS_DRANGE (1ULL << 3) +#define BTRFS_BALANCE_ARGS_VRANGE (1ULL << 4) +#define BTRFS_BALANCE_ARGS_LIMIT (1ULL << 5) +#define BTRFS_BALANCE_ARGS_LIMIT_RANGE (1ULL << 6) +#define BTRFS_BALANCE_ARGS_STRIPES_RANGE (1ULL << 7) +#define BTRFS_BALANCE_ARGS_USAGE_RANGE (1ULL << 10) + +#define BTRFS_BALANCE_ARGS_MASK \ + (BTRFS_BALANCE_ARGS_PROFILES | \ + BTRFS_BALANCE_ARGS_USAGE | \ + BTRFS_BALANCE_ARGS_DEVID | \ + BTRFS_BALANCE_ARGS_DRANGE | \ + BTRFS_BALANCE_ARGS_VRANGE | \ + BTRFS_BALANCE_ARGS_LIMIT | \ + BTRFS_BALANCE_ARGS_LIMIT_RANGE | \ + BTRFS_BALANCE_ARGS_STRIPES_RANGE | \ + BTRFS_BALANCE_ARGS_USAGE_RANGE) + +/* + * Profile changing flags. When SOFT is set we won't relocate chunk if + * it already has the target profile (even though it may be + * half-filled). + */ +#define BTRFS_BALANCE_ARGS_CONVERT (1ULL << 8) +#define BTRFS_BALANCE_ARGS_SOFT (1ULL << 9) + + +/* + * flags definition for balance state + * + * Used by: + * struct btrfs_ioctl_balance_args.state + */ +#define BTRFS_BALANCE_STATE_RUNNING (1ULL << 0) +#define BTRFS_BALANCE_STATE_PAUSE_REQ (1ULL << 1) +#define BTRFS_BALANCE_STATE_CANCEL_REQ (1ULL << 2) + +struct btrfs_ioctl_balance_args { + __u64 flags; /* in/out */ + __u64 state; /* out */ + + struct btrfs_balance_args data; /* in/out */ + struct btrfs_balance_args meta; /* in/out */ + struct btrfs_balance_args sys; /* in/out */ + + struct btrfs_balance_progress stat; /* out */ + + __u64 unused[72]; /* pad to 1k */ +}; + +#define BTRFS_INO_LOOKUP_PATH_MAX 4080 +struct btrfs_ioctl_ino_lookup_args { + __u64 treeid; + __u64 objectid; + char name[BTRFS_INO_LOOKUP_PATH_MAX]; +}; + +#define BTRFS_INO_LOOKUP_USER_PATH_MAX (4080 - BTRFS_VOL_NAME_MAX - 1) +struct btrfs_ioctl_ino_lookup_user_args { + /* in, inode number containing the subvolume of 'subvolid' */ + __u64 dirid; + /* in */ + __u64 treeid; + /* out, name of the subvolume of 'treeid' */ + char name[BTRFS_VOL_NAME_MAX + 1]; + /* + * out, constructed path from the directory with which the ioctl is + * called to dirid + */ + char path[BTRFS_INO_LOOKUP_USER_PATH_MAX]; +}; + +/* Search criteria for the btrfs SEARCH ioctl family. */ +struct btrfs_ioctl_search_key { + /* + * The tree we're searching in. 1 is the tree of tree roots, 2 is the + * extent tree, etc... + * + * A special tree_id value of 0 will cause a search in the subvolume + * tree that the inode which is passed to the ioctl is part of. + */ + __u64 tree_id; /* in */ + + /* + * When doing a tree search, we're actually taking a slice from a + * linear search space of 136-bit keys. + * + * A full 136-bit tree key is composed as: + * (objectid << 72) + (type << 64) + offset + * + * The individual min and max values for objectid, type and offset + * define the min_key and max_key values for the search range. All + * metadata items with a key in the interval [min_key, max_key] will be + * returned. + * + * Additionally, we can filter the items returned on transaction id of + * the metadata block they're stored in by specifying a transid range. + * Be aware that this transaction id only denotes when the metadata + * page that currently contains the item got written the last time as + * result of a COW operation. The number does not have any meaning + * related to the transaction in which an individual item that is being + * returned was created or changed. + */ + __u64 min_objectid; /* in */ + __u64 max_objectid; /* in */ + __u64 min_offset; /* in */ + __u64 max_offset; /* in */ + __u64 min_transid; /* in */ + __u64 max_transid; /* in */ + __u32 min_type; /* in */ + __u32 max_type; /* in */ + + /* + * input: The maximum amount of results desired. + * output: The actual amount of items returned, restricted by any of: + * - reaching the upper bound of the search range + * - reaching the input nr_items amount of items + * - completely filling the supplied memory buffer + */ + __u32 nr_items; /* in/out */ + + /* align to 64 bits */ + __u32 unused; + + /* some extra for later */ + __u64 unused1; + __u64 unused2; + __u64 unused3; + __u64 unused4; +}; + +struct btrfs_ioctl_search_header { + __u64 transid; + __u64 objectid; + __u64 offset; + __u32 type; + __u32 len; +}; + +#define BTRFS_SEARCH_ARGS_BUFSIZE (4096 - sizeof(struct btrfs_ioctl_search_key)) +/* + * the buf is an array of search headers where + * each header is followed by the actual item + * the type field is expanded to 32 bits for alignment + */ +struct btrfs_ioctl_search_args { + struct btrfs_ioctl_search_key key; + char buf[BTRFS_SEARCH_ARGS_BUFSIZE]; +}; + +struct btrfs_ioctl_search_args_v2 { + struct btrfs_ioctl_search_key key; /* in/out - search parameters */ + __u64 buf_size; /* in - size of buffer + * out - on EOVERFLOW: needed size + * to store item */ + __u64 buf[0]; /* out - found items */ +}; + +struct btrfs_ioctl_clone_range_args { + __s64 src_fd; + __u64 src_offset, src_length; + __u64 dest_offset; +}; + +/* + * flags definition for the defrag range ioctl + * + * Used by: + * struct btrfs_ioctl_defrag_range_args.flags + */ +#define BTRFS_DEFRAG_RANGE_COMPRESS 1 +#define BTRFS_DEFRAG_RANGE_START_IO 2 +struct btrfs_ioctl_defrag_range_args { + /* start of the defrag operation */ + __u64 start; + + /* number of bytes to defrag, use (u64)-1 to say all */ + __u64 len; + + /* + * flags for the operation, which can include turning + * on compression for this one defrag + */ + __u64 flags; + + /* + * any extent bigger than this will be considered + * already defragged. Use 0 to take the kernel default + * Use 1 to say every single extent must be rewritten + */ + __u32 extent_thresh; + + /* + * which compression method to use if turning on compression + * for this defrag operation. If unspecified, zlib will + * be used + */ + __u32 compress_type; + + /* spare for later */ + __u32 unused[4]; +}; + + +#define BTRFS_SAME_DATA_DIFFERS 1 +/* For extent-same ioctl */ +struct btrfs_ioctl_same_extent_info { + __s64 fd; /* in - destination file */ + __u64 logical_offset; /* in - start of extent in destination */ + __u64 bytes_deduped; /* out - total # of bytes we were able + * to dedupe from this file */ + /* status of this dedupe operation: + * 0 if dedup succeeds + * < 0 for error + * == BTRFS_SAME_DATA_DIFFERS if data differs + */ + __s32 status; /* out - see above description */ + __u32 reserved; +}; + +struct btrfs_ioctl_same_args { + __u64 logical_offset; /* in - start of extent in source */ + __u64 length; /* in - length of extent */ + __u16 dest_count; /* in - total elements in info array */ + __u16 reserved1; + __u32 reserved2; + struct btrfs_ioctl_same_extent_info info[0]; +}; + +struct btrfs_ioctl_space_info { + __u64 flags; + __u64 total_bytes; + __u64 used_bytes; +}; + +struct btrfs_ioctl_space_args { + __u64 space_slots; + __u64 total_spaces; + struct btrfs_ioctl_space_info spaces[0]; +}; + +struct btrfs_data_container { + __u32 bytes_left; /* out -- bytes not needed to deliver output */ + __u32 bytes_missing; /* out -- additional bytes needed for result */ + __u32 elem_cnt; /* out */ + __u32 elem_missed; /* out */ + __u64 val[0]; /* out */ +}; + +struct btrfs_ioctl_ino_path_args { + __u64 inum; /* in */ + __u64 size; /* in */ + __u64 reserved[4]; + /* struct btrfs_data_container *fspath; out */ + __u64 fspath; /* out */ +}; + +struct btrfs_ioctl_logical_ino_args { + __u64 logical; /* in */ + __u64 size; /* in */ + __u64 reserved[3]; /* must be 0 for now */ + __u64 flags; /* in, v2 only */ + /* struct btrfs_data_container *inodes; out */ + __u64 inodes; +}; +/* Return every ref to the extent, not just those containing logical block. + * Requires logical == extent bytenr. */ +#define BTRFS_LOGICAL_INO_ARGS_IGNORE_OFFSET (1ULL << 0) + +enum btrfs_dev_stat_values { + /* disk I/O failure stats */ + BTRFS_DEV_STAT_WRITE_ERRS, /* EIO or EREMOTEIO from lower layers */ + BTRFS_DEV_STAT_READ_ERRS, /* EIO or EREMOTEIO from lower layers */ + BTRFS_DEV_STAT_FLUSH_ERRS, /* EIO or EREMOTEIO from lower layers */ + + /* stats for indirect indications for I/O failures */ + BTRFS_DEV_STAT_CORRUPTION_ERRS, /* checksum error, bytenr error or + * contents is illegal: this is an + * indication that the block was damaged + * during read or write, or written to + * wrong location or read from wrong + * location */ + BTRFS_DEV_STAT_GENERATION_ERRS, /* an indication that blocks have not + * been written */ + + BTRFS_DEV_STAT_VALUES_MAX +}; + +/* Reset statistics after reading; needs SYS_ADMIN capability */ +#define BTRFS_DEV_STATS_RESET (1ULL << 0) + +struct btrfs_ioctl_get_dev_stats { + __u64 devid; /* in */ + __u64 nr_items; /* in/out */ + __u64 flags; /* in/out */ + + /* out values: */ + __u64 values[BTRFS_DEV_STAT_VALUES_MAX]; + + __u64 unused[128 - 2 - BTRFS_DEV_STAT_VALUES_MAX]; /* pad to 1k */ +}; + +#define BTRFS_QUOTA_CTL_ENABLE 1 +#define BTRFS_QUOTA_CTL_DISABLE 2 +#define BTRFS_QUOTA_CTL_RESCAN__NOTUSED 3 +struct btrfs_ioctl_quota_ctl_args { + __u64 cmd; + __u64 status; +}; + +struct btrfs_ioctl_quota_rescan_args { + __u64 flags; + __u64 progress; + __u64 reserved[6]; +}; + +struct btrfs_ioctl_qgroup_assign_args { + __u64 assign; + __u64 src; + __u64 dst; +}; + +struct btrfs_ioctl_qgroup_create_args { + __u64 create; + __u64 qgroupid; +}; +struct btrfs_ioctl_timespec { + __u64 sec; + __u32 nsec; +}; + +struct btrfs_ioctl_received_subvol_args { + char uuid[BTRFS_UUID_SIZE]; /* in */ + __u64 stransid; /* in */ + __u64 rtransid; /* out */ + struct btrfs_ioctl_timespec stime; /* in */ + struct btrfs_ioctl_timespec rtime; /* out */ + __u64 flags; /* in */ + __u64 reserved[16]; /* in */ +}; + +/* + * Caller doesn't want file data in the send stream, even if the + * search of clone sources doesn't find an extent. UPDATE_EXTENT + * commands will be sent instead of WRITE commands. + */ +#define BTRFS_SEND_FLAG_NO_FILE_DATA 0x1 + +/* + * Do not add the leading stream header. Used when multiple snapshots + * are sent back to back. + */ +#define BTRFS_SEND_FLAG_OMIT_STREAM_HEADER 0x2 + +/* + * Omit the command at the end of the stream that indicated the end + * of the stream. This option is used when multiple snapshots are + * sent back to back. + */ +#define BTRFS_SEND_FLAG_OMIT_END_CMD 0x4 + +#define BTRFS_SEND_FLAG_MASK \ + (BTRFS_SEND_FLAG_NO_FILE_DATA | \ + BTRFS_SEND_FLAG_OMIT_STREAM_HEADER | \ + BTRFS_SEND_FLAG_OMIT_END_CMD) + +struct btrfs_ioctl_send_args { + __s64 send_fd; /* in */ + __u64 clone_sources_count; /* in */ + __u64 *clone_sources; /* in */ + __u64 parent_root; /* in */ + __u64 flags; /* in */ + __u64 reserved[4]; /* in */ +}; + +/* + * Information about a fs tree root. + * + * All items are filled by the ioctl + */ +struct btrfs_ioctl_get_subvol_info_args { + /* Id of this subvolume */ + __u64 treeid; + + /* Name of this subvolume, used to get the real name at mount point */ + char name[BTRFS_VOL_NAME_MAX + 1]; + + /* + * Id of the subvolume which contains this subvolume. + * Zero for top-level subvolume or a deleted subvolume. + */ + __u64 parent_id; + + /* + * Inode number of the directory which contains this subvolume. + * Zero for top-level subvolume or a deleted subvolume + */ + __u64 dirid; + + /* Latest transaction id of this subvolume */ + __u64 generation; + + /* Flags of this subvolume */ + __u64 flags; + + /* UUID of this subvolume */ + __u8 uuid[BTRFS_UUID_SIZE]; + + /* + * UUID of the subvolume of which this subvolume is a snapshot. + * All zero for a non-snapshot subvolume. + */ + __u8 parent_uuid[BTRFS_UUID_SIZE]; + + /* + * UUID of the subvolume from which this subvolume was received. + * All zero for non-received subvolume. + */ + __u8 received_uuid[BTRFS_UUID_SIZE]; + + /* Transaction id indicating when change/create/send/receive happened */ + __u64 ctransid; + __u64 otransid; + __u64 stransid; + __u64 rtransid; + /* Time corresponding to c/o/s/rtransid */ + struct btrfs_ioctl_timespec ctime; + struct btrfs_ioctl_timespec otime; + struct btrfs_ioctl_timespec stime; + struct btrfs_ioctl_timespec rtime; + + /* Must be zero */ + __u64 reserved[8]; +}; + +#define BTRFS_MAX_ROOTREF_BUFFER_NUM 255 +struct btrfs_ioctl_get_subvol_rootref_args { + /* in/out, minimum id of rootref's treeid to be searched */ + __u64 min_treeid; + + /* out */ + struct { + __u64 treeid; + __u64 dirid; + } rootref[BTRFS_MAX_ROOTREF_BUFFER_NUM]; + + /* out, number of found items */ + __u8 num_items; + __u8 align[7]; +}; + +/* Error codes as returned by the kernel */ +enum btrfs_err_code { + BTRFS_ERROR_DEV_RAID1_MIN_NOT_MET = 1, + BTRFS_ERROR_DEV_RAID10_MIN_NOT_MET, + BTRFS_ERROR_DEV_RAID5_MIN_NOT_MET, + BTRFS_ERROR_DEV_RAID6_MIN_NOT_MET, + BTRFS_ERROR_DEV_TGT_REPLACE, + BTRFS_ERROR_DEV_MISSING_NOT_FOUND, + BTRFS_ERROR_DEV_ONLY_WRITABLE, + BTRFS_ERROR_DEV_EXCL_RUN_IN_PROGRESS +}; + +#define BTRFS_IOC_SNAP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 1, \ + struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, \ + struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_RESIZE _IOW(BTRFS_IOCTL_MAGIC, 3, \ + struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_SCAN_DEV _IOW(BTRFS_IOCTL_MAGIC, 4, \ + struct btrfs_ioctl_vol_args) +/* trans start and trans end are dangerous, and only for + * use by applications that know how to avoid the + * resulting deadlocks + */ +#define BTRFS_IOC_TRANS_START _IO(BTRFS_IOCTL_MAGIC, 6) +#define BTRFS_IOC_TRANS_END _IO(BTRFS_IOCTL_MAGIC, 7) +#define BTRFS_IOC_SYNC _IO(BTRFS_IOCTL_MAGIC, 8) + +#define BTRFS_IOC_CLONE _IOW(BTRFS_IOCTL_MAGIC, 9, int) +#define BTRFS_IOC_ADD_DEV _IOW(BTRFS_IOCTL_MAGIC, 10, \ + struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_RM_DEV _IOW(BTRFS_IOCTL_MAGIC, 11, \ + struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_BALANCE _IOW(BTRFS_IOCTL_MAGIC, 12, \ + struct btrfs_ioctl_vol_args) + +#define BTRFS_IOC_CLONE_RANGE _IOW(BTRFS_IOCTL_MAGIC, 13, \ + struct btrfs_ioctl_clone_range_args) + +#define BTRFS_IOC_SUBVOL_CREATE _IOW(BTRFS_IOCTL_MAGIC, 14, \ + struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_SNAP_DESTROY _IOW(BTRFS_IOCTL_MAGIC, 15, \ + struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_DEFRAG_RANGE _IOW(BTRFS_IOCTL_MAGIC, 16, \ + struct btrfs_ioctl_defrag_range_args) +#define BTRFS_IOC_TREE_SEARCH _IOWR(BTRFS_IOCTL_MAGIC, 17, \ + struct btrfs_ioctl_search_args) +#define BTRFS_IOC_TREE_SEARCH_V2 _IOWR(BTRFS_IOCTL_MAGIC, 17, \ + struct btrfs_ioctl_search_args_v2) +#define BTRFS_IOC_INO_LOOKUP _IOWR(BTRFS_IOCTL_MAGIC, 18, \ + struct btrfs_ioctl_ino_lookup_args) +#define BTRFS_IOC_DEFAULT_SUBVOL _IOW(BTRFS_IOCTL_MAGIC, 19, __u64) +#define BTRFS_IOC_SPACE_INFO _IOWR(BTRFS_IOCTL_MAGIC, 20, \ + struct btrfs_ioctl_space_args) +#define BTRFS_IOC_START_SYNC _IOR(BTRFS_IOCTL_MAGIC, 24, __u64) +#define BTRFS_IOC_WAIT_SYNC _IOW(BTRFS_IOCTL_MAGIC, 22, __u64) +#define BTRFS_IOC_SNAP_CREATE_V2 _IOW(BTRFS_IOCTL_MAGIC, 23, \ + struct btrfs_ioctl_vol_args_v2) +#define BTRFS_IOC_SUBVOL_CREATE_V2 _IOW(BTRFS_IOCTL_MAGIC, 24, \ + struct btrfs_ioctl_vol_args_v2) +#define BTRFS_IOC_SUBVOL_GETFLAGS _IOR(BTRFS_IOCTL_MAGIC, 25, __u64) +#define BTRFS_IOC_SUBVOL_SETFLAGS _IOW(BTRFS_IOCTL_MAGIC, 26, __u64) +#define BTRFS_IOC_SCRUB _IOWR(BTRFS_IOCTL_MAGIC, 27, \ + struct btrfs_ioctl_scrub_args) +#define BTRFS_IOC_SCRUB_CANCEL _IO(BTRFS_IOCTL_MAGIC, 28) +#define BTRFS_IOC_SCRUB_PROGRESS _IOWR(BTRFS_IOCTL_MAGIC, 29, \ + struct btrfs_ioctl_scrub_args) +#define BTRFS_IOC_DEV_INFO _IOWR(BTRFS_IOCTL_MAGIC, 30, \ + struct btrfs_ioctl_dev_info_args) +#define BTRFS_IOC_FS_INFO _IOR(BTRFS_IOCTL_MAGIC, 31, \ + struct btrfs_ioctl_fs_info_args) +#define BTRFS_IOC_BALANCE_V2 _IOWR(BTRFS_IOCTL_MAGIC, 32, \ + struct btrfs_ioctl_balance_args) +#define BTRFS_IOC_BALANCE_CTL _IOW(BTRFS_IOCTL_MAGIC, 33, int) +#define BTRFS_IOC_BALANCE_PROGRESS _IOR(BTRFS_IOCTL_MAGIC, 34, \ + struct btrfs_ioctl_balance_args) +#define BTRFS_IOC_INO_PATHS _IOWR(BTRFS_IOCTL_MAGIC, 35, \ + struct btrfs_ioctl_ino_path_args) +#define BTRFS_IOC_LOGICAL_INO _IOWR(BTRFS_IOCTL_MAGIC, 36, \ + struct btrfs_ioctl_logical_ino_args) +#define BTRFS_IOC_SET_RECEIVED_SUBVOL _IOWR(BTRFS_IOCTL_MAGIC, 37, \ + struct btrfs_ioctl_received_subvol_args) +#define BTRFS_IOC_SEND _IOW(BTRFS_IOCTL_MAGIC, 38, struct btrfs_ioctl_send_args) +#define BTRFS_IOC_DEVICES_READY _IOR(BTRFS_IOCTL_MAGIC, 39, \ + struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_QUOTA_CTL _IOWR(BTRFS_IOCTL_MAGIC, 40, \ + struct btrfs_ioctl_quota_ctl_args) +#define BTRFS_IOC_QGROUP_ASSIGN _IOW(BTRFS_IOCTL_MAGIC, 41, \ + struct btrfs_ioctl_qgroup_assign_args) +#define BTRFS_IOC_QGROUP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 42, \ + struct btrfs_ioctl_qgroup_create_args) +#define BTRFS_IOC_QGROUP_LIMIT _IOR(BTRFS_IOCTL_MAGIC, 43, \ + struct btrfs_ioctl_qgroup_limit_args) +#define BTRFS_IOC_QUOTA_RESCAN _IOW(BTRFS_IOCTL_MAGIC, 44, \ + struct btrfs_ioctl_quota_rescan_args) +#define BTRFS_IOC_QUOTA_RESCAN_STATUS _IOR(BTRFS_IOCTL_MAGIC, 45, \ + struct btrfs_ioctl_quota_rescan_args) +#define BTRFS_IOC_QUOTA_RESCAN_WAIT _IO(BTRFS_IOCTL_MAGIC, 46) +#define BTRFS_IOC_GET_FSLABEL _IOR(BTRFS_IOCTL_MAGIC, 49, \ + char[BTRFS_LABEL_SIZE]) +#define BTRFS_IOC_SET_FSLABEL _IOW(BTRFS_IOCTL_MAGIC, 50, \ + char[BTRFS_LABEL_SIZE]) +#define BTRFS_IOC_GET_DEV_STATS _IOWR(BTRFS_IOCTL_MAGIC, 52, \ + struct btrfs_ioctl_get_dev_stats) +#define BTRFS_IOC_DEV_REPLACE _IOWR(BTRFS_IOCTL_MAGIC, 53, \ + struct btrfs_ioctl_dev_replace_args) +#define BTRFS_IOC_FILE_EXTENT_SAME _IOWR(BTRFS_IOCTL_MAGIC, 54, \ + struct btrfs_ioctl_same_args) +#define BTRFS_IOC_GET_FEATURES _IOR(BTRFS_IOCTL_MAGIC, 57, \ + struct btrfs_ioctl_feature_flags) +#define BTRFS_IOC_SET_FEATURES _IOW(BTRFS_IOCTL_MAGIC, 57, \ + struct btrfs_ioctl_feature_flags[2]) +#define BTRFS_IOC_GET_SUPPORTED_FEATURES _IOR(BTRFS_IOCTL_MAGIC, 57, \ + struct btrfs_ioctl_feature_flags[3]) +#define BTRFS_IOC_RM_DEV_V2 _IOW(BTRFS_IOCTL_MAGIC, 58, \ + struct btrfs_ioctl_vol_args_v2) +#define BTRFS_IOC_LOGICAL_INO_V2 _IOWR(BTRFS_IOCTL_MAGIC, 59, \ + struct btrfs_ioctl_logical_ino_args) +#define BTRFS_IOC_GET_SUBVOL_INFO _IOR(BTRFS_IOCTL_MAGIC, 60, \ + struct btrfs_ioctl_get_subvol_info_args) +#define BTRFS_IOC_GET_SUBVOL_ROOTREF _IOWR(BTRFS_IOCTL_MAGIC, 61, \ + struct btrfs_ioctl_get_subvol_rootref_args) +#define BTRFS_IOC_INO_LOOKUP_USER _IOWR(BTRFS_IOCTL_MAGIC, 62, \ + struct btrfs_ioctl_ino_lookup_user_args) + +#endif /* _UAPI_LINUX_BTRFS_H */ diff --git a/src/basic/linux/btrfs_tree.h b/src/basic/linux/btrfs_tree.h new file mode 100644 index 00000000000..e974f4bb537 --- /dev/null +++ b/src/basic/linux/btrfs_tree.h @@ -0,0 +1,974 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _BTRFS_CTREE_H_ +#define _BTRFS_CTREE_H_ + +#include <linux/btrfs.h> +#include <linux/types.h> + +/* + * This header contains the structure definitions and constants used + * by file system objects that can be retrieved using + * the BTRFS_IOC_SEARCH_TREE ioctl. That means basically anything that + * is needed to describe a leaf node's key or item contents. + */ + +/* holds pointers to all of the tree roots */ +#define BTRFS_ROOT_TREE_OBJECTID 1ULL + +/* stores information about which extents are in use, and reference counts */ +#define BTRFS_EXTENT_TREE_OBJECTID 2ULL + +/* + * chunk tree stores translations from logical -> physical block numbering + * the super block points to the chunk tree + */ +#define BTRFS_CHUNK_TREE_OBJECTID 3ULL + +/* + * stores information about which areas of a given device are in use. + * one per device. The tree of tree roots points to the device tree + */ +#define BTRFS_DEV_TREE_OBJECTID 4ULL + +/* one per subvolume, storing files and directories */ +#define BTRFS_FS_TREE_OBJECTID 5ULL + +/* directory objectid inside the root tree */ +#define BTRFS_ROOT_TREE_DIR_OBJECTID 6ULL + +/* holds checksums of all the data extents */ +#define BTRFS_CSUM_TREE_OBJECTID 7ULL + +/* holds quota configuration and tracking */ +#define BTRFS_QUOTA_TREE_OBJECTID 8ULL + +/* for storing items that use the BTRFS_UUID_KEY* types */ +#define BTRFS_UUID_TREE_OBJECTID 9ULL + +/* tracks free space in block groups. */ +#define BTRFS_FREE_SPACE_TREE_OBJECTID 10ULL + +/* device stats in the device tree */ +#define BTRFS_DEV_STATS_OBJECTID 0ULL + +/* for storing balance parameters in the root tree */ +#define BTRFS_BALANCE_OBJECTID -4ULL + +/* orhpan objectid for tracking unlinked/truncated files */ +#define BTRFS_ORPHAN_OBJECTID -5ULL + +/* does write ahead logging to speed up fsyncs */ +#define BTRFS_TREE_LOG_OBJECTID -6ULL +#define BTRFS_TREE_LOG_FIXUP_OBJECTID -7ULL + +/* for space balancing */ +#define BTRFS_TREE_RELOC_OBJECTID -8ULL +#define BTRFS_DATA_RELOC_TREE_OBJECTID -9ULL + +/* + * extent checksums all have this objectid + * this allows them to share the logging tree + * for fsyncs + */ +#define BTRFS_EXTENT_CSUM_OBJECTID -10ULL + +/* For storing free space cache */ +#define BTRFS_FREE_SPACE_OBJECTID -11ULL + +/* + * The inode number assigned to the special inode for storing + * free ino cache + */ +#define BTRFS_FREE_INO_OBJECTID -12ULL + +/* dummy objectid represents multiple objectids */ +#define BTRFS_MULTIPLE_OBJECTIDS -255ULL + +/* + * All files have objectids in this range. + */ +#define BTRFS_FIRST_FREE_OBJECTID 256ULL +#define BTRFS_LAST_FREE_OBJECTID -256ULL +#define BTRFS_FIRST_CHUNK_TREE_OBJECTID 256ULL + + +/* + * the device items go into the chunk tree. The key is in the form + * [ 1 BTRFS_DEV_ITEM_KEY device_id ] + */ +#define BTRFS_DEV_ITEMS_OBJECTID 1ULL + +#define BTRFS_BTREE_INODE_OBJECTID 1 + +#define BTRFS_EMPTY_SUBVOL_DIR_OBJECTID 2 + +#define BTRFS_DEV_REPLACE_DEVID 0ULL + +/* + * inode items have the data typically returned from stat and store other + * info about object characteristics. There is one for every file and dir in + * the FS + */ +#define BTRFS_INODE_ITEM_KEY 1 +#define BTRFS_INODE_REF_KEY 12 +#define BTRFS_INODE_EXTREF_KEY 13 +#define BTRFS_XATTR_ITEM_KEY 24 +#define BTRFS_ORPHAN_ITEM_KEY 48 +/* reserve 2-15 close to the inode for later flexibility */ + +/* + * dir items are the name -> inode pointers in a directory. There is one + * for every name in a directory. + */ +#define BTRFS_DIR_LOG_ITEM_KEY 60 +#define BTRFS_DIR_LOG_INDEX_KEY 72 +#define BTRFS_DIR_ITEM_KEY 84 +#define BTRFS_DIR_INDEX_KEY 96 +/* + * extent data is for file data + */ +#define BTRFS_EXTENT_DATA_KEY 108 + +/* + * extent csums are stored in a separate tree and hold csums for + * an entire extent on disk. + */ +#define BTRFS_EXTENT_CSUM_KEY 128 + +/* + * root items point to tree roots. They are typically in the root + * tree used by the super block to find all the other trees + */ +#define BTRFS_ROOT_ITEM_KEY 132 + +/* + * root backrefs tie subvols and snapshots to the directory entries that + * reference them + */ +#define BTRFS_ROOT_BACKREF_KEY 144 + +/* + * root refs make a fast index for listing all of the snapshots and + * subvolumes referenced by a given root. They point directly to the + * directory item in the root that references the subvol + */ +#define BTRFS_ROOT_REF_KEY 156 + +/* + * extent items are in the extent map tree. These record which blocks + * are used, and how many references there are to each block + */ +#define BTRFS_EXTENT_ITEM_KEY 168 + +/* + * The same as the BTRFS_EXTENT_ITEM_KEY, except it's metadata we already know + * the length, so we save the level in key->offset instead of the length. + */ +#define BTRFS_METADATA_ITEM_KEY 169 + +#define BTRFS_TREE_BLOCK_REF_KEY 176 + +#define BTRFS_EXTENT_DATA_REF_KEY 178 + +#define BTRFS_EXTENT_REF_V0_KEY 180 + +#define BTRFS_SHARED_BLOCK_REF_KEY 182 + +#define BTRFS_SHARED_DATA_REF_KEY 184 + +/* + * block groups give us hints into the extent allocation trees. Which + * blocks are free etc etc + */ +#define BTRFS_BLOCK_GROUP_ITEM_KEY 192 + +/* + * Every block group is represented in the free space tree by a free space info + * item, which stores some accounting information. It is keyed on + * (block_group_start, FREE_SPACE_INFO, block_group_length). + */ +#define BTRFS_FREE_SPACE_INFO_KEY 198 + +/* + * A free space extent tracks an extent of space that is free in a block group. + * It is keyed on (start, FREE_SPACE_EXTENT, length). + */ +#define BTRFS_FREE_SPACE_EXTENT_KEY 199 + +/* + * When a block group becomes very fragmented, we convert it to use bitmaps + * instead of extents. A free space bitmap is keyed on + * (start, FREE_SPACE_BITMAP, length); the corresponding item is a bitmap with + * (length / sectorsize) bits. + */ +#define BTRFS_FREE_SPACE_BITMAP_KEY 200 + +#define BTRFS_DEV_EXTENT_KEY 204 +#define BTRFS_DEV_ITEM_KEY 216 +#define BTRFS_CHUNK_ITEM_KEY 228 + +/* + * Records the overall state of the qgroups. + * There's only one instance of this key present, + * (0, BTRFS_QGROUP_STATUS_KEY, 0) + */ +#define BTRFS_QGROUP_STATUS_KEY 240 +/* + * Records the currently used space of the qgroup. + * One key per qgroup, (0, BTRFS_QGROUP_INFO_KEY, qgroupid). + */ +#define BTRFS_QGROUP_INFO_KEY 242 +/* + * Contains the user configured limits for the qgroup. + * One key per qgroup, (0, BTRFS_QGROUP_LIMIT_KEY, qgroupid). + */ +#define BTRFS_QGROUP_LIMIT_KEY 244 +/* + * Records the child-parent relationship of qgroups. For + * each relation, 2 keys are present: + * (childid, BTRFS_QGROUP_RELATION_KEY, parentid) + * (parentid, BTRFS_QGROUP_RELATION_KEY, childid) + */ +#define BTRFS_QGROUP_RELATION_KEY 246 + +/* + * Obsolete name, see BTRFS_TEMPORARY_ITEM_KEY. + */ +#define BTRFS_BALANCE_ITEM_KEY 248 + +/* + * The key type for tree items that are stored persistently, but do not need to + * exist for extended period of time. The items can exist in any tree. + * + * [subtype, BTRFS_TEMPORARY_ITEM_KEY, data] + * + * Existing items: + * + * - balance status item + * (BTRFS_BALANCE_OBJECTID, BTRFS_TEMPORARY_ITEM_KEY, 0) + */ +#define BTRFS_TEMPORARY_ITEM_KEY 248 + +/* + * Obsolete name, see BTRFS_PERSISTENT_ITEM_KEY + */ +#define BTRFS_DEV_STATS_KEY 249 + +/* + * The key type for tree items that are stored persistently and usually exist + * for a long period, eg. filesystem lifetime. The item kinds can be status + * information, stats or preference values. The item can exist in any tree. + * + * [subtype, BTRFS_PERSISTENT_ITEM_KEY, data] + * + * Existing items: + * + * - device statistics, store IO stats in the device tree, one key for all + * stats + * (BTRFS_DEV_STATS_OBJECTID, BTRFS_DEV_STATS_KEY, 0) + */ +#define BTRFS_PERSISTENT_ITEM_KEY 249 + +/* + * Persistantly stores the device replace state in the device tree. + * The key is built like this: (0, BTRFS_DEV_REPLACE_KEY, 0). + */ +#define BTRFS_DEV_REPLACE_KEY 250 + +/* + * Stores items that allow to quickly map UUIDs to something else. + * These items are part of the filesystem UUID tree. + * The key is built like this: + * (UUID_upper_64_bits, BTRFS_UUID_KEY*, UUID_lower_64_bits). + */ +#if BTRFS_UUID_SIZE != 16 +#error "UUID items require BTRFS_UUID_SIZE == 16!" +#endif +#define BTRFS_UUID_KEY_SUBVOL 251 /* for UUIDs assigned to subvols */ +#define BTRFS_UUID_KEY_RECEIVED_SUBVOL 252 /* for UUIDs assigned to + * received subvols */ + +/* + * string items are for debugging. They just store a short string of + * data in the FS + */ +#define BTRFS_STRING_ITEM_KEY 253 + + + +/* 32 bytes in various csum fields */ +#define BTRFS_CSUM_SIZE 32 + +/* csum types */ +#define BTRFS_CSUM_TYPE_CRC32 0 + +/* + * flags definitions for directory entry item type + * + * Used by: + * struct btrfs_dir_item.type + */ +#define BTRFS_FT_UNKNOWN 0 +#define BTRFS_FT_REG_FILE 1 +#define BTRFS_FT_DIR 2 +#define BTRFS_FT_CHRDEV 3 +#define BTRFS_FT_BLKDEV 4 +#define BTRFS_FT_FIFO 5 +#define BTRFS_FT_SOCK 6 +#define BTRFS_FT_SYMLINK 7 +#define BTRFS_FT_XATTR 8 +#define BTRFS_FT_MAX 9 + +/* + * The key defines the order in the tree, and so it also defines (optimal) + * block layout. + * + * objectid corresponds to the inode number. + * + * type tells us things about the object, and is a kind of stream selector. + * so for a given inode, keys with type of 1 might refer to the inode data, + * type of 2 may point to file data in the btree and type == 3 may point to + * extents. + * + * offset is the starting byte offset for this key in the stream. + * + * btrfs_disk_key is in disk byte order. struct btrfs_key is always + * in cpu native order. Otherwise they are identical and their sizes + * should be the same (ie both packed) + */ +struct btrfs_disk_key { + __le64 objectid; + __u8 type; + __le64 offset; +} __attribute__ ((__packed__)); + +struct btrfs_key { + __u64 objectid; + __u8 type; + __u64 offset; +} __attribute__ ((__packed__)); + +struct btrfs_dev_item { + /* the internal btrfs device id */ + __le64 devid; + + /* size of the device */ + __le64 total_bytes; + + /* bytes used */ + __le64 bytes_used; + + /* optimal io alignment for this device */ + __le32 io_align; + + /* optimal io width for this device */ + __le32 io_width; + + /* minimal io size for this device */ + __le32 sector_size; + + /* type and info about this device */ + __le64 type; + + /* expected generation for this device */ + __le64 generation; + + /* + * starting byte of this partition on the device, + * to allow for stripe alignment in the future + */ + __le64 start_offset; + + /* grouping information for allocation decisions */ + __le32 dev_group; + + /* seek speed 0-100 where 100 is fastest */ + __u8 seek_speed; + + /* bandwidth 0-100 where 100 is fastest */ + __u8 bandwidth; + + /* btrfs generated uuid for this device */ + __u8 uuid[BTRFS_UUID_SIZE]; + + /* uuid of FS who owns this device */ + __u8 fsid[BTRFS_UUID_SIZE]; +} __attribute__ ((__packed__)); + +struct btrfs_stripe { + __le64 devid; + __le64 offset; + __u8 dev_uuid[BTRFS_UUID_SIZE]; +} __attribute__ ((__packed__)); + +struct btrfs_chunk { + /* size of this chunk in bytes */ + __le64 length; + + /* objectid of the root referencing this chunk */ + __le64 owner; + + __le64 stripe_len; + __le64 type; + + /* optimal io alignment for this chunk */ + __le32 io_align; + + /* optimal io width for this chunk */ + __le32 io_width; + + /* minimal io size for this chunk */ + __le32 sector_size; + + /* 2^16 stripes is quite a lot, a second limit is the size of a single + * item in the btree + */ + __le16 num_stripes; + + /* sub stripes only matter for raid10 */ + __le16 sub_stripes; + struct btrfs_stripe stripe; + /* additional stripes go here */ +} __attribute__ ((__packed__)); + +#define BTRFS_FREE_SPACE_EXTENT 1 +#define BTRFS_FREE_SPACE_BITMAP 2 + +struct btrfs_free_space_entry { + __le64 offset; + __le64 bytes; + __u8 type; +} __attribute__ ((__packed__)); + +struct btrfs_free_space_header { + struct btrfs_disk_key location; + __le64 generation; + __le64 num_entries; + __le64 num_bitmaps; +} __attribute__ ((__packed__)); + +#define BTRFS_HEADER_FLAG_WRITTEN (1ULL << 0) +#define BTRFS_HEADER_FLAG_RELOC (1ULL << 1) + +/* Super block flags */ +/* Errors detected */ +#define BTRFS_SUPER_FLAG_ERROR (1ULL << 2) + +#define BTRFS_SUPER_FLAG_SEEDING (1ULL << 32) +#define BTRFS_SUPER_FLAG_METADUMP (1ULL << 33) +#define BTRFS_SUPER_FLAG_METADUMP_V2 (1ULL << 34) +#define BTRFS_SUPER_FLAG_CHANGING_FSID (1ULL << 35) +#define BTRFS_SUPER_FLAG_CHANGING_FSID_V2 (1ULL << 36) + + +/* + * items in the extent btree are used to record the objectid of the + * owner of the block and the number of references + */ + +struct btrfs_extent_item { + __le64 refs; + __le64 generation; + __le64 flags; +} __attribute__ ((__packed__)); + +struct btrfs_extent_item_v0 { + __le32 refs; +} __attribute__ ((__packed__)); + + +#define BTRFS_EXTENT_FLAG_DATA (1ULL << 0) +#define BTRFS_EXTENT_FLAG_TREE_BLOCK (1ULL << 1) + +/* following flags only apply to tree blocks */ + +/* use full backrefs for extent pointers in the block */ +#define BTRFS_BLOCK_FLAG_FULL_BACKREF (1ULL << 8) + +/* + * this flag is only used internally by scrub and may be changed at any time + * it is only declared here to avoid collisions + */ +#define BTRFS_EXTENT_FLAG_SUPER (1ULL << 48) + +struct btrfs_tree_block_info { + struct btrfs_disk_key key; + __u8 level; +} __attribute__ ((__packed__)); + +struct btrfs_extent_data_ref { + __le64 root; + __le64 objectid; + __le64 offset; + __le32 count; +} __attribute__ ((__packed__)); + +struct btrfs_shared_data_ref { + __le32 count; +} __attribute__ ((__packed__)); + +struct btrfs_extent_inline_ref { + __u8 type; + __le64 offset; +} __attribute__ ((__packed__)); + +/* old style backrefs item */ +struct btrfs_extent_ref_v0 { + __le64 root; + __le64 generation; + __le64 objectid; + __le32 count; +} __attribute__ ((__packed__)); + + +/* dev extents record free space on individual devices. The owner + * field points back to the chunk allocation mapping tree that allocated + * the extent. The chunk tree uuid field is a way to double check the owner + */ +struct btrfs_dev_extent { + __le64 chunk_tree; + __le64 chunk_objectid; + __le64 chunk_offset; + __le64 length; + __u8 chunk_tree_uuid[BTRFS_UUID_SIZE]; +} __attribute__ ((__packed__)); + +struct btrfs_inode_ref { + __le64 index; + __le16 name_len; + /* name goes here */ +} __attribute__ ((__packed__)); + +struct btrfs_inode_extref { + __le64 parent_objectid; + __le64 index; + __le16 name_len; + __u8 name[0]; + /* name goes here */ +} __attribute__ ((__packed__)); + +struct btrfs_timespec { + __le64 sec; + __le32 nsec; +} __attribute__ ((__packed__)); + +struct btrfs_inode_item { + /* nfs style generation number */ + __le64 generation; + /* transid that last touched this inode */ + __le64 transid; + __le64 size; + __le64 nbytes; + __le64 block_group; + __le32 nlink; + __le32 uid; + __le32 gid; + __le32 mode; + __le64 rdev; + __le64 flags; + + /* modification sequence number for NFS */ + __le64 sequence; + + /* + * a little future expansion, for more than this we can + * just grow the inode item and version it + */ + __le64 reserved[4]; + struct btrfs_timespec atime; + struct btrfs_timespec ctime; + struct btrfs_timespec mtime; + struct btrfs_timespec otime; +} __attribute__ ((__packed__)); + +struct btrfs_dir_log_item { + __le64 end; +} __attribute__ ((__packed__)); + +struct btrfs_dir_item { + struct btrfs_disk_key location; + __le64 transid; + __le16 data_len; + __le16 name_len; + __u8 type; +} __attribute__ ((__packed__)); + +#define BTRFS_ROOT_SUBVOL_RDONLY (1ULL << 0) + +/* + * Internal in-memory flag that a subvolume has been marked for deletion but + * still visible as a directory + */ +#define BTRFS_ROOT_SUBVOL_DEAD (1ULL << 48) + +struct btrfs_root_item { + struct btrfs_inode_item inode; + __le64 generation; + __le64 root_dirid; + __le64 bytenr; + __le64 byte_limit; + __le64 bytes_used; + __le64 last_snapshot; + __le64 flags; + __le32 refs; + struct btrfs_disk_key drop_progress; + __u8 drop_level; + __u8 level; + + /* + * The following fields appear after subvol_uuids+subvol_times + * were introduced. + */ + + /* + * This generation number is used to test if the new fields are valid + * and up to date while reading the root item. Every time the root item + * is written out, the "generation" field is copied into this field. If + * anyone ever mounted the fs with an older kernel, we will have + * mismatching generation values here and thus must invalidate the + * new fields. See btrfs_update_root and btrfs_find_last_root for + * details. + * the offset of generation_v2 is also used as the start for the memset + * when invalidating the fields. + */ + __le64 generation_v2; + __u8 uuid[BTRFS_UUID_SIZE]; + __u8 parent_uuid[BTRFS_UUID_SIZE]; + __u8 received_uuid[BTRFS_UUID_SIZE]; + __le64 ctransid; /* updated when an inode changes */ + __le64 otransid; /* trans when created */ + __le64 stransid; /* trans when sent. non-zero for received subvol */ + __le64 rtransid; /* trans when received. non-zero for received subvol */ + struct btrfs_timespec ctime; + struct btrfs_timespec otime; + struct btrfs_timespec stime; + struct btrfs_timespec rtime; + __le64 reserved[8]; /* for future */ +} __attribute__ ((__packed__)); + +/* + * this is used for both forward and backward root refs + */ +struct btrfs_root_ref { + __le64 dirid; + __le64 sequence; + __le16 name_len; +} __attribute__ ((__packed__)); + +struct btrfs_disk_balance_args { + /* + * profiles to operate on, single is denoted by + * BTRFS_AVAIL_ALLOC_BIT_SINGLE + */ + __le64 profiles; + + /* + * usage filter + * BTRFS_BALANCE_ARGS_USAGE with a single value means '0..N' + * BTRFS_BALANCE_ARGS_USAGE_RANGE - range syntax, min..max + */ + union { + __le64 usage; + struct { + __le32 usage_min; + __le32 usage_max; + }; + }; + + /* devid filter */ + __le64 devid; + + /* devid subset filter [pstart..pend) */ + __le64 pstart; + __le64 pend; + + /* btrfs virtual address space subset filter [vstart..vend) */ + __le64 vstart; + __le64 vend; + + /* + * profile to convert to, single is denoted by + * BTRFS_AVAIL_ALLOC_BIT_SINGLE + */ + __le64 target; + + /* BTRFS_BALANCE_ARGS_* */ + __le64 flags; + + /* + * BTRFS_BALANCE_ARGS_LIMIT with value 'limit' + * BTRFS_BALANCE_ARGS_LIMIT_RANGE - the extend version can use minimum + * and maximum + */ + union { + __le64 limit; + struct { + __le32 limit_min; + __le32 limit_max; + }; + }; + + /* + * Process chunks that cross stripes_min..stripes_max devices, + * BTRFS_BALANCE_ARGS_STRIPES_RANGE + */ + __le32 stripes_min; + __le32 stripes_max; + + __le64 unused[6]; +} __attribute__ ((__packed__)); + +/* + * store balance parameters to disk so that balance can be properly + * resumed after crash or unmount + */ +struct btrfs_balance_item { + /* BTRFS_BALANCE_* */ + __le64 flags; + + struct btrfs_disk_balance_args data; + struct btrfs_disk_balance_args meta; + struct btrfs_disk_balance_args sys; + + __le64 unused[4]; +} __attribute__ ((__packed__)); + +#define BTRFS_FILE_EXTENT_INLINE 0 +#define BTRFS_FILE_EXTENT_REG 1 +#define BTRFS_FILE_EXTENT_PREALLOC 2 +#define BTRFS_FILE_EXTENT_TYPES 2 + +struct btrfs_file_extent_item { + /* + * transaction id that created this extent + */ + __le64 generation; + /* + * max number of bytes to hold this extent in ram + * when we split a compressed extent we can't know how big + * each of the resulting pieces will be. So, this is + * an upper limit on the size of the extent in ram instead of + * an exact limit. + */ + __le64 ram_bytes; + + /* + * 32 bits for the various ways we might encode the data, + * including compression and encryption. If any of these + * are set to something a given disk format doesn't understand + * it is treated like an incompat flag for reading and writing, + * but not for stat. + */ + __u8 compression; + __u8 encryption; + __le16 other_encoding; /* spare for later use */ + + /* are we inline data or a real extent? */ + __u8 type; + + /* + * disk space consumed by the extent, checksum blocks are included + * in these numbers + * + * At this offset in the structure, the inline extent data start. + */ + __le64 disk_bytenr; + __le64 disk_num_bytes; + /* + * the logical offset in file blocks (no csums) + * this extent record is for. This allows a file extent to point + * into the middle of an existing extent on disk, sharing it + * between two snapshots (useful if some bytes in the middle of the + * extent have changed + */ + __le64 offset; + /* + * the logical number of file blocks (no csums included). This + * always reflects the size uncompressed and without encoding. + */ + __le64 num_bytes; + +} __attribute__ ((__packed__)); + +struct btrfs_csum_item { + __u8 csum; +} __attribute__ ((__packed__)); + +struct btrfs_dev_stats_item { + /* + * grow this item struct at the end for future enhancements and keep + * the existing values unchanged + */ + __le64 values[BTRFS_DEV_STAT_VALUES_MAX]; +} __attribute__ ((__packed__)); + +#define BTRFS_DEV_REPLACE_ITEM_CONT_READING_FROM_SRCDEV_MODE_ALWAYS 0 +#define BTRFS_DEV_REPLACE_ITEM_CONT_READING_FROM_SRCDEV_MODE_AVOID 1 +#define BTRFS_DEV_REPLACE_ITEM_STATE_NEVER_STARTED 0 +#define BTRFS_DEV_REPLACE_ITEM_STATE_STARTED 1 +#define BTRFS_DEV_REPLACE_ITEM_STATE_SUSPENDED 2 +#define BTRFS_DEV_REPLACE_ITEM_STATE_FINISHED 3 +#define BTRFS_DEV_REPLACE_ITEM_STATE_CANCELED 4 + +struct btrfs_dev_replace_item { + /* + * grow this item struct at the end for future enhancements and keep + * the existing values unchanged + */ + __le64 src_devid; + __le64 cursor_left; + __le64 cursor_right; + __le64 cont_reading_from_srcdev_mode; + + __le64 replace_state; + __le64 time_started; + __le64 time_stopped; + __le64 num_write_errors; + __le64 num_uncorrectable_read_errors; +} __attribute__ ((__packed__)); + +/* different types of block groups (and chunks) */ +#define BTRFS_BLOCK_GROUP_DATA (1ULL << 0) +#define BTRFS_BLOCK_GROUP_SYSTEM (1ULL << 1) +#define BTRFS_BLOCK_GROUP_METADATA (1ULL << 2) +#define BTRFS_BLOCK_GROUP_RAID0 (1ULL << 3) +#define BTRFS_BLOCK_GROUP_RAID1 (1ULL << 4) +#define BTRFS_BLOCK_GROUP_DUP (1ULL << 5) +#define BTRFS_BLOCK_GROUP_RAID10 (1ULL << 6) +#define BTRFS_BLOCK_GROUP_RAID5 (1ULL << 7) +#define BTRFS_BLOCK_GROUP_RAID6 (1ULL << 8) +#define BTRFS_BLOCK_GROUP_RESERVED (BTRFS_AVAIL_ALLOC_BIT_SINGLE | \ + BTRFS_SPACE_INFO_GLOBAL_RSV) + +enum btrfs_raid_types { + BTRFS_RAID_RAID10, + BTRFS_RAID_RAID1, + BTRFS_RAID_DUP, + BTRFS_RAID_RAID0, + BTRFS_RAID_SINGLE, + BTRFS_RAID_RAID5, + BTRFS_RAID_RAID6, + BTRFS_NR_RAID_TYPES +}; + +#define BTRFS_BLOCK_GROUP_TYPE_MASK (BTRFS_BLOCK_GROUP_DATA | \ + BTRFS_BLOCK_GROUP_SYSTEM | \ + BTRFS_BLOCK_GROUP_METADATA) + +#define BTRFS_BLOCK_GROUP_PROFILE_MASK (BTRFS_BLOCK_GROUP_RAID0 | \ + BTRFS_BLOCK_GROUP_RAID1 | \ + BTRFS_BLOCK_GROUP_RAID5 | \ + BTRFS_BLOCK_GROUP_RAID6 | \ + BTRFS_BLOCK_GROUP_DUP | \ + BTRFS_BLOCK_GROUP_RAID10) +#define BTRFS_BLOCK_GROUP_RAID56_MASK (BTRFS_BLOCK_GROUP_RAID5 | \ + BTRFS_BLOCK_GROUP_RAID6) + +/* + * We need a bit for restriper to be able to tell when chunks of type + * SINGLE are available. This "extended" profile format is used in + * fs_info->avail_*_alloc_bits (in-memory) and balance item fields + * (on-disk). The corresponding on-disk bit in chunk.type is reserved + * to avoid remappings between two formats in future. + */ +#define BTRFS_AVAIL_ALLOC_BIT_SINGLE (1ULL << 48) + +/* + * A fake block group type that is used to communicate global block reserve + * size to userspace via the SPACE_INFO ioctl. + */ +#define BTRFS_SPACE_INFO_GLOBAL_RSV (1ULL << 49) + +#define BTRFS_EXTENDED_PROFILE_MASK (BTRFS_BLOCK_GROUP_PROFILE_MASK | \ + BTRFS_AVAIL_ALLOC_BIT_SINGLE) + +static inline __u64 chunk_to_extended(__u64 flags) +{ + if ((flags & BTRFS_BLOCK_GROUP_PROFILE_MASK) == 0) + flags |= BTRFS_AVAIL_ALLOC_BIT_SINGLE; + + return flags; +} +static inline __u64 extended_to_chunk(__u64 flags) +{ + return flags & ~BTRFS_AVAIL_ALLOC_BIT_SINGLE; +} + +struct btrfs_block_group_item { + __le64 used; + __le64 chunk_objectid; + __le64 flags; +} __attribute__ ((__packed__)); + +struct btrfs_free_space_info { + __le32 extent_count; + __le32 flags; +} __attribute__ ((__packed__)); + +#define BTRFS_FREE_SPACE_USING_BITMAPS (1ULL << 0) + +#define BTRFS_QGROUP_LEVEL_SHIFT 48 +static inline __u64 btrfs_qgroup_level(__u64 qgroupid) +{ + return qgroupid >> BTRFS_QGROUP_LEVEL_SHIFT; +} + +/* + * is subvolume quota turned on? + */ +#define BTRFS_QGROUP_STATUS_FLAG_ON (1ULL << 0) +/* + * RESCAN is set during the initialization phase + */ +#define BTRFS_QGROUP_STATUS_FLAG_RESCAN (1ULL << 1) +/* + * Some qgroup entries are known to be out of date, + * either because the configuration has changed in a way that + * makes a rescan necessary, or because the fs has been mounted + * with a non-qgroup-aware version. + * Turning qouta off and on again makes it inconsistent, too. + */ +#define BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT (1ULL << 2) + +#define BTRFS_QGROUP_STATUS_VERSION 1 + +struct btrfs_qgroup_status_item { + __le64 version; + /* + * the generation is updated during every commit. As older + * versions of btrfs are not aware of qgroups, it will be + * possible to detect inconsistencies by checking the + * generation on mount time + */ + __le64 generation; + + /* flag definitions see above */ + __le64 flags; + + /* + * only used during scanning to record the progress + * of the scan. It contains a logical address + */ + __le64 rescan; +} __attribute__ ((__packed__)); + +struct btrfs_qgroup_info_item { + __le64 generation; + __le64 rfer; + __le64 rfer_cmpr; + __le64 excl; + __le64 excl_cmpr; +} __attribute__ ((__packed__)); + +struct btrfs_qgroup_limit_item { + /* + * only updated when any of the other values change + */ + __le64 flags; + __le64 max_rfer; + __le64 max_excl; + __le64 rsv_rfer; + __le64 rsv_excl; +} __attribute__ ((__packed__)); + +#endif /* _BTRFS_CTREE_H_ */ diff --git a/src/basic/linux/can/vxcan.h b/src/basic/linux/can/vxcan.h new file mode 100644 index 00000000000..066812d118a --- /dev/null +++ b/src/basic/linux/can/vxcan.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_CAN_VXCAN_H +#define _UAPI_CAN_VXCAN_H + +enum { + VXCAN_INFO_UNSPEC, + VXCAN_INFO_PEER, + + __VXCAN_INFO_MAX +#define VXCAN_INFO_MAX (__VXCAN_INFO_MAX - 1) +}; + +#endif diff --git a/src/basic/linux/fib_rules.h b/src/basic/linux/fib_rules.h new file mode 100644 index 00000000000..232df14e128 --- /dev/null +++ b/src/basic/linux/fib_rules.h @@ -0,0 +1,90 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef __LINUX_FIB_RULES_H +#define __LINUX_FIB_RULES_H + +#include <linux/types.h> +#include <linux/rtnetlink.h> + +/* rule is permanent, and cannot be deleted */ +#define FIB_RULE_PERMANENT 0x00000001 +#define FIB_RULE_INVERT 0x00000002 +#define FIB_RULE_UNRESOLVED 0x00000004 +#define FIB_RULE_IIF_DETACHED 0x00000008 +#define FIB_RULE_DEV_DETACHED FIB_RULE_IIF_DETACHED +#define FIB_RULE_OIF_DETACHED 0x00000010 + +/* try to find source address in routing lookups */ +#define FIB_RULE_FIND_SADDR 0x00010000 + +struct fib_rule_hdr { + __u8 family; + __u8 dst_len; + __u8 src_len; + __u8 tos; + + __u8 table; + __u8 res1; /* reserved */ + __u8 res2; /* reserved */ + __u8 action; + + __u32 flags; +}; + +struct fib_rule_uid_range { + __u32 start; + __u32 end; +}; + +struct fib_rule_port_range { + __u16 start; + __u16 end; +}; + +enum { + FRA_UNSPEC, + FRA_DST, /* destination address */ + FRA_SRC, /* source address */ + FRA_IIFNAME, /* interface name */ +#define FRA_IFNAME FRA_IIFNAME + FRA_GOTO, /* target to jump to (FR_ACT_GOTO) */ + FRA_UNUSED2, + FRA_PRIORITY, /* priority/preference */ + FRA_UNUSED3, + FRA_UNUSED4, + FRA_UNUSED5, + FRA_FWMARK, /* mark */ + FRA_FLOW, /* flow/class id */ + FRA_TUN_ID, + FRA_SUPPRESS_IFGROUP, + FRA_SUPPRESS_PREFIXLEN, + FRA_TABLE, /* Extended table id */ + FRA_FWMASK, /* mask for netfilter mark */ + FRA_OIFNAME, + FRA_PAD, + FRA_L3MDEV, /* iif or oif is l3mdev goto its table */ + FRA_UID_RANGE, /* UID range */ + FRA_PROTOCOL, /* Originator of the rule */ + FRA_IP_PROTO, /* ip proto */ + FRA_SPORT_RANGE, /* sport */ + FRA_DPORT_RANGE, /* dport */ + __FRA_MAX +}; + +#define FRA_MAX (__FRA_MAX - 1) + +enum { + FR_ACT_UNSPEC, + FR_ACT_TO_TBL, /* Pass to fixed table */ + FR_ACT_GOTO, /* Jump to another rule */ + FR_ACT_NOP, /* No operation */ + FR_ACT_RES3, + FR_ACT_RES4, + FR_ACT_BLACKHOLE, /* Drop without notification */ + FR_ACT_UNREACHABLE, /* Drop with ENETUNREACH */ + FR_ACT_PROHIBIT, /* Drop with EACCES */ + __FR_ACT_MAX, +}; + +#define FR_ACT_MAX (__FR_ACT_MAX - 1) + +#endif diff --git a/src/basic/linux/fou.h b/src/basic/linux/fou.h new file mode 100644 index 00000000000..f2ea833a281 --- /dev/null +++ b/src/basic/linux/fou.h @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* fou.h - FOU Interface */ + +#ifndef _UAPI_LINUX_FOU_H +#define _UAPI_LINUX_FOU_H + +/* NETLINK_GENERIC related info + */ +#define FOU_GENL_NAME "fou" +#define FOU_GENL_VERSION 0x1 + +enum { + FOU_ATTR_UNSPEC, + FOU_ATTR_PORT, /* u16 */ + FOU_ATTR_AF, /* u8 */ + FOU_ATTR_IPPROTO, /* u8 */ + FOU_ATTR_TYPE, /* u8 */ + FOU_ATTR_REMCSUM_NOPARTIAL, /* flag */ + + __FOU_ATTR_MAX, +}; + +#define FOU_ATTR_MAX (__FOU_ATTR_MAX - 1) + +enum { + FOU_CMD_UNSPEC, + FOU_CMD_ADD, + FOU_CMD_DEL, + FOU_CMD_GET, + + __FOU_CMD_MAX, +}; + +enum { + FOU_ENCAP_UNSPEC, + FOU_ENCAP_DIRECT, + FOU_ENCAP_GUE, +}; + +#define FOU_CMD_MAX (__FOU_CMD_MAX - 1) + +#endif /* _UAPI_LINUX_FOU_H */ diff --git a/src/basic/linux/if.h b/src/basic/linux/if.h new file mode 100644 index 00000000000..cbabdde8f9d --- /dev/null +++ b/src/basic/linux/if.h @@ -0,0 +1,294 @@ +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ +/* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket + * interface as the means of communication with the user level. + * + * Global definitions for the INET interface module. + * + * Version: @(#)if.h 1.0.2 04/18/93 + * + * Authors: Original taken from Berkeley UNIX 4.3, (c) UCB 1982-1988 + * Ross Biro + * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ +#ifndef _LINUX_IF_H +#define _LINUX_IF_H + +#include <linux/libc-compat.h> /* for compatibility with glibc */ +#include <linux/types.h> /* for "__kernel_caddr_t" et al */ +#include <linux/socket.h> /* for "struct sockaddr" et al */ + +#ifndef __KERNEL__ +#include <sys/socket.h> /* for struct sockaddr. */ +#endif + +#if __UAPI_DEF_IF_IFNAMSIZ +#define IFNAMSIZ 16 +#endif /* __UAPI_DEF_IF_IFNAMSIZ */ +#define IFALIASZ 256 +#include <linux/hdlc/ioctl.h> + +/* For glibc compatibility. An empty enum does not compile. */ +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || \ + __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 +/** + * enum net_device_flags - &struct net_device flags + * + * These are the &struct net_device flags, they can be set by drivers, the + * kernel and some can be triggered by userspace. Userspace can query and + * set these flags using userspace utilities but there is also a sysfs + * entry available for all dev flags which can be queried and set. These flags + * are shared for all types of net_devices. The sysfs entries are available + * via /sys/class/net/<dev>/flags. Flags which can be toggled through sysfs + * are annotated below, note that only a few flags can be toggled and some + * other flags are always preserved from the original net_device flags + * even if you try to set them via sysfs. Flags which are always preserved + * are kept under the flag grouping @IFF_VOLATILE. Flags which are volatile + * are annotated below as such. + * + * You should have a pretty good reason to be extending these flags. + * + * @IFF_UP: interface is up. Can be toggled through sysfs. + * @IFF_BROADCAST: broadcast address valid. Volatile. + * @IFF_DEBUG: turn on debugging. Can be toggled through sysfs. + * @IFF_LOOPBACK: is a loopback net. Volatile. + * @IFF_POINTOPOINT: interface is has p-p link. Volatile. + * @IFF_NOTRAILERS: avoid use of trailers. Can be toggled through sysfs. + * Volatile. + * @IFF_RUNNING: interface RFC2863 OPER_UP. Volatile. + * @IFF_NOARP: no ARP protocol. Can be toggled through sysfs. Volatile. + * @IFF_PROMISC: receive all packets. Can be toggled through sysfs. + * @IFF_ALLMULTI: receive all multicast packets. Can be toggled through + * sysfs. + * @IFF_MASTER: master of a load balancer. Volatile. + * @IFF_SLAVE: slave of a load balancer. Volatile. + * @IFF_MULTICAST: Supports multicast. Can be toggled through sysfs. + * @IFF_PORTSEL: can set media type. Can be toggled through sysfs. + * @IFF_AUTOMEDIA: auto media select active. Can be toggled through sysfs. + * @IFF_DYNAMIC: dialup device with changing addresses. Can be toggled + * through sysfs. + * @IFF_LOWER_UP: driver signals L1 up. Volatile. + * @IFF_DORMANT: driver signals dormant. Volatile. + * @IFF_ECHO: echo sent packets. Volatile. + */ +enum net_device_flags { +/* for compatibility with glibc net/if.h */ +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS + IFF_UP = 1<<0, /* sysfs */ + IFF_BROADCAST = 1<<1, /* volatile */ + IFF_DEBUG = 1<<2, /* sysfs */ + IFF_LOOPBACK = 1<<3, /* volatile */ + IFF_POINTOPOINT = 1<<4, /* volatile */ + IFF_NOTRAILERS = 1<<5, /* sysfs */ + IFF_RUNNING = 1<<6, /* volatile */ + IFF_NOARP = 1<<7, /* sysfs */ + IFF_PROMISC = 1<<8, /* sysfs */ + IFF_ALLMULTI = 1<<9, /* sysfs */ + IFF_MASTER = 1<<10, /* volatile */ + IFF_SLAVE = 1<<11, /* volatile */ + IFF_MULTICAST = 1<<12, /* sysfs */ + IFF_PORTSEL = 1<<13, /* sysfs */ + IFF_AUTOMEDIA = 1<<14, /* sysfs */ + IFF_DYNAMIC = 1<<15, /* sysfs */ +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */ +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO + IFF_LOWER_UP = 1<<16, /* volatile */ + IFF_DORMANT = 1<<17, /* volatile */ + IFF_ECHO = 1<<18, /* volatile */ +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ +}; +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 */ + +/* for compatibility with glibc net/if.h */ +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS +#define IFF_UP IFF_UP +#define IFF_BROADCAST IFF_BROADCAST +#define IFF_DEBUG IFF_DEBUG +#define IFF_LOOPBACK IFF_LOOPBACK +#define IFF_POINTOPOINT IFF_POINTOPOINT +#define IFF_NOTRAILERS IFF_NOTRAILERS +#define IFF_RUNNING IFF_RUNNING +#define IFF_NOARP IFF_NOARP +#define IFF_PROMISC IFF_PROMISC +#define IFF_ALLMULTI IFF_ALLMULTI +#define IFF_MASTER IFF_MASTER +#define IFF_SLAVE IFF_SLAVE +#define IFF_MULTICAST IFF_MULTICAST +#define IFF_PORTSEL IFF_PORTSEL +#define IFF_AUTOMEDIA IFF_AUTOMEDIA +#define IFF_DYNAMIC IFF_DYNAMIC +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */ + +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO +#define IFF_LOWER_UP IFF_LOWER_UP +#define IFF_DORMANT IFF_DORMANT +#define IFF_ECHO IFF_ECHO +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ + +#define IFF_VOLATILE (IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_ECHO|\ + IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT) + +#define IF_GET_IFACE 0x0001 /* for querying only */ +#define IF_GET_PROTO 0x0002 + +/* For definitions see hdlc.h */ +#define IF_IFACE_V35 0x1000 /* V.35 serial interface */ +#define IF_IFACE_V24 0x1001 /* V.24 serial interface */ +#define IF_IFACE_X21 0x1002 /* X.21 serial interface */ +#define IF_IFACE_T1 0x1003 /* T1 telco serial interface */ +#define IF_IFACE_E1 0x1004 /* E1 telco serial interface */ +#define IF_IFACE_SYNC_SERIAL 0x1005 /* can't be set by software */ +#define IF_IFACE_X21D 0x1006 /* X.21 Dual Clocking (FarSite) */ + +/* For definitions see hdlc.h */ +#define IF_PROTO_HDLC 0x2000 /* raw HDLC protocol */ +#define IF_PROTO_PPP 0x2001 /* PPP protocol */ +#define IF_PROTO_CISCO 0x2002 /* Cisco HDLC protocol */ +#define IF_PROTO_FR 0x2003 /* Frame Relay protocol */ +#define IF_PROTO_FR_ADD_PVC 0x2004 /* Create FR PVC */ +#define IF_PROTO_FR_DEL_PVC 0x2005 /* Delete FR PVC */ +#define IF_PROTO_X25 0x2006 /* X.25 */ +#define IF_PROTO_HDLC_ETH 0x2007 /* raw HDLC, Ethernet emulation */ +#define IF_PROTO_FR_ADD_ETH_PVC 0x2008 /* Create FR Ethernet-bridged PVC */ +#define IF_PROTO_FR_DEL_ETH_PVC 0x2009 /* Delete FR Ethernet-bridged PVC */ +#define IF_PROTO_FR_PVC 0x200A /* for reading PVC status */ +#define IF_PROTO_FR_ETH_PVC 0x200B +#define IF_PROTO_RAW 0x200C /* RAW Socket */ + +/* RFC 2863 operational status */ +enum { + IF_OPER_UNKNOWN, + IF_OPER_NOTPRESENT, + IF_OPER_DOWN, + IF_OPER_LOWERLAYERDOWN, + IF_OPER_TESTING, + IF_OPER_DORMANT, + IF_OPER_UP, +}; + +/* link modes */ +enum { + IF_LINK_MODE_DEFAULT, + IF_LINK_MODE_DORMANT, /* limit upward transition to dormant */ +}; + +/* + * Device mapping structure. I'd just gone off and designed a + * beautiful scheme using only loadable modules with arguments + * for driver options and along come the PCMCIA people 8) + * + * Ah well. The get() side of this is good for WDSETUP, and it'll + * be handy for debugging things. The set side is fine for now and + * being very small might be worth keeping for clean configuration. + */ + +/* for compatibility with glibc net/if.h */ +#if __UAPI_DEF_IF_IFMAP +struct ifmap { + unsigned long mem_start; + unsigned long mem_end; + unsigned short base_addr; + unsigned char irq; + unsigned char dma; + unsigned char port; + /* 3 bytes spare */ +}; +#endif /* __UAPI_DEF_IF_IFMAP */ + +struct if_settings { + unsigned int type; /* Type of physical device or protocol */ + unsigned int size; /* Size of the data allocated by the caller */ + union { + /* {atm/eth/dsl}_settings anyone ? */ + raw_hdlc_proto *raw_hdlc; + cisco_proto *cisco; + fr_proto *fr; + fr_proto_pvc *fr_pvc; + fr_proto_pvc_info *fr_pvc_info; + + /* interface settings */ + sync_serial_settings *sync; + te1_settings *te1; + } ifs_ifsu; +}; + +/* + * Interface request structure used for socket + * ioctl's. All interface ioctl's must have parameter + * definitions which begin with ifr_name. The + * remainder may be interface specific. + */ + +/* for compatibility with glibc net/if.h */ +#if __UAPI_DEF_IF_IFREQ +struct ifreq { +#define IFHWADDRLEN 6 + union + { + char ifrn_name[IFNAMSIZ]; /* if name, e.g. "en0" */ + } ifr_ifrn; + + union { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + struct sockaddr ifru_netmask; + struct sockaddr ifru_hwaddr; + short ifru_flags; + int ifru_ivalue; + int ifru_mtu; + struct ifmap ifru_map; + char ifru_slave[IFNAMSIZ]; /* Just fits the size */ + char ifru_newname[IFNAMSIZ]; + void * ifru_data; + struct if_settings ifru_settings; + } ifr_ifru; +}; +#endif /* __UAPI_DEF_IF_IFREQ */ + +#define ifr_name ifr_ifrn.ifrn_name /* interface name */ +#define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */ +#define ifr_addr ifr_ifru.ifru_addr /* address */ +#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */ +#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ +#define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */ +#define ifr_flags ifr_ifru.ifru_flags /* flags */ +#define ifr_metric ifr_ifru.ifru_ivalue /* metric */ +#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ +#define ifr_map ifr_ifru.ifru_map /* device map */ +#define ifr_slave ifr_ifru.ifru_slave /* slave device */ +#define ifr_data ifr_ifru.ifru_data /* for use by interface */ +#define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */ +#define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth */ +#define ifr_qlen ifr_ifru.ifru_ivalue /* Queue length */ +#define ifr_newname ifr_ifru.ifru_newname /* New name */ +#define ifr_settings ifr_ifru.ifru_settings /* Device/proto settings*/ + +/* + * Structure used in SIOCGIFCONF request. + * Used to retrieve interface configuration + * for machine (useful for programs which + * must know all networks accessible). + */ + +/* for compatibility with glibc net/if.h */ +#if __UAPI_DEF_IF_IFCONF +struct ifconf { + int ifc_len; /* size of buffer */ + union { + char *ifcu_buf; + struct ifreq *ifcu_req; + } ifc_ifcu; +}; +#endif /* __UAPI_DEF_IF_IFCONF */ + +#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ +#define ifc_req ifc_ifcu.ifcu_req /* array of structures */ + +#endif /* _LINUX_IF_H */ diff --git a/src/basic/linux/if_addr.h b/src/basic/linux/if_addr.h new file mode 100644 index 00000000000..dfcf3ce0097 --- /dev/null +++ b/src/basic/linux/if_addr.h @@ -0,0 +1,72 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef __LINUX_IF_ADDR_H +#define __LINUX_IF_ADDR_H + +#include <linux/types.h> +#include <linux/netlink.h> + +struct ifaddrmsg { + __u8 ifa_family; + __u8 ifa_prefixlen; /* The prefix length */ + __u8 ifa_flags; /* Flags */ + __u8 ifa_scope; /* Address scope */ + __u32 ifa_index; /* Link index */ +}; + +/* + * Important comment: + * IFA_ADDRESS is prefix address, rather than local interface address. + * It makes no difference for normally configured broadcast interfaces, + * but for point-to-point IFA_ADDRESS is DESTINATION address, + * local address is supplied in IFA_LOCAL attribute. + * + * IFA_FLAGS is a u32 attribute that extends the u8 field ifa_flags. + * If present, the value from struct ifaddrmsg will be ignored. + */ +enum { + IFA_UNSPEC, + IFA_ADDRESS, + IFA_LOCAL, + IFA_LABEL, + IFA_BROADCAST, + IFA_ANYCAST, + IFA_CACHEINFO, + IFA_MULTICAST, + IFA_FLAGS, + IFA_RT_PRIORITY, /* u32, priority/metric for prefix route */ + IFA_TARGET_NETNSID, + __IFA_MAX, +}; + +#define IFA_MAX (__IFA_MAX - 1) + +/* ifa_flags */ +#define IFA_F_SECONDARY 0x01 +#define IFA_F_TEMPORARY IFA_F_SECONDARY + +#define IFA_F_NODAD 0x02 +#define IFA_F_OPTIMISTIC 0x04 +#define IFA_F_DADFAILED 0x08 +#define IFA_F_HOMEADDRESS 0x10 +#define IFA_F_DEPRECATED 0x20 +#define IFA_F_TENTATIVE 0x40 +#define IFA_F_PERMANENT 0x80 +#define IFA_F_MANAGETEMPADDR 0x100 +#define IFA_F_NOPREFIXROUTE 0x200 +#define IFA_F_MCAUTOJOIN 0x400 +#define IFA_F_STABLE_PRIVACY 0x800 + +struct ifa_cacheinfo { + __u32 ifa_prefered; + __u32 ifa_valid; + __u32 cstamp; /* created timestamp, hundredths of seconds */ + __u32 tstamp; /* updated timestamp, hundredths of seconds */ +}; + +/* backwards compatibility for userspace */ +#ifndef __KERNEL__ +#define IFA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg)))) +#define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg)) +#endif + +#endif diff --git a/src/basic/linux/if_arp.h b/src/basic/linux/if_arp.h new file mode 100644 index 00000000000..c3cc5a9e5ea --- /dev/null +++ b/src/basic/linux/if_arp.h @@ -0,0 +1,164 @@ +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ +/* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket + * interface as the means of communication with the user level. + * + * Global definitions for the ARP (RFC 826) protocol. + * + * Version: @(#)if_arp.h 1.0.1 04/16/93 + * + * Authors: Original taken from Berkeley UNIX 4.3, (c) UCB 1986-1988 + * Portions taken from the KA9Q/NOS (v2.00m PA0GRI) source. + * Ross Biro + * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> + * Florian La Roche, + * Jonathan Layes <layes@loran.com> + * Arnaldo Carvalho de Melo <acme@conectiva.com.br> ARPHRD_HWX25 + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ +#ifndef _UAPI_LINUX_IF_ARP_H +#define _UAPI_LINUX_IF_ARP_H + +#include <linux/netdevice.h> + +/* ARP protocol HARDWARE identifiers. */ +#define ARPHRD_NETROM 0 /* from KA9Q: NET/ROM pseudo */ +#define ARPHRD_ETHER 1 /* Ethernet 10Mbps */ +#define ARPHRD_EETHER 2 /* Experimental Ethernet */ +#define ARPHRD_AX25 3 /* AX.25 Level 2 */ +#define ARPHRD_PRONET 4 /* PROnet token ring */ +#define ARPHRD_CHAOS 5 /* Chaosnet */ +#define ARPHRD_IEEE802 6 /* IEEE 802.2 Ethernet/TR/TB */ +#define ARPHRD_ARCNET 7 /* ARCnet */ +#define ARPHRD_APPLETLK 8 /* APPLEtalk */ +#define ARPHRD_DLCI 15 /* Frame Relay DLCI */ +#define ARPHRD_ATM 19 /* ATM */ +#define ARPHRD_METRICOM 23 /* Metricom STRIP (new IANA id) */ +#define ARPHRD_IEEE1394 24 /* IEEE 1394 IPv4 - RFC 2734 */ +#define ARPHRD_EUI64 27 /* EUI-64 */ +#define ARPHRD_INFINIBAND 32 /* InfiniBand */ + +/* Dummy types for non ARP hardware */ +#define ARPHRD_SLIP 256 +#define ARPHRD_CSLIP 257 +#define ARPHRD_SLIP6 258 +#define ARPHRD_CSLIP6 259 +#define ARPHRD_RSRVD 260 /* Notional KISS type */ +#define ARPHRD_ADAPT 264 +#define ARPHRD_ROSE 270 +#define ARPHRD_X25 271 /* CCITT X.25 */ +#define ARPHRD_HWX25 272 /* Boards with X.25 in firmware */ +#define ARPHRD_CAN 280 /* Controller Area Network */ +#define ARPHRD_PPP 512 +#define ARPHRD_CISCO 513 /* Cisco HDLC */ +#define ARPHRD_HDLC ARPHRD_CISCO +#define ARPHRD_LAPB 516 /* LAPB */ +#define ARPHRD_DDCMP 517 /* Digital's DDCMP protocol */ +#define ARPHRD_RAWHDLC 518 /* Raw HDLC */ +#define ARPHRD_RAWIP 519 /* Raw IP */ + +#define ARPHRD_TUNNEL 768 /* IPIP tunnel */ +#define ARPHRD_TUNNEL6 769 /* IP6IP6 tunnel */ +#define ARPHRD_FRAD 770 /* Frame Relay Access Device */ +#define ARPHRD_SKIP 771 /* SKIP vif */ +#define ARPHRD_LOOPBACK 772 /* Loopback device */ +#define ARPHRD_LOCALTLK 773 /* Localtalk device */ +#define ARPHRD_FDDI 774 /* Fiber Distributed Data Interface */ +#define ARPHRD_BIF 775 /* AP1000 BIF */ +#define ARPHRD_SIT 776 /* sit0 device - IPv6-in-IPv4 */ +#define ARPHRD_IPDDP 777 /* IP over DDP tunneller */ +#define ARPHRD_IPGRE 778 /* GRE over IP */ +#define ARPHRD_PIMREG 779 /* PIMSM register interface */ +#define ARPHRD_HIPPI 780 /* High Performance Parallel Interface */ +#define ARPHRD_ASH 781 /* Nexus 64Mbps Ash */ +#define ARPHRD_ECONET 782 /* Acorn Econet */ +#define ARPHRD_IRDA 783 /* Linux-IrDA */ +/* ARP works differently on different FC media .. so */ +#define ARPHRD_FCPP 784 /* Point to point fibrechannel */ +#define ARPHRD_FCAL 785 /* Fibrechannel arbitrated loop */ +#define ARPHRD_FCPL 786 /* Fibrechannel public loop */ +#define ARPHRD_FCFABRIC 787 /* Fibrechannel fabric */ + /* 787->799 reserved for fibrechannel media types */ +#define ARPHRD_IEEE802_TR 800 /* Magic type ident for TR */ +#define ARPHRD_IEEE80211 801 /* IEEE 802.11 */ +#define ARPHRD_IEEE80211_PRISM 802 /* IEEE 802.11 + Prism2 header */ +#define ARPHRD_IEEE80211_RADIOTAP 803 /* IEEE 802.11 + radiotap header */ +#define ARPHRD_IEEE802154 804 +#define ARPHRD_IEEE802154_MONITOR 805 /* IEEE 802.15.4 network monitor */ + +#define ARPHRD_PHONET 820 /* PhoNet media type */ +#define ARPHRD_PHONET_PIPE 821 /* PhoNet pipe header */ +#define ARPHRD_CAIF 822 /* CAIF media type */ +#define ARPHRD_IP6GRE 823 /* GRE over IPv6 */ +#define ARPHRD_NETLINK 824 /* Netlink header */ +#define ARPHRD_6LOWPAN 825 /* IPv6 over LoWPAN */ +#define ARPHRD_VSOCKMON 826 /* Vsock monitor header */ + +#define ARPHRD_VOID 0xFFFF /* Void type, nothing is known */ +#define ARPHRD_NONE 0xFFFE /* zero header length */ + +/* ARP protocol opcodes. */ +#define ARPOP_REQUEST 1 /* ARP request */ +#define ARPOP_REPLY 2 /* ARP reply */ +#define ARPOP_RREQUEST 3 /* RARP request */ +#define ARPOP_RREPLY 4 /* RARP reply */ +#define ARPOP_InREQUEST 8 /* InARP request */ +#define ARPOP_InREPLY 9 /* InARP reply */ +#define ARPOP_NAK 10 /* (ATM)ARP NAK */ + + +/* ARP ioctl request. */ +struct arpreq { + struct sockaddr arp_pa; /* protocol address */ + struct sockaddr arp_ha; /* hardware address */ + int arp_flags; /* flags */ + struct sockaddr arp_netmask; /* netmask (only for proxy arps) */ + char arp_dev[IFNAMSIZ]; +}; + +struct arpreq_old { + struct sockaddr arp_pa; /* protocol address */ + struct sockaddr arp_ha; /* hardware address */ + int arp_flags; /* flags */ + struct sockaddr arp_netmask; /* netmask (only for proxy arps) */ +}; + +/* ARP Flag values. */ +#define ATF_COM 0x02 /* completed entry (ha valid) */ +#define ATF_PERM 0x04 /* permanent entry */ +#define ATF_PUBL 0x08 /* publish entry */ +#define ATF_USETRAILERS 0x10 /* has requested trailers */ +#define ATF_NETMASK 0x20 /* want to use a netmask (only + for proxy entries) */ +#define ATF_DONTPUB 0x40 /* don't answer this addresses */ + +/* + * This structure defines an ethernet arp header. + */ + +struct arphdr { + __be16 ar_hrd; /* format of hardware address */ + __be16 ar_pro; /* format of protocol address */ + unsigned char ar_hln; /* length of hardware address */ + unsigned char ar_pln; /* length of protocol address */ + __be16 ar_op; /* ARP opcode (command) */ + +#if 0 + /* + * Ethernet looks like this : This bit is variable sized however... + */ + unsigned char ar_sha[ETH_ALEN]; /* sender hardware address */ + unsigned char ar_sip[4]; /* sender IP address */ + unsigned char ar_tha[ETH_ALEN]; /* target hardware address */ + unsigned char ar_tip[4]; /* target IP address */ +#endif + +}; + + +#endif /* _UAPI_LINUX_IF_ARP_H */ diff --git a/src/basic/linux/if_bonding.h b/src/basic/linux/if_bonding.h new file mode 100644 index 00000000000..61a1bf6e865 --- /dev/null +++ b/src/basic/linux/if_bonding.h @@ -0,0 +1,131 @@ +/* SPDX-License-Identifier: GPL-1.0+ WITH Linux-syscall-note */ +/* + * Bond several ethernet interfaces into a Cisco, running 'Etherchannel'. + * + * + * Portions are (c) Copyright 1995 Simon "Guru Aleph-Null" Janes + * NCM: Network and Communications Management, Inc. + * + * BUT, I'm the one who modified it for ethernet, so: + * (c) Copyright 1999, Thomas Davis, tadavis@lbl.gov + * + * This software may be used and distributed according to the terms + * of the GNU Public License, incorporated herein by reference. + * + * 2003/03/18 - Amir Noam <amir.noam at intel dot com> + * - Added support for getting slave's speed and duplex via ethtool. + * Needed for 802.3ad and other future modes. + * + * 2003/03/18 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and + * Shmulik Hen <shmulik.hen at intel dot com> + * - Enable support of modes that need to use the unique mac address of + * each slave. + * + * 2003/03/18 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and + * Amir Noam <amir.noam at intel dot com> + * - Moved driver's private data types to bonding.h + * + * 2003/03/18 - Amir Noam <amir.noam at intel dot com>, + * Tsippy Mendelson <tsippy.mendelson at intel dot com> and + * Shmulik Hen <shmulik.hen at intel dot com> + * - Added support for IEEE 802.3ad Dynamic link aggregation mode. + * + * 2003/05/01 - Amir Noam <amir.noam at intel dot com> + * - Added ABI version control to restore compatibility between + * new/old ifenslave and new/old bonding. + * + * 2003/12/01 - Shmulik Hen <shmulik.hen at intel dot com> + * - Code cleanup and style changes + * + * 2005/05/05 - Jason Gabler <jygabler at lbl dot gov> + * - added definitions for various XOR hashing policies + */ + +#ifndef _LINUX_IF_BONDING_H +#define _LINUX_IF_BONDING_H + +#include <linux/if.h> +#include <linux/types.h> +#include <linux/if_ether.h> + +/* userland - kernel ABI version (2003/05/08) */ +#define BOND_ABI_VERSION 2 + +/* + * We can remove these ioctl definitions in 2.5. People should use the + * SIOC*** versions of them instead + */ +#define BOND_ENSLAVE_OLD (SIOCDEVPRIVATE) +#define BOND_RELEASE_OLD (SIOCDEVPRIVATE + 1) +#define BOND_SETHWADDR_OLD (SIOCDEVPRIVATE + 2) +#define BOND_SLAVE_INFO_QUERY_OLD (SIOCDEVPRIVATE + 11) +#define BOND_INFO_QUERY_OLD (SIOCDEVPRIVATE + 12) +#define BOND_CHANGE_ACTIVE_OLD (SIOCDEVPRIVATE + 13) + +#define BOND_CHECK_MII_STATUS (SIOCGMIIPHY) + +#define BOND_MODE_ROUNDROBIN 0 +#define BOND_MODE_ACTIVEBACKUP 1 +#define BOND_MODE_XOR 2 +#define BOND_MODE_BROADCAST 3 +#define BOND_MODE_8023AD 4 +#define BOND_MODE_TLB 5 +#define BOND_MODE_ALB 6 /* TLB + RLB (receive load balancing) */ + +/* each slave's link has 4 states */ +#define BOND_LINK_UP 0 /* link is up and running */ +#define BOND_LINK_FAIL 1 /* link has just gone down */ +#define BOND_LINK_DOWN 2 /* link has been down for too long time */ +#define BOND_LINK_BACK 3 /* link is going back */ + +/* each slave has several states */ +#define BOND_STATE_ACTIVE 0 /* link is active */ +#define BOND_STATE_BACKUP 1 /* link is backup */ + +#define BOND_DEFAULT_MAX_BONDS 1 /* Default maximum number of devices to support */ + +#define BOND_DEFAULT_TX_QUEUES 16 /* Default number of tx queues per device */ + +#define BOND_DEFAULT_RESEND_IGMP 1 /* Default number of IGMP membership reports */ + +/* hashing types */ +#define BOND_XMIT_POLICY_LAYER2 0 /* layer 2 (MAC only), default */ +#define BOND_XMIT_POLICY_LAYER34 1 /* layer 3+4 (IP ^ (TCP || UDP)) */ +#define BOND_XMIT_POLICY_LAYER23 2 /* layer 2+3 (IP ^ MAC) */ +#define BOND_XMIT_POLICY_ENCAP23 3 /* encapsulated layer 2+3 */ +#define BOND_XMIT_POLICY_ENCAP34 4 /* encapsulated layer 3+4 */ + +typedef struct ifbond { + __s32 bond_mode; + __s32 num_slaves; + __s32 miimon; +} ifbond; + +typedef struct ifslave { + __s32 slave_id; /* Used as an IN param to the BOND_SLAVE_INFO_QUERY ioctl */ + char slave_name[IFNAMSIZ]; + __s8 link; + __s8 state; + __u32 link_failure_count; +} ifslave; + +struct ad_info { + __u16 aggregator_id; + __u16 ports; + __u16 actor_key; + __u16 partner_key; + __u8 partner_system[ETH_ALEN]; +}; + +#endif /* _LINUX_IF_BONDING_H */ + +/* + * Local variables: + * version-control: t + * kept-new-versions: 5 + * c-indent-level: 8 + * c-basic-offset: 8 + * tab-width: 8 + * End: + */ + diff --git a/src/basic/linux/if_bridge.h b/src/basic/linux/if_bridge.h new file mode 100644 index 00000000000..773e476a8e5 --- /dev/null +++ b/src/basic/linux/if_bridge.h @@ -0,0 +1,316 @@ +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ +/* + * Linux ethernet bridge + * + * Authors: + * Lennert Buytenhek <buytenh@gnu.org> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#ifndef _UAPI_LINUX_IF_BRIDGE_H +#define _UAPI_LINUX_IF_BRIDGE_H + +#include <linux/types.h> +#include <linux/if_ether.h> +#include <linux/in6.h> + +#define SYSFS_BRIDGE_ATTR "bridge" +#define SYSFS_BRIDGE_FDB "brforward" +#define SYSFS_BRIDGE_PORT_SUBDIR "brif" +#define SYSFS_BRIDGE_PORT_ATTR "brport" +#define SYSFS_BRIDGE_PORT_LINK "bridge" + +#define BRCTL_VERSION 1 + +#define BRCTL_GET_VERSION 0 +#define BRCTL_GET_BRIDGES 1 +#define BRCTL_ADD_BRIDGE 2 +#define BRCTL_DEL_BRIDGE 3 +#define BRCTL_ADD_IF 4 +#define BRCTL_DEL_IF 5 +#define BRCTL_GET_BRIDGE_INFO 6 +#define BRCTL_GET_PORT_LIST 7 +#define BRCTL_SET_BRIDGE_FORWARD_DELAY 8 +#define BRCTL_SET_BRIDGE_HELLO_TIME 9 +#define BRCTL_SET_BRIDGE_MAX_AGE 10 +#define BRCTL_SET_AGEING_TIME 11 +#define BRCTL_SET_GC_INTERVAL 12 +#define BRCTL_GET_PORT_INFO 13 +#define BRCTL_SET_BRIDGE_STP_STATE 14 +#define BRCTL_SET_BRIDGE_PRIORITY 15 +#define BRCTL_SET_PORT_PRIORITY 16 +#define BRCTL_SET_PATH_COST 17 +#define BRCTL_GET_FDB_ENTRIES 18 + +#define BR_STATE_DISABLED 0 +#define BR_STATE_LISTENING 1 +#define BR_STATE_LEARNING 2 +#define BR_STATE_FORWARDING 3 +#define BR_STATE_BLOCKING 4 + +struct __bridge_info { + __u64 designated_root; + __u64 bridge_id; + __u32 root_path_cost; + __u32 max_age; + __u32 hello_time; + __u32 forward_delay; + __u32 bridge_max_age; + __u32 bridge_hello_time; + __u32 bridge_forward_delay; + __u8 topology_change; + __u8 topology_change_detected; + __u8 root_port; + __u8 stp_enabled; + __u32 ageing_time; + __u32 gc_interval; + __u32 hello_timer_value; + __u32 tcn_timer_value; + __u32 topology_change_timer_value; + __u32 gc_timer_value; +}; + +struct __port_info { + __u64 designated_root; + __u64 designated_bridge; + __u16 port_id; + __u16 designated_port; + __u32 path_cost; + __u32 designated_cost; + __u8 state; + __u8 top_change_ack; + __u8 config_pending; + __u8 unused0; + __u32 message_age_timer_value; + __u32 forward_delay_timer_value; + __u32 hold_timer_value; +}; + +struct __fdb_entry { + __u8 mac_addr[ETH_ALEN]; + __u8 port_no; + __u8 is_local; + __u32 ageing_timer_value; + __u8 port_hi; + __u8 pad0; + __u16 unused; +}; + +/* Bridge Flags */ +#define BRIDGE_FLAGS_MASTER 1 /* Bridge command to/from master */ +#define BRIDGE_FLAGS_SELF 2 /* Bridge command to/from lowerdev */ + +#define BRIDGE_MODE_VEB 0 /* Default loopback mode */ +#define BRIDGE_MODE_VEPA 1 /* 802.1Qbg defined VEPA mode */ +#define BRIDGE_MODE_UNDEF 0xFFFF /* mode undefined */ + +/* Bridge management nested attributes + * [IFLA_AF_SPEC] = { + * [IFLA_BRIDGE_FLAGS] + * [IFLA_BRIDGE_MODE] + * [IFLA_BRIDGE_VLAN_INFO] + * } + */ +enum { + IFLA_BRIDGE_FLAGS, + IFLA_BRIDGE_MODE, + IFLA_BRIDGE_VLAN_INFO, + IFLA_BRIDGE_VLAN_TUNNEL_INFO, + __IFLA_BRIDGE_MAX, +}; +#define IFLA_BRIDGE_MAX (__IFLA_BRIDGE_MAX - 1) + +#define BRIDGE_VLAN_INFO_MASTER (1<<0) /* Operate on Bridge device as well */ +#define BRIDGE_VLAN_INFO_PVID (1<<1) /* VLAN is PVID, ingress untagged */ +#define BRIDGE_VLAN_INFO_UNTAGGED (1<<2) /* VLAN egresses untagged */ +#define BRIDGE_VLAN_INFO_RANGE_BEGIN (1<<3) /* VLAN is start of vlan range */ +#define BRIDGE_VLAN_INFO_RANGE_END (1<<4) /* VLAN is end of vlan range */ +#define BRIDGE_VLAN_INFO_BRENTRY (1<<5) /* Global bridge VLAN entry */ + +struct bridge_vlan_info { + __u16 flags; + __u16 vid; +}; + +enum { + IFLA_BRIDGE_VLAN_TUNNEL_UNSPEC, + IFLA_BRIDGE_VLAN_TUNNEL_ID, + IFLA_BRIDGE_VLAN_TUNNEL_VID, + IFLA_BRIDGE_VLAN_TUNNEL_FLAGS, + __IFLA_BRIDGE_VLAN_TUNNEL_MAX, +}; + +#define IFLA_BRIDGE_VLAN_TUNNEL_MAX (__IFLA_BRIDGE_VLAN_TUNNEL_MAX - 1) + +struct bridge_vlan_xstats { + __u64 rx_bytes; + __u64 rx_packets; + __u64 tx_bytes; + __u64 tx_packets; + __u16 vid; + __u16 flags; + __u32 pad2; +}; + +/* Bridge multicast database attributes + * [MDBA_MDB] = { + * [MDBA_MDB_ENTRY] = { + * [MDBA_MDB_ENTRY_INFO] { + * struct br_mdb_entry + * [MDBA_MDB_EATTR attributes] + * } + * } + * } + * [MDBA_ROUTER] = { + * [MDBA_ROUTER_PORT] = { + * u32 ifindex + * [MDBA_ROUTER_PATTR attributes] + * } + * } + */ +enum { + MDBA_UNSPEC, + MDBA_MDB, + MDBA_ROUTER, + __MDBA_MAX, +}; +#define MDBA_MAX (__MDBA_MAX - 1) + +enum { + MDBA_MDB_UNSPEC, + MDBA_MDB_ENTRY, + __MDBA_MDB_MAX, +}; +#define MDBA_MDB_MAX (__MDBA_MDB_MAX - 1) + +enum { + MDBA_MDB_ENTRY_UNSPEC, + MDBA_MDB_ENTRY_INFO, + __MDBA_MDB_ENTRY_MAX, +}; +#define MDBA_MDB_ENTRY_MAX (__MDBA_MDB_ENTRY_MAX - 1) + +/* per mdb entry additional attributes */ +enum { + MDBA_MDB_EATTR_UNSPEC, + MDBA_MDB_EATTR_TIMER, + __MDBA_MDB_EATTR_MAX +}; +#define MDBA_MDB_EATTR_MAX (__MDBA_MDB_EATTR_MAX - 1) + +/* multicast router types */ +enum { + MDB_RTR_TYPE_DISABLED, + MDB_RTR_TYPE_TEMP_QUERY, + MDB_RTR_TYPE_PERM, + MDB_RTR_TYPE_TEMP +}; + +enum { + MDBA_ROUTER_UNSPEC, + MDBA_ROUTER_PORT, + __MDBA_ROUTER_MAX, +}; +#define MDBA_ROUTER_MAX (__MDBA_ROUTER_MAX - 1) + +/* router port attributes */ +enum { + MDBA_ROUTER_PATTR_UNSPEC, + MDBA_ROUTER_PATTR_TIMER, + MDBA_ROUTER_PATTR_TYPE, + __MDBA_ROUTER_PATTR_MAX +}; +#define MDBA_ROUTER_PATTR_MAX (__MDBA_ROUTER_PATTR_MAX - 1) + +struct br_port_msg { + __u8 family; + __u32 ifindex; +}; + +struct br_mdb_entry { + __u32 ifindex; +#define MDB_TEMPORARY 0 +#define MDB_PERMANENT 1 + __u8 state; +#define MDB_FLAGS_OFFLOAD (1 << 0) + __u8 flags; + __u16 vid; + struct { + union { + __be32 ip4; + struct in6_addr ip6; + } u; + __be16 proto; + } addr; +}; + +enum { + MDBA_SET_ENTRY_UNSPEC, + MDBA_SET_ENTRY, + __MDBA_SET_ENTRY_MAX, +}; +#define MDBA_SET_ENTRY_MAX (__MDBA_SET_ENTRY_MAX - 1) + +/* Embedded inside LINK_XSTATS_TYPE_BRIDGE */ +enum { + BRIDGE_XSTATS_UNSPEC, + BRIDGE_XSTATS_VLAN, + BRIDGE_XSTATS_MCAST, + BRIDGE_XSTATS_PAD, + __BRIDGE_XSTATS_MAX +}; +#define BRIDGE_XSTATS_MAX (__BRIDGE_XSTATS_MAX - 1) + +enum { + BR_MCAST_DIR_RX, + BR_MCAST_DIR_TX, + BR_MCAST_DIR_SIZE +}; + +/* IGMP/MLD statistics */ +struct br_mcast_stats { + __u64 igmp_v1queries[BR_MCAST_DIR_SIZE]; + __u64 igmp_v2queries[BR_MCAST_DIR_SIZE]; + __u64 igmp_v3queries[BR_MCAST_DIR_SIZE]; + __u64 igmp_leaves[BR_MCAST_DIR_SIZE]; + __u64 igmp_v1reports[BR_MCAST_DIR_SIZE]; + __u64 igmp_v2reports[BR_MCAST_DIR_SIZE]; + __u64 igmp_v3reports[BR_MCAST_DIR_SIZE]; + __u64 igmp_parse_errors; + + __u64 mld_v1queries[BR_MCAST_DIR_SIZE]; + __u64 mld_v2queries[BR_MCAST_DIR_SIZE]; + __u64 mld_leaves[BR_MCAST_DIR_SIZE]; + __u64 mld_v1reports[BR_MCAST_DIR_SIZE]; + __u64 mld_v2reports[BR_MCAST_DIR_SIZE]; + __u64 mld_parse_errors; + + __u64 mcast_bytes[BR_MCAST_DIR_SIZE]; + __u64 mcast_packets[BR_MCAST_DIR_SIZE]; +}; + +/* bridge boolean options + * BR_BOOLOPT_NO_LL_LEARN - disable learning from link-local packets + * + * IMPORTANT: if adding a new option do not forget to handle + * it in br_boolopt_toggle/get and bridge sysfs + */ +enum br_boolopt_id { + BR_BOOLOPT_NO_LL_LEARN, + BR_BOOLOPT_MAX +}; + +/* struct br_boolopt_multi - change multiple bridge boolean options + * + * @optval: new option values (bit per option) + * @optmask: options to change (bit per option) + */ +struct br_boolopt_multi { + __u32 optval; + __u32 optmask; +}; +#endif /* _UAPI_LINUX_IF_BRIDGE_H */ diff --git a/src/basic/linux/if_link.h b/src/basic/linux/if_link.h new file mode 100644 index 00000000000..d6533828123 --- /dev/null +++ b/src/basic/linux/if_link.h @@ -0,0 +1,1024 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_LINUX_IF_LINK_H +#define _UAPI_LINUX_IF_LINK_H + +#include <linux/types.h> +#include <linux/netlink.h> + +/* This struct should be in sync with struct rtnl_link_stats64 */ +struct rtnl_link_stats { + __u32 rx_packets; /* total packets received */ + __u32 tx_packets; /* total packets transmitted */ + __u32 rx_bytes; /* total bytes received */ + __u32 tx_bytes; /* total bytes transmitted */ + __u32 rx_errors; /* bad packets received */ + __u32 tx_errors; /* packet transmit problems */ + __u32 rx_dropped; /* no space in linux buffers */ + __u32 tx_dropped; /* no space available in linux */ + __u32 multicast; /* multicast packets received */ + __u32 collisions; + + /* detailed rx_errors: */ + __u32 rx_length_errors; + __u32 rx_over_errors; /* receiver ring buff overflow */ + __u32 rx_crc_errors; /* recved pkt with crc error */ + __u32 rx_frame_errors; /* recv'd frame alignment error */ + __u32 rx_fifo_errors; /* recv'r fifo overrun */ + __u32 rx_missed_errors; /* receiver missed packet */ + + /* detailed tx_errors */ + __u32 tx_aborted_errors; + __u32 tx_carrier_errors; + __u32 tx_fifo_errors; + __u32 tx_heartbeat_errors; + __u32 tx_window_errors; + + /* for cslip etc */ + __u32 rx_compressed; + __u32 tx_compressed; + + __u32 rx_nohandler; /* dropped, no handler found */ +}; + +/* The main device statistics structure */ +struct rtnl_link_stats64 { + __u64 rx_packets; /* total packets received */ + __u64 tx_packets; /* total packets transmitted */ + __u64 rx_bytes; /* total bytes received */ + __u64 tx_bytes; /* total bytes transmitted */ + __u64 rx_errors; /* bad packets received */ + __u64 tx_errors; /* packet transmit problems */ + __u64 rx_dropped; /* no space in linux buffers */ + __u64 tx_dropped; /* no space available in linux */ + __u64 multicast; /* multicast packets received */ + __u64 collisions; + + /* detailed rx_errors: */ + __u64 rx_length_errors; + __u64 rx_over_errors; /* receiver ring buff overflow */ + __u64 rx_crc_errors; /* recved pkt with crc error */ + __u64 rx_frame_errors; /* recv'd frame alignment error */ + __u64 rx_fifo_errors; /* recv'r fifo overrun */ + __u64 rx_missed_errors; /* receiver missed packet */ + + /* detailed tx_errors */ + __u64 tx_aborted_errors; + __u64 tx_carrier_errors; + __u64 tx_fifo_errors; + __u64 tx_heartbeat_errors; + __u64 tx_window_errors; + + /* for cslip etc */ + __u64 rx_compressed; + __u64 tx_compressed; + + __u64 rx_nohandler; /* dropped, no handler found */ +}; + +/* The struct should be in sync with struct ifmap */ +struct rtnl_link_ifmap { + __u64 mem_start; + __u64 mem_end; + __u64 base_addr; + __u16 irq; + __u8 dma; + __u8 port; +}; + +/* + * IFLA_AF_SPEC + * Contains nested attributes for address family specific attributes. + * Each address family may create a attribute with the address family + * number as type and create its own attribute structure in it. + * + * Example: + * [IFLA_AF_SPEC] = { + * [AF_INET] = { + * [IFLA_INET_CONF] = ..., + * }, + * [AF_INET6] = { + * [IFLA_INET6_FLAGS] = ..., + * [IFLA_INET6_CONF] = ..., + * } + * } + */ + +enum { + IFLA_UNSPEC, + IFLA_ADDRESS, + IFLA_BROADCAST, + IFLA_IFNAME, + IFLA_MTU, + IFLA_LINK, + IFLA_QDISC, + IFLA_STATS, + IFLA_COST, +#define IFLA_COST IFLA_COST + IFLA_PRIORITY, +#define IFLA_PRIORITY IFLA_PRIORITY + IFLA_MASTER, +#define IFLA_MASTER IFLA_MASTER + IFLA_WIRELESS, /* Wireless Extension event - see wireless.h */ +#define IFLA_WIRELESS IFLA_WIRELESS + IFLA_PROTINFO, /* Protocol specific information for a link */ +#define IFLA_PROTINFO IFLA_PROTINFO + IFLA_TXQLEN, +#define IFLA_TXQLEN IFLA_TXQLEN + IFLA_MAP, +#define IFLA_MAP IFLA_MAP + IFLA_WEIGHT, +#define IFLA_WEIGHT IFLA_WEIGHT + IFLA_OPERSTATE, + IFLA_LINKMODE, + IFLA_LINKINFO, +#define IFLA_LINKINFO IFLA_LINKINFO + IFLA_NET_NS_PID, + IFLA_IFALIAS, + IFLA_NUM_VF, /* Number of VFs if device is SR-IOV PF */ + IFLA_VFINFO_LIST, + IFLA_STATS64, + IFLA_VF_PORTS, + IFLA_PORT_SELF, + IFLA_AF_SPEC, + IFLA_GROUP, /* Group the device belongs to */ + IFLA_NET_NS_FD, + IFLA_EXT_MASK, /* Extended info mask, VFs, etc */ + IFLA_PROMISCUITY, /* Promiscuity count: > 0 means acts PROMISC */ +#define IFLA_PROMISCUITY IFLA_PROMISCUITY + IFLA_NUM_TX_QUEUES, + IFLA_NUM_RX_QUEUES, + IFLA_CARRIER, + IFLA_PHYS_PORT_ID, + IFLA_CARRIER_CHANGES, + IFLA_PHYS_SWITCH_ID, + IFLA_LINK_NETNSID, + IFLA_PHYS_PORT_NAME, + IFLA_PROTO_DOWN, + IFLA_GSO_MAX_SEGS, + IFLA_GSO_MAX_SIZE, + IFLA_PAD, + IFLA_XDP, + IFLA_EVENT, + IFLA_NEW_NETNSID, + IFLA_IF_NETNSID, + IFLA_TARGET_NETNSID = IFLA_IF_NETNSID, /* new alias */ + IFLA_CARRIER_UP_COUNT, + IFLA_CARRIER_DOWN_COUNT, + IFLA_NEW_IFINDEX, + IFLA_MIN_MTU, + IFLA_MAX_MTU, + __IFLA_MAX +}; + + +#define IFLA_MAX (__IFLA_MAX - 1) + +/* backwards compatibility for userspace */ +#ifndef __KERNEL__ +#define IFLA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg)))) +#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg)) +#endif + +enum { + IFLA_INET_UNSPEC, + IFLA_INET_CONF, + __IFLA_INET_MAX, +}; + +#define IFLA_INET_MAX (__IFLA_INET_MAX - 1) + +/* ifi_flags. + + IFF_* flags. + + The only change is: + IFF_LOOPBACK, IFF_BROADCAST and IFF_POINTOPOINT are + more not changeable by user. They describe link media + characteristics and set by device driver. + + Comments: + - Combination IFF_BROADCAST|IFF_POINTOPOINT is invalid + - If neither of these three flags are set; + the interface is NBMA. + + - IFF_MULTICAST does not mean anything special: + multicasts can be used on all not-NBMA links. + IFF_MULTICAST means that this media uses special encapsulation + for multicast frames. Apparently, all IFF_POINTOPOINT and + IFF_BROADCAST devices are able to use multicasts too. + */ + +/* IFLA_LINK. + For usual devices it is equal ifi_index. + If it is a "virtual interface" (f.e. tunnel), ifi_link + can point to real physical interface (f.e. for bandwidth calculations), + or maybe 0, what means, that real media is unknown (usual + for IPIP tunnels, when route to endpoint is allowed to change) + */ + +/* Subtype attributes for IFLA_PROTINFO */ +enum { + IFLA_INET6_UNSPEC, + IFLA_INET6_FLAGS, /* link flags */ + IFLA_INET6_CONF, /* sysctl parameters */ + IFLA_INET6_STATS, /* statistics */ + IFLA_INET6_MCAST, /* MC things. What of them? */ + IFLA_INET6_CACHEINFO, /* time values and max reasm size */ + IFLA_INET6_ICMP6STATS, /* statistics (icmpv6) */ + IFLA_INET6_TOKEN, /* device token */ + IFLA_INET6_ADDR_GEN_MODE, /* implicit address generator mode */ + __IFLA_INET6_MAX +}; + +#define IFLA_INET6_MAX (__IFLA_INET6_MAX - 1) + +enum in6_addr_gen_mode { + IN6_ADDR_GEN_MODE_EUI64, + IN6_ADDR_GEN_MODE_NONE, + IN6_ADDR_GEN_MODE_STABLE_PRIVACY, + IN6_ADDR_GEN_MODE_RANDOM, +}; + +/* Bridge section */ + +enum { + IFLA_BR_UNSPEC, + IFLA_BR_FORWARD_DELAY, + IFLA_BR_HELLO_TIME, + IFLA_BR_MAX_AGE, + IFLA_BR_AGEING_TIME, + IFLA_BR_STP_STATE, + IFLA_BR_PRIORITY, + IFLA_BR_VLAN_FILTERING, + IFLA_BR_VLAN_PROTOCOL, + IFLA_BR_GROUP_FWD_MASK, + IFLA_BR_ROOT_ID, + IFLA_BR_BRIDGE_ID, + IFLA_BR_ROOT_PORT, + IFLA_BR_ROOT_PATH_COST, + IFLA_BR_TOPOLOGY_CHANGE, + IFLA_BR_TOPOLOGY_CHANGE_DETECTED, + IFLA_BR_HELLO_TIMER, + IFLA_BR_TCN_TIMER, + IFLA_BR_TOPOLOGY_CHANGE_TIMER, + IFLA_BR_GC_TIMER, + IFLA_BR_GROUP_ADDR, + IFLA_BR_FDB_FLUSH, + IFLA_BR_MCAST_ROUTER, + IFLA_BR_MCAST_SNOOPING, + IFLA_BR_MCAST_QUERY_USE_IFADDR, + IFLA_BR_MCAST_QUERIER, + IFLA_BR_MCAST_HASH_ELASTICITY, + IFLA_BR_MCAST_HASH_MAX, + IFLA_BR_MCAST_LAST_MEMBER_CNT, + IFLA_BR_MCAST_STARTUP_QUERY_CNT, + IFLA_BR_MCAST_LAST_MEMBER_INTVL, + IFLA_BR_MCAST_MEMBERSHIP_INTVL, + IFLA_BR_MCAST_QUERIER_INTVL, + IFLA_BR_MCAST_QUERY_INTVL, + IFLA_BR_MCAST_QUERY_RESPONSE_INTVL, + IFLA_BR_MCAST_STARTUP_QUERY_INTVL, + IFLA_BR_NF_CALL_IPTABLES, + IFLA_BR_NF_CALL_IP6TABLES, + IFLA_BR_NF_CALL_ARPTABLES, + IFLA_BR_VLAN_DEFAULT_PVID, + IFLA_BR_PAD, + IFLA_BR_VLAN_STATS_ENABLED, + IFLA_BR_MCAST_STATS_ENABLED, + IFLA_BR_MCAST_IGMP_VERSION, + IFLA_BR_MCAST_MLD_VERSION, + IFLA_BR_VLAN_STATS_PER_PORT, + IFLA_BR_MULTI_BOOLOPT, + __IFLA_BR_MAX, +}; + +#define IFLA_BR_MAX (__IFLA_BR_MAX - 1) + +struct ifla_bridge_id { + __u8 prio[2]; + __u8 addr[6]; /* ETH_ALEN */ +}; + +enum { + BRIDGE_MODE_UNSPEC, + BRIDGE_MODE_HAIRPIN, +}; + +enum { + IFLA_BRPORT_UNSPEC, + IFLA_BRPORT_STATE, /* Spanning tree state */ + IFLA_BRPORT_PRIORITY, /* " priority */ + IFLA_BRPORT_COST, /* " cost */ + IFLA_BRPORT_MODE, /* mode (hairpin) */ + IFLA_BRPORT_GUARD, /* bpdu guard */ + IFLA_BRPORT_PROTECT, /* root port protection */ + IFLA_BRPORT_FAST_LEAVE, /* multicast fast leave */ + IFLA_BRPORT_LEARNING, /* mac learning */ + IFLA_BRPORT_UNICAST_FLOOD, /* flood unicast traffic */ + IFLA_BRPORT_PROXYARP, /* proxy ARP */ + IFLA_BRPORT_LEARNING_SYNC, /* mac learning sync from device */ + IFLA_BRPORT_PROXYARP_WIFI, /* proxy ARP for Wi-Fi */ + IFLA_BRPORT_ROOT_ID, /* designated root */ + IFLA_BRPORT_BRIDGE_ID, /* designated bridge */ + IFLA_BRPORT_DESIGNATED_PORT, + IFLA_BRPORT_DESIGNATED_COST, + IFLA_BRPORT_ID, + IFLA_BRPORT_NO, + IFLA_BRPORT_TOPOLOGY_CHANGE_ACK, + IFLA_BRPORT_CONFIG_PENDING, + IFLA_BRPORT_MESSAGE_AGE_TIMER, + IFLA_BRPORT_FORWARD_DELAY_TIMER, + IFLA_BRPORT_HOLD_TIMER, + IFLA_BRPORT_FLUSH, + IFLA_BRPORT_MULTICAST_ROUTER, + IFLA_BRPORT_PAD, + IFLA_BRPORT_MCAST_FLOOD, + IFLA_BRPORT_MCAST_TO_UCAST, + IFLA_BRPORT_VLAN_TUNNEL, + IFLA_BRPORT_BCAST_FLOOD, + IFLA_BRPORT_GROUP_FWD_MASK, + IFLA_BRPORT_NEIGH_SUPPRESS, + IFLA_BRPORT_ISOLATED, + IFLA_BRPORT_BACKUP_PORT, + __IFLA_BRPORT_MAX +}; +#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1) + +struct ifla_cacheinfo { + __u32 max_reasm_len; + __u32 tstamp; /* ipv6InterfaceTable updated timestamp */ + __u32 reachable_time; + __u32 retrans_time; +}; + +enum { + IFLA_INFO_UNSPEC, + IFLA_INFO_KIND, + IFLA_INFO_DATA, + IFLA_INFO_XSTATS, + IFLA_INFO_SLAVE_KIND, + IFLA_INFO_SLAVE_DATA, + __IFLA_INFO_MAX, +}; + +#define IFLA_INFO_MAX (__IFLA_INFO_MAX - 1) + +/* VLAN section */ + +enum { + IFLA_VLAN_UNSPEC, + IFLA_VLAN_ID, + IFLA_VLAN_FLAGS, + IFLA_VLAN_EGRESS_QOS, + IFLA_VLAN_INGRESS_QOS, + IFLA_VLAN_PROTOCOL, + __IFLA_VLAN_MAX, +}; + +#define IFLA_VLAN_MAX (__IFLA_VLAN_MAX - 1) + +struct ifla_vlan_flags { + __u32 flags; + __u32 mask; +}; + +enum { + IFLA_VLAN_QOS_UNSPEC, + IFLA_VLAN_QOS_MAPPING, + __IFLA_VLAN_QOS_MAX +}; + +#define IFLA_VLAN_QOS_MAX (__IFLA_VLAN_QOS_MAX - 1) + +struct ifla_vlan_qos_mapping { + __u32 from; + __u32 to; +}; + +/* MACVLAN section */ +enum { + IFLA_MACVLAN_UNSPEC, + IFLA_MACVLAN_MODE, + IFLA_MACVLAN_FLAGS, + IFLA_MACVLAN_MACADDR_MODE, + IFLA_MACVLAN_MACADDR, + IFLA_MACVLAN_MACADDR_DATA, + IFLA_MACVLAN_MACADDR_COUNT, + __IFLA_MACVLAN_MAX, +}; + +#define IFLA_MACVLAN_MAX (__IFLA_MACVLAN_MAX - 1) + +enum macvlan_mode { + MACVLAN_MODE_PRIVATE = 1, /* don't talk to other macvlans */ + MACVLAN_MODE_VEPA = 2, /* talk to other ports through ext bridge */ + MACVLAN_MODE_BRIDGE = 4, /* talk to bridge ports directly */ + MACVLAN_MODE_PASSTHRU = 8,/* take over the underlying device */ + MACVLAN_MODE_SOURCE = 16,/* use source MAC address list to assign */ +}; + +enum macvlan_macaddr_mode { + MACVLAN_MACADDR_ADD, + MACVLAN_MACADDR_DEL, + MACVLAN_MACADDR_FLUSH, + MACVLAN_MACADDR_SET, +}; + +#define MACVLAN_FLAG_NOPROMISC 1 + +/* VRF section */ +enum { + IFLA_VRF_UNSPEC, + IFLA_VRF_TABLE, + __IFLA_VRF_MAX +}; + +#define IFLA_VRF_MAX (__IFLA_VRF_MAX - 1) + +enum { + IFLA_VRF_PORT_UNSPEC, + IFLA_VRF_PORT_TABLE, + __IFLA_VRF_PORT_MAX +}; + +#define IFLA_VRF_PORT_MAX (__IFLA_VRF_PORT_MAX - 1) + +/* MACSEC section */ +enum { + IFLA_MACSEC_UNSPEC, + IFLA_MACSEC_SCI, + IFLA_MACSEC_PORT, + IFLA_MACSEC_ICV_LEN, + IFLA_MACSEC_CIPHER_SUITE, + IFLA_MACSEC_WINDOW, + IFLA_MACSEC_ENCODING_SA, + IFLA_MACSEC_ENCRYPT, + IFLA_MACSEC_PROTECT, + IFLA_MACSEC_INC_SCI, + IFLA_MACSEC_ES, + IFLA_MACSEC_SCB, + IFLA_MACSEC_REPLAY_PROTECT, + IFLA_MACSEC_VALIDATION, + IFLA_MACSEC_PAD, + __IFLA_MACSEC_MAX, +}; + +#define IFLA_MACSEC_MAX (__IFLA_MACSEC_MAX - 1) + +/* XFRM section */ +enum { + IFLA_XFRM_UNSPEC, + IFLA_XFRM_LINK, + IFLA_XFRM_IF_ID, + __IFLA_XFRM_MAX +}; + +#define IFLA_XFRM_MAX (__IFLA_XFRM_MAX - 1) + +enum macsec_validation_type { + MACSEC_VALIDATE_DISABLED = 0, + MACSEC_VALIDATE_CHECK = 1, + MACSEC_VALIDATE_STRICT = 2, + __MACSEC_VALIDATE_END, + MACSEC_VALIDATE_MAX = __MACSEC_VALIDATE_END - 1, +}; + +/* IPVLAN section */ +enum { + IFLA_IPVLAN_UNSPEC, + IFLA_IPVLAN_MODE, + IFLA_IPVLAN_FLAGS, + __IFLA_IPVLAN_MAX +}; + +#define IFLA_IPVLAN_MAX (__IFLA_IPVLAN_MAX - 1) + +enum ipvlan_mode { + IPVLAN_MODE_L2 = 0, + IPVLAN_MODE_L3, + IPVLAN_MODE_L3S, + IPVLAN_MODE_MAX +}; + +#define IPVLAN_F_PRIVATE 0x01 +#define IPVLAN_F_VEPA 0x02 + +/* VXLAN section */ +enum { + IFLA_VXLAN_UNSPEC, + IFLA_VXLAN_ID, + IFLA_VXLAN_GROUP, /* group or remote address */ + IFLA_VXLAN_LINK, + IFLA_VXLAN_LOCAL, + IFLA_VXLAN_TTL, + IFLA_VXLAN_TOS, + IFLA_VXLAN_LEARNING, + IFLA_VXLAN_AGEING, + IFLA_VXLAN_LIMIT, + IFLA_VXLAN_PORT_RANGE, /* source port */ + IFLA_VXLAN_PROXY, + IFLA_VXLAN_RSC, + IFLA_VXLAN_L2MISS, + IFLA_VXLAN_L3MISS, + IFLA_VXLAN_PORT, /* destination port */ + IFLA_VXLAN_GROUP6, + IFLA_VXLAN_LOCAL6, + IFLA_VXLAN_UDP_CSUM, + IFLA_VXLAN_UDP_ZERO_CSUM6_TX, + IFLA_VXLAN_UDP_ZERO_CSUM6_RX, + IFLA_VXLAN_REMCSUM_TX, + IFLA_VXLAN_REMCSUM_RX, + IFLA_VXLAN_GBP, + IFLA_VXLAN_REMCSUM_NOPARTIAL, + IFLA_VXLAN_COLLECT_METADATA, + IFLA_VXLAN_LABEL, + IFLA_VXLAN_GPE, + IFLA_VXLAN_TTL_INHERIT, + IFLA_VXLAN_DF, + __IFLA_VXLAN_MAX +}; +#define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) + +struct ifla_vxlan_port_range { + __be16 low; + __be16 high; +}; + +enum ifla_vxlan_df { + VXLAN_DF_UNSET = 0, + VXLAN_DF_SET, + VXLAN_DF_INHERIT, + __VXLAN_DF_END, + VXLAN_DF_MAX = __VXLAN_DF_END - 1, +}; + +/* GENEVE section */ +enum { + IFLA_GENEVE_UNSPEC, + IFLA_GENEVE_ID, + IFLA_GENEVE_REMOTE, + IFLA_GENEVE_TTL, + IFLA_GENEVE_TOS, + IFLA_GENEVE_PORT, /* destination port */ + IFLA_GENEVE_COLLECT_METADATA, + IFLA_GENEVE_REMOTE6, + IFLA_GENEVE_UDP_CSUM, + IFLA_GENEVE_UDP_ZERO_CSUM6_TX, + IFLA_GENEVE_UDP_ZERO_CSUM6_RX, + IFLA_GENEVE_LABEL, + IFLA_GENEVE_TTL_INHERIT, + IFLA_GENEVE_DF, + __IFLA_GENEVE_MAX +}; +#define IFLA_GENEVE_MAX (__IFLA_GENEVE_MAX - 1) + +enum ifla_geneve_df { + GENEVE_DF_UNSET = 0, + GENEVE_DF_SET, + GENEVE_DF_INHERIT, + __GENEVE_DF_END, + GENEVE_DF_MAX = __GENEVE_DF_END - 1, +}; + +/* PPP section */ +enum { + IFLA_PPP_UNSPEC, + IFLA_PPP_DEV_FD, + __IFLA_PPP_MAX +}; +#define IFLA_PPP_MAX (__IFLA_PPP_MAX - 1) + +/* GTP section */ + +enum ifla_gtp_role { + GTP_ROLE_GGSN = 0, + GTP_ROLE_SGSN, +}; + +enum { + IFLA_GTP_UNSPEC, + IFLA_GTP_FD0, + IFLA_GTP_FD1, + IFLA_GTP_PDP_HASHSIZE, + IFLA_GTP_ROLE, + __IFLA_GTP_MAX, +}; +#define IFLA_GTP_MAX (__IFLA_GTP_MAX - 1) + +/* Bonding section */ + +enum { + IFLA_BOND_UNSPEC, + IFLA_BOND_MODE, + IFLA_BOND_ACTIVE_SLAVE, + IFLA_BOND_MIIMON, + IFLA_BOND_UPDELAY, + IFLA_BOND_DOWNDELAY, + IFLA_BOND_USE_CARRIER, + IFLA_BOND_ARP_INTERVAL, + IFLA_BOND_ARP_IP_TARGET, + IFLA_BOND_ARP_VALIDATE, + IFLA_BOND_ARP_ALL_TARGETS, + IFLA_BOND_PRIMARY, + IFLA_BOND_PRIMARY_RESELECT, + IFLA_BOND_FAIL_OVER_MAC, + IFLA_BOND_XMIT_HASH_POLICY, + IFLA_BOND_RESEND_IGMP, + IFLA_BOND_NUM_PEER_NOTIF, + IFLA_BOND_ALL_SLAVES_ACTIVE, + IFLA_BOND_MIN_LINKS, + IFLA_BOND_LP_INTERVAL, + IFLA_BOND_PACKETS_PER_SLAVE, + IFLA_BOND_AD_LACP_RATE, + IFLA_BOND_AD_SELECT, + IFLA_BOND_AD_INFO, + IFLA_BOND_AD_ACTOR_SYS_PRIO, + IFLA_BOND_AD_USER_PORT_KEY, + IFLA_BOND_AD_ACTOR_SYSTEM, + IFLA_BOND_TLB_DYNAMIC_LB, + __IFLA_BOND_MAX, +}; + +#define IFLA_BOND_MAX (__IFLA_BOND_MAX - 1) + +enum { + IFLA_BOND_AD_INFO_UNSPEC, + IFLA_BOND_AD_INFO_AGGREGATOR, + IFLA_BOND_AD_INFO_NUM_PORTS, + IFLA_BOND_AD_INFO_ACTOR_KEY, + IFLA_BOND_AD_INFO_PARTNER_KEY, + IFLA_BOND_AD_INFO_PARTNER_MAC, + __IFLA_BOND_AD_INFO_MAX, +}; + +#define IFLA_BOND_AD_INFO_MAX (__IFLA_BOND_AD_INFO_MAX - 1) + +enum { + IFLA_BOND_SLAVE_UNSPEC, + IFLA_BOND_SLAVE_STATE, + IFLA_BOND_SLAVE_MII_STATUS, + IFLA_BOND_SLAVE_LINK_FAILURE_COUNT, + IFLA_BOND_SLAVE_PERM_HWADDR, + IFLA_BOND_SLAVE_QUEUE_ID, + IFLA_BOND_SLAVE_AD_AGGREGATOR_ID, + IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE, + IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE, + __IFLA_BOND_SLAVE_MAX, +}; + +#define IFLA_BOND_SLAVE_MAX (__IFLA_BOND_SLAVE_MAX - 1) + +/* SR-IOV virtual function management section */ + +enum { + IFLA_VF_INFO_UNSPEC, + IFLA_VF_INFO, + __IFLA_VF_INFO_MAX, +}; + +#define IFLA_VF_INFO_MAX (__IFLA_VF_INFO_MAX - 1) + +enum { + IFLA_VF_UNSPEC, + IFLA_VF_MAC, /* Hardware queue specific attributes */ + IFLA_VF_VLAN, /* VLAN ID and QoS */ + IFLA_VF_TX_RATE, /* Max TX Bandwidth Allocation */ + IFLA_VF_SPOOFCHK, /* Spoof Checking on/off switch */ + IFLA_VF_LINK_STATE, /* link state enable/disable/auto switch */ + IFLA_VF_RATE, /* Min and Max TX Bandwidth Allocation */ + IFLA_VF_RSS_QUERY_EN, /* RSS Redirection Table and Hash Key query + * on/off switch + */ + IFLA_VF_STATS, /* network device statistics */ + IFLA_VF_TRUST, /* Trust VF */ + IFLA_VF_IB_NODE_GUID, /* VF Infiniband node GUID */ + IFLA_VF_IB_PORT_GUID, /* VF Infiniband port GUID */ + IFLA_VF_VLAN_LIST, /* nested list of vlans, option for QinQ */ + __IFLA_VF_MAX, +}; + +#define IFLA_VF_MAX (__IFLA_VF_MAX - 1) + +struct ifla_vf_mac { + __u32 vf; + __u8 mac[32]; /* MAX_ADDR_LEN */ +}; + +struct ifla_vf_vlan { + __u32 vf; + __u32 vlan; /* 0 - 4095, 0 disables VLAN filter */ + __u32 qos; +}; + +enum { + IFLA_VF_VLAN_INFO_UNSPEC, + IFLA_VF_VLAN_INFO, /* VLAN ID, QoS and VLAN protocol */ + __IFLA_VF_VLAN_INFO_MAX, +}; + +#define IFLA_VF_VLAN_INFO_MAX (__IFLA_VF_VLAN_INFO_MAX - 1) +#define MAX_VLAN_LIST_LEN 1 + +struct ifla_vf_vlan_info { + __u32 vf; + __u32 vlan; /* 0 - 4095, 0 disables VLAN filter */ + __u32 qos; + __be16 vlan_proto; /* VLAN protocol either 802.1Q or 802.1ad */ +}; + +struct ifla_vf_tx_rate { + __u32 vf; + __u32 rate; /* Max TX bandwidth in Mbps, 0 disables throttling */ +}; + +struct ifla_vf_rate { + __u32 vf; + __u32 min_tx_rate; /* Min Bandwidth in Mbps */ + __u32 max_tx_rate; /* Max Bandwidth in Mbps */ +}; + +struct ifla_vf_spoofchk { + __u32 vf; + __u32 setting; +}; + +struct ifla_vf_guid { + __u32 vf; + __u64 guid; +}; + +enum { + IFLA_VF_LINK_STATE_AUTO, /* link state of the uplink */ + IFLA_VF_LINK_STATE_ENABLE, /* link always up */ + IFLA_VF_LINK_STATE_DISABLE, /* link always down */ + __IFLA_VF_LINK_STATE_MAX, +}; + +struct ifla_vf_link_state { + __u32 vf; + __u32 link_state; +}; + +struct ifla_vf_rss_query_en { + __u32 vf; + __u32 setting; +}; + +enum { + IFLA_VF_STATS_RX_PACKETS, + IFLA_VF_STATS_TX_PACKETS, + IFLA_VF_STATS_RX_BYTES, + IFLA_VF_STATS_TX_BYTES, + IFLA_VF_STATS_BROADCAST, + IFLA_VF_STATS_MULTICAST, + IFLA_VF_STATS_PAD, + IFLA_VF_STATS_RX_DROPPED, + IFLA_VF_STATS_TX_DROPPED, + __IFLA_VF_STATS_MAX, +}; + +#define IFLA_VF_STATS_MAX (__IFLA_VF_STATS_MAX - 1) + +struct ifla_vf_trust { + __u32 vf; + __u32 setting; +}; + +/* VF ports management section + * + * Nested layout of set/get msg is: + * + * [IFLA_NUM_VF] + * [IFLA_VF_PORTS] + * [IFLA_VF_PORT] + * [IFLA_PORT_*], ... + * [IFLA_VF_PORT] + * [IFLA_PORT_*], ... + * ... + * [IFLA_PORT_SELF] + * [IFLA_PORT_*], ... + */ + +enum { + IFLA_VF_PORT_UNSPEC, + IFLA_VF_PORT, /* nest */ + __IFLA_VF_PORT_MAX, +}; + +#define IFLA_VF_PORT_MAX (__IFLA_VF_PORT_MAX - 1) + +enum { + IFLA_PORT_UNSPEC, + IFLA_PORT_VF, /* __u32 */ + IFLA_PORT_PROFILE, /* string */ + IFLA_PORT_VSI_TYPE, /* 802.1Qbg (pre-)standard VDP */ + IFLA_PORT_INSTANCE_UUID, /* binary UUID */ + IFLA_PORT_HOST_UUID, /* binary UUID */ + IFLA_PORT_REQUEST, /* __u8 */ + IFLA_PORT_RESPONSE, /* __u16, output only */ + __IFLA_PORT_MAX, +}; + +#define IFLA_PORT_MAX (__IFLA_PORT_MAX - 1) + +#define PORT_PROFILE_MAX 40 +#define PORT_UUID_MAX 16 +#define PORT_SELF_VF -1 + +enum { + PORT_REQUEST_PREASSOCIATE = 0, + PORT_REQUEST_PREASSOCIATE_RR, + PORT_REQUEST_ASSOCIATE, + PORT_REQUEST_DISASSOCIATE, +}; + +enum { + PORT_VDP_RESPONSE_SUCCESS = 0, + PORT_VDP_RESPONSE_INVALID_FORMAT, + PORT_VDP_RESPONSE_INSUFFICIENT_RESOURCES, + PORT_VDP_RESPONSE_UNUSED_VTID, + PORT_VDP_RESPONSE_VTID_VIOLATION, + PORT_VDP_RESPONSE_VTID_VERSION_VIOALTION, + PORT_VDP_RESPONSE_OUT_OF_SYNC, + /* 0x08-0xFF reserved for future VDP use */ + PORT_PROFILE_RESPONSE_SUCCESS = 0x100, + PORT_PROFILE_RESPONSE_INPROGRESS, + PORT_PROFILE_RESPONSE_INVALID, + PORT_PROFILE_RESPONSE_BADSTATE, + PORT_PROFILE_RESPONSE_INSUFFICIENT_RESOURCES, + PORT_PROFILE_RESPONSE_ERROR, +}; + +struct ifla_port_vsi { + __u8 vsi_mgr_id; + __u8 vsi_type_id[3]; + __u8 vsi_type_version; + __u8 pad[3]; +}; + + +/* IPoIB section */ + +enum { + IFLA_IPOIB_UNSPEC, + IFLA_IPOIB_PKEY, + IFLA_IPOIB_MODE, + IFLA_IPOIB_UMCAST, + __IFLA_IPOIB_MAX +}; + +enum { + IPOIB_MODE_DATAGRAM = 0, /* using unreliable datagram QPs */ + IPOIB_MODE_CONNECTED = 1, /* using connected QPs */ +}; + +#define IFLA_IPOIB_MAX (__IFLA_IPOIB_MAX - 1) + + +/* HSR section */ + +enum { + IFLA_HSR_UNSPEC, + IFLA_HSR_SLAVE1, + IFLA_HSR_SLAVE2, + IFLA_HSR_MULTICAST_SPEC, /* Last byte of supervision addr */ + IFLA_HSR_SUPERVISION_ADDR, /* Supervision frame multicast addr */ + IFLA_HSR_SEQ_NR, + IFLA_HSR_VERSION, /* HSR version */ + __IFLA_HSR_MAX, +}; + +#define IFLA_HSR_MAX (__IFLA_HSR_MAX - 1) + +/* STATS section */ + +struct if_stats_msg { + __u8 family; + __u8 pad1; + __u16 pad2; + __u32 ifindex; + __u32 filter_mask; +}; + +/* A stats attribute can be netdev specific or a global stat. + * For netdev stats, lets use the prefix IFLA_STATS_LINK_* + */ +enum { + IFLA_STATS_UNSPEC, /* also used as 64bit pad attribute */ + IFLA_STATS_LINK_64, + IFLA_STATS_LINK_XSTATS, + IFLA_STATS_LINK_XSTATS_SLAVE, + IFLA_STATS_LINK_OFFLOAD_XSTATS, + IFLA_STATS_AF_SPEC, + __IFLA_STATS_MAX, +}; + +#define IFLA_STATS_MAX (__IFLA_STATS_MAX - 1) + +#define IFLA_STATS_FILTER_BIT(ATTR) (1 << (ATTR - 1)) + +/* These are embedded into IFLA_STATS_LINK_XSTATS: + * [IFLA_STATS_LINK_XSTATS] + * -> [LINK_XSTATS_TYPE_xxx] + * -> [rtnl link type specific attributes] + */ +enum { + LINK_XSTATS_TYPE_UNSPEC, + LINK_XSTATS_TYPE_BRIDGE, + __LINK_XSTATS_TYPE_MAX +}; +#define LINK_XSTATS_TYPE_MAX (__LINK_XSTATS_TYPE_MAX - 1) + +/* These are stats embedded into IFLA_STATS_LINK_OFFLOAD_XSTATS */ +enum { + IFLA_OFFLOAD_XSTATS_UNSPEC, + IFLA_OFFLOAD_XSTATS_CPU_HIT, /* struct rtnl_link_stats64 */ + __IFLA_OFFLOAD_XSTATS_MAX +}; +#define IFLA_OFFLOAD_XSTATS_MAX (__IFLA_OFFLOAD_XSTATS_MAX - 1) + +/* XDP section */ + +#define XDP_FLAGS_UPDATE_IF_NOEXIST (1U << 0) +#define XDP_FLAGS_SKB_MODE (1U << 1) +#define XDP_FLAGS_DRV_MODE (1U << 2) +#define XDP_FLAGS_HW_MODE (1U << 3) +#define XDP_FLAGS_MODES (XDP_FLAGS_SKB_MODE | \ + XDP_FLAGS_DRV_MODE | \ + XDP_FLAGS_HW_MODE) +#define XDP_FLAGS_MASK (XDP_FLAGS_UPDATE_IF_NOEXIST | \ + XDP_FLAGS_MODES) + +/* These are stored into IFLA_XDP_ATTACHED on dump. */ +enum { + XDP_ATTACHED_NONE = 0, + XDP_ATTACHED_DRV, + XDP_ATTACHED_SKB, + XDP_ATTACHED_HW, + XDP_ATTACHED_MULTI, +}; + +enum { + IFLA_XDP_UNSPEC, + IFLA_XDP_FD, + IFLA_XDP_ATTACHED, + IFLA_XDP_FLAGS, + IFLA_XDP_PROG_ID, + IFLA_XDP_DRV_PROG_ID, + IFLA_XDP_SKB_PROG_ID, + IFLA_XDP_HW_PROG_ID, + __IFLA_XDP_MAX, +}; + +#define IFLA_XDP_MAX (__IFLA_XDP_MAX - 1) + +enum { + IFLA_EVENT_NONE, + IFLA_EVENT_REBOOT, /* internal reset / reboot */ + IFLA_EVENT_FEATURES, /* change in offload features */ + IFLA_EVENT_BONDING_FAILOVER, /* change in active slave */ + IFLA_EVENT_NOTIFY_PEERS, /* re-sent grat. arp/ndisc */ + IFLA_EVENT_IGMP_RESEND, /* re-sent IGMP JOIN */ + IFLA_EVENT_BONDING_OPTIONS, /* change in bonding options */ +}; + +/* tun section */ + +enum { + IFLA_TUN_UNSPEC, + IFLA_TUN_OWNER, + IFLA_TUN_GROUP, + IFLA_TUN_TYPE, + IFLA_TUN_PI, + IFLA_TUN_VNET_HDR, + IFLA_TUN_PERSIST, + IFLA_TUN_MULTI_QUEUE, + IFLA_TUN_NUM_QUEUES, + IFLA_TUN_NUM_DISABLED_QUEUES, + __IFLA_TUN_MAX, +}; + +#define IFLA_TUN_MAX (__IFLA_TUN_MAX - 1) + +/* rmnet section */ + +#define RMNET_FLAGS_INGRESS_DEAGGREGATION (1U << 0) +#define RMNET_FLAGS_INGRESS_MAP_COMMANDS (1U << 1) +#define RMNET_FLAGS_INGRESS_MAP_CKSUMV4 (1U << 2) +#define RMNET_FLAGS_EGRESS_MAP_CKSUMV4 (1U << 3) + +enum { + IFLA_RMNET_UNSPEC, + IFLA_RMNET_MUX_ID, + IFLA_RMNET_FLAGS, + __IFLA_RMNET_MAX, +}; + +#define IFLA_RMNET_MAX (__IFLA_RMNET_MAX - 1) + +struct ifla_rmnet_flags { + __u32 flags; + __u32 mask; +}; + +#endif /* _UAPI_LINUX_IF_LINK_H */ diff --git a/src/basic/linux/if_tun.h b/src/basic/linux/if_tun.h new file mode 100644 index 00000000000..23a6753b37d --- /dev/null +++ b/src/basic/linux/if_tun.h @@ -0,0 +1,113 @@ +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ +/* + * Universal TUN/TAP device driver. + * Copyright (C) 1999-2000 Maxim Krasnyansky <max_mk@yahoo.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _UAPI__IF_TUN_H +#define _UAPI__IF_TUN_H + +#include <linux/types.h> +#include <linux/if_ether.h> +#include <linux/filter.h> + +/* Read queue size */ +#define TUN_READQ_SIZE 500 +/* TUN device type flags: deprecated. Use IFF_TUN/IFF_TAP instead. */ +#define TUN_TUN_DEV IFF_TUN +#define TUN_TAP_DEV IFF_TAP +#define TUN_TYPE_MASK 0x000f + +/* Ioctl defines */ +#define TUNSETNOCSUM _IOW('T', 200, int) +#define TUNSETDEBUG _IOW('T', 201, int) +#define TUNSETIFF _IOW('T', 202, int) +#define TUNSETPERSIST _IOW('T', 203, int) +#define TUNSETOWNER _IOW('T', 204, int) +#define TUNSETLINK _IOW('T', 205, int) +#define TUNSETGROUP _IOW('T', 206, int) +#define TUNGETFEATURES _IOR('T', 207, unsigned int) +#define TUNSETOFFLOAD _IOW('T', 208, unsigned int) +#define TUNSETTXFILTER _IOW('T', 209, unsigned int) +#define TUNGETIFF _IOR('T', 210, unsigned int) +#define TUNGETSNDBUF _IOR('T', 211, int) +#define TUNSETSNDBUF _IOW('T', 212, int) +#define TUNATTACHFILTER _IOW('T', 213, struct sock_fprog) +#define TUNDETACHFILTER _IOW('T', 214, struct sock_fprog) +#define TUNGETVNETHDRSZ _IOR('T', 215, int) +#define TUNSETVNETHDRSZ _IOW('T', 216, int) +#define TUNSETQUEUE _IOW('T', 217, int) +#define TUNSETIFINDEX _IOW('T', 218, unsigned int) +#define TUNGETFILTER _IOR('T', 219, struct sock_fprog) +#define TUNSETVNETLE _IOW('T', 220, int) +#define TUNGETVNETLE _IOR('T', 221, int) +/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on + * little-endian hosts. Not all kernel configurations support them, but all + * configurations that support SET also support GET. + */ +#define TUNSETVNETBE _IOW('T', 222, int) +#define TUNGETVNETBE _IOR('T', 223, int) +#define TUNSETSTEERINGEBPF _IOR('T', 224, int) +#define TUNSETFILTEREBPF _IOR('T', 225, int) +#define TUNSETCARRIER _IOW('T', 226, int) + +/* TUNSETIFF ifr flags */ +#define IFF_TUN 0x0001 +#define IFF_TAP 0x0002 +#define IFF_NAPI 0x0010 +#define IFF_NAPI_FRAGS 0x0020 +#define IFF_NO_PI 0x1000 +/* This flag has no real effect */ +#define IFF_ONE_QUEUE 0x2000 +#define IFF_VNET_HDR 0x4000 +#define IFF_TUN_EXCL 0x8000 +#define IFF_MULTI_QUEUE 0x0100 +#define IFF_ATTACH_QUEUE 0x0200 +#define IFF_DETACH_QUEUE 0x0400 +/* read-only flag */ +#define IFF_PERSIST 0x0800 +#define IFF_NOFILTER 0x1000 + +/* Socket options */ +#define TUN_TX_TIMESTAMP 1 + +/* Features for GSO (TUNSETOFFLOAD). */ +#define TUN_F_CSUM 0x01 /* You can hand me unchecksummed packets. */ +#define TUN_F_TSO4 0x02 /* I can handle TSO for IPv4 packets */ +#define TUN_F_TSO6 0x04 /* I can handle TSO for IPv6 packets */ +#define TUN_F_TSO_ECN 0x08 /* I can handle TSO with ECN bits. */ +#define TUN_F_UFO 0x10 /* I can handle UFO packets */ + +/* Protocol info prepended to the packets (when IFF_NO_PI is not set) */ +#define TUN_PKT_STRIP 0x0001 +struct tun_pi { + __u16 flags; + __be16 proto; +}; + +/* + * Filter spec (used for SETXXFILTER ioctls) + * This stuff is applicable only to the TAP (Ethernet) devices. + * If the count is zero the filter is disabled and the driver accepts + * all packets (promisc mode). + * If the filter is enabled in order to accept broadcast packets + * broadcast addr must be explicitly included in the addr list. + */ +#define TUN_FLT_ALLMULTI 0x0001 /* Accept all multicast packets */ +struct tun_filter { + __u16 flags; /* TUN_FLT_ flags see above */ + __u16 count; /* Number of addresses */ + __u8 addr[0][ETH_ALEN]; +}; + +#endif /* _UAPI__IF_TUN_H */ diff --git a/src/basic/linux/if_tunnel.h b/src/basic/linux/if_tunnel.h new file mode 100644 index 00000000000..7d9105533c7 --- /dev/null +++ b/src/basic/linux/if_tunnel.h @@ -0,0 +1,183 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_IF_TUNNEL_H_ +#define _UAPI_IF_TUNNEL_H_ + +#include <linux/types.h> +#include <linux/if.h> +#include <linux/ip.h> +#include <linux/in6.h> +#include <asm/byteorder.h> + + +#define SIOCGETTUNNEL (SIOCDEVPRIVATE + 0) +#define SIOCADDTUNNEL (SIOCDEVPRIVATE + 1) +#define SIOCDELTUNNEL (SIOCDEVPRIVATE + 2) +#define SIOCCHGTUNNEL (SIOCDEVPRIVATE + 3) +#define SIOCGETPRL (SIOCDEVPRIVATE + 4) +#define SIOCADDPRL (SIOCDEVPRIVATE + 5) +#define SIOCDELPRL (SIOCDEVPRIVATE + 6) +#define SIOCCHGPRL (SIOCDEVPRIVATE + 7) +#define SIOCGET6RD (SIOCDEVPRIVATE + 8) +#define SIOCADD6RD (SIOCDEVPRIVATE + 9) +#define SIOCDEL6RD (SIOCDEVPRIVATE + 10) +#define SIOCCHG6RD (SIOCDEVPRIVATE + 11) + +#define GRE_CSUM __cpu_to_be16(0x8000) +#define GRE_ROUTING __cpu_to_be16(0x4000) +#define GRE_KEY __cpu_to_be16(0x2000) +#define GRE_SEQ __cpu_to_be16(0x1000) +#define GRE_STRICT __cpu_to_be16(0x0800) +#define GRE_REC __cpu_to_be16(0x0700) +#define GRE_ACK __cpu_to_be16(0x0080) +#define GRE_FLAGS __cpu_to_be16(0x0078) +#define GRE_VERSION __cpu_to_be16(0x0007) + +#define GRE_IS_CSUM(f) ((f) & GRE_CSUM) +#define GRE_IS_ROUTING(f) ((f) & GRE_ROUTING) +#define GRE_IS_KEY(f) ((f) & GRE_KEY) +#define GRE_IS_SEQ(f) ((f) & GRE_SEQ) +#define GRE_IS_STRICT(f) ((f) & GRE_STRICT) +#define GRE_IS_REC(f) ((f) & GRE_REC) +#define GRE_IS_ACK(f) ((f) & GRE_ACK) + +#define GRE_VERSION_0 __cpu_to_be16(0x0000) +#define GRE_VERSION_1 __cpu_to_be16(0x0001) +#define GRE_PROTO_PPP __cpu_to_be16(0x880b) +#define GRE_PPTP_KEY_MASK __cpu_to_be32(0xffff) + +struct ip_tunnel_parm { + char name[IFNAMSIZ]; + int link; + __be16 i_flags; + __be16 o_flags; + __be32 i_key; + __be32 o_key; + struct iphdr iph; +}; + +enum { + IFLA_IPTUN_UNSPEC, + IFLA_IPTUN_LINK, + IFLA_IPTUN_LOCAL, + IFLA_IPTUN_REMOTE, + IFLA_IPTUN_TTL, + IFLA_IPTUN_TOS, + IFLA_IPTUN_ENCAP_LIMIT, + IFLA_IPTUN_FLOWINFO, + IFLA_IPTUN_FLAGS, + IFLA_IPTUN_PROTO, + IFLA_IPTUN_PMTUDISC, + IFLA_IPTUN_6RD_PREFIX, + IFLA_IPTUN_6RD_RELAY_PREFIX, + IFLA_IPTUN_6RD_PREFIXLEN, + IFLA_IPTUN_6RD_RELAY_PREFIXLEN, + IFLA_IPTUN_ENCAP_TYPE, + IFLA_IPTUN_ENCAP_FLAGS, + IFLA_IPTUN_ENCAP_SPORT, + IFLA_IPTUN_ENCAP_DPORT, + IFLA_IPTUN_COLLECT_METADATA, + IFLA_IPTUN_FWMARK, + __IFLA_IPTUN_MAX, +}; +#define IFLA_IPTUN_MAX (__IFLA_IPTUN_MAX - 1) + +enum tunnel_encap_types { + TUNNEL_ENCAP_NONE, + TUNNEL_ENCAP_FOU, + TUNNEL_ENCAP_GUE, + TUNNEL_ENCAP_MPLS, +}; + +#define TUNNEL_ENCAP_FLAG_CSUM (1<<0) +#define TUNNEL_ENCAP_FLAG_CSUM6 (1<<1) +#define TUNNEL_ENCAP_FLAG_REMCSUM (1<<2) + +/* SIT-mode i_flags */ +#define SIT_ISATAP 0x0001 + +struct ip_tunnel_prl { + __be32 addr; + __u16 flags; + __u16 __reserved; + __u32 datalen; + __u32 __reserved2; + /* data follows */ +}; + +/* PRL flags */ +#define PRL_DEFAULT 0x0001 + +struct ip_tunnel_6rd { + struct in6_addr prefix; + __be32 relay_prefix; + __u16 prefixlen; + __u16 relay_prefixlen; +}; + +enum { + IFLA_GRE_UNSPEC, + IFLA_GRE_LINK, + IFLA_GRE_IFLAGS, + IFLA_GRE_OFLAGS, + IFLA_GRE_IKEY, + IFLA_GRE_OKEY, + IFLA_GRE_LOCAL, + IFLA_GRE_REMOTE, + IFLA_GRE_TTL, + IFLA_GRE_TOS, + IFLA_GRE_PMTUDISC, + IFLA_GRE_ENCAP_LIMIT, + IFLA_GRE_FLOWINFO, + IFLA_GRE_FLAGS, + IFLA_GRE_ENCAP_TYPE, + IFLA_GRE_ENCAP_FLAGS, + IFLA_GRE_ENCAP_SPORT, + IFLA_GRE_ENCAP_DPORT, + IFLA_GRE_COLLECT_METADATA, + IFLA_GRE_IGNORE_DF, + IFLA_GRE_FWMARK, + IFLA_GRE_ERSPAN_INDEX, + IFLA_GRE_ERSPAN_VER, + IFLA_GRE_ERSPAN_DIR, + IFLA_GRE_ERSPAN_HWID, + __IFLA_GRE_MAX, +}; + +#define IFLA_GRE_MAX (__IFLA_GRE_MAX - 1) + +/* VTI-mode i_flags */ +#define VTI_ISVTI ((__force __be16)0x0001) + +enum { + IFLA_VTI_UNSPEC, + IFLA_VTI_LINK, + IFLA_VTI_IKEY, + IFLA_VTI_OKEY, + IFLA_VTI_LOCAL, + IFLA_VTI_REMOTE, + IFLA_VTI_FWMARK, + __IFLA_VTI_MAX, +}; + +#define IFLA_VTI_MAX (__IFLA_VTI_MAX - 1) + +#define TUNNEL_CSUM __cpu_to_be16(0x01) +#define TUNNEL_ROUTING __cpu_to_be16(0x02) +#define TUNNEL_KEY __cpu_to_be16(0x04) +#define TUNNEL_SEQ __cpu_to_be16(0x08) +#define TUNNEL_STRICT __cpu_to_be16(0x10) +#define TUNNEL_REC __cpu_to_be16(0x20) +#define TUNNEL_VERSION __cpu_to_be16(0x40) +#define TUNNEL_NO_KEY __cpu_to_be16(0x80) +#define TUNNEL_DONT_FRAGMENT __cpu_to_be16(0x0100) +#define TUNNEL_OAM __cpu_to_be16(0x0200) +#define TUNNEL_CRIT_OPT __cpu_to_be16(0x0400) +#define TUNNEL_GENEVE_OPT __cpu_to_be16(0x0800) +#define TUNNEL_VXLAN_OPT __cpu_to_be16(0x1000) +#define TUNNEL_NOCACHE __cpu_to_be16(0x2000) +#define TUNNEL_ERSPAN_OPT __cpu_to_be16(0x4000) + +#define TUNNEL_OPTIONS_PRESENT \ + (TUNNEL_GENEVE_OPT | TUNNEL_VXLAN_OPT | TUNNEL_ERSPAN_OPT) + +#endif /* _UAPI_IF_TUNNEL_H_ */ diff --git a/src/basic/linux/libc-compat.h b/src/basic/linux/libc-compat.h new file mode 100644 index 00000000000..8254c937c9f --- /dev/null +++ b/src/basic/linux/libc-compat.h @@ -0,0 +1,267 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * Compatibility interface for userspace libc header coordination: + * + * Define compatibility macros that are used to control the inclusion or + * exclusion of UAPI structures and definitions in coordination with another + * userspace C library. + * + * This header is intended to solve the problem of UAPI definitions that + * conflict with userspace definitions. If a UAPI header has such conflicting + * definitions then the solution is as follows: + * + * * Synchronize the UAPI header and the libc headers so either one can be + * used and such that the ABI is preserved. If this is not possible then + * no simple compatibility interface exists (you need to write translating + * wrappers and rename things) and you can't use this interface. + * + * Then follow this process: + * + * (a) Include libc-compat.h in the UAPI header. + * e.g. #include <linux/libc-compat.h> + * This include must be as early as possible. + * + * (b) In libc-compat.h add enough code to detect that the comflicting + * userspace libc header has been included first. + * + * (c) If the userspace libc header has been included first define a set of + * guard macros of the form __UAPI_DEF_FOO and set their values to 1, else + * set their values to 0. + * + * (d) Back in the UAPI header with the conflicting definitions, guard the + * definitions with: + * #if __UAPI_DEF_FOO + * ... + * #endif + * + * This fixes the situation where the linux headers are included *after* the + * libc headers. To fix the problem with the inclusion in the other order the + * userspace libc headers must be fixed like this: + * + * * For all definitions that conflict with kernel definitions wrap those + * defines in the following: + * #if !__UAPI_DEF_FOO + * ... + * #endif + * + * This prevents the redefinition of a construct already defined by the kernel. + */ +#ifndef _UAPI_LIBC_COMPAT_H +#define _UAPI_LIBC_COMPAT_H + +/* We have included glibc headers... */ +#if defined(__GLIBC__) + +/* Coordinate with glibc net/if.h header. */ +#if defined(_NET_IF_H) && defined(__USE_MISC) + +/* GLIBC headers included first so don't define anything + * that would already be defined. */ + +#define __UAPI_DEF_IF_IFCONF 0 +#define __UAPI_DEF_IF_IFMAP 0 +#define __UAPI_DEF_IF_IFNAMSIZ 0 +#define __UAPI_DEF_IF_IFREQ 0 +/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 0 +/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ +#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ + +#else /* _NET_IF_H */ + +/* Linux headers included first, and we must define everything + * we need. The expectation is that glibc will check the + * __UAPI_DEF_* defines and adjust appropriately. */ + +#define __UAPI_DEF_IF_IFCONF 1 +#define __UAPI_DEF_IF_IFMAP 1 +#define __UAPI_DEF_IF_IFNAMSIZ 1 +#define __UAPI_DEF_IF_IFREQ 1 +/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 +/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 + +#endif /* _NET_IF_H */ + +/* Coordinate with glibc netinet/in.h header. */ +#if defined(_NETINET_IN_H) + +/* GLIBC headers included first so don't define anything + * that would already be defined. */ +#define __UAPI_DEF_IN_ADDR 0 +#define __UAPI_DEF_IN_IPPROTO 0 +#define __UAPI_DEF_IN_PKTINFO 0 +#define __UAPI_DEF_IP_MREQ 0 +#define __UAPI_DEF_SOCKADDR_IN 0 +#define __UAPI_DEF_IN_CLASS 0 + +#define __UAPI_DEF_IN6_ADDR 0 +/* The exception is the in6_addr macros which must be defined + * if the glibc code didn't define them. This guard matches + * the guard in glibc/inet/netinet/in.h which defines the + * additional in6_addr macros e.g. s6_addr16, and s6_addr32. */ +#if defined(__USE_MISC) || defined (__USE_GNU) +#define __UAPI_DEF_IN6_ADDR_ALT 0 +#else +#define __UAPI_DEF_IN6_ADDR_ALT 1 +#endif +#define __UAPI_DEF_SOCKADDR_IN6 0 +#define __UAPI_DEF_IPV6_MREQ 0 +#define __UAPI_DEF_IPPROTO_V6 0 +#define __UAPI_DEF_IPV6_OPTIONS 0 +#define __UAPI_DEF_IN6_PKTINFO 0 +#define __UAPI_DEF_IP6_MTUINFO 0 + +#else + +/* Linux headers included first, and we must define everything + * we need. The expectation is that glibc will check the + * __UAPI_DEF_* defines and adjust appropriately. */ +#define __UAPI_DEF_IN_ADDR 1 +#define __UAPI_DEF_IN_IPPROTO 1 +#define __UAPI_DEF_IN_PKTINFO 1 +#define __UAPI_DEF_IP_MREQ 1 +#define __UAPI_DEF_SOCKADDR_IN 1 +#define __UAPI_DEF_IN_CLASS 1 + +#define __UAPI_DEF_IN6_ADDR 1 +/* We unconditionally define the in6_addr macros and glibc must + * coordinate. */ +#define __UAPI_DEF_IN6_ADDR_ALT 1 +#define __UAPI_DEF_SOCKADDR_IN6 1 +#define __UAPI_DEF_IPV6_MREQ 1 +#define __UAPI_DEF_IPPROTO_V6 1 +#define __UAPI_DEF_IPV6_OPTIONS 1 +#define __UAPI_DEF_IN6_PKTINFO 1 +#define __UAPI_DEF_IP6_MTUINFO 1 + +#endif /* _NETINET_IN_H */ + +/* Coordinate with glibc netipx/ipx.h header. */ +#if defined(__NETIPX_IPX_H) + +#define __UAPI_DEF_SOCKADDR_IPX 0 +#define __UAPI_DEF_IPX_ROUTE_DEFINITION 0 +#define __UAPI_DEF_IPX_INTERFACE_DEFINITION 0 +#define __UAPI_DEF_IPX_CONFIG_DATA 0 +#define __UAPI_DEF_IPX_ROUTE_DEF 0 + +#else /* defined(__NETIPX_IPX_H) */ + +#define __UAPI_DEF_SOCKADDR_IPX 1 +#define __UAPI_DEF_IPX_ROUTE_DEFINITION 1 +#define __UAPI_DEF_IPX_INTERFACE_DEFINITION 1 +#define __UAPI_DEF_IPX_CONFIG_DATA 1 +#define __UAPI_DEF_IPX_ROUTE_DEF 1 + +#endif /* defined(__NETIPX_IPX_H) */ + +/* Definitions for xattr.h */ +#if defined(_SYS_XATTR_H) +#define __UAPI_DEF_XATTR 0 +#else +#define __UAPI_DEF_XATTR 1 +#endif + +/* If we did not see any headers from any supported C libraries, + * or we are being included in the kernel, then define everything + * that we need. Check for previous __UAPI_* definitions to give + * unsupported C libraries a way to opt out of any kernel definition. */ +#else /* !defined(__GLIBC__) */ + +/* Definitions for if.h */ +#ifndef __UAPI_DEF_IF_IFCONF +#define __UAPI_DEF_IF_IFCONF 1 +#endif +#ifndef __UAPI_DEF_IF_IFMAP +#define __UAPI_DEF_IF_IFMAP 1 +#endif +#ifndef __UAPI_DEF_IF_IFNAMSIZ +#define __UAPI_DEF_IF_IFNAMSIZ 1 +#endif +#ifndef __UAPI_DEF_IF_IFREQ +#define __UAPI_DEF_IF_IFREQ 1 +#endif +/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ +#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 +#endif +/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ +#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 +#endif + +/* Definitions for in.h */ +#ifndef __UAPI_DEF_IN_ADDR +#define __UAPI_DEF_IN_ADDR 1 +#endif +#ifndef __UAPI_DEF_IN_IPPROTO +#define __UAPI_DEF_IN_IPPROTO 1 +#endif +#ifndef __UAPI_DEF_IN_PKTINFO +#define __UAPI_DEF_IN_PKTINFO 1 +#endif +#ifndef __UAPI_DEF_IP_MREQ +#define __UAPI_DEF_IP_MREQ 1 +#endif +#ifndef __UAPI_DEF_SOCKADDR_IN +#define __UAPI_DEF_SOCKADDR_IN 1 +#endif +#ifndef __UAPI_DEF_IN_CLASS +#define __UAPI_DEF_IN_CLASS 1 +#endif + +/* Definitions for in6.h */ +#ifndef __UAPI_DEF_IN6_ADDR +#define __UAPI_DEF_IN6_ADDR 1 +#endif +#ifndef __UAPI_DEF_IN6_ADDR_ALT +#define __UAPI_DEF_IN6_ADDR_ALT 1 +#endif +#ifndef __UAPI_DEF_SOCKADDR_IN6 +#define __UAPI_DEF_SOCKADDR_IN6 1 +#endif +#ifndef __UAPI_DEF_IPV6_MREQ +#define __UAPI_DEF_IPV6_MREQ 1 +#endif +#ifndef __UAPI_DEF_IPPROTO_V6 +#define __UAPI_DEF_IPPROTO_V6 1 +#endif +#ifndef __UAPI_DEF_IPV6_OPTIONS +#define __UAPI_DEF_IPV6_OPTIONS 1 +#endif +#ifndef __UAPI_DEF_IN6_PKTINFO +#define __UAPI_DEF_IN6_PKTINFO 1 +#endif +#ifndef __UAPI_DEF_IP6_MTUINFO +#define __UAPI_DEF_IP6_MTUINFO 1 +#endif + +/* Definitions for ipx.h */ +#ifndef __UAPI_DEF_SOCKADDR_IPX +#define __UAPI_DEF_SOCKADDR_IPX 1 +#endif +#ifndef __UAPI_DEF_IPX_ROUTE_DEFINITION +#define __UAPI_DEF_IPX_ROUTE_DEFINITION 1 +#endif +#ifndef __UAPI_DEF_IPX_INTERFACE_DEFINITION +#define __UAPI_DEF_IPX_INTERFACE_DEFINITION 1 +#endif +#ifndef __UAPI_DEF_IPX_CONFIG_DATA +#define __UAPI_DEF_IPX_CONFIG_DATA 1 +#endif +#ifndef __UAPI_DEF_IPX_ROUTE_DEF +#define __UAPI_DEF_IPX_ROUTE_DEF 1 +#endif + +/* Definitions for xattr.h */ +#ifndef __UAPI_DEF_XATTR +#define __UAPI_DEF_XATTR 1 +#endif + +#endif /* __GLIBC__ */ + +#endif /* _UAPI_LIBC_COMPAT_H */ diff --git a/src/basic/linux/netlink.h b/src/basic/linux/netlink.h new file mode 100644 index 00000000000..0a4d7331775 --- /dev/null +++ b/src/basic/linux/netlink.h @@ -0,0 +1,252 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI__LINUX_NETLINK_H +#define _UAPI__LINUX_NETLINK_H + +#include <linux/kernel.h> +#include <linux/socket.h> /* for __kernel_sa_family_t */ +#include <linux/types.h> + +#define NETLINK_ROUTE 0 /* Routing/device hook */ +#define NETLINK_UNUSED 1 /* Unused number */ +#define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */ +#define NETLINK_FIREWALL 3 /* Unused number, formerly ip_queue */ +#define NETLINK_SOCK_DIAG 4 /* socket monitoring */ +#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */ +#define NETLINK_XFRM 6 /* ipsec */ +#define NETLINK_SELINUX 7 /* SELinux event notifications */ +#define NETLINK_ISCSI 8 /* Open-iSCSI */ +#define NETLINK_AUDIT 9 /* auditing */ +#define NETLINK_FIB_LOOKUP 10 +#define NETLINK_CONNECTOR 11 +#define NETLINK_NETFILTER 12 /* netfilter subsystem */ +#define NETLINK_IP6_FW 13 +#define NETLINK_DNRTMSG 14 /* DECnet routing messages */ +#define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */ +#define NETLINK_GENERIC 16 +/* leave room for NETLINK_DM (DM Events) */ +#define NETLINK_SCSITRANSPORT 18 /* SCSI Transports */ +#define NETLINK_ECRYPTFS 19 +#define NETLINK_RDMA 20 +#define NETLINK_CRYPTO 21 /* Crypto layer */ +#define NETLINK_SMC 22 /* SMC monitoring */ + +#define NETLINK_INET_DIAG NETLINK_SOCK_DIAG + +#define MAX_LINKS 32 + +struct sockaddr_nl { + __kernel_sa_family_t nl_family; /* AF_NETLINK */ + unsigned short nl_pad; /* zero */ + __u32 nl_pid; /* port ID */ + __u32 nl_groups; /* multicast groups mask */ +}; + +struct nlmsghdr { + __u32 nlmsg_len; /* Length of message including header */ + __u16 nlmsg_type; /* Message content */ + __u16 nlmsg_flags; /* Additional flags */ + __u32 nlmsg_seq; /* Sequence number */ + __u32 nlmsg_pid; /* Sending process port ID */ +}; + +/* Flags values */ + +#define NLM_F_REQUEST 0x01 /* It is request message. */ +#define NLM_F_MULTI 0x02 /* Multipart message, terminated by NLMSG_DONE */ +#define NLM_F_ACK 0x04 /* Reply with ack, with zero or error code */ +#define NLM_F_ECHO 0x08 /* Echo this request */ +#define NLM_F_DUMP_INTR 0x10 /* Dump was inconsistent due to sequence change */ +#define NLM_F_DUMP_FILTERED 0x20 /* Dump was filtered as requested */ + +/* Modifiers to GET request */ +#define NLM_F_ROOT 0x100 /* specify tree root */ +#define NLM_F_MATCH 0x200 /* return all matching */ +#define NLM_F_ATOMIC 0x400 /* atomic GET */ +#define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH) + +/* Modifiers to NEW request */ +#define NLM_F_REPLACE 0x100 /* Override existing */ +#define NLM_F_EXCL 0x200 /* Do not touch, if it exists */ +#define NLM_F_CREATE 0x400 /* Create, if it does not exist */ +#define NLM_F_APPEND 0x800 /* Add to end of list */ + +/* Modifiers to DELETE request */ +#define NLM_F_NONREC 0x100 /* Do not delete recursively */ + +/* Flags for ACK message */ +#define NLM_F_CAPPED 0x100 /* request was capped */ +#define NLM_F_ACK_TLVS 0x200 /* extended ACK TVLs were included */ + +/* + 4.4BSD ADD NLM_F_CREATE|NLM_F_EXCL + 4.4BSD CHANGE NLM_F_REPLACE + + True CHANGE NLM_F_CREATE|NLM_F_REPLACE + Append NLM_F_CREATE + Check NLM_F_EXCL + */ + +#define NLMSG_ALIGNTO 4U +#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) ) +#define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr))) +#define NLMSG_LENGTH(len) ((len) + NLMSG_HDRLEN) +#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len)) +#define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0))) +#define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \ + (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len))) +#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \ + (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \ + (nlh)->nlmsg_len <= (len)) +#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len))) + +#define NLMSG_NOOP 0x1 /* Nothing. */ +#define NLMSG_ERROR 0x2 /* Error */ +#define NLMSG_DONE 0x3 /* End of a dump */ +#define NLMSG_OVERRUN 0x4 /* Data lost */ + +#define NLMSG_MIN_TYPE 0x10 /* < 0x10: reserved control messages */ + +struct nlmsgerr { + int error; + struct nlmsghdr msg; + /* + * followed by the message contents unless NETLINK_CAP_ACK was set + * or the ACK indicates success (error == 0) + * message length is aligned with NLMSG_ALIGN() + */ + /* + * followed by TLVs defined in enum nlmsgerr_attrs + * if NETLINK_EXT_ACK was set + */ +}; + +/** + * enum nlmsgerr_attrs - nlmsgerr attributes + * @NLMSGERR_ATTR_UNUSED: unused + * @NLMSGERR_ATTR_MSG: error message string (string) + * @NLMSGERR_ATTR_OFFS: offset of the invalid attribute in the original + * message, counting from the beginning of the header (u32) + * @NLMSGERR_ATTR_COOKIE: arbitrary subsystem specific cookie to + * be used - in the success case - to identify a created + * object or operation or similar (binary) + * @__NLMSGERR_ATTR_MAX: number of attributes + * @NLMSGERR_ATTR_MAX: highest attribute number + */ +enum nlmsgerr_attrs { + NLMSGERR_ATTR_UNUSED, + NLMSGERR_ATTR_MSG, + NLMSGERR_ATTR_OFFS, + NLMSGERR_ATTR_COOKIE, + + __NLMSGERR_ATTR_MAX, + NLMSGERR_ATTR_MAX = __NLMSGERR_ATTR_MAX - 1 +}; + +#define NETLINK_ADD_MEMBERSHIP 1 +#define NETLINK_DROP_MEMBERSHIP 2 +#define NETLINK_PKTINFO 3 +#define NETLINK_BROADCAST_ERROR 4 +#define NETLINK_NO_ENOBUFS 5 +#ifndef __KERNEL__ +#define NETLINK_RX_RING 6 +#define NETLINK_TX_RING 7 +#endif +#define NETLINK_LISTEN_ALL_NSID 8 +#define NETLINK_LIST_MEMBERSHIPS 9 +#define NETLINK_CAP_ACK 10 +#define NETLINK_EXT_ACK 11 +#define NETLINK_GET_STRICT_CHK 12 + +struct nl_pktinfo { + __u32 group; +}; + +struct nl_mmap_req { + unsigned int nm_block_size; + unsigned int nm_block_nr; + unsigned int nm_frame_size; + unsigned int nm_frame_nr; +}; + +struct nl_mmap_hdr { + unsigned int nm_status; + unsigned int nm_len; + __u32 nm_group; + /* credentials */ + __u32 nm_pid; + __u32 nm_uid; + __u32 nm_gid; +}; + +#ifndef __KERNEL__ +enum nl_mmap_status { + NL_MMAP_STATUS_UNUSED, + NL_MMAP_STATUS_RESERVED, + NL_MMAP_STATUS_VALID, + NL_MMAP_STATUS_COPY, + NL_MMAP_STATUS_SKIP, +}; + +#define NL_MMAP_MSG_ALIGNMENT NLMSG_ALIGNTO +#define NL_MMAP_MSG_ALIGN(sz) __ALIGN_KERNEL(sz, NL_MMAP_MSG_ALIGNMENT) +#define NL_MMAP_HDRLEN NL_MMAP_MSG_ALIGN(sizeof(struct nl_mmap_hdr)) +#endif + +#define NET_MAJOR 36 /* Major 36 is reserved for networking */ + +enum { + NETLINK_UNCONNECTED = 0, + NETLINK_CONNECTED, +}; + +/* + * <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)--> + * +---------------------+- - -+- - - - - - - - - -+- - -+ + * | Header | Pad | Payload | Pad | + * | (struct nlattr) | ing | | ing | + * +---------------------+- - -+- - - - - - - - - -+- - -+ + * <-------------- nlattr->nla_len --------------> + */ + +struct nlattr { + __u16 nla_len; + __u16 nla_type; +}; + +/* + * nla_type (16 bits) + * +---+---+-------------------------------+ + * | N | O | Attribute Type | + * +---+---+-------------------------------+ + * N := Carries nested attributes + * O := Payload stored in network byte order + * + * Note: The N and O flag are mutually exclusive. + */ +#define NLA_F_NESTED (1 << 15) +#define NLA_F_NET_BYTEORDER (1 << 14) +#define NLA_TYPE_MASK ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER) + +#define NLA_ALIGNTO 4 +#define NLA_ALIGN(len) (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1)) +#define NLA_HDRLEN ((int) NLA_ALIGN(sizeof(struct nlattr))) + +/* Generic 32 bitflags attribute content sent to the kernel. + * + * The value is a bitmap that defines the values being set + * The selector is a bitmask that defines which value is legit + * + * Examples: + * value = 0x0, and selector = 0x1 + * implies we are selecting bit 1 and we want to set its value to 0. + * + * value = 0x2, and selector = 0x2 + * implies we are selecting bit 2 and we want to set its value to 1. + * + */ +struct nla_bitfield32 { + __u32 value; + __u32 selector; +}; + +#endif /* _UAPI__LINUX_NETLINK_H */ diff --git a/src/basic/linux/rtnetlink.h b/src/basic/linux/rtnetlink.h new file mode 100644 index 00000000000..46399367627 --- /dev/null +++ b/src/basic/linux/rtnetlink.h @@ -0,0 +1,751 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI__LINUX_RTNETLINK_H +#define _UAPI__LINUX_RTNETLINK_H + +#include <linux/types.h> +#include <linux/netlink.h> +#include <linux/if_link.h> +#include <linux/if_addr.h> +#include <linux/neighbour.h> + +/* rtnetlink families. Values up to 127 are reserved for real address + * families, values above 128 may be used arbitrarily. + */ +#define RTNL_FAMILY_IPMR 128 +#define RTNL_FAMILY_IP6MR 129 +#define RTNL_FAMILY_MAX 129 + +/**** + * Routing/neighbour discovery messages. + ****/ + +/* Types of messages */ + +enum { + RTM_BASE = 16, +#define RTM_BASE RTM_BASE + + RTM_NEWLINK = 16, +#define RTM_NEWLINK RTM_NEWLINK + RTM_DELLINK, +#define RTM_DELLINK RTM_DELLINK + RTM_GETLINK, +#define RTM_GETLINK RTM_GETLINK + RTM_SETLINK, +#define RTM_SETLINK RTM_SETLINK + + RTM_NEWADDR = 20, +#define RTM_NEWADDR RTM_NEWADDR + RTM_DELADDR, +#define RTM_DELADDR RTM_DELADDR + RTM_GETADDR, +#define RTM_GETADDR RTM_GETADDR + + RTM_NEWROUTE = 24, +#define RTM_NEWROUTE RTM_NEWROUTE + RTM_DELROUTE, +#define RTM_DELROUTE RTM_DELROUTE + RTM_GETROUTE, +#define RTM_GETROUTE RTM_GETROUTE + + RTM_NEWNEIGH = 28, +#define RTM_NEWNEIGH RTM_NEWNEIGH + RTM_DELNEIGH, +#define RTM_DELNEIGH RTM_DELNEIGH + RTM_GETNEIGH, +#define RTM_GETNEIGH RTM_GETNEIGH + + RTM_NEWRULE = 32, +#define RTM_NEWRULE RTM_NEWRULE + RTM_DELRULE, +#define RTM_DELRULE RTM_DELRULE + RTM_GETRULE, +#define RTM_GETRULE RTM_GETRULE + + RTM_NEWQDISC = 36, +#define RTM_NEWQDISC RTM_NEWQDISC + RTM_DELQDISC, +#define RTM_DELQDISC RTM_DELQDISC + RTM_GETQDISC, +#define RTM_GETQDISC RTM_GETQDISC + + RTM_NEWTCLASS = 40, +#define RTM_NEWTCLASS RTM_NEWTCLASS + RTM_DELTCLASS, +#define RTM_DELTCLASS RTM_DELTCLASS + RTM_GETTCLASS, +#define RTM_GETTCLASS RTM_GETTCLASS + + RTM_NEWTFILTER = 44, +#define RTM_NEWTFILTER RTM_NEWTFILTER + RTM_DELTFILTER, +#define RTM_DELTFILTER RTM_DELTFILTER + RTM_GETTFILTER, +#define RTM_GETTFILTER RTM_GETTFILTER + + RTM_NEWACTION = 48, +#define RTM_NEWACTION RTM_NEWACTION + RTM_DELACTION, +#define RTM_DELACTION RTM_DELACTION + RTM_GETACTION, +#define RTM_GETACTION RTM_GETACTION + + RTM_NEWPREFIX = 52, +#define RTM_NEWPREFIX RTM_NEWPREFIX + + RTM_GETMULTICAST = 58, +#define RTM_GETMULTICAST RTM_GETMULTICAST + + RTM_GETANYCAST = 62, +#define RTM_GETANYCAST RTM_GETANYCAST + + RTM_NEWNEIGHTBL = 64, +#define RTM_NEWNEIGHTBL RTM_NEWNEIGHTBL + RTM_GETNEIGHTBL = 66, +#define RTM_GETNEIGHTBL RTM_GETNEIGHTBL + RTM_SETNEIGHTBL, +#define RTM_SETNEIGHTBL RTM_SETNEIGHTBL + + RTM_NEWNDUSEROPT = 68, +#define RTM_NEWNDUSEROPT RTM_NEWNDUSEROPT + + RTM_NEWADDRLABEL = 72, +#define RTM_NEWADDRLABEL RTM_NEWADDRLABEL + RTM_DELADDRLABEL, +#define RTM_DELADDRLABEL RTM_DELADDRLABEL + RTM_GETADDRLABEL, +#define RTM_GETADDRLABEL RTM_GETADDRLABEL + + RTM_GETDCB = 78, +#define RTM_GETDCB RTM_GETDCB + RTM_SETDCB, +#define RTM_SETDCB RTM_SETDCB + + RTM_NEWNETCONF = 80, +#define RTM_NEWNETCONF RTM_NEWNETCONF + RTM_DELNETCONF, +#define RTM_DELNETCONF RTM_DELNETCONF + RTM_GETNETCONF = 82, +#define RTM_GETNETCONF RTM_GETNETCONF + + RTM_NEWMDB = 84, +#define RTM_NEWMDB RTM_NEWMDB + RTM_DELMDB = 85, +#define RTM_DELMDB RTM_DELMDB + RTM_GETMDB = 86, +#define RTM_GETMDB RTM_GETMDB + + RTM_NEWNSID = 88, +#define RTM_NEWNSID RTM_NEWNSID + RTM_DELNSID = 89, +#define RTM_DELNSID RTM_DELNSID + RTM_GETNSID = 90, +#define RTM_GETNSID RTM_GETNSID + + RTM_NEWSTATS = 92, +#define RTM_NEWSTATS RTM_NEWSTATS + RTM_GETSTATS = 94, +#define RTM_GETSTATS RTM_GETSTATS + + RTM_NEWCACHEREPORT = 96, +#define RTM_NEWCACHEREPORT RTM_NEWCACHEREPORT + + RTM_NEWCHAIN = 100, +#define RTM_NEWCHAIN RTM_NEWCHAIN + RTM_DELCHAIN, +#define RTM_DELCHAIN RTM_DELCHAIN + RTM_GETCHAIN, +#define RTM_GETCHAIN RTM_GETCHAIN + + __RTM_MAX, +#define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1) +}; + +#define RTM_NR_MSGTYPES (RTM_MAX + 1 - RTM_BASE) +#define RTM_NR_FAMILIES (RTM_NR_MSGTYPES >> 2) +#define RTM_FAM(cmd) (((cmd) - RTM_BASE) >> 2) + +/* + Generic structure for encapsulation of optional route information. + It is reminiscent of sockaddr, but with sa_family replaced + with attribute type. + */ + +struct rtattr { + unsigned short rta_len; + unsigned short rta_type; +}; + +/* Macros to handle rtattributes */ + +#define RTA_ALIGNTO 4U +#define RTA_ALIGN(len) ( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) ) +#define RTA_OK(rta,len) ((len) >= (int)sizeof(struct rtattr) && \ + (rta)->rta_len >= sizeof(struct rtattr) && \ + (rta)->rta_len <= (len)) +#define RTA_NEXT(rta,attrlen) ((attrlen) -= RTA_ALIGN((rta)->rta_len), \ + (struct rtattr*)(((char*)(rta)) + RTA_ALIGN((rta)->rta_len))) +#define RTA_LENGTH(len) (RTA_ALIGN(sizeof(struct rtattr)) + (len)) +#define RTA_SPACE(len) RTA_ALIGN(RTA_LENGTH(len)) +#define RTA_DATA(rta) ((void*)(((char*)(rta)) + RTA_LENGTH(0))) +#define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0)) + + + + +/****************************************************************************** + * Definitions used in routing table administration. + ****/ + +struct rtmsg { + unsigned char rtm_family; + unsigned char rtm_dst_len; + unsigned char rtm_src_len; + unsigned char rtm_tos; + + unsigned char rtm_table; /* Routing table id */ + unsigned char rtm_protocol; /* Routing protocol; see below */ + unsigned char rtm_scope; /* See below */ + unsigned char rtm_type; /* See below */ + + unsigned rtm_flags; +}; + +/* rtm_type */ + +enum { + RTN_UNSPEC, + RTN_UNICAST, /* Gateway or direct route */ + RTN_LOCAL, /* Accept locally */ + RTN_BROADCAST, /* Accept locally as broadcast, + send as broadcast */ + RTN_ANYCAST, /* Accept locally as broadcast, + but send as unicast */ + RTN_MULTICAST, /* Multicast route */ + RTN_BLACKHOLE, /* Drop */ + RTN_UNREACHABLE, /* Destination is unreachable */ + RTN_PROHIBIT, /* Administratively prohibited */ + RTN_THROW, /* Not in this table */ + RTN_NAT, /* Translate this address */ + RTN_XRESOLVE, /* Use external resolver */ + __RTN_MAX +}; + +#define RTN_MAX (__RTN_MAX - 1) + + +/* rtm_protocol */ + +#define RTPROT_UNSPEC 0 +#define RTPROT_REDIRECT 1 /* Route installed by ICMP redirects; + not used by current IPv4 */ +#define RTPROT_KERNEL 2 /* Route installed by kernel */ +#define RTPROT_BOOT 3 /* Route installed during boot */ +#define RTPROT_STATIC 4 /* Route installed by administrator */ + +/* Values of protocol >= RTPROT_STATIC are not interpreted by kernel; + they are just passed from user and back as is. + It will be used by hypothetical multiple routing daemons. + Note that protocol values should be standardized in order to + avoid conflicts. + */ + +#define RTPROT_GATED 8 /* Apparently, GateD */ +#define RTPROT_RA 9 /* RDISC/ND router advertisements */ +#define RTPROT_MRT 10 /* Merit MRT */ +#define RTPROT_ZEBRA 11 /* Zebra */ +#define RTPROT_BIRD 12 /* BIRD */ +#define RTPROT_DNROUTED 13 /* DECnet routing daemon */ +#define RTPROT_XORP 14 /* XORP */ +#define RTPROT_NTK 15 /* Netsukuku */ +#define RTPROT_DHCP 16 /* DHCP client */ +#define RTPROT_MROUTED 17 /* Multicast daemon */ +#define RTPROT_BABEL 42 /* Babel daemon */ +#define RTPROT_BGP 186 /* BGP Routes */ +#define RTPROT_ISIS 187 /* ISIS Routes */ +#define RTPROT_OSPF 188 /* OSPF Routes */ +#define RTPROT_RIP 189 /* RIP Routes */ +#define RTPROT_EIGRP 192 /* EIGRP Routes */ + +/* rtm_scope + + Really it is not scope, but sort of distance to the destination. + NOWHERE are reserved for not existing destinations, HOST is our + local addresses, LINK are destinations, located on directly attached + link and UNIVERSE is everywhere in the Universe. + + Intermediate values are also possible f.e. interior routes + could be assigned a value between UNIVERSE and LINK. +*/ + +enum rt_scope_t { + RT_SCOPE_UNIVERSE=0, +/* User defined values */ + RT_SCOPE_SITE=200, + RT_SCOPE_LINK=253, + RT_SCOPE_HOST=254, + RT_SCOPE_NOWHERE=255 +}; + +/* rtm_flags */ + +#define RTM_F_NOTIFY 0x100 /* Notify user of route change */ +#define RTM_F_CLONED 0x200 /* This route is cloned */ +#define RTM_F_EQUALIZE 0x400 /* Multipath equalizer: NI */ +#define RTM_F_PREFIX 0x800 /* Prefix addresses */ +#define RTM_F_LOOKUP_TABLE 0x1000 /* set rtm_table to FIB lookup result */ +#define RTM_F_FIB_MATCH 0x2000 /* return full fib lookup match */ + +/* Reserved table identifiers */ + +enum rt_class_t { + RT_TABLE_UNSPEC=0, +/* User defined values */ + RT_TABLE_COMPAT=252, + RT_TABLE_DEFAULT=253, + RT_TABLE_MAIN=254, + RT_TABLE_LOCAL=255, + RT_TABLE_MAX=0xFFFFFFFF +}; + + +/* Routing message attributes */ + +enum rtattr_type_t { + RTA_UNSPEC, + RTA_DST, + RTA_SRC, + RTA_IIF, + RTA_OIF, + RTA_GATEWAY, + RTA_PRIORITY, + RTA_PREFSRC, + RTA_METRICS, + RTA_MULTIPATH, + RTA_PROTOINFO, /* no longer used */ + RTA_FLOW, + RTA_CACHEINFO, + RTA_SESSION, /* no longer used */ + RTA_MP_ALGO, /* no longer used */ + RTA_TABLE, + RTA_MARK, + RTA_MFC_STATS, + RTA_VIA, + RTA_NEWDST, + RTA_PREF, + RTA_ENCAP_TYPE, + RTA_ENCAP, + RTA_EXPIRES, + RTA_PAD, + RTA_UID, + RTA_TTL_PROPAGATE, + RTA_IP_PROTO, + RTA_SPORT, + RTA_DPORT, + __RTA_MAX +}; + +#define RTA_MAX (__RTA_MAX - 1) + +#define RTM_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtmsg)))) +#define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtmsg)) + +/* RTM_MULTIPATH --- array of struct rtnexthop. + * + * "struct rtnexthop" describes all necessary nexthop information, + * i.e. parameters of path to a destination via this nexthop. + * + * At the moment it is impossible to set different prefsrc, mtu, window + * and rtt for different paths from multipath. + */ + +struct rtnexthop { + unsigned short rtnh_len; + unsigned char rtnh_flags; + unsigned char rtnh_hops; + int rtnh_ifindex; +}; + +/* rtnh_flags */ + +#define RTNH_F_DEAD 1 /* Nexthop is dead (used by multipath) */ +#define RTNH_F_PERVASIVE 2 /* Do recursive gateway lookup */ +#define RTNH_F_ONLINK 4 /* Gateway is forced on link */ +#define RTNH_F_OFFLOAD 8 /* offloaded route */ +#define RTNH_F_LINKDOWN 16 /* carrier-down on nexthop */ +#define RTNH_F_UNRESOLVED 32 /* The entry is unresolved (ipmr) */ + +#define RTNH_COMPARE_MASK (RTNH_F_DEAD | RTNH_F_LINKDOWN | RTNH_F_OFFLOAD) + +/* Macros to handle hexthops */ + +#define RTNH_ALIGNTO 4 +#define RTNH_ALIGN(len) ( ((len)+RTNH_ALIGNTO-1) & ~(RTNH_ALIGNTO-1) ) +#define RTNH_OK(rtnh,len) ((rtnh)->rtnh_len >= sizeof(struct rtnexthop) && \ + ((int)(rtnh)->rtnh_len) <= (len)) +#define RTNH_NEXT(rtnh) ((struct rtnexthop*)(((char*)(rtnh)) + RTNH_ALIGN((rtnh)->rtnh_len))) +#define RTNH_LENGTH(len) (RTNH_ALIGN(sizeof(struct rtnexthop)) + (len)) +#define RTNH_SPACE(len) RTNH_ALIGN(RTNH_LENGTH(len)) +#define RTNH_DATA(rtnh) ((struct rtattr*)(((char*)(rtnh)) + RTNH_LENGTH(0))) + +/* RTA_VIA */ +struct rtvia { + __kernel_sa_family_t rtvia_family; + __u8 rtvia_addr[0]; +}; + +/* RTM_CACHEINFO */ + +struct rta_cacheinfo { + __u32 rta_clntref; + __u32 rta_lastuse; + __s32 rta_expires; + __u32 rta_error; + __u32 rta_used; + +#define RTNETLINK_HAVE_PEERINFO 1 + __u32 rta_id; + __u32 rta_ts; + __u32 rta_tsage; +}; + +/* RTM_METRICS --- array of struct rtattr with types of RTAX_* */ + +enum { + RTAX_UNSPEC, +#define RTAX_UNSPEC RTAX_UNSPEC + RTAX_LOCK, +#define RTAX_LOCK RTAX_LOCK + RTAX_MTU, +#define RTAX_MTU RTAX_MTU + RTAX_WINDOW, +#define RTAX_WINDOW RTAX_WINDOW + RTAX_RTT, +#define RTAX_RTT RTAX_RTT + RTAX_RTTVAR, +#define RTAX_RTTVAR RTAX_RTTVAR + RTAX_SSTHRESH, +#define RTAX_SSTHRESH RTAX_SSTHRESH + RTAX_CWND, +#define RTAX_CWND RTAX_CWND + RTAX_ADVMSS, +#define RTAX_ADVMSS RTAX_ADVMSS + RTAX_REORDERING, +#define RTAX_REORDERING RTAX_REORDERING + RTAX_HOPLIMIT, +#define RTAX_HOPLIMIT RTAX_HOPLIMIT + RTAX_INITCWND, +#define RTAX_INITCWND RTAX_INITCWND + RTAX_FEATURES, +#define RTAX_FEATURES RTAX_FEATURES + RTAX_RTO_MIN, +#define RTAX_RTO_MIN RTAX_RTO_MIN + RTAX_INITRWND, +#define RTAX_INITRWND RTAX_INITRWND + RTAX_QUICKACK, +#define RTAX_QUICKACK RTAX_QUICKACK + RTAX_CC_ALGO, +#define RTAX_CC_ALGO RTAX_CC_ALGO + RTAX_FASTOPEN_NO_COOKIE, +#define RTAX_FASTOPEN_NO_COOKIE RTAX_FASTOPEN_NO_COOKIE + __RTAX_MAX +}; + +#define RTAX_MAX (__RTAX_MAX - 1) + +#define RTAX_FEATURE_ECN (1 << 0) +#define RTAX_FEATURE_SACK (1 << 1) +#define RTAX_FEATURE_TIMESTAMP (1 << 2) +#define RTAX_FEATURE_ALLFRAG (1 << 3) + +#define RTAX_FEATURE_MASK (RTAX_FEATURE_ECN | RTAX_FEATURE_SACK | \ + RTAX_FEATURE_TIMESTAMP | RTAX_FEATURE_ALLFRAG) + +struct rta_session { + __u8 proto; + __u8 pad1; + __u16 pad2; + + union { + struct { + __u16 sport; + __u16 dport; + } ports; + + struct { + __u8 type; + __u8 code; + __u16 ident; + } icmpt; + + __u32 spi; + } u; +}; + +struct rta_mfc_stats { + __u64 mfcs_packets; + __u64 mfcs_bytes; + __u64 mfcs_wrong_if; +}; + +/**** + * General form of address family dependent message. + ****/ + +struct rtgenmsg { + unsigned char rtgen_family; +}; + +/***************************************************************** + * Link layer specific messages. + ****/ + +/* struct ifinfomsg + * passes link level specific information, not dependent + * on network protocol. + */ + +struct ifinfomsg { + unsigned char ifi_family; + unsigned char __ifi_pad; + unsigned short ifi_type; /* ARPHRD_* */ + int ifi_index; /* Link index */ + unsigned ifi_flags; /* IFF_* flags */ + unsigned ifi_change; /* IFF_* change mask */ +}; + +/******************************************************************** + * prefix information + ****/ + +struct prefixmsg { + unsigned char prefix_family; + unsigned char prefix_pad1; + unsigned short prefix_pad2; + int prefix_ifindex; + unsigned char prefix_type; + unsigned char prefix_len; + unsigned char prefix_flags; + unsigned char prefix_pad3; +}; + +enum +{ + PREFIX_UNSPEC, + PREFIX_ADDRESS, + PREFIX_CACHEINFO, + __PREFIX_MAX +}; + +#define PREFIX_MAX (__PREFIX_MAX - 1) + +struct prefix_cacheinfo { + __u32 preferred_time; + __u32 valid_time; +}; + + +/***************************************************************** + * Traffic control messages. + ****/ + +struct tcmsg { + unsigned char tcm_family; + unsigned char tcm__pad1; + unsigned short tcm__pad2; + int tcm_ifindex; + __u32 tcm_handle; + __u32 tcm_parent; +/* tcm_block_index is used instead of tcm_parent + * in case tcm_ifindex == TCM_IFINDEX_MAGIC_BLOCK + */ +#define tcm_block_index tcm_parent + __u32 tcm_info; +}; + +/* For manipulation of filters in shared block, tcm_ifindex is set to + * TCM_IFINDEX_MAGIC_BLOCK, and tcm_parent is aliased to tcm_block_index + * which is the block index. + */ +#define TCM_IFINDEX_MAGIC_BLOCK (0xFFFFFFFFU) + +enum { + TCA_UNSPEC, + TCA_KIND, + TCA_OPTIONS, + TCA_STATS, + TCA_XSTATS, + TCA_RATE, + TCA_FCNT, + TCA_STATS2, + TCA_STAB, + TCA_PAD, + TCA_DUMP_INVISIBLE, + TCA_CHAIN, + TCA_HW_OFFLOAD, + TCA_INGRESS_BLOCK, + TCA_EGRESS_BLOCK, + __TCA_MAX +}; + +#define TCA_MAX (__TCA_MAX - 1) + +#define TCA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg)))) +#define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg)) + +/******************************************************************** + * Neighbor Discovery userland options + ****/ + +struct nduseroptmsg { + unsigned char nduseropt_family; + unsigned char nduseropt_pad1; + unsigned short nduseropt_opts_len; /* Total length of options */ + int nduseropt_ifindex; + __u8 nduseropt_icmp_type; + __u8 nduseropt_icmp_code; + unsigned short nduseropt_pad2; + unsigned int nduseropt_pad3; + /* Followed by one or more ND options */ +}; + +enum { + NDUSEROPT_UNSPEC, + NDUSEROPT_SRCADDR, + __NDUSEROPT_MAX +}; + +#define NDUSEROPT_MAX (__NDUSEROPT_MAX - 1) + +#ifndef __KERNEL__ +/* RTnetlink multicast groups - backwards compatibility for userspace */ +#define RTMGRP_LINK 1 +#define RTMGRP_NOTIFY 2 +#define RTMGRP_NEIGH 4 +#define RTMGRP_TC 8 + +#define RTMGRP_IPV4_IFADDR 0x10 +#define RTMGRP_IPV4_MROUTE 0x20 +#define RTMGRP_IPV4_ROUTE 0x40 +#define RTMGRP_IPV4_RULE 0x80 + +#define RTMGRP_IPV6_IFADDR 0x100 +#define RTMGRP_IPV6_MROUTE 0x200 +#define RTMGRP_IPV6_ROUTE 0x400 +#define RTMGRP_IPV6_IFINFO 0x800 + +#define RTMGRP_DECnet_IFADDR 0x1000 +#define RTMGRP_DECnet_ROUTE 0x4000 + +#define RTMGRP_IPV6_PREFIX 0x20000 +#endif + +/* RTnetlink multicast groups */ +enum rtnetlink_groups { + RTNLGRP_NONE, +#define RTNLGRP_NONE RTNLGRP_NONE + RTNLGRP_LINK, +#define RTNLGRP_LINK RTNLGRP_LINK + RTNLGRP_NOTIFY, +#define RTNLGRP_NOTIFY RTNLGRP_NOTIFY + RTNLGRP_NEIGH, +#define RTNLGRP_NEIGH RTNLGRP_NEIGH + RTNLGRP_TC, +#define RTNLGRP_TC RTNLGRP_TC + RTNLGRP_IPV4_IFADDR, +#define RTNLGRP_IPV4_IFADDR RTNLGRP_IPV4_IFADDR + RTNLGRP_IPV4_MROUTE, +#define RTNLGRP_IPV4_MROUTE RTNLGRP_IPV4_MROUTE + RTNLGRP_IPV4_ROUTE, +#define RTNLGRP_IPV4_ROUTE RTNLGRP_IPV4_ROUTE + RTNLGRP_IPV4_RULE, +#define RTNLGRP_IPV4_RULE RTNLGRP_IPV4_RULE + RTNLGRP_IPV6_IFADDR, +#define RTNLGRP_IPV6_IFADDR RTNLGRP_IPV6_IFADDR + RTNLGRP_IPV6_MROUTE, +#define RTNLGRP_IPV6_MROUTE RTNLGRP_IPV6_MROUTE + RTNLGRP_IPV6_ROUTE, +#define RTNLGRP_IPV6_ROUTE RTNLGRP_IPV6_ROUTE + RTNLGRP_IPV6_IFINFO, +#define RTNLGRP_IPV6_IFINFO RTNLGRP_IPV6_IFINFO + RTNLGRP_DECnet_IFADDR, +#define RTNLGRP_DECnet_IFADDR RTNLGRP_DECnet_IFADDR + RTNLGRP_NOP2, + RTNLGRP_DECnet_ROUTE, +#define RTNLGRP_DECnet_ROUTE RTNLGRP_DECnet_ROUTE + RTNLGRP_DECnet_RULE, +#define RTNLGRP_DECnet_RULE RTNLGRP_DECnet_RULE + RTNLGRP_NOP4, + RTNLGRP_IPV6_PREFIX, +#define RTNLGRP_IPV6_PREFIX RTNLGRP_IPV6_PREFIX + RTNLGRP_IPV6_RULE, +#define RTNLGRP_IPV6_RULE RTNLGRP_IPV6_RULE + RTNLGRP_ND_USEROPT, +#define RTNLGRP_ND_USEROPT RTNLGRP_ND_USEROPT + RTNLGRP_PHONET_IFADDR, +#define RTNLGRP_PHONET_IFADDR RTNLGRP_PHONET_IFADDR + RTNLGRP_PHONET_ROUTE, +#define RTNLGRP_PHONET_ROUTE RTNLGRP_PHONET_ROUTE + RTNLGRP_DCB, +#define RTNLGRP_DCB RTNLGRP_DCB + RTNLGRP_IPV4_NETCONF, +#define RTNLGRP_IPV4_NETCONF RTNLGRP_IPV4_NETCONF + RTNLGRP_IPV6_NETCONF, +#define RTNLGRP_IPV6_NETCONF RTNLGRP_IPV6_NETCONF + RTNLGRP_MDB, +#define RTNLGRP_MDB RTNLGRP_MDB + RTNLGRP_MPLS_ROUTE, +#define RTNLGRP_MPLS_ROUTE RTNLGRP_MPLS_ROUTE + RTNLGRP_NSID, +#define RTNLGRP_NSID RTNLGRP_NSID + RTNLGRP_MPLS_NETCONF, +#define RTNLGRP_MPLS_NETCONF RTNLGRP_MPLS_NETCONF + RTNLGRP_IPV4_MROUTE_R, +#define RTNLGRP_IPV4_MROUTE_R RTNLGRP_IPV4_MROUTE_R + RTNLGRP_IPV6_MROUTE_R, +#define RTNLGRP_IPV6_MROUTE_R RTNLGRP_IPV6_MROUTE_R + __RTNLGRP_MAX +}; +#define RTNLGRP_MAX (__RTNLGRP_MAX - 1) + +/* TC action piece */ +struct tcamsg { + unsigned char tca_family; + unsigned char tca__pad1; + unsigned short tca__pad2; +}; + +enum { + TCA_ROOT_UNSPEC, + TCA_ROOT_TAB, +#define TCA_ACT_TAB TCA_ROOT_TAB +#define TCAA_MAX TCA_ROOT_TAB + TCA_ROOT_FLAGS, + TCA_ROOT_COUNT, + TCA_ROOT_TIME_DELTA, /* in msecs */ + __TCA_ROOT_MAX, +#define TCA_ROOT_MAX (__TCA_ROOT_MAX - 1) +}; + +#define TA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcamsg)))) +#define TA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcamsg)) +/* tcamsg flags stored in attribute TCA_ROOT_FLAGS + * + * TCA_FLAG_LARGE_DUMP_ON user->kernel to request for larger than TCA_ACT_MAX_PRIO + * actions in a dump. All dump responses will contain the number of actions + * being dumped stored in for user app's consumption in TCA_ROOT_COUNT + * + */ +#define TCA_FLAG_LARGE_DUMP_ON (1 << 0) + +/* New extended info filters for IFLA_EXT_MASK */ +#define RTEXT_FILTER_VF (1 << 0) +#define RTEXT_FILTER_BRVLAN (1 << 1) +#define RTEXT_FILTER_BRVLAN_COMPRESSED (1 << 2) +#define RTEXT_FILTER_SKIP_STATS (1 << 3) + +/* End of information exported to user level */ + + + +#endif /* _UAPI__LINUX_RTNETLINK_H */ diff --git a/src/basic/linux/wireguard.h b/src/basic/linux/wireguard.h new file mode 100644 index 00000000000..071ce4167f5 --- /dev/null +++ b/src/basic/linux/wireguard.h @@ -0,0 +1,190 @@ +/* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR MIT */ +/* + * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. + * + * Documentation + * ============= + * + * The below enums and macros are for interfacing with WireGuard, using generic + * netlink, with family WG_GENL_NAME and version WG_GENL_VERSION. It defines two + * methods: get and set. Note that while they share many common attributes, + * these two functions actually accept a slightly different set of inputs and + * outputs. + * + * WG_CMD_GET_DEVICE + * ----------------- + * + * May only be called via NLM_F_REQUEST | NLM_F_DUMP. The command should contain + * one but not both of: + * + * WGDEVICE_A_IFINDEX: NLA_U32 + * WGDEVICE_A_IFNAME: NLA_NUL_STRING, maxlen IFNAMESIZ - 1 + * + * The kernel will then return several messages (NLM_F_MULTI) containing the + * following tree of nested items: + * + * WGDEVICE_A_IFINDEX: NLA_U32 + * WGDEVICE_A_IFNAME: NLA_NUL_STRING, maxlen IFNAMESIZ - 1 + * WGDEVICE_A_PRIVATE_KEY: len WG_KEY_LEN + * WGDEVICE_A_PUBLIC_KEY: len WG_KEY_LEN + * WGDEVICE_A_LISTEN_PORT: NLA_U16 + * WGDEVICE_A_FWMARK: NLA_U32 + * WGDEVICE_A_PEERS: NLA_NESTED + * 0: NLA_NESTED + * WGPEER_A_PUBLIC_KEY: len WG_KEY_LEN + * WGPEER_A_PRESHARED_KEY: len WG_KEY_LEN + * WGPEER_A_ENDPOINT: struct sockaddr_in or struct sockaddr_in6 + * WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL: NLA_U16 + * WGPEER_A_LAST_HANDSHAKE_TIME: struct __kernel_timespec + * WGPEER_A_RX_BYTES: NLA_U64 + * WGPEER_A_TX_BYTES: NLA_U64 + * WGPEER_A_ALLOWEDIPS: NLA_NESTED + * 0: NLA_NESTED + * WGALLOWEDIP_A_FAMILY: NLA_U16 + * WGALLOWEDIP_A_IPADDR: struct in_addr or struct in6_addr + * WGALLOWEDIP_A_CIDR_MASK: NLA_U8 + * 0: NLA_NESTED + * ... + * 0: NLA_NESTED + * ... + * ... + * WGPEER_A_PROTOCOL_VERSION: NLA_U32 + * 0: NLA_NESTED + * ... + * ... + * + * It is possible that all of the allowed IPs of a single peer will not + * fit within a single netlink message. In that case, the same peer will + * be written in the following message, except it will only contain + * WGPEER_A_PUBLIC_KEY and WGPEER_A_ALLOWEDIPS. This may occur several + * times in a row for the same peer. It is then up to the receiver to + * coalesce adjacent peers. Likewise, it is possible that all peers will + * not fit within a single message. So, subsequent peers will be sent + * in following messages, except those will only contain WGDEVICE_A_IFNAME + * and WGDEVICE_A_PEERS. It is then up to the receiver to coalesce these + * messages to form the complete list of peers. + * + * Since this is an NLA_F_DUMP command, the final message will always be + * NLMSG_DONE, even if an error occurs. However, this NLMSG_DONE message + * contains an integer error code. It is either zero or a negative error + * code corresponding to the errno. + * + * WG_CMD_SET_DEVICE + * ----------------- + * + * May only be called via NLM_F_REQUEST. The command should contain the + * following tree of nested items, containing one but not both of + * WGDEVICE_A_IFINDEX and WGDEVICE_A_IFNAME: + * + * WGDEVICE_A_IFINDEX: NLA_U32 + * WGDEVICE_A_IFNAME: NLA_NUL_STRING, maxlen IFNAMESIZ - 1 + * WGDEVICE_A_FLAGS: NLA_U32, 0 or WGDEVICE_F_REPLACE_PEERS if all current + * peers should be removed prior to adding the list below. + * WGDEVICE_A_PRIVATE_KEY: len WG_KEY_LEN, all zeros to remove + * WGDEVICE_A_LISTEN_PORT: NLA_U16, 0 to choose randomly + * WGDEVICE_A_FWMARK: NLA_U32, 0 to disable + * WGDEVICE_A_PEERS: NLA_NESTED + * 0: NLA_NESTED + * WGPEER_A_PUBLIC_KEY: len WG_KEY_LEN + * WGPEER_A_FLAGS: NLA_U32, 0 and/or WGPEER_F_REMOVE_ME if the + * specified peer should be removed rather than + * added/updated and/or WGPEER_F_REPLACE_ALLOWEDIPS + * if all current allowed IPs of this peer should be + * removed prior to adding the list below. + * WGPEER_A_PRESHARED_KEY: len WG_KEY_LEN, all zeros to remove + * WGPEER_A_ENDPOINT: struct sockaddr_in or struct sockaddr_in6 + * WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL: NLA_U16, 0 to disable + * WGPEER_A_ALLOWEDIPS: NLA_NESTED + * 0: NLA_NESTED + * WGALLOWEDIP_A_FAMILY: NLA_U16 + * WGALLOWEDIP_A_IPADDR: struct in_addr or struct in6_addr + * WGALLOWEDIP_A_CIDR_MASK: NLA_U8 + * 0: NLA_NESTED + * ... + * 0: NLA_NESTED + * ... + * ... + * WGPEER_A_PROTOCOL_VERSION: NLA_U32, should not be set or used at + * all by most users of this API, as the + * most recent protocol will be used when + * this is unset. Otherwise, must be set + * to 1. + * 0: NLA_NESTED + * ... + * ... + * + * It is possible that the amount of configuration data exceeds that of + * the maximum message length accepted by the kernel. In that case, several + * messages should be sent one after another, with each successive one + * filling in information not contained in the prior. Note that if + * WGDEVICE_F_REPLACE_PEERS is specified in the first message, it probably + * should not be specified in fragments that come after, so that the list + * of peers is only cleared the first time but appened after. Likewise for + * peers, if WGPEER_F_REPLACE_ALLOWEDIPS is specified in the first message + * of a peer, it likely should not be specified in subsequent fragments. + * + * If an error occurs, NLMSG_ERROR will reply containing an errno. + */ + +#ifndef _WG_UAPI_WIREGUARD_H +#define _WG_UAPI_WIREGUARD_H + +#define WG_GENL_NAME "wireguard" +#define WG_GENL_VERSION 1 + +#define WG_KEY_LEN 32 + +enum wg_cmd { + WG_CMD_GET_DEVICE, + WG_CMD_SET_DEVICE, + __WG_CMD_MAX +}; +#define WG_CMD_MAX (__WG_CMD_MAX - 1) + +enum wgdevice_flag { + WGDEVICE_F_REPLACE_PEERS = 1U << 0 +}; +enum wgdevice_attribute { + WGDEVICE_A_UNSPEC, + WGDEVICE_A_IFINDEX, + WGDEVICE_A_IFNAME, + WGDEVICE_A_PRIVATE_KEY, + WGDEVICE_A_PUBLIC_KEY, + WGDEVICE_A_FLAGS, + WGDEVICE_A_LISTEN_PORT, + WGDEVICE_A_FWMARK, + WGDEVICE_A_PEERS, + __WGDEVICE_A_LAST +}; +#define WGDEVICE_A_MAX (__WGDEVICE_A_LAST - 1) + +enum wgpeer_flag { + WGPEER_F_REMOVE_ME = 1U << 0, + WGPEER_F_REPLACE_ALLOWEDIPS = 1U << 1 +}; +enum wgpeer_attribute { + WGPEER_A_UNSPEC, + WGPEER_A_PUBLIC_KEY, + WGPEER_A_PRESHARED_KEY, + WGPEER_A_FLAGS, + WGPEER_A_ENDPOINT, + WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL, + WGPEER_A_LAST_HANDSHAKE_TIME, + WGPEER_A_RX_BYTES, + WGPEER_A_TX_BYTES, + WGPEER_A_ALLOWEDIPS, + WGPEER_A_PROTOCOL_VERSION, + __WGPEER_A_LAST +}; +#define WGPEER_A_MAX (__WGPEER_A_LAST - 1) + +enum wgallowedip_attribute { + WGALLOWEDIP_A_UNSPEC, + WGALLOWEDIP_A_FAMILY, + WGALLOWEDIP_A_IPADDR, + WGALLOWEDIP_A_CIDR_MASK, + __WGALLOWEDIP_A_LAST +}; +#define WGALLOWEDIP_A_MAX (__WGALLOWEDIP_A_LAST - 1) + +#endif /* _WG_UAPI_WIREGUARD_H */ diff --git a/src/basic/meson.build b/src/basic/meson.build index 91e0df3d2f7..de1e42013de 100644 --- a/src/basic/meson.build +++ b/src/basic/meson.build @@ -84,6 +84,23 @@ basic_sources = files(''' label.h limits-util.c limits-util.h + linux/btrfs.h + linux/btrfs_tree.h + linux/can/vxcan.h + linux/fib_rules.h + linux/fou.h + linux/if.h + linux/if_addr.h + linux/if_arp.h + linux/if_bonding.h + linux/if_bridge.h + linux/if_link.h + linux/if_tun.h + linux/if_tunnel.h + linux/libc-compat.h + linux/netlink.h + linux/rtnetlink.h + linux/wireguard.h list.h locale-util.c locale-util.h @@ -100,18 +117,10 @@ basic_sources = files(''' mempool.h missing.h missing_audit.h - missing_btrfs.h - missing_btrfs_tree.h missing_capability.h missing_drm.h - missing_ethtool.h missing_fcntl.h - missing_fib_rules.h - missing_fou.h missing_fs.h - missing_if_bridge.h - missing_if_link.h - missing_if_tunnel.h missing_input.h missing_keyctl.h missing_magic.h @@ -128,7 +137,6 @@ basic_sources = files(''' missing_syscall.h missing_timerfd.h missing_type.h - missing_vxcan.h mkdir-label.c mkdir.c mkdir.h @@ -227,7 +235,6 @@ basic_sources = files(''' missing_audit_h = files('missing_audit.h') missing_capability_h = files('missing_capability.h') -missing_network_h = files('missing_network.h') missing_socket_h = files('missing_socket.h') generate_af_list = find_program('generate-af-list.sh') @@ -241,7 +248,7 @@ generate_arphrd_list = find_program('generate-arphrd-list.sh') arphrd_list_txt = custom_target( 'arphrd-list.txt', output : 'arphrd-list.txt', - command : [generate_arphrd_list, cpp, config_h, missing_network_h], + command : [generate_arphrd_list, cpp, config_h], capture : true) generate_cap_list = find_program('generate-cap-list.sh') diff --git a/src/basic/missing.h b/src/basic/missing.h index 5067c8fd009..9ea4d9467cb 100644 --- a/src/basic/missing.h +++ b/src/basic/missing.h @@ -4,7 +4,6 @@ /* Missing glibc definitions to access certain kernel APIs */ #include "missing_audit.h" -#include "missing_btrfs_tree.h" #include "missing_capability.h" #include "missing_drm.h" #include "missing_fcntl.h" diff --git a/src/basic/missing_btrfs.h b/src/basic/missing_btrfs.h deleted file mode 100644 index 34c382ff0b5..00000000000 --- a/src/basic/missing_btrfs.h +++ /dev/null @@ -1,22 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1+ */ -#pragma once - -/* Old btrfs.h requires stddef.h to be included before btrfs.h */ -#include <stddef.h> - -#include <linux/btrfs.h> - -/* linux@57254b6ebce4ceca02d9c8b615f6059c56c19238 (3.11) */ -#ifndef BTRFS_IOC_QUOTA_RESCAN_WAIT -#define BTRFS_IOC_QUOTA_RESCAN_WAIT _IO(BTRFS_IOCTL_MAGIC, 46) -#endif - -/* linux@83288b60bf6668933689078973136e0c9d387b38 (4.7) */ -#ifndef BTRFS_QGROUP_LIMIT_MAX_RFER -#define BTRFS_QGROUP_LIMIT_MAX_RFER (1ULL << 0) -#define BTRFS_QGROUP_LIMIT_MAX_EXCL (1ULL << 1) -#define BTRFS_QGROUP_LIMIT_RSV_RFER (1ULL << 2) -#define BTRFS_QGROUP_LIMIT_RSV_EXCL (1ULL << 3) -#define BTRFS_QGROUP_LIMIT_RFER_CMPR (1ULL << 4) -#define BTRFS_QGROUP_LIMIT_EXCL_CMPR (1ULL << 5) -#endif diff --git a/src/basic/missing_btrfs_tree.h b/src/basic/missing_btrfs_tree.h deleted file mode 100644 index 555f90fe1b5..00000000000 --- a/src/basic/missing_btrfs_tree.h +++ /dev/null @@ -1,109 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1+ */ -#pragma once - -#include <linux/types.h> - -#include "missing_btrfs.h" - -/* linux@db6711600e27c885aed89751f04e727f3af26715 (4.7) */ -#if HAVE_LINUX_BTRFS_TREE_H -#include <linux/btrfs_tree.h> -#else -#define BTRFS_ROOT_TREE_OBJECTID 1 -#define BTRFS_QUOTA_TREE_OBJECTID 8 -#define BTRFS_FIRST_FREE_OBJECTID 256 -#define BTRFS_LAST_FREE_OBJECTID -256ULL - -#define BTRFS_ROOT_ITEM_KEY 132 -#define BTRFS_ROOT_BACKREF_KEY 144 -#define BTRFS_QGROUP_STATUS_KEY 240 -#define BTRFS_QGROUP_INFO_KEY 242 -#define BTRFS_QGROUP_LIMIT_KEY 244 -#define BTRFS_QGROUP_RELATION_KEY 246 - -struct btrfs_disk_key { - __le64 objectid; - __u8 type; - __le64 offset; -} __attribute__ ((__packed__)); - -struct btrfs_timespec { - __le64 sec; - __le32 nsec; -} __attribute__ ((__packed__)); - -struct btrfs_inode_item { - __le64 generation; - __le64 transid; - __le64 size; - __le64 nbytes; - __le64 block_group; - __le32 nlink; - __le32 uid; - __le32 gid; - __le32 mode; - __le64 rdev; - __le64 flags; - __le64 sequence; - __le64 reserved[4]; - struct btrfs_timespec atime; - struct btrfs_timespec ctime; - struct btrfs_timespec mtime; - struct btrfs_timespec otime; -} __attribute__ ((__packed__)); - -#define BTRFS_ROOT_SUBVOL_RDONLY (1ULL << 0) - -struct btrfs_root_item { - struct btrfs_inode_item inode; - __le64 generation; - __le64 root_dirid; - __le64 bytenr; - __le64 byte_limit; - __le64 bytes_used; - __le64 last_snapshot; - __le64 flags; - __le32 refs; - struct btrfs_disk_key drop_progress; - __u8 drop_level; - __u8 level; - - __le64 generation_v2; - __u8 uuid[BTRFS_UUID_SIZE]; - __u8 parent_uuid[BTRFS_UUID_SIZE]; - __u8 received_uuid[BTRFS_UUID_SIZE]; - __le64 ctransid; /* updated when an inode changes */ - __le64 otransid; /* trans when created */ - __le64 stransid; /* trans when sent. non-zero for received subvol */ - __le64 rtransid; /* trans when received. non-zero for received subvol */ - struct btrfs_timespec ctime; - struct btrfs_timespec otime; - struct btrfs_timespec stime; - struct btrfs_timespec rtime; - __le64 reserved[8]; /* for future */ -} __attribute__ ((__packed__)); - -struct btrfs_root_ref { - __le64 dirid; - __le64 sequence; - __le16 name_len; -} __attribute__ ((__packed__)); - -#define BTRFS_QGROUP_LEVEL_SHIFT 48 - -struct btrfs_qgroup_info_item { - __le64 generation; - __le64 rfer; - __le64 rfer_cmpr; - __le64 excl; - __le64 excl_cmpr; -} __attribute__ ((__packed__)); - -struct btrfs_qgroup_limit_item { - __le64 flags; - __le64 max_rfer; - __le64 max_excl; - __le64 rsv_rfer; - __le64 rsv_excl; -} __attribute__ ((__packed__)); -#endif diff --git a/src/basic/missing_ethtool.h b/src/basic/missing_ethtool.h deleted file mode 100644 index 9ba929c6329..00000000000 --- a/src/basic/missing_ethtool.h +++ /dev/null @@ -1,131 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1+ */ -#pragma once - -#include <linux/types.h> - -/* Missing definitions in ethtool.h */ - -#if !HAVE_ETHTOOL_LINK_MODE_10baseT_Half_BIT /* linux@3f1ac7a700d039c61d8d8b99f28d605d489a60cf (4.6) */ - -#define ETHTOOL_GLINKSETTINGS 0x0000004c /* Get ethtool_link_settings */ -#define ETHTOOL_SLINKSETTINGS 0x0000004d /* Set ethtool_link_settings */ - -struct ethtool_link_settings { - __u32 cmd; - __u32 speed; - __u8 duplex; - __u8 port; - __u8 phy_address; - __u8 autoneg; - __u8 mdio_support; - __u8 eth_tp_mdix; - __u8 eth_tp_mdix_ctrl; - __s8 link_mode_masks_nwords; - __u8 transceiver; - __u8 reserved1[3]; - __u32 reserved[7]; - __u32 link_mode_masks[0]; - /* layout of link_mode_masks fields: - * __u32 map_supported[link_mode_masks_nwords]; - * __u32 map_advertising[link_mode_masks_nwords]; - * __u32 map_lp_advertising[link_mode_masks_nwords]; - */ -}; - -enum ethtool_link_mode_bit_indices { - ETHTOOL_LINK_MODE_10baseT_Half_BIT = 0, - ETHTOOL_LINK_MODE_10baseT_Full_BIT = 1, - ETHTOOL_LINK_MODE_100baseT_Half_BIT = 2, - ETHTOOL_LINK_MODE_100baseT_Full_BIT = 3, - ETHTOOL_LINK_MODE_1000baseT_Half_BIT = 4, - ETHTOOL_LINK_MODE_1000baseT_Full_BIT = 5, - ETHTOOL_LINK_MODE_Autoneg_BIT = 6, - ETHTOOL_LINK_MODE_TP_BIT = 7, - ETHTOOL_LINK_MODE_AUI_BIT = 8, - ETHTOOL_LINK_MODE_MII_BIT = 9, - ETHTOOL_LINK_MODE_FIBRE_BIT = 10, - ETHTOOL_LINK_MODE_BNC_BIT = 11, - ETHTOOL_LINK_MODE_10000baseT_Full_BIT = 12, - ETHTOOL_LINK_MODE_Pause_BIT = 13, - ETHTOOL_LINK_MODE_Asym_Pause_BIT = 14, - ETHTOOL_LINK_MODE_2500baseX_Full_BIT = 15, - ETHTOOL_LINK_MODE_Backplane_BIT = 16, - ETHTOOL_LINK_MODE_1000baseKX_Full_BIT = 17, - ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT = 18, - ETHTOOL_LINK_MODE_10000baseKR_Full_BIT = 19, - ETHTOOL_LINK_MODE_10000baseR_FEC_BIT = 20, - ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT = 21, - ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT = 22, - ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT = 23, - ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT = 24, - ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT = 25, - ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT = 26, - ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT = 27, - ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT = 28, - ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT = 29, - ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT = 30, - ETHTOOL_LINK_MODE_25000baseCR_Full_BIT = 31, - ETHTOOL_LINK_MODE_25000baseKR_Full_BIT = 32, - ETHTOOL_LINK_MODE_25000baseSR_Full_BIT = 33, - ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT = 34, - ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT = 35, - ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT = 36, - ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT = 37, - ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT = 38, - ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT = 39, - ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT = 40, - ETHTOOL_LINK_MODE_1000baseX_Full_BIT = 41, - ETHTOOL_LINK_MODE_10000baseCR_Full_BIT = 42, - ETHTOOL_LINK_MODE_10000baseSR_Full_BIT = 43, - ETHTOOL_LINK_MODE_10000baseLR_Full_BIT = 44, - ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT = 45, - ETHTOOL_LINK_MODE_10000baseER_Full_BIT = 46, - ETHTOOL_LINK_MODE_2500baseT_Full_BIT = 47, - ETHTOOL_LINK_MODE_5000baseT_Full_BIT = 48, - - ETHTOOL_LINK_MODE_FEC_NONE_BIT = 49, - ETHTOOL_LINK_MODE_FEC_RS_BIT = 50, - ETHTOOL_LINK_MODE_FEC_BASER_BIT = 51, - - /* Last allowed bit for __ETHTOOL_LINK_MODE_LEGACY_MASK is bit - * 31. Please do NOT define any SUPPORTED_* or ADVERTISED_* - * macro for bits > 31. The only way to use indices > 31 is to - * use the new ETHTOOL_GLINKSETTINGS/ETHTOOL_SLINKSETTINGS API. - */ - - __ETHTOOL_LINK_MODE_LAST - = ETHTOOL_LINK_MODE_FEC_BASER_BIT, -}; -#else -#if !HAVE_ETHTOOL_LINK_MODE_25000baseCR_Full_BIT /* linux@3851112e4737cd52aaeda0ce8d084be9ee128106 (4.7) */ -#define ETHTOOL_LINK_MODE_25000baseCR_Full_BIT 31 -#define ETHTOOL_LINK_MODE_25000baseKR_Full_BIT 32 -#define ETHTOOL_LINK_MODE_25000baseSR_Full_BIT 33 -#define ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT 34 -#define ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT 35 -#define ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT 36 -#define ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT 37 -#define ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT 38 -#define ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT 39 -#endif -#if !HAVE_ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT /* linux@89da45b8b5b2187734a11038b8593714f964ffd1 (4.8) */ -#define ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT 40 -#endif -#if !HAVE_ETHTOOL_LINK_MODE_1000baseX_Full_BIT /* linux@5711a98221443aec54c4c81ee98c6ae46acccb65 (4.9) */ -#define ETHTOOL_LINK_MODE_1000baseX_Full_BIT 41 -#define ETHTOOL_LINK_MODE_10000baseCR_Full_BIT 42 -#define ETHTOOL_LINK_MODE_10000baseSR_Full_BIT 43 -#define ETHTOOL_LINK_MODE_10000baseLR_Full_BIT 44 -#define ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT 45 -#define ETHTOOL_LINK_MODE_10000baseER_Full_BIT 46 -#endif -#if !HAVE_ETHTOOL_LINK_MODE_2500baseT_Full_BIT /* linux@94842b4fc4d6b1691cfc86c6f5251f299d27f4ba (4.10) */ -#define ETHTOOL_LINK_MODE_2500baseT_Full_BIT 47 -#define ETHTOOL_LINK_MODE_5000baseT_Full_BIT 48 -#endif -#if !HAVE_ETHTOOL_LINK_MODE_FEC_NONE_BIT /* linux@1a5f3da20bd966220931239fbd31e6ac6ff42251 (4.14) */ -#define ETHTOOL_LINK_MODE_FEC_NONE_BIT 49 -#define ETHTOOL_LINK_MODE_FEC_RS_BIT 50 -#define ETHTOOL_LINK_MODE_FEC_BASER_BIT 51 -#endif -#endif diff --git a/src/basic/missing_fib_rules.h b/src/basic/missing_fib_rules.h deleted file mode 100644 index df120d7bcda..00000000000 --- a/src/basic/missing_fib_rules.h +++ /dev/null @@ -1,45 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1+ */ -#pragma once - -#include <linux/types.h> - -#if !HAVE_FRA_TUN_ID /* linux@e7030878fc8448492b6e5cecd574043f63271298 (4.3) */ -#define FRA_TUN_ID 12 -#endif - -#if !HAVE_FRA_SUPPRESS_PREFIXLEN /* linux@6ef94cfafba159d6b1a902ccb3349ac6a34ff6ad, 73f5698e77219bfc3ea1903759fe8e20ab5b285e (3.12) */ -#define FRA_SUPPRESS_IFGROUP 13 -#define FRA_SUPPRESS_PREFIXLEN 14 -#endif - -#if !HAVE_FRA_PAD /* linux@b46f6ded906ef0be52a4881ba50a084aeca64d7e (4.7) */ -#define FRA_PAD 18 -#endif - -#if !HAVE_FRA_L3MDEV /* linux@96c63fa7393d0a346acfe5a91e0c7d4c7782641b (4.8) */ -#define FRA_L3MDEV 19 -#endif - -#if !HAVE_FRA_UID_RANGE /* linux@622ec2c9d52405973c9f1ca5116eb1c393adfc7d (4.10) */ -#define FRA_UID_RANGE 20 - -struct fib_rule_uid_range { - __u32 start; - __u32 end; -}; -#endif - -#if !HAVE_FRA_DPORT_RANGE /* linux@1b71af6053af1bd2f849e9fda4f71c1e3f145dcf, bfff4862653bb96001ab57c1edd6d03f48e5f035 (4.17) */ -#define FRA_PROTOCOL 21 -#define FRA_IP_PROTO 22 -#define FRA_SPORT_RANGE 23 -#define FRA_DPORT_RANGE 24 - -#undef FRA_MAX -#define FRA_MAX 24 - -struct fib_rule_port_range { - __u16 start; - __u16 end; -}; -#endif diff --git a/src/basic/missing_fou.h b/src/basic/missing_fou.h deleted file mode 100644 index d8c743577cd..00000000000 --- a/src/basic/missing_fou.h +++ /dev/null @@ -1,55 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1+ */ -#pragma once - -#if !HAVE_LINUX_FOU_H /* linux@23461551c00628c3f3fe9cf837bf53cf8f212b63 (3.18) */ - -#define FOU_GENL_NAME "fou" -#define FOU_GENL_VERSION 0x1 - -enum { - FOU_ATTR_UNSPEC, - FOU_ATTR_PORT, /* u16 */ - FOU_ATTR_AF, /* u8 */ - FOU_ATTR_IPPROTO, /* u8 */ - FOU_ATTR_TYPE, /* u8 */ - FOU_ATTR_REMCSUM_NOPARTIAL, /* flag */ - - __FOU_ATTR_MAX, -}; - -#define FOU_ATTR_MAX (__FOU_ATTR_MAX - 1) - -enum { - FOU_CMD_UNSPEC, - FOU_CMD_ADD, - FOU_CMD_DEL, - FOU_CMD_GET, - - __FOU_CMD_MAX, -}; - -enum { - FOU_ENCAP_UNSPEC, - FOU_ENCAP_DIRECT, - FOU_ENCAP_GUE, -}; - -#define FOU_CMD_MAX (__FOU_CMD_MAX - 1) - -#else - -#if !HAVE_FOU_ATTR_REMCSUM_NOPARTIAL /* linux@fe881ef11cf0220f118816181930494d484c4883 (4.0) */ -#define FOU_ATTR_REMCSUM_NOPARTIAL 5 - -#undef FOU_ATTR_MAX -#define FOU_ATTR_MAX 5 -#endif - -#if !HAVE_FOU_CMD_GET /* linux@7a6c8c34e5b71ac50e39588e20b39494a9e1d8e5 (4.1) */ -#define FOU_CMD_GET 3 - -#undef FOU_CMD_MAX -#define FOU_CMD_MAX 3 -#endif - -#endif diff --git a/src/basic/missing_if_bridge.h b/src/basic/missing_if_bridge.h deleted file mode 100644 index 9306062fc2c..00000000000 --- a/src/basic/missing_if_bridge.h +++ /dev/null @@ -1,21 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1+ */ -#pragma once - -#if !HAVE_IFLA_BRIDGE_VLAN_TUNNEL_INFO /* linux@b3c7ef0adadc5768e0baa786213c6bd1ce521a77 (4.11) */ -#define IFLA_BRIDGE_VLAN_TUNNEL_INFO 3 - -#undef IFLA_BRIDGE_MAX -#define IFLA_BRIDGE_MAX 3 -#endif - -#ifndef BRIDGE_VLAN_INFO_RANGE_BEGIN -#define BRIDGE_VLAN_INFO_RANGE_BEGIN (1<<3) /* VLAN is start of vlan range */ -#endif - -#ifndef BRIDGE_VLAN_INFO_RANGE_END -#define BRIDGE_VLAN_INFO_RANGE_END (1<<4) /* VLAN is end of vlan range */ -#endif - -#ifndef BRIDGE_VLAN_INFO_BRENTRY -#define BRIDGE_VLAN_INFO_BRENTRY (1<<5) /* Global bridge VLAN entry */ -#endif diff --git a/src/basic/missing_if_link.h b/src/basic/missing_if_link.h deleted file mode 100644 index 761797f56a4..00000000000 --- a/src/basic/missing_if_link.h +++ /dev/null @@ -1,393 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1+ */ -#pragma once - -#if !HAVE_IFLA_INET6_ADDR_GEN_MODE /* linux@bc91b0f07ada5535427373a4e2050877bcc12218 (3.17) */ -#define IFLA_INET6_ADDR_GEN_MODE 8 - -#undef IFLA_INET6_MAX -#define IFLA_INET6_MAX 8 - -enum in6_addr_gen_mode { - IN6_ADDR_GEN_MODE_EUI64, - IN6_ADDR_GEN_MODE_NONE, - IN6_ADDR_GEN_MODE_STABLE_PRIVACY, - IN6_ADDR_GEN_MODE_RANDOM, -}; -#else -#if !HAVE_IN6_ADDR_GEN_MODE_STABLE_PRIVACY /* linux@622c81d57b392cc9be836670eb464a4dfaa9adfe (4.1) */ -#define IN6_ADDR_GEN_MODE_STABLE_PRIVACY 2 -#endif -#if !HAVE_IN6_ADDR_GEN_MODE_RANDOM /* linux@cc9da6cc4f56e05cc9e591459fe0192727ff58b3 (4.5) */ -#define IN6_ADDR_GEN_MODE_RANDOM 3 -#endif -#endif /* !HAVE_IFLA_INET6_ADDR_GEN_MODE */ - -#if !HAVE_IFLA_IPVLAN_MODE /* linux@2ad7bf3638411cb547f2823df08166c13ab04269 (3.19) */ -enum { - IFLA_IPVLAN_UNSPEC, - IFLA_IPVLAN_MODE, - IFLA_IPVLAN_FLAGS, - __IFLA_IPVLAN_MAX -}; -#define IFLA_IPVLAN_MAX (__IFLA_IPVLAN_MAX - 1) -enum ipvlan_mode { - IPVLAN_MODE_L2 = 0, - IPVLAN_MODE_L3, - IPVLAN_MODE_L3S, - IPVLAN_MODE_MAX -}; -#else -#if !HAVE_IPVLAN_MODE_L3S /* linux@4fbae7d83c98c30efcf0a2a2ac55fbb75ef5a1a5 (4.9) */ -#define IPVLAN_MODE_L3S 2 -#define IPVLAN_MODE_MAX 3 -#endif -#if !HAVE_IFLA_IPVLAN_FLAGS /* linux@a190d04db93710ae166749055b6985397c6d13f5 (4.15) */ -#define IFLA_IPVLAN_FLAGS 2 - -#undef IFLA_IPVLAN_MAX -#define IFLA_IPVLAN_MAX 2 -#endif -#endif /* !HAVE_IFLA_IPVLAN_MODE */ - -/* linux@a190d04db93710ae166749055b6985397c6d13f5 (4.15) */ -#ifndef IPVLAN_F_PRIVATE -#define IPVLAN_F_PRIVATE 0x01 -#endif - -/* linux@fe89aa6b250c1011ccf425fbb7998e96bd54263f (4.15) */ -#ifndef IPVLAN_F_VEPA -#define IPVLAN_F_VEPA 0x02 -#endif - -#if !HAVE_IFLA_PHYS_PORT_ID /* linux@66cae9ed6bc46b8cc57a9693f99f69926f3cc7ef (3.12) */ -#define IFLA_PHYS_PORT_ID 34 -#endif -#if !HAVE_IFLA_CARRIER_CHANGES /* linux@2d3b479df41a10e2f41f9259fcba775bd34de6e4 (3.15) */ -#define IFLA_CARRIER_CHANGES 35 -#endif -#if !HAVE_IFLA_PHYS_SWITCH_ID /* linux@82f2841291cfaf4d225aa1766424280254d3e3b2 (3.19) */ -#define IFLA_PHYS_SWITCH_ID 36 -#endif -#if !HAVE_IFLA_LINK_NETNSID /* linux@d37512a277dfb2cef8a578e25a3246f61399a55a (4.0) */ -#define IFLA_LINK_NETNSID 37 -#endif -#if !HAVE_IFLA_PHYS_PORT_NAME /* linux@db24a9044ee191c397dcd1c6574f56d67d7c8df5 (4.1) */ -#define IFLA_PHYS_PORT_NAME 38 -#endif -#if !HAVE_IFLA_PROTO_DOWN /* linux@88d6378bd6c096cb8440face3ae3f33d55a2e6e4 (4.3) */ -#define IFLA_PROTO_DOWN 39 -#endif -#if !HAVE_IFLA_GSO_MAX_SIZE /* linux@c70ce028e834f8e51306217dbdbd441d851c64d3 (4.6) */ -#define IFLA_GSO_MAX_SEGS 40 -#define IFLA_GSO_MAX_SIZE 41 -#endif -#if !HAVE_IFLA_PAD /* linux@18402843bf88c2e9674e1a3a05c73b7d9b09ee05 (4.7) */ -#define IFLA_PAD 42 -#endif -#if !HAVE_IFLA_XDP /* linux@d1fdd9138682e0f272beee0cb08b6328c5478b26 (4.8) */ -#define IFLA_XDP 43 -#endif -#if !HAVE_IFLA_EVENT /* linux@3d3ea5af5c0b382bc9d9aed378fd814fb5d4a011 (4.13) */ -#define IFLA_EVENT 44 -#endif -#if !HAVE_IFLA_IF_NETNSID /* linux@6621dd29eb9b5e6774ec7a9a75161352fdea47fc, 79e1ad148c844f5c8b9d76b36b26e3886dca95ae (4.15) */ -#define IFLA_IF_NETNSID 45 -#define IFLA_NEW_NETNSID 46 -#endif -#if !HAVE_IFLA_TARGET_NETNSID /* linux@19d8f1ad12fd746e60707a58d954980013c7a35a (4.20) */ -#define IFLA_TARGET_NETNSID IFLA_IF_NETNSID -#endif -#if !HAVE_IFLA_NEW_IFINDEX /* linux@b2d3bcfa26a7a8de41f358a6cae8b848673b3c6e, 38e01b30563a5b5ade7b54e5d739d16a2b02fe82 (4.16) */ -#define IFLA_CARRIER_UP_COUNT 47 -#define IFLA_CARRIER_DOWN_COUNT 48 -#define IFLA_NEW_IFINDEX 49 -#endif -#if !HAVE_IFLA_MAX_MTU /* linux@3e7a50ceb11ea75c27e944f1a01e478fd62a2d8d (4.19) */ -#define IFLA_MIN_MTU 50 -#define IFLA_MAX_MTU 51 - -#undef IFLA_MAX -#define IFLA_MAX 51 -#endif - -#if !HAVE_IFLA_BOND_MODE /* linux@90af231106c0b8d223c27d35464af95cb3d9cacf (3.13) */ -#define IFLA_BOND_MODE 1 -#endif -#if !HAVE_IFLA_BOND_ACTIVE_SLAVE /* linux@ec76aa49855f6d6fea5e01de179fb57dd47c619d (3.13) */ -#define IFLA_BOND_ACTIVE_SLAVE 2 -#endif -#if !HAVE_IFLA_BOND_AD_INFO /* linux@4ee7ac7526d4a9413cafa733d824edfe49fdcc46 (3.14) */ -#define IFLA_BOND_MIIMON 3 -#define IFLA_BOND_UPDELAY 4 -#define IFLA_BOND_DOWNDELAY 5 -#define IFLA_BOND_USE_CARRIER 6 -#define IFLA_BOND_ARP_INTERVAL 7 -#define IFLA_BOND_ARP_IP_TARGET 8 -#define IFLA_BOND_ARP_VALIDATE 9 -#define IFLA_BOND_ARP_ALL_TARGETS 10 -#define IFLA_BOND_PRIMARY 11 -#define IFLA_BOND_PRIMARY_RESELECT 12 -#define IFLA_BOND_FAIL_OVER_MAC 13 -#define IFLA_BOND_XMIT_HASH_POLICY 14 -#define IFLA_BOND_RESEND_IGMP 15 -#define IFLA_BOND_NUM_PEER_NOTIF 16 -#define IFLA_BOND_ALL_SLAVES_ACTIVE 17 -#define IFLA_BOND_MIN_LINKS 18 -#define IFLA_BOND_LP_INTERVAL 19 -#define IFLA_BOND_PACKETS_PER_SLAVE 20 -#define IFLA_BOND_AD_LACP_RATE 21 -#define IFLA_BOND_AD_SELECT 22 -#define IFLA_BOND_AD_INFO 23 -#endif -#if !HAVE_IFLA_BOND_AD_ACTOR_SYSTEM /* linux@171a42c38c6e1a5a076d6276e94e55a0b5b7868c (4.2) */ -#define IFLA_BOND_AD_ACTOR_SYS_PRIO 24 -#define IFLA_BOND_AD_USER_PORT_KEY 25 -#define IFLA_BOND_AD_ACTOR_SYSTEM 26 -#endif -#if !HAVE_IFLA_BOND_TLB_DYNAMIC_LB /* linux@0f7bffd9e512b77279bbce704fad3cb1d6887958 (4.3) */ -#define IFLA_BOND_TLB_DYNAMIC_LB 27 - -#undef IFLA_BOND_MAX -#define IFLA_BOND_MAX 27 -#endif - -#if !HAVE_IFLA_VXLAN_UDP_ZERO_CSUM6_RX /* linux@359a0ea9875ef4f32c8425bbe1ae348e1fd2ed2a (3.16) */ -#define IFLA_VXLAN_UDP_CSUM 18 -#define IFLA_VXLAN_UDP_ZERO_CSUM6_TX 19 -#define IFLA_VXLAN_UDP_ZERO_CSUM6_RX 20 -#endif -#if !HAVE_IFLA_VXLAN_REMCSUM_NOPARTIAL /* linux@dfd8645ea1bd91277f841e74c33e1f4dbbede808..0ace2ca89cbd6bcdf2b9d2df1fa0fa24ea9d1653 (4.0) */ -#define IFLA_VXLAN_REMCSUM_TX 21 -#define IFLA_VXLAN_REMCSUM_RX 22 -#define IFLA_VXLAN_GBP 23 -#define IFLA_VXLAN_REMCSUM_NOPARTIAL 24 -#endif -#if !HAVE_IFLA_VXLAN_COLLECT_METADATA /* linux@f8a9b1bc1b238eed9987da747a0e52f5bb009980 (4.3) */ -#define IFLA_VXLAN_COLLECT_METADATA 25 -#endif -#if !HAVE_IFLA_VXLAN_LABEL /* linux@e7f70af111f086a20800ad2e17f544b2e3e0f375 (4.6) */ -#define IFLA_VXLAN_LABEL 26 -#endif -#if !HAVE_IFLA_VXLAN_GPE /* linux@e1e5314de08ba6003b358125eafc9ad9e75a950c (4.7) */ -#define IFLA_VXLAN_GPE 27 -#endif -#if !HAVE_IFLA_VXLAN_TTL_INHERIT /* linux@72f6d71e491e6ce269b564865b21fab0a4402dd3 (4.18) */ -#define IFLA_VXLAN_TTL_INHERIT 28 - -#undef IFLA_VXLAN_MAX -#define IFLA_VXLAN_MAX 28 -#endif - -#if !HAVE_IFLA_GENEVE_TOS /* linux@2d07dc79fe04a43d82a346ced6bbf07bdb523f1b..d89511251f6519599b109dc6cda87a6ab314ed8c (4.2) */ -enum { - IFLA_GENEVE_UNSPEC, - IFLA_GENEVE_ID, - IFLA_GENEVE_REMOTE, - IFLA_GENEVE_TTL, - IFLA_GENEVE_TOS, - IFLA_GENEVE_PORT, /* destination port */ - IFLA_GENEVE_COLLECT_METADATA, - IFLA_GENEVE_REMOTE6, - IFLA_GENEVE_UDP_CSUM, - IFLA_GENEVE_UDP_ZERO_CSUM6_TX, - IFLA_GENEVE_UDP_ZERO_CSUM6_RX, - IFLA_GENEVE_LABEL, - IFLA_GENEVE_TTL_INHERIT, - __IFLA_GENEVE_MAX -}; -#define IFLA_GENEVE_MAX (__IFLA_GENEVE_MAX - 1) -#else -#if !HAVE_IFLA_GENEVE_COLLECT_METADATA /* linux@e305ac6cf5a1e1386aedce7ef9cb773635d5845c (4.3) */ -#define IFLA_GENEVE_PORT 5 -#define IFLA_GENEVE_COLLECT_METADATA 6 -#endif -#if !HAVE_IFLA_GENEVE_REMOTE6 /* linux@8ed66f0e8235118a31720acdab3bbbe9debd0f6a (4.4) */ -#define IFLA_GENEVE_REMOTE6 7 -#endif -#if !HAVE_IFLA_GENEVE_UDP_ZERO_CSUM6_RX /* linux@abe492b4f50c3ae2ebcfaa2f5c16176aebaa1c68 (4.5) */ -#define IFLA_GENEVE_UDP_CSUM 8 -#define IFLA_GENEVE_UDP_ZERO_CSUM6_TX 9 -#define IFLA_GENEVE_UDP_ZERO_CSUM6_RX 10 -#endif -#if !HAVE_IFLA_GENEVE_LABEL /* linux@8eb3b99554b82da968d1fbc00df9f3156c5e2d63 (4.6) */ -#define IFLA_GENEVE_LABEL 11 -#endif -#if !HAVE_IFLA_GENEVE_TTL_INHERIT /* linux@52d0d404d39dd9eac71a181615d6ca15e23d8e38 (4.20) */ -#define IFLA_GENEVE_TTL_INHERIT 12 - -#undef IFLA_GENEVE_MAX -#define IFLA_GENEVE_MAX 12 -#endif -#endif - -#if !HAVE_IFLA_BR_MAX_AGE /* linux@e5c3ea5c668033b303e7ac835d7d91da32d97958 (3.18) */ -enum { - IFLA_BR_UNSPEC, - IFLA_BR_FORWARD_DELAY, - IFLA_BR_HELLO_TIME, - IFLA_BR_MAX_AGE, - IFLA_BR_AGEING_TIME, - IFLA_BR_STP_STATE, - IFLA_BR_PRIORITY, - IFLA_BR_VLAN_FILTERING, - IFLA_BR_VLAN_PROTOCOL, - IFLA_BR_GROUP_FWD_MASK, - IFLA_BR_ROOT_ID, - IFLA_BR_BRIDGE_ID, - IFLA_BR_ROOT_PORT, - IFLA_BR_ROOT_PATH_COST, - IFLA_BR_TOPOLOGY_CHANGE, - IFLA_BR_TOPOLOGY_CHANGE_DETECTED, - IFLA_BR_HELLO_TIMER, - IFLA_BR_TCN_TIMER, - IFLA_BR_TOPOLOGY_CHANGE_TIMER, - IFLA_BR_GC_TIMER, - IFLA_BR_GROUP_ADDR, - IFLA_BR_FDB_FLUSH, - IFLA_BR_MCAST_ROUTER, - IFLA_BR_MCAST_SNOOPING, - IFLA_BR_MCAST_QUERY_USE_IFADDR, - IFLA_BR_MCAST_QUERIER, - IFLA_BR_MCAST_HASH_ELASTICITY, - IFLA_BR_MCAST_HASH_MAX, - IFLA_BR_MCAST_LAST_MEMBER_CNT, - IFLA_BR_MCAST_STARTUP_QUERY_CNT, - IFLA_BR_MCAST_LAST_MEMBER_INTVL, - IFLA_BR_MCAST_MEMBERSHIP_INTVL, - IFLA_BR_MCAST_QUERIER_INTVL, - IFLA_BR_MCAST_QUERY_INTVL, - IFLA_BR_MCAST_QUERY_RESPONSE_INTVL, - IFLA_BR_MCAST_STARTUP_QUERY_INTVL, - IFLA_BR_NF_CALL_IPTABLES, - IFLA_BR_NF_CALL_IP6TABLES, - IFLA_BR_NF_CALL_ARPTABLES, - IFLA_BR_VLAN_DEFAULT_PVID, - IFLA_BR_PAD, - IFLA_BR_VLAN_STATS_ENABLED, - IFLA_BR_MCAST_STATS_ENABLED, - IFLA_BR_MCAST_IGMP_VERSION, - IFLA_BR_MCAST_MLD_VERSION, - IFLA_BR_VLAN_STATS_PER_PORT, - __IFLA_BR_MAX, -}; - -#define IFLA_BR_MAX (__IFLA_BR_MAX - 1) -#else -#if !HAVE_IFLA_BR_PRIORITY /* linux@af615762e972be0c66cf1d156ca4fac13b93c0b0 (4.1) */ -#define IFLA_BR_AGEING_TIME 4 -#define IFLA_BR_STP_STATE 5 -#define IFLA_BR_PRIORITY 6 -#endif -#if !HAVE_IFLA_BR_VLAN_PROTOCOL /* linux@a7854037da006a7472c48773e3190db55217ec9b, d2d427b3927bd7a0348fc7f323d0e291f79a2779 (4.3) */ -#define IFLA_BR_VLAN_FILTERING 7 -#define IFLA_BR_VLAN_PROTOCOL 8 -#endif -#if !HAVE_IFLA_BR_VLAN_DEFAULT_PVID /* linux@7910228b6bb35f3c8e0bc72a8d84c29616cb1b90..0f963b7592ef9e054974b6672b86ec1edd84b4bc (4.4) */ -#define IFLA_BR_GROUP_FWD_MASK 9 -#define IFLA_BR_ROOT_ID 10 -#define IFLA_BR_BRIDGE_ID 11 -#define IFLA_BR_ROOT_PORT 12 -#define IFLA_BR_ROOT_PATH_COST 13 -#define IFLA_BR_TOPOLOGY_CHANGE 14 -#define IFLA_BR_TOPOLOGY_CHANGE_DETECTED 15 -#define IFLA_BR_HELLO_TIMER 16 -#define IFLA_BR_TCN_TIMER 17 -#define IFLA_BR_TOPOLOGY_CHANGE_TIMER 18 -#define IFLA_BR_GC_TIMER 19 -#define IFLA_BR_GROUP_ADDR 20 -#define IFLA_BR_FDB_FLUSH 21 -#define IFLA_BR_MCAST_ROUTER 22 -#define IFLA_BR_MCAST_SNOOPING 23 -#define IFLA_BR_MCAST_QUERY_USE_IFADDR 24 -#define IFLA_BR_MCAST_QUERIER 25 -#define IFLA_BR_MCAST_HASH_ELASTICITY 26 -#define IFLA_BR_MCAST_HASH_MAX 27 -#define IFLA_BR_MCAST_LAST_MEMBER_CNT 28 -#define IFLA_BR_MCAST_STARTUP_QUERY_CNT 29 -#define IFLA_BR_MCAST_LAST_MEMBER_INTVL 30 -#define IFLA_BR_MCAST_MEMBERSHIP_INTVL 31 -#define IFLA_BR_MCAST_QUERIER_INTVL 32 -#define IFLA_BR_MCAST_QUERY_INTVL 33 -#define IFLA_BR_MCAST_QUERY_RESPONSE_INTVL 34 -#define IFLA_BR_MCAST_STARTUP_QUERY_INTVL 35 -#define IFLA_BR_NF_CALL_IPTABLES 36 -#define IFLA_BR_NF_CALL_IP6TABLES 37 -#define IFLA_BR_NF_CALL_ARPTABLES 38 -#define IFLA_BR_VLAN_DEFAULT_PVID 39 -#endif -#if !HAVE_IFLA_BR_VLAN_STATS_ENABLED /* linux@12a0faa3bd76157b9dc096758d6818ff535e4586, 6dada9b10a0818ba72c249526a742c8c41274a73 (4.7) */ -#define IFLA_BR_PAD 40 -#define IFLA_BR_VLAN_STATS_ENABLED 41 -#endif -#if !HAVE_IFLA_BR_MCAST_STATS_ENABLED /* linux@1080ab95e3c7bdd77870e209aff83c763fdcf439 (4.8) */ -#define IFLA_BR_MCAST_STATS_ENABLED 42 -#endif -#if !HAVE_IFLA_BR_MCAST_MLD_VERSION /* linux@5e9235853d652a295d5f56cb8652950b6b5bf56b, aa2ae3e71c74cc00ec22f133dc900b3817415785 (4.10) */ -#define IFLA_BR_MCAST_IGMP_VERSION 43 -#define IFLA_BR_MCAST_MLD_VERSION 44 -#endif -#if !HAVE_IFLA_BR_VLAN_STATS_PER_PORT /* linux@9163a0fc1f0c0980f117cc25f4fa6ba9b0750a36 (4.20) */ -#define IFLA_BR_VLAN_STATS_PER_PORT 45 - -#undef IFLA_BR_MAX -#define IFLA_BR_MAX 45 -#endif -#endif - -#if !HAVE_IFLA_BRPORT_LEARNING_SYNC /* linux@958501163ddd6ea22a98f94fa0e7ce6d4734e5c4, efacacdaf7cb5a0592ed772e3731636b2742e34a (3.19)*/ -#define IFLA_BRPORT_PROXYARP 10 -#define IFLA_BRPORT_LEARNING_SYNC 11 -#endif -#if !HAVE_IFLA_BRPORT_PROXYARP_WIFI /* linux@842a9ae08a25671db3d4f689eed68b4d64be15b5 (4.1) */ -#define IFLA_BRPORT_PROXYARP_WIFI 12 -#endif -#if !HAVE_IFLA_BRPORT_MULTICAST_ROUTER /* linux@4ebc7660ab4559cad10b6595e05f70562bb26dc5..5d6ae479ab7ddf77bb22bdf739268581453ff886 (4.4) */ -#define IFLA_BRPORT_ROOT_ID 13 -#define IFLA_BRPORT_BRIDGE_ID 14 -#define IFLA_BRPORT_DESIGNATED_PORT 15 -#define IFLA_BRPORT_DESIGNATED_COST 16 -#define IFLA_BRPORT_ID 17 -#define IFLA_BRPORT_NO 18 -#define IFLA_BRPORT_TOPOLOGY_CHANGE_ACK 19 -#define IFLA_BRPORT_CONFIG_PENDING 20 -#define IFLA_BRPORT_MESSAGE_AGE_TIMER 21 -#define IFLA_BRPORT_FORWARD_DELAY_TIMER 22 -#define IFLA_BRPORT_HOLD_TIMER 23 -#define IFLA_BRPORT_FLUSH 24 -#define IFLA_BRPORT_MULTICAST_ROUTER 25 -#endif -#if !HAVE_IFLA_BRPORT_PAD /* linux@12a0faa3bd76157b9dc096758d6818ff535e4586 (4.7) */ -#define IFLA_BRPORT_PAD 26 -#endif -#if !HAVE_IFLA_BRPORT_MCAST_FLOOD /* linux@b6cb5ac8331b6bcfe9ce38c7f7f58db6e1d6270a (4.9) */ -#define IFLA_BRPORT_MCAST_FLOOD 27 -#endif -#if !HAVE_IFLA_BRPORT_VLAN_TUNNEL /* linux@6db6f0eae6052b70885562e1733896647ec1d807, b3c7ef0adadc5768e0baa786213c6bd1ce521a77 (4.11) */ -#define IFLA_BRPORT_MCAST_TO_UCAST 28 -#define IFLA_BRPORT_VLAN_TUNNEL 29 -#endif -#if !HAVE_IFLA_BRPORT_BCAST_FLOOD /* linux@99f906e9ad7b6e79ffeda30f45906a8448b9d6a2 (4.12) */ -#define IFLA_BRPORT_BCAST_FLOOD 30 -#endif -#if !HAVE_IFLA_BRPORT_NEIGH_SUPPRESS /* linux@5af48b59f35cf712793badabe1a574a0d0ce3bd3, 821f1b21cabb46827ce39ddf82e2789680b5042a (4.15) */ -#define IFLA_BRPORT_GROUP_FWD_MASK 31 -#define IFLA_BRPORT_NEIGH_SUPPRESS 32 -#endif -#if !HAVE_IFLA_BRPORT_ISOLATED /* linux@7d850abd5f4edb1b1ca4b4141a4453305736f564 (4.18) */ -#define IFLA_BRPORT_ISOLATED 33 -#endif -#if !HAVE_IFLA_BRPORT_BACKUP_PORT /* linux@2756f68c314917d03eb348084edb08bb929139d9 (4.19) */ -#define IFLA_BRPORT_BACKUP_PORT 34 - -#undef IFLA_BRPORT_MAX -#define IFLA_BRPORT_MAX 34 -#endif - -#if !HAVE_IFLA_VRF_TABLE /* linux@4e3c89920cd3a6cfce22c6f537690747c26128dd (4.3) */ -enum { - IFLA_VRF_UNSPEC, - IFLA_VRF_TABLE, - __IFLA_VRF_MAX -}; -#define IFLA_VRF_MAX (__IFLA_VRF_MAX - 1) -#endif diff --git a/src/basic/missing_if_tunnel.h b/src/basic/missing_if_tunnel.h deleted file mode 100644 index f51fdd1ed78..00000000000 --- a/src/basic/missing_if_tunnel.h +++ /dev/null @@ -1,59 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1+ */ -#pragma once - -#if !HAVE_IFLA_VTI_FWMARK /* linux@0a473b82cb23e7a35c4be6e9765c8487a65e8f55 (4.12) */ -#define IFLA_VTI_FWMARK 6 - -#undef IFLA_VTI_MAX -#define IFLA_VTI_MAX 6 -#endif - -#if !HAVE_IFLA_IPTUN_ENCAP_DPORT /* linux@56328486539ddd07cbaafec7a542a2c8a3043623 (3.18)*/ -#define IFLA_IPTUN_ENCAP_TYPE 15 -#define IFLA_IPTUN_ENCAP_FLAGS 16 -#define IFLA_IPTUN_ENCAP_SPORT 17 -#define IFLA_IPTUN_ENCAP_DPORT 18 -#endif - -#if !HAVE_IFLA_IPTUN_COLLECT_METADATA /* linux@cfc7381b3002756b1dcada32979e942aa3126e31 (4.9) */ -#define IFLA_IPTUN_COLLECT_METADATA 19 -#endif - -#if !HAVE_IFLA_IPTUN_FWMARK /* linux@0a473b82cb23e7a35c4be6e9765c8487a65e8f55 (4.12) */ -#define IFLA_IPTUN_FWMARK 20 - -#undef IFLA_IPTUN_MAX -#define IFLA_IPTUN_MAX 20 -#endif - -#if !HAVE_IFLA_GRE_ENCAP_DPORT /* linux@4565e9919cda747815547e2e5d7b78f15efbffdf (3.18) */ -#define IFLA_GRE_ENCAP_TYPE 14 -#define IFLA_GRE_ENCAP_FLAGS 15 -#define IFLA_GRE_ENCAP_SPORT 16 -#define IFLA_GRE_ENCAP_DPORT 17 -#endif - -#if !HAVE_IFLA_GRE_COLLECT_METADATA /* linux@2e15ea390e6f4466655066d97e22ec66870a042c (4.3) */ -#define IFLA_GRE_COLLECT_METADATA 18 -#endif - -#if !HAVE_IFLA_GRE_IGNORE_DF /* linux@22a59be8b7693eb2d0897a9638f5991f2f8e4ddd (4.8) */ -#define IFLA_GRE_IGNORE_DF 19 -#endif - -#if !HAVE_IFLA_GRE_FWMARK /* linux@0a473b82cb23e7a35c4be6e9765c8487a65e8f55 (4.12) */ -#define IFLA_GRE_FWMARK 20 -#endif - -#if !HAVE_IFLA_GRE_ERSPAN_INDEX /* linux@84e54fe0a5eaed696dee4019c396f8396f5a908b (4.14) */ -#define IFLA_GRE_ERSPAN_INDEX 21 -#endif - -#if !HAVE_IFLA_GRE_ERSPAN_HWID /* linux@f551c91de262ba36b20c3ac19538afb4f4507441 (4.16) */ -#define IFLA_GRE_ERSPAN_VER 22 -#define IFLA_GRE_ERSPAN_DIR 23 -#define IFLA_GRE_ERSPAN_HWID 24 - -#undef IFLA_GRE_MAX -#define IFLA_GRE_MAX 24 -#endif diff --git a/src/basic/missing_network.h b/src/basic/missing_network.h index 80ef13fd3ea..257879405c9 100644 --- a/src/basic/missing_network.h +++ b/src/basic/missing_network.h @@ -1,158 +1,22 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ #pragma once -#include <linux/loop.h> -#include <linux/rtnetlink.h> -#include <net/ethernet.h> - -#include "missing_ethtool.h" -#include "missing_fib_rules.h" -#include "missing_fou.h" -#include "missing_if_bridge.h" -#include "missing_if_link.h" -#include "missing_if_tunnel.h" -#include "missing_vxcan.h" - -/* if.h */ -/* The following two defines are actually available in the kernel headers for longer, but we define them here anyway, - * since that makes it easier to use them in conjunction with the glibc net/if.h header which conflicts with - * linux/if.h. */ -#ifndef IF_OPER_UNKNOWN -#define IF_OPER_UNKNOWN 0 -#endif - -#ifndef IF_OPER_UP -#define IF_OPER_UP 6 -#endif - -#ifndef IFF_LOWER_UP -#define IFF_LOWER_UP 0x10000 -#endif - -#ifndef IFF_DORMANT -#define IFF_DORMANT 0x20000 -#endif - -/* if_addr.h */ -#if !HAVE_IFA_FLAGS -#define IFA_FLAGS 8 -#endif - -#ifndef IFA_F_MANAGETEMPADDR -#define IFA_F_MANAGETEMPADDR 0x100 -#endif - -#ifndef IFA_F_NOPREFIXROUTE -#define IFA_F_NOPREFIXROUTE 0x200 -#endif - -#ifndef IFA_F_MCAUTOJOIN -#define IFA_F_MCAUTOJOIN 0x400 -#endif - -/* if_arp.h */ -#ifndef ARPHRD_IP6GRE -#define ARPHRD_IP6GRE 823 -#endif - -/* if_bonding.h */ -#ifndef BOND_XMIT_POLICY_ENCAP23 -#define BOND_XMIT_POLICY_ENCAP23 3 -#endif - -#ifndef BOND_XMIT_POLICY_ENCAP34 -#define BOND_XMIT_POLICY_ENCAP34 4 -#endif - -/* if_tun.h */ -#ifndef IFF_MULTI_QUEUE -#define IFF_MULTI_QUEUE 0x100 -#endif - -/* in6.h */ +/* linux/in6.h or netinet/in.h */ #ifndef IPV6_UNICAST_IF #define IPV6_UNICAST_IF 76 #endif -/* ip.h */ +/* Not exposed but defined at include/net/ip.h */ #ifndef IPV4_MIN_MTU #define IPV4_MIN_MTU 68 #endif -/* ipv6.h */ +/* linux/ipv6.h */ #ifndef IPV6_MIN_MTU #define IPV6_MIN_MTU 1280 #endif -/* loop.h */ -#if !HAVE_LO_FLAGS_PARTSCAN -#define LO_FLAGS_PARTSCAN 8 -#endif - -#ifndef LOOP_CTL_REMOVE -#define LOOP_CTL_REMOVE 0x4C81 -#endif - -#ifndef LOOP_CTL_GET_FREE -#define LOOP_CTL_GET_FREE 0x4C82 -#endif - -/* netdevice.h */ -#ifndef NET_ADDR_PERM -#define NET_ADDR_PERM 0 -#endif - -#ifndef NET_ADDR_RANDOM -#define NET_ADDR_RANDOM 1 -#endif - -#ifndef NET_ADDR_STOLEN -#define NET_ADDR_STOLEN 2 -#endif - -#ifndef NET_ADDR_SET -#define NET_ADDR_SET 3 -#endif - -#ifndef NET_NAME_UNKNOWN -#define NET_NAME_UNKNOWN 0 -#endif - -#ifndef NET_NAME_ENUM -#define NET_NAME_ENUM 1 -#endif - -#ifndef NET_NAME_PREDICTABLE -#define NET_NAME_PREDICTABLE 2 -#endif - -#ifndef NET_NAME_USER -#define NET_NAME_USER 3 -#endif - -#ifndef NET_NAME_RENAMED -#define NET_NAME_RENAMED 4 -#endif - -/* netlink.h */ -#ifndef NETLINK_LIST_MEMBERSHIPS /* b42be38b2778eda2237fc759e55e3b698b05b315 (4.2) */ -#define NETLINK_LIST_MEMBERSHIPS 9 -#endif - -/* rtnetlink.h */ -#ifndef RTA_PREF -#define RTA_PREF 20 -#endif - -#ifndef RTAX_QUICKACK -#define RTAX_QUICKACK 15 -#endif - -#ifndef RTA_EXPIRES -#define RTA_EXPIRES 23 -#endif - -/* Note that LOOPBACK_IFINDEX is currently not exported by the +/* Note that LOOPBACK_IFINDEX is currently not exposed by the * kernel/glibc, but hardcoded internally by the kernel. However, as * it is exported to userspace indirectly via rtnetlink and the * ioctls, and made use of widely we define it here too, in a way that diff --git a/src/basic/missing_vxcan.h b/src/basic/missing_vxcan.h deleted file mode 100644 index be430f708dd..00000000000 --- a/src/basic/missing_vxcan.h +++ /dev/null @@ -1,12 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1+ */ -#pragma once - -#if !HAVE_LINUX_CAN_VXCAN_H /* linux@a8f820a380a2a06fc4fe1a54159067958f800929 (4.12) */ -enum { - VXCAN_INFO_UNSPEC, - VXCAN_INFO_PEER, - - __VXCAN_INFO_MAX -#define VXCAN_INFO_MAX (__VXCAN_INFO_MAX - 1) -}; -#endif diff --git a/src/core/bpf-devices.c b/src/core/bpf-devices.c index 81e91fcb362..9750c4c6827 100644 --- a/src/core/bpf-devices.c +++ b/src/core/bpf-devices.c @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ -#include <linux/libbpf.h> +#include <linux/bpf_insn.h> #include "bpf-devices.h" #include "bpf-program.h" diff --git a/src/core/bpf-firewall.c b/src/core/bpf-firewall.c index 2ecce300da1..723c7b4b4e1 100644 --- a/src/core/bpf-firewall.c +++ b/src/core/bpf-firewall.c @@ -4,7 +4,7 @@ #include <assert.h> #include <errno.h> #include <fcntl.h> -#include <linux/libbpf.h> +#include <linux/bpf_insn.h> #include <net/ethernet.h> #include <net/if.h> #include <netinet/ip.h> diff --git a/src/libsystemd/sd-netlink/netlink-types.c b/src/libsystemd/sd-netlink/netlink-types.c index 8248ac0f5a5..0c67d1c68f5 100644 --- a/src/libsystemd/sd-netlink/netlink-types.c +++ b/src/libsystemd/sd-netlink/netlink-types.c @@ -3,6 +3,7 @@ #include <netinet/in.h> #include <stdint.h> #include <sys/socket.h> +#include <linux/can/vxcan.h> #include <linux/netlink.h> #include <linux/rtnetlink.h> #include <linux/genetlink.h> @@ -10,6 +11,7 @@ #include <linux/if.h> #include <linux/can/netlink.h> #include <linux/fib_rules.h> +#include <linux/fou.h> #include <linux/if_addr.h> #include <linux/if_addrlabel.h> #include <linux/if_bridge.h> @@ -17,14 +19,7 @@ #include <linux/if_tunnel.h> #include <linux/l2tp.h> #include <linux/veth.h> - -#if HAVE_LINUX_FOU_H -#include <linux/fou.h> -#endif - -#if HAVE_LINUX_CAN_VXCAN_H -#include <linux/can/vxcan.h> -#endif +#include <linux/wireguard.h> #include "macro.h" #include "missing.h" @@ -32,7 +27,6 @@ #include "sd-netlink.h" #include "string-table.h" #include "util.h" -#include "wireguard-netlink.h" /* Maximum ARP IP target defined in kernel */ #define BOND_MAX_ARP_TARGETS 16 diff --git a/src/network/netdev/fou-tunnel.h b/src/network/netdev/fou-tunnel.h index 0e3fd7dd766..51eeac41bd2 100644 --- a/src/network/netdev/fou-tunnel.h +++ b/src/network/netdev/fou-tunnel.h @@ -1,12 +1,9 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ #pragma once -#if HAVE_LINUX_FOU_H #include <linux/fou.h> -#endif #include "in-addr-util.h" -#include "missing_fou.h" #include "netdev/netdev.h" typedef enum FooOverUDPEncapType { diff --git a/src/network/netdev/ipvlan.h b/src/network/netdev/ipvlan.h index fb426d37e5d..78f09dbb2d5 100644 --- a/src/network/netdev/ipvlan.h +++ b/src/network/netdev/ipvlan.h @@ -3,7 +3,6 @@ #include <linux/if_link.h> -#include "missing_if_link.h" #include "netdev/netdev.h" typedef enum IPVlanMode { diff --git a/src/network/netdev/tunnel.c b/src/network/netdev/tunnel.c index 719b5e4add5..84f6af8578f 100644 --- a/src/network/netdev/tunnel.c +++ b/src/network/netdev/tunnel.c @@ -1,15 +1,11 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ #include <arpa/inet.h> -#include <net/if.h> +#include <linux/fou.h> #include <linux/ip.h> #include <linux/if_tunnel.h> #include <linux/ip6_tunnel.h> -#if HAVE_LINUX_FOU_H -#include <linux/fou.h> -#endif - #include "sd-netlink.h" #include "conf-parser.h" diff --git a/src/network/netdev/vxcan.c b/src/network/netdev/vxcan.c index e8ea70a1edc..c5dd5df51c5 100644 --- a/src/network/netdev/vxcan.c +++ b/src/network/netdev/vxcan.c @@ -1,10 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ -#if HAVE_LINUX_CAN_VXCAN_H #include <linux/can/vxcan.h> -#endif -#include "missing.h" #include "netdev/vxcan.h" static int netdev_vxcan_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *m) { diff --git a/src/network/netdev/wireguard.c b/src/network/netdev/wireguard.c index 5aa10fc4dea..aa7d7be16e2 100644 --- a/src/network/netdev/wireguard.c +++ b/src/network/netdev/wireguard.c @@ -23,7 +23,6 @@ #include "resolve-private.h" #include "string-util.h" #include "strv.h" -#include "wireguard-netlink.h" #include "wireguard.h" static void resolve_endpoints(NetDev *netdev); diff --git a/src/network/netdev/wireguard.h b/src/network/netdev/wireguard.h index 4ae520c52ba..862f2a99c4c 100644 --- a/src/network/netdev/wireguard.h +++ b/src/network/netdev/wireguard.h @@ -2,10 +2,11 @@ typedef struct Wireguard Wireguard; +#include <linux/wireguard.h> + #include "in-addr-util.h" #include "netdev.h" #include "socket-util.h" -#include "wireguard-netlink.h" typedef struct WireguardIPmask { uint16_t family; diff --git a/src/network/networkd-brvlan.c b/src/network/networkd-brvlan.c index 8377623da48..8f9103f1466 100644 --- a/src/network/networkd-brvlan.c +++ b/src/network/networkd-brvlan.c @@ -9,7 +9,6 @@ #include "alloc-util.h" #include "conf-parser.h" -#include "missing_if_bridge.h" #include "netlink-util.h" #include "networkd-brvlan.h" #include "networkd-link.h" diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 836776ae849..2c8896530a0 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -1,7 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ -#include <ctype.h> -#include <net/if.h> +#include <linux/netdevice.h> #include "alloc-util.h" #include "conf-files.h" @@ -10,7 +9,6 @@ #include "fd-util.h" #include "hostname-util.h" #include "in-addr-util.h" -#include "missing_network.h" #include "network-internal.h" #include "networkd-manager.h" #include "networkd-network.h" diff --git a/src/network/networkd-routing-policy-rule.h b/src/network/networkd-routing-policy-rule.h index e1bd78f8095..28699ba2369 100644 --- a/src/network/networkd-routing-policy-rule.h +++ b/src/network/networkd-routing-policy-rule.h @@ -7,7 +7,6 @@ #include "in-addr-util.h" #include "conf-parser.h" -#include "missing_fib_rules.h" typedef struct RoutingPolicyRule RoutingPolicyRule; diff --git a/src/partition/growfs.c b/src/partition/growfs.c index 60a310946d0..ce86f96e13d 100644 --- a/src/partition/growfs.c +++ b/src/partition/growfs.c @@ -3,6 +3,7 @@ #include <errno.h> #include <fcntl.h> #include <getopt.h> +#include <linux/btrfs.h> #include <linux/magic.h> #include <sys/ioctl.h> #include <sys/mount.h> diff --git a/src/resolve/resolved-link.c b/src/resolve/resolved-link.c index 44f70aceaa3..50f9309f105 100644 --- a/src/resolve/resolved-link.c +++ b/src/resolve/resolved-link.c @@ -1,7 +1,9 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ #include <net/if.h> +#include <linux/if.h> #include <stdio_ext.h> +#include <unistd.h> #include "sd-network.h" @@ -9,7 +11,6 @@ #include "env-file.h" #include "fd-util.h" #include "fileio.h" -#include "missing.h" #include "mkdir.h" #include "parse-util.h" #include "resolved-link.h" diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index ce210bfd436..ac2f7ceaf83 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -1,5 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ +#include <linux/dm-ioctl.h> +#include <linux/loop.h> #include <sys/mount.h> #include <sys/prctl.h> #include <sys/wait.h> @@ -25,7 +27,6 @@ #include "hexdecoct.h" #include "hostname-util.h" #include "id128-util.h" -#include "linux-3.13/dm-ioctl.h" #include "missing.h" #include "mount-util.h" #include "mountpoint-util.h" diff --git a/src/shared/linux/README b/src/shared/linux/README new file mode 100644 index 00000000000..34f90486bb8 --- /dev/null +++ b/src/shared/linux/README @@ -0,0 +1,8 @@ +The files in this directory are copied from kernel-5.0, and the following modifications are applied: +- auto_dev-ioctl.h: set AUTOFS_DEV_IOCTL_VERSION_MINOR to 0 +- auto_dev-ioctl.h: define AUTOFS_IOCTL if not defined +- bpf_insn.h: This is imported from samples/bpf/bpf_insn.h +- bpf_insn.h: BPF_JMP_A() macro is also imported from include/linux/filter.h +- dm-ioctl.h: set DM_VERSION_MINOR to 27 +- ethtool.h: add a type cast to SPEED_UNKNOWN +- ethtool.h: define __KERNEL_DIV_ROUND_UP if not defined diff --git a/src/shared/linux/auto_dev-ioctl.h b/src/shared/linux/auto_dev-ioctl.h index d9838eba494..261546c667d 100644 --- a/src/shared/linux/auto_dev-ioctl.h +++ b/src/shared/linux/auto_dev-ioctl.h @@ -1,31 +1,24 @@ -/* SPDX-License-Identifier: GPL-2.0+ */ +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ /* - * Copyright © 2008 Red Hat, Inc. All rights reserved. - * Copyright © 2008 Ian Kent <raven@themaw.net> + * Copyright 2008 Red Hat, Inc. All rights reserved. + * Copyright 2008 Ian Kent <raven@themaw.net> * * This file is part of the Linux kernel and is made available under * the terms of the GNU General Public License, version 2, or at your * option, any later version, incorporated herein by reference. */ -#ifndef _LINUX_AUTO_DEV_IOCTL_H -#define _LINUX_AUTO_DEV_IOCTL_H +#ifndef _UAPI_LINUX_AUTO_DEV_IOCTL_H +#define _UAPI_LINUX_AUTO_DEV_IOCTL_H #include <linux/auto_fs.h> - -#ifdef __KERNEL__ #include <linux/string.h> -#else -#include <string.h> -#endif /* __KERNEL__ */ #define AUTOFS_DEVICE_NAME "autofs" #define AUTOFS_DEV_IOCTL_VERSION_MAJOR 1 #define AUTOFS_DEV_IOCTL_VERSION_MINOR 0 -#define AUTOFS_DEVID_LEN 16 - #define AUTOFS_DEV_IOCTL_SIZE sizeof(struct autofs_dev_ioctl) /* @@ -119,19 +112,15 @@ struct autofs_dev_ioctl { char path[0]; }; -static inline void init_autofs_dev_ioctl(struct autofs_dev_ioctl *in) { - memset(in, 0, sizeof(struct autofs_dev_ioctl)); +static inline void init_autofs_dev_ioctl(struct autofs_dev_ioctl *in) +{ + memset(in, 0, AUTOFS_DEV_IOCTL_SIZE); in->ver_major = AUTOFS_DEV_IOCTL_VERSION_MAJOR; in->ver_minor = AUTOFS_DEV_IOCTL_VERSION_MINOR; - in->size = sizeof(struct autofs_dev_ioctl); + in->size = AUTOFS_DEV_IOCTL_SIZE; in->ioctlfd = -1; - return; } -/* - * If you change this make sure you make the corresponding change - * to autofs-dev-ioctl.c:lookup_ioctl() - */ enum { /* Get various version info */ AUTOFS_DEV_IOCTL_VERSION_CMD = 0x71, @@ -168,7 +157,9 @@ enum { AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD, }; +#ifndef AUTOFS_IOCTL #define AUTOFS_IOCTL 0x93 +#endif #define AUTOFS_DEV_IOCTL_VERSION \ _IOWR(AUTOFS_IOCTL, \ @@ -226,4 +217,4 @@ enum { _IOWR(AUTOFS_IOCTL, \ AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD, struct autofs_dev_ioctl) -#endif /* _LINUX_AUTO_DEV_IOCTL_H */ +#endif /* _UAPI_LINUX_AUTO_DEV_IOCTL_H */ diff --git a/src/shared/linux/bpf.h b/src/shared/linux/bpf.h index 1df9e7e3d06..91c43884f29 100644 --- a/src/shared/linux/bpf.h +++ b/src/shared/linux/bpf.h @@ -44,106 +44,149 @@ /* Register numbers */ enum { - BPF_REG_0 = 0, - BPF_REG_1, - BPF_REG_2, - BPF_REG_3, - BPF_REG_4, - BPF_REG_5, - BPF_REG_6, - BPF_REG_7, - BPF_REG_8, - BPF_REG_9, - BPF_REG_10, - __MAX_BPF_REG, + BPF_REG_0 = 0, + BPF_REG_1, + BPF_REG_2, + BPF_REG_3, + BPF_REG_4, + BPF_REG_5, + BPF_REG_6, + BPF_REG_7, + BPF_REG_8, + BPF_REG_9, + BPF_REG_10, + __MAX_BPF_REG, }; /* BPF has 10 general purpose 64-bit registers and stack frame. */ #define MAX_BPF_REG __MAX_BPF_REG struct bpf_insn { - __u8 code; /* opcode */ - __u8 dst_reg:4; /* dest register */ - __u8 src_reg:4; /* source register */ - __s16 off; /* signed offset */ - __s32 imm; /* signed immediate constant */ + __u8 code; /* opcode */ + __u8 dst_reg:4; /* dest register */ + __u8 src_reg:4; /* source register */ + __s16 off; /* signed offset */ + __s32 imm; /* signed immediate constant */ }; /* Key of an a BPF_MAP_TYPE_LPM_TRIE entry */ struct bpf_lpm_trie_key { - __u32 prefixlen; /* up to 32 for AF_INET, 128 for AF_INET6 */ - __u8 data[0]; /* Arbitrary size */ + __u32 prefixlen; /* up to 32 for AF_INET, 128 for AF_INET6 */ + __u8 data[0]; /* Arbitrary size */ +}; + +struct bpf_cgroup_storage_key { + __u64 cgroup_inode_id; /* cgroup inode id */ + __u32 attach_type; /* program attach type */ }; /* BPF syscall commands, see bpf(2) man-page for details. */ enum bpf_cmd { - BPF_MAP_CREATE, - BPF_MAP_LOOKUP_ELEM, - BPF_MAP_UPDATE_ELEM, - BPF_MAP_DELETE_ELEM, - BPF_MAP_GET_NEXT_KEY, - BPF_PROG_LOAD, - BPF_OBJ_PIN, - BPF_OBJ_GET, - BPF_PROG_ATTACH, - BPF_PROG_DETACH, - BPF_PROG_TEST_RUN, - BPF_PROG_GET_NEXT_ID, - BPF_MAP_GET_NEXT_ID, - BPF_PROG_GET_FD_BY_ID, - BPF_MAP_GET_FD_BY_ID, - BPF_OBJ_GET_INFO_BY_FD, - BPF_PROG_QUERY, + BPF_MAP_CREATE, + BPF_MAP_LOOKUP_ELEM, + BPF_MAP_UPDATE_ELEM, + BPF_MAP_DELETE_ELEM, + BPF_MAP_GET_NEXT_KEY, + BPF_PROG_LOAD, + BPF_OBJ_PIN, + BPF_OBJ_GET, + BPF_PROG_ATTACH, + BPF_PROG_DETACH, + BPF_PROG_TEST_RUN, + BPF_PROG_GET_NEXT_ID, + BPF_MAP_GET_NEXT_ID, + BPF_PROG_GET_FD_BY_ID, + BPF_MAP_GET_FD_BY_ID, + BPF_OBJ_GET_INFO_BY_FD, + BPF_PROG_QUERY, + BPF_RAW_TRACEPOINT_OPEN, + BPF_BTF_LOAD, + BPF_BTF_GET_FD_BY_ID, + BPF_TASK_FD_QUERY, + BPF_MAP_LOOKUP_AND_DELETE_ELEM, }; enum bpf_map_type { - BPF_MAP_TYPE_UNSPEC, - BPF_MAP_TYPE_HASH, - BPF_MAP_TYPE_ARRAY, - BPF_MAP_TYPE_PROG_ARRAY, - BPF_MAP_TYPE_PERF_EVENT_ARRAY, - BPF_MAP_TYPE_PERCPU_HASH, - BPF_MAP_TYPE_PERCPU_ARRAY, - BPF_MAP_TYPE_STACK_TRACE, - BPF_MAP_TYPE_CGROUP_ARRAY, - BPF_MAP_TYPE_LRU_HASH, - BPF_MAP_TYPE_LRU_PERCPU_HASH, - BPF_MAP_TYPE_LPM_TRIE, - BPF_MAP_TYPE_ARRAY_OF_MAPS, - BPF_MAP_TYPE_HASH_OF_MAPS, - BPF_MAP_TYPE_DEVMAP, - BPF_MAP_TYPE_SOCKMAP, - BPF_MAP_TYPE_CPUMAP, + BPF_MAP_TYPE_UNSPEC, + BPF_MAP_TYPE_HASH, + BPF_MAP_TYPE_ARRAY, + BPF_MAP_TYPE_PROG_ARRAY, + BPF_MAP_TYPE_PERF_EVENT_ARRAY, + BPF_MAP_TYPE_PERCPU_HASH, + BPF_MAP_TYPE_PERCPU_ARRAY, + BPF_MAP_TYPE_STACK_TRACE, + BPF_MAP_TYPE_CGROUP_ARRAY, + BPF_MAP_TYPE_LRU_HASH, + BPF_MAP_TYPE_LRU_PERCPU_HASH, + BPF_MAP_TYPE_LPM_TRIE, + BPF_MAP_TYPE_ARRAY_OF_MAPS, + BPF_MAP_TYPE_HASH_OF_MAPS, + BPF_MAP_TYPE_DEVMAP, + BPF_MAP_TYPE_SOCKMAP, + BPF_MAP_TYPE_CPUMAP, + BPF_MAP_TYPE_XSKMAP, + BPF_MAP_TYPE_SOCKHASH, + BPF_MAP_TYPE_CGROUP_STORAGE, + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY, + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE, + BPF_MAP_TYPE_QUEUE, + BPF_MAP_TYPE_STACK, }; +/* Note that tracing related programs such as + * BPF_PROG_TYPE_{KPROBE,TRACEPOINT,PERF_EVENT,RAW_TRACEPOINT} + * are not subject to a stable API since kernel internal data + * structures can change from release to release and may + * therefore break existing tracing BPF programs. Tracing BPF + * programs correspond to /a/ specific kernel which is to be + * analyzed, and not /a/ specific kernel /and/ all future ones. + */ enum bpf_prog_type { - BPF_PROG_TYPE_UNSPEC, - BPF_PROG_TYPE_SOCKET_FILTER, - BPF_PROG_TYPE_KPROBE, - BPF_PROG_TYPE_SCHED_CLS, - BPF_PROG_TYPE_SCHED_ACT, - BPF_PROG_TYPE_TRACEPOINT, - BPF_PROG_TYPE_XDP, - BPF_PROG_TYPE_PERF_EVENT, - BPF_PROG_TYPE_CGROUP_SKB, - BPF_PROG_TYPE_CGROUP_SOCK, - BPF_PROG_TYPE_LWT_IN, - BPF_PROG_TYPE_LWT_OUT, - BPF_PROG_TYPE_LWT_XMIT, - BPF_PROG_TYPE_SOCK_OPS, - BPF_PROG_TYPE_SK_SKB, - BPF_PROG_TYPE_CGROUP_DEVICE, + BPF_PROG_TYPE_UNSPEC, + BPF_PROG_TYPE_SOCKET_FILTER, + BPF_PROG_TYPE_KPROBE, + BPF_PROG_TYPE_SCHED_CLS, + BPF_PROG_TYPE_SCHED_ACT, + BPF_PROG_TYPE_TRACEPOINT, + BPF_PROG_TYPE_XDP, + BPF_PROG_TYPE_PERF_EVENT, + BPF_PROG_TYPE_CGROUP_SKB, + BPF_PROG_TYPE_CGROUP_SOCK, + BPF_PROG_TYPE_LWT_IN, + BPF_PROG_TYPE_LWT_OUT, + BPF_PROG_TYPE_LWT_XMIT, + BPF_PROG_TYPE_SOCK_OPS, + BPF_PROG_TYPE_SK_SKB, + BPF_PROG_TYPE_CGROUP_DEVICE, + BPF_PROG_TYPE_SK_MSG, + BPF_PROG_TYPE_RAW_TRACEPOINT, + BPF_PROG_TYPE_CGROUP_SOCK_ADDR, + BPF_PROG_TYPE_LWT_SEG6LOCAL, + BPF_PROG_TYPE_LIRC_MODE2, + BPF_PROG_TYPE_SK_REUSEPORT, + BPF_PROG_TYPE_FLOW_DISSECTOR, }; enum bpf_attach_type { - BPF_CGROUP_INET_INGRESS, - BPF_CGROUP_INET_EGRESS, - BPF_CGROUP_INET_SOCK_CREATE, - BPF_CGROUP_SOCK_OPS, - BPF_SK_SKB_STREAM_PARSER, - BPF_SK_SKB_STREAM_VERDICT, - BPF_CGROUP_DEVICE, - __MAX_BPF_ATTACH_TYPE + BPF_CGROUP_INET_INGRESS, + BPF_CGROUP_INET_EGRESS, + BPF_CGROUP_INET_SOCK_CREATE, + BPF_CGROUP_SOCK_OPS, + BPF_SK_SKB_STREAM_PARSER, + BPF_SK_SKB_STREAM_VERDICT, + BPF_CGROUP_DEVICE, + BPF_SK_MSG_VERDICT, + BPF_CGROUP_INET4_BIND, + BPF_CGROUP_INET6_BIND, + BPF_CGROUP_INET4_CONNECT, + BPF_CGROUP_INET6_CONNECT, + BPF_CGROUP_INET4_POST_BIND, + BPF_CGROUP_INET6_POST_BIND, + BPF_CGROUP_UDP4_SENDMSG, + BPF_CGROUP_UDP6_SENDMSG, + BPF_LIRC_MODE2, + BPF_FLOW_DISSECTOR, + __MAX_BPF_ATTACH_TYPE }; #define MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE @@ -197,6 +240,20 @@ enum bpf_attach_type { */ #define BPF_F_STRICT_ALIGNMENT (1U << 0) +/* If BPF_F_ANY_ALIGNMENT is used in BPF_PROF_LOAD command, the + * verifier will allow any alignment whatsoever. On platforms + * with strict alignment requirements for loads ands stores (such + * as sparc and mips) the verifier validates that all loads and + * stores provably follow this requirement. This flag turns that + * checking and enforcement off. + * + * It is mostly used for testing when we want to validate the + * context and memory access aspects of the verifier, but because + * of an unaligned access the alignment check would trigger before + * the one we are interested in. + */ +#define BPF_F_ANY_ALIGNMENT (1U << 1) + /* when bpf_ldimm64->src_reg == BPF_PSEUDO_MAP_FD, bpf_ldimm64->imm == fd */ #define BPF_PSEUDO_MAP_FD 1 @@ -222,550 +279,2157 @@ enum bpf_attach_type { /* Specify numa node during map creation */ #define BPF_F_NUMA_NODE (1U << 2) -/* flags for BPF_PROG_QUERY */ -#define BPF_F_QUERY_EFFECTIVE (1U << 0) - #define BPF_OBJ_NAME_LEN 16U /* Flags for accessing BPF object */ #define BPF_F_RDONLY (1U << 3) #define BPF_F_WRONLY (1U << 4) +/* Flag for stack_map, store build_id+offset instead of pointer */ +#define BPF_F_STACK_BUILD_ID (1U << 5) + +/* Zero-initialize hash function seed. This should only be used for testing. */ +#define BPF_F_ZERO_SEED (1U << 6) + +/* flags for BPF_PROG_QUERY */ +#define BPF_F_QUERY_EFFECTIVE (1U << 0) + +enum bpf_stack_build_id_status { + /* user space need an empty entry to identify end of a trace */ + BPF_STACK_BUILD_ID_EMPTY = 0, + /* with valid build_id and offset */ + BPF_STACK_BUILD_ID_VALID = 1, + /* couldn't get build_id, fallback to ip */ + BPF_STACK_BUILD_ID_IP = 2, +}; + +#define BPF_BUILD_ID_SIZE 20 +struct bpf_stack_build_id { + __s32 status; + unsigned char build_id[BPF_BUILD_ID_SIZE]; + union { + __u64 offset; + __u64 ip; + }; +}; + union bpf_attr { - struct { /* anonymous struct used by BPF_MAP_CREATE command */ - __u32 map_type; /* one of enum bpf_map_type */ - __u32 key_size; /* size of key in bytes */ - __u32 value_size; /* size of value in bytes */ - __u32 max_entries; /* max number of entries in a map */ - __u32 map_flags; /* BPF_MAP_CREATE related - * flags defined above. - */ - __u32 inner_map_fd; /* fd pointing to the inner map */ - __u32 numa_node; /* numa node (effective only if - * BPF_F_NUMA_NODE is set). - */ - char map_name[BPF_OBJ_NAME_LEN]; - __u32 map_ifindex; /* ifindex of netdev to create on */ - }; - - struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ - __u32 map_fd; - __aligned_u64 key; - union { - __aligned_u64 value; - __aligned_u64 next_key; - }; - __u64 flags; - }; - - struct { /* anonymous struct used by BPF_PROG_LOAD command */ - __u32 prog_type; /* one of enum bpf_prog_type */ - __u32 insn_cnt; - __aligned_u64 insns; - __aligned_u64 license; - __u32 log_level; /* verbosity level of verifier */ - __u32 log_size; /* size of user buffer */ - __aligned_u64 log_buf; /* user supplied buffer */ - __u32 kern_version; /* checked when prog_type=kprobe */ - __u32 prog_flags; - char prog_name[BPF_OBJ_NAME_LEN]; - __u32 prog_ifindex; /* ifindex of netdev to prep for */ - }; - - struct { /* anonymous struct used by BPF_OBJ_* commands */ - __aligned_u64 pathname; - __u32 bpf_fd; - __u32 file_flags; - }; - - struct { /* anonymous struct used by BPF_PROG_ATTACH/DETACH commands */ - __u32 target_fd; /* container object to attach to */ - __u32 attach_bpf_fd; /* eBPF program to attach */ - __u32 attach_type; - __u32 attach_flags; - }; - - struct { /* anonymous struct used by BPF_PROG_TEST_RUN command */ - __u32 prog_fd; - __u32 retval; - __u32 data_size_in; - __u32 data_size_out; - __aligned_u64 data_in; - __aligned_u64 data_out; - __u32 repeat; - __u32 duration; - } test; - - struct { /* anonymous struct used by BPF_*_GET_*_ID */ - union { - __u32 start_id; - __u32 prog_id; - __u32 map_id; - }; - __u32 next_id; - __u32 open_flags; - }; - - struct { /* anonymous struct used by BPF_OBJ_GET_INFO_BY_FD */ - __u32 bpf_fd; - __u32 info_len; - __aligned_u64 info; - } info; - - struct { /* anonymous struct used by BPF_PROG_QUERY command */ - __u32 target_fd; /* container object to query */ - __u32 attach_type; - __u32 query_flags; - __u32 attach_flags; - __aligned_u64 prog_ids; - __u32 prog_cnt; - } query; + struct { /* anonymous struct used by BPF_MAP_CREATE command */ + __u32 map_type; /* one of enum bpf_map_type */ + __u32 key_size; /* size of key in bytes */ + __u32 value_size; /* size of value in bytes */ + __u32 max_entries; /* max number of entries in a map */ + __u32 map_flags; /* BPF_MAP_CREATE related + * flags defined above. + */ + __u32 inner_map_fd; /* fd pointing to the inner map */ + __u32 numa_node; /* numa node (effective only if + * BPF_F_NUMA_NODE is set). + */ + char map_name[BPF_OBJ_NAME_LEN]; + __u32 map_ifindex; /* ifindex of netdev to create on */ + __u32 btf_fd; /* fd pointing to a BTF type data */ + __u32 btf_key_type_id; /* BTF type_id of the key */ + __u32 btf_value_type_id; /* BTF type_id of the value */ + }; + + struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ + __u32 map_fd; + __aligned_u64 key; + union { + __aligned_u64 value; + __aligned_u64 next_key; + }; + __u64 flags; + }; + + struct { /* anonymous struct used by BPF_PROG_LOAD command */ + __u32 prog_type; /* one of enum bpf_prog_type */ + __u32 insn_cnt; + __aligned_u64 insns; + __aligned_u64 license; + __u32 log_level; /* verbosity level of verifier */ + __u32 log_size; /* size of user buffer */ + __aligned_u64 log_buf; /* user supplied buffer */ + __u32 kern_version; /* not used */ + __u32 prog_flags; + char prog_name[BPF_OBJ_NAME_LEN]; + __u32 prog_ifindex; /* ifindex of netdev to prep for */ + /* For some prog types expected attach type must be known at + * load time to verify attach type specific parts of prog + * (context accesses, allowed helpers, etc). + */ + __u32 expected_attach_type; + __u32 prog_btf_fd; /* fd pointing to BTF type data */ + __u32 func_info_rec_size; /* userspace bpf_func_info size */ + __aligned_u64 func_info; /* func info */ + __u32 func_info_cnt; /* number of bpf_func_info records */ + __u32 line_info_rec_size; /* userspace bpf_line_info size */ + __aligned_u64 line_info; /* line info */ + __u32 line_info_cnt; /* number of bpf_line_info records */ + }; + + struct { /* anonymous struct used by BPF_OBJ_* commands */ + __aligned_u64 pathname; + __u32 bpf_fd; + __u32 file_flags; + }; + + struct { /* anonymous struct used by BPF_PROG_ATTACH/DETACH commands */ + __u32 target_fd; /* container object to attach to */ + __u32 attach_bpf_fd; /* eBPF program to attach */ + __u32 attach_type; + __u32 attach_flags; + }; + + struct { /* anonymous struct used by BPF_PROG_TEST_RUN command */ + __u32 prog_fd; + __u32 retval; + __u32 data_size_in; /* input: len of data_in */ + __u32 data_size_out; /* input/output: len of data_out + * returns ENOSPC if data_out + * is too small. + */ + __aligned_u64 data_in; + __aligned_u64 data_out; + __u32 repeat; + __u32 duration; + } test; + + struct { /* anonymous struct used by BPF_*_GET_*_ID */ + union { + __u32 start_id; + __u32 prog_id; + __u32 map_id; + __u32 btf_id; + }; + __u32 next_id; + __u32 open_flags; + }; + + struct { /* anonymous struct used by BPF_OBJ_GET_INFO_BY_FD */ + __u32 bpf_fd; + __u32 info_len; + __aligned_u64 info; + } info; + + struct { /* anonymous struct used by BPF_PROG_QUERY command */ + __u32 target_fd; /* container object to query */ + __u32 attach_type; + __u32 query_flags; + __u32 attach_flags; + __aligned_u64 prog_ids; + __u32 prog_cnt; + } query; + + struct { + __u64 name; + __u32 prog_fd; + } raw_tracepoint; + + struct { /* anonymous struct for BPF_BTF_LOAD */ + __aligned_u64 btf; + __aligned_u64 btf_log_buf; + __u32 btf_size; + __u32 btf_log_size; + __u32 btf_log_level; + }; + + struct { + __u32 pid; /* input: pid */ + __u32 fd; /* input: fd */ + __u32 flags; /* input: flags */ + __u32 buf_len; /* input/output: buf len */ + __aligned_u64 buf; /* input/output: + * tp_name for tracepoint + * symbol for kprobe + * filename for uprobe + */ + __u32 prog_id; /* output: prod_id */ + __u32 fd_type; /* output: BPF_FD_TYPE_* */ + __u64 probe_offset; /* output: probe_offset */ + __u64 probe_addr; /* output: probe_addr */ + } task_fd_query; } __attribute__((aligned(8))); -/* BPF helper function descriptions: - * - * void *bpf_map_lookup_elem(&map, &key) - * Return: Map value or NULL - * - * int bpf_map_update_elem(&map, &key, &value, flags) - * Return: 0 on success or negative error - * - * int bpf_map_delete_elem(&map, &key) - * Return: 0 on success or negative error - * - * int bpf_probe_read(void *dst, int size, void *src) - * Return: 0 on success or negative error +/* The description below is an attempt at providing documentation to eBPF + * developers about the multiple available eBPF helper functions. It can be + * parsed and used to produce a manual page. The workflow is the following, + * and requires the rst2man utility: + * + * $ ./scripts/bpf_helpers_doc.py \ + * --filename include/uapi/linux/bpf.h > /tmp/bpf-helpers.rst + * $ rst2man /tmp/bpf-helpers.rst > /tmp/bpf-helpers.7 + * $ man /tmp/bpf-helpers.7 + * + * Note that in order to produce this external documentation, some RST + * formatting is used in the descriptions to get "bold" and "italics" in + * manual pages. Also note that the few trailing white spaces are + * intentional, removing them would break paragraphs for rst2man. + * + * Start of BPF helper function descriptions: + * + * void *bpf_map_lookup_elem(struct bpf_map *map, const void *key) + * Description + * Perform a lookup in *map* for an entry associated to *key*. + * Return + * Map value associated to *key*, or **NULL** if no entry was + * found. + * + * int bpf_map_update_elem(struct bpf_map *map, const void *key, const void *value, u64 flags) + * Description + * Add or update the value of the entry associated to *key* in + * *map* with *value*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * Flag value **BPF_NOEXIST** cannot be used for maps of types + * **BPF_MAP_TYPE_ARRAY** or **BPF_MAP_TYPE_PERCPU_ARRAY** (all + * elements always exist), the helper would return an error. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_map_delete_elem(struct bpf_map *map, const void *key) + * Description + * Delete entry with *key* from *map*. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_map_push_elem(struct bpf_map *map, const void *value, u64 flags) + * Description + * Push an element *value* in *map*. *flags* is one of: + * + * **BPF_EXIST** + * If the queue/stack is full, the oldest element is removed to + * make room for this. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_probe_read(void *dst, u32 size, const void *src) + * Description + * For tracing programs, safely attempt to read *size* bytes from + * address *src* and store the data in *dst*. + * Return + * 0 on success, or a negative error in case of failure. * * u64 bpf_ktime_get_ns(void) - * Return: current ktime - * - * int bpf_trace_printk(const char *fmt, int fmt_size, ...) - * Return: length of buffer written or negative error - * - * u32 bpf_prandom_u32(void) - * Return: random value - * - * u32 bpf_raw_smp_processor_id(void) - * Return: SMP processor ID - * - * int bpf_skb_store_bytes(skb, offset, from, len, flags) - * store bytes into packet - * @skb: pointer to skb - * @offset: offset within packet from skb->mac_header - * @from: pointer where to copy bytes from - * @len: number of bytes to store into packet - * @flags: bit 0 - if true, recompute skb->csum - * other bits - reserved - * Return: 0 on success or negative error - * - * int bpf_l3_csum_replace(skb, offset, from, to, flags) - * recompute IP checksum - * @skb: pointer to skb - * @offset: offset within packet where IP checksum is located - * @from: old value of header field - * @to: new value of header field - * @flags: bits 0-3 - size of header field - * other bits - reserved - * Return: 0 on success or negative error - * - * int bpf_l4_csum_replace(skb, offset, from, to, flags) - * recompute TCP/UDP checksum - * @skb: pointer to skb - * @offset: offset within packet where TCP/UDP checksum is located - * @from: old value of header field - * @to: new value of header field - * @flags: bits 0-3 - size of header field - * bit 4 - is pseudo header - * other bits - reserved - * Return: 0 on success or negative error - * - * int bpf_tail_call(ctx, prog_array_map, index) - * jump into another BPF program - * @ctx: context pointer passed to next program - * @prog_array_map: pointer to map which type is BPF_MAP_TYPE_PROG_ARRAY - * @index: 32-bit index inside array that selects specific program to run - * Return: 0 on success or negative error - * - * int bpf_clone_redirect(skb, ifindex, flags) - * redirect to another netdev - * @skb: pointer to skb - * @ifindex: ifindex of the net device - * @flags: bit 0 - if set, redirect to ingress instead of egress - * other bits - reserved - * Return: 0 on success or negative error + * Description + * Return the time elapsed since system boot, in nanoseconds. + * Return + * Current *ktime*. + * + * int bpf_trace_printk(const char *fmt, u32 fmt_size, ...) + * Description + * This helper is a "printk()-like" facility for debugging. It + * prints a message defined by format *fmt* (of size *fmt_size*) + * to file *\/sys/kernel/debug/tracing/trace* from DebugFS, if + * available. It can take up to three additional **u64** + * arguments (as an eBPF helpers, the total number of arguments is + * limited to five). + * + * Each time the helper is called, it appends a line to the trace. + * The format of the trace is customizable, and the exact output + * one will get depends on the options set in + * *\/sys/kernel/debug/tracing/trace_options* (see also the + * *README* file under the same directory). However, it usually + * defaults to something like: + * + * :: + * + * telnet-470 [001] .N.. 419421.045894: 0x00000001: <formatted msg> + * + * In the above: + * + * * ``telnet`` is the name of the current task. + * * ``470`` is the PID of the current task. + * * ``001`` is the CPU number on which the task is + * running. + * * In ``.N..``, each character refers to a set of + * options (whether irqs are enabled, scheduling + * options, whether hard/softirqs are running, level of + * preempt_disabled respectively). **N** means that + * **TIF_NEED_RESCHED** and **PREEMPT_NEED_RESCHED** + * are set. + * * ``419421.045894`` is a timestamp. + * * ``0x00000001`` is a fake value used by BPF for the + * instruction pointer register. + * * ``<formatted msg>`` is the message formatted with + * *fmt*. + * + * The conversion specifiers supported by *fmt* are similar, but + * more limited than for printk(). They are **%d**, **%i**, + * **%u**, **%x**, **%ld**, **%li**, **%lu**, **%lx**, **%lld**, + * **%lli**, **%llu**, **%llx**, **%p**, **%s**. No modifier (size + * of field, padding with zeroes, etc.) is available, and the + * helper will return **-EINVAL** (but print nothing) if it + * encounters an unknown specifier. + * + * Also, note that **bpf_trace_printk**\ () is slow, and should + * only be used for debugging purposes. For this reason, a notice + * bloc (spanning several lines) is printed to kernel logs and + * states that the helper should not be used "for production use" + * the first time this helper is used (or more precisely, when + * **trace_printk**\ () buffers are allocated). For passing values + * to user space, perf events should be preferred. + * Return + * The number of bytes written to the buffer, or a negative error + * in case of failure. + * + * u32 bpf_get_prandom_u32(void) + * Description + * Get a pseudo-random number. + * + * From a security point of view, this helper uses its own + * pseudo-random internal state, and cannot be used to infer the + * seed of other random functions in the kernel. However, it is + * essential to note that the generator used by the helper is not + * cryptographically secure. + * Return + * A random 32-bit unsigned value. + * + * u32 bpf_get_smp_processor_id(void) + * Description + * Get the SMP (symmetric multiprocessing) processor id. Note that + * all programs run with preemption disabled, which means that the + * SMP processor id is stable during all the execution of the + * program. + * Return + * The SMP id of the processor running the program. + * + * int bpf_skb_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len, u64 flags) + * Description + * Store *len* bytes from address *from* into the packet + * associated to *skb*, at *offset*. *flags* are a combination of + * **BPF_F_RECOMPUTE_CSUM** (automatically recompute the + * checksum for the packet after storing the bytes) and + * **BPF_F_INVALIDATE_HASH** (set *skb*\ **->hash**, *skb*\ + * **->swhash** and *skb*\ **->l4hash** to 0). + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_l3_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 size) + * Description + * Recompute the layer 3 (e.g. IP) checksum for the packet + * associated to *skb*. Computation is incremental, so the helper + * must know the former value of the header field that was + * modified (*from*), the new value of this field (*to*), and the + * number of bytes (2 or 4) for this field, stored in *size*. + * Alternatively, it is possible to store the difference between + * the previous and the new values of the header field in *to*, by + * setting *from* and *size* to 0. For both methods, *offset* + * indicates the location of the IP checksum within the packet. + * + * This helper works in combination with **bpf_csum_diff**\ (), + * which does not update the checksum in-place, but offers more + * flexibility and can handle sizes larger than 2 or 4 for the + * checksum to update. + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_l4_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 flags) + * Description + * Recompute the layer 4 (e.g. TCP, UDP or ICMP) checksum for the + * packet associated to *skb*. Computation is incremental, so the + * helper must know the former value of the header field that was + * modified (*from*), the new value of this field (*to*), and the + * number of bytes (2 or 4) for this field, stored on the lowest + * four bits of *flags*. Alternatively, it is possible to store + * the difference between the previous and the new values of the + * header field in *to*, by setting *from* and the four lowest + * bits of *flags* to 0. For both methods, *offset* indicates the + * location of the IP checksum within the packet. In addition to + * the size of the field, *flags* can be added (bitwise OR) actual + * flags. With **BPF_F_MARK_MANGLED_0**, a null checksum is left + * untouched (unless **BPF_F_MARK_ENFORCE** is added as well), and + * for updates resulting in a null checksum the value is set to + * **CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates + * the checksum is to be computed against a pseudo-header. + * + * This helper works in combination with **bpf_csum_diff**\ (), + * which does not update the checksum in-place, but offers more + * flexibility and can handle sizes larger than 2 or 4 for the + * checksum to update. + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_tail_call(void *ctx, struct bpf_map *prog_array_map, u32 index) + * Description + * This special helper is used to trigger a "tail call", or in + * other words, to jump into another eBPF program. The same stack + * frame is used (but values on stack and in registers for the + * caller are not accessible to the callee). This mechanism allows + * for program chaining, either for raising the maximum number of + * available eBPF instructions, or to execute given programs in + * conditional blocks. For security reasons, there is an upper + * limit to the number of successive tail calls that can be + * performed. + * + * Upon call of this helper, the program attempts to jump into a + * program referenced at index *index* in *prog_array_map*, a + * special map of type **BPF_MAP_TYPE_PROG_ARRAY**, and passes + * *ctx*, a pointer to the context. + * + * If the call succeeds, the kernel immediately runs the first + * instruction of the new program. This is not a function call, + * and it never returns to the previous program. If the call + * fails, then the helper has no effect, and the caller continues + * to run its subsequent instructions. A call can fail if the + * destination program for the jump does not exist (i.e. *index* + * is superior to the number of entries in *prog_array_map*), or + * if the maximum number of tail calls has been reached for this + * chain of programs. This limit is defined in the kernel by the + * macro **MAX_TAIL_CALL_CNT** (not accessible to user space), + * which is currently set to 32. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_clone_redirect(struct sk_buff *skb, u32 ifindex, u64 flags) + * Description + * Clone and redirect the packet associated to *skb* to another + * net device of index *ifindex*. Both ingress and egress + * interfaces can be used for redirection. The **BPF_F_INGRESS** + * value in *flags* is used to make the distinction (ingress path + * is selected if the flag is present, egress path otherwise). + * This is the only flag supported for now. + * + * In comparison with **bpf_redirect**\ () helper, + * **bpf_clone_redirect**\ () has the associated cost of + * duplicating the packet buffer, but this can be executed out of + * the eBPF program. Conversely, **bpf_redirect**\ () is more + * efficient, but it is handled through an action code where the + * redirection happens only after the eBPF program has returned. + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. * * u64 bpf_get_current_pid_tgid(void) - * Return: current->tgid << 32 | current->pid + * Return + * A 64-bit integer containing the current tgid and pid, and + * created as such: + * *current_task*\ **->tgid << 32 \|** + * *current_task*\ **->pid**. * * u64 bpf_get_current_uid_gid(void) - * Return: current_gid << 32 | current_uid - * - * int bpf_get_current_comm(char *buf, int size_of_buf) - * stores current->comm into buf - * Return: 0 on success or negative error - * - * u32 bpf_get_cgroup_classid(skb) - * retrieve a proc's classid - * @skb: pointer to skb - * Return: classid if != 0 - * - * int bpf_skb_vlan_push(skb, vlan_proto, vlan_tci) - * Return: 0 on success or negative error - * - * int bpf_skb_vlan_pop(skb) - * Return: 0 on success or negative error - * - * int bpf_skb_get_tunnel_key(skb, key, size, flags) - * int bpf_skb_set_tunnel_key(skb, key, size, flags) - * retrieve or populate tunnel metadata - * @skb: pointer to skb - * @key: pointer to 'struct bpf_tunnel_key' - * @size: size of 'struct bpf_tunnel_key' - * @flags: room for future extensions - * Return: 0 on success or negative error - * - * u64 bpf_perf_event_read(map, flags) - * read perf event counter value - * @map: pointer to perf_event_array map - * @flags: index of event in the map or bitmask flags - * Return: value of perf event counter read or error code - * - * int bpf_redirect(ifindex, flags) - * redirect to another netdev - * @ifindex: ifindex of the net device - * @flags: - * cls_bpf: - * bit 0 - if set, redirect to ingress instead of egress - * other bits - reserved - * xdp_bpf: - * all bits - reserved - * Return: cls_bpf: TC_ACT_REDIRECT on success or TC_ACT_SHOT on error - * xdp_bfp: XDP_REDIRECT on success or XDP_ABORT on error - * int bpf_redirect_map(map, key, flags) - * redirect to endpoint in map - * @map: pointer to dev map - * @key: index in map to lookup - * @flags: -- - * Return: XDP_REDIRECT on success or XDP_ABORT on error - * - * u32 bpf_get_route_realm(skb) - * retrieve a dst's tclassid - * @skb: pointer to skb - * Return: realm if != 0 - * - * int bpf_perf_event_output(ctx, map, flags, data, size) - * output perf raw sample - * @ctx: struct pt_regs* - * @map: pointer to perf_event_array map - * @flags: index of event in the map or bitmask flags - * @data: data on stack to be output as raw data - * @size: size of data - * Return: 0 on success or negative error - * - * int bpf_get_stackid(ctx, map, flags) - * walk user or kernel stack and return id - * @ctx: struct pt_regs* - * @map: pointer to stack_trace map - * @flags: bits 0-7 - numer of stack frames to skip - * bit 8 - collect user stack instead of kernel - * bit 9 - compare stacks by hash only - * bit 10 - if two different stacks hash into the same stackid - * discard old - * other bits - reserved - * Return: >= 0 stackid on success or negative error - * - * s64 bpf_csum_diff(from, from_size, to, to_size, seed) - * calculate csum diff - * @from: raw from buffer - * @from_size: length of from buffer - * @to: raw to buffer - * @to_size: length of to buffer - * @seed: optional seed - * Return: csum result or negative error code - * - * int bpf_skb_get_tunnel_opt(skb, opt, size) - * retrieve tunnel options metadata - * @skb: pointer to skb - * @opt: pointer to raw tunnel option data - * @size: size of @opt - * Return: option size - * - * int bpf_skb_set_tunnel_opt(skb, opt, size) - * populate tunnel options metadata - * @skb: pointer to skb - * @opt: pointer to raw tunnel option data - * @size: size of @opt - * Return: 0 on success or negative error - * - * int bpf_skb_change_proto(skb, proto, flags) - * Change protocol of the skb. Currently supported is v4 -> v6, - * v6 -> v4 transitions. The helper will also resize the skb. eBPF - * program is expected to fill the new headers via skb_store_bytes - * and lX_csum_replace. - * @skb: pointer to skb - * @proto: new skb->protocol type - * @flags: reserved - * Return: 0 on success or negative error - * - * int bpf_skb_change_type(skb, type) - * Change packet type of skb. - * @skb: pointer to skb - * @type: new skb->pkt_type type - * Return: 0 on success or negative error - * - * int bpf_skb_under_cgroup(skb, map, index) - * Check cgroup2 membership of skb - * @skb: pointer to skb - * @map: pointer to bpf_map in BPF_MAP_TYPE_CGROUP_ARRAY type - * @index: index of the cgroup in the bpf_map - * Return: - * == 0 skb failed the cgroup2 descendant test - * == 1 skb succeeded the cgroup2 descendant test - * < 0 error - * - * u32 bpf_get_hash_recalc(skb) - * Retrieve and possibly recalculate skb->hash. - * @skb: pointer to skb - * Return: hash + * Return + * A 64-bit integer containing the current GID and UID, and + * created as such: *current_gid* **<< 32 \|** *current_uid*. + * + * int bpf_get_current_comm(char *buf, u32 size_of_buf) + * Description + * Copy the **comm** attribute of the current task into *buf* of + * *size_of_buf*. The **comm** attribute contains the name of + * the executable (excluding the path) for the current task. The + * *size_of_buf* must be strictly positive. On success, the + * helper makes sure that the *buf* is NUL-terminated. On failure, + * it is filled with zeroes. + * Return + * 0 on success, or a negative error in case of failure. + * + * u32 bpf_get_cgroup_classid(struct sk_buff *skb) + * Description + * Retrieve the classid for the current task, i.e. for the net_cls + * cgroup to which *skb* belongs. + * + * This helper can be used on TC egress path, but not on ingress. + * + * The net_cls cgroup provides an interface to tag network packets + * based on a user-provided identifier for all traffic coming from + * the tasks belonging to the related cgroup. See also the related + * kernel documentation, available from the Linux sources in file + * *Documentation/cgroup-v1/net_cls.txt*. + * + * The Linux kernel has two versions for cgroups: there are + * cgroups v1 and cgroups v2. Both are available to users, who can + * use a mixture of them, but note that the net_cls cgroup is for + * cgroup v1 only. This makes it incompatible with BPF programs + * run on cgroups, which is a cgroup-v2-only feature (a socket can + * only hold data for one version of cgroups at a time). + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_CGROUP_NET_CLASSID** configuration option set to + * "**y**" or to "**m**". + * Return + * The classid, or 0 for the default unconfigured classid. + * + * int bpf_skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci) + * Description + * Push a *vlan_tci* (VLAN tag control information) of protocol + * *vlan_proto* to the packet associated to *skb*, then update + * the checksum. Note that if *vlan_proto* is different from + * **ETH_P_8021Q** and **ETH_P_8021AD**, it is considered to + * be **ETH_P_8021Q**. + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_skb_vlan_pop(struct sk_buff *skb) + * Description + * Pop a VLAN header from the packet associated to *skb*. + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_skb_get_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags) + * Description + * Get tunnel metadata. This helper takes a pointer *key* to an + * empty **struct bpf_tunnel_key** of **size**, that will be + * filled with tunnel metadata for the packet associated to *skb*. + * The *flags* can be set to **BPF_F_TUNINFO_IPV6**, which + * indicates that the tunnel is based on IPv6 protocol instead of + * IPv4. + * + * The **struct bpf_tunnel_key** is an object that generalizes the + * principal parameters used by various tunneling protocols into a + * single struct. This way, it can be used to easily make a + * decision based on the contents of the encapsulation header, + * "summarized" in this struct. In particular, it holds the IP + * address of the remote end (IPv4 or IPv6, depending on the case) + * in *key*\ **->remote_ipv4** or *key*\ **->remote_ipv6**. Also, + * this struct exposes the *key*\ **->tunnel_id**, which is + * generally mapped to a VNI (Virtual Network Identifier), making + * it programmable together with the **bpf_skb_set_tunnel_key**\ + * () helper. + * + * Let's imagine that the following code is part of a program + * attached to the TC ingress interface, on one end of a GRE + * tunnel, and is supposed to filter out all messages coming from + * remote ends with IPv4 address other than 10.0.0.1: + * + * :: + * + * int ret; + * struct bpf_tunnel_key key = {}; + * + * ret = bpf_skb_get_tunnel_key(skb, &key, sizeof(key), 0); + * if (ret < 0) + * return TC_ACT_SHOT; // drop packet + * + * if (key.remote_ipv4 != 0x0a000001) + * return TC_ACT_SHOT; // drop packet + * + * return TC_ACT_OK; // accept packet + * + * This interface can also be used with all encapsulation devices + * that can operate in "collect metadata" mode: instead of having + * one network device per specific configuration, the "collect + * metadata" mode only requires a single device where the + * configuration can be extracted from this helper. + * + * This can be used together with various tunnels such as VXLan, + * Geneve, GRE or IP in IP (IPIP). + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_skb_set_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags) + * Description + * Populate tunnel metadata for packet associated to *skb.* The + * tunnel metadata is set to the contents of *key*, of *size*. The + * *flags* can be set to a combination of the following values: + * + * **BPF_F_TUNINFO_IPV6** + * Indicate that the tunnel is based on IPv6 protocol + * instead of IPv4. + * **BPF_F_ZERO_CSUM_TX** + * For IPv4 packets, add a flag to tunnel metadata + * indicating that checksum computation should be skipped + * and checksum set to zeroes. + * **BPF_F_DONT_FRAGMENT** + * Add a flag to tunnel metadata indicating that the + * packet should not be fragmented. + * **BPF_F_SEQ_NUMBER** + * Add a flag to tunnel metadata indicating that a + * sequence number should be added to tunnel header before + * sending the packet. This flag was added for GRE + * encapsulation, but might be used with other protocols + * as well in the future. + * + * Here is a typical usage on the transmit path: + * + * :: + * + * struct bpf_tunnel_key key; + * populate key ... + * bpf_skb_set_tunnel_key(skb, &key, sizeof(key), 0); + * bpf_clone_redirect(skb, vxlan_dev_ifindex, 0); + * + * See also the description of the **bpf_skb_get_tunnel_key**\ () + * helper for additional information. + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_perf_event_read(struct bpf_map *map, u64 flags) + * Description + * Read the value of a perf event counter. This helper relies on a + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of + * the perf event counter is selected when *map* is updated with + * perf event file descriptors. The *map* is an array whose size + * is the number of available CPUs, and each cell contains a value + * relative to one CPU. The value to retrieve is indicated by + * *flags*, that contains the index of the CPU to look up, masked + * with **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to + * **BPF_F_CURRENT_CPU** to indicate that the value for the + * current CPU should be retrieved. + * + * Note that before Linux 4.13, only hardware perf event can be + * retrieved. + * + * Also, be aware that the newer helper + * **bpf_perf_event_read_value**\ () is recommended over + * **bpf_perf_event_read**\ () in general. The latter has some ABI + * quirks where error and counter value are used as a return code + * (which is wrong to do since ranges may overlap). This issue is + * fixed with **bpf_perf_event_read_value**\ (), which at the same + * time provides more features over the **bpf_perf_event_read**\ + * () interface. Please refer to the description of + * **bpf_perf_event_read_value**\ () for details. + * Return + * The value of the perf event counter read from the map, or a + * negative error code in case of failure. + * + * int bpf_redirect(u32 ifindex, u64 flags) + * Description + * Redirect the packet to another net device of index *ifindex*. + * This helper is somewhat similar to **bpf_clone_redirect**\ + * (), except that the packet is not cloned, which provides + * increased performance. + * + * Except for XDP, both ingress and egress interfaces can be used + * for redirection. The **BPF_F_INGRESS** value in *flags* is used + * to make the distinction (ingress path is selected if the flag + * is present, egress path otherwise). Currently, XDP only + * supports redirection to the egress interface, and accepts no + * flag at all. + * + * The same effect can be attained with the more generic + * **bpf_redirect_map**\ (), which requires specific maps to be + * used but offers better performance. + * Return + * For XDP, the helper returns **XDP_REDIRECT** on success or + * **XDP_ABORTED** on error. For other program types, the values + * are **TC_ACT_REDIRECT** on success or **TC_ACT_SHOT** on + * error. + * + * u32 bpf_get_route_realm(struct sk_buff *skb) + * Description + * Retrieve the realm or the route, that is to say the + * **tclassid** field of the destination for the *skb*. The + * indentifier retrieved is a user-provided tag, similar to the + * one used with the net_cls cgroup (see description for + * **bpf_get_cgroup_classid**\ () helper), but here this tag is + * held by a route (a destination entry), not by a task. + * + * Retrieving this identifier works with the clsact TC egress hook + * (see also **tc-bpf(8)**), or alternatively on conventional + * classful egress qdiscs, but not on TC ingress path. In case of + * clsact TC egress hook, this has the advantage that, internally, + * the destination entry has not been dropped yet in the transmit + * path. Therefore, the destination entry does not need to be + * artificially held via **netif_keep_dst**\ () for a classful + * qdisc until the *skb* is freed. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_IP_ROUTE_CLASSID** configuration option. + * Return + * The realm of the route for the packet associated to *skb*, or 0 + * if none was found. + * + * int bpf_perf_event_output(struct pt_reg *ctx, struct bpf_map *map, u64 flags, void *data, u64 size) + * Description + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * The context of the program *ctx* needs also be passed to the + * helper. + * + * On user space, a program willing to read the values needs to + * call **perf_event_open**\ () on the perf event (either for + * one or for all CPUs) and to store the file descriptor into the + * *map*. This must be done before the eBPF program can send data + * into it. An example is available in file + * *samples/bpf/trace_output_user.c* in the Linux kernel source + * tree (the eBPF program counterpart is in + * *samples/bpf/trace_output_kern.c*). + * + * **bpf_perf_event_output**\ () achieves better performance + * than **bpf_trace_printk**\ () for sharing data with user + * space, and is much better suitable for streaming data from eBPF + * programs. + * + * Note that this helper is not restricted to tracing use cases + * and can be used with programs attached to TC or XDP as well, + * where it allows for passing data to user space listeners. Data + * can be: + * + * * Only custom structs, + * * Only the packet payload, or + * * A combination of both. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_skb_load_bytes(const struct sk_buff *skb, u32 offset, void *to, u32 len) + * Description + * This helper was provided as an easy way to load data from a + * packet. It can be used to load *len* bytes from *offset* from + * the packet associated to *skb*, into the buffer pointed by + * *to*. + * + * Since Linux 4.7, usage of this helper has mostly been replaced + * by "direct packet access", enabling packet data to be + * manipulated with *skb*\ **->data** and *skb*\ **->data_end** + * pointing respectively to the first byte of packet data and to + * the byte after the last byte of packet data. However, it + * remains useful if one wishes to read large quantities of data + * at once from a packet into the eBPF stack. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_get_stackid(struct pt_reg *ctx, struct bpf_map *map, u64 flags) + * Description + * Walk a user or a kernel stack and return its id. To achieve + * this, the helper needs *ctx*, which is a pointer to the context + * on which the tracing program is executed, and a pointer to a + * *map* of type **BPF_MAP_TYPE_STACK_TRACE**. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * a combination of the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_FAST_STACK_CMP** + * Compare stacks by hash only. + * **BPF_F_REUSE_STACKID** + * If two different stacks hash into the same *stackid*, + * discard the old one. + * + * The stack id retrieved is a 32 bit long integer handle which + * can be further combined with other data (including other stack + * ids) and used as a key into maps. This can be useful for + * generating a variety of graphs (such as flame graphs or off-cpu + * graphs). + * + * For walking a stack, this helper is an improvement over + * **bpf_probe_read**\ (), which can be used with unrolled loops + * but is not efficient and consumes a lot of eBPF instructions. + * Instead, **bpf_get_stackid**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack=<new value> + * Return + * The positive or null stack id on success, or a negative error + * in case of failure. + * + * s64 bpf_csum_diff(__be32 *from, u32 from_size, __be32 *to, u32 to_size, __wsum seed) + * Description + * Compute a checksum difference, from the raw buffer pointed by + * *from*, of length *from_size* (that must be a multiple of 4), + * towards the raw buffer pointed by *to*, of size *to_size* + * (same remark). An optional *seed* can be added to the value + * (this can be cascaded, the seed may come from a previous call + * to the helper). + * + * This is flexible enough to be used in several ways: + * + * * With *from_size* == 0, *to_size* > 0 and *seed* set to + * checksum, it can be used when pushing new data. + * * With *from_size* > 0, *to_size* == 0 and *seed* set to + * checksum, it can be used when removing data from a packet. + * * With *from_size* > 0, *to_size* > 0 and *seed* set to 0, it + * can be used to compute a diff. Note that *from_size* and + * *to_size* do not need to be equal. + * + * This helper can be used in combination with + * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ (), to + * which one can feed in the difference computed with + * **bpf_csum_diff**\ (). + * Return + * The checksum result, or a negative error code in case of + * failure. + * + * int bpf_skb_get_tunnel_opt(struct sk_buff *skb, u8 *opt, u32 size) + * Description + * Retrieve tunnel options metadata for the packet associated to + * *skb*, and store the raw tunnel option data to the buffer *opt* + * of *size*. + * + * This helper can be used with encapsulation devices that can + * operate in "collect metadata" mode (please refer to the related + * note in the description of **bpf_skb_get_tunnel_key**\ () for + * more details). A particular example where this can be used is + * in combination with the Geneve encapsulation protocol, where it + * allows for pushing (with **bpf_skb_get_tunnel_opt**\ () helper) + * and retrieving arbitrary TLVs (Type-Length-Value headers) from + * the eBPF program. This allows for full customization of these + * headers. + * Return + * The size of the option data retrieved. + * + * int bpf_skb_set_tunnel_opt(struct sk_buff *skb, u8 *opt, u32 size) + * Description + * Set tunnel options metadata for the packet associated to *skb* + * to the option data contained in the raw buffer *opt* of *size*. + * + * See also the description of the **bpf_skb_get_tunnel_opt**\ () + * helper for additional information. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_skb_change_proto(struct sk_buff *skb, __be16 proto, u64 flags) + * Description + * Change the protocol of the *skb* to *proto*. Currently + * supported are transition from IPv4 to IPv6, and from IPv6 to + * IPv4. The helper takes care of the groundwork for the + * transition, including resizing the socket buffer. The eBPF + * program is expected to fill the new headers, if any, via + * **skb_store_bytes**\ () and to recompute the checksums with + * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ + * (). The main case for this helper is to perform NAT64 + * operations out of an eBPF program. + * + * Internally, the GSO type is marked as dodgy so that headers are + * checked and segments are recalculated by the GSO/GRO engine. + * The size for GSO target is adapted as well. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_skb_change_type(struct sk_buff *skb, u32 type) + * Description + * Change the packet type for the packet associated to *skb*. This + * comes down to setting *skb*\ **->pkt_type** to *type*, except + * the eBPF program does not have a write access to *skb*\ + * **->pkt_type** beside this helper. Using a helper here allows + * for graceful handling of errors. + * + * The major use case is to change incoming *skb*s to + * **PACKET_HOST** in a programmatic way instead of having to + * recirculate via **redirect**\ (..., **BPF_F_INGRESS**), for + * example. + * + * Note that *type* only allows certain values. At this time, they + * are: + * + * **PACKET_HOST** + * Packet is for us. + * **PACKET_BROADCAST** + * Send packet to all. + * **PACKET_MULTICAST** + * Send packet to group. + * **PACKET_OTHERHOST** + * Send packet to someone else. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_skb_under_cgroup(struct sk_buff *skb, struct bpf_map *map, u32 index) + * Description + * Check whether *skb* is a descendant of the cgroup2 held by + * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. + * Return + * The return value depends on the result of the test, and can be: + * + * * 0, if the *skb* failed the cgroup2 descendant test. + * * 1, if the *skb* succeeded the cgroup2 descendant test. + * * A negative error code, if an error occurred. + * + * u32 bpf_get_hash_recalc(struct sk_buff *skb) + * Description + * Retrieve the hash of the packet, *skb*\ **->hash**. If it is + * not set, in particular if the hash was cleared due to mangling, + * recompute this hash. Later accesses to the hash can be done + * directly with *skb*\ **->hash**. + * + * Calling **bpf_set_hash_invalid**\ (), changing a packet + * prototype with **bpf_skb_change_proto**\ (), or calling + * **bpf_skb_store_bytes**\ () with the + * **BPF_F_INVALIDATE_HASH** are actions susceptible to clear + * the hash and to trigger a new computation for the next call to + * **bpf_get_hash_recalc**\ (). + * Return + * The 32-bit hash. * * u64 bpf_get_current_task(void) - * Returns current task_struct - * Return: current - * - * int bpf_probe_write_user(void *dst, void *src, int len) - * safely attempt to write to a location - * @dst: destination address in userspace - * @src: source address on stack - * @len: number of bytes to copy - * Return: 0 on success or negative error - * - * int bpf_current_task_under_cgroup(map, index) - * Check cgroup2 membership of current task - * @map: pointer to bpf_map in BPF_MAP_TYPE_CGROUP_ARRAY type - * @index: index of the cgroup in the bpf_map - * Return: - * == 0 current failed the cgroup2 descendant test - * == 1 current succeeded the cgroup2 descendant test - * < 0 error - * - * int bpf_skb_change_tail(skb, len, flags) - * The helper will resize the skb to the given new size, to be used f.e. - * with control messages. - * @skb: pointer to skb - * @len: new skb length - * @flags: reserved - * Return: 0 on success or negative error - * - * int bpf_skb_pull_data(skb, len) - * The helper will pull in non-linear data in case the skb is non-linear - * and not all of len are part of the linear section. Only needed for - * read/write with direct packet access. - * @skb: pointer to skb - * @len: len to make read/writeable - * Return: 0 on success or negative error - * - * s64 bpf_csum_update(skb, csum) - * Adds csum into skb->csum in case of CHECKSUM_COMPLETE. - * @skb: pointer to skb - * @csum: csum to add - * Return: csum on success or negative error - * - * void bpf_set_hash_invalid(skb) - * Invalidate current skb->hash. - * @skb: pointer to skb - * - * int bpf_get_numa_node_id() - * Return: Id of current NUMA node. - * - * int bpf_skb_change_head() - * Grows headroom of skb and adjusts MAC header offset accordingly. - * Will extends/reallocae as required automatically. - * May change skb data pointer and will thus invalidate any check - * performed for direct packet access. - * @skb: pointer to skb - * @len: length of header to be pushed in front - * @flags: Flags (unused for now) - * Return: 0 on success or negative error - * - * int bpf_xdp_adjust_head(xdp_md, delta) - * Adjust the xdp_md.data by delta - * @xdp_md: pointer to xdp_md - * @delta: An positive/negative integer to be added to xdp_md.data - * Return: 0 on success or negative on error + * Return + * A pointer to the current task struct. + * + * int bpf_probe_write_user(void *dst, const void *src, u32 len) + * Description + * Attempt in a safe way to write *len* bytes from the buffer + * *src* to *dst* in memory. It only works for threads that are in + * user context, and *dst* must be a valid user space address. + * + * This helper should not be used to implement any kind of + * security mechanism because of TOC-TOU attacks, but rather to + * debug, divert, and manipulate execution of semi-cooperative + * processes. + * + * Keep in mind that this feature is meant for experiments, and it + * has a risk of crashing the system and running programs. + * Therefore, when an eBPF program using this helper is attached, + * a warning including PID and process name is printed to kernel + * logs. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_current_task_under_cgroup(struct bpf_map *map, u32 index) + * Description + * Check whether the probe is being run is the context of a given + * subset of the cgroup2 hierarchy. The cgroup2 to test is held by + * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. + * Return + * The return value depends on the result of the test, and can be: + * + * * 0, if the *skb* task belongs to the cgroup2. + * * 1, if the *skb* task does not belong to the cgroup2. + * * A negative error code, if an error occurred. + * + * int bpf_skb_change_tail(struct sk_buff *skb, u32 len, u64 flags) + * Description + * Resize (trim or grow) the packet associated to *skb* to the + * new *len*. The *flags* are reserved for future usage, and must + * be left at zero. + * + * The basic idea is that the helper performs the needed work to + * change the size of the packet, then the eBPF program rewrites + * the rest via helpers like **bpf_skb_store_bytes**\ (), + * **bpf_l3_csum_replace**\ (), **bpf_l3_csum_replace**\ () + * and others. This helper is a slow path utility intended for + * replies with control messages. And because it is targeted for + * slow path, the helper itself can afford to be slow: it + * implicitly linearizes, unclones and drops offloads from the + * *skb*. + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_skb_pull_data(struct sk_buff *skb, u32 len) + * Description + * Pull in non-linear data in case the *skb* is non-linear and not + * all of *len* are part of the linear section. Make *len* bytes + * from *skb* readable and writable. If a zero value is passed for + * *len*, then the whole length of the *skb* is pulled. + * + * This helper is only needed for reading and writing with direct + * packet access. + * + * For direct packet access, testing that offsets to access + * are within packet boundaries (test on *skb*\ **->data_end**) is + * susceptible to fail if offsets are invalid, or if the requested + * data is in non-linear parts of the *skb*. On failure the + * program can just bail out, or in the case of a non-linear + * buffer, use a helper to make the data available. The + * **bpf_skb_load_bytes**\ () helper is a first solution to access + * the data. Another one consists in using **bpf_skb_pull_data** + * to pull in once the non-linear parts, then retesting and + * eventually access the data. + * + * At the same time, this also makes sure the *skb* is uncloned, + * which is a necessary condition for direct write. As this needs + * to be an invariant for the write part only, the verifier + * detects writes and adds a prologue that is calling + * **bpf_skb_pull_data()** to effectively unclone the *skb* from + * the very beginning in case it is indeed cloned. + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * s64 bpf_csum_update(struct sk_buff *skb, __wsum csum) + * Description + * Add the checksum *csum* into *skb*\ **->csum** in case the + * driver has supplied a checksum for the entire packet into that + * field. Return an error otherwise. This helper is intended to be + * used in combination with **bpf_csum_diff**\ (), in particular + * when the checksum needs to be updated after data has been + * written into the packet through direct packet access. + * Return + * The checksum on success, or a negative error code in case of + * failure. + * + * void bpf_set_hash_invalid(struct sk_buff *skb) + * Description + * Invalidate the current *skb*\ **->hash**. It can be used after + * mangling on headers through direct packet access, in order to + * indicate that the hash is outdated and to trigger a + * recalculation the next time the kernel tries to access this + * hash or when the **bpf_get_hash_recalc**\ () helper is called. + * + * int bpf_get_numa_node_id(void) + * Description + * Return the id of the current NUMA node. The primary use case + * for this helper is the selection of sockets for the local NUMA + * node, when the program is attached to sockets using the + * **SO_ATTACH_REUSEPORT_EBPF** option (see also **socket(7)**), + * but the helper is also available to other eBPF program types, + * similarly to **bpf_get_smp_processor_id**\ (). + * Return + * The id of current NUMA node. + * + * int bpf_skb_change_head(struct sk_buff *skb, u32 len, u64 flags) + * Description + * Grows headroom of packet associated to *skb* and adjusts the + * offset of the MAC header accordingly, adding *len* bytes of + * space. It automatically extends and reallocates memory as + * required. + * + * This helper can be used on a layer 3 *skb* to push a MAC header + * for redirection into a layer 2 device. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_xdp_adjust_head(struct xdp_buff *xdp_md, int delta) + * Description + * Adjust (move) *xdp_md*\ **->data** by *delta* bytes. Note that + * it is possible to use a negative value for *delta*. This helper + * can be used to prepare the packet for pushing or popping + * headers. + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. * * int bpf_probe_read_str(void *dst, int size, const void *unsafe_ptr) - * Copy a NUL terminated string from unsafe address. In case the string - * length is smaller than size, the target is not padded with further NUL - * bytes. In case the string length is larger than size, just count-1 - * bytes are copied and the last byte is set to NUL. - * @dst: destination address - * @size: maximum number of bytes to copy, including the trailing NUL - * @unsafe_ptr: unsafe address - * Return: - * > 0 length of the string including the trailing NUL on success - * < 0 error - * - * u64 bpf_get_socket_cookie(skb) - * Get the cookie for the socket stored inside sk_buff. - * @skb: pointer to skb - * Return: 8 Bytes non-decreasing number on success or 0 if the socket - * field is missing inside sk_buff - * - * u32 bpf_get_socket_uid(skb) - * Get the owner uid of the socket stored inside sk_buff. - * @skb: pointer to skb - * Return: uid of the socket owner on success or overflowuid if failed. - * - * u32 bpf_set_hash(skb, hash) - * Set full skb->hash. - * @skb: pointer to skb - * @hash: hash to set - * - * int bpf_setsockopt(bpf_socket, level, optname, optval, optlen) - * Calls setsockopt. Not all opts are available, only those with - * integer optvals plus TCP_CONGESTION. - * Supported levels: SOL_SOCKET and IPPROTO_TCP - * @bpf_socket: pointer to bpf_socket - * @level: SOL_SOCKET or IPPROTO_TCP - * @optname: option name - * @optval: pointer to option value - * @optlen: length of optval in bytes - * Return: 0 or negative error - * - * int bpf_getsockopt(bpf_socket, level, optname, optval, optlen) - * Calls getsockopt. Not all opts are available. - * Supported levels: IPPROTO_TCP - * @bpf_socket: pointer to bpf_socket - * @level: IPPROTO_TCP - * @optname: option name - * @optval: pointer to option value - * @optlen: length of optval in bytes - * Return: 0 or negative error - * - * int bpf_sock_ops_cb_flags_set(bpf_sock_ops, flags) - * Set callback flags for sock_ops - * @bpf_sock_ops: pointer to bpf_sock_ops_kern struct - * @flags: flags value - * Return: 0 for no error - * -EINVAL if there is no full tcp socket - * bits in flags that are not supported by current kernel - * - * int bpf_skb_adjust_room(skb, len_diff, mode, flags) - * Grow or shrink room in sk_buff. - * @skb: pointer to skb - * @len_diff: (signed) amount of room to grow/shrink - * @mode: operation mode (enum bpf_adj_room_mode) - * @flags: reserved for future use - * Return: 0 on success or negative error code - * - * int bpf_sk_redirect_map(map, key, flags) - * Redirect skb to a sock in map using key as a lookup key for the - * sock in map. - * @map: pointer to sockmap - * @key: key to lookup sock in map - * @flags: reserved for future use - * Return: SK_PASS - * - * int bpf_sock_map_update(skops, map, key, flags) - * @skops: pointer to bpf_sock_ops - * @map: pointer to sockmap to update - * @key: key to insert/update sock in map - * @flags: same flags as map update elem - * - * int bpf_xdp_adjust_meta(xdp_md, delta) - * Adjust the xdp_md.data_meta by delta - * @xdp_md: pointer to xdp_md - * @delta: An positive/negative integer to be added to xdp_md.data_meta - * Return: 0 on success or negative on error - * - * int bpf_perf_event_read_value(map, flags, buf, buf_size) - * read perf event counter value and perf event enabled/running time - * @map: pointer to perf_event_array map - * @flags: index of event in the map or bitmask flags - * @buf: buf to fill - * @buf_size: size of the buf - * Return: 0 on success or negative error code - * - * int bpf_perf_prog_read_value(ctx, buf, buf_size) - * read perf prog attached perf event counter and enabled/running time - * @ctx: pointer to ctx - * @buf: buf to fill - * @buf_size: size of the buf - * Return : 0 on success or negative error code - * - * int bpf_override_return(pt_regs, rc) - * @pt_regs: pointer to struct pt_regs - * @rc: the return value to set + * Description + * Copy a NUL terminated string from an unsafe address + * *unsafe_ptr* to *dst*. The *size* should include the + * terminating NUL byte. In case the string length is smaller than + * *size*, the target is not padded with further NUL bytes. If the + * string length is larger than *size*, just *size*-1 bytes are + * copied and the last byte is set to NUL. + * + * On success, the length of the copied string is returned. This + * makes this helper useful in tracing programs for reading + * strings, and more importantly to get its length at runtime. See + * the following snippet: + * + * :: + * + * SEC("kprobe/sys_open") + * void bpf_sys_open(struct pt_regs *ctx) + * { + * char buf[PATHLEN]; // PATHLEN is defined to 256 + * int res = bpf_probe_read_str(buf, sizeof(buf), + * ctx->di); + * + * // Consume buf, for example push it to + * // userspace via bpf_perf_event_output(); we + * // can use res (the string length) as event + * // size, after checking its boundaries. + * } + * + * In comparison, using **bpf_probe_read()** helper here instead + * to read the string would require to estimate the length at + * compile time, and would often result in copying more memory + * than necessary. + * + * Another useful use case is when parsing individual process + * arguments or individual environment variables navigating + * *current*\ **->mm->arg_start** and *current*\ + * **->mm->env_start**: using this helper and the return value, + * one can quickly iterate at the right offset of the memory area. + * Return + * On success, the strictly positive length of the string, + * including the trailing NUL character. On error, a negative + * value. + * + * u64 bpf_get_socket_cookie(struct sk_buff *skb) + * Description + * If the **struct sk_buff** pointed by *skb* has a known socket, + * retrieve the cookie (generated by the kernel) of this socket. + * If no cookie has been set yet, generate a new cookie. Once + * generated, the socket cookie remains stable for the life of the + * socket. This helper can be useful for monitoring per socket + * networking traffic statistics as it provides a unique socket + * identifier per namespace. + * Return + * A 8-byte long non-decreasing number on success, or 0 if the + * socket field is missing inside *skb*. + * + * u64 bpf_get_socket_cookie(struct bpf_sock_addr *ctx) + * Description + * Equivalent to bpf_get_socket_cookie() helper that accepts + * *skb*, but gets socket from **struct bpf_sock_addr** contex. + * Return + * A 8-byte long non-decreasing number. + * + * u64 bpf_get_socket_cookie(struct bpf_sock_ops *ctx) + * Description + * Equivalent to bpf_get_socket_cookie() helper that accepts + * *skb*, but gets socket from **struct bpf_sock_ops** contex. + * Return + * A 8-byte long non-decreasing number. + * + * u32 bpf_get_socket_uid(struct sk_buff *skb) + * Return + * The owner UID of the socket associated to *skb*. If the socket + * is **NULL**, or if it is not a full socket (i.e. if it is a + * time-wait or a request socket instead), **overflowuid** value + * is returned (note that **overflowuid** might also be the actual + * UID value for the socket). + * + * u32 bpf_set_hash(struct sk_buff *skb, u32 hash) + * Description + * Set the full hash for *skb* (set the field *skb*\ **->hash**) + * to value *hash*. + * Return + * 0 + * + * int bpf_setsockopt(struct bpf_sock_ops *bpf_socket, int level, int optname, char *optval, int optlen) + * Description + * Emulate a call to **setsockopt()** on the socket associated to + * *bpf_socket*, which must be a full socket. The *level* at + * which the option resides and the name *optname* of the option + * must be specified, see **setsockopt(2)** for more information. + * The option value of length *optlen* is pointed by *optval*. + * + * This helper actually implements a subset of **setsockopt()**. + * It supports the following *level*\ s: + * + * * **SOL_SOCKET**, which supports the following *optname*\ s: + * **SO_RCVBUF**, **SO_SNDBUF**, **SO_MAX_PACING_RATE**, + * **SO_PRIORITY**, **SO_RCVLOWAT**, **SO_MARK**. + * * **IPPROTO_TCP**, which supports the following *optname*\ s: + * **TCP_CONGESTION**, **TCP_BPF_IW**, + * **TCP_BPF_SNDCWND_CLAMP**. + * * **IPPROTO_IP**, which supports *optname* **IP_TOS**. + * * **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_skb_adjust_room(struct sk_buff *skb, s32 len_diff, u32 mode, u64 flags) + * Description + * Grow or shrink the room for data in the packet associated to + * *skb* by *len_diff*, and according to the selected *mode*. + * + * There is a single supported mode at this time: + * + * * **BPF_ADJ_ROOM_NET**: Adjust room at the network layer + * (room space is added or removed below the layer 3 header). + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_redirect_map(struct bpf_map *map, u32 key, u64 flags) + * Description + * Redirect the packet to the endpoint referenced by *map* at + * index *key*. Depending on its type, this *map* can contain + * references to net devices (for forwarding packets through other + * ports), or to CPUs (for redirecting XDP frames to another CPU; + * but this is only implemented for native XDP (with driver + * support) as of this writing). + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * When used to redirect packets to net devices, this helper + * provides a high performance increase over **bpf_redirect**\ (). + * This is due to various implementation details of the underlying + * mechanisms, one of which is the fact that **bpf_redirect_map**\ + * () tries to send packet as a "bulk" to the device. + * Return + * **XDP_REDIRECT** on success, or **XDP_ABORTED** on error. + * + * int bpf_sk_redirect_map(struct bpf_map *map, u32 key, u64 flags) + * Description + * Redirect the packet to the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * Return + * **SK_PASS** on success, or **SK_DROP** on error. + * + * int bpf_sock_map_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags) + * Description + * Add an entry to, or update a *map* referencing sockets. The + * *skops* is used as a new value for the entry associated to + * *key*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * If the *map* has eBPF programs (parser and verdict), those will + * be inherited by the socket being added. If the socket is + * already attached to eBPF programs, this results in an error. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_xdp_adjust_meta(struct xdp_buff *xdp_md, int delta) + * Description + * Adjust the address pointed by *xdp_md*\ **->data_meta** by + * *delta* (which can be positive or negative). Note that this + * operation modifies the address stored in *xdp_md*\ **->data**, + * so the latter must be loaded only after the helper has been + * called. + * + * The use of *xdp_md*\ **->data_meta** is optional and programs + * are not required to use it. The rationale is that when the + * packet is processed with XDP (e.g. as DoS filter), it is + * possible to push further meta data along with it before passing + * to the stack, and to give the guarantee that an ingress eBPF + * program attached as a TC classifier on the same device can pick + * this up for further post-processing. Since TC works with socket + * buffers, it remains possible to set from XDP the **mark** or + * **priority** pointers, or other pointers for the socket buffer. + * Having this scratch space generic and programmable allows for + * more flexibility as the user is free to store whatever meta + * data they need. + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_perf_event_read_value(struct bpf_map *map, u64 flags, struct bpf_perf_event_value *buf, u32 buf_size) + * Description + * Read the value of a perf event counter, and store it into *buf* + * of size *buf_size*. This helper relies on a *map* of type + * **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of the perf event + * counter is selected when *map* is updated with perf event file + * descriptors. The *map* is an array whose size is the number of + * available CPUs, and each cell contains a value relative to one + * CPU. The value to retrieve is indicated by *flags*, that + * contains the index of the CPU to look up, masked with + * **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to + * **BPF_F_CURRENT_CPU** to indicate that the value for the + * current CPU should be retrieved. + * + * This helper behaves in a way close to + * **bpf_perf_event_read**\ () helper, save that instead of + * just returning the value observed, it fills the *buf* + * structure. This allows for additional data to be retrieved: in + * particular, the enabled and running times (in *buf*\ + * **->enabled** and *buf*\ **->running**, respectively) are + * copied. In general, **bpf_perf_event_read_value**\ () is + * recommended over **bpf_perf_event_read**\ (), which has some + * ABI issues and provides fewer functionalities. + * + * These values are interesting, because hardware PMU (Performance + * Monitoring Unit) counters are limited resources. When there are + * more PMU based perf events opened than available counters, + * kernel will multiplex these events so each event gets certain + * percentage (but not all) of the PMU time. In case that + * multiplexing happens, the number of samples or counter value + * will not reflect the case compared to when no multiplexing + * occurs. This makes comparison between different runs difficult. + * Typically, the counter value should be normalized before + * comparing to other experiments. The usual normalization is done + * as follows. + * + * :: + * + * normalized_counter = counter * t_enabled / t_running + * + * Where t_enabled is the time enabled for event and t_running is + * the time running for event since last normalization. The + * enabled and running times are accumulated since the perf event + * open. To achieve scaling factor between two invocations of an + * eBPF program, users can can use CPU id as the key (which is + * typical for perf array usage model) to remember the previous + * value and do the calculation inside the eBPF program. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_perf_prog_read_value(struct bpf_perf_event_data *ctx, struct bpf_perf_event_value *buf, u32 buf_size) + * Description + * For en eBPF program attached to a perf event, retrieve the + * value of the event counter associated to *ctx* and store it in + * the structure pointed by *buf* and of size *buf_size*. Enabled + * and running times are also stored in the structure (see + * description of helper **bpf_perf_event_read_value**\ () for + * more details). + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_getsockopt(struct bpf_sock_ops *bpf_socket, int level, int optname, char *optval, int optlen) + * Description + * Emulate a call to **getsockopt()** on the socket associated to + * *bpf_socket*, which must be a full socket. The *level* at + * which the option resides and the name *optname* of the option + * must be specified, see **getsockopt(2)** for more information. + * The retrieved value is stored in the structure pointed by + * *opval* and of length *optlen*. + * + * This helper actually implements a subset of **getsockopt()**. + * It supports the following *level*\ s: + * + * * **IPPROTO_TCP**, which supports *optname* + * **TCP_CONGESTION**. + * * **IPPROTO_IP**, which supports *optname* **IP_TOS**. + * * **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_override_return(struct pt_reg *regs, u64 rc) + * Description + * Used for error injection, this helper uses kprobes to override + * the return value of the probed function, and to set it to *rc*. + * The first argument is the context *regs* on which the kprobe + * works. + * + * This helper works by setting setting the PC (program counter) + * to an override function which is run in place of the original + * probed function. This means the probed function is not run at + * all. The replacement function just returns with the required + * value. + * + * This helper has security implications, and thus is subject to + * restrictions. It is only available if the kernel was compiled + * with the **CONFIG_BPF_KPROBE_OVERRIDE** configuration + * option, and in this case it only works on functions tagged with + * **ALLOW_ERROR_INJECTION** in the kernel code. + * + * Also, the helper is only available for the architectures having + * the CONFIG_FUNCTION_ERROR_INJECTION option. As of this writing, + * x86 architecture is the only one to support this feature. + * Return + * 0 + * + * int bpf_sock_ops_cb_flags_set(struct bpf_sock_ops *bpf_sock, int argval) + * Description + * Attempt to set the value of the **bpf_sock_ops_cb_flags** field + * for the full TCP socket associated to *bpf_sock_ops* to + * *argval*. + * + * The primary use of this field is to determine if there should + * be calls to eBPF programs of type + * **BPF_PROG_TYPE_SOCK_OPS** at various points in the TCP + * code. A program of the same type can change its value, per + * connection and as necessary, when the connection is + * established. This field is directly accessible for reading, but + * this helper must be used for updates in order to return an + * error if an eBPF program tries to set a callback that is not + * supported in the current kernel. + * + * The supported callback values that *argval* can combine are: + * + * * **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out) + * * **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission) + * * **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change) + * + * Here are some examples of where one could call such eBPF + * program: + * + * * When RTO fires. + * * When a packet is retransmitted. + * * When the connection terminates. + * * When a packet is sent. + * * When a packet is received. + * Return + * Code **-EINVAL** if the socket is not a full TCP socket; + * otherwise, a positive number containing the bits that could not + * be set is returned (which comes down to 0 if all bits were set + * as required). + * + * int bpf_msg_redirect_map(struct sk_msg_buff *msg, struct bpf_map *map, u32 key, u64 flags) + * Description + * This helper is used in programs implementing policies at the + * socket level. If the message *msg* is allowed to pass (i.e. if + * the verdict eBPF program returns **SK_PASS**), redirect it to + * the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * Return + * **SK_PASS** on success, or **SK_DROP** on error. + * + * int bpf_msg_apply_bytes(struct sk_msg_buff *msg, u32 bytes) + * Description + * For socket policies, apply the verdict of the eBPF program to + * the next *bytes* (number of bytes) of message *msg*. + * + * For example, this helper can be used in the following cases: + * + * * A single **sendmsg**\ () or **sendfile**\ () system call + * contains multiple logical messages that the eBPF program is + * supposed to read and for which it should apply a verdict. + * * An eBPF program only cares to read the first *bytes* of a + * *msg*. If the message has a large payload, then setting up + * and calling the eBPF program repeatedly for all bytes, even + * though the verdict is already known, would create unnecessary + * overhead. + * + * When called from within an eBPF program, the helper sets a + * counter internal to the BPF infrastructure, that is used to + * apply the last verdict to the next *bytes*. If *bytes* is + * smaller than the current data being processed from a + * **sendmsg**\ () or **sendfile**\ () system call, the first + * *bytes* will be sent and the eBPF program will be re-run with + * the pointer for start of data pointing to byte number *bytes* + * **+ 1**. If *bytes* is larger than the current data being + * processed, then the eBPF verdict will be applied to multiple + * **sendmsg**\ () or **sendfile**\ () calls until *bytes* are + * consumed. + * + * Note that if a socket closes with the internal counter holding + * a non-zero value, this is not a problem because data is not + * being buffered for *bytes* and is sent as it is received. + * Return + * 0 + * + * int bpf_msg_cork_bytes(struct sk_msg_buff *msg, u32 bytes) + * Description + * For socket policies, prevent the execution of the verdict eBPF + * program for message *msg* until *bytes* (byte number) have been + * accumulated. + * + * This can be used when one needs a specific number of bytes + * before a verdict can be assigned, even if the data spans + * multiple **sendmsg**\ () or **sendfile**\ () calls. The extreme + * case would be a user calling **sendmsg**\ () repeatedly with + * 1-byte long message segments. Obviously, this is bad for + * performance, but it is still valid. If the eBPF program needs + * *bytes* bytes to validate a header, this helper can be used to + * prevent the eBPF program to be called again until *bytes* have + * been accumulated. + * Return + * 0 + * + * int bpf_msg_pull_data(struct sk_msg_buff *msg, u32 start, u32 end, u64 flags) + * Description + * For socket policies, pull in non-linear data from user space + * for *msg* and set pointers *msg*\ **->data** and *msg*\ + * **->data_end** to *start* and *end* bytes offsets into *msg*, + * respectively. + * + * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a + * *msg* it can only parse data that the (**data**, **data_end**) + * pointers have already consumed. For **sendmsg**\ () hooks this + * is likely the first scatterlist element. But for calls relying + * on the **sendpage** handler (e.g. **sendfile**\ ()) this will + * be the range (**0**, **0**) because the data is shared with + * user space and by default the objective is to avoid allowing + * user space to modify data while (or after) eBPF verdict is + * being decided. This helper can be used to pull in data and to + * set the start and end pointer to given values. Data will be + * copied if necessary (i.e. if data was not linear and if start + * and end pointers do not point to the same chunk). + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_bind(struct bpf_sock_addr *ctx, struct sockaddr *addr, int addr_len) + * Description + * Bind the socket associated to *ctx* to the address pointed by + * *addr*, of length *addr_len*. This allows for making outgoing + * connection from the desired IP address, which can be useful for + * example when all processes inside a cgroup should use one + * single IP address on a host that has multiple IP configured. + * + * This helper works for IPv4 and IPv6, TCP and UDP sockets. The + * domain (*addr*\ **->sa_family**) must be **AF_INET** (or + * **AF_INET6**). Looking for a free port to bind to can be + * expensive, therefore binding to port is not permitted by the + * helper: *addr*\ **->sin_port** (or **sin6_port**, respectively) + * must be set to zero. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_xdp_adjust_tail(struct xdp_buff *xdp_md, int delta) + * Description + * Adjust (move) *xdp_md*\ **->data_end** by *delta* bytes. It is + * only possible to shrink the packet as of this writing, + * therefore *delta* must be a negative integer. + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_skb_get_xfrm_state(struct sk_buff *skb, u32 index, struct bpf_xfrm_state *xfrm_state, u32 size, u64 flags) + * Description + * Retrieve the XFRM state (IP transform framework, see also + * **ip-xfrm(8)**) at *index* in XFRM "security path" for *skb*. + * + * The retrieved value is stored in the **struct bpf_xfrm_state** + * pointed by *xfrm_state* and of length *size*. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_XFRM** configuration option. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_get_stack(struct pt_regs *regs, void *buf, u32 size, u64 flags) + * Description + * Return a user or a kernel stack in bpf program provided buffer. + * To achieve this, the helper needs *ctx*, which is a pointer + * to the context on which the tracing program is executed. + * To store the stacktrace, the bpf program provides *buf* with + * a nonnegative *size*. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_USER_BUILD_ID** + * Collect buildid+offset instead of ips for user stack, + * only valid if **BPF_F_USER_STACK** is also specified. + * + * **bpf_get_stack**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject + * to sufficient large buffer size. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack=<new value> + * Return + * A non-negative value equal to or less than *size* on success, + * or a negative error in case of failure. + * + * int bpf_skb_load_bytes_relative(const struct sk_buff *skb, u32 offset, void *to, u32 len, u32 start_header) + * Description + * This helper is similar to **bpf_skb_load_bytes**\ () in that + * it provides an easy way to load *len* bytes from *offset* + * from the packet associated to *skb*, into the buffer pointed + * by *to*. The difference to **bpf_skb_load_bytes**\ () is that + * a fifth argument *start_header* exists in order to select a + * base offset to start from. *start_header* can be one of: + * + * **BPF_HDR_START_MAC** + * Base offset to load data from is *skb*'s mac header. + * **BPF_HDR_START_NET** + * Base offset to load data from is *skb*'s network header. + * + * In general, "direct packet access" is the preferred method to + * access packet data, however, this helper is in particular useful + * in socket filters where *skb*\ **->data** does not always point + * to the start of the mac header and where "direct packet access" + * is not available. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_fib_lookup(void *ctx, struct bpf_fib_lookup *params, int plen, u32 flags) + * Description + * Do FIB lookup in kernel tables using parameters in *params*. + * If lookup is successful and result shows packet is to be + * forwarded, the neighbor tables are searched for the nexthop. + * If successful (ie., FIB lookup shows forwarding and nexthop + * is resolved), the nexthop address is returned in ipv4_dst + * or ipv6_dst based on family, smac is set to mac address of + * egress device, dmac is set to nexthop mac address, rt_metric + * is set to metric from route (IPv4/IPv6 only), and ifindex + * is set to the device index of the nexthop from the FIB lookup. + * + * *plen* argument is the size of the passed in struct. + * *flags* argument can be a combination of one or more of the + * following values: + * + * **BPF_FIB_LOOKUP_DIRECT** + * Do a direct table lookup vs full lookup using FIB + * rules. + * **BPF_FIB_LOOKUP_OUTPUT** + * Perform lookup from an egress perspective (default is + * ingress). + * + * *ctx* is either **struct xdp_md** for XDP programs or + * **struct sk_buff** tc cls_act programs. + * Return + * * < 0 if any input argument is invalid + * * 0 on success (packet is forwarded, nexthop neighbor exists) + * * > 0 one of **BPF_FIB_LKUP_RET_** codes explaining why the + * packet is not forwarded or needs assist from full stack + * + * int bpf_sock_hash_update(struct bpf_sock_ops_kern *skops, struct bpf_map *map, void *key, u64 flags) + * Description + * Add an entry to, or update a sockhash *map* referencing sockets. + * The *skops* is used as a new value for the entry associated to + * *key*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * If the *map* has eBPF programs (parser and verdict), those will + * be inherited by the socket being added. If the socket is + * already attached to eBPF programs, this results in an error. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_msg_redirect_hash(struct sk_msg_buff *msg, struct bpf_map *map, void *key, u64 flags) + * Description + * This helper is used in programs implementing policies at the + * socket level. If the message *msg* is allowed to pass (i.e. if + * the verdict eBPF program returns **SK_PASS**), redirect it to + * the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * Return + * **SK_PASS** on success, or **SK_DROP** on error. + * + * int bpf_sk_redirect_hash(struct sk_buff *skb, struct bpf_map *map, void *key, u64 flags) + * Description + * This helper is used in programs implementing policies at the + * skb socket level. If the sk_buff *skb* is allowed to pass (i.e. + * if the verdeict eBPF program returns **SK_PASS**), redirect it + * to the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress otherwise). This is the only flag supported for now. + * Return + * **SK_PASS** on success, or **SK_DROP** on error. + * + * int bpf_lwt_push_encap(struct sk_buff *skb, u32 type, void *hdr, u32 len) + * Description + * Encapsulate the packet associated to *skb* within a Layer 3 + * protocol header. This header is provided in the buffer at + * address *hdr*, with *len* its size in bytes. *type* indicates + * the protocol of the header and can be one of: + * + * **BPF_LWT_ENCAP_SEG6** + * IPv6 encapsulation with Segment Routing Header + * (**struct ipv6_sr_hdr**). *hdr* only contains the SRH, + * the IPv6 header is computed by the kernel. + * **BPF_LWT_ENCAP_SEG6_INLINE** + * Only works if *skb* contains an IPv6 packet. Insert a + * Segment Routing Header (**struct ipv6_sr_hdr**) inside + * the IPv6 header. + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_lwt_seg6_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len) + * Description + * Store *len* bytes from address *from* into the packet + * associated to *skb*, at *offset*. Only the flags, tag and TLVs + * inside the outermost IPv6 Segment Routing Header can be + * modified through this helper. + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_lwt_seg6_adjust_srh(struct sk_buff *skb, u32 offset, s32 delta) + * Description + * Adjust the size allocated to TLVs in the outermost IPv6 + * Segment Routing Header contained in the packet associated to + * *skb*, at position *offset* by *delta* bytes. Only offsets + * after the segments are accepted. *delta* can be as well + * positive (growing) as negative (shrinking). + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_lwt_seg6_action(struct sk_buff *skb, u32 action, void *param, u32 param_len) + * Description + * Apply an IPv6 Segment Routing action of type *action* to the + * packet associated to *skb*. Each action takes a parameter + * contained at address *param*, and of length *param_len* bytes. + * *action* can be one of: + * + * **SEG6_LOCAL_ACTION_END_X** + * End.X action: Endpoint with Layer-3 cross-connect. + * Type of *param*: **struct in6_addr**. + * **SEG6_LOCAL_ACTION_END_T** + * End.T action: Endpoint with specific IPv6 table lookup. + * Type of *param*: **int**. + * **SEG6_LOCAL_ACTION_END_B6** + * End.B6 action: Endpoint bound to an SRv6 policy. + * Type of param: **struct ipv6_sr_hdr**. + * **SEG6_LOCAL_ACTION_END_B6_ENCAP** + * End.B6.Encap action: Endpoint bound to an SRv6 + * encapsulation policy. + * Type of param: **struct ipv6_sr_hdr**. + * + * A call to this helper is susceptible to change the underlaying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_rc_keydown(void *ctx, u32 protocol, u64 scancode, u32 toggle) + * Description + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded key press with *scancode*, + * *toggle* value in the given *protocol*. The scancode will be + * translated to a keycode using the rc keymap, and reported as + * an input key down event. After a period a key up event is + * generated. This period can be extended by calling either + * **bpf_rc_keydown**\ () again with the same values, or calling + * **bpf_rc_repeat**\ (). + * + * Some protocols include a toggle bit, in case the button was + * released and pressed again between consecutive scancodes. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * The *protocol* is the decoded protocol number (see + * **enum rc_proto** for some predefined values). + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * Return + * 0 + * + * int bpf_rc_repeat(void *ctx) + * Description + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded repeat key message. This delays + * the generation of a key up event for previously generated + * key down event. + * + * Some IR protocols like NEC have a special IR message for + * repeating last button, for when a button is held down. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * Return + * 0 + * + * uint64_t bpf_skb_cgroup_id(struct sk_buff *skb) + * Description + * Return the cgroup v2 id of the socket associated with the *skb*. + * This is roughly similar to the **bpf_get_cgroup_classid**\ () + * helper for cgroup v1 by providing a tag resp. identifier that + * can be matched on or used for map lookups e.g. to implement + * policy. The cgroup v2 id of a given path in the hierarchy is + * exposed in user space through the f_handle API in order to get + * to the same 64-bit id. + * + * This helper can be used on TC egress path, but not on ingress, + * and is available only if the kernel was compiled with the + * **CONFIG_SOCK_CGROUP_DATA** configuration option. + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * u64 bpf_skb_ancestor_cgroup_id(struct sk_buff *skb, int ancestor_level) + * Description + * Return id of cgroup v2 that is ancestor of cgroup associated + * with the *skb* at the *ancestor_level*. The root cgroup is at + * *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with *skb*, then return value will be same as that + * of **bpf_skb_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with *skb*. + * + * The format of returned id and helper limitations are same as in + * **bpf_skb_cgroup_id**\ (). + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * u64 bpf_get_current_cgroup_id(void) + * Return + * A 64-bit integer containing the current cgroup id based + * on the cgroup within which the current task is running. + * + * void* get_local_storage(void *map, u64 flags) + * Description + * Get the pointer to the local storage area. + * The type and the size of the local storage is defined + * by the *map* argument. + * The *flags* meaning is specific for each map type, + * and has to be 0 for cgroup local storage. + * + * Depending on the BPF program type, a local storage area + * can be shared between multiple instances of the BPF program, + * running simultaneously. + * + * A user should care about the synchronization by himself. + * For example, by using the **BPF_STX_XADD** instruction to alter + * the shared data. + * Return + * A pointer to the local storage area. + * + * int bpf_sk_select_reuseport(struct sk_reuseport_md *reuse, struct bpf_map *map, void *key, u64 flags) + * Description + * Select a **SO_REUSEPORT** socket from a + * **BPF_MAP_TYPE_REUSEPORT_ARRAY** *map*. + * It checks the selected socket is matching the incoming + * request in the socket buffer. + * Return + * 0 on success, or a negative error in case of failure. + * + * struct bpf_sock *bpf_sk_lookup_tcp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags) + * Description + * Look for TCP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * The *ctx* should point to the context of the program, such as + * the skb or socket (depending on the hook in use). This is used + * to determine the base network namespace for the lookup. + * + * *tuple_size* must be one of: + * + * **sizeof**\ (*tuple*\ **->ipv4**) + * Look for an IPv4 socket. + * **sizeof**\ (*tuple*\ **->ipv6**) + * Look for an IPv6 socket. + * + * If the *netns* is a negative signed 32-bit integer, then the + * socket lookup table in the netns associated with the *ctx* will + * will be used. For the TC hooks, this is the netns of the device + * in the skb. For socket hooks, this is the netns of the socket. + * If *netns* is any other signed 32-bit value greater than or + * equal to zero then it specifies the ID of the netns relative to + * the netns associated with the *ctx*. *netns* values beyond the + * range of 32-bit integers are reserved for future use. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * Return + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from **reuse->socks**\ [] using the hash of the tuple. + * + * struct bpf_sock *bpf_sk_lookup_udp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags) + * Description + * Look for UDP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * The *ctx* should point to the context of the program, such as + * the skb or socket (depending on the hook in use). This is used + * to determine the base network namespace for the lookup. + * + * *tuple_size* must be one of: + * + * **sizeof**\ (*tuple*\ **->ipv4**) + * Look for an IPv4 socket. + * **sizeof**\ (*tuple*\ **->ipv6**) + * Look for an IPv6 socket. + * + * If the *netns* is a negative signed 32-bit integer, then the + * socket lookup table in the netns associated with the *ctx* will + * will be used. For the TC hooks, this is the netns of the device + * in the skb. For socket hooks, this is the netns of the socket. + * If *netns* is any other signed 32-bit value greater than or + * equal to zero then it specifies the ID of the netns relative to + * the netns associated with the *ctx*. *netns* values beyond the + * range of 32-bit integers are reserved for future use. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * Return + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from **reuse->socks**\ [] using the hash of the tuple. + * + * int bpf_sk_release(struct bpf_sock *sock) + * Description + * Release the reference held by *sock*. *sock* must be a + * non-**NULL** pointer that was returned from + * **bpf_sk_lookup_xxx**\ (). + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_map_pop_elem(struct bpf_map *map, void *value) + * Description + * Pop an element from *map*. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_map_peek_elem(struct bpf_map *map, void *value) + * Description + * Get an element from *map* without removing it. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_msg_push_data(struct sk_buff *skb, u32 start, u32 len, u64 flags) + * Description + * For socket policies, insert *len* bytes into *msg* at offset + * *start*. + * + * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a + * *msg* it may want to insert metadata or options into the *msg*. + * This can later be read and used by any of the lower layer BPF + * hooks. + * + * This helper may fail if under memory pressure (a malloc + * fails) in these cases BPF programs will get an appropriate + * error and BPF programs will need to handle them. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_msg_pop_data(struct sk_msg_buff *msg, u32 start, u32 pop, u64 flags) + * Description + * Will remove *pop* bytes from a *msg* starting at byte *start*. + * This may result in **ENOMEM** errors under certain situations if + * an allocation and copy are required due to a full ring buffer. + * However, the helper will try to avoid doing the allocation + * if possible. Other errors can occur if input parameters are + * invalid either due to *start* byte not being valid part of *msg* + * payload and/or *pop* value being to large. + * Return + * 0 on success, or a negative error in case of failure. + * + * int bpf_rc_pointer_rel(void *ctx, s32 rel_x, s32 rel_y) + * Description + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded pointer movement. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * Return + * 0 */ #define __BPF_FUNC_MAPPER(FN) \ - FN(unspec), \ - FN(map_lookup_elem), \ - FN(map_update_elem), \ - FN(map_delete_elem), \ - FN(probe_read), \ - FN(ktime_get_ns), \ - FN(trace_printk), \ - FN(get_prandom_u32), \ - FN(get_smp_processor_id), \ - FN(skb_store_bytes), \ - FN(l3_csum_replace), \ - FN(l4_csum_replace), \ - FN(tail_call), \ - FN(clone_redirect), \ - FN(get_current_pid_tgid), \ - FN(get_current_uid_gid), \ - FN(get_current_comm), \ - FN(get_cgroup_classid), \ - FN(skb_vlan_push), \ - FN(skb_vlan_pop), \ - FN(skb_get_tunnel_key), \ - FN(skb_set_tunnel_key), \ - FN(perf_event_read), \ - FN(redirect), \ - FN(get_route_realm), \ - FN(perf_event_output), \ - FN(skb_load_bytes), \ - FN(get_stackid), \ - FN(csum_diff), \ - FN(skb_get_tunnel_opt), \ - FN(skb_set_tunnel_opt), \ - FN(skb_change_proto), \ - FN(skb_change_type), \ - FN(skb_under_cgroup), \ - FN(get_hash_recalc), \ - FN(get_current_task), \ - FN(probe_write_user), \ - FN(current_task_under_cgroup), \ - FN(skb_change_tail), \ - FN(skb_pull_data), \ - FN(csum_update), \ - FN(set_hash_invalid), \ - FN(get_numa_node_id), \ - FN(skb_change_head), \ - FN(xdp_adjust_head), \ - FN(probe_read_str), \ - FN(get_socket_cookie), \ - FN(get_socket_uid), \ - FN(set_hash), \ - FN(setsockopt), \ - FN(skb_adjust_room), \ - FN(redirect_map), \ - FN(sk_redirect_map), \ - FN(sock_map_update), \ - FN(xdp_adjust_meta), \ - FN(perf_event_read_value), \ - FN(perf_prog_read_value), \ - FN(getsockopt), \ - FN(override_return), \ - FN(sock_ops_cb_flags_set), + FN(unspec), \ + FN(map_lookup_elem), \ + FN(map_update_elem), \ + FN(map_delete_elem), \ + FN(probe_read), \ + FN(ktime_get_ns), \ + FN(trace_printk), \ + FN(get_prandom_u32), \ + FN(get_smp_processor_id), \ + FN(skb_store_bytes), \ + FN(l3_csum_replace), \ + FN(l4_csum_replace), \ + FN(tail_call), \ + FN(clone_redirect), \ + FN(get_current_pid_tgid), \ + FN(get_current_uid_gid), \ + FN(get_current_comm), \ + FN(get_cgroup_classid), \ + FN(skb_vlan_push), \ + FN(skb_vlan_pop), \ + FN(skb_get_tunnel_key), \ + FN(skb_set_tunnel_key), \ + FN(perf_event_read), \ + FN(redirect), \ + FN(get_route_realm), \ + FN(perf_event_output), \ + FN(skb_load_bytes), \ + FN(get_stackid), \ + FN(csum_diff), \ + FN(skb_get_tunnel_opt), \ + FN(skb_set_tunnel_opt), \ + FN(skb_change_proto), \ + FN(skb_change_type), \ + FN(skb_under_cgroup), \ + FN(get_hash_recalc), \ + FN(get_current_task), \ + FN(probe_write_user), \ + FN(current_task_under_cgroup), \ + FN(skb_change_tail), \ + FN(skb_pull_data), \ + FN(csum_update), \ + FN(set_hash_invalid), \ + FN(get_numa_node_id), \ + FN(skb_change_head), \ + FN(xdp_adjust_head), \ + FN(probe_read_str), \ + FN(get_socket_cookie), \ + FN(get_socket_uid), \ + FN(set_hash), \ + FN(setsockopt), \ + FN(skb_adjust_room), \ + FN(redirect_map), \ + FN(sk_redirect_map), \ + FN(sock_map_update), \ + FN(xdp_adjust_meta), \ + FN(perf_event_read_value), \ + FN(perf_prog_read_value), \ + FN(getsockopt), \ + FN(override_return), \ + FN(sock_ops_cb_flags_set), \ + FN(msg_redirect_map), \ + FN(msg_apply_bytes), \ + FN(msg_cork_bytes), \ + FN(msg_pull_data), \ + FN(bind), \ + FN(xdp_adjust_tail), \ + FN(skb_get_xfrm_state), \ + FN(get_stack), \ + FN(skb_load_bytes_relative), \ + FN(fib_lookup), \ + FN(sock_hash_update), \ + FN(msg_redirect_hash), \ + FN(sk_redirect_hash), \ + FN(lwt_push_encap), \ + FN(lwt_seg6_store_bytes), \ + FN(lwt_seg6_adjust_srh), \ + FN(lwt_seg6_action), \ + FN(rc_repeat), \ + FN(rc_keydown), \ + FN(skb_cgroup_id), \ + FN(get_current_cgroup_id), \ + FN(get_local_storage), \ + FN(sk_select_reuseport), \ + FN(skb_ancestor_cgroup_id), \ + FN(sk_lookup_tcp), \ + FN(sk_lookup_udp), \ + FN(sk_release), \ + FN(map_push_elem), \ + FN(map_pop_elem), \ + FN(map_peek_elem), \ + FN(msg_push_data), \ + FN(msg_pop_data), \ + FN(rc_pointer_rel), /* integer value in 'imm' field of BPF_CALL instruction selects which helper * function eBPF program intends to call */ #define __BPF_ENUM_FN(x) BPF_FUNC_ ## x enum bpf_func_id { - __BPF_FUNC_MAPPER(__BPF_ENUM_FN) - __BPF_FUNC_MAX_ID, + __BPF_FUNC_MAPPER(__BPF_ENUM_FN) + __BPF_FUNC_MAX_ID, }; #undef __BPF_ENUM_FN @@ -791,15 +2455,19 @@ enum bpf_func_id { /* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */ #define BPF_F_TUNINFO_IPV6 (1ULL << 0) -/* BPF_FUNC_get_stackid flags. */ +/* flags for both BPF_FUNC_get_stackid and BPF_FUNC_get_stack. */ #define BPF_F_SKIP_FIELD_MASK 0xffULL #define BPF_F_USER_STACK (1ULL << 8) +/* flags used by BPF_FUNC_get_stackid only. */ #define BPF_F_FAST_STACK_CMP (1ULL << 9) #define BPF_F_REUSE_STACKID (1ULL << 10) +/* flags used by BPF_FUNC_get_stack only. */ +#define BPF_F_USER_BUILD_ID (1ULL << 11) /* BPF_FUNC_skb_set_tunnel_key flags. */ #define BPF_F_ZERO_CSUM_TX (1ULL << 1) #define BPF_F_DONT_FRAGMENT (1ULL << 2) +#define BPF_F_SEQ_NUMBER (1ULL << 3) /* BPF_FUNC_perf_event_output, BPF_FUNC_perf_event_read and * BPF_FUNC_perf_event_read_value flags. @@ -809,57 +2477,95 @@ enum bpf_func_id { /* BPF_FUNC_perf_event_output for sk_buff input context. */ #define BPF_F_CTXLEN_MASK (0xfffffULL << 32) +/* Current network namespace */ +#define BPF_F_CURRENT_NETNS (-1L) + /* Mode for BPF_FUNC_skb_adjust_room helper. */ enum bpf_adj_room_mode { - BPF_ADJ_ROOM_NET, + BPF_ADJ_ROOM_NET, +}; + +/* Mode for BPF_FUNC_skb_load_bytes_relative helper. */ +enum bpf_hdr_start_off { + BPF_HDR_START_MAC, + BPF_HDR_START_NET, }; +/* Encapsulation type for BPF_FUNC_lwt_push_encap helper. */ +enum bpf_lwt_encap_mode { + BPF_LWT_ENCAP_SEG6, + BPF_LWT_ENCAP_SEG6_INLINE +}; + +#define __bpf_md_ptr(type, name) \ +union { \ + type name; \ + __u64 :64; \ +} __attribute__((aligned(8))) + /* user accessible mirror of in-kernel sk_buff. * new fields can only be added to the end of this structure */ struct __sk_buff { - __u32 len; - __u32 pkt_type; - __u32 mark; - __u32 queue_mapping; - __u32 protocol; - __u32 vlan_present; - __u32 vlan_tci; - __u32 vlan_proto; - __u32 priority; - __u32 ingress_ifindex; - __u32 ifindex; - __u32 tc_index; - __u32 cb[5]; - __u32 hash; - __u32 tc_classid; - __u32 data; - __u32 data_end; - __u32 napi_id; - - /* Accessed by BPF_PROG_TYPE_sk_skb types from here to ... */ - __u32 family; - __u32 remote_ip4; /* Stored in network byte order */ - __u32 local_ip4; /* Stored in network byte order */ - __u32 remote_ip6[4]; /* Stored in network byte order */ - __u32 local_ip6[4]; /* Stored in network byte order */ - __u32 remote_port; /* Stored in network byte order */ - __u32 local_port; /* stored in host byte order */ - /* ... here. */ - - __u32 data_meta; + __u32 len; + __u32 pkt_type; + __u32 mark; + __u32 queue_mapping; + __u32 protocol; + __u32 vlan_present; + __u32 vlan_tci; + __u32 vlan_proto; + __u32 priority; + __u32 ingress_ifindex; + __u32 ifindex; + __u32 tc_index; + __u32 cb[5]; + __u32 hash; + __u32 tc_classid; + __u32 data; + __u32 data_end; + __u32 napi_id; + + /* Accessed by BPF_PROG_TYPE_sk_skb types from here to ... */ + __u32 family; + __u32 remote_ip4; /* Stored in network byte order */ + __u32 local_ip4; /* Stored in network byte order */ + __u32 remote_ip6[4]; /* Stored in network byte order */ + __u32 local_ip6[4]; /* Stored in network byte order */ + __u32 remote_port; /* Stored in network byte order */ + __u32 local_port; /* stored in host byte order */ + /* ... here. */ + + __u32 data_meta; + __bpf_md_ptr(struct bpf_flow_keys *, flow_keys); + __u64 tstamp; + __u32 wire_len; }; struct bpf_tunnel_key { - __u32 tunnel_id; - union { - __u32 remote_ipv4; - __u32 remote_ipv6[4]; - }; - __u8 tunnel_tos; - __u8 tunnel_ttl; - __u16 tunnel_ext; - __u32 tunnel_label; + __u32 tunnel_id; + union { + __u32 remote_ipv4; + __u32 remote_ipv6[4]; + }; + __u8 tunnel_tos; + __u8 tunnel_ttl; + __u16 tunnel_ext; /* Padding, future use. */ + __u32 tunnel_label; +}; + +/* user accessible mirror of in-kernel xfrm_state. + * new fields can only be added to the end of this structure + */ +struct bpf_xfrm_state { + __u32 reqid; + __u32 spi; /* Stored in network byte order */ + __u16 family; + __u16 ext; /* Padding, future use. */ + union { + __u32 remote_ipv4; /* Stored in network byte order */ + __u32 remote_ipv6[4]; /* Stored in network byte order */ + }; }; /* Generic BPF return codes which all BPF program types may support. @@ -870,21 +2576,47 @@ struct bpf_tunnel_key { * XDP is handled seprately, see XDP_*. */ enum bpf_ret_code { - BPF_OK = 0, - /* 1 reserved */ - BPF_DROP = 2, - /* 3-6 reserved */ - BPF_REDIRECT = 7, - /* >127 are reserved for prog type specific return codes */ + BPF_OK = 0, + /* 1 reserved */ + BPF_DROP = 2, + /* 3-6 reserved */ + BPF_REDIRECT = 7, + /* >127 are reserved for prog type specific return codes */ }; struct bpf_sock { - __u32 bound_dev_if; - __u32 family; - __u32 type; - __u32 protocol; - __u32 mark; - __u32 priority; + __u32 bound_dev_if; + __u32 family; + __u32 type; + __u32 protocol; + __u32 mark; + __u32 priority; + __u32 src_ip4; /* Allows 1,2,4-byte read. + * Stored in network byte order. + */ + __u32 src_ip6[4]; /* Allows 1,2,4-byte read. + * Stored in network byte order. + */ + __u32 src_port; /* Allows 4-byte read. + * Stored in host byte order + */ +}; + +struct bpf_sock_tuple { + union { + struct { + __be32 saddr; + __be32 daddr; + __be16 sport; + __be16 dport; + } ipv4; + struct { + __be32 saddr[4]; + __be32 daddr[4]; + __be16 sport; + __be16 dport; + } ipv6; + }; }; #define XDP_PACKET_HEADROOM 256 @@ -895,63 +2627,158 @@ struct bpf_sock { * result in packet drops and a warning via bpf_warn_invalid_xdp_action(). */ enum xdp_action { - XDP_ABORTED = 0, - XDP_DROP, - XDP_PASS, - XDP_TX, - XDP_REDIRECT, + XDP_ABORTED = 0, + XDP_DROP, + XDP_PASS, + XDP_TX, + XDP_REDIRECT, }; /* user accessible metadata for XDP packet hook * new fields must be added to the end of this structure */ struct xdp_md { - __u32 data; - __u32 data_end; - __u32 data_meta; - /* Below access go through struct xdp_rxq_info */ - __u32 ingress_ifindex; /* rxq->dev->ifindex */ - __u32 rx_queue_index; /* rxq->queue_index */ + __u32 data; + __u32 data_end; + __u32 data_meta; + /* Below access go through struct xdp_rxq_info */ + __u32 ingress_ifindex; /* rxq->dev->ifindex */ + __u32 rx_queue_index; /* rxq->queue_index */ }; enum sk_action { - SK_DROP = 0, - SK_PASS, + SK_DROP = 0, + SK_PASS, +}; + +/* user accessible metadata for SK_MSG packet hook, new fields must + * be added to the end of this structure + */ +struct sk_msg_md { + __bpf_md_ptr(void *, data); + __bpf_md_ptr(void *, data_end); + + __u32 family; + __u32 remote_ip4; /* Stored in network byte order */ + __u32 local_ip4; /* Stored in network byte order */ + __u32 remote_ip6[4]; /* Stored in network byte order */ + __u32 local_ip6[4]; /* Stored in network byte order */ + __u32 remote_port; /* Stored in network byte order */ + __u32 local_port; /* stored in host byte order */ + __u32 size; /* Total size of sk_msg */ +}; + +struct sk_reuseport_md { + /* + * Start of directly accessible data. It begins from + * the tcp/udp header. + */ + __bpf_md_ptr(void *, data); + /* End of directly accessible data */ + __bpf_md_ptr(void *, data_end); + /* + * Total length of packet (starting from the tcp/udp header). + * Note that the directly accessible bytes (data_end - data) + * could be less than this "len". Those bytes could be + * indirectly read by a helper "bpf_skb_load_bytes()". + */ + __u32 len; + /* + * Eth protocol in the mac header (network byte order). e.g. + * ETH_P_IP(0x0800) and ETH_P_IPV6(0x86DD) + */ + __u32 eth_protocol; + __u32 ip_protocol; /* IP protocol. e.g. IPPROTO_TCP, IPPROTO_UDP */ + __u32 bind_inany; /* Is sock bound to an INANY address? */ + __u32 hash; /* A hash of the packet 4 tuples */ }; #define BPF_TAG_SIZE 8 struct bpf_prog_info { - __u32 type; - __u32 id; - __u8 tag[BPF_TAG_SIZE]; - __u32 jited_prog_len; - __u32 xlated_prog_len; - __aligned_u64 jited_prog_insns; - __aligned_u64 xlated_prog_insns; - __u64 load_time; /* ns since boottime */ - __u32 created_by_uid; - __u32 nr_map_ids; - __aligned_u64 map_ids; - char name[BPF_OBJ_NAME_LEN]; - __u32 ifindex; - __u64 netns_dev; - __u64 netns_ino; + __u32 type; + __u32 id; + __u8 tag[BPF_TAG_SIZE]; + __u32 jited_prog_len; + __u32 xlated_prog_len; + __aligned_u64 jited_prog_insns; + __aligned_u64 xlated_prog_insns; + __u64 load_time; /* ns since boottime */ + __u32 created_by_uid; + __u32 nr_map_ids; + __aligned_u64 map_ids; + char name[BPF_OBJ_NAME_LEN]; + __u32 ifindex; + __u32 gpl_compatible:1; + __u64 netns_dev; + __u64 netns_ino; + __u32 nr_jited_ksyms; + __u32 nr_jited_func_lens; + __aligned_u64 jited_ksyms; + __aligned_u64 jited_func_lens; + __u32 btf_id; + __u32 func_info_rec_size; + __aligned_u64 func_info; + __u32 nr_func_info; + __u32 nr_line_info; + __aligned_u64 line_info; + __aligned_u64 jited_line_info; + __u32 nr_jited_line_info; + __u32 line_info_rec_size; + __u32 jited_line_info_rec_size; + __u32 nr_prog_tags; + __aligned_u64 prog_tags; } __attribute__((aligned(8))); struct bpf_map_info { - __u32 type; - __u32 id; - __u32 key_size; - __u32 value_size; - __u32 max_entries; - __u32 map_flags; - char name[BPF_OBJ_NAME_LEN]; - __u32 ifindex; - __u64 netns_dev; - __u64 netns_ino; + __u32 type; + __u32 id; + __u32 key_size; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + char name[BPF_OBJ_NAME_LEN]; + __u32 ifindex; + __u32 :32; + __u64 netns_dev; + __u64 netns_ino; + __u32 btf_id; + __u32 btf_key_type_id; + __u32 btf_value_type_id; } __attribute__((aligned(8))); +struct bpf_btf_info { + __aligned_u64 btf; + __u32 btf_size; + __u32 id; +} __attribute__((aligned(8))); + +/* User bpf_sock_addr struct to access socket fields and sockaddr struct passed + * by user and intended to be used by socket (e.g. to bind to, depends on + * attach attach type). + */ +struct bpf_sock_addr { + __u32 user_family; /* Allows 4-byte read, but no write. */ + __u32 user_ip4; /* Allows 1,2,4-byte read and 4-byte write. + * Stored in network byte order. + */ + __u32 user_ip6[4]; /* Allows 1,2,4-byte read an 4-byte write. + * Stored in network byte order. + */ + __u32 user_port; /* Allows 4-byte read and write. + * Stored in network byte order + */ + __u32 family; /* Allows 4-byte read, but no write */ + __u32 type; /* Allows 4-byte read, but no write */ + __u32 protocol; /* Allows 4-byte read, but no write */ + __u32 msg_src_ip4; /* Allows 1,2,4-byte read an 4-byte write. + * Stored in network byte order. + */ + __u32 msg_src_ip6[4]; /* Allows 1,2,4-byte read an 4-byte write. + * Stored in network byte order. + */ +}; + /* User bpf_sock_ops struct to access socket values and specify request ops * and their replies. * Some of this fields are in network (bigendian) byte order and may need @@ -959,48 +2786,48 @@ struct bpf_map_info { * New fields can only be added at the end of this structure */ struct bpf_sock_ops { - __u32 op; - union { - __u32 args[4]; /* Optionally passed to bpf program */ - __u32 reply; /* Returned by bpf program */ - __u32 replylong[4]; /* Optionally returned by bpf prog */ - }; - __u32 family; - __u32 remote_ip4; /* Stored in network byte order */ - __u32 local_ip4; /* Stored in network byte order */ - __u32 remote_ip6[4]; /* Stored in network byte order */ - __u32 local_ip6[4]; /* Stored in network byte order */ - __u32 remote_port; /* Stored in network byte order */ - __u32 local_port; /* stored in host byte order */ - __u32 is_fullsock; /* Some TCP fields are only valid if - * there is a full socket. If not, the - * fields read as zero. - */ - __u32 snd_cwnd; - __u32 srtt_us; /* Averaged RTT << 3 in usecs */ - __u32 bpf_sock_ops_cb_flags; /* flags defined in uapi/linux/tcp.h */ - __u32 state; - __u32 rtt_min; - __u32 snd_ssthresh; - __u32 rcv_nxt; - __u32 snd_nxt; - __u32 snd_una; - __u32 mss_cache; - __u32 ecn_flags; - __u32 rate_delivered; - __u32 rate_interval_us; - __u32 packets_out; - __u32 retrans_out; - __u32 total_retrans; - __u32 segs_in; - __u32 data_segs_in; - __u32 segs_out; - __u32 data_segs_out; - __u32 lost_out; - __u32 sacked_out; - __u32 sk_txhash; - __u64 bytes_received; - __u64 bytes_acked; + __u32 op; + union { + __u32 args[4]; /* Optionally passed to bpf program */ + __u32 reply; /* Returned by bpf program */ + __u32 replylong[4]; /* Optionally returned by bpf prog */ + }; + __u32 family; + __u32 remote_ip4; /* Stored in network byte order */ + __u32 local_ip4; /* Stored in network byte order */ + __u32 remote_ip6[4]; /* Stored in network byte order */ + __u32 local_ip6[4]; /* Stored in network byte order */ + __u32 remote_port; /* Stored in network byte order */ + __u32 local_port; /* stored in host byte order */ + __u32 is_fullsock; /* Some TCP fields are only valid if + * there is a full socket. If not, the + * fields read as zero. + */ + __u32 snd_cwnd; + __u32 srtt_us; /* Averaged RTT << 3 in usecs */ + __u32 bpf_sock_ops_cb_flags; /* flags defined in uapi/linux/tcp.h */ + __u32 state; + __u32 rtt_min; + __u32 snd_ssthresh; + __u32 rcv_nxt; + __u32 snd_nxt; + __u32 snd_una; + __u32 mss_cache; + __u32 ecn_flags; + __u32 rate_delivered; + __u32 rate_interval_us; + __u32 packets_out; + __u32 retrans_out; + __u32 total_retrans; + __u32 segs_in; + __u32 data_segs_in; + __u32 segs_out; + __u32 data_segs_out; + __u32 lost_out; + __u32 sacked_out; + __u32 sk_txhash; + __u64 bytes_received; + __u64 bytes_acked; }; /* Definitions for bpf_sock_ops_cb_flags */ @@ -1008,57 +2835,60 @@ struct bpf_sock_ops { #define BPF_SOCK_OPS_RETRANS_CB_FLAG (1<<1) #define BPF_SOCK_OPS_STATE_CB_FLAG (1<<2) #define BPF_SOCK_OPS_ALL_CB_FLAGS 0x7 /* Mask of all currently - * supported cb flags - */ + * supported cb flags + */ /* List of known BPF sock_ops operators. * New entries can only be added at the end */ enum { - BPF_SOCK_OPS_VOID, - BPF_SOCK_OPS_TIMEOUT_INIT, /* Should return SYN-RTO value to use or - * -1 if default value should be used - */ - BPF_SOCK_OPS_RWND_INIT, /* Should return initial advertized - * window (in packets) or -1 if default - * value should be used - */ - BPF_SOCK_OPS_TCP_CONNECT_CB, /* Calls BPF program right before an - * active connection is initialized - */ - BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB, /* Calls BPF program when an - * active connection is - * established - */ - BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB, /* Calls BPF program when a - * passive connection is - * established - */ - BPF_SOCK_OPS_NEEDS_ECN, /* If connection's congestion control - * needs ECN - */ - BPF_SOCK_OPS_BASE_RTT, /* Get base RTT. The correct value is - * based on the path and may be - * dependent on the congestion control - * algorithm. In general it indicates - * a congestion threshold. RTTs above - * this indicate congestion - */ - BPF_SOCK_OPS_RTO_CB, /* Called when an RTO has triggered. - * Arg1: value of icsk_retransmits - * Arg2: value of icsk_rto - * Arg3: whether RTO has expired - */ - BPF_SOCK_OPS_RETRANS_CB, /* Called when skb is retransmitted. - * Arg1: sequence number of 1st byte - * Arg2: # segments - * Arg3: return value of - * tcp_transmit_skb (0 => success) - */ - BPF_SOCK_OPS_STATE_CB, /* Called when TCP changes state. - * Arg1: old_state - * Arg2: new_state - */ + BPF_SOCK_OPS_VOID, + BPF_SOCK_OPS_TIMEOUT_INIT, /* Should return SYN-RTO value to use or + * -1 if default value should be used + */ + BPF_SOCK_OPS_RWND_INIT, /* Should return initial advertized + * window (in packets) or -1 if default + * value should be used + */ + BPF_SOCK_OPS_TCP_CONNECT_CB, /* Calls BPF program right before an + * active connection is initialized + */ + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB, /* Calls BPF program when an + * active connection is + * established + */ + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB, /* Calls BPF program when a + * passive connection is + * established + */ + BPF_SOCK_OPS_NEEDS_ECN, /* If connection's congestion control + * needs ECN + */ + BPF_SOCK_OPS_BASE_RTT, /* Get base RTT. The correct value is + * based on the path and may be + * dependent on the congestion control + * algorithm. In general it indicates + * a congestion threshold. RTTs above + * this indicate congestion + */ + BPF_SOCK_OPS_RTO_CB, /* Called when an RTO has triggered. + * Arg1: value of icsk_retransmits + * Arg2: value of icsk_rto + * Arg3: whether RTO has expired + */ + BPF_SOCK_OPS_RETRANS_CB, /* Called when skb is retransmitted. + * Arg1: sequence number of 1st byte + * Arg2: # segments + * Arg3: return value of + * tcp_transmit_skb (0 => success) + */ + BPF_SOCK_OPS_STATE_CB, /* Called when TCP changes state. + * Arg1: old_state + * Arg2: new_state + */ + BPF_SOCK_OPS_TCP_LISTEN_CB, /* Called on listen(2), right after + * socket transition to LISTEN state. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect @@ -1067,29 +2897,29 @@ enum { * the BPF sock_ops function. */ enum { - BPF_TCP_ESTABLISHED = 1, - BPF_TCP_SYN_SENT, - BPF_TCP_SYN_RECV, - BPF_TCP_FIN_WAIT1, - BPF_TCP_FIN_WAIT2, - BPF_TCP_TIME_WAIT, - BPF_TCP_CLOSE, - BPF_TCP_CLOSE_WAIT, - BPF_TCP_LAST_ACK, - BPF_TCP_LISTEN, - BPF_TCP_CLOSING, /* Now a valid state */ - BPF_TCP_NEW_SYN_RECV, - - BPF_TCP_MAX_STATES /* Leave at the end! */ + BPF_TCP_ESTABLISHED = 1, + BPF_TCP_SYN_SENT, + BPF_TCP_SYN_RECV, + BPF_TCP_FIN_WAIT1, + BPF_TCP_FIN_WAIT2, + BPF_TCP_TIME_WAIT, + BPF_TCP_CLOSE, + BPF_TCP_CLOSE_WAIT, + BPF_TCP_LAST_ACK, + BPF_TCP_LISTEN, + BPF_TCP_CLOSING, /* Now a valid state */ + BPF_TCP_NEW_SYN_RECV, + + BPF_TCP_MAX_STATES /* Leave at the end! */ }; #define TCP_BPF_IW 1001 /* Set TCP initial congestion window */ #define TCP_BPF_SNDCWND_CLAMP 1002 /* Set sndcwnd_clamp */ struct bpf_perf_event_value { - __u64 counter; - __u64 enabled; - __u64 running; + __u64 counter; + __u64 enabled; + __u64 running; }; #define BPF_DEVCG_ACC_MKNOD (1ULL << 0) @@ -1100,10 +2930,128 @@ struct bpf_perf_event_value { #define BPF_DEVCG_DEV_CHAR (1ULL << 1) struct bpf_cgroup_dev_ctx { - /* access_type encoded as (BPF_DEVCG_ACC_* << 16) | BPF_DEVCG_DEV_* */ - __u32 access_type; - __u32 major; - __u32 minor; + /* access_type encoded as (BPF_DEVCG_ACC_* << 16) | BPF_DEVCG_DEV_* */ + __u32 access_type; + __u32 major; + __u32 minor; +}; + +struct bpf_raw_tracepoint_args { + __u64 args[0]; +}; + +/* DIRECT: Skip the FIB rules and go to FIB table associated with device + * OUTPUT: Do lookup from egress perspective; default is ingress + */ +#define BPF_FIB_LOOKUP_DIRECT BIT(0) +#define BPF_FIB_LOOKUP_OUTPUT BIT(1) + +enum { + BPF_FIB_LKUP_RET_SUCCESS, /* lookup successful */ + BPF_FIB_LKUP_RET_BLACKHOLE, /* dest is blackholed; can be dropped */ + BPF_FIB_LKUP_RET_UNREACHABLE, /* dest is unreachable; can be dropped */ + BPF_FIB_LKUP_RET_PROHIBIT, /* dest not allowed; can be dropped */ + BPF_FIB_LKUP_RET_NOT_FWDED, /* packet is not forwarded */ + BPF_FIB_LKUP_RET_FWD_DISABLED, /* fwding is not enabled on ingress */ + BPF_FIB_LKUP_RET_UNSUPP_LWT, /* fwd requires encapsulation */ + BPF_FIB_LKUP_RET_NO_NEIGH, /* no neighbor entry for nh */ + BPF_FIB_LKUP_RET_FRAG_NEEDED, /* fragmentation required to fwd */ +}; + +struct bpf_fib_lookup { + /* input: network family for lookup (AF_INET, AF_INET6) + * output: network family of egress nexthop + */ + __u8 family; + + /* set if lookup is to consider L4 data - e.g., FIB rules */ + __u8 l4_protocol; + __be16 sport; + __be16 dport; + + /* total length of packet from network header - used for MTU check */ + __u16 tot_len; + + /* input: L3 device index for lookup + * output: device index from FIB lookup + */ + __u32 ifindex; + + union { + /* inputs to lookup */ + __u8 tos; /* AF_INET */ + __be32 flowinfo; /* AF_INET6, flow_label + priority */ + + /* output: metric of fib result (IPv4/IPv6 only) */ + __u32 rt_metric; + }; + + union { + __be32 ipv4_src; + __u32 ipv6_src[4]; /* in6_addr; network order */ + }; + + /* input to bpf_fib_lookup, ipv{4,6}_dst is destination address in + * network header. output: bpf_fib_lookup sets to gateway address + * if FIB lookup returns gateway route + */ + union { + __be32 ipv4_dst; + __u32 ipv6_dst[4]; /* in6_addr; network order */ + }; + + /* output */ + __be16 h_vlan_proto; + __be16 h_vlan_TCI; + __u8 smac[6]; /* ETH_ALEN */ + __u8 dmac[6]; /* ETH_ALEN */ +}; + +enum bpf_task_fd_type { + BPF_FD_TYPE_RAW_TRACEPOINT, /* tp name */ + BPF_FD_TYPE_TRACEPOINT, /* tp name */ + BPF_FD_TYPE_KPROBE, /* (symbol + offset) or addr */ + BPF_FD_TYPE_KRETPROBE, /* (symbol + offset) or addr */ + BPF_FD_TYPE_UPROBE, /* filename + offset */ + BPF_FD_TYPE_URETPROBE, /* filename + offset */ +}; + +struct bpf_flow_keys { + __u16 nhoff; + __u16 thoff; + __u16 addr_proto; /* ETH_P_* of valid addrs */ + __u8 is_frag; + __u8 is_first_frag; + __u8 is_encap; + __u8 ip_proto; + __be16 n_proto; + __be16 sport; + __be16 dport; + union { + struct { + __be32 ipv4_src; + __be32 ipv4_dst; + }; + struct { + __u32 ipv6_src[4]; /* in6_addr; network order */ + __u32 ipv6_dst[4]; /* in6_addr; network order */ + }; + }; +}; + +struct bpf_func_info { + __u32 insn_off; + __u32 type_id; +}; + +#define BPF_LINE_INFO_LINE_NUM(line_col) ((line_col) >> 10) +#define BPF_LINE_INFO_LINE_COL(line_col) ((line_col) & 0x3ff) + +struct bpf_line_info { + __u32 insn_off; + __u32 file_name_off; + __u32 line_off; + __u32 line_col; }; #endif /* _UAPI__LINUX_BPF_H__ */ diff --git a/src/shared/linux/bpf_common.h b/src/shared/linux/bpf_common.h index afe7433b989..ee97668bdad 100644 --- a/src/shared/linux/bpf_common.h +++ b/src/shared/linux/bpf_common.h @@ -1,5 +1,6 @@ -#ifndef __LINUX_BPF_COMMON_H__ -#define __LINUX_BPF_COMMON_H__ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI__LINUX_BPF_COMMON_H__ +#define _UAPI__LINUX_BPF_COMMON_H__ /* Instruction classes */ #define BPF_CLASS(code) ((code) & 0x07) @@ -14,9 +15,10 @@ /* ld/ldx fields */ #define BPF_SIZE(code) ((code) & 0x18) -#define BPF_W 0x00 -#define BPF_H 0x08 -#define BPF_B 0x10 +#define BPF_W 0x00 /* 32-bit */ +#define BPF_H 0x08 /* 16-bit */ +#define BPF_B 0x10 /* 8-bit */ +/* eBPF BPF_DW 0x18 64-bit */ #define BPF_MODE(code) ((code) & 0xe0) #define BPF_IMM 0x00 #define BPF_ABS 0x20 @@ -52,4 +54,4 @@ #define BPF_MAXINSNS 4096 #endif -#endif /* __LINUX_BPF_COMMON_H__ */ +#endif /* _UAPI__LINUX_BPF_COMMON_H__ */ diff --git a/src/shared/linux/bpf_insn.h b/src/shared/linux/bpf_insn.h new file mode 100644 index 00000000000..e88459fdaae --- /dev/null +++ b/src/shared/linux/bpf_insn.h @@ -0,0 +1,205 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* eBPF instruction mini library */ +#ifndef __BPF_INSN_H +#define __BPF_INSN_H + +struct bpf_insn; + +/* ALU ops on registers, bpf_add|sub|...: dst_reg += src_reg */ + +#define BPF_ALU64_REG(OP, DST, SRC) \ + ((struct bpf_insn) { \ + .code = BPF_ALU64 | BPF_OP(OP) | BPF_X, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = 0, \ + .imm = 0 }) + +#define BPF_ALU32_REG(OP, DST, SRC) \ + ((struct bpf_insn) { \ + .code = BPF_ALU | BPF_OP(OP) | BPF_X, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = 0, \ + .imm = 0 }) + +/* ALU ops on immediates, bpf_add|sub|...: dst_reg += imm32 */ + +#define BPF_ALU64_IMM(OP, DST, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ALU64 | BPF_OP(OP) | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = 0, \ + .imm = IMM }) + +#define BPF_ALU32_IMM(OP, DST, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ALU | BPF_OP(OP) | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = 0, \ + .imm = IMM }) + +/* Short form of mov, dst_reg = src_reg */ + +#define BPF_MOV64_REG(DST, SRC) \ + ((struct bpf_insn) { \ + .code = BPF_ALU64 | BPF_MOV | BPF_X, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = 0, \ + .imm = 0 }) + +#define BPF_MOV32_REG(DST, SRC) \ + ((struct bpf_insn) { \ + .code = BPF_ALU | BPF_MOV | BPF_X, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = 0, \ + .imm = 0 }) + +/* Short form of mov, dst_reg = imm32 */ + +#define BPF_MOV64_IMM(DST, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ALU64 | BPF_MOV | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = 0, \ + .imm = IMM }) + +#define BPF_MOV32_IMM(DST, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ALU | BPF_MOV | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = 0, \ + .imm = IMM }) + +/* BPF_LD_IMM64 macro encodes single 'load 64-bit immediate' insn */ +#define BPF_LD_IMM64(DST, IMM) \ + BPF_LD_IMM64_RAW(DST, 0, IMM) + +#define BPF_LD_IMM64_RAW(DST, SRC, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_LD | BPF_DW | BPF_IMM, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = 0, \ + .imm = (__u32) (IMM) }), \ + ((struct bpf_insn) { \ + .code = 0, /* zero is reserved opcode */ \ + .dst_reg = 0, \ + .src_reg = 0, \ + .off = 0, \ + .imm = ((__u64) (IMM)) >> 32 }) + +#ifndef BPF_PSEUDO_MAP_FD +# define BPF_PSEUDO_MAP_FD 1 +#endif + +/* pseudo BPF_LD_IMM64 insn used to refer to process-local map_fd */ +#define BPF_LD_MAP_FD(DST, MAP_FD) \ + BPF_LD_IMM64_RAW(DST, BPF_PSEUDO_MAP_FD, MAP_FD) + + +/* Direct packet access, R0 = *(uint *) (skb->data + imm32) */ + +#define BPF_LD_ABS(SIZE, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_LD | BPF_SIZE(SIZE) | BPF_ABS, \ + .dst_reg = 0, \ + .src_reg = 0, \ + .off = 0, \ + .imm = IMM }) + +/* Memory load, dst_reg = *(uint *) (src_reg + off16) */ + +#define BPF_LDX_MEM(SIZE, DST, SRC, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_LDX | BPF_SIZE(SIZE) | BPF_MEM, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = OFF, \ + .imm = 0 }) + +/* Memory store, *(uint *) (dst_reg + off16) = src_reg */ + +#define BPF_STX_MEM(SIZE, DST, SRC, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_STX | BPF_SIZE(SIZE) | BPF_MEM, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = OFF, \ + .imm = 0 }) + +/* Atomic memory add, *(uint *)(dst_reg + off16) += src_reg */ + +#define BPF_STX_XADD(SIZE, DST, SRC, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_STX | BPF_SIZE(SIZE) | BPF_XADD, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = OFF, \ + .imm = 0 }) + +/* Memory store, *(uint *) (dst_reg + off16) = imm32 */ + +#define BPF_ST_MEM(SIZE, DST, OFF, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ST | BPF_SIZE(SIZE) | BPF_MEM, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = OFF, \ + .imm = IMM }) + +/* Conditional jumps against registers, if (dst_reg 'op' src_reg) goto pc + off16 */ + +#define BPF_JMP_REG(OP, DST, SRC, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_JMP | BPF_OP(OP) | BPF_X, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = OFF, \ + .imm = 0 }) + +/* Conditional jumps against immediates, if (dst_reg 'op' imm32) goto pc + off16 */ + +#define BPF_JMP_IMM(OP, DST, IMM, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_JMP | BPF_OP(OP) | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = OFF, \ + .imm = IMM }) + +#define BPF_JMP_A(OFF) \ + ((struct bpf_insn) { \ + .code = BPF_JMP | BPF_JA, \ + .dst_reg = 0, \ + .src_reg = 0, \ + .off = OFF, \ + .imm = 0 }) + +/* Raw code statement block */ + +#define BPF_RAW_INSN(CODE, DST, SRC, OFF, IMM) \ + ((struct bpf_insn) { \ + .code = CODE, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = OFF, \ + .imm = IMM }) + +/* Program exit */ + +#define BPF_EXIT_INSN() \ + ((struct bpf_insn) { \ + .code = BPF_JMP | BPF_EXIT, \ + .dst_reg = 0, \ + .src_reg = 0, \ + .off = 0, \ + .imm = 0 }) + +#endif diff --git a/src/shared/linux-3.13/dm-ioctl.h b/src/shared/linux/dm-ioctl.h similarity index 96% rename from src/shared/linux-3.13/dm-ioctl.h rename to src/shared/linux/dm-ioctl.h index c8a4302093a..8faa188c358 100644 --- a/src/shared/linux-3.13/dm-ioctl.h +++ b/src/shared/linux/dm-ioctl.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: LGPL-2.0+ WITH Linux-syscall-note */ /* * Copyright (C) 2001 - 2003 Sistina Software (UK) Limited. * Copyright (C) 2004 - 2009 Red Hat, Inc. All rights reserved. @@ -240,7 +241,8 @@ enum { /* Added later */ DM_LIST_VERSIONS_CMD, DM_TARGET_MSG_CMD, - DM_DEV_SET_GEOMETRY_CMD + DM_DEV_SET_GEOMETRY_CMD, + DM_DEV_ARM_POLL_CMD, }; #define DM_IOCTL 0xfd @@ -255,6 +257,7 @@ enum { #define DM_DEV_SUSPEND _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl) #define DM_DEV_STATUS _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl) #define DM_DEV_WAIT _IOWR(DM_IOCTL, DM_DEV_WAIT_CMD, struct dm_ioctl) +#define DM_DEV_ARM_POLL _IOWR(DM_IOCTL, DM_DEV_ARM_POLL_CMD, struct dm_ioctl) #define DM_TABLE_LOAD _IOWR(DM_IOCTL, DM_TABLE_LOAD_CMD, struct dm_ioctl) #define DM_TABLE_CLEAR _IOWR(DM_IOCTL, DM_TABLE_CLEAR_CMD, struct dm_ioctl) @@ -269,7 +272,7 @@ enum { #define DM_VERSION_MAJOR 4 #define DM_VERSION_MINOR 27 #define DM_VERSION_PATCHLEVEL 0 -#define DM_VERSION_EXTRA "-ioctl (2013-10-30)" +#define DM_VERSION_EXTRA "-ioctl (2018-04-03)" /* Status bits */ #define DM_READONLY_FLAG (1 << 0) /* In/Out */ @@ -352,4 +355,9 @@ enum { */ #define DM_DEFERRED_REMOVE (1 << 17) /* In/Out */ +/* + * If set, the device is suspended internally. + */ +#define DM_INTERNAL_SUSPEND_FLAG (1 << 18) /* Out */ + #endif /* _LINUX_DM_IOCTL_H */ diff --git a/src/shared/linux/ethtool.h b/src/shared/linux/ethtool.h new file mode 100644 index 00000000000..f6c45a36c92 --- /dev/null +++ b/src/shared/linux/ethtool.h @@ -0,0 +1,1843 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * ethtool.h: Defines for Linux ethtool. + * + * Copyright (C) 1998 David S. Miller (davem@redhat.com) + * Copyright 2001 Jeff Garzik <jgarzik@pobox.com> + * Portions Copyright 2001 Sun Microsystems (thockin@sun.com) + * Portions Copyright 2002 Intel (eli.kupermann@intel.com, + * christopher.leech@intel.com, + * scott.feldman@intel.com) + * Portions Copyright (C) Sun Microsystems 2008 + */ + +#ifndef _UAPI_LINUX_ETHTOOL_H +#define _UAPI_LINUX_ETHTOOL_H + +#include <linux/kernel.h> +#include <linux/types.h> +#include <linux/if_ether.h> + +#ifndef __KERNEL__ +#include <limits.h> /* for INT_MAX */ +#endif + +#ifndef __KERNEL_DIV_ROUND_UP +#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) +#endif + +/* All structures exposed to userland should be defined such that they + * have the same layout for 32-bit and 64-bit userland. + */ + +/** + * struct ethtool_cmd - DEPRECATED, link control and status + * This structure is DEPRECATED, please use struct ethtool_link_settings. + * @cmd: Command number = %ETHTOOL_GSET or %ETHTOOL_SSET + * @supported: Bitmask of %SUPPORTED_* flags for the link modes, + * physical connectors and other link features for which the + * interface supports autonegotiation or auto-detection. + * Read-only. + * @advertising: Bitmask of %ADVERTISED_* flags for the link modes, + * physical connectors and other link features that are + * advertised through autonegotiation or enabled for + * auto-detection. + * @speed: Low bits of the speed, 1Mb units, 0 to INT_MAX or SPEED_UNKNOWN + * @duplex: Duplex mode; one of %DUPLEX_* + * @port: Physical connector type; one of %PORT_* + * @phy_address: MDIO address of PHY (transceiver); 0 or 255 if not + * applicable. For clause 45 PHYs this is the PRTAD. + * @transceiver: Historically used to distinguish different possible + * PHY types, but not in a consistent way. Deprecated. + * @autoneg: Enable/disable autonegotiation and auto-detection; + * either %AUTONEG_DISABLE or %AUTONEG_ENABLE + * @mdio_support: Bitmask of %ETH_MDIO_SUPPORTS_* flags for the MDIO + * protocols supported by the interface; 0 if unknown. + * Read-only. + * @maxtxpkt: Historically used to report TX IRQ coalescing; now + * obsoleted by &struct ethtool_coalesce. Read-only; deprecated. + * @maxrxpkt: Historically used to report RX IRQ coalescing; now + * obsoleted by &struct ethtool_coalesce. Read-only; deprecated. + * @speed_hi: High bits of the speed, 1Mb units, 0 to INT_MAX or SPEED_UNKNOWN + * @eth_tp_mdix: Ethernet twisted-pair MDI(-X) status; one of + * %ETH_TP_MDI_*. If the status is unknown or not applicable, the + * value will be %ETH_TP_MDI_INVALID. Read-only. + * @eth_tp_mdix_ctrl: Ethernet twisted pair MDI(-X) control; one of + * %ETH_TP_MDI_*. If MDI(-X) control is not implemented, reads + * yield %ETH_TP_MDI_INVALID and writes may be ignored or rejected. + * When written successfully, the link should be renegotiated if + * necessary. + * @lp_advertising: Bitmask of %ADVERTISED_* flags for the link modes + * and other link features that the link partner advertised + * through autonegotiation; 0 if unknown or not applicable. + * Read-only. + * + * The link speed in Mbps is split between @speed and @speed_hi. Use + * the ethtool_cmd_speed() and ethtool_cmd_speed_set() functions to + * access it. + * + * If autonegotiation is disabled, the speed and @duplex represent the + * fixed link mode and are writable if the driver supports multiple + * link modes. If it is enabled then they are read-only; if the link + * is up they represent the negotiated link mode; if the link is down, + * the speed is 0, %SPEED_UNKNOWN or the highest enabled speed and + * @duplex is %DUPLEX_UNKNOWN or the best enabled duplex mode. + * + * Some hardware interfaces may have multiple PHYs and/or physical + * connectors fitted or do not allow the driver to detect which are + * fitted. For these interfaces @port and/or @phy_address may be + * writable, possibly dependent on @autoneg being %AUTONEG_DISABLE. + * Otherwise, attempts to write different values may be ignored or + * rejected. + * + * Users should assume that all fields not marked read-only are + * writable and subject to validation by the driver. They should use + * %ETHTOOL_GSET to get the current values before making specific + * changes and then applying them with %ETHTOOL_SSET. + * + * Deprecated fields should be ignored by both users and drivers. + */ +struct ethtool_cmd { + __u32 cmd; + __u32 supported; + __u32 advertising; + __u16 speed; + __u8 duplex; + __u8 port; + __u8 phy_address; + __u8 transceiver; + __u8 autoneg; + __u8 mdio_support; + __u32 maxtxpkt; + __u32 maxrxpkt; + __u16 speed_hi; + __u8 eth_tp_mdix; + __u8 eth_tp_mdix_ctrl; + __u32 lp_advertising; + __u32 reserved[2]; +}; + +static inline void ethtool_cmd_speed_set(struct ethtool_cmd *ep, + __u32 speed) +{ + ep->speed = (__u16)(speed & 0xFFFF); + ep->speed_hi = (__u16)(speed >> 16); +} + +static inline __u32 ethtool_cmd_speed(const struct ethtool_cmd *ep) +{ + return (ep->speed_hi << 16) | ep->speed; +} + +/* Device supports clause 22 register access to PHY or peripherals + * using the interface defined in <linux/mii.h>. This should not be + * set if there are known to be no such peripherals present or if + * the driver only emulates clause 22 registers for compatibility. + */ +#define ETH_MDIO_SUPPORTS_C22 1 + +/* Device supports clause 45 register access to PHY or peripherals + * using the interface defined in <linux/mii.h> and <linux/mdio.h>. + * This should not be set if there are known to be no such peripherals + * present. + */ +#define ETH_MDIO_SUPPORTS_C45 2 + +#define ETHTOOL_FWVERS_LEN 32 +#define ETHTOOL_BUSINFO_LEN 32 +#define ETHTOOL_EROMVERS_LEN 32 + +/** + * struct ethtool_drvinfo - general driver and device information + * @cmd: Command number = %ETHTOOL_GDRVINFO + * @driver: Driver short name. This should normally match the name + * in its bus driver structure (e.g. pci_driver::name). Must + * not be an empty string. + * @version: Driver version string; may be an empty string + * @fw_version: Firmware version string; may be an empty string + * @erom_version: Expansion ROM version string; may be an empty string + * @bus_info: Device bus address. This should match the dev_name() + * string for the underlying bus device, if there is one. May be + * an empty string. + * @n_priv_flags: Number of flags valid for %ETHTOOL_GPFLAGS and + * %ETHTOOL_SPFLAGS commands; also the number of strings in the + * %ETH_SS_PRIV_FLAGS set + * @n_stats: Number of u64 statistics returned by the %ETHTOOL_GSTATS + * command; also the number of strings in the %ETH_SS_STATS set + * @testinfo_len: Number of results returned by the %ETHTOOL_TEST + * command; also the number of strings in the %ETH_SS_TEST set + * @eedump_len: Size of EEPROM accessible through the %ETHTOOL_GEEPROM + * and %ETHTOOL_SEEPROM commands, in bytes + * @regdump_len: Size of register dump returned by the %ETHTOOL_GREGS + * command, in bytes + * + * Users can use the %ETHTOOL_GSSET_INFO command to get the number of + * strings in any string set (from Linux 2.6.34). + * + * Drivers should set at most @driver, @version, @fw_version and + * @bus_info in their get_drvinfo() implementation. The ethtool + * core fills in the other fields using other driver operations. + */ +struct ethtool_drvinfo { + __u32 cmd; + char driver[32]; + char version[32]; + char fw_version[ETHTOOL_FWVERS_LEN]; + char bus_info[ETHTOOL_BUSINFO_LEN]; + char erom_version[ETHTOOL_EROMVERS_LEN]; + char reserved2[12]; + __u32 n_priv_flags; + __u32 n_stats; + __u32 testinfo_len; + __u32 eedump_len; + __u32 regdump_len; +}; + +#define SOPASS_MAX 6 + +/** + * struct ethtool_wolinfo - Wake-On-Lan configuration + * @cmd: Command number = %ETHTOOL_GWOL or %ETHTOOL_SWOL + * @supported: Bitmask of %WAKE_* flags for supported Wake-On-Lan modes. + * Read-only. + * @wolopts: Bitmask of %WAKE_* flags for enabled Wake-On-Lan modes. + * @sopass: SecureOn(tm) password; meaningful only if %WAKE_MAGICSECURE + * is set in @wolopts. + */ +struct ethtool_wolinfo { + __u32 cmd; + __u32 supported; + __u32 wolopts; + __u8 sopass[SOPASS_MAX]; +}; + +/* for passing single values */ +struct ethtool_value { + __u32 cmd; + __u32 data; +}; + +#define PFC_STORM_PREVENTION_AUTO 0xffff +#define PFC_STORM_PREVENTION_DISABLE 0 + +enum tunable_id { + ETHTOOL_ID_UNSPEC, + ETHTOOL_RX_COPYBREAK, + ETHTOOL_TX_COPYBREAK, + ETHTOOL_PFC_PREVENTION_TOUT, /* timeout in msecs */ + /* + * Add your fresh new tunable attribute above and remember to update + * tunable_strings[] in net/core/ethtool.c + */ + __ETHTOOL_TUNABLE_COUNT, +}; + +enum tunable_type_id { + ETHTOOL_TUNABLE_UNSPEC, + ETHTOOL_TUNABLE_U8, + ETHTOOL_TUNABLE_U16, + ETHTOOL_TUNABLE_U32, + ETHTOOL_TUNABLE_U64, + ETHTOOL_TUNABLE_STRING, + ETHTOOL_TUNABLE_S8, + ETHTOOL_TUNABLE_S16, + ETHTOOL_TUNABLE_S32, + ETHTOOL_TUNABLE_S64, +}; + +struct ethtool_tunable { + __u32 cmd; + __u32 id; + __u32 type_id; + __u32 len; + void *data[0]; +}; + +#define DOWNSHIFT_DEV_DEFAULT_COUNT 0xff +#define DOWNSHIFT_DEV_DISABLE 0 + +enum phy_tunable_id { + ETHTOOL_PHY_ID_UNSPEC, + ETHTOOL_PHY_DOWNSHIFT, + /* + * Add your fresh new phy tunable attribute above and remember to update + * phy_tunable_strings[] in net/core/ethtool.c + */ + __ETHTOOL_PHY_TUNABLE_COUNT, +}; + +/** + * struct ethtool_regs - hardware register dump + * @cmd: Command number = %ETHTOOL_GREGS + * @version: Dump format version. This is driver-specific and may + * distinguish different chips/revisions. Drivers must use new + * version numbers whenever the dump format changes in an + * incompatible way. + * @len: On entry, the real length of @data. On return, the number of + * bytes used. + * @data: Buffer for the register dump + * + * Users should use %ETHTOOL_GDRVINFO to find the maximum length of + * a register dump for the interface. They must allocate the buffer + * immediately following this structure. + */ +struct ethtool_regs { + __u32 cmd; + __u32 version; + __u32 len; + __u8 data[0]; +}; + +/** + * struct ethtool_eeprom - EEPROM dump + * @cmd: Command number = %ETHTOOL_GEEPROM, %ETHTOOL_GMODULEEEPROM or + * %ETHTOOL_SEEPROM + * @magic: A 'magic cookie' value to guard against accidental changes. + * The value passed in to %ETHTOOL_SEEPROM must match the value + * returned by %ETHTOOL_GEEPROM for the same device. This is + * unused when @cmd is %ETHTOOL_GMODULEEEPROM. + * @offset: Offset within the EEPROM to begin reading/writing, in bytes + * @len: On entry, number of bytes to read/write. On successful + * return, number of bytes actually read/written. In case of + * error, this may indicate at what point the error occurred. + * @data: Buffer to read/write from + * + * Users may use %ETHTOOL_GDRVINFO or %ETHTOOL_GMODULEINFO to find + * the length of an on-board or module EEPROM, respectively. They + * must allocate the buffer immediately following this structure. + */ +struct ethtool_eeprom { + __u32 cmd; + __u32 magic; + __u32 offset; + __u32 len; + __u8 data[0]; +}; + +/** + * struct ethtool_eee - Energy Efficient Ethernet information + * @cmd: ETHTOOL_{G,S}EEE + * @supported: Mask of %SUPPORTED_* flags for the speed/duplex combinations + * for which there is EEE support. + * @advertised: Mask of %ADVERTISED_* flags for the speed/duplex combinations + * advertised as eee capable. + * @lp_advertised: Mask of %ADVERTISED_* flags for the speed/duplex + * combinations advertised by the link partner as eee capable. + * @eee_active: Result of the eee auto negotiation. + * @eee_enabled: EEE configured mode (enabled/disabled). + * @tx_lpi_enabled: Whether the interface should assert its tx lpi, given + * that eee was negotiated. + * @tx_lpi_timer: Time in microseconds the interface delays prior to asserting + * its tx lpi (after reaching 'idle' state). Effective only when eee + * was negotiated and tx_lpi_enabled was set. + */ +struct ethtool_eee { + __u32 cmd; + __u32 supported; + __u32 advertised; + __u32 lp_advertised; + __u32 eee_active; + __u32 eee_enabled; + __u32 tx_lpi_enabled; + __u32 tx_lpi_timer; + __u32 reserved[2]; +}; + +/** + * struct ethtool_modinfo - plugin module eeprom information + * @cmd: %ETHTOOL_GMODULEINFO + * @type: Standard the module information conforms to %ETH_MODULE_SFF_xxxx + * @eeprom_len: Length of the eeprom + * + * This structure is used to return the information to + * properly size memory for a subsequent call to %ETHTOOL_GMODULEEEPROM. + * The type code indicates the eeprom data format + */ +struct ethtool_modinfo { + __u32 cmd; + __u32 type; + __u32 eeprom_len; + __u32 reserved[8]; +}; + +/** + * struct ethtool_coalesce - coalescing parameters for IRQs and stats updates + * @cmd: ETHTOOL_{G,S}COALESCE + * @rx_coalesce_usecs: How many usecs to delay an RX interrupt after + * a packet arrives. + * @rx_max_coalesced_frames: Maximum number of packets to receive + * before an RX interrupt. + * @rx_coalesce_usecs_irq: Same as @rx_coalesce_usecs, except that + * this value applies while an IRQ is being serviced by the host. + * @rx_max_coalesced_frames_irq: Same as @rx_max_coalesced_frames, + * except that this value applies while an IRQ is being serviced + * by the host. + * @tx_coalesce_usecs: How many usecs to delay a TX interrupt after + * a packet is sent. + * @tx_max_coalesced_frames: Maximum number of packets to be sent + * before a TX interrupt. + * @tx_coalesce_usecs_irq: Same as @tx_coalesce_usecs, except that + * this value applies while an IRQ is being serviced by the host. + * @tx_max_coalesced_frames_irq: Same as @tx_max_coalesced_frames, + * except that this value applies while an IRQ is being serviced + * by the host. + * @stats_block_coalesce_usecs: How many usecs to delay in-memory + * statistics block updates. Some drivers do not have an + * in-memory statistic block, and in such cases this value is + * ignored. This value must not be zero. + * @use_adaptive_rx_coalesce: Enable adaptive RX coalescing. + * @use_adaptive_tx_coalesce: Enable adaptive TX coalescing. + * @pkt_rate_low: Threshold for low packet rate (packets per second). + * @rx_coalesce_usecs_low: How many usecs to delay an RX interrupt after + * a packet arrives, when the packet rate is below @pkt_rate_low. + * @rx_max_coalesced_frames_low: Maximum number of packets to be received + * before an RX interrupt, when the packet rate is below @pkt_rate_low. + * @tx_coalesce_usecs_low: How many usecs to delay a TX interrupt after + * a packet is sent, when the packet rate is below @pkt_rate_low. + * @tx_max_coalesced_frames_low: Maximum nuumber of packets to be sent before + * a TX interrupt, when the packet rate is below @pkt_rate_low. + * @pkt_rate_high: Threshold for high packet rate (packets per second). + * @rx_coalesce_usecs_high: How many usecs to delay an RX interrupt after + * a packet arrives, when the packet rate is above @pkt_rate_high. + * @rx_max_coalesced_frames_high: Maximum number of packets to be received + * before an RX interrupt, when the packet rate is above @pkt_rate_high. + * @tx_coalesce_usecs_high: How many usecs to delay a TX interrupt after + * a packet is sent, when the packet rate is above @pkt_rate_high. + * @tx_max_coalesced_frames_high: Maximum number of packets to be sent before + * a TX interrupt, when the packet rate is above @pkt_rate_high. + * @rate_sample_interval: How often to do adaptive coalescing packet rate + * sampling, measured in seconds. Must not be zero. + * + * Each pair of (usecs, max_frames) fields specifies that interrupts + * should be coalesced until + * (usecs > 0 && time_since_first_completion >= usecs) || + * (max_frames > 0 && completed_frames >= max_frames) + * + * It is illegal to set both usecs and max_frames to zero as this + * would cause interrupts to never be generated. To disable + * coalescing, set usecs = 0 and max_frames = 1. + * + * Some implementations ignore the value of max_frames and use the + * condition time_since_first_completion >= usecs + * + * This is deprecated. Drivers for hardware that does not support + * counting completions should validate that max_frames == !rx_usecs. + * + * Adaptive RX/TX coalescing is an algorithm implemented by some + * drivers to improve latency under low packet rates and improve + * throughput under high packet rates. Some drivers only implement + * one of RX or TX adaptive coalescing. Anything not implemented by + * the driver causes these values to be silently ignored. + * + * When the packet rate is below @pkt_rate_high but above + * @pkt_rate_low (both measured in packets per second) the + * normal {rx,tx}_* coalescing parameters are used. + */ +struct ethtool_coalesce { + __u32 cmd; + __u32 rx_coalesce_usecs; + __u32 rx_max_coalesced_frames; + __u32 rx_coalesce_usecs_irq; + __u32 rx_max_coalesced_frames_irq; + __u32 tx_coalesce_usecs; + __u32 tx_max_coalesced_frames; + __u32 tx_coalesce_usecs_irq; + __u32 tx_max_coalesced_frames_irq; + __u32 stats_block_coalesce_usecs; + __u32 use_adaptive_rx_coalesce; + __u32 use_adaptive_tx_coalesce; + __u32 pkt_rate_low; + __u32 rx_coalesce_usecs_low; + __u32 rx_max_coalesced_frames_low; + __u32 tx_coalesce_usecs_low; + __u32 tx_max_coalesced_frames_low; + __u32 pkt_rate_high; + __u32 rx_coalesce_usecs_high; + __u32 rx_max_coalesced_frames_high; + __u32 tx_coalesce_usecs_high; + __u32 tx_max_coalesced_frames_high; + __u32 rate_sample_interval; +}; + +/** + * struct ethtool_ringparam - RX/TX ring parameters + * @cmd: Command number = %ETHTOOL_GRINGPARAM or %ETHTOOL_SRINGPARAM + * @rx_max_pending: Maximum supported number of pending entries per + * RX ring. Read-only. + * @rx_mini_max_pending: Maximum supported number of pending entries + * per RX mini ring. Read-only. + * @rx_jumbo_max_pending: Maximum supported number of pending entries + * per RX jumbo ring. Read-only. + * @tx_max_pending: Maximum supported number of pending entries per + * TX ring. Read-only. + * @rx_pending: Current maximum number of pending entries per RX ring + * @rx_mini_pending: Current maximum number of pending entries per RX + * mini ring + * @rx_jumbo_pending: Current maximum number of pending entries per RX + * jumbo ring + * @tx_pending: Current maximum supported number of pending entries + * per TX ring + * + * If the interface does not have separate RX mini and/or jumbo rings, + * @rx_mini_max_pending and/or @rx_jumbo_max_pending will be 0. + * + * There may also be driver-dependent minimum values for the number + * of entries per ring. + */ +struct ethtool_ringparam { + __u32 cmd; + __u32 rx_max_pending; + __u32 rx_mini_max_pending; + __u32 rx_jumbo_max_pending; + __u32 tx_max_pending; + __u32 rx_pending; + __u32 rx_mini_pending; + __u32 rx_jumbo_pending; + __u32 tx_pending; +}; + +/** + * struct ethtool_channels - configuring number of network channel + * @cmd: ETHTOOL_{G,S}CHANNELS + * @max_rx: Read only. Maximum number of receive channel the driver support. + * @max_tx: Read only. Maximum number of transmit channel the driver support. + * @max_other: Read only. Maximum number of other channel the driver support. + * @max_combined: Read only. Maximum number of combined channel the driver + * support. Set of queues RX, TX or other. + * @rx_count: Valid values are in the range 1 to the max_rx. + * @tx_count: Valid values are in the range 1 to the max_tx. + * @other_count: Valid values are in the range 1 to the max_other. + * @combined_count: Valid values are in the range 1 to the max_combined. + * + * This can be used to configure RX, TX and other channels. + */ + +struct ethtool_channels { + __u32 cmd; + __u32 max_rx; + __u32 max_tx; + __u32 max_other; + __u32 max_combined; + __u32 rx_count; + __u32 tx_count; + __u32 other_count; + __u32 combined_count; +}; + +/** + * struct ethtool_pauseparam - Ethernet pause (flow control) parameters + * @cmd: Command number = %ETHTOOL_GPAUSEPARAM or %ETHTOOL_SPAUSEPARAM + * @autoneg: Flag to enable autonegotiation of pause frame use + * @rx_pause: Flag to enable reception of pause frames + * @tx_pause: Flag to enable transmission of pause frames + * + * Drivers should reject a non-zero setting of @autoneg when + * autoneogotiation is disabled (or not supported) for the link. + * + * If the link is autonegotiated, drivers should use + * mii_advertise_flowctrl() or similar code to set the advertised + * pause frame capabilities based on the @rx_pause and @tx_pause flags, + * even if @autoneg is zero. They should also allow the advertised + * pause frame capabilities to be controlled directly through the + * advertising field of &struct ethtool_cmd. + * + * If @autoneg is non-zero, the MAC is configured to send and/or + * receive pause frames according to the result of autonegotiation. + * Otherwise, it is configured directly based on the @rx_pause and + * @tx_pause flags. + */ +struct ethtool_pauseparam { + __u32 cmd; + __u32 autoneg; + __u32 rx_pause; + __u32 tx_pause; +}; + +#define ETH_GSTRING_LEN 32 + +/** + * enum ethtool_stringset - string set ID + * @ETH_SS_TEST: Self-test result names, for use with %ETHTOOL_TEST + * @ETH_SS_STATS: Statistic names, for use with %ETHTOOL_GSTATS + * @ETH_SS_PRIV_FLAGS: Driver private flag names, for use with + * %ETHTOOL_GPFLAGS and %ETHTOOL_SPFLAGS + * @ETH_SS_NTUPLE_FILTERS: Previously used with %ETHTOOL_GRXNTUPLE; + * now deprecated + * @ETH_SS_FEATURES: Device feature names + * @ETH_SS_RSS_HASH_FUNCS: RSS hush function names + * @ETH_SS_PHY_STATS: Statistic names, for use with %ETHTOOL_GPHYSTATS + * @ETH_SS_PHY_TUNABLES: PHY tunable names + */ +enum ethtool_stringset { + ETH_SS_TEST = 0, + ETH_SS_STATS, + ETH_SS_PRIV_FLAGS, + ETH_SS_NTUPLE_FILTERS, + ETH_SS_FEATURES, + ETH_SS_RSS_HASH_FUNCS, + ETH_SS_TUNABLES, + ETH_SS_PHY_STATS, + ETH_SS_PHY_TUNABLES, +}; + +/** + * struct ethtool_gstrings - string set for data tagging + * @cmd: Command number = %ETHTOOL_GSTRINGS + * @string_set: String set ID; one of &enum ethtool_stringset + * @len: On return, the number of strings in the string set + * @data: Buffer for strings. Each string is null-padded to a size of + * %ETH_GSTRING_LEN. + * + * Users must use %ETHTOOL_GSSET_INFO to find the number of strings in + * the string set. They must allocate a buffer of the appropriate + * size immediately following this structure. + */ +struct ethtool_gstrings { + __u32 cmd; + __u32 string_set; + __u32 len; + __u8 data[0]; +}; + +/** + * struct ethtool_sset_info - string set information + * @cmd: Command number = %ETHTOOL_GSSET_INFO + * @sset_mask: On entry, a bitmask of string sets to query, with bits + * numbered according to &enum ethtool_stringset. On return, a + * bitmask of those string sets queried that are supported. + * @data: Buffer for string set sizes. On return, this contains the + * size of each string set that was queried and supported, in + * order of ID. + * + * Example: The user passes in @sset_mask = 0x7 (sets 0, 1, 2) and on + * return @sset_mask == 0x6 (sets 1, 2). Then @data[0] contains the + * size of set 1 and @data[1] contains the size of set 2. + * + * Users must allocate a buffer of the appropriate size (4 * number of + * sets queried) immediately following this structure. + */ +struct ethtool_sset_info { + __u32 cmd; + __u32 reserved; + __u64 sset_mask; + __u32 data[0]; +}; + +/** + * enum ethtool_test_flags - flags definition of ethtool_test + * @ETH_TEST_FL_OFFLINE: if set perform online and offline tests, otherwise + * only online tests. + * @ETH_TEST_FL_FAILED: Driver set this flag if test fails. + * @ETH_TEST_FL_EXTERNAL_LB: Application request to perform external loopback + * test. + * @ETH_TEST_FL_EXTERNAL_LB_DONE: Driver performed the external loopback test + */ + +enum ethtool_test_flags { + ETH_TEST_FL_OFFLINE = (1 << 0), + ETH_TEST_FL_FAILED = (1 << 1), + ETH_TEST_FL_EXTERNAL_LB = (1 << 2), + ETH_TEST_FL_EXTERNAL_LB_DONE = (1 << 3), +}; + +/** + * struct ethtool_test - device self-test invocation + * @cmd: Command number = %ETHTOOL_TEST + * @flags: A bitmask of flags from &enum ethtool_test_flags. Some + * flags may be set by the user on entry; others may be set by + * the driver on return. + * @len: On return, the number of test results + * @data: Array of test results + * + * Users must use %ETHTOOL_GSSET_INFO or %ETHTOOL_GDRVINFO to find the + * number of test results that will be returned. They must allocate a + * buffer of the appropriate size (8 * number of results) immediately + * following this structure. + */ +struct ethtool_test { + __u32 cmd; + __u32 flags; + __u32 reserved; + __u32 len; + __u64 data[0]; +}; + +/** + * struct ethtool_stats - device-specific statistics + * @cmd: Command number = %ETHTOOL_GSTATS + * @n_stats: On return, the number of statistics + * @data: Array of statistics + * + * Users must use %ETHTOOL_GSSET_INFO or %ETHTOOL_GDRVINFO to find the + * number of statistics that will be returned. They must allocate a + * buffer of the appropriate size (8 * number of statistics) + * immediately following this structure. + */ +struct ethtool_stats { + __u32 cmd; + __u32 n_stats; + __u64 data[0]; +}; + +/** + * struct ethtool_perm_addr - permanent hardware address + * @cmd: Command number = %ETHTOOL_GPERMADDR + * @size: On entry, the size of the buffer. On return, the size of the + * address. The command fails if the buffer is too small. + * @data: Buffer for the address + * + * Users must allocate the buffer immediately following this structure. + * A buffer size of %MAX_ADDR_LEN should be sufficient for any address + * type. + */ +struct ethtool_perm_addr { + __u32 cmd; + __u32 size; + __u8 data[0]; +}; + +/* boolean flags controlling per-interface behavior characteristics. + * When reading, the flag indicates whether or not a certain behavior + * is enabled/present. When writing, the flag indicates whether + * or not the driver should turn on (set) or off (clear) a behavior. + * + * Some behaviors may read-only (unconditionally absent or present). + * If such is the case, return EINVAL in the set-flags operation if the + * flag differs from the read-only value. + */ +enum ethtool_flags { + ETH_FLAG_TXVLAN = (1 << 7), /* TX VLAN offload enabled */ + ETH_FLAG_RXVLAN = (1 << 8), /* RX VLAN offload enabled */ + ETH_FLAG_LRO = (1 << 15), /* LRO is enabled */ + ETH_FLAG_NTUPLE = (1 << 27), /* N-tuple filters enabled */ + ETH_FLAG_RXHASH = (1 << 28), +}; + +/* The following structures are for supporting RX network flow + * classification and RX n-tuple configuration. Note, all multibyte + * fields, e.g., ip4src, ip4dst, psrc, pdst, spi, etc. are expected to + * be in network byte order. + */ + +/** + * struct ethtool_tcpip4_spec - flow specification for TCP/IPv4 etc. + * @ip4src: Source host + * @ip4dst: Destination host + * @psrc: Source port + * @pdst: Destination port + * @tos: Type-of-service + * + * This can be used to specify a TCP/IPv4, UDP/IPv4 or SCTP/IPv4 flow. + */ +struct ethtool_tcpip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be16 psrc; + __be16 pdst; + __u8 tos; +}; + +/** + * struct ethtool_ah_espip4_spec - flow specification for IPsec/IPv4 + * @ip4src: Source host + * @ip4dst: Destination host + * @spi: Security parameters index + * @tos: Type-of-service + * + * This can be used to specify an IPsec transport or tunnel over IPv4. + */ +struct ethtool_ah_espip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be32 spi; + __u8 tos; +}; + +#define ETH_RX_NFC_IP4 1 + +/** + * struct ethtool_usrip4_spec - general flow specification for IPv4 + * @ip4src: Source host + * @ip4dst: Destination host + * @l4_4_bytes: First 4 bytes of transport (layer 4) header + * @tos: Type-of-service + * @ip_ver: Value must be %ETH_RX_NFC_IP4; mask must be 0 + * @proto: Transport protocol number; mask must be 0 + */ +struct ethtool_usrip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be32 l4_4_bytes; + __u8 tos; + __u8 ip_ver; + __u8 proto; +}; + +/** + * struct ethtool_tcpip6_spec - flow specification for TCP/IPv6 etc. + * @ip6src: Source host + * @ip6dst: Destination host + * @psrc: Source port + * @pdst: Destination port + * @tclass: Traffic Class + * + * This can be used to specify a TCP/IPv6, UDP/IPv6 or SCTP/IPv6 flow. + */ +struct ethtool_tcpip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be16 psrc; + __be16 pdst; + __u8 tclass; +}; + +/** + * struct ethtool_ah_espip6_spec - flow specification for IPsec/IPv6 + * @ip6src: Source host + * @ip6dst: Destination host + * @spi: Security parameters index + * @tclass: Traffic Class + * + * This can be used to specify an IPsec transport or tunnel over IPv6. + */ +struct ethtool_ah_espip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be32 spi; + __u8 tclass; +}; + +/** + * struct ethtool_usrip6_spec - general flow specification for IPv6 + * @ip6src: Source host + * @ip6dst: Destination host + * @l4_4_bytes: First 4 bytes of transport (layer 4) header + * @tclass: Traffic Class + * @l4_proto: Transport protocol number (nexthdr after any Extension Headers) + */ +struct ethtool_usrip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be32 l4_4_bytes; + __u8 tclass; + __u8 l4_proto; +}; + +union ethtool_flow_union { + struct ethtool_tcpip4_spec tcp_ip4_spec; + struct ethtool_tcpip4_spec udp_ip4_spec; + struct ethtool_tcpip4_spec sctp_ip4_spec; + struct ethtool_ah_espip4_spec ah_ip4_spec; + struct ethtool_ah_espip4_spec esp_ip4_spec; + struct ethtool_usrip4_spec usr_ip4_spec; + struct ethtool_tcpip6_spec tcp_ip6_spec; + struct ethtool_tcpip6_spec udp_ip6_spec; + struct ethtool_tcpip6_spec sctp_ip6_spec; + struct ethtool_ah_espip6_spec ah_ip6_spec; + struct ethtool_ah_espip6_spec esp_ip6_spec; + struct ethtool_usrip6_spec usr_ip6_spec; + struct ethhdr ether_spec; + __u8 hdata[52]; +}; + +/** + * struct ethtool_flow_ext - additional RX flow fields + * @h_dest: destination MAC address + * @vlan_etype: VLAN EtherType + * @vlan_tci: VLAN tag control information + * @data: user defined data + * + * Note, @vlan_etype, @vlan_tci, and @data are only valid if %FLOW_EXT + * is set in &struct ethtool_rx_flow_spec @flow_type. + * @h_dest is valid if %FLOW_MAC_EXT is set. + */ +struct ethtool_flow_ext { + __u8 padding[2]; + unsigned char h_dest[ETH_ALEN]; + __be16 vlan_etype; + __be16 vlan_tci; + __be32 data[2]; +}; + +/** + * struct ethtool_rx_flow_spec - classification rule for RX flows + * @flow_type: Type of match to perform, e.g. %TCP_V4_FLOW + * @h_u: Flow fields to match (dependent on @flow_type) + * @h_ext: Additional fields to match + * @m_u: Masks for flow field bits to be matched + * @m_ext: Masks for additional field bits to be matched + * Note, all additional fields must be ignored unless @flow_type + * includes the %FLOW_EXT or %FLOW_MAC_EXT flag + * (see &struct ethtool_flow_ext description). + * @ring_cookie: RX ring/queue index to deliver to, or %RX_CLS_FLOW_DISC + * if packets should be discarded, or %RX_CLS_FLOW_WAKE if the + * packets should be used for Wake-on-LAN with %WAKE_FILTER + * @location: Location of rule in the table. Locations must be + * numbered such that a flow matching multiple rules will be + * classified according to the first (lowest numbered) rule. + */ +struct ethtool_rx_flow_spec { + __u32 flow_type; + union ethtool_flow_union h_u; + struct ethtool_flow_ext h_ext; + union ethtool_flow_union m_u; + struct ethtool_flow_ext m_ext; + __u64 ring_cookie; + __u32 location; +}; + +/* How rings are laid out when accessing virtual functions or + * offloaded queues is device specific. To allow users to do flow + * steering and specify these queues the ring cookie is partitioned + * into a 32bit queue index with an 8 bit virtual function id. + * This also leaves the 3bytes for further specifiers. It is possible + * future devices may support more than 256 virtual functions if + * devices start supporting PCIe w/ARI. However at the moment I + * do not know of any devices that support this so I do not reserve + * space for this at this time. If a future patch consumes the next + * byte it should be aware of this possibility. + */ +#define ETHTOOL_RX_FLOW_SPEC_RING 0x00000000FFFFFFFFLL +#define ETHTOOL_RX_FLOW_SPEC_RING_VF 0x000000FF00000000LL +#define ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF 32 +static inline __u64 ethtool_get_flow_spec_ring(__u64 ring_cookie) +{ + return ETHTOOL_RX_FLOW_SPEC_RING & ring_cookie; +} + +static inline __u64 ethtool_get_flow_spec_ring_vf(__u64 ring_cookie) +{ + return (ETHTOOL_RX_FLOW_SPEC_RING_VF & ring_cookie) >> + ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF; +} + +/** + * struct ethtool_rxnfc - command to get or set RX flow classification rules + * @cmd: Specific command number - %ETHTOOL_GRXFH, %ETHTOOL_SRXFH, + * %ETHTOOL_GRXRINGS, %ETHTOOL_GRXCLSRLCNT, %ETHTOOL_GRXCLSRULE, + * %ETHTOOL_GRXCLSRLALL, %ETHTOOL_SRXCLSRLDEL or %ETHTOOL_SRXCLSRLINS + * @flow_type: Type of flow to be affected, e.g. %TCP_V4_FLOW + * @data: Command-dependent value + * @fs: Flow classification rule + * @rss_context: RSS context to be affected + * @rule_cnt: Number of rules to be affected + * @rule_locs: Array of used rule locations + * + * For %ETHTOOL_GRXFH and %ETHTOOL_SRXFH, @data is a bitmask indicating + * the fields included in the flow hash, e.g. %RXH_IP_SRC. The following + * structure fields must not be used, except that if @flow_type includes + * the %FLOW_RSS flag, then @rss_context determines which RSS context to + * act on. + * + * For %ETHTOOL_GRXRINGS, @data is set to the number of RX rings/queues + * on return. + * + * For %ETHTOOL_GRXCLSRLCNT, @rule_cnt is set to the number of defined + * rules on return. If @data is non-zero on return then it is the + * size of the rule table, plus the flag %RX_CLS_LOC_SPECIAL if the + * driver supports any special location values. If that flag is not + * set in @data then special location values should not be used. + * + * For %ETHTOOL_GRXCLSRULE, @fs.@location specifies the location of an + * existing rule on entry and @fs contains the rule on return; if + * @fs.@flow_type includes the %FLOW_RSS flag, then @rss_context is + * filled with the RSS context ID associated with the rule. + * + * For %ETHTOOL_GRXCLSRLALL, @rule_cnt specifies the array size of the + * user buffer for @rule_locs on entry. On return, @data is the size + * of the rule table, @rule_cnt is the number of defined rules, and + * @rule_locs contains the locations of the defined rules. Drivers + * must use the second parameter to get_rxnfc() instead of @rule_locs. + * + * For %ETHTOOL_SRXCLSRLINS, @fs specifies the rule to add or update. + * @fs.@location either specifies the location to use or is a special + * location value with %RX_CLS_LOC_SPECIAL flag set. On return, + * @fs.@location is the actual rule location. If @fs.@flow_type + * includes the %FLOW_RSS flag, @rss_context is the RSS context ID to + * use for flow spreading traffic which matches this rule. The value + * from the rxfh indirection table will be added to @fs.@ring_cookie + * to choose which ring to deliver to. + * + * For %ETHTOOL_SRXCLSRLDEL, @fs.@location specifies the location of an + * existing rule on entry. + * + * A driver supporting the special location values for + * %ETHTOOL_SRXCLSRLINS may add the rule at any suitable unused + * location, and may remove a rule at a later location (lower + * priority) that matches exactly the same set of flows. The special + * values are %RX_CLS_LOC_ANY, selecting any location; + * %RX_CLS_LOC_FIRST, selecting the first suitable location (maximum + * priority); and %RX_CLS_LOC_LAST, selecting the last suitable + * location (minimum priority). Additional special values may be + * defined in future and drivers must return -%EINVAL for any + * unrecognised value. + */ +struct ethtool_rxnfc { + __u32 cmd; + __u32 flow_type; + __u64 data; + struct ethtool_rx_flow_spec fs; + union { + __u32 rule_cnt; + __u32 rss_context; + }; + __u32 rule_locs[0]; +}; + + +/** + * struct ethtool_rxfh_indir - command to get or set RX flow hash indirection + * @cmd: Specific command number - %ETHTOOL_GRXFHINDIR or %ETHTOOL_SRXFHINDIR + * @size: On entry, the array size of the user buffer, which may be zero. + * On return from %ETHTOOL_GRXFHINDIR, the array size of the hardware + * indirection table. + * @ring_index: RX ring/queue index for each hash value + * + * For %ETHTOOL_GRXFHINDIR, a @size of zero means that only the size + * should be returned. For %ETHTOOL_SRXFHINDIR, a @size of zero means + * the table should be reset to default values. This last feature + * is not supported by the original implementations. + */ +struct ethtool_rxfh_indir { + __u32 cmd; + __u32 size; + __u32 ring_index[0]; +}; + +/** + * struct ethtool_rxfh - command to get/set RX flow hash indir or/and hash key. + * @cmd: Specific command number - %ETHTOOL_GRSSH or %ETHTOOL_SRSSH + * @rss_context: RSS context identifier. Context 0 is the default for normal + * traffic; other contexts can be referenced as the destination for RX flow + * classification rules. %ETH_RXFH_CONTEXT_ALLOC is used with command + * %ETHTOOL_SRSSH to allocate a new RSS context; on return this field will + * contain the ID of the newly allocated context. + * @indir_size: On entry, the array size of the user buffer for the + * indirection table, which may be zero, or (for %ETHTOOL_SRSSH), + * %ETH_RXFH_INDIR_NO_CHANGE. On return from %ETHTOOL_GRSSH, + * the array size of the hardware indirection table. + * @key_size: On entry, the array size of the user buffer for the hash key, + * which may be zero. On return from %ETHTOOL_GRSSH, the size of the + * hardware hash key. + * @hfunc: Defines the current RSS hash function used by HW (or to be set to). + * Valid values are one of the %ETH_RSS_HASH_*. + * @rsvd: Reserved for future extensions. + * @rss_config: RX ring/queue index for each hash value i.e., indirection table + * of @indir_size __u32 elements, followed by hash key of @key_size + * bytes. + * + * For %ETHTOOL_GRSSH, a @indir_size and key_size of zero means that only the + * size should be returned. For %ETHTOOL_SRSSH, an @indir_size of + * %ETH_RXFH_INDIR_NO_CHANGE means that indir table setting is not requested + * and a @indir_size of zero means the indir table should be reset to default + * values (if @rss_context == 0) or that the RSS context should be deleted. + * An hfunc of zero means that hash function setting is not requested. + */ +struct ethtool_rxfh { + __u32 cmd; + __u32 rss_context; + __u32 indir_size; + __u32 key_size; + __u8 hfunc; + __u8 rsvd8[3]; + __u32 rsvd32; + __u32 rss_config[0]; +}; +#define ETH_RXFH_CONTEXT_ALLOC 0xffffffff +#define ETH_RXFH_INDIR_NO_CHANGE 0xffffffff + +/** + * struct ethtool_rx_ntuple_flow_spec - specification for RX flow filter + * @flow_type: Type of match to perform, e.g. %TCP_V4_FLOW + * @h_u: Flow field values to match (dependent on @flow_type) + * @m_u: Masks for flow field value bits to be ignored + * @vlan_tag: VLAN tag to match + * @vlan_tag_mask: Mask for VLAN tag bits to be ignored + * @data: Driver-dependent data to match + * @data_mask: Mask for driver-dependent data bits to be ignored + * @action: RX ring/queue index to deliver to (non-negative) or other action + * (negative, e.g. %ETHTOOL_RXNTUPLE_ACTION_DROP) + * + * For flow types %TCP_V4_FLOW, %UDP_V4_FLOW and %SCTP_V4_FLOW, where + * a field value and mask are both zero this is treated as if all mask + * bits are set i.e. the field is ignored. + */ +struct ethtool_rx_ntuple_flow_spec { + __u32 flow_type; + union { + struct ethtool_tcpip4_spec tcp_ip4_spec; + struct ethtool_tcpip4_spec udp_ip4_spec; + struct ethtool_tcpip4_spec sctp_ip4_spec; + struct ethtool_ah_espip4_spec ah_ip4_spec; + struct ethtool_ah_espip4_spec esp_ip4_spec; + struct ethtool_usrip4_spec usr_ip4_spec; + struct ethhdr ether_spec; + __u8 hdata[72]; + } h_u, m_u; + + __u16 vlan_tag; + __u16 vlan_tag_mask; + __u64 data; + __u64 data_mask; + + __s32 action; +#define ETHTOOL_RXNTUPLE_ACTION_DROP (-1) /* drop packet */ +#define ETHTOOL_RXNTUPLE_ACTION_CLEAR (-2) /* clear filter */ +}; + +/** + * struct ethtool_rx_ntuple - command to set or clear RX flow filter + * @cmd: Command number - %ETHTOOL_SRXNTUPLE + * @fs: Flow filter specification + */ +struct ethtool_rx_ntuple { + __u32 cmd; + struct ethtool_rx_ntuple_flow_spec fs; +}; + +#define ETHTOOL_FLASH_MAX_FILENAME 128 +enum ethtool_flash_op_type { + ETHTOOL_FLASH_ALL_REGIONS = 0, +}; + +/* for passing firmware flashing related parameters */ +struct ethtool_flash { + __u32 cmd; + __u32 region; + char data[ETHTOOL_FLASH_MAX_FILENAME]; +}; + +/** + * struct ethtool_dump - used for retrieving, setting device dump + * @cmd: Command number - %ETHTOOL_GET_DUMP_FLAG, %ETHTOOL_GET_DUMP_DATA, or + * %ETHTOOL_SET_DUMP + * @version: FW version of the dump, filled in by driver + * @flag: driver dependent flag for dump setting, filled in by driver during + * get and filled in by ethtool for set operation. + * flag must be initialized by macro ETH_FW_DUMP_DISABLE value when + * firmware dump is disabled. + * @len: length of dump data, used as the length of the user buffer on entry to + * %ETHTOOL_GET_DUMP_DATA and this is returned as dump length by driver + * for %ETHTOOL_GET_DUMP_FLAG command + * @data: data collected for get dump data operation + */ +struct ethtool_dump { + __u32 cmd; + __u32 version; + __u32 flag; + __u32 len; + __u8 data[0]; +}; + +#define ETH_FW_DUMP_DISABLE 0 + +/* for returning and changing feature sets */ + +/** + * struct ethtool_get_features_block - block with state of 32 features + * @available: mask of changeable features + * @requested: mask of features requested to be enabled if possible + * @active: mask of currently enabled features + * @never_changed: mask of features not changeable for any device + */ +struct ethtool_get_features_block { + __u32 available; + __u32 requested; + __u32 active; + __u32 never_changed; +}; + +/** + * struct ethtool_gfeatures - command to get state of device's features + * @cmd: command number = %ETHTOOL_GFEATURES + * @size: On entry, the number of elements in the features[] array; + * on return, the number of elements in features[] needed to hold + * all features + * @features: state of features + */ +struct ethtool_gfeatures { + __u32 cmd; + __u32 size; + struct ethtool_get_features_block features[0]; +}; + +/** + * struct ethtool_set_features_block - block with request for 32 features + * @valid: mask of features to be changed + * @requested: values of features to be changed + */ +struct ethtool_set_features_block { + __u32 valid; + __u32 requested; +}; + +/** + * struct ethtool_sfeatures - command to request change in device's features + * @cmd: command number = %ETHTOOL_SFEATURES + * @size: array size of the features[] array + * @features: feature change masks + */ +struct ethtool_sfeatures { + __u32 cmd; + __u32 size; + struct ethtool_set_features_block features[0]; +}; + +/** + * struct ethtool_ts_info - holds a device's timestamping and PHC association + * @cmd: command number = %ETHTOOL_GET_TS_INFO + * @so_timestamping: bit mask of the sum of the supported SO_TIMESTAMPING flags + * @phc_index: device index of the associated PHC, or -1 if there is none + * @tx_types: bit mask of the supported hwtstamp_tx_types enumeration values + * @rx_filters: bit mask of the supported hwtstamp_rx_filters enumeration values + * + * The bits in the 'tx_types' and 'rx_filters' fields correspond to + * the 'hwtstamp_tx_types' and 'hwtstamp_rx_filters' enumeration values, + * respectively. For example, if the device supports HWTSTAMP_TX_ON, + * then (1 << HWTSTAMP_TX_ON) in 'tx_types' will be set. + * + * Drivers should only report the filters they actually support without + * upscaling in the SIOCSHWTSTAMP ioctl. If the SIOCSHWSTAMP request for + * HWTSTAMP_FILTER_V1_SYNC is supported by HWTSTAMP_FILTER_V1_EVENT, then the + * driver should only report HWTSTAMP_FILTER_V1_EVENT in this op. + */ +struct ethtool_ts_info { + __u32 cmd; + __u32 so_timestamping; + __s32 phc_index; + __u32 tx_types; + __u32 tx_reserved[3]; + __u32 rx_filters; + __u32 rx_reserved[3]; +}; + +/* + * %ETHTOOL_SFEATURES changes features present in features[].valid to the + * values of corresponding bits in features[].requested. Bits in .requested + * not set in .valid or not changeable are ignored. + * + * Returns %EINVAL when .valid contains undefined or never-changeable bits + * or size is not equal to required number of features words (32-bit blocks). + * Returns >= 0 if request was completed; bits set in the value mean: + * %ETHTOOL_F_UNSUPPORTED - there were bits set in .valid that are not + * changeable (not present in %ETHTOOL_GFEATURES' features[].available) + * those bits were ignored. + * %ETHTOOL_F_WISH - some or all changes requested were recorded but the + * resulting state of bits masked by .valid is not equal to .requested. + * Probably there are other device-specific constraints on some features + * in the set. When %ETHTOOL_F_UNSUPPORTED is set, .valid is considered + * here as though ignored bits were cleared. + * %ETHTOOL_F_COMPAT - some or all changes requested were made by calling + * compatibility functions. Requested offload state cannot be properly + * managed by kernel. + * + * Meaning of bits in the masks are obtained by %ETHTOOL_GSSET_INFO (number of + * bits in the arrays - always multiple of 32) and %ETHTOOL_GSTRINGS commands + * for ETH_SS_FEATURES string set. First entry in the table corresponds to least + * significant bit in features[0] fields. Empty strings mark undefined features. + */ +enum ethtool_sfeatures_retval_bits { + ETHTOOL_F_UNSUPPORTED__BIT, + ETHTOOL_F_WISH__BIT, + ETHTOOL_F_COMPAT__BIT, +}; + +#define ETHTOOL_F_UNSUPPORTED (1 << ETHTOOL_F_UNSUPPORTED__BIT) +#define ETHTOOL_F_WISH (1 << ETHTOOL_F_WISH__BIT) +#define ETHTOOL_F_COMPAT (1 << ETHTOOL_F_COMPAT__BIT) + +#define MAX_NUM_QUEUE 4096 + +/** + * struct ethtool_per_queue_op - apply sub command to the queues in mask. + * @cmd: ETHTOOL_PERQUEUE + * @sub_command: the sub command which apply to each queues + * @queue_mask: Bitmap of the queues which sub command apply to + * @data: A complete command structure following for each of the queues addressed + */ +struct ethtool_per_queue_op { + __u32 cmd; + __u32 sub_command; + __u32 queue_mask[__KERNEL_DIV_ROUND_UP(MAX_NUM_QUEUE, 32)]; + char data[]; +}; + +/** + * struct ethtool_fecparam - Ethernet forward error correction(fec) parameters + * @cmd: Command number = %ETHTOOL_GFECPARAM or %ETHTOOL_SFECPARAM + * @active_fec: FEC mode which is active on porte + * @fec: Bitmask of supported/configured FEC modes + * @rsvd: Reserved for future extensions. i.e FEC bypass feature. + * + * Drivers should reject a non-zero setting of @autoneg when + * autoneogotiation is disabled (or not supported) for the link. + * + */ +struct ethtool_fecparam { + __u32 cmd; + /* bitmask of FEC modes */ + __u32 active_fec; + __u32 fec; + __u32 reserved; +}; + +/** + * enum ethtool_fec_config_bits - flags definition of ethtool_fec_configuration + * @ETHTOOL_FEC_NONE: FEC mode configuration is not supported + * @ETHTOOL_FEC_AUTO: Default/Best FEC mode provided by driver + * @ETHTOOL_FEC_OFF: No FEC Mode + * @ETHTOOL_FEC_RS: Reed-Solomon Forward Error Detection mode + * @ETHTOOL_FEC_BASER: Base-R/Reed-Solomon Forward Error Detection mode + */ +enum ethtool_fec_config_bits { + ETHTOOL_FEC_NONE_BIT, + ETHTOOL_FEC_AUTO_BIT, + ETHTOOL_FEC_OFF_BIT, + ETHTOOL_FEC_RS_BIT, + ETHTOOL_FEC_BASER_BIT, +}; + +#define ETHTOOL_FEC_NONE (1 << ETHTOOL_FEC_NONE_BIT) +#define ETHTOOL_FEC_AUTO (1 << ETHTOOL_FEC_AUTO_BIT) +#define ETHTOOL_FEC_OFF (1 << ETHTOOL_FEC_OFF_BIT) +#define ETHTOOL_FEC_RS (1 << ETHTOOL_FEC_RS_BIT) +#define ETHTOOL_FEC_BASER (1 << ETHTOOL_FEC_BASER_BIT) + +/* CMDs currently supported */ +#define ETHTOOL_GSET 0x00000001 /* DEPRECATED, Get settings. + * Please use ETHTOOL_GLINKSETTINGS + */ +#define ETHTOOL_SSET 0x00000002 /* DEPRECATED, Set settings. + * Please use ETHTOOL_SLINKSETTINGS + */ +#define ETHTOOL_GDRVINFO 0x00000003 /* Get driver info. */ +#define ETHTOOL_GREGS 0x00000004 /* Get NIC registers. */ +#define ETHTOOL_GWOL 0x00000005 /* Get wake-on-lan options. */ +#define ETHTOOL_SWOL 0x00000006 /* Set wake-on-lan options. */ +#define ETHTOOL_GMSGLVL 0x00000007 /* Get driver message level */ +#define ETHTOOL_SMSGLVL 0x00000008 /* Set driver msg level. */ +#define ETHTOOL_NWAY_RST 0x00000009 /* Restart autonegotiation. */ +/* Get link status for host, i.e. whether the interface *and* the + * physical port (if there is one) are up (ethtool_value). */ +#define ETHTOOL_GLINK 0x0000000a +#define ETHTOOL_GEEPROM 0x0000000b /* Get EEPROM data */ +#define ETHTOOL_SEEPROM 0x0000000c /* Set EEPROM data. */ +#define ETHTOOL_GCOALESCE 0x0000000e /* Get coalesce config */ +#define ETHTOOL_SCOALESCE 0x0000000f /* Set coalesce config. */ +#define ETHTOOL_GRINGPARAM 0x00000010 /* Get ring parameters */ +#define ETHTOOL_SRINGPARAM 0x00000011 /* Set ring parameters. */ +#define ETHTOOL_GPAUSEPARAM 0x00000012 /* Get pause parameters */ +#define ETHTOOL_SPAUSEPARAM 0x00000013 /* Set pause parameters. */ +#define ETHTOOL_GRXCSUM 0x00000014 /* Get RX hw csum enable (ethtool_value) */ +#define ETHTOOL_SRXCSUM 0x00000015 /* Set RX hw csum enable (ethtool_value) */ +#define ETHTOOL_GTXCSUM 0x00000016 /* Get TX hw csum enable (ethtool_value) */ +#define ETHTOOL_STXCSUM 0x00000017 /* Set TX hw csum enable (ethtool_value) */ +#define ETHTOOL_GSG 0x00000018 /* Get scatter-gather enable + * (ethtool_value) */ +#define ETHTOOL_SSG 0x00000019 /* Set scatter-gather enable + * (ethtool_value). */ +#define ETHTOOL_TEST 0x0000001a /* execute NIC self-test. */ +#define ETHTOOL_GSTRINGS 0x0000001b /* get specified string set */ +#define ETHTOOL_PHYS_ID 0x0000001c /* identify the NIC */ +#define ETHTOOL_GSTATS 0x0000001d /* get NIC-specific statistics */ +#define ETHTOOL_GTSO 0x0000001e /* Get TSO enable (ethtool_value) */ +#define ETHTOOL_STSO 0x0000001f /* Set TSO enable (ethtool_value) */ +#define ETHTOOL_GPERMADDR 0x00000020 /* Get permanent hardware address */ +#define ETHTOOL_GUFO 0x00000021 /* Get UFO enable (ethtool_value) */ +#define ETHTOOL_SUFO 0x00000022 /* Set UFO enable (ethtool_value) */ +#define ETHTOOL_GGSO 0x00000023 /* Get GSO enable (ethtool_value) */ +#define ETHTOOL_SGSO 0x00000024 /* Set GSO enable (ethtool_value) */ +#define ETHTOOL_GFLAGS 0x00000025 /* Get flags bitmap(ethtool_value) */ +#define ETHTOOL_SFLAGS 0x00000026 /* Set flags bitmap(ethtool_value) */ +#define ETHTOOL_GPFLAGS 0x00000027 /* Get driver-private flags bitmap */ +#define ETHTOOL_SPFLAGS 0x00000028 /* Set driver-private flags bitmap */ + +#define ETHTOOL_GRXFH 0x00000029 /* Get RX flow hash configuration */ +#define ETHTOOL_SRXFH 0x0000002a /* Set RX flow hash configuration */ +#define ETHTOOL_GGRO 0x0000002b /* Get GRO enable (ethtool_value) */ +#define ETHTOOL_SGRO 0x0000002c /* Set GRO enable (ethtool_value) */ +#define ETHTOOL_GRXRINGS 0x0000002d /* Get RX rings available for LB */ +#define ETHTOOL_GRXCLSRLCNT 0x0000002e /* Get RX class rule count */ +#define ETHTOOL_GRXCLSRULE 0x0000002f /* Get RX classification rule */ +#define ETHTOOL_GRXCLSRLALL 0x00000030 /* Get all RX classification rule */ +#define ETHTOOL_SRXCLSRLDEL 0x00000031 /* Delete RX classification rule */ +#define ETHTOOL_SRXCLSRLINS 0x00000032 /* Insert RX classification rule */ +#define ETHTOOL_FLASHDEV 0x00000033 /* Flash firmware to device */ +#define ETHTOOL_RESET 0x00000034 /* Reset hardware */ +#define ETHTOOL_SRXNTUPLE 0x00000035 /* Add an n-tuple filter to device */ +#define ETHTOOL_GRXNTUPLE 0x00000036 /* deprecated */ +#define ETHTOOL_GSSET_INFO 0x00000037 /* Get string set info */ +#define ETHTOOL_GRXFHINDIR 0x00000038 /* Get RX flow hash indir'n table */ +#define ETHTOOL_SRXFHINDIR 0x00000039 /* Set RX flow hash indir'n table */ + +#define ETHTOOL_GFEATURES 0x0000003a /* Get device offload settings */ +#define ETHTOOL_SFEATURES 0x0000003b /* Change device offload settings */ +#define ETHTOOL_GCHANNELS 0x0000003c /* Get no of channels */ +#define ETHTOOL_SCHANNELS 0x0000003d /* Set no of channels */ +#define ETHTOOL_SET_DUMP 0x0000003e /* Set dump settings */ +#define ETHTOOL_GET_DUMP_FLAG 0x0000003f /* Get dump settings */ +#define ETHTOOL_GET_DUMP_DATA 0x00000040 /* Get dump data */ +#define ETHTOOL_GET_TS_INFO 0x00000041 /* Get time stamping and PHC info */ +#define ETHTOOL_GMODULEINFO 0x00000042 /* Get plug-in module information */ +#define ETHTOOL_GMODULEEEPROM 0x00000043 /* Get plug-in module eeprom */ +#define ETHTOOL_GEEE 0x00000044 /* Get EEE settings */ +#define ETHTOOL_SEEE 0x00000045 /* Set EEE settings */ + +#define ETHTOOL_GRSSH 0x00000046 /* Get RX flow hash configuration */ +#define ETHTOOL_SRSSH 0x00000047 /* Set RX flow hash configuration */ +#define ETHTOOL_GTUNABLE 0x00000048 /* Get tunable configuration */ +#define ETHTOOL_STUNABLE 0x00000049 /* Set tunable configuration */ +#define ETHTOOL_GPHYSTATS 0x0000004a /* get PHY-specific statistics */ + +#define ETHTOOL_PERQUEUE 0x0000004b /* Set per queue options */ + +#define ETHTOOL_GLINKSETTINGS 0x0000004c /* Get ethtool_link_settings */ +#define ETHTOOL_SLINKSETTINGS 0x0000004d /* Set ethtool_link_settings */ +#define ETHTOOL_PHY_GTUNABLE 0x0000004e /* Get PHY tunable configuration */ +#define ETHTOOL_PHY_STUNABLE 0x0000004f /* Set PHY tunable configuration */ +#define ETHTOOL_GFECPARAM 0x00000050 /* Get FEC settings */ +#define ETHTOOL_SFECPARAM 0x00000051 /* Set FEC settings */ + +/* compatibility with older code */ +#define SPARC_ETH_GSET ETHTOOL_GSET +#define SPARC_ETH_SSET ETHTOOL_SSET + +/* Link mode bit indices */ +enum ethtool_link_mode_bit_indices { + ETHTOOL_LINK_MODE_10baseT_Half_BIT = 0, + ETHTOOL_LINK_MODE_10baseT_Full_BIT = 1, + ETHTOOL_LINK_MODE_100baseT_Half_BIT = 2, + ETHTOOL_LINK_MODE_100baseT_Full_BIT = 3, + ETHTOOL_LINK_MODE_1000baseT_Half_BIT = 4, + ETHTOOL_LINK_MODE_1000baseT_Full_BIT = 5, + ETHTOOL_LINK_MODE_Autoneg_BIT = 6, + ETHTOOL_LINK_MODE_TP_BIT = 7, + ETHTOOL_LINK_MODE_AUI_BIT = 8, + ETHTOOL_LINK_MODE_MII_BIT = 9, + ETHTOOL_LINK_MODE_FIBRE_BIT = 10, + ETHTOOL_LINK_MODE_BNC_BIT = 11, + ETHTOOL_LINK_MODE_10000baseT_Full_BIT = 12, + ETHTOOL_LINK_MODE_Pause_BIT = 13, + ETHTOOL_LINK_MODE_Asym_Pause_BIT = 14, + ETHTOOL_LINK_MODE_2500baseX_Full_BIT = 15, + ETHTOOL_LINK_MODE_Backplane_BIT = 16, + ETHTOOL_LINK_MODE_1000baseKX_Full_BIT = 17, + ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT = 18, + ETHTOOL_LINK_MODE_10000baseKR_Full_BIT = 19, + ETHTOOL_LINK_MODE_10000baseR_FEC_BIT = 20, + ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT = 21, + ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT = 22, + ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT = 23, + ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT = 24, + ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT = 25, + ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT = 26, + ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT = 27, + ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT = 28, + ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT = 29, + ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT = 30, + ETHTOOL_LINK_MODE_25000baseCR_Full_BIT = 31, + ETHTOOL_LINK_MODE_25000baseKR_Full_BIT = 32, + ETHTOOL_LINK_MODE_25000baseSR_Full_BIT = 33, + ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT = 34, + ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT = 35, + ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT = 36, + ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT = 37, + ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT = 38, + ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT = 39, + ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT = 40, + ETHTOOL_LINK_MODE_1000baseX_Full_BIT = 41, + ETHTOOL_LINK_MODE_10000baseCR_Full_BIT = 42, + ETHTOOL_LINK_MODE_10000baseSR_Full_BIT = 43, + ETHTOOL_LINK_MODE_10000baseLR_Full_BIT = 44, + ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT = 45, + ETHTOOL_LINK_MODE_10000baseER_Full_BIT = 46, + ETHTOOL_LINK_MODE_2500baseT_Full_BIT = 47, + ETHTOOL_LINK_MODE_5000baseT_Full_BIT = 48, + + ETHTOOL_LINK_MODE_FEC_NONE_BIT = 49, + ETHTOOL_LINK_MODE_FEC_RS_BIT = 50, + ETHTOOL_LINK_MODE_FEC_BASER_BIT = 51, + + /* Last allowed bit for __ETHTOOL_LINK_MODE_LEGACY_MASK is bit + * 31. Please do NOT define any SUPPORTED_* or ADVERTISED_* + * macro for bits > 31. The only way to use indices > 31 is to + * use the new ETHTOOL_GLINKSETTINGS/ETHTOOL_SLINKSETTINGS API. + */ + + __ETHTOOL_LINK_MODE_LAST + = ETHTOOL_LINK_MODE_FEC_BASER_BIT, +}; + +#define __ETHTOOL_LINK_MODE_LEGACY_MASK(base_name) \ + (1UL << (ETHTOOL_LINK_MODE_ ## base_name ## _BIT)) + +/* DEPRECATED macros. Please migrate to + * ETHTOOL_GLINKSETTINGS/ETHTOOL_SLINKSETTINGS API. Please do NOT + * define any new SUPPORTED_* macro for bits > 31. + */ +#define SUPPORTED_10baseT_Half __ETHTOOL_LINK_MODE_LEGACY_MASK(10baseT_Half) +#define SUPPORTED_10baseT_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(10baseT_Full) +#define SUPPORTED_100baseT_Half __ETHTOOL_LINK_MODE_LEGACY_MASK(100baseT_Half) +#define SUPPORTED_100baseT_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(100baseT_Full) +#define SUPPORTED_1000baseT_Half __ETHTOOL_LINK_MODE_LEGACY_MASK(1000baseT_Half) +#define SUPPORTED_1000baseT_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(1000baseT_Full) +#define SUPPORTED_Autoneg __ETHTOOL_LINK_MODE_LEGACY_MASK(Autoneg) +#define SUPPORTED_TP __ETHTOOL_LINK_MODE_LEGACY_MASK(TP) +#define SUPPORTED_AUI __ETHTOOL_LINK_MODE_LEGACY_MASK(AUI) +#define SUPPORTED_MII __ETHTOOL_LINK_MODE_LEGACY_MASK(MII) +#define SUPPORTED_FIBRE __ETHTOOL_LINK_MODE_LEGACY_MASK(FIBRE) +#define SUPPORTED_BNC __ETHTOOL_LINK_MODE_LEGACY_MASK(BNC) +#define SUPPORTED_10000baseT_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(10000baseT_Full) +#define SUPPORTED_Pause __ETHTOOL_LINK_MODE_LEGACY_MASK(Pause) +#define SUPPORTED_Asym_Pause __ETHTOOL_LINK_MODE_LEGACY_MASK(Asym_Pause) +#define SUPPORTED_2500baseX_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(2500baseX_Full) +#define SUPPORTED_Backplane __ETHTOOL_LINK_MODE_LEGACY_MASK(Backplane) +#define SUPPORTED_1000baseKX_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(1000baseKX_Full) +#define SUPPORTED_10000baseKX4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(10000baseKX4_Full) +#define SUPPORTED_10000baseKR_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(10000baseKR_Full) +#define SUPPORTED_10000baseR_FEC __ETHTOOL_LINK_MODE_LEGACY_MASK(10000baseR_FEC) +#define SUPPORTED_20000baseMLD2_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(20000baseMLD2_Full) +#define SUPPORTED_20000baseKR2_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(20000baseKR2_Full) +#define SUPPORTED_40000baseKR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(40000baseKR4_Full) +#define SUPPORTED_40000baseCR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(40000baseCR4_Full) +#define SUPPORTED_40000baseSR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(40000baseSR4_Full) +#define SUPPORTED_40000baseLR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(40000baseLR4_Full) +#define SUPPORTED_56000baseKR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(56000baseKR4_Full) +#define SUPPORTED_56000baseCR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(56000baseCR4_Full) +#define SUPPORTED_56000baseSR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(56000baseSR4_Full) +#define SUPPORTED_56000baseLR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(56000baseLR4_Full) +/* Please do not define any new SUPPORTED_* macro for bits > 31, see + * notice above. + */ + +/* + * DEPRECATED macros. Please migrate to + * ETHTOOL_GLINKSETTINGS/ETHTOOL_SLINKSETTINGS API. Please do NOT + * define any new ADERTISE_* macro for bits > 31. + */ +#define ADVERTISED_10baseT_Half __ETHTOOL_LINK_MODE_LEGACY_MASK(10baseT_Half) +#define ADVERTISED_10baseT_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(10baseT_Full) +#define ADVERTISED_100baseT_Half __ETHTOOL_LINK_MODE_LEGACY_MASK(100baseT_Half) +#define ADVERTISED_100baseT_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(100baseT_Full) +#define ADVERTISED_1000baseT_Half __ETHTOOL_LINK_MODE_LEGACY_MASK(1000baseT_Half) +#define ADVERTISED_1000baseT_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(1000baseT_Full) +#define ADVERTISED_Autoneg __ETHTOOL_LINK_MODE_LEGACY_MASK(Autoneg) +#define ADVERTISED_TP __ETHTOOL_LINK_MODE_LEGACY_MASK(TP) +#define ADVERTISED_AUI __ETHTOOL_LINK_MODE_LEGACY_MASK(AUI) +#define ADVERTISED_MII __ETHTOOL_LINK_MODE_LEGACY_MASK(MII) +#define ADVERTISED_FIBRE __ETHTOOL_LINK_MODE_LEGACY_MASK(FIBRE) +#define ADVERTISED_BNC __ETHTOOL_LINK_MODE_LEGACY_MASK(BNC) +#define ADVERTISED_10000baseT_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(10000baseT_Full) +#define ADVERTISED_Pause __ETHTOOL_LINK_MODE_LEGACY_MASK(Pause) +#define ADVERTISED_Asym_Pause __ETHTOOL_LINK_MODE_LEGACY_MASK(Asym_Pause) +#define ADVERTISED_2500baseX_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(2500baseX_Full) +#define ADVERTISED_Backplane __ETHTOOL_LINK_MODE_LEGACY_MASK(Backplane) +#define ADVERTISED_1000baseKX_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(1000baseKX_Full) +#define ADVERTISED_10000baseKX4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(10000baseKX4_Full) +#define ADVERTISED_10000baseKR_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(10000baseKR_Full) +#define ADVERTISED_10000baseR_FEC __ETHTOOL_LINK_MODE_LEGACY_MASK(10000baseR_FEC) +#define ADVERTISED_20000baseMLD2_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(20000baseMLD2_Full) +#define ADVERTISED_20000baseKR2_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(20000baseKR2_Full) +#define ADVERTISED_40000baseKR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(40000baseKR4_Full) +#define ADVERTISED_40000baseCR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(40000baseCR4_Full) +#define ADVERTISED_40000baseSR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(40000baseSR4_Full) +#define ADVERTISED_40000baseLR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(40000baseLR4_Full) +#define ADVERTISED_56000baseKR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(56000baseKR4_Full) +#define ADVERTISED_56000baseCR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(56000baseCR4_Full) +#define ADVERTISED_56000baseSR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(56000baseSR4_Full) +#define ADVERTISED_56000baseLR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(56000baseLR4_Full) +/* Please do not define any new ADVERTISED_* macro for bits > 31, see + * notice above. + */ + +/* The following are all involved in forcing a particular link + * mode for the device for setting things. When getting the + * devices settings, these indicate the current mode and whether + * it was forced up into this mode or autonegotiated. + */ + +/* The forced speed, in units of 1Mb. All values 0 to INT_MAX are legal. + * Update drivers/net/phy/phy.c:phy_speed_to_str() and + * drivers/net/bonding/bond_3ad.c:__get_link_speed() when adding new values. + */ +#define SPEED_10 10 +#define SPEED_100 100 +#define SPEED_1000 1000 +#define SPEED_2500 2500 +#define SPEED_5000 5000 +#define SPEED_10000 10000 +#define SPEED_14000 14000 +#define SPEED_20000 20000 +#define SPEED_25000 25000 +#define SPEED_40000 40000 +#define SPEED_50000 50000 +#define SPEED_56000 56000 +#define SPEED_100000 100000 + +#define SPEED_UNKNOWN ((__u32) -1) + +static inline int ethtool_validate_speed(__u32 speed) +{ + return speed <= INT_MAX || speed == SPEED_UNKNOWN; +} + +/* Duplex, half or full. */ +#define DUPLEX_HALF 0x00 +#define DUPLEX_FULL 0x01 +#define DUPLEX_UNKNOWN 0xff + +static inline int ethtool_validate_duplex(__u8 duplex) +{ + switch (duplex) { + case DUPLEX_HALF: + case DUPLEX_FULL: + case DUPLEX_UNKNOWN: + return 1; + } + + return 0; +} + +/* Which connector port. */ +#define PORT_TP 0x00 +#define PORT_AUI 0x01 +#define PORT_MII 0x02 +#define PORT_FIBRE 0x03 +#define PORT_BNC 0x04 +#define PORT_DA 0x05 +#define PORT_NONE 0xef +#define PORT_OTHER 0xff + +/* Which transceiver to use. */ +#define XCVR_INTERNAL 0x00 /* PHY and MAC are in the same package */ +#define XCVR_EXTERNAL 0x01 /* PHY and MAC are in different packages */ +#define XCVR_DUMMY1 0x02 +#define XCVR_DUMMY2 0x03 +#define XCVR_DUMMY3 0x04 + +/* Enable or disable autonegotiation. */ +#define AUTONEG_DISABLE 0x00 +#define AUTONEG_ENABLE 0x01 + +/* MDI or MDI-X status/control - if MDI/MDI_X/AUTO is set then + * the driver is required to renegotiate link + */ +#define ETH_TP_MDI_INVALID 0x00 /* status: unknown; control: unsupported */ +#define ETH_TP_MDI 0x01 /* status: MDI; control: force MDI */ +#define ETH_TP_MDI_X 0x02 /* status: MDI-X; control: force MDI-X */ +#define ETH_TP_MDI_AUTO 0x03 /* control: auto-select */ + +/* Wake-On-Lan options. */ +#define WAKE_PHY (1 << 0) +#define WAKE_UCAST (1 << 1) +#define WAKE_MCAST (1 << 2) +#define WAKE_BCAST (1 << 3) +#define WAKE_ARP (1 << 4) +#define WAKE_MAGIC (1 << 5) +#define WAKE_MAGICSECURE (1 << 6) /* only meaningful if WAKE_MAGIC */ +#define WAKE_FILTER (1 << 7) + +/* L2-L4 network traffic flow types */ +#define TCP_V4_FLOW 0x01 /* hash or spec (tcp_ip4_spec) */ +#define UDP_V4_FLOW 0x02 /* hash or spec (udp_ip4_spec) */ +#define SCTP_V4_FLOW 0x03 /* hash or spec (sctp_ip4_spec) */ +#define AH_ESP_V4_FLOW 0x04 /* hash only */ +#define TCP_V6_FLOW 0x05 /* hash or spec (tcp_ip6_spec; nfc only) */ +#define UDP_V6_FLOW 0x06 /* hash or spec (udp_ip6_spec; nfc only) */ +#define SCTP_V6_FLOW 0x07 /* hash or spec (sctp_ip6_spec; nfc only) */ +#define AH_ESP_V6_FLOW 0x08 /* hash only */ +#define AH_V4_FLOW 0x09 /* hash or spec (ah_ip4_spec) */ +#define ESP_V4_FLOW 0x0a /* hash or spec (esp_ip4_spec) */ +#define AH_V6_FLOW 0x0b /* hash or spec (ah_ip6_spec; nfc only) */ +#define ESP_V6_FLOW 0x0c /* hash or spec (esp_ip6_spec; nfc only) */ +#define IPV4_USER_FLOW 0x0d /* spec only (usr_ip4_spec) */ +#define IP_USER_FLOW IPV4_USER_FLOW +#define IPV6_USER_FLOW 0x0e /* spec only (usr_ip6_spec; nfc only) */ +#define IPV4_FLOW 0x10 /* hash only */ +#define IPV6_FLOW 0x11 /* hash only */ +#define ETHER_FLOW 0x12 /* spec only (ether_spec) */ +/* Flag to enable additional fields in struct ethtool_rx_flow_spec */ +#define FLOW_EXT 0x80000000 +#define FLOW_MAC_EXT 0x40000000 +/* Flag to enable RSS spreading of traffic matching rule (nfc only) */ +#define FLOW_RSS 0x20000000 + +/* L3-L4 network traffic flow hash options */ +#define RXH_L2DA (1 << 1) +#define RXH_VLAN (1 << 2) +#define RXH_L3_PROTO (1 << 3) +#define RXH_IP_SRC (1 << 4) +#define RXH_IP_DST (1 << 5) +#define RXH_L4_B_0_1 (1 << 6) /* src port in case of TCP/UDP/SCTP */ +#define RXH_L4_B_2_3 (1 << 7) /* dst port in case of TCP/UDP/SCTP */ +#define RXH_DISCARD (1 << 31) + +#define RX_CLS_FLOW_DISC 0xffffffffffffffffULL +#define RX_CLS_FLOW_WAKE 0xfffffffffffffffeULL + +/* Special RX classification rule insert location values */ +#define RX_CLS_LOC_SPECIAL 0x80000000 /* flag */ +#define RX_CLS_LOC_ANY 0xffffffff +#define RX_CLS_LOC_FIRST 0xfffffffe +#define RX_CLS_LOC_LAST 0xfffffffd + +/* EEPROM Standards for plug in modules */ +#define ETH_MODULE_SFF_8079 0x1 +#define ETH_MODULE_SFF_8079_LEN 256 +#define ETH_MODULE_SFF_8472 0x2 +#define ETH_MODULE_SFF_8472_LEN 512 +#define ETH_MODULE_SFF_8636 0x3 +#define ETH_MODULE_SFF_8636_LEN 256 +#define ETH_MODULE_SFF_8436 0x4 +#define ETH_MODULE_SFF_8436_LEN 256 + +/* Reset flags */ +/* The reset() operation must clear the flags for the components which + * were actually reset. On successful return, the flags indicate the + * components which were not reset, either because they do not exist + * in the hardware or because they cannot be reset independently. The + * driver must never reset any components that were not requested. + */ +enum ethtool_reset_flags { + /* These flags represent components dedicated to the interface + * the command is addressed to. Shift any flag left by + * ETH_RESET_SHARED_SHIFT to reset a shared component of the + * same type. + */ + ETH_RESET_MGMT = 1 << 0, /* Management processor */ + ETH_RESET_IRQ = 1 << 1, /* Interrupt requester */ + ETH_RESET_DMA = 1 << 2, /* DMA engine */ + ETH_RESET_FILTER = 1 << 3, /* Filtering/flow direction */ + ETH_RESET_OFFLOAD = 1 << 4, /* Protocol offload */ + ETH_RESET_MAC = 1 << 5, /* Media access controller */ + ETH_RESET_PHY = 1 << 6, /* Transceiver/PHY */ + ETH_RESET_RAM = 1 << 7, /* RAM shared between + * multiple components */ + ETH_RESET_AP = 1 << 8, /* Application processor */ + + ETH_RESET_DEDICATED = 0x0000ffff, /* All components dedicated to + * this interface */ + ETH_RESET_ALL = 0xffffffff, /* All components used by this + * interface, even if shared */ +}; +#define ETH_RESET_SHARED_SHIFT 16 + + +/** + * struct ethtool_link_settings - link control and status + * + * IMPORTANT, Backward compatibility notice: When implementing new + * user-space tools, please first try %ETHTOOL_GLINKSETTINGS, and + * if it succeeds use %ETHTOOL_SLINKSETTINGS to change link + * settings; do not use %ETHTOOL_SSET if %ETHTOOL_GLINKSETTINGS + * succeeded: stick to %ETHTOOL_GLINKSETTINGS/%SLINKSETTINGS in + * that case. Conversely, if %ETHTOOL_GLINKSETTINGS fails, use + * %ETHTOOL_GSET to query and %ETHTOOL_SSET to change link + * settings; do not use %ETHTOOL_SLINKSETTINGS if + * %ETHTOOL_GLINKSETTINGS failed: stick to + * %ETHTOOL_GSET/%ETHTOOL_SSET in that case. + * + * @cmd: Command number = %ETHTOOL_GLINKSETTINGS or %ETHTOOL_SLINKSETTINGS + * @speed: Link speed (Mbps) + * @duplex: Duplex mode; one of %DUPLEX_* + * @port: Physical connector type; one of %PORT_* + * @phy_address: MDIO address of PHY (transceiver); 0 or 255 if not + * applicable. For clause 45 PHYs this is the PRTAD. + * @autoneg: Enable/disable autonegotiation and auto-detection; + * either %AUTONEG_DISABLE or %AUTONEG_ENABLE + * @mdio_support: Bitmask of %ETH_MDIO_SUPPORTS_* flags for the MDIO + * protocols supported by the interface; 0 if unknown. + * Read-only. + * @eth_tp_mdix: Ethernet twisted-pair MDI(-X) status; one of + * %ETH_TP_MDI_*. If the status is unknown or not applicable, the + * value will be %ETH_TP_MDI_INVALID. Read-only. + * @eth_tp_mdix_ctrl: Ethernet twisted pair MDI(-X) control; one of + * %ETH_TP_MDI_*. If MDI(-X) control is not implemented, reads + * yield %ETH_TP_MDI_INVALID and writes may be ignored or rejected. + * When written successfully, the link should be renegotiated if + * necessary. + * @link_mode_masks_nwords: Number of 32-bit words for each of the + * supported, advertising, lp_advertising link mode bitmaps. For + * %ETHTOOL_GLINKSETTINGS: on entry, number of words passed by user + * (>= 0); on return, if handshake in progress, negative if + * request size unsupported by kernel: absolute value indicates + * kernel expected size and all the other fields but cmd + * are 0; otherwise (handshake completed), strictly positive + * to indicate size used by kernel and cmd field stays + * %ETHTOOL_GLINKSETTINGS, all other fields populated by driver. For + * %ETHTOOL_SLINKSETTINGS: must be valid on entry, ie. a positive + * value returned previously by %ETHTOOL_GLINKSETTINGS, otherwise + * refused. For drivers: ignore this field (use kernel's + * __ETHTOOL_LINK_MODE_MASK_NBITS instead), any change to it will + * be overwritten by kernel. + * @supported: Bitmap with each bit meaning given by + * %ethtool_link_mode_bit_indices for the link modes, physical + * connectors and other link features for which the interface + * supports autonegotiation or auto-detection. Read-only. + * @advertising: Bitmap with each bit meaning given by + * %ethtool_link_mode_bit_indices for the link modes, physical + * connectors and other link features that are advertised through + * autonegotiation or enabled for auto-detection. + * @lp_advertising: Bitmap with each bit meaning given by + * %ethtool_link_mode_bit_indices for the link modes, and other + * link features that the link partner advertised through + * autonegotiation; 0 if unknown or not applicable. Read-only. + * @transceiver: Used to distinguish different possible PHY types, + * reported consistently by PHYLIB. Read-only. + * + * If autonegotiation is disabled, the speed and @duplex represent the + * fixed link mode and are writable if the driver supports multiple + * link modes. If it is enabled then they are read-only; if the link + * is up they represent the negotiated link mode; if the link is down, + * the speed is 0, %SPEED_UNKNOWN or the highest enabled speed and + * @duplex is %DUPLEX_UNKNOWN or the best enabled duplex mode. + * + * Some hardware interfaces may have multiple PHYs and/or physical + * connectors fitted or do not allow the driver to detect which are + * fitted. For these interfaces @port and/or @phy_address may be + * writable, possibly dependent on @autoneg being %AUTONEG_DISABLE. + * Otherwise, attempts to write different values may be ignored or + * rejected. + * + * Deprecated %ethtool_cmd fields transceiver, maxtxpkt and maxrxpkt + * are not available in %ethtool_link_settings. These fields will be + * always set to zero in %ETHTOOL_GSET reply and %ETHTOOL_SSET will + * fail if any of them is set to non-zero value. + * + * Users should assume that all fields not marked read-only are + * writable and subject to validation by the driver. They should use + * %ETHTOOL_GLINKSETTINGS to get the current values before making specific + * changes and then applying them with %ETHTOOL_SLINKSETTINGS. + * + * Drivers that implement %get_link_ksettings and/or + * %set_link_ksettings should ignore the @cmd + * and @link_mode_masks_nwords fields (any change to them overwritten + * by kernel), and rely only on kernel's internal + * %__ETHTOOL_LINK_MODE_MASK_NBITS and + * %ethtool_link_mode_mask_t. Drivers that implement + * %set_link_ksettings() should validate all fields other than @cmd + * and @link_mode_masks_nwords that are not described as read-only or + * deprecated, and must ignore all fields described as read-only. + */ +struct ethtool_link_settings { + __u32 cmd; + __u32 speed; + __u8 duplex; + __u8 port; + __u8 phy_address; + __u8 autoneg; + __u8 mdio_support; + __u8 eth_tp_mdix; + __u8 eth_tp_mdix_ctrl; + __s8 link_mode_masks_nwords; + __u8 transceiver; + __u8 reserved1[3]; + __u32 reserved[7]; + __u32 link_mode_masks[0]; + /* layout of link_mode_masks fields: + * __u32 map_supported[link_mode_masks_nwords]; + * __u32 map_advertising[link_mode_masks_nwords]; + * __u32 map_lp_advertising[link_mode_masks_nwords]; + */ +}; +#endif /* _UAPI_LINUX_ETHTOOL_H */ diff --git a/src/shared/linux/libbpf.h b/src/shared/linux/libbpf.h deleted file mode 100644 index 391eee5a4e3..00000000000 --- a/src/shared/linux/libbpf.h +++ /dev/null @@ -1,207 +0,0 @@ -/* eBPF mini library */ -#ifndef __LIBBPF_H -#define __LIBBPF_H - -#include <linux/bpf.h> - -struct bpf_insn; - -/* ALU ops on registers, bpf_add|sub|...: dst_reg += src_reg */ - -#define BPF_ALU64_REG(OP, DST, SRC) \ - ((struct bpf_insn) { \ - .code = BPF_ALU64 | BPF_OP(OP) | BPF_X, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = 0, \ - .imm = 0 }) - -#define BPF_ALU32_REG(OP, DST, SRC) \ - ((struct bpf_insn) { \ - .code = BPF_ALU | BPF_OP(OP) | BPF_X, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = 0, \ - .imm = 0 }) - -/* ALU ops on immediates, bpf_add|sub|...: dst_reg += imm32 */ - -#define BPF_ALU64_IMM(OP, DST, IMM) \ - ((struct bpf_insn) { \ - .code = BPF_ALU64 | BPF_OP(OP) | BPF_K, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = 0, \ - .imm = IMM }) - -#define BPF_ALU32_IMM(OP, DST, IMM) \ - ((struct bpf_insn) { \ - .code = BPF_ALU | BPF_OP(OP) | BPF_K, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = 0, \ - .imm = IMM }) - -/* Short form of mov, dst_reg = src_reg */ - -#define BPF_MOV64_REG(DST, SRC) \ - ((struct bpf_insn) { \ - .code = BPF_ALU64 | BPF_MOV | BPF_X, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = 0, \ - .imm = 0 }) - -#define BPF_MOV32_REG(DST, SRC) \ - ((struct bpf_insn) { \ - .code = BPF_ALU | BPF_MOV | BPF_X, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = 0, \ - .imm = 0 }) - -/* Short form of mov, dst_reg = imm32 */ - -#define BPF_MOV64_IMM(DST, IMM) \ - ((struct bpf_insn) { \ - .code = BPF_ALU64 | BPF_MOV | BPF_K, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = 0, \ - .imm = IMM }) - -#define BPF_MOV32_IMM(DST, IMM) \ - ((struct bpf_insn) { \ - .code = BPF_ALU | BPF_MOV | BPF_K, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = 0, \ - .imm = IMM }) - -/* BPF_LD_IMM64 macro encodes single 'load 64-bit immediate' insn */ -#define BPF_LD_IMM64(DST, IMM) \ - BPF_LD_IMM64_RAW(DST, 0, IMM) - -#define BPF_LD_IMM64_RAW(DST, SRC, IMM) \ - ((struct bpf_insn) { \ - .code = BPF_LD | BPF_DW | BPF_IMM, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = 0, \ - .imm = (__u32) (IMM) }), \ - ((struct bpf_insn) { \ - .code = 0, /* zero is reserved opcode */ \ - .dst_reg = 0, \ - .src_reg = 0, \ - .off = 0, \ - .imm = ((__u64) (IMM)) >> 32 }) - -#ifndef BPF_PSEUDO_MAP_FD -# define BPF_PSEUDO_MAP_FD 1 -#endif - -/* pseudo BPF_LD_IMM64 insn used to refer to process-local map_fd */ -#define BPF_LD_MAP_FD(DST, MAP_FD) \ - BPF_LD_IMM64_RAW(DST, BPF_PSEUDO_MAP_FD, MAP_FD) - -/* Direct packet access, R0 = *(uint *) (skb->data + imm32) */ - -#define BPF_LD_ABS(SIZE, IMM) \ - ((struct bpf_insn) { \ - .code = BPF_LD | BPF_SIZE(SIZE) | BPF_ABS, \ - .dst_reg = 0, \ - .src_reg = 0, \ - .off = 0, \ - .imm = IMM }) - -/* Memory load, dst_reg = *(uint *) (src_reg + off16) */ - -#define BPF_LDX_MEM(SIZE, DST, SRC, OFF) \ - ((struct bpf_insn) { \ - .code = BPF_LDX | BPF_SIZE(SIZE) | BPF_MEM, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = OFF, \ - .imm = 0 }) - -/* Memory store, *(uint *) (dst_reg + off16) = src_reg */ - -#define BPF_STX_MEM(SIZE, DST, SRC, OFF) \ - ((struct bpf_insn) { \ - .code = BPF_STX | BPF_SIZE(SIZE) | BPF_MEM, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = OFF, \ - .imm = 0 }) - -/* Atomic memory add, *(uint *)(dst_reg + off16) += src_reg */ - -#define BPF_STX_XADD(SIZE, DST, SRC, OFF) \ - ((struct bpf_insn) { \ - .code = BPF_STX | BPF_SIZE(SIZE) | BPF_XADD, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = OFF, \ - .imm = 0 }) - -/* Memory store, *(uint *) (dst_reg + off16) = imm32 */ - -#define BPF_ST_MEM(SIZE, DST, OFF, IMM) \ - ((struct bpf_insn) { \ - .code = BPF_ST | BPF_SIZE(SIZE) | BPF_MEM, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = OFF, \ - .imm = IMM }) - -/* Conditional jumps against registers, if (dst_reg 'op' src_reg) goto pc + off16 */ - -#define BPF_JMP_REG(OP, DST, SRC, OFF) \ - ((struct bpf_insn) { \ - .code = BPF_JMP | BPF_OP(OP) | BPF_X, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = OFF, \ - .imm = 0 }) - -/* Conditional jumps against immediates, if (dst_reg 'op' imm32) goto pc + off16 */ - -#define BPF_JMP_IMM(OP, DST, IMM, OFF) \ - ((struct bpf_insn) { \ - .code = BPF_JMP | BPF_OP(OP) | BPF_K, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = OFF, \ - .imm = IMM }) - -/* Unconditional jumps */ - -#define BPF_JMP_A(OFF) \ - ((struct bpf_insn) { \ - .code = BPF_JMP | BPF_JA, \ - .dst_reg = 0, \ - .src_reg = 0, \ - .off = OFF, \ - .imm = 0 }) - -/* Raw code statement block */ - -#define BPF_RAW_INSN(CODE, DST, SRC, OFF, IMM) \ - ((struct bpf_insn) { \ - .code = CODE, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = OFF, \ - .imm = IMM }) - -/* Program exit */ - -#define BPF_EXIT_INSN() \ - ((struct bpf_insn) { \ - .code = BPF_JMP | BPF_EXIT, \ - .dst_reg = 0, \ - .src_reg = 0, \ - .off = 0, \ - .imm = 0 }) - -#endif diff --git a/src/shared/linux/netdevice.h b/src/shared/linux/netdevice.h new file mode 100644 index 00000000000..f3770c5b0fa --- /dev/null +++ b/src/shared/linux/netdevice.h @@ -0,0 +1,66 @@ +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ +/* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket + * interface as the means of communication with the user level. + * + * Definitions for the Interfaces handler. + * + * Version: @(#)dev.h 1.0.10 08/12/93 + * + * Authors: Ross Biro + * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> + * Corey Minyard <wf-rch!minyard@relay.EU.net> + * Donald J. Becker, <becker@cesdis.gsfc.nasa.gov> + * Alan Cox, <alan@lxorguk.ukuu.org.uk> + * Bjorn Ekwall. <bj0rn@blox.se> + * Pekka Riikonen <priikone@poseidon.pspt.fi> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * Moved to /usr/include/linux for NET3 + */ +#ifndef _UAPI_LINUX_NETDEVICE_H +#define _UAPI_LINUX_NETDEVICE_H + +#include <linux/if.h> +#include <linux/if_ether.h> +#include <linux/if_packet.h> +#include <linux/if_link.h> + + +#define MAX_ADDR_LEN 32 /* Largest hardware address length */ + +/* Initial net device group. All devices belong to group 0 by default. */ +#define INIT_NETDEV_GROUP 0 + + +/* interface name assignment types (sysfs name_assign_type attribute) */ +#define NET_NAME_UNKNOWN 0 /* unknown origin (not exposed to userspace) */ +#define NET_NAME_ENUM 1 /* enumerated by kernel */ +#define NET_NAME_PREDICTABLE 2 /* predictably named by the kernel */ +#define NET_NAME_USER 3 /* provided by user-space */ +#define NET_NAME_RENAMED 4 /* renamed by user-space */ + +/* Media selection options. */ +enum { + IF_PORT_UNKNOWN = 0, + IF_PORT_10BASE2, + IF_PORT_10BASET, + IF_PORT_AUI, + IF_PORT_100BASET, + IF_PORT_100BASETX, + IF_PORT_100BASEFX +}; + +/* hardware address assignment types */ +#define NET_ADDR_PERM 0 /* address is permanent (default) */ +#define NET_ADDR_RANDOM 1 /* address is generated randomly */ +#define NET_ADDR_STOLEN 2 /* address is stolen from other device */ +#define NET_ADDR_SET 3 /* address is set using + * dev_set_mac_address() */ + +#endif /* _UAPI_LINUX_NETDEVICE_H */ diff --git a/src/shared/meson.build b/src/shared/meson.build index e05fbce30f3..15466bcaf1f 100644 --- a/src/shared/meson.build +++ b/src/shared/meson.build @@ -96,6 +96,13 @@ shared_sources = files(''' json.c json.h libmount-util.h + linux/auto_dev-ioctl.h + linux/bpf.h + linux/bpf_common.h + linux/bpf_insn.h + linux/dm-ioctl.h + linux/ethtool.h + linux/netdevice.h lockfile-util.c lockfile-util.h log-link.h @@ -168,7 +175,6 @@ shared_sources = files(''' watchdog.h web-util.c web-util.h - wireguard-netlink.h xml.c xml.h '''.split()) diff --git a/src/shared/wireguard-netlink.h b/src/shared/wireguard-netlink.h deleted file mode 100644 index eb170915a6a..00000000000 --- a/src/shared/wireguard-netlink.h +++ /dev/null @@ -1,179 +0,0 @@ -#pragma once - -/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR MIT) - * - * Copyright (C) 2015-2017 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. - * - * Documentation - * ============= - * - * The below enums and macros are for interfacing with WireGuard, using generic - * netlink, with family WG_GENL_NAME and version WG_GENL_VERSION. It defines two - * methods: get and set. Note that while they share many common attributes, these - * two functions actually accept a slightly different set of inputs and outputs. - * - * WG_CMD_GET_DEVICE - * ----------------- - * - * May only be called via NLM_F_REQUEST | NLM_F_DUMP. The command should contain - * one but not both of: - * - * WGDEVICE_A_IFINDEX: NLA_U32 - * WGDEVICE_A_IFNAME: NLA_NUL_STRING, maxlen IFNAMESIZ - 1 - * - * The kernel will then return several messages (NLM_F_MULTI) containing the following - * tree of nested items: - * - * WGDEVICE_A_IFINDEX: NLA_U32 - * WGDEVICE_A_IFNAME: NLA_NUL_STRING, maxlen IFNAMESIZ - 1 - * WGDEVICE_A_PRIVATE_KEY: len WG_KEY_LEN - * WGDEVICE_A_PUBLIC_KEY: len WG_KEY_LEN - * WGDEVICE_A_LISTEN_PORT: NLA_U16 - * WGDEVICE_A_FWMARK: NLA_U32 - * WGDEVICE_A_PEERS: NLA_NESTED - * 0: NLA_NESTED - * WGPEER_A_PUBLIC_KEY: len WG_KEY_LEN - * WGPEER_A_PRESHARED_KEY: len WG_KEY_LEN - * WGPEER_A_ENDPOINT: struct sockaddr_in or struct sockaddr_in6 - * WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL: NLA_U16 - * WGPEER_A_LAST_HANDSHAKE_TIME: struct timespec - * WGPEER_A_RX_BYTES: NLA_U64 - * WGPEER_A_TX_BYTES: NLA_U64 - * WGPEER_A_ALLOWEDIPS: NLA_NESTED - * 0: NLA_NESTED - * WGALLOWEDIP_A_FAMILY: NLA_U16 - * WGALLOWEDIP_A_IPADDR: struct in_addr or struct in6_addr - * WGALLOWEDIP_A_CIDR_MASK: NLA_U8 - * 1: NLA_NESTED - * ... - * 2: NLA_NESTED - * ... - * ... - * 1: NLA_NESTED - * ... - * ... - * - * It is possible that all of the allowed IPs of a single peer will not - * fit within a single netlink message. In that case, the same peer will - * be written in the following message, except it will only contain - * WGPEER_A_PUBLIC_KEY and WGPEER_A_ALLOWEDIPS. This may occur several - * times in a row for the same peer. It is then up to the receiver to - * coalesce adjacent peers. Likewise, it is possible that all peers will - * not fit within a single message. So, subsequent peers will be sent - * in following messages, except those will only contain WGDEVICE_A_IFNAME - * and WGDEVICE_A_PEERS. It is then up to the receiver to coalesce these - * messages to form the complete list of peers. - * - * Since this is an NLA_F_DUMP command, the final message will always be - * NLMSG_DONE, even if an error occurs. However, this NLMSG_DONE message - * contains an integer error code. It is either zero or a negative error - * code corresponding to the errno. - * - * WG_CMD_SET_DEVICE - * ----------------- - * - * May only be called via NLM_F_REQUEST. The command should contain the following - * tree of nested items, containing one but not both of WGDEVICE_A_IFINDEX - * and WGDEVICE_A_IFNAME: - * - * WGDEVICE_A_IFINDEX: NLA_U32 - * WGDEVICE_A_IFNAME: NLA_NUL_STRING, maxlen IFNAMESIZ - 1 - * WGDEVICE_A_FLAGS: NLA_U32, 0 or WGDEVICE_F_REPLACE_PEERS if all current - * peers should be removed prior to adding the list below. - * WGDEVICE_A_PRIVATE_KEY: len WG_KEY_LEN, all zeros to remove - * WGDEVICE_A_LISTEN_PORT: NLA_U16, 0 to choose randomly - * WGDEVICE_A_FWMARK: NLA_U32, 0 to disable - * WGDEVICE_A_PEERS: NLA_NESTED - * 0: NLA_NESTED - * WGPEER_A_PUBLIC_KEY: len WG_KEY_LEN - * WGPEER_A_FLAGS: NLA_U32, 0 and/or WGPEER_F_REMOVE_ME if the specified peer - * should be removed rather than added/updated and/or - * WGPEER_F_REPLACE_ALLOWEDIPS if all current allowed IPs of - * this peer should be removed prior to adding the list below. - * WGPEER_A_PRESHARED_KEY: len WG_KEY_LEN, all zeros to remove - * WGPEER_A_ENDPOINT: struct sockaddr_in or struct sockaddr_in6 - * WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL: NLA_U16, 0 to disable - * WGPEER_A_ALLOWEDIPS: NLA_NESTED - * 0: NLA_NESTED - * WGALLOWEDIP_A_FAMILY: NLA_U16 - * WGALLOWEDIP_A_IPADDR: struct in_addr or struct in6_addr - * WGALLOWEDIP_A_CIDR_MASK: NLA_U8 - * 1: NLA_NESTED - * ... - * 2: NLA_NESTED - * ... - * ... - * 1: NLA_NESTED - * ... - * ... - * - * It is possible that the amount of configuration data exceeds that of - * the maximum message length accepted by the kernel. In that case, - * several messages should be sent one after another, with each - * successive one filling in information not contained in the prior. Note - * that if WGDEVICE_F_REPLACE_PEERS is specified in the first message, it - * probably should not be specified in fragments that come after, so that - * the list of peers is only cleared the first time but appened after. - * Likewise for peers, if WGPEER_F_REPLACE_ALLOWEDIPS is specified in the - * first message of a peer, it likely should not be specified in subsequent - * fragments. - * - * If an error occurs, NLMSG_ERROR will reply containing an errno. - */ - -#define WG_GENL_NAME "wireguard" -#define WG_GENL_VERSION 1 - -#define WG_KEY_LEN 32 - -enum wg_cmd { - WG_CMD_GET_DEVICE, - WG_CMD_SET_DEVICE, - __WG_CMD_MAX -}; -#define WG_CMD_MAX (__WG_CMD_MAX - 1) - -enum wgdevice_flag { - WGDEVICE_F_REPLACE_PEERS = 1U << 0 -}; -enum wgdevice_attribute { - WGDEVICE_A_UNSPEC, - WGDEVICE_A_IFINDEX, - WGDEVICE_A_IFNAME, - WGDEVICE_A_PRIVATE_KEY, - WGDEVICE_A_PUBLIC_KEY, - WGDEVICE_A_FLAGS, - WGDEVICE_A_LISTEN_PORT, - WGDEVICE_A_FWMARK, - WGDEVICE_A_PEERS, - __WGDEVICE_A_LAST -}; -#define WGDEVICE_A_MAX (__WGDEVICE_A_LAST - 1) - -enum wgpeer_flag { - WGPEER_F_REMOVE_ME = 1U << 0, - WGPEER_F_REPLACE_ALLOWEDIPS = 1U << 1 -}; -enum wgpeer_attribute { - WGPEER_A_UNSPEC, - WGPEER_A_PUBLIC_KEY, - WGPEER_A_PRESHARED_KEY, - WGPEER_A_FLAGS, - WGPEER_A_ENDPOINT, - WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL, - WGPEER_A_LAST_HANDSHAKE_TIME, - WGPEER_A_RX_BYTES, - WGPEER_A_TX_BYTES, - WGPEER_A_ALLOWEDIPS, - __WGPEER_A_LAST -}; -#define WGPEER_A_MAX (__WGPEER_A_LAST - 1) - -enum wgallowedip_attribute { - WGALLOWEDIP_A_UNSPEC, - WGALLOWEDIP_A_FAMILY, - WGALLOWEDIP_A_IPADDR, - WGALLOWEDIP_A_CIDR_MASK, - __WGALLOWEDIP_A_LAST -}; -#define WGALLOWEDIP_A_MAX (__WGALLOWEDIP_A_LAST - 1) diff --git a/src/shutdown/umount.c b/src/shutdown/umount.c index 928bae6ab19..6afa512bfff 100644 --- a/src/shutdown/umount.c +++ b/src/shutdown/umount.c @@ -5,6 +5,7 @@ #include <errno.h> #include <fcntl.h> +#include <linux/dm-ioctl.h> #include <linux/loop.h> #include <string.h> #include <sys/mount.h> @@ -23,7 +24,6 @@ #include "fd-util.h" #include "fstab-util.h" #include "libmount-util.h" -#include "linux-3.13/dm-ioctl.h" #include "mount-setup.h" #include "mount-util.h" #include "mountpoint-util.h" diff --git a/src/test/test-arphrd-list.c b/src/test/test-arphrd-list.c index 3005fc1b696..02bb25b6956 100644 --- a/src/test/test-arphrd-list.c +++ b/src/test/test-arphrd-list.c @@ -1,10 +1,9 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ -#include <net/if_arp.h> +#include <linux/if_arp.h> #include <string.h> #include "macro.h" -#include "missing_network.h" #include "string-util.h" _unused_ \ diff --git a/src/test/test-bpf.c b/src/test/test-bpf.c index cd8d68f215b..6a0bf1462fa 100644 --- a/src/test/test-bpf.c +++ b/src/test/test-bpf.c @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ -#include <linux/libbpf.h> +#include <linux/bpf_insn.h> #include <string.h> #include <sys/mman.h> #include <unistd.h> diff --git a/src/test/test-netlink-manual.c b/src/test/test-netlink-manual.c index a1a5eb47788..031a47605e2 100644 --- a/src/test/test-netlink-manual.c +++ b/src/test/test-netlink-manual.c @@ -2,9 +2,8 @@ #include <arpa/inet.h> #include <libkmod.h> -#include <linux/ip.h> -#include <net/if.h> #include <linux/if_tunnel.h> +#include <linux/ip.h> #include <sys/types.h> #include <unistd.h> diff --git a/src/udev/net/ethtool-util.h b/src/udev/net/ethtool-util.h index 618b26bf59f..7ca703d22cc 100644 --- a/src/udev/net/ethtool-util.h +++ b/src/udev/net/ethtool-util.h @@ -5,7 +5,6 @@ #include <linux/ethtool.h> #include "conf-parser.h" -#include "missing_network.h" struct link_config; diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 14690e364b9..a26c4cefa82 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ +#include <linux/netdevice.h> #include <netinet/ether.h> #include "sd-device.h" @@ -15,7 +16,6 @@ #include "link-config.h" #include "log.h" #include "memory-util.h" -#include "missing_network.h" #include "naming-scheme.h" #include "netlink-util.h" #include "network-internal.h" diff --git a/src/udev/udev-builtin-btrfs.c b/src/udev/udev-builtin-btrfs.c index 956be59afb9..6a69dae3af7 100644 --- a/src/udev/udev-builtin-btrfs.c +++ b/src/udev/udev-builtin-btrfs.c @@ -1,12 +1,12 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ #include <fcntl.h> +#include <linux/btrfs.h> #include <stdlib.h> #include <sys/ioctl.h> #include "device-util.h" #include "fd-util.h" -#include "missing.h" #include "string-util.h" #include "strxcpyx.h" #include "udev-builtin.h" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/patches/amlogic/systemd-9999.2-backport.patch ================================================ From 76566792e33f054dd02df84db044f5ae747afe67 Mon Sep 17 00:00:00 2001 From: Yu Watanabe <watanabe.yu+github@gmail.com> Date: Sat, 13 Apr 2019 18:33:34 +0900 Subject: [PATCH] linux: move netdevice.h from shared/linux to basic/linux As the header linux/if_arp.h includes linux/netdevice.h. --- src/{shared => basic}/linux/netdevice.h | 0 src/basic/meson.build | 1 + src/shared/meson.build | 1 - 3 files changed, 1 insertion(+), 1 deletion(-) rename src/{shared => basic}/linux/netdevice.h (100%) diff --git a/src/shared/linux/netdevice.h b/src/basic/linux/netdevice.h similarity index 100% rename from src/shared/linux/netdevice.h rename to src/basic/linux/netdevice.h diff --git a/src/basic/meson.build b/src/basic/meson.build index 524f3785dc0..81c3d0f3e80 100644 --- a/src/basic/meson.build +++ b/src/basic/meson.build @@ -99,6 +99,7 @@ basic_sources = files(''' linux/if_tun.h linux/if_tunnel.h linux/libc-compat.h + linux/netdevice.h linux/netlink.h linux/rtnetlink.h linux/wireguard.h diff --git a/src/shared/meson.build b/src/shared/meson.build index 15466bcaf1f..c80a67cdde4 100644 --- a/src/shared/meson.build +++ b/src/shared/meson.build @@ -102,7 +102,6 @@ shared_sources = files(''' linux/bpf_insn.h linux/dm-ioctl.h linux/ethtool.h - linux/netdevice.h lockfile-util.c lockfile-util.h log-link.h ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/patches/amlogic/systemd-9999.3-backport.patch ================================================ From 7057b6144f4c5cb7e284a409c7f24b84c16a3bb8 Mon Sep 17 00:00:00 2001 From: Yu Watanabe <watanabe.yu+github@gmail.com> Date: Sat, 13 Apr 2019 18:46:40 +0900 Subject: [PATCH] linux: also import linux/in.h and in6.h from kernel-5.0 Now linux/in.h has better conflict detection with glibc's netinet/in.h. So, let's import the headers. Note that our code already have many workarounds for the conflict, but in this commit does not drop them. Let's do that in the later commits if this really helps. --- src/basic/linux/in.h | 305 ++++++++++++++++++++++++++++++++++++++++++ src/basic/linux/in6.h | 299 +++++++++++++++++++++++++++++++++++++++++ src/basic/meson.build | 2 + 3 files changed, 606 insertions(+) create mode 100644 src/basic/linux/in.h create mode 100644 src/basic/linux/in6.h diff --git a/src/basic/linux/in.h b/src/basic/linux/in.h new file mode 100644 index 00000000000..a55cb8b1016 --- /dev/null +++ b/src/basic/linux/in.h @@ -0,0 +1,305 @@ +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ +/* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket + * interface as the means of communication with the user level. + * + * Definitions of the Internet Protocol. + * + * Version: @(#)in.h 1.0.1 04/21/93 + * + * Authors: Original taken from the GNU Project <netinet/in.h> file. + * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ +#ifndef _UAPI_LINUX_IN_H +#define _UAPI_LINUX_IN_H + +#include <linux/types.h> +#include <linux/libc-compat.h> +#include <linux/socket.h> + +#if __UAPI_DEF_IN_IPPROTO +/* Standard well-defined IP protocols. */ +enum { + IPPROTO_IP = 0, /* Dummy protocol for TCP */ +#define IPPROTO_IP IPPROTO_IP + IPPROTO_ICMP = 1, /* Internet Control Message Protocol */ +#define IPPROTO_ICMP IPPROTO_ICMP + IPPROTO_IGMP = 2, /* Internet Group Management Protocol */ +#define IPPROTO_IGMP IPPROTO_IGMP + IPPROTO_IPIP = 4, /* IPIP tunnels (older KA9Q tunnels use 94) */ +#define IPPROTO_IPIP IPPROTO_IPIP + IPPROTO_TCP = 6, /* Transmission Control Protocol */ +#define IPPROTO_TCP IPPROTO_TCP + IPPROTO_EGP = 8, /* Exterior Gateway Protocol */ +#define IPPROTO_EGP IPPROTO_EGP + IPPROTO_PUP = 12, /* PUP protocol */ +#define IPPROTO_PUP IPPROTO_PUP + IPPROTO_UDP = 17, /* User Datagram Protocol */ +#define IPPROTO_UDP IPPROTO_UDP + IPPROTO_IDP = 22, /* XNS IDP protocol */ +#define IPPROTO_IDP IPPROTO_IDP + IPPROTO_TP = 29, /* SO Transport Protocol Class 4 */ +#define IPPROTO_TP IPPROTO_TP + IPPROTO_DCCP = 33, /* Datagram Congestion Control Protocol */ +#define IPPROTO_DCCP IPPROTO_DCCP + IPPROTO_IPV6 = 41, /* IPv6-in-IPv4 tunnelling */ +#define IPPROTO_IPV6 IPPROTO_IPV6 + IPPROTO_RSVP = 46, /* RSVP Protocol */ +#define IPPROTO_RSVP IPPROTO_RSVP + IPPROTO_GRE = 47, /* Cisco GRE tunnels (rfc 1701,1702) */ +#define IPPROTO_GRE IPPROTO_GRE + IPPROTO_ESP = 50, /* Encapsulation Security Payload protocol */ +#define IPPROTO_ESP IPPROTO_ESP + IPPROTO_AH = 51, /* Authentication Header protocol */ +#define IPPROTO_AH IPPROTO_AH + IPPROTO_MTP = 92, /* Multicast Transport Protocol */ +#define IPPROTO_MTP IPPROTO_MTP + IPPROTO_BEETPH = 94, /* IP option pseudo header for BEET */ +#define IPPROTO_BEETPH IPPROTO_BEETPH + IPPROTO_ENCAP = 98, /* Encapsulation Header */ +#define IPPROTO_ENCAP IPPROTO_ENCAP + IPPROTO_PIM = 103, /* Protocol Independent Multicast */ +#define IPPROTO_PIM IPPROTO_PIM + IPPROTO_COMP = 108, /* Compression Header Protocol */ +#define IPPROTO_COMP IPPROTO_COMP + IPPROTO_SCTP = 132, /* Stream Control Transport Protocol */ +#define IPPROTO_SCTP IPPROTO_SCTP + IPPROTO_UDPLITE = 136, /* UDP-Lite (RFC 3828) */ +#define IPPROTO_UDPLITE IPPROTO_UDPLITE + IPPROTO_MPLS = 137, /* MPLS in IP (RFC 4023) */ +#define IPPROTO_MPLS IPPROTO_MPLS + IPPROTO_RAW = 255, /* Raw IP packets */ +#define IPPROTO_RAW IPPROTO_RAW + IPPROTO_MAX +}; +#endif + +#if __UAPI_DEF_IN_ADDR +/* Internet address. */ +struct in_addr { + __be32 s_addr; +}; +#endif + +#define IP_TOS 1 +#define IP_TTL 2 +#define IP_HDRINCL 3 +#define IP_OPTIONS 4 +#define IP_ROUTER_ALERT 5 +#define IP_RECVOPTS 6 +#define IP_RETOPTS 7 +#define IP_PKTINFO 8 +#define IP_PKTOPTIONS 9 +#define IP_MTU_DISCOVER 10 +#define IP_RECVERR 11 +#define IP_RECVTTL 12 +#define IP_RECVTOS 13 +#define IP_MTU 14 +#define IP_FREEBIND 15 +#define IP_IPSEC_POLICY 16 +#define IP_XFRM_POLICY 17 +#define IP_PASSSEC 18 +#define IP_TRANSPARENT 19 + +/* BSD compatibility */ +#define IP_RECVRETOPTS IP_RETOPTS + +/* TProxy original addresses */ +#define IP_ORIGDSTADDR 20 +#define IP_RECVORIGDSTADDR IP_ORIGDSTADDR + +#define IP_MINTTL 21 +#define IP_NODEFRAG 22 +#define IP_CHECKSUM 23 +#define IP_BIND_ADDRESS_NO_PORT 24 +#define IP_RECVFRAGSIZE 25 + +/* IP_MTU_DISCOVER values */ +#define IP_PMTUDISC_DONT 0 /* Never send DF frames */ +#define IP_PMTUDISC_WANT 1 /* Use per route hints */ +#define IP_PMTUDISC_DO 2 /* Always DF */ +#define IP_PMTUDISC_PROBE 3 /* Ignore dst pmtu */ +/* Always use interface mtu (ignores dst pmtu) but don't set DF flag. + * Also incoming ICMP frag_needed notifications will be ignored on + * this socket to prevent accepting spoofed ones. + */ +#define IP_PMTUDISC_INTERFACE 4 +/* weaker version of IP_PMTUDISC_INTERFACE, which allos packets to get + * fragmented if they exeed the interface mtu + */ +#define IP_PMTUDISC_OMIT 5 + +#define IP_MULTICAST_IF 32 +#define IP_MULTICAST_TTL 33 +#define IP_MULTICAST_LOOP 34 +#define IP_ADD_MEMBERSHIP 35 +#define IP_DROP_MEMBERSHIP 36 +#define IP_UNBLOCK_SOURCE 37 +#define IP_BLOCK_SOURCE 38 +#define IP_ADD_SOURCE_MEMBERSHIP 39 +#define IP_DROP_SOURCE_MEMBERSHIP 40 +#define IP_MSFILTER 41 +#define MCAST_JOIN_GROUP 42 +#define MCAST_BLOCK_SOURCE 43 +#define MCAST_UNBLOCK_SOURCE 44 +#define MCAST_LEAVE_GROUP 45 +#define MCAST_JOIN_SOURCE_GROUP 46 +#define MCAST_LEAVE_SOURCE_GROUP 47 +#define MCAST_MSFILTER 48 +#define IP_MULTICAST_ALL 49 +#define IP_UNICAST_IF 50 + +#define MCAST_EXCLUDE 0 +#define MCAST_INCLUDE 1 + +/* These need to appear somewhere around here */ +#define IP_DEFAULT_MULTICAST_TTL 1 +#define IP_DEFAULT_MULTICAST_LOOP 1 + +/* Request struct for multicast socket ops */ + +#if __UAPI_DEF_IP_MREQ +struct ip_mreq { + struct in_addr imr_multiaddr; /* IP multicast address of group */ + struct in_addr imr_interface; /* local IP address of interface */ +}; + +struct ip_mreqn { + struct in_addr imr_multiaddr; /* IP multicast address of group */ + struct in_addr imr_address; /* local IP address of interface */ + int imr_ifindex; /* Interface index */ +}; + +struct ip_mreq_source { + __be32 imr_multiaddr; + __be32 imr_interface; + __be32 imr_sourceaddr; +}; + +struct ip_msfilter { + __be32 imsf_multiaddr; + __be32 imsf_interface; + __u32 imsf_fmode; + __u32 imsf_numsrc; + __be32 imsf_slist[1]; +}; + +#define IP_MSFILTER_SIZE(numsrc) \ + (sizeof(struct ip_msfilter) - sizeof(__u32) \ + + (numsrc) * sizeof(__u32)) + +struct group_req { + __u32 gr_interface; /* interface index */ + struct __kernel_sockaddr_storage gr_group; /* group address */ +}; + +struct group_source_req { + __u32 gsr_interface; /* interface index */ + struct __kernel_sockaddr_storage gsr_group; /* group address */ + struct __kernel_sockaddr_storage gsr_source; /* source address */ +}; + +struct group_filter { + __u32 gf_interface; /* interface index */ + struct __kernel_sockaddr_storage gf_group; /* multicast address */ + __u32 gf_fmode; /* filter mode */ + __u32 gf_numsrc; /* number of sources */ + struct __kernel_sockaddr_storage gf_slist[1]; /* interface index */ +}; + +#define GROUP_FILTER_SIZE(numsrc) \ + (sizeof(struct group_filter) - sizeof(struct __kernel_sockaddr_storage) \ + + (numsrc) * sizeof(struct __kernel_sockaddr_storage)) +#endif + +#if __UAPI_DEF_IN_PKTINFO +struct in_pktinfo { + int ipi_ifindex; + struct in_addr ipi_spec_dst; + struct in_addr ipi_addr; +}; +#endif + +/* Structure describing an Internet (IP) socket address. */ +#if __UAPI_DEF_SOCKADDR_IN +#define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */ +struct sockaddr_in { + __kernel_sa_family_t sin_family; /* Address family */ + __be16 sin_port; /* Port number */ + struct in_addr sin_addr; /* Internet address */ + + /* Pad to size of `struct sockaddr'. */ + unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) - + sizeof(unsigned short int) - sizeof(struct in_addr)]; +}; +#define sin_zero __pad /* for BSD UNIX comp. -FvK */ +#endif + +#if __UAPI_DEF_IN_CLASS +/* + * Definitions of the bits in an Internet address integer. + * On subnets, host and network parts are found according + * to the subnet mask, not these masks. + */ +#define IN_CLASSA(a) ((((long int) (a)) & 0x80000000) == 0) +#define IN_CLASSA_NET 0xff000000 +#define IN_CLASSA_NSHIFT 24 +#define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET) +#define IN_CLASSA_MAX 128 + +#define IN_CLASSB(a) ((((long int) (a)) & 0xc0000000) == 0x80000000) +#define IN_CLASSB_NET 0xffff0000 +#define IN_CLASSB_NSHIFT 16 +#define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET) +#define IN_CLASSB_MAX 65536 + +#define IN_CLASSC(a) ((((long int) (a)) & 0xe0000000) == 0xc0000000) +#define IN_CLASSC_NET 0xffffff00 +#define IN_CLASSC_NSHIFT 8 +#define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET) + +#define IN_CLASSD(a) ((((long int) (a)) & 0xf0000000) == 0xe0000000) +#define IN_MULTICAST(a) IN_CLASSD(a) +#define IN_MULTICAST_NET 0xe0000000 + +#define IN_BADCLASS(a) (((long int) (a) ) == (long int)0xffffffff) +#define IN_EXPERIMENTAL(a) IN_BADCLASS((a)) + +#define IN_CLASSE(a) ((((long int) (a)) & 0xf0000000) == 0xf0000000) +#define IN_CLASSE_NET 0xffffffff +#define IN_CLASSE_NSHIFT 0 + +/* Address to accept any incoming messages. */ +#define INADDR_ANY ((unsigned long int) 0x00000000) + +/* Address to send to all hosts. */ +#define INADDR_BROADCAST ((unsigned long int) 0xffffffff) + +/* Address indicating an error return. */ +#define INADDR_NONE ((unsigned long int) 0xffffffff) + +/* Network number for local host loopback. */ +#define IN_LOOPBACKNET 127 + +/* Address to loopback in software to local host. */ +#define INADDR_LOOPBACK 0x7f000001 /* 127.0.0.1 */ +#define IN_LOOPBACK(a) ((((long int) (a)) & 0xff000000) == 0x7f000000) + +/* Defines for Multicast INADDR */ +#define INADDR_UNSPEC_GROUP 0xe0000000U /* 224.0.0.0 */ +#define INADDR_ALLHOSTS_GROUP 0xe0000001U /* 224.0.0.1 */ +#define INADDR_ALLRTRS_GROUP 0xe0000002U /* 224.0.0.2 */ +#define INADDR_MAX_LOCAL_GROUP 0xe00000ffU /* 224.0.0.255 */ +#endif + +/* <asm/byteorder.h> contains the htonl type stuff.. */ +#include <asm/byteorder.h> + + +#endif /* _UAPI_LINUX_IN_H */ diff --git a/src/basic/linux/in6.h b/src/basic/linux/in6.h new file mode 100644 index 00000000000..71d82fe15b0 --- /dev/null +++ b/src/basic/linux/in6.h @@ -0,0 +1,299 @@ +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ +/* + * Types and definitions for AF_INET6 + * Linux INET6 implementation + * + * Authors: + * Pedro Roque <roque@di.fc.ul.pt> + * + * Sources: + * IPv6 Program Interfaces for BSD Systems + * <draft-ietf-ipngwg-bsd-api-05.txt> + * + * Advanced Sockets API for IPv6 + * <draft-stevens-advanced-api-00.txt> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#ifndef _UAPI_LINUX_IN6_H +#define _UAPI_LINUX_IN6_H + +#include <linux/types.h> +#include <linux/libc-compat.h> + +/* + * IPv6 address structure + */ + +#if __UAPI_DEF_IN6_ADDR +struct in6_addr { + union { + __u8 u6_addr8[16]; +#if __UAPI_DEF_IN6_ADDR_ALT + __be16 u6_addr16[8]; + __be32 u6_addr32[4]; +#endif + } in6_u; +#define s6_addr in6_u.u6_addr8 +#if __UAPI_DEF_IN6_ADDR_ALT +#define s6_addr16 in6_u.u6_addr16 +#define s6_addr32 in6_u.u6_addr32 +#endif +}; +#endif /* __UAPI_DEF_IN6_ADDR */ + +#if __UAPI_DEF_SOCKADDR_IN6 +struct sockaddr_in6 { + unsigned short int sin6_family; /* AF_INET6 */ + __be16 sin6_port; /* Transport layer port # */ + __be32 sin6_flowinfo; /* IPv6 flow information */ + struct in6_addr sin6_addr; /* IPv6 address */ + __u32 sin6_scope_id; /* scope id (new in RFC2553) */ +}; +#endif /* __UAPI_DEF_SOCKADDR_IN6 */ + +#if __UAPI_DEF_IPV6_MREQ +struct ipv6_mreq { + /* IPv6 multicast address of group */ + struct in6_addr ipv6mr_multiaddr; + + /* local IPv6 address of interface */ + int ipv6mr_ifindex; +}; +#endif /* __UAPI_DEF_IVP6_MREQ */ + +#define ipv6mr_acaddr ipv6mr_multiaddr + +struct in6_flowlabel_req { + struct in6_addr flr_dst; + __be32 flr_label; + __u8 flr_action; + __u8 flr_share; + __u16 flr_flags; + __u16 flr_expires; + __u16 flr_linger; + __u32 __flr_pad; + /* Options in format of IPV6_PKTOPTIONS */ +}; + +#define IPV6_FL_A_GET 0 +#define IPV6_FL_A_PUT 1 +#define IPV6_FL_A_RENEW 2 + +#define IPV6_FL_F_CREATE 1 +#define IPV6_FL_F_EXCL 2 +#define IPV6_FL_F_REFLECT 4 +#define IPV6_FL_F_REMOTE 8 + +#define IPV6_FL_S_NONE 0 +#define IPV6_FL_S_EXCL 1 +#define IPV6_FL_S_PROCESS 2 +#define IPV6_FL_S_USER 3 +#define IPV6_FL_S_ANY 255 + + +/* + * Bitmask constant declarations to help applications select out the + * flow label and priority fields. + * + * Note that this are in host byte order while the flowinfo field of + * sockaddr_in6 is in network byte order. + */ + +#define IPV6_FLOWINFO_FLOWLABEL 0x000fffff +#define IPV6_FLOWINFO_PRIORITY 0x0ff00000 + +/* These definitions are obsolete */ +#define IPV6_PRIORITY_UNCHARACTERIZED 0x0000 +#define IPV6_PRIORITY_FILLER 0x0100 +#define IPV6_PRIORITY_UNATTENDED 0x0200 +#define IPV6_PRIORITY_RESERVED1 0x0300 +#define IPV6_PRIORITY_BULK 0x0400 +#define IPV6_PRIORITY_RESERVED2 0x0500 +#define IPV6_PRIORITY_INTERACTIVE 0x0600 +#define IPV6_PRIORITY_CONTROL 0x0700 +#define IPV6_PRIORITY_8 0x0800 +#define IPV6_PRIORITY_9 0x0900 +#define IPV6_PRIORITY_10 0x0a00 +#define IPV6_PRIORITY_11 0x0b00 +#define IPV6_PRIORITY_12 0x0c00 +#define IPV6_PRIORITY_13 0x0d00 +#define IPV6_PRIORITY_14 0x0e00 +#define IPV6_PRIORITY_15 0x0f00 + +/* + * IPV6 extension headers + */ +#if __UAPI_DEF_IPPROTO_V6 +#define IPPROTO_HOPOPTS 0 /* IPv6 hop-by-hop options */ +#define IPPROTO_ROUTING 43 /* IPv6 routing header */ +#define IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */ +#define IPPROTO_ICMPV6 58 /* ICMPv6 */ +#define IPPROTO_NONE 59 /* IPv6 no next header */ +#define IPPROTO_DSTOPTS 60 /* IPv6 destination options */ +#define IPPROTO_MH 135 /* IPv6 mobility header */ +#endif /* __UAPI_DEF_IPPROTO_V6 */ + +/* + * IPv6 TLV options. + */ +#define IPV6_TLV_PAD1 0 +#define IPV6_TLV_PADN 1 +#define IPV6_TLV_ROUTERALERT 5 +#define IPV6_TLV_CALIPSO 7 /* RFC 5570 */ +#define IPV6_TLV_JUMBO 194 +#define IPV6_TLV_HAO 201 /* home address option */ + +/* + * IPV6 socket options + */ +#if __UAPI_DEF_IPV6_OPTIONS +#define IPV6_ADDRFORM 1 +#define IPV6_2292PKTINFO 2 +#define IPV6_2292HOPOPTS 3 +#define IPV6_2292DSTOPTS 4 +#define IPV6_2292RTHDR 5 +#define IPV6_2292PKTOPTIONS 6 +#define IPV6_CHECKSUM 7 +#define IPV6_2292HOPLIMIT 8 +#define IPV6_NEXTHOP 9 +#define IPV6_AUTHHDR 10 /* obsolete */ +#define IPV6_FLOWINFO 11 + +#define IPV6_UNICAST_HOPS 16 +#define IPV6_MULTICAST_IF 17 +#define IPV6_MULTICAST_HOPS 18 +#define IPV6_MULTICAST_LOOP 19 +#define IPV6_ADD_MEMBERSHIP 20 +#define IPV6_DROP_MEMBERSHIP 21 +#define IPV6_ROUTER_ALERT 22 +#define IPV6_MTU_DISCOVER 23 +#define IPV6_MTU 24 +#define IPV6_RECVERR 25 +#define IPV6_V6ONLY 26 +#define IPV6_JOIN_ANYCAST 27 +#define IPV6_LEAVE_ANYCAST 28 +#define IPV6_MULTICAST_ALL 29 + +/* IPV6_MTU_DISCOVER values */ +#define IPV6_PMTUDISC_DONT 0 +#define IPV6_PMTUDISC_WANT 1 +#define IPV6_PMTUDISC_DO 2 +#define IPV6_PMTUDISC_PROBE 3 +/* same as IPV6_PMTUDISC_PROBE, provided for symetry with IPv4 + * also see comments on IP_PMTUDISC_INTERFACE + */ +#define IPV6_PMTUDISC_INTERFACE 4 +/* weaker version of IPV6_PMTUDISC_INTERFACE, which allows packets to + * get fragmented if they exceed the interface mtu + */ +#define IPV6_PMTUDISC_OMIT 5 + +/* Flowlabel */ +#define IPV6_FLOWLABEL_MGR 32 +#define IPV6_FLOWINFO_SEND 33 + +#define IPV6_IPSEC_POLICY 34 +#define IPV6_XFRM_POLICY 35 +#define IPV6_HDRINCL 36 +#endif + +/* + * Multicast: + * Following socket options are shared between IPv4 and IPv6. + * + * MCAST_JOIN_GROUP 42 + * MCAST_BLOCK_SOURCE 43 + * MCAST_UNBLOCK_SOURCE 44 + * MCAST_LEAVE_GROUP 45 + * MCAST_JOIN_SOURCE_GROUP 46 + * MCAST_LEAVE_SOURCE_GROUP 47 + * MCAST_MSFILTER 48 + */ + +/* + * Advanced API (RFC3542) (1) + * + * Note: IPV6_RECVRTHDRDSTOPTS does not exist. see net/ipv6/datagram.c. + */ + +#define IPV6_RECVPKTINFO 49 +#define IPV6_PKTINFO 50 +#define IPV6_RECVHOPLIMIT 51 +#define IPV6_HOPLIMIT 52 +#define IPV6_RECVHOPOPTS 53 +#define IPV6_HOPOPTS 54 +#define IPV6_RTHDRDSTOPTS 55 +#define IPV6_RECVRTHDR 56 +#define IPV6_RTHDR 57 +#define IPV6_RECVDSTOPTS 58 +#define IPV6_DSTOPTS 59 +#define IPV6_RECVPATHMTU 60 +#define IPV6_PATHMTU 61 +#define IPV6_DONTFRAG 62 +#if 0 /* not yet */ +#define IPV6_USE_MIN_MTU 63 +#endif + +/* + * Netfilter (1) + * + * Following socket options are used in ip6_tables; + * see include/linux/netfilter_ipv6/ip6_tables.h. + * + * IP6T_SO_SET_REPLACE / IP6T_SO_GET_INFO 64 + * IP6T_SO_SET_ADD_COUNTERS / IP6T_SO_GET_ENTRIES 65 + */ + +/* + * Advanced API (RFC3542) (2) + */ +#define IPV6_RECVTCLASS 66 +#define IPV6_TCLASS 67 + +/* + * Netfilter (2) + * + * Following socket options are used in ip6_tables; + * see include/linux/netfilter_ipv6/ip6_tables.h. + * + * IP6T_SO_GET_REVISION_MATCH 68 + * IP6T_SO_GET_REVISION_TARGET 69 + * IP6T_SO_ORIGINAL_DST 80 + */ + +#define IPV6_AUTOFLOWLABEL 70 +/* RFC5014: Source address selection */ +#define IPV6_ADDR_PREFERENCES 72 + +#define IPV6_PREFER_SRC_TMP 0x0001 +#define IPV6_PREFER_SRC_PUBLIC 0x0002 +#define IPV6_PREFER_SRC_PUBTMP_DEFAULT 0x0100 +#define IPV6_PREFER_SRC_COA 0x0004 +#define IPV6_PREFER_SRC_HOME 0x0400 +#define IPV6_PREFER_SRC_CGA 0x0008 +#define IPV6_PREFER_SRC_NONCGA 0x0800 + +/* RFC5082: Generalized Ttl Security Mechanism */ +#define IPV6_MINHOPCOUNT 73 + +#define IPV6_ORIGDSTADDR 74 +#define IPV6_RECVORIGDSTADDR IPV6_ORIGDSTADDR +#define IPV6_TRANSPARENT 75 +#define IPV6_UNICAST_IF 76 +#define IPV6_RECVFRAGSIZE 77 +#define IPV6_FREEBIND 78 + +/* + * Multicast Routing: + * see include/uapi/linux/mroute6.h. + * + * MRT6_BASE 200 + * ... + * MRT6_MAX + */ +#endif /* _UAPI_LINUX_IN6_H */ diff --git a/src/basic/meson.build b/src/basic/meson.build index 81c3d0f3e80..26c7fc42c76 100644 --- a/src/basic/meson.build +++ b/src/basic/meson.build @@ -98,6 +98,8 @@ basic_sources = files(''' linux/if_macsec.h linux/if_tun.h linux/if_tunnel.h + linux/in.h + linux/in6.h linux/libc-compat.h linux/netdevice.h linux/netlink.h ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/patches/amlogic/systemd-9999.4-backport.patch ================================================ From aa8129049564627fd9eb7866fa58c9bc9f47c672 Mon Sep 17 00:00:00 2001 From: Yu Watanabe <watanabe.yu+github@gmail.com> Date: Sat, 13 Apr 2019 18:35:15 +0900 Subject: [PATCH] linux: also import l2tp.h from kernel-5.0 The L2TP_ATTR_UDP_ZERO_CSUM6_{TX,RX} attributes are introduced by 6b649feafe10b293f4bd5a74aca95faf625ae525, which is included in kernel-3.16. To support older kernel, let's import the header. Fixes #12300. --- src/basic/linux/l2tp.h | 201 +++++++++++++++++++++++++++++++++++++++++ src/basic/meson.build | 1 + 2 files changed, 202 insertions(+) create mode 100644 src/basic/linux/l2tp.h diff --git a/src/basic/linux/l2tp.h b/src/basic/linux/l2tp.h new file mode 100644 index 00000000000..61158f5a1a5 --- /dev/null +++ b/src/basic/linux/l2tp.h @@ -0,0 +1,201 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * L2TP-over-IP socket for L2TPv3. + * + * Author: James Chapman <jchapman@katalix.com> + */ + +#ifndef _UAPI_LINUX_L2TP_H_ +#define _UAPI_LINUX_L2TP_H_ + +#include <linux/types.h> +#include <linux/socket.h> +#include <linux/in.h> +#include <linux/in6.h> + +#define IPPROTO_L2TP 115 + +/** + * struct sockaddr_l2tpip - the sockaddr structure for L2TP-over-IP sockets + * @l2tp_family: address family number AF_L2TPIP. + * @l2tp_addr: protocol specific address information + * @l2tp_conn_id: connection id of tunnel + */ +#define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */ +struct sockaddr_l2tpip { + /* The first fields must match struct sockaddr_in */ + __kernel_sa_family_t l2tp_family; /* AF_INET */ + __be16 l2tp_unused; /* INET port number (unused) */ + struct in_addr l2tp_addr; /* Internet address */ + + __u32 l2tp_conn_id; /* Connection ID of tunnel */ + + /* Pad to size of `struct sockaddr'. */ + unsigned char __pad[__SOCK_SIZE__ - + sizeof(__kernel_sa_family_t) - + sizeof(__be16) - sizeof(struct in_addr) - + sizeof(__u32)]; +}; + +/** + * struct sockaddr_l2tpip6 - the sockaddr structure for L2TP-over-IPv6 sockets + * @l2tp_family: address family number AF_L2TPIP. + * @l2tp_addr: protocol specific address information + * @l2tp_conn_id: connection id of tunnel + */ +struct sockaddr_l2tpip6 { + /* The first fields must match struct sockaddr_in6 */ + __kernel_sa_family_t l2tp_family; /* AF_INET6 */ + __be16 l2tp_unused; /* INET port number (unused) */ + __be32 l2tp_flowinfo; /* IPv6 flow information */ + struct in6_addr l2tp_addr; /* IPv6 address */ + __u32 l2tp_scope_id; /* scope id (new in RFC2553) */ + __u32 l2tp_conn_id; /* Connection ID of tunnel */ +}; + +/***************************************************************************** + * NETLINK_GENERIC netlink family. + *****************************************************************************/ + +/* + * Commands. + * Valid TLVs of each command are:- + * TUNNEL_CREATE - CONN_ID, pw_type, netns, ifname, ipinfo, udpinfo, udpcsum + * TUNNEL_DELETE - CONN_ID + * TUNNEL_MODIFY - CONN_ID, udpcsum + * TUNNEL_GETSTATS - CONN_ID, (stats) + * TUNNEL_GET - CONN_ID, (...) + * SESSION_CREATE - SESSION_ID, PW_TYPE, cookie, peer_cookie, l2spec + * SESSION_DELETE - SESSION_ID + * SESSION_MODIFY - SESSION_ID + * SESSION_GET - SESSION_ID, (...) + * SESSION_GETSTATS - SESSION_ID, (stats) + * + */ +enum { + L2TP_CMD_NOOP, + L2TP_CMD_TUNNEL_CREATE, + L2TP_CMD_TUNNEL_DELETE, + L2TP_CMD_TUNNEL_MODIFY, + L2TP_CMD_TUNNEL_GET, + L2TP_CMD_SESSION_CREATE, + L2TP_CMD_SESSION_DELETE, + L2TP_CMD_SESSION_MODIFY, + L2TP_CMD_SESSION_GET, + __L2TP_CMD_MAX, +}; + +#define L2TP_CMD_MAX (__L2TP_CMD_MAX - 1) + +/* + * ATTR types defined for L2TP + */ +enum { + L2TP_ATTR_NONE, /* no data */ + L2TP_ATTR_PW_TYPE, /* u16, enum l2tp_pwtype */ + L2TP_ATTR_ENCAP_TYPE, /* u16, enum l2tp_encap_type */ + L2TP_ATTR_OFFSET, /* u16 (not used) */ + L2TP_ATTR_DATA_SEQ, /* u16 (not used) */ + L2TP_ATTR_L2SPEC_TYPE, /* u8, enum l2tp_l2spec_type */ + L2TP_ATTR_L2SPEC_LEN, /* u8 (not used) */ + L2TP_ATTR_PROTO_VERSION, /* u8 */ + L2TP_ATTR_IFNAME, /* string */ + L2TP_ATTR_CONN_ID, /* u32 */ + L2TP_ATTR_PEER_CONN_ID, /* u32 */ + L2TP_ATTR_SESSION_ID, /* u32 */ + L2TP_ATTR_PEER_SESSION_ID, /* u32 */ + L2TP_ATTR_UDP_CSUM, /* u8 */ + L2TP_ATTR_VLAN_ID, /* u16 (not used) */ + L2TP_ATTR_COOKIE, /* 0, 4 or 8 bytes */ + L2TP_ATTR_PEER_COOKIE, /* 0, 4 or 8 bytes */ + L2TP_ATTR_DEBUG, /* u32, enum l2tp_debug_flags */ + L2TP_ATTR_RECV_SEQ, /* u8 */ + L2TP_ATTR_SEND_SEQ, /* u8 */ + L2TP_ATTR_LNS_MODE, /* u8 */ + L2TP_ATTR_USING_IPSEC, /* u8 */ + L2TP_ATTR_RECV_TIMEOUT, /* msec */ + L2TP_ATTR_FD, /* int */ + L2TP_ATTR_IP_SADDR, /* u32 */ + L2TP_ATTR_IP_DADDR, /* u32 */ + L2TP_ATTR_UDP_SPORT, /* u16 */ + L2TP_ATTR_UDP_DPORT, /* u16 */ + L2TP_ATTR_MTU, /* u16 (not used) */ + L2TP_ATTR_MRU, /* u16 (not used) */ + L2TP_ATTR_STATS, /* nested */ + L2TP_ATTR_IP6_SADDR, /* struct in6_addr */ + L2TP_ATTR_IP6_DADDR, /* struct in6_addr */ + L2TP_ATTR_UDP_ZERO_CSUM6_TX, /* flag */ + L2TP_ATTR_UDP_ZERO_CSUM6_RX, /* flag */ + L2TP_ATTR_PAD, + __L2TP_ATTR_MAX, +}; + +#define L2TP_ATTR_MAX (__L2TP_ATTR_MAX - 1) + +/* Nested in L2TP_ATTR_STATS */ +enum { + L2TP_ATTR_STATS_NONE, /* no data */ + L2TP_ATTR_TX_PACKETS, /* u64 */ + L2TP_ATTR_TX_BYTES, /* u64 */ + L2TP_ATTR_TX_ERRORS, /* u64 */ + L2TP_ATTR_RX_PACKETS, /* u64 */ + L2TP_ATTR_RX_BYTES, /* u64 */ + L2TP_ATTR_RX_SEQ_DISCARDS, /* u64 */ + L2TP_ATTR_RX_OOS_PACKETS, /* u64 */ + L2TP_ATTR_RX_ERRORS, /* u64 */ + L2TP_ATTR_STATS_PAD, + __L2TP_ATTR_STATS_MAX, +}; + +#define L2TP_ATTR_STATS_MAX (__L2TP_ATTR_STATS_MAX - 1) + +enum l2tp_pwtype { + L2TP_PWTYPE_NONE = 0x0000, + L2TP_PWTYPE_ETH_VLAN = 0x0004, + L2TP_PWTYPE_ETH = 0x0005, + L2TP_PWTYPE_PPP = 0x0007, + L2TP_PWTYPE_PPP_AC = 0x0008, + L2TP_PWTYPE_IP = 0x000b, + __L2TP_PWTYPE_MAX +}; + +enum l2tp_l2spec_type { + L2TP_L2SPECTYPE_NONE, + L2TP_L2SPECTYPE_DEFAULT, +}; + +enum l2tp_encap_type { + L2TP_ENCAPTYPE_UDP, + L2TP_ENCAPTYPE_IP, +}; + +/* For L2TP_ATTR_DATA_SEQ. Unused. */ +enum l2tp_seqmode { + L2TP_SEQ_NONE = 0, + L2TP_SEQ_IP = 1, + L2TP_SEQ_ALL = 2, +}; + +/** + * enum l2tp_debug_flags - debug message categories for L2TP tunnels/sessions + * + * @L2TP_MSG_DEBUG: verbose debug (if compiled in) + * @L2TP_MSG_CONTROL: userspace - kernel interface + * @L2TP_MSG_SEQ: sequence numbers + * @L2TP_MSG_DATA: data packets + */ +enum l2tp_debug_flags { + L2TP_MSG_DEBUG = (1 << 0), + L2TP_MSG_CONTROL = (1 << 1), + L2TP_MSG_SEQ = (1 << 2), + L2TP_MSG_DATA = (1 << 3), +}; + +/* + * NETLINK_GENERIC related info + */ +#define L2TP_GENL_NAME "l2tp" +#define L2TP_GENL_VERSION 0x1 +#define L2TP_GENL_MCGROUP "l2tp" + +#endif /* _UAPI_LINUX_L2TP_H_ */ diff --git a/src/basic/meson.build b/src/basic/meson.build index 26c7fc42c76..67f04bcbc4b 100644 --- a/src/basic/meson.build +++ b/src/basic/meson.build @@ -100,6 +100,7 @@ basic_sources = files(''' linux/if_tunnel.h linux/in.h linux/in6.h + linux/l2tp.h linux/libc-compat.h linux/netdevice.h linux/netlink.h ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/patches/systemd-0001-move-etc-systemd-system-to-storage-.config-system.d.patch ================================================ commit abce2c21148f981034acf143a3c12e5919949198 Author: Lukas Rusak <lorusak@gmail.com> Date: Mon Oct 9 15:26:58 2017 -0700 move /etc/systemd/system to /storage/.config/system.d diff --git a/meson.build b/meson.build index f7a610a..b1144a6 100644 --- a/meson.build +++ b/meson.build @@ -146,7 +146,7 @@ if pamconfdir == '' endif conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir) -conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system')) +conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', '/storage/.config/system.d') conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir) conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path) conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/patches/systemd-0002-move-hwdb.bin-to-run.patch ================================================ From bf2776b7f9403057cb82c2697e4fca8b554db4bd Mon Sep 17 00:00:00 2001 From: MilhouseVH <milhouseVH.github@nmacleod.com> Date: Thu, 11 Apr 2019 20:00:05 +0100 Subject: [PATCH] move hwdb.bin to /run --- 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/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 79fe1a8..0acbf71 100644 --- a/src/libsystemd/sd-hwdb/sd-hwdb.c +++ b/src/libsystemd/sd-hwdb/sd-hwdb.c @@ -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" #if HAVE_SPLIT_USR "/lib/systemd/hwdb/hwdb.bin\0" 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] -- 2.14.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/patches/systemd-0003-remove-nonexistant-dependency.patch ================================================ From 382709612ae03d6f81049ac72ac2dabd7613763d Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Wed, 18 Feb 2015 18:23:47 +0200 Subject: [PATCH 7/8] remove nonexistant dependency --- units/graphical.target | 1 - 1 file changed, 1 deletion(-) diff --git a/units/graphical.target b/units/graphical.target index 87be97e..b01b46d 100644 --- a/units/graphical.target +++ b/units/graphical.target @@ -9,7 +9,6 @@ Description=Graphical Interface Documentation=man:systemd.special(7) Requires=multi-user.target -Wants=display-manager.service Conflicts=rescue.service rescue.target After=multi-user.target rescue.service rescue.target display-manager.service AllowIsolate=yes -- 1.7.10.4 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/patches/systemd-0200-persist-persistent-timer-stamps.patch ================================================ From c1bcb16c35724404d30fab53017b757c886e9ab7 Mon Sep 17 00:00:00 2001 From: MilhouseVH <milhouseVH.github@nmacleod.com> Date: Mon, 8 Jan 2018 13:46:51 +0000 Subject: [PATCH] timers: use a persistent filesystem for persistent timers --- src/core/timer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/timer.c b/src/core/timer.c index 03935ee..bfd5c02 100644 --- a/src/core/timer.c +++ b/src/core/timer.c @@ -154,11 +154,11 @@ static int timer_setup_persistent(Timer *t) { if (MANAGER_IS_SYSTEM(UNIT(t)->manager)) { - r = unit_require_mounts_for(UNIT(t), "/var/lib/systemd/timers", UNIT_DEPENDENCY_FILE); + r = unit_require_mounts_for(UNIT(t), "/storage/.cache/systemd/timers", UNIT_DEPENDENCY_FILE); if (r < 0) return r; - t->stamp_path = strappend("/var/lib/systemd/timers/stamp-", UNIT(t)->id); + t->stamp_path = strappend("/storage/.cache/systemd/timers/stamp-", UNIT(t)->id); } else { const char *e; -- 2.14.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/patches/systemd-0300-config-env-unhide-cursor.patch ================================================ From 49285dae6756b22bc6881c04939f7c43c35b5506 Mon Sep 17 00:00:00 2001 From: MilhouseVH <milhouseVH.github@nmacleod.com> Date: Sat, 29 Jun 2019 00:26:41 +0100 Subject: [PATCH] debug-shell: configure environment, unhide cursor --- units/debug-shell.service.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/units/debug-shell.service.in b/units/debug-shell.service.in index 1127e68..4c3e971 100644 --- a/units/debug-shell.service.in +++ b/units/debug-shell.service.in @@ -16,8 +16,8 @@ IgnoreOnIsolate=yes ConditionPathExists=@DEBUGTTY@ [Service] -Environment=TERM=linux -ExecStart=@SUSHELL@ +Environment=ENV=/etc/profile +ExecStart=/bin/sh -c 'echo -en "\033[?25h"; exec /bin/sh' Restart=always RestartSec=0 StandardInput=tty -- 2.14.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/patches/systemd-0400-eat-up-rrdrand-on-amd.patch ================================================ From 0c0e3b8ec413a5b8151ad111b08c84ad07f1891b Mon Sep 17 00:00:00 2001 From: Lennart Poettering <lennart@poettering.net> Date: Tue, 7 May 2019 18:51:26 -0400 Subject: [PATCH 1/3] random-util: rename "err" to "success" After all rdrand returns 1 on success, and 0 on failure, hence let's name this accordingly. --- src/basic/random-util.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/basic/random-util.c b/src/basic/random-util.c index ca25fd2..f992c0c 100644 --- a/src/basic/random-util.c +++ b/src/basic/random-util.c @@ -34,7 +34,7 @@ int rdrand(unsigned long *ret) { #if defined(__i386__) || defined(__x86_64__) static int have_rdrand = -1; - unsigned char err; + uint8_t success; if (have_rdrand < 0) { uint32_t eax, ebx, ecx, edx; @@ -54,9 +54,9 @@ int rdrand(unsigned long *ret) { asm volatile("rdrand %0;" "setc %1" : "=r" (*ret), - "=qm" (err)); - msan_unpoison(&err, sizeof(err)); - if (!err) + "=qm" (success)); + msan_unpoison(&success, sizeof(sucess)); + if (!success) return -EAGAIN; return 0; -- 2.14.1 From 78b5b76ad2c82a9d184dfa777ac116bdf22189eb Mon Sep 17 00:00:00 2001 From: Evgeny Vereshchagin <evvers@ya.ru> Date: Wed, 8 May 2019 15:50:53 +0200 Subject: [PATCH 2/3] util-lib: fix a typo in rdrand Otherwise, the fuzzers will fail to compile with MSan: ``` ../../src/systemd/src/basic/random-util.c:64:40: error: use of undeclared identifier 'sucess'; did you mean 'success'? msan_unpoison(&success, sizeof(sucess)); ^~~~~~ success ../../src/systemd/src/basic/alloc-util.h:169:50: note: expanded from macro 'msan_unpoison' ^ ../../src/systemd/src/basic/random-util.c:38:17: note: 'success' declared here uint8_t success; ^ 1 error generated. [80/545] Compiling C object 'src/basic/a6ba3eb@@basic@sta/process-util.c.o'. ninja: build stopped: subcommand failed. Fuzzers build failed ``` --- src/basic/random-util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/random-util.c b/src/basic/random-util.c index f992c0c..d67aa09 100644 --- a/src/basic/random-util.c +++ b/src/basic/random-util.c @@ -55,7 +55,7 @@ int rdrand(unsigned long *ret) { "setc %1" : "=r" (*ret), "=qm" (success)); - msan_unpoison(&success, sizeof(sucess)); + msan_unpoison(&success, sizeof(success)); if (!success) return -EAGAIN; -- 2.14.1 From b0497c3005cc3a7975362d7e70d9ae2d0ffa6154 Mon Sep 17 00:00:00 2001 From: Lennart Poettering <lennart@poettering.net> Date: Fri, 10 May 2019 15:16:16 -0400 Subject: [PATCH 3/3] random-util: eat up bad RDRAND values seen on AMD CPUs An ugly, ugly work-around for #11810. And no, we shouldn't have to do this. This is something for AMD, the firmware or the kernel to fix/work-around, not us. But nonetheless, this should do it for now. Fixes: #11810 --- src/basic/random-util.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/basic/random-util.c b/src/basic/random-util.c index d67aa09..bd148ee 100644 --- a/src/basic/random-util.c +++ b/src/basic/random-util.c @@ -34,6 +34,7 @@ int rdrand(unsigned long *ret) { #if defined(__i386__) || defined(__x86_64__) static int have_rdrand = -1; + unsigned long v; uint8_t success; if (have_rdrand < 0) { @@ -53,12 +54,24 @@ int rdrand(unsigned long *ret) { asm volatile("rdrand %0;" "setc %1" - : "=r" (*ret), + : "=r" (v), "=qm" (success)); msan_unpoison(&success, sizeof(success)); if (!success) return -EAGAIN; + /* Apparently on some AMD CPUs RDRAND will sometimes (after a suspend/resume cycle?) report success + * via the carry flag but nonetheless return the same fixed value -1 in all cases. This appears to be + * a bad bug in the CPU or firmware. Let's deal with that and work-around this by explicitly checking + * for this special value (and also 0, just to be sure) and filtering it out. This is a work-around + * only however and something AMD really should fix properly. The Linux kernel should probably work + * around this issue by turning off RDRAND altogether on those CPUs. See: + * https://github.com/systemd/systemd/issues/11810 */ + if (v == 0 || v == ULONG_MAX) + return log_debug_errno(SYNTHETIC_ERRNO(EUCLEAN), + "RDRAND returned suspicious value %lx, assuming bad hardware RNG, not using value.", v); + + *ret = v; return 0; #else return -EOPNOTSUPP; -- 2.14.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/patches/systemd-0500-Add-working-directory-storage-for-debug-shell.patch ================================================ From c38a2fc53e5ebb3fc4637a168408591003aad0fb Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Mon, 30 Sep 2019 12:20:00 +0200 Subject: [PATCH] Add working directory '/storage' for debug-shell --- units/debug-shell.service.in | 1 + 1 file changed, 1 insertion(+) diff --git a/units/debug-shell.service.in b/units/debug-shell.service.in index 9f3868e106..d5f93f18a6 100644 --- a/units/debug-shell.service.in +++ b/units/debug-shell.service.in @@ -16,6 +16,7 @@ IgnoreOnIsolate=yes ConditionPathExists=@DEBUGTTY@ [Service] +WorkingDirectory=/storage Environment=ENV=/etc/profile ExecStart=/bin/sh -c 'echo -en "\033[?25h"; exec /bin/sh' Restart=always -- 2.17.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/patches/systemd-0900-backport-do-not-update-exec-deps-on-mountinfo-changes.patch ================================================ From 9074b57fd5a5c8ae20b15b59ed9abe9a7f0147b0 Mon Sep 17 00:00:00 2001 From: Lennart Poettering <lennart@poettering.net> Date: Fri, 15 Nov 2019 14:00:54 +0100 Subject: [PATCH] mount: do not update exec deps on mountinfo changes Fixes: #13978 --- src/core/mount.c | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/src/core/mount.c b/src/core/mount.c index 1d1d2683da4..dfed691c43f 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -550,6 +550,32 @@ static int mount_verify(Mount *m) { return 0; } +static int mount_add_non_exec_dependencies(Mount *m) { + int r; + assert(m); + + /* Adds in all dependencies directly responsible for ordering the mount, as opposed to dependencies + * resulting from the ExecContext and such. */ + + r = mount_add_device_dependencies(m); + if (r < 0) + return r; + + r = mount_add_mount_dependencies(m); + if (r < 0) + return r; + + r = mount_add_quota_dependencies(m); + if (r < 0) + return r; + + r = mount_add_default_dependencies(m); + if (r < 0) + return r; + + return 0; +} + static int mount_add_extras(Mount *m) { Unit *u = UNIT(m); int r; @@ -577,18 +603,6 @@ static int mount_add_extras(Mount *m) { return r; } - r = mount_add_device_dependencies(m); - if (r < 0) - return r; - - r = mount_add_mount_dependencies(m); - if (r < 0) - return r; - - r = mount_add_quota_dependencies(m); - if (r < 0) - return r; - r = unit_patch_contexts(u); if (r < 0) return r; @@ -601,7 +615,7 @@ static int mount_add_extras(Mount *m) { if (r < 0) return r; - r = mount_add_default_dependencies(m); + r = mount_add_non_exec_dependencies(m); if (r < 0) return r; @@ -1574,7 +1588,7 @@ static int mount_setup_existing_unit( unit_remove_dependencies(u, UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT); - r = mount_add_extras(MOUNT(u)); + r = mount_add_non_exec_dependencies(MOUNT(u)); if (r < 0) return r; } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/profile.d/90-systemd.conf ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) export SYSTEMD_COLORS=0 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/scripts/kernel-overlays-setup ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) SYSTEM_OVERLAYS_DIR=/usr/lib/kernel-overlays OVERLAY_CONFIG_DIR=/storage/.cache/kernel-overlays KVER=$(uname -r) MODULES_DIR="/var/lib/modules/${KVER}" FIRMWARE_DIR="/var/lib/firmware" USER_FIRMWARE_DIR="/storage/.config/firmware" mkdir -p "${MODULES_DIR}" mkdir -p "${FIRMWARE_DIR}" mkdir -p "${OVERLAY_CONFIG_DIR}" log() { echo "kernel-overlays-setup: $@" > /dev/kmsg } apply_overlay() { case "$1" in /*) modules_overlay_dir="${1}/lib/modules/${KVER}" firmware_overlay_dir="${1}/lib/firmware" ;; *) modules_overlay_dir="${SYSTEM_OVERLAYS_DIR}/${1}/lib/modules/${KVER}" firmware_overlay_dir="${SYSTEM_OVERLAYS_DIR}/${1}/lib/firmware" ;; esac if [ -d "${modules_overlay_dir}" ] ; then GOT_MODULE_OVERLAY="yes" if cp -rfs "${modules_overlay_dir}"/* "${MODULES_DIR}" ; then log "added modules from $modules_overlay_dir" else log "failed to add modules from $modules_overlay_dir" fi fi if [ -d "${firmware_overlay_dir}" ] ; then if cp -rfs "${firmware_overlay_dir}"/* "${FIRMWARE_DIR}" ; then log "added firmware from $firmware_overlay_dir" else log "failed to add firmware from $firmware_overlay_dir" fi fi } # setup system base modules log "setup base modules" apply_overlay base # apply user-configured module overlays if [ -d "${OVERLAY_CONFIG_DIR}" ] ; then log "adding overlays from ${OVERLAY_CONFIG_DIR}" GOT_MODULE_OVERLAY="no" for conf in "${OVERLAY_CONFIG_DIR}/"*.conf ; do if [ -e "$conf" ] ; then log "processing conf $conf" overlay=$(cat "$conf") [ -n "$overlay" ] && apply_overlay "$overlay" fi done if [ "yes" = "$GOT_MODULE_OVERLAY" ] ; then log "running depmod" /usr/sbin/depmod -a fi fi if [ -d "${USER_FIRMWARE_DIR}" ] && [ -n "$(ls ${USER_FIRMWARE_DIR})" ] ; then if cp -rfs "${USER_FIRMWARE_DIR}"/* "${FIRMWARE_DIR}" ; then log "added firmware from ${USER_FIRMWARE_DIR}" else log "failed to add firmware from ${USER_FIRMWARE_DIR}" fi fi log "done" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/scripts/network-base-setup ================================================ #!/bin/sh # setup hostname if [ -f /storage/.cache/hostname ]; then cat /storage/.cache/hostname > /proc/sys/kernel/hostname fi # setup /etc/hosts rm -f /run/libreelec/hosts if [ -f /storage/.config/hosts.conf ]; then cat /storage/.config/hosts.conf > /run/libreelec/hosts fi # setup /etc/resolv.conf rm -f /run/libreelec/resolv.conf if [ -f /storage/.config/resolv.conf ]; then cat /storage/.config/resolv.conf > /run/libreelec/resolv.conf elif [ -f /dev/.kernel_ipconfig -a -f /proc/net/pnp ]; then cat /proc/net/pnp > /run/libreelec/resolv.conf else cat << EOF > /run/libreelec/resolv.conf nameserver 8.8.8.8 nameserver 8.8.4.4 EOF fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/scripts/systemd-machine-id-setup ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) # remove old machine-id file [[ -f "/storage/.cache/machine-id" ]] && rm /storage/.cache/machine-id # test systemd-machine-id exists and is 32 hex chars or generate a new uuid MACHINEID="$(cat /storage/.cache/systemd-machine-id 2>/dev/null)" [ "${#MACHINEID}" != "32" ] && MACHINEID= [[ "${MACHINEID//[a-f0-9]/}" != "" ]] && MACHINEID= [ -z "${MACHINEID}" ] && MACHINEID=$(/usr/bin/dbus-uuidgen) # persist uuid mkdir -p /storage/.cache echo "$MACHINEID" > /storage/.cache/systemd-machine-id ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/scripts/systemd-timesyncd-setup ================================================ #!/bin/sh KERNEL_NTP="${1:-/proc/net/ipconfig/ntp_servers}" NTP_SERVERS="" if [ -f /proc/net/ipconfig/ntp_servers ]; then for srv in $(cat /proc/net/ipconfig/ntp_servers); do if [ -n "$srv" -a "$srv" != "0.0.0.0" ]; then if [ -z "$NTP_SERVERS" ]; then NTP_SERVERS="$srv" else NTP_SERVERS="${NTP_SERVERS} $srv" fi fi done if [ -n "$NTP_SERVERS" ]; then mkdir -p /run/systemd/timesyncd.conf.d/ cat << EOF > /run/systemd/timesyncd.conf.d/kernel-ntp-servers.conf [Time] NTP=$NTP_SERVERS EOF fi fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/scripts/usercache-setup ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Fix bug in older versions creating file /storage/.cache/services [ -f /storage/.cache/services ] && rm /storage/.cache/services && mkdir -p /storage/.cache/services # Copy cache files, but don't overwrite false | cp -iRp /usr/cache/* /storage/.cache/ &>/dev/null # Merge default and custom shadow file details if [ -f /storage/.cache/shadow -a -f /usr/cache/shadow ]; then # Get existing root details (possibly user defined) userroot="$(grep "^root:" /storage/.cache/shadow)" # Overwrite users shadow file with default details, replacing root with any existing value # If current file is garbage (ie. missing root) then replace it if [ -n "${userroot}" ]; then sed -e "s ^root:.* ${userroot} " /usr/cache/shadow >/storage/.cache/shadow else cp -fp /usr/cache/shadow /storage/.cache/shadow fi # Make sure we have the correct permission chmod 000 /storage/.cache/shadow fi ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/scripts/userconfig-setup ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Remove those sample files that we manage for sample in $(find /storage/.config -name '*.sample' 2>/dev/null); do [ -f /usr/config/${sample:16} ] && rm -f ${sample} done # Copy config files, but don't overwrite - this should replace our sample files false | cp -iRp /usr/config/* /storage/.config/ &>/dev/null ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/system.d/debugconfig.service ================================================ [Unit] Description=Setup debug config DefaultDependencies=no After=systemd-tmpfiles-setup.service ConditionKernelCommandLine=|debugging ConditionPathExists=|/storage/.cache/debug.libreelec [Service] Type=oneshot ExecStart=/bin/sh -c 'cp /usr/share/debugconf/*.conf /run/libreelec/debug' RemainAfterExit=yes [Install] WantedBy=sysinit.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/system.d/flash.mount.d/dependencies.conf ================================================ [Unit] DefaultDependencies=no ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/system.d/hwdb.service ================================================ [Unit] Description=Update hwdb.bin DefaultDependencies=no After=systemd-tmpfiles-setup.service Before=systemd-udevd.service [Service] Type=oneshot ExecStart=-/usr/bin/udevadm hwdb --update [Install] WantedBy=basic.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/system.d/kernel-overlays.service ================================================ [Unit] Description=Create kernel modules tree from overlays DefaultDependencies=no After=var.mount Before=systemd-udevd.service systemd-udev-trigger.service systemd-modules-load.service systemd-remount-fs.service swap.service machine-id.service kmod-static-nodes.service [Service] Type=oneshot ExecStart=/usr/sbin/kernel-overlays-setup [Install] WantedBy=local-fs.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/system.d/machine-id.service ================================================ [Unit] Description=Setup machine-id DefaultDependencies=no Before=systemd-journald.service systemd-tmpfiles-setup-dev.service [Service] Type=oneshot ExecStart=/usr/bin/systemd-machine-id-setup RemainAfterExit=yes [Install] WantedBy=sysinit.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/system.d/network-base.service ================================================ [Unit] Description=Base Network Configuration DefaultDependencies=no After=local-fs.target systemd-tmpfiles-setup.service userconfig.service [Service] Type=oneshot ExecStart=/usr/sbin/network-base-setup RemainAfterExit=yes [Install] WantedBy=network.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/system.d/storage.mount.d/dependencies.conf ================================================ [Unit] DefaultDependencies=no ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/system.d/systemd-timesyncd-setup.service ================================================ [Unit] Description=Setup NTP servers for timesyncd DefaultDependencies=no After=systemd-remount-fs.service systemd-sysusers.service [Service] Type=oneshot ExecStart=/usr/sbin/systemd-timesyncd-setup RemainAfterExit=yes [Install] WantedBy=sysinit.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/system.d/systemd-timesyncd.service.d/depend-on-kernel-ip-config.conf ================================================ [Unit] ConditionPathExists=/dev/.kernel_ipconfig After=systemd-timesyncd-setup.service network-base.service ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/system.d/usercache.service ================================================ [Unit] Description=Setup User cache dir DefaultDependencies=no After=systemd-tmpfiles-setup.service [Service] Type=oneshot ExecStart=/usr/bin/usercache-setup RemainAfterExit=yes [Install] WantedBy=sysinit.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/system.d/userconfig.service ================================================ [Unit] Description=Setup User config dir DefaultDependencies=no After=systemd-tmpfiles-setup.service [Service] Type=oneshot ExecStart=/usr/bin/userconfig-setup RemainAfterExit=yes [Install] WantedBy=sysinit.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/tmpfiles.d/z_01_openelec.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) d /run/libreelec 0755 root root - - d /run/libreelec/debug 0755 root root - - ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/udev.d/51-these-are-not-joysticks.rules ================================================ # /etc/udev/rules.d/51-these-are-not-joysticks.rules # # This file is auto-generated. For more information: # https://github.com/denilsonsa/udev-joystick-blacklist SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="009d", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="009d", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00b0", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00b0", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00b4", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00b4", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="0730", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="0730", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="0745", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="0745", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="0748", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="0748", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="0750", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="0750", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="0768", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="0768", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="0773", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="0773", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="07a5", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="07a5", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="07b2", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="07b2", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="0800", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="0800", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c30a", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c30a", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="a0df", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="a0df", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0010", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0010", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0011", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0011", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0012", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0012", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0013", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0013", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0014", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0014", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0015", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0015", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0016", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0016", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0017", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0017", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0018", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0018", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0019", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0019", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d1", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d1", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="030e", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="030e", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="054f", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="054f", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="1410", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="1410", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="3043", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="3043", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="31b5", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="31b5", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="3997", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="3997", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="3f8b", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="3f8b", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="51f4", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="51f4", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="5589", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="5589", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="7b22", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="7b22", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="7f2d", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="7f2d", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="8090", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="8090", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="9033", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="9033", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="9066", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="9066", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="9090", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="9090", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="90c0", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="90c0", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="f012", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="f012", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="f32a", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="f32a", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="f613", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="f613", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="f624", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="09da", ATTRS{idProduct}=="f624", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="1b1c", ATTRS{idProduct}=="1b3c", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="1b1c", ATTRS{idProduct}=="1b3c", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="1d57", ATTRS{idProduct}=="ad03", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="1d57", ATTRS{idProduct}=="ad03", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="1e7d", ATTRS{idProduct}=="2e4a", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="1e7d", ATTRS{idProduct}=="2e4a", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="422d", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="422d", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="2516", ATTRS{idProduct}=="001f", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="2516", ATTRS{idProduct}=="001f", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="2516", ATTRS{idProduct}=="0028", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{idVendor}=="2516", ATTRS{idProduct}=="0028", KERNEL=="js[0-9]*", MODE="0000", ENV{ID_INPUT_JOYSTICK}="" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/udev.d/60-not-joysticks.rules ================================================ SUBSYSTEM=="input", ATTRS{name}=="aml_keypad", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" SUBSYSTEM=="input", ATTRS{name}=="Remote+", ENV{ID_INPUT_JOYSTICK}=="?*", ENV{ID_INPUT_JOYSTICK}="" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/systemd/udev.d/80-clock.rules ================================================ ACTION=="add", SUBSYSTEM=="rtc", RUN+="/sbin/hwclock --hctosys --utc --rtc=/dev/%k" ACTION=="add", ENV{MAJOR}=="10", ENV{MINOR}=="135", RUN+="/sbin/hwclock --hctosys --utc --rtc=/dev/%k" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/u-boot/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot" PKG_VERSION="1.0" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" PKG_CANUPDATE="${PROJECT}*" [ ${PROJECT} = "Amlogic-ce" ] && PKG_CANUPDATE="${DEVICE}*" PKG_NEED_UNPACK="$PROJECT_DIR/$PROJECT/bootloader " for PKG_SUBDEVICE in $SUBDEVICES; do PKG_DEPENDS_TARGET+=" u-boot-${PKG_SUBDEVICE}" PKG_NEED_UNPACK+=" $(get_pkg_directory u-boot-${PKG_SUBDEVICE})" done make_target() { : # nothing } makeinstall_target() { mkdir -p $INSTALL/usr/share/bootloader # Always install the update script find_file_path bootloader/update.sh && cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader sed -e "s/@KERNEL_NAME@/$KERNEL_NAME/g" \ -e "s/@LEGACY_KERNEL_NAME@/$LEGACY_KERNEL_NAME/g" \ -e "s/@LEGACY_DTB_NAME@/$LEGACY_DTB_NAME/g" \ -i $INSTALL/usr/share/bootloader/update.sh # Always install the canupdate script if find_file_path bootloader/canupdate.sh; then cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader fi for PKG_SUBDEVICE in $SUBDEVICES; do find_file_path bootloader/${PKG_SUBDEVICE}_boot.ini && cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader if [ $PKG_SUBDEVICE = "Odroid_C2" ]; then PKG_UBOOTBIN=$(get_build_dir u-boot-${PKG_SUBDEVICE})/u-boot.bin else PKG_UBOOTBIN=$(get_build_dir u-boot-${PKG_SUBDEVICE})/fip/u-boot.bin.sd.bin fi cp -av ${PKG_UBOOTBIN} $INSTALL/usr/share/bootloader/${PKG_SUBDEVICE}_u-boot PKG_CANUPDATE+="|${PKG_SUBDEVICE}*" done find_file_path bootloader/config.ini && cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader sed -e "s/@PROJECT@/${PKG_CANUPDATE}/g" \ -i $INSTALL/usr/share/bootloader/canupdate.sh find_file_path splash/boot-logo.bmp.gz && cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader find_file_path splash/boot-logo-1080.bmp.gz && cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader find_file_path splash/timeout-logo-1080.bmp.gz && cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/u-boot-LePotato/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-LePotato" PKG_VERSION="de12d9be7324f7d26b8721de1eb64715b444bdad" PKG_SHA256="f71d5ecb5e11f6f531ae0182c8f1de55468f990c46afdc5a8361b5311bf7da74" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" configure_package() { PKG_UBOOT_CONFIG="libretech_cc_defconfig" } pre_make_target() { sed -i "s|arm-none-eabi-|arm-eabi-|g" $PKG_BUILD/Makefile $PKG_BUILD/arch/arm/cpu/armv8/gx*/firmware/scp_task/Makefile 2>/dev/null || true } make_target() { [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/:$TOOLCHAIN/lib/gcc-linaro-arm-eabi/bin/:$PATH DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make $PKG_UBOOT_CONFIG DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make HOSTCC="$HOST_CC" HOSTSTRIP="true" } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/u-boot-Odroid_C2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot-Odroid_C2" PKG_VERSION="a2eb29f823e8cfc6fee325f69116334c6f1ba6c0" PKG_SHA256="a7b9d7dc7f3048dc5479dc90c094760d03f4a8e83db86823d8f951f53641cf69" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://github.com/CoreELEC/u-boot/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host u-boot_firmware" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" configure_package() { PKG_UBOOT_CONFIG="odroidc2_defconfig" } pre_configure_target() { cp -r $(get_build_dir u-boot_firmware)/* $PKG_BUILD } pre_make_target() { sed -i "s|arm-none-eabi-|arm-eabi-|g" $PKG_BUILD/Makefile $PKG_BUILD/arch/arm/cpu/armv8/gx*/firmware/scp_task/Makefile 2>/dev/null || true } make_target() { [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/:$TOOLCHAIN/lib/gcc-linaro-arm-eabi/bin/:$PATH DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make $PKG_UBOOT_CONFIG DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make HOSTCC="$HOST_CC" HOSTSTRIP="true" } makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/u-boot-tools-aml/config/fw_env.config ================================================ # Configuration file for fw_(printenv/setenv) utility. # Up to two entries are valid, in this case the redundant # environment sector is assumed present. # Notice, that the "Number of sectors" is not required on NOR and SPI-dataflash. # Futhermore, if the Flash sector size is ommitted, this value is assumed to # be the same as the Environment size, which is valid for NOR and SPI-dataflash # NOR example # MTD device name Device offset Env. size Flash sector size Number of sectors #/dev/mtd1 0x0000 0x4000 0x4000 #/dev/mtd2 0x0000 0x4000 0x4000 # MTD SPI-dataflash example # MTD device name Device offset Env. size Flash sector size Number of sectors #/dev/mtd5 0x4200 0x4200 #/dev/mtd6 0x4200 0x4200 # NAND example #/dev/mtd0 0x4000 0x4000 0x20000 2 # Block device example #/dev/mmcblk0 0xc0000 0x20000 # VFAT example #/boot/uboot.env 0x0000 0x4000 # Amlogic NAND /dev/nand_env 0x000000 0x10000 0x10000 # Amlogic eMMC /dev/env 0x000000 0x10000 0x10000 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/u-boot-tools-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="u-boot-tools-aml" PKG_VERSION="2016.03" PKG_SHA256="e49337262ecac44dbdeac140f2c6ebd1eba345e0162b0464172e7f05583ed7bb" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="ftp://ftp.denx.de/pub/u-boot/u-boot-$PKG_VERSION.tar.bz2" PKG_DEPENDS_HOST="gcc:host" PKG_DEPENDS_TARGET="toolchain u-boot-tools-aml:host" PKG_LICENSE="GPL" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." make_host() { make mrproper make dummy_defconfig make tools-only } make_target() { CROSS_COMPILE="$TARGET_PREFIX" LDFLAGS="" ARCH=arm make dummy_defconfig CROSS_COMPILE="$TARGET_PREFIX" LDFLAGS="" ARCH=arm make env } makeinstall_host() { mkdir -p $TOOLCHAIN/bin cp tools/mkimage $TOOLCHAIN/bin } makeinstall_target() { mkdir -p $INSTALL/etc cp $PKG_DIR/config/fw_env.config $INSTALL/etc/fw_env.config mkdir -p $INSTALL/usr/sbin cp tools/env/fw_printenv $INSTALL/usr/sbin/fw_printenv cp tools/env/fw_printenv $INSTALL/usr/sbin/fw_setenv } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/u-boot-tools-aml/patches/u-boot-tools-0001-dummy_defconfig.patch ================================================ --- a/configs/dummy_defconfig +++ b/configs/dummy_defconfig @@ -0,0 +1,2 @@ +CONFIG_ARM=y + ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/u-boot-tools-aml/patches/u-boot-tools-0002-allow-multiple-entries.patch ================================================ --- u-boot-tools-2016.01/tools/env/fw_env.c.orig 2016-01-12 15:06:54.000000000 +0100 +++ u-boot-tools-2016.01/tools/env/fw_env.c 2016-03-22 09:47:07.014381827 +0100 @@ -1453,6 +1453,7 @@ int rc; char dump[128]; char *devname; + int fd_test; fp = fopen (fname, "r"); if (fp == NULL) @@ -1473,6 +1474,12 @@ if (rc < 3) continue; + fd_test = open (devname, O_RDWR); + if (fd_test < 0) + continue; + if (close (fd_test)) + continue; + DEVNAME(i) = devname; if (rc < 4) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/u-boot-tools-aml/patches/u-boot-tools-0003-nand_env-hack.patch ================================================ diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index 8b0317a..575f12a 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -888,12 +888,13 @@ static int flash_write_buf (int dev, int fd, void *buf, size_t count, } } - if (lseek (fd, blockstart, SEEK_SET) == -1) { - fprintf (stderr, - "Seek error on %s: %s\n", - DEVNAME (dev), strerror (errno)); - return -1; - } + if (blockstart != 0) + if (lseek (fd, blockstart, SEEK_SET) == -1) { + fprintf (stderr, + "Seek error on %s: %s\n", + DEVNAME (dev), strerror (errno)); + return -1; + } #ifdef DEBUG fprintf(stderr, "Write 0x%x bytes at 0x%llx\n", erasesize, @@ -1025,25 +1026,8 @@ static int flash_read (int fd) return -1; } - if (S_ISCHR(st.st_mode)) { - rc = ioctl(fd, MEMGETINFO, &mtdinfo); - if (rc < 0) { - fprintf(stderr, "Cannot get MTD information for %s\n", - DEVNAME(dev_current)); - return -1; - } - if (mtdinfo.type != MTD_NORFLASH && - mtdinfo.type != MTD_NANDFLASH && - mtdinfo.type != MTD_DATAFLASH && - mtdinfo.type != MTD_UBIVOLUME) { - fprintf (stderr, "Unsupported flash type %u on %s\n", - mtdinfo.type, DEVNAME(dev_current)); - return -1; - } - } else { - memset(&mtdinfo, 0, sizeof(mtdinfo)); - mtdinfo.type = MTD_ABSENT; - } + memset(&mtdinfo, 0, sizeof(mtdinfo)); + mtdinfo.type = MTD_ABSENT; DEVTYPE(dev_current) = mtdinfo.type; ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/u-boot_firmware/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="u-boot_firmware" PKG_VERSION="2986172ef237858fb95bd5e4fa41ee89a660153e" PKG_SHA256="f22f472f6cff1707789e055a4552b6bcb57671ae7d89044a66fdc4a5803f5a08" PKG_LICENSE="GPL" PKG_SITE="https://github.com/hardkernel/u-boot_firmware" PKG_URL="https://github.com/CoreELEC/u-boot_firmware/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="u-boot_firmware: Required firmware Files for U-Boot" PKG_TOOLCHAIN=manual makeinstall_target() { : # nothing } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/util-linux/config/swap.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) SWAPFILE="$HOME/.cache/swapfile" SWAPFILESIZE="@SWAPFILESIZE@" SWAP_ENABLED="@SWAP_ENABLED_DEFAULT@" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/util-linux/package.mk ================================================ # 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) PKG_NAME="util-linux" PKG_VERSION="2.35.2" PKG_SHA256="21b7431e82f6bcd9441a01beeec3d57ed33ee948f8a5b41da577073c372eb58a" PKG_LICENSE="GPL" PKG_URL="http://www.kernel.org/pub/linux/utils/util-linux/v${PKG_VERSION%.*}/$PKG_NAME-$PKG_VERSION.tar.xz" PKG_DEPENDS_HOST="ccache:host autoconf:host automake:host intltool:host libtool:host pkg-config:host" PKG_DEPENDS_TARGET="toolchain ncurses" PKG_DEPENDS_INIT="toolchain" PKG_LONGDESC="A large variety of low-level system utilities that are necessary for a Linux system to function." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic:host" UTILLINUX_CONFIG_DEFAULT="--disable-gtk-doc \ --disable-nls \ --disable-rpath \ --enable-tls \ --disable-all-programs \ --enable-chsh-only-listed \ --disable-bash-completion \ --disable-colors-default \ --disable-pylibmount \ --disable-pg-bell \ --disable-use-tty-group \ --disable-makeinstall-chown \ --disable-makeinstall-setuid \ --disable-widechar \ --with-gnu-ld \ --without-selinux \ --without-audit \ --without-udev \ --without-ncursesw \ --without-readline \ --without-slang \ --without-tinfo \ --without-utempter \ --without-util \ --without-libz \ --without-user \ --without-systemd \ --without-smack \ --without-python \ --without-systemdsystemunitdir" PKG_CONFIGURE_OPTS_TARGET="$UTILLINUX_CONFIG_DEFAULT \ --enable-libuuid \ --enable-libblkid \ --enable-libmount \ --enable-libsmartcols \ --enable-losetup \ --enable-fsck \ --enable-fstrim \ --enable-blkid \ --with-ncurses \ --enable-setterm \ --without-ncursesw \ --enable-lscpu" if [ "$SWAP_SUPPORT" = "yes" ]; then PKG_CONFIGURE_OPTS_TARGET="$PKG_CONFIGURE_OPTS_TARGET --enable-swapon" fi PKG_CONFIGURE_OPTS_HOST="--enable-static \ --disable-shared \ $UTILLINUX_CONFIG_DEFAULT \ --enable-uuidgen \ --enable-libuuid" PKG_CONFIGURE_OPTS_INIT="$UTILLINUX_CONFIG_DEFAULT \ --enable-libblkid \ --enable-libmount \ --enable-fsck" if [ "$INITRAMFS_PARTED_SUPPORT" = "yes" ]; then PKG_CONFIGURE_OPTS_INIT="$PKG_CONFIGURE_OPTS_INIT --enable-mkfs --enable-libuuid" fi pre_makeinstall_target() { mkdir -p $INSTALL/usr/bin cp $PKG_BUILD/.$TARGET_NAME/setterm $INSTALL/usr/bin } post_makeinstall_target() { if [ "$SWAP_SUPPORT" = "yes" ]; then mkdir -p $INSTALL/usr/lib/coreelec cp -PR $PKG_DIR/scripts/mount-swap $INSTALL/usr/lib/coreelec mkdir -p $INSTALL/etc cat $PKG_DIR/config/swap.conf | \ sed -e "s,@SWAPFILESIZE@,$SWAPFILESIZE,g" \ -e "s,@SWAP_ENABLED_DEFAULT@,$SWAP_ENABLED_DEFAULT,g" \ > $INSTALL/etc/swap.conf fi } post_install () { if [ "$SWAP_SUPPORT" = "yes" ]; then enable_service swap.service fi } ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/util-linux/patches/util-linux-01-fix-pkgconf.patch ================================================ From 4856beb5186760419bafd1f5686d6492d2d36907 Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Sat, 16 Aug 2014 13:40:57 +0300 Subject: [PATCH] fix pkgconf --- libblkid/blkid.pc.in | 6 +++--- libmount/mount.pc.in | 6 +++--- libsmartcols/smartcols.pc.in | 6 +++--- libuuid/uuid.pc.in | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/libblkid/blkid.pc.in b/libblkid/blkid.pc.in index 40ec8a9..056ae64 100644 --- a/libblkid/blkid.pc.in +++ b/libblkid/blkid.pc.in @@ -1,7 +1,7 @@ prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@usrlib_execdir@ -includedir=@includedir@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include Name: blkid Description: Block device id library diff --git a/libmount/mount.pc.in b/libmount/mount.pc.in index 2c32797..c8112c6 100644 --- a/libmount/mount.pc.in +++ b/libmount/mount.pc.in @@ -1,7 +1,7 @@ prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@usrlib_execdir@ -includedir=@includedir@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include Name: mount Description: mount library diff --git a/libsmartcols/smartcols.pc.in b/libsmartcols/smartcols.pc.in index 0b16739..8f474ef 100644 --- a/libsmartcols/smartcols.pc.in +++ b/libsmartcols/smartcols.pc.in @@ -1,7 +1,7 @@ prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@usrlib_execdir@ -includedir=@includedir@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include Name: smartcols Description: table or tree library diff --git a/libuuid/uuid.pc.in b/libuuid/uuid.pc.in index 875de19..ef1009e 100644 --- a/libuuid/uuid.pc.in +++ b/libuuid/uuid.pc.in @@ -1,7 +1,7 @@ prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@usrlib_execdir@ -includedir=@includedir@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include Name: uuid Description: Universally unique id library -- 1.7.2.5 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/util-linux/patches/util-linux-0100-enable-lscpu.patch ================================================ diff --git a/configure.ac b/configure.ac index a05a294..558851d 100644 --- a/configure.ac +++ b/configure.ac @@ -1498,7 +1498,11 @@ UL_REQUIRES_BUILD([lsblk], [libsmartcols]) AM_CONDITIONAL([BUILD_LSBLK], [test "x$build_lsblk" = xyes]) -UL_BUILD_INIT([lscpu], [check]) +AC_ARG_ENABLE([lscpu], + AS_HELP_STRING([--disable-lscpu], [do not build lscpu]), + [], [UL_DEFAULT_ENABLE([lscpu], [check])] +) +UL_BUILD_INIT([lscpu]) UL_REQUIRES_LINUX([lscpu]) UL_REQUIRES_BUILD([lscpu], [libsmartcols]) UL_REQUIRES_HAVE([lscpu], [cpu_set_t], [cpu_set_t type]) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/util-linux/patches/util-linux-blkid_swapon_mkfs_uuidgen.patch ================================================ diff --git a/configure.ac b/configure.ac index 1899ec3..e4be942 100644 --- a/configure.ac +++ b/configure.ac @@ -1156,7 +1156,11 @@ AS_IF([test "x$build_uuidd" = xyes || test "x$enable_libuuid_force_uuidd" == xye AM_CONDITIONAL([BUILD_UUIDD], [test "x$build_uuidd" = xyes]) -UL_BUILD_INIT([uuidgen], [check]) +AC_ARG_ENABLE([uuidgen], + AS_HELP_STRING([--disable-uuidgen], [do not build uuidgen]), + [], [UL_DEFAULT_ENABLE([uuidgen], [check])] +) +UL_BUILD_INIT([uuidgen]) UL_REQUIRES_BUILD([uuidgen], [libuuid]) AM_CONDITIONAL([BUILD_UUIDGEN], [test "x$build_uuidgen" = xyes]) @@ -1165,7 +1169,11 @@ UL_REQUIRES_BUILD([uuidparse], [libuuid]) UL_REQUIRES_BUILD([uuidparse], [libsmartcols]) AM_CONDITIONAL([BUILD_UUIDPARSE], [test "x$build_uuidparse" = xyes]) -UL_BUILD_INIT([blkid], [check]) +AC_ARG_ENABLE([blkid], + AS_HELP_STRING([--disable-blkid], [do not build blkid(8)]), + [], [UL_DEFAULT_ENABLE([blkid], [check])] +) +UL_BUILD_INIT([blkid]) UL_REQUIRES_BUILD([blkid], [libblkid]) AM_CONDITIONAL([BUILD_BLKID], [test "x$build_blkid" = xyes]) @@ -1403,20 +1411,32 @@ UL_REQUIRES_HAVE([hwclock], [io, linuxdummy], [ioperm iopl function or Linux]) AM_CONDITIONAL([BUILD_HWCLOCK], [test "x$build_hwclock" = xyes]) -UL_BUILD_INIT([mkfs], [yes]) +AC_ARG_ENABLE([mkfs], + AS_HELP_STRING([--disable-mkfs], [do not build mkfs(8)]), + [], [UL_DEFAULT_ENABLE([mkfs], [check])] +) +UL_BUILD_INIT([mkfs]) AM_CONDITIONAL([BUILD_MKFS], [test "x$build_mkfs" = xyes]) UL_BUILD_INIT([isosize], [yes]) AM_CONDITIONAL([BUILD_ISOSIZE], [test "x$build_isosize" = xyes]) -UL_BUILD_INIT([fstrim], [check]) +AC_ARG_ENABLE([fstrim], + AS_HELP_STRING([--disable-fstrim], [do not build fstrim(8)]), + [], [UL_DEFAULT_ENABLE([fstrim], [check])] +) +UL_BUILD_INIT([fstrim]) UL_REQUIRES_LINUX([fstrim]) UL_REQUIRES_BUILD([fstrim], [libmount]) AM_CONDITIONAL([BUILD_FSTRIM], [test "x$build_fstrim" = xyes]) -UL_BUILD_INIT([swapon], [check]) +AC_ARG_ENABLE([swapon], + AS_HELP_STRING([--disable-swapon], [do not build swapon(8) and swapoff(8)]), + [], [UL_DEFAULT_ENABLE([swapon], [check])] +) +UL_BUILD_INIT([swapon]) UL_REQUIRES_LINUX([swapon]) UL_REQUIRES_BUILD([swapon], [libblkid]) UL_REQUIRES_BUILD([swapon], [libmount]) ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/util-linux/scripts/mount-swap ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /etc/swap.conf . /etc/profile if [ -f /storage/.config/swap.conf ]; then . /storage/.config/swap.conf fi if [ -e /dev/.storage_netboot ] ; then logger -t Boot "### netbooting... swap disabled ###" exit 0 fi if [ ! "$SWAP_ENABLED" = yes ] ; then logger -t Boot "### swap disabled via configfile ###" exit 0 fi SWAP=`blkid -t TYPE="swap" -o device` case $1 in create) if [ -z "$SWAP" -a ! -f "$SWAPFILE" ]; then mkdir -p `dirname $SWAPFILE` dd if=/dev/zero of=$SWAPFILE bs=1M count=$SWAPFILESIZE chmod 0600 $SWAPFILE mkswap $SWAPFILE fi ;; mount) [ -z "$SWAP" -a -f "$SWAPFILE" ] && SWAP=$SWAPFILE for i in $SWAP; do swapon -p 10000 $i done ;; unmount) swapoff -a ;; esac ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/util-linux/sysctl.d/swappiness.conf ================================================ vm.swappiness=10 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/packages/util-linux/system.d/swap.service ================================================ [Unit] Description=Mounting swapfile DefaultDependencies=false Before=swap.target shutdown.target Conflicts=shutdown.target Wants=swap.target ConditionPathExists=/proc/swaps ConditionKernelCommandLine=!noswap ConditionKernelCommandLine=!installer [Service] Environment=HOME=/storage Type=oneshot ExecStartPre=/usr/lib/coreelec/mount-swap create ExecStart=/usr/lib/coreelec/mount-swap mount RemainAfterExit=yes [Install] WantedBy=basic.target ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/patches/box64/01-fixhwcapatomics.patch ================================================ --- a/src/main.c +++ b/src/main.c @@ -15,6 +15,10 @@ #include <linux/auxvec.h> #include <asm/hwcap.h> #endif +#endif + +#ifndef HWCAP_ATOMICS +#define HWCAP_ATOMICS (1<<8) #endif #include "build_info.h" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/patches/box86/01-fixhwcap.patch ================================================ --- a/src/main.c +++ b/src/main.c @@ -26,6 +26,11 @@ #include <asm/hwcap.h> #endif #endif + +#define HWCAP2_CRC32 (1 << 4) +#define HWCAP2_AES (1 << 0) + + #include "build_info.h" #include "debug.h" ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/patches/linux/0001-backport-upstream-fix-8c0d0da3197815f04252866c2cbd5b.patch ================================================ From cdb1843faefdd8b3959073488201f4bd6e008ad0 Mon Sep 17 00:00:00 2001 From: 7Ji <pugokushin@gmail.com> Date: Mon, 6 Jun 2022 11:07:02 +0800 Subject: [PATCH 1/2] backport upstream fix 8c0d0da3197815f04252866c2cbd5b8ebbe1c895 --- arch/arm64/kernel/module.c | 51 ++++++++++++++------------------------ 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/arch/arm64/kernel/module.c b/arch/arm64/kernel/module.c index 1eb1cc95513..5cb980e7bf5 100644 --- a/arch/arm64/kernel/module.c +++ b/arch/arm64/kernel/module.c @@ -27,9 +27,6 @@ #include <linux/vmalloc.h> #include <asm/insn.h> -#define AARCH64_INSN_IMM_MOVNZ AARCH64_INSN_IMM_MAX -#define AARCH64_INSN_IMM_MOVK AARCH64_INSN_IMM_16 - void *module_alloc(unsigned long size) { return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END, @@ -98,16 +95,20 @@ static int reloc_data(enum aarch64_reloc_op op, void *place, u64 val, int len) return 0; } +enum aarch64_insn_movw_imm_type { + AARCH64_INSN_IMM_MOVNZ, + AARCH64_INSN_IMM_MOVKZ, +}; + static int reloc_insn_movw(enum aarch64_reloc_op op, void *place, u64 val, - int lsb, enum aarch64_insn_imm_type imm_type) + int lsb, enum aarch64_insn_movw_imm_type imm_type) { - u64 imm, limit = 0; + u64 imm; s64 sval; u32 insn = le32_to_cpu(*(u32 *)place); sval = do_reloc(op, place, val); - sval >>= lsb; - imm = sval & 0xffff; + imm = sval >> lsb; if (imm_type == AARCH64_INSN_IMM_MOVNZ) { /* @@ -116,7 +117,7 @@ static int reloc_insn_movw(enum aarch64_reloc_op op, void *place, u64 val, * immediate is less than zero. */ insn &= ~(3 << 29); - if ((s64)imm >= 0) { + if (sval >= 0) { /* >=0: Set the instruction to MOVZ (opcode 10b). */ insn |= 2 << 29; } else { @@ -128,29 +129,13 @@ static int reloc_insn_movw(enum aarch64_reloc_op op, void *place, u64 val, */ imm = ~imm; } - imm_type = AARCH64_INSN_IMM_MOVK; } /* Update the instruction with the new encoding. */ - insn = aarch64_insn_encode_immediate(imm_type, insn, imm); + insn = aarch64_insn_encode_immediate(AARCH64_INSN_IMM_16, insn, imm); *(u32 *)place = cpu_to_le32(insn); - /* Shift out the immediate field. */ - sval >>= 16; - - /* - * For unsigned immediates, the overflow check is straightforward. - * For signed immediates, the sign bit is actually the bit past the - * most significant bit of the field. - * The AARCH64_INSN_IMM_16 immediate type is unsigned. - */ - if (imm_type != AARCH64_INSN_IMM_16) { - sval++; - limit++; - } - - /* Check the upper bits depending on the sign of the immediate. */ - if ((u64)sval > limit) + if (imm > U16_MAX) return -ERANGE; return 0; @@ -255,25 +240,25 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, overflow_check = false; case R_AARCH64_MOVW_UABS_G0: ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 0, - AARCH64_INSN_IMM_16); + AARCH64_INSN_IMM_MOVKZ); break; case R_AARCH64_MOVW_UABS_G1_NC: overflow_check = false; case R_AARCH64_MOVW_UABS_G1: ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 16, - AARCH64_INSN_IMM_16); + AARCH64_INSN_IMM_MOVKZ); break; case R_AARCH64_MOVW_UABS_G2_NC: overflow_check = false; case R_AARCH64_MOVW_UABS_G2: ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 32, - AARCH64_INSN_IMM_16); + AARCH64_INSN_IMM_MOVKZ); break; case R_AARCH64_MOVW_UABS_G3: /* We're using the top bits so we can't overflow. */ overflow_check = false; ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 48, - AARCH64_INSN_IMM_16); + AARCH64_INSN_IMM_MOVKZ); break; case R_AARCH64_MOVW_SABS_G0: ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 0, @@ -290,7 +275,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, case R_AARCH64_MOVW_PREL_G0_NC: overflow_check = false; ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 0, - AARCH64_INSN_IMM_MOVK); + AARCH64_INSN_IMM_MOVKZ); break; case R_AARCH64_MOVW_PREL_G0: ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 0, @@ -299,7 +284,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, case R_AARCH64_MOVW_PREL_G1_NC: overflow_check = false; ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 16, - AARCH64_INSN_IMM_MOVK); + AARCH64_INSN_IMM_MOVKZ); break; case R_AARCH64_MOVW_PREL_G1: ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 16, @@ -308,7 +293,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, case R_AARCH64_MOVW_PREL_G2_NC: overflow_check = false; ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 32, - AARCH64_INSN_IMM_MOVK); + AARCH64_INSN_IMM_MOVKZ); break; case R_AARCH64_MOVW_PREL_G2: ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 32, -- 2.36.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/patches/linux/0002-backport-upstream-fix-2cd5629f66e2d55b17d9c66affeccf.patch ================================================ From c4cc3184ccbcbadf0fc26a6ac0a703ba51d77308 Mon Sep 17 00:00:00 2001 From: 7Ji <pugokushin@gmail.com> Date: Mon, 6 Jun 2022 11:09:09 +0800 Subject: [PATCH 2/2] backport upstream fix 2cd5629f66e2d55b17d9c66affeccf2eb2027ef --- arch/arm64/kernel/module.c | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/arch/arm64/kernel/module.c b/arch/arm64/kernel/module.c index 5cb980e7bf5..23cef35e77c 100644 --- a/arch/arm64/kernel/module.c +++ b/arch/arm64/kernel/module.c @@ -60,15 +60,18 @@ static u64 do_reloc(enum aarch64_reloc_op reloc_op, void *place, u64 val) static int reloc_data(enum aarch64_reloc_op op, void *place, u64 val, int len) { - u64 imm_mask = (1 << len) - 1; s64 sval = do_reloc(op, place, val); switch (len) { case 16: *(s16 *)place = sval; + if (sval < S16_MIN || sval > U16_MAX) + return -ERANGE; break; case 32: *(s32 *)place = sval; + if (sval < S32_MIN || sval > U32_MAX) + return -ERANGE; break; case 64: *(s64 *)place = sval; @@ -78,20 +81,6 @@ static int reloc_data(enum aarch64_reloc_op op, void *place, u64 val, int len) return 0; } - /* - * Extract the upper value bits (including the sign bit) and - * shift them to bit 0. - */ - sval = (s64)(sval & ~(imm_mask >> 1)) >> (len - 1); - - /* - * Overflow has occurred if the value is not representable in - * len bits (i.e the bottom len bits are not sign-extended and - * the top bits are not all zero). - */ - if ((u64)(sval + 1) > 2) - return -ERANGE; - return 0; } -- 2.36.1 ================================================ FILE: projects/Amlogic-ce/devices/Amlogic-old/patches/linux/linux-10-add-compatibility-macro-for-input_event_sec.patch ================================================ just define from https://github.com/torvalds/linux/commit/152194fe9c3f03232b9c0d0264793a7fa4af82f8 --- a/include/uapi/linux/input.h 2022-08-05 19:02:56.906792582 +0200 +++ b/include/uapi/linux/input.h 2022-08-05 19:03:30.788834870 +0200 @@ -24,6 +24,8 @@ struct input_event { struct timeval time; +#define input_event_sec time.tv_sec +#define input_event_usec time.tv_usec __u16 type; __u16 code; __s32 value; ================================================ FILE: projects/Amlogic-ce/filesystem/etc/dbus-1/system.d/coreelec.settings-xdbus-stoploop.conf ================================================ <!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> <busconfig> <policy user="root"> <allow own="com.service.coreelec.settings.xdbus.stoploop"/> </policy> </busconfig> ================================================ FILE: projects/Amlogic-ce/filesystem/etc/lirc/lircd.conf.d/odroid-amremote.conf ================================================ begin remote name odroid_amremote bits 16 flags SPACE_ENC|CONST_LENGTH eps 30 aeps 100 header 9000 4500 one 563 1687 zero 563 562 ptrail 563 repeat 9000 2250 pre_data_bits 16 pre_data 0x4DB2 gap 0 suppress_repeat 1 begin codes KEY_POWER 0x3BC4 KEY_MUTE 0x11EE KEY_HOME 0x41BE KEY_OK 0x738C KEY_LEFT 0x9966 KEY_RIGHT 0x837C KEY_UP 0x53AC KEY_DOWN 0x4BB4 KEY_BACK 0x59A6 KEY_MENU 0xA35C KEY_VOLUMEDOWN 0x817E KEY_VOLUMEUP 0x01FE end codes end remote ================================================ FILE: projects/Amlogic-ce/filesystem/usr/bin/cputemp ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) TEMP="$(cat /sys/class/thermal/thermal_zone0/temp)" echo "$(( $TEMP / 1000 )) C" ================================================ FILE: projects/Amlogic-ce/filesystem/usr/lib/modprobe.d/disable-ir-remotes.conf ================================================ blacklist meson-ir blacklist meson-remote ================================================ FILE: projects/Amlogic-ce/filesystem/usr/lib/modprobe.d/mali.conf ================================================ options mali mali_shared_mem_size=0x40000000 ================================================ FILE: projects/Amlogic-ce/filesystem/usr/lib/modules-load.d/amlvideodri.conf ================================================ amlvideodri ================================================ FILE: projects/Amlogic-ce/filesystem/usr/lib/systemd/sleep.conf.d/sleep.conf ================================================ [Sleep] HibernateMode=false ================================================ FILE: projects/Amlogic-ce/filesystem/usr/lib/systemd/system/amlogic-dvb.service ================================================ [Unit] Description=Amlogic DVB module loader ConditionPathExists=/proc/device-tree/dvb/ After=kernel-overlays.service [Service] Type=oneshot ExecStart=-/bin/sh -c "[ ! -f '/proc/device-tree/dvb/status' -a $(tr -d '\\0' < /proc/device-tree/dvb/compatible) = "amlogic,dvb" ] && /sbin/modprobe aml_fe" ExecStart=-/bin/sh -c "[ -f '/proc/device-tree/dvb/status' -a $(tr -d '\\0' < /proc/device-tree/dvb/status) = "okay" ] && /sbin/modprobe aml_fe" [Install] WantedBy=basic.target ================================================ FILE: projects/Amlogic-ce/filesystem/usr/lib/systemd/system/smp-affinity.service ================================================ [Unit] Description=Set smp_affinity from script Before=kodi.service After=graphical.target ConditionPathExists=/usr/lib/coreelec/smp-affinity.sh [Service] Type=oneshot ExecStart=-/bin/sh /usr/lib/coreelec/smp-affinity.sh RemainAfterExit=yes [Install] WantedBy=kodi.service ================================================ FILE: projects/Amlogic-ce/filesystem/usr/lib/systemd/system-shutdown/disk-park.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) function disk_park() { [ -z "$PARK_WAIT" ] && PARK_WAIT="10" echo "disk-park: suspend disks: $PARK_HDD, park time: ${PARK_WAIT}s" >/dev/kmsg wait=0 for dev in /sys/block/sd* ; do [ ! -e $dev ] && continue DEV="${dev##*/}" [ "$(udevadm info --query=all --name=$DEV | awk -F "=" '/ID_MODEL=/{print index($2, "SSD")}')" != "0" ] && continue [ -n "$(hdparm -C /dev/$DEV | grep 'standby')" ] && continue echo "disk-park: suspend disk /dev/$DEV" >/dev/kmsg hdparm -y /dev/$DEV >/dev/null && wait=$PARK_WAIT done if [ "$wait" = "0" ]; then echo "disk-park: no disk got sent to suspend" >/dev/kmsg else sleep $wait fi } [ -e /run/disk-park.dat ] && . /run/disk-park.dat || exit 0 [ -z "$PARK_HDD" ] && exit 0 case "$1" in reboot|post) # do not park disks when rebooting or on suspend resume ;; *) disk_park ;; esac ================================================ FILE: projects/Amlogic-ce/filesystem/usr/lib/systemd/system-sleep/reset_usb_hub.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) case "$1" in pre) # <do something on suspend> ;; post) # <do something on resume> DT_ID=$(dtname) case $DT_ID in *odroid_n2plus*) wol="$(cat /flash/config.ini | awk -F "=" '/^wol=/{gsub(/"|\047/,"",$2); print $2}')" if [ "$wol" == "1" ]; then echo "reset" > /sys/devices/platform/gpio-reset/reset-usb_hub/control fi ;; esac ;; esac ================================================ FILE: projects/Amlogic-ce/filesystem/usr/lib/udev/hwdb.d/99-buzztv-bt-400-rf.hwdb ================================================ # BuzzTV BT-300/BT-400 smart remote evdev:input:b0005v0957p1001* KEYBOARD_KEY_c0040=c KEYBOARD_KEY_c0041=enter KEYBOARD_KEY_70040=z KEYBOARD_KEY_70041=esc KEYBOARD_KEY_70042=t KEYBOARD_KEY_70043=e KEYBOARD_KEY_70044=o KEYBOARD_KEY_70045=volumeup KEYBOARD_KEY_70069=volumedown ================================================ FILE: projects/Amlogic-ce/filesystem/usr/lib/udev/rules.d/99-spidev.rules ================================================ KERNEL=="spidev*", SUBSYSTEMS=="spidev", SYMLINK+="spidev0.0" ================================================ FILE: projects/Amlogic-ce/filesystem/usr/lib/udev/rules.d/99-xpadneo.rules ================================================ # XPADNEO UDEV BINDING # by atar-axis (dollinger.florian@gmx.de) # in general those files with a higher leading number are processed # and executed _later_, that means assignment in those files can overwrite # assignments in other rules which are parsed earlier # every block is a rule. rules are collected from the .rules files # according to their name. on every kernel uevent, all rules are # compared to that event - one by one. # kernel versions manual binding (bind/unbind) bind uevent hid_generic greedy hid_microsoft support gamepad method # --------------- ---------------------------- -------------- ------------------ --------------------- ------- ------ # [ ... - 2.6.13 [ no no yes no * rmmod (not supported in xpadneo) # [ 2.6.13 - 4.14 [ yes no yes no * 1: add, hid_generic # [ 4.14 - 4.16 [ yes yes yes no * 2: bind, hid_generc # [ 4.16 - 4.20 [ yes yes no no * automatic # [ 4.20 - ... ] yes yes no yes 02FD 3: bind, microsoft # 02E0 automatic ACTION=="add", \ KERNEL=="0005:045E:02FD.*|0005:045E:02E0.*", \ SUBSYSTEM=="hid", \ RUN:="/bin/sh -c 'echo xpadneo udev: $kernel > /dev/kmsg; modprobe hid_xpadneo; echo $kernel > /sys/bus/hid/drivers/hid-generic/unbind; echo $kernel > /sys/bus/hid/drivers/microsoft/unbind; echo $kernel > /sys/bus/hid/drivers/xpadneo/bind; echo xpadneo udev: ok > /dev/kmsg'" ================================================ FILE: projects/Amlogic-ce/filesystem/usr/sbin/rebootfromnand ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2016-2018 kszaq (kszaquitto@gmail.com) # Copyright (C) 2019-present Team CoreELEC (https://coreelec.org) DT_ID=$(cat /proc/device-tree/amlogic-dt-id 2>/dev/null | tr -d '\0') # Check if Fire TV Cube (g12brevb_raven_2g) if [ "${DT_ID}" = "g12brevb_raven_2g" ]; then /bin/systemctl reboot --reboot-argument=quiescent else if /usr/sbin/fw_printenv whereToBootFrom > /dev/null 2>&1; then /usr/sbin/fw_setenv whereToBootFrom internal fi /usr/sbin/fw_setenv bootfromnand 1 fi ================================================ FILE: projects/Amlogic-ce/filesystem/usr/share/alsa/cards/AML-AUGESOUND.conf ================================================ # # Configuration for Amlogic AUGE Audio # AML-AUGESOUND.pcm.default { @args [ CARD ] @args.CARD { type string } type softvol slave.pcm { type plug slave { pcm { type hw card $CARD device 1 } } } control { name "PCM Playback Volume" card $CARD } } <confdir:pcm/surround71.conf> AML-AUGESOUND.pcm.surround71.0 { @args [ CARD ] @args.CARD { type string } type softvol slave.pcm { type plug slave { pcm { type hw card $CARD device 3 } } } control { name "LPCM Playback Volume" card $CARD } } <confdir:pcm/hdmi.conf> AML-AUGESOUND.pcm.hdmi.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type hooks slave.pcm { type hw card $CARD device 0 format S16_LE } hooks.0 { type ctl_elems hook_args [ { interface MIXER name "IEC958 Playback Default" lock true preserve true optional true value [ $AES0 $AES1 $AES2 $AES3 ] } ] } } <confdir:pcm/iec958.conf> AML-AUGESOUND.pcm.iec958.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type hooks slave.pcm { type hw card $CARD device 2 format S16_LE } hooks.0 { type ctl_elems hook_args [ { interface MIXER name "IEC958 Playback Default" lock true preserve true optional true value [ $AES0 $AES1 $AES2 $AES3 ] } ] } } ================================================ FILE: projects/Amlogic-ce/filesystem/usr/share/alsa/cards/AML-MESONAUDIO.conf ================================================ # # Configuration for Amlogic MESONAUDIO Audio # AML-MESONAUDIO.pcm.default { @args [ CARD ] @args.CARD { type string } type softvol slave.pcm { type plug slave { pcm { type hw card $CARD device 0 } } } control { name "PCM Playback Volume" card $CARD } } <confdir:pcm/hdmi.conf> AML-MESONAUDIO.pcm.hdmi.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type hooks slave.pcm { type hw card $CARD device 1 format S16_LE } hooks.0 { type ctl_elems hook_args [ { interface MIXER name "IEC958 Playback Default" lock true preserve true optional true value [ $AES0 $AES1 $AES2 $AES3 ] } ] } } ================================================ FILE: projects/Amlogic-ce/packages/addons/addon-depends/attrs/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) PKG_NAME="attrs" PKG_VERSION="22.2.0" PKG_SHA256="c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" PKG_LICENSE="GPL" PKG_SITE="https://pypi.org/project/attrs/" PKG_URL="https://files.pythonhosted.org/packages/source/${PKG_NAME:0:1}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="Python3:host setuptools:host" PKG_LONGDESC="Classes Without Boilerplate." PKG_TOOLCHAIN="manual" makeinstall_host() { exec_thread_safe python3 setup.py install --prefix=${TOOLCHAIN} } ================================================ FILE: projects/Amlogic-ce/packages/addons/addon-depends/jsonschema/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) PKG_NAME="jsonschema" PKG_VERSION="4.17.3" PKG_SHA256="0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d" PKG_LICENSE="MIT" PKG_SITE="https://pypi.org/project/jsonschema/" PKG_URL="https://files.pythonhosted.org/packages/source/${PKG_NAME:0:1}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="Python3:host attrs:host pyrsistent:host" PKG_LONGDESC="An implementation of JSON Schema validation for Python." PKG_TOOLCHAIN="manual" makeinstall_host() { cp -r ${PKG_BUILD}/jsonschema ${TOOLCHAIN}/lib/${PKG_PYTHON_VERSION}/site-packages } ================================================ FILE: projects/Amlogic-ce/packages/addons/addon-depends/mbedtls/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) PKG_NAME="mbedtls" PKG_VERSION="3.3.0" PKG_SHA256="113fa84bc3cf862d56e7be0a656806a5d02448215d1e22c98176b1c372345d33" PKG_LICENSE="Apache 2.0" PKG_SITE="https://github.com/Mbed-TLS/mbedtls" PKG_URL="https://github.com/Mbed-TLS/mbedtls/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain jsonschema:host Jinja2:host" PKG_LONGDESC="Mbed TLS is a C library that implements cryptographic primitives, X.509 certificate manipulation and the SSL/TLS and DTLS protocols." PKG_CMAKE_OPTS_TARGET="-DCMAKE_BUILD_TYPE=Release \ -DUSE_SHARED_MBEDTLS_LIBRARY=OFF \ -DUSE_STATIC_MBEDTLS_LIBRARY=ON \ -DENABLE_TESTING=OFF \ -DENABLE_PROGRAMS=OFF \ -DLINK_WITH_PTHREAD=ON \ -Wno-dev" ================================================ FILE: projects/Amlogic-ce/packages/addons/addon-depends/pyrsistent/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) PKG_NAME="pyrsistent" PKG_VERSION="0.19.3" PKG_SHA256="1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440" PKG_LICENSE="GPL" PKG_SITE="https://pypi.org/project/pyrsistent/" PKG_URL="https://files.pythonhosted.org/packages/source/${PKG_NAME:0:1}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="Python3:host setuptools:host" PKG_LONGDESC="Persistent/Functional/Immutable data structures." PKG_TOOLCHAIN="manual" makeinstall_host() { exec_thread_safe python3 setup.py install --prefix=${TOOLCHAIN} } ================================================ FILE: projects/Amlogic-ce/packages/addons/addon-depends/qmdnsengine/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="qmdnsengine" PKG_VERSION="0ca80117e853671d909b3cec9e2bdcac85a13b9f" PKG_SHA256="3ae288458e3fc1c1e636869aaca0fd5c77bdd6aec6fd4d62217d0f46acd4042c" PKG_LICENSE="MIT" PKG_SITE="https://github.com/nitroshare/qmdnsengine" PKG_URL="https://github.com/nitroshare/qmdnsengine/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain qt-everywhere" PKG_LONGDESC="Library provides an implementation of multicast DNS as per RFC 6762." PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=OFF" ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/crazycat/changelog.txt ================================================ 100 - Initial add-on ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/crazycat/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="crazycat" PKG_REV="1" PKG_LICENSE="GPL" PKG_SITE="https://github.com/crazycat69/media_build" PKG_DEPENDS_TARGET="toolchain linux media_tree_cc" PKG_NEED_UNPACK="${LINUX_DEPENDS} $(get_pkg_directory media_tree_cc)" PKG_SECTION="driver.dvb" PKG_LONGDESC="DVB driver for TBS cards with CrazyCats additions" PKG_IS_ADDON="yes" PKG_IS_KERNEL_PKG="yes" PKG_ADDON_IS_STANDALONE="yes" PKG_ADDON_NAME="DVB drivers for TBS" PKG_ADDON_TYPE="xbmc.service" PKG_ADDON_VERSION="${ADDON_VERSION}.${PKG_REV}" PKG_ADDON_REQUIRES="script.program.driverselect:0.0.0" case "${LINUX}" in amlogic-4.9) PKG_VERSION="ca1ea9fc2cfaedfc32bd0ac628e03e9aa379e3ad" PKG_SHA256="6b44a96d82c4a3e052864a995baceaede46b37c048c5718a6f62a009492d08ff" PKG_URL="https://github.com/crazycat69/media_build/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET+=" media_tree_aml" PKG_NEED_UNPACK+=" $(get_pkg_directory media_tree_aml)" PKG_PATCH_DIRS="amlogic-4.9" ;; amlogic-5.4) PKG_VERSION="b8d777fd6c5a274f5f87cb7e67dae22e543d6554" PKG_SHA256="7a886032177fc7ca12abd120a14f81af5ff0ebffc225e8538d8cc332bb5cd765" PKG_URL="https://github.com/crazycat69/media_build/archive/${PKG_VERSION}.tar.gz" PKG_PATCH_DIRS="amlogic-5.4" ;; esac pre_make_target() { export KERNEL_VER=$(get_module_dir) export LDFLAGS="" } make_target() { cp -RP $(get_build_dir media_tree_cc)/* ${PKG_BUILD}/linux if [[ "${DEVICE}" = "Amlogic-ng"* ]]; then cp -Lr $(get_build_dir media_tree_aml)/* ${PKG_BUILD}/linux echo "obj-y += video_dev/" >> "${PKG_BUILD}/linux/drivers/media/platform/meson/Makefile" echo "obj-y += dvb/" >> "${PKG_BUILD}/linux/drivers/media/platform/meson/Makefile" echo 'source "drivers/media/platform/meson/dvb/Kconfig"' >> "${PKG_BUILD}/linux/drivers/media/platform/Kconfig" sed -e 's/ && RC_CORE//g' -i ${PKG_BUILD}/linux/drivers/media/usb/dvb-usb/Kconfig fi # make config all kernel_make VER=${KERNEL_VER} SRCDIR=$(kernel_path) allyesconfig # add menuconfig to edit .config kernel_make VER=${KERNEL_VER} SRCDIR=$(kernel_path) } makeinstall_target() { install_driver_addon_files "${PKG_BUILD}/v4l/" } ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/crazycat/patches/amlogic-4.9/driver.dvb.crazycat-01-remove-rmmod.pl.patch ================================================ [Patch] without this patch you need to install libproc-processtable-perl at host system --- a/v4l/Makefile +++ b/v4l/Makefile @@ -51,7 +51,7 @@ @echo Kernel build directory is $(OUTDIR) $(MAKE) -C ../linux apply_patches $(MAKE) -C $(OUTDIR) SUBDIRS=$(PWD) $(MYCFLAGS) modules - ./scripts/rmmod.pl check +# ./scripts/rmmod.pl check # $(MAKE) checkpatch mismatch:: prepare firmware ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/crazycat/patches/amlogic-4.9/driver.dvb.crazycat-02-disable-modules.patch ================================================ --- a/v4l/scripts/make_kconfig.pl +++ b/v4l/scripts/make_kconfig.pl @@ -626,6 +626,12 @@ ($$) close OUT; # These options should default to off +disable_config('MEDIA_ANALOG_TV_SUPPORT'); +disable_config('MEDIA_CAMERA_SUPPORT'); +disable_config('MEDIA_CEC_SUPPORT'); +disable_config('SOC_CAMERA'); +disable_config('VIDEO_SAA7146_VV'); +disable_config('RC_CORE'); disable_config('DVB_AV7110_FIRMWARE'); disable_config('DVB_CINERGYT2_TUNING'); disable_config('VIDEO_HELPER_CHIPS_AUTO'); ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/crazycat/patches/amlogic-4.9/driver.dvb.crazycat-03-config_mycompat_h.patch ================================================ --- /dev/null +++ b/v4l/config-mycompat.h @@ -0,0 +1,8 @@ +#undef smp_mb__after_atomic +#define smp_mb__after_atomic() smp_mb() /*mb*/ +#undef NEED_SMP_MB_AFTER_ATOMIC +#undef writel_relaxed +#define writel_relaxed(v,c) ((void)__raw_writel((__force u32)cpu_to_le32(v),(c))) +#undef NEED_WRITEL_RELAXED +#undef NEED_PM_RUNTIME_GET +#undef NEED_OF_NODE_NAME_EQ -- ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/crazycat/patches/amlogic-4.9/driver.dvb.crazycat-04-add-include-prandom-h.patch ================================================ From 10cee8e4d90788f865f6378a250cde4ab9d29f5d Mon Sep 17 00:00:00 2001 From: Hans Verkuil <hverkuil-cisco@xs4all.nl> Date: Wed, 19 Aug 2020 09:51:02 +0200 Subject: [PATCH] Add include/linux/prandom.h as alternate header to look in Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> --- v4l/scripts/make_config_compat.pl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/v4l/scripts/make_config_compat.pl b/v4l/scripts/make_config_compat.pl index 2591d92..f99a180 100644 --- a/v4l/scripts/make_config_compat.pl +++ b/v4l/scripts/make_config_compat.pl @@ -655,8 +655,8 @@ sub check_other_dependencies() check_files_for_func("mp_mb__after_atomic", "NEED_SMP_MB_AFTER_ATOMIC", "include/asm-generic/barrier.h"); check_files_for_func("pci_zalloc_consistent", "NEED_PCI_ZALLOC_CONSISTENT", "include/asm-generic/pci-dma-compat.h", "include/linux/pci-dma-compat.h"); check_files_for_func("kref_get_unless_zero", "NEED_KREF_GET_UNLESS_ZERO", "include/linux/kref.h"); - check_files_for_func("prandom_u32_max", "NEED_PRANDOM_U32_MAX", "include/linux/random.h"); - check_files_for_func("prandom_u32", "NEED_PRANDOM_U32", "include/linux/random.h"); + check_files_for_func("prandom_u32_max", "NEED_PRANDOM_U32_MAX", "include/linux/random.h", "include/linux/prandom.h"); + check_files_for_func("prandom_u32", "NEED_PRANDOM_U32", "include/linux/random.h", "include/linux/prandom.h"); check_files_for_func("GENMASK", "NEED_GENMASK", "include/linux/bitops.h", "include/linux/bits.h"); check_files_for_func("mult_frac", "NEED_MULT_FRAC", "include/linux/kernel.h"); check_files_for_func("clk_prepare_enable", "NEED_CLOCK_HELPERS", "include/linux/clk.h"); @@ -718,7 +718,7 @@ sub check_other_dependencies() check_files_for_func("usb_urb_ep_type_check", "NEED_USB_EP_CHECK", "include/linux/usb.h"); check_files_for_func("get_user_pages_longterm", "NEED_GET_USER_PAGES_LONGTERM", "include/linux/mm.h"); check_files_for_func("__pfn_to_phys", "NEED_PFN_TO_PHYS", "include/asm-generic/memory_model.h"); - check_files_for_func("next_pseudo_random32", "NEED_NEXT_PSEUDO_RANDOM32", "include/linux/random.h"); + check_files_for_func("next_pseudo_random32", "NEED_NEXT_PSEUDO_RANDOM32", "include/linux/random.h", "include/linux/prandom.h"); check_files_for_func("i2c_new_secondary_device", "NEED_I2C_NEW_SECONDARY_DEV", "include/linux/i2c.h"); check_files_for_func("memdup_user_nul", "NEED_MEMDUP_USER_NUL", "include/linux/string.h"); check_files_for_func("STACK_FRAME_NON_STANDARD", "NEED_STACK_FRAME_NON_STANDARD", "include/linux/frame.h"); -- 2.33.0 ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/crazycat/patches/amlogic-4.9/driver.dvb.crazycat-05-media_build-handle-kernel-sublevel-255.patch ================================================ From a313a759f6e46e50b33ac85739ddd7966367cdcd Mon Sep 17 00:00:00 2001 From: Hans Verkuil <hverkuil-cisco@xs4all.nl> Date: Tue, 9 Mar 2021 12:01:55 +0100 Subject: [PATCH] media_build: handle kernel sublevel > 255 Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> --- backports/backports.txt | 78 ++++++++++++++++++------------------- linux/Makefile | 4 +- linux/patches_for_kernel.pl | 1 + linux/use_dir.pl | 2 +- 4 files changed, 43 insertions(+), 42 deletions(-) diff --git a/backports/backports.txt b/backports/backports.txt index 0806864..1ade47e 100644 --- a/backports/backports.txt +++ b/backports/backports.txt @@ -5,7 +5,7 @@ # by summing the patches needed to backport to all kernel # versions higher or equal to the desired one. For example, # if this file has: -# [3.255.255] +# [3.255.1023] # add patch_for_upstream.patch # [2.6.38] # add patch_for_2.6.38.patch @@ -20,153 +20,153 @@ # use linux/patches_for_kernel.pl <version> # All supported versions need those patches -[9.255.255] +[9.255.1023] add api_version.patch add pr_fmt.patch add debug.patch add drx39xxj.patch -[5.1.255] +[5.1.1023] add v5.1_vm_map_pages.patch -[5.0.255] +[5.0.1023] add v5.0_ipu3-cio2.patch -[4.20.255] +[4.20.1023] add v4.20_access_ok.patch -[4.18.255] +[4.18.1023] add v4.18_fwnode_args_args.patch add v4.18_add_map_atomic.patch -[4.17.255] +[4.17.1023] add v4.17_proc_create_single.patch add v4.17_i2c_check_num_msgs.patch -[4.15.255] +[4.15.1023] add v4.15_pmdown_time.patch -[4.14.255] +[4.14.1023] add v4.14_saa7146_timer_cast.patch add v4.14_module_param_call.patch -[4.13.255] +[4.13.1023] add v4.13_remove_nospec_h.patch add v4.13_drmP.patch -[4.12.255] +[4.12.1023] add v4.12_revert_solo6x10_copykerneluser.patch -[4.11.255] +[4.11.1023] add v4.11_drop_drm_file.patch -[4.10.255] +[4.10.1023] add v4.10_sched_signal.patch add v4.10_fault_page.patch add v4.10_refcount.patch -[4.9.255] +[4.9.1023] add v4.9_mm_address.patch add v4.9_dvb_net_max_mtu.patch -[4.8.255] +[4.8.1023] add v4.8_user_pages_flag.patch add v4.8_em28xx_bitfield.patch add v4.8_dma_map_resource.patch add v4.8_drm_crtc.patch -[4.7.255] +[4.7.1023] add v4.7_dma_attrs.patch add v4.7_pci_alloc_irq_vectors.patch add v4.7_copy_to_user_warning.patch add v4.7_objtool_warning.patch -[4.6.255] +[4.6.1023] add v4.6_i2c_mux.patch -[4.5.255] +[4.5.1023] add v4.5_gpiochip_data_pointer.patch add v4.5_get_user_pages.patch add v4.5_uvc_super_plus.patch add v4.5_copy_to_user_warning.patch -[4.4.255] +[4.4.1023] add v4.4_gpio_chip_parent.patch -[4.3.255] +[4.3.1023] add v4.3_bt87x_const_fix.patch -[4.2.255] +[4.2.1023] add v4.2_atomic64.patch add v4.2_frame_vector.patch -[4.1.255] +[4.1.1023] add v4.1_pat_enabled.patch add v4.1_drop_fwnode.patch -[4.0.255] +[4.0.1023] add v4.0_dma_buf_export.patch add v4.0_drop_trace.patch add v4.0_fwnode.patch -[3.19.255] +[3.19.1023] add v3.19_get_user_pages_unlocked.patch add v3.19_get_user_pages_locked.patch -[3.18.255] +[3.18.1023] add v3.18_drop_property_h.patch add v3.18_ktime_get_real_seconds.patch -[3.17.255] +[3.17.1023] add v3.17_fix_clamp.patch add v3.17_remove_bpf_h.patch -[3.16.255] +[3.16.1023] add v3.16_netdev.patch add v3.16_wait_on_bit.patch add v3.16_void_gpiochip_remove.patch -[3.13.255] +[3.13.1023] add v3.13_ddbridge_pcimsi.patch -[3.12.255] +[3.12.1023] add v3.12_kfifo_in.patch -[3.11.255] +[3.11.1023] add v3.11_dev_groups.patch -[3.10.255] +[3.10.1023] add v3.10_fw_driver_probe.patch add v3.10_ir_hix5hd2.patch add v3.10_const_snd_pcm_ops.patch -[3.9.255] +[3.9.1023] add v3.9_drxj_warnings.patch -[3.8.255] +[3.8.1023] add v3.8_config_of.patch -[3.6.255] +[3.6.1023] add v3.6_pci_error_handlers.patch add v3.6_i2c_add_mux_adapter.patch -[3.4.255] +[3.4.1023] add v3.4_i2c_add_mux_adapter.patch add v3.4_stk_webcam.patch -[3.3.255] +[3.3.1023] add v3.3_eprobe_defer.patch -[3.2.255] +[3.2.1023] add v3.2_devnode_uses_mode_t.patch add v3.2_alloc_ordered_workqueue.patch -[3.1.255] +[3.1.1023] add v3.1_no_export_h.patch add v3.1_no_dma_buf_h.patch add v3.1_no_pm_qos.patch -[3.0.255] +[3.0.1023] add no_atomic_include.patch add v3.0_ida2bit.patch add v3.0_remove_ida_lird_dev.patch diff --git a/linux/Makefile b/linux/Makefile index c7a4341..8cfc932 100644 --- a/linux/Makefile +++ b/linux/Makefile @@ -80,7 +80,7 @@ todaytar: -rm -f $(PWD)/$(TODAY_TAR).bz2 tar cf $(PWD)/$(TODAY_TAR) -C $(DIR) $(TARFILES) git --git-dir $(DIR)/.git log --pretty=oneline -n3 |sed -r 's,([\x22]),,g; s,([\x25\x5c]),\1\1,g' >git_log - perl -e 'while (<>) { $$a=$$1 if (m/^\s*VERSION\s*=\s*(\d+)/); $$b=$$1 if (m/^\s*PATCHLEVEL\s*=\s*(\d+)/); $$c=$$1 if (m/^\s*SUBLEVEL\s*=\s*(\d+)/); } printf "#define V4L2_VERSION %d\n", ((($$a) << 16) + (($$b) << 8) + ($$c))' $(DIR)/Makefile > kernel_version.h + perl -e 'while (<>) { $$a=$$1 if (m/^\s*VERSION\s*=\s*(\d+)/); $$b=$$1 if (m/^\s*PATCHLEVEL\s*=\s*(\d+)/); $$c=$$1 if (m/^\s*SUBLEVEL\s*=\s*(\d+)/); } printf "#define V4L2_VERSION %d\n", ((($$a) << 16) + (($$b) << 8) + ($$c > 255 ? 255 : $$c))' $(DIR)/Makefile > kernel_version.h tar rvf $(PWD)/$(TODAY_TAR) git_log kernel_version.h for i in $(TARDIR); do \ @@ -99,7 +99,7 @@ tar: -rm -f $(PWD)/linux-media.tar.bz2 tar cf $(PWD)/linux-media.tar -C $(DIR) $(TARFILES) git --git-dir $(DIR)/.git log --pretty=oneline -n3 |sed -r 's,([\x22]),,g; s,([\x25\x5c]),\1\1,g' >git_log - perl -e 'while (<>) { $$a=$$1 if (m/^\s*VERSION\s*=\s*(\d+)/); $$b=$$1 if (m/^\s*PATCHLEVEL\s*=\s*(\d+)/); $$c=$$1 if (m/^\s*SUBLEVEL\s*=\s*(\d+)/); } printf "#define V4L2_VERSION %d\n", ((($$a) << 16) + (($$b) << 8) + ($$c))' $(DIR)/Makefile > kernel_version.h + perl -e 'while (<>) { $$a=$$1 if (m/^\s*VERSION\s*=\s*(\d+)/); $$b=$$1 if (m/^\s*PATCHLEVEL\s*=\s*(\d+)/); $$c=$$1 if (m/^\s*SUBLEVEL\s*=\s*(\d+)/); } printf "#define V4L2_VERSION %d\n", ((($$a) << 16) + (($$b) << 8) + ($$c > 255 ? 255 : $$c))' $(DIR)/Makefile > kernel_version.h tar rvf $(PWD)/linux-media.tar git_log kernel_version.h for i in $(TARDIR); do \ if [ "`echo $$i|grep Documentation`" = "" ]; then \ diff --git a/linux/patches_for_kernel.pl b/linux/patches_for_kernel.pl index 91b79fd..6ab3077 100755 --- a/linux/patches_for_kernel.pl +++ b/linux/patches_for_kernel.pl @@ -22,6 +22,7 @@ sub kernel_version($) { $sublevel = 0; } $sublevel = 0 if ($sublevel == ""); + $sublevel = 255 if ($sublevel > 255); return ($version * 65536 + $patchlevel * 256 + $sublevel); } diff --git a/linux/use_dir.pl b/linux/use_dir.pl index b461ec5..7ca8b35 100755 --- a/linux/use_dir.pl +++ b/linux/use_dir.pl @@ -291,7 +291,7 @@ sub sync_kernel_version() $c=$1 if (m/^\s*SUBLEVEL\s*=\s*(\d+)/); } close IN; - $source_v4l_version = ((($a) << 16) + (($b) << 8) + ($c)); + $source_v4l_version = ((($a) << 16) + (($b) << 8) + ($c > 255 ? 255 : $c)); if (open IN, "kernel_version.h") { while (<IN>) { -- 2.33.0 ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/crazycat/patches/amlogic-5.4/driver.dvb.crazycat-01-remove-rmmod.pl.patch ================================================ [Patch] without this patch you need to install libproc-processtable-perl at host system --- a/v4l/Makefile +++ b/v4l/Makefile @@ -51,7 +51,7 @@ default:: prepare firmware @echo Kernel build directory is $(OUTDIR) $(MAKE) -C ../linux apply_patches $(MAKE) -C $(OUTDIR) M=$(PWD) $(MYCFLAGS) modules - ./scripts/rmmod.pl check +# ./scripts/rmmod.pl check # $(MAKE) checkpatch mismatch:: prepare firmware ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/crazycat/patches/amlogic-5.4/driver.dvb.crazycat-02-disable-modules.patch ================================================ --- a/v4l/scripts/make_kconfig.pl +++ b/v4l/scripts/make_kconfig.pl @@ -626,6 +626,12 @@ ($$) close OUT; # These options should default to off +disable_config('MEDIA_ANALOG_TV_SUPPORT'); +disable_config('MEDIA_CAMERA_SUPPORT'); +disable_config('MEDIA_CEC_SUPPORT'); +disable_config('SOC_CAMERA'); +disable_config('VIDEO_SAA7146_VV'); +disable_config('RC_CORE'); disable_config('DVB_AV7110_FIRMWARE'); disable_config('DVB_CINERGYT2_TUNING'); disable_config('VIDEO_HELPER_CHIPS_AUTO'); ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/crazycat/patches/amlogic-5.4/driver.dvb.crazycat-03-config_mycompat_h.patch ================================================ --- /dev/null +++ b/v4l/config-mycompat.h @@ -0,0 +1,8 @@ +#undef smp_mb__after_atomic +#define smp_mb__after_atomic() smp_mb() /*mb*/ +#undef NEED_SMP_MB_AFTER_ATOMIC +#undef writel_relaxed +#define writel_relaxed(v,c) ((void)__raw_writel((__force u32)cpu_to_le32(v),(c))) +#undef NEED_WRITEL_RELAXED +#undef NEED_PM_RUNTIME_GET +#undef NEED_OF_NODE_NAME_EQ -- ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/crazycat/patches/amlogic-5.4/driver.dvb.crazycat-04-add-include-prandom-h.patch ================================================ From 3650720e6777c763627e78fc48075c86bef60a1b Mon Sep 17 00:00:00 2001 From: Hans Verkuil <hverkuil-cisco@xs4all.nl> Date: Wed, 19 Aug 2020 09:51:02 +0200 Subject: [PATCH] Add include/linux/prandom.h as alternate header to look in Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> --- v4l/scripts/make_config_compat.pl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/v4l/scripts/make_config_compat.pl b/v4l/scripts/make_config_compat.pl index 6a1ddf1..f579fc4 100644 --- a/v4l/scripts/make_config_compat.pl +++ b/v4l/scripts/make_config_compat.pl @@ -656,8 +656,8 @@ sub check_other_dependencies() check_files_for_func("mp_mb__after_atomic", "NEED_SMP_MB_AFTER_ATOMIC", "include/asm-generic/barrier.h"); check_files_for_func("pci_zalloc_consistent", "NEED_PCI_ZALLOC_CONSISTENT", "include/asm-generic/pci-dma-compat.h", "include/linux/pci-dma-compat.h"); check_files_for_func("kref_get_unless_zero", "NEED_KREF_GET_UNLESS_ZERO", "include/linux/kref.h"); - check_files_for_func("prandom_u32_max", "NEED_PRANDOM_U32_MAX", "include/linux/random.h"); - check_files_for_func("prandom_u32", "NEED_PRANDOM_U32", "include/linux/random.h"); + check_files_for_func("prandom_u32_max", "NEED_PRANDOM_U32_MAX", "include/linux/random.h", "include/linux/prandom.h"); + check_files_for_func("prandom_u32", "NEED_PRANDOM_U32", "include/linux/random.h", "include/linux/prandom.h"); check_files_for_func("GENMASK", "NEED_GENMASK", "include/linux/bitops.h", "include/linux/bits.h"); check_files_for_func("mult_frac", "NEED_MULT_FRAC", "include/linux/kernel.h"); check_files_for_func("clk_prepare_enable", "NEED_CLOCK_HELPERS", "include/linux/clk.h"); @@ -720,7 +720,7 @@ sub check_other_dependencies() check_files_for_func("usb_urb_ep_type_check", "NEED_USB_EP_CHECK", "include/linux/usb.h"); check_files_for_func("get_user_pages_longterm", "NEED_GET_USER_PAGES_LONGTERM", "include/linux/mm.h"); check_files_for_func("__pfn_to_phys", "NEED_PFN_TO_PHYS", "include/asm-generic/memory_model.h"); - check_files_for_func("next_pseudo_random32", "NEED_NEXT_PSEUDO_RANDOM32", "include/linux/random.h"); + check_files_for_func("next_pseudo_random32", "NEED_NEXT_PSEUDO_RANDOM32", "include/linux/random.h", "include/linux/prandom.h"); check_files_for_func("memdup_user_nul", "NEED_MEMDUP_USER_NUL", "include/linux/string.h"); check_files_for_func("STACK_FRAME_NON_STANDARD", "NEED_STACK_FRAME_NON_STANDARD", "include/linux/frame.h"); check_files_for_func("pci_free_irq_vectors", "NEED_PCI_FREE_IRQ_VECTORS", "include/linux/pci.h"); -- 2.38.2 ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/crazycat/patches/amlogic-5.4/driver.dvb.crazycat-05-do-not-handle-warning-as-error.patch ================================================ diff --git a/v4l/Makefile b/v4l/Makefile index d6e4d69..c0cf389 100644 --- a/v4l/Makefile +++ b/v4l/Makefile @@ -146,6 +146,8 @@ EXTRA_CFLAGS += -include $(obj)/compat.h # gives too much warnings (false positives) -> disable it EXTRA_CFLAGS += -Wno-format-truncation +EXTRA_CFLAGS += -Wno-error + ################################################# # Kernel 2.6/3.x specific rules ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/crazycat/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/dvb-latest/changelog.txt ================================================ 100 - Initial add-on ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/dvb-latest/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="dvb-latest" PKG_LICENSE="GPL" PKG_SITE="http://git.linuxtv.org/media_build.git" PKG_URL="https://git.linuxtv.org/media_build.git" GET_HANDLER_SUPPORT="git" PKG_DEPENDS_TARGET="toolchain linux media_tree" PKG_NEED_UNPACK="${LINUX_DEPENDS} $(get_pkg_directory media_tree)" PKG_SECTION="driver.dvb" PKG_LONGDESC="DVB drivers from the latest kernel (media_build)" PKG_IS_ADDON="yes" PKG_IS_KERNEL_PKG="yes" PKG_ADDON_IS_STANDALONE="yes" PKG_ADDON_NAME="DVB drivers from the latest kernel" PKG_ADDON_TYPE="xbmc.service" PKG_ADDON_VERSION="${ADDON_VERSION}.${PKG_REV}" PKG_ADDON_REQUIRES="script.program.driverselect:0.0.0" PKG_PATCH_DIRS="amlogic-common" case "${LINUX}" in amlogic-4.9) PKG_VERSION="0f25e6fb13b6bc345218800ad9ac863deb2ee9c8" PKG_DEPENDS_TARGET+=" media_tree_aml" PKG_NEED_UNPACK+=" $(get_pkg_directory media_tree_aml)" PKG_PATCH_DIRS+=" amlogic-4.9" ;; amlogic-5.4) PKG_VERSION="680a07be51069bee47a07a4bcf36c5176f1290a4" PKG_PATCH_DIRS+=" amlogic-5.4" ;; esac pre_make_target() { export KERNEL_VER=$(get_module_dir) export LDFLAGS="" } make_target() { cp -RP $(get_build_dir media_tree)/* ${PKG_BUILD}/linux if [[ "${DEVICE}" = "Amlogic-ng"* ]]; then cp -Lr $(get_build_dir media_tree_aml)/* ${PKG_BUILD}/linux # compile modules echo "obj-y += video_dev/" >> "${PKG_BUILD}/linux/drivers/media/platform/meson/Makefile" echo "obj-y += dvb/" >> "${PKG_BUILD}/linux/drivers/media/platform/meson/Makefile" echo 'source "drivers/media/platform/meson/dvb/Kconfig"' >> "${PKG_BUILD}/linux/drivers/media/platform/Kconfig" sed -e 's/ && RC_CORE//g' -i ${PKG_BUILD}/linux/drivers/media/usb/dvb-usb/Kconfig fi # make config all kernel_make VER=$KERNEL_VER SRCDIR=$(kernel_path) allyesconfig kernel_make VER=$KERNEL_VER SRCDIR=$(kernel_path) } makeinstall_target() { install_driver_addon_files "${PKG_BUILD}/v4l/" } ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/dvb-latest/patches/amlogic-4.9/driver.dvb.dvb-latest-01-remove-rmmod.pl.patch ================================================ diff --git a/v4l/Makefile b/v4l/Makefile --- a/v4l/Makefile +++ b/v4l/Makefile @@ -51,7 +51,6 @@ default:: prepare firmware @echo Kernel build directory is $(OUTDIR) $(MAKE) -C ../linux apply_patches $(MAKE) -C $(OUTDIR) SUBDIRS=$(PWD) $(MYCFLAGS) modules - ./scripts/rmmod.pl check # $(MAKE) checkpatch mismatch:: prepare firmware ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/dvb-latest/patches/amlogic-4.9/driver.dvb.dvb-latest-03-add-include-prandom-h.patch ================================================ From 10cee8e4d90788f865f6378a250cde4ab9d29f5d Mon Sep 17 00:00:00 2001 From: Hans Verkuil <hverkuil-cisco@xs4all.nl> Date: Wed, 19 Aug 2020 09:51:02 +0200 Subject: [PATCH] Add include/linux/prandom.h as alternate header to look in Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> --- v4l/scripts/make_config_compat.pl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/v4l/scripts/make_config_compat.pl b/v4l/scripts/make_config_compat.pl index 2591d92..f99a180 100644 --- a/v4l/scripts/make_config_compat.pl +++ b/v4l/scripts/make_config_compat.pl @@ -655,8 +655,8 @@ sub check_other_dependencies() check_files_for_func("mp_mb__after_atomic", "NEED_SMP_MB_AFTER_ATOMIC", "include/asm-generic/barrier.h"); check_files_for_func("pci_zalloc_consistent", "NEED_PCI_ZALLOC_CONSISTENT", "include/asm-generic/pci-dma-compat.h", "include/linux/pci-dma-compat.h"); check_files_for_func("kref_get_unless_zero", "NEED_KREF_GET_UNLESS_ZERO", "include/linux/kref.h"); - check_files_for_func("prandom_u32_max", "NEED_PRANDOM_U32_MAX", "include/linux/random.h"); - check_files_for_func("prandom_u32", "NEED_PRANDOM_U32", "include/linux/random.h"); + check_files_for_func("prandom_u32_max", "NEED_PRANDOM_U32_MAX", "include/linux/random.h", "include/linux/prandom.h"); + check_files_for_func("prandom_u32", "NEED_PRANDOM_U32", "include/linux/random.h", "include/linux/prandom.h"); check_files_for_func("GENMASK", "NEED_GENMASK", "include/linux/bitops.h", "include/linux/bits.h"); check_files_for_func("mult_frac", "NEED_MULT_FRAC", "include/linux/kernel.h"); check_files_for_func("clk_prepare_enable", "NEED_CLOCK_HELPERS", "include/linux/clk.h"); @@ -718,7 +718,7 @@ sub check_other_dependencies() check_files_for_func("usb_urb_ep_type_check", "NEED_USB_EP_CHECK", "include/linux/usb.h"); check_files_for_func("get_user_pages_longterm", "NEED_GET_USER_PAGES_LONGTERM", "include/linux/mm.h"); check_files_for_func("__pfn_to_phys", "NEED_PFN_TO_PHYS", "include/asm-generic/memory_model.h"); - check_files_for_func("next_pseudo_random32", "NEED_NEXT_PSEUDO_RANDOM32", "include/linux/random.h"); + check_files_for_func("next_pseudo_random32", "NEED_NEXT_PSEUDO_RANDOM32", "include/linux/random.h", "include/linux/prandom.h"); check_files_for_func("i2c_new_secondary_device", "NEED_I2C_NEW_SECONDARY_DEV", "include/linux/i2c.h"); check_files_for_func("memdup_user_nul", "NEED_MEMDUP_USER_NUL", "include/linux/string.h"); check_files_for_func("STACK_FRAME_NON_STANDARD", "NEED_STACK_FRAME_NON_STANDARD", "include/linux/frame.h"); -- 2.33.0 ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/dvb-latest/patches/amlogic-4.9/driver.dvb.dvb-latest-04-media_build-handle-kernel-sublevel-255.patch ================================================ From 367396dcd901cf3b6c8e988435cadfe178c00e51 Mon Sep 17 00:00:00 2001 From: Hans Verkuil <hverkuil-cisco@xs4all.nl> Date: Tue, 9 Mar 2021 12:01:55 +0100 Subject: [PATCH] media_build: handle kernel sublevel > 255 Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> --- backports/backports.txt | 76 ++++++++++++++++++------------------- linux/Makefile | 4 +- linux/patches_for_kernel.pl | 1 + linux/use_dir.pl | 2 +- 4 files changed, 42 insertions(+), 41 deletions(-) diff --git a/backports/backports.txt b/backports/backports.txt index 3c5ca37..605cc4a 100644 --- a/backports/backports.txt +++ b/backports/backports.txt @@ -5,7 +5,7 @@ # by summing the patches needed to backport to all kernel # versions higher or equal to the desired one. For example, # if this file has: -# [3.255.255] +# [3.255.1023] # add patch_for_upstream.patch # [2.6.38] # add patch_for_2.6.38.patch @@ -20,150 +20,150 @@ # use linux/patches_for_kernel.pl <version> # All supported versions need those patches -[9.255.255] +[9.255.1023] add api_version.patch add pr_fmt.patch add debug.patch add drx39xxj.patch -[5.1.255] +[5.1.1023] add v5.1_vm_map_pages.patch -[5.0.255] +[5.0.1023] add v5.0_ipu3-cio2.patch -[4.18.255] +[4.18.1023] add v4.18_fwnode_args_args.patch add v4.18_add_map_atomic.patch -[4.17.255] +[4.17.1023] add v4.17_proc_create_single.patch add v4.17_i2c_check_num_msgs.patch -[4.15.255] +[4.15.1023] add v4.15_pmdown_time.patch -[4.14.255] +[4.14.1023] add v4.14_saa7146_timer_cast.patch add v4.14_module_param_call.patch -[4.13.255] +[4.13.1023] add v4.13_remove_nospec_h.patch add v4.13_drmP.patch -[4.12.255] +[4.12.1023] add v4.12_revert_solo6x10_copykerneluser.patch -[4.11.255] +[4.11.1023] add v4.11_drop_drm_file.patch -[4.10.255] +[4.10.1023] add v4.10_sched_signal.patch add v4.10_fault_page.patch add v4.10_refcount.patch -[4.9.255] +[4.9.1023] add v4.9_mm_address.patch add v4.9_dvb_net_max_mtu.patch -[4.8.255] +[4.8.1023] add v4.8_user_pages_flag.patch add v4.8_em28xx_bitfield.patch add v4.8_dma_map_resource.patch add v4.8_drm_crtc.patch -[4.7.255] +[4.7.1023] add v4.7_dma_attrs.patch add v4.7_pci_alloc_irq_vectors.patch add v4.7_copy_to_user_warning.patch add v4.7_objtool_warning.patch -[4.6.255] +[4.6.1023] add v4.6_i2c_mux.patch -[4.5.255] +[4.5.1023] add v4.5_gpiochip_data_pointer.patch add v4.5_get_user_pages.patch add v4.5_uvc_super_plus.patch add v4.5_copy_to_user_warning.patch -[4.4.255] +[4.4.1023] add v4.4_gpio_chip_parent.patch -[4.3.255] +[4.3.1023] add v4.3_bt87x_const_fix.patch -[4.2.255] +[4.2.1023] add v4.2_atomic64.patch add v4.2_frame_vector.patch -[4.1.255] +[4.1.1023] add v4.1_drop_fwnode.patch -[4.0.255] +[4.0.1023] add v4.0_dma_buf_export.patch add v4.0_drop_trace.patch add v4.0_fwnode.patch -[3.19.255] +[3.19.1023] add v3.19_get_user_pages_unlocked.patch add v3.19_get_user_pages_locked.patch -[3.18.255] +[3.18.1023] add v3.18_drop_property_h.patch add v3.18_ktime_get_real_seconds.patch -[3.17.255] +[3.17.1023] add v3.17_fix_clamp.patch add v3.17_remove_bpf_h.patch -[3.16.255] +[3.16.1023] add v3.16_netdev.patch add v3.16_wait_on_bit.patch add v3.16_void_gpiochip_remove.patch -[3.13.255] +[3.13.1023] add v3.13_ddbridge_pcimsi.patch -[3.12.255] +[3.12.1023] add v3.12_kfifo_in.patch -[3.11.255] +[3.11.1023] add v3.11_dev_groups.patch -[3.10.255] +[3.10.1023] add v3.10_fw_driver_probe.patch add v3.10_ir_hix5hd2.patch add v3.10_const_snd_pcm_ops.patch -[3.9.255] +[3.9.1023] add v3.9_drxj_warnings.patch -[3.8.255] +[3.8.1023] add v3.8_config_of.patch -[3.6.255] +[3.6.1023] add v3.6_pci_error_handlers.patch add v3.6_i2c_add_mux_adapter.patch -[3.4.255] +[3.4.1023] add v3.4_i2c_add_mux_adapter.patch add v3.4_stk_webcam.patch -[3.3.255] +[3.3.1023] add v3.3_eprobe_defer.patch -[3.2.255] +[3.2.1023] add v3.2_devnode_uses_mode_t.patch add v3.2_alloc_ordered_workqueue.patch -[3.1.255] +[3.1.1023] add v3.1_no_export_h.patch add v3.1_no_dma_buf_h.patch add v3.1_no_pm_qos.patch -[3.0.255] +[3.0.1023] add no_atomic_include.patch add v3.0_ida2bit.patch add v3.0_remove_ida_lird_dev.patch diff --git a/linux/Makefile b/linux/Makefile index e404db9..b028274 100644 --- a/linux/Makefile +++ b/linux/Makefile @@ -79,7 +79,7 @@ todaytar: -rm -f $(PWD)/$(TODAY_TAR).bz2 tar cf $(PWD)/$(TODAY_TAR) -C $(DIR) $(TARFILES) git --git-dir $(DIR)/.git log --pretty=oneline -n3 |sed -r 's,([\x22]),,g; s,([\x25\x5c]),\1\1,g' >git_log - perl -e 'while (<>) { $$a=$$1 if (m/^\s*VERSION\s*=\s*(\d+)/); $$b=$$1 if (m/^\s*PATCHLEVEL\s*=\s*(\d+)/); $$c=$$1 if (m/^\s*SUBLEVEL\s*=\s*(\d+)/); } printf "#define V4L2_VERSION %d\n", ((($$a) << 16) + (($$b) << 8) + ($$c))' $(DIR)/Makefile > kernel_version.h + perl -e 'while (<>) { $$a=$$1 if (m/^\s*VERSION\s*=\s*(\d+)/); $$b=$$1 if (m/^\s*PATCHLEVEL\s*=\s*(\d+)/); $$c=$$1 if (m/^\s*SUBLEVEL\s*=\s*(\d+)/); } printf "#define V4L2_VERSION %d\n", ((($$a) << 16) + (($$b) << 8) + ($$c > 255 ? 255 : $$c))' $(DIR)/Makefile > kernel_version.h tar rvf $(PWD)/$(TODAY_TAR) git_log kernel_version.h for i in $(TARDIR); do \ @@ -98,7 +98,7 @@ tar: -rm -f $(PWD)/linux-media.tar.bz2 tar cf $(PWD)/linux-media.tar -C $(DIR) $(TARFILES) git --git-dir $(DIR)/.git log --pretty=oneline -n3 |sed -r 's,([\x22]),,g; s,([\x25\x5c]),\1\1,g' >git_log - perl -e 'while (<>) { $$a=$$1 if (m/^\s*VERSION\s*=\s*(\d+)/); $$b=$$1 if (m/^\s*PATCHLEVEL\s*=\s*(\d+)/); $$c=$$1 if (m/^\s*SUBLEVEL\s*=\s*(\d+)/); } printf "#define V4L2_VERSION %d\n", ((($$a) << 16) + (($$b) << 8) + ($$c))' $(DIR)/Makefile > kernel_version.h + perl -e 'while (<>) { $$a=$$1 if (m/^\s*VERSION\s*=\s*(\d+)/); $$b=$$1 if (m/^\s*PATCHLEVEL\s*=\s*(\d+)/); $$c=$$1 if (m/^\s*SUBLEVEL\s*=\s*(\d+)/); } printf "#define V4L2_VERSION %d\n", ((($$a) << 16) + (($$b) << 8) + ($$c > 255 ? 255 : $$c))' $(DIR)/Makefile > kernel_version.h tar rvf $(PWD)/linux-media.tar git_log kernel_version.h for i in $(TARDIR); do \ if [ "`echo $$i|grep Documentation`" = "" ]; then \ diff --git a/linux/patches_for_kernel.pl b/linux/patches_for_kernel.pl index 91b79fd..6ab3077 100755 --- a/linux/patches_for_kernel.pl +++ b/linux/patches_for_kernel.pl @@ -22,6 +22,7 @@ sub kernel_version($) { $sublevel = 0; } $sublevel = 0 if ($sublevel == ""); + $sublevel = 255 if ($sublevel > 255); return ($version * 65536 + $patchlevel * 256 + $sublevel); } diff --git a/linux/use_dir.pl b/linux/use_dir.pl index b461ec5..7ca8b35 100755 --- a/linux/use_dir.pl +++ b/linux/use_dir.pl @@ -291,7 +291,7 @@ sub sync_kernel_version() $c=$1 if (m/^\s*SUBLEVEL\s*=\s*(\d+)/); } close IN; - $source_v4l_version = ((($a) << 16) + (($b) << 8) + ($c)); + $source_v4l_version = ((($a) << 16) + (($b) << 8) + ($c > 255 ? 255 : $c)); if (open IN, "kernel_version.h") { while (<IN>) { -- 2.33.0 ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/dvb-latest/patches/amlogic-5.4/driver.dvb.dvb-latest-01-remove-rmmod.pl.patch ================================================ diff --git a/v4l/Makefile b/v4l/Makefile index c45102e..4057e7e 100644 --- a/v4l/Makefile +++ b/v4l/Makefile @@ -51,7 +51,7 @@ default:: prepare @echo Kernel build directory is $(OUTDIR) $(MAKE) -C ../linux apply_patches $(MAKE) -C $(OUTDIR) M=$(PWD) $(MYCFLAGS) modules - ./scripts/rmmod.pl check +# ./scripts/rmmod.pl check # $(MAKE) checkpatch mismatch:: prepare ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/dvb-latest/patches/amlogic-5.4/driver.dvb.dvb-latest-03-add-include-prandom-h.patch ================================================ From 10cee8e4d90788f865f6378a250cde4ab9d29f5d Mon Sep 17 00:00:00 2001 From: Hans Verkuil <hverkuil-cisco@xs4all.nl> Date: Wed, 19 Aug 2020 09:51:02 +0200 Subject: [PATCH] Add include/linux/prandom.h as alternate header to look in Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> --- v4l/scripts/make_config_compat.pl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/v4l/scripts/make_config_compat.pl b/v4l/scripts/make_config_compat.pl index 6a1ddf1..f579fc4 100644 --- a/v4l/scripts/make_config_compat.pl +++ b/v4l/scripts/make_config_compat.pl @@ -656,8 +656,8 @@ sub check_other_dependencies() check_files_for_func("mp_mb__after_atomic", "NEED_SMP_MB_AFTER_ATOMIC", "include/asm-generic/barrier.h"); check_files_for_func("pci_zalloc_consistent", "NEED_PCI_ZALLOC_CONSISTENT", "include/asm-generic/pci-dma-compat.h", "include/linux/pci-dma-compat.h"); check_files_for_func("kref_get_unless_zero", "NEED_KREF_GET_UNLESS_ZERO", "include/linux/kref.h"); - check_files_for_func("prandom_u32_max", "NEED_PRANDOM_U32_MAX", "include/linux/random.h"); - check_files_for_func("prandom_u32", "NEED_PRANDOM_U32", "include/linux/random.h"); + check_files_for_func("prandom_u32_max", "NEED_PRANDOM_U32_MAX", "include/linux/random.h", "include/linux/prandom.h"); + check_files_for_func("prandom_u32", "NEED_PRANDOM_U32", "include/linux/random.h", "include/linux/prandom.h"); check_files_for_func("GENMASK", "NEED_GENMASK", "include/linux/bitops.h", "include/linux/bits.h"); check_files_for_func("mult_frac", "NEED_MULT_FRAC", "include/linux/kernel.h"); check_files_for_func("clk_prepare_enable", "NEED_CLOCK_HELPERS", "include/linux/clk.h"); @@ -720,7 +720,7 @@ sub check_other_dependencies() check_files_for_func("usb_urb_ep_type_check", "NEED_USB_EP_CHECK", "include/linux/usb.h"); check_files_for_func("get_user_pages_longterm", "NEED_GET_USER_PAGES_LONGTERM", "include/linux/mm.h"); check_files_for_func("__pfn_to_phys", "NEED_PFN_TO_PHYS", "include/asm-generic/memory_model.h"); - check_files_for_func("next_pseudo_random32", "NEED_NEXT_PSEUDO_RANDOM32", "include/linux/random.h"); + check_files_for_func("next_pseudo_random32", "NEED_NEXT_PSEUDO_RANDOM32", "include/linux/random.h", "include/linux/prandom.h"); check_files_for_func("memdup_user_nul", "NEED_MEMDUP_USER_NUL", "include/linux/string.h"); check_files_for_func("STACK_FRAME_NON_STANDARD", "NEED_STACK_FRAME_NON_STANDARD", "include/linux/frame.h"); check_files_for_func("pci_free_irq_vectors", "NEED_PCI_FREE_IRQ_VECTORS", "include/linux/pci.h"); -- 2.33.0 ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/dvb-latest/patches/amlogic-5.4/driver.dvb.dvb-latest-05-do-not-handle-warning-as-error.patch ================================================ diff --git a/v4l/Makefile b/v4l/Makefile index d6e4d69..c0cf389 100644 --- a/v4l/Makefile +++ b/v4l/Makefile @@ -146,6 +146,8 @@ EXTRA_CFLAGS += -include $(obj)/compat.h # gives too much warnings (false positives) -> disable it EXTRA_CFLAGS += -Wno-format-truncation +EXTRA_CFLAGS += -Wno-error + ################################################# # Kernel 2.6/3.x specific rules ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/dvb-latest/patches/amlogic-common/driver.dvb.dvb-latest-01-config_mycompat_h.patch ================================================ --- /dev/null +++ b/v4l/config-mycompat.h @@ -0,0 +1,8 @@ +#undef smp_mb__after_atomic +#define smp_mb__after_atomic() smp_mb() /*mb*/ +#undef NEED_SMP_MB_AFTER_ATOMIC +#undef writel_relaxed +#define writel_relaxed(v,c) ((void)__raw_writel((__force u32)cpu_to_le32(v),(c))) +#undef NEED_WRITEL_RELAXED +#undef NEED_PM_RUNTIME_GET +#undef NEED_OF_NODE_NAME_EQ -- ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/dvb-latest/patches/amlogic-common/driver.dvb.dvb-latest-02-disable-modules.patch ================================================ --- a/v4l/scripts/make_kconfig.pl +++ b/v4l/scripts/make_kconfig.pl @@ -626,6 +626,12 @@ ($$) close OUT; # These options should default to off +disable_config('MEDIA_ANALOG_TV_SUPPORT'); +disable_config('MEDIA_CAMERA_SUPPORT'); +disable_config('MEDIA_CEC_SUPPORT'); +disable_config('SOC_CAMERA'); +disable_config('VIDEO_SAA7146_VV'); +disable_config('RC_CORE'); disable_config('DVB_AV7110_FIRMWARE'); disable_config('DVB_CINERGYT2_TUNING'); disable_config('VIDEO_HELPER_CHIPS_AUTO'); ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/dvb-latest/patches/amlogic-common/driver.dvb.dvb-latest-03-versions.patch ================================================ --- a/v4l/versions.txt 2018-06-26 18:42:30.000000000 +0200 +++ b/v4l/versions.txt 2018-08-14 15:28:29.713517240 +0200 @@ -24,10 +24,6 @@ VIDEO_ADV748X [4.7.0] -# needs i2c_mux_alloc -DVB_RTL2830 -DVB_RTL2832 -DVB_M88DS3103 # needs struct i2c_mux_core DVB_AF9013 ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/dvb-latest/patches/amlogic-common/driver.dvb.dvb-latest-06-sched_signal-fix.patch ================================================ diff --git a/backports/v4.10_sched_signal.patch b/backports/v4.10_sched_signal.patch index fbed946..59e275e 100644 --- a/backports/v4.10_sched_signal.patch +++ b/backports/v4.10_sched_signal.patch @@ -86,66 +86,6 @@ /* If you have already X v4l cards, then set this to X. This way the device numbers stay matched. Example: you have a WinTV card -diff --git a/drivers/media/pci/ivtv/ivtv-driver.h b/drivers/media/pci/ivtv/ivtv-driver.h -index 6b099da..81f3c19 100644 ---- a/drivers/media/pci/ivtv/ivtv-driver.h -+++ b/drivers/media/pci/ivtv/ivtv-driver.h -@@ -39,38 +39,37 @@ - * using information provided by Jiun-Kuei Jung @ AVerMedia. - */ - --#include <linux/module.h> --#include <linux/init.h> -+#include <asm/byteorder.h> - #include <linux/delay.h> --#include <linux/sched/signal.h> -+#include <linux/device.h> - #include <linux/fs.h> --#include <linux/pci.h> --#include <linux/interrupt.h> --#include <linux/spinlock.h> - #include <linux/i2c.h> - #include <linux/i2c-algo-bit.h> -+#include <linux/init.h> -+#include <linux/interrupt.h> -+#include <linux/ivtv.h> -+#include <linux/kernel.h> -+#include <linux/kthread.h> - #include <linux/list.h> --#include <linux/unistd.h> -+#include <linux/module.h> -+#include <linux/mutex.h> - #include <linux/pagemap.h> -+#include <linux/pci.h> - #include <linux/scatterlist.h> --#include <linux/kthread.h> --#include <linux/mutex.h> -+#include <linux/sched.h> - #include <linux/slab.h> -+#include <linux/spinlock.h> - #include <linux/uaccess.h> --#include <asm/byteorder.h> -+#include <linux/unistd.h> - --#include <linux/dvb/video.h> --#include <linux/dvb/audio.h> -+#include <media/drv-intf/cx2341x.h> -+#include <media/i2c/ir-kbd-i2c.h> -+#include <media/tuner.h> - #include <media/v4l2-common.h> --#include <media/v4l2-ioctl.h> - #include <media/v4l2-ctrls.h> - #include <media/v4l2-device.h> - #include <media/v4l2-fh.h> --#include <media/tuner.h> --#include <media/drv-intf/cx2341x.h> --#include <media/i2c/ir-kbd-i2c.h> -- --#include <linux/ivtv.h> -+#include <media/v4l2-ioctl.h> - - /* Memory layout */ - #define IVTV_ENCODER_OFFSET 0x00000000 diff --git a/drivers/media/pci/pt1/pt1.c b/drivers/media/pci/pt1/pt1.c index 5708f69..e306544 100644 --- a/drivers/media/pci/pt1/pt1.c ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/dvb-latest/patches/driver.dvb.dvb-latest-02-add-to-backports.patch ================================================ --- a/backports/backports.txt +++ b/backports/backports.txt @@ -31,6 +31,4 @@ add v4.18_add_map_atomic.patch -[4.20.255] -add v4.20_access_ok.patch [4.17.255] @@ -91,6 +89,5 @@ [4.1.255] -add v4.1_pat_enabled.patch add v4.1_drop_fwnode.patch [4.0.255] -- ================================================ FILE: projects/Amlogic-ce/packages/addons/driver/dvb-latest/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) ================================================ FILE: projects/Amlogic-ce/packages/addons/service/aml-vnc/changelog.txt ================================================ 20.3.5 - replace package source git repository - creating a source directory with the necessary files and their modifications - modify the service start script to be compatible with the new binary - add Hungarian translation of the add-on - restart service on settings change 20.3.4 - performance fixes 20.3.3 - fix resolution issue when used other than native 20.3.2 - add option to set desktop name (hostname by default) 20.3.1 - make IPv6 listen port consistent with IPv4 port 20.1.0 - fix password authentication when building with openssl >=3.0.0 20.0.104 - update language strings file 103 - improvements 102 - libvncserver bump 101 - CoreELEC rebrand 100 - Initial release ================================================ FILE: projects/Amlogic-ce/packages/addons/service/aml-vnc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="aml-vnc" PKG_VERSION="1.1.0" PKG_SHA256="50a0040b46019c2781f671401907be4b24fb9f5749a7e439c4111c0853a4fe58" PKG_REV="5" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/dtechsrv/aml-vnc-server/" PKG_URL="https://github.com/dtechsrv/aml-vnc-server/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libvncserver" PKG_SECTION="service" PKG_SHORTDESC="Amlogic VNC server" PKG_LONGDESC="Amlogic VNC server is a Virtual Network Computing (VNC) server for Amlogic devices" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Amlogic VNC" PKG_ADDON_TYPE="xbmc.service" pre_configure_target() { export CFLAGS+=" -Wno-stringop-truncation" } makeinstall_target() { : } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/{bin,lib} cp -P ${PKG_BUILD}/aml-vnc ${ADDON_BUILD}/${PKG_ADDON_ID}/bin cp $(get_build_dir libvncserver)/.${TARGET_NAME}/libvncserver.so.? ${ADDON_BUILD}/${PKG_ADDON_ID}/lib } ================================================ FILE: projects/Amlogic-ce/packages/addons/service/aml-vnc/source/bin/aml-vnc.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2016-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) . /etc/profile oe_setup_addon service.aml-vnc if [ ${AML_VNC_PORT} != "5900" ] ; then export VNC_PORT="${AML_VNC_PORT}" fi if [ ${AML_VNC_AUTH} == "true" ] ; then export VNC_PASSWORD="${AML_VNC_PWD}" fi if [ ${AML_VNC_STAT} == "true" ] ; then export VNC_SERVERNAME="${AML_VNC_NAME}" fi exec aml-vnc ================================================ FILE: projects/Amlogic-ce/packages/addons/service/aml-vnc/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) import subprocess import xbmc import xbmcaddon class Monitor(xbmc.Monitor): def __init__(self, *args, **kwargs): xbmc.Monitor.__init__(self) self.id = xbmcaddon.Addon().getAddonInfo('id') def onSettingsChanged(self): subprocess.call(['systemctl', 'restart', self.id]) if __name__ == "__main__": Monitor().waitForAbort() ================================================ FILE: projects/Amlogic-ce/packages/addons/service/aml-vnc/source/power.d/aml-vnc.power ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2016-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) . /etc/profile SERVICE="service.aml-vnc.service" case "$1" in pre) if systemctl is-active "$SERVICE" &>/dev/null ; then systemctl stop "$SERVICE" fi ;; post) if systemctl is-enabled "$SERVICE" &>/dev/null ; then systemctl start "$SERVICE" fi ;; esac ================================================ FILE: projects/Amlogic-ce/packages/addons/service/aml-vnc/source/resources/language/resource.language.en_gb/strings.po ================================================ # Kodi Media Center language file # Addon Name: Amlogic VNC Server # Addon id: service.aml-vnc # Addon Provider: Team CoreELEC msgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgctxt "#30000" msgid "Server settings" msgstr "" msgctxt "#30001" msgid "Port" msgstr "" msgctxt "#30002" msgid "Use authentication" msgstr "" msgctxt "#30003" msgid "Password" msgstr "" msgctxt "#30004" msgid "Use static name instead of hostname" msgstr "" msgctxt "#30005" msgid "Name to be displayed" msgstr "" ================================================ FILE: projects/Amlogic-ce/packages/addons/service/aml-vnc/source/resources/language/resource.language.hu_hu/strings.po ================================================ # Kodi Media Center language file # Addon Name: Amlogic VNC Server # Addon id: service.aml-vnc # Addon Provider: Team CoreELEC msgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hu_HU\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "Server settings" msgstr "Szerver beállítások" msgctxt "#30001" msgid "Port" msgstr "" msgctxt "#30002" msgid "Use authentication" msgstr "Hitelesítés használata" msgctxt "#30003" msgid "Password" msgstr "Jelszó" msgctxt "#30004" msgid "Use static name instead of hostname" msgstr "Statikus név használata a hosztnév helyett" msgctxt "#30005" msgid "Name to be displayed" msgstr "Megjelenített név" ================================================ FILE: projects/Amlogic-ce/packages/addons/service/aml-vnc/source/resources/settings.xml ================================================ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <settings> <category label="30000"> <setting type="lsep" /> <setting id="AML_VNC_PORT" type="number" label="30001" default="5900" /> <setting id="AML_VNC_AUTH" type="bool" label="30002" default="true" /> <setting id="AML_VNC_PWD" type="text" label="30003" default="coreelec" visible="eq(-1,true)" /> <setting id="AML_VNC_STAT" type="bool" label="30004" default="false" /> <setting id="AML_VNC_NAME" type="text" label="30005" default="CoreELEC" enable="eq(-1,true)" /> </category> </settings> ================================================ FILE: projects/Amlogic-ce/packages/addons/service/aml-vnc/source/settings-default.xml ================================================ <settings> <setting id="AML_VNC_PORT" value="5900" /> <setting id="AML_VNC_AUTH" value="true" /> <setting id="AML_VNC_PWD" value="coreelec" /> <setting id="AML_VNC_STAT" value="false" /> <setting id="AML_VNC_NAME" value="CoreELEC" /> </settings> ================================================ FILE: projects/Amlogic-ce/packages/addons/service/aml-vnc/source/system.d/service.aml-vnc.service ================================================ [Unit] Description=aml-vnc After=graphical.target [Service] ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.aml-vnc/bin/aml-vnc.start" TimeoutStopSec=1 Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=kodi.target ================================================ FILE: projects/Amlogic-ce/packages/addons/service/homatics-leds/LICENSE.txt ================================================ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. ================================================ FILE: projects/Amlogic-ce/packages/addons/service/homatics-leds/addon.xml ================================================ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="@PKG_ADDON_ID@" name="@ADDON_NAME@" version="@ADDON_VERSION@" provider-name="@PROVIDER_NAME@"> <requires> <import addon="xbmc.python" version="3.0.0"/> </requires> <extension point="xbmc.python.pluginsource" library="default.py"> <provides>executable</provides> </extension> <extension point="xbmc.service" library="service.py"> <provides/> </extension> <extension point="xbmc.addon.metadata"> <summary lang="de_DE">Homatics LED Kit Modus</summary> <summary lang="en_GB">Homatics LED Kit mode</summary> <summary lang="hu_HU">Homatics LED Kit üzemmód</summary> <description lang="de_DE"> Mit diesem Addon können die LEDs in den Knight-Rider-Modus gesetzt werden, oder ihre Farbe kann einfach angepasst werden... Danke an vpeter und FoLeY für die Unterstützung... hex grün 122e04, blau 101010, lila 800080, gelb ff4600, tiefblau 0d00bf, magenta d8007a, orange f50e00, ff0000 rot, 00000 keine Farbe </description> <description lang="en_GB"> With this addon, the LEDs can be set to knight rider mode, or their color can be simply customized... Thanks to vpeter and FoLeY for the support... hex green 122e04, blue 101010, purple 800080, yellow ff4600, deepblue 0d00bf, magenta d8007a, orange f50e00, ff0000 red, 00000 no color </description> <description lang="hu_HU"> A kiegészítővel beállíthatóak a ledek knight Rider módba, vagy simán testreszabható a színük ... Köszönet vpeter-nek, és FoLeY-nak a támogatásért... hex green 122e04, blue 101010, purple 800080, yellow ff4600, deepblue 0d00bf, magenta d8007a, orange f50e00, ff0000 red, 00000 no color </description> <disclaimer> </disclaimer> <platform>all</platform> <news> 20.3.2 - added german translation 20.3.1 - added language strings </news> <assets> <icon>resources/icon.png</icon> <fanart>resources/fanart.jpg</fanart> </assets> </extension> </addon> ================================================ FILE: projects/Amlogic-ce/packages/addons/service/homatics-leds/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) PKG_NAME="homatics-leds" PKG_VERSION="0.1" PKG_SHA256="" PKG_REV="2" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://coreelec.org" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="service" PKG_SHORTDESC="Homatics LED Kit mode" PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_NAME="Homatics LEDs" PKG_ADDON_TYPE="xbmc.service" addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/resources cp ${PKG_DIR}/LICENSE.txt ${ADDON_BUILD}/${PKG_ADDON_ID} cp ${PKG_DIR}/addon.xml ${ADDON_BUILD}/${PKG_ADDON_ID} # set only version (revision will be added by buildsystem) sed -e "s|@ADDON_VERSION@|${ADDON_VERSION}|g" \ -i ${ADDON_BUILD}/${PKG_ADDON_ID}/addon.xml } ================================================ FILE: projects/Amlogic-ce/packages/addons/service/homatics-leds/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) import urllib.request, urllib.parse, urllib.error import urllib.parse import sys import xbmc import xbmcgui import xbmcplugin import xbmcaddon import os import subprocess ADDON_ID = 'service.homatics-leds' addon = xbmcaddon.Addon(ADDON_ID) base_url = sys.argv[0] addon_handle = int(sys.argv[1]) args = urllib.parse.parse_qs(sys.argv[2][1:]) def build_url(query): return base_url + '?' + urllib.parse.urlencode(query) addon_icon = 'special://home/addons/service.homatics-leds/resources/icon.png' addon_icon1 = 'special://home/addons/service.homatics-leds/resources/icon1.png' addon_icon2 = 'special://home/addons/service.homatics-leds/resources/icon2.png' addon_icon3 = 'special://home/addons/service.homatics-leds/resources/icon3.png' addon_icon4 = 'special://home/addons/service.homatics-leds/resources/icon4.png' addon_icon5 = 'special://home/addons/service.homatics-leds/resources/icon5.png' addon_icon6 = 'special://home/addons/service.homatics-leds/resources/icon6.png' addon_icon7 = 'special://home/addons/service.homatics-leds/resources/icon7.png' addon_icon8 = 'special://home/addons/service.homatics-leds/resources/icon8.png' addon_icon9 = 'special://home/addons/service.homatics-leds/resources/icon9.png' mode = args.get('mode', None) if mode is None: url = build_url({'mode': 'red', 'foldername': 'LEDs red'}) li = xbmcgui.ListItem(addon.getLocalizedString(32009)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon1, 'thumb' : addon_icon1}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) url = build_url({'mode': 'blue', 'foldername': 'LEDs blue'}) li = xbmcgui.ListItem(addon.getLocalizedString(32010)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon2, 'thumb' : addon_icon2}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) url = build_url({'mode': 'green', 'foldername': 'LEDs green'}) li = xbmcgui.ListItem(addon.getLocalizedString(32011)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon3, 'thumb' : addon_icon3}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) url = build_url({'mode': 'purple', 'foldername': 'LEDs purple'}) li = xbmcgui.ListItem(addon.getLocalizedString(32012)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon4, 'thumb' : addon_icon4}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) url = build_url({'mode': 'yellow', 'foldername': 'LEDs yellow'}) li = xbmcgui.ListItem(addon.getLocalizedString(32013)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon5, 'thumb' : addon_icon5}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) url = build_url({'mode': 'deepblue', 'foldername': 'LEDs deepblue'}) li = xbmcgui.ListItem(addon.getLocalizedString(32014)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon6, 'thumb' : addon_icon6}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) url = build_url({'mode': 'magenta', 'foldername': 'LEDs magenta'}) li = xbmcgui.ListItem(addon.getLocalizedString(32015)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon7, 'thumb' : addon_icon7}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) url = build_url({'mode': 'orange', 'foldername': 'LEDs orange'}) li = xbmcgui.ListItem(addon.getLocalizedString(32016)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon8, 'thumb' : addon_icon8}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) url = build_url({'mode': 'purpleN', 'foldername': 'LEDs straight purple'}) li = xbmcgui.ListItem(addon.getLocalizedString(32017)) li.setArt({'fanart': addon.getAddonInfo('fanart'), 'icon': addon_icon9, 'thumb' : addon_icon9}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=False) xbmcplugin.endOfDirectory(addon_handle) elif mode[0] == 'red' or mode[0] == 'orange' or mode[0] == 'green' or mode[0] == 'magenta' or mode[0] == 'deepblue' or mode[0] == 'blue' or mode[0] == 'purple' or mode[0] == 'yellow': xbmc.log('mode[0] %s' % mode[0], level=xbmc.LOGERROR) addon.setSetting('strip_color', mode[0]) addon.setSetting('solid_color_type_on', 'name') addon.setSetting('solid_effect', 'effect') xbmc.executeJSONRPC('{"jsonrpc":"2.0","method":"Addons.SetAddonEnabled","id":8,"params":{"addonid":"%s","enabled":false}}'% ADDON_ID) xbmc.sleep(2000) xbmc.executeJSONRPC('{"jsonrpc":"2.0","method":"Addons.SetAddonEnabled","id":8,"params":{"addonid":"%s","enabled":true}}'% ADDON_ID) elif mode[0] == 'purpleN': xbmc.log('mode[0] %s' % 'purpleN', level=xbmc.LOGERROR) addon.setSetting('strip_color', 'purple') addon.setSetting('solid_color_type_on', 'name') addon.setSetting('solid_effect', 'solid') xbmc.executeJSONRPC('{"jsonrpc":"2.0","method":"Addons.SetAddonEnabled","id":8,"params":{"addonid":"%s","enabled":false}}'% ADDON_ID) xbmc.sleep(2000) xbmc.executeJSONRPC('{"jsonrpc":"2.0","method":"Addons.SetAddonEnabled","id":8,"params":{"addonid":"%s","enabled":true}}'% ADDON_ID) ================================================ FILE: projects/Amlogic-ce/packages/addons/service/homatics-leds/source/resources/language/resource.language.de_de/strings.po ================================================ # Kodi Media Center language file # Addon Name: Homatics LED setup # Addon id: service.homatics-leds # Addon Provider: Team CoreELEC msgid "" msgstr "" msgctxt "#32000" msgid "LED" msgstr "" msgctxt "#32001" msgid "Effect color" msgstr "Farbe des Effekts" msgctxt "#32002" msgid "Effect or solid" msgstr "Effekt oder Einfarbig" msgctxt "#32003" msgid "Color by name or hex" msgstr "Farbe nach Name oder HEX" msgctxt "#32004" msgid "Solid color On" msgstr "LED-Farbe: Eingeschaltet" msgctxt "#32005" msgid "Solid color Off" msgstr "LED-Farbe: Ausgeschaltet" msgctxt "#32006" msgid "Solid color Suspend" msgstr "LED-Farbe: Schlafmodus" msgctxt "#32007" msgid "Number of LEDs On" msgstr "Anzahl der eingeschalteten LEDs" msgctxt "#32009" msgid "Set red Knight Rider effect" msgstr "Knight-Rider-Effekt: Rot" msgctxt "#32010" msgid "Set blue Knight Rider effect" msgstr "Knight-Rider-Effekt: Blau" msgctxt "#32011" msgid "Set green Knight Rider effect" msgstr "Knight-Rider-Effekt: Grün" msgctxt "#32012" msgid "Set purple Knight Rider effect" msgstr "Knight-Rider-Effekt: Lila" msgctxt "#32013" msgid "Set yellow Knight Rider effect" msgstr "Knight-Rider-Effekt: Gelb" msgctxt "#32014" msgid "Set deepblue Knight Rider effect" msgstr "Knight-Rider-Effekt: Tiefblau" msgctxt "#32015" msgid "Set magenta Knight Rider effect" msgstr "Knight-Rider-Effekt: Magenta" msgctxt "#32016" msgid "Set orange Knight Rider effect" msgstr "Knight-Rider-Effekt: Orange" msgctxt "#32017" msgid "Set straight purple color" msgstr "Einfarbige Farbe: Lila" ================================================ FILE: projects/Amlogic-ce/packages/addons/service/homatics-leds/source/resources/language/resource.language.en_gb/strings.po ================================================ # Kodi Media Center language file # Addon Name: Homatics LED setup # Addon id: service.homatics-leds # Addon Provider: Team CoreELEC msgid "" msgstr "" msgctxt "#32000" msgid "LED" msgstr "" msgctxt "#32001" msgid "Effect color" msgstr "" msgctxt "#32002" msgid "Effect or solid" msgstr "" msgctxt "#32003" msgid "Color by name or hex" msgstr "" msgctxt "#32004" msgid "Solid color On" msgstr "" msgctxt "#32005" msgid "Solid color Off" msgstr "" msgctxt "#32006" msgid "Solid color Suspend" msgstr "" msgctxt "#32007" msgid "Number of LEDs On" msgstr "" msgctxt "#32009" msgid "Set red Knight Rider effect" msgstr "" msgctxt "#32010" msgid "Set blue Knight Rider effect" msgstr "" msgctxt "#32011" msgid "Set green Knight Rider effect" msgstr "" msgctxt "#32012" msgid "Set purple Knight Rider effect" msgstr "" msgctxt "#32013" msgid "Set yellow Knight Rider effect" msgstr "" msgctxt "#32014" msgid "Set deepblue Knight Rider effect" msgstr "" msgctxt "#32015" msgid "Set magenta Knight Rider effect" msgstr "" msgctxt "#32016" msgid "Set orange Knight Rider effect" msgstr "" msgctxt "#32017" msgid "Set straight purple color" msgstr "" ================================================ FILE: projects/Amlogic-ce/packages/addons/service/homatics-leds/source/resources/language/resource.language.hu_hu/strings.po ================================================ Kodi Media Center language file # Addon Name: Homatics LED setup # Addon id: service.homatics-leds # Addon Provider: Team CoreELEC msgid "" msgstr "" msgctxt "#32000" msgid "LED" msgstr "" msgctxt "#32001" msgid "Effect color" msgstr "Ledek színe" msgctxt "#32002" msgid "Effect or solid" msgstr "Effekt vagy egyszerű szín" msgctxt "#32003" msgid "Color by name or hex" msgstr "Szín neve vagy hex kód" msgctxt "#32004" msgid "Solid color On" msgstr "Led színe: box bekapcsolva" msgctxt "#32005" msgid "Solid color Off" msgstr "Led színe: box kikapcsolva" msgctxt "#32006" msgid "Solid color Suspend" msgstr "Led színe: box alvó állapot" msgctxt "#32007" msgid "Number of LEDs On" msgstr "Ledek száma" msgctxt "#32009" msgid "Set red Knight Rider effect" msgstr "Vörös Knight rider effekt beállítása" msgctxt "#32010" msgid "Set blue Knight Rider effect" msgstr "Kék Knight rider effekt" msgctxt "#32011" msgid "Set green Knight Rider effect" msgstr "Zöld Knight rider effekt" msgctxt "#32012" msgid "Set purple Knight Rider effect" msgstr "Lila Knight rider effekt" msgctxt "#32013" msgid "Set yellow Knight Rider effect" msgstr "Sárga Knight rider effekt" msgctxt "#32014" msgid "Set deepblue Knight Rider effect" msgstr "Sötétkék Knight rider effekt" msgctxt "#32015" msgid "Set magenta Knight Rider effect" msgstr "Magenta Knight rider effekt" msgctxt "#32016" msgid "Set orange Knight Rider effect" msgstr "Narancs Knight rider effekt" msgctxt "#32017" msgid "Set straight purple color" msgstr "Állíts be sima lila színt" ================================================ FILE: projects/Amlogic-ce/packages/addons/service/homatics-leds/source/resources/settings.xml ================================================ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <settings> <category label="32000"> <setting type="lsep" /> <setting label="32001" type="labelenum" id="strip_color" values="red|yellow|purple|blue|deepblue|magenta|green|orange" default="red"/> <setting label="32007" type="labelenum" id="number_leds" values="1|all|8|6|4|2" default="all"/> <setting label="32002" type="labelenum" id="solid_effect" values="effect|solid" default="effect"/> <setting label="32003" type="labelenum" id="solid_color_type_on" values="name|hex" default="name"/> <setting label="32004" type="text" id="color_on" default="101010"/> <setting label="32005" type="text" id="color_off" default="000000"/> <setting label="32006" type="text" id="color_suspend" default="800080"/> </category> </settings> ================================================ FILE: projects/Amlogic-ce/packages/addons/service/homatics-leds/source/service.py ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) from time import sleep import os.path from threading import Thread, Event import xbmc, xbmcaddon sysfs = '/sys/devices/platform/soc/fe000000.apb4/fe06c000.i2c/i2c-3/3-003c/leds/bct3236/' leds_count = 10 # do not change delay = 90 # in milliseconds ##################################################################### def myLog(msg, level = xbmc.LOGINFO): xbmc.log(addonid + ': ' + msg, level) ##################################################################### def write_sysfs(which, data): if os.path.isfile(sysfs + which): with open(sysfs + which, 'w') as file: file.write(data) ##################################################################### def led_on(pos, pos_min, pos_max, color): out_arr = [] out_str = '' for i in range(leds_count): out_arr.append('000000') if pos >= 0: out_arr[pos] = color elif pos_min >= 0 and pos_max >= 0: for pos in range(pos_min, pos_max + 1): out_arr[pos] = color for i in range(leds_count): out_str += out_arr[i] + ' ' #myLog('out_str: %s' % out_str) write_sysfs('colors', out_str) ##################################################################### class myEffectThread(Thread): def __init__(self, color, run_daemon_mode = False): Thread.__init__(self) self.stop_event = Event() self.running = True self.color = color myLog('myEffectThread color %s' % self.color) def stop_event_is_set(self): if self.stop_event.is_set(): self.stop_event.clear() self.running = False myLog('myEffectThread stopping') led_on(-1, -1, -1, '') return True else: return False def stop(self): self.stop_event.set() def stop_and_join(self): self.stop() try: self.join() except: pass def run(self): while self.running: if self.stop_event_is_set(): break # to right for i in range(0, leds_count, 1): led_on(i, -1, -1, self.color) sleep(delay / 1000.0) if self.stop_event_is_set(): break sleep(delay / 1000.0) # to left for i in range(9, -1, -1): led_on(i, -1, -1, self.color) sleep(delay / 1000.0) if self.stop_event_is_set(): break sleep(delay / 1000.0) ##################################################################### def setup(): solid_effect = xbmcaddon.Addon().getSetting('solid_effect') myLog('solid_effect %s' % solid_effect) # set on/off/suspend colors and then start effect if active set_solid() if solid_effect == 'effect': myLog('setup effect') strip_color = xbmcaddon.Addon().getSetting('strip_color') strip_color = color_name_to_hex(strip_color) my_effect_thread = myEffectThread(strip_color, True) my_effect_thread.start() else: myLog('setup solid') my_effect_thread = None return my_effect_thread ##################################################################### def set_solid(): color_on = xbmcaddon.Addon().getSetting('color_on') color_off = xbmcaddon.Addon().getSetting('color_off') color_suspend = xbmcaddon.Addon().getSetting('color_suspend') number_leds = xbmcaddon.Addon().getSetting('number_leds') solid_color_type_on = xbmcaddon.Addon().getSetting('solid_color_type_on') if solid_color_type_on == 'name': color_on = xbmcaddon.Addon().getSetting('strip_color') color_on = color_name_to_hex(color_on) if number_leds == 'all': number_leds = 10 else: number_leds = int(number_leds) myLog('set_solid color_on %s' % color_on) myLog('set_solid color_off %s' % color_off) myLog('set_solid color_suspend %s' % color_suspend) myLog('set_solid number_leds %d' % number_leds) write_sysfs('edge_color_on', color_on) write_sysfs('edge_color_off', color_off) write_sysfs('edge_color_suspend', color_suspend) # set only some LEDs on if number_leds == 1: led_on(4, -1, -1, color_on) elif number_leds == 2: led_on(-1, 4, 5, color_on) elif number_leds == 4: led_on(-1, 3, 6, color_on) elif number_leds == 6: led_on(-1, 2, 7, color_on) elif number_leds == 8: led_on(-1, 1, 8, color_on) ##################################################################### def color_name_to_hex(color): if color == 'green': return '122e04' elif color == 'blue': return '101010' elif color == 'purple': return '800080' elif color == 'yellow': return 'ff4600' elif color == 'deepblue': return '0d00bf' elif color == 'magenta': return 'd8007a' elif color == 'orange': return 'f50e00' else: return 'ff0000' # red ##################################################################### class xbmcMonitor(xbmc.Monitor): def __init__(self, thread): xbmc.Monitor.__init__(self) self.my_effect_thread = thread def onSettingsChanged(self): myLog('settings changed, restart') if self.my_effect_thread is not None: self.my_effect_thread.stop_and_join() self.my_effect_thread = setup() def onNotification(self, sender, method, data): myLog('notification %s' % (method)) if method == 'System.OnWake': if self.my_effect_thread is None: # set on/off/suspend colors set_solid() elif method == 'System.OnQuit': # set on/off/suspend colors which will be changed to off color set_solid() ##################################################################### if __name__ == '__main__': addonid = xbmcaddon.Addon().getAddonInfo('id') led_on(-1, -1, -1, '') my_effect_thread = setup() monitor = xbmcMonitor(my_effect_thread) while not monitor.abortRequested(): if monitor.waitForAbort(5): if my_effect_thread is not None: my_effect_thread.stop_and_join() myLog('finished') break ================================================ FILE: projects/Amlogic-ce/packages/addons/service/homatics-leds/source/settings-default.xml ================================================ <settings> <setting id="strip_color" value="red" /> <setting id="static_effect" value="effect" /> <setting id="number_leds" value="all" /> </settings> ================================================ FILE: projects/Amlogic-ce/packages/addons/service/hyperion.ng/changelog.txt ================================================ 113 - Update to 2.0.15 112 - fix dependencies and add new suspend/resume support suspend/resume support by PR hyperion-project/hyperion.ng#1535 111 - Update to 2.0.14 110 - Update to 2.0.13 109 - Update to 2.0.12 108 - Update to 2.0.0-alpha.11 ... 101 - Add Platform script 100 - Initial Release @e438bc6 ================================================ FILE: projects/Amlogic-ce/packages/addons/service/hyperion.ng/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="hyperion.ng" PKG_VERSION="2.0.15" PKG_SHA256="2e47fe29b64e02a3438a3d142a737d28af3439e5cc4502d340a605017fda6013" PKG_REV="113" PKG_LICENSE="GPL" PKG_SITE="https://github.com/hyperion-project/hyperion.ng" PKG_URL="https://github.com/hyperion-project/hyperion.ng/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 avahi libusb qt-everywhere pcre protobuf flatbuffers:host flatbuffers libcec libjpeg-turbo qmdnsengine mbedtls alsa-lib" PKG_SECTION="service" PKG_SHORTDESC="Hyperion.NG: an AmbiLight controller" PKG_LONGDESC="Hyperion.NG($PKG_VERSION) is an modern opensource AmbiLight implementation." PKG_IS_ADDON="yes" PKG_ADDON_NAME="Hyperion.NG" PKG_ADDON_TYPE="xbmc.service" PKG_CMAKE_OPTS_TARGET="-DCMAKE_NO_SYSTEM_FROM_IMPORTED=ON \ -DCMAKE_BUILD_TYPE=Release \ -DUSE_SYSTEM_PROTO_LIBS=ON \ -DUSE_SYSTEM_FLATBUFFERS_LIBS=ON \ -DUSE_SYSTEM_QMDNS_LIBS=ON \ -DUSE_SYSTEM_MBEDTLS_LIBS=ON \ -DPLATFORM=amlogic \ -DENABLE_AMLOGIC=ON \ -DENABLE_DISPMANX=OFF \ -DENABLE_FB=ON \ -DENABLE_DEV_WS281XPWM=OFF \ -DENABLE_X11=OFF \ -DENABLE_V4L2=ON \ -DENABLE_OSX=OFF \ -DENABLE_DEV_SPI=ON \ -DENABLE_MDNS=ON \ -DENABLE_DEV_TINKERFORGE=OFF \ -DENABLE_TESTS=OFF \ -DENABLE_DEPLOY_DEPENDENCIES=OFF \ -Wno-dev" addon() { mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/bin cp $PKG_BUILD/.$TARGET_NAME/bin/* $ADDON_BUILD/$PKG_ADDON_ID/bin } ================================================ FILE: projects/Amlogic-ce/packages/addons/service/hyperion.ng/patches/Embed-QSQLITE-driver-and-qjpeg-plugin-at-Amlogic-platform.patch ================================================ From b392172a82f8a3e927ba8dcfa4a9d505405a4f2f Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Sun, 17 Nov 2019 09:20:38 +0100 Subject: [PATCH] Embed QSQLITE driver and image format plugins at Amlogic platform --- CMakeLists.txt | 11 +++++++++++ libsrc/db/CMakeLists.txt | 6 ++++++ libsrc/db/DBManager.cpp | 7 +++++++ src/hyperion-aml/CMakeLists.txt | 2 +- src/hyperion-remote/CMakeLists.txt | 2 +- src/hyperiond/CMakeLists.txt | 2 +- src/hyperiond/hyperiond.cpp | 6 ++++++ 7 files changed, 33 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 786b444a..fa2c773e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -384,6 +384,17 @@ if (APPLE AND (${QT_VERSION_MAJOR} GREATER_EQUAL 6) ) set(OPENSSL_ROOT_DIR /usr/local/opt/openssl) ENDIF() +if (ENABLE_AMLOGIC) + foreach(plugin ${Qt${QT_VERSION_MAJOR}Sql_PLUGINS} Qt${QT_VERSION_MAJOR}::Sql) + get_target_property(_loc ${plugin} LOCATION) + set(plugin_libs ${plugin_libs} ${_loc}) + endforeach() + foreach(plugin ${Qt${QT_VERSION_MAJOR}Gui_PLUGINS} Qt${QT_VERSION_MAJOR}::Gui) + get_target_property(_loc ${plugin} LOCATION) + set(plugin_libs ${plugin_libs} ${_loc}) + endforeach() +endif() + # Add libusb and pthreads find_package(libusb-1.0 REQUIRED) add_definitions(${QT_DEFINITIONS}) diff --git a/libsrc/db/CMakeLists.txt b/libsrc/db/CMakeLists.txt index b81991e6..a09c06ef 100644 --- a/libsrc/db/CMakeLists.txt +++ b/libsrc/db/CMakeLists.txt @@ -14,3 +14,9 @@ target_link_libraries(database Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Sql ) + +if (ENABLE_AMLOGIC) + target_link_libraries(database + ${plugin_libs} + ) +endif() diff --git a/libsrc/db/DBManager.cpp b/libsrc/db/DBManager.cpp index c2f42deb..e3fd0901 100644 --- a/libsrc/db/DBManager.cpp +++ b/libsrc/db/DBManager.cpp @@ -1,3 +1,5 @@ +// Hyperion includes +#include <HyperionConfig.h> #include <db/DBManager.h> #include <QSqlDatabase> @@ -12,6 +14,11 @@ #include <stdexcept> #endif +#ifdef ENABLE_AMLOGIC +#include <QtPlugin> +Q_IMPORT_PLUGIN(QSQLiteDriverPlugin) +#endif + // not in header because of linking static QString _rootPath; static QThreadStorage<QSqlDatabase> _databasePool; diff --git a/src/hyperion-aml/CMakeLists.txt b/src/hyperion-aml/CMakeLists.txt index c67da159..a7c6d7b0 100644 --- a/src/hyperion-aml/CMakeLists.txt +++ b/src/hyperion-aml/CMakeLists.txt @@ -37,7 +37,7 @@ target_link_libraries(${PROJECT_NAME} if (ENABLE_AMLOGIC) target_link_libraries(${PROJECT_NAME} - pcre16 dl z + pcre16 dl z ${plugin_libs} ) endif() diff --git a/src/hyperion-remote/CMakeLists.txt b/src/hyperion-remote/CMakeLists.txt index ab47420a..4a40ad33 100644 --- a/src/hyperion-remote/CMakeLists.txt +++ b/src/hyperion-remote/CMakeLists.txt @@ -41,7 +41,7 @@ target_link_libraries(${PROJECT_NAME} if (ENABLE_AMLOGIC) target_link_libraries(${PROJECT_NAME} - pcre16 dl z + pcre16 dl z ${plugin_libs} ) endif() diff --git a/src/hyperiond/CMakeLists.txt b/src/hyperiond/CMakeLists.txt index 2712cd51..06e6b58b 100644 --- a/src/hyperiond/CMakeLists.txt +++ b/src/hyperiond/CMakeLists.txt @@ -75,7 +75,7 @@ endif (ENABLE_AVAHI) if (ENABLE_AMLOGIC) target_link_libraries(${PROJECT_NAME} #Qt${QT_VERSION_MAJOR}::Core - pcre16 dl z + pcre16 dl z ${plugin_libs} ) endif(ENABLE_AMLOGIC) diff --git a/src/hyperiond/hyperiond.cpp b/src/hyperiond/hyperiond.cpp index 80d30eab..2ff75fb2 100644 --- a/src/hyperiond/hyperiond.cpp +++ b/src/hyperiond/hyperiond.cpp @@ -28,6 +28,12 @@ #include <webserver/WebServer.h> #include "hyperiond.h" +#ifdef ENABLE_AMLOGIC +#include <QtPlugin> +Q_IMPORT_PLUGIN(QJpegPlugin) +Q_IMPORT_PLUGIN(QGifPlugin) +#endif + // Flatbuffer Server #include <flatbufserver/FlatBufferServer.h> -- 2.33.1 ================================================ FILE: projects/Amlogic-ce/packages/addons/service/hyperion.ng/patches/Fix-missing-Include.patch ================================================ From 637cad8794e1f6820b93ef14c8d28ebc06f44862 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Tue, 7 Mar 2023 19:47:25 +0100 Subject: [PATCH] Fix missing Include 'std::numeric_limits' do need '#include <limits>' --- CHANGELOG.md | 1 + libsrc/utils/jsonschema/QJsonSchemaChecker.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f0daa08c..ce4dead4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed ### Fixed +- Fixed missing Include limits in QJsonSchemaChecker ## Removed diff --git a/libsrc/utils/jsonschema/QJsonSchemaChecker.cpp b/libsrc/utils/jsonschema/QJsonSchemaChecker.cpp index 5cec2ec3..685ab4c7 100644 --- a/libsrc/utils/jsonschema/QJsonSchemaChecker.cpp +++ b/libsrc/utils/jsonschema/QJsonSchemaChecker.cpp @@ -1,4 +1,5 @@ // stdlib includes +#include <limits> #include <iterator> #include <algorithm> #include <cmath> -- 2.39.1 ================================================ FILE: projects/Amlogic-ce/packages/addons/service/hyperion.ng/source/bin/hyperiond.start ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) . /etc/profile oe_setup_addon service.hyperion.ng exec hyperiond --userdata $ADDON_HOME & echo $! > /run/hyperiond.pid if [ -f "/usr/bin/Xorg" ]; then exec hyperion-x11 & fi ================================================ FILE: projects/Amlogic-ce/packages/addons/service/hyperion.ng/source/bin/platform.sh ================================================ #!/bin/sh case "$1" in start) [ -d "/sys/module/amvdec_h265" ] && echo 3 > /sys/module/amvdec_h265/parameters/double_write_mode [ -d "/sys/module/amvdec_vp9" ] && echo 3 > /sys/module/amvdec_vp9/parameters/double_write_mode [ -d "/sys/module/amvdec_av1" ] && echo 3 > /sys/module/amvdec_av1/parameters/double_write_mode ;; stop) [ -d "/sys/module/amvdec_h265" ] && echo 0 > /sys/module/amvdec_h265/parameters/double_write_mode [ -d "/sys/module/amvdec_vp9" ] && echo 0 > /sys/module/amvdec_vp9/parameters/double_write_mode [ -d "/sys/module/amvdec_av1" ] && echo 0 > /sys/module/amvdec_av1/parameters/double_write_mode ;; esac ================================================ FILE: projects/Amlogic-ce/packages/addons/service/hyperion.ng/source/default.py ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) import xbmc monitor = xbmc.Monitor() monitor.waitForAbort() ================================================ FILE: projects/Amlogic-ce/packages/addons/service/hyperion.ng/source/system.d/service.hyperion.ng.service ================================================ [Unit] Description=Hyperion.NG service After=graphical.target [Service] Type=forking ExecStartPre=/bin/sh -c "exec sh /storage/.kodi/addons/service.hyperion.ng/bin/platform.sh start" ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.hyperion.ng/bin/hyperiond.start" ExecReload=/bin/kill -HUP $MAINPID ExecStopPost=/bin/sh -c "exec sh /storage/.kodi/addons/service.hyperion.ng/bin/platform.sh stop" PIDFile=/run/hyperiond.pid TimeoutStopSec=2 Restart=always RestartSec=10 StartLimitInterval=0 [Install] WantedBy=default.target ================================================ FILE: projects/Amlogic-ce/packages/addons/service/openvfd/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Arthur Liberman (arthur_liberman@hotmail.com) PKG_NAME="openvfd" PKG_VERSION="1.0.6" PKG_SHA256="e531781921dbea3bed52304ccbf8722d85fc2141abeda11a0a2f405ecf7ff8b9" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/arthur-liberman/service.openvfd" PKG_URL="https://github.com/arthur-liberman/service.openvfd/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="service" PKG_SHORTDESC="OpenVFD: Service for controlling VFD displays" PKG_LONGDESC="OpenVFD: Service for controlling VFD displays, e.g. Display icons (Ethernet/WiFi connection status) Time, Date, Playback time" PKG_TOOLCHAIN="manual" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.service" addon() { mkdir -p $ADDON_BUILD/$PKG_ADDON_ID cp -PR $PKG_BUILD/* $ADDON_BUILD/$PKG_ADDON_ID } ================================================ FILE: projects/Amlogic-ce/packages/compress/cpio/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="cpio" PKG_VERSION="2.12" PKG_SHA256="08a35e92deb3c85d269a0059a27d4140a9667a6369459299d08c17f713a92e73" PKG_LICENSE="GPL" PKG_SITE="http://www.gnu.org/software/cpio/" PKG_URL="http://ftpmirror.gnu.org/cpio/$PKG_NAME-$PKG_VERSION.tar.gz" PKG_DEPENDS_HOST="toolchain" PKG_LONGDESC="A program to manage archives of files." ================================================ FILE: projects/Amlogic-ce/packages/devel/android-headers/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="android-headers" PKG_VERSION="25" PKG_SHA256="1e0ecdf56c33aaa523109254e2c475878d8cfc5795ebd4bb5ecbaf80926f4fe9" PKG_LICENSE="Apache" PKG_SITE="https://android.googlesource.com/" PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Android Platform Headers from AOSP releases." PKG_TOOLCHAIN="manual" ================================================ FILE: projects/Amlogic-ce/packages/devel/msgpack-c/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="msgpack-c" PKG_VERSION="c3df1bb26ebdd01d618ecca7ae2d6b4e37d5abd7" PKG_SHA256="581442dd9b94de53b75eb3de3cc0bb96c52e6690125223ecf4fff407772d3949" PKG_LICENSE="MIT" PKG_SITE="https://github.com/msgpack/msgpack-c" PKG_URL="https://github.com/msgpack/msgpack-c/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Its like JSON but fast and small." PKG_CMAKE_OPTS_TARGET="-DMSGPACK_ENABLE_SHARED=OFF \ -DMSGPACK_ENABLE_STATIC=ON" ================================================ FILE: projects/Amlogic-ce/packages/lang/gcc-linaro-aarch64-elf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="gcc-linaro-aarch64-elf" PKG_VERSION="4.9.4-2017.01" PKG_LICENSE="GPL" PKG_SITE="" PKG_DEPENDS_HOST="ccache:host" PKG_LONGDESC="Linaro Aarch64 GNU Linux Binary Toolchain" PKG_TOOLCHAIN="manual" if [ "${MACHINE_HARDWARE_NAME}" = "aarch64" ]; then PKG_SHA256="7b2082188cd94f35ae2185d0c37c22d0100982f5a8e1875b9b03c416ec653fd1" PKG_URL="https://sources.coreelec.org/gcc-linaro-${PKG_VERSION}-aarch64-elf.tar.xz" else PKG_SHA256="00c79aaf7ff9b1c22f7b0443a730056b3936561a4206af187ef61a4e3cab1716" PKG_URL="https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/aarch64-elf/gcc-linaro-${PKG_VERSION}-x86_64_aarch64-elf.tar.xz" fi makeinstall_host() { mkdir -p $TOOLCHAIN/lib/gcc-linaro-aarch64-elf/ cp -a * $TOOLCHAIN/lib/gcc-linaro-aarch64-elf } ================================================ FILE: projects/Amlogic-ce/packages/lang/gcc-linaro-arm-eabi/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="gcc-linaro-arm-eabi" PKG_VERSION="4.9.4-2017.01" PKG_LICENSE="GPL" PKG_SITE="" PKG_DEPENDS_HOST="ccache:host" PKG_LONGDESC="Linaro ARM GNU Linux Binary Toolchain" PKG_TOOLCHAIN="manual" if [ "${MACHINE_HARDWARE_NAME}" = "aarch64" ]; then PKG_SHA256="4b9a62d912de4c1fd2153e6652fbd296a62ac081515b6625edf3b8e0388ac6dd" PKG_URL="https://sources.coreelec.org/gcc-linaro-${PKG_VERSION}-arm-eabi.tar.xz" else PKG_SHA256="5fa170a74db172dca098c70ae58f4c08d2fca0232ce135530b2ef4996326b4bd" PKG_URL="https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-eabi/gcc-linaro-${PKG_VERSION}-x86_64_arm-eabi.tar.xz" fi makeinstall_host() { mkdir -p $TOOLCHAIN/lib/gcc-linaro-arm-eabi/ cp -a * $TOOLCHAIN/lib/gcc-linaro-arm-eabi } ================================================ FILE: projects/Amlogic-ce/packages/lang/gcc-riscv-none-embed/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="gcc-riscv-none-embed" PKG_VERSION="8.3.0-1.2" PKG_SHA256="079a88d7f7c18cfd735a9ed1f0eefa28ab28d3007b5f7591920ab25225c89248" PKG_LICENSE="MIT" PKG_SITE="https://github.com/xpack-dev-tools/riscv-none-embed-gcc-xpack" PKG_URL="https://github.com/xpack-dev-tools/riscv-none-embed-gcc-xpack/releases/download/v${PKG_VERSION}/xpack-riscv-none-embed-gcc-${PKG_VERSION}-linux-x64.tar.gz" PKG_DEPENDS_HOST="ccache:host" PKG_LONGDESC="RISC-V GCC" PKG_TOOLCHAIN="manual" unpack() { mkdir -p ${PKG_BUILD} mkdir -p ${TOOLCHAIN}/lib/${PKG_NAME} tar --strip-components=1 -xf ${SOURCES}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz -C ${TOOLCHAIN}/lib/${PKG_NAME} } makeinstall_host() { : # nothing, unpacked directly to toolchain } ================================================ FILE: projects/Amlogic-ce/packages/lang/gcc7-linaro-aarch64-elf/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="gcc7-linaro-aarch64-elf" PKG_VERSION="7.5.0-2019.12" PKG_SHA256="73689fb3e71beeecebd6434d60efad4cb926153d48399e4d16fb45395d9c81a0" PKG_LICENSE="GPL" PKG_SITE="https://www.linaro.org/" PKG_URL="https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-elf/gcc-linaro-${PKG_VERSION}-x86_64_aarch64-elf.tar.xz" PKG_DEPENDS_HOST="ccache:host" PKG_LONGDESC="Linaro Aarch64 GNU Linux Binary Toolchain" PKG_TOOLCHAIN="manual" unpack() { mkdir -p ${PKG_BUILD} mkdir -p ${TOOLCHAIN}/lib/${PKG_NAME} tar --strip-components=1 -xf ${SOURCES}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.xz -C ${TOOLCHAIN}/lib/${PKG_NAME} } makeinstall_host() { : # nothing, unpacked directly to toolchain } ================================================ FILE: projects/Amlogic-ce/packages/linux/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) PKG_NAME="linux" PKG_LICENSE="GPL" PKG_SITE="http://www.kernel.org" PKG_DEPENDS_HOST="ccache:host rsync:host openssl:host" PKG_DEPENDS_TARGET="toolchain linux:host kmod:host xz:host keyutils aml-dtbtools:host aml-dtbtools $KERNEL_EXTRA_DEPENDS_TARGET" PKG_NEED_UNPACK="$LINUX_DEPENDS $(get_pkg_directory initramfs) $(get_pkg_variable initramfs PKG_NEED_UNPACK)" 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_PATCH_DIRS="$LINUX" case "$LINUX" in amlogic-3.14) PKG_VERSION="07d26b4ce91cf934d65a64e2da7ab3bc75e59fcc" PKG_SHA256="682f93c0bb8ad888a681e93882bc169007bacb880714b980af00ca34fb5b8365" PKG_URL="https://github.com/CoreELEC/linux-amlogic/archive/$PKG_VERSION.tar.gz" PKG_SOURCE_NAME="linux-$LINUX-$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET aml-dtbtools:host" PKG_BUILD_PERF="no" ;; amlogic-4.9) PKG_VERSION="ab03043a776354e02be86d06007751f652680c00" PKG_SHA256="c75bbd36d0dc92b21d75ce82dd8e0a4fefac9cf4b62f5d21c33eb7d12ca5bc2a" PKG_URL="https://github.com/CoreELEC/linux-amlogic/archive/$PKG_VERSION.tar.gz" PKG_SOURCE_NAME="linux-$LINUX-$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET aml-dtbtools:host" PKG_BUILD_PERF="no" PKG_GIT_BRANCH="amlogic-4.9-20" ;; esac PKG_KERNEL_CFG_FILE=$(kernel_config_path) || die if [ -n "$KERNEL_TOOLCHAIN" ]; then PKG_DEPENDS_HOST="$PKG_DEPENDS_HOST gcc-$KERNEL_TOOLCHAIN:host" PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET gcc-$KERNEL_TOOLCHAIN:host" HEADERS_ARCH=$TARGET_ARCH fi if [ "$PKG_BUILD_PERF" != "no" ] && grep -q ^CONFIG_PERF_EVENTS= $PKG_KERNEL_CFG_FILE ; then PKG_BUILD_PERF="yes" PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET binutils elfutils libunwind zlib openssl" fi if [ "$TARGET_ARCH" = "x86_64" ]; then PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET elfutils:host" PKG_DEPENDS_UNPACK+=" intel-ucode kernel-firmware" fi if [[ "$KERNEL_TARGET" = uImage* ]]; then PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET u-boot-tools:host" fi if [ "$BUILD_ANDROID_BOOTIMG" = "yes" ]; then PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET mkbootimg:host" fi # Ensure that the dependencies of initramfs:target are built correctly, but # we don't want to add initramfs:target as a direct dependency as we install # this "manually" from within linux:target for pkg in $(get_pkg_variable initramfs PKG_DEPENDS_TARGET); do ! listcontains "${PKG_DEPENDS_TARGET}" "${pkg}" && PKG_DEPENDS_TARGET+=" ${pkg}" || true done post_patch() { # linux was already built and its build dir autoremoved - prepare it again for kernel packages if [ -d $PKG_INSTALL/.image ]; then cp -p $PKG_INSTALL/.image/.config $PKG_BUILD kernel_make -C $PKG_BUILD prepare # restore the required Module.symvers from an earlier build cp -p $PKG_INSTALL/.image/Module.symvers $PKG_BUILD else cp $PKG_KERNEL_CFG_FILE $PKG_BUILD/.config sed -i -e "s|@INITRAMFS_SOURCE@|$(kernel_initramfs_confs) $BUILD/initramfs|" $PKG_BUILD/.config # set default hostname based on $DISTRONAME sed -i -e "s|@DISTRONAME@|$DISTRONAME|g" $PKG_BUILD/.config # disable swap support if not enabled if [ ! "$SWAP_SUPPORT" = yes ]; then sed -i -e "s|^CONFIG_SWAP=.*$|# CONFIG_SWAP is not set|" $PKG_BUILD/.config fi # disable nfs support if not enabled if [ ! "$NFS_SUPPORT" = yes ]; then sed -i -e "s|^CONFIG_NFS_FS=.*$|# CONFIG_NFS_FS is not set|" $PKG_BUILD/.config fi # disable cifs support if not enabled if [ ! "$SAMBA_SUPPORT" = yes ]; then sed -i -e "s|^CONFIG_CIFS=.*$|# CONFIG_CIFS is not set|" $PKG_BUILD/.config fi # disable iscsi support if not enabled if [ ! "$ISCSI_SUPPORT" = yes ]; then sed -i -e "s|^CONFIG_SCSI_ISCSI_ATTRS=.*$|# CONFIG_SCSI_ISCSI_ATTRS is not set|" $PKG_BUILD/.config sed -i -e "s|^CONFIG_ISCSI_TCP=.*$|# CONFIG_ISCSI_TCP is not set|" $PKG_BUILD/.config sed -i -e "s|^CONFIG_ISCSI_BOOT_SYSFS=.*$|# CONFIG_ISCSI_BOOT_SYSFS is not set|" $PKG_BUILD/.config sed -i -e "s|^CONFIG_ISCSI_IBFT_FIND=.*$|# CONFIG_ISCSI_IBFT_FIND is not set|" $PKG_BUILD/.config sed -i -e "s|^CONFIG_ISCSI_IBFT=.*$|# CONFIG_ISCSI_IBFT is not set|" $PKG_BUILD/.config fi # disable lima/panfrost if libmali is configured if [ "$OPENGLES" = "libmali" ]; then sed -e "s|^CONFIG_DRM_LIMA=.*$|# CONFIG_DRM_LIMA is not set|" -i $PKG_BUILD/.config sed -e "s|^CONFIG_DRM_PANFROST=.*$|# CONFIG_DRM_PANFROST is not set|" -i $PKG_BUILD/.config fi # disable wireguard support if not enabled if [ ! "$WIREGUARD_SUPPORT" = yes ]; then sed -e "s|^CONFIG_WIREGUARD=.*$|# CONFIG_WIREGUARD is not set|" -i $PKG_BUILD/.config fi fi } post_unpack() { # Add exFAT ${SCRIPTS}/get exfat-linux local PKG_BUILD_EXFAT="${PKG_BUILD}/fs/exfat" [ -e "$PKG_BUILD_EXFAT" ] && rm -rf "$PKG_BUILD_EXFAT" mkdir -p "$PKG_BUILD_EXFAT" tar --strip-components=1 -xf "${SOURCES}/exfat-linux/exfat-linux-$(get_pkg_version exfat-linux).tar.gz" -C "$PKG_BUILD_EXFAT" } make_host() { make \ ARCH=${HEADERS_ARCH:-$TARGET_KERNEL_ARCH} \ HOSTCC="$TOOLCHAIN/bin/host-gcc" \ HOSTCXX="$TOOLCHAIN/bin/host-g++" \ HOSTCFLAGS="$HOST_CFLAGS" \ HOSTCXXFLAGS="$HOST_CXXFLAGS" \ HOSTLDFLAGS="$HOST_LDFLAGS" \ headers_check } makeinstall_host() { make \ ARCH=${HEADERS_ARCH:-$TARGET_KERNEL_ARCH} \ HOSTCC="$TOOLCHAIN/bin/host-gcc" \ HOSTCXX="$TOOLCHAIN/bin/host-g++" \ HOSTCFLAGS="$HOST_CFLAGS" \ HOSTCXXFLAGS="$HOST_CXXFLAGS" \ HOSTLDFLAGS="$HOST_LDFLAGS" \ INSTALL_HDR_PATH=dest \ headers_install mkdir -p $SYSROOT_PREFIX/usr/include cp -R dest/include/* $SYSROOT_PREFIX/usr/include } pre_make_target() { pkg_lock_status "ACTIVE" "linux:target" "build" if [ "$TARGET_ARCH" = "x86_64" ]; then # copy some extra firmware to linux tree mkdir -p $PKG_BUILD/external-firmware cp -a $(get_build_dir kernel-firmware)/.copied-firmware/{amdgpu,amd-ucode,i915,radeon,e100,rtl_nic} $PKG_BUILD/external-firmware cp -a $(get_build_dir intel-ucode)/intel-ucode $PKG_BUILD/external-firmware FW_LIST="$(find $PKG_BUILD/external-firmware \( -type f -o -type l \) \( -iname '*.bin' -o -iname '*.fw' -o -path '*/intel-ucode/*' \) | sed 's|.*external-firmware/||' | sort | xargs)" sed -i "s|CONFIG_EXTRA_FIRMWARE=.*|CONFIG_EXTRA_FIRMWARE=\"${FW_LIST}\"|" $PKG_BUILD/.config fi kernel_make oldconfig } make_target() { # 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 if [ -z "$KERNEL_UIMAGE_LOADADDR" -o -z "$KERNEL_UIMAGE_ENTRYADDR" ]; then die "ERROR: KERNEL_UIMAGE_LOADADDR and KERNEL_UIMAGE_ENTRYADDR have to be set to build uImage - aborting" fi KERNEL_UIMAGE_TARGET="$KERNEL_TARGET" KERNEL_TARGET="${KERNEL_TARGET/uImage/Image}" fi kernel_make modules kernel_make INSTALL_MOD_PATH=$INSTALL/$(get_kernel_overlay_dir) modules_install rm -f $INSTALL/$(get_kernel_overlay_dir)/lib/modules/*/build rm -f $INSTALL/$(get_kernel_overlay_dir)/lib/modules/*/source rm -rf $BUILD/initramfs rm -f ${STAMPS_INSTALL}/initramfs/install_target ${STAMPS_INSTALL}/*/install_init if [ -n "$INITRAMFS_MODULES" ]; then mkdir -p $BUILD/initramfs/etc mkdir -p $BUILD/initramfs/usr/lib/modules for i in $INITRAMFS_MODULES; do module=$(find $INSTALL/$(get_full_module_dir)/kernel -name $i.ko) if [ -n "$module" ]; then echo $i >> $BUILD/initramfs/etc/modules cp $module $BUILD/initramfs/usr/lib/modules fi done fi # create initramfs.cpio needed by Android boot image ( cd $ROOT $SCRIPTS/install initramfs ) # the modules target is required to get a proper Module.symvers # file with symbols from built-in and external modules. # Without that it'll contain only the symbols from the kernel kernel_make $KERNEL_TARGET $KERNEL_MAKE_EXTRACMD modules # collect all device tree in 'coreelec' subfolders DTB_PATH="arch/$TARGET_KERNEL_ARCH/boot/dts/amlogic" cp ${DTB_PATH}/coreelec-*/*.dtb $DTB_PATH 2>/dev/null || : # combine Amlogic multidtb by dtb.conf find_file_path bootloader/dtb.conf MULTIDTB_CONF="${FOUND_PATH}" if [ -f $MULTIDTB_CONF ]; then multidtb_cnt=$(xmlstarlet sel -t -c "count(//dtb/multidtb)" $MULTIDTB_CONF) cnt_m=1 while [ $cnt_m -le $multidtb_cnt ]; do multidtb=$(xmlstarlet sel -t -v "//dtb/multidtb[$cnt_m]/@name" $MULTIDTB_CONF) echo echo "Making multidtb $multidtb" rm -fr "$DTB_PATH/dtbtool_input" mkdir $DTB_PATH/dtbtool_input files_cnt=$(xmlstarlet sel -t -c "count(//dtb/multidtb[$cnt_m]/file)" $MULTIDTB_CONF) cnt_f=1 while [ $cnt_f -le $files_cnt ]; do file=$(xmlstarlet sel -t -v "//dtb/multidtb[$cnt_m]/file[$cnt_f]" $MULTIDTB_CONF) cnt_f=$((cnt_f+1)) mv $DTB_PATH/$file $DTB_PATH/dtbtool_input done dtbTool -c -o $DTB_PATH/$multidtb $DTB_PATH/dtbtool_input rm -fr "$DTB_PATH/dtbtool_input" cnt_m=$((cnt_m+1)) done mkdir -p $INSTALL/usr/share/bootloader install -m 0644 $MULTIDTB_CONF $INSTALL/usr/share/bootloader fi if [ "$BUILD_ANDROID_BOOTIMG" = "yes" ]; then find_file_path bootloader/mkbootimg && source ${FOUND_PATH} mv -f arch/$TARGET_KERNEL_ARCH/boot/boot.img arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET fi if [ "$PKG_BUILD_PERF" = "yes" ] ; then ( cd tools/perf # arch specific perf build args case "$TARGET_ARCH" in x86_64) PERF_BUILD_ARGS="ARCH=x86" ;; aarch64) PERF_BUILD_ARGS="ARCH=arm64" ;; *) PERF_BUILD_ARGS="ARCH=$TARGET_ARCH" ;; esac WERROR=0 \ NO_LIBPERL=1 \ NO_LIBPYTHON=1 \ NO_SLANG=1 \ NO_GTK2=1 \ NO_LIBNUMA=1 \ NO_LIBAUDIT=1 \ NO_LZMA=1 \ NO_SDT=1 \ CROSS_COMPILE="$TARGET_PREFIX" \ JOBS="$CONCURRENCY_MAKE_LEVEL" \ make $PERF_BUILD_ARGS mkdir -p $INSTALL/usr/bin cp perf $INSTALL/usr/bin ) fi if [ -n "$KERNEL_UIMAGE_TARGET" ] ; then # determine compression used for kernel image KERNEL_UIMAGE_COMP=${KERNEL_UIMAGE_TARGET:7} KERNEL_UIMAGE_COMP=$(echo ${KERNEL_UIMAGE_COMP:-none} | sed 's/gz/gzip/; s/bz2/bzip2/') # calculate new load address to make kernel Image unpack to memory area after compressed image if [ "$KERNEL_UIMAGE_COMP" != "none" ] ; then COMPRESSED_SIZE=$(stat -t "arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET" | awk '{print $2}') # align to 1 MiB COMPRESSED_SIZE=$(( (($COMPRESSED_SIZE - 1 >> 20) + 1) << 20 )) PKG_KERNEL_UIMAGE_LOADADDR=$(printf '%X' "$(( $KERNEL_UIMAGE_LOADADDR + $COMPRESSED_SIZE ))") PKG_KERNEL_UIMAGE_ENTRYADDR=$(printf '%X' "$(( $KERNEL_UIMAGE_ENTRYADDR + $COMPRESSED_SIZE ))") else PKG_KERNEL_UIMAGE_LOADADDR=${KERNEL_UIMAGE_LOADADDR} PKG_KERNEL_UIMAGE_ENTRYADDR=${KERNEL_UIMAGE_ENTRYADDR} fi mkimage -A $TARGET_KERNEL_ARCH \ -O linux \ -T kernel \ -C $KERNEL_UIMAGE_COMP \ -a $PKG_KERNEL_UIMAGE_LOADADDR \ -e $PKG_KERNEL_UIMAGE_ENTRYADDR \ -d arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET \ arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_UIMAGE_TARGET KERNEL_TARGET="${KERNEL_UIMAGE_TARGET}" fi } makeinstall_target() { mkdir -p $INSTALL/.image cp -p arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET} System.map .config Module.symvers $INSTALL/.image/ if [ "$BOOTLOADER" = "u-boot" ]; then mkdir -p $INSTALL/usr/share/bootloader/device_trees if [ -d arch/$TARGET_KERNEL_ARCH/boot/dts/amlogic ]; then cp arch/$TARGET_KERNEL_ARCH/boot/*dtb.img $INSTALL/usr/share/bootloader/ 2>/dev/null || : cp arch/$TARGET_KERNEL_ARCH/boot/dts/amlogic/*.dtb $INSTALL/usr/share/bootloader/device_trees 2>/dev/null || : fi elif [ "$BOOTLOADER" = "bcm2835-bootloader" ]; then mkdir -p $INSTALL/usr/share/bootloader/overlays # install platform dtbs, but remove upstream kernel dtbs (i.e. without downstream # drivers and decent USB support) as these are not required by LibreELEC cp -p arch/$TARGET_KERNEL_ARCH/boot/dts/*.dtb $INSTALL/usr/share/bootloader rm -f $INSTALL/usr/share/bootloader/bcm283*.dtb # install overlay dtbs for dtb in arch/$TARGET_KERNEL_ARCH/boot/dts/overlays/*.dtb \ arch/$TARGET_KERNEL_ARCH/boot/dts/overlays/*.dtbo; do cp $dtb $INSTALL/usr/share/bootloader/overlays 2>/dev/null || : done cp -p arch/$TARGET_KERNEL_ARCH/boot/dts/overlays/README $INSTALL/usr/share/bootloader/overlays fi } ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/amlogic-3.14/linux-010_sx05re_set_colordepth.patch ================================================ --- a/drivers/amlogic/display/osd/osd_fb.c +++ b/drivers/amlogic/display/osd/osd_fb.c @@ -215,11 +215,11 @@ .yoffset = 0, .bits_per_pixel = 32, .grayscale = 0, - .red = {0, 0, 0}, - .green = {0, 0, 0}, - .blue = {0, 0, 0}, - .transp = {0, 0, 0}, - .nonstd = 0, + .red = {16, 8, 0}, + .green = {8, 8, 0}, + .blue = {0, 8, 0}, + .transp = {24, 0, 0}, + .nonstd = 1, .activate = FB_ACTIVATE_NOW, .height = -1, .width = -1, ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/amlogic-3.14/linux-011-HID-input-fix-confusion-on-conflicting-mappings.patch ================================================ From 6ce901eb61aa30ba8565c62049ee80c90728ef14 Mon Sep 17 00:00:00 2001 From: David Herrmann <dh.herrmann@gmail.com> Date: Mon, 29 Dec 2014 15:21:26 +0100 Subject: [PATCH] HID: input: fix confusion on conflicting mappings On an PC-101/103/104 keyboard (American layout) the 'Enter' key and its neighbours look like this: +---+ +---+ +-------+ | 1 | | 2 | | 5 | +---+ +---+ +-------+ +---+ +-----------+ | 3 | | 4 | +---+ +-----------+ On a PC-102/105 keyboard (European layout) it looks like this: +---+ +---+ +-------+ | 1 | | 2 | | | +---+ +---+ +-+ 4 | +---+ +---+ | | | 3 | | 5 | | | +---+ +---+ +-----+ (Note that the number of keys is the same, but key '5' is moved down and the shape of key '4' is changed. Keys '1' to '3' are exactly the same.) The keys 1-4 report the same scan-code in HID in both layouts, even though the keysym they produce is usually different depending on the XKB-keymap used by user-space. However, key '5' (US 'backslash'/'pipe') reports 0x31 for the upper layout and 0x32 for the lower layout, as defined by the HID spec. This is highly confusing as the linux-input API uses a single keycode for both. So far, this was never a problem as there never has been a keyboard with both of those keys present at the same time. It would have to look something like this: +---+ +---+ +-------+ | 1 | | 2 | | x31 | +---+ +---+ +-------+ +---+ +---+ +-----+ | 3 | |x32| | 4 | +---+ +---+ +-----+ HID can represent such a keyboard, but the linux-input API cannot. Furthermore, any user-space mapping would be confused by this and, luckily, no-one ever produced such hardware. Now, the HID input layer fixed this mess by mapping both 0x31 and 0x32 to the same keycode (KEY_BACKSLASH==0x2b). As only one of both physical keys is present on a hardware, this works just fine. Lets introduce hardware-vendors into this: ------------------------------------------ Unfortunately, it seems way to expensive to produce a different device for American and European layouts. Therefore, hardware-vendors put both keys, (0x31 and 0x32) on the same keyboard, but only one of them is hooked up to the physical button, the other one is 'dead'. This means, they can use the same hardware, with a different button-layout and automatically produce the correct HID events for American *and* European layouts. This is unproblematic for normal keyboards, as the 'dead' key will never report any KEY-DOWN events. But RollOver keyboards send the whole matrix on each key-event, allowing n-key roll-over mode. This means, we get a 0x31 and 0x32 event on each key-press. One of them will always be 0, the other reports the real state. As we map both to the same keycode, we will get spurious key-events, even though the real key-state never changed. The easiest way would be to blacklist 'dead' keys and never handle those. We could simply read the 'country' tag of USB devices and blacklist either key according to the layout. But... hardware vendors... want the same device for all countries and thus many of them set 'country' to 0 for all devices. Meh.. So we have to deal with this properly. As we cannot know which of the keys is 'dead', we either need a heuristic and track those keys, or we simply make use of our value-tracking for HID fields. We simply ignore HID events for absolute data if the data didn't change. As HID tracks events on the HID level, we haven't done the keycode translation, yet. Therefore, the 'dead' key is tracked independently of the real key, therefore, any events on it will be ignored. This patch simply discards any HID events for absolute data if it didn't change compared to the last report. We need to ignore relative and buffered-byte reports for obvious reasons. But those cannot be affected by this bug, so we're fine. Preferably, we'd do this filtering on the HID-core level. But this might break a lot of custom drivers, if they do not follow the HID specs. Therefore, we do this late in hid-input just before we inject it into the input layer (which does the exact same filtering, but on the keycode level). If this turns out to break some devices, we might have to limit filtering to EV_KEY events. But lets try to do the Right Thing first, and properly filter any absolute data that didn't change. This patch is tagged for 'stable' as it fixes a lot of n-key RollOver hardware. We might wanna wait with backporting for a while, before we know it doesn't break anything else, though. Cc: <stable@vger.kernel.org> Reported-by: Adam Goode <adam@spicenitz.org> Reported-by: Fredrik Hallenberg <megahallon@gmail.com> Tested-by: Fredrik Hallenberg <megahallon@gmail.com> Signed-off-by: David Herrmann <dh.herrmann@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz> --- drivers/hid/hid-input.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index e0a0f06..84b6899 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c @@ -1101,6 +1101,22 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct return; } + /* + * Ignore reports for absolute data if the data didn't change. This is + * not only an optimization but also fixes 'dead' key reports. Some + * RollOver implementations for localized keys (like BACKSLASH/PIPE; HID + * 0x31 and 0x32) report multiple keys, even though a localized keyboard + * can only have one of them physically available. The 'dead' keys + * report constant 0. As all map to the same keycode, they'd confuse + * the input layer. If we filter the 'dead' keys on the HID level, we + * skip the keycode translation and only forward real events. + */ + if (!(field->flags & (HID_MAIN_ITEM_RELATIVE | + HID_MAIN_ITEM_BUFFERED_BYTE)) && + usage->usage_index < field->maxusage && + value == field->value[usage->usage_index]) + return; + /* report the usage code as scancode if the key status has changed */ if (usage->type == EV_KEY && !!test_bit(usage->code, input->key) != value) input_event(input, EV_MSC, MSC_SCAN, usage->hid); -- 2.9.5 ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/amlogic-3.14/linux-012-HID-fixup-the-conflicting-keyboard-mappings-quirk.patch ================================================ From 8e7b341037db1835ee6eea64663013cbfcf33575 Mon Sep 17 00:00:00 2001 From: Jiri Kosina <jkosina@suse.cz> Date: Tue, 6 Jan 2015 22:34:19 +0100 Subject: [PATCH] HID: fixup the conflicting keyboard mappings quirk The ignore check that got added in 6ce901eb61 ("HID: input: fix confusion on conflicting mappings") needs to properly check for VARIABLE reports as well (ARRAY reports should be ignored), otherwise legitimate keyboards might break. Cc: <stable@vger.kernel.org> Fixes: 6ce901eb61 ("HID: input: fix confusion on conflicting mappings") Reported-by: Fredrik Hallenberg <megahallon@gmail.com> Reported-by: David Herrmann <dh.herrmann@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz> --- drivers/hid/hid-input.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index 84b6899..a758900 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c @@ -1113,6 +1113,7 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct */ if (!(field->flags & (HID_MAIN_ITEM_RELATIVE | HID_MAIN_ITEM_BUFFERED_BYTE)) && + (field->flags & HID_MAIN_ITEM_VARIABLE) && usage->usage_index < field->maxusage && value == field->value[usage->usage_index]) return; -- 2.9.5 ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/default/linux-051-ouya_controller_support.patch ================================================ commit 5a596921a4636e62843a59b7eab7b87b70a6d296 Author: Lukas Rusak <lorusak@gmail.com> Date: Sun May 6 22:03:11 2018 -0700 HID: add ouya HID driver This driver is a simple implementation to get the controller working and mapped properly. This driver does not include functionality for the touchpad (yet). The original driver was taken from from the ouya linux tree and has been simplified. It seems there may have been other versions of the controller present that had a broken report descriptor. I have removed that for now. diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 60252fd796f6..6be2c454e72e 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig @@ -659,6 +659,12 @@ config HID_ORTEK - Ortek WKB-2000 - Skycable wireless presenter +config HID_OUYA + tristate "OUYA Game Controller" + depends on USB_HID + ---help--- + Support for OUYA Game Controller. + config HID_PANTHERLORD tristate "Pantherlord/GreenAsia game controller" depends on HID diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile index 17a8bd97da9d..4425890934e4 100644 --- a/drivers/hid/Makefile +++ b/drivers/hid/Makefile @@ -71,6 +71,7 @@ obj-$(CONFIG_HID_MULTITOUCH) += hid-multitouch.o obj-$(CONFIG_HID_NTI) += hid-nti.o obj-$(CONFIG_HID_NTRIG) += hid-ntrig.o obj-$(CONFIG_HID_ORTEK) += hid-ortek.o +obj-$(CONFIG_HID_OUYA) += hid-ouya.o obj-$(CONFIG_HID_PRODIKEYS) += hid-prodikeys.o obj-$(CONFIG_HID_PANTHERLORD) += hid-pl.o obj-$(CONFIG_HID_PENMOUNT) += hid-penmount.o diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 0b5cc910f62e..0528efb825fa 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -859,6 +859,9 @@ #define USB_DEVICE_ID_ORTEK_WKB2000 0x2000 #define USB_DEVICE_ID_ORTEK_IHOME_IMAC_A210S 0x8003 +#define USB_VENDOR_ID_OUYA 0x2836 +#define USB_DEVICE_ID_OUYA_CONTROLLER 0x0001 + #define USB_VENDOR_ID_PLANTRONICS 0x047f #define USB_VENDOR_ID_PANASONIC 0x04da diff --git a/drivers/hid/hid-ouya.c b/drivers/hid/hid-ouya.c new file mode 100644 index 000000000000..4344a47b40af --- /dev/null +++ b/drivers/hid/hid-ouya.c @@ -0,0 +1,131 @@ +/* + * HID driver for OUYA Game Controller(s) + * + * Copyright (c) 2013 OUYA + * Copyright (c) 2013 Gregorios Leach <optikflux@gmail.com> + * Copyright (c) 2018 Lukas Rusak <lorusak@gmail.com> + */ + +#include <linux/device.h> +#include <linux/hid.h> +#include <linux/input.h> +#include <linux/module.h> + +#include "hid-ids.h" + +static const unsigned int ouya_absmap[] = { + [0x30] = ABS_X, /* left stick X */ + [0x31] = ABS_Y, /* left stick Y */ + [0x32] = ABS_Z, /* L2 */ + [0x33] = ABS_RX, /* right stick X */ + [0x34] = ABS_RY, /* right stick Y */ + [0x35] = ABS_RZ, /* R2 */ +}; + +static const unsigned int ouya_keymap[] = { + [0x1] = BTN_SOUTH, /* O */ + [0x2] = BTN_WEST, /* U */ + [0x3] = BTN_NORTH, /* Y */ + [0x4] = BTN_EAST, /* A */ + [0x5] = BTN_TL, /* L1 */ + [0x6] = BTN_TR, /* R1 */ + [0x7] = BTN_THUMBL, /* L3 */ + [0x8] = BTN_THUMBR, /* R3 */ + [0x9] = BTN_DPAD_UP, /* Up */ + [0xa] = BTN_DPAD_DOWN, /* Down */ + [0xb] = BTN_DPAD_LEFT, /* Left */ + [0xc] = BTN_DPAD_RIGHT, /* Right */ + [0xd] = BTN_TL2, /* L2 */ + [0xe] = BTN_TR2, /* R2 */ + [0xf] = BTN_MODE, /* Power */ +}; + +static int ouya_input_mapping(struct hid_device *hdev, struct hid_input *hi, + struct hid_field *field, struct hid_usage *usage, + unsigned long **bit, int *max) +{ + if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) { + unsigned int key = usage->hid & HID_USAGE; + + if (key >= ARRAY_SIZE(ouya_keymap)) + return -1; + + key = ouya_keymap[key]; + hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key); + + return 1; + + } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) { + unsigned int abs = usage->hid & HID_USAGE; + + if (abs >= ARRAY_SIZE(ouya_absmap)) + return -1; + + abs = ouya_absmap[abs]; + hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs); + + return 1; + } + + return 0; +} + +static int ouya_probe(struct hid_device *hdev, const struct hid_device_id *id) +{ + int ret; + + ret = hid_parse(hdev); + if (ret) { + hid_err(hdev, "parse failed\n"); + goto err_free; + } + + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT | HID_CONNECT_HIDDEV_FORCE); + if (ret) { + hid_err(hdev, "hw start failed\n"); + goto err_free; + } + + return 0; + +err_free: + return ret; +} + +static void ouya_remove(struct hid_device *hdev) +{ + hid_hw_stop(hdev); + kfree(hid_get_drvdata(hdev)); +} + +static const struct hid_device_id ouya_devices[] = { + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_OUYA, USB_DEVICE_ID_OUYA_CONTROLLER) }, + { } +}; +MODULE_DEVICE_TABLE(hid, ouya_devices); + +static struct hid_driver ouya_driver = { + .name = "ouya", + .id_table = ouya_devices, + .input_mapping = ouya_input_mapping, + .probe = ouya_probe, + .remove = ouya_remove, +}; + +static int __init ouya_init(void) +{ + return hid_register_driver(&ouya_driver); +} + +static void __exit ouya_exit(void) +{ + hid_unregister_driver(&ouya_driver); +} + +module_init(ouya_init); +module_exit(ouya_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Lukas Rusak <lorusak@gmail.com>"); +MODULE_AUTHOR("Gregorios Leach <optikflux@gmail.com>"); +MODULE_DESCRIPTION("Ouya Controller Driver"); diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c index 587e2681a53f..b5adc13e0df1 100644 --- a/drivers/hid/hid-quirks.c +++ b/drivers/hid/hid-quirks.c @@ -538,6 +538,9 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_IHOME_IMAC_A210S) }, { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, #endif +#if IS_ENABLED(CONFIG_HID_OUYA) + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_OUYA, USB_DEVICE_ID_OUYA_CONTROLLER) }, +#endif #if IS_ENABLED(CONFIG_HID_PANTHERLORD) { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) }, { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) }, ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/default/linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch ================================================ From 7051422474e4c4e302ede3d07ffd8ef2682e07a2 Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Tue, 22 Apr 2014 16:05:14 +0300 Subject: [PATCH] [RFC] hid/sony: add autorepeat for PS3 remotes adapted to 4.6 Betreff: [RFC] hid/sony: add autorepeat for PS3 remotes Von: David Dillow <dave@thedillows.org> Datum: 28.06.2013 04:28 An: linux-input@vger.kernel.org Kopie (CC): Stephan Raue <stephan@openelec.tv> Some applications using the PS3 remote would like to have autorepeat from the device. Use the input subsystem's software emulation to provide this capability, and enable those that don't need it to turn it off. --- I'm not sure this is the correct approach, or if it is even appropriate for a remote to do autorepeat. However, the media/rc subsystem does do it by default, and it's been requested by users, so there is at least some demand. This compiled against the hid-sony driver with the PS3 remote changes merged, but I have done no testing of it. If the approach seems reasonable, I'll try to test it when the MythTV is idle. Signed-off-by: Matt DeVillier <matt.devillier@gmail.com> --- drivers/hid/hid-sony.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index 310436a..84f7f41 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c @@ -1120,6 +1120,25 @@ static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi, return 1; } +static int ps3remote_setup_repeat(struct hid_device *hdev) +{ + struct hid_input *hidinput = list_first_entry(&hdev->inputs, + struct hid_input, list); + struct input_dev *input = hidinput->input; + + /* + * Set up autorepeat defaults per the remote control subsystem; + * this must be done after hid_hw_start(), as having these non-zero + * at the time of input_register_device() tells the input system that + * the hardware does the autorepeat, and the PS3 remote does not. + */ + set_bit(EV_REP, input->evbit); + input->rep[REP_DELAY] = 500; + input->rep[REP_PERIOD] = 125; + + return 0; +} + static u8 *sony_report_fixup(struct hid_device *hdev, u8 *rdesc, unsigned int *rsize) { @@ -2372,6 +2391,8 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) sony_init_output_report(sc, dualshock4_send_output_report); } else if (sc->quirks & MOTION_CONTROLLER) { sony_init_output_report(sc, motion_send_output_report); + } else if (sc->quirks & PS3REMOTE) { + ret = ps3remote_setup_repeat(hdev); } else { ret = 0; } -- 2.5.0 ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/default/linux-062-imon_pad_ignore_diagonal.patch ================================================ diff -Naur linux-3.16.1/drivers/media/rc/imon.c linux-3.16.1.patch/drivers/media/rc/imon.c --- linux-3.16.1/drivers/media/rc/imon.c 2014-08-14 04:36:35.000000000 +0200 +++ linux-3.16.1.patch/drivers/media/rc/imon.c 2014-08-15 13:57:16.587620642 +0200 @@ -1344,6 +1344,17 @@ } } else { /* + * For users without stabilized, just ignore any value getting + * to close to the diagonal. + */ + if ((abs(rel_y) < 2 && abs(rel_x) < 2) || + abs(abs(rel_y) - abs(rel_x)) < 2 ) { + spin_lock_irqsave(&ictx->kc_lock, flags); + ictx->kc = KEY_UNKNOWN; + spin_unlock_irqrestore(&ictx->kc_lock, flags); + return; + } + /* * Hack alert: instead of using keycodes, we have * to use hard-coded scancodes here... */ ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/default/linux-904-improve-xbox-dvd-remote-performance.patch ================================================ From 55096db50d8cdbf777c67f672b493ef565a12c38 Mon Sep 17 00:00:00 2001 From: Matthias Reichl <hias@horus.com> Date: Fri, 22 Mar 2019 12:26:17 +0100 Subject: [PATCH] media: rc: xbox_remote: add protocol and set timeout The timestamps in ir-keytable -t output showed that the Xbox DVD IR dongle decodes scancodes every 64ms. The last scancode of a longer button press is decodes 64ms after the last-but-one which indicates the decoder doesn't use a timeout but decodes on the last edge of the signal. 267.042629: lirc protocol(unknown): scancode = 0xace 267.042665: event type EV_MSC(0x04): scancode = 0xace 267.042665: event type EV_KEY(0x01) key_down: KEY_1(0x0002) 267.042665: event type EV_SYN(0x00). 267.106625: lirc protocol(unknown): scancode = 0xace 267.106643: event type EV_MSC(0x04): scancode = 0xace 267.106643: event type EV_SYN(0x00). 267.170623: lirc protocol(unknown): scancode = 0xace 267.170638: event type EV_MSC(0x04): scancode = 0xace 267.170638: event type EV_SYN(0x00). 267.234621: lirc protocol(unknown): scancode = 0xace 267.234636: event type EV_MSC(0x04): scancode = 0xace 267.234636: event type EV_SYN(0x00). 267.298623: lirc protocol(unknown): scancode = 0xace 267.298638: event type EV_MSC(0x04): scancode = 0xace 267.298638: event type EV_SYN(0x00). 267.543345: event type EV_KEY(0x01) key_down: KEY_1(0x0002) 267.543345: event type EV_SYN(0x00). 267.570015: event type EV_KEY(0x01) key_up: KEY_1(0x0002) 267.570015: event type EV_SYN(0x00). Add a protocol with the repeat value and set the timeout in the driver to 10ms (to have a bit of headroom for delays) so the Xbox DVD remote performs more responsive. Signed-off-by: Matthias Reichl <hias@horus.com> --- Documentation/media/lirc.h.rst.exceptions | 1 + drivers/media/rc/keymaps/rc-xbox-dvd.c | 2 +- drivers/media/rc/rc-main.c | 2 ++ drivers/media/rc/xbox_remote.c | 4 +++- include/media/rc-map.h | 4 +++- include/uapi/linux/lirc.h | 2 ++ 6 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Documentation/media/lirc.h.rst.exceptions b/Documentation/media/lirc.h.rst.exceptions index e7a41d4b3d46..f8b5f1a32b7d 100644 --- a/Documentation/media/lirc.h.rst.exceptions +++ b/Documentation/media/lirc.h.rst.exceptions @@ -61,6 +61,7 @@ ignore symbol RC_PROTO_IMON ignore symbol RC_PROTO_RCMM12 ignore symbol RC_PROTO_RCMM24 ignore symbol RC_PROTO_RCMM32 +ignore symbol RC_PROTO_XBOX_DVD # Undocumented macros diff --git a/drivers/media/rc/keymaps/rc-xbox-dvd.c b/drivers/media/rc/keymaps/rc-xbox-dvd.c index af387244636b..42815ab57bff 100644 --- a/drivers/media/rc/keymaps/rc-xbox-dvd.c +++ b/drivers/media/rc/keymaps/rc-xbox-dvd.c @@ -42,7 +42,7 @@ static struct rc_map_list xbox_dvd_map = { .map = { .scan = xbox_dvd, .size = ARRAY_SIZE(xbox_dvd), - .rc_proto = RC_PROTO_UNKNOWN, + .rc_proto = RC_PROTO_XBOX_DVD, .name = RC_MAP_XBOX_DVD, } }; diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c index 78e79c37f208..7f1d5b226f68 100644 --- a/drivers/media/rc/rc-main.c +++ b/drivers/media/rc/rc-main.c @@ -76,6 +76,7 @@ static const struct { .scancode_bits = 0x00ffffff, .repeat_period = 114 }, [RC_PROTO_RCMM32] = { .name = "rc-mm-32", .scancode_bits = 0xffffffff, .repeat_period = 114 }, + [RC_PROTO_XBOX_DVD] = { .name = "xbox-dvd", .repeat_period = 64 }, }; /* Used to keep track of known keymaps */ @@ -1027,6 +1028,7 @@ static const struct { { RC_PROTO_BIT_RCMM12 | RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32, "rc-mm", "ir-rcmm-decoder" }, + { RC_PROTO_BIT_XBOX_DVD, "xbox-dvd", NULL }, }; /** diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c index f959cbb94744..79470c09989e 100644 --- a/drivers/media/rc/xbox_remote.c +++ b/drivers/media/rc/xbox_remote.c @@ -148,7 +148,7 @@ static void xbox_remote_rc_init(struct xbox_remote *xbox_remote) struct rc_dev *rdev = xbox_remote->rdev; rdev->priv = xbox_remote; - rdev->allowed_protocols = RC_PROTO_BIT_UNKNOWN; + rdev->allowed_protocols = RC_PROTO_BIT_XBOX_DVD; rdev->driver_name = "xbox_remote"; rdev->open = xbox_remote_rc_open; @@ -157,6 +157,8 @@ static void xbox_remote_rc_init(struct xbox_remote *xbox_remote) rdev->device_name = xbox_remote->rc_name; rdev->input_phys = xbox_remote->rc_phys; + rdev->timeout = MS_TO_NS(10); + usb_to_input_id(xbox_remote->udev, &rdev->input_id); rdev->dev.parent = &xbox_remote->interface->dev; } diff --git a/include/media/rc-map.h b/include/media/rc-map.h index e5e86d595645..a0000f392362 100644 --- a/include/media/rc-map.h +++ b/include/media/rc-map.h @@ -40,6 +40,7 @@ #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_XBOX_DVD BIT_ULL(RC_PROTO_XBOX_DVD) #define RC_PROTO_BIT_ALL \ (RC_PROTO_BIT_UNKNOWN | RC_PROTO_BIT_OTHER | \ @@ -55,7 +56,8 @@ RC_PROTO_BIT_RC6_MCE | RC_PROTO_BIT_SHARP | \ RC_PROTO_BIT_XMP | RC_PROTO_BIT_CEC | \ RC_PROTO_BIT_IMON | RC_PROTO_BIT_RCMM12 | \ - RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32) + RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32 | \ + RC_PROTO_BIT_XBOX_DVD) /* All rc protocols for which we have decoders */ #define RC_PROTO_BIT_ALL_IR_DECODER \ (RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC5X_20 | \ diff --git a/include/uapi/linux/lirc.h b/include/uapi/linux/lirc.h index 45fcbf99d72e..f99d9dcae667 100644 --- a/include/uapi/linux/lirc.h +++ b/include/uapi/linux/lirc.h @@ -195,6 +195,7 @@ struct lirc_scancode { * @RC_PROTO_RCMM12: RC-MM protocol 12 bits * @RC_PROTO_RCMM24: RC-MM protocol 24 bits * @RC_PROTO_RCMM32: RC-MM protocol 32 bits + * @RC_PROTO_XBOX_DVD: Xbox DVD Movie Playback Kit protocol */ enum rc_proto { RC_PROTO_UNKNOWN = 0, @@ -224,6 +225,7 @@ enum rc_proto { RC_PROTO_RCMM12 = 24, RC_PROTO_RCMM24 = 25, RC_PROTO_RCMM32 = 26, + RC_PROTO_XBOX_DVD = 27, }; #endif -- 2.20.1 ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/default/linux-999-no-lzma-in-x86-perf-build.patch ================================================ diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config index 0294bfb6c5f8..153036bbed7e 100644 --- a/tools/perf/Makefile.config +++ b/tools/perf/Makefile.config @@ -35,7 +35,7 @@ ifeq ($(SRCARCH),x86) ifeq (${IS_64_BIT}, 1) CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT -DHAVE_SYSCALL_TABLE -I$(OUTPUT)arch/x86/include/generated ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S - LIBUNWIND_LIBS = -lunwind-x86_64 -lunwind -llzma + LIBUNWIND_LIBS = -lunwind-x86_64 -lunwind $(call detected,CONFIG_X86_64) else LIBUNWIND_LIBS = -lunwind-x86 -llzma -lunwind ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/default/linux-999.02-0001-pm-disable-async-suspend-resume-by-default.patch ================================================ From c314d9af9d774c052bea324e1a140ccdba0ca070 Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Tue, 8 Apr 2014 14:02:53 +0300 Subject: [PATCH] pm: disable async suspend/resume by default --- kernel/power/main.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/kernel/power/main.c b/kernel/power/main.c index 1d1bf63..361db93 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c @@ -46,7 +46,7 @@ int pm_notifier_call_chain(unsigned long val) } /* If set, devices may be suspended and resumed asynchronously. */ -int pm_async_enabled = 1; +int pm_async_enabled = 0; static ssize_t pm_async_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) -- 1.7.2.5 ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/default/linux-999.20-i915-pm-Be-less-agressive-with-clockfreq-changes-on-Bay-Trail.patch ================================================ From 28ad70a06fb84fe63cd036970db2561b2fd1562b Mon Sep 17 00:00:00 2001 From: Hans de Goede <hdegoede@redhat.com> Date: Sun, 5 Nov 2017 16:51:23 +0100 Subject: [PATCH v3 1/2] i915: pm: Be less agressive with clockfreq changes on Bay Trail Bay Trail devices are known to hang when changing the frequency often, this is discussed in great length in: https://bugzilla.kernel.org/show_bug.cgi?id=109051 Commit 6067a27d1f01 ("drm/i915: Avoid tweaking evaluation thresholds on Baytrail v3") is an attempt to workaround this. Several users in bko109051 report that an earlier version of this patch, v1: https://bugzilla.kernel.org/attachment.cgi?id=251471 Works better for them and they still see hangs with the merged v3. Comparing the 2 versions shows that they are indeed not equivalent, v1 not only skips writing the GEN6_RP* registers from valleyview_set_rps, as v3 does. It also contained these modifications to i915_irq.c: if (pm_iir & GEN6_PM_RP_DOWN_EI_EXPIRED) { if (!vlv_c0_above(dev_priv, &dev_priv->rps.down_ei, &now, - dev_priv->rps.down_threshold)) + VLV_RP_DOWN_EI_THRESHOLD)) events |= GEN6_PM_RP_DOWN_THRESHOLD; dev_priv->rps.down_ei = now; } if (pm_iir & GEN6_PM_RP_UP_EI_EXPIRED) { if (vlv_c0_above(dev_priv, &dev_priv->rps.up_ei, &now, - dev_priv->rps.up_threshold)) + VLV_RP_UP_EI_THRESHOLD)) events |= GEN6_PM_RP_UP_THRESHOLD; dev_priv->rps.up_ei = now; } Which use less aggressive up/down thresholds, which results in less GEN6_PM_RP_*_THRESHOLD events and thus in less calls to intel_set_rps() -> valleyview_set_rps() -> vlv_punit_write(PUNIT_REG_GPU_FREQ_REQ). With the last call being the likely cause of the hang. This commit hardcodes the threshold_up and _down values for Bay Trail to less aggressive values, reducing the amount of clock frequency changes, thus avoiding the hangs some people are still seeing with the merged fix. Buglink: https://bugzilla.kernel.org/show_bug.cgi?id=109051 Signed-off-by: Hans de Goede <hdegoede@redhat.com> --- drivers/gpu/drm/i915/i915_reg.h | 3 +++ drivers/gpu/drm/i915/intel_pm.c | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 68a58cce6ab1..2561af075ebb 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h @@ -1355,6 +1355,9 @@ enum i915_power_well_id { #define VLV_BIAS_CPU_125_SOC_875 (6 << 2) #define CHV_BIAS_CPU_50_SOC_50 (3 << 2) +#define VLV_RP_UP_EI_THRESHOLD 90 +#define VLV_RP_DOWN_EI_THRESHOLD 70 + /* vlv2 north clock has */ #define CCK_FUSE_REG 0x8 #define CCK_FUSE_HPLL_FREQ_MASK 0x3 diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 01966b89be14..177b6caa0a38 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c @@ -6096,8 +6096,11 @@ static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val) /* When byt can survive without system hang with dynamic * sw freq adjustments, this restriction can be lifted. */ - if (IS_VALLEYVIEW(dev_priv)) + if (IS_VALLEYVIEW(dev_priv)) { + threshold_up = VLV_RP_UP_EI_THRESHOLD; + threshold_down = VLV_RP_DOWN_EI_THRESHOLD; goto skip_hw_write; + } I915_WRITE(GEN6_RP_UP_EI, GT_INTERVAL_FROM_US(dev_priv, ei_up)); -- 2.14.3 ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/default/linux-999.21-intel_idle-Disable-C6N-and-C6S-on-Bay-Trail.patch ================================================ From 945d0eb39d8920854c72ecb743c07d54b738cf7f Mon Sep 17 00:00:00 2001 From: Hans de Goede <hdegoede@redhat.com> Date: Thu, 9 Nov 2017 14:21:24 +0100 Subject: [PATCH v3 2/2] intel_idle: Disable C6N and C6S on Bay Trail It seems that Bay Trail SoCs sometimes have issues waking from C6, a lot of users even report Bay Trail devices only being stable when passing intel_idle.max_cstate=1 to the kernel. This commits disables the C6 states while leaving the C7 states available so that the cores can still reach deep sleep states. There are several indicators that this is part of the solution for all the users who need to pass intel_idle.max_cstate=1: 1) The "VLP52 EOI Transactions May Not be Sent if Software Enters Core C6 During an Interrupt Service Routine" errata. 2) Several users who need intel_idle.max_cstate=1 indicate in bko109051 (which has over 800 comments!) that using a shell script which disables C6N and C6S through sysfs allows them to remove intel_idle.max_cstate=1 and still have a stable system which does use the C7 states for power-saving. BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=109051 Signed-off-by: Hans de Goede <hdegoede@redhat.com> --- drivers/idle/intel_idle.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c index 5dc7ea4b6bc4..fe05984c9e81 100644 --- a/drivers/idle/intel_idle.c +++ b/drivers/idle/intel_idle.c @@ -221,6 +221,7 @@ static struct cpuidle_state byt_cstates[] = { .flags = MWAIT2flg(0x58) | CPUIDLE_FLAG_TLB_FLUSHED, .exit_latency = 300, .target_residency = 275, + .disabled = true, .enter = &intel_idle, .enter_s2idle = intel_idle_s2idle, }, { @@ -229,6 +230,7 @@ static struct cpuidle_state byt_cstates[] = { .flags = MWAIT2flg(0x52) | CPUIDLE_FLAG_TLB_FLUSHED, .exit_latency = 500, .target_residency = 560, + .disabled = true, .enter = &intel_idle, .enter_s2idle = intel_idle_s2idle, }, { -- 2.14.3 ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/linux-004_lower_undefined_mode_timeout.patch ================================================ diff -Naur linux-2.6.23-rc9.orig/arch/i386/boot/tty.c linux-2.6.23-rc9/arch/i386/boot/tty.c --- linux-2.6.23-rc9.orig/arch/x86/boot/tty.c 2007-10-06 12:26:14.000000000 +0200 +++ linux-2.6.23-rc9/arch/x86/boot/tty.c 2007-10-06 12:37:47.000000000 +0200 @@ -92,7 +92,7 @@ int getchar_timeout(void) { - int cnt = 30; + int cnt = 3; int t0, t1; t0 = gettime(); diff -Naur linux-2.6.23-rc9.orig/arch/i386/boot/video.c linux-2.6.23-rc9/arch/i386/boot/video.c --- linux-2.6.23-rc9.orig/arch/x86/boot/video.c 2007-10-06 12:26:14.000000000 +0200 +++ linux-2.6.23-rc9/arch/x86/boot/video.c 2007-10-06 12:36:05.000000000 +0200 @@ -329,7 +329,7 @@ unsigned int sel; puts("Press <ENTER> to see video modes available, " - "<SPACE> to continue, or wait 30 sec\n"); + "<SPACE> to continue, or wait 3 sec\n"); kbd_flush(); while (1) { ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/linux-007_die_floppy_die.patch ================================================ From 4ff58b642f80dedb20533978123d89b5ac9b1ed5 Mon Sep 17 00:00:00 2001 From: Kyle McMartin <kyle@phobos.i.jkkm.org> Date: Tue, 30 Mar 2010 00:04:29 -0400 Subject: die-floppy-die Kill the floppy.ko pnp modalias. We were surviving just fine without autoloading floppy drivers, tyvm. Please feel free to register all complaints in the wastepaper bin. --- drivers/block/floppy.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 90c4038..f4a0b90 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -4619,8 +4619,7 @@ static const struct pnp_device_id floppy_pnpids[] = { {"PNP0700", 0}, {} }; - -MODULE_DEVICE_TABLE(pnp, floppy_pnpids); +/* MODULE_DEVICE_TABLE(pnp, floppy_pnpids); */ #else -- 1.7.0.1 ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/linux-009_disable_i8042_check_on_apple_mac.patch ================================================ From 2a79554c864ac58fa2ad982f0fcee2cc2aa33eb5 Mon Sep 17 00:00:00 2001 From: Bastien Nocera <hadess@hadess.net> Date: Thu, 20 May 2010 10:30:31 -0400 Subject: Disable i8042 checks on Intel Apple Macs As those computers never had any i8042 controllers, and the current lookup code could potentially lock up/hang/wait for timeout for long periods of time. Fixes intermittent hangs on boot on a MacbookAir1,1 Signed-off-by: Bastien Nocera <hadess@hadess.net> --- drivers/input/serio/i8042.c | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-) diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index 6440a8f..4d7cf98 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c @@ -1451,6 +1451,22 @@ static struct platform_driver i8042_driver = { .shutdown = i8042_shutdown, }; +#ifdef CONFIG_DMI +static struct dmi_system_id __initdata dmi_system_table[] = { + { + .matches = { + DMI_MATCH(DMI_BIOS_VENDOR, "Apple Computer, Inc.") + }, + }, + { + .matches = { + DMI_MATCH(DMI_BIOS_VENDOR, "Apple Inc.") + }, + }, + {} +}; +#endif /*CONFIG_DMI*/ + static int __init i8042_init(void) { struct platform_device *pdev; @@ -1458,6 +1474,12 @@ static int __init i8042_init(void) dbg_init(); +#ifdef CONFIG_DMI + /* Intel Apple Macs never have an i8042 controller */ + if (dmi_check_system(dmi_system_table) > 0) + return -ENODEV; +#endif /*CONFIG_DMI*/ + err = i8042_platform_init(); if (err) return err; -- 1.7.0.1 ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/raspberrypi/linux-051-ouya_controller_support.patch ================================================ commit 5a596921a4636e62843a59b7eab7b87b70a6d296 Author: Lukas Rusak <lorusak@gmail.com> Date: Sun May 6 22:03:11 2018 -0700 HID: add ouya HID driver This driver is a simple implementation to get the controller working and mapped properly. This driver does not include functionality for the touchpad (yet). The original driver was taken from from the ouya linux tree and has been simplified. It seems there may have been other versions of the controller present that had a broken report descriptor. I have removed that for now. diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 60252fd796f6..6be2c454e72e 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig @@ -659,6 +659,12 @@ config HID_ORTEK - Ortek WKB-2000 - Skycable wireless presenter +config HID_OUYA + tristate "OUYA Game Controller" + depends on USB_HID + ---help--- + Support for OUYA Game Controller. + config HID_PANTHERLORD tristate "Pantherlord/GreenAsia game controller" depends on HID diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile index 17a8bd97da9d..4425890934e4 100644 --- a/drivers/hid/Makefile +++ b/drivers/hid/Makefile @@ -71,6 +71,7 @@ obj-$(CONFIG_HID_MULTITOUCH) += hid-multitouch.o obj-$(CONFIG_HID_NTI) += hid-nti.o obj-$(CONFIG_HID_NTRIG) += hid-ntrig.o obj-$(CONFIG_HID_ORTEK) += hid-ortek.o +obj-$(CONFIG_HID_OUYA) += hid-ouya.o obj-$(CONFIG_HID_PRODIKEYS) += hid-prodikeys.o obj-$(CONFIG_HID_PANTHERLORD) += hid-pl.o obj-$(CONFIG_HID_PENMOUNT) += hid-penmount.o diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 0b5cc910f62e..0528efb825fa 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -859,6 +859,9 @@ #define USB_DEVICE_ID_ORTEK_WKB2000 0x2000 #define USB_DEVICE_ID_ORTEK_IHOME_IMAC_A210S 0x8003 +#define USB_VENDOR_ID_OUYA 0x2836 +#define USB_DEVICE_ID_OUYA_CONTROLLER 0x0001 + #define USB_VENDOR_ID_PLANTRONICS 0x047f #define USB_VENDOR_ID_PANASONIC 0x04da diff --git a/drivers/hid/hid-ouya.c b/drivers/hid/hid-ouya.c new file mode 100644 index 000000000000..4344a47b40af --- /dev/null +++ b/drivers/hid/hid-ouya.c @@ -0,0 +1,131 @@ +/* + * HID driver for OUYA Game Controller(s) + * + * Copyright (c) 2013 OUYA + * Copyright (c) 2013 Gregorios Leach <optikflux@gmail.com> + * Copyright (c) 2018 Lukas Rusak <lorusak@gmail.com> + */ + +#include <linux/device.h> +#include <linux/hid.h> +#include <linux/input.h> +#include <linux/module.h> + +#include "hid-ids.h" + +static const unsigned int ouya_absmap[] = { + [0x30] = ABS_X, /* left stick X */ + [0x31] = ABS_Y, /* left stick Y */ + [0x32] = ABS_Z, /* L2 */ + [0x33] = ABS_RX, /* right stick X */ + [0x34] = ABS_RY, /* right stick Y */ + [0x35] = ABS_RZ, /* R2 */ +}; + +static const unsigned int ouya_keymap[] = { + [0x1] = BTN_SOUTH, /* O */ + [0x2] = BTN_WEST, /* U */ + [0x3] = BTN_NORTH, /* Y */ + [0x4] = BTN_EAST, /* A */ + [0x5] = BTN_TL, /* L1 */ + [0x6] = BTN_TR, /* R1 */ + [0x7] = BTN_THUMBL, /* L3 */ + [0x8] = BTN_THUMBR, /* R3 */ + [0x9] = BTN_DPAD_UP, /* Up */ + [0xa] = BTN_DPAD_DOWN, /* Down */ + [0xb] = BTN_DPAD_LEFT, /* Left */ + [0xc] = BTN_DPAD_RIGHT, /* Right */ + [0xd] = BTN_TL2, /* L2 */ + [0xe] = BTN_TR2, /* R2 */ + [0xf] = BTN_MODE, /* Power */ +}; + +static int ouya_input_mapping(struct hid_device *hdev, struct hid_input *hi, + struct hid_field *field, struct hid_usage *usage, + unsigned long **bit, int *max) +{ + if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) { + unsigned int key = usage->hid & HID_USAGE; + + if (key >= ARRAY_SIZE(ouya_keymap)) + return -1; + + key = ouya_keymap[key]; + hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key); + + return 1; + + } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) { + unsigned int abs = usage->hid & HID_USAGE; + + if (abs >= ARRAY_SIZE(ouya_absmap)) + return -1; + + abs = ouya_absmap[abs]; + hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs); + + return 1; + } + + return 0; +} + +static int ouya_probe(struct hid_device *hdev, const struct hid_device_id *id) +{ + int ret; + + ret = hid_parse(hdev); + if (ret) { + hid_err(hdev, "parse failed\n"); + goto err_free; + } + + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT | HID_CONNECT_HIDDEV_FORCE); + if (ret) { + hid_err(hdev, "hw start failed\n"); + goto err_free; + } + + return 0; + +err_free: + return ret; +} + +static void ouya_remove(struct hid_device *hdev) +{ + hid_hw_stop(hdev); + kfree(hid_get_drvdata(hdev)); +} + +static const struct hid_device_id ouya_devices[] = { + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_OUYA, USB_DEVICE_ID_OUYA_CONTROLLER) }, + { } +}; +MODULE_DEVICE_TABLE(hid, ouya_devices); + +static struct hid_driver ouya_driver = { + .name = "ouya", + .id_table = ouya_devices, + .input_mapping = ouya_input_mapping, + .probe = ouya_probe, + .remove = ouya_remove, +}; + +static int __init ouya_init(void) +{ + return hid_register_driver(&ouya_driver); +} + +static void __exit ouya_exit(void) +{ + hid_unregister_driver(&ouya_driver); +} + +module_init(ouya_init); +module_exit(ouya_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Lukas Rusak <lorusak@gmail.com>"); +MODULE_AUTHOR("Gregorios Leach <optikflux@gmail.com>"); +MODULE_DESCRIPTION("Ouya Controller Driver"); diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c index 587e2681a53f..b5adc13e0df1 100644 --- a/drivers/hid/hid-quirks.c +++ b/drivers/hid/hid-quirks.c @@ -538,6 +538,9 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_IHOME_IMAC_A210S) }, { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, #endif +#if IS_ENABLED(CONFIG_HID_OUYA) + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_OUYA, USB_DEVICE_ID_OUYA_CONTROLLER) }, +#endif #if IS_ENABLED(CONFIG_HID_PANTHERLORD) { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) }, { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) }, ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/raspberrypi/linux-052-xbox_dvd_remote_support.patch ================================================ From 4d331d301222dc0585ab8864a842b3e460b1f744 Mon Sep 17 00:00:00 2001 From: Benjamin Valentin <benpicco@googlemail.com> Date: Thu, 4 Oct 2018 02:57:10 +0200 Subject: [PATCH] media: rc: add driver for Xbox DVD Movie Playback Kit The Xbox DVD Movie Playback Kit is a USB dongle with an IR remote for the Original Xbox. Historically it has been supported by the out-of-tree lirc_xbox driver, but this one has fallen out of favour and was just dropped from popular Kodi (formerly XBMC) distributions. This driver is heaviely based on the ati_remote driver where all the boilerplate was taken from - I was mostly just removing code. Signed-off-by: Benjamin Valentin <benpicco@googlemail.com> Signed-off-by: Sean Young <sean@mess.org> --- drivers/media/rc/Kconfig | 12 + drivers/media/rc/Makefile | 1 + drivers/media/rc/keymaps/Makefile | 1 + drivers/media/rc/keymaps/rc-xbox-dvd.c | 63 +++++ drivers/media/rc/xbox_remote.c | 306 +++++++++++++++++++++++++ include/media/rc-map.h | 1 + 6 files changed, 384 insertions(+) create mode 100644 drivers/media/rc/keymaps/rc-xbox-dvd.c create mode 100644 drivers/media/rc/xbox_remote.c diff --git a/drivers/media/rc/Kconfig b/drivers/media/rc/Kconfig index 1021c08a9ba4..8a216068a35a 100644 --- a/drivers/media/rc/Kconfig +++ b/drivers/media/rc/Kconfig @@ -493,6 +493,18 @@ config IR_TANGO The HW decoder supports NEC, RC-5, RC-6 IR protocols. When compiled as a module, look for tango-ir. +config RC_XBOX_DVD + tristate "Xbox DVD Movie Playback Kit" + depends on RC_CORE + depends on USB_ARCH_HAS_HCD + select USB + help + Say Y here if you want to use the Xbox DVD Movie Playback Kit. + These are IR remotes with USB receivers for the Original Xbox (2001). + + To compile this driver as a module, choose M here: the module will be + called xbox_remote. + config IR_ZX tristate "ZTE ZX IR remote control" depends on RC_CORE diff --git a/drivers/media/rc/Makefile b/drivers/media/rc/Makefile index e0340d043fe8..92c163816849 100644 --- a/drivers/media/rc/Makefile +++ b/drivers/media/rc/Makefile @@ -48,3 +48,4 @@ obj-$(CONFIG_IR_SIR) += sir_ir.o obj-$(CONFIG_IR_MTK) += mtk-cir.o obj-$(CONFIG_IR_ZX) += zx-irdec.o obj-$(CONFIG_IR_TANGO) += tango-ir.o +obj-$(CONFIG_RC_XBOX_DVD) += xbox_remote.o diff --git a/drivers/media/rc/keymaps/Makefile b/drivers/media/rc/keymaps/Makefile index d6b913a3032d..5b1399af6b3a 100644 --- a/drivers/media/rc/keymaps/Makefile +++ b/drivers/media/rc/keymaps/Makefile @@ -116,4 +116,5 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t-pci.o \ rc-winfast.o \ rc-winfast-usbii-deluxe.o \ rc-su3000.o \ + rc-xbox-dvd.o \ rc-zx-irdec.o diff --git a/drivers/media/rc/keymaps/rc-xbox-dvd.c b/drivers/media/rc/keymaps/rc-xbox-dvd.c new file mode 100644 index 000000000000..af387244636b --- /dev/null +++ b/drivers/media/rc/keymaps/rc-xbox-dvd.c @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: GPL-2.0+ +// Keytable for Xbox DVD remote +// Copyright (c) 2018 by Benjamin Valentin <benpicco@googlemail.com> + +#include <media/rc-map.h> +#include <linux/module.h> + +/* based on lircd.conf.xbox */ +static struct rc_map_table xbox_dvd[] = { + {0xa0b, KEY_OK}, + {0xaa6, KEY_UP}, + {0xaa7, KEY_DOWN}, + {0xaa8, KEY_RIGHT}, + {0xaa9, KEY_LEFT}, + {0xac3, KEY_INFO}, + + {0xac6, KEY_9}, + {0xac7, KEY_8}, + {0xac8, KEY_7}, + {0xac9, KEY_6}, + {0xaca, KEY_5}, + {0xacb, KEY_4}, + {0xacc, KEY_3}, + {0xacd, KEY_2}, + {0xace, KEY_1}, + {0xacf, KEY_0}, + + {0xad5, KEY_ANGLE}, + {0xad8, KEY_BACK}, + {0xadd, KEY_PREVIOUSSONG}, + {0xadf, KEY_NEXTSONG}, + {0xae0, KEY_STOP}, + {0xae2, KEY_REWIND}, + {0xae3, KEY_FASTFORWARD}, + {0xae5, KEY_TITLE}, + {0xae6, KEY_PAUSE}, + {0xaea, KEY_PLAY}, + {0xaf7, KEY_MENU}, +}; + +static struct rc_map_list xbox_dvd_map = { + .map = { + .scan = xbox_dvd, + .size = ARRAY_SIZE(xbox_dvd), + .rc_proto = RC_PROTO_UNKNOWN, + .name = RC_MAP_XBOX_DVD, + } +}; + +static int __init init_rc_map(void) +{ + return rc_map_register(&xbox_dvd_map); +} + +static void __exit exit_rc_map(void) +{ + rc_map_unregister(&xbox_dvd_map); +} + +module_init(init_rc_map) +module_exit(exit_rc_map) + +MODULE_LICENSE("GPL"); diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c new file mode 100644 index 000000000000..07ed9be24a60 --- /dev/null +++ b/drivers/media/rc/xbox_remote.c @@ -0,0 +1,306 @@ +// SPDX-License-Identifier: GPL-2.0+ +// Driver for Xbox DVD Movie Playback Kit +// Copyright (c) 2018 by Benjamin Valentin <benpicco@googlemail.com> + +/* + * Xbox DVD Movie Playback Kit USB IR dongle support + * + * The driver was derived from the ati_remote driver 2.2.1 + * and used information from lirc_xbox.c + * + * Copyright (c) 2011, 2012 Anssi Hannula <anssi.hannula@iki.fi> + * Copyright (c) 2004 Torrey Hoffman <thoffman@arnor.net> + * Copyright (c) 2002 Vladimir Dergachev + * Copyright (c) 2003-2004 Paul Miller <pmiller9@users.sourceforge.net> + */ + +#include <linux/slab.h> +#include <linux/module.h> +#include <linux/usb/input.h> +#include <media/rc-core.h> + +/* + * Module and Version Information + */ +#define DRIVER_VERSION "1.0.0" +#define DRIVER_AUTHOR "Benjamin Valentin <benpicco@googlemail.com>" +#define DRIVER_DESC "Xbox DVD USB Remote Control" + +#define NAME_BUFSIZE 80 /* size of product name, path buffers */ +#define DATA_BUFSIZE 8 /* size of URB data buffers */ + +/* + * USB vendor ids for XBOX DVD Dongles + */ +#define VENDOR_GAMESTER 0x040b +#define VENDOR_MICROSOFT 0x045e + +static const struct usb_device_id xbox_remote_table[] = { + /* Gamester Xbox DVD Movie Playback Kit IR */ + { + USB_DEVICE(VENDOR_GAMESTER, 0x6521), + }, + /* Microsoft Xbox DVD Movie Playback Kit IR */ + { + USB_DEVICE(VENDOR_MICROSOFT, 0x0284), + }, + {} /* Terminating entry */ +}; + +MODULE_DEVICE_TABLE(usb, xbox_remote_table); + +struct xbox_remote { + struct rc_dev *rdev; + struct usb_device *udev; + struct usb_interface *interface; + + struct urb *irq_urb; + unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16)); + + char rc_name[NAME_BUFSIZE]; + char rc_phys[NAME_BUFSIZE]; +}; + +static int xbox_remote_rc_open(struct rc_dev *rdev) +{ + struct xbox_remote *xbox_remote = rdev->priv; + + /* On first open, submit the read urb which was set up previously. */ + xbox_remote->irq_urb->dev = xbox_remote->udev; + if (usb_submit_urb(xbox_remote->irq_urb, GFP_KERNEL)) { + dev_err(&xbox_remote->interface->dev, + "%s: usb_submit_urb failed!\n", __func__); + return -EIO; + } + + return 0; +} + +static void xbox_remote_rc_close(struct rc_dev *rdev) +{ + struct xbox_remote *xbox_remote = rdev->priv; + + usb_kill_urb(xbox_remote->irq_urb); +} + +/* + * xbox_remote_report_input + */ +static void xbox_remote_input_report(struct urb *urb) +{ + struct xbox_remote *xbox_remote = urb->context; + unsigned char *data = xbox_remote->inbuf; + + /* + * data[0] = 0x00 + * data[1] = length - always 0x06 + * data[2] = the key code + * data[3] = high part of key code + * data[4] = last_press_ms (low) + * data[5] = last_press_ms (high) + */ + + /* Deal with strange looking inputs */ + if (urb->actual_length != 6 || urb->actual_length != data[1]) { + dev_warn(&urb->dev->dev, "Weird data, len=%d: %*ph\n", + urb->actual_length, urb->actual_length, data); + return; + } + + rc_keydown(xbox_remote->rdev, RC_PROTO_UNKNOWN, + le16_to_cpup((__le16*)(data + 2)), 0); +} + +/* + * xbox_remote_irq_in + */ +static void xbox_remote_irq_in(struct urb *urb) +{ + struct xbox_remote *xbox_remote = urb->context; + int retval; + + switch (urb->status) { + case 0: /* success */ + xbox_remote_input_report(urb); + break; + case -ECONNRESET: /* unlink */ + case -ENOENT: + case -ESHUTDOWN: + dev_dbg(&xbox_remote->interface->dev, + "%s: urb error status, unlink?\n", + __func__); + return; + default: /* error */ + dev_dbg(&xbox_remote->interface->dev, + "%s: Nonzero urb status %d\n", + __func__, urb->status); + } + + retval = usb_submit_urb(urb, GFP_ATOMIC); + if (retval) + dev_err(&xbox_remote->interface->dev, + "%s: usb_submit_urb()=%d\n", + __func__, retval); +} + +static void xbox_remote_rc_init(struct xbox_remote *xbox_remote) +{ + struct rc_dev *rdev = xbox_remote->rdev; + + rdev->priv = xbox_remote; + rdev->allowed_protocols = RC_PROTO_BIT_UNKNOWN; + rdev->driver_name = "xbox_remote"; + + rdev->open = xbox_remote_rc_open; + rdev->close = xbox_remote_rc_close; + + rdev->device_name = xbox_remote->rc_name; + rdev->input_phys = xbox_remote->rc_phys; + + usb_to_input_id(xbox_remote->udev, &rdev->input_id); + rdev->dev.parent = &xbox_remote->interface->dev; +} + +static int xbox_remote_initialize(struct xbox_remote *xbox_remote, + struct usb_endpoint_descriptor *endpoint_in) +{ + struct usb_device *udev = xbox_remote->udev; + int pipe, maxp; + + /* Set up irq_urb */ + pipe = usb_rcvintpipe(udev, endpoint_in->bEndpointAddress); + maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe)); + maxp = (maxp > DATA_BUFSIZE) ? DATA_BUFSIZE : maxp; + + usb_fill_int_urb(xbox_remote->irq_urb, udev, pipe, xbox_remote->inbuf, + maxp, xbox_remote_irq_in, xbox_remote, + endpoint_in->bInterval); + + return 0; +} + +/* + * xbox_remote_probe + */ +static int xbox_remote_probe(struct usb_interface *interface, + const struct usb_device_id *id) +{ + struct usb_device *udev = interface_to_usbdev(interface); + struct usb_host_interface *iface_host = interface->cur_altsetting; + struct usb_endpoint_descriptor *endpoint_in; + struct xbox_remote *xbox_remote; + struct rc_dev *rc_dev; + int err = -ENOMEM; + + // why is there also a device with no endpoints? + if (iface_host->desc.bNumEndpoints == 0) + return -ENODEV; + + if (iface_host->desc.bNumEndpoints != 1) { + pr_err("%s: Unexpected desc.bNumEndpoints: %d\n", + __func__, iface_host->desc.bNumEndpoints); + return -ENODEV; + } + + endpoint_in = &iface_host->endpoint[0].desc; + + if (!usb_endpoint_is_int_in(endpoint_in)) { + pr_err("%s: Unexpected endpoint_in\n", __func__); + return -ENODEV; + } + if (le16_to_cpu(endpoint_in->wMaxPacketSize) == 0) { + pr_err("%s: endpoint_in message size==0?\n", __func__); + return -ENODEV; + } + + xbox_remote = kzalloc(sizeof(*xbox_remote), GFP_KERNEL); + rc_dev = rc_allocate_device(RC_DRIVER_SCANCODE); + if (!xbox_remote || !rc_dev) + goto exit_free_dev_rdev; + + /* Allocate URB buffer */ + xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL); + if (!xbox_remote->irq_urb) + goto exit_free_buffers; + + xbox_remote->udev = udev; + xbox_remote->rdev = rc_dev; + xbox_remote->interface = interface; + + usb_make_path(udev, xbox_remote->rc_phys, sizeof(xbox_remote->rc_phys)); + + strlcat(xbox_remote->rc_phys, "/input0", sizeof(xbox_remote->rc_phys)); + + snprintf(xbox_remote->rc_name, sizeof(xbox_remote->rc_name), "%s%s%s", + udev->manufacturer ?: "", + udev->manufacturer && udev->product ? " " : "", + udev->product ?: ""); + + if (!strlen(xbox_remote->rc_name)) + snprintf(xbox_remote->rc_name, sizeof(xbox_remote->rc_name), + DRIVER_DESC "(%04x,%04x)", + le16_to_cpu(xbox_remote->udev->descriptor.idVendor), + le16_to_cpu(xbox_remote->udev->descriptor.idProduct)); + + rc_dev->map_name = RC_MAP_XBOX_DVD; /* default map */ + + xbox_remote_rc_init(xbox_remote); + + /* Device Hardware Initialization */ + err = xbox_remote_initialize(xbox_remote, endpoint_in); + if (err) + goto exit_kill_urbs; + + /* Set up and register rc device */ + err = rc_register_device(xbox_remote->rdev); + if (err) + goto exit_kill_urbs; + + usb_set_intfdata(interface, xbox_remote); + + return 0; + +exit_kill_urbs: + usb_kill_urb(xbox_remote->irq_urb); +exit_free_buffers: + usb_free_urb(xbox_remote->irq_urb); +exit_free_dev_rdev: + rc_free_device(rc_dev); + kfree(xbox_remote); + + return err; +} + +/* + * xbox_remote_disconnect + */ +static void xbox_remote_disconnect(struct usb_interface *interface) +{ + struct xbox_remote *xbox_remote; + + xbox_remote = usb_get_intfdata(interface); + usb_set_intfdata(interface, NULL); + if (!xbox_remote) { + dev_warn(&interface->dev, "%s - null device?\n", __func__); + return; + } + + usb_kill_urb(xbox_remote->irq_urb); + rc_unregister_device(xbox_remote->rdev); + usb_free_urb(xbox_remote->irq_urb); + kfree(xbox_remote); +} + +/* usb specific object to register with the usb subsystem */ +static struct usb_driver xbox_remote_driver = { + .name = "xbox_remote", + .probe = xbox_remote_probe, + .disconnect = xbox_remote_disconnect, + .id_table = xbox_remote_table, +}; + +module_usb_driver(xbox_remote_driver); + +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); diff --git a/include/media/rc-map.h b/include/media/rc-map.h index bfa3017cecba..d621acadfbf3 100644 --- a/include/media/rc-map.h +++ b/include/media/rc-map.h @@ -277,6 +277,7 @@ struct rc_map *rc_map_get(const char *name); #define RC_MAP_WINFAST "rc-winfast" #define RC_MAP_WINFAST_USBII_DELUXE "rc-winfast-usbii-deluxe" #define RC_MAP_SU3000 "rc-su3000" +#define RC_MAP_XBOX_DVD "rc-xbox-dvd" #define RC_MAP_ZX_IRDEC "rc-zx-irdec" /* -- 2.17.1 ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/raspberrypi/linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch ================================================ From 7051422474e4c4e302ede3d07ffd8ef2682e07a2 Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Tue, 22 Apr 2014 16:05:14 +0300 Subject: [PATCH] [RFC] hid/sony: add autorepeat for PS3 remotes adapted to 4.6 Betreff: [RFC] hid/sony: add autorepeat for PS3 remotes Von: David Dillow <dave@thedillows.org> Datum: 28.06.2013 04:28 An: linux-input@vger.kernel.org Kopie (CC): Stephan Raue <stephan@openelec.tv> Some applications using the PS3 remote would like to have autorepeat from the device. Use the input subsystem's software emulation to provide this capability, and enable those that don't need it to turn it off. --- I'm not sure this is the correct approach, or if it is even appropriate for a remote to do autorepeat. However, the media/rc subsystem does do it by default, and it's been requested by users, so there is at least some demand. This compiled against the hid-sony driver with the PS3 remote changes merged, but I have done no testing of it. If the approach seems reasonable, I'll try to test it when the MythTV is idle. Signed-off-by: Matt DeVillier <matt.devillier@gmail.com> --- drivers/hid/hid-sony.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index 310436a..84f7f41 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c @@ -1120,6 +1120,25 @@ static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi, return 1; } +static int ps3remote_setup_repeat(struct hid_device *hdev) +{ + struct hid_input *hidinput = list_first_entry(&hdev->inputs, + struct hid_input, list); + struct input_dev *input = hidinput->input; + + /* + * Set up autorepeat defaults per the remote control subsystem; + * this must be done after hid_hw_start(), as having these non-zero + * at the time of input_register_device() tells the input system that + * the hardware does the autorepeat, and the PS3 remote does not. + */ + set_bit(EV_REP, input->evbit); + input->rep[REP_DELAY] = 500; + input->rep[REP_PERIOD] = 125; + + return 0; +} + static u8 *sony_report_fixup(struct hid_device *hdev, u8 *rdesc, unsigned int *rsize) { @@ -2372,6 +2391,8 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) sony_init_output_report(sc, dualshock4_send_output_report); } else if (sc->quirks & MOTION_CONTROLLER) { sony_init_output_report(sc, motion_send_output_report); + } else if (sc->quirks & PS3REMOTE) { + ret = ps3remote_setup_repeat(hdev); } else { ret = 0; } -- 2.5.0 ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/raspberrypi/linux-062-imon_pad_ignore_diagonal.patch ================================================ diff -Naur linux-3.16.1/drivers/media/rc/imon.c linux-3.16.1.patch/drivers/media/rc/imon.c --- linux-3.16.1/drivers/media/rc/imon.c 2014-08-14 04:36:35.000000000 +0200 +++ linux-3.16.1.patch/drivers/media/rc/imon.c 2014-08-15 13:57:16.587620642 +0200 @@ -1344,6 +1344,17 @@ } } else { /* + * For users without stabilized, just ignore any value getting + * to close to the diagonal. + */ + if ((abs(rel_y) < 2 && abs(rel_x) < 2) || + abs(abs(rel_y) - abs(rel_x)) < 2 ) { + spin_lock_irqsave(&ictx->kc_lock, flags); + ictx->kc = KEY_UNKNOWN; + spin_unlock_irqrestore(&ictx->kc_lock, flags); + return; + } + /* * Hack alert: instead of using keycodes, we have * to use hard-coded scancodes here... */ ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/raspberrypi/linux-902-extend-rc6-toggle-support-for-zotac.patch ================================================ From ae1ccaa3587c0bd3d6d01841fa2e668cdf738f1e Mon Sep 17 00:00:00 2001 From: Matthias Reichl <hias@horus.com> 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 <hias@horus.com> --- 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 <limits.h> */ @@ -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 ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/raspberrypi/linux-903-backport-rcmm-ir-decoder.patch ================================================ From da8a71104dda4a85a9d9546ff462542347f8efa6 Mon Sep 17 00:00:00 2001 From: Matthias Reichl <hias@horus.com> 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 <patrick9876@free.fr> Signed-off-by: Sean Young <sean@mess.org> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> Signed-off-by: Matthias Reichl <hias@horus.com> --- 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 <david@hardeman.nu> S: Maintained F: drivers/media/rc/winbond-cir.c +RCMM REMOTE CONTROLS DECODER +M: Patrick Lerda <patrick9876@free.fr> +S: Maintained +F: drivers/media/rc/ir-rcmm-decoder.c + WINSYSTEMS EBC-C384 WATCHDOG DRIVER M: William Breathitt Gray <vilhelm.gray@gmail.com> 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 <patrick9876@free.fr> + +#include "rc-core-priv.h" +#include <linux/module.h> +#include <linux/version.h> + +#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 ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/raspberrypi/linux-904-improve-xbox-dvd-remote-performance.patch ================================================ From 55096db50d8cdbf777c67f672b493ef565a12c38 Mon Sep 17 00:00:00 2001 From: Matthias Reichl <hias@horus.com> Date: Fri, 22 Mar 2019 12:26:17 +0100 Subject: [PATCH] media: rc: xbox_remote: add protocol and set timeout The timestamps in ir-keytable -t output showed that the Xbox DVD IR dongle decodes scancodes every 64ms. The last scancode of a longer button press is decodes 64ms after the last-but-one which indicates the decoder doesn't use a timeout but decodes on the last edge of the signal. 267.042629: lirc protocol(unknown): scancode = 0xace 267.042665: event type EV_MSC(0x04): scancode = 0xace 267.042665: event type EV_KEY(0x01) key_down: KEY_1(0x0002) 267.042665: event type EV_SYN(0x00). 267.106625: lirc protocol(unknown): scancode = 0xace 267.106643: event type EV_MSC(0x04): scancode = 0xace 267.106643: event type EV_SYN(0x00). 267.170623: lirc protocol(unknown): scancode = 0xace 267.170638: event type EV_MSC(0x04): scancode = 0xace 267.170638: event type EV_SYN(0x00). 267.234621: lirc protocol(unknown): scancode = 0xace 267.234636: event type EV_MSC(0x04): scancode = 0xace 267.234636: event type EV_SYN(0x00). 267.298623: lirc protocol(unknown): scancode = 0xace 267.298638: event type EV_MSC(0x04): scancode = 0xace 267.298638: event type EV_SYN(0x00). 267.543345: event type EV_KEY(0x01) key_down: KEY_1(0x0002) 267.543345: event type EV_SYN(0x00). 267.570015: event type EV_KEY(0x01) key_up: KEY_1(0x0002) 267.570015: event type EV_SYN(0x00). Add a protocol with the repeat value and set the timeout in the driver to 10ms (to have a bit of headroom for delays) so the Xbox DVD remote performs more responsive. Signed-off-by: Matthias Reichl <hias@horus.com> --- Documentation/media/lirc.h.rst.exceptions | 1 + drivers/media/rc/keymaps/rc-xbox-dvd.c | 2 +- drivers/media/rc/rc-main.c | 2 ++ drivers/media/rc/xbox_remote.c | 4 +++- include/media/rc-map.h | 4 +++- include/uapi/linux/lirc.h | 2 ++ 6 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Documentation/media/lirc.h.rst.exceptions b/Documentation/media/lirc.h.rst.exceptions index e7a41d4b3d46..f8b5f1a32b7d 100644 --- a/Documentation/media/lirc.h.rst.exceptions +++ b/Documentation/media/lirc.h.rst.exceptions @@ -61,6 +61,7 @@ ignore symbol RC_PROTO_IMON ignore symbol RC_PROTO_RCMM12 ignore symbol RC_PROTO_RCMM24 ignore symbol RC_PROTO_RCMM32 +ignore symbol RC_PROTO_XBOX_DVD # Undocumented macros diff --git a/drivers/media/rc/keymaps/rc-xbox-dvd.c b/drivers/media/rc/keymaps/rc-xbox-dvd.c index af387244636b..42815ab57bff 100644 --- a/drivers/media/rc/keymaps/rc-xbox-dvd.c +++ b/drivers/media/rc/keymaps/rc-xbox-dvd.c @@ -42,7 +42,7 @@ static struct rc_map_list xbox_dvd_map = { .map = { .scan = xbox_dvd, .size = ARRAY_SIZE(xbox_dvd), - .rc_proto = RC_PROTO_UNKNOWN, + .rc_proto = RC_PROTO_XBOX_DVD, .name = RC_MAP_XBOX_DVD, } }; diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c index 78e79c37f208..7f1d5b226f68 100644 --- a/drivers/media/rc/rc-main.c +++ b/drivers/media/rc/rc-main.c @@ -76,6 +76,7 @@ static const struct { .scancode_bits = 0x00ffffff, .repeat_period = 114 }, [RC_PROTO_RCMM32] = { .name = "rc-mm-32", .scancode_bits = 0xffffffff, .repeat_period = 114 }, + [RC_PROTO_XBOX_DVD] = { .name = "xbox-dvd", .repeat_period = 64 }, }; /* Used to keep track of known keymaps */ @@ -1027,6 +1028,7 @@ static const struct { { RC_PROTO_BIT_RCMM12 | RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32, "rc-mm", "ir-rcmm-decoder" }, + { RC_PROTO_BIT_XBOX_DVD, "xbox-dvd", NULL }, }; /** diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c index f959cbb94744..79470c09989e 100644 --- a/drivers/media/rc/xbox_remote.c +++ b/drivers/media/rc/xbox_remote.c @@ -148,7 +148,7 @@ static void xbox_remote_rc_init(struct xbox_remote *xbox_remote) struct rc_dev *rdev = xbox_remote->rdev; rdev->priv = xbox_remote; - rdev->allowed_protocols = RC_PROTO_BIT_UNKNOWN; + rdev->allowed_protocols = RC_PROTO_BIT_XBOX_DVD; rdev->driver_name = "xbox_remote"; rdev->open = xbox_remote_rc_open; @@ -157,6 +157,8 @@ static void xbox_remote_rc_init(struct xbox_remote *xbox_remote) rdev->device_name = xbox_remote->rc_name; rdev->input_phys = xbox_remote->rc_phys; + rdev->timeout = MS_TO_NS(10); + usb_to_input_id(xbox_remote->udev, &rdev->input_id); rdev->dev.parent = &xbox_remote->interface->dev; } diff --git a/include/media/rc-map.h b/include/media/rc-map.h index e5e86d595645..a0000f392362 100644 --- a/include/media/rc-map.h +++ b/include/media/rc-map.h @@ -40,6 +40,7 @@ #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_XBOX_DVD BIT_ULL(RC_PROTO_XBOX_DVD) #define RC_PROTO_BIT_ALL \ (RC_PROTO_BIT_UNKNOWN | RC_PROTO_BIT_OTHER | \ @@ -55,7 +56,8 @@ RC_PROTO_BIT_RC6_MCE | RC_PROTO_BIT_SHARP | \ RC_PROTO_BIT_XMP | RC_PROTO_BIT_CEC | \ RC_PROTO_BIT_IMON | RC_PROTO_BIT_RCMM12 | \ - RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32) + RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32 | \ + RC_PROTO_BIT_XBOX_DVD) /* All rc protocols for which we have decoders */ #define RC_PROTO_BIT_ALL_IR_DECODER \ (RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC5X_20 | \ diff --git a/include/uapi/linux/lirc.h b/include/uapi/linux/lirc.h index 45fcbf99d72e..f99d9dcae667 100644 --- a/include/uapi/linux/lirc.h +++ b/include/uapi/linux/lirc.h @@ -195,6 +195,7 @@ struct lirc_scancode { * @RC_PROTO_RCMM12: RC-MM protocol 12 bits * @RC_PROTO_RCMM24: RC-MM protocol 24 bits * @RC_PROTO_RCMM32: RC-MM protocol 32 bits + * @RC_PROTO_XBOX_DVD: Xbox DVD Movie Playback Kit protocol */ enum rc_proto { RC_PROTO_UNKNOWN = 0, @@ -224,6 +225,7 @@ enum rc_proto { RC_PROTO_RCMM12 = 24, RC_PROTO_RCMM24 = 25, RC_PROTO_RCMM32 = 26, + RC_PROTO_XBOX_DVD = 27, }; #endif -- 2.20.1 ================================================ FILE: projects/Amlogic-ce/packages/linux/patches/raspberrypi/linux-999.02-0001-pm-disable-async-suspend-resume-by-default.patch ================================================ From c314d9af9d774c052bea324e1a140ccdba0ca070 Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Tue, 8 Apr 2014 14:02:53 +0300 Subject: [PATCH] pm: disable async suspend/resume by default --- kernel/power/main.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/kernel/power/main.c b/kernel/power/main.c index 1d1bf63..361db93 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c @@ -46,7 +46,7 @@ int pm_notifier_call_chain(unsigned long val) } /* If set, devices may be suspended and resumed asynchronously. */ -int pm_async_enabled = 1; +int pm_async_enabled = 0; static ssize_t pm_async_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) -- 1.7.2.5 ================================================ FILE: projects/Amlogic-ce/packages/linux/sysctl.d/network.conf ================================================ net.ipv4.tcp_no_metrics_save=1 ================================================ FILE: projects/Amlogic-ce/packages/linux/sysctl.d/qdisc.conf ================================================ net.core.default_qdisc = fq_codel ================================================ FILE: projects/Amlogic-ce/packages/linux/udev.d/30-disable-wakeup.rules ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) ACTION!="add|change", GOTO="end" DRIVER=="ehci-pci|xhci_hcd", RUN+="/usr/bin/sh -c 'echo disabled > /sys/$devpath/power/wakeup'" LABEL="end" ================================================ FILE: projects/Amlogic-ce/packages/linux-driver-addons/dvb/media_tree/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="media_tree" PKG_LICENSE="GPL" PKG_SITE="https://git.linuxtv.org/media_tree.git" PKG_DEPENDS_TARGET="toolchain" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="Source of Linux Kernel media_tree subsystem to build with media_build." PKG_TOOLCHAIN="manual" PKG_PATCH_DIRS="${LINUX}" case "${LINUX}" in amlogic-4.9) PKG_VERSION="2019-07-11-22be8233b34f" PKG_SHA256="14363b1aacfe59805a1fe93739caed53036879e7b871f1d8d7061527c3cb9eb8" PKG_URL="http://linuxtv.org/downloads/drivers/linux-media-${PKG_VERSION}.tar.bz2" PKG_TAR_STRIP_COMPONENTS="yes" ;; amlogic-5.4) PKG_VERSION="d8675998dc4a902a4d01a6d4b85e83ef76d3374b" PKG_SHA256="2687f2fedebbee222e56da85d90f0b8bb446f148b63604272b6782ade87da1b9" PKG_URL="https://github.com/CoreELEC/media_tree/archive/${PKG_VERSION}.tar.gz" ;; esac post_unpack() { # hack/workaround for borked upstream kernel/media_build # without removing atomisp there a lot additional includes that # slowdown build process after modpost from 3min to 6min # even if atomisp is disabled via kernel.conf rm -rf ${PKG_BUILD}/drivers/staging/media/atomisp if [ -f ${PKG_BUILD}/drivers/staging/media/Kconfig ]; then sed -i 's|^.*drivers/staging/media/atomisp.*$||' \ ${PKG_BUILD}/drivers/staging/media/Kconfig fi } ================================================ FILE: projects/Amlogic-ce/packages/linux-driver-addons/dvb/media_tree/patches/amlogic-4.9/media_tree-01-m88ds3103b.patch ================================================ From: Brad Love <brad@nextdimension.cc> https://git.linuxtv.org/brad/media_tree.git/log/?h=Montage-3103b.v2 support for m88ds3103b diff --git a/drivers/media/dvb-frontends/m88ds3103.c b/drivers/media/dvb-frontends/m88ds3103.c index 3a367a5..0d3b81d 100644 --- a/drivers/media/dvb-frontends/m88ds3103.c +++ b/drivers/media/dvb-frontends/m88ds3103.c @@ -64,6 +64,92 @@ err: return ret; } +/* + * m88ds3103b demod has an internal device related to clocking. First the i2c + * gate must be opened, for one transaction, then writes will be allowed. + */ +static int m88ds3103b_dt_write(struct m88ds3103_dev *dev, int reg, int data) +{ + struct i2c_client *client = dev->client; + u8 buf[] = {reg, data}; + u8 val; + int ret; + struct i2c_msg msg = { + .addr = dev->dt_addr, .flags = 0, .buf = buf, .len = 2 + }; + + m88ds3103_update_bits(dev, 0x11, 0x01, 0x00); + + val = 0x11; + ret = regmap_write(dev->regmap, 0x03, val); + if (ret) + dev_dbg(&client->dev, "fail=%d\n", ret); + + ret = i2c_transfer(dev->client->adapter, &msg, 1); + if (ret != 1) { + dev_dbg(&client->dev, "0x%02x (ret=%i, reg=0x%02x, value=0x%02x)\n", + dev->dt_addr, ret, reg, data); + + m88ds3103_update_bits(dev, 0x11, 0x01, 0x01); + return -EREMOTEIO; + } + m88ds3103_update_bits(dev, 0x11, 0x01, 0x01); + + dev_dbg(&client->dev, "0x%02x reg 0x%02x, value 0x%02x\n", + dev->dt_addr, reg, data); + + return 0; +} + +/* + * m88ds3103b demod has an internal device related to clocking. First the i2c + * gate must be opened, for two transactions, then reads will be allowed. + */ +static int m88ds3103b_dt_read(struct m88ds3103_dev *dev, u8 reg) +{ + struct i2c_client *client = dev->client; + int ret; + u8 val; + u8 b0[] = { reg }; + u8 b1[] = { 0 }; + struct i2c_msg msg[] = { + { + .addr = dev->dt_addr, + .flags = 0, + .buf = b0, + .len = 1 + }, + { + .addr = dev->dt_addr, + .flags = I2C_M_RD, + .buf = b1, + .len = 1 + } + }; + + m88ds3103_update_bits(dev, 0x11, 0x01, 0x00); + + val = 0x12; + ret = regmap_write(dev->regmap, 0x03, val); + if (ret) + dev_dbg(&client->dev, "fail=%d\n", ret); + + ret = i2c_transfer(dev->client->adapter, msg, 2); + if (ret != 2) { + dev_dbg(&client->dev, "0x%02x (err=%d, reg=0x%02x)\n", + dev->dt_addr, ret, reg); + + m88ds3103_update_bits(dev, 0x11, 0x01, 0x01); + return -EREMOTEIO; + } + m88ds3103_update_bits(dev, 0x11, 0x01, 0x01); + + dev_dbg(&client->dev, "0x%02x reg 0x%02x, value 0x%02x\n", + dev->dt_addr, reg, b1[0]); + + return b1[0]; +} + /* * Get the demodulator AGC PWM voltage setting supplied to the tuner. */ @@ -288,6 +374,253 @@ err: return ret; } +static int m88ds3103b_select_mclk(struct m88ds3103_dev *dev) +{ + struct i2c_client *client = dev->client; + struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache; + u32 adc_Freq_MHz[3] = {96, 93, 99}; + u8 reg16_list[3] = {96, 92, 100}, reg16, reg15; + u32 offset_MHz[3]; + u32 max_offset = 0; + u32 old_setting = dev->mclk; + u32 tuner_freq_MHz = c->frequency / 1000; + u8 i; + char big_symbol = 0; + + big_symbol = (c->symbol_rate > 45010000) ? 1 : 0; + + if (big_symbol) { + reg16 = 115; + } else { + reg16 = 96; + + /* TODO: IS THIS NECESSARY ? */ + for (i = 0; i < 3; i++) { + offset_MHz[i] = tuner_freq_MHz % adc_Freq_MHz[i]; + + if (offset_MHz[i] > (adc_Freq_MHz[i] / 2)) + offset_MHz[i] = adc_Freq_MHz[i] - offset_MHz[i]; + + if (offset_MHz[i] > max_offset) { + max_offset = offset_MHz[i]; + reg16 = reg16_list[i]; + dev->mclk = adc_Freq_MHz[i] * 1000 * 1000; + + if (big_symbol) + dev->mclk /= 2; + + dev_dbg(&client->dev, "modifying mclk %u -> %u\n", + old_setting, dev->mclk); + } + } + } + + if (dev->mclk == 93000000) + regmap_write(dev->regmap, 0xA0, 0x42); + else if (dev->mclk == 96000000) + regmap_write(dev->regmap, 0xA0, 0x44); + else if (dev->mclk == 99000000) + regmap_write(dev->regmap, 0xA0, 0x46); + else if (dev->mclk == 110250000) + regmap_write(dev->regmap, 0xA0, 0x4E); + else + regmap_write(dev->regmap, 0xA0, 0x44); + + reg15 = m88ds3103b_dt_read(dev, 0x15); + + m88ds3103b_dt_write(dev, 0x05, 0x40); + m88ds3103b_dt_write(dev, 0x11, 0x08); + + if (big_symbol) + reg15 |= 0x02; + else + reg15 &= ~0x02; + + m88ds3103b_dt_write(dev, 0x15, reg15); + m88ds3103b_dt_write(dev, 0x16, reg16); + + usleep_range(5000, 5500); + + m88ds3103b_dt_write(dev, 0x05, 0x00); + m88ds3103b_dt_write(dev, 0x11, (u8)(big_symbol ? 0x0E : 0x0A)); + + usleep_range(5000, 5500); + + return 0; +} + +static int m88ds3103b_set_mclk(struct m88ds3103_dev *dev, u32 mclk_khz) +{ + u8 reg11 = 0x0A, reg15, reg16, reg1D, reg1E, reg1F, tmp; + u8 sm, f0 = 0, f1 = 0, f2 = 0, f3 = 0, pll_ldpc_mode; + u16 pll_div_fb, N; + u32 div; + + reg15 = m88ds3103b_dt_read(dev, 0x15); + reg16 = m88ds3103b_dt_read(dev, 0x16); + reg1D = m88ds3103b_dt_read(dev, 0x1D); + + if (dev->cfg->ts_mode != M88DS3103_TS_SERIAL) { + if (reg16 == 92) + tmp = 93; + else if (reg16 == 100) + tmp = 99; + else + tmp = 96; + + mclk_khz *= tmp; + mclk_khz /= 96; + } + + pll_ldpc_mode = (reg15 >> 1) & 0x01; + + pll_div_fb = (reg15 & 0x01) << 8; + pll_div_fb += reg16; + pll_div_fb += 32; + + div = 9000 * pll_div_fb * 4; + div /= mclk_khz; + + if (dev->cfg->ts_mode == M88DS3103_TS_SERIAL) { + reg11 |= 0x02; + + if (div <= 32) { + N = 2; + + f0 = 0; + f1 = div / N; + f2 = div - f1; + f3 = 0; + } else if (div <= 34) { + N = 3; + + f0 = div / N; + f1 = (div - f0) / (N - 1); + f2 = div - f0 - f1; + f3 = 0; + } else if (div <= 64) { + N = 4; + + f0 = div / N; + f1 = (div - f0) / (N - 1); + f2 = (div - f0 - f1) / (N - 2); + f3 = div - f0 - f1 - f2; + } else { + N = 4; + + f0 = 16; + f1 = 16; + f2 = 16; + f3 = 16; + } + + if (f0 == 16) + f0 = 0; + else if ((f0 < 8) && (f0 != 0)) + f0 = 8; + + if (f1 == 16) + f1 = 0; + else if ((f1 < 8) && (f1 != 0)) + f1 = 8; + + if (f2 == 16) + f2 = 0; + else if ((f2 < 8) && (f2 != 0)) + f2 = 8; + + if (f3 == 16) + f3 = 0; + else if ((f3 < 8) && (f3 != 0)) + f3 = 8; + } else { + reg11 &= ~0x02; + + if (div <= 32) { + N = 2; + + f0 = 0; + f1 = div / N; + f2 = div - f1; + f3 = 0; + } else if (div <= 48) { + N = 3; + + f0 = div / N; + f1 = (div - f0) / (N - 1); + f2 = div - f0 - f1; + f3 = 0; + } else if (div <= 64) { + N = 4; + + f0 = div / N; + f1 = (div - f0) / (N - 1); + f2 = (div - f0 - f1) / (N - 2); + f3 = div - f0 - f1 - f2; + } else { + N = 4; + + f0 = 16; + f1 = 16; + f2 = 16; + f3 = 16; + } + + if (f0 == 16) + f0 = 0; + else if ((f0 < 9) && (f0 != 0)) + f0 = 9; + + if (f1 == 16) + f1 = 0; + else if ((f1 < 9) && (f1 != 0)) + f1 = 9; + + if (f2 == 16) + f2 = 0; + else if ((f2 < 9) && (f2 != 0)) + f2 = 9; + + if (f3 == 16) + f3 = 0; + else if ((f3 < 9) && (f3 != 0)) + f3 = 9; + } + + sm = N - 1; + + /* Write to registers */ + //reg15 &= 0x01; + //reg15 |= (pll_div_fb >> 8) & 0x01; + + //reg16 = pll_div_fb & 0xFF; + + reg1D &= ~0x03; + reg1D |= sm; + reg1D |= 0x80; + + reg1E = ((f3 << 4) + f2) & 0xFF; + reg1F = ((f1 << 4) + f0) & 0xFF; + + m88ds3103b_dt_write(dev, 0x05, 0x40); + m88ds3103b_dt_write(dev, 0x11, 0x08); + m88ds3103b_dt_write(dev, 0x1D, reg1D); + m88ds3103b_dt_write(dev, 0x1E, reg1E); + m88ds3103b_dt_write(dev, 0x1F, reg1F); + + m88ds3103b_dt_write(dev, 0x17, 0xc1); + m88ds3103b_dt_write(dev, 0x17, 0x81); + + usleep_range(5000, 5500); + + m88ds3103b_dt_write(dev, 0x05, 0x00); + m88ds3103b_dt_write(dev, 0x11, 0x0A); + + usleep_range(5000, 5500); + + return 0; +} + static int m88ds3103_set_frontend(struct dvb_frontend *fe) { struct m88ds3103_dev *dev = fe->demodulator_priv; @@ -298,7 +631,7 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) u8 u8tmp, u8tmp1 = 0, u8tmp2 = 0; /* silence compiler warning */ u8 buf[3]; u16 u16tmp; - u32 tuner_frequency_khz, target_mclk; + u32 tuner_frequency_khz, target_mclk, u32tmp; s32 s32tmp; static const struct reg_sequence reset_buf[] = { {0x07, 0x80}, {0x07, 0x00} @@ -321,6 +654,20 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) /* Disable demod clock path */ if (dev->chip_id == M88RS6000_CHIP_ID) { + if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) { + ret = regmap_read(dev->regmap, 0xb2, &u32tmp); + if (ret) + goto err; + if (u32tmp == 0x01) { + ret = regmap_write(dev->regmap, 0x00, 0x00); + if (ret) + goto err; + ret = regmap_write(dev->regmap, 0xb2, 0x00); + if (ret) + goto err; + } + } + ret = regmap_write(dev->regmap, 0x06, 0xe0); if (ret) goto err; @@ -346,7 +693,7 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) tuner_frequency_khz = c->frequency; } - /* select M88RS6000 demod main mclk and ts mclk from tuner die. */ + /* set M88RS6000/DS3103B demod main mclk and ts mclk from tuner die */ if (dev->chip_id == M88RS6000_CHIP_ID) { if (c->symbol_rate > 45010000) dev->mclk = 110250000; @@ -358,6 +705,11 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) else target_mclk = 144000000; + if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) { + m88ds3103b_select_mclk(dev); + m88ds3103b_set_mclk(dev, target_mclk / 1000); + } + /* Enable demod clock path */ ret = regmap_write(dev->regmap, 0x06, 0x00); if (ret) @@ -469,12 +821,42 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) ret = m88ds3103_update_bits(dev, 0x9d, 0x08, 0x08); if (ret) goto err; + + if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) { + buf[0] = m88ds3103b_dt_read(dev, 0x15); + buf[1] = m88ds3103b_dt_read(dev, 0x16); + + if (c->symbol_rate > 45010000) { + buf[0] &= ~0x03; + buf[0] |= 0x02; + buf[0] |= ((147 - 32) >> 8) & 0x01; + buf[1] = (147 - 32) & 0xFF; + + dev->mclk = 110250 * 1000; + } else { + buf[0] &= ~0x03; + buf[0] |= ((128 - 32) >> 8) & 0x01; + buf[1] = (128 - 32) & 0xFF; + + dev->mclk = 96000 * 1000; + } + m88ds3103b_dt_write(dev, 0x15, buf[0]); + m88ds3103b_dt_write(dev, 0x16, buf[1]); + + regmap_read(dev->regmap, 0x30, &u32tmp); + u32tmp &= ~0x80; + regmap_write(dev->regmap, 0x30, u32tmp & 0xff); + } + ret = regmap_write(dev->regmap, 0xf1, 0x01); if (ret) goto err; - ret = m88ds3103_update_bits(dev, 0x30, 0x80, 0x80); - if (ret) - goto err; + + if (dev->chiptype != M88DS3103_CHIPTYPE_3103B) { + ret = m88ds3103_update_bits(dev, 0x30, 0x80, 0x80); + if (ret) + goto err; + } } switch (dev->cfg->ts_mode) { @@ -488,6 +870,10 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) break; case M88DS3103_TS_PARALLEL: u8tmp = 0x02; + if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) { + u8tmp = 0x01; + u8tmp1 = 0x01; + } break; case M88DS3103_TS_CI: u8tmp = 0x03; @@ -516,6 +902,12 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) u8tmp1 = 0x3f; u8tmp2 = 0x3f; break; + case M88DS3103_TS_PARALLEL: + if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) { + ret = m88ds3103_update_bits(dev, 0x29, 0x01, u8tmp1); + if (ret) + goto err; + } default: u16tmp = DIV_ROUND_UP(target_mclk, dev->cfg->ts_clk); u8tmp1 = u16tmp / 2 - 1; @@ -543,6 +935,9 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) else u8tmp = 0x06; + if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) + m88ds3103b_set_mclk(dev, target_mclk / 1000); + ret = regmap_write(dev->regmap, 0xc3, 0x08); if (ret) goto err; @@ -578,6 +973,16 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) if (ret) goto err; + if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) { + /* enable/disable 192M LDPC clock */ + ret = m88ds3103_update_bits(dev, 0x29, 0x10, + (c->delivery_system == SYS_DVBS) ? 0x10 : 0x0); + if (ret) + goto err; + + ret = m88ds3103_update_bits(dev, 0xc9, 0x08, 0x08); + } + dev_dbg(&client->dev, "carrier offset=%d\n", (tuner_frequency_khz - c->frequency)); @@ -654,10 +1059,13 @@ static int m88ds3103_init(struct dvb_frontend *fe) dev_info(&client->dev, "found a '%s' in cold state\n", m88ds3103_ops.info.name); - if (dev->chip_id == M88RS6000_CHIP_ID) + if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) + name = M88DS3103B_FIRMWARE; + else if (dev->chip_id == M88RS6000_CHIP_ID) name = M88RS6000_FIRMWARE; else name = M88DS3103_FIRMWARE; + /* request the firmware, this will block and timeout */ ret = request_firmware(&firmware, name, &client->dev); if (ret) { @@ -704,6 +1112,12 @@ static int m88ds3103_init(struct dvb_frontend *fe) dev_info(&client->dev, "firmware version: %X.%X\n", (utmp >> 4) & 0xf, (utmp >> 0 & 0xf)); + if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) { + m88ds3103b_dt_write(dev, 0x21, 0x92); + m88ds3103b_dt_write(dev, 0x15, 0x6C); + m88ds3103b_dt_write(dev, 0x17, 0xC1); + m88ds3103b_dt_write(dev, 0x17, 0x81); + } warm: /* warm state */ dev->warm = true; @@ -1393,6 +1807,8 @@ static int m88ds3103_probe(struct i2c_client *client, goto err_kfree; dev->chip_id = utmp >> 1; + dev->chiptype = (u8)id->driver_data; + dev_dbg(&client->dev, "chip_id=%02x\n", dev->chip_id); switch (dev->chip_id) { @@ -1470,6 +1886,19 @@ static int m88ds3103_probe(struct i2c_client *client, /* setup callbacks */ pdata->get_dvb_frontend = m88ds3103_get_dvb_frontend; pdata->get_i2c_adapter = m88ds3103_get_i2c_adapter; + + if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) { + /* enable i2c repeater for tuner */ + m88ds3103_update_bits(dev, 0x11, 0x01, 0x01); + + /* get frontend address */ + ret = regmap_read(dev->regmap, 0x29, &utmp); + if (ret) + goto err_kfree; + dev->dt_addr = ((utmp & 0x80) == 0) ? 0x42 >> 1 : 0x40 >> 1; + dev_err(&client->dev, "dt addr is 0x%02x", dev->dt_addr); + } + return 0; err_kfree: kfree(dev); @@ -1491,7 +1920,9 @@ static int m88ds3103_remove(struct i2c_client *client) } static const struct i2c_device_id m88ds3103_id_table[] = { - {"m88ds3103", 0}, + {"m88ds3103", M88DS3103_CHIPTYPE_3103}, + {"m88rs6000", M88DS3103_CHIPTYPE_RS6000}, + {"m88ds3103b", M88DS3103_CHIPTYPE_3103B}, {} }; MODULE_DEVICE_TABLE(i2c, m88ds3103_id_table); @@ -1513,3 +1944,4 @@ MODULE_DESCRIPTION("Montage Technology M88DS3103 DVB-S/S2 demodulator driver"); MODULE_LICENSE("GPL"); MODULE_FIRMWARE(M88DS3103_FIRMWARE); MODULE_FIRMWARE(M88RS6000_FIRMWARE); +MODULE_FIRMWARE(M88DS3103B_FIRMWARE); diff --git a/drivers/media/dvb-frontends/m88ds3103_priv.h b/drivers/media/dvb-frontends/m88ds3103_priv.h index c825032..d656ec2 100644 --- a/drivers/media/dvb-frontends/m88ds3103_priv.h +++ b/drivers/media/dvb-frontends/m88ds3103_priv.h @@ -16,11 +16,17 @@ #include <linux/regmap.h> #include <linux/math64.h> -#define M88DS3103_FIRMWARE "dvb-demod-m88ds3103.fw" -#define M88RS6000_FIRMWARE "dvb-demod-m88rs6000.fw" +#define M88DS3103B_FIRMWARE "dvb-demod-m88ds3103b.fw" +#define M88DS3103_FIRMWARE "dvb-demod-m88ds3103.fw" +#define M88RS6000_FIRMWARE "dvb-demod-m88rs6000.fw" + #define M88RS6000_CHIP_ID 0x74 #define M88DS3103_CHIP_ID 0x70 +#define M88DS3103_CHIPTYPE_3103 0 +#define M88DS3103_CHIPTYPE_RS6000 1 +#define M88DS3103_CHIPTYPE_3103B 2 + struct m88ds3103_dev { struct i2c_client *client; struct regmap_config regmap_config; @@ -35,10 +41,13 @@ struct m88ds3103_dev { struct i2c_mux_core *muxc; /* auto detect chip id to do different config */ u8 chip_id; + /* chip type to differentiate m88rs6000 from m88ds3103b */ + u8 chiptype; /* main mclk is calculated for M88RS6000 dynamically */ s32 mclk; u64 post_bit_error; u64 post_bit_count; + u8 dt_addr; }; struct m88ds3103_reg_val { diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c index 1283c7c..6561f7b 100644 --- a/drivers/media/usb/em28xx/em28xx-cards.c +++ b/drivers/media/usb/em28xx/em28xx-cards.c @@ -2397,6 +2397,20 @@ const struct em28xx_board em28xx_boards[] = { .has_dvb = 1, .ir_codes = RC_MAP_PINNACLE_PCTV_HD, }, + /* + * 2013:0259 PCTV DVB-S2 Stick (461e_v2) + * Empia EM28178, Montage M88DS3103b, Montage M88TS2022, Allegro A8293 + */ + [EM28178_BOARD_PCTV_461E_V2] = { + .def_i2c_bus = 1, + .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | + EM28XX_I2C_FREQ_400_KHZ, + .name = "PCTV DVB-S2 Stick (461e v2)", + .tuner_type = TUNER_ABSENT, + .tuner_gpio = pctv_461e, + .has_dvb = 1, + .ir_codes = RC_MAP_PINNACLE_PCTV_HD, + }, /* * 2013:025f PCTV tripleStick (292e). * Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2157 @@ -2678,6 +2692,10 @@ struct usb_device_id em28xx_id_table[] = { .driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE }, { USB_DEVICE(0x2013, 0x0258), .driver_info = EM28178_BOARD_PCTV_461E }, + { USB_DEVICE(0x2013, 0x0461), + .driver_info = EM28178_BOARD_PCTV_461E_V2 }, + { USB_DEVICE(0x2013, 0x0259), + .driver_info = EM28178_BOARD_PCTV_461E_V2 }, { USB_DEVICE(0x2013, 0x025f), .driver_info = EM28178_BOARD_PCTV_292E }, { USB_DEVICE(0x2013, 0x0264), /* Hauppauge WinTV-soloHD 292e SE */ diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c b/drivers/media/usb/em28xx/em28xx-dvb.c index a73faf1..e2ddc25 100644 --- a/drivers/media/usb/em28xx/em28xx-dvb.c +++ b/drivers/media/usb/em28xx/em28xx-dvb.c @@ -1219,6 +1219,65 @@ static int em28178_dvb_init_pctv_461e(struct em28xx *dev) return 0; } +static int em28178_dvb_init_pctv_461e_v2(struct em28xx *dev) +{ + struct em28xx_dvb *dvb = dev->dvb; + struct i2c_adapter *i2c_adapter; + struct m88ds3103_platform_data m88ds3103_pdata = {}; + struct ts2020_config ts2020_config = {}; + struct a8293_platform_data a8293_pdata = {}; + + /* attach demod */ + m88ds3103_pdata.clk = 27000000; + m88ds3103_pdata.i2c_wr_max = 33; + m88ds3103_pdata.ts_mode = M88DS3103_TS_PARALLEL; + m88ds3103_pdata.ts_clk = 16000; + m88ds3103_pdata.ts_clk_pol = 1; + m88ds3103_pdata.agc = 0x99; + m88ds3103_pdata.agc_inv = 1; + m88ds3103_pdata.spec_inv = 1; + dvb->i2c_client_demod = dvb_module_probe("m88ds3103", "m88ds3103b", + &dev->i2c_adap[dev->def_i2c_bus], + 0x6a, &m88ds3103_pdata); + + if (!dvb->i2c_client_demod) { + pr_err("%s() FUCK\n", __func__); + return -ENODEV; + } + + dvb->fe[0] = m88ds3103_pdata.get_dvb_frontend(dvb->i2c_client_demod); + i2c_adapter = m88ds3103_pdata.get_i2c_adapter(dvb->i2c_client_demod); + + /* attach tuner */ + ts2020_config.fe = dvb->fe[0]; + dvb->i2c_client_tuner = dvb_module_probe("ts2020", "ts2022", + i2c_adapter, + 0x60, &ts2020_config); + if (!dvb->i2c_client_tuner) { + pr_err("%s() FUCK2\n", __func__); + dvb_module_release(dvb->i2c_client_demod); + return -ENODEV; + } + + /* delegate signal strength measurement to tuner */ + dvb->fe[0]->ops.read_signal_strength = + dvb->fe[0]->ops.tuner_ops.get_rf_strength; + + /* attach SEC */ + a8293_pdata.dvb_frontend = dvb->fe[0]; + dvb->i2c_client_sec = dvb_module_probe("a8293", NULL, + &dev->i2c_adap[dev->def_i2c_bus], + 0x08, &a8293_pdata); + if (!dvb->i2c_client_sec) { + pr_err("%s() FUCK3\n", __func__); + dvb_module_release(dvb->i2c_client_tuner); + dvb_module_release(dvb->i2c_client_demod); + return -ENODEV; + } + + return 0; +} + static int em28178_dvb_init_pctv_292e(struct em28xx *dev) { struct em28xx_dvb *dvb = dev->dvb; @@ -1860,6 +1919,11 @@ static int em28xx_dvb_init(struct em28xx *dev) if (result) goto out_free; break; + case EM28178_BOARD_PCTV_461E_V2: + result = em28178_dvb_init_pctv_461e_v2(dev); + if (result) + goto out_free; + break; case EM28178_BOARD_PCTV_292E: result = em28178_dvb_init_pctv_292e(dev); if (result) diff --git a/drivers/media/usb/em28xx/em28xx.h b/drivers/media/usb/em28xx/em28xx.h index a551072..1affdd1 100644 --- a/drivers/media/usb/em28xx/em28xx.h +++ b/drivers/media/usb/em28xx/em28xx.h @@ -149,6 +149,7 @@ #define EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595 100 #define EM2884_BOARD_TERRATEC_H6 101 #define EM2882_BOARD_ZOLID_HYBRID_TV_STICK 102 +#define EM28178_BOARD_PCTV_461E_V2 103 /* Limits minimum and default number of buffers */ #define EM28XX_MIN_BUF 4 -- 2.17.1 ================================================ FILE: projects/Amlogic-ce/packages/linux-driver-addons/dvb/media_tree/patches/amlogic-4.9/media_tree-02-add-t230c2.patch ================================================ From: Thomas Hollstegge <thomas.hollstegge@gmail.com> [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 ================================================ FILE: projects/Amlogic-ce/packages/linux-driver-addons/dvb/media_tree/patches/amlogic-4.9/media_tree-06-of-node.patch ================================================ --- a/drivers/media/v4l2-core/v4l2-fwnode.c 2019-04-02 00:31:42.224001000 +0200 +++ b/drivers/media/v4l2-core/v4l2-fwnode.c 2019-04-02 00:31:42.256001000 +0200 @@ -553,6 +553,20 @@ } EXPORT_SYMBOL_GPL(v4l2_fwnode_endpoint_alloc_parse); +bool of_node_name_eq(const struct device_node *np, const char *name) +{ + const char *node_name; + size_t len; + + if (!np) + return false; + + node_name = kbasename(np->full_name); + len = strchrnul(node_name, '@') - node_name; + + return (strlen(name) == len) && (strncmp(node_name, name, len) == 0); +} + int v4l2_fwnode_parse_link(struct fwnode_handle *__fwnode, struct v4l2_fwnode_link *link) { ================================================ FILE: projects/Amlogic-ce/packages/linux-driver-addons/dvb/media_tree/patches/amlogic-4.9/media_tree-08-fix-dvbsky-frontend-detach.patch ================================================ media: dvbsky: Avoid leaking dvb frontend Source: https://git.linuxtv.org/media_tree.git/commit/drivers/media/usb/dvb-usb-v2?id=fdfa59cd63b184e1e96d51ff170fcac739bc6f6f --- a/drivers/media/usb/dvb-usb-v2/dvbsky.c +++ b/drivers/media/usb/dvb-usb-v2/dvbsky.c @@ -834,11 +836,11 @@ static struct dvb_usb_device_properties mygica_t230c_v2_props = { .i2c_algo = &dvbsky_i2c_algo, .frontend_attach = dvbsky_mygica_t230c_v2_attach, + .frontend_detach = dvbsky_frontend_detach, .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 = { ================================================ FILE: projects/Amlogic-ce/packages/linux-driver-addons/dvb/media_tree/patches/amlogic-4.9/media_tree-09-revert-access_ok.patch ================================================ --- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c 2019-06-15 02:14:51.909460692 +0200 +++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c 2019-06-15 02:14:55.029460692 +0200 @@ -1,4 +1,3 @@ -// SPDX-License-Identifier: GPL-2.0-only /* * ioctl32.c: Conversion between 32bit and 64bit native ioctls. * Separated from fs stuff by Arnd Bergmann <arnd@arndb.de> @@ -159,7 +158,7 @@ compat_caddr_t p; u32 clipcount; - if (!access_ok(p32, sizeof(*p32)) || + if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || copy_in_user(&p64->w, &p32->w, sizeof(p32->w)) || assign_in_user(&p64->field, &p32->field) || assign_in_user(&p64->chromakey, &p32->chromakey) || @@ -284,7 +283,7 @@ static int bufsize_v4l2_format(struct v4l2_format32 __user *p32, u32 *size) { - if (!access_ok(p32, sizeof(*p32))) + if (!access_ok(VERIFY_READ, p32, sizeof(*p32))) return -EFAULT; return __bufsize_v4l2_format(p32, size); } @@ -336,7 +335,7 @@ struct v4l2_format32 __user *p32, void __user *aux_buf, u32 aux_space) { - if (!access_ok(p32, sizeof(*p32))) + if (!access_ok(VERIFY_READ, p32, sizeof(*p32))) return -EFAULT; return __get_v4l2_format32(p64, p32, aux_buf, aux_space); } @@ -344,7 +343,7 @@ static int bufsize_v4l2_create(struct v4l2_create_buffers32 __user *p32, u32 *size) { - if (!access_ok(p32, sizeof(*p32))) + if (!access_ok(VERIFY_READ, p32, sizeof(*p32))) return -EFAULT; return __bufsize_v4l2_format(&p32->format, size); } @@ -353,7 +352,7 @@ struct v4l2_create_buffers32 __user *p32, void __user *aux_buf, u32 aux_space) { - if (!access_ok(p32, sizeof(*p32)) || + if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || copy_in_user(p64, p32, offsetof(struct v4l2_create_buffers32, format))) return -EFAULT; @@ -405,7 +404,7 @@ static int put_v4l2_format32(struct v4l2_format __user *p64, struct v4l2_format32 __user *p32) { - if (!access_ok(p32, sizeof(*p32))) + if (!access_ok(VERIFY_WRITE, p32, sizeof(*p32))) return -EFAULT; return __put_v4l2_format32(p64, p32); } @@ -413,7 +412,7 @@ static int put_v4l2_create32(struct v4l2_create_buffers __user *p64, struct v4l2_create_buffers32 __user *p32) { - if (!access_ok(p32, sizeof(*p32)) || + if (!access_ok(VERIFY_WRITE, p32, sizeof(*p32)) || copy_in_user(p32, p64, offsetof(struct v4l2_create_buffers32, format)) || assign_in_user(&p32->capabilities, &p64->capabilities) || @@ -435,7 +434,7 @@ struct v4l2_standard32 __user *p32) { /* other fields are not set by the user, nor used by the driver */ - if (!access_ok(p32, sizeof(*p32)) || + if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || assign_in_user(&p64->index, &p32->index)) return -EFAULT; return 0; @@ -444,7 +443,7 @@ static int put_v4l2_standard32(struct v4l2_standard __user *p64, struct v4l2_standard32 __user *p32) { - if (!access_ok(p32, sizeof(*p32)) || + if (!access_ok(VERIFY_WRITE, p32, sizeof(*p32)) || assign_in_user(&p32->index, &p64->index) || assign_in_user(&p32->id, &p64->id) || copy_in_user(p32->name, p64->name, sizeof(p32->name)) || @@ -561,7 +560,7 @@ u32 type; u32 length; - if (!access_ok(p32, sizeof(*p32)) || + if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || get_user(type, &p32->type) || get_user(length, &p32->length)) return -EFAULT; @@ -594,7 +593,7 @@ compat_caddr_t p; int ret; - if (!access_ok(p32, sizeof(*p32)) || + if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || assign_in_user(&p64->index, &p32->index) || get_user(type, &p32->type) || put_user(type, &p64->type) || @@ -633,7 +632,7 @@ return -EFAULT; uplane32 = compat_ptr(p); - if (!access_ok(uplane32, + if (!access_ok(VERIFY_READ, uplane32, num_planes * sizeof(*uplane32))) return -EFAULT; @@ -692,7 +691,7 @@ compat_caddr_t p; int ret; - if (!access_ok(p32, sizeof(*p32)) || + if (!access_ok(VERIFY_WRITE, p32, sizeof(*p32)) || assign_in_user(&p32->index, &p64->index) || get_user(type, &p64->type) || put_user(type, &p32->type) || @@ -782,7 +781,7 @@ { compat_caddr_t tmp; - if (!access_ok(p32, sizeof(*p32)) || + if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || get_user(tmp, &p32->base) || put_user_force(compat_ptr(tmp), &p64->base) || assign_in_user(&p64->capability, &p32->capability) || @@ -797,7 +796,7 @@ { void *base; - if (!access_ok(p32, sizeof(*p32)) || + if (!access_ok(VERIFY_WRITE, p32, sizeof(*p32)) || get_user(base, &p64->base) || put_user(ptr_to_compat((void __user *)base), &p32->base) || assign_in_user(&p32->capability, &p64->capability) || @@ -894,7 +893,7 @@ { u32 count; - if (!access_ok(p32, sizeof(*p32)) || + if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || get_user(count, &p32->count)) return -EFAULT; if (count > V4L2_CID_MAX_CTRLS) @@ -914,7 +913,7 @@ u32 n; compat_caddr_t p; - if (!access_ok(p32, sizeof(*p32)) || + if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || assign_in_user(&p64->which, &p32->which) || get_user(count, &p32->count) || put_user(count, &p64->count) || @@ -930,7 +929,7 @@ if (get_user(p, &p32->controls)) return -EFAULT; ucontrols = compat_ptr(p); - if (!access_ok(ucontrols, count * sizeof(*ucontrols))) + if (!access_ok(VERIFY_READ, ucontrols, count * sizeof(*ucontrols))) return -EFAULT; if (aux_space < count * sizeof(*kcontrols)) return -EFAULT; @@ -980,7 +979,7 @@ * with __user causes smatch warnings, so instead declare it * without __user and cast it as a userspace pointer where needed. */ - if (!access_ok(p32, sizeof(*p32)) || + if (!access_ok(VERIFY_WRITE, p32, sizeof(*p32)) || assign_in_user(&p32->which, &p64->which) || get_user(count, &p64->count) || put_user(count, &p32->count) || @@ -995,7 +994,7 @@ if (get_user(p, &p32->controls)) return -EFAULT; ucontrols = compat_ptr(p); - if (!access_ok(ucontrols, count * sizeof(*ucontrols))) + if (!access_ok(VERIFY_WRITE, ucontrols, count * sizeof(*ucontrols))) return -EFAULT; for (n = 0; n < count; n++) { @@ -1044,7 +1043,7 @@ static int put_v4l2_event32(struct v4l2_event __user *p64, struct v4l2_event32 __user *p32) { - if (!access_ok(p32, sizeof(*p32)) || + if (!access_ok(VERIFY_WRITE, p32, sizeof(*p32)) || assign_in_user(&p32->type, &p64->type) || copy_in_user(&p32->u, &p64->u, sizeof(p64->u)) || assign_in_user(&p32->pending, &p64->pending) || @@ -1070,7 +1069,7 @@ { compat_uptr_t tmp; - if (!access_ok(p32, sizeof(*p32)) || + if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || assign_in_user(&p64->pad, &p32->pad) || assign_in_user(&p64->start_block, &p32->start_block) || assign_in_user_cast(&p64->blocks, &p32->blocks) || @@ -1086,7 +1085,7 @@ { void *edid; - if (!access_ok(p32, sizeof(*p32)) || + if (!access_ok(VERIFY_WRITE, p32, sizeof(*p32)) || assign_in_user(&p32->pad, &p64->pad) || assign_in_user(&p32->start_block, &p64->start_block) || assign_in_user(&p32->blocks, &p64->blocks) || ================================================ FILE: projects/Amlogic-ce/packages/linux-driver-addons/dvb/media_tree/patches/amlogic-4.9/media_tree_01-m2m-job-resume-pause.patch ================================================ diff -ur a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c --- a/drivers/media/v4l2-core/v4l2-mem2mem.c 2019-07-10 23:44:44.000000000 +0100 +++ b/drivers/media/v4l2-core/v4l2-mem2mem.c 2019-12-18 04:54:05.614904632 +0000 @@ -443,6 +443,42 @@ } EXPORT_SYMBOL(v4l2_m2m_job_finish); +void v4l2_m2m_job_pause(struct v4l2_m2m_dev *m2m_dev, + struct v4l2_m2m_ctx *m2m_ctx) +{ + unsigned long flags; + + spin_lock_irqsave(&m2m_dev->job_spinlock, flags); + if (!m2m_dev->curr_ctx || m2m_dev->curr_ctx != m2m_ctx) { + spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); + dprintk("Called by an instance not currently running\n"); + return; + } + + list_del(&m2m_dev->curr_ctx->queue); + m2m_dev->curr_ctx->job_flags &= ~(TRANS_QUEUED | TRANS_RUNNING); + m2m_dev->curr_ctx->job_flags |= TRANS_ABORT; + wake_up(&m2m_dev->curr_ctx->finished); + m2m_dev->curr_ctx = NULL; + + spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); +} +EXPORT_SYMBOL(v4l2_m2m_job_pause); + +void v4l2_m2m_job_resume(struct v4l2_m2m_dev *m2m_dev, + struct v4l2_m2m_ctx *m2m_ctx) +{ + unsigned long flags; + + spin_lock_irqsave(&m2m_dev->job_spinlock, flags); + m2m_ctx->job_flags &= ~TRANS_ABORT; + spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); + + v4l2_m2m_try_schedule(m2m_ctx); + v4l2_m2m_try_run(m2m_dev); +} +EXPORT_SYMBOL(v4l2_m2m_job_resume); + int v4l2_m2m_reqbufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_requestbuffers *reqbufs) { diff -ur a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h --- a/include/media/v4l2-mem2mem.h 2019-07-10 23:44:45.000000000 +0100 +++ b/include/media/v4l2-mem2mem.h 2019-12-18 04:54:31.579097310 +0000 @@ -573,6 +573,24 @@ return v4l2_m2m_buf_remove(&m2m_ctx->cap_q_ctx); } +/* + * v4l2_m2m_job_pause() - paused the schedule of data which from the job queue. + * + * @m2m_dev: opaque pointer to the internal data to handle M2M context + * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx + */ +void v4l2_m2m_job_pause(struct v4l2_m2m_dev *m2m_dev, + struct v4l2_m2m_ctx *m2m_ctx); + + /* + * v4l2_m2m_job_resume() - resumed the schedule of data which from the job que. + * + * @m2m_dev: opaque pointer to the internal data to handle M2M context + * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx + */ +void v4l2_m2m_job_resume(struct v4l2_m2m_dev *m2m_dev, + struct v4l2_m2m_ctx *m2m_ctx); + /** * v4l2_m2m_buf_remove_by_buf() - take off exact buffer from the list of ready * buffers ================================================ FILE: projects/Amlogic-ce/packages/linux-driver-addons/dvb/media_tree/patches/amlogic-5.4/media_tree_01-m2m-job-resume-pause.patch ================================================ diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c index 8986c31..4102b08 100644 --- a/drivers/media/v4l2-core/v4l2-mem2mem.c +++ b/drivers/media/v4l2-core/v4l2-mem2mem.c @@ -519,6 +519,42 @@ unlock: } EXPORT_SYMBOL(v4l2_m2m_buf_done_and_job_finish); +void v4l2_m2m_job_pause(struct v4l2_m2m_dev *m2m_dev, + struct v4l2_m2m_ctx *m2m_ctx) +{ + unsigned long flags; + + spin_lock_irqsave(&m2m_dev->job_spinlock, flags); + if (!m2m_dev->curr_ctx || m2m_dev->curr_ctx != m2m_ctx) { + spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); + dprintk("Called by an instance not currently running\n"); + return; + } + + list_del(&m2m_dev->curr_ctx->queue); + m2m_dev->curr_ctx->job_flags &= ~(TRANS_QUEUED | TRANS_RUNNING); + m2m_dev->curr_ctx->job_flags |= TRANS_ABORT; + wake_up(&m2m_dev->curr_ctx->finished); + m2m_dev->curr_ctx = NULL; + + spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); +} +EXPORT_SYMBOL(v4l2_m2m_job_pause); + +void v4l2_m2m_job_resume(struct v4l2_m2m_dev *m2m_dev, + struct v4l2_m2m_ctx *m2m_ctx) +{ + unsigned long flags; + + spin_lock_irqsave(&m2m_dev->job_spinlock, flags); + m2m_ctx->job_flags &= ~TRANS_ABORT; + spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); + + v4l2_m2m_try_schedule(m2m_ctx); + v4l2_m2m_try_run(m2m_dev); +} +EXPORT_SYMBOL(v4l2_m2m_job_resume); + int v4l2_m2m_reqbufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_requestbuffers *reqbufs) { diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h index 98753f0..797612f 100644 --- a/include/media/v4l2-mem2mem.h +++ b/include/media/v4l2-mem2mem.h @@ -738,6 +738,24 @@ v4l2_m2m_dst_buf_remove(struct v4l2_m2m_ctx *m2m_ctx) return v4l2_m2m_buf_remove(&m2m_ctx->cap_q_ctx); } +/* + * v4l2_m2m_job_pause() - paused the schedule of data which from the job queue. + * + * @m2m_dev: opaque pointer to the internal data to handle M2M context + * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx + */ +void v4l2_m2m_job_pause(struct v4l2_m2m_dev *m2m_dev, + struct v4l2_m2m_ctx *m2m_ctx); + + /* + * v4l2_m2m_job_resume() - resumed the schedule of data which from the job que. + * + * @m2m_dev: opaque pointer to the internal data to handle M2M context + * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx + */ +void v4l2_m2m_job_resume(struct v4l2_m2m_dev *m2m_dev, + struct v4l2_m2m_ctx *m2m_ctx); + /** * v4l2_m2m_buf_remove_by_buf() - take off exact buffer from the list of ready * buffers ================================================ FILE: projects/Amlogic-ce/packages/linux-driver-addons/dvb/media_tree/patches/media_tree-04-fix-blocking-demux.patch ================================================ From d8e559ad66feeffa31eb473a9c9bce51d0863079 Mon Sep 17 00:00:00 2001 From: alexelec <alexelecv5@gmail.com> Date: Mon, 11 Feb 2019 11:09:50 +0200 Subject: [PATCH] dvb-core: fix blocking demux --- drivers/media/dvb-core/dmxdev.c | 37 +++++++++++++++++++------ drivers/media/dvb-core/dvb_ringbuffer.c | 1 + drivers/media/dvb-core/dvb_ringbuffer.h | 1 + 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/drivers/media/dvb-core/dmxdev.c b/drivers/media/dvb-core/dmxdev.c index c0363f1b..da9ad1c8 100644 --- a/drivers/media/dvb-core/dmxdev.c +++ b/drivers/media/dvb-core/dmxdev.c @@ -82,7 +82,11 @@ static ssize_t dvb_dmxdev_buffer_read(struct dvb_ringbuffer *src, ret = wait_event_interruptible(src->queue, !dvb_ringbuffer_empty(src) || - (src->error != 0)); + (src->error != 0) || + (src->do_wait != 1)); + if (src->do_wait != 1) + ret = -EINTR; + if (ret < 0) break; @@ -955,6 +959,23 @@ dvb_demux_read(struct file *file, char __user *buf, size_t count, return ret; } + +static int dvb_demux_lock_filter(struct dmxdev_filter *dmxdevfilter) +{ + int ret; + + dmxdevfilter->buffer.do_wait = 0; + + if (waitqueue_active(&dmxdevfilter->buffer.queue)) + wake_up(&dmxdevfilter->buffer.queue); + + ret = mutex_lock_interruptible(&dmxdevfilter->mutex); + + dmxdevfilter->buffer.do_wait = 1; + + return ret; +} + static int dvb_demux_do_ioctl(struct file *file, unsigned int cmd, void *parg) { @@ -968,7 +989,7 @@ static int dvb_demux_do_ioctl(struct file *file, switch (cmd) { case DMX_START: - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { + if (dvb_demux_lock_filter(dmxdevfilter)) { mutex_unlock(&dmxdev->mutex); return -ERESTARTSYS; } @@ -980,7 +1001,7 @@ static int dvb_demux_do_ioctl(struct file *file, break; case DMX_STOP: - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { + if (dvb_demux_lock_filter(dmxdevfilter)) { mutex_unlock(&dmxdev->mutex); return -ERESTARTSYS; } @@ -989,7 +1010,7 @@ static int dvb_demux_do_ioctl(struct file *file, break; case DMX_SET_FILTER: - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { + if (dvb_demux_lock_filter(dmxdevfilter)) { mutex_unlock(&dmxdev->mutex); return -ERESTARTSYS; } @@ -998,7 +1019,7 @@ static int dvb_demux_do_ioctl(struct file *file, break; case DMX_SET_PES_FILTER: - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { + if (dvb_demux_lock_filter(dmxdevfilter)) { mutex_unlock(&dmxdev->mutex); return -ERESTARTSYS; } @@ -1007,7 +1028,7 @@ static int dvb_demux_do_ioctl(struct file *file, break; case DMX_SET_BUFFER_SIZE: - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { + if (dvb_demux_lock_filter(dmxdevfilter)) { mutex_unlock(&dmxdev->mutex); return -ERESTARTSYS; } @@ -1051,7 +1072,7 @@ static int dvb_demux_do_ioctl(struct file *file, break; case DMX_ADD_PID: - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { + if (dvb_demux_lock_filter(dmxdevfilter)) { ret = -ERESTARTSYS; break; } @@ -1060,7 +1081,7 @@ static int dvb_demux_do_ioctl(struct file *file, break; case DMX_REMOVE_PID: - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { + if (dvb_demux_lock_filter(dmxdevfilter)) { ret = -ERESTARTSYS; break; } diff --git a/drivers/media/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb-core/dvb_ringbuffer.c index a5712cd7..d5333f3a 100644 --- a/drivers/media/dvb-core/dvb_ringbuffer.c +++ b/drivers/media/dvb-core/dvb_ringbuffer.c @@ -45,6 +45,7 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len) rbuf->data=data; rbuf->size=len; rbuf->error=0; + rbuf->do_wait=1; init_waitqueue_head(&rbuf->queue); diff --git a/include/media/dvb_ringbuffer.h b/include/media/dvb_ringbuffer.h index 41f04dae..25a853b5 100644 --- a/include/media/dvb_ringbuffer.h +++ b/include/media/dvb_ringbuffer.h @@ -38,6 +38,7 @@ struct dvb_ringbuffer { int error; wait_queue_head_t queue; + int do_wait; spinlock_t lock; }; ================================================ FILE: projects/Amlogic-ce/packages/linux-driver-addons/dvb/media_tree/patches/media_tree-06-fix-si2168-cmd-timeout.patch ================================================ fix si2168 cmd timeout Some Si2168 demodulator commands may take 130-140 ms (DVB-T/T2 tuner MyGica T230C v2). Details: https://github.com/CoreELEC/CoreELEC/pull/208 --- a/drivers/media/dvb-frontends/si2168.c +++ b/drivers/media/dvb-frontends/si2168.c @@ -46,7 +46,7 @@ static int si2168_cmd_execute_unlocked(s if (cmd->rlen) { /* wait cmd execution terminate */ - #define TIMEOUT 70 + #define TIMEOUT 200 timeout = jiffies + msecs_to_jiffies(TIMEOUT); while (!time_after(jiffies, timeout)) { ret = i2c_master_recv(client, cmd->args, cmd->rlen); ================================================ FILE: projects/Amlogic-ce/packages/linux-driver-addons/dvb/media_tree/patches/media_tree-07-fix-si2157-init.patch ================================================ Fix compatibility with Si2141 tuner (e.g. MyGica T230C v2) which needs a next command for proper initialization. (Broken by media_tree-01-hauppauge.patch) --- a/drivers/media/tuners/si2157.c +++ b/drivers/media/tuners/si2157.c @@ -120,7 +120,7 @@ static int si2157_init(struct dvb_fronte } cmd.rlen = 1; ret = si2157_cmd_execute(client, &cmd); - if (ret) + if (ret && (dev->chiptype != SI2157_CHIPTYPE_SI2141 || ret != -EAGAIN)) goto err; /* Si2141 needs a second command before it answers the revision query */ ================================================ FILE: projects/Amlogic-ce/packages/linux-driver-addons/dvb/media_tree/patches/media_tree-10-revert-serialize-reset-messages-in-m88ds3103_set_frontend.patch ================================================ diff --git a/drivers/media/dvb-frontends/m88ds3103.c b/drivers/media/dvb-frontends/m88ds3103.c index 123f2a3..403f428 100644 --- a/drivers/media/dvb-frontends/m88ds3103.c +++ b/drivers/media/dvb-frontends/m88ds3103.c @@ -309,9 +309,6 @@ 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", @@ -324,7 +321,11 @@ 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; ================================================ FILE: projects/Amlogic-ce/packages/linux-driver-addons/dvb/media_tree_aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="media_tree_aml" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC" PKG_DEPENDS_TARGET="toolchain" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Source of Linux Kernel amlogic drivers to build with media_build." PKG_TOOLCHAIN="manual" case "$LINUX" in amlogic-3.14) PKG_VERSION="f9a4b158183866c589ee8c06ab740f41aa08fa66" PKG_SHA256="ff629f20b39749e6523571409c74c38a27ba0101b0ffe2a1ecea3e4dafea6dd2" PKG_URL="https://github.com/CoreELEC/media_tree_aml/archive/${PKG_VERSION}.tar.gz" ;; amlogic-4.9) PKG_VERSION="d3d8e036546c254471e3903d199a30f8977f9f9b" PKG_SHA256="7d9dd87b075a31b27417c4a7b07586859766d06adee9300f7aadfbd9ec6085cc" PKG_URL="https://github.com/CoreELEC/media_tree_aml/archive/${PKG_VERSION}.tar.gz" ;; esac unpack() { mkdir -p $PKG_BUILD/ tar -xf $SOURCES/$PKG_NAME/$PKG_NAME-$PKG_VERSION.tar.gz -C $PKG_BUILD/../ } ================================================ FILE: projects/Amlogic-ce/packages/linux-driver-addons/dvb/media_tree_cc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="media_tree_cc" PKG_LICENSE="GPL" PKG_SITE="https://bitbucket.org/CrazyCat/media_build/downloads/" PKG_DEPENDS_TARGET="toolchain" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Source of Linux Kernel media_tree subsystem to build with media_build." PKG_TOOLCHAIN="manual" case "$LINUX" in amlogic-4.9) PKG_VERSION="b78d5d591d2f1cd21a2a9f5ec157abbbf688bcb6" PKG_SHA256="cae8286b7f3ef59964c7cc20baf4d86f3103177f0a0559864e20cf77d718b1bc" PKG_URL="https://github.com/CoreELEC/media_tree_cc/archive/${PKG_VERSION}.tar.gz" ;; amlogic-5.4) PKG_VERSION="d12e1a94ddeab40f2b22555f2e1267be048acfa1" PKG_SHA256="d9c96939d716790cc5bdaa662fb58b12fede7ac9f8dc953c25bb6e235fad8297" PKG_URL="https://github.com/CoreELEC/media_tree_cc/archive/${PKG_VERSION}.tar.gz" ;; esac post_unpack() { # hack/workaround for borked upstream kernel/media_build # without removing atomisp there a lot additional includes that # slowdown build process after modpost from 3min to 6min # even if atomisp is disabled via kernel.conf rm -rf $PKG_BUILD/drivers/staging/media/atomisp sed -i 's|^.*drivers/staging/media/atomisp.*$||' \ $PKG_BUILD/drivers/staging/media/Kconfig } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8188EU/package.mk ================================================ # 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) PKG_NAME="RTL8188EU" PKG_VERSION="9a56f32c2a46be5b81f0eedf49ad44ea8f10bfae" PKG_SHA256="c8f225ff85cdc49e4a043773234e42de38aac0d2c9322829dac21c2ba72fed87" PKG_LICENSE="GPL" # realtek: PKG_SITE="http://www.realtek.com.tw/downloads/downloadsView.aspx?Langid=1&PFid=48&Level=5&Conn=4&ProdID=274&DownTypeID=3&GetDown=false&Downloads=true" PKG_SITE="https://github.com/lwfinger/rtl8188eu" PKG_URL="https://github.com/lwfinger/rtl8188eu/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Realtek RTL81xxEU Linux 3.x driver" PKG_IS_KERNEL_PKG="yes" pre_make_target() { unset LDFLAGS } make_target() { make V=1 \ ARCH=$TARGET_KERNEL_ARCH \ KSRC=$(kernel_path) \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ CONFIG_POWER_SAVING=n } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME cp *.ko $INSTALL/$(get_full_module_dir)/$PKG_NAME } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8189FS/package.mk ================================================ # 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) PKG_NAME="RTL8189FS" PKG_VERSION="75a566a830037c7d1309c5a9fe411562772a1cf2" PKG_SHA256="9ff7aa9ee8cd7a8f386531d3b009e7bcbce1ff71bb676c187c40e538755eb8b5" PKG_LICENSE="GPL" PKG_SITE="https://github.com/jwrdegoede/rtl8189ES_linux" PKG_URL="https://github.com/jwrdegoede/rtl8189ES_linux/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="Realtek RTL8189FS Linux driver" PKG_IS_KERNEL_PKG="yes" make_target() { kernel_make \ KSRC=$(kernel_path) \ CONFIG_POWER_SAVING=n } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} cp *.ko ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8189FS/patches/0001-Fix-build-for-Amlogic-kernel-version-5.15.78.patch ================================================ From cf038b41be0004f576fb606db1be90f8fe3bb08e Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Wed, 27 Dec 2023 21:13:16 +0100 Subject: [PATCH 1/2] Fix build for Amlogic kernel version >= 5.15.78 --- core/rtw_wlan_util.c | 1 + os_dep/linux/ioctl_cfg80211.c | 26 +++++++++++++------------- os_dep/osdep_service.c | 1 + 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/core/rtw_wlan_util.c b/core/rtw_wlan_util.c index 1312d71..558ea81 100644 --- a/core/rtw_wlan_util.c +++ b/core/rtw_wlan_util.c @@ -4810,6 +4810,7 @@ int rtw_parse_cipher_list(struct pno_nlo_info *nlo_info, char *list_str) return 0; } +MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); int rtw_dev_nlo_info_set(struct pno_nlo_info *nlo_info, pno_ssid_t *ssid, int num, int pno_time, int pno_repeat, int pno_freq_expo_max) { diff --git a/os_dep/linux/ioctl_cfg80211.c b/os_dep/linux/ioctl_cfg80211.c index 87ee7e9..3f13a30 100644 --- a/os_dep/linux/ioctl_cfg80211.c +++ b/os_dep/linux/ioctl_cfg80211.c @@ -420,7 +420,7 @@ u8 rtw_cfg80211_ch_switch_notify(_adapter *adapter, u8 ch, u8 bw, u8 offset, u8 goto exit; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6,3, 0)) cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, 0, 0); -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5,19, 2)) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, 0); #else cfg80211_ch_switch_notify(adapter->pnetdev, &chdef); @@ -1090,7 +1090,7 @@ check_bss: #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) roam_info.links[0].bssid = cur_network->network.MacAddress; #else roam_info.bssid = cur_network->network.MacAddress; @@ -1658,7 +1658,7 @@ exit: } static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) ,int link_id #endif , u8 key_index @@ -1805,7 +1805,7 @@ addkey_end: } static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) ,int link_id #endif , u8 keyid @@ -1973,7 +1973,7 @@ exit: } static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) int link_id, #endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) @@ -1996,10 +1996,10 @@ static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, } static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, - struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) + struct net_device *ndev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) int link_id, -#endif +#endif u8 key_index #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) || defined(COMPAT_KERNEL_RELEASE) , bool unicast, bool multicast @@ -2048,10 +2048,10 @@ static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30)) int cfg80211_rtw_set_default_mgmt_key(struct wiphy *wiphy, - struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) + struct net_device *ndev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) int link_id, -#endif +#endif u8 key_index) { #define SET_DEF_KEY_PARAM_FMT " key_index=%d" @@ -4991,7 +4991,7 @@ static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *nd return ret; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,19, 2)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev, unsigned int link_id) #else static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev) @@ -9941,7 +9941,7 @@ void rtw_wdev_unregister(struct wireless_dev *wdev) rtw_cfg80211_indicate_scan_done(adapter, _TRUE); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) || defined(COMPAT_KERNEL_RELEASE) - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,19, 2)) + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) if (wdev->connected) { #else if (wdev->current_bss) { diff --git a/os_dep/osdep_service.c b/os_dep/osdep_service.c index 04000c7..b9487af 100644 --- a/os_dep/osdep_service.c +++ b/os_dep/osdep_service.c @@ -2110,6 +2110,7 @@ inline bool ATOMIC_INC_UNLESS(ATOMIC_T *v, int u) * @param mode please refer to linux document * @return Linux specific error code */ +MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); static int openFile(struct file **fpp, const char *path, int flag, int mode) { struct file *fp; -- 2.34.1 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8189FS/patches/0002-Fix-build-for-Amlogic-kernel-version-5.15.119.patch ================================================ From 4db3829fab4202f0222977b751a11ab86aac7da3 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 2 Feb 2024 16:31:54 +0100 Subject: [PATCH 2/2] Fix build for Amlogic kernel version >= 5.15.119 --- os_dep/linux/ioctl_cfg80211.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/os_dep/linux/ioctl_cfg80211.c b/os_dep/linux/ioctl_cfg80211.c index 3f13a30..21784db 100644 --- a/os_dep/linux/ioctl_cfg80211.c +++ b/os_dep/linux/ioctl_cfg80211.c @@ -418,7 +418,7 @@ u8 rtw_cfg80211_ch_switch_notify(_adapter *adapter, u8 ch, u8 bw, u8 offset, u8 ret = rtw_chbw_to_cfg80211_chan_def(wiphy, &chdef, ch, bw, offset, ht); if (ret != _SUCCESS) goto exit; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6,3, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 119)) cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, 0, 0); #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, 0); -- 2.34.1 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8189FS/patches/linux-6.7-temp.patch ================================================ From 221a84d92ec04505fa1aee0a8531b7df0b8be6eb Mon Sep 17 00:00:00 2001 From: Jookia <contact@jookia.org> Date: Mon, 30 Oct 2023 16:46:06 +1100 Subject: [PATCH] Fix cfg80211_rtw_change_beacon on kernel 6.5 --- os_dep/linux/ioctl_cfg80211.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/os_dep/linux/ioctl_cfg80211.c b/os_dep/linux/ioctl_cfg80211.c index d63c89b0..4820315a 100644 --- a/os_dep/linux/ioctl_cfg80211.c +++ b/os_dep/linux/ioctl_cfg80211.c @@ -5148,9 +5148,16 @@ static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev, return ret; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 5, 0)) +static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_ap_update *params) +{ + struct cfg80211_beacon_data *info = ¶ms->beacon; +#else static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *ndev, struct cfg80211_beacon_data *info) { +#endif int ret = 0; _adapter *adapter = (_adapter *)rtw_netdev_priv(ndev); ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8192CU/package.mk ================================================ # 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) PKG_NAME="RTL8192CU" 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" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Realtek RTL81xxCU Linux 3.x driver" PKG_IS_KERNEL_PKG="yes" pre_make_target() { unset LDFLAGS } make_target() { make V=1 \ ARCH=$TARGET_KERNEL_ARCH \ KSRC=$(kernel_path) \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ CONFIG_POWER_SAVING=n } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME cp *.ko $INSTALL/$(get_full_module_dir)/$PKG_NAME } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8192CU/patches/RTL8192CU-0001-add_device_ID_330d.patch ================================================ diff -Naur RTL8192CU-v4.0.2_9000.20130911/hal/rtl8192c/usb/usb_halinit.c RTL8192CU-v4.0.2_9000.20130911.patch/hal/rtl8192c/usb/usb_halinit.c --- RTL8192CU-v4.0.2_9000.20130911/hal/rtl8192c/usb/usb_halinit.c 2013-09-11 05:56:55.000000000 +0200 +++ RTL8192CU-v4.0.2_9000.20130911.patch/hal/rtl8192c/usb/usb_halinit.c 2014-04-01 20:17:59.270739417 +0200 @@ -3509,6 +3509,8 @@ pHalData->CustomerID = RT_CID_DLINK; else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x330a)) pHalData->CustomerID = RT_CID_DLINK; + else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x330d)) + pHalData->CustomerID = RT_CID_DLINK; break; case EEPROM_CID_WHQL: /* ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8192CU/patches/RTL8192CU-0002-fix_310_proc2.patch ================================================ --- a/os_dep/linux/os_intfs.c 2013-09-11 05:56:55.000000000 +0200 +++ b/os_dep/linux/os_intfs.c 2013-11-12 00:30:41.158248277 +0100 @@ -277,6 +277,18 @@ #define RTW_PROC_NAME DRV_NAME +#ifndef create_proc_entry +/* dummy routines */ +void rtw_proc_remove_one(struct net_device *dev) +{ +} + +void rtw_proc_init_one(struct net_device *dev) +{ +} + +#else /* create_proc_entry not defined */ + void rtw_proc_init_one(struct net_device *dev) { struct proc_dir_entry *dir_dev = NULL; @@ -751,6 +763,7 @@ } } } +#endif /* create_proc_entry not defined */ #endif uint loadparam( _adapter *padapter, _nic_hdl pnetdev); ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8192CU/patches/RTL8192CU-0101-gcc-4.9.patch ================================================ diff -Naur RTL8192CU-v4.0.2_9000.20130911/os_dep/linux/pci_intf.c RTL8192CU-v4.0.2_9000.20130911.patch/os_dep/linux/pci_intf.c --- RTL8192CU-v4.0.2_9000.20130911/os_dep/linux/pci_intf.c 2013-09-11 05:56:55.000000000 +0200 +++ RTL8192CU-v4.0.2_9000.20130911.patch/os_dep/linux/pci_intf.c 2014-04-22 23:25:02.082908033 +0200 @@ -1963,7 +1963,6 @@ RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_entry\n")); DBG_871X("rtw driver version=%s\n", DRIVERVERSION); - DBG_871X("Build at: %s %s\n", __DATE__, __TIME__); pci_drvpriv.drv_registered = _TRUE; rtw_suspend_lock_init(); diff -Naur RTL8192CU-v4.0.2_9000.20130911/os_dep/linux/usb_intf.c RTL8192CU-v4.0.2_9000.20130911.patch/os_dep/linux/usb_intf.c --- RTL8192CU-v4.0.2_9000.20130911/os_dep/linux/usb_intf.c 2013-09-11 05:56:55.000000000 +0200 +++ RTL8192CU-v4.0.2_9000.20130911.patch/os_dep/linux/usb_intf.c 2014-04-22 23:25:21.337862827 +0200 @@ -1577,7 +1577,6 @@ RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_entry\n")); DBG_871X(DRV_NAME " driver version=%s\n", DRIVERVERSION); - DBG_871X("build time: %s %s\n", __DATE__, __TIME__); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) //console_suspend_enabled=0; ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8192CU/patches/RTL8192CU-0102-gcc-5.patch ================================================ diff -Naur RTL8192CU-v4.0.2_9000.20130911/include/ieee80211.h RTL8192CU-v4.0.2_9000.20130911.patch/include/ieee80211.h --- RTL8192CU-v4.0.2_9000.20130911/include/ieee80211.h 2013-09-11 05:56:55.000000000 +0200 +++ RTL8192CU-v4.0.2_9000.20130911.patch/include/ieee80211.h 2015-11-03 14:05:03.789280151 +0100 @@ -1194,18 +1194,18 @@ (((Addr[2]) & 0xff) == 0xff) && (((Addr[3]) & 0xff) == 0xff) && (((Addr[4]) & 0xff) == 0xff) && \ (((Addr[5]) & 0xff) == 0xff)) #else -extern __inline int is_multicast_mac_addr(const u8 *addr) +static __inline int is_multicast_mac_addr(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } -extern __inline int is_broadcast_mac_addr(const u8 *addr) +static __inline int is_broadcast_mac_addr(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); } -extern __inline int is_zero_mac_addr(const u8 *addr) +static __inline int is_zero_mac_addr(const u8 *addr) { return ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && \ (addr[3] == 0x00) && (addr[4] == 0x00) && (addr[5] == 0x00)); ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8192DU/package.mk ================================================ # 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) PKG_NAME="RTL8192DU" 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" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Realtek RTL8192DU Linux 3.x driver" PKG_IS_KERNEL_PKG="yes" pre_make_target() { unset LDFLAGS } make_target() { make V=1 \ ARCH=$TARGET_KERNEL_ARCH \ KSRC=$(kernel_path) \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ CONFIG_POWER_SAVING=n } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME cp *.ko $INSTALL/$(get_full_module_dir)/$PKG_NAME } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8192DU/patches/RTL8192DU-0001-remove_overlapping_pids.patch ================================================ diff -Naur RTL8192DU-085e206/os_dep/usb_intf.c RTL8192DU-085e206.patch/os_dep/usb_intf.c --- RTL8192DU-085e206/os_dep/usb_intf.c 2014-03-25 15:48:57.000000000 +0100 +++ RTL8192DU-085e206.patch/os_dep/usb_intf.c 2014-04-11 09:23:12.097223906 +0200 @@ -137,7 +137,7 @@ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8194)},/* 8192DU-VS */ \ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8111)},/* Realtek 5G dongle for WiFi Display */ \ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0193)},/* 8192DE-VAU */ \ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8171)},/* 8192DU-VC */ \ +/* {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8171)}, 8192DU-VC overlaps with in-kernel rtl8192se */ \ /*=== Customer ID ===*/ \ /****** 8192DU-VC ********/ \ {USB_DEVICE(0x2019, 0xAB2C)},/* PCI - Abocm */ \ ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8192DU/patches/RTL8192DU-0002-PR61.patch ================================================ From d295ee29d71a7969047fbe5042cec471408632c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Peron?= <1859302+clementperon@users.noreply.github.com> Date: Wed, 6 Jun 2018 17:40:54 +0200 Subject: [PATCH] Change __vfs_read_alt to __vfs_read For kernel from 4.1 to 4.10 there is no call_read_iter used in new_sync_read. Why create a new __vfs_read_alt whereas the __vfs_read is exported and seems to do exactly the same. Remove __vfs_read_alt code and it's dependencies and use the __vfs_read function instead --- os_dep/osdep_service.c | 32 +------------------------------- 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/os_dep/osdep_service.c b/os_dep/osdep_service.c index 286096a..9dd3d2b 100644 --- a/os_dep/osdep_service.c +++ b/os_dep/osdep_service.c @@ -40,36 +40,6 @@ atomic_t _malloc_cnt = ATOMIC_INIT(0); atomic_t _malloc_size = ATOMIC_INIT(0); #endif /* DBG_MEMORY_LEAK */ - -static ssize_t new_sync_read(struct file *filp, void __user *buf, __kernel_size_t len, loff_t *ppos) -{ - struct iovec iov; - struct kiocb kiocb; - struct iov_iter iter; - ssize_t ret; - - iov.iov_base = buf; - iov.iov_len = len; - init_sync_kiocb(&kiocb, filp); - kiocb.ki_pos = *ppos; - iov_iter_init(&iter, READ, &iov, 1, len); - - ret = call_read_iter(filp, &kiocb, &iter); - BUG_ON(ret == -EIOCBQUEUED); - *ppos = kiocb.ki_pos; - return ret; -} - -static ssize_t __vfs_read_alt(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - if (file->f_op->read) - return file->f_op->read(file, buf, count, pos); - else if (file->f_op->read_iter) - return new_sync_read(file, (void *)buf, (__kernel_size_t)count, pos); - else - return -EINVAL; -} /* * Translate the OS dependent @param error_code to OS independent RTW_STATUS_CODE * @return: one of RTW_STATUS_CODE @@ -1086,7 +1056,7 @@ static int readFile(struct file *fp,char *buf,int len) while(sum<len) { #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) - rlen = __vfs_read_alt(fp, buf+sum, len-sum, &fp->f_pos); + rlen = __vfs_read(fp, buf+sum, len-sum, &fp->f_pos); #else rlen = fp->f_op->read(fp, buf+sum, len-sum, &fp->f_pos); #endif ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8192DU/patches/RTL8192DU-0003-fix-vfs-read.patch ================================================ From 9e477ff7fb1626f188e0d3314799371a5cce8681 Mon Sep 17 00:00:00 2001 From: MilhouseVH <milhouseVH.github@nmacleod.com> Date: Wed, 13 Jun 2018 18:54:09 +0100 Subject: [PATCH] fix vfs_read with 4.14.y+ --- os_dep/osdep_service.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/os_dep/osdep_service.c b/os_dep/osdep_service.c index 9dd3d2b..bd1df96 100644 --- a/os_dep/osdep_service.c +++ b/os_dep/osdep_service.c @@ -1055,7 +1055,9 @@ static int readFile(struct file *fp,char *buf,int len) return -EPERM; while(sum<len) { -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)) + rlen = kernel_read(fp, buf+sum, len-sum, &fp->f_pos); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) rlen = __vfs_read(fp, buf+sum, len-sum, &fp->f_pos); #else rlen = fp->f_op->read(fp, buf+sum, len-sum, &fp->f_pos); -- 2.14.1 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8192DU/patches/RTL8192DU-0004-revert-fix-for-old-kernels.patch ================================================ From ad504e6bd4df0210904a10d57ddc48670bc41675 Mon Sep 17 00:00:00 2001 From: 5schatten <supervisedthinking@gmail.com> Date: Thu, 21 Mar 2019 22:26:31 +0100 Subject: [PATCH] Revert "rtl8192du: Fix builds for kernels older than 4.11.0" This reverts commit 01722435acb1d62c9453b86161d2d8b99d702648. --- os_dep/osdep_service.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/os_dep/osdep_service.c b/os_dep/osdep_service.c index 9efffc4..99a424f 100644 --- a/os_dep/osdep_service.c +++ b/os_dep/osdep_service.c @@ -34,14 +34,6 @@ #define RT_TAG '1178' -#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)) -static inline ssize_t call_read_iter(struct file *file, struct kiocb *kio, - struct iov_iter *iter) -{ - return file->f_op->read_iter(kio, iter); -} -#endif - #ifdef DBG_MEMORY_LEAK #include <asm/atomic.h> atomic_t _malloc_cnt = ATOMIC_INIT(0); ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8192DU/patches/aarch64/RTL8192DU-0101-PR63.patch ================================================ From fb85a57a5cd6241cc8c066c5efc5b43781b0e42d Mon Sep 17 00:00:00 2001 From: MilhouseVH <milhouseVH.github@nmacleod.com> Date: Wed, 13 Jun 2018 06:43:10 +0100 Subject: [PATCH] aarch64/4.4.y: implicit declaration of function 'csum_ipv6_magic' --- core/rtw_br_ext.c | 1 + 1 file changed, 1 insertion(+) diff --git a/core/rtw_br_ext.c b/core/rtw_br_ext.c index da9c5e5..19af0fe 100644 --- a/core/rtw_br_ext.c +++ b/core/rtw_br_ext.c @@ -51,6 +51,7 @@ #include <linux/icmpv6.h> #include <net/ndisc.h> #include <net/checksum.h> +#include <net/ip6_checksum.h> #endif #endif -- 2.14.1 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8192DU/patches/aarch64/RTL8192DU-0102-fix-multiple-definitions.patch ================================================ diff --git a/include/ieee80211.h b/include/ieee80211.h index 3c28a0b..2268fbd 100644 --- a/include/ieee80211.h +++ b/include/ieee80211.h @@ -969,18 +969,18 @@ enum ieee80211_state { #define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" #define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5] -extern __inline int is_multicast_mac_addr(const u8 *addr) +static __inline int is_multicast_mac_addr(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } -extern __inline int is_broadcast_mac_addr(const u8 *addr) +static __inline int is_broadcast_mac_addr(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); } -extern __inline int is_zero_mac_addr(const u8 *addr) +static __inline int is_zero_mac_addr(const u8 *addr) { return ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && \ (addr[3] == 0x00) && (addr[4] == 0x00) && (addr[5] == 0x00)); ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8192EU/package.mk ================================================ # 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) PKG_NAME="RTL8192EU" 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" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Realtek RTL8192EU Linux 3.x driver" PKG_IS_KERNEL_PKG="yes" pre_make_target() { unset LDFLAGS } make_target() { make V=1 \ ARCH=$TARGET_KERNEL_ARCH \ KSRC=$(kernel_path) \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ CONFIG_POWER_SAVING=n \ USER_EXTRA_CFLAGS="-Wno-error=date-time" } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME cp *.ko $INSTALL/$(get_full_module_dir)/$PKG_NAME } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8192EU/patches/RTL8192EU-0101-gcc-5.patch ================================================ diff -Naur a/include/ieee80211.h b/include/ieee80211.h --- a/include/ieee80211.h +++ b/include/ieee80211.h @@ -1314,18 +1314,18 @@ (((Addr[2]) & 0xff) == 0xff) && (((Addr[3]) & 0xff) == 0xff) && (((Addr[4]) & 0xff) == 0xff) && \ (((Addr[5]) & 0xff) == 0xff)) #else -extern __inline int is_multicast_mac_addr(const u8 *addr) +static __inline int is_multicast_mac_addr(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } -extern __inline int is_broadcast_mac_addr(const u8 *addr) +static __inline int is_broadcast_mac_addr(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); } -extern __inline int is_zero_mac_addr(const u8 *addr) +static __inline int is_zero_mac_addr(const u8 *addr) { return ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && \ (addr[3] == 0x00) && (addr[4] == 0x00) && (addr[5] == 0x00)); ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8821CU/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="RTL8821CU" PKG_VERSION="fdbb62727c1526778e408da928d8c3760cce0fa1" PKG_SHA256="268e9967b575b48bfa518d2502bd38a919764778b123cdec5f132ffff5749448" PKG_LICENSE="GPL" PKG_SITE="https://github.com/morrownr/8821cu-20210916" PKG_URL="https://github.com/morrownr/8821cu-20210916/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Realtek RTL8821CU Linux driver" PKG_IS_KERNEL_PKG="yes" pre_make_target() { unset LDFLAGS } make_target() { make V=1 \ ARCH=$TARGET_KERNEL_ARCH \ KSRC=$(kernel_path) \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ CONFIG_POWER_SAVING=n } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME cp *.ko $INSTALL/$(get_full_module_dir)/$PKG_NAME } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/RTL8821CU/patches/001-Enable-RTW-debug-to-get-message-if-RFE-type-is-not-defined.patch ================================================ From 13e84821ee3868facaa116e593ddd6d8d0e09069 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 16 Nov 2023 10:48:44 +0100 Subject: [PATCH] Enable RTW debug to get message if RFE type is not defined --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 9364b54..735c553 100644 --- a/Makefile +++ b/Makefile @@ -116,10 +116,10 @@ EXTRA_CFLAGS += -DCONFIG_RTW_ANDROID=$(CONFIG_RTW_ANDROID) endif ########################## Debug ########################### -CONFIG_RTW_DEBUG = y +CONFIG_RTW_DEBUG = n # default log level is _DRV_INFO_ = 4, # please refer to "How_to_set_driver_debug_log_level.doc" to set the available level. -CONFIG_RTW_LOG_LEVEL = 1 +CONFIG_RTW_LOG_LEVEL = 4 # enable /proc/net/rtlxxxx/ debug interfaces CONFIG_PROC_DEBUG = n -- 2.42.0 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/RTL8152-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) PKG_NAME="RTL8152-aml" PKG_VERSION="cee2df544a6013a8efe4ed1493f594ca50b8d3c8" PKG_SHA256="fadfebca469e2203e5aee1c727a7e3916f85a3a5f499c08fce0138bc67c1c92e" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/bb-qq/r8152" PKG_URL="https://github.com/bb-qq/r8152/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Realtek RTL8152/RTL8153/RTL8156 Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" make_target() { LDFLAGS="" make -C $(kernel_path) M=$PKG_BUILD \ ARCH=$TARGET_KERNEL_ARCH \ KSRC=$(kernel_path) \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ USER_EXTRA_CFLAGS="-fgnu89-inline" } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/RTL8188FTV-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="RTL8188FTV-aml" PKG_VERSION="4e25b5eae05b2db736273dc36c9ce1979e001888" PKG_SHA256="25e09d19ef8e6f4948a1db836fb29c55354732a58c124fb3212e10afb0251bc9" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/Stane1983/RTL8188FTV-aml" PKG_URL="https://github.com/Stane1983/RTL8188FTV-aml/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Realtek RTL8188FTV Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" post_unpack() { sed -i 's/-DCONFIG_CONCURRENT_MODE//g; s/^CONFIG_POWER_SAVING.*$/CONFIG_POWER_SAVING = n/g' $PKG_BUILD/*/Makefile sed -i 's/^#define CONFIG_DEBUG.*//g' $PKG_BUILD/*/include/autoconf.h sed -i 's/#define DEFAULT_RANDOM_MACADDR.*1/#define DEFAULT_RANDOM_MACADDR 0/g' $PKG_BUILD/*/core/rtw_ieee80211.c } pre_make_target() { unset LDFLAGS } make_target() { make -C $(kernel_path) M=$PKG_BUILD/rtl8188FU \ ARCH=$TARGET_KERNEL_ARCH \ KSRC=$(kernel_path) \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ USER_EXTRA_CFLAGS="-fgnu89-inline" } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/RTL8189ES-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="RTL8189ES-aml" PKG_VERSION="f971e4b" PKG_SHA256="a87d891e3a42d70429b39f01216775dee95b0dc9093f9576ca7417e74f21ee2b" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/khadas/android_hardware_wifi_realtek_drivers_8189es" PKG_URL="https://github.com/khadas/android_hardware_wifi_realtek_drivers_8189es/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Realtek RTL8189ES Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" post_unpack() { sed -i 's/-DCONFIG_CONCURRENT_MODE//g; s/^CONFIG_POWER_SAVING.*$/CONFIG_POWER_SAVING = n/g; s/^CONFIG_RTW_DEBUG.*/CONFIG_RTW_DEBUG = n/g' $PKG_BUILD/*/Makefile sed -i 's/^#define CONFIG_DEBUG.*//g' $PKG_BUILD/*/include/autoconf.h sed -i 's/#define DEFAULT_RANDOM_MACADDR.*1/#define DEFAULT_RANDOM_MACADDR 0/g' $PKG_BUILD/*/core/rtw_ieee80211.c } pre_make_target() { unset LDFLAGS } make_target() { make -C $(kernel_path) M=$PKG_BUILD/rtl8189ES \ ARCH=$TARGET_KERNEL_ARCH \ KSRC=$(kernel_path) \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ USER_EXTRA_CFLAGS="-fgnu89-inline" } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/RTL8189FS-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="RTL8189FS-aml" PKG_VERSION="11cdc07dd29ab4055ec76974e246708ae8457605" PKG_SHA256="ea777e31551fb54446d9591d19c4ada0ce0ba9a6655e0e55c60693dafc4a9801" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/khadas/android_hardware_wifi_realtek_drivers_8189ftv" PKG_URL="https://github.com/khadas/android_hardware_wifi_realtek_drivers_8189ftv/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Realtek RTL8189FS Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" post_unpack() { sed -i 's/-DCONFIG_CONCURRENT_MODE//g; s/^CONFIG_POWER_SAVING.*$/CONFIG_POWER_SAVING = n/g' $PKG_BUILD/*/Makefile sed -i 's/^#define CONFIG_DEBUG.*//g' $PKG_BUILD/*/include/autoconf.h sed -i 's/#define DEFAULT_RANDOM_MACADDR.*1/#define DEFAULT_RANDOM_MACADDR 0/g' $PKG_BUILD/*/core/rtw_ieee80211.c } pre_make_target() { unset LDFLAGS } make_target() { make -C $(kernel_path) M=$PKG_BUILD/rtl8189FS \ ARCH=$TARGET_KERNEL_ARCH \ KSRC=$(kernel_path) \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ USER_EXTRA_CFLAGS="-fgnu89-inline" } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/RTL8723BS-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="RTL8723BS-aml" PKG_VERSION="ee9d86a" PKG_SHA256="4d1c5fe0d05edbf5eab96dfe5ff99b7d56c098f4d4d317351fa25e75606de094" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/khadas/android_hardware_wifi_realtek_drivers_8723bs" PKG_URL="https://github.com/khadas/android_hardware_wifi_realtek_drivers_8723bs/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Realtek RTL8723BS Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" post_unpack() { sed -i 's/-DCONFIG_CONCURRENT_MODE//g; s/^CONFIG_POWER_SAVING.*$/CONFIG_POWER_SAVING = n/g; s/^CONFIG_RTW_DEBUG.*/CONFIG_RTW_DEBUG = n/g' $PKG_BUILD/*/Makefile sed -i 's/^#define CONFIG_DEBUG.*//g' $PKG_BUILD/*/include/autoconf.h sed -i 's/#define DEFAULT_RANDOM_MACADDR.*1/#define DEFAULT_RANDOM_MACADDR 0/g' $PKG_BUILD/*/core/rtw_ieee80211.c } pre_make_target() { unset LDFLAGS } make_target() { make -C $(kernel_path) M=$PKG_BUILD/rtl8723BS \ ARCH=$TARGET_KERNEL_ARCH \ KSRC=$(kernel_path) \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ USER_EXTRA_CFLAGS="-fgnu89-inline" } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/RTL8821CS-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="RTL8821CS-aml" PKG_VERSION="281217ab4707093738be5433deac33cb9ee0d310" PKG_SHA256="a84a4ea4af4f3189c61d8d2b598b14669915d445d6e07841c845278a907765b7" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/RTL8821CS-aml" PKG_URL="https://github.com/CoreELEC/RTL8821CS-aml/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Realtek RTL8821CS Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" post_unpack() { sed -i 's/-DCONFIG_CONCURRENT_MODE//g; s/^CONFIG_POWER_SAVING.*$/CONFIG_POWER_SAVING = n/g' $PKG_BUILD/Makefile sed -i 's/#define DEFAULT_RANDOM_MACADDR.*1/#define DEFAULT_RANDOM_MACADDR 0/g' $PKG_BUILD/core/rtw_ieee80211.c } pre_make_target() { unset LDFLAGS } make_target() { make -C $(kernel_path) M=$PKG_BUILD \ ARCH=$TARGET_KERNEL_ARCH \ KSRC=$(kernel_path) \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ USER_EXTRA_CFLAGS="-fgnu89-inline" } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/RTL8822BS-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="RTL8822BS-aml" PKG_VERSION="d2a5452a08084b3838083ba1eda3d1aeab82ee7c" PKG_SHA256="31fafb5eb875de657c3316df1d72496958edfa16438248ec8f3661605f999ce1" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/khadas/android_hardware_wifi_realtek_drivers_8822bs" PKG_URL="https://github.com/khadas/android_hardware_wifi_realtek_drivers_8822bs/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Realtek RTL8822BU Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" post_unpack() { sed -i 's/-DCONFIG_CONCURRENT_MODE//g; s/^CONFIG_POWER_SAVING.*$/CONFIG_POWER_SAVING = n/g; s/^CONFIG_RTW_DEBUG.*/CONFIG_RTW_DEBUG = n/g' $PKG_BUILD/*/Makefile sed -i 's/^#define CONFIG_DEBUG.*//g' $PKG_BUILD/*/include/autoconf.h sed -i 's/#define DEFAULT_RANDOM_MACADDR.*1/#define DEFAULT_RANDOM_MACADDR 0/g' $PKG_BUILD/*/core/rtw_ieee80211.c sed -i 's/rtw_drv_log_level/0/g' $PKG_BUILD/rtl8822BS/core/*.c } pre_make_target() { unset LDFLAGS } make_target() { make -C $(kernel_path) M=$PKG_BUILD/rtl8822BS \ ARCH=$TARGET_KERNEL_ARCH \ KSRC=$(kernel_path) \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ USER_EXTRA_CFLAGS="-fgnu89-inline" } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/RTL8822BU-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="RTL8822BU-aml" PKG_VERSION="cd2b6cbd9c8fbfebee8a1f28fab8e4434450456c" PKG_SHA256="63c7e297a0ab0202e0d4c1c25428a98841e18b7fca0c21cba5d43a941ff37b62" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/khadas/android_hardware_wifi_realtek_drivers_8822bu" PKG_URL="https://github.com/morrownr/88x2bu-20210702/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="Realtek RTL8822BU Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" post_unpack() { sed -i 's/-DCONFIG_CONCURRENT_MODE//g; s/^CONFIG_POWER_SAVING.*$/CONFIG_POWER_SAVING = n/g; s/^CONFIG_RTW_DEBUG.*/CONFIG_RTW_DEBUG = n/g' $PKG_BUILD/Makefile sed -i 's/^#define CONFIG_DEBUG.*//g' $PKG_BUILD/include/autoconf.h sed -i 's/#define DEFAULT_RANDOM_MACADDR.*1/#define DEFAULT_RANDOM_MACADDR 0/g' $PKG_BUILD/core/rtw_ieee80211.c sed -i 's/rtw_drv_log_level/0/g' $PKG_BUILD/core/*.c } pre_make_target() { unset LDFLAGS } make_target() { make \ ARCH=$TARGET_KERNEL_ARCH \ KSRC=$(kernel_path) \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ USER_EXTRA_CFLAGS="-fgnu89-inline" } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/RTL8822CS-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="RTL8822CS-aml" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/RTL8822CS-aml" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="Realtek RTL8822CS Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" case "${LINUX}" in amlogic-4.9) PKG_VERSION="4e31d08990bc2a84c937bf17d5be4b899ceb70ed" PKG_SHA256="6df2e60689830f454111e2cd2c2873c05c9ac8e0f39e8eb1934dbcac62263900" ;; amlogic-5.4) PKG_VERSION="4a06b4470a91c3f142b50fb7b8643fdcaa4cc2fc" PKG_SHA256="12fa600f9497d800a7b280435561ad4848e360cc6de491a48ae5a537cf554899" ;; esac PKG_URL="https://github.com/CoreELEC/RTL8822CS-aml/archive/${PKG_VERSION}.tar.gz" post_unpack() { sed -i 's/-DCONFIG_CONCURRENT_MODE//g; s/^CONFIG_POWER_SAVING.*$/CONFIG_POWER_SAVING = n/g; s/^CONFIG_RTW_DEBUG.*/CONFIG_RTW_DEBUG = n/g' ${PKG_BUILD}/rtl88x2CS/Makefile sed -i 's/^#define CONFIG_DEBUG.*//g' ${PKG_BUILD}/rtl88x2CS/include/autoconf.h sed -i 's/#define DEFAULT_RANDOM_MACADDR.*1/#define DEFAULT_RANDOM_MACADDR 0/g' ${PKG_BUILD}/rtl88x2CS/core/rtw_ieee80211.c sed -i 's/rtw_drv_log_level/0/g' ${PKG_BUILD}/rtl88x2CS/core/*.c } make_target() { kernel_make -C $(kernel_path) M=${PKG_BUILD}/rtl88x2CS \ KSRC=$(kernel_path) \ USER_EXTRA_CFLAGS="-fgnu89-inline" } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} find ${PKG_BUILD}/ -name \*.ko -not -path '*/\.*' -exec cp {} ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} \; } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/RTL8822CU-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) PKG_NAME="RTL8822CU-aml" PKG_VERSION="f1a4a3abb993245bf28bf1e2254f47f76972fd6d" PKG_SHA256="2ad96072107478964b9308c19fa0edefdbb70e4c088256432b6fe5b903ebcf35" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/khadas/android_vendor_wifi_driver_realtek_8822cu/" PKG_URL="https://github.com/khadas/android_vendor_wifi_driver_realtek_8822cu/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="Realtek RTL8822CU Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" post_unpack() { sed -i 's/-DCONFIG_CONCURRENT_MODE//g; s/^CONFIG_POWER_SAVING.*$/CONFIG_POWER_SAVING = n/g; s/^CONFIG_RTW_DEBUG.*/CONFIG_RTW_DEBUG = n/g' ${PKG_BUILD}/*/Makefile sed -i 's/^#define CONFIG_DEBUG.*//g' ${PKG_BUILD}/*/include/autoconf.h sed -i 's/#define DEFAULT_RANDOM_MACADDR.*1/#define DEFAULT_RANDOM_MACADDR 0/g' ${PKG_BUILD}/*/core/rtw_ieee80211.c sed -i 's/rtw_drv_log_level/0/g' ${PKG_BUILD}/*/core/*.c } pre_make_target() { unset LDFLAGS } make_target() { make -C $(kernel_path) M=${PKG_BUILD}/rtl88x2CU \ ARCH=${TARGET_KERNEL_ARCH} \ KSRC=$(kernel_path) \ CROSS_COMPILE=${TARGET_KERNEL_PREFIX} \ USER_EXTRA_CFLAGS="-fgnu89-inline" } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} find ${PKG_BUILD}/ -name \*.ko -not -path '*/\.*' -exec cp {} ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} \; } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/RTL8852BS-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="RTL8852BS-aml" PKG_VERSION="dd202f37cbffb0e93ba15746d373a87228334e5f" PKG_SHA256="0acc9c0eb4203e690b4254cd563526b7aabfc7d43ec85dc7f2f5ef54212e0b41" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/Stane1983/rtl8852bs-aml" PKG_URL="https://github.com/Stane1983/rtl8852bs-aml/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="Realtek RTL8852BS Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" post_unpack() { sed -i 's/#define DEFAULT_RANDOM_MACADDR.*/#define DEFAULT_RANDOM_MACADDR 0/g' ${PKG_BUILD}/core/rtw_ieee80211.c } make_target() { kernel_make -C ${PKG_BUILD} \ M=${PKG_BUILD} \ KSRC=$(kernel_path) \ CONFIG_POWER_SAVE=n \ CONFIG_RTW_DEBUG=n \ modules } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} find ${PKG_BUILD}/ -name \*.ko -not -path '*/\.*' -exec cp {} ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} \; } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/ap6xxx-aml/modprobe.d/dhd.conf ================================================ options dhd firmware_path=/usr/lib/firmware/brcm/ nvram_path=/usr/lib/firmware/brcm/ ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/ap6xxx-aml/modprobe.d/dhd_sdio.conf ================================================ options dhd_sdio firmware_path=/usr/lib/firmware/brcm/ nvram_path=/usr/lib/firmware/brcm/ ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/ap6xxx-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="ap6xxx-aml" PKG_VERSION="91a6e2bd2ff5e52377190fea04a0433bdbe4e948" PKG_SHA256="c1f96870858bd80adadb87a526286a2d82ed52da617b210af51db12def0d4725" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/ap6xxx-aml" PKG_URL="https://github.com/CoreELEC/ap6xxx-aml/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="ap6xxx: Linux drivers for AP6xxx WLAN chips used in some devices based on Amlogic SoCs" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" pre_make_target() { unset LDFLAGS } make_target() { echo echo "building ap6356s and others" make -C $PKG_BUILD/bcmdhd.1.363.59.144.x.cn \ PWD=$PKG_BUILD/bcmdhd.1.363.59.144.x.cn \ KDIR=$(kernel_path) \ ARCH=$TARGET_KERNEL_ARCH \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ CONFIG_BCMDHD_DISABLE_WOWLAN=y \ dhd if [[ "$DEVICE" = "Amlogic-n"* ]]; then echo echo "building ap6275s" make -C $PKG_BUILD/bcmdhd.100.10.545.x \ PWD=$PKG_BUILD/bcmdhd.100.10.545.x \ KDIR=$(kernel_path) \ ARCH=$TARGET_KERNEL_ARCH \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ CONFIG_BCMDHD_DISABLE_WOWLAN=y \ bcmdhd_sdio fi } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' \ -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; } post_install() { if [ "$PROJECT" = "Amlogic" ]; then rm $INSTALL/usr/lib/modprobe.d/dhd_sdio.conf rm $INSTALL/usr/lib/udev/rules.d/80-dhd_sdio.rules fi } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/ap6xxx-aml/udev.d/80-dhd_sdio.rules ================================================ ### Broadcom BCM43752 (AP6275S driver with dhd_sdio kernel module) ### by default kernel module dhd is loaded first and retries few ### times until dhd_sdio is loaded (after almost 2 minutes) ### to speed up load module manually ENV{MODALIAS}=="?*", ENV{SUBSYSTEM}=="sdio", ENV{SDIO_ID}=="02D0:4497", GOTO="load_module" ENV{MODALIAS}=="?*", ENV{SUBSYSTEM}=="sdio", ENV{SDIO_ID}=="02D0:4496", GOTO="load_module" ENV{MODALIAS}=="?*", ENV{SUBSYSTEM}=="sdio", ENV{SDIO_ID}=="02D0:4495", GOTO="load_module" ENV{MODALIAS}=="?*", ENV{SUBSYSTEM}=="sdio", ENV{SDIO_ID}=="02D0:A806", GOTO="load_module" ENV{MODALIAS}=="?*", ENV{SUBSYSTEM}=="sdio", ENV{SDIO_ID}=="02D0:A804", GOTO="load_module" ENV{MODALIAS}=="?*", ENV{SUBSYSTEM}=="sdio", ENV{SDIO_ID}=="02D0:AAE8", GOTO="load_module" ENV{MODALIAS}=="?*", ENV{SUBSYSTEM}=="sdio", ENV{SDIO_ID}=="02D0:AAE7", GOTO="load_module" ENV{MODALIAS}=="?*", ENV{SUBSYSTEM}=="sdio", ENV{SDIO_ID}=="02D0:4362", GOTO="load_module" GOTO="end" LABEL="load_module" ENV{MODALIAS}=="?*", ENV{SUBSYSTEM}=="sdio", RUN{builtin}+="kmod load dhd_sdio" LABEL="end" ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/media_modules-aml/modules-load.d/media_modules.conf ================================================ amvdec_avs2 amvdec_avs amvdec_mavs amvdec_h264 amvdec_h264mvc amvdec_h265 amvdec_mh264 amvdec_mjpeg amvdec_mmjpeg amvdec_mmpeg12 amvdec_mmpeg4 amvdec_mpeg12 amvdec_mpeg4 amvdec_ports amvdec_real amvdec_vc1 amvdec_av1 amvdec_vp9 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/media_modules-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="media_modules-aml" PKG_VERSION="38132376658941c3c4b1e097628849eb256a7a08" PKG_SHA256="f7e577e78d54c34d57a75dfd584a6b867a20b817dce24ddf273eb409629a4a70" PKG_LICENSE="GPL" PKG_SITE="https://coreelec.org" PKG_URL="https://github.com/CoreELEC/media_modules-aml/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="$PKG_NAME: Linux driver" PKG_TOOLCHAIN="manual" pre_make_target() { unset LDFLAGS } make_target() { kernel_make -C $(kernel_path) M=$PKG_BUILD/drivers \ CONFIG_AMLOGIC_MEDIA_VDEC_MPEG12=m \ CONFIG_AMLOGIC_MEDIA_VDEC_MPEG2_MULTI=m \ CONFIG_AMLOGIC_MEDIA_VDEC_MPEG4=m \ CONFIG_AMLOGIC_MEDIA_VDEC_MPEG4_MULTI=m \ CONFIG_AMLOGIC_MEDIA_VDEC_VC1=m \ CONFIG_AMLOGIC_MEDIA_VDEC_H264=m \ CONFIG_AMLOGIC_MEDIA_VDEC_H264_MULTI=m \ CONFIG_AMLOGIC_MEDIA_VDEC_H264_MVC=m \ CONFIG_AMLOGIC_MEDIA_VDEC_H265=m \ CONFIG_AMLOGIC_MEDIA_VDEC_VP9=m \ CONFIG_AMLOGIC_MEDIA_VDEC_MJPEG=m \ CONFIG_AMLOGIC_MEDIA_VDEC_MJPEG_MULTI=m \ CONFIG_AMLOGIC_MEDIA_VDEC_REAL=m \ CONFIG_AMLOGIC_MEDIA_VDEC_AVS=m \ CONFIG_AMLOGIC_MEDIA_VDEC_AVS_MULTI=m \ CONFIG_AMLOGIC_MEDIA_VDEC_AVS2=m \ CONFIG_AMLOGIC_MEDIA_VDEC_AV1=m \ CONFIG_AMLOGIC_MEDIA_VENC_H264=m \ CONFIG_AMLOGIC_MEDIA_VENC_JPEG=m \ CONFIG_AMLOGIC_MEDIA_VENC_H265=m } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; mkdir -p ${INSTALL}/$(get_full_firmware_dir)/video cp -PR ${PKG_BUILD}/firmware/. ${INSTALL}/$(get_full_firmware_dir)/video } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/media_modules-aml/patches/002-fix-building.patch ================================================ diff --git a/drivers/amvdec_ports/aml_vcodec_vfm.c b/drivers/amvdec_ports/aml_vcodec_vfm.c index 62896ea0..a3e7be7c 100644 --- a/drivers/amvdec_ports/aml_vcodec_vfm.c +++ b/drivers/amvdec_ports/aml_vcodec_vfm.c @@ -60,8 +60,6 @@ static void vdec_vf_put(struct vframe_s *vf, void *op_arg) return; } - atomic_set(&vf->use_cnt, 1); - vfq_push(&vfm->vf_que_recycle, vf); /* schedule capture work. */ @@ -105,7 +103,7 @@ void video_vf_put(char *receiver, struct vdec_v4l2_buffer *fb, int id) fb->m.mem[1].addr, fb->m.mem[1].size, fb->m.mem[2].addr, fb->m.mem[2].size); - if (vfp && vf && atomic_dec_and_test(&vf->use_cnt)) + if (vfp && vf) vf_put(vf, receiver); } diff --git a/drivers/amvdec_ports/decoder/vdec_av1_if.c b/drivers/amvdec_ports/decoder/vdec_av1_if.c index e8693d40..0e5e791d 100644 --- a/drivers/amvdec_ports/decoder/vdec_av1_if.c +++ b/drivers/amvdec_ports/decoder/vdec_av1_if.c @@ -553,8 +553,6 @@ static void vdec_av1_get_vf(struct vdec_av1_inst *inst, struct vdec_v4l2_buffer return; } - atomic_set(&vf->use_cnt, 1); - fb = (struct vdec_v4l2_buffer *)vf->v4l_mem_handle; fb->vf_handle = (unsigned long)vf; fb->status = FB_ST_DISPLAY; diff --git a/drivers/amvdec_ports/decoder/vdec_h264_if.c b/drivers/amvdec_ports/decoder/vdec_h264_if.c index d7c4f437..2fedc273 100644 --- a/drivers/amvdec_ports/decoder/vdec_h264_if.c +++ b/drivers/amvdec_ports/decoder/vdec_h264_if.c @@ -737,8 +737,6 @@ static void vdec_h264_get_vf(struct vdec_h264_inst *inst, struct vdec_v4l2_buffe return; } - atomic_set(&vf->use_cnt, 1); - fb = (struct vdec_v4l2_buffer *)vf->v4l_mem_handle; if (fb) { fb->vf_handle = (unsigned long)vf; diff --git a/drivers/amvdec_ports/decoder/vdec_hevc_if.c b/drivers/amvdec_ports/decoder/vdec_hevc_if.c index 569806d3..fb4a5482 100644 --- a/drivers/amvdec_ports/decoder/vdec_hevc_if.c +++ b/drivers/amvdec_ports/decoder/vdec_hevc_if.c @@ -575,8 +575,6 @@ static void vdec_hevc_get_vf(struct vdec_hevc_inst *inst, struct vdec_v4l2_buffe return; } - atomic_set(&vf->use_cnt, 1); - fb = (struct vdec_v4l2_buffer *)vf->v4l_mem_handle; fb->vf_handle = (unsigned long)vf; fb->status = FB_ST_DISPLAY; diff --git a/drivers/amvdec_ports/decoder/vdec_mjpeg_if.c b/drivers/amvdec_ports/decoder/vdec_mjpeg_if.c index f9816cc3..c031aab8 100644 --- a/drivers/amvdec_ports/decoder/vdec_mjpeg_if.c +++ b/drivers/amvdec_ports/decoder/vdec_mjpeg_if.c @@ -470,8 +470,6 @@ static void vdec_mjpeg_get_vf(struct vdec_mjpeg_inst *inst, struct vdec_v4l2_buf return; } - atomic_set(&vf->use_cnt, 1); - fb = (struct vdec_v4l2_buffer *)vf->v4l_mem_handle; fb->vf_handle = (unsigned long)vf; fb->status = FB_ST_DISPLAY; diff --git a/drivers/amvdec_ports/decoder/vdec_mpeg12_if.c b/drivers/amvdec_ports/decoder/vdec_mpeg12_if.c index fa272841..528fb78e 100644 --- a/drivers/amvdec_ports/decoder/vdec_mpeg12_if.c +++ b/drivers/amvdec_ports/decoder/vdec_mpeg12_if.c @@ -457,8 +457,6 @@ static void vdec_mpeg12_get_vf(struct vdec_mpeg12_inst *inst, struct vdec_v4l2_b return; } - atomic_set(&vf->use_cnt, 1); - fb = (struct vdec_v4l2_buffer *)vf->v4l_mem_handle; fb->vf_handle = (unsigned long)vf; fb->status = FB_ST_DISPLAY; diff --git a/drivers/amvdec_ports/decoder/vdec_mpeg4_if.c b/drivers/amvdec_ports/decoder/vdec_mpeg4_if.c index e067e156..fb5ada67 100644 --- a/drivers/amvdec_ports/decoder/vdec_mpeg4_if.c +++ b/drivers/amvdec_ports/decoder/vdec_mpeg4_if.c @@ -467,8 +467,6 @@ static void vdec_mpeg4_get_vf(struct vdec_mpeg4_inst *inst, struct vdec_v4l2_buf return; } - atomic_set(&vf->use_cnt, 1); - fb = (struct vdec_v4l2_buffer *)vf->v4l_mem_handle; fb->vf_handle = (unsigned long)vf; fb->status = FB_ST_DISPLAY; diff --git a/drivers/amvdec_ports/decoder/vdec_vp9_if.c b/drivers/amvdec_ports/decoder/vdec_vp9_if.c index 6704350b..d865c25b 100644 --- a/drivers/amvdec_ports/decoder/vdec_vp9_if.c +++ b/drivers/amvdec_ports/decoder/vdec_vp9_if.c @@ -604,8 +604,6 @@ static void vdec_vp9_get_vf(struct vdec_vp9_inst *inst, struct vdec_v4l2_buffer return; } - atomic_set(&vf->use_cnt, 1); - fb = (struct vdec_v4l2_buffer *)vf->v4l_mem_handle; fb->vf_handle = (unsigned long)vf; fb->status = FB_ST_DISPLAY; diff --git a/drivers/fake_video_out/fake_video.c b/drivers/fake_video_out/fake_video.c index e0e9b164..3e3fe8d8 100644 --- a/drivers/fake_video_out/fake_video.c +++ b/drivers/fake_video_out/fake_video.c @@ -72,20 +72,12 @@ static struct vframe_s *video_vf_get(void) vf = vf_get(RECEIVER_NAME); - if (vf) { - atomic_set(&vf->use_cnt, 1); - /*pr_err("Get vframe w: %d, h: %d, fence: %lx, idx: %d\n", - vf->width, vf->height, (ulong)vf->fence, vf->index & 0xff);*/ - } - return vf; } static void video_vf_put(struct vframe_s *vf) { - struct vframe_provider_s *vfp = vf_get_provider(RECEIVER_NAME); - - if (vfp && vf && atomic_dec_and_test(&vf->use_cnt)) { + if (vf) { vf_put(vf, RECEIVER_NAME); } } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/media_modules-aml/patches/003-multi-decoders-limit-maximum-number-of-decoder.patch ================================================ From b99d31bfbc2cc973355ab5541908f0ee820b24fa Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Fri, 27 Dec 2019 20:11:58 +0100 Subject: [PATCH] multi decoders: limit maximum number of decoder in parallel to 1 Kodi can only handle one decoder (12/2019). Because of threading issues in Kodi it is needed to limit the multi decoder instances to a maximum of 1. If Kodi do implement multiple decoder support in parallel this decoder limit needs to be reverted. --- drivers/frame_provider/decoder/utils/vdec.h | 2 +- drivers/frame_provider/decoder/utils/vdec_profile.c | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/frame_provider/decoder/utils/vdec.h b/drivers/frame_provider/decoder/utils/vdec.h index 18d7cd1..56f044a 100644 --- a/drivers/frame_provider/decoder/utils/vdec.h +++ b/drivers/frame_provider/decoder/utils/vdec.h @@ -45,7 +45,7 @@ struct device *get_vdec_device(void); int vdec_module_init(void); void vdec_module_exit(void); -#define MAX_INSTANCE_MUN 9 +#define MAX_INSTANCE_MUN 2 #define VDEC_DEBUG_SUPPORT diff --git a/drivers/frame_provider/decoder/utils/vdec_profile.c b/drivers/frame_provider/decoder/utils/vdec_profile.c index d00987a..55e5213 100644 --- a/drivers/frame_provider/decoder/utils/vdec_profile.c +++ b/drivers/frame_provider/decoder/utils/vdec_profile.c @@ -42,8 +42,6 @@ static uint dec_time_stat_reset; struct dentry *root, *event; -#define MAX_INSTANCE_MUN 9 - struct vdec_profile_time_stat_s { int time_6ms_less_cnt; int time_6_9ms_cnt; -- 2.17.1 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/mt7668-wifi-bt/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2024-present Team CoreELEC (https://coreelec.org) PKG_NAME="mt7668-wifi-bt" PKG_VERSION="ca5d377f3ec0ae495a13f9b022b02b5281469c50" PKG_SHA256="894cf83dd31caad3c90d68062dd8ac9eb4be17f17e40957e3e026ed822498061" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/noob404yt/mt7668-wifi-bt" PKG_URL="https://github.com/shantigilbert/mt7668-wifi-bt/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="mt7668-bt Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" make_target() { cd ${PKG_BUILD}/MT7668-Bluetooth kernel_make EXTRA_CFLAGS="-w" \ KERNEL_SRC=$(kernel_path) cd ${PKG_BUILD}/MT7668-WiFi kernel_make EXTRA_CFLAGS="-w" \ KERNELDIR=$(kernel_path) } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} find ${PKG_BUILD}/ -name \*.ko -not -path '*/\.*' -exec cp {} ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} \; mkdir -p ${INSTALL}/$(get_full_firmware_dir) cp ${PKG_BUILD}/MT7668-WiFi/7668_firmware/* ${INSTALL}/$(get_full_firmware_dir) } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/opentee_linuxdriver/filesystem/aarch64/usr/lib/libteec.so.1 ================================================ libteec.so.1.0 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/opentee_linuxdriver/filesystem/arm/usr/lib/libteec.so.1 ================================================ libteec.so.1.0 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/opentee_linuxdriver/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="opentee_linuxdriver" PKG_VERSION="0.1" PKG_SHA256="" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC" PKG_DEPENDS_TARGET="toolchain linux" PKG_LONGDESC="OP-TEE SECPU FW Loader" PKG_TOOLCHAIN="manual" make_target() { : } makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/ta ln -sf /var/lib/optee_armtz ${INSTALL}/usr/lib/optee_armtz for soc in ${TEE_SOC}; do DIRSOC="$(get_pkg_directory ${PKG_NAME})/filesystem/${ARCH}/ta/v3.8/dev/${soc}" [ -d ${DIRSOC} ] && cp -rP ${DIRSOC} ${INSTALL}/usr/lib/ta done mkdir -p ${INSTALL}/usr/lib/coreelec install -m 0755 ${PKG_DIR}/scripts/tee-loader.sh ${INSTALL}/usr/lib/coreelec/tee-loader install -m 0755 ${PKG_DIR}/scripts/dovi-loader.sh ${INSTALL}/usr/lib/coreelec/dovi-loader cp -rP $(get_pkg_directory ${PKG_NAME})/filesystem/${ARCH}/usr ${INSTALL} } post_install() { enable_service opentee_linuxdriver.service # create mount points for Android partitions # must be /vendor because .ta file is used by absolute path mkdir -p ${INSTALL}/android/odm mkdir -p ${INSTALL}/android/oem mkdir -p ${INSTALL}/android/system mkdir -p ${INSTALL}/android/vendor ln -sf /android/system/system ${INSTALL}/system ln -sf /android/vendor ${INSTALL}/vendor } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/opentee_linuxdriver/scripts/dovi-loader.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) # get coreelec release information source /etc/os-release message() { >&2 echo "${@}" } # Return 1 if given kernel version is lower than current dovi.ko module version check_dovi_version() { version_higher=$(modinfo $1 | awk '/vermagic:/ {split($2, ver, "-"); print ver[1]}' | awk -F '.' \ -v ker_ver=$2 -v maj_ver=$3 -v min_ver=$4 '{ if ($1 > ker_ver) { print "Y"; } else if ($1 < ker_ver) { print "N"; } else { if ($2 > maj_ver) { print "Y"; } else if ($2 < maj_ver) { print "N"; } else { if ($3 >= min_ver) { print "Y"; } else { print "N"; } } } }') if [ "$version_higher" = "Y" ]; then return 0 else return 1 fi } insmod_dovi() { [ ! -f ${DOVI_KO_ANDROID} ] && return 1 modinfo ${DOVI_KO_ANDROID} if check_dovi_version ${DOVI_KO_ANDROID} 5 15 137; then message "loading dovi module from android partition" insmod ${DOVI_KO_ANDROID} else cat > /tmp/dovi.message << 'EOF' [TITLE]CoreELEC Dolby Vision Media Playback[/TITLE] [B][COLOR red]Android Dolby Vision kernel module is not compatible[/COLOR][/B] [COLOR red]No Dolby Vision media playback possible![/COLOR] Please upgrade Android firmware of your device to minimum Linux kernel version '5.15.137'. Dolby Vision media will be displayed in HDR instead Dolby Vision until the firmware fulfill the minimum requirements. EOF fi return 0 } load_dovi() { # local dovi.ko for DOVI_KO_STORAGE in /storage/.config/dovi.ko \ /flash/dovi.ko \ /storage/dovi.ko \ ; do if [ -f ${DOVI_KO_STORAGE} ]; then message "loading dovi module from ce partition" modinfo ${DOVI_KO_STORAGE} insmod ${DOVI_KO_STORAGE} && return fi done # Android 12 if [ -b /dev/oem ]; then mountpoint -q /android/oem || mount -o ro /dev/oem /android/oem DOVI_KO_ANDROID="/android/oem/overlay/dovi.ko" insmod_dovi && return fi # Android 11 # if mounted from tee-loader don't mount/unmount from dovi-loader if ! ls /dev/mapper/dynpart-* &>/dev/null && [ -b /dev/super ]; then dmsetup create --concise "$(parse-android-dynparts /dev/super)" systemctl set-environment dmsetup_remove=yes fi local active_slot=$(fw_printenv active_slot 2>/dev/null | awk -F '=' '/active_slot=/ {print $2}') if [ -b /dev/mapper/dynpart-system_a ]; then active_slot="_a" elif [ -b /dev/mapper/dynpart-system_b ]; then active_slot="_b" else active_slot="" fi if [ -b /dev/mapper/dynpart-odm${active_slot} ]; then mountpoint -q /android/odm || mount -o ro /dev/mapper/dynpart-odm${active_slot} /android/odm DOVI_KO_ANDROID="/android/odm/lib/modules/dovi.ko" insmod_dovi && return fi # older Android mountpoint -q /android/vendor || mount -o ro /dev/vendor /android/vendor for DOVI_KO_ANDROID in /android/vendor/lib/modules/dovi.ko \ /android/vendor/lib/modules/dovi_vs10.ko \ ; do insmod_dovi && return done cleanup_dovi } cleanup_dovi() { rmmod dovi 2>/dev/null mountpoint -q /android/odm && umount /android/odm mountpoint -q /android/oem && umount /android/oem mountpoint -q /android/vendor && umount /android/vendor # unmount only if mounted from this script [ "${dmsetup_remove}" = "yes" ] && \ ls /dev/mapper/dynpart-* &>/dev/null && dmsetup remove /dev/mapper/dynpart-* } message "run dovi '${1}'" case "${1}" in start) load_dovi ;; stop) cleanup ;; esac exit 0 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/opentee_linuxdriver/scripts/tee-loader.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) # get coreelec release information source /etc/os-release VIDEO_UCODE_BIN_PATH=/lib/firmware/video/video_ucode.bin TEE_SUPPLICANT_PID_FILE=/var/run/tee-supplicant.pid message() { >&2 echo "${@}" } android_wrapper() { local android_arch=$(od -An -t x1 -j 4 -N 1 /vendor/bin/tee-supplicant | tr -d '[:space:]') local bit64="" local arg_exec="" [ "${android_arch}" = "02" ] && bit64="64" # 01 for 32-bit, 02 for 64 bit if [ "${1}" = "exec" ]; then arg_exec="exec" shift fi LD_LIBRARY_PATH=/system/lib${bit64}/bootstrap:/system/lib${bit64}:/vendor/lib${bit64} \ ${arg_exec} \ /system/bin/bootstrap/linker${bit64} \ ${@} return ${?} } run_tee_from_coreelec() { message "run tee from coreelec start" local SOC=$(awk '/SoC[ \t]*:/ {printf "%s", $3}' /proc/cpuinfo) if [ -z "${SOC}" ]; then message "SoC architecture unknown" return 1 fi mkdir -p /var/lib ln -sfn /usr/lib/ta/${SOC} /var/lib/optee_armtz [ -f $(dirname ${VIDEO_UCODE_BIN_PATH})/${SOC}/video_ucode.bin ] && \ ln -sfn ${SOC}/video_ucode.bin ${VIDEO_UCODE_BIN_PATH} tee-supplicant & echo ${!} >${TEE_SUPPLICANT_PID_FILE} # wait for tee-supplicant process to start sleep 5 tee_preload_fw ${VIDEO_UCODE_BIN_PATH} local rv=${?} message "run tee from coreelec end" return ${rv} } run_tee_from_android() { message "run tee from android start" ! ls /dev/mapper/dynpart-* &>/dev/null && dmsetup create --concise "$(parse-android-dynparts /dev/super)" local active_slot=$(fw_printenv active_slot 2>/dev/null | awk -F '=' '/active_slot=/ {print $2}') message "fw active slot: '${active_slot}'" if [ -b /dev/mapper/dynpart-system_a ]; then active_slot="_a" elif [ -b /dev/mapper/dynpart-system_b ]; then active_slot="_b" else active_slot="" fi message "active slot: '${active_slot}'" mountpoint -q /android/system || mount -o ro /dev/mapper/dynpart-system${active_slot} /android/system mountpoint -q /android/vendor || mount -o ro /dev/mapper/dynpart-vendor${active_slot} /android/vendor if [ ! -x /vendor/bin/tee-supplicant ]; then message "tee-supplicant does not exist on android" return 1 fi android_wrapper exec /vendor/bin/tee-supplicant & echo ${!} >${TEE_SUPPLICANT_PID_FILE} # wait for tee-supplicant process to start sleep 5 ln -sfn /vendor${VIDEO_UCODE_BIN_PATH} ${VIDEO_UCODE_BIN_PATH} android_wrapper /vendor/bin/tee_preload_fw ${VIDEO_UCODE_BIN_PATH} local rv=${?} message "run tee from android end" return ${rv} } cleanup_tee() { message "cleanup tee start" # process is killed by systemd if [ -r ${TEE_SUPPLICANT_PID_FILE} ]; then local tee_pid=$(cat ${TEE_SUPPLICANT_PID_FILE}) kill -s 0 ${tee_pid} 2>/dev/null && kill -KILL ${tee_pid} rm -f ${TEE_SUPPLICANT_PID_FILE} fi mountpoint -q /android/system && umount /android/system mountpoint -q /android/vendor && umount /android/vendor ls /dev/mapper/dynpart-* &>/dev/null && dmsetup remove /dev/mapper/dynpart-* message "cleanup tee end" } # run only if SoC is minimum SC2 (0x32) architecture SERIAL_THIS=$(awk '/^Serial[ \t]*:/ {printf "%d", "0x" substr($3,0,2)}' /proc/cpuinfo) SERIAL_SC2=$(printf "%d" "0x32") if [ ${SERIAL_THIS} -lt ${SERIAL_SC2} ]; then echo 1 > $(realpath /sys/module/*tee/parameters/disable_flag) message "tee not needed (SoC is less than SC2 (0x32) architecture)" ln -sfn NO_TEE/video_ucode.bin ${VIDEO_UCODE_BIN_PATH} exit 0 fi case "${1}" in start) if [ -b /dev/super ]; then run_tee_from_android [ ${?} -eq 0 ] && exit 0 message "using tee from android failed, trying from coreelec" cleanup_tee fi run_tee_from_coreelec [ ${?} -eq 0 ] && exit 0 if [ ! -b /dev/super ]; then exit 0; fi cat > /tmp/tee.message << 'EOF' [TITLE]CoreELEC Media Playback[/TITLE] [B][COLOR red]Missing partition 'super' on eMMC![/COLOR][/B] [COLOR red]No media playback possible![/COLOR] Current Android installed on eMMC does not have 'super' partition which is required for media playback in CoreELEC. Android must be reinstalled on your device to satisfy the requirements. If you have a CoreELEC internal install by the tool 'ceemmc' it is possible to perform the internal install again after Android is restored. Please ensure you have done a backup of your data before perform any recovery step. EOF message "using tee from coreelec failed" cleanup_tee ;; stop) cleanup_tee ;; esac ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/opentee_linuxdriver/system.d/opentee_linuxdriver.service ================================================ [Unit] Description=Optee TEE-Supplicant and Video Firmware Preload service Before=kodi.service After=local-fs.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/lib/coreelec/tee-loader start ExecStart=/usr/lib/coreelec/dovi-loader start ExecStop=/usr/lib/coreelec/dovi-loader stop ExecStop=/usr/lib/coreelec/tee-loader stop [Install] WantedBy=multi-user.target ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/qca6174-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team CoreELEC (https://coreelec.org) PKG_NAME="qca6174-aml" PKG_VERSION="c39cce4160817b0445afd4304b5b4dd2dcd29167" PKG_SHA256="450df8193205b13e81342d90a7cfd6ee2842453b800b1080bfa8b365af2ba5b8" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/qca6174-aml" PKG_URL="https://github.com/CoreELEC/qca6174-aml/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="qca6174 Linux Driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" PKG_PATCH_DIRS="$LINUX" post_unpack() { sed -i 's,-Wall,,g; s,-Werror,,g' ${PKG_BUILD}/AIO/drivers/qcacld-new/Kbuild sed -i 's,CDEFINES :=,CDEFINES := -Wno-misleading-indentation -Wno-unused-variable -Wno-unused-function,g' ${PKG_BUILD}/AIO/drivers/qcacld-new/Kbuild } pre_make_target() { unset LDFLAGS unset CFLAGS } make_target() { cd AIO/build make KERNELPATH="$(kernel_path)" \ ARCH=${TARGET_KERNEL_ARCH} \ CROSS_COMPILE=${TARGET_KERNEL_PREFIX} \ INSTALL_ROOT=${PKG_BUILD} \ CONFIG_BUILDROOT=y } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} cp ${PKG_BUILD}/lib/modules/wlan.ko ${INSTALL}/$(get_full_module_dir)/${PKG_NAME}/wlan-${PKG_NAME}.ko } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="qca9377-aml" PKG_VERSION="311e24939b53d0cbaf303cde3ed1dc22349602a9" PKG_SHA256="238e0174ec5ca3f87c184fade5eb7d1e4522d6af279aac6bd87f8bab24fc13ad" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://boundarydevices.com/new-silex-wifi-802-11ac-bt4-1-module/" PKG_URL="https://github.com/boundarydevices/qcacld-2.0/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="qca9377 Linux Driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" PKG_PATCH_DIRS="$LINUX" post_unpack() { sed -i 's,-Wall,,g; s,-Werror,,g' ${PKG_BUILD}/Kbuild sed -i 's,CDEFINES :=,CDEFINES := -Wno-misleading-indentation -Wno-unused-variable -Wno-unused-function,g' ${PKG_BUILD}/Kbuild } pre_make_target() { unset LDFLAGS unset CFLAGS } make_target() { make KERNEL_SRC="$(kernel_path)" \ ARCH=${TARGET_KERNEL_ARCH} \ CROSS_COMPILE=${TARGET_KERNEL_PREFIX} \ CONFIG_BUILDROOT=y } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} cp ${PKG_BUILD}/wlan.ko ${INSTALL}/$(get_full_module_dir)/${PKG_NAME}/wlan-${PKG_NAME}.ko } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/patches/amlogic-3.14/qca9377-aml-001-Modify-SDIO-and-firmware-handling-to-support-chips-u.patch ================================================ From 7d4ee23fb20cc5e17d8d79db20a0d6704ac3df6c Mon Sep 17 00:00:00 2001 From: kszaq <kszaquitto@gmail.com> Date: Tue, 10 Jan 2017 22:43:12 +0100 Subject: [PATCH] Modify SDIO and firmware handling to support chips used in Amlogic devices --- CORE/HDD/src/wlan_hdd_cfg.c | 10 +- CORE/HDD/src/wlan_hdd_main.c | 180 ++++++++++++++++++++- CORE/SERVICES/BMI/ol_fw.c | 8 +- CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c | 6 - .../sdio/linux/native_sdio/include/hif_internal.h | 2 +- CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c | 62 +++---- 6 files changed, 209 insertions(+), 59 deletions(-) diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c index 14524ef..439b18a 100644 --- a/CORE/HDD/src/wlan_hdd_cfg.c +++ b/CORE/HDD/src/wlan_hdd_cfg.c @@ -60,6 +60,8 @@ #include <pmcApi.h> #include <wlan_hdd_misc.h> +extern int qca_request_firmware(const struct firmware **firmware_p, const char *name,struct device *device); + static char *mac_param; module_param_named(mac, mac_param, charp, S_IRUGO); MODULE_PARM_DESC(mac, "mac address override"); @@ -4411,11 +4413,11 @@ VOS_STATUS hdd_parse_config_ini(hdd_context_t* pHddCtx) memset(cfgIniTable, 0, sizeof(cfgIniTable)); - status = request_firmware(&fw, WLAN_INI_FILE, pHddCtx->parent_dev); + status = qca_request_firmware(&fw, WLAN_INI_FILE, pHddCtx->parent_dev); if(status) { - printk("%s: request_firmware failed %d",__func__, status); + printk("%s: qca_request_firmware failed %d",__func__, status); vos_status = VOS_STATUS_E_FAILURE; goto config_exit; } @@ -5104,11 +5106,11 @@ VOS_STATUS hdd_update_mac_config(hdd_context_t *pHddCtx) } memset(macTable, 0, sizeof(macTable)); - status = request_firmware(&fw, WLAN_MAC_FILE, pHddCtx->parent_dev); + status = qca_request_firmware(&fw, WLAN_MAC_FILE, pHddCtx->parent_dev); if (status) { - hddLog(VOS_TRACE_LEVEL_WARN, "%s: request_firmware failed %d", + hddLog(VOS_TRACE_LEVEL_WARN, "%s: qca_request_firmware failed %d", __func__, status); vos_status = VOS_STATUS_E_FAILURE; return vos_status; diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index 00db789..7926902 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -239,6 +239,163 @@ static VOS_STATUS hdd_parse_ese_beacon_req(tANI_U8 *pValue, /* * Android DRIVER command structures */ +//tkun add + typedef char A_CHAR; + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) + #define GET_INODE_FROM_FILEP(filp) \ + (filp)->f_path.dentry->d_inode + #else + #define GET_INODE_FROM_FILEP(filp) \ + (filp)->f_dentry->d_inode + #endif +// #define A_MALLOC(size) kmalloc((size), GFP_KERNEL) + #define A_MALLOC_NOWAIT(size) kmalloc((size), GFP_ATOMIC) +// #define A_FREE(addr) kfree(addr);addr=NULL; +//#define A_MEMCPY(dst, src, len) memcpy((dst), (src), (len)) +// #define A_MEMZERO(addr, len) memset((addr), 0, (len)) + #define A_MEMCMP(addr1, addr2, len) memcmp((addr1), (addr2), (len)) + #define A_ROUND_UP(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) + + char qcafwpath[256] = "/lib/firmware"; + + int android_readwrite_file(const A_CHAR *filename, A_CHAR *rbuf, const A_CHAR *wbuf, size_t length) + { + int ret = 0; + struct file *filp = (struct file *)-ENOENT; + mm_segment_t oldfs; + oldfs = get_fs(); + set_fs(KERNEL_DS); + + // printk("%s: filename %s \n",__func__,filename); + do { + int mode = (wbuf) ? O_RDWR : O_RDONLY; + filp = filp_open(filename, mode, S_IRUSR); + if (IS_ERR(filp) || !filp->f_op) { + printk("%s: file %s filp_open error\n", __FUNCTION__, filename); + ret = -ENOENT; + break; + } + + if (length==0) { + /* Read the length of the file only */ + struct inode *inode; + + inode = GET_INODE_FROM_FILEP(filp); + if (!inode) { + // printk("%s: Get inode from %s failed\n", __FUNCTION__, filen ame); + ret = -ENOENT; + break; + } + ret = i_size_read(inode->i_mapping->host); + break; + } + + if (wbuf) { + if ( (ret=filp->f_op->write(filp, wbuf, length, &filp->f_pos)) < 0) { +// printk("%s: Write %u bytes to file %s error %d\n", __FUNCTION__, + // length, filename, ret); + break; + } + } else { + if ( (ret=filp->f_op->read(filp, rbuf, length, &filp->f_pos)) < 0) { +// printk ("%s: Read %u bytes from file %s error %d\n", __FUNCTION__, + // length, filename, ret); + break; + } + } + } while (0); + + if (!IS_ERR(filp)) { + filp_close(filp, NULL); + } + set_fs(oldfs); + + return ret; + } + + + int android_request_firmware(const struct firmware **firmware_p, const char *name,struct device *device) + { + int ret = 0; + struct firmware *firmware; + char filename[256]; + const char *raw_filename = name; + *firmware_p = firmware = A_MALLOC(sizeof(*firmware)); + if (!firmware) + return -ENOMEM; + A_MEMZERO(firmware, sizeof(*firmware)); + do { + size_t length, bufsize, bmisize; + + if (snprintf(filename, sizeof(filename), "%s/%s", qcafwpath, + raw_filename) >= sizeof(filename)) { + printk("snprintf: %s/%s\n", qcafwpath, raw_filename); + ret = -1; + break; + } + if ( (ret=android_readwrite_file(filename, NULL, NULL, 0)) < 0) { + break; + } else { + length = ret; + } + + if (strcmp(raw_filename, "softmac") == 0) { + bufsize = length = 17; + } else { + bufsize = ALIGN(length, PAGE_SIZE); + bmisize = A_ROUND_UP(length, 4); + bufsize = max(bmisize, bufsize); + } + firmware->data = vmalloc(bufsize); + firmware->size = length; + + // printk("AR6K: %s(): raw_filename=%s, bufsize=%d\n", __FUNCTION__, ra w_filename, bufsize); + + if (!firmware->data) { + printk("%s: Cannot allocate buffer for firmware\n", __FUNCTION__); + ret = -ENOMEM; + break; + } + + if ( (ret=android_readwrite_file(filename, (char*)firmware->data, NULL, length)) != length) { +// printk("%s: file read error, ret %d request %d\n", __FUNCTION__,ret,length); +// ret = -1; + break; + } + + } while (0); + + if (ret<0) { + if (firmware) { + if (firmware->data) + vfree(firmware->data); + A_FREE(firmware); + } + *firmware_p = NULL; + } else { + ret = 0; + } + return ret; + } + + void android_release_firmware(const struct firmware *firmware) + { + if (firmware) { + if (firmware->data) + vfree(firmware->data); + kfree(firmware); + } + } +extern int qca_request_firmware(const struct firmware **firmware_p,const char *name,struct device *device) + { + // int uevent = 1; + + //return _request_firmware(firmware_p, name, device, uevent, false); + + return android_request_firmware(firmware_p, name,device); + + + } struct android_wifi_reassoc_params { unsigned char bssid[18]; int channel; @@ -7801,7 +7958,7 @@ VOS_STATUS hdd_get_cfg_file_size(v_VOID_t *pCtx, char *pFileName, v_SIZE_t *pBuf ENTER(); - status = request_firmware(&pHddCtx->fw, pFileName, pHddCtx->parent_dev); + status = qca_request_firmware(&pHddCtx->fw, pFileName, pHddCtx->parent_dev); if(status || !pHddCtx->fw || !pHddCtx->fw->data) { hddLog(VOS_TRACE_LEVEL_FATAL,"%s: CFG download failed",__func__); @@ -7842,7 +7999,7 @@ VOS_STATUS hdd_read_cfg_file(v_VOID_t *pCtx, char *pFileName, ENTER(); - status = request_firmware(&pHddCtx->fw, pFileName, pHddCtx->parent_dev); + status = qca_request_firmware(&pHddCtx->fw, pFileName, pHddCtx->parent_dev); if(status || !pHddCtx->fw || !pHddCtx->fw->data) { hddLog(VOS_TRACE_LEVEL_FATAL,"%s: CFG download failed",__func__); @@ -12886,15 +13043,34 @@ static int hdd_driver_init( void) \return - 0 for success, non zero for failure --------------------------------------------------------------------------*/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) +extern int wifi_setup_dt(void); +extern void wifi_teardown_dt(void); +#endif +extern void extern_wifi_set_enable(int is_on); +extern void sdio_reinit(void); + #ifdef MODULE static int __init hdd_module_init ( void) { +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) + wifi_setup_dt(); +#endif + extern_wifi_set_enable(0); + mdelay(200); + extern_wifi_set_enable(1); + mdelay(200); +sdio_reinit(); + return hdd_driver_init(); } #else /* #ifdef MODULE */ static int __init hdd_module_init ( void) { /* Driver initialization is delayed to fwpath_changed_handler */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) +wifi_teardown_dt(); +#endif return 0; } #endif /* #ifdef MODULE */ diff --git a/CORE/SERVICES/BMI/ol_fw.c b/CORE/SERVICES/BMI/ol_fw.c index 466dbbc..95f1aee 100644 --- a/CORE/SERVICES/BMI/ol_fw.c +++ b/CORE/SERVICES/BMI/ol_fw.c @@ -118,7 +118,7 @@ static int ol_get_fw_files_for_target(struct ol_fw_files *pfw_files, return 0; } #endif - +extern int qca_request_firmware(const struct firmware **firmware_p, const char *name,struct device *device); #ifdef HIF_USB static A_STATUS ol_usb_extra_initialization(struct ol_softc *scn); #endif @@ -164,7 +164,7 @@ static int ol_transfer_single_bin_file(struct ol_softc *scn, __func__)); } - if (request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) + if (qca_request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) { AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Failed to get %s\n", @@ -492,7 +492,7 @@ static int ol_transfer_bin_file(struct ol_softc *scn, ATH_BIN_FILE file, break; } - if (request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) + if (qca_request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) { printk("%s: Failed to get %s\n", __func__, filename); @@ -506,7 +506,7 @@ static int ol_transfer_bin_file(struct ol_softc *scn, ATH_BIN_FILE file, filename = scn->fw_files.board_data; printk("%s: Trying to load default %s\n", __func__, filename); - if (request_firmware(&fw_entry, filename, + if (qca_request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) { printk("%s: Failed to get %s\n", __func__, filename); diff --git a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c index c99020e..6bafed8 100644 --- a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c +++ b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c @@ -234,12 +234,6 @@ ath_hif_sdio_remove(void *context, void *hif_handle) { ENTER(); - if (!sc) { - VOS_TRACE(VOS_MODULE_ID_HIF, VOS_TRACE_LEVEL_ERROR, - "Global SDIO context is NULL"); - return A_ERROR; - } - athdiag_procfs_remove(); #ifndef TARGET_DUMP_FOR_NON_QC_PLATFORM diff --git a/CORE/SERVICES/HIF/sdio/linux/native_sdio/include/hif_internal.h b/CORE/SERVICES/HIF/sdio/linux/native_sdio/include/hif_internal.h index 382e38c..234bc09 100644 --- a/CORE/SERVICES/HIF/sdio/linux/native_sdio/include/hif_internal.h +++ b/CORE/SERVICES/HIF/sdio/linux/native_sdio/include/hif_internal.h @@ -112,7 +112,7 @@ struct hif_device { A_BOOL swap_mailbox; }; -#define HIF_DMA_BUFFER_SIZE (4 * 1024) +#define HIF_DMA_BUFFER_SIZE (56 * 1024) #define CMD53_FIXED_ADDRESS 1 #define CMD53_INCR_ADDRESS 2 diff --git a/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c b/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c index 1c54002..03401fd 100644 --- a/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c +++ b/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c @@ -64,7 +64,8 @@ ((request->request & HIF_WRITE)&& \ (request->address >= 0x1000 && request->address < 0x1FFFF)) #endif -unsigned int mmcbusmode = 0; +//unsigned int mmcbusmode = 0; +unsigned int mmcbusmode = 5; module_param(mmcbusmode, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); MODULE_PARM_DESC(mmcbusmode, "Set MMC driver Bus Mode: 1-SDR12, 2-SDR25, 3-SDR50, 4-DDR50, 5-SDR104"); EXPORT_SYMBOL(mmcbusmode); @@ -74,7 +75,9 @@ module_param(mmcbuswidth, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); MODULE_PARM_DESC(mmcbuswidth, "Set MMC driver Bus Width: 1-1Bit, 4-4Bit, 8-8Bit"); EXPORT_SYMBOL(mmcbuswidth); -unsigned int mmcclock = 0; +//unsigned int mmcclock = 0; +//unsigned int mmcclock = 166666666; +unsigned int mmcclock = 200000000; module_param(mmcclock, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); MODULE_PARM_DESC(mmcclock, "Set MMC driver Clock value"); EXPORT_SYMBOL(mmcclock); @@ -95,7 +98,7 @@ unsigned int asyncintdelay = 2; module_param(asyncintdelay, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); MODULE_PARM_DESC(asyncintdelay, "Delay clock count for aysnc interrupt, 2 is default, vaild values are 1 and 2"); #else -unsigned int asyncintdelay = 0; +unsigned int asyncintdelay = 2; module_param(asyncintdelay, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); MODULE_PARM_DESC(asyncintdelay, "Delay clock count for aysnc interrupt, 0 is default, vaild values are 1 and 2"); #endif @@ -412,12 +415,6 @@ __HIFReadWrite(HIF_DEVICE *device, tbuffer = device->dma_buffer; /* copy the write data to the dma buffer */ AR_DEBUG_ASSERT(length <= HIF_DMA_BUFFER_SIZE); - if (length > HIF_DMA_BUFFER_SIZE) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, - ("AR6000: Invalid write length: %d\n", length)); - status = A_EINVAL; - break; - } memcpy(tbuffer, buffer, length); bounced = TRUE; } else { @@ -440,12 +437,6 @@ __HIFReadWrite(HIF_DEVICE *device, if (BUFFER_NEEDS_BOUNCE(buffer)) { AR_DEBUG_ASSERT(device->dma_buffer != NULL); AR_DEBUG_ASSERT(length <= HIF_DMA_BUFFER_SIZE); - if (length > HIF_DMA_BUFFER_SIZE) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, - ("AR6000: Invalid read length: %d\n", length)); - status = A_EINVAL; - break; - } tbuffer = device->dma_buffer; bounced = TRUE; } else { @@ -695,7 +686,7 @@ static int async_task(void *param) complete_and_exit(&device->async_completion, 0); return 0; } -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)) +#if 1 static A_INT32 IssueSDCommand(HIF_DEVICE *device, A_UINT32 opcode, A_UINT32 arg, A_UINT32 flags, A_UINT32 *resp) { struct mmc_command cmd; @@ -719,6 +710,7 @@ static A_INT32 IssueSDCommand(HIF_DEVICE *device, A_UINT32 opcode, A_UINT32 arg, return err; } #endif +//extern int sdio_reset_comm(struct mmc_card *card); A_STATUS ReinitSDIO(HIF_DEVICE *device) { A_INT32 err = 0; @@ -733,10 +725,12 @@ A_STATUS ReinitSDIO(HIF_DEVICE *device) host = card->host; AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("AR6000: +ReinitSDIO \n")); + +// err = sdio_reset_comm(card); +#if 1 sdio_claim_host(func); do { -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)) /* 2.6.32 kernel does part of the SDIO initalization upon resume */ A_BOOL lt_2_6_32 = (LINUX_VERSION_CODE<KERNEL_VERSION(2,6,32)); if (lt_2_6_32) { @@ -783,19 +777,10 @@ A_STATUS ReinitSDIO(HIF_DEVICE *device) break; } - if (!host->ocr) { - /* Issue CMD5, arg = 0 */ - err = IssueSDCommand(device, SD_IO_SEND_OP_COND, 0, (MMC_RSP_R4 | MMC_CMD_BCR), &resp); - if (err) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("ReinitSDIO: CMD5 failed : %d \n",err)); - break; - } - host->ocr = resp; - } /* Issue CMD5, arg = ocr. Wait till card is ready */ for (i=0;i<100;i++) { - err = IssueSDCommand(device, SD_IO_SEND_OP_COND, host->ocr, (MMC_RSP_R4 | MMC_CMD_BCR), &resp); + err = IssueSDCommand(device, SD_IO_SEND_OP_COND, 0, (MMC_RSP_R4 | MMC_CMD_BCR), &resp); if (err) { AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("ReinitSDIO: CMD5 failed : %d \n",err)); break; @@ -828,7 +813,7 @@ A_STATUS ReinitSDIO(HIF_DEVICE *device) break; } } -#endif + /* Enable high speed */ if (card->host->caps & MMC_CAP_SD_HIGHSPEED) { AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("ReinitSDIO: Set high speed mode\n")); @@ -891,7 +876,7 @@ A_STATUS ReinitSDIO(HIF_DEVICE *device) sdio_release_host(func); AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("AR6000: -ReinitSDIO \n")); - +#endif return (err) ? A_ERROR : A_OK; } @@ -1320,6 +1305,7 @@ static int hifDeviceInserted(struct sdio_func *func, const struct sdio_device_id /* TODO: MMC SDIO3.0 Setting should also be modified in ReInit() function when Power Manage work. */ +#if 1 { A_UINT32 clock, clock_set = 12500000; #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0) @@ -1576,7 +1562,7 @@ TODO: MMC SDIO3.0 Setting should also be modified in ReInit() function when Powe sdio_release_host(func); } - +#endif spin_lock_init(&device->lock); spin_lock_init(&device->asynclock); @@ -2068,12 +2054,10 @@ static int hifDeviceSuspend(struct device *dev) return -1; } } else { - if (wma_suspend_target(temp_module, 0)) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, ("PDEV Suspend Failed\n")); - return -1; - } + if (wma_suspend_target(temp_module, 0)) { + printk(KERN_ERR "wma_suspend_target failed.\n"); + } } - if (pm_flag & MMC_PM_WAKE_SDIO_IRQ){ AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("hifDeviceSuspend: wow enter\n")); config = HIF_DEVICE_POWER_DOWN; @@ -2293,9 +2277,7 @@ static HIF_DEVICE * addHifDevice(struct sdio_func *func) { HIF_DEVICE *hifdevice = NULL; -#if(LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0)) && !defined(WITH_BACKPORTS) int ret = 0; -#endif ENTER(); AR_DEBUG_ASSERT(func != NULL); hifdevice = (HIF_DEVICE *)A_MALLOC(sizeof(HIF_DEVICE)); @@ -2308,13 +2290,9 @@ addHifDevice(struct sdio_func *func) hifdevice->func = func; hifdevice->powerConfig = HIF_DEVICE_POWER_UP; hifdevice->DeviceState = HIF_DEVICE_STATE_ON; -#if(LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0)) && !defined(WITH_BACKPORTS) ret = sdio_set_drvdata(func, hifdevice); + EXIT("status %d", ret); -#else - sdio_set_drvdata(func, hifdevice); - EXIT(); -#endif return hifdevice; } -- 2.7.4 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/patches/amlogic-4.9/qca9377-aml-001-fix-amlogic-4.9-compatibility.patch ================================================ From 3b0a139cea3a9b45db94923d4acba93b0267fc25 Mon Sep 17 00:00:00 2001 From: Arthur Liberman <arthur_liberman@hotmail.com> Date: Fri, 17 Jul 2020 19:09:18 +0300 Subject: [PATCH] Fix build on Amlogic's 4.9 kernel --- CORE/HDD/src/wlan_hdd_main.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index 00db78995..2afe68e23 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -13015,9 +13015,15 @@ static void __exit hdd_module_exit(void) hdd_driver_exit(); } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0)) +#define KERNEL_PARAM const struct kernel_param +#else +#define KERNEL_PARAM struct kernel_param +#endif + #ifdef MODULE static int fwpath_changed_handler(const char *kmessage, - struct kernel_param *kp) + KERNEL_PARAM *kp) { return param_set_copystring(kmessage, kp); } @@ -13072,7 +13078,7 @@ static int kickstart_driver(void) --------------------------------------------------------------------------*/ static int fwpath_changed_handler(const char *kmessage, - struct kernel_param *kp) + KERNEL_PARAM *kp) { int ret; -- 2.20.1 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/patches/amlogic-4.9/qca9377-aml-002-sdio-enable-only-QCA9377-vendor-device-id.patch ================================================ From 2b4b3fccab7753a5d102c52c6261b099e25c1685 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Tue, 11 May 2021 07:40:40 +0200 Subject: [PATCH 1/2] sdio: enable only QCA9377 vendor/device id --- .../HIF/sdio/linux/native_sdio/src/hif.c | 33 ------------------- 1 file changed, 33 deletions(-) diff --git a/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c b/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c index 1c54002..5a23f80 100644 --- a/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c +++ b/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c @@ -158,35 +158,6 @@ A_UINT32 forcedriverstrength = 1; /* force driver strength to type D */ /* ------ Static Variables ------ */ static const struct sdio_device_id ar6k_id_table[] = { -#ifdef AR6002_HEADERS_DEF - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6002_BASE | 0x0)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6002_BASE | 0x1)) }, -#endif -#ifdef AR6003_HEADERS_DEF - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6003_BASE | 0x0)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6003_BASE | 0x1)) }, -#endif -#ifdef AR6004_HEADERS_DEF - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6004_BASE | 0x0)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6004_BASE | 0x1)) }, -#endif -#ifdef AR6320_HEADERS_DEF - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x0)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x1)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x2)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x3)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x4)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x5)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x6)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x7)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x8)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x9)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0xA)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0xB)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0xC)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0xD)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0xE)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0xF)) }, { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0x0)) }, { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0x1)) }, { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0x2)) }, @@ -203,10 +174,6 @@ static const struct sdio_device_id ar6k_id_table[] = { { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0xD)) }, { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0xE)) }, { SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0xF)) }, - /* TODO: just for compatible with old image which ManufacturerID is 0, should delete later */ - { SDIO_DEVICE(MANUFACTURER_CODE, (0 | 0x0)) }, - { SDIO_DEVICE(MANUFACTURER_CODE, (0 | 0x1)) }, -#endif { /* null */ }, }; MODULE_DEVICE_TABLE(sdio, ar6k_id_table); -- 2.30.0 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/patches/amlogic-4.9/qca9377-aml-003-Add-Amlogic-CONFIG_BUILDROOT-for-firmware-path.patch ================================================ From 676c44bdd320fc4419efb5a1df0ba1277e1c453c Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Tue, 11 May 2021 07:54:08 +0200 Subject: [PATCH] Add Amlogic CONFIG_BUILDROOT for firmware path --- CORE/HDD/src/wlan_hdd_cfg.c | 6 ++++-- CORE/HDD/src/wlan_hdd_main.c | 15 +++++++++++++-- CORE/SERVICES/BMI/ol_fw.c | 8 +++++--- Kbuild | 4 ++++ 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c index 14524ef..2c9abd8 100644 --- a/CORE/HDD/src/wlan_hdd_cfg.c +++ b/CORE/HDD/src/wlan_hdd_cfg.c @@ -60,6 +60,8 @@ #include <pmcApi.h> #include <wlan_hdd_misc.h> +extern int qca_request_firmware(const struct firmware **firmware_p, const char *name,struct device *device); + static char *mac_param; module_param_named(mac, mac_param, charp, S_IRUGO); MODULE_PARM_DESC(mac, "mac address override"); @@ -4411,7 +4413,7 @@ VOS_STATUS hdd_parse_config_ini(hdd_context_t* pHddCtx) memset(cfgIniTable, 0, sizeof(cfgIniTable)); - status = request_firmware(&fw, WLAN_INI_FILE, pHddCtx->parent_dev); + status = qca_request_firmware(&fw, WLAN_INI_FILE, pHddCtx->parent_dev); if(status) { @@ -5104,7 +5106,7 @@ VOS_STATUS hdd_update_mac_config(hdd_context_t *pHddCtx) } memset(macTable, 0, sizeof(macTable)); - status = request_firmware(&fw, WLAN_MAC_FILE, pHddCtx->parent_dev); + status = qca_request_firmware(&fw, WLAN_MAC_FILE, pHddCtx->parent_dev); if (status) { diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index 2afe68e..b0d2afd 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -236,6 +236,17 @@ static VOS_STATUS hdd_parse_ese_beacon_req(tANI_U8 *pValue, */ #define NUM_OF_STA_DATA_TO_PRINT 16 +int qca_request_firmware(const struct firmware **firmware_p,const char *name,struct device *device) +{ +#ifdef CONFIG_BUILDROOT + char final_name[512]; + sprintf(final_name,"qca9377/%s",name); + return request_firmware(firmware_p, final_name, device); +#else + return request_firmware(firmware_p, name, device); +#endif +} + /* * Android DRIVER command structures */ @@ -7801,7 +7812,7 @@ VOS_STATUS hdd_get_cfg_file_size(v_VOID_t *pCtx, char *pFileName, v_SIZE_t *pBuf ENTER(); - status = request_firmware(&pHddCtx->fw, pFileName, pHddCtx->parent_dev); + status = qca_request_firmware(&pHddCtx->fw, pFileName, pHddCtx->parent_dev); if(status || !pHddCtx->fw || !pHddCtx->fw->data) { hddLog(VOS_TRACE_LEVEL_FATAL,"%s: CFG download failed",__func__); @@ -7842,7 +7853,7 @@ VOS_STATUS hdd_read_cfg_file(v_VOID_t *pCtx, char *pFileName, ENTER(); - status = request_firmware(&pHddCtx->fw, pFileName, pHddCtx->parent_dev); + status = qca_request_firmware(&pHddCtx->fw, pFileName, pHddCtx->parent_dev); if(status || !pHddCtx->fw || !pHddCtx->fw->data) { hddLog(VOS_TRACE_LEVEL_FATAL,"%s: CFG download failed",__func__); diff --git a/CORE/SERVICES/BMI/ol_fw.c b/CORE/SERVICES/BMI/ol_fw.c index 466dbbc..5bed9ed 100644 --- a/CORE/SERVICES/BMI/ol_fw.c +++ b/CORE/SERVICES/BMI/ol_fw.c @@ -119,6 +119,8 @@ static int ol_get_fw_files_for_target(struct ol_fw_files *pfw_files, } #endif +extern int qca_request_firmware(const struct firmware **firmware_p, const char *name,struct device *device); + #ifdef HIF_USB static A_STATUS ol_usb_extra_initialization(struct ol_softc *scn); #endif @@ -164,7 +166,7 @@ static int ol_transfer_single_bin_file(struct ol_softc *scn, __func__)); } - if (request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) + if (qca_request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) { AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Failed to get %s\n", @@ -492,7 +494,7 @@ static int ol_transfer_bin_file(struct ol_softc *scn, ATH_BIN_FILE file, break; } - if (request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) + if (qca_request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) { printk("%s: Failed to get %s\n", __func__, filename); @@ -506,7 +508,7 @@ static int ol_transfer_bin_file(struct ol_softc *scn, ATH_BIN_FILE file, filename = scn->fw_files.board_data; printk("%s: Trying to load default %s\n", __func__, filename); - if (request_firmware(&fw_entry, filename, + if (qca_request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) { printk("%s: Failed to get %s\n", __func__, filename); diff --git a/Kbuild b/Kbuild index 0aee36f..13054e4 100644 --- a/Kbuild +++ b/Kbuild @@ -6,6 +6,10 @@ else KERNEL_BUILD := 0 endif +ifeq ($(CONFIG_BUILDROOT),y) + EXTRA_CFLAGS += -DCONFIG_BUILDROOT +endif + # This branch builds for SDIO devices by default ifeq ($(CONFIG_CLD_HL_SDIO_CORE),) CONFIG_CLD_HL_SDIO_CORE := y -- 2.30.0 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/udev.d/99-qca9377-wireless.rules ================================================ ACTION=="add|change", SUBSYSTEM=="net", ENV{INTERFACE}=="wlan*", \ ATTRS{vendor}=="0x0271", ATTRS{device}=="0x070?", \ RUN+="/usr/bin/systemctl restart connman.service" ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/ssv6xxx-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ssv6xxx-aml" PKG_VERSION="0dddfae91c07bd11274c443b6480a0a88234deed" PKG_SHA256="59552fa1400c6c81d10d6fe75c70ea10358681c094aa77a3a130277ed58a5268" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/khadas/android_hardware_wifi_icomm_drivers_ssv6xxx/" PKG_URL="https://github.com/khadas/android_hardware_wifi_icomm_drivers_ssv6xxx/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="ssv6xxx Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" pre_make_target() { unset LDFLAGS } make_target() { if [ "$TARGET_KERNEL_ARCH" = "arm64" ]; then PLATFORM="aml-s905" else PLATFORM="aml-s805" fi cd $PKG_BUILD/ssv6051 ./ver_info.pl include/ssv_version.h cp Makefile.android Makefile sed -i 's,PLATFORMS =,PLATFORMS = '"$PLATFORM"',g' Makefile make module SSV_ARCH="$TARGET_KERNEL_ARCH" \ SSV_CROSS="$TARGET_KERNEL_PREFIX" \ SSV_KERNEL_PATH="$(kernel_path)" } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ssv6051/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; mkdir -p $INSTALL/$(get_full_firmware_dir)/ssv6051 cp -r $PKG_BUILD/ssv6051/image/* $INSTALL/$(get_full_firmware_dir)/ssv6051 } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/ssv6xxx-aml/patches/ssv6xxx-aml-001-fix-build-and-firmware-path.patch ================================================ diff --git a/ssv6051/Makefile.android b/ssv6051/Makefile.android index 43c268e..3f2fd8d 100755 --- a/ssv6051/Makefile.android +++ b/ssv6051/Makefile.android @@ -1,8 +1,8 @@ PLATFORMS = KBUILD_TOP := $(PWD) -include $(KBUILD_TOP)/platforms/$(PLATFORMS).cfg -include $(KBUILD_TOP)/platforms/platform-config.mak +include $(KBUILD_TOP)/ssv6051.cfg +include $(KBUILD_TOP)/platform-config.mak PWD := $(shell pwd) @@ -57,7 +57,7 @@ KERN_SRCS_S += crypto/sha1-armv4-large.S endif -KERN_SRCS += platforms/$(PLATFORMS)-generic-wlan.c +KERN_SRCS += ssv6051-generic-wlan.c $(KMODULE_NAME)-y += $(KERN_SRCS_S:.S=.o) $(KMODULE_NAME)-y += $(KERN_SRCS:.c=.o) @@ -67,7 +67,7 @@ obj-$(CONFIG_SSV6200_CORE) += $(KMODULE_NAME).o all:module strip module: - make -C $(SSV_KERNEL_PATH) ARCH=$(SSV_ARCH) CROSS_COMPILE=$(SSV_CROSS) \ + $(MAKE) -C $(SSV_KERNEL_PATH) ARCH=$(SSV_ARCH) CROSS_COMPILE=$(SSV_CROSS) \ EXTRA_CFLAGS="$(EXTRA_CFLAGS)" M=$(PWD) modules install: @@ -80,7 +80,7 @@ strip: #cp eagle.ko $(KO_NAME).ko #cp $(KO_NAME).ko $(DEFAULT_MODULES_DIR) #cp ssv6200.ko $(DEFAULT_MODULES_DIR) - cp platforms/$(PLATFORMS)-wifi.cfg image/$(KMODULE_NAME)-wifi.cfg + #cp platforms/$(PLATFORMS)-wifi.cfg image/$(KMODULE_NAME)-wifi.cfg cp $(KMODULE_NAME).ko image/$(KMODULE_NAME).ko cp platforms/cli image ifneq ($(SSV_STRIP),) @@ -90,6 +90,6 @@ ifneq ($(SSV_STRIP),) endif clean: - make -C $(SSV_KERNEL_PATH) ARCH=$(SSV_ARCH) CROSS_COMPILE=$(SSV_CROSS) \ + $(MAKE) -C $(SSV_KERNEL_PATH) ARCH=$(SSV_ARCH) CROSS_COMPILE=$(SSV_CROSS) \ M=$(PWD) clean diff --git a/ssv6051/hci/ssv_hci.c b/ssv6051/hci/ssv_hci.c index f9c0a56..cafaffa 100755 --- a/ssv6051/hci/ssv_hci.c +++ b/ssv6051/hci/ssv_hci.c @@ -21,7 +21,9 @@ #include <linux/jiffies.h> #include <ssv6200.h> #include "hctrl.h" +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,9,0)) extern void sdio_clk_always_on(int on); +#endif MODULE_AUTHOR("iComm Semiconductor Co., Ltd"); MODULE_DESCRIPTION("HCI driver for SSV6xxx 802.11n wireless LAN cards."); MODULE_SUPPORTED_DEVICE("SSV6xxx WLAN cards"); @@ -1112,7 +1114,9 @@ static int __init ssv6xxx_hci_init(void) #ifdef CONFIG_SSV6200_CLI_ENABLE extern struct ssv6xxx_hci_ctrl *ssv_dbg_ctrl_hci; #endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,9,0)) sdio_clk_always_on(1); +#endif ctrl_hci = kzalloc(sizeof(*ctrl_hci), GFP_KERNEL); if (ctrl_hci == NULL) return -ENOMEM; @@ -1141,7 +1145,9 @@ static void __exit ssv6xxx_hci_exit(void) #ifdef CONFIG_SSV6200_CLI_ENABLE ssv_dbg_ctrl_hci = NULL; #endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,9,0)) sdio_clk_always_on(0); +#endif } #if (defined(CONFIG_SSV_SUPPORT_ANDROID)||defined(CONFIG_SSV_BUILD_AS_ONE_KO)) EXPORT_SYMBOL(ssv6xxx_hci_init); diff --git a/ssv6051/image/ssv6051-wifi.cfg b/ssv6051/image/ssv6051-wifi.cfg index 46429fc..bc909c9 100755 --- a/ssv6051/image/ssv6051-wifi.cfg +++ b/ssv6051/image/ssv6051-wifi.cfg @@ -9,7 +9,7 @@ # Priority.2 firmware_path # Priority.3 default firmware ################################################## -firmware_path = /vendor/etc/wifi/ssv6051/ +firmware_path = /usr/lib/firmware/ssv6051/ #flash_bin_path = /tmp/flash.bin ############################################################ @@ -68,7 +68,7 @@ hw_cap_security = on hw_cap_sgi_20 = on hw_cap_sgi_40 = off hw_cap_ap = on -hw_cap_p2p = on +hw_cap_p2p = off hw_cap_ampdu_rx = on hw_cap_ampdu_tx = on use_wpa2_only = 1 diff --git a/ssv6051/platform-config.mak b/ssv6051/platform-config.mak index 5c37b23..8b74de6 100755 --- a/ssv6051/platform-config.mak +++ b/ssv6051/platform-config.mak @@ -5,7 +5,7 @@ CONFIG_SSV6200_CORE=m ########################################################################### # Compiler options # ########################################################################### -ccflags-y += -Werror +# ccflags-y += -Werror # Enable -g to help debug. Deassembly from .o to .S would help to track to # the problomatic line from call stack dump. diff --git a/ssv6051/ssv6051.cfg b/ssv6051/ssv6051.cfg index 12f46ef..93ff793 100755 --- a/ssv6051/ssv6051.cfg +++ b/ssv6051/ssv6051.cfg @@ -22,6 +22,6 @@ ccflags-y += -DCONFIG_MMC_DISALLOW_STACK #SSV_KERNEL_PATH = $(ANDROID_BUILD_TOP)/out/target/product/m201/obj/KERNEL_OBJ/ #SSV_CROSS = $(ANDROID_BUILD_TOP)/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/arm-eabi- #SSV_KERNEL_PATH = $(ANDROID_BUILD_TOP)/hardware/wifi/icomm/drivers/ssv6xxx/ -SSV_ARCH = arm64 +#SSV_ARCH = arm64 #KMODDESTDIR = $(MODDESTDIR) diff --git a/ssv6051/ssvdevice/ssvdevice.c b/ssv6051/ssvdevice/ssvdevice.c index 4d9257f..cd53d9f 100755 --- a/ssv6051/ssvdevice/ssvdevice.c +++ b/ssv6051/ssvdevice/ssvdevice.c @@ -36,7 +36,7 @@ MODULE_AUTHOR("iComm Semiconductor Co., Ltd"); MODULE_DESCRIPTION("Shared library for SSV wireless LAN cards."); MODULE_LICENSE("Dual BSD/GPL"); -static char *stacfgpath = NULL; +static char *stacfgpath = "/usr/lib/firmware/ssv6051/ssv6051-wifi.cfg"; EXPORT_SYMBOL(stacfgpath); module_param(stacfgpath, charp, 0000); MODULE_PARM_DESC(stacfgpath, "Get path of sta cfg"); ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/ssv6xxx-aml/patches/ssv6xxx-aml-002-fix-driver-after-update.patch ================================================ From 2cee7f60a8fc7b70738f7ac090b6861354206718 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Sun, 18 Apr 2021 20:36:04 +0200 Subject: [PATCH 1/2] ssv6051: fix driver after update --- ssv6051/hwif/sdio/sdio.c | 2 -- ssv6051/ssv6051-generic-wlan.c | 4 ++-- ssv6051/ssvdevice/ssvdevice.c | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/ssv6051/hwif/sdio/sdio.c b/ssv6051/hwif/sdio/sdio.c index 65f5dd1..14736b7 100755 --- a/ssv6051/hwif/sdio/sdio.c +++ b/ssv6051/hwif/sdio/sdio.c @@ -94,9 +94,7 @@ static const struct sdio_device_id ssv6xxx_sdio_devices[] __devinitconst = static const struct sdio_device_id ssv6xxx_sdio_devices[] = #endif { -#if 0 { SDIO_DEVICE(SSV_VENDOR_ID, SSV_CABRIO_DEVID) }, -#endif {} }; MODULE_DEVICE_TABLE(sdio, ssv6xxx_sdio_devices); diff --git a/ssv6051/ssv6051-generic-wlan.c b/ssv6051/ssv6051-generic-wlan.c index 1c679a7..12d7180 100755 --- a/ssv6051/ssv6051-generic-wlan.c +++ b/ssv6051/ssv6051-generic-wlan.c @@ -113,7 +113,7 @@ void exitWlan(void) } return; } -static __init int generic_wifi_init_module(void) +static int generic_wifi_init_module(void) { int ret, time = 5; printk("%s\n", __func__); @@ -142,7 +142,7 @@ out: printk("generic_wifi_init finished\n"); return ret; } -static __exit void generic_wifi_exit_module(void) +static void generic_wifi_exit_module(void) { printk("%s\n", __func__); #ifdef CONFIG_SSV_SUPPORT_AES_ASM diff --git a/ssv6051/ssvdevice/ssvdevice.c b/ssv6051/ssvdevice/ssvdevice.c index cd53d9f..a520d4e 100755 --- a/ssv6051/ssvdevice/ssvdevice.c +++ b/ssv6051/ssvdevice/ssvdevice.c @@ -280,7 +280,7 @@ static void __exit ssvdevice_exit(void) remove_proc_entry(DEBUG_DIR_ENTRY, NULL); kfree(ssv6xxx_cmd_buf); } -#if 0// (defined(CONFIG_SSV_SUPPORT_ANDROID)||defined(CONFIG_SSV_BUILD_AS_ONE_KO)) +#if (defined(CONFIG_SSV_SUPPORT_ANDROID)||defined(CONFIG_SSV_BUILD_AS_ONE_KO)) EXPORT_SYMBOL(ssvdevice_init); EXPORT_SYMBOL(ssvdevice_exit); #else -- 2.31.1 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/ssv6xxx-aml/patches/ssv6xxx-aml-003-force-SSV6051P-when-SSV6030P-is-detected.patch ================================================ From 0b733e6fbfdd31b0a48c8cb1eba787eba65874aa Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Sun, 18 Apr 2021 20:36:33 +0200 Subject: [PATCH 3/3] ssv6051: force SSV6051P when SSV6030P is detected Instead using force_chip_identity in cfg file force the id directly in driver source. --- ssv6051/smac/init.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ssv6051/smac/init.c b/ssv6051/smac/init.c index fc8006c..ac84cd0 100755 --- a/ssv6051/smac/init.c +++ b/ssv6051/smac/init.c @@ -1124,6 +1124,9 @@ static int ssv6xxx_init_hw(struct ssv_hw *sh) sh->ampdu_divider = SSV6XXX_AMPDU_DIVIDER; memset(sh->page_count, 0, sizeof(sh->page_count)); #ifdef CONFIG_SSV_CABRIO_E + if (sh->cfg.chip_identity == SSV6030P) + sh->cfg.force_chip_identity = SSV6051P; + if (sh->cfg.force_chip_identity) { printk("Force use external RF setting [%08x]\n",sh->cfg.force_chip_identity); -- 2.31.1 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/uwe5631-aml/firmware/wifi_56630001_3ant.ini ================================================ [Section 1: Version] Major = 2 Minor = 2 [Section 2: Board Config] Calib_Bypass = 3566 TxChain_Mask = 3 RxChain_Mask = 3 [Section 3: Board Config TPC] DPD_LUT_idx = 0x33,0x33,0x00,0x11,0x22,0x33,0x33,0x33 TPC_Goal_Chain0 = 180,177,174,178,180,177,174,178 TPC_Goal_Chain1 = 190,191,188,175,190,191,188,175 [Section 4: TPC-LUT] Chain0_LUT_0 = 6,0,40,0 Chain0_LUT_1 = 6,1,24,0 Chain0_LUT_2 = 6,2,8,0 Chain0_LUT_3 = 10,2,0,0 Chain0_LUT_4 = 14,2,0,0 Chain0_LUT_5 = 18,2,0,0 Chain0_LUT_6 = 22,2,0,0 Chain0_LUT_7 = 26,2,0,0 Chain1_LUT_0 = 6,0,40,0 Chain1_LUT_1 = 6,1,24,0 Chain1_LUT_2 = 6,2,8,0 Chain1_LUT_3 = 10,2,0,0 Chain1_LUT_4 = 14,2,0,0 Chain1_LUT_5 = 18,2,0,0 Chain1_LUT_6 = 22,2,0,0 Chain1_LUT_7 = 26,2,0,0 [Section 5: Board Config Frequency Compensation] 2G_Channel_Chain0 = 6,6,6,6,8,8,8,8,9,9,9,9,9,9 2G_Channel_Chain1 = 5,5,5,5,8,8,8,8,9,9,9,9,9,9 5G_Channel_Chain0 = 5,5,5,5,5,5,5,5,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,7 5G_Channel_Chain1 = 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,4,4,4,4,4 [Section 6: Rate To Power with BW 20M] 11b_Power = 0,0,0,0 11ag_Power = 8,0,16,28,42,32,44,68 11n_Power = 12,14,14,18,18,28,28,28,42,42,42,46,46,68,68,68,60 11ac_Power = 44,46,46,50,50,58,58,58,80,80,46,46,46,50,50,58,58,58,80,80 [Section 7: Power Backoff] Green_WIFI_offset = 0 HT40_Power_offset = 0 VHT40_Power_offset = 0 VHT80_Power_offset = 0 SAR_Power_offset = 0 Mean_Power_offset = 38 TPC_mode = 3 [Section 8: Reg Domain] reg_domain1 = 0x00000001 reg_domain2 = 0x00000002 [Section 9: Band Edge Power offset (MKK, FCC, ETSI)] BW20M = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BW40M = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BW80M = 0,0,0,0,0,0 [Section 10: TX Scale] Chain0_1 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 Chain1_1 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 Chain0_2 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17 Chain1_2 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17 Chain0_3 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,18 Chain1_3 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,18 Chain0_4 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,19 Chain1_4 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,19 Chain0_5 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,20 Chain1_5 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,20 Chain0_6 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,21 Chain1_6 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,21 Chain0_7 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,22 Chain1_7 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,22 Chain0_8 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,23 Chain1_8 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,23 Chain0_9 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,24 Chain1_9 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,24 Chain0_10 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,25 Chain1_10 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,25 Chain0_11 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,26 Chain1_11 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,26 Chain0_12 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,27 Chain1_12 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,27 Chain0_13 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,28 Chain1_13 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,28 Chain0_14 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,29 Chain1_14 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,29 Chain0_36 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,30 Chain1_36 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,30 Chain0_40 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,31 Chain1_40 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,31 Chain0_44 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,32 Chain1_44 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,32 Chain0_48 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,33 Chain1_48 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,33 Chain0_52 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,34 Chain1_52 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,34 Chain0_56 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,35 Chain1_56 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,35 Chain0_60 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,36 Chain1_60 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,36 Chain0_64 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,37 Chain1_64 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,37 Chain0_100 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,38 Chain1_100 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,38 Chain0_104 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,39 Chain1_104 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,39 Chain0_108 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,40 Chain1_108 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,40 Chain0_112 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,41 Chain1_112 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,41 Chain0_116 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,42 Chain1_116 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,42 Chain0_120 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,43 Chain1_120 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,43 Chain0_124 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,44 Chain1_124 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,44 Chain0_128 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,45 Chain1_128 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,45 Chain0_132 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,46 Chain1_132 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,46 Chain0_136 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,47 Chain1_136 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,47 Chain0_140 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,48 Chain1_140 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,48 Chain0_144 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,49 Chain1_144 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,49 Chain0_149 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,50 Chain1_149 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,50 Chain0_153 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,51 Chain1_153 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,51 Chain0_157 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,52 Chain1_157 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,52 Chain0_161 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,53 Chain1_161 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,53 Chain0_165 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,54 Chain1_165 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,54 [Section 11: misc] DFS_switch = 1 power_save_switch = 2 ex-Fem_and_ex-LNA_param_setup = 3 rssi_report_diff = 4 [Section 12: debug reg] address = 0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x10,0x11,0x12,0x13,0x14,0x15,0x16 value = 0x1,0x19,0x2,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31 [Section 13: coex_config] bt_performance_cfg0 = 0x01010101 bt_performance_cfg1 = 0x01000000 wifi_performance_cfg0 = 0x01050A01 wifi_performance_cfg2 = 0x00000000 strategy_cfg0 = 0x01010100 strategy_cfg1 = 0x03000000 strategy_cfg2 = 0x08020000 compatibility_cfg0 = 0x04040000 compatibility_cfg1 = 0x0 ant_cfg0 = 0x7 ant_cfg1 = 0x0 isolation_cfg0 = 0x0 isolation_cfg1 = 0x0 reserved_cfg0 = 0x0 reserved_cfg1 = 0x0 reserved_cfg2 = 0x0 reserved_cfg3 = 0x0 reserved_cfg4 = 0x0 reserved_cfg5 = 0x0 reserved_cfg6 = 0x0 reserved_cfg7 = 0x0 [Section 14: rf_tlv_config] rf_config = 0xAA,0x55,0x00,0xFF,0xB,0xB,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x9,0x4,0x0,0xB5 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/uwe5631-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="uwe5631-aml" PKG_VERSION="c9621e32c743ed37bdb54a60f8aa8b329b4bb56f" PKG_SHA256="19764d9bf428fa480708a767c6bfc9ab755d2559f58e17fed0c3659aa8608b74" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/uwe5631-aml" PKG_URL="https://github.com/CoreELEC/uwe5631-aml/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="uwe5631-aml: Unisoc UWE5621 WIFI/BT driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" make_target() { echo "making WIFI" kernel_make -C ${PKG_BUILD} \ M=${PKG_BUILD} \ KERNEL_SRC=$(kernel_path) \ EXTRA_CFLAGS="-fno-pic -Wno-sizeof-pointer-memaccess -Wno-declaration-after-statement -I${PKG_BUILD}/BSP/include -DCUSTOMIZE_WIFI_CFG_PATH=\\\"/lib/firmware/unisoc\\\"" \ modules echo "making BT" kernel_make -C ${PKG_BUILD}/BT/tty-sdio \ M=${PKG_BUILD}/BT/tty-sdio \ KERNEL_SRC=$(kernel_path) \ CURFOLDER=${PKG_BUILD}/BSP \ modules } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' \ -exec cp {} ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} \; mkdir -p ${INSTALL}/$(get_kernel_overlay_dir)/lib/firmware/unisoc cp -av ${PKG_DIR}/firmware/*.ini \ ${PKG_BUILD}/BT/libbt/conf/sprd/runtime/*.ini \ ${PKG_BUILD}/BSP/fw/wcnmodem.bin \ ${INSTALL}/$(get_kernel_overlay_dir)/lib/firmware/unisoc } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/uwe5631-aml/system.d/sprd_sdio-firmware-aml.service ================================================ [Unit] Description=Attach /dev/ttyBT0 to BlueZ stack using sprd type ConditionPathExists=|!/sys/class/mmc_host/sdio/sdio:8800 ConditionPathExists=|!/sys/class/mmc_host/mmc2/mmc2:8800 Wants=bluetooth.service Before=bluetooth.service After=dev-ttyBT0.device [Service] Type=forking ExecStartPre=/usr/sbin/rfkill unblock bluetooth ExecStart=/usr/bin/hciattach -s 1500000 /dev/ttyBT0 sprd ExecStopPost=/usr/sbin/rfkill block bluetooth ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/uwe5631-aml/udev.d/80-unisoc_sdio.rules ================================================ ### UniSOC UWE5631 and UWE5621 kernel modules ACTION=="add", ENV{SUBSYSTEM}=="sdio", ENV{OF_NAME}=="wifi", ENV{OF_COMPATIBLE_0}=="sprd,unisoc-wifi", \ ATTRS{vendor}=="0x0000", ATTRS{device}=="0x0000", \ RUN{builtin}+="kmod load sprdwl_ng sprdbt_tty hci_uart", \ TAG+="systemd", ENV{SYSTEMD_WANTS}+="sprd_sdio-firmware-aml.service" ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/w1-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="w1-aml" PKG_VERSION="87d7603a6ec06688a3bb6bc68d9daad300e32de3" PKG_SHA256="a3f1aad71b82b3bf08ee4936dced1844bcb57fe0a814811754aa99981c44b3c6" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/w1-aml" PKG_URL="https://github.com/CoreELEC/w1-aml/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="Amlogic W150S1 Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" make_target() { if [ "${TARGET_ARCH}" = "arm" ]; then kernel_make -C $(kernel_path) M=${PKG_BUILD}/project_w1/vmac else kernel_make -C $(kernel_path) M=${PKG_BUILD}/project_w1/vmac \ subdir-ccflags-y="-mno-outline-atomics" fi } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} find ${PKG_BUILD}/project_w1/vmac/ -name \*.ko -not -path '*/\.*' -exec cp {} ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} \; mkdir -p ${INSTALL}/$(get_full_firmware_dir)/w1 cp ${PKG_BUILD}/project_w1/vmac/aml_wifi*.txt ${INSTALL}/$(get_full_firmware_dir)/w1 } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/w1-aml/udev.d/80-aml_sdio.rules ================================================ ### Amlogic W150S1 ### this driver is split in two individual kernel modules ENV{MODALIAS}=="?*", ENV{SUBSYSTEM}=="sdio", ENV{SDIO_ID}=="8888:8888", GOTO="load_module" GOTO="end" LABEL="load_module" ENV{MODALIAS}=="?*", ENV{SUBSYSTEM}=="sdio", RUN{builtin}+="kmod load aml_sdio", RUN{builtin}+="kmod load vlsicomm" LABEL="end" ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/wifi_dummy-aml/modules-load.d/wifi_dummy.conf ================================================ wifi_dummy ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/wifi_dummy-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="wifi_dummy-aml" PKG_VERSION="1.0" PKG_SHA256="" PKG_LICENSE="GPL" PKG_SITE="https://coreelec.org" PKG_URL="" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="$PKG_NAME: Linux driver" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" pre_make_target() { unset LDFLAGS } make_target() { kernel_make -C $(kernel_path) M=$PKG_BUILD } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/wifi_dummy-aml/sources/Makefile ================================================ obj-m += wifi_dummy.o ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/amlogic/wifi_dummy-aml/sources/wifi_dummy.c ================================================ #include <linux/delay.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("kszaq"); MODULE_DESCRIPTION("Amlogic WiFi power on and SDIO rescan module"); extern void extern_wifi_set_enable(int); extern void sdio_reinit(void); static int __init wifi_dummy_init(void) { printk(KERN_INFO "Triggered SDIO WiFi power on and bus rescan.\n"); extern_wifi_set_enable(0); msleep(300); extern_wifi_set_enable(1); msleep(300); sdio_reinit(); return 0; } static void __exit wifi_dummy_cleanup(void) { printk(KERN_INFO "Cleaning up module.\n"); } module_init(wifi_dummy_init); module_exit(wifi_dummy_cleanup); ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/gpu-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="gpu-aml" PKG_VERSION="be29f1f274e3798d3ab2d7c489e47f8de20e8cf3" PKG_SHA256="06ad5ca2ae39b032477e702169f2ad8b964b36a49d97c3055094943b12a7fa0c" PKG_LICENSE="GPL" PKG_SITE="https://coreelec.org" PKG_URL="https://github.com/khadas/android_hardware_arm_gpu/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="gpu-aml: Linux drivers for Mali GPUs found in Amlogic Meson SoCs" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" pre_configure_target() { sed -e "s|shell date|shell date -R|g" -i $PKG_BUILD/utgard/*/Kbuild sed -e "s|USING_GPU_UTILIZATION=1|USING_GPU_UTILIZATION=0|g" -i $PKG_BUILD/utgard/platform/Kbuild.amlogic } pre_make_target() { ln -s $PKG_BUILD/utgard/platform $PKG_BUILD/utgard/r7p0/platform } make_target() { kernel_make -C $(kernel_path) M=$PKG_BUILD/bifrost/r12p0/kernel/drivers/gpu/arm \ CONFIG_MALI_MIDGARD=m CONFIG_MALI_PLATFORM_NAME="devicetree" kernel_make -C $(kernel_path) M=$PKG_BUILD/utgard/r7p0 \ EXTRA_CFLAGS="-DCONFIG_MALI450=y" \ CONFIG_MALI400=m CONFIG_MALI450=y } makeinstall_target() { kernel_make -C $(kernel_path) M=$PKG_BUILD/bifrost/r12p0/kernel/drivers/gpu/arm \ INSTALL_MOD_PATH=$INSTALL/$(get_kernel_overlay_dir) INSTALL_MOD_STRIP=1 DEPMOD=: \ modules_install kernel_make -C $(kernel_path) M=$PKG_BUILD/utgard/r7p0 \ INSTALL_MOD_PATH=$INSTALL/$(get_kernel_overlay_dir) INSTALL_MOD_STRIP=1 DEPMOD=: \ modules_install } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/gpu-aml/patches/gpu-aml-ng-01-fix-cp-error.patch ================================================ diff -Naur gpu-aml-fe7a4d8.orig/utgard/r5p1/common/mali_group.c gpu-aml-fe7a4d8/utgard/r5p1/common/mali_group.c --- gpu-aml-fe7a4d8.orig/utgard/r5p1/common/mali_group.c 2017-12-08 12:39:53.000000000 +0100 +++ gpu-aml-fe7a4d8/utgard/r5p1/common/mali_group.c 2019-03-20 12:43:29.654721108 +0100 @@ -639,7 +639,7 @@ mali_pp_job_get_pid(job), mali_pp_job_get_tid(job), 0, 0, 0); #if defined(CONFIG_GPU_TRACEPOINTS) && defined(CONFIG_TRACEPOINTS) trace_gpu_sched_switch( - mali_pp_core_description(group->pp_core), + mali_pp_core_description(child->pp_core), sched_clock(), mali_pp_job_get_tid(job), 0, mali_pp_job_get_id(job)); #endif ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/gpu-aml/patches/gpu-aml-ng-02-disable-tracepoints.patch ================================================ From ec748a4e13a77f0cc1f7c0c80114fa167a363a9c Mon Sep 17 00:00:00 2001 From: cdu13a <cdu13a@gmail.com> Date: Mon, 26 Aug 2019 01:14:34 -0400 Subject: more fixups for 4.9 --- utgard/r5p1/common/mali_group.c | 4 ++++ utgard/r5p1/common/mali_scheduler.c | 4 ++++ utgard/r7p0/common/mali_group.c | 4 ++++ utgard/r7p0/common/mali_scheduler.c | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/utgard/r5p1/common/mali_group.c b/utgard/r5p1/common/mali_group.c index e174cdb..04b3e1e 100755 --- a/utgard/r5p1/common/mali_group.c +++ b/utgard/r5p1/common/mali_group.c @@ -29,6 +29,10 @@ #include "mali_executor.h" #include <mali_platform.h> +#ifdef CONFIG_GPU_TRACEPOINTS +#undef CONFIG_GPU_TRACEPOINTS +#endif + #if defined(CONFIG_GPU_TRACEPOINTS) && defined(CONFIG_TRACEPOINTS) #include <linux/sched.h> #include <trace/events/gpu.h> diff --git a/utgard/r5p1/common/mali_scheduler.c b/utgard/r5p1/common/mali_scheduler.c index b07f78a..8523c65 100755 --- a/utgard/r5p1/common/mali_scheduler.c +++ b/utgard/r5p1/common/mali_scheduler.c @@ -23,6 +23,10 @@ #include "mali_memory_dma_buf.h" #endif +#ifdef CONFIG_GPU_TRACEPOINTS +#undef CONFIG_GPU_TRACEPOINTS +#endif + #if defined(CONFIG_GPU_TRACEPOINTS) && defined(CONFIG_TRACEPOINTS) #include <linux/sched.h> #include <trace/events/gpu.h> diff --git a/utgard/r7p0/common/mali_group.c b/utgard/r7p0/common/mali_group.c index 26cbce4..bb9b21b 100644 --- a/utgard/r7p0/common/mali_group.c +++ b/utgard/r7p0/common/mali_group.c @@ -30,6 +30,10 @@ #include "mali_executor.h" #include <mali_platform.h> +#ifdef CONFIG_GPU_TRACEPOINTS +#undef CONFIG_GPU_TRACEPOINTS +#endif + #if defined(CONFIG_GPU_TRACEPOINTS) && defined(CONFIG_TRACEPOINTS) #include <linux/sched.h> #include <trace/events/gpu.h> diff --git a/utgard/r7p0/common/mali_scheduler.c b/utgard/r7p0/common/mali_scheduler.c index 68afc59..b513431 100644 --- a/utgard/r7p0/common/mali_scheduler.c +++ b/utgard/r7p0/common/mali_scheduler.c @@ -30,6 +30,10 @@ #endif #endif +#ifdef CONFIG_GPU_TRACEPOINTS +#undef CONFIG_GPU_TRACEPOINTS +#endif + #if defined(CONFIG_GPU_TRACEPOINTS) && defined(CONFIG_TRACEPOINTS) #include <linux/sched.h> #include <trace/events/gpu.h> -- 2.17.1 ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/openvfd-driver/openvfd.conf.d/hc4.conf ================================================ vfd_gpio_clk='0,0,0xFF' vfd_gpio_dat='0,0,0xFF' vfd_gpio_stb='0,0,0xFF' vfd_gpio_protocol='1,2' vfd_chars='0,1,2,3,4' vfd_dot_bits='0,1,2,3,4,5,6' vfd_display_type='0x3F,0x3C,0x20,0xFD' ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/openvfd-driver/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Arthur Liberman (arthur_liberman@hotmail.com) PKG_NAME="openvfd-driver" PKG_VERSION="3118dda3aeb5b2f02b0ac0b5d30cbef58947a805" PKG_SHA256="fd0f38d059536e30000d3e2de3802ee97f8eeb7aac74143f0e588f803921a5ad" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/arthur-liberman/linux_openvfd" PKG_URL="https://github.com/arthur-liberman/linux_openvfd/archive/$PKG_VERSION.tar.gz" PKG_SOURCE_DIR="linux_openvfd-$PKG_VERSION*" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="openvfd-driver: an open source Linux driver for VFD displays" PKG_TOOLCHAIN="manual" pre_make_target() { unset LDFLAGS } make_target() { make ARCH=$TARGET_KERNEL_ARCH \ CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ -C "$(kernel_path)" M="$PKG_BUILD/driver" make OpenVFDService } makeinstall_target() { mkdir -p $INSTALL/$(get_full_module_dir)/$PKG_NAME find $PKG_BUILD/ -name \*.ko -not -path '*/\.*' -exec cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME \; mkdir -p $INSTALL/usr/sbin cp -P OpenVFDService $INSTALL/usr/sbin mkdir -p $INSTALL/usr/lib/coreelec cp $PKG_DIR/scripts/* $INSTALL/usr/lib/coreelec/ mkdir -p $INSTALL/etc/openvfd.conf.d/ cp $PKG_DIR/openvfd.conf.d/* $INSTALL/etc/openvfd.conf.d/ } post_install() { enable_service openvfd.service } ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/openvfd-driver/scripts/openvfd-start ================================================ #!/bin/sh OSRELEASEFILE="/etc/os-release" USRCONFFILE="/storage/.config/vfd.conf" SYSCONFDIR="/etc/openvfd.conf.d" PROC_DT="/proc/device-tree" DT_ID=$(dtname) case $DT_ID in *odroid_hc4*) SYSCONFFILE="$SYSCONFDIR/hc4.conf" ;; esac if [ "$(tr -d '\0' < $PROC_DT/openvfd/compatible)" = "open,vfd" ]; then if [ -f "$USRCONFFILE" ]; then source "$USRCONFFILE" elif [ -f "$SYSCONFFILE" ]; then source "$SYSCONFFILE" else exit 0 fi OS_SPLASH_OPT="" if [ -f "$OSRELEASEFILE" ]; then source "$OSRELEASEFILE" OS_SPLASH_OPT="-s CE${VERSION_ID%%.*}" fi /sbin/modprobe openvfd vfd_gpio_clk=${vfd_gpio_clk} \ vfd_gpio_dat=${vfd_gpio_dat} \ vfd_gpio_stb=${vfd_gpio_stb:-0,0,0xFF} \ vfd_gpio0=${vfd_gpio0:-0,0,0xFF} \ vfd_gpio1=${vfd_gpio1:-0,0,0xFF} \ vfd_gpio2=${vfd_gpio2:-0,0,0xFF} \ vfd_gpio3=${vfd_gpio3:-0,0,0xFF} \ vfd_gpio_protocol=${vfd_gpio_protocol:-0,0} \ vfd_chars=${vfd_chars} vfd_dot_bits=${vfd_dot_bits} \ vfd_display_type=${vfd_display_type} /usr/sbin/OpenVFDService $OS_SPLASH_OPT ${clock_12h_format:+-12h} fi ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/openvfd-driver/system.d/openvfd.service ================================================ [Unit] Description=OpenVFD Service ConditionPathExists=/proc/device-tree/openvfd/ After=local-fs.target [Service] ExecStart=/usr/lib/coreelec/openvfd-start ExecStop=/bin/kill -TERM $MAINPID ExecStopPost=-/usr/sbin/rmmod openvfd RemainAfterExit=yes [Install] WantedBy=basic.target ================================================ FILE: projects/Amlogic-ce/packages/linux-drivers/smartchip/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="smartchip" PKG_VERSION="5d41ac040ecd2072498da88100305c1b444c12c7" PKG_SHA256="89fde1c8d4850f72e821f044ff7050e4a0093b94a207b6478d31a5eaae40fddc" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/smartchip" PKG_URL="https://github.com/CoreELEC/smartchip/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="SmartChip Integrated Circuits" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" make_target() { for module in s9083 s9188 richv300; do echo echo "making ${module}..." kernel_make -C ${PKG_BUILD}/trunk_driver \ KSRC=$(kernel_path) \ CONFIG_DRIVER_VER="${PKG_VERSION}" \ CONFIG_DBG_COLOR=n \ CONFIG_HIF_PORT=sdio \ CONFIG_CHIP=${module} \ HOST_PLAT=amlogic905W2 mv ${PKG_BUILD}/trunk_driver/*.ko ${PKG_BUILD} kernel_make -C ${PKG_BUILD}/trunk_driver \ KSRC=$(kernel_path) \ clean done } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} find ${PKG_BUILD}/ -name \*.ko -not -path '*/\.*' -exec cp {} ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} \; mkdir -p ${INSTALL}/$(get_full_firmware_dir)/smartchip cp -r ${PKG_BUILD}/trunk_driver/fw/*.bin ${INSTALL}/$(get_full_firmware_dir) cp -r ${PKG_BUILD}/trunk_driver/wifi.cfg ${INSTALL}/$(get_full_firmware_dir)/smartchip } ================================================ FILE: projects/Amlogic-ce/packages/linux-firmware/amlogic/bl301_091020/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Team CoreELEC (https://coreelec.org) . $(get_pkg_directory bl301_xxxxxx)/package.mk BL2_MIN_VERSION="091020" PKG_NAME="bl301_${BL2_MIN_VERSION}" PKG_VERSION="fa9eb8911b119f0d09001faff3155746ea3aee7d" PKG_SHA256="24304ad9d8ce6ab619d00043b454921b1bb0f2b4151832f2af8414cba05ad654" PKG_URL="https://github.com/CoreELEC/bl301/archive/$PKG_VERSION.tar.gz" ================================================ FILE: projects/Amlogic-ce/packages/linux-firmware/amlogic/bl301_221119/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Team CoreELEC (https://coreelec.org) . $(get_pkg_directory bl301_xxxxxx)/package.mk BL2_MIN_VERSION="221119" PKG_NAME="bl301_${BL2_MIN_VERSION}" PKG_VERSION="9565b2197eb9f829d1e4bffb6614f2318fd17544" PKG_SHA256="14c80afb31685061b0cbf0006a96f266faa8dd9ca97b1083cf89ad3bd73adf66" PKG_URL="https://github.com/CoreELEC/bl301/archive/$PKG_VERSION.tar.gz" ================================================ FILE: projects/Amlogic-ce/packages/linux-firmware/amlogic/bl301_xxxxxx/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) BL2_MIN_VERSION="xxxxxx" PKG_NAME="bl301_${BL2_MIN_VERSION}" PKG_VERSION="4a953954c3324afdbb1263d6a1389175692580d5" PKG_SHA256="bb2c5492a82b8d9db071602216abe5eeb5b9457fcb8e314a84e9c99db49e07fd" PKG_LICENSE="GPL" PKG_SITE="https://coreelec.org" PKG_URL="https://github.com/CoreELEC/bl301/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain gcc-linaro-aarch64-elf:host gcc-linaro-arm-eabi:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_TOOLCHAIN="manual" pre_make_target() { sed -i "s|arm-none-eabi-|arm-eabi-|g" $PKG_BUILD/Makefile $PKG_BUILD/arch/arm/cpu/armv8/*/firmware/scp_task/Makefile 2>/dev/null || true } make_target() { [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 export PATH=$TOOLCHAIN/lib/gcc-linaro-aarch64-elf/bin/:$TOOLCHAIN/lib/gcc-linaro-arm-eabi/bin/:$PATH DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make mrproper for f in $(find ${PKG_BUILD}/configs -mindepth 1); do PKG_UBOOT_CONFIG=$(basename -- "$f") PKG_BL301_SUBDEVICE=${PKG_UBOOT_CONFIG%_defconfig} echo Building bl301 for ${PKG_BL301_SUBDEVICE} DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make ${PKG_UBOOT_CONFIG} DEBUG=${PKG_DEBUG} CROSS_COMPILE=aarch64-elf- ARCH=arm CFLAGS="" LDFLAGS="" make HOSTCC="${HOST_CC}" HOSTSTRIP="true" bl301.bin mv ${PKG_BUILD}/build/scp_task/bl301.bin ${PKG_BUILD}/build/${PKG_BL301_SUBDEVICE}_bl301.bin echo "moved blob to: " ${PKG_BUILD}/build/${PKG_BL301_SUBDEVICE}_bl301.bin rm -rf ${PKG_BUILD}/build/scp_task done } makeinstall_target() { mkdir -p ${INSTALL}/usr/share/bootloader/bl301/${BL2_MIN_VERSION} for f in $(find ${PKG_BUILD}/configs -mindepth 1); do PKG_UBOOT_CONFIG=$(basename -- "$f") PKG_BL301_SUBDEVICE=${PKG_UBOOT_CONFIG%_defconfig} PKG_BIN=${PKG_BUILD}/build/${PKG_BL301_SUBDEVICE}_bl301.bin cp -av ${PKG_BIN} ${INSTALL}/usr/share/bootloader/bl301/${BL2_MIN_VERSION}/${PKG_BL301_SUBDEVICE}_bl301.bin done [ -d "${PKG_BUILD}/bl30" ] && cp -av ${PKG_BUILD}/bl30 ${INSTALL}/usr/share/bootloader/bl301/${BL2_MIN_VERSION} || : [ -d "${PKG_BUILD}/bl31" ] && cp -av ${PKG_BUILD}/bl31 ${INSTALL}/usr/share/bootloader/bl301/${BL2_MIN_VERSION} || : } ================================================ FILE: projects/Amlogic-ce/packages/linux-firmware/amlogic/qca-firmware-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team CoreELEC (https://coreelec.org) PKG_NAME="qca-firmware-aml" PKG_VERSION="56716df3468fd87ade0ac98af5ec687376e9b4ef" PKG_SHA256="4f3dd7ad50695c3f8205e38a1a703801d6033fcfda969c55606589229738178e" PKG_ARCH="arm aarch64" PKG_LICENSE="BSD-3c" PKG_SITE="https://github.com/CoreELEC/qca-firmware-aml" PKG_URL="https://github.com/CoreELEC/qca-firmware-aml/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="qca Linux firmware" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_firmware_dir) cp -a * ${INSTALL}/$(get_full_firmware_dir) # create a default firmware.conf for loading bluetooth NVM binaries # Possible parameter: # DEEP_SLEEP: Disable = 0 / Enable = 1 # PCM: Master = 0 / Slave = 1 mkdir -p ${INSTALL}/etc/bluetooth echo "DEEP_SLEEP=0 " > ${INSTALL}/etc/bluetooth/firmware.conf } ================================================ FILE: projects/Amlogic-ce/packages/linux-firmware/amlogic/qca-firmware-aml/system.d/qca-firmware-aml.service ================================================ [Unit] Description=Attach /dev/ttyS1 to BlueZ stack using qca type Wants=bluetooth.service Before=bluetooth.service After=dev-ttyS1.device StartLimitInterval=60 StartLimitBurst=2 [Service] Type=simple ExecStartPre=/usr/sbin/rfkill unblock bluetooth ExecStart=/usr/bin/hciattach -n -s 115200 /dev/ttyS1 qca 2000000 ExecStopPost=/usr/sbin/rfkill block bluetooth Restart=always RestartSec=2 LimitNPROC=1 TimeoutStopSec=1s ================================================ FILE: projects/Amlogic-ce/packages/linux-firmware/amlogic/qca-firmware-aml/udev.d/80-qca-firmware-aml.rules ================================================ ################################################################################ # udev rules file for loading qca-firmware-aml ################################################################################ ACTION=="add", SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x0271", ATTRS{device}=="0x0[578]0?", \ TAG+="systemd", ENV{SYSTEMD_WANTS}+="qca-firmware-aml.service" ================================================ FILE: projects/Amlogic-ce/packages/linux-firmware/amlogic/rtkbt-firmware-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="rtkbt-firmware-aml" PKG_VERSION="4d95579f256383af2df39d796f38a91ee6ec0b80" PKG_SHA256="7a2884532969f84596f469cde599b8ecc026e80263ae64c9faf0e22a0332f569" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/rtkbt-firmware-aml" PKG_URL="https://github.com/CoreELEC/rtkbt-firmware-aml/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain rtk_hciattach" PKG_LONGDESC="Realtek BT Linux firmware" PKG_TOOLCHAIN="manual" makeinstall_target() { FWDIR=$INSTALL/$(get_full_firmware_dir)/rtlbt mkdir -p $FWDIR cp -a $PKG_BUILD/* $FWDIR } ================================================ FILE: projects/Amlogic-ce/packages/linux-firmware/amlogic/rtkbt-firmware-aml/system.d/rtkbt-firmware-aml.service ================================================ [Unit] Description=Attach /dev/ttyS1 to BlueZ stack using rtk_h5 type Wants=bluetooth.service Before=bluetooth.service After=dev-ttyS1.device [Service] Type=simple ExecStartPre=/usr/sbin/rfkill unblock bluetooth ExecStart=/usr/bin/rtk_hciattach -n -s 115200 /dev/ttyS1 rtk_h5 ExecStopPost=/usr/sbin/rfkill block bluetooth ================================================ FILE: projects/Amlogic-ce/packages/linux-firmware/amlogic/rtkbt-firmware-aml/udev.d/80-rtkbt-firmware-aml.rules ================================================ ################################################################################ # udev rules file for loading realtek bt firmware ################################################################################ ACTION!="add", GOTO="end" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x024c", ATTRS{device}=="0xb723", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rtkbt-firmware-aml.service" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x024c", ATTRS{device}=="0xb822", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rtkbt-firmware-aml.service" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x024c", ATTRS{device}=="0xc822", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rtkbt-firmware-aml.service" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x024c", ATTRS{device}=="0xb852", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rtkbt-firmware-aml.service" GOTO="end" LABEL="end" ================================================ FILE: projects/Amlogic-ce/packages/linux-firmware/brcmfmac_sdio-firmware-aml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="brcmfmac_sdio-firmware-aml" PKG_VERSION="e267c5bd059ed3645c5ecdfa484fa8efa84488a3" PKG_SHA256="0bb6510be9063fa6db13f5f81b94962a4cdc801b3ae4c4e41c036c87af50b05e" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/brcmfmac_sdio-firmware-aml" PKG_URL="https://github.com/CoreELEC/brcmfmac_sdio-firmware-aml/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Firmware for brcm bluetooth chips used in some Amlogic based devices." makeinstall_target() { DESTDIR=$INSTALL FWDIR=$INSTALL/$(get_kernel_overlay_dir) make install cd $INSTALL/$(get_full_firmware_dir)/brcm for f in *.hcd; do ln -sr $f $(grep --text -o 'BCM[24]\S*' $f).hcd 2>/dev/null || true ln -sr $f $(grep --text -o 'BCM[24]\S*' $f | cut -c4-).hcd 2>/dev/null || true ln -sr $f $(echo $f | sed -r 's/[^.]*/\U&/') 2>/dev/null || true done ln -sr bcm4335_V0343.0353.hcd bcm4335a0.hcd 2>/dev/null || true ln -sr bcm4335_V0343.0353.hcd BCM4335A0.hcd 2>/dev/null || true } ================================================ FILE: projects/Amlogic-ce/packages/linux-firmware/brcmfmac_sdio-firmware-aml/system.d/brcmfmac_sdio-firmware-aml.service ================================================ [Unit] Description=Attach /dev/ttyS1 to BlueZ stack using bcm43xx type Wants=bluetooth.service Before=bluetooth.service After=dev-ttyS1.device [Service] Type=simple ExecStartPre=/usr/sbin/rfkill unblock bluetooth ExecStart=/usr/bin/hciattach -n -s 115200 /dev/ttyS1 bcm43xx 2000000 ExecStopPost=/usr/sbin/rfkill block bluetooth ================================================ FILE: projects/Amlogic-ce/packages/linux-firmware/brcmfmac_sdio-firmware-aml/system.d/brcmfmac_sdio-firmware@.service ================================================ [Unit] Description=Broadcom sdio firmware update for %I Wants=bluetooth.service Before=bluetooth.service After=dev-ttyS1.device [Service] Type=simple ExecStart=/usr/bin/brcm_patchram_plus --patchram /usr/lib/kernel-overlays/base/lib/firmware/brcm/%I.hcd --baudrate 2000000 --use_baudrate_for_download /dev/ttyS1 --enable_hci --no2bytes --tosleep=50000 ================================================ FILE: projects/Amlogic-ce/packages/linux-firmware/brcmfmac_sdio-firmware-aml/udev.d/80-brcmfmac_sdio.rules ================================================ ################################################################################ # udev rules file for loading brcmfmac_sdio-firmware-aml ################################################################################ ### Broadcom bcm43362/bcm20710a1 bluetooth device SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x02d0", ATTRS{device}=="0xa962", ACTION=="add", \ TAG+="systemd", ENV{SYSTEMD_WANTS}+="brcmfmac_sdio-firmware@bcm20710a1.service", GOTO="end" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x02d0", ACTION=="add", \ TAG+="systemd", ENV{SYSTEMD_WANTS}+="brcmfmac_sdio-firmware-aml.service" LABEL="end" ================================================ FILE: projects/Amlogic-ce/packages/linux-firmware/wlan-firmware/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="wlan-firmware" PKG_VERSION="2142727" PKG_SHA256="d03e3108ef18ec10774b601d06d8445aebbd3c39f8ea3ab2b20a26c62af3500f" PKG_LICENSE="Free-to-use" PKG_SITE="https://github.com/LibreELEC/wlan-firmware" PKG_URL="https://github.com/LibreELEC/wlan-firmware/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain rfkill" PKG_LONGDESC="wlan-firmware: firmwares for various WLAN drivers" PKG_TOOLCHAIN="manual" makeinstall_target() { DESTDIR=$INSTALL/$(get_kernel_overlay_dir) ./install } ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/CoreELEC-settings/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="CoreELEC-settings" PKG_VERSION="68e4e13ddeaf84d994aae0eb23d714b2c542ed57" PKG_SHA256="ecc26bda2bcdf2a4821b82aec440b80547002d5c02c63561109115b4fbb0dd19" PKG_LICENSE="GPL" PKG_SITE="https://coreelec.org" PKG_URL="https://github.com/CoreELEC/service.coreelec.settings/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain Python3 connman pygobject dbus-python" PKG_LONGDESC="CoreELEC-settings: is a settings dialog for CoreELEC" PKG_MAKE_OPTS_TARGET="DISTRONAME=$DISTRONAME ADDON_VERSION=$ADDON_VERSION ROOT_PASSWORD=$ROOT_PASSWORD" if [ "$DISPLAYSERVER" = "x11" ]; then PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET setxkbmap" else PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET bkeymaps" fi post_makeinstall_target() { mkdir -p $INSTALL/usr/lib/coreelec cp $PKG_DIR/scripts/* $INSTALL/usr/lib/coreelec ADDON_INSTALL_DIR=$INSTALL/usr/share/kodi/addons/service.coreelec.settings $TOOLCHAIN/bin/python -Wi -t -B $TOOLCHAIN/lib/$PKG_PYTHON_VERSION/compileall.py $ADDON_INSTALL_DIR/resources/lib/ -f rm -rf $(find $ADDON_INSTALL_DIR/resources/lib/ -name "*.py") $TOOLCHAIN/bin/python -Wi -t -B $TOOLCHAIN/lib/$PKG_PYTHON_VERSION/compileall.py $ADDON_INSTALL_DIR/oe.py -f rm -rf $ADDON_INSTALL_DIR/oe.py } post_install() { enable_service backup-restore.service enable_service factory-reset.service } ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/CoreELEC-settings/scripts/backup-restore ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /usr/lib/libreelec/functions # Get NAME, which is DISTRONAME, ie. CoreELEC . /etc/os-release hidecursor BACKUP_FILE=`ls -1 /storage/.restore/??????????????.tar 2>/dev/null | tail -1` if [ -f "$BACKUP_FILE" ] ; then echo "RESTORE IN PROGRESS" echo "" echo "Please do not reboot or turn off your ${NAME} device!" echo "" StartProgress spinner "Checking backup file... " tar tf $BACKUP_FILE &>/dev/null ret=$? if [ $ret -eq 0 ] ; then StopProgress "OK" echo echo "This may take some time to complete, please be patient." echo StartProgress spinner "Restoring... " rm -rf /storage/.kodi &>/dev/null rm -rf /storage/.cache &>/dev/null rm -rf /storage/.config &>/dev/null tar xf $BACKUP_FILE -C / &>/dev/null rm -f $BACKUP_FILE &>/dev/null # Leave a hint that we just did a restore echo "RESTORE" > /storage/.config/boot.hint sync StopProgress "done!" echo StartProgress countdown "Rebooting in 5s... " 5 "NOW" else StopProgress "FAILED" echo echo "Backup file is not valid, or corrupt." echo StartProgress spinner "Removing file to allow normal restart... " rm -f $BACKUP_FILE &>/dev/null sync StopProgress "done" echo StartProgress countdown "Rebooting in 30s... " 30 "NOW" fi fi sync reboot -f ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/CoreELEC-settings/scripts/factory-reset ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /usr/lib/libreelec/functions # Get NAME, which is DISTRONAME, ie. CoreELEC . /etc/os-release hidecursor label= target= uuid= ceemmc= get_target() { for arg in $(cat /proc/cmdline); do case $arg in disk=*) disk="${arg#*=}" case $disk in LABEL=*) label="${disk#*=}" target="$(blkid -L $label)" ;; UUID=*) uuid="${disk#*=}" target="$(blkid -U $uuid)" ;; FOLDER=*) ceemmc="yes" target="${disk#*=}" ;; /*) target="$disk" ;; esac ;; esac done } show_reset_msg() { echo "RESET IN PROGRESS" echo "" echo "Please do not reboot or turn off your ${NAME} device!" echo "" } if [ -f /storage/.cache/reset_hard ] ; then # hard reset rm -f /storage/.cache/reset_hard get_target if [ ! -z $target ] ; then show_reset_msg StartProgress spinner "Performing hard reset... " if [ "$ceemmc" = "yes" ] ; then # storage is just subfolder on Android data partition rm -rf /storage/* &>/dev/null rm -rf /storage/.[!.]* &>/dev/null else umount /storage mke2fs -t ext4 -m 0 $target &>/dev/null if [ ! -z $label ] ; then tune2fs -U random -L $label $target &>/dev/null fi if [ ! -z $uuid ] ; then tune2fs -U $uuid $target &>/dev/null fi fi StopProgress "done!" echo StartProgress countdown "Rebooting in 5s... " 5 "NOW" fi elif [ -f /storage/.cache/reset_soft ] ; then # soft reset rm -f /storage/.cache/reset_soft get_target if [ ! -z $target ] ; then show_reset_msg StartProgress spinner "Performing soft reset... " rm -rf /storage/.??* &>/dev/null # Leave a hint that we just did a soft reset mkdir -p /storage/.config echo "RESET-SOFT" > /storage/.config/boot.hint StopProgress "done!" echo StartProgress countdown "Rebooting in 5s... " 5 "NOW" fi fi sync reboot -f ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/CoreELEC-settings/system.d/backup-restore.service ================================================ [Unit] Description=Restoring Backup DefaultDependencies=no [Service] Type=idle ExecStart=/usr/lib/coreelec/backup-restore StandardInput=tty-force StandardOutput=inherit StandardError=inherit ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/CoreELEC-settings/system.d/backup-restore.target ================================================ [Unit] Description=Restoring Backup target Requires=backup-restore.service After=backup-restore.service AllowIsolate=yes ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/CoreELEC-settings/system.d/factory-reset.service ================================================ [Unit] Description=Factory reset DefaultDependencies=no [Service] Type=idle ExecStart=/usr/lib/coreelec/factory-reset StandardInput=tty-force StandardOutput=inherit StandardError=inherit ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/CoreELEC-settings/system.d/factory-reset.target ================================================ [Unit] Description=Factory reset target Requires=factory-reset.service After=factory-reset.service AllowIsolate=yes ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/config/advancedsettings.xml ================================================ <advancedsettings> <cputempcommand>/usr/bin/cputemp</cputempcommand> <gputempcommand>/usr/bin/gputemp</gputempcommand> <showexitbutton>false</showexitbutton> <remotedelay>1</remotedelay> <samba> <clienttimeout>30</clienttimeout> </samba> <splash>false</splash> </advancedsettings> ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/config/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8" ?> <settings version="1"> <section id="games"> <category id="gamesgeneral"> <group id="1"> <setting id="gamesgeneral.enablerewind"> <default>false</default> </setting> </group> </category> </section> <section id="system"> <category id="display"> <group id="1"> <setting id="videoscreen.screen"> <visible>false</visible> </setting> </group> <group id="3"> <setting id="videoscreen.noofbuffers"> <default>2</default> </setting> </group> </category> <category id="audio"> <group id="1"> <setting id="audiooutput.volumesteps"> <default>20</default> </setting> </group> </category> <category id="logging"> <group id="1"> <setting id="debug.screenshotpath"> <default>/storage/screenshots/</default> </setting> </group> </category> </section> <section id="services"> <category id="airplay"> <group id="1"> <setting id="services.airplay"> <default>true</default> </setting> </group> </category> <category id="smb"> <group id="2"> <setting id="smb.maxprotocol"> <default>0</default> </setting> </group> </category> </section> <section id="pvr"> <category id="epg"> <group id="2"> <setting id="epg.preventupdateswhileplayingtv"> <default>true</default> </setting> <setting id="epg.ignoredbforclient"> <default>true</default> </setting> </group> </category> <category id="pvrplayback"> <group id="1"> <setting id="pvrplayback.signalquality"> <default>false</default> </setting> </group> </category> <category id="pvrpowermanagement"> <group id="1"> <setting id="pvrpowermanagement.setwakeupcmd"> <default>/usr/bin/setwakeup.sh</default> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/config/guisettings.xml ================================================ <settings version="2"> <general> <settinglevel>2</settinglevel> </general> </settings> ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/config/kodi.conf.in ================================================ KODI_AE_SINK=@KODI_AE_SINK@ HOME=/storage KODI_TEMP=/storage/.kodi/temp KODI_HOME=/usr/share/kodi/ ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/config/network_wait ================================================ WAIT_NETWORK="true" WAIT_NETWORK_TIME="10" WAIT_NETWORK_DEFAULT="true" ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/config/repository.coreelec/addon.xml ================================================ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="@ADDON_REPO_ID@" name="@ADDON_REPO_NAME@" version="@ADDON_VERSION@" provider-name="CoreELEC"> <extension point="xbmc.addon.repository" name="@ADDON_REPO_NAME@"> <dir> <info>@ADDON_URL@/addons.xml.gz</info> <checksum verify="sha256">@ADDON_URL@/addons.xml.gz?sha256</checksum> <datadir>@ADDON_URL@</datadir> </dir> </extension> <extension point="xbmc.addon.metadata"> <summary>@ADDON_REPO_NAME@</summary> <description>The CoreELEC add-on repository contains Kodi PVR Clients and Servers, Screensavers, Visualisations, and more. Add-ons in this repository are maintained and supported by CoreELEC staff and YOU the community. If you find a broken or non-working add-on please report it via the forums, or help by submitting fixes via GitHub.</description> <platform>all</platform> </extension> </addon> ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/config/sources.xml ================================================ <sources> <video> <default pathversion="1"></default> <source> <name>Videos</name> <path pathversion="1">/storage/videos/</path> <allowsharing>true</allowsharing> </source> <source> <name>TV Shows</name> <path pathversion="1">/storage/tvshows/</path> <allowsharing>true</allowsharing> </source> </video> <music> <default pathversion="1"></default> <source> <name>Music</name> <path pathversion="1">/storage/music/</path> <allowsharing>true</allowsharing> </source> </music> <pictures> <default pathversion="1"></default> <source> <name>Pictures</name> <path pathversion="1">/storage/pictures/</path> <allowsharing>true</allowsharing> </source> </pictures> </sources> ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/debug.d/kodi.conf ================================================ KODI_DEBUG="--debug" ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-2018 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2020-present Team CoreELEC (https://coreelec.tv) PKG_NAME="kodi" PKG_VERSION="513bcee15b79c4b75dabaf054f89f1aacd256248" PKG_SHA256="343f3b132903ed1c4057380592029639ac556f20a576a91b06b7a654d54e7a28" PKG_LICENSE="GPL" PKG_SITE="http://www.kodi.tv" PKG_URL="https://github.com/CoreELEC/xbmc/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain JsonSchemaBuilder:host TexturePacker:host Python3 zlib systemd lzo pcre swig:host libass curl fontconfig fribidi tinyxml libjpeg-turbo freetype libcdio taglib libxml2 libxslt rapidjson sqlite ffmpeg crossguid libfmt lirc libfstrcmp flatbuffers:host flatbuffers libudfread spdlog obu_util" PKG_DEPENDS_HOST="toolchain" PKG_LONGDESC="A free and open source cross-platform media player." PKG_BUILD_FLAGS="+speed" post_unpack() { if [ -f ${DISTRO_DIR}/${DISTRO}/splash/${DEVICE}/splash-1080.png ]; then rm -rf $(get_build_dir ${PKG_NAME})/media/splash.* cp -PR ${DISTRO_DIR}/${DISTRO}/splash/${DEVICE}/splash-1080.png $(get_build_dir ${PKG_NAME})/media/splash.png fi sed -e "s|@ADDON_REPO_ID@|${ADDON_REPO_ID}|g" -i $(get_build_dir ${PKG_NAME})/version.txt sed -e "s|@ADDON_SERVER_URL@|${ADDON_SERVER_URL}|g" -i $(get_build_dir ${PKG_NAME})/version.txt # don't build internal TexturePacker sed -i 's|set(INTERNAL_TEXTUREPACKER_INSTALLABLE TRUE|set(INTERNAL_TEXTUREPACKER_INSTALLABLE FALSE|' \ $(get_build_dir ${PKG_NAME})/cmake/modules/buildtools/FindTexturePacker.cmake } configure_package() { # Single threaded LTO is very slow so rely on Kodi for parallel LTO support if [ "${LTO_SUPPORT}" = "yes" ] && ! build_with_debug; then PKG_KODI_USE_LTO="-DUSE_LTO=${CONCURRENCY_MAKE_LEVEL}" fi # Set linker options case $(get_target_linker) in gold) PKG_KODI_LINKER="-DENABLE_GOLD=ON \ -DENABLE_MOLD=OFF" ;; mold) PKG_KODI_LINKER="-DENABLE_GOLD=OFF \ -DENABLE_MOLD=ON \ -DMOLD_EXECUTABLE=${TOOLCHAIN}/${TARGET_NAME}/bin/mold" ;; *) PKG_KODI_LINKER="-DENABLE_GOLD=OFF \ -DENABLE_MOLD=OFF" ;; esac get_graphicdrivers PKG_DEPENDS_TARGET+=" dbus" if [ "${DEVICE}" = "Amlogic-ng-dv" ]; then PKG_DEPENDS_TARGET+=" libdovi" PKG_CMAKE_OPTS_TARGET+=" -DENABLE_LIBDOVI=ON" fi if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" libX11 libXext libdrm libXrandr" KODI_PLATFORM="-DCORE_PLATFORM_NAME=x11 \ -DAPP_RENDER_SYSTEM=gl" elif [ "${DISPLAYSERVER}" = "wl" ]; then PKG_DEPENDS_TARGET+=" wayland waylandpp" PKG_PATCH_DIRS+=" wayland" CFLAGS+=" -DEGL_NO_X11" CXXFLAGS+=" -DEGL_NO_X11" KODI_PLATFORM="-DCORE_PLATFORM_NAME=wayland \ -DAPP_RENDER_SYSTEM=gles \ -DWAYLANDPP_SCANNER=${TOOLCHAIN}/bin/wayland-scanner++ \ -DWAYLANDPP_PROTOCOLS_DIR=${SYSROOT_PREFIX}/usr/share/waylandpp/protocols" fi if [ ! "${OPENGL}" = "no" ]; then PKG_DEPENDS_TARGET+=" ${OPENGL} glu" fi if [ "${OPENGLES_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi if [ "${KODI_ALSA_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" alsa-lib" KODI_ALSA="-DENABLE_ALSA=ON" else KODI_ALSA="-DENABLE_ALSA=OFF" fi if [ "${KODI_PULSEAUDIO_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" pulseaudio" KODI_PULSEAUDIO="-DENABLE_PULSEAUDIO=ON" else KODI_PULSEAUDIO="-DENABLE_PULSEAUDIO=OFF" fi if [ "${ESPEAK_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" espeak-ng" fi if [ "${KODI_PIPEWIRE_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" pipewire" KODI_PIPEWIRE="-DENABLE_PIPEWIRE=ON" if [ "${KODI_PULSEAUDIO_SUPPORT}" = "yes" -o "${KODI_ALSA_SUPPORT}" = "yes" ]; then die "KODI_PULSEAUDIO_SUPPORT and KODI_ALSA_SUPPORT cannot be used with KODI_PIPEWIRE_SUPPORT" fi else KODI_PIPEWIRE="-DENABLE_PIPEWIRE=OFF" fi if [ "${CEC_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libcec" KODI_CEC="-DENABLE_CEC=ON" else 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 KODI_OPTICAL="-DENABLE_OPTICAL=OFF" fi if [ "${KODI_BLURAY_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libbluray" KODI_BLURAY="-DENABLE_BLURAY=ON" else KODI_BLURAY="-DENABLE_BLURAY=OFF" fi if [ "${AVAHI_DAEMON}" = yes ]; then PKG_DEPENDS_TARGET+=" avahi nss-mdns" KODI_AVAHI="-DENABLE_AVAHI=ON" else KODI_AVAHI="-DENABLE_AVAHI=OFF" fi case "${KODI_MYSQL_SUPPORT}" in mysql) PKG_DEPENDS_TARGET+=" mysql" KODI_MYSQL="-DENABLE_MYSQLCLIENT=ON -DENABLE_MARIADBCLIENT=OFF" ;; mariadb) PKG_DEPENDS_TARGET+=" mariadb-connector-c" KODI_MYSQL="-DENABLE_MARIADBCLIENT=ON -DENABLE_MYSQLCLIENT=OFF" ;; *) KODI_MYSQL="-DENABLE_MYSQLCLIENT=OFF -DENABLE_MARIADBCLIENT=OFF" esac if [ "${KODI_AIRPLAY_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libplist" KODI_AIRPLAY="-DENABLE_PLIST=ON" else KODI_AIRPLAY="-DENABLE_PLIST=OFF" fi if [ "${KODI_AIRTUNES_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libshairplay" KODI_AIRTUNES="-DENABLE_AIRTUNES=ON" else KODI_AIRTUNES="-DENABLE_AIRTUNES=OFF" fi if [ "${KODI_NFS_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libnfs" KODI_NFS="-DENABLE_NFS=ON" else KODI_NFS="-DENABLE_NFS=OFF" fi if [ "${KODI_SAMBA_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" samba" KODI_SAMBA="-DENABLE_SMBCLIENT=ON" else KODI_SAMBA="-DENABLE_SMBCLIENT=OFF" fi if [ "${KODI_WEBSERVER_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libmicrohttpd" fi if [ "${KODI_UPNP_SUPPORT}" = yes ]; then KODI_UPNP="-DENABLE_UPNP=ON" else KODI_UPNP="-DENABLE_UPNP=OFF" fi if [ "${TARGET_ARCH}" = "aarch64" -o "${TARGET_ARCH}" = "arm" ]; then if target_has_feature neon; then KODI_NEON="-DENABLE_NEON=ON" else KODI_NEON="-DENABLE_NEON=OFF" fi else KODI_NEON="" fi if [ "${VDPAU_SUPPORT}" = "yes" -a "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" libvdpau" KODI_VDPAU="-DENABLE_VDPAU=ON" else KODI_VDPAU="-DENABLE_VDPAU=OFF" fi if [ "${VAAPI_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" libva" KODI_VAAPI="-DENABLE_VAAPI=ON" else KODI_VAAPI="-DENABLE_VAAPI=OFF" fi if [ "${TARGET_ARCH}" = "x86_64" ]; then KODI_ARCH="-DWITH_CPU=${TARGET_ARCH}" else KODI_ARCH="-DWITH_ARCH=${TARGET_ARCH}" fi if [ ! "${KODIPLAYER_DRIVER}" = "default" -a "${DISPLAYSERVER}" = "no" ]; then PKG_DEPENDS_TARGET+=" ${KODIPLAYER_DRIVER} libinput libxkbcommon" if [ "${OPENGLES_SUPPORT}" = yes -a "${KODIPLAYER_DRIVER}" = "${OPENGLES}" ]; then KODI_PLATFORM="-DCORE_PLATFORM_NAME=gbm -DAPP_RENDER_SYSTEM=gles" CFLAGS+=" -DEGL_NO_X11" CXXFLAGS+=" -DEGL_NO_X11" if [ "${PROJECT}" = "Generic" ]; then PKG_APPLIANCE_XML="${PKG_DIR}/config/appliance-gbm-generic.xml" else PKG_APPLIANCE_XML="${PKG_DIR}/config/appliance-gbm.xml" fi elif [ "${KODIPLAYER_DRIVER}" = libamcodec ]; then KODI_PLATFORM="-DCORE_PLATFORM_NAME=aml -DAPP_RENDER_SYSTEM=gles" PKG_APPLIANCE_XML_G12X="${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/kodi/g12x/appliance.xml" PKG_APPLIANCE_XML_GXX="${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/kodi/gxx/appliance.xml" fi fi PKG_CMAKE_OPTS_TARGET="-DNATIVEPREFIX=${TOOLCHAIN} \ -DWITH_TEXTUREPACKER=${TOOLCHAIN}/bin/TexturePacker \ -DWITH_JSONSCHEMABUILDER=${TOOLCHAIN}/bin/JsonSchemaBuilder \ -DDEPENDS_PATH=${PKG_BUILD}/depends \ -DSWIG_EXECUTABLE=${TOOLCHAIN}/bin/swig \ -DPYTHON_EXECUTABLE=${TOOLCHAIN}/bin/${PKG_PYTHON_VERSION} \ -DPYTHON_INCLUDE_DIRS=${SYSROOT_PREFIX}/usr/include/${PKG_PYTHON_VERSION} \ -DGIT_VERSION=${PKG_VERSION} \ -DFFMPEG_PATH=${SYSROOT_PREFIX}/usr \ -DENABLE_INTERNAL_FFMPEG=OFF \ -DENABLE_INTERNAL_CROSSGUID=OFF \ -DENABLE_INTERNAL_UDFREAD=OFF \ -DENABLE_INTERNAL_SPDLOG=OFF \ -DENABLE_INTERNAL_RapidJSON=OFF \ -DENABLE_UDEV=ON \ -DENABLE_DBUS=ON \ -DENABLE_XSLT=ON \ -DENABLE_CCACHE=OFF \ -DENABLE_LIRCCLIENT=ON \ -DENABLE_EVENTCLIENTS=ON \ -DENABLE_DEBUGFISSION=OFF \ -DENABLE_APP_AUTONAME=OFF \ -DENABLE_TESTING=OFF \ -DENABLE_INTERNAL_FLATBUFFERS=OFF \ -DENABLE_LCMS2=OFF \ -DADDONS_CONFIGURE_AT_STARTUP=OFF \ ${PKG_KODI_USE_LTO} \ ${PKG_KODI_LINKER} \ ${KODI_ARCH} \ ${KODI_NEON} \ ${KODI_VDPAU} \ ${KODI_VAAPI} \ ${KODI_CEC} \ ${KODI_PLATFORM} \ ${KODI_SAMBA} \ ${KODI_NFS} \ ${KODI_AVAHI} \ ${KODI_UPNP} \ ${KODI_MYSQL} \ ${KODI_AIRPLAY} \ ${KODI_AIRTUNES} \ ${KODI_OPTICAL} \ ${KODI_BLURAY} \ ${KODI_ALSA} \ ${KODI_PULSEAUDIO} \ ${KODI_PIPEWIRE}" } prepare_libdvd_library() { # arg1 is library name libdvdcss/libdvdnav/libdvdread local LIBRARY_VERSION="$(awk -F= '/VERSION=/ {print $2}' ${PKG_BUILD}/tools/depends/target/${1}/${1^^}-VERSION)" local LIBRARY_SHA512="$(awk -F= '/SHA512=/ {print $2}' ${PKG_BUILD}/tools/depends/target/${1}/${1^^}-VERSION)" local LIBRARY_ARCHIVE="${SOURCES}/${1}/${1}-${LIBRARY_VERSION}.tar.gz" if [ -f "${LIBRARY_ARCHIVE}" ]; then local LIBRARY_ARCHIVE_SHA512="$(sha512sum "${LIBRARY_ARCHIVE}" | cut -d ' ' -f 1)" if [ "${LIBRARY_ARCHIVE_SHA512}" = "${LIBRARY_SHA512}" ]; then KODI_LIBDVD+=" -D${1^^}_URL=${LIBRARY_ARCHIVE}" fi fi } configure_host() { setup_toolchain target:cmake cmake ${CMAKE_GENERATOR_NINJA} \ -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CONF} \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \ -DHEADERS_ONLY=ON \ ${KODI_ARCH} \ ${KODI_NEON} \ ${KODI_PLATFORM} .. } make_host() { : } makeinstall_host() { DESTDIR=${SYSROOT_PREFIX} cmake -DCMAKE_INSTALL_COMPONENT="kodi-addon-dev" -P cmake_install.cmake # more binaddons cross compile badness meh sed -e "s:INCLUDE_DIR /usr/include/kodi:INCLUDE_DIR ${SYSROOT_PREFIX}/usr/include/kodi:g" \ -e "s:CMAKE_MODULE_PATH /usr/lib/kodi /usr/share/kodi/cmake:CMAKE_MODULE_PATH ${SYSROOT_PREFIX}/usr/share/kodi/cmake:g" \ -i ${SYSROOT_PREFIX}/usr/lib/kodi/cmake/KodiConfig.cmake } pre_configure_target() { export LIBS="${LIBS} -lncurses" if [ "${KODI_DVDCSS_SUPPORT}" = yes ]; then KODI_LIBDVD="-DENABLE_DVDCSS=ON" prepare_libdvd_library libdvdcss else KODI_LIBDVD="-DENABLE_DVDCSS=OFF" fi prepare_libdvd_library libdvdnav prepare_libdvd_library libdvdread PKG_CMAKE_OPTS_TARGET+=" ${KODI_LIBDVD}" } post_make_target() { for libname in libdvdcss libdvdnav libdvdread; do mkdir -p "${SOURCES}/${libname}" cp "${PKG_BUILD}/.${TARGET_NAME}/build/download/${libname}"* "${SOURCES}/${libname}" || : done } post_makeinstall_target() { mkdir -p ${INSTALL}/.noinstall mv ${INSTALL}/usr/share/kodi/addons/skin.estouchy \ ${INSTALL}/usr/share/kodi/addons/skin.estuary \ ${INSTALL}/usr/share/kodi/addons/service.xbmc.versioncheck \ ${INSTALL}/.noinstall rm -rf ${INSTALL}/usr/bin/kodi rm -rf ${INSTALL}/usr/bin/kodi-standalone rm -rf ${INSTALL}/usr/bin/xbmc rm -rf ${INSTALL}/usr/bin/xbmc-standalone rm -rf ${INSTALL}/usr/share/kodi/cmake rm -rf ${INSTALL}/usr/share/applications rm -rf ${INSTALL}/usr/share/icons rm -rf ${INSTALL}/usr/share/pixmaps rm -rf ${INSTALL}/usr/share/xsessions mkdir -p ${INSTALL}/usr/lib/kodi cp ${PKG_DIR}/scripts/kodi-config ${INSTALL}/usr/lib/kodi cp ${PKG_DIR}/scripts/kodi-after ${INSTALL}/usr/lib/kodi cp ${PKG_DIR}/scripts/kodi-safe-mode ${INSTALL}/usr/lib/kodi cp ${PKG_DIR}/scripts/kodi.sh ${INSTALL}/usr/lib/kodi if [ "${PROJECT}" = "Amlogic-ce" ]; then cp ${PKG_DIR}/scripts/aml-wait-for-dispcap.sh ${INSTALL}/usr/lib/kodi fi # Configure safe mode triggers - default 5 restarts within 900 seconds/15 minutes sed -e "s|@KODI_MAX_RESTARTS@|${KODI_MAX_RESTARTS:-5}|g" \ -e "s|@KODI_MAX_SECONDS@|${KODI_MAX_SECONDS:-900}|g" \ -i ${INSTALL}/usr/lib/kodi/kodi.sh if [ "${KODI_PIPEWIRE_SUPPORT}" = "yes" ]; then KODI_AE_SINK="PIPEWIRE" elif [ "${KODI_PULSEAUDIO_SUPPORT}" = "yes" -a "${KODI_ALSA_SUPPORT}" = "yes" ]; then KODI_AE_SINK="ALSA+PULSE" elif [ "${KODI_PULSEAUDIO_SUPPORT}" = "yes" -a "${KODI_ALSA_SUPPORT}" != "yes" ]; then KODI_AE_SINK="PULSE" elif [ "${KODI_PULSEAUDIO_SUPPORT}" != "yes" -a "${KODI_ALSA_SUPPORT}" = "yes" ]; then KODI_AE_SINK="ALSA" fi # adjust audio output device to what was built sed "s/@KODI_AE_SINK@/${KODI_AE_SINK}/" ${PKG_DIR}/config/kodi.conf.in > ${INSTALL}/usr/lib/kodi/kodi.conf # set default display environment if [ "${DISPLAYSERVER}" = "x11" ]; then echo "DISPLAY=:0.0" >> ${INSTALL}/usr/lib/kodi/kodi.conf elif [ "${DISPLAYSERVER}" = "wl" ]; then echo "WAYLAND_DISPLAY=wayland-1" >> ${INSTALL}/usr/lib/kodi/kodi.conf fi # nvidia: Enable USLEEP to reduce CPU load while rendering if listcontains "${GRAPHIC_DRIVERS}" "nvidia" || listcontains "${GRAPHIC_DRIVERS}" "nvidia-legacy"; then echo "__GL_YIELD=USLEEP" >> ${INSTALL}/usr/lib/kodi/kodi.conf fi mkdir -p ${INSTALL}/usr/sbin cp ${PKG_DIR}/scripts/service-addon-wrapper ${INSTALL}/usr/sbin mkdir -p ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/kodi-remote ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/setwakeup.sh ${INSTALL}/usr/bin cp ${PKG_DIR}/scripts/pastekodi ${INSTALL}/usr/bin ln -sf /usr/bin/pastekodi ${INSTALL}/usr/bin/pastecrash mkdir -p ${INSTALL}/usr/share/kodi/addons cp -R ${PKG_DIR}/config/repository.coreelec ${INSTALL}/usr/share/kodi/addons/${ADDON_REPO_ID} sed -e "s|@ADDON_URL@|${ADDON_URL}|g" -i ${INSTALL}/usr/share/kodi/addons/${ADDON_REPO_ID}/addon.xml sed -e "s|@ADDON_REPO_ID@|${ADDON_REPO_ID}|g" -i ${INSTALL}/usr/share/kodi/addons/${ADDON_REPO_ID}/addon.xml sed -e "s|@ADDON_REPO_NAME@|${ADDON_REPO_NAME}|g" -i ${INSTALL}/usr/share/kodi/addons/${ADDON_REPO_ID}/addon.xml sed -e "s|@ADDON_VERSION@|${ADDON_VERSION}|g" -i ${INSTALL}/usr/share/kodi/addons/${ADDON_REPO_ID}/addon.xml mkdir -p ${INSTALL}/usr/share/kodi/config ln -sf /run/libreelec/cacert.pem ${INSTALL}/usr/share/kodi/system/certs/cacert.pem mkdir -p ${INSTALL}/usr/share/kodi/system/settings ${PKG_DIR}/scripts/xml_merge.py ${PKG_DIR}/config/guisettings.xml \ ${PROJECT_DIR}/${PROJECT}/kodi/guisettings.xml \ ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/kodi/guisettings.xml \ > ${INSTALL}/usr/share/kodi/config/guisettings.xml ${PKG_DIR}/scripts/xml_merge.py ${PKG_DIR}/config/sources.xml \ ${PROJECT_DIR}/${PROJECT}/kodi/sources.xml \ ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/kodi/sources.xml \ > ${INSTALL}/usr/share/kodi/config/sources.xml ${PKG_DIR}/scripts/xml_merge.py ${PKG_DIR}/config/advancedsettings.xml \ ${PROJECT_DIR}/${PROJECT}/kodi/advancedsettings.xml \ ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/kodi/advancedsettings.xml \ > ${INSTALL}/usr/share/kodi/system/advancedsettings.xml ln -sf /var/share/kodi/system/settings/appliance.xml ${INSTALL}/usr/share/kodi/system/settings/appliance.xml ${PKG_DIR}/scripts/xml_merge.py ${PKG_DIR}/config/appliance.xml \ ${PKG_APPLIANCE_XML_G12X} \ ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/kodi/appliance.xml \ > ${INSTALL}/usr/share/kodi/system/settings/appliance.g12x.xml ${PKG_DIR}/scripts/xml_merge.py ${PKG_DIR}/config/appliance.xml \ ${PKG_APPLIANCE_XML_GXX} \ ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/kodi/appliance.xml \ > ${INSTALL}/usr/share/kodi/system/settings/appliance.gxx.xml mkdir -p ${INSTALL}/usr/cache/coreelec cp ${PKG_DIR}/config/network_wait ${INSTALL}/usr/cache/coreelec # update addon manifest ADDON_MANIFEST=${INSTALL}/usr/share/kodi/system/addon-manifest.xml xmlstarlet ed -L -d "/addons/addon[text()='service.xbmc.versioncheck']" ${ADDON_MANIFEST} xmlstarlet ed -L -d "/addons/addon[text()='skin.estouchy']" ${ADDON_MANIFEST} xmlstarlet ed -L --subnode "/addons" -t elem -n "addon" -v "${ADDON_REPO_ID}" ${ADDON_MANIFEST} if [ -n "${DISTRO_PKG_SETTINGS}" ]; then xmlstarlet ed -L --subnode "/addons" -t elem -n "addon" -v "${DISTRO_PKG_SETTINGS_ID}" ${ADDON_MANIFEST} fi # more binaddons cross compile badness meh sed -e "s:INCLUDE_DIR /usr/include/kodi:INCLUDE_DIR ${SYSROOT_PREFIX}/usr/include/kodi:g" \ -e "s:CMAKE_MODULE_PATH /usr/lib/kodi /usr/share/kodi/cmake:CMAKE_MODULE_PATH ${SYSROOT_PREFIX}/usr/share/kodi/cmake:g" \ -i ${SYSROOT_PREFIX}/usr/lib/kodi/cmake/KodiConfig.cmake if [ "${KODI_EXTRA_FONTS}" = yes ]; then mkdir -p ${INSTALL}/usr/share/kodi/media/Fonts cp ${PKG_DIR}/fonts/*.ttf ${INSTALL}/usr/share/kodi/media/Fonts fi # Compile kodi Python site-packages to .pyc bytecode, and remove .py source code python_compile ${INSTALL}/usr/lib/${PKG_PYTHON_VERSION}/site-packages/kodi debug_strip ${INSTALL}/usr/lib/kodi/kodi.bin } post_install() { enable_service kodi.target enable_service kodi-autostart.service enable_service kodi-cleanlogs.service enable_service kodi-halt.service enable_service kodi-poweroff.service enable_service kodi-reboot.service enable_service kodi-waitonnetwork.service enable_service kodi.service enable_service kodi-lirc-suspend.service enable_service kodi-cleanpackagecache.service } ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/profile.d/00-addons.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # addons profile.d/*.profile for config in /storage/.kodi/addons/*/profile.d/*.profile; do if [ -f "$config" ] ; then . $config fi done oe_setup_addon() { if [ ! -z $1 ] ; then DEF="/storage/.kodi/addons/$1/settings-default.xml" CUR="/storage/.kodi/userdata/addon_data/$1/settings.xml" # export some useful variables ADDON_DIR="$HOME/.kodi/addons/$1" ADDON_HOME="$HOME/.kodi/userdata/addon_data/$1" ADDON_LOG_FILE="$ADDON_HOME/service.log" [ ! -d $ADDON_HOME ] && mkdir -p $ADDON_HOME # copy defaults if [ -f "$DEF" -a ! -f "$CUR" ] ; then cp "$DEF" "$CUR" fi # parse config for xml_file in "$DEF" "$CUR"; do if [ -f "$xml_file" ]; then XML_SETTINGS_VER="$(xmlstarlet sel -t -m settings -v @version $xml_file)" if [ "$XML_SETTINGS_VER" = "2" ]; then eval $(xmlstarlet sel -t -m settings/setting -v @id -o "=" -v . -n "$xml_file" | sed -e "s/'/'\\\\''/g; s/=/='/; s/$/'/") else eval $(xmlstarlet sel -t -m settings -m setting -v @id -o "=" -v @value -n "$xml_file" | sed -e "s/'/'\\\\''/g; s/=/='/; s/$/'/") fi fi done fi } ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/profile.d/99-kodi.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # PATH for addon in /storage/.kodi/addons/*/bin /usr/lib/kodi/addons/*/bin; do [ -d "$addon" ] && PATH="$PATH:$addon" done export PATH # LD_LIBRARY_PATH for addon in /storage/.kodi/addons/*/lib /usr/lib/kodi/addons/*/lib; do [ -d "$addon" ] && LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$addon" done export LD_LIBRARY_PATH ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/scripts/aml-wait-for-dispcap.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) WAIT=1 TIMEOUT=60 SYSTEMDISPCAP="/sys/class/amhdmitx/amhdmitx0/disp_cap" USERDIR="/storage/.kodi/userdata" USERDISPCAP="$USERDIR/disp_cap" USERDISPADD="$USERDIR/disp_add" TMPDISPADD="/run/disp_add" START=0 TIMEWAITED=0 if (! grep -q '[^[:space:]]' "$USERDISPCAP" 2> /dev/null); then while (! grep -q '[^[:space:]]' "$SYSTEMDISPCAP" 2> /dev/null) && [ $TIMEWAITED -le $TIMEOUT ]; do if [ $START -eq 0 ];then echo "Display not ready. No disp_cap." START=1 fi sleep "$WAIT" TIMEWAITED=$(( TIMEWAITED + WAIT )) done if [ $TIMEWAITED -ge $TIMEOUT ];then echo "Timeout: Display still not ready." echo "Starting Kodi anyway." if [ ! -f "$USERDISPADD" ]; then echo 1080p60hz > "$TMPDISPADD" fi fi fi ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/scripts/kodi-after ================================================ #!/bin/sh # # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Team CoreELEC (https://coreelec.org) BOOT_STATUS=$HOME/.config/boot.status BOOT_HINT=$HOME/.config/boot.hint BOOT_STATE="$(cat $BOOT_STATUS 2>/dev/null)" process_boot_hint() { if [ "${BOOT_STATE}" = "OK" ]; then echo "OK" > $BOOT_HINT fi return 0 } process_boot_hint exit 0 ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/scripts/kodi-config ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) KODI_ROOT=$HOME/.kodi BOOT_STATE="$(cat $HOME/.config/boot.status 2>/dev/null)" # May not exist if testing a clean /storage/.kodi without rebooting mkdir -p $KODI_ROOT/userdata # hack: make addon-bins executable # done in kodi on addon install. but just in case.. chmod +x $KODI_ROOT/addons/*/bin/* 2>/dev/null # remove any user installed CE repo [ -d $KODI_ROOT/addons/repository.coreelec ] && rm -rf $KODI_ROOT/addons/repository.coreelec # setup Kodi sources if [ ! -f $KODI_ROOT/userdata/sources.xml ]; then if [ -f /usr/share/kodi/config/sources.xml ]; then cp /usr/share/kodi/config/sources.xml $KODI_ROOT/userdata fi fi #choose libCEC version, default is libcec package version ln -sf /usr/lib/libcec.so.6.0.2 /var/lib/libcec.so.6 #device specific configs mkdir -p /var/share/kodi/system/settings/ if [ -d "/proc/device-tree/auge_sound" ]; then ln -sf /usr/share/kodi/system/settings/appliance.g12x.xml /var/share/kodi/system/settings/appliance.xml elif [ -d "/proc/device-tree/aml_sound_meson" ]; then ln -sf /usr/share/kodi/system/settings/appliance.gxx.xml /var/share/kodi/system/settings/appliance.xml fi # common setup guisettings if [ ! -f $KODI_ROOT/userdata/guisettings.xml ] ; then if [ -f /usr/share/kodi/config/guisettings.xml ]; then cp /usr/share/kodi/config/guisettings.xml $KODI_ROOT/userdata fi if [ "$BOOT_STATE" = "SAFE" ]; then [ ! -f $KODI_ROOT/userdata/guisettings.xml ] && echo '<settings version="2"></settings>' > $KODI_ROOT/userdata/guisettings.xml xmlstarlet ed --omit-decl --inplace -s settings -t elem -n setting -v "maroon" -i settings/setting -t attr -n id -v lookandfeel.skincolors $KODI_ROOT/userdata/guisettings.xml fi fi KODI_ARGS="" echo "KODI_ARGS=\"$KODI_ARGS\"" > /run/libreelec/kodi.conf if [ "$(uname -m)" = "x86_64" ]; then echo "MALLOC_MMAP_THRESHOLD_=524288" >> /run/libreelec/kodi.conf else #arm echo "MALLOC_MMAP_THRESHOLD_=8192" >> /run/libreelec/kodi.conf fi if [ -f /storage/.config/kodi.conf ] ; then cat /storage/.config/kodi.conf >>/run/libreelec/kodi.conf fi ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/scripts/kodi-remote ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) echo "Supported keys: ← ↑ ↓ → Left | Up | Down | Right Context Menu c Player Debug d Fullscreen f Info i Codec Info o Pause p Screenshot s Skin Debug t Stop x Volume Down - Volume Up + Back Backspace Select Enter Quit Remote q or ctrl+c " com() { kodi-send --action="$1" > /dev/null 2>&1 echo -ne "\r$1\e[K"; } while true; do read -r -sn1 k case "$k" in A) com "Up";; B) com "Down";; C) com "Right";; D) com "Left";; c) com "ContextMenu";; d) com "PlayerDebug";; f) com "FullScreen";; i) com "Info";; o) com "CodecInfo";; p) com "Pause";; s) com "TakeScreenshot";; t) com "Skin.ToggleDebug";; x) com "Stop";; -) com "VolumeDown";; +) com "VolumeUp";; $'\177') com "Back";; "") com "Select";; q) exit esac done ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/scripts/kodi-safe-mode ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) KODI_ROOT=$HOME/.kodi KODI_ROOT_FAILED=$KODI_ROOT.FAILED BOOT_STATUS=$HOME/.config/boot.status process_boot_status() { BOOT_STATE="$(cat $BOOT_STATUS 2>/dev/null)" if [ "${BOOT_STATE}" = "SAFE" ]; then if [ ! -d $KODI_ROOT_FAILED ]; then # entering safe mode - rename failed .kodi, and restart with clean .kodi mv $KODI_ROOT $KODI_ROOT_FAILED reboot else # exiting safe mode - restore failed .kodi rm -fr $KODI_ROOT mv $KODI_ROOT_FAILED $KODI_ROOT echo "OK" > $BOOT_STATUS fi else echo "OK" > $BOOT_STATUS fi return 0 } process_boot_status exit 0 ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/scripts/kodi.sh ================================================ #!/bin/sh # Copyright (C) 2008-2013 Team XBMC # http://xbmc.org # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. . /etc/profile trap cleanup TERM KODI_ROOT=$HOME/.kodi SAVED_ARGS="$@" CRASHLOG_DIR=$KODI_ROOT/temp BOOT_STATUS=$HOME/.config/boot.status NOSAFE_MODE=$HOME/.config/safemode.disable CRASH_HIST=/run/libreelec/crashes.dat KODI_MAX_RESTARTS=@KODI_MAX_RESTARTS@ KODI_MAX_SECONDS=@KODI_MAX_SECONDS@ cleanup() { # make systemd happy by not exiting immediately but # wait for kodi to exit while killall -0 kodi.bin &>/dev/null; do sleep 0.5 done } command_exists() { command -v $1 &>/dev/null } single_stacktrace() { # core filename is "core.*kodi.bin.*" find "$1" -name 'core.*kodi.bin.*' | while read core; do echo "=====> Core file: "$core"" >> $FILE echo " =========================================" >> $FILE if [ -f /storage/.config/debug.enhanced ]; then gdb /usr/lib/kodi/kodi.bin --core="$core" --batch -ex "thread apply all bt full" -ex "info registers" -ex "set print asm-demangle on" -ex "disassemble" 2>/dev/null >> $FILE else gdb /usr/lib/kodi/kodi.bin --core="$core" --batch -ex "thread apply all bt" 2>/dev/null >> $FILE fi rm -f "$core" done } detect_crash_loop() { # use monotonic time (in case date/time changes after booting) NOW_TIME=$(awk '/^now/ {print int($3 / 1000000000)}' /proc/timer_list) echo "$NOW_TIME" >> $CRASH_HIST NUM_RESTARTS=$(wc -l $CRASH_HIST | cut -d' ' -f1) FIRST_RESTART_TIME=$(tail -n $KODI_MAX_RESTARTS $CRASH_HIST | head -n 1) # kodi restart loop detected? fail this kodi install if [ $NUM_RESTARTS -ge $KODI_MAX_RESTARTS -a $KODI_MAX_SECONDS -ge $((NOW_TIME - FIRST_RESTART_TIME)) ]; then return 0 else return 1 fi } activate_safe_mode() { [ -f $NOSAFE_MODE ] && return 0 BOOT_STATE="$(cat $BOOT_STATUS 2>/dev/null)" if [ "${BOOT_STATE:-OK}" = "OK" ]; then # generate logfiles zip for the failed kodi /usr/bin/createlog lastlog=$(ls -1 /storage/logfiles/*.zip | tail -n 1) mv $lastlog /storage/logfiles/log-$(date -u +%Y-%m-%d-%H.%M.%S)-FAILED.zip echo "SAFE" > $BOOT_STATUS fi return 0 } print_crash_report() { mkdir -p $CRASHLOG_DIR DATE=`date +%Y%m%d%H%M%S` FILE="$CRASHLOG_DIR/.kodi_crashlog.log" echo "############## kodi CRASH LOG ###############" > $FILE echo >> $FILE echo "################ SYSTEM INFO ################" >> $FILE echo -n " Date: " >> $FILE date >> $FILE echo " kodi Options: $SAVED_ARGS" >> $FILE echo -n " Arch: " >> $FILE uname -m >> $FILE echo -n " Kernel: " >> $FILE uname -rvs >> $FILE echo -n " Release: " >> $FILE . /etc/os-release echo $NAME $VERSION >> $FILE echo "############## END SYSTEM INFO ##############" >> $FILE echo >> $FILE echo "############### STACK TRACE #################" >> $FILE if command_exists gdb; then single_stacktrace /storage/.cache/cores else echo "gdb not installed, can't get stack trace." >> $FILE fi echo "############# END STACK TRACE ###############" >> $FILE echo >> $FILE echo "################# LOG FILE ##################" >> $FILE echo >> $FILE cat $KODI_ROOT/temp/kodi.log >> $FILE echo >> $FILE echo "############### END LOG FILE ################" >> $FILE echo >> $FILE echo "############ END kodi CRASH LOG #############" >> $FILE OFILE="$FILE" FILE="$CRASHLOG_DIR/kodi_crashlog_$DATE.log" mv "$OFILE" "$FILE" ln -sf "$(basename $FILE)" "$CRASHLOG_DIR/kodi_crash.log" echo "Crash report available at $FILE" } if command_exists gdb; then ulimit -c unlimited fi # clean up any stale cores. just in case find /storage/.cache/cores -type f -delete # clean zero-byte database files that prevent migration/startup for file in $KODI_ROOT/userdata/Database/*.db; do if [ -e "$file" ]; then [ -s $file ] || rm -f $file fi done /usr/lib/kodi/kodi.bin $SAVED_ARGS RET=$? if [ $(( ($RET >= 131 && $RET <= 136) || $RET == 139 )) = "1" ] ; then # Crashed with core dump print_crash_report # Cleanup. Keep only youngest 10 reports but current in any case rm -f $(ls -1t $CRASHLOG_DIR/kodi_crashlog_*.log | grep -v "$FILE" | tail -n +10) # Enable safe mode if a crash loop is detected detect_crash_loop && activate_safe_mode fi # Filter Kodi powerdown/restartapp/reboot codes to satisfy systemd [ "$RET" -ge 64 -a "$RET" -le 66 ] && RET=0 exit $RET ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/scripts/pastekodi ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019 Team LibreELEC (https://libreelec.tv) # Copyright (C) 2019-present Team CoreELEC (https://coreelec.org) cat_data() { echo "========== ${1} ==========" cat } cat_file() { if [ -f "${1}" ]; then cat "${1}" | cat_data "${2:-${1}}" fi } usage() { [ -n "${1}" ] && echo "Unknown argument: ${1}" cat <<EOF Usage: $0 [-c] [-h] -c send output to stdout not via /usr/bin/pastebinit -h this help message EOF exit 1 } OUTPUT="/usr/bin/pastebinit" while getopts ":hc" opt; do case ${opt} in c) OUTPUT="cat";; ?) usage "${OPTARG}";; h) usage;; esac done source /etc/os-release SYSTEM_ARCH="${COREELEC_ARCH#*.}" # If running in SAFE mode, send FAILED logs if [ "$(cat "/storage/.config/boot.status" 2>/dev/null)" = "SAFE" ]; then KODI_ROOT="/storage/.kodi.FAILED/temp" else KODI_ROOT="/storage/.kodi/temp" fi if [ "$(basename $0)" = "pastekodi" ]; then LOG_TYPE="System" LOG_FILE="${KODI_ROOT}/kodi.log" else LOG_TYPE="Crash" LOG_FILE="${KODI_ROOT}/kodi_crash.log" fi ( echo "${LOG_TYPE} log output for: $(lsb_release)" if [ "${SYSTEM_ARCH}" = "x86_64" ]; then if [ -d "/sys/firmware/efi" ]; then echo "Firmware Boot Mode: EFI" else echo "Firmware Boot Mode: BIOS" fi fi if [ "${COREELEC_PROJECT}" = "RPi" ]; then echo "RPi Hardware Revision: $(vcgencmd otp_dump | grep 30: | cut -d: -f2)" fi cat_file "${LOG_FILE}" journalctl -a -b -0 -o short-precise | cat_data "journalctl -a -b -0" if [ "${COREELEC_PROJECT}" = "RPi" ]; then bootloader_version="$(vcgencmd bootloader_version)" if ! echo "${bootloader_version}" | grep -q "Command not registered"; then echo "${bootloader_version}" | cat_data "Bootloader version" fi fi cat_file "/flash/config.txt" # RPi cat_file "/flash/distroconfig.txt" # RPi cat_file "/flash/cmdline.txt" # RPi cat_file "/flash/syslinux.cfg" # x86 BIOS cat_file "/flash/EFI/BOOT/syslinux.cfg" # x86 EFI cat_file "/flash/extlinux.conf" # x86 legacy cat_file "/flash/extlinux/extlinux.conf" # u-boot cat_file "${KODI_ROOT}/.smb/smb.conf" cat_file "${KODI_ROOT}/.smb/user.conf" cat_file "/run/samba/smb.conf" pem_sys="$(sha256sum /etc/ssl/cacert.pem.system | cut -d' ' -f1)" pem_run="$(sha256sum /run/libreelec/cacert.pem | cut -d' ' -f1)" if [ "${pem_sys}" = "${pem_run}" ]; then cat_data "/run/libreelec/cacert.pem is default" </dev/null else cat_file /run/libreelec/cacert.pem "/run/libreelec/cacert.pem (modified)" fi if [ "${COREELEC_PROJECT}" = "Amlogic-ce" ]; then ce-debug -l | cat_data "ce-debug -l" fi ) | ${OUTPUT} 2>/dev/null ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/scripts/service-addon-wrapper ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) if [ $# -ne 3 ] ; then echo "$0 usage: context addon-id addon-path" exit 1 fi CONTEXT="$1" ADDON_ID="$2" ADDON_PATH="$3" if [ ! -d /storage/.config/system.d ] ; then mkdir -p /storage/.config/system.d fi SERVICE_FILE="${ADDON_PATH}/system.d/${ADDON_ID}.service" if [ -f "${SERVICE_FILE}" ] ; then case "${CONTEXT}" in enable) systemctl enable "${SERVICE_FILE}" chmod +x "${ADDON_PATH}/bin"/* systemctl start "${ADDON_ID}.service" ;; disable | pre-uninstall) systemctl stop "${ADDON_ID}.service" systemctl disable "${ADDON_ID}.service" ;; post-update) # post-update is triggered on update, # make sure to stop and re-install service systemctl stop "${ADDON_ID}.service" systemctl disable "${ADDON_ID}.service" systemctl enable "${SERVICE_FILE}" chmod +x "${ADDON_PATH}/bin"/* systemctl start "${ADDON_ID}.service" ;; restart) systemctl restart "${ADDON_ID}.service" ;; reload) systemctl reload "${ADDON_ID}.service" ;; *) echo "$0: unknown service context $CONTEXT" exit 1 ;; esac fi if [ ! -d /storage/.cache/kernel-overlays ] ; then mkdir -p /storage/.cache/kernel-overlays fi # kernel-overlay addons built into the image have their # files installed in the default /usr/lib/kernel-overlays # location, not inside the kodi addon dir case "${ADDON_PATH}" in /usr/share/kodi/addons/*) OVERLAY_PATH="/usr/lib/kernel-overlays/${ADDON_ID}" ;; *) OVERLAY_PATH="${ADDON_PATH}/kernel-overlay" ;; esac create_overlay_conf() { rm -f "${OVERLAY_CONF}" echo "${OVERLAY_PATH}" > "${OVERLAY_CONF}" } if [ -d "${OVERLAY_PATH}" ] ; then OVERLAY_CONF="/storage/.cache/kernel-overlays/50-${ADDON_ID}.conf" case "${CONTEXT}" in enable | post-update ) create_overlay_conf ;; disable | pre-uninstall ) rm -f "${OVERLAY_CONF}" ;; update ) if [ -e "${OVERLAY_CONF}" ] ; then create_overlay_conf fi ;; *) echo "$0: unknown overlay context $CONTEXT" exit 1 ;; esac fi ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/scripts/setwakeup.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) if [ -f /sys/class/rtc/rtc0/wakealarm ]; then logger -t setwakeup.sh "### Setting system wakeup time ###" echo 0 > /sys/class/rtc/rtc0/wakealarm echo $1 > /sys/class/rtc/rtc0/wakealarm logger -t setwakeup.sh "### $(cat /proc/driver/rtc) ###" fi ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/scripts/xml_merge.py ================================================ #!/usr/bin/env python3 # taken from http://stackoverflow.com/a/14879370 with minor modifications from __future__ import print_function import os import sys import xml.dom.minidom from xml.etree import ElementTree as et def printerr(*args, **kwargs): print(*args, file=sys.stderr, **kwargs) class hashabledict(dict): def __hash__(self): return hash(tuple(sorted(self.items()))) class XMLCombiner(object): def __init__(self, filenames): if len(filenames) == 0: raise Exception('No filenames!') try: self.roots = [] for f in filenames: self.roots.append(et.parse(f).getroot()) except xml.etree.ElementTree.ParseError: printerr("ERROR: Unable to parse XML file %s" % f) raise def prettyPrint(self, etree_xml): minidom = xml.dom.minidom.parseString(et.tostring(etree_xml)) return "\n".join([line for line in minidom.toprettyxml(indent=" ", encoding="utf-8").decode('utf-8').split('\n') if line.strip() != ""]) def combine(self): for r in self.roots[1:]: self.combine_element(self.roots[0], r) return self.prettyPrint(self.roots[0]) def combine_element(self, one, other): mapping = {(el.tag, hashabledict(el.attrib)): el for el in one} for el in other: if len(el) == 0: try: mapping[(el.tag, hashabledict(el.attrib))].text = el.text except KeyError: mapping[(el.tag, hashabledict(el.attrib))] = el one.append(el) else: try: self.combine_element(mapping[(el.tag, hashabledict(el.attrib))], el) except KeyError: mapping[(el.tag, hashabledict(el.attrib))] = el one.append(el) if __name__ == '__main__': xmlfiles = [file for file in sys.argv[1:] if os.path.exists(file)] r = XMLCombiner(xmlfiles).combine() print(r) ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/sleep.d/openelec-sleep.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /etc/profile run_scripts() { list_scripts $1 for script in $SCRIPTS ; do progress "running sleep script $script ($1)..." sh /usr/lib/systemd/system-sleep.serial/$script $1 done } list_scripts() { case $1 in pre) SCRIPTS=$(ls /usr/lib/systemd/system-sleep.serial/ | sort) ;; post) SCRIPTS=$(ls /usr/lib/systemd/system-sleep.serial/ | sort -r) ;; esac } run_scripts $1 exit 0 ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/sleep.d/wifi.power ================================================ #!/bin/sh case "$1" in pre) ;; post) connmanctl disable wifi sleep 5 connmanctl enable wifi ;; esac ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/sleep.d.serial/10-addon-sleep.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) . /etc/profile # see https://wiki.archlinux.org/index.php/Power_Management#Hooks_in_.2Fusr.2Flib.2Fsystemd.2Fsystem-sleep for script in $HOME/.kodi/addons/*/sleep.d/*.power; do if [ -f $script ]; then progress "running addon sleep script $script ($@)..." sh $script $@ fi done exit 0 ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/sleep.d.serial/20-custom-sleep.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) . /etc/profile # see https://wiki.archlinux.org/index.php/Power_Management#Hooks_in_.2Fusr.2Flib.2Fsystemd.2Fsystem-sleep for script in $HOME/.config/sleep.d/*.power; do if [ -f $script ]; then progress "running custom sleep script $script ($@)..." sh $script $@ fi done exit 0 ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/system.d/kodi-autostart.service ================================================ [Unit] Description=Kodi user autostart script Before=kodi.service After=network-online.target graphical.target [Service] Type=oneshot Environment=HOME=/storage ExecStart=-/bin/sh -c ". /etc/profile; test -f /storage/.config/autostart.sh && exec /bin/sh /storage/.config/autostart.sh" ExecStop=-/bin/sh -c ". /etc/profile; test -f /storage/.config/autostop.sh && exec /bin/sh /storage/.config/autostop.sh" RemainAfterExit=yes TimeoutStopSec=5min [Install] WantedBy=kodi.service ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/system.d/kodi-cleanlogs.service ================================================ [Unit] Description=Kodi clean debug logs ConditionKernelCommandLine=!debugging ConditionPathExists=!/storage/.cache/debug.libreelec Before=kodi.service [Service] Type=oneshot ExecStart=-/bin/sh -c 'rm -rf /storage/.kodi/userdata/addon_data/*/*.log /storage/.kodi/userdata/addon_data/*/log/*' RemainAfterExit=yes [Install] WantedBy=kodi.service ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/system.d/kodi-cleanpackagecache.service ================================================ [Unit] Description=Kodi clean package cache ConditionPathExists=/storage/.kodi/addons/packages Before=kodi.service [Service] Type=oneshot ExecStart=-/bin/sh -c 'rm -rf /storage/.kodi/addons/packages' RemainAfterExit=yes [Install] WantedBy=kodi.service ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/system.d/kodi-halt.service ================================================ [Unit] Description=Kodi halt script After=kodi.service Before=systemd-halt.service DefaultDependencies=no [Service] Type=oneshot Environment=HOME=/storage ExecStartPre=-/usr/lib/kodi/kodi-after ExecStart=-/bin/sh -c ". /etc/profile; exec /bin/sh /storage/.config/shutdown.sh halt" RemainAfterExit=yes [Install] WantedBy=halt.target ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/system.d/kodi-lirc-suspend.service ================================================ [Unit] Description=LIRC sleep hook Before=sleep.target StopWhenUnneeded=yes [Service] Type=oneshot RemainAfterExit=yes ExecStart=-/usr/bin/kodi-send --host=127.0.0.1 -a "LIRC.Stop" ExecStop=-/usr/bin/kodi-send --host=127.0.0.1 -a "LIRC.Start" [Install] WantedBy=sleep.target ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/system.d/kodi-poweroff.service ================================================ [Unit] Description=Kodi poweroff script After=kodi.service Before=systemd-poweroff.service DefaultDependencies=no [Service] Type=oneshot Environment=HOME=/storage ExecStartPre=-/usr/lib/kodi/kodi-after ExecStart=-/bin/sh -c ". /etc/profile; exec /bin/sh /storage/.config/shutdown.sh poweroff" RemainAfterExit=yes [Install] WantedBy=poweroff.target ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/system.d/kodi-reboot.service ================================================ [Unit] Description=Kodi reboot script After=kodi.service Before=systemd-reboot.service DefaultDependencies=no [Service] Type=oneshot Environment=HOME=/storage ExecStartPre=-/usr/lib/kodi/kodi-after ExecStart=-/bin/sh -c ". /etc/profile; exec /bin/sh /storage/.config/shutdown.sh reboot" RemainAfterExit=yes [Install] WantedBy=reboot.target ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/system.d/kodi-waitonnetwork.service ================================================ [Unit] Description=Wait on network After=connman.service Before=network-online.target DefaultDependencies=no Conflicts=shutdown.target ConditionFileNotEmpty=/storage/.cache/coreelec/network_wait ConditionPathExists=!/dev/.kernel_ipconfig ConditionPathExists=/storage/.kodi/userdata/addon_data/service.coreelec.settings/oe_settings.xml [Service] Type=oneshot EnvironmentFile=/storage/.cache/coreelec/network_wait ExecStart=/usr/sbin/connmand-wait-online --timeout=${WAIT_NETWORK_TIME} StandardOutput=tty RemainAfterExit=yes SuccessExitStatus=1 [Install] WantedBy=network-online.target ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/system.d/kodi.service ================================================ [Unit] Description=Kodi Media Center After=network-online.target graphical.target Requires=graphical.target Wants=network-online.target [Service] EnvironmentFile=/usr/lib/kodi/kodi.conf EnvironmentFile=-/run/libreelec/kodi.conf EnvironmentFile=-/run/libreelec/debug/kodi.conf ExecStartPre=-/usr/lib/kodi/aml-wait-for-dispcap.sh ExecStartPre=-/usr/lib/kodi/kodi-config ExecStart=/usr/lib/kodi/kodi.sh --standalone -fs $KODI_ARGS $KODI_DEBUG ExecStop=/bin/kill -TERM $MAINPID ExecStopPost=-/usr/lib/kodi/kodi-safe-mode TimeoutStopSec=30 Restart=always RestartSec=2 StartLimitInterval=0 LimitNOFILE=16384 TimeoutStartSec=300 [Install] WantedBy=kodi.target ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/system.d/kodi.target ================================================ [Unit] Description=Kodi Mediacenter Interface Requires=multi-user.target graphical.target network-online.target After=network-online.target graphical.target Wants=network-online.target Conflicts=rescue.target AllowIsolate=yes [Install] Alias=default.target ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/tmpfiles.d/kodi-userdirs.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) d /storage/music 0777 root root - - d /storage/pictures 0777 root root - - d /storage/tvshows 0777 root root - - d /storage/videos 0777 root root - - d /storage/screenshots 0777 root root - - ================================================ FILE: projects/Amlogic-ce/packages/mediacenter/kodi/tmpfiles.d/kodi.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) d /run/kodi 0755 root root - - ================================================ FILE: projects/Amlogic-ce/packages/multimedia/libamcodec/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="libamcodec" PKG_LICENSE="proprietary" PKG_SITE="http://openlinux.amlogic.com" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="libamplayer: Interface library for Amlogic media codecs" PKG_TOOLCHAIN="manual" case "${DEVICE}" in Amlogic-ng*) PKG_VERSION="eb874808303936404027f3fc7f7434285d0a7d2f" PKG_SHA256="9465b1029aa8ca7e2d1c5ffc3c2c9c5c524682e1c84321d91766dbdc3f26ccb6" ;; Amlogic-ne) PKG_VERSION="0f27efb9e958eaa66144709f1964179a019f5c32" PKG_SHA256="9cd7497999bdf4a709aee8e0cefe51940b40b9091dc831dfc08509d82637da30" ;; esac PKG_SOURCE_NAME="${PKG_NAME}-${ARCH}-${PKG_VERSION}.tar.xz" PKG_URL="https://sources.coreelec.org/${PKG_SOURCE_NAME}" make_target() { cp -PR * $SYSROOT_PREFIX } makeinstall_target() { mkdir -p $INSTALL/usr cp -PR usr/lib $INSTALL/usr } ================================================ FILE: projects/Amlogic-ce/packages/multimedia/libdovi/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team CoreELEC (https://coreelec.org) PKG_NAME="libdovi" PKG_VERSION="3ec01dccbf5a74dfc7c58e3864029187b715344f" PKG_SITE="https://github.com/quietvoid/dovi_tool" PKG_DEPENDS_TARGET="toolchain" if [ "${BUILD_FROM_SRC}" = "yes" ]; then PKG_SHA256="9483c81af5ca34ad8081ee71b0c31bdb92114d29bdcb664774ede4071c3fcea2" PKG_URL="https://github.com/quietvoid/dovi_tool/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET+=" cargo-c:host" else case "${TARGET_ARCH}" in "arm") PKG_SHA256="e034776d5e8fbad6f22092cd06c7a94252962467de7ae298cc98f2823281f8fa" ;; "aarch64") PKG_SHA256="6807b37cb55d49953196cc150941e6fe26c7deb42e25d266d82bb37b29e3c612" ;; esac PKG_SOURCE_NAME="${PKG_NAME}-${ARCH}-${PKG_VERSION}.tar.xz" PKG_URL="https://sources.coreelec.org/${PKG_SOURCE_NAME}" fi PKG_LICENSE="MIT" PKG_LONGDESC="dovi_tool is a CLI tool combining multiple utilities for working with Dolby Vision." PKG_TOOLCHAIN="manual" if [ "${BUILD_FROM_SRC}" = "yes" ]; then pre_make_target() { CARGO_BASE_OPTS="--manifest-path ${PKG_BUILD}/dolby_vision/Cargo.toml \ --target ${TARGET_NAME}" CARGO_BUILD_OPTS="--library-type staticlib \ --profile release \ --prefix /usr ${CARGO_BASE_OPTS}" } make_target() { cargo fetch ${CARGO_BASE_OPTS} cargo cbuild ${CARGO_BUILD_OPTS} } makeinstall_target() { cargo cinstall ${CARGO_BUILD_OPTS} --destdir ${SYSROOT_PREFIX} cargo cinstall ${CARGO_BUILD_OPTS} --destdir ${INSTALL} } else make_target() { cp -PR * ${SYSROOT_PREFIX} } makeinstall_target() { : # } fi ================================================ FILE: projects/Amlogic-ce/packages/multimedia/obu_util/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="obu_util" PKG_VERSION="0.1" PKG_SHA256="" PKG_LICENSE="GPL" PKG_SITE="https://aomedia.googlesource.com/aom/+/refs/tags/v3.3.0/av1/common/obu_util.c" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="av1 obu_util" PKG_TOOLCHAIN="manual" make_target() { ${CC} *.c -c -I. ${CFLAGS} ${AR} -rcs libobu_util.a *.o ${RANLIB} libobu_util.a } makeinstall_target() { mkdir -p ${SYSROOT_PREFIX}/usr/{lib,include} cp libobu_util.a ${SYSROOT_PREFIX}/usr/lib cp obu_util.h aom_codec.h aom_image.h aom_integer.h ${SYSROOT_PREFIX}/usr/include } ================================================ FILE: projects/Amlogic-ce/packages/multimedia/obu_util/sources/aom_codec.h ================================================ /* * Copyright (c) 2016, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ /////////////////////////////////////////////////////////////////////////////// // Internal implementation details /////////////////////////////////////////////////////////////////////////////// // // There are two levels of interfaces used to access the AOM codec: the // the aom_codec_iface and the aom_codec_ctx. // // 1. aom_codec_iface_t // (Related files: aom/aom_codec.h, aom/src/aom_codec.c, // aom/internal/aom_codec_internal.h, av1/av1_cx_iface.c, // av1/av1_dx_iface.c) // // Used to initialize the codec context, which contains the configuration for // for modifying the encoder/decoder during run-time. See the other // documentation in this header file for more details. For the most part, // users will call helper functions, such as aom_codec_iface_name, // aom_codec_get_caps, etc., to interact with it. // // The main purpose of the aom_codec_iface_t is to provide a way to generate // a default codec config, find out what capabilities the implementation has, // and create an aom_codec_ctx_t (which is actually used to interact with the // codec). // // Note that the implementations for the AV1 algorithm are located in // av1/av1_cx_iface.c and av1/av1_dx_iface.c // // // 2. aom_codec_ctx_t // (Related files: aom/aom_codec.h, av1/av1_cx_iface.c, av1/av1_dx_iface.c, // aom/aomcx.h, aom/aomdx.h, aom/src/aom_encoder.c, aom/src/aom_decoder.c) // // The actual interface between user code and the codec. It stores the name // of the codec, a pointer back to the aom_codec_iface_t that initialized it, // initialization flags, a config for either encoder or the decoder, and a // pointer to internal data. // // The codec is configured / queried through calls to aom_codec_control, // which takes a control ID (listed in aomcx.h and aomdx.h) and a parameter. // In the case of "getter" control IDs, the parameter is modified to have // the requested value; in the case of "setter" control IDs, the codec's // configuration is changed based on the parameter. Note that a aom_codec_err_t // is returned, which indicates if the operation was successful or not. // // Note that for the encoder, the aom_codec_alg_priv_t points to the // the aom_codec_alg_priv structure in av1/av1_cx_iface.c, and for the decoder, // the struct in av1/av1_dx_iface.c. Variables such as AV1_COMP cpi are stored // here and also used in the core algorithm. // // At the end, aom_codec_destroy should be called for each initialized // aom_codec_ctx_t. /*!\defgroup codec Common Algorithm Interface * This abstraction allows applications to easily support multiple video * formats with minimal code duplication. This section describes the interface * common to all codecs (both encoders and decoders). * @{ */ /*!\file * \brief Describes the codec algorithm interface to applications. * * This file describes the interface between an application and a * video codec algorithm. * * An application instantiates a specific codec instance by using * aom_codec_dec_init() or aom_codec_enc_init() and a pointer to the * algorithm's interface structure: * <pre> * my_app.c: * extern aom_codec_iface_t my_codec; * { * aom_codec_ctx_t algo; * int threads = 4; * aom_codec_dec_cfg_t cfg = { threads, 0, 0, 1 }; * res = aom_codec_dec_init(&algo, &my_codec, &cfg, 0); * } * </pre> * * Once initialized, the instance is managed using other functions from * the aom_codec_* family. */ #ifndef AOM_AOM_AOM_CODEC_H_ #define AOM_AOM_AOM_CODEC_H_ #ifdef __cplusplus extern "C" { #endif #include "aom_image.h" #include "aom_integer.h" /*!\brief Decorator indicating a function is deprecated */ #ifndef AOM_DEPRECATED #if defined(__GNUC__) && __GNUC__ #define AOM_DEPRECATED __attribute__((deprecated)) #elif defined(_MSC_VER) #define AOM_DEPRECATED #else #define AOM_DEPRECATED #endif #endif /* AOM_DEPRECATED */ #ifndef AOM_DECLSPEC_DEPRECATED #if defined(__GNUC__) && __GNUC__ #define AOM_DECLSPEC_DEPRECATED /**< \copydoc #AOM_DEPRECATED */ #elif defined(_MSC_VER) /*!\brief \copydoc #AOM_DEPRECATED */ #define AOM_DECLSPEC_DEPRECATED __declspec(deprecated) #else #define AOM_DECLSPEC_DEPRECATED /**< \copydoc #AOM_DEPRECATED */ #endif #endif /* AOM_DECLSPEC_DEPRECATED */ /*!\brief Decorator indicating a function is potentially unused */ #ifdef AOM_UNUSED #elif defined(__GNUC__) || defined(__clang__) #define AOM_UNUSED __attribute__((unused)) #else #define AOM_UNUSED #endif /*!\brief Decorator indicating that given struct/union/enum is packed */ #ifndef ATTRIBUTE_PACKED #if defined(__GNUC__) && __GNUC__ #define ATTRIBUTE_PACKED __attribute__((packed)) #elif defined(_MSC_VER) #define ATTRIBUTE_PACKED #else #define ATTRIBUTE_PACKED #endif #endif /* ATTRIBUTE_PACKED */ /*!\brief Current ABI version number * * \internal * If this file is altered in any way that changes the ABI, this value * must be bumped. Examples include, but are not limited to, changing * types, removing or reassigning enums, adding/removing/rearranging * fields to structures */ #define AOM_CODEC_ABI_VERSION (7 + AOM_IMAGE_ABI_VERSION) /**<\hideinitializer*/ /*!\brief Algorithm return codes */ typedef enum { /*!\brief Operation completed without error */ AOM_CODEC_OK, /*!\brief Unspecified error */ AOM_CODEC_ERROR, /*!\brief Memory operation failed */ AOM_CODEC_MEM_ERROR, /*!\brief ABI version mismatch */ AOM_CODEC_ABI_MISMATCH, /*!\brief Algorithm does not have required capability */ AOM_CODEC_INCAPABLE, /*!\brief The given bitstream is not supported. * * The bitstream was unable to be parsed at the highest level. The decoder * is unable to proceed. This error \ref SHOULD be treated as fatal to the * stream. */ AOM_CODEC_UNSUP_BITSTREAM, /*!\brief Encoded bitstream uses an unsupported feature * * The decoder does not implement a feature required by the encoder. This * return code should only be used for features that prevent future * pictures from being properly decoded. This error \ref MAY be treated as * fatal to the stream or \ref MAY be treated as fatal to the current GOP. */ AOM_CODEC_UNSUP_FEATURE, /*!\brief The coded data for this stream is corrupt or incomplete * * There was a problem decoding the current frame. This return code * should only be used for failures that prevent future pictures from * being properly decoded. This error \ref MAY be treated as fatal to the * stream or \ref MAY be treated as fatal to the current GOP. If decoding * is continued for the current GOP, artifacts may be present. */ AOM_CODEC_CORRUPT_FRAME, /*!\brief An application-supplied parameter is not valid. * */ AOM_CODEC_INVALID_PARAM, /*!\brief An iterator reached the end of list. * */ AOM_CODEC_LIST_END } aom_codec_err_t; /*! \brief Codec capabilities bitfield * * Each codec advertises the capabilities it supports as part of its * ::aom_codec_iface_t interface structure. Capabilities are extra interfaces * or functionality, and are not required to be supported. * * The available flags are specified by AOM_CODEC_CAP_* defines. */ typedef long aom_codec_caps_t; #define AOM_CODEC_CAP_DECODER 0x1 /**< Is a decoder */ #define AOM_CODEC_CAP_ENCODER 0x2 /**< Is an encoder */ /*! \brief Initialization-time Feature Enabling * * Certain codec features must be known at initialization time, to allow for * proper memory allocation. * * The available flags are specified by AOM_CODEC_USE_* defines. */ typedef long aom_codec_flags_t; /*!\brief Time Stamp Type * * An integer, which when multiplied by the stream's time base, provides * the absolute time of a sample. */ typedef int64_t aom_codec_pts_t; /*!\brief Codec interface structure. * * Contains function pointers and other data private to the codec * implementation. This structure is opaque to the application. Common * functions used with this structure: * - aom_codec_iface_name(aom_codec_iface_t *iface): get the * name of the codec * - aom_codec_get_caps(aom_codec_iface_t *iface): returns * the capabilities of the codec * - aom_codec_enc_config_default: generate the default config for * initializing the encoder (see documention in aom_encoder.h) * - aom_codec_dec_init, aom_codec_enc_init: initialize the codec context * structure (see documentation on aom_codec_ctx). * * To get access to the AV1 encoder and decoder, use aom_codec_av1_cx() and * aom_codec_av1_dx(). */ typedef const struct aom_codec_iface aom_codec_iface_t; /*!\brief Codec private data structure. * * Contains data private to the codec implementation. This structure is opaque * to the application. */ typedef struct aom_codec_priv aom_codec_priv_t; /*!\brief Compressed Frame Flags * * This type represents a bitfield containing information about a compressed * frame that may be useful to an application. The most significant 16 bits * can be used by an algorithm to provide additional detail, for example to * support frame types that are codec specific (MPEG-1 D-frames for example) */ typedef uint32_t aom_codec_frame_flags_t; #define AOM_FRAME_IS_KEY 0x1 /**< frame is the start of a GOP */ /*!\brief frame can be dropped without affecting the stream (no future frame * depends on this one) */ #define AOM_FRAME_IS_DROPPABLE 0x2 /*!\brief this is an INTRA_ONLY frame */ #define AOM_FRAME_IS_INTRAONLY 0x10 /*!\brief this is an S-frame */ #define AOM_FRAME_IS_SWITCH 0x20 /*!\brief this is an error-resilient frame */ #define AOM_FRAME_IS_ERROR_RESILIENT 0x40 /*!\brief this is a key-frame dependent recovery-point frame */ #define AOM_FRAME_IS_DELAYED_RANDOM_ACCESS_POINT 0x80 /*!\brief Iterator * * Opaque storage used for iterating over lists. */ typedef const void *aom_codec_iter_t; /*!\brief Codec context structure * * All codecs \ref MUST support this context structure fully. In general, * this data should be considered private to the codec algorithm, and * not be manipulated or examined by the calling application. Applications * may reference the 'name' member to get a printable description of the * algorithm. */ typedef struct aom_codec_ctx { const char *name; /**< Printable interface name */ aom_codec_iface_t *iface; /**< Interface pointers */ aom_codec_err_t err; /**< Last returned error */ const char *err_detail; /**< Detailed info, if available */ aom_codec_flags_t init_flags; /**< Flags passed at init time */ union { /**< Decoder Configuration Pointer */ const struct aom_codec_dec_cfg *dec; /**< Encoder Configuration Pointer */ const struct aom_codec_enc_cfg *enc; const void *raw; } config; /**< Configuration pointer aliasing union */ aom_codec_priv_t *priv; /**< Algorithm private storage */ } aom_codec_ctx_t; /*!\brief Bit depth for codec * * * This enumeration determines the bit depth of the codec. */ typedef enum aom_bit_depth { AOM_BITS_8 = 8, /**< 8 bits */ AOM_BITS_10 = 10, /**< 10 bits */ AOM_BITS_12 = 12, /**< 12 bits */ } aom_bit_depth_t; /*!\brief Superblock size selection. * * Defines the superblock size used for encoding. The superblock size can * either be fixed at 64x64 or 128x128 pixels, or it can be dynamically * selected by the encoder for each frame. */ typedef enum aom_superblock_size { AOM_SUPERBLOCK_SIZE_64X64, /**< Always use 64x64 superblocks. */ AOM_SUPERBLOCK_SIZE_128X128, /**< Always use 128x128 superblocks. */ AOM_SUPERBLOCK_SIZE_DYNAMIC /**< Select superblock size dynamically. */ } aom_superblock_size_t; /* * Library Version Number Interface * * For example, see the following sample return values: * aom_codec_version() (1<<16 | 2<<8 | 3) * aom_codec_version_str() "v1.2.3-rc1-16-gec6a1ba" * aom_codec_version_extra_str() "rc1-16-gec6a1ba" */ /*!\brief Return the version information (as an integer) * * Returns a packed encoding of the library version number. This will only * include the major.minor.patch component of the version number. Note that this * encoded value should be accessed through the macros provided, as the encoding * may change in the future. * */ int aom_codec_version(void); /*!\brief Return the major version number */ #define aom_codec_version_major() ((aom_codec_version() >> 16) & 0xff) /*!\brief Return the minor version number */ #define aom_codec_version_minor() ((aom_codec_version() >> 8) & 0xff) /*!\brief Return the patch version number */ #define aom_codec_version_patch() ((aom_codec_version() >> 0) & 0xff) /*!\brief Return the version information (as a string) * * Returns a printable string containing the full library version number. This * may contain additional text following the three digit version number, as to * indicate release candidates, prerelease versions, etc. * */ const char *aom_codec_version_str(void); /*!\brief Return the version information (as a string) * * Returns a printable "extra string". This is the component of the string * returned by aom_codec_version_str() following the three digit version number. * */ const char *aom_codec_version_extra_str(void); /*!\brief Return the build configuration * * Returns a printable string containing an encoded version of the build * configuration. This may be useful to aom support. * */ const char *aom_codec_build_config(void); /*!\brief Return the name for a given interface * * Returns a human readable string for name of the given codec interface. * * \param[in] iface Interface pointer * */ const char *aom_codec_iface_name(aom_codec_iface_t *iface); /*!\brief Convert error number to printable string * * Returns a human readable string for the last error returned by the * algorithm. The returned error will be one line and will not contain * any newline characters. * * * \param[in] err Error number. * */ const char *aom_codec_err_to_string(aom_codec_err_t err); /*!\brief Retrieve error synopsis for codec context * * Returns a human readable string for the last error returned by the * algorithm. The returned error will be one line and will not contain * any newline characters. * * * \param[in] ctx Pointer to this instance's context. * */ const char *aom_codec_error(aom_codec_ctx_t *ctx); /*!\brief Retrieve detailed error information for codec context * * Returns a human readable string providing detailed information about * the last error. * * \param[in] ctx Pointer to this instance's context. * * \retval NULL * No detailed information is available. */ const char *aom_codec_error_detail(aom_codec_ctx_t *ctx); /* REQUIRED FUNCTIONS * * The following functions are required to be implemented for all codecs. * They represent the base case functionality expected of all codecs. */ /*!\brief Destroy a codec instance * * Destroys a codec context, freeing any associated memory buffers. * * \param[in] ctx Pointer to this instance's context * * \retval #AOM_CODEC_OK * The codec algorithm initialized. * \retval #AOM_CODEC_MEM_ERROR * Memory allocation failed. */ aom_codec_err_t aom_codec_destroy(aom_codec_ctx_t *ctx); /*!\brief Get the capabilities of an algorithm. * * Retrieves the capabilities bitfield from the algorithm's interface. * * \param[in] iface Pointer to the algorithm interface * */ aom_codec_caps_t aom_codec_get_caps(aom_codec_iface_t *iface); /*!\name Codec Control * * The aom_codec_control function exchanges algorithm specific data with the * codec instance. Additionally, the macro AOM_CODEC_CONTROL_TYPECHECKED is * provided, which will type-check the parameter against the control ID before * calling aom_codec_control - note that this macro requires the control ID * to be directly encoded in it, e.g., * AOM_CODEC_CONTROL_TYPECHECKED(&ctx, AOME_SET_CPUUSED, 8). * * The codec control IDs can be found in aom.h, aomcx.h, and aomdx.h * (defined as aom_com_control_id, aome_enc_control_id, and aom_dec_control_id). * @{ */ /*!\brief Algorithm Control * * aom_codec_control takes a context, a control ID, and a third parameter * (with varying type). If the context is non-null and an error occurs, * ctx->err will be set to the same value as the return value. * * \param[in] ctx Pointer to this instance's context * \param[in] ctrl_id Algorithm specific control identifier. * Must be nonzero. * * \retval #AOM_CODEC_OK * The control request was processed. * \retval #AOM_CODEC_ERROR * The control request was not processed. * \retval #AOM_CODEC_INVALID_PARAM * The control ID was zero, or the data was not valid. */ aom_codec_err_t aom_codec_control(aom_codec_ctx_t *ctx, int ctrl_id, ...); /*!\brief Key & Value API * * aom_codec_set_option() takes a context, a key (option name) and a value. If * the context is non-null and an error occurs, ctx->err will be set to the same * value as the return value. * * \param[in] ctx Pointer to this instance's context * \param[in] name The name of the option (key) * \param[in] value The value of the option * * \retval #AOM_CODEC_OK * The value of the option was set. * \retval #AOM_CODEC_INVALID_PARAM * The data was not valid. * \retval #AOM_CODEC_ERROR * The option was not successfully set. */ aom_codec_err_t aom_codec_set_option(aom_codec_ctx_t *ctx, const char *name, const char *value); /*!\brief aom_codec_control wrapper macro (adds type-checking, less flexible) * * This macro allows for type safe conversions across the variadic parameter * to aom_codec_control(). However, it requires the explicit control ID * be passed in (it cannot be passed in via a variable) -- otherwise a compiler * error will occur. After the type checking, it calls aom_codec_control. */ #define AOM_CODEC_CONTROL_TYPECHECKED(ctx, id, data) \ aom_codec_control_typechecked_##id(ctx, id, data) /**<\hideinitializer*/ /*!\brief Creates typechecking mechanisms for aom_codec_control * * It defines a static function with the correctly typed arguments as a wrapper * to the type-unsafe aom_codec_control function. It also creates a typedef * for each type. */ #define AOM_CTRL_USE_TYPE(id, typ) \ static aom_codec_err_t aom_codec_control_typechecked_##id( \ aom_codec_ctx_t *, int, typ) AOM_UNUSED; \ static aom_codec_err_t aom_codec_control_typechecked_##id( \ aom_codec_ctx_t *ctx, int ctrl, typ data) { \ return aom_codec_control(ctx, ctrl, data); \ } /**<\hideinitializer*/ \ typedef typ aom_codec_control_type_##id; /*!@} end Codec Control group */ /*!\brief OBU types. */ typedef enum ATTRIBUTE_PACKED { OBU_SEQUENCE_HEADER = 1, OBU_TEMPORAL_DELIMITER = 2, OBU_FRAME_HEADER = 3, OBU_TILE_GROUP = 4, OBU_METADATA = 5, OBU_FRAME = 6, OBU_REDUNDANT_FRAME_HEADER = 7, OBU_TILE_LIST = 8, OBU_PADDING = 15, } OBU_TYPE; /*!\brief OBU metadata types. */ typedef enum { OBU_METADATA_TYPE_AOM_RESERVED_0 = 0, OBU_METADATA_TYPE_HDR_CLL = 1, OBU_METADATA_TYPE_HDR_MDCV = 2, OBU_METADATA_TYPE_SCALABILITY = 3, OBU_METADATA_TYPE_ITUT_T35 = 4, OBU_METADATA_TYPE_TIMECODE = 5, } OBU_METADATA_TYPE; /*!\brief Returns string representation of OBU_TYPE. * * \param[in] type The OBU_TYPE to convert to string. */ const char *aom_obu_type_to_string(OBU_TYPE type); /*!@} - end defgroup codec*/ #ifdef __cplusplus } #endif #endif // AOM_AOM_AOM_CODEC_H_ ================================================ FILE: projects/Amlogic-ce/packages/multimedia/obu_util/sources/aom_config.h ================================================ /* * copied from https://raw.githubusercontent.com/SDWebImage/libaom-Xcode/master/generate/config/aom_config.h */ /* * Copyright (c) 2021, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_CONFIG_H_ #define AOM_CONFIG_H_ #define ARCH_ARM 1 #define ARCH_MIPS 0 #define ARCH_PPC 0 #define ARCH_X86 0 #define ARCH_X86_64 0 #define CONFIG_ACCOUNTING 0 #define CONFIG_ANALYZER 0 #define CONFIG_AV1_DECODER 1 #define CONFIG_AV1_ENCODER 0 #define CONFIG_AV1_HIGHBITDEPTH 1 #define CONFIG_BIG_ENDIAN 0 #define CONFIG_BITSTREAM_DEBUG 0 #define CONFIG_COEFFICIENT_RANGE_CHECKING 0 #define CONFIG_COLLECT_COMPONENT_TIMING 0 #define CONFIG_COLLECT_PARTITION_STATS 0 #define CONFIG_COLLECT_RD_STATS 0 #define CONFIG_DEBUG 0 #define CONFIG_DENOISE 1 #define CONFIG_DISABLE_FULL_PIXEL_SPLIT_8X8 1 #define CONFIG_DIST_8X8 0 #define CONFIG_ENTROPY_STATS 0 #define CONFIG_GCC 1 #define CONFIG_GCOV 0 #define CONFIG_GPROF 0 #define CONFIG_HTB_TRELLIS 0 #define CONFIG_INSPECTION 0 #define CONFIG_INTERNAL_STATS 0 #define CONFIG_INTER_STATS_ONLY 0 #define CONFIG_LIBYUV 1 #define CONFIG_LPF_MASK 0 #define CONFIG_MAX_DECODE_PROFILE 2 #define CONFIG_MISMATCH_DEBUG 0 #define CONFIG_MULTITHREAD 1 #define CONFIG_NN_V2 0 #define CONFIG_NORMAL_TILE_MODE 0 #define CONFIG_OS_SUPPORT 1 #define CONFIG_PIC 0 #define CONFIG_RD_DEBUG 0 #define CONFIG_REALTIME_ONLY 0 #define CONFIG_RUNTIME_CPU_DETECT 1 #define CONFIG_SHARED 0 #define CONFIG_SHARP_SETTINGS 0 #define CONFIG_SIZE_LIMIT 0 #define CONFIG_SPATIAL_RESAMPLING 1 #define CONFIG_SPEED_STATS 0 #define CONFIG_SUPERRES_IN_RECODE 1 #define CONFIG_TUNE_VMAF 1 #define CONFIG_WEBM_IO 1 #define DECODE_HEIGHT_LIMIT 0 #define DECODE_WIDTH_LIMIT 0 #define FORCE_HIGHBITDEPTH_DECODING 0 #define HAVE_AVX 0 #define HAVE_AVX2 0 #define HAVE_DSPR2 0 #define HAVE_FEXCEPT 0 #define HAVE_MIPS32 0 #define HAVE_MIPS64 0 #define HAVE_MMX 0 #define HAVE_MSA 0 #define HAVE_NEON 1 #define HAVE_PTHREAD_H 1 #define HAVE_SSE 0 #define HAVE_SSE2 0 #define HAVE_SSE3 0 #define HAVE_SSE4_1 0 #define HAVE_SSE4_2 0 #define HAVE_SSSE3 0 #define HAVE_UNISTD_H 1 #define HAVE_VSX 0 #define HAVE_WXWIDGETS 0 #define INLINE inline #endif // AOM_CONFIG_H_ ================================================ FILE: projects/Amlogic-ce/packages/multimedia/obu_util/sources/aom_config.h-orig.h ================================================ // from https://raw.githubusercontent.com/SDWebImage/libaom-Xcode/master/generate/config/aom_config.h /* * Copyright (c) 2021, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_CONFIG_H_ #define AOM_CONFIG_H_ #define ARCH_ARM 0 #define ARCH_MIPS 0 #define ARCH_PPC 0 #define ARCH_X86 0 #define ARCH_X86_64 0 #define CONFIG_ACCOUNTING 0 #define CONFIG_ANALYZER 0 #define CONFIG_AV1_DECODER 1 #define CONFIG_AV1_ENCODER 1 #define CONFIG_AV1_HIGHBITDEPTH 1 #define CONFIG_BIG_ENDIAN 0 #define CONFIG_BITSTREAM_DEBUG 0 #define CONFIG_COEFFICIENT_RANGE_CHECKING 0 #define CONFIG_COLLECT_COMPONENT_TIMING 0 #define CONFIG_COLLECT_PARTITION_STATS 0 #define CONFIG_COLLECT_RD_STATS 0 #define CONFIG_DEBUG 0 #define CONFIG_DENOISE 1 #define CONFIG_DISABLE_FULL_PIXEL_SPLIT_8X8 1 #define CONFIG_DIST_8X8 0 #define CONFIG_ENTROPY_STATS 0 #define CONFIG_GCC 1 #define CONFIG_GCOV 0 #define CONFIG_GPROF 0 #define CONFIG_HTB_TRELLIS 0 #define CONFIG_INSPECTION 0 #define CONFIG_INTERNAL_STATS 0 #define CONFIG_INTER_STATS_ONLY 0 #define CONFIG_LIBYUV 1 #define CONFIG_LPF_MASK 0 #define CONFIG_MAX_DECODE_PROFILE 2 #define CONFIG_MISMATCH_DEBUG 0 #define CONFIG_MULTITHREAD 1 #define CONFIG_NN_V2 0 #define CONFIG_NORMAL_TILE_MODE 0 #define CONFIG_OS_SUPPORT 1 #define CONFIG_PIC 0 #define CONFIG_RD_DEBUG 0 #define CONFIG_REALTIME_ONLY 0 #define CONFIG_RUNTIME_CPU_DETECT 1 #define CONFIG_SHARED 0 #define CONFIG_SHARP_SETTINGS 0 #define CONFIG_SIZE_LIMIT 0 #define CONFIG_SPATIAL_RESAMPLING 1 #define CONFIG_SPEED_STATS 0 #define CONFIG_SUPERRES_IN_RECODE 1 #define CONFIG_TUNE_VMAF 1 #define CONFIG_WEBM_IO 1 #define DECODE_HEIGHT_LIMIT 0 #define DECODE_WIDTH_LIMIT 0 #define FORCE_HIGHBITDEPTH_DECODING 0 #define HAVE_AVX 0 #define HAVE_AVX2 0 #define HAVE_DSPR2 0 #define HAVE_FEXCEPT 0 #define HAVE_MIPS32 0 #define HAVE_MIPS64 0 #define HAVE_MMX 0 #define HAVE_MSA 0 #define HAVE_NEON 0 #define HAVE_PTHREAD_H 1 #define HAVE_SSE 0 #define HAVE_SSE2 0 #define HAVE_SSE3 0 #define HAVE_SSE4_1 0 #define HAVE_SSE4_2 0 #define HAVE_SSSE3 0 #define HAVE_UNISTD_H 1 #define HAVE_VSX 0 #define HAVE_WXWIDGETS 0 #define INLINE inline #endif // AOM_CONFIG_H_ ================================================ FILE: projects/Amlogic-ce/packages/multimedia/obu_util/sources/aom_image.h ================================================ /* * Copyright (c) 2016, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ /*!\file * \brief Describes the aom image descriptor and associated operations * */ #ifndef AOM_AOM_AOM_IMAGE_H_ #define AOM_AOM_AOM_IMAGE_H_ #ifdef __cplusplus extern "C" { #endif #include "aom_integer.h" /*!\brief Current ABI version number * * \internal * If this file is altered in any way that changes the ABI, this value * must be bumped. Examples include, but are not limited to, changing * types, removing or reassigning enums, adding/removing/rearranging * fields to structures */ #define AOM_IMAGE_ABI_VERSION (9) /**<\hideinitializer*/ #define AOM_IMG_FMT_PLANAR 0x100 /**< Image is a planar format. */ #define AOM_IMG_FMT_UV_FLIP 0x200 /**< V plane precedes U in memory. */ /** 0x400 used to signal alpha channel, skipping for backwards compatibility. */ #define AOM_IMG_FMT_HIGHBITDEPTH 0x800 /**< Image uses 16bit framebuffer. */ /*!\brief List of supported image formats */ typedef enum aom_img_fmt { AOM_IMG_FMT_NONE, AOM_IMG_FMT_YV12 = AOM_IMG_FMT_PLANAR | AOM_IMG_FMT_UV_FLIP | 1, /**< planar YVU */ AOM_IMG_FMT_I420 = AOM_IMG_FMT_PLANAR | 2, AOM_IMG_FMT_AOMYV12 = AOM_IMG_FMT_PLANAR | AOM_IMG_FMT_UV_FLIP | 3, /** < planar 4:2:0 format with aom color space */ AOM_IMG_FMT_AOMI420 = AOM_IMG_FMT_PLANAR | 4, AOM_IMG_FMT_I422 = AOM_IMG_FMT_PLANAR | 5, AOM_IMG_FMT_I444 = AOM_IMG_FMT_PLANAR | 6, AOM_IMG_FMT_I42016 = AOM_IMG_FMT_I420 | AOM_IMG_FMT_HIGHBITDEPTH, AOM_IMG_FMT_YV1216 = AOM_IMG_FMT_YV12 | AOM_IMG_FMT_HIGHBITDEPTH, AOM_IMG_FMT_I42216 = AOM_IMG_FMT_I422 | AOM_IMG_FMT_HIGHBITDEPTH, AOM_IMG_FMT_I44416 = AOM_IMG_FMT_I444 | AOM_IMG_FMT_HIGHBITDEPTH, } aom_img_fmt_t; /**< alias for enum aom_img_fmt */ /*!\brief List of supported color primaries */ typedef enum aom_color_primaries { AOM_CICP_CP_RESERVED_0 = 0, /**< For future use */ AOM_CICP_CP_BT_709 = 1, /**< BT.709 */ AOM_CICP_CP_UNSPECIFIED = 2, /**< Unspecified */ AOM_CICP_CP_RESERVED_3 = 3, /**< For future use */ AOM_CICP_CP_BT_470_M = 4, /**< BT.470 System M (historical) */ AOM_CICP_CP_BT_470_B_G = 5, /**< BT.470 System B, G (historical) */ AOM_CICP_CP_BT_601 = 6, /**< BT.601 */ AOM_CICP_CP_SMPTE_240 = 7, /**< SMPTE 240 */ AOM_CICP_CP_GENERIC_FILM = 8, /**< Generic film (color filters using illuminant C) */ AOM_CICP_CP_BT_2020 = 9, /**< BT.2020, BT.2100 */ AOM_CICP_CP_XYZ = 10, /**< SMPTE 428 (CIE 1921 XYZ) */ AOM_CICP_CP_SMPTE_431 = 11, /**< SMPTE RP 431-2 */ AOM_CICP_CP_SMPTE_432 = 12, /**< SMPTE EG 432-1 */ AOM_CICP_CP_RESERVED_13 = 13, /**< For future use (values 13 - 21) */ AOM_CICP_CP_EBU_3213 = 22, /**< EBU Tech. 3213-E */ AOM_CICP_CP_RESERVED_23 = 23 /**< For future use (values 23 - 255) */ } aom_color_primaries_t; /**< alias for enum aom_color_primaries */ /*!\brief List of supported transfer functions */ typedef enum aom_transfer_characteristics { AOM_CICP_TC_RESERVED_0 = 0, /**< For future use */ AOM_CICP_TC_BT_709 = 1, /**< BT.709 */ AOM_CICP_TC_UNSPECIFIED = 2, /**< Unspecified */ AOM_CICP_TC_RESERVED_3 = 3, /**< For future use */ AOM_CICP_TC_BT_470_M = 4, /**< BT.470 System M (historical) */ AOM_CICP_TC_BT_470_B_G = 5, /**< BT.470 System B, G (historical) */ AOM_CICP_TC_BT_601 = 6, /**< BT.601 */ AOM_CICP_TC_SMPTE_240 = 7, /**< SMPTE 240 M */ AOM_CICP_TC_LINEAR = 8, /**< Linear */ AOM_CICP_TC_LOG_100 = 9, /**< Logarithmic (100 : 1 range) */ AOM_CICP_TC_LOG_100_SQRT10 = 10, /**< Logarithmic (100 * Sqrt(10) : 1 range) */ AOM_CICP_TC_IEC_61966 = 11, /**< IEC 61966-2-4 */ AOM_CICP_TC_BT_1361 = 12, /**< BT.1361 */ AOM_CICP_TC_SRGB = 13, /**< sRGB or sYCC*/ AOM_CICP_TC_BT_2020_10_BIT = 14, /**< BT.2020 10-bit systems */ AOM_CICP_TC_BT_2020_12_BIT = 15, /**< BT.2020 12-bit systems */ AOM_CICP_TC_SMPTE_2084 = 16, /**< SMPTE ST 2084, ITU BT.2100 PQ */ AOM_CICP_TC_SMPTE_428 = 17, /**< SMPTE ST 428 */ AOM_CICP_TC_HLG = 18, /**< BT.2100 HLG, ARIB STD-B67 */ AOM_CICP_TC_RESERVED_19 = 19 /**< For future use (values 19-255) */ } aom_transfer_characteristics_t; /**< alias for enum aom_transfer_function */ /*!\brief List of supported matrix coefficients */ typedef enum aom_matrix_coefficients { AOM_CICP_MC_IDENTITY = 0, /**< Identity matrix */ AOM_CICP_MC_BT_709 = 1, /**< BT.709 */ AOM_CICP_MC_UNSPECIFIED = 2, /**< Unspecified */ AOM_CICP_MC_RESERVED_3 = 3, /**< For future use */ AOM_CICP_MC_FCC = 4, /**< US FCC 73.628 */ AOM_CICP_MC_BT_470_B_G = 5, /**< BT.470 System B, G (historical) */ AOM_CICP_MC_BT_601 = 6, /**< BT.601 */ AOM_CICP_MC_SMPTE_240 = 7, /**< SMPTE 240 M */ AOM_CICP_MC_SMPTE_YCGCO = 8, /**< YCgCo */ AOM_CICP_MC_BT_2020_NCL = 9, /**< BT.2020 non-constant luminance, BT.2100 YCbCr */ AOM_CICP_MC_BT_2020_CL = 10, /**< BT.2020 constant luminance */ AOM_CICP_MC_SMPTE_2085 = 11, /**< SMPTE ST 2085 YDzDx */ AOM_CICP_MC_CHROMAT_NCL = 12, /**< Chromaticity-derived non-constant luminance */ AOM_CICP_MC_CHROMAT_CL = 13, /**< Chromaticity-derived constant luminance */ AOM_CICP_MC_ICTCP = 14, /**< BT.2100 ICtCp */ AOM_CICP_MC_RESERVED_15 = 15 /**< For future use (values 15-255) */ } aom_matrix_coefficients_t; /*!\brief List of supported color range */ typedef enum aom_color_range { AOM_CR_STUDIO_RANGE = 0, /**< Y [16..235], UV [16..240] */ AOM_CR_FULL_RANGE = 1 /**< YUV/RGB [0..255] */ } aom_color_range_t; /**< alias for enum aom_color_range */ /*!\brief List of chroma sample positions */ typedef enum aom_chroma_sample_position { AOM_CSP_UNKNOWN = 0, /**< Unknown */ AOM_CSP_VERTICAL = 1, /**< Horizontally co-located with luma(0, 0)*/ /**< sample, between two vertical samples */ AOM_CSP_COLOCATED = 2, /**< Co-located with luma(0, 0) sample */ AOM_CSP_RESERVED = 3 /**< Reserved value */ } aom_chroma_sample_position_t; /**< alias for enum aom_transfer_function */ /*!\brief List of insert flags for Metadata * * These flags control how the library treats metadata during encode. * * While encoding, when metadata is added to an aom_image via * aom_img_add_metadata(), the flag passed along with the metadata will * determine where the metadata OBU will be placed in the encoded OBU stream. * Metadata will be emitted into the output stream within the next temporal unit * if it satisfies the specified insertion flag. * * During decoding, when the library encounters a metadata OBU, it is always * flagged as AOM_MIF_ANY_FRAME and emitted with the next output aom_image. */ typedef enum aom_metadata_insert_flags { AOM_MIF_NON_KEY_FRAME = 0, /**< Adds metadata if it's not keyframe */ AOM_MIF_KEY_FRAME = 1, /**< Adds metadata only if it's a keyframe */ AOM_MIF_ANY_FRAME = 2 /**< Adds metadata to any type of frame */ } aom_metadata_insert_flags_t; /*!\brief Array of aom_metadata structs for an image. */ typedef struct aom_metadata_array aom_metadata_array_t; /*!\brief Metadata payload. */ typedef struct aom_metadata { uint32_t type; /**< Metadata type */ uint8_t *payload; /**< Metadata payload data */ size_t sz; /**< Metadata payload size */ aom_metadata_insert_flags_t insert_flag; /**< Metadata insertion flag */ } aom_metadata_t; /**\brief Image Descriptor */ typedef struct aom_image { aom_img_fmt_t fmt; /**< Image Format */ aom_color_primaries_t cp; /**< CICP Color Primaries */ aom_transfer_characteristics_t tc; /**< CICP Transfer Characteristics */ aom_matrix_coefficients_t mc; /**< CICP Matrix Coefficients */ int monochrome; /**< Whether image is monochrome */ aom_chroma_sample_position_t csp; /**< chroma sample position */ aom_color_range_t range; /**< Color Range */ /* Image storage dimensions */ unsigned int w; /**< Stored image width */ unsigned int h; /**< Stored image height */ unsigned int bit_depth; /**< Stored image bit-depth */ /* Image display dimensions */ unsigned int d_w; /**< Displayed image width */ unsigned int d_h; /**< Displayed image height */ /* Image intended rendering dimensions */ unsigned int r_w; /**< Intended rendering image width */ unsigned int r_h; /**< Intended rendering image height */ /* Chroma subsampling info */ unsigned int x_chroma_shift; /**< subsampling order, X */ unsigned int y_chroma_shift; /**< subsampling order, Y */ /* Image data pointers. */ #define AOM_PLANE_PACKED 0 /**< To be used for all packed formats */ #define AOM_PLANE_Y 0 /**< Y (Luminance) plane */ #define AOM_PLANE_U 1 /**< U (Chroma) plane */ #define AOM_PLANE_V 2 /**< V (Chroma) plane */ unsigned char *planes[3]; /**< pointer to the top left pixel for each plane */ int stride[3]; /**< stride between rows for each plane */ size_t sz; /**< data size */ int bps; /**< bits per sample (for packed formats) */ int temporal_id; /**< Temporal layer Id of image */ int spatial_id; /**< Spatial layer Id of image */ /*!\brief The following member may be set by the application to associate * data with this image. */ void *user_priv; /* The following members should be treated as private. */ unsigned char *img_data; /**< private */ int img_data_owner; /**< private */ int self_allocd; /**< private */ aom_metadata_array_t *metadata; /**< Metadata payloads associated with the image. */ void *fb_priv; /**< Frame buffer data associated with the image. */ } aom_image_t; /**< alias for struct aom_image */ /*!\brief Open a descriptor, allocating storage for the underlying image * * Returns a descriptor for storing an image of the given format. The * storage for the image is allocated on the heap. * * \param[in] img Pointer to storage for descriptor. If this parameter * is NULL, the storage for the descriptor will be * allocated on the heap. * \param[in] fmt Format for the image * \param[in] d_w Width of the image * \param[in] d_h Height of the image * \param[in] align Alignment, in bytes, of the image buffer and * each row in the image (stride). * * \return Returns a pointer to the initialized image descriptor. If the img * parameter is non-null, the value of the img parameter will be * returned. */ aom_image_t *aom_img_alloc(aom_image_t *img, aom_img_fmt_t fmt, unsigned int d_w, unsigned int d_h, unsigned int align); /*!\brief Open a descriptor, using existing storage for the underlying image * * Returns a descriptor for storing an image of the given format. The * storage for the image has been allocated elsewhere, and a descriptor is * desired to "wrap" that storage. * * \param[in] img Pointer to storage for descriptor. If this parameter * is NULL, the storage for the descriptor will be * allocated on the heap. * \param[in] fmt Format for the image * \param[in] d_w Width of the image * \param[in] d_h Height of the image * \param[in] align Alignment, in bytes, of each row in the image * (stride). * \param[in] img_data Storage to use for the image * * \return Returns a pointer to the initialized image descriptor. If the img * parameter is non-null, the value of the img parameter will be * returned. */ aom_image_t *aom_img_wrap(aom_image_t *img, aom_img_fmt_t fmt, unsigned int d_w, unsigned int d_h, unsigned int align, unsigned char *img_data); /*!\brief Open a descriptor, allocating storage for the underlying image with a * border * * Returns a descriptor for storing an image of the given format and its * borders. The storage for the image is allocated on the heap. * * \param[in] img Pointer to storage for descriptor. If this parameter * is NULL, the storage for the descriptor will be * allocated on the heap. * \param[in] fmt Format for the image * \param[in] d_w Width of the image * \param[in] d_h Height of the image * \param[in] align Alignment, in bytes, of the image buffer and * each row in the image (stride). * \param[in] size_align Alignment, in pixels, of the image width and height. * \param[in] border A border that is padded on four sides of the image. * * \return Returns a pointer to the initialized image descriptor. If the img * parameter is non-null, the value of the img parameter will be * returned. */ aom_image_t *aom_img_alloc_with_border(aom_image_t *img, aom_img_fmt_t fmt, unsigned int d_w, unsigned int d_h, unsigned int align, unsigned int size_align, unsigned int border); /*!\brief Set the rectangle identifying the displayed portion of the image * * Updates the displayed rectangle (aka viewport) on the image surface to * match the specified coordinates and size. Specifically, sets img->d_w, * img->d_h, and elements of the img->planes[] array. * * \param[in] img Image descriptor * \param[in] x leftmost column * \param[in] y topmost row * \param[in] w width * \param[in] h height * \param[in] border A border that is padded on four sides of the image. * * \return 0 if the requested rectangle is valid, nonzero (-1) otherwise. */ int aom_img_set_rect(aom_image_t *img, unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned int border); /*!\brief Flip the image vertically (top for bottom) * * Adjusts the image descriptor's pointers and strides to make the image * be referenced upside-down. * * \param[in] img Image descriptor */ void aom_img_flip(aom_image_t *img); /*!\brief Close an image descriptor * * Frees all allocated storage associated with an image descriptor. * * \param[in] img Image descriptor */ void aom_img_free(aom_image_t *img); /*!\brief Get the width of a plane * * Get the width of a plane of an image * * \param[in] img Image descriptor * \param[in] plane Plane index */ int aom_img_plane_width(const aom_image_t *img, int plane); /*!\brief Get the height of a plane * * Get the height of a plane of an image * * \param[in] img Image descriptor * \param[in] plane Plane index */ int aom_img_plane_height(const aom_image_t *img, int plane); /*!\brief Add metadata to image. * * Adds metadata to aom_image_t. * Function makes a copy of the provided data parameter. * Metadata insertion point is controlled by insert_flag. * * \param[in] img Image descriptor * \param[in] type Metadata type * \param[in] data Metadata contents * \param[in] sz Metadata contents size * \param[in] insert_flag Metadata insert flag * * \return Returns 0 on success. If img or data is NULL, sz is 0, or memory * allocation fails, it returns -1. */ int aom_img_add_metadata(aom_image_t *img, uint32_t type, const uint8_t *data, size_t sz, aom_metadata_insert_flags_t insert_flag); /*!\brief Return a metadata payload stored within the image metadata array. * * Gets the metadata (aom_metadata_t) at the indicated index in the image * metadata array. * * \param[in] img Pointer to image descriptor to get metadata from * \param[in] index Metadata index to get from metadata array * * \return Returns a const pointer to the selected metadata, if img and/or index * is invalid, it returns NULL. */ const aom_metadata_t *aom_img_get_metadata(const aom_image_t *img, size_t index); /*!\brief Return the number of metadata blocks within the image. * * Gets the number of metadata blocks contained within the provided image * metadata array. * * \param[in] img Pointer to image descriptor to get metadata number * from. * * \return Returns the size of the metadata array. If img or metadata is NULL, * it returns 0. */ size_t aom_img_num_metadata(const aom_image_t *img); /*!\brief Remove metadata from image. * * Removes all metadata in image metadata list and sets metadata list pointer * to NULL. * * \param[in] img Image descriptor */ void aom_img_remove_metadata(aom_image_t *img); /*!\brief Allocate memory for aom_metadata struct. * * Allocates storage for the metadata payload, sets its type and copies the * payload data into the aom_metadata struct. A metadata payload buffer of size * sz is allocated and sz bytes are copied from data into the payload buffer. * * \param[in] type Metadata type * \param[in] data Metadata data pointer * \param[in] sz Metadata size * \param[in] insert_flag Metadata insert flag * * \return Returns the newly allocated aom_metadata struct. If data is NULL, * sz is 0, or memory allocation fails, it returns NULL. */ aom_metadata_t *aom_img_metadata_alloc(uint32_t type, const uint8_t *data, size_t sz, aom_metadata_insert_flags_t insert_flag); /*!\brief Free metadata struct. * * Free metadata struct and its buffer. * * \param[in] metadata Metadata struct pointer */ void aom_img_metadata_free(aom_metadata_t *metadata); #ifdef __cplusplus } // extern "C" #endif #endif // AOM_AOM_AOM_IMAGE_H_ ================================================ FILE: projects/Amlogic-ce/packages/multimedia/obu_util/sources/aom_integer.c ================================================ /* * Copyright (c) 2018, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #include <assert.h> #include "aom_integer.h" static const size_t kMaximumLeb128Size = 8; static const uint8_t kLeb128ByteMask = 0x7f; // Binary: 01111111 // Disallow values larger than 32-bits to ensure consistent behavior on 32 and // 64 bit targets: value is typically used to determine buffer allocation size // when decoded. static const uint64_t kMaximumLeb128Value = UINT32_MAX; size_t aom_uleb_size_in_bytes(uint64_t value) { size_t size = 0; do { ++size; } while ((value >>= 7) != 0); return size; } int aom_uleb_decode(const uint8_t *buffer, size_t available, uint64_t *value, size_t *length) { if (buffer && value) { *value = 0; for (size_t i = 0; i < kMaximumLeb128Size && i < available; ++i) { const uint8_t decoded_byte = *(buffer + i) & kLeb128ByteMask; *value |= ((uint64_t)decoded_byte) << (i * 7); if ((*(buffer + i) >> 7) == 0) { if (length) { *length = i + 1; } // Fail on values larger than 32-bits to ensure consistent behavior on // 32 and 64 bit targets: value is typically used to determine buffer // allocation size. if (*value > UINT32_MAX) return -1; return 0; } } } // If we get here, either the buffer/value pointers were invalid, // or we ran over the available space return -1; } int aom_uleb_encode(uint64_t value, size_t available, uint8_t *coded_value, size_t *coded_size) { const size_t leb_size = aom_uleb_size_in_bytes(value); if (value > kMaximumLeb128Value || leb_size > kMaximumLeb128Size || leb_size > available || !coded_value || !coded_size) { return -1; } for (size_t i = 0; i < leb_size; ++i) { uint8_t byte = value & 0x7f; value >>= 7; if (value != 0) byte |= 0x80; // Signal that more bytes follow. *(coded_value + i) = byte; } *coded_size = leb_size; return 0; } int aom_uleb_encode_fixed_size(uint64_t value, size_t available, size_t pad_to_size, uint8_t *coded_value, size_t *coded_size) { if (value > kMaximumLeb128Value || !coded_value || !coded_size || available < pad_to_size || pad_to_size > kMaximumLeb128Size) { return -1; } const uint64_t limit = 1ULL << (7 * pad_to_size); if (value >= limit) { // Can't encode 'value' within 'pad_to_size' bytes return -1; } for (size_t i = 0; i < pad_to_size; ++i) { uint8_t byte = value & 0x7f; value >>= 7; if (i < pad_to_size - 1) byte |= 0x80; // Signal that more bytes follow. *(coded_value + i) = byte; } assert(value == 0); *coded_size = pad_to_size; return 0; } ================================================ FILE: projects/Amlogic-ce/packages/multimedia/obu_util/sources/aom_integer.h ================================================ /* * Copyright (c) 2016, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_AOM_AOM_INTEGER_H_ #define AOM_AOM_AOM_INTEGER_H_ /* get ptrdiff_t, size_t, wchar_t, NULL */ #include <stddef.h> #if defined(_MSC_VER) #define AOM_FORCE_INLINE __forceinline #define AOM_INLINE __inline #else #define AOM_FORCE_INLINE __inline__ __attribute__((always_inline)) #define AOM_INLINE inline #endif /* Assume platforms have the C99 standard integer types. */ #if defined(__cplusplus) #if !defined(__STDC_FORMAT_MACROS) #define __STDC_FORMAT_MACROS #endif #if !defined(__STDC_LIMIT_MACROS) #define __STDC_LIMIT_MACROS #endif #endif // __cplusplus #include <stdint.h> #include <inttypes.h> #if defined(__cplusplus) extern "C" { #endif // __cplusplus // Returns size of uint64_t when encoded using LEB128. size_t aom_uleb_size_in_bytes(uint64_t value); // Returns 0 on success, -1 on decode failure. // On success, 'value' stores the decoded LEB128 value and 'length' stores // the number of bytes decoded. int aom_uleb_decode(const uint8_t *buffer, size_t available, uint64_t *value, size_t *length); // Encodes LEB128 integer. Returns 0 when successful, and -1 upon failure. int aom_uleb_encode(uint64_t value, size_t available, uint8_t *coded_value, size_t *coded_size); // Encodes LEB128 integer to size specified. Returns 0 when successful, and -1 // upon failure. // Note: This will write exactly pad_to_size bytes; if the value cannot be // encoded in this many bytes, then this will fail. int aom_uleb_encode_fixed_size(uint64_t value, size_t available, size_t pad_to_size, uint8_t *coded_value, size_t *coded_size); #if defined(__cplusplus) } // extern "C" #endif // __cplusplus #endif // AOM_AOM_AOM_INTEGER_H_ ================================================ FILE: projects/Amlogic-ce/packages/multimedia/obu_util/sources/bitops.h ================================================ /* * Copyright (c) 2016, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_AOM_PORTS_BITOPS_H_ #define AOM_AOM_PORTS_BITOPS_H_ #include <assert.h> #include "msvc.h" #include "aom_config.h" #ifdef _MSC_VER #if defined(_M_X64) || defined(_M_IX86) #include <intrin.h> #define USE_MSC_INTRINSICS #endif #endif #ifdef __cplusplus extern "C" { #endif // get_msb: // Returns (int)floor(log2(n)). n must be > 0. // These versions of get_msb() are only valid when n != 0 because all // of the optimized versions are undefined when n == 0: // https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html // use GNU builtins where available. #if defined(__GNUC__) && \ ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4) static INLINE int get_msb(unsigned int n) { assert(n != 0); return 31 ^ __builtin_clz(n); } #elif defined(USE_MSC_INTRINSICS) #pragma intrinsic(_BitScanReverse) static INLINE int get_msb(unsigned int n) { unsigned long first_set_bit; assert(n != 0); _BitScanReverse(&first_set_bit, n); return first_set_bit; } #undef USE_MSC_INTRINSICS #else static INLINE int get_msb(unsigned int n) { int log = 0; unsigned int value = n; int i; assert(n != 0); for (i = 4; i >= 0; --i) { const int shift = (1 << i); const unsigned int x = value >> shift; if (x != 0) { value = x; log += shift; } } return log; } #endif #ifdef __cplusplus } // extern "C" #endif #endif // AOM_AOM_PORTS_BITOPS_H_ ================================================ FILE: projects/Amlogic-ce/packages/multimedia/obu_util/sources/bitreader_buffer.c ================================================ /* * Copyright (c) 2016, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #include <assert.h> #include "aom_config.h" #include "bitreader_buffer.h" #include "recenter.h" #include "bitops.h" size_t aom_rb_bytes_read(const struct aom_read_bit_buffer *rb) { return (rb->bit_offset + 7) >> 3; } int aom_rb_read_bit(struct aom_read_bit_buffer *rb) { const uint32_t off = rb->bit_offset; const uint32_t p = off >> 3; const int q = 7 - (int)(off & 0x7); if (rb->bit_buffer + p < rb->bit_buffer_end) { const int bit = (rb->bit_buffer[p] >> q) & 1; rb->bit_offset = off + 1; return bit; } else { if (rb->error_handler) rb->error_handler(rb->error_handler_data); return 0; } } int aom_rb_read_literal(struct aom_read_bit_buffer *rb, int bits) { assert(bits <= 31); int value = 0, bit; for (bit = bits - 1; bit >= 0; bit--) value |= aom_rb_read_bit(rb) << bit; return value; } uint32_t aom_rb_read_unsigned_literal(struct aom_read_bit_buffer *rb, int bits) { assert(bits <= 32); uint32_t value = 0; int bit; for (bit = bits - 1; bit >= 0; bit--) value |= (uint32_t)aom_rb_read_bit(rb) << bit; return value; } int aom_rb_read_inv_signed_literal(struct aom_read_bit_buffer *rb, int bits) { const int nbits = sizeof(unsigned) * 8 - bits - 1; const unsigned value = (unsigned)aom_rb_read_literal(rb, bits + 1) << nbits; return ((int)value) >> nbits; } uint32_t aom_rb_read_uvlc(struct aom_read_bit_buffer *rb) { int leading_zeros = 0; while (leading_zeros < 32 && !aom_rb_read_bit(rb)) ++leading_zeros; // Maximum 32 bits. if (leading_zeros == 32) return UINT32_MAX; const uint32_t base = (1u << leading_zeros) - 1; const uint32_t value = aom_rb_read_literal(rb, leading_zeros); return base + value; } static uint16_t aom_rb_read_primitive_quniform(struct aom_read_bit_buffer *rb, uint16_t n) { if (n <= 1) return 0; const int l = get_msb(n) + 1; const int m = (1 << l) - n; const int v = aom_rb_read_literal(rb, l - 1); return v < m ? v : (v << 1) - m + aom_rb_read_bit(rb); } static uint16_t aom_rb_read_primitive_subexpfin(struct aom_read_bit_buffer *rb, uint16_t n, uint16_t k) { int i = 0; int mk = 0; while (1) { int b = (i ? k + i - 1 : k); int a = (1 << b); if (n <= mk + 3 * a) { return aom_rb_read_primitive_quniform(rb, n - mk) + mk; } if (!aom_rb_read_bit(rb)) { return aom_rb_read_literal(rb, b) + mk; } i = i + 1; mk += a; } assert(0); return 0; } static uint16_t aom_rb_read_primitive_refsubexpfin( struct aom_read_bit_buffer *rb, uint16_t n, uint16_t k, uint16_t ref) { return inv_recenter_finite_nonneg(n, ref, aom_rb_read_primitive_subexpfin(rb, n, k)); } int16_t aom_rb_read_signed_primitive_refsubexpfin( struct aom_read_bit_buffer *rb, uint16_t n, uint16_t k, int16_t ref) { ref += n - 1; const uint16_t scaled_n = (n << 1) - 1; return aom_rb_read_primitive_refsubexpfin(rb, scaled_n, k, ref) - n + 1; } ================================================ FILE: projects/Amlogic-ce/packages/multimedia/obu_util/sources/bitreader_buffer.h ================================================ /* * Copyright (c) 2016, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_AOM_DSP_BITREADER_BUFFER_H_ #define AOM_AOM_DSP_BITREADER_BUFFER_H_ #include <limits.h> #include "aom_integer.h" #ifdef __cplusplus extern "C" { #endif typedef void (*aom_rb_error_handler)(void *data); struct aom_read_bit_buffer { const uint8_t *bit_buffer; const uint8_t *bit_buffer_end; uint32_t bit_offset; void *error_handler_data; aom_rb_error_handler error_handler; }; size_t aom_rb_bytes_read(const struct aom_read_bit_buffer *rb); int aom_rb_read_bit(struct aom_read_bit_buffer *rb); int aom_rb_read_literal(struct aom_read_bit_buffer *rb, int bits); uint32_t aom_rb_read_unsigned_literal(struct aom_read_bit_buffer *rb, int bits); int aom_rb_read_inv_signed_literal(struct aom_read_bit_buffer *rb, int bits); uint32_t aom_rb_read_uvlc(struct aom_read_bit_buffer *rb); int16_t aom_rb_read_signed_primitive_refsubexpfin( struct aom_read_bit_buffer *rb, uint16_t n, uint16_t k, int16_t ref); #ifdef __cplusplus } // extern "C" #endif #endif // AOM_AOM_DSP_BITREADER_BUFFER_H_ ================================================ FILE: projects/Amlogic-ce/packages/multimedia/obu_util/sources/msvc.h ================================================ /* * Copyright (c) 2016, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_AOM_PORTS_MSVC_H_ #define AOM_AOM_PORTS_MSVC_H_ #ifdef _MSC_VER #include "aom_config.h" #if _MSC_VER < 1900 // VS2015 provides snprintf #define snprintf _snprintf #endif // _MSC_VER < 1900 #if _MSC_VER < 1800 // VS2013 provides round #include <math.h> static INLINE double round(double x) { if (x < 0) return ceil(x - 0.5); else return floor(x + 0.5); } static INLINE float roundf(float x) { if (x < 0) return (float)ceil(x - 0.5f); else return (float)floor(x + 0.5f); } static INLINE long lroundf(float x) { if (x < 0) return (long)(x - 0.5f); else return (long)(x + 0.5f); } #endif // _MSC_VER < 1800 #if HAVE_AVX #include <immintrin.h> // Note: // _mm256_insert_epi16 intrinsics is available from vs2017. // We define this macro for vs2015 and earlier. The // intrinsics used here are in vs2015 document: // https://msdn.microsoft.com/en-us/library/hh977022.aspx // Input parameters: // a: __m256i, // d: int16_t, // indx: imm8 (0 - 15) #if _MSC_VER <= 1900 #define _mm256_insert_epi16(a, d, indx) \ _mm256_insertf128_si256( \ a, \ _mm_insert_epi16(_mm256_extractf128_si256(a, indx >> 3), d, indx % 8), \ indx >> 3) static INLINE int _mm256_extract_epi32(__m256i a, const int i) { return a.m256i_i32[i & 7]; } static INLINE __m256i _mm256_insert_epi32(__m256i a, int b, const int i) { __m256i c = a; c.m256i_i32[i & 7] = b; return c; } #endif // _MSC_VER <= 1900 #endif // HAVE_AVX #endif // _MSC_VER #endif // AOM_AOM_PORTS_MSVC_H_ ================================================ FILE: projects/Amlogic-ce/packages/multimedia/obu_util/sources/obu_util.c ================================================ /* * Copyright (c) 2018, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #include <assert.h> #include "obu_util.h" #include "bitreader_buffer.h" static aom_codec_err_t read_obu_size(const uint8_t *data, size_t bytes_available, size_t *const obu_size, size_t *const length_field_size) { uint64_t u_obu_size = 0; if (aom_uleb_decode(data, bytes_available, &u_obu_size, length_field_size) != 0) { return AOM_CODEC_CORRUPT_FRAME; } if (u_obu_size > UINT32_MAX) return AOM_CODEC_CORRUPT_FRAME; *obu_size = (size_t)u_obu_size; return AOM_CODEC_OK; } // Parses OBU header and stores values in 'header'. static aom_codec_err_t read_obu_header(struct aom_read_bit_buffer *rb, int is_annexb, ObuHeader *header) { if (!rb || !header) return AOM_CODEC_INVALID_PARAM; const ptrdiff_t bit_buffer_byte_length = rb->bit_buffer_end - rb->bit_buffer; if (bit_buffer_byte_length < 1) return AOM_CODEC_CORRUPT_FRAME; header->size = 1; if (aom_rb_read_bit(rb) != 0) { // Forbidden bit. Must not be set. return AOM_CODEC_CORRUPT_FRAME; } header->type = (OBU_TYPE)aom_rb_read_literal(rb, 4); header->has_extension = aom_rb_read_bit(rb); header->has_size_field = aom_rb_read_bit(rb); if (!header->has_size_field && !is_annexb) { // section 5 obu streams must have obu_size field set. return AOM_CODEC_UNSUP_BITSTREAM; } // obu_reserved_1bit must be set to 0. The value is ignored by a decoder. aom_rb_read_bit(rb); if (header->has_extension) { if (bit_buffer_byte_length == 1) return AOM_CODEC_CORRUPT_FRAME; header->size += 1; header->temporal_layer_id = aom_rb_read_literal(rb, 3); header->spatial_layer_id = aom_rb_read_literal(rb, 2); // extension_header_reserved_3bits must be set to 0. The value is ignored by // a decoder. aom_rb_read_literal(rb, 3); } else { header->temporal_layer_id = 0; header->spatial_layer_id = 0; } return AOM_CODEC_OK; } aom_codec_err_t aom_read_obu_header(uint8_t *buffer, size_t buffer_length, size_t *consumed, ObuHeader *header, int is_annexb) { if (buffer_length < 1 || !consumed || !header) return AOM_CODEC_INVALID_PARAM; // TODO(tomfinegan): Set the error handler here and throughout this file, and // confirm parsing work done via aom_read_bit_buffer is successful. struct aom_read_bit_buffer rb = { buffer, buffer + buffer_length, 0, NULL, NULL }; aom_codec_err_t parse_result = read_obu_header(&rb, is_annexb, header); if (parse_result == AOM_CODEC_OK) *consumed = header->size; return parse_result; } aom_codec_err_t aom_read_obu_header_and_size(const uint8_t *data, size_t bytes_available, int is_annexb, ObuHeader *obu_header, size_t *const payload_size, size_t *const bytes_read) { size_t length_field_size_obu = 0; size_t length_field_size_payload = 0; size_t obu_size = 0; aom_codec_err_t status; if (is_annexb) { // Size field comes before the OBU header, and includes the OBU header status = read_obu_size(data, bytes_available, &obu_size, &length_field_size_obu); if (status != AOM_CODEC_OK) return status; } struct aom_read_bit_buffer rb = { data + length_field_size_obu, data + bytes_available, 0, NULL, NULL }; status = read_obu_header(&rb, is_annexb, obu_header); if (status != AOM_CODEC_OK) return status; if (!obu_header->has_size_field) { assert(is_annexb); // Derive the payload size from the data we've already read if (obu_size < obu_header->size) return AOM_CODEC_CORRUPT_FRAME; *payload_size = obu_size - obu_header->size; } else { // Size field comes after the OBU header, and is just the payload size status = read_obu_size( data + length_field_size_obu + obu_header->size, bytes_available - length_field_size_obu - obu_header->size, payload_size, &length_field_size_payload); if (status != AOM_CODEC_OK) return status; } *bytes_read = length_field_size_obu + obu_header->size + length_field_size_payload; return AOM_CODEC_OK; } ================================================ FILE: projects/Amlogic-ce/packages/multimedia/obu_util/sources/obu_util.h ================================================ /* * Copyright (c) 2018, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_AV1_COMMON_OBU_UTIL_H_ #define AOM_AV1_COMMON_OBU_UTIL_H_ #include "aom_codec.h" #ifdef __cplusplus extern "C" { #endif typedef struct { size_t size; // Size (1 or 2 bytes) of the OBU header (including the // optional OBU extension header) in the bitstream. OBU_TYPE type; int has_size_field; int has_extension; // Whether the optional OBU extension header is present. // The following fields come from the OBU extension header. They are set to 0 // if has_extension is false. int temporal_layer_id; int spatial_layer_id; } ObuHeader; aom_codec_err_t aom_read_obu_header(uint8_t *buffer, size_t buffer_length, size_t *consumed, ObuHeader *header, int is_annexb); aom_codec_err_t aom_read_obu_header_and_size(const uint8_t *data, size_t bytes_available, int is_annexb, ObuHeader *obu_header, size_t *const payload_size, size_t *const bytes_read); #ifdef __cplusplus } // extern "C" #endif #endif // AOM_AV1_COMMON_OBU_UTIL_H_ ================================================ FILE: projects/Amlogic-ce/packages/multimedia/obu_util/sources/recenter.h ================================================ /* * Copyright (c) 2018, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_AOM_DSP_RECENTER_H_ #define AOM_AOM_DSP_RECENTER_H_ #include "aom_config.h" #include "aom_integer.h" // Inverse recenters a non-negative literal v around a reference r static INLINE uint16_t inv_recenter_nonneg(uint16_t r, uint16_t v) { if (v > (r << 1)) return v; else if ((v & 1) == 0) return (v >> 1) + r; else return r - ((v + 1) >> 1); } // Inverse recenters a non-negative literal v in [0, n-1] around a // reference r also in [0, n-1] static INLINE uint16_t inv_recenter_finite_nonneg(uint16_t n, uint16_t r, uint16_t v) { if ((r << 1) <= n) { return inv_recenter_nonneg(r, v); } else { return n - 1 - inv_recenter_nonneg(n - 1 - r, v); } } // Recenters a non-negative literal v around a reference r static INLINE uint16_t recenter_nonneg(uint16_t r, uint16_t v) { if (v > (r << 1)) return v; else if (v >= r) return ((v - r) << 1); else return ((r - v) << 1) - 1; } // Recenters a non-negative literal v in [0, n-1] around a // reference r also in [0, n-1] static INLINE uint16_t recenter_finite_nonneg(uint16_t n, uint16_t r, uint16_t v) { if ((r << 1) <= n) { return recenter_nonneg(r, v); } else { return recenter_nonneg(n - 1 - r, n - 1 - v); } } #endif // AOM_AOM_DSP_RECENTER_H_ ================================================ FILE: projects/Amlogic-ce/packages/network/rfkill/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rfkill" PKG_VERSION="0.5" PKG_SHA256="e0ae3004215e39a6c5c36e0726558740728d16f67ebdb8bea621250f6091d86a" PKG_LICENSE="GPL" PKG_SITE="https://wireless.wiki.kernel.org/en/users/documentation/rfkill" PKG_URL="https://www.kernel.org/pub/software/network/rfkill/$PKG_NAME-$PKG_VERSION.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A small userspace tool to query the state of the rfkill switches, buttons and subsystem interfaces." ================================================ FILE: projects/Amlogic-ce/packages/network/rfkill/patches/rfkill-0001-fix-version-sh.patch ================================================ diff -Naur a/version.sh b/version.sh --- a/version.sh +++ b/version.sh @@ -12,19 +12,6 @@ if test "x$SUFFIX" != 'x'; then v="$VERSION$SUFFIX" -elif head=`git rev-parse --verify HEAD 2>/dev/null`; then - git update-index --refresh --unmerged > /dev/null - descr=$(git describe 2>/dev/null || echo "v$VERSION") - - # on git builds check that the version number above - # is correct... - [ "${descr%%-*}" = "v$VERSION" ] || exit 2 - - echo -n 'const char rfkill_version[] = "' > "$OUT" - v="${descr#v}" - if git diff-index --name-only HEAD | read dummy ; then - v="$v"-dirty - fi else v="$VERSION" fi ================================================ FILE: projects/Amlogic-ce/packages/sysutils/amremote/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="amremote" PKG_LICENSE="other" PKG_SITE="http://www.amlogic.com" PKG_DEPENDS_TARGET="toolchain usbutils" PKG_LONGDESC="amremote - IR remote configuration utility for Amlogic-based devices" case "${LINUX}" in amlogic-4.9) PKG_VERSION="1db130a0ccd47f6b5c3d1dffab1e89613b796a8c" PKG_SHA256="5b96f2a1dd03200909eed749f5d97d1d02ee7fc8ac92d8fce6b5d6772ee642dc" PKG_URL="https://github.com/CoreELEC/amremote/archive/${PKG_VERSION}.tar.gz" ;; amlogic-5.4) PKG_VERSION="455eb8ef8507acf899d4723c022de1c981bb697e" PKG_SHA256="985bd796995cd756b0edcc34a88e31392a21c04b6c9a4a46e20f4bca19ab1511" PKG_URL="https://github.com/CoreELEC/amremote/archive/${PKG_VERSION}.tar.gz" ;; esac makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp remotecfg ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/lib/coreelec cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/lib/coreelec } post_install() { enable_service remote-config.service } ================================================ FILE: projects/Amlogic-ce/packages/sysutils/amremote/scripts/remote-config ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) remap_keys () { [ ! -f "$1" ] && return sed -i 's/ 15[^0-9]*$/ 1/ s/ 63[^0-9]*$/ 90/ s/ 97[^0-9]*$/ 28/ s/ 102[^0-9]*$/ 172/ s/ 125[^0-9]*$/ 46/ s/ 128[^0-9]*$/ 45/ s/ 139[^0-9]*$/ 46/ s/ 142[^0-9]*$/ 116/ s/ 143[^0-9]*$/ 116/ s/ 158[^0-9]*$/ 1/ s/ 183[^0-9]*$/ 59/ s/ 184[^0-9]*$/ 399/ s/ 185[^0-9]*$/ 400/ s/ 186[^0-9]*$/ 60/ s/ 232[^0-9]*$/ 28/ s/ 240[^0-9]*$/ 164/ s/ 241[^0-9]*$/ 163/ s/ 242[^0-9]*$/ 165/ s/ 244[^0-9]*$/ 208/ s/ 245[^0-9]*$/ 168/ s/ 264[^0-9]*$/ 63/ s/ 704[^0-9]*$/ 116/' \ "$1" } [ ! -e "/proc/device-tree/meson-ir/compatible" -o ! -e "/proc/device-tree/meson-remote/compatible" ] && exit if [ -f "/flash/remote.disable" -o -f "/storage/.config/remote.disable" ]; then echo "remote control disabled by user" exit 0 fi if [ -f "/flash/remote.force_meson_ir" -o -f "/storage/.config/remote.force_meson_ir" ]; then force_meson_ir="yes" else force_meson_ir="no" fi if [ -f "/flash/remote.conf" ]; then REMOTE_CONF_DIR="/flash" elif [ -f "/storage/.config/remote.conf" ]; then REMOTE_CONF_DIR="/storage/.config" else REMOTE_CONF_DIR="" if [ -d "/proc/device-tree/custom_maps" -a "$force_meson_ir" = "no" ]; then MAP_NAME=$(tr -d '\0' 2>/dev/null < /proc/device-tree/custom_maps/map_0/mapname) echo "using meson-remote, with pre-defined map '$MAP_NAME' from dtb" modprobe meson-remote touch /run/use-meson-remote exit 0 fi fi if [ -d "$REMOTE_CONF_DIR" ]; then echo "using meson-remote, conf from $REMOTE_CONF_DIR" if [ -d "/proc/device-tree/custom_maps" ]; then MAP_NAME=$(tr -d '\0' 2>/dev/null < /proc/device-tree/custom_maps/map_0/mapname) echo "also using pre-defined map '$MAP_NAME' from dtb" fi modprobe meson-remote touch /run/use-meson-remote for f in $REMOTE_CONF_DIR/remote*.conf; do echo "configuring remote with $f" cp "$f" /tmp/remote.conf remap_keys /tmp/remote.conf remotecfg /tmp/remote.conf rm -f /tmp/remote.conf done else echo "using meson-ir" modprobe meson-ir touch /run/use-meson-ir fi exit 0 ================================================ FILE: projects/Amlogic-ce/packages/sysutils/amremote/system.d/remote-config.service ================================================ [Unit] Description=IR remote control support Before=graphical.target kodi.service After=multi-user.target ConditionPathExists=/proc/device-tree/meson-ir/compatible ConditionPathExists=/proc/device-tree/meson-remote/compatible [Service] Type=oneshot ExecStart=/usr/lib/coreelec/remote-config [Install] WantedBy=graphical.target ================================================ FILE: projects/Amlogic-ce/packages/sysutils/dtb-xml/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) PKG_NAME="dtb-xml" PKG_VERSION="1.0" PKG_LICENSE="GPL" PKG_SITE="https://coreelec.org" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Tool to handle custom dtb.img tweaks" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib/coreelec mkdir -p ${INSTALL}/usr/share/bootloader install -m 0755 ${PKG_DIR}/scripts/dtb-xml.sh ${INSTALL}/usr/lib/coreelec/dtb-xml install -m 0644 ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/bootloader/dtb.xml ${INSTALL}/usr/share/bootloader/dtb.xml } # --------------------------------------- # No /flash/dtb.xml exist: # On first access of a variable by 'get_dtbxml_value' or 'get_dtbxml_multivalues' # by CE settings current defined default values are read by dtb-xml.sh and # migrated to /flash/dtb.xml. # # If a matching command value is found the option is set in dtb.xml. If no # matching value or the path is not found in dtb.img it get set to 'migrated'. # On next access of a option set to 'migrated' the dtb-xml.sh script try again # to read current value from dtb.img as it maybe turn to applicable after a # update of dtb.img by system update. # # /flash/dtb.xml get only be edited by dtb-xml.sh script and remain untouched # on update of the system. When a update is done user defined values are # applied to /flash/dtb.img by dtb.xml directly so no extra reboot is required. # # Any option node in /flash/dtb.xml can be forced updated by a tar update by # changing 'version' of a option node. So Team CoreELEC is still able to # maintain user /flash/dtb.xml. # # On bricked devices: remove /flash/dtb.xml and copy default dtb.img on /flash ================================================ FILE: projects/Amlogic-ce/packages/sysutils/dtb-xml/scripts/dtb-xml.sh ================================================ #!/bin/sh # # SPDX-License-Identifier: GPL-3.0-or-later # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) # # Update dtb.img by dtb.xml # ##################################################### # # Command Line Arguments # -v = Show verbose output # -m = migrate dtb.img settings to dtb.xml # ##################################################### verbose=0 changed=0 migrate=0 BOOT_ROOT='/flash' amlogic_dt_id='' while [ $# -ne 0 ]; do arg="$1" case "$arg" in -v) verbose=1 ;; -m) migrate=1 ;; *) echo "Unknown option: '$arg'" exit ;; esac [ $# -gt 0 ] && shift done xml_file="$BOOT_ROOT/dtb.xml" default_xml_file="/usr/share/bootloader/dtb.xml" dtb_file="$BOOT_ROOT/dtb.img" [ -f /proc/device-tree/amlogic-dt-id ] && amlogic_dt_id=$(tr -d '\0' < /proc/device-tree/amlogic-dt-id) DT_ID=$(dtname) ######################################################### # check_linux_version ######################################################### # Return 1 if given kernel version is lower than current kernel version function check_linux_version() { version_higher=$(uname -r | awk -F '.' \ -v ker_ver=$1 -v maj_ver=$2 -v min_ver=$3 '{ if ($1 > ker_ver) { print "Y"; } else if ($1 < ker_ver) { print "N"; } else { if ($2 > maj_ver) { print "Y"; } else if ($2 < maj_ver) { print "N"; } else { if ($3 >= min_ver) { print "Y"; } else { print "N"; } } } }') if [ "$version_higher" = "Y" ]; then return 0 else return 1 fi } ######################################################### # log ######################################################### function log() { [ "$verbose" == 1 ] && echo "$@" } ######################################################### # update_migrated_xml ######################################################### # Update a specified option node if value in dtb.img # become applicable by parameter: $update_node function update_migrated_xml() { update_node="$1" log " try to update migrated node '$update_node' by dtb.img" option_nodes=$(xmlstarlet sel -t -m "//$update_node/*" -v "name()" -n $xml_file) # check all options for specified migrated option node for option in $option_nodes; do cmd_count=$(xmlstarlet sel -t -c "count(//$update_node/$option/cmd)" $xml_file) if [ "$cmd_count" == 0 ]; then continue fi # check all commands for this current node of BOOT_ROOT dtb.xml if all commands are equal to dtb.img for cnt in $(seq 1 $cmd_count); do cmd_path=$(xmlstarlet sel -t -v "//$update_node/$option/cmd[$cnt]/@path" $xml_file) fdt_option=$(xmlstarlet sel -t -v "//$update_node/$option/cmd[$cnt]/@option" $xml_file) fdt_option=${fdt_option:-"t"} cmd_type=$(xmlstarlet sel -t -m "//$update_node/$option/cmd[$cnt]" -v "concat('-$fdt_option ', @type)" $xml_file) case "$fdt_option" in t) act_value=$(fdtget $amlogic_dt_id $cmd_type $dtb_file $cmd_path 2>/dev/null) if [ "$?" == 0 ]; then cmd_value=$(xmlstarlet sel -t -m "//$update_node/$option" -m "cmd[$cnt]/value" -v "concat(.,' ')" $xml_file) [ -n "$cmd_value" ] && cmd_value=${cmd_value::-1} [ -n "$cmd_value" ] && cmd_value=${cmd_value#"0x"} if [ "$act_value" != "$cmd_value" ]; then continue 2 fi else continue 2 fi ;; d|r) [ -n "$(fdtget $amlogic_dt_id $dtb_file $cmd_path 2>/dev/null)" ] && continue 2 ;; esac done # option status changed to applicable, update BOOT_ROOT dtb.xml by current status name_option=$(xmlstarlet sel -t -v "//$update_node/$option/@name" -n $xml_file) xmlstarlet ed -L -u "//$update_node/@status" -v "$name_option" $xml_file xmlstarlet ed -L -d "//$update_node/${update_node}_migrated" $xml_file changed=1 log " option status changed from '$node_status' to '$name_option'" node_status="$name_option" break done # option is still not applicable if [ "$changed" == 0 ]; then log " option status stay unchanged at '$node_status'" fi log "" } ######################################################### # migrate_dtb_to_xml ######################################################### # Migrate BOOT_ROOT dtb.xml from dtb.img # # * If no BOOT_ROOT dtb.xml does exist the current values # from dtb.img are migrated by reading each single # option status value from current dtb.img # * If no matching option is found in BOOT_ROOT dtb.xml # set the option status to 'migrated' function migrate_dtb_to_xml() { log "" log "Migrate dtb.xml from dtb.img" log "" # loop through all BOOT_ROOT dtb.xml options root_nodes=$(xmlstarlet sel -t -m '/*/*' -v "name()" -n $xml_file) for node in $root_nodes; do node_status=$(xmlstarlet sel -t -v "//$node/@status" $xml_file) log "------------------------------------------" log " node: $node, status: '$node_status'" option_nodes=$(xmlstarlet sel -t -m "//$node/*" -v "name()" -n $xml_file) name_option_available=0 # check if the node apply at all by dt_id # if not skip any further check and set to 'migrated' node_dt_id=$(xmlstarlet sel -t -v "//$node/@dt_id" $xml_file) if [ -n "$node_dt_id" ]; then log " dt_id: $node_dt_id, coreelec-dt-id: $DT_ID" dt_id_match=0 for dt_id in $node_dt_id; do eval " case \$DT_ID in *"$dt_id"*) dt_id_match=1 ;; esac " done if [ "$dt_id_match" == 0 -o -z "$DT_ID" ]; then option_nodes="" fi fi for option in $option_nodes; do cmd_count=$(xmlstarlet sel -t -c "count(//$node/$option/cmd)" $xml_file) cmd_remove_exist=$(xmlstarlet sel -t -m "//$node/$option/cmd" -i '@option="d"' -o "1" -b -i '@option="r"' -o "1" $xml_file) # check all commands for this current node of BOOT_ROOT dtb.xml if all commands are equal to dtb.img for cnt in $(seq 1 $cmd_count); do cmd_path=$(xmlstarlet sel -t -v "//$node/$option/cmd[$cnt]/@path" $xml_file) fdt_option=$(xmlstarlet sel -t -v "//$update_node/$option/cmd[$cnt]/@option" $xml_file) fdt_option=${fdt_option:-"t"} cmd_type=$(xmlstarlet sel -t -m "//$node/$option/cmd[$cnt]" -v "concat('-$fdt_option ', @type)" $xml_file) case "$fdt_option" in t) act_value=$(fdtget $amlogic_dt_id $cmd_type $dtb_file $cmd_path 2>/dev/null) if [ "$?" == 0 ]; then cmd_value=$(xmlstarlet sel -t -m "//$node/$option" -m "cmd[$cnt]/value" -v "concat(.,' ')" $xml_file) [ -n "$cmd_value" ] && cmd_value=${cmd_value::-1} [ -n "$cmd_value" ] && cmd_value=${cmd_value#"0x"} if [ "$act_value" != "$cmd_value" ]; then continue 2 fi else continue 2 fi ;; d|r) [ -z "$(fdtget $amlogic_dt_id $dtb_file $cmd_path 2>/dev/null)" -a -n "$cmd_remove_exist" ] || continue 2 ;; esac done name_option_available=1 name_option=$(xmlstarlet sel -t -v "//$node/$option/@name" -n $xml_file) # if option is available set current status in BOOT_ROOT dtb.xml if [ "$node_status" != "$name_option" ]; then # special handling to migrate heartbeat setting from config.ini on Odroid devices case $node in sys_led) case $DT_ID in *odroid*) log " detected Odroid device, migrate heartbeat led setting from config.ini" heartbeat="$( cat /flash/config.ini | awk -F "=" '/^heartbeat=/{gsub(/"|\047/,"",$2); print $2}')" if [ "$heartbeat" == "0" ]; then name_option="off" fdtput $amlogic_dt_id -t s $dtb_file /gpioleds/sys_led linux,default-trigger none echo none > /sys/class/leds/sys_led/trigger fi ;; esac ;; wol) if check_linux_version 5 4 210; then wol="$( cat /flash/config.ini | awk -F "=" '/^wol=/{gsub(/"|\047/,"",$2); print $2}')" log " migrate WOL setting ($wol) from config.ini" if [ "$wol" == "1" ]; then name_option="on" fdtput $amlogic_dt_id -t i $dtb_file /soc/ethernet@fdc00000 wol 1 fi fi ;; esac log " migrate dtb.xml node '$node' to '$name_option'" xmlstarlet ed -L -u "//$node/@status" -v "$name_option" $xml_file continue 2 else log " option status already set, do not migrate option" fi done # if the option is not available in dtb.img set option status to 'migrated' with current dtb.img value if [ "$name_option_available" == 0 ]; then xmlstarlet ed -L -s "//$node" -t elem -n "${node}_migrated" $xml_file xmlstarlet ed -L -u "//$node/@status" -v "migrated" $xml_file xmlstarlet ed -L -i "//${node}_migrated" -t attr -n "name" -v "migrated" $xml_file log " option not applicable by default dtb.xml, migrate to '${node}_migrated'" fi done log "------------------------------------------" log "" } ######################################################### # update_dtb_by_dtb_xml ######################################################### # Update dtb.img by BOOT_ROOT dtb.xml # # * Check if the option in BOOT_ROOT dtb.xml does include # commands at all # * Check if the option in BOOT_ROOT dtb.xml commands are # different and update dtb.img if needed # * If dtb.img path is not found set the option to # 'migrated' as not applicable # * If option is set to 'migrated' check if it became # applicable after dtb.img update function update_dtb_by_dtb_xml() { root_nodes=$(xmlstarlet sel -t -m '/*/*' -v "name()" -n $xml_file) log "" for node in $root_nodes; do log "------------------------------------------" log " node: $node" node_status=$(xmlstarlet sel -t -v "//$node/@status" $xml_file) log " status: $node_status" node_dt_id=$(xmlstarlet sel -t -v "//$node/@dt_id" $xml_file) # check if dt_id is set for this node # if yes compare if the setting does apply for this $dtb_file # if not skip node and set to 'migrated' to hide the option in CoreELEC settings if [ -n "$node_dt_id" ]; then log " dt_id: $node_dt_id" log " coreelec-dt-id: $DT_ID" dt_id_match=0 for dt_id in $node_dt_id; do eval " case \$DT_ID in *"$dt_id"*) dt_id_match=1 ;; esac " done if [ "$dt_id_match" == 0 -o -z "$DT_ID" ]; then log "" log " not applicable as dt_id does not match" log "" xmlstarlet ed -L -u "//$node/@status" -v "migrated" $xml_file continue fi fi log "" # check if node is 'migrated' and update if possible if [ "$node_status" == "migrated" ]; then update_migrated_xml $node fi # check if node does include commands to be executed cmd_count=$(xmlstarlet sel -t -c "count(//$node/node()[@name='$node_status']/cmd)" $xml_file) cmd_remove_exist=$(xmlstarlet sel -t -m "//$node/*/cmd" -i '@option="d"' -o "1" -b -i '@option="r"' -o "1" $xml_file) if [ "$cmd_count" == 0 ]; then log " no cmd for node status '$node_status' found" continue fi # check all commands for this current node of BOOT_ROOT dtb.xml if all commands are equal to dtb.img for cnt in $(seq 1 $cmd_count); do cmd_path=$(xmlstarlet sel -t -v "//$node/node()[@name='$node_status']/cmd[$cnt]/@path" $xml_file) fdt_option=$(xmlstarlet sel -t -v "//$node/node()[@name='$node_status']/cmd[$cnt]/@option" $xml_file) fdt_option=${fdt_option:-"t"} cmd_type=$(xmlstarlet sel -t -m "//$node/node()[@name='$node_status']/cmd[$cnt]" -v "concat('-${fdt_option} ', @type)" $xml_file) # check if node commands does exist in dtb.img at all case "$fdt_option" in t) act_value=$(fdtget $amlogic_dt_id $cmd_type $dtb_file $cmd_path 2>/dev/null) if [ "$?" == "0" -o -z "$act_value" -a -n "$cmd_remove_exist" ]; then cmd_value=$(xmlstarlet sel -t -m "//$node/node()[@name='$node_status']" -m "cmd[$cnt]/value" -v "concat('\"', .,'\" ')" $xml_file) [ -n "$cmd_value" ] && cmd_value=${cmd_value::-1} cmd="fdtput $amlogic_dt_id $cmd_type $dtb_file $cmd_path $cmd_value" cmd_value="${cmd_value//\"}" [ -n "$cmd_value" ] && cmd_value=${cmd_value#"0x"} # check if dtb.img value does match with current BOOT_ROOT dtb.xml status if [ "$act_value" != "$cmd_value" ]; then eval $cmd log " cmd[$cnt]: changed, $cmd_path: '$act_value' -> '$cmd_value', result: $?" changed=1 else log " cmd[$cnt]: unchanged, $cmd_path: '$cmd_value' == '$act_value'" fi else log " not applicable" xmlstarlet ed -L -u "//$node/@status" -v "migrated" $xml_file continue 2 fi ;; d|r) if [ -z "$(fdtget $amlogic_dt_id $dtb_file $cmd_path 2>/dev/null)" ]; then log " cmd[$cnt]: unchanged, still not exist" else cmd="fdtput $amlogic_dt_id $cmd_type $dtb_file $cmd_path" eval $cmd log " cmd[$cnt]: changed, $cmd_path: run option '$fdt_option', result: $?" changed=1 fi ;; esac done done log "------------------------------------------" log "" } ######################################################### # update_dtb_xml ######################################################### # Update BOOT_ROOT dtb.xml by default dtb.xml # # * Update whole BOOT_ROOT dtb.xml by default dtb.xml # if dtb-settings version is higher # * Check if a new node got introduced by default dtb.xml # * Check if default dtb.xml version is higher than # BOOT_ROOT dtb.xml version and update if needed function update_dtb_xml() { root_node_version=$(xmlstarlet sel -t -v "//dtb-settings/@version" $xml_file) default_root_node_version=$(xmlstarlet sel -t -v "//dtb-settings/@version" $default_xml_file) log "" log "------------------------------------------" log " dtb-settings version: $root_node_version" log " dtb-settings default version: $default_root_node_version" # default dtb.xml version changed, overwrite BOOT_ROOT dtb.xml if [ $root_node_version -lt $default_root_node_version ]; then log " update complete dtb.xml by default dtb.xml" cp -p $default_xml_file $xml_file fi root_nodes=$(xmlstarlet sel -t -m '/*/*' -v "name()" -n $xml_file) default_root_nodes=$(xmlstarlet sel -t -m '/*/*' -v "name()" -n $default_xml_file) # compare all default dtb.xml nodes with BOOT_ROOT dtb.xml for default_node in $default_root_nodes; do log "------------------------------------------" log " default node: $default_node" default_node_status=$(xmlstarlet sel -t -v "//$default_node/@status" $default_xml_file) default_node_version=$(xmlstarlet sel -t -v "//$default_node/@version" $default_xml_file) log " default status: $default_node_status, version: $default_node_version" node_status=$(xmlstarlet sel -t -v "//$default_node/@status" $xml_file) # new node in default dtb.xml found, copy whole node if [ -z "$node_status" ]; then log " node in current dtb.xml not found, get it from default dtb.xml" new_node=$(xmlstarlet sel -t -c "//$default_node" $default_xml_file) xmlstarlet ed --subnode "/dtb-settings" -t text -n "" -v "$new_node" $xml_file | \ xmlstarlet unesc | xmlstarlet format > tmp_file mv tmp_file $xml_file # node already exist in BOOT_ROOT dtb.xml, check if version update else node_version=$(xmlstarlet sel -t -v "//$default_node/@version" $xml_file) log " status: $node_status, version: $node_version" # newer version update node if [ $node_version -lt $default_node_version ]; then log " update node to version $default_node_version" xmlstarlet ed -L -d "//$default_node" $xml_file new_node=$(xmlstarlet sel -t -c "//$default_node" $default_xml_file) xmlstarlet ed --subnode "/dtb-settings" -t text -n "" -v "$new_node" $xml_file | \ xmlstarlet unesc | xmlstarlet format > tmp_file mv tmp_file $xml_file option_nodes=$(xmlstarlet sel -t -m "//$default_node/*" -v "name()" -n $xml_file) # check if old status still apply and set it if true for option in $option_nodes; do option_node_name=$(xmlstarlet sel -t -v "//$default_node/$option/@name" $xml_file) if [ "$node_status" == "$option_node_name" ]; then xmlstarlet ed -L -u "//$default_node/@status" -v "$node_status" $xml_file log " updated node status to: $node_status" continue 2 fi done fi fi done # compare all user dtb.xml nodes with default dtb.xml for node in $root_nodes; do log "------------------------------------------" log " node: $node" node_status=$(xmlstarlet sel -t -v "//$node/@status" $default_xml_file) if [ -z "$node_status" ]; then xmlstarlet ed -L -d "//$node" $xml_file log " node got removed by default dtb.xml" else log " node still in use by default dtb.xml" fi done log "------------------------------------------" log "" } if [ ! -f $dtb_file ]; then log "Error, not found: $dtb_file, exit now" exit 2 fi # check if BOOT_ROOT is mounted as 'ro' grep -q " $BOOT_ROOT vfat ro," /proc/mounts rw="$?" # remount as 'rw' if needed if [ "$rw" == "0" ]; then log "Try to remount '$BOOT_ROOT' in 'rw' mode" mount -o rw,remount "$BOOT_ROOT" if [ "$?" != "0" ]; then echo "Failed to remount '$BOOT_ROOT' in 'rw' mode" exit 12 fi fi # copy default dtb.xml to BOOT_ROOT if not found if [ ! -f $xml_file ]; then if [ -f $default_xml_file ]; then log "Creating dtb.xml..." cp -p $default_xml_file $xml_file else log "Error, not found: '$default_xml_file', exit now" exit 2 fi fi if [ -n "$amlogic_dt_id" ]; then log "Using amlogic-dt-id: $amlogic_dt_id" amlogic_dt_id="-a $amlogic_dt_id" fi # handle script parameter if [ "$migrate" == 1 ]; then migrate_dtb_to_xml else update_dtb_xml update_dtb_by_dtb_xml fi # remount as 'ro' if it was 'ro' before if [ "$rw" == "0" ]; then log "Try to remount '$BOOT_ROOT' in 'ro' mode" mount -o ro,remount "$BOOT_ROOT" if [ "$?" != "0" ]; then echo "Failed to remount '$BOOT_ROOT' in 'ro' mode" exit 12 fi fi exit $changed ================================================ FILE: projects/Amlogic-ce/packages/sysutils/inject_bl301/config/bl301.conf ================================================ #################################################################### # CoreELEC inject_bl301 config # # # # coreelec-dt-id blob definition: # # # # [substring coreelec-dt-id] = [substring BL301 blob binary] # # # # [substring coreelec-dt-id] = [] -> "Not supported" # # # # config.ini parameter are auto generated from package bl301: # # # # [config variable name] # # config_id = [unique unsigned int ID for variable] # # config_name = [unique matching config.ini key name] # # # # This config parameter value is filled automatic by package.mk. # # Multiple sections are possible. Do not edit! # #################################################################### [BL301] odroid= lepotato= lafrite= radxa= gxl_p212_2g_kvim=Khadas_VIM1 khadas_vim3=Khadas_VIM3 bananapi_m5=Bananapi_M5 bananapi_m2pro=Bananapi_M2Pro ================================================ FILE: projects/Amlogic-ce/packages/sysutils/inject_bl301/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Team CoreELEC (https://coreelec.org) PKG_NAME="inject_bl301" PKG_VERSION="cdaff43a6dc6b44381959bab27b687d6c922b1a0" case ${ARCH} in 'arm') PKG_SHA256="65c3c86fe0068c195de6b0afd2791a479ebd4f563317b553cbeaa9326189f3ec" ;; 'aarch64') PKG_SHA256="607be0ec8e0d931803a3c452bae6beccaedb443a1f51177981e14d792c435778" ;; *) PKG_SHA256='' ;; esac PKG_ARCH="aarch64 arm" PKG_SOURCE_NAME="$PKG_NAME-$ARCH-$PKG_VERSION.tar.xz" PKG_LICENSE="proprietary" PKG_SITE="https://coreelec.org" PKG_URL="https://sources.coreelec.org/$PKG_SOURCE_NAME" PKG_DEPENDS_TARGET="toolchain bl301_xxxxxx bl301_221119 bl301_091020" PKG_LONGDESC="Tool to inject bootloader blob BL301.bin on internal eMMC" PKG_TOOLCHAIN="manual" pre_make_target() { cp -av ${PKG_DIR}/config/bl301.conf ${PKG_BUILD}/bl301.conf for PKG_DEPEND_TARGET in ${PKG_DEPENDS_TARGET}; do case ${PKG_DEPEND_TARGET} in "bl301_"*) for f in $(find $(get_build_dir ${PKG_DEPEND_TARGET}) -mindepth 1 -name 'coreelec_config.c'); do cat ${f} | awk -F'[(),"]' '/.config_id_a\s*=\s*HASH/ {printf("%s %s\n", $2, $3)}' | \ while read id name; do if ! grep -Fwq "${id}" ${PKG_BUILD}/bl301.conf; then echo -e '\n['${id}']' >> ${PKG_BUILD}/bl301.conf; cat ${f%.*}.h | awk -v id="HASHSTR_${id} " '$0 ~ id {printf("config_id=%s\n", $3)}' >> ${PKG_BUILD}/bl301.conf; echo -e "config_name=${name}" >> ${PKG_BUILD}/bl301.conf; fi done done esac done } makeinstall_target() { mkdir -p ${INSTALL}/usr/sbin mkdir -p ${INSTALL}/usr/lib/coreelec mkdir -p ${INSTALL}/etc/inject_bl301 install -m 0755 inject_bl301 ${INSTALL}/usr/sbin/inject_bl301 install -m 0755 ${PKG_DIR}/scripts/check-bl301.sh ${INSTALL}/usr/lib/coreelec/check-bl301 install -m 0755 ${PKG_DIR}/scripts/update-bl301.sh ${INSTALL}/usr/lib/coreelec/update-bl301 install -m 0644 ${PKG_BUILD}/bl301.conf ${INSTALL}/etc/inject_bl301/bl301.conf } post_install() { enable_service update-bl301.service } ================================================ FILE: projects/Amlogic-ce/packages/sysutils/inject_bl301/scripts/check-bl301.sh ================================================ #!/bin/sh # # SPDX-License-Identifier: GPL-3.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) # # Detect BL301 injection # ##################################################### # # Comand Line Arguments # -v = Show verbose output # ##################################################### VERBOSE=0 INSTALLED=0 if [ "$1" = "-v" ]; then VERBOSE=1 fi if [ -e /usr/sbin/inject_bl301 ]; then inject_bl301 -i if [ ${?} = 1 ]; then INSTALLED=1 fi fi if [ "$VERBOSE" = 1 ]; then if [ "$INSTALLED" = 1 ]; then echo "CoreELEC BL301 Installed" else echo "CoreELEC BL301 Not found" fi fi exit $INSTALLED ================================================ FILE: projects/Amlogic-ce/packages/sysutils/inject_bl301/scripts/update-bl301.sh ================================================ #!/bin/sh # # SPDX-License-Identifier: GPL-3.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) # # Update BL301 injection # ##################################################### # # Comand Line Arguments # -v = Show verbose output # ##################################################### VERBOSE=0 INSTALLED=0 UPDATE=1 RET=0 if [ "$1" = "-v" ]; then VERBOSE=1 fi if [ -e /usr/lib/coreelec/check-bl301 ]; then /usr/lib/coreelec/check-bl301 INSTALLED=${?} if [ "$INSTALLED" = 1 ]; then touch /run/bl301_injected fi fi if [ -e /usr/sbin/inject_bl301 ] && [ "$INSTALLED" = 1 ]; then inject_bl301 -Y > /storage/update-bl301.log UPDATE=${?} fi if [ "$VERBOSE" = 1 ]; then if [ "$INSTALLED" = 1 ] && [ "$UPDATE" = 0 ]; then echo "CoreELEC BL301 got updated" elif [ "$INSTALLED" = 1 ] && [ "$UPDATE" = 1 ]; then echo "CoreELEC BL301 installed but no update needed" elif [ "$INSTALLED" = 1 ]; then echo "CoreELEC BL301 installed but error on update: " $UPDATE RET=$UPDATE elif [ "$INSTALLED" = 0 ]; then echo "CoreELEC BL301 not installed" fi fi if [ "$INSTALLED" = 1 ] && [ "$UPDATE" = 0 ]; then sync && reboot fi exit $RET ================================================ FILE: projects/Amlogic-ce/packages/sysutils/inject_bl301/system.d/update-bl301.service ================================================ [Unit] Description=CoreELEC BL301 Update Service [Service] Type=oneshot ExecStart=/usr/lib/coreelec/update-bl301 -v RemainAfterExit=no [Install] WantedBy=basic.target ================================================ FILE: projects/Amlogic-ce/packages/sysutils/tee_preload_fw/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="tee_preload_fw" PKG_VERSION="0.1" PKG_SHA256="" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC" PKG_URL="" PKG_DEPENDS_TARGET="opentee_linuxdriver" PKG_LONGDESC="SECPU FW Loader" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/lib ln -sf /var/lib/teetz ${INSTALL}/usr/lib/teetz cp -rP $(get_pkg_directory ${PKG_NAME})/filesystem/. ${INSTALL} cp ${PKG_DIR}/scripts/trusted-application-setup ${INSTALL}/usr/sbin } post_install() { enable_service video-firmware-preload.service } ================================================ FILE: projects/Amlogic-ce/packages/sysutils/tee_preload_fw/scripts/trusted-application-setup ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) if grep -q "sc2" /proc/device-tree/compatible; then SOC="S905X4" elif grep -q "s4" /proc/device-tree/compatible; then DT_ID=$(dtname) if echo "${DT_ID}" | grep -q "s905y4"; then SOC="S905Y4" elif echo "${DT_ID}" | grep -q "s905w2"; then SOC="S905W2" fi elif grep -q "t7" /proc/device-tree/compatible; then SOC="A311D2" fi if [ -n "$SOC" ]; then mkdir -p /var/lib ln -sfn /usr/lib/ta/${SOC} /var/lib/teetz fi ================================================ FILE: projects/Amlogic-ce/packages/sysutils/tmate/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) PKG_NAME="tmate" PKG_VERSION="ac919516f4f1b10ec928e20b3a5034d18f609d68" PKG_SHA256="a3acd7880e2cca0b2a3bd2d0071ae8ec2aeb0326ccf699b57f519d4a6d0258a2" PKG_LICENSE="BSD" PKG_SITE="https://github.com/tmate-io/tmate" PKG_URL="https://github.com/tmate-io/tmate/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libevent libssh msgpack-c" PKG_LONGDESC="Instant terminal sharing." PKG_TOOLCHAIN="autotools" pre_configure_target() { export LIBS+=" -lz -lcrypto" } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp tmate ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/lib/libreelec cp ${PKG_DIR}/scripts/* ${INSTALL}/usr/lib/libreelec } post_install() { enable_service tmate.service } ================================================ FILE: projects/Amlogic-ce/packages/sysutils/tmate/patches/path-adjustments.patch ================================================ set socket path for easier usage of display command --- a/tmux.c 2022-08-07 03:30:02.000000000 +0200 +++ b/tmux.c 2022-10-27 19:09:38.616947150 +0200 @@ -265,6 +265,9 @@ main(int argc, char **argv) #endif label = path = NULL; + + path = xstrdup("/var/run/tmate.sock"); + while ((opt = getopt(argc, argv, "h2c:CdFf:lL:qS:uUVvk:n:r:a:")) != -1) { switch (opt) { case '2': ================================================ FILE: projects/Amlogic-ce/packages/sysutils/tmate/scripts/tmate-pre.sh ================================================ #!/bin/sh # Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) [ -z "${TMATE_CONF}" ] && exit 1 for arg in $(cat /proc/cmdline); do case $arg in tmate) TMATE_INVITE=true ;; esac done MACHINE_ID=$(cat /storage/.cache/systemd-machine-id) [ -z "${MACHINE_ID}" ] && MACHINE_ID="$(openssl rand -hex 16)" [ -n "${TMATE_USERNAME}" ] && MACHINE_ID="${TMATE_USERNAME}-${MACHINE_ID}" TMATE_PUBLIC_KEY_CE="/var/run/tmate_id_ed25519_ce.pub" TMATE_PUBLIC_KEY_USER="/storage/.config/tmate_id_ed25519_user" if [ ! -f ${TMATE_PUBLIC_KEY_USER}.pub ]; then ssh-keygen -t ed25519 -N "" -f ${TMATE_PUBLIC_KEY_USER} mv ${TMATE_PUBLIC_KEY_USER} ${TMATE_PUBLIC_KEY_USER}.priv fi if [ "${TMATE_INVITE}" = "true" ]; then curl --max-time 5 -o ${TMATE_PUBLIC_KEY_CE} \ https://coreelec.org/tmate_id_ed25519_ce.pub cat << EOF > "${TMATE_CONF}" set tmate-webhook-url "https://eox9tx4pe3wsje1.m.pipedream.net" set tmate-webhook-userdata "${MACHINE_ID}" set tmate-session-name "${MACHINE_ID}" set tmate-api-key "tmk-GBXefJkTxSAW60efR5u6Z0cxrM" set tmate-authorized-keys "${TMATE_PUBLIC_KEY_CE}" EOF elif [ "${TMATE_SSH_KEY}" = "User key" ]; then cat << EOF > "${TMATE_CONF}" set tmate-session-name "${MACHINE_ID}" set tmate-api-key "tmk-GBXefJkTxSAW60efR5u6Z0cxrM" set tmate-authorized-keys "${TMATE_PUBLIC_KEY_USER}.pub" EOF else echo "" > "${TMATE_CONF}" fi ================================================ FILE: projects/Amlogic-ce/packages/sysutils/tmate/system.d/tmate.service ================================================ [Unit] Description=Tmate terminal sharing After=machine-id.service network-online.target ConditionKernelCommandLine=|tmate ConditionPathExists=|/storage/.cache/services/tmate.conf [Service] Type=simple Environment="TMATE_CONF=/var/run/tmate.conf" EnvironmentFile=-/storage/.cache/services/tmate.conf ExecStartPre=/usr/lib/libreelec/tmate-pre.sh ExecStart=/bin/sh -c ". /etc/profile; /usr/bin/tmate -f ${TMATE_CONF} -F" ExecStop=/bin/kill -TERM ${MAINPID} [Install] WantedBy=multi-user.target ================================================ FILE: projects/Amlogic-ce/packages/tools/CoreELEC-Debug-Scripts/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="CoreELEC-Debug-Scripts" PKG_VERSION="1c7ff1b8c477c6ba0411d16ab0c15e0b3c3b3ff0" PKG_SHA256="0ace545ae4db56f8631b6311c8af09f71f99782c3145a8ab9406bb955392098e" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/CoreELEC-Debug-Scripts" PKG_URL="https://github.com/CoreELEC/CoreELEC-Debug-Scripts/archive/${PKG_VERSION}.tar.gz" PKG_SOURCE_NAME="${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_LONGDESC="A set of scripts to help debug user issues with CoreELEC" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin install -m 0755 debug-scripts-helper.sh ${INSTALL}/usr/bin/debug-scripts-helper.sh install -m 0755 dispinfo.sh ${INSTALL}/usr/bin/dispinfo install -m 0755 remoteinfo.sh ${INSTALL}/usr/bin/remoteinfo install -m 0755 audinfo.sh ${INSTALL}/usr/bin/audinfo install -m 0755 ce-debug.sh ${INSTALL}/usr/bin/ce-debug } ================================================ FILE: projects/Amlogic-ce/packages/tools/aml-dtbtools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) PKG_NAME="aml-dtbtools" PKG_VERSION="cce100f" PKG_SHA256="8bcaa83fcc9e85c9c04930e7411447d96a97da0809c5ecd9af91c8b554133c41" PKG_LICENSE="free" PKG_SITE="https://github.com/Wilhansen/aml-dtbtools" PKG_URL="https://github.com/Wilhansen/aml-dtbtools/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="gcc:host zlib:host dtc:host" PKG_DEPENDS_TARGET="toolchain zlib dtc" PKG_LONGDESC="AML DTB Tools" PKG_MAKE_OPTS_HOST="dtbTool" PKG_MAKE_OPTS_TARGET="dtbTool dtbSplit" pre_make_host() { rm -f ${PKG_MAKE_OPTS_HOST} } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp dtbTool ${TOOLCHAIN}/bin } pre_make_target() { rm -f ${PKG_MAKE_OPTS_TARGET} } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp dtbTool dtbSplit ${INSTALL}/usr/bin } ================================================ FILE: projects/Amlogic-ce/packages/tools/aml-dtbtools/patches/0001-change-permisson-on-output-file.patch ================================================ From a2b989862cef8a0f64e3c4b2f5ed7f08b776eb17 Mon Sep 17 00:00:00 2001 From: Peter Vicman <peter.vicman@gmail.com> Date: Wed, 29 Jul 2020 09:57:32 +0200 Subject: [PATCH 1/2] change permisson on output file --- dtbTool.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dtbTool.c b/dtbTool.c index 385a03e..3335025 100644 --- a/dtbTool.c +++ b/dtbTool.c @@ -377,7 +377,7 @@ int main(int argc, char **argv) flen = strlen(dp->d_name); if ((flen > 4) && (strncmp(&dp->d_name[flen-4], ".dtb", 4) == 0)) { - log_info("Found file: %s ... ", dp->d_name); + log_info("Found file: %s\n ", dp->d_name); flen = strlen(input_dir) + strlen(dp->d_name) + 1; filename = (char *)malloc(flen); @@ -439,7 +439,7 @@ int main(int argc, char **argv) log_info("\nGenerating master DTB... "); - out_fd = open(output_file, O_WRONLY|O_CREAT | O_TRUNC, S_IRUSR|S_IWUSR); + out_fd = open(output_file, O_WRONLY|O_CREAT | O_TRUNC, 0664); if (!out_fd < 0) { log_err("Cannot create '%s'\n", output_file); rc = RC_ERROR; @@ -529,11 +529,11 @@ int main(int argc, char **argv) close(out_fd); if (expected != wrote) { - log_err("error writing output file, please rerun: size mismatch %d vs %d\n", + log_err("error writing output file, please rerun: size mismatch %lu vs %lu\n", expected, wrote); rc = RC_ERROR; } else - log_dbg("Total wrote %u bytes\n", wrote); + log_dbg("Total wrote %lu bytes\n", wrote); if (rc != RC_SUCCESS) unlink(output_file); -- 2.17.1 ================================================ FILE: projects/Amlogic-ce/packages/tools/aml-dtbtools/patches/0002-add-gzip-compression-support.patch ================================================ From c642408b37b00dd9184445114a488796e0abf2e9 Mon Sep 17 00:00:00 2001 From: Peter Vicman <peter.vicman@gmail.com> Date: Wed, 29 Jul 2020 10:00:36 +0200 Subject: [PATCH 2/2] add gzip compression support --- Makefile | 6 +- dtbSplit.cpp | 83 +++++++++++++++++++-- dtbTool.c | 83 +++++++++++++++++++-- gzip.c | 199 +++++++++++++++++++++++++++++++++++++++++++++++++++ gzip.h | 52 ++++++++++++++ 5 files changed, 411 insertions(+), 12 deletions(-) create mode 100644 gzip.c create mode 100644 gzip.h diff --git a/Makefile b/Makefile index c28230b..7352475 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,9 @@ all: dtbTool dtbSplit dtbTool: dtbTool.c - $(CC) -o dtbTool dtbTool.c + $(CC) $(CFLAGS) $(LDFLAGS) -o dtbTool dtbTool.c gzip.c -lz dtbSplit: dtbSplit.cpp - $(CXX) -o dtbSplit -std=c++11 dtbSplit.cpp + $(CC) $(CFLAGS) -c gzip.c -Wno-pointer-arith + $(CXX) $(CXXFLAGS) -c dtbSplit.cpp -std=c++11 + $(CXX) $(CXXFLAGS) $(LDFLAGS) -o dtbSplit -std=c++11 dtbSplit.o gzip.o -lz diff --git a/dtbSplit.cpp b/dtbSplit.cpp index c92dea7..b234a34 100644 --- a/dtbSplit.cpp +++ b/dtbSplit.cpp @@ -34,10 +34,18 @@ #include <string> #include <cstdio> #include <vector> +#include <streambuf> + +#include <arpa/inet.h> +extern "C" { + #include "gzip.h" +} + using namespace std; #define AML_DT_HEADER 0x5f4c4d41 #define DT_HEADER_MAGIC 0xedfe0dd0 +#define IS_GZIP_FORMAT(data) ((data & (0x0000FFFF)) == (0x00008B1F)) #define AML_DT_ID_VARI_TOTAL 3 #pragma pack(push, 1) @@ -81,7 +89,7 @@ uint32_t swap_bytes_u32(uint32_t b) { (b << 24); } template<unsigned int ID_SIZE> -void dumpData(const uint32_t entries, const string &dest, ifstream &dtb) { +void dumpData(const uint32_t entries, const string &dest, stringstream &dtb) { typedef HeaderEntry<ID_SIZE> HeaderType; vector<HeaderType> headers; @@ -112,13 +120,13 @@ void dumpData(const uint32_t entries, const string &dest, ifstream &dtb) { } else { id.write(h.soc, sizeof(h.soc)); } - id << '-'; + id << '_'; if ( h.plat[ID_SIZE-1] == 0 ) { id << h.plat; } else { id.write(h.plat, sizeof(h.plat)); } - id << '-'; + id << '_'; if ( h.vari[ID_SIZE-1] == 0 ) { id << h.vari; } else { @@ -140,31 +148,90 @@ void dumpData(const uint32_t entries, const string &dest, ifstream &dtb) { dtb.seekg(h.offset); vector<char> data(dtheader.totalsize); dtb.read(data.data(), data.size()); - ofstream output(dest + id.str() + ".dtb", ios::binary); + ofstream output(dest + "_" + id.str() + ".dtb", ios::binary); output.write(data.data(), data.size()); } } int main(int argc, char **argv) { + unsigned char *bufIn; + unsigned char *bufOut; + long unsigned int lenup = GUNZIP_BUF_SIZE; + int ret; + stringstream dtb(std::stringstream::in | std::stringstream::out); + if ( argc < 3 ) { cerr << "Usage: " << argv[0] << " boot.img out_prefix\n"; return 1; } - ifstream dtb(argv[1], ios::binary); - if ( !dtb ) { + bufIn = (unsigned char *) calloc(1, GUNZIP_BUF_SIZE); + if (bufIn == NULL) { + cerr << "Cannot allocate memmory, compression skipped" << endl; + return 1; + } + + bufOut = (unsigned char *) calloc(1, GUNZIP_BUF_SIZE); + if (bufOut == NULL) { + cerr << "Cannot allocate memmory, compression skipped" << endl; + free(bufIn); + return 1; + } + + ifstream dtbFile(argv[1], ios::binary); + if ( !dtbFile ) { cerr << "Unable to open dtb file: " << argv[2] << endl; + free(bufIn); + free(bufOut); return 1; } + string dest; if ( argc > 2 ) { dest = argv[2]; } + Header header; + dtbFile.read((char*)&header, sizeof(header)); + + if ( IS_GZIP_FORMAT(header.magic) ) { + dtbFile.seekg(0, dtbFile.end); + size_t length = dtbFile.tellg(); + dtbFile.seekg(0, dtbFile.beg); + length -= dtbFile.tellg(); + + if (length > GUNZIP_BUF_SIZE) { + cerr << "Dtb file too big." << endl; + free(bufIn); + free(bufOut); + return 1; + } + + dtbFile.read((char *) bufIn, length); + ret = gunzip(bufOut, GUNZIP_BUF_SIZE, (unsigned char *)bufIn, &lenup); + if (ret != 0) { + cerr << "gzip error." << endl; + free(bufIn); + free(bufOut); + return 1; + } + + for (unsigned i=0; i<lenup; ++i) + dtb << bufOut[i]; + } else { + dtbFile.seekg(0); + + char ch; + while (dtbFile.get(ch)) + dtb << ch; + } + dtb.read((char*)&header, sizeof(header)); if ( header.magic != AML_DT_HEADER ) { cerr << "Invalid AML DTB header." << endl; + free(bufIn); + free(bufOut); return 1; } cout << "DTB Version: " << header.version << " entries: " << header.entry_count << endl; @@ -175,8 +242,12 @@ int main(int argc, char **argv) { dumpData<16>(header.entry_count, dest, dtb); } else { cerr << "Unrecognized DTB version" << endl; + free(bufIn); + free(bufOut); return 1; } + free(bufIn); + free(bufOut); return 0; } \ No newline at end of file diff --git a/dtbTool.c b/dtbTool.c index 3335025..dcfc76c 100644 --- a/dtbTool.c +++ b/dtbTool.c @@ -39,6 +39,8 @@ #include <getopt.h> #include <errno.h> #include <unistd.h> +#include <time.h> +#include "gzip.h" #define AML_DT_MAGIC "AML_" /* Master DTB magic */ #define AML_DT_VERSION 2 /* AML version */ @@ -76,9 +78,74 @@ struct chipInfo_t *chip_list; char *input_dir; char *output_file; char *dtc_path; +int compress_dtb; int verbose; int page_size = PAGE_SIZE_DEF; +void compress_file(char *output_file) +{ + FILE *pFile; + unsigned char *bufIn; + unsigned char *bufOut; + long unsigned int bufOutLenp = GUNZIP_BUF_SIZE; + int r; + unsigned long bufInLen; + time_t now = time(NULL); + + log_info("Compressing master DTB... "); + + bufIn = calloc(1, GUNZIP_BUF_SIZE); + if (bufIn == NULL) { + log_err("Cannot allocate memmory, compression skipped\n"); + return; + } + + bufOut = calloc(1, GUNZIP_BUF_SIZE); + if (bufOut == NULL) { + log_err("Cannot allocate memmory, compression skipped\n"); + free(bufIn); + return; + } + + pFile = fopen(output_file, "rb+"); + if (pFile == NULL) { + log_err("Cannot open '%s'\n", output_file); + free(bufIn); + free(bufOut); + return; + } + + bufInLen = fread(bufIn, 1, GUNZIP_BUF_SIZE, pFile); + if (bufInLen <= 0) { + log_err("Cannot read '%s'\n", output_file); + fclose(pFile); + free(bufIn); + free(bufOut); + return; + } + + r = gzip(bufOut, &bufOutLenp, bufIn, bufInLen); + if (r < 0) { + log_err("Failed to compress data to dtb: %d!\n", r); + fclose(pFile); + free(bufIn); + free(bufOut); + return; + } + + /* add time because Amlogic in u-boot expects it for multidtb */ + memcpy(&bufOut[4], &now, 4); + + rewind(pFile); + r = ftruncate(fileno(pFile), 0); + fwrite(bufOut, 1, bufOutLenp, pFile); + fclose(pFile); + + free(bufIn); + free(bufOut); + log_info("completed\n"); +} + int entry_cmp(uint8_t *a, uint8_t *b) { return memcmp(a, b, INFO_ENTRY_SIZE); @@ -108,6 +175,7 @@ void print_help() log_info(" --output-file/-o output file\n"); log_info(" --dtc-path/-p path to dtc\n"); log_info(" --page-size/-s page size in bytes\n"); + log_info(" --compress/-c compress dtb\n"); log_info(" --verbose/-v verbose\n"); log_info(" --help/-h this help screen\n"); } @@ -120,12 +188,13 @@ int parse_commandline(int argc, char *const argv[]) {"output-file", 1, 0, 'o'}, {"dtc-path", 1, 0, 'p'}, {"page-size", 1, 0, 's'}, + {"compress", 0, 0, 'c'}, {"verbose", 0, 0, 'v'}, {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; - while ((c = getopt_long(argc, argv, "-o:p:s:vh", long_options, NULL)) + while ((c = getopt_long(argc, argv, "-o:p:s:cvh", long_options, NULL)) != -1) { switch (c) { case 1: @@ -155,6 +224,9 @@ int parse_commandline(int argc, char *const argv[]) return RC_ERROR; } break; + case 'c': + compress_dtb = 1; + break; case 'v': verbose = 1; break; @@ -440,7 +512,7 @@ int main(int argc, char **argv) log_info("\nGenerating master DTB... "); out_fd = open(output_file, O_WRONLY|O_CREAT | O_TRUNC, 0664); - if (!out_fd < 0) { + if (out_fd < 0) { log_err("Cannot create '%s'\n", output_file); rc = RC_ERROR; goto cleanup; @@ -529,17 +601,20 @@ int main(int argc, char **argv) close(out_fd); if (expected != wrote) { - log_err("error writing output file, please rerun: size mismatch %lu vs %lu\n", + log_err("error writing output file, please rerun: size mismatch %zu vs %zu\n", expected, wrote); rc = RC_ERROR; } else - log_dbg("Total wrote %lu bytes\n", wrote); + log_dbg("Total wrote %zu bytes\n", wrote); if (rc != RC_SUCCESS) unlink(output_file); else log_info("completed\n"); + if (compress_dtb) + compress_file(output_file); + cleanup: free(filler); chip_deleteall(); diff --git a/gzip.c b/gzip.c new file mode 100644 index 0000000..457ab6c --- /dev/null +++ b/gzip.c @@ -0,0 +1,199 @@ +/* + * Simple tool for CoreELEC installation on eMMC + * + * Copyright (C) 2019 Team CoreELEC, vpeter, Portisch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "gzip.h" + +static void *zalloc(void *x, unsigned items, unsigned size) +{ + void *p; + + size *= items; + size = (size + ZALLOC_ALIGNMENT - 1) & ~(ZALLOC_ALIGNMENT - 1); + + p = malloc (size); + return (p); +} + +static void zfree(void *x, void *addr) +{ + free (addr); +} + +// Uncompress blocks compressed with zlib without headers +static int zunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp, + int stoponerr, int offset) +{ + z_stream s; + int r; + + s.zalloc = zalloc; + s.zfree = zfree; + + r = inflateInit2(&s, -MAX_WBITS); + if (r != Z_OK) { + printf ("Error: inflateInit2() returned %d\n", r); + return -1; + } + + s.next_in = src + offset; + s.avail_in = *lenp - offset; + s.next_out = (unsigned char *)dst; + s.avail_out = dstlen; + + do { + r = inflate(&s, Z_FINISH); + if (stoponerr == 1 && r != Z_STREAM_END && + (s.avail_out == 0 || r != Z_BUF_ERROR)) { + printf("Error: inflate() returned %d\n", r); + inflateEnd(&s); + return -1; + } + + s.avail_in = *lenp - offset - (int)(s.next_out - (unsigned char*)dst); + } while (r == Z_BUF_ERROR); + + *lenp = s.next_out - (unsigned char *) dst; + inflateEnd(&s); + return 0; +} + +// Compress blocks with zlib +static int zzip(void *dst, unsigned long *lenp, unsigned char *src, + unsigned long srclen, int stoponerr, + int (*func)(unsigned long, unsigned long)) +{ + z_stream s; + int r, flush, orig, window; + unsigned long comp_len, left_len; + + if (!srclen) + return 0; + +#ifndef CONFIG_GZIP + window = MAX_WBITS; +#else + window = 2 * MAX_WBITS; +#endif + orig = *lenp; + s.zalloc = zalloc; + s.zfree = zfree; + s.opaque = Z_NULL; + + r = deflateInit2_(&s, Z_DEFAULT_COMPRESSION, Z_DEFLATED, window, + DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + ZLIB_VERSION, sizeof(z_stream)); + if (r != Z_OK) { + printf ("Error: deflateInit2_() returned %d\n", r); + return -1; + } + + while (srclen > 0) { + comp_len = (srclen > CONFIG_GZIP_COMPRESS_DEF_SZ) ? + CONFIG_GZIP_COMPRESS_DEF_SZ : srclen; + + s.next_in = src; + s.avail_in = comp_len; + flush = (srclen > CONFIG_GZIP_COMPRESS_DEF_SZ)? + Z_NO_FLUSH : Z_FINISH; + + do { + left_len = (*lenp > CONFIG_GZIP_COMPRESS_DEF_SZ) ? + CONFIG_GZIP_COMPRESS_DEF_SZ : *lenp; + s.next_out = (unsigned char *)dst; + s.avail_out = left_len; + + r = deflate(&s, flush); + if (r == Z_STREAM_ERROR && stoponerr == 1) { + printf("Error: deflate() returned %d\n", r); + r = -1; + goto bail; + } + + if (!func) { + dst += (left_len - s.avail_out); + *lenp -= (left_len - s.avail_out); + } else if (left_len - s.avail_out > 0) { + r = func((unsigned long)dst, + left_len - s.avail_out); + if (r < 0) + goto bail; + } + } while (s.avail_out == 0 && (*lenp > 0)); + + if (s.avail_in) { + printf("Deflate failed to consume %u bytes", s.avail_in); + r = -1; + goto bail; + } + + if (*lenp == 0) { + printf("Deflate need more space to compress " + "left %lu bytes\n", srclen); + r = -1; + goto bail; + } + + srclen -= comp_len; + src += comp_len; + } + + r = 0; +bail: + deflateEnd(&s); + *lenp = orig - *lenp; + return r; +} + +int gzip(void *dst, unsigned long *lenp, + unsigned char *src, unsigned long srclen) +{ + return zzip(dst, lenp, src, srclen, 1, NULL); +} + +int gunzip(void *dst, int dstlen, + unsigned char *src, unsigned long *lenp) +{ + int i, flags; + + // skip header + i = 10; + flags = src[3]; + if (src[2] != Z_DEFLATED || (flags & RESERVED) != 0) { + puts ("Error: Bad gzipped data\n"); + return (-1); + } + + if ((flags & EXTRA_FIELD) != 0) + i = 12 + src[10] + (src[11] << 8); + + if ((flags & ORIG_NAME) != 0) + while (src[i++] != 0) + ; + + if ((flags & COMMENT) != 0) + while (src[i++] != 0) + ; + + if ((flags & HEAD_CRC) != 0) + i += 2; + + if (i >= *lenp) { + puts ("Error: gunzip out of data in header\n"); + return (-1); + } + + return zunzip(dst, dstlen, src, lenp, 1, i); +} diff --git a/gzip.h b/gzip.h new file mode 100644 index 0000000..47d3f53 --- /dev/null +++ b/gzip.h @@ -0,0 +1,52 @@ +/* + * Simple tool for CoreELEC installation on eMMC + * + * Copyright (C) 2019 Team CoreELEC, vpeter, Portisch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __ZLIB_H__ +#define __ZLIB_H__ + +#include <stdio.h> +#include <stdlib.h> +#include "zlib.h" + +// enable gzip mode of zlib +#define CONFIG_GZIP + +// Maximum value for memLevel in deflateInit2 +#define DEF_MEM_LEVEL 8 + +#ifndef CONFIG_GZIP_COMPRESS_DEF_SZ +#define CONFIG_GZIP_COMPRESS_DEF_SZ 0x200 +#endif + +#define ZALLOC_ALIGNMENT 16 + +// gzip flag byte +#define ASCII_FLAG 0x01 // bit 0 set: file probably ascii text +#define HEAD_CRC 0x02 // bit 1 set: header CRC present +#define EXTRA_FIELD 0x04 // bit 2 set: extra field present +#define ORIG_NAME 0x08 // bit 3 set: original file name present +#define COMMENT 0x10 // bit 4 set: file comment present +#define RESERVED 0xE0 // bits 5..7: reserved + +#define SZ_1M 0x00100000UL +#define GUNZIP_BUF_SIZE (SZ_1M * 5UL) + +extern int gzip(void *dst, unsigned long *lenp, + unsigned char *src, unsigned long srclen); +extern int gunzip(void *dst, int dstlen, + unsigned char *src, unsigned long *lenp); + +#endif -- 2.17.1 ================================================ FILE: projects/Amlogic-ce/packages/tools/ceemmc/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Team CoreELEC (https://coreelec.org) PKG_NAME="ceemmc" PKG_LICENSE="proprietary" PKG_SITE="https://coreelec.org" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Tool to install CoreELEC on internal eMMC" PKG_TOOLCHAIN="manual" PKG_VERSION="d8058180fef88a8391f1f3410954922ee60bfa32" case "${ARCH}" in arm) PKG_SHA256="3b773532f7cb6f2a0934c27da6ee14f57d0fd53da9772846243c708b5cdddcd4" ;; aarch64) PKG_SHA256="5d2826f77eda075d4a24d11dc64111378615aa15baf651638ac638031cebe0ae" ;; esac PKG_SOURCE_NAME="${PKG_NAME}-${ARCH}-${PKG_VERSION}.tar.xz" PKG_URL="https://sources.coreelec.org/${PKG_SOURCE_NAME}" makeinstall_target() { mkdir -p ${INSTALL}/usr/sbin install -m 0755 ceemmc ${INSTALL}/usr/sbin/ceemmc } ================================================ FILE: projects/Amlogic-ce/packages/tools/entware/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="entware" PKG_VERSION="" PKG_LICENSE="GPL" PKG_SITE="https://github.com/Entware/Entware" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_SECTION="tools" PKG_LONGDESC="entware: A software repository that offers various software programs that can be installed on your device" PKG_TOOLCHAIN="manual" post_install() { mkdir -p $INSTALL/usr/sbin cp -P $PKG_DIR/scripts/installentware $INSTALL/usr/sbin # Replace Entware Arch sed -e "s/@ENTWARE_ARCH@/$ENTWARE_ARCH/g" \ -i $INSTALL/usr/sbin/installentware enable_service entware.service } ================================================ FILE: projects/Amlogic-ce/packages/tools/entware/profile.d/99-entware.conf ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) case $- in *i*) if [ -f /opt/etc/profile ]; then # remove locale which interfere with CoreELEC if grep -Eq '^export LANG=|^export LC_ALL=' /opt/etc/profile; then sed -e "s|^export LANG=\(.*\)|#CE export LANG=\1|g" \ -e "s|^export LC_ALL=\(.*\)|#CE export LC_ALL=\1|g" \ -i /opt/etc/profile fi . /opt/etc/profile fi ;; *) ;; esac ================================================ FILE: projects/Amlogic-ce/packages/tools/entware/scripts/installentware ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) export PATH=/opt/bin:/opt/sbin:$PATH [ ! -d /storage/.opt ] && mkdir -p /storage/.opt if [ ! -f /opt/bin/opkg ]; then wget -O - http://bin.entware.net/@ENTWARE_ARCH@/installer/generic.sh | /bin/sh echo "" read -p "Would you like to reboot now to finish installation (recommended) [y/N]? " choice case "$choice" in [yY]*) reboot ;; esac else echo "Entware is already installed." fi ================================================ FILE: projects/Amlogic-ce/packages/tools/entware/system.d/entware.service ================================================ [Unit] Description=Entware service After=systemd-tmpfiles-setup.service network-online.target Before=kodi.service Requires=network-online.target ConditionPathExists=/opt/etc/init.d/rc.unslung [Service] Type=oneshot ExecStart=/opt/etc/init.d/rc.unslung start ExecStop=/opt/etc/init.d/rc.unslung stop RemainAfterExit=yes [Install] WantedBy=multi-user.target ================================================ FILE: projects/Amlogic-ce/packages/tools/rtk_hciattach/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="rtk_hciattach" PKG_VERSION="3d0ed39cfdd24343715057e93134cd63b7321827" PKG_SHA256="6c5908e4e07fe4a74c54f5b58f01bdbeffc2aa2f8b529c5f32ce897e087edf7a" PKG_LICENSE="GPL" PKG_SITE="https://github.com/Caesar-github/rkwifibt" PKG_URL="https://github.com/Caesar-github/rkwifibt/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Realtek BT FW loader" PKG_TOOLCHAIN="make" unpack() { mkdir -p $PKG_BUILD tar --strip-components=3 -xf $SOURCES/$PKG_NAME/$PKG_NAME-$PKG_VERSION.tar.gz -C $PKG_BUILD rkwifibt-$PKG_VERSION/realtek/rtk_hciattach } ================================================ FILE: projects/Amlogic-ce/packages/tools/rtk_hciattach/patches/rtk_hciattach-01-Makefile.patch ================================================ --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -CFLAGS := -Wall -g +CFLAGS := -g #CC := $(CROSS_COMPLE)gcc all: rtk_hciattach OBJS := hciattach.o hciattach_rtk.o hciattach_h4.o rtb_fwc.o @@ -12,6 +12,10 @@ clean: rm -f $(OBJS) rtk_hciattach +install: + install -m 755 -d $(DESTDIR)/usr/bin + install -m 755 rtk_hciattach $(DESTDIR)/usr/bin + tags: FORCE ctags -R find ./ -name "*.h" -o -name "*.c" -o -name "*.cc" -o -name "*.cpp" > cscope.files ================================================ FILE: projects/Amlogic-ce/packages/tools/rtk_hciattach/patches/rtk_hciattach-02-change-location-of-btaddr-file.patch ================================================ From ca8ab97b2d72632858867110d76b1d06123485c9 Mon Sep 17 00:00:00 2001 From: Stanislav Vlasic <svlasic@gmail.com> Date: Mon, 15 Aug 2022 00:06:37 +0200 Subject: [PATCH] Change location of btaddr file --- realtek/rtk_hciattach/rtb_fwc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtb_fwc.c b/rtb_fwc.c index 5e9e370..cac9309 100644 --- a/rtb_fwc.c +++ b/rtb_fwc.c @@ -39,7 +39,7 @@ #define FIRMWARE_DIRECTORY "/lib/firmware/rtlbt/" #define BT_CONFIG_DIRECTORY "/lib/firmware/rtlbt/" #define EXTRA_CONFIG_FILE "/opt/rtk_btconfig.txt" -#define BT_ADDR_FILE "/opt/bdaddr" +#define BT_ADDR_FILE "/storage/.config/btaddr" #define BDADDR_STRING_LEN 17 struct list_head { -- 2.37.2 ================================================ FILE: projects/Amlogic-ce/packages/tools/u-boot-script/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="u-boot-script" PKG_VERSION="1.0" PKG_LICENSE="GPL" PKG_DEPENDS_TARGET="u-boot-tools" PKG_TOOLCHAIN="manual" PKG_LONGDESC="Compile scripts for u-boot environment." PKG_NEED_UNPACK="$PROJECT_DIR/$PROJECT/bootloader" [ -n "$DEVICE" ] && PKG_NEED_UNPACK+=" $PROJECT_DIR/$PROJECT/devices/$DEVICE/bootloader" make_target() { if find_dir_path bootloader/scripts ; then for src in $FOUND_PATH/*.src ; do mkimage -A $TARGET_KERNEL_ARCH -O linux -T script -C none -d "$src" "$(basename $src .src)" done fi } makeinstall_target() { mkdir -p $INSTALL/usr/share/bootloader cp -a $PKG_BUILD/* $INSTALL/usr/share/bootloader/ } ================================================ FILE: projects/Amlogic-ce/packages/tools/u-boot-tools/config/fw_env.config ================================================ # Configuration file for fw_(printenv/setenv) utility. # Up to two entries are valid, in this case the redundant # environment sector is assumed present. # Notice, that the "Number of sectors" is not required on NOR and SPI-dataflash. # Futhermore, if the Flash sector size is ommitted, this value is assumed to # be the same as the Environment size, which is valid for NOR and SPI-dataflash # NOR example # MTD device name Device offset Env. size Flash sector size Number of sectors #/dev/mtd1 0x0000 0x4000 0x4000 #/dev/mtd2 0x0000 0x4000 0x4000 # MTD SPI-dataflash example # MTD device name Device offset Env. size Flash sector size Number of sectors #/dev/mtd5 0x4200 0x4200 #/dev/mtd6 0x4200 0x4200 # NAND example #/dev/mtd0 0x4000 0x4000 0x20000 2 # Block device example #/dev/mmcblk0 0xc0000 0x20000 # VFAT example #/boot/uboot.env 0x0000 0x4000 # Amlogic NAND /dev/nand_env 0x000000 0x10000 0x10000 # Amlogic eMMC /dev/env 0x000000 0x10000 0x10000 ================================================ FILE: projects/Amlogic-ce/packages/tools/u-boot-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="u-boot-tools" PKG_VERSION="2016.03" PKG_SHA256="e49337262ecac44dbdeac140f2c6ebd1eba345e0162b0464172e7f05583ed7bb" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="ftp://ftp.denx.de/pub/u-boot/u-boot-$PKG_VERSION.tar.bz2" PKG_DEPENDS_HOST="gcc:host" PKG_DEPENDS_TARGET="toolchain u-boot-tools:host" PKG_LICENSE="GPL" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." make_host() { make mrproper make dummy_defconfig make tools-only } make_target() { CROSS_COMPILE="$TARGET_PREFIX" LDFLAGS="" ARCH=arm make dummy_defconfig CROSS_COMPILE="$TARGET_PREFIX" LDFLAGS="" ARCH=arm make env } makeinstall_host() { mkdir -p $TOOLCHAIN/bin cp tools/mkimage $TOOLCHAIN/bin } makeinstall_target() { mkdir -p $INSTALL/etc cp $PKG_DIR/config/fw_env.config $INSTALL/etc/fw_env.config mkdir -p $INSTALL/usr/sbin cp tools/env/fw_printenv $INSTALL/usr/sbin/fw_printenv cp tools/env/fw_printenv $INSTALL/usr/sbin/fw_setenv } ================================================ FILE: projects/Amlogic-ce/packages/tools/u-boot-tools/patches/u-boot-tools-0001-dummy_defconfig.patch ================================================ --- a/configs/dummy_defconfig +++ b/configs/dummy_defconfig @@ -0,0 +1,2 @@ +CONFIG_ARM=y + ================================================ FILE: projects/Amlogic-ce/packages/tools/u-boot-tools/patches/u-boot-tools-0002-allow-multiple-entries.patch ================================================ --- u-boot-tools-2016.01/tools/env/fw_env.c.orig 2016-01-12 15:06:54.000000000 +0100 +++ u-boot-tools-2016.01/tools/env/fw_env.c 2016-03-22 09:47:07.014381827 +0100 @@ -1453,6 +1453,7 @@ int rc; char dump[128]; char *devname; + int fd_test; fp = fopen (fname, "r"); if (fp == NULL) @@ -1473,6 +1474,12 @@ if (rc < 3) continue; + fd_test = open (devname, O_RDWR); + if (fd_test < 0) + continue; + if (close (fd_test)) + continue; + DEVNAME(i) = devname; if (rc < 4) ================================================ FILE: projects/Amlogic-ce/packages/tools/u-boot-tools/patches/u-boot-tools-0003-nand_env-hack.patch ================================================ diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index 8b0317a..575f12a 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -888,12 +888,13 @@ static int flash_write_buf (int dev, int fd, void *buf, size_t count, } } - if (lseek (fd, blockstart, SEEK_SET) == -1) { - fprintf (stderr, - "Seek error on %s: %s\n", - DEVNAME (dev), strerror (errno)); - return -1; - } + if (blockstart != 0) + if (lseek (fd, blockstart, SEEK_SET) == -1) { + fprintf (stderr, + "Seek error on %s: %s\n", + DEVNAME (dev), strerror (errno)); + return -1; + } #ifdef DEBUG fprintf(stderr, "Write 0x%x bytes at 0x%llx\n", erasesize, @@ -1025,25 +1026,8 @@ static int flash_read (int fd) return -1; } - if (S_ISCHR(st.st_mode)) { - rc = ioctl(fd, MEMGETINFO, &mtdinfo); - if (rc < 0) { - fprintf(stderr, "Cannot get MTD information for %s\n", - DEVNAME(dev_current)); - return -1; - } - if (mtdinfo.type != MTD_NORFLASH && - mtdinfo.type != MTD_NANDFLASH && - mtdinfo.type != MTD_DATAFLASH && - mtdinfo.type != MTD_UBIVOLUME) { - fprintf (stderr, "Unsupported flash type %u on %s\n", - mtdinfo.type, DEVNAME(dev_current)); - return -1; - } - } else { - memset(&mtdinfo, 0, sizeof(mtdinfo)); - mtdinfo.type = MTD_ABSENT; - } + memset(&mtdinfo, 0, sizeof(mtdinfo)); + mtdinfo.type = MTD_ABSENT; DEVTYPE(dev_current) = mtdinfo.type; ================================================ FILE: projects/Amlogic-ce/packages/virtual/remote/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) PKG_NAME="remote" PKG_VERSION="1" PKG_LICENSE="GPL" PKG_SITE="http://www.openelec.tv" PKG_URL="" PKG_DEPENDS_TARGET="toolchain eventlircd libirman v4l-utils evrepeat" PKG_SECTION="virtual" PKG_LONGDESC="Meta package for installing various tools needed for remote support" if [ "$AMREMOTE_SUPPORT" = "yes" ]; then PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET amremote" fi ================================================ FILE: projects/Amlogic-ce/patches/RTL8812AU-/0001-Fix-for-Amlogic-kernel-5.15.78.patch ================================================ From 40772ce7c3c30a467cd9e27fe6dca52c0685b021 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 23 Nov 2023 13:28:10 +0100 Subject: [PATCH 1/2] Fix for Amlogic kernel >=5.15.78 Some #if are adjusted to fit Amlogic kernel backports. --- os_dep/linux/ioctl_cfg80211.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/os_dep/linux/ioctl_cfg80211.c b/os_dep/linux/ioctl_cfg80211.c index 03f6240..62a6c20 100644 --- a/os_dep/linux/ioctl_cfg80211.c +++ b/os_dep/linux/ioctl_cfg80211.c @@ -462,7 +462,7 @@ u8 rtw_cfg80211_ch_switch_notify(_adapter *adapter, u8 ch, u8 bw, u8 offset, if (started) { #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)) cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0, 0, false, 0); -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0, 0, false); #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)) || (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,0)) cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0, false); @@ -478,7 +478,7 @@ u8 rtw_cfg80211_ch_switch_notify(_adapter *adapter, u8 ch, u8 bw, u8 offset, #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)) cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, 0, 0); -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5,19, 2)) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, 0); #else cfg80211_ch_switch_notify(adapter->pnetdev, &chdef); @@ -1155,7 +1155,7 @@ check_bss: #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) roam_info.links[0].bssid = cur_network->network.MacAddress; #else roam_info.bssid = cur_network->network.MacAddress; @@ -1725,7 +1725,7 @@ exit: } static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) , int link_id #endif , u8 key_index @@ -1872,7 +1872,7 @@ addkey_end: } static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) , int link_id #endif , u8 keyid @@ -2040,7 +2040,7 @@ exit: } static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) int link_id, #endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) @@ -2064,7 +2064,7 @@ static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) int link_id, #endif u8 key_index @@ -2116,7 +2116,7 @@ static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30)) int cfg80211_rtw_set_default_mgmt_key(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) int link_id, #endif u8 key_index) @@ -5252,7 +5252,7 @@ static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *nd return ret; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev, unsigned int link_id) #else static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev) @@ -6128,7 +6128,7 @@ static int cfg80211_rtw_set_channel(struct wiphy *wiphy return 0; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) static int cfg80211_rtw_get_channel(struct wiphy *wiphy, struct wireless_dev *wdev, unsigned int link_id, struct cfg80211_chan_def *chandef){ #else static int cfg80211_rtw_get_channel(struct wiphy *wiphy, struct wireless_dev *wdev, struct cfg80211_chan_def *chandef){ @@ -10420,7 +10420,7 @@ void rtw_wdev_unregister(struct wireless_dev *wdev) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) || defined(COMPAT_KERNEL_RELEASE) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) if (wdev->links[0].client.current_bss) { - #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78)) if (wdev->connected) { #else if (wdev->current_bss) { -- 2.35.0 ================================================ FILE: projects/Amlogic-ce/patches/RTL8822BU-aml/0001-Fix-for-Amlogic-kernel-5.15.78.patch ================================================ From 041beabf517f080abf7894eafea3d05dc8a58bb7 Mon Sep 17 00:00:00 2001 From: Portisch <hugo.portisch@yahoo.de> Date: Thu, 23 Nov 2023 13:28:10 +0100 Subject: [PATCH] Fix for Amlogic kernel >=5.15.78 Some #if are adjusted to fit Amlogic kernel backports. --- os_dep/linux/ioctl_cfg80211.c | 64 +++++++++++++++++------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/os_dep/linux/ioctl_cfg80211.c b/os_dep/linux/ioctl_cfg80211.c index 9af4e69..41737c1 100644 --- a/os_dep/linux/ioctl_cfg80211.c +++ b/os_dep/linux/ioctl_cfg80211.c @@ -87,7 +87,7 @@ #define WIFI_CIPHER_SUITE_BIP_CMAC_256 0x000FAC0D /* - * If customer need, defining this flag will make driver + * If customer need, defining this flag will make driver * always return -EBUSY at the condition of scan deny. */ /* #define CONFIG_NOTIFY_SCAN_ABORT_WITH_BUSY */ @@ -464,7 +464,7 @@ u8 rtw_cfg80211_ch_switch_notify(_adapter *adapter, u8 ch, u8 bw, u8 offset, * called by others with block-tx. */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) || defined(RHEL88)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78) || defined(RHEL88)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0) || defined(RHEL89)) cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0, 0, false, 0); #else @@ -483,7 +483,7 @@ u8 rtw_cfg80211_ch_switch_notify(_adapter *adapter, u8 ch, u8 bw, u8 offset, if (!rtw_cfg80211_allow_ch_switch_notify(adapter)) goto exit; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(RHEL88)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78) || defined(RHEL88)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0) || defined(RHEL89)) cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, 0, 0); #else @@ -1159,7 +1159,7 @@ check_bss: #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) || defined(RHEL88)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78) || defined(RHEL88)) roam_info.links[0].bssid = cur_network->network.MacAddress; #else roam_info.bssid = cur_network->network.MacAddress; @@ -1821,8 +1821,8 @@ static int rtw_cfg80211_set_encryption(struct net_device *dev, struct ieee_param _rtw_memcpy(padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8); _rtw_memcpy(padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8); padapter->securitypriv.binstallGrpkey = _TRUE; - if (param->u.crypt.idx < 4) - _rtw_memcpy(padapter->securitypriv.iv_seq[param->u.crypt.idx], param->u.crypt.seq, 8); + if (param->u.crypt.idx < 4) + _rtw_memcpy(padapter->securitypriv.iv_seq[param->u.crypt.idx], param->u.crypt.seq, 8); padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx; rtw_set_key(padapter, &padapter->securitypriv, param->u.crypt.idx, 1, _TRUE); } else if (strcmp(param->u.crypt.alg, "GCMP_256") == 0 @@ -1923,7 +1923,7 @@ exit: } static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) || defined(RHEL88)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78) || defined(RHEL88)) , int link_id #endif , u8 key_index @@ -2088,7 +2088,7 @@ addkey_end: } static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) || defined(RHEL88)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78) || defined(RHEL88)) , int link_id #endif , u8 keyid @@ -2279,7 +2279,7 @@ exit: } static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) || defined(RHEL88)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78) || defined(RHEL88)) int link_id, #endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) @@ -2303,7 +2303,7 @@ static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) || defined(RHEL88)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78) || defined(RHEL88)) int link_id, #endif u8 key_index @@ -2355,7 +2355,7 @@ static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30)) int cfg80211_rtw_set_default_mgmt_key(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) || defined(RHEL88)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78) || defined(RHEL88)) int link_id, #endif u8 key_index) @@ -3240,7 +3240,7 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy if (request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { get_random_mask_addr(pwdev_priv->pno_mac_addr, request->mac_addr, request->mac_addr_mask); - print_hex_dump(KERN_DEBUG, "random mac_addr: ", + print_hex_dump(KERN_DEBUG, "random mac_addr: ", DUMP_PREFIX_OFFSET, 16, 1, pwdev_priv->pno_mac_addr, ETH_ALEN, 1); } else @@ -3563,7 +3563,7 @@ check_need_indicate_scan_done: info.aborted = 0; #endif /* the process time of scan results must be over at least 1ms in the newly Android */ - rtw_msleep_os(1); + rtw_msleep_os(1); _rtw_cfg80211_surveydone_event_callback(padapter, request); #if (KERNEL_VERSION(4, 8, 0) <= LINUX_VERSION_CODE) @@ -3823,8 +3823,8 @@ static int rtw_cfg80211_set_key_mgt(struct security_priv *psecuritypriv, u32 key psecuritypriv->rsn_akm_suite_type = 4; } #endif - else if (key_mgt == WLAN_AKM_SUITE_SAE) { - psecuritypriv->rsn_akm_suite_type = 8; + else if (key_mgt == WLAN_AKM_SUITE_SAE) { + psecuritypriv->rsn_akm_suite_type = 8; } else { RTW_INFO("Invalid key mgt: 0x%x\n", key_mgt); /* return -EINVAL; */ @@ -5409,7 +5409,7 @@ static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *nd struct cfg80211_ap_update *info) #else struct cfg80211_beacon_data *info) -#endif +#endif { int ret = 0; _adapter *adapter = (_adapter *)rtw_netdev_priv(ndev); @@ -5425,7 +5425,7 @@ static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *nd return ret; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(RHEL88)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78) || defined(RHEL88)) static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev, unsigned int link_id) #else @@ -6063,7 +6063,7 @@ static int cfg80211_rtw_dump_station(struct wiphy *wiphy, struct net_device *nde else _rtw_memcpy(mac, plink->addr, ETH_ALEN); #endif - + sinfo->filled = 0; if (psta) { @@ -6810,7 +6810,7 @@ exit: #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) static int cfg80211_rtw_get_channel(struct wiphy *wiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(RHEL88)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78) || defined(RHEL88)) struct wireless_dev *wdev, unsigned int link_id, #else struct wireless_dev *wdev, @@ -8787,7 +8787,7 @@ void dump_mesh_config(void *sel, const struct mesh_config *conf) RTW_PRINT_SEL(sel, "path_refresh_time:%u\n", conf->path_refresh_time); RTW_PRINT_SEL(sel, "min_discovery_timeout:%u\n", conf->min_discovery_timeout); RTW_PRINT_SEL(sel, "dot11MeshHWMPactivePathTimeout:%u\n", conf->dot11MeshHWMPactivePathTimeout); - RTW_PRINT_SEL(sel, "dot11MeshHWMPpreqMinInterval:%u\n", conf->dot11MeshHWMPpreqMinInterval); + RTW_PRINT_SEL(sel, "dot11MeshHWMPpreqMinInterval:%u\n", conf->dot11MeshHWMPpreqMinInterval); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)) RTW_PRINT_SEL(sel, "dot11MeshHWMPperrMinInterval:%u\n", conf->dot11MeshHWMPperrMinInterval); #endif @@ -8802,11 +8802,11 @@ void dump_mesh_config(void *sel, const struct mesh_config *conf) RTW_PRINT_SEL(sel, "dot11MeshForwarding:%d\n", conf->dot11MeshForwarding); RTW_PRINT_SEL(sel, "rssi_threshold:%d\n", conf->rssi_threshold); #endif - + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) RTW_PRINT_SEL(sel, "ht_opmode:0x%04x\n", conf->ht_opmode); #endif - + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) RTW_PRINT_SEL(sel, "dot11MeshHWMPactivePathToRootTimeout:%u\n", conf->dot11MeshHWMPactivePathToRootTimeout); RTW_PRINT_SEL(sel, "dot11MeshHWMProotInterval:%u\n", conf->dot11MeshHWMProotInterval); @@ -8817,7 +8817,7 @@ void dump_mesh_config(void *sel, const struct mesh_config *conf) RTW_PRINT_SEL(sel, "power_mode:%s\n", nl80211_mesh_power_mode_str(conf->power_mode)); RTW_PRINT_SEL(sel, "dot11MeshAwakeWindowDuration:%u\n", conf->dot11MeshAwakeWindowDuration); #endif - + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) RTW_PRINT_SEL(sel, "plink_timeout:%u\n", conf->plink_timeout); #endif @@ -8953,14 +8953,14 @@ static void rtw_cfg80211_mesh_cfg_set(_adapter *adapter, const struct mesh_confi if (chk_mesh_attr(NL80211_MESHCONF_HT_OPMODE, mask)); #endif #endif - + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) if (chk_mesh_attr(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, mask)) mcfg->dot11MeshHWMPactivePathToRootTimeout = conf->dot11MeshHWMPactivePathToRootTimeout; if (chk_mesh_attr(NL80211_MESHCONF_HWMP_ROOT_INTERVAL, mask)) mcfg->dot11MeshHWMProotInterval = conf->dot11MeshHWMProotInterval; if (chk_mesh_attr(NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, mask)) - mcfg->dot11MeshHWMPconfirmationInterval = conf->dot11MeshHWMPconfirmationInterval; + mcfg->dot11MeshHWMPconfirmationInterval = conf->dot11MeshHWMPconfirmationInterval; #endif #if 0 /* TBD */ @@ -9018,7 +9018,7 @@ u8 *rtw_cfg80211_construct_mesh_beacon_ies(struct wiphy *wiphy, _adapter *adapte #endif if (!ch) goto exit; - + #if defined(CONFIG_80211AC_VHT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) vht = ht && ch > 14 && bw >= CHANNEL_WIDTH_80; /* VHT40/VHT20? */ #endif @@ -9349,7 +9349,7 @@ static int cfg80211_rtw_join_mesh(struct wiphy *wiphy, struct net_device *dev, ret = -EINVAL; goto exit; } - + rtw_mesh_work(&adapter->mesh_work); exit: @@ -9429,7 +9429,7 @@ static int cfg80211_rtw_del_mpath(struct wiphy *wiphy, struct net_device *dev } } else { rtw_mesh_path_flush_by_iface(adapter); - } + } exit: return ret; @@ -9730,13 +9730,13 @@ int cfg80211_rtw_resume(struct wiphy *wiphy) { //rtw_sitesurvey_cmd(padapter, NULL); rtw_sitesurvey_cmd(padapter, &parm); _exit_critical_bh(&pmlmepriv->lock, &irqL); - + for (PNOWakeupScanWaitCnt = 0; PNOWakeupScanWaitCnt < 10; PNOWakeupScanWaitCnt++) { if(check_fwstate(pmlmepriv, WIFI_UNDER_SURVEY) == _FALSE) break; rtw_msleep_os(1000); } - + _enter_critical_bh(&pmlmepriv->lock, &irqL); cfg80211_sched_scan_results(padapter->rtw_wdev->wiphy); _exit_critical_bh(&pmlmepriv->lock, &irqL); @@ -9744,7 +9744,7 @@ int cfg80211_rtw_resume(struct wiphy *wiphy) { } RTW_DBG("<== %s\n",__func__); return 0; - + } #endif /* CONFIG_PNO_SUPPORT */ @@ -10752,7 +10752,7 @@ void rtw_wdev_unregister(struct wireless_dev *wdev) rtw_cfg80211_indicate_scan_done(adapter, _TRUE); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) || defined(COMPAT_KERNEL_RELEASE) - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(RHEL88)) + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 78) || defined(RHEL88)) if (wdev->links[0].client.current_bss) { #else if (wdev->current_bss) { -- 2.42.0 ================================================ FILE: projects/Generic/config/ovf.template ================================================ <?xml version="1.0" encoding="UTF-8"?> <Envelope vmw:buildId="build-3018522" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:cim="http://schemas.dmtf.org/wbem/wscim/1/common" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vmw="http://www.vmware.com/schema/ovf" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <References> <File ovf:href="@DISK@.vmdk" ovf:id="file" ovf:size="@OVA_SIZE@"/> </References> <DiskSection> <Info>Virtual disk information</Info> <Disk ovf:capacity="@OVA_SIZE@" ovf:diskId="disk" ovf:fileRef="file" ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized"/> </DiskSection> <NetworkSection> <Info>The list of logical networks</Info> <Network ovf:name="bridged"> <Description>The bridged network</Description> </Network> </NetworkSection> <VirtualSystem ovf:id="@DISTRO@"> <Info>A virtual machine</Info> <Name>@DISTRO@</Name> <ProductSection> <Info>Meta-information about the installed software</Info> <Product>LibreELEC</Product> <Vendor>LibreELEC</Vendor> <ProductUrl>https://libreelec.tv</ProductUrl> <VendorUrl>https://libreelec.tv</VendorUrl> </ProductSection> <AnnotationSection> <Info>A human-readable annotation</Info> <Annotation>LibreELEC is ‘Just enough OS’ for Kodi, a Linux distribution built to run Kodi on current and popular mediacentre hardware. After importing the OVA image adjust CPU, RAM, and HDD storage to the required configuration before first boot.</Annotation> </AnnotationSection> <OperatingSystemSection ovf:id="94" vmw:osType="Ubuntu 64-bit"> <Info>The kind of installed guest operating system</Info> </OperatingSystemSection> <VirtualHardwareSection> <Info>Virtual hardware requirements</Info> <System> <vssd:ElementName>Virtual Hardware Family</vssd:ElementName> <vssd:InstanceID>0</vssd:InstanceID> <vssd:VirtualSystemIdentifier>LibreELEC</vssd:VirtualSystemIdentifier> <vssd:VirtualSystemType>vmx-12</vssd:VirtualSystemType> </System> <Item> <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits> <rasd:Description>Number of Virtual CPUs</rasd:Description> <rasd:ElementName>1 virtual CPU(s)</rasd:ElementName> <rasd:InstanceID>1</rasd:InstanceID> <rasd:ResourceType>3</rasd:ResourceType> <rasd:VirtualQuantity>1</rasd:VirtualQuantity> </Item> <Item> <rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits> <rasd:Description>Memory Size</rasd:Description> <rasd:ElementName>1024MB of memory</rasd:ElementName> <rasd:InstanceID>2</rasd:InstanceID> <rasd:ResourceType>4</rasd:ResourceType> <rasd:VirtualQuantity>1024</rasd:VirtualQuantity> </Item> <Item ovf:required="false"> <rasd:Address>0</rasd:Address> <rasd:Description>USB Controller (EHCI)</rasd:Description> <rasd:ElementName>usb</rasd:ElementName> <rasd:InstanceID>3</rasd:InstanceID> <rasd:ResourceSubType>vmware.usb.ehci</rasd:ResourceSubType> <rasd:ResourceType>23</rasd:ResourceType> <vmw:Config ovf:required="false" vmw:key="ehciEnabled" vmw:value="true"/> </Item> <Item> <rasd:Address>0</rasd:Address> <rasd:Description>IDE Controller</rasd:Description> <rasd:ElementName>ideController0</rasd:ElementName> <rasd:InstanceID>4</rasd:InstanceID> <rasd:ResourceType>5</rasd:ResourceType> </Item> <Item> <rasd:AddressOnParent>0</rasd:AddressOnParent> <rasd:ElementName>disk0</rasd:ElementName> <rasd:HostResource>ovf:/disk/disk</rasd:HostResource> <rasd:InstanceID>5</rasd:InstanceID> <rasd:Parent>4</rasd:Parent> <rasd:ResourceType>17</rasd:ResourceType> </Item> <Item> <rasd:AddressOnParent>1</rasd:AddressOnParent> <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation> <rasd:Connection>bridged</rasd:Connection> <rasd:Description>E1000 ethernet adapter on "bridged"</rasd:Description> <rasd:ElementName>ethernet0</rasd:ElementName> <rasd:InstanceID>6</rasd:InstanceID> <rasd:ResourceSubType>E1000</rasd:ResourceSubType> <rasd:ResourceType>10</rasd:ResourceType> <vmw:Config ovf:required="false" vmw:key="wakeOnLanEnabled" vmw:value="false"/> </Item> <Item ovf:required="false"> <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation> <rasd:ElementName>sound</rasd:ElementName> <rasd:InstanceID>7</rasd:InstanceID> <rasd:ResourceSubType>vmware.soundcard.hdaudio</rasd:ResourceSubType> <rasd:ResourceType>1</rasd:ResourceType> </Item> <Item ovf:required="false"> <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation> <rasd:ElementName>video</rasd:ElementName> <rasd:InstanceID>8</rasd:InstanceID> <rasd:ResourceType>24</rasd:ResourceType> <vmw:Config ovf:required="false" vmw:key="enable3DSupport" vmw:value="true"/> </Item> <Item ovf:required="false"> <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation> <rasd:ElementName>vmci</rasd:ElementName> <rasd:InstanceID>9</rasd:InstanceID> <rasd:ResourceSubType>vmware.vmci</rasd:ResourceSubType> <rasd:ResourceType>1</rasd:ResourceType> </Item> <vmw:Config ovf:required="false" vmw:key="cpuHotAddEnabled" vmw:value="true"/> <vmw:Config ovf:required="false" vmw:key="memoryHotAddEnabled" vmw:value="true"/> <vmw:Config ovf:required="false" vmw:key="powerOpInfo.powerOffType" vmw:value="soft"/> <vmw:Config ovf:required="false" vmw:key="powerOpInfo.resetType" vmw:value="soft"/> <vmw:Config ovf:required="false" vmw:key="powerOpInfo.suspendType" vmw:value="soft"/> </VirtualHardwareSection> </VirtualSystem> </Envelope> ================================================ FILE: projects/Generic/devices/gbm/options ================================================ # OpenGL(X) implementation to use (mesa / no) OPENGL="no" # OpenGL-ES implementation to use (mesa / no) OPENGLES="mesa" # Vulkan implementation to use (vulkan-loader / no) VULKAN="no" # Displayserver to use (weston / x11 / no) DISPLAYSERVER="no" # Windowmanager to use (fluxbox / weston / no) WINDOWMANAGER="no" # KODI Player implementation to use (mesa / default) KODIPLAYER_DRIVER="mesa" # set the addon project ADDON_PROJECT="Generic" # Mesa 3D Graphic drivers to use (all / crocus,i915,iris,r300,r600,radeonsi,vmware,virtio) # Space separated list is supported, # e.g. GRAPHIC_DRIVERS="crocus i915 iris r300 r600 radeonsi vmware virtio" GRAPHIC_DRIVERS="crocus i915 iris r300 r600 radeonsi vmware virtio" ================================================ FILE: projects/Generic/devices/wayland/options ================================================ # OpenGL(X) implementation to use (mesa / no) OPENGL="no" # OpenGL-ES implementation to use (mesa / no) OPENGLES="mesa" # Vulkan implementation to use (vulkan-loader / no) VULKAN="no" # Displayserver to use (wl / x11 / no) DISPLAYSERVER="wl" # Windowmanager to use (fluxbox / sway / weston / no) WINDOWMANAGER="sway" # KODI Player implementation to use (mesa / default) KODIPLAYER_DRIVER="mesa" # set the addon project ADDON_PROJECT="Generic" # Mesa 3D Graphic / NVIDIA drivers to use (all / crocus,i915,iris,nvidia-ng,r300,r600,radeonsi,vmware,virtio) # Space separated list is supported, # e.g. GRAPHIC_DRIVERS="crocus i915 iris r300 r600 radeonsi vmware virtio" GRAPHIC_DRIVERS="crocus i915 iris nvidia-ng r300 r600 radeonsi vmware virtio" ================================================ FILE: projects/Generic/devices/x11/filesystem/etc/X11/xorg-i915.conf ================================================ Section "Device" Identifier "Device0" Driver "intel" VendorName "INTEL Corporation" Option "TripleBuffer" "false" Option "TearFree" "false" EndSection ================================================ FILE: projects/Generic/devices/x11/filesystem/usr/bin/intel-fullrange.sh ================================================ #!/bin/sh FB_TYPE="$(grep '^0 ' /proc/fb | sed 's/[^[:space:]] //')" if [ "$FB_TYPE" == "inteldrmfb" ] || echo "$FB_TYPE" | grep -q "^i9[0-9]*drmfb$"; then OUTPUT=`/usr/bin/xrandr -display :0 -q | sed '/ connected/!d;s/ .*//;q'` for out in $OUTPUT ; do # Hack - something is not yet fully right /usr/bin/xrandr -display :0 --output $out --set "Broadcast RGB" "Full" # Seems there is a little race somewhere on some outputs # Turn the display shortly off and on again if [ -e "/storage/.config/forcedisplay" ]; then /usr/bin/xrandr -display :0 --output $out --off ; /usr/bin/xrandr -display :0 --output $out --auto fi done fi ================================================ FILE: projects/Generic/devices/x11/filesystem/usr/lib/systemd/system/intel-fullrange-resume.service ================================================ [Unit] Description=Restore full range after suspend Before=sleep.target StopWhenUnneeded=yes [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/true ExecStop=-/bin/sh "/usr/bin/intel-fullrange.sh" [Install] WantedBy=sleep.target ================================================ FILE: projects/Generic/devices/x11/filesystem/usr/lib/systemd/system/intel-fullrange.service ================================================ [Unit] Description=intel switch to full range Before=kodi.service After=graphical.target [Service] Type=oneshot Environment=DISPLAY=:0.0 ExecStart=-/bin/sh "/usr/bin/intel-fullrange.sh" StandardError=null RemainAfterExit=yes [Install] WantedBy=kodi.target ================================================ FILE: projects/Generic/devices/x11/options ================================================ # OpenGL(X) implementation to use (mesa / no) OPENGL="mesa" # OpenGL-ES implementation to use (mesa / no) OPENGLES="no" # Vulkan implementation to use (vulkan-loader / no) VULKAN="no" # Displayserver to use (weston / x11 / no) DISPLAYSERVER="x11" # Windowmanager to use (fluxbox / weston / no) WINDOWMANAGER="fluxbox" # KODI Player implementation to use (mesa / default) KODIPLAYER_DRIVER="default" # set the addon project ADDON_PROJECT="Generic-legacy" # Mesa 3D / Xorg Graphic drivers to use (all / crocus,i915,iris,r300,r600,radeonsi,nvidia,nvidia-legacy,vmware,virtio) # Space separated list is supported, # e.g. GRAPHIC_DRIVERS="crocus i915 iris r300 r600 radeonsi nvidia nvidia-legacy vmware virtio" GRAPHIC_DRIVERS="crocus i915 iris r300 r600 radeonsi nvidia nvidia-legacy vmware virtio" ================================================ FILE: projects/Generic/devices/x11/patches/kodi/kodi-100.06-dont-set-_NET_WM_STATE_FULLSCREEN.patch ================================================ From c16e99234ce40f201e58a2595e6dfa0703cf554c Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Wed, 11 Mar 2015 20:56:15 +0200 Subject: [PATCH 06/13] dont set _NET_WM_STATE_FULLSCREEN Start X11 applications like 'chrome' or 'st' on top of kodi. Outdated comment: ## I dont remember why I added this. I guess it was for ## some 3rdparty stuff that needed to go fullscreen but ## xbmc was acting weird.. ## ## this should probably be removed after OE 6 --- xbmc/windowing/X11/WinSystemX11.cpp | 2 -- 1 file changed, 2 deletions(-) --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -765,8 +765,6 @@ bool CWinSystemX11::SetWindow(int width, if (fullscreen && hasWM) { - Atom fs = XInternAtom(m_dpy, "_NET_WM_STATE_FULLSCREEN", True); - XChangeProperty(m_dpy, m_mainWindow, XInternAtom(m_dpy, "_NET_WM_STATE", True), XA_ATOM, 32, PropModeReplace, (unsigned char *) &fs, 1); // disable desktop compositing for KDE, when Kodi is in full-screen mode int one = 1; Atom composite = XInternAtom(m_dpy, "_KDE_NET_WM_BLOCK_COMPOSITING", True); ================================================ FILE: projects/Generic/devices/x11/patches/kodi/kodi-100.12-prevent-kodi-switching-to-windowed-mode.patch ================================================ From a2a5ae054768afe9906bbd7ea96d4eb69bf1b857 Mon Sep 17 00:00:00 2001 From: Stefan Saraev <stefan@saraev.ca> Date: Sat, 18 Apr 2015 15:45:54 +0300 Subject: [PATCH] prevent kodi switching to windowed mode --- xbmc/windowing/X11/WinSystemX11.h | 1 + 1 file changed, 1 insertion(+) --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -48,6 +48,7 @@ public: void FinishWindowResize(int newWidth, int newHeight) override; bool SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays) override; void UpdateResolutions() override; + bool CanDoWindowed() override { return false; } void ShowOSMouse(bool show) override; void NotifyAppActiveChange(bool bActivated) override; ================================================ FILE: projects/Generic/devices/x11/patches/linux/linux-revert-acpi-bus-get-device-5-18.patch ================================================ From ac2a3feefad549814f5e7cca30be07a255c8494a Mon Sep 17 00:00:00 2001 From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> Date: Tue, 5 Apr 2022 19:49:26 +0200 Subject: Revert ACPI: bus: Eliminate acpi_bus_get_device() Revert d017a3167bcb76caedf2b444645bf4db75f775a5 Replace the last instance of acpi_bus_get_device(), added recently by commit 87e59b36e5e2 ("spi: Support selection of the index of the ACPI Spi Resource before alloc"), with acpi_fetch_acpi_dev() and finally drop acpi_bus_get_device() that has no more users. --- drivers/acpi/scan.c | 13 +++++++++++++ include/acpi/acpi_bus.h | 1 + 2 files changed, 14 insertions(+) diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 9efbfe087de76..762b61f67e6c6 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c @@ -588,6 +588,19 @@ static struct acpi_device *handle_to_device(acpi_handle handle, return adev; } +int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device) +{ + if (!device) + return -EINVAL; + + *device = handle_to_device(handle, NULL); + if (!*device) + return -ENODEV; + + return 0; +} +EXPORT_SYMBOL(acpi_bus_get_device); + /** * acpi_fetch_acpi_dev - Retrieve ACPI device object. * @handle: ACPI handle associated with the requested ACPI device object. diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index 3f7f01f038690..c4b78c21d7930 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h @@ -509,6 +509,7 @@ extern int unregister_acpi_notifier(struct notifier_block *); * External Functions */ +int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device); struct acpi_device *acpi_fetch_acpi_dev(acpi_handle handle); acpi_status acpi_bus_get_status_handle(acpi_handle handle, unsigned long long *sta); -- cgit 1.2.3-1.el7 ================================================ FILE: projects/Generic/devices/x11/patches/linux/linux-revert-fbdev--Make-registered-fb---private-to-fbmem-6-1.patch ================================================ commit b6fa3778e84c9d2f6d9511189ba16078b6c37196 Author: Rudi Heitbaum <rudi@heitbaum.com> Date: Mon Oct 17 11:40:02 2022 +0000 Revert "fbdev: Make registered_fb[] private to fbmem.c" This reverts commit 5727dcfd8486399c40e39d2c08fe36fedab29d99. diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c index 1e70d8c67653..6ae1c5fa19f9 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -51,10 +51,10 @@ static DEFINE_MUTEX(registration_lock); struct fb_info *registered_fb[FB_MAX] __read_mostly; +EXPORT_SYMBOL(registered_fb); + int num_registered_fb __read_mostly; -#define for_each_registered_fb(i) \ - for (i = 0; i < FB_MAX; i++) \ - if (!registered_fb[i]) {} else +EXPORT_SYMBOL(num_registered_fb); bool fb_center_logo __read_mostly; diff --git a/include/linux/fb.h b/include/linux/fb.h index 0aff76bcbb00..453c3b2b6b8e 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -627,10 +627,16 @@ extern int fb_get_color_depth(struct fb_var_screeninfo *var, extern int fb_get_options(const char *name, char **option); extern int fb_new_modelist(struct fb_info *info); +extern struct fb_info *registered_fb[FB_MAX]; +extern int num_registered_fb; extern bool fb_center_logo; extern int fb_logo_count; extern struct class *fb_class; +#define for_each_registered_fb(i) \ + for (i = 0; i < FB_MAX; i++) \ + if (!registered_fb[i]) {} else + static inline void lock_fb_info(struct fb_info *info) { mutex_lock(&info->lock); ================================================ FILE: projects/Generic/filesystem/usr/bin/cputemp ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) TEMP=0 if [ $(basename "$0") = "gputemp" -o "$1" = "gpu" ]; then if [ -x /usr/bin/nvidia-smi ]; then TEMP="$(/usr/bin/nvidia-smi -q -x | grep '<gpu_temp>' | awk '{ print $1 }' | sed 's,<gpu_temp>,,g')" fi if [ "$TEMP" = "0" ]; then for hwmon in /sys/class/hwmon/*; do if [ -f "${hwmon}/name" ]; then case $(cat ${hwmon}/name) in nouveau|radeon|amdgpu) [[ -f "${hwmon}/temp1_input" ]] && TEMP="$(cat ${hwmon}/temp1_input)" && break [[ -f "${hwmon}/temp2_input" ]] && TEMP="$(cat ${hwmon}/temp2_input)" && break ;; # intel gpu is supported by cpu coretemp below esac fi done TEMP="$(( $TEMP / 1000 ))" fi fi if [ "$1" = "cpu" -o "$TEMP" = "0" ]; then for hwmon in /sys/class/hwmon/*; do if [ -f "${hwmon}/name" ]; then case $(cat ${hwmon}/name) in coretemp|k10temp|scpi_sensors) [[ -f "${hwmon}/temp1_input" ]] && TEMP="$(cat ${hwmon}/temp1_input)" && break [[ -f "${hwmon}/temp2_input" ]] && TEMP="$(cat ${hwmon}/temp2_input)" && break ;; esac fi done if [ "$TEMP" = "0" -a -f /sys/class/hwmon/hwmon0/device/temp1_input ]; then TEMP="$(cat /sys/class/hwmon/hwmon0/device/temp1_input)" fi TEMP="$(( $TEMP / 1000 ))" fi echo "${TEMP} C" ================================================ FILE: projects/Generic/filesystem/usr/share/bootloader/canupdate.sh ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Allow upgrades between different Generic builds if [ "$1" = "Virtual.x86_64" -o "$1" = "Generic.x86_64" -o "$1" = "Generic-legacy.x86_64" -o "$1" = "gbm.x86_64" -o "$1" = "wayland.x86_64" -o "$1" = "x11.x86_64" ]; then exit 0 else exit 1 fi ================================================ FILE: projects/Generic/kodi/advancedsettings.xml ================================================ <advancedsettings> <video> <latency> <delay>0</delay> <refresh> <min>23</min> <max>24</max> <delay>175</delay> </refresh> </latency> </video> </advancedsettings> ================================================ FILE: projects/Generic/linux/linux.x86_64.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/x86 6.1.63 Kernel Configuration # CONFIG_CC_VERSION_TEXT="x86_64-libreelec-linux-gnu-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_BZIP2=y CONFIG_HAVE_KERNEL_LZMA=y CONFIG_HAVE_KERNEL_XZ=y CONFIG_HAVE_KERNEL_LZO=y CONFIG_HAVE_KERNEL_LZ4=y CONFIG_HAVE_KERNEL_ZSTD=y # CONFIG_KERNEL_GZIP is not set # CONFIG_KERNEL_BZIP2 is not set # CONFIG_KERNEL_LZMA is not set CONFIG_KERNEL_XZ=y # CONFIG_KERNEL_LZO is not set # CONFIG_KERNEL_LZ4 is not set # CONFIG_KERNEL_ZSTD is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_SYSVIPC_COMPAT=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_GENERIC_PENDING_IRQ=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_IRQ_MSI_IOMMU=y CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y CONFIG_GENERIC_IRQ_RESERVATION_MODE=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_CLOCKSOURCE_WATCHDOG=y CONFIG_ARCH_CLOCKSOURCE_INIT=y CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_CONTEXT_TRACKING=y CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y # CONFIG_BPF_JIT is not set # CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_BPF_PRELOAD is not set # end of BPF subsystem CONFIG_PREEMPT_VOLUNTARY_BUILD=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set # CONFIG_PREEMPT_DYNAMIC is not set # CONFIG_SCHED_CORE is not set # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set CONFIG_HAVE_SCHED_AVG_IRQ=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_TASKSTATS is not set # CONFIG_PSI is not set # end of CPU/Task time and stats accounting CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_RUDE_RCU=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem CONFIG_IKCONFIG=m CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=17 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 # CONFIG_PRINTK_INDEX is not set CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y # # Scheduler features # # CONFIG_UCLAMP_TASK is not set # end of Scheduler features CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y CONFIG_CC_HAS_INT128=y CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_NUMA_BALANCING=y CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set CONFIG_CGROUP_PIDS=y # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y # CONFIG_CGROUP_MISC is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_TIME_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 # CONFIG_RD_GZIP is not set # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set # CONFIG_RD_LZ4 is not set CONFIG_RD_ZSTD=y # CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set CONFIG_INITRAMFS_COMPRESSION_NONE=y CONFIG_BOOT_CONFIG=y # CONFIG_BOOT_CONFIG_EMBED is not set CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y CONFIG_EXPERT=y # CONFIG_UID16 is not set CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set # CONFIG_SYSFS_SYSCALL is not set CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y # CONFIG_PCSPKR_PLATFORM is not set CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y 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 # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set # CONFIG_EMBEDDED is not set CONFIG_HAVE_PERF_EVENTS=y # CONFIG_PC104 is not set # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_SYSTEM_DATA_VERIFICATION=y # CONFIG_PROFILING is not set CONFIG_TRACEPOINTS=y # end of General setup CONFIG_64BIT=y CONFIG_X86_64=y CONFIG_X86=y CONFIG_INSTRUCTION_DECODER=y CONFIG_OUTPUT_FORMAT="elf64-x86-64" CONFIG_LOCKDEP_SUPPORT=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_MMU=y CONFIG_ARCH_MMAP_RND_BITS_MIN=28 CONFIG_ARCH_MMAP_RND_BITS_MAX=32 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_GENERIC_ISA_DMA=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_NR_GPIO=1024 CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_AUDIT_ARCH=y CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_PGTABLE_LEVELS=4 CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # # Processor type and features # CONFIG_SMP=y CONFIG_X86_FEATURE_NAMES=y # CONFIG_X86_X2APIC is not set CONFIG_X86_MPPARSE=y # CONFIG_GOLDFISH is not set # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set CONFIG_X86_INTEL_LPSS=y CONFIG_X86_AMD_PLATFORM_DEVICE=y CONFIG_IOSF_MBI=y # CONFIG_IOSF_MBI_DEBUG is not set CONFIG_SCHED_OMIT_FRAME_POINTER=y CONFIG_HYPERVISOR_GUEST=y CONFIG_PARAVIRT=y # CONFIG_PARAVIRT_DEBUG is not set CONFIG_PARAVIRT_SPINLOCKS=y CONFIG_X86_HV_CALLBACK_VECTOR=y # CONFIG_XEN is not set CONFIG_KVM_GUEST=y CONFIG_ARCH_CPUIDLE_HALTPOLL=y # CONFIG_PVH is not set CONFIG_PARAVIRT_TIME_ACCOUNTING=y CONFIG_PARAVIRT_CLOCK=y # CONFIG_JAILHOUSE_GUEST is not set # CONFIG_ACRN_GUEST is not set # CONFIG_MK8 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_MATOM is not set CONFIG_GENERIC_CPU=y CONFIG_X86_INTERNODE_CACHE_SHIFT=6 CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_TSC=y CONFIG_X86_CMPXCHG64=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=64 CONFIG_X86_DEBUGCTLMSR=y CONFIG_IA32_FEAT_CTL=y CONFIG_X86_VMX_FEATURE_NAMES=y # CONFIG_PROCESSOR_SELECT is not set CONFIG_CPU_SUP_INTEL=y CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_HYGON=y CONFIG_CPU_SUP_CENTAUR=y CONFIG_CPU_SUP_ZHAOXIN=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y CONFIG_GART_IOMMU=y CONFIG_BOOT_VESA_SUPPORT=y # CONFIG_MAXSMP is not set CONFIG_NR_CPUS_RANGE_BEGIN=2 CONFIG_NR_CPUS_RANGE_END=512 CONFIG_NR_CPUS_DEFAULT=64 CONFIG_NR_CPUS=16 # CONFIG_SCHED_CLUSTER is not set CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_SCHED_MC_PRIO=y CONFIG_X86_LOCAL_APIC=y CONFIG_X86_IO_APIC=y # CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set # CONFIG_X86_MCE is not set # # Performance monitoring # CONFIG_PERF_EVENTS_INTEL_UNCORE=y CONFIG_PERF_EVENTS_INTEL_RAPL=y CONFIG_PERF_EVENTS_INTEL_CSTATE=y CONFIG_PERF_EVENTS_AMD_POWER=y CONFIG_PERF_EVENTS_AMD_UNCORE=y # CONFIG_PERF_EVENTS_AMD_BRS is not set # end of Performance monitoring CONFIG_X86_16BIT=y CONFIG_X86_ESPFIX64=y CONFIG_X86_VSYSCALL_EMULATION=y CONFIG_X86_IOPL_IOPERM=y CONFIG_MICROCODE=y CONFIG_MICROCODE_INTEL=y CONFIG_MICROCODE_AMD=y # CONFIG_MICROCODE_LATE_LOADING is not set CONFIG_X86_MSR=y CONFIG_X86_CPUID=y # CONFIG_X86_5LEVEL is not set CONFIG_X86_DIRECT_GBPAGES=y # CONFIG_X86_CPA_STATISTICS is not set # CONFIG_AMD_MEM_ENCRYPT is not set CONFIG_NUMA=y # CONFIG_AMD_NUMA is not set CONFIG_X86_64_ACPI_NUMA=y # CONFIG_NUMA_EMU is not set CONFIG_NODES_SHIFT=6 CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y CONFIG_ARCH_PROC_KCORE_TEXT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 # CONFIG_X86_PMEM_LEGACY is not set CONFIG_X86_CHECK_BIOS_CORRUPTION=y CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y CONFIG_MTRR=y CONFIG_MTRR_SANITIZER=y CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0 CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1 CONFIG_X86_PAT=y CONFIG_ARCH_USES_PG_UNCACHED=y CONFIG_X86_UMIP=y CONFIG_CC_HAS_IBT=y CONFIG_X86_KERNEL_IBT=y CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS=y CONFIG_X86_INTEL_TSX_MODE_OFF=y # CONFIG_X86_INTEL_TSX_MODE_ON is not set # CONFIG_X86_INTEL_TSX_MODE_AUTO is not set CONFIG_EFI=y CONFIG_EFI_STUB=y CONFIG_EFI_MIXED=y # CONFIG_HZ_100 is not set # CONFIG_HZ_250 is not set CONFIG_HZ_300=y # CONFIG_HZ_1000 is not set CONFIG_HZ=300 CONFIG_SCHED_HRTICK=y # CONFIG_KEXEC is not set # CONFIG_KEXEC_FILE is not set # CONFIG_CRASH_DUMP is not set CONFIG_PHYSICAL_START=0x1000000 CONFIG_RELOCATABLE=y CONFIG_RANDOMIZE_BASE=y CONFIG_X86_NEED_RELOCS=y CONFIG_PHYSICAL_ALIGN=0x1000000 CONFIG_DYNAMIC_MEMORY_LAYOUT=y CONFIG_RANDOMIZE_MEMORY=y CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0x0 CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set # CONFIG_COMPAT_VDSO is not set CONFIG_LEGACY_VSYSCALL_XONLY=y # CONFIG_LEGACY_VSYSCALL_NONE is not set CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE="root=/dev/ram0 rdinit=/init usbcore.autosuspend=-1" # CONFIG_CMDLINE_OVERRIDE is not set CONFIG_MODIFY_LDT_SYSCALL=y # CONFIG_STRICT_SIGALTSTACK_SIZE is not set CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features CONFIG_CC_HAS_SLS=y CONFIG_CC_HAS_RETURN_THUNK=y CONFIG_SPECULATION_MITIGATIONS=y CONFIG_PAGE_TABLE_ISOLATION=y CONFIG_RETPOLINE=y CONFIG_RETHUNK=y CONFIG_CPU_UNRET_ENTRY=y CONFIG_CPU_IBPB_ENTRY=y CONFIG_CPU_IBRS_ENTRY=y CONFIG_CPU_SRSO=y # CONFIG_SLS is not set # CONFIG_GDS_FORCE_MITIGATION is not set CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y # # Power management and ACPI options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_SUSPEND_SKIP_SYNC is not set # CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_USERSPACE_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y CONFIG_PM_DEBUG=y # CONFIG_PM_ADVANCED_DEBUG is not set CONFIG_PM_TEST_SUSPEND=y CONFIG_PM_SLEEP_DEBUG=y # CONFIG_PM_TRACE_RTC is not set CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_PM_GENERIC_DOMAINS_SLEEP=y # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_SUPPORTS_ACPI=y CONFIG_ACPI=y CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y # CONFIG_ACPI_DEBUGGER is not set CONFIG_ACPI_SPCR_TABLE=y # CONFIG_ACPI_FPDT is not set CONFIG_ACPI_LPIT=y CONFIG_ACPI_SLEEP=y CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y # CONFIG_ACPI_EC_DEBUGFS is not set # CONFIG_ACPI_AC is not set CONFIG_ACPI_BATTERY=y CONFIG_ACPI_BUTTON=y CONFIG_ACPI_VIDEO=y CONFIG_ACPI_FAN=y # CONFIG_ACPI_TAD is not set # CONFIG_ACPI_DOCK is not set CONFIG_ACPI_CPU_FREQ_PSS=y CONFIG_ACPI_PROCESSOR_CSTATE=y CONFIG_ACPI_PROCESSOR_IDLE=y CONFIG_ACPI_CPPC_LIB=y CONFIG_ACPI_PROCESSOR=y CONFIG_ACPI_HOTPLUG_CPU=y CONFIG_ACPI_PROCESSOR_AGGREGATOR=y CONFIG_ACPI_THERMAL=y CONFIG_ACPI_PLATFORM_PROFILE=m 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 CONFIG_ACPI_HOTPLUG_IOAPIC=y # CONFIG_ACPI_SBS is not set # CONFIG_ACPI_HED is not set # CONFIG_ACPI_CUSTOM_METHOD is not set # CONFIG_ACPI_BGRT is not set # CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set # CONFIG_ACPI_NFIT is not set CONFIG_ACPI_NUMA=y # CONFIG_ACPI_HMAT is not set CONFIG_HAVE_ACPI_APEI=y CONFIG_HAVE_ACPI_APEI_NMI=y # CONFIG_ACPI_APEI is not set # CONFIG_ACPI_DPTF is not set # CONFIG_ACPI_CONFIGFS is not set # CONFIG_ACPI_PFRUT is not set CONFIG_ACPI_PCC=y # CONFIG_PMIC_OPREGION is not set CONFIG_ACPI_PRMT=y CONFIG_X86_PM_TIMER=y # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y # CONFIG_CPU_FREQ_GOV_USERSPACE is not set CONFIG_CPU_FREQ_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # # CPU frequency scaling drivers # CONFIG_X86_INTEL_PSTATE=y CONFIG_X86_PCC_CPUFREQ=m # CONFIG_X86_AMD_PSTATE is not set # CONFIG_X86_AMD_PSTATE_UT is not set CONFIG_X86_ACPI_CPUFREQ=y CONFIG_X86_ACPI_CPUFREQ_CPB=y CONFIG_X86_POWERNOW_K8=y CONFIG_X86_AMD_FREQ_SENSITIVITY=m # CONFIG_X86_SPEEDSTEP_CENTRINO is not set CONFIG_X86_P4_CLOCKMOD=y # # shared options # CONFIG_X86_SPEEDSTEP_LIB=y # end of CPU Frequency scaling # # CPU Idle # 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_CPU_IDLE_GOV_HALTPOLL is not set CONFIG_HALTPOLL_CPUIDLE=y # end of CPU Idle CONFIG_INTEL_IDLE=y # end of Power management and ACPI options # # Bus options (PCI etc.) # CONFIG_PCI_DIRECT=y CONFIG_PCI_MMCONFIG=y CONFIG_MMCONF_FAM10H=y # CONFIG_PCI_CNB20LE_QUIRK is not set # CONFIG_ISA_BUS is not set CONFIG_ISA_DMA_API=y CONFIG_AMD_NB=y # end of Bus options (PCI etc.) # # Binary Emulations # CONFIG_IA32_EMULATION=y # CONFIG_X86_X32_ABI is not set CONFIG_COMPAT_32=y CONFIG_COMPAT=y CONFIG_COMPAT_FOR_U64_ALIGNMENT=y # end of Binary Emulations CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set CONFIG_AS_AVX512=y CONFIG_AS_SHA1_NI=y CONFIG_AS_SHA256_NI=y CONFIG_AS_TPAUSE=y # # General architecture-dependent options # CONFIG_CRASH_CORE=y CONFIG_HOTPLUG_SMT=y CONFIG_GENERIC_ENTRY=y CONFIG_KPROBES=y CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set # CONFIG_STATIC_CALL_SELFTEST is not set CONFIG_OPTPROBES=y CONFIG_KPROBES_ON_FTRACE=y CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_ARCH_USE_BUILTIN_BSWAP=y CONFIG_KRETPROBES=y CONFIG_KRETPROBE_ON_RETHOOK=y CONFIG_HAVE_IOREMAP_PROT=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_ARCH_HAS_CPU_FINALIZE_INIT=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_RUST=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y CONFIG_HAVE_USER_RETURN_NOTIFIER=y CONFIG_HAVE_PERF_EVENTS_NMI=y CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y CONFIG_MMU_GATHER_TABLE_FREE=y CONFIG_MMU_GATHER_RCU_TABLE_FREE=y CONFIG_MMU_GATHER_MERGE_VMAS=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_ARCH_SUPPORTS_LTO_CLANG=y CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y CONFIG_LTO_NONE=y CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=28 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=8 CONFIG_HAVE_ARCH_COMPAT_MMAP_BASES=y CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_HAVE_OBJTOOL=y CONFIG_HAVE_JUMP_LABEL_HACK=y CONFIG_HAVE_NOINSTR_HACK=y CONFIG_HAVE_NOINSTR_VALIDATION=y CONFIG_HAVE_UACCESS_VALIDATION=y CONFIG_HAVE_STACK_VALIDATION=y CONFIG_HAVE_RELIABLE_STACKTRACE=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y CONFIG_RANDOMIZE_KSTACK_OFFSET=y # CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y CONFIG_ARCH_USE_MEMREMAP_PROT=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_HAVE_STATIC_CALL=y CONFIG_HAVE_STATIC_CALL_INLINE=y CONFIG_HAVE_PREEMPT_DYNAMIC=y CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y CONFIG_ARCH_HAS_ELFCORE_COMPAT=y CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y CONFIG_DYNAMIC_SIGFRAME=y CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y # CONFIG_GCC_PLUGINS is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_GZIP is not set # CONFIG_MODULE_COMPRESS_XZ is not set # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y # CONFIG_BLOCK_LEGACY_AUTOLOAD is not set CONFIG_BLK_CGROUP_RWSTAT=y CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_ICQ=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_DEV_THROTTLING_LOW is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_CGROUP_IOLATENCY is not set # CONFIG_BLK_CGROUP_IOCOST is not set # CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set CONFIG_LDM_PARTITION=y # CONFIG_LDM_DEBUG is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set # end of Partition Types CONFIG_BLOCK_COMPAT=y CONFIG_BLK_MQ_PCI=y CONFIG_BLK_MQ_VIRTIO=y CONFIG_BLK_PM=y CONFIG_BLOCK_HOLDER_DEPRECATED=y CONFIG_BLK_MQ_STACKING=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y CONFIG_IOSCHED_BFQ=y # CONFIG_BFQ_GROUP_IOSCHED is not set # end of IO Schedulers CONFIG_ASN1=y CONFIG_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_INLINE_READ_UNLOCK=y CONFIG_INLINE_READ_UNLOCK_IRQ=y CONFIG_INLINE_WRITE_UNLOCK=y CONFIG_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y CONFIG_QUEUED_SPINLOCKS=y CONFIG_ARCH_USE_QUEUED_RWLOCKS=y CONFIG_QUEUED_RWLOCKS=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE=y CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ELFCORE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y CONFIG_BINFMT_MISC=y CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # CONFIG_SWAP=y # CONFIG_ZSWAP is not set # # SLAB allocator options # # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y # end of SLAB allocator options # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set # CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y CONFIG_MEMORY_ISOLATION=y CONFIG_EXCLUSIVE_SYSTEM_RAM=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_MEMORY_BALLOON=y CONFIG_BALLOON_COMPACTION=y CONFIG_COMPACTION=y CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 CONFIG_PAGE_REPORTING=y CONFIG_MIGRATION=y CONFIG_ARCH_ENABLE_THP_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ARCH_WANTS_THP_SWAP=y CONFIG_TRANSPARENT_HUGEPAGE=y # CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS is not set CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y CONFIG_THP_SWAP=y # CONFIG_READ_ONLY_THP_FOR_FS is not set CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_USE_PERCPU_NUMA_NODE_ID=y CONFIG_HAVE_SETUP_PER_CPU_AREA=y CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set # CONFIG_CMA_DEBUGFS is not set # CONFIG_CMA_SYSFS is not set CONFIG_CMA_AREAS=19 CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y CONFIG_ARCH_HAS_ZONE_DMA_SET=y CONFIG_ZONE_DMA=y CONFIG_ZONE_DMA32=y CONFIG_HMM_MIRROR=y CONFIG_VMAP_PFN=y CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y CONFIG_ARCH_HAS_PKEYS=y CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y CONFIG_MAPPING_DIRTY_HELPERS=y CONFIG_SECRETMEM=y # CONFIG_ANON_VMA_NAME is not set # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set CONFIG_LOCK_MM_AND_FIND_VMA=y # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y CONFIG_NET_INGRESS=y CONFIG_NET_EGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_USER_COMPAT is not set # CONFIG_XFRM_INTERFACE is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_ESP=y # CONFIG_NET_KEY is not set # CONFIG_XDP_SOCKETS is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=m CONFIG_IP_MROUTE_COMMON=y CONFIG_IP_MROUTE=y # CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set # CONFIG_IP_PIMSM_V1 is not set # CONFIG_IP_PIMSM_V2 is not set # CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set CONFIG_INET_ESP=y # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=m # CONFIG_INET_DIAG is not set CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set CONFIG_TCP_CONG_CUBIC=y # CONFIG_TCP_CONG_WESTWOOD is not set CONFIG_TCP_CONG_HTCP=m CONFIG_TCP_CONG_HSTCP=m # CONFIG_TCP_CONG_HYBLA is not set CONFIG_TCP_CONG_VEGAS=m # CONFIG_TCP_CONG_NV is not set CONFIG_TCP_CONG_SCALABLE=m # CONFIG_TCP_CONG_LP is not set CONFIG_TCP_CONG_VENO=m CONFIG_TCP_CONG_YEAH=m CONFIG_TCP_CONG_ILLINOIS=m # CONFIG_TCP_CONG_DCTCP is not set CONFIG_TCP_CONG_CDG=m # CONFIG_TCP_CONG_BBR is not set CONFIG_DEFAULT_CUBIC=y # CONFIG_DEFAULT_RENO is not set CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_IPV6_VTI is not set CONFIG_IPV6_SIT=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set CONFIG_IPV6_FOU=m # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set # CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NET_PTP_CLASSIFY=y # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_EGRESS=y CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_FAMILY_BRIDGE=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set CONFIG_NETFILTER_NETLINK_LOG=m # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=m # CONFIG_NF_LOG_SYSLOG is not set # CONFIG_NF_CONNTRACK_MARK is not set # CONFIG_NF_CONNTRACK_ZONES is not set # CONFIG_NF_CONNTRACK_PROCFS is not set # CONFIG_NF_CONNTRACK_EVENTS is not set # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set # CONFIG_NF_CT_PROTO_DCCP is not set # CONFIG_NF_CT_PROTO_SCTP is not set # CONFIG_NF_CT_PROTO_UDPLITE is not set # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set CONFIG_NF_CONNTRACK_IRC=m CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set CONFIG_NF_CONNTRACK_SIP=m CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m # CONFIG_NETFILTER_NETLINK_GLUE_CT is not set CONFIG_NF_NAT=m CONFIG_NF_NAT_FTP=m CONFIG_NF_NAT_IRC=m CONFIG_NF_NAT_SIP=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 CONFIG_NETFILTER_XTABLES_COMPAT=y # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set CONFIG_NETFILTER_XT_MATCH_IPRANGE=m CONFIG_NETFILTER_XT_MATCH_IPVS=m # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set CONFIG_NETFILTER_XT_MATCH_OWNER=m # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set CONFIG_NETFILTER_XT_MATCH_STATE=m # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set CONFIG_IP_VS=m # CONFIG_IP_VS_IPV6 is not set # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # CONFIG_IP_VS_PROTO_ESP is not set # CONFIG_IP_VS_PROTO_AH is not set # CONFIG_IP_VS_PROTO_SCTP is not set # # IPVS scheduler # CONFIG_IP_VS_RR=m # CONFIG_IP_VS_WRR is not set # CONFIG_IP_VS_LC is not set # CONFIG_IP_VS_WLC is not set # CONFIG_IP_VS_FO is not set # CONFIG_IP_VS_OVF is not set # CONFIG_IP_VS_LBLC is not set # CONFIG_IP_VS_LBLCR is not set # CONFIG_IP_VS_DH is not set # CONFIG_IP_VS_SH is not set # CONFIG_IP_VS_MH is not set # CONFIG_IP_VS_SED is not set # CONFIG_IP_VS_NQ is not set # CONFIG_IP_VS_TWOS is not set # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS MH scheduler # CONFIG_IP_VS_MH_TAB_INDEX=12 # # IPVS application helper # # CONFIG_IP_VS_FTP is not set CONFIG_IP_VS_NFCT=y # CONFIG_IP_VS_PE_SIP is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set CONFIG_NF_REJECT_IPV4=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_ARPTABLES is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m # CONFIG_NF_LOG_IPV6 is not set CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_MATCH_SRH is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m # CONFIG_IP6_NF_TARGET_NPT is not set # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_CONNTRACK_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y # CONFIG_BRIDGE_MRP is not set # CONFIG_BRIDGE_CFM is not set # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set CONFIG_NET_SCH_FQ_CODEL=y # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set # CONFIG_NET_SCH_DEFAULT is not set # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_FLOW is not set CONFIG_NET_CLS_CGROUP=m # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set CONFIG_NET_L3_MASTER_DEV=y # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_STREAM_PARSER is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # end of Network testing # end of Networking options # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=m CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y CONFIG_BT_BNEP=m CONFIG_BT_BNEP_MC_FILTER=y CONFIG_BT_BNEP_PROTO_FILTER=y CONFIG_BT_HIDP=m CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_LEDS is not set # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set # CONFIG_BT_DEBUGFS is not set # CONFIG_BT_SELFTEST is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_QCA=m CONFIG_BT_MTK=m CONFIG_BT_HCIBTUSB=m CONFIG_BT_HCIBTUSB_AUTOSUSPEND=y CONFIG_BT_HCIBTUSB_BCM=y CONFIG_BT_HCIBTUSB_MTK=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_RTL=y CONFIG_BT_HCIUART_QCA=y CONFIG_BT_HCIUART_AG6XX=y CONFIG_BT_HCIUART_MRVL=y CONFIG_BT_HCIBCM203X=m CONFIG_BT_HCIBPA10X=m CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIVHCI=m CONFIG_BT_MRVL=m CONFIG_BT_MRVL_SDIO=m CONFIG_BT_ATH3K=m CONFIG_BT_MTKSDIO=m CONFIG_BT_MTKUART=m # CONFIG_BT_VIRTIO is not set # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_SPY=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set # CONFIG_CFG80211_CRDA_SUPPORT is not set CONFIG_CFG80211_WEXT=y CONFIG_CFG80211_WEXT_EXPORT=y CONFIG_LIB80211=m CONFIG_LIB80211_CRYPT_WEP=m CONFIG_LIB80211_CRYPT_CCMP=m CONFIG_LIB80211_CRYPT_TKIP=m # CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=m CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_NET_DEVLINK=y CONFIG_PAGE_POOL=y # CONFIG_PAGE_POOL_STATS is not set CONFIG_FAILOVER=y CONFIG_ETHTOOL_NETLINK=y # # Device Drivers # CONFIG_HAVE_EISA=y # CONFIG_EISA is not set CONFIG_HAVE_PCI=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y CONFIG_PCIEPORTBUS=y CONFIG_PCIEAER=y # CONFIG_PCIEAER_INJECT is not set # CONFIG_PCIE_ECRC is not set CONFIG_PCIEASPM=y CONFIG_PCIEASPM_DEFAULT=y # CONFIG_PCIEASPM_POWERSAVE is not set # CONFIG_PCIEASPM_POWER_SUPERSAVE is not set # CONFIG_PCIEASPM_PERFORMANCE is not set CONFIG_PCIE_PME=y # CONFIG_PCIE_DPC is not set # CONFIG_PCIE_PTM is not set CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y CONFIG_PCI_QUIRKS=y # CONFIG_PCI_DEBUG is not set # CONFIG_PCI_STUB is not set CONFIG_PCI_ATS=y CONFIG_PCI_LOCKLESS_CONFIG=y # CONFIG_PCI_IOV is not set CONFIG_PCI_PRI=y CONFIG_PCI_PASID=y CONFIG_PCI_LABEL=y # CONFIG_PCIE_BUS_TUNE_OFF is not set CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set CONFIG_VGA_ARB=y CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # # PCI controller drivers # # CONFIG_VMD is not set # # DesignWare PCI Core Support # # CONFIG_PCIE_DW_PLAT_HOST is not set # CONFIG_PCI_MESON is not set # end of DesignWare PCI Core Support # # Mobiveil PCIe Core Support # # end of Mobiveil PCIe Core Support # # Cadence PCIe controllers support # # end of Cadence PCIe controllers support # end of PCI controller drivers # # PCI Endpoint # # CONFIG_PCI_ENDPOINT is not set # end of PCI Endpoint # # PCI switch controller drivers # # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers # CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set # # Generic Driver Options # CONFIG_AUXILIARY_BUS=y # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y # CONFIG_DEVTMPFS_SAFE is not set CONFIG_STANDALONE=y # CONFIG_PREVENT_FIRMWARE_BUILD is not set # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set CONFIG_FW_CACHE=y # CONFIG_FW_UPLOAD is not set # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y # CONFIG_ALLOW_DEV_COREDUMP is not set # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set # end of Generic Driver Options # # Bus devices # # CONFIG_MHI_BUS is not set # CONFIG_MHI_BUS_EP is not set # end of Bus devices CONFIG_CONNECTOR=y CONFIG_PROC_EVENTS=y # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # # end of ARM System Control and Management Interface Protocol # CONFIG_EDD is not set CONFIG_FIRMWARE_MEMMAP=y CONFIG_DMIID=y CONFIG_DMI_SYSFS=m CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y # CONFIG_ISCSI_IBFT is not set # CONFIG_FW_CFG_SYSFS is not set CONFIG_SYSFB=y # CONFIG_SYSFB_SIMPLEFB is not set # CONFIG_GOOGLE_FIRMWARE is not set # # EFI (Extensible Firmware Interface) Support # CONFIG_EFI_ESRT=y # CONFIG_EFI_FAKE_MEMMAP is not set CONFIG_EFI_DXE_MEM_ATTRIBUTES=y CONFIG_EFI_RUNTIME_WRAPPERS=y CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y # CONFIG_EFI_BOOTLOADER_CONTROL is not set # CONFIG_EFI_CAPSULE_LOADER is not set # CONFIG_EFI_TEST is not set CONFIG_EFI_DEV_PATH_PARSER=y CONFIG_APPLE_PROPERTIES=y # CONFIG_RESET_ATTACK_MITIGATION is not set # CONFIG_EFI_RCI2_TABLE is not set # CONFIG_EFI_DISABLE_PCI_DMA is not set CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y # CONFIG_EFI_DISABLE_RUNTIME is not set # CONFIG_EFI_COCO_SECRET is not set # end of EFI (Extensible Firmware Interface) Support # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set # CONFIG_MTD is not set # CONFIG_OF is not set CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y # CONFIG_PARPORT is not set CONFIG_PNP=y # CONFIG_PNP_DEBUG_MESSAGES is not set # # Protocols # CONFIG_PNPACPI=y CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set # CONFIG_BLK_DEV_FD is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=0 # CONFIG_BLK_DEV_DRBD is not set CONFIG_BLK_DEV_NBD=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=16384 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set CONFIG_VIRTIO_BLK=y # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_UBLK is not set # # NVME Support # CONFIG_NVME_CORE=y CONFIG_BLK_DEV_NVME=y CONFIG_NVME_MULTIPATH=y # CONFIG_NVME_VERBOSE_ERRORS is not set CONFIG_NVME_HWMON=y # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set # CONFIG_NVME_AUTH is not set # CONFIG_NVME_TARGET is not set # end of NVME Support # # Misc devices # # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_IBM_ASM is not set # CONFIG_PHANTOM is not set # CONFIG_TIFM_CORE is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HP_ILO is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_SRAM is not set # CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set CONFIG_MISC_RTSX=y # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_IDT_89HPESX is not set CONFIG_EEPROM_EE1004=y # end of EEPROM support # CONFIG_CB710_CORE is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_I2C is not set 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_INTEL_MEI_PXP is not set # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set # CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set CONFIG_MISC_RTSX_PCI=y CONFIG_MISC_RTSX_USB=y # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set # CONFIG_PVPANIC is not set # CONFIG_GP_PCI1XXXX is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=m CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set CONFIG_SCSI_SCAN_ASYNC=y # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set CONFIG_SCSI_SAS_ATTRS=y CONFIG_SCSI_SAS_LIBSAS=y CONFIG_SCSI_SAS_ATA=y CONFIG_SCSI_SAS_HOST_SMP=y # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_CXGB3_ISCSI is not set # CONFIG_SCSI_CXGB4_ISCSI is not set # CONFIG_SCSI_BNX2_ISCSI is not set # CONFIG_BE2ISCSI is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_HPSA is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_3W_SAS is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_AIC94XX is not set CONFIG_SCSI_MVSAS=y # CONFIG_SCSI_MVSAS_DEBUG is not set # CONFIG_SCSI_MVSAS_TASKLET is not set # CONFIG_SCSI_MVUMI is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set # CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set CONFIG_MEGARAID_SAS=y # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set # CONFIG_SCSI_MPI3MR is not set # CONFIG_SCSI_SMARTPQI is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_MYRB is not set # CONFIG_SCSI_MYRS is not set # CONFIG_VMWARE_PVSCSI is not set # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FDOMAIN_PCI is not set # CONFIG_SCSI_ISCI is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_STEX is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_IPR is not set # CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLA_ISCSI is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_AM53C974 is not set # CONFIG_SCSI_WD719X is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_PMCRAID is not set # CONFIG_SCSI_PM8001 is not set CONFIG_SCSI_VIRTIO=y # CONFIG_SCSI_DH is not set # end of SCSI device support CONFIG_ATA=y CONFIG_SATA_HOST=y CONFIG_PATA_TIMINGS=y # CONFIG_ATA_VERBOSE_ERROR is not set CONFIG_ATA_FORCE=y CONFIG_ATA_ACPI=y # CONFIG_SATA_ZPODD is not set CONFIG_SATA_PMP=y # # Controllers with non-SFF native interface # CONFIG_SATA_AHCI=y CONFIG_SATA_MOBILE_LPM_POLICY=0 CONFIG_SATA_AHCI_PLATFORM=y # CONFIG_AHCI_DWC is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set CONFIG_SATA_SIL24=y CONFIG_ATA_SFF=y # # SFF controllers with custom DMA interface # # CONFIG_PDC_ADMA is not set # CONFIG_SATA_QSTOR is not set # CONFIG_SATA_SX4 is not set CONFIG_ATA_BMDMA=y # # SATA SFF controllers with BMDMA # CONFIG_ATA_PIIX=y # CONFIG_SATA_DWC is not set # CONFIG_SATA_MV is not set CONFIG_SATA_NV=y # CONFIG_SATA_PROMISE is not set CONFIG_SATA_SIL=y CONFIG_SATA_SIS=y # CONFIG_SATA_SVW is not set CONFIG_SATA_ULI=y CONFIG_SATA_VIA=y # CONFIG_SATA_VITESSE is not set # # PATA SFF controllers with BMDMA # CONFIG_PATA_ALI=y CONFIG_PATA_AMD=y # CONFIG_PATA_ARTOP is not set CONFIG_PATA_ATIIXP=y # CONFIG_PATA_ATP867X is not set # CONFIG_PATA_CMD64X is not set # CONFIG_PATA_CYPRESS is not set # CONFIG_PATA_EFAR is not set # CONFIG_PATA_HPT366 is not set # CONFIG_PATA_HPT37X is not set # CONFIG_PATA_HPT3X2N is not set # CONFIG_PATA_HPT3X3 is not set # CONFIG_PATA_IT8213 is not set # CONFIG_PATA_IT821X is not set CONFIG_PATA_JMICRON=y CONFIG_PATA_MARVELL=y # CONFIG_PATA_NETCELL is not set # CONFIG_PATA_NINJA32 is not set # CONFIG_PATA_NS87415 is not set # CONFIG_PATA_OLDPIIX is not set # CONFIG_PATA_OPTIDMA is not set # CONFIG_PATA_PDC2027X is not set # CONFIG_PATA_PDC_OLD is not set # CONFIG_PATA_RADISYS is not set # CONFIG_PATA_RDC is not set # CONFIG_PATA_SCH is not set # CONFIG_PATA_SERVERWORKS is not set # CONFIG_PATA_SIL680 is not set CONFIG_PATA_SIS=y # CONFIG_PATA_TOSHIBA is not set # CONFIG_PATA_TRIFLEX is not set CONFIG_PATA_VIA=y # CONFIG_PATA_WINBOND is not set # # PIO-only SFF controllers # # CONFIG_PATA_CMD640_PCI is not set # CONFIG_PATA_MPIIX is not set # CONFIG_PATA_NS87410 is not set # CONFIG_PATA_OPTI is not set # CONFIG_PATA_RZ1000 is not set # # Generic fallback / legacy drivers # CONFIG_PATA_ACPI=y CONFIG_ATA_GENERIC=y # CONFIG_PATA_LEGACY is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=m # CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m # CONFIG_DM_UNSTRIPED is not set # CONFIG_DM_CRYPT is not set # CONFIG_DM_SNAPSHOT is not set CONFIG_DM_THIN_PROVISIONING=m # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_EBS is not set # CONFIG_DM_ERA is not set # CONFIG_DM_CLONE is not set # CONFIG_DM_MIRROR is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_DUST is not set # CONFIG_DM_UEVENT is not set # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_DM_INTEGRITY is not set # CONFIG_TARGET_CORE is not set # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # CONFIG_FIREWIRE=m CONFIG_FIREWIRE_OHCI=m CONFIG_FIREWIRE_SBP2=m # CONFIG_FIREWIRE_NET is not set # CONFIG_FIREWIRE_NOSY is not set # end of IEEE 1394 (FireWire) support # CONFIG_MACINTOSH_DRIVERS is not set CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set CONFIG_DUMMY=m CONFIG_WIREGUARD=m # CONFIG_WIREGUARD_DEBUG is not set # CONFIG_EQUALIZER is not set # CONFIG_NET_FC is not set # 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 # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_AMT is not set # CONFIG_MACSEC is not set CONFIG_NETCONSOLE=y CONFIG_NETCONSOLE_DYNAMIC=y CONFIG_NETPOLL=y CONFIG_NET_POLL_CONTROLLER=y CONFIG_TUN=y # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m CONFIG_VIRTIO_NET=y CONFIG_NLMON=m # CONFIG_ARCNET is not set CONFIG_ETHERNET=y CONFIG_MDIO=y CONFIG_NET_VENDOR_3COM=y CONFIG_VORTEX=y # CONFIG_TYPHOON is not set # CONFIG_NET_VENDOR_ADAPTEC is not set # CONFIG_NET_VENDOR_AGERE is not set # CONFIG_NET_VENDOR_ALACRITECH is not set # CONFIG_NET_VENDOR_ALTEON is not set # CONFIG_ALTERA_TSE is not set CONFIG_NET_VENDOR_AMAZON=y # CONFIG_ENA_ETHERNET is not set CONFIG_NET_VENDOR_AMD=y # CONFIG_AMD8111_ETH is not set CONFIG_PCNET32=y # CONFIG_AMD_XGBE is not set CONFIG_NET_VENDOR_AQUANTIA=y CONFIG_AQTION=y CONFIG_NET_VENDOR_ARC=y # CONFIG_NET_VENDOR_ASIX is not set CONFIG_NET_VENDOR_ATHEROS=y CONFIG_ATL2=y CONFIG_ATL1=y CONFIG_ATL1E=y CONFIG_ATL1C=y CONFIG_ALX=y # CONFIG_CX_ECAT is not set CONFIG_NET_VENDOR_BROADCOM=y CONFIG_B44=y CONFIG_B44_PCI_AUTOSELECT=y CONFIG_B44_PCICORE_AUTOSELECT=y CONFIG_B44_PCI=y # CONFIG_BCMGENET is not set CONFIG_BNX2=y CONFIG_CNIC=y CONFIG_TIGON3=y CONFIG_TIGON3_HWMON=y # CONFIG_BNX2X is not set # CONFIG_SYSTEMPORT is not set # CONFIG_BNXT is not set # CONFIG_NET_VENDOR_CADENCE is not set CONFIG_NET_VENDOR_CAVIUM=y # CONFIG_THUNDER_NIC_PF is not set # CONFIG_THUNDER_NIC_VF is not set # CONFIG_THUNDER_NIC_BGX is not set # CONFIG_THUNDER_NIC_RGX is not set # CONFIG_CAVIUM_PTP is not set # CONFIG_LIQUIDIO is not set # CONFIG_LIQUIDIO_VF is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set # CONFIG_NET_VENDOR_CORTINA is not set # CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set CONFIG_NET_VENDOR_DEC=y CONFIG_NET_TULIP=y # CONFIG_DE2104X is not set # CONFIG_TULIP is not set # CONFIG_WINBOND_840 is not set # CONFIG_DM9102 is not set CONFIG_ULI526X=y # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set # CONFIG_NET_VENDOR_ENGLEDER is not set CONFIG_NET_VENDOR_EZCHIP=y # CONFIG_NET_VENDOR_FUNGIBLE is not set # CONFIG_NET_VENDOR_GOOGLE is not set # CONFIG_NET_VENDOR_HUAWEI is not set CONFIG_NET_VENDOR_I825XX=y CONFIG_NET_VENDOR_INTEL=y CONFIG_E100=y CONFIG_E1000=y CONFIG_E1000E=y CONFIG_E1000E_HWTS=y CONFIG_IGB=y CONFIG_IGB_HWMON=y # CONFIG_IGBVF is not set CONFIG_IXGB=y CONFIG_IXGBE=y CONFIG_IXGBE_HWMON=y # CONFIG_IXGBEVF is not set # CONFIG_I40E is not set # CONFIG_I40EVF is not set CONFIG_ICE=y CONFIG_ICE_HWTS=y # CONFIG_FM10K is not set CONFIG_IGC=y # CONFIG_NET_VENDOR_WANGXUN is not set CONFIG_JME=y # CONFIG_NET_VENDOR_LITEX is not set CONFIG_NET_VENDOR_MARVELL=y # CONFIG_MVMDIO is not set CONFIG_SKGE=y # CONFIG_SKGE_DEBUG is not set CONFIG_SKGE_GENESIS=y CONFIG_SKY2=y # CONFIG_SKY2_DEBUG is not set # CONFIG_OCTEON_EP is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set CONFIG_NET_VENDOR_MICROCHIP=y CONFIG_LAN743X=y CONFIG_NET_VENDOR_MICROSEMI=y CONFIG_NET_VENDOR_MICROSOFT=y # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set # CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NETERION is not set CONFIG_NET_VENDOR_NETRONOME=y # CONFIG_NFP is not set CONFIG_NET_VENDOR_NVIDIA=y CONFIG_FORCEDETH=y # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set # CONFIG_NET_VENDOR_PACKET_ENGINES is not set # CONFIG_NET_VENDOR_PENSANDO is not set CONFIG_NET_VENDOR_QLOGIC=y CONFIG_QLA3XXX=y # CONFIG_QLCNIC is not set # CONFIG_NETXEN_NIC is not set # CONFIG_QED is not set # CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set CONFIG_NET_VENDOR_REALTEK=y # CONFIG_8139CP is not set CONFIG_8139TOO=y # CONFIG_8139TOO_PIO is not set # CONFIG_8139TOO_TUNE_TWISTER is not set # CONFIG_8139TOO_8129 is not set # CONFIG_8139_OLD_RX_RESET is not set CONFIG_R8169=y CONFIG_NET_VENDOR_RENESAS=y CONFIG_NET_VENDOR_ROCKER=y # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set # CONFIG_NET_VENDOR_SILAN is not set CONFIG_NET_VENDOR_SIS=y CONFIG_SIS900=y CONFIG_SIS190=y # CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set # CONFIG_NET_VENDOR_STMICRO is not set # CONFIG_NET_VENDOR_SUN is not set CONFIG_NET_VENDOR_SYNOPSYS=y # CONFIG_DWC_XLGMAC is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set # CONFIG_NET_VENDOR_VERTEXCOM is not set CONFIG_NET_VENDOR_VIA=y CONFIG_VIA_RHINE=y # CONFIG_VIA_RHINE_MMIO is not set CONFIG_VIA_VELOCITY=y # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set # CONFIG_NET_SB1000 is not set CONFIG_PHYLINK=m CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_SFP is not set # # MII PHY device drivers # CONFIG_AMD_PHY=y # CONFIG_ADIN_PHY is not set # CONFIG_ADIN1100_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=m CONFIG_BROADCOM_PHY=y # CONFIG_BCM54140_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set CONFIG_BCM_NET_PHYLIB=y # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set CONFIG_MARVELL_PHY=y # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set # CONFIG_MAXLINEAR_GPHY is not set # CONFIG_MEDIATEK_GE_PHY is not set # CONFIG_MICREL_PHY is not set # CONFIG_MICROCHIP_PHY is not set # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set # CONFIG_MOTORCOMM_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set CONFIG_AT803X_PHY=y # CONFIG_QSEMI_PHY is not set CONFIG_REALTEK_PHY=y # CONFIG_RENESAS_PHY is not set # CONFIG_ROCKCHIP_PHY is not set # CONFIG_SMSC_PHY is not set # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_DP83TD510_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_PSE_CONTROLLER is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_ACPI_MDIO=y CONFIG_MDIO_DEVRES=y # CONFIG_MDIO_BITBANG is not set # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_THUNDER is not set # # MDIO Multiplexers # # # PCS device drivers # # end of PCS device drivers CONFIG_PPP=m CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set CONFIG_PPP_MPPE=m # CONFIG_PPP_MULTILINK is not set CONFIG_PPPOE=m CONFIG_PPP_ASYNC=m # CONFIG_PPP_SYNC_TTY is not set # CONFIG_SLIP is not set CONFIG_SLHC=m CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set # CONFIG_USB_RTL8150 is not set CONFIG_USB_RTL8152=m # CONFIG_USB_LAN78XX is not set CONFIG_USB_USBNET=m CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m # CONFIG_USB_NET_CDC_EEM is not set # CONFIG_USB_NET_CDC_NCM is not set # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set CONFIG_USB_NET_DM9601=m # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set CONFIG_USB_NET_SMSC75XX=m # CONFIG_USB_NET_SMSC95XX is not set # CONFIG_USB_NET_GL620A is not set # CONFIG_USB_NET_NET1080 is not set # CONFIG_USB_NET_PLUSB is not set CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m # CONFIG_USB_NET_CDC_SUBSET is not set # CONFIG_USB_NET_ZAURUS is not set # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set CONFIG_USB_HSO=m # CONFIG_USB_NET_INT51X1 is not set CONFIG_USB_IPHETH=m # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y # CONFIG_ADM8211 is not set CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set CONFIG_ATH5K=m # CONFIG_ATH5K_DEBUG is not set # CONFIG_ATH5K_TRACER is not set CONFIG_ATH5K_PCI=y CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m CONFIG_ATH9K_PCI=y CONFIG_ATH9K_AHB=y # CONFIG_ATH9K_DEBUGFS is not set # CONFIG_ATH9K_DYNACK is not set # CONFIG_ATH9K_WOW is not set CONFIG_ATH9K_RFKILL=y CONFIG_ATH9K_CHANNEL_CONTEXT=y CONFIG_ATH9K_PCOEM=y # CONFIG_ATH9K_PCI_NO_EEPROM is not set CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_ATH9K_HWRNG=y CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y # CONFIG_CARL9170_HWRNG is not set CONFIG_ATH6KL=m # CONFIG_ATH6KL_SDIO is not set CONFIG_ATH6KL_USB=m # CONFIG_ATH6KL_DEBUG is not set # CONFIG_ATH6KL_TRACING is not set CONFIG_AR5523=m # CONFIG_WIL6210 is not set CONFIG_ATH10K=m CONFIG_ATH10K_CE=y CONFIG_ATH10K_PCI=m # CONFIG_ATH10K_SDIO is not set CONFIG_ATH10K_USB=m # CONFIG_ATH10K_DEBUG is not set # CONFIG_ATH10K_DEBUGFS is not set # CONFIG_ATH10K_TRACING is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set # CONFIG_ATH11K is not set CONFIG_WLAN_VENDOR_ATMEL=y CONFIG_ATMEL=m CONFIG_PCI_ATMEL=m # CONFIG_AT76C50X_USB is not set CONFIG_WLAN_VENDOR_BROADCOM=y # CONFIG_B43 is not set # CONFIG_B43LEGACY is not set CONFIG_BRCMUTIL=m # CONFIG_BRCMSMAC is not set CONFIG_BRCMFMAC=m CONFIG_BRCMFMAC_PROTO_BCDC=y CONFIG_BRCMFMAC_PROTO_MSGBUF=y CONFIG_BRCMFMAC_SDIO=y CONFIG_BRCMFMAC_USB=y CONFIG_BRCMFMAC_PCIE=y # CONFIG_BRCM_TRACING is not set # CONFIG_BRCMDBG is not set CONFIG_WLAN_VENDOR_CISCO=y # CONFIG_AIRO is not set CONFIG_WLAN_VENDOR_INTEL=y CONFIG_IPW2100=m CONFIG_IPW2100_MONITOR=y # CONFIG_IPW2100_DEBUG is not set CONFIG_IPW2200=m CONFIG_IPW2200_MONITOR=y CONFIG_IPW2200_RADIOTAP=y CONFIG_IPW2200_PROMISCUOUS=y CONFIG_IPW2200_QOS=y # CONFIG_IPW2200_DEBUG is not set CONFIG_LIBIPW=m # CONFIG_LIBIPW_DEBUG is not set CONFIG_IWLEGACY=m CONFIG_IWL4965=m CONFIG_IWL3945=m # # iwl3945 / iwl4965 Debugging Options # # CONFIG_IWLEGACY_DEBUG is not set # end of iwl3945 / iwl4965 Debugging Options CONFIG_IWLWIFI=m CONFIG_IWLWIFI_LEDS=y CONFIG_IWLDVM=m CONFIG_IWLMVM=m CONFIG_IWLWIFI_OPMODE_MODULAR=y # # Debugging Options # # CONFIG_IWLWIFI_DEBUG is not set CONFIG_IWLWIFI_DEVICE_TRACING=y # end of Debugging Options CONFIG_WLAN_VENDOR_INTERSIL=y CONFIG_HOSTAP=m CONFIG_HOSTAP_FIRMWARE=y CONFIG_HOSTAP_FIRMWARE_NVRAM=y # CONFIG_HOSTAP_PLX is not set # CONFIG_HOSTAP_PCI is not set # CONFIG_HERMES is not set CONFIG_P54_COMMON=m CONFIG_P54_USB=m CONFIG_P54_PCI=m CONFIG_P54_LEDS=y CONFIG_WLAN_VENDOR_MARVELL=y CONFIG_LIBERTAS=m # CONFIG_LIBERTAS_USB is not set # CONFIG_LIBERTAS_SDIO is not set # CONFIG_LIBERTAS_DEBUG is not set # CONFIG_LIBERTAS_MESH is not set CONFIG_LIBERTAS_THINFIRM=m # CONFIG_LIBERTAS_THINFIRM_DEBUG is not set CONFIG_LIBERTAS_THINFIRM_USB=m CONFIG_MWIFIEX=m CONFIG_MWIFIEX_SDIO=m # CONFIG_MWIFIEX_PCIE is not set CONFIG_MWIFIEX_USB=m # CONFIG_MWL8K is not set CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m CONFIG_MT76_CORE=m CONFIG_MT76_LEDS=y CONFIG_MT76_USB=m CONFIG_MT76x02_LIB=m CONFIG_MT76x02_USB=m CONFIG_MT76_CONNAC_LIB=m CONFIG_MT76x0_COMMON=m CONFIG_MT76x0U=m # CONFIG_MT76x0E is not set CONFIG_MT76x2_COMMON=m CONFIG_MT76x2E=m CONFIG_MT76x2U=m CONFIG_MT7603E=m CONFIG_MT7615_COMMON=m CONFIG_MT7615E=m CONFIG_MT7663_USB_SDIO_COMMON=m CONFIG_MT7663U=m # CONFIG_MT7663S is not set CONFIG_MT7915E=m # CONFIG_MT7921E is not set # CONFIG_MT7921S is not set # CONFIG_MT7921U is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WLAN_VENDOR_PURELIFI is not set CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m CONFIG_RT2400PCI=m CONFIG_RT2500PCI=m CONFIG_RT61PCI=m CONFIG_RT2800PCI=m CONFIG_RT2800PCI_RT33XX=y CONFIG_RT2800PCI_RT35XX=y CONFIG_RT2800PCI_RT53XX=y CONFIG_RT2800PCI_RT3290=y CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2800_LIB_MMIO=m CONFIG_RT2X00_LIB_MMIO=m CONFIG_RT2X00_LIB_PCI=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WLAN_VENDOR_REALTEK=y CONFIG_RTL8180=m CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y CONFIG_RTL_CARDS=m CONFIG_RTL8192CE=m CONFIG_RTL8192SE=m CONFIG_RTL8192DE=m CONFIG_RTL8723AE=m CONFIG_RTL8723BE=m CONFIG_RTL8188EE=m CONFIG_RTL8192EE=m CONFIG_RTL8821AE=m # CONFIG_RTL8192CU is not set CONFIG_RTLWIFI=m CONFIG_RTLWIFI_PCI=m # CONFIG_RTLWIFI_DEBUG is not set CONFIG_RTL8192C_COMMON=m CONFIG_RTL8723_COMMON=m CONFIG_RTLBTCOEXIST=m CONFIG_RTL8XXXU=m CONFIG_RTL8XXXU_UNTESTED=y CONFIG_RTW88=m CONFIG_RTW88_CORE=m CONFIG_RTW88_PCI=m CONFIG_RTW88_USB=m CONFIG_RTW88_8822B=m CONFIG_RTW88_8822C=m CONFIG_RTW88_8723D=m CONFIG_RTW88_8821C=m CONFIG_RTW88_8822BE=m # CONFIG_RTW88_8822BS is not set CONFIG_RTW88_8822BU=m CONFIG_RTW88_8822CE=m # CONFIG_RTW88_8822CS is not set CONFIG_RTW88_8822CU=m CONFIG_RTW88_8723DE=m CONFIG_RTW88_8723DU=m CONFIG_RTW88_8821CE=m # CONFIG_RTW88_8821CS is not set CONFIG_RTW88_8821CU=m # CONFIG_RTW88_DEBUG is not set # CONFIG_RTW88_DEBUGFS is not set # CONFIG_RTW89 is not set CONFIG_WLAN_VENDOR_RSI=y # CONFIG_RSI_91X is not set # CONFIG_WLAN_VENDOR_SILABS is not set CONFIG_WLAN_VENDOR_ST=y # CONFIG_CW1200 is not set CONFIG_WLAN_VENDOR_TI=y # CONFIG_WL1251 is not set # CONFIG_WL12XX is not set # CONFIG_WL18XX is not set # CONFIG_WLCORE is not set CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_USB_ZD1201=m CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set # CONFIG_WLAN_VENDOR_QUANTENNA is not set # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN # CONFIG_VMXNET3 is not set # CONFIG_FUJITSU_ES is not set # CONFIG_NETDEVSIM is not set CONFIG_NET_FAILOVER=y # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y # CONFIG_INPUT_MOUSEDEV_PSAUX is not set CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set # CONFIG_KEYBOARD_GPIO is not set # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_PINEPHONE is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CYPRESS_SF is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y CONFIG_MOUSE_PS2_ALPS=y CONFIG_MOUSE_PS2_BYD=y CONFIG_MOUSE_PS2_LOGIPS2PP=y CONFIG_MOUSE_PS2_SYNAPTICS=y CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y CONFIG_MOUSE_PS2_CYPRESS=y CONFIG_MOUSE_PS2_LIFEBOOK=y CONFIG_MOUSE_PS2_TRACKPOINT=y # CONFIG_MOUSE_PS2_ELANTECH is not set # CONFIG_MOUSE_PS2_SENTELIC is not set # CONFIG_MOUSE_PS2_TOUCHKIT is not set # CONFIG_MOUSE_PS2_FOCALTECH is not set # CONFIG_MOUSE_PS2_VMMOUSE is not set CONFIG_MOUSE_PS2_SMBUS=y # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set # CONFIG_MOUSE_CYAPA is not set # CONFIG_MOUSE_ELAN_I2C is not set # CONFIG_MOUSE_VSXXXAA is not set # CONFIG_MOUSE_GPIO is not set # CONFIG_MOUSE_SYNAPTICS_I2C is not set # CONFIG_MOUSE_SYNAPTICS_USB is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set # CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y # CONFIG_JOYSTICK_PXRC is not set # CONFIG_JOYSTICK_QWIIC is not set # CONFIG_JOYSTICK_FSIA6B is not set # CONFIG_JOYSTICK_SENSEHAT is not set # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_BU21029 is not set # CONFIG_TOUCHSCREEN_CHIPONE_ICN8505 is not set # CONFIG_TOUCHSCREEN_CY8CTMA140 is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set # CONFIG_TOUCHSCREEN_EXC3000 is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_HIDEEP is not set # CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_ILITEK is not set # CONFIG_TOUCHSCREEN_S6SY761 is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set CONFIG_TOUCHSCREEN_ELAN=y # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MSG2638 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_IMAGIS is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set # CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set # CONFIG_TOUCHSCREEN_WM97XX is not set CONFIG_TOUCHSCREEN_USB_COMPOSITE=m CONFIG_TOUCHSCREEN_USB_EGALAX=y # CONFIG_TOUCHSCREEN_USB_PANJIT is not set CONFIG_TOUCHSCREEN_USB_3M=y # CONFIG_TOUCHSCREEN_USB_ITM is not set # CONFIG_TOUCHSCREEN_USB_ETURBO is not set # CONFIG_TOUCHSCREEN_USB_GUNZE is not set # CONFIG_TOUCHSCREEN_USB_DMC_TSC10 is not set # CONFIG_TOUCHSCREEN_USB_IRTOUCH is not set # CONFIG_TOUCHSCREEN_USB_IDEALTEK is not set # CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH is not set # CONFIG_TOUCHSCREEN_USB_GOTOP is not set # CONFIG_TOUCHSCREEN_USB_JASTEC is not set # CONFIG_TOUCHSCREEN_USB_ELO is not set # CONFIG_TOUCHSCREEN_USB_E2I is not set # CONFIG_TOUCHSCREEN_USB_ZYTRONIC is not set # CONFIG_TOUCHSCREEN_USB_ETT_TC45USB is not set # CONFIG_TOUCHSCREEN_USB_NEXIO is not set CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2004 is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_RM_TS is not set # CONFIG_TOUCHSCREEN_SILEAD is not set # CONFIG_TOUCHSCREEN_SIS_I2C is not set CONFIG_TOUCHSCREEN_ST1232=m # CONFIG_TOUCHSCREEN_STMFTS is not set # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_SX8654 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZET6223 is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_IQS5XX is not set # CONFIG_TOUCHSCREEN_ZINITIX is not set 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_MMA8450 is not set # CONFIG_INPUT_APANEL is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set # CONFIG_INPUT_ATLAS_BTNS is not set CONFIG_INPUT_ATI_REMOTE2=m # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set CONFIG_RMI4_CORE=y # CONFIG_RMI4_I2C is not set # CONFIG_RMI4_SMB is not set CONFIG_RMI4_F03=y CONFIG_RMI4_F03_SERIO=y CONFIG_RMI4_2D_SENSOR=y CONFIG_RMI4_F11=y CONFIG_RMI4_F12=y CONFIG_RMI4_F30=y # CONFIG_RMI4_F34 is not set # CONFIG_RMI4_F3A is not set # CONFIG_RMI4_F55 is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y CONFIG_SERIO_I8042=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_CT82C710 is not set # CONFIG_SERIO_PCIPS2 is not set CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_GPIO_PS2 is not set # CONFIG_USERIO is not set # CONFIG_GAMEPORT is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_8250=y # CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set CONFIG_SERIAL_8250_PNP=y # CONFIG_SERIAL_8250_16550A_VARIANTS is not set # CONFIG_SERIAL_8250_FINTEK is not set # CONFIG_SERIAL_8250_CONSOLE is not set CONFIG_SERIAL_8250_DMA=y CONFIG_SERIAL_8250_PCI=y CONFIG_SERIAL_8250_EXAR=y CONFIG_SERIAL_8250_NR_UARTS=32 CONFIG_SERIAL_8250_RUNTIME_UARTS=4 CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_MANY_PORTS=y CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set CONFIG_SERIAL_8250_RSA=y CONFIG_SERIAL_8250_DWLIB=y CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_LPSS is not set CONFIG_SERIAL_8250_MID=y # CONFIG_SERIAL_8250_PERICOM is not set # # Non-8250 serial port support # # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_LANTIQ is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_RP2 is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set CONFIG_HVC_DRIVER=y CONFIG_SERIAL_DEV_BUS=y CONFIG_SERIAL_DEV_CTRL_TTYPORT=y # CONFIG_TTY_PRINTK is not set CONFIG_VIRTIO_CONSOLE=y # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=m # CONFIG_HW_RANDOM_TIMERIOMEM is not set CONFIG_HW_RANDOM_INTEL=m CONFIG_HW_RANDOM_AMD=m # CONFIG_HW_RANDOM_BA431 is not set # CONFIG_HW_RANDOM_VIA is not set CONFIG_HW_RANDOM_VIRTIO=m # CONFIG_HW_RANDOM_XIPHERA is not set # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set CONFIG_DEVMEM=y # CONFIG_NVRAM is not set CONFIG_DEVPORT=y # CONFIG_HPET is not set # CONFIG_HANGCHECK_TIMER is not set # CONFIG_TCG_TPM is not set # CONFIG_TELCLOCK is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set # CONFIG_RANDOM_TRUST_CPU is not set # CONFIG_RANDOM_TRUST_BOOTLOADER is not set # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_ACPI_I2C_OPREGION=y CONFIG_I2C_BOARDINFO=y # CONFIG_I2C_COMPAT is not set CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=m # # Multiplexer I2C Chip support # # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_MUX_MLXCPLD is not set # end of Multiplexer I2C Chip support CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_SMBUS=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # PC SMBus host controller drivers # CONFIG_I2C_CCGX_UCSI=m # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_AMD_MP2 is not set CONFIG_I2C_I801=y CONFIG_I2C_ISCH=y # CONFIG_I2C_ISMT is not set CONFIG_I2C_PIIX4=y CONFIG_I2C_NFORCE2=y # CONFIG_I2C_NFORCE2_S4985 is not set CONFIG_I2C_NVIDIA_GPU=m # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set CONFIG_I2C_VIA=y CONFIG_I2C_VIAPRO=y # # ACPI drivers # # CONFIG_I2C_SCMI is not set # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CBUS_GPIO is not set CONFIG_I2C_DESIGNWARE_CORE=y # CONFIG_I2C_DESIGNWARE_SLAVE is not set CONFIG_I2C_DESIGNWARE_PLATFORM=y # CONFIG_I2C_DESIGNWARE_AMDPSP is not set CONFIG_I2C_DESIGNWARE_BAYTRAIL=y # CONFIG_I2C_DESIGNWARE_PCI is not set # CONFIG_I2C_EMEV2 is not set # CONFIG_I2C_GPIO is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_PCI1XXXX is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_MLXCPLD is not set # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set # CONFIG_SPI is not set # CONFIG_SPMI is not set # CONFIG_HSI is not set CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # CONFIG_PTP_1588_CLOCK_KVM=y # CONFIG_PTP_1588_CLOCK_IDT82P33 is not set # CONFIG_PTP_1588_CLOCK_IDTCM is not set # CONFIG_PTP_1588_CLOCK_VMW is not set # end of PTP clock support CONFIG_PINCTRL=y CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_AMD is not set # CONFIG_PINCTRL_CY8C95X0 is not set # CONFIG_PINCTRL_MCP23S08 is not set # CONFIG_PINCTRL_SX150X is not set # # Intel pinctrl drivers # CONFIG_PINCTRL_BAYTRAIL=y CONFIG_PINCTRL_CHERRYVIEW=y CONFIG_PINCTRL_LYNXPOINT=y CONFIG_PINCTRL_INTEL=y # CONFIG_PINCTRL_ALDERLAKE is not set CONFIG_PINCTRL_BROXTON=y CONFIG_PINCTRL_CANNONLAKE=y CONFIG_PINCTRL_CEDARFORK=y CONFIG_PINCTRL_DENVERTON=y # CONFIG_PINCTRL_ELKHARTLAKE is not set CONFIG_PINCTRL_EMMITSBURG=y CONFIG_PINCTRL_GEMINILAKE=y CONFIG_PINCTRL_ICELAKE=y CONFIG_PINCTRL_JASPERLAKE=y # CONFIG_PINCTRL_LAKEFIELD is not set CONFIG_PINCTRL_LEWISBURG=y # CONFIG_PINCTRL_METEORLAKE is not set CONFIG_PINCTRL_SUNRISEPOINT=y CONFIG_PINCTRL_TIGERLAKE=y # end of Intel pinctrl drivers # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_GPIO_ACPI=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y CONFIG_GPIO_CDEV=y CONFIG_GPIO_CDEV_V1=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_AMDPT is not set # CONFIG_GPIO_DWAPB is not set # CONFIG_GPIO_EXAR is not set # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_MB86S7X is not set # CONFIG_GPIO_VX855 is not set # CONFIG_GPIO_AMD_FCH is not set # end of Memory mapped GPIO drivers # # Port-mapped I/O GPIO drivers # # CONFIG_GPIO_F7188X is not set # CONFIG_GPIO_IT87 is not set # CONFIG_GPIO_SCH is not set # CONFIG_GPIO_SCH311X is not set # CONFIG_GPIO_WINBOND is not set # CONFIG_GPIO_WS16C48 is not set # end of Port-mapped I/O GPIO drivers # # I2C GPIO expanders # # CONFIG_GPIO_MAX7300 is not set # CONFIG_GPIO_MAX732X is not set # CONFIG_GPIO_PCA953X is not set # CONFIG_GPIO_PCA9570 is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # # end of MFD GPIO expanders # # PCI GPIO expanders # # CONFIG_GPIO_AMD8111 is not set # CONFIG_GPIO_ML_IOH is not set # CONFIG_GPIO_PCI_IDIO_16 is not set # CONFIG_GPIO_PCIE_IDIO_24 is not set # CONFIG_GPIO_RDC321X is not set # end of PCI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_VIRTIO is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers # CONFIG_W1 is not set # CONFIG_POWER_RESET is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_PDA_POWER is not set # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set CONFIG_HWMON=y CONFIG_HWMON_VID=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_ABITUGURU is not set # CONFIG_SENSORS_ABITUGURU3 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set CONFIG_SENSORS_K8TEMP=m CONFIG_SENSORS_K10TEMP=m CONFIG_SENSORS_FAM15H_POWER=m # CONFIG_SENSORS_APPLESMC is not set # CONFIG_SENSORS_ASB100 is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DRIVETEMP is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_DELL_SMM is not set # CONFIG_SENSORS_I5K_AMB is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FSCHMD is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_I5500 is not set CONFIG_SENSORS_CORETEMP=y CONFIG_SENSORS_IT87=m CONFIG_SENSORS_JC42=m # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31730 is not set # CONFIG_SENSORS_MAX31760 is not set # CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_NZXT_KRAKEN2 is not set # CONFIG_SENSORS_NZXT_SMART2 is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set # CONFIG_SENSORS_SBTSI is not set # CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VIA_CPUTEMP is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_VT8231 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set CONFIG_SENSORS_W83627EHF=y # CONFIG_SENSORS_XGENE is not set # # ACPI drivers # # CONFIG_SENSORS_ACPI_POWER is not set CONFIG_SENSORS_ATK0110=m # CONFIG_SENSORS_ASUS_WMI is not set # CONFIG_SENSORS_ASUS_EC is not set CONFIG_THERMAL=y CONFIG_THERMAL_NETLINK=y CONFIG_THERMAL_STATISTICS=y CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_WRITABLE_TRIPS=y CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set CONFIG_THERMAL_GOV_USER_SPACE=y # CONFIG_THERMAL_EMULATION is not set # # Intel thermal drivers # CONFIG_INTEL_POWERCLAMP=m CONFIG_X86_THERMAL_VECTOR=y CONFIG_X86_PKG_TEMP_THERMAL=m CONFIG_INTEL_SOC_DTS_IOSF_CORE=m CONFIG_INTEL_SOC_DTS_THERMAL=m # # ACPI INT340X thermal drivers # # CONFIG_INT340X_THERMAL is not set # end of ACPI INT340X thermal drivers # CONFIG_INTEL_PCH_THERMAL is not set # CONFIG_INTEL_TCC_COOLING is not set # CONFIG_INTEL_MENLOW is not set CONFIG_INTEL_HFI_THERMAL=y # end of Intel thermal drivers # CONFIG_WATCHDOG is not set CONFIG_SSB_POSSIBLE=y CONFIG_SSB=y CONFIG_SSB_SPROM=y CONFIG_SSB_PCIHOST_POSSIBLE=y CONFIG_SSB_PCIHOST=y CONFIG_SSB_SDIOHOST_POSSIBLE=y CONFIG_SSB_SDIOHOST=y CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y CONFIG_SSB_DRIVER_PCICORE=y # CONFIG_SSB_DRIVER_GPIO is not set CONFIG_BCMA_POSSIBLE=y CONFIG_BCMA=m CONFIG_BCMA_HOST_PCI_POSSIBLE=y CONFIG_BCMA_HOST_PCI=y # CONFIG_BCMA_HOST_SOC is not set CONFIG_BCMA_DRIVER_PCI=y CONFIG_BCMA_DRIVER_GMAC_CMN=y # CONFIG_BCMA_DRIVER_GPIO is not set # CONFIG_BCMA_DEBUG is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_AS3711 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set # CONFIG_LPC_ICH is not set CONFIG_LPC_SCH=y # CONFIG_INTEL_SOC_PMIC is not set # CONFIG_INTEL_SOC_PMIC_CHTWC is not set # CONFIG_INTEL_SOC_PMIC_CHTDC_TI is not set CONFIG_MFD_INTEL_LPSS=y CONFIG_MFD_INTEL_LPSS_ACPI=y CONFIG_MFD_INTEL_LPSS_PCI=y # CONFIG_MFD_INTEL_PMC_BXT is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_UCB1400_CORE is not set # CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_SYSCON is not set # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set CONFIG_MFD_WL1273_CORE=m # 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 # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_RAVE_SP_CORE is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set # CONFIG_REGULATOR_FIXED_VOLTAGE is not set # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set # CONFIG_REGULATOR_GPIO is not set # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX20086 is not set # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MP8859 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set CONFIG_RC_CORE=y CONFIG_BPF_LIRC_MODE2=y CONFIG_LIRC=y CONFIG_RC_MAP=m CONFIG_RC_DECODERS=y CONFIG_IR_IMON_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_MCE_KBD_DECODER=m CONFIG_IR_NEC_DECODER=m CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m CONFIG_IR_RCMM_DECODER=m CONFIG_IR_SANYO_DECODER=m CONFIG_IR_SHARP_DECODER=m CONFIG_IR_SONY_DECODER=m CONFIG_IR_XMP_DECODER=m CONFIG_RC_DEVICES=y CONFIG_IR_ENE=m CONFIG_IR_FINTEK=m CONFIG_IR_IGORPLUGUSB=m CONFIG_IR_IGUANA=m CONFIG_IR_IMON=m CONFIG_IR_IMON_RAW=m CONFIG_IR_ITE_CIR=m CONFIG_IR_MCEUSB=m CONFIG_IR_NUVOTON=m CONFIG_IR_REDRAT3=m CONFIG_IR_SERIAL=m CONFIG_IR_SERIAL_TRANSMITTER=y CONFIG_IR_STREAMZAP=m CONFIG_IR_TOY=m CONFIG_IR_TTUSBIR=m CONFIG_IR_WINBOND_CIR=m CONFIG_RC_ATI_REMOTE=m # CONFIG_RC_LOOPBACK is not set CONFIG_RC_XBOX_DVD=m CONFIG_CEC_CORE=y # # CEC support # # CONFIG_MEDIA_CEC_RC is not set # CONFIG_MEDIA_CEC_SUPPORT is not set # end of CEC support CONFIG_MEDIA_SUPPORT=m # CONFIG_MEDIA_SUPPORT_FILTER is not set CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y CONFIG_MEDIA_RADIO_SUPPORT=y CONFIG_MEDIA_SDR_SUPPORT=y CONFIG_MEDIA_PLATFORM_SUPPORT=y CONFIG_MEDIA_TEST_SUPPORT=y # end of Media device types # # Media core support # CONFIG_VIDEO_DEV=m CONFIG_MEDIA_CONTROLLER=y CONFIG_DVB_CORE=m # end of Media core support # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y CONFIG_VIDEO_V4L2_SUBDEV_API=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_VIDEO_TUNER=m # CONFIG_V4L2_FLASH_LED_CLASS is not set CONFIG_V4L2_FWNODE=m CONFIG_V4L2_ASYNC=m CONFIG_VIDEOBUF_GEN=m CONFIG_VIDEOBUF_DMA_SG=m CONFIG_VIDEOBUF_VMALLOC=m # end of Video4Linux options # # Media controller options # CONFIG_MEDIA_CONTROLLER_DVB=y # end of Media controller options # # Digital TV options # # CONFIG_DVB_MMAP is not set CONFIG_DVB_NET=y CONFIG_DVB_MAX_ADAPTERS=64 # CONFIG_DVB_DYNAMIC_MINORS is not set # CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set # CONFIG_DVB_ULE_DEBUG is not set # end of Digital TV options # # Media drivers # # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_USB_S2255 is not set CONFIG_VIDEO_USBTV=m CONFIG_USB_VIDEO_CLASS=m # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set # # Analog TV USB devices # # CONFIG_VIDEO_GO7007 is not set CONFIG_VIDEO_HDPVR=m CONFIG_VIDEO_PVRUSB2=m CONFIG_VIDEO_PVRUSB2_SYSFS=y CONFIG_VIDEO_PVRUSB2_DVB=y # CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set CONFIG_VIDEO_STK1160_COMMON=m CONFIG_VIDEO_STK1160=m # # Analog/digital TV USB devices # CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_AU0828_V4L2=y CONFIG_VIDEO_AU0828_RC=y CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y # CONFIG_VIDEO_CX231XX_ALSA is not set CONFIG_VIDEO_CX231XX_DVB=m # # Digital TV USB devices # CONFIG_DVB_AS102=m CONFIG_DVB_B2C2_FLEXCOP_USB=m # CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set CONFIG_DVB_USB_V2=m CONFIG_DVB_USB_AF9015=m CONFIG_DVB_USB_AF9035=m CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_AZ6007=m CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_DVBSKY=m CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_GL861=m CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m CONFIG_DVB_USB_ZD1301=m CONFIG_DVB_USB=m # CONFIG_DVB_USB_DEBUG is not set CONFIG_DVB_USB_A800=m CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_CXUSB=m # CONFIG_DVB_USB_CXUSB_ANALOG is not set CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_DIB3000MC=m CONFIG_DVB_USB_DIBUSB_MB=m CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y CONFIG_DVB_USB_DIBUSB_MC=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_DTT200U=m CONFIG_DVB_USB_DTV5100=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_GP8PSK=m CONFIG_DVB_USB_M920X=m CONFIG_DVB_USB_NOVA_T_USB2=m CONFIG_DVB_USB_OPERA1=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_TTUSB2=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_VP7045=m CONFIG_SMS_USB_DRV=m CONFIG_DVB_TTUSB_BUDGET=m CONFIG_DVB_TTUSB_DEC=m # # Webcam, TV (analog/digital) USB devices # CONFIG_VIDEO_EM28XX=m # CONFIG_VIDEO_EM28XX_V4L2 is not set # CONFIG_VIDEO_EM28XX_ALSA is not set CONFIG_VIDEO_EM28XX_DVB=m CONFIG_VIDEO_EM28XX_RC=m # # Software defined radio USB devices # # CONFIG_USB_AIRSPY is not set # CONFIG_USB_HACKRF is not set CONFIG_MEDIA_PCI_SUPPORT=y # # Media capture support # # CONFIG_VIDEO_SOLO6X10 is not set # CONFIG_VIDEO_TW5864 is not set # CONFIG_VIDEO_TW68 is not set # CONFIG_VIDEO_TW686X is not set # CONFIG_VIDEO_ZORAN is not set # # Media capture/analog TV support # # CONFIG_VIDEO_DT3155 is not set # CONFIG_VIDEO_IVTV is not set # # Media capture/analog/hybrid TV support # CONFIG_VIDEO_BT848=m CONFIG_DVB_BT8XX=m CONFIG_VIDEO_CX18=m # CONFIG_VIDEO_CX18_ALSA is not set CONFIG_VIDEO_CX23885=m CONFIG_MEDIA_ALTERA_CI=m CONFIG_VIDEO_CX25821=m # CONFIG_VIDEO_CX25821_ALSA is not set CONFIG_VIDEO_CX88=m # CONFIG_VIDEO_CX88_ALSA is not set # CONFIG_VIDEO_CX88_BLACKBIRD is not set CONFIG_VIDEO_CX88_DVB=m CONFIG_VIDEO_CX88_ENABLE_VP3054=y CONFIG_VIDEO_CX88_VP3054=m CONFIG_VIDEO_CX88_MPEG=m CONFIG_VIDEO_SAA7134=m # CONFIG_VIDEO_SAA7134_ALSA is not set CONFIG_VIDEO_SAA7134_RC=y CONFIG_VIDEO_SAA7134_DVB=m CONFIG_VIDEO_SAA7164=m # # Media digital TV PCI Adapters # CONFIG_DVB_B2C2_FLEXCOP_PCI=m # CONFIG_DVB_B2C2_FLEXCOP_PCI_DEBUG is not set CONFIG_DVB_DDBRIDGE=m # CONFIG_DVB_DDBRIDGE_MSIENABLE is not set CONFIG_DVB_DM1105=m CONFIG_MANTIS_CORE=m CONFIG_DVB_MANTIS=m CONFIG_DVB_HOPPER=m CONFIG_DVB_NGENE=m # CONFIG_DVB_PLUTO2 is not set CONFIG_DVB_PT1=m CONFIG_DVB_PT3=m CONFIG_DVB_SMIPCIE=m CONFIG_VIDEO_IPU3_CIO2=m # CONFIG_CIO2_BRIDGE is not set CONFIG_RADIO_ADAPTERS=m CONFIG_RADIO_MAXIRADIO=m CONFIG_RADIO_SAA7706H=m CONFIG_RADIO_SHARK=m CONFIG_RADIO_SHARK2=m CONFIG_RADIO_SI4713=m CONFIG_RADIO_TEA575X=m CONFIG_RADIO_TEA5764=m CONFIG_RADIO_TEF6862=m CONFIG_RADIO_WL1273=m CONFIG_USB_DSBR=m CONFIG_USB_KEENE=m CONFIG_USB_MA901=m CONFIG_USB_MR800=m CONFIG_USB_RAREMONO=m CONFIG_RADIO_SI470X=m CONFIG_USB_SI470X=m CONFIG_I2C_SI470X=m CONFIG_USB_SI4713=m CONFIG_PLATFORM_SI4713=m CONFIG_I2C_SI4713=m CONFIG_MEDIA_PLATFORM_DRIVERS=y # CONFIG_V4L_PLATFORM_DRIVERS is not set # CONFIG_SDR_PLATFORM_DRIVERS is not set # CONFIG_DVB_PLATFORM_DRIVERS is not set # CONFIG_V4L_MEM2MEM_DRIVERS is not set # # Allegro DVT media platform drivers # # # Amlogic media platform drivers # # # Amphion drivers # # # Aspeed media platform drivers # # # Atmel media platform drivers # # # Cadence media platform drivers # # CONFIG_VIDEO_CADENCE_CSI2RX is not set # CONFIG_VIDEO_CADENCE_CSI2TX is not set # # Chips&Media media platform drivers # # # Intel media platform drivers # # # Marvell media platform drivers # # # Mediatek media platform drivers # # # NVidia media platform drivers # # # NXP media platform drivers # # # Qualcomm media platform drivers # # # Renesas media platform drivers # # # Rockchip media platform drivers # # # Samsung media platform drivers # # # STMicroelectronics media platform drivers # # # Sunxi media platform drivers # # # Texas Instruments drivers # # # Verisilicon media platform drivers # # # VIA media platform drivers # # # Xilinx media platform drivers # # # MMC/SDIO DVB adapters # CONFIG_SMS_SDIO_DRV=m # CONFIG_V4L_TEST_DRIVERS is not set # CONFIG_DVB_TEST_DRIVERS is not set # # FireWire (IEEE 1394) Adapters # CONFIG_DVB_FIREDTV=m CONFIG_DVB_FIREDTV_INPUT=y CONFIG_MEDIA_COMMON_OPTIONS=y # # common driver options # CONFIG_CYPRESS_FIRMWARE=m CONFIG_TTPCI_EEPROM=m CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_SMS_SIANO_MDTV=m CONFIG_SMS_SIANO_RC=y # CONFIG_SMS_SIANO_DEBUGFS is not set CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_VMALLOC=m CONFIG_VIDEOBUF2_DMA_SG=m CONFIG_VIDEOBUF2_DVB=m # end of Media drivers # # Media ancillary drivers # CONFIG_MEDIA_ATTACH=y # # IR I2C driver auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_IR_I2C=m CONFIG_VIDEO_CAMERA_SENSOR=y # CONFIG_VIDEO_AR0521 is not set # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_HI846 is not set # CONFIG_VIDEO_HI847 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set # CONFIG_VIDEO_MT9V011 is not set # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set # CONFIG_VIDEO_OV2640 is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV2740 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5693 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV7251 is not set # CONFIG_VIDEO_OV7640 is not set # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_OV9734 is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_M5MOLS is not set # # Lens drivers # # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # Audio decoders, processors and mixers # CONFIG_VIDEO_CS3308=m CONFIG_VIDEO_CS5345=m CONFIG_VIDEO_CS53L32A=m CONFIG_VIDEO_MSP3400=m # CONFIG_VIDEO_SONY_BTF_MPX is not set # CONFIG_VIDEO_TDA1997X is not set CONFIG_VIDEO_TDA7432=m # CONFIG_VIDEO_TDA9840 is not set # CONFIG_VIDEO_TEA6415C is not set # CONFIG_VIDEO_TEA6420 is not set # CONFIG_VIDEO_TLV320AIC23B is not set CONFIG_VIDEO_TVAUDIO=m # CONFIG_VIDEO_UDA1342 is not set # CONFIG_VIDEO_VP27SMPX is not set # CONFIG_VIDEO_WM8739 is not set CONFIG_VIDEO_WM8775=m # end of Audio decoders, processors and mixers # # RDS decoders # CONFIG_VIDEO_SAA6588=m # end of RDS decoders # # Video decoders # CONFIG_VIDEO_ADV7180=m # CONFIG_VIDEO_ADV7183 is not set # CONFIG_VIDEO_ADV7604 is not set # CONFIG_VIDEO_ADV7842 is not set # CONFIG_VIDEO_BT819 is not set # CONFIG_VIDEO_BT856 is not set # CONFIG_VIDEO_BT866 is not set # CONFIG_VIDEO_KS0127 is not set # CONFIG_VIDEO_ML86V7667 is not set # CONFIG_VIDEO_SAA7110 is not set CONFIG_VIDEO_SAA711X=m # CONFIG_VIDEO_TC358743 is not set # CONFIG_VIDEO_TVP514X is not set # CONFIG_VIDEO_TVP5150 is not set # CONFIG_VIDEO_TVP7002 is not set # CONFIG_VIDEO_TW2804 is not set # CONFIG_VIDEO_TW9903 is not set # CONFIG_VIDEO_TW9906 is not set # CONFIG_VIDEO_TW9910 is not set # CONFIG_VIDEO_VPX3220 is not set # # Video and audio decoders # # CONFIG_VIDEO_SAA717X is not set CONFIG_VIDEO_CX25840=m # end of Video decoders # # Video encoders # # CONFIG_VIDEO_AD9389B is not set # CONFIG_VIDEO_ADV7170 is not set # CONFIG_VIDEO_ADV7175 is not set # CONFIG_VIDEO_ADV7343 is not set # CONFIG_VIDEO_ADV7393 is not set # CONFIG_VIDEO_ADV7511 is not set # CONFIG_VIDEO_AK881X is not set # CONFIG_VIDEO_SAA7127 is not set # CONFIG_VIDEO_SAA7185 is not set # CONFIG_VIDEO_THS8200 is not set # end of Video encoders # # Video improvement chips # # CONFIG_VIDEO_UPD64031A is not set # CONFIG_VIDEO_UPD64083 is not set # end of Video improvement chips # # Audio/Video compression chips # CONFIG_VIDEO_SAA6752HS=m # end of Audio/Video compression chips # # SDR tuner chips # CONFIG_SDR_MAX2175=m # end of SDR tuner chips # # Miscellaneous helper chips # # CONFIG_VIDEO_I2C is not set # CONFIG_VIDEO_M52790 is not set # CONFIG_VIDEO_ST_MIPID02 is not set # CONFIG_VIDEO_THS7303 is not set # end of Miscellaneous helper chips CONFIG_MEDIA_TUNER=m # # Customize TV tuners # CONFIG_MEDIA_TUNER_E4000=m CONFIG_MEDIA_TUNER_FC0011=m CONFIG_MEDIA_TUNER_FC0012=m CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_FC2580=m CONFIG_MEDIA_TUNER_IT913X=m CONFIG_MEDIA_TUNER_M88RS6000T=m CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_MC44S803=m CONFIG_MEDIA_TUNER_MT2060=m CONFIG_MEDIA_TUNER_MT2063=m CONFIG_MEDIA_TUNER_MT20XX=m CONFIG_MEDIA_TUNER_MT2131=m CONFIG_MEDIA_TUNER_MT2266=m CONFIG_MEDIA_TUNER_MXL301RF=m CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m CONFIG_MEDIA_TUNER_QM1D1B0004=m CONFIG_MEDIA_TUNER_QM1D1C0042=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_R820T=m CONFIG_MEDIA_TUNER_SI2157=m CONFIG_MEDIA_TUNER_SIMPLE=m CONFIG_MEDIA_TUNER_TDA18212=m CONFIG_MEDIA_TUNER_TDA18218=m CONFIG_MEDIA_TUNER_TDA18250=m CONFIG_MEDIA_TUNER_TDA18271=m CONFIG_MEDIA_TUNER_TDA827X=m CONFIG_MEDIA_TUNER_TDA8290=m CONFIG_MEDIA_TUNER_TDA9887=m CONFIG_MEDIA_TUNER_TEA5761=m CONFIG_MEDIA_TUNER_TEA5767=m CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_MEDIA_TUNER_XC2028=m CONFIG_MEDIA_TUNER_XC4000=m CONFIG_MEDIA_TUNER_XC5000=m # end of Customize TV tuners # # Customise DVB Frontends # # # Multistandard (satellite) frontends # CONFIG_DVB_M88DS3103=m CONFIG_DVB_MXL5XX=m CONFIG_DVB_STB0899=m CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m CONFIG_DVB_STV0910=m CONFIG_DVB_STV6110x=m CONFIG_DVB_STV6111=m # # Multistandard (cable + terrestrial) frontends # CONFIG_DVB_DRXK=m CONFIG_DVB_MN88472=m CONFIG_DVB_MN88473=m CONFIG_DVB_SI2165=m CONFIG_DVB_TDA18271C2DD=m # # DVB-S (satellite) frontends # CONFIG_DVB_CX24110=m CONFIG_DVB_CX24116=m CONFIG_DVB_CX24117=m CONFIG_DVB_CX24120=m CONFIG_DVB_CX24123=m CONFIG_DVB_DS3000=m CONFIG_DVB_MB86A16=m CONFIG_DVB_MT312=m CONFIG_DVB_S5H1420=m CONFIG_DVB_SI21XX=m CONFIG_DVB_STB6000=m CONFIG_DVB_STV0288=m CONFIG_DVB_STV0299=m CONFIG_DVB_STV0900=m CONFIG_DVB_STV6110=m CONFIG_DVB_TDA10071=m CONFIG_DVB_TDA10086=m CONFIG_DVB_TDA8083=m CONFIG_DVB_TDA8261=m CONFIG_DVB_TDA826X=m CONFIG_DVB_TS2020=m CONFIG_DVB_TUA6100=m CONFIG_DVB_TUNER_CX24113=m CONFIG_DVB_TUNER_ITD1000=m CONFIG_DVB_VES1X93=m CONFIG_DVB_ZL10036=m CONFIG_DVB_ZL10039=m # # DVB-T (terrestrial) frontends # CONFIG_DVB_AF9013=m CONFIG_DVB_AS102_FE=m CONFIG_DVB_CX22700=m CONFIG_DVB_CX22702=m CONFIG_DVB_CXD2820R=m CONFIG_DVB_CXD2841ER=m CONFIG_DVB_DIB3000MB=m CONFIG_DVB_DIB3000MC=m CONFIG_DVB_DIB7000M=m CONFIG_DVB_DIB7000P=m # CONFIG_DVB_DIB9000 is not set CONFIG_DVB_DRXD=m CONFIG_DVB_EC100=m CONFIG_DVB_GP8PSK_FE=m CONFIG_DVB_L64781=m CONFIG_DVB_MT352=m CONFIG_DVB_NXT6000=m CONFIG_DVB_RTL2830=m CONFIG_DVB_RTL2832=m CONFIG_DVB_RTL2832_SDR=m # CONFIG_DVB_S5H1432 is not set CONFIG_DVB_SI2168=m CONFIG_DVB_SP887X=m CONFIG_DVB_STV0367=m CONFIG_DVB_TDA10048=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_ZD1301_DEMOD=m CONFIG_DVB_ZL10353=m # # DVB-C (cable) frontends # CONFIG_DVB_STV0297=m CONFIG_DVB_TDA10021=m CONFIG_DVB_TDA10023=m CONFIG_DVB_VES1820=m # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # CONFIG_DVB_AU8522=m CONFIG_DVB_AU8522_DTV=m CONFIG_DVB_AU8522_V4L=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LG2160=m CONFIG_DVB_LGDT3305=m CONFIG_DVB_LGDT3306A=m CONFIG_DVB_LGDT330X=m CONFIG_DVB_MXL692=m CONFIG_DVB_NXT200X=m CONFIG_DVB_OR51132=m CONFIG_DVB_OR51211=m CONFIG_DVB_S5H1409=m CONFIG_DVB_S5H1411=m # # ISDB-T (terrestrial) frontends # CONFIG_DVB_DIB8000=m CONFIG_DVB_MB86A20S=m CONFIG_DVB_S921=m # # ISDB-S (satellite) & ISDB-T (terrestrial) frontends # # CONFIG_DVB_MN88443X is not set CONFIG_DVB_TC90522=m # # Digital terrestrial only tuners/PLL # CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m CONFIG_DVB_TUNER_DIB0090=m # # SEC control devices for DVB-S # CONFIG_DVB_A8293=m CONFIG_DVB_AF9033=m # CONFIG_DVB_ASCOT2E is not set CONFIG_DVB_ATBM8830=m # CONFIG_DVB_HELENE is not set # CONFIG_DVB_HORUS3A is not set CONFIG_DVB_ISL6405=m CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m CONFIG_DVB_IX2505V=m # CONFIG_DVB_LGS8GL5 is not set CONFIG_DVB_LGS8GXX=m CONFIG_DVB_LNBH25=m # CONFIG_DVB_LNBH29 is not set CONFIG_DVB_LNBP21=m CONFIG_DVB_LNBP22=m CONFIG_DVB_M88RS2000=m CONFIG_DVB_TDA665x=m CONFIG_DVB_DRX39XYJ=m # # Common Interface (EN50221) controller drivers # CONFIG_DVB_CXD2099=m CONFIG_DVB_SP2=m # end of Customise DVB Frontends # # Tools to develop new frontends # CONFIG_DVB_DUMMY_FE=m # end of Media ancillary drivers # # Graphics support # CONFIG_APERTURE_HELPERS=y CONFIG_AGP=y # CONFIG_AGP_AMD64 is not set CONFIG_AGP_INTEL=y # CONFIG_AGP_SIS is not set CONFIG_AGP_VIA=y CONFIG_INTEL_GTT=y CONFIG_VGA_SWITCHEROO=y CONFIG_DRM=y CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DEBUG_MM is not set CONFIG_DRM_KMS_HELPER=y # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set # CONFIG_DRM_DEBUG_MODESET_LOCK is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_DISPLAY_DP_HELPER=y CONFIG_DRM_DISPLAY_HDCP_HELPER=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y CONFIG_DRM_DP_AUX_CHARDEV=y CONFIG_DRM_DP_CEC=y CONFIG_DRM_TTM=y CONFIG_DRM_BUDDY=y CONFIG_DRM_TTM_HELPER=y CONFIG_DRM_GEM_SHMEM_HELPER=y CONFIG_DRM_SCHED=y # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # end of I2C encoder or helper chips # # ARM devices # # end of ARM devices CONFIG_DRM_RADEON=y # CONFIG_DRM_RADEON_USERPTR is not set CONFIG_DRM_AMDGPU=y CONFIG_DRM_AMDGPU_SI=y CONFIG_DRM_AMDGPU_CIK=y CONFIG_DRM_AMDGPU_USERPTR=y # # ACP (Audio CoProcessor) Configuration # CONFIG_DRM_AMD_ACP=y # end of ACP (Audio CoProcessor) Configuration # # Display Engine Configuration # CONFIG_DRM_AMD_DC=y CONFIG_DRM_AMD_DC_DCN=y # CONFIG_DRM_AMD_DC_HDCP is not set # CONFIG_DRM_AMD_DC_SI is not set # CONFIG_DRM_AMD_SECURE_DISPLAY is not set # end of Display Engine Configuration CONFIG_HSA_AMD=y # CONFIG_DRM_NOUVEAU is not set CONFIG_DRM_I915=y CONFIG_DRM_I915_FORCE_PROBE="" CONFIG_DRM_I915_CAPTURE_ERROR=y CONFIG_DRM_I915_COMPRESS_ERROR=y CONFIG_DRM_I915_USERPTR=y # # drm/i915 Debugging # # CONFIG_DRM_I915_WERROR is not set # CONFIG_DRM_I915_DEBUG is not set # CONFIG_DRM_I915_DEBUG_MMIO is not set # CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set # CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set # CONFIG_DRM_I915_DEBUG_GUC is not set # CONFIG_DRM_I915_SELFTEST is not set # CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS is not set # CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set # CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set # end of drm/i915 Debugging # # drm/i915 Profile Guided Optimisation # CONFIG_DRM_I915_REQUEST_TIMEOUT=20000 CONFIG_DRM_I915_FENCE_TIMEOUT=10000 CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 CONFIG_DRM_I915_STOP_TIMEOUT=100 CONFIG_DRM_I915_TIMESLICE_DURATION=1 # end of drm/i915 Profile Guided Optimisation # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set CONFIG_DRM_VMWGFX=y CONFIG_DRM_VMWGFX_FBCON=y # CONFIG_DRM_VMWGFX_MKSSTATS is not set # CONFIG_DRM_GMA500 is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_AST is not set # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_QXL is not set CONFIG_DRM_VIRTIO_GPU=y CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_ANALOGIX_ANX78XX is not set # end of Display Interface Bridges # CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_BOCHS is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_DRM_VBOXVIDEO is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_DRM_NOMODESET=y # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ARC is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_VGA16 is not set # CONFIG_FB_UVESA is not set # CONFIG_FB_VESA is not set CONFIG_FB_EFI=y # CONFIG_FB_N411 is not set # CONFIG_FB_HGA is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_I740 is not set # CONFIG_FB_LE80578 is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_S3 is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_VIA is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VT8623 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_ARK is not set # CONFIG_FB_PM3 is not set # CONFIG_FB_CARMINE is not set # CONFIG_FB_SMSCUFX is not set CONFIG_FB_UDL=m # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # CONFIG_FB_SM712 is not set # end of Frame buffer Devices # # Backlight & LCD device support # # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_KTD253 is not set # CONFIG_BACKLIGHT_APPLE is not set # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_SAHARA is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # end of Backlight & LCD device support CONFIG_HDMI=y # # Console display driver support # CONFIG_VGA_CONSOLE=y CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support # CONFIG_LOGO is not set # end of Graphics support CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_COMPRESS_OFFLOAD=y CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y CONFIG_SND_HRTIMER=y CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 # CONFIG_SND_SUPPORT_OLD_API is not set CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_CTL_INPUT_VALIDATION is not set CONFIG_SND_VMASTER=y CONFIG_SND_DMA_SGBUF=y CONFIG_SND_CTL_LED=m # CONFIG_SND_SEQUENCER is not set CONFIG_SND_MPU401_UART=m CONFIG_SND_OPL3_LIB=m CONFIG_SND_AC97_CODEC=m CONFIG_SND_DRIVERS=y # CONFIG_SND_DUMMY is not set # CONFIG_SND_ALOOP is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_MPU401 is not set # CONFIG_SND_AC97_POWER_SAVE is not set CONFIG_SND_PCI=y # CONFIG_SND_AD1889 is not set # CONFIG_SND_ALS300 is not set # CONFIG_SND_ALS4000 is not set # CONFIG_SND_ALI5451 is not set # CONFIG_SND_ASIHPI is not set CONFIG_SND_ATIIXP=m # CONFIG_SND_ATIIXP_MODEM is not set # CONFIG_SND_AU8810 is not set # CONFIG_SND_AU8820 is not set # CONFIG_SND_AU8830 is not set # CONFIG_SND_AW2 is not set # CONFIG_SND_AZT3328 is not set # CONFIG_SND_BT87X is not set CONFIG_SND_CA0106=m CONFIG_SND_CMIPCI=m CONFIG_SND_OXYGEN_LIB=m CONFIG_SND_OXYGEN=m # CONFIG_SND_CS4281 is not set # CONFIG_SND_CS46XX is not set CONFIG_SND_CTXFI=m # CONFIG_SND_DARLA20 is not set # CONFIG_SND_GINA20 is not set # CONFIG_SND_LAYLA20 is not set # CONFIG_SND_DARLA24 is not set # CONFIG_SND_GINA24 is not set CONFIG_SND_LAYLA24=m # CONFIG_SND_MONA is not set # CONFIG_SND_MIA is not set # CONFIG_SND_ECHO3G is not set # CONFIG_SND_INDIGO is not set # CONFIG_SND_INDIGOIO is not set # CONFIG_SND_INDIGODJ is not set # CONFIG_SND_INDIGOIOX is not set # CONFIG_SND_INDIGODJX is not set CONFIG_SND_EMU10K1=m CONFIG_SND_EMU10K1X=m # CONFIG_SND_ENS1370 is not set # CONFIG_SND_ENS1371 is not set # CONFIG_SND_ES1938 is not set # CONFIG_SND_ES1968 is not set # CONFIG_SND_FM801 is not set # CONFIG_SND_HDSP is not set # CONFIG_SND_HDSPM is not set CONFIG_SND_ICE1712=m CONFIG_SND_ICE1724=m CONFIG_SND_INTEL8X0=m # CONFIG_SND_INTEL8X0M is not set # CONFIG_SND_KORG1212 is not set # CONFIG_SND_LOLA is not set # CONFIG_SND_LX6464ES is not set # CONFIG_SND_MAESTRO3 is not set # CONFIG_SND_MIXART is not set # CONFIG_SND_NM256 is not set # CONFIG_SND_PCXHR is not set # CONFIG_SND_RIPTIDE is not set # CONFIG_SND_RME32 is not set # CONFIG_SND_RME96 is not set CONFIG_SND_RME9652=m # CONFIG_SND_SONICVIBES is not set # CONFIG_SND_TRIDENT is not set CONFIG_SND_VIA82XX=m # CONFIG_SND_VIA82XX_MODEM is not set CONFIG_SND_VIRTUOSO=m # CONFIG_SND_VX222 is not set # CONFIG_SND_YMFPCI is not set # # HD-Audio # CONFIG_SND_HDA=m CONFIG_SND_HDA_GENERIC_LEDS=y CONFIG_SND_HDA_INTEL=m CONFIG_SND_HDA_HWDEP=y CONFIG_SND_HDA_RECONFIG=y CONFIG_SND_HDA_INPUT_BEEP=y CONFIG_SND_HDA_INPUT_BEEP_MODE=1 CONFIG_SND_HDA_PATCH_LOADER=y # CONFIG_SND_HDA_SCODEC_CS35L41_I2C is not set CONFIG_SND_HDA_CODEC_REALTEK=m CONFIG_SND_HDA_CODEC_ANALOG=m CONFIG_SND_HDA_CODEC_SIGMATEL=m CONFIG_SND_HDA_CODEC_VIA=m CONFIG_SND_HDA_CODEC_HDMI=m CONFIG_SND_HDA_CODEC_CIRRUS=m # CONFIG_SND_HDA_CODEC_CS8409 is not set CONFIG_SND_HDA_CODEC_CONEXANT=m CONFIG_SND_HDA_CODEC_CA0110=m CONFIG_SND_HDA_CODEC_CA0132=m CONFIG_SND_HDA_CODEC_CA0132_DSP=y CONFIG_SND_HDA_CODEC_CMEDIA=m CONFIG_SND_HDA_CODEC_SI3054=m CONFIG_SND_HDA_GENERIC=m CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0 # CONFIG_SND_HDA_INTEL_HDMI_SILENT_STREAM is not set # CONFIG_SND_HDA_CTL_DEV_ID is not set # end of HD-Audio CONFIG_SND_HDA_CORE=m CONFIG_SND_HDA_DSP_LOADER=y CONFIG_SND_HDA_COMPONENT=y CONFIG_SND_HDA_I915=y CONFIG_SND_HDA_EXT_CORE=m CONFIG_SND_HDA_PREALLOC_SIZE=0 CONFIG_SND_INTEL_NHLT=y CONFIG_SND_INTEL_DSP_CONFIG=m CONFIG_SND_INTEL_SOUNDWIRE_ACPI=m CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=m CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y CONFIG_SND_USB_UA101=m CONFIG_SND_USB_USX2Y=m CONFIG_SND_USB_CAIAQ=m CONFIG_SND_USB_CAIAQ_INPUT=y CONFIG_SND_USB_US122L=m CONFIG_SND_USB_6FIRE=m CONFIG_SND_USB_HIFACE=m CONFIG_SND_BCD2000=m CONFIG_SND_USB_LINE6=m CONFIG_SND_USB_POD=m CONFIG_SND_USB_PODHD=m CONFIG_SND_USB_TONEPORT=m CONFIG_SND_USB_VARIAX=m CONFIG_SND_FIREWIRE=y # CONFIG_SND_DICE is not set # CONFIG_SND_OXFW is not set # CONFIG_SND_ISIGHT is not set # CONFIG_SND_FIREWORKS is not set # CONFIG_SND_BEBOB is not set # CONFIG_SND_FIREWIRE_DIGI00X is not set # CONFIG_SND_FIREWIRE_TASCAM is not set # CONFIG_SND_FIREWIRE_MOTU is not set # CONFIG_SND_FIREFACE is not set CONFIG_SND_SOC=y CONFIG_SND_SOC_COMPRESS=y CONFIG_SND_SOC_TOPOLOGY=y CONFIG_SND_SOC_ACPI=m # CONFIG_SND_SOC_ADI is not set CONFIG_SND_SOC_AMD_ACP=m CONFIG_SND_SOC_AMD_CZ_DA7219MX98357_MACH=m CONFIG_SND_SOC_AMD_CZ_RT5645_MACH=m # CONFIG_SND_SOC_AMD_ST_ES8336_MACH is not set CONFIG_SND_SOC_AMD_ACP3x=m CONFIG_SND_SOC_AMD_RENOIR=m CONFIG_SND_SOC_AMD_RENOIR_MACH=m # CONFIG_SND_SOC_AMD_ACP5x is not set # CONFIG_SND_SOC_AMD_ACP6x is not set CONFIG_SND_AMD_ACP_CONFIG=m # CONFIG_SND_SOC_AMD_ACP_COMMON is not set # CONFIG_SND_SOC_AMD_RPL_ACP6x is not set # CONFIG_SND_SOC_AMD_PS is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # CONFIG_SND_SOC_FSL_AUDMIX is not set # 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_FSL_XCVR is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # end of SoC Audio for Freescale CPUs # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y CONFIG_SND_SOC_INTEL_SST=m # CONFIG_SND_SOC_INTEL_CATPT is not set CONFIG_SND_SST_ATOM_HIFI2_PLATFORM=m CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_PCI=m CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI=m CONFIG_SND_SOC_INTEL_SKYLAKE=m CONFIG_SND_SOC_INTEL_SKL=m CONFIG_SND_SOC_INTEL_APL=m CONFIG_SND_SOC_INTEL_KBL=m CONFIG_SND_SOC_INTEL_GLK=m CONFIG_SND_SOC_INTEL_CNL=m CONFIG_SND_SOC_INTEL_CFL=m CONFIG_SND_SOC_INTEL_CML_H=m CONFIG_SND_SOC_INTEL_CML_LP=m CONFIG_SND_SOC_INTEL_SKYLAKE_FAMILY=m CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC=y CONFIG_SND_SOC_INTEL_SKYLAKE_COMMON=m CONFIG_SND_SOC_ACPI_INTEL_MATCH=m CONFIG_SND_SOC_INTEL_AVS=m # # Intel AVS Machine drivers # # # Available DSP configurations # # CONFIG_SND_SOC_INTEL_AVS_MACH_DA7219 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_DMIC is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_HDAUDIO is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_I2S_TEST is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_MAX98357A is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_MAX98373 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_NAU8825 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_RT274 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_RT286 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_RT298 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_RT5682 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_SSM4567 is not set # end of Intel AVS Machine drivers CONFIG_SND_SOC_INTEL_MACH=y # CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set CONFIG_SND_SOC_INTEL_HDA_DSP_COMMON=m CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH=m CONFIG_SND_SOC_INTEL_BYTCR_RT5651_MACH=m CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH=m CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH=m CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH=m CONFIG_SND_SOC_INTEL_CHT_BSW_NAU8824_MACH=m CONFIG_SND_SOC_INTEL_BYT_CHT_CX2072X_MACH=m CONFIG_SND_SOC_INTEL_BYT_CHT_DA7213_MACH=m CONFIG_SND_SOC_INTEL_BYT_CHT_ES8316_MACH=m CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH=m # CONFIG_SND_SOC_INTEL_SKL_RT286_MACH is not set # CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH is not set # CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH is not set # CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH is not set # CONFIG_SND_SOC_INTEL_BXT_RT298_MACH is not set # CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH is not set # CONFIG_SND_SOC_INTEL_KBL_DA7219_MAX98357A_MACH is not set # CONFIG_SND_SOC_INTEL_KBL_DA7219_MAX98927_MACH is not set # CONFIG_SND_SOC_INTEL_KBL_RT5660_MACH is not set CONFIG_SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH=m # CONFIG_SND_SOC_MTK_BTCVSD is not set # CONFIG_SND_SOC_SOF_TOPLEVEL is not set # # STMicroelectronics STM32 SOC audio support # # end of 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_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU1761_I2C is not set CONFIG_SND_SOC_ADAU7002=m # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4375 is not set # CONFIG_SND_SOC_AK4458 is not set # CONFIG_SND_SOC_AK4554 is not set # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # 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_CS35L41_I2C is not set # CONFIG_SND_SOC_CS35L45_I2C 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS42L83 is not set # CONFIG_SND_SOC_CS4234 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # 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_CX2072X=m CONFIG_SND_SOC_DA7213=m CONFIG_SND_SOC_DA7219=m CONFIG_SND_SOC_DMIC=m # CONFIG_SND_SOC_ES7134 is not set # CONFIG_SND_SOC_ES7241 is not set CONFIG_SND_SOC_ES8316=m # CONFIG_SND_SOC_ES8326 is not set # CONFIG_SND_SOC_ES8328_I2C is not set # CONFIG_SND_SOC_GTM601 is not set CONFIG_SND_SOC_HDAC_HDMI=m CONFIG_SND_SOC_HDAC_HDA=m CONFIG_SND_SOC_HDA=m # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set # CONFIG_SND_SOC_MAX98088 is not set CONFIG_SND_SOC_MAX98090=m CONFIG_SND_SOC_MAX98357A=m # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set CONFIG_SND_SOC_MAX98927=m # CONFIG_SND_SOC_MAX98520 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX98396 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM186X_I2C is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM5102A 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 CONFIG_SND_SOC_RT5640=m CONFIG_SND_SOC_RT5645=m CONFIG_SND_SOC_RT5651=m # CONFIG_SND_SOC_RT5659 is not set CONFIG_SND_SOC_RT5670=m CONFIG_SND_SOC_RT5682=m CONFIG_SND_SOC_RT5682_I2C=m # CONFIG_SND_SOC_RT9120 is not set # CONFIG_SND_SOC_SGTL5000 is not set # CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set # CONFIG_SND_SOC_SIMPLE_MUX is not set CONFIG_SND_SOC_SPDIF=m # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS2780 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805M is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320ADC3XXX is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set # CONFIG_SND_SOC_TLV320AIC3X_I2C is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set CONFIG_SND_SOC_TS3A227E=m # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731_I2C is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8776 is not set # 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_WM8940 is not set # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 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_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8821 is not set # CONFIG_SND_SOC_NAU8822 is not set CONFIG_SND_SOC_NAU8824=m # CONFIG_SND_SOC_TPA6130A2 is not set # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set # end of CODEC drivers CONFIG_SND_SIMPLE_CARD_UTILS=m CONFIG_SND_SIMPLE_CARD=m CONFIG_SND_X86=y CONFIG_HDMI_LPE_AUDIO=m # CONFIG_SND_VIRTIO is not set CONFIG_AC97_BUS=m # # HID support # CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y CONFIG_HID_APPLEIR=m CONFIG_HID_ASUS=y CONFIG_HID_AUREAL=y CONFIG_HID_BELKIN=y # CONFIG_HID_BETOP_FF is not set CONFIG_HID_BIGBEN_FF=m CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CREATIVE_SB0540 is not set CONFIG_HID_CYPRESS=y CONFIG_HID_DRAGONRISE=m CONFIG_DRAGONRISE_FF=y # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_FT260 is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_GLORIOUS is not set # CONFIG_HID_HOLTEK is not set # CONFIG_HID_VIVALDI is not set # CONFIG_HID_GT683R is not set # CONFIG_HID_KEYTOUCH is not set CONFIG_HID_KYE=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set # CONFIG_HID_VRC2 is not set # CONFIG_HID_XIAOMI is not set CONFIG_HID_GYRATION=y # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set # CONFIG_HID_JABRA is not set CONFIG_HID_TWINHAN=y CONFIG_HID_KENSINGTON=y CONFIG_HID_LCPOWER=y # CONFIG_HID_LED is not set CONFIG_HID_LENOVO=y # CONFIG_HID_LETSKETCH is not set CONFIG_HID_LOGITECH=y CONFIG_HID_LOGITECH_DJ=y CONFIG_HID_LOGITECH_HIDPP=y CONFIG_LOGITECH_FF=y 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_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=m CONFIG_HID_NINTENDO=m CONFIG_NINTENDO_FF=y # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set CONFIG_HID_ORTEK=y CONFIG_HID_OUYA=y CONFIG_HID_PANTHERLORD=y CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=y CONFIG_HID_PETALYNX=y # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PXRC is not set # CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set CONFIG_HID_SAMSUNG=y # CONFIG_HID_SEMITEK is not set # CONFIG_HID_SIGMAMICRO is not set CONFIG_HID_SONY=y CONFIG_SONY_FF=y # CONFIG_HID_SPEEDLINK is not set CONFIG_HID_STEAM=m # CONFIG_HID_STEELSERIES is not set CONFIG_HID_SUNPLUS=y CONFIG_HID_RMI=y # CONFIG_HID_GREENASIA is not set CONFIG_HID_SMARTJOYPLUS=m CONFIG_SMARTJOYPLUS_FF=y CONFIG_HID_TIVO=y CONFIG_HID_TOPSEED=y # CONFIG_HID_TOPRE is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set CONFIG_HID_WIIMOTE=m CONFIG_HID_XINMO=y # CONFIG_HID_ZEROPLUS is not set CONFIG_HID_ZYDACRON=y # CONFIG_HID_SENSOR_HUB is not set CONFIG_HID_ALPS=m # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # end of USB HID support # # I2C HID support # CONFIG_I2C_HID_ACPI=y # end of I2C HID support CONFIG_I2C_HID_CORE=y # # Intel ISH HID support # # CONFIG_INTEL_ISH_HID is not set # end of Intel ISH HID support # # AMD SFH HID Support # # CONFIG_AMD_SFH_HID is not set # end of AMD SFH HID Support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y # CONFIG_USB_LED_TRIG is not set # CONFIG_USB_ULPI_BUS is not set # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_PCI=y # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_OTG is not set # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set # CONFIG_USB_LEDS_TRIGGER_USBPORT is not set CONFIG_USB_AUTOSUSPEND_DELAY=2 CONFIG_USB_MON=m # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y # CONFIG_USB_XHCI_DBGCAP is not set CONFIG_USB_XHCI_PCI=y CONFIG_USB_XHCI_PCI_RENESAS=y # CONFIG_USB_XHCI_PLATFORM is not set 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 # CONFIG_USB_FOTG210_HCD is not set CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD_PCI=y # CONFIG_USB_OHCI_HCD_SSB is not set # CONFIG_USB_OHCI_HCD_PLATFORM is not set CONFIG_USB_UHCI_HCD=y # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_BCMA is not set # CONFIG_USB_HCD_SSB is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=m # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set CONFIG_USB_UAS=y # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set # CONFIG_USB_CHIPIDEA is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # CONFIG_USB_SERIAL=m # CONFIG_USB_SERIAL_GENERIC is not set # CONFIG_USB_SERIAL_SIMPLE is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set CONFIG_USB_SERIAL_CH341=m # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set CONFIG_USB_SERIAL_CP210X=m # CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_EMPEG is not set CONFIG_USB_SERIAL_FTDI_SIO=m # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_F81232 is not set # CONFIG_USB_SERIAL_F8153X is not set # CONFIG_USB_SERIAL_GARMIN is not set # CONFIG_USB_SERIAL_IPW is not set CONFIG_USB_SERIAL_IUU=m # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set # CONFIG_USB_SERIAL_KEYSPAN is not set # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_METRO is not set # CONFIG_USB_SERIAL_MOS7720 is not set # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MXUPORT is not set # CONFIG_USB_SERIAL_NAVMAN is not set CONFIG_USB_SERIAL_PL2303=m # CONFIG_USB_SERIAL_OTI6858 is not set # CONFIG_USB_SERIAL_QCAUX is not set # CONFIG_USB_SERIAL_QUALCOMM is not set # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SAFE is not set # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_OPTION is not set # CONFIG_USB_SERIAL_OMNINET is not set # CONFIG_USB_SERIAL_OPTICON is not set # CONFIG_USB_SERIAL_XSENS_MT is not set # CONFIG_USB_SERIAL_WISHBONE is not set # CONFIG_USB_SERIAL_SSU100 is not set # CONFIG_USB_SERIAL_QT2 is not set # CONFIG_USB_SERIAL_UPD78F0730 is not set # CONFIG_USB_SERIAL_XR is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HUB_USB251XB is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # # USB Physical Layer drivers # # CONFIG_NOP_USB_XCEIV is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set # end of USB Physical Layer drivers # CONFIG_USB_GADGET is not set CONFIG_TYPEC=m # CONFIG_TYPEC_TCPM is not set # CONFIG_TYPEC_UCSI is not set # CONFIG_TYPEC_TPS6598X is not set # CONFIG_TYPEC_RT1719 is not set # CONFIG_TYPEC_STUSB160X is not set # CONFIG_TYPEC_WUSB3801 is not set # # USB Type-C Multiplexer/DeMultiplexer Switch support # # CONFIG_TYPEC_MUX_FSA4480 is not set # CONFIG_TYPEC_MUX_PI3USB30532 is not set # end of USB Type-C Multiplexer/DeMultiplexer Switch support # # USB Type-C Alternate Mode drivers # # CONFIG_TYPEC_DP_ALTMODE is not set # end of USB Type-C Alternate Mode drivers # CONFIG_USB_ROLE_SWITCH is not set CONFIG_MMC=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_DEBUG is not set CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_IO_ACCESSORS=y CONFIG_MMC_SDHCI_PCI=y # CONFIG_MMC_RICOH_MMC is not set CONFIG_MMC_SDHCI_ACPI=y CONFIG_MMC_SDHCI_PLTFM=y # CONFIG_MMC_SDHCI_F_SDH30 is not set # CONFIG_MMC_WBSD is not set # CONFIG_MMC_TIFM_SD is not set # CONFIG_MMC_CB710 is not set # CONFIG_MMC_VIA_SDMMC is not set # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_REALTEK_PCI=y CONFIG_MMC_REALTEK_USB=y CONFIG_MMC_CQHCI=y CONFIG_MMC_HSQ=y CONFIG_MMC_TOSHIBA_PCI=y # CONFIG_MMC_MTK is not set # CONFIG_MMC_SDHCI_XENON is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y CONFIG_LEDS_CLASS_FLASH=y # CONFIG_LEDS_CLASS_MULTICOLOR is not set # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_APU is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_PCA9532 is not set # CONFIG_LEDS_GPIO is not set # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP50XX is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_INTEL_SS4200 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_MLXCPLD is not set # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_NIC78BX is not set # CONFIG_LEDS_TI_LMU_COMMON is not set # # Flash and Torch LED drivers # # CONFIG_LEDS_AS3645A is not set # CONFIG_LEDS_LM3601X is not set # CONFIG_LEDS_RT8515 is not set # CONFIG_LEDS_SGM3140 is not set # # RGB LED drivers # # # LED Triggers # CONFIG_LEDS_TRIGGERS=y # CONFIG_LEDS_TRIGGER_TIMER is not set # CONFIG_LEDS_TRIGGER_ONESHOT is not set # CONFIG_LEDS_TRIGGER_DISK is not set # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set # CONFIG_LEDS_TRIGGER_CPU is not set # CONFIG_LEDS_TRIGGER_ACTIVITY is not set # CONFIG_LEDS_TRIGGER_GPIO is not set # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set # CONFIG_LEDS_TRIGGER_PANIC is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set CONFIG_LEDS_TRIGGER_AUDIO=m # CONFIG_LEDS_TRIGGER_TTY is not set # # Simple LED drivers # # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_ATOMIC_SCRUB=y CONFIG_EDAC_SUPPORT=y # CONFIG_EDAC is not set CONFIG_RTC_LIB=y CONFIG_RTC_MC146818_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # 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 # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # 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_RV3032 is not set # CONFIG_RTC_DRV_RV8803 is not set # CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # CONFIG_RTC_DRV_CMOS=y # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_FTRTC010 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_VIRTUAL_CHANNELS=y CONFIG_DMA_ACPI=y # CONFIG_ALTERA_MSGDMA is not set CONFIG_INTEL_IDMA64=m # CONFIG_INTEL_IDXD is not set # CONFIG_INTEL_IDXD_COMPAT is not set CONFIG_INTEL_IOATDMA=m # CONFIG_PLX_DMA is not set # CONFIG_AMD_PTDMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set CONFIG_DW_DMAC_CORE=m CONFIG_DW_DMAC=m CONFIG_DW_DMAC_PCI=m # CONFIG_DW_EDMA is not set # CONFIG_DW_EDMA_PCIE is not set CONFIG_HSU_DMA=y # CONFIG_SF_PDMA is not set # CONFIG_INTEL_LDMA is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set CONFIG_DMA_ENGINE_RAID=y # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set CONFIG_DMABUF_HEAPS=y # CONFIG_DMABUF_SYSFS_STATS is not set CONFIG_DMABUF_HEAPS_SYSTEM=y CONFIG_DMABUF_HEAPS_CMA=y # end of DMABUF options CONFIG_DCA=m # CONFIG_AUXDISPLAY is not set CONFIG_UIO=y # CONFIG_UIO_CIF is not set # CONFIG_UIO_PDRV_GENIRQ is not set # CONFIG_UIO_DMEM_GENIRQ is not set # CONFIG_UIO_AEC is not set # CONFIG_UIO_SERCOS3 is not set # CONFIG_UIO_PCI_GENERIC is not set # CONFIG_UIO_NETX is not set # CONFIG_UIO_PRUSS is not set # CONFIG_UIO_MF624 is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set CONFIG_VIRTIO_ANCHOR=y CONFIG_VIRTIO=y CONFIG_VIRTIO_PCI_LIB=y CONFIG_VIRTIO_PCI_LIB_LEGACY=y CONFIG_VIRTIO_MENU=y CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_PCI_LEGACY=y CONFIG_VIRTIO_BALLOON=y CONFIG_VIRTIO_INPUT=y CONFIG_VIRTIO_MMIO=y # CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set CONFIG_VIRTIO_DMA_SHARED_BUFFER=y # CONFIG_VDPA is not set # CONFIG_VHOST_MENU is not set # # Microsoft Hyper-V guest support # # CONFIG_HYPERV is not set # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set CONFIG_RTL8192U=m # CONFIG_RTLLIB is not set CONFIG_RTL8723BS=m CONFIG_R8712U=m CONFIG_R8188EU=m CONFIG_RTS5208=y # CONFIG_VT6655 is not set CONFIG_VT6656=m # CONFIG_FB_SM750 is not set CONFIG_STAGING_MEDIA=y # CONFIG_INTEL_ATOMISP is not set CONFIG_VIDEO_IPU3_IMGU=m CONFIG_STAGING_MEDIA_DEPRECATED=y # CONFIG_VIDEO_CPIA2 is not set CONFIG_VIDEO_SAA7146=m CONFIG_VIDEO_SAA7146_VV=m CONFIG_DVB_AV7110_IR=y CONFIG_DVB_AV7110=m CONFIG_DVB_AV7110_OSD=y CONFIG_DVB_BUDGET_PATCH=m CONFIG_DVB_SP8870=m # CONFIG_VIDEO_HEXIUM_GEMINI is not set # CONFIG_VIDEO_HEXIUM_ORION is not set # CONFIG_VIDEO_MXB is not set CONFIG_DVB_BUDGET_CORE=m CONFIG_DVB_BUDGET=m CONFIG_DVB_BUDGET_CI=m CONFIG_DVB_BUDGET_AV=m # CONFIG_VIDEO_STKWEBCAM is not set CONFIG_VIDEO_TM6000=m # CONFIG_VIDEO_TM6000_ALSA is not set CONFIG_VIDEO_TM6000_DVB=m # CONFIG_USB_ZR364XX is not set # CONFIG_LTE_GDM724X is not set # CONFIG_KS7010 is not set # CONFIG_FIELDBUS_DEV is not set # CONFIG_QLGE is not set # CONFIG_VME_BUS is not set # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set CONFIG_SURFACE_PLATFORMS=y # CONFIG_SURFACE_3_POWER_OPREGION is not set # CONFIG_SURFACE_GPE is not set # CONFIG_SURFACE_HOTPLUG is not set # CONFIG_SURFACE_PRO3_BUTTON is not set # CONFIG_SURFACE_AGGREGATOR is not set CONFIG_X86_PLATFORM_DEVICES=y CONFIG_ACPI_WMI=y CONFIG_WMI_BMOF=y # CONFIG_HUAWEI_WMI is not set # CONFIG_MXM_WMI is not set # CONFIG_PEAQ_WMI is not set # CONFIG_NVIDIA_WMI_EC_BACKLIGHT is not set # CONFIG_XIAOMI_WMI is not set # CONFIG_GIGABYTE_WMI is not set # CONFIG_YOGABOOK_WMI is not set # CONFIG_ACERHDF is not set # CONFIG_ACER_WIRELESS is not set # CONFIG_ACER_WMI is not set CONFIG_AMD_PMF=m # CONFIG_AMD_PMC is not set # CONFIG_AMD_HSMP is not set # CONFIG_ADV_SWBUTTON is not set # CONFIG_APPLE_GMUX is not set # CONFIG_ASUS_LAPTOP is not set # CONFIG_ASUS_WIRELESS is not set # CONFIG_ASUS_TF103C_DOCK is not set # CONFIG_X86_PLATFORM_DRIVERS_DELL is not set # CONFIG_AMILO_RFKILL is not set # CONFIG_FUJITSU_LAPTOP is not set # CONFIG_FUJITSU_TABLET is not set # CONFIG_GPD_POCKET_FAN is not set CONFIG_X86_PLATFORM_DRIVERS_HP=y # CONFIG_HP_ACCEL is not set # CONFIG_HP_WMI is not set # CONFIG_WIRELESS_HOTKEY is not set # CONFIG_IBM_RTL is not set # CONFIG_IDEAPAD_LAPTOP is not set # CONFIG_SENSORS_HDAPS is not set # CONFIG_THINKPAD_ACPI is not set # CONFIG_THINKPAD_LMI is not set CONFIG_INTEL_ATOMISP2_PDX86=y CONFIG_INTEL_ATOMISP2_PM=y # CONFIG_INTEL_SAR_INT1092 is not set # CONFIG_INTEL_SKL_INT3472 is not set # CONFIG_INTEL_PMC_CORE is not set # # Intel Speed Select Technology interface support # # CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set # end of Intel Speed Select Technology interface support # CONFIG_INTEL_WMI_SBL_FW_UPDATE is not set # CONFIG_INTEL_WMI_THUNDERBOLT is not set # # Intel Uncore Frequency Control # # CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set # end of Intel Uncore Frequency Control # CONFIG_INTEL_HID_EVENT is not set # CONFIG_INTEL_VBTN is not set # CONFIG_INTEL_INT0002_VGPIO is not set # CONFIG_INTEL_OAKTRAIL is not set # CONFIG_INTEL_PUNIT_IPC is not set # CONFIG_INTEL_RST is not set # CONFIG_INTEL_SMARTCONNECT is not set # CONFIG_INTEL_TURBO_MAX_3 is not set # CONFIG_INTEL_VSEC is not set # CONFIG_MSI_LAPTOP is not set # CONFIG_MSI_WMI is not set # CONFIG_PCENGINES_APU2 is not set # CONFIG_BARCO_P50_GPIO is not set # CONFIG_SAMSUNG_LAPTOP is not set # CONFIG_SAMSUNG_Q10 is not set # CONFIG_TOSHIBA_BT_RFKILL is not set # CONFIG_TOSHIBA_HAPS is not set # CONFIG_TOSHIBA_WMI is not set # CONFIG_ACPI_CMPC is not set # CONFIG_COMPAL_LAPTOP is not set # CONFIG_LG_LAPTOP is not set # CONFIG_PANASONIC_LAPTOP is not set # CONFIG_SONY_LAPTOP is not set # CONFIG_SYSTEM76_ACPI is not set # CONFIG_TOPSTAR_LAPTOP is not set # CONFIG_MLX_PLATFORM is not set # CONFIG_INTEL_IPS is not set # CONFIG_INTEL_SCU_PCI is not set # CONFIG_INTEL_SCU_PLATFORM is not set # CONFIG_SIEMENS_SIMATIC_IPC is not set # CONFIG_WINMATE_FM07_KEYS is not set CONFIG_P2SB=y CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # CONFIG_COMMON_CLK_MAX9485 is not set # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set # CONFIG_XILINX_VCU is not set # CONFIG_HWSPINLOCK is not set # # Clock Source drivers # CONFIG_CLKEVT_I8253=y CONFIG_CLKBLD_I8253=y # end of Clock Source drivers CONFIG_MAILBOX=y CONFIG_PCC=y # CONFIG_ALTERA_MBOX is not set CONFIG_IOMMU_IOVA=y CONFIG_IOASID=y CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # CONFIG_IOMMU_IO_PGTABLE=y # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set # CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set # CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set CONFIG_IOMMU_DEFAULT_PASSTHROUGH=y CONFIG_IOMMU_DMA=y CONFIG_IOMMU_SVA=y CONFIG_AMD_IOMMU=y CONFIG_AMD_IOMMU_V2=y CONFIG_DMAR_TABLE=y CONFIG_INTEL_IOMMU=y CONFIG_INTEL_IOMMU_SVM=y # CONFIG_INTEL_IOMMU_DEFAULT_ON is not set CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON is not set CONFIG_IRQ_REMAP=y # CONFIG_VIRTIO_IOMMU is not set # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # end of Remoteproc drivers # # Rpmsg drivers # # CONFIG_RPMSG_QCOM_GLINK_RPM is not set # CONFIG_RPMSG_VIRTIO is not set # end of Rpmsg drivers # CONFIG_SOUNDWIRE is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # end of Amlogic SoC drivers # # Broadcom SoC drivers # # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # end of NXP/Freescale QorIQ SoC drivers # # fujitsu SoC drivers # # end of fujitsu SoC drivers # # i.MX SoC drivers # # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # end of Enable LiteX SoC Builder specific drivers # # Qualcomm SoC drivers # # end of Qualcomm SoC drivers # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers # CONFIG_PM_DEVFREQ is not set # CONFIG_EXTCON is not set # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set # CONFIG_PWM is not set # # IRQ chip support # # end of IRQ chip support # CONFIG_IPACK_BUS is not set CONFIG_RESET_CONTROLLER=y # CONFIG_RESET_SIMPLE is not set # CONFIG_RESET_TI_SYSCON is not set # CONFIG_RESET_TI_TPS380X is not set # # PHY Subsystem # # CONFIG_GENERIC_PHY is not set # CONFIG_USB_LGM_PHY is not set # CONFIG_PHY_CAN_TRANSCEIVER is not set # # PHY drivers for Broadcom platforms # # CONFIG_BCM_KONA_USB2_PHY is not set # end of PHY drivers for Broadcom platforms # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_INTEL_LGM_EMMC is not set # end of PHY Subsystem CONFIG_POWERCAP=y CONFIG_INTEL_RAPL_CORE=m CONFIG_INTEL_RAPL=m # CONFIG_IDLE_INJECT is not set # CONFIG_MCB is not set # # Performance monitor support # # end of Performance monitor support CONFIG_RAS=y # CONFIG_USB4 is not set # # Android # # CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_LIBNVDIMM is not set # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y # CONFIG_NVMEM_RMEM is not set # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_TEE is not set # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set # CONFIG_PECI is not set # CONFIG_HTE is not set # end of Device Drivers # # 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 CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=m CONFIG_XFS_SUPPORT_V4=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_ONLINE_SCRUB is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=y CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_BTRFS_FS_REF_VERIFY is not set # CONFIG_NILFS2_FS is not set CONFIG_F2FS_FS=y CONFIG_F2FS_STAT_FS=y # CONFIG_F2FS_FS_XATTR is not set CONFIG_F2FS_CHECK_FS=y # CONFIG_F2FS_FAULT_INJECTION is not set # CONFIG_F2FS_FS_COMPRESSION is not set CONFIG_F2FS_IOSTAT=y # CONFIG_F2FS_UNFAIR_RWSEM is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y # CONFIG_QUOTA is not set CONFIG_AUTOFS4_FS=y CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=m # CONFIG_CUSE is not set # CONFIG_VIRTIO_FS is not set CONFIG_OVERLAY_FS=m # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_XINO_AUTO is not set # CONFIG_OVERLAY_FS_METACOPY is not set # # Caches # CONFIG_NETFS_SUPPORT=y # CONFIG_NETFS_STATS is not set CONFIG_FSCACHE=y # CONFIG_FSCACHE_STATS is not set # CONFIG_FSCACHE_DEBUG is not set # CONFIG_CACHEFILES is not set # end of Caches # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=m CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=m # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=m CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set CONFIG_NTFS3_FS=m # CONFIG_NTFS3_64BIT_CLUSTER is not set # CONFIG_NTFS3_LZX_XPRESS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_PID_ARCH_STATUS=y CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_TMPFS_INODE64 is not set # CONFIG_HUGETLBFS is not set CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=y CONFIG_EFIVAR_FS=y # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set # CONFIG_HFS_FS is not set CONFIG_HFSPLUS_FS=m # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y # CONFIG_SQUASHFS_FILE_CACHE is not set CONFIG_SQUASHFS_FILE_DIRECT=y # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_PSTORE is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y CONFIG_NFS_SWAP=y CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=m CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" CONFIG_NFS_V4_1_MIGRATION=y CONFIG_ROOT_NFS=y CONFIG_NFS_FSCACHE=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFS_DISABLE_UDP_SUPPORT=y # CONFIG_NFS_V4_2_READ_PLUS is not set # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_COMMON=y CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y CONFIG_SUNRPC_SWAP=y CONFIG_RPCSEC_GSS_KRB5=m # CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES is not set # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS2=y CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set CONFIG_CIFS_DEBUG=y # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DEBUG_DUMP_KEYS is not set # CONFIG_CIFS_DFS_UPCALL is not set # CONFIG_CIFS_SWN_UPCALL is not set CONFIG_CIFS_FSCACHE=y # CONFIG_CIFS_ROOT is not set # CONFIG_SMB_SERVER is not set CONFIG_SMBFS=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y CONFIG_KEYS_REQUEST_CACHE=y # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEY_DH_OPERATIONS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set CONFIG_SECURITYFS=y # CONFIG_INTEL_TXT is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_LSM="yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_STACK_ALL_PATTERN is not set # CONFIG_INIT_STACK_ALL_ZERO is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization CONFIG_RANDSTRUCT_NONE=y # end of Kernel hardening options # end of Security options CONFIG_XOR_BLOCKS=y CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y 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=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_SIMD=y # end of Crypto core or helper # # Public-key cryptography # CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y # CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set CONFIG_CRYPTO_ECC=m CONFIG_CRYPTO_ECDH=m # CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set # end of Public-key cryptography # # Block ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SM4_GENERIC is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CFB=m CONFIG_CRYPTO_CTR=y CONFIG_CRYPTO_CTS=m CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # end of Length-preserving ciphers and modes # # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y # CONFIG_CRYPTO_ESSIV is not set # end of AEAD (authenticated encryption with associated data) ciphers # # Hashes, digests, and MACs # CONFIG_CRYPTO_BLAKE2B=y CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y CONFIG_CRYPTO_MICHAEL_MIC=m # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_XCBC is not set CONFIG_CRYPTO_XXHASH=y # end of Hashes, digests, and MACs # # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y # CONFIG_CRYPTO_CRCT10DIF is not set # end of CRCs (cyclic redundancy checks) # # Compression # # CONFIG_CRYPTO_DEFLATE is not set # CONFIG_CRYPTO_LZO is not set # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # end of Compression # # Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation # # Userspace interface # CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set CONFIG_CRYPTO_USER_API_AEAD=y CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y # # Accelerated Cryptographic Algorithms for CPU (x86) # CONFIG_CRYPTO_CURVE25519_X86=m CONFIG_CRYPTO_AES_NI_INTEL=y # CONFIG_CRYPTO_BLOWFISH_X86_64 is not set # CONFIG_CRYPTO_CAMELLIA_X86_64 is not set # CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set # CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set # CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set # CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set CONFIG_CRYPTO_DES3_EDE_X86_64=y # CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set # CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set # CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set # CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set # CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set # CONFIG_CRYPTO_TWOFISH_X86_64 is not set # CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set # CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set # CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64 is not set CONFIG_CRYPTO_CHACHA20_X86_64=m # CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set # CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set # CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set CONFIG_CRYPTO_BLAKE2S_X86=y # CONFIG_CRYPTO_POLYVAL_CLMUL_NI is not set CONFIG_CRYPTO_POLY1305_X86_64=m CONFIG_CRYPTO_SHA1_SSSE3=y CONFIG_CRYPTO_SHA256_SSSE3=y CONFIG_CRYPTO_SHA512_SSSE3=y # CONFIG_CRYPTO_SM3_AVX_X86_64 is not set # CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set # CONFIG_CRYPTO_CRC32C_INTEL is not set # CONFIG_CRYPTO_CRC32_PCLMUL is not set # end of Accelerated Cryptographic Algorithms for CPU (x86) # CONFIG_CRYPTO_HW is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS8_PRIVATE_KEY_PARSER=m CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=y # CONFIG_RAID6_PQ_BENCHMARK is not set CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y # CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y # # Crypto library routines # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=y CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=m CONFIG_CRYPTO_LIB_CHACHA_GENERIC=m CONFIG_CRYPTO_LIB_CHACHA=m CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=m CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m CONFIG_CRYPTO_LIB_CURVE25519=m CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m CONFIG_CRYPTO_LIB_POLY1305_GENERIC=m CONFIG_CRYPTO_LIB_POLY1305=m CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_CRC_CCITT=y CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC64_ROCKSOFT is not set CONFIG_CRC_ITU_T=m CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y # CONFIG_CRC8 is not set CONFIG_XXHASH=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=y CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set # CONFIG_XZ_DEC_IA64 is not set # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set # CONFIG_XZ_DEC_MICROLZMA is not set # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_ZSTD=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_INTERVAL_TREE=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_SWIOTLB=y CONFIG_DMA_CMA=y # CONFIG_DMA_PERNUMA_CMA is not set # # 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_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y CONFIG_IOMMU_HELPER=y CONFIG_CHECK_SIGNATURE=y # CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y CONFIG_IRQ_POLL=y CONFIG_MPILIB=y CONFIG_DIMLIB=y CONFIG_OID_REGISTRY=y CONFIG_UCS2_STRING=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_TIME_NS=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_ARCH_HAS_PMEM_API=y CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_COPY_MC=y CONFIG_ARCH_STACKWALK=y CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y # end of Library routines CONFIG_PLDMFW=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set # CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_SYMBOLIC_ERRNAME=y CONFIG_DEBUG_BUGVERBOSE=y # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Compile-time checks and compiler options # CONFIG_AS_HAS_NON_CONST_LEB128=y CONFIG_DEBUG_INFO_NONE=y # CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=1024 CONFIG_STRIP_ASM_SYMS=y # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y # CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set CONFIG_FRAME_POINTER=y CONFIG_OBJTOOL=y CONFIG_STACK_VALIDATION=y # CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set CONFIG_HAVE_ARCH_KCSAN=y CONFIG_HAVE_KCSAN_COMPILER=y # CONFIG_KCSAN is not set # end of Generic Kernel Debugging Instruments # # Networking Debugging # # CONFIG_NET_DEV_REFCNT_TRACKER is not set # CONFIG_NET_NS_REFCNT_TRACKER is not set # CONFIG_DEBUG_NET is not set # end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_PAGE_REF is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_PTDUMP_DEBUGFS is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM_PGTABLE is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y # CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y # CONFIG_KFENCE is not set CONFIG_HAVE_ARCH_KMSAN=y # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set CONFIG_HARDLOCKUP_DETECTOR_PERF=y CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # # CONFIG_SCHED_DEBUG is not set # CONFIG_SCHEDSTATS is not set # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) CONFIG_TRACE_IRQFLAGS=y CONFIG_TRACE_IRQFLAGS_NMI=y # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=60 CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_USER_STACKTRACE_SUPPORT=y CONFIG_NOP_TRACER=y CONFIG_HAVE_RETHOOK=y CONFIG_RETHOOK=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y CONFIG_HAVE_OBJTOOL_MCOUNT=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACER_MAX_TRACE=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_RING_BUFFER_ALLOW_SWAP=y CONFIG_PREEMPTIRQ_TRACEPOINTS=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y CONFIG_BOOTTIME_TRACING=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y CONFIG_DYNAMIC_FTRACE=y CONFIG_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y CONFIG_DYNAMIC_FTRACE_WITH_ARGS=y # CONFIG_FPROBE is not set # CONFIG_FUNCTION_PROFILER is not set CONFIG_STACK_TRACER=y CONFIG_IRQSOFF_TRACER=y CONFIG_SCHED_TRACER=y # CONFIG_HWLAT_TRACER is not set # CONFIG_OSNOISE_TRACER is not set # CONFIG_TIMERLAT_TRACER is not set # CONFIG_MMIOTRACE is not set # CONFIG_FTRACE_SYSCALLS is not set CONFIG_TRACER_SNAPSHOT=y CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set CONFIG_BLK_DEV_IO_TRACE=y CONFIG_KPROBE_EVENTS=y # CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set # CONFIG_UPROBE_EVENTS is not set CONFIG_BPF_EVENTS=y CONFIG_DYNAMIC_EVENTS=y CONFIG_PROBE_EVENTS=y # CONFIG_BPF_KPROBE_OVERRIDE is not set CONFIG_FTRACE_MCOUNT_RECORD=y CONFIG_FTRACE_MCOUNT_USE_CC=y # CONFIG_SYNTH_EVENTS is not set # CONFIG_HIST_TRIGGERS is not set # CONFIG_TRACE_EVENT_INJECT is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_TRACE_EVAL_MAP_FILE is not set # CONFIG_FTRACE_RECORD_RECURSION is not set # CONFIG_FTRACE_STARTUP_TEST is not set # CONFIG_FTRACE_SORT_STARTUP_TEST is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set # CONFIG_PREEMPTIRQ_DELAY_TEST is not set # CONFIG_KPROBE_EVENT_GEN_TEST is not set # CONFIG_RV is not set # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set # CONFIG_SAMPLES is not set CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y CONFIG_STRICT_DEVMEM=y # CONFIG_IO_STRICT_DEVMEM is not set # # x86 Debugging # # CONFIG_X86_VERBOSE_BOOTUP is not set # CONFIG_EARLY_PRINTK is not set # CONFIG_EFI_PGT_DUMP is not set # CONFIG_DEBUG_TLBFLUSH is not set # CONFIG_IOMMU_DEBUG is not set CONFIG_HAVE_MMIOTRACE_SUPPORT=y # CONFIG_X86_DECODER_SELFTEST is not set CONFIG_IO_DELAY_0X80=y # CONFIG_IO_DELAY_0XED is not set # CONFIG_IO_DELAY_UDELAY is not set # CONFIG_IO_DELAY_NONE is not set # CONFIG_DEBUG_BOOT_PARAMS is not set # CONFIG_CPA_DEBUG is not set # CONFIG_DEBUG_ENTRY is not set # CONFIG_DEBUG_NMI_SELFTEST is not set CONFIG_X86_DEBUG_FPU=y # CONFIG_PUNIT_ATOM_DEBUG is not set # CONFIG_UNWINDER_ORC is not set CONFIG_UNWINDER_FRAME_POINTER=y # end of x86 Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set CONFIG_FUNCTION_ERROR_INJECTION=y # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set # CONFIG_TEST_MIN_HEAP is not set # CONFIG_TEST_DIV64 is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_TEST_REF_TRACKER is not set # CONFIG_RBTREE_TEST is not set # CONFIG_REED_SOLOMON_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set # CONFIG_STRING_SELFTEST is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_STRSCPY is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_SCANF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_XARRAY is not set # CONFIG_TEST_MAPLE_TREE is not set # CONFIG_TEST_RHASHTABLE is not set # CONFIG_TEST_SIPHASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_BITOPS is not set # CONFIG_TEST_VMALLOC is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_TEST_BLACKHOLE_DEV is not set # CONFIG_FIND_BIT_BENCHMARK is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_SYSCTL is not set # CONFIG_TEST_UDELAY is not set # CONFIG_TEST_STATIC_KEYS is not set # CONFIG_TEST_DYNAMIC_DEBUG is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMCAT_P is not set # CONFIG_TEST_MEMINIT is not set # CONFIG_TEST_FREE_PAGES is not set # CONFIG_TEST_FPU is not set # CONFIG_TEST_CLOCKSOURCE_WATCHDOG is not set CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage # # Rust hacking # # end of Rust hacking # end of Kernel hacking ================================================ FILE: projects/Generic/options ================================================ ################################################################################ # setup system defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in x86_64) # Valid TARGET_CPU values as defined at: # https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html # x86-64 A generic CPU with 64-bit extensions. # # x86-64-v2 e.g. AMD CPU - Bulldozer - (bdver1) # Intel CPU - Nehalem - (nehalem) # # x86-64-v3 e.g. AMD CPU - Bulldozer GEN4 - (bdver4) # Intel CPU - Haswell - (haswell) TARGET_CPU="x86-64" ;; esac # Bootloader to use (syslinux / u-boot) BOOTLOADER="syslinux" # Kernel target KERNEL_TARGET="bzImage" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="" # Additional kernel dependencies KERNEL_EXTRA_DEPENDS_TARGET="" # Kernel to use. values can be: # default: default mainline kernel LINUX="default" ################################################################################ # setup build defaults ################################################################################ # Project CFLAGS PROJECT_CFLAGS="" # SquashFS compression method (gzip / lzo / xz / zstd) SQUASHFS_COMPRESSION="zstd" ################################################################################ # setup project defaults ################################################################################ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" FIRMWARE="misc-firmware wlan-firmware dvb-firmware iwlwifi-firmware" # additional drivers to install: # for a list of additional drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS+=" DRIVER1 DRIVER2" ADDITIONAL_DRIVERS+=" bcm_sta" # build and install driver addons (yes / no) DRIVER_ADDONS_SUPPORT="no" # driver addons to install: # for a list of additional drivers see packages/linux-driver-addons # Space separated list is supported, DRIVER_ADDONS="crazycat digital_devices dvb-latest" # Default size of the ova image, in MB, eg. 4096 OVA_SIZE="4096" ================================================ FILE: projects/Generic/packages/initramfs/config/initramfs.x86_64.conf ================================================ slink lib64 usr/lib 0777 0 0 slink usr/lib64 lib 0777 0 0 ================================================ FILE: projects/Generic/packages/linux/modprobe.d/ath9k.conf ================================================ # ath9k.conf: setup modload options for module ath9k. # # enable "Channel Context support" to avoid buffering in live TV options ath9k use_chanctx=1 ================================================ FILE: projects/NXP/devices/iMX6/bootloader/canupdate.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) [ "$1" = "iMX6.arm" ] && exit 0 || exit 1 ================================================ FILE: projects/NXP/devices/iMX6/bootloader/install ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) cp -av u-boot.img $INSTALL/usr/share/bootloader cp -av SPL $INSTALL/usr/share/bootloader ================================================ FILE: projects/NXP/devices/iMX6/bootloader/mkimage ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) if [ -f "$RELEASE_DIR/3rdparty/bootloader/u-boot.img" ]; then echo "image: writing u-boot.img to $(basename $DISK)" dd if="$RELEASE_DIR/3rdparty/bootloader/u-boot.img" of="$DISK" bs=1K seek=69 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/SPL" ]; then echo "image: writing SPL to $(basename $DISK)" dd if="$RELEASE_DIR/3rdparty/bootloader/SPL" of="$DISK" bs=1K seek=1 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error fi echo "image: copying device trees" mcopy -s -o "${RELEASE_DIR}/3rdparty/bootloader"/imx6d*${UBOOT_SYSTEM}*.dtb :: mcopy -s -o "${RELEASE_DIR}/3rdparty/bootloader"/imx6q*${UBOOT_SYSTEM}*.dtb :: echo "image: copying exlinux.conf" mkdir -p "${LE_TMP}/extlinux" cat << EOF > "${LE_TMP}/extlinux/extlinux.conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDTDIR / APPEND boot=UUID=${UUID_SYSTEM} disk=UUID=${UUID_STORAGE} quiet ${EXTRA_CMDLINE} EOF mcopy -s -o "${LE_TMP}/extlinux" :: ================================================ FILE: projects/NXP/devices/iMX6/bootloader/release ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) SRCDIR="$BUILD/image/system/usr/share/bootloader" DSTDIR="$RELEASE_DIR/3rdparty/bootloader" mkdir -p "$DSTDIR" if [ -n "$UBOOT_SYSTEM" ]; then cp -a "$SRCDIR/u-boot.img" "$DSTDIR" cp -a "$SRCDIR/SPL" "$DSTDIR" fi cp -a "$SRCDIR"/*.dtb "$DSTDIR" ================================================ FILE: projects/NXP/devices/iMX6/bootloader/update.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) [ -z "$SYSTEM_ROOT" ] && SYSTEM_ROOT="" [ -z "$BOOT_ROOT" ] && BOOT_ROOT="/flash" [ -z "$BOOT_PART" ] && BOOT_PART=$(df "$BOOT_ROOT" | tail -1 | awk {' print $1 '}) if [ -z "$BOOT_DISK" ]; then case $BOOT_PART in /dev/sd[a-z][0-9]*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,[0-9]*,,g") ;; /dev/mmcblk*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,p[0-9]*,,g") ;; esac fi # mount $BOOT_ROOT r/w mount -o remount,rw $BOOT_ROOT # update extlinux device trees for dtbfile in $BOOT_ROOT/*.dtb; do dtb=$(basename $dtbfile) echo "Updating $dtb" cp -p $SYSTEM_ROOT/usr/share/bootloader/$dtb $BOOT_ROOT/ 2>/dev/null || true done # update bootloader files if [ -f $SYSTEM_ROOT/usr/share/bootloader/u-boot.img ]; then echo "Updating u-boot image on $BOOT_DISK" dd if=$SYSTEM_ROOT/usr/share/bootloader/u-boot.img of="$BOOT_DISK" bs=1K seek=69 conv=fsync &>/dev/null fi if [ -f $SYSTEM_ROOT/usr/share/bootloader/SPL ]; then echo "Updating u-boot SPL on $BOOT_DISK" dd if=$SYSTEM_ROOT/usr/share/bootloader/SPL of="$BOOT_DISK" bs=1k seek=1 conv=fsync &>/dev/null fi # mount $BOOT_ROOT r/o sync mount -o remount,ro $BOOT_ROOT ================================================ FILE: projects/NXP/devices/iMX6/filesystem/usr/bin/rdu-audio ================================================ #!/bin/sh if [ -z "$1" ]; then echo "usage: rdu-audio <0-100>" echo " The recommended level is 80" exit 1 fi sleep 5 VOLUME="$1%" amixer -q sset 'Headphone',0 $VOLUME amixer -q sset 'Speaker',0 on amixer -q sset 'Speaker Analog',0 $VOLUME amixer -q sset 'Speaker Driver',0 $VOLUME amixer -q sset 'Speaker Driver',0 on amixer -q sset 'DAC',0 $VOLUME amixer -q sset 'HP Analog',0 $VOLUME amixer -q sset 'HP Driver',0 $VOLUME amixer -q sset 'HP Driver',0 on amixer -q sset 'HP Left',0 on amixer -q sset 'HP Right',0 on amixer -q sset 'Output Left From AIN1',0 on amixer -q sset 'Output Left From AIN2',0 on amixer -q sset 'Output Left From Left DAC',0 on amixer -q sset 'Output Right From AIN2',0 on amixer -q sset 'Output Right From Right DAC',0 on ================================================ FILE: projects/NXP/devices/iMX6/filesystem/usr/bin/rdu-network ================================================ #!/bin/sh ACTION=$1 LOGGER_TAG="rdu-network" MODEL=$(cat /sys/firmware/devicetree/base/model) IP_IFACE="" BR_NAME="" BR_IFACES="" UNUSED_IFACES="" USED_IFACES="" function log { logger -t "${LOGGER_TAG}" "$@" } function logerr { logger -t "${LOGGER_TAG}" -p "err" "$@" } # Select setup based on model case "${MODEL}" in "ZII RDU2+ Board" | "ZII RDU2 Board") log "Loading RDU2 networking setup..." IP_IFACE="eth1" BR_NAME="br0" BR_IFACES="netaux netleft netright gigabit_proc" ALL_IFACES="eth0 ${IP_IFACE} ${BR_IFACES} ${BR_NAME}" ;; "ZII RDU1 Board") log "Loading RDU1 networking setup..." IP_IFACE="br0" BR_NAME="br0" BR_IFACES="netaux netleft netright" ALL_IFACES="eth0 ${BR_NAME} ${BR_IFACES}" ;; *) logerr "invalid hardware model detected: ${MODEL}" exit 1 ;; esac case "${ACTION}" in "start") # Assume RDU network is already started if the bridge is available if [ -d /sys/class/net/${BR_NAME} ]; then log "Networking setup is already started" exit 0 fi # Cleanup all addresses from all interfaces and bring them down log "Resetting interfaces..." for IFACE in ${ALL_IFACES}; do log " Resetting ${IFACE}..." ip addr flush dev ${IFACE} >/dev/null 2>&1 ip link set dev ${IFACE} down >/dev/null 2>&1 done # Create bridge with all interfaces log "Creating bridge interface..." brctl addbr ${BR_NAME} >/dev/null 2>&1 for IFACE in ${BR_IFACES}; do log " Adding ${IFACE} to bridge..." brctl addif ${BR_NAME} ${IFACE} >/dev/null 2>&1 done # Bring all bridge interfaces and the bridge itself up log "Bringing up all interfaces..." for IFACE in ${ALL_IFACES}; do log " Bringing up ${IFACE}..." ip link set dev ${IFACE} up >/dev/null 2>&1 done # All done log "RDU networking started" exit 0 ;; "stop") # Assume RDU network is already stopped if the bridge is available if [ ! -d /sys/class/net/${BR_NAME} ]; then log "Networking setup is already stopped" exit 0 fi # Cleanup all addresses from all interfaces and bring them down log "Resetting interfaces..." for IFACE in ${ALL_IFACES}; do ip addr flush dev ${IFACE} >/dev/null 2>&1 ip link set dev ${IFACE} down >/dev/null 2>&1 done # Remove bridge interfaces and bridge itself log "Removing bridge interface..." for IFACE in ${BR_IFACES}; do brctl delif ${BR_NAME} ${IFACE} >/dev/null 2>&1 done brctl delbr ${BR_NAME} >/dev/null 2>&1 # All done log "RDU networking stopped" exit 0 ;; *) logerr "invalid action requested: ${ACTION}" exit 2 ;; esac ================================================ FILE: projects/NXP/devices/iMX6/filesystem/usr/lib/systemd/system/rdu-audio.service ================================================ [Unit] Description=RDU audio setup After=sound.target ConditionPathExistsGlob=/flash/imx6*-zii-rdu2.dtb [Service] Type=oneshot ExecStart=/usr/bin/rdu-audio 70 RemainAfterExit=true [Install] WantedBy=multi-user.target ================================================ FILE: projects/NXP/devices/iMX6/filesystem/usr/lib/systemd/system/rdu-network.service ================================================ [Unit] Description=RDU network setup After=network-pre.target ConditionPathExistsGlob=/flash/imx6*-zii-rdu2.dtb [Service] Type=oneshot ExecStart=/usr/bin/rdu-network start RemainAfterExit=true ExecStop=/usr/bin/rdu-network stop [Install] WantedBy=multi-user.target ================================================ FILE: projects/NXP/devices/iMX6/filesystem/usr/share/alsa/cards/dw-hdmi-ahb-aud.conf ================================================ # # All PCM must be 24-bit for easy kernel conversion. # IEC958 formatted output can be sent directly. # # Direct-to-hardware converting to 24-bit output. # dw-hdmi-ahb-aud.pcm.hw-s24le { @args [ CARD ] @args.CARD { type string } type linear slave.pcm { type hw card $CARD } slave.format S24_LE } # # Dmix hardware 24-bit output. # dw-hdmi-ahb-aud.pcm.dmix-s24le { @args [ CARD ] @args.CARD { type string } type plug slave.pcm { @func concat strings [ "dmix:" $CARD ",FORMAT=S24_LE" ] } } # # Softvol with dmix output # dw-hdmi-ahb-aud.pcm.default { @args [ CARD ] @args.CARD { type string } type asym playback.pcm { type softvol slave.pcm { @func refer name { @func concat strings [ "cards." { @func card_driver card $CARD } ".pcm.dmix-s24le:CARD=" $CARD ] } } control { name "PCM Playback Volume" card $CARD } } } # # Common output path for front and surround outputs # dw-hdmi-ahb-aud.pcm.common.0 { @args [ CARD ] @args.CARD { type string } type asym playback.pcm { type softvol slave.pcm { @func refer name { @func concat strings [ "cards." { @func card_driver card $CARD } ".pcm.hw-s24le:CARD=" $CARD ] } } control { name "PCM Playback Volume" card $CARD } } } <confdir:pcm/front.conf> dw-hdmi-ahb-aud.pcm.front.0 cards.dw-hdmi-ahb-aud.pcm.common.0 # The mapping of ALSA channels to surround channels is very imprecise. # ALSA uses a different terminology and speaker placement to the CEA # surround positioning. CEA has the positioning of: # # LFE # FL FLC FC FRC FR # # # RL RLC RC RRC RR # # ALSA's idea is: # # LFE # FL C FR # # SL SR # # RL RR # # We do our best to map between these representations. <confdir:pcm/surround40.conf> dw-hdmi-ahb-aud.pcm.surround40.0 { @args [ CARD ] @args.CARD { type string } type empty slave.pcm { @func refer name { @func concat strings [ "cards.dw-hdmi-ahb-aud.pcm.common.0:CARD=" $CARD ] } } } # surround 41 and surround50 are (annoyingly) mapped to surround51 # We could do without stacking two 'route' plugins on top of each other <confdir:pcm/surround41.conf> <confdir:pcm/surround50.conf> <confdir:pcm/surround51.conf> dw-hdmi-ahb-aud.pcm.surround51.0 { @args [ CARD ] @args.CARD { type string } type route slave.pcm { @func refer name { @func concat strings [ "cards.dw-hdmi-ahb-aud.pcm.common.0:CARD=" $CARD ] } } ttable.0.0 1.0 # FL -> slave 0 -> hdmi 0 FL ttable.1.1 1.0 # FR -> slave 1 -> hdmi 1 FR ttable.2.4 1.0 # RL -> slave 4 -> hdmi 4 RL ttable.3.5 1.0 # RR -> slave 5 -> hdmi 5 RR ttable.4.3 1.0 # C -> slave 3 -> hdmi 3 FC ttable.5.2 1.0 # LFE -> slave 2 -> hdmi 2 LFE } <confdir:pcm/surround71.conf> dw-hdmi-ahb-aud.pcm.surround71.0 { @args [ CARD ] @args.CARD { type string } type route slave.pcm { @func refer name { @func concat strings [ "cards.dw-hdmi-ahb-aud.pcm.common.0:CARD=" $CARD ] } } slave.channels 8 ttable.0.0 1.0 # FL -> slave 0 -> hdmi 0 FL ttable.1.1 1.0 # FR -> slave 1 -> hdmi 1 FR ttable.2.6 1.0 # RL -> slave 6 -> hdmi 6 RLC/FLC ttable.3.7 1.0 # RR -> slave 7 -> hdmi 7 RRC/FRC ttable.4.3 1.0 # C -> slave 3 -> hdmi 3 FC ttable.5.2 1.0 # LFE -> slave 2 -> hdmi 2 LFE ttable.6.4 1.0 # SL -> slave 4 -> hdmi 4 RL ttable.7.5 1.0 # SR -> slave 5 -> hdmi 5 RR } <confdir:pcm/hdmi.conf> dw-hdmi-ahb-aud.pcm.hdmi.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type iec958 slave.pcm { type hw card $CARD } slave.format IEC958_SUBFRAME_LE # $AES3 must be correct for some AV receivers to accept the stream status [ $AES0 $AES1 $AES2 $AES3 ] } <confdir:pcm/iec958.conf> dw-hdmi-ahb-aud.pcm.iec958.0 cards.dw-hdmi-ahb-aud.pcm.hdmi.0 ================================================ FILE: projects/NXP/devices/iMX6/linux/linux.arm.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm 6.1.1 Kernel Configuration # CONFIG_CC_VERSION_TEXT="armv7a-libreelec-linux-gnueabihf-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION_AUTO=y CONFIG_BUILD_SALT="" CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_LZMA=y CONFIG_HAVE_KERNEL_XZ=y CONFIG_HAVE_KERNEL_LZO=y CONFIG_HAVE_KERNEL_LZ4=y # CONFIG_KERNEL_GZIP is not set # CONFIG_KERNEL_LZMA is not set # CONFIG_KERNEL_XZ is not set CONFIG_KERNEL_LZO=y # CONFIG_KERNEL_LZ4 is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_IRQ_IPI=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_GENERIC_IRQ_MULTI_HANDLER=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_CONTEXT_TRACKING=y CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y # CONFIG_BPF_JIT is not set # CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_BPF_PRELOAD is not set # end of BPF subsystem CONFIG_PREEMPT_VOLUNTARY_BUILD=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set CONFIG_PREEMPT_COUNT=y # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set CONFIG_SCHED_THERMAL_PRESSURE=y # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_TASKSTATS is not set # CONFIG_PSI is not set # end of CPU/Task time and stats accounting CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 # CONFIG_PRINTK_INDEX is not set CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # # end of Scheduler features CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set CONFIG_CGROUP_PIDS=y # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y # CONFIG_CGROUP_MISC is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" CONFIG_INITRAMFS_FORCE=y CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 # CONFIG_RD_GZIP is not set # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set # CONFIG_RD_LZ4 is not set CONFIG_RD_ZSTD=y # CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set CONFIG_INITRAMFS_COMPRESSION_NONE=y # CONFIG_BOOT_CONFIG is not set CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_EXPERT=y CONFIG_UID16=y CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set CONFIG_SYSFS_SYSCALL=y CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y 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 CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set # CONFIG_EMBEDDED is not set CONFIG_HAVE_PERF_EVENTS=y CONFIG_PERF_USE_VMALLOC=y # CONFIG_PC104 is not set # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_SYSTEM_DATA_VERIFICATION=y # CONFIG_PROFILING is not set CONFIG_TRACEPOINTS=y # end of General setup CONFIG_ARM=y CONFIG_ARM_HAS_GROUP_RELOCS=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y CONFIG_HAVE_PROC_CPU=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_LOCKDEP_SUPPORT=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_ARM_PATCH_PHYS_VIRT=y CONFIG_GENERIC_BUG=y CONFIG_PGTABLE_LEVELS=2 # # System Type # CONFIG_MMU=y CONFIG_ARCH_MMAP_RND_BITS_MIN=8 CONFIG_ARCH_MMAP_RND_BITS_MAX=16 CONFIG_ARCH_MULTIPLATFORM=y # # Platform selection # # # CPU Core family selection # # CONFIG_ARCH_MULTI_V6 is not set CONFIG_ARCH_MULTI_V7=y CONFIG_ARCH_MULTI_V6_V7=y # end of Platform selection # CONFIG_ARCH_VIRT is not set # CONFIG_ARCH_AIROHA is not set # CONFIG_ARCH_ACTIONS is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_ARTPEC is not set # CONFIG_ARCH_ASPEED is not set # CONFIG_ARCH_AT91 is not set # CONFIG_ARCH_BCM is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_DIGICOLOR is not set # CONFIG_ARCH_DOVE is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_HIGHBANK is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_HPE is not set CONFIG_ARCH_MXC=y CONFIG_HAVE_IMX_ANATOP=y CONFIG_HAVE_IMX_GPC=y CONFIG_HAVE_IMX_MMDC=y CONFIG_HAVE_IMX_SRC=y # # Cortex-A platforms # # CONFIG_SOC_IMX50 is not set # CONFIG_SOC_IMX51 is not set # CONFIG_SOC_IMX53 is not set CONFIG_SOC_IMX6=y CONFIG_SOC_IMX6Q=y CONFIG_SOC_IMX6SL=y CONFIG_SOC_IMX6SLL=y CONFIG_SOC_IMX6SX=y CONFIG_SOC_IMX6UL=y # CONFIG_SOC_LS1021A is not set # # Cortex-A/Cortex-M asymmetric multiprocessing platforms # # CONFIG_SOC_IMX7D is not set # CONFIG_SOC_IMX7ULP is not set # CONFIG_SOC_VF610 is not set # 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_MSTARV7 is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_NPCM is not set # # TI OMAP/AM/DM/DRA Family # # CONFIG_ARCH_OMAP3 is not set # CONFIG_ARCH_OMAP4 is not set # CONFIG_SOC_OMAP5 is not set # CONFIG_SOC_AM33XX is not set # CONFIG_SOC_AM43XX is not set # CONFIG_SOC_DRA7XX is not set # end of TI OMAP/AM/DM/DRA Family # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_RDA is not set # CONFIG_ARCH_REALTEK is not set # CONFIG_ARCH_ROCKCHIP is not set # CONFIG_ARCH_S5PV210 is not set # CONFIG_ARCH_RENESAS is not set # CONFIG_ARCH_INTEL_SOCFPGA is not set # CONFIG_PLAT_SPEAR is not set # CONFIG_ARCH_STI is not set # CONFIG_ARCH_STM32 is not set # CONFIG_ARCH_SUNPLUS is not set # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_U8500 is not set # CONFIG_ARCH_REALVIEW is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_WM8850 is not set # CONFIG_ARCH_ZYNQ is not set # # Processor Type # CONFIG_CPU_V7=y CONFIG_CPU_THUMB_CAPABLE=y CONFIG_CPU_32v6K=y CONFIG_CPU_32v7=y CONFIG_CPU_ABRT_EV7=y CONFIG_CPU_PABRT_V7=y CONFIG_CPU_CACHE_V7=y CONFIG_CPU_CACHE_VIPT=y CONFIG_CPU_COPY_V6=y CONFIG_CPU_TLB_V7=y CONFIG_CPU_HAS_ASID=y CONFIG_CPU_CP15=y CONFIG_CPU_CP15_MMU=y # # Processor Features # # CONFIG_ARM_LPAE is not set CONFIG_ARM_THUMB=y # CONFIG_ARM_THUMBEE is not set CONFIG_ARM_VIRT_EXT=y CONFIG_SWP_EMULATE=y CONFIG_CPU_LITTLE_ENDIAN=y # CONFIG_CPU_BIG_ENDIAN is not set # CONFIG_CPU_ICACHE_DISABLE is not set # CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND is not set # CONFIG_CPU_BPREDICT_DISABLE is not set CONFIG_CPU_SPECTRE=y CONFIG_HARDEN_BRANCH_PREDICTOR=y CONFIG_HARDEN_BRANCH_HISTORY=y CONFIG_KUSER_HELPERS=y CONFIG_VDSO=y CONFIG_OUTER_CACHE=y CONFIG_OUTER_CACHE_SYNC=y CONFIG_MIGHT_HAVE_CACHE_L2X0=y CONFIG_CACHE_L2X0=y # CONFIG_CACHE_L2X0_PMU is not set # CONFIG_PL310_ERRATA_588369 is not set # CONFIG_PL310_ERRATA_727915 is not set # CONFIG_PL310_ERRATA_753970 is not set CONFIG_PL310_ERRATA_769419=y CONFIG_ARM_L1_CACHE_SHIFT_6=y CONFIG_ARM_L1_CACHE_SHIFT=6 CONFIG_ARM_DMA_MEM_BUFFERABLE=y CONFIG_ARM_HEAVY_MB=y CONFIG_DEBUG_ALIGN_RODATA=y # CONFIG_ARM_ERRATA_430973 is not set CONFIG_ARM_ERRATA_643719=y CONFIG_ARM_ERRATA_720789=y CONFIG_ARM_ERRATA_754322=y CONFIG_ARM_ERRATA_754327=y CONFIG_ARM_ERRATA_764369=y CONFIG_ARM_ERRATA_764319=y CONFIG_ARM_ERRATA_775420=y # CONFIG_ARM_ERRATA_798181 is not set # CONFIG_ARM_ERRATA_773022 is not set # CONFIG_ARM_ERRATA_818325_852422 is not set # CONFIG_ARM_ERRATA_821420 is not set # CONFIG_ARM_ERRATA_825619 is not set # CONFIG_ARM_ERRATA_857271 is not set # CONFIG_ARM_ERRATA_852421 is not set # CONFIG_ARM_ERRATA_852423 is not set # CONFIG_ARM_ERRATA_857272 is not set # end of System Type # # Bus support # CONFIG_ARM_ERRATA_814220=y # end of Bus support # # Kernel Features # CONFIG_HAVE_SMP=y CONFIG_SMP=y CONFIG_SMP_ON_UP=y CONFIG_CURRENT_POINTER_IN_TPIDRURO=y CONFIG_IRQSTACKS=y CONFIG_ARM_CPU_TOPOLOGY=y # CONFIG_SCHED_MC is not set # CONFIG_SCHED_SMT is not set CONFIG_HAVE_ARM_SCU=y CONFIG_HAVE_ARM_ARCH_TIMER=y CONFIG_HAVE_ARM_TWD=y # CONFIG_MCPM is not set # CONFIG_BIG_LITTLE is not set CONFIG_VMSPLIT_3G=y # CONFIG_VMSPLIT_3G_OPT is not set # CONFIG_VMSPLIT_2G is not set # CONFIG_VMSPLIT_1G is not set CONFIG_PAGE_OFFSET=0xC0000000 CONFIG_NR_CPUS=4 CONFIG_HOTPLUG_CPU=y CONFIG_ARM_PSCI=y CONFIG_ARCH_NR_GPIO=0 CONFIG_HZ_FIXED=0 CONFIG_HZ_100=y # CONFIG_HZ_200 is not set # CONFIG_HZ_250 is not set # CONFIG_HZ_300 is not set # CONFIG_HZ_500 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=100 CONFIG_SCHED_HRTICK=y # CONFIG_THUMB2_KERNEL is not set CONFIG_ARM_PATCH_IDIV=y CONFIG_AEABI=y # CONFIG_OABI_COMPAT is not set CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ARCH_FLATMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_HIGHMEM=y CONFIG_HIGHPTE=y CONFIG_CPU_SW_DOMAIN_PAN=y CONFIG_HW_PERF_EVENTS=y # CONFIG_ARM_MODULE_PLTS is not set CONFIG_ARCH_FORCE_MAX_ORDER=11 CONFIG_ALIGNMENT_TRAP=y # CONFIG_UACCESS_WITH_MEMCPY is not set # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_XEN is not set CONFIG_CC_HAVE_STACKPROTECTOR_TLS=y CONFIG_STACKPROTECTOR_PER_TASK=y # end of Kernel Features # # Boot options # CONFIG_USE_OF=y CONFIG_ATAGS=y # CONFIG_UNUSED_BOARD_FILES is not set # CONFIG_DEPRECATED_PARAM_STRUCT is not set CONFIG_ZBOOT_ROM_TEXT=0 CONFIG_ZBOOT_ROM_BSS=0 # CONFIG_ARM_APPENDED_DTB is not set CONFIG_CMDLINE="root=/dev/ram0 rdinit=/init rw rootwait" # CONFIG_CMDLINE_FROM_BOOTLOADER is not set CONFIG_CMDLINE_EXTEND=y # CONFIG_CMDLINE_FORCE is not set CONFIG_KEXEC=y CONFIG_ATAGS_PROC=y # CONFIG_CRASH_DUMP is not set CONFIG_AUTO_ZRELADDR=y # CONFIG_EFI is not set # end of Boot options # # CPU Power Management # # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y # CONFIG_CPU_FREQ_STAT is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y # CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set # # CPU frequency scaling drivers # # CONFIG_CPUFREQ_DT is not set CONFIG_ARM_IMX6Q_CPUFREQ=y # end of CPU Frequency scaling # # CPU Idle # CONFIG_CPU_IDLE=y # CONFIG_CPU_IDLE_GOV_LADDER is not set CONFIG_CPU_IDLE_GOV_MENU=y # CONFIG_CPU_IDLE_GOV_TEO is not set # # ARM CPU Idle Drivers # # CONFIG_ARM_CPUIDLE is not set # CONFIG_ARM_PSCI_CPUIDLE is not set # CONFIG_ARM_HIGHBANK_CPUIDLE is not set # end of ARM CPU Idle Drivers # end of CPU Idle # end of CPU Power Management # # Floating point emulation # # # At least one emulation must be selected # CONFIG_VFP=y CONFIG_VFPv3=y CONFIG_NEON=y # CONFIG_KERNEL_MODE_NEON is not set # end of Floating point emulation # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_SUSPEND_SKIP_SYNC is not set # CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_USERSPACE_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y CONFIG_PM_DEBUG=y # CONFIG_PM_ADVANCED_DEBUG is not set CONFIG_PM_TEST_SUSPEND=y CONFIG_PM_SLEEP_DEBUG=y # CONFIG_APM_EMULATION is not set CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_PM_GENERIC_DOMAINS_SLEEP=y CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ARM_CPU_SUSPEND=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y # end of Power management options CONFIG_AS_VFP_VMRS_FPINST=y # # General architecture-dependent options # CONFIG_CRASH_CORE=y CONFIG_KEXEC_CORE=y # CONFIG_KPROBES is not set # CONFIG_JUMP_LABEL is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_ARCH_USE_BUILTIN_BSWAP=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_KEEPINITRD=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_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_LTO_NONE=y CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_REL=y CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=8 CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_HAVE_ARCH_PFN_VALID=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set CONFIG_MODVERSIONS=y CONFIG_MODULE_SRCVERSION_ALL=y # CONFIG_MODULE_SIG is not set CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_GZIP is not set # CONFIG_MODULE_COMPRESS_XZ is not set # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y # CONFIG_BLOCK_LEGACY_AUTOLOAD is not set CONFIG_BLK_CGROUP_RWSTAT=y # CONFIG_BLK_DEV_BSGLIB is not set # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_DEV_THROTTLING_LOW is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_CGROUP_IOLATENCY is not set # CONFIG_BLK_CGROUP_IOCOST is not set # CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # # CONFIG_PARTITION_ADVANCED is not set CONFIG_MSDOS_PARTITION=y CONFIG_EFI_PARTITION=y # end of Partition Types CONFIG_BLK_MQ_PCI=y CONFIG_BLK_PM=y CONFIG_BLOCK_HOLDER_DEPRECATED=y CONFIG_BLK_MQ_STACKING=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y # CONFIG_IOSCHED_BFQ is not set # end of IO Schedulers CONFIG_ASN1=y CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_ELF_FDPIC is not set CONFIG_ELFCORE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y CONFIG_ARCH_HAS_BINFMT_FLAT=y # CONFIG_BINFMT_FLAT is not set CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y CONFIG_BINFMT_MISC=m CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # CONFIG_SWAP=y # CONFIG_ZSWAP is not set # # SLAB allocator options # # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y # end of SLAB allocator options # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set # CONFIG_COMPAT_BRK is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_ARCH_KEEP_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_COMPACTION=y CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 # CONFIG_PAGE_REPORTING is not set CONFIG_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_BOUNCE=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set # CONFIG_CMA_DEBUGFS is not set # CONFIG_CMA_SYSFS is not set CONFIG_CMA_AREAS=7 CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set CONFIG_KMAP_LOCAL=y CONFIG_KMAP_LOCAL_NON_LINEAR_PTE_ARRAY=y # CONFIG_ANON_VMA_NAME is not set # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y CONFIG_NET_INGRESS=y CONFIG_NET_EGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_INTERFACE is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_ESP=y # CONFIG_NET_KEY is not set # CONFIG_XDP_SOCKETS is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y # CONFIG_IP_PNP_BOOTP is not set # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=y # CONFIG_IP_MROUTE is not set # CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set CONFIG_INET_ESP=y # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=y CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_INET_UDP_DIAG is not set # CONFIG_INET_RAW_DIAG is not set # CONFIG_INET_DIAG_DESTROY is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_IPV6_VTI is not set CONFIG_IPV6_SIT=y # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set CONFIG_IPV6_FOU=m # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set # CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NET_PTP_CLASSIFY=y # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_EGRESS=y CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_FAMILY_BRIDGE=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set # CONFIG_NETFILTER_NETLINK_LOG is not set # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=m # CONFIG_NF_LOG_SYSLOG is not set # CONFIG_NF_CONNTRACK_MARK is not set # CONFIG_NF_CONNTRACK_ZONES is not set CONFIG_NF_CONNTRACK_PROCFS=y CONFIG_NF_CONNTRACK_EVENTS=y # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set CONFIG_NF_CONNTRACK_IRC=m CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set CONFIG_NF_CONNTRACK_SIP=m CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m CONFIG_NF_NAT=m CONFIG_NF_NAT_FTP=m CONFIG_NF_NAT_IRC=m CONFIG_NF_NAT_SIP=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 # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set CONFIG_NETFILTER_XT_MATCH_IPVS=m # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_NETFILTER_XT_MATCH_OWNER is not set # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set # CONFIG_NETFILTER_XT_MATCH_STATE is not set # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set CONFIG_IP_VS=m # CONFIG_IP_VS_IPV6 is not set # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # CONFIG_IP_VS_PROTO_ESP is not set # CONFIG_IP_VS_PROTO_AH is not set # CONFIG_IP_VS_PROTO_SCTP is not set # # IPVS scheduler # CONFIG_IP_VS_RR=m # CONFIG_IP_VS_WRR is not set # CONFIG_IP_VS_LC is not set # CONFIG_IP_VS_WLC is not set # CONFIG_IP_VS_FO is not set # CONFIG_IP_VS_OVF is not set # CONFIG_IP_VS_LBLC is not set # CONFIG_IP_VS_LBLCR is not set # CONFIG_IP_VS_DH is not set # CONFIG_IP_VS_SH is not set # CONFIG_IP_VS_MH is not set # CONFIG_IP_VS_SED is not set # CONFIG_IP_VS_NQ is not set # CONFIG_IP_VS_TWOS is not set # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS MH scheduler # CONFIG_IP_VS_MH_TAB_INDEX=12 # # IPVS application helper # # CONFIG_IP_VS_FTP is not set CONFIG_IP_VS_NFCT=y # CONFIG_IP_VS_PE_SIP is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set CONFIG_NF_REJECT_IPV4=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_ARPTABLES is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m # CONFIG_NF_LOG_IPV6 is not set CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_MATCH_SRH is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m # CONFIG_IP6_NF_TARGET_NPT is not set # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_CONNTRACK_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y # CONFIG_BRIDGE_MRP is not set # CONFIG_BRIDGE_CFM is not set CONFIG_NET_DSA=m # CONFIG_NET_DSA_TAG_AR9331 is not set # CONFIG_NET_DSA_TAG_BRCM is not set # CONFIG_NET_DSA_TAG_BRCM_LEGACY is not set # CONFIG_NET_DSA_TAG_BRCM_PREPEND is not set # CONFIG_NET_DSA_TAG_HELLCREEK is not set # CONFIG_NET_DSA_TAG_GSWIP is not set CONFIG_NET_DSA_TAG_DSA_COMMON=m CONFIG_NET_DSA_TAG_DSA=m CONFIG_NET_DSA_TAG_EDSA=m # CONFIG_NET_DSA_TAG_MTK is not set # CONFIG_NET_DSA_TAG_KSZ is not set # CONFIG_NET_DSA_TAG_OCELOT is not set # CONFIG_NET_DSA_TAG_OCELOT_8021Q is not set # CONFIG_NET_DSA_TAG_QCA is not set # CONFIG_NET_DSA_TAG_RTL4_A is not set # CONFIG_NET_DSA_TAG_RTL8_4 is not set # CONFIG_NET_DSA_TAG_RZN1_A5PSW is not set # CONFIG_NET_DSA_TAG_LAN9303 is not set # CONFIG_NET_DSA_TAG_SJA1105 is not set # CONFIG_NET_DSA_TAG_TRAILER is not set # CONFIG_NET_DSA_TAG_XRS700X is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set # CONFIG_NET_SCH_FQ_CODEL is not set # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set # CONFIG_NET_SCH_DEFAULT is not set # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_TCINDEX is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_RSVP is not set # CONFIG_NET_CLS_RSVP6 is not set # CONFIG_NET_CLS_FLOW is not set CONFIG_NET_CLS_CGROUP=m # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set CONFIG_NET_SWITCHDEV=y CONFIG_NET_L3_MASTER_DEV=y # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_STREAM_PARSER is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # end of Network testing # end of Networking options # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=y CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y # CONFIG_BT_BNEP is not set # CONFIG_BT_HIDP is not set CONFIG_BT_HS=y CONFIG_BT_LE=y CONFIG_BT_LEDS=y # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set CONFIG_BT_DEBUGFS=y # CONFIG_BT_SELFTEST is not set # CONFIG_BT_FEATURE_DEBUG is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_QCA=m CONFIG_BT_MTK=m CONFIG_BT_HCIBTUSB=m CONFIG_BT_HCIBTUSB_AUTOSUSPEND=y CONFIG_BT_HCIBTUSB_BCM=y CONFIG_BT_HCIBTUSB_MTK=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 is not set # CONFIG_BT_HCIUART_ATH3K is not set CONFIG_BT_HCIUART_LL=y CONFIG_BT_HCIUART_3WIRE=y CONFIG_BT_HCIUART_INTEL=y CONFIG_BT_HCIUART_BCM=y # CONFIG_BT_HCIUART_RTL is not set CONFIG_BT_HCIUART_QCA=y CONFIG_BT_HCIUART_AG6XX=y CONFIG_BT_HCIUART_MRVL=y CONFIG_BT_HCIBCM203X=m CONFIG_BT_HCIBPA10X=m CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIVHCI=m CONFIG_BT_MRVL=m CONFIG_BT_MRVL_SDIO=m CONFIG_BT_ATH3K=m CONFIG_BT_MTKSDIO=m CONFIG_BT_MTKUART=m # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set CONFIG_CFG80211_CRDA_SUPPORT=y CONFIG_CFG80211_WEXT=y CONFIG_LIB80211=m CONFIG_LIB80211_CRYPT_WEP=m CONFIG_LIB80211_CRYPT_CCMP=m # CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=m CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set # CONFIG_MAC80211_LEDS is not set # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_NET_DEVLINK=y CONFIG_PAGE_POOL=y # CONFIG_PAGE_POOL_STATS is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y # # Device Drivers # CONFIG_HAVE_PCI=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y CONFIG_PCI_DOMAINS_GENERIC=y CONFIG_PCI_SYSCALL=y CONFIG_PCIEPORTBUS=y CONFIG_PCIEAER=y # CONFIG_PCIEAER_INJECT is not set # CONFIG_PCIE_ECRC is not set CONFIG_PCIEASPM=y CONFIG_PCIEASPM_DEFAULT=y # CONFIG_PCIEASPM_POWERSAVE is not set # CONFIG_PCIEASPM_POWER_SUPERSAVE is not set # CONFIG_PCIEASPM_PERFORMANCE is not set CONFIG_PCIE_PME=y # CONFIG_PCIE_DPC is not set # CONFIG_PCIE_PTM is not set CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y CONFIG_PCI_QUIRKS=y # CONFIG_PCI_DEBUG is not set # CONFIG_PCI_STUB is not set # CONFIG_PCI_IOV is not set # CONFIG_PCI_PRI is not set # CONFIG_PCI_PASID is not set # CONFIG_PCIE_BUS_TUNE_OFF is not set CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set CONFIG_VGA_ARB=y CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # # PCI controller drivers # # CONFIG_PCI_FTPCI100 is not set # CONFIG_PCI_HOST_GENERIC is not set # CONFIG_PCIE_XILINX is not set # CONFIG_PCI_V3_SEMI is not set # CONFIG_PCIE_ALTERA is not set # CONFIG_PCIE_MICROCHIP_HOST is not set # # DesignWare PCI Core Support # CONFIG_PCIE_DW=y CONFIG_PCIE_DW_HOST=y # CONFIG_PCIE_DW_PLAT_HOST is not set CONFIG_PCI_IMX6=y # CONFIG_PCI_LAYERSCAPE is not set # CONFIG_PCI_MESON is not set # end of DesignWare PCI Core Support # # Mobiveil PCIe Core Support # # end of Mobiveil PCIe Core Support # # Cadence PCIe controllers support # # CONFIG_PCIE_CADENCE_PLAT_HOST is not set # CONFIG_PCI_J721E_HOST is not set # end of Cadence PCIe controllers support # end of PCI controller drivers # # PCI Endpoint # # CONFIG_PCI_ENDPOINT is not set # end of PCI Endpoint # # PCI switch controller drivers # # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers # CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set # # Generic Driver Options # # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y # CONFIG_DEVTMPFS_SAFE is not set # CONFIG_STANDALONE is not set CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set CONFIG_FW_CACHE=y # CONFIG_FW_UPLOAD is not set # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y CONFIG_ALLOW_DEV_COREDUMP=y CONFIG_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_SOC_BUS=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set CONFIG_GENERIC_ARCH_TOPOLOGY=y # end of Generic Driver Options # # Bus devices # # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_MOXTET is not set CONFIG_IMX_WEIM=y # CONFIG_VEXPRESS_CONFIG is not set # CONFIG_FSL_MC_BUS is not set # CONFIG_MHI_BUS is not set # CONFIG_MHI_BUS_EP is not set # end of Bus devices CONFIG_CONNECTOR=y CONFIG_PROC_EVENTS=y # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # # CONFIG_ARM_SCMI_PROTOCOL is not set # end of ARM System Control and Management Interface Protocol # CONFIG_FIRMWARE_MEMMAP is not set # CONFIG_FW_CFG_SYSFS is not set # CONFIG_TRUSTED_FOUNDATIONS is not set # CONFIG_GOOGLE_FIRMWARE is not set CONFIG_ARM_PSCI_FW=y # CONFIG_ARM_PSCI_CHECKER is not set CONFIG_HAVE_ARM_SMCCC=y CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y CONFIG_ARM_SMCCC_SOC_ID=y # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set CONFIG_MTD=y # CONFIG_MTD_TESTS is not set # # Partition parsers # # CONFIG_MTD_AR7_PARTS is not set CONFIG_MTD_CMDLINE_PARTS=y CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AFS_PARTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set # end of Partition parsers # # User Modules And Translation Layers # CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y # # Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK. # # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # CONFIG_RFD_FTL is not set # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set # CONFIG_MTD_OOPS is not set # CONFIG_MTD_SWAP is not set # CONFIG_MTD_PARTITIONED_MASTER is not set # # RAM/ROM/Flash chip drivers # CONFIG_MTD_CFI=y CONFIG_MTD_JEDECPROBE=y CONFIG_MTD_GEN_PROBE=y # CONFIG_MTD_CFI_ADV_OPTIONS is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y CONFIG_MTD_CFI_INTELEXT=y CONFIG_MTD_CFI_AMDSTD=y CONFIG_MTD_CFI_STAA=y CONFIG_MTD_CFI_UTIL=y # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # end of RAM/ROM/Flash chip drivers # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_PHYSMAP is not set # CONFIG_MTD_IMPA7 is not set # CONFIG_MTD_INTEL_VR_NOR is not set # CONFIG_MTD_PLATRAM is not set # end of Mapping drivers for chip access # # Self-contained MTD device drivers # # CONFIG_MTD_PMC551 is not set CONFIG_MTD_DATAFLASH=y # CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set # CONFIG_MTD_DATAFLASH_OTP is not set # CONFIG_MTD_MCHP23K256 is not set # CONFIG_MTD_MCHP48L640 is not set CONFIG_MTD_SST25L=y # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLOCK2MTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOCG3 is not set # end of Self-contained MTD device drivers # # NAND # # CONFIG_MTD_ONENAND is not set # CONFIG_MTD_RAW_NAND is not set # CONFIG_MTD_SPI_NAND is not set # # ECC engine support # # CONFIG_MTD_NAND_ECC_SW_HAMMING is not set # CONFIG_MTD_NAND_ECC_SW_BCH is not set # CONFIG_MTD_NAND_ECC_MXIC is not set # end of ECC engine support # end of NAND # # LPDDR & LPDDR2 PCM memory drivers # # CONFIG_MTD_LPDDR is not set # CONFIG_MTD_LPDDR2_NVM is not set # end of LPDDR & LPDDR2 PCM memory drivers CONFIG_MTD_SPI_NOR=y CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y # CONFIG_MTD_SPI_NOR_SWP_DISABLE is not set CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y # CONFIG_MTD_SPI_NOR_SWP_KEEP is not set CONFIG_MTD_UBI=y CONFIG_MTD_UBI_WL_THRESHOLD=4096 CONFIG_MTD_UBI_BEB_LIMIT=20 CONFIG_MTD_UBI_FASTMAP=y # CONFIG_MTD_UBI_GLUEBI is not set CONFIG_MTD_UBI_BLOCK=y # CONFIG_MTD_HYPERBUS is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_RESERVED_MEM=y # CONFIG_OF_OVERLAY is not set CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set # CONFIG_ZRAM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_UBLK is not set # # NVME Support # # CONFIG_BLK_DEV_NVME is not set # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set # CONFIG_NVME_TARGET is not set # end of NVME Support # # Misc devices # # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_PHANTOM is not set # CONFIG_TIFM_CORE is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HP_ILO is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set CONFIG_SRAM=y CONFIG_SRAM_EXEC=y # CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set # CONFIG_HISI_HIKEY_USB is not set # CONFIG_OPEN_DICE is not set # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set # # EEPROM support # CONFIG_EEPROM_AT24=y CONFIG_EEPROM_AT25=y # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set # CONFIG_EEPROM_93CX6 is not set # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # CONFIG_CB710_CORE is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # CONFIG_ECHO is not set # CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_PVPANIC is not set # CONFIG_GP_PCI1XXXX is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set # CONFIG_BLK_DEV_SR is not set CONFIG_CHR_DEV_SG=m # CONFIG_BLK_DEV_BSG is not set # CONFIG_CHR_DEV_SCH is not set CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y CONFIG_SCSI_SCAN_ASYNC=y # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports # CONFIG_SCSI_LOWLEVEL is not set # CONFIG_SCSI_DH is not set # end of SCSI device support CONFIG_ATA=y CONFIG_SATA_HOST=y CONFIG_PATA_TIMINGS=y CONFIG_ATA_VERBOSE_ERROR=y CONFIG_ATA_FORCE=y CONFIG_SATA_PMP=y # # Controllers with non-SFF native interface # # CONFIG_SATA_AHCI is not set CONFIG_SATA_AHCI_PLATFORM=y # CONFIG_AHCI_DWC is not set CONFIG_AHCI_IMX=y # CONFIG_AHCI_CEVA is not set # CONFIG_AHCI_QORIQ is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set CONFIG_ATA_SFF=y # # SFF controllers with custom DMA interface # # CONFIG_PDC_ADMA is not set # CONFIG_SATA_QSTOR is not set # CONFIG_SATA_SX4 is not set CONFIG_ATA_BMDMA=y # # SATA SFF controllers with BMDMA # # CONFIG_ATA_PIIX is not set # CONFIG_SATA_DWC is not set # CONFIG_SATA_MV is not set # CONFIG_SATA_NV is not set # CONFIG_SATA_PROMISE is not set # CONFIG_SATA_SIL is not set # CONFIG_SATA_SIS is not set # CONFIG_SATA_SVW is not set # CONFIG_SATA_ULI is not set # CONFIG_SATA_VIA is not set # CONFIG_SATA_VITESSE is not set # # PATA SFF controllers with BMDMA # # CONFIG_PATA_ALI is not set # CONFIG_PATA_AMD is not set # CONFIG_PATA_ARTOP is not set # CONFIG_PATA_ATIIXP is not set # CONFIG_PATA_ATP867X is not set # CONFIG_PATA_CMD64X is not set # CONFIG_PATA_CYPRESS is not set # CONFIG_PATA_EFAR is not set # CONFIG_PATA_HPT366 is not set # CONFIG_PATA_HPT37X is not set # CONFIG_PATA_HPT3X2N is not set # CONFIG_PATA_HPT3X3 is not set CONFIG_PATA_IMX=y # CONFIG_PATA_IT8213 is not set # CONFIG_PATA_IT821X is not set # CONFIG_PATA_JMICRON is not set # CONFIG_PATA_MARVELL is not set # CONFIG_PATA_NETCELL is not set # CONFIG_PATA_NINJA32 is not set # CONFIG_PATA_NS87415 is not set # CONFIG_PATA_OLDPIIX is not set # CONFIG_PATA_OPTIDMA is not set # CONFIG_PATA_PDC2027X is not set # CONFIG_PATA_PDC_OLD is not set # CONFIG_PATA_RADISYS is not set # CONFIG_PATA_RDC is not set # CONFIG_PATA_SCH is not set # CONFIG_PATA_SERVERWORKS is not set # CONFIG_PATA_SIL680 is not set # CONFIG_PATA_SIS is not set # CONFIG_PATA_TOSHIBA is not set # CONFIG_PATA_TRIFLEX is not set # CONFIG_PATA_VIA is not set # CONFIG_PATA_WINBOND is not set # # PIO-only SFF controllers # # CONFIG_PATA_CMD640_PCI is not set # CONFIG_PATA_MPIIX is not set # CONFIG_PATA_NS87410 is not set # CONFIG_PATA_OPTI is not set # CONFIG_PATA_OF_PLATFORM is not set # CONFIG_PATA_RZ1000 is not set # # Generic fallback / legacy drivers # # CONFIG_ATA_GENERIC is not set # CONFIG_PATA_LEGACY is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=m # CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m # CONFIG_DM_UNSTRIPED is not set # CONFIG_DM_CRYPT is not set # CONFIG_DM_SNAPSHOT is not set CONFIG_DM_THIN_PROVISIONING=m # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_ERA is not set # CONFIG_DM_CLONE is not set # CONFIG_DM_MIRROR is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_DUST is not set # CONFIG_DM_UEVENT is not set # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_DM_INTEGRITY is not set # CONFIG_TARGET_CORE is not set # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # # CONFIG_FIREWIRE is not set # CONFIG_FIREWIRE_NOSY is not set # end of IEEE 1394 (FireWire) support CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set CONFIG_DUMMY=m CONFIG_WIREGUARD=m # CONFIG_WIREGUARD_DEBUG is not set # CONFIG_EQUALIZER is not set # CONFIG_NET_FC is not set # 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 # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_AMT is not set # CONFIG_MACSEC is not set # CONFIG_NETCONSOLE is not set # CONFIG_TUN is not set # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m CONFIG_NLMON=m # CONFIG_ARCNET is not set # # Distributed Switch Architecture drivers # # CONFIG_B53 is not set # CONFIG_NET_DSA_BCM_SF2 is not set # CONFIG_NET_DSA_LOOP is not set # CONFIG_NET_DSA_LANTIQ_GSWIP is not set # CONFIG_NET_DSA_MT7530 is not set # CONFIG_NET_DSA_MV88E6060 is not set # CONFIG_NET_DSA_MICROCHIP_KSZ_COMMON is not set CONFIG_NET_DSA_MV88E6XXX=m CONFIG_NET_DSA_MV88E6XXX_PTP=y # CONFIG_NET_DSA_MSCC_FELIX is not set # CONFIG_NET_DSA_MSCC_SEVILLE is not set # CONFIG_NET_DSA_AR9331 is not set # CONFIG_NET_DSA_QCA8K is not set # CONFIG_NET_DSA_SJA1105 is not set # CONFIG_NET_DSA_XRS700X_I2C is not set # CONFIG_NET_DSA_XRS700X_MDIO is not set # CONFIG_NET_DSA_REALTEK is not set # CONFIG_NET_DSA_SMSC_LAN9303_I2C is not set # CONFIG_NET_DSA_SMSC_LAN9303_MDIO is not set # CONFIG_NET_DSA_VITESSE_VSC73XX_SPI is not set # CONFIG_NET_DSA_VITESSE_VSC73XX_PLATFORM is not set # end of Distributed Switch Architecture drivers CONFIG_ETHERNET=y CONFIG_NET_VENDOR_3COM=y # CONFIG_VORTEX is not set # CONFIG_TYPHOON is not set CONFIG_NET_VENDOR_ADAPTEC=y # CONFIG_ADAPTEC_STARFIRE is not set CONFIG_NET_VENDOR_AGERE=y # CONFIG_ET131X is not set CONFIG_NET_VENDOR_ALACRITECH=y # CONFIG_SLICOSS is not set CONFIG_NET_VENDOR_ALTEON=y # CONFIG_ACENIC is not set # CONFIG_ALTERA_TSE is not set CONFIG_NET_VENDOR_AMAZON=y # CONFIG_ENA_ETHERNET is not set CONFIG_NET_VENDOR_AMD=y # CONFIG_AMD8111_ETH is not set # CONFIG_PCNET32 is not set CONFIG_NET_VENDOR_AQUANTIA=y # CONFIG_AQTION is not set CONFIG_NET_VENDOR_ARC=y # CONFIG_NET_VENDOR_ASIX is not set CONFIG_NET_VENDOR_ATHEROS=y # CONFIG_ATL2 is not set # CONFIG_ATL1 is not set # CONFIG_ATL1E is not set # CONFIG_ATL1C is not set # CONFIG_ALX is not set # CONFIG_NET_VENDOR_BROADCOM is not set CONFIG_NET_VENDOR_CADENCE=y # CONFIG_MACB is not set CONFIG_NET_VENDOR_CAVIUM=y CONFIG_NET_VENDOR_CHELSIO=y # CONFIG_CHELSIO_T1 is not set # CONFIG_CHELSIO_T3 is not set # CONFIG_CHELSIO_T4 is not set # CONFIG_CHELSIO_T4VF is not set CONFIG_NET_VENDOR_CIRRUS=y CONFIG_CS89x0=y CONFIG_CS89x0_PLATFORM=y CONFIG_NET_VENDOR_CISCO=y # CONFIG_ENIC is not set CONFIG_NET_VENDOR_CORTINA=y # CONFIG_GEMINI_ETHERNET is not set # CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set CONFIG_NET_VENDOR_DEC=y # CONFIG_NET_TULIP is not set CONFIG_NET_VENDOR_DLINK=y # CONFIG_DL2K is not set # CONFIG_SUNDANCE is not set CONFIG_NET_VENDOR_EMULEX=y # CONFIG_BE2NET is not set # CONFIG_NET_VENDOR_ENGLEDER is not set CONFIG_NET_VENDOR_EZCHIP=y # CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set # CONFIG_NET_VENDOR_FARADAY is not set CONFIG_NET_VENDOR_FREESCALE=y CONFIG_FEC=y # CONFIG_FSL_PQ_MDIO is not set # CONFIG_FSL_XGMAC_MDIO is not set # CONFIG_GIANFAR is not set # CONFIG_FSL_DPAA2_SWITCH is not set # CONFIG_FSL_ENETC is not set # CONFIG_FSL_ENETC_VF is not set CONFIG_FSL_ENETC_IERB=m # CONFIG_FSL_ENETC_MDIO is not set # CONFIG_NET_VENDOR_FUNGIBLE is not set CONFIG_NET_VENDOR_GOOGLE=y # CONFIG_GVE is not set CONFIG_NET_VENDOR_HISILICON=y # CONFIG_HIX5HD2_GMAC is not set # CONFIG_HISI_FEMAC is not set # CONFIG_HIP04_ETH is not set # CONFIG_HNS_DSAF is not set # CONFIG_HNS_ENET is not set # CONFIG_HNS3 is not set CONFIG_NET_VENDOR_HUAWEI=y CONFIG_NET_VENDOR_I825XX=y CONFIG_NET_VENDOR_INTEL=y # CONFIG_E100 is not set # CONFIG_E1000 is not set # CONFIG_E1000E is not set CONFIG_IGB=y CONFIG_IGB_HWMON=y # CONFIG_IGBVF is not set # CONFIG_IXGB is not set # CONFIG_IXGBE is not set # CONFIG_IXGBEVF is not set # CONFIG_I40E is not set # CONFIG_I40EVF is not set # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set # CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_JME is not set # CONFIG_NET_VENDOR_ADI is not set # CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set CONFIG_NET_VENDOR_MELLANOX=y # CONFIG_MLX4_EN is not set # CONFIG_MLX5_CORE is not set # CONFIG_MLXSW_CORE is not set # CONFIG_MLXFW is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set CONFIG_NET_VENDOR_MICROSEMI=y # CONFIG_MSCC_OCELOT_SWITCH is not set # CONFIG_NET_VENDOR_MICROSOFT is not set CONFIG_NET_VENDOR_MYRI=y # CONFIG_MYRI10GE is not set # CONFIG_FEALNX is not set CONFIG_NET_VENDOR_NI=y # CONFIG_NI_XGE_MANAGEMENT_ENET is not set # CONFIG_NET_VENDOR_NATSEMI is not set CONFIG_NET_VENDOR_NETERION=y # CONFIG_S2IO is not set CONFIG_NET_VENDOR_NETRONOME=y # CONFIG_NFP is not set CONFIG_NET_VENDOR_NVIDIA=y # CONFIG_FORCEDETH is not set CONFIG_NET_VENDOR_OKI=y # CONFIG_ETHOC is not set CONFIG_NET_VENDOR_PACKET_ENGINES=y # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set CONFIG_NET_VENDOR_PENSANDO=y CONFIG_NET_VENDOR_QLOGIC=y # CONFIG_QLA3XXX is not set # CONFIG_QLCNIC is not set # CONFIG_NETXEN_NIC is not set # CONFIG_QED is not set CONFIG_NET_VENDOR_BROCADE=y # CONFIG_BNA 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_RDC=y # CONFIG_R6040 is not set CONFIG_NET_VENDOR_REALTEK=y # CONFIG_8139CP is not set # CONFIG_8139TOO is not set # CONFIG_R8169 is not set CONFIG_NET_VENDOR_RENESAS=y CONFIG_NET_VENDOR_ROCKER=y # CONFIG_ROCKER is not set CONFIG_NET_VENDOR_SAMSUNG=y # CONFIG_SXGBE_ETH is not set # CONFIG_NET_VENDOR_SEEQ is not set CONFIG_NET_VENDOR_SILAN=y # CONFIG_SC92031 is not set CONFIG_NET_VENDOR_SIS=y # CONFIG_SIS900 is not set # CONFIG_SIS190 is not set CONFIG_NET_VENDOR_SOLARFLARE=y # CONFIG_SFC is not set # CONFIG_SFC_FALCON is not set # CONFIG_SFC_SIENA is not set CONFIG_NET_VENDOR_SMSC=y CONFIG_SMC91X=y # CONFIG_EPIC100 is not set CONFIG_SMC911X=y CONFIG_SMSC911X=y # CONFIG_SMSC9420 is not set CONFIG_NET_VENDOR_SOCIONEXT=y # CONFIG_NET_VENDOR_STMICRO is not set CONFIG_NET_VENDOR_SUN=y # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set # CONFIG_CASSINI is not set # CONFIG_NIU is not set CONFIG_NET_VENDOR_SYNOPSYS=y # CONFIG_DWC_XLGMAC is not set CONFIG_NET_VENDOR_TEHUTI=y # CONFIG_TEHUTI is not set CONFIG_NET_VENDOR_TI=y # CONFIG_TI_CPSW_PHY_SEL is not set # CONFIG_TLAN is not set # CONFIG_NET_VENDOR_VERTEXCOM is not set CONFIG_NET_VENDOR_VIA=y # CONFIG_VIA_RHINE is not set # CONFIG_VIA_VELOCITY is not set CONFIG_NET_VENDOR_WIZNET=y # CONFIG_WIZNET_W5100 is not set # CONFIG_WIZNET_W5300 is not set CONFIG_NET_VENDOR_XILINX=y # CONFIG_XILINX_EMACLITE is not set # CONFIG_XILINX_AXI_EMAC is not set # CONFIG_XILINX_LL_TEMAC is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set CONFIG_PHYLINK=y CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_SFP is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_ADIN_PHY is not set # CONFIG_ADIN1100_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=y # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM54140_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set CONFIG_MARVELL_PHY=y # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set # CONFIG_MAXLINEAR_GPHY is not set # CONFIG_MEDIATEK_GE_PHY is not set CONFIG_MICREL_PHY=y CONFIG_MICROCHIP_PHY=y # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set # CONFIG_MOTORCOMM_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set CONFIG_AT803X_PHY=y # CONFIG_QSEMI_PHY is not set # CONFIG_REALTEK_PHY is not set # CONFIG_RENESAS_PHY is not set # CONFIG_ROCKCHIP_PHY is not set CONFIG_SMSC_PHY=y # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_DP83TD510_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set # CONFIG_PSE_CONTROLLER is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_OF_MDIO=y CONFIG_MDIO_DEVRES=y CONFIG_MDIO_BITBANG=y # CONFIG_MDIO_BCM_UNIMAC is not set CONFIG_MDIO_GPIO=y # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_IPQ4019 is not set # CONFIG_MDIO_IPQ8064 is not set # # MDIO Multiplexers # # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # # PCS device drivers # # end of PCS device drivers # CONFIG_PPP is not set # CONFIG_SLIP is not set CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set CONFIG_USB_PEGASUS=m CONFIG_USB_RTL8150=m CONFIG_USB_RTL8152=m # CONFIG_USB_LAN78XX is not set CONFIG_USB_USBNET=y CONFIG_USB_NET_AX8817X=y CONFIG_USB_NET_AX88179_178A=y CONFIG_USB_NET_CDCETHER=y CONFIG_USB_NET_CDC_EEM=m CONFIG_USB_NET_CDC_NCM=y # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set # CONFIG_USB_NET_DM9601 is not set # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set # CONFIG_USB_NET_SMSC75XX is not set # CONFIG_USB_NET_SMSC95XX is not set # CONFIG_USB_NET_GL620A is not set CONFIG_USB_NET_NET1080=y # CONFIG_USB_NET_PLUSB is not set # CONFIG_USB_NET_MCS7830 is not set # CONFIG_USB_NET_RNDIS_HOST is not set CONFIG_USB_NET_CDC_SUBSET_ENABLE=y CONFIG_USB_NET_CDC_SUBSET=y # CONFIG_USB_ALI_M5632 is not set # CONFIG_USB_AN2720 is not set CONFIG_USB_BELKIN=y CONFIG_USB_ARMLINUX=y # CONFIG_USB_EPSON2888 is not set # CONFIG_USB_KC2190 is not set CONFIG_USB_NET_ZAURUS=y # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set # CONFIG_USB_HSO is not set # CONFIG_USB_NET_INT51X1 is not set # CONFIG_USB_IPHETH is not set # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y # CONFIG_WLAN_VENDOR_ADMTEK is not set # CONFIG_WLAN_VENDOR_ATH is not set CONFIG_WLAN_VENDOR_ATMEL=y CONFIG_ATMEL=m # CONFIG_PCI_ATMEL is not set CONFIG_AT76C50X_USB=m CONFIG_WLAN_VENDOR_BROADCOM=y # CONFIG_B43 is not set # CONFIG_B43LEGACY is not set CONFIG_BRCMUTIL=m # CONFIG_BRCMSMAC is not set CONFIG_BRCMFMAC=m CONFIG_BRCMFMAC_PROTO_BCDC=y CONFIG_BRCMFMAC_SDIO=y # CONFIG_BRCMFMAC_USB is not set # CONFIG_BRCMFMAC_PCIE is not set # CONFIG_BRCM_TRACING is not set # CONFIG_BRCMDBG is not set # CONFIG_WLAN_VENDOR_CISCO is not set # CONFIG_WLAN_VENDOR_INTEL is not set # CONFIG_WLAN_VENDOR_INTERSIL is not set # CONFIG_WLAN_VENDOR_MARVELL is not set # CONFIG_WLAN_VENDOR_MEDIATEK is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set # CONFIG_WLAN_VENDOR_PURELIFI is not set # CONFIG_WLAN_VENDOR_RALINK is not set CONFIG_WLAN_VENDOR_REALTEK=y # CONFIG_RTL8180 is not set # CONFIG_RTL8187 is not set CONFIG_RTL_CARDS=m # CONFIG_RTL8192CE is not set # CONFIG_RTL8192SE is not set # CONFIG_RTL8192DE is not set # CONFIG_RTL8723AE is not set # CONFIG_RTL8723BE is not set # CONFIG_RTL8188EE is not set # CONFIG_RTL8192EE is not set # CONFIG_RTL8821AE is not set # CONFIG_RTL8192CU is not set # CONFIG_RTL8XXXU is not set CONFIG_RTW88=m CONFIG_RTW88_CORE=m CONFIG_RTW88_USB=m CONFIG_RTW88_8822B=m CONFIG_RTW88_8822C=m CONFIG_RTW88_8723D=m CONFIG_RTW88_8821C=m # CONFIG_RTW88_8822BE is not set # CONFIG_RTW88_8822BS is not set CONFIG_RTW88_8822BU=m # CONFIG_RTW88_8822CE is not set # CONFIG_RTW88_8822CS is not set CONFIG_RTW88_8822CU=m # CONFIG_RTW88_8723DE is not set CONFIG_RTW88_8723DU=m # CONFIG_RTW88_8821CE is not set # CONFIG_RTW88_8821CS is not set CONFIG_RTW88_8821CU=m # CONFIG_RTW88_DEBUG is not set # CONFIG_RTW88_DEBUGFS is not set # CONFIG_RTW89 is not set # CONFIG_WLAN_VENDOR_RSI is not set # CONFIG_WLAN_VENDOR_SILABS is not set # CONFIG_WLAN_VENDOR_ST is not set # CONFIG_WLAN_VENDOR_TI is not set # CONFIG_WLAN_VENDOR_ZYDAS is not set # CONFIG_WLAN_VENDOR_QUANTENNA is not set # CONFIG_MAC80211_HWSIM is not set # CONFIG_USB_NET_RNDIS_WLAN is not set # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN # CONFIG_VMXNET3 is not set # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_SPARSEKMAP is not set CONFIG_INPUT_MATRIXKMAP=y CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces # # CONFIG_INPUT_MOUSEDEV is not set # CONFIG_INPUT_JOYDEV is not set CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADC is not set # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=y # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set CONFIG_KEYBOARD_SNVS_PWRKEY=y CONFIG_KEYBOARD_IMX=y # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_PINEPHONE is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_STMPE is not set # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set # CONFIG_KEYBOARD_CYPRESS_SF is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=m CONFIG_MOUSE_PS2_ALPS=y CONFIG_MOUSE_PS2_BYD=y CONFIG_MOUSE_PS2_LOGIPS2PP=y CONFIG_MOUSE_PS2_SYNAPTICS=y CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y CONFIG_MOUSE_PS2_CYPRESS=y CONFIG_MOUSE_PS2_TRACKPOINT=y CONFIG_MOUSE_PS2_ELANTECH=y CONFIG_MOUSE_PS2_ELANTECH_SMBUS=y # CONFIG_MOUSE_PS2_SENTELIC is not set # CONFIG_MOUSE_PS2_TOUCHKIT is not set CONFIG_MOUSE_PS2_FOCALTECH=y CONFIG_MOUSE_PS2_SMBUS=y # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set # CONFIG_MOUSE_CYAPA is not set # CONFIG_MOUSE_ELAN_I2C is not set # CONFIG_MOUSE_VSXXXAA is not set # CONFIG_MOUSE_GPIO is not set # CONFIG_MOUSE_SYNAPTICS_I2C is not set # CONFIG_MOUSE_SYNAPTICS_USB is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADC is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set # CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set CONFIG_JOYSTICK_XPAD=y CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y # CONFIG_JOYSTICK_PSXPAD_SPI is not set # CONFIG_JOYSTICK_PXRC is not set # CONFIG_JOYSTICK_QWIIC is not set # CONFIG_JOYSTICK_FSIA6B is not set # CONFIG_JOYSTICK_SENSEHAT is not set # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_ADS7846=y # CONFIG_TOUCHSCREEN_AD7877 is not set # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_ADC is not set # CONFIG_TOUCHSCREEN_AR1021_I2C is not set # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_BU21029 is not set # CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set # CONFIG_TOUCHSCREEN_CY8CTMA140 is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DA9052 is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set CONFIG_TOUCHSCREEN_EGALAX=y # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set # CONFIG_TOUCHSCREEN_EXC3000 is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_HIDEEP is not set # CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_ILITEK is not set # CONFIG_TOUCHSCREEN_S6SY761 is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set # CONFIG_TOUCHSCREEN_ELAN is not set # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set CONFIG_TOUCHSCREEN_MAX11801=y # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MSG2638 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_IMAGIS is not set CONFIG_TOUCHSCREEN_IMX6UL_TSC=y # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set CONFIG_TOUCHSCREEN_EDT_FT5X06=y # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set CONFIG_TOUCHSCREEN_MC13783=y # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set CONFIG_TOUCHSCREEN_TSC200X_CORE=y CONFIG_TOUCHSCREEN_TSC2004=y # CONFIG_TOUCHSCREEN_TSC2005 is not set CONFIG_TOUCHSCREEN_TSC2007=y # CONFIG_TOUCHSCREEN_TSC2007_IIO is not set # CONFIG_TOUCHSCREEN_RM_TS is not set # CONFIG_TOUCHSCREEN_SILEAD is not set # CONFIG_TOUCHSCREEN_SIS_I2C is not set # CONFIG_TOUCHSCREEN_ST1232 is not set # CONFIG_TOUCHSCREEN_STMFTS is not set CONFIG_TOUCHSCREEN_STMPE=y # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set CONFIG_TOUCHSCREEN_SX8654=y # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZET6223 is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set CONFIG_TOUCHSCREEN_COLIBRI_VF50=y # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_IQS5XX is not set # CONFIG_TOUCHSCREEN_ZINITIX is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MC13783_PWRBUTTON is not set CONFIG_INPUT_MMA8450=y # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_DA9052_ONKEY is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IBM_PANEL is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set CONFIG_INPUT_RAVE_SP_PWRBUTTON=y CONFIG_RMI4_CORE=y CONFIG_RMI4_I2C=y CONFIG_RMI4_SPI=y CONFIG_RMI4_SMB=y CONFIG_RMI4_F03=y CONFIG_RMI4_F03_SERIO=y CONFIG_RMI4_2D_SENSOR=y CONFIG_RMI4_F11=y CONFIG_RMI4_F12=y CONFIG_RMI4_F30=y CONFIG_RMI4_F34=y # CONFIG_RMI4_F3A is not set CONFIG_RMI4_F54=y CONFIG_RMI4_F55=y # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_SERIO_SERPORT=m # CONFIG_SERIO_PCIPS2 is not set CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_SERIO_GPIO_PS2 is not set # CONFIG_USERIO is not set # CONFIG_GAMEPORT is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y # CONFIG_SERIAL_8250 is not set # # Non-8250 serial port support # # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set CONFIG_SERIAL_IMX=y CONFIG_SERIAL_IMX_CONSOLE=y # CONFIG_SERIAL_IMX_EARLYCON is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_SIFIVE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_RP2 is not set CONFIG_SERIAL_FSL_LPUART=y CONFIG_SERIAL_FSL_LPUART_CONSOLE=y # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_ST_ASC is not set # CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set # CONFIG_HVC_DCC is not set CONFIG_SERIAL_DEV_BUS=y CONFIG_SERIAL_DEV_CTRL_TTYPORT=y # CONFIG_TTY_PRINTK is not set # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set # CONFIG_IPMB_DEVICE_INTERFACE is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_BA431 is not set CONFIG_HW_RANDOM_IMX_RNGC=y # CONFIG_HW_RANDOM_CCTRNG is not set # CONFIG_HW_RANDOM_XIPHERA is not set CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=m # CONFIG_APPLICOM is not set CONFIG_DEVMEM=y CONFIG_DEVPORT=y # CONFIG_TCG_TPM is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y # CONFIG_I2C_COMPAT is not set CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set CONFIG_I2C_MUX_GPIO=y # CONFIG_I2C_MUX_GPMUX is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set # CONFIG_I2C_MUX_PINCTRL is not set # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_DEMUX_PINCTRL is not set # CONFIG_I2C_MUX_MLXCPLD is not set # end of Multiplexer I2C Chip support # CONFIG_I2C_HELPER_AUTO is not set # CONFIG_I2C_SMBUS is not set # # I2C Algorithms # CONFIG_I2C_ALGOBIT=y CONFIG_I2C_ALGOPCF=m CONFIG_I2C_ALGOPCA=m # end of I2C Algorithms # # I2C Hardware Bus support # # # PC SMBus host controller drivers # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_ISCH is not set # CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_NVIDIA_GPU is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CBUS_GPIO is not set # CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_DESIGNWARE_PCI is not set # CONFIG_I2C_EMEV2 is not set CONFIG_I2C_GPIO=y # CONFIG_I2C_GPIO_FAULT_INJECTOR is not set CONFIG_I2C_IMX=y # CONFIG_I2C_IMX_LPI2C is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_RK3X is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_PCI1XXXX is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set CONFIG_I2C_SLAVE=y # CONFIG_I2C_SLAVE_EEPROM is not set # CONFIG_I2C_SLAVE_TESTUNIT is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y CONFIG_SPI_MEM=y # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set CONFIG_SPI_BITBANG=y # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_CADENCE_QUADSPI is not set # CONFIG_SPI_CADENCE_XSPI is not set # CONFIG_SPI_DESIGNWARE is not set # CONFIG_SPI_FSL_LPSPI is not set CONFIG_SPI_FSL_QUADSPI=y # CONFIG_SPI_NXP_FLEXSPI is not set # CONFIG_SPI_GPIO is not set CONFIG_SPI_IMX=y # CONFIG_SPI_FSL_SPI is not set # CONFIG_SPI_MICROCHIP_CORE is not set # CONFIG_SPI_MICROCHIP_CORE_QSPI is not set # CONFIG_SPI_OC_TINY is not set # CONFIG_SPI_PXA2XX is not set # CONFIG_SPI_ROCKCHIP is not set # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_SIFIVE is not set # CONFIG_SPI_MXIC is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_AMD is not set # # SPI Multiplexer support # # CONFIG_SPI_MUX is not set # # SPI Protocol Masters # # CONFIG_SPI_SPIDEV is not set # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set # CONFIG_SPMI is not set # CONFIG_HSI is not set CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # # CONFIG_PTP_1588_CLOCK_KVM is not set # CONFIG_PTP_1588_CLOCK_IDT82P33 is not set # CONFIG_PTP_1588_CLOCK_IDTCM is not set # end of PTP clock support CONFIG_PINCTRL=y CONFIG_GENERIC_PINCTRL_GROUPS=y CONFIG_PINMUX=y CONFIG_GENERIC_PINMUX_FUNCTIONS=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_CY8C95X0 is not set # CONFIG_PINCTRL_MCP23S08 is not set # CONFIG_PINCTRL_MICROCHIP_SGPIO is not set # CONFIG_PINCTRL_OCELOT is not set # CONFIG_PINCTRL_SINGLE is not set # CONFIG_PINCTRL_STMFX is not set # CONFIG_PINCTRL_SX150X is not set CONFIG_PINCTRL_IMX=y CONFIG_PINCTRL_IMX6Q=y CONFIG_PINCTRL_IMX6SL=y CONFIG_PINCTRL_IMX6SLL=y CONFIG_PINCTRL_IMX6SX=y CONFIG_PINCTRL_IMX6UL=y # CONFIG_PINCTRL_IMX8ULP is not set # CONFIG_PINCTRL_IMXRT1050 is not set # CONFIG_PINCTRL_IMX93 is not set # CONFIG_PINCTRL_IMXRT1170 is not set # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y CONFIG_GPIO_CDEV=y CONFIG_GPIO_CDEV_V1=y CONFIG_GPIO_GENERIC=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_CADENCE is not set # CONFIG_GPIO_DWAPB is not set # CONFIG_GPIO_FTGPIO010 is not set # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HLWD is not set # CONFIG_GPIO_LOGICVC is not set # CONFIG_GPIO_MB86S7X is not set # CONFIG_GPIO_MPC8XXX is not set CONFIG_GPIO_MXC=y # CONFIG_GPIO_SIFIVE is not set # CONFIG_GPIO_SYSCON is not set CONFIG_GPIO_VF610=y # CONFIG_GPIO_XILINX is not set # CONFIG_GPIO_ZEVIO is not set # CONFIG_GPIO_AMD_FCH is not set # end of Memory mapped GPIO drivers # # I2C GPIO expanders # # 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 # CONFIG_GPIO_PCA953X_IRQ is not set # CONFIG_GPIO_PCA9570 is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # CONFIG_GPIO_TS4900 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # # CONFIG_GPIO_DA9052 is not set # CONFIG_HTC_EGPIO is not set CONFIG_GPIO_STMPE=y # CONFIG_GPIO_WM8994 is not set # end of MFD GPIO expanders # # PCI GPIO expanders # # CONFIG_GPIO_BT8XX is not set # CONFIG_GPIO_PCI_IDIO_16 is not set # CONFIG_GPIO_PCIE_IDIO_24 is not set # CONFIG_GPIO_RDC321X is not set # end of PCI GPIO expanders # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # end of SPI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers # CONFIG_W1 is not set CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_BRCMKONA is not set # CONFIG_POWER_RESET_BRCMSTB is not set # CONFIG_POWER_RESET_GPIO is not set # CONFIG_POWER_RESET_GPIO_RESTART is not set # CONFIG_POWER_RESET_LTC2952 is not set CONFIG_POWER_RESET_REGULATOR=y # CONFIG_POWER_RESET_RESTART is not set # CONFIG_POWER_RESET_VERSATILE is not set CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_RESET_SYSCON_POWEROFF=y # CONFIG_SYSCON_REBOOT_MODE is not set # CONFIG_NVMEM_REBOOT_MODE is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_DA9052 is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set # CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set CONFIG_CHARGER_UCS1002=y # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DRIVETEMP is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_DA9052_ADC is not set # CONFIG_SENSORS_I5K_AMB is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_MC13783_ADC is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set CONFIG_SENSORS_GPIO_FAN=y # CONFIG_SENSORS_HIH6130 is not set CONFIG_SENSORS_IIO_HWMON=y # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX31730 is not set # CONFIG_SENSORS_MAX31760 is not set # CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_NZXT_KRAKEN2 is not set # CONFIG_SENSORS_NZXT_SMART2 is not set # CONFIG_SENSORS_OCC_P8_I2C is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set # CONFIG_SENSORS_PWM_FAN is not set # CONFIG_SENSORS_SBTSI is not set # CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_VT8231 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y CONFIG_THERMAL_WRITABLE_TRIPS=y CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set CONFIG_CPU_THERMAL=y CONFIG_CPU_FREQ_THERMAL=y # CONFIG_THERMAL_EMULATION is not set # CONFIG_THERMAL_MMIO is not set CONFIG_IMX_THERMAL=y # CONFIG_IMX8MM_THERMAL is not set # CONFIG_GENERIC_ADC_THERMAL is not set CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 # CONFIG_WATCHDOG_SYSFS is not set # CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_DA9052_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set CONFIG_ZIIRAVE_WATCHDOG=y CONFIG_RAVE_SP_WATCHDOG=y # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_FTWDT010_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set # CONFIG_MAX63XX_WATCHDOG is not set CONFIG_IMX2_WDT=y # CONFIG_IMX7ULP_WDT is not set # CONFIG_ARM_SMC_WATCHDOG is not set # CONFIG_ALIM7101_WDT is not set # CONFIG_I6300ESB_WDT is not set # CONFIG_MEN_A21_WDT is not set # # PCI-based Watchdog Cards # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y # CONFIG_SSB is not set CONFIG_BCMA_POSSIBLE=y # CONFIG_BCMA is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set # CONFIG_MFD_ASIC3 is not set # CONFIG_PMIC_DA903X is not set CONFIG_PMIC_DA9052=y # CONFIG_MFD_DA9052_SPI is not set CONFIG_MFD_DA9052_I2C=y # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_GATEWORKS_GSC is not set CONFIG_MFD_MC13XXX=y CONFIG_MFD_MC13XXX_SPI=y CONFIG_MFD_MC13XXX_I2C=y # CONFIG_MFD_MP2629 is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77620 is not set # CONFIG_MFD_MAX77650 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77714 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_OCELOT is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_CPCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_NTXEC is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_PM8XXX is not set # CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_RK808 is not set # CONFIG_MFD_RN5T618 is not set # CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set CONFIG_MFD_STMPE=y # # STMicroelectronics STMPE Interface Drivers # CONFIG_STMPE_I2C=y # CONFIG_STMPE_SPI is not set # end of STMicroelectronics STMPE Interface Drivers CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TC3589X is not set # 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_VX855 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 # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set CONFIG_MFD_WM8994=y # CONFIG_MFD_ROHM_BD718XX is not set # CONFIG_MFD_ROHM_BD71828 is not set # CONFIG_MFD_ROHM_BD957XMUF is not set # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_MFD_QCOM_PM8008 is not set CONFIG_RAVE_SP_CORE=y # CONFIG_MFD_INTEL_M10_BMC is not set # CONFIG_MFD_RSMU_I2C is not set # CONFIG_MFD_RSMU_SPI is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set CONFIG_REGULATOR_ANATOP=y CONFIG_REGULATOR_DA9052=y # CONFIG_REGULATOR_DA9121 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set # CONFIG_REGULATOR_FAN53880 is not set CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MAX20086 is not set # CONFIG_REGULATOR_MAX77826 is not set CONFIG_REGULATOR_MC13XXX_CORE=y CONFIG_REGULATOR_MC13783=y CONFIG_REGULATOR_MC13892=y # CONFIG_REGULATOR_MCP16502 is not set # CONFIG_REGULATOR_MP5416 is not set # CONFIG_REGULATOR_MP8859 is not set # CONFIG_REGULATOR_MP886X is not set # CONFIG_REGULATOR_MPQ7920 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PF8X00 is not set CONFIG_REGULATOR_PFUZE100=y # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set # CONFIG_REGULATOR_PWM is not set # CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_SY8106A is not set # CONFIG_REGULATOR_SY8824X is not set # CONFIG_REGULATOR_SY8827N is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS6286X is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_VCTRL is not set # CONFIG_REGULATOR_WM8994 is not set CONFIG_RC_CORE=y CONFIG_BPF_LIRC_MODE2=y CONFIG_LIRC=y CONFIG_RC_MAP=y CONFIG_RC_DECODERS=y # CONFIG_IR_IMON_DECODER is not set CONFIG_IR_JVC_DECODER=y CONFIG_IR_MCE_KBD_DECODER=y CONFIG_IR_NEC_DECODER=y CONFIG_IR_RC5_DECODER=y CONFIG_IR_RC6_DECODER=y # CONFIG_IR_RCMM_DECODER is not set CONFIG_IR_SANYO_DECODER=y CONFIG_IR_SHARP_DECODER=y CONFIG_IR_SONY_DECODER=y CONFIG_IR_XMP_DECODER=y CONFIG_RC_DEVICES=y CONFIG_IR_GPIO_CIR=y # CONFIG_IR_GPIO_TX is not set # CONFIG_IR_HIX5HD2 is not set # CONFIG_IR_IGORPLUGUSB is not set # CONFIG_IR_IGUANA is not set # CONFIG_IR_IMON is not set # CONFIG_IR_IMON_RAW is not set # CONFIG_IR_MCEUSB is not set # CONFIG_IR_PWM_TX is not set # CONFIG_IR_REDRAT3 is not set # CONFIG_IR_SERIAL is not set # CONFIG_IR_SPI is not set # CONFIG_IR_STREAMZAP is not set CONFIG_IR_TOY=m # CONFIG_IR_TTUSBIR is not set # CONFIG_RC_ATI_REMOTE is not set # CONFIG_RC_LOOPBACK is not set # CONFIG_RC_XBOX_DVD is not set CONFIG_CEC_CORE=y CONFIG_CEC_NOTIFIER=y # # CEC support # # CONFIG_MEDIA_CEC_RC is not set # CONFIG_MEDIA_CEC_SUPPORT is not set # end of CEC support CONFIG_MEDIA_SUPPORT=y # CONFIG_MEDIA_SUPPORT_FILTER is not set CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y CONFIG_MEDIA_RADIO_SUPPORT=y CONFIG_MEDIA_SDR_SUPPORT=y CONFIG_MEDIA_PLATFORM_SUPPORT=y CONFIG_MEDIA_TEST_SUPPORT=y # end of Media device types # # Media core support # CONFIG_VIDEO_DEV=y # CONFIG_MEDIA_CONTROLLER is not set CONFIG_DVB_CORE=y # end of Media core support # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_V4L2_JPEG_HELPER=y CONFIG_V4L2_MEM2MEM_DEV=y # end of Video4Linux options # # Digital TV options # # CONFIG_DVB_MMAP is not set CONFIG_DVB_NET=y CONFIG_DVB_MAX_ADAPTERS=16 CONFIG_DVB_DYNAMIC_MINORS=y # CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set # CONFIG_DVB_ULE_DEBUG is not set # end of Digital TV options # # Media drivers # # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # CONFIG_USB_GSPCA=m # CONFIG_USB_GSPCA_BENQ is not set # CONFIG_USB_GSPCA_CONEX is not set # CONFIG_USB_GSPCA_CPIA1 is not set # CONFIG_USB_GSPCA_DTCS033 is not set # CONFIG_USB_GSPCA_ETOMS is not set # CONFIG_USB_GSPCA_FINEPIX is not set # CONFIG_USB_GSPCA_JEILINJ is not set # CONFIG_USB_GSPCA_JL2005BCD is not set # CONFIG_USB_GSPCA_KINECT is not set # CONFIG_USB_GSPCA_KONICA is not set # CONFIG_USB_GSPCA_MARS is not set # CONFIG_USB_GSPCA_MR97310A is not set # CONFIG_USB_GSPCA_NW80X is not set # CONFIG_USB_GSPCA_OV519 is not set # CONFIG_USB_GSPCA_OV534 is not set # CONFIG_USB_GSPCA_OV534_9 is not set # CONFIG_USB_GSPCA_PAC207 is not set # CONFIG_USB_GSPCA_PAC7302 is not set # CONFIG_USB_GSPCA_PAC7311 is not set # CONFIG_USB_GSPCA_SE401 is not set # CONFIG_USB_GSPCA_SN9C2028 is not set # CONFIG_USB_GSPCA_SN9C20X is not set # CONFIG_USB_GSPCA_SONIXB is not set # CONFIG_USB_GSPCA_SONIXJ is not set # CONFIG_USB_GSPCA_SPCA1528 is not set # CONFIG_USB_GSPCA_SPCA500 is not set # CONFIG_USB_GSPCA_SPCA501 is not set # CONFIG_USB_GSPCA_SPCA505 is not set # CONFIG_USB_GSPCA_SPCA506 is not set # CONFIG_USB_GSPCA_SPCA508 is not set # CONFIG_USB_GSPCA_SPCA561 is not set # CONFIG_USB_GSPCA_SQ905 is not set # CONFIG_USB_GSPCA_SQ905C is not set # CONFIG_USB_GSPCA_SQ930X is not set # CONFIG_USB_GSPCA_STK014 is not set # CONFIG_USB_GSPCA_STK1135 is not set # CONFIG_USB_GSPCA_STV0680 is not set # CONFIG_USB_GSPCA_SUNPLUS is not set # CONFIG_USB_GSPCA_T613 is not set # CONFIG_USB_GSPCA_TOPRO is not set # CONFIG_USB_GSPCA_TOUPTEK is not set # CONFIG_USB_GSPCA_TV8532 is not set # CONFIG_USB_GSPCA_VC032X is not set # CONFIG_USB_GSPCA_VICAM is not set # CONFIG_USB_GSPCA_XIRLINK_CIT is not set # CONFIG_USB_GSPCA_ZC3XX is not set # CONFIG_USB_GL860 is not set # CONFIG_USB_M5602 is not set # CONFIG_USB_STV06XX is not set # CONFIG_USB_PWC is not set # CONFIG_USB_S2255 is not set # CONFIG_VIDEO_USBTV is not set CONFIG_USB_VIDEO_CLASS=m # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set # # Analog TV USB devices # # CONFIG_VIDEO_GO7007 is not set # CONFIG_VIDEO_HDPVR is not set # CONFIG_VIDEO_PVRUSB2 is not set # CONFIG_VIDEO_STK1160_COMMON is not set # # Analog/digital TV USB devices # # CONFIG_VIDEO_AU0828 is not set # CONFIG_VIDEO_CX231XX is not set # # Digital TV USB devices # # CONFIG_DVB_AS102 is not set # CONFIG_DVB_B2C2_FLEXCOP_USB is not set # CONFIG_DVB_USB_V2 is not set # CONFIG_DVB_USB is not set # CONFIG_SMS_USB_DRV is not set # CONFIG_DVB_TTUSB_BUDGET is not set # CONFIG_DVB_TTUSB_DEC is not set # # Webcam, TV (analog/digital) USB devices # # CONFIG_VIDEO_EM28XX is not set # # Software defined radio USB devices # # CONFIG_USB_AIRSPY is not set # CONFIG_USB_HACKRF is not set # CONFIG_USB_MSI2500 is not set # CONFIG_MEDIA_PCI_SUPPORT is not set CONFIG_RADIO_ADAPTERS=y # CONFIG_RADIO_MAXIRADIO is not set # CONFIG_RADIO_SAA7706H is not set # CONFIG_RADIO_SHARK is not set # CONFIG_RADIO_SHARK2 is not set # CONFIG_RADIO_SI4713 is not set # CONFIG_RADIO_TEA5764 is not set # CONFIG_RADIO_TEF6862 is not set # CONFIG_RADIO_WL1273 is not set # CONFIG_USB_DSBR is not set # CONFIG_USB_KEENE is not set # CONFIG_USB_MA901 is not set # CONFIG_USB_MR800 is not set # CONFIG_USB_RAREMONO is not set # CONFIG_RADIO_SI470X is not set CONFIG_MEDIA_PLATFORM_DRIVERS=y CONFIG_V4L_PLATFORM_DRIVERS=y # CONFIG_SDR_PLATFORM_DRIVERS is not set # CONFIG_DVB_PLATFORM_DRIVERS is not set CONFIG_V4L_MEM2MEM_DRIVERS=y CONFIG_VIDEO_MEM2MEM_DEINTERLACE=m # CONFIG_VIDEO_MUX is not set # # Allegro DVT media platform drivers # # # Amlogic media platform drivers # # # Amphion drivers # # # Aspeed media platform drivers # # CONFIG_VIDEO_ASPEED is not set # # Atmel media platform drivers # # # Cadence media platform drivers # # CONFIG_VIDEO_CADENCE_CSI2RX is not set # CONFIG_VIDEO_CADENCE_CSI2TX is not set # # Chips&Media media platform drivers # CONFIG_VIDEO_CODA=y CONFIG_VIDEO_IMX_VDOA=y # # Intel media platform drivers # # # Marvell media platform drivers # # CONFIG_VIDEO_CAFE_CCIC is not set # # Mediatek media platform drivers # # # NVidia media platform drivers # # # NXP media platform drivers # # CONFIG_VIDEO_IMX_MIPI_CSIS is not set # CONFIG_VIDEO_IMX_PXP is not set # CONFIG_VIDEO_DW100 is not set # CONFIG_VIDEO_IMX8_JPEG is not set # # Qualcomm media platform drivers # # # Renesas media platform drivers # # # Rockchip media platform drivers # # CONFIG_VIDEO_ROCKCHIP_ISP1 is not set # # Samsung media platform drivers # # # STMicroelectronics media platform drivers # # # Sunxi media platform drivers # # # Texas Instruments drivers # # # Verisilicon media platform drivers # # CONFIG_VIDEO_HANTRO is not set # # VIA media platform drivers # # # Xilinx media platform drivers # # CONFIG_VIDEO_XILINX is not set # # MMC/SDIO DVB adapters # # CONFIG_SMS_SDIO_DRV is not set # CONFIG_V4L_TEST_DRIVERS is not set # CONFIG_DVB_TEST_DRIVERS is not set CONFIG_VIDEOBUF2_CORE=y CONFIG_VIDEOBUF2_V4L2=y CONFIG_VIDEOBUF2_MEMOPS=y CONFIG_VIDEOBUF2_DMA_CONTIG=y CONFIG_VIDEOBUF2_VMALLOC=y CONFIG_VIDEOBUF2_DMA_SG=m # end of Media drivers # # Media ancillary drivers # CONFIG_MEDIA_ATTACH=y # # IR I2C driver auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_IR_I2C=y # # Camera sensor devices # # CONFIG_VIDEO_AR0521 is not set # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_HI846 is not set # CONFIG_VIDEO_HI847 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_IMX412 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set # CONFIG_VIDEO_MT9V011 is not set # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set # CONFIG_VIDEO_OV2640 is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5693 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV7251 is not set # CONFIG_VIDEO_OV7640 is not set # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9282 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_M5MOLS is not set # end of Camera sensor devices # # Lens drivers # # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # Audio decoders, processors and mixers # # CONFIG_VIDEO_CS3308 is not set # CONFIG_VIDEO_CS5345 is not set # CONFIG_VIDEO_CS53L32A is not set # CONFIG_VIDEO_MSP3400 is not set # CONFIG_VIDEO_SONY_BTF_MPX is not set # CONFIG_VIDEO_TDA1997X is not set # CONFIG_VIDEO_TDA7432 is not set # CONFIG_VIDEO_TDA9840 is not set # CONFIG_VIDEO_TEA6415C is not set # CONFIG_VIDEO_TEA6420 is not set # CONFIG_VIDEO_TLV320AIC23B is not set # CONFIG_VIDEO_TVAUDIO is not set # CONFIG_VIDEO_UDA1342 is not set # CONFIG_VIDEO_VP27SMPX is not set # CONFIG_VIDEO_WM8739 is not set # CONFIG_VIDEO_WM8775 is not set # end of Audio decoders, processors and mixers # # RDS decoders # # CONFIG_VIDEO_SAA6588 is not set # end of RDS decoders # # Video decoders # # CONFIG_VIDEO_ADV7180 is not set # CONFIG_VIDEO_ADV7183 is not set # CONFIG_VIDEO_ADV748X is not set # CONFIG_VIDEO_ADV7604 is not set # CONFIG_VIDEO_ADV7842 is not set # CONFIG_VIDEO_BT819 is not set # CONFIG_VIDEO_BT856 is not set # CONFIG_VIDEO_BT866 is not set # CONFIG_VIDEO_ISL7998X is not set # CONFIG_VIDEO_KS0127 is not set # CONFIG_VIDEO_MAX9286 is not set # CONFIG_VIDEO_ML86V7667 is not set # CONFIG_VIDEO_SAA7110 is not set # CONFIG_VIDEO_SAA711X is not set # CONFIG_VIDEO_TC358743 is not set # CONFIG_VIDEO_TVP514X is not set # CONFIG_VIDEO_TVP5150 is not set # CONFIG_VIDEO_TVP7002 is not set # CONFIG_VIDEO_TW2804 is not set # CONFIG_VIDEO_TW9903 is not set # CONFIG_VIDEO_TW9906 is not set # CONFIG_VIDEO_TW9910 is not set # CONFIG_VIDEO_VPX3220 is not set # # Video and audio decoders # # CONFIG_VIDEO_SAA717X is not set # CONFIG_VIDEO_CX25840 is not set # end of Video decoders # # Video encoders # # CONFIG_VIDEO_AD9389B is not set # CONFIG_VIDEO_ADV7170 is not set # CONFIG_VIDEO_ADV7175 is not set # CONFIG_VIDEO_ADV7343 is not set # CONFIG_VIDEO_ADV7393 is not set # CONFIG_VIDEO_ADV7511 is not set # CONFIG_VIDEO_AK881X is not set # CONFIG_VIDEO_SAA7127 is not set # CONFIG_VIDEO_SAA7185 is not set # CONFIG_VIDEO_THS8200 is not set # end of Video encoders # # Video improvement chips # # CONFIG_VIDEO_UPD64031A is not set # CONFIG_VIDEO_UPD64083 is not set # end of Video improvement chips # # Audio/Video compression chips # # CONFIG_VIDEO_SAA6752HS is not set # end of Audio/Video compression chips # # SDR tuner chips # # CONFIG_SDR_MAX2175 is not set # end of SDR tuner chips # # Miscellaneous helper chips # # CONFIG_VIDEO_I2C is not set # CONFIG_VIDEO_M52790 is not set # CONFIG_VIDEO_ST_MIPID02 is not set # CONFIG_VIDEO_THS7303 is not set # end of Miscellaneous helper chips # # Media SPI Adapters # # CONFIG_CXD2880_SPI_DRV is not set # CONFIG_VIDEO_GS1662 is not set # end of Media SPI Adapters CONFIG_MEDIA_TUNER=y # # Customize TV tuners # # CONFIG_MEDIA_TUNER_E4000 is not set # CONFIG_MEDIA_TUNER_FC0011 is not set # CONFIG_MEDIA_TUNER_FC0012 is not set # CONFIG_MEDIA_TUNER_FC0013 is not set # CONFIG_MEDIA_TUNER_FC2580 is not set # CONFIG_MEDIA_TUNER_IT913X is not set # CONFIG_MEDIA_TUNER_M88RS6000T is not set # CONFIG_MEDIA_TUNER_MAX2165 is not set CONFIG_MEDIA_TUNER_MC44S803=y # CONFIG_MEDIA_TUNER_MSI001 is not set # CONFIG_MEDIA_TUNER_MT2060 is not set # CONFIG_MEDIA_TUNER_MT2063 is not set CONFIG_MEDIA_TUNER_MT20XX=y # CONFIG_MEDIA_TUNER_MT2131 is not set # CONFIG_MEDIA_TUNER_MT2266 is not set # CONFIG_MEDIA_TUNER_MXL301RF is not set # CONFIG_MEDIA_TUNER_MXL5005S is not set # CONFIG_MEDIA_TUNER_MXL5007T is not set # CONFIG_MEDIA_TUNER_QM1D1B0004 is not set # CONFIG_MEDIA_TUNER_QM1D1C0042 is not set # CONFIG_MEDIA_TUNER_QT1010 is not set # CONFIG_MEDIA_TUNER_R820T is not set # CONFIG_MEDIA_TUNER_SI2157 is not set CONFIG_MEDIA_TUNER_SIMPLE=y # CONFIG_MEDIA_TUNER_TDA18212 is not set # CONFIG_MEDIA_TUNER_TDA18218 is not set # CONFIG_MEDIA_TUNER_TDA18250 is not set CONFIG_MEDIA_TUNER_TDA18271=y CONFIG_MEDIA_TUNER_TDA827X=y CONFIG_MEDIA_TUNER_TDA8290=y CONFIG_MEDIA_TUNER_TDA9887=y CONFIG_MEDIA_TUNER_TEA5761=y CONFIG_MEDIA_TUNER_TEA5767=y # CONFIG_MEDIA_TUNER_TUA9001 is not set CONFIG_MEDIA_TUNER_XC2028=y CONFIG_MEDIA_TUNER_XC4000=y CONFIG_MEDIA_TUNER_XC5000=y # end of Customize TV tuners # # Customise DVB Frontends # # # Multistandard (satellite) frontends # # CONFIG_DVB_M88DS3103 is not set # CONFIG_DVB_MXL5XX is not set # CONFIG_DVB_STB0899 is not set # CONFIG_DVB_STB6100 is not set # CONFIG_DVB_STV090x is not set # CONFIG_DVB_STV0910 is not set # CONFIG_DVB_STV6110x is not set # CONFIG_DVB_STV6111 is not set # # Multistandard (cable + terrestrial) frontends # # CONFIG_DVB_DRXK is not set # CONFIG_DVB_MN88472 is not set # CONFIG_DVB_MN88473 is not set # CONFIG_DVB_SI2165 is not set # CONFIG_DVB_TDA18271C2DD is not set # # DVB-S (satellite) frontends # # CONFIG_DVB_CX24110 is not set # CONFIG_DVB_CX24116 is not set # CONFIG_DVB_CX24117 is not set # CONFIG_DVB_CX24120 is not set # CONFIG_DVB_CX24123 is not set # CONFIG_DVB_DS3000 is not set # CONFIG_DVB_MB86A16 is not set # CONFIG_DVB_MT312 is not set # CONFIG_DVB_S5H1420 is not set # CONFIG_DVB_SI21XX is not set # CONFIG_DVB_STB6000 is not set # CONFIG_DVB_STV0288 is not set # CONFIG_DVB_STV0299 is not set # CONFIG_DVB_STV0900 is not set # CONFIG_DVB_STV6110 is not set # CONFIG_DVB_TDA10071 is not set # CONFIG_DVB_TDA10086 is not set # CONFIG_DVB_TDA8083 is not set # CONFIG_DVB_TDA8261 is not set # CONFIG_DVB_TDA826X is not set # CONFIG_DVB_TS2020 is not set # CONFIG_DVB_TUA6100 is not set # CONFIG_DVB_TUNER_CX24113 is not set # CONFIG_DVB_TUNER_ITD1000 is not set # CONFIG_DVB_VES1X93 is not set # CONFIG_DVB_ZL10036 is not set # CONFIG_DVB_ZL10039 is not set # # DVB-T (terrestrial) frontends # # CONFIG_DVB_AF9013 is not set # CONFIG_DVB_CX22700 is not set # CONFIG_DVB_CX22702 is not set # CONFIG_DVB_CXD2820R is not set # CONFIG_DVB_CXD2841ER is not set # CONFIG_DVB_DIB3000MB is not set # CONFIG_DVB_DIB3000MC is not set # CONFIG_DVB_DIB7000M is not set # CONFIG_DVB_DIB7000P is not set # CONFIG_DVB_DIB9000 is not set # CONFIG_DVB_DRXD is not set # CONFIG_DVB_EC100 is not set # CONFIG_DVB_L64781 is not set # CONFIG_DVB_MT352 is not set # CONFIG_DVB_NXT6000 is not set # CONFIG_DVB_RTL2830 is not set # CONFIG_DVB_RTL2832 is not set # CONFIG_DVB_RTL2832_SDR is not set # CONFIG_DVB_S5H1432 is not set # CONFIG_DVB_SI2168 is not set # CONFIG_DVB_SP887X is not set # CONFIG_DVB_STV0367 is not set # CONFIG_DVB_TDA10048 is not set # CONFIG_DVB_TDA1004X is not set # CONFIG_DVB_ZD1301_DEMOD is not set # CONFIG_DVB_ZL10353 is not set # CONFIG_DVB_CXD2880 is not set # # DVB-C (cable) frontends # # CONFIG_DVB_STV0297 is not set # CONFIG_DVB_TDA10021 is not set # CONFIG_DVB_TDA10023 is not set # CONFIG_DVB_VES1820 is not set # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # # CONFIG_DVB_AU8522_DTV is not set # CONFIG_DVB_AU8522_V4L is not set # CONFIG_DVB_BCM3510 is not set # CONFIG_DVB_LG2160 is not set # CONFIG_DVB_LGDT3305 is not set # CONFIG_DVB_LGDT3306A is not set # CONFIG_DVB_LGDT330X is not set # CONFIG_DVB_MXL692 is not set # CONFIG_DVB_NXT200X is not set # CONFIG_DVB_OR51132 is not set # CONFIG_DVB_OR51211 is not set # CONFIG_DVB_S5H1409 is not set # CONFIG_DVB_S5H1411 is not set # # ISDB-T (terrestrial) frontends # # CONFIG_DVB_DIB8000 is not set # CONFIG_DVB_MB86A20S is not set # CONFIG_DVB_S921 is not set # # ISDB-S (satellite) & ISDB-T (terrestrial) frontends # # CONFIG_DVB_MN88443X is not set # CONFIG_DVB_TC90522 is not set # # Digital terrestrial only tuners/PLL # # CONFIG_DVB_PLL is not set # CONFIG_DVB_TUNER_DIB0070 is not set # CONFIG_DVB_TUNER_DIB0090 is not set # # SEC control devices for DVB-S # # CONFIG_DVB_A8293 is not set # CONFIG_DVB_AF9033 is not set # CONFIG_DVB_ASCOT2E is not set # CONFIG_DVB_ATBM8830 is not set # CONFIG_DVB_HELENE is not set # CONFIG_DVB_HORUS3A is not set # CONFIG_DVB_ISL6405 is not set # CONFIG_DVB_ISL6421 is not set # CONFIG_DVB_ISL6423 is not set # CONFIG_DVB_IX2505V is not set # CONFIG_DVB_LGS8GL5 is not set # CONFIG_DVB_LGS8GXX is not set # CONFIG_DVB_LNBH25 is not set # CONFIG_DVB_LNBH29 is not set # CONFIG_DVB_LNBP21 is not set # CONFIG_DVB_LNBP22 is not set # CONFIG_DVB_M88RS2000 is not set # CONFIG_DVB_TDA665x is not set # CONFIG_DVB_DRX39XYJ is not set # # Common Interface (EN50221) controller drivers # # CONFIG_DVB_CXD2099 is not set # CONFIG_DVB_SP2 is not set # end of Customise DVB Frontends # # Tools to develop new frontends # # CONFIG_DVB_DUMMY_FE is not set # end of Media ancillary drivers # # Graphics support # CONFIG_IMX_IPUV3_CORE=y CONFIG_DRM=y CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DEBUG_MM is not set CONFIG_DRM_KMS_HELPER=y # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set # CONFIG_DRM_DEBUG_MODESET_LOCK is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set # CONFIG_DRM_LOAD_EDID_FIRMWARE is not set CONFIG_DRM_DP_AUX_BUS=y CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_DISPLAY_DP_HELPER=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_GEM_DMA_HELPER=y CONFIG_DRM_SCHED=y # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # end of I2C encoder or helper chips # # ARM devices # # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_KOMEDA is not set # end of ARM devices # CONFIG_DRM_RADEON is not set # CONFIG_DRM_AMDGPU is not set # CONFIG_DRM_NOUVEAU is not set # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set # CONFIG_DRM_EXYNOS is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_AST is not set # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_ARMADA is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_USE_LVDS is not set # CONFIG_DRM_RCAR_USE_MIPI_DSI is not set # CONFIG_DRM_OMAP is not set # CONFIG_DRM_TILCDC is not set # CONFIG_DRM_QXL is not set # CONFIG_DRM_VIRTIO_GPU is not set # CONFIG_DRM_FSL_DCU is not set # CONFIG_DRM_STM is not set CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_ABT_Y030XX067A is not set # CONFIG_DRM_PANEL_ARM_VERSATILE is not set # CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set # CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set # CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set # CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set # CONFIG_DRM_PANEL_DSI_CM is not set CONFIG_DRM_PANEL_LVDS=y CONFIG_DRM_PANEL_SIMPLE=y CONFIG_DRM_PANEL_EDP=y # CONFIG_DRM_PANEL_EBBG_FT8719 is not set # CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set # CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set # CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set # CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set # CONFIG_DRM_PANEL_JDI_R63452 is not set # CONFIG_DRM_PANEL_KHADAS_TS050 is not set # CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set # CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set # CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LB035Q02 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set # CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set # CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set # CONFIG_DRM_PANEL_NOVATEK_NT35560 is not set # CONFIG_DRM_PANEL_NOVATEK_NT35950 is not set # CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set # CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set # CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set # CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set # CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set # CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set # CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set # CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set # CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set # CONFIG_DRM_PANEL_RONBO_RB070D30 is not set # CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set # CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set # CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set # CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set # CONFIG_DRM_PANEL_SHARP_LS060T1SX01 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set # CONFIG_DRM_PANEL_SONY_ACX565AKM is not set # CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 is not set # CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set # CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set # CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set # CONFIG_DRM_PANEL_TPO_TPG110 is not set # CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set # CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set # CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set # CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set # CONFIG_DRM_FSL_LDB is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set # CONFIG_DRM_LONTIUM_LT9611 is not set # CONFIG_DRM_LONTIUM_LT9611UXC is not set # CONFIG_DRM_ITE_IT66121 is not set # CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NWL_MIPI_DSI is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_PARADE_PS8640 is not set # CONFIG_DRM_SIL_SII8620 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_SII9234 is not set # CONFIG_DRM_SIMPLE_BRIDGE is not set # CONFIG_DRM_THINE_THC63LVD1024 is not set # CONFIG_DRM_TOSHIBA_TC358762 is not set # CONFIG_DRM_TOSHIBA_TC358764 is not set CONFIG_DRM_TOSHIBA_TC358767=y # CONFIG_DRM_TOSHIBA_TC358768 is not set # CONFIG_DRM_TOSHIBA_TC358775 is not set # CONFIG_DRM_TI_DLPC3433 is not set # CONFIG_DRM_TI_TFP410 is not set # CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_ANALOGIX_ANX7625 is not set # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_CDNS_MHDP8546 is not set # CONFIG_DRM_IMX8QM_LDB is not set # CONFIG_DRM_IMX8QXP_LDB is not set # CONFIG_DRM_IMX8QXP_PIXEL_COMBINER is not set # CONFIG_DRM_IMX8QXP_PIXEL_LINK_TO_DPI is not set CONFIG_DRM_DW_HDMI=y CONFIG_DRM_DW_HDMI_AHB_AUDIO=y CONFIG_DRM_DW_HDMI_I2S_AUDIO=y # CONFIG_DRM_DW_HDMI_GP_AUDIO is not set CONFIG_DRM_DW_HDMI_CEC=y # end of Display Interface Bridges # CONFIG_DRM_STI is not set CONFIG_DRM_IMX=y CONFIG_DRM_IMX_PARALLEL_DISPLAY=y CONFIG_DRM_IMX_TVE=y CONFIG_DRM_IMX_LDB=y CONFIG_DRM_IMX_HDMI=y CONFIG_DRM_ETNAVIV=y CONFIG_DRM_ETNAVIV_THERMAL=y # CONFIG_DRM_LOGICVC is not set # CONFIG_DRM_MXSFB is not set # CONFIG_DRM_IMX_LCDIF is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_BOCHS is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_PANEL_MIPI_DBI is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9163 is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set # CONFIG_TINYDRM_ILI9486 is not set # CONFIG_TINYDRM_MI0283QT is not set # CONFIG_TINYDRM_REPAPER is not set # CONFIG_TINYDRM_ST7586 is not set # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_TVE200 is not set # CONFIG_DRM_LIMA is not set # CONFIG_DRM_PANFROST is not set # CONFIG_DRM_MCDE is not set # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_DRM_NOMODESET=y # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_IMX is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_UVESA is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_I740 is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_S3 is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VT8623 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_ARK is not set # CONFIG_FB_PM3 is not set # CONFIG_FB_CARMINE is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set # CONFIG_FB_MX3 is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # CONFIG_FB_SM712 is not set # end of Frame buffer Devices # # Backlight & LCD device support # CONFIG_LCD_CLASS_DEVICE=y CONFIG_LCD_L4F00242T03=y # CONFIG_LCD_LMS283GF05 is not set # CONFIG_LCD_LTV350QV is not set # CONFIG_LCD_ILI922X is not set # CONFIG_LCD_ILI9320 is not set # CONFIG_LCD_TDO24M is not set # CONFIG_LCD_VGG2432A4 is not set CONFIG_LCD_PLATFORM=y # CONFIG_LCD_AMS369FG06 is not set # CONFIG_LCD_LMS501KF03 is not set # CONFIG_LCD_HX8357 is not set # CONFIG_LCD_OTM3225A is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_KTD253 is not set CONFIG_BACKLIGHT_PWM=y # CONFIG_BACKLIGHT_DA9052 is not set # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set CONFIG_BACKLIGHT_GPIO=y # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set CONFIG_BACKLIGHT_RAVE_SP=y # CONFIG_BACKLIGHT_LED is not set # end of Backlight & LCD device support CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support # CONFIG_LOGO is not set # end of Graphics support CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y # CONFIG_SND_HRTIMER is not set # CONFIG_SND_DYNAMIC_MINORS is not set CONFIG_SND_SUPPORT_OLD_API=y CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_CTL_INPUT_VALIDATION is not set # CONFIG_SND_SEQUENCER is not set CONFIG_SND_DRIVERS=y # CONFIG_SND_DUMMY is not set # CONFIG_SND_ALOOP is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_SERIAL_GENERIC is not set # CONFIG_SND_MPU401 is not set CONFIG_SND_PCI=y # CONFIG_SND_AD1889 is not set # CONFIG_SND_ATIIXP is not set # CONFIG_SND_ATIIXP_MODEM is not set # CONFIG_SND_AU8810 is not set # CONFIG_SND_AU8820 is not set # CONFIG_SND_AU8830 is not set # CONFIG_SND_AW2 is not set # CONFIG_SND_BT87X is not set # CONFIG_SND_CA0106 is not set # CONFIG_SND_CMIPCI is not set # CONFIG_SND_OXYGEN is not set # CONFIG_SND_CS4281 is not set # CONFIG_SND_CS46XX is not set # CONFIG_SND_CTXFI is not set # CONFIG_SND_DARLA20 is not set # CONFIG_SND_GINA20 is not set # CONFIG_SND_LAYLA20 is not set # CONFIG_SND_DARLA24 is not set # CONFIG_SND_GINA24 is not set # CONFIG_SND_LAYLA24 is not set # CONFIG_SND_MONA is not set # CONFIG_SND_MIA is not set # CONFIG_SND_ECHO3G is not set # CONFIG_SND_INDIGO is not set # CONFIG_SND_INDIGOIO is not set # CONFIG_SND_INDIGODJ is not set # CONFIG_SND_INDIGOIOX is not set # CONFIG_SND_INDIGODJX is not set # CONFIG_SND_ENS1370 is not set # CONFIG_SND_ENS1371 is not set # CONFIG_SND_FM801 is not set # CONFIG_SND_HDSP is not set # CONFIG_SND_HDSPM is not set # CONFIG_SND_ICE1724 is not set # CONFIG_SND_INTEL8X0 is not set # CONFIG_SND_INTEL8X0M is not set # CONFIG_SND_KORG1212 is not set # CONFIG_SND_LOLA is not set # CONFIG_SND_LX6464ES is not set # CONFIG_SND_MIXART is not set # CONFIG_SND_NM256 is not set # CONFIG_SND_PCXHR is not set # CONFIG_SND_RIPTIDE is not set # CONFIG_SND_RME32 is not set # CONFIG_SND_RME96 is not set # CONFIG_SND_RME9652 is not set # CONFIG_SND_SE6X is not set # CONFIG_SND_VIA82XX is not set # CONFIG_SND_VIA82XX_MODEM is not set # CONFIG_SND_VIRTUOSO is not set # CONFIG_SND_VX222 is not set # CONFIG_SND_YMFPCI is not set # # HD-Audio # # CONFIG_SND_HDA_INTEL is not set # end of HD-Audio CONFIG_SND_HDA_PREALLOC_SIZE=64 CONFIG_SND_ARM=y CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=m # CONFIG_SND_USB_UA101 is not set # CONFIG_SND_USB_CAIAQ is not set # CONFIG_SND_USB_6FIRE is not set # CONFIG_SND_USB_HIFACE is not set # CONFIG_SND_BCD2000 is not set # CONFIG_SND_USB_POD is not set # CONFIG_SND_USB_PODHD is not set # CONFIG_SND_USB_TONEPORT is not set # CONFIG_SND_USB_VARIAX is not set CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y # CONFIG_SND_SOC_ADI is not set # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_AMD_ACP_CONFIG is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # CONFIG_SND_SOC_FSL_ASRC=y CONFIG_SND_SOC_FSL_SAI=y # CONFIG_SND_SOC_FSL_MQS is not set # CONFIG_SND_SOC_FSL_AUDMIX is not set CONFIG_SND_SOC_FSL_SSI=y CONFIG_SND_SOC_FSL_SPDIF=y CONFIG_SND_SOC_FSL_ESAI=y # CONFIG_SND_SOC_FSL_MICFIL is not set # CONFIG_SND_SOC_FSL_EASRC is not set CONFIG_SND_SOC_FSL_XCVR=y CONFIG_SND_SOC_FSL_AUD2HTX=y CONFIG_SND_SOC_FSL_UTILS=y CONFIG_SND_SOC_IMX_PCM_DMA=y CONFIG_SND_SOC_IMX_AUDMUX=y CONFIG_SND_IMX_SOC=y # # SoC Audio support for Freescale i.MX boards: # CONFIG_SND_SOC_EUKREA_TLV320=y CONFIG_SND_SOC_IMX_ES8328=y CONFIG_SND_SOC_IMX_SGTL5000=y CONFIG_SND_SOC_IMX_SPDIF=y CONFIG_SND_SOC_FSL_ASOC_CARD=y # CONFIG_SND_SOC_IMX_AUDMIX is not set CONFIG_SND_SOC_IMX_HDMI=m CONFIG_SND_SOC_IMX_CARD=m # end of SoC Audio for Freescale CPUs # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_MTK_BTCVSD is not set # CONFIG_SND_SOC_SOF_TOPLEVEL is not set # # STMicroelectronics STM32 SOC audio support # # end of 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_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # CONFIG_SND_SOC_WM_HUBS=y # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1372_SPI is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set # CONFIG_SND_SOC_ADAU7002 is not set # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4375 is not set CONFIG_SND_SOC_AK4458=m # CONFIG_SND_SOC_AK4554 is not set # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set CONFIG_SND_SOC_AK5558=m # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # 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_CS35L41_SPI is not set # CONFIG_SND_SOC_CS35L41_I2C is not set # CONFIG_SND_SOC_CS35L45_SPI is not set # CONFIG_SND_SOC_CS35L45_I2C 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS42L83 is not set # CONFIG_SND_SOC_CS4234 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # CONFIG_SND_SOC_CS4271_SPI is not set CONFIG_SND_SOC_CS42XX8=y CONFIG_SND_SOC_CS42XX8_I2C=y # 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_CX2072X is not set # CONFIG_SND_SOC_DA7213 is not set # CONFIG_SND_SOC_DMIC is not set CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_ES7134 is not set # CONFIG_SND_SOC_ES7241 is not set # CONFIG_SND_SOC_ES8316 is not set # CONFIG_SND_SOC_ES8326 is not set CONFIG_SND_SOC_ES8328=y CONFIG_SND_SOC_ES8328_I2C=y CONFIG_SND_SOC_ES8328_SPI=y # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_HDA is not set # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set # CONFIG_SND_SOC_MAX98088 is not set # CONFIG_SND_SOC_MAX98357A is not set # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98520 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX98396 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set # CONFIG_SND_SOC_PCM186X_I2C is not set # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set # CONFIG_SND_SOC_PCM5102A 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_RT5640 is not set # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_RT9120 is not set CONFIG_SND_SOC_SGTL5000=y # CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set # CONFIG_SND_SOC_SIMPLE_MUX is not set # CONFIG_SND_SOC_SPDIF is not set # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS2780 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805M is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320ADC3XXX is not set CONFIG_SND_SOC_TLV320AIC23=y CONFIG_SND_SOC_TLV320AIC23_I2C=y # CONFIG_SND_SOC_TLV320AIC23_SPI is not set CONFIG_SND_SOC_TLV320AIC31XX=y # CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set CONFIG_SND_SOC_TLV320AIC3X=y CONFIG_SND_SOC_TLV320AIC3X_I2C=y CONFIG_SND_SOC_TLV320AIC3X_SPI=y # CONFIG_SND_SOC_TLV320ADCX140 is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731_I2C is not set # CONFIG_SND_SOC_WM8731_SPI is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set # 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_WM8940 is not set CONFIG_SND_SOC_WM8960=y CONFIG_SND_SOC_WM8962=y # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set CONFIG_SND_SOC_WM8994=y # CONFIG_SND_SOC_ZL38060 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_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8821 is not set # CONFIG_SND_SOC_NAU8822 is not set # CONFIG_SND_SOC_NAU8824 is not set CONFIG_SND_SOC_TPA6130A2=y # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set # end of CODEC drivers CONFIG_SND_SIMPLE_CARD_UTILS=y CONFIG_SND_SIMPLE_CARD=y # CONFIG_SND_AUDIO_GRAPH_CARD is not set # CONFIG_SND_AUDIO_GRAPH_CARD2 is not set # CONFIG_SND_TEST_COMPONENT is not set # # HID support # CONFIG_HID=y CONFIG_HID_BATTERY_STRENGTH=y CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set # CONFIG_HID_ASUS is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set # CONFIG_HID_BETOP_FF is not set # CONFIG_HID_BIGBEN_FF is not set # CONFIG_HID_CHERRY is not set # CONFIG_HID_CHICONY is not set # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CREATIVE_SB0540 is not set # CONFIG_HID_CYPRESS is not set # CONFIG_HID_DRAGONRISE is not set # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set # CONFIG_HID_EZKEY is not set # CONFIG_HID_FT260 is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_GLORIOUS is not set # CONFIG_HID_HOLTEK is not set # CONFIG_HID_VIVALDI 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_VRC2 is not set # CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set # CONFIG_HID_JABRA is not set # CONFIG_HID_TWINHAN is not set # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LED is not set # CONFIG_HID_LENOVO is not set # CONFIG_HID_LETSKETCH is not set # CONFIG_HID_LOGITECH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set # CONFIG_HID_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set CONFIG_HID_MULTITOUCH=y CONFIG_HID_NINTENDO=m CONFIG_NINTENDO_FF=y # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set # CONFIG_HID_ORTEK is not set CONFIG_HID_OUYA=y # CONFIG_HID_PANTHERLORD is not set # CONFIG_HID_PENMOUNT is not set # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PXRC is not set # CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set # CONFIG_HID_SEMITEK is not set # CONFIG_HID_SIGMAMICRO is not set CONFIG_HID_SONY=y CONFIG_SONY_FF=y # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set # CONFIG_HID_SUNPLUS is not set # CONFIG_HID_RMI is not set # CONFIG_HID_GREENASIA is not set # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set # CONFIG_HID_TOPRE is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set # CONFIG_HID_WIIMOTE is not set # CONFIG_HID_XINMO is not set # CONFIG_HID_ZEROPLUS is not set # CONFIG_HID_ZYDACRON is not set # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set # CONFIG_USB_HIDDEV is not set # end of USB HID support # # I2C HID support # # CONFIG_I2C_HID_OF is not set # CONFIG_I2C_HID_OF_ELAN is not set # CONFIG_I2C_HID_OF_GOODIX is not set # end of I2C HID support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y # CONFIG_USB_LED_TRIG is not set CONFIG_USB_ULPI_BUS=y # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_PCI=y # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_OTG is not set # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set # CONFIG_USB_LEDS_TRIGGER_USBPORT is not set CONFIG_USB_AUTOSUSPEND_DELAY=2 # CONFIG_USB_MON is not set # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set # CONFIG_USB_XHCI_HCD is not set 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 # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set # CONFIG_USB_OHCI_HCD is not set # CONFIG_USB_UHCI_HCD is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # # CONFIG_USB_ACM is not set # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set # CONFIG_USB_UAS is not set # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set CONFIG_USB_CHIPIDEA=y CONFIG_USB_CHIPIDEA_UDC=y CONFIG_USB_CHIPIDEA_HOST=y CONFIG_USB_CHIPIDEA_PCI=y CONFIG_USB_CHIPIDEA_MSM=y CONFIG_USB_CHIPIDEA_IMX=y CONFIG_USB_CHIPIDEA_GENERIC=y CONFIG_USB_CHIPIDEA_TEGRA=y # CONFIG_USB_ISP1760 is not set # # USB port drivers # CONFIG_USB_SERIAL=m CONFIG_USB_SERIAL_GENERIC=y # CONFIG_USB_SERIAL_SIMPLE is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set # CONFIG_USB_SERIAL_CH341 is not set # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set # CONFIG_USB_SERIAL_CP210X is not set # CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_EMPEG is not set CONFIG_USB_SERIAL_FTDI_SIO=m # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_F81232 is not set # CONFIG_USB_SERIAL_F8153X is not set # CONFIG_USB_SERIAL_GARMIN is not set # CONFIG_USB_SERIAL_IPW is not set # CONFIG_USB_SERIAL_IUU is not set # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set # CONFIG_USB_SERIAL_KEYSPAN is not set # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_METRO is not set # CONFIG_USB_SERIAL_MOS7720 is not set # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MXUPORT is not set # CONFIG_USB_SERIAL_NAVMAN is not set # CONFIG_USB_SERIAL_PL2303 is not set # CONFIG_USB_SERIAL_OTI6858 is not set # CONFIG_USB_SERIAL_QCAUX is not set # CONFIG_USB_SERIAL_QUALCOMM is not set # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SAFE is not set # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set CONFIG_USB_SERIAL_WWAN=m CONFIG_USB_SERIAL_OPTION=m # CONFIG_USB_SERIAL_OMNINET is not set # CONFIG_USB_SERIAL_OPTICON is not set # CONFIG_USB_SERIAL_XSENS_MT is not set # CONFIG_USB_SERIAL_WISHBONE is not set # CONFIG_USB_SERIAL_SSU100 is not set # CONFIG_USB_SERIAL_QT2 is not set # CONFIG_USB_SERIAL_UPD78F0730 is not set # CONFIG_USB_SERIAL_XR is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set CONFIG_USB_TEST=m CONFIG_USB_EHSET_TEST_FIXTURE=m # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HUB_USB251XB is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # CONFIG_USB_ONBOARD_HUB is not set # # USB Physical Layer drivers # CONFIG_USB_PHY=y CONFIG_NOP_USB_XCEIV=y # CONFIG_AM335X_PHY_USB is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set CONFIG_USB_MXS_PHY=y # CONFIG_USB_ULPI is not set # end of USB Physical Layer drivers CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GADGET_DEBUG_FILES is not set # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # CONFIG_U_SERIAL_CONSOLE is not set # # USB Peripheral Controller # # CONFIG_USB_FUSB300 is not set # CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set # CONFIG_USB_SNP_UDC_PLAT is not set # CONFIG_USB_M66592 is not set # CONFIG_USB_BDC_UDC is not set # CONFIG_USB_AMD5536UDC is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_NET2280 is not set # CONFIG_USB_GOKU is not set # CONFIG_USB_EG20T is not set # CONFIG_USB_GADGET_XILINX is not set # CONFIG_USB_MAX3420_UDC is not set # CONFIG_USB_DUMMY_HCD is not set # end of USB Peripheral Controller CONFIG_USB_LIBCOMPOSITE=m CONFIG_USB_F_ACM=m CONFIG_USB_F_SS_LB=m CONFIG_USB_U_SERIAL=m CONFIG_USB_U_ETHER=m CONFIG_USB_U_AUDIO=m CONFIG_USB_F_SERIAL=m CONFIG_USB_F_OBEX=m CONFIG_USB_F_NCM=m CONFIG_USB_F_ECM=m CONFIG_USB_F_EEM=m CONFIG_USB_F_SUBSET=m CONFIG_USB_F_RNDIS=m CONFIG_USB_F_MASS_STORAGE=m CONFIG_USB_F_FS=m CONFIG_USB_F_UAC1=m CONFIG_USB_F_UAC2=m CONFIG_USB_F_UVC=m CONFIG_USB_F_MIDI=m CONFIG_USB_F_HID=m CONFIG_USB_F_PRINTER=m CONFIG_USB_CONFIGFS=m CONFIG_USB_CONFIGFS_SERIAL=y CONFIG_USB_CONFIGFS_ACM=y CONFIG_USB_CONFIGFS_OBEX=y CONFIG_USB_CONFIGFS_NCM=y CONFIG_USB_CONFIGFS_ECM=y CONFIG_USB_CONFIGFS_ECM_SUBSET=y CONFIG_USB_CONFIGFS_RNDIS=y CONFIG_USB_CONFIGFS_EEM=y CONFIG_USB_CONFIGFS_MASS_STORAGE=y CONFIG_USB_CONFIGFS_F_LB_SS=y CONFIG_USB_CONFIGFS_F_FS=y CONFIG_USB_CONFIGFS_F_UAC1=y # CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set CONFIG_USB_CONFIGFS_F_UAC2=y CONFIG_USB_CONFIGFS_F_MIDI=y CONFIG_USB_CONFIGFS_F_HID=y CONFIG_USB_CONFIGFS_F_UVC=y CONFIG_USB_CONFIGFS_F_PRINTER=y # # USB Gadget precomposed configurations # CONFIG_USB_ZERO=m CONFIG_USB_AUDIO=m # CONFIG_GADGET_UAC1 is not set CONFIG_USB_ETH=m CONFIG_USB_ETH_RNDIS=y # CONFIG_USB_ETH_EEM is not set CONFIG_USB_G_NCM=m CONFIG_USB_GADGETFS=m CONFIG_USB_FUNCTIONFS=m # CONFIG_USB_FUNCTIONFS_ETH is not set # CONFIG_USB_FUNCTIONFS_RNDIS is not set CONFIG_USB_FUNCTIONFS_GENERIC=y CONFIG_USB_MASS_STORAGE=m CONFIG_USB_G_SERIAL=m # CONFIG_USB_MIDI_GADGET is not set # CONFIG_USB_G_PRINTER is not set # CONFIG_USB_CDC_COMPOSITE is not set # CONFIG_USB_G_ACM_MS is not set # CONFIG_USB_G_MULTI is not set # CONFIG_USB_G_HID is not set # CONFIG_USB_G_DBGP is not set # CONFIG_USB_G_WEBCAM is not set # CONFIG_USB_RAW_GADGET is not set # end of USB Gadget precomposed configurations # CONFIG_TYPEC is not set CONFIG_USB_ROLE_SWITCH=y CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y # CONFIG_PWRSEQ_SD8787 is not set CONFIG_PWRSEQ_SIMPLE=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=8 # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_DEBUG is not set CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_IO_ACCESSORS=y # CONFIG_MMC_SDHCI_PCI is not set CONFIG_MMC_SDHCI_PLTFM=y # CONFIG_MMC_SDHCI_OF_ARASAN is not set # CONFIG_MMC_SDHCI_OF_AT91 is not set # CONFIG_MMC_SDHCI_OF_ESDHC is not set # CONFIG_MMC_SDHCI_OF_DWCMSHC is not set # CONFIG_MMC_SDHCI_CADENCE is not set CONFIG_MMC_SDHCI_ESDHC_IMX=y # CONFIG_MMC_SDHCI_F_SDH30 is not set # CONFIG_MMC_SDHCI_MILBEAUT is not set # CONFIG_MMC_MXC is not set # CONFIG_MMC_TIFM_SD is not set # CONFIG_MMC_SPI is not set # CONFIG_MMC_CB710 is not set # CONFIG_MMC_VIA_SDMMC is not set # CONFIG_MMC_DW is not set # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_CQHCI=y # CONFIG_MMC_HSQ is not set # CONFIG_MMC_TOSHIBA_PCI is not set # CONFIG_MMC_MTK is not set # CONFIG_MMC_SDHCI_XENON is not set # CONFIG_MMC_SDHCI_OMAP is not set # CONFIG_MMC_SDHCI_AM654 is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y # CONFIG_LEDS_CLASS_FLASH is not set # CONFIG_LEDS_CLASS_MULTICOLOR is not set # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_AW2013 is not set # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_EL15203000 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP50XX is not set # CONFIG_LEDS_LP55XX_COMMON is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DA9052 is not set # CONFIG_LEDS_DAC124S085 is not set CONFIG_LEDS_PWM=y # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_MC13783 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_SYSCON is not set # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_SPI_BYTE is not set # CONFIG_LEDS_TI_LMU_COMMON is not set # # Flash and Torch LED drivers # # # RGB LED drivers # # # LED Triggers # CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y # CONFIG_LEDS_TRIGGER_DISK is not set # CONFIG_LEDS_TRIGGER_MTD is not set CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_BACKLIGHT=y # CONFIG_LEDS_TRIGGER_CPU is not set # CONFIG_LEDS_TRIGGER_ACTIVITY is not set CONFIG_LEDS_TRIGGER_GPIO=y # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set # CONFIG_LEDS_TRIGGER_PANIC is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set # CONFIG_LEDS_TRIGGER_AUDIO is not set # CONFIG_LEDS_TRIGGER_TTY is not set # # Simple LED drivers # # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_ATOMIC_SCRUB=y CONFIG_EDAC_SUPPORT=y # CONFIG_EDAC is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y CONFIG_RTC_INTF_DEV_UIE_EMUL=y # CONFIG_RTC_DRV_TEST is not set # # 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=y # CONFIG_RTC_DRV_DS1307_CENTURY is not set # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_HYM8563 is not set # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_NCT3018Y is not set # CONFIG_RTC_DRV_RS5C372 is not set CONFIG_RTC_DRV_ISL1208=y # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set CONFIG_RTC_DRV_PCF8523=y # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set CONFIG_RTC_DRV_PCF8563=y # CONFIG_RTC_DRV_PCF8583 is not set CONFIG_RTC_DRV_M41T80=y # CONFIG_RTC_DRV_M41T80_WDT is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # 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_RV3032 is not set # CONFIG_RTC_DRV_RV8803 is not set # CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_CMOS is not set # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_DA9052 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_IMXDI is not set # CONFIG_RTC_DRV_CADENCE is not set # CONFIG_RTC_DRV_FTRTC010 is not set CONFIG_RTC_DRV_MC13XXX=y CONFIG_RTC_DRV_MXC=y # CONFIG_RTC_DRV_MXC_V2 is not set CONFIG_RTC_DRV_SNVS=y # CONFIG_RTC_DRV_R7301 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_VIRTUAL_CHANNELS=y CONFIG_DMA_OF=y # CONFIG_ALTERA_MSGDMA is not set # CONFIG_DW_AXI_DMAC is not set CONFIG_FSL_EDMA=y # CONFIG_FSL_QDMA is not set # CONFIG_IMX_DMA is not set CONFIG_IMX_SDMA=y # CONFIG_INTEL_IDMA64 is not set CONFIG_MXS_DMA=y CONFIG_MX3_IPU=y CONFIG_MX3_IPU_IRQS=4 # CONFIG_NBPFAXI_DMA is not set # CONFIG_PLX_DMA is not set # CONFIG_XILINX_ZYNQMP_DPDMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set # CONFIG_DW_DMAC is not set # CONFIG_DW_DMAC_PCI is not set # CONFIG_DW_EDMA is not set # CONFIG_DW_EDMA_PCIE is not set # CONFIG_SF_PDMA is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set CONFIG_DMABUF_HEAPS=y # CONFIG_DMABUF_SYSFS_STATS is not set CONFIG_DMABUF_HEAPS_SYSTEM=y CONFIG_DMABUF_HEAPS_CMA=y # end of DMABUF options # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set CONFIG_VIRTIO_MENU=y # CONFIG_VIRTIO_PCI is not set # CONFIG_VIRTIO_MMIO is not set # CONFIG_VDPA is not set CONFIG_VHOST_MENU=y # CONFIG_VHOST_NET is not set # CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set # # Microsoft Hyper-V guest support # # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_RTL8192U is not set # CONFIG_RTLLIB is not set # CONFIG_RTL8723BS is not set # CONFIG_R8712U is not set CONFIG_R8188EU=m # CONFIG_RTS5208 is not set # CONFIG_VT6655 is not set # CONFIG_VT6656 is not set # # IIO staging drivers # # # Accelerometers # # CONFIG_ADIS16203 is not set # CONFIG_ADIS16240 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7816 is not set # end of Analog to digital converters # # Analog digital bi-direction converters # # CONFIG_ADT7316 is not set # end of Analog digital bi-direction converters # # Direct Digital Synthesis # # CONFIG_AD9832 is not set # CONFIG_AD9834 is not set # end of Direct Digital Synthesis # # Network Analyzer, Impedance Converters # # CONFIG_AD5933 is not set # end of Network Analyzer, Impedance Converters # # Active energy metering IC # # CONFIG_ADE7854 is not set # end of Active energy metering IC # # Resolver to digital converters # # CONFIG_AD2S1210 is not set # end of Resolver to digital converters # end of IIO staging drivers # CONFIG_FB_SM750 is not set # CONFIG_STAGING_MEDIA is not set # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_FB_TFT is not set # CONFIG_KS7010 is not set # CONFIG_PI433 is not set # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_FIELDBUS_DEV is not set # CONFIG_QLGE is not set # CONFIG_VME_BUS is not set # CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Clock driver for ARM Reference designs # # CONFIG_CLK_ICST is not set # CONFIG_CLK_SP810 is not set # end of Clock driver for ARM Reference designs # CONFIG_LMK04832 is not set # CONFIG_COMMON_CLK_MAX9485 is not set # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set CONFIG_COMMON_CLK_CS2000_CP=y # CONFIG_COMMON_CLK_AXI_CLKGEN is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_RS9_PCIE is not set # CONFIG_COMMON_CLK_VC5 is not set # CONFIG_COMMON_CLK_VC7 is not set # CONFIG_COMMON_CLK_FIXED_MMIO is not set CONFIG_MXC_CLK=y CONFIG_CLK_IMX6Q=y CONFIG_CLK_IMX6SL=y CONFIG_CLK_IMX6SLL=y CONFIG_CLK_IMX6SX=y CONFIG_CLK_IMX6UL=y # CONFIG_CLK_IMX8MM is not set # CONFIG_CLK_IMX8MN is not set # CONFIG_CLK_IMX8MP is not set # CONFIG_CLK_IMX8MQ is not set # CONFIG_CLK_IMX8ULP is not set # CONFIG_CLK_IMX93 is not set # CONFIG_XILINX_VCU is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set # CONFIG_HWSPINLOCK is not set # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_PROBE=y CONFIG_CLKSRC_MMIO=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y CONFIG_CLKSRC_IMX_GPT=y # CONFIG_MICROCHIP_PIT64B is not set # end of Clock Source drivers # CONFIG_MAILBOX is not set CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # # CONFIG_IOMMU_IO_PGTABLE_LPAE is not set # CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set # CONFIG_ARM_SMMU is not set # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # end of Remoteproc drivers # # Rpmsg drivers # # CONFIG_RPMSG_VIRTIO is not set # end of Rpmsg drivers # CONFIG_SOUNDWIRE is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # end of Amlogic SoC drivers # # Broadcom SoC drivers # # CONFIG_SOC_BRCMSTB is not set # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # CONFIG_QUICC_ENGINE is not set # CONFIG_FSL_RCPM is not set # end of NXP/Freescale QorIQ SoC drivers # # fujitsu SoC drivers # # end of fujitsu SoC drivers # # i.MX SoC drivers # CONFIG_IMX_GPCV2_PM_DOMAINS=y # CONFIG_SOC_IMX8M is not set # CONFIG_SOC_IMX9 is not set # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # CONFIG_LITEX_SOC_CONTROLLER is not set # end of Enable LiteX SoC Builder specific drivers # # Qualcomm SoC drivers # # end of Qualcomm SoC drivers # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers # CONFIG_PM_DEVFREQ is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_FSA9480 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 # CONFIG_MEMORY is not set CONFIG_IIO=y CONFIG_IIO_BUFFER=y # CONFIG_IIO_BUFFER_CB is not set # CONFIG_IIO_BUFFER_DMA is not set # CONFIG_IIO_BUFFER_DMAENGINE is not set # CONFIG_IIO_BUFFER_HW_CONSUMER is not set CONFIG_IIO_KFIFO_BUF=y CONFIG_IIO_TRIGGERED_BUFFER=y # CONFIG_IIO_CONFIGFS is not set CONFIG_IIO_TRIGGER=y CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # CONFIG_IIO_SW_DEVICE is not set # CONFIG_IIO_SW_TRIGGER is not set # CONFIG_IIO_TRIGGERED_EVENT is not set # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADXL313_I2C is not set # CONFIG_ADXL313_SPI is not set # CONFIG_ADXL345_I2C is not set # CONFIG_ADXL345_SPI is not set # CONFIG_ADXL355_I2C is not set # CONFIG_ADXL355_SPI is not set # CONFIG_ADXL367_SPI is not set # CONFIG_ADXL367_I2C is not set # CONFIG_ADXL372_SPI is not set # CONFIG_ADXL372_I2C is not set # CONFIG_BMA180 is not set # CONFIG_BMA220 is not set # CONFIG_BMA400 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_BMI088_ACCEL is not set # CONFIG_DA280 is not set # CONFIG_DA311 is not set # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_DMARD10 is not set # CONFIG_FXLS8962AF_I2C is not set # CONFIG_FXLS8962AF_SPI is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MC3230 is not set # CONFIG_MMA7455_I2C is not set # CONFIG_MMA7455_SPI is not set # CONFIG_MMA7660 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MSA311 is not set # CONFIG_MXC4005 is not set # CONFIG_MXC6255 is not set # CONFIG_SCA3000 is not set # CONFIG_SCA3300 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7091R5 is not set # CONFIG_AD7124 is not set # CONFIG_AD7192 is not set # CONFIG_AD7266 is not set # CONFIG_AD7280 is not set # CONFIG_AD7291 is not set # CONFIG_AD7292 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_AD7780 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD7949 is not set # CONFIG_AD799X is not set # CONFIG_ADI_AXI_ADC is not set # CONFIG_CC10001_ADC is not set # CONFIG_ENVELOPE_DETECTOR is not set # CONFIG_HI8435 is not set # CONFIG_HX711 is not set # CONFIG_INA2XX_ADC is not set CONFIG_IMX7D_ADC=y # CONFIG_IMX8QXP_ADC is not set # CONFIG_LTC2471 is not set # CONFIG_LTC2485 is not set # CONFIG_LTC2496 is not set # CONFIG_LTC2497 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX11100 is not set # CONFIG_MAX1118 is not set # CONFIG_MAX11205 is not set # CONFIG_MAX1241 is not set # CONFIG_MAX1363 is not set # CONFIG_MAX9611 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_MCP3911 is not set # CONFIG_NAU7802 is not set # CONFIG_RICHTEK_RTQ6056 is not set # CONFIG_SD_ADC_MODULATOR is not set # CONFIG_STMPE_ADC is not set # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC0832 is not set # CONFIG_TI_ADC084S021 is not set # CONFIG_TI_ADC12138 is not set # CONFIG_TI_ADC108S102 is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_TI_ADC161S626 is not set # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS7950 is not set # CONFIG_TI_ADS8344 is not set # CONFIG_TI_ADS8688 is not set # CONFIG_TI_ADS124S08 is not set # CONFIG_TI_ADS131E08 is not set # CONFIG_TI_TLC4541 is not set # CONFIG_TI_TSC2046 is not set CONFIG_VF610_ADC=y # CONFIG_XILINX_XADC is not set # end of Analog to digital converters # # Analog to digital and digital to analog converters # # CONFIG_AD74413R is not set # end of Analog to digital and digital to analog converters # # Analog Front Ends # # CONFIG_IIO_RESCALE is not set # end of Analog Front Ends # # Amplifiers # # CONFIG_AD8366 is not set # CONFIG_ADA4250 is not set # CONFIG_HMC425 is not set # end of Amplifiers # # Capacitance to digital converters # # CONFIG_AD7150 is not set # CONFIG_AD7746 is not set # end of Capacitance to digital converters # # Chemical Sensors # # CONFIG_ATLAS_PH_SENSOR is not set # CONFIG_ATLAS_EZO_SENSOR is not set # CONFIG_BME680 is not set # CONFIG_CCS811 is not set # CONFIG_IAQCORE is not set # CONFIG_PMS7003 is not set # CONFIG_SCD30_CORE is not set # CONFIG_SCD4X is not set # CONFIG_SENSIRION_SGP30 is not set # CONFIG_SENSIRION_SGP40 is not set # CONFIG_SPS30_I2C is not set # CONFIG_SPS30_SERIAL is not set # CONFIG_SENSEAIR_SUNRISE_CO2 is not set # CONFIG_VZ89X is not set # end of Chemical Sensors # # Hid Sensor IIO Common # # end of Hid Sensor IIO Common # # IIO SCMI Sensors # # end of IIO SCMI Sensors # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # end of SSP Sensor Common # # Digital to analog converters # # CONFIG_AD3552R is not set # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5592R is not set # CONFIG_AD5593R is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_LTC2688 is not set # CONFIG_AD5686_SPI is not set # CONFIG_AD5696_I2C is not set # CONFIG_AD5755 is not set # CONFIG_AD5758 is not set # CONFIG_AD5761 is not set # CONFIG_AD5764 is not set # CONFIG_AD5766 is not set # CONFIG_AD5770R is not set # CONFIG_AD5791 is not set # CONFIG_AD7293 is not set # CONFIG_AD7303 is not set # CONFIG_AD8801 is not set # CONFIG_DPOT_DAC is not set # CONFIG_DS4424 is not set # CONFIG_LTC1660 is not set # CONFIG_LTC2632 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # 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 # end of Digital to analog converters # # IIO dummy driver # # end of IIO dummy driver # # Filters # # end of Filters # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # end of Clock Generator/Distribution # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # CONFIG_ADF4371 is not set # CONFIG_ADMV1013 is not set # CONFIG_ADMV4420 is not set # CONFIG_ADRF6780 is not set # end of Phase-Locked Loop (PLL) frequency synthesizers # end of Frequency Synthesizers DDS/PLL # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS290 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_FXAS21002C is not set # CONFIG_MPU3050_I2C is not set # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # end of Digital gyroscope sensors # # Health Sensors # # # Heart Rate Monitors # # CONFIG_AFE4403 is not set # CONFIG_AFE4404 is not set # CONFIG_MAX30100 is not set # CONFIG_MAX30102 is not set # end of Heart Rate Monitors # end of Health Sensors # # Humidity sensors # # CONFIG_AM2315 is not set # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HDC2010 is not set # CONFIG_HTS221 is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # end of Humidity sensors # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16460 is not set # CONFIG_ADIS16475 is not set # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set # CONFIG_BOSCH_BNO055_SERIAL is not set # CONFIG_BOSCH_BNO055_I2C is not set # CONFIG_FXOS8700_I2C is not set # CONFIG_FXOS8700_SPI is not set # CONFIG_KMX61 is not set # CONFIG_INV_ICM42600_I2C is not set # CONFIG_INV_ICM42600_SPI is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set # CONFIG_IIO_ST_LSM6DSX is not set # CONFIG_IIO_ST_LSM9DS0 is not set # end of Inertial measurement units # # Light sensors # # CONFIG_ADJD_S311 is not set # CONFIG_ADUX1020 is not set # CONFIG_AL3010 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_AS73211 is not set # CONFIG_BH1750 is not set # CONFIG_BH1780 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM3605 is not set # CONFIG_CM36651 is not set # CONFIG_GP2AP002 is not set # CONFIG_GP2AP020A00F is not set # CONFIG_SENSORS_ISL29018 is not set # CONFIG_SENSORS_ISL29028 is not set # CONFIG_ISL29125 is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_LTRF216A is not set # CONFIG_LV0104CS is not set # CONFIG_MAX44000 is not set # CONFIG_MAX44009 is not set # CONFIG_NOA1305 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1133 is not set # CONFIG_SI1145 is not set # CONFIG_STK3310 is not set # CONFIG_ST_UVIS25 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set # CONFIG_SENSORS_TSL2563 is not set # CONFIG_TSL2583 is not set # CONFIG_TSL2591 is not set # CONFIG_TSL2772 is not set # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VCNL4035 is not set # CONFIG_VEML6030 is not set # CONFIG_VEML6070 is not set # CONFIG_VL6180 is not set # CONFIG_ZOPT2201 is not set # end of Light sensors # # Magnetometer sensors # # CONFIG_AK8974 is not set # CONFIG_AK8975 is not set # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN_I2C is not set # CONFIG_BMC150_MAGN_SPI is not set # CONFIG_MAG3110 is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # CONFIG_SENSORS_RM3100_I2C is not set # CONFIG_SENSORS_RM3100_SPI is not set # CONFIG_YAMAHA_YAS530 is not set # end of Magnetometer sensors # # Multiplexers # # CONFIG_IIO_MUX is not set # end of Multiplexers # # Inclinometer sensors # # end of Inclinometer sensors # # Triggers - standalone # # CONFIG_IIO_INTERRUPT_TRIGGER is not set # CONFIG_IIO_SYSFS_TRIGGER is not set # end of Triggers - standalone # # Linear and angular position sensors # # end of Linear and angular position sensors # # Digital potentiometers # # CONFIG_AD5110 is not set # CONFIG_AD5272 is not set # CONFIG_DS1803 is not set # CONFIG_MAX5432 is not set # CONFIG_MAX5481 is not set # CONFIG_MAX5487 is not set # CONFIG_MCP4018 is not set # CONFIG_MCP4131 is not set # CONFIG_MCP4531 is not set # CONFIG_MCP41010 is not set # CONFIG_TPL0102 is not set # end of Digital potentiometers # # Digital potentiostats # # CONFIG_LMP91000 is not set # end of Digital potentiostats # # Pressure sensors # # CONFIG_ABP060MG is not set # CONFIG_BMP280 is not set # CONFIG_DLHL60D is not set # CONFIG_DPS310 is not set # CONFIG_HP03 is not set # CONFIG_ICP10100 is not set # CONFIG_MPL115_I2C is not set # CONFIG_MPL115_SPI is not set CONFIG_MPL3115=y # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # CONFIG_HP206C is not set # CONFIG_ZPA2326 is not set # end of Pressure sensors # # Lightning sensors # # CONFIG_AS3935 is not set # end of Lightning sensors # # Proximity and distance sensors # # CONFIG_ISL29501 is not set # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_MB1232 is not set # CONFIG_PING is not set # CONFIG_RFD77402 is not set # CONFIG_SRF04 is not set # CONFIG_SX9310 is not set # CONFIG_SX9324 is not set # CONFIG_SX9360 is not set # CONFIG_SX9500 is not set # CONFIG_SRF08 is not set # CONFIG_VCNL3020 is not set # CONFIG_VL53L0X_I2C is not set # end of Proximity and distance sensors # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1200 is not set # end of Resolver to digital converters # # Temperature sensors # # CONFIG_LTC2983 is not set # CONFIG_MAXIM_THERMOCOUPLE is not set # CONFIG_MLX90614 is not set # CONFIG_MLX90632 is not set # CONFIG_TMP006 is not set # CONFIG_TMP007 is not set # CONFIG_TMP117 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_MAX31856 is not set # CONFIG_MAX31865 is not set # end of Temperature sensors # CONFIG_NTB is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_DEBUG is not set # CONFIG_PWM_ATMEL_TCB is not set # CONFIG_PWM_CLK is not set # CONFIG_PWM_DWC is not set CONFIG_PWM_FSL_FTM=y # CONFIG_PWM_IMX1 is not set # CONFIG_PWM_IMX27 is not set # CONFIG_PWM_IMX_TPM is not set # CONFIG_PWM_PCA9685 is not set # CONFIG_PWM_STMPE is not set # CONFIG_PWM_XILINX is not set # # IRQ chip support # CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 # CONFIG_AL_FIC is not set # CONFIG_XILINX_INTC is not set CONFIG_IMX_IRQSTEER=y CONFIG_IMX_INTMUX=y # CONFIG_IMX_MU_MSI is not set # end of IRQ chip support # CONFIG_IPACK_BUS is not set CONFIG_ARCH_HAS_RESET_CONTROLLER=y CONFIG_RESET_CONTROLLER=y # CONFIG_RESET_SIMPLE is not set # CONFIG_RESET_TI_SYSCON is not set # CONFIG_RESET_TI_TPS380X is not set # # PHY Subsystem # # CONFIG_GENERIC_PHY is not set # CONFIG_PHY_CAN_TRANSCEIVER is not set # # PHY drivers for Broadcom platforms # # CONFIG_BCM_KONA_USB2_PHY is not set # end of PHY drivers for Broadcom platforms # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_DPHY_RX is not set # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_CADENCE_SALVO is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_LAN966X_SERDES is not set # CONFIG_PHY_CPCAP_USB is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set # CONFIG_PHY_OCELOT_SERDES is not set # CONFIG_PHY_QCOM_USB_HS is not set # CONFIG_PHY_QCOM_USB_HSIC is not set # CONFIG_PHY_TUSB1210 is not set # end of PHY Subsystem # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCI_PMU is not set # CONFIG_ARM_CCN is not set CONFIG_ARM_PMU=y # CONFIG_FSL_IMX8_DDR_PMU is not set # end of Performance monitor support CONFIG_RAS=y # CONFIG_USB4 is not set # # Android # # CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y # CONFIG_NVMEM_IMX_IIM is not set CONFIG_NVMEM_IMX_OCOTP=y # CONFIG_NVMEM_RAVE_SP_EEPROM is not set # CONFIG_NVMEM_RMEM is not set # CONFIG_NVMEM_SNVS_LPGPR is not set CONFIG_NVMEM_U_BOOT_ENV=m # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_FSI is not set # CONFIG_TEE is not set CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set # CONFIG_PECI is not set # CONFIG_HTE is not set # end of Device Drivers # # 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 CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set # CONFIG_XFS_FS is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_BTRFS_FS_REF_VERIFY is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y # CONFIG_FANOTIFY is not set CONFIG_QUOTA=y CONFIG_QUOTA_NETLINK_INTERFACE=y # CONFIG_PRINT_QUOTA_WARNING is not set # CONFIG_QUOTA_DEBUG is not set # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS4_FS=y CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=m CONFIG_CUSE=m # CONFIG_VIRTIO_FS is not set CONFIG_OVERLAY_FS=m # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_METACOPY is not set # # Caches # # CONFIG_FSCACHE is not set # end of Caches # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=m CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=m # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=m CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set CONFIG_NTFS3_FS=m # CONFIG_NTFS3_LZX_XPRESS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y CONFIG_MEMFD_CREATE=y CONFIG_CONFIGFS_FS=m # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_DEBUG=0 CONFIG_JFFS2_FS_WRITEBUFFER=y # CONFIG_JFFS2_FS_WBUF_VERIFY is not set # CONFIG_JFFS2_SUMMARY is not set # CONFIG_JFFS2_FS_XATTR is not set # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set CONFIG_JFFS2_ZLIB=y CONFIG_JFFS2_RTIME=y CONFIG_UBIFS_FS=y # CONFIG_UBIFS_FS_ADVANCED_COMPR is not set CONFIG_UBIFS_FS_LZO=y CONFIG_UBIFS_FS_ZLIB=y CONFIG_UBIFS_FS_ZSTD=y # CONFIG_UBIFS_ATIME_SUPPORT is not set CONFIG_UBIFS_FS_XATTR=y CONFIG_UBIFS_FS_SECURITY=y # CONFIG_UBIFS_FS_AUTHENTICATION is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y # CONFIG_SQUASHFS_FILE_CACHE is not set CONFIG_SQUASHFS_FILE_DIRECT=y # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y CONFIG_SQUASHFS_XATTR=y CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_PSTORE is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y # CONFIG_NFS_SWAP is not set # CONFIG_NFS_V4_1 is not set CONFIG_ROOT_NFS=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFS_DISABLE_UDP_SUPPORT=y # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set # CONFIG_CIFS is not set # CONFIG_SMB_SERVER is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEY_DH_OPERATIONS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set CONFIG_SECURITYFS=y CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_LSM="yama,loadpin,safesetid,integrity" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_STACK_ALL_PATTERN is not set # CONFIG_INIT_STACK_ALL_ZERO is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization CONFIG_RANDSTRUCT_NONE=y # CONFIG_RANDSTRUCT_FULL is not set # CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y CONFIG_CRYPTO_USER=y CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_ENGINE=y # end of Crypto core or helper # # Public-key cryptography # CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y # CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set CONFIG_CRYPTO_ECC=y CONFIG_CRYPTO_ECDH=y # CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set # end of Public-key cryptography # # Block ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SM4_GENERIC is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set CONFIG_CRYPTO_CTR=y # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y # end of Length-preserving ciphers and modes # # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y # CONFIG_CRYPTO_ESSIV is not set # end of AEAD (authenticated encryption with associated data) ciphers # # Hashes, digests, and MACs # CONFIG_CRYPTO_BLAKE2B=m CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_XCBC is not set CONFIG_CRYPTO_XXHASH=m # end of Hashes, digests, and MACs # # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_CRC32 is not set CONFIG_CRYPTO_CRCT10DIF=y # end of CRCs (cyclic redundancy checks) # # Compression # CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_LZO=y # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set CONFIG_CRYPTO_ZSTD=y # end of Compression # # Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation # # Userspace interface # CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set CONFIG_CRYPTO_USER_API_AEAD=y CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # CONFIG_CRYPTO_STATS is not set # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y # # Accelerated Cryptographic Algorithms for CPU (arm) # CONFIG_CRYPTO_POLY1305_ARM=y CONFIG_CRYPTO_BLAKE2S_ARM=y CONFIG_CRYPTO_SHA1_ARM=y CONFIG_CRYPTO_SHA256_ARM=y CONFIG_CRYPTO_SHA512_ARM=y CONFIG_CRYPTO_AES_ARM=y CONFIG_CRYPTO_CHACHA20_NEON=y # end of Accelerated Cryptographic Algorithms for CPU (arm) CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_HIFN_795X is not set CONFIG_CRYPTO_DEV_FSL_CAAM_COMMON=y CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_DESC=y CONFIG_CRYPTO_DEV_FSL_CAAM_AHASH_API_DESC=y CONFIG_CRYPTO_DEV_FSL_CAAM=y # CONFIG_CRYPTO_DEV_FSL_CAAM_DEBUG is not set CONFIG_CRYPTO_DEV_FSL_CAAM_JR=y CONFIG_CRYPTO_DEV_FSL_CAAM_RINGSIZE=9 # CONFIG_CRYPTO_DEV_FSL_CAAM_INTC is not set CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API=y CONFIG_CRYPTO_DEV_FSL_CAAM_AHASH_API=y CONFIG_CRYPTO_DEV_FSL_CAAM_PKC_API=y CONFIG_CRYPTO_DEV_FSL_CAAM_RNG_API=y CONFIG_CRYPTO_DEV_FSL_CAAM_PRNG_API=y CONFIG_CRYPTO_DEV_SAHARA=y # CONFIG_CRYPTO_DEV_ATMEL_ECC is not set # CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set # CONFIG_CRYPTO_DEV_MXS_DCP is not set # CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set # CONFIG_CRYPTO_DEV_QAT_C3XXX is not set # CONFIG_CRYPTO_DEV_QAT_C62X is not set # CONFIG_CRYPTO_DEV_QAT_4XXX is not set # CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set # CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set # CONFIG_CRYPTO_DEV_QAT_C62XVF is not set # CONFIG_CRYPTO_DEV_SAFEXCEL is not set # CONFIG_CRYPTO_DEV_CCREE is not set # CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS8_PRIVATE_KEY_PARSER=m CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m CONFIG_RAID6_PQ_BENCHMARK=y CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y # CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_STMP_DEVICE=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y # # Crypto library routines # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CHACHA=m CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m CONFIG_CRYPTO_LIB_CURVE25519=m CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y CONFIG_CRYPTO_LIB_POLY1305=m CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_CRC_CCITT=y CONFIG_CRC16=y CONFIG_CRC_T10DIF=y # CONFIG_CRC64_ROCKSOFT is not set CONFIG_CRC_ITU_T=m CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set CONFIG_CRC7=m CONFIG_LIBCRC32C=m # CONFIG_CRC8 is not set CONFIG_XXHASH=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=y CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y CONFIG_XZ_DEC_POWERPC=y CONFIG_XZ_DEC_IA64=y CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y CONFIG_XZ_DEC_SPARC=y # CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_ZSTD=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_DMA_DECLARE_COHERENT=y CONFIG_ARCH_HAS_SETUP_DMA_OPS=y CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_CMA=y # CONFIG_DMA_PERNUMA_CMA is not set # # 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_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y # CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_32=y CONFIG_FONT_SUPPORT=y CONFIG_FONTS=y CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y # CONFIG_FONT_6x11 is not set # CONFIG_FONT_7x14 is not set # CONFIG_FONT_PEARL_8x8 is not set # CONFIG_FONT_ACORN_8x8 is not set # CONFIG_FONT_MINI_4x6 is not set # CONFIG_FONT_6x10 is not set # CONFIG_FONT_10x18 is not set # CONFIG_FONT_SUN8x16 is not set # CONFIG_FONT_SUN12x22 is not set # CONFIG_FONT_TER16x32 is not set # CONFIG_FONT_6x8 is not set CONFIG_SG_POOL=y CONFIG_SBITMAP=y # end of Library routines CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set # CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set # CONFIG_DYNAMIC_DEBUG is not set # CONFIG_DYNAMIC_DEBUG_CORE is not set CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Compile-time checks and compiler options # CONFIG_AS_HAS_NON_CONST_LEB128=y CONFIG_DEBUG_INFO_NONE=y # CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y # CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set # CONFIG_UBSAN is not set CONFIG_HAVE_KCSAN_COMPILER=y # end of Generic Kernel Debugging Instruments # # Networking Debugging # # CONFIG_NET_DEV_REFCNT_TRACKER is not set # CONFIG_NET_NS_REFCNT_TRACKER is not set # CONFIG_DEBUG_NET is not set # end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set # CONFIG_SLUB_DEBUG 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 # CONFIG_DEBUG_WX is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set # CONFIG_DEBUG_VM is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set # CONFIG_DEBUG_KMAP_LOCAL is not set # CONFIG_DEBUG_HIGHMEM is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y # CONFIG_KFENCE is not set # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 # CONFIG_SOFTLOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # # CONFIG_SCHED_DEBUG is not set # CONFIG_SCHEDSTATS is not set # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y CONFIG_PROVE_LOCKING=y # CONFIG_PROVE_RAW_LOCK_NESTING is not set # CONFIG_LOCK_STAT is not set CONFIG_DEBUG_RT_MUTEXES=y CONFIG_DEBUG_SPINLOCK=y CONFIG_DEBUG_MUTEXES=y CONFIG_DEBUG_WW_MUTEX_SLOWPATH=y CONFIG_DEBUG_RWSEMS=y CONFIG_DEBUG_LOCK_ALLOC=y CONFIG_LOCKDEP=y CONFIG_LOCKDEP_BITS=15 CONFIG_LOCKDEP_CHAINS_BITS=16 CONFIG_LOCKDEP_STACK_TRACE_BITS=19 CONFIG_LOCKDEP_STACK_TRACE_HASH_BITS=14 CONFIG_LOCKDEP_CIRCULAR_QUEUE_BITS=12 # CONFIG_DEBUG_LOCKDEP is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # end of Lock Debugging (spinlocks, mutexes, etc...) CONFIG_TRACE_IRQFLAGS=y # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # CONFIG_PROVE_RCU=y # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 CONFIG_RCU_TRACE=y # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_PREEMPTIRQ_TRACEPOINTS=y CONFIG_TRACING=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_SAMPLES is not set # CONFIG_STRICT_DEVMEM is not set # # arm Debugging # # CONFIG_ARM_PTDUMP_DEBUGFS is not set # CONFIG_UNWINDER_FRAME_POINTER is not set CONFIG_UNWINDER_ARM=y CONFIG_ARM_UNWIND=y # CONFIG_BACKTRACE_VERBOSE is not set # CONFIG_DEBUG_USER is not set # CONFIG_DEBUG_LL is not set CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_CORESIGHT is not set # end of arm Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set # CONFIG_TEST_MIN_HEAP is not set # CONFIG_TEST_DIV64 is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_TEST_REF_TRACKER is not set # CONFIG_RBTREE_TEST is not set # CONFIG_REED_SOLOMON_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set # CONFIG_STRING_SELFTEST is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_STRSCPY is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_SCANF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_XARRAY is not set # CONFIG_TEST_MAPLE_TREE is not set # CONFIG_TEST_RHASHTABLE is not set # CONFIG_TEST_SIPHASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_BITOPS is not set # CONFIG_TEST_VMALLOC is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_TEST_BLACKHOLE_DEV is not set # CONFIG_FIND_BIT_BENCHMARK is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_SYSCTL is not set # CONFIG_TEST_UDELAY is not set # CONFIG_TEST_STATIC_KEYS is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMCAT_P is not set # CONFIG_TEST_MEMINIT is not set # CONFIG_TEST_FREE_PAGES is not set CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage # # Rust hacking # # end of Rust hacking # end of Kernel hacking ================================================ FILE: projects/NXP/devices/iMX6/options ================================================ ################################################################################ # setup device defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in arm) TARGET_CPU="cortex-a9" TARGET_FLOAT="hard" TARGET_FPU="neon-vfpv3" ;; esac # Kernel target KERNEL_TARGET="zImage" # kernel serial console EXTRA_CMDLINE="console=ttymxc0,115200 console=tty0" # debug tty path DEBUG_TTY="/dev/ttymxc0" # set the addon project ADDON_PROJECT="ARMv7" ================================================ FILE: projects/NXP/devices/iMX6/patches/kodi/0001-hack-force-YUYV-output-from-v4l2.patch ================================================ From 49cde01c0e015455173ea523d97831a0e5b9c986 Mon Sep 17 00:00:00 2001 From: Lukas Rusak <lorusak@gmail.com> Date: Mon, 15 Feb 2021 11:43:26 -0800 Subject: [PATCH 1/2] [hack] force YUYV output from v4l2 --- .../DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp index 8024c20816..173c67f103 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp @@ -327,6 +327,16 @@ bool CDVDVideoCodecDRMPRIME::Open(CDVDStreamInfo& hints, CDVDCodecOptions& optio for (auto&& option : options.m_keys) av_opt_set(m_pCodecContext, option.m_name.c_str(), option.m_value.c_str(), 0); + int ret = av_opt_set_pixel_fmt(m_pCodecContext, "pixel_format", AV_PIX_FMT_YUYV422, + AV_OPT_SEARCH_CHILDREN); + if (ret < 0) + { + std::array<char, AV_ERROR_MAX_STRING_SIZE> buffer; + av_make_error_string(buffer.data(), buffer.size(), ret); + CLog::Log(LOGDEBUG, "CDVDVideoCodecDRMPRIME::{} - unable to set pixelformat: {}", __FUNCTION__, + buffer.data()); + } + if (avcodec_open2(m_pCodecContext, pCodec, nullptr) < 0) { CLog::Log(LOGINFO, "CDVDVideoCodecDRMPRIME::{} - unable to open codec", __FUNCTION__); -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX6/patches/kodi/0002-hack-disable-use-of-video-plane.patch ================================================ From 87a462afd9ff9f487b2a33f065df775ccfef8af2 Mon Sep 17 00:00:00 2001 From: Lukas Rusak <lorusak@gmail.com> Date: Mon, 15 Feb 2021 14:22:28 -0800 Subject: [PATCH 2/2] [hack] disable use of video plane --- xbmc/windowing/gbm/drm/DRMUtils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xbmc/windowing/gbm/drm/DRMUtils.cpp b/xbmc/windowing/gbm/drm/DRMUtils.cpp index 5593ce086b..603c8265c9 100644 --- a/xbmc/windowing/gbm/drm/DRMUtils.cpp +++ b/xbmc/windowing/gbm/drm/DRMUtils.cpp @@ -184,7 +184,7 @@ bool CDRMUtils::FindPlanes() auto videoPlane = std::find_if(m_planes.begin(), m_planes.end(), [&i](auto& plane) { if (plane->GetPossibleCrtcs() & (1 << i)) { - return plane->SupportsFormat(DRM_FORMAT_NV12); + return false; } return false; }); -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX6/patches/linux/linux-001-imx6qdl-wandboard-revc1-dtsi-bluetooth.patch ================================================ Add MMC power sequence for usdhc2. Add bluetooth node to uart3. --- a/arch/arm/boot/dts/imx6qdl-wandboard-revc1.dtsi +++ b/arch/arm/boot/dts/imx6qdl-wandboard-revc1.dtsi @@ -6,6 +6,15 @@ #include "imx6qdl-wandboard.dtsi" +/ { + pwrseq_usdhc2: usdhc2pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpio1 26 GPIO_ACTIVE_LOW>, /* WL_REG_ON */ + <&gpio5 30 GPIO_ACTIVE_LOW>, /* BT_REG_ON */ + <&gpio5 21 GPIO_ACTIVE_LOW>; /* BT_RST_N */ + }; +}; + &iomuxc { pinctrl-0 = <&pinctrl_hog>; @@ -28,8 +37,15 @@ }; }; +&uart3 { + bluetooth { + compatible = "brcm,bcm4330-bt"; + }; +}; + &usdhc2 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_usdhc2>; + mmc-pwrseq = <&pwrseq_usdhc2>; status = "okay"; }; ================================================ FILE: projects/NXP/devices/iMX6/patches/linux/linux-011-imx6qdl-sr-som-brcm-dtsi-bluetooth.patch ================================================ Add bluetooth node to uart4. --- a/arch/arm/boot/dts/imx6qdl-sr-som-brcm.dtsi +++ b/arch/arm/boot/dts/imx6qdl-sr-som-brcm.dtsi @@ -128,6 +127,10 @@ pinctrl-0 = <&pinctrl_microsom_brcm_bt &pinctrl_microsom_uart4>; uart-has-rtscts; status = "okay"; + + bluetooth { + compatible = "brcm,bcm4330-bt"; + }; }; /* USDHC1 - Connected to optional BRCM Wifi/BT/FM */ ================================================ FILE: projects/NXP/devices/iMX8/bootloader/firmware ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) [ -n "$ATF_PLATFORM" ] && cp -av $(get_install_dir atf)/usr/share/bootloader/bl31.bin . cp -av $(get_build_dir firmware-imx)/firmware/hdmi/cadence/signed_hdmi_imx8m.bin $(get_build_dir $BOOTLOADER)/ cp -av $(get_build_dir firmware-imx)/firmware/ddr/synopsys/lpddr4*.bin $(get_build_dir $BOOTLOADER)/ ================================================ FILE: projects/NXP/devices/iMX8/bootloader/install ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) cp -av flash.bin $INSTALL/usr/share/bootloader/ ================================================ FILE: projects/NXP/devices/iMX8/bootloader/mkimage ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) if [ -f "$RELEASE_DIR/3rdparty/bootloader/flash.bin" ]; then echo "Writing flash.bin to $(basename $DISK)" dd if="$RELEASE_DIR/3rdparty/bootloader/flash.bin" of="$DISK" bs=1024 seek=33 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error fi ================================================ FILE: projects/NXP/devices/iMX8/bootloader/release ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) mkdir -p $RELEASE_DIR/3rdparty/bootloader if [ -n "$UBOOT_SYSTEM" ]; then cp -a $(get_build_dir $BOOTLOADER)/flash.bin $RELEASE_DIR/3rdparty/bootloader/ fi cp -a $(get_build_dir linux)/arch/$TARGET_KERNEL_ARCH/boot/dts/freescale/*.dtb $RELEASE_DIR/3rdparty/bootloader ================================================ FILE: projects/NXP/devices/iMX8/bootloader/update.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) [ -z "$SYSTEM_ROOT" ] && SYSTEM_ROOT="" [ -z "$BOOT_ROOT" ] && BOOT_ROOT="/flash" [ -z "$BOOT_PART" ] && BOOT_PART=$(df "$BOOT_ROOT" | tail -1 | awk {' print $1 '}) if [ -z "$BOOT_DISK" ]; then case $BOOT_PART in /dev/sd[a-z][0-9]*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,[0-9]*,,g") ;; /dev/mmcblk*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,p[0-9]*,,g") ;; esac fi # mount $BOOT_ROOT r/w mount -o remount,rw $BOOT_ROOT # update Device Tree Blobs for all_dtb in /flash/*.dtb; do dtb=$(basename $all_dtb) if [ -f $SYSTEM_ROOT/usr/share/bootloader/$dtb ]; then echo "*** updating Device Tree Blob: $dtb ..." cp -p $SYSTEM_ROOT/usr/share/bootloader/$dtb $BOOT_ROOT fi done # update bootloader files UBOOT="${SYSTEM_ROOT}/usr/share/bootloader/flash.bin" if [ -f "${UBOOT}" ]; then DEVICE="$(basename ${BOOT_DISK})" if grep -q "MMC" /sys/class/block/${DEVICE}/device/type; then echo 0 > /sys/block/${DEVICE}boot0/force_ro echo "*** updating u-boot image on: ${BOOT_DISK}boot0 ..." dd if="${UBOOT}" of="${DEVICE}boot0" bs=1024 seek=33 conv=fsync > /dev/null 2>&1 echo 0 > /sys/block/${DEVICE}boot1/force_ro echo "*** updating u-boot image on: ${BOOT_DISK}boot1 ..." dd if="${UBOOT}" of="${DEVICE}boot1" bs=1024 seek=33 conv=fsync > /dev/null 2>&1 else echo "*** updating u-boot image on: ${BOOT_DISK} ..." dd if="${UBOOT}" of="$BOOT_DISK" bs=1024 seek=33 conv=fsync &>/dev/null fi fi # mount $BOOT_ROOT r/o sync mount -o remount,ro $BOOT_ROOT ================================================ FILE: projects/NXP/devices/iMX8/filesystem/usr/bin/cputemp ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) TEMP="$(cat /sys/class/thermal/thermal_zone0/temp)" echo "$(( $TEMP / 1000 )) C" ================================================ FILE: projects/NXP/devices/iMX8/filesystem/usr/bin/gputemp ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) TEMP="$(cat /sys/class/thermal/thermal_zone1/temp)" echo "$(( $TEMP / 1000 )) C" ================================================ FILE: projects/NXP/devices/iMX8/filesystem/usr/bin/install2emmc ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) TMP=/tmp/mnt/ SYSTEM_SIZE=@SYSTEM_SIZE@ UUID_SYSTEM="$(date '+%d%m')-$(date '+%M%S')" UUID_STORAGE="$(uuidgen)" BOOT=$(grep /flash /proc/mounts | awk '{print $1}' | sed 's/p[012]//g') DISK="" UBOOT="/usr/share/bootloader/flash.bin" if [ ! -f "${UBOOT}" ]; then echo "U-Boot not found. Please update current installation with board specific update or image first." exit 1 fi for TYPE in /sys/class/block/mmcblk*/device/type; do if grep -q "MMC" "${TYPE}"; then DISK="/dev/$(echo "${TYPE}" | awk -F/ '{print $5}')" break fi done if [ -z "${DISK}" ]; then echo "Can't find eMMC module!" exit 1 fi if [ "${BOOT}" = "${DISK}" ]; then echo "Your device is booted from the eMMC module!" exit 1 fi echo "" echo -e "\033[36m===============================" echo "Installing @DISTRONAME@ to eMMC" echo -e "===============================\033[37m" echo "" echo "eMMC found at ${DISK}" echo "" if [ ! -b "${DISK}" ]; then echo "Error: eMMC not found." exit 1 fi echo "" echo -n "WARNING: ALL DATA ON eMMC WILL BE ERASED! Continue (y/N)? " read -n 1 ANSWER if [ ! "${ANSWER}" = "y" ]; then echo "" echo "Aborting..." exit 0 fi echo "" umount ${DISK}* > /dev/null 2>&1 echo "Erasing eMMC ..." dd if=/dev/zero of="${DISK}" bs=1M count=1 conv=fsync > /dev/null 2>&1 echo "Creating partitions" parted -s "${DISK}" mklabel msdos parted -s "${DISK}" -a optimal mkpart primary fat32 0% ${SYSTEM_SIZE}MiB parted -s "${DISK}" set 1 boot on parted -s "${DISK}" -a optimal mkpart primary ext4 ${SYSTEM_SIZE}MiB 100% sync echo "Creating filesystems" dd if=/dev/zero of="${DISK}p1" bs=1M count=1 conv=fsync > /dev/null 2>&1 mkfs.vfat -n SYSTEM -i ${UUID_SYSTEM//-/} ${DISK}p1 > /dev/null 2>&1 dd if=/dev/zero of="${DISK}p2" bs=1M count=1 conv=fsync > /dev/null 2>&1 mkfs.ext4 -L STORAGE -U ${UUID_STORAGE} ${DISK}p2 > /dev/null 2>&1 sync echo "Installing bootloader" echo 0 > /sys/block/mmcblk0boot0/force_ro echo 0 > /sys/block/mmcblk0boot1/force_ro dd if=/dev/zero of="${DISK}boot0" bs=1M count=4 conv=fsync > /dev/null 2>&1 dd if=/dev/zero of="${DISK}boot1" bs=1M count=4 conv=fsync > /dev/null 2>&1 dd if="${UBOOT}" of="${DISK}boot0" bs=1024 seek=33 conv=fsync > /dev/null 2>&1 dd if="${UBOOT}" of="${DISK}boot1" bs=1024 seek=33 conv=fsync > /dev/null 2>&1 echo "Copying system files" mkdir -p ${TMP} mount -t vfat ${DISK}p1 ${TMP} cp -R /flash/. ${TMP}/ sync echo "Adjusting partition UUIDs" sed -i "s/boot=UUID=[0-9a-f\-]*/boot=UUID=${UUID_SYSTEM}/g" ${TMP}/extlinux/extlinux.conf sed -i "s/disk=UUID=[0-9a-f\-]*/disk=UUID=${UUID_STORAGE}/g" ${TMP}/extlinux/extlinux.conf umount ${TMP} echo "Done" ================================================ FILE: projects/NXP/devices/iMX8/linux/linux.aarch64.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm64 6.1.0-rc6 Kernel Configuration # CONFIG_CC_VERSION_TEXT="aarch64-none-elf-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_SYSVIPC_COMPAT=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_IRQ_IPI=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_IRQ_MSI_IOMMU=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_CONTEXT_TRACKING=y CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y # CONFIG_BPF_JIT is not set # CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_BPF_PRELOAD is not set # end of BPF subsystem CONFIG_PREEMPT_VOLUNTARY_BUILD=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set # CONFIG_PREEMPT_DYNAMIC is not set # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_TASKSTATS is not set # CONFIG_PSI is not set # end of CPU/Task time and stats accounting CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem CONFIG_IKCONFIG=m CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=17 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 # CONFIG_PRINTK_INDEX is not set CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # # end of Scheduler features CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_CC_HAS_INT128=y CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set CONFIG_CGROUP_PIDS=y # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y # CONFIG_CGROUP_MISC is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_TIME_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set # CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 # CONFIG_RD_GZIP is not set # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set # CONFIG_RD_LZ4 is not set # CONFIG_RD_ZSTD is not set CONFIG_INITRAMFS_COMPRESSION_NONE=y # CONFIG_BOOT_CONFIG is not set CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_EXPERT=y # CONFIG_UID16 is not set CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set # CONFIG_SYSFS_SYSCALL is not set CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y 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 # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y # CONFIG_PC104 is not set # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_SYSTEM_DATA_VERIFICATION=y CONFIG_PROFILING=y # end of General setup CONFIG_ARM64=y CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_64BIT=y CONFIG_MMU=y CONFIG_ARM64_PAGE_SHIFT=12 CONFIG_ARM64_CONT_PTE_SHIFT=4 CONFIG_ARM64_CONT_PMD_SHIFT=4 CONFIG_ARCH_MMAP_RND_BITS_MIN=18 CONFIG_ARCH_MMAP_RND_BITS_MAX=33 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_NO_IOPORT_MAP=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_LOCKDEP_SUPPORT=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CSUM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y CONFIG_SMP=y CONFIG_KERNEL_MODE_NEON=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_PGTABLE_LEVELS=4 CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_ARCH_PROC_KCORE_TEXT=y # # Platform selection # # CONFIG_ARCH_ACTIONS is not set # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_APPLE is not set # CONFIG_ARCH_BCM is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_BITMAIN is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_SPARX5 is not set # CONFIG_ARCH_K3 is not set # CONFIG_ARCH_LG1K is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_KEEMBAY is not set # CONFIG_ARCH_MEDIATEK is not set # CONFIG_ARCH_MESON is not set # CONFIG_ARCH_MVEBU is not set CONFIG_ARCH_NXP=y # CONFIG_ARCH_LAYERSCAPE is not set CONFIG_ARCH_MXC=y # CONFIG_ARCH_S32 is not set # CONFIG_ARCH_NPCM is not set # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_REALTEK is not set # CONFIG_ARCH_RENESAS is not set # CONFIG_ARCH_ROCKCHIP is not set # CONFIG_ARCH_SEATTLE is not set # CONFIG_ARCH_INTEL_SOCFPGA is not set # CONFIG_ARCH_SYNQUACER is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_SPRD is not set # CONFIG_ARCH_THUNDER is not set # CONFIG_ARCH_THUNDER2 is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_VISCONTI is not set # CONFIG_ARCH_XGENE is not set # CONFIG_ARCH_ZYNQMP is not set # end of Platform selection # # Kernel Features # # # ARM errata workarounds via the alternatives framework # CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y CONFIG_ARM64_ERRATUM_826319=y CONFIG_ARM64_ERRATUM_827319=y CONFIG_ARM64_ERRATUM_824069=y CONFIG_ARM64_ERRATUM_819472=y # CONFIG_ARM64_ERRATUM_832075 is not set # CONFIG_ARM64_ERRATUM_1742098 is not set CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y # CONFIG_ARM64_ERRATUM_1024718 is not set # CONFIG_ARM64_ERRATUM_1418040 is not set CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y # CONFIG_ARM64_ERRATUM_1165522 is not set CONFIG_ARM64_ERRATUM_1319367=y # CONFIG_ARM64_ERRATUM_1530923 is not set # CONFIG_ARM64_ERRATUM_2441007 is not set # CONFIG_ARM64_ERRATUM_1286807 is not set # CONFIG_ARM64_ERRATUM_1463225 is not set # CONFIG_ARM64_ERRATUM_1542419 is not set # CONFIG_ARM64_ERRATUM_1508412 is not set # CONFIG_ARM64_ERRATUM_2051678 is not set # CONFIG_ARM64_ERRATUM_2077057 is not set # CONFIG_ARM64_ERRATUM_2658417 is not set # CONFIG_ARM64_ERRATUM_2054223 is not set # CONFIG_ARM64_ERRATUM_2067961 is not set # CONFIG_ARM64_ERRATUM_2441009 is not set # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set # CONFIG_CAVIUM_ERRATUM_27456 is not set # CONFIG_CAVIUM_ERRATUM_30115 is not set # CONFIG_CAVIUM_TX2_ERRATUM_219 is not set # CONFIG_FUJITSU_ERRATUM_010001 is not set # CONFIG_HISILICON_ERRATUM_161600802 is not set # CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set # CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set # CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set # CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set # CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set # CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set # end of ARM errata workarounds via the alternatives framework CONFIG_ARM64_4K_PAGES=y # CONFIG_ARM64_16K_PAGES is not set # CONFIG_ARM64_64K_PAGES is not set # CONFIG_ARM64_VA_BITS_39 is not set CONFIG_ARM64_VA_BITS_48=y CONFIG_ARM64_VA_BITS=48 CONFIG_ARM64_PA_BITS_48=y CONFIG_ARM64_PA_BITS=48 # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_CPU_LITTLE_ENDIAN=y # CONFIG_SCHED_MC is not set # CONFIG_SCHED_CLUSTER is not set # CONFIG_SCHED_SMT is not set CONFIG_NR_CPUS=8 CONFIG_HOTPLUG_CPU=y # CONFIG_NUMA is not set # CONFIG_HZ_100 is not set # CONFIG_HZ_250 is not set CONFIG_HZ_300=y # CONFIG_HZ_1000 is not set CONFIG_HZ=300 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_HW_PERF_EVENTS=y CONFIG_CC_HAVE_SHADOW_CALL_STACK=y # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_KEXEC is not set # CONFIG_KEXEC_FILE is not set # CONFIG_CRASH_DUMP is not set # CONFIG_XEN is not set CONFIG_ARCH_FORCE_MAX_ORDER=11 CONFIG_UNMAP_KERNEL_AT_EL0=y CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y CONFIG_RODATA_FULL_DEFAULT_ENABLED=y # CONFIG_ARM64_SW_TTBR0_PAN is not set CONFIG_ARM64_TAGGED_ADDR_ABI=y CONFIG_COMPAT=y CONFIG_KUSER_HELPERS=y # CONFIG_COMPAT_ALIGNMENT_FIXUPS is not set CONFIG_ARMV8_DEPRECATED=y CONFIG_SWP_EMULATION=y CONFIG_CP15_BARRIER_EMULATION=y CONFIG_SETEND_EMULATION=y # # ARMv8.1 architectural features # # CONFIG_ARM64_HW_AFDBM is not set # CONFIG_ARM64_PAN is not set CONFIG_AS_HAS_LDAPR=y CONFIG_AS_HAS_LSE_ATOMICS=y # CONFIG_ARM64_USE_LSE_ATOMICS is not set # end of ARMv8.1 architectural features # # ARMv8.2 architectural features # CONFIG_AS_HAS_ARMV8_2=y CONFIG_AS_HAS_SHA3=y # CONFIG_ARM64_PMEM is not set # CONFIG_ARM64_RAS_EXTN is not set # CONFIG_ARM64_CNP is not set # end of ARMv8.2 architectural features # # ARMv8.3 architectural features # # CONFIG_ARM64_PTR_AUTH is not set CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y CONFIG_AS_HAS_PAC=y CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y # end of ARMv8.3 architectural features # # ARMv8.4 architectural features # # CONFIG_ARM64_AMU_EXTN is not set CONFIG_AS_HAS_ARMV8_4=y # CONFIG_ARM64_TLB_RANGE is not set # end of ARMv8.4 architectural features # # ARMv8.5 architectural features # CONFIG_AS_HAS_ARMV8_5=y # CONFIG_ARM64_BTI is not set CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y # CONFIG_ARM64_E0PD is not set CONFIG_ARM64_AS_HAS_MTE=y # end of ARMv8.5 architectural features # # ARMv8.7 architectural features # # end of ARMv8.7 architectural features CONFIG_ARM64_SVE=y CONFIG_ARM64_SME=y CONFIG_ARM64_MODULE_PLTS=y # CONFIG_ARM64_PSEUDO_NMI is not set CONFIG_RELOCATABLE=y # CONFIG_RANDOMIZE_BASE is not set CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y CONFIG_STACKPROTECTOR_PER_TASK=y CONFIG_ARCH_NR_GPIO=0 # end of Kernel Features # # Boot options # CONFIG_CMDLINE="" # CONFIG_EFI is not set # end of Boot options # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_SUSPEND_SKIP_SYNC is not set # CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_USERSPACE_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y # CONFIG_PM_DEBUG is not set CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_PM_GENERIC_DOMAINS_SLEEP=y CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y # end of Power management options # # CPU Power Management # # # CPU Idle # CONFIG_CPU_IDLE=y # CONFIG_CPU_IDLE_GOV_LADDER is not set CONFIG_CPU_IDLE_GOV_MENU=y # CONFIG_CPU_IDLE_GOV_TEO is not set # # ARM CPU Idle Drivers # # CONFIG_ARM_PSCI_CPUIDLE is not set # end of ARM CPU Idle Drivers # end of CPU Idle # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y # CONFIG_CPU_FREQ_GOV_USERSPACE is not set CONFIG_CPU_FREQ_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y CONFIG_CPUFREQ_DT_PLATDEV=y CONFIG_ARM_IMX_CPUFREQ_DT=y # end of CPU Frequency scaling # end of CPU Power Management CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set # # General architecture-dependent options # # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_HAVE_IOREMAP_PROT=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_KEEPINITRD=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y CONFIG_MMU_GATHER_TABLE_FREE=y CONFIG_MMU_GATHER_RCU_TABLE_FREE=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y # CONFIG_SHADOW_CALL_STACK is not set CONFIG_ARCH_SUPPORTS_LTO_CLANG=y CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y CONFIG_LTO_NONE=y CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=18 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y CONFIG_RANDOMIZE_KSTACK_OFFSET=y # CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_COMPILER_H=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_HAS_RELR=y CONFIG_HAVE_PREEMPT_DYNAMIC=y CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_GZIP is not set # CONFIG_MODULE_COMPRESS_XZ is not set # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y # CONFIG_BLOCK_LEGACY_AUTOLOAD is not set CONFIG_BLK_CGROUP_RWSTAT=y CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_ICQ=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_DEV_THROTTLING_LOW is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_CGROUP_IOLATENCY is not set # CONFIG_BLK_CGROUP_IOCOST is not set # CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set CONFIG_LDM_PARTITION=y # CONFIG_LDM_DEBUG is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set # end of Partition Types CONFIG_BLOCK_COMPAT=y CONFIG_BLK_PM=y CONFIG_BLOCK_HOLDER_DEPRECATED=y CONFIG_BLK_MQ_STACKING=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y CONFIG_IOSCHED_BFQ=y # CONFIG_BFQ_GROUP_IOSCHED is not set # end of IO Schedulers CONFIG_PADATA=y CONFIG_ASN1=y CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y CONFIG_ARCH_INLINE_SPIN_LOCK=y CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_SPIN_UNLOCK=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y CONFIG_ARCH_INLINE_READ_LOCK=y CONFIG_ARCH_INLINE_READ_LOCK_BH=y CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_READ_UNLOCK=y CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y CONFIG_ARCH_INLINE_WRITE_LOCK=y CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_WRITE_UNLOCK=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y CONFIG_INLINE_SPIN_TRYLOCK=y CONFIG_INLINE_SPIN_TRYLOCK_BH=y CONFIG_INLINE_SPIN_LOCK=y CONFIG_INLINE_SPIN_LOCK_BH=y CONFIG_INLINE_SPIN_LOCK_IRQ=y CONFIG_INLINE_SPIN_LOCK_IRQSAVE=y CONFIG_INLINE_SPIN_UNLOCK_BH=y CONFIG_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE=y CONFIG_INLINE_READ_LOCK=y CONFIG_INLINE_READ_LOCK_BH=y CONFIG_INLINE_READ_LOCK_IRQ=y CONFIG_INLINE_READ_LOCK_IRQSAVE=y CONFIG_INLINE_READ_UNLOCK=y CONFIG_INLINE_READ_UNLOCK_BH=y CONFIG_INLINE_READ_UNLOCK_IRQ=y CONFIG_INLINE_READ_UNLOCK_IRQRESTORE=y CONFIG_INLINE_WRITE_LOCK=y CONFIG_INLINE_WRITE_LOCK_BH=y CONFIG_INLINE_WRITE_LOCK_IRQ=y CONFIG_INLINE_WRITE_LOCK_IRQSAVE=y CONFIG_INLINE_WRITE_UNLOCK=y CONFIG_INLINE_WRITE_UNLOCK_BH=y CONFIG_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y CONFIG_QUEUED_SPINLOCKS=y CONFIG_ARCH_USE_QUEUED_RWLOCKS=y CONFIG_QUEUED_RWLOCKS=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ARCH_BINFMT_ELF_STATE=y CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y CONFIG_ARCH_HAVE_ELF_PROT=y CONFIG_ARCH_USE_GNU_PROPERTY=y CONFIG_ELFCORE=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set CONFIG_BINFMT_SCRIPT=y # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # CONFIG_SWAP=y # CONFIG_ZSWAP is not set # # SLAB allocator options # # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y # end of SLAB allocator options # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set # CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y CONFIG_ARCH_KEEP_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_COMPACTION=y CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 # CONFIG_PAGE_REPORTING is not set CONFIG_MIGRATION=y CONFIG_ARCH_ENABLE_THP_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_PHYS_ADDR_T_64BIT=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set CONFIG_ARCH_WANTS_THP_SWAP=y CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set CONFIG_THP_SWAP=y # CONFIG_READ_ONLY_THP_FOR_FS is not set CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set CONFIG_CMA_DEBUGFS=y # CONFIG_CMA_SYSFS is not set CONFIG_CMA_AREAS=7 CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y CONFIG_ARCH_HAS_ZONE_DMA_SET=y CONFIG_ZONE_DMA=y CONFIG_ZONE_DMA32=y CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y # CONFIG_ANON_VMA_NAME is not set # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y CONFIG_NET_INGRESS=y CONFIG_NET_EGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_INTERFACE is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_ESP=y # CONFIG_NET_KEY is not set # CONFIG_XDP_SOCKETS is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=m CONFIG_IP_MROUTE_COMMON=y CONFIG_IP_MROUTE=y # CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set # CONFIG_IP_PIMSM_V1 is not set # CONFIG_IP_PIMSM_V2 is not set # CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set CONFIG_INET_ESP=y # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=m CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_INET_UDP_DIAG is not set # CONFIG_INET_RAW_DIAG is not set # CONFIG_INET_DIAG_DESTROY is not set CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set CONFIG_TCP_CONG_CUBIC=y # CONFIG_TCP_CONG_WESTWOOD is not set CONFIG_TCP_CONG_HTCP=m CONFIG_TCP_CONG_HSTCP=m # CONFIG_TCP_CONG_HYBLA is not set CONFIG_TCP_CONG_VEGAS=m # CONFIG_TCP_CONG_NV is not set CONFIG_TCP_CONG_SCALABLE=m # CONFIG_TCP_CONG_LP is not set CONFIG_TCP_CONG_VENO=m CONFIG_TCP_CONG_YEAH=m CONFIG_TCP_CONG_ILLINOIS=m # CONFIG_TCP_CONG_DCTCP is not set CONFIG_TCP_CONG_CDG=m # CONFIG_TCP_CONG_BBR is not set CONFIG_DEFAULT_CUBIC=y # CONFIG_DEFAULT_RENO is not set CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_IPV6_VTI is not set CONFIG_IPV6_SIT=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set CONFIG_IPV6_FOU=m # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set # CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_EGRESS=y CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_FAMILY_BRIDGE=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set CONFIG_NETFILTER_NETLINK_LOG=m # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=m # CONFIG_NF_LOG_SYSLOG is not set # CONFIG_NF_CONNTRACK_MARK is not set # CONFIG_NF_CONNTRACK_ZONES is not set CONFIG_NF_CONNTRACK_PROCFS=y CONFIG_NF_CONNTRACK_EVENTS=y # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set # CONFIG_NF_CT_PROTO_DCCP is not set # CONFIG_NF_CT_PROTO_SCTP is not set # CONFIG_NF_CT_PROTO_UDPLITE is not set # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set CONFIG_NF_CONNTRACK_IRC=m CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set CONFIG_NF_CONNTRACK_SIP=m CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m # CONFIG_NETFILTER_NETLINK_GLUE_CT is not set CONFIG_NF_NAT=m CONFIG_NF_NAT_FTP=m CONFIG_NF_NAT_IRC=m CONFIG_NF_NAT_SIP=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 CONFIG_NETFILTER_XTABLES_COMPAT=y # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set CONFIG_NETFILTER_XT_MATCH_IPRANGE=m CONFIG_NETFILTER_XT_MATCH_IPVS=m # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set CONFIG_NETFILTER_XT_MATCH_OWNER=m # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set CONFIG_NETFILTER_XT_MATCH_STATE=m # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set CONFIG_IP_VS=m # CONFIG_IP_VS_IPV6 is not set # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # CONFIG_IP_VS_PROTO_ESP is not set # CONFIG_IP_VS_PROTO_AH is not set # CONFIG_IP_VS_PROTO_SCTP is not set # # IPVS scheduler # CONFIG_IP_VS_RR=m # CONFIG_IP_VS_WRR is not set # CONFIG_IP_VS_LC is not set # CONFIG_IP_VS_WLC is not set # CONFIG_IP_VS_FO is not set # CONFIG_IP_VS_OVF is not set # CONFIG_IP_VS_LBLC is not set # CONFIG_IP_VS_LBLCR is not set # CONFIG_IP_VS_DH is not set # CONFIG_IP_VS_SH is not set # CONFIG_IP_VS_MH is not set # CONFIG_IP_VS_SED is not set # CONFIG_IP_VS_NQ is not set # CONFIG_IP_VS_TWOS is not set # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS MH scheduler # CONFIG_IP_VS_MH_TAB_INDEX=12 # # IPVS application helper # # CONFIG_IP_VS_FTP is not set CONFIG_IP_VS_NFCT=y # CONFIG_IP_VS_PE_SIP is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set CONFIG_NF_REJECT_IPV4=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_ARPTABLES is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m # CONFIG_NF_LOG_IPV6 is not set CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_MATCH_SRH is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m # CONFIG_IP6_NF_TARGET_NPT is not set # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_CONNTRACK_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y # CONFIG_BRIDGE_MRP is not set # CONFIG_BRIDGE_CFM is not set # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set CONFIG_NET_SCH_FQ_CODEL=y # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set # CONFIG_NET_SCH_DEFAULT is not set # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_TCINDEX is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_RSVP is not set # CONFIG_NET_CLS_RSVP6 is not set # CONFIG_NET_CLS_FLOW is not set CONFIG_NET_CLS_CGROUP=m # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set CONFIG_NET_L3_MASTER_DEV=y # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_STREAM_PARSER is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # end of Network testing # end of Networking options # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=m CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y # CONFIG_BT_BNEP is not set CONFIG_BT_HIDP=m CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_LEDS is not set # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set # CONFIG_BT_DEBUGFS is not set # CONFIG_BT_SELFTEST is not set # # Bluetooth device drivers # 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_MTK is not set 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 is not set # CONFIG_BT_HCIUART_ATH3K is not set # CONFIG_BT_HCIUART_LL is not set CONFIG_BT_HCIUART_3WIRE=y # CONFIG_BT_HCIUART_INTEL is not set CONFIG_BT_HCIUART_BCM=y # CONFIG_BT_HCIUART_RTL is not set CONFIG_BT_HCIUART_QCA=y # CONFIG_BT_HCIUART_AG6XX is not set # CONFIG_BT_HCIUART_MRVL is not set CONFIG_BT_HCIBCM203X=m # CONFIG_BT_HCIBPA10X is not set CONFIG_BT_HCIBFUSB=m # CONFIG_BT_HCIVHCI is not set # CONFIG_BT_MRVL is not set CONFIG_BT_ATH3K=m # CONFIG_BT_MTKSDIO is not set # CONFIG_BT_MTKUART is not set # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y # CONFIG_CFG80211_DEFAULT_PS is not set # CONFIG_CFG80211_DEBUGFS is not set # CONFIG_CFG80211_CRDA_SUPPORT is not set CONFIG_CFG80211_WEXT=y CONFIG_LIB80211=m CONFIG_LIB80211_CRYPT_WEP=m CONFIG_LIB80211_CRYPT_CCMP=m # CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=m CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y CONFIG_RFKILL_GPIO=m # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_PAGE_POOL=y # CONFIG_PAGE_POOL_STATS is not set CONFIG_FAILOVER=y CONFIG_ETHTOOL_NETLINK=y # # Device Drivers # CONFIG_ARM_AMBA=y CONFIG_HAVE_PCI=y # CONFIG_PCI is not set # CONFIG_PCCARD is not set # # Generic Driver Options # # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y # CONFIG_DEVTMPFS_SAFE is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set CONFIG_FW_CACHE=y # CONFIG_FW_UPLOAD is not set # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y # CONFIG_ALLOW_DEV_COREDUMP is not set # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_SOC_BUS=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set CONFIG_GENERIC_ARCH_TOPOLOGY=y # end of Generic Driver Options # # Bus devices # # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_MOXTET is not set # CONFIG_IMX_WEIM is not set # CONFIG_VEXPRESS_CONFIG is not set # CONFIG_MHI_BUS is not set # CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # # CONFIG_ARM_SCMI_PROTOCOL is not set # end of ARM System Control and Management Interface Protocol CONFIG_ARM_SCPI_PROTOCOL=y CONFIG_ARM_SCPI_POWER_DOMAIN=y # CONFIG_FIRMWARE_MEMMAP is not set # CONFIG_ARM_FFA_TRANSPORT is not set # CONFIG_GOOGLE_FIRMWARE is not set CONFIG_IMX_DSP=m CONFIG_IMX_SCU=y CONFIG_IMX_SCU_PD=y CONFIG_ARM_PSCI_FW=y # CONFIG_ARM_PSCI_CHECKER is not set CONFIG_HAVE_ARM_SMCCC=y CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y CONFIG_ARM_SMCCC_SOC_ID=y # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set CONFIG_MTD=y # CONFIG_MTD_TESTS is not set # # Partition parsers # # CONFIG_MTD_AR7_PARTS is not set # CONFIG_MTD_CMDLINE_PARTS is not set CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AFS_PARTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set # end of Partition parsers # # User Modules And Translation Layers # CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y # # Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK. # # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # CONFIG_RFD_FTL is not set # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set # CONFIG_MTD_OOPS is not set # CONFIG_MTD_SWAP is not set # CONFIG_MTD_PARTITIONED_MASTER is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # end of RAM/ROM/Flash chip drivers # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_PLATRAM is not set # end of Mapping drivers for chip access # # Self-contained MTD device drivers # # CONFIG_MTD_DATAFLASH is not set # CONFIG_MTD_MCHP23K256 is not set # CONFIG_MTD_MCHP48L640 is not set # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLOCK2MTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOCG3 is not set # end of Self-contained MTD device drivers # # NAND # # CONFIG_MTD_ONENAND is not set # CONFIG_MTD_RAW_NAND is not set # CONFIG_MTD_SPI_NAND is not set # # ECC engine support # # CONFIG_MTD_NAND_ECC_SW_HAMMING is not set # CONFIG_MTD_NAND_ECC_SW_BCH is not set # CONFIG_MTD_NAND_ECC_MXIC is not set # end of ECC engine support # end of NAND # # LPDDR & LPDDR2 PCM memory drivers # # CONFIG_MTD_LPDDR is not set # end of LPDDR & LPDDR2 PCM memory drivers CONFIG_MTD_SPI_NOR=y CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y # CONFIG_MTD_SPI_NOR_SWP_DISABLE is not set CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y # CONFIG_MTD_SPI_NOR_SWP_KEEP is not set # CONFIG_MTD_UBI is not set # CONFIG_MTD_HYPERBUS is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_DYNAMIC=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_RESERVED_MEM=y CONFIG_OF_RESOLVE=y CONFIG_OF_OVERLAY=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_CDROM=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=0 # CONFIG_BLK_DEV_DRBD is not set CONFIG_BLK_DEV_NBD=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=4096 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_UBLK is not set # # NVME Support # # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set # CONFIG_NVME_TARGET is not set # end of NVME Support # # Misc devices # # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set # CONFIG_XILINX_SDFEC is not set # CONFIG_HISI_HIKEY_USB is not set # CONFIG_OPEN_DICE is not set # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set CONFIG_EEPROM_AT25=m # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # CONFIG_ECHO is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_UACCE is not set # CONFIG_PVPANIC is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=m CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_SCAN_ASYNC is not set # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set CONFIG_SCSI_SAS_ATTRS=y CONFIG_SCSI_SAS_LIBSAS=y CONFIG_SCSI_SAS_HOST_SMP=y # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_DH is not set # end of SCSI device support # CONFIG_ATA is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=m # CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m # CONFIG_DM_UNSTRIPED is not set # CONFIG_DM_CRYPT is not set # CONFIG_DM_SNAPSHOT is not set CONFIG_DM_THIN_PROVISIONING=m # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_EBS is not set # CONFIG_DM_ERA is not set # CONFIG_DM_CLONE is not set # CONFIG_DM_MIRROR is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_DUST is not set # CONFIG_DM_UEVENT is not set # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_DM_INTEGRITY is not set # CONFIG_TARGET_CORE is not set CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set CONFIG_DUMMY=m CONFIG_WIREGUARD=m # CONFIG_WIREGUARD_DEBUG is not set # CONFIG_EQUALIZER is not set # 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 # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_AMT is not set # CONFIG_MACSEC is not set CONFIG_NETCONSOLE=y CONFIG_NETCONSOLE_DYNAMIC=y CONFIG_NETPOLL=y CONFIG_NET_POLL_CONTROLLER=y CONFIG_TUN=y # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m CONFIG_NLMON=m CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_ALACRITECH is not set # CONFIG_ALTERA_TSE is not set # CONFIG_NET_VENDOR_AMAZON is not set # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set # CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_BROADCOM is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CORTINA is not set # CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_ENGLEDER is not set # CONFIG_NET_VENDOR_EZCHIP is not set CONFIG_NET_VENDOR_FREESCALE=y CONFIG_FEC=y # CONFIG_FSL_PQ_MDIO is not set # CONFIG_FSL_XGMAC_MDIO is not set # CONFIG_GIANFAR is not set # CONFIG_FSL_ENETC_IERB is not set # CONFIG_NET_VENDOR_FUNGIBLE is not set CONFIG_NET_VENDOR_GOOGLE=y # CONFIG_NET_VENDOR_HISILICON is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_INTEL is not set # CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_NET_VENDOR_ADI is not set # CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set # CONFIG_NET_VENDOR_MICROSOFT is not set # CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NETRONOME is not set # CONFIG_ETHOC is not set CONFIG_NET_VENDOR_PENSANDO=y # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RENESAS is not set # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set # CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=y # CONFIG_STMMAC_SELFTESTS is not set CONFIG_STMMAC_PLATFORM=y # CONFIG_DWMAC_DWC_QOS_ETH is not set CONFIG_DWMAC_GENERIC=y CONFIG_DWMAC_IMX8=y # CONFIG_DWMAC_INTEL_PLAT is not set # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set CONFIG_NET_VENDOR_XILINX=y # CONFIG_XILINX_EMACLITE is not set # CONFIG_XILINX_AXI_EMAC is not set # CONFIG_XILINX_LL_TEMAC is not set CONFIG_PHYLINK=y CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_SFP is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_ADIN_PHY is not set # CONFIG_ADIN1100_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=m # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM54140_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set # CONFIG_MAXLINEAR_GPHY is not set # CONFIG_MEDIATEK_GE_PHY is not set # CONFIG_MICREL_PHY is not set CONFIG_MICROCHIP_PHY=m # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set # CONFIG_MOTORCOMM_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set CONFIG_AT803X_PHY=y # CONFIG_QSEMI_PHY is not set CONFIG_REALTEK_PHY=y # CONFIG_RENESAS_PHY is not set # CONFIG_ROCKCHIP_PHY is not set CONFIG_SMSC_PHY=m # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_DP83TD510_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set # CONFIG_PSE_CONTROLLER is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_OF_MDIO=y CONFIG_MDIO_DEVRES=y CONFIG_MDIO_BITBANG=y # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MDIO_GPIO is not set # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_OCTEON is not set # CONFIG_MDIO_IPQ4019 is not set # CONFIG_MDIO_IPQ8064 is not set # # MDIO Multiplexers # CONFIG_MDIO_BUS_MUX=y # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set CONFIG_MDIO_BUS_MUX_MMIOREG=y # # PCS device drivers # CONFIG_PCS_XPCS=y # end of PCS device drivers # CONFIG_PPP is not set # CONFIG_SLIP is not set CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set CONFIG_USB_PEGASUS=y CONFIG_USB_RTL8150=y CONFIG_USB_RTL8152=m CONFIG_USB_LAN78XX=m CONFIG_USB_USBNET=m CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m # CONFIG_USB_NET_CDC_EEM is not set # CONFIG_USB_NET_CDC_NCM is not set # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set CONFIG_USB_NET_DM9601=m # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=m # CONFIG_USB_NET_GL620A is not set # CONFIG_USB_NET_NET1080 is not set # CONFIG_USB_NET_PLUSB is not set CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m # CONFIG_USB_NET_CDC_SUBSET is not set CONFIG_USB_NET_ZAURUS=m # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set CONFIG_USB_HSO=m # CONFIG_USB_NET_INT51X1 is not set CONFIG_USB_IPHETH=m # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m # CONFIG_ATH9K_AHB is not set # CONFIG_ATH9K_DEBUGFS is not set # CONFIG_ATH9K_DYNACK is not set # CONFIG_ATH9K_WOW is not set CONFIG_ATH9K_RFKILL=y CONFIG_ATH9K_CHANNEL_CONTEXT=y CONFIG_ATH9K_PCOEM=y CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_ATH9K_HWRNG=y CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y CONFIG_CARL9170_HWRNG=y CONFIG_ATH6KL=m # CONFIG_ATH6KL_SDIO is not set CONFIG_ATH6KL_USB=m # CONFIG_ATH6KL_DEBUG is not set CONFIG_AR5523=m CONFIG_ATH10K=m CONFIG_ATH10K_CE=y CONFIG_ATH10K_SDIO=m CONFIG_ATH10K_USB=m # CONFIG_ATH10K_DEBUG is not set # CONFIG_ATH10K_DEBUGFS is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set CONFIG_WLAN_VENDOR_ATMEL=y # CONFIG_AT76C50X_USB is not set CONFIG_WLAN_VENDOR_BROADCOM=y CONFIG_B43=m CONFIG_B43_BCMA=y CONFIG_B43_SSB=y CONFIG_B43_BUSES_BCMA_AND_SSB=y # CONFIG_B43_BUSES_BCMA is not set # CONFIG_B43_BUSES_SSB is not set # CONFIG_B43_SDIO is not set CONFIG_B43_BCMA_PIO=y CONFIG_B43_PIO=y CONFIG_B43_PHY_G=y CONFIG_B43_PHY_N=y CONFIG_B43_PHY_LP=y CONFIG_B43_PHY_HT=y CONFIG_B43_LEDS=y CONFIG_B43_HWRNG=y # CONFIG_B43_DEBUG is not set # CONFIG_B43LEGACY is not set CONFIG_BRCMUTIL=m # CONFIG_BRCMSMAC is not set CONFIG_BRCMFMAC=m CONFIG_BRCMFMAC_PROTO_BCDC=y CONFIG_BRCMFMAC_SDIO=y CONFIG_BRCMFMAC_USB=y # CONFIG_BRCM_TRACING is not set # CONFIG_BRCMDBG is not set CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_HOSTAP is not set CONFIG_P54_COMMON=m CONFIG_P54_USB=m # CONFIG_P54_SPI is not set CONFIG_P54_LEDS=y CONFIG_WLAN_VENDOR_MARVELL=y # CONFIG_LIBERTAS is not set # CONFIG_LIBERTAS_THINFIRM is not set # CONFIG_MWIFIEX is not set CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m CONFIG_MT76_CORE=m CONFIG_MT76_LEDS=y CONFIG_MT76_USB=m CONFIG_MT76x02_LIB=m CONFIG_MT76x02_USB=m CONFIG_MT76x0_COMMON=m CONFIG_MT76x0U=m CONFIG_MT76x2_COMMON=m CONFIG_MT76x2U=m # CONFIG_MT7663U is not set # CONFIG_MT7663S is not set # CONFIG_MT7921S is not set # CONFIG_MT7921U is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set # CONFIG_WLAN_VENDOR_PURELIFI is not set CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WLAN_VENDOR_REALTEK=y CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y CONFIG_RTL_CARDS=m # CONFIG_RTL8192CU is not set CONFIG_RTL8XXXU=m CONFIG_RTL8XXXU_UNTESTED=y CONFIG_RTW88=m CONFIG_RTW88_CORE=m CONFIG_RTW88_USB=m CONFIG_RTW88_8822B=m CONFIG_RTW88_8822C=m CONFIG_RTW88_8723D=m CONFIG_RTW88_8821C=m # CONFIG_RTW88_8822BS is not set CONFIG_RTW88_8822BU=m # CONFIG_RTW88_8822CS is not set CONFIG_RTW88_8822CU=m CONFIG_RTW88_8723DU=m # CONFIG_RTW88_8821CS is not set CONFIG_RTW88_8821CU=m # CONFIG_RTW88_DEBUG is not set # CONFIG_RTW88_DEBUGFS is not set # CONFIG_RTW89 is not set CONFIG_WLAN_VENDOR_RSI=y # CONFIG_RSI_91X is not set # CONFIG_WLAN_VENDOR_SILABS is not set CONFIG_WLAN_VENDOR_ST=y # CONFIG_CW1200 is not set CONFIG_WLAN_VENDOR_TI=y # CONFIG_WL1251 is not set # CONFIG_WL12XX is not set CONFIG_WL18XX=m CONFIG_WLCORE=m # CONFIG_WLCORE_SPI is not set CONFIG_WLCORE_SDIO=m CONFIG_WILINK_PLATFORM_DATA=y CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_USB_ZD1201=m CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set # CONFIG_WLAN_VENDOR_QUANTENNA is not set # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y # CONFIG_INPUT_MOUSEDEV_PSAUX is not set CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADC is not set # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set # CONFIG_KEYBOARD_ATKBD is not set # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=m # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_SNVS_PWRKEY is not set # CONFIG_KEYBOARD_IMX is not set # CONFIG_KEYBOARD_IMX_SC_KEY is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_PINEPHONE is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CROS_EC is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set # CONFIG_KEYBOARD_CYPRESS_SF is not set CONFIG_INPUT_MOUSE=y # CONFIG_MOUSE_PS2 is not set # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set # CONFIG_MOUSE_CYAPA is not set # CONFIG_MOUSE_ELAN_I2C is not set # CONFIG_MOUSE_VSXXXAA is not set # CONFIG_MOUSE_GPIO is not set # CONFIG_MOUSE_SYNAPTICS_I2C is not set # CONFIG_MOUSE_SYNAPTICS_USB is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADC is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set # CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y CONFIG_JOYSTICK_PSXPAD_SPI=m CONFIG_JOYSTICK_PSXPAD_SPI_FF=y # CONFIG_JOYSTICK_PXRC is not set # CONFIG_JOYSTICK_QWIIC is not set # CONFIG_JOYSTICK_FSIA6B is not set # CONFIG_JOYSTICK_SENSEHAT is not set # CONFIG_INPUT_TABLET is not set # CONFIG_INPUT_TOUCHSCREEN is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ARIZONA_HAPTICS is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set # CONFIG_INPUT_RK805_PWRKEY is not set CONFIG_INPUT_GPIO_ROTARY_ENCODER=m # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IBM_PANEL is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set CONFIG_RMI4_CORE=y # CONFIG_RMI4_I2C is not set # CONFIG_RMI4_SPI is not set # CONFIG_RMI4_SMB is not set CONFIG_RMI4_F03=y CONFIG_RMI4_F03_SERIO=y CONFIG_RMI4_2D_SENSOR=y CONFIG_RMI4_F11=y CONFIG_RMI4_F12=y CONFIG_RMI4_F30=y # CONFIG_RMI4_F34 is not set # CONFIG_RMI4_F3A is not set # CONFIG_RMI4_F55 is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_AMBAKMI is not set # CONFIG_SERIO_LIBPS2 is not set # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_SERIO_GPIO_PS2 is not set # CONFIG_USERIO is not set # CONFIG_GAMEPORT is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y # CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set CONFIG_SERIAL_8250_16550A_VARIANTS=y # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_DMA=y CONFIG_SERIAL_8250_NR_UARTS=1 CONFIG_SERIAL_8250_RUNTIME_UARTS=0 CONFIG_SERIAL_8250_EXTENDED=y # CONFIG_SERIAL_8250_MANY_PORTS is not set CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_RSA is not set CONFIG_SERIAL_8250_DWLIB=y CONFIG_SERIAL_8250_FSL=y CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set CONFIG_SERIAL_OF_PLATFORM=y # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set # CONFIG_SERIAL_AMBA_PL011 is not set # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set CONFIG_SERIAL_IMX=y CONFIG_SERIAL_IMX_CONSOLE=y # CONFIG_SERIAL_IMX_EARLYCON is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_SIFIVE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_NULL_TTY is not set # CONFIG_HVC_DCC is not set CONFIG_SERIAL_DEV_BUS=y CONFIG_SERIAL_DEV_CTRL_TTYPORT=y # CONFIG_TTY_PRINTK is not set # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set # CONFIG_IPMB_DEVICE_INTERFACE is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_BA431 is not set CONFIG_HW_RANDOM_OPTEE=m # CONFIG_HW_RANDOM_CCTRNG is not set # CONFIG_HW_RANDOM_XIPHERA is not set CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=m CONFIG_DEVMEM=y # CONFIG_TCG_TPM is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=m # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_GPMUX is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set # CONFIG_I2C_MUX_PINCTRL is not set # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_DEMUX_PINCTRL is not set # CONFIG_I2C_MUX_MLXCPLD is not set # end of Multiplexer I2C Chip support CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CADENCE is not set # CONFIG_I2C_CBUS_GPIO is not set CONFIG_I2C_DESIGNWARE_CORE=y # CONFIG_I2C_DESIGNWARE_SLAVE is not set CONFIG_I2C_DESIGNWARE_PLATFORM=y # CONFIG_I2C_EMEV2 is not set # CONFIG_I2C_GPIO is not set CONFIG_I2C_IMX=y CONFIG_I2C_IMX_LPI2C=y # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_RK3X is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_CROS_EC_TUNNEL is not set # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set CONFIG_I2C_SLAVE=y # CONFIG_I2C_SLAVE_EEPROM is not set # CONFIG_I2C_SLAVE_TESTUNIT is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y CONFIG_SPI_MEM=y # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set CONFIG_SPI_BITBANG=y # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_CADENCE_QUADSPI is not set # CONFIG_SPI_CADENCE_XSPI is not set # CONFIG_SPI_DESIGNWARE is not set # CONFIG_SPI_FSL_LPSPI is not set # CONFIG_SPI_FSL_QUADSPI is not set # CONFIG_SPI_NXP_FLEXSPI is not set # CONFIG_SPI_GPIO is not set CONFIG_SPI_IMX=y # CONFIG_SPI_FSL_SPI is not set # CONFIG_SPI_MICROCHIP_CORE is not set # CONFIG_SPI_MICROCHIP_CORE_QSPI is not set # CONFIG_SPI_OC_TINY is not set CONFIG_SPI_PL022=y # CONFIG_SPI_ROCKCHIP is not set # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_SIFIVE is not set # CONFIG_SPI_MXIC is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_AMD is not set # # SPI Multiplexer support # # CONFIG_SPI_MUX is not set # # SPI Protocol Masters # # CONFIG_SPI_SPIDEV is not set # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set CONFIG_SPI_DYNAMIC=y # CONFIG_SPMI is not set # CONFIG_HSI is not set CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # # end of PTP clock support CONFIG_PINCTRL=y CONFIG_GENERIC_PINCTRL_GROUPS=y CONFIG_PINMUX=y CONFIG_GENERIC_PINMUX_FUNCTIONS=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_CY8C95X0 is not set # CONFIG_PINCTRL_MCP23S08 is not set # CONFIG_PINCTRL_MICROCHIP_SGPIO is not set # CONFIG_PINCTRL_OCELOT is not set # CONFIG_PINCTRL_RK805 is not set # CONFIG_PINCTRL_SINGLE is not set # CONFIG_PINCTRL_STMFX is not set # CONFIG_PINCTRL_SX150X is not set CONFIG_PINCTRL_IMX=y CONFIG_PINCTRL_IMX_SCU=y CONFIG_PINCTRL_IMX8MM=y # CONFIG_PINCTRL_IMX8MN is not set # CONFIG_PINCTRL_IMX8MP is not set CONFIG_PINCTRL_IMX8MQ=y CONFIG_PINCTRL_IMX8QM=y CONFIG_PINCTRL_IMX8QXP=y # CONFIG_PINCTRL_IMX8DXL is not set # CONFIG_PINCTRL_IMX8ULP is not set # CONFIG_PINCTRL_IMXRT1050 is not set # CONFIG_PINCTRL_IMX93 is not set # CONFIG_PINCTRL_IMXRT1170 is not set # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y CONFIG_GPIO_CDEV=y CONFIG_GPIO_CDEV_V1=y CONFIG_GPIO_GENERIC=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_CADENCE is not set CONFIG_GPIO_DWAPB=y # CONFIG_GPIO_FTGPIO010 is not set CONFIG_GPIO_GENERIC_PLATFORM=y # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HLWD is not set CONFIG_GPIO_IMX_SCU=y # CONFIG_GPIO_LOGICVC is not set # CONFIG_GPIO_MB86S7X is not set CONFIG_GPIO_MXC=y # CONFIG_GPIO_PL061 is not set # CONFIG_GPIO_SIFIVE is not set # CONFIG_GPIO_SYSCON is not set CONFIG_GPIO_VF610=y # CONFIG_GPIO_XGENE is not set # CONFIG_GPIO_XILINX is not set # CONFIG_GPIO_AMD_FCH is not set # end of Memory mapped GPIO drivers # # I2C GPIO expanders # # 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 # CONFIG_GPIO_PCA9570 is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # # CONFIG_GPIO_ARIZONA is not set # CONFIG_GPIO_WM8994 is not set # end of MFD GPIO expanders # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # end of SPI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers # CONFIG_W1 is not set CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_BRCMSTB is not set CONFIG_POWER_RESET_GPIO=y CONFIG_POWER_RESET_GPIO_RESTART=y # CONFIG_POWER_RESET_LTC2952 is not set CONFIG_POWER_RESET_REGULATOR=y # CONFIG_POWER_RESET_RESTART is not set # CONFIG_POWER_RESET_XGENE is not set CONFIG_POWER_RESET_SYSCON=y # CONFIG_POWER_RESET_SYSCON_POWEROFF is not set # CONFIG_SYSCON_REBOOT_MODE is not set # CONFIG_NVMEM_REBOOT_MODE is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set # CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_RK817 is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_CROS_USBPD is not set # CONFIG_CHARGER_CROS_PCHG is not set # CONFIG_CHARGER_UCS1002 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set CONFIG_SENSORS_ARM_SCPI=y # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set CONFIG_SENSORS_GPIO_FAN=m # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IIO_HWMON is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX31730 is not set # CONFIG_SENSORS_MAX31760 is not set # CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_NZXT_KRAKEN2 is not set # CONFIG_SENSORS_NZXT_SMART2 is not set # CONFIG_SENSORS_OCC_P8_I2C is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set CONFIG_SENSORS_PWM_FAN=m # CONFIG_SENSORS_SBTSI is not set # CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y # CONFIG_THERMAL_WRITABLE_TRIPS is not set CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set # CONFIG_CPU_THERMAL is not set # CONFIG_DEVFREQ_THERMAL is not set # CONFIG_THERMAL_EMULATION is not set # CONFIG_THERMAL_MMIO is not set # CONFIG_IMX_THERMAL is not set # CONFIG_IMX_SC_THERMAL is not set # CONFIG_IMX8MM_THERMAL is not set CONFIG_QORIQ_THERMAL=y # CONFIG_GENERIC_ADC_THERMAL is not set CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 # CONFIG_WATCHDOG_SYSFS is not set # CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_ARM_SBSA_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set # CONFIG_MAX63XX_WATCHDOG is not set CONFIG_IMX2_WDT=y # CONFIG_IMX_SC_WDT is not set # CONFIG_IMX7ULP_WDT is not set # CONFIG_ARM_SMC_WATCHDOG is not set # CONFIG_MEN_A21_WDT is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y CONFIG_SSB=m CONFIG_SSB_BLOCKIO=y CONFIG_SSB_SDIOHOST_POSSIBLE=y # CONFIG_SSB_SDIOHOST is not set # CONFIG_SSB_DRIVER_GPIO is not set CONFIG_BCMA_POSSIBLE=y CONFIG_BCMA=m CONFIG_BCMA_BLOCKIO=y # CONFIG_BCMA_HOST_SOC is not set # CONFIG_BCMA_DRIVER_GMAC_CMN is not set # CONFIG_BCMA_DRIVER_GPIO is not set # CONFIG_BCMA_DEBUG is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set CONFIG_MFD_CROS_EC_DEV=y # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_GATEWORKS_GSC is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77620 is not set # CONFIG_MFD_MAX77650 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77714 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_OCELOT is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_CPCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_NTXEC is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set CONFIG_MFD_RK808=y # CONFIG_MFD_RN5T618 is not set CONFIG_MFD_SEC_CORE=y # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # 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=m CONFIG_MFD_ARIZONA_I2C=m CONFIG_MFD_ARIZONA_SPI=m # CONFIG_MFD_CS47L24 is not set CONFIG_MFD_WM5102=y # CONFIG_MFD_WM5110 is not set # CONFIG_MFD_WM8997 is not set # CONFIG_MFD_WM8998 is not set # CONFIG_MFD_WM8400 is not set # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set CONFIG_MFD_WM8994=y CONFIG_MFD_ROHM_BD718XX=y # CONFIG_MFD_ROHM_BD71828 is not set # CONFIG_MFD_ROHM_BD957XMUF is not set # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_MFD_QCOM_PM8008 is not set # CONFIG_RAVE_SP_CORE is not set # CONFIG_MFD_INTEL_M10_BMC is not set # CONFIG_MFD_RSMU_I2C is not set # CONFIG_MFD_RSMU_SPI is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_ANATOP is not set # CONFIG_REGULATOR_ARIZONA_LDO1 is not set # CONFIG_REGULATOR_ARIZONA_MICSUPP is not set # CONFIG_REGULATOR_BD718XX is not set # CONFIG_REGULATOR_CROS_EC is not set # CONFIG_REGULATOR_DA9121 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set # CONFIG_REGULATOR_FAN53880 is not set CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MAX20086 is not set # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MCP16502 is not set # CONFIG_REGULATOR_MP5416 is not set # CONFIG_REGULATOR_MP8859 is not set # CONFIG_REGULATOR_MP886X is not set # CONFIG_REGULATOR_MPQ7920 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PF8X00 is not set CONFIG_REGULATOR_PFUZE100=y # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set # CONFIG_REGULATOR_PWM is not set # CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set # CONFIG_REGULATOR_RK808 is not set # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set # CONFIG_REGULATOR_S2MPA01 is not set # CONFIG_REGULATOR_S2MPS11 is not set # CONFIG_REGULATOR_S5M8767 is not set # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_SY8106A is not set # CONFIG_REGULATOR_SY8824X is not set # CONFIG_REGULATOR_SY8827N is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS6286X is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_VCTRL is not set # CONFIG_REGULATOR_WM8994 is not set CONFIG_RC_CORE=m CONFIG_LIRC=y CONFIG_RC_MAP=m CONFIG_RC_DECODERS=y CONFIG_IR_IMON_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_MCE_KBD_DECODER=m CONFIG_IR_NEC_DECODER=m CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m CONFIG_IR_RCMM_DECODER=m CONFIG_IR_SANYO_DECODER=m CONFIG_IR_SHARP_DECODER=m CONFIG_IR_SONY_DECODER=m CONFIG_IR_XMP_DECODER=m CONFIG_RC_DEVICES=y CONFIG_IR_GPIO_CIR=m CONFIG_IR_GPIO_TX=m # CONFIG_IR_HIX5HD2 is not set CONFIG_IR_IGORPLUGUSB=m CONFIG_IR_IGUANA=m CONFIG_IR_IMON=m CONFIG_IR_IMON_RAW=m CONFIG_IR_MCEUSB=m CONFIG_IR_PWM_TX=m CONFIG_IR_REDRAT3=m # CONFIG_IR_SERIAL is not set # CONFIG_IR_SPI is not set CONFIG_IR_STREAMZAP=m CONFIG_IR_TOY=m CONFIG_IR_TTUSBIR=m CONFIG_RC_ATI_REMOTE=m # CONFIG_RC_LOOPBACK is not set CONFIG_RC_XBOX_DVD=m CONFIG_CEC_CORE=y CONFIG_CEC_NOTIFIER=y # # CEC support # CONFIG_MEDIA_CEC_SUPPORT=y # CONFIG_CEC_CH7322 is not set # CONFIG_CEC_CROS_EC is not set # CONFIG_USB_PULSE8_CEC is not set # CONFIG_USB_RAINSHADOW_CEC is not set # end of CEC support CONFIG_MEDIA_SUPPORT=m # CONFIG_MEDIA_SUPPORT_FILTER is not set CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y CONFIG_MEDIA_RADIO_SUPPORT=y CONFIG_MEDIA_SDR_SUPPORT=y CONFIG_MEDIA_PLATFORM_SUPPORT=y CONFIG_MEDIA_TEST_SUPPORT=y # end of Media device types # # Media core support # CONFIG_VIDEO_DEV=m CONFIG_MEDIA_CONTROLLER=y CONFIG_DVB_CORE=m # end of Media core support # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_VIDEO_TUNER=m CONFIG_V4L2_JPEG_HELPER=m CONFIG_V4L2_H264=m CONFIG_V4L2_VP9=m CONFIG_V4L2_MEM2MEM_DEV=m CONFIG_VIDEOBUF_GEN=m CONFIG_VIDEOBUF_VMALLOC=m # end of Video4Linux options # # Media controller options # CONFIG_MEDIA_CONTROLLER_DVB=y CONFIG_MEDIA_CONTROLLER_REQUEST_API=y # end of Media controller options # # Digital TV options # # CONFIG_DVB_MMAP is not set CONFIG_DVB_NET=y CONFIG_DVB_MAX_ADAPTERS=8 # CONFIG_DVB_DYNAMIC_MINORS is not set # CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set # CONFIG_DVB_ULE_DEBUG is not set # end of Digital TV options # # Media drivers # # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_USB_S2255 is not set CONFIG_VIDEO_USBTV=m CONFIG_USB_VIDEO_CLASS=m # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set # # Analog TV USB devices # # CONFIG_VIDEO_GO7007 is not set CONFIG_VIDEO_HDPVR=m CONFIG_VIDEO_PVRUSB2=m CONFIG_VIDEO_PVRUSB2_SYSFS=y CONFIG_VIDEO_PVRUSB2_DVB=y # CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set CONFIG_VIDEO_STK1160_COMMON=m CONFIG_VIDEO_STK1160=m # # Analog/digital TV USB devices # CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_AU0828_V4L2=y CONFIG_VIDEO_AU0828_RC=y CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y # CONFIG_VIDEO_CX231XX_ALSA is not set CONFIG_VIDEO_CX231XX_DVB=m # # Digital TV USB devices # CONFIG_DVB_AS102=m CONFIG_DVB_B2C2_FLEXCOP_USB=m # CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set CONFIG_DVB_USB_V2=m CONFIG_DVB_USB_AF9015=m CONFIG_DVB_USB_AF9035=m CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_AZ6007=m CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_DVBSKY=m CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_GL861=m CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m CONFIG_DVB_USB_ZD1301=m CONFIG_DVB_USB=m # CONFIG_DVB_USB_DEBUG is not set CONFIG_DVB_USB_A800=m CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_CXUSB=m # CONFIG_DVB_USB_CXUSB_ANALOG is not set CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_DIB3000MC=m CONFIG_DVB_USB_DIBUSB_MB=m CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y CONFIG_DVB_USB_DIBUSB_MC=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_DTT200U=m CONFIG_DVB_USB_DTV5100=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_GP8PSK=m CONFIG_DVB_USB_M920X=m CONFIG_DVB_USB_NOVA_T_USB2=m CONFIG_DVB_USB_OPERA1=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_TTUSB2=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_VP7045=m CONFIG_SMS_USB_DRV=m # # Webcam, TV (analog/digital) USB devices # CONFIG_VIDEO_EM28XX=m # CONFIG_VIDEO_EM28XX_V4L2 is not set # CONFIG_VIDEO_EM28XX_ALSA is not set CONFIG_VIDEO_EM28XX_DVB=m CONFIG_VIDEO_EM28XX_RC=m # # Software defined radio USB devices # # CONFIG_USB_AIRSPY is not set # CONFIG_USB_HACKRF is not set # CONFIG_USB_MSI2500 is not set # CONFIG_RADIO_ADAPTERS is not set CONFIG_MEDIA_PLATFORM_DRIVERS=y # CONFIG_V4L_PLATFORM_DRIVERS is not set # CONFIG_SDR_PLATFORM_DRIVERS is not set # CONFIG_DVB_PLATFORM_DRIVERS is not set CONFIG_V4L_MEM2MEM_DRIVERS=y CONFIG_VIDEO_MEM2MEM_DEINTERLACE=m # # Allegro DVT media platform drivers # # # Amlogic media platform drivers # # # Amphion drivers # # CONFIG_VIDEO_AMPHION_VPU is not set # # Aspeed media platform drivers # # # Atmel media platform drivers # # # Cadence media platform drivers # # CONFIG_VIDEO_CADENCE_CSI2RX is not set # CONFIG_VIDEO_CADENCE_CSI2TX is not set # # Chips&Media media platform drivers # # CONFIG_VIDEO_CODA is not set # # Intel media platform drivers # # # Marvell media platform drivers # # # Mediatek media platform drivers # # # NVidia media platform drivers # # # NXP media platform drivers # # CONFIG_VIDEO_IMX_MIPI_CSIS is not set # CONFIG_VIDEO_IMX_PXP is not set # CONFIG_VIDEO_DW100 is not set CONFIG_VIDEO_IMX8_JPEG=m # # Qualcomm media platform drivers # # # Renesas media platform drivers # # # Rockchip media platform drivers # # # Samsung media platform drivers # # # STMicroelectronics media platform drivers # # # Sunxi media platform drivers # # # Texas Instruments drivers # # # Verisilicon media platform drivers # CONFIG_VIDEO_HANTRO=m CONFIG_VIDEO_HANTRO_IMX8M=y # # VIA media platform drivers # # # Xilinx media platform drivers # # # MMC/SDIO DVB adapters # # CONFIG_SMS_SDIO_DRV is not set # CONFIG_V4L_TEST_DRIVERS is not set # CONFIG_DVB_TEST_DRIVERS is not set CONFIG_MEDIA_COMMON_OPTIONS=y # # common driver options # CONFIG_CYPRESS_FIRMWARE=m CONFIG_TTPCI_EEPROM=m CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_SMS_SIANO_MDTV=m CONFIG_SMS_SIANO_RC=y CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_DMA_CONTIG=m CONFIG_VIDEOBUF2_VMALLOC=m # end of Media drivers # # Media ancillary drivers # CONFIG_MEDIA_ATTACH=y # # IR I2C driver auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_IR_I2C=m # # Camera sensor devices # # CONFIG_VIDEO_AR0521 is not set # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_HI846 is not set # CONFIG_VIDEO_HI847 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_IMX412 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set # CONFIG_VIDEO_MT9V011 is not set # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set # CONFIG_VIDEO_OV2640 is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5693 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV7251 is not set # CONFIG_VIDEO_OV7640 is not set # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9282 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_M5MOLS is not set # end of Camera sensor devices # # Lens drivers # # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # Audio decoders, processors and mixers # # CONFIG_VIDEO_CS3308 is not set # CONFIG_VIDEO_CS5345 is not set CONFIG_VIDEO_CS53L32A=m CONFIG_VIDEO_MSP3400=m # CONFIG_VIDEO_SONY_BTF_MPX is not set # CONFIG_VIDEO_TDA1997X is not set # CONFIG_VIDEO_TDA7432 is not set # CONFIG_VIDEO_TDA9840 is not set # CONFIG_VIDEO_TEA6415C is not set # CONFIG_VIDEO_TEA6420 is not set # CONFIG_VIDEO_TLV320AIC23B is not set # CONFIG_VIDEO_TVAUDIO is not set # CONFIG_VIDEO_UDA1342 is not set # CONFIG_VIDEO_VP27SMPX is not set # CONFIG_VIDEO_WM8739 is not set CONFIG_VIDEO_WM8775=m # end of Audio decoders, processors and mixers # # RDS decoders # # CONFIG_VIDEO_SAA6588 is not set # end of RDS decoders # # Video decoders # # CONFIG_VIDEO_ADV7180 is not set # CONFIG_VIDEO_ADV7183 is not set # CONFIG_VIDEO_ADV748X is not set # CONFIG_VIDEO_ADV7604 is not set # CONFIG_VIDEO_ADV7842 is not set # CONFIG_VIDEO_BT819 is not set # CONFIG_VIDEO_BT856 is not set # CONFIG_VIDEO_BT866 is not set # CONFIG_VIDEO_ISL7998X is not set # CONFIG_VIDEO_KS0127 is not set # CONFIG_VIDEO_MAX9286 is not set # CONFIG_VIDEO_ML86V7667 is not set # CONFIG_VIDEO_SAA7110 is not set CONFIG_VIDEO_SAA711X=m # CONFIG_VIDEO_TC358743 is not set # CONFIG_VIDEO_TVP514X is not set # CONFIG_VIDEO_TVP5150 is not set # CONFIG_VIDEO_TVP7002 is not set # CONFIG_VIDEO_TW2804 is not set # CONFIG_VIDEO_TW9903 is not set # CONFIG_VIDEO_TW9906 is not set # CONFIG_VIDEO_TW9910 is not set # CONFIG_VIDEO_VPX3220 is not set # # Video and audio decoders # # CONFIG_VIDEO_SAA717X is not set CONFIG_VIDEO_CX25840=m # end of Video decoders # # Video encoders # # CONFIG_VIDEO_AD9389B is not set # CONFIG_VIDEO_ADV7170 is not set # CONFIG_VIDEO_ADV7175 is not set # CONFIG_VIDEO_ADV7343 is not set # CONFIG_VIDEO_ADV7393 is not set # CONFIG_VIDEO_ADV7511 is not set # CONFIG_VIDEO_AK881X is not set # CONFIG_VIDEO_SAA7127 is not set # CONFIG_VIDEO_SAA7185 is not set # CONFIG_VIDEO_THS8200 is not set # end of Video encoders # # Video improvement chips # # CONFIG_VIDEO_UPD64031A is not set # CONFIG_VIDEO_UPD64083 is not set # end of Video improvement chips # # Audio/Video compression chips # # CONFIG_VIDEO_SAA6752HS is not set # end of Audio/Video compression chips # # SDR tuner chips # # CONFIG_SDR_MAX2175 is not set # end of SDR tuner chips # # Miscellaneous helper chips # # CONFIG_VIDEO_I2C is not set # CONFIG_VIDEO_M52790 is not set # CONFIG_VIDEO_ST_MIPID02 is not set # CONFIG_VIDEO_THS7303 is not set # end of Miscellaneous helper chips # # Media SPI Adapters # CONFIG_CXD2880_SPI_DRV=m # CONFIG_VIDEO_GS1662 is not set # end of Media SPI Adapters CONFIG_MEDIA_TUNER=m # # Customize TV tuners # CONFIG_MEDIA_TUNER_E4000=m CONFIG_MEDIA_TUNER_FC0011=m CONFIG_MEDIA_TUNER_FC0012=m CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_FC2580=m CONFIG_MEDIA_TUNER_IT913X=m # CONFIG_MEDIA_TUNER_M88RS6000T is not set CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_MC44S803=m # CONFIG_MEDIA_TUNER_MSI001 is not set CONFIG_MEDIA_TUNER_MT2060=m CONFIG_MEDIA_TUNER_MT2063=m CONFIG_MEDIA_TUNER_MT20XX=m # CONFIG_MEDIA_TUNER_MT2131 is not set CONFIG_MEDIA_TUNER_MT2266=m # CONFIG_MEDIA_TUNER_MXL301RF is not set CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m # CONFIG_MEDIA_TUNER_QM1D1B0004 is not set CONFIG_MEDIA_TUNER_QM1D1C0042=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_R820T=m CONFIG_MEDIA_TUNER_SI2157=m CONFIG_MEDIA_TUNER_SIMPLE=m CONFIG_MEDIA_TUNER_TDA18212=m CONFIG_MEDIA_TUNER_TDA18218=m CONFIG_MEDIA_TUNER_TDA18250=m CONFIG_MEDIA_TUNER_TDA18271=m CONFIG_MEDIA_TUNER_TDA827X=m CONFIG_MEDIA_TUNER_TDA8290=m CONFIG_MEDIA_TUNER_TDA9887=m CONFIG_MEDIA_TUNER_TEA5761=m CONFIG_MEDIA_TUNER_TEA5767=m CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_MEDIA_TUNER_XC2028=m CONFIG_MEDIA_TUNER_XC4000=m CONFIG_MEDIA_TUNER_XC5000=m # end of Customize TV tuners # # Customise DVB Frontends # # # Multistandard (satellite) frontends # CONFIG_DVB_M88DS3103=m # CONFIG_DVB_MXL5XX is not set CONFIG_DVB_STB0899=m CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m # CONFIG_DVB_STV0910 is not set CONFIG_DVB_STV6110x=m # CONFIG_DVB_STV6111 is not set # # Multistandard (cable + terrestrial) frontends # CONFIG_DVB_DRXK=m CONFIG_DVB_MN88472=m CONFIG_DVB_MN88473=m CONFIG_DVB_SI2165=m CONFIG_DVB_TDA18271C2DD=m # # DVB-S (satellite) frontends # # CONFIG_DVB_CX24110 is not set CONFIG_DVB_CX24116=m # CONFIG_DVB_CX24117 is not set CONFIG_DVB_CX24120=m CONFIG_DVB_CX24123=m CONFIG_DVB_DS3000=m # CONFIG_DVB_MB86A16 is not set CONFIG_DVB_MT312=m CONFIG_DVB_S5H1420=m CONFIG_DVB_SI21XX=m CONFIG_DVB_STB6000=m CONFIG_DVB_STV0288=m CONFIG_DVB_STV0299=m CONFIG_DVB_STV0900=m CONFIG_DVB_STV6110=m CONFIG_DVB_TDA10071=m CONFIG_DVB_TDA10086=m # CONFIG_DVB_TDA8083 is not set # CONFIG_DVB_TDA8261 is not set CONFIG_DVB_TDA826X=m CONFIG_DVB_TS2020=m # CONFIG_DVB_TUA6100 is not set CONFIG_DVB_TUNER_CX24113=m CONFIG_DVB_TUNER_ITD1000=m # CONFIG_DVB_VES1X93 is not set # CONFIG_DVB_ZL10036 is not set CONFIG_DVB_ZL10039=m # # DVB-T (terrestrial) frontends # CONFIG_DVB_AF9013=m CONFIG_DVB_AS102_FE=m # CONFIG_DVB_CX22700 is not set CONFIG_DVB_CX22702=m CONFIG_DVB_CXD2820R=m CONFIG_DVB_CXD2841ER=m CONFIG_DVB_DIB3000MB=m CONFIG_DVB_DIB3000MC=m CONFIG_DVB_DIB7000M=m CONFIG_DVB_DIB7000P=m # CONFIG_DVB_DIB9000 is not set CONFIG_DVB_DRXD=m CONFIG_DVB_EC100=m CONFIG_DVB_GP8PSK_FE=m # CONFIG_DVB_L64781 is not set CONFIG_DVB_MT352=m CONFIG_DVB_NXT6000=m CONFIG_DVB_RTL2830=m CONFIG_DVB_RTL2832=m CONFIG_DVB_RTL2832_SDR=m # CONFIG_DVB_S5H1432 is not set CONFIG_DVB_SI2168=m # CONFIG_DVB_SP887X is not set # CONFIG_DVB_STV0367 is not set CONFIG_DVB_TDA10048=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_ZD1301_DEMOD=m CONFIG_DVB_ZL10353=m # CONFIG_DVB_CXD2880 is not set # # DVB-C (cable) frontends # CONFIG_DVB_STV0297=m # CONFIG_DVB_TDA10021 is not set CONFIG_DVB_TDA10023=m # CONFIG_DVB_VES1820 is not set # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # CONFIG_DVB_AU8522=m CONFIG_DVB_AU8522_DTV=m CONFIG_DVB_AU8522_V4L=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LG2160=m CONFIG_DVB_LGDT3305=m CONFIG_DVB_LGDT3306A=m CONFIG_DVB_LGDT330X=m CONFIG_DVB_MXL692=m CONFIG_DVB_NXT200X=m # CONFIG_DVB_OR51132 is not set # CONFIG_DVB_OR51211 is not set CONFIG_DVB_S5H1409=m CONFIG_DVB_S5H1411=m # # ISDB-T (terrestrial) frontends # CONFIG_DVB_DIB8000=m CONFIG_DVB_MB86A20S=m CONFIG_DVB_S921=m # # ISDB-S (satellite) & ISDB-T (terrestrial) frontends # # CONFIG_DVB_MN88443X is not set CONFIG_DVB_TC90522=m # # Digital terrestrial only tuners/PLL # CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m CONFIG_DVB_TUNER_DIB0090=m # # SEC control devices for DVB-S # CONFIG_DVB_A8293=m CONFIG_DVB_AF9033=m # CONFIG_DVB_ASCOT2E is not set CONFIG_DVB_ATBM8830=m # CONFIG_DVB_HELENE is not set # CONFIG_DVB_HORUS3A is not set # CONFIG_DVB_ISL6405 is not set CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m CONFIG_DVB_IX2505V=m # CONFIG_DVB_LGS8GL5 is not set CONFIG_DVB_LGS8GXX=m # CONFIG_DVB_LNBH25 is not set # CONFIG_DVB_LNBH29 is not set CONFIG_DVB_LNBP21=m CONFIG_DVB_LNBP22=m CONFIG_DVB_M88RS2000=m # CONFIG_DVB_TDA665x is not set CONFIG_DVB_DRX39XYJ=m # # Common Interface (EN50221) controller drivers # # CONFIG_DVB_CXD2099 is not set CONFIG_DVB_SP2=m # end of Customise DVB Frontends # # Tools to develop new frontends # # CONFIG_DVB_DUMMY_FE is not set # end of Media ancillary drivers # # Graphics support # CONFIG_DRM=y # CONFIG_DRM_DEBUG_MM is not set CONFIG_DRM_USE_DYNAMIC_DEBUG=y CONFIG_DRM_KMS_HELPER=y # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set # CONFIG_DRM_DEBUG_MODESET_LOCK is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_DP_AUX_BUS=y CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_DISPLAY_DP_HELPER=y CONFIG_DRM_DISPLAY_HDCP_HELPER=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_GEM_DMA_HELPER=y CONFIG_DRM_SCHED=y # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # end of I2C encoder or helper chips # # ARM devices # # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_KOMEDA is not set # end of ARM devices # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_USE_LVDS is not set # CONFIG_DRM_RCAR_USE_MIPI_DSI is not set CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_ABT_Y030XX067A is not set # CONFIG_DRM_PANEL_ARM_VERSATILE is not set # CONFIG_DRM_PANEL_LVDS is not set CONFIG_DRM_PANEL_SIMPLE=y CONFIG_DRM_PANEL_EDP=y # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LB035Q02 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set # CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set # CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set # CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set # CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set # CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set # CONFIG_DRM_PANEL_SONY_ACX565AKM is not set # CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set # CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set # CONFIG_DRM_PANEL_TPO_TPG110 is not set # CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set CONFIG_DRM_FSL_LDB=m # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set # CONFIG_DRM_LONTIUM_LT9611 is not set # CONFIG_DRM_LONTIUM_LT9611UXC is not set # CONFIG_DRM_ITE_IT66121 is not set # CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NWL_MIPI_DSI is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_PARADE_PS8640 is not set # CONFIG_DRM_SIL_SII8620 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_SII9234 is not set # CONFIG_DRM_SIMPLE_BRIDGE is not set # CONFIG_DRM_THINE_THC63LVD1024 is not set # CONFIG_DRM_TOSHIBA_TC358762 is not set # CONFIG_DRM_TOSHIBA_TC358764 is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TOSHIBA_TC358768 is not set # CONFIG_DRM_TOSHIBA_TC358775 is not set # CONFIG_DRM_TI_DLPC3433 is not set # CONFIG_DRM_TI_TFP410 is not set # CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_ANALOGIX_ANX7625 is not set # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_CDNS_MHDP8546 is not set CONFIG_DRM_CDNS_MHDP=y CONFIG_DRM_CDNS_HDMI=y CONFIG_DRM_CDNS_DP=y CONFIG_DRM_CDNS_AUDIO=y CONFIG_DRM_CDNS_HDMI_HDCP=y CONFIG_DRM_CDNS_HDMI_CEC=y # CONFIG_DRM_IMX8QM_LDB is not set # CONFIG_DRM_IMX8QXP_LDB is not set # CONFIG_DRM_IMX8QXP_PIXEL_COMBINER is not set # CONFIG_DRM_IMX8QXP_PIXEL_LINK is not set # CONFIG_DRM_IMX8QXP_PIXEL_LINK_TO_DPI is not set # end of Display Interface Bridges CONFIG_DRM_IMX_DCSS=y CONFIG_DRM_IMX_CDNS_MHDP=y CONFIG_DRM_ETNAVIV=y CONFIG_DRM_ETNAVIV_THERMAL=y # CONFIG_DRM_HISI_KIRIN is not set # CONFIG_DRM_LOGICVC is not set # CONFIG_DRM_MXSFB is not set # CONFIG_DRM_IMX_LCDIF is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_PANEL_MIPI_DBI is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9163 is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set # CONFIG_TINYDRM_ILI9486 is not set # CONFIG_TINYDRM_MI0283QT is not set # CONFIG_TINYDRM_REPAPER is not set # CONFIG_TINYDRM_ST7586 is not set # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_LIMA is not set # CONFIG_DRM_PANFROST is not set # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_DRM_NOMODESET=y # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # CONFIG_FB_ARMCLCD=y # CONFIG_FB_IMX is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set CONFIG_FB_MX3=y # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # end of Frame buffer Devices # # Backlight & LCD device support # # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_KTD253 is not set # CONFIG_BACKLIGHT_PWM is not set # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # CONFIG_BACKLIGHT_LED is not set # end of Backlight & LCD device support CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support # CONFIG_LOGO is not set # end of Graphics support CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y # CONFIG_SND_HRTIMER is not set CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 # CONFIG_SND_SUPPORT_OLD_API is not set CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_CTL_INPUT_VALIDATION is not set # CONFIG_SND_SEQUENCER is not set CONFIG_SND_DRIVERS=y # CONFIG_SND_DUMMY is not set # CONFIG_SND_ALOOP is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_SERIAL_GENERIC is not set # CONFIG_SND_MPU401 is not set # # HD-Audio # # end of HD-Audio CONFIG_SND_HDA_PREALLOC_SIZE=2048 CONFIG_SND_SPI=y # CONFIG_SND_USB is not set CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y # CONFIG_SND_SOC_ADI is not set # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_AMD_ACP_CONFIG is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set CONFIG_SND_SOC_FSL_SAI=y CONFIG_SND_SOC_FSL_MQS=y CONFIG_SND_SOC_FSL_AUDMIX=y CONFIG_SND_SOC_FSL_SSI=y CONFIG_SND_SOC_FSL_SPDIF=y CONFIG_SND_SOC_FSL_ESAI=y # CONFIG_SND_SOC_FSL_MICFIL is not set CONFIG_SND_SOC_FSL_XCVR=m CONFIG_SND_SOC_FSL_AUD2HTX=y CONFIG_SND_SOC_FSL_UTILS=y CONFIG_SND_SOC_IMX_PCM_DMA=y CONFIG_SND_SOC_IMX_AUDMUX=y CONFIG_SND_IMX_SOC=y # # SoC Audio support for Freescale i.MX boards: # CONFIG_SND_SOC_IMX_ES8328=y CONFIG_SND_SOC_IMX_SGTL5000=y CONFIG_SND_SOC_IMX_SPDIF=y CONFIG_SND_SOC_FSL_ASOC_CARD=y CONFIG_SND_SOC_IMX_AUDMIX=y CONFIG_SND_SOC_IMX_HDMI=y CONFIG_SND_SOC_IMX_CARD=y # end of SoC Audio for Freescale CPUs # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_MTK_BTCVSD is not set # CONFIG_SND_SOC_SOF_TOPLEVEL is not set # # STMicroelectronics STM32 SOC audio support # # end of 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_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # CONFIG_SND_SOC_WM_HUBS=y # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1372_SPI is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set # CONFIG_SND_SOC_ADAU7002 is not set # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4375 is not set CONFIG_SND_SOC_AK4458=y # CONFIG_SND_SOC_AK4554 is not set # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set CONFIG_SND_SOC_AK5558=y # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CROS_EC_CODEC is not set # CONFIG_SND_SOC_CS35L32 is not set # 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_CS35L41_SPI is not set # CONFIG_SND_SOC_CS35L41_I2C is not set # CONFIG_SND_SOC_CS35L45_SPI is not set # CONFIG_SND_SOC_CS35L45_I2C 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS42L83 is not set # CONFIG_SND_SOC_CS4234 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # 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_CX2072X is not set # CONFIG_SND_SOC_DA7213 is not set # CONFIG_SND_SOC_DMIC is not set CONFIG_SND_SOC_HDMI_CODEC=y CONFIG_SND_SOC_ES7134=y # CONFIG_SND_SOC_ES7241 is not set # CONFIG_SND_SOC_ES8316 is not set # CONFIG_SND_SOC_ES8326 is not set CONFIG_SND_SOC_ES8328=y CONFIG_SND_SOC_ES8328_I2C=y CONFIG_SND_SOC_ES8328_SPI=y # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_HDA is not set # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set # CONFIG_SND_SOC_MAX98088 is not set # CONFIG_SND_SOC_MAX98357A is not set # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98520 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX98396 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set # CONFIG_SND_SOC_PCM186X_I2C is not set # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set # CONFIG_SND_SOC_PCM5102A 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_RK817 is not set # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set # CONFIG_SND_SOC_RT5640 is not set # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_RT9120 is not set CONFIG_SND_SOC_SGTL5000=y # CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set # CONFIG_SND_SOC_SIMPLE_MUX is not set CONFIG_SND_SOC_SPDIF=y # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS2780 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805M is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320ADC3XXX is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set CONFIG_SND_SOC_TLV320AIC31XX=y # CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set # CONFIG_SND_SOC_TLV320AIC3X_I2C is not set # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set CONFIG_SND_SOC_WM8524=y # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731_I2C is not set # CONFIG_SND_SOC_WM8731_SPI is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set # 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_WM8940 is not set # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set CONFIG_SND_SOC_WM8994=y # CONFIG_SND_SOC_ZL38060 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_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8821 is not set # CONFIG_SND_SOC_NAU8822 is not set # CONFIG_SND_SOC_NAU8824 is not set # CONFIG_SND_SOC_TPA6130A2 is not set # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set # end of CODEC drivers CONFIG_SND_SIMPLE_CARD_UTILS=y CONFIG_SND_SIMPLE_CARD=y # CONFIG_SND_AUDIO_GRAPH_CARD is not set # CONFIG_SND_AUDIO_GRAPH_CARD2 is not set # CONFIG_SND_TEST_COMPONENT is not set # # HID support # CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set CONFIG_HID_ASUS=y CONFIG_HID_AUREAL=y # CONFIG_HID_BELKIN is not set # CONFIG_HID_BETOP_FF is not set CONFIG_HID_BIGBEN_FF=m CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CREATIVE_SB0540 is not set CONFIG_HID_CYPRESS=y CONFIG_HID_DRAGONRISE=m CONFIG_DRAGONRISE_FF=y # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_FT260 is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_GLORIOUS is not set # CONFIG_HID_HOLTEK is not set # CONFIG_HID_GOOGLE_HAMMER is not set # CONFIG_HID_VIVALDI is not set # CONFIG_HID_GT683R is not set # CONFIG_HID_KEYTOUCH is not set CONFIG_HID_KYE=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set # CONFIG_HID_VRC2 is not set # CONFIG_HID_XIAOMI is not set CONFIG_HID_GYRATION=y # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set # CONFIG_HID_JABRA is not set CONFIG_HID_TWINHAN=y CONFIG_HID_KENSINGTON=y # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LED is not set CONFIG_HID_LENOVO=y # CONFIG_HID_LETSKETCH is not set CONFIG_HID_LOGITECH=y CONFIG_HID_LOGITECH_DJ=y CONFIG_HID_LOGITECH_HIDPP=y CONFIG_LOGITECH_FF=y 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_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=m CONFIG_HID_NINTENDO=m CONFIG_NINTENDO_FF=y # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set CONFIG_HID_ORTEK=y CONFIG_HID_OUYA=y CONFIG_HID_PANTHERLORD=y CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=y CONFIG_HID_PETALYNX=y # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PXRC is not set # CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set CONFIG_HID_SAMSUNG=y # CONFIG_HID_SEMITEK is not set # CONFIG_HID_SIGMAMICRO is not set CONFIG_HID_SONY=y CONFIG_SONY_FF=y # CONFIG_HID_SPEEDLINK is not set CONFIG_HID_STEAM=y # CONFIG_HID_STEELSERIES is not set CONFIG_HID_SUNPLUS=y CONFIG_HID_RMI=y # CONFIG_HID_GREENASIA is not set CONFIG_HID_SMARTJOYPLUS=m CONFIG_SMARTJOYPLUS_FF=y CONFIG_HID_TIVO=y CONFIG_HID_TOPSEED=y # CONFIG_HID_TOPRE is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set CONFIG_HID_WIIMOTE=m CONFIG_HID_XINMO=y # CONFIG_HID_ZEROPLUS is not set CONFIG_HID_ZYDACRON=y # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # end of USB HID support # # I2C HID support # # CONFIG_I2C_HID_OF is not set # CONFIG_I2C_HID_OF_ELAN is not set # CONFIG_I2C_HID_OF_GOODIX is not set # end of I2C HID support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y # CONFIG_USB_LED_TRIG is not set # CONFIG_USB_ULPI_BUS is not set # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_OTG=y # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_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=m # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y # CONFIG_USB_XHCI_DBGCAP is not set # CONFIG_USB_XHCI_PCI_RENESAS is not set 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 # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD_PLATFORM=y # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_BCMA is not set # CONFIG_USB_HCD_SSB is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=m # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set CONFIG_USB_UAS=m # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set CONFIG_USB_DWC3=y # CONFIG_USB_DWC3_HOST is not set # CONFIG_USB_DWC3_GADGET is not set CONFIG_USB_DWC3_DUAL_ROLE=y # # Platform Glue Driver Support # CONFIG_USB_DWC3_OF_SIMPLE=y CONFIG_USB_DWC3_IMX8MP=y CONFIG_USB_DWC2=y # CONFIG_USB_DWC2_HOST is not set # # Gadget/Dual-role mode requires USB Gadget support to be enabled # # CONFIG_USB_DWC2_PERIPHERAL is not set CONFIG_USB_DWC2_DUAL_ROLE=y # CONFIG_USB_DWC2_DEBUG is not set # CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set # CONFIG_USB_CHIPIDEA is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # CONFIG_USB_SERIAL=m CONFIG_USB_SERIAL_GENERIC=y # CONFIG_USB_SERIAL_SIMPLE is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set CONFIG_USB_SERIAL_CH341=m # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set CONFIG_USB_SERIAL_CP210X=m # CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_EMPEG is not set CONFIG_USB_SERIAL_FTDI_SIO=m # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_F81232 is not set # CONFIG_USB_SERIAL_F8153X is not set # CONFIG_USB_SERIAL_GARMIN is not set # CONFIG_USB_SERIAL_IPW is not set CONFIG_USB_SERIAL_IUU=m # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set # CONFIG_USB_SERIAL_KEYSPAN is not set # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_METRO is not set # CONFIG_USB_SERIAL_MOS7720 is not set # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MXUPORT is not set # CONFIG_USB_SERIAL_NAVMAN is not set CONFIG_USB_SERIAL_PL2303=m # CONFIG_USB_SERIAL_OTI6858 is not set # CONFIG_USB_SERIAL_QCAUX is not set # CONFIG_USB_SERIAL_QUALCOMM is not set # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SAFE is not set # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_OPTION is not set # CONFIG_USB_SERIAL_OMNINET is not set # CONFIG_USB_SERIAL_OPTICON is not set # CONFIG_USB_SERIAL_XSENS_MT is not set # CONFIG_USB_SERIAL_WISHBONE is not set # CONFIG_USB_SERIAL_SSU100 is not set # CONFIG_USB_SERIAL_QT2 is not set # CONFIG_USB_SERIAL_UPD78F0730 is not set # CONFIG_USB_SERIAL_XR is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HUB_USB251XB is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # CONFIG_USB_ONBOARD_HUB is not set # # USB Physical Layer drivers # # CONFIG_NOP_USB_XCEIV is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set # CONFIG_USB_MXS_PHY is not set CONFIG_USB_ULPI=y CONFIG_USB_ULPI_VIEWPORT=y # end of USB Physical Layer drivers CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GADGET_DEBUG_FILES is not set # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # # USB Peripheral Controller # # CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set # CONFIG_USB_SNP_UDC_PLAT is not set # CONFIG_USB_M66592 is not set # CONFIG_USB_BDC_UDC is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_GADGET_XILINX is not set # CONFIG_USB_MAX3420_UDC is not set # CONFIG_USB_DUMMY_HCD is not set # end of USB Peripheral Controller # CONFIG_USB_CONFIGFS is not set # # USB Gadget precomposed configurations # # CONFIG_USB_ZERO is not set # CONFIG_USB_AUDIO is not set # CONFIG_USB_ETH is not set # CONFIG_USB_G_NCM is not set # CONFIG_USB_GADGETFS is not set # CONFIG_USB_FUNCTIONFS is not set # CONFIG_USB_MASS_STORAGE is not set # CONFIG_USB_G_SERIAL is not set # CONFIG_USB_MIDI_GADGET is not set # CONFIG_USB_G_PRINTER is not set # CONFIG_USB_CDC_COMPOSITE is not set # CONFIG_USB_G_ACM_MS is not set # CONFIG_USB_G_MULTI is not set # CONFIG_USB_G_HID is not set # CONFIG_USB_G_DBGP is not set # CONFIG_USB_G_WEBCAM is not set # CONFIG_USB_RAW_GADGET is not set # end of USB Gadget precomposed configurations # CONFIG_TYPEC is not set CONFIG_USB_ROLE_SWITCH=y CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y CONFIG_PWRSEQ_SIMPLE=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_DEBUG is not set # CONFIG_MMC_ARMMMCI is not set CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_IO_ACCESSORS=y CONFIG_MMC_SDHCI_PLTFM=y # CONFIG_MMC_SDHCI_OF_ARASAN is not set # CONFIG_MMC_SDHCI_OF_AT91 is not set CONFIG_MMC_SDHCI_OF_ESDHC=y # CONFIG_MMC_SDHCI_OF_DWCMSHC is not set # CONFIG_MMC_SDHCI_CADENCE is not set CONFIG_MMC_SDHCI_ESDHC_IMX=y # CONFIG_MMC_SDHCI_F_SDH30 is not set # CONFIG_MMC_SDHCI_MILBEAUT is not set # CONFIG_MMC_MXC is not set CONFIG_MMC_SPI=y # CONFIG_MMC_DW is not set # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_CQHCI=y # CONFIG_MMC_HSQ is not set # CONFIG_MMC_MTK is not set # CONFIG_MMC_SDHCI_XENON is not set # CONFIG_MMC_SDHCI_OMAP is not set # CONFIG_MMC_SDHCI_AM654 is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y # CONFIG_LEDS_CLASS_FLASH is not set # CONFIG_LEDS_CLASS_MULTICOLOR is not set # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_AW2013 is not set # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_EL15203000 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP50XX is not set # CONFIG_LEDS_LP55XX_COMMON is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set # CONFIG_LEDS_PWM is not set # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set CONFIG_LEDS_SYSCON=y # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_SPI_BYTE is not set # CONFIG_LEDS_TI_LMU_COMMON is not set # # Flash and Torch LED drivers # # # RGB LED drivers # # # LED Triggers # CONFIG_LEDS_TRIGGERS=y # CONFIG_LEDS_TRIGGER_TIMER is not set # CONFIG_LEDS_TRIGGER_ONESHOT is not set # CONFIG_LEDS_TRIGGER_MTD is not set CONFIG_LEDS_TRIGGER_HEARTBEAT=y # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set CONFIG_LEDS_TRIGGER_CPU=y # CONFIG_LEDS_TRIGGER_ACTIVITY is not set # CONFIG_LEDS_TRIGGER_GPIO is not set # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set # CONFIG_LEDS_TRIGGER_PANIC is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set # CONFIG_LEDS_TRIGGER_AUDIO is not set # CONFIG_LEDS_TRIGGER_TTY is not set # # Simple LED drivers # # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_SUPPORT=y CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # 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 # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_HYM8563 is not set # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_NCT3018Y is not set # CONFIG_RTC_DRV_RK808 is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # 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_RV3032 is not set # CONFIG_RTC_DRV_RV8803 is not set # CONFIG_RTC_DRV_S5M is not set # CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # CONFIG_RTC_DRV_DS3232=y CONFIG_RTC_DRV_DS3232_HWMON=y # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_OPTEE is not set # CONFIG_RTC_DRV_ZYNQMP is not set # CONFIG_RTC_DRV_CROS_EC is not set # # on-CPU RTC drivers # CONFIG_RTC_DRV_IMXDI=y # CONFIG_RTC_DRV_PL030 is not set CONFIG_RTC_DRV_PL031=y # CONFIG_RTC_DRV_CADENCE is not set # CONFIG_RTC_DRV_FTRTC010 is not set CONFIG_RTC_DRV_MXC=y CONFIG_RTC_DRV_MXC_V2=y CONFIG_RTC_DRV_SNVS=y # CONFIG_RTC_DRV_IMX_SC is not set # CONFIG_RTC_DRV_R7301 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_VIRTUAL_CHANNELS=m CONFIG_DMA_OF=y # CONFIG_ALTERA_MSGDMA is not set # CONFIG_AMBA_PL08X is not set # CONFIG_BCM_SBA_RAID is not set # CONFIG_DW_AXI_DMAC is not set # CONFIG_FSL_EDMA is not set # CONFIG_FSL_QDMA is not set CONFIG_IMX_DMA=m CONFIG_IMX_SDMA=m # CONFIG_INTEL_IDMA64 is not set # CONFIG_MV_XOR_V2 is not set # CONFIG_MXS_DMA is not set CONFIG_MX3_IPU=y CONFIG_MX3_IPU_IRQS=4 CONFIG_PL330_DMA=m # CONFIG_XILINX_DMA is not set # CONFIG_XILINX_ZYNQMP_DMA is not set # CONFIG_XILINX_ZYNQMP_DPDMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set CONFIG_DW_DMAC_CORE=m CONFIG_DW_DMAC=m # CONFIG_SF_PDMA is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set CONFIG_DMABUF_HEAPS=y # CONFIG_DMABUF_SYSFS_STATS is not set CONFIG_DMABUF_HEAPS_SYSTEM=y CONFIG_DMABUF_HEAPS_CMA=y # end of DMABUF options # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set # CONFIG_VIRTIO_MENU is not set # CONFIG_VDPA is not set CONFIG_VHOST_MENU=y # CONFIG_VHOST_NET is not set # CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set # # Microsoft Hyper-V guest support # # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_RTLLIB is not set # CONFIG_RTL8723BS is not set # CONFIG_R8712U is not set CONFIG_R8188EU=m # CONFIG_VT6656 is not set # # IIO staging drivers # # # Accelerometers # # CONFIG_ADIS16203 is not set # CONFIG_ADIS16240 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7816 is not set # end of Analog to digital converters # # Analog digital bi-direction converters # # CONFIG_ADT7316 is not set # end of Analog digital bi-direction converters # # Direct Digital Synthesis # # CONFIG_AD9832 is not set # CONFIG_AD9834 is not set # end of Direct Digital Synthesis # # Network Analyzer, Impedance Converters # # CONFIG_AD5933 is not set # end of Network Analyzer, Impedance Converters # # Active energy metering IC # # CONFIG_ADE7854 is not set # end of Active energy metering IC # # Resolver to digital converters # # CONFIG_AD2S1210 is not set # end of Resolver to digital converters # end of IIO staging drivers CONFIG_STAGING_MEDIA=y # CONFIG_VIDEO_IMX_MEDIA is not set # CONFIG_VIDEO_MAX96712 is not set CONFIG_STAGING_MEDIA_DEPRECATED=y # CONFIG_VIDEO_CPIA2 is not set # CONFIG_VIDEO_STKWEBCAM is not set CONFIG_VIDEO_TM6000=m # CONFIG_VIDEO_TM6000_ALSA is not set CONFIG_VIDEO_TM6000_DVB=m # CONFIG_USB_ZR364XX is not set # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_FB_TFT is not set # CONFIG_KS7010 is not set # CONFIG_PI433 is not set # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_FIELDBUS_DEV is not set # CONFIG_GOLDFISH is not set CONFIG_CHROME_PLATFORMS=y CONFIG_CROS_EC=y # CONFIG_CROS_EC_I2C is not set # CONFIG_CROS_EC_SPI is not set CONFIG_CROS_EC_PROTO=y # CONFIG_CROS_KBD_LED_BACKLIGHT is not set CONFIG_CROS_EC_CHARDEV=y CONFIG_CROS_EC_LIGHTBAR=y CONFIG_CROS_EC_VBC=y CONFIG_CROS_EC_DEBUGFS=y CONFIG_CROS_EC_SENSORHUB=y CONFIG_CROS_EC_SYSFS=y CONFIG_CROS_USBPD_NOTIFY=y # CONFIG_MELLANOX_PLATFORM is not set # CONFIG_SURFACE_PLATFORMS is not set CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Clock driver for ARM Reference designs # # CONFIG_CLK_ICST is not set # CONFIG_CLK_SP810 is not set # end of Clock driver for ARM Reference designs # CONFIG_LMK04832 is not set # CONFIG_COMMON_CLK_MAX9485 is not set # CONFIG_COMMON_CLK_RK808 is not set # CONFIG_COMMON_CLK_SCPI is not set # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set # CONFIG_COMMON_CLK_S2MPS11 is not set # CONFIG_COMMON_CLK_AXI_CLKGEN is not set # CONFIG_COMMON_CLK_XGENE is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_RS9_PCIE is not set # CONFIG_COMMON_CLK_VC5 is not set # CONFIG_COMMON_CLK_VC7 is not set # CONFIG_COMMON_CLK_BD718XX is not set # CONFIG_COMMON_CLK_FIXED_MMIO is not set CONFIG_MXC_CLK=y CONFIG_MXC_CLK_SCU=y CONFIG_CLK_IMX8MM=y # CONFIG_CLK_IMX8MN is not set # CONFIG_CLK_IMX8MP is not set CONFIG_CLK_IMX8MQ=y CONFIG_CLK_IMX8QXP=y # CONFIG_CLK_IMX8ULP is not set # CONFIG_CLK_IMX93 is not set # CONFIG_XILINX_VCU is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set # CONFIG_HWSPINLOCK is not set # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_PROBE=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y CONFIG_FSL_ERRATUM_A008585=y # CONFIG_HISILICON_ERRATUM_161010101 is not set # CONFIG_ARM64_ERRATUM_858921 is not set CONFIG_TIMER_IMX_SYS_CTR=y # CONFIG_MICROCHIP_PIT64B is not set # end of Clock Source drivers CONFIG_MAILBOX=y CONFIG_ARM_MHU=y # CONFIG_ARM_MHU_V2 is not set CONFIG_IMX_MBOX=y CONFIG_PLATFORM_MHU=y # CONFIG_PL320_MBOX is not set # CONFIG_ALTERA_MBOX is not set # CONFIG_MAILBOX_TEST is not set CONFIG_IOMMU_IOVA=y CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # CONFIG_IOMMU_IO_PGTABLE=y CONFIG_IOMMU_IO_PGTABLE_LPAE=y # CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set # CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set # CONFIG_IOMMU_IO_PGTABLE_DART is not set # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set CONFIG_IOMMU_DEFAULT_DMA_STRICT=y # CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_OF_IOMMU=y CONFIG_IOMMU_DMA=y # CONFIG_ARM_SMMU is not set # CONFIG_ARM_SMMU_V3 is not set # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # end of Remoteproc drivers # # Rpmsg drivers # # CONFIG_RPMSG_QCOM_GLINK_RPM is not set # CONFIG_RPMSG_VIRTIO is not set # end of Rpmsg drivers # CONFIG_SOUNDWIRE is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # end of Amlogic SoC drivers # # Broadcom SoC drivers # # CONFIG_SOC_BRCMSTB is not set # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # CONFIG_QUICC_ENGINE is not set CONFIG_FSL_GUTS=y # CONFIG_FSL_RCPM is not set # end of NXP/Freescale QorIQ SoC drivers # # fujitsu SoC drivers # # end of fujitsu SoC drivers # # i.MX SoC drivers # CONFIG_IMX_GPCV2_PM_DOMAINS=y CONFIG_SOC_IMX8M=y # CONFIG_SOC_IMX9 is not set # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # CONFIG_LITEX_SOC_CONTROLLER is not set # end of Enable LiteX SoC Builder specific drivers # # Qualcomm SoC drivers # # end of Qualcomm SoC drivers # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=m CONFIG_DEVFREQ_GOV_PERFORMANCE=m CONFIG_DEVFREQ_GOV_POWERSAVE=m # CONFIG_DEVFREQ_GOV_USERSPACE is not set # CONFIG_DEVFREQ_GOV_PASSIVE is not set # # DEVFREQ Drivers # # CONFIG_ARM_IMX_BUS_DEVFREQ is not set # CONFIG_ARM_IMX8M_DDRC_DEVFREQ is not set # CONFIG_PM_DEVFREQ_EVENT is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_FSA9480 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 is not set # CONFIG_MEMORY is not set CONFIG_IIO=y # CONFIG_IIO_BUFFER is not set # CONFIG_IIO_CONFIGFS is not set # CONFIG_IIO_TRIGGER is not set # CONFIG_IIO_SW_DEVICE is not set # CONFIG_IIO_SW_TRIGGER is not set # CONFIG_IIO_TRIGGERED_EVENT is not set # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADXL313_I2C is not set # CONFIG_ADXL313_SPI is not set # CONFIG_ADXL345_I2C is not set # CONFIG_ADXL345_SPI is not set # CONFIG_ADXL355_I2C is not set # CONFIG_ADXL355_SPI is not set # CONFIG_ADXL367_SPI is not set # CONFIG_ADXL367_I2C is not set # CONFIG_ADXL372_SPI is not set # CONFIG_ADXL372_I2C is not set # CONFIG_BMA180 is not set # CONFIG_BMA220 is not set # CONFIG_BMA400 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_BMI088_ACCEL is not set # CONFIG_DA280 is not set # CONFIG_DA311 is not set # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_DMARD10 is not set # CONFIG_FXLS8962AF_I2C is not set # CONFIG_FXLS8962AF_SPI is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MC3230 is not set # CONFIG_MMA7455_I2C is not set # CONFIG_MMA7455_SPI is not set # CONFIG_MMA7660 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MSA311 is not set # CONFIG_MXC4005 is not set # CONFIG_MXC6255 is not set # CONFIG_SCA3000 is not set # CONFIG_SCA3300 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7091R5 is not set # CONFIG_AD7124 is not set # CONFIG_AD7192 is not set # CONFIG_AD7266 is not set # CONFIG_AD7280 is not set # CONFIG_AD7291 is not set # CONFIG_AD7292 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_AD7780 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD7949 is not set # CONFIG_AD799X is not set # CONFIG_ADI_AXI_ADC is not set # CONFIG_CC10001_ADC is not set # CONFIG_ENVELOPE_DETECTOR is not set # CONFIG_HI8435 is not set # CONFIG_HX711 is not set # CONFIG_INA2XX_ADC is not set # CONFIG_IMX7D_ADC is not set # CONFIG_IMX8QXP_ADC is not set # CONFIG_LTC2471 is not set # CONFIG_LTC2485 is not set # CONFIG_LTC2496 is not set # CONFIG_LTC2497 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX11100 is not set # CONFIG_MAX1118 is not set # CONFIG_MAX11205 is not set # CONFIG_MAX1241 is not set # CONFIG_MAX1363 is not set # CONFIG_MAX9611 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_MCP3911 is not set # CONFIG_NAU7802 is not set # CONFIG_RICHTEK_RTQ6056 is not set # CONFIG_SD_ADC_MODULATOR is not set # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC0832 is not set # CONFIG_TI_ADC084S021 is not set # CONFIG_TI_ADC12138 is not set # CONFIG_TI_ADC108S102 is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_TI_ADC161S626 is not set # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS7950 is not set # CONFIG_TI_ADS8344 is not set # CONFIG_TI_ADS8688 is not set # CONFIG_TI_ADS124S08 is not set # CONFIG_TI_ADS131E08 is not set # CONFIG_TI_TLC4541 is not set # CONFIG_TI_TSC2046 is not set # CONFIG_VF610_ADC is not set # CONFIG_XILINX_XADC is not set # end of Analog to digital converters # # Analog to digital and digital to analog converters # # CONFIG_AD74413R is not set # end of Analog to digital and digital to analog converters # # Analog Front Ends # # CONFIG_IIO_RESCALE is not set # end of Analog Front Ends # # Amplifiers # # CONFIG_AD8366 is not set # CONFIG_ADA4250 is not set # CONFIG_HMC425 is not set # end of Amplifiers # # Capacitance to digital converters # # CONFIG_AD7150 is not set # CONFIG_AD7746 is not set # end of Capacitance to digital converters # # Chemical Sensors # # CONFIG_ATLAS_PH_SENSOR is not set # CONFIG_ATLAS_EZO_SENSOR is not set # CONFIG_BME680 is not set # CONFIG_CCS811 is not set # CONFIG_IAQCORE is not set # CONFIG_PMS7003 is not set # CONFIG_SCD30_CORE is not set # CONFIG_SCD4X is not set # CONFIG_SENSIRION_SGP30 is not set # CONFIG_SENSIRION_SGP40 is not set # CONFIG_SPS30_I2C is not set # CONFIG_SPS30_SERIAL is not set # CONFIG_SENSEAIR_SUNRISE_CO2 is not set # CONFIG_VZ89X is not set # end of Chemical Sensors # CONFIG_IIO_CROS_EC_SENSORS_CORE is not set # # Hid Sensor IIO Common # # end of Hid Sensor IIO Common # # IIO SCMI Sensors # # end of IIO SCMI Sensors # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # end of SSP Sensor Common # # Digital to analog converters # # CONFIG_AD3552R is not set # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5592R is not set # CONFIG_AD5593R is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_LTC2688 is not set # CONFIG_AD5686_SPI is not set # CONFIG_AD5696_I2C is not set # CONFIG_AD5755 is not set # CONFIG_AD5758 is not set # CONFIG_AD5761 is not set # CONFIG_AD5764 is not set # CONFIG_AD5766 is not set # CONFIG_AD5770R is not set # CONFIG_AD5791 is not set # CONFIG_AD7293 is not set # CONFIG_AD7303 is not set # CONFIG_AD8801 is not set # CONFIG_DPOT_DAC is not set # CONFIG_DS4424 is not set # CONFIG_LTC1660 is not set # CONFIG_LTC2632 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # 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 # end of Digital to analog converters # # IIO dummy driver # # end of IIO dummy driver # # Filters # # CONFIG_ADMV8818 is not set # end of Filters # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # end of Clock Generator/Distribution # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # CONFIG_ADF4371 is not set # CONFIG_ADMV1013 is not set # CONFIG_ADMV1014 is not set # CONFIG_ADMV4420 is not set # CONFIG_ADRF6780 is not set # end of Phase-Locked Loop (PLL) frequency synthesizers # end of Frequency Synthesizers DDS/PLL # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS290 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_FXAS21002C is not set # CONFIG_MPU3050_I2C is not set # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # end of Digital gyroscope sensors # # Health Sensors # # # Heart Rate Monitors # # CONFIG_AFE4403 is not set # CONFIG_AFE4404 is not set # CONFIG_MAX30100 is not set # CONFIG_MAX30102 is not set # end of Heart Rate Monitors # end of Health Sensors # # Humidity sensors # # CONFIG_AM2315 is not set # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HDC2010 is not set # CONFIG_HTS221 is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # end of Humidity sensors # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16460 is not set # CONFIG_ADIS16475 is not set # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set # CONFIG_BOSCH_BNO055_SERIAL is not set # CONFIG_BOSCH_BNO055_I2C is not set # CONFIG_FXOS8700_I2C is not set # CONFIG_FXOS8700_SPI is not set # CONFIG_KMX61 is not set # CONFIG_INV_ICM42600_I2C is not set # CONFIG_INV_ICM42600_SPI is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set # CONFIG_IIO_ST_LSM6DSX is not set # CONFIG_IIO_ST_LSM9DS0 is not set # end of Inertial measurement units # # Light sensors # # CONFIG_ADJD_S311 is not set # CONFIG_ADUX1020 is not set # CONFIG_AL3010 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_AS73211 is not set # CONFIG_BH1750 is not set # CONFIG_BH1780 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM3605 is not set # CONFIG_CM36651 is not set # CONFIG_GP2AP002 is not set # CONFIG_GP2AP020A00F is not set # CONFIG_SENSORS_ISL29018 is not set # CONFIG_SENSORS_ISL29028 is not set # CONFIG_ISL29125 is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_LTRF216A is not set # CONFIG_LV0104CS is not set # CONFIG_MAX44000 is not set # CONFIG_MAX44009 is not set # CONFIG_NOA1305 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1133 is not set # CONFIG_SI1145 is not set # CONFIG_STK3310 is not set # CONFIG_ST_UVIS25 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set # CONFIG_SENSORS_TSL2563 is not set # CONFIG_TSL2583 is not set # CONFIG_TSL2591 is not set # CONFIG_TSL2772 is not set # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VCNL4035 is not set # CONFIG_VEML6030 is not set # CONFIG_VEML6070 is not set # CONFIG_VL6180 is not set # CONFIG_ZOPT2201 is not set # end of Light sensors # # Magnetometer sensors # # CONFIG_AK8974 is not set # CONFIG_AK8975 is not set # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN_I2C is not set # CONFIG_BMC150_MAGN_SPI is not set # CONFIG_MAG3110 is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # CONFIG_SENSORS_RM3100_I2C is not set # CONFIG_SENSORS_RM3100_SPI is not set # CONFIG_YAMAHA_YAS530 is not set # end of Magnetometer sensors # # Multiplexers # # CONFIG_IIO_MUX is not set # end of Multiplexers # # Inclinometer sensors # # end of Inclinometer sensors # # Linear and angular position sensors # # end of Linear and angular position sensors # # Digital potentiometers # # CONFIG_AD5110 is not set # CONFIG_AD5272 is not set # CONFIG_DS1803 is not set # CONFIG_MAX5432 is not set # CONFIG_MAX5481 is not set # CONFIG_MAX5487 is not set # CONFIG_MCP4018 is not set # CONFIG_MCP4131 is not set # CONFIG_MCP4531 is not set # CONFIG_MCP41010 is not set # CONFIG_TPL0102 is not set # end of Digital potentiometers # # Digital potentiostats # # CONFIG_LMP91000 is not set # end of Digital potentiostats # # Pressure sensors # # CONFIG_ABP060MG is not set # CONFIG_BMP280 is not set # CONFIG_DLHL60D is not set # CONFIG_DPS310 is not set # CONFIG_HP03 is not set # CONFIG_ICP10100 is not set # CONFIG_MPL115_I2C is not set # CONFIG_MPL115_SPI is not set # CONFIG_MPL3115 is not set # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # CONFIG_HP206C is not set # CONFIG_ZPA2326 is not set # end of Pressure sensors # # Lightning sensors # # CONFIG_AS3935 is not set # end of Lightning sensors # # Proximity and distance sensors # # CONFIG_CROS_EC_MKBP_PROXIMITY is not set # CONFIG_ISL29501 is not set # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_MB1232 is not set # CONFIG_PING is not set # CONFIG_RFD77402 is not set # CONFIG_SRF04 is not set # CONFIG_SX9310 is not set # CONFIG_SX9324 is not set # CONFIG_SX9360 is not set # CONFIG_SX9500 is not set # CONFIG_SRF08 is not set # CONFIG_VCNL3020 is not set # CONFIG_VL53L0X_I2C is not set # end of Proximity and distance sensors # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1200 is not set # end of Resolver to digital converters # # Temperature sensors # # CONFIG_LTC2983 is not set # CONFIG_MAXIM_THERMOCOUPLE is not set # CONFIG_MLX90614 is not set # CONFIG_MLX90632 is not set # CONFIG_TMP006 is not set # CONFIG_TMP007 is not set # CONFIG_TMP117 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_MAX31856 is not set # CONFIG_MAX31865 is not set # end of Temperature sensors CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_DEBUG is not set # CONFIG_PWM_ATMEL_TCB is not set # CONFIG_PWM_CLK is not set # CONFIG_PWM_CROS_EC is not set # CONFIG_PWM_FSL_FTM is not set # CONFIG_PWM_IMX1 is not set # CONFIG_PWM_IMX27 is not set # CONFIG_PWM_IMX_TPM is not set # CONFIG_PWM_PCA9685 is not set # CONFIG_PWM_XILINX is not set # # IRQ chip support # CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 CONFIG_ARM_GIC_V3=y CONFIG_ARM_GIC_V3_ITS=y # CONFIG_AL_FIC is not set # CONFIG_XILINX_INTC is not set CONFIG_IMX_GPCV2=y CONFIG_PARTITION_PERCPU=y CONFIG_IMX_IRQSTEER=y CONFIG_IMX_INTMUX=y # CONFIG_IMX_MU_MSI is not set # end of IRQ chip support # CONFIG_IPACK_BUS is not set CONFIG_RESET_CONTROLLER=y CONFIG_RESET_IMX7=y # CONFIG_RESET_SIMPLE is not set # CONFIG_RESET_TI_SYSCON is not set # CONFIG_RESET_TI_TPS380X is not set # # PHY Subsystem # CONFIG_GENERIC_PHY=y # CONFIG_PHY_XGENE is not set # CONFIG_PHY_CAN_TRANSCEIVER is not set # # PHY drivers for Broadcom platforms # # CONFIG_BCM_KONA_USB2_PHY is not set # end of PHY drivers for Broadcom platforms # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_DPHY_RX is not set # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_CADENCE_SALVO is not set CONFIG_PHY_FSL_IMX8MQ_USB=y # CONFIG_PHY_MIXEL_LVDS_PHY is not set # CONFIG_PHY_MIXEL_MIPI_DPHY is not set CONFIG_PHY_FSL_IMX8M_PCIE=y # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_LAN966X_SERDES is not set # CONFIG_PHY_CPCAP_USB is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set # CONFIG_PHY_OCELOT_SERDES is not set # CONFIG_PHY_SAMSUNG_USB2 is not set # end of PHY Subsystem # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCI_PMU is not set # CONFIG_ARM_CCN is not set # CONFIG_ARM_CMN is not set CONFIG_ARM_PMU=y # CONFIG_ARM_DSU_PMU is not set CONFIG_FSL_IMX8_DDR_PMU=y # CONFIG_ARM_SPE_PMU is not set # end of Performance monitor support # CONFIG_RAS is not set # # Android # # CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_LIBNVDIMM is not set # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y # CONFIG_NVMEM_IMX_IIM is not set CONFIG_NVMEM_IMX_OCOTP=y # CONFIG_NVMEM_IMX_OCOTP_SCU is not set # CONFIG_NVMEM_RMEM is not set # CONFIG_NVMEM_SNVS_LPGPR is not set CONFIG_NVMEM_U_BOOT_ENV=m # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_FSI is not set CONFIG_TEE=y CONFIG_OPTEE=y CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set # CONFIG_PECI is not set # CONFIG_HTE is not set # end of Device Drivers # # 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 CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=m CONFIG_XFS_SUPPORT_V4=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_ONLINE_SCRUB is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_BTRFS_FS_REF_VERIFY is not set # CONFIG_NILFS2_FS is not set CONFIG_F2FS_FS=m CONFIG_F2FS_STAT_FS=y # CONFIG_F2FS_FS_XATTR is not set CONFIG_F2FS_CHECK_FS=y # CONFIG_F2FS_FAULT_INJECTION is not set # CONFIG_F2FS_FS_COMPRESSION is not set CONFIG_F2FS_IOSTAT=y # CONFIG_F2FS_UNFAIR_RWSEM is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y # CONFIG_QUOTA is not set CONFIG_AUTOFS4_FS=y CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=m # CONFIG_CUSE is not set # CONFIG_VIRTIO_FS is not set CONFIG_OVERLAY_FS=m # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_XINO_AUTO is not set # CONFIG_OVERLAY_FS_METACOPY is not set # # Caches # CONFIG_NETFS_SUPPORT=y # CONFIG_NETFS_STATS is not set CONFIG_FSCACHE=y # CONFIG_FSCACHE_STATS is not set # CONFIG_FSCACHE_DEBUG is not set # CONFIG_CACHEFILES is not set # end of Caches # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=m CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=m # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=m CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set CONFIG_NTFS3_FS=m # CONFIG_NTFS3_64BIT_CLUSTER is not set # CONFIG_NTFS3_LZX_XPRESS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_TMPFS_INODE64 is not set CONFIG_ARCH_SUPPORTS_HUGETLBFS=y # CONFIG_HUGETLBFS is not set CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=y # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set CONFIG_HFS_FS=m CONFIG_HFSPLUS_FS=m # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS2_FS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y # CONFIG_SQUASHFS_FILE_CACHE is not set CONFIG_SQUASHFS_FILE_DIRECT=y # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_PSTORE is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y # CONFIG_NFS_SWAP is not set CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=m CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" CONFIG_NFS_V4_1_MIGRATION=y CONFIG_ROOT_NFS=y CONFIG_NFS_FSCACHE=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFS_DISABLE_UDP_SUPPORT=y # CONFIG_NFS_V4_2_READ_PLUS is not set # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_COMMON=y CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y CONFIG_RPCSEC_GSS_KRB5=m # CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES is not set # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set # CONFIG_CIFS is not set # CONFIG_SMB_SERVER is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEY_DH_OPERATIONS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_LSM="yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_STACK_ALL_PATTERN is not set # CONFIG_INIT_STACK_ALL_ZERO is not set # CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization CONFIG_RANDSTRUCT_NONE=y # CONFIG_RANDSTRUCT_FULL is not set # CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y CONFIG_CRYPTO_PCRYPT=y CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set # end of Crypto core or helper # # Public-key cryptography # CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y # CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set CONFIG_CRYPTO_ECC=y CONFIG_CRYPTO_ECDH=y # CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set # end of Public-key cryptography # # Block ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set CONFIG_CRYPTO_SM4=y # CONFIG_CRYPTO_SM4_GENERIC is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_ARC4 is not set CONFIG_CRYPTO_CHACHA20=y CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CFB=y CONFIG_CRYPTO_CTR=y CONFIG_CRYPTO_CTS=y CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # end of Length-preserving ciphers and modes # # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y # CONFIG_CRYPTO_ESSIV is not set # end of AEAD (authenticated encryption with associated data) ciphers # # Hashes, digests, and MACs # CONFIG_CRYPTO_BLAKE2B=m CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set CONFIG_CRYPTO_SM3=y # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_XCBC is not set CONFIG_CRYPTO_XXHASH=m # end of Hashes, digests, and MACs # # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_CRCT10DIF=y # end of CRCs (cyclic redundancy checks) # # Compression # # CONFIG_CRYPTO_DEFLATE is not set # CONFIG_CRYPTO_LZO is not set # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # end of Compression # # Random number generation # CONFIG_CRYPTO_ANSI_CPRNG=y CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation # # Userspace interface # CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set # CONFIG_CRYPTO_USER_API_AEAD is not set CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y # CONFIG_CRYPTO_NHPOLY1305_NEON is not set CONFIG_CRYPTO_CHACHA20_NEON=y # # Accelerated Cryptographic Algorithms for CPU (arm64) # CONFIG_CRYPTO_GHASH_ARM64_CE=y CONFIG_CRYPTO_POLY1305_NEON=y CONFIG_CRYPTO_SHA1_ARM64_CE=y CONFIG_CRYPTO_SHA256_ARM64=y CONFIG_CRYPTO_SHA2_ARM64_CE=y CONFIG_CRYPTO_SHA512_ARM64=y CONFIG_CRYPTO_SHA512_ARM64_CE=m # CONFIG_CRYPTO_SHA3_ARM64 is not set CONFIG_CRYPTO_SM3_NEON=y # CONFIG_CRYPTO_SM3_ARM64_CE is not set # CONFIG_CRYPTO_POLYVAL_ARM64_CE is not set CONFIG_CRYPTO_AES_ARM64=y CONFIG_CRYPTO_AES_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64_CE_BLK=y CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y CONFIG_CRYPTO_AES_ARM64_BS=y # CONFIG_CRYPTO_SM4_ARM64_CE is not set CONFIG_CRYPTO_SM4_ARM64_CE_BLK=y CONFIG_CRYPTO_SM4_ARM64_NEON_BLK=y CONFIG_CRYPTO_AES_ARM64_CE_CCM=y # end of Accelerated Cryptographic Algorithms for CPU (arm64) CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_FSL_CAAM is not set # CONFIG_CRYPTO_DEV_SAHARA is not set # CONFIG_CRYPTO_DEV_ATMEL_ECC is not set # CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set # CONFIG_CRYPTO_DEV_CCP is not set # CONFIG_CRYPTO_DEV_MXS_DCP is not set # CONFIG_CRYPTO_DEV_SAFEXCEL is not set # CONFIG_CRYPTO_DEV_CCREE is not set # CONFIG_CRYPTO_DEV_HISI_SEC is not set # CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS8_PRIVATE_KEY_PARSER=m CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m # CONFIG_RAID6_PQ_BENCHMARK is not set CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_CORDIC=m # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y # CONFIG_INDIRECT_PIO is not set # # Crypto library routines # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y CONFIG_CRYPTO_LIB_CHACHA=m CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m CONFIG_CRYPTO_LIB_CURVE25519=m CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y CONFIG_CRYPTO_LIB_POLY1305=m CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_CRC_CCITT=m CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC64_ROCKSOFT is not set CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set CONFIG_CRC7=y CONFIG_LIBCRC32C=m # CONFIG_CRC8 is not set CONFIG_XXHASH=y CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=m CONFIG_LZO_COMPRESS=m CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=m CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set # CONFIG_XZ_DEC_IA64 is not set # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set # CONFIG_XZ_DEC_MICROLZMA is not set # CONFIG_XZ_DEC_TEST is not set CONFIG_GENERIC_ALLOCATOR=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_DMA_DECLARE_COHERENT=y CONFIG_ARCH_HAS_SETUP_DMA_OPS=y CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y CONFIG_SWIOTLB=y # CONFIG_DMA_RESTRICTED_POOL is not set CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_COHERENT_POOL=y CONFIG_DMA_DIRECT_REMAP=y CONFIG_DMA_CMA=y # CONFIG_DMA_PERNUMA_CMA is not set # # 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_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y # CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_TIME_NS=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_ARCH_STACKWALK=y CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y # end of Library routines CONFIG_GENERIC_IOREMAP=y CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set # CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Compile-time checks and compiler options # CONFIG_AS_HAS_NON_CONST_LEB128=y CONFIG_DEBUG_INFO_NONE=y # CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=2048 CONFIG_STRIP_ASM_SYMS=y # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y # CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set CONFIG_HAVE_ARCH_KCSAN=y CONFIG_HAVE_KCSAN_COMPILER=y # CONFIG_KCSAN is not set # end of Generic Kernel Debugging Instruments # # Networking Debugging # # CONFIG_NET_DEV_REFCNT_TRACKER is not set # CONFIG_NET_NS_REFCNT_TRACKER is not set # CONFIG_DEBUG_NET is not set # end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_PTDUMP_DEBUGFS is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM_PGTABLE is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_KASAN_SW_TAGS=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y # CONFIG_KFENCE is not set # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 # CONFIG_SOFTLOCKUP_DETECTOR is not set CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # # CONFIG_SCHED_DEBUG is not set # CONFIG_SCHEDSTATS is not set # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_SAMPLES is not set # CONFIG_STRICT_DEVMEM is not set # # arm64 Debugging # # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_ARM64_RELOC_TEST is not set # CONFIG_CORESIGHT is not set # end of arm64 Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_RUNTIME_TESTING_MENU is not set CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage # # Rust hacking # # end of Rust hacking # end of Kernel hacking ================================================ FILE: projects/NXP/devices/iMX8/options ================================================ ################################################################################ # setup device defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc+fp+simd" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_FLOAT=hard TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc" TARGET_FPU="neon-fp-armv8" ;; esac # Kernel target KERNEL_TARGET="Image" # kernel serial console EXTRA_CMDLINE="console=ttymxc0,115200 console=tty0" # debug tty path DEBUG_TTY="/dev/ttymxc0" # ATF platform ATF_PLATFORM="imx8mq" # uboot firmware UBOOT_FIRMWARE="atf firmware-imx" # uboot target UBOOT_TARGET="flash.bin" # Set the addon project ADDON_PROJECT="ARMv8" ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0001-drm-bridge-mhdp-Add-cdns-mhdp-driver-bridge-driver.patch ================================================ From c50c4f565797ac47544e1f0a2669d9cf1cb9d1c7 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Mon, 20 Apr 2020 23:01:50 +0800 Subject: [PATCH 01/49] drm: bridge: mhdp: Add cdns mhdp driver bridge driver Base on rockchip cdn-dp-reg.c code, create cdns mhdp DP API functions driver. Move the driver to a separate directory. Added HDMI/Audio/CEC API functions. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> [ Aisheng: fix conflict due to below commit 611e22b1d9f6 ("drm/rockchip: Remove unneeded semicolon") ] Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com> --- drivers/gpu/drm/bridge/cadence/Kconfig | 26 + drivers/gpu/drm/bridge/cadence/Makefile | 9 + drivers/gpu/drm/bridge/cadence/cdns-dp-core.c | 574 +++++++++++ .../gpu/drm/bridge/cadence/cdns-hdmi-core.c | 690 +++++++++++++ .../gpu/drm/bridge/cadence/cdns-mhdp-audio.c | 395 +++++++ .../gpu/drm/bridge/cadence/cdns-mhdp-cec.c | 341 +++++++ .../gpu/drm/bridge/cadence/cdns-mhdp-common.c | 795 +++++++++++++++ drivers/gpu/drm/bridge/cadence/cdns-mhdp-dp.c | 172 ++++ .../gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c | 332 ++++++ drivers/gpu/drm/bridge/cadence/cdns-mhdp.h | 209 ++++ drivers/gpu/drm/rockchip/Makefile | 2 +- drivers/gpu/drm/rockchip/cdn-dp-core.c | 241 ++--- drivers/gpu/drm/rockchip/cdn-dp-core.h | 44 +- drivers/gpu/drm/rockchip/cdn-dp-reg.c | 960 ------------------ .../drm/bridge/cdns-mhdp.h | 389 ++++++- 15 files changed, 4034 insertions(+), 1145 deletions(-) create mode 100644 drivers/gpu/drm/bridge/cadence/cdns-dp-core.c create mode 100644 drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c create mode 100644 drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c create mode 100644 drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c create mode 100644 drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c create mode 100644 drivers/gpu/drm/bridge/cadence/cdns-mhdp-dp.c create mode 100644 drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c create mode 100644 drivers/gpu/drm/bridge/cadence/cdns-mhdp.h delete mode 100644 drivers/gpu/drm/rockchip/cdn-dp-reg.c rename drivers/gpu/drm/rockchip/cdn-dp-reg.h => include/drm/bridge/cdns-mhdp.h (53%) diff --git a/drivers/gpu/drm/bridge/cadence/Kconfig b/drivers/gpu/drm/bridge/cadence/Kconfig index ef8c230e0f62..bb1865b15aca 100644 --- a/drivers/gpu/drm/bridge/cadence/Kconfig +++ b/drivers/gpu/drm/bridge/cadence/Kconfig @@ -22,3 +22,31 @@ config DRM_CDNS_MHDP8546_J721E initializes the J721E Display Port and sets up the clock and data muxes. endif + +config DRM_CDNS_MHDP + tristate "Cadence MHDP COMMON API driver" + select DRM_KMS_HELPER + select DRM_PANEL_BRIDGE + depends on OF + help + Support Cadence MHDP API library. + +config DRM_CDNS_HDMI + tristate "Cadence HDMI DRM driver" + depends on DRM_CDNS_MHDP + select DRM_DISPLAY_HDCP_HELPER + select DRM_DISPLAY_HDMI_HELPER + +config DRM_CDNS_DP + tristate "Cadence DP DRM driver" + depends on DRM_CDNS_MHDP + +config DRM_CDNS_AUDIO + tristate "Cadence MHDP Audio driver" + depends on DRM_CDNS_MHDP + +config DRM_CDNS_HDMI_CEC + tristate "Cadence MHDP HDMI CEC driver" + depends on DRM_CDNS_HDMI + select CEC_CORE + select CEC_NOTIFIER diff --git a/drivers/gpu/drm/bridge/cadence/Makefile b/drivers/gpu/drm/bridge/cadence/Makefile index 8f647991b374..618290870ba5 100644 --- a/drivers/gpu/drm/bridge/cadence/Makefile +++ b/drivers/gpu/drm/bridge/cadence/Makefile @@ -1,4 +1,13 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_DRM_CDNS_MHDP8546) += cdns-mhdp8546.o cdns-mhdp8546-y := cdns-mhdp8546-core.o cdns-mhdp8546-hdcp.o cdns-mhdp8546-$(CONFIG_DRM_CDNS_MHDP8546_J721E) += cdns-mhdp8546-j721e.o + +cdns_mhdp_drmcore-y := cdns-mhdp-common.o cdns-mhdp-dp.o cdns-mhdp-hdmi.o + +cdns_mhdp_drmcore-$(CONFIG_DRM_CDNS_HDMI) += cdns-hdmi-core.o +cdns_mhdp_drmcore-$(CONFIG_DRM_CDNS_DP) += cdns-dp-core.o +cdns_mhdp_drmcore-$(CONFIG_DRM_CDNS_AUDIO) += cdns-mhdp-audio.o +cdns_mhdp_drmcore-$(CONFIG_DRM_CDNS_HDMI_CEC) += cdns-mhdp-cec.o + +obj-$(CONFIG_DRM_CDNS_MHDP) += cdns_mhdp_drmcore.o diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c b/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c new file mode 100644 index 000000000000..acb5c860da73 --- /dev/null +++ b/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c @@ -0,0 +1,574 @@ +/* + * Cadence Display Port Interface (DP) driver + * + * Copyright (C) 2019 NXP Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + */ +#include <drm/bridge/cdns-mhdp.h> +#include <drm/drm_atomic_helper.h> +#include <drm/drm_crtc_helper.h> +#include <drm/drm_edid.h> +#include <drm/drm_encoder_slave.h> +#include <drm/drm_of.h> +#include <drm/drm_probe_helper.h> +#include <drm/drm_vblank.h> +#include <drm/drm_print.h> +#include <linux/delay.h> +#include <linux/err.h> +#include <linux/irq.h> +#include <linux/module.h> +#include <linux/mutex.h> +#include <linux/of_device.h> + +/* + * This function only implements native DPDC reads and writes + */ +static ssize_t dp_aux_transfer(struct drm_dp_aux *aux, + struct drm_dp_aux_msg *msg) +{ + struct cdns_mhdp_device *mhdp = dev_get_drvdata(aux->dev); + bool native = msg->request & (DP_AUX_NATIVE_WRITE & DP_AUX_NATIVE_READ); + int ret; + + /* Ignore address only message */ + if ((msg->size == 0) || (msg->buffer == NULL)) { + msg->reply = native ? + DP_AUX_NATIVE_REPLY_ACK : DP_AUX_I2C_REPLY_ACK; + return msg->size; + } + + if (!native) { + dev_err(mhdp->dev, "%s: only native messages supported\n", __func__); + return -EINVAL; + } + + /* msg sanity check */ + if (msg->size > DP_AUX_MAX_PAYLOAD_BYTES) { + dev_err(mhdp->dev, "%s: invalid msg: size(%zu), request(%x)\n", + __func__, msg->size, (unsigned int)msg->request); + return -EINVAL; + } + + if (msg->request == DP_AUX_NATIVE_WRITE) { + const u8 *buf = msg->buffer; + int i; + for (i = 0; i < msg->size; ++i) { + ret = cdns_mhdp_dpcd_write(mhdp, + msg->address + i, buf[i]); + if (!ret) + continue; + + DRM_DEV_ERROR(mhdp->dev, "Failed to write DPCD\n"); + + return ret; + } + } + + if (msg->request == DP_AUX_NATIVE_READ) { + ret = cdns_mhdp_dpcd_read(mhdp, msg->address, msg->buffer, msg->size); + if (ret < 0) + return -EIO; + msg->reply = DP_AUX_NATIVE_REPLY_ACK; + return msg->size; + } + return 0; +} + +static int dp_aux_init(struct cdns_mhdp_device *mhdp, + struct device *dev) +{ + int ret; + + mhdp->dp.aux.name = "imx_dp_aux"; + mhdp->dp.aux.dev = dev; + mhdp->dp.aux.transfer = dp_aux_transfer; + + ret = drm_dp_aux_register(&mhdp->dp.aux); + + return ret; +} + +static int dp_aux_destroy(struct cdns_mhdp_device *mhdp) +{ + drm_dp_aux_unregister(&mhdp->dp.aux); + return 0; +} + +static void dp_pixel_clk_reset(struct cdns_mhdp_device *mhdp) +{ + u32 val; + + /* reset pixel clk */ + val = cdns_mhdp_reg_read(mhdp, SOURCE_HDTX_CAR); + cdns_mhdp_reg_write(mhdp, SOURCE_HDTX_CAR, val & 0xFD); + cdns_mhdp_reg_write(mhdp, SOURCE_HDTX_CAR, val); +} + +static void cdns_dp_mode_set(struct cdns_mhdp_device *mhdp) +{ + u32 lane_mapping = mhdp->lane_mapping; + int ret; + + cdns_mhdp_plat_call(mhdp, pclk_rate); + + /* delay for DP FW stable after pixel clock relock */ + msleep(50); + + dp_pixel_clk_reset(mhdp); + + /* Get DP Caps */ + ret = drm_dp_dpcd_read(&mhdp->dp.aux, DP_DPCD_REV, mhdp->dp.dpcd, + DP_RECEIVER_CAP_SIZE); + if (ret < 0) { + DRM_ERROR("Failed to get caps %d\n", ret); + return; + } + + mhdp->dp.rate = drm_dp_max_link_rate(mhdp->dp.dpcd); + mhdp->dp.num_lanes = drm_dp_max_lane_count(mhdp->dp.dpcd); + + /* check the max link rate */ + if (mhdp->dp.rate > CDNS_DP_MAX_LINK_RATE) + mhdp->dp.rate = CDNS_DP_MAX_LINK_RATE; + + /* Initialize link rate/num_lanes as panel max link rate/max_num_lanes */ + cdns_mhdp_plat_call(mhdp, phy_set); + + /* Video off */ + ret = cdns_mhdp_set_video_status(mhdp, CONTROL_VIDEO_IDLE); + if (ret) { + DRM_DEV_ERROR(mhdp->dev, "Failed to valid video %d\n", ret); + return; + } + + /* Line swaping */ + cdns_mhdp_reg_write(mhdp, LANES_CONFIG, 0x00400000 | lane_mapping); + + /* Set DP host capability */ + ret = cdns_mhdp_set_host_cap(mhdp, false); + if (ret) { + DRM_DEV_ERROR(mhdp->dev, "Failed to set host cap %d\n", ret); + return; + } + + ret = cdns_mhdp_config_video(mhdp); + if (ret) { + DRM_DEV_ERROR(mhdp->dev, "Failed to config video %d\n", ret); + return; + } + + return; +} + +/* ----------------------------------------------------------------------------- + * dp TX Setup + */ +static enum drm_connector_status +cdns_dp_connector_detect(struct drm_connector *connector, bool force) +{ + struct cdns_mhdp_device *mhdp = container_of(connector, + struct cdns_mhdp_device, connector.base); + u8 hpd = 0xf; + + hpd = cdns_mhdp_read_hpd(mhdp); + if (hpd == 1) + /* Cable Connected */ + return connector_status_connected; + else if (hpd == 0) + /* Cable Disconnedted */ + return connector_status_disconnected; + else { + /* Cable status unknown */ + DRM_INFO("Unknow cable status, hdp=%u\n", hpd); + return connector_status_unknown; + } +} + +static int cdns_dp_connector_get_modes(struct drm_connector *connector) +{ + struct cdns_mhdp_device *mhdp = container_of(connector, + struct cdns_mhdp_device, connector.base); + int num_modes = 0; + struct edid *edid; + + edid = drm_do_get_edid(&mhdp->connector.base, + cdns_mhdp_get_edid_block, mhdp); + if (edid) { + dev_info(mhdp->dev, "%x,%x,%x,%x,%x,%x,%x,%x\n", + edid->header[0], edid->header[1], + edid->header[2], edid->header[3], + edid->header[4], edid->header[5], + edid->header[6], edid->header[7]); + drm_connector_update_edid_property(connector, edid); + num_modes = drm_add_edid_modes(connector, edid); + kfree(edid); + } + + if (num_modes == 0) + DRM_ERROR("Invalid edid\n"); + return num_modes; +} + +static const struct drm_connector_funcs cdns_dp_connector_funcs = { + .fill_modes = drm_helper_probe_single_connector_modes, + .detect = cdns_dp_connector_detect, + .destroy = drm_connector_cleanup, + .reset = drm_atomic_helper_connector_reset, + .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, +}; + +static const struct drm_connector_helper_funcs cdns_dp_connector_helper_funcs = { + .get_modes = cdns_dp_connector_get_modes, +}; + +static int cdns_dp_bridge_attach(struct drm_bridge *bridge, + enum drm_bridge_attach_flags flags) +{ + struct cdns_mhdp_device *mhdp = bridge->driver_private; + struct drm_encoder *encoder = bridge->encoder; + struct drm_connector *connector = &mhdp->connector.base; + + connector->interlace_allowed = 1; + + if (mhdp->is_hpd) + connector->polled = DRM_CONNECTOR_POLL_HPD; + else + connector->polled = DRM_CONNECTOR_POLL_CONNECT | + DRM_CONNECTOR_POLL_DISCONNECT; + + drm_connector_helper_add(connector, &cdns_dp_connector_helper_funcs); + + drm_connector_init(bridge->dev, connector, &cdns_dp_connector_funcs, + DRM_MODE_CONNECTOR_DisplayPort); + + drm_connector_attach_encoder(connector, encoder); + + return 0; +} + +static enum drm_mode_status +cdns_dp_bridge_mode_valid(struct drm_bridge *bridge, + const struct drm_display_mode *mode) +{ + enum drm_mode_status mode_status = MODE_OK; + + /* We don't support double-clocked modes */ + if (mode->flags & DRM_MODE_FLAG_DBLCLK || + mode->flags & DRM_MODE_FLAG_INTERLACE) + return MODE_BAD; + + /* MAX support pixel clock rate 594MHz */ + if (mode->clock > 594000) + return MODE_CLOCK_HIGH; + + /* 4096x2160 is not supported now */ + if (mode->hdisplay > 3840) + return MODE_BAD_HVALUE; + + if (mode->vdisplay > 2160) + return MODE_BAD_VVALUE; + + return mode_status; +} + +static void cdns_dp_bridge_mode_set(struct drm_bridge *bridge, + const struct drm_display_mode *orig_mode, + const struct drm_display_mode *mode) +{ + struct cdns_mhdp_device *mhdp = bridge->driver_private; + struct drm_display_info *display_info = &mhdp->connector.base.display_info; + struct video_info *video = &mhdp->video_info; + + switch (display_info->bpc) { + case 10: + video->color_depth = 10; + break; + case 6: + video->color_depth = 6; + break; + default: + video->color_depth = 8; + break; + } + + video->color_fmt = PXL_RGB; + video->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC); + video->h_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NHSYNC); + + DRM_INFO("Mode: %dx%dp%d\n", mode->hdisplay, mode->vdisplay, mode->clock); + memcpy(&mhdp->mode, mode, sizeof(struct drm_display_mode)); + + mutex_lock(&mhdp->lock); + cdns_dp_mode_set(mhdp); + mutex_unlock(&mhdp->lock); + + /* reset force mode set flag */ + mhdp->force_mode_set = false; +} + +static void cdn_dp_bridge_enable(struct drm_bridge *bridge) +{ + struct cdns_mhdp_device *mhdp = bridge->driver_private; + int ret; + + /* Link trainning */ + ret = cdns_mhdp_train_link(mhdp); + if (ret) { + DRM_DEV_ERROR(mhdp->dev, "Failed link train %d\n", ret); + return; + } + + ret = cdns_mhdp_set_video_status(mhdp, CONTROL_VIDEO_VALID); + if (ret) { + DRM_DEV_ERROR(mhdp->dev, "Failed to valid video %d\n", ret); + return; + } +} + +static void cdn_dp_bridge_disable(struct drm_bridge *bridge) +{ + struct cdns_mhdp_device *mhdp = bridge->driver_private; + + cdns_mhdp_set_video_status(mhdp, CONTROL_VIDEO_IDLE); +} + +static const struct drm_bridge_funcs cdns_dp_bridge_funcs = { + .attach = cdns_dp_bridge_attach, + .enable = cdn_dp_bridge_enable, + .disable = cdn_dp_bridge_disable, + .mode_set = cdns_dp_bridge_mode_set, + .mode_valid = cdns_dp_bridge_mode_valid, +}; + +static void hotplug_work_func(struct work_struct *work) +{ + struct cdns_mhdp_device *mhdp = container_of(work, + struct cdns_mhdp_device, hotplug_work.work); + struct drm_connector *connector = &mhdp->connector.base; + + drm_helper_hpd_irq_event(connector->dev); + + if (connector->status == connector_status_connected) { + /* Cable connedted */ + DRM_INFO("HDMI/DP Cable Plug In\n"); + enable_irq(mhdp->irq[IRQ_OUT]); + } else if (connector->status == connector_status_disconnected) { + /* Cable Disconnedted */ + DRM_INFO("HDMI/DP Cable Plug Out\n"); + /* force mode set for cable replugin to recovery DP video modes */ + mhdp->force_mode_set = true; + enable_irq(mhdp->irq[IRQ_IN]); + } +} + +static irqreturn_t cdns_dp_irq_thread(int irq, void *data) +{ + struct cdns_mhdp_device *mhdp = data; + + disable_irq_nosync(irq); + + mod_delayed_work(system_wq, &mhdp->hotplug_work, + msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS)); + + return IRQ_HANDLED; +} + +static void cdns_dp_parse_dt(struct cdns_mhdp_device *mhdp) +{ + struct device_node *of_node = mhdp->dev->of_node; + int ret; + + ret = of_property_read_u32(of_node, "lane-mapping", + &mhdp->lane_mapping); + if (ret) { + mhdp->lane_mapping = 0xc6; + dev_warn(mhdp->dev, "Failed to get lane_mapping - using default 0xc6\n"); + } + dev_info(mhdp->dev, "lane-mapping 0x%02x\n", mhdp->lane_mapping); +} + +static int __cdns_dp_probe(struct platform_device *pdev, + struct cdns_mhdp_device *mhdp) +{ + struct device *dev = &pdev->dev; + struct resource *iores = NULL; + int ret; + + mutex_init(&mhdp->lock); + mutex_init(&mhdp->iolock); + + INIT_DELAYED_WORK(&mhdp->hotplug_work, hotplug_work_func); + + iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (iores) { + mhdp->regs_base = devm_ioremap(dev, iores->start, + resource_size(iores)); + if (IS_ERR(mhdp->regs_base)) + return -ENOMEM; + } + + iores = platform_get_resource(pdev, IORESOURCE_MEM, 1); + if (iores) { + mhdp->regs_sec = devm_ioremap(dev, iores->start, + resource_size(iores)); + if (IS_ERR(mhdp->regs_sec)) + return -ENOMEM; + } + + mhdp->is_hpd = true; + mhdp->is_ls1028a = false; + + mhdp->irq[IRQ_IN] = platform_get_irq_byname(pdev, "plug_in"); + if (mhdp->irq[IRQ_IN] < 0) { + mhdp->is_hpd = false; + dev_info(dev, "No plug_in irq number\n"); + } + + mhdp->irq[IRQ_OUT] = platform_get_irq_byname(pdev, "plug_out"); + if (mhdp->irq[IRQ_OUT] < 0) { + mhdp->is_hpd = false; + dev_info(dev, "No plug_out irq number\n"); + } + + cdns_dp_parse_dt(mhdp); + + if (of_device_is_compatible(dev->of_node, "cdn,ls1028a-dp")) + mhdp->is_ls1028a = true; + + cdns_mhdp_plat_call(mhdp, power_on); + + cdns_mhdp_plat_call(mhdp, firmware_init); + + /* DP FW alive check */ + ret = cdns_mhdp_check_alive(mhdp); + if (ret == false) { + DRM_ERROR("NO dp FW running\n"); + return -ENXIO; + } + + /* DP PHY init before AUX init */ + cdns_mhdp_plat_call(mhdp, phy_set); + + /* Enable Hotplug Detect IRQ thread */ + if (mhdp->is_hpd) { + irq_set_status_flags(mhdp->irq[IRQ_IN], IRQ_NOAUTOEN); + ret = devm_request_threaded_irq(dev, mhdp->irq[IRQ_IN], + NULL, cdns_dp_irq_thread, + IRQF_ONESHOT, dev_name(dev), + mhdp); + + if (ret) { + dev_err(dev, "can't claim irq %d\n", + mhdp->irq[IRQ_IN]); + return -EINVAL; + } + + irq_set_status_flags(mhdp->irq[IRQ_OUT], IRQ_NOAUTOEN); + ret = devm_request_threaded_irq(dev, mhdp->irq[IRQ_OUT], + NULL, cdns_dp_irq_thread, + IRQF_ONESHOT, dev_name(dev), + mhdp); + + if (ret) { + dev_err(dev, "can't claim irq %d\n", + mhdp->irq[IRQ_OUT]); + return -EINVAL; + } + + if (cdns_mhdp_read_hpd(mhdp)) + enable_irq(mhdp->irq[IRQ_OUT]); + else + enable_irq(mhdp->irq[IRQ_IN]); + } + + mhdp->bridge.base.driver_private = mhdp; + mhdp->bridge.base.funcs = &cdns_dp_bridge_funcs; +#ifdef CONFIG_OF + mhdp->bridge.base.of_node = dev->of_node; +#endif + + dev_set_drvdata(dev, mhdp); + + /* register audio driver */ + cdns_mhdp_register_audio_driver(dev); + + dp_aux_init(mhdp, dev); + + return 0; +} + +static void __cdns_dp_remove(struct cdns_mhdp_device *mhdp) +{ + dp_aux_destroy(mhdp); + cdns_mhdp_unregister_audio_driver(mhdp->dev); +} + +/* ----------------------------------------------------------------------------- + * Probe/remove API, used from platforms based on the DRM bridge API. + */ +int cdns_dp_probe(struct platform_device *pdev, + struct cdns_mhdp_device *mhdp) +{ + int ret; + + ret = __cdns_dp_probe(pdev, mhdp); + if (ret) + return ret; + + drm_bridge_add(&mhdp->bridge.base); + + return 0; +} +EXPORT_SYMBOL_GPL(cdns_dp_probe); + +void cdns_dp_remove(struct platform_device *pdev) +{ + struct cdns_mhdp_device *mhdp = platform_get_drvdata(pdev); + + drm_bridge_remove(&mhdp->bridge.base); + + __cdns_dp_remove(mhdp); +} +EXPORT_SYMBOL_GPL(cdns_dp_remove); + +/* ----------------------------------------------------------------------------- + * Bind/unbind API, used from platforms based on the component framework. + */ +int cdns_dp_bind(struct platform_device *pdev, struct drm_encoder *encoder, + struct cdns_mhdp_device *mhdp) +{ + int ret; + + ret = __cdns_dp_probe(pdev, mhdp); + if (ret < 0) + return ret; + + ret = drm_bridge_attach(encoder, &mhdp->bridge.base, NULL, 0); + if (ret) { + cdns_dp_remove(pdev); + DRM_ERROR("Failed to initialize bridge with drm\n"); + return ret; + } + + return 0; +} +EXPORT_SYMBOL_GPL(cdns_dp_bind); + +void cdns_dp_unbind(struct device *dev) +{ + struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); + + __cdns_dp_remove(mhdp); +} +EXPORT_SYMBOL_GPL(cdns_dp_unbind); + +MODULE_AUTHOR("Sandor Yu <sandor.yu@nxp.com>"); +MODULE_DESCRIPTION("Cadence Display Port transmitter driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:cdn-dp"); diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c new file mode 100644 index 000000000000..da40f62617ef --- /dev/null +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c @@ -0,0 +1,690 @@ +/* + * Cadence High-Definition Multimedia Interface (HDMI) driver + * + * Copyright (C) 2019 NXP Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + */ +#include <drm/bridge/cdns-mhdp.h> +#include <drm/drm_atomic_helper.h> +#include <drm/drm_edid.h> +#include <drm/drm_encoder_slave.h> +#include <drm/drm_of.h> +#include <drm/drm_probe_helper.h> +#include <drm/drm_print.h> +#include <drm/display/drm_scdc_helper.h> +#include <drm/drm_vblank.h> +#include <linux/delay.h> +#include <linux/err.h> +#include <linux/hdmi.h> +#include <linux/irq.h> +#include <linux/module.h> +#include <linux/mfd/syscon.h> +#include <linux/mutex.h> +#include <linux/of_device.h> + +static void hdmi_sink_config(struct cdns_mhdp_device *mhdp) +{ + struct drm_scdc *scdc = &mhdp->connector.base.display_info.hdmi.scdc; + u8 buff = 0; + + /* Default work in HDMI1.4 */ + mhdp->hdmi.hdmi_type = MODE_HDMI_1_4; + + /* check sink support SCDC or not */ + if (scdc->supported != true) { + DRM_INFO("Sink Not Support SCDC\n"); + return; + } + + if (mhdp->hdmi.char_rate > 340000) { + /* + * TMDS Character Rate above 340MHz should working in HDMI2.0 + * Enable scrambling and TMDS_Bit_Clock_Ratio + */ + buff = SCDC_TMDS_BIT_CLOCK_RATIO_BY_40 | SCDC_SCRAMBLING_ENABLE; + mhdp->hdmi.hdmi_type = MODE_HDMI_2_0; + } else if (scdc->scrambling.low_rates) { + /* + * Enable scrambling and HDMI2.0 when scrambling capability of sink + * be indicated in the HF-VSDB LTE_340Mcsc_scramble bit + */ + buff = SCDC_SCRAMBLING_ENABLE; + mhdp->hdmi.hdmi_type = MODE_HDMI_2_0; + } + + /* TMDS config */ + cdns_hdmi_scdc_write(mhdp, 0x20, buff); +} + +static void hdmi_lanes_config(struct cdns_mhdp_device *mhdp) +{ + /* Line swaping */ + cdns_mhdp_reg_write(mhdp, LANES_CONFIG, 0x00400000 | mhdp->lane_mapping); +} + +static int hdmi_avi_info_set(struct cdns_mhdp_device *mhdp, + struct drm_display_mode *mode) +{ + struct hdmi_avi_infoframe frame; + int format = mhdp->video_info.color_fmt; + struct drm_connector_state *conn_state = mhdp->connector.base.state; + struct drm_display_mode *adj_mode; + enum hdmi_quantization_range qr; + u8 buf[32]; + int ret; + + /* Initialise info frame from DRM mode */ + drm_hdmi_avi_infoframe_from_display_mode(&frame, &mhdp->connector.base, + mode); + + switch (format) { + case YCBCR_4_4_4: + frame.colorspace = HDMI_COLORSPACE_YUV444; + break; + case YCBCR_4_2_2: + frame.colorspace = HDMI_COLORSPACE_YUV422; + break; + case YCBCR_4_2_0: + frame.colorspace = HDMI_COLORSPACE_YUV420; + break; + default: + frame.colorspace = HDMI_COLORSPACE_RGB; + break; + } + + drm_hdmi_avi_infoframe_colorimetry(&frame, conn_state); + + adj_mode = &mhdp->bridge.base.encoder->crtc->state->adjusted_mode; + + qr = drm_default_rgb_quant_range(adj_mode); + + drm_hdmi_avi_infoframe_quant_range(&frame, &mhdp->connector.base, + adj_mode, qr); + + ret = hdmi_avi_infoframe_check(&frame); + if (WARN_ON(ret)) + return false; + + ret = hdmi_avi_infoframe_pack(&frame, buf + 1, sizeof(buf) - 1); + if (ret < 0) { + DRM_ERROR("failed to pack AVI infoframe: %d\n", ret); + return -1; + } + + buf[0] = 0; + cdns_mhdp_infoframe_set(mhdp, 0, sizeof(buf), buf, HDMI_INFOFRAME_TYPE_AVI); + return 0; +} + +static void hdmi_vendor_info_set(struct cdns_mhdp_device *mhdp, + struct drm_display_mode *mode) +{ + struct hdmi_vendor_infoframe frame; + u8 buf[32]; + int ret; + + /* Initialise vendor frame from DRM mode */ + ret = drm_hdmi_vendor_infoframe_from_display_mode(&frame, &mhdp->connector.base, mode); + if (ret < 0) { + DRM_INFO("No vendor infoframe\n"); + return; + } + + ret = hdmi_vendor_infoframe_pack(&frame, buf + 1, sizeof(buf) - 1); + if (ret < 0) { + DRM_WARN("Unable to pack vendor infoframe: %d\n", ret); + return; + } + + buf[0] = 0; + cdns_mhdp_infoframe_set(mhdp, 3, sizeof(buf), buf, HDMI_INFOFRAME_TYPE_VENDOR); +} + +static void hdmi_drm_info_set(struct cdns_mhdp_device *mhdp) +{ + struct drm_connector_state *conn_state; + struct hdmi_drm_infoframe frame; + u8 buf[32]; + int ret; + + conn_state = mhdp->connector.base.state; + + if (!conn_state->hdr_output_metadata) + return; + + ret = drm_hdmi_infoframe_set_hdr_metadata(&frame, conn_state); + if (ret < 0) { + DRM_DEBUG_KMS("couldn't set HDR metadata in infoframe\n"); + return; + } + + ret = hdmi_drm_infoframe_pack(&frame, buf + 1, sizeof(buf) - 1); + if (ret < 0) { + DRM_DEBUG_KMS("couldn't pack HDR infoframe\n"); + return; + } + + buf[0] = 0; + cdns_mhdp_infoframe_set(mhdp, 3, sizeof(buf), + buf, HDMI_INFOFRAME_TYPE_DRM); +} + +void cdns_hdmi_mode_set(struct cdns_mhdp_device *mhdp) +{ + struct drm_display_mode *mode = &mhdp->mode; + int ret; + + /* video mode valid check */ + if (mode->clock == 0 || mode->hdisplay == 0 || mode->vdisplay == 0) + return; + + hdmi_lanes_config(mhdp); + + cdns_mhdp_plat_call(mhdp, pclk_rate); + + /* delay for HDMI FW stable after pixel clock relock */ + msleep(20); + + cdns_mhdp_plat_call(mhdp, phy_set); + + hdmi_sink_config(mhdp); + + ret = cdns_hdmi_ctrl_init(mhdp, mhdp->hdmi.hdmi_type, mhdp->hdmi.char_rate); + if (ret < 0) { + DRM_ERROR("%s, ret = %d\n", __func__, ret); + return; + } + + /* Config GCP */ + if (mhdp->video_info.color_depth == 8) + cdns_hdmi_disable_gcp(mhdp); + else + cdns_hdmi_enable_gcp(mhdp); + + ret = hdmi_avi_info_set(mhdp, mode); + if (ret < 0) { + DRM_ERROR("%s ret = %d\n", __func__, ret); + return; + } + + /* vendor info frame is enable only when HDMI1.4 4K mode */ + hdmi_vendor_info_set(mhdp, mode); + + hdmi_drm_info_set(mhdp); + + ret = cdns_hdmi_mode_config(mhdp, mode, &mhdp->video_info); + if (ret < 0) { + DRM_ERROR("CDN_API_HDMITX_SetVic_blocking ret = %d\n", ret); + return; + } +} + +static enum drm_connector_status +cdns_hdmi_connector_detect(struct drm_connector *connector, bool force) +{ + struct cdns_mhdp_device *mhdp = + container_of(connector, struct cdns_mhdp_device, connector.base); + + u8 hpd = 0xf; + + hpd = cdns_mhdp_read_hpd(mhdp); + + if (hpd == 1) + /* Cable Connected */ + return connector_status_connected; + else if (hpd == 0) + /* Cable Disconnedted */ + return connector_status_disconnected; + else { + /* Cable status unknown */ + DRM_INFO("Unknow cable status, hdp=%u\n", hpd); + return connector_status_unknown; + } +} + +static int cdns_hdmi_connector_get_modes(struct drm_connector *connector) +{ + struct cdns_mhdp_device *mhdp = + container_of(connector, struct cdns_mhdp_device, connector.base); + int num_modes = 0; + struct edid *edid; + + edid = drm_do_get_edid(&mhdp->connector.base, + cdns_hdmi_get_edid_block, mhdp); + if (edid) { + dev_info(mhdp->dev, "%x,%x,%x,%x,%x,%x,%x,%x\n", + edid->header[0], edid->header[1], + edid->header[2], edid->header[3], + edid->header[4], edid->header[5], + edid->header[6], edid->header[7]); + drm_connector_update_edid_property(connector, edid); + num_modes = drm_add_edid_modes(connector, edid); + kfree(edid); + } + + if (num_modes == 0) + DRM_ERROR("Invalid edid\n"); + return num_modes; +} + +static bool blob_equal(const struct drm_property_blob *a, + const struct drm_property_blob *b) +{ + if (a && b) + return a->length == b->length && + !memcmp(a->data, b->data, a->length); + + return !a == !b; +} + +static int cdns_hdmi_connector_atomic_check(struct drm_connector *connector, + struct drm_atomic_state *state) +{ + struct drm_connector_state *new_con_state = + drm_atomic_get_new_connector_state(state, connector); + struct drm_connector_state *old_con_state = + drm_atomic_get_old_connector_state(state, connector); + struct drm_crtc *crtc = new_con_state->crtc; + struct drm_crtc_state *new_crtc_state; + + if (!blob_equal(new_con_state->hdr_output_metadata, + old_con_state->hdr_output_metadata) || + new_con_state->colorspace != old_con_state->colorspace) { + new_crtc_state = drm_atomic_get_crtc_state(state, crtc); + if (IS_ERR(new_crtc_state)) + return PTR_ERR(new_crtc_state); + + new_crtc_state->mode_changed = + !new_con_state->hdr_output_metadata || + !old_con_state->hdr_output_metadata || + new_con_state->colorspace != old_con_state->colorspace; + } + + return 0; +} + +static const struct drm_connector_funcs cdns_hdmi_connector_funcs = { + .fill_modes = drm_helper_probe_single_connector_modes, + .detect = cdns_hdmi_connector_detect, + .destroy = drm_connector_cleanup, + .reset = drm_atomic_helper_connector_reset, + .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, +}; + +static const struct drm_connector_helper_funcs cdns_hdmi_connector_helper_funcs = { + .get_modes = cdns_hdmi_connector_get_modes, + .atomic_check = cdns_hdmi_connector_atomic_check, +}; + +static int cdns_hdmi_bridge_attach(struct drm_bridge *bridge, + enum drm_bridge_attach_flags flags) +{ + struct cdns_mhdp_device *mhdp = bridge->driver_private; + struct drm_mode_config *config = &bridge->dev->mode_config; + struct drm_encoder *encoder = bridge->encoder; + struct drm_connector *connector = &mhdp->connector.base; + + connector->interlace_allowed = 1; + connector->polled = DRM_CONNECTOR_POLL_HPD; + + drm_connector_helper_add(connector, &cdns_hdmi_connector_helper_funcs); + + drm_connector_init(bridge->dev, connector, &cdns_hdmi_connector_funcs, + DRM_MODE_CONNECTOR_HDMIA); + + if (!strncmp("imx8mq-hdmi", mhdp->plat_data->plat_name, 11)) { + drm_object_attach_property(&connector->base, + config->hdr_output_metadata_property, + 0); + + if (!drm_mode_create_hdmi_colorspace_property(connector)) + drm_object_attach_property(&connector->base, + connector->colorspace_property, + 0); + } + + drm_connector_attach_encoder(connector, encoder); + + return 0; +} + +static enum drm_mode_status +cdns_hdmi_bridge_mode_valid(struct drm_bridge *bridge, + const struct drm_display_mode *mode) +{ + struct cdns_mhdp_device *mhdp = bridge->driver_private; + enum drm_mode_status mode_status = MODE_OK; + int ret; + + /* We don't support double-clocked and Interlaced modes */ + if (mode->flags & DRM_MODE_FLAG_DBLCLK || + mode->flags & DRM_MODE_FLAG_INTERLACE) + return MODE_BAD; + + /* MAX support pixel clock rate 594MHz */ + if (mode->clock > 594000) + return MODE_CLOCK_HIGH; + + /* 4096x2160 is not supported */ + if (mode->hdisplay > 3840 || mode->vdisplay > 2160) + return MODE_BAD_HVALUE; + + mhdp->valid_mode = mode; + ret = cdns_mhdp_plat_call(mhdp, phy_video_valid); + if (ret == false) + return MODE_CLOCK_RANGE; + + return mode_status; +} + +static void cdns_hdmi_bridge_mode_set(struct drm_bridge *bridge, + const struct drm_display_mode *orig_mode, + const struct drm_display_mode *mode) +{ + struct cdns_mhdp_device *mhdp = bridge->driver_private; + struct video_info *video = &mhdp->video_info; + + video->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC); + video->h_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NHSYNC); + + DRM_INFO("Mode: %dx%dp%d\n", mode->hdisplay, mode->vdisplay, mode->clock); + memcpy(&mhdp->mode, mode, sizeof(struct drm_display_mode)); + + mutex_lock(&mhdp->lock); + cdns_hdmi_mode_set(mhdp); + mutex_unlock(&mhdp->lock); + /* reset force mode set flag */ + mhdp->force_mode_set = false; +} + +bool cdns_hdmi_bridge_mode_fixup(struct drm_bridge *bridge, + const struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + struct cdns_mhdp_device *mhdp = bridge->driver_private; + struct drm_display_info *di = &mhdp->connector.base.display_info; + struct video_info *video = &mhdp->video_info; + int vic = drm_match_cea_mode(mode); + + video->color_depth = 8; + video->color_fmt = PXL_RGB; + + /* for all other platforms, other than imx8mq */ + if (strncmp("imx8mq-hdmi", mhdp->plat_data->plat_name, 11)) { + if (di->bpc == 10 || di->bpc == 6) + video->color_depth = di->bpc; + + return true; + } + + /* imx8mq */ + if (vic == 97 || vic == 96) { + if (di->hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_36) + video->color_depth = 12; + else if (di->hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_30) + video->color_depth = 10; + + if (drm_mode_is_420_only(di, mode) || + (drm_mode_is_420_also(di, mode) && + video->color_depth > 8)) { + video->color_fmt = YCBCR_4_2_0; + + adjusted_mode->private_flags = 1; + return true; + } + + video->color_depth = 8; + return true; + } + + /* Any defined maximum tmds clock limit we must not exceed*/ + if ((di->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_36) && + (mode->clock * 3 / 2 <= di->max_tmds_clock)) + video->color_depth = 12; + else if ((di->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_30) && + (mode->clock * 5 / 4 <= di->max_tmds_clock)) + video->color_depth = 10; + + /* 10-bit color depth for the following modes is not supported */ + if ((vic == 95 || vic == 94 || vic == 93) && video->color_depth == 10) + video->color_depth = 8; + + return true; +} + +static const struct drm_bridge_funcs cdns_hdmi_bridge_funcs = { + .attach = cdns_hdmi_bridge_attach, + .mode_set = cdns_hdmi_bridge_mode_set, + .mode_valid = cdns_hdmi_bridge_mode_valid, + .mode_fixup = cdns_hdmi_bridge_mode_fixup, +}; + +static void hotplug_work_func(struct work_struct *work) +{ + struct cdns_mhdp_device *mhdp = container_of(work, + struct cdns_mhdp_device, hotplug_work.work); + struct drm_connector *connector = &mhdp->connector.base; + + drm_helper_hpd_irq_event(connector->dev); + + if (connector->status == connector_status_connected) { + DRM_INFO("HDMI Cable Plug In\n"); + mhdp->force_mode_set = true; + enable_irq(mhdp->irq[IRQ_OUT]); + } else if (connector->status == connector_status_disconnected) { + /* Cable Disconnedted */ + DRM_INFO("HDMI Cable Plug Out\n"); + /* force mode set for cable replugin to recovery HDMI2.0 video modes */ + mhdp->force_mode_set = true; + enable_irq(mhdp->irq[IRQ_IN]); + } +} + +static irqreturn_t cdns_hdmi_irq_thread(int irq, void *data) +{ + struct cdns_mhdp_device *mhdp = data; + + disable_irq_nosync(irq); + + mod_delayed_work(system_wq, &mhdp->hotplug_work, + msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS)); + + return IRQ_HANDLED; +} + +static void cdns_hdmi_parse_dt(struct cdns_mhdp_device *mhdp) +{ + struct device_node *of_node = mhdp->dev->of_node; + int ret; + + ret = of_property_read_u32(of_node, "lane-mapping", &mhdp->lane_mapping); + if (ret) { + mhdp->lane_mapping = 0xc6; + dev_warn(mhdp->dev, "Failed to get lane_mapping - using default 0xc6\n"); + } + dev_info(mhdp->dev, "lane-mapping 0x%02x\n", mhdp->lane_mapping); +} + +static int __cdns_hdmi_probe(struct platform_device *pdev, + struct cdns_mhdp_device *mhdp) +{ + struct device *dev = &pdev->dev; + struct platform_device_info pdevinfo; + struct resource *iores = NULL; + int ret; + + mutex_init(&mhdp->lock); + mutex_init(&mhdp->iolock); + + INIT_DELAYED_WORK(&mhdp->hotplug_work, hotplug_work_func); + + iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); + mhdp->regs_base = devm_ioremap(dev, iores->start, resource_size(iores)); + if (IS_ERR(mhdp->regs_base)) { + dev_err(dev, "No regs_base memory\n"); + return -ENOMEM; + } + + /* sec register base */ + iores = platform_get_resource(pdev, IORESOURCE_MEM, 1); + mhdp->regs_sec = devm_ioremap(dev, iores->start, resource_size(iores)); + if (IS_ERR(mhdp->regs_sec)) { + dev_err(dev, "No regs_sec memory\n"); + return -ENOMEM; + } + + mhdp->irq[IRQ_IN] = platform_get_irq_byname(pdev, "plug_in"); + if (mhdp->irq[IRQ_IN] < 0) { + dev_info(dev, "No plug_in irq number\n"); + return -EPROBE_DEFER; + } + + mhdp->irq[IRQ_OUT] = platform_get_irq_byname(pdev, "plug_out"); + if (mhdp->irq[IRQ_OUT] < 0) { + dev_info(dev, "No plug_out irq number\n"); + return -EPROBE_DEFER; + } + + cdns_mhdp_plat_call(mhdp, power_on); + + /* Initialize FW */ + cdns_mhdp_plat_call(mhdp, firmware_init); + + /* HDMI FW alive check */ + ret = cdns_mhdp_check_alive(mhdp); + if (ret == false) { + dev_err(dev, "NO HDMI FW running\n"); + return -ENXIO; + } + + /* Enable Hotplug Detect thread */ + irq_set_status_flags(mhdp->irq[IRQ_IN], IRQ_NOAUTOEN); + ret = devm_request_threaded_irq(dev, mhdp->irq[IRQ_IN], + NULL, cdns_hdmi_irq_thread, + IRQF_ONESHOT, dev_name(dev), + mhdp); + if (ret < 0) { + dev_err(dev, "can't claim irq %d\n", + mhdp->irq[IRQ_IN]); + return -EINVAL; + } + + irq_set_status_flags(mhdp->irq[IRQ_OUT], IRQ_NOAUTOEN); + ret = devm_request_threaded_irq(dev, mhdp->irq[IRQ_OUT], + NULL, cdns_hdmi_irq_thread, + IRQF_ONESHOT, dev_name(dev), + mhdp); + if (ret < 0) { + dev_err(dev, "can't claim irq %d\n", + mhdp->irq[IRQ_OUT]); + return -EINVAL; + } + + cdns_hdmi_parse_dt(mhdp); + + if (cdns_mhdp_read_hpd(mhdp)) + enable_irq(mhdp->irq[IRQ_OUT]); + else + enable_irq(mhdp->irq[IRQ_IN]); + + mhdp->bridge.base.driver_private = mhdp; + mhdp->bridge.base.funcs = &cdns_hdmi_bridge_funcs; +#ifdef CONFIG_OF + mhdp->bridge.base.of_node = dev->of_node; +#endif + + memset(&pdevinfo, 0, sizeof(pdevinfo)); + pdevinfo.parent = dev; + pdevinfo.id = PLATFORM_DEVID_AUTO; + + dev_set_drvdata(dev, mhdp); + + /* register audio driver */ + cdns_mhdp_register_audio_driver(dev); + + /* register cec driver */ +#ifdef CONFIG_DRM_CDNS_HDMI_CEC + cdns_mhdp_register_cec_driver(dev); +#endif + + return 0; +} + +static void __cdns_hdmi_remove(struct cdns_mhdp_device *mhdp) +{ + /* unregister cec driver */ +#ifdef CONFIG_DRM_CDNS_HDMI_CEC + cdns_mhdp_unregister_cec_driver(mhdp->dev); +#endif + cdns_mhdp_unregister_audio_driver(mhdp->dev); +} + +/* ----------------------------------------------------------------------------- + * Probe/remove API, used from platforms based on the DRM bridge API. + */ +int cdns_hdmi_probe(struct platform_device *pdev, + struct cdns_mhdp_device *mhdp) +{ + int ret; + + ret = __cdns_hdmi_probe(pdev, mhdp); + if (ret < 0) + return ret; + + drm_bridge_add(&mhdp->bridge.base); + + return 0; +} +EXPORT_SYMBOL_GPL(cdns_hdmi_probe); + +void cdns_hdmi_remove(struct platform_device *pdev) +{ + struct cdns_mhdp_device *mhdp = platform_get_drvdata(pdev); + + drm_bridge_remove(&mhdp->bridge.base); + + __cdns_hdmi_remove(mhdp); +} +EXPORT_SYMBOL_GPL(cdns_hdmi_remove); + +/* ----------------------------------------------------------------------------- + * Bind/unbind API, used from platforms based on the component framework. + */ +int cdns_hdmi_bind(struct platform_device *pdev, struct drm_encoder *encoder, + struct cdns_mhdp_device *mhdp) +{ + int ret; + + ret = __cdns_hdmi_probe(pdev, mhdp); + if (ret) + return ret; + + ret = drm_bridge_attach(encoder, &mhdp->bridge.base, NULL, 0); + if (ret) { + cdns_hdmi_remove(pdev); + DRM_ERROR("Failed to initialize bridge with drm\n"); + return ret; + } + + return 0; +} +EXPORT_SYMBOL_GPL(cdns_hdmi_bind); + +void cdns_hdmi_unbind(struct device *dev) +{ + struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); + + __cdns_hdmi_remove(mhdp); +} +EXPORT_SYMBOL_GPL(cdns_hdmi_unbind); + +MODULE_AUTHOR("Sandor Yu <sandor.yu@nxp.com>"); +MODULE_DESCRIPTION("Cadence HDMI transmitter driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:cdn-hdmi"); diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c new file mode 100644 index 000000000000..86174fb633bc --- /dev/null +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c @@ -0,0 +1,395 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd + * Author: Chris Zhong <zyw@rock-chips.com> + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#include <linux/clk.h> +#include <linux/reset.h> +#include <drm/bridge/cdns-mhdp.h> +#include <sound/hdmi-codec.h> +#include <drm/drm_of.h> +#include <drm/drm_vblank.h> +#include <drm/drm_print.h> + +#define CDNS_DP_SPDIF_CLK 200000000 + +static u32 TMDS_rate_table[7] = { + 25200, 27000, 54000, 74250, 148500, 297000, 594000, +}; + +static u32 N_table_32k[7] = { +/* 25200/27000/54000/74250/148500/297000/594000 */ + 4096, 4096, 4096, 4096, 4096, 3072, 3072, +}; + +static u32 N_table_44k[7] = { + 6272, 6272, 6272, 6272, 6272, 4704, 9408, +}; + +static u32 N_table_48k[7] = { + 6144, 6144, 6144, 6144, 6144, 5120, 6144, +}; + +static int select_N_index(u32 pclk) +{ + int num = sizeof(TMDS_rate_table)/sizeof(int); + int i = 0; + + for (i = 0; i < num ; i++) + if (pclk == TMDS_rate_table[i]) + break; + + if (i == num) { + DRM_WARN("pclkc %d is not supported!\n", pclk); + return num-1; + } + + return i; +} + +static void hdmi_audio_avi_set(struct cdns_mhdp_device *mhdp, + u32 channels) +{ + struct hdmi_audio_infoframe frame; + u8 buf[32]; + int ret; + + hdmi_audio_infoframe_init(&frame); + + frame.channels = channels; + frame.coding_type = HDMI_AUDIO_CODING_TYPE_STREAM; + + if (channels == 2) + frame.channel_allocation = 0; + else if (channels == 4) + frame.channel_allocation = 0x3; + else if (channels == 8) + frame.channel_allocation = 0x13; + + ret = hdmi_audio_infoframe_pack(&frame, buf + 1, sizeof(buf) - 1); + if (ret < 0) { + DRM_ERROR("failed to pack audio infoframe: %d\n", ret); + return; + } + + buf[0] = 0; + + cdns_mhdp_infoframe_set(mhdp, 1, sizeof(buf), buf, HDMI_INFOFRAME_TYPE_AUDIO); +} + +int cdns_mhdp_audio_stop(struct cdns_mhdp_device *mhdp, + struct audio_info *audio) +{ + int ret; + + if (audio->connector_type == DRM_MODE_CONNECTOR_DisplayPort) { + ret = cdns_mhdp_reg_write(mhdp, AUDIO_PACK_CONTROL, 0); + if (ret) { + DRM_DEV_ERROR(mhdp->dev, "audio stop failed: %d\n", ret); + return ret; + } + } + + cdns_mhdp_bus_write(0, mhdp, SPDIF_CTRL_ADDR); + + /* clearn the audio config and reset */ + cdns_mhdp_bus_write(0, mhdp, AUDIO_SRC_CNTL); + cdns_mhdp_bus_write(0, mhdp, AUDIO_SRC_CNFG); + cdns_mhdp_bus_write(AUDIO_SW_RST, mhdp, AUDIO_SRC_CNTL); + cdns_mhdp_bus_write(0, mhdp, AUDIO_SRC_CNTL); + + /* reset smpl2pckt component */ + cdns_mhdp_bus_write(0, mhdp, SMPL2PKT_CNTL); + cdns_mhdp_bus_write(AUDIO_SW_RST, mhdp, SMPL2PKT_CNTL); + cdns_mhdp_bus_write(0, mhdp, SMPL2PKT_CNTL); + + /* reset FIFO */ + cdns_mhdp_bus_write(AUDIO_SW_RST, mhdp, FIFO_CNTL); + cdns_mhdp_bus_write(0, mhdp, FIFO_CNTL); + + if (audio->format == AFMT_SPDIF_INT) + clk_disable_unprepare(mhdp->spdif_clk); + + return 0; +} +EXPORT_SYMBOL(cdns_mhdp_audio_stop); + +int cdns_mhdp_audio_mute(struct cdns_mhdp_device *mhdp, bool enable) +{ + struct audio_info *audio = &mhdp->audio_info; + int ret = true; + + if (audio->connector_type == DRM_MODE_CONNECTOR_DisplayPort) { + ret = cdns_mhdp_reg_write_bit(mhdp, DP_VB_ID, 4, 1, enable); + if (ret) + DRM_DEV_ERROR(mhdp->dev, "audio mute failed: %d\n", ret); + } + + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_audio_mute); + +static void cdns_mhdp_audio_config_i2s(struct cdns_mhdp_device *mhdp, + struct audio_info *audio) +{ + int sub_pckt_num = 1, i2s_port_en_val = 0xf, i; + int idx = select_N_index(mhdp->mode.clock); + u32 val, ncts; + + if (audio->channels == 2) { + if (mhdp->dp.num_lanes == 1) + sub_pckt_num = 2; + else + sub_pckt_num = 4; + + i2s_port_en_val = 1; + } else if (audio->channels == 4) { + i2s_port_en_val = 3; + } + + cdns_mhdp_bus_write(0x0, mhdp, SPDIF_CTRL_ADDR); + + cdns_mhdp_bus_write(SYNC_WR_TO_CH_ZERO, mhdp, FIFO_CNTL); + + val = MAX_NUM_CH(audio->channels); + val |= NUM_OF_I2S_PORTS(audio->channels); + val |= AUDIO_TYPE_LPCM; + val |= CFG_SUB_PCKT_NUM(sub_pckt_num); + cdns_mhdp_bus_write(val, mhdp, SMPL2PKT_CNFG); + + if (audio->sample_width == 16) + val = 0; + else if (audio->sample_width == 24) + val = 1 << 9; + else + val = 2 << 9; + + val |= AUDIO_CH_NUM(audio->channels); + val |= I2S_DEC_PORT_EN(i2s_port_en_val); + val |= TRANS_SMPL_WIDTH_32; + cdns_mhdp_bus_write(val, mhdp, AUDIO_SRC_CNFG); + + for (i = 0; i < (audio->channels + 1) / 2; i++) { + if (audio->sample_width == 16) + val = (0x02 << 8) | (0x02 << 20); + else if (audio->sample_width == 24) + val = (0x0b << 8) | (0x0b << 20); + + val |= ((2 * i) << 4) | ((2 * i + 1) << 16); + cdns_mhdp_bus_write(val, mhdp, STTS_BIT_CH(i)); + } + + switch (audio->sample_rate) { + case 32000: + val = SAMPLING_FREQ(3) | + ORIGINAL_SAMP_FREQ(0xc); + ncts = N_table_32k[idx]; + break; + case 44100: + val = SAMPLING_FREQ(0) | + ORIGINAL_SAMP_FREQ(0xf); + ncts = N_table_44k[idx]; + break; + case 48000: + val = SAMPLING_FREQ(2) | + ORIGINAL_SAMP_FREQ(0xd); + ncts = N_table_48k[idx]; + break; + case 88200: + val = SAMPLING_FREQ(8) | + ORIGINAL_SAMP_FREQ(0x7); + ncts = N_table_44k[idx] * 2; + break; + case 96000: + val = SAMPLING_FREQ(0xa) | + ORIGINAL_SAMP_FREQ(5); + ncts = N_table_48k[idx] * 2; + break; + case 176400: + val = SAMPLING_FREQ(0xc) | + ORIGINAL_SAMP_FREQ(3); + ncts = N_table_44k[idx] * 4; + break; + case 192000: + default: + val = SAMPLING_FREQ(0xe) | + ORIGINAL_SAMP_FREQ(1); + ncts = N_table_48k[idx] * 4; + break; + } + val |= 4; + cdns_mhdp_bus_write(val, mhdp, COM_CH_STTS_BITS); + + if (audio->connector_type == DRM_MODE_CONNECTOR_HDMIA) + cdns_mhdp_reg_write(mhdp, CM_I2S_CTRL, ncts | 0x4000000); + + cdns_mhdp_bus_write(SMPL2PKT_EN, mhdp, SMPL2PKT_CNTL); + cdns_mhdp_bus_write(I2S_DEC_START, mhdp, AUDIO_SRC_CNTL); +} + +static void cdns_mhdp_audio_config_spdif(struct cdns_mhdp_device *mhdp) +{ + u32 val; + + cdns_mhdp_bus_write(SYNC_WR_TO_CH_ZERO, mhdp, FIFO_CNTL); + + val = MAX_NUM_CH(2) | AUDIO_TYPE_LPCM | CFG_SUB_PCKT_NUM(4); + cdns_mhdp_bus_write(val, mhdp, SMPL2PKT_CNFG); + cdns_mhdp_bus_write(SMPL2PKT_EN, mhdp, SMPL2PKT_CNTL); + + val = SPDIF_ENABLE | SPDIF_AVG_SEL | SPDIF_JITTER_BYPASS; + cdns_mhdp_bus_write(val, mhdp, SPDIF_CTRL_ADDR); + + clk_prepare_enable(mhdp->spdif_clk); + clk_set_rate(mhdp->spdif_clk, CDNS_DP_SPDIF_CLK); +} + +int cdns_mhdp_audio_config(struct cdns_mhdp_device *mhdp, + struct audio_info *audio) +{ + int ret; + + /* reset the spdif clk before config */ + if (audio->format == AFMT_SPDIF_INT) { + reset_control_assert(mhdp->spdif_rst); + reset_control_deassert(mhdp->spdif_rst); + } + + if (audio->connector_type == DRM_MODE_CONNECTOR_DisplayPort) { + ret = cdns_mhdp_reg_write(mhdp, CM_LANE_CTRL, LANE_REF_CYC); + if (ret) + goto err_audio_config; + + ret = cdns_mhdp_reg_write(mhdp, CM_CTRL, 0); + if (ret) + goto err_audio_config; + } else { + /* HDMI Mode */ + ret = cdns_mhdp_reg_write(mhdp, CM_CTRL, 8); + if (ret) + goto err_audio_config; + } + + if (audio->format == AFMT_I2S) + cdns_mhdp_audio_config_i2s(mhdp, audio); + else if (audio->format == AFMT_SPDIF_INT) + cdns_mhdp_audio_config_spdif(mhdp); + + if (audio->connector_type == DRM_MODE_CONNECTOR_DisplayPort) + ret = cdns_mhdp_reg_write(mhdp, AUDIO_PACK_CONTROL, AUDIO_PACK_EN); + + if (audio->connector_type == DRM_MODE_CONNECTOR_HDMIA) + hdmi_audio_avi_set(mhdp, audio->channels); + +err_audio_config: + if (ret) + DRM_DEV_ERROR(mhdp->dev, "audio config failed: %d\n", ret); + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_audio_config); + +static int audio_hw_params(struct device *dev, void *data, + struct hdmi_codec_daifmt *daifmt, + struct hdmi_codec_params *params) +{ + struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); + struct audio_info audio = { + .sample_width = params->sample_width, + .sample_rate = params->sample_rate, + .channels = params->channels, + .connector_type = mhdp->connector.base.connector_type, + }; + int ret; + + switch (daifmt->fmt) { + case HDMI_I2S: + audio.format = AFMT_I2S; + break; + case HDMI_SPDIF: + audio.format = AFMT_SPDIF_EXT; + break; + default: + DRM_DEV_ERROR(dev, "Invalid format %d\n", daifmt->fmt); + ret = -EINVAL; + goto out; + } + + ret = cdns_mhdp_audio_config(mhdp, &audio); + if (!ret) + mhdp->audio_info = audio; + +out: + return ret; +} + +static void audio_shutdown(struct device *dev, void *data) +{ + struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); + int ret; + + ret = cdns_mhdp_audio_stop(mhdp, &mhdp->audio_info); + if (!ret) + mhdp->audio_info.format = AFMT_UNUSED; +} + +static int audio_digital_mute(struct device *dev, void *data, + bool enable) +{ + struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); + int ret; + + ret = cdns_mhdp_audio_mute(mhdp, enable); + + return ret; +} + +static int audio_get_eld(struct device *dev, void *data, + u8 *buf, size_t len) +{ + struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); + + memcpy(buf, mhdp->connector.base.eld, + min(sizeof(mhdp->connector.base.eld), len)); + + return 0; +} + +static const struct hdmi_codec_ops audio_codec_ops = { + .hw_params = audio_hw_params, + .audio_shutdown = audio_shutdown, + .digital_mute = audio_digital_mute, + .get_eld = audio_get_eld, +}; + +int cdns_mhdp_register_audio_driver(struct device *dev) +{ + struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); + struct hdmi_codec_pdata codec_data = { + .i2s = 1, + .spdif = 1, + .ops = &audio_codec_ops, + .max_i2s_channels = 8, + }; + + mhdp->audio_pdev = platform_device_register_data( + dev, HDMI_CODEC_DRV_NAME, 1, + &codec_data, sizeof(codec_data)); + + return PTR_ERR_OR_ZERO(mhdp->audio_pdev); +} + +void cdns_mhdp_unregister_audio_driver(struct device *dev) +{ + struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); + + platform_device_unregister(mhdp->audio_pdev); +} diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c new file mode 100644 index 000000000000..5717bb0bcb75 --- /dev/null +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c @@ -0,0 +1,341 @@ +/* + * Copyright 2019 NXP + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#include <linux/module.h> +#include <linux/workqueue.h> +#include <linux/kthread.h> +#include <linux/freezer.h> +#include <drm/bridge/cdns-mhdp.h> + +#define CEC_NAME "cdns-mhdp-cec" + +#define REG_ADDR_OFF 4 + +/* regsiter define */ +#define TX_MSG_HEADER 0x33800 +#define TX_MSG_LENGTH 0x33840 +#define TX_MSG_CMD 0x33844 +#define RX_MSG_CMD 0x33850 +#define RX_CLEAR_BUF 0x33854 +#define LOGICAL_ADDRESS_LA0 0x33858 + +#define CLK_DIV_MSB 0x3386c +#define CLK_DIV_LSB 0x33870 +#define RX_MSG_DATA1 0x33900 +#define RX_MSG_LENGTH 0x33940 +#define RX_MSG_STATUS 0x33944 +#define NUM_OF_MSG_RX_BUF 0x33948 +#define TX_MSG_STATUS 0x3394c +#define DB_L_TIMER 0x33980 + +/** + * CEC Transceiver operation. + */ +enum { + CEC_TX_STOP, + CEC_TX_TRANSMIT, + CEC_TX_ABORT, + CEC_TX_ABORT_AND_TRANSMIT +}; + +/** + * CEC Transceiver status. + */ +enum { + CEC_STS_IDLE, + CEC_STS_BUSY, + CEC_STS_SUCCESS, + CEC_STS_ERROR +}; + +/** + * CEC Receiver operation. + */ +enum { + CEC_RX_STOP, + CEC_RX_READ, + CEC_RX_DISABLE, + CEC_RX_ABORT_AND_CLR_FIFO +}; +/** + * Maximum number of Messages in the RX Buffers. + */ +#define CEC_MAX_RX_MSGS 2 + +static u32 mhdp_cec_read(struct cdns_mhdp_cec *cec, u32 offset) +{ + struct cdns_mhdp_device *mhdp = + container_of(cec, struct cdns_mhdp_device, hdmi.cec); + return cdns_mhdp_bus_read(mhdp, offset); +} + +static void mhdp_cec_write(struct cdns_mhdp_cec *cec, u32 offset, u32 val) +{ + struct cdns_mhdp_device *mhdp = + container_of(cec, struct cdns_mhdp_device, hdmi.cec); + cdns_mhdp_bus_write(val, mhdp, offset); +} + +static void mhdp_cec_clear_rx_buffer(struct cdns_mhdp_cec *cec) +{ + mhdp_cec_write(cec, RX_CLEAR_BUF, 1); + mhdp_cec_write(cec, RX_CLEAR_BUF, 0); +} + +static void mhdp_cec_set_divider(struct cdns_mhdp_cec *cec) +{ + struct cdns_mhdp_device *mhdp = + container_of(cec, struct cdns_mhdp_device, hdmi.cec); + u32 clk_div; + + /* Set clock divider */ + clk_div = cdns_mhdp_get_fw_clk(mhdp) * 10; + + mhdp_cec_write(cec, CLK_DIV_MSB, + (clk_div >> 8) & 0xFF); + mhdp_cec_write(cec, CLK_DIV_LSB, clk_div & 0xFF); +} + +static u32 mhdp_cec_read_message(struct cdns_mhdp_cec *cec) +{ + struct cec_msg *msg = &cec->msg; + int len; + int i; + + mhdp_cec_write(cec, RX_MSG_CMD, CEC_RX_READ); + + len = mhdp_cec_read(cec, RX_MSG_LENGTH); + msg->len = len + 1; + dev_dbg(cec->dev, "RX MSG len =%d\n", len); + + /* Read RX MSG bytes */ + for (i = 0; i < msg->len; ++i) { + msg->msg[i] = (u8) mhdp_cec_read(cec, RX_MSG_DATA1 + (i * REG_ADDR_OFF)); + dev_dbg(cec->dev, "RX MSG[%d]=0x%x\n", i, msg->msg[i]); + } + + mhdp_cec_write(cec, RX_MSG_CMD, CEC_RX_STOP); + + return true; +} + +static u32 mhdp_cec_write_message(struct cdns_mhdp_cec *cec, struct cec_msg *msg) +{ + u8 i; + + mhdp_cec_write(cec, TX_MSG_CMD, CEC_TX_STOP); + + if (msg->len > CEC_MAX_MSG_SIZE) { + dev_err(cec->dev, "Invalid MSG size!\n"); + return -EINVAL; + } + + for (i = 0; i < msg->len; ++i) + printk("msg[%d]=0x%x\n",i, msg->msg[i]); + + /* Write Message to register */ + for (i = 0; i < msg->len; ++i) { + mhdp_cec_write(cec, TX_MSG_HEADER + (i * REG_ADDR_OFF), + msg->msg[i]); + } + /* Write Message Length (payload + opcode) */ + mhdp_cec_write(cec, TX_MSG_LENGTH, msg->len - 1); + + mhdp_cec_write(cec, TX_MSG_CMD, CEC_TX_TRANSMIT); + + return true; +} + +static int mhdp_cec_set_logical_addr(struct cdns_mhdp_cec *cec, u32 la) +{ + u8 la_reg; + u8 i; + + if (la == CEC_LOG_ADDR_INVALID) + /* invalid all LA address */ + for (i = 0; i < CEC_MAX_LOG_ADDRS; ++i) { + mhdp_cec_write(cec, LOGICAL_ADDRESS_LA0 + (i * REG_ADDR_OFF), 0); + return 0; + } + + /* In fact cdns mhdp cec could support max 5 La address */ + for (i = 0; i < CEC_MAX_LOG_ADDRS; ++i) { + la_reg = mhdp_cec_read(cec, LOGICAL_ADDRESS_LA0 + (i * REG_ADDR_OFF)); + /* Check LA already used */ + if (la_reg & 0x10) + continue; + + if ((la_reg & 0xF) == la) { + dev_warn(cec->dev, "Warning. LA already in use.\n"); + return 0; + } + + la = (la & 0xF) | (1 << 4); + + mhdp_cec_write(cec, LOGICAL_ADDRESS_LA0 + (i * REG_ADDR_OFF), la); + return 0; + } + + dev_warn(cec->dev, "All LA in use\n"); + + return -ENXIO; +} + +static int mhdp_cec_poll_worker(void *_cec) +{ + struct cdns_mhdp_cec *cec = (struct cdns_mhdp_cec *)_cec; + int num_rx_msgs, i; + int sts; + + set_freezable(); + + for (;;) { + if (kthread_freezable_should_stop(NULL)) + break; + + /* Check TX State */ + sts = mhdp_cec_read(cec, TX_MSG_STATUS); + switch (sts) { + case CEC_STS_SUCCESS: + cec_transmit_done(cec->adap, CEC_TX_STATUS_OK, 0, 0, 0, + 0); + mhdp_cec_write(cec, TX_MSG_CMD, CEC_TX_STOP); + break; + case CEC_STS_ERROR: + mhdp_cec_write(cec, TX_MSG_CMD, CEC_TX_STOP); + cec_transmit_done(cec->adap, + CEC_TX_STATUS_MAX_RETRIES | + CEC_TX_STATUS_NACK, 0, 1, 0, 0); + break; + case CEC_STS_BUSY: + default: + break; + } + + /* Check RX State */ + sts = mhdp_cec_read(cec, RX_MSG_STATUS); + num_rx_msgs = mhdp_cec_read(cec, NUM_OF_MSG_RX_BUF); + switch (sts) { + case CEC_STS_SUCCESS: + if (num_rx_msgs == 0xf) + num_rx_msgs = CEC_MAX_RX_MSGS; + + if (num_rx_msgs > CEC_MAX_RX_MSGS) { + dev_err(cec->dev, "Error rx msg num %d\n", + num_rx_msgs); + mhdp_cec_clear_rx_buffer(cec); + break; + } + + /* Rx FIFO Depth 2 RX MSG */ + for (i = 0; i < num_rx_msgs; i++) { + mhdp_cec_read_message(cec); + cec->msg.rx_status = CEC_RX_STATUS_OK; + cec_received_msg(cec->adap, &cec->msg); + } + break; + default: + break; + } + + if (!kthread_should_stop()) + schedule_timeout_idle(20); + } + + return 0; +} + +static int mhdp_cec_adap_enable(struct cec_adapter *adap, bool enable) +{ + struct cdns_mhdp_cec *cec = cec_get_drvdata(adap); + + if (enable) { + mhdp_cec_write(cec, DB_L_TIMER, 0x10); + mhdp_cec_set_divider(cec); + } else + mhdp_cec_set_divider(cec); + + return 0; +} + +static int mhdp_cec_adap_log_addr(struct cec_adapter *adap, u8 addr) +{ + struct cdns_mhdp_cec *cec = cec_get_drvdata(adap); + + return mhdp_cec_set_logical_addr(cec, addr); +} + +static int mhdp_cec_adap_transmit(struct cec_adapter *adap, u8 attempts, + u32 signal_free_time, struct cec_msg *msg) +{ + struct cdns_mhdp_cec *cec = cec_get_drvdata(adap); + + mhdp_cec_write_message(cec, msg); + + return 0; +} + +static const struct cec_adap_ops cdns_mhdp_cec_adap_ops = { + .adap_enable = mhdp_cec_adap_enable, + .adap_log_addr = mhdp_cec_adap_log_addr, + .adap_transmit = mhdp_cec_adap_transmit, +}; + +int cdns_mhdp_register_cec_driver(struct device *dev) +{ + struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); + struct cdns_mhdp_cec *cec = &mhdp->hdmi.cec; + int ret; + + cec->adap = cec_allocate_adapter(&cdns_mhdp_cec_adap_ops, cec, + CEC_NAME, + CEC_CAP_PHYS_ADDR | CEC_CAP_LOG_ADDRS | + CEC_CAP_TRANSMIT | CEC_CAP_PASSTHROUGH + | CEC_CAP_RC, CEC_MAX_LOG_ADDRS); + ret = PTR_ERR_OR_ZERO(cec->adap); + if (ret) + return ret; + ret = cec_register_adapter(cec->adap, dev); + if (ret) { + cec_delete_adapter(cec->adap); + return ret; + } + + cec->dev = dev; + + cec->cec_worker = kthread_create(mhdp_cec_poll_worker, cec, "cdns-mhdp-cec"); + if (IS_ERR(cec->cec_worker)) + dev_err(cec->dev, "failed create hdp cec thread\n"); + + wake_up_process(cec->cec_worker); + + dev_dbg(dev, "CEC successfuly probed\n"); + return 0; +} + +int cdns_mhdp_unregister_cec_driver(struct device *dev) +{ + struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); + struct cdns_mhdp_cec *cec = &mhdp->hdmi.cec; + + if (cec->cec_worker) { + kthread_stop(cec->cec_worker); + cec->cec_worker = NULL; + } + cec_unregister_adapter(cec->adap); + return 0; +} + +MODULE_AUTHOR("Sandor.Yu@NXP.com"); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("NXP CDNS MHDP HDMI CEC driver"); diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c new file mode 100644 index 000000000000..91d1cfd4b2af --- /dev/null +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c @@ -0,0 +1,795 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd + * Author: Chris Zhong <zyw@rock-chips.com> + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/clk.h> +#include <linux/delay.h> +#include <linux/device.h> +#include <linux/io.h> +#include <linux/iopoll.h> +#include <linux/reset.h> + +#include <asm/unaligned.h> + +#include <drm/bridge/cdns-mhdp.h> +#include <drm/drm_modes.h> +#include <drm/drm_print.h> +#include <linux/regmap.h> + +#define CDNS_DP_SPDIF_CLK 200000000 +#define FW_ALIVE_TIMEOUT_US 1000000 +#define MAILBOX_RETRY_US 1000 +#define MAILBOX_TIMEOUT_US 5000000 + +#define mhdp_readx_poll_timeout(op, addr, offset, val, cond, sleep_us, timeout_us) \ +({ \ + u64 __timeout_us = (timeout_us); \ + unsigned long __sleep_us = (sleep_us); \ + ktime_t __timeout = ktime_add_us(ktime_get(), __timeout_us); \ + might_sleep_if((__sleep_us) != 0); \ + for (;;) { \ + (val) = op(addr, offset); \ + if (cond) \ + break; \ + if (__timeout_us && \ + ktime_compare(ktime_get(), __timeout) > 0) { \ + (val) = op(addr, offset); \ + break; \ + } \ + if (__sleep_us) \ + usleep_range((__sleep_us >> 2) + 1, __sleep_us); \ + } \ + (cond) ? 0 : -ETIMEDOUT; \ +}) + +u32 cdns_mhdp_bus_read(struct cdns_mhdp_device *mhdp, u32 offset) +{ + u32 val; + + mutex_lock(&mhdp->iolock); + + if (mhdp->bus_type == BUS_TYPE_LOW4K_SAPB) { + /* Remap address to low 4K SAPB bus */ + writel(offset >> 12, mhdp->regs_sec + 0xc); + val = readl((offset & 0xfff) + mhdp->regs_base); + } else if (mhdp->bus_type == BUS_TYPE_LOW4K_APB) { + /* Remap address to low 4K memory */ + writel(offset >> 12, mhdp->regs_sec + 8); + val = readl((offset & 0xfff) + mhdp->regs_base); + } else if (mhdp->bus_type == BUS_TYPE_NORMAL_SAPB) + val = readl(mhdp->regs_sec + offset); + else + val = readl(mhdp->regs_base + offset); + + mutex_unlock(&mhdp->iolock); + + return val; +} +EXPORT_SYMBOL(cdns_mhdp_bus_read); + +void cdns_mhdp_bus_write(u32 val, struct cdns_mhdp_device *mhdp, u32 offset) +{ + mutex_lock(&mhdp->iolock); + + if (mhdp->bus_type == BUS_TYPE_LOW4K_SAPB) { + /* Remap address to low 4K SAPB bus */ + writel(offset >> 12, mhdp->regs_sec + 0xc); + writel(val, (offset & 0xfff) + mhdp->regs_base); + } else if (mhdp->bus_type == BUS_TYPE_LOW4K_APB) { + /* Remap address to low 4K memory */ + writel(offset >> 12, mhdp->regs_sec + 8); + writel(val, (offset & 0xfff) + mhdp->regs_base); + } else if (mhdp->bus_type == BUS_TYPE_NORMAL_SAPB) + writel(val, mhdp->regs_sec + offset); + else + writel(val, mhdp->regs_base + offset); + + mutex_unlock(&mhdp->iolock); +} +EXPORT_SYMBOL(cdns_mhdp_bus_write); + +u32 cdns_mhdp_get_fw_clk(struct cdns_mhdp_device *mhdp) +{ + return cdns_mhdp_bus_read(mhdp, SW_CLK_H); +} +EXPORT_SYMBOL(cdns_mhdp_get_fw_clk); + +void cdns_mhdp_set_fw_clk(struct cdns_mhdp_device *mhdp, unsigned long clk) +{ + cdns_mhdp_bus_write(clk / 1000000, mhdp, SW_CLK_H); +} +EXPORT_SYMBOL(cdns_mhdp_set_fw_clk); + +void cdns_mhdp_clock_reset(struct cdns_mhdp_device *mhdp) +{ + u32 val; + + val = DPTX_FRMR_DATA_CLK_RSTN_EN | + DPTX_FRMR_DATA_CLK_EN | + DPTX_PHY_DATA_RSTN_EN | + DPTX_PHY_DATA_CLK_EN | + DPTX_PHY_CHAR_RSTN_EN | + DPTX_PHY_CHAR_CLK_EN | + SOURCE_AUX_SYS_CLK_RSTN_EN | + SOURCE_AUX_SYS_CLK_EN | + DPTX_SYS_CLK_RSTN_EN | + DPTX_SYS_CLK_EN | + CFG_DPTX_VIF_CLK_RSTN_EN | + CFG_DPTX_VIF_CLK_EN; + cdns_mhdp_bus_write(val, mhdp, SOURCE_DPTX_CAR); + + val = SOURCE_PHY_RSTN_EN | SOURCE_PHY_CLK_EN; + cdns_mhdp_bus_write(val, mhdp, SOURCE_PHY_CAR); + + val = SOURCE_PKT_SYS_RSTN_EN | + SOURCE_PKT_SYS_CLK_EN | + SOURCE_PKT_DATA_RSTN_EN | + SOURCE_PKT_DATA_CLK_EN; + cdns_mhdp_bus_write(val, mhdp, SOURCE_PKT_CAR); + + val = SPDIF_CDR_CLK_RSTN_EN | + SPDIF_CDR_CLK_EN | + SOURCE_AIF_SYS_RSTN_EN | + SOURCE_AIF_SYS_CLK_EN | + SOURCE_AIF_CLK_RSTN_EN | + SOURCE_AIF_CLK_EN; + cdns_mhdp_bus_write(val, mhdp, SOURCE_AIF_CAR); + + val = SOURCE_CIPHER_SYSTEM_CLK_RSTN_EN | + SOURCE_CIPHER_SYS_CLK_EN | + SOURCE_CIPHER_CHAR_CLK_RSTN_EN | + SOURCE_CIPHER_CHAR_CLK_EN; + cdns_mhdp_bus_write(val, mhdp, SOURCE_CIPHER_CAR); + + val = SOURCE_CRYPTO_SYS_CLK_RSTN_EN | + SOURCE_CRYPTO_SYS_CLK_EN; + cdns_mhdp_bus_write(val, mhdp, SOURCE_CRYPTO_CAR); + + /* enable Mailbox and PIF interrupt */ + cdns_mhdp_bus_write(0, mhdp, APB_INT_MASK); +} +EXPORT_SYMBOL(cdns_mhdp_clock_reset); + +bool cdns_mhdp_check_alive(struct cdns_mhdp_device *mhdp) +{ + u32 alive, newalive; + u8 retries_left = 50; + + alive = cdns_mhdp_bus_read(mhdp, KEEP_ALIVE); + + while (retries_left--) { + udelay(2); + + newalive = cdns_mhdp_bus_read(mhdp, KEEP_ALIVE); + if (alive == newalive) + continue; + return true; + } + return false; +} +EXPORT_SYMBOL(cdns_mhdp_check_alive); + +static int mhdp_mailbox_read(struct cdns_mhdp_device *mhdp) +{ + int val, ret; + + ret = mhdp_readx_poll_timeout(cdns_mhdp_bus_read, mhdp, MAILBOX_EMPTY_ADDR, + val, !val, MAILBOX_RETRY_US, + MAILBOX_TIMEOUT_US); + if (ret < 0) + return ret; + + return cdns_mhdp_bus_read(mhdp, MAILBOX0_RD_DATA) & 0xff; +} + +static int mhdp_mailbox_write(struct cdns_mhdp_device *mhdp, u8 val) +{ + int ret, full; + + ret = mhdp_readx_poll_timeout(cdns_mhdp_bus_read, mhdp, MAILBOX_FULL_ADDR, + full, !full, MAILBOX_RETRY_US, + MAILBOX_TIMEOUT_US); + if (ret < 0) + return ret; + + cdns_mhdp_bus_write(val, mhdp, MAILBOX0_WR_DATA); + + return 0; +} + +int cdns_mhdp_mailbox_validate_receive(struct cdns_mhdp_device *mhdp, + u8 module_id, u8 opcode, + u16 req_size) +{ + u32 mbox_size, i; + u8 header[4]; + int ret; + + /* read the header of the message */ + for (i = 0; i < 4; i++) { + ret = mhdp_mailbox_read(mhdp); + if (ret < 0) + return ret; + + header[i] = ret; + } + + mbox_size = get_unaligned_be16(header + 2); + + if (opcode != header[0] || module_id != header[1] || + req_size != mbox_size) { + /* + * If the message in mailbox is not what we want, we need to + * clear the mailbox by reading its contents. + */ + for (i = 0; i < mbox_size; i++) + if (mhdp_mailbox_read(mhdp) < 0) + break; + + return -EINVAL; + } + + return 0; +} +EXPORT_SYMBOL(cdns_mhdp_mailbox_validate_receive); + +int cdns_mhdp_mailbox_read_receive(struct cdns_mhdp_device *mhdp, + u8 *buff, u16 buff_size) +{ + u32 i; + int ret; + + for (i = 0; i < buff_size; i++) { + ret = mhdp_mailbox_read(mhdp); + if (ret < 0) + return ret; + + buff[i] = ret; + } + + return 0; +} +EXPORT_SYMBOL(cdns_mhdp_mailbox_read_receive); + +int cdns_mhdp_mailbox_send(struct cdns_mhdp_device *mhdp, u8 module_id, + u8 opcode, u16 size, u8 *message) +{ + u8 header[4]; + int ret, i; + + header[0] = opcode; + header[1] = module_id; + put_unaligned_be16(size, header + 2); + + for (i = 0; i < 4; i++) { + ret = mhdp_mailbox_write(mhdp, header[i]); + if (ret) + return ret; + } + + for (i = 0; i < size; i++) { + ret = mhdp_mailbox_write(mhdp, message[i]); + if (ret) + return ret; + } + + return 0; +} +EXPORT_SYMBOL(cdns_mhdp_mailbox_send); + +int cdns_mhdp_reg_read(struct cdns_mhdp_device *mhdp, u32 addr) +{ + u8 msg[4], resp[8]; + u32 val; + int ret; + + if (addr == 0) { + ret = -EINVAL; + goto err_reg_read; + } + + put_unaligned_be32(addr, msg); + + ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_GENERAL, + GENERAL_READ_REGISTER, + sizeof(msg), msg); + if (ret) + goto err_reg_read; + + ret = cdns_mhdp_mailbox_validate_receive(mhdp, MB_MODULE_ID_GENERAL, + GENERAL_READ_REGISTER, + sizeof(resp)); + if (ret) + goto err_reg_read; + + ret = cdns_mhdp_mailbox_read_receive(mhdp, resp, sizeof(resp)); + if (ret) + goto err_reg_read; + + /* Returned address value should be the same as requested */ + if (memcmp(msg, resp, sizeof(msg))) { + ret = -EINVAL; + goto err_reg_read; + } + + val = get_unaligned_be32(resp + 4); + + return val; +err_reg_read: + DRM_DEV_ERROR(mhdp->dev, "Failed to read register.\n"); + + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_reg_read); + +int cdns_mhdp_reg_write(struct cdns_mhdp_device *mhdp, u32 addr, u32 val) +{ + u8 msg[8]; + + put_unaligned_be32(addr, msg); + put_unaligned_be32(val, msg + 4); + + return cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_GENERAL, + GENERAL_WRITE_REGISTER, sizeof(msg), msg); +} +EXPORT_SYMBOL(cdns_mhdp_reg_write); + +int cdns_mhdp_reg_write_bit(struct cdns_mhdp_device *mhdp, u16 addr, + u8 start_bit, u8 bits_no, u32 val) +{ + u8 field[8]; + + put_unaligned_be16(addr, field); + field[2] = start_bit; + field[3] = bits_no; + put_unaligned_be32(val, field + 4); + + return cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, + DPTX_WRITE_FIELD, sizeof(field), field); +} +EXPORT_SYMBOL(cdns_mhdp_reg_write_bit); + +int cdns_mhdp_load_firmware(struct cdns_mhdp_device *mhdp, const u32 *i_mem, + u32 i_size, const u32 *d_mem, u32 d_size) +{ + u32 reg; + int i, ret; + + /* reset ucpu before load firmware*/ + cdns_mhdp_bus_write(APB_IRAM_PATH | APB_DRAM_PATH | APB_XT_RESET, + mhdp, APB_CTRL); + + for (i = 0; i < i_size; i += 4) + cdns_mhdp_bus_write(*i_mem++, mhdp, ADDR_IMEM + i); + + for (i = 0; i < d_size; i += 4) + cdns_mhdp_bus_write(*d_mem++, mhdp, ADDR_DMEM + i); + + /* un-reset ucpu */ + cdns_mhdp_bus_write(0, mhdp, APB_CTRL); + + /* check the keep alive register to make sure fw working */ + ret = mhdp_readx_poll_timeout(cdns_mhdp_bus_read, mhdp, KEEP_ALIVE, + reg, reg, 2000, FW_ALIVE_TIMEOUT_US); + if (ret < 0) { + DRM_DEV_ERROR(mhdp->dev, "failed to loaded the FW reg = %x\n", + reg); + return -EINVAL; + } + + reg = cdns_mhdp_bus_read(mhdp, VER_L) & 0xff; + mhdp->fw_version = reg; + reg = cdns_mhdp_bus_read(mhdp, VER_H) & 0xff; + mhdp->fw_version |= reg << 8; + reg = cdns_mhdp_bus_read(mhdp, VER_LIB_L_ADDR) & 0xff; + mhdp->fw_version |= reg << 16; + reg = cdns_mhdp_bus_read(mhdp, VER_LIB_H_ADDR) & 0xff; + mhdp->fw_version |= reg << 24; + + DRM_DEV_DEBUG(mhdp->dev, "firmware version: %x\n", mhdp->fw_version); + + return 0; +} +EXPORT_SYMBOL(cdns_mhdp_load_firmware); + +int cdns_mhdp_set_firmware_active(struct cdns_mhdp_device *mhdp, bool enable) +{ + u8 msg[5]; + int ret, i; + + msg[0] = GENERAL_MAIN_CONTROL; + msg[1] = MB_MODULE_ID_GENERAL; + msg[2] = 0; + msg[3] = 1; + msg[4] = enable ? FW_ACTIVE : FW_STANDBY; + + for (i = 0; i < sizeof(msg); i++) { + ret = mhdp_mailbox_write(mhdp, msg[i]); + if (ret) + goto err_set_firmware_active; + } + + /* read the firmware state */ + for (i = 0; i < sizeof(msg); i++) { + ret = mhdp_mailbox_read(mhdp); + if (ret < 0) + goto err_set_firmware_active; + + msg[i] = ret; + } + + ret = 0; + +err_set_firmware_active: + if (ret < 0) + DRM_DEV_ERROR(mhdp->dev, "set firmware active failed\n"); + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_set_firmware_active); + +int cdns_mhdp_set_host_cap(struct cdns_mhdp_device *mhdp, bool flip) +{ + u8 msg[8]; + int ret; + + msg[0] = drm_dp_link_rate_to_bw_code(mhdp->dp.rate); + msg[1] = mhdp->dp.num_lanes | SCRAMBLER_EN; + msg[2] = VOLTAGE_LEVEL_2; + msg[3] = PRE_EMPHASIS_LEVEL_3; + msg[4] = PTS1 | PTS2 | PTS3 | PTS4; + msg[5] = FAST_LT_NOT_SUPPORT; + msg[6] = flip ? LANE_MAPPING_FLIPPED : LANE_MAPPING_NORMAL; + msg[7] = ENHANCED; + + ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, + DPTX_SET_HOST_CAPABILITIES, + sizeof(msg), msg); + if (ret) + goto err_set_host_cap; + +/* TODO Sandor */ +// ret = cdns_mhdp_reg_write(mhdp, DP_AUX_SWAP_INVERSION_CONTROL, +// AUX_HOST_INVERT); + +err_set_host_cap: + if (ret) + DRM_DEV_ERROR(mhdp->dev, "set host cap failed: %d\n", ret); + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_set_host_cap); + +int cdns_mhdp_event_config(struct cdns_mhdp_device *mhdp) +{ + u8 msg[5]; + int ret; + + memset(msg, 0, sizeof(msg)); + + msg[0] = MHDP_EVENT_ENABLE_HPD | MHDP_EVENT_ENABLE_TRAINING; + + ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, + DPTX_ENABLE_EVENT, sizeof(msg), msg); + if (ret) + DRM_DEV_ERROR(mhdp->dev, "set event config failed: %d\n", ret); + + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_event_config); + +u32 cdns_mhdp_get_event(struct cdns_mhdp_device *mhdp) +{ + return cdns_mhdp_bus_read(mhdp, SW_EVENTS0); +} +EXPORT_SYMBOL(cdns_mhdp_get_event); + +int cdns_mhdp_read_hpd(struct cdns_mhdp_device *mhdp) +{ + u8 status; + int ret; + + ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_GENERAL, GENERAL_GET_HPD_STATE, + 0, NULL); + if (ret) + goto err_get_hpd; + + ret = cdns_mhdp_mailbox_validate_receive(mhdp, MB_MODULE_ID_GENERAL, + GENERAL_GET_HPD_STATE, sizeof(status)); + if (ret) + goto err_get_hpd; + + ret = cdns_mhdp_mailbox_read_receive(mhdp, &status, sizeof(status)); + if (ret) + goto err_get_hpd; + + return status; + +err_get_hpd: + DRM_ERROR("read hpd failed: %d\n", ret); + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_read_hpd); + +int cdns_mhdp_get_edid_block(void *data, u8 *edid, + unsigned int block, size_t length) +{ + struct cdns_mhdp_device *mhdp = data; + u8 msg[2], reg[2], i; + int ret; + + for (i = 0; i < 4; i++) { + msg[0] = block / 2; + msg[1] = block % 2; + + ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, + DPTX_GET_EDID, sizeof(msg), msg); + if (ret) + continue; + + ret = cdns_mhdp_mailbox_validate_receive(mhdp, + MB_MODULE_ID_DP_TX, + DPTX_GET_EDID, + sizeof(reg) + length); + if (ret) + continue; + + ret = cdns_mhdp_mailbox_read_receive(mhdp, reg, sizeof(reg)); + if (ret) + continue; + + ret = cdns_mhdp_mailbox_read_receive(mhdp, edid, length); + if (ret) + continue; + + if (reg[0] == length && reg[1] == block / 2) + break; + } + + if (ret) + DRM_DEV_ERROR(mhdp->dev, "get block[%d] edid failed: %d\n", + block, ret); + + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_get_edid_block); + +int cdns_mhdp_set_video_status(struct cdns_mhdp_device *mhdp, int active) +{ + u8 msg; + int ret; + + msg = !!active; + + ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, + DPTX_SET_VIDEO, sizeof(msg), &msg); + if (ret) + DRM_DEV_ERROR(mhdp->dev, "set video status failed: %d\n", ret); + + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_set_video_status); + +static int mhdp_get_msa_misc(struct video_info *video, + struct drm_display_mode *mode) +{ + u32 msa_misc; + u8 val[2] = {0}; + + switch (video->color_fmt) { + case PXL_RGB: + case Y_ONLY: + val[0] = 0; + break; + /* set YUV default color space conversion to BT601 */ + case YCBCR_4_4_4: + val[0] = 6 + BT_601 * 8; + break; + case YCBCR_4_2_2: + val[0] = 5 + BT_601 * 8; + break; + case YCBCR_4_2_0: + val[0] = 5; + break; + } + + switch (video->color_depth) { + case 6: + val[1] = 0; + break; + case 8: + val[1] = 1; + break; + case 10: + val[1] = 2; + break; + case 12: + val[1] = 3; + break; + case 16: + val[1] = 4; + break; + } + + msa_misc = 2 * val[0] + 32 * val[1] + + ((video->color_fmt == Y_ONLY) ? (1 << 14) : 0); + + return msa_misc; +} + +int cdns_mhdp_config_video(struct cdns_mhdp_device *mhdp) +{ + struct video_info *video = &mhdp->video_info; + struct drm_display_mode *mode = &mhdp->mode; + u64 symbol; + u32 val, link_rate, rem; + u8 bit_per_pix, tu_size_reg = TU_SIZE; + int ret; + + bit_per_pix = (video->color_fmt == YCBCR_4_2_2) ? + (video->color_depth * 2) : (video->color_depth * 3); + + link_rate = mhdp->dp.rate / 1000; + + ret = cdns_mhdp_reg_write(mhdp, BND_HSYNC2VSYNC, VIF_BYPASS_INTERLACE); + if (ret) + goto err_config_video; + + ret = cdns_mhdp_reg_write(mhdp, HSYNC2VSYNC_POL_CTRL, 0); + if (ret) + goto err_config_video; + + /* + * get a best tu_size and valid symbol: + * 1. chose Lclk freq(162Mhz, 270Mhz, 540Mhz), set TU to 32 + * 2. calculate VS(valid symbol) = TU * Pclk * Bpp / (Lclk * Lanes) + * 3. if VS > *.85 or VS < *.1 or VS < 2 or TU < VS + 4, then set + * TU += 2 and repeat 2nd step. + */ + do { + tu_size_reg += 2; + symbol = tu_size_reg * mode->clock * bit_per_pix; + do_div(symbol, mhdp->dp.num_lanes * link_rate * 8); + rem = do_div(symbol, 1000); + if (tu_size_reg > 64) { + ret = -EINVAL; + DRM_DEV_ERROR(mhdp->dev, + "tu error, clk:%d, lanes:%d, rate:%d\n", + mode->clock, mhdp->dp.num_lanes, + link_rate); + goto err_config_video; + } + } while ((symbol <= 1) || (tu_size_reg - symbol < 4) || + (rem > 850) || (rem < 100)); + + val = symbol + (tu_size_reg << 8); + val |= TU_CNT_RST_EN; + ret = cdns_mhdp_reg_write(mhdp, DP_FRAMER_TU, val); + if (ret) + goto err_config_video; + + /* set the FIFO Buffer size */ + val = div_u64(mode->clock * (symbol + 1), 1000) + link_rate; + val /= (mhdp->dp.num_lanes * link_rate); + val = div_u64(8 * (symbol + 1), bit_per_pix) - val; + val += 2; + ret = cdns_mhdp_reg_write(mhdp, DP_VC_TABLE(15), val); + + switch (video->color_depth) { + case 6: + val = BCS_6; + break; + case 8: + val = BCS_8; + break; + case 10: + val = BCS_10; + break; + case 12: + val = BCS_12; + break; + case 16: + val = BCS_16; + break; + } + + val += video->color_fmt << 8; + ret = cdns_mhdp_reg_write(mhdp, DP_FRAMER_PXL_REPR, val); + if (ret) + goto err_config_video; + + val = video->h_sync_polarity ? DP_FRAMER_SP_HSP : 0; + val |= video->v_sync_polarity ? DP_FRAMER_SP_VSP : 0; + ret = cdns_mhdp_reg_write(mhdp, DP_FRAMER_SP, val); + if (ret) + goto err_config_video; + + val = (mode->hsync_start - mode->hdisplay) << 16; + val |= mode->htotal - mode->hsync_end; + ret = cdns_mhdp_reg_write(mhdp, DP_FRONT_BACK_PORCH, val); + if (ret) + goto err_config_video; + + val = mode->hdisplay * bit_per_pix / 8; + ret = cdns_mhdp_reg_write(mhdp, DP_BYTE_COUNT, val); + if (ret) + goto err_config_video; + + val = mode->htotal | ((mode->htotal - mode->hsync_start) << 16); + ret = cdns_mhdp_reg_write(mhdp, MSA_HORIZONTAL_0, val); + if (ret) + goto err_config_video; + + val = mode->hsync_end - mode->hsync_start; + val |= (mode->hdisplay << 16) | (video->h_sync_polarity << 15); + ret = cdns_mhdp_reg_write(mhdp, MSA_HORIZONTAL_1, val); + if (ret) + goto err_config_video; + + val = mode->vtotal; + val |= (mode->vtotal - mode->vsync_start) << 16; + ret = cdns_mhdp_reg_write(mhdp, MSA_VERTICAL_0, val); + if (ret) + goto err_config_video; + + val = mode->vsync_end - mode->vsync_start; + val |= (mode->vdisplay << 16) | (video->v_sync_polarity << 15); + ret = cdns_mhdp_reg_write(mhdp, MSA_VERTICAL_1, val); + if (ret) + goto err_config_video; + + val = mhdp_get_msa_misc(video, mode); + ret = cdns_mhdp_reg_write(mhdp, MSA_MISC, val); + if (ret) + goto err_config_video; + + ret = cdns_mhdp_reg_write(mhdp, STREAM_CONFIG, 1); + if (ret) + goto err_config_video; + + val = mode->hsync_end - mode->hsync_start; + val |= mode->hdisplay << 16; + ret = cdns_mhdp_reg_write(mhdp, DP_HORIZONTAL, val); + if (ret) + goto err_config_video; + + val = mode->vdisplay; + val |= (mode->vtotal - mode->vsync_start) << 16; + ret = cdns_mhdp_reg_write(mhdp, DP_VERTICAL_0, val); + if (ret) + goto err_config_video; + + val = mode->vtotal; + ret = cdns_mhdp_reg_write(mhdp, DP_VERTICAL_1, val); + if (ret) + goto err_config_video; + + ret = cdns_mhdp_reg_write_bit(mhdp, DP_VB_ID, 2, 1, 0); + +err_config_video: + if (ret) + DRM_DEV_ERROR(mhdp->dev, "config video failed: %d\n", ret); + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_config_video); + +int cdns_phy_reg_write(struct cdns_mhdp_device *mhdp, u32 addr, u32 val) +{ + return cdns_mhdp_reg_write(mhdp, ADDR_PHY_AFE + (addr << 2), val); +} +EXPORT_SYMBOL(cdns_phy_reg_write); + +u32 cdns_phy_reg_read(struct cdns_mhdp_device *mhdp, u32 addr) +{ + return cdns_mhdp_reg_read(mhdp, ADDR_PHY_AFE + (addr << 2)); +} +EXPORT_SYMBOL(cdns_phy_reg_read); diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-dp.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-dp.c new file mode 100644 index 000000000000..f025c39d12ea --- /dev/null +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-dp.c @@ -0,0 +1,172 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include <asm/unaligned.h> +#include <drm/bridge/cdns-mhdp.h> +#include <drm/drm_print.h> +#include <linux/io.h> + +#define LINK_TRAINING_TIMEOUT_MS 500 +#define LINK_TRAINING_RETRY_MS 20 + +int cdns_mhdp_dpcd_read(struct cdns_mhdp_device *mhdp, + u32 addr, u8 *data, u16 len) +{ + u8 msg[5], reg[5]; + int ret; + + put_unaligned_be16(len, msg); + put_unaligned_be24(addr, msg + 2); + + ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, + DPTX_READ_DPCD, sizeof(msg), msg); + if (ret) + goto err_dpcd_read; + + ret = cdns_mhdp_mailbox_validate_receive(mhdp, MB_MODULE_ID_DP_TX, + DPTX_READ_DPCD, + sizeof(reg) + len); + if (ret) + goto err_dpcd_read; + + ret = cdns_mhdp_mailbox_read_receive(mhdp, reg, sizeof(reg)); + if (ret) + goto err_dpcd_read; + + ret = cdns_mhdp_mailbox_read_receive(mhdp, data, len); + +err_dpcd_read: + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_dpcd_read); + +int cdns_mhdp_dpcd_write(struct cdns_mhdp_device *mhdp, u32 addr, u8 value) +{ + u8 msg[6], reg[5]; + int ret; + + put_unaligned_be16(1, msg); + put_unaligned_be24(addr, msg + 2); + msg[5] = value; + + ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, + DPTX_WRITE_DPCD, sizeof(msg), msg); + if (ret) + goto err_dpcd_write; + + ret = cdns_mhdp_mailbox_validate_receive(mhdp, MB_MODULE_ID_DP_TX, + DPTX_WRITE_DPCD, sizeof(reg)); + if (ret) + goto err_dpcd_write; + + ret = cdns_mhdp_mailbox_read_receive(mhdp, reg, sizeof(reg)); + if (ret) + goto err_dpcd_write; + + if (addr != get_unaligned_be24(reg + 2)) + ret = -EINVAL; + +err_dpcd_write: + if (ret) + DRM_DEV_ERROR(mhdp->dev, "dpcd write failed: %d\n", ret); + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_dpcd_write); + +static int cdns_mhdp_training_start(struct cdns_mhdp_device *mhdp) +{ + unsigned long timeout; + u8 msg, event[2]; + int ret; + + msg = LINK_TRAINING_RUN; + + /* start training */ + ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, + DPTX_TRAINING_CONTROL, sizeof(msg), &msg); + if (ret) + goto err_training_start; + + timeout = jiffies + msecs_to_jiffies(LINK_TRAINING_TIMEOUT_MS); + while (time_before(jiffies, timeout)) { + msleep(LINK_TRAINING_RETRY_MS); + ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, + DPTX_READ_EVENT, 0, NULL); + if (ret) + goto err_training_start; + + ret = cdns_mhdp_mailbox_validate_receive(mhdp, + MB_MODULE_ID_DP_TX, + DPTX_READ_EVENT, + sizeof(event)); + if (ret) + goto err_training_start; + + ret = cdns_mhdp_mailbox_read_receive(mhdp, event, + sizeof(event)); + if (ret) + goto err_training_start; + + if (event[1] & EQ_PHASE_FINISHED) + return 0; + } + + ret = -ETIMEDOUT; + +err_training_start: + DRM_DEV_ERROR(mhdp->dev, "training failed: %d\n", ret); + return ret; +} + +static int cdns_mhdp_get_training_status(struct cdns_mhdp_device *mhdp) +{ + u8 status[10]; + int ret; + + ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, + DPTX_READ_LINK_STAT, 0, NULL); + if (ret) + goto err_get_training_status; + + ret = cdns_mhdp_mailbox_validate_receive(mhdp, MB_MODULE_ID_DP_TX, + DPTX_READ_LINK_STAT, + sizeof(status)); + if (ret) + goto err_get_training_status; + + ret = cdns_mhdp_mailbox_read_receive(mhdp, status, sizeof(status)); + if (ret) + goto err_get_training_status; + + mhdp->dp.rate = drm_dp_bw_code_to_link_rate(status[0]); + mhdp->dp.num_lanes = status[1]; + +err_get_training_status: + if (ret) + DRM_DEV_ERROR(mhdp->dev, "get training status failed: %d\n", + ret); + return ret; +} + +int cdns_mhdp_train_link(struct cdns_mhdp_device *mhdp) +{ + int ret; + + ret = cdns_mhdp_training_start(mhdp); + if (ret) { + DRM_DEV_ERROR(mhdp->dev, "Failed to start training %d\n", + ret); + return ret; + } + + ret = cdns_mhdp_get_training_status(mhdp); + if (ret) { + DRM_DEV_ERROR(mhdp->dev, "Failed to get training stat %d\n", + ret); + return ret; + } + + DRM_DEV_DEBUG_KMS(mhdp->dev, "rate:0x%x, lanes:%d\n", mhdp->dp.rate, + mhdp->dp.num_lanes); + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_train_link); diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c new file mode 100644 index 000000000000..c37a7ac6af9b --- /dev/null +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c @@ -0,0 +1,332 @@ +/* + * Copyright (C) 2019 NXP Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include <drm/drm_vblank.h> +#include <drm/drm_print.h> +#include <linux/io.h> +#include <drm/bridge/cdns-mhdp.h> +#include <linux/regmap.h> + +void cdns_mhdp_infoframe_set(struct cdns_mhdp_device *mhdp, + u8 entry_id, u8 packet_len, u8 *packet, u8 packet_type) +{ + u32 *packet32, len32; + u32 val, i; + + /* invalidate entry */ + val = F_ACTIVE_IDLE_TYPE(1) | F_PKT_ALLOC_ADDRESS(entry_id); + cdns_mhdp_bus_write(val, mhdp, SOURCE_PIF_PKT_ALLOC_REG); + cdns_mhdp_bus_write(F_PKT_ALLOC_WR_EN(1), mhdp, SOURCE_PIF_PKT_ALLOC_WR_EN); + + /* flush fifo 1 */ + cdns_mhdp_bus_write(F_FIFO1_FLUSH(1), mhdp, SOURCE_PIF_FIFO1_FLUSH); + + /* write packet into memory */ + packet32 = (u32 *)packet; + len32 = packet_len / 4; + for (i = 0; i < len32; i++) + cdns_mhdp_bus_write(F_DATA_WR(packet32[i]), mhdp, SOURCE_PIF_DATA_WR); + + /* write entry id */ + cdns_mhdp_bus_write(F_WR_ADDR(entry_id), mhdp, SOURCE_PIF_WR_ADDR); + + /* write request */ + cdns_mhdp_bus_write(F_HOST_WR(1), mhdp, SOURCE_PIF_WR_REQ); + + /* update entry */ + val = F_ACTIVE_IDLE_TYPE(1) | F_TYPE_VALID(1) | + F_PACKET_TYPE(packet_type) | F_PKT_ALLOC_ADDRESS(entry_id); + cdns_mhdp_bus_write(val, mhdp, SOURCE_PIF_PKT_ALLOC_REG); + + cdns_mhdp_bus_write(F_PKT_ALLOC_WR_EN(1), mhdp, SOURCE_PIF_PKT_ALLOC_WR_EN); +} + +int cdns_hdmi_get_edid_block(void *data, u8 *edid, + u32 block, size_t length) +{ + struct cdns_mhdp_device *mhdp = data; + u8 msg[2], reg[5], i; + int ret; + + for (i = 0; i < 4; i++) { + msg[0] = block / 2; + msg[1] = block % 2; + + ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_HDMI_TX, HDMI_TX_EDID, + sizeof(msg), msg); + if (ret) + continue; + + ret = cdns_mhdp_mailbox_validate_receive(mhdp, MB_MODULE_ID_HDMI_TX, + HDMI_TX_EDID, sizeof(reg) + length); + if (ret) + continue; + + ret = cdns_mhdp_mailbox_read_receive(mhdp, reg, sizeof(reg)); + if (ret) + continue; + + ret = cdns_mhdp_mailbox_read_receive(mhdp, edid, length); + if (ret) + continue; + + if ((reg[3] << 8 | reg[4]) == length) + break; + } + + if (ret) + DRM_ERROR("get block[%d] edid failed: %d\n", block, ret); + return ret; +} + +int cdns_hdmi_scdc_read(struct cdns_mhdp_device *mhdp, u8 addr, u8 *data) +{ + u8 msg[4], reg[6]; + int ret; + + msg[0] = 0x54; + msg[1] = addr; + msg[2] = 0; + msg[3] = 1; + ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_HDMI_TX, HDMI_TX_READ, + sizeof(msg), msg); + if (ret) + goto err_scdc_read; + + ret = cdns_mhdp_mailbox_validate_receive(mhdp, MB_MODULE_ID_HDMI_TX, + HDMI_TX_READ, sizeof(reg)); + if (ret) + goto err_scdc_read; + + ret = cdns_mhdp_mailbox_read_receive(mhdp, reg, sizeof(reg)); + if (ret) + goto err_scdc_read; + + *data = reg[5]; + +err_scdc_read: + if (ret) + DRM_ERROR("scdc read failed: %d\n", ret); + return ret; +} + +int cdns_hdmi_scdc_write(struct cdns_mhdp_device *mhdp, u8 addr, u8 value) +{ + u8 msg[5], reg[5]; + int ret; + + msg[0] = 0x54; + msg[1] = addr; + msg[2] = 0; + msg[3] = 1; + msg[4] = value; + ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_HDMI_TX, HDMI_TX_WRITE, + sizeof(msg), msg); + if (ret) + goto err_scdc_write; + + ret = cdns_mhdp_mailbox_validate_receive(mhdp, MB_MODULE_ID_HDMI_TX, + HDMI_TX_WRITE, sizeof(reg)); + if (ret) + goto err_scdc_write; + + ret = cdns_mhdp_mailbox_read_receive(mhdp, reg, sizeof(reg)); + if (ret) + goto err_scdc_write; + + if (reg[0] != 0) + ret = -EINVAL; + +err_scdc_write: + if (ret) + DRM_ERROR("scdc write failed: %d\n", ret); + return ret; +} + +int cdns_hdmi_ctrl_init(struct cdns_mhdp_device *mhdp, + int protocol, + u32 char_rate) +{ + u32 reg0; + u32 reg1; + u32 val; + int ret; + + /* Set PHY to HDMI data */ + ret = cdns_mhdp_reg_write(mhdp, PHY_DATA_SEL, F_SOURCE_PHY_MHDP_SEL(1)); + if (ret < 0) + return ret; + + ret = cdns_mhdp_reg_write(mhdp, HDTX_HPD, + F_HPD_VALID_WIDTH(4) | F_HPD_GLITCH_WIDTH(0)); + if (ret < 0) + return ret; + + /* open CARS */ + ret = cdns_mhdp_reg_write(mhdp, SOURCE_PHY_CAR, 0xF); + if (ret < 0) + return ret; + ret = cdns_mhdp_reg_write(mhdp, SOURCE_HDTX_CAR, 0xFF); + if (ret < 0) + return ret; + ret = cdns_mhdp_reg_write(mhdp, SOURCE_PKT_CAR, 0xF); + if (ret < 0) + return ret; + ret = cdns_mhdp_reg_write(mhdp, SOURCE_AIF_CAR, 0xF); + if (ret < 0) + return ret; + ret = cdns_mhdp_reg_write(mhdp, SOURCE_CIPHER_CAR, 0xF); + if (ret < 0) + return ret; + ret = cdns_mhdp_reg_write(mhdp, SOURCE_CRYPTO_CAR, 0xF); + if (ret < 0) + return ret; + ret = cdns_mhdp_reg_write(mhdp, SOURCE_CEC_CAR, 3); + if (ret < 0) + return ret; + + reg0 = reg1 = 0x7c1f; + if (protocol == MODE_HDMI_2_0 && char_rate >= 340000) { + reg0 = 0; + reg1 = 0xFFFFF; + } + ret = cdns_mhdp_reg_write(mhdp, HDTX_CLOCK_REG_0, reg0); + if (ret < 0) + return ret; + ret = cdns_mhdp_reg_write(mhdp, HDTX_CLOCK_REG_1, reg1); + if (ret < 0) + return ret; + + /* set hdmi mode and preemble mode data enable */ + val = F_HDMI_MODE(protocol) | F_HDMI2_PREAMBLE_EN(1) | F_DATA_EN(1) | + F_HDMI2_CTRL_IL_MODE(1) | F_BCH_EN(1) | F_PIC_3D(0XF); + ret = cdns_mhdp_reg_write(mhdp, HDTX_CONTROLLER, val); + + return ret; +} + +int cdns_hdmi_mode_config(struct cdns_mhdp_device *mhdp, + struct drm_display_mode *mode, + struct video_info *video_info) +{ + int ret; + u32 val; + u32 vsync_lines = mode->vsync_end - mode->vsync_start; + u32 eof_lines = mode->vsync_start - mode->vdisplay; + u32 sof_lines = mode->vtotal - mode->vsync_end; + u32 hblank = mode->htotal - mode->hdisplay; + u32 hactive = mode->hdisplay; + u32 vblank = mode->vtotal - mode->vdisplay; + u32 vactive = mode->vdisplay; + u32 hfront = mode->hsync_start - mode->hdisplay; + u32 hback = mode->htotal - mode->hsync_end; + u32 vfront = eof_lines; + u32 hsync = hblank - hfront - hback; + u32 vsync = vsync_lines; + u32 vback = sof_lines; + u32 v_h_polarity = ((mode->flags & DRM_MODE_FLAG_NHSYNC) ? 0 : 1) + + ((mode->flags & DRM_MODE_FLAG_NVSYNC) ? 0 : 2); + + ret = cdns_mhdp_reg_write(mhdp, SCHEDULER_H_SIZE, (hactive << 16) + hblank); + if (ret < 0) + return ret; + + ret = cdns_mhdp_reg_write(mhdp, SCHEDULER_V_SIZE, (vactive << 16) + vblank); + if (ret < 0) + return ret; + + ret = cdns_mhdp_reg_write(mhdp, HDTX_SIGNAL_FRONT_WIDTH, (vfront << 16) + hfront); + if (ret < 0) + return ret; + + ret = cdns_mhdp_reg_write(mhdp, HDTX_SIGNAL_SYNC_WIDTH, (vsync << 16) + hsync); + if (ret < 0) + return ret; + + ret = cdns_mhdp_reg_write(mhdp, HDTX_SIGNAL_BACK_WIDTH, (vback << 16) + hback); + if (ret < 0) + return ret; + + ret = cdns_mhdp_reg_write(mhdp, HSYNC2VSYNC_POL_CTRL, v_h_polarity); + if (ret < 0) + return ret; + + /* Reset Data Enable */ + val = cdns_mhdp_reg_read(mhdp, HDTX_CONTROLLER); + val &= ~F_DATA_EN(1); + ret = cdns_mhdp_reg_write(mhdp, HDTX_CONTROLLER, val); + if (ret < 0) + return ret; + + /* Set bpc */ + val &= ~F_VIF_DATA_WIDTH(3); + switch (video_info->color_depth) { + case 10: + val |= F_VIF_DATA_WIDTH(1); + break; + case 12: + val |= F_VIF_DATA_WIDTH(2); + break; + case 16: + val |= F_VIF_DATA_WIDTH(3); + break; + case 8: + default: + val |= F_VIF_DATA_WIDTH(0); + break; + } + + /* select color encoding */ + val &= ~F_HDMI_ENCODING(3); + switch (video_info->color_fmt) { + case YCBCR_4_4_4: + val |= F_HDMI_ENCODING(2); + break; + case YCBCR_4_2_2: + val |= F_HDMI_ENCODING(1); + break; + case YCBCR_4_2_0: + val |= F_HDMI_ENCODING(3); + break; + case PXL_RGB: + default: + val |= F_HDMI_ENCODING(0); + break; + } + + ret = cdns_mhdp_reg_write(mhdp, HDTX_CONTROLLER, val); + if (ret < 0) + return ret; + + /* set data enable */ + val |= F_DATA_EN(1); + ret = cdns_mhdp_reg_write(mhdp, HDTX_CONTROLLER, val); + + return ret; +} + +int cdns_hdmi_disable_gcp(struct cdns_mhdp_device *mhdp) +{ + u32 val; + + val = cdns_mhdp_reg_read(mhdp, HDTX_CONTROLLER); + val &= ~F_GCP_EN(1); + + return cdns_mhdp_reg_write(mhdp, HDTX_CONTROLLER, val); +} + +int cdns_hdmi_enable_gcp(struct cdns_mhdp_device *mhdp) +{ + u32 val; + + val = cdns_mhdp_reg_read(mhdp, HDTX_CONTROLLER); + val |= F_GCP_EN(1); + + return cdns_mhdp_reg_write(mhdp, HDTX_CONTROLLER, val); +} diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp.h b/drivers/gpu/drm/bridge/cadence/cdns-mhdp.h new file mode 100644 index 000000000000..399c3f6f86ad --- /dev/null +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp.h @@ -0,0 +1,209 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Cadence MHDP DP MST bridge driver. + * + * Copyright: 2018 Cadence Design Systems, Inc. + * + * Author: Quentin Schulz <quentin.schulz@free-electrons.com> + */ + + +#ifndef CDNS_MHDP_H +#define CDNS_MHDP_H + +#include <drm/display/drm_dp_mst_helper.h> + +#define CDNS_APB_CFG 0x00000 +#define CDNS_APB_CTRL (CDNS_APB_CFG + 0x00) +#define CDNS_MAILBOX_FULL (CDNS_APB_CFG + 0x08) +#define CDNS_MAILBOX_EMPTY (CDNS_APB_CFG + 0x0c) +#define CDNS_MAILBOX_TX_DATA (CDNS_APB_CFG + 0x10) +#define CDNS_MAILBOX_RX_DATA (CDNS_APB_CFG + 0x14) +#define CDNS_KEEP_ALIVE (CDNS_APB_CFG + 0x18) +#define CDNS_KEEP_ALIVE_MASK GENMASK(7, 0) + +#define CDNS_MB_INT_MASK (CDNS_APB_CFG + 0x34) + +#define CDNS_SW_CLK_L (CDNS_APB_CFG + 0x3c) +#define CDNS_SW_CLK_H (CDNS_APB_CFG + 0x40) +#define CDNS_SW_EVENT0 (CDNS_APB_CFG + 0x44) +#define CDNS_DPTX_HPD BIT(0) + +#define CDNS_SW_EVENT1 (CDNS_APB_CFG + 0x48) +#define CDNS_SW_EVENT2 (CDNS_APB_CFG + 0x4c) +#define CDNS_SW_EVENT3 (CDNS_APB_CFG + 0x50) + +#define CDNS_APB_INT_MASK (CDNS_APB_CFG + 0x6C) +#define CDNS_APB_INT_MASK_MAILBOX_INT BIT(0) +#define CDNS_APB_INT_MASK_SW_EVENT_INT BIT(1) + +#define CDNS_DPTX_CAR (CDNS_APB_CFG + 0x904) +#define CDNS_VIF_CLK_EN BIT(0) +#define CDNS_VIF_CLK_RSTN BIT(1) + +#define CDNS_SOURCE_VIDEO_IF(s) (0x00b00 + (s * 0x20)) +#define CDNS_BND_HSYNC2VSYNC(s) (CDNS_SOURCE_VIDEO_IF(s) + \ + 0x00) +#define CDNS_IP_DTCT_WIN GENMASK(11, 0) +#define CDNS_IP_DET_INTERLACE_FORMAT BIT(12) +#define CDNS_IP_BYPASS_V_INTERFACE BIT(13) + +#define CDNS_HSYNC2VSYNC_POL_CTRL(s) (CDNS_SOURCE_VIDEO_IF(s) + \ + 0x10) +#define CDNS_H2V_HSYNC_POL_ACTIVE_LOW BIT(1) +#define CDNS_H2V_VSYNC_POL_ACTIVE_LOW BIT(2) + +#define CDNS_DPTX_PHY_CONFIG 0x02000 +#define CDNS_PHY_TRAINING_EN BIT(0) +#define CDNS_PHY_TRAINING_TYPE(x) (((x) & GENMASK(3, 0)) << 1) +#define CDNS_PHY_SCRAMBLER_BYPASS BIT(5) +#define CDNS_PHY_ENCODER_BYPASS BIT(6) +#define CDNS_PHY_SKEW_BYPASS BIT(7) +#define CDNS_PHY_TRAINING_AUTO BIT(8) +#define CDNS_PHY_LANE0_SKEW(x) (((x) & GENMASK(2, 0)) << 9) +#define CDNS_PHY_LANE1_SKEW(x) (((x) & GENMASK(2, 0)) << 12) +#define CDNS_PHY_LANE2_SKEW(x) (((x) & GENMASK(2, 0)) << 15) +#define CDNS_PHY_LANE3_SKEW(x) (((x) & GENMASK(2, 0)) << 18) +#define CDNS_PHY_COMMON_CONFIG (CDNS_PHY_LANE1_SKEW(1) | \ + CDNS_PHY_LANE2_SKEW(2) | \ + CDNS_PHY_LANE3_SKEW(3)) +#define CDNS_PHY_10BIT_EN BIT(21) + +#define CDNS_DPTX_FRAMER 0x02200 +#define CDNS_DP_FRAMER_GLOBAL_CONFIG (CDNS_DPTX_FRAMER + 0x00) +#define CDNS_DP_NUM_LANES(x) (x - 1) +#define CDNS_DP_MST_EN BIT(2) +#define CDNS_DP_FRAMER_EN BIT(3) +#define CDNS_DP_RATE_GOVERNOR_EN BIT(4) +#define CDNS_DP_NO_VIDEO_MODE BIT(5) +#define CDNS_DP_DISABLE_PHY_RST BIT(6) +#define CDNS_DP_WR_FAILING_EDGE_VSYNC BIT(7) + +#define CDNS_DP_SW_RESET (CDNS_DPTX_FRAMER + 0x04) +#define CDNS_DP_FRAMER_TU (CDNS_DPTX_FRAMER + 0x08) +#define CDNS_DP_FRAMER_TU_SIZE(x) (((x) & GENMASK(6, 0)) << 8) +#define CDNS_DP_FRAMER_TU_VS(x) ((x) & GENMASK(5, 0)) +#define CDNS_DP_FRAMER_TU_CNT_RST_EN BIT(15) + +#define CDNS_DPTX_STREAM(s) (0x03000 + s * 0x80) +#define CDNS_DP_MSA_HORIZONTAL_0(s) (CDNS_DPTX_STREAM(s) + 0x00) +#define CDNS_DP_MSAH0_H_TOTAL(x) (x) +#define CDNS_DP_MSAH0_HSYNC_START(x) ((x) << 16) + +#define CDNS_DP_MSA_HORIZONTAL_1(s) (CDNS_DPTX_STREAM(s) + 0x04) +#define CDNS_DP_MSAH1_HSYNC_WIDTH(x) (x) +#define CDNS_DP_MSAH1_HSYNC_POL_LOW BIT(15) +#define CDNS_DP_MSAH1_HDISP_WIDTH(x) ((x) << 16) + +#define CDNS_DP_MSA_VERTICAL_0(s) (CDNS_DPTX_STREAM(s) + 0x08) +#define CDNS_DP_MSAV0_V_TOTAL(x) (x) +#define CDNS_DP_MSAV0_VSYNC_START(x) ((x) << 16) + +#define CDNS_DP_MSA_VERTICAL_1(s) (CDNS_DPTX_STREAM(s) + 0x0c) +#define CDNS_DP_MSAV1_VSYNC_WIDTH(x) (x) +#define CDNS_DP_MSAV1_VSYNC_POL_LOW BIT(15) +#define CDNS_DP_MSAV1_VDISP_WIDTH(x) ((x) << 16) + +#define CDNS_DP_MSA_MISC(s) (CDNS_DPTX_STREAM(s) + 0x10) +#define CDNS_DP_STREAM_CONFIGs(s) (CDNS_DPTX_STREAM(s) + 0x14) +#define CDNS_DP_STREAM_CONFIG_2(s) (CDNS_DPTX_STREAM(s) + 0x2c) +#define CDNS_DP_SC2_TU_VS_DIFF(x) ((x) << 8) + +#define CDNS_DP_HORIZONTAL(s) (CDNS_DPTX_STREAM(s) + 0x30) +#define CDNS_DP_H_HSYNC_WIDTH(x) (x) +#define CDNS_DP_H_H_TOTAL(x) ((x) << 16) + +#define CDNS_DP_VERTICAL_0(s) (CDNS_DPTX_STREAM(s) + 0x34) +#define CDNS_DP_V0_VHEIGHT(x) (x) +#define CDNS_DP_V0_VSTART(x) ((x) << 16) + +#define CDNS_DP_VERTICAL_1(s) (CDNS_DPTX_STREAM(s) + 0x38) +#define CDNS_DP_V1_VTOTAL(x) (x) +#define CDNS_DP_V1_VTOTAL_EVEN BIT(16) + +#define CDNS_DP_FRAMER_PXL_REPR(s) (CDNS_DPTX_STREAM(s) + 0x4c) +#define CDNS_DP_FRAMER_6_BPC BIT(0) +#define CDNS_DP_FRAMER_8_BPC BIT(1) +#define CDNS_DP_FRAMER_10_BPC BIT(2) +#define CDNS_DP_FRAMER_12_BPC BIT(3) +#define CDNS_DP_FRAMER_16_BPC BIT(4) +#define CDNS_DP_FRAMER_PXL_FORMAT 0x8 +#define CDNS_DP_FRAMER_RGB BIT(0) +#define CDNS_DP_FRAMER_YCBCR444 BIT(1) +#define CDNS_DP_FRAMER_YCBCR422 BIT(2) +#define CDNS_DP_FRAMER_YCBCR420 BIT(3) +#define CDNS_DP_FRAMER_Y_ONLY BIT(4) + +#define CDNS_DP_FRAMER_SP(s) (CDNS_DPTX_STREAM(s) + 0x10) +#define CDNS_DP_FRAMER_VSYNC_POL_LOW BIT(0) +#define CDNS_DP_FRAMER_HSYNC_POL_LOW BIT(1) +#define CDNS_DP_FRAMER_INTERLACE BIT(2) + +#define CDNS_DP_LINE_THRESH(s) (CDNS_DPTX_STREAM(s) + 0x64) +#define CDNS_DP_ACTIVE_LINE_THRESH(x) (x) + +#define CDNS_DP_VB_ID(s) (CDNS_DPTX_STREAM(s) + 0x68) +#define CDNS_DP_VB_ID_INTERLACED BIT(2) +#define CDNS_DP_VB_ID_COMPRESSED BIT(6) + +#define CDNS_DP_FRONT_BACK_PORCH(s) (CDNS_DPTX_STREAM(s) + 0x78) +#define CDNS_DP_BACK_PORCH(x) (x) +#define CDNS_DP_FRONT_PORCH(x) ((x) << 16) + +#define CDNS_DP_BYTE_COUNT(s) (CDNS_DPTX_STREAM(s) + 0x7c) +#define CDNS_DP_BYTE_COUNT_BYTES_IN_CHUNK_SHIFT 16 + +#define CDNS_DP_MST_STREAM_CONFIG(s) (CDNS_DPTX_STREAM(s) + 0x14) +#define CDNS_DP_MST_STRM_CFG_STREAM_EN BIT(0) +#define CDNS_DP_MST_STRM_CFG_NO_VIDEO BIT(1) + +#define CDNS_DP_MST_SLOT_ALLOCATE(s) (CDNS_DPTX_STREAM(s) + 0x44) +#define CDNS_DP_S_ALLOC_START_SLOT(x) (x) +#define CDNS_DP_S_ALLOC_END_SLOT(x) ((x) << 8) + +#define CDNS_DP_RATE_GOVERNING(s) (CDNS_DPTX_STREAM(s) + 0x48) +#define CDNS_DP_RG_TARG_AV_SLOTS_Y(x) (x) +#define CDNS_DP_RG_TARG_AV_SLOTS_X(x) (x << 4) +#define CDNS_DP_RG_ENABLE BIT(10) + +#define CDNS_DP_MTPH_CONTROL 0x2264 +#define CDNS_DP_MTPH_ECF_EN BIT(0) +#define CDNS_DP_MTPH_ACT_EN BIT(1) +#define CDNS_DP_MTPH_LVP_EN BIT(2) + +#define CDNS_DP_MTPH_STATUS 0x226C +#define CDNS_DP_MTPH_ACT_STATUS BIT(0) + + +#define CDNS_DPTX_GLOBAL 0x02300 +#define CDNS_DP_LANE_EN (CDNS_DPTX_GLOBAL + 0x00) +#define CDNS_DP_LANE_EN_LANES(x) GENMASK(x - 1, 0) +#define CDNS_DP_ENHNCD (CDNS_DPTX_GLOBAL + 0x04) + + +#define to_mhdp_connector(x) container_of(x, struct cdns_mhdp_connector, base) +#define to_mhdp_bridge(x) container_of(x, struct cdns_mhdp_bridge, base) +#define mgr_to_mhdp(x) container_of(x, struct cdns_mhdp_device, mst_mgr) + +#define CDNS_MHDP_MAX_STREAMS 4 + +enum pixel_format { + PIXEL_FORMAT_RGB = 1, + PIXEL_FORMAT_YCBCR_444 = 2, + PIXEL_FORMAT_YCBCR_422 = 4, + PIXEL_FORMAT_YCBCR_420 = 8, + PIXEL_FORMAT_Y_ONLY = 16, +}; + + +int cdns_mhdp_mst_init(struct cdns_mhdp_device *mhdp); +void cdns_mhdp_mst_deinit(struct cdns_mhdp_device *mhdp); +bool cdns_mhdp_mst_probe(struct cdns_mhdp_device *mhdp); +enum pixel_format cdns_mhdp_get_pxlfmt(u32 color_formats); +u32 cdns_mhdp_get_bpp(u32 bpc, u32 color_formats); +void cdns_mhdp_configure_video(struct drm_bridge *bridge); +void cdns_mhdp_mst_enable(struct drm_bridge *bridge); +void cdns_mhdp_mst_disable(struct drm_bridge *bridge); +void cdns_mhdp_enable(struct drm_bridge *bridge); + +#endif diff --git a/drivers/gpu/drm/rockchip/Makefile b/drivers/gpu/drm/rockchip/Makefile index 17a9e7eb2130..bd013659404f 100644 --- a/drivers/gpu/drm/rockchip/Makefile +++ b/drivers/gpu/drm/rockchip/Makefile @@ -8,7 +8,7 @@ rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o \ rockchipdrm-$(CONFIG_ROCKCHIP_VOP2) += rockchip_drm_vop2.o rockchip_vop2_reg.o rockchipdrm-$(CONFIG_ROCKCHIP_VOP) += rockchip_drm_vop.o rockchip_vop_reg.o rockchipdrm-$(CONFIG_ROCKCHIP_ANALOGIX_DP) += analogix_dp-rockchip.o -rockchipdrm-$(CONFIG_ROCKCHIP_CDN_DP) += cdn-dp-core.o cdn-dp-reg.o +rockchipdrm-$(CONFIG_ROCKCHIP_CDN_DP) += cdn-dp-core.o rockchipdrm-$(CONFIG_ROCKCHIP_DW_HDMI) += dw_hdmi-rockchip.o rockchipdrm-$(CONFIG_ROCKCHIP_DW_MIPI_DSI) += dw-mipi-dsi-rockchip.o rockchipdrm-$(CONFIG_ROCKCHIP_INNO_HDMI) += inno_hdmi.o diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c index a4a45daf93f2..058bc372f02b 100644 --- a/drivers/gpu/drm/rockchip/cdn-dp-core.c +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c @@ -23,11 +23,10 @@ #include <drm/drm_simple_kms_helper.h> #include "cdn-dp-core.h" -#include "cdn-dp-reg.h" #include "rockchip_drm_vop.h" static inline struct cdn_dp_device *connector_to_dp(struct drm_connector *connector) { - return container_of(connector, struct cdn_dp_device, connector); + return container_of(connector, struct cdn_dp_device, mhdp.connector.base); } @@ -62,17 +61,18 @@ MODULE_DEVICE_TABLE(of, cdn_dp_dt_ids); static int cdn_dp_grf_write(struct cdn_dp_device *dp, unsigned int reg, unsigned int val) { + struct device *dev = dp->mhdp.dev; int ret; ret = clk_prepare_enable(dp->grf_clk); if (ret) { - DRM_DEV_ERROR(dp->dev, "Failed to prepare_enable grf clock\n"); + DRM_DEV_ERROR(dev, "Failed to prepare_enable grf clock\n"); return ret; } ret = regmap_write(dp->grf, reg, val); if (ret) { - DRM_DEV_ERROR(dp->dev, "Could not write to GRF: %d\n", ret); + DRM_DEV_ERROR(dev, "Could not write to GRF: %d\n", ret); clk_disable_unprepare(dp->grf_clk); return ret; } @@ -83,24 +83,25 @@ static int cdn_dp_grf_write(struct cdn_dp_device *dp, static int cdn_dp_clk_enable(struct cdn_dp_device *dp) { + struct device *dev = dp->mhdp.dev; int ret; unsigned long rate; ret = clk_prepare_enable(dp->pclk); if (ret < 0) { - DRM_DEV_ERROR(dp->dev, "cannot enable dp pclk %d\n", ret); + DRM_DEV_ERROR(dev, "cannot enable dp pclk %d\n", ret); goto err_pclk; } ret = clk_prepare_enable(dp->core_clk); if (ret < 0) { - DRM_DEV_ERROR(dp->dev, "cannot enable core_clk %d\n", ret); + DRM_DEV_ERROR(dev, "cannot enable core_clk %d\n", ret); goto err_core_clk; } - ret = pm_runtime_get_sync(dp->dev); + ret = pm_runtime_get_sync(dev); if (ret < 0) { - DRM_DEV_ERROR(dp->dev, "cannot get pm runtime %d\n", ret); + DRM_DEV_ERROR(dev, "cannot get pm runtime %d\n", ret); goto err_pm_runtime_get; } @@ -113,18 +114,18 @@ static int cdn_dp_clk_enable(struct cdn_dp_device *dp) rate = clk_get_rate(dp->core_clk); if (!rate) { - DRM_DEV_ERROR(dp->dev, "get clk rate failed\n"); + DRM_DEV_ERROR(dev, "get clk rate failed\n"); ret = -EINVAL; goto err_set_rate; } - cdn_dp_set_fw_clk(dp, rate); - cdn_dp_clock_reset(dp); + cdns_mhdp_set_fw_clk(&dp->mhdp, rate); + cdns_mhdp_clock_reset(&dp->mhdp); return 0; err_set_rate: - pm_runtime_put(dp->dev); + pm_runtime_put(dev); err_pm_runtime_get: clk_disable_unprepare(dp->core_clk); err_core_clk: @@ -135,7 +136,7 @@ static int cdn_dp_clk_enable(struct cdn_dp_device *dp) static void cdn_dp_clk_disable(struct cdn_dp_device *dp) { - pm_runtime_put_sync(dp->dev); + pm_runtime_put_sync(dp->mhdp.dev); clk_disable_unprepare(dp->pclk); clk_disable_unprepare(dp->core_clk); } @@ -168,7 +169,7 @@ static int cdn_dp_get_sink_count(struct cdn_dp_device *dp, u8 *sink_count) u8 value; *sink_count = 0; - ret = cdn_dp_dpcd_read(dp, DP_SINK_COUNT, &value, 1); + ret = drm_dp_dpcd_read(&dp->mhdp.dp.aux, DP_SINK_COUNT, &value, 1); if (ret) return ret; @@ -192,12 +193,13 @@ static struct cdn_dp_port *cdn_dp_connected_port(struct cdn_dp_device *dp) static bool cdn_dp_check_sink_connection(struct cdn_dp_device *dp) { + struct device *dev = dp->mhdp.dev; unsigned long timeout = jiffies + msecs_to_jiffies(CDN_DPCD_TIMEOUT_MS); struct cdn_dp_port *port; u8 sink_count = 0; if (dp->active_port < 0 || dp->active_port >= dp->ports) { - DRM_DEV_ERROR(dp->dev, "active_port is wrong!\n"); + DRM_DEV_ERROR(dev, "active_port is wrong!\n"); return false; } @@ -219,7 +221,7 @@ static bool cdn_dp_check_sink_connection(struct cdn_dp_device *dp) usleep_range(5000, 10000); } - DRM_DEV_ERROR(dp->dev, "Get sink capability timed out\n"); + DRM_DEV_ERROR(dev, "Get sink capability timed out\n"); return false; } @@ -261,7 +263,8 @@ static int cdn_dp_connector_get_modes(struct drm_connector *connector) mutex_lock(&dp->lock); edid = dp->edid; if (edid) { - DRM_DEV_DEBUG_KMS(dp->dev, "got edid: width[%d] x height[%d]\n", + DRM_DEV_DEBUG_KMS(dp->mhdp.dev, + "got edid: width[%d] x height[%d]\n", edid->width_cm, edid->height_cm); dp->sink_has_audio = drm_detect_monitor_audio(edid); @@ -279,7 +282,8 @@ cdn_dp_connector_mode_valid(struct drm_connector *connector, struct drm_display_mode *mode) { struct cdn_dp_device *dp = connector_to_dp(connector); - struct drm_display_info *display_info = &dp->connector.display_info; + struct drm_display_info *display_info = + &dp->mhdp.connector.base.display_info; u32 requested, actual, rate, sink_max, source_max = 0; u8 lanes, bpc; @@ -302,11 +306,11 @@ static int cdn_dp_connector_mode_valid(struct drm_connector *connector, requested = mode->clock * bpc * 3 / 1000; source_max = dp->lanes; - sink_max = drm_dp_max_lane_count(dp->dpcd); + sink_max = drm_dp_max_lane_count(dp->mhdp.dp.dpcd); lanes = min(source_max, sink_max); - source_max = drm_dp_bw_code_to_link_rate(CDN_DP_MAX_LINK_RATE); - sink_max = drm_dp_max_link_rate(dp->dpcd); + source_max = CDNS_DP_MAX_LINK_RATE; + sink_max = drm_dp_max_link_rate(dp->mhdp.dp.dpcd); rate = min(source_max, sink_max); actual = rate * lanes / 100; @@ -315,7 +319,7 @@ static int cdn_dp_connector_mode_valid(struct drm_connector *connector, actual = actual * 8 / 10; if (requested > actual) { - DRM_DEV_DEBUG_KMS(dp->dev, + DRM_DEV_DEBUG_KMS(dp->mhdp.dev, "requested=%d, actual=%d, clock=%d\n", requested, actual, mode->clock); return MODE_CLOCK_HIGH; @@ -335,59 +339,62 @@ static int cdn_dp_firmware_init(struct cdn_dp_device *dp) const u32 *iram_data, *dram_data; const struct firmware *fw = dp->fw; const struct cdn_firmware_header *hdr; + struct device *dev = dp->mhdp.dev; hdr = (struct cdn_firmware_header *)fw->data; if (fw->size != le32_to_cpu(hdr->size_bytes)) { - DRM_DEV_ERROR(dp->dev, "firmware is invalid\n"); + DRM_DEV_ERROR(dev, "firmware is invalid\n"); return -EINVAL; } iram_data = (const u32 *)(fw->data + hdr->header_size); dram_data = (const u32 *)(fw->data + hdr->header_size + hdr->iram_size); - ret = cdn_dp_load_firmware(dp, iram_data, hdr->iram_size, - dram_data, hdr->dram_size); + ret = cdns_mhdp_load_firmware(&dp->mhdp, iram_data, hdr->iram_size, + dram_data, hdr->dram_size); if (ret) return ret; - ret = cdn_dp_set_firmware_active(dp, true); + ret = cdns_mhdp_set_firmware_active(&dp->mhdp, true); if (ret) { - DRM_DEV_ERROR(dp->dev, "active ucpu failed: %d\n", ret); + DRM_DEV_ERROR(dev, "active ucpu failed: %d\n", ret); return ret; } - return cdn_dp_event_config(dp); + return cdns_mhdp_event_config(&dp->mhdp); } static int cdn_dp_get_sink_capability(struct cdn_dp_device *dp) { + struct cdns_mhdp_device *mhdp = &dp->mhdp; int ret; if (!cdn_dp_check_sink_connection(dp)) return -ENODEV; - ret = cdn_dp_dpcd_read(dp, DP_DPCD_REV, dp->dpcd, + ret = drm_dp_dpcd_read(&mhdp->dp.aux, DP_DPCD_REV, mhdp->dp.dpcd, DP_RECEIVER_CAP_SIZE); if (ret) { - DRM_DEV_ERROR(dp->dev, "Failed to get caps %d\n", ret); + DRM_DEV_ERROR(mhdp->dev, "Failed to get caps %d\n", ret); return ret; } kfree(dp->edid); - dp->edid = drm_do_get_edid(&dp->connector, - cdn_dp_get_edid_block, dp); + dp->edid = drm_do_get_edid(&mhdp->connector.base, + cdns_mhdp_get_edid_block, mhdp); return 0; } static int cdn_dp_enable_phy(struct cdn_dp_device *dp, struct cdn_dp_port *port) { + struct device *dev = dp->mhdp.dev; union extcon_property_value property; int ret; if (!port->phy_enabled) { ret = phy_power_on(port->phy); if (ret) { - DRM_DEV_ERROR(dp->dev, "phy power on failed: %d\n", + DRM_DEV_ERROR(dev, "phy power on failed: %d\n", ret); goto err_phy; } @@ -397,28 +404,28 @@ static int cdn_dp_enable_phy(struct cdn_dp_device *dp, struct cdn_dp_port *port) ret = cdn_dp_grf_write(dp, GRF_SOC_CON26, DPTX_HPD_SEL_MASK | DPTX_HPD_SEL); if (ret) { - DRM_DEV_ERROR(dp->dev, "Failed to write HPD_SEL %d\n", ret); + DRM_DEV_ERROR(dev, "Failed to write HPD_SEL %d\n", ret); goto err_power_on; } - ret = cdn_dp_get_hpd_status(dp); + ret = cdns_mhdp_read_hpd(&dp->mhdp); if (ret <= 0) { if (!ret) - DRM_DEV_ERROR(dp->dev, "hpd does not exist\n"); + DRM_DEV_ERROR(dev, "hpd does not exist\n"); goto err_power_on; } ret = extcon_get_property(port->extcon, EXTCON_DISP_DP, EXTCON_PROP_USB_TYPEC_POLARITY, &property); if (ret) { - DRM_DEV_ERROR(dp->dev, "get property failed\n"); + DRM_DEV_ERROR(dev, "get property failed\n"); goto err_power_on; } port->lanes = cdn_dp_get_port_lanes(port); - ret = cdn_dp_set_host_cap(dp, port->lanes, property.intval); + ret = cdns_mhdp_set_host_cap(&dp->mhdp, property.intval); if (ret) { - DRM_DEV_ERROR(dp->dev, "set host capabilities failed: %d\n", + DRM_DEV_ERROR(dev, "set host capabilities failed: %d\n", ret); goto err_power_on; } @@ -428,7 +435,7 @@ static int cdn_dp_enable_phy(struct cdn_dp_device *dp, struct cdn_dp_port *port) err_power_on: if (phy_power_off(port->phy)) - DRM_DEV_ERROR(dp->dev, "phy power off failed: %d", ret); + DRM_DEV_ERROR(dev, "phy power off failed: %d", ret); else port->phy_enabled = false; @@ -446,7 +453,8 @@ static int cdn_dp_disable_phy(struct cdn_dp_device *dp, if (port->phy_enabled) { ret = phy_power_off(port->phy); if (ret) { - DRM_DEV_ERROR(dp->dev, "phy power off failed: %d", ret); + DRM_DEV_ERROR(dp->mhdp.dev, + "phy power off failed: %d", ret); return ret; } } @@ -470,16 +478,16 @@ static int cdn_dp_disable(struct cdn_dp_device *dp) ret = cdn_dp_grf_write(dp, GRF_SOC_CON26, DPTX_HPD_SEL_MASK | DPTX_HPD_DEL); if (ret) { - DRM_DEV_ERROR(dp->dev, "Failed to clear hpd sel %d\n", + DRM_DEV_ERROR(dp->mhdp.dev, "Failed to clear hpd sel %d\n", ret); return ret; } - cdn_dp_set_firmware_active(dp, false); + cdns_mhdp_set_firmware_active(&dp->mhdp, false); cdn_dp_clk_disable(dp); dp->active = false; - dp->max_lanes = 0; - dp->max_rate = 0; + dp->mhdp.dp.rate = 0; + dp->mhdp.dp.num_lanes = 0; if (!dp->connected) { kfree(dp->edid); dp->edid = NULL; @@ -492,11 +500,11 @@ static int cdn_dp_enable(struct cdn_dp_device *dp) { int ret, i, lanes; struct cdn_dp_port *port; + struct device *dev = dp->mhdp.dev; port = cdn_dp_connected_port(dp); if (!port) { - DRM_DEV_ERROR(dp->dev, - "Can't enable without connection\n"); + DRM_DEV_ERROR(dev, "Can't enable without connection\n"); return -ENODEV; } @@ -509,7 +517,7 @@ static int cdn_dp_enable(struct cdn_dp_device *dp) ret = cdn_dp_firmware_init(dp); if (ret) { - DRM_DEV_ERROR(dp->dev, "firmware init failed: %d", ret); + DRM_DEV_ERROR(dp->mhdp.dev, "firmware init failed: %d", ret); goto err_clk_disable; } @@ -543,8 +551,9 @@ static void cdn_dp_encoder_mode_set(struct drm_encoder *encoder, struct drm_display_mode *adjusted) { struct cdn_dp_device *dp = encoder_to_dp(encoder); - struct drm_display_info *display_info = &dp->connector.display_info; - struct video_info *video = &dp->video_info; + struct drm_display_info *display_info = + &dp->mhdp.connector.base.display_info; + struct video_info *video = &dp->mhdp.video_info; switch (display_info->bpc) { case 10: @@ -562,20 +571,20 @@ static void cdn_dp_encoder_mode_set(struct drm_encoder *encoder, video->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC); video->h_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NHSYNC); - drm_mode_copy(&dp->mode, adjusted); + drm_mode_copy(&dp->mhdp.mode, adjusted); } static bool cdn_dp_check_link_status(struct cdn_dp_device *dp) { u8 link_status[DP_LINK_STATUS_SIZE]; struct cdn_dp_port *port = cdn_dp_connected_port(dp); - u8 sink_lanes = drm_dp_max_lane_count(dp->dpcd); + u8 sink_lanes = drm_dp_max_lane_count(dp->mhdp.dp.dpcd); - if (!port || !dp->max_rate || !dp->max_lanes) + if (!port || !dp->mhdp.dp.rate || !dp->mhdp.dp.num_lanes) return false; - if (cdn_dp_dpcd_read(dp, DP_LANE0_1_STATUS, link_status, - DP_LINK_STATUS_SIZE)) { + if (drm_dp_dpcd_read(&dp->mhdp.dp.aux, DP_LANE0_1_STATUS, link_status, + DP_LINK_STATUS_SIZE)) { DRM_ERROR("Failed to get link status\n"); return false; } @@ -587,15 +596,16 @@ static bool cdn_dp_check_link_status(struct cdn_dp_device *dp) static void cdn_dp_encoder_enable(struct drm_encoder *encoder) { struct cdn_dp_device *dp = encoder_to_dp(encoder); + struct device *dev = dp->mhdp.dev; int ret, val; - ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder); + ret = drm_of_encoder_active_endpoint_id(dev->of_node, encoder); if (ret < 0) { - DRM_DEV_ERROR(dp->dev, "Could not get vop id, %d", ret); + DRM_DEV_ERROR(dev, "Could not get vop id, %d", ret); return; } - DRM_DEV_DEBUG_KMS(dp->dev, "vop %s output to cdn-dp\n", + DRM_DEV_DEBUG_KMS(dev, "vop %s output to cdn-dp\n", (ret) ? "LIT" : "BIG"); if (ret) val = DP_SEL_VOP_LIT | (DP_SEL_VOP_LIT << 16); @@ -610,33 +620,33 @@ static void cdn_dp_encoder_enable(struct drm_encoder *encoder) ret = cdn_dp_enable(dp); if (ret) { - DRM_DEV_ERROR(dp->dev, "Failed to enable encoder %d\n", + DRM_DEV_ERROR(dev, "Failed to enable encoder %d\n", ret); goto out; } if (!cdn_dp_check_link_status(dp)) { - ret = cdn_dp_train_link(dp); + ret = cdns_mhdp_train_link(&dp->mhdp); if (ret) { - DRM_DEV_ERROR(dp->dev, "Failed link train %d\n", ret); + DRM_DEV_ERROR(dev, "Failed link train %d\n", ret); goto out; } } - ret = cdn_dp_set_video_status(dp, CONTROL_VIDEO_IDLE); + ret = cdns_mhdp_set_video_status(&dp->mhdp, CONTROL_VIDEO_IDLE); if (ret) { - DRM_DEV_ERROR(dp->dev, "Failed to idle video %d\n", ret); + DRM_DEV_ERROR(dev, "Failed to idle video %d\n", ret); goto out; } - ret = cdn_dp_config_video(dp); + ret = cdns_mhdp_config_video(&dp->mhdp); if (ret) { - DRM_DEV_ERROR(dp->dev, "Failed to config video %d\n", ret); + DRM_DEV_ERROR(dev, "Failed to config video %d\n", ret); goto out; } - ret = cdn_dp_set_video_status(dp, CONTROL_VIDEO_VALID); + ret = cdns_mhdp_set_video_status(&dp->mhdp, CONTROL_VIDEO_VALID); if (ret) { - DRM_DEV_ERROR(dp->dev, "Failed to valid video %d\n", ret); + DRM_DEV_ERROR(dev, "Failed to valid video %d\n", ret); goto out; } @@ -652,7 +662,8 @@ static void cdn_dp_encoder_disable(struct drm_encoder *encoder) if (dp->active) { ret = cdn_dp_disable(dp); if (ret) { - DRM_DEV_ERROR(dp->dev, "Failed to disable encoder %d\n", + DRM_DEV_ERROR(dp->mhdp.dev, + "Failed to disable encoder %d\n", ret); } } @@ -692,7 +703,7 @@ static const struct drm_encoder_helper_funcs cdn_dp_encoder_helper_funcs = { static int cdn_dp_parse_dt(struct cdn_dp_device *dp) { - struct device *dev = dp->dev; + struct device *dev = dp->mhdp.dev; struct device_node *np = dev->of_node; struct platform_device *pdev = to_platform_device(dev); @@ -704,10 +715,10 @@ static int cdn_dp_parse_dt(struct cdn_dp_device *dp) return PTR_ERR(dp->grf); } - dp->regs = devm_platform_ioremap_resource(pdev, 0); - if (IS_ERR(dp->regs)) { + dp->mhdp.regs_base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(dp->mhdp.regs_base)) { DRM_DEV_ERROR(dev, "ioremap reg failed\n"); - return PTR_ERR(dp->regs); + return PTR_ERR(dp->mhdp.regs_base); } dp->core_clk = devm_clk_get(dev, "core-clk"); @@ -722,10 +733,10 @@ static int cdn_dp_parse_dt(struct cdn_dp_device *dp) return PTR_ERR(dp->pclk); } - dp->spdif_clk = devm_clk_get(dev, "spdif"); - if (IS_ERR(dp->spdif_clk)) { + dp->mhdp.spdif_clk = devm_clk_get(dev, "spdif"); + if (IS_ERR(dp->mhdp.spdif_clk)) { DRM_DEV_ERROR(dev, "cannot get spdif_clk\n"); - return PTR_ERR(dp->spdif_clk); + return PTR_ERR(dp->mhdp.spdif_clk); } dp->grf_clk = devm_clk_get(dev, "grf"); @@ -734,10 +745,10 @@ static int cdn_dp_parse_dt(struct cdn_dp_device *dp) return PTR_ERR(dp->grf_clk); } - dp->spdif_rst = devm_reset_control_get(dev, "spdif"); - if (IS_ERR(dp->spdif_rst)) { + dp->mhdp.spdif_rst = devm_reset_control_get(dev, "spdif"); + if (IS_ERR(dp->mhdp.spdif_rst)) { DRM_DEV_ERROR(dev, "no spdif reset control found\n"); - return PTR_ERR(dp->spdif_rst); + return PTR_ERR(dp->mhdp.spdif_rst); } dp->dptx_rst = devm_reset_control_get(dev, "dptx"); @@ -784,7 +795,7 @@ static int cdn_dp_audio_hw_params(struct device *dev, void *data, audio.format = AFMT_I2S; break; case HDMI_SPDIF: - audio.format = AFMT_SPDIF; + audio.format = AFMT_SPDIF_INT; break; default: DRM_DEV_ERROR(dev, "Invalid format %d\n", daifmt->fmt); @@ -792,9 +803,9 @@ static int cdn_dp_audio_hw_params(struct device *dev, void *data, goto out; } - ret = cdn_dp_audio_config(dp, &audio); + ret = cdns_mhdp_audio_config(&dp->mhdp, &audio); if (!ret) - dp->audio_info = audio; + dp->mhdp.audio_info = audio; out: mutex_unlock(&dp->lock); @@ -810,9 +821,9 @@ static void cdn_dp_audio_shutdown(struct device *dev, void *data) if (!dp->active) goto out; - ret = cdn_dp_audio_stop(dp, &dp->audio_info); + ret = cdns_mhdp_audio_stop(&dp->mhdp, &dp->mhdp.audio_info); if (!ret) - dp->audio_info.format = AFMT_UNUSED; + dp->mhdp.audio_info.format = AFMT_UNUSED; out: mutex_unlock(&dp->lock); } @@ -829,7 +840,7 @@ static int cdn_dp_audio_mute_stream(struct device *dev, void *data, goto out; } - ret = cdn_dp_audio_mute(dp, enable); + ret = cdns_mhdp_audio_mute(&dp->mhdp, enable); out: mutex_unlock(&dp->lock); @@ -841,7 +852,8 @@ static int cdn_dp_audio_get_eld(struct device *dev, void *data, { struct cdn_dp_device *dp = dev_get_drvdata(dev); - memcpy(buf, dp->connector.eld, min(sizeof(dp->connector.eld), len)); + memcpy(buf, dp->mhdp.connector.base.eld, + min(sizeof(dp->mhdp.connector.base.eld), len)); return 0; } @@ -864,11 +876,11 @@ static int cdn_dp_audio_codec_init(struct cdn_dp_device *dp, .max_i2s_channels = 8, }; - dp->audio_pdev = platform_device_register_data( - dev, HDMI_CODEC_DRV_NAME, PLATFORM_DEVID_AUTO, - &codec_data, sizeof(codec_data)); + dp->mhdp.audio_pdev = platform_device_register_data( + dev, HDMI_CODEC_DRV_NAME, PLATFORM_DEVID_AUTO, + &codec_data, sizeof(codec_data)); - return PTR_ERR_OR_ZERO(dp->audio_pdev); + return PTR_ERR_OR_ZERO(dp->mhdp.audio_pdev); } static int cdn_dp_request_firmware(struct cdn_dp_device *dp) @@ -876,6 +888,7 @@ static int cdn_dp_request_firmware(struct cdn_dp_device *dp) int ret; unsigned long timeout = jiffies + msecs_to_jiffies(CDN_FW_TIMEOUT_MS); unsigned long sleep = 1000; + struct device *dev = dp->mhdp.dev; WARN_ON(!mutex_is_locked(&dp->lock)); @@ -886,13 +899,13 @@ static int cdn_dp_request_firmware(struct cdn_dp_device *dp) mutex_unlock(&dp->lock); while (time_before(jiffies, timeout)) { - ret = request_firmware(&dp->fw, CDN_DP_FIRMWARE, dp->dev); + ret = request_firmware(&dp->fw, CDN_DP_FIRMWARE, dev); if (ret == -ENOENT) { msleep(sleep); sleep *= 2; continue; } else if (ret) { - DRM_DEV_ERROR(dp->dev, + DRM_DEV_ERROR(dev, "failed to request firmware: %d\n", ret); goto out; } @@ -902,7 +915,7 @@ static int cdn_dp_request_firmware(struct cdn_dp_device *dp) goto out; } - DRM_DEV_ERROR(dp->dev, "Timed out trying to load firmware\n"); + DRM_DEV_ERROR(dev, "Timed out trying to load firmware\n"); ret = -ETIMEDOUT; out: mutex_lock(&dp->lock); @@ -913,8 +926,9 @@ static void cdn_dp_pd_event_work(struct work_struct *work) { struct cdn_dp_device *dp = container_of(work, struct cdn_dp_device, event_work); - struct drm_connector *connector = &dp->connector; + struct drm_connector *connector = &dp->mhdp.connector.base; enum drm_connector_status old_status; + struct device *dev = dp->mhdp.dev; int ret; @@ -931,44 +945,45 @@ static void cdn_dp_pd_event_work(struct work_struct *work) /* Not connected, notify userspace to disable the block */ if (!cdn_dp_connected_port(dp)) { - DRM_DEV_INFO(dp->dev, "Not connected. Disabling cdn\n"); + DRM_DEV_INFO(dev, "Not connected. Disabling cdn\n"); dp->connected = false; /* Connected but not enabled, enable the block */ } else if (!dp->active) { - DRM_DEV_INFO(dp->dev, "Connected, not enabled. Enabling cdn\n"); + DRM_DEV_INFO(dev, "Connected, not enabled. Enabling cdn\n"); ret = cdn_dp_enable(dp); if (ret) { - DRM_DEV_ERROR(dp->dev, "Enable dp failed %d\n", ret); + DRM_DEV_ERROR(dev, "Enable dp failed %d\n", ret); dp->connected = false; } /* Enabled and connected to a dongle without a sink, notify userspace */ } else if (!cdn_dp_check_sink_connection(dp)) { - DRM_DEV_INFO(dp->dev, "Connected without sink. Assert hpd\n"); + DRM_DEV_INFO(dev, "Connected without sink. Assert hpd\n"); dp->connected = false; /* Enabled and connected with a sink, re-train if requested */ } else if (!cdn_dp_check_link_status(dp)) { - unsigned int rate = dp->max_rate; - unsigned int lanes = dp->max_lanes; - struct drm_display_mode *mode = &dp->mode; + unsigned int rate = dp->mhdp.dp.rate; + unsigned int lanes = dp->mhdp.dp.num_lanes; + struct drm_display_mode *mode = &dp->mhdp.mode; - DRM_DEV_INFO(dp->dev, "Connected with sink. Re-train link\n"); - ret = cdn_dp_train_link(dp); + DRM_DEV_INFO(dev, "Connected with sink. Re-train link\n"); + ret = cdns_mhdp_train_link(&dp->mhdp); if (ret) { dp->connected = false; - DRM_DEV_ERROR(dp->dev, "Train link failed %d\n", ret); + DRM_DEV_ERROR(dev, "Train link failed %d\n", ret); goto out; } /* If training result is changed, update the video config */ if (mode->clock && - (rate != dp->max_rate || lanes != dp->max_lanes)) { - ret = cdn_dp_config_video(dp); + (rate != dp->mhdp.dp.rate || + lanes != dp->mhdp.dp.num_lanes)) { + ret = cdns_mhdp_config_video(&dp->mhdp); if (ret) { dp->connected = false; - DRM_DEV_ERROR(dp->dev, + DRM_DEV_ERROR(dev, "Failed to config video %d\n", ret); } @@ -1037,7 +1052,7 @@ static int cdn_dp_bind(struct device *dev, struct device *master, void *data) drm_encoder_helper_add(encoder, &cdn_dp_encoder_helper_funcs); - connector = &dp->connector; + connector = &dp->mhdp.connector.base; connector->polled = DRM_CONNECTOR_POLL_HPD; connector->dpms = DRM_MODE_DPMS_OFF; @@ -1061,7 +1076,7 @@ static int cdn_dp_bind(struct device *dev, struct device *master, void *data) port = dp->port[i]; port->event_nb.notifier_call = cdn_dp_pd_event; - ret = devm_extcon_register_notifier(dp->dev, port->extcon, + ret = devm_extcon_register_notifier(dp->mhdp.dev, port->extcon, EXTCON_DISP_DP, &port->event_nb); if (ret) { @@ -1088,7 +1103,7 @@ static void cdn_dp_unbind(struct device *dev, struct device *master, void *data) { struct cdn_dp_device *dp = dev_get_drvdata(dev); struct drm_encoder *encoder = &dp->encoder.encoder; - struct drm_connector *connector = &dp->connector; + struct drm_connector *connector = &dp->mhdp.connector.base; cancel_work_sync(&dp->event_work); cdn_dp_encoder_disable(encoder); @@ -1148,7 +1163,7 @@ static int cdn_dp_probe(struct platform_device *pdev) dp = devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL); if (!dp) return -ENOMEM; - dp->dev = dev; + dp->mhdp.dev = dev; match = of_match_node(cdn_dp_dt_ids, pdev->dev.of_node); dp_data = (struct cdn_dp_data *)match->data; @@ -1192,8 +1207,8 @@ static int cdn_dp_remove(struct platform_device *pdev) { struct cdn_dp_device *dp = platform_get_drvdata(pdev); - platform_device_unregister(dp->audio_pdev); - cdn_dp_suspend(dp->dev); + platform_device_unregister(dp->mhdp.audio_pdev); + cdn_dp_suspend(dp->mhdp.dev); component_del(&pdev->dev, &cdn_dp_component_ops); return 0; @@ -1203,7 +1218,7 @@ static void cdn_dp_shutdown(struct platform_device *pdev) { struct cdn_dp_device *dp = platform_get_drvdata(pdev); - cdn_dp_suspend(dp->dev); + cdn_dp_suspend(dp->mhdp.dev); } static const struct dev_pm_ops cdn_dp_pm_ops = { diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.h b/drivers/gpu/drm/rockchip/cdn-dp-core.h index 81ac9b658a70..8b1b15b92503 100644 --- a/drivers/gpu/drm/rockchip/cdn-dp-core.h +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.h @@ -7,6 +7,7 @@ #ifndef _CDN_DP_CORE_H #define _CDN_DP_CORE_H +#include <drm/bridge/cdns-mhdp.h> #include <drm/display/drm_dp_helper.h> #include <drm/drm_panel.h> #include <drm/drm_probe_helper.h> @@ -15,35 +16,6 @@ #define MAX_PHY 2 -enum audio_format { - AFMT_I2S = 0, - AFMT_SPDIF = 1, - AFMT_UNUSED, -}; - -struct audio_info { - enum audio_format format; - int sample_rate; - int channels; - int sample_width; -}; - -enum vic_pxl_encoding_format { - PXL_RGB = 0x1, - YCBCR_4_4_4 = 0x2, - YCBCR_4_2_2 = 0x4, - YCBCR_4_2_0 = 0x8, - Y_ONLY = 0x10, -}; - -struct video_info { - bool h_sync_polarity; - bool v_sync_polarity; - bool interlaced; - int color_depth; - enum vic_pxl_encoding_format color_fmt; -}; - struct cdn_firmware_header { u32 size_bytes; /* size of the entire header+image(s) in bytes */ u32 header_size; /* size of just the header in bytes */ @@ -62,12 +34,9 @@ struct cdn_dp_port { }; struct cdn_dp_device { - struct device *dev; + struct cdns_mhdp_device mhdp; struct drm_device *drm_dev; - struct drm_connector connector; struct rockchip_encoder encoder; - struct drm_display_mode mode; - struct platform_device *audio_pdev; struct work_struct event_work; struct edid *edid; @@ -77,29 +46,20 @@ struct cdn_dp_device { bool suspended; const struct firmware *fw; /* cdn dp firmware */ - unsigned int fw_version; /* cdn fw version */ bool fw_loaded; - void __iomem *regs; struct regmap *grf; struct clk *core_clk; struct clk *pclk; - struct clk *spdif_clk; struct clk *grf_clk; - struct reset_control *spdif_rst; struct reset_control *dptx_rst; struct reset_control *apb_rst; struct reset_control *core_rst; - struct audio_info audio_info; - struct video_info video_info; struct cdn_dp_port *port[MAX_PHY]; u8 ports; - u8 max_lanes; - unsigned int max_rate; u8 lanes; int active_port; - u8 dpcd[DP_RECEIVER_CAP_SIZE]; bool sink_has_audio; hdmi_codec_plugged_cb plugged_cb; diff --git a/drivers/gpu/drm/rockchip/cdn-dp-reg.c b/drivers/gpu/drm/rockchip/cdn-dp-reg.c deleted file mode 100644 index 9d2163ef4d6e..000000000000 --- a/drivers/gpu/drm/rockchip/cdn-dp-reg.c +++ /dev/null @@ -1,960 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd - * Author: Chris Zhong <zyw@rock-chips.com> - */ - -#include <linux/clk.h> -#include <linux/device.h> -#include <linux/delay.h> -#include <linux/io.h> -#include <linux/iopoll.h> -#include <linux/reset.h> - -#include "cdn-dp-core.h" -#include "cdn-dp-reg.h" - -#define CDN_DP_SPDIF_CLK 200000000 -#define FW_ALIVE_TIMEOUT_US 1000000 -#define MAILBOX_RETRY_US 1000 -#define MAILBOX_TIMEOUT_US 5000000 -#define LINK_TRAINING_RETRY_MS 20 -#define LINK_TRAINING_TIMEOUT_MS 500 - -void cdn_dp_set_fw_clk(struct cdn_dp_device *dp, unsigned long clk) -{ - writel(clk / 1000000, dp->regs + SW_CLK_H); -} - -void cdn_dp_clock_reset(struct cdn_dp_device *dp) -{ - u32 val; - - val = DPTX_FRMR_DATA_CLK_RSTN_EN | - DPTX_FRMR_DATA_CLK_EN | - DPTX_PHY_DATA_RSTN_EN | - DPTX_PHY_DATA_CLK_EN | - DPTX_PHY_CHAR_RSTN_EN | - DPTX_PHY_CHAR_CLK_EN | - SOURCE_AUX_SYS_CLK_RSTN_EN | - SOURCE_AUX_SYS_CLK_EN | - DPTX_SYS_CLK_RSTN_EN | - DPTX_SYS_CLK_EN | - CFG_DPTX_VIF_CLK_RSTN_EN | - CFG_DPTX_VIF_CLK_EN; - writel(val, dp->regs + SOURCE_DPTX_CAR); - - val = SOURCE_PHY_RSTN_EN | SOURCE_PHY_CLK_EN; - writel(val, dp->regs + SOURCE_PHY_CAR); - - val = SOURCE_PKT_SYS_RSTN_EN | - SOURCE_PKT_SYS_CLK_EN | - SOURCE_PKT_DATA_RSTN_EN | - SOURCE_PKT_DATA_CLK_EN; - writel(val, dp->regs + SOURCE_PKT_CAR); - - val = SPDIF_CDR_CLK_RSTN_EN | - SPDIF_CDR_CLK_EN | - SOURCE_AIF_SYS_RSTN_EN | - SOURCE_AIF_SYS_CLK_EN | - SOURCE_AIF_CLK_RSTN_EN | - SOURCE_AIF_CLK_EN; - writel(val, dp->regs + SOURCE_AIF_CAR); - - val = SOURCE_CIPHER_SYSTEM_CLK_RSTN_EN | - SOURCE_CIPHER_SYS_CLK_EN | - SOURCE_CIPHER_CHAR_CLK_RSTN_EN | - SOURCE_CIPHER_CHAR_CLK_EN; - writel(val, dp->regs + SOURCE_CIPHER_CAR); - - val = SOURCE_CRYPTO_SYS_CLK_RSTN_EN | - SOURCE_CRYPTO_SYS_CLK_EN; - writel(val, dp->regs + SOURCE_CRYPTO_CAR); - - /* enable Mailbox and PIF interrupt */ - writel(0, dp->regs + APB_INT_MASK); -} - -static int cdn_dp_mailbox_read(struct cdn_dp_device *dp) -{ - int val, ret; - - ret = readx_poll_timeout(readl, dp->regs + MAILBOX_EMPTY_ADDR, - val, !val, MAILBOX_RETRY_US, - MAILBOX_TIMEOUT_US); - if (ret < 0) - return ret; - - return readl(dp->regs + MAILBOX0_RD_DATA) & 0xff; -} - -static int cdp_dp_mailbox_write(struct cdn_dp_device *dp, u8 val) -{ - int ret, full; - - ret = readx_poll_timeout(readl, dp->regs + MAILBOX_FULL_ADDR, - full, !full, MAILBOX_RETRY_US, - MAILBOX_TIMEOUT_US); - if (ret < 0) - return ret; - - writel(val, dp->regs + MAILBOX0_WR_DATA); - - return 0; -} - -static int cdn_dp_mailbox_validate_receive(struct cdn_dp_device *dp, - u8 module_id, u8 opcode, - u16 req_size) -{ - u32 mbox_size, i; - u8 header[4]; - int ret; - - /* read the header of the message */ - for (i = 0; i < 4; i++) { - ret = cdn_dp_mailbox_read(dp); - if (ret < 0) - return ret; - - header[i] = ret; - } - - mbox_size = (header[2] << 8) | header[3]; - - if (opcode != header[0] || module_id != header[1] || - req_size != mbox_size) { - /* - * If the message in mailbox is not what we want, we need to - * clear the mailbox by reading its contents. - */ - for (i = 0; i < mbox_size; i++) - if (cdn_dp_mailbox_read(dp) < 0) - break; - - return -EINVAL; - } - - return 0; -} - -static int cdn_dp_mailbox_read_receive(struct cdn_dp_device *dp, - u8 *buff, u16 buff_size) -{ - u32 i; - int ret; - - for (i = 0; i < buff_size; i++) { - ret = cdn_dp_mailbox_read(dp); - if (ret < 0) - return ret; - - buff[i] = ret; - } - - return 0; -} - -static int cdn_dp_mailbox_send(struct cdn_dp_device *dp, u8 module_id, - u8 opcode, u16 size, u8 *message) -{ - u8 header[4]; - int ret, i; - - header[0] = opcode; - header[1] = module_id; - header[2] = (size >> 8) & 0xff; - header[3] = size & 0xff; - - for (i = 0; i < 4; i++) { - ret = cdp_dp_mailbox_write(dp, header[i]); - if (ret) - return ret; - } - - for (i = 0; i < size; i++) { - ret = cdp_dp_mailbox_write(dp, message[i]); - if (ret) - return ret; - } - - return 0; -} - -static int cdn_dp_reg_write(struct cdn_dp_device *dp, u16 addr, u32 val) -{ - u8 msg[6]; - - msg[0] = (addr >> 8) & 0xff; - msg[1] = addr & 0xff; - msg[2] = (val >> 24) & 0xff; - msg[3] = (val >> 16) & 0xff; - msg[4] = (val >> 8) & 0xff; - msg[5] = val & 0xff; - return cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_WRITE_REGISTER, - sizeof(msg), msg); -} - -static int cdn_dp_reg_write_bit(struct cdn_dp_device *dp, u16 addr, - u8 start_bit, u8 bits_no, u32 val) -{ - u8 field[8]; - - field[0] = (addr >> 8) & 0xff; - field[1] = addr & 0xff; - field[2] = start_bit; - field[3] = bits_no; - field[4] = (val >> 24) & 0xff; - field[5] = (val >> 16) & 0xff; - field[6] = (val >> 8) & 0xff; - field[7] = val & 0xff; - - return cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_WRITE_FIELD, - sizeof(field), field); -} - -int cdn_dp_dpcd_read(struct cdn_dp_device *dp, u32 addr, u8 *data, u16 len) -{ - u8 msg[5], reg[5]; - int ret; - - msg[0] = (len >> 8) & 0xff; - msg[1] = len & 0xff; - msg[2] = (addr >> 16) & 0xff; - msg[3] = (addr >> 8) & 0xff; - msg[4] = addr & 0xff; - ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_READ_DPCD, - sizeof(msg), msg); - if (ret) - goto err_dpcd_read; - - ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX, - DPTX_READ_DPCD, - sizeof(reg) + len); - if (ret) - goto err_dpcd_read; - - ret = cdn_dp_mailbox_read_receive(dp, reg, sizeof(reg)); - if (ret) - goto err_dpcd_read; - - ret = cdn_dp_mailbox_read_receive(dp, data, len); - -err_dpcd_read: - return ret; -} - -int cdn_dp_dpcd_write(struct cdn_dp_device *dp, u32 addr, u8 value) -{ - u8 msg[6], reg[5]; - int ret; - - msg[0] = 0; - msg[1] = 1; - msg[2] = (addr >> 16) & 0xff; - msg[3] = (addr >> 8) & 0xff; - msg[4] = addr & 0xff; - msg[5] = value; - ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_WRITE_DPCD, - sizeof(msg), msg); - if (ret) - goto err_dpcd_write; - - ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX, - DPTX_WRITE_DPCD, sizeof(reg)); - if (ret) - goto err_dpcd_write; - - ret = cdn_dp_mailbox_read_receive(dp, reg, sizeof(reg)); - if (ret) - goto err_dpcd_write; - - if (addr != (reg[2] << 16 | reg[3] << 8 | reg[4])) - ret = -EINVAL; - -err_dpcd_write: - if (ret) - DRM_DEV_ERROR(dp->dev, "dpcd write failed: %d\n", ret); - return ret; -} - -int cdn_dp_load_firmware(struct cdn_dp_device *dp, const u32 *i_mem, - u32 i_size, const u32 *d_mem, u32 d_size) -{ - u32 reg; - int i, ret; - - /* reset ucpu before load firmware*/ - writel(APB_IRAM_PATH | APB_DRAM_PATH | APB_XT_RESET, - dp->regs + APB_CTRL); - - for (i = 0; i < i_size; i += 4) - writel(*i_mem++, dp->regs + ADDR_IMEM + i); - - for (i = 0; i < d_size; i += 4) - writel(*d_mem++, dp->regs + ADDR_DMEM + i); - - /* un-reset ucpu */ - writel(0, dp->regs + APB_CTRL); - - /* check the keep alive register to make sure fw working */ - ret = readx_poll_timeout(readl, dp->regs + KEEP_ALIVE, - reg, reg, 2000, FW_ALIVE_TIMEOUT_US); - if (ret < 0) { - DRM_DEV_ERROR(dp->dev, "failed to loaded the FW reg = %x\n", - reg); - return -EINVAL; - } - - reg = readl(dp->regs + VER_L) & 0xff; - dp->fw_version = reg; - reg = readl(dp->regs + VER_H) & 0xff; - dp->fw_version |= reg << 8; - reg = readl(dp->regs + VER_LIB_L_ADDR) & 0xff; - dp->fw_version |= reg << 16; - reg = readl(dp->regs + VER_LIB_H_ADDR) & 0xff; - dp->fw_version |= reg << 24; - - DRM_DEV_DEBUG(dp->dev, "firmware version: %x\n", dp->fw_version); - - return 0; -} - -int cdn_dp_set_firmware_active(struct cdn_dp_device *dp, bool enable) -{ - u8 msg[5]; - int ret, i; - - msg[0] = GENERAL_MAIN_CONTROL; - msg[1] = MB_MODULE_ID_GENERAL; - msg[2] = 0; - msg[3] = 1; - msg[4] = enable ? FW_ACTIVE : FW_STANDBY; - - for (i = 0; i < sizeof(msg); i++) { - ret = cdp_dp_mailbox_write(dp, msg[i]); - if (ret) - goto err_set_firmware_active; - } - - /* read the firmware state */ - for (i = 0; i < sizeof(msg); i++) { - ret = cdn_dp_mailbox_read(dp); - if (ret < 0) - goto err_set_firmware_active; - - msg[i] = ret; - } - - ret = 0; - -err_set_firmware_active: - if (ret < 0) - DRM_DEV_ERROR(dp->dev, "set firmware active failed\n"); - return ret; -} - -int cdn_dp_set_host_cap(struct cdn_dp_device *dp, u8 lanes, bool flip) -{ - u8 msg[8]; - int ret; - - msg[0] = CDN_DP_MAX_LINK_RATE; - msg[1] = lanes | SCRAMBLER_EN; - msg[2] = VOLTAGE_LEVEL_2; - msg[3] = PRE_EMPHASIS_LEVEL_3; - msg[4] = PTS1 | PTS2 | PTS3 | PTS4; - msg[5] = FAST_LT_NOT_SUPPORT; - msg[6] = flip ? LANE_MAPPING_FLIPPED : LANE_MAPPING_NORMAL; - msg[7] = ENHANCED; - - ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, - DPTX_SET_HOST_CAPABILITIES, - sizeof(msg), msg); - if (ret) - goto err_set_host_cap; - - ret = cdn_dp_reg_write(dp, DP_AUX_SWAP_INVERSION_CONTROL, - AUX_HOST_INVERT); - -err_set_host_cap: - if (ret) - DRM_DEV_ERROR(dp->dev, "set host cap failed: %d\n", ret); - return ret; -} - -int cdn_dp_event_config(struct cdn_dp_device *dp) -{ - u8 msg[5]; - int ret; - - memset(msg, 0, sizeof(msg)); - - msg[0] = DPTX_EVENT_ENABLE_HPD | DPTX_EVENT_ENABLE_TRAINING; - - ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_ENABLE_EVENT, - sizeof(msg), msg); - if (ret) - DRM_DEV_ERROR(dp->dev, "set event config failed: %d\n", ret); - - return ret; -} - -u32 cdn_dp_get_event(struct cdn_dp_device *dp) -{ - return readl(dp->regs + SW_EVENTS0); -} - -int cdn_dp_get_hpd_status(struct cdn_dp_device *dp) -{ - u8 status; - int ret; - - ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_HPD_STATE, - 0, NULL); - if (ret) - goto err_get_hpd; - - ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX, - DPTX_HPD_STATE, sizeof(status)); - if (ret) - goto err_get_hpd; - - ret = cdn_dp_mailbox_read_receive(dp, &status, sizeof(status)); - if (ret) - goto err_get_hpd; - - return status; - -err_get_hpd: - DRM_DEV_ERROR(dp->dev, "get hpd status failed: %d\n", ret); - return ret; -} - -int cdn_dp_get_edid_block(void *data, u8 *edid, - unsigned int block, size_t length) -{ - struct cdn_dp_device *dp = data; - u8 msg[2], reg[2], i; - int ret; - - for (i = 0; i < 4; i++) { - msg[0] = block / 2; - msg[1] = block % 2; - - ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_GET_EDID, - sizeof(msg), msg); - if (ret) - continue; - - ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX, - DPTX_GET_EDID, - sizeof(reg) + length); - if (ret) - continue; - - ret = cdn_dp_mailbox_read_receive(dp, reg, sizeof(reg)); - if (ret) - continue; - - ret = cdn_dp_mailbox_read_receive(dp, edid, length); - if (ret) - continue; - - if (reg[0] == length && reg[1] == block / 2) - break; - } - - if (ret) - DRM_DEV_ERROR(dp->dev, "get block[%d] edid failed: %d\n", block, - ret); - - return ret; -} - -static int cdn_dp_training_start(struct cdn_dp_device *dp) -{ - unsigned long timeout; - u8 msg, event[2]; - int ret; - - msg = LINK_TRAINING_RUN; - - /* start training */ - ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_TRAINING_CONTROL, - sizeof(msg), &msg); - if (ret) - goto err_training_start; - - timeout = jiffies + msecs_to_jiffies(LINK_TRAINING_TIMEOUT_MS); - while (time_before(jiffies, timeout)) { - msleep(LINK_TRAINING_RETRY_MS); - ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, - DPTX_READ_EVENT, 0, NULL); - if (ret) - goto err_training_start; - - ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX, - DPTX_READ_EVENT, - sizeof(event)); - if (ret) - goto err_training_start; - - ret = cdn_dp_mailbox_read_receive(dp, event, sizeof(event)); - if (ret) - goto err_training_start; - - if (event[1] & EQ_PHASE_FINISHED) - return 0; - } - - ret = -ETIMEDOUT; - -err_training_start: - DRM_DEV_ERROR(dp->dev, "training failed: %d\n", ret); - return ret; -} - -static int cdn_dp_get_training_status(struct cdn_dp_device *dp) -{ - u8 status[10]; - int ret; - - ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_READ_LINK_STAT, - 0, NULL); - if (ret) - goto err_get_training_status; - - ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX, - DPTX_READ_LINK_STAT, - sizeof(status)); - if (ret) - goto err_get_training_status; - - ret = cdn_dp_mailbox_read_receive(dp, status, sizeof(status)); - if (ret) - goto err_get_training_status; - - dp->max_rate = drm_dp_bw_code_to_link_rate(status[0]); - dp->max_lanes = status[1]; - -err_get_training_status: - if (ret) - DRM_DEV_ERROR(dp->dev, "get training status failed: %d\n", ret); - return ret; -} - -int cdn_dp_train_link(struct cdn_dp_device *dp) -{ - int ret; - - ret = cdn_dp_training_start(dp); - if (ret) { - DRM_DEV_ERROR(dp->dev, "Failed to start training %d\n", ret); - return ret; - } - - ret = cdn_dp_get_training_status(dp); - if (ret) { - DRM_DEV_ERROR(dp->dev, "Failed to get training stat %d\n", ret); - return ret; - } - - DRM_DEV_DEBUG_KMS(dp->dev, "rate:0x%x, lanes:%d\n", dp->max_rate, - dp->max_lanes); - return ret; -} - -int cdn_dp_set_video_status(struct cdn_dp_device *dp, int active) -{ - u8 msg; - int ret; - - msg = !!active; - - ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_SET_VIDEO, - sizeof(msg), &msg); - if (ret) - DRM_DEV_ERROR(dp->dev, "set video status failed: %d\n", ret); - - return ret; -} - -static int cdn_dp_get_msa_misc(struct video_info *video, - struct drm_display_mode *mode) -{ - u32 msa_misc; - u8 val[2] = {0}; - - switch (video->color_fmt) { - case PXL_RGB: - case Y_ONLY: - val[0] = 0; - break; - /* set YUV default color space conversion to BT601 */ - case YCBCR_4_4_4: - val[0] = 6 + BT_601 * 8; - break; - case YCBCR_4_2_2: - val[0] = 5 + BT_601 * 8; - break; - case YCBCR_4_2_0: - val[0] = 5; - break; - } - - switch (video->color_depth) { - case 6: - val[1] = 0; - break; - case 8: - val[1] = 1; - break; - case 10: - val[1] = 2; - break; - case 12: - val[1] = 3; - break; - case 16: - val[1] = 4; - break; - } - - msa_misc = 2 * val[0] + 32 * val[1] + - ((video->color_fmt == Y_ONLY) ? (1 << 14) : 0); - - return msa_misc; -} - -int cdn_dp_config_video(struct cdn_dp_device *dp) -{ - struct video_info *video = &dp->video_info; - struct drm_display_mode *mode = &dp->mode; - u64 symbol; - u32 val, link_rate, rem; - u8 bit_per_pix, tu_size_reg = TU_SIZE; - int ret; - - bit_per_pix = (video->color_fmt == YCBCR_4_2_2) ? - (video->color_depth * 2) : (video->color_depth * 3); - - link_rate = dp->max_rate / 1000; - - ret = cdn_dp_reg_write(dp, BND_HSYNC2VSYNC, VIF_BYPASS_INTERLACE); - if (ret) - goto err_config_video; - - ret = cdn_dp_reg_write(dp, HSYNC2VSYNC_POL_CTRL, 0); - if (ret) - goto err_config_video; - - /* - * get a best tu_size and valid symbol: - * 1. chose Lclk freq(162Mhz, 270Mhz, 540Mhz), set TU to 32 - * 2. calculate VS(valid symbol) = TU * Pclk * Bpp / (Lclk * Lanes) - * 3. if VS > *.85 or VS < *.1 or VS < 2 or TU < VS + 4, then set - * TU += 2 and repeat 2nd step. - */ - do { - tu_size_reg += 2; - symbol = (u64)tu_size_reg * mode->clock * bit_per_pix; - do_div(symbol, dp->max_lanes * link_rate * 8); - rem = do_div(symbol, 1000); - if (tu_size_reg > 64) { - ret = -EINVAL; - DRM_DEV_ERROR(dp->dev, - "tu error, clk:%d, lanes:%d, rate:%d\n", - mode->clock, dp->max_lanes, link_rate); - goto err_config_video; - } - } while ((symbol <= 1) || (tu_size_reg - symbol < 4) || - (rem > 850) || (rem < 100)); - - val = symbol + (tu_size_reg << 8); - val |= TU_CNT_RST_EN; - ret = cdn_dp_reg_write(dp, DP_FRAMER_TU, val); - if (ret) - goto err_config_video; - - /* set the FIFO Buffer size */ - val = div_u64(mode->clock * (symbol + 1), 1000) + link_rate; - val /= (dp->max_lanes * link_rate); - val = div_u64(8 * (symbol + 1), bit_per_pix) - val; - val += 2; - ret = cdn_dp_reg_write(dp, DP_VC_TABLE(15), val); - - switch (video->color_depth) { - case 6: - val = BCS_6; - break; - case 8: - val = BCS_8; - break; - case 10: - val = BCS_10; - break; - case 12: - val = BCS_12; - break; - case 16: - val = BCS_16; - break; - } - - val += video->color_fmt << 8; - ret = cdn_dp_reg_write(dp, DP_FRAMER_PXL_REPR, val); - if (ret) - goto err_config_video; - - val = video->h_sync_polarity ? DP_FRAMER_SP_HSP : 0; - val |= video->v_sync_polarity ? DP_FRAMER_SP_VSP : 0; - ret = cdn_dp_reg_write(dp, DP_FRAMER_SP, val); - if (ret) - goto err_config_video; - - val = (mode->hsync_start - mode->hdisplay) << 16; - val |= mode->htotal - mode->hsync_end; - ret = cdn_dp_reg_write(dp, DP_FRONT_BACK_PORCH, val); - if (ret) - goto err_config_video; - - val = mode->hdisplay * bit_per_pix / 8; - ret = cdn_dp_reg_write(dp, DP_BYTE_COUNT, val); - if (ret) - goto err_config_video; - - val = mode->htotal | ((mode->htotal - mode->hsync_start) << 16); - ret = cdn_dp_reg_write(dp, MSA_HORIZONTAL_0, val); - if (ret) - goto err_config_video; - - val = mode->hsync_end - mode->hsync_start; - val |= (mode->hdisplay << 16) | (video->h_sync_polarity << 15); - ret = cdn_dp_reg_write(dp, MSA_HORIZONTAL_1, val); - if (ret) - goto err_config_video; - - val = mode->vtotal; - val |= (mode->vtotal - mode->vsync_start) << 16; - ret = cdn_dp_reg_write(dp, MSA_VERTICAL_0, val); - if (ret) - goto err_config_video; - - val = mode->vsync_end - mode->vsync_start; - val |= (mode->vdisplay << 16) | (video->v_sync_polarity << 15); - ret = cdn_dp_reg_write(dp, MSA_VERTICAL_1, val); - if (ret) - goto err_config_video; - - val = cdn_dp_get_msa_misc(video, mode); - ret = cdn_dp_reg_write(dp, MSA_MISC, val); - if (ret) - goto err_config_video; - - ret = cdn_dp_reg_write(dp, STREAM_CONFIG, 1); - if (ret) - goto err_config_video; - - val = mode->hsync_end - mode->hsync_start; - val |= mode->hdisplay << 16; - ret = cdn_dp_reg_write(dp, DP_HORIZONTAL, val); - if (ret) - goto err_config_video; - - val = mode->vdisplay; - val |= (mode->vtotal - mode->vsync_start) << 16; - ret = cdn_dp_reg_write(dp, DP_VERTICAL_0, val); - if (ret) - goto err_config_video; - - val = mode->vtotal; - ret = cdn_dp_reg_write(dp, DP_VERTICAL_1, val); - if (ret) - goto err_config_video; - - ret = cdn_dp_reg_write_bit(dp, DP_VB_ID, 2, 1, 0); - -err_config_video: - if (ret) - DRM_DEV_ERROR(dp->dev, "config video failed: %d\n", ret); - return ret; -} - -int cdn_dp_audio_stop(struct cdn_dp_device *dp, struct audio_info *audio) -{ - int ret; - - ret = cdn_dp_reg_write(dp, AUDIO_PACK_CONTROL, 0); - if (ret) { - DRM_DEV_ERROR(dp->dev, "audio stop failed: %d\n", ret); - return ret; - } - - writel(0, dp->regs + SPDIF_CTRL_ADDR); - - /* clearn the audio config and reset */ - writel(0, dp->regs + AUDIO_SRC_CNTL); - writel(0, dp->regs + AUDIO_SRC_CNFG); - writel(AUDIO_SW_RST, dp->regs + AUDIO_SRC_CNTL); - writel(0, dp->regs + AUDIO_SRC_CNTL); - - /* reset smpl2pckt component */ - writel(0, dp->regs + SMPL2PKT_CNTL); - writel(AUDIO_SW_RST, dp->regs + SMPL2PKT_CNTL); - writel(0, dp->regs + SMPL2PKT_CNTL); - - /* reset FIFO */ - writel(AUDIO_SW_RST, dp->regs + FIFO_CNTL); - writel(0, dp->regs + FIFO_CNTL); - - if (audio->format == AFMT_SPDIF) - clk_disable_unprepare(dp->spdif_clk); - - return 0; -} - -int cdn_dp_audio_mute(struct cdn_dp_device *dp, bool enable) -{ - int ret; - - ret = cdn_dp_reg_write_bit(dp, DP_VB_ID, 4, 1, enable); - if (ret) - DRM_DEV_ERROR(dp->dev, "audio mute failed: %d\n", ret); - - return ret; -} - -static void cdn_dp_audio_config_i2s(struct cdn_dp_device *dp, - struct audio_info *audio) -{ - int sub_pckt_num = 1, i2s_port_en_val = 0xf, i; - u32 val; - - if (audio->channels == 2) { - if (dp->max_lanes == 1) - sub_pckt_num = 2; - else - sub_pckt_num = 4; - - i2s_port_en_val = 1; - } else if (audio->channels == 4) { - i2s_port_en_val = 3; - } - - writel(0x0, dp->regs + SPDIF_CTRL_ADDR); - - writel(SYNC_WR_TO_CH_ZERO, dp->regs + FIFO_CNTL); - - val = MAX_NUM_CH(audio->channels); - val |= NUM_OF_I2S_PORTS(audio->channels); - val |= AUDIO_TYPE_LPCM; - val |= CFG_SUB_PCKT_NUM(sub_pckt_num); - writel(val, dp->regs + SMPL2PKT_CNFG); - - if (audio->sample_width == 16) - val = 0; - else if (audio->sample_width == 24) - val = 1 << 9; - else - val = 2 << 9; - - val |= AUDIO_CH_NUM(audio->channels); - val |= I2S_DEC_PORT_EN(i2s_port_en_val); - val |= TRANS_SMPL_WIDTH_32; - writel(val, dp->regs + AUDIO_SRC_CNFG); - - for (i = 0; i < (audio->channels + 1) / 2; i++) { - if (audio->sample_width == 16) - val = (0x02 << 8) | (0x02 << 20); - else if (audio->sample_width == 24) - val = (0x0b << 8) | (0x0b << 20); - - val |= ((2 * i) << 4) | ((2 * i + 1) << 16); - writel(val, dp->regs + STTS_BIT_CH(i)); - } - - switch (audio->sample_rate) { - case 32000: - val = SAMPLING_FREQ(3) | - ORIGINAL_SAMP_FREQ(0xc); - break; - case 44100: - val = SAMPLING_FREQ(0) | - ORIGINAL_SAMP_FREQ(0xf); - break; - case 48000: - val = SAMPLING_FREQ(2) | - ORIGINAL_SAMP_FREQ(0xd); - break; - case 88200: - val = SAMPLING_FREQ(8) | - ORIGINAL_SAMP_FREQ(0x7); - break; - case 96000: - val = SAMPLING_FREQ(0xa) | - ORIGINAL_SAMP_FREQ(5); - break; - case 176400: - val = SAMPLING_FREQ(0xc) | - ORIGINAL_SAMP_FREQ(3); - break; - case 192000: - val = SAMPLING_FREQ(0xe) | - ORIGINAL_SAMP_FREQ(1); - break; - } - val |= 4; - writel(val, dp->regs + COM_CH_STTS_BITS); - - writel(SMPL2PKT_EN, dp->regs + SMPL2PKT_CNTL); - writel(I2S_DEC_START, dp->regs + AUDIO_SRC_CNTL); -} - -static void cdn_dp_audio_config_spdif(struct cdn_dp_device *dp) -{ - u32 val; - - writel(SYNC_WR_TO_CH_ZERO, dp->regs + FIFO_CNTL); - - val = MAX_NUM_CH(2) | AUDIO_TYPE_LPCM | CFG_SUB_PCKT_NUM(4); - writel(val, dp->regs + SMPL2PKT_CNFG); - writel(SMPL2PKT_EN, dp->regs + SMPL2PKT_CNTL); - - val = SPDIF_ENABLE | SPDIF_AVG_SEL | SPDIF_JITTER_BYPASS; - writel(val, dp->regs + SPDIF_CTRL_ADDR); - - clk_prepare_enable(dp->spdif_clk); - clk_set_rate(dp->spdif_clk, CDN_DP_SPDIF_CLK); -} - -int cdn_dp_audio_config(struct cdn_dp_device *dp, struct audio_info *audio) -{ - int ret; - - /* reset the spdif clk before config */ - if (audio->format == AFMT_SPDIF) { - reset_control_assert(dp->spdif_rst); - reset_control_deassert(dp->spdif_rst); - } - - ret = cdn_dp_reg_write(dp, CM_LANE_CTRL, LANE_REF_CYC); - if (ret) - goto err_audio_config; - - ret = cdn_dp_reg_write(dp, CM_CTRL, 0); - if (ret) - goto err_audio_config; - - if (audio->format == AFMT_I2S) - cdn_dp_audio_config_i2s(dp, audio); - else if (audio->format == AFMT_SPDIF) - cdn_dp_audio_config_spdif(dp); - - ret = cdn_dp_reg_write(dp, AUDIO_PACK_CONTROL, AUDIO_PACK_EN); - -err_audio_config: - if (ret) - DRM_DEV_ERROR(dp->dev, "audio config failed: %d\n", ret); - return ret; -} diff --git a/drivers/gpu/drm/rockchip/cdn-dp-reg.h b/include/drm/bridge/cdns-mhdp.h similarity index 53% rename from drivers/gpu/drm/rockchip/cdn-dp-reg.h rename to include/drm/bridge/cdns-mhdp.h index 441248b7a79e..d76716d4edc6 100644 --- a/drivers/gpu/drm/rockchip/cdn-dp-reg.h +++ b/include/drm/bridge/cdns-mhdp.h @@ -1,16 +1,31 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ +/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd * Author: Chris Zhong <zyw@rock-chips.com> + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ -#ifndef _CDN_DP_REG_H -#define _CDN_DP_REG_H +#ifndef CDNS_MHDP_H_ +#define CDNS_MHDP_H_ +#include <drm/drm_bridge.h> +#include <drm/drm_connector.h> +#include <drm/display/drm_dp_helper.h> +#include <drm/display/drm_dp_mst_helper.h> +#include <media/cec.h> #include <linux/bitops.h> #define ADDR_IMEM 0x10000 #define ADDR_DMEM 0x20000 +#define ADDR_PHY_AFE 0x80000 /* APB CFG addr */ #define APB_CTRL 0 @@ -78,6 +93,10 @@ #define SOURCE_PIF_SW_RESET 0x30834 /* bellow registers need access by mailbox */ +/* source phy comp */ +#define PHY_DATA_SEL 0x0818 +#define LANES_CONFIG 0x0814 + /* source car addr */ #define SOURCE_HDTX_CAR 0x0900 #define SOURCE_DPTX_CAR 0x0904 @@ -89,6 +108,17 @@ #define SOURCE_CIPHER_CAR 0x0920 #define SOURCE_CRYPTO_CAR 0x0924 +/* mhdp tx_top_comp */ +#define SCHEDULER_H_SIZE 0x1000 +#define SCHEDULER_V_SIZE 0x1004 +#define HDTX_SIGNAL_FRONT_WIDTH 0x100c +#define HDTX_SIGNAL_SYNC_WIDTH 0x1010 +#define HDTX_SIGNAL_BACK_WIDTH 0x1014 +#define HDTX_CONTROLLER 0x1018 +#define HDTX_HPD 0x1020 +#define HDTX_CLOCK_REG_0 0x1024 +#define HDTX_CLOCK_REG_1 0x1028 + /* clock meters addr */ #define CM_CTRL 0x0a00 #define CM_I2S_CTRL 0x0a04 @@ -308,18 +338,24 @@ #define MB_SIZE_LSB_ID 3 #define MB_DATA_ID 4 -#define MB_MODULE_ID_DP_TX 0x01 +#define MB_MODULE_ID_DP_TX 0x01 +#define MB_MODULE_ID_HDMI_TX 0x03 #define MB_MODULE_ID_HDCP_TX 0x07 #define MB_MODULE_ID_HDCP_RX 0x08 #define MB_MODULE_ID_HDCP_GENERAL 0x09 -#define MB_MODULE_ID_GENERAL 0x0a +#define MB_MODULE_ID_GENERAL 0x0A /* general opcode */ #define GENERAL_MAIN_CONTROL 0x01 #define GENERAL_TEST_ECHO 0x02 #define GENERAL_BUS_SETTINGS 0x03 #define GENERAL_TEST_ACCESS 0x04 +#define GENERAL_WRITE_REGISTER 0x05 +#define GENERAL_WRITE_FIELD 0x06 +#define GENERAL_READ_REGISTER 0x07 +#define GENERAL_GET_HPD_STATE 0x11 +/* DPTX opcode */ #define DPTX_SET_POWER_MNG 0x00 #define DPTX_SET_HOST_CAPABILITIES 0x01 #define DPTX_GET_EDID 0x02 @@ -338,12 +374,24 @@ #define DPTX_SET_LINK_BREAK_POINT 0x0f #define DPTX_FORCE_LANES 0x10 #define DPTX_HPD_STATE 0x11 +#define DPTX_ADJUST_LT 0x12 + +/* HDMI TX opcode */ +#define HDMI_TX_READ 0x00 +#define HDMI_TX_WRITE 0x01 +#define HDMI_TX_UPDATE_READ 0x02 +#define HDMI_TX_EDID 0x03 +#define HDMI_TX_EVENTS 0x04 +#define HDMI_TX_HPD_STATUS 0x05 +#define HDMI_TX_DEBUG_ECHO 0xAA +#define HDMI_TX_TEST 0xBB +#define HDMI_TX_EDID_INTERNAL 0xF0 #define FW_STANDBY 0 #define FW_ACTIVE 1 -#define DPTX_EVENT_ENABLE_HPD BIT(0) -#define DPTX_EVENT_ENABLE_TRAINING BIT(1) +#define MHDP_EVENT_ENABLE_HPD BIT(0) +#define MHDP_EVENT_ENABLE_TRAINING BIT(1) #define LINK_TRAINING_NOT_ACTIVE 0 #define LINK_TRAINING_RUN 1 @@ -387,7 +435,35 @@ #define HDCP_TX_IS_RECEIVER_ID_VALID_EVENT BIT(7) #define TU_SIZE 30 -#define CDN_DP_MAX_LINK_RATE DP_LINK_BW_5_4 +#define CDNS_DP_MAX_LINK_RATE 540000 + +#define F_HDMI_ENCODING(x) (((x) & ((1 << 2) - 1)) << 16) +#define F_VIF_DATA_WIDTH(x) (((x) & ((1 << 2) - 1)) << 2) +#define F_HDMI_MODE(x) (((x) & ((1 << 2) - 1)) << 0) +#define F_GCP_EN(x) (((x) & ((1 << 1) - 1)) << 12) +#define F_DATA_EN(x) (((x) & ((1 << 1) - 1)) << 15) +#define F_HDMI2_PREAMBLE_EN(x) (((x) & ((1 << 1) - 1)) << 18) +#define F_PIC_3D(x) (((x) & ((1 << 4) - 1)) << 7) +#define F_BCH_EN(x) (((x) & ((1 << 1) - 1)) << 11) +#define F_SOURCE_PHY_MHDP_SEL(x) (((x) & ((1 << 2) - 1)) << 3) +#define F_HPD_VALID_WIDTH(x) (((x) & ((1 << 12) - 1)) << 0) +#define F_HPD_GLITCH_WIDTH(x) (((x) & ((1 << 8) - 1)) << 12) +#define F_HDMI2_CTRL_IL_MODE(x) (((x) & ((1 << 1) - 1)) << 19) +#define F_SOURCE_PHY_LANE0_SWAP(x) (((x) & ((1 << 2) - 1)) << 0) +#define F_SOURCE_PHY_LANE1_SWAP(x) (((x) & ((1 << 2) - 1)) << 2) +#define F_SOURCE_PHY_LANE2_SWAP(x) (((x) & ((1 << 2) - 1)) << 4) +#define F_SOURCE_PHY_LANE3_SWAP(x) (((x) & ((1 << 2) - 1)) << 6) +#define F_SOURCE_PHY_COMB_BYPASS(x) (((x) & ((1 << 1) - 1)) << 21) +#define F_SOURCE_PHY_20_10(x) (((x) & ((1 << 1) - 1)) << 22) +#define F_PKT_ALLOC_ADDRESS(x) (((x) & ((1 << 4) - 1)) << 0) +#define F_ACTIVE_IDLE_TYPE(x) (((x) & ((1 << 1) - 1)) << 17) +#define F_FIFO1_FLUSH(x) (((x) & ((1 << 1) - 1)) << 0) +#define F_PKT_ALLOC_WR_EN(x) (((x) & ((1 << 1) - 1)) << 0) +#define F_DATA_WR(x) (x) +#define F_WR_ADDR(x) (((x) & ((1 << 4) - 1)) << 0) +#define F_HOST_WR(x) (((x) & ((1 << 1) - 1)) << 0) +#define F_TYPE_VALID(x) (((x) & ((1 << 1) - 1)) << 16) +#define F_PACKET_TYPE(x) (((x) & ((1 << 8) - 1)) << 8) /* audio */ #define AUDIO_PACK_EN BIT(8) @@ -416,6 +492,24 @@ /* Reference cycles when using lane clock as reference */ #define LANE_REF_CYC 0x8000 +#define HOTPLUG_DEBOUNCE_MS 200 + +#define IRQ_IN 0 +#define IRQ_OUT 1 +#define IRQ_NUM 2 + +#define cdns_mhdp_plat_call(mhdp, operation) \ + (!(mhdp) ? -ENODEV : (((mhdp)->plat_data && (mhdp)->plat_data->operation) ? \ + (mhdp)->plat_data->operation(mhdp) : ENOIOCTLCMD)) + +/* bus access type */ +enum { + BUS_TYPE_NORMAL_APB = 0, + BUS_TYPE_NORMAL_SAPB = 1, + BUS_TYPE_LOW4K_APB = 2, + BUS_TYPE_LOW4K_SAPB = 3, +}; + enum voltage_swing_level { VOLTAGE_LEVEL_0, VOLTAGE_LEVEL_1, @@ -451,24 +545,261 @@ enum vic_bt_type { BT_709 = 0x1, }; -void cdn_dp_clock_reset(struct cdn_dp_device *dp); +enum audio_format { + AFMT_I2S = 0, + AFMT_SPDIF_INT = 1, + AFMT_SPDIF_EXT = 2, + AFMT_UNUSED, +}; + +enum { + MODE_DVI, + MODE_HDMI_1_4, + MODE_HDMI_2_0, +}; + +struct audio_info { + enum audio_format format; + int sample_rate; + int channels; + int sample_width; + int connector_type; +}; + +enum vic_pxl_encoding_format { + PXL_RGB = 0x1, + YCBCR_4_4_4 = 0x2, + YCBCR_4_2_2 = 0x4, + YCBCR_4_2_0 = 0x8, + Y_ONLY = 0x10, +}; + +struct video_info { + bool h_sync_polarity; + bool v_sync_polarity; + bool interlaced; + int color_depth; + enum vic_pxl_encoding_format color_fmt; +}; + +struct cdns_mhdp_host { + unsigned int link_rate; + u8 lanes_cnt; + u8 volt_swing; + u8 pre_emphasis; + u8 pattern_supp; + u8 fast_link; + u8 lane_mapping; + u8 enhanced; +}; + +struct cdns_mhdp_sink { + unsigned int link_rate; + u8 lanes_cnt; + u8 pattern_supp; + u8 fast_link; + u8 enhanced; +}; + +struct cdns_mhdp_bridge; +struct cdns_mhdp_connector; + +struct cdns_mhdp_bridge { + struct cdns_mhdp_device *mhdp; + struct drm_bridge base; + int pbn; + int8_t stream_id; + struct cdns_mhdp_connector *connector; + bool is_active; +}; + +struct cdns_mhdp_connector { + struct drm_connector base; + bool is_mst_connector; + struct drm_dp_mst_port *port; + struct cdns_mhdp_bridge *bridge; +}; + +struct cdns_mhdp_cec { + struct cec_adapter *adap; + struct device *dev; + struct mutex lock; + + struct cec_msg msg; + struct task_struct *cec_worker; +}; + +struct cdns_plat_data { + /* Vendor PHY support */ + int (*bind)(struct platform_device *pdev, + struct drm_encoder *encoder, + struct cdns_mhdp_device *mhdp); + void (*unbind)(struct device *dev); + + void (*plat_init)(struct cdns_mhdp_device *mhdp); + void (*plat_deinit)(struct cdns_mhdp_device *mhdp); + + int (*phy_set)(struct cdns_mhdp_device *mhdp); + bool (*phy_video_valid)(struct cdns_mhdp_device *mhdp); + int (*firmware_init)(struct cdns_mhdp_device *mhdp); + void (*pclk_rate)(struct cdns_mhdp_device *mhdp); + + int (*suspend)(struct cdns_mhdp_device *mhdp); + int (*resume)(struct cdns_mhdp_device *mhdp); + + int (*power_on)(struct cdns_mhdp_device *mhdp); + int (*power_off)(struct cdns_mhdp_device *mhdp); + + int bus_type; + int video_format; + char is_dp; + char *plat_name; +}; + +struct cdns_mhdp_device { + void __iomem *regs_base; + void __iomem *regs_sec; + + int bus_type; + + struct device *dev; + + struct cdns_mhdp_connector connector; + struct clk *spdif_clk; + struct reset_control *spdif_rst; + + struct platform_device *audio_pdev; + struct audio_info audio_info; + + struct cdns_mhdp_bridge bridge; + struct phy *phy; + + struct video_info video_info; + struct drm_display_mode mode; + const struct drm_display_mode *valid_mode; + unsigned int fw_version; + + struct drm_dp_mst_topology_mgr mst_mgr; + struct delayed_work hotplug_work; + + u32 lane_mapping; + bool link_up; + bool power_up; + bool plugged; + bool force_mode_set; + bool is_hpd; + bool is_ls1028a; + struct mutex lock; + struct mutex iolock; + + int irq[IRQ_NUM]; + + union { + struct _dp_data { + u8 dpcd[DP_RECEIVER_CAP_SIZE]; + u32 rate; + u8 num_lanes; + struct drm_dp_aux aux; + struct cdns_mhdp_host host; + struct cdns_mhdp_sink sink; + bool is_mst; + bool can_mst; + } dp; + struct _hdmi_data { + struct cdns_mhdp_cec cec; + u32 char_rate; + u32 hdmi_type; + } hdmi; + }; + const struct cdns_plat_data *plat_data; + +}; + +u32 cdns_mhdp_bus_read(struct cdns_mhdp_device *mhdp, u32 offset); +void cdns_mhdp_bus_write(u32 val, struct cdns_mhdp_device *mhdp, u32 offset); +void cdns_mhdp_clock_reset(struct cdns_mhdp_device *mhdp); +void cdns_mhdp_set_fw_clk(struct cdns_mhdp_device *mhdp, unsigned long clk); +u32 cdns_mhdp_get_fw_clk(struct cdns_mhdp_device *mhdp); +int cdns_mhdp_load_firmware(struct cdns_mhdp_device *mhdp, const u32 *i_mem, + u32 i_size, const u32 *d_mem, u32 d_size); +int cdns_mhdp_set_firmware_active(struct cdns_mhdp_device *mhdp, bool enable); +int cdns_mhdp_set_host_cap(struct cdns_mhdp_device *mhdp, bool flip); +int cdns_mhdp_event_config(struct cdns_mhdp_device *mhdp); +u32 cdns_mhdp_get_event(struct cdns_mhdp_device *mhdp); +int cdns_mhdp_dpcd_write(struct cdns_mhdp_device *mhdp, u32 addr, u8 value); +int cdns_mhdp_dpcd_read(struct cdns_mhdp_device *mhdp, + u32 addr, u8 *data, u16 len); +int cdns_mhdp_get_edid_block(void *mhdp, u8 *edid, + unsigned int block, size_t length); +int cdns_mhdp_train_link(struct cdns_mhdp_device *mhdp); +int cdns_mhdp_set_video_status(struct cdns_mhdp_device *mhdp, int active); +int cdns_mhdp_config_video(struct cdns_mhdp_device *mhdp); + +/* Audio */ +int cdns_mhdp_audio_stop(struct cdns_mhdp_device *mhdp, + struct audio_info *audio); +int cdns_mhdp_audio_mute(struct cdns_mhdp_device *mhdp, bool enable); +int cdns_mhdp_audio_config(struct cdns_mhdp_device *mhdp, + struct audio_info *audio); +int cdns_mhdp_register_audio_driver(struct device *dev); +void cdns_mhdp_unregister_audio_driver(struct device *dev); + +int cdns_mhdp_reg_read(struct cdns_mhdp_device *mhdp, u32 addr); +int cdns_mhdp_reg_write(struct cdns_mhdp_device *mhdp, u32 addr, u32 val); +int cdns_mhdp_reg_write_bit(struct cdns_mhdp_device *mhdp, u16 addr, + u8 start_bit, u8 bits_no, u32 val); +int cdns_mhdp_adjust_lt(struct cdns_mhdp_device *mhdp, u8 nlanes, + u16 udelay, u8 *lanes_data, + u8 *dpcd); + +int cdns_mhdp_read_hpd(struct cdns_mhdp_device *mhdp); +u32 cdns_phy_reg_read(struct cdns_mhdp_device *mhdp, u32 addr); +int cdns_phy_reg_write(struct cdns_mhdp_device *mhdp, u32 addr, u32 val); +int cdns_mhdp_mailbox_send(struct cdns_mhdp_device *mhdp, u8 module_id, + u8 opcode, u16 size, u8 *message); +int cdns_mhdp_mailbox_read_receive(struct cdns_mhdp_device *mhdp, + u8 *buff, u16 buff_size); +int cdns_mhdp_mailbox_validate_receive(struct cdns_mhdp_device *mhdp, + u8 module_id, u8 opcode, + u16 req_size); +int cdns_mhdp_mailbox_read(struct cdns_mhdp_device *mhdp); + +void cdns_mhdp_infoframe_set(struct cdns_mhdp_device *mhdp, + u8 entry_id, u8 packet_len, u8 *packet, u8 packet_type); +int cdns_hdmi_get_edid_block(void *data, u8 *edid, u32 block, size_t length); +int cdns_hdmi_scdc_read(struct cdns_mhdp_device *mhdp, u8 addr, u8 *data); +int cdns_hdmi_scdc_write(struct cdns_mhdp_device *mhdp, u8 addr, u8 value); +int cdns_hdmi_ctrl_init(struct cdns_mhdp_device *mhdp, int protocol, u32 char_rate); +int cdns_hdmi_mode_config(struct cdns_mhdp_device *mhdp, struct drm_display_mode *mode, + struct video_info *video_info); +int cdns_hdmi_disable_gcp(struct cdns_mhdp_device *mhdp); +int cdns_hdmi_enable_gcp(struct cdns_mhdp_device *mhdp); + +bool cdns_mhdp_check_alive(struct cdns_mhdp_device *mhdp); + +/* HDMI */ +int cdns_hdmi_probe(struct platform_device *pdev, + struct cdns_mhdp_device *mhdp); +void cdns_hdmi_remove(struct platform_device *pdev); +void cdns_hdmi_unbind(struct device *dev); +int cdns_hdmi_bind(struct platform_device *pdev, + struct drm_encoder *encoder, struct cdns_mhdp_device *mhdp); +void cdns_hdmi_set_sample_rate(struct cdns_mhdp_device *mhdp, unsigned int rate); +void cdns_hdmi_audio_enable(struct cdns_mhdp_device *mhdp); +void cdns_hdmi_audio_disable(struct cdns_mhdp_device *mhdp); + +/* DP */ +int cdns_dp_probe(struct platform_device *pdev, + struct cdns_mhdp_device *mhdp); +void cdns_dp_remove(struct platform_device *pdev); +void cdns_dp_unbind(struct device *dev); +int cdns_dp_bind(struct platform_device *pdev, + struct drm_encoder *encoder, struct cdns_mhdp_device *mhdp); + +/* CEC */ +#ifdef CONFIG_DRM_CDNS_HDMI_CEC +int cdns_mhdp_register_cec_driver(struct device *dev); +int cdns_mhdp_unregister_cec_driver(struct device *dev); +#endif -void cdn_dp_set_fw_clk(struct cdn_dp_device *dp, unsigned long clk); -int cdn_dp_load_firmware(struct cdn_dp_device *dp, const u32 *i_mem, - u32 i_size, const u32 *d_mem, u32 d_size); -int cdn_dp_set_firmware_active(struct cdn_dp_device *dp, bool enable); -int cdn_dp_set_host_cap(struct cdn_dp_device *dp, u8 lanes, bool flip); -int cdn_dp_event_config(struct cdn_dp_device *dp); -u32 cdn_dp_get_event(struct cdn_dp_device *dp); -int cdn_dp_get_hpd_status(struct cdn_dp_device *dp); -int cdn_dp_dpcd_write(struct cdn_dp_device *dp, u32 addr, u8 value); -int cdn_dp_dpcd_read(struct cdn_dp_device *dp, u32 addr, u8 *data, u16 len); -int cdn_dp_get_edid_block(void *dp, u8 *edid, - unsigned int block, size_t length); -int cdn_dp_train_link(struct cdn_dp_device *dp); -int cdn_dp_set_video_status(struct cdn_dp_device *dp, int active); -int cdn_dp_config_video(struct cdn_dp_device *dp); -int cdn_dp_audio_stop(struct cdn_dp_device *dp, struct audio_info *audio); -int cdn_dp_audio_mute(struct cdn_dp_device *dp, bool enable); -int cdn_dp_audio_config(struct cdn_dp_device *dp, struct audio_info *audio); -#endif /* _CDN_DP_REG_H */ +#endif /* CDNS_MHDP_H_ */ -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0002-MLK-24065-1-drm-bridge-cadence-fix-dp_aux_transfer-w.patch ================================================ From 55eb19200d650ead73139ee8444db9119718fd31 Mon Sep 17 00:00:00 2001 From: Sergey Zhuravlevich <zhurxx@gmail.com> Date: Tue, 12 May 2020 14:23:15 +0200 Subject: [PATCH 02/49] MLK-24065-1: drm: bridge: cadence: fix dp_aux_transfer write return value After exiting the loop in DP_AUX_NATIVE_WRITE it was returning 0. It's supposed to return the number of bytes transferred on success. Signed-off-by: Sergey Zhuravlevich <zhurxx@gmail.com> Acked-by: Sandor Yu <sandor.yu@nxp.com> Tested-By: Sandor Yu <sandor.yu@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-dp-core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c b/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c index acb5c860da73..aa92029f44e9 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c @@ -67,6 +67,8 @@ static ssize_t dp_aux_transfer(struct drm_dp_aux *aux, return ret; } + msg->reply = DP_AUX_NATIVE_REPLY_ACK; + return msg->size; } if (msg->request == DP_AUX_NATIVE_READ) { -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0003-MLK-24065-3-drm-bridge-cadence-use-the-lane-mapping-.patch ================================================ From 90e1a010995c0a87b0216706b1255ca5d0c36286 Mon Sep 17 00:00:00 2001 From: Sergey Zhuravlevich <zhurxx@gmail.com> Date: Tue, 12 May 2020 14:23:15 +0200 Subject: [PATCH 03/49] MLK-24065-3: drm: bridge: cadence: use the lane mapping from dt when setting host capabilities Signed-off-by: Sergey Zhuravlevich <zhurxx@gmail.com> Acked-by: Sandor Yu <sandor.yu@nxp.com> Tested-By: Sandor Yu <sandor.yu@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-dp-core.c | 2 +- drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c | 4 ++-- include/drm/bridge/cdns-mhdp.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c b/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c index aa92029f44e9..c059d56b4f46 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c @@ -152,7 +152,7 @@ static void cdns_dp_mode_set(struct cdns_mhdp_device *mhdp) cdns_mhdp_reg_write(mhdp, LANES_CONFIG, 0x00400000 | lane_mapping); /* Set DP host capability */ - ret = cdns_mhdp_set_host_cap(mhdp, false); + ret = cdns_mhdp_set_host_cap(mhdp); if (ret) { DRM_DEV_ERROR(mhdp->dev, "Failed to set host cap %d\n", ret); return; diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c index 91d1cfd4b2af..9c0a2668e494 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c @@ -438,7 +438,7 @@ int cdns_mhdp_set_firmware_active(struct cdns_mhdp_device *mhdp, bool enable) } EXPORT_SYMBOL(cdns_mhdp_set_firmware_active); -int cdns_mhdp_set_host_cap(struct cdns_mhdp_device *mhdp, bool flip) +int cdns_mhdp_set_host_cap(struct cdns_mhdp_device *mhdp) { u8 msg[8]; int ret; @@ -449,7 +449,7 @@ int cdns_mhdp_set_host_cap(struct cdns_mhdp_device *mhdp, bool flip) msg[3] = PRE_EMPHASIS_LEVEL_3; msg[4] = PTS1 | PTS2 | PTS3 | PTS4; msg[5] = FAST_LT_NOT_SUPPORT; - msg[6] = flip ? LANE_MAPPING_FLIPPED : LANE_MAPPING_NORMAL; + msg[6] = mhdp->lane_mapping; msg[7] = ENHANCED; ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_DP_TX, diff --git a/include/drm/bridge/cdns-mhdp.h b/include/drm/bridge/cdns-mhdp.h index d76716d4edc6..4dc6e428b5f7 100644 --- a/include/drm/bridge/cdns-mhdp.h +++ b/include/drm/bridge/cdns-mhdp.h @@ -723,7 +723,7 @@ u32 cdns_mhdp_get_fw_clk(struct cdns_mhdp_device *mhdp); int cdns_mhdp_load_firmware(struct cdns_mhdp_device *mhdp, const u32 *i_mem, u32 i_size, const u32 *d_mem, u32 d_size); int cdns_mhdp_set_firmware_active(struct cdns_mhdp_device *mhdp, bool enable); -int cdns_mhdp_set_host_cap(struct cdns_mhdp_device *mhdp, bool flip); +int cdns_mhdp_set_host_cap(struct cdns_mhdp_device *mhdp); int cdns_mhdp_event_config(struct cdns_mhdp_device *mhdp); u32 cdns_mhdp_get_event(struct cdns_mhdp_device *mhdp); int cdns_mhdp_dpcd_write(struct cdns_mhdp_device *mhdp, u32 addr, u8 value); -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0004-MLK-24065-2-drm-bridge-cadence-print-error-when-cloc.patch ================================================ From 62c1852bc0f94efb6884d34c2c27dcf1efa3b282 Mon Sep 17 00:00:00 2001 From: Sergey Zhuravlevich <zhurxx@gmail.com> Date: Tue, 12 May 2020 14:23:15 +0200 Subject: [PATCH 04/49] MLK-24065-2: drm: bridge: cadence: print error when clock recovery fails Signed-off-by: Sergey Zhuravlevich <zhurxx@gmail.com> Acked-by: Sandor Yu <sandor.yu@nxp.com> Tested-By: Sandor Yu <sandor.yu@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-mhdp-dp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-dp.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-dp.c index f025c39d12ea..a032e19765a4 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-dp.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-dp.c @@ -106,7 +106,9 @@ static int cdns_mhdp_training_start(struct cdns_mhdp_device *mhdp) if (ret) goto err_training_start; - if (event[1] & EQ_PHASE_FINISHED) + if (event[1] & CLK_RECOVERY_FAILED) + DRM_DEV_ERROR(mhdp->dev, "clock recovery failed\n"); + else if (event[1] & EQ_PHASE_FINISHED) return 0; } -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0005-LF-1511-drm-cdn-cec-replace-i-with-i-in-loop.patch ================================================ From eb19fd99254d6a0aa97bb08c09b9f82ebff306c5 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Fri, 19 Jun 2020 15:32:28 +0800 Subject: [PATCH 05/49] LF-1511: drm: cdn-cec: replace ++i with i++ in loop replace ++i with i++ in loop to prevent Coverity issue. Coverity ID 9000767 Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Fancy Fang <chen.fang@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c index 5717bb0bcb75..029ad761606a 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c @@ -163,13 +163,13 @@ static int mhdp_cec_set_logical_addr(struct cdns_mhdp_cec *cec, u32 la) if (la == CEC_LOG_ADDR_INVALID) /* invalid all LA address */ - for (i = 0; i < CEC_MAX_LOG_ADDRS; ++i) { + for (i = 0; i < CEC_MAX_LOG_ADDRS; i++) { mhdp_cec_write(cec, LOGICAL_ADDRESS_LA0 + (i * REG_ADDR_OFF), 0); return 0; } /* In fact cdns mhdp cec could support max 5 La address */ - for (i = 0; i < CEC_MAX_LOG_ADDRS; ++i) { + for (i = 0; i < CEC_MAX_LOG_ADDRS; i++) { la_reg = mhdp_cec_read(cec, LOGICAL_ADDRESS_LA0 + (i * REG_ADDR_OFF)); /* Check LA already used */ if (la_reg & 0x10) -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0006-LF-1512-drm-cdns-mhdp-avoid-potentially-overflowing.patch ================================================ From 09dfa5b8ba1a38050e4e95faab1cf07c6a509dad Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Fri, 19 Jun 2020 16:05:42 +0800 Subject: [PATCH 06/49] LF-1512: drm: cdns mhdp: avoid potentially overflowing covert to unsigned 64 bits to avoid potentially overflowing. Report by Coverity ID 6652952 6652952. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Fancy Fang <chen.fang@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c index 9c0a2668e494..890add9b7c67 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c @@ -657,7 +657,7 @@ int cdns_mhdp_config_video(struct cdns_mhdp_device *mhdp) */ do { tu_size_reg += 2; - symbol = tu_size_reg * mode->clock * bit_per_pix; + symbol = (u64) tu_size_reg * mode->clock * bit_per_pix; do_div(symbol, mhdp->dp.num_lanes * link_rate * 8); rem = do_div(symbol, 1000); if (tu_size_reg > 64) { -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0007-MLK-24335-drm-bridge-cdns-hdmi-support-work-in-DVI-m.patch ================================================ From a1b02ef19cbc24603e1e212f4f4258ca2c59aaad Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Thu, 18 Jun 2020 14:18:04 +0800 Subject: [PATCH 07/49] MLK-24335: drm: bridge: cdns: hdmi support work in DVI mode hdmi support work in DVI mode. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c index da40f62617ef..5f2442fa761f 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c @@ -32,8 +32,9 @@ static void hdmi_sink_config(struct cdns_mhdp_device *mhdp) struct drm_scdc *scdc = &mhdp->connector.base.display_info.hdmi.scdc; u8 buff = 0; - /* Default work in HDMI1.4 */ - mhdp->hdmi.hdmi_type = MODE_HDMI_1_4; + /* return if hdmi work in DVI mode */ + if (mhdp->hdmi.hdmi_type == MODE_DVI) + return; /* check sink support SCDC or not */ if (scdc->supported != true) { @@ -264,6 +265,8 @@ static int cdns_hdmi_connector_get_modes(struct drm_connector *connector) edid->header[6], edid->header[7]); drm_connector_update_edid_property(connector, edid); num_modes = drm_add_edid_modes(connector, edid); + mhdp->hdmi.hdmi_type = drm_detect_hdmi_monitor(edid) ? + MODE_HDMI_1_4 : MODE_DVI; kfree(edid); } -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0008-LF-1762-21-gpu-drm-bridge-cadence-hdmi-update-API-.m.patch ================================================ From 83f932299b9969a1823b085d2269db677362f897 Mon Sep 17 00:00:00 2001 From: Dong Aisheng <aisheng.dong@nxp.com> Date: Tue, 14 Jul 2020 19:18:25 +0800 Subject: [PATCH 08/49] LF-1762-21 gpu: drm: bridge: cadence: hdmi: update API .mode_valid() API changed since: 12c683e12cd8 ("drm: bridge: Pass drm_display_info to drm_bridge_funcs .mode_valid()") Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-dp-core.c | 1 + drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c | 1 + 2 files changed, 2 insertions(+) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c b/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c index c059d56b4f46..cb4897c664f0 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c @@ -256,6 +256,7 @@ static int cdns_dp_bridge_attach(struct drm_bridge *bridge, static enum drm_mode_status cdns_dp_bridge_mode_valid(struct drm_bridge *bridge, + const struct drm_display_info *info, const struct drm_display_mode *mode) { enum drm_mode_status mode_status = MODE_OK; diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c index 5f2442fa761f..1e5130e295f7 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c @@ -359,6 +359,7 @@ static int cdns_hdmi_bridge_attach(struct drm_bridge *bridge, static enum drm_mode_status cdns_hdmi_bridge_mode_valid(struct drm_bridge *bridge, + const struct drm_display_info *info, const struct drm_display_mode *mode) { struct cdns_mhdp_device *mhdp = bridge->driver_private; -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0009-LF-2271-1-drm-bridge-cdns-Use-colorspace-connector-p.patch ================================================ From 150d291f3e5cb47a97790b89e79d8f1a5aa797dd Mon Sep 17 00:00:00 2001 From: Laurentiu Palcu <laurentiu.palcu@nxp.com> Date: Fri, 28 Aug 2020 10:26:31 +0300 Subject: [PATCH 09/49] LF-2271-1: drm/bridge/cdns: Use colorspace connector property for imx8mq This patch achieves 2 goals: * Make use of colorspace property when setting up the color_depth and color_fmt. The userspace can now choose which colorspace to use by changing the colorspace property; * Do not use drm_display_mode private_flags to signal CRTC which pixel encoding is being used by connector. Upstream is getting rid of 'private_flags' usage and the declaration will probably be removed in the next release; Signed-off-by: Laurentiu Palcu <laurentiu.palcu@nxp.com> Reviewed-by: Robert Chiras <robert.chiras@nxp.com> --- .../gpu/drm/bridge/cadence/cdns-hdmi-core.c | 58 ++++++++++++------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c index 1e5130e295f7..2796252adf68 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c @@ -412,6 +412,7 @@ bool cdns_hdmi_bridge_mode_fixup(struct drm_bridge *bridge, struct drm_display_mode *adjusted_mode) { struct cdns_mhdp_device *mhdp = bridge->driver_private; + struct drm_connector_state *conn_state = mhdp->connector.base.state; struct drm_display_info *di = &mhdp->connector.base.display_info; struct video_info *video = &mhdp->video_info; int vic = drm_match_cea_mode(mode); @@ -428,36 +429,49 @@ bool cdns_hdmi_bridge_mode_fixup(struct drm_bridge *bridge, } /* imx8mq */ - if (vic == 97 || vic == 96) { - if (di->hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_36) - video->color_depth = 12; - else if (di->hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_30) - video->color_depth = 10; - - if (drm_mode_is_420_only(di, mode) || - (drm_mode_is_420_also(di, mode) && - video->color_depth > 8)) { + if (conn_state->colorspace == DRM_MODE_COLORIMETRY_DEFAULT) + return !drm_mode_is_420_only(di, mode); + + if (conn_state->colorspace == DRM_MODE_COLORIMETRY_BT2020_RGB) { + if (drm_mode_is_420_only(di, mode)) + return false; + + /* 10b RGB is not supported for following VICs */ + if (vic == 97 || vic == 96 || vic == 95 || vic == 93 || vic == 94) + return false; + + video->color_depth = 10; + + return true; + } + + if (conn_state->colorspace == DRM_MODE_COLORIMETRY_BT2020_CYCC || + conn_state->colorspace == DRM_MODE_COLORIMETRY_BT2020_YCC) { + if (drm_mode_is_420_only(di, mode)) { video->color_fmt = YCBCR_4_2_0; - adjusted_mode->private_flags = 1; + if (di->hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_36) + video->color_depth = 12; + else if (di->hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_30) + video->color_depth = 10; + else + return false; + return true; } - video->color_depth = 8; - return true; - } + video->color_fmt = YCBCR_4_2_2; + + if (!(di->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_36)) + return false; - /* Any defined maximum tmds clock limit we must not exceed*/ - if ((di->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_36) && - (mode->clock * 3 / 2 <= di->max_tmds_clock)) video->color_depth = 12; - else if ((di->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_30) && - (mode->clock * 5 / 4 <= di->max_tmds_clock)) - video->color_depth = 10; - /* 10-bit color depth for the following modes is not supported */ - if ((vic == 95 || vic == 94 || vic == 93) && video->color_depth == 10) - video->color_depth = 8; + return true; + } + + video->color_fmt = drm_mode_is_420_only(di, mode) ? YCBCR_4_2_0 : YCBCR_4_4_4; + video->color_depth = 8; return true; } -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0010-MLK-24770-drm-mhdp-Sync-DPTX-capability-with-Cadence.patch ================================================ From 04a71f1da60e51f277d4979c698e52cacb028666 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Mon, 14 Sep 2020 15:06:35 +0800 Subject: [PATCH 10/49] MLK-24770: drm: mhdp: Sync DPTX capability with Cadence sample code Sync the max vswing and pre-emphasis setting with Cadence sample code. The max vswing is VOLTAGE_LEVEL_3 and the max pre-emphasis is PRE_EMPHASIS_LEVEL_2 now. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c index 890add9b7c67..2043016f176b 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c @@ -445,8 +445,8 @@ int cdns_mhdp_set_host_cap(struct cdns_mhdp_device *mhdp) msg[0] = drm_dp_link_rate_to_bw_code(mhdp->dp.rate); msg[1] = mhdp->dp.num_lanes | SCRAMBLER_EN; - msg[2] = VOLTAGE_LEVEL_2; - msg[3] = PRE_EMPHASIS_LEVEL_3; + msg[2] = VOLTAGE_LEVEL_3; + msg[3] = PRE_EMPHASIS_LEVEL_2; msg[4] = PTS1 | PTS2 | PTS3 | PTS4; msg[5] = FAST_LT_NOT_SUPPORT; msg[6] = mhdp->lane_mapping; -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0011-MLK-24520-drm-bridge-cdns-increase-maximum-width-fro.patch ================================================ From 11b66e4bdb8ba6dc4e6981ecef69534c3d6d8df8 Mon Sep 17 00:00:00 2001 From: "Oliver F. Brown" <oliver.brown@nxp.com> Date: Thu, 23 Jul 2020 18:24:23 -0500 Subject: [PATCH 11/49] MLK-24520: drm: bridge: cdns: increase maximum width from 4096 to 5120. This patch increases the maximum width to 5120. Signed-off-by: Oliver F. Brown <oliver.brown@nxp.com> Reviewed-by: Liu Ying <victor.liu@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-dp-core.c | 4 ++-- drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c b/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c index cb4897c664f0..0f2a38d19a57 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c @@ -270,8 +270,8 @@ cdns_dp_bridge_mode_valid(struct drm_bridge *bridge, if (mode->clock > 594000) return MODE_CLOCK_HIGH; - /* 4096x2160 is not supported now */ - if (mode->hdisplay > 3840) + /* 5120 x 2160 is the maximum supported resulution */ + if (mode->hdisplay > 5120) return MODE_BAD_HVALUE; if (mode->vdisplay > 2160) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c index 2796252adf68..442df6284c49 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c @@ -375,8 +375,8 @@ cdns_hdmi_bridge_mode_valid(struct drm_bridge *bridge, if (mode->clock > 594000) return MODE_CLOCK_HIGH; - /* 4096x2160 is not supported */ - if (mode->hdisplay > 3840 || mode->vdisplay > 2160) + /* 5120 x 2160 is the maximum supported resolution */ + if (mode->hdisplay > 5120 || mode->vdisplay > 2160) return MODE_BAD_HVALUE; mhdp->valid_mode = mode; -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0012-MLK-24521-drm-bridge-hdmi-Prevent-the-driver-from-re.patch ================================================ From 4cb4fe3262fbbf6b31731b6b076698bcf951b9a1 Mon Sep 17 00:00:00 2001 From: "Oliver F. Brown" <oliver.brown@nxp.com> Date: Fri, 24 Jul 2020 14:28:05 -0500 Subject: [PATCH 12/49] MLK-24521: drm: bridge: hdmi: Prevent the driver from rejecting VIC 0 modes iMX8QM can support the non CEA modes, iMX8M cannot support non CEA modes. So driver should allow non CEA modes for iMX8QM. Signed-off-by: Oliver F. Brown <oliver.brown@nxp.com> Reviewed-by: Liu Ying <victor.liu@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c index 442df6284c49..a8fa559de9e9 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c @@ -364,6 +364,7 @@ cdns_hdmi_bridge_mode_valid(struct drm_bridge *bridge, { struct cdns_mhdp_device *mhdp = bridge->driver_private; enum drm_mode_status mode_status = MODE_OK; + u32 vic; int ret; /* We don't support double-clocked and Interlaced modes */ @@ -379,6 +380,13 @@ cdns_hdmi_bridge_mode_valid(struct drm_bridge *bridge, if (mode->hdisplay > 5120 || mode->vdisplay > 2160) return MODE_BAD_HVALUE; + /* imx8mq-hdmi does not support non CEA modes */ + if (!strncmp("imx8mq-hdmi", mhdp->plat_data->plat_name, 11)) { + vic = drm_match_cea_mode(mode); + if (vic == 0) + return MODE_BAD; + } + mhdp->valid_mode = mode; ret = cdns_mhdp_plat_call(mhdp, phy_video_valid); if (ret == false) -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0013-MLK-23642-1-drm-bridge-cadence-support-HBR-and-6-cha.patch ================================================ From cd7804fc3777e0b53d69d34058fee39accc72072 Mon Sep 17 00:00:00 2001 From: Shengjiu Wang <shengjiu.wang@nxp.com> Date: Wed, 29 Apr 2020 17:34:07 +0800 Subject: [PATCH 13/49] MLK-23642-1: drm: bridge: cadence: support HBR and 6 channel Support HBR and 6 channel. For HBR, it only support compressed bitstream, sample rate is 192kHz, and 8 channels. Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com> Reviewed-by: Viorel Suman <viorel.suman@nxp.com> --- .../gpu/drm/bridge/cadence/cdns-mhdp-audio.c | 33 ++++++++++++++----- include/drm/bridge/cdns-mhdp.h | 1 + 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c index 86174fb633bc..fa1dcf781539 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c @@ -72,6 +72,8 @@ static void hdmi_audio_avi_set(struct cdns_mhdp_device *mhdp, frame.channel_allocation = 0; else if (channels == 4) frame.channel_allocation = 0x3; + else if (channels == 6) + frame.channel_allocation = 0xB; else if (channels == 8) frame.channel_allocation = 0x13; @@ -143,26 +145,38 @@ static void cdns_mhdp_audio_config_i2s(struct cdns_mhdp_device *mhdp, { int sub_pckt_num = 1, i2s_port_en_val = 0xf, i; int idx = select_N_index(mhdp->mode.clock); + int numofchannels = audio->channels; u32 val, ncts; + u32 disable_port3 = 0; + u32 audio_type = 0x2; /* L-PCM */ + u32 transmission_type = 0; /* not required for L-PCM */ - if (audio->channels == 2) { + if (numofchannels == 2) { if (mhdp->dp.num_lanes == 1) sub_pckt_num = 2; else sub_pckt_num = 4; i2s_port_en_val = 1; - } else if (audio->channels == 4) { + } else if (numofchannels == 4) { i2s_port_en_val = 3; + } else if (numofchannels == 6) { + numofchannels = 8; + disable_port3 = 1; + } else if ((numofchannels == 8) && (audio->non_pcm)) { + audio_type = 0x9; /* HBR packet type */ + transmission_type = 0x9; /* HBR packet type */ } cdns_mhdp_bus_write(0x0, mhdp, SPDIF_CTRL_ADDR); - cdns_mhdp_bus_write(SYNC_WR_TO_CH_ZERO, mhdp, FIFO_CNTL); + val = SYNC_WR_TO_CH_ZERO; + val |= disable_port3 << 4; + cdns_mhdp_bus_write(val, mhdp, FIFO_CNTL); - val = MAX_NUM_CH(audio->channels); - val |= NUM_OF_I2S_PORTS(audio->channels); - val |= AUDIO_TYPE_LPCM; + val = MAX_NUM_CH(numofchannels); + val |= NUM_OF_I2S_PORTS(numofchannels); + val |= audio_type << 7; val |= CFG_SUB_PCKT_NUM(sub_pckt_num); cdns_mhdp_bus_write(val, mhdp, SMPL2PKT_CNFG); @@ -173,12 +187,13 @@ static void cdns_mhdp_audio_config_i2s(struct cdns_mhdp_device *mhdp, else val = 2 << 9; - val |= AUDIO_CH_NUM(audio->channels); + val |= AUDIO_CH_NUM(numofchannels); val |= I2S_DEC_PORT_EN(i2s_port_en_val); val |= TRANS_SMPL_WIDTH_32; + val |= transmission_type << 13; cdns_mhdp_bus_write(val, mhdp, AUDIO_SRC_CNFG); - for (i = 0; i < (audio->channels + 1) / 2; i++) { + for (i = 0; i < (numofchannels + 1) / 2; i++) { if (audio->sample_width == 16) val = (0x02 << 8) | (0x02 << 20); else if (audio->sample_width == 24) @@ -323,6 +338,8 @@ static int audio_hw_params(struct device *dev, void *data, goto out; } + audio.non_pcm = params->iec.status[0] & IEC958_AES0_NONAUDIO; + ret = cdns_mhdp_audio_config(mhdp, &audio); if (!ret) mhdp->audio_info = audio; diff --git a/include/drm/bridge/cdns-mhdp.h b/include/drm/bridge/cdns-mhdp.h index 4dc6e428b5f7..1f8fd024cdfa 100644 --- a/include/drm/bridge/cdns-mhdp.h +++ b/include/drm/bridge/cdns-mhdp.h @@ -564,6 +564,7 @@ struct audio_info { int channels; int sample_width; int connector_type; + bool non_pcm; }; enum vic_pxl_encoding_format { -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0014-MLK-24611-2-drm-bridge-cdns-Add-callback-function-fo.patch ================================================ From 46bf1dc2ba34440e8f83b3f70e3e4d6b3f9e6183 Mon Sep 17 00:00:00 2001 From: Shengjiu Wang <shengjiu.wang@nxp.com> Date: Mon, 31 Aug 2020 14:50:29 +0800 Subject: [PATCH 14/49] MLK-24611-2: drm: bridge: cdns: Add callback function for plug/unplug event cdns-hdmi-core exports a function cdns_hdmi_set_plugged_cb so platform device can register the callback implement hook_plugged_cb to register callback function for hdmi cable plug/unplug event. Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com> Reviewed-by: Sandor Yu <Sandor.yu@nxp.com> --- .../gpu/drm/bridge/cadence/cdns-hdmi-core.c | 41 +++++++++++++++++-- .../gpu/drm/bridge/cadence/cdns-mhdp-audio.c | 10 +++++ include/drm/bridge/cdns-mhdp.h | 6 +++ 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c index a8fa559de9e9..5890da8aa1a1 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c @@ -225,11 +225,35 @@ void cdns_hdmi_mode_set(struct cdns_mhdp_device *mhdp) } } +static void handle_plugged_change(struct cdns_mhdp_device *mhdp, bool plugged) +{ + if (mhdp->plugged_cb && mhdp->codec_dev) + mhdp->plugged_cb(mhdp->codec_dev, plugged); +} + +int cdns_hdmi_set_plugged_cb(struct cdns_mhdp_device *mhdp, + hdmi_codec_plugged_cb fn, + struct device *codec_dev) +{ + bool plugged; + + mutex_lock(&mhdp->lock); + mhdp->plugged_cb = fn; + mhdp->codec_dev = codec_dev; + plugged = mhdp->last_connector_result == connector_status_connected; + handle_plugged_change(mhdp, plugged); + mutex_unlock(&mhdp->lock); + + return 0; +} +EXPORT_SYMBOL_GPL(cdns_hdmi_set_plugged_cb); + static enum drm_connector_status cdns_hdmi_connector_detect(struct drm_connector *connector, bool force) { struct cdns_mhdp_device *mhdp = container_of(connector, struct cdns_mhdp_device, connector.base); + enum drm_connector_status result; u8 hpd = 0xf; @@ -237,15 +261,25 @@ cdns_hdmi_connector_detect(struct drm_connector *connector, bool force) if (hpd == 1) /* Cable Connected */ - return connector_status_connected; + result = connector_status_connected; else if (hpd == 0) /* Cable Disconnedted */ - return connector_status_disconnected; + result = connector_status_disconnected; else { /* Cable status unknown */ DRM_INFO("Unknow cable status, hdp=%u\n", hpd); - return connector_status_unknown; + result = connector_status_unknown; + } + + mutex_lock(&mhdp->lock); + if (result != mhdp->last_connector_result) { + handle_plugged_change(mhdp, + result == connector_status_connected); + mhdp->last_connector_result = result; } + mutex_unlock(&mhdp->lock); + + return result; } static int cdns_hdmi_connector_get_modes(struct drm_connector *connector) @@ -624,6 +658,7 @@ static int __cdns_hdmi_probe(struct platform_device *pdev, #ifdef CONFIG_OF mhdp->bridge.base.of_node = dev->of_node; #endif + mhdp->last_connector_result = connector_status_disconnected; memset(&pdevinfo, 0, sizeof(pdevinfo)); pdevinfo.parent = dev; diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c index fa1dcf781539..f4f3f9ca437c 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c @@ -380,11 +380,21 @@ static int audio_get_eld(struct device *dev, void *data, return 0; } +static int audio_hook_plugged_cb(struct device *dev, void *data, + hdmi_codec_plugged_cb fn, + struct device *codec_dev) +{ + struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); + + return cdns_hdmi_set_plugged_cb(mhdp, fn, codec_dev); +} + static const struct hdmi_codec_ops audio_codec_ops = { .hw_params = audio_hw_params, .audio_shutdown = audio_shutdown, .digital_mute = audio_digital_mute, .get_eld = audio_get_eld, + .hook_plugged_cb = audio_hook_plugged_cb, }; int cdns_mhdp_register_audio_driver(struct device *dev) diff --git a/include/drm/bridge/cdns-mhdp.h b/include/drm/bridge/cdns-mhdp.h index 1f8fd024cdfa..6bfd82a3d9a2 100644 --- a/include/drm/bridge/cdns-mhdp.h +++ b/include/drm/bridge/cdns-mhdp.h @@ -22,6 +22,7 @@ #include <drm/display/drm_dp_mst_helper.h> #include <media/cec.h> #include <linux/bitops.h> +#include <sound/hdmi-codec.h> #define ADDR_IMEM 0x10000 #define ADDR_DMEM 0x20000 @@ -714,6 +715,9 @@ struct cdns_mhdp_device { }; const struct cdns_plat_data *plat_data; + hdmi_codec_plugged_cb plugged_cb; + struct device *codec_dev; + enum drm_connector_status last_connector_result; }; u32 cdns_mhdp_bus_read(struct cdns_mhdp_device *mhdp, u32 offset); @@ -796,6 +800,8 @@ void cdns_dp_remove(struct platform_device *pdev); void cdns_dp_unbind(struct device *dev); int cdns_dp_bind(struct platform_device *pdev, struct drm_encoder *encoder, struct cdns_mhdp_device *mhdp); +int cdns_hdmi_set_plugged_cb(struct cdns_mhdp_device *mhdp, hdmi_codec_plugged_cb fn, + struct device *codec_dev); /* CEC */ #ifdef CONFIG_DRM_CDNS_HDMI_CEC -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0015-gpu-drm-dridge-hdp-audio-change-to-mute_stream.patch ================================================ From 1b0a179061890c0a2f6748426f03e8cd2176d3e2 Mon Sep 17 00:00:00 2001 From: Dong Aisheng <aisheng.dong@nxp.com> Date: Wed, 5 Aug 2020 21:31:04 +0800 Subject: [PATCH 15/49] gpu: drm: dridge: hdp-audio: change to mute_stream To cope with upstream API change: e2978c45e5ed ("ASoC: soc-dai: remove .digital_mute") Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c index f4f3f9ca437c..85f526175439 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c @@ -358,8 +358,8 @@ static void audio_shutdown(struct device *dev, void *data) mhdp->audio_info.format = AFMT_UNUSED; } -static int audio_digital_mute(struct device *dev, void *data, - bool enable) +static int audio_mute_stream(struct device *dev, void *data, + bool enable, int direction) { struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); int ret; @@ -392,9 +392,10 @@ static int audio_hook_plugged_cb(struct device *dev, void *data, static const struct hdmi_codec_ops audio_codec_ops = { .hw_params = audio_hw_params, .audio_shutdown = audio_shutdown, - .digital_mute = audio_digital_mute, + .mute_stream = audio_mute_stream, .get_eld = audio_get_eld, .hook_plugged_cb = audio_hook_plugged_cb, + .no_capture_mute = 1, }; int cdns_mhdp_register_audio_driver(struct device *dev) -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0016-LF-2744-drm-cdns-reset-force_mode_set-flag-in-atomic.patch ================================================ From 4a406e182a709718a769c37d33530ed2e6b23b39 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Tue, 17 Nov 2020 15:47:36 +0800 Subject: [PATCH 16/49] LF-2744: drm: cdns: reset force_mode_set flag in atomic_check Reset force_mode_set flag in atomic_check function to avoid set mode_changed flag multi times when cable plugin. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c index 5890da8aa1a1..e796c2c0e895 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c @@ -1,7 +1,7 @@ /* * Cadence High-Definition Multimedia Interface (HDMI) driver * - * Copyright (C) 2019 NXP Semiconductor, Inc. + * Copyright (C) 2019-2020 NXP Semiconductor, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -445,8 +445,6 @@ static void cdns_hdmi_bridge_mode_set(struct drm_bridge *bridge, mutex_lock(&mhdp->lock); cdns_hdmi_mode_set(mhdp); mutex_unlock(&mhdp->lock); - /* reset force mode set flag */ - mhdp->force_mode_set = false; } bool cdns_hdmi_bridge_mode_fixup(struct drm_bridge *bridge, -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0017-MLK-24081-03-drm-bridge-cdns-cec-support-hdmi-rx-cec.patch ================================================ From f7f5ec54b815df2c9a92f0fd6edea4f5d0700937 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Mon, 16 Nov 2020 10:56:44 +0800 Subject: [PATCH 17/49] MLK-24081-03: drm: bridge: cdns-cec: support hdmi rx cec Create struct cdns_mhdp_cec and cec specific bus_read/write function. CEC driver could be reuse by hdmi rx. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> --- drivers/gpu/drm/bridge/cadence/Kconfig | 1 - .../gpu/drm/bridge/cadence/cdns-hdmi-core.c | 18 ++++- .../gpu/drm/bridge/cadence/cdns-mhdp-cec.c | 66 +++++++++++++------ .../gpu/drm/bridge/cadence/cdns-mhdp-common.c | 6 -- include/drm/bridge/cdns-mhdp.h | 19 +++--- 5 files changed, 72 insertions(+), 38 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/Kconfig b/drivers/gpu/drm/bridge/cadence/Kconfig index bb1865b15aca..c271ab24a99a 100644 --- a/drivers/gpu/drm/bridge/cadence/Kconfig +++ b/drivers/gpu/drm/bridge/cadence/Kconfig @@ -45,6 +45,5 @@ config DRM_CDNS_AUDIO config DRM_CDNS_HDMI_CEC tristate "Cadence MHDP HDMI CEC driver" - depends on DRM_CDNS_HDMI select CEC_CORE select CEC_NOTIFIER diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c index e796c2c0e895..84c175997740 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c @@ -569,6 +569,19 @@ static void cdns_hdmi_parse_dt(struct cdns_mhdp_device *mhdp) dev_info(mhdp->dev, "lane-mapping 0x%02x\n", mhdp->lane_mapping); } +#ifdef CONFIG_DRM_CDNS_HDMI_CEC +static void cdns_mhdp_cec_init(struct cdns_mhdp_device *mhdp) +{ + struct cdns_mhdp_cec *cec = &mhdp->hdmi.cec; + + cec->dev = mhdp->dev; + cec->iolock = &mhdp->iolock; + cec->regs_base = mhdp->regs_base; + cec->regs_sec = mhdp->regs_sec; + cec->bus_type = mhdp->bus_type; +} +#endif + static int __cdns_hdmi_probe(struct platform_device *pdev, struct cdns_mhdp_device *mhdp) { @@ -669,7 +682,8 @@ static int __cdns_hdmi_probe(struct platform_device *pdev, /* register cec driver */ #ifdef CONFIG_DRM_CDNS_HDMI_CEC - cdns_mhdp_register_cec_driver(dev); + cdns_mhdp_cec_init(mhdp); + cdns_mhdp_register_cec_driver(&mhdp->hdmi.cec); #endif return 0; @@ -679,7 +693,7 @@ static void __cdns_hdmi_remove(struct cdns_mhdp_device *mhdp) { /* unregister cec driver */ #ifdef CONFIG_DRM_CDNS_HDMI_CEC - cdns_mhdp_unregister_cec_driver(mhdp->dev); + cdns_mhdp_unregister_cec_driver(&mhdp->hdmi.cec); #endif cdns_mhdp_unregister_audio_driver(mhdp->dev); } diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c index 029ad761606a..25cf9e91e64f 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c @@ -1,5 +1,5 @@ /* - * Copyright 2019 NXP + * Copyright 2019-2020 NXP * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -74,16 +74,49 @@ enum { static u32 mhdp_cec_read(struct cdns_mhdp_cec *cec, u32 offset) { - struct cdns_mhdp_device *mhdp = - container_of(cec, struct cdns_mhdp_device, hdmi.cec); - return cdns_mhdp_bus_read(mhdp, offset); + u32 val; + + mutex_lock(cec->iolock); + + if (cec->bus_type == BUS_TYPE_LOW4K_HDMI_RX) { + /* Remap address to low 4K HDMI RX */ + writel(offset >> 12, cec->regs_sec + 4); + val = readl((offset & 0xfff) + cec->regs_base); + } else if (cec->bus_type == BUS_TYPE_LOW4K_APB) { + /* Remap address to low 4K memory */ + writel(offset >> 12, cec->regs_sec + 8); + val = readl((offset & 0xfff) + cec->regs_base); + } else + val = readl(cec->regs_base + offset); + + mutex_unlock(cec->iolock); + + return val; } static void mhdp_cec_write(struct cdns_mhdp_cec *cec, u32 offset, u32 val) { - struct cdns_mhdp_device *mhdp = - container_of(cec, struct cdns_mhdp_device, hdmi.cec); - cdns_mhdp_bus_write(val, mhdp, offset); + mutex_lock(cec->iolock); + + if (cec->bus_type == BUS_TYPE_LOW4K_HDMI_RX) { + /* Remap address to low 4K SAPB bus */ + writel(offset >> 12, cec->regs_sec + 4); + writel(val, (offset & 0xfff) + cec->regs_base); + } else if (cec->bus_type == BUS_TYPE_LOW4K_APB) { + /* Remap address to low 4K memory */ + writel(offset >> 12, cec->regs_sec + 8); + writel(val, (offset & 0xfff) + cec->regs_base); + } else if (cec->bus_type == BUS_TYPE_NORMAL_SAPB) + writel(val, cec->regs_sec + offset); + else + writel(val, cec->regs_base + offset); + + mutex_unlock(cec->iolock); +} + +static u32 mhdp_get_fw_clk(struct cdns_mhdp_cec *cec) +{ + return mhdp_cec_read(cec, SW_CLK_H); } static void mhdp_cec_clear_rx_buffer(struct cdns_mhdp_cec *cec) @@ -94,12 +127,10 @@ static void mhdp_cec_clear_rx_buffer(struct cdns_mhdp_cec *cec) static void mhdp_cec_set_divider(struct cdns_mhdp_cec *cec) { - struct cdns_mhdp_device *mhdp = - container_of(cec, struct cdns_mhdp_device, hdmi.cec); u32 clk_div; /* Set clock divider */ - clk_div = cdns_mhdp_get_fw_clk(mhdp) * 10; + clk_div = mhdp_get_fw_clk(cec) * 10; mhdp_cec_write(cec, CLK_DIV_MSB, (clk_div >> 8) & 0xFF); @@ -291,10 +322,8 @@ static const struct cec_adap_ops cdns_mhdp_cec_adap_ops = { .adap_transmit = mhdp_cec_adap_transmit, }; -int cdns_mhdp_register_cec_driver(struct device *dev) +int cdns_mhdp_register_cec_driver(struct cdns_mhdp_cec *cec) { - struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); - struct cdns_mhdp_cec *cec = &mhdp->hdmi.cec; int ret; cec->adap = cec_allocate_adapter(&cdns_mhdp_cec_adap_ops, cec, @@ -305,29 +334,24 @@ int cdns_mhdp_register_cec_driver(struct device *dev) ret = PTR_ERR_OR_ZERO(cec->adap); if (ret) return ret; - ret = cec_register_adapter(cec->adap, dev); + ret = cec_register_adapter(cec->adap, cec->dev); if (ret) { cec_delete_adapter(cec->adap); return ret; } - cec->dev = dev; - cec->cec_worker = kthread_create(mhdp_cec_poll_worker, cec, "cdns-mhdp-cec"); if (IS_ERR(cec->cec_worker)) dev_err(cec->dev, "failed create hdp cec thread\n"); wake_up_process(cec->cec_worker); - dev_dbg(dev, "CEC successfuly probed\n"); + dev_dbg(cec->dev, "CEC successfuly probed\n"); return 0; } -int cdns_mhdp_unregister_cec_driver(struct device *dev) +int cdns_mhdp_unregister_cec_driver(struct cdns_mhdp_cec *cec) { - struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); - struct cdns_mhdp_cec *cec = &mhdp->hdmi.cec; - if (cec->cec_worker) { kthread_stop(cec->cec_worker); cec->cec_worker = NULL; diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c index 2043016f176b..ff37cc4e57e6 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c @@ -99,12 +99,6 @@ void cdns_mhdp_bus_write(u32 val, struct cdns_mhdp_device *mhdp, u32 offset) } EXPORT_SYMBOL(cdns_mhdp_bus_write); -u32 cdns_mhdp_get_fw_clk(struct cdns_mhdp_device *mhdp) -{ - return cdns_mhdp_bus_read(mhdp, SW_CLK_H); -} -EXPORT_SYMBOL(cdns_mhdp_get_fw_clk); - void cdns_mhdp_set_fw_clk(struct cdns_mhdp_device *mhdp, unsigned long clk) { cdns_mhdp_bus_write(clk / 1000000, mhdp, SW_CLK_H); diff --git a/include/drm/bridge/cdns-mhdp.h b/include/drm/bridge/cdns-mhdp.h index 6bfd82a3d9a2..338fa55b8bdf 100644 --- a/include/drm/bridge/cdns-mhdp.h +++ b/include/drm/bridge/cdns-mhdp.h @@ -509,6 +509,7 @@ enum { BUS_TYPE_NORMAL_SAPB = 1, BUS_TYPE_LOW4K_APB = 2, BUS_TYPE_LOW4K_SAPB = 3, + BUS_TYPE_LOW4K_HDMI_RX = 4, }; enum voltage_swing_level { @@ -623,12 +624,15 @@ struct cdns_mhdp_connector { }; struct cdns_mhdp_cec { - struct cec_adapter *adap; - struct device *dev; - struct mutex lock; + struct cec_adapter *adap; + struct device *dev; + struct mutex *iolock; + void __iomem *regs_base; + void __iomem *regs_sec; + int bus_type; - struct cec_msg msg; - struct task_struct *cec_worker; + struct cec_msg msg; + struct task_struct *cec_worker; }; struct cdns_plat_data { @@ -724,7 +728,6 @@ u32 cdns_mhdp_bus_read(struct cdns_mhdp_device *mhdp, u32 offset); void cdns_mhdp_bus_write(u32 val, struct cdns_mhdp_device *mhdp, u32 offset); void cdns_mhdp_clock_reset(struct cdns_mhdp_device *mhdp); void cdns_mhdp_set_fw_clk(struct cdns_mhdp_device *mhdp, unsigned long clk); -u32 cdns_mhdp_get_fw_clk(struct cdns_mhdp_device *mhdp); int cdns_mhdp_load_firmware(struct cdns_mhdp_device *mhdp, const u32 *i_mem, u32 i_size, const u32 *d_mem, u32 d_size); int cdns_mhdp_set_firmware_active(struct cdns_mhdp_device *mhdp, bool enable); @@ -805,8 +808,8 @@ int cdns_hdmi_set_plugged_cb(struct cdns_mhdp_device *mhdp, hdmi_codec_plugged_c /* CEC */ #ifdef CONFIG_DRM_CDNS_HDMI_CEC -int cdns_mhdp_register_cec_driver(struct device *dev); -int cdns_mhdp_unregister_cec_driver(struct device *dev); +int cdns_mhdp_register_cec_driver(struct cdns_mhdp_cec *cec); +int cdns_mhdp_unregister_cec_driver(struct cdns_mhdp_cec *cec); #endif #endif /* CDNS_MHDP_H_ */ -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0018-MLK-25199-3-drm-bridge-mhdp_common-add-apb-config-fu.patch ================================================ From 0021b4b1afc0d88c013e2484009004b19bc2ece4 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Wed, 30 Dec 2020 16:04:20 +0800 Subject: [PATCH 18/49] MLK-25199-3: drm: bridge: mhdp_common: add apb config function Add apb config function, move mhdp poll function to mhdp head file, they will be used by hdcp driver. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> --- .../gpu/drm/bridge/cadence/cdns-mhdp-common.c | 54 ++++++++++--------- drivers/gpu/drm/bridge/cadence/cdns-mhdp.h | 25 ++++++++- 2 files changed, 54 insertions(+), 25 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c index ff37cc4e57e6..2a8ab0872f25 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c @@ -27,31 +27,10 @@ #include <drm/drm_print.h> #include <linux/regmap.h> +#include "cdns-mhdp.h" + #define CDNS_DP_SPDIF_CLK 200000000 #define FW_ALIVE_TIMEOUT_US 1000000 -#define MAILBOX_RETRY_US 1000 -#define MAILBOX_TIMEOUT_US 5000000 - -#define mhdp_readx_poll_timeout(op, addr, offset, val, cond, sleep_us, timeout_us) \ -({ \ - u64 __timeout_us = (timeout_us); \ - unsigned long __sleep_us = (sleep_us); \ - ktime_t __timeout = ktime_add_us(ktime_get(), __timeout_us); \ - might_sleep_if((__sleep_us) != 0); \ - for (;;) { \ - (val) = op(addr, offset); \ - if (cond) \ - break; \ - if (__timeout_us && \ - ktime_compare(ktime_get(), __timeout) > 0) { \ - (val) = op(addr, offset); \ - break; \ - } \ - if (__sleep_us) \ - usleep_range((__sleep_us >> 2) + 1, __sleep_us); \ - } \ - (cond) ? 0 : -ETIMEDOUT; \ -}) u32 cdns_mhdp_bus_read(struct cdns_mhdp_device *mhdp, u32 offset) { @@ -174,7 +153,7 @@ bool cdns_mhdp_check_alive(struct cdns_mhdp_device *mhdp) } EXPORT_SYMBOL(cdns_mhdp_check_alive); -static int mhdp_mailbox_read(struct cdns_mhdp_device *mhdp) +int mhdp_mailbox_read(struct cdns_mhdp_device *mhdp) { int val, ret; @@ -432,6 +411,33 @@ int cdns_mhdp_set_firmware_active(struct cdns_mhdp_device *mhdp, bool enable) } EXPORT_SYMBOL(cdns_mhdp_set_firmware_active); +int cdns_mhdp_apb_conf(struct cdns_mhdp_device *mhdp, u8 sel) +{ + u8 status; + int ret; + + ret = cdns_mhdp_mailbox_send(mhdp, MB_MODULE_ID_GENERAL, GENERAL_BUS_SETTINGS, + sizeof(sel), &sel); + if (ret) + goto err_apb_conf; + + ret = cdns_mhdp_mailbox_validate_receive(mhdp, MB_MODULE_ID_GENERAL, + GENERAL_BUS_SETTINGS, sizeof(status)); + if (ret) + goto err_apb_conf; + + ret = cdns_mhdp_mailbox_read_receive(mhdp, &status, sizeof(status)); + if (ret) + goto err_apb_conf; + + return status; + +err_apb_conf: + DRM_ERROR("apb conf failed: %d\n", ret); + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_apb_conf); + int cdns_mhdp_set_host_cap(struct cdns_mhdp_device *mhdp) { u8 msg[8]; diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp.h b/drivers/gpu/drm/bridge/cadence/cdns-mhdp.h index 399c3f6f86ad..8ad99eb8f86e 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp.h +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp.h @@ -174,7 +174,6 @@ #define CDNS_DP_MTPH_STATUS 0x226C #define CDNS_DP_MTPH_ACT_STATUS BIT(0) - #define CDNS_DPTX_GLOBAL 0x02300 #define CDNS_DP_LANE_EN (CDNS_DPTX_GLOBAL + 0x00) #define CDNS_DP_LANE_EN_LANES(x) GENMASK(x - 1, 0) @@ -187,6 +186,30 @@ #define CDNS_MHDP_MAX_STREAMS 4 +#define MAILBOX_RETRY_US 1000 +#define MAILBOX_TIMEOUT_US 5000000 + +#define mhdp_readx_poll_timeout(op, addr, offset, val, cond, sleep_us, timeout_us) \ +({ \ + u64 __timeout_us = (timeout_us); \ + unsigned long __sleep_us = (sleep_us); \ + ktime_t __timeout = ktime_add_us(ktime_get(), __timeout_us); \ + might_sleep_if((__sleep_us) != 0); \ + for (;;) { \ + (val) = op(addr, offset); \ + if (cond) \ + break; \ + if (__timeout_us && \ + ktime_compare(ktime_get(), __timeout) > 0) { \ + (val) = op(addr, offset); \ + break; \ + } \ + if (__sleep_us) \ + usleep_range((__sleep_us >> 2) + 1, __sleep_us); \ + } \ + (cond) ? 0 : -ETIMEDOUT; \ +}) + enum pixel_format { PIXEL_FORMAT_RGB = 1, PIXEL_FORMAT_YCBCR_444 = 2, -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0019-MLK-25199-4-drm-bridge-mhdp_hdmi-set-clear-avmute-bi.patch ================================================ From 1793e95601a15f93e5d9e2846281f86eb19e8fe4 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Wed, 30 Dec 2020 16:05:29 +0800 Subject: [PATCH 19/49] MLK-25199-4: drm: bridge: mhdp_hdmi: set clear avmute bit Sync HDMI TX configuation with 4.14 hdmi driver. Clear avmute bit must be set otherwise imx8qm hdcp not work. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c index c37a7ac6af9b..3ff43f7fb0a6 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 NXP Semiconductor, Inc. + * Copyright (C) 2019-2021 NXP Semiconductor, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -205,7 +205,7 @@ int cdns_hdmi_ctrl_init(struct cdns_mhdp_device *mhdp, /* set hdmi mode and preemble mode data enable */ val = F_HDMI_MODE(protocol) | F_HDMI2_PREAMBLE_EN(1) | F_DATA_EN(1) | - F_HDMI2_CTRL_IL_MODE(1) | F_BCH_EN(1) | F_PIC_3D(0XF); + F_HDMI2_CTRL_IL_MODE(1) | F_BCH_EN(1) | F_PIC_3D(0XF) | F_CLEAR_AVMUTE(1); ret = cdns_mhdp_reg_write(mhdp, HDTX_CONTROLLER, val); return ret; -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0020-MLK-25199-5-drm-bridge-mhdp_hdcp-add-HDMI-TX-HDCP-dr.patch ================================================ From 9d940175bbffc82b5ec70b195312c6f32b35f51f Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Wed, 30 Dec 2020 16:07:41 +0800 Subject: [PATCH 20/49] MLK-25199-5: drm: bridge: mhdp_hdcp: add HDMI TX HDCP driver This patch adds an initial HDMI TX HDCP driver for Cadence MHDP HDMI TX hardware. Both HDCP2.2 and HDCP1.4 are supported. HDCP function could be enabled by command: modetest -w CONNECTOR_ID:"Content Protection":1 Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> --- drivers/gpu/drm/bridge/cadence/Kconfig | 4 + drivers/gpu/drm/bridge/cadence/Makefile | 1 + .../gpu/drm/bridge/cadence/cdns-hdmi-core.c | 190 ++- .../gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c | 1167 +++++++++++++++++ .../gpu/drm/bridge/cadence/cdns-mhdp-hdcp.c | 300 +++++ .../gpu/drm/bridge/cadence/cdns-mhdp-hdcp.h | 36 + include/drm/bridge/cdns-mhdp.h | 92 +- 7 files changed, 1776 insertions(+), 14 deletions(-) create mode 100644 drivers/gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c create mode 100644 drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdcp.c create mode 100644 drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdcp.h diff --git a/drivers/gpu/drm/bridge/cadence/Kconfig b/drivers/gpu/drm/bridge/cadence/Kconfig index c271ab24a99a..4c27836eb367 100644 --- a/drivers/gpu/drm/bridge/cadence/Kconfig +++ b/drivers/gpu/drm/bridge/cadence/Kconfig @@ -43,6 +43,11 @@ config DRM_CDNS_AUDIO tristate "Cadence MHDP Audio driver" depends on DRM_CDNS_MHDP +config DRM_CDNS_HDMI_HDCP + tristate "Cadence MHDP HDMI HDCP driver" + depends on DRM_CDNS_HDMI + select DRM_DISPLAY_HDCP_HELPER + config DRM_CDNS_HDMI_CEC tristate "Cadence MHDP HDMI CEC driver" select CEC_CORE diff --git a/drivers/gpu/drm/bridge/cadence/Makefile b/drivers/gpu/drm/bridge/cadence/Makefile index 618290870ba5..1b824252ae76 100644 --- a/drivers/gpu/drm/bridge/cadence/Makefile +++ b/drivers/gpu/drm/bridge/cadence/Makefile @@ -8,6 +8,7 @@ cdns_mhdp_drmcore-y := cdns-mhdp-common.o cdns-mhdp-dp.o cdns-mhdp-hdmi.o cdns_mhdp_drmcore-$(CONFIG_DRM_CDNS_HDMI) += cdns-hdmi-core.o cdns_mhdp_drmcore-$(CONFIG_DRM_CDNS_DP) += cdns-dp-core.o cdns_mhdp_drmcore-$(CONFIG_DRM_CDNS_AUDIO) += cdns-mhdp-audio.o +cdns_mhdp_drmcore-$(CONFIG_DRM_CDNS_HDMI_HDCP) += cdns-mhdp-hdcp.o cdns-hdmi-hdcp.o cdns_mhdp_drmcore-$(CONFIG_DRM_CDNS_HDMI_CEC) += cdns-mhdp-cec.o obj-$(CONFIG_DRM_CDNS_MHDP) += cdns_mhdp_drmcore.o diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c index 84c175997740..dc393f6b75e7 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c @@ -1,7 +1,7 @@ /* * Cadence High-Definition Multimedia Interface (HDMI) driver * - * Copyright (C) 2019-2020 NXP Semiconductor, Inc. + * Copyright (C) 2019-2021 NXP Semiconductor, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -13,6 +13,7 @@ #include <drm/drm_atomic_helper.h> #include <drm/drm_edid.h> #include <drm/drm_encoder_slave.h> +#include <drm/display/drm_hdcp.h> #include <drm/drm_of.h> #include <drm/drm_probe_helper.h> #include <drm/drm_print.h> @@ -27,6 +28,131 @@ #include <linux/mutex.h> #include <linux/of_device.h> +#include "cdns-mhdp-hdcp.h" + +static ssize_t HDCPTX_do_reauth_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count); +static struct device_attribute HDCPTX_do_reauth = __ATTR_WO(HDCPTX_do_reauth); + +static ssize_t HDCPTX_do_reauth_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int value, ret; + struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); + + ret = cdns_mhdp_hdcp_tx_reauth(mhdp, 1); + + sscanf(buf, "%d", &value); + + if (ret < 0) { + dev_err(dev, "%s cdns_mhdp_hdcp_tx_reauth failed\n", __func__); + return -1; + } + return count; +} + +static ssize_t HDCPTX_Version_show(struct device *dev, + struct device_attribute *attr, char *buf); +static ssize_t HDCPTX_Version_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count); +static struct device_attribute HDCPTX_Version = __ATTR_RW(HDCPTX_Version); + +static ssize_t HDCPTX_Version_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); + int value; + + sscanf(buf, "%d", &value); + if (value == 2) + mhdp->hdcp.config = 2; + else if (value == 1) + mhdp->hdcp.config = 1; + else if (value == 3) + mhdp->hdcp.config = 3; + else + mhdp->hdcp.config = 0; + + return count; +} + +ssize_t HDCPTX_Version_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); + return sprintf(buf, "%d\n", mhdp->hdcp.config); +} + +static ssize_t HDCPTX_Status_show(struct device *dev, + struct device_attribute *attr, char *buf); +static ssize_t HDCPTX_Status_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count); +static struct device_attribute HDCPTX_Status = __ATTR_RW(HDCPTX_Status); + +ssize_t HDCPTX_Status_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); + + switch (mhdp->hdcp.state) { + case HDCP_STATE_NO_AKSV: + return sprintf(buf, "%d :HDCP_STATE_NO_AKSV \n", mhdp->hdcp.state); + case HDCP_STATE_INACTIVE: + return sprintf(buf, "%d :HDCP_STATE_INACTIVE \n", mhdp->hdcp.state); + case HDCP_STATE_ENABLING: + return sprintf(buf, "%d :HDCP_STATE_ENABLING \n", mhdp->hdcp.state); + case HDCP_STATE_AUTHENTICATING: + return sprintf(buf, "%d :HDCP_STATE_AUTHENTICATING \n", mhdp->hdcp.state); + case HDCP_STATE_AUTHENTICATED: + return sprintf(buf, "%d :HDCP_STATE_AUTHENTICATED \n", mhdp->hdcp.state); + case HDCP_STATE_DISABLING: + return sprintf(buf, "%d :HDCP_STATE_DISABLING \n", mhdp->hdcp.state); + case HDCP_STATE_AUTH_FAILED: + return sprintf(buf, "%d :HDCP_STATE_AUTH_FAILED \n", mhdp->hdcp.state); + default: + return sprintf(buf, "%d :HDCP_STATE don't exist \n", mhdp->hdcp.state); + } +} + +ssize_t HDCPTX_Status_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); + int value; + + if (count == 2) { + sscanf(buf, "%d", &value); + if ((value >= HDCP_STATE_NO_AKSV) && (value <= HDCP_STATE_AUTH_FAILED)) { + mhdp->hdcp.state = value; + return count; + } else { + dev_err(dev, "%s &hdp->state invalid\n", __func__); + return -1; + } + } + + dev_info(dev, "%s &hdp->state desired %s count=%d\n ", __func__, buf, (int)count); + + if (strncmp(buf, "HDCP_STATE_NO_AKSV", count - 1) == 0) + mhdp->hdcp.state = HDCP_STATE_NO_AKSV; + else if (strncmp(buf, "HDCP_STATE_INACTIVE", count - 1) == 0) + mhdp->hdcp.state = HDCP_STATE_INACTIVE; + else if (strncmp(buf, "HDCP_STATE_ENABLING", count - 1) == 0) + mhdp->hdcp.state = HDCP_STATE_ENABLING; + else if (strncmp(buf, "HDCP_STATE_AUTHENTICATING", count - 1) == 0) + mhdp->hdcp.state = HDCP_STATE_AUTHENTICATING; + else if (strncmp(buf, "HDCP_STATE_AUTHENTICATED", count - 1) == 0) + mhdp->hdcp.state = HDCP_STATE_AUTHENTICATED; + else if (strncmp(buf, "HDCP_STATE_DISABLING", count - 1) == 0) + mhdp->hdcp.state = HDCP_STATE_DISABLING; + else if (strncmp(buf, "HDCP_STATE_AUTH_FAILED", count - 1) == 0) + mhdp->hdcp.state = HDCP_STATE_AUTH_FAILED; + else + dev_err(dev, "%s &hdp->state invalid\n", __func__); + return -1; + return count; +} + static void hdmi_sink_config(struct cdns_mhdp_device *mhdp) { struct drm_scdc *scdc = &mhdp->connector.base.display_info.hdmi.scdc; @@ -319,6 +445,22 @@ static bool blob_equal(const struct drm_property_blob *a, return !a == !b; } +static void cdns_hdmi_bridge_disable(struct drm_bridge *bridge) +{ + struct cdns_mhdp_device *mhdp = bridge->driver_private; + + cdns_hdmi_hdcp_disable(mhdp); +} + +static void cdns_hdmi_bridge_enable(struct drm_bridge *bridge) +{ + struct cdns_mhdp_device *mhdp = bridge->driver_private; + struct drm_connector_state *conn_state = mhdp->connector.base.state; + + if (conn_state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED) + cdns_hdmi_hdcp_enable(mhdp); +} + static int cdns_hdmi_connector_atomic_check(struct drm_connector *connector, struct drm_atomic_state *state) { @@ -329,12 +471,17 @@ static int cdns_hdmi_connector_atomic_check(struct drm_connector *connector, struct drm_crtc *crtc = new_con_state->crtc; struct drm_crtc_state *new_crtc_state; + cdns_hdmi_hdcp_atomic_check(connector, old_con_state, new_con_state); + if (!new_con_state->crtc) + return 0; + + new_crtc_state = drm_atomic_get_crtc_state(state, crtc); + if (IS_ERR(new_crtc_state)) + return PTR_ERR(new_crtc_state); + if (!blob_equal(new_con_state->hdr_output_metadata, old_con_state->hdr_output_metadata) || new_con_state->colorspace != old_con_state->colorspace) { - new_crtc_state = drm_atomic_get_crtc_state(state, crtc); - if (IS_ERR(new_crtc_state)) - return PTR_ERR(new_crtc_state); new_crtc_state->mode_changed = !new_con_state->hdr_output_metadata || @@ -342,6 +489,15 @@ static int cdns_hdmi_connector_atomic_check(struct drm_connector *connector, new_con_state->colorspace != old_con_state->colorspace; } + /* + * These properties are handled by fastset, and might not end up in a + * modeset. + */ + if (new_con_state->picture_aspect_ratio != + old_con_state->picture_aspect_ratio || + new_con_state->content_type != old_con_state->content_type || + new_con_state->scaling_mode != old_con_state->scaling_mode) + new_crtc_state->mode_changed = true; return 0; } @@ -388,6 +544,7 @@ static int cdns_hdmi_bridge_attach(struct drm_bridge *bridge, drm_connector_attach_encoder(connector, encoder); + drm_connector_attach_content_protection_property(connector, true); return 0; } @@ -439,7 +596,7 @@ static void cdns_hdmi_bridge_mode_set(struct drm_bridge *bridge, video->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC); video->h_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NHSYNC); - DRM_INFO("Mode: %dx%dp%d\n", mode->hdisplay, mode->vdisplay, mode->clock); + DRM_INFO("Mode: %dx%dp%d\n", mode->hdisplay, mode->vdisplay, mode->clock); memcpy(&mhdp->mode, mode, sizeof(struct drm_display_mode)); mutex_lock(&mhdp->lock); @@ -518,6 +675,8 @@ bool cdns_hdmi_bridge_mode_fixup(struct drm_bridge *bridge, static const struct drm_bridge_funcs cdns_hdmi_bridge_funcs = { .attach = cdns_hdmi_bridge_attach, + .enable = cdns_hdmi_bridge_enable, + .disable = cdns_hdmi_bridge_disable, .mode_set = cdns_hdmi_bridge_mode_set, .mode_valid = cdns_hdmi_bridge_mode_valid, .mode_fixup = cdns_hdmi_bridge_mode_fixup, @@ -645,7 +804,7 @@ static int __cdns_hdmi_probe(struct platform_device *pdev, mhdp->irq[IRQ_IN]); return -EINVAL; } - + irq_set_status_flags(mhdp->irq[IRQ_OUT], IRQ_NOAUTOEN); ret = devm_request_threaded_irq(dev, mhdp->irq[IRQ_OUT], NULL, cdns_hdmi_irq_thread, @@ -659,6 +818,25 @@ static int __cdns_hdmi_probe(struct platform_device *pdev, cdns_hdmi_parse_dt(mhdp); + ret = cdns_hdmi_hdcp_init(mhdp, pdev->dev.of_node); + if (ret < 0) + DRM_WARN("Failed to initialize HDCP\n"); + + if (device_create_file(mhdp->dev, &HDCPTX_do_reauth)) { + printk(KERN_ERR "Unable to create HDCPTX_do_reauth sysfs\n"); + device_remove_file(mhdp->dev, &HDCPTX_do_reauth); + } + + if (device_create_file(mhdp->dev, &HDCPTX_Version)) { + printk(KERN_ERR "Unable to create HDCPTX_Version sysfs\n"); + device_remove_file(mhdp->dev, &HDCPTX_Version); + } + + if (device_create_file(mhdp->dev, &HDCPTX_Status)) { + printk(KERN_ERR "Unable to create HDCPTX_Status sysfs\n"); + device_remove_file(mhdp->dev, &HDCPTX_Status); + } + if (cdns_mhdp_read_hpd(mhdp)) enable_irq(mhdp->irq[IRQ_OUT]); else diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c new file mode 100644 index 000000000000..e2a3bc7fb42b --- /dev/null +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c @@ -0,0 +1,1167 @@ +/* + * Cadence HDMI HDCP driver + * + * Copyright (C) 2021 NXP Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + */ +#include <drm/bridge/cdns-mhdp.h> +#include <drm/display/drm_hdcp.h> +#include <drm/drm_print.h> +#include <linux/firmware.h> + +#include "cdns-mhdp-hdcp.h" + +/* Default will be to use KM unless it has been explicitly */ +#ifndef HDCP_USE_KMKEY + #define HDCP_USE_KMKEY 1 +#endif + +#define CDNS_HDCP_ACTIVATE (0x1 << 2) + +#define IMX_FW_TIMEOUT_MS (64 * 1000) +#define IMX_HDCP_PAIRING_FIRMWARE "imx/hdcp-pairing.bin" + +#define GENERAL_BUS_SETTINGS_DPCD_BUS_BIT 0 +#define GENERAL_BUS_SETTINGS_DPCD_BUS_LOCK_BIT 1 +#define GENERAL_BUS_SETTINGS_HDCP_BUS_BIT 2 +#define GENERAL_BUS_SETTINGS_HDCP_BUS_LOCK_BIT 3 +#define GENERAL_BUS_SETTINGS_CAPB_OWNER_BIT 4 +#define GENERAL_BUS_SETTINGS_CAPB_OWNER_LOCK_BIT 5 + +#define GENERAL_BUS_SETTINGS_RESP_DPCD_BUS_BIT 0 +#define GENERAL_BUS_SETTINGS_RESP_HDCP_BUS_BIT 1 +#define GENERAL_BUS_SETTINGS_RESP_CAPB_OWNER_BIT 2 + +/* HDCP TX ports working mode (HDCP 2.2 or 1.4) */ +enum { + HDCP_TX_2, /* lock only with HDCP2 */ + HDCP_TX_1, /* lock only with HDCP1 */ + HDCP_TX_BOTH, /* lock on HDCP2 or 1 depend on other side */ +}; + +/* HDCP TX ports stream type (relevant if receiver is repeater) */ +enum { + HDCP_CONTENT_TYPE_0, /* May be transmitted by + The HDCP Repeater to all HDCP Devices. */ + HDCP_CONTENT_TYPE_1, /* Must not be transmitted by the HDCP Repeater to + HDCP 1.x-compliant Devices and HDCP 2.0-compliant Repeaters */ +}; + +/* different error types for HDCP_TX_STATUS_CHANGE */ +enum { + HDCP_TRAN_ERR_NO_ERROR, + HDCP_TRAN_ERR_HPD_IS_DOWN, + HDCP_TRAN_ERR_SRM_FAILURE, + HDCP_TRAN_ERR_SIGNATURE_VERIFICATION, + HDCP_TRAN_ERR_H_TAG_DIFF_H, + HDCP_TRAN_ERR_V_TAG_DIFF_V, + HDCP_TRAN_ERR_LOCALITY_CHECK, + HDCP_TRAN_ERR_DDC, + HDCP_TRAN_ERR_REAUTH_REQ, + HDCP_TRAN_ERR_TOPOLOGY, + HDCP_TRAN_ERR_HDCP_RSVD1, + HDCP_TRAN_ERR_HDMI_CAPABILITY, + HDCP_TRAN_ERR_RI, + HDCP_TRAN_ERR_WATCHDOG_EXPIRED, +}; + +static char const *g_last_error[16] = { + "No Error", + "HPD is down", + "SRM failure", + "Signature verification error", + "h tag != h", + "V tag diff v", + "Locality check", + "DDC error", + "REAUTH_REQ", + "Topology error", + "Verify receiver ID list failed", + "HDCP_RSVD1 was not 0,0,0", + "HDMI capability or mode", + "RI result was different than expected", + "WatchDog expired", + "Repeater integrity failed" +}; + +#define HDCP_MAX_RECEIVERS 32 +#define HDCP_RECEIVER_ID_SIZE_BYTES 5 +#define HPD_EVENT 1 +#define HDCP_STATUS_SIZE 0x5 +#define HDCP_PORT_STS_AUTH 0x1 +#define HDCP_PORT_STS_REPEATER 0x2 +#define HDCP_PORT_STS_TYPE_MASK 0xc +#define HDCP_PORT_STS_TYPE_SHIFT 0x2 +#define HDCP_PORT_STS_AUTH_STREAM_ID_SHIFT 0x4 +#define HDCP_PORT_STS_AUTH_STREAM_ID_MASK 0x10 +#define HDCP_PORT_STS_LAST_ERR_SHIFT 0x5 +#define HDCP_PORT_STS_LAST_ERR_MASK (0x0F << 5) +#define GET_HDCP_PORT_STS_LAST_ERR(__sts__) \ + (((__sts__) & HDCP_PORT_STS_LAST_ERR_MASK) >> \ + HDCP_PORT_STS_LAST_ERR_SHIFT) +#define HDCP_PORT_STS_1_1_FEATURES 0x200 + +#define HDCP_CONFIG_NONE ((u8) 0) +#define HDCP_CONFIG_1_4 ((u8) 1) /* use HDCP 1.4 only */ +#define HDCP_CONFIG_2_2 ((u8) 2) /* use HDCP 2.2 only */ + +/* Default timeout to use for wait4event in milliseconds */ +#define HDCP_EVENT_TO_DEF 800 +/* Timeout value to use for repeater receiver ID check, spec says 3s */ +#define HDCP_EVENT_TO_RPT 3500 + +static int hdmi_hdcp_check_link(struct cdns_mhdp_device *mhdp); + +static void print_port_status(u16 sts) +{ + char const *rx_type[4] = { "Unknown", "HDCP 1", "HDCP 2", "Unknown" }; + + DRM_DEBUG_KMS("INFO: HDCP Port Status: 0x%04x\n", sts); + DRM_DEBUG_KMS(" Authenticated: %d\n", sts & HDCP_PORT_STS_AUTH); + DRM_DEBUG_KMS(" Receiver is repeater: %d\n", sts & HDCP_PORT_STS_REPEATER); + DRM_DEBUG_KMS(" RX Type: %s\n", + rx_type[(sts & HDCP_PORT_STS_TYPE_MASK) >> HDCP_PORT_STS_TYPE_SHIFT]); + DRM_DEBUG_KMS(" AuthStreamId: %d\n", sts & HDCP_PORT_STS_AUTH_STREAM_ID_MASK); + DRM_DEBUG_KMS(" Last Error: %s\n", + g_last_error[(sts & HDCP_PORT_STS_LAST_ERR_MASK) >> HDCP_PORT_STS_LAST_ERR_SHIFT]); + DRM_DEBUG_KMS(" Enable 1.1 Features: %d\n", sts & HDCP_PORT_STS_1_1_FEATURES); +} + +static void print_events(u8 events) +{ + if (events & HDMI_TX_HPD_EVENT) + DRM_INFO("INFO: HDMI_TX_HPD_EVENT\n"); + if (events & HDCPTX_STATUS_EVENT) + DRM_INFO("INFO: HDCPTX_STATUS_EVENT\n"); + if (events & HDCPTX_IS_KM_STORED_EVENT) + DRM_INFO("INFO: HDCPTX_IS_KM_STORED_EVENT\n"); + if (events & HDCPTX_STORE_KM_EVENT) + DRM_INFO("INFO: HDCPTX_STORE_KM_EVENT\n"); + if (events & HDCPTX_IS_RECEIVER_ID_VALID_EVENT) + DRM_INFO("INFO: HDCPTX_IS_RECEIVER_ID_VALID_EVENT\n"); +} + +static u8 wait4event(struct cdns_mhdp_device *mhdp, u8 *events, + u32 event_to_wait, u32 timeout_ms) +{ + u8 reg_events; + u8 returned_events; + u8 event_mask = event_to_wait | HDCPTX_STATUS_EVENT; + unsigned timeout; + + timeout = timeout_ms; + do { + if (timeout == 0) + goto timeout_err; + timeout--; + udelay(1000); + reg_events = cdns_mhdp_get_event(mhdp); + *events |= reg_events; + } while (((event_mask & *events) == 0) && (event_to_wait > HDMI_TX_HPD_EVENT)); + + returned_events = *events & event_mask; + if (*events != returned_events) { + u32 unexpected_events = ~event_mask & *events; + + DRM_INFO("INFO: %s() all 0x%08x expected 0x%08x unexpected 0x%08x", + __func__, *events, returned_events, unexpected_events); + DRM_INFO("INFO: %s() All events:\n", __func__); + print_events(*events); + + DRM_INFO("INFO: %s() expected events:\n", __func__); + print_events(returned_events); + + DRM_INFO("INFO: %s() unexpected events:\n", __func__); + print_events(unexpected_events); + } else + print_events(*events); + + *events &= ~event_mask; + + return returned_events; + +timeout_err: + DRM_INFO("INFO: %s() Timed out with events:\n", __func__); + print_events(event_to_wait); + return 0; +} + +static u16 hdmi_hdcp_get_status(struct cdns_mhdp_device *mhdp) +{ + u8 hdcp_status[HDCP_STATUS_SIZE]; + u16 hdcp_port_status; + + cdns_mhdp_hdcp_tx_status_req(mhdp, hdcp_status, HDCP_STATUS_SIZE); + hdcp_port_status = (hdcp_status[0] << 8) | hdcp_status[1]; + + return hdcp_port_status; +} + +static inline u8 check_event(u8 events, u8 tested) +{ + if ((events & tested) == 0) + return 0; + return 1; +} + +/* Prints status. Returns error code (0 = no error) */ +static u8 hdmi_hdcp_handle_status(u16 status) +{ + print_port_status(status); + if (status & HDCP_PORT_STS_LAST_ERR_MASK) + DRM_ERROR("ERROR: HDCP error was set to %s\n", + g_last_error[((status & HDCP_PORT_STS_LAST_ERR_MASK) + >> HDCP_PORT_STS_LAST_ERR_SHIFT)]); + return GET_HDCP_PORT_STS_LAST_ERR(status); +} + +static int hdmi_hdcp_set_config(struct cdns_mhdp_device *mhdp, u8 hdcp_config) +{ + u8 bus_config, retEvents; + u16 hdcp_port_status; + int ret; + + /* Clearing out existing events */ + wait4event(mhdp, &mhdp->hdcp.events, HDMI_TX_HPD_EVENT, HDCP_EVENT_TO_DEF); + mhdp->hdcp.events = 0; + + if (!strncmp("imx8mq-hdmi", mhdp->plat_data->plat_name, 11)) { + DRM_DEBUG_KMS("INFO: Switching HDCP Commands to SAPB.\n"); + bus_config = (1 << GENERAL_BUS_SETTINGS_HDCP_BUS_BIT); + ret = cdns_mhdp_apb_conf(mhdp, bus_config); + if (ret) { + DRM_ERROR("Failed to set APB configuration.\n"); + if (ret & (1 << GENERAL_BUS_SETTINGS_RESP_HDCP_BUS_BIT))/* 1 - locked */ + DRM_ERROR("Failed to switch HDCP to SAPB Mailbox\n"); + return -1; + } + DRM_DEBUG_KMS("INFO: HDCP switched to SAPB\n"); + } + + /* HDCP 2.2(and/or 1.4) | activate | km-key | 0 */ + hdcp_config |= CDNS_HDCP_ACTIVATE | (HDCP_USE_KMKEY << 4) | (HDCP_CONTENT_TYPE_0 << 3); + + DRM_DEBUG_KMS("INFO: Enabling HDCP...\n"); + ret = cdns_mhdp_hdcp_tx_config(mhdp, hdcp_config); + if (ret < 0) + DRM_DEBUG_KMS("cdns_mhdp_hdcp_tx_config failed\n"); + + /* Wait until HDCP_TX_STATUS EVENT appears */ + DRM_DEBUG_KMS("INFO: wait4event -> HDCPTX_STATUS_EVENT\n"); + retEvents = wait4event(mhdp, &mhdp->hdcp.events, HDCPTX_STATUS_EVENT, HDCP_EVENT_TO_DEF); + + /* Set TX STATUS REQUEST */ + DRM_DEBUG_KMS("INFO: Getting port status\n"); + hdcp_port_status = hdmi_hdcp_get_status(mhdp); + if (hdmi_hdcp_handle_status(hdcp_port_status) != 0) + return -1; + + return 0; +} + +static int hdmi_hdcp_auth_check(struct cdns_mhdp_device *mhdp) +{ + u16 hdcp_port_status; + int ret; + + DRM_DEBUG_KMS("INFO: wait4event -> HDCPTX_STATUS_EVENT\n"); + mhdp->hdcp.events = wait4event(mhdp, &mhdp->hdcp.events, HDCPTX_STATUS_EVENT, HDCP_EVENT_TO_DEF+HDCP_EVENT_TO_DEF); + if (mhdp->hdcp.events == 0) + return -1; + + DRM_DEBUG_KMS("HDCP: HDCPTX_STATUS_EVENT\n"); + hdcp_port_status = hdmi_hdcp_get_status(mhdp); + ret = hdmi_hdcp_handle_status(hdcp_port_status); + if (ret != 0) { + if (ret == HDCP_TRAN_ERR_REAUTH_REQ) { + DRM_ERROR("HDCP_TRAN_ERR_REAUTH_REQ-->one more try!\n"); + return 1; + } else + return -1; + } + + if (hdcp_port_status & HDCP_PORT_STS_AUTH) { + DRM_INFO("Authentication completed successfully!\n"); + /* Dump hdmi and phy register */ + mhdp->hdcp.state = HDCP_STATE_AUTHENTICATED; + return 0; + } + + DRM_WARN("Authentication failed\n"); + mhdp->hdcp.state = HDCP_STATE_AUTH_FAILED; + return -1; +} + +inline void hdmi_hdcp_swap_id(u8 *in, u8 *out) +{ + int i; + + for (i = 0; i < HDCP_RECEIVER_ID_SIZE_BYTES; i++) + out[HDCP_RECEIVER_ID_SIZE_BYTES - (i + 1)] = in[i]; +} + +inline void hdmi_hdcp_swap_list(u8 *list_in, u8 *list_out, int num_ids) +{ + int i; + + for (i = 0; i < num_ids; i++) + hdmi_hdcp_swap_id(&list_in[i * HDCP_RECEIVER_ID_SIZE_BYTES], + &list_out[i * HDCP_RECEIVER_ID_SIZE_BYTES]); +} + +static int hdmi_hdcp_check_receviers(struct cdns_mhdp_device *mhdp) +{ + u8 ret_events; + u8 hdcp_num_rec, i; + u8 hdcp_rec_id[HDCP_MAX_RECEIVERS][HDCP_RECEIVER_ID_SIZE_BYTES]; + u8 hdcp_rec_id_temp[HDCP_MAX_RECEIVERS][HDCP_RECEIVER_ID_SIZE_BYTES]; + u16 hdcp_port_status = 0; + int ret; + + DRM_INFO("INFO: Waiting for Receiver ID valid event\n"); + ret_events = 0; + do { + u8 events = 0; + u8 hdcp_last_error = 0; + events = check_event(ret_events, + HDCPTX_IS_RECEIVER_ID_VALID_EVENT); + DRM_DEBUG_KMS("INFO: Waiting HDCPTX_IS_RECEIVER_ID_VALID_EVENT\n"); + ret_events = wait4event(mhdp, &mhdp->hdcp.events, + HDCPTX_IS_RECEIVER_ID_VALID_EVENT, + (mhdp->hdcp.sink_is_repeater ? + HDCP_EVENT_TO_RPT : HDCP_EVENT_TO_DEF)); + if (ret_events == 0) { + /* time out occurred, return error */ + DRM_ERROR("HDCP error did not get receiver IDs\n"); + return -1; + } + if (check_event(ret_events, HDCPTX_STATUS_EVENT) != 0) { + /* There was a status update, could be due to HPD + going down or some other error, check if an error + was set, if so exit. + */ + hdcp_port_status = hdmi_hdcp_get_status(mhdp); + hdcp_last_error = GET_HDCP_PORT_STS_LAST_ERR(hdcp_port_status); + if (hdmi_hdcp_handle_status(hdcp_port_status)) { + DRM_ERROR("HDCP error no: %u\n", hdcp_last_error); + return -1; + } else { + /* No error logged, keep going. + * If this somehow happened at same time, then need to + * put the HDCPTX_STATUS_EVENT back into the global + * events pool and checked later. */ + mhdp->hdcp.events |= HDCPTX_STATUS_EVENT; + + /* Special condition when connected to HDCP 1.4 repeater + * with no downstream devices attached, then will not + * get receiver ID list but instead will reach + * authenticated state. */ + if ((mhdp->hdcp.hdcp_version == HDCP_TX_1) && (mhdp->hdcp.sink_is_repeater == 1) && + ((hdcp_port_status & HDCP_PORT_STS_AUTH) == HDCP_PORT_STS_AUTH)) { + DRM_INFO("Connected to HDCP 1.4 repeater with no downstream devices!\n"); + return 0; + } + + msleep(20); + } + } + } while (check_event(ret_events, + HDCPTX_IS_RECEIVER_ID_VALID_EVENT) == 0); + + DRM_INFO("INFO: Requesting Receivers ID's\n"); + + hdcp_num_rec = 0; + memset(&hdcp_rec_id, 0, sizeof(hdcp_rec_id)); + + ret = cdns_mhdp_hdcp_tx_is_receiver_id_valid(mhdp, (u8 *)hdcp_rec_id, &hdcp_num_rec); + if (ret) { + DRM_DEV_ERROR(mhdp->dev, "Failed to hdcp tx receiver ID.\n"); + return -1; + } + + if (hdcp_num_rec == 0) { + DRM_DEBUG_KMS("WARN: Failed to get receiver list\n"); + /* Unknown problem, return error */ + return -1; + } + + DRM_INFO("INFO: Number of Receivers: %d\n", hdcp_num_rec); + + for (i = 0; i < hdcp_num_rec; ++i) { + DRM_INFO("\tReveiver ID%2d: %.2X%.2X%.2X%.2X%.2X\n", + i, + hdcp_rec_id[i][0], + hdcp_rec_id[i][1], + hdcp_rec_id[i][2], + hdcp_rec_id[i][3], + hdcp_rec_id[i][4] + ); + } + + /* swap ids byte order */ + hdmi_hdcp_swap_list(&hdcp_rec_id[0][0], + &hdcp_rec_id_temp[0][0], hdcp_num_rec); + + /* Check Receiver ID's against revocation list in SRM */ + if (drm_hdcp_check_ksvs_revoked(mhdp->drm_dev, (u8 *)hdcp_rec_id_temp, hdcp_num_rec)) { + mhdp->hdcp.state = HDCP_STATE_AUTH_FAILED; + DRM_ERROR("INFO: Receiver check fails\n"); + return -1; + } + + ret = cdns_mhdp_hdcp_tx_respond_receiver_id_valid(mhdp, 1); + DRM_INFO("INFO: Responding with Receiver ID's OK!, ret=%d\n", ret); + return ret; +} + +#ifdef STORE_PAIRING +static int hdmi_hdcp_get_stored_pairing(struct cdns_mhdp_device *mhdp) +{ + int ret = 0; + unsigned long timeout = jiffies + msecs_to_jiffies(IMX_FW_TIMEOUT_MS); + unsigned long sleep = 1000; + const struct firmware *fw; + + DRM_DEBUG_KMS("%s()\n", __func__); + + while (time_before(jiffies, timeout)) { + ret = request_firmware(&fw, hdmi_hdcp_PAIRING_FIRMWARE, mhdp->dev); + if (ret == -ENOENT) { + msleep(sleep); + sleep *= 2; + continue; + } else if (ret) { + DRM_DEV_INFO(mhdp->dev, "HDCP pairing data not found\n"); + goto out; + } + + mhdp->hdcp.num_paired = fw->size / + sizeof(struct hdcp_trans_pairing_data); + if (mhdp->hdcp.num_paired > MAX_STORED_KM) { + /* todo: handle dropping */ + mhdp->hdcp.num_paired = MAX_STORED_KM; + DRM_DEV_INFO(mhdp->dev, + "too many paired receivers - dropping older entries\n"); + } + memcpy(&mhdp->hdcp.pairing[0], fw->data, + sizeof(struct hdcp_trans_pairing_data) * mhdp->hdcp.num_paired); + release_firmware(fw); + goto out; + } + + DRM_DEV_ERROR(mhdp->dev, "Timed out trying to load firmware\n"); + ret = -ETIMEDOUT; + out: + return ret; +} +#endif + +static int hdmi_hdcp_find_km_store(struct cdns_mhdp_device *mhdp, + u8 receiver[HDCP_PAIRING_R_ID]) +{ + int i; + + DRM_DEBUG_KMS("%s()\n", __func__); + for (i = 0; i < mhdp->hdcp.num_paired; i++) { + if (memcmp(receiver, mhdp->hdcp.pairing[i].receiver_id, + HDCP_PAIRING_R_ID) == 0) { + DRM_INFO("HDCP: found receiver id: 0x%x%x%x%x%x\n", + receiver[0], receiver[1], receiver[2], receiver[3], receiver[4]); + return i; + } + } + DRM_INFO("HDCP: receiver id: 0x%x%x%x%x%x not stored\n", + receiver[0], receiver[1], receiver[2], receiver[3], receiver[4]); + return -1; +} + +static int hdmi_hdcp_store_km(struct cdns_mhdp_device *mhdp, + struct hdcp_trans_pairing_data *pairing, + int stored_km_index) +{ + int i, temp_index; + struct hdcp_trans_pairing_data temp_pairing; + + DRM_DEBUG_KMS("%s()\n", __func__); + + if (stored_km_index < 0) { + /* drop one entry if array is full */ + if (mhdp->hdcp.num_paired == MAX_STORED_KM) + mhdp->hdcp.num_paired--; + + temp_index = mhdp->hdcp.num_paired; + mhdp->hdcp.num_paired++; + if (!pairing) { + DRM_ERROR("NULL HDCP pairing data!\n"); + return -1; + } else + /* save the new stored km */ + temp_pairing = *pairing; + } else { + /* save the current stored km */ + temp_index = stored_km_index; + temp_pairing = mhdp->hdcp.pairing[stored_km_index]; + } + + /* move entries one slot to the end */ + for (i = temp_index; i > 0; i--) + mhdp->hdcp.pairing[i] = mhdp->hdcp.pairing[i - 1]; + + /* save the current/new entry at the beginning */ + mhdp->hdcp.pairing[0] = temp_pairing; + + return 0; +} + +static inline int hdmi_hdcp_auth_22(struct cdns_mhdp_device *mhdp) +{ + int km_idx = -1; + u8 retEvents; + u16 hdcp_port_status; + u8 resp[HDCP_STATUS_SIZE]; + struct hdcp_trans_pairing_data pairing; + int ret; + + DRM_DEBUG_KMS("HDCP: Start 2.2 Authentication\n"); + mhdp->hdcp.sink_is_repeater = 0; + + /* Wait until HDCP2_TX_IS_KM_STORED EVENT appears */ + retEvents = 0; + DRM_DEBUG_KMS("INFO: Wait until HDCP2_TX_IS_KM_STORED EVENT appears\n"); + while (check_event(retEvents, HDCPTX_IS_KM_STORED_EVENT) == 0) { + DRM_DEBUG_KMS("INFO: Waiting FOR _IS_KM_STORED EVENT\n"); + retEvents = wait4event(mhdp, &mhdp->hdcp.events, + HDCPTX_IS_KM_STORED_EVENT, HDCP_EVENT_TO_DEF); + if (retEvents == 0) + /* time out occurred, return error */ + return -1; + if (check_event(retEvents, HDCPTX_STATUS_EVENT) != 0) { + /* There was a status update, could be due to HPD + going down or some other error, check if an error + was set, if so exit. + */ + hdcp_port_status = hdmi_hdcp_get_status(mhdp); + if (hdmi_hdcp_handle_status(hdcp_port_status) != 0) + return -1; + } + } + + DRM_DEBUG_KMS("HDCP: HDCPTX_IS_KM_STORED_EVENT\n"); + + /* Set HDCP2 TX KM STORED REQUEST */ + ret = cdns_mhdp_hdcp2_tx_is_km_stored_req(mhdp, resp, HDCP_STATUS_SIZE); + if (ret) { + DRM_DEV_ERROR(mhdp->dev, "Failed to hdcp2 tx km stored.\n"); + return -1; + } + + DRM_DEBUG_KMS("HDCP: CDN_API_HDCP2_TX_IS_KM_STORED_REQ_blocking\n"); + DRM_DEBUG_KMS("HDCP: Receiver ID: 0x%x%x%x%x%x\n", + resp[0], resp[1], resp[2], resp[3], resp[4]); + + km_idx = hdmi_hdcp_find_km_store(mhdp, resp); + + /* Check if KM is stored */ + if (km_idx >= 0) { + DRM_DEBUG_KMS("INFO: KM is stored\n"); + /* Set HDCP2 TX RESPOND KM with stored KM */ + ret = cdns_mhdp_hdcp2_tx_respond_km(mhdp, (u8 *)&mhdp->hdcp.pairing[km_idx], + sizeof(struct hdcp_trans_pairing_data)); + + DRM_DEBUG_KMS("HDCP: CDN_API_HDCP2_TX_RESPOND_KM_blocking, ret=%d\n", ret); + } else { /* KM is not stored */ + /* Set HDCP2 TX RESPOND KM with empty data */ + ret = cdns_mhdp_hdcp2_tx_respond_km(mhdp, NULL, 0); + DRM_DEBUG_KMS("INFO: KM is not stored ret=%d\n", ret); + } + + if (hdmi_hdcp_check_receviers(mhdp)) + return -1; + + /* Check if KM is not stored */ + if (km_idx < 0) { + int loop_cnt = 0; + + /* Wait until HDCP2_TX_STORE_KM EVENT appears */ + retEvents = 0; + DRM_DEBUG_KMS("INFO: wait4event -> HDCPTX_STORE_KM_EVENT\n"); + while (check_event(retEvents, HDCPTX_STORE_KM_EVENT) == 0) { + retEvents = wait4event(mhdp, &mhdp->hdcp.events, + HDCPTX_STORE_KM_EVENT, HDCP_EVENT_TO_DEF); + if (check_event(retEvents, HDCPTX_STATUS_EVENT) + != 0) { + hdcp_port_status = hdmi_hdcp_get_status(mhdp); + if (hdmi_hdcp_handle_status(hdcp_port_status) + != 0) + return -1; + } + if (loop_cnt > 2) { + DRM_ERROR("Did not get event HDCPTX_STORE_KM_EVENT in time\n"); + return -1; + } else + loop_cnt++; + } + DRM_DEBUG_KMS("HDCP: HDCPTX_STORE_KM_EVENT\n"); + + /* Set HDCP2_TX_STORE_KM REQUEST */ + ret = cdns_mhdp_hdcp2_tx_store_km(mhdp, (u8 *)&pairing, sizeof(struct hdcp_trans_pairing_data)); + DRM_DEBUG_KMS("HDCP: CDN_API_HDCP2_TX_STORE_KM_REQ_blocking ret=%d\n", ret); + hdmi_hdcp_store_km(mhdp, &pairing, km_idx); + } else + hdmi_hdcp_store_km(mhdp, NULL, km_idx); + + /* Check if device was a repeater */ + hdcp_port_status = hdmi_hdcp_get_status(mhdp); + + /* Exit if there was any errors logged at this point... */ + if (GET_HDCP_PORT_STS_LAST_ERR(hdcp_port_status) > 0) { + hdmi_hdcp_handle_status(hdcp_port_status); + return -1; + } + + if (hdcp_port_status & HDCP_PORT_STS_REPEATER) + mhdp->hdcp.sink_is_repeater = 1; + + /* If sink was a repeater, we will be getting additional IDs to validate... + * Note that this one may take some time since spec allows up to 3s... */ + if (mhdp->hdcp.sink_is_repeater) + if (hdmi_hdcp_check_receviers(mhdp)) + return -1; + + /* Slight delay to allow firmware to finish setting up authenticated state */ + msleep(300); + + DRM_INFO("Finished hdmi_hdcp_auth_22\n"); + return 0; +} + +static inline int hdmi_hdcp_auth_14(struct cdns_mhdp_device *mhdp) +{ + u16 hdcp_port_status; + int ret = 0; + + DRM_DEBUG_KMS("HDCP: Starting 1.4 Authentication\n"); + mhdp->hdcp.sink_is_repeater = 0; + + ret = hdmi_hdcp_check_receviers(mhdp); + if (ret) + return -1; + + /* Check if device was a repeater */ + hdcp_port_status = hdmi_hdcp_get_status(mhdp); + + /* Exit if there was any errors logged at this point... */ + if (GET_HDCP_PORT_STS_LAST_ERR(hdcp_port_status) > 0) { + hdmi_hdcp_handle_status(hdcp_port_status); + return -1; + } + + if (hdcp_port_status & HDCP_PORT_STS_REPEATER) { + DRM_INFO("Connected to a repeater\n"); + mhdp->hdcp.sink_is_repeater = 1; + } else + DRM_INFO("Connected to a normal sink\n"); + + /* If sink was a repeater, we will be getting additional IDs to validate... + * Note that this one may take some time since spec allows up to 3s... */ + if (mhdp->hdcp.sink_is_repeater) + ret = hdmi_hdcp_check_receviers(mhdp); + + /* Slight delay to allow firmware to finish setting up authenticated state */ + msleep(300); + + return ret; +} + +static int hdmi_hdcp_auth(struct cdns_mhdp_device *mhdp, u8 hdcp_config) +{ + int ret = 0; + + DRM_DEBUG_KMS("HDCP: Start Authentication\n"); + + if (mhdp->hdcp.reauth_in_progress == 0) { + ret = hdmi_hdcp_set_config(mhdp, hdcp_config); + if (ret) { + DRM_ERROR("hdmi_hdcp_set_config failed\n"); + return -1; + } + } + + mhdp->hdcp.reauth_in_progress = 0; + mhdp->hdcp.sink_is_repeater = 0; + mhdp->hdcp.hdcp_version = hdcp_config; + + do { + if (mhdp->hdcp.cancel == 1) { + DRM_ERROR("mhdp->hdcp.cancel is TRUE\n"); + return -ECANCELED; + } + + if (hdcp_config == HDCP_TX_1) + ret = hdmi_hdcp_auth_14(mhdp); + else + ret = hdmi_hdcp_auth_22(mhdp); + if (ret) { + u16 hdcp_port_status; + DRM_ERROR("hdmi_hdcp_auth_%s failed\n", + (hdcp_config == HDCP_TX_1) ? "14" : "22"); + hdcp_port_status = hdmi_hdcp_get_status(mhdp); + hdmi_hdcp_handle_status(hdcp_port_status); + return -1; + } + + ret = hdmi_hdcp_auth_check(mhdp); + } while (ret == 1); + + return ret; +} + +static int _hdmi_hdcp_disable(struct cdns_mhdp_device *mhdp) +{ + int ret = 0; + u8 hdcp_cfg = (HDCP_USE_KMKEY << 4); + + DRM_DEBUG_KMS("[%s:%d] HDCP is being disabled...\n", + mhdp->connector.base.name, mhdp->connector.base.base.id); + DRM_DEBUG_KMS("INFO: Disabling HDCP...\n"); + + ret = cdns_mhdp_hdcp_tx_config(mhdp, hdcp_cfg); + if (ret < 0) + DRM_DEBUG_KMS("cdns_mhdp_hdcp_tx_config failed\n"); + + DRM_DEBUG_KMS("HDCP is disabled\n"); + + mhdp->hdcp.events = 0; + + return ret; +} + +static int _hdmi_hdcp_enable(struct cdns_mhdp_device *mhdp) +{ + int i, ret = 0, tries = 9; + u8 hpd_sts; + + hpd_sts = cdns_mhdp_read_hpd(mhdp); + if (1 != hpd_sts) { + dev_info(mhdp->dev, "%s HDP detected low, set state to DISABLING\n", __func__); + mhdp->hdcp.state = HDCP_STATE_DISABLING; + return -1; + } + + DRM_DEBUG_KMS("[%s:%d] HDCP is being enabled...\n", + mhdp->connector.base.name, mhdp->connector.base.base.id); + + mhdp->hdcp.events = 0; + + /* Incase of authentication failures, HDCP spec expects reauth. */ + /* TBD should this actually try 2.2 n times then 1.4? */ + for (i = 0; i < tries; i++) { + if (mhdp->hdcp.config & HDCP_CONFIG_2_2) { + ret = hdmi_hdcp_auth(mhdp, HDCP_TX_2); + if (ret == 0) + return 0; + else if (ret == -ECANCELED) + return ret; + _hdmi_hdcp_disable(mhdp); + } + } + + for (i = 0; i < tries; i++) { + if (mhdp->hdcp.config & HDCP_CONFIG_1_4) { + ret = hdmi_hdcp_auth(mhdp, HDCP_TX_1); + if (ret == 0) + return 0; + else if (ret == -ECANCELED) + return ret; + _hdmi_hdcp_disable(mhdp); + } + DRM_DEBUG_KMS("HDCP Auth failure (%d)\n", ret); + } + + DRM_ERROR("HDCP authentication failed (%d tries/%d)\n", tries, ret); + return ret; +} + +static void hdmi_hdcp_check_work(struct work_struct *work) +{ + struct cdns_mhdp_hdcp *hdcp = container_of(work, + struct cdns_mhdp_hdcp, check_work.work); + struct cdns_mhdp_device *mhdp = container_of(hdcp, + struct cdns_mhdp_device, hdcp); + + /* todo: maybe we don't need to always schedule */ + hdmi_hdcp_check_link(mhdp); + schedule_delayed_work(&hdcp->check_work, 50); +} + +static void hdmi_hdcp_prop_work(struct work_struct *work) +{ + struct cdns_mhdp_hdcp *hdcp = container_of(work, + struct cdns_mhdp_hdcp, prop_work); + struct cdns_mhdp_device *mhdp = container_of(hdcp, + struct cdns_mhdp_device, hdcp); + + struct drm_device *dev = mhdp->drm_dev; + struct drm_connector_state *state; + + drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); + mutex_lock(&mhdp->hdcp.mutex); + + /* + * This worker is only used to flip between ENABLED/DESIRED. Either of + * those to UNDESIRED is handled by core. If hdcp_value == UNDESIRED, + * we're running just after hdcp has been disabled, so just exit + */ + if (mhdp->hdcp.value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) { + state = mhdp->connector.base.state; + state->content_protection = mhdp->hdcp.value; + } + + mutex_unlock(&mhdp->hdcp.mutex); + drm_modeset_unlock(&dev->mode_config.connection_mutex); +} + +static void show_hdcp_supported(struct cdns_mhdp_device *mhdp) +{ + if ((mhdp->hdcp.config & (HDCP_CONFIG_1_4 | HDCP_CONFIG_2_2)) == + (HDCP_CONFIG_1_4 | HDCP_CONFIG_2_2)) + DRM_INFO("Both HDCP 1.4 and 2 2 are enabled\n"); + else if (mhdp->hdcp.config & HDCP_CONFIG_1_4) + DRM_INFO("Only HDCP 1.4 is enabled\n"); + else if (mhdp->hdcp.config & HDCP_CONFIG_2_2) + DRM_INFO("Only HDCP 2.2 is enabled\n"); + else + DRM_INFO("HDCP is disabled\n"); +} + +#ifdef DEBUG +void hdmi_hdcp_show_pairing(struct cdns_mhdp_device *mhdp, struct hdcp_trans_pairing_data *p) +{ + char s[80]; + int i, k; + + DRM_INFO("Reveiver ID: %.2X%.2X%.2X%.2X%.2X\n", + p->receiver_id[0], + p->receiver_id[1], + p->receiver_id[2], + p->receiver_id[3], + p->receiver_id[4]); + for (k = 0, i = 0; k < 16; k++) + i += snprintf(&s[i], sizeof(s), "%02x", p->m[k]); + + DRM_INFO("\tm: %s\n", s); + + for (k = 0, i = 0; k < 16; k++) + i += snprintf(&s[i], sizeof(s), "%02x", p->km[k]); + + DRM_INFO("\tkm: %s\n", s); + + for (k = 0, i = 0; k < 16; k++) + i += snprintf(&s[i], sizeof(s), "%02x", p->ekh[k]); + + DRM_INFO("\tekh: %s\n", s); +} +#endif + +void hdmi_hdcp_dump_pairing(struct seq_file *s, void *data) +{ + struct cdns_mhdp_device *mhdp = data; +#ifdef DEBUG + int i; + for (i = 0; i < mhdp->hdcp.num_paired; i++) + hdmi_hdcp_show_pairing(mhdp, &mhdp->hdcp.pairing[i]); +#endif + seq_write(s, &mhdp->hdcp.pairing[0], + mhdp->hdcp.num_paired * sizeof(struct hdcp_trans_pairing_data)); +} + +static int hdmi_hdcp_pairing_show(struct seq_file *s, void *data) +{ + hdmi_hdcp_dump_pairing(s, s->private); + return 0; +} + +static int hdmi_hdcp_dump_pairing_open(struct inode *inode, struct file *file) +{ + return single_open(file, hdmi_hdcp_pairing_show, inode->i_private); +} + +static const struct file_operations hdmi_hdcp_dump_fops = { + .open = hdmi_hdcp_dump_pairing_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static void hdmi_hdcp_debugfs_init(struct cdns_mhdp_device *mhdp) +{ + struct dentry *d, *root; + + root = debugfs_create_dir("imx-hdcp", NULL); + if (IS_ERR(root) || !root) + goto err; + + d = debugfs_create_file("dump_pairing", 0444, root, mhdp, + &hdmi_hdcp_dump_fops); + if (!d) + goto err; + return; + +err: + dev_err(mhdp->dev, "Unable to create debugfs entries\n"); +} + +int cdns_hdmi_hdcp_init(struct cdns_mhdp_device *mhdp, struct device_node *of_node) +{ + const char *compat; + u32 temp; + int ret; + + ret = of_property_read_string(of_node, "compatible", &compat); + if (ret) { + DRM_ERROR("Failed to compatible dts string\n"); + return ret; + } + if (!strstr(compat, "hdmi")) + return -EPERM; + + ret = of_property_read_u32(of_node, "hdcp-config", &temp); + if (ret) { + /* using highest level by default */ + mhdp->hdcp.config = HDCP_CONFIG_2_2; + DRM_INFO("Failed to get HDCP config - using HDCP 2.2 only\n"); + } else { + mhdp->hdcp.config = temp; + show_hdcp_supported(mhdp); + } + + hdmi_hdcp_debugfs_init(mhdp); + +#ifdef USE_DEBUG_KEYS /* reserve for hdcp test key */ + { + u8 hdcp_cfg; + hdcp_cfg = HDCP_TX_2 | (HDCP_USE_KMKEY << 4) | (HDCP_CONTENT_TYPE_0 << 3); + imx_hdmi_load_test_keys(mhdp, &hdcp_cfg); + } +#endif + + mhdp->hdcp.state = HDCP_STATE_INACTIVE; + + mutex_init(&mhdp->hdcp.mutex); + INIT_DELAYED_WORK(&mhdp->hdcp.check_work, hdmi_hdcp_check_work); + INIT_WORK(&mhdp->hdcp.prop_work, hdmi_hdcp_prop_work); + + return 0; +} + +int cdns_hdmi_hdcp_enable(struct cdns_mhdp_device *mhdp) +{ + int ret = 0; + + mhdp->hdcp.reauth_in_progress = 0; + +#ifdef STORE_PAIRING + hdmi_hdcp_get_stored_pairing(mhdp); +#endif + msleep(500); + + mutex_lock(&mhdp->hdcp.mutex); + + mhdp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_DESIRED; + mhdp->hdcp.state = HDCP_STATE_ENABLING; + mhdp->hdcp.cancel = 0; + + schedule_work(&mhdp->hdcp.prop_work); + schedule_delayed_work(&mhdp->hdcp.check_work, 50); + + mutex_unlock(&mhdp->hdcp.mutex); + + return ret; +} + +int cdns_hdmi_hdcp_disable(struct cdns_mhdp_device *mhdp) +{ + int ret = 0; + + mutex_lock(&mhdp->hdcp.mutex); + if (mhdp->hdcp.value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) { + mhdp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_UNDESIRED; + mhdp->hdcp.state = HDCP_STATE_DISABLING; + mhdp->hdcp.cancel = 1; + schedule_work(&mhdp->hdcp.prop_work); + } + + mutex_unlock(&mhdp->hdcp.mutex); + + cancel_delayed_work_sync(&mhdp->hdcp.check_work); + + return ret; +} + +void cdns_hdmi_hdcp_atomic_check(struct drm_connector *connector, + struct drm_connector_state *old_state, + struct drm_connector_state *new_state) +{ + u64 old_cp = old_state->content_protection; + u64 new_cp = new_state->content_protection; + struct drm_crtc_state *crtc_state; + + if (!new_state->crtc) { + /* + * If the connector is being disabled with CP enabled, mark it + * desired so it's re-enabled when the connector is brought back + */ + if (old_cp == DRM_MODE_CONTENT_PROTECTION_ENABLED) + new_state->content_protection = + DRM_MODE_CONTENT_PROTECTION_DESIRED; + return; + } + + /* + * Nothing to do if the state didn't change, or HDCP was activated since + * the last commit + */ + if (old_cp == new_cp || + (old_cp == DRM_MODE_CONTENT_PROTECTION_DESIRED && + new_cp == DRM_MODE_CONTENT_PROTECTION_ENABLED)) + return; + + crtc_state = drm_atomic_get_new_crtc_state(new_state->state, new_state->crtc); + crtc_state->mode_changed = true; +} + +static int hdmi_hdcp_check_link(struct cdns_mhdp_device *mhdp) +{ + u16 hdcp_port_status = 0; + u8 hdcp_last_error = 0; + u8 hpd_sts; + int ret = 0; + + mhdp->hdcp.reauth_in_progress = 0; + mutex_lock(&mhdp->lock); + + if ((mhdp->hdcp.state == HDCP_STATE_AUTHENTICATED) || + (mhdp->hdcp.state == HDCP_STATE_AUTHENTICATING) || + (mhdp->hdcp.state == HDCP_STATE_REAUTHENTICATING) || + (mhdp->hdcp.state == HDCP_STATE_ENABLING)) { + + /* In active states, check the HPD signal. Because of the IRQ + * debounce delay, the state might not reflect the disconnection. + * The FW could already have detected the HDP down and reported error */ + hpd_sts = cdns_mhdp_read_hpd(mhdp); + if (1 != hpd_sts) + mhdp->hdcp.state = HDCP_STATE_DISABLING; + } + + if (mhdp->hdcp.state == HDCP_STATE_INACTIVE) + goto out; + + if (mhdp->hdcp.state == HDCP_STATE_DISABLING) { + _hdmi_hdcp_disable(mhdp); + mhdp->hdcp.state = HDCP_STATE_INACTIVE; + goto out; + } + +/* TODO items: + Need to make sure that any requests from the firmware are actually + processed so want to remove this first jump to 'out', i.e. process + reauthentication requests, cleanup errors and repeater receiver id + checks. +*/ + if (mhdp->hdcp.state == HDCP_STATE_AUTHENTICATED) { + /* get port status */ + hdcp_port_status = hdmi_hdcp_get_status(mhdp); + hdcp_last_error = GET_HDCP_PORT_STS_LAST_ERR(hdcp_port_status); + if (hdcp_last_error == HDCP_TRAN_ERR_REAUTH_REQ) { + DRM_INFO("Sink requesting re-authentication\n"); + mhdp->hdcp.state = HDCP_STATE_REAUTHENTICATING; + } else if (hdcp_last_error) { + DRM_ERROR("HDCP error no: %u\n", hdcp_last_error); + + if (mhdp->hdcp.value == DRM_MODE_CONTENT_PROTECTION_UNDESIRED) + goto out; + if (hdcp_port_status & HDCP_PORT_STS_AUTH) { + if (mhdp->hdcp.value != + DRM_MODE_CONTENT_PROTECTION_UNDESIRED) { + mhdp->hdcp.value = + DRM_MODE_CONTENT_PROTECTION_ENABLED; + schedule_work(&mhdp->hdcp.prop_work); + goto out; + } + } + + mhdp->hdcp.state = HDCP_STATE_AUTH_FAILED; + + } else if (mhdp->hdcp.sink_is_repeater) { + u8 new_events; + /* Check events... and process if HDCPTX_IS_RECEIVER_ID_VALID_EVENT. */ + new_events = cdns_mhdp_get_event(mhdp); + mhdp->hdcp.events |= new_events; + if (check_event(mhdp->hdcp.events, HDCPTX_IS_RECEIVER_ID_VALID_EVENT)) { + DRM_INFO("Sink repeater updating receiver ID list...\n"); + if (hdmi_hdcp_check_receviers(mhdp)) + mhdp->hdcp.state = HDCP_STATE_AUTH_FAILED; + } + } + } + + if (mhdp->hdcp.state == HDCP_STATE_REAUTHENTICATING) { + /* For now just deal with HDCP2.2 */ + if (mhdp->hdcp.hdcp_version == HDCP_TX_2) + mhdp->hdcp.reauth_in_progress = 1; + else + mhdp->hdcp.state = HDCP_STATE_AUTH_FAILED; + } + + if (mhdp->hdcp.state == HDCP_STATE_ENABLING) { + mhdp->hdcp.state = HDCP_STATE_AUTHENTICATING; + ret = _hdmi_hdcp_enable(mhdp); + if (ret == -ECANCELED) + goto out; + else if (ret) { + DRM_ERROR("Failed to enable hdcp (%d)\n", ret); + mhdp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_DESIRED; + schedule_work(&mhdp->hdcp.prop_work); + goto out; + } + } + + if ((mhdp->hdcp.state == HDCP_STATE_AUTH_FAILED) || + (mhdp->hdcp.state == HDCP_STATE_REAUTHENTICATING)) { + + print_port_status(hdcp_port_status); + if (mhdp->hdcp.state == HDCP_STATE_AUTH_FAILED) { + DRM_DEBUG_KMS("[%s:%d] HDCP link failed, retrying authentication 0x%2x\n", + mhdp->connector.base.name, mhdp->connector.base.base.id, hdcp_port_status); + ret = _hdmi_hdcp_disable(mhdp); + if (ret) { + DRM_ERROR("Failed to disable hdcp (%d)\n", ret); + mhdp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_DESIRED; + schedule_work(&mhdp->hdcp.prop_work); + goto out; + } + } else + DRM_DEBUG_KMS("[%s:%d] HDCP attempt reauthentication 0x%2x\n", + mhdp->connector.base.name, mhdp->connector.base.base.id, hdcp_port_status); + + ret = _hdmi_hdcp_enable(mhdp); + if (ret == -ECANCELED) + goto out; + else if (ret) { + DRM_ERROR("Failed to enable hdcp (%d)\n", ret); + mhdp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_DESIRED; + schedule_work(&mhdp->hdcp.prop_work); + goto out; + } + } + +out: + mutex_unlock(&mhdp->lock); + + return ret; +} diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdcp.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdcp.c new file mode 100644 index 000000000000..587c5f953489 --- /dev/null +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdcp.c @@ -0,0 +1,300 @@ +/* + * Cadence HDCP API driver + * + * Copyright (C) 2021 NXP Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include <asm/unaligned.h> +#include <drm/bridge/cdns-mhdp.h> +#include <drm/drm_print.h> + +#include "cdns-mhdp.h" + +static u32 mhdp_hdcp_bus_read(struct cdns_mhdp_device *mhdp, u32 offset) +{ + u32 val; + + mutex_lock(&mhdp->iolock); + + if (mhdp->bus_type == BUS_TYPE_LOW4K_APB) { + /* Remap address to low 4K APB bus */ + writel(offset >> 12, mhdp->regs_sec + 8); + val = readl((offset & 0xfff) + mhdp->regs_base); + } else if (mhdp->bus_type == BUS_TYPE_NORMAL_APB) + val = readl(mhdp->regs_sec + offset); + + mutex_unlock(&mhdp->iolock); + + return val; +} + +static void mhdp_hdcp_bus_write(u32 val, struct cdns_mhdp_device *mhdp, u32 offset) +{ + mutex_lock(&mhdp->iolock); + + if (mhdp->bus_type == BUS_TYPE_LOW4K_APB) { + /* Remap address to low 4K APB bus */ + writel(offset >> 12, mhdp->regs_sec + 8); + writel(val, (offset & 0xfff) + mhdp->regs_base); + } else if (mhdp->bus_type == BUS_TYPE_NORMAL_APB) + writel(val, mhdp->regs_sec + offset); + + mutex_unlock(&mhdp->iolock); +} + +static int mhdp_hdcp_mailbox_read(struct cdns_mhdp_device *mhdp) +{ + int val, ret; + + ret = mhdp_readx_poll_timeout(mhdp_hdcp_bus_read, mhdp, MAILBOX_EMPTY_ADDR, + val, !val, MAILBOX_RETRY_US, + MAILBOX_TIMEOUT_US); + if (ret < 0) + return ret; + + return mhdp_hdcp_bus_read(mhdp, MAILBOX0_RD_DATA) & 0xff; +} + +static int mhdp_hdcp_mailbox_write(struct cdns_mhdp_device *mhdp, u8 val) +{ + int ret, full; + + ret = mhdp_readx_poll_timeout(mhdp_hdcp_bus_read, mhdp, MAILBOX_FULL_ADDR, + full, !full, MAILBOX_RETRY_US, + MAILBOX_TIMEOUT_US); + if (ret < 0) + return ret; + + mhdp_hdcp_bus_write(val, mhdp, MAILBOX0_WR_DATA); + + return 0; +} + +static int mhdp_hdcp_mailbox_validate_receive(struct cdns_mhdp_device *mhdp, + u8 module_id, u8 opcode, u16 req_size) +{ + u32 mbox_size, i; + u8 header[4]; + int ret; + + /* read the header of the message */ + for (i = 0; i < 4; i++) { + ret = mhdp_hdcp_mailbox_read(mhdp); + if (ret < 0) + return ret; + + header[i] = ret; + } + + mbox_size = get_unaligned_be16(header + 2); + + if (opcode != header[0] || module_id != header[1] || + req_size != mbox_size) { + /* + * If the message in mailbox is not what we want, we need to + * clear the mailbox by reading its contents. + */ + for (i = 0; i < mbox_size; i++) + if (mhdp_hdcp_mailbox_read(mhdp) < 0) + break; + + return -EINVAL; + } + + return 0; +} + +static int mhdp_hdcp_mailbox_read_receive(struct cdns_mhdp_device *mhdp, + u8 *buff, u16 buff_size) +{ + u32 i; + int ret; + + for (i = 0; i < buff_size; i++) { + ret = mhdp_hdcp_mailbox_read(mhdp); + if (ret < 0) + return ret; + + buff[i] = ret; + } + + return 0; +} + +static int mhdp_hdcp_mailbox_send(struct cdns_mhdp_device *mhdp, u8 module_id, + u8 opcode, u16 size, u8 *message) +{ + u8 header[4]; + int ret, i; + + header[0] = opcode; + header[1] = module_id; + put_unaligned_be16(size, header + 2); + + for (i = 0; i < 4; i++) { + ret = mhdp_hdcp_mailbox_write(mhdp, header[i]); + if (ret) + return ret; + } + + for (i = 0; i < size; i++) { + ret = mhdp_hdcp_mailbox_write(mhdp, message[i]); + if (ret) + return ret; + } + + return 0; +} + +/* HDCP API */ +int cdns_mhdp_hdcp_tx_config(struct cdns_mhdp_device *mhdp, u8 config) +{ + return mhdp_hdcp_mailbox_send(mhdp, MB_MODULE_ID_HDCP_TX, + HDCP_TX_CONFIGURATION, sizeof(config), &config); +} +EXPORT_SYMBOL(cdns_mhdp_hdcp_tx_config); + +int cdns_mhdp_hdcp2_tx_respond_km(struct cdns_mhdp_device *mhdp, + u8 *msg, u16 len) +{ + return mhdp_hdcp_mailbox_send(mhdp, MB_MODULE_ID_HDCP_TX, + HDCP2_TX_RESPOND_KM, len, msg); +} +EXPORT_SYMBOL(cdns_mhdp_hdcp2_tx_respond_km); + +int cdns_mhdp_hdcp_tx_status_req(struct cdns_mhdp_device *mhdp, + u8 *status, u16 len) +{ + int ret; + + ret = mhdp_hdcp_mailbox_send(mhdp, MB_MODULE_ID_HDCP_TX, + HDCP_TX_STATUS_CHANGE, 0, NULL); + if (ret) + goto err_tx_req; + + ret = mhdp_hdcp_mailbox_validate_receive(mhdp, MB_MODULE_ID_HDCP_TX, + HDCP_TX_STATUS_CHANGE, len); + if (ret) + goto err_tx_req; + + ret = mhdp_hdcp_mailbox_read_receive(mhdp, status, len); + if (ret) + goto err_tx_req; + +err_tx_req: + if (ret) + DRM_ERROR("hdcp tx status req failed: %d\n", ret); + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_hdcp_tx_status_req); + +int cdns_mhdp_hdcp2_tx_is_km_stored_req(struct cdns_mhdp_device *mhdp, u8 *data, u16 len) +{ + int ret; + + ret = mhdp_hdcp_mailbox_send(mhdp, MB_MODULE_ID_HDCP_TX, + HDCP2_TX_IS_KM_STORED, 0, NULL); + if (ret) + goto err_is_km; + + ret = mhdp_hdcp_mailbox_validate_receive(mhdp, MB_MODULE_ID_HDCP_TX, + HDCP2_TX_IS_KM_STORED, len); + if (ret) + goto err_is_km; + + ret = mhdp_hdcp_mailbox_read_receive(mhdp, data, len); + +err_is_km: + if (ret) + DRM_ERROR("hdcp2 tx is km stored req failed: %d\n", ret); + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_hdcp2_tx_is_km_stored_req); + +int cdns_mhdp_hdcp2_tx_store_km(struct cdns_mhdp_device *mhdp, + u8 *resp, u16 len) +{ + int ret; + + ret = mhdp_hdcp_mailbox_send(mhdp, MB_MODULE_ID_HDCP_TX, + HDCP2_TX_STORE_KM, 0, NULL); + if (ret) + goto err_store_km; + + ret = mhdp_hdcp_mailbox_validate_receive(mhdp, MB_MODULE_ID_HDCP_TX, + HDCP2_TX_STORE_KM, len); + if (ret) + goto err_store_km; + + ret = mhdp_hdcp_mailbox_read_receive(mhdp, resp, len); + +err_store_km: + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_hdcp2_tx_store_km); + +int cdns_mhdp_hdcp_tx_is_receiver_id_valid(struct cdns_mhdp_device *mhdp, + u8 *rx_id, u8 *num) +{ + u32 mbox_size, i; + u8 header[4]; + u8 temp; + int ret; + + ret = mhdp_hdcp_mailbox_send(mhdp, MB_MODULE_ID_HDCP_TX, + HDCP_TX_IS_RECEIVER_ID_VALID, 0, NULL); + if (ret) + goto err_rx_id; + + /* read the header of the message */ + for (i = 0; i < 4; i++) { + ret = mhdp_hdcp_mailbox_read(mhdp); + if (ret < 0) + return ret; + + header[i] = ret; + } + + mbox_size = get_unaligned_be16(header + 2); + + if (HDCP_TX_IS_RECEIVER_ID_VALID != header[0] || + MB_MODULE_ID_HDCP_TX != header[1]) + return -EINVAL; + + /* First get num of receivers */ + ret = mhdp_hdcp_mailbox_read_receive(mhdp, num, 1); + if (ret) + goto err_rx_id; + + /* skip second data */ + ret = mhdp_hdcp_mailbox_read_receive(mhdp, &temp, 1); + if (ret) + goto err_rx_id; + + /* get receivers ID */ + ret = mhdp_hdcp_mailbox_read_receive(mhdp, rx_id, mbox_size - 2); + +err_rx_id: + return ret; +} +EXPORT_SYMBOL(cdns_mhdp_hdcp_tx_is_receiver_id_valid); + +int cdns_mhdp_hdcp_tx_respond_receiver_id_valid( + struct cdns_mhdp_device *mhdp, u8 val) +{ + return mhdp_hdcp_mailbox_send(mhdp, MB_MODULE_ID_HDCP_TX, + HDCP_TX_RESPOND_RECEIVER_ID_VALID, sizeof(val), &val); +} +EXPORT_SYMBOL(cdns_mhdp_hdcp_tx_respond_receiver_id_valid); + +int cdns_mhdp_hdcp_tx_reauth(struct cdns_mhdp_device *mhdp, u8 msg) +{ + return mhdp_hdcp_mailbox_send(mhdp, MB_MODULE_ID_HDCP_TX, + HDCP_TX_DO_AUTH_REQ, sizeof(msg), &msg); +} +EXPORT_SYMBOL(cdns_mhdp_hdcp_tx_reauth); diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdcp.h b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdcp.h new file mode 100644 index 000000000000..4ce76dd1ee58 --- /dev/null +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdcp.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2021 NXP Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + */ + +#ifndef CDNS_HDMI_HDCP_H +#define CDNS_HDMI_HDCP_H + +int cdns_mhdp_hdcp2_tx_respond_km(struct cdns_mhdp_device *mhdp, + u8 *msg, u16 len); +int cdns_mhdp_hdcp_tx_config(struct cdns_mhdp_device *mhdp, u8 config); +int cdns_mhdp_hdcp_tx_status_req(struct cdns_mhdp_device *mhdp, + u8 *status, u16 len); +int cdns_mhdp_hdcp2_tx_is_km_stored_req(struct cdns_mhdp_device *mhdp, u8 *data, u16 len); +int cdns_mhdp_hdcp2_tx_store_km(struct cdns_mhdp_device *mhdp, + u8 *reg, u16 len); +int cdns_mhdp_hdcp_tx_is_receiver_id_valid(struct cdns_mhdp_device *mhdp, + u8 *rx_id, u8 *num); +int cdns_mhdp_hdcp_tx_respond_receiver_id_valid(struct cdns_mhdp_device *mhdp, + u8 val); +int cdns_mhdp_hdcp_tx_test_keys(struct cdns_mhdp_device *mhdp, u8 type, u8 resp); +int cdns_mhdp_hdcp_tx_reauth(struct cdns_mhdp_device *mhdp, u8 msg); + +int cdns_hdmi_hdcp_init(struct cdns_mhdp_device *mhdp, struct device_node *of_node); +int cdns_hdmi_hdcp_enable(struct cdns_mhdp_device *mhdp); +int cdns_hdmi_hdcp_disable(struct cdns_mhdp_device *mhdp); +void cdns_hdmi_hdcp_atomic_check(struct drm_connector *connector, + struct drm_connector_state *old_state, + struct drm_connector_state *new_state); + +#endif /* CDNS_HDMI_HDCP_H */ diff --git a/include/drm/bridge/cdns-mhdp.h b/include/drm/bridge/cdns-mhdp.h index 338fa55b8bdf..5752c47b1a16 100644 --- a/include/drm/bridge/cdns-mhdp.h +++ b/include/drm/bridge/cdns-mhdp.h @@ -388,6 +388,27 @@ #define HDMI_TX_TEST 0xBB #define HDMI_TX_EDID_INTERNAL 0xF0 +/* HDCP General opcode */ +#define HDCP_GENERAL_SET_LC_128 0x00 +#define HDCP_GENERAL_SET_SEED 0x01 + +/* HDCP TX opcode */ +#define HDCP_TX_CONFIGURATION 0x00 +#define HDCP2_TX_SET_PUBLIC_KEY_PARAMS 0x01 +#define HDCP2_TX_SET_DEBUG_RANDOM_NUMBERS 0x02 +#define HDCP2_TX_RESPOND_KM 0x03 +#define HDCP1_TX_SEND_KEYS 0x04 +#define HDCP1_TX_SEND_RANDOM_AN 0x05 +#define HDCP_TX_STATUS_CHANGE 0x06 +#define HDCP2_TX_IS_KM_STORED 0x07 +#define HDCP2_TX_STORE_KM 0x08 +#define HDCP_TX_IS_RECEIVER_ID_VALID 0x09 +#define HDCP_TX_RESPOND_RECEIVER_ID_VALID 0x0A +#define HDCP_TX_TEST_KEYS 0x0B +#define HDCP2_TX_SET_KM_KEY_PARAMS 0x0C +#define HDCP_TX_SET_CP_IRQ 0x0D +#define HDCP_TX_DO_AUTH_REQ 0x0E + #define FW_STANDBY 0 #define FW_ACTIVE 1 @@ -428,12 +449,16 @@ #define EQ_PHASE_FAILED BIT(6) #define FASE_LT_FAILED BIT(7) -#define DPTX_HPD_EVENT BIT(0) -#define DPTX_TRAINING_EVENT BIT(1) -#define HDCP_TX_STATUS_EVENT BIT(4) -#define HDCP2_TX_IS_KM_STORED_EVENT BIT(5) -#define HDCP2_TX_STORE_KM_EVENT BIT(6) -#define HDCP_TX_IS_RECEIVER_ID_VALID_EVENT BIT(7) +#define DPTX_HPD_EVENT BIT(0) +#define HDMI_TX_HPD_EVENT BIT(0) +#define HDMI_RX_5V_EVENT BIT(0) +#define DPTX_TRAINING_EVENT BIT(1) +#define HDMI_RX_SCDC_CHANGE_EVENT BIT(1) +#define HDCPTX_STATUS_EVENT BIT(4) +#define HDCPRX_STATUS_EVENT BIT(4) +#define HDCPTX_IS_KM_STORED_EVENT BIT(5) +#define HDCPTX_STORE_KM_EVENT BIT(6) +#define HDCPTX_IS_RECEIVER_ID_VALID_EVENT BIT(7) #define TU_SIZE 30 #define CDNS_DP_MAX_LINK_RATE 540000 @@ -442,6 +467,7 @@ #define F_VIF_DATA_WIDTH(x) (((x) & ((1 << 2) - 1)) << 2) #define F_HDMI_MODE(x) (((x) & ((1 << 2) - 1)) << 0) #define F_GCP_EN(x) (((x) & ((1 << 1) - 1)) << 12) +#define F_CLEAR_AVMUTE(x) (((x) & ((1 << 1) - 1)) << 14) #define F_DATA_EN(x) (((x) & ((1 << 1) - 1)) << 15) #define F_HDMI2_PREAMBLE_EN(x) (((x) & ((1 << 1) - 1)) << 18) #define F_PIC_3D(x) (((x) & ((1 << 4) - 1)) << 7) @@ -662,6 +688,55 @@ struct cdns_plat_data { char *plat_name; }; +/* HDCP */ +#define MAX_STORED_KM 64 +#define HDCP_PAIRING_M_LEN 16 +#define HDCP_PAIRING_M_EKH 16 +#define HDCP_PAIRING_R_ID 5 + +/* HDCP2_TX_SET_DEBUG_RANDOM_NUMBERS */ +#define DEBUG_RANDOM_NUMBERS_KM_LEN 16 +#define DEBUG_RANDOM_NUMBERS_RN_LEN 8 +#define DEBUG_RANDOM_NUMBERS_KS_LEN 16 +#define DEBUG_RANDOM_NUMBERS_RIV_LEN 8 +#define DEBUG_RANDOM_NUMBERS_RTX_LEN 8 + +struct hdcp_trans_pairing_data { + u8 receiver_id[HDCP_PAIRING_R_ID]; + u8 m[HDCP_PAIRING_M_LEN]; + u8 km[DEBUG_RANDOM_NUMBERS_KM_LEN]; + u8 ekh[HDCP_PAIRING_M_EKH]; +}; + +enum hdmi_hdcp_state { + HDCP_STATE_NO_AKSV, + HDCP_STATE_INACTIVE, + HDCP_STATE_ENABLING, + HDCP_STATE_AUTHENTICATING, + HDCP_STATE_REAUTHENTICATING, + HDCP_STATE_AUTHENTICATED, + HDCP_STATE_DISABLING, + HDCP_STATE_AUTH_FAILED +}; + +struct cdns_mhdp_hdcp { + struct mutex mutex; + u64 value; /* protected by hdcp_mutex */ + struct delayed_work check_work; + struct work_struct prop_work; + u8 state; + u8 cancel; + u8 bus_type; + u8 config; + struct hdcp_trans_pairing_data pairing[MAX_STORED_KM]; + u8 num_paired; + + u8 events; + u8 sink_is_repeater; + u8 reauth_in_progress; + u8 hdcp_version; +}; + struct cdns_mhdp_device { void __iomem *regs_base; void __iomem *regs_sec; @@ -669,6 +744,7 @@ struct cdns_mhdp_device { int bus_type; struct device *dev; + struct drm_device *drm_dev; struct cdns_mhdp_connector connector; struct clk *spdif_clk; @@ -722,6 +798,7 @@ struct cdns_mhdp_device { hdmi_codec_plugged_cb plugged_cb; struct device *codec_dev; enum drm_connector_status last_connector_result; + struct cdns_mhdp_hdcp hdcp; }; u32 cdns_mhdp_bus_read(struct cdns_mhdp_device *mhdp, u32 offset); @@ -742,6 +819,7 @@ int cdns_mhdp_get_edid_block(void *mhdp, u8 *edid, int cdns_mhdp_train_link(struct cdns_mhdp_device *mhdp); int cdns_mhdp_set_video_status(struct cdns_mhdp_device *mhdp, int active); int cdns_mhdp_config_video(struct cdns_mhdp_device *mhdp); +int cdns_mhdp_apb_conf(struct cdns_mhdp_device *mhdp, u8 sel); /* Audio */ int cdns_mhdp_audio_stop(struct cdns_mhdp_device *mhdp, @@ -770,8 +848,6 @@ int cdns_mhdp_mailbox_read_receive(struct cdns_mhdp_device *mhdp, int cdns_mhdp_mailbox_validate_receive(struct cdns_mhdp_device *mhdp, u8 module_id, u8 opcode, u16 req_size); -int cdns_mhdp_mailbox_read(struct cdns_mhdp_device *mhdp); - void cdns_mhdp_infoframe_set(struct cdns_mhdp_device *mhdp, u8 entry_id, u8 packet_len, u8 *packet, u8 packet_type); int cdns_hdmi_get_edid_block(void *data, u8 *edid, u32 block, size_t length); -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0021-LF-3272-drm-cdns_mhdp-fix-Coverity-Issue-11566406.patch ================================================ From 2a093769a29f03103195b34c269411ee21b646e2 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Wed, 20 Jan 2021 10:37:09 +0800 Subject: [PATCH 21/49] LF-3272: drm: cdns_mhdp: fix Coverity Issue: 11566406 Add default access hdcp bus to fix Coverity Issue: 11566406 Uninitialized scalar variable. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdcp.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdcp.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdcp.c index 587c5f953489..b3c931382013 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdcp.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdcp.c @@ -27,6 +27,8 @@ static u32 mhdp_hdcp_bus_read(struct cdns_mhdp_device *mhdp, u32 offset) val = readl((offset & 0xfff) + mhdp->regs_base); } else if (mhdp->bus_type == BUS_TYPE_NORMAL_APB) val = readl(mhdp->regs_sec + offset); + else + val = readl(mhdp->regs_base + offset); mutex_unlock(&mhdp->iolock); -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0022-LF-3271-drm-cdns-hdmi-fix-Coverity-Issue-11566407.patch ================================================ From 85ad1a878118a8dbaf9da5f85a2e088880d5ea01 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Wed, 20 Jan 2021 10:44:17 +0800 Subject: [PATCH 22/49] LF-3271: drm: cdns-hdmi: fix Coverity Issue: 11566407 Delete dead code to fix Coverity Issue: 11566407. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c index dc393f6b75e7..a89c8cba4788 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c @@ -150,7 +150,6 @@ ssize_t HDCPTX_Status_store(struct device *dev, else dev_err(dev, "%s &hdp->state invalid\n", __func__); return -1; - return count; } static void hdmi_sink_config(struct cdns_mhdp_device *mhdp) -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0023-LF-3270-drm-cdns-hdmi-fix-coverity-Issue-11566405.patch ================================================ From ddfa5aeb97c12fb7a67e6507ef2ae051658f112b Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Wed, 20 Jan 2021 10:49:13 +0800 Subject: [PATCH 23/49] LF-3270: drm: cdns-hdmi: fix coverity Issue: 11566405 Delete unused code to fix coverity Issue: 11566405. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c index a89c8cba4788..2300c3d8a91d 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c @@ -37,17 +37,15 @@ static struct device_attribute HDCPTX_do_reauth = __ATTR_WO(HDCPTX_do_reauth); static ssize_t HDCPTX_do_reauth_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - int value, ret; + int ret; struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); ret = cdns_mhdp_hdcp_tx_reauth(mhdp, 1); - - sscanf(buf, "%d", &value); - if (ret < 0) { dev_err(dev, "%s cdns_mhdp_hdcp_tx_reauth failed\n", __func__); return -1; } + return count; } -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0024-LF-3269-drm-cdns-hdmi-fix-coverity-Issue-11566404.patch ================================================ From 2812d071eb348d903620f7ebadaf848024b3c672 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Wed, 20 Jan 2021 11:04:41 +0800 Subject: [PATCH 24/49] LF-3269: drm: cdns-hdmi: fix coverity Issue: 11566404 Check return value to fix coverity Issue: 11566404. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c index 2300c3d8a91d..df8ac87b3a54 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c @@ -59,9 +59,12 @@ static ssize_t HDCPTX_Version_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); - int value; + int value, ret; + + ret = sscanf(buf, "%d", &value); + if (ret != 1) + return -EINVAL; - sscanf(buf, "%d", &value); if (value == 2) mhdp->hdcp.config = 2; else if (value == 1) -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0025-LF-3268-drm-cdns-hdmi-fix-Coverity-Issue-11566403.patch ================================================ From cd49375db5c05acb824fa18ae9d19290073cda08 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Wed, 20 Jan 2021 11:07:32 +0800 Subject: [PATCH 25/49] LF-3268: drm: cdns-hdmi: fix Coverity Issue: 11566403 Check return value to fix Coverity Issue: 11566403. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c index df8ac87b3a54..28193178140f 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c @@ -119,10 +119,13 @@ ssize_t HDCPTX_Status_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct cdns_mhdp_device *mhdp = dev_get_drvdata(dev); - int value; + int value, ret; if (count == 2) { - sscanf(buf, "%d", &value); + ret = sscanf(buf, "%d", &value); + if (ret != 1) + return -EINVAL; + if ((value >= HDCP_STATE_NO_AKSV) && (value <= HDCP_STATE_AUTH_FAILED)) { mhdp->hdcp.state = value; return count; -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0026-LF-3367-1-drm-cdns_hdmi-HDCP_STATE_DISABLING-may-mis.patch ================================================ From 54a5d4d3ba2de923fa4a4e5ef5e90151fb7f2fd8 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Thu, 18 Feb 2021 16:25:52 +0800 Subject: [PATCH 26/49] LF-3367-1: drm: cdns_hdmi: HDCP_STATE_DISABLING may missed by check link Polling thread check_work is designed to handle all hdcp state change. In HDCP disable function, check_work thread will be stopped after hdcp.state is set to HDCP_STATE_DISABLING. check_work thread may miss the state change, call check link function make sure HDCP_STATE_DISABLING state is properly handled. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> Acked-by: Jason Liu <jason.hui.liu@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c index e2a3bc7fb42b..9119f2063098 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c @@ -988,6 +988,8 @@ int cdns_hdmi_hdcp_disable(struct cdns_mhdp_device *mhdp) { int ret = 0; + cancel_delayed_work_sync(&mhdp->hdcp.check_work); + mutex_lock(&mhdp->hdcp.mutex); if (mhdp->hdcp.value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) { mhdp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_UNDESIRED; @@ -998,7 +1000,8 @@ int cdns_hdmi_hdcp_disable(struct cdns_mhdp_device *mhdp) mutex_unlock(&mhdp->hdcp.mutex); - cancel_delayed_work_sync(&mhdp->hdcp.check_work); + /* Make sure HDCP_STATE_DISABLING state is handled */ + hdmi_hdcp_check_link(mhdp); return ret; } -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0027-LF-3367-2-drm-mhdp-more-time-for-FW-alive-check.patch ================================================ From 42394af5975326eb20901d65eac47963847006e2 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Fri, 19 Feb 2021 16:41:31 +0800 Subject: [PATCH 27/49] LF-3367-2: drm: mhdp: more time for FW alive check FW alive check function may return false in hdcp enable/disable stress test. Add more time for FW alive check, make sure get correct state. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> Acked-by: Jason Liu <jason.hui.liu@nxp.com> --- drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c index 2a8ab0872f25..3487a2fa335c 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c @@ -142,7 +142,7 @@ bool cdns_mhdp_check_alive(struct cdns_mhdp_device *mhdp) alive = cdns_mhdp_bus_read(mhdp, KEEP_ALIVE); while (retries_left--) { - udelay(2); + msleep(1); newalive = cdns_mhdp_bus_read(mhdp, KEEP_ALIVE); if (alive == newalive) -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0028-LF-3367-3-drm-mhdp-hdcp-adjust-state-handle-priority.patch ================================================ From 60f6b8c90766663303f6005468502798eb2b0f44 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Fri, 19 Feb 2021 17:53:54 +0800 Subject: [PATCH 28/49] LF-3367-3: drm: mhdp-hdcp: adjust state handle priority Handle HDCP_STATE_INACTIVE and HDCP_STATE_DISABLING state priority to avoid unnecessary HPD state check, drm has check it when hdcp enable/disable. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> Acked-by: Jason Liu <jason.hui.liu@nxp.com> --- .../gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c index 9119f2063098..5dfbd7943306 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c @@ -1048,6 +1048,15 @@ static int hdmi_hdcp_check_link(struct cdns_mhdp_device *mhdp) mhdp->hdcp.reauth_in_progress = 0; mutex_lock(&mhdp->lock); + if (mhdp->hdcp.state == HDCP_STATE_INACTIVE) + goto out; + + if (mhdp->hdcp.state == HDCP_STATE_DISABLING) { + _hdmi_hdcp_disable(mhdp); + mhdp->hdcp.state = HDCP_STATE_INACTIVE; + goto out; + } + if ((mhdp->hdcp.state == HDCP_STATE_AUTHENTICATED) || (mhdp->hdcp.state == HDCP_STATE_AUTHENTICATING) || (mhdp->hdcp.state == HDCP_STATE_REAUTHENTICATING) || @@ -1056,18 +1065,11 @@ static int hdmi_hdcp_check_link(struct cdns_mhdp_device *mhdp) /* In active states, check the HPD signal. Because of the IRQ * debounce delay, the state might not reflect the disconnection. * The FW could already have detected the HDP down and reported error */ - hpd_sts = cdns_mhdp_read_hpd(mhdp); - if (1 != hpd_sts) + hpd_sts = cdns_mhdp_read_hpd(mhdp); + if (1 != hpd_sts) { mhdp->hdcp.state = HDCP_STATE_DISABLING; - } - - if (mhdp->hdcp.state == HDCP_STATE_INACTIVE) - goto out; - - if (mhdp->hdcp.state == HDCP_STATE_DISABLING) { - _hdmi_hdcp_disable(mhdp); - mhdp->hdcp.state = HDCP_STATE_INACTIVE; - goto out; + goto out; + } } /* TODO items: -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0029-clk-imx8mq-add-27MHz-PHY-ref-clock.patch ================================================ From afbe8e0ae318f407d64bbc48b784d93c782b6564 Mon Sep 17 00:00:00 2001 From: Laurentiu Palcu <laurentiu.palcu@nxp.com> Date: Thu, 5 Sep 2019 13:07:22 +0300 Subject: [PATCH 29/49] clk: imx8mq: add 27MHz PHY ref clock This clock is a high precision clock on imx8mq-evk board that will be used by HDMI phy. Signed-off-by: Laurentiu Palcu <laurentiu.palcu@nxp.com> --- drivers/clk/imx/clk-imx8mq.c | 3 ++- include/dt-bindings/clock/imx8mq-clock.h | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/clk/imx/clk-imx8mq.c b/drivers/clk/imx/clk-imx8mq.c index 06292d4a98ff..6bd2fe0ae71d 100644 --- a/drivers/clk/imx/clk-imx8mq.c +++ b/drivers/clk/imx/clk-imx8mq.c @@ -304,6 +304,7 @@ static int imx8mq_clocks_probe(struct platform_device *pdev) hws[IMX8MQ_CLK_EXT2] = imx_obtain_fixed_clk_hw(np, "clk_ext2"); hws[IMX8MQ_CLK_EXT3] = imx_obtain_fixed_clk_hw(np, "clk_ext3"); hws[IMX8MQ_CLK_EXT4] = imx_obtain_fixed_clk_hw(np, "clk_ext4"); + hws[IMX8MQ_CLK_PHY_27MHZ] = imx_obtain_fixed_clk_hw(np, "hdmi_phy_27m"); np = of_find_compatible_node(NULL, NULL, "fsl,imx8mq-anatop"); base = of_iomap(np, 0); diff --git a/include/dt-bindings/clock/imx8mq-clock.h b/include/dt-bindings/clock/imx8mq-clock.h index 9b8045d75b8b..2a81f96b7c74 100644 --- a/include/dt-bindings/clock/imx8mq-clock.h +++ b/include/dt-bindings/clock/imx8mq-clock.h @@ -431,6 +431,7 @@ #define IMX8MQ_CLK_MON_SEL 301 #define IMX8MQ_CLK_MON_CLK2_OUT 302 +#define IMX8MQ_CLK_PHY_27MHZ 303 -#define IMX8MQ_CLK_END 303 +#define IMX8MQ_CLK_END 304 #endif /* __DT_BINDINGS_CLOCK_IMX8MQ_H */ -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0030-drm-imx-Add-mhdp-dp-hdmi-driver-for-imx8x-platform.patch ================================================ From 09102ec28d08ae95d476ee241ed016d2fe9da894 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Mon, 20 Apr 2020 22:47:36 +0800 Subject: [PATCH 30/49] drm: imx: Add mhdp dp/hdmi driver for imx8x platform Added i.MX8MQ HDMI/DP driver. Added i.MX8MQ HDMI/DP driver. Added LS1028A DP driver. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> --- drivers/gpu/drm/imx/Kconfig | 1 + drivers/gpu/drm/imx/Makefile | 1 + drivers/gpu/drm/imx/mhdp/Kconfig | 11 + drivers/gpu/drm/imx/mhdp/Makefile | 5 + drivers/gpu/drm/imx/mhdp/cdns-mhdp-dp-phy.c | 531 ++++++++++++ drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c | 764 ++++++++++++++++++ drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx.h | 75 ++ drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c | 638 +++++++++++++++ drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c | 257 ++++++ drivers/gpu/drm/imx/mhdp/cdns-mhdp-ls1028a.c | 110 +++ drivers/gpu/drm/imx/mhdp/cdns-mhdp-phy.h | 155 ++++ 11 files changed, 2548 insertions(+) create mode 100644 drivers/gpu/drm/imx/mhdp/Kconfig create mode 100644 drivers/gpu/drm/imx/mhdp/Makefile create mode 100644 drivers/gpu/drm/imx/mhdp/cdns-mhdp-dp-phy.c create mode 100644 drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c create mode 100644 drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx.h create mode 100644 drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c create mode 100644 drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c create mode 100644 drivers/gpu/drm/imx/mhdp/cdns-mhdp-ls1028a.c create mode 100644 drivers/gpu/drm/imx/mhdp/cdns-mhdp-phy.h diff --git a/drivers/gpu/drm/imx/Kconfig b/drivers/gpu/drm/imx/Kconfig index 6231048aa5aa..4af2f575f04b 100644 --- a/drivers/gpu/drm/imx/Kconfig +++ b/drivers/gpu/drm/imx/Kconfig @@ -41,3 +41,4 @@ config DRM_IMX_HDMI Choose this if you want to use HDMI on i.MX6. source "drivers/gpu/drm/imx/dcss/Kconfig" +source "drivers/gpu/drm/imx/mhdp/Kconfig" diff --git a/drivers/gpu/drm/imx/Makefile b/drivers/gpu/drm/imx/Makefile index b644deffe948..0b46c46b19a8 100644 --- a/drivers/gpu/drm/imx/Makefile +++ b/drivers/gpu/drm/imx/Makefile @@ -10,3 +10,4 @@ obj-$(CONFIG_DRM_IMX_LDB) += imx-ldb.o obj-$(CONFIG_DRM_IMX_HDMI) += dw_hdmi-imx.o obj-$(CONFIG_DRM_IMX_DCSS) += dcss/ +obj-$(CONFIG_DRM_IMX_CDNS_MHDP) += mhdp/ diff --git a/drivers/gpu/drm/imx/mhdp/Kconfig b/drivers/gpu/drm/imx/mhdp/Kconfig new file mode 100644 index 000000000000..86950badb947 --- /dev/null +++ b/drivers/gpu/drm/imx/mhdp/Kconfig @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-2.0-only + +config DRM_IMX_CDNS_MHDP + tristate "NXP i.MX MX8 DRM HDMI/DP" + select DRM_CDNS_MHDP + select DRM_CDNS_DP + select DRM_CDNS_HDMI + select DRM_CDNS_AUDIO + depends on DRM_IMX + help + Choose this if you want to use HDMI on i.MX8. diff --git a/drivers/gpu/drm/imx/mhdp/Makefile b/drivers/gpu/drm/imx/mhdp/Makefile new file mode 100644 index 000000000000..235fa2d515e9 --- /dev/null +++ b/drivers/gpu/drm/imx/mhdp/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0 + +cdns_mhdp_imx-objs := cdns-mhdp-imxdrv.o cdns-mhdp-dp-phy.o \ + cdns-mhdp-hdmi-phy.o cdns-mhdp-imx8qm.o cdns-mhdp-ls1028a.o +obj-$(CONFIG_DRM_IMX_CDNS_MHDP) += cdns_mhdp_imx.o diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-dp-phy.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-dp-phy.c new file mode 100644 index 000000000000..a6d03c94d196 --- /dev/null +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-dp-phy.c @@ -0,0 +1,531 @@ +/* + * Cadence Display Port Interface (DP) PHY driver + * + * Copyright (C) 2019 NXP Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + */ +#include <linux/clk.h> +#include <linux/kernel.h> +#include <drm/display/drm_dp_helper.h> +#include <drm/bridge/cdns-mhdp.h> +#include "cdns-mhdp-phy.h" + +enum dp_link_rate { + RATE_1_6 = 162000, + RATE_2_1 = 216000, + RATE_2_4 = 243000, + RATE_2_7 = 270000, + RATE_3_2 = 324000, + RATE_4_3 = 432000, + RATE_5_4 = 540000, + RATE_8_1 = 810000, +}; + +struct phy_pll_reg { + u16 val[7]; + u32 addr; +}; + +static const struct phy_pll_reg phy_pll_27m_cfg[] = { + /* 1.62 2.16 2.43 2.7 3.24 4.32 5.4 register address */ + {{ 0x010E, 0x010E, 0x010E, 0x010E, 0x010E, 0x010E, 0x010E }, CMN_PLL0_VCOCAL_INIT_TMR }, + {{ 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B }, CMN_PLL0_VCOCAL_ITER_TMR }, + {{ 0x30B9, 0x3087, 0x3096, 0x30B4, 0x30B9, 0x3087, 0x30B4 }, CMN_PLL0_VCOCAL_START }, + {{ 0x0077, 0x009F, 0x00B3, 0x00C7, 0x0077, 0x009F, 0x00C7 }, CMN_PLL0_INTDIV }, + {{ 0xF9DA, 0xF7CD, 0xF6C7, 0xF5C1, 0xF9DA, 0xF7CD, 0xF5C1 }, CMN_PLL0_FRACDIV }, + {{ 0x001E, 0x0028, 0x002D, 0x0032, 0x001E, 0x0028, 0x0032 }, CMN_PLL0_HIGH_THR }, + {{ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020 }, CMN_PLL0_DSM_DIAG }, + {{ 0x0000, 0x1000, 0x1000, 0x1000, 0x0000, 0x1000, 0x1000 }, CMN_PLLSM0_USER_DEF_CTRL }, + {{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, CMN_DIAG_PLL0_OVRD }, + {{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, CMN_DIAG_PLL0_FBH_OVRD }, + {{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, CMN_DIAG_PLL0_FBL_OVRD }, + {{ 0x0006, 0x0007, 0x0007, 0x0007, 0x0006, 0x0007, 0x0007 }, CMN_DIAG_PLL0_V2I_TUNE }, + {{ 0x0043, 0x0043, 0x0043, 0x0042, 0x0043, 0x0043, 0x0042 }, CMN_DIAG_PLL0_CP_TUNE }, + {{ 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008 }, CMN_DIAG_PLL0_LF_PROG }, + {{ 0x0100, 0x0001, 0x0001, 0x0001, 0x0100, 0x0001, 0x0001 }, CMN_DIAG_PLL0_PTATIS_TUNE1 }, + {{ 0x0007, 0x0001, 0x0001, 0x0001, 0x0007, 0x0001, 0x0001 }, CMN_DIAG_PLL0_PTATIS_TUNE2 }, + {{ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020 }, CMN_DIAG_PLL0_TEST_MODE}, + {{ 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016 }, CMN_PSM_CLK_CTRL } +}; + +static const struct phy_pll_reg phy_pll_24m_cfg[] = { + /* 1.62 2.16 2.43 2.7 3.24 4.32 5.4 register address */ + {{ 0x00F0, 0x00F0, 0x00F0, 0x00F0, 0x00F0, 0x00F0, 0x00F0 }, CMN_PLL0_VCOCAL_INIT_TMR }, + {{ 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018 }, CMN_PLL0_VCOCAL_ITER_TMR }, + {{ 0x3061, 0x3092, 0x30B3, 0x30D0, 0x3061, 0x3092, 0x30D0 }, CMN_PLL0_VCOCAL_START }, + {{ 0x0086, 0x00B3, 0x00CA, 0x00E0, 0x0086, 0x00B3, 0x00E0 }, CMN_PLL0_INTDIV }, + {{ 0xF917, 0xF6C7, 0x75A1, 0xF479, 0xF917, 0xF6C7, 0xF479 }, CMN_PLL0_FRACDIV }, + {{ 0x0022, 0x002D, 0x0033, 0x0038, 0x0022, 0x002D, 0x0038 }, CMN_PLL0_HIGH_THR }, + {{ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020 }, CMN_PLL0_DSM_DIAG }, + {{ 0x0000, 0x1000, 0x1000, 0x1000, 0x0000, 0x1000, 0x1000 }, CMN_PLLSM0_USER_DEF_CTRL }, + {{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, CMN_DIAG_PLL0_OVRD }, + {{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, CMN_DIAG_PLL0_FBH_OVRD }, + {{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, CMN_DIAG_PLL0_FBL_OVRD }, + {{ 0x0006, 0x0007, 0x0007, 0x0007, 0x0006, 0x0007, 0x0007 }, CMN_DIAG_PLL0_V2I_TUNE }, + {{ 0x0026, 0x0029, 0x0029, 0x0029, 0x0026, 0x0029, 0x0029 }, CMN_DIAG_PLL0_CP_TUNE }, + {{ 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008 }, CMN_DIAG_PLL0_LF_PROG }, + {{ 0x008C, 0x008C, 0x008C, 0x008C, 0x008C, 0x008C, 0x008C }, CMN_DIAG_PLL0_PTATIS_TUNE1 }, + {{ 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E }, CMN_DIAG_PLL0_PTATIS_TUNE2 }, + {{ 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022 }, CMN_DIAG_PLL0_TEST_MODE}, + {{ 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016 }, CMN_PSM_CLK_CTRL } +}; + +static int link_rate_index(u32 rate) +{ + switch (rate) { + case RATE_1_6: + return 0; + case RATE_2_1: + return 1; + case RATE_2_4: + return 2; + case RATE_2_7: + return 3; + case RATE_3_2: + return 4; + case RATE_4_3: + return 5; + case RATE_5_4: + return 6; + default: + return -1; + } +} + +static void dp_aux_cfg(struct cdns_mhdp_device *mhdp) +{ + /* Power up Aux */ + cdns_phy_reg_write(mhdp, TXDA_CYA_AUXDA_CYA, 1); + + cdns_phy_reg_write(mhdp, TX_DIG_CTRL_REG_1, 0x3); + ndelay(150); + cdns_phy_reg_write(mhdp, TX_DIG_CTRL_REG_2, 36); + ndelay(150); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_2, 0x0100); + ndelay(150); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_2, 0x0300); + ndelay(150); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_3, 0x0000); + ndelay(150); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_1, 0x2008); + ndelay(150); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_1, 0x2018); + ndelay(150); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_1, 0xA018); + ndelay(150); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_2, 0x030C); + ndelay(150); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_5, 0x0000); + ndelay(150); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_4, 0x1001); + ndelay(150); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_1, 0xA098); + ndelay(150); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_1, 0xA198); + ndelay(150); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_2, 0x030d); + ndelay(150); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_2, 0x030f); +} + +/* PMA common configuration for 24MHz */ +static void dp_phy_pma_cmn_cfg_24mhz(struct cdns_mhdp_device *mhdp) +{ + int k; + u32 num_lanes = mhdp->dp.num_lanes; + u16 val; + + val = cdns_phy_reg_read(mhdp, PHY_PMA_CMN_CTRL1); + val &= 0xFFF7; + val |= 0x0008; + cdns_phy_reg_write(mhdp, PHY_PMA_CMN_CTRL1, val); + + for (k = 0; k < num_lanes; k++) { + /* Transceiver control and diagnostic registers */ + cdns_phy_reg_write(mhdp, XCVR_DIAG_LANE_FCM_EN_MGN_TMR | (k << 9), 0x0090); + /* Transmitter receiver detect registers */ + cdns_phy_reg_write(mhdp, TX_RCVDET_EN_TMR | (k << 9), 0x0960); + cdns_phy_reg_write(mhdp, TX_RCVDET_ST_TMR | (k << 9), 0x0030); + } +} + +/* Valid for 24 MHz only */ +static void dp_phy_pma_cmn_pll0_24mhz(struct cdns_mhdp_device *mhdp) +{ + u32 num_lanes = mhdp->dp.num_lanes; + u32 link_rate = mhdp->dp.rate; + u16 val; + int index, i, k; + + /* + * PLL reference clock source select + * for single ended reference clock val |= 0x0030; + * for differential clock val |= 0x0000; + */ + val = cdns_phy_reg_read(mhdp, PHY_PMA_CMN_CTRL1); + val = val & 0xFF8F; + val = val | 0x0030; + cdns_phy_reg_write(mhdp, PHY_PMA_CMN_CTRL1, val); + + /* DP PLL data rate 0/1 clock divider value */ + val = cdns_phy_reg_read(mhdp, PHY_HDP_CLK_CTL); + val &= 0x00FF; + if (link_rate <= RATE_2_7) + val |= 0x2400; + else + val |= 0x1200; + cdns_phy_reg_write(mhdp, PHY_HDP_CLK_CTL, val); + + /* High speed clock 0/1 div */ + val = cdns_phy_reg_read(mhdp, CMN_DIAG_HSCLK_SEL); + val &= 0xFFCC; + if (link_rate <= RATE_2_7) + val |= 0x0011; + cdns_phy_reg_write(mhdp, CMN_DIAG_HSCLK_SEL, val); + + for (k = 0; k < num_lanes; k = k + 1) { + val = cdns_phy_reg_read(mhdp, (XCVR_DIAG_HSCLK_SEL | (k << 9))); + val &= 0xCFFF; + if (link_rate <= RATE_2_7) + val |= 0x1000; + cdns_phy_reg_write(mhdp, (XCVR_DIAG_HSCLK_SEL | (k << 9)), val); + } + + /* DP PHY PLL 24MHz configuration */ + index = link_rate_index(link_rate); + for (i = 0; i < ARRAY_SIZE(phy_pll_24m_cfg); i++) + cdns_phy_reg_write(mhdp, phy_pll_24m_cfg[i].addr, phy_pll_24m_cfg[i].val[index]); + + /* Transceiver control and diagnostic registers */ + for (k = 0; k < num_lanes; k = k + 1) { + val = cdns_phy_reg_read(mhdp, (XCVR_DIAG_PLLDRC_CTRL | (k << 9))); + val &= 0x8FFF; + if (link_rate <= RATE_2_7) + val |= 0x2000; + else + val |= 0x1000; + cdns_phy_reg_write(mhdp, (XCVR_DIAG_PLLDRC_CTRL | (k << 9)), val); + } + + for (k = 0; k < num_lanes; k = k + 1) { + cdns_phy_reg_write(mhdp, (XCVR_PSM_RCTRL | (k << 9)), 0xBEFC); + cdns_phy_reg_write(mhdp, (TX_PSC_A0 | (k << 9)), 0x6799); + cdns_phy_reg_write(mhdp, (TX_PSC_A1 | (k << 9)), 0x6798); + cdns_phy_reg_write(mhdp, (TX_PSC_A2 | (k << 9)), 0x0098); + cdns_phy_reg_write(mhdp, (TX_PSC_A3 | (k << 9)), 0x0098); + } +} + +/* PMA common configuration for 27MHz */ +static void dp_phy_pma_cmn_cfg_27mhz(struct cdns_mhdp_device *mhdp) +{ + u32 num_lanes = mhdp->dp.num_lanes; + u16 val; + int k; + + val = cdns_phy_reg_read(mhdp, PHY_PMA_CMN_CTRL1); + val &= 0xFFF7; + val |= 0x0008; + cdns_phy_reg_write(mhdp, PHY_PMA_CMN_CTRL1, val); + + /* Startup state machine registers */ + cdns_phy_reg_write(mhdp, CMN_SSM_BIAS_TMR, 0x0087); + cdns_phy_reg_write(mhdp, CMN_PLLSM0_PLLEN_TMR, 0x001B); + cdns_phy_reg_write(mhdp, CMN_PLLSM0_PLLPRE_TMR, 0x0036); + cdns_phy_reg_write(mhdp, CMN_PLLSM0_PLLVREF_TMR, 0x001B); + cdns_phy_reg_write(mhdp, CMN_PLLSM0_PLLLOCK_TMR, 0x006C); + + /* Current calibration registers */ + cdns_phy_reg_write(mhdp, CMN_ICAL_INIT_TMR, 0x0044); + cdns_phy_reg_write(mhdp, CMN_ICAL_ITER_TMR, 0x0006); + cdns_phy_reg_write(mhdp, CMN_ICAL_ADJ_INIT_TMR, 0x0022); + cdns_phy_reg_write(mhdp, CMN_ICAL_ADJ_ITER_TMR, 0x0006); + + /* Resistor calibration registers */ + cdns_phy_reg_write(mhdp, CMN_TXPUCAL_INIT_TMR, 0x0022); + cdns_phy_reg_write(mhdp, CMN_TXPUCAL_ITER_TMR, 0x0006); + cdns_phy_reg_write(mhdp, CMN_TXPU_ADJ_INIT_TMR, 0x0022); + cdns_phy_reg_write(mhdp, CMN_TXPU_ADJ_ITER_TMR, 0x0006); + cdns_phy_reg_write(mhdp, CMN_TXPDCAL_INIT_TMR, 0x0022); + cdns_phy_reg_write(mhdp, CMN_TXPDCAL_ITER_TMR, 0x0006); + cdns_phy_reg_write(mhdp, CMN_TXPD_ADJ_INIT_TMR, 0x0022); + cdns_phy_reg_write(mhdp, CMN_TXPD_ADJ_ITER_TMR, 0x0006); + cdns_phy_reg_write(mhdp, CMN_RXCAL_INIT_TMR, 0x0022); + cdns_phy_reg_write(mhdp, CMN_RXCAL_ITER_TMR, 0x0006); + cdns_phy_reg_write(mhdp, CMN_RX_ADJ_INIT_TMR, 0x0022); + cdns_phy_reg_write(mhdp, CMN_RX_ADJ_ITER_TMR, 0x0006); + + for (k = 0; k < num_lanes; k = k + 1) { + /* Power state machine registers */ + cdns_phy_reg_write(mhdp, XCVR_PSM_CAL_TMR | (k << 9), 0x016D); + cdns_phy_reg_write(mhdp, XCVR_PSM_A0IN_TMR | (k << 9), 0x016D); + /* Transceiver control and diagnostic registers */ + cdns_phy_reg_write(mhdp, XCVR_DIAG_LANE_FCM_EN_MGN_TMR | (k << 9), 0x00A2); + cdns_phy_reg_write(mhdp, TX_DIAG_BGREF_PREDRV_DELAY | (k << 9), 0x0097); + /* Transmitter receiver detect registers */ + cdns_phy_reg_write(mhdp, TX_RCVDET_EN_TMR | (k << 9), 0x0A8C); + cdns_phy_reg_write(mhdp, TX_RCVDET_ST_TMR | (k << 9), 0x0036); + } +} + +static void dp_phy_pma_cmn_pll0_27mhz(struct cdns_mhdp_device *mhdp) +{ + u32 num_lanes = mhdp->dp.num_lanes; + u32 link_rate = mhdp->dp.rate; + u16 val; + int index, i, k; + + /* + * PLL reference clock source select + * for single ended reference clock val |= 0x0030; + * for differential clock val |= 0x0000; + */ + val = cdns_phy_reg_read(mhdp, PHY_PMA_CMN_CTRL1); + val &= 0xFF8F; + cdns_phy_reg_write(mhdp, PHY_PMA_CMN_CTRL1, val); + + /* for differential clock on the refclk_p and refclk_m off chip pins: + * CMN_DIAG_ACYA[8]=1'b1 + */ + cdns_phy_reg_write(mhdp, CMN_DIAG_ACYA, 0x0100); + + /* DP PLL data rate 0/1 clock divider value */ + val = cdns_phy_reg_read(mhdp, PHY_HDP_CLK_CTL); + val &= 0x00FF; + if (link_rate <= RATE_2_7) + val |= 0x2400; + else + val |= 0x1200; + cdns_phy_reg_write(mhdp, PHY_HDP_CLK_CTL, val); + + /* High speed clock 0/1 div */ + val = cdns_phy_reg_read(mhdp, CMN_DIAG_HSCLK_SEL); + val &= 0xFFCC; + if (link_rate <= RATE_2_7) + val |= 0x0011; + cdns_phy_reg_write(mhdp, CMN_DIAG_HSCLK_SEL, val); + + for (k = 0; k < num_lanes; k++) { + val = cdns_phy_reg_read(mhdp, (XCVR_DIAG_HSCLK_SEL | (k << 9))); + val = val & 0xCFFF; + if (link_rate <= RATE_2_7) + val |= 0x1000; + cdns_phy_reg_write(mhdp, (XCVR_DIAG_HSCLK_SEL | (k << 9)), val); + } + + /* DP PHY PLL 27MHz configuration */ + index = link_rate_index(link_rate); + for (i = 0; i < ARRAY_SIZE(phy_pll_27m_cfg); i++) + cdns_phy_reg_write(mhdp, phy_pll_27m_cfg[i].addr, phy_pll_27m_cfg[i].val[index]); + + /* Transceiver control and diagnostic registers */ + for (k = 0; k < num_lanes; k++) { + val = cdns_phy_reg_read(mhdp, (XCVR_DIAG_PLLDRC_CTRL | (k << 9))); + val = val & 0x8FFF; + if (link_rate <= RATE_2_7) + val |= 0x2000; + else + val |= 0x1000; + cdns_phy_reg_write(mhdp, (XCVR_DIAG_PLLDRC_CTRL | (k << 9)), val); + } + + for (k = 0; k < num_lanes; k = k + 1) { + /* Power state machine registers */ + cdns_phy_reg_write(mhdp, (XCVR_PSM_RCTRL | (k << 9)), 0xBEFC); + cdns_phy_reg_write(mhdp, (TX_PSC_A0 | (k << 9)), 0x6799); + cdns_phy_reg_write(mhdp, (TX_PSC_A1 | (k << 9)), 0x6798); + cdns_phy_reg_write(mhdp, (TX_PSC_A2 | (k << 9)), 0x0098); + cdns_phy_reg_write(mhdp, (TX_PSC_A3 | (k << 9)), 0x0098); + /* Receiver calibration power state definition register */ + val = cdns_phy_reg_read(mhdp, RX_PSC_CAL | (k << 9)); + val &= 0xFFBB; + cdns_phy_reg_write(mhdp, (RX_PSC_CAL | (k << 9)), val); + val = cdns_phy_reg_read(mhdp, RX_PSC_A0 | (k << 9)); + val &= 0xFFBB; + cdns_phy_reg_write(mhdp, (RX_PSC_A0 | (k << 9)), val); + } +} + +static void dp_phy_power_down(struct cdns_mhdp_device *mhdp) +{ + u16 val; + int i; + + if (!mhdp->power_up) + return; + + /* Place the PHY lanes in the A3 power state. */ + cdns_phy_reg_write(mhdp, PHY_HDP_MODE_CTRL, 0x8); + /* Wait for Power State A3 Ack */ + for (i = 0; i < 10; i++) { + val = cdns_phy_reg_read(mhdp, PHY_HDP_MODE_CTRL); + if (val & (1 << 7)) + break; + msleep(20); + } + if (i == 10) { + dev_err(mhdp->dev, "Wait A3 Ack failed\n"); + return; + } + + /* Disable HDP PLL’s data rate and full rate clocks out of PMA. */ + val = cdns_phy_reg_read(mhdp, PHY_HDP_CLK_CTL); + val &= ~(1 << 2); + cdns_phy_reg_write(mhdp, PHY_HDP_CLK_CTL, val); + /* Wait for PLL clock gate ACK */ + for (i = 0; i < 10; i++) { + val = cdns_phy_reg_read(mhdp, PHY_HDP_CLK_CTL); + if (!(val & (1 << 3))) + break; + msleep(20); + } + if (i == 10) { + dev_err(mhdp->dev, "Wait PLL clock gate Ack failed\n"); + return; + } + + /* Disable HDP PLL’s for high speed clocks */ + val = cdns_phy_reg_read(mhdp, PHY_HDP_CLK_CTL); + val &= ~(1 << 0); + cdns_phy_reg_write(mhdp, PHY_HDP_CLK_CTL, val); + /* Wait for PLL disable ACK */ + for (i = 0; i < 10; i++) { + val = cdns_phy_reg_read(mhdp, PHY_HDP_CLK_CTL); + if (!(val & (1 << 1))) + break; + msleep(20); + } + if (i == 10) { + dev_err(mhdp->dev, "Wait PLL disable Ack failed\n"); + return; + } +} + +static int dp_phy_power_up(struct cdns_mhdp_device *mhdp) +{ + u32 val, i; + + /* Enable HDP PLL’s for high speed clocks */ + val = cdns_phy_reg_read(mhdp, PHY_HDP_CLK_CTL); + val |= (1 << 0); + cdns_phy_reg_write(mhdp, PHY_HDP_CLK_CTL, val); + /* Wait for PLL ready ACK */ + for (i = 0; i < 10; i++) { + val = cdns_phy_reg_read(mhdp, PHY_HDP_CLK_CTL); + if (val & (1 << 1)) + break; + msleep(20); + } + if (i == 10) { + dev_err(mhdp->dev, "Wait PLL Ack failed\n"); + return -1; + } + + /* Enable HDP PLL’s data rate and full rate clocks out of PMA. */ + val = cdns_phy_reg_read(mhdp, PHY_HDP_CLK_CTL); + val |= (1 << 2); + cdns_phy_reg_write(mhdp, PHY_HDP_CLK_CTL, val); + /* Wait for PLL clock enable ACK */ + for (i = 0; i < 10; i++) { + val = cdns_phy_reg_read(mhdp, PHY_HDP_CLK_CTL); + if (val & (1 << 3)) + break; + msleep(20); + } + if (i == 10) { + dev_err(mhdp->dev, "Wait PLL clock enable ACk failed\n"); + return -1; + } + + /* Configure PHY in A2 Mode */ + cdns_phy_reg_write(mhdp, PHY_HDP_MODE_CTRL, 0x0004); + /* Wait for Power State A2 Ack */ + for (i = 0; i < 10; i++) { + val = cdns_phy_reg_read(mhdp, PHY_HDP_MODE_CTRL); + if (val & (1 << 6)) + break; + msleep(20); + } + if (i == 10) { + dev_err(mhdp->dev, "Wait A2 Ack failed\n"); + return -1; + } + + /* Configure PHY in A0 mode (PHY must be in the A0 power + * state in order to transmit data) + */ + cdns_phy_reg_write(mhdp, PHY_HDP_MODE_CTRL, 0x0101); + + /* Wait for Power State A0 Ack */ + for (i = 0; i < 10; i++) { + val = cdns_phy_reg_read(mhdp, PHY_HDP_MODE_CTRL); + if (val & (1 << 4)) + break; + msleep(20); + } + if (i == 10) { + dev_err(mhdp->dev, "Wait A0 Ack failed\n"); + return -1; + } + + mhdp->power_up = true; + + return 0; +} + +int cdns_dp_phy_set_imx8mq(struct cdns_mhdp_device *mhdp) +{ + int ret; + + /* Disable phy clock if PHY in power up state */ + dp_phy_power_down(mhdp); + + dp_phy_pma_cmn_cfg_27mhz(mhdp); + + dp_phy_pma_cmn_pll0_27mhz(mhdp); + + cdns_phy_reg_write(mhdp, TX_DIAG_ACYA_0, 1); + cdns_phy_reg_write(mhdp, TX_DIAG_ACYA_1, 1); + cdns_phy_reg_write(mhdp, TX_DIAG_ACYA_2, 1); + cdns_phy_reg_write(mhdp, TX_DIAG_ACYA_3, 1); + + /* PHY power up */ + ret = dp_phy_power_up(mhdp); + if (ret < 0) + return ret; + + dp_aux_cfg(mhdp); + + return ret; +} + +int cdns_dp_phy_set_imx8qm(struct cdns_mhdp_device *mhdp) +{ + int ret; + + /* Disable phy clock if PHY in power up state */ + dp_phy_power_down(mhdp); + + dp_phy_pma_cmn_cfg_24mhz(mhdp); + + dp_phy_pma_cmn_pll0_24mhz(mhdp); + + cdns_phy_reg_write(mhdp, TX_DIAG_ACYA_0, 1); + cdns_phy_reg_write(mhdp, TX_DIAG_ACYA_1, 1); + cdns_phy_reg_write(mhdp, TX_DIAG_ACYA_2, 1); + cdns_phy_reg_write(mhdp, TX_DIAG_ACYA_3, 1); + + /* PHY power up */ + ret = dp_phy_power_up(mhdp); + if (ret < 0) + return ret; + + dp_aux_cfg(mhdp); + + return true; +} diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c new file mode 100644 index 000000000000..120300e6a2df --- /dev/null +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c @@ -0,0 +1,764 @@ +/* + * Cadence High-Definition Multimedia Interface (HDMI) driver + * + * Copyright (C) 2019 NXP Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + */ +#include <drm/drm_of.h> +#include <drm/drm_vblank.h> +#include <drm/drm_print.h> +#include <drm/drm_crtc_helper.h> +#include <linux/io.h> +#include <drm/drm_edid.h> +#include <drm/drm_encoder_slave.h> +#include <drm/drm_atomic.h> +#include <linux/io.h> + +#include <drm/bridge/cdns-mhdp.h> +#include "cdns-mhdp-phy.h" + +/* HDMI TX clock control settings */ +struct hdmi_ctrl { + u32 pixel_clk_freq_min; + u32 pixel_clk_freq_max; + u32 feedback_factor; + u32 data_range_kbps_min; + u32 data_range_kbps_max; + u32 cmnda_pll0_ip_div; + u32 cmn_ref_clk_dig_div; + u32 ref_clk_divider_scaler; + u32 pll_fb_div_total; + u32 cmnda_pll0_fb_div_low; + u32 cmnda_pll0_fb_div_high; + u32 pixel_div_total; + u32 cmnda_pll0_pxdiv_low; + u32 cmnda_pll0_pxdiv_high; + u32 vco_freq_min; + u32 vco_freq_max; + u32 vco_ring_select; + u32 cmnda_hs_clk_0_sel; + u32 cmnda_hs_clk_1_sel; + u32 hsclk_div_at_xcvr; + u32 hsclk_div_tx_sub_rate; + u32 cmnda_pll0_hs_sym_div_sel; + u32 cmnda_pll0_clk_freq_min; + u32 cmnda_pll0_clk_freq_max; +}; + +/* HDMI TX clock control settings, pixel clock is output */ +static const struct hdmi_ctrl imx8mq_ctrl_table[] = { +/*Minclk Maxclk Fdbak DR_min DR_max ip_d dig DS Totl */ +{ 27000, 27000, 1000, 270000, 270000, 0x03, 0x1, 0x1, 240, 0x0BC, 0x030, 80, 0x026, 0x026, 2160000, 2160000, 0, 2, 2, 2, 4, 0x3, 27000, 27000}, +{ 27000, 27000, 1250, 337500, 337500, 0x03, 0x1, 0x1, 300, 0x0EC, 0x03C, 100, 0x030, 0x030, 2700000, 2700000, 0, 2, 2, 2, 4, 0x3, 33750, 33750}, +{ 27000, 27000, 1500, 405000, 405000, 0x03, 0x1, 0x1, 360, 0x11C, 0x048, 120, 0x03A, 0x03A, 3240000, 3240000, 0, 2, 2, 2, 4, 0x3, 40500, 40500}, +{ 27000, 27000, 2000, 540000, 540000, 0x03, 0x1, 0x1, 240, 0x0BC, 0x030, 80, 0x026, 0x026, 2160000, 2160000, 0, 2, 2, 2, 4, 0x2, 54000, 54000}, +{ 54000, 54000, 1000, 540000, 540000, 0x03, 0x1, 0x1, 480, 0x17C, 0x060, 80, 0x026, 0x026, 4320000, 4320000, 1, 2, 2, 2, 4, 0x3, 54000, 54000}, +{ 54000, 54000, 1250, 675000, 675000, 0x04, 0x1, 0x1, 400, 0x13C, 0x050, 50, 0x017, 0x017, 2700000, 2700000, 0, 1, 1, 2, 4, 0x2, 67500, 67500}, +{ 54000, 54000, 1500, 810000, 810000, 0x04, 0x1, 0x1, 480, 0x17C, 0x060, 60, 0x01C, 0x01C, 3240000, 3240000, 0, 2, 2, 2, 2, 0x2, 81000, 81000}, +{ 54000, 54000, 2000, 1080000, 1080000, 0x03, 0x1, 0x1, 240, 0x0BC, 0x030, 40, 0x012, 0x012, 2160000, 2160000, 0, 2, 2, 2, 1, 0x1, 108000, 108000}, +{ 74250, 74250, 1000, 742500, 742500, 0x03, 0x1, 0x1, 660, 0x20C, 0x084, 80, 0x026, 0x026, 5940000, 5940000, 1, 2, 2, 2, 4, 0x3, 74250, 74250}, +{ 74250, 74250, 1250, 928125, 928125, 0x04, 0x1, 0x1, 550, 0x1B4, 0x06E, 50, 0x017, 0x017, 3712500, 3712500, 1, 1, 1, 2, 4, 0x2, 92812, 92812}, +{ 74250, 74250, 1500, 1113750, 1113750, 0x04, 0x1, 0x1, 660, 0x20C, 0x084, 60, 0x01C, 0x01C, 4455000, 4455000, 1, 2, 2, 2, 2, 0x2, 111375, 111375}, +{ 74250, 74250, 2000, 1485000, 1485000, 0x03, 0x1, 0x1, 330, 0x104, 0x042, 40, 0x012, 0x012, 2970000, 2970000, 0, 2, 2, 2, 1, 0x1, 148500, 148500}, +{ 99000, 99000, 1000, 990000, 990000, 0x03, 0x1, 0x1, 440, 0x15C, 0x058, 40, 0x012, 0x012, 3960000, 3960000, 1, 2, 2, 2, 2, 0x2, 99000, 99000}, +{ 99000, 99000, 1250, 1237500, 1237500, 0x03, 0x1, 0x1, 275, 0x0D8, 0x037, 25, 0x00B, 0x00A, 2475000, 2475000, 0, 1, 1, 2, 2, 0x1, 123750, 123750}, +{ 99000, 99000, 1500, 1485000, 1485000, 0x03, 0x1, 0x1, 330, 0x104, 0x042, 30, 0x00D, 0x00D, 2970000, 2970000, 0, 2, 2, 2, 1, 0x1, 148500, 148500}, +{ 99000, 99000, 2000, 1980000, 1980000, 0x03, 0x1, 0x1, 440, 0x15C, 0x058, 40, 0x012, 0x012, 3960000, 3960000, 1, 2, 2, 2, 1, 0x1, 198000, 198000}, +{148500, 148500, 1000, 1485000, 1485000, 0x03, 0x1, 0x1, 660, 0x20C, 0x084, 40, 0x012, 0x012, 5940000, 5940000, 1, 2, 2, 2, 2, 0x2, 148500, 148500}, +{148500, 148500, 1250, 1856250, 1856250, 0x04, 0x1, 0x1, 550, 0x1B4, 0x06E, 25, 0x00B, 0x00A, 3712500, 3712500, 1, 1, 1, 2, 2, 0x1, 185625, 185625}, +{148500, 148500, 1500, 2227500, 2227500, 0x03, 0x1, 0x1, 495, 0x188, 0x063, 30, 0x00D, 0x00D, 4455000, 4455000, 1, 1, 1, 2, 2, 0x1, 222750, 222750}, +{148500, 148500, 2000, 2970000, 2970000, 0x03, 0x1, 0x1, 660, 0x20C, 0x084, 40, 0x012, 0x012, 5940000, 5940000, 1, 2, 2, 2, 1, 0x1, 297000, 297000}, +{198000, 198000, 1000, 1980000, 1980000, 0x03, 0x1, 0x1, 220, 0x0AC, 0x02C, 10, 0x003, 0x003, 1980000, 1980000, 0, 1, 1, 2, 1, 0x0, 198000, 198000}, +{198000, 198000, 1250, 2475000, 2475000, 0x03, 0x1, 0x1, 550, 0x1B4, 0x06E, 25, 0x00B, 0x00A, 4950000, 4950000, 1, 1, 1, 2, 2, 0x1, 247500, 247500}, +{198000, 198000, 1500, 2970000, 2970000, 0x03, 0x1, 0x1, 330, 0x104, 0x042, 15, 0x006, 0x005, 2970000, 2970000, 0, 1, 1, 2, 1, 0x0, 297000, 297000}, +{198000, 198000, 2000, 3960000, 3960000, 0x03, 0x1, 0x1, 440, 0x15C, 0x058, 20, 0x008, 0x008, 3960000, 3960000, 1, 1, 1, 2, 1, 0x0, 396000, 396000}, +{297000, 297000, 1000, 2970000, 2970000, 0x03, 0x1, 0x1, 330, 0x104, 0x042, 10, 0x003, 0x003, 2970000, 2970000, 0, 1, 1, 2, 1, 0x0, 297000, 297000}, +{297000, 297000, 1500, 4455000, 4455000, 0x03, 0x1, 0x1, 495, 0x188, 0x063, 15, 0x006, 0x005, 4455000, 4455000, 1, 1, 1, 2, 1, 0x0, 445500, 445500}, +{297000, 297000, 2000, 5940000, 5940000, 0x03, 0x1, 0x1, 660, 0x20C, 0x084, 20, 0x008, 0x008, 5940000, 5940000, 1, 1, 1, 2, 1, 0x0, 594000, 594000}, +{594000, 594000, 1000, 5940000, 5940000, 0x03, 0x1, 0x1, 660, 0x20C, 0x084, 10, 0x003, 0x003, 5940000, 5940000, 1, 1, 1, 2, 1, 0x0, 594000, 594000}, +{594000, 594000, 750, 4455000, 4455000, 0x03, 0x1, 0x1, 495, 0x188, 0x063, 10, 0x003, 0x003, 4455000, 4455000, 1, 1, 1, 2, 1, 0x0, 445500, 445500}, +{594000, 594000, 625, 3712500, 3712500, 0x04, 0x1, 0x1, 550, 0x1B4, 0x06E, 10, 0x003, 0x003, 3712500, 3712500, 1, 1, 1, 2, 1, 0x0, 371250, 371250}, +{594000, 594000, 500, 2970000, 2970000, 0x03, 0x1, 0x1, 660, 0x20C, 0x084, 10, 0x003, 0x003, 5940000, 5940000, 1, 1, 1, 2, 2, 0x1, 297000, 297000}, +}; + +/* HDMI TX clock control settings, pixel clock is input */ +static const struct hdmi_ctrl imx8qm_ctrl_table[] = { +/*pclk_l pclk_h fd DRR_L DRR_H PLLD */ +{ 25000, 42500, 1000, 250000, 425000, 0x05, 0x01, 0x01, 400, 0x182, 0x00A, 0, 0, 0, 2000000, 3400000, 0, 2, 2, 2, 4, 0x03, 25000, 42500}, +{ 42500, 85000, 1000, 425000, 850000, 0x08, 0x03, 0x01, 320, 0x132, 0x00A, 0, 0, 0, 1700000, 3400000, 0, 1, 1, 2, 4, 0x02, 42500, 85000}, +{ 85000, 170000, 1000, 850000, 1700000, 0x11, 0x00, 0x07, 340, 0x146, 0x00A, 0, 0, 0, 1700000, 3400000, 0, 1, 1, 2, 2, 0x01, 85000, 170000}, +{170000, 340000, 1000, 1700000, 3400000, 0x22, 0x01, 0x07, 340, 0x146, 0x00A, 0, 0, 0, 1700000, 3400000, 0, 1, 1, 2, 1, 0x00, 170000, 340000}, +{340000, 600000, 1000, 3400000, 6000000, 0x3C, 0x03, 0x06, 600, 0x24A, 0x00A, 0, 0, 0, 3400000, 6000000, 1, 1, 1, 2, 1, 0x00, 340000, 600000}, +{ 25000, 34000, 1205, 312500, 425000, 0x04, 0x01, 0x01, 400, 0x182, 0x00A, 0, 0, 0, 2500000, 3400000, 0, 2, 2, 2, 4, 0x03, 31250, 42500}, +{ 34000, 68000, 1205, 425000, 850000, 0x06, 0x02, 0x01, 300, 0x11E, 0x00A, 0, 0, 0, 1700000, 3400000, 0, 1, 1, 2, 4, 0x02, 42500, 85000}, +{ 68000, 136000, 1205, 850000, 1700000, 0x0D, 0x02, 0x02, 325, 0x137, 0x00A, 0, 0, 0, 1700000, 3400000, 0, 1, 1, 2, 2, 0x01, 85000, 170000}, +{136000, 272000, 1205, 1700000, 3400000, 0x1A, 0x02, 0x04, 325, 0x137, 0x00A, 0, 0, 0, 1700000, 3400000, 0, 1, 1, 2, 1, 0x00, 170000, 340000}, +{272000, 480000, 1205, 3400000, 6000000, 0x30, 0x03, 0x05, 600, 0x24A, 0x00A, 0, 0, 0, 3400000, 6000000, 1, 1, 1, 2, 1, 0x00, 340000, 600000}, +{ 25000, 28000, 1500, 375000, 420000, 0x03, 0x01, 0x01, 360, 0x15A, 0x00A, 0, 0, 0, 3000000, 3360000, 0, 2, 2, 2, 4, 0x03, 37500, 42000}, +{ 28000, 56000, 1500, 420000, 840000, 0x06, 0x02, 0x01, 360, 0x15A, 0x00A, 0, 0, 0, 1680000, 3360000, 0, 1, 1, 2, 4, 0x02, 42000, 84000}, +{ 56000, 113000, 1500, 840000, 1695000, 0x0B, 0x00, 0x05, 330, 0x13C, 0x00A, 0, 0, 0, 1680000, 3390000, 0, 1, 1, 2, 2, 0x01, 84000, 169500}, +{113000, 226000, 1500, 1695000, 3390000, 0x16, 0x01, 0x05, 330, 0x13C, 0x00A, 0, 0, 0, 1695000, 3390000, 0, 1, 1, 2, 1, 0x00, 169500, 339000}, +{226000, 400000, 1500, 3390000, 6000000, 0x28, 0x03, 0x04, 600, 0x24A, 0x00A, 0, 0, 0, 3390000, 6000000, 1, 1, 1, 2, 1, 0x00, 339000, 600000}, +{ 25000, 42500, 2000, 500000, 850000, 0x05, 0x01, 0x01, 400, 0x182, 0x00A, 0, 0, 0, 2000000, 3400000, 0, 1, 1, 2, 4, 0x02, 50000, 85000}, +{ 42500, 85000, 2000, 850000, 1700000, 0x08, 0x03, 0x01, 320, 0x132, 0x00A, 0, 0, 0, 1700000, 3400000, 0, 1, 1, 2, 2, 0x01, 85000, 170000}, +{ 85000, 170000, 2000, 1700000, 3400000, 0x11, 0x00, 0x07, 340, 0x146, 0x00A, 0, 0, 0, 1700000, 3400000, 0, 1, 1, 2, 1, 0x00, 170000, 340000}, +{170000, 300000, 2000, 3400000, 6000000, 0x22, 0x01, 0x06, 680, 0x29A, 0x00A, 0, 0, 0, 3400000, 6000000, 1, 1, 1, 2, 1, 0x00, 340000, 600000}, +{594000, 594000, 5000, 2970000, 2970000, 0x3C, 0x03, 0x06, 600, 0x24A, 0x00A, 0, 0, 0, 5940000, 5940000, 1, 1, 1, 2, 2, 0x01, 297000, 297000}, +{594000, 594000, 6250, 3712500, 3712500, 0x3C, 0x03, 0x06, 375, 0x169, 0x00A, 0, 0, 0, 3712500, 3712500, 1, 1, 1, 2, 1, 0x00, 371250, 371250}, +{594000, 594000, 7500, 4455000, 4455000, 0x3C, 0x03, 0x06, 450, 0x1B4, 0x00A, 0, 0, 0, 4455000, 4455000, 1, 1, 1, 2, 1, 0x00, 445500, 445500}, +}; + +/* HDMI TX PLL tuning settings */ +struct hdmi_pll_tuning { + u32 vco_freq_bin; + u32 vco_freq_min; + u32 vco_freq_max; + u32 volt_to_current_coarse; + u32 volt_to_current; + u32 ndac_ctrl; + u32 pmos_ctrl; + u32 ptat_ndac_ctrl; + u32 feedback_div_total; + u32 charge_pump_gain; + u32 coarse_code; + u32 v2i_code; + u32 vco_cal_code; +}; + +/* HDMI TX PLL tuning settings, pixel clock is output */ +static const struct hdmi_pll_tuning imx8mq_pll_table[] = { +/* bin VCO_freq min/max coar cod NDAC PMOS PTAT div-T P-Gain Coa V2I CAL */ + { 1, 1980000, 1980000, 0x4, 0x3, 0x0, 0x09, 0x09, 220, 0x42, 160, 5, 183 }, + { 2, 2160000, 2160000, 0x4, 0x3, 0x0, 0x09, 0x09, 240, 0x42, 166, 6, 208 }, + { 3, 2475000, 2475000, 0x5, 0x3, 0x1, 0x00, 0x07, 275, 0x42, 167, 6, 209 }, + { 4, 2700000, 2700000, 0x5, 0x3, 0x1, 0x00, 0x07, 300, 0x42, 188, 6, 230 }, + { 4, 2700000, 2700000, 0x5, 0x3, 0x1, 0x00, 0x07, 400, 0x4C, 188, 6, 230 }, + { 5, 2970000, 2970000, 0x6, 0x3, 0x1, 0x00, 0x07, 330, 0x42, 183, 6, 225 }, + { 6, 3240000, 3240000, 0x6, 0x3, 0x1, 0x00, 0x07, 360, 0x42, 203, 7, 256 }, + { 6, 3240000, 3240000, 0x6, 0x3, 0x1, 0x00, 0x07, 480, 0x4C, 203, 7, 256 }, + { 7, 3712500, 3712500, 0x4, 0x3, 0x0, 0x07, 0x0F, 550, 0x4C, 212, 7, 257 }, + { 8, 3960000, 3960000, 0x5, 0x3, 0x0, 0x07, 0x0F, 440, 0x42, 184, 6, 226 }, + { 9, 4320000, 4320000, 0x5, 0x3, 0x1, 0x07, 0x0F, 480, 0x42, 205, 7, 258 }, + { 10, 4455000, 4455000, 0x5, 0x3, 0x0, 0x07, 0x0F, 495, 0x42, 219, 7, 272 }, + { 10, 4455000, 4455000, 0x5, 0x3, 0x0, 0x07, 0x0F, 660, 0x4C, 219, 7, 272 }, + { 11, 4950000, 4950000, 0x6, 0x3, 0x1, 0x00, 0x07, 550, 0x42, 213, 7, 258 }, + { 12, 5940000, 5940000, 0x7, 0x3, 0x1, 0x00, 0x07, 660, 0x42, 244, 8, 292 }, +}; + +/* HDMI TX PLL tuning settings, pixel clock is input */ +static const struct hdmi_pll_tuning imx8qm_pll_table[] = { +/* bin VCO_freq min/max coar cod NDAC PMOS PTAT div-T P-Gain pad only */ + { 0, 1700000, 2000000, 0x3, 0x1, 0x0, 0x8C, 0x2E, 300, 0x08D, 0, 0, 0 }, + { 0, 1700000, 2000000, 0x3, 0x1, 0x0, 0x8C, 0x2E, 320, 0x08E, 0, 0, 0 }, + { 0, 1700000, 2000000, 0x3, 0x1, 0x0, 0x8C, 0x2E, 325, 0x08E, 0, 0, 0 }, + { 0, 1700000, 2000000, 0x3, 0x1, 0x0, 0x8C, 0x2E, 330, 0x08E, 0, 0, 0 }, + { 0, 1700000, 2000000, 0x3, 0x1, 0x0, 0x8C, 0x2E, 340, 0x08F, 0, 0, 0 }, + { 0, 1700000, 2000000, 0x3, 0x1, 0x0, 0x8C, 0x2E, 360, 0x0A7, 0, 0, 0 }, + { 0, 1700000, 2000000, 0x3, 0x1, 0x0, 0x8C, 0x2E, 400, 0x0C5, 0, 0, 0 }, + { 1, 2000000, 2400000, 0x3, 0x1, 0x0, 0x8C, 0x2E, 300, 0x086, 0, 0, 0 }, + { 1, 2000000, 2400000, 0x3, 0x1, 0x0, 0x8C, 0x2E, 320, 0x087, 0, 0, 0 }, + { 1, 2000000, 2400000, 0x3, 0x1, 0x0, 0x8C, 0x2E, 325, 0x087, 0, 0, 0 }, + { 1, 2000000, 2400000, 0x3, 0x1, 0x0, 0x8C, 0x2E, 330, 0x104, 0, 0, 0 }, + { 1, 2000000, 2400000, 0x3, 0x1, 0x0, 0x8C, 0x2E, 340, 0x08B, 0, 0, 0 }, + { 1, 2000000, 2400000, 0x3, 0x1, 0x0, 0x8C, 0x2E, 360, 0x08D, 0, 0, 0 }, + { 1, 2000000, 2400000, 0x3, 0x1, 0x0, 0x8C, 0x2E, 400, 0x0A6, 0, 0, 0 }, + { 2, 2400000, 2800000, 0x3, 0x1, 0x0, 0x04, 0x0D, 300, 0x04E, 0, 0, 0 }, + { 2, 2400000, 2800000, 0x3, 0x1, 0x0, 0x04, 0x0D, 320, 0x04F, 0, 0, 0 }, + { 2, 2400000, 2800000, 0x3, 0x1, 0x0, 0x04, 0x0D, 325, 0x04F, 0, 0, 0 }, + { 2, 2400000, 2800000, 0x3, 0x1, 0x0, 0x04, 0x0D, 330, 0x085, 0, 0, 0 }, + { 2, 2400000, 2800000, 0x3, 0x1, 0x0, 0x04, 0x0D, 340, 0x085, 0, 0, 0 }, + { 2, 2400000, 2800000, 0x3, 0x1, 0x0, 0x04, 0x0D, 360, 0x086, 0, 0, 0 }, + { 2, 2400000, 2800000, 0x3, 0x1, 0x0, 0x04, 0x0D, 400, 0x08B, 0, 0, 0 }, + { 3, 2800000, 3400000, 0x3, 0x1, 0x0, 0x04, 0x0D, 300, 0x047, 0, 0, 0 }, + { 3, 2800000, 3400000, 0x3, 0x1, 0x0, 0x04, 0x0D, 320, 0x04B, 0, 0, 0 }, + { 3, 2800000, 3400000, 0x3, 0x1, 0x0, 0x04, 0x0D, 325, 0x04B, 0, 0, 0 }, + { 3, 2800000, 3400000, 0x3, 0x1, 0x0, 0x04, 0x0D, 330, 0x04B, 0, 0, 0 }, + { 3, 2800000, 3400000, 0x3, 0x1, 0x0, 0x04, 0x0D, 340, 0x04D, 0, 0, 0 }, + { 3, 2800000, 3400000, 0x3, 0x1, 0x0, 0x04, 0x0D, 360, 0x04E, 0, 0, 0 }, + { 3, 2800000, 3400000, 0x3, 0x1, 0x0, 0x04, 0x0D, 400, 0x085, 0, 0, 0 }, + { 4, 3400000, 3900000, 0x7, 0x1, 0x0, 0x8E, 0x2F, 375, 0x041, 0, 0, 0 }, + { 4, 3400000, 3900000, 0x7, 0x1, 0x0, 0x8E, 0x2F, 600, 0x08D, 0, 0, 0 }, + { 4, 3400000, 3900000, 0x7, 0x1, 0x0, 0x8E, 0x2F, 680, 0x0A6, 0, 0, 0 }, + { 5, 3900000, 4500000, 0x7, 0x1, 0x0, 0x8E, 0x2F, 450, 0x041, 0, 0, 0 }, + { 5, 3900000, 4500000, 0x7, 0x1, 0x0, 0x8E, 0x2F, 600, 0x087, 0, 0, 0 }, + { 5, 3900000, 4500000, 0x7, 0x1, 0x0, 0x8E, 0x2F, 680, 0x0A4, 0, 0, 0 }, + { 6, 4500000, 5200000, 0x7, 0x1, 0x0, 0x04, 0x0D, 600, 0x04F, 0, 0, 0 }, + { 6, 4500000, 5200000, 0x7, 0x1, 0x0, 0x04, 0x0D, 680, 0x086, 0, 0, 0 }, + { 7, 5200000, 6000000, 0x7, 0x1, 0x0, 0x04, 0x0D, 600, 0x04D, 0, 0, 0 }, + { 7, 5200000, 6000000, 0x7, 0x1, 0x0, 0x04, 0x0D, 680, 0x04F, 0, 0, 0 } +}; + +static void hdmi_arc_config(struct cdns_mhdp_device *mhdp) +{ + u16 txpu_calib_code; + u16 txpd_calib_code; + u16 txpu_adj_calib_code; + u16 txpd_adj_calib_code; + u16 prev_calib_code; + u16 new_calib_code; + u16 rdata; + + /* Power ARC */ + cdns_phy_reg_write(mhdp, TXDA_CYA_AUXDA_CYA, 0x0001); + + prev_calib_code = cdns_phy_reg_read(mhdp, TX_DIG_CTRL_REG_2); + txpu_calib_code = cdns_phy_reg_read(mhdp, CMN_TXPUCAL_CTRL); + txpd_calib_code = cdns_phy_reg_read(mhdp, CMN_TXPDCAL_CTRL); + txpu_adj_calib_code = cdns_phy_reg_read(mhdp, CMN_TXPU_ADJ_CTRL); + txpd_adj_calib_code = cdns_phy_reg_read(mhdp, CMN_TXPD_ADJ_CTRL); + + new_calib_code = ((txpu_calib_code + txpd_calib_code) / 2) + + txpu_adj_calib_code + txpd_adj_calib_code; + + if (new_calib_code != prev_calib_code) { + rdata = cdns_phy_reg_read(mhdp, TX_ANA_CTRL_REG_1); + rdata &= 0xDFFF; + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_1, rdata); + cdns_phy_reg_write(mhdp, TX_DIG_CTRL_REG_2, new_calib_code); + mdelay(10); + rdata |= 0x2000; + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_1, rdata); + udelay(150); + } + + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_2, 0x0100); + udelay(100); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_2, 0x0300); + udelay(100); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_3, 0x0000); + udelay(100); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_1, 0x2008); + udelay(100); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_1, 0x2018); + udelay(100); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_1, 0x2098); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_2, 0x030C); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_5, 0x0010); + udelay(100); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_4, 0x4001); + mdelay(5); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_1, 0x2198); + mdelay(5); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_2, 0x030D); + udelay(100); + cdns_phy_reg_write(mhdp, TX_ANA_CTRL_REG_2, 0x030F); +} + +static void hdmi_phy_set_vswing(struct cdns_mhdp_device *mhdp) +{ + const u32 num_lanes = 4; + u32 k; + + for (k = 0; k < num_lanes; k++) { + cdns_phy_reg_write(mhdp, (TX_DIAG_TX_DRV | (k << 9)), 0x7c0); + cdns_phy_reg_write(mhdp, (TX_TXCC_CPOST_MULT_00_0 | (k << 9)), 0x0); + cdns_phy_reg_write(mhdp, (TX_TXCC_CAL_SCLR_MULT_0 | (k << 9)), 0x120); + } +} + +static int hdmi_feedback_factor(struct cdns_mhdp_device *mhdp) +{ + u32 feedback_factor; + + switch (mhdp->video_info.color_fmt) { + case YCBCR_4_2_2: + feedback_factor = 1000; + break; + case YCBCR_4_2_0: + switch (mhdp->video_info.color_depth) { + case 8: + feedback_factor = 500; + break; + case 10: + feedback_factor = 625; + break; + case 12: + feedback_factor = 750; + break; + case 16: + feedback_factor = 1000; + break; + default: + DRM_ERROR("Invalid ColorDepth\n"); + return 0; + } + break; + default: + /* Assume RGB/YUV444 */ + switch (mhdp->video_info.color_depth) { + case 10: + feedback_factor = 1250; + break; + case 12: + feedback_factor = 1500; + break; + case 16: + feedback_factor = 2000; + break; + default: + feedback_factor = 1000; + } + } + return feedback_factor; +} + +static int hdmi_phy_config(struct cdns_mhdp_device *mhdp, + const struct hdmi_ctrl *p_ctrl_table, + const struct hdmi_pll_tuning *p_pll_table, + char pclk_in) +{ + const u32 num_lanes = 4; + u32 val, i, k; + + /* enable PHY isolation mode only for CMN */ + cdns_phy_reg_write(mhdp, PHY_PMA_ISOLATION_CTRL, 0xD000); + + /* set cmn_pll0_clk_datart1_div/cmn_pll0_clk_datart0_div dividers */ + val = cdns_phy_reg_read(mhdp, PHY_PMA_ISO_PLL_CTRL1); + val &= 0xFF00; + val |= 0x0012; + cdns_phy_reg_write(mhdp, PHY_PMA_ISO_PLL_CTRL1, val); + + /* assert PHY reset from isolation register */ + cdns_phy_reg_write(mhdp, PHY_ISO_CMN_CTRL, 0x0000); + /* assert PMA CMN reset */ + cdns_phy_reg_write(mhdp, PHY_PMA_ISO_CMN_CTRL, 0x0000); + + /* register XCVR_DIAG_BIDI_CTRL */ + for (k = 0; k < num_lanes; k++) + cdns_phy_reg_write(mhdp, XCVR_DIAG_BIDI_CTRL | (k << 9), 0x00FF); + + /* Describing Task phy_cfg_hdp */ + + val = cdns_phy_reg_read(mhdp, PHY_PMA_CMN_CTRL1); + val &= 0xFFF7; + val |= 0x0008; + cdns_phy_reg_write(mhdp, PHY_PMA_CMN_CTRL1, val); + + /* PHY Registers */ + val = cdns_phy_reg_read(mhdp, PHY_PMA_CMN_CTRL1); + val &= 0xCFFF; + val |= p_ctrl_table->cmn_ref_clk_dig_div << 12; + cdns_phy_reg_write(mhdp, PHY_PMA_CMN_CTRL1, val); + + val = cdns_phy_reg_read(mhdp, PHY_HDP_CLK_CTL); + val &= 0x00FF; + val |= 0x1200; + cdns_phy_reg_write(mhdp, PHY_HDP_CLK_CTL, val); + + /* Common control module control and diagnostic registers */ + val = cdns_phy_reg_read(mhdp, CMN_CDIAG_REFCLK_CTRL); + val &= 0x8FFF; + val |= p_ctrl_table->ref_clk_divider_scaler << 12; + val |= 0x00C0; + cdns_phy_reg_write(mhdp, CMN_CDIAG_REFCLK_CTRL, val); + + /* High speed clock used */ + val = cdns_phy_reg_read(mhdp, CMN_DIAG_HSCLK_SEL); + val &= 0xFF00; + val |= (p_ctrl_table->cmnda_hs_clk_0_sel >> 1) << 0; + val |= (p_ctrl_table->cmnda_hs_clk_1_sel >> 1) << 4; + cdns_phy_reg_write(mhdp, CMN_DIAG_HSCLK_SEL, val); + + for (k = 0; k < num_lanes; k++) { + val = cdns_phy_reg_read(mhdp, (XCVR_DIAG_HSCLK_SEL | (k << 9))); + val &= 0xCFFF; + val |= (p_ctrl_table->cmnda_hs_clk_0_sel >> 1) << 12; + cdns_phy_reg_write(mhdp, (XCVR_DIAG_HSCLK_SEL | (k << 9)), val); + } + + /* PLL 0 control state machine registers */ + val = p_ctrl_table->vco_ring_select << 12; + cdns_phy_reg_write(mhdp, CMN_PLLSM0_USER_DEF_CTRL, val); + + if (pclk_in == true) + val = 0x30A0; + else { + val = cdns_phy_reg_read(mhdp, CMN_PLL0_VCOCAL_START); + val &= 0xFE00; + val |= p_pll_table->vco_cal_code; + } + cdns_phy_reg_write(mhdp, CMN_PLL0_VCOCAL_START, val); + + cdns_phy_reg_write(mhdp, CMN_PLL0_VCOCAL_INIT_TMR, 0x0064); + cdns_phy_reg_write(mhdp, CMN_PLL0_VCOCAL_ITER_TMR, 0x000A); + + /* Common functions control and diagnostics registers */ + val = p_ctrl_table->cmnda_pll0_hs_sym_div_sel << 8; + val |= p_ctrl_table->cmnda_pll0_ip_div; + cdns_phy_reg_write(mhdp, CMN_DIAG_PLL0_INCLK_CTRL, val); + + cdns_phy_reg_write(mhdp, CMN_DIAG_PLL0_OVRD, 0x0000); + + val = p_ctrl_table->cmnda_pll0_fb_div_high; + val |= (1 << 15); + cdns_phy_reg_write(mhdp, CMN_DIAG_PLL0_FBH_OVRD, val); + + val = p_ctrl_table->cmnda_pll0_fb_div_low; + val |= (1 << 15); + cdns_phy_reg_write(mhdp, CMN_DIAG_PLL0_FBL_OVRD, val); + + if (pclk_in == false) { + val = p_ctrl_table->cmnda_pll0_pxdiv_low; + cdns_phy_reg_write(mhdp, CMN_DIAG_PLL0_PXL_DIVL, val); + + val = p_ctrl_table->cmnda_pll0_pxdiv_high; + val |= (1 << 15); + cdns_phy_reg_write(mhdp, CMN_DIAG_PLL0_PXL_DIVH, val); + } + + val = p_pll_table->volt_to_current_coarse; + val |= (p_pll_table->volt_to_current) << 4; + cdns_phy_reg_write(mhdp, CMN_DIAG_PLL0_V2I_TUNE, val); + + val = p_pll_table->charge_pump_gain; + cdns_phy_reg_write(mhdp, CMN_DIAG_PLL0_CP_TUNE, val); + + cdns_phy_reg_write(mhdp, CMN_DIAG_PLL0_LF_PROG, 0x0008); + + val = p_pll_table->pmos_ctrl; + val |= (p_pll_table->ndac_ctrl) << 8; + cdns_phy_reg_write(mhdp, CMN_DIAG_PLL0_PTATIS_TUNE1, val); + + val = p_pll_table->ptat_ndac_ctrl; + cdns_phy_reg_write(mhdp, CMN_DIAG_PLL0_PTATIS_TUNE2, val); + + if (pclk_in == true) + cdns_phy_reg_write(mhdp, CMN_DIAG_PLL0_TEST_MODE, 0x0022); + else + cdns_phy_reg_write(mhdp, CMN_DIAG_PLL0_TEST_MODE, 0x0020); + cdns_phy_reg_write(mhdp, CMN_PSM_CLK_CTRL, 0x0016); + + /* Transceiver control and diagnostic registers */ + for (k = 0; k < num_lanes; k++) { + val = cdns_phy_reg_read(mhdp, (XCVR_DIAG_PLLDRC_CTRL | (k << 9))); + val &= 0xBFFF; + cdns_phy_reg_write(mhdp, (XCVR_DIAG_PLLDRC_CTRL | (k << 9)), val); + } + + for (k = 0; k < num_lanes; k++) { + val = cdns_phy_reg_read(mhdp, (TX_DIAG_TX_CTRL | (k << 9))); + val &= 0xFF3F; + val |= (p_ctrl_table->hsclk_div_tx_sub_rate >> 1) << 6; + cdns_phy_reg_write(mhdp, (TX_DIAG_TX_CTRL | (k << 9)), val); + } + + /* + * for single ended reference clock val |= 0x0030; + * for differential clock val |= 0x0000; + */ + val = cdns_phy_reg_read(mhdp, PHY_PMA_CMN_CTRL1); + val &= 0xFF8F; + if (pclk_in == true) + val |= 0x0030; + cdns_phy_reg_write(mhdp, PHY_PMA_CMN_CTRL1, val); + + /* for differential clock on the refclk_p and + * refclk_m off chip pins: CMN_DIAG_ACYA[8]=1'b1 */ + cdns_phy_reg_write(mhdp, CMN_DIAG_ACYA, 0x0100); + + /* Deassert PHY reset */ + cdns_phy_reg_write(mhdp, PHY_ISO_CMN_CTRL, 0x0001); + cdns_phy_reg_write(mhdp, PHY_PMA_ISO_CMN_CTRL, 0x0003); + + /* Power state machine registers */ + for (k = 0; k < num_lanes; k++) + cdns_phy_reg_write(mhdp, XCVR_PSM_RCTRL | (k << 9), 0xFEFC); + + /* Assert cmn_macro_pwr_en */ + cdns_phy_reg_write(mhdp, PHY_PMA_ISO_CMN_CTRL, 0x0013); + + /* wait for cmn_macro_pwr_en_ack */ + for (i = 0; i < 10; i++) { + val = cdns_phy_reg_read(mhdp, PHY_PMA_ISO_CMN_CTRL); + if (val & (1 << 5)) + break; + msleep(20); + } + if (i == 10) { + DRM_ERROR("PMA ouput macro power up failed\n"); + return false; + } + + /* wait for cmn_ready */ + for (i = 0; i < 10; i++) { + val = cdns_phy_reg_read(mhdp, PHY_PMA_CMN_CTRL1); + if (val & (1 << 0)) + break; + msleep(20); + } + if (i == 10) { + DRM_ERROR("PMA output ready failed\n"); + return false; + } + + for (k = 0; k < num_lanes; k++) { + cdns_phy_reg_write(mhdp, TX_PSC_A0 | (k << 9), 0x6791); + cdns_phy_reg_write(mhdp, TX_PSC_A1 | (k << 9), 0x6790); + cdns_phy_reg_write(mhdp, TX_PSC_A2 | (k << 9), 0x0090); + cdns_phy_reg_write(mhdp, TX_PSC_A3 | (k << 9), 0x0090); + + val = cdns_phy_reg_read(mhdp, RX_PSC_CAL | (k << 9)); + val &= 0xFFBB; + cdns_phy_reg_write(mhdp, RX_PSC_CAL | (k << 9), val); + + val = cdns_phy_reg_read(mhdp, RX_PSC_A0 | (k << 9)); + val &= 0xFFBB; + cdns_phy_reg_write(mhdp, RX_PSC_A0 | (k << 9), val); + } + return true; +} + +static int hdmi_phy_cfg_t28hpc(struct cdns_mhdp_device *mhdp, + struct drm_display_mode *mode) +{ + const struct hdmi_ctrl *p_ctrl_table; + const struct hdmi_pll_tuning *p_pll_table; + const u32 refclk_freq_khz = 27000; + const u8 pclk_in = false; + u32 pixel_freq = mode->clock; + u32 vco_freq, char_freq; + u32 div_total, feedback_factor; + u32 i, ret; + + feedback_factor = hdmi_feedback_factor(mhdp); + + char_freq = pixel_freq * feedback_factor / 1000; + + DRM_INFO("Pixel clock: %d KHz, character clock: %d, bpc is %0d-bit.\n", + pixel_freq, char_freq, mhdp->video_info.color_depth); + + /* Get right row from the ctrl_table table. + * Check if 'pixel_freq_khz' value matches the PIXEL_CLK_FREQ column. + * Consider only the rows with FEEDBACK_FACTOR column matching feedback_factor. */ + for (i = 0; i < ARRAY_SIZE(imx8mq_ctrl_table); i++) { + if (feedback_factor == imx8mq_ctrl_table[i].feedback_factor && + pixel_freq == imx8mq_ctrl_table[i].pixel_clk_freq_min) { + p_ctrl_table = &imx8mq_ctrl_table[i]; + break; + } + } + if (i == ARRAY_SIZE(imx8mq_ctrl_table)) { + DRM_WARN("Pixel clk (%d KHz) not supported, color depth (%0d-bit)\n", + pixel_freq, mhdp->video_info.color_depth); + return 0; + } + + div_total = p_ctrl_table->pll_fb_div_total; + vco_freq = refclk_freq_khz * div_total / p_ctrl_table->cmnda_pll0_ip_div; + + /* Get right row from the imx8mq_pll_table table. + * Check if vco_freq_khz and feedback_div_total + * column matching with imx8mq_pll_table. */ + for (i = 0; i < ARRAY_SIZE(imx8mq_pll_table); i++) { + if (vco_freq == imx8mq_pll_table[i].vco_freq_min && + div_total == imx8mq_pll_table[i].feedback_div_total) { + p_pll_table = &imx8mq_pll_table[i]; + break; + } + } + if (i == ARRAY_SIZE(imx8mq_pll_table)) { + DRM_WARN("VCO (%d KHz) not supported\n", vco_freq); + return 0; + } + DRM_INFO("VCO frequency is %d KHz\n", vco_freq); + + ret = hdmi_phy_config(mhdp, p_ctrl_table, p_pll_table, pclk_in); + if (ret == false) + return 0; + + return char_freq; +} + +static int hdmi_phy_cfg_ss28fdsoi(struct cdns_mhdp_device *mhdp, + struct drm_display_mode *mode) +{ + const struct hdmi_ctrl *p_ctrl_table; + const struct hdmi_pll_tuning *p_pll_table; + const u8 pclk_in = true; + u32 pixel_freq = mode->clock; + u32 vco_freq, char_freq; + u32 div_total, feedback_factor; + u32 ret, i; + + feedback_factor = hdmi_feedback_factor(mhdp); + + char_freq = pixel_freq * feedback_factor / 1000; + + DRM_INFO("Pixel clock: %d KHz, character clock: %d, bpc is %0d-bit.\n", + pixel_freq, char_freq, mhdp->video_info.color_depth); + + /* Get right row from the ctrl_table table. + * Check if 'pixel_freq_khz' value matches the PIXEL_CLK_FREQ column. + * Consider only the rows with FEEDBACK_FACTOR column matching feedback_factor. */ + for (i = 0; i < ARRAY_SIZE(imx8qm_ctrl_table); i++) { + if (feedback_factor == imx8qm_ctrl_table[i].feedback_factor && + pixel_freq >= imx8qm_ctrl_table[i].pixel_clk_freq_min && + pixel_freq <= imx8qm_ctrl_table[i].pixel_clk_freq_max) { + p_ctrl_table = &imx8qm_ctrl_table[i]; + break; + } + } + if (i == ARRAY_SIZE(imx8qm_ctrl_table)) { + DRM_WARN("Pixel clk (%d KHz) not supported, color depth (%0d-bit)\n", + pixel_freq, mhdp->video_info.color_depth); + return 0; + } + + div_total = p_ctrl_table->pll_fb_div_total; + vco_freq = pixel_freq * div_total / p_ctrl_table->cmnda_pll0_ip_div; + + /* Get right row from the imx8mq_pll_table table. + * Check if vco_freq_khz and feedback_div_total + * column matching with imx8mq_pll_table. */ + for (i = 0; i < ARRAY_SIZE(imx8qm_pll_table); i++) { + if (vco_freq >= imx8qm_pll_table[i].vco_freq_min && + vco_freq < imx8qm_pll_table[i].vco_freq_max && + div_total == imx8qm_pll_table[i].feedback_div_total) { + p_pll_table = &imx8qm_pll_table[i]; + break; + } + } + if (i == ARRAY_SIZE(imx8qm_pll_table)) { + DRM_WARN("VCO (%d KHz) not supported\n", vco_freq); + return 0; + } + DRM_INFO("VCO frequency is %d KHz\n", vco_freq); + + ret = hdmi_phy_config(mhdp, p_ctrl_table, p_pll_table, pclk_in); + if (ret == false) + return 0; + + return char_freq; +} + +static int hdmi_phy_power_up(struct cdns_mhdp_device *mhdp) +{ + u32 val, i; + + /* set Power State to A2 */ + cdns_phy_reg_write(mhdp, PHY_HDP_MODE_CTRL, 0x0004); + + cdns_phy_reg_write(mhdp, TX_DIAG_ACYA_0, 1); + cdns_phy_reg_write(mhdp, TX_DIAG_ACYA_1, 1); + cdns_phy_reg_write(mhdp, TX_DIAG_ACYA_2, 1); + cdns_phy_reg_write(mhdp, TX_DIAG_ACYA_3, 1); + + /* Wait for Power State A2 Ack */ + for (i = 0; i < 10; i++) { + val = cdns_phy_reg_read(mhdp, PHY_HDP_MODE_CTRL); + if (val & (1 << 6)) + break; + msleep(20); + } + if (i == 10) { + dev_err(mhdp->dev, "Wait A2 Ack failed\n"); + return -1; + } + + /* Power up ARC */ + hdmi_arc_config(mhdp); + + /* Configure PHY in A0 mode (PHY must be in the A0 power + * state in order to transmit data) + */ + //cdns_phy_reg_write(mhdp, PHY_HDP_MODE_CTRL, 0x0101); //imx8mq + cdns_phy_reg_write(mhdp, PHY_HDP_MODE_CTRL, 0x0001); + + /* Wait for Power State A0 Ack */ + for (i = 0; i < 10; i++) { + val = cdns_phy_reg_read(mhdp, PHY_HDP_MODE_CTRL); + if (val & (1 << 4)) + break; + msleep(20); + } + if (i == 10) { + dev_err(mhdp->dev, "Wait A0 Ack failed\n"); + return -1; + } + return 0; +} + +bool cdns_hdmi_phy_video_valid_imx8mq(struct cdns_mhdp_device *mhdp) +{ + u32 rate = mhdp->valid_mode->clock; + int i; + + for (i = 0; i < ARRAY_SIZE(imx8mq_ctrl_table); i++) + if(rate == imx8mq_ctrl_table[i].pixel_clk_freq_min) + return true; + return false; +} + +int cdns_hdmi_phy_set_imx8mq(struct cdns_mhdp_device *mhdp) +{ + struct drm_display_mode *mode = &mhdp->mode; + int ret; + + /* Check HDMI FW alive before HDMI PHY init */ + ret = cdns_mhdp_check_alive(mhdp); + if (ret == false) { + DRM_ERROR("NO HDMI FW running\n"); + return -ENXIO; + } + + /* Configure PHY */ + mhdp->hdmi.char_rate = hdmi_phy_cfg_t28hpc(mhdp, mode); + if (mhdp->hdmi.char_rate == 0) { + DRM_ERROR("failed to set phy pclock\n"); + return -EINVAL; + } + + ret = hdmi_phy_power_up(mhdp); + if (ret < 0) + return ret; + + hdmi_phy_set_vswing(mhdp); + + return true; +} + +bool cdns_hdmi_phy_video_valid_imx8qm(struct cdns_mhdp_device *mhdp) +{ + u32 rate = mhdp->valid_mode->clock; + int i; + + for (i = 0; i < ARRAY_SIZE(imx8qm_ctrl_table); i++) + if(rate >= imx8qm_ctrl_table[i].pixel_clk_freq_min && + rate <= imx8qm_ctrl_table[i].pixel_clk_freq_max) + return true; + return false; +} + +int cdns_hdmi_phy_set_imx8qm(struct cdns_mhdp_device *mhdp) +{ + struct drm_display_mode *mode = &mhdp->mode; + int ret; + + /* Check HDMI FW alive before HDMI PHY init */ + ret = cdns_mhdp_check_alive(mhdp); + if (ret == false) { + DRM_ERROR("NO HDMI FW running\n"); + return -ENXIO; + } + + /* Configure PHY */ + mhdp->hdmi.char_rate = hdmi_phy_cfg_ss28fdsoi(mhdp, mode); + if (mhdp->hdmi.char_rate == 0) { + DRM_ERROR("failed to set phy pclock\n"); + return -EINVAL; + } + + ret = hdmi_phy_power_up(mhdp); + if (ret < 0) + return ret; + + hdmi_phy_set_vswing(mhdp); + + return true; +} diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx.h b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx.h new file mode 100644 index 000000000000..fc3247dada2d --- /dev/null +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx.h @@ -0,0 +1,75 @@ +/* + * Cadence High-Definition Multimedia Interface (HDMI) driver + * + * Copyright (C) 2019 NXP Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + */ +#ifndef CDNS_MHDP_IMX_H_ +#define CDNS_MHDP_IMX_H_ + +#include <drm/bridge/cdns-mhdp.h> +#include <drm/drm_encoder_slave.h> + + +struct imx_mhdp_device; + +struct imx_hdp_clks { + struct clk *av_pll; + struct clk *dig_pll; + struct clk *clk_ipg; + struct clk *clk_core; + struct clk *clk_pxl; + struct clk *clk_pxl_mux; + struct clk *clk_pxl_link; + + struct clk *lpcg_hdp; + struct clk *lpcg_msi; + struct clk *lpcg_pxl; + struct clk *lpcg_vif; + struct clk *lpcg_lis; + struct clk *lpcg_apb; + struct clk *lpcg_apb_csr; + struct clk *lpcg_apb_ctrl; + + struct clk *lpcg_i2s; + struct clk *clk_i2s_bypass; +}; + +struct imx_mhdp_device { + struct cdns_mhdp_device mhdp; + struct drm_encoder encoder; + + struct mutex audio_mutex; + spinlock_t audio_lock; + bool connected; + bool active; + bool suspended; + struct imx_hdp_clks clks; + const struct firmware *fw; + const char *firmware_name; + + int bus_type; + + struct device *pd_mhdp_dev; + struct device *pd_pll0_dev; + struct device *pd_pll1_dev; + struct device_link *pd_mhdp_link; + struct device_link *pd_pll0_link; + struct device_link *pd_pll1_link; +}; + +void cdns_mhdp_plat_init_imx8qm(struct cdns_mhdp_device *mhdp); +void cdns_mhdp_plat_deinit_imx8qm(struct cdns_mhdp_device *mhdp); +void cdns_mhdp_pclk_rate_imx8qm(struct cdns_mhdp_device *mhdp); +int cdns_mhdp_firmware_init_imx8qm(struct cdns_mhdp_device *mhdp); +int cdns_mhdp_resume_imx8qm(struct cdns_mhdp_device *mhdp); +int cdns_mhdp_suspend_imx8qm(struct cdns_mhdp_device *mhdp); +int cdns_mhdp_power_on_imx8qm(struct cdns_mhdp_device *mhdp); +int cdns_mhdp_power_on_ls1028a(struct cdns_mhdp_device *mhdp); +void cdns_mhdp_pclk_rate_ls1028a(struct cdns_mhdp_device *mhdp); +#endif /* CDNS_MHDP_IMX_H_ */ diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c new file mode 100644 index 000000000000..a3ba3da4b05d --- /dev/null +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c @@ -0,0 +1,638 @@ +/* + * copyright (c) 2019 nxp semiconductor, inc. + * + * this program is free software; you can redistribute it and/or modify + * it under the terms of the gnu general public license version 2 as + * published by the free software foundation. + */ +#include <dt-bindings/firmware/imx/rsrc.h> +#include <linux/firmware/imx/sci.h> +#include <linux/firmware.h> +#include <linux/pm_domain.h> +#include <linux/clk.h> +#include <drm/drm_vblank.h> +#include <drm/drm_print.h> + +#include "cdns-mhdp-imx.h" + +#define FW_IRAM_OFFSET 0x2000 +#define FW_IRAM_SIZE 0x10000 +#define FW_DRAM_SIZE 0x8000 + +#define PLL_800MHZ (800000000) + +#define HDP_DUAL_MODE_MIN_PCLK_RATE 300000 /* KHz */ +#define HDP_SINGLE_MODE_MAX_WIDTH 1920 + +#define CSR_PIXEL_LINK_MUX_CTL 0x00 +#define CSR_PIXEL_LINK_MUX_VCP_OFFSET 5 +#define CSR_PIXEL_LINK_MUX_HCP_OFFSET 4 + +static bool imx8qm_video_dual_mode(struct cdns_mhdp_device *mhdp) +{ + struct drm_display_mode *mode = &mhdp->mode; + return (mode->clock > HDP_DUAL_MODE_MIN_PCLK_RATE || + mode->hdisplay > HDP_SINGLE_MODE_MAX_WIDTH) ? true : false; +} + +static void imx8qm_pixel_link_mux(struct imx_mhdp_device *imx_mhdp) +{ + struct drm_display_mode *mode = &imx_mhdp->mhdp.mode; + bool dual_mode; + u32 val; + + dual_mode = imx8qm_video_dual_mode(&imx_mhdp->mhdp); + + val = 0x4; /* RGB */ + if (dual_mode) + val |= 0x2; /* pixel link 0 and 1 are active */ + if (mode->flags & DRM_MODE_FLAG_PVSYNC) + val |= 1 << CSR_PIXEL_LINK_MUX_VCP_OFFSET; + if (mode->flags & DRM_MODE_FLAG_PHSYNC) + val |= 1 << CSR_PIXEL_LINK_MUX_HCP_OFFSET; + if (mode->flags & DRM_MODE_FLAG_INTERLACE) + val |= 0x2; + + writel(val, imx_mhdp->mhdp.regs_sec); +} + +static void imx8qm_pixel_link_valid(u32 dual_mode) +{ + struct imx_sc_ipc *handle; + + imx_scu_get_handle(&handle); + + imx_sc_misc_set_control(handle, IMX_SC_R_DC_0, IMX_SC_C_PXL_LINK_MST1_VLD, 1); + if (dual_mode) + imx_sc_misc_set_control(handle, IMX_SC_R_DC_0, IMX_SC_C_PXL_LINK_MST2_VLD, 1); +} + +static void imx8qm_pixel_link_invalid(u32 dual_mode) +{ + struct imx_sc_ipc *handle; + + imx_scu_get_handle(&handle); + + imx_sc_misc_set_control(handle, IMX_SC_R_DC_0, IMX_SC_C_PXL_LINK_MST1_VLD, 0); + if (dual_mode) + imx_sc_misc_set_control(handle, IMX_SC_R_DC_0, IMX_SC_C_PXL_LINK_MST2_VLD, 0); +} + +static void imx8qm_pixel_link_sync_enable(u32 dual_mode) +{ + struct imx_sc_ipc *handle; + + imx_scu_get_handle(&handle); + + if (dual_mode) + imx_sc_misc_set_control(handle, IMX_SC_R_DC_0, IMX_SC_C_SYNC_CTRL, 3); + else + imx_sc_misc_set_control(handle, IMX_SC_R_DC_0, IMX_SC_C_SYNC_CTRL0, 1); +} + +static void imx8qm_pixel_link_sync_disable(u32 dual_mode) +{ + struct imx_sc_ipc *handle; + + imx_scu_get_handle(&handle); + + if (dual_mode) + imx_sc_misc_set_control(handle, IMX_SC_R_DC_0, IMX_SC_C_SYNC_CTRL, 0); + else + imx_sc_misc_set_control(handle, IMX_SC_R_DC_0, IMX_SC_C_SYNC_CTRL0, 0); +} + +static void imx8qm_phy_reset(u8 reset) +{ + struct imx_sc_ipc *handle; + + imx_scu_get_handle(&handle); + + /* set the pixel link mode and pixel type */ + imx_sc_misc_set_control(handle, IMX_SC_R_HDMI, IMX_SC_C_PHY_RESET, reset); +} + +static void imx8qm_clk_mux(u8 is_dp) +{ + struct imx_sc_ipc *handle; + + imx_scu_get_handle(&handle); + + if (is_dp) + /* Enable the 24MHz for HDP PHY */ + imx_sc_misc_set_control(handle, IMX_SC_R_HDMI, IMX_SC_C_MODE, 1); + else + imx_sc_misc_set_control(handle, IMX_SC_R_HDMI, IMX_SC_C_MODE, 0); +} + +int imx8qm_clocks_init(struct imx_mhdp_device *imx_mhdp) +{ + struct device *dev = imx_mhdp->mhdp.dev; + struct imx_hdp_clks *clks = &imx_mhdp->clks; + + clks->dig_pll = devm_clk_get(dev, "dig_pll"); + if (IS_ERR(clks->dig_pll)) { + dev_warn(dev, "failed to get dig pll clk\n"); + return PTR_ERR(clks->dig_pll); + } + + clks->av_pll = devm_clk_get(dev, "av_pll"); + if (IS_ERR(clks->av_pll)) { + dev_warn(dev, "failed to get av pll clk\n"); + return PTR_ERR(clks->av_pll); + } + + clks->clk_ipg = devm_clk_get(dev, "clk_ipg"); + if (IS_ERR(clks->clk_ipg)) { + dev_warn(dev, "failed to get dp ipg clk\n"); + return PTR_ERR(clks->clk_ipg); + } + + clks->clk_core = devm_clk_get(dev, "clk_core"); + if (IS_ERR(clks->clk_core)) { + dev_warn(dev, "failed to get hdp core clk\n"); + return PTR_ERR(clks->clk_core); + } + + clks->clk_pxl = devm_clk_get(dev, "clk_pxl"); + if (IS_ERR(clks->clk_pxl)) { + dev_warn(dev, "failed to get pxl clk\n"); + return PTR_ERR(clks->clk_pxl); + } + + clks->clk_pxl_mux = devm_clk_get(dev, "clk_pxl_mux"); + if (IS_ERR(clks->clk_pxl_mux)) { + dev_warn(dev, "failed to get pxl mux clk\n"); + return PTR_ERR(clks->clk_pxl_mux); + } + + clks->clk_pxl_link = devm_clk_get(dev, "clk_pxl_link"); + if (IS_ERR(clks->clk_pxl_mux)) { + dev_warn(dev, "failed to get pxl link clk\n"); + return PTR_ERR(clks->clk_pxl_link); + } + + clks->lpcg_hdp = devm_clk_get(dev, "lpcg_hdp"); + if (IS_ERR(clks->lpcg_hdp)) { + dev_warn(dev, "failed to get lpcg hdp clk\n"); + return PTR_ERR(clks->lpcg_hdp); + } + + clks->lpcg_msi = devm_clk_get(dev, "lpcg_msi"); + if (IS_ERR(clks->lpcg_msi)) { + dev_warn(dev, "failed to get lpcg msi clk\n"); + return PTR_ERR(clks->lpcg_msi); + } + + clks->lpcg_pxl = devm_clk_get(dev, "lpcg_pxl"); + if (IS_ERR(clks->lpcg_pxl)) { + dev_warn(dev, "failed to get lpcg pxl clk\n"); + return PTR_ERR(clks->lpcg_pxl); + } + + clks->lpcg_vif = devm_clk_get(dev, "lpcg_vif"); + if (IS_ERR(clks->lpcg_vif)) { + dev_warn(dev, "failed to get lpcg vif clk\n"); + return PTR_ERR(clks->lpcg_vif); + } + + clks->lpcg_lis = devm_clk_get(dev, "lpcg_lis"); + if (IS_ERR(clks->lpcg_lis)) { + dev_warn(dev, "failed to get lpcg lis clk\n"); + return PTR_ERR(clks->lpcg_lis); + } + + clks->lpcg_apb = devm_clk_get(dev, "lpcg_apb"); + if (IS_ERR(clks->lpcg_apb)) { + dev_warn(dev, "failed to get lpcg apb clk\n"); + return PTR_ERR(clks->lpcg_apb); + } + + clks->lpcg_apb_csr = devm_clk_get(dev, "lpcg_apb_csr"); + if (IS_ERR(clks->lpcg_apb_csr)) { + dev_warn(dev, "failed to get apb csr clk\n"); + return PTR_ERR(clks->lpcg_apb_csr); + } + + clks->lpcg_apb_ctrl = devm_clk_get(dev, "lpcg_apb_ctrl"); + if (IS_ERR(clks->lpcg_apb_ctrl)) { + dev_warn(dev, "failed to get lpcg apb ctrl clk\n"); + return PTR_ERR(clks->lpcg_apb_ctrl); + } + + clks->clk_i2s_bypass = devm_clk_get(dev, "clk_i2s_bypass"); + if (IS_ERR(clks->clk_i2s_bypass)) { + dev_err(dev, "failed to get i2s bypass clk\n"); + return PTR_ERR(clks->clk_i2s_bypass); + } + + clks->lpcg_i2s = devm_clk_get(dev, "lpcg_i2s"); + if (IS_ERR(clks->lpcg_i2s)) { + dev_err(dev, "failed to get lpcg i2s clk\n"); + return PTR_ERR(clks->lpcg_i2s); + } + return true; +} + +static int imx8qm_pixel_clk_enable(struct imx_mhdp_device *imx_mhdp) +{ + struct imx_hdp_clks *clks = &imx_mhdp->clks; + struct device *dev = imx_mhdp->mhdp.dev; + int ret; + + ret = clk_prepare_enable(clks->av_pll); + if (ret < 0) { + dev_err(dev, "%s, pre av pll error\n", __func__); + return ret; + } + + ret = clk_prepare_enable(clks->clk_pxl); + if (ret < 0) { + dev_err(dev, "%s, pre clk pxl error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->clk_pxl_mux); + if (ret < 0) { + dev_err(dev, "%s, pre clk pxl mux error\n", __func__); + return ret; + } + + ret = clk_prepare_enable(clks->clk_pxl_link); + if (ret < 0) { + dev_err(dev, "%s, pre clk pxl link error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->lpcg_vif); + if (ret < 0) { + dev_err(dev, "%s, pre clk vif error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->lpcg_pxl); + if (ret < 0) { + dev_err(dev, "%s, pre lpcg pxl error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->lpcg_hdp); + if (ret < 0) { + dev_err(dev, "%s, pre lpcg hdp error\n", __func__); + return ret; + } + return ret; +} + +static void imx8qm_pixel_clk_disable(struct imx_mhdp_device *imx_mhdp) +{ + struct imx_hdp_clks *clks = &imx_mhdp->clks; + + clk_disable_unprepare(clks->lpcg_pxl); + clk_disable_unprepare(clks->lpcg_hdp); + clk_disable_unprepare(clks->lpcg_vif); + clk_disable_unprepare(clks->clk_pxl); + clk_disable_unprepare(clks->clk_pxl_link); + clk_disable_unprepare(clks->clk_pxl_mux); + clk_disable_unprepare(clks->av_pll); +} + +static void imx8qm_pixel_clk_set_rate(struct imx_mhdp_device *imx_mhdp, u32 pclock) +{ + bool dual_mode = imx8qm_video_dual_mode(&imx_mhdp->mhdp); + struct imx_hdp_clks *clks = &imx_mhdp->clks; + + /* pixel clock for HDMI */ + clk_set_rate(clks->av_pll, pclock); + + if (dual_mode == true) { + clk_set_rate(clks->clk_pxl, pclock/2); + clk_set_rate(clks->clk_pxl_link, pclock/2); + } else { + clk_set_rate(clks->clk_pxl_link, pclock); + clk_set_rate(clks->clk_pxl, pclock); + } + clk_set_rate(clks->clk_pxl_mux, pclock); +} + +static int imx8qm_ipg_clk_enable(struct imx_mhdp_device *imx_mhdp) +{ + int ret; + struct imx_hdp_clks *clks = &imx_mhdp->clks; + struct device *dev = imx_mhdp->mhdp.dev; + + ret = clk_prepare_enable(clks->dig_pll); + if (ret < 0) { + dev_err(dev, "%s, pre dig pll error\n", __func__); + return ret; + } + + ret = clk_prepare_enable(clks->clk_ipg); + if (ret < 0) { + dev_err(dev, "%s, pre clk_ipg error\n", __func__); + return ret; + } + + ret = clk_prepare_enable(clks->clk_core); + if (ret < 0) { + dev_err(dev, "%s, pre clk core error\n", __func__); + return ret; + } + + ret = clk_prepare_enable(clks->lpcg_apb); + if (ret < 0) { + dev_err(dev, "%s, pre clk apb error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->lpcg_lis); + if (ret < 0) { + dev_err(dev, "%s, pre clk lis error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->lpcg_msi); + if (ret < 0) { + dev_err(dev, "%s, pre clk msierror\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->lpcg_apb_csr); + if (ret < 0) { + dev_err(dev, "%s, pre clk apb csr error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->lpcg_apb_ctrl); + if (ret < 0) { + dev_err(dev, "%s, pre clk apb ctrl error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->lpcg_i2s); + if (ret < 0) { + dev_err(dev, "%s, pre clk i2s error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->clk_i2s_bypass); + if (ret < 0) { + dev_err(dev, "%s, pre clk i2s bypass error\n", __func__); + return ret; + } + return ret; +} + +static void imx8qm_ipg_clk_set_rate(struct imx_mhdp_device *imx_mhdp) +{ + struct imx_hdp_clks *clks = &imx_mhdp->clks; + + /* ipg/core clock */ + clk_set_rate(clks->dig_pll, PLL_800MHZ); + clk_set_rate(clks->clk_core, PLL_800MHZ/4); + clk_set_rate(clks->clk_ipg, PLL_800MHZ/8); +} + +static void imx8qm_detach_pm_domains(struct imx_mhdp_device *imx_mhdp) +{ + if (imx_mhdp->pd_pll1_link && !IS_ERR(imx_mhdp->pd_pll1_link)) + device_link_del(imx_mhdp->pd_pll1_link); + if (imx_mhdp->pd_pll1_dev && !IS_ERR(imx_mhdp->pd_pll1_dev)) + dev_pm_domain_detach(imx_mhdp->pd_pll1_dev, true); + + if (imx_mhdp->pd_pll0_link && !IS_ERR(imx_mhdp->pd_pll0_link)) + device_link_del(imx_mhdp->pd_pll0_link); + if (imx_mhdp->pd_pll0_dev && !IS_ERR(imx_mhdp->pd_pll0_dev)) + dev_pm_domain_detach(imx_mhdp->pd_pll0_dev, true); + + if (imx_mhdp->pd_mhdp_link && !IS_ERR(imx_mhdp->pd_mhdp_link)) + device_link_del(imx_mhdp->pd_mhdp_link); + if (imx_mhdp->pd_mhdp_dev && !IS_ERR(imx_mhdp->pd_mhdp_dev)) + dev_pm_domain_detach(imx_mhdp->pd_mhdp_dev, true); + + imx_mhdp->pd_mhdp_dev = NULL; + imx_mhdp->pd_mhdp_link = NULL; + imx_mhdp->pd_pll0_dev = NULL; + imx_mhdp->pd_pll0_link = NULL; + imx_mhdp->pd_pll1_dev = NULL; + imx_mhdp->pd_pll1_link = NULL; +} + +static int imx8qm_attach_pm_domains(struct imx_mhdp_device *imx_mhdp) +{ + struct device *dev = imx_mhdp->mhdp.dev; + u32 flags = DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE; + int ret = 0; + + imx_mhdp->pd_mhdp_dev = dev_pm_domain_attach_by_name(dev, "hdmi"); + if (IS_ERR(imx_mhdp->pd_mhdp_dev)) { + ret = PTR_ERR(imx_mhdp->pd_mhdp_dev); + dev_err(dev, "Failed to attach dc pd dev: %d\n", ret); + goto fail; + } + imx_mhdp->pd_mhdp_link = device_link_add(dev, imx_mhdp->pd_mhdp_dev, flags); + if (IS_ERR(imx_mhdp->pd_mhdp_link)) { + ret = PTR_ERR(imx_mhdp->pd_mhdp_link); + dev_err(dev, "Failed to add device link to dc pd dev: %d\n", + ret); + goto fail; + } + + imx_mhdp->pd_pll0_dev = dev_pm_domain_attach_by_name(dev, "pll0"); + if (IS_ERR(imx_mhdp->pd_pll0_dev)) { + ret = PTR_ERR(imx_mhdp->pd_pll0_dev); + dev_err(dev, "Failed to attach pll0 pd dev: %d\n", ret); + goto fail; + } + imx_mhdp->pd_pll0_link = device_link_add(dev, imx_mhdp->pd_pll0_dev, flags); + if (IS_ERR(imx_mhdp->pd_pll0_link)) { + ret = PTR_ERR(imx_mhdp->pd_pll0_link); + dev_err(dev, "Failed to add device link to pll0 pd dev: %d\n", + ret); + goto fail; + } + + imx_mhdp->pd_pll1_dev = dev_pm_domain_attach_by_name(dev, "pll1"); + if (IS_ERR(imx_mhdp->pd_pll1_dev)) { + ret = PTR_ERR(imx_mhdp->pd_pll1_dev); + dev_err(dev, "Failed to attach pll0 pd dev: %d\n", ret); + goto fail; + } + imx_mhdp->pd_pll1_link = device_link_add(dev, imx_mhdp->pd_pll1_dev, flags); + if (IS_ERR(imx_mhdp->pd_pll1_link)) { + ret = PTR_ERR(imx_mhdp->pd_pll1_link); + dev_err(dev, "Failed to add device link to pll1 pd dev: %d\n", + ret); + goto fail; + } +fail: + imx8qm_detach_pm_domains(imx_mhdp); + return ret; +} + +int cdns_mhdp_power_on_imx8qm(struct cdns_mhdp_device *mhdp) +{ + struct imx_mhdp_device *imx_mhdp = + container_of(mhdp, struct imx_mhdp_device, mhdp); + /* Power on PM Domains */ + + imx8qm_attach_pm_domains(imx_mhdp); + + /* clock init and rate set */ + imx8qm_clocks_init(imx_mhdp); + + imx8qm_ipg_clk_set_rate(imx_mhdp); + + /* Init pixel clock with 148.5MHz before FW init */ + imx8qm_pixel_clk_set_rate(imx_mhdp, 148500000); + + imx8qm_ipg_clk_enable(imx_mhdp); + + imx8qm_clk_mux(imx_mhdp->mhdp.plat_data->is_dp); + + imx8qm_pixel_clk_enable(imx_mhdp); + + imx8qm_phy_reset(1); + + return 0; +} + +void cdns_mhdp_plat_init_imx8qm(struct cdns_mhdp_device *mhdp) +{ + struct imx_mhdp_device *imx_mhdp = + container_of(mhdp, struct imx_mhdp_device, mhdp); + bool dual_mode = imx8qm_video_dual_mode(&imx_mhdp->mhdp); + + imx8qm_pixel_link_sync_disable(dual_mode); + imx8qm_pixel_link_invalid(dual_mode); +} + +void cdns_mhdp_plat_deinit_imx8qm(struct cdns_mhdp_device *mhdp) +{ + struct imx_mhdp_device *imx_mhdp = + container_of(mhdp, struct imx_mhdp_device, mhdp); + bool dual_mode = imx8qm_video_dual_mode(&imx_mhdp->mhdp); + + imx8qm_pixel_link_valid(dual_mode); + imx8qm_pixel_link_sync_enable(dual_mode); +} + +void cdns_mhdp_pclk_rate_imx8qm(struct cdns_mhdp_device *mhdp) +{ + struct imx_mhdp_device *imx_mhdp = + container_of(mhdp, struct imx_mhdp_device, mhdp); + + /* set pixel clock before video mode setup */ + imx8qm_pixel_clk_disable(imx_mhdp); + + imx8qm_pixel_clk_set_rate(imx_mhdp, imx_mhdp->mhdp.mode.clock * 1000); + + imx8qm_pixel_clk_enable(imx_mhdp); + + /* Config pixel link mux */ + imx8qm_pixel_link_mux(imx_mhdp); +} + +int cdns_mhdp_firmware_write_section(struct imx_mhdp_device *imx_mhdp, + const u8 *data, int size, int addr) +{ + int i; + + for (i = 0; i < size; i += 4) { + u32 val = (unsigned int)data[i] << 0 | + (unsigned int)data[i + 1] << 8 | + (unsigned int)data[i + 2] << 16 | + (unsigned int)data[i + 3] << 24; + cdns_mhdp_bus_write(val, &imx_mhdp->mhdp, addr + i); + } + + return 0; +} + +static void cdns_mhdp_firmware_load_cont(const struct firmware *fw, void *context) +{ + struct imx_mhdp_device *imx_mhdp = context; + + imx_mhdp->fw = fw; +} + +static int cdns_mhdp_firmware_load(struct imx_mhdp_device *imx_mhdp) +{ + const u8 *iram; + const u8 *dram; + u32 rate; + int ret; + + /* configure HDMI/DP core clock */ + rate = clk_get_rate(imx_mhdp->clks.clk_core); + if (imx_mhdp->mhdp.is_ls1028a) + rate = rate / 4; + + cdns_mhdp_set_fw_clk(&imx_mhdp->mhdp, rate); + + /* skip fw loading if none is specified */ + if (!imx_mhdp->firmware_name) + goto out; + + if (!imx_mhdp->fw) { + ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_NOUEVENT, + imx_mhdp->firmware_name, + imx_mhdp->mhdp.dev, GFP_KERNEL, + imx_mhdp, + cdns_mhdp_firmware_load_cont); + if (ret < 0) { + DRM_ERROR("failed to load firmware\n"); + return -ENOENT; + } + } else { + iram = imx_mhdp->fw->data + FW_IRAM_OFFSET; + dram = iram + FW_IRAM_SIZE; + + cdns_mhdp_firmware_write_section(imx_mhdp, iram, FW_IRAM_SIZE, ADDR_IMEM); + cdns_mhdp_firmware_write_section(imx_mhdp, dram, FW_DRAM_SIZE, ADDR_DMEM); + } + +out: + /* un-reset ucpu */ + cdns_mhdp_bus_write(0, &imx_mhdp->mhdp, APB_CTRL); + DRM_INFO("Started firmware!\n"); + + return 0; +} + +int cdns_mhdp_firmware_init_imx8qm(struct cdns_mhdp_device *mhdp) +{ + struct imx_mhdp_device *imx_mhdp = + container_of(mhdp, struct imx_mhdp_device, mhdp); + int ret; + + /* load firmware */ + ret = cdns_mhdp_firmware_load(imx_mhdp); + if (ret) + return ret; + + ret = cdns_mhdp_check_alive(&imx_mhdp->mhdp); + if (ret == false) { + DRM_ERROR("NO HDMI FW running\n"); + return -ENXIO; + } + + /* turn on IP activity */ + cdns_mhdp_set_firmware_active(&imx_mhdp->mhdp, 1); + + DRM_INFO("HDP FW Version - ver %d verlib %d\n", + cdns_mhdp_bus_read(mhdp, VER_L) + (cdns_mhdp_bus_read(mhdp, VER_H) << 8), + cdns_mhdp_bus_read(mhdp, VER_LIB_H_ADDR) + (cdns_mhdp_bus_read(mhdp, VER_LIB_H_ADDR) << 8)); + + return 0; +} + +int cdns_mhdp_suspend_imx8qm(struct cdns_mhdp_device *mhdp) +{ + struct imx_mhdp_device *imx_mhdp = + container_of(mhdp, struct imx_mhdp_device, mhdp); + + imx8qm_pixel_clk_disable(imx_mhdp); + + return 0; +} + +int cdns_mhdp_resume_imx8qm(struct cdns_mhdp_device *mhdp) +{ + struct imx_mhdp_device *imx_mhdp = + container_of(mhdp, struct imx_mhdp_device, mhdp); + + imx8qm_pixel_clk_enable(imx_mhdp); + + return cdns_mhdp_firmware_init_imx8qm(mhdp); +} diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c new file mode 100644 index 000000000000..3acbdf575ee2 --- /dev/null +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c @@ -0,0 +1,259 @@ +/* + * copyright (c) 2019 nxp semiconductor, inc. + * + * this program is free software; you can redistribute it and/or modify + * it under the terms of the gnu general public license version 2 as + * published by the free software foundation. + */ +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/component.h> +#include <drm/drm_of.h> +#include <drm/drm_vblank.h> +#include <drm/drm_crtc_helper.h> +#include <drm/drm_encoder_slave.h> + +#include <uapi/linux/media-bus-format.h> + +#include "cdns-mhdp-imx.h" +#include "cdns-mhdp-phy.h" +#include "../imx-drm.h" + +static void cdns_mhdp_imx_encoder_disable(struct drm_encoder *encoder) +{ + struct drm_bridge *bridge = drm_bridge_chain_get_first_bridge(encoder); + struct cdns_mhdp_device *mhdp = bridge->driver_private; + + cdns_mhdp_plat_call(mhdp, plat_init); +} + +static void cdns_mhdp_imx_encoder_enable(struct drm_encoder *encoder) +{ + struct drm_bridge *bridge = drm_bridge_chain_get_first_bridge(encoder); + struct cdns_mhdp_device *mhdp = bridge->driver_private; + + cdns_mhdp_plat_call(mhdp, plat_deinit); +} + +static int cdns_mhdp_imx_encoder_atomic_check(struct drm_encoder *encoder, + struct drm_crtc_state *crtc_state, + struct drm_connector_state *conn_state) +{ + struct imx_crtc_state *imx_crtc_state = to_imx_crtc_state(crtc_state); + struct drm_bridge *bridge = drm_bridge_chain_get_first_bridge(encoder); + struct cdns_mhdp_device *mhdp = bridge->driver_private; + + if (mhdp->plat_data->video_format != 0) + imx_crtc_state->bus_format = mhdp->plat_data->video_format; + + if (mhdp->force_mode_set) + crtc_state->mode_changed = true; + + return 0; +} + +static const struct drm_encoder_helper_funcs cdns_mhdp_imx_encoder_helper_funcs = { + .enable = cdns_mhdp_imx_encoder_enable, + .disable = cdns_mhdp_imx_encoder_disable, + .atomic_check = cdns_mhdp_imx_encoder_atomic_check, +}; + +static const struct drm_encoder_funcs cdns_mhdp_imx_encoder_funcs = { + .destroy = drm_encoder_cleanup, +}; + +static struct cdns_plat_data imx8mq_hdmi_drv_data = { + .plat_name = "imx8mq-hdmi", + .bind = cdns_hdmi_bind, + .unbind = cdns_hdmi_unbind, + .phy_set = cdns_hdmi_phy_set_imx8mq, + .phy_video_valid = cdns_hdmi_phy_video_valid_imx8mq, + .bus_type = BUS_TYPE_NORMAL_APB, +}; + +static struct cdns_plat_data imx8mq_dp_drv_data = { + .plat_name = "imx8mq-dp", + .bind = cdns_dp_bind, + .unbind = cdns_dp_unbind, + .phy_set = cdns_dp_phy_set_imx8mq, + .bus_type = BUS_TYPE_NORMAL_APB, +}; + +static struct cdns_plat_data imx8qm_hdmi_drv_data = { + .plat_name = "imx8qm-hdmi", + .bind = cdns_hdmi_bind, + .unbind = cdns_hdmi_unbind, + .phy_set = cdns_hdmi_phy_set_imx8qm, + .phy_video_valid = cdns_hdmi_phy_video_valid_imx8qm, + .power_on = cdns_mhdp_power_on_imx8qm, + .firmware_init = cdns_mhdp_firmware_init_imx8qm, + .resume = cdns_mhdp_resume_imx8qm, + .suspend = cdns_mhdp_suspend_imx8qm, + .pclk_rate = cdns_mhdp_pclk_rate_imx8qm, + .plat_init = cdns_mhdp_plat_init_imx8qm, + .plat_deinit = cdns_mhdp_plat_deinit_imx8qm, + .bus_type = BUS_TYPE_LOW4K_APB, + .video_format = MEDIA_BUS_FMT_RGB101010_1X30, +}; + +static struct cdns_plat_data imx8qm_dp_drv_data = { + .plat_name = "imx8qm-dp", + .bind = cdns_dp_bind, + .unbind = cdns_dp_unbind, + .phy_set = cdns_dp_phy_set_imx8qm, + .power_on = cdns_mhdp_power_on_imx8qm, + .firmware_init = cdns_mhdp_firmware_init_imx8qm, + .pclk_rate = cdns_mhdp_pclk_rate_imx8qm, + .plat_init = cdns_mhdp_plat_init_imx8qm, + .plat_deinit = cdns_mhdp_plat_deinit_imx8qm, + .bus_type = BUS_TYPE_LOW4K_APB, + .video_format = MEDIA_BUS_FMT_RGB101010_1X30, + .is_dp = true, +}; + +static struct cdns_plat_data ls1028a_dp_drv_data = { + .bind = cdns_dp_bind, + .unbind = cdns_dp_unbind, + .phy_set = cdns_dp_phy_set_imx8mq, + .power_on = cdns_mhdp_power_on_ls1028a, + .firmware_init = cdns_mhdp_firmware_init_imx8qm, + .pclk_rate = cdns_mhdp_pclk_rate_ls1028a, + .bus_type = BUS_TYPE_NORMAL_APB, +}; + +static const struct of_device_id cdns_mhdp_imx_dt_ids[] = { + { .compatible = "cdn,imx8mq-hdmi", + .data = &imx8mq_hdmi_drv_data + }, + { .compatible = "cdn,imx8mq-dp", + .data = &imx8mq_dp_drv_data + }, + { .compatible = "cdn,imx8qm-hdmi", + .data = &imx8qm_hdmi_drv_data + }, + { .compatible = "cdn,imx8qm-dp", + .data = &imx8qm_dp_drv_data + }, + { .compatible = "cdn,ls1028a-dp", + .data = &ls1028a_dp_drv_data + }, + {}, +}; +MODULE_DEVICE_TABLE(of, cdns_mhdp_imx_dt_ids); + +static int cdns_mhdp_imx_bind(struct device *dev, struct device *master, + void *data) +{ + struct platform_device *pdev = to_platform_device(dev); + const struct cdns_plat_data *plat_data; + const struct of_device_id *match; + struct drm_device *drm = data; + struct drm_encoder *encoder; + struct imx_mhdp_device *imx_mhdp; + int ret; + + if (!pdev->dev.of_node) + return -ENODEV; + + imx_mhdp = devm_kzalloc(&pdev->dev, sizeof(*imx_mhdp), GFP_KERNEL); + if (!imx_mhdp) + return -ENOMEM; + + match = of_match_node(cdns_mhdp_imx_dt_ids, pdev->dev.of_node); + plat_data = match->data; + encoder = &imx_mhdp->encoder; + + encoder->possible_crtcs = drm_of_find_possible_crtcs(drm, dev->of_node); + + ret = of_property_read_string(pdev->dev.of_node, "firmware-name", + &imx_mhdp->firmware_name); + /* + * If we failed to find the CRTC(s) which this encoder is + * supposed to be connected to, it's because the CRTC has + * not been registered yet. Defer probing, and hope that + * the required CRTC is added later. + */ + if (encoder->possible_crtcs == 0) + return -EPROBE_DEFER; + + drm_encoder_helper_add(encoder, &cdns_mhdp_imx_encoder_helper_funcs); + drm_encoder_init(drm, encoder, &cdns_mhdp_imx_encoder_funcs, + DRM_MODE_ENCODER_TMDS, NULL); + + + imx_mhdp->mhdp.plat_data = plat_data; + imx_mhdp->mhdp.dev = dev; + imx_mhdp->mhdp.bus_type = plat_data->bus_type; + ret = plat_data->bind(pdev, encoder, &imx_mhdp->mhdp); + /* + * If cdns_mhdp_bind() fails we'll never call cdns_mhdp_unbind(), + * which would have called the encoder cleanup. Do it manually. + */ + if (ret < 0) + drm_encoder_cleanup(encoder); + + return ret; +} + +static void cdns_mhdp_imx_unbind(struct device *dev, struct device *master, + void *data) +{ + struct imx_mhdp_device *imx_mhdp = dev_get_drvdata(dev); + + imx_mhdp->mhdp.plat_data->unbind(dev); +} + +static const struct component_ops cdns_mhdp_imx_ops = { + .bind = cdns_mhdp_imx_bind, + .unbind = cdns_mhdp_imx_unbind, +}; + +static int cdns_mhdp_imx_suspend(struct device *dev) +{ + struct imx_mhdp_device *imx_mhdp = dev_get_drvdata(dev); + + cdns_mhdp_plat_call(&imx_mhdp->mhdp, suspend); + + return 0; +} + +static int cdns_mhdp_imx_resume(struct device *dev) +{ + struct imx_mhdp_device *imx_mhdp = dev_get_drvdata(dev); + + cdns_mhdp_plat_call(&imx_mhdp->mhdp, resume); + + return 0; +} + +static int cdns_mhdp_imx_probe(struct platform_device *pdev) +{ + return component_add(&pdev->dev, &cdns_mhdp_imx_ops); +} + +static int cdns_mhdp_imx_remove(struct platform_device *pdev) +{ + component_del(&pdev->dev, &cdns_mhdp_imx_ops); + + return 0; +} + +static const struct dev_pm_ops cdns_mhdp_imx_pm_ops = { + SET_LATE_SYSTEM_SLEEP_PM_OPS(cdns_mhdp_imx_suspend, cdns_mhdp_imx_resume) +}; + +static struct platform_driver cdns_mhdp_imx_platform_driver = { + .probe = cdns_mhdp_imx_probe, + .remove = cdns_mhdp_imx_remove, + .driver = { + .name = "cdns-mhdp-imx", + .of_match_table = cdns_mhdp_imx_dt_ids, + .pm = &cdns_mhdp_imx_pm_ops, + }, +}; + +module_platform_driver(cdns_mhdp_imx_platform_driver); + +MODULE_AUTHOR("Sandor YU <sandor.yu@nxp.com>"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:cdnhdmi-imx"); diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-ls1028a.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-ls1028a.c new file mode 100644 index 000000000000..4cc71301f5fe --- /dev/null +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-ls1028a.c @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright 2019 NXP + * + */ +#include <linux/clk.h> +#include <drm/drm_vblank.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_device.h> + +#include "cdns-mhdp-imx.h" + +static const struct of_device_id scfg_device_ids[] = { + { .compatible = "fsl,ls1028a-scfg", }, + {} +}; + +static void ls1028a_phy_reset(u8 reset) +{ + struct device_node *scfg_node; + void __iomem *scfg_base = NULL; + + scfg_node = of_find_matching_node(NULL, scfg_device_ids); + if (scfg_node) + scfg_base = of_iomap(scfg_node, 0); + + iowrite32(reset, scfg_base + 0x230); +} + +int ls1028a_clocks_init(struct imx_mhdp_device *imx_mhdp) +{ + struct device *dev = imx_mhdp->mhdp.dev; + struct imx_hdp_clks *clks = &imx_mhdp->clks; + + clks->clk_core = devm_clk_get(dev, "clk_core"); + if (IS_ERR(clks->clk_core)) { + dev_warn(dev, "failed to get hdp core clk\n"); + return PTR_ERR(clks->clk_core); + } + + clks->clk_pxl = devm_clk_get(dev, "clk_pxl"); + if (IS_ERR(clks->clk_pxl)) { + dev_warn(dev, "failed to get pxl clk\n"); + return PTR_ERR(clks->clk_pxl); + } + + return true; +} + +static int ls1028a_pixel_clk_enable(struct imx_mhdp_device *imx_mhdp) +{ + struct imx_hdp_clks *clks = &imx_mhdp->clks; + struct device *dev = imx_mhdp->mhdp.dev; + int ret; + + ret = clk_prepare_enable(clks->clk_pxl); + if (ret < 0) { + dev_err(dev, "%s, pre clk pxl error\n", __func__); + return ret; + } + + return ret; +} + +static void ls1028a_pixel_clk_disable(struct imx_mhdp_device *imx_mhdp) +{ + struct imx_hdp_clks *clks = &imx_mhdp->clks; + + clk_disable_unprepare(clks->clk_pxl); +} + +static void ls1028a_pixel_clk_set_rate(struct imx_mhdp_device *imx_mhdp, + u32 pclock) +{ + struct imx_hdp_clks *clks = &imx_mhdp->clks; + + clk_set_rate(clks->clk_pxl, pclock); +} + +int cdns_mhdp_power_on_ls1028a(struct cdns_mhdp_device *mhdp) +{ + struct imx_mhdp_device *imx_mhdp = container_of + (mhdp, struct imx_mhdp_device, mhdp); + + /* clock init and rate set */ + ls1028a_clocks_init(imx_mhdp); + + ls1028a_pixel_clk_enable(imx_mhdp); + + /* Init pixel clock with 148.5MHz before FW init */ + ls1028a_pixel_clk_set_rate(imx_mhdp, 148500000); + + ls1028a_phy_reset(1); + + return 0; +} + +void cdns_mhdp_pclk_rate_ls1028a(struct cdns_mhdp_device *mhdp) +{ + struct imx_mhdp_device *imx_mhdp = container_of + (mhdp, struct imx_mhdp_device, mhdp); + + /* set pixel clock before video mode setup */ + ls1028a_pixel_clk_disable(imx_mhdp); + + ls1028a_pixel_clk_set_rate(imx_mhdp, imx_mhdp->mhdp.mode.clock * 1000); + + ls1028a_pixel_clk_enable(imx_mhdp); +} diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-phy.h b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-phy.h new file mode 100644 index 000000000000..5682b9fbc90f --- /dev/null +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-phy.h @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2019 NXP Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#ifndef _CDN_DP_PHY_H +#define _CDN_DP_PHY_H + +#include <drm/bridge/cdns-mhdp.h> + +#define CMN_SSM_BIAS_TMR 0x0022 +#define CMN_PLLSM0_PLLEN_TMR 0x0029 +#define CMN_PLLSM0_PLLPRE_TMR 0x002A +#define CMN_PLLSM0_PLLVREF_TMR 0x002B +#define CMN_PLLSM0_PLLLOCK_TMR 0x002C +#define CMN_PLLSM0_USER_DEF_CTRL 0x002F +#define CMN_PSM_CLK_CTRL 0x0061 +#define CMN_CDIAG_REFCLK_CTRL 0x0062 +#define CMN_PLL0_VCOCAL_START 0x0081 +#define CMN_PLL0_VCOCAL_INIT_TMR 0x0084 +#define CMN_PLL0_VCOCAL_ITER_TMR 0x0085 +#define CMN_PLL0_INTDIV 0x0094 +#define CMN_PLL0_FRACDIV 0x0095 +#define CMN_PLL0_HIGH_THR 0x0096 +#define CMN_PLL0_DSM_DIAG 0x0097 +#define CMN_PLL0_SS_CTRL1 0x0098 +#define CMN_PLL0_SS_CTRL2 0x0099 +#define CMN_ICAL_INIT_TMR 0x00C4 +#define CMN_ICAL_ITER_TMR 0x00C5 +#define CMN_RXCAL_INIT_TMR 0x00D4 +#define CMN_RXCAL_ITER_TMR 0x00D5 +#define CMN_TXPUCAL_CTRL 0x00E0 +#define CMN_TXPUCAL_INIT_TMR 0x00E4 +#define CMN_TXPUCAL_ITER_TMR 0x00E5 +#define CMN_TXPDCAL_CTRL 0x00F0 +#define CMN_TXPDCAL_INIT_TMR 0x00F4 +#define CMN_TXPDCAL_ITER_TMR 0x00F5 +#define CMN_ICAL_ADJ_INIT_TMR 0x0102 +#define CMN_ICAL_ADJ_ITER_TMR 0x0103 +#define CMN_RX_ADJ_INIT_TMR 0x0106 +#define CMN_RX_ADJ_ITER_TMR 0x0107 +#define CMN_TXPU_ADJ_CTRL 0x0108 +#define CMN_TXPU_ADJ_INIT_TMR 0x010A +#define CMN_TXPU_ADJ_ITER_TMR 0x010B +#define CMN_TXPD_ADJ_CTRL 0x010c +#define CMN_TXPD_ADJ_INIT_TMR 0x010E +#define CMN_TXPD_ADJ_ITER_TMR 0x010F +#define CMN_DIAG_PLL0_FBH_OVRD 0x01C0 +#define CMN_DIAG_PLL0_FBL_OVRD 0x01C1 +#define CMN_DIAG_PLL0_OVRD 0x01C2 +#define CMN_DIAG_PLL0_TEST_MODE 0x01C4 +#define CMN_DIAG_PLL0_V2I_TUNE 0x01C5 +#define CMN_DIAG_PLL0_CP_TUNE 0x01C6 +#define CMN_DIAG_PLL0_LF_PROG 0x01C7 +#define CMN_DIAG_PLL0_PTATIS_TUNE1 0x01C8 +#define CMN_DIAG_PLL0_PTATIS_TUNE2 0x01C9 +#define CMN_DIAG_PLL0_INCLK_CTRL 0x01CA +#define CMN_DIAG_PLL0_PXL_DIVH 0x01CB +#define CMN_DIAG_PLL0_PXL_DIVL 0x01CC +#define CMN_DIAG_HSCLK_SEL 0x01E0 +#define CMN_DIAG_PER_CAL_ADJ 0x01EC +#define CMN_DIAG_CAL_CTRL 0x01ED +#define CMN_DIAG_ACYA 0x01FF +#define XCVR_PSM_RCTRL 0x4001 +#define XCVR_PSM_CAL_TMR 0x4002 +#define XCVR_PSM_A0IN_TMR 0x4003 +#define TX_TXCC_CAL_SCLR_MULT_0 0x4047 +#define TX_TXCC_CPOST_MULT_00_0 0x404C +#define TX_TXCC_MGNFS_MULT_000_0 0x4050 +#define XCVR_DIAG_PLLDRC_CTRL 0x40E0 +#define XCVR_DIAG_PLLDRC_CTRL 0x40E0 +#define XCVR_DIAG_HSCLK_SEL 0x40E1 +#define XCVR_DIAG_BIDI_CTRL 0x40E8 +#define XCVR_DIAG_LANE_FCM_EN_MGN_TMR 0x40F2 +#define XCVR_DIAG_LANE_FCM_EN_MGN 0x40F2 +#define TX_PSC_A0 0x4100 +#define TX_PSC_A1 0x4101 +#define TX_PSC_A2 0x4102 +#define TX_PSC_A3 0x4103 +#define TX_RCVDET_CTRL 0x4120 +#define TX_RCVDET_EN_TMR 0x4122 +#define TX_RCVDET_EN_TMR 0x4122 +#define TX_RCVDET_ST_TMR 0x4123 +#define TX_RCVDET_ST_TMR 0x4123 +#define TX_BIST_CTRL 0x4140 +#define TX_BIST_UDDWR 0x4141 +#define TX_DIAG_TX_CTRL 0x41E0 +#define TX_DIAG_TX_DRV 0x41E1 +#define TX_DIAG_BGREF_PREDRV_DELAY 0x41E7 +#define TX_DIAG_BGREF_PREDRV_DELAY 0x41E7 +#define XCVR_PSM_RCTRL_1 0x4201 +#define TX_TXCC_CAL_SCLR_MULT_1 0x4247 +#define TX_TXCC_CPOST_MULT_00_1 0x424C +#define TX_TXCC_MGNFS_MULT_000_1 0x4250 +#define XCVR_DIAG_PLLDRC_CTRL_1 0x42E0 +#define XCVR_DIAG_HSCLK_SEL_1 0x42E1 +#define XCVR_DIAG_LANE_FCM_EN_MGN_TMR_1 0x42F2 +#define TX_RCVDET_EN_TMR_1 0x4322 +#define TX_RCVDET_ST_TMR_1 0x4323 +#define TX_DIAG_ACYA_0 0x41FF +#define TX_DIAG_ACYA_1 0x43FF +#define TX_DIAG_ACYA_2 0x45FF +#define TX_DIAG_ACYA_3 0x47FF +#define TX_ANA_CTRL_REG_1 0x5020 +#define TX_ANA_CTRL_REG_2 0x5021 +#define TXDA_COEFF_CALC 0x5022 +#define TX_DIG_CTRL_REG_1 0x5023 +#define TX_DIG_CTRL_REG_2 0x5024 +#define TXDA_CYA_AUXDA_CYA 0x5025 +#define TX_ANA_CTRL_REG_3 0x5026 +#define TX_ANA_CTRL_REG_4 0x5027 +#define TX_ANA_CTRL_REG_5 0x5029 +#define RX_PSC_A0 0x8000 +#define RX_PSC_CAL 0x8006 +#define PMA_LANE_CFG 0xC000 +#define PIPE_CMN_CTRL1 0xC001 +#define PIPE_CMN_CTRL2 0xC002 +#define PIPE_COM_LOCK_CFG1 0xC003 +#define PIPE_COM_LOCK_CFG2 0xC004 +#define PIPE_RCV_DET_INH 0xC005 +#define PHY_HDP_MODE_CTRL 0xC008 +#define PHY_HDP_CLK_CTL 0xC009 +#define STS 0xC00F +#define PHY_ISO_CMN_CTRL 0xC010 +#define PHY_ISO_CMN_CTRL 0xC010 +#define PHY_HDP_TX_CTL_L0 0xC408 +#define PHY_DP_TX_CTL 0xC408 +#define PHY_HDP_TX_CTL_L1 0xC448 +#define PHY_HDP_TX_CTL_L2 0xC488 +#define PHY_HDP_TX_CTL_L3 0xC4C8 +#define PHY_PMA_CMN_CTRL1 0xC800 +#define PMA_CMN_CTRL1 0xC800 +#define PHY_PMA_ISO_CMN_CTRL 0xC810 +#define PHY_PMA_ISO_PLL_CTRL1 0xC812 +#define PHY_PMA_ISOLATION_CTRL 0xC81F +#define PHY_ISOLATION_CTRL 0xC81F +#define PHY_PMA_ISO_XCVR_CTRL 0xCC11 +#define PHY_PMA_ISO_LINK_MODE 0xCC12 +#define PHY_PMA_ISO_PWRST_CTRL 0xCC13 +#define PHY_PMA_ISO_TX_DATA_LO 0xCC14 +#define PHY_PMA_ISO_TX_DATA_HI 0xCC15 +#define PHY_PMA_ISO_RX_DATA_LO 0xCC16 +#define PHY_PMA_ISO_RX_DATA_HI 0xCC17 + +int cdns_dp_phy_set_imx8mq(struct cdns_mhdp_device *hdp); +int cdns_dp_phy_set_imx8qm(struct cdns_mhdp_device *hdp); +bool cdns_hdmi_phy_video_valid_imx8mq(struct cdns_mhdp_device *hdp); +bool cdns_hdmi_phy_video_valid_imx8qm(struct cdns_mhdp_device *hdp); +int cdns_hdmi_phy_set_imx8mq(struct cdns_mhdp_device *hdp); +int cdns_hdmi_phy_set_imx8qm(struct cdns_mhdp_device *hdp); +#endif /* _CDNS_MHDP_PHY_H */ -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0031-LF-1514-drm-cdns-mhdp-check-link-rate-index.patch ================================================ From 8aa7d7baa5eb142261ddafc91b0ba884aa670421 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Fri, 19 Jun 2020 16:17:55 +0800 Subject: [PATCH 31/49] LF-1514: drm: cdns-mhdp: check link rate index Check link rate index to advoid negative array index read. report by Coverity ID:6652950 6652949. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Fancy Fang <chen.fang@nxp.com> --- drivers/gpu/drm/imx/mhdp/cdns-mhdp-dp-phy.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-dp-phy.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-dp-phy.c index a6d03c94d196..5c75e7d40cc0 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-dp-phy.c +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-dp-phy.c @@ -198,6 +198,10 @@ static void dp_phy_pma_cmn_pll0_24mhz(struct cdns_mhdp_device *mhdp) /* DP PHY PLL 24MHz configuration */ index = link_rate_index(link_rate); + if (index < 0) { + dev_err(mhdp->dev, "wrong link rate index\n"); + return; + } for (i = 0; i < ARRAY_SIZE(phy_pll_24m_cfg); i++) cdns_phy_reg_write(mhdp, phy_pll_24m_cfg[i].addr, phy_pll_24m_cfg[i].val[index]); @@ -320,6 +324,10 @@ static void dp_phy_pma_cmn_pll0_27mhz(struct cdns_mhdp_device *mhdp) /* DP PHY PLL 27MHz configuration */ index = link_rate_index(link_rate); + if (index < 0) { + dev_err(mhdp->dev, "wrong link rate index\n"); + return; + } for (i = 0; i < ARRAY_SIZE(phy_pll_27m_cfg); i++) cdns_phy_reg_write(mhdp, phy_pll_27m_cfg[i].addr, phy_pll_27m_cfg[i].val[index]); -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0032-LF-1516-drm-cdns-mhdp-fix-error-check-variable-name-.patch ================================================ From b2ea44969c5e51a5809622384728859d7f3a2b8a Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Fri, 19 Jun 2020 16:25:51 +0800 Subject: [PATCH 32/49] LF-1516: drm: cdns-mhdp: fix error check variable name for clk_pxl_link fix error check variable name for clk_pxl_link. Report by Coverity ID:6652947 Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Fancy Fang <chen.fang@nxp.com> --- drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c index a3ba3da4b05d..2ee4e8748b77 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c @@ -167,7 +167,7 @@ int imx8qm_clocks_init(struct imx_mhdp_device *imx_mhdp) } clks->clk_pxl_link = devm_clk_get(dev, "clk_pxl_link"); - if (IS_ERR(clks->clk_pxl_mux)) { + if (IS_ERR(clks->clk_pxl_link)) { dev_warn(dev, "failed to get pxl link clk\n"); return PTR_ERR(clks->clk_pxl_link); } -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0033-MLK-24601-drm-imx-mhdp-DP-PHY-support-1-2-lanes-mode.patch ================================================ From c789945d09e4c77eb30af1a8db1425cefab52080 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Fri, 28 Aug 2020 10:09:12 +0800 Subject: [PATCH 33/49] MLK-24601: drm: imx: mhdp: DP PHY support 1/2 lanes mode All four lanes should be configurated for 1/2/4 lanes modes in driver. The DP FW will power down unused PHY lanes after negotiation. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> --- drivers/gpu/drm/imx/mhdp/cdns-mhdp-dp-phy.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-dp-phy.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-dp-phy.c index 5c75e7d40cc0..3d17840b0941 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-dp-phy.c +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-dp-phy.c @@ -137,7 +137,7 @@ static void dp_aux_cfg(struct cdns_mhdp_device *mhdp) static void dp_phy_pma_cmn_cfg_24mhz(struct cdns_mhdp_device *mhdp) { int k; - u32 num_lanes = mhdp->dp.num_lanes; + u32 num_lanes = 4; u16 val; val = cdns_phy_reg_read(mhdp, PHY_PMA_CMN_CTRL1); @@ -157,7 +157,7 @@ static void dp_phy_pma_cmn_cfg_24mhz(struct cdns_mhdp_device *mhdp) /* Valid for 24 MHz only */ static void dp_phy_pma_cmn_pll0_24mhz(struct cdns_mhdp_device *mhdp) { - u32 num_lanes = mhdp->dp.num_lanes; + u32 num_lanes = 4; u32 link_rate = mhdp->dp.rate; u16 val; int index, i, k; @@ -228,7 +228,7 @@ static void dp_phy_pma_cmn_pll0_24mhz(struct cdns_mhdp_device *mhdp) /* PMA common configuration for 27MHz */ static void dp_phy_pma_cmn_cfg_27mhz(struct cdns_mhdp_device *mhdp) { - u32 num_lanes = mhdp->dp.num_lanes; + u32 num_lanes = 4; u16 val; int k; @@ -279,7 +279,7 @@ static void dp_phy_pma_cmn_cfg_27mhz(struct cdns_mhdp_device *mhdp) static void dp_phy_pma_cmn_pll0_27mhz(struct cdns_mhdp_device *mhdp) { - u32 num_lanes = mhdp->dp.num_lanes; + u32 num_lanes = 4; u32 link_rate = mhdp->dp.rate; u16 val; int index, i, k; -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0034-MLK-24519-2-gpu-imx-Increase-maximum-single-pipe-wid.patch ================================================ From 7772a57acd0e05353caead7eb7d064e36bcb92e6 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Sun, 20 Sep 2020 19:32:28 +0800 Subject: [PATCH 34/49] MLK-24519-2 gpu: imx: Increase maximum single pipe width to 2560 This patch increase the DPU single pipe maximum from 1920 to 2560 for HDMI/DP. Signed-off-by: Oliver F. Brown <oliver.brown@nxp.com> Reviewed-by: Liu Ying <victor.liu@nxp.com> --- drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c index 2ee4e8748b77..cda4d245bab8 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c @@ -22,7 +22,7 @@ #define PLL_800MHZ (800000000) #define HDP_DUAL_MODE_MIN_PCLK_RATE 300000 /* KHz */ -#define HDP_SINGLE_MODE_MAX_WIDTH 1920 +#define HDP_SINGLE_MODE_MAX_WIDTH 2560 #define CSR_PIXEL_LINK_MUX_CTL 0x00 #define CSR_PIXEL_LINK_MUX_VCP_OFFSET 5 -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0035-MLK-24072-drm-imx8-correct-mhdp-files-copyright.patch ================================================ From 60077991d60b1ba96e52d5a6568ae65ae7143ee2 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Wed, 20 May 2020 10:56:53 +0800 Subject: [PATCH 35/49] MLK-24072: drm: imx8: correct mhdp files copyright Correct mhdp files copyright. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> --- drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c | 2 +- drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c index cda4d245bab8..38f9defa42f8 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c @@ -1,5 +1,5 @@ /* - * copyright (c) 2019 nxp semiconductor, inc. + * Copyright (c) 2019 NXP semiconductor, inc. * * this program is free software; you can redistribute it and/or modify * it under the terms of the gnu general public license version 2 as diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c index 3acbdf575ee2..cc429fe48abd 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c @@ -1,5 +1,5 @@ /* - * copyright (c) 2019 nxp semiconductor, inc. + * Copyright (c) 2019 NXP semiconductor, inc. * * this program is free software; you can redistribute it and/or modify * it under the terms of the gnu general public license version 2 as -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0036-LF-2744-drm-cdns-reset-force_mode_set-flag-in-atomic.patch ================================================ From 93502b984119af556f8a204bf80a62bc1c21fbfd Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Tue, 17 Nov 2020 15:47:36 +0800 Subject: [PATCH 36/49] LF-2744: drm: cdns: reset force_mode_set flag in atomic_check Reset force_mode_set flag in atomic_check function to avoid set mode_changed flag multi times when cable plugin. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> --- drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c index cc429fe48abd..9fa0df74ad7c 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 NXP semiconductor, inc. + * Copyright (c) 2019-2020 NXP semiconductor, inc. * * this program is free software; you can redistribute it and/or modify * it under the terms of the gnu general public license version 2 as @@ -44,8 +44,11 @@ static int cdns_mhdp_imx_encoder_atomic_check(struct drm_encoder *encoder, if (mhdp->plat_data->video_format != 0) imx_crtc_state->bus_format = mhdp->plat_data->video_format; - if (mhdp->force_mode_set) + if (mhdp->force_mode_set) { crtc_state->mode_changed = true; + /* reset force mode set flag */ + mhdp->force_mode_set = false; + } return 0; } -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0037-MLK-25199-1-drm-mhdp-Add-hdmi-phy-reset-poweroff-fun.patch ================================================ From 38f1f4ecd038628f4ce7a47114455123e5db3367 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Wed, 30 Dec 2020 16:02:52 +0800 Subject: [PATCH 37/49] MLK-25199-1: drm: mhdp: Add hdmi phy reset/poweroff function Add hdmi phy reset and power off function. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> --- drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c | 28 ++++++++++++++++++- drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx.h | 3 +- drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c | 4 +-- drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c | 2 ++ drivers/gpu/drm/imx/mhdp/cdns-mhdp-phy.h | 3 +- 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c index 120300e6a2df..212f3f4f1e26 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c @@ -1,7 +1,7 @@ /* * Cadence High-Definition Multimedia Interface (HDMI) driver * - * Copyright (C) 2019 NXP Semiconductor, Inc. + * Copyright (C) 2019-2021 NXP Semiconductor, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ #include <drm/bridge/cdns-mhdp.h> #include "cdns-mhdp-phy.h" +#include "cdns-mhdp-imx.h" /* HDMI TX clock control settings */ struct hdmi_ctrl { @@ -746,6 +747,7 @@ int cdns_hdmi_phy_set_imx8qm(struct cdns_mhdp_device *mhdp) DRM_ERROR("NO HDMI FW running\n"); return -ENXIO; } + imx8qm_phy_reset(0); /* Configure PHY */ mhdp->hdmi.char_rate = hdmi_phy_cfg_ss28fdsoi(mhdp, mode); @@ -753,6 +755,7 @@ int cdns_hdmi_phy_set_imx8qm(struct cdns_mhdp_device *mhdp) DRM_ERROR("failed to set phy pclock\n"); return -EINVAL; } + imx8qm_phy_reset(1); ret = hdmi_phy_power_up(mhdp); if (ret < 0) @@ -762,3 +765,26 @@ int cdns_hdmi_phy_set_imx8qm(struct cdns_mhdp_device *mhdp) return true; } + +int cdns_hdmi_phy_shutdown(struct cdns_mhdp_device *mhdp) +{ + int timeout; + u32 reg_val; + + reg_val = cdns_phy_reg_read(mhdp, PHY_HDP_MODE_CTRL); + reg_val &= 0xfff0; + /* PHY_DP_MODE_CTL set to A3 power state*/ + cdns_phy_reg_write(mhdp, PHY_HDP_MODE_CTRL, reg_val | 0x8); + + /* PHY_DP_MODE_CTL */ + timeout = 0; + do { + reg_val = cdns_phy_reg_read(mhdp, PHY_HDP_MODE_CTRL); + DRM_INFO("Reg val is 0x%04x\n", reg_val); + timeout++; + msleep(100); + } while (!(reg_val & (0x8 << 4)) && (timeout < 10)); /* Wait for A3 acknowledge */ + + DRM_INFO("hdmi phy shutdown complete\n"); + return 0; +} diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx.h b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx.h index fc3247dada2d..a12005ae4c53 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx.h +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx.h @@ -1,7 +1,7 @@ /* * Cadence High-Definition Multimedia Interface (HDMI) driver * - * Copyright (C) 2019 NXP Semiconductor, Inc. + * Copyright (C) 2019-2021 NXP Semiconductor, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -72,4 +72,5 @@ int cdns_mhdp_suspend_imx8qm(struct cdns_mhdp_device *mhdp); int cdns_mhdp_power_on_imx8qm(struct cdns_mhdp_device *mhdp); int cdns_mhdp_power_on_ls1028a(struct cdns_mhdp_device *mhdp); void cdns_mhdp_pclk_rate_ls1028a(struct cdns_mhdp_device *mhdp); +void imx8qm_phy_reset(u8 reset); #endif /* CDNS_MHDP_IMX_H_ */ diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c index 38f9defa42f8..46c0500da4c3 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 NXP semiconductor, inc. + * Copyright (c) 2019-2021 NXP semiconductor, inc. * * this program is free software; you can redistribute it and/or modify * it under the terms of the gnu general public license version 2 as @@ -102,7 +102,7 @@ static void imx8qm_pixel_link_sync_disable(u32 dual_mode) imx_sc_misc_set_control(handle, IMX_SC_R_DC_0, IMX_SC_C_SYNC_CTRL0, 0); } -static void imx8qm_phy_reset(u8 reset) +void imx8qm_phy_reset(u8 reset) { struct imx_sc_ipc *handle; diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c index 9fa0df74ad7c..4c4ce9d3c847 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c @@ -22,6 +22,7 @@ static void cdns_mhdp_imx_encoder_disable(struct drm_encoder *encoder) struct drm_bridge *bridge = drm_bridge_chain_get_first_bridge(encoder); struct cdns_mhdp_device *mhdp = bridge->driver_private; + cdns_hdmi_phy_shutdown(mhdp); cdns_mhdp_plat_call(mhdp, plat_init); } @@ -184,6 +185,7 @@ static int cdns_mhdp_imx_bind(struct device *dev, struct device *master, imx_mhdp->mhdp.plat_data = plat_data; imx_mhdp->mhdp.dev = dev; + imx_mhdp->mhdp.drm_dev = drm; imx_mhdp->mhdp.bus_type = plat_data->bus_type; ret = plat_data->bind(pdev, encoder, &imx_mhdp->mhdp); /* diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-phy.h b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-phy.h index 5682b9fbc90f..9035f1f71eee 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-phy.h +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-phy.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 NXP Semiconductor, Inc. + * Copyright (C) 2019-2021 NXP Semiconductor, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -152,4 +152,5 @@ bool cdns_hdmi_phy_video_valid_imx8mq(struct cdns_mhdp_device *hdp); bool cdns_hdmi_phy_video_valid_imx8qm(struct cdns_mhdp_device *hdp); int cdns_hdmi_phy_set_imx8mq(struct cdns_mhdp_device *hdp); int cdns_hdmi_phy_set_imx8qm(struct cdns_mhdp_device *hdp); +int cdns_hdmi_phy_shutdown(struct cdns_mhdp_device *mhdp); #endif /* _CDNS_MHDP_PHY_H */ -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0038-MLK-25199-2-drm-mhdp-Fix-typo-for-hdmi-phy-configura.patch ================================================ From d77cbee9949eda85baba634bdf6c6c2afe0b64e4 Mon Sep 17 00:00:00 2001 From: Sandor Yu <Sandor.yu@nxp.com> Date: Thu, 31 Dec 2020 10:13:55 +0800 Subject: [PATCH 38/49] MLK-25199-2: drm: mhdp: Fix typo for hdmi phy configuration table Fix typo for imx8qm hdmi phy configuration table. Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com> --- drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c index 212f3f4f1e26..f96b200885df 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c @@ -95,11 +95,11 @@ static const struct hdmi_ctrl imx8qm_ctrl_table[] = { { 85000, 170000, 1000, 850000, 1700000, 0x11, 0x00, 0x07, 340, 0x146, 0x00A, 0, 0, 0, 1700000, 3400000, 0, 1, 1, 2, 2, 0x01, 85000, 170000}, {170000, 340000, 1000, 1700000, 3400000, 0x22, 0x01, 0x07, 340, 0x146, 0x00A, 0, 0, 0, 1700000, 3400000, 0, 1, 1, 2, 1, 0x00, 170000, 340000}, {340000, 600000, 1000, 3400000, 6000000, 0x3C, 0x03, 0x06, 600, 0x24A, 0x00A, 0, 0, 0, 3400000, 6000000, 1, 1, 1, 2, 1, 0x00, 340000, 600000}, -{ 25000, 34000, 1205, 312500, 425000, 0x04, 0x01, 0x01, 400, 0x182, 0x00A, 0, 0, 0, 2500000, 3400000, 0, 2, 2, 2, 4, 0x03, 31250, 42500}, -{ 34000, 68000, 1205, 425000, 850000, 0x06, 0x02, 0x01, 300, 0x11E, 0x00A, 0, 0, 0, 1700000, 3400000, 0, 1, 1, 2, 4, 0x02, 42500, 85000}, -{ 68000, 136000, 1205, 850000, 1700000, 0x0D, 0x02, 0x02, 325, 0x137, 0x00A, 0, 0, 0, 1700000, 3400000, 0, 1, 1, 2, 2, 0x01, 85000, 170000}, -{136000, 272000, 1205, 1700000, 3400000, 0x1A, 0x02, 0x04, 325, 0x137, 0x00A, 0, 0, 0, 1700000, 3400000, 0, 1, 1, 2, 1, 0x00, 170000, 340000}, -{272000, 480000, 1205, 3400000, 6000000, 0x30, 0x03, 0x05, 600, 0x24A, 0x00A, 0, 0, 0, 3400000, 6000000, 1, 1, 1, 2, 1, 0x00, 340000, 600000}, +{ 25000, 34000, 1250, 312500, 425000, 0x04, 0x01, 0x01, 400, 0x182, 0x00A, 0, 0, 0, 2500000, 3400000, 0, 2, 2, 2, 4, 0x03, 31250, 42500}, +{ 34000, 68000, 1250, 425000, 850000, 0x06, 0x02, 0x01, 300, 0x11E, 0x00A, 0, 0, 0, 1700000, 3400000, 0, 1, 1, 2, 4, 0x02, 42500, 85000}, +{ 68000, 136000, 1250, 850000, 1700000, 0x0D, 0x02, 0x02, 325, 0x137, 0x00A, 0, 0, 0, 1700000, 3400000, 0, 1, 1, 2, 2, 0x01, 85000, 170000}, +{136000, 272000, 1250, 1700000, 3400000, 0x1A, 0x02, 0x04, 325, 0x137, 0x00A, 0, 0, 0, 1700000, 3400000, 0, 1, 1, 2, 1, 0x00, 170000, 340000}, +{272000, 480000, 1250, 3400000, 6000000, 0x30, 0x03, 0x05, 600, 0x24A, 0x00A, 0, 0, 0, 3400000, 6000000, 1, 1, 1, 2, 1, 0x00, 340000, 600000}, { 25000, 28000, 1500, 375000, 420000, 0x03, 0x01, 0x01, 360, 0x15A, 0x00A, 0, 0, 0, 3000000, 3360000, 0, 2, 2, 2, 4, 0x03, 37500, 42000}, { 28000, 56000, 1500, 420000, 840000, 0x06, 0x02, 0x01, 360, 0x15A, 0x00A, 0, 0, 0, 1680000, 3360000, 0, 1, 1, 2, 4, 0x02, 42000, 84000}, { 56000, 113000, 1500, 840000, 1695000, 0x0B, 0x00, 0x05, 330, 0x13C, 0x00A, 0, 0, 0, 1680000, 3390000, 0, 1, 1, 2, 2, 0x01, 84000, 169500}, -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0040-drm-imx-dcss-use-the-external-27MHz-phy-clock.patch ================================================ From c2af9b24bfa69ffb12e72153f89ed3bb3245fafb Mon Sep 17 00:00:00 2001 From: Laurentiu Palcu <laurentiu.palcu@nxp.com> Date: Fri, 22 Nov 2019 10:00:56 +0200 Subject: [PATCH 40/49] drm/imx/dcss: use the external 27MHz phy clock The 27MHz external oscillator offers a high precision low jitter clock and is suitable for high pixel clocks modes(ie 4K@60). Signed-off-by: Laurentiu Palcu <laurentiu.palcu@nxp.com> --- drivers/gpu/drm/imx/dcss/dcss-dev.c | 25 +++++++++++++++++++------ drivers/gpu/drm/imx/dcss/dcss-dtg.c | 11 +++++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/imx/dcss/dcss-dev.c b/drivers/gpu/drm/imx/dcss/dcss-dev.c index c849533ca83e..1977f6b058f8 100644 --- a/drivers/gpu/drm/imx/dcss/dcss-dev.c +++ b/drivers/gpu/drm/imx/dcss/dcss-dev.c @@ -17,6 +17,11 @@ static void dcss_clocks_enable(struct dcss_dev *dcss) { + if (dcss->hdmi_output) { + clk_prepare_enable(dcss->pll_phy_ref_clk); + clk_prepare_enable(dcss->pll_src_clk); + } + clk_prepare_enable(dcss->axi_clk); clk_prepare_enable(dcss->apb_clk); clk_prepare_enable(dcss->rtrm_clk); @@ -31,6 +36,11 @@ static void dcss_clocks_disable(struct dcss_dev *dcss) clk_disable_unprepare(dcss->rtrm_clk); clk_disable_unprepare(dcss->apb_clk); clk_disable_unprepare(dcss->axi_clk); + + if (dcss->hdmi_output) { + clk_disable_unprepare(dcss->pll_src_clk); + clk_disable_unprepare(dcss->pll_phy_ref_clk); + } } static void dcss_disable_dtg_and_ss_cb(void *data) @@ -133,17 +143,20 @@ static int dcss_clks_init(struct dcss_dev *dcss) struct { const char *id; struct clk **clk; + bool required; } clks[] = { - {"apb", &dcss->apb_clk}, - {"axi", &dcss->axi_clk}, - {"pix", &dcss->pix_clk}, - {"rtrm", &dcss->rtrm_clk}, - {"dtrc", &dcss->dtrc_clk}, + {"apb", &dcss->apb_clk, true}, + {"axi", &dcss->axi_clk, true}, + {"pix", &dcss->pix_clk, true}, + {"rtrm", &dcss->rtrm_clk, true}, + {"dtrc", &dcss->dtrc_clk, true}, + {"pll_src", &dcss->pll_src_clk, dcss->hdmi_output}, + {"pll_phy_ref", &dcss->pll_phy_ref_clk, dcss->hdmi_output}, }; for (i = 0; i < ARRAY_SIZE(clks); i++) { *clks[i].clk = devm_clk_get(dcss->dev, clks[i].id); - if (IS_ERR(*clks[i].clk)) { + if (IS_ERR(*clks[i].clk) && clks[i].required) { dev_err(dcss->dev, "failed to get %s clock\n", clks[i].id); return PTR_ERR(*clks[i].clk); diff --git a/drivers/gpu/drm/imx/dcss/dcss-dtg.c b/drivers/gpu/drm/imx/dcss/dcss-dtg.c index 30de00540f63..b70785d69ad9 100644 --- a/drivers/gpu/drm/imx/dcss/dcss-dtg.c +++ b/drivers/gpu/drm/imx/dcss/dcss-dtg.c @@ -83,6 +83,7 @@ struct dcss_dtg { u32 ctx_id; bool in_use; + bool hdmi_output; u32 dis_ulc_x; u32 dis_ulc_y; @@ -159,6 +160,7 @@ int dcss_dtg_init(struct dcss_dev *dcss, unsigned long dtg_base) dcss->dtg = dtg; dtg->dev = dcss->dev; dtg->ctxld = dcss->ctxld; + dtg->hdmi_output = dcss->hdmi_output; dtg->base_reg = ioremap(dtg_base, SZ_4K); if (!dtg->base_reg) { @@ -221,6 +223,15 @@ void dcss_dtg_sync_set(struct dcss_dtg *dtg, struct videomode *vm) vm->vactive - 1; clk_disable_unprepare(dcss->pix_clk); + if (dcss->hdmi_output) { + int err; + + clk_disable_unprepare(dcss->pll_src_clk); + err = clk_set_parent(dcss->pll_src_clk, dcss->pll_phy_ref_clk); + if (err < 0) + dev_warn(dcss->dev, "clk_set_parent() returned %d", err); + clk_prepare_enable(dcss->pll_src_clk); + } clk_set_rate(dcss->pix_clk, vm->pixelclock); clk_prepare_enable(dcss->pix_clk); -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0041-drm-imx-dcss-add-component-framework-functionality.patch ================================================ From ec59d2988d1ac50acea0fdaa63513f216ddf016d Mon Sep 17 00:00:00 2001 From: Laurentiu Palcu <laurentiu.palcu@nxp.com> Date: Thu, 9 Jul 2020 19:47:31 +0300 Subject: [PATCH 41/49] drm/imx/dcss: add component framework functionality Component framework is needed by HDP driver. Signed-off-by: Laurentiu Palcu <laurentiu.palcu@nxp.com> --- drivers/gpu/drm/imx/dcss/dcss-drv.c | 89 ++++++++++++++++++++++------- drivers/gpu/drm/imx/dcss/dcss-kms.c | 23 +++++--- drivers/gpu/drm/imx/dcss/dcss-kms.h | 4 +- 3 files changed, 85 insertions(+), 31 deletions(-) diff --git a/drivers/gpu/drm/imx/dcss/dcss-drv.c b/drivers/gpu/drm/imx/dcss/dcss-drv.c index 8dc2f85c514b..09d0ac28e28a 100644 --- a/drivers/gpu/drm/imx/dcss/dcss-drv.c +++ b/drivers/gpu/drm/imx/dcss/dcss-drv.c @@ -6,6 +6,7 @@ #include <linux/kernel.h> #include <linux/platform_device.h> #include <drm/drm_module.h> +#include <linux/component.h> #include <drm/drm_of.h> #include "dcss-dev.h" @@ -14,6 +15,8 @@ struct dcss_drv { struct dcss_dev *dcss; struct dcss_kms_dev *kms; + + bool is_componentized; }; struct dcss_dev *dcss_drv_dev_to_dcss(struct device *dev) @@ -30,30 +33,18 @@ struct drm_device *dcss_drv_dev_to_drm(struct device *dev) return mdrv ? &mdrv->kms->base : NULL; } -static int dcss_drv_platform_probe(struct platform_device *pdev) +static int dcss_drv_init(struct device *dev, bool componentized) { - struct device *dev = &pdev->dev; - struct device_node *remote; struct dcss_drv *mdrv; int err = 0; - bool hdmi_output = true; - - if (!dev->of_node) - return -ENODEV; - - remote = of_graph_get_remote_node(dev->of_node, 0, 0); - if (!remote) - return -ENODEV; - - hdmi_output = !of_device_is_compatible(remote, "fsl,imx8mq-nwl-dsi"); - - of_node_put(remote); mdrv = kzalloc(sizeof(*mdrv), GFP_KERNEL); if (!mdrv) return -ENOMEM; - mdrv->dcss = dcss_dev_create(dev, hdmi_output); + mdrv->is_componentized = componentized; + + mdrv->dcss = dcss_dev_create(dev, componentized); if (IS_ERR(mdrv->dcss)) { err = PTR_ERR(mdrv->dcss); goto err; @@ -61,7 +52,7 @@ static int dcss_drv_platform_probe(struct platform_device *pdev) dev_set_drvdata(dev, mdrv); - mdrv->kms = dcss_kms_attach(mdrv->dcss); + mdrv->kms = dcss_kms_attach(mdrv->dcss, componentized); if (IS_ERR(mdrv->kms)) { err = PTR_ERR(mdrv->kms); goto dcss_shutoff; @@ -79,19 +70,73 @@ static int dcss_drv_platform_probe(struct platform_device *pdev) return err; } -static int dcss_drv_platform_remove(struct platform_device *pdev) +static void dcss_drv_deinit(struct device *dev, bool componentized) { - struct dcss_drv *mdrv = dev_get_drvdata(&pdev->dev); + struct dcss_drv *mdrv = dev_get_drvdata(dev); if (!mdrv) - return 0; + return; - dcss_kms_detach(mdrv->kms); + dcss_kms_detach(mdrv->kms, componentized); dcss_dev_destroy(mdrv->dcss); - dev_set_drvdata(&pdev->dev, NULL); + dev_set_drvdata(dev, NULL); kfree(mdrv); +} + +static int dcss_drv_bind(struct device *dev) +{ + return dcss_drv_init(dev, true); +} + +static void dcss_drv_unbind(struct device *dev) +{ + return dcss_drv_deinit(dev, true); +} + +static const struct component_master_ops dcss_master_ops = { + .bind = dcss_drv_bind, + .unbind = dcss_drv_unbind, +}; + +static int compare_of(struct device *dev, void *data) +{ + return dev->of_node == data; +} + +static int dcss_drv_platform_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct component_match *match = NULL; + struct device_node *remote; + + if (!dev->of_node) + return -ENODEV; + + remote = of_graph_get_remote_node(dev->of_node, 0, 0); + if (!remote) + return -ENODEV; + + if (of_device_is_compatible(remote, "fsl,imx8mq-nwl-dsi")) { + of_node_put(remote); + return dcss_drv_init(dev, false); + } + + drm_of_component_match_add(dev, &match, compare_of, remote); + of_node_put(remote); + + return component_master_add_with_match(dev, &dcss_master_ops, match); +} + +static int dcss_drv_platform_remove(struct platform_device *pdev) +{ + struct dcss_drv *mdrv = dev_get_drvdata(&pdev->dev); + + if (mdrv->is_componentized) + component_master_del(&pdev->dev, &dcss_master_ops); + else + dcss_drv_deinit(&pdev->dev, false); return 0; } diff --git a/drivers/gpu/drm/imx/dcss/dcss-kms.c b/drivers/gpu/drm/imx/dcss/dcss-kms.c index 135a62366ab8..cafb09df6c75 100644 --- a/drivers/gpu/drm/imx/dcss/dcss-kms.c +++ b/drivers/gpu/drm/imx/dcss/dcss-kms.c @@ -13,6 +13,7 @@ #include <drm/drm_of.h> #include <drm/drm_probe_helper.h> #include <drm/drm_vblank.h> +#include <linux/component.h> #include "dcss-dev.h" #include "dcss-kms.h" @@ -123,7 +124,7 @@ static int dcss_kms_bridge_connector_init(struct dcss_kms_dev *kms) return 0; } -struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss) +struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss, bool componentized) { struct dcss_kms_dev *kms; struct drm_device *drm; @@ -148,13 +149,16 @@ struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss) goto cleanup_mode_config; - ret = dcss_kms_bridge_connector_init(kms); + ret = dcss_crtc_init(crtc, drm); if (ret) goto cleanup_mode_config; - ret = dcss_crtc_init(crtc, drm); + if (componentized) + ret = component_bind_all(dcss->dev, kms); + else + ret = dcss_kms_bridge_connector_init(kms); if (ret) - goto cleanup_mode_config; + goto cleanup_crtc; drm_mode_config_reset(drm); @@ -171,7 +176,8 @@ struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss) return kms; cleanup_crtc: - drm_bridge_connector_disable_hpd(kms->connector); + if (!componentized) + drm_bridge_connector_disable_hpd(kms->connector); drm_kms_helper_poll_fini(drm); dcss_crtc_deinit(crtc, drm); @@ -182,9 +188,10 @@ struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss) return ERR_PTR(ret); } -void dcss_kms_detach(struct dcss_kms_dev *kms) +void dcss_kms_detach(struct dcss_kms_dev *kms, bool componentized) { struct drm_device *drm = &kms->base; + struct dcss_dev *dcss = drm->dev_private; drm_dev_unregister(drm); drm_bridge_connector_disable_hpd(kms->connector); @@ -194,5 +201,7 @@ void dcss_kms_detach(struct dcss_kms_dev *kms) drm->irq_enabled = false; drm_mode_config_cleanup(drm); dcss_crtc_deinit(&kms->crtc, drm); + if (componentized) + component_unbind_all(dcss->dev, drm); drm->dev_private = NULL; } diff --git a/drivers/gpu/drm/imx/dcss/dcss-kms.h b/drivers/gpu/drm/imx/dcss/dcss-kms.h index dfe5dd99eea3..e98d9c587a43 100644 --- a/drivers/gpu/drm/imx/dcss/dcss-kms.h +++ b/drivers/gpu/drm/imx/dcss/dcss-kms.h @@ -32,8 +32,8 @@ struct dcss_kms_dev { struct drm_connector *connector; }; -struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss); -void dcss_kms_detach(struct dcss_kms_dev *kms); +struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss, bool componentized); +void dcss_kms_detach(struct dcss_kms_dev *kms, bool componentized); int dcss_crtc_init(struct dcss_crtc *crtc, struct drm_device *drm); void dcss_crtc_deinit(struct dcss_crtc *crtc, struct drm_device *drm); struct dcss_plane *dcss_plane_init(struct drm_device *drm, -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0043-arm64-dts-imx8mq-add-DCSS-node.patch ================================================ From bd9c83ea41380f584fdd8f2781112b530c84ebba Mon Sep 17 00:00:00 2001 From: Laurentiu Palcu <laurentiu.palcu@nxp.com> Date: Thu, 9 Jul 2020 19:47:33 +0300 Subject: [PATCH 43/49] arm64: dts: imx8mq: add DCSS node This patch adds the node for iMX8MQ Display Controller Subsystem. Signed-off-by: Laurentiu Palcu <laurentiu.palcu@nxp.com> --- arch/arm64/boot/dts/freescale/imx8mq.dtsi | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/arch/arm64/boot/dts/freescale/imx8mq.dtsi b/arch/arm64/boot/dts/freescale/imx8mq.dtsi index 5e0e7d0f1bc4..5a617f9ed8b5 100644 --- a/arch/arm64/boot/dts/freescale/imx8mq.dtsi +++ b/arch/arm64/boot/dts/freescale/imx8mq.dtsi @@ -1103,6 +1103,29 @@ bus@32c00000 { /* AIPS4 */ #size-cells = <1>; ranges = <0x32c00000 0x32c00000 0x400000>; + dcss: display-controller@32e00000 { + compatible = "nxp,imx8mq-dcss"; + reg = <0x32e00000 0x2d000>, <0x32e2f000 0x1000>; + interrupts = <6>, <8>, <9>; + interrupt-names = "ctxld", "ctxld_kick", "vblank"; + interrupt-parent = <&irqsteer>; + clocks = <&clk IMX8MQ_CLK_DISP_APB_ROOT>, + <&clk IMX8MQ_CLK_DISP_AXI_ROOT>, + <&clk IMX8MQ_CLK_DISP_RTRM_ROOT>, + <&clk IMX8MQ_VIDEO2_PLL_OUT>, + <&clk IMX8MQ_CLK_DISP_DTRC>; + clock-names = "apb", "axi", "rtrm", "pix", "dtrc"; + assigned-clocks = <&clk IMX8MQ_CLK_DISP_AXI>, + <&clk IMX8MQ_CLK_DISP_RTRM>, + <&clk IMX8MQ_VIDEO2_PLL1_REF_SEL>; + assigned-clock-parents = <&clk IMX8MQ_SYS1_PLL_800M>, + <&clk IMX8MQ_SYS1_PLL_800M>, + <&clk IMX8MQ_CLK_27M>; + assigned-clock-rates = <800000000>, + <400000000>; + status = "disabled"; + }; + irqsteer: interrupt-controller@32e2d000 { compatible = "fsl,imx8m-irqsteer", "fsl,imx-irqsteer"; reg = <0x32e2d000 0x1000>; -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0044-arm64-dts-imx8mq-add-DCSS-external-oscillator-suppor.patch ================================================ From 8e5a885158f430de3ea36b1439dd8c0058ce95df Mon Sep 17 00:00:00 2001 From: Laurentiu Palcu <laurentiu.palcu@nxp.com> Date: Fri, 22 Nov 2019 10:12:50 +0200 Subject: [PATCH 44/49] arm64: dts: imx8mq: add DCSS external oscillator support The external oscillator, which is high precision, will be used when DCSS output goes to HDMI. Signed-off-by: Laurentiu Palcu <laurentiu.palcu@nxp.com> --- arch/arm64/boot/dts/freescale/imx8mq.dtsi | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/freescale/imx8mq.dtsi b/arch/arm64/boot/dts/freescale/imx8mq.dtsi index 5a617f9ed8b5..b75252a65c44 100644 --- a/arch/arm64/boot/dts/freescale/imx8mq.dtsi +++ b/arch/arm64/boot/dts/freescale/imx8mq.dtsi @@ -1113,8 +1113,11 @@ dcss: display-controller@32e00000 { <&clk IMX8MQ_CLK_DISP_AXI_ROOT>, <&clk IMX8MQ_CLK_DISP_RTRM_ROOT>, <&clk IMX8MQ_VIDEO2_PLL_OUT>, - <&clk IMX8MQ_CLK_DISP_DTRC>; - clock-names = "apb", "axi", "rtrm", "pix", "dtrc"; + <&clk IMX8MQ_CLK_DISP_DTRC>, + <&clk IMX8MQ_VIDEO2_PLL1_REF_SEL>, + <&clk IMX8MQ_CLK_PHY_27MHZ>; + clock-names = "apb", "axi", "rtrm", "pix", "dtrc", "pll_src", + "pll_phy_ref"; assigned-clocks = <&clk IMX8MQ_CLK_DISP_AXI>, <&clk IMX8MQ_CLK_DISP_RTRM>, <&clk IMX8MQ_VIDEO2_PLL1_REF_SEL>; -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0045-arm64-dts-fsl-imx8mq-add-HDP-bridge-node.patch ================================================ From 0327e9fc14269069711cd2d45d60130b318532fe Mon Sep 17 00:00:00 2001 From: Lucas Stach <l.stach@pengutronix.de> Date: Tue, 13 Feb 2018 12:30:58 +0100 Subject: [PATCH 45/49] arm64: dts: fsl: imx8mq: add HDP bridge node Signed-off-by: Lucas Stach <l.stach@pengutronix.de> --- arch/arm64/boot/dts/freescale/imx8mq.dtsi | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/arch/arm64/boot/dts/freescale/imx8mq.dtsi b/arch/arm64/boot/dts/freescale/imx8mq.dtsi index b75252a65c44..aad21d6f1da7 100644 --- a/arch/arm64/boot/dts/freescale/imx8mq.dtsi +++ b/arch/arm64/boot/dts/freescale/imx8mq.dtsi @@ -1103,6 +1103,16 @@ bus@32c00000 { /* AIPS4 */ #size-cells = <1>; ranges = <0x32c00000 0x32c00000 0x400000>; + hdmi: hdmi@32c00000 { + reg = <0x32c00000 0x33800>, /* HDP registers */ + <0x32e40000 0x40000>, /* HDP SEC register */ + <0x32e2f000 0x10>; /* RESET register */ + interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "plug_in", "plug_out"; + status = "disabled"; + }; + dcss: display-controller@32e00000 { compatible = "nxp,imx8mq-dcss"; reg = <0x32e00000 0x2d000>, <0x32e2f000 0x1000>; -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0046-arm64-dts-fsl-imx8mq-evk-enable-DCSS-and-HDMI.patch ================================================ From 96ab278661207096c013ad1b39ed36f5f9a35ffd Mon Sep 17 00:00:00 2001 From: Lucas Stach <l.stach@pengutronix.de> Date: Tue, 13 Feb 2018 12:47:09 +0100 Subject: [PATCH 46/49] arm64: dts: fsl: imx8mq-evk: enable DCSS and HDMI Signed-off-by: Lucas Stach <l.stach@pengutronix.de> --- arch/arm64/boot/dts/freescale/imx8mq-evk.dts | 22 ++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/arch/arm64/boot/dts/freescale/imx8mq-evk.dts b/arch/arm64/boot/dts/freescale/imx8mq-evk.dts index 2418cca00bc5..71eeda6de3d7 100644 --- a/arch/arm64/boot/dts/freescale/imx8mq-evk.dts +++ b/arch/arm64/boot/dts/freescale/imx8mq-evk.dts @@ -132,6 +132,16 @@ opp-800M { }; }; +&dcss { + status = "okay"; + + port { + dcss_out: endpoint { + remote-endpoint = <&hdmi_in>; + }; + }; +}; + &dphy { status = "okay"; }; @@ -168,6 +178,18 @@ wl-reg-on-hog { }; }; +&hdmi { + compatible = "cdn,imx8mq-hdmi"; + lane-mapping = <0xe4>; + status = "okay"; + + port { + hdmi_in: endpoint { + remote-endpoint = <&dcss_out>; + }; + }; +}; + &i2c1 { clock-frequency = <100000>; pinctrl-names = "default"; -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0047-arm64-dts-fsl-imx8mq-pico-pi-enable-DCSS-and-HDMI.patch ================================================ From 5a139d07d03076be7972db4b022558dffcfd685b Mon Sep 17 00:00:00 2001 From: Lukas Rusak <lorusak@gmail.com> Date: Tue, 9 Mar 2021 10:47:27 -0800 Subject: [PATCH 47/49] arm64: dts: fsl: imx8mq-pico-pi: enable DCSS and HDMI --- .../boot/dts/freescale/imx8mq-pico-pi.dts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/arch/arm64/boot/dts/freescale/imx8mq-pico-pi.dts b/arch/arm64/boot/dts/freescale/imx8mq-pico-pi.dts index 89cbec5c41b2..03734145c50e 100644 --- a/arch/arm64/boot/dts/freescale/imx8mq-pico-pi.dts +++ b/arch/arm64/boot/dts/freescale/imx8mq-pico-pi.dts @@ -37,6 +37,16 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus { }; }; +&dcss { + status = "okay"; + + port { + dcss_out: endpoint { + remote-endpoint = <&hdmi_in>; + }; + }; +}; + &fec1 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_fec1 &pinctrl_enet_3v3>; @@ -56,6 +66,18 @@ ethphy0: ethernet-phy@1 { }; }; +&hdmi { + compatible = "cdn,imx8mq-hdmi"; + lane-mapping = <0xe4>; + status = "okay"; + + port { + hdmi_in: endpoint { + remote-endpoint = <&dcss_out>; + }; + }; +}; + &i2c1 { clock-frequency = <100000>; pinctrl-names = "default"; -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0048-drm-imx-mhdp-don-t-depend-on-DRM_IMX.patch ================================================ From f94717816b9a39869219ede859fe74af3f2ecd19 Mon Sep 17 00:00:00 2001 From: Lukas Rusak <lorusak@gmail.com> Date: Wed, 24 Mar 2021 14:27:43 -0700 Subject: [PATCH 48/49] drm: imx: mhdp: don't depend on DRM_IMX --- drivers/gpu/drm/imx/mhdp/Kconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/gpu/drm/imx/mhdp/Kconfig b/drivers/gpu/drm/imx/mhdp/Kconfig index 86950badb947..cf7dfacdd434 100644 --- a/drivers/gpu/drm/imx/mhdp/Kconfig +++ b/drivers/gpu/drm/imx/mhdp/Kconfig @@ -6,6 +6,5 @@ config DRM_IMX_CDNS_MHDP select DRM_CDNS_DP select DRM_CDNS_HDMI select DRM_CDNS_AUDIO - depends on DRM_IMX help Choose this if you want to use HDMI on i.MX8. -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0049-drm-cadence-shutup-cec-logging.patch ================================================ From 3111faf58971c2c517457e62f84d138a3d62464e Mon Sep 17 00:00:00 2001 From: Lukas Rusak <lorusak@gmail.com> Date: Wed, 24 Mar 2021 15:14:57 -0700 Subject: [PATCH 49/49] drm: cadence: shutup cec logging --- drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c index 25cf9e91e64f..e91de13eae58 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c @@ -171,8 +171,8 @@ static u32 mhdp_cec_write_message(struct cdns_mhdp_cec *cec, struct cec_msg *msg return -EINVAL; } - for (i = 0; i < msg->len; ++i) - printk("msg[%d]=0x%x\n",i, msg->msg[i]); + // for (i = 0; i < msg->len; ++i) + // printk("msg[%d]=0x%x\n",i, msg->msg[i]); /* Write Message to register */ for (i = 0; i < msg->len; ++i) { -- 2.29.2 ================================================ FILE: projects/NXP/devices/iMX8/patches/linux/0050-drm-display-drm-hdmi-helper-h.patch ================================================ --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c 2022-06-28 15:48:27.254022595 +0000 +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c 2022-06-28 15:46:14.919939083 +0000 @@ -14,6 +14,8 @@ #include <drm/drm_edid.h> #include <drm/drm_encoder_slave.h> #include <drm/display/drm_hdcp.h> +#include <drm/display/drm_hdcp_helper.h> +#include <drm/display/drm_hdmi_helper.h> #include <drm/drm_of.h> #include <drm/drm_probe_helper.h> #include <drm/drm_print.h> --- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c 2022-06-28 15:53:59.618466556 +0000 +++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-hdcp.c 2022-06-28 15:56:01.987635836 +0000 @@ -11,6 +11,7 @@ */ #include <drm/bridge/cdns-mhdp.h> #include <drm/display/drm_hdcp.h> +#include <drm/display/drm_hdcp_helper.h> #include <drm/drm_print.h> #include <linux/firmware.h> ================================================ FILE: projects/NXP/devices/iMX8/patches/u-boot/0005-pico-imx8mq-add-distro-boot-cmd-support.patch ================================================ From ee72c64b4ad8ef5aaefb8ab7e2f5288a9655dd3a Mon Sep 17 00:00:00 2001 From: Lukas Rusak <lorusak@gmail.com> Date: Tue, 9 Mar 2021 10:13:23 -0800 Subject: [PATCH 5/5] pico-imx8mq add distro boot cmd support --- configs/pico-imx8mq_defconfig | 1 + include/configs/pico-imx8mq.h | 64 +++++++++-------------------------- 2 files changed, 17 insertions(+), 48 deletions(-) diff --git a/configs/pico-imx8mq_defconfig b/configs/pico-imx8mq_defconfig index e2e3a15da1..d70d7fc1cc 100644 --- a/configs/pico-imx8mq_defconfig +++ b/configs/pico-imx8mq_defconfig @@ -83,3 +83,4 @@ CONFIG_DM_REGULATOR_GPIO=y CONFIG_DM_RESET=y CONFIG_MXC_UART=y CONFIG_DM_THERMAL=y +CONFIG_DISTRO_DEFAULTS=y diff --git a/include/configs/pico-imx8mq.h b/include/configs/pico-imx8mq.h index 7a5891652f..e301bc736d 100644 --- a/include/configs/pico-imx8mq.h +++ b/include/configs/pico-imx8mq.h @@ -41,42 +41,22 @@ #define IMX_FEC_BASE 0x30BE0000 #endif -/* Initial environment variables */ -#define CONFIG_EXTRA_ENV_SETTINGS \ - "script=boot.scr\0" \ - "image=Image\0" \ - "console=ttymxc0,115200\0" \ - "fdt_addr=0x43000000\0" \ - "fdt_high=0xffffffffffffffff\0" \ - "fdt_file=imx8mq-pico-pi.dtb\0" \ - "initrd_addr=0x43800000\0" \ - "initrd_high=0xffffffffffffffff\0" \ - "mmcdev=" __stringify(CONFIG_SYS_MMC_ENV_DEV) "\0" \ - "mmcpart=1\0" \ - "mmcroot=/dev/mmcblk1p2 rootwait rw\0" \ - "mmcautodetect=yes\0" \ - "mmcargs=setenv bootargs console=${console} root=${mmcroot}\0 " \ - "loadbootscript=" \ - "fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \ - "bootscript=echo Running bootscript from mmc ...; source\0" \ - "loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \ - "loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \ - "mmcboot=echo Booting from mmc ...; " \ - "run mmcargs; " \ - "echo wait for boot; " \ - "fi;\0" \ - "netargs=setenv bootargs console=${console} " \ - "root=/dev/nfs " \ - "ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \ - "netboot=echo Booting from net ...; " \ - "run netargs; " \ - "if test ${ip_dyn} = yes; then " \ - "setenv get_cmd dhcp; " \ - "else " \ - "setenv get_cmd tftp; " \ - "fi; " \ - "${get_cmd} ${loadaddr} ${image}; " \ - "booti; " +#define BOOT_TARGET_DEVICES(func) \ + func(MMC, mmc, 1) \ + func(MMC, mmc, 0) \ + func(PXE, pxe, na) \ + func(DHCP, dhcp, na) + +#include <config_distro_bootcmd.h> + +#define CONFIG_EXTRA_ENV_SETTINGS \ + "console=ttymxc0,115200\0" \ + "loadaddr=0x40480000\0" \ + "kernel_addr_r=0x40480000\0" \ + "fdt_addr_r=0x43000000\0" \ + "scriptaddr=0x50480000\0" \ + "pxefile_addr_r=0x50580000\0" \ + BOOTENV /* Link Definitions */ -- 2.29.2 ================================================ FILE: projects/NXP/options ================================================ ################################################################################ # setup system defaults ################################################################################ # Bootloader to use (syslinux / u-boot / bcm2835-bootloader) BOOTLOADER="u-boot" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="dtbs" # Kernel to use. values can be: # default: default mainline kernel LINUX="default" ################################################################################ # setup build defaults ################################################################################ # Project CFLAGS PROJECT_CFLAGS="" # SquashFS compression method (gzip / lzo / xz) SQUASHFS_COMPRESSION="zstd" ################################################################################ # setup project defaults ################################################################################ # OpenGL(X) implementation to use (no / mesa) OPENGL="no" # OpenGL-ES implementation to use (no / bcm2835-driver / gpu-viv-bin-mx6q / opengl-meson6) OPENGLES="mesa" # Vulkan implementation to use (vulkan-loader / no) VULKAN="no" # include uvesafb support (yes / no) UVESAFB_SUPPORT="no" # Displayserver to use (wl / no) DISPLAYSERVER="no" # Windowmanager to use (weston / no) WINDOWMANAGER="no" # Xorg Graphic drivers to use (all / etnaviv) # Space separated list is supported, # e.g. GRAPHIC_DRIVERS="etnaviv" GRAPHIC_DRIVERS="etnaviv" # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap) KODIPLAYER_DRIVER="mesa" # build and install driver addons (yes / no) DRIVER_ADDONS_SUPPORT="no" # driver addons to install: # for a list of additional drivers see packages/linux-driver-addons # Space separated list is supported, DRIVER_ADDONS="crazycat dvb-latest" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" FIRMWARE="misc-firmware wlan-firmware dvb-firmware brcmfmac_sdio-firmware" # build with installer (yes / no) INSTALLER_SUPPORT="no" # use the kernel CEC framework for libcec (yes / no) CEC_FRAMEWORK_SUPPORT="yes" ================================================ FILE: projects/Qualcomm/devices/Dragonboard/README.md ================================================ ## Install Instructions The Dragonboard is unique in the way that it uses and android bootloader to load the OS. This makes it difficult for a few reasons: 1) Requires a very specific partition layout 2) Typically requires a secondary bootloader (usually little kernel (LK). we use u-boot). All this makes it difficult to create a disk image that can easily be flashed and booted natively. After some time trying various different configurations this is what I landed on: #### Flash the .img file to and SD card (dd, rufus, LE disk image tool, etc) ``` gunzip LibreELEC-Dragonboard.arm-9.80-devel-20190706164625-ce7dc9b-410c.img.gz dd if=LibreELEC-Dragonboard.arm-9.80-devel-20190706164625-ce7dc9b-410c.img of=/dev/sdx bs=4M ``` #### Mount the first partition ``` mount /dev/sdx1 /mnt (or similar) ``` #### Mount the squashfs SYSTEM file ``` mount -o loop /mnt/SYSTEM /mnt2 (or similar) ``` #### Write the u-boot bootloader using fastboot to write u-boot to the boot partition on the emmc you will need to use fastboot. (NOTE: this will wipe out whatever you have in the boot partition on the emmc and will make it so that OS does not boot anymore). To enter fastboot mode read the following instructions: 1) While holding the Vol (-) button, power on the DragonBoard™ 410c by plugging it in 2) Once DragonBoard™ 410c is plugged into power, release your hold on the Vol (-) button. 3) Wait for about 20 seconds. 4) Board should boot into fastboot mode. ``` fastboot flash boot /mnt2/usr/share/bootloader/u-boot.img ``` #### Unmount partitions ``` umount /mnt2 umount /mnt ``` #### Plug SD card into Dragonboard and power on ================================================ FILE: projects/Qualcomm/devices/Dragonboard/bootloader/install ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) dtbTool -o dt.img arch/arm/dts/ touch rd mkbootimg --kernel=u-boot-dtb.bin \ --ramdisk=rd \ --dt=dt.img \ --pagesize 2048 \ --base 0x80000000 \ --cmdline="" \ --output=u-boot.img rm rd cp -av u-boot.img $INSTALL/usr/share/bootloader ================================================ FILE: projects/Qualcomm/devices/Dragonboard/bootloader/release ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) SRCDIR="$BUILD/image/system/usr/share/bootloader" DSTDIR="$RELEASE_DIR/3rdparty/bootloader" mkdir -p "$DSTDIR" if [ -n "$UBOOT_SYSTEM" ]; then cp -a "$SRCDIR/u-boot.img" "$DSTDIR" fi cp -a "$SRCDIR"/*.dtb "$DSTDIR" ================================================ FILE: projects/Qualcomm/devices/Dragonboard/bootloader/update.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) [ -z "$BOOT_ROOT" ] && BOOT_ROOT="/flash" [ -z "$BOOT_PART" ] && BOOT_PART=$(df "$BOOT_ROOT" | tail -1 | awk {' print $1 '}) if [ -z "$BOOT_DISK" ]; then case $BOOT_PART in /dev/sd[a-z][0-9]*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,[0-9]*,,g") ;; /dev/mmcblk*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,p[0-9]*,,g") ;; esac fi # mount $BOOT_ROOT r/w mount -o remount,rw $BOOT_ROOT # update Device Tree Blobs for all_dtb in /flash/*.dtb; do dtb=$(basename $all_dtb) if [ -f $SYSTEM_ROOT/usr/share/bootloader/$dtb ]; then echo "*** updating Device Tree Blob: $dtb ..." cp -p $SYSTEM_ROOT/usr/share/bootloader/$dtb $BOOT_ROOT fi done # mount $BOOT_ROOT r/o sync mount -o remount,ro $BOOT_ROOT ================================================ FILE: projects/Qualcomm/devices/Dragonboard/linux/linux.aarch64.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm64 6.1.0-rc6 Kernel Configuration # CONFIG_CC_VERSION_TEXT="aarch64-none-elf-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION_AUTO=y CONFIG_BUILD_SALT="" CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_SYSVIPC_COMPAT=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set CONFIG_AUDIT=y CONFIG_HAVE_ARCH_AUDITSYSCALL=y CONFIG_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_IRQ_FASTEOI_HIERARCHY_HANDLERS=y CONFIG_GENERIC_IRQ_IPI=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_IRQ_MSI_IOMMU=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_CONTEXT_TRACKING=y CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y # CONFIG_BPF_JIT_ALWAYS_ON is not set CONFIG_BPF_JIT_DEFAULT_ON=y # CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_BPF_PRELOAD is not set # end of BPF subsystem CONFIG_PREEMPT_BUILD=y # CONFIG_PREEMPT_NONE is not set # CONFIG_PREEMPT_VOLUNTARY is not set CONFIG_PREEMPT=y CONFIG_PREEMPT_COUNT=y CONFIG_PREEMPTION=y # CONFIG_PREEMPT_DYNAMIC is not set # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set CONFIG_SCHED_THERMAL_PRESSURE=y CONFIG_BSD_PROCESS_ACCT=y CONFIG_BSD_PROCESS_ACCT_V3=y CONFIG_TASKSTATS=y CONFIG_TASK_DELAY_ACCT=y CONFIG_TASK_XACCT=y CONFIG_TASK_IO_ACCOUNTING=y # CONFIG_PSI is not set # end of CPU/Task time and stats accounting CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y CONFIG_PREEMPT_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_RCU=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=14 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 # CONFIG_PRINTK_INDEX is not set CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # # end of Scheduler features CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_CC_HAS_INT128=y CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set CONFIG_CGROUP_PIDS=y # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y # CONFIG_CGROUP_MISC is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_TIME_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_CHECKPOINT_RESTORE is not set CONFIG_SCHED_AUTOGROUP=y # CONFIG_SYSFS_DEPRECATED is not set # CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 CONFIG_RD_GZIP=y # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set # CONFIG_RD_LZ4 is not set CONFIG_RD_ZSTD=y CONFIG_INITRAMFS_COMPRESSION_GZIP=y # CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y # CONFIG_EXPERT is not set CONFIG_UID16=y CONFIG_MULTIUSER=y CONFIG_SYSFS_SYSCALL=y CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y 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 CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_EMBEDDED is not set CONFIG_HAVE_PERF_EVENTS=y # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_SYSTEM_DATA_VERIFICATION=y CONFIG_PROFILING=y # end of General setup CONFIG_ARM64=y CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_64BIT=y CONFIG_MMU=y CONFIG_ARM64_PAGE_SHIFT=12 CONFIG_ARM64_CONT_PTE_SHIFT=4 CONFIG_ARM64_CONT_PMD_SHIFT=4 CONFIG_ARCH_MMAP_RND_BITS_MIN=18 CONFIG_ARCH_MMAP_RND_BITS_MAX=33 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_STACKTRACE_SUPPORT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_LOCKDEP_SUPPORT=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CSUM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y CONFIG_SMP=y CONFIG_KERNEL_MODE_NEON=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_PGTABLE_LEVELS=4 CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_ARCH_PROC_KCORE_TEXT=y # # Platform selection # # CONFIG_ARCH_ACTIONS is not set # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_APPLE is not set # CONFIG_ARCH_BCM is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_BITMAIN is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_SPARX5 is not set # CONFIG_ARCH_K3 is not set # CONFIG_ARCH_LG1K is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_KEEMBAY is not set # CONFIG_ARCH_MEDIATEK is not set # CONFIG_ARCH_MESON is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_NXP is not set # CONFIG_ARCH_NPCM is not set CONFIG_ARCH_QCOM=y # CONFIG_ARCH_REALTEK is not set # CONFIG_ARCH_RENESAS is not set # CONFIG_ARCH_ROCKCHIP is not set # CONFIG_ARCH_SEATTLE is not set # CONFIG_ARCH_INTEL_SOCFPGA is not set # CONFIG_ARCH_SYNQUACER is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_SPRD is not set # CONFIG_ARCH_THUNDER is not set # CONFIG_ARCH_THUNDER2 is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_VISCONTI is not set # CONFIG_ARCH_XGENE is not set # CONFIG_ARCH_ZYNQMP is not set # end of Platform selection # # Kernel Features # # # ARM errata workarounds via the alternatives framework # CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y CONFIG_ARM64_ERRATUM_826319=y CONFIG_ARM64_ERRATUM_827319=y CONFIG_ARM64_ERRATUM_824069=y CONFIG_ARM64_ERRATUM_819472=y # CONFIG_ARM64_ERRATUM_832075 is not set # CONFIG_ARM64_ERRATUM_1742098 is not set CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y # CONFIG_ARM64_ERRATUM_1024718 is not set # CONFIG_ARM64_ERRATUM_1418040 is not set # CONFIG_ARM64_ERRATUM_1165522 is not set # CONFIG_ARM64_ERRATUM_1319367 is not set # CONFIG_ARM64_ERRATUM_1530923 is not set # CONFIG_ARM64_ERRATUM_2441007 is not set # CONFIG_ARM64_ERRATUM_1286807 is not set # CONFIG_ARM64_ERRATUM_1463225 is not set # CONFIG_ARM64_ERRATUM_1542419 is not set # CONFIG_ARM64_ERRATUM_1508412 is not set # CONFIG_ARM64_ERRATUM_2051678 is not set # CONFIG_ARM64_ERRATUM_2077057 is not set # CONFIG_ARM64_ERRATUM_2658417 is not set # CONFIG_ARM64_ERRATUM_2054223 is not set # CONFIG_ARM64_ERRATUM_2067961 is not set # CONFIG_ARM64_ERRATUM_2441009 is not set # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set # CONFIG_CAVIUM_ERRATUM_27456 is not set # CONFIG_CAVIUM_ERRATUM_30115 is not set # CONFIG_CAVIUM_TX2_ERRATUM_219 is not set # CONFIG_FUJITSU_ERRATUM_010001 is not set # CONFIG_HISILICON_ERRATUM_161600802 is not set # CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set # CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set # CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set # CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set # CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set # CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set # end of ARM errata workarounds via the alternatives framework CONFIG_ARM64_4K_PAGES=y # CONFIG_ARM64_16K_PAGES is not set # CONFIG_ARM64_64K_PAGES is not set # CONFIG_ARM64_VA_BITS_39 is not set CONFIG_ARM64_VA_BITS_48=y CONFIG_ARM64_VA_BITS=48 CONFIG_ARM64_PA_BITS_48=y CONFIG_ARM64_PA_BITS=48 # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_CPU_LITTLE_ENDIAN=y CONFIG_SCHED_MC=y # CONFIG_SCHED_CLUSTER is not set # CONFIG_SCHED_SMT is not set CONFIG_NR_CPUS=4 CONFIG_HOTPLUG_CPU=y # CONFIG_NUMA is not set # CONFIG_HZ_100 is not set CONFIG_HZ_250=y # CONFIG_HZ_300 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=250 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_HW_PERF_EVENTS=y CONFIG_CC_HAVE_SHADOW_CALL_STACK=y CONFIG_PARAVIRT=y # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set CONFIG_KEXEC=y # CONFIG_KEXEC_FILE is not set # CONFIG_CRASH_DUMP is not set CONFIG_TRANS_TABLE=y CONFIG_XEN_DOM0=y CONFIG_XEN=y CONFIG_ARCH_FORCE_MAX_ORDER=11 CONFIG_UNMAP_KERNEL_AT_EL0=y CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y CONFIG_RODATA_FULL_DEFAULT_ENABLED=y # CONFIG_ARM64_SW_TTBR0_PAN is not set CONFIG_ARM64_TAGGED_ADDR_ABI=y CONFIG_COMPAT=y CONFIG_KUSER_HELPERS=y # CONFIG_COMPAT_ALIGNMENT_FIXUPS is not set CONFIG_ARMV8_DEPRECATED=y CONFIG_SWP_EMULATION=y CONFIG_CP15_BARRIER_EMULATION=y CONFIG_SETEND_EMULATION=y # # ARMv8.1 architectural features # # CONFIG_ARM64_HW_AFDBM is not set # CONFIG_ARM64_PAN is not set CONFIG_AS_HAS_LDAPR=y CONFIG_AS_HAS_LSE_ATOMICS=y # CONFIG_ARM64_USE_LSE_ATOMICS is not set # end of ARMv8.1 architectural features # # ARMv8.2 architectural features # CONFIG_AS_HAS_ARMV8_2=y CONFIG_AS_HAS_SHA3=y # CONFIG_ARM64_PMEM is not set # CONFIG_ARM64_RAS_EXTN is not set # CONFIG_ARM64_CNP is not set # end of ARMv8.2 architectural features # # ARMv8.3 architectural features # # CONFIG_ARM64_PTR_AUTH is not set CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y CONFIG_AS_HAS_PAC=y CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y # end of ARMv8.3 architectural features # # ARMv8.4 architectural features # # CONFIG_ARM64_AMU_EXTN is not set CONFIG_AS_HAS_ARMV8_4=y # CONFIG_ARM64_TLB_RANGE is not set # end of ARMv8.4 architectural features # # ARMv8.5 architectural features # CONFIG_AS_HAS_ARMV8_5=y # CONFIG_ARM64_BTI is not set CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y # CONFIG_ARM64_E0PD is not set CONFIG_ARM64_AS_HAS_MTE=y # end of ARMv8.5 architectural features # # ARMv8.7 architectural features # # end of ARMv8.7 architectural features CONFIG_ARM64_SVE=y CONFIG_ARM64_SME=y CONFIG_ARM64_MODULE_PLTS=y # CONFIG_ARM64_PSEUDO_NMI is not set CONFIG_RELOCATABLE=y # CONFIG_RANDOMIZE_BASE is not set CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y CONFIG_STACKPROTECTOR_PER_TASK=y CONFIG_ARCH_NR_GPIO=0 # end of Kernel Features # # Boot options # # CONFIG_ARM64_ACPI_PARKING_PROTOCOL is not set CONFIG_CMDLINE="" CONFIG_EFI_STUB=y CONFIG_EFI=y CONFIG_DMI=y # end of Boot options # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_USERSPACE_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y # CONFIG_PM_DEBUG is not set CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_PM_GENERIC_DOMAINS_SLEEP=y CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y # end of Power management options # # CPU Power Management # # # CPU Idle # CONFIG_CPU_IDLE=y # CONFIG_CPU_IDLE_GOV_LADDER is not set CONFIG_CPU_IDLE_GOV_MENU=y # CONFIG_CPU_IDLE_GOV_TEO is not set # # ARM CPU Idle Drivers # # CONFIG_ARM_PSCI_CPUIDLE is not set # end of ARM CPU Idle Drivers # end of CPU Idle # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y # CONFIG_CPU_FREQ_STAT is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y # CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y CONFIG_CPUFREQ_DT_PLATDEV=y # CONFIG_ACPI_CPPC_CPUFREQ is not set CONFIG_ARM_SCPI_CPUFREQ=y CONFIG_ARM_QCOM_CPUFREQ_HW=y # end of CPU Frequency scaling # end of CPU Power Management CONFIG_ARCH_SUPPORTS_ACPI=y CONFIG_ACPI=y CONFIG_ACPI_GENERIC_GSI=y CONFIG_ACPI_CCA_REQUIRED=y # CONFIG_ACPI_DEBUGGER is not set CONFIG_ACPI_SPCR_TABLE=y # CONFIG_ACPI_EC_DEBUGFS is not set CONFIG_ACPI_AC=y CONFIG_ACPI_BATTERY=y CONFIG_ACPI_BUTTON=y # CONFIG_ACPI_VIDEO is not set CONFIG_ACPI_FAN=y # CONFIG_ACPI_TAD is not set # CONFIG_ACPI_DOCK is not set CONFIG_ACPI_PROCESSOR_IDLE=y CONFIG_ACPI_MCFG=y CONFIG_ACPI_PROCESSOR=y CONFIG_ACPI_HOTPLUG_CPU=y CONFIG_ACPI_THERMAL=y CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y CONFIG_ACPI_TABLE_UPGRADE=y # CONFIG_ACPI_DEBUG is not set # CONFIG_ACPI_PCI_SLOT is not set CONFIG_ACPI_CONTAINER=y # CONFIG_ACPI_HED is not set # CONFIG_ACPI_CUSTOM_METHOD is not set # CONFIG_ACPI_BGRT is not set CONFIG_ACPI_REDUCED_HARDWARE_ONLY=y CONFIG_HAVE_ACPI_APEI=y # CONFIG_ACPI_APEI is not set # CONFIG_ACPI_CONFIGFS is not set # CONFIG_ACPI_PFRUT is not set CONFIG_ACPI_IORT=y CONFIG_ACPI_GTDT=y CONFIG_ACPI_PPTT=y # CONFIG_PMIC_OPREGION is not set CONFIG_ACPI_PRMT=y CONFIG_IRQ_BYPASS_MANAGER=y CONFIG_HAVE_KVM=y CONFIG_VIRTUALIZATION=y # CONFIG_KVM is not set # # General architecture-dependent options # CONFIG_CRASH_CORE=y CONFIG_KEXEC_CORE=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_HAVE_IOREMAP_PROT=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_KEEPINITRD=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y CONFIG_MMU_GATHER_TABLE_FREE=y CONFIG_MMU_GATHER_RCU_TABLE_FREE=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y # CONFIG_SHADOW_CALL_STACK is not set CONFIG_ARCH_SUPPORTS_LTO_CLANG=y CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y CONFIG_LTO_NONE=y CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=18 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y CONFIG_RANDOMIZE_KSTACK_OFFSET=y # CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_COMPILER_H=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y CONFIG_ARCH_USE_MEMREMAP_PROT=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_HAS_RELR=y CONFIG_HAVE_PREEMPT_DYNAMIC=y CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_GZIP is not set # CONFIG_MODULE_COMPRESS_XZ is not set # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y # CONFIG_BLOCK_LEGACY_AUTOLOAD is not set CONFIG_BLK_CGROUP_RWSTAT=y CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y CONFIG_BLK_DEV_INTEGRITY=y CONFIG_BLK_DEV_INTEGRITY_T10=y # CONFIG_BLK_DEV_ZONED is not set CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_DEV_THROTTLING_LOW is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_CGROUP_IOLATENCY is not set # CONFIG_BLK_CGROUP_IOCOST is not set # CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # # CONFIG_PARTITION_ADVANCED is not set CONFIG_MSDOS_PARTITION=y CONFIG_EFI_PARTITION=y # end of Partition Types CONFIG_BLOCK_COMPAT=y CONFIG_BLK_MQ_PCI=y CONFIG_BLK_MQ_VIRTIO=y CONFIG_BLK_PM=y CONFIG_BLOCK_HOLDER_DEPRECATED=y CONFIG_BLK_MQ_STACKING=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y # CONFIG_IOSCHED_BFQ is not set # end of IO Schedulers CONFIG_ASN1=y CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y CONFIG_QUEUED_SPINLOCKS=y CONFIG_ARCH_USE_QUEUED_RWLOCKS=y CONFIG_QUEUED_RWLOCKS=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ARCH_BINFMT_ELF_STATE=y CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y CONFIG_ARCH_HAVE_ELF_PROT=y CONFIG_ARCH_USE_GNU_PROPERTY=y CONFIG_ELFCORE=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set CONFIG_BINFMT_SCRIPT=y CONFIG_BINFMT_MISC=m CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # # CONFIG_SWAP is not set # # SLAB allocator options # # CONFIG_SLAB is not set CONFIG_SLUB=y CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y # end of SLAB allocator options # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set # CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y CONFIG_ARCH_KEEP_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_MEMORY_BALLOON=y CONFIG_BALLOON_COMPACTION=y CONFIG_COMPACTION=y CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 CONFIG_PAGE_REPORTING=y CONFIG_MIGRATION=y CONFIG_ARCH_ENABLE_THP_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_MMU_NOTIFIER=y CONFIG_KSM=y CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set CONFIG_ARCH_WANTS_THP_SWAP=y CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set # CONFIG_READ_ONLY_THP_FOR_FS is not set CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set # CONFIG_CMA_DEBUGFS is not set # CONFIG_CMA_SYSFS is not set CONFIG_CMA_AREAS=7 CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y CONFIG_ZONE_DMA=y CONFIG_ZONE_DMA32=y CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y CONFIG_SECRETMEM=y # CONFIG_ANON_VMA_NAME is not set # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y CONFIG_NET_INGRESS=y CONFIG_NET_EGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_INTERFACE is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_ESP=y # CONFIG_NET_KEY is not set # CONFIG_XDP_SOCKETS is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=y CONFIG_IP_MROUTE_COMMON=y # CONFIG_IP_MROUTE is not set CONFIG_SYN_COOKIES=y # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set CONFIG_INET_ESP=y # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=y CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_INET_UDP_DIAG is not set # CONFIG_INET_RAW_DIAG is not set # CONFIG_INET_DIAG_DESTROY is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set CONFIG_IPV6_MIP6=m CONFIG_IPV6_ILA=m CONFIG_INET6_TUNNEL=m CONFIG_IPV6_VTI=m CONFIG_IPV6_SIT=y CONFIG_IPV6_SIT_6RD=y CONFIG_IPV6_NDISC_NODETYPE=y CONFIG_IPV6_TUNNEL=m CONFIG_IPV6_FOU=m CONFIG_IPV6_MULTIPLE_TABLES=y CONFIG_IPV6_SUBTREES=y CONFIG_IPV6_MROUTE=y CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y CONFIG_IPV6_PIMSM_V2=y # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set # CONFIG_NETLABEL is not set # CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NET_PTP_CLASSIFY=y # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_EGRESS=y CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_FAMILY_BRIDGE=y # CONFIG_NETFILTER_NETLINK_HOOK is not set # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set # CONFIG_NETFILTER_NETLINK_LOG is not set # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=m CONFIG_NF_LOG_SYSLOG=m CONFIG_NF_CONNTRACK_MARK=y # CONFIG_NF_CONNTRACK_ZONES is not set CONFIG_NF_CONNTRACK_PROCFS=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CONNTRACK_TIMEOUT=y CONFIG_NF_CONNTRACK_TIMESTAMP=y # CONFIG_NF_CONNTRACK_LABELS is not set # CONFIG_NF_CT_PROTO_DCCP is not set CONFIG_NF_CT_PROTO_GRE=y # CONFIG_NF_CT_PROTO_SCTP is not set # CONFIG_NF_CT_PROTO_UDPLITE is not set CONFIG_NF_CONNTRACK_AMANDA=m CONFIG_NF_CONNTRACK_FTP=m CONFIG_NF_CONNTRACK_H323=m CONFIG_NF_CONNTRACK_IRC=m CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m CONFIG_NF_CONNTRACK_SNMP=m CONFIG_NF_CONNTRACK_PPTP=m CONFIG_NF_CONNTRACK_SANE=m CONFIG_NF_CONNTRACK_SIP=m CONFIG_NF_CONNTRACK_TFTP=m # CONFIG_NF_CT_NETLINK is not set # CONFIG_NF_CT_NETLINK_TIMEOUT is not set CONFIG_NF_NAT=m CONFIG_NF_NAT_AMANDA=m CONFIG_NF_NAT_FTP=m CONFIG_NF_NAT_IRC=m CONFIG_NF_NAT_SIP=m CONFIG_NF_NAT_TFTP=m CONFIG_NF_NAT_REDIRECT=y CONFIG_NF_NAT_MASQUERADE=y CONFIG_NETFILTER_SYNPROXY=m CONFIG_NF_TABLES=m # CONFIG_NF_TABLES_INET is not set # CONFIG_NF_TABLES_NETDEV is not set # CONFIG_NFT_NUMGEN is not set # CONFIG_NFT_CT is not set # CONFIG_NFT_CONNLIMIT is not set # CONFIG_NFT_LOG is not set # CONFIG_NFT_LIMIT is not set # CONFIG_NFT_MASQ is not set # CONFIG_NFT_REDIR is not set # CONFIG_NFT_TUNNEL is not set # CONFIG_NFT_OBJREF is not set # CONFIG_NFT_QUOTA is not set # CONFIG_NFT_REJECT is not set # CONFIG_NFT_COMPAT is not set # CONFIG_NFT_HASH is not set # CONFIG_NFT_XFRM is not set # CONFIG_NFT_SOCKET is not set # CONFIG_NFT_OSF is not set # CONFIG_NFT_TPROXY is not set # CONFIG_NFT_SYNPROXY is not set # CONFIG_NF_FLOW_TABLE is not set CONFIG_NETFILTER_XTABLES=m CONFIG_NETFILTER_XTABLES_COMPAT=y # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_AUDIT is not set CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_CT is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set CONFIG_NETFILTER_XT_TARGET_HL=m # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set CONFIG_NETFILTER_XT_TARGET_LOG=m # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TRACE is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m # CONFIG_NETFILTER_XT_MATCH_HELPER is not set CONFIG_NETFILTER_XT_MATCH_HL=m # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set CONFIG_NETFILTER_XT_MATCH_IPVS=m # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_NETFILTER_XT_MATCH_OWNER is not set # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set # CONFIG_NETFILTER_XT_MATCH_STATE is not set # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set CONFIG_IP_VS=m # CONFIG_IP_VS_IPV6 is not set # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # CONFIG_IP_VS_PROTO_ESP is not set # CONFIG_IP_VS_PROTO_AH is not set # CONFIG_IP_VS_PROTO_SCTP is not set # # IPVS scheduler # CONFIG_IP_VS_RR=m # CONFIG_IP_VS_WRR is not set # CONFIG_IP_VS_LC is not set # CONFIG_IP_VS_WLC is not set # CONFIG_IP_VS_FO is not set # CONFIG_IP_VS_OVF is not set # CONFIG_IP_VS_LBLC is not set # CONFIG_IP_VS_LBLCR is not set # CONFIG_IP_VS_DH is not set # CONFIG_IP_VS_SH is not set # CONFIG_IP_VS_MH is not set # CONFIG_IP_VS_SED is not set # CONFIG_IP_VS_NQ is not set # CONFIG_IP_VS_TWOS is not set # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS MH scheduler # CONFIG_IP_VS_MH_TAB_INDEX=12 # # IPVS application helper # # CONFIG_IP_VS_FTP is not set CONFIG_IP_VS_NFCT=y # CONFIG_IP_VS_PE_SIP is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_TABLES_IPV4 is not set # CONFIG_NF_TABLES_ARP is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set CONFIG_NF_LOG_IPV4=m CONFIG_NF_REJECT_IPV4=m CONFIG_NF_NAT_SNMP_BASIC=m CONFIG_NF_NAT_PPTP=m CONFIG_NF_NAT_H323=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set CONFIG_IP_NF_RAW=m CONFIG_IP_NF_SECURITY=m # CONFIG_IP_NF_ARPTABLES is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_TABLES_IPV6 is not set CONFIG_NF_DUP_IPV6=m CONFIG_NF_REJECT_IPV6=m CONFIG_NF_LOG_IPV6=m CONFIG_IP6_NF_IPTABLES=m CONFIG_IP6_NF_MATCH_AH=m CONFIG_IP6_NF_MATCH_EUI64=m CONFIG_IP6_NF_MATCH_FRAG=m CONFIG_IP6_NF_MATCH_OPTS=m CONFIG_IP6_NF_MATCH_HL=m CONFIG_IP6_NF_MATCH_IPV6HEADER=m CONFIG_IP6_NF_MATCH_MH=m CONFIG_IP6_NF_MATCH_RPFILTER=m CONFIG_IP6_NF_MATCH_RT=m # CONFIG_IP6_NF_MATCH_SRH is not set CONFIG_IP6_NF_TARGET_HL=m CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m CONFIG_IP6_NF_TARGET_SYNPROXY=m CONFIG_IP6_NF_MANGLE=m CONFIG_IP6_NF_RAW=m CONFIG_IP6_NF_SECURITY=m CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m CONFIG_IP6_NF_TARGET_NPT=m # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_TABLES_BRIDGE is not set # CONFIG_NF_CONNTRACK_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y # CONFIG_BRIDGE_MRP is not set # CONFIG_BRIDGE_CFM is not set # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set CONFIG_6LOWPAN=y # CONFIG_6LOWPAN_DEBUGFS is not set CONFIG_6LOWPAN_NHC=m CONFIG_6LOWPAN_NHC_DEST=m CONFIG_6LOWPAN_NHC_FRAGMENT=m CONFIG_6LOWPAN_NHC_HOP=m CONFIG_6LOWPAN_NHC_IPV6=m CONFIG_6LOWPAN_NHC_MOBILITY=m CONFIG_6LOWPAN_NHC_ROUTING=m CONFIG_6LOWPAN_NHC_UDP=m # CONFIG_6LOWPAN_GHC_EXT_HDR_HOP is not set # CONFIG_6LOWPAN_GHC_UDP is not set # CONFIG_6LOWPAN_GHC_ICMPV6 is not set # CONFIG_6LOWPAN_GHC_EXT_HDR_DEST is not set # CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG is not set # CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE is not set CONFIG_IEEE802154=y CONFIG_IEEE802154_NL802154_EXPERIMENTAL=y CONFIG_IEEE802154_SOCKET=m CONFIG_IEEE802154_6LOWPAN=m CONFIG_MAC802154=m CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set # CONFIG_NET_SCH_FQ_CODEL is not set # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set # CONFIG_NET_SCH_DEFAULT is not set # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_TCINDEX is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_RSVP is not set # CONFIG_NET_CLS_RSVP6 is not set # CONFIG_NET_CLS_FLOW is not set CONFIG_NET_CLS_CGROUP=m # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set CONFIG_NET_L3_MASTER_DEV=y CONFIG_QRTR=y CONFIG_QRTR_SMD=y # CONFIG_QRTR_TUN is not set # CONFIG_NET_NCSI is not set CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_STREAM_PARSER is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # end of Network testing # end of Networking options # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=y CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=y CONFIG_BT_RFCOMM_TTY=y CONFIG_BT_BNEP=y CONFIG_BT_BNEP_MC_FILTER=y CONFIG_BT_BNEP_PROTO_FILTER=y CONFIG_BT_HIDP=y CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_6LOWPAN is not set CONFIG_BT_LEDS=y # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set CONFIG_BT_DEBUGFS=y # CONFIG_BT_SELFTEST is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=y CONFIG_BT_BCM=y CONFIG_BT_RTL=y CONFIG_BT_QCA=y CONFIG_BT_HCIBTUSB=y # CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set CONFIG_BT_HCIBTUSB_BCM=y # CONFIG_BT_HCIBTUSB_MTK is not set CONFIG_BT_HCIBTUSB_RTL=y CONFIG_BT_HCIBTSDIO=y CONFIG_BT_HCIUART=y CONFIG_BT_HCIUART_H4=y CONFIG_BT_HCIUART_BCSP=y # CONFIG_BT_HCIUART_ATH3K is not set # CONFIG_BT_HCIUART_INTEL is not set # CONFIG_BT_HCIUART_AG6XX is not set # CONFIG_BT_HCIBCM203X is not set # CONFIG_BT_HCIBPA10X is not set # CONFIG_BT_HCIBFUSB is not set # CONFIG_BT_HCIVHCI is not set # CONFIG_BT_MRVL is not set # CONFIG_BT_ATH3K is not set # CONFIG_BT_MTKSDIO is not set CONFIG_BT_QCOMSMD=y # CONFIG_BT_VIRTIO is not set # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=y # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y # CONFIG_CFG80211_DEFAULT_PS is not set # CONFIG_CFG80211_DEBUGFS is not set CONFIG_CFG80211_CRDA_SUPPORT=y CONFIG_CFG80211_WEXT=y CONFIG_MAC80211=y CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set CONFIG_LWTUNNEL=y CONFIG_LWTUNNEL_BPF=y CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_PAGE_POOL=y # CONFIG_PAGE_POOL_STATS is not set CONFIG_FAILOVER=y CONFIG_ETHTOOL_NETLINK=y # # Device Drivers # CONFIG_ARM_AMBA=y CONFIG_HAVE_PCI=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y CONFIG_PCI_DOMAINS_GENERIC=y CONFIG_PCI_SYSCALL=y CONFIG_PCIEPORTBUS=y CONFIG_PCIEAER=y # CONFIG_PCIEAER_INJECT is not set # CONFIG_PCIE_ECRC is not set CONFIG_PCIEASPM=y CONFIG_PCIEASPM_DEFAULT=y # CONFIG_PCIEASPM_POWERSAVE is not set # CONFIG_PCIEASPM_POWER_SUPERSAVE is not set # CONFIG_PCIEASPM_PERFORMANCE is not set CONFIG_PCIE_PME=y # CONFIG_PCIE_DPC is not set # CONFIG_PCIE_PTM is not set CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y CONFIG_PCI_QUIRKS=y # CONFIG_PCI_DEBUG is not set # CONFIG_PCI_REALLOC_ENABLE_AUTO is not set # CONFIG_PCI_STUB is not set # CONFIG_PCI_PF_STUB is not set CONFIG_PCI_ATS=y CONFIG_PCI_ECAM=y CONFIG_PCI_IOV=y # CONFIG_PCI_PRI is not set # CONFIG_PCI_PASID is not set CONFIG_PCI_LABEL=y CONFIG_VGA_ARB=y CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # # PCI controller drivers # # CONFIG_PCI_FTPCI100 is not set CONFIG_PCI_HOST_COMMON=y CONFIG_PCI_HOST_GENERIC=y # CONFIG_PCIE_XILINX is not set CONFIG_PCI_XGENE=y CONFIG_PCI_XGENE_MSI=y # CONFIG_PCIE_ALTERA is not set # CONFIG_PCI_HOST_THUNDER_PEM is not set # CONFIG_PCI_HOST_THUNDER_ECAM is not set # CONFIG_PCIE_MICROCHIP_HOST is not set # # DesignWare PCI Core Support # CONFIG_PCIE_DW=y CONFIG_PCIE_DW_HOST=y # CONFIG_PCIE_DW_PLAT_HOST is not set CONFIG_PCI_HISI=y CONFIG_PCIE_QCOM=y # CONFIG_PCIE_KIRIN is not set # CONFIG_PCI_MESON is not set # CONFIG_PCIE_AL is not set # end of DesignWare PCI Core Support # # Mobiveil PCIe Core Support # # end of Mobiveil PCIe Core Support # # Cadence PCIe controllers support # # CONFIG_PCIE_CADENCE_PLAT_HOST is not set # CONFIG_PCI_J721E_HOST is not set # end of Cadence PCIe controllers support # end of PCI controller drivers # # PCI Endpoint # # CONFIG_PCI_ENDPOINT is not set # end of PCI Endpoint # # PCI switch controller drivers # # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers # CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set # # Generic Driver Options # # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y # CONFIG_DEVTMPFS_SAFE is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set CONFIG_FW_CACHE=y # CONFIG_FW_UPLOAD is not set # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y CONFIG_ALLOW_DEV_COREDUMP=y CONFIG_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_SYS_HYPERVISOR=y CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_SOC_BUS=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_SPMI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set CONFIG_GENERIC_ARCH_TOPOLOGY=y # end of Generic Driver Options # # Bus devices # # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_MOXTET is not set # CONFIG_QCOM_EBI2 is not set # CONFIG_QCOM_SSC_BLOCK_BUS is not set CONFIG_VEXPRESS_CONFIG=y # CONFIG_MHI_BUS is not set # CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # # CONFIG_ARM_SCMI_PROTOCOL is not set # end of ARM System Control and Management Interface Protocol CONFIG_ARM_SCPI_PROTOCOL=y CONFIG_ARM_SCPI_POWER_DOMAIN=y CONFIG_DMIID=y # CONFIG_DMI_SYSFS is not set # CONFIG_ISCSI_IBFT is not set # CONFIG_FW_CFG_SYSFS is not set CONFIG_QCOM_SCM=y # CONFIG_QCOM_SCM_DOWNLOAD_MODE_DEFAULT is not set # CONFIG_SYSFB_SIMPLEFB is not set # CONFIG_ARM_FFA_TRANSPORT is not set # CONFIG_GOOGLE_FIRMWARE is not set # # EFI (Extensible Firmware Interface) Support # CONFIG_EFI_ESRT=y CONFIG_EFI_PARAMS_FROM_FDT=y CONFIG_EFI_RUNTIME_WRAPPERS=y CONFIG_EFI_GENERIC_STUB=y # CONFIG_EFI_ZBOOT is not set CONFIG_EFI_ARMSTUB_DTB_LOADER=y CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y # CONFIG_EFI_BOOTLOADER_CONTROL is not set # CONFIG_EFI_CAPSULE_LOADER is not set # CONFIG_EFI_TEST is not set # CONFIG_RESET_ATTACK_MITIGATION is not set # CONFIG_EFI_DISABLE_PCI_DMA is not set CONFIG_EFI_EARLYCON=y CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y # CONFIG_EFI_DISABLE_RUNTIME is not set # CONFIG_EFI_COCO_SECRET is not set # end of EFI (Extensible Firmware Interface) Support CONFIG_ARM_PSCI_FW=y # CONFIG_ARM_PSCI_CHECKER is not set CONFIG_HAVE_ARM_SMCCC=y CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y CONFIG_ARM_SMCCC_SOC_ID=y # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set CONFIG_MTD=y # CONFIG_MTD_TESTS is not set # # Partition parsers # # CONFIG_MTD_AR7_PARTS is not set # CONFIG_MTD_CMDLINE_PARTS is not set CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AFS_PARTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set # CONFIG_MTD_QCOMSMEM_PARTS is not set # end of Partition parsers # # User Modules And Translation Layers # # CONFIG_MTD_BLOCK is not set # CONFIG_MTD_BLOCK_RO is not set # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # CONFIG_RFD_FTL is not set # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set # CONFIG_MTD_OOPS is not set # CONFIG_MTD_PARTITIONED_MASTER is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # end of RAM/ROM/Flash chip drivers # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_INTEL_VR_NOR is not set # CONFIG_MTD_PLATRAM is not set # end of Mapping drivers for chip access # # Self-contained MTD device drivers # # CONFIG_MTD_PMC551 is not set # CONFIG_MTD_DATAFLASH is not set # CONFIG_MTD_MCHP23K256 is not set # CONFIG_MTD_MCHP48L640 is not set # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLOCK2MTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOCG3 is not set # end of Self-contained MTD device drivers # # NAND # # CONFIG_MTD_ONENAND is not set # CONFIG_MTD_RAW_NAND is not set # CONFIG_MTD_SPI_NAND is not set # # ECC engine support # # CONFIG_MTD_NAND_ECC_SW_HAMMING is not set # CONFIG_MTD_NAND_ECC_SW_BCH is not set # CONFIG_MTD_NAND_ECC_MXIC is not set # end of ECC engine support # end of NAND # # LPDDR & LPDDR2 PCM memory drivers # # CONFIG_MTD_LPDDR is not set # end of LPDDR & LPDDR2 PCM memory drivers CONFIG_MTD_SPI_NOR=y CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y # CONFIG_MTD_SPI_NOR_SWP_DISABLE is not set CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y # CONFIG_MTD_SPI_NOR_SWP_KEEP is not set # CONFIG_MTD_UBI is not set # CONFIG_MTD_HYPERBUS is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_RESERVED_MEM=y # CONFIG_OF_OVERLAY is not set # CONFIG_PARPORT is not set CONFIG_PNP=y CONFIG_PNP_DEBUG_MESSAGES=y # # Protocols # CONFIG_PNPACPI=y CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_DRBD is not set CONFIG_BLK_DEV_NBD=m # CONFIG_BLK_DEV_RAM is not set # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set CONFIG_XEN_BLKDEV_FRONTEND=y # CONFIG_XEN_BLKDEV_BACKEND is not set CONFIG_VIRTIO_BLK=y # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_UBLK is not set # # NVME Support # # CONFIG_BLK_DEV_NVME is not set # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set # CONFIG_NVME_TARGET is not set # end of NVME Support # # Misc devices # # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_PHANTOM is not set # CONFIG_TIFM_CORE is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HI6421V600_IRQ is not set # CONFIG_HP_ILO is not set # CONFIG_QCOM_COINCELL is not set # CONFIG_QCOM_FASTRPC is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set CONFIG_SRAM=y # CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set # CONFIG_HISI_HIKEY_USB is not set # CONFIG_OPEN_DICE is not set # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set # CONFIG_EEPROM_93CX6 is not set # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # CONFIG_CB710_CORE is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set # CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set # CONFIG_PVPANIC is not set # CONFIG_GP_PCI1XXXX is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set # CONFIG_BLK_DEV_SR is not set CONFIG_CHR_DEV_SG=m CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_SCAN_ASYNC is not set # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set CONFIG_SCSI_SAS_ATTRS=y CONFIG_SCSI_SAS_LIBSAS=y CONFIG_SCSI_SAS_ATA=y CONFIG_SCSI_SAS_HOST_SMP=y # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_CXGB3_ISCSI is not set # CONFIG_SCSI_CXGB4_ISCSI is not set # CONFIG_SCSI_BNX2_ISCSI is not set # CONFIG_BE2ISCSI is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_HPSA is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_3W_SAS is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_AIC94XX is not set CONFIG_SCSI_HISI_SAS=y # CONFIG_SCSI_HISI_SAS_PCI is not set # CONFIG_SCSI_HISI_SAS_DEBUGFS_DEFAULT_ENABLE is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set # CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set # CONFIG_SCSI_MPI3MR is not set # CONFIG_SCSI_SMARTPQI is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_MYRB is not set # CONFIG_SCSI_MYRS is not set # CONFIG_XEN_SCSI_FRONTEND is not set # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FDOMAIN_PCI is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_STEX is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_IPR is not set # CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLA_ISCSI is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_AM53C974 is not set # CONFIG_SCSI_WD719X is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_PMCRAID is not set # CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_VIRTIO is not set # CONFIG_SCSI_DH is not set # end of SCSI device support CONFIG_ATA=y CONFIG_SATA_HOST=y CONFIG_PATA_TIMINGS=y CONFIG_ATA_VERBOSE_ERROR=y CONFIG_ATA_FORCE=y CONFIG_ATA_ACPI=y # CONFIG_SATA_ZPODD is not set CONFIG_SATA_PMP=y # # Controllers with non-SFF native interface # CONFIG_SATA_AHCI=y CONFIG_SATA_MOBILE_LPM_POLICY=0 CONFIG_SATA_AHCI_PLATFORM=y # CONFIG_AHCI_DWC is not set CONFIG_AHCI_CEVA=y CONFIG_AHCI_XGENE=y CONFIG_AHCI_QORIQ=y # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set CONFIG_SATA_SIL24=y CONFIG_ATA_SFF=y # # SFF controllers with custom DMA interface # # CONFIG_PDC_ADMA is not set # CONFIG_SATA_QSTOR is not set # CONFIG_SATA_SX4 is not set CONFIG_ATA_BMDMA=y # # SATA SFF controllers with BMDMA # # CONFIG_ATA_PIIX is not set # CONFIG_SATA_DWC is not set # CONFIG_SATA_MV is not set # CONFIG_SATA_NV is not set # CONFIG_SATA_PROMISE is not set # CONFIG_SATA_SIL is not set # CONFIG_SATA_SIS is not set # CONFIG_SATA_SVW is not set # CONFIG_SATA_ULI is not set # CONFIG_SATA_VIA is not set # CONFIG_SATA_VITESSE is not set # # PATA SFF controllers with BMDMA # # CONFIG_PATA_ALI is not set # CONFIG_PATA_AMD is not set # CONFIG_PATA_ARTOP is not set # CONFIG_PATA_ATIIXP is not set # CONFIG_PATA_ATP867X is not set # CONFIG_PATA_CMD64X is not set # CONFIG_PATA_CYPRESS is not set # CONFIG_PATA_EFAR is not set # CONFIG_PATA_HPT366 is not set # CONFIG_PATA_HPT37X is not set # CONFIG_PATA_HPT3X2N is not set # CONFIG_PATA_HPT3X3 is not set # CONFIG_PATA_IT8213 is not set # CONFIG_PATA_IT821X is not set # CONFIG_PATA_JMICRON is not set # CONFIG_PATA_MARVELL is not set # CONFIG_PATA_NETCELL is not set # CONFIG_PATA_NINJA32 is not set # CONFIG_PATA_NS87415 is not set # CONFIG_PATA_OLDPIIX is not set # CONFIG_PATA_OPTIDMA is not set # CONFIG_PATA_PDC2027X is not set # CONFIG_PATA_PDC_OLD is not set # CONFIG_PATA_RADISYS is not set # CONFIG_PATA_RDC is not set # CONFIG_PATA_SCH is not set # CONFIG_PATA_SERVERWORKS is not set # CONFIG_PATA_SIL680 is not set # CONFIG_PATA_SIS is not set # CONFIG_PATA_TOSHIBA is not set # CONFIG_PATA_TRIFLEX is not set # CONFIG_PATA_VIA is not set # CONFIG_PATA_WINBOND is not set # # PIO-only SFF controllers # # CONFIG_PATA_CMD640_PCI is not set # CONFIG_PATA_MPIIX is not set # CONFIG_PATA_NS87410 is not set # CONFIG_PATA_OPTI is not set CONFIG_PATA_PLATFORM=y CONFIG_PATA_OF_PLATFORM=y # CONFIG_PATA_RZ1000 is not set # # Generic fallback / legacy drivers # # CONFIG_PATA_ACPI is not set # CONFIG_ATA_GENERIC is not set # CONFIG_PATA_LEGACY is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=m # CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m # CONFIG_DM_UNSTRIPED is not set # CONFIG_DM_CRYPT is not set # CONFIG_DM_SNAPSHOT is not set CONFIG_DM_THIN_PROVISIONING=m # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_EBS is not set # CONFIG_DM_ERA is not set # CONFIG_DM_CLONE is not set # CONFIG_DM_MIRROR is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_DUST is not set # CONFIG_DM_UEVENT is not set # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_DM_INTEGRITY is not set # CONFIG_DM_AUDIT is not set # CONFIG_TARGET_CORE is not set # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # # CONFIG_FIREWIRE is not set # CONFIG_FIREWIRE_NOSY is not set # end of IEEE 1394 (FireWire) support CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set CONFIG_DUMMY=m CONFIG_WIREGUARD=m # CONFIG_WIREGUARD_DEBUG is not set # CONFIG_EQUALIZER is not set # CONFIG_NET_FC is not set # 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 # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_AMT is not set # CONFIG_MACSEC is not set # CONFIG_NETCONSOLE is not set CONFIG_TUN=y # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m # CONFIG_VIRTIO_NET is not set CONFIG_NLMON=m # CONFIG_NET_VRF is not set # CONFIG_ARCNET is not set CONFIG_ETHERNET=y CONFIG_NET_VENDOR_3COM=y # CONFIG_VORTEX is not set # CONFIG_TYPHOON is not set CONFIG_NET_VENDOR_ADAPTEC=y # CONFIG_ADAPTEC_STARFIRE is not set CONFIG_NET_VENDOR_AGERE=y # CONFIG_ET131X is not set CONFIG_NET_VENDOR_ALACRITECH=y # CONFIG_SLICOSS is not set CONFIG_NET_VENDOR_ALTEON=y # CONFIG_ACENIC is not set # CONFIG_ALTERA_TSE is not set CONFIG_NET_VENDOR_AMAZON=y # CONFIG_ENA_ETHERNET is not set CONFIG_NET_VENDOR_AMD=y # CONFIG_AMD8111_ETH is not set # CONFIG_PCNET32 is not set CONFIG_AMD_XGBE=y CONFIG_NET_VENDOR_AQUANTIA=y # CONFIG_AQTION is not set CONFIG_NET_VENDOR_ARC=y # CONFIG_NET_VENDOR_ASIX is not set CONFIG_NET_VENDOR_ATHEROS=y # CONFIG_ATL2 is not set # CONFIG_ATL1 is not set # CONFIG_ATL1E is not set CONFIG_ATL1C=y # CONFIG_ALX is not set CONFIG_NET_VENDOR_BROADCOM=y # CONFIG_B44 is not set # CONFIG_BCMGENET is not set # CONFIG_BNX2 is not set # CONFIG_CNIC is not set # CONFIG_TIGON3 is not set # CONFIG_BNX2X is not set # CONFIG_SYSTEMPORT is not set # CONFIG_BNXT is not set CONFIG_NET_VENDOR_CADENCE=y CONFIG_MACB=y CONFIG_MACB_USE_HWSTAMP=y # CONFIG_MACB_PCI is not set CONFIG_NET_VENDOR_CAVIUM=y # CONFIG_THUNDER_NIC_PF is not set # CONFIG_THUNDER_NIC_VF is not set # CONFIG_THUNDER_NIC_BGX is not set # CONFIG_THUNDER_NIC_RGX is not set CONFIG_CAVIUM_PTP=y # CONFIG_LIQUIDIO is not set # CONFIG_LIQUIDIO_VF is not set CONFIG_NET_VENDOR_CHELSIO=y # CONFIG_CHELSIO_T1 is not set # CONFIG_CHELSIO_T3 is not set # CONFIG_CHELSIO_T4 is not set # CONFIG_CHELSIO_T4VF is not set CONFIG_NET_VENDOR_CISCO=y # CONFIG_ENIC is not set CONFIG_NET_VENDOR_CORTINA=y # CONFIG_GEMINI_ETHERNET is not set # CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set CONFIG_NET_VENDOR_DEC=y # CONFIG_NET_TULIP is not set CONFIG_NET_VENDOR_DLINK=y # CONFIG_DL2K is not set # CONFIG_SUNDANCE is not set CONFIG_NET_VENDOR_EMULEX=y # CONFIG_BE2NET is not set # CONFIG_NET_VENDOR_ENGLEDER is not set CONFIG_NET_VENDOR_EZCHIP=y # CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set # CONFIG_NET_VENDOR_FUNGIBLE is not set CONFIG_NET_VENDOR_GOOGLE=y # CONFIG_GVE is not set CONFIG_NET_VENDOR_HISILICON=y # CONFIG_HIX5HD2_GMAC is not set # CONFIG_HISI_FEMAC is not set # CONFIG_HIP04_ETH is not set CONFIG_HNS_MDIO=y CONFIG_HNS=y CONFIG_HNS_DSAF=y CONFIG_HNS_ENET=y # CONFIG_HNS3 is not set CONFIG_NET_VENDOR_HUAWEI=y # CONFIG_HINIC is not set CONFIG_NET_VENDOR_I825XX=y CONFIG_NET_VENDOR_INTEL=y # CONFIG_E100 is not set # CONFIG_E1000 is not set CONFIG_E1000E=y CONFIG_IGB=y CONFIG_IGBVF=y # CONFIG_IXGB is not set # CONFIG_IXGBE is not set # CONFIG_IXGBEVF is not set # CONFIG_I40E is not set # CONFIG_I40EVF is not set # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set # CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_JME is not set # CONFIG_NET_VENDOR_ADI is not set # CONFIG_NET_VENDOR_LITEX is not set CONFIG_NET_VENDOR_MARVELL=y # CONFIG_MVMDIO is not set # CONFIG_SKGE is not set CONFIG_SKY2=y # CONFIG_SKY2_DEBUG is not set # CONFIG_OCTEONTX2_AF is not set # CONFIG_OCTEONTX2_PF is not set # CONFIG_OCTEON_EP is not set CONFIG_NET_VENDOR_MELLANOX=y # CONFIG_MLX4_EN is not set # CONFIG_MLX5_CORE is not set # CONFIG_MLXSW_CORE is not set # CONFIG_MLXFW is not set # CONFIG_MLXBF_GIGE is not set CONFIG_NET_VENDOR_MICREL=y # CONFIG_KS8842 is not set # CONFIG_KS8851 is not set # CONFIG_KS8851_MLL is not set # CONFIG_KSZ884X_PCI is not set CONFIG_NET_VENDOR_MICROCHIP=y # CONFIG_ENC28J60 is not set # CONFIG_ENCX24J600 is not set # CONFIG_LAN743X is not set CONFIG_NET_VENDOR_MICROSEMI=y # CONFIG_NET_VENDOR_MICROSOFT is not set CONFIG_NET_VENDOR_MYRI=y # CONFIG_MYRI10GE is not set # CONFIG_FEALNX is not set CONFIG_NET_VENDOR_NI=y # CONFIG_NI_XGE_MANAGEMENT_ENET is not set CONFIG_NET_VENDOR_NATSEMI=y # CONFIG_NATSEMI is not set # CONFIG_NS83820 is not set CONFIG_NET_VENDOR_NETERION=y # CONFIG_S2IO is not set CONFIG_NET_VENDOR_NETRONOME=y # CONFIG_NFP is not set CONFIG_NET_VENDOR_8390=y # CONFIG_NE2K_PCI is not set CONFIG_NET_VENDOR_NVIDIA=y # CONFIG_FORCEDETH is not set CONFIG_NET_VENDOR_OKI=y # CONFIG_ETHOC is not set CONFIG_NET_VENDOR_PACKET_ENGINES=y # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set CONFIG_NET_VENDOR_PENSANDO=y # CONFIG_IONIC is not set CONFIG_NET_VENDOR_QLOGIC=y # CONFIG_QLA3XXX is not set # CONFIG_QLCNIC is not set # CONFIG_NETXEN_NIC is not set # CONFIG_QED is not set CONFIG_NET_VENDOR_BROCADE=y # CONFIG_BNA is not set CONFIG_NET_VENDOR_QUALCOMM=y # CONFIG_QCA7000_SPI is not set # CONFIG_QCOM_EMAC is not set # CONFIG_RMNET is not set CONFIG_NET_VENDOR_RDC=y # CONFIG_R6040 is not set CONFIG_NET_VENDOR_REALTEK=y # CONFIG_8139CP is not set # CONFIG_8139TOO is not set # CONFIG_R8169 is not set CONFIG_NET_VENDOR_RENESAS=y CONFIG_NET_VENDOR_ROCKER=y CONFIG_NET_VENDOR_SAMSUNG=y # CONFIG_SXGBE_ETH is not set CONFIG_NET_VENDOR_SEEQ=y CONFIG_NET_VENDOR_SILAN=y # CONFIG_SC92031 is not set CONFIG_NET_VENDOR_SIS=y # CONFIG_SIS900 is not set # CONFIG_SIS190 is not set CONFIG_NET_VENDOR_SOLARFLARE=y # CONFIG_SFC is not set # CONFIG_SFC_FALCON is not set # CONFIG_SFC_SIENA is not set CONFIG_NET_VENDOR_SMSC=y CONFIG_SMC91X=y # CONFIG_EPIC100 is not set CONFIG_SMSC911X=y # CONFIG_SMSC9420 is not set CONFIG_NET_VENDOR_SOCIONEXT=y CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=m # CONFIG_STMMAC_SELFTESTS is not set CONFIG_STMMAC_PLATFORM=m # CONFIG_DWMAC_DWC_QOS_ETH is not set CONFIG_DWMAC_GENERIC=m CONFIG_DWMAC_IPQ806X=m CONFIG_DWMAC_QCOM_ETHQOS=m # CONFIG_DWMAC_INTEL_PLAT is not set # CONFIG_DWMAC_LOONGSON is not set # CONFIG_STMMAC_PCI is not set CONFIG_NET_VENDOR_SUN=y # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set # CONFIG_CASSINI is not set # CONFIG_NIU is not set CONFIG_NET_VENDOR_SYNOPSYS=y # CONFIG_DWC_XLGMAC is not set CONFIG_NET_VENDOR_TEHUTI=y # CONFIG_TEHUTI is not set CONFIG_NET_VENDOR_TI=y # CONFIG_TI_CPSW_PHY_SEL is not set # CONFIG_TLAN is not set # CONFIG_NET_VENDOR_VERTEXCOM is not set CONFIG_NET_VENDOR_VIA=y # CONFIG_VIA_RHINE is not set # CONFIG_VIA_VELOCITY is not set CONFIG_NET_VENDOR_WIZNET=y # CONFIG_WIZNET_W5100 is not set # CONFIG_WIZNET_W5300 is not set CONFIG_NET_VENDOR_XILINX=y # CONFIG_XILINX_EMACLITE is not set # CONFIG_XILINX_AXI_EMAC is not set # CONFIG_XILINX_LL_TEMAC is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set # CONFIG_NET_SB1000 is not set CONFIG_PHYLINK=y CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_SFP is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_ADIN_PHY is not set # CONFIG_ADIN1100_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=y # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM54140_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set # CONFIG_MAXLINEAR_GPHY is not set # CONFIG_MEDIATEK_GE_PHY is not set CONFIG_MICREL_PHY=y CONFIG_MICROCHIP_PHY=m # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set # CONFIG_MOTORCOMM_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_QSEMI_PHY is not set CONFIG_REALTEK_PHY=m # CONFIG_RENESAS_PHY is not set # CONFIG_ROCKCHIP_PHY is not set CONFIG_SMSC_PHY=m # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_DP83TD510_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set # CONFIG_PSE_CONTROLLER is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_OF_MDIO=y CONFIG_ACPI_MDIO=y CONFIG_MDIO_DEVRES=y CONFIG_MDIO_BITBANG=y # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MDIO_GPIO is not set # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_OCTEON is not set # CONFIG_MDIO_IPQ4019 is not set # CONFIG_MDIO_IPQ8064 is not set # CONFIG_MDIO_THUNDER is not set # # MDIO Multiplexers # # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # # PCS device drivers # CONFIG_PCS_XPCS=m # end of PCS device drivers # CONFIG_PPP is not set # CONFIG_SLIP is not set CONFIG_USB_NET_DRIVERS=y CONFIG_USB_CATC=m CONFIG_USB_KAWETH=m CONFIG_USB_PEGASUS=m CONFIG_USB_RTL8150=m CONFIG_USB_RTL8152=m CONFIG_USB_LAN78XX=m CONFIG_USB_USBNET=y CONFIG_USB_NET_AX8817X=y CONFIG_USB_NET_AX88179_178A=y CONFIG_USB_NET_CDCETHER=y # CONFIG_USB_NET_CDC_EEM is not set CONFIG_USB_NET_CDC_NCM=y # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set CONFIG_USB_NET_DM9601=m CONFIG_USB_NET_SR9700=m CONFIG_USB_NET_SR9800=m CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=m # CONFIG_USB_NET_GL620A is not set CONFIG_USB_NET_NET1080=y CONFIG_USB_NET_PLUSB=m CONFIG_USB_NET_MCS7830=m # CONFIG_USB_NET_RNDIS_HOST is not set CONFIG_USB_NET_CDC_SUBSET_ENABLE=y CONFIG_USB_NET_CDC_SUBSET=y # CONFIG_USB_ALI_M5632 is not set # CONFIG_USB_AN2720 is not set CONFIG_USB_BELKIN=y CONFIG_USB_ARMLINUX=y # CONFIG_USB_EPSON2888 is not set # CONFIG_USB_KC2190 is not set CONFIG_USB_NET_ZAURUS=y # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set # CONFIG_USB_HSO is not set # CONFIG_USB_NET_INT51X1 is not set # CONFIG_USB_IPHETH is not set # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y # CONFIG_ADM8211 is not set CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set # CONFIG_ATH5K is not set # CONFIG_ATH5K_PCI is not set # CONFIG_ATH9K is not set # CONFIG_ATH9K_HTC is not set # CONFIG_CARL9170 is not set # CONFIG_ATH6KL is not set # CONFIG_AR5523 is not set # CONFIG_WIL6210 is not set # CONFIG_ATH10K is not set CONFIG_WCN36XX=y # CONFIG_WCN36XX_DEBUGFS is not set # CONFIG_ATH11K is not set CONFIG_WLAN_VENDOR_ATMEL=y CONFIG_ATMEL=y # CONFIG_PCI_ATMEL is not set CONFIG_AT76C50X_USB=y # CONFIG_WLAN_VENDOR_BROADCOM is not set # CONFIG_WLAN_VENDOR_CISCO is not set # CONFIG_WLAN_VENDOR_INTEL is not set # CONFIG_WLAN_VENDOR_INTERSIL is not set # CONFIG_WLAN_VENDOR_MARVELL is not set # CONFIG_WLAN_VENDOR_MEDIATEK is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set # CONFIG_WLAN_VENDOR_PURELIFI is not set # CONFIG_WLAN_VENDOR_RALINK is not set # CONFIG_WLAN_VENDOR_REALTEK is not set # CONFIG_WLAN_VENDOR_RSI is not set # CONFIG_WLAN_VENDOR_SILABS is not set # CONFIG_WLAN_VENDOR_ST is not set # CONFIG_WLAN_VENDOR_TI is not set # CONFIG_WLAN_VENDOR_ZYDAS is not set # CONFIG_WLAN_VENDOR_QUANTENNA is not set # CONFIG_MAC80211_HWSIM is not set # CONFIG_USB_NET_RNDIS_WLAN is not set # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set # CONFIG_IEEE802154_DRIVERS is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN CONFIG_XEN_NETDEV_FRONTEND=y # CONFIG_XEN_NETDEV_BACKEND is not set # CONFIG_VMXNET3 is not set # CONFIG_FUJITSU_ES is not set # CONFIG_NETDEVSIM is not set CONFIG_NET_FAILOVER=y # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y CONFIG_INPUT_MOUSEDEV_PSAUX=y CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=m CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADC is not set # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=y # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_PINEPHONE is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set # CONFIG_KEYBOARD_CYPRESS_SF is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y CONFIG_MOUSE_PS2_ALPS=y CONFIG_MOUSE_PS2_BYD=y CONFIG_MOUSE_PS2_LOGIPS2PP=y CONFIG_MOUSE_PS2_SYNAPTICS=y CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y CONFIG_MOUSE_PS2_CYPRESS=y CONFIG_MOUSE_PS2_TRACKPOINT=y # CONFIG_MOUSE_PS2_ELANTECH is not set # CONFIG_MOUSE_PS2_SENTELIC is not set # CONFIG_MOUSE_PS2_TOUCHKIT is not set CONFIG_MOUSE_PS2_FOCALTECH=y CONFIG_MOUSE_PS2_SMBUS=y # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set # CONFIG_MOUSE_CYAPA is not set # CONFIG_MOUSE_ELAN_I2C is not set # CONFIG_MOUSE_VSXXXAA is not set # CONFIG_MOUSE_GPIO is not set # CONFIG_MOUSE_SYNAPTICS_I2C is not set # CONFIG_MOUSE_SYNAPTICS_USB is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y # CONFIG_TOUCHSCREEN_ADS7846 is not set # CONFIG_TOUCHSCREEN_AD7877 is not set # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_ADC is not set # CONFIG_TOUCHSCREEN_AR1021_I2C is not set # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_BU21029 is not set # CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set # CONFIG_TOUCHSCREEN_CHIPONE_ICN8505 is not set # CONFIG_TOUCHSCREEN_CY8CTMA140 is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set # CONFIG_TOUCHSCREEN_EGALAX is not set # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set # CONFIG_TOUCHSCREEN_EXC3000 is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_HIDEEP is not set # CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_ILITEK is not set # CONFIG_TOUCHSCREEN_S6SY761 is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set # CONFIG_TOUCHSCREEN_ELAN is not set # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MSG2638 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_IMAGIS is not set # CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set # CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set CONFIG_TOUCHSCREEN_USB_COMPOSITE=m CONFIG_TOUCHSCREEN_USB_EGALAX=y CONFIG_TOUCHSCREEN_USB_PANJIT=y CONFIG_TOUCHSCREEN_USB_3M=y CONFIG_TOUCHSCREEN_USB_ITM=y CONFIG_TOUCHSCREEN_USB_ETURBO=y CONFIG_TOUCHSCREEN_USB_GUNZE=y CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y CONFIG_TOUCHSCREEN_USB_IRTOUCH=y CONFIG_TOUCHSCREEN_USB_IDEALTEK=y CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y CONFIG_TOUCHSCREEN_USB_GOTOP=y CONFIG_TOUCHSCREEN_USB_JASTEC=y CONFIG_TOUCHSCREEN_USB_ELO=y CONFIG_TOUCHSCREEN_USB_E2I=y CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y CONFIG_TOUCHSCREEN_USB_NEXIO=y CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2004 is not set # CONFIG_TOUCHSCREEN_TSC2005 is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_RM_TS is not set # CONFIG_TOUCHSCREEN_SILEAD is not set # CONFIG_TOUCHSCREEN_SIS_I2C is not set # CONFIG_TOUCHSCREEN_ST1232 is not set # CONFIG_TOUCHSCREEN_STMFTS is not set # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set # CONFIG_TOUCHSCREEN_SX8654 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZET6223 is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set # CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_IQS5XX is not set # CONFIG_TOUCHSCREEN_ZINITIX is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set CONFIG_INPUT_PM8941_PWRKEY=y # CONFIG_INPUT_PM8XXX_VIBRATOR is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set # CONFIG_INPUT_UINPUT is not set # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IBM_PANEL is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y # CONFIG_INPUT_SOC_BUTTON_ARRAY is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_RMI4_CORE is not set # # Hardware I/O ports # CONFIG_SERIO=y # CONFIG_SERIO_SERPORT is not set CONFIG_SERIO_AMBAKMI=y # CONFIG_SERIO_PCIPS2 is not set CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_SERIO_GPIO_PS2 is not set # CONFIG_USERIO is not set # CONFIG_GAMEPORT is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=16 CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y CONFIG_SERIAL_8250_PNP=y CONFIG_SERIAL_8250_16550A_VARIANTS=y # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_DMA=y CONFIG_SERIAL_8250_PCI=y CONFIG_SERIAL_8250_EXAR=y CONFIG_SERIAL_8250_NR_UARTS=4 CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set CONFIG_SERIAL_8250_DWLIB=y CONFIG_SERIAL_8250_FSL=y CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_PERICOM is not set CONFIG_SERIAL_OF_PLATFORM=y # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set CONFIG_SERIAL_MSM=y CONFIG_SERIAL_MSM_CONSOLE=y # CONFIG_SERIAL_SIFIVE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set CONFIG_SERIAL_XILINX_PS_UART=y CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_RP2 is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set CONFIG_HVC_DRIVER=y CONFIG_HVC_IRQ=y CONFIG_HVC_XEN=y CONFIG_HVC_XEN_FRONTEND=y # CONFIG_HVC_DCC is not set # CONFIG_RPMSG_TTY is not set # CONFIG_SERIAL_DEV_BUS is not set CONFIG_VIRTIO_CONSOLE=y # CONFIG_IPMI_HANDLER is not set # CONFIG_IPMB_DEVICE_INTERFACE is not set CONFIG_HW_RANDOM=m # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_BA431 is not set CONFIG_HW_RANDOM_VIRTIO=m # CONFIG_HW_RANDOM_CCTRNG is not set # CONFIG_HW_RANDOM_XIPHERA is not set CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=m # CONFIG_HW_RANDOM_CN10K is not set # CONFIG_APPLICOM is not set CONFIG_DEVMEM=y CONFIG_DEVPORT=y # CONFIG_TCG_TPM is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_ACPI_I2C_OPREGION=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_GPMUX is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set CONFIG_I2C_MUX_PCA954x=y # CONFIG_I2C_MUX_PINCTRL is not set # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_DEMUX_PINCTRL is not set # CONFIG_I2C_MUX_MLXCPLD is not set # end of Multiplexer I2C Chip support CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # PC SMBus host controller drivers # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_AMD_MP2 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_ISCH is not set # CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_NVIDIA_GPU is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # # ACPI drivers # # CONFIG_I2C_SCMI is not set # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CADENCE is not set # CONFIG_I2C_CBUS_GPIO is not set CONFIG_I2C_DESIGNWARE_CORE=y # CONFIG_I2C_DESIGNWARE_SLAVE is not set CONFIG_I2C_DESIGNWARE_PLATFORM=y # CONFIG_I2C_DESIGNWARE_PCI is not set # CONFIG_I2C_EMEV2 is not set # CONFIG_I2C_GPIO is not set # CONFIG_I2C_HISI is not set # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_QCOM_CCI is not set CONFIG_I2C_QUP=y # CONFIG_I2C_RK3X is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_THUNDERX is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_PCI1XXXX is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set CONFIG_I2C_SLAVE=y # CONFIG_I2C_SLAVE_EEPROM is not set # CONFIG_I2C_SLAVE_TESTUNIT is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y CONFIG_SPI_MEM=y # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set # CONFIG_SPI_BITBANG is not set # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_CADENCE_QUADSPI is not set # CONFIG_SPI_CADENCE_XSPI is not set # CONFIG_SPI_DESIGNWARE is not set # CONFIG_SPI_HISI_KUNPENG is not set # CONFIG_SPI_HISI_SFC_V3XX 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_MICROCHIP_CORE is not set # CONFIG_SPI_MICROCHIP_CORE_QSPI is not set # CONFIG_SPI_OC_TINY is not set CONFIG_SPI_PL022=y # CONFIG_SPI_PXA2XX is not set # CONFIG_SPI_ROCKCHIP is not set # CONFIG_SPI_QCOM_QSPI is not set CONFIG_SPI_QUP=y # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_SIFIVE is not set # CONFIG_SPI_MXIC is not set # CONFIG_SPI_THUNDERX is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_AMD is not set # # SPI Multiplexer support # # CONFIG_SPI_MUX is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=m # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set CONFIG_SPI_DYNAMIC=y CONFIG_SPMI=y # CONFIG_SPMI_HISI3670 is not set CONFIG_SPMI_MSM_PMIC_ARB=y # CONFIG_HSI is not set CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # # CONFIG_PTP_1588_CLOCK_KVM is not set # CONFIG_PTP_1588_CLOCK_IDT82P33 is not set # CONFIG_PTP_1588_CLOCK_IDTCM is not set # CONFIG_PTP_1588_CLOCK_OCP is not set # end of PTP clock support CONFIG_PINCTRL=y CONFIG_GENERIC_PINCTRL_GROUPS=y CONFIG_PINMUX=y CONFIG_GENERIC_PINMUX_FUNCTIONS=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_AMD is not set # CONFIG_PINCTRL_CY8C95X0 is not set CONFIG_PINCTRL_MAX77620=y # CONFIG_PINCTRL_MCP23S08 is not set # CONFIG_PINCTRL_MICROCHIP_SGPIO is not set # CONFIG_PINCTRL_OCELOT is not set CONFIG_PINCTRL_SINGLE=y # CONFIG_PINCTRL_STMFX is not set # CONFIG_PINCTRL_SX150X is not set CONFIG_PINCTRL_MSM=y CONFIG_PINCTRL_IPQ8074=y # CONFIG_PINCTRL_IPQ6018 is not set # CONFIG_PINCTRL_MDM9607 is not set CONFIG_PINCTRL_MSM8916=y # CONFIG_PINCTRL_MSM8953 is not set # CONFIG_PINCTRL_MSM8976 is not set CONFIG_PINCTRL_MSM8994=y CONFIG_PINCTRL_MSM8996=y # CONFIG_PINCTRL_MSM8998 is not set # CONFIG_PINCTRL_QCM2290 is not set # CONFIG_PINCTRL_QCS404 is not set CONFIG_PINCTRL_QDF2XXX=y CONFIG_PINCTRL_QCOM_SPMI_PMIC=y CONFIG_PINCTRL_QCOM_SSBI_PMIC=y # CONFIG_PINCTRL_SC7180 is not set # CONFIG_PINCTRL_SC7280 is not set # CONFIG_PINCTRL_SC8180X is not set # CONFIG_PINCTRL_SC8280XP is not set # CONFIG_PINCTRL_SDM660 is not set # CONFIG_PINCTRL_SDM845 is not set # CONFIG_PINCTRL_SM6115 is not set # CONFIG_PINCTRL_SM6125 is not set # CONFIG_PINCTRL_SM6350 is not set # CONFIG_PINCTRL_SM6375 is not set # CONFIG_PINCTRL_SM8150 is not set # CONFIG_PINCTRL_SM8250 is not set # CONFIG_PINCTRL_SM8350 is not set # CONFIG_PINCTRL_SM8450 is not set # CONFIG_PINCTRL_LPASS_LPI is not set # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y CONFIG_GPIO_ACPI=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_CDEV=y CONFIG_GPIO_CDEV_V1=y CONFIG_GPIO_GENERIC=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_AMDPT is not set # CONFIG_GPIO_CADENCE is not set CONFIG_GPIO_DWAPB=y # CONFIG_GPIO_EXAR is not set # CONFIG_GPIO_FTGPIO010 is not set CONFIG_GPIO_GENERIC_PLATFORM=y # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HISI is not set # CONFIG_GPIO_HLWD is not set # CONFIG_GPIO_LOGICVC is not set # CONFIG_GPIO_MB86S7X is not set CONFIG_GPIO_PL061=y # CONFIG_GPIO_SIFIVE is not set # CONFIG_GPIO_SYSCON is not set CONFIG_GPIO_XGENE=y # CONFIG_GPIO_XILINX is not set # CONFIG_GPIO_AMD_FCH is not set # end of Memory mapped GPIO drivers # # I2C GPIO expanders # # 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 CONFIG_GPIO_PCA953X_IRQ=y # CONFIG_GPIO_PCA9570 is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # CONFIG_GPIO_MAX77620=y # end of MFD GPIO expanders # # PCI GPIO expanders # # CONFIG_GPIO_BT8XX is not set # CONFIG_GPIO_PCI_IDIO_16 is not set # CONFIG_GPIO_PCIE_IDIO_24 is not set # CONFIG_GPIO_RDC321X is not set # end of PCI GPIO expanders # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # end of SPI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_VIRTIO is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers # CONFIG_W1 is not set CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_BRCMSTB is not set # CONFIG_POWER_RESET_GPIO is not set # CONFIG_POWER_RESET_GPIO_RESTART is not set CONFIG_POWER_RESET_MSM=y # CONFIG_POWER_RESET_QCOM_PON is not set # CONFIG_POWER_RESET_LTC2952 is not set CONFIG_POWER_RESET_REGULATOR=y # CONFIG_POWER_RESET_RESTART is not set CONFIG_POWER_RESET_VEXPRESS=y CONFIG_POWER_RESET_XGENE=y CONFIG_POWER_RESET_SYSCON=y # CONFIG_POWER_RESET_SYSCON_POWEROFF is not set # CONFIG_SYSCON_REBOOT_MODE is not set # CONFIG_NVMEM_REBOOT_MODE is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set CONFIG_BATTERY_BQ27XXX=y CONFIG_BATTERY_BQ27XXX_I2C=y # CONFIG_BATTERY_BQ27XXX_DT_UPDATES_NVM is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set # CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_QCOM_SMBB is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_UCS1002 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_OF=y # CONFIG_THERMAL_WRITABLE_TRIPS is not set CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set CONFIG_CPU_THERMAL=y CONFIG_CPU_FREQ_THERMAL=y # CONFIG_DEVFREQ_THERMAL is not set CONFIG_THERMAL_EMULATION=y # CONFIG_THERMAL_MMIO is not set # CONFIG_MAX77620_THERMAL is not set # CONFIG_GENERIC_ADC_THERMAL is not set # # Qualcomm thermal drivers # # CONFIG_QCOM_SPMI_ADC_TM5 is not set # CONFIG_QCOM_SPMI_TEMP_ALARM is not set CONFIG_QCOM_LMH=m # end of Qualcomm thermal drivers CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 # CONFIG_WATCHDOG_SYSFS is not set # CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_WDAT_WDT is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_ARM_SBSA_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_MAX77620_WATCHDOG is not set # CONFIG_QCOM_WDT is not set # CONFIG_ARM_SMC_WATCHDOG is not set # CONFIG_PM8916_WATCHDOG is not set # CONFIG_ALIM7101_WDT is not set # CONFIG_I6300ESB_WDT is not set # CONFIG_HP_WATCHDOG is not set # CONFIG_MEN_A21_WDT is not set # CONFIG_XEN_WDT is not set # # PCI-based Watchdog Cards # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y # CONFIG_SSB is not set CONFIG_BCMA_POSSIBLE=y # CONFIG_BCMA is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_GATEWORKS_GSC is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_MFD_HI6421_SPMI is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set CONFIG_MFD_MAX77620=y # CONFIG_MFD_MAX77650 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77714 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_OCELOT is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_CPCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_NTXEC is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_QCOM_RPM is not set CONFIG_MFD_SPMI_PMIC=y # CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_RK808 is not set # CONFIG_MFD_RN5T618 is not set CONFIG_MFD_SEC_CORE=y # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # 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_VX855 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 # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ROHM_BD718XX is not set # CONFIG_MFD_ROHM_BD71828 is not set # CONFIG_MFD_ROHM_BD957XMUF is not set # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_MFD_QCOM_PM8008 is not set CONFIG_MFD_VEXPRESS_SYSREG=y # CONFIG_MFD_INTEL_M10_BMC is not set # CONFIG_MFD_RSMU_I2C is not set # CONFIG_MFD_RSMU_SPI is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_DA9121 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set # CONFIG_REGULATOR_FAN53880 is not set CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set CONFIG_REGULATOR_MAX77620=y # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MAX20086 is not set # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MCP16502 is not set # CONFIG_REGULATOR_MP5416 is not set # CONFIG_REGULATOR_MP8859 is not set # CONFIG_REGULATOR_MP886X is not set # CONFIG_REGULATOR_MPQ7920 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_MT6315 is not set # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PF8X00 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set CONFIG_REGULATOR_PWM=y CONFIG_REGULATOR_QCOM_SMD_RPM=y CONFIG_REGULATOR_QCOM_SPMI=y # CONFIG_REGULATOR_QCOM_USB_VBUS is not set # CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set # CONFIG_REGULATOR_S2MPA01 is not set CONFIG_REGULATOR_S2MPS11=y # CONFIG_REGULATOR_S5M8767 is not set # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_SY8106A is not set # CONFIG_REGULATOR_SY8824X is not set # CONFIG_REGULATOR_SY8827N is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS6286X is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_VCTRL is not set # CONFIG_REGULATOR_VEXPRESS is not set # CONFIG_REGULATOR_VQMMC_IPQ4019 is not set # CONFIG_REGULATOR_QCOM_LABIBB is not set CONFIG_RC_CORE=y # CONFIG_LIRC is not set CONFIG_RC_MAP=y CONFIG_RC_DECODERS=y # CONFIG_IR_IMON_DECODER is not set CONFIG_IR_JVC_DECODER=y CONFIG_IR_MCE_KBD_DECODER=y CONFIG_IR_NEC_DECODER=y CONFIG_IR_RC5_DECODER=y CONFIG_IR_RC6_DECODER=y # CONFIG_IR_RCMM_DECODER is not set CONFIG_IR_SANYO_DECODER=y CONFIG_IR_SHARP_DECODER=y CONFIG_IR_SONY_DECODER=y CONFIG_IR_XMP_DECODER=y # CONFIG_RC_DEVICES is not set CONFIG_CEC_CORE=y # # CEC support # # CONFIG_MEDIA_CEC_RC is not set # CONFIG_MEDIA_CEC_SUPPORT is not set # end of CEC support CONFIG_MEDIA_SUPPORT=y CONFIG_MEDIA_SUPPORT_FILTER=y # CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y # CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set # CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set # CONFIG_MEDIA_RADIO_SUPPORT is not set # CONFIG_MEDIA_SDR_SUPPORT is not set # CONFIG_MEDIA_PLATFORM_SUPPORT is not set # CONFIG_MEDIA_TEST_SUPPORT is not set # end of Media device types CONFIG_VIDEO_DEV=y CONFIG_MEDIA_CONTROLLER=y # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set # end of Video4Linux options # # Media controller options # # end of Media controller options # # Media drivers # # # Drivers filtered as selected at 'Filter media drivers' # # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # CONFIG_USB_GSPCA=m CONFIG_USB_GSPCA_BENQ=m CONFIG_USB_GSPCA_CONEX=m CONFIG_USB_GSPCA_CPIA1=m CONFIG_USB_GSPCA_DTCS033=m CONFIG_USB_GSPCA_ETOMS=m CONFIG_USB_GSPCA_FINEPIX=m CONFIG_USB_GSPCA_JEILINJ=m CONFIG_USB_GSPCA_JL2005BCD=m CONFIG_USB_GSPCA_KINECT=m CONFIG_USB_GSPCA_KONICA=m CONFIG_USB_GSPCA_MARS=m CONFIG_USB_GSPCA_MR97310A=m CONFIG_USB_GSPCA_NW80X=m CONFIG_USB_GSPCA_OV519=m CONFIG_USB_GSPCA_OV534=m CONFIG_USB_GSPCA_OV534_9=m CONFIG_USB_GSPCA_PAC207=m CONFIG_USB_GSPCA_PAC7302=m CONFIG_USB_GSPCA_PAC7311=m CONFIG_USB_GSPCA_SE401=m CONFIG_USB_GSPCA_SN9C2028=m CONFIG_USB_GSPCA_SN9C20X=m CONFIG_USB_GSPCA_SONIXB=m CONFIG_USB_GSPCA_SONIXJ=m CONFIG_USB_GSPCA_SPCA1528=m CONFIG_USB_GSPCA_SPCA500=m CONFIG_USB_GSPCA_SPCA501=m CONFIG_USB_GSPCA_SPCA505=m CONFIG_USB_GSPCA_SPCA506=m CONFIG_USB_GSPCA_SPCA508=m CONFIG_USB_GSPCA_SPCA561=m CONFIG_USB_GSPCA_SQ905=m CONFIG_USB_GSPCA_SQ905C=m CONFIG_USB_GSPCA_SQ930X=m CONFIG_USB_GSPCA_STK014=m CONFIG_USB_GSPCA_STK1135=m CONFIG_USB_GSPCA_STV0680=m CONFIG_USB_GSPCA_SUNPLUS=m CONFIG_USB_GSPCA_T613=m CONFIG_USB_GSPCA_TOPRO=m CONFIG_USB_GSPCA_TOUPTEK=m CONFIG_USB_GSPCA_TV8532=m CONFIG_USB_GSPCA_VC032X=m CONFIG_USB_GSPCA_VICAM=m CONFIG_USB_GSPCA_XIRLINK_CIT=m CONFIG_USB_GSPCA_ZC3XX=m CONFIG_USB_GL860=m CONFIG_USB_M5602=m CONFIG_USB_STV06XX=m CONFIG_USB_PWC=m # CONFIG_USB_PWC_DEBUG is not set CONFIG_USB_PWC_INPUT_EVDEV=y CONFIG_USB_S2255=m # CONFIG_VIDEO_USBTV is not set CONFIG_USB_VIDEO_CLASS=m CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y # # Webcam, TV (analog/digital) USB devices # # CONFIG_VIDEO_EM28XX is not set # CONFIG_MEDIA_PCI_SUPPORT is not set CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_VMALLOC=m # end of Media drivers # # Media ancillary drivers # CONFIG_VIDEO_IR_I2C=y # # Camera sensor devices # # CONFIG_VIDEO_AR0521 is not set # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_HI846 is not set # CONFIG_VIDEO_HI847 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_IMX412 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set # CONFIG_VIDEO_MT9V011 is not set # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set # CONFIG_VIDEO_OV2640 is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV2740 is not set # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5693 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV7251 is not set # CONFIG_VIDEO_OV7640 is not set # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9282 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_OV9734 is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_M5MOLS is not set # end of Camera sensor devices # # Lens drivers # # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # Audio decoders, processors and mixers # # CONFIG_VIDEO_CS3308 is not set # CONFIG_VIDEO_CS5345 is not set # CONFIG_VIDEO_CS53L32A is not set # CONFIG_VIDEO_MSP3400 is not set # CONFIG_VIDEO_SONY_BTF_MPX is not set # CONFIG_VIDEO_TDA1997X is not set # CONFIG_VIDEO_TDA7432 is not set # CONFIG_VIDEO_TDA9840 is not set # CONFIG_VIDEO_TEA6415C is not set # CONFIG_VIDEO_TEA6420 is not set # CONFIG_VIDEO_TLV320AIC23B is not set # CONFIG_VIDEO_TVAUDIO is not set # CONFIG_VIDEO_UDA1342 is not set # CONFIG_VIDEO_VP27SMPX is not set # CONFIG_VIDEO_WM8739 is not set # CONFIG_VIDEO_WM8775 is not set # end of Audio decoders, processors and mixers # # RDS decoders # # CONFIG_VIDEO_SAA6588 is not set # end of RDS decoders # # Video decoders # # CONFIG_VIDEO_ADV7180 is not set # CONFIG_VIDEO_ADV7183 is not set # CONFIG_VIDEO_ADV748X is not set # CONFIG_VIDEO_ADV7604 is not set # CONFIG_VIDEO_ADV7842 is not set # CONFIG_VIDEO_BT819 is not set # CONFIG_VIDEO_BT856 is not set # CONFIG_VIDEO_BT866 is not set # CONFIG_VIDEO_ISL7998X is not set # CONFIG_VIDEO_KS0127 is not set # CONFIG_VIDEO_MAX9286 is not set # CONFIG_VIDEO_ML86V7667 is not set # CONFIG_VIDEO_SAA7110 is not set # CONFIG_VIDEO_SAA711X is not set # CONFIG_VIDEO_TC358743 is not set # CONFIG_VIDEO_TVP514X is not set # CONFIG_VIDEO_TVP5150 is not set # CONFIG_VIDEO_TVP7002 is not set # CONFIG_VIDEO_TW2804 is not set # CONFIG_VIDEO_TW9903 is not set # CONFIG_VIDEO_TW9906 is not set # CONFIG_VIDEO_TW9910 is not set # CONFIG_VIDEO_VPX3220 is not set # # Video and audio decoders # # CONFIG_VIDEO_SAA717X is not set # CONFIG_VIDEO_CX25840 is not set # end of Video decoders # # Video encoders # # CONFIG_VIDEO_AD9389B is not set # CONFIG_VIDEO_ADV7170 is not set # CONFIG_VIDEO_ADV7175 is not set # CONFIG_VIDEO_ADV7343 is not set # CONFIG_VIDEO_ADV7393 is not set # CONFIG_VIDEO_AK881X is not set # CONFIG_VIDEO_SAA7127 is not set # CONFIG_VIDEO_SAA7185 is not set # CONFIG_VIDEO_THS8200 is not set # end of Video encoders # # Video improvement chips # # CONFIG_VIDEO_UPD64031A is not set # CONFIG_VIDEO_UPD64083 is not set # end of Video improvement chips # # Audio/Video compression chips # # CONFIG_VIDEO_SAA6752HS is not set # end of Audio/Video compression chips # # SDR tuner chips # # end of SDR tuner chips # # Miscellaneous helper chips # # CONFIG_VIDEO_I2C is not set # CONFIG_VIDEO_M52790 is not set # CONFIG_VIDEO_ST_MIPID02 is not set # CONFIG_VIDEO_THS7303 is not set # end of Miscellaneous helper chips # # Media SPI Adapters # # CONFIG_VIDEO_GS1662 is not set # end of Media SPI Adapters # end of Media ancillary drivers # # Graphics support # CONFIG_DRM=y CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DEBUG_MM is not set CONFIG_DRM_USE_DYNAMIC_DEBUG=y CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_DP_AUX_BUS=y CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_DISPLAY_DP_HELPER=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_SCHED=y # # I2C encoder or helper chips # 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 # end of I2C encoder or helper chips # # ARM devices # # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_KOMEDA is not set # end of ARM devices # CONFIG_DRM_RADEON is not set # CONFIG_DRM_AMDGPU is not set # CONFIG_DRM_NOUVEAU is not set # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set # CONFIG_DRM_VMWGFX is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_AST is not set # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_USE_LVDS is not set # CONFIG_DRM_RCAR_USE_MIPI_DSI is not set # CONFIG_DRM_QXL is not set # CONFIG_DRM_VIRTIO_GPU is not set CONFIG_DRM_MSM=y CONFIG_DRM_MSM_GPU_STATE=y CONFIG_DRM_MSM_MDSS=y # CONFIG_DRM_MSM_MDP4 is not set CONFIG_DRM_MSM_MDP5=y # CONFIG_DRM_MSM_DPU is not set CONFIG_DRM_MSM_DP=y CONFIG_DRM_MSM_DSI=y CONFIG_DRM_MSM_DSI_28NM_PHY=y CONFIG_DRM_MSM_DSI_20NM_PHY=y CONFIG_DRM_MSM_DSI_28NM_8960_PHY=y CONFIG_DRM_MSM_DSI_14NM_PHY=y CONFIG_DRM_MSM_DSI_10NM_PHY=y CONFIG_DRM_MSM_DSI_7NM_PHY=y CONFIG_DRM_MSM_HDMI=y # CONFIG_DRM_MSM_HDMI_HDCP is not set CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_ABT_Y030XX067A is not set # CONFIG_DRM_PANEL_ARM_VERSATILE is not set # CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set # CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set # CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set # CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set # CONFIG_DRM_PANEL_DSI_CM is not set # CONFIG_DRM_PANEL_LVDS is not set CONFIG_DRM_PANEL_SIMPLE=y CONFIG_DRM_PANEL_EDP=y # CONFIG_DRM_PANEL_EBBG_FT8719 is not set # CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set # CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set # CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set # CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set # CONFIG_DRM_PANEL_JDI_R63452 is not set # CONFIG_DRM_PANEL_KHADAS_TS050 is not set # CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set # CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set # CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LB035Q02 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set # CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set # CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set # CONFIG_DRM_PANEL_NOVATEK_NT35560 is not set # CONFIG_DRM_PANEL_NOVATEK_NT35950 is not set # CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set # CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set # CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set # CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set # CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set # CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set # CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set # CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set # CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set # CONFIG_DRM_PANEL_RONBO_RB070D30 is not set # CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set # CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set # CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set # CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set # CONFIG_DRM_PANEL_SHARP_LS060T1SX01 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set # CONFIG_DRM_PANEL_SONY_ACX565AKM is not set # CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 is not set # CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set # CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set # CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set # CONFIG_DRM_PANEL_TPO_TPG110 is not set # CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set # CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set # CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set # CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set # CONFIG_DRM_LONTIUM_LT9611 is not set # CONFIG_DRM_LONTIUM_LT9611UXC is not set # CONFIG_DRM_ITE_IT66121 is not set # CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NWL_MIPI_DSI is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_PARADE_PS8640 is not set # CONFIG_DRM_SIL_SII8620 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_SII9234 is not set # CONFIG_DRM_SIMPLE_BRIDGE is not set # CONFIG_DRM_THINE_THC63LVD1024 is not set # CONFIG_DRM_TOSHIBA_TC358762 is not set # CONFIG_DRM_TOSHIBA_TC358764 is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TOSHIBA_TC358768 is not set # CONFIG_DRM_TOSHIBA_TC358775 is not set # CONFIG_DRM_TI_DLPC3433 is not set # CONFIG_DRM_TI_TFP410 is not set # CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_ANALOGIX_ANX7625 is not set CONFIG_DRM_I2C_ADV7511=y CONFIG_DRM_I2C_ADV7511_AUDIO=y CONFIG_DRM_I2C_ADV7511_CEC=y # CONFIG_DRM_CDNS_MHDP8546 is not set # end of Display Interface Bridges # CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_HISI_HIBMC is not set # CONFIG_DRM_HISI_KIRIN is not set # CONFIG_DRM_LOGICVC is not set # CONFIG_DRM_MXSFB is not set # CONFIG_DRM_IMX_LCDIF is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_BOCHS is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_PANEL_MIPI_DBI is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9163 is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set # CONFIG_TINYDRM_ILI9486 is not set # CONFIG_TINYDRM_MI0283QT is not set # CONFIG_TINYDRM_REPAPER is not set # CONFIG_TINYDRM_ST7586 is not set # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_XEN_FRONTEND is not set # CONFIG_DRM_LIMA is not set # CONFIG_DRM_PANFROST is not set # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_DRM_NOMODESET=y # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set CONFIG_FB_ARMCLCD=y # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_EFI is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_I740 is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_S3 is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VT8623 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_ARK is not set # CONFIG_FB_PM3 is not set # CONFIG_FB_CARMINE is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set CONFIG_XEN_FBDEV_FRONTEND=y # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # CONFIG_FB_SM712 is not set # end of Frame buffer Devices # # Backlight & LCD device support # # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_KTD253 is not set # CONFIG_BACKLIGHT_PWM is not set # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # CONFIG_BACKLIGHT_LED is not set # end of Backlight & LCD device support CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support # CONFIG_LOGO is not set # end of Graphics support CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_HWDEP=y CONFIG_SND_RAWMIDI=y CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y # CONFIG_SND_HRTIMER is not set # CONFIG_SND_DYNAMIC_MINORS is not set CONFIG_SND_SUPPORT_OLD_API=y CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_CTL_INPUT_VALIDATION is not set # CONFIG_SND_SEQUENCER is not set CONFIG_SND_DRIVERS=y # CONFIG_SND_DUMMY is not set # CONFIG_SND_ALOOP is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_MPU401 is not set CONFIG_SND_PCI=y # CONFIG_SND_AD1889 is not set # CONFIG_SND_ALS300 is not set # CONFIG_SND_ALI5451 is not set # CONFIG_SND_ATIIXP is not set # CONFIG_SND_ATIIXP_MODEM is not set # CONFIG_SND_AU8810 is not set # CONFIG_SND_AU8820 is not set # CONFIG_SND_AU8830 is not set # CONFIG_SND_AW2 is not set # CONFIG_SND_AZT3328 is not set # CONFIG_SND_BT87X is not set # CONFIG_SND_CA0106 is not set # CONFIG_SND_CMIPCI is not set # CONFIG_SND_OXYGEN is not set # CONFIG_SND_CS4281 is not set # CONFIG_SND_CS46XX is not set # CONFIG_SND_CTXFI is not set # CONFIG_SND_DARLA20 is not set # CONFIG_SND_GINA20 is not set # CONFIG_SND_LAYLA20 is not set # CONFIG_SND_DARLA24 is not set # CONFIG_SND_GINA24 is not set # CONFIG_SND_LAYLA24 is not set # CONFIG_SND_MONA is not set # CONFIG_SND_MIA is not set # CONFIG_SND_ECHO3G is not set # CONFIG_SND_INDIGO is not set # CONFIG_SND_INDIGOIO is not set # CONFIG_SND_INDIGODJ is not set # CONFIG_SND_INDIGOIOX is not set # CONFIG_SND_INDIGODJX is not set # CONFIG_SND_EMU10K1 is not set # CONFIG_SND_EMU10K1X is not set # CONFIG_SND_ENS1370 is not set # CONFIG_SND_ENS1371 is not set # CONFIG_SND_ES1938 is not set # CONFIG_SND_ES1968 is not set # CONFIG_SND_FM801 is not set # CONFIG_SND_HDSP is not set # CONFIG_SND_HDSPM is not set # CONFIG_SND_ICE1712 is not set # CONFIG_SND_ICE1724 is not set # CONFIG_SND_INTEL8X0 is not set # CONFIG_SND_INTEL8X0M is not set # CONFIG_SND_KORG1212 is not set # CONFIG_SND_LOLA is not set # CONFIG_SND_LX6464ES is not set # CONFIG_SND_MAESTRO3 is not set # CONFIG_SND_MIXART is not set # CONFIG_SND_NM256 is not set # CONFIG_SND_PCXHR is not set # CONFIG_SND_RIPTIDE is not set # CONFIG_SND_RME32 is not set # CONFIG_SND_RME96 is not set # CONFIG_SND_RME9652 is not set # CONFIG_SND_SE6X is not set # CONFIG_SND_SONICVIBES is not set # CONFIG_SND_TRIDENT is not set # CONFIG_SND_VIA82XX is not set # CONFIG_SND_VIA82XX_MODEM is not set # CONFIG_SND_VIRTUOSO is not set # CONFIG_SND_VX222 is not set # CONFIG_SND_YMFPCI is not set # # HD-Audio # # CONFIG_SND_HDA_INTEL is not set # end of HD-Audio CONFIG_SND_HDA_PREALLOC_SIZE=64 CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y # CONFIG_SND_USB_UA101 is not set # CONFIG_SND_USB_CAIAQ is not set # CONFIG_SND_USB_6FIRE is not set # CONFIG_SND_USB_HIFACE is not set # CONFIG_SND_BCD2000 is not set # CONFIG_SND_USB_POD is not set # CONFIG_SND_USB_PODHD is not set # CONFIG_SND_USB_TONEPORT is not set # CONFIG_SND_USB_VARIAX is not set CONFIG_SND_SOC=y # CONFIG_SND_SOC_ADI is not set # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_AMD_ACP_CONFIG is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # CONFIG_SND_SOC_FSL_AUDMIX is not set # 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_FSL_XCVR is not set # CONFIG_SND_SOC_FSL_RPMSG is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # end of SoC Audio for Freescale CPUs # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_MTK_BTCVSD is not set CONFIG_SND_SOC_QCOM=y CONFIG_SND_SOC_LPASS_CPU=y CONFIG_SND_SOC_LPASS_PLATFORM=y CONFIG_SND_SOC_LPASS_APQ8016=y # CONFIG_SND_SOC_STORM is not set CONFIG_SND_SOC_APQ8016_SBC=y CONFIG_SND_SOC_QCOM_COMMON=y # CONFIG_SND_SOC_SC7180 is not set # CONFIG_SND_SOC_SOF_TOPLEVEL is not set # # STMicroelectronics STM32 SOC audio support # # end of 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_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1372_SPI is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set # CONFIG_SND_SOC_ADAU7002 is not set # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4375 is not set # CONFIG_SND_SOC_AK4458 is not set # CONFIG_SND_SOC_AK4554 is not set CONFIG_SND_SOC_AK4613=y # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # 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_CS35L41_SPI is not set # CONFIG_SND_SOC_CS35L41_I2C is not set # CONFIG_SND_SOC_CS35L45_SPI is not set # CONFIG_SND_SOC_CS35L45_I2C 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS42L83 is not set # CONFIG_SND_SOC_CS4234 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # 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_CX2072X is not set # CONFIG_SND_SOC_DA7213 is not set # CONFIG_SND_SOC_DMIC is not set CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_ES7134 is not set # CONFIG_SND_SOC_ES7241 is not set # CONFIG_SND_SOC_ES8316 is not set # CONFIG_SND_SOC_ES8326 is not set # CONFIG_SND_SOC_ES8328_I2C is not set # CONFIG_SND_SOC_ES8328_SPI is not set # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_HDA is not set # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set # CONFIG_SND_SOC_MAX98088 is not set # CONFIG_SND_SOC_MAX98357A is not set # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98520 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX98396 is not set # CONFIG_SND_SOC_MAX9860 is not set CONFIG_SND_SOC_MSM8916_WCD_ANALOG=y CONFIG_SND_SOC_MSM8916_WCD_DIGITAL=y # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set # CONFIG_SND_SOC_PCM186X_I2C is not set # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set # CONFIG_SND_SOC_PCM5102A 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_RT5640 is not set # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_RT9120 is not set # CONFIG_SND_SOC_SGTL5000 is not set # CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set # CONFIG_SND_SOC_SIMPLE_MUX is not set # CONFIG_SND_SOC_SPDIF is not set # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS2780 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805M is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320ADC3XXX is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set # CONFIG_SND_SOC_TLV320AIC3X_I2C is not set # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731_I2C is not set # CONFIG_SND_SOC_WM8731_SPI is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set # 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_WM8940 is not set # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set # CONFIG_SND_SOC_ZL38060 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_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8821 is not set # CONFIG_SND_SOC_NAU8822 is not set # CONFIG_SND_SOC_NAU8824 is not set # CONFIG_SND_SOC_TPA6130A2 is not set # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set # end of CODEC drivers CONFIG_SND_SIMPLE_CARD_UTILS=y CONFIG_SND_SIMPLE_CARD=y # CONFIG_SND_AUDIO_GRAPH_CARD is not set # CONFIG_SND_AUDIO_GRAPH_CARD2 is not set # CONFIG_SND_TEST_COMPONENT is not set # CONFIG_SND_XEN_FRONTEND is not set # CONFIG_SND_VIRTIO is not set # # HID support # CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set # CONFIG_HIDRAW is not set # CONFIG_UHID is not set CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set # CONFIG_HID_ASUS is not set # CONFIG_HID_AUREAL is not set CONFIG_HID_BELKIN=y # CONFIG_HID_BETOP_FF is not set # CONFIG_HID_BIGBEN_FF is not set CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CREATIVE_SB0540 is not set CONFIG_HID_CYPRESS=y # CONFIG_HID_DRAGONRISE is not set # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_GLORIOUS is not set # CONFIG_HID_HOLTEK is not set # CONFIG_HID_VIVALDI 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_VRC2 is not set # CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set CONFIG_HID_ITE=y # CONFIG_HID_JABRA is not set # CONFIG_HID_TWINHAN is not set CONFIG_HID_KENSINGTON=y # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LED is not set # CONFIG_HID_LENOVO is not set # CONFIG_HID_LETSKETCH is not set CONFIG_HID_LOGITECH=m # CONFIG_HID_LOGITECH_HIDPP is not set # CONFIG_LOGITECH_FF is not set # CONFIG_LOGIRUMBLEPAD2_FF is not set # CONFIG_LOGIG940_FF is not set # CONFIG_LOGIWHEELS_FF is not set CONFIG_HID_MAGICMOUSE=m # CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set # CONFIG_HID_MEGAWORLD_FF is not set CONFIG_HID_REDRAGON=y CONFIG_HID_MICROSOFT=m CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=m CONFIG_HID_NINTENDO=m CONFIG_NINTENDO_FF=y # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set # CONFIG_HID_ORTEK is not set CONFIG_HID_OUYA=y # CONFIG_HID_PANTHERLORD is not set # CONFIG_HID_PENMOUNT is not set # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set CONFIG_HID_PLANTRONICS=m # CONFIG_HID_PXRC is not set # CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set # CONFIG_HID_SEMITEK is not set # CONFIG_HID_SIGMAMICRO is not set CONFIG_HID_SONY=y CONFIG_SONY_FF=y # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set # CONFIG_HID_SUNPLUS is not set # CONFIG_HID_RMI is not set # CONFIG_HID_GREENASIA is not set # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set # CONFIG_HID_TOPRE is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set # CONFIG_HID_WIIMOTE is not set # CONFIG_HID_XINMO is not set # CONFIG_HID_ZEROPLUS is not set # CONFIG_HID_ZYDACRON is not set # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set # CONFIG_USB_HIDDEV is not set # end of USB HID support # # I2C HID support # # CONFIG_I2C_HID_ACPI is not set # CONFIG_I2C_HID_OF is not set # CONFIG_I2C_HID_OF_ELAN is not set # CONFIG_I2C_HID_OF_GOODIX is not set # end of I2C HID support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y # CONFIG_USB_LED_TRIG is not set CONFIG_USB_ULPI_BUS=y # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_PCI=y # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_OTG=y # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_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 # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y # CONFIG_USB_XHCI_DBGCAP is not set CONFIG_USB_XHCI_PCI=y # CONFIG_USB_XHCI_PCI_RENESAS is not set 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_PCI=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 # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD_PCI=y CONFIG_USB_OHCI_HCD_PLATFORM=y # CONFIG_USB_UHCI_HCD is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_TEST_MODE is not set # CONFIG_USB_XEN_HCD is not set # # USB Device Class drivers # # CONFIG_USB_ACM is not set # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set # CONFIG_USB_UAS is not set # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set CONFIG_USB_DWC3=y # CONFIG_USB_DWC3_ULPI is not set # CONFIG_USB_DWC3_HOST is not set # CONFIG_USB_DWC3_GADGET is not set CONFIG_USB_DWC3_DUAL_ROLE=y # # Platform Glue Driver Support # CONFIG_USB_DWC3_PCI=y CONFIG_USB_DWC3_HAPS=y CONFIG_USB_DWC3_OF_SIMPLE=y CONFIG_USB_DWC3_QCOM=y CONFIG_USB_DWC2=y # CONFIG_USB_DWC2_HOST is not set # # Gadget/Dual-role mode requires USB Gadget support to be enabled # # CONFIG_USB_DWC2_PERIPHERAL is not set CONFIG_USB_DWC2_DUAL_ROLE=y # CONFIG_USB_DWC2_PCI is not set # CONFIG_USB_DWC2_DEBUG is not set # CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set CONFIG_USB_CHIPIDEA=y CONFIG_USB_CHIPIDEA_UDC=y CONFIG_USB_CHIPIDEA_HOST=y CONFIG_USB_CHIPIDEA_MSM=y CONFIG_USB_CHIPIDEA_IMX=y CONFIG_USB_CHIPIDEA_GENERIC=y CONFIG_USB_CHIPIDEA_TEGRA=y CONFIG_USB_ISP1760=y CONFIG_USB_ISP1760_HCD=y CONFIG_USB_ISP1761_UDC=y # CONFIG_USB_ISP1760_HOST_ROLE is not set # CONFIG_USB_ISP1760_GADGET_ROLE is not set CONFIG_USB_ISP1760_DUAL_ROLE=y # # USB port drivers # CONFIG_USB_SERIAL=y CONFIG_USB_SERIAL_CONSOLE=y CONFIG_USB_SERIAL_GENERIC=y CONFIG_USB_SERIAL_SIMPLE=m CONFIG_USB_SERIAL_AIRCABLE=m CONFIG_USB_SERIAL_ARK3116=m CONFIG_USB_SERIAL_BELKIN=m CONFIG_USB_SERIAL_CH341=m CONFIG_USB_SERIAL_WHITEHEAT=m CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m CONFIG_USB_SERIAL_CP210X=m CONFIG_USB_SERIAL_CYPRESS_M8=m CONFIG_USB_SERIAL_EMPEG=m CONFIG_USB_SERIAL_FTDI_SIO=m CONFIG_USB_SERIAL_VISOR=m CONFIG_USB_SERIAL_IPAQ=m CONFIG_USB_SERIAL_IR=m CONFIG_USB_SERIAL_EDGEPORT=m CONFIG_USB_SERIAL_EDGEPORT_TI=m CONFIG_USB_SERIAL_F81232=m # CONFIG_USB_SERIAL_F8153X is not set CONFIG_USB_SERIAL_GARMIN=m CONFIG_USB_SERIAL_IPW=m CONFIG_USB_SERIAL_IUU=m CONFIG_USB_SERIAL_KEYSPAN_PDA=m # CONFIG_USB_SERIAL_KEYSPAN is not set CONFIG_USB_SERIAL_KLSI=m CONFIG_USB_SERIAL_KOBIL_SCT=m CONFIG_USB_SERIAL_MCT_U232=m CONFIG_USB_SERIAL_METRO=m CONFIG_USB_SERIAL_MOS7720=m CONFIG_USB_SERIAL_MOS7840=m CONFIG_USB_SERIAL_MXUPORT=m CONFIG_USB_SERIAL_NAVMAN=m CONFIG_USB_SERIAL_PL2303=m CONFIG_USB_SERIAL_OTI6858=m CONFIG_USB_SERIAL_QCAUX=m CONFIG_USB_SERIAL_QUALCOMM=m CONFIG_USB_SERIAL_SPCP8X5=m CONFIG_USB_SERIAL_SAFE=m # CONFIG_USB_SERIAL_SAFE_PADDED is not set CONFIG_USB_SERIAL_SIERRAWIRELESS=m CONFIG_USB_SERIAL_SYMBOL=m CONFIG_USB_SERIAL_TI=m CONFIG_USB_SERIAL_CYBERJACK=m CONFIG_USB_SERIAL_WWAN=m CONFIG_USB_SERIAL_OPTION=m CONFIG_USB_SERIAL_OMNINET=m CONFIG_USB_SERIAL_OPTICON=m CONFIG_USB_SERIAL_XSENS_MT=m CONFIG_USB_SERIAL_WISHBONE=m CONFIG_USB_SERIAL_SSU100=m CONFIG_USB_SERIAL_QT2=m # CONFIG_USB_SERIAL_UPD78F0730 is not set # CONFIG_USB_SERIAL_XR is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_USB_QCOM_EUD is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set CONFIG_USB_EZUSB_FX2=m # CONFIG_USB_HUB_USB251XB is not set CONFIG_USB_HSIC_USB3503=y # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # CONFIG_USB_ONBOARD_HUB is not set # # USB Physical Layer drivers # # CONFIG_NOP_USB_XCEIV is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set CONFIG_USB_ULPI=y CONFIG_USB_ULPI_VIEWPORT=y # end of USB Physical Layer drivers CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GADGET_DEBUG_FILES is not set # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=500 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # CONFIG_U_SERIAL_CONSOLE is not set # # USB Peripheral Controller # # CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set CONFIG_USB_SNP_CORE=y CONFIG_USB_SNP_UDC_PLAT=y # CONFIG_USB_M66592 is not set # CONFIG_USB_BDC_UDC is not set # CONFIG_USB_AMD5536UDC is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_NET2280 is not set # CONFIG_USB_GOKU is not set # CONFIG_USB_EG20T is not set # CONFIG_USB_GADGET_XILINX is not set # CONFIG_USB_MAX3420_UDC is not set # CONFIG_USB_DUMMY_HCD is not set # end of USB Peripheral Controller CONFIG_USB_LIBCOMPOSITE=m CONFIG_USB_F_ACM=m CONFIG_USB_F_SS_LB=m CONFIG_USB_U_SERIAL=m CONFIG_USB_U_ETHER=m CONFIG_USB_F_SERIAL=m CONFIG_USB_F_OBEX=m CONFIG_USB_F_ECM=m CONFIG_USB_F_SUBSET=m CONFIG_USB_F_RNDIS=m CONFIG_USB_F_MASS_STORAGE=m CONFIG_USB_CONFIGFS=m # CONFIG_USB_CONFIGFS_SERIAL is not set # CONFIG_USB_CONFIGFS_ACM is not set # CONFIG_USB_CONFIGFS_OBEX is not set # CONFIG_USB_CONFIGFS_NCM is not set # CONFIG_USB_CONFIGFS_ECM is not set # CONFIG_USB_CONFIGFS_ECM_SUBSET is not set # CONFIG_USB_CONFIGFS_RNDIS is not set # CONFIG_USB_CONFIGFS_EEM is not set # CONFIG_USB_CONFIGFS_MASS_STORAGE is not set # CONFIG_USB_CONFIGFS_F_LB_SS is not set # CONFIG_USB_CONFIGFS_F_FS is not set # CONFIG_USB_CONFIGFS_F_UAC1 is not set # CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set # CONFIG_USB_CONFIGFS_F_UAC2 is not set # CONFIG_USB_CONFIGFS_F_MIDI is not set # CONFIG_USB_CONFIGFS_F_HID is not set # CONFIG_USB_CONFIGFS_F_UVC is not set # CONFIG_USB_CONFIGFS_F_PRINTER is not set # # USB Gadget precomposed configurations # CONFIG_USB_ZERO=m # CONFIG_USB_ZERO_HNPTEST is not set # CONFIG_USB_AUDIO is not set CONFIG_USB_ETH=m CONFIG_USB_ETH_RNDIS=y # CONFIG_USB_ETH_EEM is not set # CONFIG_USB_G_NCM is not set # CONFIG_USB_GADGETFS is not set # CONFIG_USB_FUNCTIONFS is not set CONFIG_USB_MASS_STORAGE=m CONFIG_USB_G_SERIAL=m # CONFIG_USB_MIDI_GADGET is not set # CONFIG_USB_G_PRINTER is not set # CONFIG_USB_CDC_COMPOSITE is not set # CONFIG_USB_G_ACM_MS is not set # CONFIG_USB_G_MULTI is not set # CONFIG_USB_G_HID is not set # CONFIG_USB_G_DBGP is not set # CONFIG_USB_G_WEBCAM is not set # CONFIG_USB_RAW_GADGET is not set # end of USB Gadget precomposed configurations # CONFIG_TYPEC is not set CONFIG_USB_ROLE_SWITCH=y CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y CONFIG_PWRSEQ_SIMPLE=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_DEBUG is not set CONFIG_MMC_ARMMMCI=y CONFIG_MMC_QCOM_DML=y CONFIG_MMC_STM32_SDMMC=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_IO_ACCESSORS=y # CONFIG_MMC_SDHCI_PCI is not set CONFIG_MMC_SDHCI_ACPI=y CONFIG_MMC_SDHCI_PLTFM=y # CONFIG_MMC_SDHCI_OF_ARASAN is not set # CONFIG_MMC_SDHCI_OF_AT91 is not set # CONFIG_MMC_SDHCI_OF_DWCMSHC is not set # CONFIG_MMC_SDHCI_CADENCE is not set # CONFIG_MMC_SDHCI_F_SDH30 is not set # CONFIG_MMC_SDHCI_MILBEAUT is not set CONFIG_MMC_SDHCI_MSM=y # CONFIG_MMC_TIFM_SD is not set CONFIG_MMC_SPI=y # CONFIG_MMC_CB710 is not set # CONFIG_MMC_VIA_SDMMC is not set CONFIG_MMC_DW=y CONFIG_MMC_DW_PLTFM=y # CONFIG_MMC_DW_BLUEFIELD is not set CONFIG_MMC_DW_EXYNOS=y # CONFIG_MMC_DW_HI3798CV200 is not set CONFIG_MMC_DW_K3=y # CONFIG_MMC_DW_PCI is not set # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_CQHCI=y # CONFIG_MMC_HSQ is not set # CONFIG_MMC_TOSHIBA_PCI is not set # CONFIG_MMC_MTK is not set # CONFIG_MMC_SDHCI_XENON is not set # CONFIG_MMC_SDHCI_OMAP is not set # CONFIG_MMC_SDHCI_AM654 is not set CONFIG_SCSI_UFSHCD=y # CONFIG_SCSI_UFS_BSG is not set # CONFIG_SCSI_UFS_HPB is not set CONFIG_SCSI_UFSHCD_PCI=y # CONFIG_SCSI_UFS_DWC_TC_PCI is not set CONFIG_SCSI_UFSHCD_PLATFORM=y # CONFIG_SCSI_UFS_CDNS_PLATFORM is not set # CONFIG_SCSI_UFS_DWC_TC_PLATFORM is not set CONFIG_SCSI_UFS_QCOM=y # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y # CONFIG_LEDS_CLASS_FLASH is not set # CONFIG_LEDS_CLASS_MULTICOLOR is not set # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_AW2013 is not set # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_EL15203000 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP50XX is not set # CONFIG_LEDS_LP55XX_COMMON is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set # CONFIG_LEDS_PWM is not set # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set CONFIG_LEDS_SYSCON=y # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_SPI_BYTE is not set # CONFIG_LEDS_TI_LMU_COMMON is not set # # Flash and Torch LED drivers # # # RGB LED drivers # # # LED Triggers # CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y # CONFIG_LEDS_TRIGGER_DISK is not set # CONFIG_LEDS_TRIGGER_MTD is not set CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_BACKLIGHT=y CONFIG_LEDS_TRIGGER_CPU=y # CONFIG_LEDS_TRIGGER_ACTIVITY is not set CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set # CONFIG_LEDS_TRIGGER_PANIC is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set # CONFIG_LEDS_TRIGGER_AUDIO is not set # CONFIG_LEDS_TRIGGER_TTY is not set # # Simple LED drivers # # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_SUPPORT=y # CONFIG_EDAC is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # 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 # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_HYM8563 is not set # CONFIG_RTC_DRV_MAX6900 is not set CONFIG_RTC_DRV_MAX77686=y # CONFIG_RTC_DRV_NCT3018Y is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # 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_RV3032 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 # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # CONFIG_RTC_DRV_DS3232=y # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set CONFIG_RTC_DRV_EFI=y # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_PL030 is not set CONFIG_RTC_DRV_PL031=y # CONFIG_RTC_DRV_CADENCE is not set # CONFIG_RTC_DRV_FTRTC010 is not set # CONFIG_RTC_DRV_PM8XXX is not set # CONFIG_RTC_DRV_R7301 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_VIRTUAL_CHANNELS=y CONFIG_DMA_ACPI=y CONFIG_DMA_OF=y # CONFIG_ALTERA_MSGDMA is not set # CONFIG_AMBA_PL08X is not set CONFIG_BCM_SBA_RAID=m # CONFIG_DW_AXI_DMAC is not set # CONFIG_FSL_EDMA is not set # CONFIG_FSL_QDMA is not set # CONFIG_HISI_DMA is not set # CONFIG_INTEL_IDMA64 is not set # CONFIG_MV_XOR_V2 is not set CONFIG_PL330_DMA=y # CONFIG_PLX_DMA is not set # CONFIG_XILINX_DMA is not set # CONFIG_XILINX_ZYNQMP_DMA is not set # CONFIG_XILINX_ZYNQMP_DPDMA is not set CONFIG_QCOM_BAM_DMA=y # CONFIG_QCOM_GPI_DMA is not set CONFIG_QCOM_HIDMA_MGMT=y CONFIG_QCOM_HIDMA=y # CONFIG_DW_DMAC is not set # CONFIG_DW_DMAC_PCI is not set # CONFIG_DW_EDMA is not set # CONFIG_DW_EDMA_PCIE is not set # CONFIG_SF_PDMA is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set CONFIG_DMA_ENGINE_RAID=y # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set # CONFIG_DMABUF_SYSFS_STATS is not set # end of DMABUF options # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set CONFIG_VFIO=y CONFIG_VFIO_IOMMU_TYPE1=y CONFIG_VFIO_VIRQFD=y # CONFIG_VFIO_NOIOMMU is not set CONFIG_VFIO_PCI_CORE=y CONFIG_VFIO_PCI_MMAP=y CONFIG_VFIO_PCI_INTX=y CONFIG_VFIO_PCI=y # CONFIG_VFIO_PLATFORM is not set # CONFIG_VFIO_MDEV is not set # CONFIG_VIRT_DRIVERS is not set CONFIG_VIRTIO_ANCHOR=y CONFIG_VIRTIO=y CONFIG_VIRTIO_PCI_LIB=y CONFIG_VIRTIO_PCI_LIB_LEGACY=y CONFIG_VIRTIO_MENU=y CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_PCI_LEGACY=y CONFIG_VIRTIO_BALLOON=y # CONFIG_VIRTIO_INPUT is not set CONFIG_VIRTIO_MMIO=y # CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set # CONFIG_VDPA is not set CONFIG_VHOST_MENU=y # CONFIG_VHOST_NET is not set # CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set # # Microsoft Hyper-V guest support # # CONFIG_HYPERV is not set # end of Microsoft Hyper-V guest support # # Xen driver support # CONFIG_XEN_BALLOON=y CONFIG_XEN_SCRUB_PAGES_DEFAULT=y CONFIG_XEN_DEV_EVTCHN=y CONFIG_XEN_BACKEND=y CONFIG_XENFS=y CONFIG_XEN_COMPAT_XENFS=y CONFIG_XEN_SYS_HYPERVISOR=y CONFIG_XEN_XENBUS_FRONTEND=y CONFIG_XEN_GNTDEV=y CONFIG_XEN_GRANT_DEV_ALLOC=y # CONFIG_XEN_GRANT_DMA_ALLOC is not set CONFIG_SWIOTLB_XEN=y # CONFIG_XEN_PCIDEV_STUB is not set # CONFIG_XEN_PVCALLS_FRONTEND is not set # CONFIG_XEN_PVCALLS_BACKEND is not set CONFIG_XEN_PRIVCMD=y CONFIG_XEN_EFI=y CONFIG_XEN_AUTO_XLATE=y # CONFIG_XEN_VIRTIO is not set # end of Xen driver support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set # CONFIG_STAGING is not set # CONFIG_GOLDFISH is not set CONFIG_CHROME_PLATFORMS=y # CONFIG_CHROMEOS_ACPI is not set # CONFIG_CHROMEOS_TBMC is not set # CONFIG_CROS_EC is not set # CONFIG_CROS_KBD_LED_BACKLIGHT is not set # CONFIG_CHROMEOS_PRIVACY_SCREEN is not set # CONFIG_MELLANOX_PLATFORM is not set # CONFIG_SURFACE_PLATFORMS is not set CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Clock driver for ARM Reference designs # # CONFIG_CLK_ICST is not set # CONFIG_CLK_SP810 is not set # CONFIG_CLK_VEXPRESS_OSC is not set # end of Clock driver for ARM Reference designs # CONFIG_LMK04832 is not set # CONFIG_COMMON_CLK_MAX77686 is not set # CONFIG_COMMON_CLK_MAX9485 is not set CONFIG_COMMON_CLK_SCPI=y # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set CONFIG_COMMON_CLK_CS2000_CP=y CONFIG_COMMON_CLK_S2MPS11=y # CONFIG_COMMON_CLK_AXI_CLKGEN is not set CONFIG_COMMON_CLK_XGENE=y # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_RS9_PCIE is not set # CONFIG_COMMON_CLK_VC5 is not set # CONFIG_COMMON_CLK_VC7 is not set # CONFIG_COMMON_CLK_FIXED_MMIO is not set CONFIG_QCOM_GDSC=y CONFIG_QCOM_RPMCC=y CONFIG_COMMON_CLK_QCOM=y CONFIG_QCOM_A53PLL=y # CONFIG_QCOM_A7PLL is not set # CONFIG_QCOM_CLK_APCC_MSM8996 is not set CONFIG_QCOM_CLK_SMD_RPM=y CONFIG_APQ_GCC_8084=y CONFIG_APQ_MMCC_8084=y # CONFIG_IPQ_APSS_PLL is not set CONFIG_IPQ_GCC_4019=y # CONFIG_IPQ_GCC_6018 is not set CONFIG_IPQ_GCC_806X=y CONFIG_IPQ_LCC_806X=y CONFIG_IPQ_GCC_8074=y CONFIG_MSM_GCC_8660=y # CONFIG_MSM_GCC_8909 is not set CONFIG_MSM_GCC_8916=y # CONFIG_MSM_GCC_8939 is not set CONFIG_MSM_GCC_8960=y CONFIG_MSM_LCC_8960=y # CONFIG_MDM_GCC_9607 is not set CONFIG_MDM_GCC_9615=y CONFIG_MDM_LCC_9615=y CONFIG_MSM_MMCC_8960=y # CONFIG_MSM_GCC_8953 is not set CONFIG_MSM_GCC_8974=y CONFIG_MSM_MMCC_8974=y # CONFIG_MSM_GCC_8976 is not set # CONFIG_MSM_MMCC_8994 is not set CONFIG_MSM_GCC_8994=y CONFIG_MSM_GCC_8996=y CONFIG_MSM_MMCC_8996=y # CONFIG_MSM_GCC_8998 is not set # CONFIG_MSM_GPUCC_8998 is not set # CONFIG_MSM_MMCC_8998 is not set # CONFIG_QCM_GCC_2290 is not set # CONFIG_QCM_DISPCC_2290 is not set # CONFIG_QCS_GCC_404 is not set # CONFIG_SC_CAMCC_7180 is not set # CONFIG_SC_CAMCC_7280 is not set # CONFIG_SC_DISPCC_7180 is not set # CONFIG_SC_DISPCC_7280 is not set # CONFIG_SC_GCC_7180 is not set # CONFIG_SC_GCC_7280 is not set # CONFIG_SC_GCC_8180X is not set # CONFIG_SC_GCC_8280XP is not set # CONFIG_SC_GPUCC_7180 is not set # CONFIG_SC_GPUCC_7280 is not set # CONFIG_SC_GPUCC_8280XP is not set # CONFIG_SC_LPASSCC_7280 is not set # CONFIG_SC_LPASS_CORECC_7180 is not set # CONFIG_SC_LPASS_CORECC_7280 is not set # CONFIG_SC_MSS_7180 is not set # CONFIG_SC_VIDEOCC_7180 is not set # CONFIG_SC_VIDEOCC_7280 is not set # CONFIG_SDM_CAMCC_845 is not set # CONFIG_SDM_GCC_660 is not set # CONFIG_SDM_MMCC_660 is not set # CONFIG_SDM_GPUCC_660 is not set # CONFIG_QCS_TURING_404 is not set # CONFIG_QCS_Q6SSTOP_404 is not set # CONFIG_SDM_GCC_845 is not set # CONFIG_SDM_GPUCC_845 is not set # CONFIG_SDM_VIDEOCC_845 is not set # CONFIG_SDM_DISPCC_845 is not set # CONFIG_SDM_LPASSCC_845 is not set # CONFIG_SDX_GCC_55 is not set # CONFIG_SDX_GCC_65 is not set # CONFIG_SM_CAMCC_8250 is not set # CONFIG_SM_CAMCC_8450 is not set # CONFIG_SM_GCC_6115 is not set # CONFIG_SM_GCC_6125 is not set # CONFIG_SM_GCC_6350 is not set # CONFIG_SM_GCC_6375 is not set # CONFIG_SM_GCC_8150 is not set # CONFIG_SM_GCC_8250 is not set # CONFIG_SM_GCC_8350 is not set # CONFIG_SM_GCC_8450 is not set # CONFIG_SM_GPUCC_6350 is not set # CONFIG_SM_GPUCC_8150 is not set # CONFIG_SM_GPUCC_8250 is not set # CONFIG_SM_GPUCC_8350 is not set # CONFIG_SM_VIDEOCC_8150 is not set # CONFIG_SM_VIDEOCC_8250 is not set # CONFIG_SPMI_PMIC_CLKDIV is not set # CONFIG_QCOM_HFPLL is not set # CONFIG_KPSS_XCC is not set # CONFIG_CLK_GFM_LPASS_SM8250 is not set # CONFIG_XILINX_VCU is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set CONFIG_HWSPINLOCK=y CONFIG_HWSPINLOCK_QCOM=y # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_ACPI=y CONFIG_TIMER_PROBE=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y CONFIG_FSL_ERRATUM_A008585=y CONFIG_HISILICON_ERRATUM_161010101=y CONFIG_ARM64_ERRATUM_858921=y # CONFIG_MICROCHIP_PIT64B is not set # end of Clock Source drivers CONFIG_MAILBOX=y CONFIG_ARM_MHU=y CONFIG_ARM_MHU_V2=m # CONFIG_PLATFORM_MHU is not set # CONFIG_PL320_MBOX is not set # CONFIG_PCC is not set # CONFIG_ALTERA_MBOX is not set # CONFIG_MAILBOX_TEST is not set # CONFIG_QCOM_APCS_IPC is not set # CONFIG_QCOM_IPCC is not set CONFIG_IOMMU_IOVA=y CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # CONFIG_IOMMU_IO_PGTABLE=y CONFIG_IOMMU_IO_PGTABLE_LPAE=y # CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set # CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set # CONFIG_IOMMU_IO_PGTABLE_DART is not set # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set CONFIG_IOMMU_DEFAULT_DMA_STRICT=y # CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_OF_IOMMU=y CONFIG_IOMMU_DMA=y CONFIG_ARM_SMMU=y # CONFIG_ARM_SMMU_LEGACY_DT_BINDINGS is not set CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT=y CONFIG_ARM_SMMU_QCOM=y # CONFIG_ARM_SMMU_QCOM_DEBUG is not set # CONFIG_ARM_SMMU_V3 is not set CONFIG_QCOM_IOMMU=y # CONFIG_VIRTIO_IOMMU is not set # # Remoteproc drivers # CONFIG_REMOTEPROC=y # CONFIG_REMOTEPROC_CDEV is not set CONFIG_QCOM_PIL_INFO=m CONFIG_QCOM_RPROC_COMMON=m # CONFIG_QCOM_Q6V5_ADSP is not set # CONFIG_QCOM_Q6V5_MSS is not set # CONFIG_QCOM_Q6V5_PAS is not set # CONFIG_QCOM_Q6V5_WCSS is not set # CONFIG_QCOM_SYSMON is not set CONFIG_QCOM_WCNSS_PIL=m # end of Remoteproc drivers # # Rpmsg drivers # CONFIG_RPMSG=y CONFIG_RPMSG_CHAR=y # CONFIG_RPMSG_CTRL is not set # CONFIG_RPMSG_NS is not set # CONFIG_RPMSG_QCOM_GLINK_RPM is not set # CONFIG_RPMSG_QCOM_GLINK_SMEM is not set CONFIG_RPMSG_QCOM_SMD=y # CONFIG_RPMSG_VIRTIO is not set # end of Rpmsg drivers # CONFIG_SOUNDWIRE is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # end of Amlogic SoC drivers # # Broadcom SoC drivers # # CONFIG_SOC_BRCMSTB is not set # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # CONFIG_QUICC_ENGINE is not set # CONFIG_FSL_RCPM is not set # end of NXP/Freescale QorIQ SoC drivers # # fujitsu SoC drivers # # CONFIG_A64FX_DIAG is not set # end of fujitsu SoC drivers # # i.MX SoC drivers # # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # CONFIG_LITEX_SOC_CONTROLLER is not set # end of Enable LiteX SoC Builder specific drivers # # Qualcomm SoC drivers # # CONFIG_QCOM_AOSS_QMP is not set CONFIG_QCOM_COMMAND_DB=y # CONFIG_QCOM_CPR is not set # CONFIG_QCOM_GENI_SE is not set # CONFIG_QCOM_GSBI is not set # CONFIG_QCOM_LLCC is not set CONFIG_QCOM_MDT_LOADER=y # CONFIG_QCOM_OCMEM is not set # CONFIG_QCOM_RMTFS_MEM is not set # CONFIG_QCOM_RPMH is not set # CONFIG_QCOM_RPMPD is not set CONFIG_QCOM_SMEM=y CONFIG_QCOM_SMD_RPM=y CONFIG_QCOM_SMEM_STATE=y CONFIG_QCOM_SMP2P=y CONFIG_QCOM_SMSM=y CONFIG_QCOM_SOCINFO=y CONFIG_QCOM_SPM=y CONFIG_QCOM_STATS=y CONFIG_QCOM_WCNSS_CTRL=y # CONFIG_QCOM_APR is not set # CONFIG_QCOM_ICC_BWMON is not set # end of Qualcomm SoC drivers # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y # CONFIG_DEVFREQ_GOV_PERFORMANCE is not set # CONFIG_DEVFREQ_GOV_POWERSAVE is not set # CONFIG_DEVFREQ_GOV_USERSPACE is not set # CONFIG_DEVFREQ_GOV_PASSIVE is not set # # DEVFREQ Drivers # # CONFIG_PM_DEVFREQ_EVENT is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_FSA9480 is not set # CONFIG_EXTCON_GPIO is not set # CONFIG_EXTCON_MAX3355 is not set # CONFIG_EXTCON_PTN5150 is not set # CONFIG_EXTCON_QCOM_SPMI_MISC is not set # CONFIG_EXTCON_RT8973A is not set # CONFIG_EXTCON_SM5502 is not set CONFIG_EXTCON_USB_GPIO=y # CONFIG_MEMORY is not set CONFIG_IIO=y # CONFIG_IIO_BUFFER is not set # CONFIG_IIO_CONFIGFS is not set # CONFIG_IIO_TRIGGER is not set # CONFIG_IIO_SW_DEVICE is not set # CONFIG_IIO_SW_TRIGGER is not set # CONFIG_IIO_TRIGGERED_EVENT is not set # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADXL313_I2C is not set # CONFIG_ADXL313_SPI is not set # CONFIG_ADXL345_I2C is not set # CONFIG_ADXL345_SPI is not set # CONFIG_ADXL355_I2C is not set # CONFIG_ADXL355_SPI is not set # CONFIG_ADXL367_SPI is not set # CONFIG_ADXL367_I2C is not set # CONFIG_ADXL372_SPI is not set # CONFIG_ADXL372_I2C is not set # CONFIG_BMA180 is not set # CONFIG_BMA220 is not set # CONFIG_BMA400 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_BMI088_ACCEL is not set # CONFIG_DA280 is not set # CONFIG_DA311 is not set # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_DMARD10 is not set # CONFIG_FXLS8962AF_I2C is not set # CONFIG_FXLS8962AF_SPI is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MC3230 is not set # CONFIG_MMA7455_I2C is not set # CONFIG_MMA7455_SPI is not set # CONFIG_MMA7660 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MSA311 is not set # CONFIG_MXC4005 is not set # CONFIG_MXC6255 is not set # CONFIG_SCA3000 is not set # CONFIG_SCA3300 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7091R5 is not set # CONFIG_AD7124 is not set # CONFIG_AD7192 is not set # CONFIG_AD7266 is not set # CONFIG_AD7280 is not set # CONFIG_AD7291 is not set # CONFIG_AD7292 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_AD7780 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD7949 is not set # CONFIG_AD799X is not set # CONFIG_ADI_AXI_ADC is not set # CONFIG_CC10001_ADC is not set # CONFIG_ENVELOPE_DETECTOR is not set # CONFIG_HI8435 is not set # CONFIG_HX711 is not set # CONFIG_INA2XX_ADC is not set # CONFIG_LTC2471 is not set # CONFIG_LTC2485 is not set # CONFIG_LTC2496 is not set # CONFIG_LTC2497 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX11100 is not set # CONFIG_MAX1118 is not set # CONFIG_MAX11205 is not set # CONFIG_MAX1241 is not set # CONFIG_MAX1363 is not set # CONFIG_MAX9611 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_MCP3911 is not set # CONFIG_NAU7802 is not set # CONFIG_QCOM_SPMI_RRADC is not set # CONFIG_QCOM_SPMI_IADC is not set # CONFIG_QCOM_SPMI_VADC is not set # CONFIG_QCOM_SPMI_ADC5 is not set # CONFIG_RICHTEK_RTQ6056 is not set # CONFIG_SD_ADC_MODULATOR is not set # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC0832 is not set # CONFIG_TI_ADC084S021 is not set # CONFIG_TI_ADC12138 is not set # CONFIG_TI_ADC108S102 is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_TI_ADC161S626 is not set # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS7950 is not set # CONFIG_TI_ADS8344 is not set # CONFIG_TI_ADS8688 is not set # CONFIG_TI_ADS124S08 is not set # CONFIG_TI_ADS131E08 is not set # CONFIG_TI_TLC4541 is not set # CONFIG_TI_TSC2046 is not set # CONFIG_VF610_ADC is not set # CONFIG_XILINX_XADC is not set # end of Analog to digital converters # # Analog to digital and digital to analog converters # # CONFIG_AD74413R is not set # end of Analog to digital and digital to analog converters # # Analog Front Ends # # CONFIG_IIO_RESCALE is not set # end of Analog Front Ends # # Amplifiers # # CONFIG_AD8366 is not set # CONFIG_ADA4250 is not set # CONFIG_HMC425 is not set # end of Amplifiers # # Capacitance to digital converters # # CONFIG_AD7150 is not set # CONFIG_AD7746 is not set # end of Capacitance to digital converters # # Chemical Sensors # # CONFIG_ATLAS_PH_SENSOR is not set # CONFIG_ATLAS_EZO_SENSOR is not set # CONFIG_BME680 is not set # CONFIG_CCS811 is not set # CONFIG_IAQCORE is not set # CONFIG_SCD30_CORE is not set # CONFIG_SCD4X is not set # CONFIG_SENSIRION_SGP30 is not set # CONFIG_SENSIRION_SGP40 is not set # CONFIG_SPS30_I2C is not set # CONFIG_SENSEAIR_SUNRISE_CO2 is not set # CONFIG_VZ89X is not set # end of Chemical Sensors # # Hid Sensor IIO Common # # end of Hid Sensor IIO Common # # IIO SCMI Sensors # # end of IIO SCMI Sensors # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # end of SSP Sensor Common # # Digital to analog converters # # CONFIG_AD3552R is not set # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5592R is not set # CONFIG_AD5593R is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_LTC2688 is not set # CONFIG_AD5686_SPI is not set # CONFIG_AD5696_I2C is not set # CONFIG_AD5755 is not set # CONFIG_AD5758 is not set # CONFIG_AD5761 is not set # CONFIG_AD5764 is not set # CONFIG_AD5766 is not set # CONFIG_AD5770R is not set # CONFIG_AD5791 is not set # CONFIG_AD7293 is not set # CONFIG_AD7303 is not set # CONFIG_AD8801 is not set # CONFIG_DPOT_DAC is not set # CONFIG_DS4424 is not set # CONFIG_LTC1660 is not set # CONFIG_LTC2632 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # 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 # end of Digital to analog converters # # IIO dummy driver # # end of IIO dummy driver # # Filters # # CONFIG_ADMV8818 is not set # end of Filters # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # end of Clock Generator/Distribution # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # CONFIG_ADF4371 is not set # CONFIG_ADMV1013 is not set # CONFIG_ADMV1014 is not set # CONFIG_ADMV4420 is not set # CONFIG_ADRF6780 is not set # end of Phase-Locked Loop (PLL) frequency synthesizers # end of Frequency Synthesizers DDS/PLL # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS290 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_FXAS21002C is not set # CONFIG_MPU3050_I2C is not set # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # end of Digital gyroscope sensors # # Health Sensors # # # Heart Rate Monitors # # CONFIG_AFE4403 is not set # CONFIG_AFE4404 is not set # CONFIG_MAX30100 is not set # CONFIG_MAX30102 is not set # end of Heart Rate Monitors # end of Health Sensors # # Humidity sensors # # CONFIG_AM2315 is not set # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HDC2010 is not set # CONFIG_HTS221 is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # end of Humidity sensors # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16460 is not set # CONFIG_ADIS16475 is not set # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set # CONFIG_BOSCH_BNO055_I2C is not set # CONFIG_FXOS8700_I2C is not set # CONFIG_FXOS8700_SPI is not set # CONFIG_KMX61 is not set # CONFIG_INV_ICM42600_I2C is not set # CONFIG_INV_ICM42600_SPI is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set # CONFIG_IIO_ST_LSM6DSX is not set # CONFIG_IIO_ST_LSM9DS0 is not set # end of Inertial measurement units # # Light sensors # # CONFIG_ACPI_ALS is not set # CONFIG_ADJD_S311 is not set # CONFIG_ADUX1020 is not set # CONFIG_AL3010 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_AS73211 is not set # CONFIG_BH1750 is not set # CONFIG_BH1780 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM3605 is not set # CONFIG_CM36651 is not set # CONFIG_GP2AP002 is not set # CONFIG_GP2AP020A00F is not set # CONFIG_SENSORS_ISL29018 is not set # CONFIG_SENSORS_ISL29028 is not set # CONFIG_ISL29125 is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_LTRF216A is not set # CONFIG_LV0104CS is not set # CONFIG_MAX44000 is not set # CONFIG_MAX44009 is not set # CONFIG_NOA1305 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1133 is not set # CONFIG_SI1145 is not set # CONFIG_STK3310 is not set # CONFIG_ST_UVIS25 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set # CONFIG_SENSORS_TSL2563 is not set # CONFIG_TSL2583 is not set # CONFIG_TSL2591 is not set # CONFIG_TSL2772 is not set # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VCNL4035 is not set # CONFIG_VEML6030 is not set # CONFIG_VEML6070 is not set # CONFIG_VL6180 is not set # CONFIG_ZOPT2201 is not set # end of Light sensors # # Magnetometer sensors # # CONFIG_AK8974 is not set # CONFIG_AK8975 is not set # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN_I2C is not set # CONFIG_BMC150_MAGN_SPI is not set # CONFIG_MAG3110 is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # CONFIG_SENSORS_RM3100_I2C is not set # CONFIG_SENSORS_RM3100_SPI is not set # CONFIG_YAMAHA_YAS530 is not set # end of Magnetometer sensors # # Multiplexers # # CONFIG_IIO_MUX is not set # end of Multiplexers # # Inclinometer sensors # # end of Inclinometer sensors # # Linear and angular position sensors # # end of Linear and angular position sensors # # Digital potentiometers # # CONFIG_AD5110 is not set # CONFIG_AD5272 is not set # CONFIG_DS1803 is not set # CONFIG_MAX5432 is not set # CONFIG_MAX5481 is not set # CONFIG_MAX5487 is not set # CONFIG_MCP4018 is not set # CONFIG_MCP4131 is not set # CONFIG_MCP4531 is not set # CONFIG_MCP41010 is not set # CONFIG_TPL0102 is not set # end of Digital potentiometers # # Digital potentiostats # # CONFIG_LMP91000 is not set # end of Digital potentiostats # # Pressure sensors # # CONFIG_ABP060MG is not set # CONFIG_BMP280 is not set # CONFIG_DLHL60D is not set # CONFIG_DPS310 is not set # CONFIG_HP03 is not set # CONFIG_ICP10100 is not set # CONFIG_MPL115_I2C is not set # CONFIG_MPL115_SPI is not set # CONFIG_MPL3115 is not set # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # CONFIG_HP206C is not set # CONFIG_ZPA2326 is not set # end of Pressure sensors # # Lightning sensors # # CONFIG_AS3935 is not set # end of Lightning sensors # # Proximity and distance sensors # # CONFIG_ISL29501 is not set # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_MB1232 is not set # CONFIG_PING is not set # CONFIG_RFD77402 is not set # CONFIG_SRF04 is not set # CONFIG_SX9310 is not set # CONFIG_SX9324 is not set # CONFIG_SX9360 is not set # CONFIG_SX9500 is not set # CONFIG_SRF08 is not set # CONFIG_VCNL3020 is not set # CONFIG_VL53L0X_I2C is not set # end of Proximity and distance sensors # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1200 is not set # end of Resolver to digital converters # # Temperature sensors # # CONFIG_LTC2983 is not set # CONFIG_MAXIM_THERMOCOUPLE is not set # CONFIG_MLX90614 is not set # CONFIG_MLX90632 is not set # CONFIG_TMP006 is not set # CONFIG_TMP007 is not set # CONFIG_TMP117 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_MAX31856 is not set # CONFIG_MAX31865 is not set # end of Temperature sensors # CONFIG_NTB is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_DEBUG is not set # CONFIG_PWM_ATMEL_TCB is not set # CONFIG_PWM_CLK is not set # CONFIG_PWM_DWC is not set # CONFIG_PWM_FSL_FTM is not set # CONFIG_PWM_PCA9685 is not set # CONFIG_PWM_XILINX is not set # # IRQ chip support # CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 CONFIG_ARM_GIC_V2M=y CONFIG_ARM_GIC_V3=y CONFIG_ARM_GIC_V3_ITS=y CONFIG_ARM_GIC_V3_ITS_PCI=y # CONFIG_AL_FIC is not set # CONFIG_XILINX_INTC is not set CONFIG_PARTITION_PERCPU=y # CONFIG_QCOM_IRQ_COMBINER is not set # CONFIG_QCOM_PDC is not set # CONFIG_QCOM_MPM is not set # end of IRQ chip support # CONFIG_IPACK_BUS is not set CONFIG_RESET_CONTROLLER=y # CONFIG_RESET_QCOM_AOSS is not set # CONFIG_RESET_QCOM_PDC is not set # CONFIG_RESET_TI_SYSCON is not set # CONFIG_RESET_TI_TPS380X is not set # # PHY Subsystem # CONFIG_GENERIC_PHY=y CONFIG_PHY_XGENE=y # CONFIG_PHY_CAN_TRANSCEIVER is not set # # PHY drivers for Broadcom platforms # # CONFIG_BCM_KONA_USB2_PHY is not set # end of PHY drivers for Broadcom platforms # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_DPHY_RX is not set # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_CADENCE_SALVO is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_LAN966X_SERDES is not set # CONFIG_PHY_CPCAP_USB is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set # CONFIG_PHY_OCELOT_SERDES is not set CONFIG_PHY_QCOM_APQ8064_SATA=y # CONFIG_PHY_QCOM_EDP is not set # CONFIG_PHY_QCOM_IPQ4019_USB is not set CONFIG_PHY_QCOM_IPQ806X_SATA=y # CONFIG_PHY_QCOM_PCIE2 is not set CONFIG_PHY_QCOM_QMP=y CONFIG_PHY_QCOM_QUSB2=y CONFIG_PHY_QCOM_USB_HS=y # CONFIG_PHY_QCOM_USB_SNPS_FEMTO_V2 is not set CONFIG_PHY_QCOM_USB_HSIC=y # CONFIG_PHY_QCOM_USB_HS_28NM is not set # CONFIG_PHY_QCOM_USB_SS is not set # CONFIG_PHY_QCOM_IPQ806X_USB is not set CONFIG_PHY_SAMSUNG_USB2=y # CONFIG_PHY_TUSB1210 is not set # end of PHY Subsystem # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCI_PMU is not set # CONFIG_ARM_CCN is not set # CONFIG_ARM_CMN is not set CONFIG_ARM_PMU=y CONFIG_ARM_PMU_ACPI=y # CONFIG_ARM_SMMU_V3_PMU is not set # CONFIG_ARM_DSU_PMU is not set # CONFIG_QCOM_L2_PMU is not set # CONFIG_QCOM_L3_PMU is not set # CONFIG_ARM_SPE_PMU is not set # CONFIG_ARM_DMC620_PMU is not set # CONFIG_ALIBABA_UNCORE_DRW_PMU is not set # CONFIG_HISI_PMU is not set # CONFIG_HISI_PCIE_PMU is not set # CONFIG_HNS3_PMU is not set # end of Performance monitor support CONFIG_RAS=y # CONFIG_USB4 is not set # # Android # # CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_LIBNVDIMM is not set # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y # CONFIG_NVMEM_QCOM_QFPROM is not set # CONFIG_NVMEM_RMEM is not set # CONFIG_NVMEM_SPMI_SDAM is not set CONFIG_NVMEM_U_BOOT_ENV=m # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # CONFIG_HISI_PTT is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_FSI is not set # CONFIG_TEE is not set CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set # CONFIG_PECI is not set # CONFIG_HTE is not set # end of Device Drivers # # File systems # CONFIG_DCACHE_WORD_ACCESS=y CONFIG_VALIDATE_FS_PARSER=y CONFIG_FS_IOMAP=y CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y CONFIG_EXT2_FS_SECURITY=y CONFIG_EXT3_FS=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y CONFIG_EXT4_FS=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set # CONFIG_XFS_FS is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=y CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_BTRFS_FS_REF_VERIFY is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QUOTA_DEBUG is not set # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS4_FS=y CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=m CONFIG_CUSE=m # CONFIG_VIRTIO_FS is not set CONFIG_OVERLAY_FS=m # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_XINO_AUTO is not set # CONFIG_OVERLAY_FS_METACOPY is not set # # Caches # # CONFIG_FSCACHE is not set # end of Caches # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=m CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set CONFIG_NTFS3_FS=m # CONFIG_NTFS3_64BIT_CLUSTER is not set # CONFIG_NTFS3_LZX_XPRESS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_TMPFS_INODE64 is not set CONFIG_ARCH_SUPPORTS_HUGETLBFS=y # CONFIG_HUGETLBFS is not set CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=y CONFIG_EFIVAR_FS=y # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS2_FS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y # CONFIG_SQUASHFS_FILE_CACHE is not set CONFIG_SQUASHFS_FILE_DIRECT=y # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y CONFIG_SQUASHFS_XATTR=y CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_PSTORE is not set # CONFIG_SYSV_FS is not set CONFIG_UFS_FS=y # CONFIG_UFS_FS_WRITE is not set CONFIG_UFS_DEBUG=y # CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=m CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" # CONFIG_NFS_V4_1_MIGRATION is not set CONFIG_NFS_V4_SECURITY_LABEL=y CONFIG_ROOT_NFS=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFS_DISABLE_UDP_SUPPORT=y # CONFIG_NFS_V4_2_READ_PLUS is not set CONFIG_NFSD=m CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3_ACL=y # CONFIG_NFSD_V4 is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_ACL_SUPPORT=m CONFIG_NFS_COMMON=y CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set # CONFIG_CIFS is not set # CONFIG_SMB_SERVER is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_BIG_KEYS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEY_DH_OPERATIONS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set CONFIG_SECURITY=y CONFIG_SECURITYFS=y # CONFIG_SECURITY_NETWORK is not set # CONFIG_SECURITY_PATH is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_SECURITY_SMACK is not set # CONFIG_SECURITY_TOMOYO is not set # 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_SECURITY_LOCKDOWN_LSM is not set # CONFIG_SECURITY_LANDLOCK is not set CONFIG_INTEGRITY=y # CONFIG_INTEGRITY_SIGNATURE is not set CONFIG_INTEGRITY_AUDIT=y # CONFIG_IMA is not set # CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set # CONFIG_EVM is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_LSM="yama,loadpin,safesetid,integrity" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_STACK_ALL_PATTERN is not set # CONFIG_INIT_STACK_ALL_ZERO is not set # CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization CONFIG_RANDSTRUCT_NONE=y # CONFIG_RANDSTRUCT_FULL is not set # CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options CONFIG_XOR_BLOCKS=y CONFIG_ASYNC_TX_DISABLE_PQ_VAL_DMA=y CONFIG_ASYNC_TX_DISABLE_XOR_VAL_DMA=y CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_ENGINE=m # end of Crypto core or helper # # Public-key cryptography # CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y # CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set CONFIG_CRYPTO_ECC=y CONFIG_CRYPTO_ECDH=y # CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set # end of Public-key cryptography # # Block ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set CONFIG_CRYPTO_SM4=y # CONFIG_CRYPTO_SM4_GENERIC is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set CONFIG_CRYPTO_CTR=y # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set CONFIG_CRYPTO_NHPOLY1305=y # end of Length-preserving ciphers and modes # # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y # CONFIG_CRYPTO_ESSIV is not set # end of AEAD (authenticated encryption with associated data) ciphers # # Hashes, digests, and MACs # CONFIG_CRYPTO_BLAKE2B=y CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y CONFIG_CRYPTO_MICHAEL_MIC=y CONFIG_CRYPTO_POLYVAL=y # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set CONFIG_CRYPTO_SM3=y # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_XCBC is not set CONFIG_CRYPTO_XXHASH=y # end of Hashes, digests, and MACs # # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_CRC32 is not set CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_CRC64_ROCKSOFT=y # end of CRCs (cyclic redundancy checks) # # Compression # # CONFIG_CRYPTO_DEFLATE is not set # CONFIG_CRYPTO_LZO is not set # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # end of Compression # # Random number generation # CONFIG_CRYPTO_ANSI_CPRNG=y CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation # # Userspace interface # CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y CONFIG_CRYPTO_USER_API_RNG=y # CONFIG_CRYPTO_USER_API_RNG_CAVP is not set CONFIG_CRYPTO_USER_API_AEAD=y CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y CONFIG_CRYPTO_NHPOLY1305_NEON=y CONFIG_CRYPTO_CHACHA20_NEON=y # # Accelerated Cryptographic Algorithms for CPU (arm64) # CONFIG_CRYPTO_GHASH_ARM64_CE=y CONFIG_CRYPTO_POLY1305_NEON=y CONFIG_CRYPTO_SHA1_ARM64_CE=y CONFIG_CRYPTO_SHA256_ARM64=y CONFIG_CRYPTO_SHA2_ARM64_CE=y CONFIG_CRYPTO_SHA512_ARM64=y CONFIG_CRYPTO_SHA512_ARM64_CE=y # CONFIG_CRYPTO_SHA3_ARM64 is not set CONFIG_CRYPTO_SM3_NEON=y # CONFIG_CRYPTO_SM3_ARM64_CE is not set CONFIG_CRYPTO_POLYVAL_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64=y CONFIG_CRYPTO_AES_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64_CE_BLK=y CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y CONFIG_CRYPTO_AES_ARM64_BS=y # CONFIG_CRYPTO_SM4_ARM64_CE is not set CONFIG_CRYPTO_SM4_ARM64_CE_BLK=y CONFIG_CRYPTO_SM4_ARM64_NEON_BLK=y CONFIG_CRYPTO_AES_ARM64_CE_CCM=y CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=y # end of Accelerated Cryptographic Algorithms for CPU (arm64) CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_ATMEL_ECC is not set # CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set # CONFIG_CRYPTO_DEV_CCP is not set # CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set # CONFIG_CRYPTO_DEV_QAT_C3XXX is not set # CONFIG_CRYPTO_DEV_QAT_C62X is not set # CONFIG_CRYPTO_DEV_QAT_4XXX is not set # CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set # CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set # CONFIG_CRYPTO_DEV_QAT_C62XVF is not set # CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set # CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set # CONFIG_CRYPTO_DEV_QCE is not set # CONFIG_CRYPTO_DEV_QCOM_RNG is not set CONFIG_CRYPTO_DEV_VIRTIO=m # CONFIG_CRYPTO_DEV_SAFEXCEL is not set # CONFIG_CRYPTO_DEV_CCREE is not set # CONFIG_CRYPTO_DEV_HISI_SEC is not set # CONFIG_CRYPTO_DEV_HISI_SEC2 is not set # CONFIG_CRYPTO_DEV_HISI_ZIP is not set # CONFIG_CRYPTO_DEV_HISI_HPRE is not set # CONFIG_CRYPTO_DEV_HISI_TRNG is not set # CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS8_PRIVATE_KEY_PARSER=m CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=y CONFIG_RAID6_PQ_BENCHMARK=y CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y # CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y # CONFIG_INDIRECT_PIO is not set # # Crypto library routines # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=y CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y CONFIG_CRYPTO_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=y CONFIG_CRYPTO_LIB_CURVE25519=y CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y CONFIG_CRYPTO_LIB_POLY1305=y CONFIG_CRYPTO_LIB_CHACHA20POLY1305=y CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_CRC_CCITT=m CONFIG_CRC16=y CONFIG_CRC_T10DIF=y CONFIG_CRC64_ROCKSOFT=y CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set CONFIG_CRC64=y # CONFIG_CRC4 is not set CONFIG_CRC7=y CONFIG_LIBCRC32C=y CONFIG_CRC8=y CONFIG_XXHASH=y CONFIG_AUDIT_GENERIC=y CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y CONFIG_AUDIT_COMPAT_GENERIC=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=y CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y CONFIG_XZ_DEC_POWERPC=y CONFIG_XZ_DEC_IA64=y CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y CONFIG_XZ_DEC_SPARC=y # CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_GZIP=y CONFIG_DECOMPRESS_ZSTD=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=m CONFIG_INTERVAL_TREE=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_DMA_DECLARE_COHERENT=y CONFIG_ARCH_HAS_SETUP_DMA_OPS=y CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y CONFIG_SWIOTLB=y # CONFIG_DMA_RESTRICTED_POOL is not set CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_COHERENT_POOL=y CONFIG_DMA_DIRECT_REMAP=y CONFIG_DMA_CMA=y # CONFIG_DMA_PERNUMA_CMA is not set # # Default contiguous memory area size: # CONFIG_CMA_SIZE_MBYTES=128 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_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y # CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_UCS2_STRING=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_TIME_NS=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_ARCH_STACKWALK=y CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y # end of Library routines CONFIG_GENERIC_IOREMAP=y CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set # CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_SYMBOLIC_ERRNAME=y CONFIG_DEBUG_BUGVERBOSE=y # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Compile-time checks and compiler options # CONFIG_DEBUG_INFO=y CONFIG_AS_HAS_NON_CONST_LEB128=y # CONFIG_DEBUG_INFO_NONE is not set CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_INFO_COMPRESSED is not set # CONFIG_DEBUG_INFO_SPLIT is not set # CONFIG_DEBUG_INFO_BTF is not set # CONFIG_GDB_SCRIPTS is not set CONFIG_FRAME_WARN=2048 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set CONFIG_HAVE_KCSAN_COMPILER=y # end of Generic Kernel Debugging Instruments # # Networking Debugging # # CONFIG_NET_DEV_REFCNT_TRACKER is not set # CONFIG_NET_NS_REFCNT_TRACKER is not set # CONFIG_DEBUG_NET is not set # end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_PTDUMP_DEBUGFS is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM_PGTABLE is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_KASAN_SW_TAGS=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y # CONFIG_KFENCE is not set # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 # CONFIG_SOFTLOCKUP_DETECTOR is not set CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # CONFIG_SCHED_DEBUG=y CONFIG_SCHED_INFO=y CONFIG_SCHEDSTATS=y # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set # CONFIG_DEBUG_PREEMPT is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_SAMPLES is not set # CONFIG_STRICT_DEVMEM is not set # # arm64 Debugging # CONFIG_PID_IN_CONTEXTIDR=y # CONFIG_DEBUG_EFI is not set # CONFIG_ARM64_RELOC_TEST is not set CONFIG_CORESIGHT=y CONFIG_CORESIGHT_LINKS_AND_SINKS=y CONFIG_CORESIGHT_LINK_AND_SINK_TMC=y # CONFIG_CORESIGHT_CATU is not set CONFIG_CORESIGHT_SINK_TPIU=y CONFIG_CORESIGHT_SINK_ETBV10=y CONFIG_CORESIGHT_SOURCE_ETM4X=y # CONFIG_ETM4X_IMPDEF_FEATURE is not set # CONFIG_CORESIGHT_STM is not set # CONFIG_CORESIGHT_CPU_DEBUG is not set # CONFIG_CORESIGHT_CTI is not set # CONFIG_CORESIGHT_TRBE is not set # end of arm64 Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set # CONFIG_TEST_MIN_HEAP is not set # CONFIG_TEST_DIV64 is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_TEST_REF_TRACKER is not set # CONFIG_RBTREE_TEST is not set # CONFIG_REED_SOLOMON_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set # CONFIG_STRING_SELFTEST is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_STRSCPY is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_SCANF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_XARRAY is not set # CONFIG_TEST_MAPLE_TREE is not set # CONFIG_TEST_RHASHTABLE is not set # CONFIG_TEST_SIPHASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_BITOPS is not set # CONFIG_TEST_VMALLOC is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_TEST_BLACKHOLE_DEV is not set # CONFIG_FIND_BIT_BENCHMARK is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_SYSCTL is not set # CONFIG_TEST_UDELAY is not set # CONFIG_TEST_STATIC_KEYS is not set # CONFIG_TEST_DYNAMIC_DEBUG is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMCAT_P is not set # CONFIG_TEST_MEMINIT is not set # CONFIG_TEST_FREE_PAGES is not set CONFIG_ARCH_USE_MEMTEST=y CONFIG_MEMTEST=y # end of Kernel Testing and Coverage # # Rust hacking # # end of Rust hacking # end of Kernel hacking ================================================ FILE: projects/Qualcomm/devices/Dragonboard/options ================================================ ################################################################################ # setup system defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc+fp+simd" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_FLOAT=hard TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc" TARGET_FPU="neon-fp-armv8" ;; esac # Bootloader to use (syslinux / u-boot / atv-bootloader / bcm2835-bootloader) BOOTLOADER="u-boot" # U-Boot firmware package(s) to use (this is a bit of a hack as mkbootimg isn't firmware but is needed by the host to build the u-boot uImage) UBOOT_FIRMWARE="mkbootimg:host" # Kernel target KERNEL_TARGET="Image" # Kernel uImage load address KERNEL_UIMAGE_LOADADDR="0x80080000" # Kernel uImage entry address KERNEL_UIMAGE_ENTRYADDR="0x80080000" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="dtbs" # Kernel to use. values can be: # default: default mainline kernel LINUX="default" ################################################################################ # setup build defaults ################################################################################ # Project CFLAGS PROJECT_CFLAGS="" # SquashFS compression method (gzip / lzo / xz) SQUASHFS_COMPRESSION="zstd" ################################################################################ # setup project defaults ################################################################################ # OpenGL(X) implementation to use (no / Mesa) OPENGL="no" # OpenGL-ES implementation to use (no / bcm2835-driver / gpu-viv-bin-mx6q / opengl-meson6) OPENGLES="mesa" # Vulkan implementation to use (vulkan-loader / no) VULKAN="no" # include uvesafb support (yes / no) UVESAFB_SUPPORT="no" # Displayserver to use (wl / no) DISPLAYSERVER="no" # Windowmanager to use (weston / no) WINDOWMANAGER="no" # Xorg Graphic drivers to use (all / freedreno) # Space separated list is supported, # e.g. GRAPHIC_DRIVERS="freedreno" GRAPHIC_DRIVERS="freedreno" # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap / libamcodec) KODIPLAYER_DRIVER="mesa" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" FIRMWARE="misc-firmware wlan-firmware dvb-firmware firmware-dragonboard" # build and install driver addons (yes / no) DRIVER_ADDONS_SUPPORT="no" # driver addons to install: # for a list of additional drivers see packages/linux-driver-addons # Space separated list is supported, DRIVER_ADDONS="crazycat dvb-latest" # build with installer (yes / no) INSTALLER_SUPPORT="no" # kernel serial console EXTRA_CMDLINE="console=ttyMSM0,115200n8 console=tty0" # debug tty path DEBUG_TTY="/dev/ttyMSM0" # set the addon project ADDON_PROJECT="ARMv8" ================================================ FILE: projects/Qualcomm/devices/Dragonboard/packages/mkbootimg/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mkbootimg" PKG_VERSION="1.6.0" PKG_SHA256="7930b7dba25e5b4a39e6d19ccce9005e17c98a2b6c9e1aa6408a88c716755aaf" PKG_LICENSE="GPL" PKG_SITE="https://source.codeaurora.org/quic/kernel/skales/" PKG_URL="https://source.codeaurora.org/quic/kernel/skales/snapshot/$PKG_VERSION.tar.xz" PKG_DEPENDS_HOST="dtc:host" PKG_LONGDESC="mkbootimg: Creates kernel boot images for Android" PKG_TOOLCHAIN="manual" make_host() { sed "s|libfdt.so|$TOOLCHAIN/lib/libfdt.so|" -i dtbTool } makeinstall_host() { cp mkbootimg $TOOLCHAIN/bin/ cp dtbTool $TOOLCHAIN/bin/ } ================================================ FILE: projects/Qualcomm/devices/Dragonboard/packages/mkbootimg/patches/mkbootimg-0001-add-extra-devices.patch ================================================ diff -Naur a/dtbTool b/dtbTool --- a/dtbTool 2017-02-01 14:07:03.000000000 -0800 +++ b/dtbTool 2017-10-23 22:32:17.090949808 -0700 @@ -84,6 +84,7 @@ 'apq8096' : 291, 'msm8998' : 292, 'msm8996sg' : 305, + 'ipq8074' : 306, } platform_type = { @@ -108,6 +109,7 @@ 'stp' : 23, 'sbc' : 24, 'cls' : 29, + 'hk01' : 30, } pmic_ids = { ================================================ FILE: projects/Qualcomm/devices/Dragonboard/patches/linux/linux-0001-set-default-mac.patch ================================================ diff -Naur a/arch/arm64/boot/dts/qcom/msm8916.dtsi b/arch/arm64/boot/dts/qcom/msm8916.dtsi --- a/arch/arm64/boot/dts/qcom/msm8916.dtsi 2017-05-10 06:07:46.000000000 -0700 +++ b/arch/arm64/boot/dts/qcom/msm8916.dtsi 2017-06-01 11:45:44.805705640 -0700 @@ -1177,6 +1177,7 @@ interrupts = <0 145 IRQ_TYPE_LEVEL_HIGH>, <0 146 IRQ_TYPE_LEVEL_HIGH>; interrupt-names = "tx", "rx"; + local-mac-address = [02 00 27 60 25 28]; qcom,smem-states = <&apps_smsm 10>, <&apps_smsm 9>; qcom,smem-state-names = "tx-enable", "tx-rings-empty"; ================================================ FILE: projects/RPi/devices/RPi/config/distroconfig.txt ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) # WARNING: DO NOT EDIT THIS FILE - IT WILL BE OVERWRITTEN WHEN UPGRADING! display_auto_detect=1 dtoverlay=vc4-kms-v3d,cma-128 dtoverlay= disable_overscan=1 disable_fw_kms_setup=1 ================================================ FILE: projects/RPi/devices/RPi/kodi/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8" ?> <settings version="1"> <section id="system"> <category id="display"> <group id="1"> <setting id="videoscreen.limitguisize"> <default>3</default> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/RPi/devices/RPi/linux/linux.arm.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm 6.1.66 Kernel Configuration # CONFIG_CC_VERSION_TEXT="arm-linux-gnueabihf-gcc (GCC) 13.0.0 20220604 (experimental) [master revision aec868578d8515763d75693c1fdfbc30ff0a1e68]" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=130000 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23850 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23850 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_LZMA=y CONFIG_HAVE_KERNEL_XZ=y CONFIG_HAVE_KERNEL_LZO=y CONFIG_HAVE_KERNEL_LZ4=y CONFIG_KERNEL_GZIP=y # CONFIG_KERNEL_LZMA is not set # CONFIG_KERNEL_XZ is not set # CONFIG_KERNEL_LZO is not set # CONFIG_KERNEL_LZ4 is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_GENERIC_IRQ_MULTI_HANDLER=y CONFIG_GENERIC_CLOCKEVENTS=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y # CONFIG_BPF_JIT is not set # CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_BPF_PRELOAD is not set # end of BPF subsystem CONFIG_PREEMPT_VOLUNTARY_BUILD=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_TASKSTATS is not set # CONFIG_PSI is not set # end of CPU/Task time and stats accounting # # RCU Subsystem # CONFIG_TINY_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TINY_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_RUDE_RCU=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem CONFIG_IKCONFIG=m CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=17 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 # CONFIG_PRINTK_INDEX is not set CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # # end of Scheduler features CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y # CONFIG_FAIR_GROUP_SCHED is not set # CONFIG_RT_GROUP_SCHED is not set # CONFIG_CGROUP_PIDS is not set # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y # CONFIG_CGROUP_PERF is not set CONFIG_CGROUP_BPF=y # CONFIG_CGROUP_MISC is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y # CONFIG_USER_NS is not set CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 # CONFIG_RD_GZIP is not set # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set # CONFIG_RD_LZ4 is not set # CONFIG_RD_ZSTD is not set CONFIG_INITRAMFS_COMPRESSION_NONE=y CONFIG_BOOT_CONFIG=y # CONFIG_BOOT_CONFIG_EMBED is not set CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_EXPERT=y # CONFIG_UID16 is not set CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set # CONFIG_SYSFS_SYSCALL is not set CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y 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 # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y CONFIG_PERF_USE_VMALLOC=y # CONFIG_PC104 is not set # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_SYSTEM_DATA_VERIFICATION=y CONFIG_PROFILING=y CONFIG_TRACEPOINTS=y # end of General setup CONFIG_ARM=y CONFIG_ARM_HAS_GROUP_RELOCS=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y CONFIG_HAVE_PROC_CPU=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_LOCKDEP_SUPPORT=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_FIQ=y CONFIG_ARM_PATCH_PHYS_VIRT=y CONFIG_GENERIC_BUG=y CONFIG_PGTABLE_LEVELS=2 # # System Type # CONFIG_MMU=y CONFIG_ARCH_MMAP_RND_BITS_MIN=8 CONFIG_ARCH_MMAP_RND_BITS_MAX=15 CONFIG_ARCH_MULTIPLATFORM=y # # Platform selection # # # CPU Core family selection # CONFIG_ARCH_MULTI_V6=y # CONFIG_ARCH_MULTI_V7 is not set CONFIG_ARCH_MULTI_V6_V7=y # end of Platform selection # CONFIG_ARCH_ASPEED is not set CONFIG_ARCH_BCM=y # # IPROC architected SoCs # # # KONA architected SoCs # # # Other Architectures # CONFIG_ARCH_BCM2835=y CONFIG_BCM2835_FAST_MEMCPY=y # # BCMBCA sub platforms # # CONFIG_ARCH_MXC is not set # # TI OMAP/AM/DM/DRA Family # # CONFIG_ARCH_OMAP2 is not set # end of TI OMAP/AM/DM/DRA Family # CONFIG_ARCH_OXNAS is not set # CONFIG_ARCH_S3C64XX is not set # CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_REALVIEW is not set # CONFIG_ARCH_WM8750 is not set # # Processor Type # CONFIG_CPU_V6K=y CONFIG_CPU_THUMB_CAPABLE=y CONFIG_CPU_32v6=y CONFIG_CPU_32v6K=y CONFIG_CPU_ABRT_EV6=y CONFIG_CPU_PABRT_V6=y CONFIG_CPU_CACHE_V6=y CONFIG_CPU_CACHE_VIPT=y CONFIG_CPU_COPY_V6=y CONFIG_CPU_TLB_V6=y CONFIG_CPU_HAS_ASID=y CONFIG_CPU_CP15=y CONFIG_CPU_CP15_MMU=y # # Processor Features # CONFIG_ARM_THUMB=y CONFIG_CPU_LITTLE_ENDIAN=y # CONFIG_CPU_BIG_ENDIAN is not set # CONFIG_CPU_ICACHE_DISABLE is not set # CONFIG_CPU_DCACHE_DISABLE is not set # CONFIG_CPU_BPREDICT_DISABLE is not set CONFIG_KUSER_HELPERS=y CONFIG_MIGHT_HAVE_CACHE_L2X0=y # CONFIG_CACHE_L2X0 is not set CONFIG_ARM_L1_CACHE_SHIFT=5 CONFIG_ARM_DMA_MEM_BUFFERABLE=y CONFIG_ARM_ERRATA_411920=y # end of System Type # # Bus support # # end of Bus support # # Kernel Features # CONFIG_CURRENT_POINTER_IN_TPIDRURO=y CONFIG_IRQSTACKS=y # CONFIG_VMSPLIT_3G is not set # CONFIG_VMSPLIT_3G_OPT is not set CONFIG_VMSPLIT_2G=y # CONFIG_VMSPLIT_1G is not set CONFIG_PAGE_OFFSET=0x80000000 CONFIG_ARCH_NR_GPIO=0 CONFIG_HZ_FIXED=0 # CONFIG_HZ_100 is not set # CONFIG_HZ_200 is not set # CONFIG_HZ_250 is not set CONFIG_HZ_300=y # CONFIG_HZ_500 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=300 CONFIG_SCHED_HRTICK=y CONFIG_AEABI=y # CONFIG_OABI_COMPAT is not set CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ARCH_FLATMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_ENABLE=y # CONFIG_HIGHMEM is not set # CONFIG_CPU_SW_DOMAIN_PAN is not set CONFIG_HW_PERF_EVENTS=y CONFIG_ARM_MODULE_PLTS=y CONFIG_ARCH_FORCE_MAX_ORDER=11 CONFIG_ALIGNMENT_TRAP=y CONFIG_UACCESS_WITH_MEMCPY=y # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set CONFIG_CC_HAVE_STACKPROTECTOR_TLS=y CONFIG_STACKPROTECTOR_PER_TASK=y # end of Kernel Features # # Boot options # CONFIG_USE_OF=y CONFIG_ATAGS=y # CONFIG_UNUSED_BOARD_FILES is not set # CONFIG_DEPRECATED_PARAM_STRUCT is not set CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_BSS=0x0 # CONFIG_ARM_APPENDED_DTB is not set CONFIG_CMDLINE="" # CONFIG_KEXEC is not set # CONFIG_CRASH_DUMP is not set CONFIG_AUTO_ZRELADDR=y # CONFIG_EFI is not set # end of Boot options # # CPU Power Management # # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y # CONFIG_CPU_FREQ_GOV_USERSPACE is not set CONFIG_CPU_FREQ_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y CONFIG_CPUFREQ_DT_PLATDEV=y CONFIG_ARM_RASPBERRYPI_CPUFREQ=y # end of CPU Frequency scaling # # CPU Idle # 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 # # CONFIG_ARM_CPUIDLE is not set # end of ARM CPU Idle Drivers # end of CPU Idle # end of CPU Power Management # # Floating point emulation # # # At least one emulation must be selected # CONFIG_VFP=y # end of Floating point emulation # # Power management options # # CONFIG_SUSPEND is not set # CONFIG_HIBERNATION is not set CONFIG_PM=y # CONFIG_PM_DEBUG is not set # CONFIG_APM_EMULATION is not set CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y # end of Power management options CONFIG_AS_VFP_VMRS_FPINST=y # # General architecture-dependent options # CONFIG_KPROBES=y CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set CONFIG_OPTPROBES=y CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_ARCH_USE_BUILTIN_BSWAP=y CONFIG_KRETPROBES=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_KEEPINITRD=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_CPU_FINALIZE_INIT=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_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_LTO_NONE=y CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_REL=y CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=8 CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y # CONFIG_STRICT_KERNEL_RWX is not set CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y # CONFIG_STRICT_MODULE_RWX is not set # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_HAVE_ARCH_PFN_VALID=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_GZIP is not set # CONFIG_MODULE_COMPRESS_XZ is not set # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLOCK_LEGACY_AUTOLOAD=y CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_ICQ=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set # CONFIG_BLK_DEV_THROTTLING is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_CGROUP_IOLATENCY is not set # CONFIG_BLK_CGROUP_IOCOST is not set # CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set CONFIG_LDM_PARTITION=y # CONFIG_LDM_DEBUG is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set # end of Partition Types CONFIG_BLK_PM=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y CONFIG_IOSCHED_BFQ=y # CONFIG_BFQ_GROUP_IOSCHED is not set # end of IO Schedulers CONFIG_ASN1=y CONFIG_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_INLINE_READ_UNLOCK=y CONFIG_INLINE_READ_UNLOCK_IRQ=y CONFIG_INLINE_WRITE_UNLOCK=y CONFIG_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_ELF_FDPIC is not set CONFIG_ELFCORE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y CONFIG_ARCH_HAS_BINFMT_FLAT=y # CONFIG_BINFMT_FLAT is not set CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # CONFIG_SWAP=y # CONFIG_ZSWAP is not set # # SLAB allocator options # # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set # CONFIG_SLUB_STATS is not set # end of SLAB allocator options # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set # CONFIG_COMPAT_BRK is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_ARCH_KEEP_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_COMPACTION=y CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 # CONFIG_PAGE_REPORTING is not set CONFIG_MIGRATION=y CONFIG_CONTIG_ALLOC=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_NEED_PER_CPU_KM=y CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set CONFIG_CMA_DEBUGFS=y # CONFIG_CMA_SYSFS is not set CONFIG_CMA_AREAS=7 CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set # CONFIG_ANON_VMA_NAME is not set # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set CONFIG_LOCK_MM_AND_FIND_VMA=y # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y CONFIG_NET_EGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set # CONFIG_XFRM_USER is not set # CONFIG_NET_KEY is not set # CONFIG_XDP_SOCKETS is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=m CONFIG_IP_MROUTE_COMMON=y CONFIG_IP_MROUTE=y # CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set # CONFIG_IP_PIMSM_V1 is not set # CONFIG_IP_PIMSM_V2 is not set # CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=m # CONFIG_INET_DIAG is not set CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set CONFIG_TCP_CONG_CUBIC=y # CONFIG_TCP_CONG_WESTWOOD is not set CONFIG_TCP_CONG_HTCP=m CONFIG_TCP_CONG_HSTCP=m # CONFIG_TCP_CONG_HYBLA is not set CONFIG_TCP_CONG_VEGAS=m # CONFIG_TCP_CONG_NV is not set CONFIG_TCP_CONG_SCALABLE=m # CONFIG_TCP_CONG_LP is not set CONFIG_TCP_CONG_VENO=m CONFIG_TCP_CONG_YEAH=m CONFIG_TCP_CONG_ILLINOIS=m # CONFIG_TCP_CONG_DCTCP is not set CONFIG_TCP_CONG_CDG=m # CONFIG_TCP_CONG_BBR is not set CONFIG_DEFAULT_CUBIC=y # CONFIG_DEFAULT_RENO is not set CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_IPV6_VTI is not set CONFIG_IPV6_SIT=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set CONFIG_IPV6_FOU=m # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set # CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # # CONFIG_NETFILTER_INGRESS is not set CONFIG_NETFILTER_EGRESS=y CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_FAMILY_BRIDGE=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set CONFIG_NETFILTER_NETLINK_LOG=m # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=m # CONFIG_NF_LOG_SYSLOG is not set # CONFIG_NF_CONNTRACK_MARK is not set # CONFIG_NF_CONNTRACK_ZONES is not set # CONFIG_NF_CONNTRACK_PROCFS is not set # CONFIG_NF_CONNTRACK_EVENTS is not set # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set # CONFIG_NF_CT_PROTO_DCCP is not set # CONFIG_NF_CT_PROTO_SCTP is not set # CONFIG_NF_CT_PROTO_UDPLITE is not set # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set CONFIG_NF_CONNTRACK_IRC=m CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set CONFIG_NF_CONNTRACK_SIP=m # CONFIG_NF_CONNTRACK_TFTP is not set CONFIG_NF_CT_NETLINK=m # CONFIG_NETFILTER_NETLINK_GLUE_CT is not set CONFIG_NF_NAT=m 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 # # Xtables combined modules # # CONFIG_NETFILTER_XT_MARK is not set # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set # CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set CONFIG_NETFILTER_XT_MATCH_IPRANGE=m # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set CONFIG_NETFILTER_XT_MATCH_OWNER=m # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set CONFIG_NETFILTER_XT_MATCH_STATE=m # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set CONFIG_NF_REJECT_IPV4=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set # CONFIG_IP_NF_TARGET_REDIRECT is not set CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_ARPTABLES is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m # CONFIG_NF_LOG_IPV6 is not set CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_MATCH_SRH is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set CONFIG_IP6_NF_NAT=m # CONFIG_IP6_NF_TARGET_MASQUERADE is not set # CONFIG_IP6_NF_TARGET_NPT is not set # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_CONNTRACK_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y # CONFIG_BRIDGE_VLAN_FILTERING is not set # CONFIG_BRIDGE_MRP is not set # CONFIG_BRIDGE_CFM is not set # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set CONFIG_NET_SCH_FQ_CODEL=y # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set # CONFIG_NET_SCH_DEFAULT is not set # # Classification # # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_FLOW is not set # CONFIG_NET_CLS_CGROUP is not set # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set # CONFIG_NET_L3_MASTER_DEV is not set # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set # CONFIG_CGROUP_NET_PRIO is not set # CONFIG_CGROUP_NET_CLASSID is not set CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_STREAM_PARSER is not set # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # end of Network testing # end of Networking options # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=m CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y # CONFIG_BT_BNEP is not set CONFIG_BT_HIDP=m CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_LEDS is not set # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set # CONFIG_BT_DEBUGFS is not set # CONFIG_BT_SELFTEST is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_MTK=m CONFIG_BT_HCIBTUSB=m # CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set CONFIG_BT_HCIBTUSB_BCM=y CONFIG_BT_HCIBTUSB_MTK=y CONFIG_BT_HCIBTUSB_RTL=y # CONFIG_BT_HCIBTSDIO is not set 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 is not set # CONFIG_BT_HCIUART_ATH3K is not set # CONFIG_BT_HCIUART_LL is not set CONFIG_BT_HCIUART_3WIRE=y # CONFIG_BT_HCIUART_INTEL is not set CONFIG_BT_HCIUART_BCM=y # CONFIG_BT_HCIUART_RTL is not set # CONFIG_BT_HCIUART_QCA is not set # CONFIG_BT_HCIUART_AG6XX is not set # CONFIG_BT_HCIUART_MRVL is not set CONFIG_BT_HCIBCM203X=m # CONFIG_BT_HCIBPA10X is not set CONFIG_BT_HCIBFUSB=m # CONFIG_BT_HCIVHCI is not set # CONFIG_BT_MRVL is not set CONFIG_BT_ATH3K=m CONFIG_BT_MTKSDIO=m # CONFIG_BT_MTKUART is not set # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set # CONFIG_CFG80211_CRDA_SUPPORT is not set CONFIG_CFG80211_WEXT=y CONFIG_LIB80211=m CONFIG_LIB80211_CRYPT_WEP=m CONFIG_LIB80211_CRYPT_CCMP=m # CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=m CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_PAGE_POOL=y # CONFIG_PAGE_POOL_STATS is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y # # Device Drivers # CONFIG_ARM_AMBA=y CONFIG_HAVE_PCI=y # CONFIG_PCI is not set # CONFIG_PCCARD is not set # # Generic Driver Options # # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y # CONFIG_DEVTMPFS_SAFE is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set # CONFIG_FW_UPLOAD is not set # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y # CONFIG_ALLOW_DEV_COREDUMP is not set # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=m CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set # end of Generic Driver Options # # Bus devices # # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_MOXTET is not set # CONFIG_VEXPRESS_CONFIG is not set # CONFIG_MHI_BUS is not set # CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # # CONFIG_ARM_SCMI_PROTOCOL is not set # end of ARM System Control and Management Interface Protocol # CONFIG_ARM_SCPI_PROTOCOL is not set # CONFIG_FIRMWARE_MEMMAP is not set CONFIG_RASPBERRYPI_FIRMWARE=y # CONFIG_FW_CFG_SYSFS is not set CONFIG_CS_DSP=m # CONFIG_GOOGLE_FIRMWARE is not set # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set # CONFIG_MTD is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_DYNAMIC=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_RESERVED_MEM=y CONFIG_OF_RESOLVE=y CONFIG_OF_OVERLAY=y CONFIG_OF_CONFIGFS=y CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_CDROM=y # CONFIG_ZRAM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=0 # CONFIG_BLK_DEV_DRBD is not set CONFIG_BLK_DEV_NBD=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=4096 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_UBLK is not set # # NVME Support # # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set # CONFIG_NVME_TARGET is not set # end of NVME Support # # Misc devices # CONFIG_BCM2835_SMI=m # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set # CONFIG_XILINX_SDFEC is not set CONFIG_MISC_RTSX=y # CONFIG_OPEN_DICE is not set # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # CONFIG_ECHO is not set CONFIG_MISC_RTSX_USB=y # CONFIG_PVPANIC is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=m CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_SCAN_ASYNC is not set # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set CONFIG_SCSI_ISCSI_ATTRS=y # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports CONFIG_SCSI_LOWLEVEL=y CONFIG_ISCSI_TCP=y CONFIG_ISCSI_BOOT_SYSFS=y # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_DH is not set # end of SCSI device support # CONFIG_ATA is not set # CONFIG_MD is not set # CONFIG_TARGET_CORE is not set CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set CONFIG_WIREGUARD=m # CONFIG_WIREGUARD_DEBUG is not set # CONFIG_EQUALIZER is not set # CONFIG_NET_TEAM is not set CONFIG_MACVLAN=m # CONFIG_MACVTAP is not set # CONFIG_IPVLAN is not set # CONFIG_VXLAN is not set # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_AMT is not set # CONFIG_MACSEC is not set CONFIG_NETCONSOLE=y CONFIG_NETCONSOLE_DYNAMIC=y CONFIG_NETPOLL=y CONFIG_NET_POLL_CONTROLLER=y CONFIG_TUN=y # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m CONFIG_NLMON=m # CONFIG_ETHERNET is not set CONFIG_PHYLINK=m CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_SFP is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_ADIN_PHY is not set # CONFIG_ADIN1100_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=m # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM54140_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set # CONFIG_MAXLINEAR_GPHY is not set # CONFIG_MEDIATEK_GE_PHY is not set # CONFIG_MICREL_PHY is not set CONFIG_MICROCHIP_PHY=y # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set # CONFIG_MOTORCOMM_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_QSEMI_PHY is not set # CONFIG_REALTEK_PHY is not set # CONFIG_RENESAS_PHY is not set # CONFIG_ROCKCHIP_PHY is not set CONFIG_SMSC_PHY=y # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_DP83TD510_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set # CONFIG_PSE_CONTROLLER is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_OF_MDIO=y CONFIG_MDIO_DEVRES=y # CONFIG_MDIO_BITBANG is not set # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_IPQ4019 is not set # # MDIO Multiplexers # # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # # PCS device drivers # # end of PCS device drivers CONFIG_PPP=m CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set CONFIG_PPP_MPPE=m # CONFIG_PPP_MULTILINK is not set CONFIG_PPPOE=m CONFIG_PPP_ASYNC=m # CONFIG_PPP_SYNC_TTY is not set # CONFIG_SLIP is not set CONFIG_SLHC=m CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set # CONFIG_USB_RTL8150 is not set CONFIG_USB_RTL8152=m CONFIG_USB_LAN78XX=y CONFIG_USB_USBNET=y CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m # CONFIG_USB_NET_CDC_EEM is not set # CONFIG_USB_NET_CDC_NCM is not set # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set CONFIG_USB_NET_DM9601=m # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=y # CONFIG_USB_NET_GL620A is not set # CONFIG_USB_NET_NET1080 is not set # CONFIG_USB_NET_PLUSB is not set CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m # CONFIG_USB_NET_CDC_SUBSET is not set # CONFIG_USB_NET_ZAURUS is not set # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set CONFIG_USB_HSO=m # CONFIG_USB_NET_INT51X1 is not set CONFIG_USB_IPHETH=m # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m CONFIG_ATH9K_AHB=y # CONFIG_ATH9K_DEBUGFS is not set # CONFIG_ATH9K_DYNACK is not set # CONFIG_ATH9K_WOW is not set CONFIG_ATH9K_RFKILL=y CONFIG_ATH9K_CHANNEL_CONTEXT=y CONFIG_ATH9K_PCOEM=y CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_ATH9K_HWRNG=y CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y CONFIG_CARL9170_HWRNG=y CONFIG_ATH6KL=m # CONFIG_ATH6KL_SDIO is not set CONFIG_ATH6KL_USB=m # CONFIG_ATH6KL_DEBUG is not set # CONFIG_ATH6KL_TRACING is not set CONFIG_AR5523=m # CONFIG_ATH10K is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set CONFIG_WLAN_VENDOR_ATMEL=y # CONFIG_AT76C50X_USB is not set CONFIG_WLAN_VENDOR_BROADCOM=y CONFIG_B43=m CONFIG_B43_BCMA=y CONFIG_B43_SSB=y CONFIG_B43_BUSES_BCMA_AND_SSB=y # CONFIG_B43_BUSES_BCMA is not set # CONFIG_B43_BUSES_SSB is not set # CONFIG_B43_SDIO is not set CONFIG_B43_BCMA_PIO=y CONFIG_B43_PIO=y CONFIG_B43_PHY_G=y CONFIG_B43_PHY_N=y CONFIG_B43_PHY_LP=y CONFIG_B43_PHY_HT=y CONFIG_B43_LEDS=y CONFIG_B43_HWRNG=y # CONFIG_B43_DEBUG is not set # CONFIG_B43LEGACY is not set CONFIG_BRCMUTIL=m # CONFIG_BRCMSMAC is not set CONFIG_BRCMFMAC=m CONFIG_BRCMFMAC_PROTO_BCDC=y CONFIG_BRCMFMAC_SDIO=y CONFIG_BRCMFMAC_USB=y # CONFIG_BRCM_TRACING is not set # CONFIG_BRCMDBG is not set CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_HOSTAP is not set CONFIG_P54_COMMON=m CONFIG_P54_USB=m # CONFIG_P54_SPI is not set CONFIG_P54_LEDS=y CONFIG_WLAN_VENDOR_MARVELL=y # CONFIG_LIBERTAS is not set # CONFIG_LIBERTAS_THINFIRM is not set # CONFIG_MWIFIEX is not set CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m CONFIG_MT76_CORE=m CONFIG_MT76_LEDS=y CONFIG_MT76_USB=m CONFIG_MT76x02_LIB=m CONFIG_MT76x02_USB=m CONFIG_MT76_CONNAC_LIB=m CONFIG_MT76x0_COMMON=m CONFIG_MT76x0U=m CONFIG_MT76x2_COMMON=m CONFIG_MT76x2U=m CONFIG_MT7615_COMMON=m CONFIG_MT7663_USB_SDIO_COMMON=m CONFIG_MT7663U=m # CONFIG_MT7663S is not set # CONFIG_MT7921S is not set # CONFIG_MT7921U is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set CONFIG_WLAN_VENDOR_PURELIFI=y # CONFIG_PLFXLC is not set CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WLAN_VENDOR_REALTEK=y CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y CONFIG_RTL_CARDS=m # CONFIG_RTL8192CU is not set CONFIG_RTL8XXXU=m CONFIG_RTL8XXXU_UNTESTED=y CONFIG_RTW88=m # CONFIG_RTW89 is not set CONFIG_WLAN_VENDOR_RSI=y # CONFIG_RSI_91X is not set CONFIG_WLAN_VENDOR_SILABS=y # CONFIG_WFX is not set CONFIG_WLAN_VENDOR_ST=y # CONFIG_CW1200 is not set CONFIG_WLAN_VENDOR_TI=y # CONFIG_WL1251 is not set # CONFIG_WL12XX is not set # CONFIG_WL18XX is not set # CONFIG_WLCORE is not set CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_USB_ZD1201=m CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set # CONFIG_WLAN_VENDOR_QUANTENNA is not set # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y # CONFIG_INPUT_MOUSEDEV_PSAUX is not set CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set # CONFIG_KEYBOARD_ATKBD is not set # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=m # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_PINEPHONE is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set # CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set # CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y CONFIG_JOYSTICK_PSXPAD_SPI=m CONFIG_JOYSTICK_PSXPAD_SPI_FF=y # CONFIG_JOYSTICK_PXRC is not set # CONFIG_JOYSTICK_QWIIC is not set # CONFIG_JOYSTICK_FSIA6B is not set # CONFIG_JOYSTICK_SENSEHAT is not set # CONFIG_JOYSTICK_RPISENSE is not set # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_ADS7846=m # CONFIG_TOUCHSCREEN_AD7877 is not set # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_AR1021_I2C is not set # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_BU21029 is not set # CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set # CONFIG_TOUCHSCREEN_CY8CTMA140 is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set CONFIG_TOUCHSCREEN_EGALAX=m # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set # CONFIG_TOUCHSCREEN_EXC3000 is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_HIDEEP is not set # CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_ILITEK is not set # CONFIG_TOUCHSCREEN_S6SY761 is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set # CONFIG_TOUCHSCREEN_ELAN is not set # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MSG2638 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_IMAGIS is not set # CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set CONFIG_TOUCHSCREEN_EDT_FT5X06=m CONFIG_TOUCHSCREEN_RASPBERRYPI_FW=m # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set CONFIG_TOUCHSCREEN_USB_COMPOSITE=m CONFIG_TOUCHSCREEN_USB_EGALAX=y # CONFIG_TOUCHSCREEN_USB_PANJIT is not set CONFIG_TOUCHSCREEN_USB_3M=y # CONFIG_TOUCHSCREEN_USB_ITM is not set # CONFIG_TOUCHSCREEN_USB_ETURBO is not set # CONFIG_TOUCHSCREEN_USB_GUNZE is not set # CONFIG_TOUCHSCREEN_USB_DMC_TSC10 is not set # CONFIG_TOUCHSCREEN_USB_IRTOUCH is not set # CONFIG_TOUCHSCREEN_USB_IDEALTEK is not set # CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH is not set # CONFIG_TOUCHSCREEN_USB_GOTOP is not set # CONFIG_TOUCHSCREEN_USB_JASTEC is not set # CONFIG_TOUCHSCREEN_USB_ELO is not set # CONFIG_TOUCHSCREEN_USB_E2I is not set # CONFIG_TOUCHSCREEN_USB_ZYTRONIC is not set # CONFIG_TOUCHSCREEN_USB_ETT_TC45USB is not set # CONFIG_TOUCHSCREEN_USB_NEXIO is not set # CONFIG_TOUCHSCREEN_USB_EASYTOUCH is not set # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2004 is not set # CONFIG_TOUCHSCREEN_TSC2005 is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_RM_TS is not set # CONFIG_TOUCHSCREEN_SILEAD is not set # CONFIG_TOUCHSCREEN_SIS_I2C is not set CONFIG_TOUCHSCREEN_ST1232=m # CONFIG_TOUCHSCREEN_STMFTS is not set # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set # CONFIG_TOUCHSCREEN_SX8654 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZET6223 is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_IQS5XX is not set # CONFIG_TOUCHSCREEN_ZINITIX is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ARIZONA_HAPTICS is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set CONFIG_INPUT_GPIO_ROTARY_ENCODER=m # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_INPUT_RASPBERRYPI_BUTTON is not set CONFIG_RMI4_CORE=y # CONFIG_RMI4_I2C is not set # CONFIG_RMI4_SPI is not set # CONFIG_RMI4_SMB is not set CONFIG_RMI4_F03=y CONFIG_RMI4_F03_SERIO=y CONFIG_RMI4_2D_SENSOR=y CONFIG_RMI4_F11=y CONFIG_RMI4_F12=y CONFIG_RMI4_F30=y # CONFIG_RMI4_F34 is not set # CONFIG_RMI4_F3A is not set # CONFIG_RMI4_F55 is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_AMBAKMI is not set # CONFIG_SERIO_LIBPS2 is not set # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_SERIO_GPIO_PS2 is not set # CONFIG_USERIO is not set # CONFIG_GAMEPORT is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_BRCM_CHAR_DRIVERS=y CONFIG_BCM2708_VCMEM=y CONFIG_BCM_VCIO=y CONFIG_BCM2835_SMI_DEV=m # CONFIG_RPIVID_MEM is not set CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y # CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set CONFIG_SERIAL_8250_16550A_VARIANTS=y # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y # CONFIG_SERIAL_8250_DMA is not set CONFIG_SERIAL_8250_NR_UARTS=1 CONFIG_SERIAL_8250_RUNTIME_UARTS=0 CONFIG_SERIAL_8250_EXTENDED=y # CONFIG_SERIAL_8250_MANY_PORTS is not set CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_RSA is not set CONFIG_SERIAL_8250_BCM2835AUX=y CONFIG_SERIAL_8250_FSL=y # CONFIG_SERIAL_8250_DW is not set # CONFIG_SERIAL_8250_RT288X is not set CONFIG_SERIAL_OF_PLATFORM=y # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_SIFIVE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_ST_ASC is not set # CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_NULL_TTY is not set # CONFIG_HVC_DCC is not set CONFIG_SERIAL_DEV_BUS=y CONFIG_SERIAL_DEV_CTRL_TTYPORT=y # CONFIG_TTY_PRINTK is not set # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_BA431 is not set CONFIG_HW_RANDOM_BCM2835=y CONFIG_HW_RANDOM_IPROC_RNG200=y # CONFIG_HW_RANDOM_CCTRNG is not set # CONFIG_HW_RANDOM_XIPHERA is not set CONFIG_DEVMEM=y # CONFIG_TCG_TPM is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y CONFIG_RANDOM_TRUST_BOOTLOADER=y CONFIG_RASPBERRYPI_GPIOMEM=y # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y # CONFIG_I2C_COMPAT is not set CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_GPMUX is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set CONFIG_I2C_MUX_PINCTRL=y # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_DEMUX_PINCTRL is not set # CONFIG_I2C_MUX_MLXCPLD is not set # end of Multiplexer I2C Chip support CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # CONFIG_I2C_BCM2708=y CONFIG_I2C_BCM2708_BAUDRATE=100000 # # I2C system bus drivers (mostly embedded / system-on-chip) # CONFIG_I2C_BCM2835=y # CONFIG_I2C_BRCMSTB is not set # CONFIG_I2C_CBUS_GPIO is not set # CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_EMEV2 is not set CONFIG_I2C_GPIO=y # CONFIG_I2C_GPIO_FAULT_INJECTOR is not set # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_RK3X is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y # CONFIG_SPI_MEM is not set # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set CONFIG_SPI_BCM2835=m CONFIG_SPI_BCM2835AUX=m # CONFIG_SPI_BCM_QSPI is not set # CONFIG_SPI_BITBANG is not set # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_CADENCE_QUADSPI 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_MICROCHIP_CORE is not set # CONFIG_SPI_MICROCHIP_CORE_QSPI is not set # CONFIG_SPI_OC_TINY is not set # CONFIG_SPI_PL022 is not set # CONFIG_SPI_ROCKCHIP is not set # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_SIFIVE is not set # CONFIG_SPI_MXIC is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_AMD is not set # # SPI Multiplexer support # # CONFIG_SPI_MUX is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=y # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set CONFIG_SPI_DYNAMIC=y # CONFIG_SPMI is not set # CONFIG_HSI is not set # CONFIG_PPS is not set # # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # # end of PTP clock support CONFIG_PINCTRL=y CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_CY8C95X0 is not set # CONFIG_PINCTRL_MCP23S08 is not set # CONFIG_PINCTRL_MICROCHIP_SGPIO is not set # CONFIG_PINCTRL_OCELOT is not set # CONFIG_PINCTRL_SINGLE is not set # CONFIG_PINCTRL_STMFX is not set # CONFIG_PINCTRL_SX150X is not set # CONFIG_PINCTRL_RP1 is not set # CONFIG_PINCTRL_BCM2712 is not set CONFIG_PINCTRL_BCM2835=y # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y CONFIG_GPIO_CDEV=y CONFIG_GPIO_CDEV_V1=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set CONFIG_GPIO_RASPBERRYPI_EXP=y CONFIG_GPIO_BCM_VIRT=y # CONFIG_GPIO_BRCMSTB is not set # CONFIG_GPIO_CADENCE is not set # CONFIG_GPIO_DWAPB is not set # CONFIG_GPIO_FTGPIO010 is not set # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HLWD is not set # CONFIG_GPIO_MB86S7X is not set # CONFIG_GPIO_MPC8XXX is not set # CONFIG_GPIO_PL061 is not set # CONFIG_GPIO_PWM is not set # CONFIG_GPIO_SIFIVE is not set # CONFIG_GPIO_XILINX is not set # CONFIG_GPIO_ZEVIO is not set # CONFIG_GPIO_AMD_FCH is not set # end of Memory mapped GPIO drivers # # I2C GPIO expanders # # 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 # CONFIG_GPIO_PCA9570 is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # CONFIG_GPIO_ARIZONA=m # CONFIG_HTC_EGPIO is not set CONFIG_GPIO_FSM=m # end of MFD GPIO expanders # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # end of SPI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers CONFIG_W1=m # # 1-wire Bus Masters # # CONFIG_W1_MASTER_DS2490 is not set # CONFIG_W1_MASTER_DS2482 is not set # CONFIG_W1_MASTER_DS1WM is not set CONFIG_W1_MASTER_GPIO=m # CONFIG_W1_MASTER_SGI is not set # end of 1-wire Bus Masters # # 1-wire Slaves # CONFIG_W1_SLAVE_THERM=m # CONFIG_W1_SLAVE_SMEM is not set # CONFIG_W1_SLAVE_DS2405 is not set # CONFIG_W1_SLAVE_DS2408 is not set # CONFIG_W1_SLAVE_DS2413 is not set # CONFIG_W1_SLAVE_DS2406 is not set # CONFIG_W1_SLAVE_DS2423 is not set # CONFIG_W1_SLAVE_DS2805 is not set # CONFIG_W1_SLAVE_DS2430 is not set # CONFIG_W1_SLAVE_DS2431 is not set # CONFIG_W1_SLAVE_DS2433 is not set # CONFIG_W1_SLAVE_DS2438 is not set # CONFIG_W1_SLAVE_DS250X is not set # CONFIG_W1_SLAVE_DS2780 is not set # CONFIG_W1_SLAVE_DS2781 is not set # CONFIG_W1_SLAVE_DS28E04 is not set # CONFIG_W1_SLAVE_DS28E17 is not set # end of 1-wire Slaves CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_BRCMKONA is not set CONFIG_POWER_RESET_GPIO=y CONFIG_POWER_RESET_GPIO_RESTART=y # CONFIG_POWER_RESET_LTC2952 is not set # CONFIG_POWER_RESET_REGULATOR is not set CONFIG_POWER_RESET_RESTART=y # CONFIG_POWER_RESET_SYSCON is not set # CONFIG_POWER_RESET_SYSCON_POWEROFF is not set # CONFIG_NVMEM_REBOOT_MODE is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y CONFIG_RPI_POE_POWER=m # CONFIG_PDA_POWER is not set # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2760 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_BATTERY_MAX1721X is not set # CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set # CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_UCS1002 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set CONFIG_SENSORS_GPIO_FAN=m # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX31730 is not set # CONFIG_SENSORS_MAX31760 is not set # CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_NZXT_KRAKEN2 is not set # CONFIG_SENSORS_NZXT_SMART2 is not set # CONFIG_SENSORS_OCC_P8_I2C is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set CONFIG_SENSORS_PWM_FAN=m CONFIG_SENSORS_RASPBERRYPI_HWMON=y # CONFIG_SENSORS_SBTSI is not set # CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y # CONFIG_THERMAL_WRITABLE_TRIPS is not set CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set # CONFIG_CPU_THERMAL is not set # CONFIG_THERMAL_EMULATION is not set # CONFIG_THERMAL_MMIO is not set # # Broadcom thermal drivers # CONFIG_BCM2835_THERMAL=y # end of Broadcom thermal drivers CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 # CONFIG_WATCHDOG_SYSFS is not set # CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_FTWDT010_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set # CONFIG_MAX63XX_WATCHDOG is not set CONFIG_BCM2835_WDT=y # CONFIG_MEN_A21_WDT is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y CONFIG_SSB=m CONFIG_SSB_BLOCKIO=y CONFIG_SSB_SDIOHOST_POSSIBLE=y # CONFIG_SSB_SDIOHOST is not set # CONFIG_SSB_DRIVER_GPIO is not set CONFIG_BCMA_POSSIBLE=y CONFIG_BCMA=m CONFIG_BCMA_BLOCKIO=y # CONFIG_BCMA_HOST_SOC is not set CONFIG_BCMA_DRIVER_GMAC_CMN=y # CONFIG_BCMA_DRIVER_GPIO is not set # CONFIG_BCMA_DEBUG is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_RPISENSE_CORE is not set # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set # CONFIG_MFD_ASIC3 is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_GATEWORKS_GSC is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77620 is not set # CONFIG_MFD_MAX77650 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77714 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_OCELOT is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_CPCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_NTXEC is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_PM8XXX is not set # CONFIG_MFD_SY7636A is not set CONFIG_MFD_RASPBERRYPI_POE_HAT=m # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_RK808 is not set # CONFIG_MFD_RN5T618 is not set # CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set CONFIG_MFD_SIMPLE_MFD_I2C=m # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_STMPE is not set # CONFIG_MFD_SYSCON is not set # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TC3589X is not set # 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=m CONFIG_MFD_ARIZONA_I2C=m CONFIG_MFD_ARIZONA_SPI=m # CONFIG_MFD_CS47L24 is not set CONFIG_MFD_WM5102=y # CONFIG_MFD_WM5110 is not set # CONFIG_MFD_WM8997 is not set # CONFIG_MFD_WM8998 is not set # CONFIG_MFD_WM8400 is not set # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ROHM_BD718XX is not set # CONFIG_MFD_ROHM_BD71828 is not set # CONFIG_MFD_ROHM_BD957XMUF is not set # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_MFD_QCOM_PM8008 is not set # CONFIG_RAVE_SP_CORE is not set # CONFIG_MFD_INTEL_M10_BMC is not set # CONFIG_MFD_RSMU_I2C is not set # CONFIG_MFD_RSMU_SPI is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set CONFIG_REGULATOR_ARIZONA_LDO1=m CONFIG_REGULATOR_ARIZONA_MICSUPP=m # CONFIG_REGULATOR_DA9121 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set # CONFIG_REGULATOR_FAN53880 is not set # CONFIG_REGULATOR_GPIO is not set # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MAX20086 is not set # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MCP16502 is not set # CONFIG_REGULATOR_MP5416 is not set # CONFIG_REGULATOR_MP8859 is not set # CONFIG_REGULATOR_MP886X is not set # CONFIG_REGULATOR_MPQ7920 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PF8X00 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set # CONFIG_REGULATOR_PWM is not set CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY=y # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_SY8106A is not set # CONFIG_REGULATOR_SY8824X is not set # CONFIG_REGULATOR_SY8827N is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS6286X is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_VCTRL is not set CONFIG_RC_CORE=y CONFIG_BPF_LIRC_MODE2=y CONFIG_LIRC=y CONFIG_RC_MAP=m CONFIG_RC_DECODERS=y CONFIG_IR_IMON_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_MCE_KBD_DECODER=m CONFIG_IR_NEC_DECODER=m CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m CONFIG_IR_RCMM_DECODER=m CONFIG_IR_SANYO_DECODER=m CONFIG_IR_SHARP_DECODER=m CONFIG_IR_SONY_DECODER=m CONFIG_IR_XMP_DECODER=m CONFIG_RC_DEVICES=y CONFIG_IR_GPIO_CIR=m CONFIG_IR_GPIO_TX=m # CONFIG_IR_HIX5HD2 is not set CONFIG_IR_IGORPLUGUSB=m CONFIG_IR_IGUANA=m CONFIG_IR_IMON=m CONFIG_IR_IMON_RAW=m CONFIG_IR_MCEUSB=m CONFIG_IR_PWM_TX=m CONFIG_IR_REDRAT3=m # CONFIG_IR_SERIAL is not set # CONFIG_IR_SPI is not set CONFIG_IR_STREAMZAP=m CONFIG_IR_TOY=m CONFIG_IR_TTUSBIR=m CONFIG_RC_ATI_REMOTE=m # CONFIG_RC_LOOPBACK is not set CONFIG_RC_XBOX_DVD=m CONFIG_CEC_CORE=y # # CEC support # # CONFIG_MEDIA_CEC_RC is not set # CONFIG_MEDIA_CEC_SUPPORT is not set # end of CEC support CONFIG_MEDIA_SUPPORT=m # CONFIG_MEDIA_SUPPORT_FILTER is not set CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y CONFIG_MEDIA_RADIO_SUPPORT=y CONFIG_MEDIA_SDR_SUPPORT=y CONFIG_MEDIA_PLATFORM_SUPPORT=y CONFIG_MEDIA_TEST_SUPPORT=y # end of Media device types # # Media core support # CONFIG_VIDEO_DEV=m CONFIG_MEDIA_CONTROLLER=y CONFIG_DVB_CORE=m # end of Media core support # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y CONFIG_VIDEO_V4L2_SUBDEV_API=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_VIDEO_TUNER=m CONFIG_V4L2_MEM2MEM_DEV=m # CONFIG_V4L2_FLASH_LED_CLASS is not set CONFIG_V4L2_FWNODE=m CONFIG_V4L2_ASYNC=m # end of Video4Linux options # # Media controller options # CONFIG_MEDIA_CONTROLLER_DVB=y # end of Media controller options # # Digital TV options # # CONFIG_DVB_MMAP is not set CONFIG_DVB_NET=y CONFIG_DVB_MAX_ADAPTERS=8 # CONFIG_DVB_DYNAMIC_MINORS is not set # CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set # CONFIG_DVB_ULE_DEBUG is not set # end of Digital TV options # # Media drivers # # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_USB_S2255 is not set CONFIG_VIDEO_USBTV=m CONFIG_USB_VIDEO_CLASS=m # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set # # Analog TV USB devices # # CONFIG_VIDEO_GO7007 is not set CONFIG_VIDEO_HDPVR=m CONFIG_VIDEO_PVRUSB2=m CONFIG_VIDEO_PVRUSB2_SYSFS=y CONFIG_VIDEO_PVRUSB2_DVB=y # CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set CONFIG_VIDEO_STK1160_COMMON=m CONFIG_VIDEO_STK1160=m # # Analog/digital TV USB devices # CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_AU0828_V4L2=y CONFIG_VIDEO_AU0828_RC=y CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y # CONFIG_VIDEO_CX231XX_ALSA is not set CONFIG_VIDEO_CX231XX_DVB=m # # Digital TV USB devices # CONFIG_DVB_AS102=m CONFIG_DVB_B2C2_FLEXCOP_USB=m # CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set CONFIG_DVB_USB_V2=m CONFIG_DVB_USB_AF9015=m CONFIG_DVB_USB_AF9035=m CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_AZ6007=m CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_DVBSKY=m CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_GL861=m CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m CONFIG_DVB_USB_ZD1301=m CONFIG_DVB_USB=m # CONFIG_DVB_USB_DEBUG is not set CONFIG_DVB_USB_A800=m CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_CXUSB=m # CONFIG_DVB_USB_CXUSB_ANALOG is not set CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_DIB3000MC=m CONFIG_DVB_USB_DIBUSB_MB=m CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y CONFIG_DVB_USB_DIBUSB_MC=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_DTT200U=m CONFIG_DVB_USB_DTV5100=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_GP8PSK=m CONFIG_DVB_USB_M920X=m CONFIG_DVB_USB_NOVA_T_USB2=m CONFIG_DVB_USB_OPERA1=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_TTUSB2=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_VP7045=m CONFIG_SMS_USB_DRV=m # # Webcam, TV (analog/digital) USB devices # CONFIG_VIDEO_EM28XX=m # CONFIG_VIDEO_EM28XX_V4L2 is not set # CONFIG_VIDEO_EM28XX_ALSA is not set CONFIG_VIDEO_EM28XX_DVB=m CONFIG_VIDEO_EM28XX_RC=m # # Software defined radio USB devices # # CONFIG_USB_AIRSPY is not set # CONFIG_USB_HACKRF is not set # CONFIG_USB_MSI2500 is not set # CONFIG_RADIO_ADAPTERS is not set CONFIG_MEDIA_PLATFORM_DRIVERS=y # CONFIG_V4L_PLATFORM_DRIVERS is not set # CONFIG_SDR_PLATFORM_DRIVERS is not set # CONFIG_DVB_PLATFORM_DRIVERS is not set # CONFIG_V4L_MEM2MEM_DRIVERS is not set # # Allegro DVT media platform drivers # # # Amlogic media platform drivers # # # Amphion drivers # # # Aspeed media platform drivers # # # Atmel media platform drivers # # CONFIG_VIDEO_BCM2835_UNICAM is not set # # Cadence media platform drivers # # CONFIG_VIDEO_CADENCE_CSI2RX is not set # CONFIG_VIDEO_CADENCE_CSI2TX is not set # # Chips&Media media platform drivers # # # Intel media platform drivers # # # Marvell media platform drivers # # # Mediatek media platform drivers # # # NVidia media platform drivers # # # NXP media platform drivers # # # Qualcomm media platform drivers # # # Raspberry Pi media platform drivers # # CONFIG_VIDEO_RASPBERRYPI_PISP_BE is not set # CONFIG_VIDEO_RP1_CFE is not set # # Renesas media platform drivers # # # Rockchip media platform drivers # # # Samsung media platform drivers # # # STMicroelectronics media platform drivers # # # Sunxi media platform drivers # # # Texas Instruments drivers # # # Verisilicon media platform drivers # # # VIA media platform drivers # # # Xilinx media platform drivers # # # MMC/SDIO DVB adapters # CONFIG_SMS_SDIO_DRV=m # CONFIG_V4L_TEST_DRIVERS is not set # CONFIG_DVB_TEST_DRIVERS is not set CONFIG_MEDIA_COMMON_OPTIONS=y # # common driver options # CONFIG_CYPRESS_FIRMWARE=m CONFIG_TTPCI_EEPROM=m CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_SMS_SIANO_MDTV=m CONFIG_SMS_SIANO_RC=y # CONFIG_SMS_SIANO_DEBUGFS is not set CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_DMA_CONTIG=m CONFIG_VIDEOBUF2_VMALLOC=m # end of Media drivers # # Media ancillary drivers # CONFIG_MEDIA_ATTACH=y # # IR I2C driver auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_IR_I2C=m CONFIG_VIDEO_CAMERA_SENSOR=y # CONFIG_VIDEO_AR0521 is not set # CONFIG_VIDEO_ARDUCAM_64MP is not set # CONFIG_VIDEO_ARDUCAM_PIVARIETY is not set # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_HI846 is not set # CONFIG_VIDEO_HI847 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX296 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_IMX412 is not set # CONFIG_VIDEO_IMX477 is not set # CONFIG_VIDEO_IMX519 is not set # CONFIG_VIDEO_IMX708 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set # CONFIG_VIDEO_MT9V011 is not set # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set # CONFIG_VIDEO_OV2311 is not set # CONFIG_VIDEO_OV2640 is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5693 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV64A40 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV7251 is not set # CONFIG_VIDEO_OV7640 is not set # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9282 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_M5MOLS is not set # # Lens drivers # # CONFIG_VIDEO_AD5398 is not set # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_BU64754 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # Audio decoders, processors and mixers # # CONFIG_VIDEO_CS3308 is not set # CONFIG_VIDEO_CS5345 is not set CONFIG_VIDEO_CS53L32A=m CONFIG_VIDEO_MSP3400=m # CONFIG_VIDEO_SONY_BTF_MPX is not set # CONFIG_VIDEO_TDA1997X is not set # CONFIG_VIDEO_TDA7432 is not set # CONFIG_VIDEO_TDA9840 is not set # CONFIG_VIDEO_TEA6415C is not set # CONFIG_VIDEO_TEA6420 is not set # CONFIG_VIDEO_TLV320AIC23B is not set # CONFIG_VIDEO_TVAUDIO is not set # CONFIG_VIDEO_UDA1342 is not set # CONFIG_VIDEO_VP27SMPX is not set # CONFIG_VIDEO_WM8739 is not set CONFIG_VIDEO_WM8775=m # end of Audio decoders, processors and mixers # # RDS decoders # # CONFIG_VIDEO_SAA6588 is not set # end of RDS decoders # # Video decoders # # CONFIG_VIDEO_ADV7180 is not set # CONFIG_VIDEO_ADV7183 is not set # CONFIG_VIDEO_ADV748X is not set # CONFIG_VIDEO_ADV7604 is not set # CONFIG_VIDEO_ADV7842 is not set # CONFIG_VIDEO_BT819 is not set # CONFIG_VIDEO_BT856 is not set # CONFIG_VIDEO_BT866 is not set # CONFIG_VIDEO_ISL7998X is not set # CONFIG_VIDEO_KS0127 is not set # CONFIG_VIDEO_MAX9286 is not set # CONFIG_VIDEO_ML86V7667 is not set # CONFIG_VIDEO_SAA7110 is not set CONFIG_VIDEO_SAA711X=m # CONFIG_VIDEO_TC358743 is not set # CONFIG_VIDEO_TVP514X is not set # CONFIG_VIDEO_TVP5150 is not set # CONFIG_VIDEO_TVP7002 is not set # CONFIG_VIDEO_TW2804 is not set # CONFIG_VIDEO_OV9281 is not set # CONFIG_VIDEO_TW9903 is not set # CONFIG_VIDEO_TW9906 is not set # CONFIG_VIDEO_TW9910 is not set # CONFIG_VIDEO_IRS1125 is not set # CONFIG_VIDEO_VPX3220 is not set # # Video and audio decoders # # CONFIG_VIDEO_SAA717X is not set CONFIG_VIDEO_CX25840=m # end of Video decoders # # Video encoders # # CONFIG_VIDEO_AD9389B is not set # CONFIG_VIDEO_ADV7170 is not set # CONFIG_VIDEO_ADV7175 is not set # CONFIG_VIDEO_ADV7343 is not set # CONFIG_VIDEO_ADV7393 is not set # CONFIG_VIDEO_ADV7511 is not set # CONFIG_VIDEO_AK881X is not set # CONFIG_VIDEO_SAA7127 is not set # CONFIG_VIDEO_SAA7185 is not set # CONFIG_VIDEO_THS8200 is not set # end of Video encoders # # Video improvement chips # # CONFIG_VIDEO_UPD64031A is not set # CONFIG_VIDEO_UPD64083 is not set # end of Video improvement chips # # Audio/Video compression chips # # CONFIG_VIDEO_SAA6752HS is not set # end of Audio/Video compression chips # # SDR tuner chips # # CONFIG_SDR_MAX2175 is not set # end of SDR tuner chips # # Miscellaneous helper chips # # CONFIG_VIDEO_I2C is not set # CONFIG_VIDEO_M52790 is not set # CONFIG_VIDEO_ST_MIPID02 is not set # CONFIG_VIDEO_THS7303 is not set # end of Miscellaneous helper chips # # Media SPI Adapters # CONFIG_CXD2880_SPI_DRV=m # CONFIG_VIDEO_GS1662 is not set # end of Media SPI Adapters CONFIG_MEDIA_TUNER=m # # Customize TV tuners # CONFIG_MEDIA_TUNER_E4000=m CONFIG_MEDIA_TUNER_FC0011=m CONFIG_MEDIA_TUNER_FC0012=m CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_FC2580=m CONFIG_MEDIA_TUNER_IT913X=m # CONFIG_MEDIA_TUNER_M88RS6000T is not set CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_MC44S803=m # CONFIG_MEDIA_TUNER_MSI001 is not set CONFIG_MEDIA_TUNER_MT2060=m CONFIG_MEDIA_TUNER_MT2063=m CONFIG_MEDIA_TUNER_MT20XX=m # CONFIG_MEDIA_TUNER_MT2131 is not set CONFIG_MEDIA_TUNER_MT2266=m # CONFIG_MEDIA_TUNER_MXL301RF is not set CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m # CONFIG_MEDIA_TUNER_QM1D1B0004 is not set CONFIG_MEDIA_TUNER_QM1D1C0042=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_R820T=m CONFIG_MEDIA_TUNER_SI2157=m CONFIG_MEDIA_TUNER_SIMPLE=m CONFIG_MEDIA_TUNER_TDA18212=m CONFIG_MEDIA_TUNER_TDA18218=m CONFIG_MEDIA_TUNER_TDA18250=m CONFIG_MEDIA_TUNER_TDA18271=m CONFIG_MEDIA_TUNER_TDA827X=m CONFIG_MEDIA_TUNER_TDA8290=m CONFIG_MEDIA_TUNER_TDA9887=m CONFIG_MEDIA_TUNER_TEA5761=m CONFIG_MEDIA_TUNER_TEA5767=m CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_MEDIA_TUNER_XC2028=m CONFIG_MEDIA_TUNER_XC4000=m CONFIG_MEDIA_TUNER_XC5000=m # end of Customize TV tuners # # Customise DVB Frontends # # # Multistandard (satellite) frontends # CONFIG_DVB_M88DS3103=m # CONFIG_DVB_MXL5XX is not set CONFIG_DVB_STB0899=m CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m # CONFIG_DVB_STV0910 is not set CONFIG_DVB_STV6110x=m # CONFIG_DVB_STV6111 is not set # # Multistandard (cable + terrestrial) frontends # CONFIG_DVB_DRXK=m CONFIG_DVB_MN88472=m CONFIG_DVB_MN88473=m CONFIG_DVB_SI2165=m CONFIG_DVB_TDA18271C2DD=m # # DVB-S (satellite) frontends # # CONFIG_DVB_CX24110 is not set CONFIG_DVB_CX24116=m # CONFIG_DVB_CX24117 is not set CONFIG_DVB_CX24120=m CONFIG_DVB_CX24123=m CONFIG_DVB_DS3000=m # CONFIG_DVB_MB86A16 is not set CONFIG_DVB_MT312=m CONFIG_DVB_S5H1420=m CONFIG_DVB_SI21XX=m CONFIG_DVB_STB6000=m CONFIG_DVB_STV0288=m CONFIG_DVB_STV0299=m CONFIG_DVB_STV0900=m CONFIG_DVB_STV6110=m CONFIG_DVB_TDA10071=m CONFIG_DVB_TDA10086=m # CONFIG_DVB_TDA8083 is not set # CONFIG_DVB_TDA8261 is not set CONFIG_DVB_TDA826X=m CONFIG_DVB_TS2020=m # CONFIG_DVB_TUA6100 is not set CONFIG_DVB_TUNER_CX24113=m CONFIG_DVB_TUNER_ITD1000=m # CONFIG_DVB_VES1X93 is not set # CONFIG_DVB_ZL10036 is not set CONFIG_DVB_ZL10039=m # # DVB-T (terrestrial) frontends # CONFIG_DVB_AF9013=m CONFIG_DVB_AS102_FE=m # CONFIG_DVB_CX22700 is not set CONFIG_DVB_CX22702=m CONFIG_DVB_CXD2820R=m CONFIG_DVB_CXD2841ER=m CONFIG_DVB_DIB3000MB=m CONFIG_DVB_DIB3000MC=m CONFIG_DVB_DIB7000M=m CONFIG_DVB_DIB7000P=m # CONFIG_DVB_DIB9000 is not set CONFIG_DVB_DRXD=m CONFIG_DVB_EC100=m CONFIG_DVB_GP8PSK_FE=m # CONFIG_DVB_L64781 is not set CONFIG_DVB_MT352=m CONFIG_DVB_NXT6000=m CONFIG_DVB_RTL2830=m CONFIG_DVB_RTL2832=m CONFIG_DVB_RTL2832_SDR=m # CONFIG_DVB_S5H1432 is not set CONFIG_DVB_SI2168=m # CONFIG_DVB_SP887X is not set # CONFIG_DVB_STV0367 is not set CONFIG_DVB_TDA10048=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_ZD1301_DEMOD=m CONFIG_DVB_ZL10353=m CONFIG_DVB_CXD2880=m # # DVB-C (cable) frontends # CONFIG_DVB_STV0297=m # CONFIG_DVB_TDA10021 is not set CONFIG_DVB_TDA10023=m # CONFIG_DVB_VES1820 is not set # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # CONFIG_DVB_AU8522=m CONFIG_DVB_AU8522_DTV=m CONFIG_DVB_AU8522_V4L=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LG2160=m CONFIG_DVB_LGDT3305=m CONFIG_DVB_LGDT3306A=m CONFIG_DVB_LGDT330X=m CONFIG_DVB_MXL692=m CONFIG_DVB_NXT200X=m # CONFIG_DVB_OR51132 is not set # CONFIG_DVB_OR51211 is not set CONFIG_DVB_S5H1409=m CONFIG_DVB_S5H1411=m # # ISDB-T (terrestrial) frontends # CONFIG_DVB_DIB8000=m CONFIG_DVB_MB86A20S=m CONFIG_DVB_S921=m # # ISDB-S (satellite) & ISDB-T (terrestrial) frontends # # CONFIG_DVB_MN88443X is not set CONFIG_DVB_TC90522=m # # Digital terrestrial only tuners/PLL # CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m CONFIG_DVB_TUNER_DIB0090=m # # SEC control devices for DVB-S # CONFIG_DVB_A8293=m CONFIG_DVB_AF9033=m # CONFIG_DVB_ASCOT2E is not set CONFIG_DVB_ATBM8830=m # CONFIG_DVB_HELENE is not set # CONFIG_DVB_HORUS3A is not set # CONFIG_DVB_ISL6405 is not set CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m CONFIG_DVB_IX2505V=m # CONFIG_DVB_LGS8GL5 is not set CONFIG_DVB_LGS8GXX=m # CONFIG_DVB_LNBH25 is not set # CONFIG_DVB_LNBH29 is not set CONFIG_DVB_LNBP21=m CONFIG_DVB_LNBP22=m CONFIG_DVB_M88RS2000=m # CONFIG_DVB_TDA665x is not set CONFIG_DVB_DRX39XYJ=m # # Common Interface (EN50221) controller drivers # # CONFIG_DVB_CXD2099 is not set CONFIG_DVB_SP2=m # end of Customise DVB Frontends # # Tools to develop new frontends # # CONFIG_DVB_DUMMY_FE is not set # end of Media ancillary drivers # # Graphics support # # CONFIG_IMX_IPUV3_CORE is not set CONFIG_DRM=y CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DEBUG_MM is not set CONFIG_DRM_KMS_HELPER=y # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set # CONFIG_DRM_DEBUG_MODESET_LOCK is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_GEM_DMA_HELPER=y # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # end of I2C encoder or helper chips # # ARM devices # # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_KOMEDA is not set # end of ARM devices # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set # CONFIG_DRM_EXYNOS is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_ARMADA is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_USE_LVDS is not set # CONFIG_DRM_RCAR_USE_MIPI_DSI is not set # CONFIG_DRM_OMAP is not set # CONFIG_DRM_TILCDC is not set # CONFIG_DRM_FSL_DCU is not set # CONFIG_DRM_STM is not set CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_ABT_Y030XX067A is not set # CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set # CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set # CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set # CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set # CONFIG_DRM_PANEL_DSI_CM is not set # CONFIG_DRM_PANEL_LVDS is not set CONFIG_DRM_PANEL_SIMPLE=y # CONFIG_DRM_PANEL_EDP is not set # CONFIG_DRM_PANEL_EBBG_FT8719 is not set # CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set # CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set # CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9806E is not set # CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set # CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set # CONFIG_DRM_PANEL_JDI_R63452 is not set # CONFIG_DRM_PANEL_KHADAS_TS050 is not set # CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set # CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set # CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LB035Q02 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set # CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set # CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set # CONFIG_DRM_PANEL_NOVATEK_NT35560 is not set # CONFIG_DRM_PANEL_NOVATEK_NT35950 is not set # CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set # CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set # CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set # CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set # CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set # CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set # CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set # CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set # CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set # CONFIG_DRM_PANEL_RONBO_RB070D30 is not set # CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set # CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set # CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set # CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set # CONFIG_DRM_PANEL_SHARP_LS060T1SX01 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set # CONFIG_DRM_PANEL_SONY_ACX565AKM is not set # CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 is not set # CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set # CONFIG_DRM_PANEL_TPO_Y17P is not set # CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set # CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set # CONFIG_DRM_PANEL_TPO_TPG110 is not set # CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set # CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set # CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set # CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set # CONFIG_DRM_LONTIUM_LT9611 is not set # CONFIG_DRM_LONTIUM_LT9611UXC is not set # CONFIG_DRM_ITE_IT66121 is not set # CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NWL_MIPI_DSI is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_PARADE_PS8640 is not set # CONFIG_DRM_SIL_SII8620 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_SII9234 is not set CONFIG_DRM_SIMPLE_BRIDGE=y # CONFIG_DRM_THINE_THC63LVD1024 is not set CONFIG_DRM_TOSHIBA_TC358762=y # CONFIG_DRM_TOSHIBA_TC358764 is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TOSHIBA_TC358768 is not set # CONFIG_DRM_TOSHIBA_TC358775 is not set # CONFIG_DRM_TI_DLPC3433 is not set # CONFIG_DRM_TI_TFP410 is not set # CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_ANALOGIX_ANX7625 is not set # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_CDNS_MHDP8546 is not set # end of Display Interface Bridges # CONFIG_DRM_STI is not set # CONFIG_DRM_V3D is not set CONFIG_DRM_VC4=y CONFIG_DRM_VC4_HDMI_CEC=y # CONFIG_DRM_RP1_DSI is not set # CONFIG_DRM_RP1_DPI is not set # CONFIG_DRM_RP1_VEC is not set # CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_LOGICVC is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_PANEL_MIPI_DBI is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9163 is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set # CONFIG_TINYDRM_ILI9486 is not set # CONFIG_TINYDRM_MI0283QT is not set # CONFIG_TINYDRM_REPAPER is not set # CONFIG_TINYDRM_ST7586 is not set # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_TVE200 is not set # CONFIG_DRM_LIMA is not set # CONFIG_DRM_PANFROST is not set # CONFIG_DRM_MCDE is not set # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_DRM_NOMODESET=y # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y # CONFIG_FB_MODE_HELPERS is not set # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # CONFIG_FB_BCM2708=y # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # CONFIG_FB_RPISENSE is not set # end of Frame buffer Devices # # Backlight & LCD device support # CONFIG_LCD_CLASS_DEVICE=y # CONFIG_LCD_L4F00242T03 is not set # CONFIG_LCD_LMS283GF05 is not set # CONFIG_LCD_LTV350QV is not set # CONFIG_LCD_ILI922X is not set # CONFIG_LCD_ILI9320 is not set # CONFIG_LCD_TDO24M is not set # CONFIG_LCD_VGG2432A4 is not set # CONFIG_LCD_PLATFORM is not set # CONFIG_LCD_AMS369FG06 is not set # CONFIG_LCD_LMS501KF03 is not set # CONFIG_LCD_HX8357 is not set # CONFIG_LCD_OTM3225A is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_KTD253 is not set # CONFIG_BACKLIGHT_PWM is not set CONFIG_BACKLIGHT_RPI=y # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set CONFIG_BACKLIGHT_GPIO=y # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # CONFIG_BACKLIGHT_LED is not set # end of Backlight & LCD device support CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support # CONFIG_LOGO is not set # end of Graphics support CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_COMPRESS_OFFLOAD=y CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y CONFIG_SND_HRTIMER=m CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 # CONFIG_SND_SUPPORT_OLD_API is not set CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_CTL_INPUT_VALIDATION is not set CONFIG_SND_VMASTER=y # CONFIG_SND_SEQUENCER is not set # CONFIG_SND_DRIVERS is not set # # HD-Audio # # end of HD-Audio CONFIG_SND_HDA_PREALLOC_SIZE=2048 CONFIG_SND_ARM=y # CONFIG_SND_ARMAACI is not set CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=m CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y CONFIG_SND_USB_UA101=m CONFIG_SND_USB_CAIAQ=m CONFIG_SND_USB_CAIAQ_INPUT=y CONFIG_SND_USB_6FIRE=m CONFIG_SND_USB_HIFACE=m CONFIG_SND_BCD2000=m CONFIG_SND_USB_LINE6=m CONFIG_SND_USB_POD=m CONFIG_SND_USB_PODHD=m CONFIG_SND_USB_TONEPORT=m CONFIG_SND_USB_VARIAX=m CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y CONFIG_SND_SOC_COMPRESS=y # CONFIG_SND_SOC_ADI is not set # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_AMD_ACP_CONFIG is not set # CONFIG_SND_ATMEL_SOC is not set CONFIG_SND_BCM2835_SOC_I2S=m # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set CONFIG_SND_BCM2708_SOC_CHIPDIP_DAC=m CONFIG_SND_BCM2708_SOC_GOOGLEVOICEHAT_SOUNDCARD=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUS=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSHD=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADC=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADCPRO=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSDSP=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_AMP=m CONFIG_SND_BCM2708_SOC_PIFI_40=m CONFIG_SND_BCM2708_SOC_RPI_CIRRUS=m CONFIG_SND_BCM2708_SOC_RPI_DAC=m CONFIG_SND_BCM2708_SOC_RPI_PROTO=m CONFIG_SND_BCM2708_SOC_JUSTBOOM_BOTH=m CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC=m CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m CONFIG_SND_BCM2708_SOC_IQAUDIO_CODEC=m CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m CONFIG_SND_BCM2708_SOC_IQAUDIO_DIGI=m CONFIG_SND_BCM2708_SOC_I_SABRE_Q2M=m CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m CONFIG_SND_AUDIOINJECTOR_OCTO_SOUNDCARD=m CONFIG_SND_AUDIOINJECTOR_ISOLATED_SOUNDCARD=m CONFIG_SND_AUDIOSENSE_PI=m CONFIG_SND_DIGIDAC1_SOUNDCARD=m CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO=m CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO_V2=m CONFIG_SND_BCM2708_SOC_ALLO_PIANO_DAC=m CONFIG_SND_BCM2708_SOC_ALLO_PIANO_DAC_PLUS=m CONFIG_SND_BCM2708_SOC_ALLO_BOSS_DAC=m CONFIG_SND_BCM2708_SOC_ALLO_BOSS2_DAC=m CONFIG_SND_BCM2708_SOC_ALLO_DIGIONE=m CONFIG_SND_BCM2708_SOC_ALLO_KATANA_DAC=m CONFIG_SND_BCM2708_SOC_FE_PI_AUDIO=m CONFIG_SND_PISOUND=m CONFIG_SND_RPI_SIMPLE_SOUNDCARD=m CONFIG_SND_RPI_WM8804_SOUNDCARD=m CONFIG_SND_DACBERRY400=m # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # CONFIG_SND_SOC_FSL_AUDMIX is not set # 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_FSL_XCVR is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # end of SoC Audio for Freescale CPUs # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_MTK_BTCVSD is not set # CONFIG_SND_SOC_SOF_TOPLEVEL is not set # # STMicroelectronics STM32 SOC audio support # # end of 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_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # CONFIG_SND_SOC_ARIZONA=m CONFIG_SND_SOC_WM_ADSP=m # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_AD193X_SPI is not set # CONFIG_SND_SOC_AD193X_I2C is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1372_SPI is not set CONFIG_SND_SOC_ADAU1701=m # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set CONFIG_SND_SOC_ADAU1977=m CONFIG_SND_SOC_ADAU1977_I2C=m CONFIG_SND_SOC_ADAU7002=m # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4375 is not set # CONFIG_SND_SOC_AK4458 is not set CONFIG_SND_SOC_AK4554=m # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # 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_CS35L41_SPI is not set # CONFIG_SND_SOC_CS35L41_I2C is not set # CONFIG_SND_SOC_CS35L45_SPI is not set # CONFIG_SND_SOC_CS35L45_I2C 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS42L83 is not set # CONFIG_SND_SOC_CS4234 is not set CONFIG_SND_SOC_CS4265=m # CONFIG_SND_SOC_CS4270 is not set CONFIG_SND_SOC_CS4271=m CONFIG_SND_SOC_CS4271_I2C=m # CONFIG_SND_SOC_CS4271_SPI is not set CONFIG_SND_SOC_CS42XX8=m CONFIG_SND_SOC_CS42XX8_I2C=m # 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_CX2072X is not set CONFIG_SND_SOC_DA7213=m CONFIG_SND_SOC_DMIC=m CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_ES7134 is not set # CONFIG_SND_SOC_ES7241 is not set # CONFIG_SND_SOC_ES8316 is not set # CONFIG_SND_SOC_ES8326 is not set # CONFIG_SND_SOC_ES8328_I2C is not set # CONFIG_SND_SOC_ES8328_SPI is not set # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_HDA is not set # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set CONFIG_SND_SOC_MA120X0P=m # CONFIG_SND_SOC_MAX98088 is not set # CONFIG_SND_SOC_MAX98357A is not set # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98520 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX98396 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set CONFIG_SND_SOC_PCM179X=m CONFIG_SND_SOC_PCM179X_I2C=m # CONFIG_SND_SOC_PCM179X_SPI is not set CONFIG_SND_SOC_PCM186X=m CONFIG_SND_SOC_PCM186X_I2C=m # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set CONFIG_SND_SOC_PCM5102A=m CONFIG_SND_SOC_PCM512x=m CONFIG_SND_SOC_PCM512x_I2C=m # 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_PCM1794A=m # CONFIG_SND_SOC_RT5631 is not set # CONFIG_SND_SOC_RT5640 is not set # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_RT9120 is not set CONFIG_SND_SOC_SGTL5000=m CONFIG_SND_SOC_SIGMADSP=m CONFIG_SND_SOC_SIGMADSP_I2C=m CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m # CONFIG_SND_SOC_SIMPLE_MUX is not set CONFIG_SND_SOC_SPDIF=m # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set CONFIG_SND_SOC_STA32X=m # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS2780 is not set # CONFIG_SND_SOC_TAS5086 is not set CONFIG_SND_SOC_TAS571X=m # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805M is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set CONFIG_SND_SOC_TAS5713=m # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320ADC3XXX is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set CONFIG_SND_SOC_TLV320AIC32X4=m CONFIG_SND_SOC_TLV320AIC32X4_I2C=m # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set CONFIG_SND_SOC_TLV320AIC3X=m CONFIG_SND_SOC_TLV320AIC3X_I2C=m # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set CONFIG_SND_SOC_WM5102=m # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set CONFIG_SND_SOC_WM8731=m CONFIG_SND_SOC_WM8731_I2C=m # CONFIG_SND_SOC_WM8731_SPI is not set # CONFIG_SND_SOC_WM8737 is not set CONFIG_SND_SOC_WM8741=m # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set CONFIG_SND_SOC_WM8804=m CONFIG_SND_SOC_WM8804_I2C=m # 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_WM8940 is not set CONFIG_SND_SOC_WM8960=m # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set # CONFIG_SND_SOC_ZL38060 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_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8821 is not set # CONFIG_SND_SOC_NAU8822 is not set # CONFIG_SND_SOC_NAU8824 is not set CONFIG_SND_SOC_TPA6130A2=m # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set CONFIG_SND_SOC_I_SABRE_CODEC=m # end of CODEC drivers CONFIG_SND_SIMPLE_CARD_UTILS=m CONFIG_SND_SIMPLE_CARD=m CONFIG_SND_AUDIO_GRAPH_CARD=m # CONFIG_SND_AUDIO_GRAPH_CARD2 is not set # CONFIG_SND_TEST_COMPONENT is not set # # HID support # CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set CONFIG_HID_ASUS=y CONFIG_HID_AUREAL=y CONFIG_HID_BELKIN=y # CONFIG_HID_BETOP_FF is not set CONFIG_HID_BIGBEN_FF=m CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CREATIVE_SB0540 is not set CONFIG_HID_CYPRESS=y CONFIG_HID_DRAGONRISE=m CONFIG_DRAGONRISE_FF=y # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_FT260 is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_GLORIOUS is not set # CONFIG_HID_HOLTEK is not set # CONFIG_HID_VIVALDI is not set # CONFIG_HID_GT683R is not set # CONFIG_HID_KEYTOUCH is not set CONFIG_HID_KYE=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set # CONFIG_HID_VRC2 is not set # CONFIG_HID_XIAOMI is not set CONFIG_HID_GYRATION=y # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set # CONFIG_HID_JABRA is not set CONFIG_HID_TWINHAN=y CONFIG_HID_KENSINGTON=y CONFIG_HID_LCPOWER=y # CONFIG_HID_LED is not set CONFIG_HID_LENOVO=y # CONFIG_HID_LETSKETCH is not set CONFIG_HID_LOGITECH=y CONFIG_HID_LOGITECH_DJ=y CONFIG_HID_LOGITECH_HIDPP=y CONFIG_LOGITECH_FF=y 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_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=m CONFIG_HID_NINTENDO=m CONFIG_NINTENDO_FF=y # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set CONFIG_HID_ORTEK=y CONFIG_HID_OUYA=y CONFIG_HID_PANTHERLORD=y CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=y CONFIG_HID_PETALYNX=y # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PXRC is not set # CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set CONFIG_HID_SAMSUNG=y # CONFIG_HID_SEMITEK is not set # CONFIG_HID_SIGMAMICRO is not set CONFIG_HID_SONY=y CONFIG_SONY_FF=y # CONFIG_HID_SPEEDLINK is not set CONFIG_HID_STEAM=m # CONFIG_HID_STEELSERIES is not set CONFIG_HID_SUNPLUS=y CONFIG_HID_RMI=y # CONFIG_HID_GREENASIA is not set CONFIG_HID_SMARTJOYPLUS=m CONFIG_SMARTJOYPLUS_FF=y CONFIG_HID_TIVO=y CONFIG_HID_TOPSEED=y # CONFIG_HID_TOPRE is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set CONFIG_HID_WIIMOTE=m CONFIG_HID_XINMO=y # CONFIG_HID_ZEROPLUS is not set CONFIG_HID_ZYDACRON=y # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # end of USB HID support # # I2C HID support # # CONFIG_I2C_HID_OF is not set # CONFIG_I2C_HID_OF_ELAN is not set # CONFIG_I2C_HID_OF_GOODIX is not set # end of I2C HID support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y # CONFIG_USB_LED_TRIG is not set # CONFIG_USB_ULPI_BUS is not set # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_OTG is not set # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set # CONFIG_USB_LEDS_TRIGGER_USBPORT is not set CONFIG_USB_AUTOSUSPEND_DELAY=2 CONFIG_USB_MON=m # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set # CONFIG_USB_XHCI_HCD is not set # CONFIG_USB_EHCI_HCD is not set # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set # CONFIG_USB_OHCI_HCD is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set CONFIG_USB_DWCOTG=y # CONFIG_USB_HCD_BCMA is not set # CONFIG_USB_HCD_SSB is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=m # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set # CONFIG_USB_UAS is not set # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # CONFIG_USB_SERIAL=m CONFIG_USB_SERIAL_GENERIC=y # CONFIG_USB_SERIAL_SIMPLE is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set CONFIG_USB_SERIAL_CH341=m # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set CONFIG_USB_SERIAL_CP210X=m # CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_EMPEG is not set CONFIG_USB_SERIAL_FTDI_SIO=m # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_F81232 is not set # CONFIG_USB_SERIAL_F8153X is not set # CONFIG_USB_SERIAL_GARMIN is not set # CONFIG_USB_SERIAL_IPW is not set CONFIG_USB_SERIAL_IUU=m # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set # CONFIG_USB_SERIAL_KEYSPAN is not set # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_METRO is not set # CONFIG_USB_SERIAL_MOS7720 is not set # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MXUPORT is not set # CONFIG_USB_SERIAL_NAVMAN is not set CONFIG_USB_SERIAL_PL2303=m # CONFIG_USB_SERIAL_OTI6858 is not set # CONFIG_USB_SERIAL_QCAUX is not set # CONFIG_USB_SERIAL_QUALCOMM is not set # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SAFE is not set # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_OPTION is not set # CONFIG_USB_SERIAL_OMNINET is not set # CONFIG_USB_SERIAL_OPTICON is not set # CONFIG_USB_SERIAL_XSENS_MT is not set # CONFIG_USB_SERIAL_WISHBONE is not set # CONFIG_USB_SERIAL_SSU100 is not set # CONFIG_USB_SERIAL_QT2 is not set # CONFIG_USB_SERIAL_UPD78F0730 is not set # CONFIG_USB_SERIAL_XR is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HUB_USB251XB is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # CONFIG_USB_ONBOARD_HUB is not set # # USB Physical Layer drivers # CONFIG_USB_PHY=y CONFIG_NOP_USB_XCEIV=y # CONFIG_AM335X_PHY_USB is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set # CONFIG_USB_ULPI is not set # end of USB Physical Layer drivers # CONFIG_USB_GADGET is not set # CONFIG_TYPEC is not set # CONFIG_USB_ROLE_SWITCH is not set CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y CONFIG_PWRSEQ_SIMPLE=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # CONFIG_MMC_BCM2835_MMC=y CONFIG_MMC_BCM2835_DMA=y CONFIG_MMC_BCM2835_PIO_DMA_BARRIER=2 CONFIG_MMC_BCM2835_SDHOST=y # CONFIG_MMC_DEBUG is not set # CONFIG_MMC_ARMMMCI is not set CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_PLTFM=y # CONFIG_MMC_SDHCI_OF_ARASAN is not set # CONFIG_MMC_SDHCI_OF_AT91 is not set # CONFIG_MMC_SDHCI_OF_DWCMSHC is not set # CONFIG_MMC_SDHCI_CADENCE is not set # CONFIG_MMC_SDHCI_F_SDH30 is not set # CONFIG_MMC_SDHCI_MILBEAUT is not set # CONFIG_MMC_SDHCI_IPROC is not set # CONFIG_MMC_SPI is not set # CONFIG_MMC_DW is not set # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_REALTEK_USB=m # CONFIG_MMC_CQHCI is not set # CONFIG_MMC_HSQ is not set # CONFIG_MMC_BCM2835 is not set # CONFIG_MMC_MTK is not set # CONFIG_MMC_SDHCI_XENON is not set # CONFIG_MMC_SDHCI_OMAP is not set # CONFIG_MMC_SDHCI_AM654 is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y CONFIG_LEDS_CLASS_FLASH=y # CONFIG_LEDS_CLASS_MULTICOLOR is not set # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_AW2013 is not set # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_EL15203000 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP50XX is not set # CONFIG_LEDS_LP55XX_COMMON is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set # CONFIG_LEDS_PWM is not set # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_SPI_BYTE is not set # CONFIG_LEDS_TI_LMU_COMMON is not set # # Flash and Torch LED drivers # # CONFIG_LEDS_AAT1290 is not set # CONFIG_LEDS_AS3645A is not set # CONFIG_LEDS_KTD2692 is not set # CONFIG_LEDS_LM3601X is not set # CONFIG_LEDS_RT4505 is not set # CONFIG_LEDS_RT8515 is not set # CONFIG_LEDS_SGM3140 is not set # # RGB LED drivers # # # LED Triggers # CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_BACKLIGHT=y CONFIG_LEDS_TRIGGER_CPU=y # CONFIG_LEDS_TRIGGER_ACTIVITY is not set CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # # iptables trigger is under Netfilter config (LED target) # CONFIG_LEDS_TRIGGER_TRANSIENT=y CONFIG_LEDS_TRIGGER_CAMERA=y CONFIG_LEDS_TRIGGER_INPUT=y # CONFIG_LEDS_TRIGGER_PANIC is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set # CONFIG_LEDS_TRIGGER_AUDIO is not set # CONFIG_LEDS_TRIGGER_TTY is not set CONFIG_LEDS_TRIGGER_ACTPWR=y # # Simple LED drivers # # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_ATOMIC_SCRUB=y CONFIG_EDAC_SUPPORT=y CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # I2C RTC drivers # # CONFIG_RTC_DRV_ABB5ZES3 is not set # CONFIG_RTC_DRV_ABEOZ9 is not set CONFIG_RTC_DRV_ABX80X=m CONFIG_RTC_DRV_DS1307=m # CONFIG_RTC_DRV_DS1307_CENTURY is not set # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_HYM8563 is not set # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_NCT3018Y is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set CONFIG_RTC_DRV_PCF8523=m # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set CONFIG_RTC_DRV_PCF8563=m # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # 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_RV3032 is not set # CONFIG_RTC_DRV_RV8803 is not set # CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # CONFIG_RTC_DRV_DS3232=m CONFIG_RTC_DRV_DS3232_HWMON=y CONFIG_RTC_DRV_PCF2127=m # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_CMOS is not set # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_PL030 is not set # CONFIG_RTC_DRV_PL031 is not set # CONFIG_RTC_DRV_CADENCE is not set # CONFIG_RTC_DRV_FTRTC010 is not set # CONFIG_RTC_DRV_R7301 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_VIRTUAL_CHANNELS=y CONFIG_DMA_OF=y # CONFIG_ALTERA_MSGDMA is not set # CONFIG_AMBA_PL08X is not set CONFIG_DMA_BCM2835=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_PL330_DMA is not set CONFIG_DMA_BCM2708=y # CONFIG_XILINX_ZYNQMP_DPDMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set # CONFIG_DW_DMAC is not set # CONFIG_SF_PDMA is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set CONFIG_DMABUF_HEAPS=y # CONFIG_DMABUF_SYSFS_STATS is not set CONFIG_DMABUF_HEAPS_SYSTEM=y CONFIG_DMABUF_HEAPS_CMA=y # end of DMABUF options # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set # CONFIG_VIRTIO_MENU is not set # CONFIG_VDPA is not set CONFIG_VHOST_MENU=y # CONFIG_VHOST_NET is not set # CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set # # Microsoft Hyper-V guest support # # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_RTLLIB is not set CONFIG_RTL8723BS=m CONFIG_R8712U=m CONFIG_R8188EU=m CONFIG_VT6656=m CONFIG_STAGING_MEDIA=y # CONFIG_VIDEO_MAX96712 is not set # CONFIG_VIDEO_RPIVID is not set # CONFIG_STAGING_MEDIA_DEPRECATED is not set # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_FB_TFT is not set # CONFIG_KS7010 is not set CONFIG_BCM_VIDEOCORE=y CONFIG_BCM2835_VCHIQ=y CONFIG_VCHIQ_CDEV=y CONFIG_SND_BCM2835=m # CONFIG_VIDEO_BCM2835 is not set CONFIG_BCM_VC_SM_CMA=y CONFIG_VIDEO_CODEC_BCM2835=m CONFIG_VIDEO_ISP_BCM2835=m CONFIG_BCM2835_VCHIQ_MMAL=y # CONFIG_PI433 is not set # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_FIELDBUS_DEV is not set # CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Clock driver for ARM Reference designs # # CONFIG_CLK_ICST is not set # CONFIG_CLK_SP810 is not set # end of Clock driver for ARM Reference designs # CONFIG_LMK04832 is not set # CONFIG_COMMON_CLK_MAX9485 is not set CONFIG_COMMON_CLK_HIFIBERRY_DACPLUSHD=m CONFIG_COMMON_CLK_HIFIBERRY_DACPRO=m # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set # CONFIG_COMMON_CLK_AXI_CLKGEN is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_RS9_PCIE is not set # CONFIG_COMMON_CLK_VC5 is not set # CONFIG_COMMON_CLK_VC7 is not set # CONFIG_COMMON_CLK_FIXED_MMIO is not set # CONFIG_CLK_BCM2711_DVP is not set CONFIG_CLK_BCM2835=y CONFIG_CLK_RASPBERRYPI=y # CONFIG_XILINX_VCU is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set # CONFIG_HWSPINLOCK is not set # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_PROBE=y CONFIG_CLKSRC_MMIO=y CONFIG_BCM2835_TIMER=y CONFIG_ARM_TIMER_SP804=y # CONFIG_MICROCHIP_PIT64B is not set # end of Clock Source drivers CONFIG_MAILBOX=y # CONFIG_ARM_MHU is not set # CONFIG_ARM_MHU_V2 is not set # CONFIG_PLATFORM_MHU is not set # CONFIG_PL320_MBOX is not set # CONFIG_ALTERA_MBOX is not set CONFIG_BCM2835_MBOX=y # CONFIG_MAILBOX_TEST is not set # CONFIG_IOMMU_SUPPORT is not set # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # end of Remoteproc drivers # # Rpmsg drivers # # CONFIG_RPMSG_QCOM_GLINK_RPM is not set # CONFIG_RPMSG_VIRTIO is not set # end of Rpmsg drivers # CONFIG_SOUNDWIRE is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # end of Amlogic SoC drivers # # Broadcom SoC drivers # CONFIG_BCM2835_POWER=y CONFIG_RASPBERRYPI_POWER=y # CONFIG_SOC_BRCMSTB is not set # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # CONFIG_QUICC_ENGINE is not set # end of NXP/Freescale QorIQ SoC drivers # # fujitsu SoC drivers # # end of fujitsu SoC drivers # # i.MX SoC drivers # # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # CONFIG_LITEX_SOC_CONTROLLER is not set # end of Enable LiteX SoC Builder specific drivers # # Qualcomm SoC drivers # # end of Qualcomm SoC drivers # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers # CONFIG_PM_DEVFREQ is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_FSA9480 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 # CONFIG_MEMORY is not set # CONFIG_IIO is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_DEBUG is not set # CONFIG_PWM_ATMEL_TCB is not set CONFIG_PWM_BCM2835=m # CONFIG_PWM_CLK is not set # CONFIG_PWM_FSL_FTM is not set # CONFIG_PWM_PCA9685 is not set CONFIG_PWM_RASPBERRYPI_POE=m # CONFIG_PWM_RP1 is not set # CONFIG_PWM_XILINX is not set # # IRQ chip support # CONFIG_IRQCHIP=y # CONFIG_AL_FIC is not set CONFIG_BRCMSTB_L2_IRQ=y # CONFIG_XILINX_INTC is not set # end of IRQ chip support # CONFIG_IPACK_BUS is not set CONFIG_RESET_CONTROLLER=y # CONFIG_RESET_BRCMSTB is not set # CONFIG_RESET_RASPBERRYPI is not set # CONFIG_RESET_SIMPLE is not set # CONFIG_RESET_TI_SYSCON is not set # CONFIG_RESET_TI_TPS380X is not set # # PHY Subsystem # # CONFIG_GENERIC_PHY is not set # CONFIG_PHY_CAN_TRANSCEIVER is not set # # PHY drivers for Broadcom platforms # # CONFIG_BCM_KONA_USB2_PHY is not set # CONFIG_PHY_BRCM_USB is not set # end of PHY drivers for Broadcom platforms # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_DPHY_RX is not set # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_CADENCE_SALVO is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set # end of PHY Subsystem # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCN is not set CONFIG_ARM_PMU=y CONFIG_RPI_AXIPERF=m # end of Performance monitor support # CONFIG_RAS is not set # # Android # # CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y # CONFIG_NVMEM_RMEM is not set # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_FSI is not set CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set # CONFIG_PECI is not set # CONFIG_HTE is not set # end of Device Drivers # # 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 CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=m CONFIG_XFS_SUPPORT_V4=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_ONLINE_SCRUB is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_BTRFS_FS_REF_VERIFY is not set # CONFIG_NILFS2_FS is not set CONFIG_F2FS_FS=y CONFIG_F2FS_STAT_FS=y # CONFIG_F2FS_FS_XATTR is not set CONFIG_F2FS_CHECK_FS=y # CONFIG_F2FS_FAULT_INJECTION is not set # CONFIG_F2FS_FS_COMPRESSION is not set CONFIG_F2FS_IOSTAT=y # CONFIG_F2FS_UNFAIR_RWSEM is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y # CONFIG_QUOTA is not set # CONFIG_AUTOFS4_FS is not set CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=m # CONFIG_CUSE is not set # CONFIG_VIRTIO_FS is not set CONFIG_OVERLAY_FS=m # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_METACOPY is not set # # Caches # CONFIG_NETFS_SUPPORT=y # CONFIG_NETFS_STATS is not set CONFIG_FSCACHE=y # CONFIG_FSCACHE_STATS is not set # CONFIG_FSCACHE_DEBUG is not set # CONFIG_CACHEFILES is not set # end of Caches # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=y # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=m CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set CONFIG_NTFS3_FS=m # CONFIG_NTFS3_LZX_XPRESS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y CONFIG_MEMFD_CREATE=y CONFIG_CONFIGFS_FS=y # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set CONFIG_HFS_FS=y CONFIG_HFSPLUS_FS=y # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y # CONFIG_SQUASHFS_FILE_CACHE is not set CONFIG_SQUASHFS_FILE_DIRECT=y # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 CONFIG_PSTORE_DEFLATE_COMPRESS=y # CONFIG_PSTORE_LZO_COMPRESS is not set # CONFIG_PSTORE_LZ4_COMPRESS is not set # CONFIG_PSTORE_LZ4HC_COMPRESS is not set # CONFIG_PSTORE_842_COMPRESS is not set # CONFIG_PSTORE_ZSTD_COMPRESS is not set CONFIG_PSTORE_COMPRESS=y CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" CONFIG_PSTORE_CONSOLE=y # CONFIG_PSTORE_PMSG is not set # CONFIG_PSTORE_FTRACE is not set CONFIG_PSTORE_RAM=y # CONFIG_PSTORE_BLK is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y CONFIG_NFS_SWAP=y CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" CONFIG_NFS_V4_1_MIGRATION=y CONFIG_ROOT_NFS=y CONFIG_NFS_FSCACHE=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFS_DISABLE_UDP_SUPPORT=y # CONFIG_NFS_V4_2_READ_PLUS is not set # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_COMMON=y CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y CONFIG_SUNRPC_SWAP=y CONFIG_RPCSEC_GSS_KRB5=m # CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES is not set # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS2=y CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set CONFIG_CIFS_DEBUG=y # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DEBUG_DUMP_KEYS is not set # CONFIG_CIFS_DFS_UPCALL is not set # CONFIG_CIFS_SWN_UPCALL is not set CONFIG_CIFS_FSCACHE=y # CONFIG_CIFS_ROOT is not set # CONFIG_SMB_SERVER is not set CONFIG_SMBFS=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEY_DH_OPERATIONS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set CONFIG_SECURITYFS=y CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_LSM="yama,loadpin,safesetid,integrity" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_STACK_ALL_PATTERN is not set # CONFIG_INIT_STACK_ALL_ZERO is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization CONFIG_RANDSTRUCT_NONE=y # CONFIG_RANDSTRUCT_FULL is not set # CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_CRYPTD is not set # CONFIG_CRYPTO_AUTHENC is not set # CONFIG_CRYPTO_TEST is not set # end of Crypto core or helper # # Public-key cryptography # CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y # CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set CONFIG_CRYPTO_ECC=m CONFIG_CRYPTO_ECDH=m # CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set # end of Public-key cryptography # # Block ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SM4_GENERIC is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CFB=m CONFIG_CRYPTO_CTR=y CONFIG_CRYPTO_CTS=m CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # end of Length-preserving ciphers and modes # # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=m # CONFIG_CRYPTO_ESSIV is not set # end of AEAD (authenticated encryption with associated data) ciphers # # Hashes, digests, and MACs # CONFIG_CRYPTO_BLAKE2B=m CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_XCBC is not set CONFIG_CRYPTO_XXHASH=m # end of Hashes, digests, and MACs # # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y # CONFIG_CRYPTO_CRCT10DIF is not set # end of CRCs (cyclic redundancy checks) # # Compression # CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_LZO=m # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # end of Compression # # Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation # # Userspace interface # CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set CONFIG_CRYPTO_USER_API_AEAD=y CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y # # Accelerated Cryptographic Algorithms for CPU (arm) # CONFIG_CRYPTO_POLY1305_ARM=m CONFIG_CRYPTO_BLAKE2S_ARM=y CONFIG_CRYPTO_SHA1_ARM=m CONFIG_CRYPTO_SHA256_ARM=m # CONFIG_CRYPTO_SHA512_ARM is not set CONFIG_CRYPTO_AES_ARM=m CONFIG_CRYPTO_CHACHA20_NEON=m # end of Accelerated Cryptographic Algorithms for CPU (arm) # CONFIG_CRYPTO_HW is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS8_PRIVATE_KEY_PARSER=m CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m CONFIG_RAID6_PQ_BENCHMARK=y CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_CORDIC=m # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y # # Crypto library routines # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=m CONFIG_CRYPTO_LIB_CHACHA=m CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m CONFIG_CRYPTO_LIB_CURVE25519=m CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m CONFIG_CRYPTO_LIB_POLY1305=m CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_CRC_CCITT=m CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC64_ROCKSOFT is not set CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=m # CONFIG_CRC8 is not set CONFIG_XXHASH=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=m CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=m CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set # CONFIG_XZ_DEC_IA64 is not set # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set # CONFIG_XZ_DEC_MICROLZMA is not set # CONFIG_XZ_DEC_TEST is not set CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_DMA_DECLARE_COHERENT=y CONFIG_ARCH_HAS_SETUP_DMA_OPS=y CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_CMA=y # CONFIG_DMA_PERNUMA_CMA is not set # # Default contiguous memory area size: # CONFIG_CMA_SIZE_MBYTES=5 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_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y # end of Library routines CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set # CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Compile-time checks and compiler options # CONFIG_AS_HAS_NON_CONST_LEB128=y CONFIG_DEBUG_INFO_NONE=y # CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=1024 CONFIG_STRIP_ASM_SYMS=y # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set # CONFIG_UBSAN is not set CONFIG_HAVE_KCSAN_COMPILER=y # end of Generic Kernel Debugging Instruments # # Networking Debugging # # CONFIG_NET_DEV_REFCNT_TRACKER is not set # CONFIG_NET_NS_REFCNT_TRACKER is not set # CONFIG_DEBUG_NET is not set # end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_PAGE_REF is not set # CONFIG_DEBUG_WX is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set # CONFIG_DEBUG_VM is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y # CONFIG_KFENCE is not set # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 # CONFIG_SOFTLOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # # CONFIG_SCHED_DEBUG is not set # CONFIG_SCHEDSTATS is not set # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # end of Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_LATENCYTOP is not set CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACER_MAX_TRACE=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_RING_BUFFER_ALLOW_SWAP=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y CONFIG_BOOTTIME_TRACING=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y CONFIG_DYNAMIC_FTRACE=y CONFIG_DYNAMIC_FTRACE_WITH_REGS=y # CONFIG_FUNCTION_PROFILER is not set CONFIG_STACK_TRACER=y # CONFIG_IRQSOFF_TRACER is not set # CONFIG_SCHED_TRACER is not set # CONFIG_HWLAT_TRACER is not set # CONFIG_OSNOISE_TRACER is not set # CONFIG_TIMERLAT_TRACER is not set # CONFIG_FTRACE_SYSCALLS is not set CONFIG_TRACER_SNAPSHOT=y CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set CONFIG_BLK_DEV_IO_TRACE=y CONFIG_KPROBE_EVENTS=y # CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set # CONFIG_UPROBE_EVENTS is not set CONFIG_BPF_EVENTS=y CONFIG_DYNAMIC_EVENTS=y CONFIG_PROBE_EVENTS=y CONFIG_FTRACE_MCOUNT_RECORD=y CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT=y # CONFIG_SYNTH_EVENTS is not set # CONFIG_HIST_TRIGGERS is not set # CONFIG_TRACE_EVENT_INJECT is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_TRACE_EVAL_MAP_FILE is not set # CONFIG_FTRACE_RECORD_RECURSION is not set # CONFIG_FTRACE_STARTUP_TEST is not set # CONFIG_FTRACE_SORT_STARTUP_TEST is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set # CONFIG_PREEMPTIRQ_DELAY_TEST is not set # CONFIG_KPROBE_EVENT_GEN_TEST is not set # CONFIG_RV is not set # CONFIG_SAMPLES is not set # CONFIG_STRICT_DEVMEM is not set # # arm Debugging # # CONFIG_ARM_PTDUMP_DEBUGFS is not set CONFIG_UNWINDER_FRAME_POINTER=y # CONFIG_UNWINDER_ARM is not set # CONFIG_BACKTRACE_VERBOSE is not set # CONFIG_DEBUG_USER is not set # CONFIG_DEBUG_LL is not set CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" # CONFIG_ARM_KPROBES_TEST is not set # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_CORESIGHT is not set # end of arm Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_RUNTIME_TESTING_MENU is not set CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage # # Rust hacking # # end of Rust hacking # end of Kernel hacking ================================================ FILE: projects/RPi/devices/RPi/options ================================================ ################################################################################ # Device defaults ################################################################################ # NOOBS supported hex versions (legacy) NOOBS_HEX="2,3,4,5,6,7,8,9,d,e,f,10,11,12,14,19,0092,0093" # NOOBS supported model versions NOOBS_SUPPORTED_MODELS='"Pi Model","Pi Compute Module","Pi Zero"' ================================================ FILE: projects/RPi/devices/RPi2/config/distroconfig-composite.txt ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team LibreELEC (https://libreelec.tv) # WARNING: DO NOT EDIT THIS FILE - IT WILL BE OVERWRITTEN WHEN UPGRADING! display_auto_detect=1 dtoverlay=vc4-kms-v3d,cma-384,composite=1 dtoverlay= disable_overscan=1 disable_fw_kms_setup=1 ================================================ FILE: projects/RPi/devices/RPi2/config/distroconfig.txt ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team LibreELEC (https://libreelec.tv) # WARNING: DO NOT EDIT THIS FILE - IT WILL BE OVERWRITTEN WHEN UPGRADING! display_auto_detect=1 dtoverlay=vc4-kms-v3d,cma-384 dtoverlay= disable_overscan=1 disable_fw_kms_setup=1 ================================================ FILE: projects/RPi/devices/RPi2/linux/linux.arm.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm 6.1.66 Kernel Configuration # CONFIG_CC_VERSION_TEXT="arm-linux-gnueabihf-gcc (GCC) 13.0.0 20220604 (experimental) [master revision aec868578d8515763d75693c1fdfbc30ff0a1e68]" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=130000 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23850 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23850 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_LZMA=y CONFIG_HAVE_KERNEL_XZ=y CONFIG_HAVE_KERNEL_LZO=y CONFIG_HAVE_KERNEL_LZ4=y CONFIG_KERNEL_GZIP=y # CONFIG_KERNEL_LZMA is not set # CONFIG_KERNEL_XZ is not set # CONFIG_KERNEL_LZO is not set # CONFIG_KERNEL_LZ4 is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_IRQ_IPI=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_GENERIC_IRQ_MULTI_HANDLER=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_CONTEXT_TRACKING=y CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y # CONFIG_BPF_JIT is not set # CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_BPF_PRELOAD is not set # end of BPF subsystem CONFIG_PREEMPT_VOLUNTARY_BUILD=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_TASKSTATS is not set # CONFIG_PSI is not set # end of CPU/Task time and stats accounting CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_RUDE_RCU=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem CONFIG_IKCONFIG=m CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=17 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 # CONFIG_PRINTK_INDEX is not set CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # # end of Scheduler features CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set CONFIG_CGROUP_PIDS=y # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y # CONFIG_CGROUP_MISC is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 # CONFIG_RD_GZIP is not set # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set # CONFIG_RD_LZ4 is not set # CONFIG_RD_ZSTD is not set CONFIG_INITRAMFS_COMPRESSION_NONE=y CONFIG_BOOT_CONFIG=y # CONFIG_BOOT_CONFIG_EMBED is not set CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_EXPERT=y # CONFIG_UID16 is not set CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set # CONFIG_SYSFS_SYSCALL is not set CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y 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 # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y CONFIG_PERF_USE_VMALLOC=y # CONFIG_PC104 is not set # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_SYSTEM_DATA_VERIFICATION=y CONFIG_PROFILING=y CONFIG_TRACEPOINTS=y # end of General setup CONFIG_ARM=y CONFIG_ARM_HAS_GROUP_RELOCS=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y CONFIG_HAVE_PROC_CPU=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_LOCKDEP_SUPPORT=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_FIQ=y CONFIG_ARM_PATCH_PHYS_VIRT=y CONFIG_GENERIC_BUG=y CONFIG_PGTABLE_LEVELS=2 # # System Type # CONFIG_MMU=y CONFIG_ARCH_MMAP_RND_BITS_MIN=8 CONFIG_ARCH_MMAP_RND_BITS_MAX=15 CONFIG_ARCH_MULTIPLATFORM=y # # Platform selection # # # CPU Core family selection # # CONFIG_ARCH_MULTI_V6 is not set CONFIG_ARCH_MULTI_V7=y CONFIG_ARCH_MULTI_V6_V7=y # end of Platform selection # CONFIG_ARCH_VIRT is not set # CONFIG_ARCH_AIROHA is not set # CONFIG_ARCH_ACTIONS is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_ARTPEC is not set # CONFIG_ARCH_ASPEED is not set # CONFIG_ARCH_AT91 is not set CONFIG_ARCH_BCM=y # # IPROC architected SoCs # # CONFIG_ARCH_BCM_CYGNUS is not set # CONFIG_ARCH_BCM_HR2 is not set # CONFIG_ARCH_BCM_NSP is not set # CONFIG_ARCH_BCM_5301X is not set # # KONA architected SoCs # # CONFIG_ARCH_BCM_281XX is not set # CONFIG_ARCH_BCM_21664 is not set # CONFIG_ARCH_BCM_23550 is not set # # Other Architectures # CONFIG_ARCH_BCM2835=y # CONFIG_ARCH_BCM_53573 is not set # CONFIG_ARCH_BCM_63XX is not set # CONFIG_ARCH_BRCMSTB is not set # CONFIG_ARCH_BCMBCA is not set # # BCMBCA sub platforms # # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_DIGICOLOR is not set # CONFIG_ARCH_DOVE is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_HIGHBANK is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_HPE is not set # CONFIG_ARCH_MXC is not set # 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_MSTARV7 is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_NPCM is not set # # TI OMAP/AM/DM/DRA Family # # CONFIG_ARCH_OMAP3 is not set # CONFIG_ARCH_OMAP4 is not set # CONFIG_SOC_OMAP5 is not set # CONFIG_SOC_AM33XX is not set # CONFIG_SOC_AM43XX is not set # CONFIG_SOC_DRA7XX is not set # end of TI OMAP/AM/DM/DRA Family # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_RDA is not set # CONFIG_ARCH_REALTEK is not set # CONFIG_ARCH_ROCKCHIP is not set # CONFIG_ARCH_S5PV210 is not set # CONFIG_ARCH_RENESAS is not set # CONFIG_ARCH_INTEL_SOCFPGA is not set # CONFIG_PLAT_SPEAR is not set # CONFIG_ARCH_STI is not set # CONFIG_ARCH_STM32 is not set # CONFIG_ARCH_SUNPLUS is not set # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_U8500 is not set # CONFIG_ARCH_REALVIEW is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_WM8850 is not set # CONFIG_ARCH_ZYNQ is not set # # Processor Type # CONFIG_CPU_V7=y CONFIG_CPU_THUMB_CAPABLE=y CONFIG_CPU_32v6K=y CONFIG_CPU_32v7=y CONFIG_CPU_ABRT_EV7=y CONFIG_CPU_PABRT_V7=y CONFIG_CPU_CACHE_V7=y CONFIG_CPU_CACHE_VIPT=y CONFIG_CPU_COPY_V6=y CONFIG_CPU_TLB_V7=y CONFIG_CPU_HAS_ASID=y CONFIG_CPU_CP15=y CONFIG_CPU_CP15_MMU=y # # Processor Features # # CONFIG_ARM_LPAE is not set CONFIG_ARM_THUMB=y # CONFIG_ARM_THUMBEE is not set CONFIG_ARM_VIRT_EXT=y CONFIG_SWP_EMULATE=y CONFIG_CPU_LITTLE_ENDIAN=y # CONFIG_CPU_BIG_ENDIAN is not set # CONFIG_CPU_ICACHE_DISABLE is not set # CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND is not set # CONFIG_CPU_BPREDICT_DISABLE is not set CONFIG_CPU_SPECTRE=y CONFIG_HARDEN_BRANCH_PREDICTOR=y CONFIG_HARDEN_BRANCH_HISTORY=y CONFIG_KUSER_HELPERS=y CONFIG_VDSO=y CONFIG_MIGHT_HAVE_CACHE_L2X0=y # CONFIG_CACHE_L2X0 is not set CONFIG_ARM_L1_CACHE_SHIFT_6=y CONFIG_ARM_L1_CACHE_SHIFT=6 CONFIG_ARM_DMA_MEM_BUFFERABLE=y CONFIG_DEBUG_ALIGN_RODATA=y # CONFIG_ARM_ERRATA_430973 is not set # CONFIG_ARM_ERRATA_643719 is not set # CONFIG_ARM_ERRATA_720789 is not set # CONFIG_ARM_ERRATA_754322 is not set # CONFIG_ARM_ERRATA_754327 is not set # CONFIG_ARM_ERRATA_764369 is not set # CONFIG_ARM_ERRATA_764319 is not set # CONFIG_ARM_ERRATA_775420 is not set # CONFIG_ARM_ERRATA_798181 is not set # CONFIG_ARM_ERRATA_773022 is not set # CONFIG_ARM_ERRATA_818325_852422 is not set # CONFIG_ARM_ERRATA_821420 is not set # CONFIG_ARM_ERRATA_825619 is not set # CONFIG_ARM_ERRATA_857271 is not set # CONFIG_ARM_ERRATA_852421 is not set # CONFIG_ARM_ERRATA_852423 is not set # CONFIG_ARM_ERRATA_857272 is not set # end of System Type # # Bus support # # CONFIG_ARM_ERRATA_814220 is not set # end of Bus support # # Kernel Features # CONFIG_HAVE_SMP=y CONFIG_SMP=y CONFIG_SMP_ON_UP=y CONFIG_CURRENT_POINTER_IN_TPIDRURO=y CONFIG_IRQSTACKS=y CONFIG_ARM_CPU_TOPOLOGY=y # CONFIG_SCHED_MC is not set # CONFIG_SCHED_SMT is not set CONFIG_HAVE_ARM_ARCH_TIMER=y # CONFIG_MCPM is not set # CONFIG_BIG_LITTLE is not set # CONFIG_VMSPLIT_3G is not set # CONFIG_VMSPLIT_3G_OPT is not set CONFIG_VMSPLIT_2G=y # CONFIG_VMSPLIT_1G is not set CONFIG_PAGE_OFFSET=0x80000000 CONFIG_NR_CPUS=4 # CONFIG_HOTPLUG_CPU is not set # CONFIG_ARM_PSCI is not set CONFIG_ARCH_NR_GPIO=0 CONFIG_HZ_FIXED=0 # CONFIG_HZ_100 is not set # CONFIG_HZ_200 is not set # CONFIG_HZ_250 is not set CONFIG_HZ_300=y # CONFIG_HZ_500 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=300 CONFIG_SCHED_HRTICK=y # CONFIG_THUMB2_KERNEL is not set CONFIG_ARM_PATCH_IDIV=y CONFIG_AEABI=y # CONFIG_OABI_COMPAT is not set CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ARCH_FLATMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_ENABLE=y # CONFIG_HIGHMEM is not set # CONFIG_CPU_SW_DOMAIN_PAN is not set CONFIG_HW_PERF_EVENTS=y CONFIG_ARM_MODULE_PLTS=y CONFIG_ARCH_FORCE_MAX_ORDER=11 CONFIG_ALIGNMENT_TRAP=y CONFIG_UACCESS_WITH_MEMCPY=y # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_XEN is not set CONFIG_CC_HAVE_STACKPROTECTOR_TLS=y CONFIG_STACKPROTECTOR_PER_TASK=y # end of Kernel Features # # Boot options # CONFIG_USE_OF=y CONFIG_ATAGS=y # CONFIG_UNUSED_BOARD_FILES is not set # CONFIG_DEPRECATED_PARAM_STRUCT is not set CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_BSS=0x0 # CONFIG_ARM_APPENDED_DTB is not set CONFIG_CMDLINE="" # CONFIG_CRASH_DUMP is not set CONFIG_AUTO_ZRELADDR=y # CONFIG_EFI is not set # end of Boot options # # CPU Power Management # # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y # CONFIG_CPU_FREQ_GOV_USERSPACE is not set CONFIG_CPU_FREQ_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y CONFIG_CPUFREQ_DT_PLATDEV=y CONFIG_ARM_RASPBERRYPI_CPUFREQ=y # end of CPU Frequency scaling # # CPU Idle # 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 # # CONFIG_ARM_CPUIDLE is not set # end of ARM CPU Idle Drivers # end of CPU Idle # end of CPU Power Management # # Floating point emulation # # # At least one emulation must be selected # CONFIG_VFP=y CONFIG_VFPv3=y CONFIG_NEON=y CONFIG_KERNEL_MODE_NEON=y # end of Floating point emulation # # Power management options # # CONFIG_SUSPEND is not set # CONFIG_HIBERNATION is not set CONFIG_PM=y # CONFIG_PM_DEBUG is not set # CONFIG_APM_EMULATION is not set CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y # end of Power management options CONFIG_AS_VFP_VMRS_FPINST=y # # General architecture-dependent options # CONFIG_KPROBES=y CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set CONFIG_OPTPROBES=y CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_ARCH_USE_BUILTIN_BSWAP=y CONFIG_KRETPROBES=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_KEEPINITRD=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_CPU_FINALIZE_INIT=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_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_LTO_NONE=y CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_REL=y CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=8 CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_HAVE_ARCH_PFN_VALID=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_GZIP is not set # CONFIG_MODULE_COMPRESS_XZ is not set # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLOCK_LEGACY_AUTOLOAD=y CONFIG_BLK_CGROUP_RWSTAT=y CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_ICQ=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_DEV_THROTTLING_LOW is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_CGROUP_IOLATENCY is not set # CONFIG_BLK_CGROUP_IOCOST is not set # CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set CONFIG_LDM_PARTITION=y # CONFIG_LDM_DEBUG is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set # end of Partition Types CONFIG_BLK_PM=y CONFIG_BLOCK_HOLDER_DEPRECATED=y CONFIG_BLK_MQ_STACKING=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y CONFIG_IOSCHED_BFQ=y # CONFIG_BFQ_GROUP_IOSCHED is not set # end of IO Schedulers CONFIG_ASN1=y CONFIG_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_INLINE_READ_UNLOCK=y CONFIG_INLINE_READ_UNLOCK_IRQ=y CONFIG_INLINE_WRITE_UNLOCK=y CONFIG_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_ELF_FDPIC is not set CONFIG_ELFCORE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y CONFIG_ARCH_HAS_BINFMT_FLAT=y # CONFIG_BINFMT_FLAT is not set CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # CONFIG_SWAP=y # CONFIG_ZSWAP is not set # # SLAB allocator options # # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y # end of SLAB allocator options # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set # CONFIG_COMPAT_BRK is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_ARCH_KEEP_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_COMPACTION=y CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 # CONFIG_PAGE_REPORTING is not set CONFIG_MIGRATION=y CONFIG_CONTIG_ALLOC=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set CONFIG_CMA_DEBUGFS=y # CONFIG_CMA_SYSFS is not set CONFIG_CMA_AREAS=7 CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ZONE_DMA=y CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set # CONFIG_ANON_VMA_NAME is not set # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set CONFIG_LOCK_MM_AND_FIND_VMA=y # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y CONFIG_NET_EGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_INTERFACE is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_ESP=y # CONFIG_NET_KEY is not set # CONFIG_XDP_SOCKETS is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=m CONFIG_IP_MROUTE_COMMON=y CONFIG_IP_MROUTE=y # CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set # CONFIG_IP_PIMSM_V1 is not set # CONFIG_IP_PIMSM_V2 is not set # CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set CONFIG_INET_ESP=y # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=m # CONFIG_INET_DIAG is not set CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set CONFIG_TCP_CONG_CUBIC=y # CONFIG_TCP_CONG_WESTWOOD is not set CONFIG_TCP_CONG_HTCP=m CONFIG_TCP_CONG_HSTCP=m # CONFIG_TCP_CONG_HYBLA is not set CONFIG_TCP_CONG_VEGAS=m # CONFIG_TCP_CONG_NV is not set CONFIG_TCP_CONG_SCALABLE=m # CONFIG_TCP_CONG_LP is not set CONFIG_TCP_CONG_VENO=m CONFIG_TCP_CONG_YEAH=m CONFIG_TCP_CONG_ILLINOIS=m # CONFIG_TCP_CONG_DCTCP is not set CONFIG_TCP_CONG_CDG=m # CONFIG_TCP_CONG_BBR is not set CONFIG_DEFAULT_CUBIC=y # CONFIG_DEFAULT_RENO is not set CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_IPV6_VTI is not set CONFIG_IPV6_SIT=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set CONFIG_IPV6_FOU=m # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set # CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # # CONFIG_NETFILTER_INGRESS is not set CONFIG_NETFILTER_EGRESS=y CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_FAMILY_BRIDGE=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set CONFIG_NETFILTER_NETLINK_LOG=m # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=m # CONFIG_NF_LOG_SYSLOG is not set # CONFIG_NF_CONNTRACK_MARK is not set # CONFIG_NF_CONNTRACK_ZONES is not set # CONFIG_NF_CONNTRACK_PROCFS is not set # CONFIG_NF_CONNTRACK_EVENTS is not set # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set # CONFIG_NF_CT_PROTO_DCCP is not set # CONFIG_NF_CT_PROTO_SCTP is not set # CONFIG_NF_CT_PROTO_UDPLITE is not set # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set CONFIG_NF_CONNTRACK_IRC=m CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set CONFIG_NF_CONNTRACK_SIP=m CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m # CONFIG_NETFILTER_NETLINK_GLUE_CT is not set CONFIG_NF_NAT=m CONFIG_NF_NAT_FTP=m CONFIG_NF_NAT_IRC=m CONFIG_NF_NAT_SIP=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 # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set CONFIG_NETFILTER_XT_MATCH_IPRANGE=m CONFIG_NETFILTER_XT_MATCH_IPVS=m # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set CONFIG_NETFILTER_XT_MATCH_OWNER=m # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set CONFIG_NETFILTER_XT_MATCH_STATE=m # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set CONFIG_IP_VS=m # CONFIG_IP_VS_IPV6 is not set # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # CONFIG_IP_VS_PROTO_ESP is not set # CONFIG_IP_VS_PROTO_AH is not set # CONFIG_IP_VS_PROTO_SCTP is not set # # IPVS scheduler # CONFIG_IP_VS_RR=m # CONFIG_IP_VS_WRR is not set # CONFIG_IP_VS_LC is not set # CONFIG_IP_VS_WLC is not set # CONFIG_IP_VS_FO is not set # CONFIG_IP_VS_OVF is not set # CONFIG_IP_VS_LBLC is not set # CONFIG_IP_VS_LBLCR is not set # CONFIG_IP_VS_DH is not set # CONFIG_IP_VS_SH is not set # CONFIG_IP_VS_MH is not set # CONFIG_IP_VS_SED is not set # CONFIG_IP_VS_NQ is not set # CONFIG_IP_VS_TWOS is not set # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS MH scheduler # CONFIG_IP_VS_MH_TAB_INDEX=12 # # IPVS application helper # # CONFIG_IP_VS_FTP is not set CONFIG_IP_VS_NFCT=y # CONFIG_IP_VS_PE_SIP is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set CONFIG_NF_REJECT_IPV4=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_ARPTABLES is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m # CONFIG_NF_LOG_IPV6 is not set CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_MATCH_SRH is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m # CONFIG_IP6_NF_TARGET_NPT is not set # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_CONNTRACK_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y # CONFIG_BRIDGE_MRP is not set # CONFIG_BRIDGE_CFM is not set # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set CONFIG_NET_SCH_FQ_CODEL=y # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set # CONFIG_NET_SCH_DEFAULT is not set # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_FLOW is not set CONFIG_NET_CLS_CGROUP=m # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set CONFIG_NET_L3_MASTER_DEV=y # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_STREAM_PARSER is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # end of Network testing # end of Networking options # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=m CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y # CONFIG_BT_BNEP is not set CONFIG_BT_HIDP=m CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_LEDS is not set # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set # CONFIG_BT_DEBUGFS is not set # CONFIG_BT_SELFTEST is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_MTK=m CONFIG_BT_HCIBTUSB=m # CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set CONFIG_BT_HCIBTUSB_BCM=y CONFIG_BT_HCIBTUSB_MTK=y CONFIG_BT_HCIBTUSB_RTL=y # CONFIG_BT_HCIBTSDIO is not set 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 is not set # CONFIG_BT_HCIUART_ATH3K is not set # CONFIG_BT_HCIUART_LL is not set CONFIG_BT_HCIUART_3WIRE=y # CONFIG_BT_HCIUART_INTEL is not set CONFIG_BT_HCIUART_BCM=y # CONFIG_BT_HCIUART_RTL is not set # CONFIG_BT_HCIUART_QCA is not set # CONFIG_BT_HCIUART_AG6XX is not set # CONFIG_BT_HCIUART_MRVL is not set CONFIG_BT_HCIBCM203X=m # CONFIG_BT_HCIBPA10X is not set CONFIG_BT_HCIBFUSB=m # CONFIG_BT_HCIVHCI is not set # CONFIG_BT_MRVL is not set CONFIG_BT_ATH3K=m CONFIG_BT_MTKSDIO=m # CONFIG_BT_MTKUART is not set # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set # CONFIG_CFG80211_CRDA_SUPPORT is not set CONFIG_CFG80211_WEXT=y CONFIG_LIB80211=m CONFIG_LIB80211_CRYPT_WEP=m CONFIG_LIB80211_CRYPT_CCMP=m # CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=m CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_PAGE_POOL=y # CONFIG_PAGE_POOL_STATS is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y # # Device Drivers # CONFIG_ARM_AMBA=y CONFIG_HAVE_PCI=y # CONFIG_PCI is not set # CONFIG_PCCARD is not set # # Generic Driver Options # # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y # CONFIG_DEVTMPFS_SAFE is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set # CONFIG_FW_UPLOAD is not set # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y # CONFIG_ALLOW_DEV_COREDUMP is not set # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set CONFIG_GENERIC_ARCH_TOPOLOGY=y # end of Generic Driver Options # # Bus devices # # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_MOXTET is not set # CONFIG_VEXPRESS_CONFIG is not set # CONFIG_MHI_BUS is not set # CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # # CONFIG_ARM_SCMI_PROTOCOL is not set # end of ARM System Control and Management Interface Protocol # CONFIG_ARM_SCPI_PROTOCOL is not set # CONFIG_FIRMWARE_MEMMAP is not set CONFIG_RASPBERRYPI_FIRMWARE=y # CONFIG_FW_CFG_SYSFS is not set # CONFIG_TRUSTED_FOUNDATIONS is not set CONFIG_CS_DSP=m # CONFIG_GOOGLE_FIRMWARE is not set CONFIG_HAVE_ARM_SMCCC=y # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set # CONFIG_MTD is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_DYNAMIC=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_RESERVED_MEM=y CONFIG_OF_RESOLVE=y CONFIG_OF_OVERLAY=y CONFIG_OF_CONFIGFS=y CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_CDROM=y # CONFIG_ZRAM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=0 # CONFIG_BLK_DEV_DRBD is not set CONFIG_BLK_DEV_NBD=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=4096 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_UBLK is not set # # NVME Support # # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set # CONFIG_NVME_TARGET is not set # end of NVME Support # # Misc devices # CONFIG_BCM2835_SMI=m # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set # CONFIG_XILINX_SDFEC is not set CONFIG_MISC_RTSX=y # CONFIG_OPEN_DICE is not set # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # CONFIG_ECHO is not set CONFIG_MISC_RTSX_USB=y # CONFIG_PVPANIC is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=m CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_SCAN_ASYNC is not set # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set CONFIG_SCSI_ISCSI_ATTRS=y # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports CONFIG_SCSI_LOWLEVEL=y CONFIG_ISCSI_TCP=y CONFIG_ISCSI_BOOT_SYSFS=y # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_DH is not set # end of SCSI device support # CONFIG_ATA is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=m # CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m # CONFIG_DM_UNSTRIPED is not set # CONFIG_DM_CRYPT is not set # CONFIG_DM_SNAPSHOT is not set CONFIG_DM_THIN_PROVISIONING=m # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_EBS is not set # CONFIG_DM_ERA is not set # CONFIG_DM_CLONE is not set # CONFIG_DM_MIRROR is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_DUST is not set # CONFIG_DM_UEVENT is not set # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_DM_INTEGRITY is not set # CONFIG_TARGET_CORE is not set CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set CONFIG_DUMMY=m CONFIG_WIREGUARD=m # CONFIG_WIREGUARD_DEBUG is not set # CONFIG_EQUALIZER is not set # 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 # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_AMT is not set # CONFIG_MACSEC is not set CONFIG_NETCONSOLE=y CONFIG_NETCONSOLE_DYNAMIC=y CONFIG_NETPOLL=y CONFIG_NET_POLL_CONTROLLER=y CONFIG_TUN=y # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m CONFIG_NLMON=m # CONFIG_ETHERNET is not set CONFIG_PHYLINK=m CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_SFP is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_ADIN_PHY is not set # CONFIG_ADIN1100_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=m # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM54140_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set # CONFIG_MAXLINEAR_GPHY is not set # CONFIG_MEDIATEK_GE_PHY is not set # CONFIG_MICREL_PHY is not set CONFIG_MICROCHIP_PHY=y # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set # CONFIG_MOTORCOMM_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_QSEMI_PHY is not set # CONFIG_REALTEK_PHY is not set # CONFIG_RENESAS_PHY is not set # CONFIG_ROCKCHIP_PHY is not set CONFIG_SMSC_PHY=y # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_DP83TD510_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set # CONFIG_PSE_CONTROLLER is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_OF_MDIO=y CONFIG_MDIO_DEVRES=y # CONFIG_MDIO_BITBANG is not set # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_IPQ4019 is not set # CONFIG_MDIO_IPQ8064 is not set # # MDIO Multiplexers # # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # # PCS device drivers # # end of PCS device drivers CONFIG_PPP=m CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set CONFIG_PPP_MPPE=m # CONFIG_PPP_MULTILINK is not set CONFIG_PPPOE=m CONFIG_PPP_ASYNC=m # CONFIG_PPP_SYNC_TTY is not set # CONFIG_SLIP is not set CONFIG_SLHC=m CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set # CONFIG_USB_RTL8150 is not set CONFIG_USB_RTL8152=m CONFIG_USB_LAN78XX=y CONFIG_USB_USBNET=y CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m # CONFIG_USB_NET_CDC_EEM is not set # CONFIG_USB_NET_CDC_NCM is not set # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set CONFIG_USB_NET_DM9601=y # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=y # CONFIG_USB_NET_GL620A is not set # CONFIG_USB_NET_NET1080 is not set # CONFIG_USB_NET_PLUSB is not set CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m # CONFIG_USB_NET_CDC_SUBSET is not set # CONFIG_USB_NET_ZAURUS is not set # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set CONFIG_USB_HSO=m # CONFIG_USB_NET_INT51X1 is not set CONFIG_USB_IPHETH=m # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m CONFIG_ATH9K_AHB=y # CONFIG_ATH9K_DEBUGFS is not set # CONFIG_ATH9K_DYNACK is not set # CONFIG_ATH9K_WOW is not set CONFIG_ATH9K_RFKILL=y CONFIG_ATH9K_CHANNEL_CONTEXT=y CONFIG_ATH9K_PCOEM=y CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_ATH9K_HWRNG=y CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y CONFIG_CARL9170_HWRNG=y CONFIG_ATH6KL=m # CONFIG_ATH6KL_SDIO is not set CONFIG_ATH6KL_USB=m # CONFIG_ATH6KL_DEBUG is not set # CONFIG_ATH6KL_TRACING is not set CONFIG_AR5523=m # CONFIG_ATH10K is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set CONFIG_WLAN_VENDOR_ATMEL=y # CONFIG_AT76C50X_USB is not set CONFIG_WLAN_VENDOR_BROADCOM=y CONFIG_B43=m CONFIG_B43_BCMA=y CONFIG_B43_SSB=y CONFIG_B43_BUSES_BCMA_AND_SSB=y # CONFIG_B43_BUSES_BCMA is not set # CONFIG_B43_BUSES_SSB is not set # CONFIG_B43_SDIO is not set CONFIG_B43_BCMA_PIO=y CONFIG_B43_PIO=y CONFIG_B43_PHY_G=y CONFIG_B43_PHY_N=y CONFIG_B43_PHY_LP=y CONFIG_B43_PHY_HT=y CONFIG_B43_LEDS=y CONFIG_B43_HWRNG=y # CONFIG_B43_DEBUG is not set # CONFIG_B43LEGACY is not set CONFIG_BRCMUTIL=m # CONFIG_BRCMSMAC is not set CONFIG_BRCMFMAC=m CONFIG_BRCMFMAC_PROTO_BCDC=y CONFIG_BRCMFMAC_SDIO=y CONFIG_BRCMFMAC_USB=y # CONFIG_BRCM_TRACING is not set # CONFIG_BRCMDBG is not set CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_HOSTAP is not set CONFIG_P54_COMMON=m CONFIG_P54_USB=m # CONFIG_P54_SPI is not set CONFIG_P54_LEDS=y CONFIG_WLAN_VENDOR_MARVELL=y # CONFIG_LIBERTAS is not set # CONFIG_LIBERTAS_THINFIRM is not set # CONFIG_MWIFIEX is not set CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m CONFIG_MT76_CORE=m CONFIG_MT76_LEDS=y CONFIG_MT76_USB=m CONFIG_MT76x02_LIB=m CONFIG_MT76x02_USB=m CONFIG_MT76_CONNAC_LIB=m CONFIG_MT76x0_COMMON=m CONFIG_MT76x0U=m CONFIG_MT76x2_COMMON=m CONFIG_MT76x2U=m CONFIG_MT7615_COMMON=m CONFIG_MT7663_USB_SDIO_COMMON=m CONFIG_MT7663U=m # CONFIG_MT7663S is not set # CONFIG_MT7921S is not set # CONFIG_MT7921U is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set CONFIG_WLAN_VENDOR_PURELIFI=y # CONFIG_PLFXLC is not set CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WLAN_VENDOR_REALTEK=y CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y CONFIG_RTL_CARDS=m # CONFIG_RTL8192CU is not set CONFIG_RTL8XXXU=m CONFIG_RTL8XXXU_UNTESTED=y CONFIG_RTW88=m # CONFIG_RTW89 is not set CONFIG_WLAN_VENDOR_RSI=y # CONFIG_RSI_91X is not set CONFIG_WLAN_VENDOR_SILABS=y # CONFIG_WFX is not set CONFIG_WLAN_VENDOR_ST=y # CONFIG_CW1200 is not set CONFIG_WLAN_VENDOR_TI=y # CONFIG_WL1251 is not set # CONFIG_WL12XX is not set # CONFIG_WL18XX is not set # CONFIG_WLCORE is not set CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_USB_ZD1201=m CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set # CONFIG_WLAN_VENDOR_QUANTENNA is not set # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y # CONFIG_INPUT_MOUSEDEV_PSAUX is not set CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set # CONFIG_KEYBOARD_ATKBD is not set # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=m # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_PINEPHONE is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set # CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set # CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y CONFIG_JOYSTICK_PSXPAD_SPI=m CONFIG_JOYSTICK_PSXPAD_SPI_FF=y # CONFIG_JOYSTICK_PXRC is not set # CONFIG_JOYSTICK_QWIIC is not set # CONFIG_JOYSTICK_FSIA6B is not set # CONFIG_JOYSTICK_SENSEHAT is not set # CONFIG_JOYSTICK_RPISENSE is not set # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_ADS7846=m # CONFIG_TOUCHSCREEN_AD7877 is not set # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_AR1021_I2C is not set # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_BU21029 is not set # CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set # CONFIG_TOUCHSCREEN_CY8CTMA140 is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set CONFIG_TOUCHSCREEN_EGALAX=m # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set # CONFIG_TOUCHSCREEN_EXC3000 is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_HIDEEP is not set # CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_ILITEK is not set # CONFIG_TOUCHSCREEN_S6SY761 is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set # CONFIG_TOUCHSCREEN_ELAN is not set # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MSG2638 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_IMAGIS is not set # CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set CONFIG_TOUCHSCREEN_EDT_FT5X06=m CONFIG_TOUCHSCREEN_RASPBERRYPI_FW=m # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set CONFIG_TOUCHSCREEN_USB_COMPOSITE=m CONFIG_TOUCHSCREEN_USB_EGALAX=y # CONFIG_TOUCHSCREEN_USB_PANJIT is not set CONFIG_TOUCHSCREEN_USB_3M=y # CONFIG_TOUCHSCREEN_USB_ITM is not set # CONFIG_TOUCHSCREEN_USB_ETURBO is not set # CONFIG_TOUCHSCREEN_USB_GUNZE is not set # CONFIG_TOUCHSCREEN_USB_DMC_TSC10 is not set # CONFIG_TOUCHSCREEN_USB_IRTOUCH is not set # CONFIG_TOUCHSCREEN_USB_IDEALTEK is not set # CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH is not set # CONFIG_TOUCHSCREEN_USB_GOTOP is not set # CONFIG_TOUCHSCREEN_USB_JASTEC is not set # CONFIG_TOUCHSCREEN_USB_ELO is not set # CONFIG_TOUCHSCREEN_USB_E2I is not set # CONFIG_TOUCHSCREEN_USB_ZYTRONIC is not set # CONFIG_TOUCHSCREEN_USB_ETT_TC45USB is not set # CONFIG_TOUCHSCREEN_USB_NEXIO is not set # CONFIG_TOUCHSCREEN_USB_EASYTOUCH is not set # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2004 is not set # CONFIG_TOUCHSCREEN_TSC2005 is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_RM_TS is not set # CONFIG_TOUCHSCREEN_SILEAD is not set # CONFIG_TOUCHSCREEN_SIS_I2C is not set CONFIG_TOUCHSCREEN_ST1232=m # CONFIG_TOUCHSCREEN_STMFTS is not set # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set # CONFIG_TOUCHSCREEN_SX8654 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZET6223 is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_IQS5XX is not set # CONFIG_TOUCHSCREEN_ZINITIX is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ARIZONA_HAPTICS is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set CONFIG_INPUT_GPIO_ROTARY_ENCODER=m # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_INPUT_RASPBERRYPI_BUTTON is not set CONFIG_RMI4_CORE=y # CONFIG_RMI4_I2C is not set # CONFIG_RMI4_SPI is not set # CONFIG_RMI4_SMB is not set CONFIG_RMI4_F03=y CONFIG_RMI4_F03_SERIO=y CONFIG_RMI4_2D_SENSOR=y CONFIG_RMI4_F11=y CONFIG_RMI4_F12=y CONFIG_RMI4_F30=y # CONFIG_RMI4_F34 is not set # CONFIG_RMI4_F3A is not set # CONFIG_RMI4_F55 is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_AMBAKMI is not set # CONFIG_SERIO_LIBPS2 is not set # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_SERIO_GPIO_PS2 is not set # CONFIG_USERIO is not set # CONFIG_GAMEPORT is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_BRCM_CHAR_DRIVERS=y CONFIG_BCM2708_VCMEM=y CONFIG_BCM_VCIO=y CONFIG_BCM2835_SMI_DEV=m # CONFIG_RPIVID_MEM is not set CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y # CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set CONFIG_SERIAL_8250_16550A_VARIANTS=y # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y # CONFIG_SERIAL_8250_DMA is not set CONFIG_SERIAL_8250_NR_UARTS=1 CONFIG_SERIAL_8250_RUNTIME_UARTS=0 CONFIG_SERIAL_8250_EXTENDED=y # CONFIG_SERIAL_8250_MANY_PORTS is not set CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_RSA is not set CONFIG_SERIAL_8250_BCM2835AUX=y CONFIG_SERIAL_8250_FSL=y # CONFIG_SERIAL_8250_DW is not set # CONFIG_SERIAL_8250_RT288X is not set CONFIG_SERIAL_OF_PLATFORM=y # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_SIFIVE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_ST_ASC is not set # CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_NULL_TTY is not set # CONFIG_HVC_DCC is not set CONFIG_SERIAL_DEV_BUS=y CONFIG_SERIAL_DEV_CTRL_TTYPORT=y # CONFIG_TTY_PRINTK is not set # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_BA431 is not set CONFIG_HW_RANDOM_BCM2835=y CONFIG_HW_RANDOM_IPROC_RNG200=y # CONFIG_HW_RANDOM_CCTRNG is not set # CONFIG_HW_RANDOM_XIPHERA is not set CONFIG_DEVMEM=y # CONFIG_TCG_TPM is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y CONFIG_RANDOM_TRUST_BOOTLOADER=y CONFIG_RASPBERRYPI_GPIOMEM=y # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y # CONFIG_I2C_COMPAT is not set CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_GPMUX is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set CONFIG_I2C_MUX_PINCTRL=y # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_DEMUX_PINCTRL is not set # CONFIG_I2C_MUX_MLXCPLD is not set # end of Multiplexer I2C Chip support CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # CONFIG_I2C_BCM2708=y CONFIG_I2C_BCM2708_BAUDRATE=100000 # # I2C system bus drivers (mostly embedded / system-on-chip) # CONFIG_I2C_BCM2835=y # CONFIG_I2C_BRCMSTB is not set # CONFIG_I2C_CBUS_GPIO is not set # CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_EMEV2 is not set CONFIG_I2C_GPIO=y # CONFIG_I2C_GPIO_FAULT_INJECTOR is not set # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_RK3X is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y # CONFIG_SPI_MEM is not set # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set CONFIG_SPI_BCM2835=m CONFIG_SPI_BCM2835AUX=m # CONFIG_SPI_BCM_QSPI is not set # CONFIG_SPI_BITBANG is not set # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_CADENCE_QUADSPI 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_MICROCHIP_CORE is not set # CONFIG_SPI_MICROCHIP_CORE_QSPI is not set # CONFIG_SPI_OC_TINY is not set # CONFIG_SPI_PL022 is not set # CONFIG_SPI_ROCKCHIP is not set # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_SIFIVE is not set # CONFIG_SPI_MXIC is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_AMD is not set # # SPI Multiplexer support # # CONFIG_SPI_MUX is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=y # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set CONFIG_SPI_DYNAMIC=y # CONFIG_SPMI is not set # CONFIG_HSI is not set # CONFIG_PPS is not set # # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # # end of PTP clock support CONFIG_PINCTRL=y CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_CY8C95X0 is not set # CONFIG_PINCTRL_MCP23S08 is not set # CONFIG_PINCTRL_MICROCHIP_SGPIO is not set # CONFIG_PINCTRL_OCELOT is not set # CONFIG_PINCTRL_SINGLE is not set # CONFIG_PINCTRL_STMFX is not set # CONFIG_PINCTRL_SX150X is not set # CONFIG_PINCTRL_RP1 is not set # CONFIG_PINCTRL_BCM2712 is not set CONFIG_PINCTRL_BCM2835=y # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y CONFIG_GPIO_CDEV=y CONFIG_GPIO_CDEV_V1=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set CONFIG_GPIO_RASPBERRYPI_EXP=y CONFIG_GPIO_BCM_VIRT=y # CONFIG_GPIO_BRCMSTB is not set # CONFIG_GPIO_CADENCE is not set # CONFIG_GPIO_DWAPB is not set # CONFIG_GPIO_FTGPIO010 is not set # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HLWD is not set # CONFIG_GPIO_LOGICVC is not set # CONFIG_GPIO_MB86S7X is not set # CONFIG_GPIO_MPC8XXX is not set # CONFIG_GPIO_PL061 is not set # CONFIG_GPIO_PWM is not set # CONFIG_GPIO_SIFIVE is not set # 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 # end of Memory mapped GPIO drivers # # I2C GPIO expanders # # 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 # CONFIG_GPIO_PCA9570 is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # CONFIG_GPIO_ARIZONA=m # CONFIG_HTC_EGPIO is not set CONFIG_GPIO_FSM=m # end of MFD GPIO expanders # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # end of SPI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers CONFIG_W1=m # # 1-wire Bus Masters # # CONFIG_W1_MASTER_DS2490 is not set # CONFIG_W1_MASTER_DS2482 is not set # CONFIG_W1_MASTER_DS1WM is not set CONFIG_W1_MASTER_GPIO=m # CONFIG_W1_MASTER_SGI is not set # end of 1-wire Bus Masters # # 1-wire Slaves # CONFIG_W1_SLAVE_THERM=m # CONFIG_W1_SLAVE_SMEM is not set # CONFIG_W1_SLAVE_DS2405 is not set # CONFIG_W1_SLAVE_DS2408 is not set # CONFIG_W1_SLAVE_DS2413 is not set # CONFIG_W1_SLAVE_DS2406 is not set # CONFIG_W1_SLAVE_DS2423 is not set # CONFIG_W1_SLAVE_DS2805 is not set # CONFIG_W1_SLAVE_DS2430 is not set # CONFIG_W1_SLAVE_DS2431 is not set # CONFIG_W1_SLAVE_DS2433 is not set # CONFIG_W1_SLAVE_DS2438 is not set # CONFIG_W1_SLAVE_DS250X is not set # CONFIG_W1_SLAVE_DS2780 is not set # CONFIG_W1_SLAVE_DS2781 is not set # CONFIG_W1_SLAVE_DS28E04 is not set # CONFIG_W1_SLAVE_DS28E17 is not set # end of 1-wire Slaves CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_BRCMKONA is not set # CONFIG_POWER_RESET_BRCMSTB is not set CONFIG_POWER_RESET_GPIO=y CONFIG_POWER_RESET_GPIO_RESTART=y # CONFIG_POWER_RESET_LTC2952 is not set # CONFIG_POWER_RESET_REGULATOR is not set CONFIG_POWER_RESET_RESTART=y # CONFIG_POWER_RESET_VERSATILE is not set # CONFIG_POWER_RESET_SYSCON is not set # CONFIG_POWER_RESET_SYSCON_POWEROFF is not set # CONFIG_SYSCON_REBOOT_MODE is not set # CONFIG_NVMEM_REBOOT_MODE is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y CONFIG_RPI_POE_POWER=m # CONFIG_PDA_POWER is not set # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2760 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_BATTERY_MAX1721X is not set # CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set # CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_UCS1002 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set CONFIG_SENSORS_GPIO_FAN=m # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX31730 is not set # CONFIG_SENSORS_MAX31760 is not set # CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_NZXT_KRAKEN2 is not set # CONFIG_SENSORS_NZXT_SMART2 is not set # CONFIG_SENSORS_OCC_P8_I2C is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set CONFIG_SENSORS_PWM_FAN=m CONFIG_SENSORS_RASPBERRYPI_HWMON=y # CONFIG_SENSORS_SBTSI is not set # CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y # CONFIG_THERMAL_WRITABLE_TRIPS is not set CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set # CONFIG_CPU_THERMAL is not set # CONFIG_THERMAL_EMULATION is not set # CONFIG_THERMAL_MMIO is not set # # Broadcom thermal drivers # # CONFIG_BCM2711_THERMAL is not set CONFIG_BCM2835_THERMAL=y # end of Broadcom thermal drivers CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 # CONFIG_WATCHDOG_SYSFS is not set # CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_FTWDT010_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_ARM_SMC_WATCHDOG is not set CONFIG_BCM2835_WDT=y # CONFIG_MEN_A21_WDT is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y CONFIG_SSB=m CONFIG_SSB_BLOCKIO=y CONFIG_SSB_SDIOHOST_POSSIBLE=y # CONFIG_SSB_SDIOHOST is not set # CONFIG_SSB_DRIVER_GPIO is not set CONFIG_BCMA_POSSIBLE=y CONFIG_BCMA=m CONFIG_BCMA_BLOCKIO=y # CONFIG_BCMA_HOST_SOC is not set CONFIG_BCMA_DRIVER_GMAC_CMN=y # CONFIG_BCMA_DRIVER_GPIO is not set # CONFIG_BCMA_DEBUG is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_RPISENSE_CORE is not set # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set # CONFIG_MFD_ASIC3 is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_GATEWORKS_GSC is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77620 is not set # CONFIG_MFD_MAX77650 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77714 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_OCELOT is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_CPCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_NTXEC is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_PM8XXX is not set # CONFIG_MFD_SY7636A is not set CONFIG_MFD_RASPBERRYPI_POE_HAT=m # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_RK808 is not set # CONFIG_MFD_RN5T618 is not set # CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set CONFIG_MFD_SIMPLE_MFD_I2C=m # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TC3589X is not set # 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=m CONFIG_MFD_ARIZONA_I2C=m CONFIG_MFD_ARIZONA_SPI=m # CONFIG_MFD_CS47L24 is not set CONFIG_MFD_WM5102=y # CONFIG_MFD_WM5110 is not set # CONFIG_MFD_WM8997 is not set # CONFIG_MFD_WM8998 is not set # CONFIG_MFD_WM8400 is not set # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ROHM_BD718XX is not set # CONFIG_MFD_ROHM_BD71828 is not set # CONFIG_MFD_ROHM_BD957XMUF is not set # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_MFD_QCOM_PM8008 is not set # CONFIG_RAVE_SP_CORE is not set # CONFIG_MFD_INTEL_M10_BMC is not set # CONFIG_MFD_RSMU_I2C is not set # CONFIG_MFD_RSMU_SPI is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set CONFIG_REGULATOR_ARIZONA_LDO1=m CONFIG_REGULATOR_ARIZONA_MICSUPP=m # CONFIG_REGULATOR_DA9121 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set # CONFIG_REGULATOR_FAN53880 is not set # CONFIG_REGULATOR_GPIO is not set # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MAX20086 is not set # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MCP16502 is not set # CONFIG_REGULATOR_MP5416 is not set # CONFIG_REGULATOR_MP8859 is not set # CONFIG_REGULATOR_MP886X is not set # CONFIG_REGULATOR_MPQ7920 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PF8X00 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set # CONFIG_REGULATOR_PWM is not set CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY=y # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_SY8106A is not set # CONFIG_REGULATOR_SY8824X is not set # CONFIG_REGULATOR_SY8827N is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS6286X is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_VCTRL is not set CONFIG_RC_CORE=y CONFIG_BPF_LIRC_MODE2=y CONFIG_LIRC=y CONFIG_RC_MAP=m CONFIG_RC_DECODERS=y CONFIG_IR_IMON_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_MCE_KBD_DECODER=m CONFIG_IR_NEC_DECODER=m CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m CONFIG_IR_RCMM_DECODER=m CONFIG_IR_SANYO_DECODER=m CONFIG_IR_SHARP_DECODER=m CONFIG_IR_SONY_DECODER=m CONFIG_IR_XMP_DECODER=m CONFIG_RC_DEVICES=y CONFIG_IR_GPIO_CIR=m CONFIG_IR_GPIO_TX=m # CONFIG_IR_HIX5HD2 is not set CONFIG_IR_IGORPLUGUSB=m CONFIG_IR_IGUANA=m CONFIG_IR_IMON=m CONFIG_IR_IMON_RAW=m CONFIG_IR_MCEUSB=m CONFIG_IR_PWM_TX=m CONFIG_IR_REDRAT3=m # CONFIG_IR_SERIAL is not set # CONFIG_IR_SPI is not set CONFIG_IR_STREAMZAP=m CONFIG_IR_TOY=m CONFIG_IR_TTUSBIR=m CONFIG_RC_ATI_REMOTE=m # CONFIG_RC_LOOPBACK is not set CONFIG_RC_XBOX_DVD=m CONFIG_CEC_CORE=y # # CEC support # # CONFIG_MEDIA_CEC_RC is not set # CONFIG_MEDIA_CEC_SUPPORT is not set # end of CEC support CONFIG_MEDIA_SUPPORT=m # CONFIG_MEDIA_SUPPORT_FILTER is not set CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y CONFIG_MEDIA_RADIO_SUPPORT=y CONFIG_MEDIA_SDR_SUPPORT=y CONFIG_MEDIA_PLATFORM_SUPPORT=y CONFIG_MEDIA_TEST_SUPPORT=y # end of Media device types # # Media core support # CONFIG_VIDEO_DEV=m CONFIG_MEDIA_CONTROLLER=y CONFIG_DVB_CORE=m # end of Media core support # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y CONFIG_VIDEO_V4L2_SUBDEV_API=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_VIDEO_TUNER=m CONFIG_V4L2_MEM2MEM_DEV=m # CONFIG_V4L2_FLASH_LED_CLASS is not set CONFIG_V4L2_FWNODE=m CONFIG_V4L2_ASYNC=m # end of Video4Linux options # # Media controller options # CONFIG_MEDIA_CONTROLLER_DVB=y # end of Media controller options # # Digital TV options # # CONFIG_DVB_MMAP is not set CONFIG_DVB_NET=y CONFIG_DVB_MAX_ADAPTERS=8 # CONFIG_DVB_DYNAMIC_MINORS is not set # CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set # CONFIG_DVB_ULE_DEBUG is not set # end of Digital TV options # # Media drivers # # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_USB_S2255 is not set CONFIG_VIDEO_USBTV=m CONFIG_USB_VIDEO_CLASS=m # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set # # Analog TV USB devices # # CONFIG_VIDEO_GO7007 is not set CONFIG_VIDEO_HDPVR=m CONFIG_VIDEO_PVRUSB2=m CONFIG_VIDEO_PVRUSB2_SYSFS=y CONFIG_VIDEO_PVRUSB2_DVB=y # CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set CONFIG_VIDEO_STK1160_COMMON=m CONFIG_VIDEO_STK1160=m # # Analog/digital TV USB devices # CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_AU0828_V4L2=y CONFIG_VIDEO_AU0828_RC=y CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y # CONFIG_VIDEO_CX231XX_ALSA is not set CONFIG_VIDEO_CX231XX_DVB=m # # Digital TV USB devices # CONFIG_DVB_AS102=m CONFIG_DVB_B2C2_FLEXCOP_USB=m # CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set CONFIG_DVB_USB_V2=m CONFIG_DVB_USB_AF9015=m CONFIG_DVB_USB_AF9035=m CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_AZ6007=m CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_DVBSKY=m CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_GL861=m CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m CONFIG_DVB_USB_ZD1301=m CONFIG_DVB_USB=m # CONFIG_DVB_USB_DEBUG is not set CONFIG_DVB_USB_A800=m CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_CXUSB=m # CONFIG_DVB_USB_CXUSB_ANALOG is not set CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_DIB3000MC=m CONFIG_DVB_USB_DIBUSB_MB=m CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y CONFIG_DVB_USB_DIBUSB_MC=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_DTT200U=m CONFIG_DVB_USB_DTV5100=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_GP8PSK=m CONFIG_DVB_USB_M920X=m CONFIG_DVB_USB_NOVA_T_USB2=m CONFIG_DVB_USB_OPERA1=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_TTUSB2=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_VP7045=m CONFIG_SMS_USB_DRV=m # # Webcam, TV (analog/digital) USB devices # CONFIG_VIDEO_EM28XX=m # CONFIG_VIDEO_EM28XX_V4L2 is not set # CONFIG_VIDEO_EM28XX_ALSA is not set CONFIG_VIDEO_EM28XX_DVB=m CONFIG_VIDEO_EM28XX_RC=m # # Software defined radio USB devices # # CONFIG_USB_AIRSPY is not set # CONFIG_USB_HACKRF is not set # CONFIG_USB_MSI2500 is not set # CONFIG_RADIO_ADAPTERS is not set CONFIG_MEDIA_PLATFORM_DRIVERS=y # CONFIG_V4L_PLATFORM_DRIVERS is not set # CONFIG_SDR_PLATFORM_DRIVERS is not set # CONFIG_DVB_PLATFORM_DRIVERS is not set # CONFIG_V4L_MEM2MEM_DRIVERS is not set # # Allegro DVT media platform drivers # # # Amlogic media platform drivers # # # Amphion drivers # # # Aspeed media platform drivers # # # Atmel media platform drivers # # CONFIG_VIDEO_BCM2835_UNICAM is not set # # Cadence media platform drivers # # CONFIG_VIDEO_CADENCE_CSI2RX is not set # CONFIG_VIDEO_CADENCE_CSI2TX is not set # # Chips&Media media platform drivers # # # Intel media platform drivers # # # Marvell media platform drivers # # # Mediatek media platform drivers # # # NVidia media platform drivers # # # NXP media platform drivers # # # Qualcomm media platform drivers # # # Raspberry Pi media platform drivers # # CONFIG_VIDEO_RASPBERRYPI_PISP_BE is not set # CONFIG_VIDEO_RP1_CFE is not set # # Renesas media platform drivers # # # Rockchip media platform drivers # # # Samsung media platform drivers # # # STMicroelectronics media platform drivers # # # Sunxi media platform drivers # # # Texas Instruments drivers # # # Verisilicon media platform drivers # # # VIA media platform drivers # # # Xilinx media platform drivers # # # MMC/SDIO DVB adapters # CONFIG_SMS_SDIO_DRV=m # CONFIG_V4L_TEST_DRIVERS is not set # CONFIG_DVB_TEST_DRIVERS is not set CONFIG_MEDIA_COMMON_OPTIONS=y # # common driver options # CONFIG_CYPRESS_FIRMWARE=m CONFIG_TTPCI_EEPROM=m CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_SMS_SIANO_MDTV=m CONFIG_SMS_SIANO_RC=y # CONFIG_SMS_SIANO_DEBUGFS is not set CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_DMA_CONTIG=m CONFIG_VIDEOBUF2_VMALLOC=m # end of Media drivers # # Media ancillary drivers # CONFIG_MEDIA_ATTACH=y # # IR I2C driver auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_IR_I2C=m CONFIG_VIDEO_CAMERA_SENSOR=y # CONFIG_VIDEO_AR0521 is not set # CONFIG_VIDEO_ARDUCAM_64MP is not set # CONFIG_VIDEO_ARDUCAM_PIVARIETY is not set # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_HI846 is not set # CONFIG_VIDEO_HI847 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX296 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_IMX412 is not set # CONFIG_VIDEO_IMX477 is not set # CONFIG_VIDEO_IMX519 is not set # CONFIG_VIDEO_IMX708 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set # CONFIG_VIDEO_MT9V011 is not set # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set # CONFIG_VIDEO_OV2311 is not set # CONFIG_VIDEO_OV2640 is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5693 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV64A40 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV7251 is not set # CONFIG_VIDEO_OV7640 is not set # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9282 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_M5MOLS is not set # # Lens drivers # # CONFIG_VIDEO_AD5398 is not set # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_BU64754 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # Audio decoders, processors and mixers # # CONFIG_VIDEO_CS3308 is not set # CONFIG_VIDEO_CS5345 is not set CONFIG_VIDEO_CS53L32A=m CONFIG_VIDEO_MSP3400=m # CONFIG_VIDEO_SONY_BTF_MPX is not set # CONFIG_VIDEO_TDA1997X is not set # CONFIG_VIDEO_TDA7432 is not set # CONFIG_VIDEO_TDA9840 is not set # CONFIG_VIDEO_TEA6415C is not set # CONFIG_VIDEO_TEA6420 is not set # CONFIG_VIDEO_TLV320AIC23B is not set # CONFIG_VIDEO_TVAUDIO is not set # CONFIG_VIDEO_UDA1342 is not set # CONFIG_VIDEO_VP27SMPX is not set # CONFIG_VIDEO_WM8739 is not set CONFIG_VIDEO_WM8775=m # end of Audio decoders, processors and mixers # # RDS decoders # # CONFIG_VIDEO_SAA6588 is not set # end of RDS decoders # # Video decoders # # CONFIG_VIDEO_ADV7180 is not set # CONFIG_VIDEO_ADV7183 is not set # CONFIG_VIDEO_ADV748X is not set # CONFIG_VIDEO_ADV7604 is not set # CONFIG_VIDEO_ADV7842 is not set # CONFIG_VIDEO_BT819 is not set # CONFIG_VIDEO_BT856 is not set # CONFIG_VIDEO_BT866 is not set # CONFIG_VIDEO_ISL7998X is not set # CONFIG_VIDEO_KS0127 is not set # CONFIG_VIDEO_MAX9286 is not set # CONFIG_VIDEO_ML86V7667 is not set # CONFIG_VIDEO_SAA7110 is not set CONFIG_VIDEO_SAA711X=m # CONFIG_VIDEO_TC358743 is not set # CONFIG_VIDEO_TVP514X is not set # CONFIG_VIDEO_TVP5150 is not set # CONFIG_VIDEO_TVP7002 is not set # CONFIG_VIDEO_TW2804 is not set # CONFIG_VIDEO_OV9281 is not set # CONFIG_VIDEO_TW9903 is not set # CONFIG_VIDEO_TW9906 is not set # CONFIG_VIDEO_TW9910 is not set # CONFIG_VIDEO_IRS1125 is not set # CONFIG_VIDEO_VPX3220 is not set # # Video and audio decoders # # CONFIG_VIDEO_SAA717X is not set CONFIG_VIDEO_CX25840=m # end of Video decoders # # Video encoders # # CONFIG_VIDEO_AD9389B is not set # CONFIG_VIDEO_ADV7170 is not set # CONFIG_VIDEO_ADV7175 is not set # CONFIG_VIDEO_ADV7343 is not set # CONFIG_VIDEO_ADV7393 is not set # CONFIG_VIDEO_ADV7511 is not set # CONFIG_VIDEO_AK881X is not set # CONFIG_VIDEO_SAA7127 is not set # CONFIG_VIDEO_SAA7185 is not set # CONFIG_VIDEO_THS8200 is not set # end of Video encoders # # Video improvement chips # # CONFIG_VIDEO_UPD64031A is not set # CONFIG_VIDEO_UPD64083 is not set # end of Video improvement chips # # Audio/Video compression chips # # CONFIG_VIDEO_SAA6752HS is not set # end of Audio/Video compression chips # # SDR tuner chips # # CONFIG_SDR_MAX2175 is not set # end of SDR tuner chips # # Miscellaneous helper chips # # CONFIG_VIDEO_I2C is not set # CONFIG_VIDEO_M52790 is not set # CONFIG_VIDEO_ST_MIPID02 is not set # CONFIG_VIDEO_THS7303 is not set # end of Miscellaneous helper chips # # Media SPI Adapters # CONFIG_CXD2880_SPI_DRV=m # CONFIG_VIDEO_GS1662 is not set # end of Media SPI Adapters CONFIG_MEDIA_TUNER=m # # Customize TV tuners # CONFIG_MEDIA_TUNER_E4000=m CONFIG_MEDIA_TUNER_FC0011=m CONFIG_MEDIA_TUNER_FC0012=m CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_FC2580=m CONFIG_MEDIA_TUNER_IT913X=m # CONFIG_MEDIA_TUNER_M88RS6000T is not set CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_MC44S803=m # CONFIG_MEDIA_TUNER_MSI001 is not set CONFIG_MEDIA_TUNER_MT2060=m CONFIG_MEDIA_TUNER_MT2063=m CONFIG_MEDIA_TUNER_MT20XX=m # CONFIG_MEDIA_TUNER_MT2131 is not set CONFIG_MEDIA_TUNER_MT2266=m # CONFIG_MEDIA_TUNER_MXL301RF is not set CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m # CONFIG_MEDIA_TUNER_QM1D1B0004 is not set CONFIG_MEDIA_TUNER_QM1D1C0042=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_R820T=m CONFIG_MEDIA_TUNER_SI2157=m CONFIG_MEDIA_TUNER_SIMPLE=m CONFIG_MEDIA_TUNER_TDA18212=m CONFIG_MEDIA_TUNER_TDA18218=m CONFIG_MEDIA_TUNER_TDA18250=m CONFIG_MEDIA_TUNER_TDA18271=m CONFIG_MEDIA_TUNER_TDA827X=m CONFIG_MEDIA_TUNER_TDA8290=m CONFIG_MEDIA_TUNER_TDA9887=m CONFIG_MEDIA_TUNER_TEA5761=m CONFIG_MEDIA_TUNER_TEA5767=m CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_MEDIA_TUNER_XC2028=m CONFIG_MEDIA_TUNER_XC4000=m CONFIG_MEDIA_TUNER_XC5000=m # end of Customize TV tuners # # Customise DVB Frontends # # # Multistandard (satellite) frontends # CONFIG_DVB_M88DS3103=m # CONFIG_DVB_MXL5XX is not set CONFIG_DVB_STB0899=m CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m # CONFIG_DVB_STV0910 is not set CONFIG_DVB_STV6110x=m # CONFIG_DVB_STV6111 is not set # # Multistandard (cable + terrestrial) frontends # CONFIG_DVB_DRXK=m CONFIG_DVB_MN88472=m CONFIG_DVB_MN88473=m CONFIG_DVB_SI2165=m CONFIG_DVB_TDA18271C2DD=m # # DVB-S (satellite) frontends # # CONFIG_DVB_CX24110 is not set CONFIG_DVB_CX24116=m # CONFIG_DVB_CX24117 is not set CONFIG_DVB_CX24120=m CONFIG_DVB_CX24123=m CONFIG_DVB_DS3000=m # CONFIG_DVB_MB86A16 is not set CONFIG_DVB_MT312=m CONFIG_DVB_S5H1420=m CONFIG_DVB_SI21XX=m CONFIG_DVB_STB6000=m CONFIG_DVB_STV0288=m CONFIG_DVB_STV0299=m CONFIG_DVB_STV0900=m CONFIG_DVB_STV6110=m CONFIG_DVB_TDA10071=m CONFIG_DVB_TDA10086=m # CONFIG_DVB_TDA8083 is not set # CONFIG_DVB_TDA8261 is not set CONFIG_DVB_TDA826X=m CONFIG_DVB_TS2020=m # CONFIG_DVB_TUA6100 is not set CONFIG_DVB_TUNER_CX24113=m CONFIG_DVB_TUNER_ITD1000=m # CONFIG_DVB_VES1X93 is not set # CONFIG_DVB_ZL10036 is not set CONFIG_DVB_ZL10039=m # # DVB-T (terrestrial) frontends # CONFIG_DVB_AF9013=m CONFIG_DVB_AS102_FE=m # CONFIG_DVB_CX22700 is not set CONFIG_DVB_CX22702=m CONFIG_DVB_CXD2820R=m CONFIG_DVB_CXD2841ER=m CONFIG_DVB_DIB3000MB=m CONFIG_DVB_DIB3000MC=m CONFIG_DVB_DIB7000M=m CONFIG_DVB_DIB7000P=m # CONFIG_DVB_DIB9000 is not set CONFIG_DVB_DRXD=m CONFIG_DVB_EC100=m CONFIG_DVB_GP8PSK_FE=m # CONFIG_DVB_L64781 is not set CONFIG_DVB_MT352=m CONFIG_DVB_NXT6000=m CONFIG_DVB_RTL2830=m CONFIG_DVB_RTL2832=m CONFIG_DVB_RTL2832_SDR=m # CONFIG_DVB_S5H1432 is not set CONFIG_DVB_SI2168=m # CONFIG_DVB_SP887X is not set # CONFIG_DVB_STV0367 is not set CONFIG_DVB_TDA10048=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_ZD1301_DEMOD=m CONFIG_DVB_ZL10353=m CONFIG_DVB_CXD2880=m # # DVB-C (cable) frontends # CONFIG_DVB_STV0297=m # CONFIG_DVB_TDA10021 is not set CONFIG_DVB_TDA10023=m # CONFIG_DVB_VES1820 is not set # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # CONFIG_DVB_AU8522=m CONFIG_DVB_AU8522_DTV=m CONFIG_DVB_AU8522_V4L=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LG2160=m CONFIG_DVB_LGDT3305=m CONFIG_DVB_LGDT3306A=m CONFIG_DVB_LGDT330X=m CONFIG_DVB_MXL692=m CONFIG_DVB_NXT200X=m # CONFIG_DVB_OR51132 is not set # CONFIG_DVB_OR51211 is not set CONFIG_DVB_S5H1409=m CONFIG_DVB_S5H1411=m # # ISDB-T (terrestrial) frontends # CONFIG_DVB_DIB8000=m CONFIG_DVB_MB86A20S=m CONFIG_DVB_S921=m # # ISDB-S (satellite) & ISDB-T (terrestrial) frontends # # CONFIG_DVB_MN88443X is not set CONFIG_DVB_TC90522=m # # Digital terrestrial only tuners/PLL # CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m CONFIG_DVB_TUNER_DIB0090=m # # SEC control devices for DVB-S # CONFIG_DVB_A8293=m CONFIG_DVB_AF9033=m # CONFIG_DVB_ASCOT2E is not set CONFIG_DVB_ATBM8830=m # CONFIG_DVB_HELENE is not set # CONFIG_DVB_HORUS3A is not set # CONFIG_DVB_ISL6405 is not set CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m CONFIG_DVB_IX2505V=m # CONFIG_DVB_LGS8GL5 is not set CONFIG_DVB_LGS8GXX=m # CONFIG_DVB_LNBH25 is not set # CONFIG_DVB_LNBH29 is not set CONFIG_DVB_LNBP21=m CONFIG_DVB_LNBP22=m CONFIG_DVB_M88RS2000=m # CONFIG_DVB_TDA665x is not set CONFIG_DVB_DRX39XYJ=m # # Common Interface (EN50221) controller drivers # # CONFIG_DVB_CXD2099 is not set CONFIG_DVB_SP2=m # end of Customise DVB Frontends # # Tools to develop new frontends # # CONFIG_DVB_DUMMY_FE is not set # end of Media ancillary drivers # # Graphics support # # CONFIG_IMX_IPUV3_CORE is not set CONFIG_DRM=y CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DEBUG_MM is not set CONFIG_DRM_KMS_HELPER=y # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set # CONFIG_DRM_DEBUG_MODESET_LOCK is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_GEM_DMA_HELPER=y # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # end of I2C encoder or helper chips # # ARM devices # # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_KOMEDA is not set # end of ARM devices # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set # CONFIG_DRM_EXYNOS is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_ARMADA is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_USE_LVDS is not set # CONFIG_DRM_RCAR_USE_MIPI_DSI is not set # CONFIG_DRM_OMAP is not set # CONFIG_DRM_TILCDC is not set # CONFIG_DRM_FSL_DCU is not set # CONFIG_DRM_STM is not set CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_ABT_Y030XX067A is not set # CONFIG_DRM_PANEL_ARM_VERSATILE is not set # CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set # CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set # CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set # CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set # CONFIG_DRM_PANEL_DSI_CM is not set # CONFIG_DRM_PANEL_LVDS is not set CONFIG_DRM_PANEL_SIMPLE=y # CONFIG_DRM_PANEL_EDP is not set # CONFIG_DRM_PANEL_EBBG_FT8719 is not set # CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set # CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set # CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9806E is not set # CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set # CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set # CONFIG_DRM_PANEL_JDI_R63452 is not set # CONFIG_DRM_PANEL_KHADAS_TS050 is not set # CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set # CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set # CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LB035Q02 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set # CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set # CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set # CONFIG_DRM_PANEL_NOVATEK_NT35560 is not set # CONFIG_DRM_PANEL_NOVATEK_NT35950 is not set # CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set # CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set # CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set # CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set # CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set # CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set # CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set # CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set # CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set # CONFIG_DRM_PANEL_RONBO_RB070D30 is not set # CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set # CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set # CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set # CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set # CONFIG_DRM_PANEL_SHARP_LS060T1SX01 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set # CONFIG_DRM_PANEL_SONY_ACX565AKM is not set # CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 is not set # CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set # CONFIG_DRM_PANEL_TPO_Y17P is not set # CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set # CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set # CONFIG_DRM_PANEL_TPO_TPG110 is not set # CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set # CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set # CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set # CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set # CONFIG_DRM_LONTIUM_LT9611 is not set # CONFIG_DRM_LONTIUM_LT9611UXC is not set # CONFIG_DRM_ITE_IT66121 is not set # CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NWL_MIPI_DSI is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_PARADE_PS8640 is not set # CONFIG_DRM_SIL_SII8620 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_SII9234 is not set CONFIG_DRM_SIMPLE_BRIDGE=y # CONFIG_DRM_THINE_THC63LVD1024 is not set CONFIG_DRM_TOSHIBA_TC358762=y # CONFIG_DRM_TOSHIBA_TC358764 is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TOSHIBA_TC358768 is not set # CONFIG_DRM_TOSHIBA_TC358775 is not set # CONFIG_DRM_TI_DLPC3433 is not set # CONFIG_DRM_TI_TFP410 is not set # CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_ANALOGIX_ANX7625 is not set # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_CDNS_MHDP8546 is not set # end of Display Interface Bridges # CONFIG_DRM_STI is not set # CONFIG_DRM_V3D is not set CONFIG_DRM_VC4=y CONFIG_DRM_VC4_HDMI_CEC=y # CONFIG_DRM_RP1_DSI is not set # CONFIG_DRM_RP1_DPI is not set # CONFIG_DRM_RP1_VEC is not set # CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_LOGICVC is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_PANEL_MIPI_DBI is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9163 is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set # CONFIG_TINYDRM_ILI9486 is not set # CONFIG_TINYDRM_MI0283QT is not set # CONFIG_TINYDRM_REPAPER is not set # CONFIG_TINYDRM_ST7586 is not set # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_TVE200 is not set # CONFIG_DRM_LIMA is not set # CONFIG_DRM_PANFROST is not set # CONFIG_DRM_MCDE is not set # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_DRM_NOMODESET=y # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y # CONFIG_FB_MODE_HELPERS is not set # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # CONFIG_FB_BCM2708=y # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # CONFIG_FB_RPISENSE is not set # end of Frame buffer Devices # # Backlight & LCD device support # CONFIG_LCD_CLASS_DEVICE=m # CONFIG_LCD_L4F00242T03 is not set # CONFIG_LCD_LMS283GF05 is not set # CONFIG_LCD_LTV350QV is not set # CONFIG_LCD_ILI922X is not set # CONFIG_LCD_ILI9320 is not set # CONFIG_LCD_TDO24M is not set # CONFIG_LCD_VGG2432A4 is not set # CONFIG_LCD_PLATFORM is not set # CONFIG_LCD_AMS369FG06 is not set # CONFIG_LCD_LMS501KF03 is not set # CONFIG_LCD_HX8357 is not set # CONFIG_LCD_OTM3225A is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_KTD253 is not set # CONFIG_BACKLIGHT_PWM is not set CONFIG_BACKLIGHT_RPI=y # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set CONFIG_BACKLIGHT_GPIO=y # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # CONFIG_BACKLIGHT_LED is not set # end of Backlight & LCD device support CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support # CONFIG_LOGO is not set # end of Graphics support CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_COMPRESS_OFFLOAD=y CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y CONFIG_SND_HRTIMER=m CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 # CONFIG_SND_SUPPORT_OLD_API is not set CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_CTL_INPUT_VALIDATION is not set CONFIG_SND_VMASTER=y # CONFIG_SND_SEQUENCER is not set # CONFIG_SND_DRIVERS is not set # # HD-Audio # # end of HD-Audio CONFIG_SND_HDA_PREALLOC_SIZE=2048 CONFIG_SND_ARM=y # CONFIG_SND_ARMAACI is not set CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=m CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y CONFIG_SND_USB_UA101=m CONFIG_SND_USB_CAIAQ=m CONFIG_SND_USB_CAIAQ_INPUT=y CONFIG_SND_USB_6FIRE=m CONFIG_SND_USB_HIFACE=m CONFIG_SND_BCD2000=m CONFIG_SND_USB_LINE6=m CONFIG_SND_USB_POD=m CONFIG_SND_USB_PODHD=m CONFIG_SND_USB_TONEPORT=m CONFIG_SND_USB_VARIAX=m CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y CONFIG_SND_SOC_COMPRESS=y # CONFIG_SND_SOC_ADI is not set # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_AMD_ACP_CONFIG is not set # CONFIG_SND_ATMEL_SOC is not set CONFIG_SND_BCM2835_SOC_I2S=m # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set CONFIG_SND_BCM2708_SOC_CHIPDIP_DAC=m CONFIG_SND_BCM2708_SOC_GOOGLEVOICEHAT_SOUNDCARD=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUS=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSHD=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADC=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADCPRO=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSDSP=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_AMP=m CONFIG_SND_BCM2708_SOC_PIFI_40=m CONFIG_SND_BCM2708_SOC_RPI_CIRRUS=m CONFIG_SND_BCM2708_SOC_RPI_DAC=m CONFIG_SND_BCM2708_SOC_RPI_PROTO=m CONFIG_SND_BCM2708_SOC_JUSTBOOM_BOTH=m CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC=m CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m CONFIG_SND_BCM2708_SOC_IQAUDIO_CODEC=m CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m CONFIG_SND_BCM2708_SOC_IQAUDIO_DIGI=m CONFIG_SND_BCM2708_SOC_I_SABRE_Q2M=m CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m CONFIG_SND_AUDIOINJECTOR_OCTO_SOUNDCARD=m CONFIG_SND_AUDIOINJECTOR_ISOLATED_SOUNDCARD=m CONFIG_SND_AUDIOSENSE_PI=m CONFIG_SND_DIGIDAC1_SOUNDCARD=m CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO=m CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO_V2=m CONFIG_SND_BCM2708_SOC_ALLO_PIANO_DAC=m CONFIG_SND_BCM2708_SOC_ALLO_PIANO_DAC_PLUS=m CONFIG_SND_BCM2708_SOC_ALLO_BOSS_DAC=m CONFIG_SND_BCM2708_SOC_ALLO_BOSS2_DAC=m CONFIG_SND_BCM2708_SOC_ALLO_DIGIONE=m CONFIG_SND_BCM2708_SOC_ALLO_KATANA_DAC=m CONFIG_SND_BCM2708_SOC_FE_PI_AUDIO=m CONFIG_SND_PISOUND=m CONFIG_SND_RPI_SIMPLE_SOUNDCARD=m CONFIG_SND_RPI_WM8804_SOUNDCARD=m CONFIG_SND_DACBERRY400=m # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # CONFIG_SND_SOC_FSL_AUDMIX is not set # 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_FSL_XCVR is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # end of SoC Audio for Freescale CPUs # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_MTK_BTCVSD is not set # CONFIG_SND_SOC_SOF_TOPLEVEL is not set # # STMicroelectronics STM32 SOC audio support # # end of 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_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # CONFIG_SND_SOC_ARIZONA=m CONFIG_SND_SOC_WM_ADSP=m # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_AD193X_SPI is not set # CONFIG_SND_SOC_AD193X_I2C is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1372_SPI is not set CONFIG_SND_SOC_ADAU1701=m # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set CONFIG_SND_SOC_ADAU1977=m CONFIG_SND_SOC_ADAU1977_I2C=m CONFIG_SND_SOC_ADAU7002=m # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4375 is not set # CONFIG_SND_SOC_AK4458 is not set CONFIG_SND_SOC_AK4554=m # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # 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_CS35L41_SPI is not set # CONFIG_SND_SOC_CS35L41_I2C is not set # CONFIG_SND_SOC_CS35L45_SPI is not set # CONFIG_SND_SOC_CS35L45_I2C 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS42L83 is not set # CONFIG_SND_SOC_CS4234 is not set CONFIG_SND_SOC_CS4265=m # CONFIG_SND_SOC_CS4270 is not set CONFIG_SND_SOC_CS4271=m CONFIG_SND_SOC_CS4271_I2C=m # CONFIG_SND_SOC_CS4271_SPI is not set CONFIG_SND_SOC_CS42XX8=m CONFIG_SND_SOC_CS42XX8_I2C=m # 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_CX2072X is not set CONFIG_SND_SOC_DA7213=m CONFIG_SND_SOC_DMIC=m CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_ES7134 is not set # CONFIG_SND_SOC_ES7241 is not set # CONFIG_SND_SOC_ES8316 is not set # CONFIG_SND_SOC_ES8326 is not set # CONFIG_SND_SOC_ES8328_I2C is not set # CONFIG_SND_SOC_ES8328_SPI is not set # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_HDA is not set # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set CONFIG_SND_SOC_MA120X0P=m # CONFIG_SND_SOC_MAX98088 is not set # CONFIG_SND_SOC_MAX98357A is not set # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98520 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX98396 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set CONFIG_SND_SOC_PCM179X=m CONFIG_SND_SOC_PCM179X_I2C=m # CONFIG_SND_SOC_PCM179X_SPI is not set CONFIG_SND_SOC_PCM186X=m CONFIG_SND_SOC_PCM186X_I2C=m # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set CONFIG_SND_SOC_PCM5102A=m CONFIG_SND_SOC_PCM512x=m CONFIG_SND_SOC_PCM512x_I2C=m # 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_PCM1794A=m # CONFIG_SND_SOC_RT5631 is not set # CONFIG_SND_SOC_RT5640 is not set # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_RT9120 is not set CONFIG_SND_SOC_SGTL5000=m CONFIG_SND_SOC_SIGMADSP=m CONFIG_SND_SOC_SIGMADSP_I2C=m CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m # CONFIG_SND_SOC_SIMPLE_MUX is not set CONFIG_SND_SOC_SPDIF=m # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set CONFIG_SND_SOC_STA32X=m # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS2780 is not set # CONFIG_SND_SOC_TAS5086 is not set CONFIG_SND_SOC_TAS571X=m # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805M is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set CONFIG_SND_SOC_TAS5713=m # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320ADC3XXX is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set CONFIG_SND_SOC_TLV320AIC32X4=m CONFIG_SND_SOC_TLV320AIC32X4_I2C=m # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set CONFIG_SND_SOC_TLV320AIC3X=m CONFIG_SND_SOC_TLV320AIC3X_I2C=m # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set CONFIG_SND_SOC_WM5102=m # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set CONFIG_SND_SOC_WM8731=m CONFIG_SND_SOC_WM8731_I2C=m # CONFIG_SND_SOC_WM8731_SPI is not set # CONFIG_SND_SOC_WM8737 is not set CONFIG_SND_SOC_WM8741=m # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set CONFIG_SND_SOC_WM8804=m CONFIG_SND_SOC_WM8804_I2C=m # 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_WM8940 is not set CONFIG_SND_SOC_WM8960=m # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set # CONFIG_SND_SOC_ZL38060 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_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8821 is not set # CONFIG_SND_SOC_NAU8822 is not set # CONFIG_SND_SOC_NAU8824 is not set CONFIG_SND_SOC_TPA6130A2=m # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set CONFIG_SND_SOC_I_SABRE_CODEC=m # end of CODEC drivers CONFIG_SND_SIMPLE_CARD_UTILS=m CONFIG_SND_SIMPLE_CARD=m CONFIG_SND_AUDIO_GRAPH_CARD=m # CONFIG_SND_AUDIO_GRAPH_CARD2 is not set # CONFIG_SND_TEST_COMPONENT is not set # # HID support # CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set CONFIG_HID_ASUS=y CONFIG_HID_AUREAL=y CONFIG_HID_BELKIN=y # CONFIG_HID_BETOP_FF is not set CONFIG_HID_BIGBEN_FF=m CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CREATIVE_SB0540 is not set CONFIG_HID_CYPRESS=y CONFIG_HID_DRAGONRISE=m CONFIG_DRAGONRISE_FF=y # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_FT260 is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_GLORIOUS is not set # CONFIG_HID_HOLTEK is not set # CONFIG_HID_VIVALDI is not set # CONFIG_HID_GT683R is not set # CONFIG_HID_KEYTOUCH is not set CONFIG_HID_KYE=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set # CONFIG_HID_VRC2 is not set # CONFIG_HID_XIAOMI is not set CONFIG_HID_GYRATION=y # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set # CONFIG_HID_JABRA is not set CONFIG_HID_TWINHAN=y CONFIG_HID_KENSINGTON=y CONFIG_HID_LCPOWER=y # CONFIG_HID_LED is not set CONFIG_HID_LENOVO=y # CONFIG_HID_LETSKETCH is not set CONFIG_HID_LOGITECH=y CONFIG_HID_LOGITECH_DJ=y CONFIG_HID_LOGITECH_HIDPP=y CONFIG_LOGITECH_FF=y 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_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=m CONFIG_HID_NINTENDO=m CONFIG_NINTENDO_FF=y # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set CONFIG_HID_ORTEK=y CONFIG_HID_OUYA=y CONFIG_HID_PANTHERLORD=y CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=y CONFIG_HID_PETALYNX=y # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PXRC is not set # CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set CONFIG_HID_SAMSUNG=y # CONFIG_HID_SEMITEK is not set # CONFIG_HID_SIGMAMICRO is not set CONFIG_HID_SONY=y CONFIG_SONY_FF=y # CONFIG_HID_SPEEDLINK is not set CONFIG_HID_STEAM=m # CONFIG_HID_STEELSERIES is not set CONFIG_HID_SUNPLUS=y CONFIG_HID_RMI=y # CONFIG_HID_GREENASIA is not set CONFIG_HID_SMARTJOYPLUS=m CONFIG_SMARTJOYPLUS_FF=y CONFIG_HID_TIVO=y CONFIG_HID_TOPSEED=y # CONFIG_HID_TOPRE is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set CONFIG_HID_WIIMOTE=m CONFIG_HID_XINMO=y # CONFIG_HID_ZEROPLUS is not set CONFIG_HID_ZYDACRON=y # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # end of USB HID support # # I2C HID support # # CONFIG_I2C_HID_OF is not set # CONFIG_I2C_HID_OF_ELAN is not set # CONFIG_I2C_HID_OF_GOODIX is not set # end of I2C HID support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y # CONFIG_USB_LED_TRIG is not set # CONFIG_USB_ULPI_BUS is not set # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_OTG is not set # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set # CONFIG_USB_LEDS_TRIGGER_USBPORT is not set CONFIG_USB_AUTOSUSPEND_DELAY=2 CONFIG_USB_MON=m # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set # CONFIG_USB_XHCI_HCD is not set # CONFIG_USB_EHCI_HCD is not set # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set # CONFIG_USB_OHCI_HCD is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set CONFIG_USB_DWCOTG=y # CONFIG_USB_HCD_BCMA is not set # CONFIG_USB_HCD_SSB is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=m # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set # CONFIG_USB_UAS is not set # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # CONFIG_USB_SERIAL=m CONFIG_USB_SERIAL_GENERIC=y # CONFIG_USB_SERIAL_SIMPLE is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set CONFIG_USB_SERIAL_CH341=m # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set CONFIG_USB_SERIAL_CP210X=m # CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_EMPEG is not set CONFIG_USB_SERIAL_FTDI_SIO=m # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_F81232 is not set # CONFIG_USB_SERIAL_F8153X is not set # CONFIG_USB_SERIAL_GARMIN is not set # CONFIG_USB_SERIAL_IPW is not set CONFIG_USB_SERIAL_IUU=m # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set # CONFIG_USB_SERIAL_KEYSPAN is not set # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_METRO is not set # CONFIG_USB_SERIAL_MOS7720 is not set # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MXUPORT is not set # CONFIG_USB_SERIAL_NAVMAN is not set CONFIG_USB_SERIAL_PL2303=m # CONFIG_USB_SERIAL_OTI6858 is not set # CONFIG_USB_SERIAL_QCAUX is not set # CONFIG_USB_SERIAL_QUALCOMM is not set # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SAFE is not set # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_OPTION is not set # CONFIG_USB_SERIAL_OMNINET is not set # CONFIG_USB_SERIAL_OPTICON is not set # CONFIG_USB_SERIAL_XSENS_MT is not set # CONFIG_USB_SERIAL_WISHBONE is not set # CONFIG_USB_SERIAL_SSU100 is not set # CONFIG_USB_SERIAL_QT2 is not set # CONFIG_USB_SERIAL_UPD78F0730 is not set # CONFIG_USB_SERIAL_XR is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HUB_USB251XB is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # CONFIG_USB_ONBOARD_HUB is not set # # USB Physical Layer drivers # CONFIG_USB_PHY=y CONFIG_NOP_USB_XCEIV=y # CONFIG_AM335X_PHY_USB is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set # CONFIG_USB_ULPI is not set # end of USB Physical Layer drivers # CONFIG_USB_GADGET is not set # CONFIG_TYPEC is not set # CONFIG_USB_ROLE_SWITCH is not set CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y CONFIG_PWRSEQ_SIMPLE=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # CONFIG_MMC_BCM2835_MMC=y CONFIG_MMC_BCM2835_DMA=y CONFIG_MMC_BCM2835_PIO_DMA_BARRIER=2 CONFIG_MMC_BCM2835_SDHOST=y # CONFIG_MMC_DEBUG is not set # CONFIG_MMC_ARMMMCI is not set CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_PLTFM=y # CONFIG_MMC_SDHCI_OF_ARASAN is not set # CONFIG_MMC_SDHCI_OF_AT91 is not set # CONFIG_MMC_SDHCI_OF_DWCMSHC is not set # CONFIG_MMC_SDHCI_CADENCE is not set # CONFIG_MMC_SDHCI_F_SDH30 is not set # CONFIG_MMC_SDHCI_MILBEAUT is not set # CONFIG_MMC_SDHCI_IPROC is not set # CONFIG_MMC_SPI is not set # CONFIG_MMC_DW is not set # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_REALTEK_USB=m # CONFIG_MMC_CQHCI is not set # CONFIG_MMC_HSQ is not set # CONFIG_MMC_BCM2835 is not set # CONFIG_MMC_MTK is not set # CONFIG_MMC_SDHCI_XENON is not set # CONFIG_MMC_SDHCI_OMAP is not set # CONFIG_MMC_SDHCI_AM654 is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y CONFIG_LEDS_CLASS_FLASH=y # CONFIG_LEDS_CLASS_MULTICOLOR is not set # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_AW2013 is not set # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_EL15203000 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP50XX is not set # CONFIG_LEDS_LP55XX_COMMON is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set # CONFIG_LEDS_PWM is not set # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_SYSCON is not set # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_SPI_BYTE is not set # CONFIG_LEDS_TI_LMU_COMMON is not set # # Flash and Torch LED drivers # # CONFIG_LEDS_AAT1290 is not set # CONFIG_LEDS_AS3645A is not set # CONFIG_LEDS_KTD2692 is not set # CONFIG_LEDS_LM3601X is not set # CONFIG_LEDS_RT4505 is not set # CONFIG_LEDS_RT8515 is not set # CONFIG_LEDS_SGM3140 is not set # # RGB LED drivers # # # LED Triggers # CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_BACKLIGHT=y CONFIG_LEDS_TRIGGER_CPU=y # CONFIG_LEDS_TRIGGER_ACTIVITY is not set CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # # iptables trigger is under Netfilter config (LED target) # CONFIG_LEDS_TRIGGER_TRANSIENT=y CONFIG_LEDS_TRIGGER_CAMERA=y CONFIG_LEDS_TRIGGER_INPUT=y # CONFIG_LEDS_TRIGGER_PANIC is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set # CONFIG_LEDS_TRIGGER_AUDIO is not set # CONFIG_LEDS_TRIGGER_TTY is not set CONFIG_LEDS_TRIGGER_ACTPWR=y # # Simple LED drivers # # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_ATOMIC_SCRUB=y CONFIG_EDAC_SUPPORT=y CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # I2C RTC drivers # # CONFIG_RTC_DRV_ABB5ZES3 is not set # CONFIG_RTC_DRV_ABEOZ9 is not set CONFIG_RTC_DRV_ABX80X=m CONFIG_RTC_DRV_DS1307=m # CONFIG_RTC_DRV_DS1307_CENTURY is not set # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_HYM8563 is not set # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_NCT3018Y is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set CONFIG_RTC_DRV_PCF8523=m # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set CONFIG_RTC_DRV_PCF8563=m # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # 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_RV3032 is not set # CONFIG_RTC_DRV_RV8803 is not set # CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # CONFIG_RTC_DRV_DS3232=m CONFIG_RTC_DRV_DS3232_HWMON=y CONFIG_RTC_DRV_PCF2127=m # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_CMOS is not set # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_PL030 is not set # CONFIG_RTC_DRV_PL031 is not set # CONFIG_RTC_DRV_CADENCE is not set # CONFIG_RTC_DRV_FTRTC010 is not set # CONFIG_RTC_DRV_R7301 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_VIRTUAL_CHANNELS=y CONFIG_DMA_OF=y # CONFIG_ALTERA_MSGDMA is not set # CONFIG_AMBA_PL08X is not set CONFIG_DMA_BCM2835=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_PL330_DMA is not set CONFIG_DMA_BCM2708=y # CONFIG_XILINX_ZYNQMP_DPDMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set # CONFIG_DW_DMAC is not set # CONFIG_SF_PDMA is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set CONFIG_DMABUF_HEAPS=y # CONFIG_DMABUF_SYSFS_STATS is not set CONFIG_DMABUF_HEAPS_SYSTEM=y CONFIG_DMABUF_HEAPS_CMA=y # end of DMABUF options # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set # CONFIG_VIRTIO_MENU is not set # CONFIG_VDPA is not set CONFIG_VHOST_MENU=y # CONFIG_VHOST_NET is not set # CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set # # Microsoft Hyper-V guest support # # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_RTLLIB is not set CONFIG_RTL8723BS=m CONFIG_R8712U=m CONFIG_R8188EU=m CONFIG_VT6656=m CONFIG_STAGING_MEDIA=y # CONFIG_VIDEO_MAX96712 is not set # CONFIG_VIDEO_RPIVID is not set # CONFIG_STAGING_MEDIA_DEPRECATED is not set # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_FB_TFT is not set # CONFIG_KS7010 is not set CONFIG_BCM_VIDEOCORE=y CONFIG_BCM2835_VCHIQ=y CONFIG_VCHIQ_CDEV=y CONFIG_SND_BCM2835=m # CONFIG_VIDEO_BCM2835 is not set CONFIG_BCM_VC_SM_CMA=y CONFIG_VIDEO_CODEC_BCM2835=m CONFIG_VIDEO_ISP_BCM2835=m CONFIG_BCM2835_VCHIQ_MMAL=y # CONFIG_PI433 is not set # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_FIELDBUS_DEV is not set # CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Clock driver for ARM Reference designs # # CONFIG_CLK_ICST is not set # CONFIG_CLK_SP810 is not set # end of Clock driver for ARM Reference designs # CONFIG_LMK04832 is not set # CONFIG_COMMON_CLK_MAX9485 is not set CONFIG_COMMON_CLK_HIFIBERRY_DACPLUSHD=m CONFIG_COMMON_CLK_HIFIBERRY_DACPRO=m # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set # CONFIG_COMMON_CLK_AXI_CLKGEN is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_RS9_PCIE is not set # CONFIG_COMMON_CLK_VC5 is not set # CONFIG_COMMON_CLK_VC7 is not set # CONFIG_COMMON_CLK_FIXED_MMIO is not set # CONFIG_CLK_BCM2711_DVP is not set CONFIG_CLK_BCM2835=y CONFIG_CLK_RASPBERRYPI=y # CONFIG_XILINX_VCU is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set # CONFIG_HWSPINLOCK is not set # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_PROBE=y CONFIG_CLKSRC_MMIO=y CONFIG_BCM2835_TIMER=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y CONFIG_ARM_TIMER_SP804=y # CONFIG_MICROCHIP_PIT64B is not set # end of Clock Source drivers CONFIG_MAILBOX=y # CONFIG_ARM_MHU is not set # CONFIG_ARM_MHU_V2 is not set # CONFIG_PLATFORM_MHU is not set # CONFIG_PL320_MBOX is not set # CONFIG_ALTERA_MBOX is not set CONFIG_BCM2835_MBOX=y # CONFIG_MAILBOX_TEST is not set # CONFIG_IOMMU_SUPPORT is not set # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # end of Remoteproc drivers # # Rpmsg drivers # # CONFIG_RPMSG_QCOM_GLINK_RPM is not set # CONFIG_RPMSG_VIRTIO is not set # end of Rpmsg drivers # CONFIG_SOUNDWIRE is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # end of Amlogic SoC drivers # # Broadcom SoC drivers # CONFIG_BCM2835_POWER=y CONFIG_RASPBERRYPI_POWER=y # CONFIG_SOC_BRCMSTB is not set # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # CONFIG_QUICC_ENGINE is not set # end of NXP/Freescale QorIQ SoC drivers # # fujitsu SoC drivers # # end of fujitsu SoC drivers # # i.MX SoC drivers # # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # CONFIG_LITEX_SOC_CONTROLLER is not set # end of Enable LiteX SoC Builder specific drivers # # Qualcomm SoC drivers # # end of Qualcomm SoC drivers # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers # CONFIG_PM_DEVFREQ is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_FSA9480 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 # CONFIG_MEMORY is not set # CONFIG_IIO is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_DEBUG is not set # CONFIG_PWM_ATMEL_TCB is not set CONFIG_PWM_BCM2835=m # CONFIG_PWM_CLK is not set # CONFIG_PWM_FSL_FTM is not set # CONFIG_PWM_PCA9685 is not set CONFIG_PWM_RASPBERRYPI_POE=m # CONFIG_PWM_RP1 is not set # CONFIG_PWM_XILINX is not set # # IRQ chip support # CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 # CONFIG_AL_FIC is not set # CONFIG_BCM2712_MIP is not set CONFIG_BRCMSTB_L2_IRQ=y # CONFIG_XILINX_INTC is not set # end of IRQ chip support # CONFIG_IPACK_BUS is not set CONFIG_RESET_CONTROLLER=y # CONFIG_RESET_BRCMSTB is not set # CONFIG_RESET_RASPBERRYPI is not set # CONFIG_RESET_SIMPLE is not set # CONFIG_RESET_TI_SYSCON is not set # CONFIG_RESET_TI_TPS380X is not set # # PHY Subsystem # # CONFIG_GENERIC_PHY is not set # CONFIG_PHY_CAN_TRANSCEIVER is not set # # PHY drivers for Broadcom platforms # # CONFIG_BCM_KONA_USB2_PHY is not set # CONFIG_PHY_BRCM_USB is not set # end of PHY drivers for Broadcom platforms # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_DPHY_RX is not set # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_CADENCE_SALVO is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_LAN966X_SERDES is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set # CONFIG_PHY_OCELOT_SERDES is not set # end of PHY Subsystem # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCI_PMU is not set # CONFIG_ARM_CCN is not set CONFIG_ARM_PMU=y CONFIG_RPI_AXIPERF=m # end of Performance monitor support # CONFIG_RAS is not set # # Android # # CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y # CONFIG_NVMEM_RMEM is not set # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_FSI is not set # CONFIG_TEE is not set CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set # CONFIG_PECI is not set # CONFIG_HTE is not set # end of Device Drivers # # 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 CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=m CONFIG_XFS_SUPPORT_V4=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_ONLINE_SCRUB is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_BTRFS_FS_REF_VERIFY is not set # CONFIG_NILFS2_FS is not set CONFIG_F2FS_FS=y CONFIG_F2FS_STAT_FS=y # CONFIG_F2FS_FS_XATTR is not set CONFIG_F2FS_CHECK_FS=y # CONFIG_F2FS_FAULT_INJECTION is not set # CONFIG_F2FS_FS_COMPRESSION is not set CONFIG_F2FS_IOSTAT=y # CONFIG_F2FS_UNFAIR_RWSEM is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y # CONFIG_QUOTA is not set # CONFIG_AUTOFS4_FS is not set CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=m # CONFIG_CUSE is not set # CONFIG_VIRTIO_FS is not set CONFIG_OVERLAY_FS=m # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_METACOPY is not set # # Caches # CONFIG_NETFS_SUPPORT=y # CONFIG_NETFS_STATS is not set CONFIG_FSCACHE=y # CONFIG_FSCACHE_STATS is not set # CONFIG_FSCACHE_DEBUG is not set # CONFIG_CACHEFILES is not set # end of Caches # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=y # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=m CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set CONFIG_NTFS3_FS=m # CONFIG_NTFS3_LZX_XPRESS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y CONFIG_MEMFD_CREATE=y CONFIG_CONFIGFS_FS=y # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set CONFIG_HFS_FS=y CONFIG_HFSPLUS_FS=y # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y # CONFIG_SQUASHFS_FILE_CACHE is not set CONFIG_SQUASHFS_FILE_DIRECT=y # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 CONFIG_PSTORE_DEFLATE_COMPRESS=y # CONFIG_PSTORE_LZO_COMPRESS is not set # CONFIG_PSTORE_LZ4_COMPRESS is not set # CONFIG_PSTORE_LZ4HC_COMPRESS is not set # CONFIG_PSTORE_842_COMPRESS is not set # CONFIG_PSTORE_ZSTD_COMPRESS is not set CONFIG_PSTORE_COMPRESS=y CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" CONFIG_PSTORE_CONSOLE=y # CONFIG_PSTORE_PMSG is not set # CONFIG_PSTORE_FTRACE is not set CONFIG_PSTORE_RAM=y # CONFIG_PSTORE_BLK is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y CONFIG_NFS_SWAP=y CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=m CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" CONFIG_NFS_V4_1_MIGRATION=y CONFIG_ROOT_NFS=y CONFIG_NFS_FSCACHE=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFS_DISABLE_UDP_SUPPORT=y # CONFIG_NFS_V4_2_READ_PLUS is not set # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_COMMON=y CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y CONFIG_SUNRPC_SWAP=y CONFIG_RPCSEC_GSS_KRB5=m # CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES is not set # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS2=y CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set CONFIG_CIFS_DEBUG=y # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DEBUG_DUMP_KEYS is not set # CONFIG_CIFS_DFS_UPCALL is not set # CONFIG_CIFS_SWN_UPCALL is not set CONFIG_CIFS_FSCACHE=y # CONFIG_CIFS_ROOT is not set # CONFIG_SMB_SERVER is not set CONFIG_SMBFS=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEY_DH_OPERATIONS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set CONFIG_SECURITYFS=y CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_LSM="yama,loadpin,safesetid,integrity" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_STACK_ALL_PATTERN is not set # CONFIG_INIT_STACK_ALL_ZERO is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization CONFIG_RANDSTRUCT_NONE=y # CONFIG_RANDSTRUCT_FULL is not set # CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_CRYPTD=m CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_SIMD=m # end of Crypto core or helper # # Public-key cryptography # CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y # CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set CONFIG_CRYPTO_ECC=m CONFIG_CRYPTO_ECDH=m # CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set # end of Public-key cryptography # # Block ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SM4_GENERIC is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CFB=m CONFIG_CRYPTO_CTR=y CONFIG_CRYPTO_CTS=m CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # end of Length-preserving ciphers and modes # # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y # CONFIG_CRYPTO_ESSIV is not set # end of AEAD (authenticated encryption with associated data) ciphers # # Hashes, digests, and MACs # CONFIG_CRYPTO_BLAKE2B=m CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_XCBC is not set CONFIG_CRYPTO_XXHASH=m # end of Hashes, digests, and MACs # # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y # CONFIG_CRYPTO_CRCT10DIF is not set # end of CRCs (cyclic redundancy checks) # # Compression # CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_LZO=m # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # end of Compression # # Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation # # Userspace interface # CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set CONFIG_CRYPTO_USER_API_AEAD=y CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y # # Accelerated Cryptographic Algorithms for CPU (arm) # CONFIG_CRYPTO_CURVE25519_NEON=m # CONFIG_CRYPTO_GHASH_ARM_CE is not set # CONFIG_CRYPTO_NHPOLY1305_NEON is not set CONFIG_CRYPTO_POLY1305_ARM=m CONFIG_CRYPTO_BLAKE2S_ARM=y # CONFIG_CRYPTO_BLAKE2B_NEON is not set CONFIG_CRYPTO_SHA1_ARM=y CONFIG_CRYPTO_SHA1_ARM_NEON=y # CONFIG_CRYPTO_SHA1_ARM_CE is not set # CONFIG_CRYPTO_SHA2_ARM_CE is not set CONFIG_CRYPTO_SHA256_ARM=m # CONFIG_CRYPTO_SHA512_ARM is not set CONFIG_CRYPTO_AES_ARM=m CONFIG_CRYPTO_AES_ARM_BS=m # CONFIG_CRYPTO_AES_ARM_CE is not set CONFIG_CRYPTO_CHACHA20_NEON=m CONFIG_CRYPTO_CRC32_ARM_CE=y # end of Accelerated Cryptographic Algorithms for CPU (arm) # CONFIG_CRYPTO_HW is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS8_PRIVATE_KEY_PARSER=m CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m CONFIG_RAID6_PQ_BENCHMARK=y CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_CORDIC=m # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y # # Crypto library routines # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=m CONFIG_CRYPTO_LIB_CHACHA=m CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=m CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m CONFIG_CRYPTO_LIB_CURVE25519=m CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m CONFIG_CRYPTO_LIB_POLY1305=m CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_CRC_CCITT=m CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC64_ROCKSOFT is not set CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=m # CONFIG_CRC8 is not set CONFIG_XXHASH=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=m CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=m CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set # CONFIG_XZ_DEC_IA64 is not set # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set # CONFIG_XZ_DEC_MICROLZMA is not set # CONFIG_XZ_DEC_TEST is not set CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_DMA_DECLARE_COHERENT=y CONFIG_ARCH_HAS_SETUP_DMA_OPS=y CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_CMA=y # CONFIG_DMA_PERNUMA_CMA is not set # # Default contiguous memory area size: # CONFIG_CMA_SIZE_MBYTES=5 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_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y # CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_32=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y # end of Library routines CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set # CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Compile-time checks and compiler options # CONFIG_AS_HAS_NON_CONST_LEB128=y CONFIG_DEBUG_INFO_NONE=y # CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=1024 CONFIG_STRIP_ASM_SYMS=y # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set # CONFIG_UBSAN is not set CONFIG_HAVE_KCSAN_COMPILER=y # end of Generic Kernel Debugging Instruments # # Networking Debugging # # CONFIG_NET_DEV_REFCNT_TRACKER is not set # CONFIG_NET_NS_REFCNT_TRACKER is not set # CONFIG_DEBUG_NET is not set # end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_DEBUG_ON 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 # CONFIG_DEBUG_WX is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set # CONFIG_DEBUG_VM is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y # CONFIG_KFENCE is not set # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 # CONFIG_SOFTLOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # # CONFIG_SCHED_DEBUG is not set # CONFIG_SCHEDSTATS is not set # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # end of Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_LATENCYTOP is not set CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACER_MAX_TRACE=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_RING_BUFFER_ALLOW_SWAP=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y CONFIG_BOOTTIME_TRACING=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y CONFIG_DYNAMIC_FTRACE=y CONFIG_DYNAMIC_FTRACE_WITH_REGS=y # CONFIG_FUNCTION_PROFILER is not set CONFIG_STACK_TRACER=y # CONFIG_IRQSOFF_TRACER is not set # CONFIG_SCHED_TRACER is not set # CONFIG_HWLAT_TRACER is not set # CONFIG_OSNOISE_TRACER is not set # CONFIG_TIMERLAT_TRACER is not set # CONFIG_FTRACE_SYSCALLS is not set CONFIG_TRACER_SNAPSHOT=y CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set CONFIG_BLK_DEV_IO_TRACE=y CONFIG_KPROBE_EVENTS=y # CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set # CONFIG_UPROBE_EVENTS is not set CONFIG_BPF_EVENTS=y CONFIG_DYNAMIC_EVENTS=y CONFIG_PROBE_EVENTS=y CONFIG_FTRACE_MCOUNT_RECORD=y CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT=y # CONFIG_SYNTH_EVENTS is not set # CONFIG_HIST_TRIGGERS is not set # CONFIG_TRACE_EVENT_INJECT is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_TRACE_EVAL_MAP_FILE is not set # CONFIG_FTRACE_RECORD_RECURSION is not set # CONFIG_FTRACE_STARTUP_TEST is not set # CONFIG_FTRACE_SORT_STARTUP_TEST is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set # CONFIG_PREEMPTIRQ_DELAY_TEST is not set # CONFIG_KPROBE_EVENT_GEN_TEST is not set # CONFIG_RV is not set # CONFIG_SAMPLES is not set # CONFIG_STRICT_DEVMEM is not set # # arm Debugging # # CONFIG_ARM_PTDUMP_DEBUGFS is not set CONFIG_UNWINDER_FRAME_POINTER=y # CONFIG_UNWINDER_ARM is not set # CONFIG_BACKTRACE_VERBOSE is not set # CONFIG_DEBUG_USER is not set # CONFIG_DEBUG_LL is not set CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" # CONFIG_ARM_KPROBES_TEST is not set # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_CORESIGHT is not set # end of arm Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_RUNTIME_TESTING_MENU is not set CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage # # Rust hacking # # end of Rust hacking # end of Kernel hacking ================================================ FILE: projects/RPi/devices/RPi2/options ================================================ ################################################################################ # Device defaults ################################################################################ # NOOBS supported hex versions (legacy) NOOBS_HEX="1040,1041,2082" # NOOBS supported model versions NOOBS_SUPPORTED_MODELS='"Pi 2","Pi 3"' # set the addon project ADDON_PROJECT="ARMv7" ================================================ FILE: projects/RPi/devices/RPi4/config/distroconfig-composite.txt ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team LibreELEC (https://libreelec.tv) # WARNING: DO NOT EDIT THIS FILE - IT WILL BE OVERWRITTEN WHEN UPGRADING! arm_boost=1 arm_64bit=1 kernel=kernel.img display_auto_detect=1 enable_tvout=1 dtoverlay=vc4-kms-v3d,cma-512,composite=1 dtoverlay= disable_overscan=1 disable_fw_kms_setup=1 ================================================ FILE: projects/RPi/devices/RPi4/config/distroconfig.txt ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) # WARNING: DO NOT EDIT THIS FILE - IT WILL BE OVERWRITTEN WHEN UPGRADING! arm_boost=1 arm_64bit=1 kernel=kernel.img display_auto_detect=1 dtoverlay=vc4-kms-v3d,cma-512 dtoverlay= disable_overscan=1 disable_fw_kms_setup=1 ================================================ FILE: projects/RPi/devices/RPi4/kodi/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8" ?> <settings version="1"> <section id="system"> <category id="audio"> <group id="1"> <setting id="audiooutput.audiodevice"> <default>ALSA:hdmi:CARD=vc4hdmi0,DEV=0</default> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/RPi/devices/RPi4/linux/linux.aarch64.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm64 6.1.66 Kernel Configuration # CONFIG_CC_VERSION_TEXT="aarch64-linux-gnu-gcc (GCC) 13.0.0 20220604 (experimental) [master revision aec868578d8515763d75693c1fdfbc30ff0a1e68]" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=130000 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23850 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23850 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_SYSVIPC_COMPAT=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_IRQ_IPI=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_CONTEXT_TRACKING=y CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y # CONFIG_BPF_JIT is not set # CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_BPF_PRELOAD is not set # end of BPF subsystem CONFIG_PREEMPT_VOLUNTARY_BUILD=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set # CONFIG_PREEMPT_DYNAMIC is not set # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_TASKSTATS is not set # CONFIG_PSI is not set # end of CPU/Task time and stats accounting CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_RUDE_RCU=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem CONFIG_IKCONFIG=m CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=17 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 # CONFIG_PRINTK_INDEX is not set CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # # end of Scheduler features CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_CC_HAS_INT128=y CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set CONFIG_CGROUP_PIDS=y # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y # CONFIG_CGROUP_MISC is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_TIME_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 # CONFIG_RD_GZIP is not set # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set # CONFIG_RD_LZ4 is not set # CONFIG_RD_ZSTD is not set CONFIG_INITRAMFS_COMPRESSION_NONE=y CONFIG_BOOT_CONFIG=y # CONFIG_BOOT_CONFIG_EMBED is not set CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_EXPERT=y CONFIG_UID16=y CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set # CONFIG_SYSFS_SYSCALL is not set CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y 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 # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y # CONFIG_PC104 is not set # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_SYSTEM_DATA_VERIFICATION=y CONFIG_PROFILING=y CONFIG_TRACEPOINTS=y # end of General setup CONFIG_ARM64=y CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_64BIT=y CONFIG_MMU=y CONFIG_ARM64_PAGE_SHIFT=12 CONFIG_ARM64_CONT_PTE_SHIFT=4 CONFIG_ARM64_CONT_PMD_SHIFT=4 CONFIG_ARCH_MMAP_RND_BITS_MIN=18 CONFIG_ARCH_MMAP_RND_BITS_MAX=24 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_STACKTRACE_SUPPORT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_LOCKDEP_SUPPORT=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CSUM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y CONFIG_SMP=y CONFIG_KERNEL_MODE_NEON=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_PGTABLE_LEVELS=3 CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_ARCH_PROC_KCORE_TEXT=y # # Platform selection # # CONFIG_ARCH_ACTIONS is not set # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_APPLE is not set CONFIG_ARCH_BCM=y CONFIG_ARCH_BCM2835=y # CONFIG_ARCH_BCM_IPROC is not set # CONFIG_ARCH_BCMBCA is not set # CONFIG_ARCH_BRCMSTB is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_BITMAIN is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_SPARX5 is not set # CONFIG_ARCH_K3 is not set # CONFIG_ARCH_LG1K is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_KEEMBAY is not set # CONFIG_ARCH_MEDIATEK is not set # CONFIG_ARCH_MESON is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_NXP is not set # CONFIG_ARCH_NPCM is not set # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_REALTEK is not set # CONFIG_ARCH_RENESAS is not set # CONFIG_ARCH_ROCKCHIP is not set # CONFIG_ARCH_SEATTLE is not set # CONFIG_ARCH_INTEL_SOCFPGA is not set # CONFIG_ARCH_SYNQUACER is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_SPRD is not set # CONFIG_ARCH_THUNDER is not set # CONFIG_ARCH_THUNDER2 is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_VISCONTI is not set # CONFIG_ARCH_XGENE is not set # CONFIG_ARCH_ZYNQMP is not set # end of Platform selection # # Kernel Features # # # ARM errata workarounds via the alternatives framework # CONFIG_AMPERE_ERRATUM_AC03_CPU_38=y CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y CONFIG_ARM64_ERRATUM_826319=y CONFIG_ARM64_ERRATUM_827319=y CONFIG_ARM64_ERRATUM_824069=y CONFIG_ARM64_ERRATUM_819472=y CONFIG_ARM64_ERRATUM_832075=y CONFIG_ARM64_ERRATUM_1742098=y CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y CONFIG_ARM64_ERRATUM_1024718=y CONFIG_ARM64_ERRATUM_1418040=y CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y CONFIG_ARM64_ERRATUM_1165522=y CONFIG_ARM64_ERRATUM_1319367=y CONFIG_ARM64_ERRATUM_1530923=y CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y CONFIG_ARM64_ERRATUM_2441007=y CONFIG_ARM64_ERRATUM_1286807=y CONFIG_ARM64_ERRATUM_1463225=y CONFIG_ARM64_ERRATUM_1542419=y CONFIG_ARM64_ERRATUM_1508412=y CONFIG_ARM64_ERRATUM_2051678=y CONFIG_ARM64_ERRATUM_2077057=y CONFIG_ARM64_ERRATUM_2658417=y CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE=y CONFIG_ARM64_ERRATUM_2054223=y CONFIG_ARM64_ERRATUM_2067961=y CONFIG_ARM64_ERRATUM_2441009=y CONFIG_ARM64_ERRATUM_2457168=y CONFIG_ARM64_ERRATUM_2966298=y CONFIG_CAVIUM_ERRATUM_22375=y CONFIG_CAVIUM_ERRATUM_23154=y CONFIG_CAVIUM_ERRATUM_27456=y CONFIG_CAVIUM_ERRATUM_30115=y CONFIG_CAVIUM_TX2_ERRATUM_219=y CONFIG_FUJITSU_ERRATUM_010001=y CONFIG_HISILICON_ERRATUM_161600802=y CONFIG_QCOM_FALKOR_ERRATUM_1003=y CONFIG_QCOM_FALKOR_ERRATUM_1009=y CONFIG_QCOM_QDF2400_ERRATUM_0065=y CONFIG_QCOM_FALKOR_ERRATUM_E1041=y CONFIG_NVIDIA_CARMEL_CNP_ERRATUM=y CONFIG_SOCIONEXT_SYNQUACER_PREITS=y # end of ARM errata workarounds via the alternatives framework CONFIG_ARM64_4K_PAGES=y # CONFIG_ARM64_16K_PAGES is not set # CONFIG_ARM64_64K_PAGES is not set CONFIG_ARM64_VA_BITS_39=y # CONFIG_ARM64_VA_BITS_48 is not set CONFIG_ARM64_VA_BITS=39 CONFIG_ARM64_PA_BITS_48=y CONFIG_ARM64_PA_BITS=48 # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_CPU_LITTLE_ENDIAN=y # CONFIG_SCHED_MC is not set # CONFIG_SCHED_CLUSTER is not set # CONFIG_SCHED_SMT is not set CONFIG_NR_CPUS=256 # CONFIG_HOTPLUG_CPU is not set # CONFIG_NUMA is not set # CONFIG_HZ_100 is not set # CONFIG_HZ_250 is not set CONFIG_HZ_300=y # CONFIG_HZ_1000 is not set CONFIG_HZ=300 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_HW_PERF_EVENTS=y CONFIG_CC_HAVE_SHADOW_CALL_STACK=y # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_KEXEC_FILE is not set # CONFIG_CRASH_DUMP is not set # CONFIG_XEN is not set CONFIG_ARCH_FORCE_MAX_ORDER=11 CONFIG_UNMAP_KERNEL_AT_EL0=y CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y CONFIG_RODATA_FULL_DEFAULT_ENABLED=y # CONFIG_ARM64_SW_TTBR0_PAN is not set CONFIG_ARM64_TAGGED_ADDR_ABI=y CONFIG_COMPAT=y CONFIG_KUSER_HELPERS=y # CONFIG_COMPAT_ALIGNMENT_FIXUPS is not set CONFIG_ARMV8_DEPRECATED=y CONFIG_SWP_EMULATION=y CONFIG_CP15_BARRIER_EMULATION=y CONFIG_SETEND_EMULATION=y # # ARMv8.1 architectural features # CONFIG_ARM64_HW_AFDBM=y CONFIG_ARM64_PAN=y CONFIG_AS_HAS_LDAPR=y CONFIG_AS_HAS_LSE_ATOMICS=y CONFIG_ARM64_LSE_ATOMICS=y CONFIG_ARM64_USE_LSE_ATOMICS=y # end of ARMv8.1 architectural features # # ARMv8.2 architectural features # CONFIG_AS_HAS_ARMV8_2=y CONFIG_AS_HAS_SHA3=y # CONFIG_ARM64_PMEM is not set CONFIG_ARM64_RAS_EXTN=y CONFIG_ARM64_CNP=y # end of ARMv8.2 architectural features # # ARMv8.3 architectural features # CONFIG_ARM64_PTR_AUTH=y CONFIG_ARM64_PTR_AUTH_KERNEL=y CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y CONFIG_AS_HAS_PAC=y CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y # end of ARMv8.3 architectural features # # ARMv8.4 architectural features # CONFIG_ARM64_AMU_EXTN=y CONFIG_AS_HAS_ARMV8_4=y CONFIG_ARM64_TLB_RANGE=y # end of ARMv8.4 architectural features # # ARMv8.5 architectural features # CONFIG_AS_HAS_ARMV8_5=y CONFIG_ARM64_BTI=y CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y CONFIG_ARM64_E0PD=y CONFIG_ARM64_AS_HAS_MTE=y CONFIG_ARM64_MTE=y # end of ARMv8.5 architectural features # # ARMv8.7 architectural features # CONFIG_ARM64_EPAN=y # end of ARMv8.7 architectural features CONFIG_ARM64_SVE=y CONFIG_ARM64_SME=y CONFIG_ARM64_MODULE_PLTS=y # CONFIG_ARM64_PSEUDO_NMI is not set CONFIG_RELOCATABLE=y # CONFIG_RANDOMIZE_BASE is not set CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y CONFIG_STACKPROTECTOR_PER_TASK=y CONFIG_ARCH_NR_GPIO=0 # end of Kernel Features # # Boot options # CONFIG_CMDLINE="" CONFIG_EFI_STUB=y CONFIG_EFI=y CONFIG_DMI=y # end of Boot options # # Power management options # # CONFIG_SUSPEND is not set # CONFIG_HIBERNATION is not set CONFIG_PM=y # CONFIG_PM_DEBUG is not set CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y # end of Power management options # # CPU Power Management # # # CPU Idle # CONFIG_CPU_IDLE=y # CONFIG_CPU_IDLE_GOV_LADDER is not set CONFIG_CPU_IDLE_GOV_MENU=y # CONFIG_CPU_IDLE_GOV_TEO is not set # # ARM CPU Idle Drivers # # CONFIG_ARM_PSCI_CPUIDLE is not set # end of ARM CPU Idle Drivers # end of CPU Idle # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y # CONFIG_CPU_FREQ_GOV_USERSPACE is not set CONFIG_CPU_FREQ_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y CONFIG_CPUFREQ_DT_PLATDEV=y CONFIG_ARM_RASPBERRYPI_CPUFREQ=y # end of CPU Frequency scaling # end of CPU Power Management CONFIG_ARCH_SUPPORTS_ACPI=y # CONFIG_ACPI is not set CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set # # General architecture-dependent options # CONFIG_ARCH_HAS_SUBPAGE_FAULTS=y CONFIG_KPROBES=y CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_KRETPROBES=y CONFIG_HAVE_IOREMAP_PROT=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_KEEPINITRD=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y CONFIG_MMU_GATHER_TABLE_FREE=y CONFIG_MMU_GATHER_RCU_TABLE_FREE=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y # CONFIG_SHADOW_CALL_STACK is not set CONFIG_ARCH_SUPPORTS_LTO_CLANG=y CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y CONFIG_LTO_NONE=y CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=18 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y CONFIG_RANDOMIZE_KSTACK_OFFSET=y # CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_COMPILER_H=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y CONFIG_ARCH_USE_MEMREMAP_PROT=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_HAS_RELR=y CONFIG_HAVE_PREEMPT_DYNAMIC=y CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_GZIP is not set # CONFIG_MODULE_COMPRESS_XZ is not set # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLOCK_LEGACY_AUTOLOAD=y CONFIG_BLK_CGROUP_RWSTAT=y CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_ICQ=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_DEV_THROTTLING_LOW is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_CGROUP_IOLATENCY is not set # CONFIG_BLK_CGROUP_IOCOST is not set # CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set CONFIG_LDM_PARTITION=y # CONFIG_LDM_DEBUG is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set # end of Partition Types CONFIG_BLOCK_COMPAT=y CONFIG_BLK_MQ_PCI=y CONFIG_BLK_PM=y CONFIG_BLOCK_HOLDER_DEPRECATED=y CONFIG_BLK_MQ_STACKING=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y CONFIG_IOSCHED_BFQ=y # CONFIG_BFQ_GROUP_IOSCHED is not set # end of IO Schedulers CONFIG_ASN1=y CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y CONFIG_ARCH_INLINE_SPIN_LOCK=y CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_SPIN_UNLOCK=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y CONFIG_ARCH_INLINE_READ_LOCK=y CONFIG_ARCH_INLINE_READ_LOCK_BH=y CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_READ_UNLOCK=y CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y CONFIG_ARCH_INLINE_WRITE_LOCK=y CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_WRITE_UNLOCK=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y CONFIG_INLINE_SPIN_TRYLOCK=y CONFIG_INLINE_SPIN_TRYLOCK_BH=y CONFIG_INLINE_SPIN_LOCK=y CONFIG_INLINE_SPIN_LOCK_BH=y CONFIG_INLINE_SPIN_LOCK_IRQ=y CONFIG_INLINE_SPIN_LOCK_IRQSAVE=y CONFIG_INLINE_SPIN_UNLOCK_BH=y CONFIG_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE=y CONFIG_INLINE_READ_LOCK=y CONFIG_INLINE_READ_LOCK_BH=y CONFIG_INLINE_READ_LOCK_IRQ=y CONFIG_INLINE_READ_LOCK_IRQSAVE=y CONFIG_INLINE_READ_UNLOCK=y CONFIG_INLINE_READ_UNLOCK_BH=y CONFIG_INLINE_READ_UNLOCK_IRQ=y CONFIG_INLINE_READ_UNLOCK_IRQRESTORE=y CONFIG_INLINE_WRITE_LOCK=y CONFIG_INLINE_WRITE_LOCK_BH=y CONFIG_INLINE_WRITE_LOCK_IRQ=y CONFIG_INLINE_WRITE_LOCK_IRQSAVE=y CONFIG_INLINE_WRITE_UNLOCK=y CONFIG_INLINE_WRITE_UNLOCK_BH=y CONFIG_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y CONFIG_QUEUED_SPINLOCKS=y CONFIG_ARCH_USE_QUEUED_RWLOCKS=y CONFIG_QUEUED_RWLOCKS=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ARCH_BINFMT_ELF_STATE=y CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y CONFIG_ARCH_HAVE_ELF_PROT=y CONFIG_ARCH_USE_GNU_PROPERTY=y CONFIG_ELFCORE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # CONFIG_SWAP=y # CONFIG_ZSWAP is not set # # SLAB allocator options # # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y # end of SLAB allocator options # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set # CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y CONFIG_ARCH_KEEP_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_EXCLUSIVE_SYSTEM_RAM=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_COMPACTION=y CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 # CONFIG_PAGE_REPORTING is not set CONFIG_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_PHYS_ADDR_T_64BIT=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set CONFIG_ARCH_WANTS_THP_SWAP=y # CONFIG_TRANSPARENT_HUGEPAGE is not set CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set CONFIG_CMA_DEBUGFS=y # CONFIG_CMA_SYSFS is not set CONFIG_CMA_AREAS=7 CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y CONFIG_ARCH_HAS_ZONE_DMA_SET=y CONFIG_ZONE_DMA=y CONFIG_ZONE_DMA32=y CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y # CONFIG_ANON_VMA_NAME is not set # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set CONFIG_LOCK_MM_AND_FIND_VMA=y # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y CONFIG_NET_EGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_INTERFACE is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_ESP=y # CONFIG_NET_KEY is not set # CONFIG_XDP_SOCKETS is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=m CONFIG_IP_MROUTE_COMMON=y CONFIG_IP_MROUTE=y # CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set # CONFIG_IP_PIMSM_V1 is not set # CONFIG_IP_PIMSM_V2 is not set # CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set CONFIG_INET_ESP=y # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=m # CONFIG_INET_DIAG is not set CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set CONFIG_TCP_CONG_CUBIC=y # CONFIG_TCP_CONG_WESTWOOD is not set CONFIG_TCP_CONG_HTCP=m CONFIG_TCP_CONG_HSTCP=m # CONFIG_TCP_CONG_HYBLA is not set CONFIG_TCP_CONG_VEGAS=m # CONFIG_TCP_CONG_NV is not set CONFIG_TCP_CONG_SCALABLE=m # CONFIG_TCP_CONG_LP is not set CONFIG_TCP_CONG_VENO=m CONFIG_TCP_CONG_YEAH=m CONFIG_TCP_CONG_ILLINOIS=m # CONFIG_TCP_CONG_DCTCP is not set CONFIG_TCP_CONG_CDG=m # CONFIG_TCP_CONG_BBR is not set CONFIG_DEFAULT_CUBIC=y # CONFIG_DEFAULT_RENO is not set CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_IPV6_VTI is not set CONFIG_IPV6_SIT=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set CONFIG_IPV6_FOU=m # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set # CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # # CONFIG_NETFILTER_INGRESS is not set CONFIG_NETFILTER_EGRESS=y CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_FAMILY_BRIDGE=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set CONFIG_NETFILTER_NETLINK_LOG=m # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=m # CONFIG_NF_LOG_SYSLOG is not set # CONFIG_NF_CONNTRACK_MARK is not set # CONFIG_NF_CONNTRACK_ZONES is not set # CONFIG_NF_CONNTRACK_PROCFS is not set # CONFIG_NF_CONNTRACK_EVENTS is not set # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set # CONFIG_NF_CT_PROTO_DCCP is not set # CONFIG_NF_CT_PROTO_SCTP is not set # CONFIG_NF_CT_PROTO_UDPLITE is not set # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set CONFIG_NF_CONNTRACK_IRC=m CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set CONFIG_NF_CONNTRACK_SIP=m CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m # CONFIG_NETFILTER_NETLINK_GLUE_CT is not set CONFIG_NF_NAT=m CONFIG_NF_NAT_FTP=m CONFIG_NF_NAT_IRC=m CONFIG_NF_NAT_SIP=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 CONFIG_NETFILTER_XTABLES_COMPAT=y # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set CONFIG_NETFILTER_XT_MATCH_IPRANGE=m CONFIG_NETFILTER_XT_MATCH_IPVS=m # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set CONFIG_NETFILTER_XT_MATCH_OWNER=m # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set CONFIG_NETFILTER_XT_MATCH_STATE=m # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set CONFIG_IP_VS=m # CONFIG_IP_VS_IPV6 is not set # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # CONFIG_IP_VS_PROTO_ESP is not set # CONFIG_IP_VS_PROTO_AH is not set # CONFIG_IP_VS_PROTO_SCTP is not set # # IPVS scheduler # CONFIG_IP_VS_RR=m # CONFIG_IP_VS_WRR is not set # CONFIG_IP_VS_LC is not set # CONFIG_IP_VS_WLC is not set # CONFIG_IP_VS_FO is not set # CONFIG_IP_VS_OVF is not set # CONFIG_IP_VS_LBLC is not set # CONFIG_IP_VS_LBLCR is not set # CONFIG_IP_VS_DH is not set # CONFIG_IP_VS_SH is not set # CONFIG_IP_VS_MH is not set # CONFIG_IP_VS_SED is not set # CONFIG_IP_VS_NQ is not set # CONFIG_IP_VS_TWOS is not set # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS MH scheduler # CONFIG_IP_VS_MH_TAB_INDEX=12 # # IPVS application helper # # CONFIG_IP_VS_FTP is not set CONFIG_IP_VS_NFCT=y # CONFIG_IP_VS_PE_SIP is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set CONFIG_NF_REJECT_IPV4=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_ARPTABLES is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m # CONFIG_NF_LOG_IPV6 is not set CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_MATCH_SRH is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m # CONFIG_IP6_NF_TARGET_NPT is not set # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_CONNTRACK_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y # CONFIG_BRIDGE_MRP is not set # CONFIG_BRIDGE_CFM is not set # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set CONFIG_NET_SCH_FQ_CODEL=y # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set # CONFIG_NET_SCH_DEFAULT is not set # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_FLOW is not set CONFIG_NET_CLS_CGROUP=m # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set CONFIG_NET_L3_MASTER_DEV=y # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_STREAM_PARSER is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # end of Network testing # end of Networking options # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=m CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y # CONFIG_BT_BNEP is not set CONFIG_BT_HIDP=m CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_LEDS is not set # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set # CONFIG_BT_DEBUGFS is not set # CONFIG_BT_SELFTEST is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_MTK=m CONFIG_BT_HCIBTUSB=m # CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set CONFIG_BT_HCIBTUSB_BCM=y CONFIG_BT_HCIBTUSB_MTK=y CONFIG_BT_HCIBTUSB_RTL=y # CONFIG_BT_HCIBTSDIO is not set 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 is not set # CONFIG_BT_HCIUART_ATH3K is not set # CONFIG_BT_HCIUART_LL is not set CONFIG_BT_HCIUART_3WIRE=y # CONFIG_BT_HCIUART_INTEL is not set CONFIG_BT_HCIUART_BCM=y # CONFIG_BT_HCIUART_RTL is not set # CONFIG_BT_HCIUART_QCA is not set # CONFIG_BT_HCIUART_AG6XX is not set # CONFIG_BT_HCIUART_MRVL is not set CONFIG_BT_HCIBCM203X=m # CONFIG_BT_HCIBPA10X is not set CONFIG_BT_HCIBFUSB=m # CONFIG_BT_HCIVHCI is not set # CONFIG_BT_MRVL is not set CONFIG_BT_ATH3K=m # CONFIG_BT_MTKSDIO is not set # CONFIG_BT_MTKUART is not set # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set # CONFIG_CFG80211_CRDA_SUPPORT is not set CONFIG_CFG80211_WEXT=y CONFIG_LIB80211=m CONFIG_LIB80211_CRYPT_WEP=m CONFIG_LIB80211_CRYPT_CCMP=m # CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=m CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_PAGE_POOL=y # CONFIG_PAGE_POOL_STATS is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y # # Device Drivers # CONFIG_ARM_AMBA=y CONFIG_HAVE_PCI=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y CONFIG_PCI_DOMAINS_GENERIC=y CONFIG_PCI_SYSCALL=y CONFIG_PCIEPORTBUS=y CONFIG_PCIEAER=y # CONFIG_PCIEAER_INJECT is not set # CONFIG_PCIE_ECRC is not set # CONFIG_PCIEASPM is not set CONFIG_PCIE_PME=y # CONFIG_PCIE_DPC is not set # CONFIG_PCIE_PTM is not set CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y CONFIG_PCI_QUIRKS=y # CONFIG_PCI_DEBUG is not set # CONFIG_PCI_STUB is not set # CONFIG_PCI_IOV is not set # CONFIG_PCI_PRI is not set # CONFIG_PCI_PASID is not set CONFIG_PCI_LABEL=y # CONFIG_PCIE_BUS_TUNE_OFF is not set CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set CONFIG_VGA_ARB=y CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # # PCI controller drivers # # CONFIG_PCI_FTPCI100 is not set # CONFIG_PCI_HOST_GENERIC is not set # CONFIG_PCIE_XILINX is not set # CONFIG_PCI_XGENE is not set # CONFIG_PCIE_ALTERA is not set # CONFIG_PCI_HOST_THUNDER_PEM is not set # CONFIG_PCI_HOST_THUNDER_ECAM is not set CONFIG_PCIE_BRCMSTB=y # CONFIG_PCIE_MICROCHIP_HOST is not set # # DesignWare PCI Core Support # # CONFIG_PCIE_DW_PLAT_HOST is not set # CONFIG_PCI_HISI is not set # CONFIG_PCIE_KIRIN is not set # CONFIG_PCI_MESON is not set # CONFIG_PCIE_AL is not set # end of DesignWare PCI Core Support # # Mobiveil PCIe Core Support # # end of Mobiveil PCIe Core Support # # Cadence PCIe controllers support # # CONFIG_PCIE_CADENCE_PLAT_HOST is not set # CONFIG_PCI_J721E_HOST is not set # end of Cadence PCIe controllers support # end of PCI controller drivers # # PCI Endpoint # # CONFIG_PCI_ENDPOINT is not set # end of PCI Endpoint # # PCI switch controller drivers # # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers # CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set # # Generic Driver Options # # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y # CONFIG_DEVTMPFS_SAFE is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set # CONFIG_FW_UPLOAD is not set # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y # CONFIG_ALLOW_DEV_COREDUMP is not set # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_SOC_BUS=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set CONFIG_GENERIC_ARCH_TOPOLOGY=y # end of Generic Driver Options # # Bus devices # # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_MOXTET is not set # CONFIG_VEXPRESS_CONFIG is not set # CONFIG_MHI_BUS is not set # CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # # CONFIG_ARM_SCMI_PROTOCOL is not set # end of ARM System Control and Management Interface Protocol # CONFIG_ARM_SCPI_PROTOCOL is not set # CONFIG_FIRMWARE_MEMMAP is not set CONFIG_DMIID=y # CONFIG_DMI_SYSFS is not set CONFIG_RASPBERRYPI_FIRMWARE=y # CONFIG_FW_CFG_SYSFS is not set # CONFIG_SYSFB_SIMPLEFB is not set # CONFIG_ARM_FFA_TRANSPORT is not set CONFIG_CS_DSP=m # CONFIG_GOOGLE_FIRMWARE is not set # # EFI (Extensible Firmware Interface) Support # CONFIG_EFI_ESRT=y # CONFIG_EFI_VARS_PSTORE is not set CONFIG_EFI_PARAMS_FROM_FDT=y CONFIG_EFI_RUNTIME_WRAPPERS=y CONFIG_EFI_GENERIC_STUB=y # CONFIG_EFI_ZBOOT is not set CONFIG_EFI_ARMSTUB_DTB_LOADER=y CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y # CONFIG_EFI_BOOTLOADER_CONTROL is not set # CONFIG_EFI_CAPSULE_LOADER is not set # CONFIG_EFI_TEST is not set # CONFIG_RESET_ATTACK_MITIGATION is not set # CONFIG_EFI_DISABLE_PCI_DMA is not set CONFIG_EFI_EARLYCON=y # CONFIG_EFI_DISABLE_RUNTIME is not set # CONFIG_EFI_COCO_SECRET is not set # end of EFI (Extensible Firmware Interface) Support CONFIG_ARM_PSCI_FW=y CONFIG_HAVE_ARM_SMCCC=y CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y CONFIG_ARM_SMCCC_SOC_ID=y # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set # CONFIG_MTD is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_DYNAMIC=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_RESERVED_MEM=y CONFIG_OF_RESOLVE=y CONFIG_OF_OVERLAY=y CONFIG_OF_CONFIGFS=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set # CONFIG_ZRAM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=0 # CONFIG_BLK_DEV_DRBD is not set CONFIG_BLK_DEV_NBD=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=4096 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_UBLK is not set # # NVME Support # CONFIG_NVME_CORE=y CONFIG_BLK_DEV_NVME=y # CONFIG_NVME_MULTIPATH is not set # CONFIG_NVME_VERBOSE_ERRORS is not set # CONFIG_NVME_HWMON is not set # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set # CONFIG_NVME_AUTH is not set # CONFIG_NVME_TARGET is not set # end of NVME Support # # Misc devices # CONFIG_BCM2835_SMI=m # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_PHANTOM is not set # CONFIG_TIFM_CORE is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HP_ILO is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set # CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set CONFIG_MISC_RTSX=y # CONFIG_OPEN_DICE is not set # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # CONFIG_CB710_CORE is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set # CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set CONFIG_MISC_RTSX_USB=y # CONFIG_HABANA_AI is not set # CONFIG_PVPANIC is not set # CONFIG_GP_PCI1XXXX is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=m CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_SCAN_ASYNC is not set # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set CONFIG_SCSI_ISCSI_ATTRS=y # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports CONFIG_SCSI_LOWLEVEL=y CONFIG_ISCSI_TCP=y CONFIG_ISCSI_BOOT_SYSFS=y # CONFIG_SCSI_CXGB3_ISCSI is not set # CONFIG_SCSI_CXGB4_ISCSI is not set # CONFIG_SCSI_BNX2_ISCSI is not set # CONFIG_BE2ISCSI is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_HPSA is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_3W_SAS is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set # CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set # CONFIG_SCSI_MPI3MR is not set # CONFIG_SCSI_SMARTPQI is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_MYRB is not set # CONFIG_SCSI_MYRS is not set # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FDOMAIN_PCI is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_STEX is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLA_ISCSI is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_AM53C974 is not set # CONFIG_SCSI_WD719X is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_PMCRAID is not set # CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_DH is not set # end of SCSI device support # CONFIG_ATA is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=m # CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m # CONFIG_DM_UNSTRIPED is not set # CONFIG_DM_CRYPT is not set # CONFIG_DM_SNAPSHOT is not set CONFIG_DM_THIN_PROVISIONING=m # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_EBS is not set # CONFIG_DM_ERA is not set # CONFIG_DM_CLONE is not set # CONFIG_DM_MIRROR is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_DUST is not set # CONFIG_DM_UEVENT is not set # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_DM_INTEGRITY is not set # CONFIG_TARGET_CORE is not set # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # # CONFIG_FIREWIRE is not set # CONFIG_FIREWIRE_NOSY is not set # end of IEEE 1394 (FireWire) support CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set CONFIG_DUMMY=m CONFIG_WIREGUARD=m # CONFIG_WIREGUARD_DEBUG is not set # CONFIG_EQUALIZER is not set # CONFIG_NET_FC is not set # 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 # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_AMT is not set # CONFIG_MACSEC is not set CONFIG_NETCONSOLE=y CONFIG_NETCONSOLE_DYNAMIC=y CONFIG_NETPOLL=y CONFIG_NET_POLL_CONTROLLER=y CONFIG_TUN=y # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m CONFIG_NLMON=m # CONFIG_ARCNET is not set CONFIG_ETHERNET=y CONFIG_NET_VENDOR_3COM=y # CONFIG_VORTEX is not set # CONFIG_TYPHOON is not set CONFIG_NET_VENDOR_ADAPTEC=y # CONFIG_ADAPTEC_STARFIRE is not set CONFIG_NET_VENDOR_AGERE=y # CONFIG_ET131X is not set CONFIG_NET_VENDOR_ALACRITECH=y # CONFIG_SLICOSS is not set CONFIG_NET_VENDOR_ALTEON=y # CONFIG_ACENIC is not set # CONFIG_ALTERA_TSE is not set CONFIG_NET_VENDOR_AMAZON=y # CONFIG_ENA_ETHERNET is not set CONFIG_NET_VENDOR_AMD=y # CONFIG_AMD8111_ETH is not set # CONFIG_PCNET32 is not set # CONFIG_AMD_XGBE is not set CONFIG_NET_VENDOR_AQUANTIA=y # CONFIG_AQTION is not set CONFIG_NET_VENDOR_ARC=y CONFIG_NET_VENDOR_ASIX=y # CONFIG_SPI_AX88796C is not set CONFIG_NET_VENDOR_ATHEROS=y # CONFIG_ATL2 is not set # CONFIG_ATL1 is not set # CONFIG_ATL1E is not set # CONFIG_ATL1C is not set # CONFIG_ALX is not set CONFIG_NET_VENDOR_BROADCOM=y # CONFIG_B44 is not set CONFIG_BCMGENET=y # CONFIG_BNX2 is not set # CONFIG_CNIC is not set # CONFIG_TIGON3 is not set # CONFIG_BNX2X is not set # CONFIG_SYSTEMPORT is not set # CONFIG_BNXT is not set CONFIG_NET_VENDOR_CADENCE=y # CONFIG_MACB is not set CONFIG_NET_VENDOR_CAVIUM=y # CONFIG_THUNDER_NIC_PF is not set # CONFIG_THUNDER_NIC_VF is not set # CONFIG_THUNDER_NIC_BGX is not set # CONFIG_THUNDER_NIC_RGX is not set # CONFIG_LIQUIDIO is not set # CONFIG_LIQUIDIO_VF is not set CONFIG_NET_VENDOR_CHELSIO=y # CONFIG_CHELSIO_T1 is not set # CONFIG_CHELSIO_T3 is not set # CONFIG_CHELSIO_T4 is not set # CONFIG_CHELSIO_T4VF is not set CONFIG_NET_VENDOR_CISCO=y # CONFIG_ENIC is not set CONFIG_NET_VENDOR_CORTINA=y # CONFIG_GEMINI_ETHERNET is not set CONFIG_NET_VENDOR_DAVICOM=y # CONFIG_DM9051 is not set # CONFIG_DNET is not set CONFIG_NET_VENDOR_DEC=y # CONFIG_NET_TULIP is not set CONFIG_NET_VENDOR_DLINK=y # CONFIG_DL2K is not set # CONFIG_SUNDANCE is not set CONFIG_NET_VENDOR_EMULEX=y # CONFIG_BE2NET is not set CONFIG_NET_VENDOR_ENGLEDER=y # CONFIG_TSNEP is not set CONFIG_NET_VENDOR_EZCHIP=y # CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set CONFIG_NET_VENDOR_FUNGIBLE=y # CONFIG_FUN_ETH is not set CONFIG_NET_VENDOR_GOOGLE=y # CONFIG_GVE is not set CONFIG_NET_VENDOR_HISILICON=y # CONFIG_HIX5HD2_GMAC is not set # CONFIG_HISI_FEMAC is not set # CONFIG_HIP04_ETH is not set # CONFIG_HNS_DSAF is not set # CONFIG_HNS_ENET is not set # CONFIG_HNS3 is not set CONFIG_NET_VENDOR_HUAWEI=y # CONFIG_HINIC is not set CONFIG_NET_VENDOR_I825XX=y CONFIG_NET_VENDOR_INTEL=y # CONFIG_E100 is not set # CONFIG_E1000 is not set # CONFIG_E1000E is not set # CONFIG_IGB is not set # CONFIG_IGBVF is not set # CONFIG_IXGB is not set # CONFIG_IXGBE is not set # CONFIG_IXGBEVF is not set # CONFIG_I40E is not set # CONFIG_I40EVF is not set # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set CONFIG_NET_VENDOR_WANGXUN=y # CONFIG_NGBE is not set # CONFIG_TXGBE is not set # CONFIG_JME is not set CONFIG_NET_VENDOR_ADI=y CONFIG_NET_VENDOR_LITEX=y # CONFIG_LITEX_LITEETH is not set CONFIG_NET_VENDOR_MARVELL=y # CONFIG_MVMDIO is not set # CONFIG_SKGE is not set # CONFIG_SKY2 is not set # CONFIG_OCTEONTX2_AF is not set # CONFIG_OCTEONTX2_PF is not set # CONFIG_OCTEON_EP is not set CONFIG_NET_VENDOR_MELLANOX=y # CONFIG_MLX4_EN is not set # CONFIG_MLX5_CORE is not set # CONFIG_MLXSW_CORE is not set # CONFIG_MLXFW is not set CONFIG_NET_VENDOR_MICREL=y # CONFIG_KS8842 is not set # CONFIG_KS8851 is not set # CONFIG_KS8851_MLL is not set # CONFIG_KSZ884X_PCI is not set CONFIG_NET_VENDOR_MICROCHIP=y # CONFIG_ENC28J60 is not set # CONFIG_ENCX24J600 is not set # CONFIG_LAN743X is not set CONFIG_NET_VENDOR_MICROSEMI=y CONFIG_NET_VENDOR_MICROSOFT=y CONFIG_NET_VENDOR_MYRI=y # CONFIG_MYRI10GE is not set # CONFIG_FEALNX is not set CONFIG_NET_VENDOR_NI=y # CONFIG_NI_XGE_MANAGEMENT_ENET is not set CONFIG_NET_VENDOR_NATSEMI=y # CONFIG_NATSEMI is not set # CONFIG_NS83820 is not set CONFIG_NET_VENDOR_NETERION=y # CONFIG_S2IO is not set CONFIG_NET_VENDOR_NETRONOME=y # CONFIG_NFP is not set CONFIG_NET_VENDOR_8390=y # CONFIG_NE2K_PCI is not set CONFIG_NET_VENDOR_NVIDIA=y # CONFIG_FORCEDETH is not set CONFIG_NET_VENDOR_OKI=y # CONFIG_ETHOC is not set CONFIG_NET_VENDOR_PACKET_ENGINES=y # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_NET_VENDOR_PENSANDO is not set CONFIG_NET_VENDOR_QLOGIC=y # CONFIG_QLA3XXX is not set # CONFIG_QLCNIC is not set # CONFIG_NETXEN_NIC is not set # CONFIG_QED is not set CONFIG_NET_VENDOR_BROCADE=y # CONFIG_BNA 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_RDC=y # CONFIG_R6040 is not set CONFIG_NET_VENDOR_REALTEK=y # CONFIG_8139CP is not set # CONFIG_8139TOO is not set # CONFIG_R8169 is not set CONFIG_NET_VENDOR_RENESAS=y CONFIG_NET_VENDOR_ROCKER=y CONFIG_NET_VENDOR_SAMSUNG=y # CONFIG_SXGBE_ETH is not set CONFIG_NET_VENDOR_SEEQ=y CONFIG_NET_VENDOR_SILAN=y # CONFIG_SC92031 is not set CONFIG_NET_VENDOR_SIS=y # CONFIG_SIS900 is not set # CONFIG_SIS190 is not set CONFIG_NET_VENDOR_SOLARFLARE=y # CONFIG_SFC is not set # CONFIG_SFC_FALCON is not set CONFIG_NET_VENDOR_SMSC=y # CONFIG_SMC91X is not set # CONFIG_EPIC100 is not set # CONFIG_SMSC911X is not set # CONFIG_SMSC9420 is not set CONFIG_NET_VENDOR_SOCIONEXT=y CONFIG_NET_VENDOR_STMICRO=y # CONFIG_STMMAC_ETH is not set CONFIG_NET_VENDOR_SUN=y # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set # CONFIG_CASSINI is not set # CONFIG_NIU is not set CONFIG_NET_VENDOR_SYNOPSYS=y # CONFIG_DWC_XLGMAC is not set CONFIG_NET_VENDOR_TEHUTI=y # CONFIG_TEHUTI is not set CONFIG_NET_VENDOR_TI=y # CONFIG_TI_CPSW_PHY_SEL is not set # CONFIG_TLAN is not set CONFIG_NET_VENDOR_VERTEXCOM=y # CONFIG_MSE102X is not set CONFIG_NET_VENDOR_VIA=y # CONFIG_VIA_RHINE is not set # CONFIG_VIA_VELOCITY is not set CONFIG_NET_VENDOR_WIZNET=y # CONFIG_WIZNET_W5100 is not set # CONFIG_WIZNET_W5300 is not set CONFIG_NET_VENDOR_XILINX=y # CONFIG_XILINX_EMACLITE is not set # CONFIG_XILINX_AXI_EMAC is not set # CONFIG_XILINX_LL_TEMAC is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set CONFIG_PHYLINK=m CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_SFP is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_ADIN_PHY is not set # CONFIG_ADIN1100_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=m CONFIG_BROADCOM_PHY=y # CONFIG_BCM54140_PHY is not set CONFIG_BCM7XXX_PHY=y # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set CONFIG_BCM_NET_PHYLIB=y # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set # CONFIG_MAXLINEAR_GPHY is not set # CONFIG_MEDIATEK_GE_PHY is not set # CONFIG_MICREL_PHY is not set CONFIG_MICROCHIP_PHY=y # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set # CONFIG_MOTORCOMM_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_QSEMI_PHY is not set # CONFIG_REALTEK_PHY is not set # CONFIG_RENESAS_PHY is not set # CONFIG_ROCKCHIP_PHY is not set CONFIG_SMSC_PHY=y # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_DP83TD510_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set # CONFIG_PSE_CONTROLLER is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_OF_MDIO=y CONFIG_MDIO_DEVRES=y # CONFIG_MDIO_BITBANG is not set CONFIG_MDIO_BCM_UNIMAC=y # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_OCTEON is not set # CONFIG_MDIO_IPQ4019 is not set # CONFIG_MDIO_IPQ8064 is not set # CONFIG_MDIO_THUNDER is not set # # MDIO Multiplexers # # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # # PCS device drivers # # end of PCS device drivers CONFIG_PPP=m CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set CONFIG_PPP_MPPE=m # CONFIG_PPP_MULTILINK is not set CONFIG_PPPOE=m CONFIG_PPP_ASYNC=m # CONFIG_PPP_SYNC_TTY is not set # CONFIG_SLIP is not set CONFIG_SLHC=m CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set # CONFIG_USB_RTL8150 is not set CONFIG_USB_RTL8152=m CONFIG_USB_LAN78XX=y CONFIG_USB_USBNET=y CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m # CONFIG_USB_NET_CDC_EEM is not set # CONFIG_USB_NET_CDC_NCM is not set # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set CONFIG_USB_NET_DM9601=y # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=y # CONFIG_USB_NET_GL620A is not set # CONFIG_USB_NET_NET1080 is not set # CONFIG_USB_NET_PLUSB is not set CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m # CONFIG_USB_NET_CDC_SUBSET is not set # CONFIG_USB_NET_ZAURUS is not set # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set CONFIG_USB_HSO=m # CONFIG_USB_NET_INT51X1 is not set CONFIG_USB_IPHETH=m # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y # CONFIG_ADM8211 is not set CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set # CONFIG_ATH5K is not set # CONFIG_ATH5K_PCI is not set CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m CONFIG_ATH9K_PCI=y CONFIG_ATH9K_AHB=y # CONFIG_ATH9K_DEBUGFS is not set # CONFIG_ATH9K_DYNACK is not set # CONFIG_ATH9K_WOW is not set CONFIG_ATH9K_RFKILL=y CONFIG_ATH9K_CHANNEL_CONTEXT=y CONFIG_ATH9K_PCOEM=y # CONFIG_ATH9K_PCI_NO_EEPROM is not set CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_ATH9K_HWRNG=y CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y CONFIG_CARL9170_HWRNG=y CONFIG_ATH6KL=m # CONFIG_ATH6KL_SDIO is not set CONFIG_ATH6KL_USB=m # CONFIG_ATH6KL_DEBUG is not set # CONFIG_ATH6KL_TRACING is not set CONFIG_AR5523=m # CONFIG_WIL6210 is not set # CONFIG_ATH10K is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set CONFIG_WLAN_VENDOR_ATMEL=y # CONFIG_ATMEL is not set # CONFIG_AT76C50X_USB is not set CONFIG_WLAN_VENDOR_BROADCOM=y CONFIG_B43=m CONFIG_B43_BCMA=y CONFIG_B43_SSB=y CONFIG_B43_BUSES_BCMA_AND_SSB=y # CONFIG_B43_BUSES_BCMA is not set # CONFIG_B43_BUSES_SSB is not set CONFIG_B43_PCI_AUTOSELECT=y CONFIG_B43_PCICORE_AUTOSELECT=y # CONFIG_B43_SDIO is not set CONFIG_B43_BCMA_PIO=y CONFIG_B43_PIO=y CONFIG_B43_PHY_G=y CONFIG_B43_PHY_N=y CONFIG_B43_PHY_LP=y CONFIG_B43_PHY_HT=y CONFIG_B43_LEDS=y CONFIG_B43_HWRNG=y # CONFIG_B43_DEBUG is not set # CONFIG_B43LEGACY is not set CONFIG_BRCMUTIL=m # CONFIG_BRCMSMAC is not set CONFIG_BRCMFMAC=m CONFIG_BRCMFMAC_PROTO_BCDC=y CONFIG_BRCMFMAC_SDIO=y CONFIG_BRCMFMAC_USB=y # CONFIG_BRCMFMAC_PCIE is not set # CONFIG_BRCM_TRACING is not set CONFIG_BRCMDBG=y CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y # CONFIG_IPW2100 is not set # CONFIG_IPW2200 is not set # CONFIG_IWL4965 is not set # CONFIG_IWL3945 is not set # CONFIG_IWLWIFI is not set CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_HOSTAP is not set # CONFIG_HERMES is not set CONFIG_P54_COMMON=m CONFIG_P54_USB=m # CONFIG_P54_PCI is not set # CONFIG_P54_SPI is not set CONFIG_P54_LEDS=y CONFIG_WLAN_VENDOR_MARVELL=y # CONFIG_LIBERTAS is not set # CONFIG_LIBERTAS_THINFIRM is not set # CONFIG_MWIFIEX is not set # CONFIG_MWL8K is not set CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m CONFIG_MT76_CORE=m CONFIG_MT76_LEDS=y CONFIG_MT76_USB=m CONFIG_MT76x02_LIB=m CONFIG_MT76x02_USB=m CONFIG_MT76_CONNAC_LIB=m CONFIG_MT76x0_COMMON=m CONFIG_MT76x0U=m # CONFIG_MT76x0E is not set CONFIG_MT76x2_COMMON=m # CONFIG_MT76x2E is not set CONFIG_MT76x2U=m # CONFIG_MT7603E is not set CONFIG_MT7615_COMMON=m # CONFIG_MT7615E is not set CONFIG_MT7663_USB_SDIO_COMMON=m CONFIG_MT7663U=m # CONFIG_MT7663S is not set # CONFIG_MT7915E is not set # CONFIG_MT7921E is not set # CONFIG_MT7921S is not set # CONFIG_MT7921U is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set CONFIG_WLAN_VENDOR_PURELIFI=y # CONFIG_PLFXLC is not set CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m # CONFIG_RT2400PCI is not set # CONFIG_RT2500PCI is not set # CONFIG_RT61PCI is not set # CONFIG_RT2800PCI is not set CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WLAN_VENDOR_REALTEK=y # CONFIG_RTL8180 is not set CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y CONFIG_RTL_CARDS=m # CONFIG_RTL8192CE is not set # CONFIG_RTL8192SE is not set # CONFIG_RTL8192DE is not set # CONFIG_RTL8723AE is not set # CONFIG_RTL8723BE is not set # CONFIG_RTL8188EE is not set # CONFIG_RTL8192EE is not set # CONFIG_RTL8821AE is not set # CONFIG_RTL8192CU is not set CONFIG_RTL8XXXU=m CONFIG_RTL8XXXU_UNTESTED=y CONFIG_RTW88=m # CONFIG_RTW88_8822BE is not set # CONFIG_RTW88_8822CE is not set # CONFIG_RTW88_8723DE is not set # CONFIG_RTW88_8821CE is not set # CONFIG_RTW89 is not set CONFIG_WLAN_VENDOR_RSI=y # CONFIG_RSI_91X is not set CONFIG_WLAN_VENDOR_SILABS=y # CONFIG_WFX is not set CONFIG_WLAN_VENDOR_ST=y # CONFIG_CW1200 is not set CONFIG_WLAN_VENDOR_TI=y # CONFIG_WL1251 is not set # CONFIG_WL12XX is not set # CONFIG_WL18XX is not set # CONFIG_WLCORE is not set CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_USB_ZD1201=m CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set # CONFIG_WLAN_VENDOR_QUANTENNA is not set # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN # CONFIG_VMXNET3 is not set # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y # CONFIG_INPUT_MOUSEDEV_PSAUX is not set CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set # CONFIG_KEYBOARD_ATKBD is not set # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=m # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_PINEPHONE is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set # CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set # CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y CONFIG_JOYSTICK_PSXPAD_SPI=m CONFIG_JOYSTICK_PSXPAD_SPI_FF=y # CONFIG_JOYSTICK_PXRC is not set # CONFIG_JOYSTICK_QWIIC is not set # CONFIG_JOYSTICK_FSIA6B is not set # CONFIG_JOYSTICK_SENSEHAT is not set # CONFIG_JOYSTICK_RPISENSE is not set # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_ADS7846=m # CONFIG_TOUCHSCREEN_AD7877 is not set # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_AR1021_I2C is not set # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_BU21029 is not set # CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set # CONFIG_TOUCHSCREEN_CY8CTMA140 is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set CONFIG_TOUCHSCREEN_EGALAX=m # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set # CONFIG_TOUCHSCREEN_EXC3000 is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_HIDEEP is not set # CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_ILITEK is not set # CONFIG_TOUCHSCREEN_S6SY761 is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set # CONFIG_TOUCHSCREEN_ELAN is not set # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MSG2638 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_IMAGIS is not set # CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set CONFIG_TOUCHSCREEN_EDT_FT5X06=m CONFIG_TOUCHSCREEN_RASPBERRYPI_FW=m # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set CONFIG_TOUCHSCREEN_USB_COMPOSITE=m CONFIG_TOUCHSCREEN_USB_EGALAX=y # CONFIG_TOUCHSCREEN_USB_PANJIT is not set CONFIG_TOUCHSCREEN_USB_3M=y # CONFIG_TOUCHSCREEN_USB_ITM is not set # CONFIG_TOUCHSCREEN_USB_ETURBO is not set # CONFIG_TOUCHSCREEN_USB_GUNZE is not set # CONFIG_TOUCHSCREEN_USB_DMC_TSC10 is not set # CONFIG_TOUCHSCREEN_USB_IRTOUCH is not set # CONFIG_TOUCHSCREEN_USB_IDEALTEK is not set # CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH is not set # CONFIG_TOUCHSCREEN_USB_GOTOP is not set # CONFIG_TOUCHSCREEN_USB_JASTEC is not set # CONFIG_TOUCHSCREEN_USB_ELO is not set # CONFIG_TOUCHSCREEN_USB_E2I is not set # CONFIG_TOUCHSCREEN_USB_ZYTRONIC is not set # CONFIG_TOUCHSCREEN_USB_ETT_TC45USB is not set # CONFIG_TOUCHSCREEN_USB_NEXIO is not set # CONFIG_TOUCHSCREEN_USB_EASYTOUCH is not set # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2004 is not set # CONFIG_TOUCHSCREEN_TSC2005 is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_RM_TS is not set # CONFIG_TOUCHSCREEN_SILEAD is not set # CONFIG_TOUCHSCREEN_SIS_I2C is not set CONFIG_TOUCHSCREEN_ST1232=m # CONFIG_TOUCHSCREEN_STMFTS is not set # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set # CONFIG_TOUCHSCREEN_SX8654 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZET6223 is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_IQS5XX is not set # CONFIG_TOUCHSCREEN_ZINITIX is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ARIZONA_HAPTICS is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set CONFIG_INPUT_GPIO_ROTARY_ENCODER=m # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_INPUT_RASPBERRYPI_BUTTON is not set CONFIG_RMI4_CORE=y # CONFIG_RMI4_I2C is not set # CONFIG_RMI4_SPI is not set # CONFIG_RMI4_SMB is not set CONFIG_RMI4_F03=y CONFIG_RMI4_F03_SERIO=y CONFIG_RMI4_2D_SENSOR=y CONFIG_RMI4_F11=y CONFIG_RMI4_F12=y CONFIG_RMI4_F30=y # CONFIG_RMI4_F34 is not set # CONFIG_RMI4_F3A is not set # CONFIG_RMI4_F55 is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_AMBAKMI is not set # CONFIG_SERIO_PCIPS2 is not set # CONFIG_SERIO_LIBPS2 is not set # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_SERIO_GPIO_PS2 is not set # CONFIG_USERIO is not set # CONFIG_GAMEPORT is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_BRCM_CHAR_DRIVERS=y CONFIG_BCM2708_VCMEM=y CONFIG_BCM_VCIO=y CONFIG_BCM2835_SMI_DEV=m # CONFIG_RPIVID_MEM is not set CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y # CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set CONFIG_SERIAL_8250_16550A_VARIANTS=y # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y # CONFIG_SERIAL_8250_DMA is not set CONFIG_SERIAL_8250_PCI=y CONFIG_SERIAL_8250_EXAR=y CONFIG_SERIAL_8250_NR_UARTS=1 CONFIG_SERIAL_8250_RUNTIME_UARTS=0 CONFIG_SERIAL_8250_EXTENDED=y # CONFIG_SERIAL_8250_MANY_PORTS is not set CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_RSA is not set CONFIG_SERIAL_8250_BCM2835AUX=y CONFIG_SERIAL_8250_FSL=y # CONFIG_SERIAL_8250_DW is not set # CONFIG_SERIAL_8250_RT288X is not set CONFIG_SERIAL_8250_PERICOM=y CONFIG_SERIAL_OF_PLATFORM=y # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_SIFIVE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_RP2 is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set # CONFIG_HVC_DCC is not set CONFIG_SERIAL_DEV_BUS=y CONFIG_SERIAL_DEV_CTRL_TTYPORT=y # CONFIG_TTY_PRINTK is not set # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_BA431 is not set CONFIG_HW_RANDOM_BCM2835=y CONFIG_HW_RANDOM_IPROC_RNG200=y # CONFIG_HW_RANDOM_CCTRNG is not set # CONFIG_HW_RANDOM_XIPHERA is not set CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=y CONFIG_HW_RANDOM_CN10K=y # CONFIG_APPLICOM is not set CONFIG_DEVMEM=y CONFIG_DEVPORT=y # CONFIG_TCG_TPM is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y CONFIG_RANDOM_TRUST_BOOTLOADER=y CONFIG_RASPBERRYPI_GPIOMEM=y # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y # CONFIG_I2C_COMPAT is not set CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_GPMUX is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set CONFIG_I2C_MUX_PINCTRL=y # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_DEMUX_PINCTRL is not set # CONFIG_I2C_MUX_MLXCPLD is not set # end of Multiplexer I2C Chip support CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # PC SMBus host controller drivers # CONFIG_I2C_BCM2708=y CONFIG_I2C_BCM2708_BAUDRATE=100000 # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_ISCH is not set # CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_NVIDIA_GPU is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # # I2C system bus drivers (mostly embedded / system-on-chip) # CONFIG_I2C_BCM2835=y CONFIG_I2C_BRCMSTB=y # CONFIG_I2C_CADENCE is not set # CONFIG_I2C_CBUS_GPIO is not set # CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_DESIGNWARE_PCI is not set # CONFIG_I2C_EMEV2 is not set CONFIG_I2C_GPIO=y # CONFIG_I2C_GPIO_FAULT_INJECTOR is not set # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_RK3X is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_THUNDERX is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_PCI1XXXX is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y # CONFIG_SPI_MEM is not set # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set CONFIG_SPI_BCM2835=m CONFIG_SPI_BCM2835AUX=m # CONFIG_SPI_BCM_QSPI is not set # CONFIG_SPI_BITBANG is not set # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_CADENCE_QUADSPI 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_MICROCHIP_CORE is not set # CONFIG_SPI_MICROCHIP_CORE_QSPI is not set # CONFIG_SPI_OC_TINY is not set # CONFIG_SPI_PL022 is not set # CONFIG_SPI_PXA2XX is not set # CONFIG_SPI_ROCKCHIP is not set # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_SIFIVE is not set # CONFIG_SPI_MXIC is not set # CONFIG_SPI_THUNDERX is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_AMD is not set # # SPI Multiplexer support # # CONFIG_SPI_MUX is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=y # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set CONFIG_SPI_DYNAMIC=y # CONFIG_SPMI is not set # CONFIG_HSI is not set # CONFIG_PPS is not set # # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # # end of PTP clock support CONFIG_PINCTRL=y CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_CY8C95X0 is not set # CONFIG_PINCTRL_MCP23S08 is not set # CONFIG_PINCTRL_MICROCHIP_SGPIO is not set # CONFIG_PINCTRL_OCELOT is not set # CONFIG_PINCTRL_SINGLE is not set # CONFIG_PINCTRL_STMFX is not set # CONFIG_PINCTRL_SX150X is not set # CONFIG_PINCTRL_RP1 is not set # CONFIG_PINCTRL_BCM2712 is not set CONFIG_PINCTRL_BCM2835=y # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y CONFIG_GPIO_CDEV=y CONFIG_GPIO_CDEV_V1=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set CONFIG_GPIO_RASPBERRYPI_EXP=y CONFIG_GPIO_BCM_VIRT=y # CONFIG_GPIO_BRCMSTB is not set # CONFIG_GPIO_CADENCE is not set # CONFIG_GPIO_DWAPB is not set # CONFIG_GPIO_EXAR is not set # CONFIG_GPIO_FTGPIO010 is not set # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HLWD is not set # CONFIG_GPIO_LOGICVC is not set # CONFIG_GPIO_MB86S7X is not set # CONFIG_GPIO_PL061 is not set # CONFIG_GPIO_PWM is not set # CONFIG_GPIO_SIFIVE is not set # CONFIG_GPIO_SYSCON is not set # CONFIG_GPIO_XGENE is not set # CONFIG_GPIO_XILINX is not set # CONFIG_GPIO_AMD_FCH is not set # end of Memory mapped GPIO drivers # # I2C GPIO expanders # # 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 # CONFIG_GPIO_PCA9570 is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # CONFIG_GPIO_ARIZONA=m CONFIG_GPIO_FSM=m # end of MFD GPIO expanders # # PCI GPIO expanders # # CONFIG_GPIO_BT8XX is not set # CONFIG_GPIO_PCI_IDIO_16 is not set # CONFIG_GPIO_PCIE_IDIO_24 is not set # CONFIG_GPIO_RDC321X is not set # end of PCI GPIO expanders # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # end of SPI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers CONFIG_W1=m # # 1-wire Bus Masters # # CONFIG_W1_MASTER_MATROX is not set # CONFIG_W1_MASTER_DS2490 is not set # CONFIG_W1_MASTER_DS2482 is not set # CONFIG_W1_MASTER_DS1WM is not set CONFIG_W1_MASTER_GPIO=m # CONFIG_W1_MASTER_SGI is not set # end of 1-wire Bus Masters # # 1-wire Slaves # CONFIG_W1_SLAVE_THERM=m # CONFIG_W1_SLAVE_SMEM is not set # CONFIG_W1_SLAVE_DS2405 is not set # CONFIG_W1_SLAVE_DS2408 is not set # CONFIG_W1_SLAVE_DS2413 is not set # CONFIG_W1_SLAVE_DS2406 is not set # CONFIG_W1_SLAVE_DS2423 is not set # CONFIG_W1_SLAVE_DS2805 is not set # CONFIG_W1_SLAVE_DS2430 is not set # CONFIG_W1_SLAVE_DS2431 is not set # CONFIG_W1_SLAVE_DS2433 is not set # CONFIG_W1_SLAVE_DS2438 is not set # CONFIG_W1_SLAVE_DS250X is not set # CONFIG_W1_SLAVE_DS2780 is not set # CONFIG_W1_SLAVE_DS2781 is not set # CONFIG_W1_SLAVE_DS28E04 is not set # CONFIG_W1_SLAVE_DS28E17 is not set # end of 1-wire Slaves CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_BRCMSTB is not set CONFIG_POWER_RESET_GPIO=y CONFIG_POWER_RESET_GPIO_RESTART=y # CONFIG_POWER_RESET_LTC2952 is not set # CONFIG_POWER_RESET_REGULATOR is not set CONFIG_POWER_RESET_RESTART=y # CONFIG_POWER_RESET_XGENE is not set # CONFIG_POWER_RESET_SYSCON is not set # CONFIG_POWER_RESET_SYSCON_POWEROFF is not set # CONFIG_SYSCON_REBOOT_MODE is not set # CONFIG_NVMEM_REBOOT_MODE is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y CONFIG_RPI_POE_POWER=m # CONFIG_PDA_POWER is not set # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2760 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_BATTERY_MAX1721X is not set # CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set # CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_UCS1002 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_I5K_AMB is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set CONFIG_SENSORS_GPIO_FAN=m # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX31730 is not set # CONFIG_SENSORS_MAX31760 is not set # CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_NZXT_KRAKEN2 is not set # CONFIG_SENSORS_NZXT_SMART2 is not set # CONFIG_SENSORS_OCC_P8_I2C is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set CONFIG_SENSORS_PWM_FAN=m CONFIG_SENSORS_RASPBERRYPI_HWMON=y # CONFIG_SENSORS_SBTSI is not set # CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_VT8231 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y # CONFIG_THERMAL_WRITABLE_TRIPS is not set CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set # CONFIG_CPU_THERMAL is not set # CONFIG_THERMAL_EMULATION is not set # CONFIG_THERMAL_MMIO is not set # # Broadcom thermal drivers # CONFIG_BCM2711_THERMAL=y CONFIG_BCM2835_THERMAL=y # end of Broadcom thermal drivers CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 # CONFIG_WATCHDOG_SYSFS is not set # CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_ARM_SBSA_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_ARM_SMC_WATCHDOG is not set # CONFIG_ALIM7101_WDT is not set # CONFIG_I6300ESB_WDT is not set # CONFIG_HP_WATCHDOG is not set CONFIG_BCM2835_WDT=y # CONFIG_MEN_A21_WDT is not set # # PCI-based Watchdog Cards # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y CONFIG_SSB=m CONFIG_SSB_SPROM=y CONFIG_SSB_BLOCKIO=y CONFIG_SSB_PCIHOST_POSSIBLE=y CONFIG_SSB_PCIHOST=y CONFIG_SSB_B43_PCI_BRIDGE=y CONFIG_SSB_SDIOHOST_POSSIBLE=y # CONFIG_SSB_SDIOHOST is not set CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y CONFIG_SSB_DRIVER_PCICORE=y # CONFIG_SSB_DRIVER_GPIO is not set CONFIG_BCMA_POSSIBLE=y CONFIG_BCMA=m CONFIG_BCMA_BLOCKIO=y CONFIG_BCMA_HOST_PCI_POSSIBLE=y CONFIG_BCMA_HOST_PCI=y # CONFIG_BCMA_HOST_SOC is not set CONFIG_BCMA_DRIVER_PCI=y CONFIG_BCMA_DRIVER_GMAC_CMN=y # CONFIG_BCMA_DRIVER_GPIO is not set # CONFIG_BCMA_DEBUG is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_RPISENSE_CORE is not set # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_GATEWORKS_GSC is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77620 is not set # CONFIG_MFD_MAX77650 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77714 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_OCELOT is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_CPCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_NTXEC is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_SY7636A is not set CONFIG_MFD_RASPBERRYPI_POE_HAT=m # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_RK808 is not set # CONFIG_MFD_RN5T618 is not set # CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set CONFIG_MFD_SIMPLE_MFD_I2C=m # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # 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_VX855 is not set # CONFIG_MFD_LOCHNAGAR is not set CONFIG_MFD_ARIZONA=m CONFIG_MFD_ARIZONA_I2C=m CONFIG_MFD_ARIZONA_SPI=m # CONFIG_MFD_CS47L24 is not set CONFIG_MFD_WM5102=y # CONFIG_MFD_WM5110 is not set # CONFIG_MFD_WM8997 is not set # CONFIG_MFD_WM8998 is not set # CONFIG_MFD_WM8400 is not set # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ROHM_BD718XX is not set # CONFIG_MFD_ROHM_BD71828 is not set # CONFIG_MFD_ROHM_BD957XMUF is not set # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_MFD_QCOM_PM8008 is not set # CONFIG_RAVE_SP_CORE is not set # CONFIG_MFD_INTEL_M10_BMC is not set # CONFIG_MFD_RP1 is not set # CONFIG_MFD_RSMU_I2C is not set # CONFIG_MFD_RSMU_SPI is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set CONFIG_REGULATOR_ARIZONA_LDO1=m CONFIG_REGULATOR_ARIZONA_MICSUPP=m # CONFIG_REGULATOR_DA9121 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set # CONFIG_REGULATOR_FAN53880 is not set CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MAX20086 is not set # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MCP16502 is not set # CONFIG_REGULATOR_MP5416 is not set # CONFIG_REGULATOR_MP8859 is not set # CONFIG_REGULATOR_MP886X is not set # CONFIG_REGULATOR_MPQ7920 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PF8X00 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set # CONFIG_REGULATOR_PWM is not set CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY=y # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_SY8106A is not set # CONFIG_REGULATOR_SY8824X is not set # CONFIG_REGULATOR_SY8827N is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS6286X is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_VCTRL is not set CONFIG_RC_CORE=y CONFIG_BPF_LIRC_MODE2=y CONFIG_LIRC=y CONFIG_RC_MAP=m CONFIG_RC_DECODERS=y CONFIG_IR_IMON_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_MCE_KBD_DECODER=m CONFIG_IR_NEC_DECODER=m CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m CONFIG_IR_RCMM_DECODER=m CONFIG_IR_SANYO_DECODER=m CONFIG_IR_SHARP_DECODER=m CONFIG_IR_SONY_DECODER=m CONFIG_IR_XMP_DECODER=m CONFIG_RC_DEVICES=y CONFIG_IR_GPIO_CIR=m CONFIG_IR_GPIO_TX=m # CONFIG_IR_HIX5HD2 is not set CONFIG_IR_IGORPLUGUSB=m CONFIG_IR_IGUANA=m CONFIG_IR_IMON=m CONFIG_IR_IMON_RAW=m CONFIG_IR_MCEUSB=m CONFIG_IR_PWM_TX=m CONFIG_IR_REDRAT3=m # CONFIG_IR_SERIAL is not set # CONFIG_IR_SPI is not set CONFIG_IR_STREAMZAP=m CONFIG_IR_TOY=m CONFIG_IR_TTUSBIR=m CONFIG_RC_ATI_REMOTE=m # CONFIG_RC_LOOPBACK is not set CONFIG_RC_XBOX_DVD=m CONFIG_CEC_CORE=y # # CEC support # # CONFIG_MEDIA_CEC_RC is not set # CONFIG_MEDIA_CEC_SUPPORT is not set # end of CEC support CONFIG_MEDIA_SUPPORT=m # CONFIG_MEDIA_SUPPORT_FILTER is not set CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y CONFIG_MEDIA_RADIO_SUPPORT=y CONFIG_MEDIA_SDR_SUPPORT=y CONFIG_MEDIA_PLATFORM_SUPPORT=y CONFIG_MEDIA_TEST_SUPPORT=y # end of Media device types # # Media core support # CONFIG_VIDEO_DEV=m CONFIG_MEDIA_CONTROLLER=y CONFIG_DVB_CORE=m # end of Media core support # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y CONFIG_VIDEO_V4L2_SUBDEV_API=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_VIDEO_TUNER=m CONFIG_V4L2_MEM2MEM_DEV=m # CONFIG_V4L2_FLASH_LED_CLASS is not set CONFIG_V4L2_FWNODE=m CONFIG_V4L2_ASYNC=m # end of Video4Linux options # # Media controller options # CONFIG_MEDIA_CONTROLLER_DVB=y CONFIG_MEDIA_CONTROLLER_REQUEST_API=y # end of Media controller options # # Digital TV options # # CONFIG_DVB_MMAP is not set CONFIG_DVB_NET=y CONFIG_DVB_MAX_ADAPTERS=8 # CONFIG_DVB_DYNAMIC_MINORS is not set # CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set # CONFIG_DVB_ULE_DEBUG is not set # end of Digital TV options # # Media drivers # # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_USB_S2255 is not set CONFIG_VIDEO_USBTV=m CONFIG_USB_VIDEO_CLASS=m # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set # # Analog TV USB devices # # CONFIG_VIDEO_GO7007 is not set CONFIG_VIDEO_HDPVR=m CONFIG_VIDEO_PVRUSB2=m CONFIG_VIDEO_PVRUSB2_SYSFS=y CONFIG_VIDEO_PVRUSB2_DVB=y # CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set CONFIG_VIDEO_STK1160_COMMON=m CONFIG_VIDEO_STK1160=m # # Analog/digital TV USB devices # CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_AU0828_V4L2=y CONFIG_VIDEO_AU0828_RC=y CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y # CONFIG_VIDEO_CX231XX_ALSA is not set CONFIG_VIDEO_CX231XX_DVB=m # # Digital TV USB devices # CONFIG_DVB_AS102=m CONFIG_DVB_B2C2_FLEXCOP_USB=m # CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set CONFIG_DVB_USB_V2=m CONFIG_DVB_USB_AF9015=m CONFIG_DVB_USB_AF9035=m CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_AZ6007=m CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_DVBSKY=m CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_GL861=m CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m CONFIG_DVB_USB_ZD1301=m CONFIG_DVB_USB=m # CONFIG_DVB_USB_DEBUG is not set CONFIG_DVB_USB_A800=m CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_CXUSB=m # CONFIG_DVB_USB_CXUSB_ANALOG is not set CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_DIB3000MC=m CONFIG_DVB_USB_DIBUSB_MB=m CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y CONFIG_DVB_USB_DIBUSB_MC=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_DTT200U=m CONFIG_DVB_USB_DTV5100=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_GP8PSK=m CONFIG_DVB_USB_M920X=m CONFIG_DVB_USB_NOVA_T_USB2=m CONFIG_DVB_USB_OPERA1=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_TTUSB2=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_VP7045=m CONFIG_SMS_USB_DRV=m # CONFIG_DVB_TTUSB_BUDGET is not set # CONFIG_DVB_TTUSB_DEC is not set # # Webcam, TV (analog/digital) USB devices # CONFIG_VIDEO_EM28XX=m # CONFIG_VIDEO_EM28XX_V4L2 is not set # CONFIG_VIDEO_EM28XX_ALSA is not set CONFIG_VIDEO_EM28XX_DVB=m CONFIG_VIDEO_EM28XX_RC=m # # Software defined radio USB devices # # CONFIG_USB_AIRSPY is not set # CONFIG_USB_HACKRF is not set # CONFIG_USB_MSI2500 is not set # CONFIG_MEDIA_PCI_SUPPORT is not set # CONFIG_RADIO_ADAPTERS is not set CONFIG_MEDIA_PLATFORM_DRIVERS=y # CONFIG_V4L_PLATFORM_DRIVERS is not set # CONFIG_SDR_PLATFORM_DRIVERS is not set # CONFIG_DVB_PLATFORM_DRIVERS is not set # CONFIG_V4L_MEM2MEM_DRIVERS is not set # # Allegro DVT media platform drivers # # # Amlogic media platform drivers # # # Amphion drivers # # # Aspeed media platform drivers # # # Atmel media platform drivers # # CONFIG_VIDEO_BCM2835_UNICAM is not set # # Cadence media platform drivers # # CONFIG_VIDEO_CADENCE_CSI2RX is not set # CONFIG_VIDEO_CADENCE_CSI2TX is not set # # Chips&Media media platform drivers # # # Intel media platform drivers # # # Marvell media platform drivers # # # Mediatek media platform drivers # # # NVidia media platform drivers # # # NXP media platform drivers # # # Qualcomm media platform drivers # # # Raspberry Pi media platform drivers # # CONFIG_VIDEO_RASPBERRYPI_PISP_BE is not set # CONFIG_VIDEO_RP1_CFE is not set # # Renesas media platform drivers # # # Rockchip media platform drivers # # # Samsung media platform drivers # # # STMicroelectronics media platform drivers # # # Sunxi media platform drivers # # # Texas Instruments drivers # # # Verisilicon media platform drivers # # # VIA media platform drivers # # # Xilinx media platform drivers # # # MMC/SDIO DVB adapters # CONFIG_SMS_SDIO_DRV=m # CONFIG_V4L_TEST_DRIVERS is not set # CONFIG_DVB_TEST_DRIVERS is not set CONFIG_MEDIA_COMMON_OPTIONS=y # # common driver options # CONFIG_CYPRESS_FIRMWARE=m CONFIG_TTPCI_EEPROM=m CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_SMS_SIANO_MDTV=m CONFIG_SMS_SIANO_RC=y # CONFIG_SMS_SIANO_DEBUGFS is not set CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_DMA_CONTIG=m CONFIG_VIDEOBUF2_VMALLOC=m # end of Media drivers # # Media ancillary drivers # CONFIG_MEDIA_ATTACH=y # # IR I2C driver auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_IR_I2C=m CONFIG_VIDEO_CAMERA_SENSOR=y # CONFIG_VIDEO_AR0521 is not set # CONFIG_VIDEO_ARDUCAM_64MP is not set # CONFIG_VIDEO_ARDUCAM_PIVARIETY is not set # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_HI846 is not set # CONFIG_VIDEO_HI847 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX296 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_IMX412 is not set # CONFIG_VIDEO_IMX477 is not set # CONFIG_VIDEO_IMX519 is not set # CONFIG_VIDEO_IMX708 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set # CONFIG_VIDEO_MT9V011 is not set # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set # CONFIG_VIDEO_OV2311 is not set # CONFIG_VIDEO_OV2640 is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5693 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV64A40 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV7251 is not set # CONFIG_VIDEO_OV7640 is not set # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9282 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_M5MOLS is not set # # Lens drivers # # CONFIG_VIDEO_AD5398 is not set # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_BU64754 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # Audio decoders, processors and mixers # # CONFIG_VIDEO_CS3308 is not set # CONFIG_VIDEO_CS5345 is not set CONFIG_VIDEO_CS53L32A=m CONFIG_VIDEO_MSP3400=m # CONFIG_VIDEO_SONY_BTF_MPX is not set # CONFIG_VIDEO_TDA1997X is not set # CONFIG_VIDEO_TDA7432 is not set # CONFIG_VIDEO_TDA9840 is not set # CONFIG_VIDEO_TEA6415C is not set # CONFIG_VIDEO_TEA6420 is not set # CONFIG_VIDEO_TLV320AIC23B is not set # CONFIG_VIDEO_TVAUDIO is not set # CONFIG_VIDEO_UDA1342 is not set # CONFIG_VIDEO_VP27SMPX is not set # CONFIG_VIDEO_WM8739 is not set CONFIG_VIDEO_WM8775=m # end of Audio decoders, processors and mixers # # RDS decoders # # CONFIG_VIDEO_SAA6588 is not set # end of RDS decoders # # Video decoders # # CONFIG_VIDEO_ADV7180 is not set # CONFIG_VIDEO_ADV7183 is not set # CONFIG_VIDEO_ADV748X is not set # CONFIG_VIDEO_ADV7604 is not set # CONFIG_VIDEO_ADV7842 is not set # CONFIG_VIDEO_BT819 is not set # CONFIG_VIDEO_BT856 is not set # CONFIG_VIDEO_BT866 is not set # CONFIG_VIDEO_ISL7998X is not set # CONFIG_VIDEO_KS0127 is not set # CONFIG_VIDEO_MAX9286 is not set # CONFIG_VIDEO_ML86V7667 is not set # CONFIG_VIDEO_SAA7110 is not set CONFIG_VIDEO_SAA711X=m # CONFIG_VIDEO_TC358743 is not set # CONFIG_VIDEO_TVP514X is not set # CONFIG_VIDEO_TVP5150 is not set # CONFIG_VIDEO_TVP7002 is not set # CONFIG_VIDEO_TW2804 is not set # CONFIG_VIDEO_OV9281 is not set # CONFIG_VIDEO_TW9903 is not set # CONFIG_VIDEO_TW9906 is not set # CONFIG_VIDEO_TW9910 is not set # CONFIG_VIDEO_IRS1125 is not set # CONFIG_VIDEO_VPX3220 is not set # # Video and audio decoders # # CONFIG_VIDEO_SAA717X is not set CONFIG_VIDEO_CX25840=m # end of Video decoders # # Video encoders # # CONFIG_VIDEO_AD9389B is not set # CONFIG_VIDEO_ADV7170 is not set # CONFIG_VIDEO_ADV7175 is not set # CONFIG_VIDEO_ADV7343 is not set # CONFIG_VIDEO_ADV7393 is not set # CONFIG_VIDEO_ADV7511 is not set # CONFIG_VIDEO_AK881X is not set # CONFIG_VIDEO_SAA7127 is not set # CONFIG_VIDEO_SAA7185 is not set # CONFIG_VIDEO_THS8200 is not set # end of Video encoders # # Video improvement chips # # CONFIG_VIDEO_UPD64031A is not set # CONFIG_VIDEO_UPD64083 is not set # end of Video improvement chips # # Audio/Video compression chips # # CONFIG_VIDEO_SAA6752HS is not set # end of Audio/Video compression chips # # SDR tuner chips # # CONFIG_SDR_MAX2175 is not set # end of SDR tuner chips # # Miscellaneous helper chips # # CONFIG_VIDEO_I2C is not set # CONFIG_VIDEO_M52790 is not set # CONFIG_VIDEO_ST_MIPID02 is not set # CONFIG_VIDEO_THS7303 is not set # end of Miscellaneous helper chips # # Media SPI Adapters # CONFIG_CXD2880_SPI_DRV=m # CONFIG_VIDEO_GS1662 is not set # end of Media SPI Adapters CONFIG_MEDIA_TUNER=m # # Customize TV tuners # CONFIG_MEDIA_TUNER_E4000=m CONFIG_MEDIA_TUNER_FC0011=m CONFIG_MEDIA_TUNER_FC0012=m CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_FC2580=m CONFIG_MEDIA_TUNER_IT913X=m # CONFIG_MEDIA_TUNER_M88RS6000T is not set CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_MC44S803=m # CONFIG_MEDIA_TUNER_MSI001 is not set CONFIG_MEDIA_TUNER_MT2060=m CONFIG_MEDIA_TUNER_MT2063=m CONFIG_MEDIA_TUNER_MT20XX=m # CONFIG_MEDIA_TUNER_MT2131 is not set CONFIG_MEDIA_TUNER_MT2266=m # CONFIG_MEDIA_TUNER_MXL301RF is not set CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m # CONFIG_MEDIA_TUNER_QM1D1B0004 is not set CONFIG_MEDIA_TUNER_QM1D1C0042=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_R820T=m CONFIG_MEDIA_TUNER_SI2157=m CONFIG_MEDIA_TUNER_SIMPLE=m CONFIG_MEDIA_TUNER_TDA18212=m CONFIG_MEDIA_TUNER_TDA18218=m CONFIG_MEDIA_TUNER_TDA18250=m CONFIG_MEDIA_TUNER_TDA18271=m CONFIG_MEDIA_TUNER_TDA827X=m CONFIG_MEDIA_TUNER_TDA8290=m CONFIG_MEDIA_TUNER_TDA9887=m CONFIG_MEDIA_TUNER_TEA5761=m CONFIG_MEDIA_TUNER_TEA5767=m CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_MEDIA_TUNER_XC2028=m CONFIG_MEDIA_TUNER_XC4000=m CONFIG_MEDIA_TUNER_XC5000=m # end of Customize TV tuners # # Customise DVB Frontends # # # Multistandard (satellite) frontends # CONFIG_DVB_M88DS3103=m # CONFIG_DVB_MXL5XX is not set CONFIG_DVB_STB0899=m CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m # CONFIG_DVB_STV0910 is not set CONFIG_DVB_STV6110x=m # CONFIG_DVB_STV6111 is not set # # Multistandard (cable + terrestrial) frontends # CONFIG_DVB_DRXK=m CONFIG_DVB_MN88472=m CONFIG_DVB_MN88473=m CONFIG_DVB_SI2165=m CONFIG_DVB_TDA18271C2DD=m # # DVB-S (satellite) frontends # # CONFIG_DVB_CX24110 is not set CONFIG_DVB_CX24116=m # CONFIG_DVB_CX24117 is not set CONFIG_DVB_CX24120=m CONFIG_DVB_CX24123=m CONFIG_DVB_DS3000=m # CONFIG_DVB_MB86A16 is not set CONFIG_DVB_MT312=m CONFIG_DVB_S5H1420=m CONFIG_DVB_SI21XX=m CONFIG_DVB_STB6000=m CONFIG_DVB_STV0288=m CONFIG_DVB_STV0299=m CONFIG_DVB_STV0900=m CONFIG_DVB_STV6110=m CONFIG_DVB_TDA10071=m CONFIG_DVB_TDA10086=m # CONFIG_DVB_TDA8083 is not set # CONFIG_DVB_TDA8261 is not set CONFIG_DVB_TDA826X=m CONFIG_DVB_TS2020=m # CONFIG_DVB_TUA6100 is not set CONFIG_DVB_TUNER_CX24113=m CONFIG_DVB_TUNER_ITD1000=m # CONFIG_DVB_VES1X93 is not set # CONFIG_DVB_ZL10036 is not set CONFIG_DVB_ZL10039=m # # DVB-T (terrestrial) frontends # CONFIG_DVB_AF9013=m CONFIG_DVB_AS102_FE=m # CONFIG_DVB_CX22700 is not set CONFIG_DVB_CX22702=m CONFIG_DVB_CXD2820R=m CONFIG_DVB_CXD2841ER=m CONFIG_DVB_DIB3000MB=m CONFIG_DVB_DIB3000MC=m CONFIG_DVB_DIB7000M=m CONFIG_DVB_DIB7000P=m # CONFIG_DVB_DIB9000 is not set CONFIG_DVB_DRXD=m CONFIG_DVB_EC100=m CONFIG_DVB_GP8PSK_FE=m # CONFIG_DVB_L64781 is not set CONFIG_DVB_MT352=m CONFIG_DVB_NXT6000=m CONFIG_DVB_RTL2830=m CONFIG_DVB_RTL2832=m CONFIG_DVB_RTL2832_SDR=m # CONFIG_DVB_S5H1432 is not set CONFIG_DVB_SI2168=m # CONFIG_DVB_SP887X is not set # CONFIG_DVB_STV0367 is not set CONFIG_DVB_TDA10048=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_ZD1301_DEMOD=m CONFIG_DVB_ZL10353=m CONFIG_DVB_CXD2880=m # # DVB-C (cable) frontends # CONFIG_DVB_STV0297=m # CONFIG_DVB_TDA10021 is not set CONFIG_DVB_TDA10023=m # CONFIG_DVB_VES1820 is not set # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # CONFIG_DVB_AU8522=m CONFIG_DVB_AU8522_DTV=m CONFIG_DVB_AU8522_V4L=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LG2160=m CONFIG_DVB_LGDT3305=m CONFIG_DVB_LGDT3306A=m CONFIG_DVB_LGDT330X=m CONFIG_DVB_MXL692=m CONFIG_DVB_NXT200X=m # CONFIG_DVB_OR51132 is not set # CONFIG_DVB_OR51211 is not set CONFIG_DVB_S5H1409=m CONFIG_DVB_S5H1411=m # # ISDB-T (terrestrial) frontends # CONFIG_DVB_DIB8000=m CONFIG_DVB_MB86A20S=m CONFIG_DVB_S921=m # # ISDB-S (satellite) & ISDB-T (terrestrial) frontends # # CONFIG_DVB_MN88443X is not set CONFIG_DVB_TC90522=m # # Digital terrestrial only tuners/PLL # CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m CONFIG_DVB_TUNER_DIB0090=m # # SEC control devices for DVB-S # CONFIG_DVB_A8293=m CONFIG_DVB_AF9033=m # CONFIG_DVB_ASCOT2E is not set CONFIG_DVB_ATBM8830=m # CONFIG_DVB_HELENE is not set # CONFIG_DVB_HORUS3A is not set # CONFIG_DVB_ISL6405 is not set CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m CONFIG_DVB_IX2505V=m # CONFIG_DVB_LGS8GL5 is not set CONFIG_DVB_LGS8GXX=m # CONFIG_DVB_LNBH25 is not set # CONFIG_DVB_LNBH29 is not set CONFIG_DVB_LNBP21=m CONFIG_DVB_LNBP22=m CONFIG_DVB_M88RS2000=m # CONFIG_DVB_TDA665x is not set CONFIG_DVB_DRX39XYJ=m # # Common Interface (EN50221) controller drivers # # CONFIG_DVB_CXD2099 is not set CONFIG_DVB_SP2=m # end of Customise DVB Frontends # # Tools to develop new frontends # # CONFIG_DVB_DUMMY_FE is not set # end of Media ancillary drivers # # Graphics support # CONFIG_DRM=y CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DEBUG_MM is not set CONFIG_DRM_KMS_HELPER=y # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set # CONFIG_DRM_DEBUG_MODESET_LOCK is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_GEM_DMA_HELPER=y CONFIG_DRM_GEM_SHMEM_HELPER=y CONFIG_DRM_SCHED=y # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # end of I2C encoder or helper chips # # ARM devices # # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_KOMEDA is not set # end of ARM devices # CONFIG_DRM_RADEON is not set # CONFIG_DRM_AMDGPU is not set # CONFIG_DRM_NOUVEAU is not set # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set # CONFIG_DRM_VMWGFX is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_AST is not set # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_USE_LVDS is not set # CONFIG_DRM_RCAR_USE_MIPI_DSI is not set # CONFIG_DRM_QXL is not set CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_ABT_Y030XX067A is not set # CONFIG_DRM_PANEL_ARM_VERSATILE is not set # CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set # CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set # CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set # CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set # CONFIG_DRM_PANEL_DSI_CM is not set # CONFIG_DRM_PANEL_LVDS is not set CONFIG_DRM_PANEL_SIMPLE=y # CONFIG_DRM_PANEL_EDP is not set # CONFIG_DRM_PANEL_EBBG_FT8719 is not set # CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set # CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set # CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9806E is not set # CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set # CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set # CONFIG_DRM_PANEL_JDI_R63452 is not set # CONFIG_DRM_PANEL_KHADAS_TS050 is not set # CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set # CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set # CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LB035Q02 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set # CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set # CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set # CONFIG_DRM_PANEL_NOVATEK_NT35560 is not set # CONFIG_DRM_PANEL_NOVATEK_NT35950 is not set # CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set # CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set # CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set # CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set # CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set # CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set # CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set # CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set # CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set # CONFIG_DRM_PANEL_RONBO_RB070D30 is not set # CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set # CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set # CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set # CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set # CONFIG_DRM_PANEL_SHARP_LS060T1SX01 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set # CONFIG_DRM_PANEL_SONY_ACX565AKM is not set # CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 is not set # CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set # CONFIG_DRM_PANEL_TPO_Y17P is not set # CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set # CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set # CONFIG_DRM_PANEL_TPO_TPG110 is not set # CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set # CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set # CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set # CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set # CONFIG_DRM_LONTIUM_LT9611 is not set # CONFIG_DRM_LONTIUM_LT9611UXC is not set # CONFIG_DRM_ITE_IT66121 is not set # CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NWL_MIPI_DSI is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_PARADE_PS8640 is not set # CONFIG_DRM_SIL_SII8620 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_SII9234 is not set CONFIG_DRM_SIMPLE_BRIDGE=y # CONFIG_DRM_THINE_THC63LVD1024 is not set CONFIG_DRM_TOSHIBA_TC358762=y # CONFIG_DRM_TOSHIBA_TC358764 is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TOSHIBA_TC358768 is not set # CONFIG_DRM_TOSHIBA_TC358775 is not set # CONFIG_DRM_TI_DLPC3433 is not set # CONFIG_DRM_TI_TFP410 is not set # CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_ANALOGIX_ANX7625 is not set # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_CDNS_MHDP8546 is not set # end of Display Interface Bridges CONFIG_DRM_V3D=y CONFIG_DRM_VC4=y CONFIG_DRM_VC4_HDMI_CEC=y # CONFIG_DRM_RP1_DSI is not set # CONFIG_DRM_RP1_DPI is not set # CONFIG_DRM_RP1_VEC is not set # CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_HISI_HIBMC is not set # CONFIG_DRM_HISI_KIRIN is not set # CONFIG_DRM_LOGICVC is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_BOCHS is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_PANEL_MIPI_DBI is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9163 is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set # CONFIG_TINYDRM_ILI9486 is not set # CONFIG_TINYDRM_MI0283QT is not set # CONFIG_TINYDRM_REPAPER is not set # CONFIG_TINYDRM_ST7586 is not set # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_LIMA is not set # CONFIG_DRM_PANFROST is not set # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_DRM_NOMODESET=y # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y # CONFIG_FB_MODE_HELPERS is not set # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_BCM2708 is not set # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_EFI is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_I740 is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_S3 is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VT8623 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_ARK is not set # CONFIG_FB_PM3 is not set # CONFIG_FB_CARMINE is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # CONFIG_FB_SM712 is not set # CONFIG_FB_RPISENSE is not set # end of Frame buffer Devices # # Backlight & LCD device support # CONFIG_LCD_CLASS_DEVICE=m # CONFIG_LCD_L4F00242T03 is not set # CONFIG_LCD_LMS283GF05 is not set # CONFIG_LCD_LTV350QV is not set # CONFIG_LCD_ILI922X is not set # CONFIG_LCD_ILI9320 is not set # CONFIG_LCD_TDO24M is not set # CONFIG_LCD_VGG2432A4 is not set # CONFIG_LCD_PLATFORM is not set # CONFIG_LCD_AMS369FG06 is not set # CONFIG_LCD_LMS501KF03 is not set # CONFIG_LCD_HX8357 is not set # CONFIG_LCD_OTM3225A is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_KTD253 is not set # CONFIG_BACKLIGHT_PWM is not set CONFIG_BACKLIGHT_RPI=y # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set CONFIG_BACKLIGHT_GPIO=y # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # CONFIG_BACKLIGHT_LED is not set # end of Backlight & LCD device support CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support # CONFIG_LOGO is not set # end of Graphics support CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_COMPRESS_OFFLOAD=y CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y CONFIG_SND_HRTIMER=m CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 # CONFIG_SND_SUPPORT_OLD_API is not set CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_CTL_INPUT_VALIDATION is not set CONFIG_SND_VMASTER=y # CONFIG_SND_SEQUENCER is not set # CONFIG_SND_DRIVERS is not set CONFIG_SND_PCI=y # CONFIG_SND_AD1889 is not set # CONFIG_SND_ALS300 is not set # CONFIG_SND_ALI5451 is not set # CONFIG_SND_ATIIXP is not set # CONFIG_SND_ATIIXP_MODEM is not set # CONFIG_SND_AU8810 is not set # CONFIG_SND_AU8820 is not set # CONFIG_SND_AU8830 is not set # CONFIG_SND_AW2 is not set # CONFIG_SND_AZT3328 is not set # CONFIG_SND_BT87X is not set # CONFIG_SND_CA0106 is not set # CONFIG_SND_CMIPCI is not set # CONFIG_SND_OXYGEN is not set # CONFIG_SND_CS4281 is not set # CONFIG_SND_CS46XX is not set # CONFIG_SND_CTXFI is not set # CONFIG_SND_DARLA20 is not set # CONFIG_SND_GINA20 is not set # CONFIG_SND_LAYLA20 is not set # CONFIG_SND_DARLA24 is not set # CONFIG_SND_GINA24 is not set # CONFIG_SND_LAYLA24 is not set # CONFIG_SND_MONA is not set # CONFIG_SND_MIA is not set # CONFIG_SND_ECHO3G is not set # CONFIG_SND_INDIGO is not set # CONFIG_SND_INDIGOIO is not set # CONFIG_SND_INDIGODJ is not set # CONFIG_SND_INDIGOIOX is not set # CONFIG_SND_INDIGODJX is not set # CONFIG_SND_EMU10K1 is not set # CONFIG_SND_EMU10K1X is not set # CONFIG_SND_ENS1370 is not set # CONFIG_SND_ENS1371 is not set # CONFIG_SND_ES1938 is not set # CONFIG_SND_ES1968 is not set # CONFIG_SND_FM801 is not set # CONFIG_SND_HDSP is not set # CONFIG_SND_HDSPM is not set # CONFIG_SND_ICE1712 is not set # CONFIG_SND_ICE1724 is not set # CONFIG_SND_INTEL8X0 is not set # CONFIG_SND_INTEL8X0M is not set # CONFIG_SND_KORG1212 is not set # CONFIG_SND_LOLA is not set # CONFIG_SND_LX6464ES is not set # CONFIG_SND_MAESTRO3 is not set # CONFIG_SND_MIXART is not set # CONFIG_SND_NM256 is not set # CONFIG_SND_PCXHR is not set # CONFIG_SND_RIPTIDE is not set # CONFIG_SND_RME32 is not set # CONFIG_SND_RME96 is not set # CONFIG_SND_RME9652 is not set # CONFIG_SND_SE6X is not set # CONFIG_SND_SONICVIBES is not set # CONFIG_SND_TRIDENT is not set # CONFIG_SND_VIA82XX is not set # CONFIG_SND_VIA82XX_MODEM is not set # CONFIG_SND_VIRTUOSO is not set # CONFIG_SND_VX222 is not set # CONFIG_SND_YMFPCI is not set # # HD-Audio # # CONFIG_SND_HDA_INTEL is not set # end of HD-Audio CONFIG_SND_HDA_PREALLOC_SIZE=2048 CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=m CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y CONFIG_SND_USB_UA101=m CONFIG_SND_USB_CAIAQ=m CONFIG_SND_USB_CAIAQ_INPUT=y CONFIG_SND_USB_6FIRE=m CONFIG_SND_USB_HIFACE=m CONFIG_SND_BCD2000=m CONFIG_SND_USB_LINE6=m CONFIG_SND_USB_POD=m CONFIG_SND_USB_PODHD=m CONFIG_SND_USB_TONEPORT=m CONFIG_SND_USB_VARIAX=m CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y CONFIG_SND_SOC_COMPRESS=y # CONFIG_SND_SOC_ADI is not set # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_AMD_ACP_CONFIG is not set # CONFIG_SND_ATMEL_SOC is not set CONFIG_SND_BCM2835_SOC_I2S=m # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set CONFIG_SND_BCM2708_SOC_CHIPDIP_DAC=m CONFIG_SND_BCM2708_SOC_GOOGLEVOICEHAT_SOUNDCARD=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUS=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSHD=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADC=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADCPRO=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSDSP=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_AMP=m CONFIG_SND_BCM2708_SOC_PIFI_40=m CONFIG_SND_BCM2708_SOC_RPI_CIRRUS=m CONFIG_SND_BCM2708_SOC_RPI_DAC=m CONFIG_SND_BCM2708_SOC_RPI_PROTO=m CONFIG_SND_BCM2708_SOC_JUSTBOOM_BOTH=m CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC=m CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m CONFIG_SND_BCM2708_SOC_IQAUDIO_CODEC=m CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m CONFIG_SND_BCM2708_SOC_IQAUDIO_DIGI=m CONFIG_SND_BCM2708_SOC_I_SABRE_Q2M=m CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m CONFIG_SND_AUDIOINJECTOR_OCTO_SOUNDCARD=m CONFIG_SND_AUDIOINJECTOR_ISOLATED_SOUNDCARD=m CONFIG_SND_AUDIOSENSE_PI=m CONFIG_SND_DIGIDAC1_SOUNDCARD=m CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO=m CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO_V2=m CONFIG_SND_BCM2708_SOC_ALLO_PIANO_DAC=m CONFIG_SND_BCM2708_SOC_ALLO_PIANO_DAC_PLUS=m CONFIG_SND_BCM2708_SOC_ALLO_BOSS_DAC=m CONFIG_SND_BCM2708_SOC_ALLO_BOSS2_DAC=m CONFIG_SND_BCM2708_SOC_ALLO_DIGIONE=m CONFIG_SND_BCM2708_SOC_ALLO_KATANA_DAC=m CONFIG_SND_BCM2708_SOC_FE_PI_AUDIO=m CONFIG_SND_PISOUND=m CONFIG_SND_RPI_SIMPLE_SOUNDCARD=m CONFIG_SND_RPI_WM8804_SOUNDCARD=m CONFIG_SND_DACBERRY400=m # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # CONFIG_SND_SOC_FSL_AUDMIX is not set # 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_FSL_XCVR is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # end of SoC Audio for Freescale CPUs # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_MTK_BTCVSD is not set # CONFIG_SND_SOC_SOF_TOPLEVEL is not set # # STMicroelectronics STM32 SOC audio support # # end of 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_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # CONFIG_SND_SOC_ARIZONA=m CONFIG_SND_SOC_WM_ADSP=m # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_AD193X_SPI is not set # CONFIG_SND_SOC_AD193X_I2C is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1372_SPI is not set CONFIG_SND_SOC_ADAU1701=m # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set CONFIG_SND_SOC_ADAU1977=m CONFIG_SND_SOC_ADAU1977_I2C=m CONFIG_SND_SOC_ADAU7002=m # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4375 is not set # CONFIG_SND_SOC_AK4458 is not set CONFIG_SND_SOC_AK4554=m # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # 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_CS35L41_SPI is not set # CONFIG_SND_SOC_CS35L41_I2C is not set # CONFIG_SND_SOC_CS35L45_SPI is not set # CONFIG_SND_SOC_CS35L45_I2C 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS42L83 is not set # CONFIG_SND_SOC_CS4234 is not set CONFIG_SND_SOC_CS4265=m # CONFIG_SND_SOC_CS4270 is not set CONFIG_SND_SOC_CS4271=m CONFIG_SND_SOC_CS4271_I2C=m # CONFIG_SND_SOC_CS4271_SPI is not set CONFIG_SND_SOC_CS42XX8=m CONFIG_SND_SOC_CS42XX8_I2C=m # 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_CX2072X is not set CONFIG_SND_SOC_DA7213=m CONFIG_SND_SOC_DMIC=m CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_ES7134 is not set # CONFIG_SND_SOC_ES7241 is not set # CONFIG_SND_SOC_ES8316 is not set # CONFIG_SND_SOC_ES8326 is not set # CONFIG_SND_SOC_ES8328_I2C is not set # CONFIG_SND_SOC_ES8328_SPI is not set # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_HDA is not set # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set CONFIG_SND_SOC_MA120X0P=m # CONFIG_SND_SOC_MAX98088 is not set # CONFIG_SND_SOC_MAX98357A is not set # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98520 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX98396 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set CONFIG_SND_SOC_PCM179X=m CONFIG_SND_SOC_PCM179X_I2C=m # CONFIG_SND_SOC_PCM179X_SPI is not set CONFIG_SND_SOC_PCM186X=m CONFIG_SND_SOC_PCM186X_I2C=m # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set CONFIG_SND_SOC_PCM5102A=m CONFIG_SND_SOC_PCM512x=m CONFIG_SND_SOC_PCM512x_I2C=m # 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_PCM1794A=m # CONFIG_SND_SOC_RT5631 is not set # CONFIG_SND_SOC_RT5640 is not set # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_RT9120 is not set CONFIG_SND_SOC_SGTL5000=m CONFIG_SND_SOC_SIGMADSP=m CONFIG_SND_SOC_SIGMADSP_I2C=m CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m # CONFIG_SND_SOC_SIMPLE_MUX is not set CONFIG_SND_SOC_SPDIF=m # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set CONFIG_SND_SOC_STA32X=m # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS2780 is not set # CONFIG_SND_SOC_TAS5086 is not set CONFIG_SND_SOC_TAS571X=m # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805M is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set CONFIG_SND_SOC_TAS5713=m # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320ADC3XXX is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set CONFIG_SND_SOC_TLV320AIC32X4=m CONFIG_SND_SOC_TLV320AIC32X4_I2C=m # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set CONFIG_SND_SOC_TLV320AIC3X=m CONFIG_SND_SOC_TLV320AIC3X_I2C=m # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set CONFIG_SND_SOC_WM5102=m # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set CONFIG_SND_SOC_WM8731=m CONFIG_SND_SOC_WM8731_I2C=m # CONFIG_SND_SOC_WM8731_SPI is not set # CONFIG_SND_SOC_WM8737 is not set CONFIG_SND_SOC_WM8741=m # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set CONFIG_SND_SOC_WM8804=m CONFIG_SND_SOC_WM8804_I2C=m # 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_WM8940 is not set CONFIG_SND_SOC_WM8960=m # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set # CONFIG_SND_SOC_ZL38060 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_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8821 is not set # CONFIG_SND_SOC_NAU8822 is not set # CONFIG_SND_SOC_NAU8824 is not set CONFIG_SND_SOC_TPA6130A2=m # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set CONFIG_SND_SOC_I_SABRE_CODEC=m # end of CODEC drivers CONFIG_SND_SIMPLE_CARD_UTILS=m CONFIG_SND_SIMPLE_CARD=m CONFIG_SND_AUDIO_GRAPH_CARD=m # CONFIG_SND_AUDIO_GRAPH_CARD2 is not set # CONFIG_SND_TEST_COMPONENT is not set # # HID support # CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set CONFIG_HID_ASUS=y CONFIG_HID_AUREAL=y CONFIG_HID_BELKIN=y # CONFIG_HID_BETOP_FF is not set CONFIG_HID_BIGBEN_FF=m CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CREATIVE_SB0540 is not set CONFIG_HID_CYPRESS=y CONFIG_HID_DRAGONRISE=m CONFIG_DRAGONRISE_FF=y # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_FT260 is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_GLORIOUS is not set # CONFIG_HID_HOLTEK is not set # CONFIG_HID_VIVALDI is not set # CONFIG_HID_GT683R is not set # CONFIG_HID_KEYTOUCH is not set CONFIG_HID_KYE=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set # CONFIG_HID_VRC2 is not set # CONFIG_HID_XIAOMI is not set CONFIG_HID_GYRATION=y # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set # CONFIG_HID_JABRA is not set CONFIG_HID_TWINHAN=y CONFIG_HID_KENSINGTON=y CONFIG_HID_LCPOWER=y # CONFIG_HID_LED is not set CONFIG_HID_LENOVO=y # CONFIG_HID_LETSKETCH is not set CONFIG_HID_LOGITECH=y CONFIG_HID_LOGITECH_DJ=y CONFIG_HID_LOGITECH_HIDPP=y CONFIG_LOGITECH_FF=y 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_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=m CONFIG_HID_NINTENDO=m CONFIG_NINTENDO_FF=y # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set CONFIG_HID_ORTEK=y CONFIG_HID_OUYA=y CONFIG_HID_PANTHERLORD=y CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=y CONFIG_HID_PETALYNX=y # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PXRC is not set # CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set CONFIG_HID_SAMSUNG=y # CONFIG_HID_SEMITEK is not set # CONFIG_HID_SIGMAMICRO is not set CONFIG_HID_SONY=y CONFIG_SONY_FF=y # CONFIG_HID_SPEEDLINK is not set CONFIG_HID_STEAM=m # CONFIG_HID_STEELSERIES is not set CONFIG_HID_SUNPLUS=y CONFIG_HID_RMI=y # CONFIG_HID_GREENASIA is not set CONFIG_HID_SMARTJOYPLUS=m CONFIG_SMARTJOYPLUS_FF=y CONFIG_HID_TIVO=y CONFIG_HID_TOPSEED=y # CONFIG_HID_TOPRE is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set CONFIG_HID_WIIMOTE=m CONFIG_HID_XINMO=y # CONFIG_HID_ZEROPLUS is not set CONFIG_HID_ZYDACRON=y # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # end of USB HID support # # I2C HID support # # CONFIG_I2C_HID_OF is not set # CONFIG_I2C_HID_OF_ELAN is not set # CONFIG_I2C_HID_OF_GOODIX is not set # end of I2C HID support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y # CONFIG_USB_LED_TRIG is not set # CONFIG_USB_ULPI_BUS is not set # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_PCI=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_OTG is not set # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set # CONFIG_USB_LEDS_TRIGGER_USBPORT is not set CONFIG_USB_AUTOSUSPEND_DELAY=2 CONFIG_USB_MON=m # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y # CONFIG_USB_XHCI_DBGCAP is not set CONFIG_USB_XHCI_PCI=y # CONFIG_USB_XHCI_PCI_RENESAS is not set CONFIG_USB_XHCI_PLATFORM=y # CONFIG_USB_EHCI_HCD is not set # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set # CONFIG_USB_OHCI_HCD is not set # CONFIG_USB_UHCI_HCD is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set CONFIG_USB_DWCOTG=y # CONFIG_USB_HCD_BCMA is not set # CONFIG_USB_HCD_SSB is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=m # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set CONFIG_USB_UAS=y # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # CONFIG_USB_SERIAL=m CONFIG_USB_SERIAL_GENERIC=y # CONFIG_USB_SERIAL_SIMPLE is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set CONFIG_USB_SERIAL_CH341=m # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set CONFIG_USB_SERIAL_CP210X=m # CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_EMPEG is not set CONFIG_USB_SERIAL_FTDI_SIO=m # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_F81232 is not set # CONFIG_USB_SERIAL_F8153X is not set # CONFIG_USB_SERIAL_GARMIN is not set # CONFIG_USB_SERIAL_IPW is not set CONFIG_USB_SERIAL_IUU=m # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set # CONFIG_USB_SERIAL_KEYSPAN is not set # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_METRO is not set # CONFIG_USB_SERIAL_MOS7720 is not set # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MXUPORT is not set # CONFIG_USB_SERIAL_NAVMAN is not set CONFIG_USB_SERIAL_PL2303=m # CONFIG_USB_SERIAL_OTI6858 is not set # CONFIG_USB_SERIAL_QCAUX is not set # CONFIG_USB_SERIAL_QUALCOMM is not set # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SAFE is not set # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_OPTION is not set # CONFIG_USB_SERIAL_OMNINET is not set # CONFIG_USB_SERIAL_OPTICON is not set # CONFIG_USB_SERIAL_XSENS_MT is not set # CONFIG_USB_SERIAL_WISHBONE is not set # CONFIG_USB_SERIAL_SSU100 is not set # CONFIG_USB_SERIAL_QT2 is not set # CONFIG_USB_SERIAL_UPD78F0730 is not set # CONFIG_USB_SERIAL_XR is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HUB_USB251XB is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # CONFIG_USB_ONBOARD_HUB is not set # # USB Physical Layer drivers # CONFIG_USB_PHY=y CONFIG_NOP_USB_XCEIV=y # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set # CONFIG_USB_ULPI is not set # end of USB Physical Layer drivers # CONFIG_USB_GADGET is not set # CONFIG_TYPEC is not set # CONFIG_USB_ROLE_SWITCH is not set CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y CONFIG_PWRSEQ_SIMPLE=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # CONFIG_MMC_BCM2835_MMC=y CONFIG_MMC_BCM2835_DMA=y CONFIG_MMC_BCM2835_PIO_DMA_BARRIER=2 CONFIG_MMC_BCM2835_SDHOST=y # CONFIG_MMC_DEBUG is not set # CONFIG_MMC_ARMMMCI is not set CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_IO_ACCESSORS=y # CONFIG_MMC_SDHCI_PCI is not set CONFIG_MMC_SDHCI_PLTFM=y # CONFIG_MMC_SDHCI_OF_ARASAN is not set # CONFIG_MMC_SDHCI_OF_AT91 is not set # CONFIG_MMC_SDHCI_OF_DWCMSHC is not set # CONFIG_MMC_SDHCI_CADENCE is not set # CONFIG_MMC_SDHCI_F_SDH30 is not set # CONFIG_MMC_SDHCI_MILBEAUT is not set CONFIG_MMC_SDHCI_IPROC=y # CONFIG_MMC_TIFM_SD is not set # CONFIG_MMC_SPI is not set # CONFIG_MMC_CB710 is not set # CONFIG_MMC_VIA_SDMMC is not set # CONFIG_MMC_DW is not set # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_REALTEK_USB=m # CONFIG_MMC_CQHCI is not set # CONFIG_MMC_HSQ is not set # CONFIG_MMC_TOSHIBA_PCI is not set # CONFIG_MMC_BCM2835 is not set # CONFIG_MMC_MTK is not set # CONFIG_MMC_SDHCI_XENON is not set # CONFIG_MMC_SDHCI_OMAP is not set # CONFIG_MMC_SDHCI_AM654 is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y CONFIG_LEDS_CLASS_FLASH=y # CONFIG_LEDS_CLASS_MULTICOLOR is not set # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_AW2013 is not set # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_EL15203000 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP50XX is not set # CONFIG_LEDS_LP55XX_COMMON is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set # CONFIG_LEDS_PWM is not set # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_SYSCON is not set # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_SPI_BYTE is not set # CONFIG_LEDS_TI_LMU_COMMON is not set # # Flash and Torch LED drivers # # CONFIG_LEDS_AAT1290 is not set # CONFIG_LEDS_AS3645A is not set # CONFIG_LEDS_KTD2692 is not set # CONFIG_LEDS_LM3601X is not set # CONFIG_LEDS_RT4505 is not set # CONFIG_LEDS_RT8515 is not set # CONFIG_LEDS_SGM3140 is not set # # RGB LED drivers # # # LED Triggers # CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_BACKLIGHT=y CONFIG_LEDS_TRIGGER_CPU=y # CONFIG_LEDS_TRIGGER_ACTIVITY is not set CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # # iptables trigger is under Netfilter config (LED target) # CONFIG_LEDS_TRIGGER_TRANSIENT=y CONFIG_LEDS_TRIGGER_CAMERA=y CONFIG_LEDS_TRIGGER_INPUT=y # CONFIG_LEDS_TRIGGER_PANIC is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set # CONFIG_LEDS_TRIGGER_AUDIO is not set # CONFIG_LEDS_TRIGGER_TTY is not set CONFIG_LEDS_TRIGGER_ACTPWR=y # # Simple LED drivers # # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_SUPPORT=y # CONFIG_EDAC is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # I2C RTC drivers # # CONFIG_RTC_DRV_ABB5ZES3 is not set # CONFIG_RTC_DRV_ABEOZ9 is not set CONFIG_RTC_DRV_ABX80X=m CONFIG_RTC_DRV_DS1307=m # CONFIG_RTC_DRV_DS1307_CENTURY is not set # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_HYM8563 is not set # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_NCT3018Y is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set CONFIG_RTC_DRV_PCF8523=m # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set CONFIG_RTC_DRV_PCF8563=m # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # 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_RV3032 is not set # CONFIG_RTC_DRV_RV8803 is not set # CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # CONFIG_RTC_DRV_DS3232=m CONFIG_RTC_DRV_DS3232_HWMON=y CONFIG_RTC_DRV_PCF2127=m # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_EFI is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_PL030 is not set # CONFIG_RTC_DRV_PL031 is not set # CONFIG_RTC_DRV_CADENCE is not set # CONFIG_RTC_DRV_FTRTC010 is not set # CONFIG_RTC_DRV_R7301 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_VIRTUAL_CHANNELS=y CONFIG_DMA_OF=y # CONFIG_ALTERA_MSGDMA is not set # CONFIG_AMBA_PL08X is not set # CONFIG_BCM_SBA_RAID is not set CONFIG_DMA_BCM2835=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 is not set # CONFIG_PL330_DMA is not set # CONFIG_PLX_DMA is not set # CONFIG_DMA_BCM2708 is not set # CONFIG_XILINX_DMA is not set # CONFIG_XILINX_ZYNQMP_DMA is not set # CONFIG_XILINX_ZYNQMP_DPDMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set # CONFIG_DW_DMAC is not set # CONFIG_DW_DMAC_PCI is not set # CONFIG_DW_EDMA is not set # CONFIG_DW_EDMA_PCIE is not set # CONFIG_SF_PDMA is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set CONFIG_DMABUF_HEAPS=y # CONFIG_DMABUF_SYSFS_STATS is not set CONFIG_DMABUF_HEAPS_SYSTEM=y CONFIG_DMABUF_HEAPS_CMA=y # end of DMABUF options # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set # CONFIG_VIRTIO_MENU is not set # CONFIG_VDPA is not set CONFIG_VHOST_MENU=y # CONFIG_VHOST_NET is not set # CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set # # Microsoft Hyper-V guest support # # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_RTL8192U is not set # CONFIG_RTLLIB is not set CONFIG_RTL8723BS=m CONFIG_R8712U=m CONFIG_R8188EU=m # CONFIG_RTS5208 is not set # CONFIG_VT6655 is not set CONFIG_VT6656=m # CONFIG_FB_SM750 is not set CONFIG_STAGING_MEDIA=y # CONFIG_VIDEO_MAX96712 is not set CONFIG_VIDEO_RPIVID=m # CONFIG_STAGING_MEDIA_DEPRECATED is not set # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_FB_TFT is not set # CONFIG_KS7010 is not set CONFIG_BCM_VIDEOCORE=y CONFIG_BCM2835_VCHIQ=y CONFIG_VCHIQ_CDEV=y CONFIG_SND_BCM2835=m # CONFIG_VIDEO_BCM2835 is not set CONFIG_BCM_VC_SM_CMA=y CONFIG_VIDEO_CODEC_BCM2835=m CONFIG_VIDEO_ISP_BCM2835=m CONFIG_BCM2835_VCHIQ_MMAL=m # CONFIG_PI433 is not set # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_FIELDBUS_DEV is not set # CONFIG_QLGE is not set # CONFIG_VME_BUS is not set # CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set CONFIG_SURFACE_PLATFORMS=y CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Clock driver for ARM Reference designs # # CONFIG_CLK_ICST is not set # CONFIG_CLK_SP810 is not set # end of Clock driver for ARM Reference designs # CONFIG_LMK04832 is not set # CONFIG_COMMON_CLK_MAX9485 is not set # CONFIG_COMMON_CLK_RP1 is not set CONFIG_COMMON_CLK_HIFIBERRY_DACPLUSHD=m CONFIG_COMMON_CLK_HIFIBERRY_DACPRO=m # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set # CONFIG_COMMON_CLK_AXI_CLKGEN is not set # CONFIG_COMMON_CLK_XGENE is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_RS9_PCIE is not set # CONFIG_COMMON_CLK_VC5 is not set # CONFIG_COMMON_CLK_VC7 is not set # CONFIG_COMMON_CLK_FIXED_MMIO is not set CONFIG_CLK_BCM2711_DVP=y CONFIG_CLK_BCM2835=y CONFIG_CLK_RASPBERRYPI=y # CONFIG_XILINX_VCU is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set # CONFIG_HWSPINLOCK is not set # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_PROBE=y CONFIG_CLKSRC_MMIO=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y CONFIG_FSL_ERRATUM_A008585=y CONFIG_HISILICON_ERRATUM_161010101=y CONFIG_ARM64_ERRATUM_858921=y CONFIG_ARM_TIMER_SP804=y # CONFIG_MICROCHIP_PIT64B is not set # end of Clock Source drivers CONFIG_MAILBOX=y # CONFIG_ARM_MHU is not set # CONFIG_ARM_MHU_V2 is not set # CONFIG_PLATFORM_MHU is not set # CONFIG_PL320_MBOX is not set # CONFIG_ALTERA_MBOX is not set CONFIG_BCM2835_MBOX=y # CONFIG_MAILBOX_TEST is not set # CONFIG_IOMMU_SUPPORT is not set # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # end of Remoteproc drivers # # Rpmsg drivers # # CONFIG_RPMSG_QCOM_GLINK_RPM is not set # CONFIG_RPMSG_VIRTIO is not set # end of Rpmsg drivers # CONFIG_SOUNDWIRE is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # end of Amlogic SoC drivers # # Broadcom SoC drivers # CONFIG_BCM2835_POWER=y CONFIG_RASPBERRYPI_POWER=y # CONFIG_SOC_BRCMSTB is not set # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # CONFIG_QUICC_ENGINE is not set # end of NXP/Freescale QorIQ SoC drivers # # fujitsu SoC drivers # # end of fujitsu SoC drivers # # i.MX SoC drivers # # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # CONFIG_LITEX_SOC_CONTROLLER is not set # end of Enable LiteX SoC Builder specific drivers # # Qualcomm SoC drivers # # end of Qualcomm SoC drivers # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers # CONFIG_PM_DEVFREQ is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_FSA9480 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 # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_DEBUG is not set # CONFIG_PWM_ATMEL_TCB is not set CONFIG_PWM_BCM2835=m # CONFIG_PWM_CLK is not set # CONFIG_PWM_DWC is not set # CONFIG_PWM_FSL_FTM is not set # CONFIG_PWM_PCA9685 is not set CONFIG_PWM_RASPBERRYPI_POE=m # CONFIG_PWM_RP1 is not set # CONFIG_PWM_XILINX is not set # # IRQ chip support # CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 CONFIG_ARM_GIC_V2M=y CONFIG_ARM_GIC_V3=y CONFIG_ARM_GIC_V3_ITS=y CONFIG_ARM_GIC_V3_ITS_PCI=y # CONFIG_AL_FIC is not set # CONFIG_BCM2712_MIP is not set CONFIG_BRCMSTB_L2_IRQ=y # CONFIG_XILINX_INTC is not set CONFIG_PARTITION_PERCPU=y # end of IRQ chip support # CONFIG_IPACK_BUS is not set CONFIG_RESET_CONTROLLER=y # CONFIG_RESET_BRCMSTB is not set CONFIG_RESET_RASPBERRYPI=y CONFIG_RESET_SIMPLE=y # CONFIG_RESET_TI_SYSCON is not set # CONFIG_RESET_TI_TPS380X is not set # # PHY Subsystem # # CONFIG_GENERIC_PHY is not set # CONFIG_PHY_XGENE is not set # CONFIG_PHY_CAN_TRANSCEIVER is not set # # PHY drivers for Broadcom platforms # # CONFIG_BCM_KONA_USB2_PHY is not set # CONFIG_PHY_BRCM_USB is not set # end of PHY drivers for Broadcom platforms # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_DPHY_RX is not set # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_CADENCE_SALVO is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_LAN966X_SERDES is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set # CONFIG_PHY_OCELOT_SERDES is not set # end of PHY Subsystem # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCI_PMU is not set # CONFIG_ARM_CCN is not set # CONFIG_ARM_CMN is not set CONFIG_ARM_PMU=y # CONFIG_ARM_DSU_PMU is not set # CONFIG_ARM_SPE_PMU is not set CONFIG_RPI_AXIPERF=m # CONFIG_HISI_PCIE_PMU is not set # CONFIG_HNS3_PMU is not set # end of Performance monitor support CONFIG_RAS=y # CONFIG_USB4 is not set # # Android # # CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_LIBNVDIMM is not set # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y CONFIG_NVMEM_RMEM=m # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # CONFIG_HISI_PTT is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_FSI is not set # CONFIG_TEE is not set CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set # CONFIG_PECI is not set # CONFIG_HTE is not set # end of Device Drivers # # 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 CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=m CONFIG_XFS_SUPPORT_V4=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_ONLINE_SCRUB is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_BTRFS_FS_REF_VERIFY is not set # CONFIG_NILFS2_FS is not set CONFIG_F2FS_FS=y CONFIG_F2FS_STAT_FS=y # CONFIG_F2FS_FS_XATTR is not set CONFIG_F2FS_CHECK_FS=y # CONFIG_F2FS_FAULT_INJECTION is not set # CONFIG_F2FS_FS_COMPRESSION is not set CONFIG_F2FS_IOSTAT=y # CONFIG_F2FS_UNFAIR_RWSEM is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y # CONFIG_QUOTA is not set # CONFIG_AUTOFS4_FS is not set CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=m # CONFIG_CUSE is not set # CONFIG_VIRTIO_FS is not set CONFIG_OVERLAY_FS=m # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_XINO_AUTO is not set # CONFIG_OVERLAY_FS_METACOPY is not set # # Caches # CONFIG_NETFS_SUPPORT=y # CONFIG_NETFS_STATS is not set CONFIG_FSCACHE=y # CONFIG_FSCACHE_STATS is not set # CONFIG_FSCACHE_DEBUG is not set # CONFIG_CACHEFILES is not set # end of Caches # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=y # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=m CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set CONFIG_NTFS3_FS=m # CONFIG_NTFS3_64BIT_CLUSTER is not set # CONFIG_NTFS3_LZX_XPRESS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_TMPFS_INODE64 is not set CONFIG_ARCH_SUPPORTS_HUGETLBFS=y # CONFIG_HUGETLBFS is not set CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=y CONFIG_EFIVAR_FS=m # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set CONFIG_HFS_FS=y CONFIG_HFSPLUS_FS=y # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y # CONFIG_SQUASHFS_FILE_CACHE is not set CONFIG_SQUASHFS_FILE_DIRECT=y # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 CONFIG_PSTORE_DEFLATE_COMPRESS=y # CONFIG_PSTORE_LZO_COMPRESS is not set # CONFIG_PSTORE_LZ4_COMPRESS is not set # CONFIG_PSTORE_LZ4HC_COMPRESS is not set # CONFIG_PSTORE_842_COMPRESS is not set # CONFIG_PSTORE_ZSTD_COMPRESS is not set CONFIG_PSTORE_COMPRESS=y CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" CONFIG_PSTORE_CONSOLE=y # CONFIG_PSTORE_PMSG is not set # CONFIG_PSTORE_FTRACE is not set CONFIG_PSTORE_RAM=y # CONFIG_PSTORE_BLK is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y CONFIG_NFS_SWAP=y CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=m CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" CONFIG_NFS_V4_1_MIGRATION=y CONFIG_ROOT_NFS=y CONFIG_NFS_FSCACHE=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFS_DISABLE_UDP_SUPPORT=y # CONFIG_NFS_V4_2_READ_PLUS is not set # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_COMMON=y CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y CONFIG_SUNRPC_SWAP=y CONFIG_RPCSEC_GSS_KRB5=m # CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES is not set # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS2=y CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set CONFIG_CIFS_DEBUG=y # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DEBUG_DUMP_KEYS is not set # CONFIG_CIFS_DFS_UPCALL is not set # CONFIG_CIFS_SWN_UPCALL is not set CONFIG_CIFS_FSCACHE=y # CONFIG_CIFS_ROOT is not set # CONFIG_SMB_SERVER is not set CONFIG_SMBFS=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEY_DH_OPERATIONS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_LSM="yama,loadpin,safesetid,integrity" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_STACK_ALL_PATTERN is not set # CONFIG_INIT_STACK_ALL_ZERO is not set # CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization CONFIG_RANDSTRUCT_NONE=y # CONFIG_RANDSTRUCT_FULL is not set # CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set # end of Crypto core or helper # # Public-key cryptography # CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y # CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set CONFIG_CRYPTO_ECC=m CONFIG_CRYPTO_ECDH=m # CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set # end of Public-key cryptography # # Block ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SM4_GENERIC is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CFB=m CONFIG_CRYPTO_CTR=y CONFIG_CRYPTO_CTS=m CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set CONFIG_CRYPTO_OFB=m # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # end of Length-preserving ciphers and modes # # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y # CONFIG_CRYPTO_ESSIV is not set # end of AEAD (authenticated encryption with associated data) ciphers # # Hashes, digests, and MACs # CONFIG_CRYPTO_BLAKE2B=m CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_XCBC is not set CONFIG_CRYPTO_XXHASH=m # end of Hashes, digests, and MACs # # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y # CONFIG_CRYPTO_CRCT10DIF is not set # end of CRCs (cyclic redundancy checks) # # Compression # CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_LZO=m # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # end of Compression # # Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation # # Userspace interface # CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set # CONFIG_CRYPTO_USER_API_AEAD is not set CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y # CONFIG_CRYPTO_NHPOLY1305_NEON is not set CONFIG_CRYPTO_CHACHA20_NEON=m # # Accelerated Cryptographic Algorithms for CPU (arm64) # # CONFIG_CRYPTO_GHASH_ARM64_CE is not set CONFIG_CRYPTO_POLY1305_NEON=m # CONFIG_CRYPTO_SHA1_ARM64_CE is not set # CONFIG_CRYPTO_SHA256_ARM64 is not set # CONFIG_CRYPTO_SHA2_ARM64_CE is not set # CONFIG_CRYPTO_SHA512_ARM64 is not set # CONFIG_CRYPTO_SHA512_ARM64_CE is not set # CONFIG_CRYPTO_SHA3_ARM64 is not set # CONFIG_CRYPTO_SM3_NEON is not set # CONFIG_CRYPTO_SM3_ARM64_CE is not set # CONFIG_CRYPTO_POLYVAL_ARM64_CE is not set CONFIG_CRYPTO_AES_ARM64=y # CONFIG_CRYPTO_AES_ARM64_CE is not set # CONFIG_CRYPTO_AES_ARM64_CE_BLK is not set CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y CONFIG_CRYPTO_AES_ARM64_BS=y # CONFIG_CRYPTO_SM4_ARM64_CE is not set # CONFIG_CRYPTO_SM4_ARM64_CE_BLK is not set # CONFIG_CRYPTO_SM4_ARM64_NEON_BLK is not set # CONFIG_CRYPTO_AES_ARM64_CE_CCM is not set # end of Accelerated Cryptographic Algorithms for CPU (arm64) # CONFIG_CRYPTO_HW is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS8_PRIVATE_KEY_PARSER=m CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m CONFIG_RAID6_PQ_BENCHMARK=y CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_CORDIC=m # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y # CONFIG_INDIRECT_PIO is not set # CONFIG_TRACE_MMIO_ACCESS is not set # # Crypto library routines # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=m CONFIG_CRYPTO_LIB_CHACHA_GENERIC=m CONFIG_CRYPTO_LIB_CHACHA=m CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m CONFIG_CRYPTO_LIB_CURVE25519=m CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m CONFIG_CRYPTO_LIB_POLY1305=m CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_CRC_CCITT=m CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC64_ROCKSOFT is not set CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=m # CONFIG_CRC8 is not set CONFIG_XXHASH=y CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=m CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=m CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set # CONFIG_XZ_DEC_IA64 is not set # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set # CONFIG_XZ_DEC_MICROLZMA is not set # CONFIG_XZ_DEC_TEST is not set CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=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_PREP_COHERENT=y CONFIG_SWIOTLB=y # CONFIG_DMA_RESTRICTED_POOL is not set CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_COHERENT_POOL=y CONFIG_DMA_DIRECT_REMAP=y CONFIG_DMA_CMA=y # CONFIG_DMA_PERNUMA_CMA is not set # # Default contiguous memory area size: # CONFIG_CMA_SIZE_MBYTES=5 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_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y # CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_DIMLIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_UCS2_STRING=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_TIME_NS=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_ARCH_STACKWALK=y CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y # end of Library routines CONFIG_GENERIC_IOREMAP=y CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set # CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Compile-time checks and compiler options # CONFIG_AS_HAS_NON_CONST_LEB128=y CONFIG_DEBUG_INFO_NONE=y # CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=2048 CONFIG_STRIP_ASM_SYMS=y # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y # CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set CONFIG_HAVE_ARCH_KCSAN=y CONFIG_HAVE_KCSAN_COMPILER=y # CONFIG_KCSAN is not set # end of Generic Kernel Debugging Instruments # # Networking Debugging # # CONFIG_NET_DEV_REFCNT_TRACKER is not set # CONFIG_NET_NS_REFCNT_TRACKER is not set # CONFIG_DEBUG_NET is not set # end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_PAGE_REF is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_PTDUMP_DEBUGFS is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM_PGTABLE is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y CONFIG_HAVE_ARCH_KASAN_HW_TAGS=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_KASAN_SW_TAGS=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y # CONFIG_KFENCE is not set # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 # CONFIG_SOFTLOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # # CONFIG_SCHED_DEBUG is not set # CONFIG_SCHEDSTATS is not set # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_LATENCYTOP is not set CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACER_MAX_TRACE=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_RING_BUFFER_ALLOW_SWAP=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y CONFIG_BOOTTIME_TRACING=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y CONFIG_DYNAMIC_FTRACE=y CONFIG_DYNAMIC_FTRACE_WITH_REGS=y # CONFIG_FUNCTION_PROFILER is not set CONFIG_STACK_TRACER=y # CONFIG_IRQSOFF_TRACER is not set # CONFIG_SCHED_TRACER is not set # CONFIG_HWLAT_TRACER is not set # CONFIG_OSNOISE_TRACER is not set # CONFIG_TIMERLAT_TRACER is not set # CONFIG_FTRACE_SYSCALLS is not set CONFIG_TRACER_SNAPSHOT=y CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set CONFIG_BLK_DEV_IO_TRACE=y CONFIG_KPROBE_EVENTS=y # CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set # CONFIG_UPROBE_EVENTS is not set CONFIG_BPF_EVENTS=y CONFIG_DYNAMIC_EVENTS=y CONFIG_PROBE_EVENTS=y # CONFIG_BPF_KPROBE_OVERRIDE is not set CONFIG_FTRACE_MCOUNT_RECORD=y CONFIG_FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY=y # CONFIG_SYNTH_EVENTS is not set # CONFIG_HIST_TRIGGERS is not set # CONFIG_TRACE_EVENT_INJECT is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_TRACE_EVAL_MAP_FILE is not set # CONFIG_FTRACE_RECORD_RECURSION is not set # CONFIG_FTRACE_STARTUP_TEST is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set # CONFIG_PREEMPTIRQ_DELAY_TEST is not set # CONFIG_KPROBE_EVENT_GEN_TEST is not set # CONFIG_RV is not set # CONFIG_SAMPLES is not set CONFIG_STRICT_DEVMEM=y # CONFIG_IO_STRICT_DEVMEM is not set # # arm64 Debugging # # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_ARM64_RELOC_TEST is not set # CONFIG_CORESIGHT is not set # end of arm64 Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set CONFIG_FUNCTION_ERROR_INJECTION=y # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_RUNTIME_TESTING_MENU is not set CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage # # Rust hacking # # end of Rust hacking # end of Kernel hacking ================================================ FILE: projects/RPi/devices/RPi4/options ================================================ ################################################################################ # Device defaults ################################################################################ # NOOBS supported hex versions (legacy) is not relevant for RPi4 unset NOOBS_HEX # NOOBS supported model versions NOOBS_SUPPORTED_MODELS='"Pi 4"' # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) FIRMWARE="${FIRMWARE} rpi-eeprom" # set the addon project ADDON_PROJECT="ARMv8" # build 64bit kernel case $TARGET_ARCH in arm) TARGET_KERNEL_ARCH="arm64" TARGET_KERNEL_PATCH_ARCH="aarch64" ;; esac # Kernel target KERNEL_TARGET="Image" ================================================ FILE: projects/RPi/devices/RPi5/config/config.txt ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) ################################################################################ # Bootloader configuration # config.txt version v1 (do not remove or change this line!) ################################################################################ # For more options and information see # http://rpf.io/configtxt ################################################################################ # Don't send initial active source message. # Avoids bringing CEC (enabled TV) out of standby and channel switch when # rebooting. hdmi_ignore_cec_init=1 [all] ################################################################################ # Use distroconfig-composite.txt instead of distroconfig.txt to enable # composite video output. # The composite video mode needs to be configured in cmdline.txt: # For PAL add: video=Composite-1:720x576@50ie # For NTSC add: video=Composite-1:720x480@60ie ################################################################################ include distroconfig.txt #include distroconfig-composite.txt # uncomment to enable infrared remote receiver connected to GPIO 18 #dtoverlay=gpio-ir,gpio_pin=18 ================================================ FILE: projects/RPi/devices/RPi5/config/distroconfig-composite.txt ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2023-present Team LibreELEC (https://libreelec.tv) # WARNING: DO NOT EDIT THIS FILE - IT WILL BE OVERWRITTEN WHEN UPGRADING! arm_boost=1 arm_64bit=1 kernel=kernel.img display_auto_detect=1 enable_tvout=1 dtoverlay=vc4-kms-v3d,cma-512,composite=1 dtoverlay= disable_overscan=1 disable_fw_kms_setup=1 max_framebuffers=0 ================================================ FILE: projects/RPi/devices/RPi5/config/distroconfig.txt ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) # WARNING: DO NOT EDIT THIS FILE - IT WILL BE OVERWRITTEN WHEN UPGRADING! arm_boost=1 arm_64bit=1 kernel=kernel.img display_auto_detect=1 dtoverlay=vc4-kms-v3d,cma-512 dtoverlay= disable_overscan=1 disable_fw_kms_setup=1 max_framebuffers=0 ================================================ FILE: projects/RPi/devices/RPi5/kodi/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8" ?> <settings version="1"> <section id="system"> <category id="audio"> <group id="1"> <setting id="audiooutput.audiodevice"> <default>ALSA:hdmi:CARD=vc4hdmi0,DEV=0</default> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/RPi/devices/RPi5/linux/linux.aarch64.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm64 6.1.66 Kernel Configuration # CONFIG_CC_VERSION_TEXT="aarch64-linux-gnu-gcc (GCC) 13.0.0 20220604 (experimental) [master revision aec868578d8515763d75693c1fdfbc30ff0a1e68]" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=130000 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23850 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23850 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_SYSVIPC_COMPAT=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_IRQ_IPI=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_IRQ_MSI_IOMMU=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_CONTEXT_TRACKING=y CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y # CONFIG_BPF_JIT is not set # CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_BPF_PRELOAD is not set # end of BPF subsystem CONFIG_PREEMPT_VOLUNTARY_BUILD=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set # CONFIG_PREEMPT_DYNAMIC is not set # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_TASKSTATS is not set # CONFIG_PSI is not set # end of CPU/Task time and stats accounting CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_RUDE_RCU=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem CONFIG_IKCONFIG=m CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=17 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 # CONFIG_PRINTK_INDEX is not set CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # # end of Scheduler features CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_CC_HAS_INT128=y CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set CONFIG_CGROUP_PIDS=y # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y # CONFIG_CGROUP_MISC is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_TIME_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 # CONFIG_RD_GZIP is not set # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set # CONFIG_RD_LZ4 is not set # CONFIG_RD_ZSTD is not set CONFIG_INITRAMFS_COMPRESSION_NONE=y CONFIG_BOOT_CONFIG=y # CONFIG_BOOT_CONFIG_EMBED is not set CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_EXPERT=y CONFIG_UID16=y CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set # CONFIG_SYSFS_SYSCALL is not set CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y 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 # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y # CONFIG_PC104 is not set # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_SYSTEM_DATA_VERIFICATION=y CONFIG_PROFILING=y CONFIG_TRACEPOINTS=y # end of General setup CONFIG_ARM64=y CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_64BIT=y CONFIG_MMU=y CONFIG_ARM64_PAGE_SHIFT=12 CONFIG_ARM64_CONT_PTE_SHIFT=4 CONFIG_ARM64_CONT_PMD_SHIFT=4 CONFIG_ARCH_MMAP_RND_BITS_MIN=18 CONFIG_ARCH_MMAP_RND_BITS_MAX=24 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_STACKTRACE_SUPPORT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_LOCKDEP_SUPPORT=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CSUM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y CONFIG_SMP=y CONFIG_KERNEL_MODE_NEON=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_PGTABLE_LEVELS=3 CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_ARCH_PROC_KCORE_TEXT=y # # Platform selection # # CONFIG_ARCH_ACTIONS is not set # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_APPLE is not set CONFIG_ARCH_BCM=y CONFIG_ARCH_BCM2835=y # CONFIG_ARCH_BCM_IPROC is not set # CONFIG_ARCH_BCMBCA is not set CONFIG_ARCH_BRCMSTB=y # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_BITMAIN is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_SPARX5 is not set # CONFIG_ARCH_K3 is not set # CONFIG_ARCH_LG1K is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_KEEMBAY is not set # CONFIG_ARCH_MEDIATEK is not set # CONFIG_ARCH_MESON is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_NXP is not set # CONFIG_ARCH_NPCM is not set # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_REALTEK is not set # CONFIG_ARCH_RENESAS is not set # CONFIG_ARCH_ROCKCHIP is not set # CONFIG_ARCH_SEATTLE is not set # CONFIG_ARCH_INTEL_SOCFPGA is not set # CONFIG_ARCH_SYNQUACER is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_SPRD is not set # CONFIG_ARCH_THUNDER is not set # CONFIG_ARCH_THUNDER2 is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_VISCONTI is not set # CONFIG_ARCH_XGENE is not set # CONFIG_ARCH_ZYNQMP is not set # end of Platform selection # # Kernel Features # # # ARM errata workarounds via the alternatives framework # CONFIG_AMPERE_ERRATUM_AC03_CPU_38=y CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y CONFIG_ARM64_ERRATUM_826319=y CONFIG_ARM64_ERRATUM_827319=y CONFIG_ARM64_ERRATUM_824069=y CONFIG_ARM64_ERRATUM_819472=y CONFIG_ARM64_ERRATUM_832075=y CONFIG_ARM64_ERRATUM_1742098=y CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y CONFIG_ARM64_ERRATUM_1024718=y CONFIG_ARM64_ERRATUM_1418040=y CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y CONFIG_ARM64_ERRATUM_1165522=y CONFIG_ARM64_ERRATUM_1319367=y CONFIG_ARM64_ERRATUM_1530923=y CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y CONFIG_ARM64_ERRATUM_2441007=y CONFIG_ARM64_ERRATUM_1286807=y CONFIG_ARM64_ERRATUM_1463225=y CONFIG_ARM64_ERRATUM_1542419=y CONFIG_ARM64_ERRATUM_1508412=y CONFIG_ARM64_ERRATUM_2051678=y CONFIG_ARM64_ERRATUM_2077057=y CONFIG_ARM64_ERRATUM_2658417=y CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE=y CONFIG_ARM64_ERRATUM_2054223=y CONFIG_ARM64_ERRATUM_2067961=y CONFIG_ARM64_ERRATUM_2441009=y CONFIG_ARM64_ERRATUM_2457168=y CONFIG_ARM64_ERRATUM_2966298=y CONFIG_CAVIUM_ERRATUM_22375=y CONFIG_CAVIUM_ERRATUM_23154=y CONFIG_CAVIUM_ERRATUM_27456=y CONFIG_CAVIUM_ERRATUM_30115=y CONFIG_CAVIUM_TX2_ERRATUM_219=y CONFIG_FUJITSU_ERRATUM_010001=y CONFIG_HISILICON_ERRATUM_161600802=y CONFIG_QCOM_FALKOR_ERRATUM_1003=y CONFIG_QCOM_FALKOR_ERRATUM_1009=y CONFIG_QCOM_QDF2400_ERRATUM_0065=y CONFIG_QCOM_FALKOR_ERRATUM_E1041=y CONFIG_NVIDIA_CARMEL_CNP_ERRATUM=y CONFIG_SOCIONEXT_SYNQUACER_PREITS=y # end of ARM errata workarounds via the alternatives framework CONFIG_ARM64_4K_PAGES=y # CONFIG_ARM64_16K_PAGES is not set # CONFIG_ARM64_64K_PAGES is not set CONFIG_ARM64_VA_BITS_39=y # CONFIG_ARM64_VA_BITS_48 is not set CONFIG_ARM64_VA_BITS=39 CONFIG_ARM64_PA_BITS_48=y CONFIG_ARM64_PA_BITS=48 # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_CPU_LITTLE_ENDIAN=y # CONFIG_SCHED_MC is not set # CONFIG_SCHED_CLUSTER is not set # CONFIG_SCHED_SMT is not set CONFIG_NR_CPUS=256 # CONFIG_HOTPLUG_CPU is not set # CONFIG_NUMA is not set # CONFIG_HZ_100 is not set # CONFIG_HZ_250 is not set CONFIG_HZ_300=y # CONFIG_HZ_1000 is not set CONFIG_HZ=300 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_HW_PERF_EVENTS=y CONFIG_CC_HAVE_SHADOW_CALL_STACK=y # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_KEXEC_FILE is not set # CONFIG_CRASH_DUMP is not set # CONFIG_XEN is not set CONFIG_ARCH_FORCE_MAX_ORDER=11 CONFIG_UNMAP_KERNEL_AT_EL0=y CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y CONFIG_RODATA_FULL_DEFAULT_ENABLED=y # CONFIG_ARM64_SW_TTBR0_PAN is not set CONFIG_ARM64_TAGGED_ADDR_ABI=y CONFIG_COMPAT=y CONFIG_KUSER_HELPERS=y # CONFIG_COMPAT_ALIGNMENT_FIXUPS is not set CONFIG_ARMV8_DEPRECATED=y CONFIG_SWP_EMULATION=y CONFIG_CP15_BARRIER_EMULATION=y CONFIG_SETEND_EMULATION=y # # ARMv8.1 architectural features # CONFIG_ARM64_HW_AFDBM=y CONFIG_ARM64_PAN=y CONFIG_AS_HAS_LDAPR=y CONFIG_AS_HAS_LSE_ATOMICS=y CONFIG_ARM64_LSE_ATOMICS=y CONFIG_ARM64_USE_LSE_ATOMICS=y # end of ARMv8.1 architectural features # # ARMv8.2 architectural features # CONFIG_AS_HAS_ARMV8_2=y CONFIG_AS_HAS_SHA3=y # CONFIG_ARM64_PMEM is not set CONFIG_ARM64_RAS_EXTN=y CONFIG_ARM64_CNP=y # end of ARMv8.2 architectural features # # ARMv8.3 architectural features # CONFIG_ARM64_PTR_AUTH=y CONFIG_ARM64_PTR_AUTH_KERNEL=y CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y CONFIG_AS_HAS_PAC=y CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y # end of ARMv8.3 architectural features # # ARMv8.4 architectural features # CONFIG_ARM64_AMU_EXTN=y CONFIG_AS_HAS_ARMV8_4=y CONFIG_ARM64_TLB_RANGE=y # end of ARMv8.4 architectural features # # ARMv8.5 architectural features # CONFIG_AS_HAS_ARMV8_5=y CONFIG_ARM64_BTI=y CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y CONFIG_ARM64_E0PD=y CONFIG_ARM64_AS_HAS_MTE=y CONFIG_ARM64_MTE=y # end of ARMv8.5 architectural features # # ARMv8.7 architectural features # CONFIG_ARM64_EPAN=y # end of ARMv8.7 architectural features CONFIG_ARM64_SVE=y CONFIG_ARM64_SME=y CONFIG_ARM64_MODULE_PLTS=y # CONFIG_ARM64_PSEUDO_NMI is not set CONFIG_RELOCATABLE=y # CONFIG_RANDOMIZE_BASE is not set CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y CONFIG_STACKPROTECTOR_PER_TASK=y CONFIG_ARCH_NR_GPIO=0 # end of Kernel Features # # Boot options # CONFIG_CMDLINE="" CONFIG_EFI_STUB=y CONFIG_EFI=y CONFIG_DMI=y # end of Boot options # # Power management options # # CONFIG_SUSPEND is not set # CONFIG_HIBERNATION is not set CONFIG_PM=y # CONFIG_PM_DEBUG is not set CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y # end of Power management options # # CPU Power Management # # # CPU Idle # CONFIG_CPU_IDLE=y # CONFIG_CPU_IDLE_GOV_LADDER is not set CONFIG_CPU_IDLE_GOV_MENU=y # CONFIG_CPU_IDLE_GOV_TEO is not set # # ARM CPU Idle Drivers # # CONFIG_ARM_PSCI_CPUIDLE is not set # end of ARM CPU Idle Drivers # end of CPU Idle # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y # CONFIG_CPU_FREQ_GOV_USERSPACE is not set CONFIG_CPU_FREQ_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y CONFIG_CPUFREQ_DT_PLATDEV=y CONFIG_ARM_BRCMSTB_AVS_CPUFREQ=y CONFIG_ARM_RASPBERRYPI_CPUFREQ=y # end of CPU Frequency scaling # end of CPU Power Management CONFIG_ARCH_SUPPORTS_ACPI=y # CONFIG_ACPI is not set CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set # # General architecture-dependent options # CONFIG_ARCH_HAS_SUBPAGE_FAULTS=y CONFIG_KPROBES=y CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_KRETPROBES=y CONFIG_HAVE_IOREMAP_PROT=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_KEEPINITRD=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y CONFIG_MMU_GATHER_TABLE_FREE=y CONFIG_MMU_GATHER_RCU_TABLE_FREE=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y # CONFIG_SHADOW_CALL_STACK is not set CONFIG_ARCH_SUPPORTS_LTO_CLANG=y CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y CONFIG_LTO_NONE=y CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=18 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y CONFIG_RANDOMIZE_KSTACK_OFFSET=y # CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_COMPILER_H=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y CONFIG_ARCH_USE_MEMREMAP_PROT=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_HAS_RELR=y CONFIG_HAVE_PREEMPT_DYNAMIC=y CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_GZIP is not set # CONFIG_MODULE_COMPRESS_XZ is not set # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLOCK_LEGACY_AUTOLOAD=y CONFIG_BLK_CGROUP_RWSTAT=y CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_ICQ=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_DEV_THROTTLING_LOW is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_CGROUP_IOLATENCY is not set # CONFIG_BLK_CGROUP_IOCOST is not set # CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set CONFIG_LDM_PARTITION=y # CONFIG_LDM_DEBUG is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set # end of Partition Types CONFIG_BLOCK_COMPAT=y CONFIG_BLK_MQ_PCI=y CONFIG_BLK_PM=y CONFIG_BLOCK_HOLDER_DEPRECATED=y CONFIG_BLK_MQ_STACKING=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y CONFIG_IOSCHED_BFQ=y # CONFIG_BFQ_GROUP_IOSCHED is not set # end of IO Schedulers CONFIG_ASN1=y CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y CONFIG_ARCH_INLINE_SPIN_LOCK=y CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_SPIN_UNLOCK=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y CONFIG_ARCH_INLINE_READ_LOCK=y CONFIG_ARCH_INLINE_READ_LOCK_BH=y CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_READ_UNLOCK=y CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y CONFIG_ARCH_INLINE_WRITE_LOCK=y CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_WRITE_UNLOCK=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y CONFIG_INLINE_SPIN_TRYLOCK=y CONFIG_INLINE_SPIN_TRYLOCK_BH=y CONFIG_INLINE_SPIN_LOCK=y CONFIG_INLINE_SPIN_LOCK_BH=y CONFIG_INLINE_SPIN_LOCK_IRQ=y CONFIG_INLINE_SPIN_LOCK_IRQSAVE=y CONFIG_INLINE_SPIN_UNLOCK_BH=y CONFIG_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE=y CONFIG_INLINE_READ_LOCK=y CONFIG_INLINE_READ_LOCK_BH=y CONFIG_INLINE_READ_LOCK_IRQ=y CONFIG_INLINE_READ_LOCK_IRQSAVE=y CONFIG_INLINE_READ_UNLOCK=y CONFIG_INLINE_READ_UNLOCK_BH=y CONFIG_INLINE_READ_UNLOCK_IRQ=y CONFIG_INLINE_READ_UNLOCK_IRQRESTORE=y CONFIG_INLINE_WRITE_LOCK=y CONFIG_INLINE_WRITE_LOCK_BH=y CONFIG_INLINE_WRITE_LOCK_IRQ=y CONFIG_INLINE_WRITE_LOCK_IRQSAVE=y CONFIG_INLINE_WRITE_UNLOCK=y CONFIG_INLINE_WRITE_UNLOCK_BH=y CONFIG_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y CONFIG_QUEUED_SPINLOCKS=y CONFIG_ARCH_USE_QUEUED_RWLOCKS=y CONFIG_QUEUED_RWLOCKS=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ARCH_BINFMT_ELF_STATE=y CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y CONFIG_ARCH_HAVE_ELF_PROT=y CONFIG_ARCH_USE_GNU_PROPERTY=y CONFIG_ELFCORE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # CONFIG_SWAP=y # CONFIG_ZSWAP is not set # # SLAB allocator options # # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y # end of SLAB allocator options # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set # CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y CONFIG_ARCH_KEEP_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_COMPACTION=y CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 # CONFIG_PAGE_REPORTING is not set CONFIG_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_PHYS_ADDR_T_64BIT=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set CONFIG_ARCH_WANTS_THP_SWAP=y # CONFIG_TRANSPARENT_HUGEPAGE is not set CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set CONFIG_CMA_DEBUGFS=y # CONFIG_CMA_SYSFS is not set CONFIG_CMA_AREAS=7 CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y CONFIG_ARCH_HAS_ZONE_DMA_SET=y CONFIG_ZONE_DMA=y CONFIG_ZONE_DMA32=y CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y # CONFIG_ANON_VMA_NAME is not set # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set CONFIG_LOCK_MM_AND_FIND_VMA=y # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y CONFIG_NET_EGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_INTERFACE is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_ESP=y # CONFIG_NET_KEY is not set # CONFIG_XDP_SOCKETS is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=m CONFIG_IP_MROUTE_COMMON=y CONFIG_IP_MROUTE=y # CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set # CONFIG_IP_PIMSM_V1 is not set # CONFIG_IP_PIMSM_V2 is not set # CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set CONFIG_INET_ESP=y # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=m # CONFIG_INET_DIAG is not set CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set CONFIG_TCP_CONG_CUBIC=y # CONFIG_TCP_CONG_WESTWOOD is not set CONFIG_TCP_CONG_HTCP=m CONFIG_TCP_CONG_HSTCP=m # CONFIG_TCP_CONG_HYBLA is not set CONFIG_TCP_CONG_VEGAS=m # CONFIG_TCP_CONG_NV is not set CONFIG_TCP_CONG_SCALABLE=m # CONFIG_TCP_CONG_LP is not set CONFIG_TCP_CONG_VENO=m CONFIG_TCP_CONG_YEAH=m CONFIG_TCP_CONG_ILLINOIS=m # CONFIG_TCP_CONG_DCTCP is not set CONFIG_TCP_CONG_CDG=m # CONFIG_TCP_CONG_BBR is not set CONFIG_DEFAULT_CUBIC=y # CONFIG_DEFAULT_RENO is not set CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_IPV6_VTI is not set CONFIG_IPV6_SIT=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set CONFIG_IPV6_FOU=m # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set # CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # # CONFIG_NETFILTER_INGRESS is not set CONFIG_NETFILTER_EGRESS=y CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_FAMILY_BRIDGE=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set CONFIG_NETFILTER_NETLINK_LOG=m # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=m # CONFIG_NF_LOG_SYSLOG is not set # CONFIG_NF_CONNTRACK_MARK is not set # CONFIG_NF_CONNTRACK_ZONES is not set # CONFIG_NF_CONNTRACK_PROCFS is not set # CONFIG_NF_CONNTRACK_EVENTS is not set # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set # CONFIG_NF_CT_PROTO_DCCP is not set # CONFIG_NF_CT_PROTO_SCTP is not set # CONFIG_NF_CT_PROTO_UDPLITE is not set # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set CONFIG_NF_CONNTRACK_IRC=m CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set CONFIG_NF_CONNTRACK_SIP=m CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m # CONFIG_NETFILTER_NETLINK_GLUE_CT is not set CONFIG_NF_NAT=m CONFIG_NF_NAT_FTP=m CONFIG_NF_NAT_IRC=m CONFIG_NF_NAT_SIP=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 CONFIG_NETFILTER_XTABLES_COMPAT=y # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set CONFIG_NETFILTER_XT_MATCH_IPRANGE=m CONFIG_NETFILTER_XT_MATCH_IPVS=m # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set CONFIG_NETFILTER_XT_MATCH_OWNER=m # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set CONFIG_NETFILTER_XT_MATCH_STATE=m # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set CONFIG_IP_VS=m # CONFIG_IP_VS_IPV6 is not set # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # CONFIG_IP_VS_PROTO_ESP is not set # CONFIG_IP_VS_PROTO_AH is not set # CONFIG_IP_VS_PROTO_SCTP is not set # # IPVS scheduler # CONFIG_IP_VS_RR=m # CONFIG_IP_VS_WRR is not set # CONFIG_IP_VS_LC is not set # CONFIG_IP_VS_WLC is not set # CONFIG_IP_VS_FO is not set # CONFIG_IP_VS_OVF is not set # CONFIG_IP_VS_LBLC is not set # CONFIG_IP_VS_LBLCR is not set # CONFIG_IP_VS_DH is not set # CONFIG_IP_VS_SH is not set # CONFIG_IP_VS_MH is not set # CONFIG_IP_VS_SED is not set # CONFIG_IP_VS_NQ is not set # CONFIG_IP_VS_TWOS is not set # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS MH scheduler # CONFIG_IP_VS_MH_TAB_INDEX=12 # # IPVS application helper # # CONFIG_IP_VS_FTP is not set CONFIG_IP_VS_NFCT=y # CONFIG_IP_VS_PE_SIP is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set CONFIG_NF_REJECT_IPV4=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_ARPTABLES is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m # CONFIG_NF_LOG_IPV6 is not set CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_MATCH_SRH is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m # CONFIG_IP6_NF_TARGET_NPT is not set # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_CONNTRACK_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y # CONFIG_BRIDGE_MRP is not set # CONFIG_BRIDGE_CFM is not set # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set CONFIG_NET_SCH_FQ_CODEL=y # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set # CONFIG_NET_SCH_DEFAULT is not set # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_FLOW is not set CONFIG_NET_CLS_CGROUP=m # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set CONFIG_NET_L3_MASTER_DEV=y # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_STREAM_PARSER is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # end of Network testing # end of Networking options # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=m CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y # CONFIG_BT_BNEP is not set CONFIG_BT_HIDP=m CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_LEDS is not set # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set # CONFIG_BT_DEBUGFS is not set # CONFIG_BT_SELFTEST is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_MTK=m CONFIG_BT_HCIBTUSB=m # CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set CONFIG_BT_HCIBTUSB_BCM=y CONFIG_BT_HCIBTUSB_MTK=y CONFIG_BT_HCIBTUSB_RTL=y # CONFIG_BT_HCIBTSDIO is not set 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 is not set # CONFIG_BT_HCIUART_ATH3K is not set # CONFIG_BT_HCIUART_LL is not set CONFIG_BT_HCIUART_3WIRE=y # CONFIG_BT_HCIUART_INTEL is not set CONFIG_BT_HCIUART_BCM=y # CONFIG_BT_HCIUART_RTL is not set # CONFIG_BT_HCIUART_QCA is not set # CONFIG_BT_HCIUART_AG6XX is not set # CONFIG_BT_HCIUART_MRVL is not set CONFIG_BT_HCIBCM203X=m # CONFIG_BT_HCIBPA10X is not set CONFIG_BT_HCIBFUSB=m # CONFIG_BT_HCIVHCI is not set # CONFIG_BT_MRVL is not set CONFIG_BT_ATH3K=m # CONFIG_BT_MTKSDIO is not set # CONFIG_BT_MTKUART is not set # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set # CONFIG_CFG80211_CRDA_SUPPORT is not set CONFIG_CFG80211_WEXT=y CONFIG_LIB80211=m CONFIG_LIB80211_CRYPT_WEP=m CONFIG_LIB80211_CRYPT_CCMP=m # CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=m CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_PAGE_POOL=y # CONFIG_PAGE_POOL_STATS is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y # # Device Drivers # CONFIG_ARM_AMBA=y CONFIG_HAVE_PCI=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y CONFIG_PCI_DOMAINS_GENERIC=y CONFIG_PCI_SYSCALL=y CONFIG_PCIEPORTBUS=y CONFIG_PCIEAER=y # CONFIG_PCIEAER_INJECT is not set # CONFIG_PCIE_ECRC is not set CONFIG_PCIEASPM=y # CONFIG_PCIEASPM_DEFAULT is not set CONFIG_PCIEASPM_POWERSAVE=y # CONFIG_PCIEASPM_POWER_SUPERSAVE is not set # CONFIG_PCIEASPM_PERFORMANCE is not set CONFIG_PCIE_PME=y CONFIG_PCIE_DPC=y # CONFIG_PCIE_PTM is not set CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y CONFIG_PCI_QUIRKS=y # CONFIG_PCI_DEBUG is not set # CONFIG_PCI_STUB is not set # CONFIG_PCI_IOV is not set # CONFIG_PCI_PRI is not set # CONFIG_PCI_PASID is not set CONFIG_PCI_LABEL=y # CONFIG_PCIE_BUS_TUNE_OFF is not set CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set CONFIG_VGA_ARB=y CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # # PCI controller drivers # # CONFIG_PCI_FTPCI100 is not set # CONFIG_PCI_HOST_GENERIC is not set # CONFIG_PCIE_XILINX is not set # CONFIG_PCI_XGENE is not set # CONFIG_PCIE_ALTERA is not set # CONFIG_PCI_HOST_THUNDER_PEM is not set # CONFIG_PCI_HOST_THUNDER_ECAM is not set CONFIG_PCIE_BRCMSTB=y # CONFIG_PCIE_MICROCHIP_HOST is not set # # DesignWare PCI Core Support # # CONFIG_PCIE_DW_PLAT_HOST is not set # CONFIG_PCI_HISI is not set # CONFIG_PCIE_KIRIN is not set # CONFIG_PCI_MESON is not set # CONFIG_PCIE_AL is not set # end of DesignWare PCI Core Support # # Mobiveil PCIe Core Support # # end of Mobiveil PCIe Core Support # # Cadence PCIe controllers support # # CONFIG_PCIE_CADENCE_PLAT_HOST is not set # CONFIG_PCI_J721E_HOST is not set # end of Cadence PCIe controllers support # end of PCI controller drivers # # PCI Endpoint # # CONFIG_PCI_ENDPOINT is not set # end of PCI Endpoint # # PCI switch controller drivers # # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers # CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set # # Generic Driver Options # # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y # CONFIG_DEVTMPFS_SAFE is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set # CONFIG_FW_UPLOAD is not set # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y # CONFIG_ALLOW_DEV_COREDUMP is not set # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_SOC_BUS=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set CONFIG_GENERIC_ARCH_TOPOLOGY=y # end of Generic Driver Options # # Bus devices # # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_MOXTET is not set # CONFIG_VEXPRESS_CONFIG is not set # CONFIG_MHI_BUS is not set # CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # # CONFIG_ARM_SCMI_PROTOCOL is not set # end of ARM System Control and Management Interface Protocol # CONFIG_ARM_SCPI_PROTOCOL is not set # CONFIG_FIRMWARE_MEMMAP is not set CONFIG_DMIID=y # CONFIG_DMI_SYSFS is not set CONFIG_RASPBERRYPI_FIRMWARE=y # CONFIG_FW_CFG_SYSFS is not set # CONFIG_SYSFB_SIMPLEFB is not set # CONFIG_ARM_FFA_TRANSPORT is not set CONFIG_CS_DSP=m # CONFIG_GOOGLE_FIRMWARE is not set # # EFI (Extensible Firmware Interface) Support # CONFIG_EFI_ESRT=y # CONFIG_EFI_VARS_PSTORE is not set CONFIG_EFI_PARAMS_FROM_FDT=y CONFIG_EFI_RUNTIME_WRAPPERS=y CONFIG_EFI_GENERIC_STUB=y # CONFIG_EFI_ZBOOT is not set CONFIG_EFI_ARMSTUB_DTB_LOADER=y CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y # CONFIG_EFI_BOOTLOADER_CONTROL is not set # CONFIG_EFI_CAPSULE_LOADER is not set # CONFIG_EFI_TEST is not set # CONFIG_RESET_ATTACK_MITIGATION is not set # CONFIG_EFI_DISABLE_PCI_DMA is not set CONFIG_EFI_EARLYCON=y # CONFIG_EFI_DISABLE_RUNTIME is not set # CONFIG_EFI_COCO_SECRET is not set # end of EFI (Extensible Firmware Interface) Support CONFIG_ARM_PSCI_FW=y CONFIG_HAVE_ARM_SMCCC=y CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y CONFIG_ARM_SMCCC_SOC_ID=y # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set # CONFIG_MTD is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_DYNAMIC=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_RESERVED_MEM=y CONFIG_OF_RESOLVE=y CONFIG_OF_OVERLAY=y CONFIG_OF_CONFIGFS=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set # CONFIG_ZRAM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=0 # CONFIG_BLK_DEV_DRBD is not set CONFIG_BLK_DEV_NBD=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=4096 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_UBLK is not set # # NVME Support # CONFIG_NVME_CORE=y CONFIG_BLK_DEV_NVME=y # CONFIG_NVME_MULTIPATH is not set # CONFIG_NVME_VERBOSE_ERRORS is not set # CONFIG_NVME_HWMON is not set # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set # CONFIG_NVME_AUTH is not set # CONFIG_NVME_TARGET is not set # end of NVME Support # # Misc devices # CONFIG_BCM2835_SMI=m # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_PHANTOM is not set # CONFIG_TIFM_CORE is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HP_ILO is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set # CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set CONFIG_MISC_RTSX=y # CONFIG_HISI_HIKEY_USB is not set # CONFIG_OPEN_DICE is not set # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # CONFIG_CB710_CORE is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set # CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set CONFIG_MISC_RTSX_USB=y # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set # CONFIG_PVPANIC is not set # CONFIG_GP_PCI1XXXX is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=m CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_SCAN_ASYNC is not set # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set CONFIG_SCSI_ISCSI_ATTRS=y # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports CONFIG_SCSI_LOWLEVEL=y CONFIG_ISCSI_TCP=y CONFIG_ISCSI_BOOT_SYSFS=y # CONFIG_SCSI_CXGB3_ISCSI is not set # CONFIG_SCSI_CXGB4_ISCSI is not set # CONFIG_SCSI_BNX2_ISCSI is not set # CONFIG_BE2ISCSI is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_HPSA is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_3W_SAS is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set # CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set # CONFIG_SCSI_MPI3MR is not set # CONFIG_SCSI_SMARTPQI is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_MYRB is not set # CONFIG_SCSI_MYRS is not set # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FDOMAIN_PCI is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_STEX is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLA_ISCSI is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_AM53C974 is not set # CONFIG_SCSI_WD719X is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_PMCRAID is not set # CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_DH is not set # end of SCSI device support # CONFIG_ATA is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=m # CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m # CONFIG_DM_UNSTRIPED is not set # CONFIG_DM_CRYPT is not set # CONFIG_DM_SNAPSHOT is not set CONFIG_DM_THIN_PROVISIONING=m # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_EBS is not set # CONFIG_DM_ERA is not set # CONFIG_DM_CLONE is not set # CONFIG_DM_MIRROR is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_DUST is not set # CONFIG_DM_UEVENT is not set # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_DM_INTEGRITY is not set # CONFIG_TARGET_CORE is not set # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # # CONFIG_FIREWIRE is not set # CONFIG_FIREWIRE_NOSY is not set # end of IEEE 1394 (FireWire) support CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set CONFIG_DUMMY=m CONFIG_WIREGUARD=m # CONFIG_WIREGUARD_DEBUG is not set # CONFIG_EQUALIZER is not set # CONFIG_NET_FC is not set # 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 # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_AMT is not set # CONFIG_MACSEC is not set CONFIG_NETCONSOLE=y CONFIG_NETCONSOLE_DYNAMIC=y CONFIG_NETPOLL=y CONFIG_NET_POLL_CONTROLLER=y CONFIG_TUN=y # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m CONFIG_NLMON=m # CONFIG_ARCNET is not set CONFIG_ETHERNET=y CONFIG_NET_VENDOR_3COM=y # CONFIG_VORTEX is not set # CONFIG_TYPHOON is not set CONFIG_NET_VENDOR_ADAPTEC=y # CONFIG_ADAPTEC_STARFIRE is not set CONFIG_NET_VENDOR_AGERE=y # CONFIG_ET131X is not set CONFIG_NET_VENDOR_ALACRITECH=y # CONFIG_SLICOSS is not set CONFIG_NET_VENDOR_ALTEON=y # CONFIG_ACENIC is not set # CONFIG_ALTERA_TSE is not set CONFIG_NET_VENDOR_AMAZON=y # CONFIG_ENA_ETHERNET is not set CONFIG_NET_VENDOR_AMD=y # CONFIG_AMD8111_ETH is not set # CONFIG_PCNET32 is not set # CONFIG_AMD_XGBE is not set CONFIG_NET_VENDOR_AQUANTIA=y # CONFIG_AQTION is not set CONFIG_NET_VENDOR_ARC=y CONFIG_NET_VENDOR_ASIX=y # CONFIG_SPI_AX88796C is not set CONFIG_NET_VENDOR_ATHEROS=y # CONFIG_ATL2 is not set # CONFIG_ATL1 is not set # CONFIG_ATL1E is not set # CONFIG_ATL1C is not set # CONFIG_ALX is not set CONFIG_NET_VENDOR_BROADCOM=y # CONFIG_B44 is not set CONFIG_BCMGENET=y # CONFIG_BNX2 is not set # CONFIG_CNIC is not set # CONFIG_TIGON3 is not set # CONFIG_BNX2X is not set # CONFIG_SYSTEMPORT is not set # CONFIG_BNXT is not set CONFIG_NET_VENDOR_CADENCE=y CONFIG_MACB=y # CONFIG_MACB_PCI is not set CONFIG_NET_VENDOR_CAVIUM=y # CONFIG_THUNDER_NIC_PF is not set # CONFIG_THUNDER_NIC_VF is not set # CONFIG_THUNDER_NIC_BGX is not set # CONFIG_THUNDER_NIC_RGX is not set # CONFIG_LIQUIDIO is not set # CONFIG_LIQUIDIO_VF is not set CONFIG_NET_VENDOR_CHELSIO=y # CONFIG_CHELSIO_T1 is not set # CONFIG_CHELSIO_T3 is not set # CONFIG_CHELSIO_T4 is not set # CONFIG_CHELSIO_T4VF is not set CONFIG_NET_VENDOR_CISCO=y # CONFIG_ENIC is not set CONFIG_NET_VENDOR_CORTINA=y # CONFIG_GEMINI_ETHERNET is not set CONFIG_NET_VENDOR_DAVICOM=y # CONFIG_DM9051 is not set # CONFIG_DNET is not set CONFIG_NET_VENDOR_DEC=y # CONFIG_NET_TULIP is not set CONFIG_NET_VENDOR_DLINK=y # CONFIG_DL2K is not set # CONFIG_SUNDANCE is not set CONFIG_NET_VENDOR_EMULEX=y # CONFIG_BE2NET is not set CONFIG_NET_VENDOR_ENGLEDER=y # CONFIG_TSNEP is not set CONFIG_NET_VENDOR_EZCHIP=y # CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set CONFIG_NET_VENDOR_FUNGIBLE=y # CONFIG_FUN_ETH is not set CONFIG_NET_VENDOR_GOOGLE=y # CONFIG_GVE is not set CONFIG_NET_VENDOR_HISILICON=y # CONFIG_HIX5HD2_GMAC is not set # CONFIG_HISI_FEMAC is not set # CONFIG_HIP04_ETH is not set # CONFIG_HNS_DSAF is not set # CONFIG_HNS_ENET is not set # CONFIG_HNS3 is not set CONFIG_NET_VENDOR_HUAWEI=y # CONFIG_HINIC is not set CONFIG_NET_VENDOR_I825XX=y CONFIG_NET_VENDOR_INTEL=y # CONFIG_E100 is not set # CONFIG_E1000 is not set # CONFIG_E1000E is not set # CONFIG_IGB is not set # CONFIG_IGBVF is not set # CONFIG_IXGB is not set # CONFIG_IXGBE is not set # CONFIG_IXGBEVF is not set # CONFIG_I40E is not set # CONFIG_I40EVF is not set # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set CONFIG_NET_VENDOR_WANGXUN=y # CONFIG_NGBE is not set # CONFIG_TXGBE is not set # CONFIG_JME is not set CONFIG_NET_VENDOR_ADI=y CONFIG_NET_VENDOR_LITEX=y # CONFIG_LITEX_LITEETH is not set CONFIG_NET_VENDOR_MARVELL=y # CONFIG_MVMDIO is not set # CONFIG_SKGE is not set # CONFIG_SKY2 is not set # CONFIG_OCTEONTX2_AF is not set # CONFIG_OCTEONTX2_PF is not set # CONFIG_OCTEON_EP is not set CONFIG_NET_VENDOR_MELLANOX=y # CONFIG_MLX4_EN is not set # CONFIG_MLX5_CORE is not set # CONFIG_MLXSW_CORE is not set # CONFIG_MLXFW is not set CONFIG_NET_VENDOR_MICREL=y # CONFIG_KS8842 is not set # CONFIG_KS8851 is not set # CONFIG_KS8851_MLL is not set # CONFIG_KSZ884X_PCI is not set CONFIG_NET_VENDOR_MICROCHIP=y # CONFIG_ENC28J60 is not set # CONFIG_ENCX24J600 is not set # CONFIG_LAN743X is not set CONFIG_NET_VENDOR_MICROSEMI=y CONFIG_NET_VENDOR_MICROSOFT=y CONFIG_NET_VENDOR_MYRI=y # CONFIG_MYRI10GE is not set # CONFIG_FEALNX is not set CONFIG_NET_VENDOR_NI=y # CONFIG_NI_XGE_MANAGEMENT_ENET is not set CONFIG_NET_VENDOR_NATSEMI=y # CONFIG_NATSEMI is not set # CONFIG_NS83820 is not set CONFIG_NET_VENDOR_NETERION=y # CONFIG_S2IO is not set CONFIG_NET_VENDOR_NETRONOME=y # CONFIG_NFP is not set CONFIG_NET_VENDOR_8390=y # CONFIG_NE2K_PCI is not set CONFIG_NET_VENDOR_NVIDIA=y # CONFIG_FORCEDETH is not set CONFIG_NET_VENDOR_OKI=y # CONFIG_ETHOC is not set CONFIG_NET_VENDOR_PACKET_ENGINES=y # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_NET_VENDOR_PENSANDO is not set CONFIG_NET_VENDOR_QLOGIC=y # CONFIG_QLA3XXX is not set # CONFIG_QLCNIC is not set # CONFIG_NETXEN_NIC is not set # CONFIG_QED is not set CONFIG_NET_VENDOR_BROCADE=y # CONFIG_BNA 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_RDC=y # CONFIG_R6040 is not set CONFIG_NET_VENDOR_REALTEK=y # CONFIG_8139CP is not set # CONFIG_8139TOO is not set # CONFIG_R8169 is not set CONFIG_NET_VENDOR_RENESAS=y CONFIG_NET_VENDOR_ROCKER=y CONFIG_NET_VENDOR_SAMSUNG=y # CONFIG_SXGBE_ETH is not set CONFIG_NET_VENDOR_SEEQ=y CONFIG_NET_VENDOR_SILAN=y # CONFIG_SC92031 is not set CONFIG_NET_VENDOR_SIS=y # CONFIG_SIS900 is not set # CONFIG_SIS190 is not set CONFIG_NET_VENDOR_SOLARFLARE=y # CONFIG_SFC is not set # CONFIG_SFC_FALCON is not set CONFIG_NET_VENDOR_SMSC=y # CONFIG_SMC91X is not set # CONFIG_EPIC100 is not set # CONFIG_SMSC911X is not set # CONFIG_SMSC9420 is not set CONFIG_NET_VENDOR_SOCIONEXT=y CONFIG_NET_VENDOR_STMICRO=y # CONFIG_STMMAC_ETH is not set CONFIG_NET_VENDOR_SUN=y # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set # CONFIG_CASSINI is not set # CONFIG_NIU is not set CONFIG_NET_VENDOR_SYNOPSYS=y # CONFIG_DWC_XLGMAC is not set CONFIG_NET_VENDOR_TEHUTI=y # CONFIG_TEHUTI is not set CONFIG_NET_VENDOR_TI=y # CONFIG_TI_CPSW_PHY_SEL is not set # CONFIG_TLAN is not set CONFIG_NET_VENDOR_VERTEXCOM=y # CONFIG_MSE102X is not set CONFIG_NET_VENDOR_VIA=y # CONFIG_VIA_RHINE is not set # CONFIG_VIA_VELOCITY is not set CONFIG_NET_VENDOR_WIZNET=y # CONFIG_WIZNET_W5100 is not set # CONFIG_WIZNET_W5300 is not set CONFIG_NET_VENDOR_XILINX=y # CONFIG_XILINX_EMACLITE is not set # CONFIG_XILINX_AXI_EMAC is not set # CONFIG_XILINX_LL_TEMAC is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set CONFIG_PHYLINK=y CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_SFP is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_ADIN_PHY is not set # CONFIG_ADIN1100_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=m CONFIG_BROADCOM_PHY=y # CONFIG_BCM54140_PHY is not set CONFIG_BCM7XXX_PHY=y # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set CONFIG_BCM_NET_PHYLIB=y # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set # CONFIG_MAXLINEAR_GPHY is not set # CONFIG_MEDIATEK_GE_PHY is not set CONFIG_MICREL_PHY=y CONFIG_MICROCHIP_PHY=y # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set # CONFIG_MOTORCOMM_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_QSEMI_PHY is not set # CONFIG_REALTEK_PHY is not set # CONFIG_RENESAS_PHY is not set # CONFIG_ROCKCHIP_PHY is not set CONFIG_SMSC_PHY=y # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_DP83TD510_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set # CONFIG_PSE_CONTROLLER is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_OF_MDIO=y CONFIG_MDIO_DEVRES=y # CONFIG_MDIO_BITBANG is not set CONFIG_MDIO_BCM_UNIMAC=y # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_OCTEON is not set # CONFIG_MDIO_IPQ4019 is not set # CONFIG_MDIO_IPQ8064 is not set # CONFIG_MDIO_THUNDER is not set # # MDIO Multiplexers # # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # # PCS device drivers # # end of PCS device drivers CONFIG_PPP=m CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set CONFIG_PPP_MPPE=m # CONFIG_PPP_MULTILINK is not set CONFIG_PPPOE=m CONFIG_PPP_ASYNC=m # CONFIG_PPP_SYNC_TTY is not set # CONFIG_SLIP is not set CONFIG_SLHC=m CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set # CONFIG_USB_RTL8150 is not set CONFIG_USB_RTL8152=m CONFIG_USB_LAN78XX=y CONFIG_USB_USBNET=y CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m # CONFIG_USB_NET_CDC_EEM is not set # CONFIG_USB_NET_CDC_NCM is not set # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set CONFIG_USB_NET_DM9601=y # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=y # CONFIG_USB_NET_GL620A is not set # CONFIG_USB_NET_NET1080 is not set # CONFIG_USB_NET_PLUSB is not set CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m # CONFIG_USB_NET_CDC_SUBSET is not set # CONFIG_USB_NET_ZAURUS is not set # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set CONFIG_USB_HSO=m # CONFIG_USB_NET_INT51X1 is not set CONFIG_USB_IPHETH=m # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y # CONFIG_ADM8211 is not set CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set # CONFIG_ATH5K is not set # CONFIG_ATH5K_PCI is not set CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m CONFIG_ATH9K_PCI=y CONFIG_ATH9K_AHB=y # CONFIG_ATH9K_DEBUGFS is not set # CONFIG_ATH9K_DYNACK is not set # CONFIG_ATH9K_WOW is not set CONFIG_ATH9K_RFKILL=y CONFIG_ATH9K_CHANNEL_CONTEXT=y CONFIG_ATH9K_PCOEM=y # CONFIG_ATH9K_PCI_NO_EEPROM is not set CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_ATH9K_HWRNG=y CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y CONFIG_CARL9170_HWRNG=y CONFIG_ATH6KL=m # CONFIG_ATH6KL_SDIO is not set CONFIG_ATH6KL_USB=m # CONFIG_ATH6KL_DEBUG is not set # CONFIG_ATH6KL_TRACING is not set CONFIG_AR5523=m # CONFIG_WIL6210 is not set # CONFIG_ATH10K is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set CONFIG_WLAN_VENDOR_ATMEL=y # CONFIG_ATMEL is not set # CONFIG_AT76C50X_USB is not set CONFIG_WLAN_VENDOR_BROADCOM=y CONFIG_B43=m CONFIG_B43_BCMA=y CONFIG_B43_SSB=y CONFIG_B43_BUSES_BCMA_AND_SSB=y # CONFIG_B43_BUSES_BCMA is not set # CONFIG_B43_BUSES_SSB is not set CONFIG_B43_PCI_AUTOSELECT=y CONFIG_B43_PCICORE_AUTOSELECT=y # CONFIG_B43_SDIO is not set CONFIG_B43_BCMA_PIO=y CONFIG_B43_PIO=y CONFIG_B43_PHY_G=y CONFIG_B43_PHY_N=y CONFIG_B43_PHY_LP=y CONFIG_B43_PHY_HT=y CONFIG_B43_LEDS=y CONFIG_B43_HWRNG=y # CONFIG_B43_DEBUG is not set # CONFIG_B43LEGACY is not set CONFIG_BRCMUTIL=m # CONFIG_BRCMSMAC is not set CONFIG_BRCMFMAC=m CONFIG_BRCMFMAC_PROTO_BCDC=y CONFIG_BRCMFMAC_SDIO=y CONFIG_BRCMFMAC_USB=y # CONFIG_BRCMFMAC_PCIE is not set # CONFIG_BRCM_TRACING is not set CONFIG_BRCMDBG=y CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y # CONFIG_IPW2100 is not set # CONFIG_IPW2200 is not set # CONFIG_IWL4965 is not set # CONFIG_IWL3945 is not set # CONFIG_IWLWIFI is not set CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_HOSTAP is not set # CONFIG_HERMES is not set CONFIG_P54_COMMON=m CONFIG_P54_USB=m # CONFIG_P54_PCI is not set # CONFIG_P54_SPI is not set CONFIG_P54_LEDS=y CONFIG_WLAN_VENDOR_MARVELL=y # CONFIG_LIBERTAS is not set # CONFIG_LIBERTAS_THINFIRM is not set # CONFIG_MWIFIEX is not set # CONFIG_MWL8K is not set CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m CONFIG_MT76_CORE=m CONFIG_MT76_LEDS=y CONFIG_MT76_USB=m CONFIG_MT76x02_LIB=m CONFIG_MT76x02_USB=m CONFIG_MT76_CONNAC_LIB=m CONFIG_MT76x0_COMMON=m CONFIG_MT76x0U=m # CONFIG_MT76x0E is not set CONFIG_MT76x2_COMMON=m # CONFIG_MT76x2E is not set CONFIG_MT76x2U=m # CONFIG_MT7603E is not set CONFIG_MT7615_COMMON=m # CONFIG_MT7615E is not set CONFIG_MT7663_USB_SDIO_COMMON=m CONFIG_MT7663U=m # CONFIG_MT7663S is not set # CONFIG_MT7915E is not set # CONFIG_MT7921E is not set # CONFIG_MT7921S is not set # CONFIG_MT7921U is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set CONFIG_WLAN_VENDOR_PURELIFI=y # CONFIG_PLFXLC is not set CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m # CONFIG_RT2400PCI is not set # CONFIG_RT2500PCI is not set # CONFIG_RT61PCI is not set # CONFIG_RT2800PCI is not set CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WLAN_VENDOR_REALTEK=y # CONFIG_RTL8180 is not set CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y CONFIG_RTL_CARDS=m # CONFIG_RTL8192CE is not set # CONFIG_RTL8192SE is not set # CONFIG_RTL8192DE is not set # CONFIG_RTL8723AE is not set # CONFIG_RTL8723BE is not set # CONFIG_RTL8188EE is not set # CONFIG_RTL8192EE is not set # CONFIG_RTL8821AE is not set # CONFIG_RTL8192CU is not set CONFIG_RTL8XXXU=m CONFIG_RTL8XXXU_UNTESTED=y CONFIG_RTW88=m # CONFIG_RTW88_8822BE is not set # CONFIG_RTW88_8822CE is not set # CONFIG_RTW88_8723DE is not set # CONFIG_RTW88_8821CE is not set # CONFIG_RTW89 is not set CONFIG_WLAN_VENDOR_RSI=y # CONFIG_RSI_91X is not set CONFIG_WLAN_VENDOR_SILABS=y # CONFIG_WFX is not set CONFIG_WLAN_VENDOR_ST=y # CONFIG_CW1200 is not set CONFIG_WLAN_VENDOR_TI=y # CONFIG_WL1251 is not set # CONFIG_WL12XX is not set # CONFIG_WL18XX is not set # CONFIG_WLCORE is not set CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_USB_ZD1201=m CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set # CONFIG_WLAN_VENDOR_QUANTENNA is not set # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN # CONFIG_VMXNET3 is not set # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y # CONFIG_INPUT_MOUSEDEV_PSAUX is not set CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set # CONFIG_KEYBOARD_ATKBD is not set # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=m # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_PINEPHONE is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set # CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set # CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y CONFIG_JOYSTICK_PSXPAD_SPI=m CONFIG_JOYSTICK_PSXPAD_SPI_FF=y # CONFIG_JOYSTICK_PXRC is not set # CONFIG_JOYSTICK_QWIIC is not set # CONFIG_JOYSTICK_FSIA6B is not set # CONFIG_JOYSTICK_SENSEHAT is not set # CONFIG_JOYSTICK_RPISENSE is not set # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_ADS7846=m # CONFIG_TOUCHSCREEN_AD7877 is not set # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_AR1021_I2C is not set # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_BU21029 is not set # CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set # CONFIG_TOUCHSCREEN_CY8CTMA140 is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set CONFIG_TOUCHSCREEN_EGALAX=m # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set # CONFIG_TOUCHSCREEN_EXC3000 is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_HIDEEP is not set # CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_ILITEK is not set # CONFIG_TOUCHSCREEN_S6SY761 is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set # CONFIG_TOUCHSCREEN_ELAN is not set # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MSG2638 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_IMAGIS is not set # CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set CONFIG_TOUCHSCREEN_EDT_FT5X06=m CONFIG_TOUCHSCREEN_RASPBERRYPI_FW=m # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set CONFIG_TOUCHSCREEN_USB_COMPOSITE=m CONFIG_TOUCHSCREEN_USB_EGALAX=y # CONFIG_TOUCHSCREEN_USB_PANJIT is not set CONFIG_TOUCHSCREEN_USB_3M=y # CONFIG_TOUCHSCREEN_USB_ITM is not set # CONFIG_TOUCHSCREEN_USB_ETURBO is not set # CONFIG_TOUCHSCREEN_USB_GUNZE is not set # CONFIG_TOUCHSCREEN_USB_DMC_TSC10 is not set # CONFIG_TOUCHSCREEN_USB_IRTOUCH is not set # CONFIG_TOUCHSCREEN_USB_IDEALTEK is not set # CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH is not set # CONFIG_TOUCHSCREEN_USB_GOTOP is not set # CONFIG_TOUCHSCREEN_USB_JASTEC is not set # CONFIG_TOUCHSCREEN_USB_ELO is not set # CONFIG_TOUCHSCREEN_USB_E2I is not set # CONFIG_TOUCHSCREEN_USB_ZYTRONIC is not set # CONFIG_TOUCHSCREEN_USB_ETT_TC45USB is not set # CONFIG_TOUCHSCREEN_USB_NEXIO is not set # CONFIG_TOUCHSCREEN_USB_EASYTOUCH is not set # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2004 is not set # CONFIG_TOUCHSCREEN_TSC2005 is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_RM_TS is not set # CONFIG_TOUCHSCREEN_SILEAD is not set # CONFIG_TOUCHSCREEN_SIS_I2C is not set CONFIG_TOUCHSCREEN_ST1232=m # CONFIG_TOUCHSCREEN_STMFTS is not set # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set # CONFIG_TOUCHSCREEN_SX8654 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZET6223 is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_IQS5XX is not set # CONFIG_TOUCHSCREEN_ZINITIX is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ARIZONA_HAPTICS is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set CONFIG_INPUT_GPIO_ROTARY_ENCODER=m # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set CONFIG_INPUT_RASPBERRYPI_BUTTON=y CONFIG_RMI4_CORE=y # CONFIG_RMI4_I2C is not set # CONFIG_RMI4_SPI is not set # CONFIG_RMI4_SMB is not set CONFIG_RMI4_F03=y CONFIG_RMI4_F03_SERIO=y CONFIG_RMI4_2D_SENSOR=y CONFIG_RMI4_F11=y CONFIG_RMI4_F12=y CONFIG_RMI4_F30=y # CONFIG_RMI4_F34 is not set # CONFIG_RMI4_F3A is not set # CONFIG_RMI4_F55 is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_AMBAKMI is not set # CONFIG_SERIO_PCIPS2 is not set # CONFIG_SERIO_LIBPS2 is not set # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_SERIO_GPIO_PS2 is not set # CONFIG_USERIO is not set # CONFIG_GAMEPORT is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_BRCM_CHAR_DRIVERS=y # CONFIG_BCM2708_VCMEM is not set CONFIG_BCM_VCIO=y CONFIG_BCM2835_SMI_DEV=m # CONFIG_RPIVID_MEM is not set CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y # CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set CONFIG_SERIAL_8250_16550A_VARIANTS=y # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y # CONFIG_SERIAL_8250_DMA is not set CONFIG_SERIAL_8250_PCI=y CONFIG_SERIAL_8250_EXAR=y CONFIG_SERIAL_8250_NR_UARTS=1 CONFIG_SERIAL_8250_RUNTIME_UARTS=0 CONFIG_SERIAL_8250_EXTENDED=y # CONFIG_SERIAL_8250_MANY_PORTS is not set CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_RSA is not set CONFIG_SERIAL_8250_BCM2835AUX=y CONFIG_SERIAL_8250_FSL=y # CONFIG_SERIAL_8250_DW is not set # CONFIG_SERIAL_8250_RT288X is not set CONFIG_SERIAL_8250_PERICOM=y CONFIG_SERIAL_8250_BCM7271=y CONFIG_SERIAL_OF_PLATFORM=y # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_SIFIVE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_RP2 is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set # CONFIG_HVC_DCC is not set CONFIG_SERIAL_DEV_BUS=y CONFIG_SERIAL_DEV_CTRL_TTYPORT=y # CONFIG_TTY_PRINTK is not set # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_BA431 is not set CONFIG_HW_RANDOM_BCM2835=y CONFIG_HW_RANDOM_IPROC_RNG200=y # CONFIG_HW_RANDOM_CCTRNG is not set # CONFIG_HW_RANDOM_XIPHERA is not set CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=y CONFIG_HW_RANDOM_CN10K=y # CONFIG_APPLICOM is not set CONFIG_DEVMEM=y CONFIG_DEVPORT=y # CONFIG_TCG_TPM is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y CONFIG_RANDOM_TRUST_BOOTLOADER=y CONFIG_RASPBERRYPI_GPIOMEM=y # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y # CONFIG_I2C_COMPAT is not set CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_GPMUX is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set CONFIG_I2C_MUX_PINCTRL=y # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_DEMUX_PINCTRL is not set # CONFIG_I2C_MUX_MLXCPLD is not set # end of Multiplexer I2C Chip support CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # PC SMBus host controller drivers # CONFIG_I2C_BCM2708=y CONFIG_I2C_BCM2708_BAUDRATE=100000 # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_ISCH is not set # CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_NVIDIA_GPU is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # # I2C system bus drivers (mostly embedded / system-on-chip) # CONFIG_I2C_BCM2835=y CONFIG_I2C_BRCMSTB=y # CONFIG_I2C_CADENCE is not set # CONFIG_I2C_CBUS_GPIO is not set CONFIG_I2C_DESIGNWARE_CORE=y # CONFIG_I2C_DESIGNWARE_SLAVE is not set CONFIG_I2C_DESIGNWARE_PLATFORM=y # CONFIG_I2C_DESIGNWARE_PCI is not set # CONFIG_I2C_EMEV2 is not set CONFIG_I2C_GPIO=y # CONFIG_I2C_GPIO_FAULT_INJECTOR is not set # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_RK3X is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_THUNDERX is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_PCI1XXXX is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y # CONFIG_SPI_MEM is not set # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set CONFIG_SPI_BCM2835=m CONFIG_SPI_BCM2835AUX=m # CONFIG_SPI_BCM_QSPI is not set # CONFIG_SPI_BITBANG is not set # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_CADENCE_QUADSPI is not set CONFIG_SPI_DESIGNWARE=m CONFIG_SPI_DW_DMA=y # CONFIG_SPI_DW_PCI is not set CONFIG_SPI_DW_MMIO=m # CONFIG_SPI_NXP_FLEXSPI is not set # CONFIG_SPI_GPIO is not set # CONFIG_SPI_FSL_SPI is not set # CONFIG_SPI_MICROCHIP_CORE is not set # CONFIG_SPI_MICROCHIP_CORE_QSPI is not set # CONFIG_SPI_OC_TINY is not set # CONFIG_SPI_PL022 is not set # CONFIG_SPI_PXA2XX is not set # CONFIG_SPI_ROCKCHIP is not set # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_SIFIVE is not set # CONFIG_SPI_MXIC is not set # CONFIG_SPI_THUNDERX is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_AMD is not set # # SPI Multiplexer support # # CONFIG_SPI_MUX is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=y # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set CONFIG_SPI_DYNAMIC=y # CONFIG_SPMI is not set # CONFIG_HSI is not set # CONFIG_PPS is not set # # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # # end of PTP clock support CONFIG_PINCTRL=y CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_CY8C95X0 is not set # CONFIG_PINCTRL_MCP23S08 is not set # CONFIG_PINCTRL_MICROCHIP_SGPIO is not set # CONFIG_PINCTRL_OCELOT is not set # CONFIG_PINCTRL_SINGLE is not set # CONFIG_PINCTRL_STMFX is not set # CONFIG_PINCTRL_SX150X is not set CONFIG_PINCTRL_RP1=y CONFIG_PINCTRL_BCM2712=y CONFIG_PINCTRL_BCM2835=y # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y CONFIG_GPIO_CDEV=y CONFIG_GPIO_CDEV_V1=y CONFIG_GPIO_GENERIC=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set CONFIG_GPIO_RASPBERRYPI_EXP=y CONFIG_GPIO_BCM_VIRT=y CONFIG_GPIO_BRCMSTB=y # CONFIG_GPIO_CADENCE is not set # CONFIG_GPIO_DWAPB is not set # CONFIG_GPIO_EXAR is not set # CONFIG_GPIO_FTGPIO010 is not set # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HLWD is not set # CONFIG_GPIO_LOGICVC is not set # CONFIG_GPIO_MB86S7X is not set # CONFIG_GPIO_PL061 is not set # CONFIG_GPIO_PWM is not set # CONFIG_GPIO_SIFIVE is not set # CONFIG_GPIO_SYSCON is not set # CONFIG_GPIO_XGENE is not set # CONFIG_GPIO_XILINX is not set # CONFIG_GPIO_AMD_FCH is not set # end of Memory mapped GPIO drivers # # I2C GPIO expanders # # 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 # CONFIG_GPIO_PCA9570 is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # CONFIG_GPIO_ARIZONA=m CONFIG_GPIO_FSM=y # end of MFD GPIO expanders # # PCI GPIO expanders # # CONFIG_GPIO_BT8XX is not set # CONFIG_GPIO_PCI_IDIO_16 is not set # CONFIG_GPIO_PCIE_IDIO_24 is not set # CONFIG_GPIO_RDC321X is not set # end of PCI GPIO expanders # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # end of SPI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers CONFIG_W1=m # # 1-wire Bus Masters # # CONFIG_W1_MASTER_MATROX is not set # CONFIG_W1_MASTER_DS2490 is not set # CONFIG_W1_MASTER_DS2482 is not set # CONFIG_W1_MASTER_DS1WM is not set CONFIG_W1_MASTER_GPIO=m # CONFIG_W1_MASTER_SGI is not set # end of 1-wire Bus Masters # # 1-wire Slaves # CONFIG_W1_SLAVE_THERM=m # CONFIG_W1_SLAVE_SMEM is not set # CONFIG_W1_SLAVE_DS2405 is not set # CONFIG_W1_SLAVE_DS2408 is not set # CONFIG_W1_SLAVE_DS2413 is not set # CONFIG_W1_SLAVE_DS2406 is not set # CONFIG_W1_SLAVE_DS2423 is not set # CONFIG_W1_SLAVE_DS2805 is not set # CONFIG_W1_SLAVE_DS2430 is not set # CONFIG_W1_SLAVE_DS2431 is not set # CONFIG_W1_SLAVE_DS2433 is not set # CONFIG_W1_SLAVE_DS2438 is not set # CONFIG_W1_SLAVE_DS250X is not set # CONFIG_W1_SLAVE_DS2780 is not set # CONFIG_W1_SLAVE_DS2781 is not set # CONFIG_W1_SLAVE_DS28E04 is not set # CONFIG_W1_SLAVE_DS28E17 is not set # end of 1-wire Slaves CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_BRCMSTB is not set CONFIG_POWER_RESET_GPIO=y CONFIG_POWER_RESET_GPIO_RESTART=y # CONFIG_POWER_RESET_LTC2952 is not set # CONFIG_POWER_RESET_REGULATOR is not set CONFIG_POWER_RESET_RESTART=y # CONFIG_POWER_RESET_XGENE is not set # CONFIG_POWER_RESET_SYSCON is not set # CONFIG_POWER_RESET_SYSCON_POWEROFF is not set # CONFIG_SYSCON_REBOOT_MODE is not set # CONFIG_NVMEM_REBOOT_MODE is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y CONFIG_RPI_POE_POWER=m # CONFIG_PDA_POWER is not set # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2760 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_BATTERY_MAX1721X is not set # CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set # CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_UCS1002 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_I5K_AMB is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set CONFIG_SENSORS_GPIO_FAN=m # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX31730 is not set # CONFIG_SENSORS_MAX31760 is not set # CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_NZXT_KRAKEN2 is not set # CONFIG_SENSORS_NZXT_SMART2 is not set # CONFIG_SENSORS_OCC_P8_I2C is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set CONFIG_SENSORS_PWM_FAN=y CONFIG_SENSORS_RASPBERRYPI_HWMON=y # CONFIG_SENSORS_SBTSI is not set # CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_VT8231 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_SENSORS_RP1_ADC=m CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y # CONFIG_THERMAL_WRITABLE_TRIPS is not set CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set # CONFIG_CPU_THERMAL is not set # CONFIG_THERMAL_EMULATION is not set # CONFIG_THERMAL_MMIO is not set # # Broadcom thermal drivers # CONFIG_BCM2711_THERMAL=y CONFIG_BCM2835_THERMAL=y # CONFIG_BRCMSTB_THERMAL is not set # end of Broadcom thermal drivers CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 # CONFIG_WATCHDOG_SYSFS is not set # CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_ARM_SBSA_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_ARM_SMC_WATCHDOG is not set # CONFIG_ALIM7101_WDT is not set # CONFIG_I6300ESB_WDT is not set # CONFIG_HP_WATCHDOG is not set CONFIG_BCM2835_WDT=y # CONFIG_BCM7038_WDT is not set # CONFIG_MEN_A21_WDT is not set # # PCI-based Watchdog Cards # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y CONFIG_SSB=m CONFIG_SSB_SPROM=y CONFIG_SSB_BLOCKIO=y CONFIG_SSB_PCIHOST_POSSIBLE=y CONFIG_SSB_PCIHOST=y CONFIG_SSB_B43_PCI_BRIDGE=y CONFIG_SSB_SDIOHOST_POSSIBLE=y # CONFIG_SSB_SDIOHOST is not set CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y CONFIG_SSB_DRIVER_PCICORE=y # CONFIG_SSB_DRIVER_GPIO is not set CONFIG_BCMA_POSSIBLE=y CONFIG_BCMA=m CONFIG_BCMA_BLOCKIO=y CONFIG_BCMA_HOST_PCI_POSSIBLE=y CONFIG_BCMA_HOST_PCI=y # CONFIG_BCMA_HOST_SOC is not set CONFIG_BCMA_DRIVER_PCI=y CONFIG_BCMA_DRIVER_GMAC_CMN=y # CONFIG_BCMA_DRIVER_GPIO is not set # CONFIG_BCMA_DEBUG is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_RPISENSE_CORE is not set # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_GATEWORKS_GSC is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77620 is not set # CONFIG_MFD_MAX77650 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77714 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_OCELOT is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_CPCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_NTXEC is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_SY7636A is not set CONFIG_MFD_RASPBERRYPI_POE_HAT=m # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_RK808 is not set # CONFIG_MFD_RN5T618 is not set # CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set CONFIG_MFD_SIMPLE_MFD_I2C=m # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # 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_VX855 is not set # CONFIG_MFD_LOCHNAGAR is not set CONFIG_MFD_ARIZONA=m CONFIG_MFD_ARIZONA_I2C=m CONFIG_MFD_ARIZONA_SPI=m # CONFIG_MFD_CS47L24 is not set CONFIG_MFD_WM5102=y # CONFIG_MFD_WM5110 is not set # CONFIG_MFD_WM8997 is not set # CONFIG_MFD_WM8998 is not set # CONFIG_MFD_WM8400 is not set # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ROHM_BD718XX is not set # CONFIG_MFD_ROHM_BD71828 is not set # CONFIG_MFD_ROHM_BD957XMUF is not set # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_MFD_QCOM_PM8008 is not set # CONFIG_RAVE_SP_CORE is not set # CONFIG_MFD_INTEL_M10_BMC is not set CONFIG_MFD_RP1=y # CONFIG_MFD_RSMU_I2C is not set # CONFIG_MFD_RSMU_SPI is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set CONFIG_REGULATOR_ARIZONA_LDO1=m CONFIG_REGULATOR_ARIZONA_MICSUPP=m # CONFIG_REGULATOR_DA9121 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set # CONFIG_REGULATOR_FAN53880 is not set CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MAX20086 is not set # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MCP16502 is not set # CONFIG_REGULATOR_MP5416 is not set # CONFIG_REGULATOR_MP8859 is not set # CONFIG_REGULATOR_MP886X is not set # CONFIG_REGULATOR_MPQ7920 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PF8X00 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set # CONFIG_REGULATOR_PWM is not set CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY=y # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_SY8106A is not set # CONFIG_REGULATOR_SY8824X is not set # CONFIG_REGULATOR_SY8827N is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS6286X is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_VCTRL is not set CONFIG_RC_CORE=y CONFIG_BPF_LIRC_MODE2=y CONFIG_LIRC=y CONFIG_RC_MAP=m CONFIG_RC_DECODERS=y CONFIG_IR_IMON_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_MCE_KBD_DECODER=m CONFIG_IR_NEC_DECODER=m CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m CONFIG_IR_RCMM_DECODER=m CONFIG_IR_SANYO_DECODER=m CONFIG_IR_SHARP_DECODER=m CONFIG_IR_SONY_DECODER=m CONFIG_IR_XMP_DECODER=m CONFIG_RC_DEVICES=y CONFIG_IR_GPIO_CIR=m CONFIG_IR_GPIO_TX=m # CONFIG_IR_HIX5HD2 is not set CONFIG_IR_IGORPLUGUSB=m CONFIG_IR_IGUANA=m CONFIG_IR_IMON=m CONFIG_IR_IMON_RAW=m CONFIG_IR_MCEUSB=m CONFIG_IR_PWM_TX=m CONFIG_IR_REDRAT3=m # CONFIG_IR_SERIAL is not set # CONFIG_IR_SPI is not set CONFIG_IR_STREAMZAP=m CONFIG_IR_TOY=m CONFIG_IR_TTUSBIR=m CONFIG_RC_ATI_REMOTE=m # CONFIG_RC_LOOPBACK is not set CONFIG_RC_XBOX_DVD=m CONFIG_CEC_CORE=y # # CEC support # # CONFIG_MEDIA_CEC_RC is not set # CONFIG_MEDIA_CEC_SUPPORT is not set # end of CEC support CONFIG_MEDIA_SUPPORT=m # CONFIG_MEDIA_SUPPORT_FILTER is not set CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y CONFIG_MEDIA_RADIO_SUPPORT=y CONFIG_MEDIA_SDR_SUPPORT=y CONFIG_MEDIA_PLATFORM_SUPPORT=y CONFIG_MEDIA_TEST_SUPPORT=y # end of Media device types # # Media core support # CONFIG_VIDEO_DEV=m CONFIG_MEDIA_CONTROLLER=y CONFIG_DVB_CORE=m # end of Media core support # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y CONFIG_VIDEO_V4L2_SUBDEV_API=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_VIDEO_TUNER=m CONFIG_V4L2_MEM2MEM_DEV=m # CONFIG_V4L2_FLASH_LED_CLASS is not set CONFIG_V4L2_FWNODE=m CONFIG_V4L2_ASYNC=m # end of Video4Linux options # # Media controller options # CONFIG_MEDIA_CONTROLLER_DVB=y CONFIG_MEDIA_CONTROLLER_REQUEST_API=y # end of Media controller options # # Digital TV options # # CONFIG_DVB_MMAP is not set CONFIG_DVB_NET=y CONFIG_DVB_MAX_ADAPTERS=8 # CONFIG_DVB_DYNAMIC_MINORS is not set # CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set # CONFIG_DVB_ULE_DEBUG is not set # end of Digital TV options # # Media drivers # # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_USB_S2255 is not set CONFIG_VIDEO_USBTV=m CONFIG_USB_VIDEO_CLASS=m # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set # # Analog TV USB devices # # CONFIG_VIDEO_GO7007 is not set CONFIG_VIDEO_HDPVR=m CONFIG_VIDEO_PVRUSB2=m CONFIG_VIDEO_PVRUSB2_SYSFS=y CONFIG_VIDEO_PVRUSB2_DVB=y # CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set CONFIG_VIDEO_STK1160_COMMON=m CONFIG_VIDEO_STK1160=m # # Analog/digital TV USB devices # CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_AU0828_V4L2=y CONFIG_VIDEO_AU0828_RC=y CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y # CONFIG_VIDEO_CX231XX_ALSA is not set CONFIG_VIDEO_CX231XX_DVB=m # # Digital TV USB devices # CONFIG_DVB_AS102=m CONFIG_DVB_B2C2_FLEXCOP_USB=m # CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set CONFIG_DVB_USB_V2=m CONFIG_DVB_USB_AF9015=m CONFIG_DVB_USB_AF9035=m CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_AZ6007=m CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_DVBSKY=m CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_GL861=m CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m CONFIG_DVB_USB_ZD1301=m CONFIG_DVB_USB=m # CONFIG_DVB_USB_DEBUG is not set CONFIG_DVB_USB_A800=m CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_CXUSB=m # CONFIG_DVB_USB_CXUSB_ANALOG is not set CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_DIB3000MC=m CONFIG_DVB_USB_DIBUSB_MB=m CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y CONFIG_DVB_USB_DIBUSB_MC=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_DTT200U=m CONFIG_DVB_USB_DTV5100=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_GP8PSK=m CONFIG_DVB_USB_M920X=m CONFIG_DVB_USB_NOVA_T_USB2=m CONFIG_DVB_USB_OPERA1=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_TTUSB2=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_VP7045=m CONFIG_SMS_USB_DRV=m # CONFIG_DVB_TTUSB_BUDGET is not set # CONFIG_DVB_TTUSB_DEC is not set # # Webcam, TV (analog/digital) USB devices # CONFIG_VIDEO_EM28XX=m # CONFIG_VIDEO_EM28XX_V4L2 is not set # CONFIG_VIDEO_EM28XX_ALSA is not set CONFIG_VIDEO_EM28XX_DVB=m CONFIG_VIDEO_EM28XX_RC=m # # Software defined radio USB devices # # CONFIG_USB_AIRSPY is not set # CONFIG_USB_HACKRF is not set # CONFIG_USB_MSI2500 is not set # CONFIG_MEDIA_PCI_SUPPORT is not set # CONFIG_RADIO_ADAPTERS is not set CONFIG_MEDIA_PLATFORM_DRIVERS=y # CONFIG_V4L_PLATFORM_DRIVERS is not set # CONFIG_SDR_PLATFORM_DRIVERS is not set # CONFIG_DVB_PLATFORM_DRIVERS is not set # CONFIG_V4L_MEM2MEM_DRIVERS is not set # # Allegro DVT media platform drivers # # # Amlogic media platform drivers # # # Amphion drivers # # # Aspeed media platform drivers # # # Atmel media platform drivers # # CONFIG_VIDEO_BCM2835_UNICAM is not set # # Cadence media platform drivers # # CONFIG_VIDEO_CADENCE_CSI2RX is not set # CONFIG_VIDEO_CADENCE_CSI2TX is not set # # Chips&Media media platform drivers # # # Intel media platform drivers # # # Marvell media platform drivers # # # Mediatek media platform drivers # # # NVidia media platform drivers # # # NXP media platform drivers # # # Qualcomm media platform drivers # # # Raspberry Pi media platform drivers # CONFIG_VIDEO_RASPBERRYPI_PISP_BE=m CONFIG_VIDEO_RP1_CFE=m # # Renesas media platform drivers # # # Rockchip media platform drivers # # # Samsung media platform drivers # # # STMicroelectronics media platform drivers # # # Sunxi media platform drivers # # # Texas Instruments drivers # # # Verisilicon media platform drivers # # # VIA media platform drivers # # # Xilinx media platform drivers # # # MMC/SDIO DVB adapters # CONFIG_SMS_SDIO_DRV=m # CONFIG_V4L_TEST_DRIVERS is not set # CONFIG_DVB_TEST_DRIVERS is not set CONFIG_MEDIA_COMMON_OPTIONS=y # # common driver options # CONFIG_CYPRESS_FIRMWARE=m CONFIG_TTPCI_EEPROM=m CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_SMS_SIANO_MDTV=m CONFIG_SMS_SIANO_RC=y # CONFIG_SMS_SIANO_DEBUGFS is not set CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_DMA_CONTIG=m CONFIG_VIDEOBUF2_VMALLOC=m # end of Media drivers # # Media ancillary drivers # CONFIG_MEDIA_ATTACH=y # # IR I2C driver auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_IR_I2C=m CONFIG_VIDEO_CAMERA_SENSOR=y # CONFIG_VIDEO_AR0521 is not set # CONFIG_VIDEO_ARDUCAM_64MP is not set # CONFIG_VIDEO_ARDUCAM_PIVARIETY is not set # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_HI846 is not set # CONFIG_VIDEO_HI847 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX296 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_IMX412 is not set # CONFIG_VIDEO_IMX477 is not set # CONFIG_VIDEO_IMX519 is not set # CONFIG_VIDEO_IMX708 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set # CONFIG_VIDEO_MT9V011 is not set # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set # CONFIG_VIDEO_OV2311 is not set # CONFIG_VIDEO_OV2640 is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5693 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV64A40 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV7251 is not set # CONFIG_VIDEO_OV7640 is not set # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9282 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_M5MOLS is not set # # Lens drivers # # CONFIG_VIDEO_AD5398 is not set # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_BU64754 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # Audio decoders, processors and mixers # # CONFIG_VIDEO_CS3308 is not set # CONFIG_VIDEO_CS5345 is not set CONFIG_VIDEO_CS53L32A=m CONFIG_VIDEO_MSP3400=m # CONFIG_VIDEO_SONY_BTF_MPX is not set # CONFIG_VIDEO_TDA1997X is not set # CONFIG_VIDEO_TDA7432 is not set # CONFIG_VIDEO_TDA9840 is not set # CONFIG_VIDEO_TEA6415C is not set # CONFIG_VIDEO_TEA6420 is not set # CONFIG_VIDEO_TLV320AIC23B is not set # CONFIG_VIDEO_TVAUDIO is not set # CONFIG_VIDEO_UDA1342 is not set # CONFIG_VIDEO_VP27SMPX is not set # CONFIG_VIDEO_WM8739 is not set CONFIG_VIDEO_WM8775=m # end of Audio decoders, processors and mixers # # RDS decoders # # CONFIG_VIDEO_SAA6588 is not set # end of RDS decoders # # Video decoders # # CONFIG_VIDEO_ADV7180 is not set # CONFIG_VIDEO_ADV7183 is not set # CONFIG_VIDEO_ADV748X is not set # CONFIG_VIDEO_ADV7604 is not set # CONFIG_VIDEO_ADV7842 is not set # CONFIG_VIDEO_BT819 is not set # CONFIG_VIDEO_BT856 is not set # CONFIG_VIDEO_BT866 is not set # CONFIG_VIDEO_ISL7998X is not set # CONFIG_VIDEO_KS0127 is not set # CONFIG_VIDEO_MAX9286 is not set # CONFIG_VIDEO_ML86V7667 is not set # CONFIG_VIDEO_SAA7110 is not set CONFIG_VIDEO_SAA711X=m # CONFIG_VIDEO_TC358743 is not set # CONFIG_VIDEO_TVP514X is not set # CONFIG_VIDEO_TVP5150 is not set # CONFIG_VIDEO_TVP7002 is not set # CONFIG_VIDEO_TW2804 is not set # CONFIG_VIDEO_OV9281 is not set # CONFIG_VIDEO_TW9903 is not set # CONFIG_VIDEO_TW9906 is not set # CONFIG_VIDEO_TW9910 is not set # CONFIG_VIDEO_IRS1125 is not set # CONFIG_VIDEO_VPX3220 is not set # # Video and audio decoders # # CONFIG_VIDEO_SAA717X is not set CONFIG_VIDEO_CX25840=m # end of Video decoders # # Video encoders # # CONFIG_VIDEO_AD9389B is not set # CONFIG_VIDEO_ADV7170 is not set # CONFIG_VIDEO_ADV7175 is not set # CONFIG_VIDEO_ADV7343 is not set # CONFIG_VIDEO_ADV7393 is not set # CONFIG_VIDEO_ADV7511 is not set # CONFIG_VIDEO_AK881X is not set # CONFIG_VIDEO_SAA7127 is not set # CONFIG_VIDEO_SAA7185 is not set # CONFIG_VIDEO_THS8200 is not set # end of Video encoders # # Video improvement chips # # CONFIG_VIDEO_UPD64031A is not set # CONFIG_VIDEO_UPD64083 is not set # end of Video improvement chips # # Audio/Video compression chips # # CONFIG_VIDEO_SAA6752HS is not set # end of Audio/Video compression chips # # SDR tuner chips # # CONFIG_SDR_MAX2175 is not set # end of SDR tuner chips # # Miscellaneous helper chips # # CONFIG_VIDEO_I2C is not set # CONFIG_VIDEO_M52790 is not set # CONFIG_VIDEO_ST_MIPID02 is not set # CONFIG_VIDEO_THS7303 is not set # end of Miscellaneous helper chips # # Media SPI Adapters # CONFIG_CXD2880_SPI_DRV=m # CONFIG_VIDEO_GS1662 is not set # end of Media SPI Adapters CONFIG_MEDIA_TUNER=m # # Customize TV tuners # CONFIG_MEDIA_TUNER_E4000=m CONFIG_MEDIA_TUNER_FC0011=m CONFIG_MEDIA_TUNER_FC0012=m CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_FC2580=m CONFIG_MEDIA_TUNER_IT913X=m # CONFIG_MEDIA_TUNER_M88RS6000T is not set CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_MC44S803=m # CONFIG_MEDIA_TUNER_MSI001 is not set CONFIG_MEDIA_TUNER_MT2060=m CONFIG_MEDIA_TUNER_MT2063=m CONFIG_MEDIA_TUNER_MT20XX=m # CONFIG_MEDIA_TUNER_MT2131 is not set CONFIG_MEDIA_TUNER_MT2266=m # CONFIG_MEDIA_TUNER_MXL301RF is not set CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m # CONFIG_MEDIA_TUNER_QM1D1B0004 is not set CONFIG_MEDIA_TUNER_QM1D1C0042=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_R820T=m CONFIG_MEDIA_TUNER_SI2157=m CONFIG_MEDIA_TUNER_SIMPLE=m CONFIG_MEDIA_TUNER_TDA18212=m CONFIG_MEDIA_TUNER_TDA18218=m CONFIG_MEDIA_TUNER_TDA18250=m CONFIG_MEDIA_TUNER_TDA18271=m CONFIG_MEDIA_TUNER_TDA827X=m CONFIG_MEDIA_TUNER_TDA8290=m CONFIG_MEDIA_TUNER_TDA9887=m CONFIG_MEDIA_TUNER_TEA5761=m CONFIG_MEDIA_TUNER_TEA5767=m CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_MEDIA_TUNER_XC2028=m CONFIG_MEDIA_TUNER_XC4000=m CONFIG_MEDIA_TUNER_XC5000=m # end of Customize TV tuners # # Customise DVB Frontends # # # Multistandard (satellite) frontends # CONFIG_DVB_M88DS3103=m # CONFIG_DVB_MXL5XX is not set CONFIG_DVB_STB0899=m CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m # CONFIG_DVB_STV0910 is not set CONFIG_DVB_STV6110x=m # CONFIG_DVB_STV6111 is not set # # Multistandard (cable + terrestrial) frontends # CONFIG_DVB_DRXK=m CONFIG_DVB_MN88472=m CONFIG_DVB_MN88473=m CONFIG_DVB_SI2165=m CONFIG_DVB_TDA18271C2DD=m # # DVB-S (satellite) frontends # # CONFIG_DVB_CX24110 is not set CONFIG_DVB_CX24116=m # CONFIG_DVB_CX24117 is not set CONFIG_DVB_CX24120=m CONFIG_DVB_CX24123=m CONFIG_DVB_DS3000=m # CONFIG_DVB_MB86A16 is not set CONFIG_DVB_MT312=m CONFIG_DVB_S5H1420=m CONFIG_DVB_SI21XX=m CONFIG_DVB_STB6000=m CONFIG_DVB_STV0288=m CONFIG_DVB_STV0299=m CONFIG_DVB_STV0900=m CONFIG_DVB_STV6110=m CONFIG_DVB_TDA10071=m CONFIG_DVB_TDA10086=m # CONFIG_DVB_TDA8083 is not set # CONFIG_DVB_TDA8261 is not set CONFIG_DVB_TDA826X=m CONFIG_DVB_TS2020=m # CONFIG_DVB_TUA6100 is not set CONFIG_DVB_TUNER_CX24113=m CONFIG_DVB_TUNER_ITD1000=m # CONFIG_DVB_VES1X93 is not set # CONFIG_DVB_ZL10036 is not set CONFIG_DVB_ZL10039=m # # DVB-T (terrestrial) frontends # CONFIG_DVB_AF9013=m CONFIG_DVB_AS102_FE=m # CONFIG_DVB_CX22700 is not set CONFIG_DVB_CX22702=m CONFIG_DVB_CXD2820R=m CONFIG_DVB_CXD2841ER=m CONFIG_DVB_DIB3000MB=m CONFIG_DVB_DIB3000MC=m CONFIG_DVB_DIB7000M=m CONFIG_DVB_DIB7000P=m # CONFIG_DVB_DIB9000 is not set CONFIG_DVB_DRXD=m CONFIG_DVB_EC100=m CONFIG_DVB_GP8PSK_FE=m # CONFIG_DVB_L64781 is not set CONFIG_DVB_MT352=m CONFIG_DVB_NXT6000=m CONFIG_DVB_RTL2830=m CONFIG_DVB_RTL2832=m CONFIG_DVB_RTL2832_SDR=m # CONFIG_DVB_S5H1432 is not set CONFIG_DVB_SI2168=m # CONFIG_DVB_SP887X is not set # CONFIG_DVB_STV0367 is not set CONFIG_DVB_TDA10048=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_ZD1301_DEMOD=m CONFIG_DVB_ZL10353=m CONFIG_DVB_CXD2880=m # # DVB-C (cable) frontends # CONFIG_DVB_STV0297=m # CONFIG_DVB_TDA10021 is not set CONFIG_DVB_TDA10023=m # CONFIG_DVB_VES1820 is not set # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # CONFIG_DVB_AU8522=m CONFIG_DVB_AU8522_DTV=m CONFIG_DVB_AU8522_V4L=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LG2160=m CONFIG_DVB_LGDT3305=m CONFIG_DVB_LGDT3306A=m CONFIG_DVB_LGDT330X=m CONFIG_DVB_MXL692=m CONFIG_DVB_NXT200X=m # CONFIG_DVB_OR51132 is not set # CONFIG_DVB_OR51211 is not set CONFIG_DVB_S5H1409=m CONFIG_DVB_S5H1411=m # # ISDB-T (terrestrial) frontends # CONFIG_DVB_DIB8000=m CONFIG_DVB_MB86A20S=m CONFIG_DVB_S921=m # # ISDB-S (satellite) & ISDB-T (terrestrial) frontends # # CONFIG_DVB_MN88443X is not set CONFIG_DVB_TC90522=m # # Digital terrestrial only tuners/PLL # CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m CONFIG_DVB_TUNER_DIB0090=m # # SEC control devices for DVB-S # CONFIG_DVB_A8293=m CONFIG_DVB_AF9033=m # CONFIG_DVB_ASCOT2E is not set CONFIG_DVB_ATBM8830=m # CONFIG_DVB_HELENE is not set # CONFIG_DVB_HORUS3A is not set # CONFIG_DVB_ISL6405 is not set CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m CONFIG_DVB_IX2505V=m # CONFIG_DVB_LGS8GL5 is not set CONFIG_DVB_LGS8GXX=m # CONFIG_DVB_LNBH25 is not set # CONFIG_DVB_LNBH29 is not set CONFIG_DVB_LNBP21=m CONFIG_DVB_LNBP22=m CONFIG_DVB_M88RS2000=m # CONFIG_DVB_TDA665x is not set CONFIG_DVB_DRX39XYJ=m # # Common Interface (EN50221) controller drivers # # CONFIG_DVB_CXD2099 is not set CONFIG_DVB_SP2=m # end of Customise DVB Frontends # # Tools to develop new frontends # # CONFIG_DVB_DUMMY_FE is not set # end of Media ancillary drivers # # Graphics support # CONFIG_DRM=y CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DEBUG_MM is not set CONFIG_DRM_KMS_HELPER=y # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set # CONFIG_DRM_DEBUG_MODESET_LOCK is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_TTM=y CONFIG_DRM_VRAM_HELPER=y CONFIG_DRM_TTM_HELPER=y CONFIG_DRM_GEM_DMA_HELPER=y CONFIG_DRM_GEM_SHMEM_HELPER=y CONFIG_DRM_SCHED=y # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # end of I2C encoder or helper chips # # ARM devices # # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_KOMEDA is not set # end of ARM devices # CONFIG_DRM_RADEON is not set # CONFIG_DRM_AMDGPU is not set # CONFIG_DRM_NOUVEAU is not set # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set # CONFIG_DRM_VMWGFX is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_AST is not set # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_USE_LVDS is not set # CONFIG_DRM_RCAR_USE_MIPI_DSI is not set # CONFIG_DRM_QXL is not set CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_ABT_Y030XX067A is not set # CONFIG_DRM_PANEL_ARM_VERSATILE is not set # CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set # CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set # CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set # CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set # CONFIG_DRM_PANEL_DSI_CM is not set # CONFIG_DRM_PANEL_LVDS is not set CONFIG_DRM_PANEL_SIMPLE=y # CONFIG_DRM_PANEL_EDP is not set # CONFIG_DRM_PANEL_EBBG_FT8719 is not set # CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set # CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set # CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9806E is not set # CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set # CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set # CONFIG_DRM_PANEL_JDI_R63452 is not set # CONFIG_DRM_PANEL_KHADAS_TS050 is not set # CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set # CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set # CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LB035Q02 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set # CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set # CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set # CONFIG_DRM_PANEL_NOVATEK_NT35560 is not set # CONFIG_DRM_PANEL_NOVATEK_NT35950 is not set # CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set # CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set # CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set # CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set # CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set # CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set # CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set # CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set # CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set # CONFIG_DRM_PANEL_RONBO_RB070D30 is not set # CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set # CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set # CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set # CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set # CONFIG_DRM_PANEL_SHARP_LS060T1SX01 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set # CONFIG_DRM_PANEL_SONY_ACX565AKM is not set # CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 is not set # CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set # CONFIG_DRM_PANEL_TPO_Y17P is not set # CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set # CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set # CONFIG_DRM_PANEL_TPO_TPG110 is not set # CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set # CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set # CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set # CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set # CONFIG_DRM_LONTIUM_LT9611 is not set # CONFIG_DRM_LONTIUM_LT9611UXC is not set # CONFIG_DRM_ITE_IT66121 is not set # CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NWL_MIPI_DSI is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_PARADE_PS8640 is not set # CONFIG_DRM_SIL_SII8620 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_SII9234 is not set CONFIG_DRM_SIMPLE_BRIDGE=y # CONFIG_DRM_THINE_THC63LVD1024 is not set CONFIG_DRM_TOSHIBA_TC358762=y # CONFIG_DRM_TOSHIBA_TC358764 is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TOSHIBA_TC358768 is not set # CONFIG_DRM_TOSHIBA_TC358775 is not set # CONFIG_DRM_TI_DLPC3433 is not set # CONFIG_DRM_TI_TFP410 is not set # CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_ANALOGIX_ANX7625 is not set # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_CDNS_MHDP8546 is not set # end of Display Interface Bridges CONFIG_DRM_V3D=y CONFIG_DRM_VC4=y CONFIG_DRM_VC4_HDMI_CEC=y CONFIG_DRM_RP1_DSI=y CONFIG_DRM_RP1_DPI=y CONFIG_DRM_RP1_VEC=y # CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_HISI_HIBMC is not set # CONFIG_DRM_HISI_KIRIN is not set # CONFIG_DRM_LOGICVC is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_BOCHS is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_PANEL_MIPI_DBI is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9163 is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set # CONFIG_TINYDRM_ILI9486 is not set # CONFIG_TINYDRM_MI0283QT is not set # CONFIG_TINYDRM_REPAPER is not set # CONFIG_TINYDRM_ST7586 is not set # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_LIMA is not set # CONFIG_DRM_PANFROST is not set # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_DRM_NOMODESET=y # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y # CONFIG_FB_MODE_HELPERS is not set # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_BCM2708 is not set # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_EFI is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_I740 is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_S3 is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VT8623 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_ARK is not set # CONFIG_FB_PM3 is not set # CONFIG_FB_CARMINE is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # CONFIG_FB_SM712 is not set # CONFIG_FB_RPISENSE is not set # end of Frame buffer Devices # # Backlight & LCD device support # CONFIG_LCD_CLASS_DEVICE=m # CONFIG_LCD_L4F00242T03 is not set # CONFIG_LCD_LMS283GF05 is not set # CONFIG_LCD_LTV350QV is not set # CONFIG_LCD_ILI922X is not set # CONFIG_LCD_ILI9320 is not set # CONFIG_LCD_TDO24M is not set # CONFIG_LCD_VGG2432A4 is not set # CONFIG_LCD_PLATFORM is not set # CONFIG_LCD_AMS369FG06 is not set # CONFIG_LCD_LMS501KF03 is not set # CONFIG_LCD_HX8357 is not set # CONFIG_LCD_OTM3225A is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_KTD253 is not set # CONFIG_BACKLIGHT_PWM is not set CONFIG_BACKLIGHT_RPI=y # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set CONFIG_BACKLIGHT_GPIO=y # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # CONFIG_BACKLIGHT_LED is not set # end of Backlight & LCD device support CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support # CONFIG_LOGO is not set # end of Graphics support CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_COMPRESS_OFFLOAD=y CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y CONFIG_SND_HRTIMER=m CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 # CONFIG_SND_SUPPORT_OLD_API is not set CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_CTL_INPUT_VALIDATION is not set CONFIG_SND_VMASTER=y # CONFIG_SND_SEQUENCER is not set # CONFIG_SND_DRIVERS is not set CONFIG_SND_PCI=y # CONFIG_SND_AD1889 is not set # CONFIG_SND_ALS300 is not set # CONFIG_SND_ALI5451 is not set # CONFIG_SND_ATIIXP is not set # CONFIG_SND_ATIIXP_MODEM is not set # CONFIG_SND_AU8810 is not set # CONFIG_SND_AU8820 is not set # CONFIG_SND_AU8830 is not set # CONFIG_SND_AW2 is not set # CONFIG_SND_AZT3328 is not set # CONFIG_SND_BT87X is not set # CONFIG_SND_CA0106 is not set # CONFIG_SND_CMIPCI is not set # CONFIG_SND_OXYGEN is not set # CONFIG_SND_CS4281 is not set # CONFIG_SND_CS46XX is not set # CONFIG_SND_CTXFI is not set # CONFIG_SND_DARLA20 is not set # CONFIG_SND_GINA20 is not set # CONFIG_SND_LAYLA20 is not set # CONFIG_SND_DARLA24 is not set # CONFIG_SND_GINA24 is not set # CONFIG_SND_LAYLA24 is not set # CONFIG_SND_MONA is not set # CONFIG_SND_MIA is not set # CONFIG_SND_ECHO3G is not set # CONFIG_SND_INDIGO is not set # CONFIG_SND_INDIGOIO is not set # CONFIG_SND_INDIGODJ is not set # CONFIG_SND_INDIGOIOX is not set # CONFIG_SND_INDIGODJX is not set # CONFIG_SND_EMU10K1 is not set # CONFIG_SND_EMU10K1X is not set # CONFIG_SND_ENS1370 is not set # CONFIG_SND_ENS1371 is not set # CONFIG_SND_ES1938 is not set # CONFIG_SND_ES1968 is not set # CONFIG_SND_FM801 is not set # CONFIG_SND_HDSP is not set # CONFIG_SND_HDSPM is not set # CONFIG_SND_ICE1712 is not set # CONFIG_SND_ICE1724 is not set # CONFIG_SND_INTEL8X0 is not set # CONFIG_SND_INTEL8X0M is not set # CONFIG_SND_KORG1212 is not set # CONFIG_SND_LOLA is not set # CONFIG_SND_LX6464ES is not set # CONFIG_SND_MAESTRO3 is not set # CONFIG_SND_MIXART is not set # CONFIG_SND_NM256 is not set # CONFIG_SND_PCXHR is not set # CONFIG_SND_RIPTIDE is not set # CONFIG_SND_RME32 is not set # CONFIG_SND_RME96 is not set # CONFIG_SND_RME9652 is not set # CONFIG_SND_SE6X is not set # CONFIG_SND_SONICVIBES is not set # CONFIG_SND_TRIDENT is not set # CONFIG_SND_VIA82XX is not set # CONFIG_SND_VIA82XX_MODEM is not set # CONFIG_SND_VIRTUOSO is not set # CONFIG_SND_VX222 is not set # CONFIG_SND_YMFPCI is not set # # HD-Audio # # CONFIG_SND_HDA_INTEL is not set # end of HD-Audio CONFIG_SND_HDA_PREALLOC_SIZE=2048 CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=m CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y CONFIG_SND_USB_UA101=m CONFIG_SND_USB_CAIAQ=m CONFIG_SND_USB_CAIAQ_INPUT=y CONFIG_SND_USB_6FIRE=m CONFIG_SND_USB_HIFACE=m CONFIG_SND_BCD2000=m CONFIG_SND_USB_LINE6=m CONFIG_SND_USB_POD=m CONFIG_SND_USB_PODHD=m CONFIG_SND_USB_TONEPORT=m CONFIG_SND_USB_VARIAX=m CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y CONFIG_SND_SOC_COMPRESS=y # CONFIG_SND_SOC_ADI is not set # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_AMD_ACP_CONFIG is not set # CONFIG_SND_ATMEL_SOC is not set CONFIG_SND_BCM2835_SOC_I2S=m # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set CONFIG_SND_BCM2708_SOC_CHIPDIP_DAC=m CONFIG_SND_BCM2708_SOC_GOOGLEVOICEHAT_SOUNDCARD=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUS=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSHD=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADC=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADCPRO=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSDSP=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_AMP=m CONFIG_SND_BCM2708_SOC_PIFI_40=m CONFIG_SND_BCM2708_SOC_RPI_CIRRUS=m CONFIG_SND_BCM2708_SOC_RPI_DAC=m CONFIG_SND_BCM2708_SOC_RPI_PROTO=m CONFIG_SND_BCM2708_SOC_JUSTBOOM_BOTH=m CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC=m CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m CONFIG_SND_BCM2708_SOC_IQAUDIO_CODEC=m CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m CONFIG_SND_BCM2708_SOC_IQAUDIO_DIGI=m CONFIG_SND_BCM2708_SOC_I_SABRE_Q2M=m CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m CONFIG_SND_AUDIOINJECTOR_OCTO_SOUNDCARD=m CONFIG_SND_AUDIOINJECTOR_ISOLATED_SOUNDCARD=m CONFIG_SND_AUDIOSENSE_PI=m CONFIG_SND_DIGIDAC1_SOUNDCARD=m CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO=m CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO_V2=m CONFIG_SND_BCM2708_SOC_ALLO_PIANO_DAC=m CONFIG_SND_BCM2708_SOC_ALLO_PIANO_DAC_PLUS=m CONFIG_SND_BCM2708_SOC_ALLO_BOSS_DAC=m CONFIG_SND_BCM2708_SOC_ALLO_BOSS2_DAC=m CONFIG_SND_BCM2708_SOC_ALLO_DIGIONE=m CONFIG_SND_BCM2708_SOC_ALLO_KATANA_DAC=m CONFIG_SND_BCM2708_SOC_FE_PI_AUDIO=m CONFIG_SND_PISOUND=m CONFIG_SND_RPI_SIMPLE_SOUNDCARD=m CONFIG_SND_RPI_WM8804_SOUNDCARD=m CONFIG_SND_DACBERRY400=m CONFIG_SND_DESIGNWARE_I2S=m CONFIG_SND_DESIGNWARE_PCM=y # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # CONFIG_SND_SOC_FSL_AUDMIX is not set # 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_FSL_XCVR is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # end of SoC Audio for Freescale CPUs # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_MTK_BTCVSD is not set # CONFIG_SND_SOC_SOF_TOPLEVEL is not set # # STMicroelectronics STM32 SOC audio support # # end of 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_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # CONFIG_SND_SOC_ARIZONA=m CONFIG_SND_SOC_WM_ADSP=m # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_AD193X_SPI is not set # CONFIG_SND_SOC_AD193X_I2C is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1372_SPI is not set CONFIG_SND_SOC_ADAU1701=m # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set CONFIG_SND_SOC_ADAU1977=m CONFIG_SND_SOC_ADAU1977_I2C=m CONFIG_SND_SOC_ADAU7002=m # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4375 is not set # CONFIG_SND_SOC_AK4458 is not set CONFIG_SND_SOC_AK4554=m # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # 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_CS35L41_SPI is not set # CONFIG_SND_SOC_CS35L41_I2C is not set # CONFIG_SND_SOC_CS35L45_SPI is not set # CONFIG_SND_SOC_CS35L45_I2C 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS42L83 is not set # CONFIG_SND_SOC_CS4234 is not set CONFIG_SND_SOC_CS4265=m # CONFIG_SND_SOC_CS4270 is not set CONFIG_SND_SOC_CS4271=m CONFIG_SND_SOC_CS4271_I2C=m # CONFIG_SND_SOC_CS4271_SPI is not set CONFIG_SND_SOC_CS42XX8=m CONFIG_SND_SOC_CS42XX8_I2C=m # 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_CX2072X is not set CONFIG_SND_SOC_DA7213=m CONFIG_SND_SOC_DMIC=m CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_ES7134 is not set # CONFIG_SND_SOC_ES7241 is not set # CONFIG_SND_SOC_ES8316 is not set # CONFIG_SND_SOC_ES8326 is not set # CONFIG_SND_SOC_ES8328_I2C is not set # CONFIG_SND_SOC_ES8328_SPI is not set # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_HDA is not set # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set CONFIG_SND_SOC_MA120X0P=m # CONFIG_SND_SOC_MAX98088 is not set # CONFIG_SND_SOC_MAX98357A is not set # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98520 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX98396 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set CONFIG_SND_SOC_PCM179X=m CONFIG_SND_SOC_PCM179X_I2C=m # CONFIG_SND_SOC_PCM179X_SPI is not set CONFIG_SND_SOC_PCM186X=m CONFIG_SND_SOC_PCM186X_I2C=m # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set CONFIG_SND_SOC_PCM5102A=m CONFIG_SND_SOC_PCM512x=m CONFIG_SND_SOC_PCM512x_I2C=m # 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_PCM1794A=m # CONFIG_SND_SOC_RT5631 is not set # CONFIG_SND_SOC_RT5640 is not set # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_RT9120 is not set CONFIG_SND_SOC_SGTL5000=m CONFIG_SND_SOC_SIGMADSP=m CONFIG_SND_SOC_SIGMADSP_I2C=m CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m # CONFIG_SND_SOC_SIMPLE_MUX is not set CONFIG_SND_SOC_SPDIF=m # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set CONFIG_SND_SOC_STA32X=m # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS2780 is not set # CONFIG_SND_SOC_TAS5086 is not set CONFIG_SND_SOC_TAS571X=m # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805M is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set CONFIG_SND_SOC_TAS5713=m # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320ADC3XXX is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set CONFIG_SND_SOC_TLV320AIC32X4=m CONFIG_SND_SOC_TLV320AIC32X4_I2C=m # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set CONFIG_SND_SOC_TLV320AIC3X=m CONFIG_SND_SOC_TLV320AIC3X_I2C=m # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set CONFIG_SND_SOC_WM5102=m # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set CONFIG_SND_SOC_WM8731=m CONFIG_SND_SOC_WM8731_I2C=m # CONFIG_SND_SOC_WM8731_SPI is not set # CONFIG_SND_SOC_WM8737 is not set CONFIG_SND_SOC_WM8741=m # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set CONFIG_SND_SOC_WM8804=m CONFIG_SND_SOC_WM8804_I2C=m # 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_WM8940 is not set CONFIG_SND_SOC_WM8960=m # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set # CONFIG_SND_SOC_ZL38060 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_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8821 is not set # CONFIG_SND_SOC_NAU8822 is not set # CONFIG_SND_SOC_NAU8824 is not set CONFIG_SND_SOC_TPA6130A2=m # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set CONFIG_SND_SOC_I_SABRE_CODEC=m # end of CODEC drivers CONFIG_SND_SIMPLE_CARD_UTILS=m CONFIG_SND_SIMPLE_CARD=m CONFIG_SND_AUDIO_GRAPH_CARD=m # CONFIG_SND_AUDIO_GRAPH_CARD2 is not set # CONFIG_SND_TEST_COMPONENT is not set # # HID support # CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set CONFIG_HID_ASUS=y CONFIG_HID_AUREAL=y CONFIG_HID_BELKIN=y # CONFIG_HID_BETOP_FF is not set CONFIG_HID_BIGBEN_FF=m CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CREATIVE_SB0540 is not set CONFIG_HID_CYPRESS=y CONFIG_HID_DRAGONRISE=m CONFIG_DRAGONRISE_FF=y # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_FT260 is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_GLORIOUS is not set # CONFIG_HID_HOLTEK is not set # CONFIG_HID_VIVALDI is not set # CONFIG_HID_GT683R is not set # CONFIG_HID_KEYTOUCH is not set CONFIG_HID_KYE=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set # CONFIG_HID_VRC2 is not set # CONFIG_HID_XIAOMI is not set CONFIG_HID_GYRATION=y # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set # CONFIG_HID_JABRA is not set CONFIG_HID_TWINHAN=y CONFIG_HID_KENSINGTON=y CONFIG_HID_LCPOWER=y # CONFIG_HID_LED is not set CONFIG_HID_LENOVO=y # CONFIG_HID_LETSKETCH is not set CONFIG_HID_LOGITECH=y CONFIG_HID_LOGITECH_DJ=y CONFIG_HID_LOGITECH_HIDPP=y CONFIG_LOGITECH_FF=y 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_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=m CONFIG_HID_NINTENDO=m CONFIG_NINTENDO_FF=y # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set CONFIG_HID_ORTEK=y CONFIG_HID_OUYA=y CONFIG_HID_PANTHERLORD=y CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=y CONFIG_HID_PETALYNX=y # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PXRC is not set # CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set CONFIG_HID_SAMSUNG=y # CONFIG_HID_SEMITEK is not set # CONFIG_HID_SIGMAMICRO is not set CONFIG_HID_SONY=y CONFIG_SONY_FF=y # CONFIG_HID_SPEEDLINK is not set CONFIG_HID_STEAM=m # CONFIG_HID_STEELSERIES is not set CONFIG_HID_SUNPLUS=y CONFIG_HID_RMI=y # CONFIG_HID_GREENASIA is not set CONFIG_HID_SMARTJOYPLUS=m CONFIG_SMARTJOYPLUS_FF=y CONFIG_HID_TIVO=y CONFIG_HID_TOPSEED=y # CONFIG_HID_TOPRE is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set CONFIG_HID_WIIMOTE=m CONFIG_HID_XINMO=y # CONFIG_HID_ZEROPLUS is not set CONFIG_HID_ZYDACRON=y # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # end of USB HID support # # I2C HID support # # CONFIG_I2C_HID_OF is not set # CONFIG_I2C_HID_OF_ELAN is not set # CONFIG_I2C_HID_OF_GOODIX is not set # end of I2C HID support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y # CONFIG_USB_LED_TRIG is not set # CONFIG_USB_ULPI_BUS is not set # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_PCI=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_OTG is not set # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set # CONFIG_USB_LEDS_TRIGGER_USBPORT is not set CONFIG_USB_AUTOSUSPEND_DELAY=2 CONFIG_USB_MON=m # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y # CONFIG_USB_XHCI_DBGCAP is not set CONFIG_USB_XHCI_PCI=y # CONFIG_USB_XHCI_PCI_RENESAS is not set CONFIG_USB_XHCI_PLATFORM=y # CONFIG_USB_BRCMSTB is not set # CONFIG_USB_EHCI_HCD is not set # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set # CONFIG_USB_OHCI_HCD is not set # CONFIG_USB_UHCI_HCD is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set CONFIG_USB_DWCOTG=y # CONFIG_USB_HCD_BCMA is not set # CONFIG_USB_HCD_SSB is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=m # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set CONFIG_USB_UAS=y # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set CONFIG_USB_DWC3=y CONFIG_USB_DWC3_HOST=y # # Platform Glue Driver Support # CONFIG_USB_DWC3_HAPS=y CONFIG_USB_DWC3_OF_SIMPLE=y CONFIG_USB_DWC2=y CONFIG_USB_DWC2_HOST=y # # Gadget/Dual-role mode requires USB Gadget support to be enabled # # CONFIG_USB_DWC2_PCI is not set # CONFIG_USB_DWC2_DEBUG is not set # CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # CONFIG_USB_SERIAL=m CONFIG_USB_SERIAL_GENERIC=y # CONFIG_USB_SERIAL_SIMPLE is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set CONFIG_USB_SERIAL_CH341=m # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set CONFIG_USB_SERIAL_CP210X=m # CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_EMPEG is not set CONFIG_USB_SERIAL_FTDI_SIO=m # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_F81232 is not set # CONFIG_USB_SERIAL_F8153X is not set # CONFIG_USB_SERIAL_GARMIN is not set # CONFIG_USB_SERIAL_IPW is not set CONFIG_USB_SERIAL_IUU=m # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set # CONFIG_USB_SERIAL_KEYSPAN is not set # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_METRO is not set # CONFIG_USB_SERIAL_MOS7720 is not set # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MXUPORT is not set # CONFIG_USB_SERIAL_NAVMAN is not set CONFIG_USB_SERIAL_PL2303=m # CONFIG_USB_SERIAL_OTI6858 is not set # CONFIG_USB_SERIAL_QCAUX is not set # CONFIG_USB_SERIAL_QUALCOMM is not set # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SAFE is not set # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_OPTION is not set # CONFIG_USB_SERIAL_OMNINET is not set # CONFIG_USB_SERIAL_OPTICON is not set # CONFIG_USB_SERIAL_XSENS_MT is not set # CONFIG_USB_SERIAL_WISHBONE is not set # CONFIG_USB_SERIAL_SSU100 is not set # CONFIG_USB_SERIAL_QT2 is not set # CONFIG_USB_SERIAL_UPD78F0730 is not set # CONFIG_USB_SERIAL_XR is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HUB_USB251XB is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set CONFIG_BRCM_USB_PINMAP=y # CONFIG_USB_ONBOARD_HUB is not set # # USB Physical Layer drivers # CONFIG_USB_PHY=y CONFIG_NOP_USB_XCEIV=y # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set # CONFIG_USB_ULPI is not set # end of USB Physical Layer drivers # CONFIG_USB_GADGET is not set # CONFIG_TYPEC is not set CONFIG_USB_ROLE_SWITCH=y CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y CONFIG_PWRSEQ_SIMPLE=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_BCM2835_MMC is not set CONFIG_MMC_BCM2835_SDHOST=y # CONFIG_MMC_DEBUG is not set # CONFIG_MMC_ARMMMCI is not set CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_IO_ACCESSORS=y # CONFIG_MMC_SDHCI_PCI is not set CONFIG_MMC_SDHCI_PLTFM=y # CONFIG_MMC_SDHCI_OF_ARASAN is not set # CONFIG_MMC_SDHCI_OF_AT91 is not set CONFIG_MMC_SDHCI_OF_DWCMSHC=m # CONFIG_MMC_SDHCI_CADENCE is not set # CONFIG_MMC_SDHCI_F_SDH30 is not set # CONFIG_MMC_SDHCI_MILBEAUT is not set CONFIG_MMC_SDHCI_IPROC=y # CONFIG_MMC_TIFM_SD is not set # CONFIG_MMC_SPI is not set # CONFIG_MMC_CB710 is not set # CONFIG_MMC_VIA_SDMMC is not set # CONFIG_MMC_DW is not set # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_REALTEK_USB=m CONFIG_MMC_CQHCI=y # CONFIG_MMC_HSQ is not set # CONFIG_MMC_TOSHIBA_PCI is not set # CONFIG_MMC_BCM2835 is not set # CONFIG_MMC_MTK is not set CONFIG_MMC_SDHCI_BRCMSTB=y # CONFIG_MMC_SDHCI_XENON is not set # CONFIG_MMC_SDHCI_OMAP is not set # CONFIG_MMC_SDHCI_AM654 is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y CONFIG_LEDS_CLASS_FLASH=y # CONFIG_LEDS_CLASS_MULTICOLOR is not set # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_AW2013 is not set # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_EL15203000 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP50XX is not set # CONFIG_LEDS_LP55XX_COMMON is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set CONFIG_LEDS_PWM=y # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_SYSCON is not set # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_SPI_BYTE is not set # CONFIG_LEDS_TI_LMU_COMMON is not set # # Flash and Torch LED drivers # # CONFIG_LEDS_AAT1290 is not set # CONFIG_LEDS_AS3645A is not set # CONFIG_LEDS_KTD2692 is not set # CONFIG_LEDS_LM3601X is not set # CONFIG_LEDS_RT4505 is not set # CONFIG_LEDS_RT8515 is not set # CONFIG_LEDS_SGM3140 is not set # # RGB LED drivers # # # LED Triggers # CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_BACKLIGHT=y CONFIG_LEDS_TRIGGER_CPU=y # CONFIG_LEDS_TRIGGER_ACTIVITY is not set CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # # iptables trigger is under Netfilter config (LED target) # CONFIG_LEDS_TRIGGER_TRANSIENT=y CONFIG_LEDS_TRIGGER_CAMERA=y CONFIG_LEDS_TRIGGER_INPUT=y # CONFIG_LEDS_TRIGGER_PANIC is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set # CONFIG_LEDS_TRIGGER_AUDIO is not set # CONFIG_LEDS_TRIGGER_TTY is not set CONFIG_LEDS_TRIGGER_ACTPWR=y # # Simple LED drivers # # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_SUPPORT=y # CONFIG_EDAC is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # I2C RTC drivers # # CONFIG_RTC_DRV_ABB5ZES3 is not set # CONFIG_RTC_DRV_ABEOZ9 is not set CONFIG_RTC_DRV_ABX80X=m CONFIG_RTC_DRV_RPI=y CONFIG_RTC_DRV_BRCMSTB=y CONFIG_RTC_DRV_DS1307=m # CONFIG_RTC_DRV_DS1307_CENTURY is not set # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_HYM8563 is not set # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_NCT3018Y is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set CONFIG_RTC_DRV_PCF8523=m # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set CONFIG_RTC_DRV_PCF8563=m # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # 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_RV3032 is not set # CONFIG_RTC_DRV_RV8803 is not set # CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # CONFIG_RTC_DRV_DS3232=m CONFIG_RTC_DRV_DS3232_HWMON=y CONFIG_RTC_DRV_PCF2127=m # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_EFI is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_PL030 is not set # CONFIG_RTC_DRV_PL031 is not set # CONFIG_RTC_DRV_CADENCE is not set # CONFIG_RTC_DRV_FTRTC010 is not set # CONFIG_RTC_DRV_R7301 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_VIRTUAL_CHANNELS=y CONFIG_DMA_OF=y # CONFIG_ALTERA_MSGDMA is not set # CONFIG_AMBA_PL08X is not set # CONFIG_BCM_SBA_RAID is not set CONFIG_DMA_BCM2835=y CONFIG_DW_AXI_DMAC=y # CONFIG_FSL_EDMA is not set # CONFIG_FSL_QDMA is not set # CONFIG_INTEL_IDMA64 is not set # CONFIG_MV_XOR_V2 is not set # CONFIG_PL330_DMA is not set # CONFIG_PLX_DMA is not set # CONFIG_DMA_BCM2708 is not set # CONFIG_XILINX_DMA is not set # CONFIG_XILINX_ZYNQMP_DMA is not set # CONFIG_XILINX_ZYNQMP_DPDMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set # CONFIG_DW_DMAC is not set # CONFIG_DW_DMAC_PCI is not set # CONFIG_DW_EDMA is not set # CONFIG_DW_EDMA_PCIE is not set # CONFIG_SF_PDMA is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set CONFIG_DMABUF_HEAPS=y # CONFIG_DMABUF_SYSFS_STATS is not set CONFIG_DMABUF_HEAPS_SYSTEM=y CONFIG_DMABUF_HEAPS_CMA=y # end of DMABUF options # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set # CONFIG_VIRTIO_MENU is not set # CONFIG_VDPA is not set CONFIG_VHOST_MENU=y # CONFIG_VHOST_NET is not set # CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set # # Microsoft Hyper-V guest support # # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_RTL8192U is not set # CONFIG_RTLLIB is not set CONFIG_RTL8723BS=m CONFIG_R8712U=m CONFIG_R8188EU=m # CONFIG_RTS5208 is not set # CONFIG_VT6655 is not set CONFIG_VT6656=m # CONFIG_FB_SM750 is not set CONFIG_STAGING_MEDIA=y # CONFIG_VIDEO_MAX96712 is not set CONFIG_VIDEO_RPIVID=m # CONFIG_STAGING_MEDIA_DEPRECATED is not set # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_FB_TFT is not set # CONFIG_KS7010 is not set # CONFIG_BCM_VIDEOCORE is not set # CONFIG_PI433 is not set # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_FIELDBUS_DEV is not set # CONFIG_QLGE is not set # CONFIG_VME_BUS is not set # CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set CONFIG_SURFACE_PLATFORMS=y CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Clock driver for ARM Reference designs # # CONFIG_CLK_ICST is not set # CONFIG_CLK_SP810 is not set # end of Clock driver for ARM Reference designs # CONFIG_LMK04832 is not set # CONFIG_COMMON_CLK_MAX9485 is not set CONFIG_COMMON_CLK_RP1=y CONFIG_COMMON_CLK_RP1_SDIO=y CONFIG_COMMON_CLK_HIFIBERRY_DACPLUSHD=m CONFIG_COMMON_CLK_HIFIBERRY_DACPRO=m # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set # CONFIG_COMMON_CLK_AXI_CLKGEN is not set # CONFIG_COMMON_CLK_XGENE is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_RS9_PCIE is not set # CONFIG_COMMON_CLK_VC5 is not set # CONFIG_COMMON_CLK_VC7 is not set # CONFIG_COMMON_CLK_FIXED_MMIO is not set CONFIG_CLK_BCM2711_DVP=y CONFIG_CLK_BCM2835=y CONFIG_CLK_RASPBERRYPI=y # CONFIG_XILINX_VCU is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set # CONFIG_HWSPINLOCK is not set # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_PROBE=y CONFIG_CLKSRC_MMIO=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y CONFIG_FSL_ERRATUM_A008585=y CONFIG_HISILICON_ERRATUM_161010101=y CONFIG_ARM64_ERRATUM_858921=y CONFIG_ARM_TIMER_SP804=y # CONFIG_MICROCHIP_PIT64B is not set # end of Clock Source drivers CONFIG_MAILBOX=y # CONFIG_ARM_MHU is not set # CONFIG_ARM_MHU_V2 is not set # CONFIG_PLATFORM_MHU is not set # CONFIG_PL320_MBOX is not set # CONFIG_ALTERA_MBOX is not set CONFIG_BCM2835_MBOX=y # CONFIG_MAILBOX_TEST is not set CONFIG_IOMMU_IOVA=y CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # # CONFIG_IOMMU_IO_PGTABLE_LPAE is not set # CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set # CONFIG_IOMMU_IO_PGTABLE_DART is not set # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set CONFIG_IOMMU_DEFAULT_DMA_STRICT=y # CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_OF_IOMMU=y CONFIG_IOMMU_DMA=y # CONFIG_ARM_SMMU is not set # CONFIG_ARM_SMMU_V3 is not set CONFIG_BCM2712_IOMMU=y # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # end of Remoteproc drivers # # Rpmsg drivers # # CONFIG_RPMSG_QCOM_GLINK_RPM is not set # CONFIG_RPMSG_VIRTIO is not set # end of Rpmsg drivers # CONFIG_SOUNDWIRE is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # end of Amlogic SoC drivers # # Broadcom SoC drivers # CONFIG_BCM2835_POWER=y CONFIG_RASPBERRYPI_POWER=y CONFIG_SOC_BRCMSTB=y CONFIG_BRCMSTB_PM=y # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # CONFIG_QUICC_ENGINE is not set # end of NXP/Freescale QorIQ SoC drivers # # fujitsu SoC drivers # # end of fujitsu SoC drivers # # i.MX SoC drivers # # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # CONFIG_LITEX_SOC_CONTROLLER is not set # end of Enable LiteX SoC Builder specific drivers # # Qualcomm SoC drivers # # end of Qualcomm SoC drivers # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers # CONFIG_PM_DEVFREQ is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_FSA9480 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 # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_DEBUG is not set # CONFIG_PWM_ATMEL_TCB is not set CONFIG_PWM_BCM2835=m CONFIG_PWM_BRCMSTB=y # CONFIG_PWM_CLK is not set # CONFIG_PWM_DWC is not set # CONFIG_PWM_FSL_FTM is not set # CONFIG_PWM_PCA9685 is not set CONFIG_PWM_RASPBERRYPI_POE=m CONFIG_PWM_RP1=y # CONFIG_PWM_XILINX is not set # # IRQ chip support # CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 CONFIG_ARM_GIC_V2M=y CONFIG_ARM_GIC_V3=y CONFIG_ARM_GIC_V3_ITS=y CONFIG_ARM_GIC_V3_ITS_PCI=y # CONFIG_AL_FIC is not set CONFIG_BCM2712_MIP=y CONFIG_BCM7038_L1_IRQ=y CONFIG_BCM7120_L2_IRQ=y CONFIG_BRCMSTB_L2_IRQ=y # CONFIG_XILINX_INTC is not set CONFIG_PARTITION_PERCPU=y # end of IRQ chip support # CONFIG_IPACK_BUS is not set CONFIG_ARCH_HAS_RESET_CONTROLLER=y CONFIG_RESET_CONTROLLER=y CONFIG_RESET_BRCMSTB=y CONFIG_RESET_BRCMSTB_RESCAL=y CONFIG_RESET_RASPBERRYPI=y CONFIG_RESET_SIMPLE=y # CONFIG_RESET_TI_SYSCON is not set # CONFIG_RESET_TI_TPS380X is not set # # PHY Subsystem # CONFIG_GENERIC_PHY=y CONFIG_GENERIC_PHY_MIPI_DPHY=y # CONFIG_PHY_XGENE is not set # CONFIG_PHY_CAN_TRANSCEIVER is not set # # PHY drivers for Broadcom platforms # # CONFIG_BCM_KONA_USB2_PHY is not set # CONFIG_PHY_BRCM_SATA is not set CONFIG_PHY_BRCM_USB=y # end of PHY drivers for Broadcom platforms # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_DPHY_RX is not set # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_CADENCE_SALVO is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_LAN966X_SERDES is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set # CONFIG_PHY_OCELOT_SERDES is not set # CONFIG_PHY_SAMSUNG_USB2 is not set # end of PHY Subsystem # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCI_PMU is not set # CONFIG_ARM_CCN is not set # CONFIG_ARM_CMN is not set CONFIG_ARM_PMU=y # CONFIG_ARM_DSU_PMU is not set # CONFIG_ARM_SPE_PMU is not set CONFIG_RPI_AXIPERF=m # CONFIG_HISI_PCIE_PMU is not set # CONFIG_HNS3_PMU is not set # end of Performance monitor support CONFIG_RAS=y # CONFIG_USB4 is not set # # Android # # CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_LIBNVDIMM is not set # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y CONFIG_NVMEM_RMEM=m # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # CONFIG_HISI_PTT is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_FSI is not set # CONFIG_TEE is not set CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set # CONFIG_PECI is not set # CONFIG_HTE is not set # end of Device Drivers # # 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 CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=m CONFIG_XFS_SUPPORT_V4=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_ONLINE_SCRUB is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_BTRFS_FS_REF_VERIFY is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y # CONFIG_QUOTA is not set CONFIG_AUTOFS4_FS=y CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=m # CONFIG_CUSE is not set # CONFIG_VIRTIO_FS is not set CONFIG_OVERLAY_FS=m # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_XINO_AUTO is not set # CONFIG_OVERLAY_FS_METACOPY is not set # # Caches # CONFIG_NETFS_SUPPORT=y # CONFIG_NETFS_STATS is not set CONFIG_FSCACHE=y # CONFIG_FSCACHE_STATS is not set # CONFIG_FSCACHE_DEBUG is not set # CONFIG_CACHEFILES is not set # end of Caches # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=y # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=m CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set CONFIG_NTFS3_FS=m # CONFIG_NTFS3_64BIT_CLUSTER is not set # CONFIG_NTFS3_LZX_XPRESS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_TMPFS_INODE64 is not set CONFIG_ARCH_SUPPORTS_HUGETLBFS=y # CONFIG_HUGETLBFS is not set CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=y CONFIG_EFIVAR_FS=m # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set CONFIG_HFS_FS=y CONFIG_HFSPLUS_FS=y # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y # CONFIG_SQUASHFS_FILE_CACHE is not set CONFIG_SQUASHFS_FILE_DIRECT=y # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 CONFIG_PSTORE_DEFLATE_COMPRESS=y # CONFIG_PSTORE_LZO_COMPRESS is not set # CONFIG_PSTORE_LZ4_COMPRESS is not set # CONFIG_PSTORE_LZ4HC_COMPRESS is not set # CONFIG_PSTORE_842_COMPRESS is not set # CONFIG_PSTORE_ZSTD_COMPRESS is not set CONFIG_PSTORE_COMPRESS=y CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" CONFIG_PSTORE_CONSOLE=y # CONFIG_PSTORE_PMSG is not set # CONFIG_PSTORE_FTRACE is not set CONFIG_PSTORE_RAM=y # CONFIG_PSTORE_BLK is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y CONFIG_NFS_SWAP=y CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=m CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" CONFIG_NFS_V4_1_MIGRATION=y CONFIG_ROOT_NFS=y CONFIG_NFS_FSCACHE=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFS_DISABLE_UDP_SUPPORT=y # CONFIG_NFS_V4_2_READ_PLUS is not set # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_COMMON=y CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y CONFIG_SUNRPC_SWAP=y CONFIG_RPCSEC_GSS_KRB5=m # CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES is not set # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS2=y CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set CONFIG_CIFS_DEBUG=y # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DEBUG_DUMP_KEYS is not set # CONFIG_CIFS_DFS_UPCALL is not set # CONFIG_CIFS_SWN_UPCALL is not set CONFIG_CIFS_FSCACHE=y # CONFIG_CIFS_ROOT is not set # CONFIG_SMB_SERVER is not set CONFIG_SMBFS=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEY_DH_OPERATIONS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_LSM="yama,loadpin,safesetid,integrity" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_STACK_ALL_PATTERN is not set # CONFIG_INIT_STACK_ALL_ZERO is not set # CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization CONFIG_RANDSTRUCT_NONE=y # CONFIG_RANDSTRUCT_FULL is not set # CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set # end of Crypto core or helper # # Public-key cryptography # CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y # CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set CONFIG_CRYPTO_ECC=m CONFIG_CRYPTO_ECDH=m # CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set # end of Public-key cryptography # # Block ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set CONFIG_CRYPTO_SM4=m # CONFIG_CRYPTO_SM4_GENERIC is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CFB=m CONFIG_CRYPTO_CTR=y CONFIG_CRYPTO_CTS=m CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set CONFIG_CRYPTO_OFB=m # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # end of Length-preserving ciphers and modes # # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y # CONFIG_CRYPTO_ESSIV is not set # end of AEAD (authenticated encryption with associated data) ciphers # # Hashes, digests, and MACs # CONFIG_CRYPTO_BLAKE2B=m CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y CONFIG_CRYPTO_SHA3=m CONFIG_CRYPTO_SM3=m # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_XCBC is not set CONFIG_CRYPTO_XXHASH=m # end of Hashes, digests, and MACs # # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y # CONFIG_CRYPTO_CRCT10DIF is not set # end of CRCs (cyclic redundancy checks) # # Compression # CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_LZO=m # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # end of Compression # # Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation # # Userspace interface # CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set # CONFIG_CRYPTO_USER_API_AEAD is not set CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y # CONFIG_CRYPTO_NHPOLY1305_NEON is not set CONFIG_CRYPTO_CHACHA20_NEON=m # # Accelerated Cryptographic Algorithms for CPU (arm64) # CONFIG_CRYPTO_GHASH_ARM64_CE=m CONFIG_CRYPTO_POLY1305_NEON=m CONFIG_CRYPTO_SHA1_ARM64_CE=m CONFIG_CRYPTO_SHA256_ARM64=m CONFIG_CRYPTO_SHA2_ARM64_CE=m CONFIG_CRYPTO_SHA512_ARM64=m CONFIG_CRYPTO_SHA512_ARM64_CE=m CONFIG_CRYPTO_SHA3_ARM64=m # CONFIG_CRYPTO_SM3_NEON is not set CONFIG_CRYPTO_SM3_ARM64_CE=m # CONFIG_CRYPTO_POLYVAL_ARM64_CE is not set CONFIG_CRYPTO_AES_ARM64=y CONFIG_CRYPTO_AES_ARM64_CE=m CONFIG_CRYPTO_AES_ARM64_CE_BLK=m CONFIG_CRYPTO_AES_ARM64_NEON_BLK=m CONFIG_CRYPTO_AES_ARM64_BS=m CONFIG_CRYPTO_SM4_ARM64_CE=m # CONFIG_CRYPTO_SM4_ARM64_CE_BLK is not set # CONFIG_CRYPTO_SM4_ARM64_NEON_BLK is not set CONFIG_CRYPTO_AES_ARM64_CE_CCM=m # end of Accelerated Cryptographic Algorithms for CPU (arm64) # CONFIG_CRYPTO_HW is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS8_PRIVATE_KEY_PARSER=m CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m CONFIG_RAID6_PQ_BENCHMARK=y CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_CORDIC=m # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y # CONFIG_INDIRECT_PIO is not set # CONFIG_TRACE_MMIO_ACCESS is not set # # Crypto library routines # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=m CONFIG_CRYPTO_LIB_CHACHA_GENERIC=m CONFIG_CRYPTO_LIB_CHACHA=m CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m CONFIG_CRYPTO_LIB_CURVE25519=m CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m CONFIG_CRYPTO_LIB_POLY1305=m CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_CRC_CCITT=m CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC64_ROCKSOFT is not set CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=m # CONFIG_CRC8 is not set CONFIG_XXHASH=y CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=m CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=m CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set # CONFIG_XZ_DEC_IA64 is not set # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set # CONFIG_XZ_DEC_MICROLZMA is not set # CONFIG_XZ_DEC_TEST is not set CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_DMA_DECLARE_COHERENT=y CONFIG_ARCH_HAS_SETUP_DMA_OPS=y CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y CONFIG_SWIOTLB=y # CONFIG_DMA_RESTRICTED_POOL is not set CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_COHERENT_POOL=y CONFIG_DMA_DIRECT_REMAP=y CONFIG_DMA_CMA=y # CONFIG_DMA_PERNUMA_CMA is not set # # Default contiguous memory area size: # CONFIG_CMA_SIZE_MBYTES=5 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_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y # CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_DIMLIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_UCS2_STRING=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_TIME_NS=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_ARCH_STACKWALK=y CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y # end of Library routines CONFIG_GENERIC_IOREMAP=y CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set # CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Compile-time checks and compiler options # CONFIG_AS_HAS_NON_CONST_LEB128=y CONFIG_DEBUG_INFO_NONE=y # CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=2048 CONFIG_STRIP_ASM_SYMS=y # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y # CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set CONFIG_HAVE_ARCH_KCSAN=y CONFIG_HAVE_KCSAN_COMPILER=y # CONFIG_KCSAN is not set # end of Generic Kernel Debugging Instruments # # Networking Debugging # # CONFIG_NET_DEV_REFCNT_TRACKER is not set # CONFIG_NET_NS_REFCNT_TRACKER is not set # CONFIG_DEBUG_NET is not set # end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_DEBUG_ON 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 CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_PTDUMP_DEBUGFS is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM_PGTABLE is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y CONFIG_HAVE_ARCH_KASAN_HW_TAGS=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_KASAN_SW_TAGS=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y # CONFIG_KFENCE is not set # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 # CONFIG_SOFTLOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # # CONFIG_SCHED_DEBUG is not set # CONFIG_SCHEDSTATS is not set # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_LATENCYTOP is not set CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACER_MAX_TRACE=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_RING_BUFFER_ALLOW_SWAP=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y CONFIG_BOOTTIME_TRACING=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y CONFIG_DYNAMIC_FTRACE=y CONFIG_DYNAMIC_FTRACE_WITH_REGS=y # CONFIG_FUNCTION_PROFILER is not set CONFIG_STACK_TRACER=y # CONFIG_IRQSOFF_TRACER is not set # CONFIG_SCHED_TRACER is not set # CONFIG_HWLAT_TRACER is not set # CONFIG_OSNOISE_TRACER is not set # CONFIG_TIMERLAT_TRACER is not set # CONFIG_FTRACE_SYSCALLS is not set CONFIG_TRACER_SNAPSHOT=y CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set CONFIG_BLK_DEV_IO_TRACE=y CONFIG_KPROBE_EVENTS=y # CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set # CONFIG_UPROBE_EVENTS is not set CONFIG_BPF_EVENTS=y CONFIG_DYNAMIC_EVENTS=y CONFIG_PROBE_EVENTS=y # CONFIG_BPF_KPROBE_OVERRIDE is not set CONFIG_FTRACE_MCOUNT_RECORD=y CONFIG_FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY=y # CONFIG_SYNTH_EVENTS is not set # CONFIG_HIST_TRIGGERS is not set # CONFIG_TRACE_EVENT_INJECT is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_TRACE_EVAL_MAP_FILE is not set # CONFIG_FTRACE_RECORD_RECURSION is not set # CONFIG_FTRACE_STARTUP_TEST is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set # CONFIG_PREEMPTIRQ_DELAY_TEST is not set # CONFIG_KPROBE_EVENT_GEN_TEST is not set # CONFIG_RV is not set # CONFIG_SAMPLES is not set # CONFIG_STRICT_DEVMEM is not set # # arm64 Debugging # # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_ARM64_RELOC_TEST is not set # CONFIG_CORESIGHT is not set # end of arm64 Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set CONFIG_FUNCTION_ERROR_INJECTION=y # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_RUNTIME_TESTING_MENU is not set CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage # # Rust hacking # # end of Rust hacking # end of Kernel hacking ================================================ FILE: projects/RPi/devices/RPi5/options ================================================ ################################################################################ # Device defaults ################################################################################ # NOOBS supported hex versions (legacy) is not relevant for RPi4 unset NOOBS_HEX # NOOBS supported model versions NOOBS_SUPPORTED_MODELS='"Pi 5"' # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) FIRMWARE="${FIRMWARE} rpi-eeprom flashrom" # set the addon project ADDON_PROJECT="ARMv8" # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) TARGET_CPU="cortex-a76" TARGET_CPU_FLAGS="+crc+crypto" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_KERNEL_PATCH_ARCH="aarch64" TARGET_FLOAT="hard" # cortex-a72 caused issues in the past, so use a53 TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc+crypto" TARGET_FPU="neon-fp-armv8" ;; esac # Kernel target KERNEL_TARGET="Image" # debug tty path DEBUG_TTY="/dev/ttyAMA10" # serial console EXTRA_CMDLINE="console=ttyAMA10,115200 console=tty0" ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0001-broadcom-cle-clif-common-simulator-add-7.1-version-o.patch ================================================ From f62aa2640f92796ff5216da0a5d3c8f46a2855b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Mon, 26 Apr 2021 00:02:21 +0200 Subject: [PATCH 001/142] broadcom(cle,clif,common,simulator): add 7.1 version on the list of versions to build This adds 7.1 to the list of available V3D_VERSION, and first changes on the simulator needed to get it working. Note that we needed to touch all those 4 codebases because it is needed if we want to use V3D_DEBUG=clif with the simulator, that it is the easier way to see which packets a vulkan program is using. About the simulator, this commit only handle the rename of some registers. Any additional changes needed to get a proper support for v71 will be handled them on following commits. --- src/broadcom/cle/meson.build | 3 +- src/broadcom/cle/v3dx_pack.h | 2 + src/broadcom/clif/clif_private.h | 2 + src/broadcom/common/v3d_device_info.c | 1 + src/broadcom/common/v3d_macros.h | 3 + src/broadcom/meson.build | 2 +- src/broadcom/simulator/v3d_simulator.c | 81 +++++++++++++++++++------ src/broadcom/simulator/v3d_simulator.h | 5 ++ src/broadcom/simulator/v3dx_simulator.c | 31 ++++++++-- 9 files changed, 106 insertions(+), 24 deletions(-) diff --git a/src/broadcom/cle/meson.build b/src/broadcom/cle/meson.build index 31a0d5bfa94..8ac32b313e4 100644 --- a/src/broadcom/cle/meson.build +++ b/src/broadcom/cle/meson.build @@ -23,7 +23,8 @@ v3d_versions = [ [21, 21], [33, 33], [41, 33], - [42, 33] + [42, 33], + [71, 33] ] v3d_xml_files = [] diff --git a/src/broadcom/cle/v3dx_pack.h b/src/broadcom/cle/v3dx_pack.h index 5762e5aaa70..e5a1eb26698 100644 --- a/src/broadcom/cle/v3dx_pack.h +++ b/src/broadcom/cle/v3dx_pack.h @@ -37,6 +37,8 @@ # include "cle/v3d_packet_v41_pack.h" #elif (V3D_VERSION == 42) # include "cle/v3d_packet_v42_pack.h" +#elif (V3D_VERSION == 71) +# include "cle/v3d_packet_v71_pack.h" #else # error "Need to add a pack header include for this v3d version" #endif diff --git a/src/broadcom/clif/clif_private.h b/src/broadcom/clif/clif_private.h index 6ace62b0310..cda407a00bf 100644 --- a/src/broadcom/clif/clif_private.h +++ b/src/broadcom/clif/clif_private.h @@ -101,6 +101,8 @@ bool v3d41_clif_dump_packet(struct clif_dump *clif, uint32_t offset, const uint8_t *cl, uint32_t *size, bool reloc_mode); bool v3d42_clif_dump_packet(struct clif_dump *clif, uint32_t offset, const uint8_t *cl, uint32_t *size, bool reloc_mode); +bool v3d71_clif_dump_packet(struct clif_dump *clif, uint32_t offset, + const uint8_t *cl, uint32_t *size, bool reloc_mode); static inline void out(struct clif_dump *clif, const char *fmt, ...) diff --git a/src/broadcom/common/v3d_device_info.c b/src/broadcom/common/v3d_device_info.c index 272190eb2e5..7e0862f1f02 100644 --- a/src/broadcom/common/v3d_device_info.c +++ b/src/broadcom/common/v3d_device_info.c @@ -66,6 +66,7 @@ v3d_get_device_info(int fd, struct v3d_device_info* devinfo, v3d_ioctl_fun drm_i case 33: case 41: case 42: + case 71: break; default: fprintf(stderr, diff --git a/src/broadcom/common/v3d_macros.h b/src/broadcom/common/v3d_macros.h index fe89398208a..b4291fb5350 100644 --- a/src/broadcom/common/v3d_macros.h +++ b/src/broadcom/common/v3d_macros.h @@ -41,6 +41,9 @@ #elif (V3D_VERSION == 42) # define V3DX(x) V3D42_##x # define v3dX(x) v3d42_##x +#elif (V3D_VERSION == 71) +# define V3DX(x) V3D71_##x +# define v3dX(x) v3d71_##x #else # error "Need to add prefixing macros for this v3d version" #endif diff --git a/src/broadcom/meson.build b/src/broadcom/meson.build index 2c10e46b188..73cb7aa0575 100644 --- a/src/broadcom/meson.build +++ b/src/broadcom/meson.build @@ -22,7 +22,7 @@ inc_broadcom = include_directories('.', 'cle') subdir('cle') -v3d_versions = ['33', '41', '42'] +v3d_versions = ['33', '41', '42', '71'] v3d_libs = [] if with_gallium_v3d or with_broadcom_vk diff --git a/src/broadcom/simulator/v3d_simulator.c b/src/broadcom/simulator/v3d_simulator.c index eea5d3f050e..5cceb1a82cc 100644 --- a/src/broadcom/simulator/v3d_simulator.c +++ b/src/broadcom/simulator/v3d_simulator.c @@ -490,10 +490,20 @@ v3d_simulator_submit_cl_ioctl(int fd, struct drm_v3d_submit_cl *submit) v3d_simulator_perfmon_switch(fd, submit->perfmon_id); - if (sim_state.ver >= 41) - v3d41_simulator_submit_cl_ioctl(sim_state.v3d, submit, file->gmp->ofs); - else - v3d33_simulator_submit_cl_ioctl(sim_state.v3d, submit, file->gmp->ofs); + switch(sim_state.ver) { + case 33: + v3d33_simulator_submit_cl_ioctl(sim_state.v3d, submit, file->gmp->ofs); + break; + case 41: + case 42: + v3d41_simulator_submit_cl_ioctl(sim_state.v3d, submit, file->gmp->ofs); + break; + case 71: + v3d71_simulator_submit_cl_ioctl(sim_state.v3d, submit, file->gmp->ofs); + break; + default: + unreachable("Unsupported V3D version\n"); + } util_dynarray_foreach(&sim_state.bin_oom, struct v3d_simulator_bo *, sim_bo) { @@ -635,10 +645,17 @@ v3d_simulator_gem_close_ioctl(int fd, struct drm_gem_close *args) static int v3d_simulator_get_param_ioctl(int fd, struct drm_v3d_get_param *args) { - if (sim_state.ver >= 41) - return v3d41_simulator_get_param_ioctl(sim_state.v3d, args); - else + switch(sim_state.ver) { + case 33: return v3d33_simulator_get_param_ioctl(sim_state.v3d, args); + case 41: + case 42: + return v3d41_simulator_get_param_ioctl(sim_state.v3d, args); + case 71: + return v3d71_simulator_get_param_ioctl(sim_state.v3d, args); + default: + unreachable("Unsupported V3D version\n"); + } } static int @@ -652,10 +669,20 @@ v3d_simulator_submit_tfu_ioctl(int fd, struct drm_v3d_submit_tfu *args) v3d_simulator_copy_in_handle(file, args->bo_handles[2]); v3d_simulator_copy_in_handle(file, args->bo_handles[3]); - if (sim_state.ver >= 41) - ret = v3d41_simulator_submit_tfu_ioctl(sim_state.v3d, args); - else + switch(sim_state.ver) { + case 33: ret = v3d33_simulator_submit_tfu_ioctl(sim_state.v3d, args); + break; + case 41: + case 42: + ret = v3d41_simulator_submit_tfu_ioctl(sim_state.v3d, args); + break; + case 71: + ret = v3d71_simulator_submit_tfu_ioctl(sim_state.v3d, args); + break; + default: + unreachable("Unsupported V3D version\n"); + } v3d_simulator_copy_out_handle(file, args->bo_handles[0]); @@ -682,11 +709,19 @@ v3d_simulator_submit_csd_ioctl(int fd, struct drm_v3d_submit_csd *args) v3d_simulator_perfmon_switch(fd, args->perfmon_id); - if (sim_state.ver >= 41) - ret = v3d41_simulator_submit_csd_ioctl(sim_state.v3d, args, - file->gmp->ofs); - else - ret = -1; + switch(sim_state.ver) { + case 41: + case 42: + ret = v3d41_simulator_submit_csd_ioctl(sim_state.v3d, args, + file->gmp->ofs); + break; + case 71: + ret = v3d71_simulator_submit_csd_ioctl(sim_state.v3d, args, + file->gmp->ofs); + break; + default: + ret = -1; + } for (int i = 0; i < args->bo_handle_count; i++) v3d_simulator_copy_out_handle(file, bo_handles[i]); @@ -880,10 +915,20 @@ v3d_simulator_init_global() util_dynarray_init(&sim_state.bin_oom, NULL); - if (sim_state.ver >= 41) - v3d41_simulator_init_regs(sim_state.v3d); - else + switch(sim_state.ver) { + case 33: v3d33_simulator_init_regs(sim_state.v3d); + break; + case 41: + case 42: + v3d41_simulator_init_regs(sim_state.v3d); + break; + case 71: + v3d71_simulator_init_regs(sim_state.v3d); + break; + default: + unreachable("Not supported V3D version\n"); + } } struct v3d_simulator_file * diff --git a/src/broadcom/simulator/v3d_simulator.h b/src/broadcom/simulator/v3d_simulator.h index ddb079c1455..1472c313a03 100644 --- a/src/broadcom/simulator/v3d_simulator.h +++ b/src/broadcom/simulator/v3d_simulator.h @@ -52,6 +52,11 @@ uint32_t v3d_simulator_get_mem_free(void); # define v3dX(x) v3d41_##x # include "v3dx_simulator.h" # undef v3dX + +# define v3dX(x) v3d71_##x +# include "v3dx_simulator.h" +# undef v3dX + #endif #endif diff --git a/src/broadcom/simulator/v3dx_simulator.c b/src/broadcom/simulator/v3dx_simulator.c index c9322f0397b..723796b16c9 100644 --- a/src/broadcom/simulator/v3dx_simulator.c +++ b/src/broadcom/simulator/v3dx_simulator.c @@ -46,11 +46,15 @@ #define HW_REGISTER_RO(x) (x) #define HW_REGISTER_RW(x) (x) -#if V3D_VERSION >= 41 +#if V3D_VERSION == 71 +#include "libs/core/v3d/registers/7.1.5.1/v3d.h" +#else +#if V3D_VERSION == 41 || V3D_VERSION == 42 #include "libs/core/v3d/registers/4.1.35.0/v3d.h" #else #include "libs/core/v3d/registers/3.3.0.0/v3d.h" #endif +#endif #define V3D_WRITE(reg, val) v3d_hw_write_reg(v3d, reg, val) #define V3D_READ(reg) v3d_hw_read_reg(v3d, reg) @@ -310,16 +314,17 @@ v3d_isr_core(struct v3d_hw *v3d, return; } +#if V3D_VERSION <= 42 if (core_status & V3D_CTL_0_INT_STS_INT_GMPV_SET) { fprintf(stderr, "GMP violation at 0x%08x\n", V3D_READ(V3D_GMP_VIO_ADDR)); - abort(); } else { fprintf(stderr, "Unexpected ISR with core status 0x%08x\n", core_status); } abort(); +#endif } static void @@ -396,6 +401,18 @@ v3d_isr_hub(struct v3d_hw *v3d) } handle_mmu_interruptions(v3d, hub_status); + +#if V3D_VERSION == 71 + if (hub_status & V3D_HUB_CTL_INT_STS_INT_GMPV_SET) { + fprintf(stderr, "GMP violation at 0x%08x\n", + V3D_READ(V3D_GMP_VIO_ADDR)); + } else { + fprintf(stderr, + "Unexpected ISR with status 0x%08x\n", + hub_status); + } + abort(); +#endif } static void @@ -436,8 +453,11 @@ v3dX(simulator_init_regs)(struct v3d_hw *v3d) * for tracing. Perhaps we should evaluate to do the same here and add * some debug options. */ - uint32_t core_interrupts = (V3D_CTL_0_INT_STS_INT_GMPV_SET | - V3D_CTL_0_INT_STS_INT_OUTOMEM_SET); + uint32_t core_interrupts = V3D_CTL_0_INT_STS_INT_OUTOMEM_SET; +#if V3D_VERSION <= 42 + core_interrupts |= V3D_CTL_0_INT_STS_INT_GMPV_SET; +#endif + V3D_WRITE(V3D_CTL_0_INT_MSK_SET, ~core_interrupts); V3D_WRITE(V3D_CTL_0_INT_MSK_CLR, core_interrupts); @@ -447,6 +467,9 @@ v3dX(simulator_init_regs)(struct v3d_hw *v3d) V3D_HUB_CTL_INT_STS_INT_MMU_CAP_SET | /* CAP exceeded */ V3D_HUB_CTL_INT_STS_INT_TFUC_SET); /* TFU conversion */ +#if V3D_VERSION == 71 + hub_interrupts |= V3D_HUB_CTL_INT_STS_INT_GMPV_SET; +#endif V3D_WRITE(V3D_HUB_CTL_INT_MSK_SET, ~hub_interrupts); V3D_WRITE(V3D_HUB_CTL_INT_MSK_CLR, hub_interrupts); -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0002-broadcom-simulator-reset-CFG7-for-compute-dispatch-i.patch ================================================ From 9e85edd1b347b0e779b393f463f42044a720bcff Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 28 Sep 2021 13:16:49 +0200 Subject: [PATCH 002/142] broadcom/simulator: reset CFG7 for compute dispatch in v71 This register is new in 7.x, it doesn't seem that we need to do anything specific for now, but let's make sure it is reset every time. --- src/broadcom/simulator/v3dx_simulator.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/broadcom/simulator/v3dx_simulator.c b/src/broadcom/simulator/v3dx_simulator.c index 723796b16c9..f23b0538de3 100644 --- a/src/broadcom/simulator/v3dx_simulator.c +++ b/src/broadcom/simulator/v3dx_simulator.c @@ -227,6 +227,9 @@ v3dX(simulator_submit_csd_ioctl)(struct v3d_hw *v3d, V3D_WRITE(V3D_CSD_0_QUEUED_CFG4, args->cfg[4]); V3D_WRITE(V3D_CSD_0_QUEUED_CFG5, args->cfg[5]); V3D_WRITE(V3D_CSD_0_QUEUED_CFG6, args->cfg[6]); +#if V3D_VERSION >= 71 + V3D_WRITE(V3D_CSD_0_QUEUED_CFG7, 0); +#endif /* CFG0 kicks off the job */ V3D_WRITE(V3D_CSD_0_QUEUED_CFG0, args->cfg[0]); -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0003-broadcom-cle-update-the-packet-definitions-for-new-g.patch ================================================ From 6f744bc4bec98f9769486d427e8e2d4e314ae056 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Tue, 29 Jun 2021 12:03:24 +0200 Subject: [PATCH 003/142] broadcom/cle: update the packet definitions for new generation v71 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Using as reference the spec for 7.1.5. This include totally new packets, and redefine some that already existed on v42. Full list: * Add Depth Bounds Test Limits * Redefine Tile Binning Mode Cfg * Redefine Cfg Bits. There are some changes on the fields: * Line Rasterization is now 1 bit size * Depth Bounds Enable (that takes one of the bits of Line Rasterization) * Early-Z/Early-Z updates enable bits (16-17) figure now as reserved. * New Z-Clipping mode field * Redefine Tile Rendering Mode Cfg (Common). Changes with respect to v42: * New log2 tile height/width fields starting at bit 52/55 * Due those two news, end pad is smaller * sub-id has now a size of 3. Bit 4 is reserved. * Number of render targets: this field max value is now 7 (not reflected on the xml). * Maximum BPP is removed on v71 (now bits 40-41 are reserved) * Depth Buffer disable: on bit 44 * Update Store Tile Buffer General * Adding Cfg Render Target Part1/2/3 packets: they replace v4X "Tile Rendering Mode Cfg (Color)" (real name "Rendering Configuration (Render Targets Config)"), "Tile Rendering Mode Cfg (Clear Colors Part1)", "Tile Rendering Mode Cfg (Clear Colors Part2)", and "Tile Rendering Mode Cfg (Clear Colors Part3)". On those old versions, the first packet is used to configure 4 render targets. Now that 8 are supported, invididual per-render-target are used. * Update ZS clear values packet. * Add new v71 output formats * Define Clear Render Targets (Replaces Clear Tile Buffers from v42) * Redefine GL Shader State Record. Changes copared with v42: * Fields removed: * "Coordinate shader has separate input and output VPM blocks" (reserved bit now) * "Vertex shader has separate input and output VPM blocks" (reserved bit now) * "Address of table of default attribute Values." (we needed to change the start position for all the following fields) * New field: * "Never defer FEP depth writes to fragment shader auto Z writes on scoreboard conflict" * Redefine clipper xy scaling: Now it uses 1/64ths of pixels, instead of 1/256ths * Update texture shader state. * Notice we don't use an address type for these fields in the XML description. This is because the addresses are 64-bit aligned (even though the PRM doesn't say it) which means the 6 LSB bits are implicitly 0, but the fields are encoded before the 6th bit of their starting byte, so we can't use the usual trick we do with address types where the first 6 bits in the byte are implicitly overwritten by other fields and we have to encode this manually as a uint field. This would mean that if we had an actual BO we would also need to add it manually to the job's list, but since we don't have one, we don't have to do anything about it. * Add new RB_Swap field for texture shader state * Document Cb/Cr addresses as uint fields in texture shader state * Fixup Blend Config description: we now support 8 RTs. * TMU config parameter 2 has new fields * Add new clipper Z without guardband packet in v71 * Add enums for the Z clip modes accepted in v71 * Fix texture state array stride packing for V3D 7.1.5 Signed-off-by: Iago Toral Quiroga <itoral@igalia.com> Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com> broadcom/cle: rb_swap --- src/broadcom/cle/v3d_packet_v33.xml | 386 ++++++++++++++++++++++++++-- 1 file changed, 368 insertions(+), 18 deletions(-) diff --git a/src/broadcom/cle/v3d_packet_v33.xml b/src/broadcom/cle/v3d_packet_v33.xml index a0242b5f1c2..624353ca2bf 100644 --- a/src/broadcom/cle/v3d_packet_v33.xml +++ b/src/broadcom/cle/v3d_packet_v33.xml @@ -1,4 +1,4 @@ -<vcxml gen="3.3" min_ver="33" max_ver="42"> +<vcxml gen="3.3" min_ver="33" max_ver="71"> <enum name="Compare Function" prefix="V3D_COMPARE_FUNC"> <value name="NEVER" value="0"/> @@ -167,13 +167,36 @@ <value name="depth_16" value="2"/> </enum> - <enum name="Render Target Clamp" prefix="V3D_RENDER_TARGET_CLAMP" min_ver="41"> + <enum name="Render Target Clamp" prefix="V3D_RENDER_TARGET_CLAMP" min_ver="41" max_ver="42"> <value name="none" value="0"/> <!-- no clamping --> <value name="norm" value="1"/> <!-- [0,1] for f16 --> <value name="pos" value="2"/> <!-- [0, for f16 --> <value name="int" value="3" min_ver="42"/> <!-- clamp to integer RT's range --> </enum> + <enum name="Render Target Type Clamp" prefix="V3D_RENDER_TARGET_TYPE_CLAMP" min_ver="71"> + <value name="8i" value="0"/> <!-- no clamping --> + <value name="16i" value="1"/> <!-- no clamping --> + <value name="32i" value="2"/> <!-- no clamping --> + <value name="8ui" value="4"/> <!-- no clamping --> + <value name="16ui" value="5"/> <!-- no clamping --> + <value name="32ui" value="6"/> <!-- no clamping --> + <value name="8" value="8"/> <!-- no clamping --> + <value name="16f" value="9"/> <!-- no clamping --> + <value name="32f" value="10"/> <!-- no clamping --> + <value name="8i_clamped" value="16"/> <!-- clamp to integer RT's range --> + <value name="16i_clamped" value="17"/> <!-- clamp to integer RT's range --> + <value name="32i_clamped" value="18"/> <!-- clamp to integer RT's range --> + <value name="8ui_clamped" value="20"/> <!-- clamp to integer RT's range --> + <value name="16ui_clamped" value="21"/> <!-- clamp to integer RT's range --> + <value name="32ui_clamped" value="22"/> <!-- clamp to integer RT's range --> + <value name="16f_clamp_norm" value="24"/> <!-- [0,1] for f16 --> + <value name="16f_clamp_pos" value="25"/> <!-- [0, for f16 --> + <value name="16f_clamp_pq" value="26"/> <!-- PQ lin range, colour to [0, 125], alpha to [0, 1] for f16 --> + <value name="16f_clamp_hlg" value="27"/> <!-- HLG lin range, colour to [0, 12], alpha to [0, 1] for f16 --> + <value name="invalid" value="32"/> + </enum> + <!--- CL cache flush commands are not fully documented and subject to a number of hardware issues that make them unreliable. Specifically: @@ -263,13 +286,27 @@ <value name="r8ui" value="36"/> <value name="srgbx8" value="37" max_ver="33"/> <value name="rgbx8" value="38" max_ver="33"/> - <value name="bstc" value="39" min_ver="41"/> + <value name="bstc8" value="39" min_ver="41"/> <value name="d32f" value="40" min_ver="41"/> <value name="d24" value="41" min_ver="41"/> <value name="d16" value="42" min_ver="41"/> <value name="d24s8" value="43" min_ver="41"/> <value name="s8" value="44" min_ver="41"/> <value name="rgba5551" value="45" min_ver="41"/> + <value name="bstc8_srgb" value="46" min_ver="71"/> + <value name="bstc10" value="47" min_ver="71"/> + <value name="bstc10_srgb" value="48" min_ver="71"/> + <value name="bstc10_pq" value="49" min_ver="71"/> + <value name="rgba10x6" value="50" min_ver="71"/> + <value name="bstc10_hlg" value="55" min_ver="71"/> + <value name="rgba10x6_hlg" value="56" min_ver="71"/> + <value name="rgb10_a2_hlg" value="57" min_ver="71"/> + <value name="bstc10_pq_bt1886" value="58" min_ver="71"/> + <value name="rgba10x6_pq_bt1886" value="59" min_ver="71"/> + <value name="rgb10_a2_pq_bt1886" value="60" min_ver="71"/> + <value name="bstc10_hlg_bt1886" value="61" min_ver="71"/> + <value name="rgba10x6_hlg_bt1886" value="62" min_ver="71"/> + <value name="rgb10_a2_hlg_bt1886" value="63" min_ver="71"/> </enum> <enum name="Z/S Output Image Format" prefix="V3D_OUTPUT_IMAGE_FORMAT_ZS" max_ver="33"> @@ -314,6 +351,12 @@ <value name="perp end caps" value="1"/> </enum> + <enum name="Z Clip Mode" prefix="V3D_Z_CLIP_MODE"> + <value name="NONE" value="0"/> + <value name="MIN_ONE_TO_ONE" value="1"/> + <value name="ZERO_TO_ONE" value="2"/> + </enum> + <packet code="0" name="Halt"/> <packet code="1" name="NOP"/> <packet code="4" name="Flush"/> @@ -381,11 +424,13 @@ <field name="Last Tile of Frame" size="1" start="0" type="bool"/> </packet> - <packet code="25" shortname="clear" name="Clear Tile Buffers" cl="R" min_ver="41"> + <packet code="25" shortname="clear" name="Clear Tile Buffers" cl="R" min_ver="41" max_ver="42"> <field name="Clear Z/Stencil Buffer" size="1" start="1" type="bool"/> <field name="Clear all Render Targets" size="1" start="0" type="bool"/> </packet> + <packet code="25" shortname="clear_rt" name="Clear Render Targets" cl="R" min_ver="71"/> + <packet code="26" shortname="load" name="Reload Tile Color Buffer" cl="R" max_ver="33"> <field name="Disable Color Buffer load" size="8" start="8" type="uint"/> <field name="Enable Z load" size="1" start="7" type="bool"/> @@ -443,6 +488,10 @@ <value name="Render target 1" value="1"/> <value name="Render target 2" value="2"/> <value name="Render target 3" value="3"/> + <value name="Render target 4" value="4" min_ver="71"/> + <value name="Render target 5" value="5" min_ver="71"/> + <value name="Render target 6" value="6" min_ver="71"/> + <value name="Render target 7" value="7" min_ver="71"/> <value name="None" value="8"/> <value name="Z" value="9"/> <value name="Stencil" value="10"/> @@ -789,7 +838,7 @@ <field name="Alpha blend mode" size="4" start="0" type="Blend Mode"/> </packet> - <packet code="84" name="Blend Cfg" min_ver="41"> + <packet code="84" name="Blend Cfg" min_ver="41" max_ver="42"> <field name="Render Target Mask" size="4" start="24" type="uint"/> <field name="Color blend dst factor" size="4" start="20" type="Blend Factor"/> <field name="Color blend src factor" size="4" start="16" type="Blend Factor"/> @@ -799,6 +848,16 @@ <field name="Alpha blend mode" size="4" start="0" type="Blend Mode"/> </packet> + <packet code="84" name="Blend Cfg" min_ver="71"> + <field name="Render Target Mask" size="8" start="24" type="uint"/> + <field name="Color blend dst factor" size="4" start="20" type="Blend Factor"/> + <field name="Color blend src factor" size="4" start="16" type="Blend Factor"/> + <field name="Color blend mode" size="4" start="12" type="Blend Mode"/> + <field name="Alpha blend dst factor" size="4" start="8" type="Blend Factor"/> + <field name="Alpha blend src factor" size="4" start="4" type="Blend Factor"/> + <field name="Alpha blend mode" size="4" start="0" type="Blend Mode"/> + </packet> + <packet code="86" shortname="blend_ccolor" name="Blend Constant Color"> <field name="Alpha (F16)" size="16" start="48" type="uint"/> <field name="Blue (F16)" size="16" start="32" type="uint"/> @@ -828,7 +887,12 @@ <field name="address" size="32" start="0" type="address"/> </packet> - <packet code="96" name="Cfg Bits"> + <packet code="93" name="Depth Bounds Test Limits" min_ver="71"> + <field name="Lower Test Limit" size="32" start="0" type="float"/> + <field name="Upper Test Limit" size="32" start="32" type="float"/> + </packet> + + <packet code="96" name="Cfg Bits" max_ver="42"> <field name="Direct3D Provoking Vertex" size="1" start="21" type="bool"/> <field name="Direct3D 'Point-fill' mode" size="1" start="20" type="bool"/> <field name="Blend enable" size="1" start="19" type="bool"/> @@ -846,6 +910,25 @@ <field name="Enable Forward Facing Primitive" size="1" start="0" type="bool"/> </packet> + <packet code="96" name="Cfg Bits" min_ver="71"> + <field name="Z Clipping mode" size="2" start="22" type="Z Clip Mode"/> + <field name="Direct3D Provoking Vertex" size="1" start="21" type="bool"/> + <field name="Direct3D 'Point-fill' mode" size="1" start="20" type="bool"/> + <field name="Blend enable" size="1" start="19" type="bool"/> + <field name="Stencil enable" size="1" start="18" type="bool"/> + <field name="Z updates enable" size="1" start="15" type="bool"/> + <field name="Depth-Test Function" size="3" start="12" type="Compare Function"/> + <field name="Direct3D Wireframe triangles mode" size="1" start="11" type="bool"/> + <field name="Z Clamp Mode" size="1" start="10" type="bool"/> + <field name="Rasterizer Oversample Mode" size="2" start="6" type="uint"/> + <field name="Depth Bounds Test Enable" size="1" start="5" type="bool"/> + <field name="Line Rasterization" size="1" start="4" type="uint"/> + <field name="Enable Depth Offset" size="1" start="3" type="bool"/> + <field name="Clockwise Primitives" size="1" start="2" type="bool"/> + <field name="Enable Reverse Facing Primitive" size="1" start="1" type="bool"/> + <field name="Enable Forward Facing Primitive" size="1" start="0" type="bool"/> + </packet> + <packet code="97" shortname="zero_all_flatshade_flags" name="Zero All Flat Shade Flags"/> <packet code="98" shortname="flatshade_flags" name="Flat Shade Flags"> @@ -907,16 +990,26 @@ <field name="Minimum Zw" size="32" start="0" type="float"/> </packet> - <packet shortname="clipper_xy" name="Clipper XY Scaling" code="110" cl="B"> + <packet shortname="clipper_xy" name="Clipper XY Scaling" code="110" cl="B" max_ver="42"> <field name="Viewport Half-Height in 1/256th of pixel" size="32" start="32" type="float"/> <field name="Viewport Half-Width in 1/256th of pixel" size="32" start="0" type="float"/> </packet> + <packet shortname="clipper_xy" name="Clipper XY Scaling" code="110" cl="B" min_ver="71"> + <field name="Viewport Half-Height in 1/64th of pixel" size="32" start="32" type="float"/> + <field name="Viewport Half-Width in 1/64th of pixel" size="32" start="0" type="float"/> + </packet> + <packet shortname="clipper_z" name="Clipper Z Scale and Offset" code="111" cl="B"> <field name="Viewport Z Offset (Zc to Zs)" size="32" start="32" type="float"/> <field name="Viewport Z Scale (Zc to Zs)" size="32" start="0" type="float"/> </packet> + <packet shortname="clipper_z_no_guardband" name="Clipper Z Scale and Offset no guardband" code="112" cl="B" min_ver="71"> + <field name="Viewport Z Offset (Zc to Zs)" size="32" start="32" type="float"/> + <field name="Viewport Z Scale (Zc to Zs)" size="32" start="0" type="float"/> + </packet> + <packet name="Number of Layers" code="119" min_ver="41"> <field name="Number of Layers" size="8" start="0" type="uint" minus_one="true"/> </packet> @@ -947,7 +1040,7 @@ <field name="sub-id" size="1" start="0" type="uint" default="0"/> </packet> - <packet code="120" name="Tile Binning Mode Cfg" min_ver="41"> + <packet code="120" name="Tile Binning Mode Cfg" min_ver="41" max_ver="42"> <field name="Height (in pixels)" size="16" start="48" type="uint" minus_one="true"/> <field name="Width (in pixels)" size="16" start="32" type="uint" minus_one="true"/> @@ -971,6 +1064,35 @@ </field> </packet> + <packet code="120" name="Tile Binning Mode Cfg" min_ver="71"> + <field name="Height (in pixels)" size="16" start="48" type="uint" minus_one="true"/> + <field name="Width (in pixels)" size="16" start="32" type="uint" minus_one="true"/> + + <field name="Log2 Tile Height" size="3" start="11" type="uint"> + <value name="tile height 8 pixels" value="0"/> + <value name="tile height 16 pixels" value="1"/> + <value name="tile height 32 pixels" value="2"/> + <value name="tile height 64 pixels" value="3"/> + </field> + <field name="Log2 Tile Width" size="3" start="8" type="uint"> + <value name="tile width 8 pixels" value="0"/> + <value name="tile width 16 pixels" value="1"/> + <value name="tile width 32 pixels" value="2"/> + <value name="tile width 64 pixels" value="3"/> + </field> + + <field name="tile allocation block size" size="2" start="4" type="uint"> + <value name="tile allocation block size 64b" value="0"/> + <value name="tile allocation block size 128b" value="1"/> + <value name="tile allocation block size 256b" value="2"/> + </field> + <field name="tile allocation initial block size" size="2" start="2" type="uint"> + <value name="tile allocation initial block size 64b" value="0"/> + <value name="tile allocation initial block size 128b" value="1"/> + <value name="tile allocation initial block size 256b" value="2"/> + </field> + </packet> + <packet code="120" name="Tile Binning Mode Cfg (Part2)" cl="B" max_ver="33"> <field name="Tile Allocation Memory Address" size="32" start="32" type="address"/> <field name="Tile Allocation Memory Size" size="32" start="0" type="uint"/> @@ -1002,7 +1124,7 @@ <field name="sub-id" size="4" start="0" type="uint" default="0"/> </packet> - <packet code="121" name="Tile Rendering Mode Cfg (Common)" cl="R" min_ver="41"> + <packet code="121" name="Tile Rendering Mode Cfg (Common)" cl="R" min_ver="41" max_ver="42"> <field name="Pad" size="12" start="52" type="uint"/> <field name="Early Depth/Stencil Clear" size="1" start="51" type="bool"/> @@ -1018,7 +1140,11 @@ <field name="Double-buffer in non-ms mode" size="1" start="43" type="bool"/> <field name="Multisample Mode (4x)" size="1" start="42" type="bool"/> - <field name="Maximum BPP of all render targets" size="2" start="40" type="Internal BPP"/> + <field name="Maximum BPP of all render targets" size="2" start="40" type="Internal BPP"> + <value name="Render target maximum 32bpp" value="0"/> + <value name="Render target maximum 64bpp" value="1"/> + <value name="Render target maximum 128bpp" value="2"/> + </field> <field name="Image Height (pixels)" size="16" start="24" type="uint"/> <field name="Image Width (pixels)" size="16" start="8" type="uint"/> @@ -1027,6 +1153,43 @@ <field name="sub-id" size="4" start="0" type="uint" default="0"/> </packet> + <packet code="121" name="Tile Rendering Mode Cfg (Common)" cl="R" min_ver="71"> + <field name="Pad" size="6" start="58" type="uint"/> + + <field name="Log2 Tile Height" size="3" start="55" type="uint"> + <value name="tile height 8 pixels" value="0"/> + <value name="tile height 16 pixels" value="1"/> + <value name="tile height 32 pixels" value="2"/> + <value name="tile height 64 pixels" value="3"/> + </field> + <field name="Log2 Tile Width" size="3" start="52" type="uint"> + <value name="tile width 8 pixels" value="0"/> + <value name="tile width 16 pixels" value="1"/> + <value name="tile width 32 pixels" value="2"/> + <value name="tile width 64 pixels" value="3"/> + </field> + + <field name="Early Depth/Stencil Clear" size="1" start="51" type="bool"/> + <field name="Internal Depth Type" size="4" start="47" type="Internal Depth Type"/> + + <field name="Early-Z disable" size="1" start="46" type="bool"/> + + <field name="Early-Z Test and Update Direction" size="1" start="45" type="uint"> + <value name="Early-Z direction LT/LE" value="0"/> + <value name="Early-Z direction GT/GE" value="1"/> + </field> + + <field name="Depth-buffer disable" size="1" start="44" type="bool"/> + <field name="Double-buffer in non-ms mode" size="1" start="43" type="bool"/> + <field name="Multisample Mode (4x)" size="1" start="42" type="bool"/> + + <field name="Image Height (pixels)" size="16" start="24" type="uint"/> + <field name="Image Width (pixels)" size="16" start="8" type="uint"/> + <field name="Number of Render Targets" size="4" start="4" type="uint" minus_one="true"/> + + <field name="sub-id" size="3" start="0" type="uint" default="0"/> + </packet> + <packet code="121" name="Tile Rendering Mode Cfg (Color)" cl="R" max_ver="33"> <field name="Address" size="32" start="32" type="address"/> @@ -1048,7 +1211,8 @@ <field name="sub-id" size="4" start="0" type="uint" default="2"/> </packet> - <packet code="121" name="Tile Rendering Mode Cfg (Color)" cl="R" min_ver="41"> + <!-- On 4.1 the real name would be "Tile Rendering Mode Cfg (Render Target Configs) --> + <packet code="121" name="Tile Rendering Mode Cfg (Color)" cl="R" min_ver="41" max_ver="42"> <field name="Pad" size="28" start="36" type="uint"/> @@ -1099,7 +1263,7 @@ <field name="sub-id" size="4" start="0" type="uint" default="3"/> </packet> - <packet code="121" name="Tile Rendering Mode Cfg (ZS Clear Values)" cl="R" min_ver="41"> + <packet code="121" name="Tile Rendering Mode Cfg (ZS Clear Values)" cl="R" min_ver="41" max_ver="42"> <field name="unused" size="16" start="48" type="uint"/> <field name="Z Clear Value" size="32" start="16" type="float"/> @@ -1108,6 +1272,15 @@ <field name="sub-id" size="4" start="0" type="uint" default="2"/> </packet> + <packet code="121" name="Tile Rendering Mode Cfg (ZS Clear Values)" cl="R" min_ver="71"> + <field name="unused" size="16" start="48" type="uint"/> + + <field name="Z Clear Value" size="32" start="16" type="float"/> + + <field name="Stencil Clear Value" size="8" start="8" type="uint"/> + <field name="sub-id" size="4" start="0" type="uint" default="1"/> + </packet> + <packet code="121" name="Tile Rendering Mode Cfg (Clear Colors Part1)" cl="R" max_ver="33"> <!-- Express this as a 56-bit field? --> <field name="Clear Color next 24 bits" size="24" start="40" type="uint"/> @@ -1117,7 +1290,7 @@ <field name="sub-id" size="4" start="0" type="uint" default="4"/> </packet> - <packet code="121" name="Tile Rendering Mode Cfg (Clear Colors Part1)" cl="R" min_ver="41"> + <packet code="121" name="Tile Rendering Mode Cfg (Clear Colors Part1)" cl="R" min_ver="41" max_ver="42"> <!-- Express this as a 56-bit field? --> <field name="Clear Color next 24 bits" size="24" start="40" type="uint"/> <field name="Clear Color low 32 bits" size="32" start="8" type="uint"/> @@ -1126,6 +1299,19 @@ <field name="sub-id" size="4" start="0" type="uint" default="3"/> </packet> + <packet code="121" name="Tile Rendering Mode Cfg (Render Target Part1)" cl="R" min_ver="71"> + + <field name="Clear Color low bits" size="32" start="32" type="uint"/> + <field name="Internal Type and Clamping" size="5" start="27" type="Render Target Type Clamp"/> + <field name="Internal BPP" size="2" start="25" type="Internal BPP"/> + + <field name="Stride" size="7" start="18" type="uint" minus_one="true"/> + <!-- In multiples of 512 bits --> + <field name="Base Address" size="11" start="7" type="uint"/> + <field name="Render Target number" size="3" start="3" type="uint"/> + <field name="sub-id" size="3" start="0" type="uint" default="2"/> + </packet> + <packet code="121" name="Tile Rendering Mode Cfg (Clear Colors Part2)" cl="R" max_ver="33"> <!-- Express this as a 56-bit field? --> <field name="Clear Color mid-high 24 bits" size="24" start="40" type="uint"/> @@ -1135,7 +1321,7 @@ <field name="sub-id" size="4" start="0" type="uint" default="5"/> </packet> - <packet code="121" name="Tile Rendering Mode Cfg (Clear Colors Part2)" cl="R" min_ver="41"> + <packet code="121" name="Tile Rendering Mode Cfg (Clear Colors Part2)" cl="R" min_ver="41" max_ver="42"> <!-- Express this as a 56-bit field? --> <field name="Clear Color mid-high 24 bits" size="24" start="40" type="uint"/> <field name="Clear Color mid-low 32 bits" size="32" start="8" type="uint"/> @@ -1144,6 +1330,13 @@ <field name="sub-id" size="4" start="0" type="uint" default="4"/> </packet> + <packet code="121" name="Tile Rendering Mode Cfg (Render Target Part2)" cl="R" min_ver="71"> + <field name="Clear Color mid bits" size="40" start="24" type="uint"/> + + <field name="Render Target number" size="3" start="3" type="uint"/> + <field name="sub-id" size="3" start="0" type="uint" default="3"/> + </packet> + <packet code="121" name="Tile Rendering Mode Cfg (Clear Colors Part3)" cl="R" max_ver="33"> <field name="pad" size="11" start="53" type="uint"/> <field name="UIF padded height in UIF blocks" size="13" start="40" type="uint"/> @@ -1155,7 +1348,7 @@ <field name="sub-id" size="4" start="0" type="uint" default="6"/> </packet> - <packet code="121" name="Tile Rendering Mode Cfg (Clear Colors Part3)" cl="R" min_ver="41"> + <packet code="121" name="Tile Rendering Mode Cfg (Clear Colors Part3)" cl="R" min_ver="41" max_ver="42"> <field name="pad" size="11" start="53" type="uint"/> <field name="UIF padded height in UIF blocks" size="13" start="40" type="uint"/> <!-- image height is for Y flipping --> @@ -1166,6 +1359,13 @@ <field name="sub-id" size="4" start="0" type="uint" default="5"/> </packet> + <packet code="121" name="Tile Rendering Mode Cfg (Render Target Part3)" cl="R" min_ver="71"> + <field name="Clear Color top bits" size="56" start="8" type="uint"/> + + <field name="Render Target number" size="3" start="3" type="uint"/> + <field name="sub-id" size="3" start="0" type="uint" default="4"/> + </packet> + <packet code="124" shortname="tile_coords" name="Tile Coordinates"> <field name="tile row number" size="12" start="12" type="uint"/> <field name="tile column number" size="12" start="0" type="uint"/> @@ -1240,7 +1440,7 @@ <field name="Coordinate Shader Uniforms Address" size="32" start="32b" type="address"/> </struct> - <struct name="GL Shader State Record" min_ver="41"> + <struct name="GL Shader State Record" min_ver="41" max_ver="42"> <field name="Point size in shaded vertex data" size="1" start="0" type="bool"/> <field name="Enable clipping" size="1" start="1" type="bool"/> @@ -1299,6 +1499,63 @@ <field name="Coordinate Shader Uniforms Address" size="32" start="32b" type="address"/> </struct> + <struct name="GL Shader State Record" min_ver="71"> + <field name="Point size in shaded vertex data" size="1" start="0" type="bool"/> + <field name="Enable clipping" size="1" start="1" type="bool"/> + + <field name="Vertex ID read by coordinate shader" size="1" start="2" type="bool"/> + <field name="Instance ID read by coordinate shader" size="1" start="3" type="bool"/> + <field name="Base Instance ID read by coordinate shader" size="1" start="4" type="bool"/> + <field name="Vertex ID read by vertex shader" size="1" start="5" type="bool"/> + <field name="Instance ID read by vertex shader" size="1" start="6" type="bool"/> + <field name="Base Instance ID read by vertex shader" size="1" start="7" type="bool"/> + + <field name="Fragment shader does Z writes" size="1" start="8" type="bool"/> + <field name="Turn off early-z test" size="1" start="9" type="bool"/> + + <field name="Fragment shader uses real pixel centre W in addition to centroid W2" size="1" start="12" type="bool"/> + <field name="Enable Sample Rate Shading" size="1" start="13" type="bool"/> + <field name="Any shader reads hardware-written Primitive ID" size="1" start="14" type="bool"/> + <field name="Insert Primitive ID as first varying to fragment shader" size="1" start="15" type="bool"/> + <field name="Turn off scoreboard" size="1" start="16" type="bool"/> + <field name="Do scoreboard wait on first thread switch" size="1" start="17" type="bool"/> + <field name="Disable implicit point/line varyings" size="1" start="18" type="bool"/> + <field name="No prim pack" size="1" start="19" type="bool"/> + <field name="Never defer FEP depth writes" size="1" start="20" type="bool"/> + + <field name="Number of varyings in Fragment Shader" size="8" start="3b" type="uint"/> + + <field name="Coordinate Shader output VPM segment size" size="4" start="4b" type="uint"/> + <field name="Min Coord Shader output segments required in play in addition to VCM cache size" size="4" start="36" type="uint"/> + + <field name="Coordinate Shader input VPM segment size" size="4" start="5b" type="uint"/> + <field name="Min Coord Shader input segments required in play" size="4" start="44" type="uint" minus_one="true"/> + + <field name="Vertex Shader output VPM segment size" size="4" start="6b" type="uint"/> + <field name="Min Vertex Shader output segments required in play in addition to VCM cache size" size="4" start="52" type="uint"/> + + <field name="Vertex Shader input VPM segment size" size="4" start="7b" type="uint"/> + <field name="Min Vertex Shader input segments required in play" size="4" start="60" type="uint" minus_one="true"/> + + <field name="Fragment Shader Code Address" size="29" start="67" type="address"/> + <field name="Fragment Shader 4-way threadable" size="1" start="64" type="bool"/> + <field name="Fragment Shader start in final thread section" size="1" start="65" type="bool"/> + <field name="Fragment Shader Propagate NaNs" size="1" start="66" type="bool"/> + <field name="Fragment Shader Uniforms Address" size="32" start="12b" type="address"/> + + <field name="Vertex Shader Code Address" size="29" start="131" type="address"/> + <field name="Vertex Shader 4-way threadable" size="1" start="128" type="bool"/> + <field name="Vertex Shader start in final thread section" size="1" start="129" type="bool"/> + <field name="Vertex Shader Propagate NaNs" size="1" start="130" type="bool"/> + <field name="Vertex Shader Uniforms Address" size="32" start="20b" type="address"/> + + <field name="Coordinate Shader Code Address" size="29" start="195" type="address"/> + <field name="Coordinate Shader 4-way threadable" size="1" start="192" type="bool"/> + <field name="Coordinate Shader start in final thread section" size="1" start="193" type="bool"/> + <field name="Coordinate Shader Propagate NaNs" size="1" start="194" type="bool"/> + <field name="Coordinate Shader Uniforms Address" size="32" start="28b" type="address"/> + </struct> + <struct name="Geometry Shader State Record" min_ver="41"> <field name="Geometry Bin Mode Shader Code Address" size="29" start="3" type="address"/> <field name="Geometry Bin Mode Shader 4-way threadable" size="1" start="0" type="bool"/> @@ -1543,7 +1800,7 @@ <field name="Offset Format 8" size="1" start="0" type="bool"/> </struct> - <struct name="TMU Config Parameter 2" min_ver="42"> + <struct name="TMU Config Parameter 2" min_ver="42" max_ver="42"> <field name="Pad" size="7" start="25" type="uint"/> <field name="LOD Query" size="1" start="24" type="bool"/> <field name="Op" size="4" start="20" type="TMU Op"/> @@ -1558,6 +1815,23 @@ <field name="Offset Format 8" size="1" start="0" type="bool"/> </struct> + <struct name="TMU Config Parameter 2" min_ver="71"> + <field name="Pad" size="5" start="27" type="uint"/> + <field name="Write conversion" size="1" start="26" type="bool"/> + <field name="DIM query" size="1" start="25" type="bool"/> + <field name="LOD Query" size="1" start="24" type="bool"/> + <field name="Op" size="4" start="20" type="TMU Op"/> + <field name="Offset R" size="4" start="16" type="int"/> + <field name="Offset T" size="4" start="12" type="int"/> + <field name="Offset S" size="4" start="8" type="int"/> + <field name="Gather Mode" size="1" start="7" type="bool"/> + <field name="Gather Component" size="2" start="5" type="uint"/> + <field name="Coefficient Mode" size="1" start="4" type="bool"/> + <field name="Sample Number" size="2" start="2" type="uint"/> + <field name="Disable AutoLOD" size="1" start="1" type="bool"/> + <field name="Offset Format 8" size="1" start="0" type="bool"/> + </struct> + <struct name="Texture Shader State" max_ver="33"> <field name="UIF XOR disable" size="1" start="255" type="bool"/> <field name="Level 0 is strictly UIF" size="1" start="254" type="bool"/> @@ -1611,7 +1885,7 @@ <field name="Filter" size="4" start="0" type="TMU Filter"/> </struct> - <struct name="Texture Shader State" min_ver="41"> + <struct name="Texture Shader State" min_ver="41" max_ver="42"> <field name="Pad" size="56" start="136" type="uint"/> <field name="UIF XOR disable" size="1" start="135" type="bool"/> <field name="Level 0 is strictly UIF" size="1" start="134" type="bool"/> @@ -1652,6 +1926,82 @@ <field name="Flip texture X Axis" size="1" start="0" type="bool"/> </struct> + <struct name="Texture Shader State" min_ver="71"> + <field name="Pad" size="2" start="190" type="uint"/> + <!-- When we use an address type, there is an implicit requirement + that the address is a 32-bit that is encoded starting at a 32-bit + aligned bit offset into the packet. If the address field has less than + 32 bits, it is assumed that the address is aligned. For example, a + 26-bit address field is expected to be 64-byte aligned (6 lsb bits + are 0) and that this will be encoded into a packet starting at bit + offset 6 into a 32-bit dword (since bits 0..5 of the address are + implicitly 0 and don't need to be explicitly encoded). + + Unfortunately, the CB address below doesn't match this requirement: + it starts at bit 138, which is 10 bits into a 32-bit dword, but it + represents a 64-bit aligned address (6 lsb bits are 0), so we cannot + encode it as an address type. To fix this we encode these addresses + as uint types which has two implications: + 1. the driver is responsible for manually addinng the buffer objects + for these addresses to the job BO list. + 2. the driver needs to pass an actual 26-bit address value by manually + shifting the 6 lsb bits (that are implicitly 0). + --> + <field name="texture_base pointer_Cr" size="26" start="164" type="uint"/> + <field name="texture base pointer Cb" size="26" start="138" type="uint"/> + <field name="Chroma offset y" size="1" start="137" type="uint"/> + <field name="Chroma offset x" size="1" start="136" type="uint"/> + + <field name="UIF XOR disable" size="1" start="135" type="bool"/> + <field name="Level 0 is strictly UIF" size="1" start="134" type="bool"/> + <field name="Level 0 XOR enable" size="1" start="132" type="bool"/> + <field name="Level 0 UB_PAD" size="4" start="128" type="uint"/> + + <field name="Base Level" size="4" start="124" type="uint"/> + <field name="Max Level" size="4" start="120" type="uint"/> + + <field name="Swizzle A" size="3" start="117" type="uint"> + <value name="Swizzle Zero" value="0"/> + <value name="Swizzle One" value="1"/> + <value name="Swizzle Red" value="2"/> + <value name="Swizzle Green" value="3"/> + <value name="Swizzle Blue" value="4"/> + <value name="Swizzle Alpha" value="5"/> + </field> + + <field name="Swizzle B" size="3" start="114" type="uint"/> + <field name="Swizzle G" size="3" start="111" type="uint"/> + <field name="Swizzle R" size="3" start="108" type="uint"/> + <field name="Extended" size="1" start="107" type="bool"/> + + <field name="Texture type" size="7" start="100" type="uint"/> + <field name="Image Depth" size="14" start="86" type="uint"/> + <field name="Image Height" size="14" start="72" type="uint"/> + <field name="Image Width" size="14" start="58" type="uint"/> + + <!-- V3D 7.1.2 doesn't have the RB swap bit and has Array Stride starting + at bit 32. However, 7.1.5 included the RB swap bit at bit 32 and has + Array Stride starting at 33, which is backwards incompatible, + We use the definition from 7.1.5. + --> + <field name="Array Stride (64-byte aligned)" size="24" start="33" type="uint"/> + <field name="R/B swap" size="1" start="32" type="bool"/> + + <field name="Texture base pointer" size="32" start="0" type="address"/> + + <field name="Reverse" size="1" start="5" type="bool"/> + <field name="Transfer func" size="3" start="2" type="uint"> + <value name="Transfer Func None" value="0"/> + <value name="Transfer Func sRGB" value="1"/> + <value name="Transfer Func PQ" value="2"/> + <value name="Transfer Func HLG" value="3"/> + <value name="Transfer Func PQ BT1886" value="4"/> + <value name="Transfer Func HLG BT1886" value="5"/> + </field> + <field name="Flip texture Y Axis" size="1" start="1" type="bool"/> + <field name="Flip texture X Axis" size="1" start="0" type="bool"/> + </struct> + <struct name="Sampler State" min_ver="41"> <field name="Border color word 3" size="32" start="160" type="uint"/> <field name="Border color word 2" size="32" start="128" type="uint"/> -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0004-broadcom-common-retrieve-V3D-revision-number.patch ================================================ From 569cbe4229df737ce5915c4be2cad534707fb4f7 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 9 Nov 2021 08:50:51 +0100 Subject: [PATCH 004/142] broadcom/common: retrieve V3D revision number The subrev field from the hub ident3 register is bumped with every hardware revision doing backwards incompatible changes so we want to keep track of this. Instead of modifying the 'ver' field info to acommodate subrev info, which would require a lot of changes, simply add a new 'rev' field in devinfo that we can use when we need to make changes based on the revision number of a hardware release. --- src/broadcom/common/v3d_device_info.c | 14 +++++++++++++- src/broadcom/common/v3d_device_info.h | 3 +++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/broadcom/common/v3d_device_info.c b/src/broadcom/common/v3d_device_info.c index 7e0862f1f02..7512fe3a06b 100644 --- a/src/broadcom/common/v3d_device_info.c +++ b/src/broadcom/common/v3d_device_info.c @@ -36,6 +36,9 @@ v3d_get_device_info(int fd, struct v3d_device_info* devinfo, v3d_ioctl_fun drm_i struct drm_v3d_get_param ident1 = { .param = DRM_V3D_PARAM_V3D_CORE0_IDENT1, }; + struct drm_v3d_get_param hub_ident3 = { + .param = DRM_V3D_PARAM_V3D_HUB_IDENT3, + }; int ret; ret = drm_ioctl(fd, DRM_IOCTL_V3D_GET_PARAM, &ident0); @@ -76,5 +79,14 @@ v3d_get_device_info(int fd, struct v3d_device_info* devinfo, v3d_ioctl_fun drm_i return false; } - return true; + ret = drm_ioctl(fd, DRM_IOCTL_V3D_GET_PARAM, &hub_ident3); + if (ret != 0) { + fprintf(stderr, "Couldn't get V3D core HUB IDENT3: %s\n", + strerror(errno)); + return false; + } + + devinfo->rev = (hub_ident3.value >> 8) & 0xff; + + return true; } diff --git a/src/broadcom/common/v3d_device_info.h b/src/broadcom/common/v3d_device_info.h index 97abd9b8d9f..32cb65cf81f 100644 --- a/src/broadcom/common/v3d_device_info.h +++ b/src/broadcom/common/v3d_device_info.h @@ -34,6 +34,9 @@ struct v3d_device_info { /** Simple V3D version: major * 10 + minor */ uint8_t ver; + /** V3D revision number */ + uint8_t rev; + /** Size of the VPM, in bytes. */ int vpm_size; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0005-broadcom-common-add-some-common-v71-helpers.patch ================================================ From c260843c882d25bd31e308566b45d4517fda0fa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Wed, 17 Nov 2021 14:40:47 +0100 Subject: [PATCH 005/142] broadcom/common: add some common v71 helpers --- src/broadcom/common/v3d_util.c | 27 +++++++++++++++++++++++++++ src/broadcom/common/v3d_util.h | 27 +++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/broadcom/common/v3d_util.c b/src/broadcom/common/v3d_util.c index 57872a923d3..26f5c6b336f 100644 --- a/src/broadcom/common/v3d_util.c +++ b/src/broadcom/common/v3d_util.c @@ -170,3 +170,30 @@ v3d_hw_prim_type(enum mesa_prim prim_type) unreachable("Unsupported primitive type"); } } + +uint32_t +v3d_internal_bpp_words(uint32_t internal_bpp) +{ + switch (internal_bpp) { + case 0 /* V3D_INTERNAL_BPP_32 */: + return 1; + case 1 /* V3D_INTERNAL_BPP_64 */: + return 2; + case 2 /* V3D_INTERNAL_BPP_128 */: + return 4; + default: + unreachable("Unsupported internal BPP"); + } +} + +uint32_t +v3d_compute_rt_row_row_stride_128_bits(uint32_t tile_width, + uint32_t bpp) +{ + /* stride in multiples of 128 bits, and covers 2 rows. This is the + * reason we divide by 2 instead of 4, as we divide number of 32-bit + * words per row by 2. + */ + + return (tile_width * bpp) / 2; +} diff --git a/src/broadcom/common/v3d_util.h b/src/broadcom/common/v3d_util.h index eb802b77f67..864fc949ffa 100644 --- a/src/broadcom/common/v3d_util.h +++ b/src/broadcom/common/v3d_util.h @@ -24,6 +24,7 @@ #ifndef V3D_UTIL_H #define V3D_UTIL_H +#include "util/macros.h" #include "common/v3d_device_info.h" #include "pipe/p_defines.h" @@ -46,4 +47,30 @@ v3d_translate_pipe_swizzle(enum pipe_swizzle swizzle); uint32_t v3d_hw_prim_type(enum mesa_prim prim_type); +uint32_t +v3d_internal_bpp_words(uint32_t internal_bpp); + +/* Some configuration packets want the size on log2, but starting at 0 for + * size 8. + */ +static inline uint8_t +log2_tile_size(uint32_t size) +{ + switch(size) { + case 8: + return 0; + case 16: + return 1; + case 32: + return 2; + case 64: + return 3; + default: + unreachable("Unsupported tile width/height"); + } +} + +uint32_t +v3d_compute_rt_row_row_stride_128_bits(uint32_t tile_width, + uint32_t bpp); #endif -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0006-broadcom-qpu-add-comments-on-waddr-not-used-on-V3D-7.patch ================================================ From a5211a4d71acc53183d2a90eb1694d8cce6eb44f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 5 Aug 2021 01:03:11 +0200 Subject: [PATCH 006/142] broadcom/qpu: add comments on waddr not used on V3D 7.x --- src/broadcom/qpu/qpu_instr.h | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/broadcom/qpu/qpu_instr.h b/src/broadcom/qpu/qpu_instr.h index 2e133472698..45a0cad9760 100644 --- a/src/broadcom/qpu/qpu_instr.h +++ b/src/broadcom/qpu/qpu_instr.h @@ -88,11 +88,11 @@ enum v3d_qpu_uf { }; enum v3d_qpu_waddr { - V3D_QPU_WADDR_R0 = 0, - V3D_QPU_WADDR_R1 = 1, - V3D_QPU_WADDR_R2 = 2, - V3D_QPU_WADDR_R3 = 3, - V3D_QPU_WADDR_R4 = 4, + V3D_QPU_WADDR_R0 = 0, /* Reserved on V3D 7.x */ + V3D_QPU_WADDR_R1 = 1, /* Reserved on V3D 7.x */ + V3D_QPU_WADDR_R2 = 2, /* Reserved on V3D 7.x */ + V3D_QPU_WADDR_R3 = 3, /* Reserved on V3D 7.x */ + V3D_QPU_WADDR_R4 = 4, /* Reserved on V3D 7.x */ V3D_QPU_WADDR_R5 = 5, V3D_QPU_WADDR_NOP = 6, V3D_QPU_WADDR_TLB = 7, @@ -108,12 +108,12 @@ enum v3d_qpu_waddr { V3D_QPU_WADDR_SYNC = 16, V3D_QPU_WADDR_SYNCU = 17, V3D_QPU_WADDR_SYNCB = 18, - V3D_QPU_WADDR_RECIP = 19, - V3D_QPU_WADDR_RSQRT = 20, - V3D_QPU_WADDR_EXP = 21, - V3D_QPU_WADDR_LOG = 22, - V3D_QPU_WADDR_SIN = 23, - V3D_QPU_WADDR_RSQRT2 = 24, + V3D_QPU_WADDR_RECIP = 19, /* Reserved on V3D 7.x */ + V3D_QPU_WADDR_RSQRT = 20, /* Reserved on V3D 7.x */ + V3D_QPU_WADDR_EXP = 21, /* Reserved on V3D 7.x */ + V3D_QPU_WADDR_LOG = 22, /* Reserved on V3D 7.x */ + V3D_QPU_WADDR_SIN = 23, /* Reserved on V3D 7.x */ + V3D_QPU_WADDR_RSQRT2 = 24, /* Reserved on V3D 7.x */ V3D_QPU_WADDR_TMUC = 32, V3D_QPU_WADDR_TMUS = 33, V3D_QPU_WADDR_TMUT = 34, -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0007-broadcom-qpu-set-V3D-7.x-names-for-some-waddr-aliasi.patch ================================================ From 0ccf3043e4a584e5592bb7fad737d5d98ed23db0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 5 Aug 2021 01:00:47 +0200 Subject: [PATCH 007/142] broadcom/qpu: set V3D 7.x names for some waddr aliasing V3D 7.x got rid of the accumulator, but still uses the values for WADDR_R5 and WADDR_R5REP, so let's return a proper name and add some aliases. --- src/broadcom/qpu/qpu_instr.c | 8 ++++++++ src/broadcom/qpu/qpu_instr.h | 6 ++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/broadcom/qpu/qpu_instr.c b/src/broadcom/qpu/qpu_instr.c index 60dabf74e8e..7759fb0efdf 100644 --- a/src/broadcom/qpu/qpu_instr.c +++ b/src/broadcom/qpu/qpu_instr.c @@ -35,6 +35,14 @@ v3d_qpu_magic_waddr_name(const struct v3d_device_info *devinfo, if (devinfo->ver < 40 && waddr == V3D_QPU_WADDR_TMU) return "tmu"; + /* V3D 7.x QUAD and REP aliases R5 and R5REPT in the table below + */ + if (devinfo->ver >= 71 && waddr == V3D_QPU_WADDR_QUAD) + return "quad"; + + if (devinfo->ver >= 71 && waddr == V3D_QPU_WADDR_REP) + return "rep"; + static const char *waddr_magic[] = { [V3D_QPU_WADDR_R0] = "r0", [V3D_QPU_WADDR_R1] = "r1", diff --git a/src/broadcom/qpu/qpu_instr.h b/src/broadcom/qpu/qpu_instr.h index 45a0cad9760..19bf721dbe1 100644 --- a/src/broadcom/qpu/qpu_instr.h +++ b/src/broadcom/qpu/qpu_instr.h @@ -93,7 +93,8 @@ enum v3d_qpu_waddr { V3D_QPU_WADDR_R2 = 2, /* Reserved on V3D 7.x */ V3D_QPU_WADDR_R3 = 3, /* Reserved on V3D 7.x */ V3D_QPU_WADDR_R4 = 4, /* Reserved on V3D 7.x */ - V3D_QPU_WADDR_R5 = 5, + V3D_QPU_WADDR_R5 = 5, /* V3D 4.x */ + V3D_QPU_WADDR_QUAD = 5, /* V3D 7.x */ V3D_QPU_WADDR_NOP = 6, V3D_QPU_WADDR_TLB = 7, V3D_QPU_WADDR_TLBU = 8, @@ -129,7 +130,8 @@ enum v3d_qpu_waddr { V3D_QPU_WADDR_TMUHSCM = 44, V3D_QPU_WADDR_TMUHSF = 45, V3D_QPU_WADDR_TMUHSLOD = 46, - V3D_QPU_WADDR_R5REP = 55, + V3D_QPU_WADDR_R5REP = 55, /* V3D 4.x */ + V3D_QPU_WADDR_REP = 55, /* V3D 7.x */ }; struct v3d_qpu_flags { -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0008-broadcom-compiler-rename-small_imm-to-small_imm_b.patch ================================================ From 18de3cc85cf8bbe294e044f7a12abe14e554de0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Sun, 19 Sep 2021 03:20:18 +0200 Subject: [PATCH 008/142] broadcom/compiler: rename small_imm to small_imm_b Current small_imm is associated with the "B" read address. We do this change in advance for v71 support, where we will have 4 different small_imm (a/b/c/d), so we start with a renaming. --- src/broadcom/compiler/qpu_schedule.c | 22 +++++++++---------- .../compiler/vir_opt_small_immediates.c | 4 ++-- src/broadcom/compiler/vir_to_qpu.c | 2 +- src/broadcom/qpu/qpu_disasm.c | 2 +- src/broadcom/qpu/qpu_instr.h | 2 +- src/broadcom/qpu/qpu_pack.c | 22 +++++++++---------- 6 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index 3b32b48f86f..a10fa03ed10 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -160,7 +160,7 @@ process_mux_deps(struct schedule_state *state, struct schedule_node *n, add_read_dep(state, state->last_rf[n->inst->qpu.raddr_a], n); break; case V3D_QPU_MUX_B: - if (!n->inst->qpu.sig.small_imm) { + if (!n->inst->qpu.sig.small_imm_b) { add_read_dep(state, state->last_rf[n->inst->qpu.raddr_b], n); } @@ -615,7 +615,7 @@ qpu_instruction_uses_rf(const struct v3d_qpu_instr *inst, return true; if (v3d_qpu_uses_mux(inst, V3D_QPU_MUX_B) && - !inst->sig.small_imm && (inst->raddr_b == waddr)) + !inst->sig.small_imm_b && (inst->raddr_b == waddr)) return true; return false; @@ -790,11 +790,11 @@ qpu_raddrs_used(const struct v3d_qpu_instr *a, uint64_t raddrs_used = 0; if (v3d_qpu_uses_mux(a, V3D_QPU_MUX_A)) raddrs_used |= (1ll << a->raddr_a); - if (!a->sig.small_imm && v3d_qpu_uses_mux(a, V3D_QPU_MUX_B)) + if (!a->sig.small_imm_b && v3d_qpu_uses_mux(a, V3D_QPU_MUX_B)) raddrs_used |= (1ll << a->raddr_b); if (v3d_qpu_uses_mux(b, V3D_QPU_MUX_A)) raddrs_used |= (1ll << b->raddr_a); - if (!b->sig.small_imm && v3d_qpu_uses_mux(b, V3D_QPU_MUX_B)) + if (!b->sig.small_imm_b && v3d_qpu_uses_mux(b, V3D_QPU_MUX_B)) raddrs_used |= (1ll << b->raddr_b); return raddrs_used; @@ -816,16 +816,16 @@ qpu_merge_raddrs(struct v3d_qpu_instr *result, if (naddrs > 2) return false; - if ((add_instr->sig.small_imm || mul_instr->sig.small_imm)) { + if ((add_instr->sig.small_imm_b || mul_instr->sig.small_imm_b)) { if (naddrs > 1) return false; - if (add_instr->sig.small_imm && mul_instr->sig.small_imm) + if (add_instr->sig.small_imm_b && mul_instr->sig.small_imm_b) if (add_instr->raddr_b != mul_instr->raddr_b) return false; - result->sig.small_imm = true; - result->raddr_b = add_instr->sig.small_imm ? + result->sig.small_imm_b = true; + result->raddr_b = add_instr->sig.small_imm_b ? add_instr->raddr_b : mul_instr->raddr_b; } @@ -836,7 +836,7 @@ qpu_merge_raddrs(struct v3d_qpu_instr *result, raddrs_used &= ~(1ll << raddr_a); result->raddr_a = raddr_a; - if (!result->sig.small_imm) { + if (!result->sig.small_imm_b) { if (v3d_qpu_uses_mux(add_instr, V3D_QPU_MUX_B) && raddr_a == add_instr->raddr_b) { if (add_instr->alu.add.a == V3D_QPU_MUX_B) @@ -1025,7 +1025,7 @@ qpu_merge_inst(const struct v3d_device_info *devinfo, merge.sig.ldtmu |= b->sig.ldtmu; merge.sig.ldvary |= b->sig.ldvary; merge.sig.ldvpm |= b->sig.ldvpm; - merge.sig.small_imm |= b->sig.small_imm; + merge.sig.small_imm_b |= b->sig.small_imm_b; merge.sig.ldtlb |= b->sig.ldtlb; merge.sig.ldtlbu |= b->sig.ldtlbu; merge.sig.ucb |= b->sig.ucb; @@ -1614,7 +1614,7 @@ qpu_inst_valid_in_thrend_slot(struct v3d_compile *c, return false; if (inst->raddr_b < 3 && - !inst->sig.small_imm && + !inst->sig.small_imm_b && v3d_qpu_uses_mux(inst, V3D_QPU_MUX_B)) { return false; } diff --git a/src/broadcom/compiler/vir_opt_small_immediates.c b/src/broadcom/compiler/vir_opt_small_immediates.c index 47d7722968d..df0d6c36c9b 100644 --- a/src/broadcom/compiler/vir_opt_small_immediates.c +++ b/src/broadcom/compiler/vir_opt_small_immediates.c @@ -80,7 +80,7 @@ vir_opt_small_immediates(struct v3d_compile *c) */ struct v3d_qpu_sig new_sig = inst->qpu.sig; uint32_t sig_packed; - new_sig.small_imm = true; + new_sig.small_imm_b = true; if (!v3d_qpu_sig_pack(c->devinfo, &new_sig, &sig_packed)) continue; @@ -89,7 +89,7 @@ vir_opt_small_immediates(struct v3d_compile *c) vir_dump_inst(c, inst); fprintf(stderr, "\n"); } - inst->qpu.sig.small_imm = true; + inst->qpu.sig.small_imm_b = true; inst->qpu.raddr_b = packed; inst->src[i].file = QFILE_SMALL_IMM; diff --git a/src/broadcom/compiler/vir_to_qpu.c b/src/broadcom/compiler/vir_to_qpu.c index 45e6bfa1470..15c2e3674c2 100644 --- a/src/broadcom/compiler/vir_to_qpu.c +++ b/src/broadcom/compiler/vir_to_qpu.c @@ -94,7 +94,7 @@ static void set_src(struct v3d_qpu_instr *instr, enum v3d_qpu_mux *mux, struct qpu_reg src) { if (src.smimm) { - assert(instr->sig.small_imm); + assert(instr->sig.small_imm_b); *mux = V3D_QPU_MUX_B; return; } diff --git a/src/broadcom/qpu/qpu_disasm.c b/src/broadcom/qpu/qpu_disasm.c index 28fb2357b97..6aca3c28e78 100644 --- a/src/broadcom/qpu/qpu_disasm.c +++ b/src/broadcom/qpu/qpu_disasm.c @@ -62,7 +62,7 @@ v3d_qpu_disasm_raddr(struct disasm_state *disasm, if (mux == V3D_QPU_MUX_A) { append(disasm, "rf%d", instr->raddr_a); } else if (mux == V3D_QPU_MUX_B) { - if (instr->sig.small_imm) { + if (instr->sig.small_imm_b) { uint32_t val; ASSERTED bool ok = v3d_qpu_small_imm_unpack(disasm->devinfo, diff --git a/src/broadcom/qpu/qpu_instr.h b/src/broadcom/qpu/qpu_instr.h index 19bf721dbe1..9cd831863b4 100644 --- a/src/broadcom/qpu/qpu_instr.h +++ b/src/broadcom/qpu/qpu_instr.h @@ -50,7 +50,7 @@ struct v3d_qpu_sig { bool ldvpm:1; bool ldtlb:1; bool ldtlbu:1; - bool small_imm:1; + bool small_imm_b:1; bool ucb:1; bool rotate:1; bool wrtmuc:1; diff --git a/src/broadcom/qpu/qpu_pack.c b/src/broadcom/qpu/qpu_pack.c index a875683c6f8..beac591d3c1 100644 --- a/src/broadcom/qpu/qpu_pack.c +++ b/src/broadcom/qpu/qpu_pack.c @@ -112,7 +112,7 @@ #define LDTMU .ldtmu = true #define LDVARY .ldvary = true #define LDVPM .ldvpm = true -#define SMIMM .small_imm = true +#define SMIMM_B .small_imm_b = true #define LDTLB .ldtlb = true #define LDTLBU .ldtlbu = true #define UCB .ucb = true @@ -135,8 +135,8 @@ static const struct v3d_qpu_sig v33_sig_map[] = { [11] = { THRSW, LDVARY, LDUNIF }, [12] = { LDVARY, LDTMU, }, [13] = { THRSW, LDVARY, LDTMU, }, - [14] = { SMIMM, LDVARY, }, - [15] = { SMIMM, }, + [14] = { SMIMM_B, LDVARY, }, + [15] = { SMIMM_B, }, [16] = { LDTLB, }, [17] = { LDTLBU, }, /* 18-21 reserved */ @@ -148,8 +148,8 @@ static const struct v3d_qpu_sig v33_sig_map[] = { [27] = { THRSW, LDVPM, LDUNIF }, [28] = { LDVPM, LDTMU, }, [29] = { THRSW, LDVPM, LDTMU, }, - [30] = { SMIMM, LDVPM, }, - [31] = { SMIMM, }, + [30] = { SMIMM_B, LDVPM, }, + [31] = { SMIMM_B, }, }; static const struct v3d_qpu_sig v40_sig_map[] = { @@ -167,8 +167,8 @@ static const struct v3d_qpu_sig v40_sig_map[] = { [10] = { LDVARY, LDUNIF }, [11] = { THRSW, LDVARY, LDUNIF }, /* 12-13 reserved */ - [14] = { SMIMM, LDVARY, }, - [15] = { SMIMM, }, + [14] = { SMIMM_B, LDVARY, }, + [15] = { SMIMM_B, }, [16] = { LDTLB, }, [17] = { LDTLBU, }, [18] = { WRTMUC }, @@ -178,7 +178,7 @@ static const struct v3d_qpu_sig v40_sig_map[] = { [22] = { UCB, }, [23] = { ROT, }, /* 24-30 reserved */ - [31] = { SMIMM, LDTMU, }, + [31] = { SMIMM_B, LDTMU, }, }; static const struct v3d_qpu_sig v41_sig_map[] = { @@ -197,8 +197,8 @@ static const struct v3d_qpu_sig v41_sig_map[] = { [11] = { THRSW, LDVARY, LDUNIF }, [12] = { LDUNIFRF }, [13] = { THRSW, LDUNIFRF }, - [14] = { SMIMM, LDVARY, }, - [15] = { SMIMM, }, + [14] = { SMIMM_B, LDVARY }, + [15] = { SMIMM_B, }, [16] = { LDTLB, }, [17] = { LDTLBU, }, [18] = { WRTMUC }, @@ -210,7 +210,7 @@ static const struct v3d_qpu_sig v41_sig_map[] = { [24] = { LDUNIFA}, [25] = { LDUNIFARF }, /* 26-30 reserved */ - [31] = { SMIMM, LDTMU, }, + [31] = { SMIMM_B, LDTMU, }, }; bool -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0009-broadcom-compiler-add-small_imm-a-c-d-on-v3d_qpu_sig.patch ================================================ From 0e87405fe73694c173b7ce14c3d60611f241922c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 5 Aug 2021 00:50:12 +0200 Subject: [PATCH 009/142] broadcom/compiler: add small_imm a/c/d on v3d_qpu_sig small_imm_a, small_imm_c and small_imm_d added on top of the already existing small_imm_b, as V3D 7.1 defines 4 small immediates, tied to the 4 raddr. Note that this is only the definition, and just a inst validation rule to check that are not used before v71. Any real use is still pending. --- src/broadcom/compiler/qpu_validate.c | 5 +++++ src/broadcom/qpu/qpu_instr.h | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/broadcom/compiler/qpu_validate.c b/src/broadcom/compiler/qpu_validate.c index 2cc7a0eb0ae..12788692432 100644 --- a/src/broadcom/compiler/qpu_validate.c +++ b/src/broadcom/compiler/qpu_validate.c @@ -115,6 +115,11 @@ qpu_validate_inst(struct v3d_qpu_validate_state *state, struct qinst *qinst) if (inst->type != V3D_QPU_INSTR_TYPE_ALU) return; + if (devinfo->ver < 71) { + if (inst->sig.small_imm_a || inst->sig.small_imm_c || inst->sig.small_imm_d) + fail_instr(state, "small imm a/c/d added after V3D 7.1"); + } + /* LDVARY writes r5 two instructions later and LDUNIF writes * r5 one instruction later, which is illegal to have * together. diff --git a/src/broadcom/qpu/qpu_instr.h b/src/broadcom/qpu/qpu_instr.h index 9cd831863b4..13b3f37d43f 100644 --- a/src/broadcom/qpu/qpu_instr.h +++ b/src/broadcom/qpu/qpu_instr.h @@ -50,10 +50,13 @@ struct v3d_qpu_sig { bool ldvpm:1; bool ldtlb:1; bool ldtlbu:1; - bool small_imm_b:1; bool ucb:1; bool rotate:1; bool wrtmuc:1; + bool small_imm_a:1; /* raddr_a (add a), since V3D 7.x */ + bool small_imm_b:1; /* raddr_b (add b) */ + bool small_imm_c:1; /* raddr_c (mul a), since V3D 7.x */ + bool small_imm_d:1; /* raddr_d (mul b), since V3D 7.x */ }; enum v3d_qpu_cond { -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0010-broadcom-qpu-add-v71-signal-map.patch ================================================ From eca19c911d9af3b0ab3b563ea65dc455e3d27987 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Wed, 4 Aug 2021 01:11:16 +0200 Subject: [PATCH 010/142] broadcom/qpu: add v71 signal map MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Compared with v41, the differences are: * 14, 15, 29 and 30 are now about immediate a, b, c, d respectively * 23 is now reserved. On v42 this was for rotate signals, that are gone on v71. Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com> Signed-off-by: Iago Toral Quiroga <itoral@igalia.com> --- src/broadcom/qpu/qpu_pack.c | 47 ++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/src/broadcom/qpu/qpu_pack.c b/src/broadcom/qpu/qpu_pack.c index beac591d3c1..2820d9d4c56 100644 --- a/src/broadcom/qpu/qpu_pack.c +++ b/src/broadcom/qpu/qpu_pack.c @@ -112,12 +112,15 @@ #define LDTMU .ldtmu = true #define LDVARY .ldvary = true #define LDVPM .ldvpm = true -#define SMIMM_B .small_imm_b = true #define LDTLB .ldtlb = true #define LDTLBU .ldtlbu = true #define UCB .ucb = true #define ROT .rotate = true #define WRTMUC .wrtmuc = true +#define SMIMM_A .small_imm_a = true +#define SMIMM_B .small_imm_b = true +#define SMIMM_C .small_imm_c = true +#define SMIMM_D .small_imm_d = true static const struct v3d_qpu_sig v33_sig_map[] = { /* MISC R3 R4 R5 */ @@ -213,6 +216,40 @@ static const struct v3d_qpu_sig v41_sig_map[] = { [31] = { SMIMM_B, LDTMU, }, }; + +static const struct v3d_qpu_sig v71_sig_map[] = { + /* MISC phys RF0 */ + [0] = { }, + [1] = { THRSW, }, + [2] = { LDUNIF }, + [3] = { THRSW, LDUNIF }, + [4] = { LDTMU, }, + [5] = { THRSW, LDTMU, }, + [6] = { LDTMU, LDUNIF }, + [7] = { THRSW, LDTMU, LDUNIF }, + [8] = { LDVARY, }, + [9] = { THRSW, LDVARY, }, + [10] = { LDVARY, LDUNIF }, + [11] = { THRSW, LDVARY, LDUNIF }, + [12] = { LDUNIFRF }, + [13] = { THRSW, LDUNIFRF }, + [14] = { SMIMM_A, }, + [15] = { SMIMM_B, }, + [16] = { LDTLB, }, + [17] = { LDTLBU, }, + [18] = { WRTMUC }, + [19] = { THRSW, WRTMUC }, + [20] = { LDVARY, WRTMUC }, + [21] = { THRSW, LDVARY, WRTMUC }, + [22] = { UCB, }, + /* 23 reserved */ + [24] = { LDUNIFA}, + [25] = { LDUNIFARF }, + /* 26-29 reserved */ + [30] = { SMIMM_C, }, + [31] = { SMIMM_D, }, +}; + bool v3d_qpu_sig_unpack(const struct v3d_device_info *devinfo, uint32_t packed_sig, @@ -221,7 +258,9 @@ v3d_qpu_sig_unpack(const struct v3d_device_info *devinfo, if (packed_sig >= ARRAY_SIZE(v33_sig_map)) return false; - if (devinfo->ver >= 41) + if (devinfo->ver >= 71) + *sig = v71_sig_map[packed_sig]; + else if (devinfo->ver >= 41) *sig = v41_sig_map[packed_sig]; else if (devinfo->ver == 40) *sig = v40_sig_map[packed_sig]; @@ -240,7 +279,9 @@ v3d_qpu_sig_pack(const struct v3d_device_info *devinfo, { static const struct v3d_qpu_sig *map; - if (devinfo->ver >= 41) + if (devinfo->ver >= 71) + map = v71_sig_map; + else if (devinfo->ver >= 41) map = v41_sig_map; else if (devinfo->ver == 40) map = v40_sig_map; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0011-broadcom-qpu-define-v3d_qpu_input-use-on-v3d_qpu_alu.patch ================================================ From d10e67a396d713ec81fb133f3516e09fe1e067b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Fri, 6 Aug 2021 01:22:31 +0200 Subject: [PATCH 011/142] broadcom/qpu: define v3d_qpu_input, use on v3d_qpu_alu_instr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit At this point it just tidy up a little the alu_instr structure. But also serves to prepare the structure for new changes, as 7.x uses raddr instead of mux, and it is just easier to add the raddr to the new input structure. Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com> Signed-off-by: Iago Toral Quiroga <itoral@igalia.com> --- src/broadcom/compiler/qpu_schedule.c | 65 +++++++-------- src/broadcom/compiler/vir.c | 16 ++-- src/broadcom/compiler/vir_dump.c | 8 +- .../compiler/vir_opt_copy_propagate.c | 12 +-- .../compiler/vir_opt_redundant_flags.c | 8 +- src/broadcom/compiler/vir_to_qpu.c | 30 +++---- src/broadcom/qpu/qpu_disasm.c | 16 ++-- src/broadcom/qpu/qpu_instr.c | 8 +- src/broadcom/qpu/qpu_instr.h | 13 +-- src/broadcom/qpu/qpu_pack.c | 82 +++++++++---------- src/broadcom/qpu/tests/qpu_disasm.c | 8 +- 11 files changed, 134 insertions(+), 132 deletions(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index a10fa03ed10..455fa3867be 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -306,14 +306,14 @@ calculate_deps(struct schedule_state *state, struct schedule_node *n) /* XXX: LOAD_IMM */ if (v3d_qpu_add_op_num_src(inst->alu.add.op) > 0) - process_mux_deps(state, n, inst->alu.add.a); + process_mux_deps(state, n, inst->alu.add.a.mux); if (v3d_qpu_add_op_num_src(inst->alu.add.op) > 1) - process_mux_deps(state, n, inst->alu.add.b); + process_mux_deps(state, n, inst->alu.add.b.mux); if (v3d_qpu_mul_op_num_src(inst->alu.mul.op) > 0) - process_mux_deps(state, n, inst->alu.mul.a); + process_mux_deps(state, n, inst->alu.mul.a.mux); if (v3d_qpu_mul_op_num_src(inst->alu.mul.op) > 1) - process_mux_deps(state, n, inst->alu.mul.b); + process_mux_deps(state, n, inst->alu.mul.b.mux); switch (inst->alu.add.op) { case V3D_QPU_A_VPMSETUP: @@ -537,22 +537,22 @@ reads_too_soon_after_write(struct choose_scoreboard *scoreboard, if (inst->alu.add.op != V3D_QPU_A_NOP) { if (v3d_qpu_add_op_num_src(inst->alu.add.op) > 0 && - mux_reads_too_soon(scoreboard, inst, inst->alu.add.a)) { + mux_reads_too_soon(scoreboard, inst, inst->alu.add.a.mux)) { return true; } if (v3d_qpu_add_op_num_src(inst->alu.add.op) > 1 && - mux_reads_too_soon(scoreboard, inst, inst->alu.add.b)) { + mux_reads_too_soon(scoreboard, inst, inst->alu.add.b.mux)) { return true; } } if (inst->alu.mul.op != V3D_QPU_M_NOP) { if (v3d_qpu_mul_op_num_src(inst->alu.mul.op) > 0 && - mux_reads_too_soon(scoreboard, inst, inst->alu.mul.a)) { + mux_reads_too_soon(scoreboard, inst, inst->alu.mul.a.mux)) { return true; } if (v3d_qpu_mul_op_num_src(inst->alu.mul.op) > 1 && - mux_reads_too_soon(scoreboard, inst, inst->alu.mul.b)) { + mux_reads_too_soon(scoreboard, inst, inst->alu.mul.b.mux)) { return true; } } @@ -839,20 +839,20 @@ qpu_merge_raddrs(struct v3d_qpu_instr *result, if (!result->sig.small_imm_b) { if (v3d_qpu_uses_mux(add_instr, V3D_QPU_MUX_B) && raddr_a == add_instr->raddr_b) { - if (add_instr->alu.add.a == V3D_QPU_MUX_B) - result->alu.add.a = V3D_QPU_MUX_A; - if (add_instr->alu.add.b == V3D_QPU_MUX_B && + if (add_instr->alu.add.a.mux == V3D_QPU_MUX_B) + result->alu.add.a.mux = V3D_QPU_MUX_A; + if (add_instr->alu.add.b.mux == V3D_QPU_MUX_B && v3d_qpu_add_op_num_src(add_instr->alu.add.op) > 1) { - result->alu.add.b = V3D_QPU_MUX_A; + result->alu.add.b.mux = V3D_QPU_MUX_A; } } if (v3d_qpu_uses_mux(mul_instr, V3D_QPU_MUX_B) && raddr_a == mul_instr->raddr_b) { - if (mul_instr->alu.mul.a == V3D_QPU_MUX_B) - result->alu.mul.a = V3D_QPU_MUX_A; - if (mul_instr->alu.mul.b == V3D_QPU_MUX_B && + if (mul_instr->alu.mul.a.mux == V3D_QPU_MUX_B) + result->alu.mul.a.mux = V3D_QPU_MUX_A; + if (mul_instr->alu.mul.b.mux == V3D_QPU_MUX_B && v3d_qpu_mul_op_num_src(mul_instr->alu.mul.op) > 1) { - result->alu.mul.b = V3D_QPU_MUX_A; + result->alu.mul.b.mux = V3D_QPU_MUX_A; } } } @@ -863,20 +863,20 @@ qpu_merge_raddrs(struct v3d_qpu_instr *result, result->raddr_b = raddr_b; if (v3d_qpu_uses_mux(add_instr, V3D_QPU_MUX_A) && raddr_b == add_instr->raddr_a) { - if (add_instr->alu.add.a == V3D_QPU_MUX_A) - result->alu.add.a = V3D_QPU_MUX_B; - if (add_instr->alu.add.b == V3D_QPU_MUX_A && + if (add_instr->alu.add.a.mux == V3D_QPU_MUX_A) + result->alu.add.a.mux = V3D_QPU_MUX_B; + if (add_instr->alu.add.b.mux == V3D_QPU_MUX_A && v3d_qpu_add_op_num_src(add_instr->alu.add.op) > 1) { - result->alu.add.b = V3D_QPU_MUX_B; + result->alu.add.b.mux = V3D_QPU_MUX_B; } } if (v3d_qpu_uses_mux(mul_instr, V3D_QPU_MUX_A) && raddr_b == mul_instr->raddr_a) { - if (mul_instr->alu.mul.a == V3D_QPU_MUX_A) - result->alu.mul.a = V3D_QPU_MUX_B; - if (mul_instr->alu.mul.b == V3D_QPU_MUX_A && + if (mul_instr->alu.mul.a.mux == V3D_QPU_MUX_A) + result->alu.mul.a.mux = V3D_QPU_MUX_B; + if (mul_instr->alu.mul.b.mux == V3D_QPU_MUX_A && v3d_qpu_mul_op_num_src(mul_instr->alu.mul.op) > 1) { - result->alu.mul.b = V3D_QPU_MUX_B; + result->alu.mul.b.mux = V3D_QPU_MUX_B; } } @@ -927,11 +927,12 @@ qpu_convert_add_to_mul(struct v3d_qpu_instr *inst) inst->flags.auf = V3D_QPU_UF_NONE; inst->alu.mul.output_pack = inst->alu.add.output_pack; - inst->alu.mul.a_unpack = inst->alu.add.a_unpack; - inst->alu.mul.b_unpack = inst->alu.add.b_unpack; + + inst->alu.mul.a.unpack = inst->alu.add.a.unpack; + inst->alu.mul.b.unpack = inst->alu.add.b.unpack; inst->alu.add.output_pack = V3D_QPU_PACK_NONE; - inst->alu.add.a_unpack = V3D_QPU_UNPACK_NONE; - inst->alu.add.b_unpack = V3D_QPU_UNPACK_NONE; + inst->alu.add.a.unpack = V3D_QPU_UNPACK_NONE; + inst->alu.add.b.unpack = V3D_QPU_UNPACK_NONE; } static bool @@ -2064,12 +2065,12 @@ alu_reads_register(struct v3d_qpu_instr *inst, if (add) { num_src = v3d_qpu_add_op_num_src(inst->alu.add.op); - mux_a = inst->alu.add.a; - mux_b = inst->alu.add.b; + mux_a = inst->alu.add.a.mux; + mux_b = inst->alu.add.b.mux; } else { num_src = v3d_qpu_mul_op_num_src(inst->alu.mul.op); - mux_a = inst->alu.mul.a; - mux_b = inst->alu.mul.b; + mux_a = inst->alu.mul.a.mux; + mux_b = inst->alu.mul.b.mux; } for (int i = 0; i < num_src; i++) { diff --git a/src/broadcom/compiler/vir.c b/src/broadcom/compiler/vir.c index 660b11b0577..007cb0a941b 100644 --- a/src/broadcom/compiler/vir.c +++ b/src/broadcom/compiler/vir.c @@ -113,10 +113,10 @@ vir_is_raw_mov(struct qinst *inst) return false; } - if (inst->qpu.alu.add.a_unpack != V3D_QPU_UNPACK_NONE || - inst->qpu.alu.add.b_unpack != V3D_QPU_UNPACK_NONE || - inst->qpu.alu.mul.a_unpack != V3D_QPU_UNPACK_NONE || - inst->qpu.alu.mul.b_unpack != V3D_QPU_UNPACK_NONE) { + if (inst->qpu.alu.add.a.unpack != V3D_QPU_UNPACK_NONE || + inst->qpu.alu.add.b.unpack != V3D_QPU_UNPACK_NONE || + inst->qpu.alu.mul.a.unpack != V3D_QPU_UNPACK_NONE || + inst->qpu.alu.mul.b.unpack != V3D_QPU_UNPACK_NONE) { return false; } @@ -209,15 +209,15 @@ vir_set_unpack(struct qinst *inst, int src, if (vir_is_add(inst)) { if (src == 0) - inst->qpu.alu.add.a_unpack = unpack; + inst->qpu.alu.add.a.unpack = unpack; else - inst->qpu.alu.add.b_unpack = unpack; + inst->qpu.alu.add.b.unpack = unpack; } else { assert(vir_is_mul(inst)); if (src == 0) - inst->qpu.alu.mul.a_unpack = unpack; + inst->qpu.alu.mul.a.unpack = unpack; else - inst->qpu.alu.mul.b_unpack = unpack; + inst->qpu.alu.mul.b.unpack = unpack; } } diff --git a/src/broadcom/compiler/vir_dump.c b/src/broadcom/compiler/vir_dump.c index 5c47bbdc1b0..ab5d4043039 100644 --- a/src/broadcom/compiler/vir_dump.c +++ b/src/broadcom/compiler/vir_dump.c @@ -270,8 +270,8 @@ vir_dump_alu(struct v3d_compile *c, struct qinst *inst) vir_print_reg(c, inst, inst->dst); fprintf(stderr, "%s", v3d_qpu_pack_name(instr->alu.add.output_pack)); - unpack[0] = instr->alu.add.a_unpack; - unpack[1] = instr->alu.add.b_unpack; + unpack[0] = instr->alu.add.a.unpack; + unpack[1] = instr->alu.add.b.unpack; } else { fprintf(stderr, "%s", v3d_qpu_mul_op_name(instr->alu.mul.op)); fprintf(stderr, "%s", v3d_qpu_cond_name(instr->flags.mc)); @@ -282,8 +282,8 @@ vir_dump_alu(struct v3d_compile *c, struct qinst *inst) vir_print_reg(c, inst, inst->dst); fprintf(stderr, "%s", v3d_qpu_pack_name(instr->alu.mul.output_pack)); - unpack[0] = instr->alu.mul.a_unpack; - unpack[1] = instr->alu.mul.b_unpack; + unpack[0] = instr->alu.mul.a.unpack; + unpack[1] = instr->alu.mul.b.unpack; } for (int i = 0; i < nsrc; i++) { diff --git a/src/broadcom/compiler/vir_opt_copy_propagate.c b/src/broadcom/compiler/vir_opt_copy_propagate.c index da121c2a5bd..c4aa7255a17 100644 --- a/src/broadcom/compiler/vir_opt_copy_propagate.c +++ b/src/broadcom/compiler/vir_opt_copy_propagate.c @@ -104,14 +104,14 @@ vir_has_unpack(struct qinst *inst, int chan) if (vir_is_add(inst)) { if (chan == 0) - return inst->qpu.alu.add.a_unpack != V3D_QPU_UNPACK_NONE; + return inst->qpu.alu.add.a.unpack != V3D_QPU_UNPACK_NONE; else - return inst->qpu.alu.add.b_unpack != V3D_QPU_UNPACK_NONE; + return inst->qpu.alu.add.b.unpack != V3D_QPU_UNPACK_NONE; } else { if (chan == 0) - return inst->qpu.alu.mul.a_unpack != V3D_QPU_UNPACK_NONE; + return inst->qpu.alu.mul.a.unpack != V3D_QPU_UNPACK_NONE; else - return inst->qpu.alu.mul.b_unpack != V3D_QPU_UNPACK_NONE; + return inst->qpu.alu.mul.b.unpack != V3D_QPU_UNPACK_NONE; } } @@ -161,7 +161,7 @@ try_copy_prop(struct v3d_compile *c, struct qinst *inst, struct qinst **movs) continue; /* these ops can't represent abs. */ - if (mov->qpu.alu.mul.a_unpack == V3D_QPU_UNPACK_ABS) { + if (mov->qpu.alu.mul.a.unpack == V3D_QPU_UNPACK_ABS) { switch (inst->qpu.alu.add.op) { case V3D_QPU_A_VFPACK: case V3D_QPU_A_FROUND: @@ -189,7 +189,7 @@ try_copy_prop(struct v3d_compile *c, struct qinst *inst, struct qinst **movs) inst->src[i] = mov->src[0]; if (vir_has_unpack(mov, 0)) { - enum v3d_qpu_input_unpack unpack = mov->qpu.alu.mul.a_unpack; + enum v3d_qpu_input_unpack unpack = mov->qpu.alu.mul.a.unpack; vir_set_unpack(inst, i, unpack); } diff --git a/src/broadcom/compiler/vir_opt_redundant_flags.c b/src/broadcom/compiler/vir_opt_redundant_flags.c index c7896d57f2b..6b61ed6a39a 100644 --- a/src/broadcom/compiler/vir_opt_redundant_flags.c +++ b/src/broadcom/compiler/vir_opt_redundant_flags.c @@ -81,11 +81,11 @@ vir_instr_flags_op_equal(struct qinst *a, struct qinst *b) a->qpu.flags.mpf != b->qpu.flags.mpf || a->qpu.alu.add.op != b->qpu.alu.add.op || a->qpu.alu.mul.op != b->qpu.alu.mul.op || - a->qpu.alu.add.a_unpack != b->qpu.alu.add.a_unpack || - a->qpu.alu.add.b_unpack != b->qpu.alu.add.b_unpack || + a->qpu.alu.add.a.unpack != b->qpu.alu.add.a.unpack || + a->qpu.alu.add.b.unpack != b->qpu.alu.add.b.unpack || a->qpu.alu.add.output_pack != b->qpu.alu.add.output_pack || - a->qpu.alu.mul.a_unpack != b->qpu.alu.mul.a_unpack || - a->qpu.alu.mul.b_unpack != b->qpu.alu.mul.b_unpack || + a->qpu.alu.mul.a.unpack != b->qpu.alu.mul.a.unpack || + a->qpu.alu.mul.b.unpack != b->qpu.alu.mul.b.unpack || a->qpu.alu.mul.output_pack != b->qpu.alu.mul.output_pack) { return false; } diff --git a/src/broadcom/compiler/vir_to_qpu.c b/src/broadcom/compiler/vir_to_qpu.c index 15c2e3674c2..c8b6e0a91a0 100644 --- a/src/broadcom/compiler/vir_to_qpu.c +++ b/src/broadcom/compiler/vir_to_qpu.c @@ -106,20 +106,20 @@ set_src(struct v3d_qpu_instr *instr, enum v3d_qpu_mux *mux, struct qpu_reg src) return; } - if (instr->alu.add.a != V3D_QPU_MUX_A && - instr->alu.add.b != V3D_QPU_MUX_A && - instr->alu.mul.a != V3D_QPU_MUX_A && - instr->alu.mul.b != V3D_QPU_MUX_A) { + if (instr->alu.add.a.mux != V3D_QPU_MUX_A && + instr->alu.add.b.mux != V3D_QPU_MUX_A && + instr->alu.mul.a.mux != V3D_QPU_MUX_A && + instr->alu.mul.b.mux != V3D_QPU_MUX_A) { instr->raddr_a = src.index; *mux = V3D_QPU_MUX_A; } else { if (instr->raddr_a == src.index) { *mux = V3D_QPU_MUX_A; } else { - assert(!(instr->alu.add.a == V3D_QPU_MUX_B && - instr->alu.add.b == V3D_QPU_MUX_B && - instr->alu.mul.a == V3D_QPU_MUX_B && - instr->alu.mul.b == V3D_QPU_MUX_B) || + assert(!(instr->alu.add.a.mux == V3D_QPU_MUX_B && + instr->alu.add.b.mux == V3D_QPU_MUX_B && + instr->alu.mul.a.mux == V3D_QPU_MUX_B && + instr->alu.mul.b.mux == V3D_QPU_MUX_B) || src.index == instr->raddr_b); instr->raddr_b = src.index; @@ -147,14 +147,14 @@ is_no_op_mov(struct qinst *qinst) if (waddr < V3D_QPU_WADDR_R0 || waddr > V3D_QPU_WADDR_R4) return false; - if (qinst->qpu.alu.mul.a != + if (qinst->qpu.alu.mul.a.mux != V3D_QPU_MUX_R0 + (waddr - V3D_QPU_WADDR_R0)) { return false; } } else { int raddr; - switch (qinst->qpu.alu.mul.a) { + switch (qinst->qpu.alu.mul.a.mux) { case V3D_QPU_MUX_A: raddr = qinst->qpu.raddr_a; break; @@ -171,7 +171,7 @@ is_no_op_mov(struct qinst *qinst) /* No packing or flags updates, or we need to execute the * instruction. */ - if (qinst->qpu.alu.mul.a_unpack != V3D_QPU_UNPACK_NONE || + if (qinst->qpu.alu.mul.a.unpack != V3D_QPU_UNPACK_NONE || qinst->qpu.alu.mul.output_pack != V3D_QPU_PACK_NONE || qinst->qpu.flags.mc != V3D_QPU_COND_NONE || qinst->qpu.flags.mpf != V3D_QPU_PF_NONE || @@ -302,11 +302,11 @@ v3d_generate_code_block(struct v3d_compile *c, assert(qinst->qpu.alu.mul.op == V3D_QPU_M_NOP); if (nsrc >= 1) { set_src(&qinst->qpu, - &qinst->qpu.alu.add.a, src[0]); + &qinst->qpu.alu.add.a.mux, src[0]); } if (nsrc >= 2) { set_src(&qinst->qpu, - &qinst->qpu.alu.add.b, src[1]); + &qinst->qpu.alu.add.b.mux, src[1]); } qinst->qpu.alu.add.waddr = dst.index; @@ -314,11 +314,11 @@ v3d_generate_code_block(struct v3d_compile *c, } else { if (nsrc >= 1) { set_src(&qinst->qpu, - &qinst->qpu.alu.mul.a, src[0]); + &qinst->qpu.alu.mul.a.mux, src[0]); } if (nsrc >= 2) { set_src(&qinst->qpu, - &qinst->qpu.alu.mul.b, src[1]); + &qinst->qpu.alu.mul.b.mux, src[1]); } qinst->qpu.alu.mul.waddr = dst.index; diff --git a/src/broadcom/qpu/qpu_disasm.c b/src/broadcom/qpu/qpu_disasm.c index 6aca3c28e78..588a665f770 100644 --- a/src/broadcom/qpu/qpu_disasm.c +++ b/src/broadcom/qpu/qpu_disasm.c @@ -121,16 +121,16 @@ v3d_qpu_disasm_add(struct disasm_state *disasm, if (num_src >= 1) { if (has_dst) append(disasm, ", "); - v3d_qpu_disasm_raddr(disasm, instr, instr->alu.add.a); + v3d_qpu_disasm_raddr(disasm, instr, instr->alu.add.a.mux); append(disasm, "%s", - v3d_qpu_unpack_name(instr->alu.add.a_unpack)); + v3d_qpu_unpack_name(instr->alu.add.a.unpack)); } if (num_src >= 2) { append(disasm, ", "); - v3d_qpu_disasm_raddr(disasm, instr, instr->alu.add.b); + v3d_qpu_disasm_raddr(disasm, instr, instr->alu.add.b.mux); append(disasm, "%s", - v3d_qpu_unpack_name(instr->alu.add.b_unpack)); + v3d_qpu_unpack_name(instr->alu.add.b.unpack)); } } @@ -164,16 +164,16 @@ v3d_qpu_disasm_mul(struct disasm_state *disasm, if (num_src >= 1) { if (has_dst) append(disasm, ", "); - v3d_qpu_disasm_raddr(disasm, instr, instr->alu.mul.a); + v3d_qpu_disasm_raddr(disasm, instr, instr->alu.mul.a.mux); append(disasm, "%s", - v3d_qpu_unpack_name(instr->alu.mul.a_unpack)); + v3d_qpu_unpack_name(instr->alu.mul.a.unpack)); } if (num_src >= 2) { append(disasm, ", "); - v3d_qpu_disasm_raddr(disasm, instr, instr->alu.mul.b); + v3d_qpu_disasm_raddr(disasm, instr, instr->alu.mul.b.mux); append(disasm, "%s", - v3d_qpu_unpack_name(instr->alu.mul.b_unpack)); + v3d_qpu_unpack_name(instr->alu.mul.b.unpack)); } } diff --git a/src/broadcom/qpu/qpu_instr.c b/src/broadcom/qpu/qpu_instr.c index 7759fb0efdf..7ece8b5e570 100644 --- a/src/broadcom/qpu/qpu_instr.c +++ b/src/broadcom/qpu/qpu_instr.c @@ -926,10 +926,10 @@ v3d_qpu_uses_mux(const struct v3d_qpu_instr *inst, enum v3d_qpu_mux mux) int add_nsrc = v3d_qpu_add_op_num_src(inst->alu.add.op); int mul_nsrc = v3d_qpu_mul_op_num_src(inst->alu.mul.op); - return ((add_nsrc > 0 && inst->alu.add.a == mux) || - (add_nsrc > 1 && inst->alu.add.b == mux) || - (mul_nsrc > 0 && inst->alu.mul.a == mux) || - (mul_nsrc > 1 && inst->alu.mul.b == mux)); + return ((add_nsrc > 0 && inst->alu.add.a.mux == mux) || + (add_nsrc > 1 && inst->alu.add.b.mux == mux) || + (mul_nsrc > 0 && inst->alu.mul.a.mux == mux) || + (mul_nsrc > 1 && inst->alu.mul.b.mux == mux)); } bool diff --git a/src/broadcom/qpu/qpu_instr.h b/src/broadcom/qpu/qpu_instr.h index 13b3f37d43f..53a51bfb3e1 100644 --- a/src/broadcom/qpu/qpu_instr.h +++ b/src/broadcom/qpu/qpu_instr.h @@ -294,25 +294,26 @@ enum v3d_qpu_mux { V3D_QPU_MUX_B, }; +struct v3d_qpu_input { + enum v3d_qpu_mux mux; + enum v3d_qpu_input_unpack unpack; +}; + struct v3d_qpu_alu_instr { struct { enum v3d_qpu_add_op op; - enum v3d_qpu_mux a, b; + struct v3d_qpu_input a, b; uint8_t waddr; bool magic_write; enum v3d_qpu_output_pack output_pack; - enum v3d_qpu_input_unpack a_unpack; - enum v3d_qpu_input_unpack b_unpack; } add; struct { enum v3d_qpu_mul_op op; - enum v3d_qpu_mux a, b; + struct v3d_qpu_input a, b; uint8_t waddr; bool magic_write; enum v3d_qpu_output_pack output_pack; - enum v3d_qpu_input_unpack a_unpack; - enum v3d_qpu_input_unpack b_unpack; } mul; }; diff --git a/src/broadcom/qpu/qpu_pack.c b/src/broadcom/qpu/qpu_pack.c index 2820d9d4c56..6e975793fc0 100644 --- a/src/broadcom/qpu/qpu_pack.c +++ b/src/broadcom/qpu/qpu_pack.c @@ -853,12 +853,12 @@ v3d_qpu_add_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, instr->alu.add.output_pack = V3D_QPU_PACK_NONE; if (!v3d_qpu_float32_unpack_unpack((op >> 2) & 0x3, - &instr->alu.add.a_unpack)) { + &instr->alu.add.a.unpack)) { return false; } if (!v3d_qpu_float32_unpack_unpack((op >> 0) & 0x3, - &instr->alu.add.b_unpack)) { + &instr->alu.add.b.unpack)) { return false; } break; @@ -872,7 +872,7 @@ v3d_qpu_add_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, instr->alu.add.output_pack = mux_b & 0x3; if (!v3d_qpu_float32_unpack_unpack((op >> 2) & 0x3, - &instr->alu.add.a_unpack)) { + &instr->alu.add.a.unpack)) { return false; } break; @@ -884,7 +884,7 @@ v3d_qpu_add_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, instr->alu.add.output_pack = V3D_QPU_PACK_NONE; if (!v3d_qpu_float32_unpack_unpack((op >> 2) & 0x3, - &instr->alu.add.a_unpack)) { + &instr->alu.add.a.unpack)) { return false; } break; @@ -892,23 +892,23 @@ v3d_qpu_add_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, case V3D_QPU_A_VFMIN: case V3D_QPU_A_VFMAX: if (!v3d_qpu_float16_unpack_unpack(op & 0x7, - &instr->alu.add.a_unpack)) { + &instr->alu.add.a.unpack)) { return false; } instr->alu.add.output_pack = V3D_QPU_PACK_NONE; - instr->alu.add.b_unpack = V3D_QPU_UNPACK_NONE; + instr->alu.add.b.unpack = V3D_QPU_UNPACK_NONE; break; default: instr->alu.add.output_pack = V3D_QPU_PACK_NONE; - instr->alu.add.a_unpack = V3D_QPU_UNPACK_NONE; - instr->alu.add.b_unpack = V3D_QPU_UNPACK_NONE; + instr->alu.add.a.unpack = V3D_QPU_UNPACK_NONE; + instr->alu.add.b.unpack = V3D_QPU_UNPACK_NONE; break; } - instr->alu.add.a = mux_a; - instr->alu.add.b = mux_b; + instr->alu.add.a.mux = mux_a; + instr->alu.add.b.mux = mux_b; instr->alu.add.waddr = QPU_GET_FIELD(packed_inst, V3D_QPU_WADDR_A); instr->alu.add.magic_write = false; @@ -956,12 +956,12 @@ v3d_qpu_mul_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, instr->alu.mul.output_pack = ((op >> 4) & 0x3) - 1; if (!v3d_qpu_float32_unpack_unpack((op >> 2) & 0x3, - &instr->alu.mul.a_unpack)) { + &instr->alu.mul.a.unpack)) { return false; } if (!v3d_qpu_float32_unpack_unpack((op >> 0) & 0x3, - &instr->alu.mul.b_unpack)) { + &instr->alu.mul.b.unpack)) { return false; } @@ -972,7 +972,7 @@ v3d_qpu_mul_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, ((mux_b >> 2) & 1)); if (!v3d_qpu_float32_unpack_unpack(mux_b & 0x3, - &instr->alu.mul.a_unpack)) { + &instr->alu.mul.a.unpack)) { return false; } @@ -982,23 +982,23 @@ v3d_qpu_mul_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, instr->alu.mul.output_pack = V3D_QPU_PACK_NONE; if (!v3d_qpu_float16_unpack_unpack(((op & 0x7) - 4) & 7, - &instr->alu.mul.a_unpack)) { + &instr->alu.mul.a.unpack)) { return false; } - instr->alu.mul.b_unpack = V3D_QPU_UNPACK_NONE; + instr->alu.mul.b.unpack = V3D_QPU_UNPACK_NONE; break; default: instr->alu.mul.output_pack = V3D_QPU_PACK_NONE; - instr->alu.mul.a_unpack = V3D_QPU_UNPACK_NONE; - instr->alu.mul.b_unpack = V3D_QPU_UNPACK_NONE; + instr->alu.mul.a.unpack = V3D_QPU_UNPACK_NONE; + instr->alu.mul.b.unpack = V3D_QPU_UNPACK_NONE; break; } - instr->alu.mul.a = mux_a; - instr->alu.mul.b = mux_b; + instr->alu.mul.a.mux = mux_a; + instr->alu.mul.b.mux = mux_b; instr->alu.mul.waddr = QPU_GET_FIELD(packed_inst, V3D_QPU_WADDR_M); instr->alu.mul.magic_write = packed_inst & V3D_QPU_MM; @@ -1030,8 +1030,8 @@ v3d_qpu_add_pack(const struct v3d_device_info *devinfo, const struct v3d_qpu_instr *instr, uint64_t *packed_instr) { uint32_t waddr = instr->alu.add.waddr; - uint32_t mux_a = instr->alu.add.a; - uint32_t mux_b = instr->alu.add.b; + uint32_t mux_a = instr->alu.add.a.mux; + uint32_t mux_b = instr->alu.add.b.mux; int nsrc = v3d_qpu_add_op_num_src(instr->alu.add.op); const struct opcode_desc *desc = lookup_opcode_from_instr(devinfo, add_ops, ARRAY_SIZE(add_ops), @@ -1102,12 +1102,12 @@ v3d_qpu_add_pack(const struct v3d_device_info *devinfo, } opcode |= output_pack << 4; - if (!v3d_qpu_float32_unpack_pack(instr->alu.add.a_unpack, + if (!v3d_qpu_float32_unpack_pack(instr->alu.add.a.unpack, &a_unpack)) { return false; } - if (!v3d_qpu_float32_unpack_pack(instr->alu.add.b_unpack, + if (!v3d_qpu_float32_unpack_pack(instr->alu.add.b.unpack, &b_unpack)) { return false; } @@ -1141,17 +1141,17 @@ v3d_qpu_add_pack(const struct v3d_device_info *devinfo, uint32_t a_unpack; uint32_t b_unpack; - if (instr->alu.add.a_unpack == V3D_QPU_UNPACK_ABS || - instr->alu.add.b_unpack == V3D_QPU_UNPACK_ABS) { + if (instr->alu.add.a.unpack == V3D_QPU_UNPACK_ABS || + instr->alu.add.b.unpack == V3D_QPU_UNPACK_ABS) { return false; } - if (!v3d_qpu_float32_unpack_pack(instr->alu.add.a_unpack, + if (!v3d_qpu_float32_unpack_pack(instr->alu.add.a.unpack, &a_unpack)) { return false; } - if (!v3d_qpu_float32_unpack_pack(instr->alu.add.b_unpack, + if (!v3d_qpu_float32_unpack_pack(instr->alu.add.b.unpack, &b_unpack)) { return false; } @@ -1176,7 +1176,7 @@ v3d_qpu_add_pack(const struct v3d_device_info *devinfo, } mux_b |= packed; - if (!v3d_qpu_float32_unpack_pack(instr->alu.add.a_unpack, + if (!v3d_qpu_float32_unpack_pack(instr->alu.add.a.unpack, &packed)) { return false; } @@ -1194,7 +1194,7 @@ v3d_qpu_add_pack(const struct v3d_device_info *devinfo, return false; uint32_t packed; - if (!v3d_qpu_float32_unpack_pack(instr->alu.add.a_unpack, + if (!v3d_qpu_float32_unpack_pack(instr->alu.add.a.unpack, &packed)) { return false; } @@ -1207,11 +1207,11 @@ v3d_qpu_add_pack(const struct v3d_device_info *devinfo, case V3D_QPU_A_VFMIN: case V3D_QPU_A_VFMAX: if (instr->alu.add.output_pack != V3D_QPU_PACK_NONE || - instr->alu.add.b_unpack != V3D_QPU_UNPACK_NONE) { + instr->alu.add.b.unpack != V3D_QPU_UNPACK_NONE) { return false; } - if (!v3d_qpu_float16_unpack_pack(instr->alu.add.a_unpack, + if (!v3d_qpu_float16_unpack_pack(instr->alu.add.a.unpack, &packed)) { return false; } @@ -1221,8 +1221,8 @@ v3d_qpu_add_pack(const struct v3d_device_info *devinfo, default: if (instr->alu.add.op != V3D_QPU_A_NOP && (instr->alu.add.output_pack != V3D_QPU_PACK_NONE || - instr->alu.add.a_unpack != V3D_QPU_UNPACK_NONE || - instr->alu.add.b_unpack != V3D_QPU_UNPACK_NONE)) { + instr->alu.add.a.unpack != V3D_QPU_UNPACK_NONE || + instr->alu.add.b.unpack != V3D_QPU_UNPACK_NONE)) { return false; } break; @@ -1242,8 +1242,8 @@ static bool v3d_qpu_mul_pack(const struct v3d_device_info *devinfo, const struct v3d_qpu_instr *instr, uint64_t *packed_instr) { - uint32_t mux_a = instr->alu.mul.a; - uint32_t mux_b = instr->alu.mul.b; + uint32_t mux_a = instr->alu.mul.a.mux; + uint32_t mux_b = instr->alu.mul.b.mux; int nsrc = v3d_qpu_mul_op_num_src(instr->alu.mul.op); const struct opcode_desc *desc = @@ -1277,13 +1277,13 @@ v3d_qpu_mul_pack(const struct v3d_device_info *devinfo, */ opcode += packed << 4; - if (!v3d_qpu_float32_unpack_pack(instr->alu.mul.a_unpack, + if (!v3d_qpu_float32_unpack_pack(instr->alu.mul.a.unpack, &packed)) { return false; } opcode |= packed << 2; - if (!v3d_qpu_float32_unpack_pack(instr->alu.mul.b_unpack, + if (!v3d_qpu_float32_unpack_pack(instr->alu.mul.b.unpack, &packed)) { return false; } @@ -1301,7 +1301,7 @@ v3d_qpu_mul_pack(const struct v3d_device_info *devinfo, opcode |= (packed >> 1) & 1; mux_b = (packed & 1) << 2; - if (!v3d_qpu_float32_unpack_pack(instr->alu.mul.a_unpack, + if (!v3d_qpu_float32_unpack_pack(instr->alu.mul.a.unpack, &packed)) { return false; } @@ -1315,16 +1315,16 @@ v3d_qpu_mul_pack(const struct v3d_device_info *devinfo, if (instr->alu.mul.output_pack != V3D_QPU_PACK_NONE) return false; - if (!v3d_qpu_float16_unpack_pack(instr->alu.mul.a_unpack, + if (!v3d_qpu_float16_unpack_pack(instr->alu.mul.a.unpack, &packed)) { return false; } - if (instr->alu.mul.a_unpack == V3D_QPU_UNPACK_SWAP_16) + if (instr->alu.mul.a.unpack == V3D_QPU_UNPACK_SWAP_16) opcode = 8; else opcode |= (packed + 4) & 7; - if (instr->alu.mul.b_unpack != V3D_QPU_UNPACK_NONE) + if (instr->alu.mul.b.unpack != V3D_QPU_UNPACK_NONE) return false; break; diff --git a/src/broadcom/qpu/tests/qpu_disasm.c b/src/broadcom/qpu/tests/qpu_disasm.c index 2f8e19c73fe..be7b78d5ef0 100644 --- a/src/broadcom/qpu/tests/qpu_disasm.c +++ b/src/broadcom/qpu/tests/qpu_disasm.c @@ -160,10 +160,10 @@ main(int argc, char **argv) /* Swap the operands to be sure that we test * how the QPUs distinguish between these ops. */ - swap_mux(&instr.alu.add.a, - &instr.alu.add.b); - swap_pack(&instr.alu.add.a_unpack, - &instr.alu.add.b_unpack); + swap_mux(&instr.alu.add.a.mux, + &instr.alu.add.b.mux); + swap_pack(&instr.alu.add.a.unpack, + &instr.alu.add.b.unpack); break; default: break; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0012-broadcom-qpu-add-raddr-on-v3d_qpu_input.patch ================================================ From 52ea09792ff8a438ccdecac47b8415657be90098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Fri, 6 Aug 2021 01:33:32 +0200 Subject: [PATCH 012/142] broadcom/qpu: add raddr on v3d_qpu_input On V3D 7.x mux are not used, and raddr_a/b/c/d are used instead This is not perfect, as for v71, the raddr_a/b defined at qpu_instr became superfluous. But the alternative would be to define two different structs, or even having them defined based on version ifdefs, so this is a reasonable compromise. --- src/broadcom/qpu/qpu_instr.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/broadcom/qpu/qpu_instr.h b/src/broadcom/qpu/qpu_instr.h index 53a51bfb3e1..9e56e2d6a99 100644 --- a/src/broadcom/qpu/qpu_instr.h +++ b/src/broadcom/qpu/qpu_instr.h @@ -295,7 +295,10 @@ enum v3d_qpu_mux { }; struct v3d_qpu_input { - enum v3d_qpu_mux mux; + union { + enum v3d_qpu_mux mux; /* V3D 4.x */ + uint8_t raddr; /* V3D 7.x */ + }; enum v3d_qpu_input_unpack unpack; }; @@ -385,8 +388,8 @@ struct v3d_qpu_instr { struct v3d_qpu_sig sig; uint8_t sig_addr; bool sig_magic; /* If the signal writes to a magic address */ - uint8_t raddr_a; - uint8_t raddr_b; + uint8_t raddr_a; /* V3D 4.x */ + uint8_t raddr_b; /* V3D 4.x*/ struct v3d_qpu_flags flags; union { -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0013-broadcom-qpu-defining-shift-mask-for-raddr_c-d.patch ================================================ From 3e5ad0881c2789619cdf65f40a44d5481e28e800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 12 Aug 2021 02:24:02 +0200 Subject: [PATCH 013/142] broadcom/qpu: defining shift/mask for raddr_c/d On V3D 7.x it replaces mul_a/b and add_a/b --- src/broadcom/qpu/qpu_pack.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/broadcom/qpu/qpu_pack.c b/src/broadcom/qpu/qpu_pack.c index 6e975793fc0..4f106909729 100644 --- a/src/broadcom/qpu/qpu_pack.c +++ b/src/broadcom/qpu/qpu_pack.c @@ -84,6 +84,9 @@ #define V3D_QPU_MUL_A_SHIFT 18 #define V3D_QPU_MUL_A_MASK QPU_MASK(20, 18) +#define V3D_QPU_RADDR_C_SHIFT 18 +#define V3D_QPU_RADDR_C_MASK QPU_MASK(23, 18) + #define V3D_QPU_ADD_B_SHIFT 15 #define V3D_QPU_ADD_B_MASK QPU_MASK(17, 15) @@ -98,6 +101,9 @@ #define V3D_QPU_BRANCH_BDI_SHIFT 12 #define V3D_QPU_BRANCH_BDI_MASK QPU_MASK(13, 12) +#define V3D_QPU_RADDR_D_SHIFT 12 +#define V3D_QPU_RADDR_D_MASK QPU_MASK(17, 12) + #define V3D_QPU_RADDR_A_SHIFT 6 #define V3D_QPU_RADDR_A_MASK QPU_MASK(11, 6) -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0014-broadcom-commmon-add-has_accumulators-field-on-v3d_d.patch ================================================ From 81febf14fe05ad26e992275b911e8bc1e1416ebc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Fri, 17 Sep 2021 01:04:31 +0200 Subject: [PATCH 014/142] broadcom/commmon: add has_accumulators field on v3d_device_info Even if we can just check for the version on the code, checking for this field makes several places more readable. So for example, on the register allocate code we doesn't assign an accumulator because we don't have accumulators on that hw, instead of because hw version is a given one. --- src/broadcom/common/v3d_device_info.c | 2 ++ src/broadcom/common/v3d_device_info.h | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/broadcom/common/v3d_device_info.c b/src/broadcom/common/v3d_device_info.c index 7512fe3a06b..7bc2b662cfc 100644 --- a/src/broadcom/common/v3d_device_info.c +++ b/src/broadcom/common/v3d_device_info.c @@ -65,6 +65,8 @@ v3d_get_device_info(int fd, struct v3d_device_info* devinfo, v3d_ioctl_fun drm_i int qups = (ident1.value >> 8) & 0xf; devinfo->qpu_count = nslc * qups; + devinfo->has_accumulators = devinfo->ver < 71; + switch (devinfo->ver) { case 33: case 41: diff --git a/src/broadcom/common/v3d_device_info.h b/src/broadcom/common/v3d_device_info.h index 32cb65cf81f..8dfc7858727 100644 --- a/src/broadcom/common/v3d_device_info.h +++ b/src/broadcom/common/v3d_device_info.h @@ -42,6 +42,9 @@ struct v3d_device_info { /* NSLC * QUPS from the core's IDENT registers. */ int qpu_count; + + /* If the hw has accumulator registers */ + bool has_accumulators; }; typedef int (*v3d_ioctl_fun)(int fd, unsigned long request, void *arg); -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0015-broadcom-qpu-add-qpu_writes_rf0_implicitly-helper.patch ================================================ From 7d42eca87b6e144697810405308d99d200dca62a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Wed, 15 Sep 2021 10:56:43 +0200 Subject: [PATCH 015/142] broadcom/qpu: add qpu_writes_rf0_implicitly helper On v71 rf0 replaces r5 as the register that gets updated implicitly with uniform loads, and gets the C coefficient with ldvary. This helper return if rf0 gets implicitly updated. --- src/broadcom/qpu/qpu_instr.c | 12 ++++++++++++ src/broadcom/qpu/qpu_instr.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/src/broadcom/qpu/qpu_instr.c b/src/broadcom/qpu/qpu_instr.c index 7ece8b5e570..8de99c611d5 100644 --- a/src/broadcom/qpu/qpu_instr.c +++ b/src/broadcom/qpu/qpu_instr.c @@ -920,6 +920,18 @@ v3d_qpu_writes_accum(const struct v3d_device_info *devinfo, return false; } +bool +v3d_qpu_writes_rf0_implicitly(const struct v3d_device_info *devinfo, + const struct v3d_qpu_instr *inst) +{ + if (devinfo->ver >= 71 && + (inst->sig.ldvary || inst->sig.ldunif || inst->sig.ldunifa)) { + return true; + } + + return false; +} + bool v3d_qpu_uses_mux(const struct v3d_qpu_instr *inst, enum v3d_qpu_mux mux) { diff --git a/src/broadcom/qpu/qpu_instr.h b/src/broadcom/qpu/qpu_instr.h index 9e56e2d6a99..a25be8e0ee6 100644 --- a/src/broadcom/qpu/qpu_instr.h +++ b/src/broadcom/qpu/qpu_instr.h @@ -473,6 +473,8 @@ bool v3d_qpu_writes_r4(const struct v3d_device_info *devinfo, const struct v3d_qpu_instr *instr) ATTRIBUTE_CONST; bool v3d_qpu_writes_r5(const struct v3d_device_info *devinfo, const struct v3d_qpu_instr *instr) ATTRIBUTE_CONST; +bool v3d_qpu_writes_rf0_implicitly(const struct v3d_device_info *devinfo, + const struct v3d_qpu_instr *instr) ATTRIBUTE_CONST; bool v3d_qpu_writes_accum(const struct v3d_device_info *devinfo, const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST; bool v3d_qpu_waits_on_tmu(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0016-broadcom-qpu-add-pack-unpack-support-for-v71.patch ================================================ From f0859613bd59e14fb21571e7978bb5c5d5e9c6d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Sat, 7 Aug 2021 02:20:39 +0200 Subject: [PATCH 016/142] broadcom/qpu: add pack/unpack support for v71 Note that we provide new v71 alu pack/unpack methods. As there are a lot that it is equivalent, initially we tried to use existing methods as template and add version checks on the existing methods. At some early point that become just really unreadable, so it become better to just provide new methods, even if v42 and v71 methods have a really similar structure. Note that we have splitted the op tables, and created a two (add/mul) for v71. As the description struct include versioning info, we could have just used one table. But, specially with the add table, there are a lot of differences with v71. So it is slightly tidier this way. Also, taking into account that we do a linear search on the tables, this can be even justified by performance. --- src/broadcom/qpu/qpu_pack.c | 1049 ++++++++++++++++++++++++++++++----- 1 file changed, 904 insertions(+), 145 deletions(-) diff --git a/src/broadcom/qpu/qpu_pack.c b/src/broadcom/qpu/qpu_pack.c index 4f106909729..4045275cb9a 100644 --- a/src/broadcom/qpu/qpu_pack.c +++ b/src/broadcom/qpu/qpu_pack.c @@ -490,16 +490,26 @@ v3d_qpu_flags_pack(const struct v3d_device_info *devinfo, /* Make a mapping of the table of opcodes in the spec. The opcode is * determined by a combination of the opcode field, and in the case of 0 or - * 1-arg opcodes, the mux_b field as well. + * 1-arg opcodes, the mux (version <= 42) or raddr (version >= 71) field as + * well. */ -#define MUX_MASK(bot, top) (((1 << (top + 1)) - 1) - ((1 << (bot)) - 1)) -#define ANYMUX MUX_MASK(0, 7) +#define OP_MASK(val) BITFIELD64_BIT(val) +#define OP_RANGE(bot, top) BITFIELD64_RANGE(bot, top - bot + 1) +#define ANYMUX OP_RANGE(0, 7) +#define ANYOPMASK OP_RANGE(0, 63) struct opcode_desc { uint8_t opcode_first; uint8_t opcode_last; - uint8_t mux_b_mask; - uint8_t mux_a_mask; + + union { + struct { + uint8_t b_mask; + uint8_t a_mask; + } mux; + uint64_t raddr_mask; + }; + uint8_t op; /* first_ver == 0 if it's the same across all V3D versions. @@ -512,122 +522,288 @@ struct opcode_desc { uint8_t last_ver; }; -static const struct opcode_desc add_ops[] = { +static const struct opcode_desc add_ops_v33[] = { /* FADD is FADDNF depending on the order of the mux_a/mux_b. */ - { 0, 47, ANYMUX, ANYMUX, V3D_QPU_A_FADD }, - { 0, 47, ANYMUX, ANYMUX, V3D_QPU_A_FADDNF }, - { 53, 55, ANYMUX, ANYMUX, V3D_QPU_A_VFPACK }, - { 56, 56, ANYMUX, ANYMUX, V3D_QPU_A_ADD }, - { 57, 59, ANYMUX, ANYMUX, V3D_QPU_A_VFPACK }, - { 60, 60, ANYMUX, ANYMUX, V3D_QPU_A_SUB }, - { 61, 63, ANYMUX, ANYMUX, V3D_QPU_A_VFPACK }, - { 64, 111, ANYMUX, ANYMUX, V3D_QPU_A_FSUB }, - { 120, 120, ANYMUX, ANYMUX, V3D_QPU_A_MIN }, - { 121, 121, ANYMUX, ANYMUX, V3D_QPU_A_MAX }, - { 122, 122, ANYMUX, ANYMUX, V3D_QPU_A_UMIN }, - { 123, 123, ANYMUX, ANYMUX, V3D_QPU_A_UMAX }, - { 124, 124, ANYMUX, ANYMUX, V3D_QPU_A_SHL }, - { 125, 125, ANYMUX, ANYMUX, V3D_QPU_A_SHR }, - { 126, 126, ANYMUX, ANYMUX, V3D_QPU_A_ASR }, - { 127, 127, ANYMUX, ANYMUX, V3D_QPU_A_ROR }, + { 0, 47, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_FADD }, + { 0, 47, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_FADDNF }, + { 53, 55, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_VFPACK }, + { 56, 56, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_ADD }, + { 57, 59, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_VFPACK }, + { 60, 60, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_SUB }, + { 61, 63, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_VFPACK }, + { 64, 111, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_FSUB }, + { 120, 120, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_MIN }, + { 121, 121, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_MAX }, + { 122, 122, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_UMIN }, + { 123, 123, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_UMAX }, + { 124, 124, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_SHL }, + { 125, 125, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_SHR }, + { 126, 126, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_ASR }, + { 127, 127, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_ROR }, /* FMIN is instead FMAX depending on the order of the mux_a/mux_b. */ - { 128, 175, ANYMUX, ANYMUX, V3D_QPU_A_FMIN }, - { 128, 175, ANYMUX, ANYMUX, V3D_QPU_A_FMAX }, - { 176, 180, ANYMUX, ANYMUX, V3D_QPU_A_VFMIN }, - - { 181, 181, ANYMUX, ANYMUX, V3D_QPU_A_AND }, - { 182, 182, ANYMUX, ANYMUX, V3D_QPU_A_OR }, - { 183, 183, ANYMUX, ANYMUX, V3D_QPU_A_XOR }, - - { 184, 184, ANYMUX, ANYMUX, V3D_QPU_A_VADD }, - { 185, 185, ANYMUX, ANYMUX, V3D_QPU_A_VSUB }, - { 186, 186, 1 << 0, ANYMUX, V3D_QPU_A_NOT }, - { 186, 186, 1 << 1, ANYMUX, V3D_QPU_A_NEG }, - { 186, 186, 1 << 2, ANYMUX, V3D_QPU_A_FLAPUSH }, - { 186, 186, 1 << 3, ANYMUX, V3D_QPU_A_FLBPUSH }, - { 186, 186, 1 << 4, ANYMUX, V3D_QPU_A_FLPOP }, - { 186, 186, 1 << 5, ANYMUX, V3D_QPU_A_RECIP }, - { 186, 186, 1 << 6, ANYMUX, V3D_QPU_A_SETMSF }, - { 186, 186, 1 << 7, ANYMUX, V3D_QPU_A_SETREVF }, - { 187, 187, 1 << 0, 1 << 0, V3D_QPU_A_NOP, 0 }, - { 187, 187, 1 << 0, 1 << 1, V3D_QPU_A_TIDX }, - { 187, 187, 1 << 0, 1 << 2, V3D_QPU_A_EIDX }, - { 187, 187, 1 << 0, 1 << 3, V3D_QPU_A_LR }, - { 187, 187, 1 << 0, 1 << 4, V3D_QPU_A_VFLA }, - { 187, 187, 1 << 0, 1 << 5, V3D_QPU_A_VFLNA }, - { 187, 187, 1 << 0, 1 << 6, V3D_QPU_A_VFLB }, - { 187, 187, 1 << 0, 1 << 7, V3D_QPU_A_VFLNB }, - - { 187, 187, 1 << 1, MUX_MASK(0, 2), V3D_QPU_A_FXCD }, - { 187, 187, 1 << 1, 1 << 3, V3D_QPU_A_XCD }, - { 187, 187, 1 << 1, MUX_MASK(4, 6), V3D_QPU_A_FYCD }, - { 187, 187, 1 << 1, 1 << 7, V3D_QPU_A_YCD }, - - { 187, 187, 1 << 2, 1 << 0, V3D_QPU_A_MSF }, - { 187, 187, 1 << 2, 1 << 1, V3D_QPU_A_REVF }, - { 187, 187, 1 << 2, 1 << 2, V3D_QPU_A_VDWWT, 33 }, - { 187, 187, 1 << 2, 1 << 2, V3D_QPU_A_IID, 40 }, - { 187, 187, 1 << 2, 1 << 3, V3D_QPU_A_SAMPID, 40 }, - { 187, 187, 1 << 2, 1 << 4, V3D_QPU_A_BARRIERID, 40 }, - { 187, 187, 1 << 2, 1 << 5, V3D_QPU_A_TMUWT }, - { 187, 187, 1 << 2, 1 << 6, V3D_QPU_A_VPMWT }, - { 187, 187, 1 << 2, 1 << 7, V3D_QPU_A_FLAFIRST, 41 }, - { 187, 187, 1 << 3, 1 << 0, V3D_QPU_A_FLNAFIRST, 41 }, - { 187, 187, 1 << 3, ANYMUX, V3D_QPU_A_VPMSETUP, 33 }, - - { 188, 188, 1 << 0, ANYMUX, V3D_QPU_A_LDVPMV_IN, 40 }, - { 188, 188, 1 << 0, ANYMUX, V3D_QPU_A_LDVPMV_OUT, 40 }, - { 188, 188, 1 << 1, ANYMUX, V3D_QPU_A_LDVPMD_IN, 40 }, - { 188, 188, 1 << 1, ANYMUX, V3D_QPU_A_LDVPMD_OUT, 40 }, - { 188, 188, 1 << 2, ANYMUX, V3D_QPU_A_LDVPMP, 40 }, - { 188, 188, 1 << 3, ANYMUX, V3D_QPU_A_RSQRT, 41 }, - { 188, 188, 1 << 4, ANYMUX, V3D_QPU_A_EXP, 41 }, - { 188, 188, 1 << 5, ANYMUX, V3D_QPU_A_LOG, 41 }, - { 188, 188, 1 << 6, ANYMUX, V3D_QPU_A_SIN, 41 }, - { 188, 188, 1 << 7, ANYMUX, V3D_QPU_A_RSQRT2, 41 }, - { 189, 189, ANYMUX, ANYMUX, V3D_QPU_A_LDVPMG_IN, 40 }, - { 189, 189, ANYMUX, ANYMUX, V3D_QPU_A_LDVPMG_OUT, 40 }, + { 128, 175, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_FMIN }, + { 128, 175, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_FMAX }, + { 176, 180, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_VFMIN }, + + { 181, 181, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_AND }, + { 182, 182, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_OR }, + { 183, 183, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_XOR }, + + { 184, 184, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_VADD }, + { 185, 185, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_VSUB }, + { 186, 186, .mux.b_mask = OP_MASK(0), .mux.a_mask = ANYMUX, V3D_QPU_A_NOT }, + { 186, 186, .mux.b_mask = OP_MASK(1), .mux.a_mask = ANYMUX, V3D_QPU_A_NEG }, + { 186, 186, .mux.b_mask = OP_MASK(2), .mux.a_mask = ANYMUX, V3D_QPU_A_FLAPUSH }, + { 186, 186, .mux.b_mask = OP_MASK(3), .mux.a_mask = ANYMUX, V3D_QPU_A_FLBPUSH }, + { 186, 186, .mux.b_mask = OP_MASK(4), .mux.a_mask = ANYMUX, V3D_QPU_A_FLPOP }, + { 186, 186, .mux.b_mask = OP_MASK(5), .mux.a_mask = ANYMUX, V3D_QPU_A_RECIP }, + { 186, 186, .mux.b_mask = OP_MASK(6), .mux.a_mask = ANYMUX, V3D_QPU_A_SETMSF }, + { 186, 186, .mux.b_mask = OP_MASK(7), .mux.a_mask = ANYMUX, V3D_QPU_A_SETREVF }, + { 187, 187, .mux.b_mask = OP_MASK(0), .mux.a_mask = OP_MASK(0), V3D_QPU_A_NOP, 0 }, + { 187, 187, .mux.b_mask = OP_MASK(0), .mux.a_mask = OP_MASK(1), V3D_QPU_A_TIDX }, + { 187, 187, .mux.b_mask = OP_MASK(0), .mux.a_mask = OP_MASK(2), V3D_QPU_A_EIDX }, + { 187, 187, .mux.b_mask = OP_MASK(0), .mux.a_mask = OP_MASK(3), V3D_QPU_A_LR }, + { 187, 187, .mux.b_mask = OP_MASK(0), .mux.a_mask = OP_MASK(4), V3D_QPU_A_VFLA }, + { 187, 187, .mux.b_mask = OP_MASK(0), .mux.a_mask = OP_MASK(5), V3D_QPU_A_VFLNA }, + { 187, 187, .mux.b_mask = OP_MASK(0), .mux.a_mask = OP_MASK(6), V3D_QPU_A_VFLB }, + { 187, 187, .mux.b_mask = OP_MASK(0), .mux.a_mask = OP_MASK(7), V3D_QPU_A_VFLNB }, + + { 187, 187, .mux.b_mask = OP_MASK(1), .mux.a_mask = OP_RANGE(0, 2), V3D_QPU_A_FXCD }, + { 187, 187, .mux.b_mask = OP_MASK(1), .mux.a_mask = OP_MASK(3), V3D_QPU_A_XCD }, + { 187, 187, .mux.b_mask = OP_MASK(1), .mux.a_mask = OP_RANGE(4, 6), V3D_QPU_A_FYCD }, + { 187, 187, .mux.b_mask = OP_MASK(1), .mux.a_mask = OP_MASK(7), V3D_QPU_A_YCD }, + + { 187, 187, .mux.b_mask = OP_MASK(2), .mux.a_mask = OP_MASK(0), V3D_QPU_A_MSF }, + { 187, 187, .mux.b_mask = OP_MASK(2), .mux.a_mask = OP_MASK(1), V3D_QPU_A_REVF }, + { 187, 187, .mux.b_mask = OP_MASK(2), .mux.a_mask = OP_MASK(2), V3D_QPU_A_VDWWT, 33 }, + { 187, 187, .mux.b_mask = OP_MASK(2), .mux.a_mask = OP_MASK(2), V3D_QPU_A_IID, 40 }, + { 187, 187, .mux.b_mask = OP_MASK(2), .mux.a_mask = OP_MASK(3), V3D_QPU_A_SAMPID, 40 }, + { 187, 187, .mux.b_mask = OP_MASK(2), .mux.a_mask = OP_MASK(4), V3D_QPU_A_BARRIERID, 40 }, + { 187, 187, .mux.b_mask = OP_MASK(2), .mux.a_mask = OP_MASK(5), V3D_QPU_A_TMUWT }, + { 187, 187, .mux.b_mask = OP_MASK(2), .mux.a_mask = OP_MASK(6), V3D_QPU_A_VPMWT }, + { 187, 187, .mux.b_mask = OP_MASK(2), .mux.a_mask = OP_MASK(7), V3D_QPU_A_FLAFIRST, 41 }, + { 187, 187, .mux.b_mask = OP_MASK(3), .mux.a_mask = OP_MASK(0), V3D_QPU_A_FLNAFIRST, 41 }, + { 187, 187, .mux.b_mask = OP_MASK(3), .mux.a_mask = ANYMUX, V3D_QPU_A_VPMSETUP, 33 }, + + { 188, 188, .mux.b_mask = OP_MASK(0), .mux.a_mask = ANYMUX, V3D_QPU_A_LDVPMV_IN, 40 }, + { 188, 188, .mux.b_mask = OP_MASK(0), .mux.a_mask = ANYMUX, V3D_QPU_A_LDVPMV_OUT, 40 }, + { 188, 188, .mux.b_mask = OP_MASK(1), .mux.a_mask = ANYMUX, V3D_QPU_A_LDVPMD_IN, 40 }, + { 188, 188, .mux.b_mask = OP_MASK(1), .mux.a_mask = ANYMUX, V3D_QPU_A_LDVPMD_OUT, 40 }, + { 188, 188, .mux.b_mask = OP_MASK(2), .mux.a_mask = ANYMUX, V3D_QPU_A_LDVPMP, 40 }, + { 188, 188, .mux.b_mask = OP_MASK(3), .mux.a_mask = ANYMUX, V3D_QPU_A_RSQRT, 41 }, + { 188, 188, .mux.b_mask = OP_MASK(4), .mux.a_mask = ANYMUX, V3D_QPU_A_EXP, 41 }, + { 188, 188, .mux.b_mask = OP_MASK(5), .mux.a_mask = ANYMUX, V3D_QPU_A_LOG, 41 }, + { 188, 188, .mux.b_mask = OP_MASK(6), .mux.a_mask = ANYMUX, V3D_QPU_A_SIN, 41 }, + { 188, 188, .mux.b_mask = OP_MASK(7), .mux.a_mask = ANYMUX, V3D_QPU_A_RSQRT2, 41 }, + { 189, 189, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_LDVPMG_IN, 40 }, + { 189, 189, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_LDVPMG_OUT, 40 }, /* FIXME: MORE COMPLICATED */ - /* { 190, 191, ANYMUX, ANYMUX, V3D_QPU_A_VFMOVABSNEGNAB }, */ + /* { 190, 191, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_VFMOVABSNEGNAB }, */ - { 192, 239, ANYMUX, ANYMUX, V3D_QPU_A_FCMP }, - { 240, 244, ANYMUX, ANYMUX, V3D_QPU_A_VFMAX }, + { 192, 239, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_FCMP }, + { 240, 244, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_VFMAX }, - { 245, 245, MUX_MASK(0, 2), ANYMUX, V3D_QPU_A_FROUND }, - { 245, 245, 1 << 3, ANYMUX, V3D_QPU_A_FTOIN }, - { 245, 245, MUX_MASK(4, 6), ANYMUX, V3D_QPU_A_FTRUNC }, - { 245, 245, 1 << 7, ANYMUX, V3D_QPU_A_FTOIZ }, - { 246, 246, MUX_MASK(0, 2), ANYMUX, V3D_QPU_A_FFLOOR }, - { 246, 246, 1 << 3, ANYMUX, V3D_QPU_A_FTOUZ }, - { 246, 246, MUX_MASK(4, 6), ANYMUX, V3D_QPU_A_FCEIL }, - { 246, 246, 1 << 7, ANYMUX, V3D_QPU_A_FTOC }, + { 245, 245, .mux.b_mask = OP_RANGE(0, 2), .mux.a_mask = ANYMUX, V3D_QPU_A_FROUND }, + { 245, 245, .mux.b_mask = OP_MASK(3), .mux.a_mask = ANYMUX, V3D_QPU_A_FTOIN }, + { 245, 245, .mux.b_mask = OP_RANGE(4, 6), .mux.a_mask = ANYMUX, V3D_QPU_A_FTRUNC }, + { 245, 245, .mux.b_mask = OP_MASK(7), .mux.a_mask = ANYMUX, V3D_QPU_A_FTOIZ }, + { 246, 246, .mux.b_mask = OP_RANGE(0, 2), .mux.a_mask = ANYMUX, V3D_QPU_A_FFLOOR }, + { 246, 246, .mux.b_mask = OP_MASK(3), .mux.a_mask = ANYMUX, V3D_QPU_A_FTOUZ }, + { 246, 246, .mux.b_mask = OP_RANGE(4, 6), .mux.a_mask = ANYMUX, V3D_QPU_A_FCEIL }, + { 246, 246, .mux.b_mask = OP_MASK(7), .mux.a_mask = ANYMUX, V3D_QPU_A_FTOC }, - { 247, 247, MUX_MASK(0, 2), ANYMUX, V3D_QPU_A_FDX }, - { 247, 247, MUX_MASK(4, 6), ANYMUX, V3D_QPU_A_FDY }, + { 247, 247, .mux.b_mask = OP_RANGE(0, 2), .mux.a_mask = ANYMUX, V3D_QPU_A_FDX }, + { 247, 247, .mux.b_mask = OP_RANGE(4, 6), .mux.a_mask = ANYMUX, V3D_QPU_A_FDY }, /* The stvpms are distinguished by the waddr field. */ - { 248, 248, ANYMUX, ANYMUX, V3D_QPU_A_STVPMV }, - { 248, 248, ANYMUX, ANYMUX, V3D_QPU_A_STVPMD }, - { 248, 248, ANYMUX, ANYMUX, V3D_QPU_A_STVPMP }, + { 248, 248, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_STVPMV }, + { 248, 248, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_STVPMD }, + { 248, 248, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_A_STVPMP }, + + { 252, 252, .mux.b_mask = OP_RANGE(0, 2), .mux.a_mask = ANYMUX, V3D_QPU_A_ITOF }, + { 252, 252, .mux.b_mask = OP_MASK(3), .mux.a_mask = ANYMUX, V3D_QPU_A_CLZ }, + { 252, 252, .mux.b_mask = OP_RANGE(4, 6), .mux.a_mask = ANYMUX, V3D_QPU_A_UTOF }, +}; + +static const struct opcode_desc mul_ops_v33[] = { + { 1, 1, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_M_ADD }, + { 2, 2, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_M_SUB }, + { 3, 3, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_M_UMUL24 }, + { 4, 8, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_M_VFMUL }, + { 9, 9, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_M_SMUL24 }, + { 10, 10, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_M_MULTOP }, + { 14, 14, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_M_FMOV, 33, 42 }, + { 15, 15, .mux.b_mask = OP_RANGE(0, 3), ANYMUX, V3D_QPU_M_FMOV, 33, 42}, + { 15, 15, .mux.b_mask = OP_MASK(4), .mux.a_mask = OP_MASK(0), V3D_QPU_M_NOP, 33, 42 }, + { 15, 15, .mux.b_mask = OP_MASK(7), .mux.a_mask = ANYMUX, V3D_QPU_M_MOV, 33, 42 }, + + { 16, 63, .mux.b_mask = ANYMUX, .mux.a_mask = ANYMUX, V3D_QPU_M_FMUL }, +}; + +/* Note that it would have been possible to define all the add/mul opcodes in + * just one table, using the first_ver/last_ver. But taking into account that + * for v71 there were a lot of changes, it was more tidy this way. Also right + * now we are doing a linear search on those tables, so this maintains the + * tables smaller. + * + * Just in case we merge the tables, we define the first_ver as 71 for those + * opcodes that changed on v71 + */ +static const struct opcode_desc add_ops_v71[] = { + { 0, 47, .raddr_mask = ANYOPMASK, V3D_QPU_A_FADD }, + { 53, 55, .raddr_mask = ANYOPMASK, V3D_QPU_A_VFPACK }, + { 56, 56, .raddr_mask = ANYOPMASK, V3D_QPU_A_ADD }, + { 57, 59, .raddr_mask = ANYOPMASK, V3D_QPU_A_VFPACK }, + { 60, 60, .raddr_mask = ANYOPMASK, V3D_QPU_A_SUB }, + { 61, 63, .raddr_mask = ANYOPMASK, V3D_QPU_A_VFPACK }, + { 64, 111, .raddr_mask = ANYOPMASK, V3D_QPU_A_FSUB }, + { 120, 120, .raddr_mask = ANYOPMASK, V3D_QPU_A_MIN }, + { 121, 121, .raddr_mask = ANYOPMASK, V3D_QPU_A_MAX }, + { 122, 122, .raddr_mask = ANYOPMASK, V3D_QPU_A_UMIN }, + { 123, 123, .raddr_mask = ANYOPMASK, V3D_QPU_A_UMAX }, + { 124, 124, .raddr_mask = ANYOPMASK, V3D_QPU_A_SHL }, + { 125, 125, .raddr_mask = ANYOPMASK, V3D_QPU_A_SHR }, + { 126, 126, .raddr_mask = ANYOPMASK, V3D_QPU_A_ASR }, + { 127, 127, .raddr_mask = ANYOPMASK, V3D_QPU_A_ROR }, + + { 181, 181, .raddr_mask = ANYOPMASK, V3D_QPU_A_AND }, + { 182, 182, .raddr_mask = ANYOPMASK, V3D_QPU_A_OR }, + { 183, 183, .raddr_mask = ANYOPMASK, V3D_QPU_A_XOR }, + { 184, 184, .raddr_mask = ANYOPMASK, V3D_QPU_A_VADD }, + { 185, 185, .raddr_mask = ANYOPMASK, V3D_QPU_A_VSUB }, + + { 186, 186, .raddr_mask = OP_MASK(0), V3D_QPU_A_NOT }, + { 186, 186, .raddr_mask = OP_MASK(1), V3D_QPU_A_NEG }, + { 186, 186, .raddr_mask = OP_MASK(2), V3D_QPU_A_FLAPUSH }, + { 186, 186, .raddr_mask = OP_MASK(3), V3D_QPU_A_FLBPUSH }, + { 186, 186, .raddr_mask = OP_MASK(4), V3D_QPU_A_FLPOP }, + { 186, 186, .raddr_mask = OP_MASK(5), V3D_QPU_A_CLZ }, + { 186, 186, .raddr_mask = OP_MASK(6), V3D_QPU_A_SETMSF }, + { 186, 186, .raddr_mask = OP_MASK(7), V3D_QPU_A_SETREVF }, + + { 187, 187, .raddr_mask = OP_MASK(0), V3D_QPU_A_NOP, 0 }, + { 187, 187, .raddr_mask = OP_MASK(1), V3D_QPU_A_TIDX }, + { 187, 187, .raddr_mask = OP_MASK(2), V3D_QPU_A_EIDX }, + { 187, 187, .raddr_mask = OP_MASK(3), V3D_QPU_A_LR }, + { 187, 187, .raddr_mask = OP_MASK(4), V3D_QPU_A_VFLA }, + { 187, 187, .raddr_mask = OP_MASK(5), V3D_QPU_A_VFLNA }, + { 187, 187, .raddr_mask = OP_MASK(6), V3D_QPU_A_VFLB }, + { 187, 187, .raddr_mask = OP_MASK(7), V3D_QPU_A_VFLNB }, + { 187, 187, .raddr_mask = OP_MASK(8), V3D_QPU_A_XCD }, + { 187, 187, .raddr_mask = OP_MASK(9), V3D_QPU_A_YCD }, + { 187, 187, .raddr_mask = OP_MASK(10), V3D_QPU_A_MSF }, + { 187, 187, .raddr_mask = OP_MASK(11), V3D_QPU_A_REVF }, + { 187, 187, .raddr_mask = OP_MASK(12), V3D_QPU_A_IID }, + { 187, 187, .raddr_mask = OP_MASK(13), V3D_QPU_A_SAMPID }, + { 187, 187, .raddr_mask = OP_MASK(14), V3D_QPU_A_BARRIERID }, + { 187, 187, .raddr_mask = OP_MASK(15), V3D_QPU_A_TMUWT }, + { 187, 187, .raddr_mask = OP_MASK(16), V3D_QPU_A_VPMWT }, + { 187, 187, .raddr_mask = OP_MASK(17), V3D_QPU_A_FLAFIRST }, + { 187, 187, .raddr_mask = OP_MASK(18), V3D_QPU_A_FLNAFIRST }, + + { 187, 187, .raddr_mask = OP_RANGE(32, 34), V3D_QPU_A_FXCD }, + { 187, 187, .raddr_mask = OP_RANGE(36, 38), V3D_QPU_A_FYCD }, + + { 188, 188, .raddr_mask = OP_MASK(0), V3D_QPU_A_LDVPMV_IN, 71 }, + { 188, 188, .raddr_mask = OP_MASK(1), V3D_QPU_A_LDVPMD_IN, 71 }, + { 188, 188, .raddr_mask = OP_MASK(2), V3D_QPU_A_LDVPMP, 71 }, + + { 188, 188, .raddr_mask = OP_MASK(32), V3D_QPU_A_RECIP, 71 }, + { 188, 188, .raddr_mask = OP_MASK(33), V3D_QPU_A_RSQRT, 71 }, + { 188, 188, .raddr_mask = OP_MASK(34), V3D_QPU_A_EXP, 71 }, + { 188, 188, .raddr_mask = OP_MASK(35), V3D_QPU_A_LOG, 71 }, + { 188, 188, .raddr_mask = OP_MASK(36), V3D_QPU_A_SIN, 71 }, + { 188, 188, .raddr_mask = OP_MASK(37), V3D_QPU_A_RSQRT2, 71 }, + + { 189, 189, .raddr_mask = ANYOPMASK, V3D_QPU_A_LDVPMG_IN, 71 }, - { 252, 252, MUX_MASK(0, 2), ANYMUX, V3D_QPU_A_ITOF }, - { 252, 252, 1 << 3, ANYMUX, V3D_QPU_A_CLZ }, - { 252, 252, MUX_MASK(4, 6), ANYMUX, V3D_QPU_A_UTOF }, + /* The stvpms are distinguished by the waddr field. */ + { 190, 190, .raddr_mask = ANYOPMASK, V3D_QPU_A_STVPMV, 71}, + { 190, 190, .raddr_mask = ANYOPMASK, V3D_QPU_A_STVPMD, 71}, + { 190, 190, .raddr_mask = ANYOPMASK, V3D_QPU_A_STVPMP, 71}, + + { 192, 207, .raddr_mask = ANYOPMASK, V3D_QPU_A_FCMP, 71 }, + + { 245, 245, .raddr_mask = OP_RANGE(0, 2), V3D_QPU_A_FROUND, 71 }, + { 245, 245, .raddr_mask = OP_RANGE(4, 6), V3D_QPU_A_FROUND, 71 }, + { 245, 245, .raddr_mask = OP_RANGE(8, 10), V3D_QPU_A_FROUND, 71 }, + { 245, 245, .raddr_mask = OP_RANGE(12, 14), V3D_QPU_A_FROUND, 71 }, + + { 245, 245, .raddr_mask = OP_MASK(3), V3D_QPU_A_FTOIN, 71 }, + { 245, 245, .raddr_mask = OP_MASK(7), V3D_QPU_A_FTOIN, 71 }, + { 245, 245, .raddr_mask = OP_MASK(11), V3D_QPU_A_FTOIN, 71 }, + { 245, 245, .raddr_mask = OP_MASK(15), V3D_QPU_A_FTOIN, 71 }, + + { 245, 245, .raddr_mask = OP_RANGE(16, 18), V3D_QPU_A_FTRUNC, 71 }, + { 245, 245, .raddr_mask = OP_RANGE(20, 22), V3D_QPU_A_FTRUNC, 71 }, + { 245, 245, .raddr_mask = OP_RANGE(24, 26), V3D_QPU_A_FTRUNC, 71 }, + { 245, 245, .raddr_mask = OP_RANGE(28, 30), V3D_QPU_A_FTRUNC, 71 }, + + { 245, 245, .raddr_mask = OP_MASK(19), V3D_QPU_A_FTOIZ, 71 }, + { 245, 245, .raddr_mask = OP_MASK(23), V3D_QPU_A_FTOIZ, 71 }, + { 245, 245, .raddr_mask = OP_MASK(27), V3D_QPU_A_FTOIZ, 71 }, + { 245, 245, .raddr_mask = OP_MASK(31), V3D_QPU_A_FTOIZ, 71 }, + + { 245, 245, .raddr_mask = OP_RANGE(32, 34), V3D_QPU_A_FFLOOR, 71 }, + { 245, 245, .raddr_mask = OP_RANGE(36, 38), V3D_QPU_A_FFLOOR, 71 }, + { 245, 245, .raddr_mask = OP_RANGE(40, 42), V3D_QPU_A_FFLOOR, 71 }, + { 245, 245, .raddr_mask = OP_RANGE(44, 46), V3D_QPU_A_FFLOOR, 71 }, + + { 245, 245, .raddr_mask = OP_MASK(35), V3D_QPU_A_FTOUZ, 71 }, + { 245, 245, .raddr_mask = OP_MASK(39), V3D_QPU_A_FTOUZ, 71 }, + { 245, 245, .raddr_mask = OP_MASK(43), V3D_QPU_A_FTOUZ, 71 }, + { 245, 245, .raddr_mask = OP_MASK(47), V3D_QPU_A_FTOUZ, 71 }, + + { 245, 245, .raddr_mask = OP_RANGE(48, 50), V3D_QPU_A_FCEIL, 71 }, + { 245, 245, .raddr_mask = OP_RANGE(52, 54), V3D_QPU_A_FCEIL, 71 }, + { 245, 245, .raddr_mask = OP_RANGE(56, 58), V3D_QPU_A_FCEIL, 71 }, + { 245, 245, .raddr_mask = OP_RANGE(60, 62), V3D_QPU_A_FCEIL, 71 }, + + { 245, 245, .raddr_mask = OP_MASK(51), V3D_QPU_A_FTOC }, + { 245, 245, .raddr_mask = OP_MASK(55), V3D_QPU_A_FTOC }, + { 245, 245, .raddr_mask = OP_MASK(59), V3D_QPU_A_FTOC }, + { 245, 245, .raddr_mask = OP_MASK(63), V3D_QPU_A_FTOC }, + + { 246, 246, .raddr_mask = OP_RANGE(0, 2), V3D_QPU_A_FDX, 71 }, + { 246, 246, .raddr_mask = OP_RANGE(4, 6), V3D_QPU_A_FDX, 71 }, + { 246, 246, .raddr_mask = OP_RANGE(8, 10), V3D_QPU_A_FDX, 71 }, + { 246, 246, .raddr_mask = OP_RANGE(12, 14), V3D_QPU_A_FDX, 71 }, + { 246, 246, .raddr_mask = OP_RANGE(16, 18), V3D_QPU_A_FDY, 71 }, + { 246, 246, .raddr_mask = OP_RANGE(20, 22), V3D_QPU_A_FDY, 71 }, + { 246, 246, .raddr_mask = OP_RANGE(24, 26), V3D_QPU_A_FDY, 71 }, + { 246, 246, .raddr_mask = OP_RANGE(28, 30), V3D_QPU_A_FDY, 71 }, + + { 246, 246, .raddr_mask = OP_RANGE(32, 34), V3D_QPU_A_ITOF, 71 }, + { 246, 246, .raddr_mask = OP_RANGE(36, 38), V3D_QPU_A_UTOF, 71 }, }; -static const struct opcode_desc mul_ops[] = { - { 1, 1, ANYMUX, ANYMUX, V3D_QPU_M_ADD }, - { 2, 2, ANYMUX, ANYMUX, V3D_QPU_M_SUB }, - { 3, 3, ANYMUX, ANYMUX, V3D_QPU_M_UMUL24 }, - { 4, 8, ANYMUX, ANYMUX, V3D_QPU_M_VFMUL }, - { 9, 9, ANYMUX, ANYMUX, V3D_QPU_M_SMUL24 }, - { 10, 10, ANYMUX, ANYMUX, V3D_QPU_M_MULTOP }, - { 14, 14, ANYMUX, ANYMUX, V3D_QPU_M_FMOV }, - { 15, 15, MUX_MASK(0, 3), ANYMUX, V3D_QPU_M_FMOV }, - { 15, 15, 1 << 4, 1 << 0, V3D_QPU_M_NOP, 0 }, - { 15, 15, 1 << 7, ANYMUX, V3D_QPU_M_MOV }, - { 16, 63, ANYMUX, ANYMUX, V3D_QPU_M_FMUL }, +static const struct opcode_desc mul_ops_v71[] = { + /* For V3D 7.1, second mask field would be ignored */ + { 1, 1, .raddr_mask = ANYOPMASK, V3D_QPU_M_ADD, 71 }, + { 2, 2, .raddr_mask = ANYOPMASK, V3D_QPU_M_SUB, 71 }, + { 3, 3, .raddr_mask = ANYOPMASK, V3D_QPU_M_UMUL24, 71 }, + { 3, 3, .raddr_mask = ANYOPMASK, V3D_QPU_M_UMUL24, 71 }, + { 4, 8, .raddr_mask = ANYOPMASK, V3D_QPU_M_VFMUL, 71 }, + { 9, 9, .raddr_mask = ANYOPMASK, V3D_QPU_M_SMUL24, 71 }, + { 10, 10, .raddr_mask = ANYOPMASK, V3D_QPU_M_MULTOP, 71 }, + + { 14, 14, .raddr_mask = OP_RANGE(0, 2), V3D_QPU_M_FMOV, 71 }, + { 14, 14, .raddr_mask = OP_RANGE(4, 6), V3D_QPU_M_FMOV, 71 }, + { 14, 14, .raddr_mask = OP_RANGE(8, 10), V3D_QPU_M_FMOV, 71 }, + { 14, 14, .raddr_mask = OP_RANGE(12, 14), V3D_QPU_M_FMOV, 71 }, + { 14, 14, .raddr_mask = OP_RANGE(16, 18), V3D_QPU_M_FMOV, 71 }, + { 14, 14, .raddr_mask = OP_RANGE(20, 22), V3D_QPU_M_FMOV, 71 }, + + { 14, 14, .raddr_mask = OP_MASK(3), V3D_QPU_M_MOV, 71 }, + { 14, 14, .raddr_mask = OP_MASK(7), V3D_QPU_M_MOV, 71 }, + { 14, 14, .raddr_mask = OP_MASK(11), V3D_QPU_M_MOV, 71 }, + { 14, 14, .raddr_mask = OP_MASK(15), V3D_QPU_M_MOV, 71 }, + { 14, 14, .raddr_mask = OP_MASK(19), V3D_QPU_M_MOV, 71 }, + + { 14, 14, .raddr_mask = OP_MASK(63), V3D_QPU_M_NOP, 71 }, + + { 16, 63, .raddr_mask = ANYOPMASK, V3D_QPU_M_FMUL }, }; /* Returns true if op_desc should be filtered out based on devinfo->ver @@ -636,17 +812,23 @@ static const struct opcode_desc mul_ops[] = { */ static bool opcode_invalid_in_version(const struct v3d_device_info *devinfo, - const struct opcode_desc *op_desc) + const uint8_t first_ver, + const uint8_t last_ver) { - return (op_desc->first_ver != 0 && devinfo->ver < op_desc->first_ver) || - (op_desc->last_ver != 0 && devinfo->ver > op_desc->last_ver); + return (first_ver != 0 && devinfo->ver < first_ver) || + (last_ver != 0 && devinfo->ver > last_ver); } +/* Note that we pass as parameters mux_a, mux_b and raddr, even if depending + * on the devinfo->ver some would be ignored. We do this way just to avoid + * having two really similar lookup_opcode methods + */ static const struct opcode_desc * lookup_opcode_from_packed(const struct v3d_device_info *devinfo, const struct opcode_desc *opcodes, size_t num_opcodes, uint32_t opcode, - uint32_t mux_a, uint32_t mux_b) + uint32_t mux_a, uint32_t mux_b, + uint32_t raddr) { for (int i = 0; i < num_opcodes; i++) { const struct opcode_desc *op_desc = &opcodes[i]; @@ -655,14 +837,19 @@ lookup_opcode_from_packed(const struct v3d_device_info *devinfo, opcode > op_desc->opcode_last) continue; - if (opcode_invalid_in_version(devinfo, op_desc)) + if (opcode_invalid_in_version(devinfo, op_desc->first_ver, op_desc->last_ver)) continue; - if (!(op_desc->mux_b_mask & (1 << mux_b))) - continue; + if (devinfo->ver < 71) { + if (!(op_desc->mux.b_mask & (1 << mux_b))) + continue; - if (!(op_desc->mux_a_mask & (1 << mux_a))) - continue; + if (!(op_desc->mux.a_mask & (1 << mux_a))) + continue; + } else { + if (!(op_desc->raddr_mask & ((uint64_t) 1 << raddr))) + continue; + } return op_desc; } @@ -784,8 +971,8 @@ v3d_qpu_float32_pack_pack(enum v3d_qpu_output_pack pack, } static bool -v3d_qpu_add_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, - struct v3d_qpu_instr *instr) +v3d33_qpu_add_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, + struct v3d_qpu_instr *instr) { uint32_t op = QPU_GET_FIELD(packed_inst, V3D_QPU_OP_ADD); uint32_t mux_a = QPU_GET_FIELD(packed_inst, V3D_QPU_ADD_A); @@ -802,8 +989,9 @@ v3d_qpu_add_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, map_op = (map_op - 253 + 245); const struct opcode_desc *desc = - lookup_opcode_from_packed(devinfo, add_ops, ARRAY_SIZE(add_ops), - map_op, mux_a, mux_b); + lookup_opcode_from_packed(devinfo, add_ops_v33, + ARRAY_SIZE(add_ops_v33), + map_op, mux_a, mux_b, 0); if (!desc) return false; @@ -939,8 +1127,160 @@ v3d_qpu_add_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, } static bool -v3d_qpu_mul_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, +v3d71_qpu_add_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, + struct v3d_qpu_instr *instr) +{ + uint32_t op = QPU_GET_FIELD(packed_inst, V3D_QPU_OP_ADD); + uint32_t raddr_a = QPU_GET_FIELD(packed_inst, V3D_QPU_RADDR_A); + uint32_t raddr_b = QPU_GET_FIELD(packed_inst, V3D_QPU_RADDR_B); + uint32_t waddr = QPU_GET_FIELD(packed_inst, V3D_QPU_WADDR_A); + uint32_t map_op = op; + + const struct opcode_desc *desc = + lookup_opcode_from_packed(devinfo, + add_ops_v71, + ARRAY_SIZE(add_ops_v71), + map_op, 0, 0, + raddr_b); + if (!desc) + return false; + + instr->alu.add.op = desc->op; + + /* Some QPU ops require a bit more than just basic opcode and mux a/b + * comparisons to distinguish them. + */ + switch (instr->alu.add.op) { + case V3D_QPU_A_STVPMV: + case V3D_QPU_A_STVPMD: + case V3D_QPU_A_STVPMP: + switch (waddr) { + case 0: + instr->alu.add.op = V3D_QPU_A_STVPMV; + break; + case 1: + instr->alu.add.op = V3D_QPU_A_STVPMD; + break; + case 2: + instr->alu.add.op = V3D_QPU_A_STVPMP; + break; + default: + return false; + } + break; + default: + break; + } + + switch (instr->alu.add.op) { + case V3D_QPU_A_FADD: + case V3D_QPU_A_FADDNF: + case V3D_QPU_A_FSUB: + case V3D_QPU_A_FMIN: + case V3D_QPU_A_FMAX: + case V3D_QPU_A_FCMP: + case V3D_QPU_A_VFPACK: + if (instr->alu.add.op != V3D_QPU_A_VFPACK && + instr->alu.add.op != V3D_QPU_A_FCMP) { + instr->alu.add.output_pack = (op >> 4) & 0x3; + } else { + instr->alu.add.output_pack = V3D_QPU_PACK_NONE; + } + + if (!v3d_qpu_float32_unpack_unpack((op >> 2) & 0x3, + &instr->alu.add.a.unpack)) { + return false; + } + + if (!v3d_qpu_float32_unpack_unpack((op >> 0) & 0x3, + &instr->alu.add.b.unpack)) { + return false; + } + break; + + case V3D_QPU_A_FFLOOR: + case V3D_QPU_A_FROUND: + case V3D_QPU_A_FTRUNC: + case V3D_QPU_A_FCEIL: + case V3D_QPU_A_FDX: + case V3D_QPU_A_FDY: + instr->alu.add.output_pack = raddr_b & 0x3; + + if (!v3d_qpu_float32_unpack_unpack((op >> 2) & 0x3, + &instr->alu.add.a.unpack)) { + return false; + } + break; + + case V3D_QPU_A_FTOIN: + case V3D_QPU_A_FTOIZ: + case V3D_QPU_A_FTOUZ: + case V3D_QPU_A_FTOC: + instr->alu.add.output_pack = V3D_QPU_PACK_NONE; + + if (!v3d_qpu_float32_unpack_unpack((raddr_b >> 2) & 0x3, + &instr->alu.add.a.unpack)) { + return false; + } + break; + + case V3D_QPU_A_VFMIN: + case V3D_QPU_A_VFMAX: + unreachable("pending v71 update"); + if (!v3d_qpu_float16_unpack_unpack(op & 0x7, + &instr->alu.add.a.unpack)) { + return false; + } + + instr->alu.add.output_pack = V3D_QPU_PACK_NONE; + instr->alu.add.b.unpack = V3D_QPU_UNPACK_NONE; + break; + + default: + instr->alu.add.output_pack = V3D_QPU_PACK_NONE; + instr->alu.add.a.unpack = V3D_QPU_UNPACK_NONE; + instr->alu.add.b.unpack = V3D_QPU_UNPACK_NONE; + break; + } + + instr->alu.add.a.raddr = raddr_a; + instr->alu.add.b.raddr = raddr_b; + instr->alu.add.waddr = QPU_GET_FIELD(packed_inst, V3D_QPU_WADDR_A); + + instr->alu.add.magic_write = false; + if (packed_inst & V3D_QPU_MA) { + switch (instr->alu.add.op) { + case V3D_QPU_A_LDVPMV_IN: + instr->alu.add.op = V3D_QPU_A_LDVPMV_OUT; + break; + case V3D_QPU_A_LDVPMD_IN: + instr->alu.add.op = V3D_QPU_A_LDVPMD_OUT; + break; + case V3D_QPU_A_LDVPMG_IN: + instr->alu.add.op = V3D_QPU_A_LDVPMG_OUT; + break; + default: + instr->alu.add.magic_write = true; + break; + } + } + + return true; +} + +static bool +v3d_qpu_add_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, struct v3d_qpu_instr *instr) +{ + if (devinfo->ver < 71) + return v3d33_qpu_add_unpack(devinfo, packed_inst, instr); + else + return v3d71_qpu_add_unpack(devinfo, packed_inst, instr); +} + +static bool +v3d33_qpu_mul_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, + struct v3d_qpu_instr *instr) { uint32_t op = QPU_GET_FIELD(packed_inst, V3D_QPU_OP_MUL); uint32_t mux_a = QPU_GET_FIELD(packed_inst, V3D_QPU_MUL_A); @@ -948,9 +1288,10 @@ v3d_qpu_mul_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, { const struct opcode_desc *desc = - lookup_opcode_from_packed(devinfo, mul_ops, - ARRAY_SIZE(mul_ops), - op, mux_a, mux_b); + lookup_opcode_from_packed(devinfo, + mul_ops_v33, + ARRAY_SIZE(mul_ops_v33), + op, mux_a, mux_b, 0); if (!desc) return false; @@ -1011,6 +1352,91 @@ v3d_qpu_mul_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, return true; } +static bool +v3d71_qpu_mul_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, + struct v3d_qpu_instr *instr) +{ + uint32_t op = QPU_GET_FIELD(packed_inst, V3D_QPU_OP_MUL); + uint32_t raddr_c = QPU_GET_FIELD(packed_inst, V3D_QPU_RADDR_C); + uint32_t raddr_d = QPU_GET_FIELD(packed_inst, V3D_QPU_RADDR_D); + + { + const struct opcode_desc *desc = + lookup_opcode_from_packed(devinfo, + mul_ops_v71, + ARRAY_SIZE(mul_ops_v71), + op, 0, 0, + raddr_d); + if (!desc) + return false; + + instr->alu.mul.op = desc->op; + } + + switch (instr->alu.mul.op) { + case V3D_QPU_M_FMUL: + instr->alu.mul.output_pack = ((op >> 4) & 0x3) - 1; + + if (!v3d_qpu_float32_unpack_unpack((op >> 2) & 0x3, + &instr->alu.mul.a.unpack)) { + return false; + } + + if (!v3d_qpu_float32_unpack_unpack((op >> 0) & 0x3, + &instr->alu.mul.b.unpack)) { + return false; + } + + break; + + case V3D_QPU_M_FMOV: + instr->alu.mul.output_pack = (raddr_d >> 2) & 1; + + if (!v3d_qpu_float32_unpack_unpack(raddr_d & 0x3, + &instr->alu.mul.a.unpack)) { + return false; + } + + break; + + case V3D_QPU_M_VFMUL: + unreachable("pending v71 update"); + instr->alu.mul.output_pack = V3D_QPU_PACK_NONE; + + if (!v3d_qpu_float16_unpack_unpack(((op & 0x7) - 4) & 7, + &instr->alu.mul.a.unpack)) { + return false; + } + + instr->alu.mul.b.unpack = V3D_QPU_UNPACK_NONE; + + break; + + default: + instr->alu.mul.output_pack = V3D_QPU_PACK_NONE; + instr->alu.mul.a.unpack = V3D_QPU_UNPACK_NONE; + instr->alu.mul.b.unpack = V3D_QPU_UNPACK_NONE; + break; + } + + instr->alu.mul.a.raddr = raddr_c; + instr->alu.mul.b.raddr = raddr_d; + instr->alu.mul.waddr = QPU_GET_FIELD(packed_inst, V3D_QPU_WADDR_M); + instr->alu.mul.magic_write = packed_inst & V3D_QPU_MM; + + return true; +} + +static bool +v3d_qpu_mul_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst, + struct v3d_qpu_instr *instr) +{ + if (devinfo->ver < 71) + return v3d33_qpu_mul_unpack(devinfo, packed_inst, instr); + else + return v3d71_qpu_mul_unpack(devinfo, packed_inst, instr); +} + static const struct opcode_desc * lookup_opcode_from_instr(const struct v3d_device_info *devinfo, const struct opcode_desc *opcodes, size_t num_opcodes, @@ -1022,7 +1448,7 @@ lookup_opcode_from_instr(const struct v3d_device_info *devinfo, if (op_desc->op != op) continue; - if (opcode_invalid_in_version(devinfo, op_desc)) + if (opcode_invalid_in_version(devinfo, op_desc->first_ver, op_desc->last_ver)) continue; return op_desc; @@ -1032,30 +1458,31 @@ lookup_opcode_from_instr(const struct v3d_device_info *devinfo, } static bool -v3d_qpu_add_pack(const struct v3d_device_info *devinfo, - const struct v3d_qpu_instr *instr, uint64_t *packed_instr) +v3d33_qpu_add_pack(const struct v3d_device_info *devinfo, + const struct v3d_qpu_instr *instr, uint64_t *packed_instr) { uint32_t waddr = instr->alu.add.waddr; uint32_t mux_a = instr->alu.add.a.mux; uint32_t mux_b = instr->alu.add.b.mux; int nsrc = v3d_qpu_add_op_num_src(instr->alu.add.op); const struct opcode_desc *desc = - lookup_opcode_from_instr(devinfo, add_ops, ARRAY_SIZE(add_ops), + lookup_opcode_from_instr(devinfo, add_ops_v33, + ARRAY_SIZE(add_ops_v33), instr->alu.add.op); if (!desc) return false; - uint32_t opcode = desc->opcode_first; + uint32_t opcode = opcode = desc->opcode_first; /* If an operation doesn't use an arg, its mux values may be used to * identify the operation type. */ if (nsrc < 2) - mux_b = ffs(desc->mux_b_mask) - 1; + mux_b = ffs(desc->mux.b_mask) - 1; if (nsrc < 1) - mux_a = ffs(desc->mux_a_mask) - 1; + mux_a = ffs(desc->mux.a_mask) - 1; bool no_magic_write = false; @@ -1162,8 +1589,8 @@ v3d_qpu_add_pack(const struct v3d_device_info *devinfo, return false; } - opcode = (opcode & ~(1 << 2)) | (a_unpack << 2); - opcode = (opcode & ~(1 << 0)) | (b_unpack << 0); + opcode = (opcode & ~(0x3 << 2)) | (a_unpack << 2); + opcode = (opcode & ~(0x3 << 0)) | (b_unpack << 0); break; } @@ -1188,7 +1615,7 @@ v3d_qpu_add_pack(const struct v3d_device_info *devinfo, } if (packed == 0) return false; - opcode = (opcode & ~(1 << 2)) | packed << 2; + opcode = (opcode & ~(0x3 << 2)) | packed << 2; break; } @@ -1245,15 +1672,211 @@ v3d_qpu_add_pack(const struct v3d_device_info *devinfo, } static bool -v3d_qpu_mul_pack(const struct v3d_device_info *devinfo, - const struct v3d_qpu_instr *instr, uint64_t *packed_instr) +v3d71_qpu_add_pack(const struct v3d_device_info *devinfo, + const struct v3d_qpu_instr *instr, uint64_t *packed_instr) +{ + uint32_t waddr = instr->alu.add.waddr; + uint32_t raddr_a = instr->alu.add.a.raddr; + uint32_t raddr_b = instr->alu.add.b.raddr; + + int nsrc = v3d_qpu_add_op_num_src(instr->alu.add.op); + const struct opcode_desc *desc = + lookup_opcode_from_instr(devinfo, add_ops_v71, + ARRAY_SIZE(add_ops_v71), + instr->alu.add.op); + if (!desc) + return false; + + uint32_t opcode = opcode = desc->opcode_first; + + /* If an operation doesn't use an arg, its raddr values may be used to + * identify the operation type. + */ + if (nsrc < 2) + raddr_b = ffsll(desc->raddr_mask) - 1; + + bool no_magic_write = false; + + switch (instr->alu.add.op) { + case V3D_QPU_A_STVPMV: + waddr = 0; + no_magic_write = true; + break; + case V3D_QPU_A_STVPMD: + waddr = 1; + no_magic_write = true; + break; + case V3D_QPU_A_STVPMP: + waddr = 2; + no_magic_write = true; + break; + + case V3D_QPU_A_LDVPMV_IN: + case V3D_QPU_A_LDVPMD_IN: + case V3D_QPU_A_LDVPMP: + case V3D_QPU_A_LDVPMG_IN: + assert(!instr->alu.add.magic_write); + break; + + case V3D_QPU_A_LDVPMV_OUT: + case V3D_QPU_A_LDVPMD_OUT: + case V3D_QPU_A_LDVPMG_OUT: + assert(!instr->alu.add.magic_write); + *packed_instr |= V3D_QPU_MA; + break; + + default: + break; + } + + switch (instr->alu.add.op) { + case V3D_QPU_A_FADD: + case V3D_QPU_A_FADDNF: + case V3D_QPU_A_FSUB: + case V3D_QPU_A_FMIN: + case V3D_QPU_A_FMAX: + case V3D_QPU_A_FCMP: { + uint32_t output_pack; + uint32_t a_unpack; + uint32_t b_unpack; + + if (instr->alu.add.op != V3D_QPU_A_FCMP) { + if (!v3d_qpu_float32_pack_pack(instr->alu.add.output_pack, + &output_pack)) { + return false; + } + opcode |= output_pack << 4; + } + + if (!v3d_qpu_float32_unpack_pack(instr->alu.add.a.unpack, + &a_unpack)) { + return false; + } + + if (!v3d_qpu_float32_unpack_pack(instr->alu.add.b.unpack, + &b_unpack)) { + return false; + } + + opcode |= a_unpack << 2; + opcode |= b_unpack << 0; + + break; + } + + case V3D_QPU_A_VFPACK: { + uint32_t a_unpack; + uint32_t b_unpack; + + if (instr->alu.add.a.unpack == V3D_QPU_UNPACK_ABS || + instr->alu.add.b.unpack == V3D_QPU_UNPACK_ABS) { + return false; + } + + if (!v3d_qpu_float32_unpack_pack(instr->alu.add.a.unpack, + &a_unpack)) { + return false; + } + + if (!v3d_qpu_float32_unpack_pack(instr->alu.add.b.unpack, + &b_unpack)) { + return false; + } + + opcode = (opcode & ~(0x3 << 2)) | (a_unpack << 2); + opcode = (opcode & ~(0x3 << 0)) | (b_unpack << 0); + + break; + } + + case V3D_QPU_A_FFLOOR: + case V3D_QPU_A_FROUND: + case V3D_QPU_A_FTRUNC: + case V3D_QPU_A_FCEIL: + case V3D_QPU_A_FDX: + case V3D_QPU_A_FDY: { + uint32_t packed; + + if (!v3d_qpu_float32_pack_pack(instr->alu.add.output_pack, + &packed)) { + return false; + } + raddr_b |= packed; + + if (!v3d_qpu_float32_unpack_pack(instr->alu.add.a.unpack, + &packed)) { + return false; + } + if (packed == 0) + return false; + raddr_b = (raddr_b & ~(0x3 << 2)) | packed << 2; + break; + } + + case V3D_QPU_A_FTOIN: + case V3D_QPU_A_FTOIZ: + case V3D_QPU_A_FTOUZ: + case V3D_QPU_A_FTOC: + if (instr->alu.add.output_pack != V3D_QPU_PACK_NONE) + return false; + + uint32_t packed; + if (!v3d_qpu_float32_unpack_pack(instr->alu.add.a.unpack, + &packed)) { + return false; + } + if (packed == 0) + return false; + + raddr_b |= (raddr_b & ~(0x3 << 2)) | packed << 2; + + break; + + case V3D_QPU_A_VFMIN: + case V3D_QPU_A_VFMAX: + if (instr->alu.add.output_pack != V3D_QPU_PACK_NONE || + instr->alu.add.b.unpack != V3D_QPU_UNPACK_NONE) { + return false; + } + + if (!v3d_qpu_float16_unpack_pack(instr->alu.add.a.unpack, + &packed)) { + return false; + } + opcode |= packed; + break; + + default: + if (instr->alu.add.op != V3D_QPU_A_NOP && + (instr->alu.add.output_pack != V3D_QPU_PACK_NONE || + instr->alu.add.a.unpack != V3D_QPU_UNPACK_NONE || + instr->alu.add.b.unpack != V3D_QPU_UNPACK_NONE)) { + return false; + } + break; + } + + *packed_instr |= QPU_SET_FIELD(raddr_a, V3D_QPU_RADDR_A); + *packed_instr |= QPU_SET_FIELD(raddr_b, V3D_QPU_RADDR_B); + *packed_instr |= QPU_SET_FIELD(opcode, V3D_QPU_OP_ADD); + *packed_instr |= QPU_SET_FIELD(waddr, V3D_QPU_WADDR_A); + if (instr->alu.add.magic_write && !no_magic_write) + *packed_instr |= V3D_QPU_MA; + + return true; +} + +static bool +v3d33_qpu_mul_pack(const struct v3d_device_info *devinfo, + const struct v3d_qpu_instr *instr, uint64_t *packed_instr) { uint32_t mux_a = instr->alu.mul.a.mux; uint32_t mux_b = instr->alu.mul.b.mux; int nsrc = v3d_qpu_mul_op_num_src(instr->alu.mul.op); const struct opcode_desc *desc = - lookup_opcode_from_instr(devinfo, mul_ops, ARRAY_SIZE(mul_ops), + lookup_opcode_from_instr(devinfo, mul_ops_v33, + ARRAY_SIZE(mul_ops_v33), instr->alu.mul.op); if (!desc) @@ -1265,10 +1888,10 @@ v3d_qpu_mul_pack(const struct v3d_device_info *devinfo, * that here. If mux a/b determine packing, it will be set below. */ if (nsrc < 2) - mux_b = ffs(desc->mux_b_mask) - 1; + mux_b = ffs(desc->mux.b_mask) - 1; if (nsrc < 1) - mux_a = ffs(desc->mux_a_mask) - 1; + mux_a = ffs(desc->mux.a_mask) - 1; switch (instr->alu.mul.op) { case V3D_QPU_M_FMUL: { @@ -1351,6 +1974,130 @@ v3d_qpu_mul_pack(const struct v3d_device_info *devinfo, return true; } +static bool +v3d71_qpu_mul_pack(const struct v3d_device_info *devinfo, + const struct v3d_qpu_instr *instr, uint64_t *packed_instr) +{ + uint32_t raddr_c = instr->alu.mul.a.raddr; + uint32_t raddr_d = instr->alu.mul.b.raddr; + int nsrc = v3d_qpu_mul_op_num_src(instr->alu.mul.op); + + const struct opcode_desc *desc = + lookup_opcode_from_instr(devinfo, mul_ops_v71, + ARRAY_SIZE(mul_ops_v71), + instr->alu.mul.op); + if (!desc) + return false; + + uint32_t opcode = desc->opcode_first; + + /* Some opcodes have a single valid value for their raddr_d, so set + * that here. If raddr_b determine packing, it will be set below. + */ + if (nsrc < 2) + raddr_d = ffsll(desc->raddr_mask) - 1; + + switch (instr->alu.mul.op) { + case V3D_QPU_M_FMUL: { + uint32_t packed; + + if (!v3d_qpu_float32_pack_pack(instr->alu.mul.output_pack, + &packed)) { + return false; + } + /* No need for a +1 because desc->opcode_first has a 1 in this + * field. + */ + opcode += packed << 4; + + if (!v3d_qpu_float32_unpack_pack(instr->alu.mul.a.unpack, + &packed)) { + return false; + } + opcode |= packed << 2; + + if (!v3d_qpu_float32_unpack_pack(instr->alu.mul.b.unpack, + &packed)) { + return false; + } + opcode |= packed << 0; + break; + } + + case V3D_QPU_M_FMOV: { + uint32_t packed; + + if (!v3d_qpu_float32_pack_pack(instr->alu.mul.output_pack, + &packed)) { + return false; + } + opcode |= (packed >> 1) & 1; + raddr_d = (packed & 1) << 2; + + if (!v3d_qpu_float32_unpack_pack(instr->alu.mul.a.unpack, + &packed)) { + return false; + } + raddr_d |= packed; + break; + } + + case V3D_QPU_M_VFMUL: { + unreachable("pending v71 update"); + uint32_t packed; + + if (instr->alu.mul.output_pack != V3D_QPU_PACK_NONE) + return false; + + if (!v3d_qpu_float16_unpack_pack(instr->alu.mul.a.unpack, + &packed)) { + return false; + } + if (instr->alu.mul.a.unpack == V3D_QPU_UNPACK_SWAP_16) + opcode = 8; + else + opcode |= (packed + 4) & 7; + + if (instr->alu.mul.b.unpack != V3D_QPU_UNPACK_NONE) + return false; + + break; + } + + default: + break; + } + + *packed_instr |= QPU_SET_FIELD(raddr_c, V3D_QPU_RADDR_C); + *packed_instr |= QPU_SET_FIELD(raddr_d, V3D_QPU_RADDR_D); + *packed_instr |= QPU_SET_FIELD(opcode, V3D_QPU_OP_MUL); + *packed_instr |= QPU_SET_FIELD(instr->alu.mul.waddr, V3D_QPU_WADDR_M); + if (instr->alu.mul.magic_write) + *packed_instr |= V3D_QPU_MM; + + return true; +} + +static bool +v3d_qpu_add_pack(const struct v3d_device_info *devinfo, + const struct v3d_qpu_instr *instr, uint64_t *packed_instr) +{ + if (devinfo->ver < 71) + return v3d33_qpu_add_pack(devinfo, instr, packed_instr); + else + return v3d71_qpu_add_pack(devinfo, instr, packed_instr); +} + +static bool +v3d_qpu_mul_pack(const struct v3d_device_info *devinfo, + const struct v3d_qpu_instr *instr, uint64_t *packed_instr) +{ + if (devinfo->ver < 71) + return v3d33_qpu_mul_pack(devinfo, instr, packed_instr); + else + return v3d71_qpu_mul_pack(devinfo, instr, packed_instr); +} + static bool v3d_qpu_instr_unpack_alu(const struct v3d_device_info *devinfo, uint64_t packed_instr, @@ -1379,8 +2126,14 @@ v3d_qpu_instr_unpack_alu(const struct v3d_device_info *devinfo, return false; } - instr->raddr_a = QPU_GET_FIELD(packed_instr, V3D_QPU_RADDR_A); - instr->raddr_b = QPU_GET_FIELD(packed_instr, V3D_QPU_RADDR_B); + if (devinfo->ver <= 71) { + /* + * For v71 this will be set on add/mul unpack, as raddr are now + * part of v3d_qpu_input + */ + instr->raddr_a = QPU_GET_FIELD(packed_instr, V3D_QPU_RADDR_A); + instr->raddr_b = QPU_GET_FIELD(packed_instr, V3D_QPU_RADDR_B); + } if (!v3d_qpu_add_unpack(devinfo, packed_instr, instr)) return false; @@ -1466,8 +2219,14 @@ v3d_qpu_instr_pack_alu(const struct v3d_device_info *devinfo, *packed_instr |= QPU_SET_FIELD(sig, V3D_QPU_SIG); if (instr->type == V3D_QPU_INSTR_TYPE_ALU) { - *packed_instr |= QPU_SET_FIELD(instr->raddr_a, V3D_QPU_RADDR_A); - *packed_instr |= QPU_SET_FIELD(instr->raddr_b, V3D_QPU_RADDR_B); + if (devinfo->ver < 71) { + /* + * For v71 this will be set on add/mul unpack, as raddr are now + * part of v3d_qpu_input + */ + *packed_instr |= QPU_SET_FIELD(instr->raddr_a, V3D_QPU_RADDR_A); + *packed_instr |= QPU_SET_FIELD(instr->raddr_b, V3D_QPU_RADDR_B); + } if (!v3d_qpu_add_pack(devinfo, instr, packed_instr)) return false; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0017-broadcom-compiler-update-node-temp-translation-for-v.patch ================================================ From ebba9019461083687f6afd23ff0d4646c1a667cb Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Sun, 29 Jan 2023 00:27:11 +0100 Subject: [PATCH 017/142] broadcom/compiler: update node/temp translation for v71 As the offset applied needs to take into account if we have accumulators or not. --- src/broadcom/compiler/vir_register_allocate.c | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/src/broadcom/compiler/vir_register_allocate.c b/src/broadcom/compiler/vir_register_allocate.c index b22f915d1df..aa9473d124b 100644 --- a/src/broadcom/compiler/vir_register_allocate.c +++ b/src/broadcom/compiler/vir_register_allocate.c @@ -39,30 +39,31 @@ CLASS_BITS_R5) static inline uint32_t -temp_to_node(uint32_t temp) +temp_to_node(struct v3d_compile *c, uint32_t temp) { - return temp + ACC_COUNT; + return temp + (c->devinfo->has_accumulators ? ACC_COUNT : 0); } static inline uint32_t -node_to_temp(uint32_t node) +node_to_temp(struct v3d_compile *c, uint32_t node) { - assert(node >= ACC_COUNT); - return node - ACC_COUNT; + assert((c->devinfo->has_accumulators && node >= ACC_COUNT) || + (!c->devinfo->has_accumulators && node >= 0)); + return node - (c->devinfo->has_accumulators ? ACC_COUNT : 0); } static inline uint8_t -get_temp_class_bits(struct v3d_ra_node_info *nodes, +get_temp_class_bits(struct v3d_compile *c, uint32_t temp) { - return nodes->info[temp_to_node(temp)].class_bits; + return c->nodes.info[temp_to_node(c, temp)].class_bits; } static inline void -set_temp_class_bits(struct v3d_ra_node_info *nodes, +set_temp_class_bits(struct v3d_compile *c, uint32_t temp, uint8_t class_bits) { - nodes->info[temp_to_node(temp)].class_bits = class_bits; + c->nodes.info[temp_to_node(c, temp)].class_bits = class_bits; } static struct ra_class * @@ -84,7 +85,7 @@ static inline struct ra_class * choose_reg_class_for_temp(struct v3d_compile *c, uint32_t temp) { assert(temp < c->num_temps && temp < c->nodes.alloc_count); - return choose_reg_class(c, get_temp_class_bits(&c->nodes, temp)); + return choose_reg_class(c, get_temp_class_bits(c, temp)); } static inline bool @@ -313,7 +314,7 @@ v3d_choose_spill_node(struct v3d_compile *c) for (unsigned i = 0; i < c->num_temps; i++) { if (BITSET_TEST(c->spillable, i)) { - ra_set_node_spill_cost(c->g, temp_to_node(i), + ra_set_node_spill_cost(c->g, temp_to_node(c, i), spill_costs[i]); } } @@ -482,7 +483,7 @@ v3d_emit_spill_tmua(struct v3d_compile *c, c->temp_start[i] < ip && c->temp_end[i] >= ip : c->temp_start[i] <= ip && c->temp_end[i] > ip; if (thrsw_cross) { - ra_set_node_class(c->g, temp_to_node(i), + ra_set_node_class(c->g, temp_to_node(c, i), choose_reg_class(c, CLASS_BITS_PHYS)); } } @@ -509,8 +510,7 @@ v3d_emit_tmu_spill(struct v3d_compile *c, * same register class bits as the original. */ if (inst == position) { - uint8_t class_bits = get_temp_class_bits(&c->nodes, - inst->dst.index); + uint8_t class_bits = get_temp_class_bits(c, inst->dst.index); inst->dst = vir_get_temp(c); add_node(c, inst->dst.index, class_bits); } else { @@ -574,7 +574,7 @@ v3d_spill_reg(struct v3d_compile *c, int *acc_nodes, int spill_temp) reconstruct_op = orig_def->qpu.alu.add.op; } - uint32_t spill_node = temp_to_node(spill_temp); + uint32_t spill_node = temp_to_node(c, spill_temp); /* We must disable the ldunif optimization if we are spilling uniforms */ bool had_disable_ldunif_opt = c->disable_ldunif_opt; @@ -739,12 +739,12 @@ v3d_spill_reg(struct v3d_compile *c, int *acc_nodes, int spill_temp) * update node priorities based one new liveness data. */ uint32_t sb_temp =c->spill_base.index; - uint32_t sb_node = temp_to_node(sb_temp); + uint32_t sb_node = temp_to_node(c, sb_temp); for (uint32_t i = 0; i < c->num_temps; i++) { if (c->temp_end[i] == -1) continue; - uint32_t node_i = temp_to_node(i); + uint32_t node_i = temp_to_node(c, i); c->nodes.info[node_i].priority = c->temp_end[i] - c->temp_start[i]; @@ -752,7 +752,7 @@ v3d_spill_reg(struct v3d_compile *c, int *acc_nodes, int spill_temp) j < c->num_temps; j++) { if (interferes(c->temp_start[i], c->temp_end[i], c->temp_start[j], c->temp_end[j])) { - uint32_t node_j = temp_to_node(j); + uint32_t node_j = temp_to_node(c, j); ra_add_node_interference(c->g, node_i, node_j); } } @@ -958,7 +958,7 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, for (int i = 0; i < c->num_temps; i++) { if (c->temp_start[i] < ip && c->temp_end[i] > ip) { ra_add_node_interference(c->g, - temp_to_node(i), + temp_to_node(c, i), acc_nodes[3]); } } @@ -968,7 +968,7 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, for (int i = 0; i < c->num_temps; i++) { if (c->temp_start[i] < ip && c->temp_end[i] > ip) { ra_add_node_interference(c->g, - temp_to_node(i), + temp_to_node(c, i), acc_nodes[4]); } } @@ -987,7 +987,7 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, * decides whether the LDVPM is in or out) */ assert(inst->dst.file == QFILE_TEMP); - set_temp_class_bits(&c->nodes, inst->dst.index, + set_temp_class_bits(c, inst->dst.index, CLASS_BITS_PHYS); break; } @@ -1002,7 +1002,7 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, * phys regfile. */ assert(inst->dst.file == QFILE_TEMP); - set_temp_class_bits(&c->nodes, inst->dst.index, + set_temp_class_bits(c, inst->dst.index, CLASS_BITS_PHYS); break; } @@ -1024,7 +1024,7 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, */ assert(inst->qpu.alu.mul.op == V3D_QPU_M_MOV); assert(inst->dst.file == QFILE_TEMP); - uint32_t node = temp_to_node(inst->dst.index); + uint32_t node = temp_to_node(c, inst->dst.index); ra_set_node_reg(c->g, node, PHYS_INDEX + inst->src[0].index); break; @@ -1043,9 +1043,9 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, */ if (!inst->qpu.sig.ldunif) { uint8_t class_bits = - get_temp_class_bits(&c->nodes, inst->dst.index) & + get_temp_class_bits(c, inst->dst.index) & ~CLASS_BITS_R5; - set_temp_class_bits(&c->nodes, inst->dst.index, + set_temp_class_bits(c, inst->dst.index, class_bits); } else { @@ -1054,7 +1054,7 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, * loads interfere with each other. */ if (c->devinfo->ver < 40) { - set_temp_class_bits(&c->nodes, inst->dst.index, + set_temp_class_bits(c, inst->dst.index, CLASS_BITS_R5); } } @@ -1064,7 +1064,7 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, if (inst->qpu.sig.thrsw) { for (int i = 0; i < c->num_temps; i++) { if (c->temp_start[i] < ip && c->temp_end[i] > ip) { - set_temp_class_bits(&c->nodes, i, + set_temp_class_bits(c, i, CLASS_BITS_PHYS); } } @@ -1125,7 +1125,7 @@ v3d_register_allocate(struct v3d_compile *c) c->nodes.info[i].priority = 0; c->nodes.info[i].class_bits = 0; } else { - uint32_t t = node_to_temp(i); + uint32_t t = node_to_temp(c, i); c->nodes.info[i].priority = c->temp_end[t] - c->temp_start[t]; c->nodes.info[i].class_bits = CLASS_BITS_ANY; @@ -1143,7 +1143,7 @@ v3d_register_allocate(struct v3d_compile *c) /* Set the register classes for all our temporaries in the graph */ for (uint32_t i = 0; i < c->num_temps; i++) { - ra_set_node_class(c->g, temp_to_node(i), + ra_set_node_class(c->g, temp_to_node(c, i), choose_reg_class_for_temp(c, i)); } @@ -1153,8 +1153,8 @@ v3d_register_allocate(struct v3d_compile *c) if (interferes(c->temp_start[i], c->temp_end[i], c->temp_start[j], c->temp_end[j])) { ra_add_node_interference(c->g, - temp_to_node(i), - temp_to_node(j)); + temp_to_node(c, i), + temp_to_node(c, j)); } } } @@ -1171,7 +1171,7 @@ v3d_register_allocate(struct v3d_compile *c) if (c->spill_size < V3D_CHANNELS * sizeof(uint32_t) * force_register_spills) { int node = v3d_choose_spill_node(c); - uint32_t temp = node_to_temp(node); + uint32_t temp = node_to_temp(c, node); if (node != -1) { v3d_spill_reg(c, acc_nodes, temp); continue; @@ -1186,7 +1186,7 @@ v3d_register_allocate(struct v3d_compile *c) if (node == -1) goto spill_fail; - uint32_t temp = node_to_temp(node); + uint32_t temp = node_to_temp(c, node); enum temp_spill_type spill_type = get_spill_type_for_temp(c, temp); if (spill_type != SPILL_TYPE_TMU || tmu_spilling_allowed(c)) { @@ -1201,7 +1201,7 @@ v3d_register_allocate(struct v3d_compile *c) /* Allocation was successful, build the 'temp -> reg' map */ temp_registers = calloc(c->num_temps, sizeof(*temp_registers)); for (uint32_t i = 0; i < c->num_temps; i++) { - int ra_reg = ra_get_node_reg(c->g, temp_to_node(i)); + int ra_reg = ra_get_node_reg(c->g, temp_to_node(c, i)); if (ra_reg < PHYS_INDEX) { temp_registers[i].magic = true; temp_registers[i].index = (V3D_QPU_WADDR_R0 + -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0018-broadcom-compiler-phys-index-depends-on-hw-version.patch ================================================ From 9b2dfe0286212aba3687a06023cc5b4ce9944ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Mon, 23 Aug 2021 02:18:43 +0200 Subject: [PATCH 018/142] broadcom/compiler: phys index depends on hw version For 7.1 there are not accumulators. So we replace the macro with a function call. --- src/broadcom/compiler/vir_register_allocate.c | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/src/broadcom/compiler/vir_register_allocate.c b/src/broadcom/compiler/vir_register_allocate.c index aa9473d124b..a358b616e13 100644 --- a/src/broadcom/compiler/vir_register_allocate.c +++ b/src/broadcom/compiler/vir_register_allocate.c @@ -28,9 +28,19 @@ #define ACC_INDEX 0 #define ACC_COUNT 6 -#define PHYS_INDEX (ACC_INDEX + ACC_COUNT) -#define PHYS_COUNT 64 +#define PHYS_COUNT 64 + +static uint8_t +get_phys_index(const struct v3d_device_info *devinfo) +{ + if (devinfo->has_accumulators) + return ACC_INDEX + ACC_COUNT; + else + return 0; +} + +/* ACC as accumulator */ #define CLASS_BITS_PHYS (1 << 0) #define CLASS_BITS_ACC (1 << 1) #define CLASS_BITS_R5 (1 << 4) @@ -771,9 +781,11 @@ v3d_spill_reg(struct v3d_compile *c, int *acc_nodes, int spill_temp) } struct v3d_ra_select_callback_data { + uint32_t phys_index; uint32_t next_acc; uint32_t next_phys; struct v3d_ra_node_info *nodes; + const struct v3d_device_info *devinfo; }; /* Choosing accumulators improves chances of merging QPU instructions @@ -794,7 +806,7 @@ v3d_ra_favor_accum(struct v3d_ra_select_callback_data *v3d_ra, static const int available_rf_threshold = 5; int available_rf = 0 ; for (int i = 0; i < PHYS_COUNT; i++) { - if (BITSET_TEST(regs, PHYS_INDEX + i)) + if (BITSET_TEST(regs, v3d_ra->phys_index + i)) available_rf++; if (available_rf >= available_rf_threshold) break; @@ -854,7 +866,7 @@ v3d_ra_select_rf(struct v3d_ra_select_callback_data *v3d_ra, { for (int i = 0; i < PHYS_COUNT; i++) { int phys_off = (v3d_ra->next_phys + i) % PHYS_COUNT; - int phys = PHYS_INDEX + phys_off; + int phys = v3d_ra->phys_index + phys_off; if (BITSET_TEST(regs, phys)) { v3d_ra->next_phys = phys_off + 1; @@ -896,8 +908,9 @@ vir_init_reg_sets(struct v3d_compiler *compiler) * register file can be divided up for fragment shader threading. */ int max_thread_index = (compiler->devinfo->ver >= 40 ? 2 : 3); + uint8_t phys_index = get_phys_index(compiler->devinfo); - compiler->regs = ra_alloc_reg_set(compiler, PHYS_INDEX + PHYS_COUNT, + compiler->regs = ra_alloc_reg_set(compiler, phys_index + PHYS_COUNT, false); if (!compiler->regs) return false; @@ -912,8 +925,8 @@ vir_init_reg_sets(struct v3d_compiler *compiler) compiler->reg_class_phys[threads] = ra_alloc_contig_reg_class(compiler->regs, 1); - for (int i = PHYS_INDEX; - i < PHYS_INDEX + (PHYS_COUNT >> threads); i++) { + for (int i = phys_index; + i < phys_index + (PHYS_COUNT >> threads); i++) { ra_class_add_reg(compiler->reg_class_phys_or_acc[threads], i); ra_class_add_reg(compiler->reg_class_phys[threads], i); ra_class_add_reg(compiler->reg_class_any[threads], i); @@ -1026,7 +1039,8 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, assert(inst->dst.file == QFILE_TEMP); uint32_t node = temp_to_node(c, inst->dst.index); ra_set_node_reg(c->g, node, - PHYS_INDEX + inst->src[0].index); + get_phys_index(c->devinfo) + + inst->src[0].index); break; } } @@ -1086,13 +1100,17 @@ v3d_register_allocate(struct v3d_compile *c) c->num_temps + ACC_COUNT), }; + uint32_t phys_index = get_phys_index(c->devinfo); + struct v3d_ra_select_callback_data callback_data = { + .phys_index = phys_index, .next_acc = 0, /* Start at RF3, to try to keep the TLB writes from using * RF0-2. */ .next_phys = 3, .nodes = &c->nodes, + .devinfo = c->devinfo, }; vir_calculate_live_intervals(c); @@ -1139,6 +1157,7 @@ v3d_register_allocate(struct v3d_compile *c) vir_for_each_inst_inorder(inst, c) { inst->ip = ip++; update_graph_and_reg_classes_for_inst(c, acc_nodes, inst); + } /* Set the register classes for all our temporaries in the graph */ @@ -1202,13 +1221,13 @@ v3d_register_allocate(struct v3d_compile *c) temp_registers = calloc(c->num_temps, sizeof(*temp_registers)); for (uint32_t i = 0; i < c->num_temps; i++) { int ra_reg = ra_get_node_reg(c->g, temp_to_node(c, i)); - if (ra_reg < PHYS_INDEX) { + if (ra_reg < phys_index) { temp_registers[i].magic = true; temp_registers[i].index = (V3D_QPU_WADDR_R0 + ra_reg - ACC_INDEX); } else { temp_registers[i].magic = false; - temp_registers[i].index = ra_reg - PHYS_INDEX; + temp_registers[i].index = ra_reg - phys_index; } } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0019-broadcom-compiler-don-t-favor-select-accum-registers.patch ================================================ From da0a3deadf86a46c8323267d3f6a49e442835608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Fri, 17 Sep 2021 01:07:06 +0200 Subject: [PATCH 019/142] broadcom/compiler: don't favor/select accum registers for hw not supporting it Note that what we do is to just return false on the favor/select accum methods. We could just avoid to call them, but as the select is called more than once, it is just easier this way. --- src/broadcom/compiler/vir_register_allocate.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/broadcom/compiler/vir_register_allocate.c b/src/broadcom/compiler/vir_register_allocate.c index a358b616e13..1f495180784 100644 --- a/src/broadcom/compiler/vir_register_allocate.c +++ b/src/broadcom/compiler/vir_register_allocate.c @@ -797,6 +797,9 @@ v3d_ra_favor_accum(struct v3d_ra_select_callback_data *v3d_ra, BITSET_WORD *regs, int priority) { + if (!v3d_ra->devinfo->has_accumulators) + return false; + /* Favor accumulators if we have less that this number of physical * registers. Accumulators have more restrictions (like being * invalidated through thrsw), so running out of physical registers @@ -832,6 +835,9 @@ v3d_ra_select_accum(struct v3d_ra_select_callback_data *v3d_ra, BITSET_WORD *regs, unsigned int *out) { + if (!v3d_ra->devinfo->has_accumulators) + return false; + /* Choose r5 for our ldunifs if possible (nobody else can load to that * reg, and it keeps the QPU cond field free from being occupied by * ldunifrf). -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0020-broadcom-vir-implement-is_no_op_mov-for-v71.patch ================================================ From 6c04d7c917da6b38f8b2b4306ab03ed2ab7e6ce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 9 Sep 2021 00:28:53 +0200 Subject: [PATCH 020/142] broadcom/vir: implement is_no_op_mov for v71 Did some refactoring/splitting. --- src/broadcom/compiler/vir_to_qpu.c | 66 ++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 13 deletions(-) diff --git a/src/broadcom/compiler/vir_to_qpu.c b/src/broadcom/compiler/vir_to_qpu.c index c8b6e0a91a0..08970d52954 100644 --- a/src/broadcom/compiler/vir_to_qpu.c +++ b/src/broadcom/compiler/vir_to_qpu.c @@ -129,19 +129,8 @@ set_src(struct v3d_qpu_instr *instr, enum v3d_qpu_mux *mux, struct qpu_reg src) } static bool -is_no_op_mov(struct qinst *qinst) +v3d33_mov_src_and_dst_equal(struct qinst *qinst) { - static const struct v3d_qpu_sig no_sig = {0}; - - /* Make sure it's just a lone MOV. */ - if (qinst->qpu.type != V3D_QPU_INSTR_TYPE_ALU || - qinst->qpu.alu.mul.op != V3D_QPU_M_MOV || - qinst->qpu.alu.add.op != V3D_QPU_A_NOP || - memcmp(&qinst->qpu.sig, &no_sig, sizeof(no_sig)) != 0) { - return false; - } - - /* Check if it's a MOV from a register to itself. */ enum v3d_qpu_waddr waddr = qinst->qpu.alu.mul.waddr; if (qinst->qpu.alu.mul.magic_write) { if (waddr < V3D_QPU_WADDR_R0 || waddr > V3D_QPU_WADDR_R4) @@ -168,6 +157,57 @@ is_no_op_mov(struct qinst *qinst) return false; } + return true; +} + +static bool +v3d71_mov_src_and_dst_equal(struct qinst *qinst) +{ + if (qinst->qpu.alu.mul.magic_write) + return false; + + enum v3d_qpu_waddr waddr = qinst->qpu.alu.mul.waddr; + int raddr; + + raddr = qinst->qpu.alu.mul.a.raddr; + if (raddr != waddr) + return false; + + return true; +} + +static bool +mov_src_and_dst_equal(struct qinst *qinst, + const struct v3d_device_info *devinfo) +{ + if (devinfo->ver < 71) + return v3d33_mov_src_and_dst_equal(qinst); + else + return v3d71_mov_src_and_dst_equal(qinst); +} + + +static bool +is_no_op_mov(struct qinst *qinst, + const struct v3d_device_info *devinfo) +{ + static const struct v3d_qpu_sig no_sig = {0}; + + /* Make sure it's just a lone MOV. We only check for M_MOV. Although + * for V3D 7.x there is also A_MOV, we don't need to check for it as + * we always emit using M_MOV. We could use A_MOV later on the + * squedule to improve performance + */ + if (qinst->qpu.type != V3D_QPU_INSTR_TYPE_ALU || + qinst->qpu.alu.mul.op != V3D_QPU_M_MOV || + qinst->qpu.alu.add.op != V3D_QPU_A_NOP || + memcmp(&qinst->qpu.sig, &no_sig, sizeof(no_sig)) != 0) { + return false; + } + + if (!mov_src_and_dst_equal(qinst, devinfo)) + return false; + /* No packing or flags updates, or we need to execute the * instruction. */ @@ -324,7 +364,7 @@ v3d_generate_code_block(struct v3d_compile *c, qinst->qpu.alu.mul.waddr = dst.index; qinst->qpu.alu.mul.magic_write = dst.magic; - if (is_no_op_mov(qinst)) { + if (is_no_op_mov(qinst, c->devinfo)) { vir_remove_instruction(c, qinst); continue; } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0021-broadcom-compiler-update-vir_to_qpu-set_src-for-v71.patch ================================================ From 7b5be2d9b178a45c34c22db2744639a6a8a216d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 9 Sep 2021 01:18:54 +0200 Subject: [PATCH 021/142] broadcom/compiler: update vir_to_qpu::set_src for v71 --- src/broadcom/compiler/vir_to_qpu.c | 47 ++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/src/broadcom/compiler/vir_to_qpu.c b/src/broadcom/compiler/vir_to_qpu.c index 08970d52954..afc4941fdb1 100644 --- a/src/broadcom/compiler/vir_to_qpu.c +++ b/src/broadcom/compiler/vir_to_qpu.c @@ -86,12 +86,22 @@ new_qpu_nop_before(struct qinst *inst) return q; } +static void +v3d71_set_src(struct v3d_qpu_instr *instr, uint8_t *raddr, struct qpu_reg src) +{ + if (src.smimm) + unreachable("v3d71_set_src: pending handling small immediates"); + + assert(!src.magic); + *raddr = src.index; +} + /** * Allocates the src register (accumulator or register file) into the RADDR * fields of the instruction. */ static void -set_src(struct v3d_qpu_instr *instr, enum v3d_qpu_mux *mux, struct qpu_reg src) +v3d33_set_src(struct v3d_qpu_instr *instr, enum v3d_qpu_mux *mux, struct qpu_reg src) { if (src.smimm) { assert(instr->sig.small_imm_b); @@ -128,6 +138,24 @@ set_src(struct v3d_qpu_instr *instr, enum v3d_qpu_mux *mux, struct qpu_reg src) } } +/* + * The main purpose of the following wrapper is to make calling set_src + * cleaner. This is the reason it receives both mux and raddr pointers. Those + * will be filled or not based on the device version. + */ +static void +set_src(struct v3d_qpu_instr *instr, + enum v3d_qpu_mux *mux, + uint8_t *raddr, + struct qpu_reg src, + const struct v3d_device_info *devinfo) +{ + if (devinfo->ver < 71) + return v3d33_set_src(instr, mux, src); + else + return v3d71_set_src(instr, raddr, src); +} + static bool v3d33_mov_src_and_dst_equal(struct qinst *qinst) { @@ -340,13 +368,18 @@ v3d_generate_code_block(struct v3d_compile *c, qinst->qpu.sig_magic = dst.magic; } else if (qinst->qpu.alu.add.op != V3D_QPU_A_NOP) { assert(qinst->qpu.alu.mul.op == V3D_QPU_M_NOP); + if (nsrc >= 1) { set_src(&qinst->qpu, - &qinst->qpu.alu.add.a.mux, src[0]); + &qinst->qpu.alu.add.a.mux, + &qinst->qpu.alu.add.a.raddr, + src[0], c->devinfo); } if (nsrc >= 2) { set_src(&qinst->qpu, - &qinst->qpu.alu.add.b.mux, src[1]); + &qinst->qpu.alu.add.b.mux, + &qinst->qpu.alu.add.b.raddr, + src[1], c->devinfo); } qinst->qpu.alu.add.waddr = dst.index; @@ -354,11 +387,15 @@ v3d_generate_code_block(struct v3d_compile *c, } else { if (nsrc >= 1) { set_src(&qinst->qpu, - &qinst->qpu.alu.mul.a.mux, src[0]); + &qinst->qpu.alu.mul.a.mux, + &qinst->qpu.alu.mul.a.raddr, + src[0], c->devinfo); } if (nsrc >= 2) { set_src(&qinst->qpu, - &qinst->qpu.alu.mul.b.mux, src[1]); + &qinst->qpu.alu.mul.b.mux, + &qinst->qpu.alu.mul.b.raddr, + src[1], c->devinfo); } qinst->qpu.alu.mul.waddr = dst.index; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0022-broadcom-qpu_schedule-add-process_raddr_deps.patch ================================================ From fe89703008f2a3d6bfe6e260791f712013be5e48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 9 Sep 2021 23:59:28 +0200 Subject: [PATCH 022/142] broadcom/qpu_schedule: add process_raddr_deps On v71 we don't have muxes, but more raddr. Adding a equivalent add deps function. --- src/broadcom/compiler/qpu_schedule.c | 52 +++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index 455fa3867be..89254643c90 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -155,6 +155,7 @@ static void process_mux_deps(struct schedule_state *state, struct schedule_node *n, enum v3d_qpu_mux mux) { + assert(state->devinfo->ver < 71); switch (mux) { case V3D_QPU_MUX_A: add_read_dep(state, state->last_rf[n->inst->qpu.raddr_a], n); @@ -171,6 +172,17 @@ process_mux_deps(struct schedule_state *state, struct schedule_node *n, } } + +static void +process_raddr_deps(struct schedule_state *state, struct schedule_node *n, + uint8_t raddr, bool is_small_imm) +{ + assert(state->devinfo->ver >= 71); + + if (!is_small_imm) + add_read_dep(state, state->last_rf[raddr], n); +} + static bool tmu_write_is_sequence_terminator(uint32_t waddr) { @@ -305,15 +317,39 @@ calculate_deps(struct schedule_state *state, struct schedule_node *n) /* XXX: LOAD_IMM */ - if (v3d_qpu_add_op_num_src(inst->alu.add.op) > 0) - process_mux_deps(state, n, inst->alu.add.a.mux); - if (v3d_qpu_add_op_num_src(inst->alu.add.op) > 1) - process_mux_deps(state, n, inst->alu.add.b.mux); + if (v3d_qpu_add_op_num_src(inst->alu.add.op) > 0) { + if (devinfo->ver < 71) { + process_mux_deps(state, n, inst->alu.add.a.mux); + } else { + process_raddr_deps(state, n, inst->alu.add.a.raddr, + inst->sig.small_imm_a); + } + } + if (v3d_qpu_add_op_num_src(inst->alu.add.op) > 1) { + if (devinfo->ver < 71) { + process_mux_deps(state, n, inst->alu.add.b.mux); + } else { + process_raddr_deps(state, n, inst->alu.add.b.raddr, + inst->sig.small_imm_b); + } + } - if (v3d_qpu_mul_op_num_src(inst->alu.mul.op) > 0) - process_mux_deps(state, n, inst->alu.mul.a.mux); - if (v3d_qpu_mul_op_num_src(inst->alu.mul.op) > 1) - process_mux_deps(state, n, inst->alu.mul.b.mux); + if (v3d_qpu_mul_op_num_src(inst->alu.mul.op) > 0) { + if (devinfo->ver < 71) { + process_mux_deps(state, n, inst->alu.mul.a.mux); + } else { + process_raddr_deps(state, n, inst->alu.mul.a.raddr, + inst->sig.small_imm_c); + } + } + if (v3d_qpu_mul_op_num_src(inst->alu.mul.op) > 1) { + if (devinfo->ver < 71) { + process_mux_deps(state, n, inst->alu.mul.b.mux); + } else { + process_raddr_deps(state, n, inst->alu.mul.b.raddr, + inst->sig.small_imm_d); + } + } switch (inst->alu.add.op) { case V3D_QPU_A_VPMSETUP: -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0023-broadcom-qpu-update-disasm_raddr-for-v71.patch ================================================ From 20ce426df1ab2546332141f4bc4531ada754cdea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Fri, 10 Sep 2021 01:20:44 +0200 Subject: [PATCH 023/142] broadcom/qpu: update disasm_raddr for v71 --- src/broadcom/qpu/qpu_disasm.c | 72 ++++++++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 6 deletions(-) diff --git a/src/broadcom/qpu/qpu_disasm.c b/src/broadcom/qpu/qpu_disasm.c index 588a665f770..b613de781dc 100644 --- a/src/broadcom/qpu/qpu_disasm.c +++ b/src/broadcom/qpu/qpu_disasm.c @@ -56,8 +56,9 @@ pad_to(struct disasm_state *disasm, int n) static void -v3d_qpu_disasm_raddr(struct disasm_state *disasm, - const struct v3d_qpu_instr *instr, uint8_t mux) +v3d33_qpu_disasm_raddr(struct disasm_state *disasm, + const struct v3d_qpu_instr *instr, + enum v3d_qpu_mux mux) { if (mux == V3D_QPU_MUX_A) { append(disasm, "rf%d", instr->raddr_a); @@ -82,6 +83,65 @@ v3d_qpu_disasm_raddr(struct disasm_state *disasm, } } +enum v3d_qpu_input_class { + V3D_QPU_ADD_A, + V3D_QPU_ADD_B, + V3D_QPU_MUL_A, + V3D_QPU_MUL_B +}; + +static void +v3d71_qpu_disasm_raddr(struct disasm_state *disasm, + const struct v3d_qpu_instr *instr, + uint8_t raddr, + enum v3d_qpu_input_class input_class) +{ + bool is_small_imm = false; + switch(input_class) { + case V3D_QPU_ADD_A: + is_small_imm = instr->sig.small_imm_a; + break; + case V3D_QPU_ADD_B: + is_small_imm = instr->sig.small_imm_b; + break; + case V3D_QPU_MUL_A: + is_small_imm = instr->sig.small_imm_c; + break; + case V3D_QPU_MUL_B: + is_small_imm = instr->sig.small_imm_d; + break; + } + + if (is_small_imm) { + unreachable("Pending handling small immediates"); + uint32_t val; + ASSERTED bool ok = + v3d_qpu_small_imm_unpack(disasm->devinfo, + raddr, + &val); + + if ((int)val >= -16 && (int)val <= 15) + append(disasm, "%d", val); + else + append(disasm, "0x%08x", val); + assert(ok); + } else { + append(disasm, "rf%d", raddr); + } +} + +static void +v3d_qpu_disasm_raddr(struct disasm_state *disasm, + const struct v3d_qpu_instr *instr, + const struct v3d_qpu_input *input, + enum v3d_qpu_input_class input_class) +{ + if (disasm->devinfo->ver < 71) + v3d33_qpu_disasm_raddr(disasm, instr, input->mux); + else + v3d71_qpu_disasm_raddr(disasm, instr, input->raddr, input_class); +} + static void v3d_qpu_disasm_waddr(struct disasm_state *disasm, uint32_t waddr, bool magic) { @@ -121,14 +181,14 @@ v3d_qpu_disasm_add(struct disasm_state *disasm, if (num_src >= 1) { if (has_dst) append(disasm, ", "); - v3d_qpu_disasm_raddr(disasm, instr, instr->alu.add.a.mux); + v3d_qpu_disasm_raddr(disasm, instr, &instr->alu.add.a, V3D_QPU_ADD_A); append(disasm, "%s", v3d_qpu_unpack_name(instr->alu.add.a.unpack)); } if (num_src >= 2) { append(disasm, ", "); - v3d_qpu_disasm_raddr(disasm, instr, instr->alu.add.b.mux); + v3d_qpu_disasm_raddr(disasm, instr, &instr->alu.add.b, V3D_QPU_ADD_B); append(disasm, "%s", v3d_qpu_unpack_name(instr->alu.add.b.unpack)); } @@ -164,14 +224,14 @@ v3d_qpu_disasm_mul(struct disasm_state *disasm, if (num_src >= 1) { if (has_dst) append(disasm, ", "); - v3d_qpu_disasm_raddr(disasm, instr, instr->alu.mul.a.mux); + v3d_qpu_disasm_raddr(disasm, instr, &instr->alu.mul.a, V3D_QPU_MUL_A); append(disasm, "%s", v3d_qpu_unpack_name(instr->alu.mul.a.unpack)); } if (num_src >= 2) { append(disasm, ", "); - v3d_qpu_disasm_raddr(disasm, instr, instr->alu.mul.b.mux); + v3d_qpu_disasm_raddr(disasm, instr, &instr->alu.mul.b, V3D_QPU_MUL_B); append(disasm, "%s", v3d_qpu_unpack_name(instr->alu.mul.b.unpack)); } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0024-broadcom-qpu-return-false-on-qpu_writes_accumulatorX.patch ================================================ From 7263fa24a3c57b1dcd4d870670cda86ae89aa28c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Wed, 15 Sep 2021 10:55:49 +0200 Subject: [PATCH 024/142] broadcom/qpu: return false on qpu_writes_accumulatorXX helpers for v71 As for v71 doesn't have accumulators (devinfo->has_accumulators set to false), those methods would always return false. --- src/broadcom/qpu/qpu_instr.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/broadcom/qpu/qpu_instr.c b/src/broadcom/qpu/qpu_instr.c index 8de99c611d5..7ec3c867260 100644 --- a/src/broadcom/qpu/qpu_instr.c +++ b/src/broadcom/qpu/qpu_instr.c @@ -854,6 +854,9 @@ bool v3d_qpu_writes_r3(const struct v3d_device_info *devinfo, const struct v3d_qpu_instr *inst) { + if(!devinfo->has_accumulators) + return false; + if (qpu_writes_magic_waddr_explicitly(devinfo, inst, V3D_QPU_WADDR_R3)) return true; @@ -864,6 +867,9 @@ bool v3d_qpu_writes_r4(const struct v3d_device_info *devinfo, const struct v3d_qpu_instr *inst) { + if (!devinfo->has_accumulators) + return false; + if (inst->type == V3D_QPU_INSTR_TYPE_ALU) { if (inst->alu.add.op != V3D_QPU_A_NOP && inst->alu.add.magic_write && @@ -894,6 +900,9 @@ bool v3d_qpu_writes_r5(const struct v3d_device_info *devinfo, const struct v3d_qpu_instr *inst) { + if (!devinfo->has_accumulators) + return false; + if (qpu_writes_magic_waddr_explicitly(devinfo, inst, V3D_QPU_WADDR_R5)) return true; @@ -904,6 +913,9 @@ bool v3d_qpu_writes_accum(const struct v3d_device_info *devinfo, const struct v3d_qpu_instr *inst) { + if (!devinfo->has_accumulators) + return false; + if (v3d_qpu_writes_r5(devinfo, inst)) return true; if (v3d_qpu_writes_r4(devinfo, inst)) -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0025-broadcom-compiler-add-support-for-varyings-on-nir-to.patch ================================================ From 6a9611c5a22218388bba419174d3343e0cdf773b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Tue, 14 Sep 2021 10:42:55 +0200 Subject: [PATCH 025/142] broadcom/compiler: add support for varyings on nir to vir generation for v71 Needs update as v71 doesn't have accumulators anymore, and ldvary uses now rf0 to return the value. --- src/broadcom/compiler/nir_to_vir.c | 34 +++++++++++++++++------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index ca072971f01..79a22c3bd08 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -1005,32 +1005,36 @@ emit_fragcoord_input(struct v3d_compile *c, int attr) static struct qreg emit_smooth_varying(struct v3d_compile *c, - struct qreg vary, struct qreg w, struct qreg r5) + struct qreg vary, struct qreg w, struct qreg c_reg) { - return vir_FADD(c, vir_FMUL(c, vary, w), r5); + return vir_FADD(c, vir_FMUL(c, vary, w), c_reg); } static struct qreg emit_noperspective_varying(struct v3d_compile *c, - struct qreg vary, struct qreg r5) + struct qreg vary, struct qreg c_reg) { - return vir_FADD(c, vir_MOV(c, vary), r5); + return vir_FADD(c, vir_MOV(c, vary), c_reg); } static struct qreg emit_flat_varying(struct v3d_compile *c, - struct qreg vary, struct qreg r5) + struct qreg vary, struct qreg c_reg) { vir_MOV_dest(c, c->undef, vary); - return vir_MOV(c, r5); + return vir_MOV(c, c_reg); } static struct qreg emit_fragment_varying(struct v3d_compile *c, nir_variable *var, int8_t input_idx, uint8_t swizzle, int array_index) { - struct qreg r3 = vir_reg(QFILE_MAGIC, V3D_QPU_WADDR_R3); - struct qreg r5 = vir_reg(QFILE_MAGIC, V3D_QPU_WADDR_R5); + struct qreg c_reg; /* C coefficient */ + + if (c->devinfo->has_accumulators) + c_reg = vir_reg(QFILE_MAGIC, V3D_QPU_WADDR_R5); + else + c_reg = vir_reg(QFILE_REG, 0); struct qinst *ldvary = NULL; struct qreg vary; @@ -1041,7 +1045,7 @@ emit_fragment_varying(struct v3d_compile *c, nir_variable *var, vary = vir_emit_def(c, ldvary); } else { vir_NOP(c)->qpu.sig.ldvary = true; - vary = r3; + vary = vir_reg(QFILE_MAGIC, V3D_QPU_WADDR_R3); } /* Store the input value before interpolation so we can implement @@ -1050,7 +1054,7 @@ emit_fragment_varying(struct v3d_compile *c, nir_variable *var, if (input_idx >= 0) { assert(var); c->interp[input_idx].vp = vary; - c->interp[input_idx].C = vir_MOV(c, r5); + c->interp[input_idx].C = vir_MOV(c, c_reg); c->interp[input_idx].mode = var->data.interpolation; } @@ -1060,7 +1064,7 @@ emit_fragment_varying(struct v3d_compile *c, nir_variable *var, */ if (!var) { assert(input_idx < 0); - return emit_smooth_varying(c, vary, c->payload_w, r5); + return emit_smooth_varying(c, vary, c->payload_w, c_reg); } int i = c->num_inputs++; @@ -1075,20 +1079,20 @@ emit_fragment_varying(struct v3d_compile *c, nir_variable *var, if (var->data.centroid) { BITSET_SET(c->centroid_flags, i); result = emit_smooth_varying(c, vary, - c->payload_w_centroid, r5); + c->payload_w_centroid, c_reg); } else { - result = emit_smooth_varying(c, vary, c->payload_w, r5); + result = emit_smooth_varying(c, vary, c->payload_w, c_reg); } break; case INTERP_MODE_NOPERSPECTIVE: BITSET_SET(c->noperspective_flags, i); - result = emit_noperspective_varying(c, vary, r5); + result = emit_noperspective_varying(c, vary, c_reg); break; case INTERP_MODE_FLAT: BITSET_SET(c->flat_shade_flags, i); - result = emit_flat_varying(c, vary, r5); + result = emit_flat_varying(c, vary, c_reg); break; default: -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0026-broadcom-compiler-payload_w-is-loaded-on-rf3-for-v71.patch ================================================ From 06af15a60f7a9c135893e5f8934b8030c1da95f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Wed, 15 Sep 2021 01:14:15 +0200 Subject: [PATCH 026/142] broadcom/compiler: payload_w is loaded on rf3 for v71 And in general rf0 is now used for other needs. --- src/broadcom/compiler/nir_to_vir.c | 6 +++++- src/broadcom/compiler/vir_register_allocate.c | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index 79a22c3bd08..1a05b279a2d 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -4325,7 +4325,11 @@ nir_to_vir(struct v3d_compile *c) { switch (c->s->info.stage) { case MESA_SHADER_FRAGMENT: - c->payload_w = vir_MOV(c, vir_reg(QFILE_REG, 0)); + if (c->devinfo->ver < 71) + c->payload_w = vir_MOV(c, vir_reg(QFILE_REG, 0)); + else + c->payload_w = vir_MOV(c, vir_reg(QFILE_REG, 3)); + c->payload_w_centroid = vir_MOV(c, vir_reg(QFILE_REG, 1)); c->payload_z = vir_MOV(c, vir_reg(QFILE_REG, 2)); diff --git a/src/broadcom/compiler/vir_register_allocate.c b/src/broadcom/compiler/vir_register_allocate.c index 1f495180784..eca9a6751a6 100644 --- a/src/broadcom/compiler/vir_register_allocate.c +++ b/src/broadcom/compiler/vir_register_allocate.c @@ -1034,6 +1034,11 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, if (inst->src[0].file == QFILE_REG) { switch (inst->src[0].index) { case 0: + /* V3D 7.x doesn't use rf0 for thread payload */ + if (c->devinfo->ver >= 71) + break; + else + FALLTHROUGH; case 1: case 2: case 3: { @@ -1163,7 +1168,6 @@ v3d_register_allocate(struct v3d_compile *c) vir_for_each_inst_inorder(inst, c) { inst->ip = ip++; update_graph_and_reg_classes_for_inst(c, acc_nodes, inst); - } /* Set the register classes for all our temporaries in the graph */ -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0027-broadcom-qpu_schedule-update-write-deps-for-v71.patch ================================================ From d38d8056903b9a4f96ab56261ac3b3c3be0af4fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Wed, 15 Sep 2021 11:12:59 +0200 Subject: [PATCH 027/142] broadcom/qpu_schedule: update write deps for v71 We just need to add a write dep if rf0 is written implicitly. Note that we don't need to check if we have accumulators when checking for r3/r4/r5, as v3d_qpu_writes_rX would return false for hw version that doesn't have accumulators. --- src/broadcom/compiler/qpu_schedule.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index 89254643c90..2fa9031d7b6 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -422,6 +422,8 @@ calculate_deps(struct schedule_state *state, struct schedule_node *n) add_write_dep(state, &state->last_r[4], n); if (v3d_qpu_writes_r5(devinfo, inst)) add_write_dep(state, &state->last_r[5], n); + if (v3d_qpu_writes_rf0_implicitly(devinfo, inst)) + add_write_dep(state, &state->last_rf[0], n); /* If we add any more dependencies here we should consider whether we * also need to update qpu_inst_after_thrsw_valid_in_delay_slot. -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0028-broadcom-compiler-update-register-classes-to-not-inc.patch ================================================ From 7e2a2be830b1672ab846389a46b5d09bad0f7a98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 16 Sep 2021 00:49:25 +0200 Subject: [PATCH 028/142] broadcom/compiler: update register classes to not include accumulators on v71 --- src/broadcom/compiler/vir_register_allocate.c | 56 ++++++++++++------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/src/broadcom/compiler/vir_register_allocate.c b/src/broadcom/compiler/vir_register_allocate.c index eca9a6751a6..7b3f6c41934 100644 --- a/src/broadcom/compiler/vir_register_allocate.c +++ b/src/broadcom/compiler/vir_register_allocate.c @@ -44,10 +44,15 @@ get_phys_index(const struct v3d_device_info *devinfo) #define CLASS_BITS_PHYS (1 << 0) #define CLASS_BITS_ACC (1 << 1) #define CLASS_BITS_R5 (1 << 4) -#define CLASS_BITS_ANY (CLASS_BITS_PHYS | \ - CLASS_BITS_ACC | \ - CLASS_BITS_R5) +static uint8_t +get_class_bit_any(const struct v3d_device_info *devinfo) +{ + if (devinfo->has_accumulators) + return (CLASS_BITS_PHYS | CLASS_BITS_ACC | CLASS_BITS_R5); + else + return CLASS_BITS_PHYS; +} static inline uint32_t temp_to_node(struct v3d_compile *c, uint32_t temp) { @@ -82,11 +87,13 @@ choose_reg_class(struct v3d_compile *c, uint8_t class_bits) if (class_bits == CLASS_BITS_PHYS) { return c->compiler->reg_class_phys[c->thread_index]; } else if (class_bits == (CLASS_BITS_R5)) { + assert(c->devinfo->has_accumulators); return c->compiler->reg_class_r5[c->thread_index]; } else if (class_bits == (CLASS_BITS_PHYS | CLASS_BITS_ACC)) { + assert(c->devinfo->has_accumulators); return c->compiler->reg_class_phys_or_acc[c->thread_index]; } else { - assert(class_bits == CLASS_BITS_ANY); + assert(class_bits == get_class_bit_any(c->devinfo)); return c->compiler->reg_class_any[c->thread_index]; } } @@ -447,7 +454,7 @@ v3d_emit_spill_tmua(struct v3d_compile *c, */ assert(c->disable_ldunif_opt); struct qreg offset = vir_uniform_ui(c, spill_offset); - add_node(c, offset.index, CLASS_BITS_ANY); + add_node(c, offset.index, get_class_bit_any(c->devinfo)); /* We always enable per-quad on spills/fills to ensure we spill * any channels involved with helper invocations. @@ -645,7 +652,8 @@ v3d_spill_reg(struct v3d_compile *c, int *acc_nodes, int spill_temp) * instruction immediately after, so * we can use any register class for it. */ - add_node(c, unif.index, CLASS_BITS_ANY); + add_node(c, unif.index, + get_class_bit_any(c->devinfo)); } else if (spill_type == SPILL_TYPE_RECONSTRUCT) { struct qreg temp = reconstruct_temp(c, reconstruct_op); @@ -924,31 +932,38 @@ vir_init_reg_sets(struct v3d_compiler *compiler) for (int threads = 0; threads < max_thread_index; threads++) { compiler->reg_class_any[threads] = ra_alloc_contig_reg_class(compiler->regs, 1); - compiler->reg_class_r5[threads] = - ra_alloc_contig_reg_class(compiler->regs, 1); - compiler->reg_class_phys_or_acc[threads] = - ra_alloc_contig_reg_class(compiler->regs, 1); + if (compiler->devinfo->has_accumulators) { + compiler->reg_class_r5[threads] = + ra_alloc_contig_reg_class(compiler->regs, 1); + compiler->reg_class_phys_or_acc[threads] = + ra_alloc_contig_reg_class(compiler->regs, 1); + } compiler->reg_class_phys[threads] = ra_alloc_contig_reg_class(compiler->regs, 1); for (int i = phys_index; i < phys_index + (PHYS_COUNT >> threads); i++) { - ra_class_add_reg(compiler->reg_class_phys_or_acc[threads], i); + if (compiler->devinfo->has_accumulators) + ra_class_add_reg(compiler->reg_class_phys_or_acc[threads], i); ra_class_add_reg(compiler->reg_class_phys[threads], i); ra_class_add_reg(compiler->reg_class_any[threads], i); } - for (int i = ACC_INDEX + 0; i < ACC_INDEX + ACC_COUNT - 1; i++) { - ra_class_add_reg(compiler->reg_class_phys_or_acc[threads], i); - ra_class_add_reg(compiler->reg_class_any[threads], i); + if (compiler->devinfo->has_accumulators) { + for (int i = ACC_INDEX + 0; i < ACC_INDEX + ACC_COUNT - 1; i++) { + ra_class_add_reg(compiler->reg_class_phys_or_acc[threads], i); + ra_class_add_reg(compiler->reg_class_any[threads], i); + } } /* r5 can only store a single 32-bit value, so not much can * use it. */ - ra_class_add_reg(compiler->reg_class_r5[threads], - ACC_INDEX + 5); - ra_class_add_reg(compiler->reg_class_any[threads], - ACC_INDEX + 5); + if (compiler->devinfo->has_accumulators) { + ra_class_add_reg(compiler->reg_class_r5[threads], + ACC_INDEX + 5); + ra_class_add_reg(compiler->reg_class_any[threads], + ACC_INDEX + 5); + } } ra_set_finalize(compiler->regs, NULL); @@ -1086,7 +1101,7 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, } /* All accumulators are invalidated across a thread switch. */ - if (inst->qpu.sig.thrsw) { + if (inst->qpu.sig.thrsw && c->devinfo->has_accumulators) { for (int i = 0; i < c->num_temps; i++) { if (c->temp_start[i] < ip && c->temp_end[i] > ip) { set_temp_class_bits(c, i, @@ -1157,7 +1172,8 @@ v3d_register_allocate(struct v3d_compile *c) uint32_t t = node_to_temp(c, i); c->nodes.info[i].priority = c->temp_end[t] - c->temp_start[t]; - c->nodes.info[i].class_bits = CLASS_BITS_ANY; + c->nodes.info[i].class_bits = + get_class_bit_any(c->devinfo); } } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0029-broadcom-compiler-implement-reads-writes-too-soon-ch.patch ================================================ From 0157228c729b8812dc4900fa24db63b7d27aa342 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Thu, 23 Sep 2021 11:19:58 +0200 Subject: [PATCH 029/142] broadcom/compiler: implement "reads/writes too soon" checks for v71 --- src/broadcom/compiler/qpu_schedule.c | 65 ++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 14 deletions(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index 2fa9031d7b6..4db0c2e72da 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -562,7 +562,24 @@ mux_reads_too_soon(struct choose_scoreboard *scoreboard, } static bool -reads_too_soon_after_write(struct choose_scoreboard *scoreboard, +reads_too_soon(struct choose_scoreboard *scoreboard, + const struct v3d_qpu_instr *inst, uint8_t raddr) +{ + switch (raddr) { + case 0: /* ldvary delayed write of C coefficient to rf0 */ + if (scoreboard->tick - scoreboard->last_ldvary_tick <= 1) + return true; + break; + default: + break; + } + + return false; +} + +static bool +reads_too_soon_after_write(const struct v3d_device_info *devinfo, + struct choose_scoreboard *scoreboard, struct qinst *qinst) { const struct v3d_qpu_instr *inst = &qinst->qpu; @@ -574,24 +591,44 @@ reads_too_soon_after_write(struct choose_scoreboard *scoreboard, assert(inst->type == V3D_QPU_INSTR_TYPE_ALU); if (inst->alu.add.op != V3D_QPU_A_NOP) { - if (v3d_qpu_add_op_num_src(inst->alu.add.op) > 0 && - mux_reads_too_soon(scoreboard, inst, inst->alu.add.a.mux)) { - return true; + if (v3d_qpu_add_op_num_src(inst->alu.add.op) > 0) { + if (devinfo->ver < 71) { + if (mux_reads_too_soon(scoreboard, inst, inst->alu.add.a.mux)) + return true; + } else { + if (reads_too_soon(scoreboard, inst, inst->alu.add.a.raddr)) + return true; + } } - if (v3d_qpu_add_op_num_src(inst->alu.add.op) > 1 && - mux_reads_too_soon(scoreboard, inst, inst->alu.add.b.mux)) { - return true; + if (v3d_qpu_add_op_num_src(inst->alu.add.op) > 1) { + if (devinfo->ver < 71) { + if (mux_reads_too_soon(scoreboard, inst, inst->alu.add.b.mux)) + return true; + } else { + if (reads_too_soon(scoreboard, inst, inst->alu.add.b.raddr)) + return true; + } } } if (inst->alu.mul.op != V3D_QPU_M_NOP) { - if (v3d_qpu_mul_op_num_src(inst->alu.mul.op) > 0 && - mux_reads_too_soon(scoreboard, inst, inst->alu.mul.a.mux)) { - return true; + if (v3d_qpu_mul_op_num_src(inst->alu.mul.op) > 0) { + if (devinfo->ver < 71) { + if (mux_reads_too_soon(scoreboard, inst, inst->alu.mul.a.mux)) + return true; + } else { + if (reads_too_soon(scoreboard, inst, inst->alu.mul.b.raddr)) + return true; + } } - if (v3d_qpu_mul_op_num_src(inst->alu.mul.op) > 1 && - mux_reads_too_soon(scoreboard, inst, inst->alu.mul.b.mux)) { - return true; + if (v3d_qpu_mul_op_num_src(inst->alu.mul.op) > 1) { + if (devinfo->ver < 71) { + if (mux_reads_too_soon(scoreboard, inst, inst->alu.mul.b.mux)) + return true; + } else { + if (reads_too_soon(scoreboard, inst, inst->alu.mul.b.raddr)) + return true; + } } } @@ -1147,7 +1184,7 @@ retry: * regfile A or B that was written to by the previous * instruction." */ - if (reads_too_soon_after_write(scoreboard, n->inst)) + if (reads_too_soon_after_write(c->devinfo, scoreboard, n->inst)) continue; if (writes_too_soon_after_write(c->devinfo, scoreboard, n->inst)) -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0030-broadcom-compiler-implement-read-stall-check-for-v71.patch ================================================ From 3fb3333bdf9699157cf0a2bd46ba4c25058bc5c1 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Thu, 23 Sep 2021 11:44:59 +0200 Subject: [PATCH 030/142] broadcom/compiler: implement read stall check for v71 --- src/broadcom/compiler/qpu_schedule.c | 32 +++++++++++++++++----------- src/broadcom/qpu/qpu_instr.c | 12 +++++++++++ src/broadcom/qpu/qpu_instr.h | 2 ++ 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index 4db0c2e72da..b78abe003e9 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -679,29 +679,37 @@ pixel_scoreboard_too_soon(struct v3d_compile *c, } static bool -qpu_instruction_uses_rf(const struct v3d_qpu_instr *inst, +qpu_instruction_uses_rf(const struct v3d_device_info *devinfo, + const struct v3d_qpu_instr *inst, uint32_t waddr) { if (inst->type != V3D_QPU_INSTR_TYPE_ALU) return false; - if (v3d_qpu_uses_mux(inst, V3D_QPU_MUX_A) && - inst->raddr_a == waddr) - return true; + if (devinfo->ver < 71) { + if (v3d_qpu_uses_mux(inst, V3D_QPU_MUX_A) && + inst->raddr_a == waddr) + return true; - if (v3d_qpu_uses_mux(inst, V3D_QPU_MUX_B) && - !inst->sig.small_imm_b && (inst->raddr_b == waddr)) - return true; + if (v3d_qpu_uses_mux(inst, V3D_QPU_MUX_B) && + !inst->sig.small_imm_b && (inst->raddr_b == waddr)) + return true; + } else { + /* FIXME: skip if small immediate */ + if (v3d71_qpu_reads_raddr(inst, waddr)) + return true; + } return false; } static bool -mux_read_stalls(struct choose_scoreboard *scoreboard, - const struct v3d_qpu_instr *inst) +read_stalls(const struct v3d_device_info *devinfo, + struct choose_scoreboard *scoreboard, + const struct v3d_qpu_instr *inst) { return scoreboard->tick == scoreboard->last_stallable_sfu_tick + 1 && - qpu_instruction_uses_rf(inst, + qpu_instruction_uses_rf(devinfo, inst, scoreboard->last_stallable_sfu_reg); } @@ -1319,7 +1327,7 @@ retry: int prio = get_instruction_priority(c->devinfo, inst); - if (mux_read_stalls(scoreboard, inst)) { + if (read_stalls(c->devinfo, scoreboard, inst)) { /* Don't merge an instruction that stalls */ if (prev_inst) continue; @@ -2389,7 +2397,7 @@ schedule_instructions(struct v3d_compile *c, } } } - if (mux_read_stalls(scoreboard, inst)) + if (read_stalls(c->devinfo, scoreboard, inst)) c->qpu_inst_stalled_count++; } diff --git a/src/broadcom/qpu/qpu_instr.c b/src/broadcom/qpu/qpu_instr.c index 7ec3c867260..e8bbb2141b0 100644 --- a/src/broadcom/qpu/qpu_instr.c +++ b/src/broadcom/qpu/qpu_instr.c @@ -956,6 +956,18 @@ v3d_qpu_uses_mux(const struct v3d_qpu_instr *inst, enum v3d_qpu_mux mux) (mul_nsrc > 1 && inst->alu.mul.b.mux == mux)); } +bool +v3d71_qpu_reads_raddr(const struct v3d_qpu_instr *inst, uint8_t raddr) +{ + int add_nsrc = v3d_qpu_add_op_num_src(inst->alu.add.op); + int mul_nsrc = v3d_qpu_mul_op_num_src(inst->alu.mul.op); + + return (add_nsrc > 0 && inst->alu.add.a.raddr == raddr) || + (add_nsrc > 1 && inst->alu.add.b.raddr == raddr) || + (mul_nsrc > 0 && inst->alu.mul.a.raddr == raddr) || + (mul_nsrc > 1 && inst->alu.mul.b.raddr == raddr); +} + bool v3d_qpu_sig_writes_address(const struct v3d_device_info *devinfo, const struct v3d_qpu_sig *sig) diff --git a/src/broadcom/qpu/qpu_instr.h b/src/broadcom/qpu/qpu_instr.h index a25be8e0ee6..9f7582ab06d 100644 --- a/src/broadcom/qpu/qpu_instr.h +++ b/src/broadcom/qpu/qpu_instr.h @@ -494,4 +494,6 @@ bool v3d_qpu_unpacks_f32(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST; bool v3d_qpu_unpacks_f16(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST; bool v3d_qpu_is_nop(struct v3d_qpu_instr *inst) ATTRIBUTE_CONST; + +bool v3d71_qpu_reads_raddr(const struct v3d_qpu_instr *inst, uint8_t raddr); #endif -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0031-broadcom-compiler-add-a-v3d71_qpu_writes_waddr_expli.patch ================================================ From cbe0a7a06a5fb9b3f28acba8c9cac362a6bc5324 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 6 Oct 2021 13:58:00 +0200 Subject: [PATCH 031/142] broadcom/compiler: add a v3d71_qpu_writes_waddr_explicitly helper --- src/broadcom/qpu/qpu_instr.c | 28 ++++++++++++++++++++++++++++ src/broadcom/qpu/qpu_instr.h | 3 +++ 2 files changed, 31 insertions(+) diff --git a/src/broadcom/qpu/qpu_instr.c b/src/broadcom/qpu/qpu_instr.c index e8bbb2141b0..feb6b343c1c 100644 --- a/src/broadcom/qpu/qpu_instr.c +++ b/src/broadcom/qpu/qpu_instr.c @@ -968,6 +968,34 @@ v3d71_qpu_reads_raddr(const struct v3d_qpu_instr *inst, uint8_t raddr) (mul_nsrc > 1 && inst->alu.mul.b.raddr == raddr); } +bool +v3d71_qpu_writes_waddr_explicitly(const struct v3d_device_info *devinfo, + const struct v3d_qpu_instr *inst, + uint8_t waddr) +{ + if (inst->type != V3D_QPU_INSTR_TYPE_ALU) + return false; + + if (v3d_qpu_add_op_has_dst(inst->alu.add.op) && + !inst->alu.add.magic_write && + inst->alu.add.waddr == waddr) { + return true; + } + + if (v3d_qpu_mul_op_has_dst(inst->alu.mul.op) && + !inst->alu.mul.magic_write && + inst->alu.mul.waddr == waddr) { + return true; + } + + if (v3d_qpu_sig_writes_address(devinfo, &inst->sig) && + !inst->sig_magic && inst->sig_addr == waddr) { + return true; + } + + return false; +} + bool v3d_qpu_sig_writes_address(const struct v3d_device_info *devinfo, const struct v3d_qpu_sig *sig) diff --git a/src/broadcom/qpu/qpu_instr.h b/src/broadcom/qpu/qpu_instr.h index 9f7582ab06d..50a69ce8c3a 100644 --- a/src/broadcom/qpu/qpu_instr.h +++ b/src/broadcom/qpu/qpu_instr.h @@ -496,4 +496,7 @@ bool v3d_qpu_unpacks_f16(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST; bool v3d_qpu_is_nop(struct v3d_qpu_instr *inst) ATTRIBUTE_CONST; bool v3d71_qpu_reads_raddr(const struct v3d_qpu_instr *inst, uint8_t raddr); +bool v3d71_qpu_writes_waddr_explicitly(const struct v3d_device_info *devinfo, + const struct v3d_qpu_instr *inst, + uint8_t waddr); #endif -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0032-broadcom-compiler-prevent-rf2-3-usage-in-thread-end-.patch ================================================ From 92e91a9b22ae61dc9f39880e8fdaa7714789efdb Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Mon, 27 Sep 2021 11:49:24 +0200 Subject: [PATCH 032/142] broadcom/compiler: prevent rf2-3 usage in thread end delay slots for v71 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Iago Toral Quiroga <itoral@igalia.com> Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com> --- src/broadcom/compiler/qpu_schedule.c | 37 +++++++++++++++++++++------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index b78abe003e9..839c0c62315 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -1691,16 +1691,35 @@ qpu_inst_valid_in_thrend_slot(struct v3d_compile *c, if (c->devinfo->ver < 40 && inst->alu.add.op == V3D_QPU_A_SETMSF) return false; - /* RF0-2 might be overwritten during the delay slots by - * fragment shader setup. - */ - if (inst->raddr_a < 3 && v3d_qpu_uses_mux(inst, V3D_QPU_MUX_A)) - return false; + if (c->devinfo->ver <= 42) { + /* RF0-2 might be overwritten during the delay slots by + * fragment shader setup. + */ + if (inst->raddr_a < 3 && v3d_qpu_uses_mux(inst, V3D_QPU_MUX_A)) + return false; - if (inst->raddr_b < 3 && - !inst->sig.small_imm_b && - v3d_qpu_uses_mux(inst, V3D_QPU_MUX_B)) { - return false; + if (inst->raddr_b < 3 && + !inst->sig.small_imm_b && + v3d_qpu_uses_mux(inst, V3D_QPU_MUX_B)) { + return false; + } + } + + if (c->devinfo->ver >= 71) { + /* RF2-3 might be overwritten during the delay slots by + * fragment shader setup. + * + * FIXME: handle small immediate cases + */ + if (v3d71_qpu_reads_raddr(inst, 2) || + v3d71_qpu_reads_raddr(inst, 3)) { + return false; + } + + if (v3d71_qpu_writes_waddr_explicitly(c->devinfo, inst, 2) || + v3d71_qpu_writes_waddr_explicitly(c->devinfo, inst, 3)) { + return false; + } } } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0033-broadcom-qpu-add-new-ADD-opcodes-for-FMOV-MOV-in-v71.patch ================================================ From 68a1545eb973e41608534ff05a9e84a86c046453 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Mon, 27 Sep 2021 13:26:04 +0200 Subject: [PATCH 033/142] broadcom/qpu: add new ADD opcodes for FMOV/MOV in v71 --- src/broadcom/qpu/qpu_instr.c | 5 +++++ src/broadcom/qpu/qpu_instr.h | 4 ++++ src/broadcom/qpu/qpu_pack.c | 15 +++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/src/broadcom/qpu/qpu_instr.c b/src/broadcom/qpu/qpu_instr.c index feb6b343c1c..195a0dcd232 100644 --- a/src/broadcom/qpu/qpu_instr.c +++ b/src/broadcom/qpu/qpu_instr.c @@ -177,6 +177,8 @@ v3d_qpu_add_op_name(enum v3d_qpu_add_op op) [V3D_QPU_A_ITOF] = "itof", [V3D_QPU_A_CLZ] = "clz", [V3D_QPU_A_UTOF] = "utof", + [V3D_QPU_A_MOV] = "mov", + [V3D_QPU_A_FMOV] = "fmov", }; if (op >= ARRAY_SIZE(op_names)) @@ -458,6 +460,9 @@ static const uint8_t add_op_args[] = { [V3D_QPU_A_ITOF] = D | A, [V3D_QPU_A_CLZ] = D | A, [V3D_QPU_A_UTOF] = D | A, + + [V3D_QPU_A_MOV] = D | A, + [V3D_QPU_A_FMOV] = D | A, }; static const uint8_t mul_op_args[] = { diff --git a/src/broadcom/qpu/qpu_instr.h b/src/broadcom/qpu/qpu_instr.h index 50a69ce8c3a..c86a4119c54 100644 --- a/src/broadcom/qpu/qpu_instr.h +++ b/src/broadcom/qpu/qpu_instr.h @@ -227,6 +227,10 @@ enum v3d_qpu_add_op { V3D_QPU_A_ITOF, V3D_QPU_A_CLZ, V3D_QPU_A_UTOF, + + /* V3D 7.x */ + V3D_QPU_A_FMOV, + V3D_QPU_A_MOV, }; enum v3d_qpu_mul_op { diff --git a/src/broadcom/qpu/qpu_pack.c b/src/broadcom/qpu/qpu_pack.c index 4045275cb9a..0e504e65fbf 100644 --- a/src/broadcom/qpu/qpu_pack.c +++ b/src/broadcom/qpu/qpu_pack.c @@ -776,6 +776,21 @@ static const struct opcode_desc add_ops_v71[] = { { 246, 246, .raddr_mask = OP_RANGE(32, 34), V3D_QPU_A_ITOF, 71 }, { 246, 246, .raddr_mask = OP_RANGE(36, 38), V3D_QPU_A_UTOF, 71 }, + + { 249, 249, .raddr_mask = OP_RANGE(0, 2), V3D_QPU_A_FMOV, 71 }, + { 249, 249, .raddr_mask = OP_RANGE(4, 6), V3D_QPU_A_FMOV, 71 }, + { 249, 249, .raddr_mask = OP_RANGE(8, 10), V3D_QPU_A_FMOV, 71 }, + { 249, 249, .raddr_mask = OP_RANGE(12, 14), V3D_QPU_A_FMOV, 71 }, + { 249, 249, .raddr_mask = OP_RANGE(16, 18), V3D_QPU_A_FMOV, 71 }, + { 249, 249, .raddr_mask = OP_RANGE(20, 22), V3D_QPU_A_FMOV, 71 }, + { 249, 249, .raddr_mask = OP_RANGE(24, 26), V3D_QPU_A_FMOV, 71 }, + + { 249, 249, .raddr_mask = OP_MASK(3), V3D_QPU_A_MOV, 71 }, + { 249, 249, .raddr_mask = OP_MASK(7), V3D_QPU_A_MOV, 71 }, + { 249, 249, .raddr_mask = OP_MASK(11), V3D_QPU_A_MOV, 71 }, + { 249, 249, .raddr_mask = OP_MASK(15), V3D_QPU_A_MOV, 71 }, + { 249, 249, .raddr_mask = OP_MASK(19), V3D_QPU_A_MOV, 71 }, + }; static const struct opcode_desc mul_ops_v71[] = { -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0034-broadcom-qpu-fix-packing-unpacking-of-fmov-variants-.patch ================================================ From 8dbbb7e22b694fdc62376d112b3dc6105d556c63 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Mon, 4 Oct 2021 13:07:35 +0200 Subject: [PATCH 034/142] broadcom/qpu: fix packing/unpacking of fmov variants for v71 --- src/broadcom/qpu/qpu_pack.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/broadcom/qpu/qpu_pack.c b/src/broadcom/qpu/qpu_pack.c index 0e504e65fbf..0eb820b3f10 100644 --- a/src/broadcom/qpu/qpu_pack.c +++ b/src/broadcom/qpu/qpu_pack.c @@ -1405,9 +1405,9 @@ v3d71_qpu_mul_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst break; case V3D_QPU_M_FMOV: - instr->alu.mul.output_pack = (raddr_d >> 2) & 1; + instr->alu.mul.output_pack = raddr_d & 0x3; - if (!v3d_qpu_float32_unpack_unpack(raddr_d & 0x3, + if (!v3d_qpu_float32_unpack_unpack((raddr_d >> 2) & 0x7, &instr->alu.mul.a.unpack)) { return false; } @@ -2046,14 +2046,13 @@ v3d71_qpu_mul_pack(const struct v3d_device_info *devinfo, &packed)) { return false; } - opcode |= (packed >> 1) & 1; - raddr_d = (packed & 1) << 2; + raddr_d |= packed; if (!v3d_qpu_float32_unpack_pack(instr->alu.mul.a.unpack, &packed)) { return false; } - raddr_d |= packed; + raddr_d |= packed << 2; break; } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0035-broadcom-qpu-implement-switch-rules-for-fmin-fmax-fa.patch ================================================ From 63d0059ebef288afb0e2e746dadda8c2238bdfcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Tue, 28 Sep 2021 01:17:08 +0200 Subject: [PATCH 035/142] broadcom/qpu: implement switch rules for fmin/fmax fadd/faddnf for v71 They use the same opcodes, and switch between one and the other based on raddr. Note that the rule rule includes also if small_imm_a/b are used. That is still not in place so that part is hardcode. Would be updated later when small immediates support for v71 gets implemented. --- src/broadcom/qpu/qpu_pack.c | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/broadcom/qpu/qpu_pack.c b/src/broadcom/qpu/qpu_pack.c index 0eb820b3f10..7a262f18ac3 100644 --- a/src/broadcom/qpu/qpu_pack.c +++ b/src/broadcom/qpu/qpu_pack.c @@ -651,7 +651,9 @@ static const struct opcode_desc mul_ops_v33[] = { * opcodes that changed on v71 */ static const struct opcode_desc add_ops_v71[] = { + /* FADD is FADDNF depending on the order of the raddr_a/raddr_b. */ { 0, 47, .raddr_mask = ANYOPMASK, V3D_QPU_A_FADD }, + { 0, 47, .raddr_mask = ANYOPMASK, V3D_QPU_A_FADDNF }, { 53, 55, .raddr_mask = ANYOPMASK, V3D_QPU_A_VFPACK }, { 56, 56, .raddr_mask = ANYOPMASK, V3D_QPU_A_ADD }, { 57, 59, .raddr_mask = ANYOPMASK, V3D_QPU_A_VFPACK }, @@ -666,6 +668,10 @@ static const struct opcode_desc add_ops_v71[] = { { 125, 125, .raddr_mask = ANYOPMASK, V3D_QPU_A_SHR }, { 126, 126, .raddr_mask = ANYOPMASK, V3D_QPU_A_ASR }, { 127, 127, .raddr_mask = ANYOPMASK, V3D_QPU_A_ROR }, + /* FMIN is instead FMAX depending on the raddr_a/b order. */ + { 128, 175, .raddr_mask = ANYOPMASK, V3D_QPU_A_FMIN }, + { 128, 175, .raddr_mask = ANYOPMASK, V3D_QPU_A_FMAX }, + { 176, 180, .raddr_mask = ANYOPMASK, V3D_QPU_A_VFMIN }, { 181, 181, .raddr_mask = ANYOPMASK, V3D_QPU_A_AND }, { 182, 182, .raddr_mask = ANYOPMASK, V3D_QPU_A_OR }, @@ -1162,6 +1168,22 @@ v3d71_qpu_add_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst instr->alu.add.op = desc->op; + /* FADD/FADDNF and FMIN/FMAX are determined by the orders of the + * operands. + */ + /* FIXME: for now hardcoded values, until we got the small_imm support + * in place + */ + uint32_t small_imm_a = 0; + uint32_t small_imm_b = 0; + if (small_imm_a * 256 + ((op >> 2) & 3) * 64 + raddr_a > + small_imm_b *256 + (op & 3) * 64 + raddr_b) { + if (instr->alu.add.op == V3D_QPU_A_FMIN) + instr->alu.add.op = V3D_QPU_A_FMAX; + if (instr->alu.add.op == V3D_QPU_A_FADD) + instr->alu.add.op = V3D_QPU_A_FADDNF; + } + /* Some QPU ops require a bit more than just basic opcode and mux a/b * comparisons to distinguish them. */ @@ -1754,6 +1776,11 @@ v3d71_qpu_add_pack(const struct v3d_device_info *devinfo, uint32_t output_pack; uint32_t a_unpack; uint32_t b_unpack; + /* FIXME: for now hardcoded values, until we got the small_imm + * support in place + */ + uint32_t small_imm_a = 0; + uint32_t small_imm_b = 0; if (instr->alu.add.op != V3D_QPU_A_FCMP) { if (!v3d_qpu_float32_pack_pack(instr->alu.add.output_pack, @@ -1773,6 +1800,27 @@ v3d71_qpu_add_pack(const struct v3d_device_info *devinfo, return false; } + /* These operations with commutative operands are + * distinguished by which order their operands come in. + */ + bool ordering = + small_imm_a * 256 + a_unpack * 64 + raddr_a > + small_imm_b * 256 + b_unpack * 64 + raddr_b; + if (((instr->alu.add.op == V3D_QPU_A_FMIN || + instr->alu.add.op == V3D_QPU_A_FADD) && ordering) || + ((instr->alu.add.op == V3D_QPU_A_FMAX || + instr->alu.add.op == V3D_QPU_A_FADDNF) && !ordering)) { + uint32_t temp; + + temp = a_unpack; + a_unpack = b_unpack; + b_unpack = temp; + + temp = raddr_a; + raddr_a = raddr_b; + raddr_b = temp; + } + opcode |= a_unpack << 2; opcode |= b_unpack << 0; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0036-broadcom-compiler-make-vir_write_rX-return-false-on-.patch ================================================ From c9f6faa3ddc91024b3d9dc67ce2221187daac128 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 29 Sep 2021 11:54:18 +0200 Subject: [PATCH 036/142] broadcom/compiler: make vir_write_rX return false on platforms without accums --- src/broadcom/compiler/vir.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/broadcom/compiler/vir.c b/src/broadcom/compiler/vir.c index 007cb0a941b..d75cd777b6d 100644 --- a/src/broadcom/compiler/vir.c +++ b/src/broadcom/compiler/vir.c @@ -158,6 +158,9 @@ vir_is_tex(const struct v3d_device_info *devinfo, struct qinst *inst) bool vir_writes_r3(const struct v3d_device_info *devinfo, struct qinst *inst) { + if (!devinfo->has_accumulators) + return false; + for (int i = 0; i < vir_get_nsrc(inst); i++) { switch (inst->src[i].file) { case QFILE_VPM: @@ -180,6 +183,9 @@ vir_writes_r3(const struct v3d_device_info *devinfo, struct qinst *inst) bool vir_writes_r4(const struct v3d_device_info *devinfo, struct qinst *inst) { + if (!devinfo->has_accumulators) + return false; + switch (inst->dst.file) { case QFILE_MAGIC: switch (inst->dst.index) { -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0037-broadcom-compiler-rename-vir_writes_rX-to-vir_writes.patch ================================================ From 3d16229743e26b58735ed049ee982073f6034342 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 29 Sep 2021 12:03:50 +0200 Subject: [PATCH 037/142] broadcom/compiler: rename vir_writes_rX to vir_writes_rX_implicitly Since that represents more accurately what they check.. --- src/broadcom/compiler/v3d_compiler.h | 4 ++-- src/broadcom/compiler/vir.c | 6 ++++-- src/broadcom/compiler/vir_register_allocate.c | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/broadcom/compiler/v3d_compiler.h b/src/broadcom/compiler/v3d_compiler.h index eb4e692464b..7e8f3bfc1a7 100644 --- a/src/broadcom/compiler/v3d_compiler.h +++ b/src/broadcom/compiler/v3d_compiler.h @@ -1149,8 +1149,8 @@ bool vir_is_raw_mov(struct qinst *inst); bool vir_is_tex(const struct v3d_device_info *devinfo, struct qinst *inst); bool vir_is_add(struct qinst *inst); bool vir_is_mul(struct qinst *inst); -bool vir_writes_r3(const struct v3d_device_info *devinfo, struct qinst *inst); -bool vir_writes_r4(const struct v3d_device_info *devinfo, struct qinst *inst); +bool vir_writes_r3_implicitly(const struct v3d_device_info *devinfo, struct qinst *inst); +bool vir_writes_r4_implicitly(const struct v3d_device_info *devinfo, struct qinst *inst); struct qreg vir_follow_movs(struct v3d_compile *c, struct qreg reg); uint8_t vir_channels_written(struct qinst *inst); struct qreg ntq_get_src(struct v3d_compile *c, nir_src src, int i); diff --git a/src/broadcom/compiler/vir.c b/src/broadcom/compiler/vir.c index d75cd777b6d..aea113f050e 100644 --- a/src/broadcom/compiler/vir.c +++ b/src/broadcom/compiler/vir.c @@ -156,7 +156,8 @@ vir_is_tex(const struct v3d_device_info *devinfo, struct qinst *inst) } bool -vir_writes_r3(const struct v3d_device_info *devinfo, struct qinst *inst) +vir_writes_r3_implicitly(const struct v3d_device_info *devinfo, + struct qinst *inst) { if (!devinfo->has_accumulators) return false; @@ -181,7 +182,8 @@ vir_writes_r3(const struct v3d_device_info *devinfo, struct qinst *inst) } bool -vir_writes_r4(const struct v3d_device_info *devinfo, struct qinst *inst) +vir_writes_r4_implicitly(const struct v3d_device_info *devinfo, + struct qinst *inst) { if (!devinfo->has_accumulators) return false; diff --git a/src/broadcom/compiler/vir_register_allocate.c b/src/broadcom/compiler/vir_register_allocate.c index 7b3f6c41934..f2df35cd458 100644 --- a/src/broadcom/compiler/vir_register_allocate.c +++ b/src/broadcom/compiler/vir_register_allocate.c @@ -988,7 +988,7 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, * result to a temp), nothing else can be stored in r3/r4 across * it. */ - if (vir_writes_r3(c->devinfo, inst)) { + if (vir_writes_r3_implicitly(c->devinfo, inst)) { for (int i = 0; i < c->num_temps; i++) { if (c->temp_start[i] < ip && c->temp_end[i] > ip) { ra_add_node_interference(c->g, @@ -998,7 +998,7 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, } } - if (vir_writes_r4(c->devinfo, inst)) { + if (vir_writes_r4_implicitly(c->devinfo, inst)) { for (int i = 0; i < c->num_temps; i++) { if (c->temp_start[i] < ip && c->temp_end[i] > ip) { ra_add_node_interference(c->g, -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0038-broadcom-compiler-only-handle-accumulator-classes-if.patch ================================================ From 83fae160491737e8568b8fb5eaa5be4d2c8bf3c8 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 29 Sep 2021 12:10:31 +0200 Subject: [PATCH 038/142] broadcom/compiler: only handle accumulator classes if present --- src/broadcom/compiler/vir_register_allocate.c | 77 ++++++++++++------- 1 file changed, 49 insertions(+), 28 deletions(-) diff --git a/src/broadcom/compiler/vir_register_allocate.c b/src/broadcom/compiler/vir_register_allocate.c index f2df35cd458..e78ccb7c6aa 100644 --- a/src/broadcom/compiler/vir_register_allocate.c +++ b/src/broadcom/compiler/vir_register_allocate.c @@ -53,6 +53,17 @@ get_class_bit_any(const struct v3d_device_info *devinfo) else return CLASS_BITS_PHYS; } + +static uint8_t +filter_class_bits(const struct v3d_device_info *devinfo, uint8_t class_bits) +{ + if (!devinfo->has_accumulators) { + assert(class_bits & CLASS_BITS_PHYS); + class_bits = CLASS_BITS_PHYS; + } + return class_bits; +} + static inline uint32_t temp_to_node(struct v3d_compile *c, uint32_t temp) { @@ -413,8 +424,10 @@ v3d_setup_spill_base(struct v3d_compile *c) */ if (c->spilling) { int temp_class = CLASS_BITS_PHYS; - if (i != c->spill_base.index) + if (c->devinfo->has_accumulators && + i != c->spill_base.index) { temp_class |= CLASS_BITS_ACC; + } add_node(c, i, temp_class); } } @@ -473,14 +486,16 @@ v3d_emit_spill_tmua(struct v3d_compile *c, * temp will be used immediately so just like the uniform above we * can allow accumulators. */ + int temp_class = + filter_class_bits(c->devinfo, CLASS_BITS_PHYS | CLASS_BITS_ACC); if (!fill_dst) { struct qreg dst = vir_TMUWT(c); assert(dst.file == QFILE_TEMP); - add_node(c, dst.index, CLASS_BITS_PHYS | CLASS_BITS_ACC); + add_node(c, dst.index, temp_class); } else { *fill_dst = vir_LDTMU(c); assert(fill_dst->file == QFILE_TEMP); - add_node(c, fill_dst->index, CLASS_BITS_PHYS | CLASS_BITS_ACC); + add_node(c, fill_dst->index, temp_class); } /* Temps across the thread switch we injected can't be assigned to @@ -662,8 +677,10 @@ v3d_spill_reg(struct v3d_compile *c, int *acc_nodes, int spill_temp) * instruction immediately after so we * can use ACC. */ - add_node(c, temp.index, CLASS_BITS_PHYS | - CLASS_BITS_ACC); + int temp_class = + filter_class_bits(c->devinfo, CLASS_BITS_PHYS | + CLASS_BITS_ACC); + add_node(c, temp.index, temp_class); } else { /* If we have a postponed spill, we * don't need a fill as the temp would @@ -941,6 +958,7 @@ vir_init_reg_sets(struct v3d_compiler *compiler) compiler->reg_class_phys[threads] = ra_alloc_contig_reg_class(compiler->regs, 1); + /* Init physical regs */ for (int i = phys_index; i < phys_index + (PHYS_COUNT >> threads); i++) { if (compiler->devinfo->has_accumulators) @@ -949,16 +967,15 @@ vir_init_reg_sets(struct v3d_compiler *compiler) ra_class_add_reg(compiler->reg_class_any[threads], i); } + /* Init accumulator regs */ if (compiler->devinfo->has_accumulators) { for (int i = ACC_INDEX + 0; i < ACC_INDEX + ACC_COUNT - 1; i++) { ra_class_add_reg(compiler->reg_class_phys_or_acc[threads], i); ra_class_add_reg(compiler->reg_class_any[threads], i); } - } - /* r5 can only store a single 32-bit value, so not much can - * use it. - */ - if (compiler->devinfo->has_accumulators) { + /* r5 can only store a single 32-bit value, so not much can + * use it. + */ ra_class_add_reg(compiler->reg_class_r5[threads], ACC_INDEX + 5); ra_class_add_reg(compiler->reg_class_any[threads], @@ -1081,21 +1098,23 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, * because ldunif has usually a shorter lifespan, allowing for * more accumulator reuse and QPU merges. */ - if (!inst->qpu.sig.ldunif) { - uint8_t class_bits = - get_temp_class_bits(c, inst->dst.index) & - ~CLASS_BITS_R5; - set_temp_class_bits(c, inst->dst.index, - class_bits); - - } else { - /* Until V3D 4.x, we could only load a uniform - * to r5, so we'll need to spill if uniform - * loads interfere with each other. - */ - if (c->devinfo->ver < 40) { + if (c->devinfo->has_accumulators) { + if (!inst->qpu.sig.ldunif) { + uint8_t class_bits = + get_temp_class_bits(c, inst->dst.index) & + ~CLASS_BITS_R5; set_temp_class_bits(c, inst->dst.index, - CLASS_BITS_R5); + class_bits); + + } else { + /* Until V3D 4.x, we could only load a uniform + * to r5, so we'll need to spill if uniform + * loads interfere with each other. + */ + if (c->devinfo->ver < 40) { + set_temp_class_bits(c, inst->dst.index, + CLASS_BITS_R5); + } } } } @@ -1152,8 +1171,10 @@ v3d_register_allocate(struct v3d_compile *c) c->thread_index--; } - c->g = ra_alloc_interference_graph(c->compiler->regs, - c->num_temps + ARRAY_SIZE(acc_nodes)); + unsigned num_ra_nodes = c->num_temps; + if (c->devinfo->has_accumulators) + num_ra_nodes += ARRAY_SIZE(acc_nodes); + c->g = ra_alloc_interference_graph(c->compiler->regs, num_ra_nodes); ra_set_select_reg_callback(c->g, v3d_ra_select_callback, &callback_data); /* Make some fixed nodes for the accumulators, which we will need to @@ -1162,8 +1183,8 @@ v3d_register_allocate(struct v3d_compile *c) * live in, but the classes take up a lot of memory to set up, so we * don't want to make too many. */ - for (uint32_t i = 0; i < ACC_COUNT + c->num_temps; i++) { - if (i < ACC_COUNT) { + for (uint32_t i = 0; i < num_ra_nodes; i++) { + if (c->devinfo->has_accumulators && i < ACC_COUNT) { acc_nodes[i] = i; ra_set_node_reg(c->g, acc_nodes[i], ACC_INDEX + i); c->nodes.info[i].priority = 0; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0039-broadcom-compiler-don-t-assign-rf0-to-temps-across-i.patch ================================================ From fd77cc3204e7c69927f97ce2a1d55d2a47d77a27 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 29 Sep 2021 12:14:04 +0200 Subject: [PATCH 039/142] broadcom/compiler: don't assign rf0 to temps across implicit rf0 writes In platforms that don't have accumulators and have implicit writes to the register file we need to be careful and avoid assigning a physical register to a temp that lives across an implicit write to that same physical register. For now, we have the case of implicit writes to rf0 from various signals, but it should be easy to extend this to include additional registers if needed. --- src/broadcom/compiler/vir_register_allocate.c | 69 +++++++++++++++---- 1 file changed, 57 insertions(+), 12 deletions(-) diff --git a/src/broadcom/compiler/vir_register_allocate.c b/src/broadcom/compiler/vir_register_allocate.c index e78ccb7c6aa..e0adc1de7a4 100644 --- a/src/broadcom/compiler/vir_register_allocate.c +++ b/src/broadcom/compiler/vir_register_allocate.c @@ -29,6 +29,9 @@ #define ACC_INDEX 0 #define ACC_COUNT 6 +/* RA nodes used to track RF registers with implicit writes */ +#define IMPLICIT_RF_COUNT 1 + #define PHYS_COUNT 64 static uint8_t @@ -67,15 +70,17 @@ filter_class_bits(const struct v3d_device_info *devinfo, uint8_t class_bits) static inline uint32_t temp_to_node(struct v3d_compile *c, uint32_t temp) { - return temp + (c->devinfo->has_accumulators ? ACC_COUNT : 0); + return temp + (c->devinfo->has_accumulators ? ACC_COUNT : + IMPLICIT_RF_COUNT); } static inline uint32_t node_to_temp(struct v3d_compile *c, uint32_t node) { assert((c->devinfo->has_accumulators && node >= ACC_COUNT) || - (!c->devinfo->has_accumulators && node >= 0)); - return node - (c->devinfo->has_accumulators ? ACC_COUNT : 0); + (!c->devinfo->has_accumulators && node >= IMPLICIT_RF_COUNT)); + return node - (c->devinfo->has_accumulators ? ACC_COUNT : + IMPLICIT_RF_COUNT); } static inline uint8_t @@ -360,7 +365,8 @@ ensure_nodes(struct v3d_compile *c) c->nodes.info = reralloc_array_size(c, c->nodes.info, sizeof(c->nodes.info[0]), - c->nodes.alloc_count + ACC_COUNT); + c->nodes.alloc_count + + MAX2(ACC_COUNT, IMPLICIT_RF_COUNT)); } /* Creates the interference node for a new temp. We use this to keep the node @@ -372,7 +378,8 @@ add_node(struct v3d_compile *c, uint32_t temp, uint8_t class_bits) ensure_nodes(c); int node = ra_add_node(c->g, choose_reg_class(c, class_bits)); - assert(node == temp + ACC_COUNT); + assert(c->devinfo->has_accumulators ? node == temp + ACC_COUNT : + node == temp + IMPLICIT_RF_COUNT); /* We fill the node priority after we are done inserting spills */ c->nodes.info[node].class_bits = class_bits; @@ -995,7 +1002,9 @@ tmu_spilling_allowed(struct v3d_compile *c) } static void -update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, +update_graph_and_reg_classes_for_inst(struct v3d_compile *c, + int *acc_nodes, + int *implicit_rf_nodes, struct qinst *inst) { int32_t ip = inst->ip; @@ -1025,6 +1034,19 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, } } + /* If any instruction writes to a physical register implicitly + * nothing else can write the same register across it. + */ + if (v3d_qpu_writes_rf0_implicitly(c->devinfo, &inst->qpu)) { + for (int i = 0; i < c->num_temps; i++) { + if (c->temp_start[i] < ip && c->temp_end[i] > ip) { + ra_add_node_interference(c->g, + temp_to_node(c, i), + implicit_rf_nodes[0]); + } + } + } + if (inst->qpu.type == V3D_QPU_INSTR_TYPE_ALU) { switch (inst->qpu.alu.add.op) { case V3D_QPU_A_LDVPMV_IN: @@ -1116,6 +1138,16 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, CLASS_BITS_R5); } } + } else { + /* If the instruction has an implicit write + * we can't allocate its dest to the same + * register. + */ + if (v3d_qpu_writes_rf0_implicitly(c->devinfo, &inst->qpu)) { + ra_add_node_interference(c->g, + temp_to_node(c, inst->dst.index), + implicit_rf_nodes[0]); + } } } @@ -1139,10 +1171,18 @@ struct qpu_reg * v3d_register_allocate(struct v3d_compile *c) { int acc_nodes[ACC_COUNT]; + int implicit_rf_nodes[IMPLICIT_RF_COUNT]; + + unsigned num_ra_nodes = c->num_temps; + if (c->devinfo->has_accumulators) + num_ra_nodes += ARRAY_SIZE(acc_nodes); + else + num_ra_nodes += ARRAY_SIZE(implicit_rf_nodes); + c->nodes = (struct v3d_ra_node_info) { .alloc_count = c->num_temps, .info = ralloc_array_size(c, sizeof(c->nodes.info[0]), - c->num_temps + ACC_COUNT), + num_ra_nodes), }; uint32_t phys_index = get_phys_index(c->devinfo); @@ -1171,9 +1211,6 @@ v3d_register_allocate(struct v3d_compile *c) c->thread_index--; } - unsigned num_ra_nodes = c->num_temps; - if (c->devinfo->has_accumulators) - num_ra_nodes += ARRAY_SIZE(acc_nodes); c->g = ra_alloc_interference_graph(c->compiler->regs, num_ra_nodes); ra_set_select_reg_callback(c->g, v3d_ra_select_callback, &callback_data); @@ -1181,7 +1218,8 @@ v3d_register_allocate(struct v3d_compile *c) * interfere with when ops have implied r3/r4 writes or for the thread * switches. We could represent these as classes for the nodes to * live in, but the classes take up a lot of memory to set up, so we - * don't want to make too many. + * don't want to make too many. We use the same mechanism on platforms + * without accumulators that can have implicit writes to phys regs. */ for (uint32_t i = 0; i < num_ra_nodes; i++) { if (c->devinfo->has_accumulators && i < ACC_COUNT) { @@ -1189,6 +1227,12 @@ v3d_register_allocate(struct v3d_compile *c) ra_set_node_reg(c->g, acc_nodes[i], ACC_INDEX + i); c->nodes.info[i].priority = 0; c->nodes.info[i].class_bits = 0; + } else if (!c->devinfo->has_accumulators && + i < ARRAY_SIZE(implicit_rf_nodes)) { + implicit_rf_nodes[i] = i; + ra_set_node_reg(c->g, implicit_rf_nodes[i], phys_index + i); + c->nodes.info[i].priority = 0; + c->nodes.info[i].class_bits = 0; } else { uint32_t t = node_to_temp(c, i); c->nodes.info[i].priority = @@ -1204,7 +1248,8 @@ v3d_register_allocate(struct v3d_compile *c) int ip = 0; vir_for_each_inst_inorder(inst, c) { inst->ip = ip++; - update_graph_and_reg_classes_for_inst(c, acc_nodes, inst); + update_graph_and_reg_classes_for_inst(c, acc_nodes, + implicit_rf_nodes, inst); } /* Set the register classes for all our temporaries in the graph */ -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0040-broadcom-compiler-CS-payload-registers-have-changed-.patch ================================================ From 9a08ae9f354a6da6d9d71b87800aca8b3df49e29 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 28 Sep 2021 13:37:28 +0200 Subject: [PATCH 040/142] broadcom/compiler: CS payload registers have changed in v71 --- src/broadcom/compiler/nir_to_vir.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index 1a05b279a2d..220ff6bcd49 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -4362,8 +4362,13 @@ nir_to_vir(struct v3d_compile *c) V3D_QPU_WADDR_SYNC)); } - c->cs_payload[0] = vir_MOV(c, vir_reg(QFILE_REG, 0)); - c->cs_payload[1] = vir_MOV(c, vir_reg(QFILE_REG, 2)); + if (c->devinfo->ver <= 42) { + c->cs_payload[0] = vir_MOV(c, vir_reg(QFILE_REG, 0)); + c->cs_payload[1] = vir_MOV(c, vir_reg(QFILE_REG, 2)); + } else if (c->devinfo->ver >= 71) { + c->cs_payload[0] = vir_MOV(c, vir_reg(QFILE_REG, 3)); + c->cs_payload[1] = vir_MOV(c, vir_reg(QFILE_REG, 2)); + } /* Set up the division between gl_LocalInvocationIndex and * wg_in_mem in the payload reg. -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0041-broadcom-compiler-don-t-schedule-rf0-writes-right-af.patch ================================================ From 5477884196cb54a71f54fa6cad42c6d3326bde88 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Fri, 22 Oct 2021 13:39:48 +0200 Subject: [PATCH 041/142] broadcom/compiler: don't schedule rf0 writes right after ldvary ldvary writes rf0 implicitly on the next cycle so they would clash. This case is not handled correctly by our normal dependency tracking, which doesn't know anything about delayed writes from instructions and thinks the rf0 write happens on the same cycle ldvary is emitted. Fixes (v71): dEQP-VK.glsl.conversions.matrix_to_matrix.mat2x3_to_mat4x2_fragment --- src/broadcom/compiler/qpu_schedule.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index 839c0c62315..870823fd2b1 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -652,6 +652,21 @@ writes_too_soon_after_write(const struct v3d_device_info *devinfo, v3d_qpu_writes_r4(devinfo, inst)) return true; + if (devinfo->ver <= 42) + return false; + + /* Don't schedule anything that writes rf0 right after ldvary, since + * that would clash with the ldvary's delayed rf0 write (the exception + * is another ldvary, since its implicit rf0 write would also have + * one cycle of delay and would not clash). + */ + if (scoreboard->last_ldvary_tick + 1 == scoreboard->tick && + (v3d71_qpu_writes_waddr_explicitly(devinfo, inst, 0) || + (v3d_qpu_writes_rf0_implicitly(devinfo, inst) && + !inst->sig.ldvary))) { + return true; + } + return false; } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0042-broadcom-compiler-allow-instruction-merges-in-v71.patch ================================================ From 31623712c2f741d393767641f32d56c35150eda5 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Thu, 30 Sep 2021 13:22:48 +0200 Subject: [PATCH 042/142] broadcom/compiler: allow instruction merges in v71 In v3d 4.x there were restrictions based on the number of raddrs used by the combined instructions, but we don't have these restrictions in v3d 7.x. It should be noted that while there are no restrictions on the number of raddrs addressed, a QPU instruction can only address a single small immediate, so we should be careful about that when we add support for small immediates. --- src/broadcom/compiler/qpu_schedule.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index 870823fd2b1..ff544fb3c1c 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -906,8 +906,11 @@ qpu_raddrs_used(const struct v3d_qpu_instr *a, static bool qpu_merge_raddrs(struct v3d_qpu_instr *result, const struct v3d_qpu_instr *add_instr, - const struct v3d_qpu_instr *mul_instr) + const struct v3d_qpu_instr *mul_instr, + const struct v3d_device_info *devinfo) { + assert(devinfo->ver <= 42); + uint64_t raddrs_used = qpu_raddrs_used(add_instr, mul_instr); int naddrs = util_bitcount64(raddrs_used); @@ -1111,9 +1114,19 @@ qpu_merge_inst(const struct v3d_device_info *devinfo, add_instr = a; } - if (add_instr && mul_instr && - !qpu_merge_raddrs(&merge, add_instr, mul_instr)) { - return false; + /* V3D 4.x and earlier use muxes to select the inputs for the ALUs and + * they have restrictions on the number of raddrs that can be adressed + * in a single instruction. + * + * FIXME: for V3D 7.x we can't merge instructions if they address more + * than one small immediate. For now, we don't support small immediates, + * so it is not a problem. + */ + if (devinfo->ver <= 42) { + if (add_instr && mul_instr && + !qpu_merge_raddrs(&merge, add_instr, mul_instr, devinfo)) { + return false; + } } merge.sig.thrsw |= b->sig.thrsw; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0043-broadcom-qpu-add-MOV-integer-packing-unpacking-varia.patch ================================================ From 959a0128654c94d84fda53ffc108971d3b3a817a Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 6 Oct 2021 09:27:43 +0200 Subject: [PATCH 043/142] broadcom/qpu: add MOV integer packing/unpacking variants These are new in v71 and cover MOV on both the ADD and the MUL alus. --- src/broadcom/qpu/qpu_instr.h | 9 ++++ src/broadcom/qpu/qpu_pack.c | 98 ++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) diff --git a/src/broadcom/qpu/qpu_instr.h b/src/broadcom/qpu/qpu_instr.h index c86a4119c54..4b34d17bd4c 100644 --- a/src/broadcom/qpu/qpu_instr.h +++ b/src/broadcom/qpu/qpu_instr.h @@ -285,6 +285,15 @@ enum v3d_qpu_input_unpack { /** Swap high and low 16 bits */ V3D_QPU_UNPACK_SWAP_16, + + /** Convert low 16 bits from 16-bit integer to unsigned 32-bit int */ + V3D_QPU_UNPACK_UL, + /** Convert high 16 bits from 16-bit integer to unsigned 32-bit int */ + V3D_QPU_UNPACK_UH, + /** Convert low 16 bits from 16-bit integer to signed 32-bit int */ + V3D_QPU_UNPACK_IL, + /** Convert high 16 bits from 16-bit integer to signed 32-bit int */ + V3D_QPU_UNPACK_IH, }; enum v3d_qpu_mux { diff --git a/src/broadcom/qpu/qpu_pack.c b/src/broadcom/qpu/qpu_pack.c index 7a262f18ac3..4d677894755 100644 --- a/src/broadcom/qpu/qpu_pack.c +++ b/src/broadcom/qpu/qpu_pack.c @@ -922,6 +922,56 @@ v3d_qpu_float32_unpack_pack(enum v3d_qpu_input_unpack unpacked, } } +static bool +v3d_qpu_int32_unpack_unpack(uint32_t packed, + enum v3d_qpu_input_unpack *unpacked) +{ + switch (packed) { + case 0: + *unpacked = V3D_QPU_UNPACK_NONE; + return true; + case 1: + *unpacked = V3D_QPU_UNPACK_UL; + return true; + case 2: + *unpacked = V3D_QPU_UNPACK_UH; + return true; + case 3: + *unpacked = V3D_QPU_UNPACK_IL; + return true; + case 4: + *unpacked = V3D_QPU_UNPACK_IH; + return true; + default: + return false; + } +} + +static bool +v3d_qpu_int32_unpack_pack(enum v3d_qpu_input_unpack unpacked, + uint32_t *packed) +{ + switch (unpacked) { + case V3D_QPU_UNPACK_NONE: + *packed = 0; + return true; + case V3D_QPU_UNPACK_UL: + *packed = 1; + return true; + case V3D_QPU_UNPACK_UH: + *packed = 2; + return true; + case V3D_QPU_UNPACK_IL: + *packed = 3; + return true; + case V3D_QPU_UNPACK_IH: + *packed = 4; + return true; + default: + return false; + } +} + static bool v3d_qpu_float16_unpack_unpack(uint32_t packed, enum v3d_qpu_input_unpack *unpacked) @@ -1273,6 +1323,15 @@ v3d71_qpu_add_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst instr->alu.add.b.unpack = V3D_QPU_UNPACK_NONE; break; + case V3D_QPU_A_MOV: + instr->alu.add.output_pack = V3D_QPU_PACK_NONE; + + if (!v3d_qpu_int32_unpack_unpack((raddr_b >> 2) & 0x7, + &instr->alu.add.a.unpack)) { + return false; + } + break; + default: instr->alu.add.output_pack = V3D_QPU_PACK_NONE; instr->alu.add.a.unpack = V3D_QPU_UNPACK_NONE; @@ -1449,6 +1508,15 @@ v3d71_qpu_mul_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst break; + case V3D_QPU_M_MOV: + instr->alu.mul.output_pack = V3D_QPU_PACK_NONE; + + if (!v3d_qpu_int32_unpack_unpack((raddr_d >> 2) & 0x7, + &instr->alu.mul.a.unpack)) { + return false; + } + break; + default: instr->alu.mul.output_pack = V3D_QPU_PACK_NONE; instr->alu.mul.a.unpack = V3D_QPU_UNPACK_NONE; @@ -1909,6 +1977,21 @@ v3d71_qpu_add_pack(const struct v3d_device_info *devinfo, opcode |= packed; break; + case V3D_QPU_A_MOV: { + uint32_t packed; + + if (instr->alu.add.output_pack != V3D_QPU_PACK_NONE) + return false; + + if (!v3d_qpu_int32_unpack_pack(instr->alu.add.a.unpack, + &packed)) { + return false; + } + + raddr_b |= packed << 2; + break; + } + default: if (instr->alu.add.op != V3D_QPU_A_NOP && (instr->alu.add.output_pack != V3D_QPU_PACK_NONE || @@ -2126,6 +2209,21 @@ v3d71_qpu_mul_pack(const struct v3d_device_info *devinfo, break; } + case V3D_QPU_M_MOV: { + uint32_t packed; + + if (instr->alu.mul.output_pack != V3D_QPU_PACK_NONE) + return false; + + if (!v3d_qpu_int32_unpack_pack(instr->alu.mul.a.unpack, + &packed)) { + return false; + } + + raddr_d |= packed << 2; + break; + } + default: break; } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0044-broadcom-qpu-fail-packing-on-unhandled-mul-pack-unpa.patch ================================================ From 2e86dd0c357d7b432ce6794ae22fbfae89ad186b Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 6 Oct 2021 12:01:10 +0200 Subject: [PATCH 044/142] broadcom/qpu: fail packing on unhandled mul pack/unpack We are doing this for the ADD alu already and it may be helpful to identify cases where we have QPU code with pack/unpack modifiers on MUL opcodes that we then are not packing into the actual QPU instructions. --- src/broadcom/qpu/qpu_pack.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/broadcom/qpu/qpu_pack.c b/src/broadcom/qpu/qpu_pack.c index 4d677894755..180d7ab08a3 100644 --- a/src/broadcom/qpu/qpu_pack.c +++ b/src/broadcom/qpu/qpu_pack.c @@ -2106,6 +2106,12 @@ v3d33_qpu_mul_pack(const struct v3d_device_info *devinfo, } default: + if (instr->alu.mul.op != V3D_QPU_M_NOP && + (instr->alu.mul.output_pack != V3D_QPU_PACK_NONE || + instr->alu.mul.a.unpack != V3D_QPU_UNPACK_NONE || + instr->alu.mul.b.unpack != V3D_QPU_UNPACK_NONE)) { + return false; + } break; } @@ -2225,6 +2231,12 @@ v3d71_qpu_mul_pack(const struct v3d_device_info *devinfo, } default: + if (instr->alu.mul.op != V3D_QPU_M_NOP && + (instr->alu.mul.output_pack != V3D_QPU_PACK_NONE || + instr->alu.mul.a.unpack != V3D_QPU_UNPACK_NONE || + instr->alu.mul.b.unpack != V3D_QPU_UNPACK_NONE)) { + return false; + } break; } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0045-broadcom-compiler-generalize-check-for-shaders-using.patch ================================================ From ed6bfa29d43b5a89ff070961454f1e82e23b4f45 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Fri, 8 Oct 2021 15:10:24 +0200 Subject: [PATCH 045/142] broadcom/compiler: generalize check for shaders using pixel center W V3D 4.x has pixel center W in rf0 and V3D 7.x has it in rf3. We already account for this when we setup the c->payload_w, so use that. --- src/broadcom/compiler/nir_to_vir.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index 220ff6bcd49..90fe1d1e7f0 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -4547,8 +4547,8 @@ vir_check_payload_w(struct v3d_compile *c) vir_for_each_inst_inorder(inst, c) { for (int i = 0; i < vir_get_nsrc(inst); i++) { - if (inst->src[i].file == QFILE_REG && - inst->src[i].index == 0) { + if (inst->src[i].file == c->payload_w.file && + inst->src[i].index == c->payload_w.index) { c->uses_center_w = true; return; } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0046-broadcom-compiler-v71-isn-t-affected-by-double-round.patch ================================================ From e1a0fa2c2010ef29b8cec798cd0fc99cf44f3a2d Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Thu, 14 Oct 2021 14:16:40 +0200 Subject: [PATCH 046/142] broadcom/compiler: v71 isn't affected by double-rounding of viewport X,Y coords --- src/broadcom/compiler/v3d_nir_lower_io.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/broadcom/compiler/v3d_nir_lower_io.c b/src/broadcom/compiler/v3d_nir_lower_io.c index 3ef0e398228..4cdba3748a1 100644 --- a/src/broadcom/compiler/v3d_nir_lower_io.c +++ b/src/broadcom/compiler/v3d_nir_lower_io.c @@ -600,9 +600,13 @@ v3d_nir_emit_ff_vpm_outputs(struct v3d_compile *c, nir_builder *b, * The correct fix for this as recommended by Broadcom * is to convert to .8 fixed-point with ffloor(). */ - pos = nir_f2i32(b, nir_ffloor(b, pos)); - v3d_nir_store_output(b, state->vp_vpm_offset + i, - offset_reg, pos); + if (c->devinfo->ver <= 42) + pos = nir_f2i32(b, nir_ffloor(b, pos)); + else + pos = nir_f2i32(b, nir_fround_even(b, pos)); + + v3d_nir_store_output(b, state->vp_vpm_offset + i, + offset_reg, pos); } } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0047-broadcom-compiler-update-one-TMUWT-restriction-for-v.patch ================================================ From 697e6cf01b781b244404872f331a778b6d4e67da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Tue, 19 Oct 2021 11:16:43 +0200 Subject: [PATCH 047/142] broadcom/compiler: update one TMUWT restriction for v71 TMUWT not allowed in the final instruction restriction doesn't apply for v71. --- src/broadcom/compiler/qpu_schedule.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index ff544fb3c1c..25f79aa6f46 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -1700,8 +1700,10 @@ qpu_inst_valid_in_thrend_slot(struct v3d_compile *c, if (inst->type == V3D_QPU_INSTR_TYPE_ALU) { /* GFXH-1625: TMUWT not allowed in the final instruction. */ - if (slot == 2 && inst->alu.add.op == V3D_QPU_A_TMUWT) + if (c->devinfo->ver <= 42 && slot == 2 && + inst->alu.add.op == V3D_QPU_A_TMUWT) { return false; + } /* No writing physical registers at the end. */ bool add_is_nop = inst->alu.add.op == V3D_QPU_A_NOP; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0048-broadcom-compiler-update-ldunif-ldvary-comment-for-v.patch ================================================ From 26fea727a9f34b75a3fe3f6a806accaddcc317f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Tue, 19 Oct 2021 11:51:32 +0200 Subject: [PATCH 048/142] broadcom/compiler: update ldunif/ldvary comment for v71 For v42 and below ldunif/ldvary write both on r5, but with a different delay, so we need to take that into account when scheduling both. For v71 the register used is rf0, but the behaviour is the same. So the scheduling code can be the same, but the comment needs update. --- src/broadcom/compiler/qpu_schedule.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index 25f79aa6f46..e8197661f89 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -1234,10 +1234,11 @@ retry: if (pixel_scoreboard_too_soon(c, scoreboard, inst)) continue; - /* ldunif and ldvary both write r5, but ldunif does so a tick - * sooner. If the ldvary's r5 wasn't used, then ldunif might + /* ldunif and ldvary both write the same register (r5 for v42 + * and below, rf0 for v71), but ldunif does so a tick sooner. + * If the ldvary's register wasn't used, then ldunif might * otherwise get scheduled so ldunif and ldvary try to update - * r5 in the same tick. + * the register in the same tick. */ if ((inst->sig.ldunif || inst->sig.ldunifa) && scoreboard->tick == scoreboard->last_ldvary_tick + 1) { -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0049-broadcom-compiler-update-payload-registers-handling-.patch ================================================ From 70456e27b039174f767010f96d9b649e5e42d84f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Tue, 19 Oct 2021 23:52:30 +0200 Subject: [PATCH 049/142] broadcom/compiler: update payload registers handling when computing live intervals As for v71 the payload registers are not the same. Specifically now rf3 is used as payload register, so this is needed to avoid rf3 being selected as a instruction dst by the register allocator, overwriting the payload value that could be still used. --- src/broadcom/compiler/vir_live_variables.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/broadcom/compiler/vir_live_variables.c b/src/broadcom/compiler/vir_live_variables.c index 575b0481dc8..87a7e2b5b81 100644 --- a/src/broadcom/compiler/vir_live_variables.c +++ b/src/broadcom/compiler/vir_live_variables.c @@ -179,17 +179,22 @@ vir_setup_def_use(struct v3d_compile *c) flags_inst = NULL; } - /* Payload registers: r0/1/2 contain W, centroid W, - * and Z at program start. Register allocation will - * force their nodes to R0/1/2. + /* Payload registers: for fragment shaders, W, + * centroid W, and Z will be initialized at r0/1/2 + * until v42, or r1/r2/r3 from v71. + * + * For compute shaders, payload would be r0/r2 until + * v42, r3/r2 from v71 + * + * Register allocation will force their nodes to those + * registers. */ if (inst->src[0].file == QFILE_REG) { - switch (inst->src[0].index) { - case 0: - case 1: - case 2: + uint32_t min_payload_r = c->devinfo->ver >= 71 ? 1 : 0; + uint32_t max_payload_r = c->devinfo->ver >= 71 ? 3 : 2; + if (inst->src[0].index >= min_payload_r || + inst->src[0].index <= max_payload_r) { c->temp_start[inst->dst.index] = 0; - break; } } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0050-broadcom-compiler-update-peripheral-access-restricti.patch ================================================ From f9a76b3a1e316e5ed6387819b87eaaf60f989a2b Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 26 Oct 2021 11:43:02 +0200 Subject: [PATCH 050/142] broadcom/compiler: update peripheral access restrictions for v71 In V3D 4.x only a couple of simultaneous accesses where allowed, but V3D 7.x is a bit more flexible, so rather than trying to check for all the allowed combinations it is easier to check if we are one of the disallows. Shader-db (pi5): total instructions in shared programs: 11338883 -> 11307386 (-0.28%) instructions in affected programs: 2727201 -> 2695704 (-1.15%) helped: 12555 HURT: 289 Instructions are helped. total max-temps in shared programs: 2230199 -> 2229260 (-0.04%) max-temps in affected programs: 20508 -> 19569 (-4.58%) helped: 608 HURT: 4 Max-temps are helped. total sfu-stalls in shared programs: 15236 -> 15293 (0.37%) sfu-stalls in affected programs: 148 -> 205 (38.51%) helped: 38 HURT: 64 Inconclusive result (%-change mean confidence interval includes 0). total inst-and-stalls in shared programs: 11354119 -> 11322679 (-0.28%) inst-and-stalls in affected programs: 2732262 -> 2700822 (-1.15%) helped: 12550 HURT: 304 Inst-and-stalls are helped. total nops in shared programs: 273711 -> 274095 (0.14%) nops in affected programs: 9626 -> 10010 (3.99%) helped: 186 HURT: 397 Nops are HURT. --- src/broadcom/compiler/qpu_schedule.c | 88 +++++++++++++++++++++------- src/broadcom/compiler/qpu_validate.c | 2 +- src/broadcom/qpu/qpu_instr.c | 16 +++-- src/broadcom/qpu/qpu_instr.h | 2 + 4 files changed, 82 insertions(+), 26 deletions(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index e8197661f89..adb501e85ce 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -790,7 +790,8 @@ enum { V3D_PERIPHERAL_TMU_WAIT = (1 << 6), V3D_PERIPHERAL_TMU_WRTMUC_SIG = (1 << 7), V3D_PERIPHERAL_TSY = (1 << 8), - V3D_PERIPHERAL_TLB = (1 << 9), + V3D_PERIPHERAL_TLB_READ = (1 << 9), + V3D_PERIPHERAL_TLB_WRITE = (1 << 10), }; static uint32_t @@ -815,8 +816,10 @@ qpu_peripherals(const struct v3d_device_info *devinfo, if (v3d_qpu_uses_sfu(inst)) result |= V3D_PERIPHERAL_SFU; - if (v3d_qpu_uses_tlb(inst)) - result |= V3D_PERIPHERAL_TLB; + if (v3d_qpu_reads_tlb(inst)) + result |= V3D_PERIPHERAL_TLB_READ; + if (v3d_qpu_writes_tlb(inst)) + result |= V3D_PERIPHERAL_TLB_WRITE; if (inst->type == V3D_QPU_INSTR_TYPE_ALU) { if (inst->alu.add.op != V3D_QPU_A_NOP && @@ -847,32 +850,75 @@ qpu_compatible_peripheral_access(const struct v3d_device_info *devinfo, if (devinfo->ver < 41) return false; - /* V3D 4.1+ allow WRTMUC signal with TMU register write (other than - * tmuc). + /* V3D 4.x can't do more than one peripheral access except in a + * few cases: */ - if (a_peripherals == V3D_PERIPHERAL_TMU_WRTMUC_SIG && - b_peripherals == V3D_PERIPHERAL_TMU_WRITE) { - return v3d_qpu_writes_tmu_not_tmuc(devinfo, b); + if (devinfo->ver <= 42) { + /* WRTMUC signal with TMU register write (other than tmuc). */ + if (a_peripherals == V3D_PERIPHERAL_TMU_WRTMUC_SIG && + b_peripherals == V3D_PERIPHERAL_TMU_WRITE) { + return v3d_qpu_writes_tmu_not_tmuc(devinfo, b); + } + if (b_peripherals == V3D_PERIPHERAL_TMU_WRTMUC_SIG && + a_peripherals == V3D_PERIPHERAL_TMU_WRITE) { + return v3d_qpu_writes_tmu_not_tmuc(devinfo, a); + } + + /* TMU read with VPM read/write. */ + if (a_peripherals == V3D_PERIPHERAL_TMU_READ && + (b_peripherals == V3D_PERIPHERAL_VPM_READ || + b_peripherals == V3D_PERIPHERAL_VPM_WRITE)) { + return true; + } + if (b_peripherals == V3D_PERIPHERAL_TMU_READ && + (a_peripherals == V3D_PERIPHERAL_VPM_READ || + a_peripherals == V3D_PERIPHERAL_VPM_WRITE)) { + return true; + } + + return false; } - if (a_peripherals == V3D_PERIPHERAL_TMU_WRITE && - b_peripherals == V3D_PERIPHERAL_TMU_WRTMUC_SIG) { - return v3d_qpu_writes_tmu_not_tmuc(devinfo, a); + /* V3D 7.x can't have more than one of these restricted peripherals */ + const uint32_t restricted = V3D_PERIPHERAL_TMU_WRITE | + V3D_PERIPHERAL_TMU_WRTMUC_SIG | + V3D_PERIPHERAL_TSY | + V3D_PERIPHERAL_TLB_READ | + V3D_PERIPHERAL_SFU | + V3D_PERIPHERAL_VPM_READ | + V3D_PERIPHERAL_VPM_WRITE; + + const uint32_t a_restricted = a_peripherals & restricted; + const uint32_t b_restricted = b_peripherals & restricted; + if (a_restricted && b_restricted) { + /* WRTMUC signal with TMU register write (other than tmuc) is + * allowed though. + */ + if (!((a_restricted == V3D_PERIPHERAL_TMU_WRTMUC_SIG && + b_restricted == V3D_PERIPHERAL_TMU_WRITE && + v3d_qpu_writes_tmu_not_tmuc(devinfo, b)) || + (b_restricted == V3D_PERIPHERAL_TMU_WRTMUC_SIG && + a_restricted == V3D_PERIPHERAL_TMU_WRITE && + v3d_qpu_writes_tmu_not_tmuc(devinfo, a)))) { + return false; + } } - /* V3D 4.1+ allows TMU read with VPM read/write. */ - if (a_peripherals == V3D_PERIPHERAL_TMU_READ && - (b_peripherals == V3D_PERIPHERAL_VPM_READ || - b_peripherals == V3D_PERIPHERAL_VPM_WRITE)) { - return true; + /* Only one TMU read per instruction */ + if ((a_peripherals & V3D_PERIPHERAL_TMU_READ) && + (b_peripherals & V3D_PERIPHERAL_TMU_READ)) { + return false; } - if (b_peripherals == V3D_PERIPHERAL_TMU_READ && - (a_peripherals == V3D_PERIPHERAL_VPM_READ || - a_peripherals == V3D_PERIPHERAL_VPM_WRITE)) { - return true; + + /* Only one TLB access per instruction */ + if ((a_peripherals & (V3D_PERIPHERAL_TLB_WRITE | + V3D_PERIPHERAL_TLB_READ)) && + (b_peripherals & (V3D_PERIPHERAL_TLB_WRITE | + V3D_PERIPHERAL_TLB_READ))) { + return false; } - return false; + return true; } /* Compute a bitmask of which rf registers are used between diff --git a/src/broadcom/compiler/qpu_validate.c b/src/broadcom/compiler/qpu_validate.c index 12788692432..fde6695d59b 100644 --- a/src/broadcom/compiler/qpu_validate.c +++ b/src/broadcom/compiler/qpu_validate.c @@ -227,7 +227,7 @@ qpu_validate_inst(struct v3d_qpu_validate_state *state, struct qinst *qinst) vpm_writes + tlb_writes + tsy_writes + - inst->sig.ldtmu + + (devinfo->ver <= 42 ? inst->sig.ldtmu : 0) + inst->sig.ldtlb + inst->sig.ldvpm + inst->sig.ldtlbu > 1) { diff --git a/src/broadcom/qpu/qpu_instr.c b/src/broadcom/qpu/qpu_instr.c index 195a0dcd232..f54ce7210fb 100644 --- a/src/broadcom/qpu/qpu_instr.c +++ b/src/broadcom/qpu/qpu_instr.c @@ -649,12 +649,14 @@ v3d_qpu_add_op_writes_vpm(enum v3d_qpu_add_op op) } bool -v3d_qpu_uses_tlb(const struct v3d_qpu_instr *inst) +v3d_qpu_reads_tlb(const struct v3d_qpu_instr *inst) { - if (inst->sig.ldtlb || - inst->sig.ldtlbu) - return true; + return inst->sig.ldtlb || inst->sig.ldtlbu; +} +bool +v3d_qpu_writes_tlb(const struct v3d_qpu_instr *inst) +{ if (inst->type == V3D_QPU_INSTR_TYPE_ALU) { if (inst->alu.add.op != V3D_QPU_A_NOP && inst->alu.add.magic_write && @@ -672,6 +674,12 @@ v3d_qpu_uses_tlb(const struct v3d_qpu_instr *inst) return false; } +bool +v3d_qpu_uses_tlb(const struct v3d_qpu_instr *inst) +{ + return v3d_qpu_writes_tlb(inst) || v3d_qpu_reads_tlb(inst); +} + bool v3d_qpu_uses_sfu(const struct v3d_qpu_instr *inst) { diff --git a/src/broadcom/qpu/qpu_instr.h b/src/broadcom/qpu/qpu_instr.h index 4b34d17bd4c..dece45c5c54 100644 --- a/src/broadcom/qpu/qpu_instr.h +++ b/src/broadcom/qpu/qpu_instr.h @@ -472,6 +472,8 @@ bool v3d_qpu_magic_waddr_is_tlb(enum v3d_qpu_waddr waddr) ATTRIBUTE_CONST; bool v3d_qpu_magic_waddr_is_vpm(enum v3d_qpu_waddr waddr) ATTRIBUTE_CONST; bool v3d_qpu_magic_waddr_is_tsy(enum v3d_qpu_waddr waddr) ATTRIBUTE_CONST; bool v3d_qpu_magic_waddr_loads_unif(enum v3d_qpu_waddr waddr) ATTRIBUTE_CONST; +bool v3d_qpu_reads_tlb(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST; +bool v3d_qpu_writes_tlb(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST; bool v3d_qpu_uses_tlb(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST; bool v3d_qpu_instr_is_sfu(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST; bool v3d_qpu_instr_is_legacy_sfu(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0051-broadcom-qpu-add-packing-for-fmov-on-ADD-alu.patch ================================================ From 3520cceb87fb2f9765ba7dbe2771fbd0cadca78d Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 26 Oct 2021 08:37:54 +0200 Subject: [PATCH 051/142] broadcom/qpu: add packing for fmov on ADD alu --- src/broadcom/qpu/qpu_pack.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/broadcom/qpu/qpu_pack.c b/src/broadcom/qpu/qpu_pack.c index 180d7ab08a3..ed5a8bc667d 100644 --- a/src/broadcom/qpu/qpu_pack.c +++ b/src/broadcom/qpu/qpu_pack.c @@ -1332,6 +1332,20 @@ v3d71_qpu_add_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst } break; + case V3D_QPU_A_FMOV: + instr->alu.add.output_pack = raddr_b & 0x3; + + /* Mul alu FMOV has one additional variant */ + int32_t unpack = (raddr_b >> 2) & 0x7; + if (unpack == 7) + return false; + + if (!v3d_qpu_float32_unpack_unpack(unpack, + &instr->alu.add.a.unpack)) { + return false; + } + break; + default: instr->alu.add.output_pack = V3D_QPU_PACK_NONE; instr->alu.add.a.unpack = V3D_QPU_UNPACK_NONE; @@ -1992,6 +2006,23 @@ v3d71_qpu_add_pack(const struct v3d_device_info *devinfo, break; } + case V3D_QPU_A_FMOV: { + uint32_t packed; + + if (!v3d_qpu_float32_pack_pack(instr->alu.add.output_pack, + &packed)) { + return false; + } + raddr_b = packed; + + if (!v3d_qpu_float32_unpack_pack(instr->alu.add.a.unpack, + &packed)) { + return false; + } + raddr_b |= packed << 2; + break; + } + default: if (instr->alu.add.op != V3D_QPU_A_NOP && (instr->alu.add.output_pack != V3D_QPU_PACK_NONE || -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0052-broadcom-compiler-handle-rf0-flops-storage-restricti.patch ================================================ From 7c7ab15b3c9def4bc3bb5be492228a933c325f8a Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 6 Oct 2021 13:58:27 +0200 Subject: [PATCH 052/142] broadcom/compiler: handle rf0 flops storage restriction in v71 --- src/broadcom/compiler/qpu_schedule.c | 81 +++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index adb501e85ce..7048d9257b6 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -538,6 +538,10 @@ struct choose_scoreboard { int ldvary_count; int pending_ldtmu_count; bool first_ldtmu_after_thrsw; + + /* V3D 7.x */ + int last_implicit_rf0_write_tick; + bool has_rf0_flops_conflict; }; static bool @@ -1499,6 +1503,62 @@ update_scoreboard_tmu_tracking(struct choose_scoreboard *scoreboard, } } +static void +set_has_rf0_flops_conflict(struct choose_scoreboard *scoreboard, + const struct v3d_qpu_instr *inst, + const struct v3d_device_info *devinfo) +{ + if (scoreboard->last_implicit_rf0_write_tick == scoreboard->tick && + v3d_qpu_sig_writes_address(devinfo, &inst->sig) && + !inst->sig_magic) { + scoreboard->has_rf0_flops_conflict = true; + } +} + +static void +update_scoreboard_for_rf0_flops(struct choose_scoreboard *scoreboard, + const struct v3d_qpu_instr *inst, + const struct v3d_device_info *devinfo) +{ + if (devinfo->ver < 71) + return; + + /* Thread switch restrictions: + * + * At the point of a thread switch or thread end (when the actual + * thread switch or thread end happens, not when the signalling + * instruction is processed): + * + * - If the most recent write to rf0 was from a ldunif, ldunifa, or + * ldvary instruction in which another signal also wrote to the + * register file, and the final instruction of the thread section + * contained a signal which wrote to the register file, then the + * value of rf0 is undefined at the start of the new section + * + * Here we use the scoreboard to track if our last rf0 implicit write + * happens at the same time that another signal writes the register + * file (has_rf0_flops_conflict). We will use that information when + * scheduling thrsw instructions to avoid putting anything in their + * last delay slot which has a signal that writes to the register file. + */ + + /* Reset tracking if we have an explicit rf0 write or we are starting + * a new thread section. + */ + if (v3d71_qpu_writes_waddr_explicitly(devinfo, inst, 0) || + scoreboard->tick - scoreboard->last_thrsw_tick == 3) { + scoreboard->last_implicit_rf0_write_tick = -10; + scoreboard->has_rf0_flops_conflict = false; + } + + if (v3d_qpu_writes_rf0_implicitly(devinfo, inst)) { + scoreboard->last_implicit_rf0_write_tick = inst->sig.ldvary ? + scoreboard->tick + 1 : scoreboard->tick; + } + + set_has_rf0_flops_conflict(scoreboard, inst, devinfo); +} + static void update_scoreboard_for_chosen(struct choose_scoreboard *scoreboard, const struct qinst *qinst, @@ -1542,6 +1602,8 @@ update_scoreboard_for_chosen(struct choose_scoreboard *scoreboard, if (inst->sig.ldvary) scoreboard->last_ldvary_tick = scoreboard->tick; + update_scoreboard_for_rf0_flops(scoreboard, inst, devinfo); + update_scoreboard_tmu_tracking(scoreboard, qinst); } @@ -1812,6 +1874,7 @@ qpu_inst_valid_in_thrend_slot(struct v3d_compile *c, */ static bool qpu_inst_before_thrsw_valid_in_delay_slot(struct v3d_compile *c, + struct choose_scoreboard *scoreboard, const struct qinst *qinst, uint32_t slot) { @@ -1842,6 +1905,17 @@ qpu_inst_before_thrsw_valid_in_delay_slot(struct v3d_compile *c, if (v3d_qpu_writes_unifa(c->devinfo, &qinst->qpu)) return false; + /* See comment when we set has_rf0_flops_conflict for details */ + if (c->devinfo->ver >= 71 && + slot == 2 && + v3d_qpu_sig_writes_address(c->devinfo, &qinst->qpu.sig) && + !qinst->qpu.sig_magic) { + if (scoreboard->has_rf0_flops_conflict) + return false; + if (scoreboard->last_implicit_rf0_write_tick == scoreboard->tick) + return false; + } + return true; } @@ -1874,7 +1948,7 @@ qpu_inst_after_thrsw_valid_in_delay_slot(struct v3d_compile *c, * also apply to instructions scheduled after the thrsw that we want * to place in its delay slots. */ - if (!qpu_inst_before_thrsw_valid_in_delay_slot(c, qinst, slot)) + if (!qpu_inst_before_thrsw_valid_in_delay_slot(c, scoreboard, qinst, slot)) return false; /* TLB access is disallowed until scoreboard wait is executed, which @@ -1947,8 +2021,10 @@ valid_thrsw_sequence(struct v3d_compile *c, struct choose_scoreboard *scoreboard bool is_thrend) { for (int slot = 0; slot < instructions_in_sequence; slot++) { - if (!qpu_inst_before_thrsw_valid_in_delay_slot(c, qinst, slot)) + if (!qpu_inst_before_thrsw_valid_in_delay_slot(c, scoreboard, + qinst, slot)) { return false; + } if (is_thrend && !qpu_inst_valid_in_thrend_slot(c, qinst, slot)) { @@ -2718,6 +2794,7 @@ v3d_qpu_schedule_instructions(struct v3d_compile *c) scoreboard.last_setmsf_tick = -10; scoreboard.last_stallable_sfu_tick = -10; scoreboard.first_ldtmu_after_thrsw = true; + scoreboard.last_implicit_rf0_write_tick = - 10; if (debug) { fprintf(stderr, "Pre-schedule instructions\n"); -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0053-broadcom-compiler-enable-ldvary-pipelining-on-v71.patch ================================================ From 0c6910721eb50b38b3388c2d2344b6ecfe0fee58 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 27 Oct 2021 11:35:12 +0200 Subject: [PATCH 053/142] broadcom/compiler: enable ldvary pipelining on v71 --- src/broadcom/compiler/qpu_schedule.c | 121 ++++++++++++++++++--------- 1 file changed, 80 insertions(+), 41 deletions(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index 7048d9257b6..334ffdc6d58 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -2312,46 +2312,72 @@ emit_branch(struct v3d_compile *c, } static bool -alu_reads_register(struct v3d_qpu_instr *inst, +alu_reads_register(const struct v3d_device_info *devinfo, + struct v3d_qpu_instr *inst, bool add, bool magic, uint32_t index) { uint32_t num_src; - enum v3d_qpu_mux mux_a, mux_b; - - if (add) { + if (add) num_src = v3d_qpu_add_op_num_src(inst->alu.add.op); - mux_a = inst->alu.add.a.mux; - mux_b = inst->alu.add.b.mux; - } else { + else num_src = v3d_qpu_mul_op_num_src(inst->alu.mul.op); - mux_a = inst->alu.mul.a.mux; - mux_b = inst->alu.mul.b.mux; - } - for (int i = 0; i < num_src; i++) { - if (magic) { - if (i == 0 && mux_a == index) - return true; - if (i == 1 && mux_b == index) - return true; + if (devinfo->ver <= 42) { + enum v3d_qpu_mux mux_a, mux_b; + if (add) { + mux_a = inst->alu.add.a.mux; + mux_b = inst->alu.add.b.mux; } else { - if (i == 0 && mux_a == V3D_QPU_MUX_A && - inst->raddr_a == index) { - return true; - } - if (i == 0 && mux_a == V3D_QPU_MUX_B && - inst->raddr_b == index) { - return true; - } - if (i == 1 && mux_b == V3D_QPU_MUX_A && - inst->raddr_a == index) { - return true; - } - if (i == 1 && mux_b == V3D_QPU_MUX_B && - inst->raddr_b == index) { - return true; + mux_a = inst->alu.mul.a.mux; + mux_b = inst->alu.mul.b.mux; + } + + for (int i = 0; i < num_src; i++) { + if (magic) { + if (i == 0 && mux_a == index) + return true; + if (i == 1 && mux_b == index) + return true; + } else { + if (i == 0 && mux_a == V3D_QPU_MUX_A && + inst->raddr_a == index) { + return true; + } + if (i == 0 && mux_a == V3D_QPU_MUX_B && + inst->raddr_b == index) { + return true; + } + if (i == 1 && mux_b == V3D_QPU_MUX_A && + inst->raddr_a == index) { + return true; + } + if (i == 1 && mux_b == V3D_QPU_MUX_B && + inst->raddr_b == index) { + return true; + } } } + + return false; + } + + assert(devinfo->ver >= 71); + assert(!magic); + + uint32_t raddr_a, raddr_b; + if (add) { + raddr_a = inst->alu.add.a.raddr; + raddr_b = inst->alu.add.b.raddr; + } else { + raddr_a = inst->alu.mul.a.raddr; + raddr_b = inst->alu.mul.b.raddr; + } + + for (int i = 0; i < num_src; i++) { + if (i == 0 && raddr_a == index) + return true; + if (i == 1 && raddr_b == index) + return true; } return false; @@ -2386,6 +2412,8 @@ fixup_pipelined_ldvary(struct v3d_compile *c, struct qblock *block, struct v3d_qpu_instr *inst) { + const struct v3d_device_info *devinfo = c->devinfo; + /* We only call this if we have successfully merged an ldvary into a * previous instruction. */ @@ -2398,9 +2426,9 @@ fixup_pipelined_ldvary(struct v3d_compile *c, * the ldvary destination, if it does, then moving the ldvary before * it would overwrite it. */ - if (alu_reads_register(inst, true, ldvary_magic, ldvary_index)) + if (alu_reads_register(devinfo, inst, true, ldvary_magic, ldvary_index)) return false; - if (alu_reads_register(inst, false, ldvary_magic, ldvary_index)) + if (alu_reads_register(devinfo, inst, false, ldvary_magic, ldvary_index)) return false; /* The implicit ldvary destination may not be written to by a signal @@ -2436,13 +2464,13 @@ fixup_pipelined_ldvary(struct v3d_compile *c, } /* The previous instruction cannot have a conflicting signal */ - if (v3d_qpu_sig_writes_address(c->devinfo, &prev->qpu.sig)) + if (v3d_qpu_sig_writes_address(devinfo, &prev->qpu.sig)) return false; uint32_t sig; struct v3d_qpu_sig new_sig = prev->qpu.sig; new_sig.ldvary = true; - if (!v3d_qpu_sig_pack(c->devinfo, &new_sig, &sig)) + if (!v3d_qpu_sig_pack(devinfo, &new_sig, &sig)) return false; /* The previous instruction cannot use flags since ldvary uses the @@ -2471,14 +2499,25 @@ fixup_pipelined_ldvary(struct v3d_compile *c, inst->sig_magic = false; inst->sig_addr = 0; - /* By moving ldvary to the previous instruction we make it update - * r5 in the current one, so nothing else in it should write r5. - * This should've been prevented by our dependency tracking, which + /* Update rf0 flops tracking for new ldvary delayed rf0 write tick */ + if (devinfo->ver >= 71) { + scoreboard->last_implicit_rf0_write_tick = scoreboard->tick; + set_has_rf0_flops_conflict(scoreboard, inst, devinfo); + } + + /* By moving ldvary to the previous instruction we make it update r5 + * (rf0 for ver >= 71) in the current one, so nothing else in it + * should write this register. + * + * This should've been prevented by our depedency tracking, which * would not allow ldvary to be paired up with an instruction that - * writes r5 (since our dependency tracking doesn't know that the - * ldvary write r5 happens in the next instruction). + * writes r5/rf0 (since our dependency tracking doesn't know that the + * ldvary write to r5/rf0 happens in the next instruction). */ - assert(!v3d_qpu_writes_r5(c->devinfo, inst)); + assert(!v3d_qpu_writes_r5(devinfo, inst)); + assert(devinfo->ver <= 42 || + (!v3d_qpu_writes_rf0_implicitly(devinfo, inst) && + !v3d71_qpu_writes_waddr_explicitly(devinfo, inst, 0))); return true; } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0054-broadcom-compiler-try-to-use-ldunif-a-instead-of-ldu.patch ================================================ From 0670d642bb91fc68ce73f2d9fb88c482295a446d Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Thu, 28 Oct 2021 14:13:29 +0200 Subject: [PATCH 054/142] broadcom/compiler: try to use ldunif(a) instead of ldunif(a)rf in v71 The rf variants need to encode the destination in the cond bits, which prevents these to be merged with any other instruction that need them. In 4.x, ldunif(a) write to r5 which is a special register that only ldunif(a) and ldvary can write so we have a special register class for it and only allow it for them. Then when we need to choose a register for a node, if this register is available we always use it. In 7.x these instructions write to rf0, which can be used by any instruction, so instead of restricting rf0, we track the temps that are used as ldunif(a) destinations and use that information to favor rf0 for them. --- src/broadcom/compiler/v3d_compiler.h | 3 ++ src/broadcom/compiler/vir_register_allocate.c | 34 ++++++++++++++++--- src/broadcom/compiler/vir_to_qpu.c | 11 ++++-- 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/broadcom/compiler/v3d_compiler.h b/src/broadcom/compiler/v3d_compiler.h index 7e8f3bfc1a7..36adf8830b5 100644 --- a/src/broadcom/compiler/v3d_compiler.h +++ b/src/broadcom/compiler/v3d_compiler.h @@ -613,6 +613,9 @@ struct v3d_ra_node_info { struct { uint32_t priority; uint8_t class_bits; + + /* V3D 7.x */ + bool is_ldunif_dst; } *info; uint32_t alloc_count; }; diff --git a/src/broadcom/compiler/vir_register_allocate.c b/src/broadcom/compiler/vir_register_allocate.c index e0adc1de7a4..1be091f8518 100644 --- a/src/broadcom/compiler/vir_register_allocate.c +++ b/src/broadcom/compiler/vir_register_allocate.c @@ -384,6 +384,7 @@ add_node(struct v3d_compile *c, uint32_t temp, uint8_t class_bits) /* We fill the node priority after we are done inserting spills */ c->nodes.info[node].class_bits = class_bits; c->nodes.info[node].priority = 0; + c->nodes.info[node].is_ldunif_dst = false; } /* The spill offset for this thread takes a bit of setup, so do it once at @@ -899,9 +900,22 @@ v3d_ra_select_accum(struct v3d_ra_select_callback_data *v3d_ra, static bool v3d_ra_select_rf(struct v3d_ra_select_callback_data *v3d_ra, + unsigned int node, BITSET_WORD *regs, unsigned int *out) { + /* In V3D 7.x, try to assign rf0 to temps used as ldunif's dst + * so we can avoid turning them into ldunifrf (which uses the + * cond field to encode the dst and would prevent merge with + * instructions that use cond flags). + */ + if (v3d_ra->nodes->info[node].is_ldunif_dst && + BITSET_TEST(regs, v3d_ra->phys_index)) { + assert(v3d_ra->devinfo->ver >= 71); + *out = v3d_ra->phys_index; + return true; + } + for (int i = 0; i < PHYS_COUNT; i++) { int phys_off = (v3d_ra->next_phys + i) % PHYS_COUNT; int phys = v3d_ra->phys_index + phys_off; @@ -927,7 +941,7 @@ v3d_ra_select_callback(unsigned int n, BITSET_WORD *regs, void *data) return reg; } - if (v3d_ra_select_rf(v3d_ra, regs, ®)) + if (v3d_ra_select_rf(v3d_ra, n, regs, ®)) return reg; /* If we ran out of physical registers try to assign an accumulator @@ -1139,15 +1153,24 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, } } } else { - /* If the instruction has an implicit write - * we can't allocate its dest to the same - * register. + /* Make sure we don't allocate the ldvary's + * destination to rf0, since it would clash + * with its implicit write to that register. */ - if (v3d_qpu_writes_rf0_implicitly(c->devinfo, &inst->qpu)) { + if (inst->qpu.sig.ldvary) { ra_add_node_interference(c->g, temp_to_node(c, inst->dst.index), implicit_rf_nodes[0]); } + /* Flag dst temps from ldunif(a) instructions + * so we can try to assign rf0 to them and avoid + * converting these to ldunif(a)rf. + */ + if (inst->qpu.sig.ldunif || inst->qpu.sig.ldunifa) { + const uint32_t dst_n = + temp_to_node(c, inst->dst.index); + c->nodes.info[dst_n].is_ldunif_dst = true; + } } } @@ -1222,6 +1245,7 @@ v3d_register_allocate(struct v3d_compile *c) * without accumulators that can have implicit writes to phys regs. */ for (uint32_t i = 0; i < num_ra_nodes; i++) { + c->nodes.info[i].is_ldunif_dst = false; if (c->devinfo->has_accumulators && i < ACC_COUNT) { acc_nodes[i] = i; ra_set_node_reg(c->g, acc_nodes[i], ACC_INDEX + i); diff --git a/src/broadcom/compiler/vir_to_qpu.c b/src/broadcom/compiler/vir_to_qpu.c index afc4941fdb1..cbbb495592b 100644 --- a/src/broadcom/compiler/vir_to_qpu.c +++ b/src/broadcom/compiler/vir_to_qpu.c @@ -345,8 +345,15 @@ v3d_generate_code_block(struct v3d_compile *c, assert(qinst->qpu.alu.add.op == V3D_QPU_A_NOP); assert(qinst->qpu.alu.mul.op == V3D_QPU_M_NOP); - if (!dst.magic || - dst.index != V3D_QPU_WADDR_R5) { + bool use_rf; + if (c->devinfo->has_accumulators) { + use_rf = !dst.magic || + dst.index != V3D_QPU_WADDR_R5; + } else { + use_rf = dst.magic || dst.index != 0; + } + + if (use_rf) { assert(c->devinfo->ver >= 40); if (qinst->qpu.sig.ldunif) { -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0055-broadcom-compiler-don-t-assign-rf0-to-temps-that-con.patch ================================================ From cbed3b97394da09c9ae644c79e098e3ba8b5c3e8 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Fri, 29 Oct 2021 13:00:56 +0200 Subject: [PATCH 055/142] broadcom/compiler: don't assign rf0 to temps that conflict with ldvary ldvary writes to rf0 implicitly, so we don't want to allocate rf0 to any temps that are live across ldvary's rf0 live ranges. --- src/broadcom/compiler/vir_register_allocate.c | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/broadcom/compiler/vir_register_allocate.c b/src/broadcom/compiler/vir_register_allocate.c index 1be091f8518..6f7b1ca0589 100644 --- a/src/broadcom/compiler/vir_register_allocate.c +++ b/src/broadcom/compiler/vir_register_allocate.c @@ -1019,6 +1019,7 @@ static void update_graph_and_reg_classes_for_inst(struct v3d_compile *c, int *acc_nodes, int *implicit_rf_nodes, + int last_ldvary_ip, struct qinst *inst) { int32_t ip = inst->ip; @@ -1125,6 +1126,25 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, } } + /* Don't allocate rf0 to temps that cross ranges where we have + * live implicit rf0 writes from ldvary. We can identify these + * by tracking the last ldvary instruction and explicit reads + * of rf0. + */ + if (c->devinfo->ver >= 71 && + ((inst->src[0].file == QFILE_REG && inst->src[0].index == 0) || + (vir_get_nsrc(inst) > 1 && + inst->src[1].file == QFILE_REG && inst->src[1].index == 0))) { + for (int i = 0; i < c->num_temps; i++) { + if (c->temp_start[i] < ip && + c->temp_end[i] > last_ldvary_ip) { + ra_add_node_interference(c->g, + temp_to_node(c, i), + implicit_rf_nodes[0]); + } + } + } + if (inst->dst.file == QFILE_TEMP) { /* Only a ldunif gets to write to R5, which only has a * single 32-bit channel of storage. @@ -1270,10 +1290,27 @@ v3d_register_allocate(struct v3d_compile *c) * interferences. */ int ip = 0; + int last_ldvary_ip = -1; vir_for_each_inst_inorder(inst, c) { inst->ip = ip++; + + /* ldunif(a) always write to a temporary, so we have + * liveness info available to decide if rf0 is + * available for them, however, ldvary is different: + * it always writes to rf0 directly so we don't have + * liveness information for its implicit rf0 write. + * + * That means the allocator may assign rf0 to a temp + * that is defined while an implicit rf0 write from + * ldvary is still live. We fix that by manually + * tracking rf0 live ranges from ldvary instructions. + */ + if (inst->qpu.sig.ldvary) + last_ldvary_ip = ip; + update_graph_and_reg_classes_for_inst(c, acc_nodes, - implicit_rf_nodes, inst); + implicit_rf_nodes, + last_ldvary_ip, inst); } /* Set the register classes for all our temporaries in the graph */ -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0056-broadcom-compiler-convert-mul-to-add-when-needed-to-.patch ================================================ From cbaa469c09974c1574b16f559173694904fe1bb0 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Mon, 25 Oct 2021 09:38:57 +0200 Subject: [PATCH 056/142] broadcom/compiler: convert mul to add when needed to allow merge V3D 7.x added 'mov' opcodes to the ADD alu, so now it is possible to move these to the ADD alu to facilitate merging them with other MUL instructions. --- src/broadcom/compiler/qpu_schedule.c | 102 ++++++++++++++++++++++++--- 1 file changed, 94 insertions(+), 8 deletions(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index 334ffdc6d58..caa84254998 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -1086,6 +1086,57 @@ qpu_convert_add_to_mul(struct v3d_qpu_instr *inst) inst->alu.add.b.unpack = V3D_QPU_UNPACK_NONE; } +static bool +can_do_mul_as_add(const struct v3d_device_info *devinfo, enum v3d_qpu_mul_op op) +{ + switch (op) { + case V3D_QPU_M_MOV: + case V3D_QPU_M_FMOV: + return devinfo->ver >= 71; + default: + return false; + } +} + +static enum v3d_qpu_mul_op +mul_op_as_add_op(enum v3d_qpu_mul_op op) +{ + switch (op) { + case V3D_QPU_M_MOV: + return V3D_QPU_A_MOV; + case V3D_QPU_M_FMOV: + return V3D_QPU_A_FMOV; + default: + unreachable("unexpected mov opcode"); + } +} + +static void +qpu_convert_mul_to_add(struct v3d_qpu_instr *inst) +{ + STATIC_ASSERT(sizeof(inst->alu.add) == sizeof(inst->alu.mul)); + assert(inst->alu.mul.op != V3D_QPU_M_NOP); + assert(inst->alu.add.op == V3D_QPU_A_NOP); + + memcpy(&inst->alu.add, &inst->alu.mul, sizeof(inst->alu.add)); + inst->alu.add.op = mul_op_as_add_op(inst->alu.mul.op); + inst->alu.mul.op = V3D_QPU_M_NOP; + + inst->flags.ac = inst->flags.mc; + inst->flags.apf = inst->flags.mpf; + inst->flags.auf = inst->flags.muf; + inst->flags.mc = V3D_QPU_COND_NONE; + inst->flags.mpf = V3D_QPU_PF_NONE; + inst->flags.muf = V3D_QPU_UF_NONE; + + inst->alu.add.output_pack = inst->alu.mul.output_pack; + inst->alu.add.a.unpack = inst->alu.mul.a.unpack; + inst->alu.add.b.unpack = inst->alu.mul.b.unpack; + inst->alu.mul.output_pack = V3D_QPU_PACK_NONE; + inst->alu.mul.a.unpack = V3D_QPU_UNPACK_NONE; + inst->alu.mul.b.unpack = V3D_QPU_UNPACK_NONE; +} + static bool qpu_merge_inst(const struct v3d_device_info *devinfo, struct v3d_qpu_instr *result, @@ -1151,17 +1202,52 @@ qpu_merge_inst(const struct v3d_device_info *devinfo, } } + struct v3d_qpu_instr add_inst; if (b->alu.mul.op != V3D_QPU_M_NOP) { - if (a->alu.mul.op != V3D_QPU_M_NOP) - return false; - merge.alu.mul = b->alu.mul; + if (a->alu.mul.op == V3D_QPU_M_NOP) { + merge.alu.mul = b->alu.mul; + + merge.flags.mc = b->flags.mc; + merge.flags.mpf = b->flags.mpf; + merge.flags.muf = b->flags.muf; + + mul_instr = b; + add_instr = a; + } + /* If a's mul op is used but its add op is not, then see if we + * can convert either a's mul op or b's mul op to an add op + * so we can merge. + */ + else if (a->alu.add.op == V3D_QPU_A_NOP && + can_do_mul_as_add(devinfo, b->alu.mul.op)) { + add_inst = *b; + qpu_convert_mul_to_add(&add_inst); - merge.flags.mc = b->flags.mc; - merge.flags.mpf = b->flags.mpf; - merge.flags.muf = b->flags.muf; + merge.alu.add = add_inst.alu.add; - mul_instr = b; - add_instr = a; + merge.flags.ac = b->flags.mc; + merge.flags.apf = b->flags.mpf; + merge.flags.auf = b->flags.muf; + + mul_instr = a; + add_instr = &add_inst; + } else if (a->alu.add.op == V3D_QPU_A_NOP && + can_do_mul_as_add(devinfo, a->alu.mul.op)) { + add_inst = *a; + qpu_convert_mul_to_add(&add_inst); + + merge = add_inst; + merge.alu.mul = b->alu.mul; + + merge.flags.mc = b->flags.mc; + merge.flags.mpf = b->flags.mpf; + merge.flags.muf = b->flags.muf; + + mul_instr = b; + add_instr = &add_inst; + } else { + return false; + } } /* V3D 4.x and earlier use muxes to select the inputs for the ALUs and -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0057-broadcom-compiler-implement-small-immediates-for-v71.patch ================================================ From b59b3725fb16f4ab1ac0db86a5452a4ed6176074 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 3 Nov 2021 10:34:19 +0100 Subject: [PATCH 057/142] broadcom/compiler: implement small immediates for v71 --- src/broadcom/compiler/qpu_schedule.c | 90 +++++++++++++------ src/broadcom/compiler/qpu_validate.c | 20 ++++- .../compiler/vir_opt_small_immediates.c | 26 +++++- src/broadcom/compiler/vir_to_qpu.c | 11 ++- src/broadcom/qpu/qpu_disasm.c | 1 - src/broadcom/qpu/qpu_instr.c | 8 +- src/broadcom/qpu/qpu_instr.h | 2 +- src/broadcom/qpu/qpu_pack.c | 36 ++++---- 8 files changed, 139 insertions(+), 55 deletions(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index caa84254998..bd1c920848a 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -714,7 +714,6 @@ qpu_instruction_uses_rf(const struct v3d_device_info *devinfo, !inst->sig.small_imm_b && (inst->raddr_b == waddr)) return true; } else { - /* FIXME: skip if small immediate */ if (v3d71_qpu_reads_raddr(inst, waddr)) return true; } @@ -948,10 +947,11 @@ qpu_raddrs_used(const struct v3d_qpu_instr *a, return raddrs_used; } -/* Take two instructions and attempt to merge their raddr fields - * into one merged instruction. Returns false if the two instructions - * access more than two different rf registers between them, or more - * than one rf register and one small immediate. +/* Takes two instructions and attempts to merge their raddr fields (including + * small immediates) into one merged instruction. For V3D 4.x, returns false + * if the two instructions access more than two different rf registers between + * them, or more than one rf register and one small immediate. For 7.x returns + * false if both instructions use small immediates. */ static bool qpu_merge_raddrs(struct v3d_qpu_instr *result, @@ -959,6 +959,27 @@ qpu_merge_raddrs(struct v3d_qpu_instr *result, const struct v3d_qpu_instr *mul_instr, const struct v3d_device_info *devinfo) { + if (devinfo->ver >= 71) { + assert(add_instr->sig.small_imm_a + + add_instr->sig.small_imm_b <= 1); + assert(add_instr->sig.small_imm_c + + add_instr->sig.small_imm_d == 0); + assert(mul_instr->sig.small_imm_a + + mul_instr->sig.small_imm_b == 0); + assert(mul_instr->sig.small_imm_c + + mul_instr->sig.small_imm_d <= 1); + + result->sig.small_imm_a = add_instr->sig.small_imm_a; + result->sig.small_imm_b = add_instr->sig.small_imm_b; + result->sig.small_imm_c = mul_instr->sig.small_imm_c; + result->sig.small_imm_d = mul_instr->sig.small_imm_d; + + return (result->sig.small_imm_a + + result->sig.small_imm_b + + result->sig.small_imm_c + + result->sig.small_imm_d) <= 1; + } + assert(devinfo->ver <= 42); uint64_t raddrs_used = qpu_raddrs_used(add_instr, mul_instr); @@ -1060,7 +1081,8 @@ add_op_as_mul_op(enum v3d_qpu_add_op op) } static void -qpu_convert_add_to_mul(struct v3d_qpu_instr *inst) +qpu_convert_add_to_mul(const struct v3d_device_info *devinfo, + struct v3d_qpu_instr *inst) { STATIC_ASSERT(sizeof(inst->alu.mul) == sizeof(inst->alu.add)); assert(inst->alu.add.op != V3D_QPU_A_NOP); @@ -1084,6 +1106,18 @@ qpu_convert_add_to_mul(struct v3d_qpu_instr *inst) inst->alu.add.output_pack = V3D_QPU_PACK_NONE; inst->alu.add.a.unpack = V3D_QPU_UNPACK_NONE; inst->alu.add.b.unpack = V3D_QPU_UNPACK_NONE; + + if (devinfo->ver >= 71) { + assert(!inst->sig.small_imm_c && !inst->sig.small_imm_d); + assert(inst->sig.small_imm_a + inst->sig.small_imm_b <= 1); + if (inst->sig.small_imm_a) { + inst->sig.small_imm_c = true; + inst->sig.small_imm_a = false; + } else if (inst->sig.small_imm_b) { + inst->sig.small_imm_d = true; + inst->sig.small_imm_b = false; + } + } } static bool @@ -1135,6 +1169,16 @@ qpu_convert_mul_to_add(struct v3d_qpu_instr *inst) inst->alu.mul.output_pack = V3D_QPU_PACK_NONE; inst->alu.mul.a.unpack = V3D_QPU_UNPACK_NONE; inst->alu.mul.b.unpack = V3D_QPU_UNPACK_NONE; + + assert(!inst->sig.small_imm_a && !inst->sig.small_imm_b); + assert(inst->sig.small_imm_c + inst->sig.small_imm_d <= 1); + if (inst->sig.small_imm_c) { + inst->sig.small_imm_a = true; + inst->sig.small_imm_c = false; + } else if (inst->sig.small_imm_d) { + inst->sig.small_imm_b = true; + inst->sig.small_imm_d = false; + } } static bool @@ -1173,20 +1217,20 @@ qpu_merge_inst(const struct v3d_device_info *devinfo, else if (a->alu.mul.op == V3D_QPU_M_NOP && can_do_add_as_mul(b->alu.add.op)) { mul_inst = *b; - qpu_convert_add_to_mul(&mul_inst); + qpu_convert_add_to_mul(devinfo, &mul_inst); merge.alu.mul = mul_inst.alu.mul; - merge.flags.mc = b->flags.ac; - merge.flags.mpf = b->flags.apf; - merge.flags.muf = b->flags.auf; + merge.flags.mc = mul_inst.flags.mc; + merge.flags.mpf = mul_inst.flags.mpf; + merge.flags.muf = mul_inst.flags.muf; add_instr = a; mul_instr = &mul_inst; } else if (a->alu.mul.op == V3D_QPU_M_NOP && can_do_add_as_mul(a->alu.add.op)) { mul_inst = *a; - qpu_convert_add_to_mul(&mul_inst); + qpu_convert_add_to_mul(devinfo, &mul_inst); merge = mul_inst; merge.alu.add = b->alu.add; @@ -1225,9 +1269,9 @@ qpu_merge_inst(const struct v3d_device_info *devinfo, merge.alu.add = add_inst.alu.add; - merge.flags.ac = b->flags.mc; - merge.flags.apf = b->flags.mpf; - merge.flags.auf = b->flags.muf; + merge.flags.ac = add_inst.flags.ac; + merge.flags.apf = add_inst.flags.apf; + merge.flags.auf = add_inst.flags.auf; mul_instr = a; add_instr = &add_inst; @@ -1252,17 +1296,12 @@ qpu_merge_inst(const struct v3d_device_info *devinfo, /* V3D 4.x and earlier use muxes to select the inputs for the ALUs and * they have restrictions on the number of raddrs that can be adressed - * in a single instruction. - * - * FIXME: for V3D 7.x we can't merge instructions if they address more - * than one small immediate. For now, we don't support small immediates, - * so it is not a problem. + * in a single instruction. In V3D 7.x, we don't have that restriction, + * but we are still limited to a single small immediate per instruction. */ - if (devinfo->ver <= 42) { - if (add_instr && mul_instr && - !qpu_merge_raddrs(&merge, add_instr, mul_instr, devinfo)) { - return false; - } + if (add_instr && mul_instr && + !qpu_merge_raddrs(&merge, add_instr, mul_instr, devinfo)) { + return false; } merge.sig.thrsw |= b->sig.thrsw; @@ -1273,7 +1312,6 @@ qpu_merge_inst(const struct v3d_device_info *devinfo, merge.sig.ldtmu |= b->sig.ldtmu; merge.sig.ldvary |= b->sig.ldvary; merge.sig.ldvpm |= b->sig.ldvpm; - merge.sig.small_imm_b |= b->sig.small_imm_b; merge.sig.ldtlb |= b->sig.ldtlb; merge.sig.ldtlbu |= b->sig.ldtlbu; merge.sig.ucb |= b->sig.ucb; @@ -1933,8 +1971,6 @@ qpu_inst_valid_in_thrend_slot(struct v3d_compile *c, if (c->devinfo->ver >= 71) { /* RF2-3 might be overwritten during the delay slots by * fragment shader setup. - * - * FIXME: handle small immediate cases */ if (v3d71_qpu_reads_raddr(inst, 2) || v3d71_qpu_reads_raddr(inst, 3)) { diff --git a/src/broadcom/compiler/qpu_validate.c b/src/broadcom/compiler/qpu_validate.c index fde6695d59b..41070484286 100644 --- a/src/broadcom/compiler/qpu_validate.c +++ b/src/broadcom/compiler/qpu_validate.c @@ -116,8 +116,24 @@ qpu_validate_inst(struct v3d_qpu_validate_state *state, struct qinst *qinst) return; if (devinfo->ver < 71) { - if (inst->sig.small_imm_a || inst->sig.small_imm_c || inst->sig.small_imm_d) - fail_instr(state, "small imm a/c/d added after V3D 7.1"); + if (inst->sig.small_imm_a || inst->sig.small_imm_c || + inst->sig.small_imm_d) { + fail_instr(state, "small imm a/c/d added after V3D 7.1"); + } + } else { + if ((inst->sig.small_imm_a || inst->sig.small_imm_b) && + !vir_is_add(qinst)) { + fail_instr(state, "small imm a/b used but no ADD inst"); + } + if ((inst->sig.small_imm_c || inst->sig.small_imm_d) && + !vir_is_mul(qinst)) { + fail_instr(state, "small imm c/d used but no MUL inst"); + } + if (inst->sig.small_imm_a + inst->sig.small_imm_b + + inst->sig.small_imm_c + inst->sig.small_imm_d > 1) { + fail_instr(state, "only one small immediate can be " + "enabled per instruction"); + } } /* LDVARY writes r5 two instructions later and LDUNIF writes diff --git a/src/broadcom/compiler/vir_opt_small_immediates.c b/src/broadcom/compiler/vir_opt_small_immediates.c index df0d6c36c9b..ed5bc011964 100644 --- a/src/broadcom/compiler/vir_opt_small_immediates.c +++ b/src/broadcom/compiler/vir_opt_small_immediates.c @@ -44,7 +44,9 @@ vir_opt_small_immediates(struct v3d_compile *c) /* The small immediate value sits in the raddr B field, so we * can't have 2 small immediates in one instruction (unless * they're the same value, but that should be optimized away - * elsewhere). + * elsewhere). Since 7.x we can encode small immediates in + * any raddr field, but each instruction can still only use + * one. */ bool uses_small_imm = false; for (int i = 0; i < vir_get_nsrc(inst); i++) { @@ -80,7 +82,22 @@ vir_opt_small_immediates(struct v3d_compile *c) */ struct v3d_qpu_sig new_sig = inst->qpu.sig; uint32_t sig_packed; - new_sig.small_imm_b = true; + if (c->devinfo->ver <= 42) { + new_sig.small_imm_b = true; + } else { + if (vir_is_add(inst)) { + if (i == 0) + new_sig.small_imm_a = true; + else + new_sig.small_imm_b = true; + } else { + if (i == 0) + new_sig.small_imm_c = true; + else + new_sig.small_imm_d = true; + } + } + if (!v3d_qpu_sig_pack(c->devinfo, &new_sig, &sig_packed)) continue; @@ -89,7 +106,10 @@ vir_opt_small_immediates(struct v3d_compile *c) vir_dump_inst(c, inst); fprintf(stderr, "\n"); } - inst->qpu.sig.small_imm_b = true; + inst->qpu.sig.small_imm_a = new_sig.small_imm_a; + inst->qpu.sig.small_imm_b = new_sig.small_imm_b; + inst->qpu.sig.small_imm_c = new_sig.small_imm_c; + inst->qpu.sig.small_imm_d = new_sig.small_imm_d; inst->qpu.raddr_b = packed; inst->src[i].file = QFILE_SMALL_IMM; diff --git a/src/broadcom/compiler/vir_to_qpu.c b/src/broadcom/compiler/vir_to_qpu.c index cbbb495592b..4ed184cbbcb 100644 --- a/src/broadcom/compiler/vir_to_qpu.c +++ b/src/broadcom/compiler/vir_to_qpu.c @@ -89,8 +89,15 @@ new_qpu_nop_before(struct qinst *inst) static void v3d71_set_src(struct v3d_qpu_instr *instr, uint8_t *raddr, struct qpu_reg src) { - if (src.smimm) - unreachable("v3d71_set_src: pending handling small immediates"); + /* If we have a small immediate move it from inst->raddr_b to the + * corresponding raddr. + */ + if (src.smimm) { + assert(instr->sig.small_imm_a || instr->sig.small_imm_b || + instr->sig.small_imm_c || instr->sig.small_imm_d); + *raddr = instr->raddr_b; + return; + } assert(!src.magic); *raddr = src.index; diff --git a/src/broadcom/qpu/qpu_disasm.c b/src/broadcom/qpu/qpu_disasm.c index b613de781dc..c1590a760de 100644 --- a/src/broadcom/qpu/qpu_disasm.c +++ b/src/broadcom/qpu/qpu_disasm.c @@ -113,7 +113,6 @@ v3d71_qpu_disasm_raddr(struct disasm_state *disasm, } if (is_small_imm) { - unreachable("Pending handling small immediates"); uint32_t val; ASSERTED bool ok = v3d_qpu_small_imm_unpack(disasm->devinfo, diff --git a/src/broadcom/qpu/qpu_instr.c b/src/broadcom/qpu/qpu_instr.c index f54ce7210fb..c30f4bbbccf 100644 --- a/src/broadcom/qpu/qpu_instr.c +++ b/src/broadcom/qpu/qpu_instr.c @@ -975,10 +975,10 @@ v3d71_qpu_reads_raddr(const struct v3d_qpu_instr *inst, uint8_t raddr) int add_nsrc = v3d_qpu_add_op_num_src(inst->alu.add.op); int mul_nsrc = v3d_qpu_mul_op_num_src(inst->alu.mul.op); - return (add_nsrc > 0 && inst->alu.add.a.raddr == raddr) || - (add_nsrc > 1 && inst->alu.add.b.raddr == raddr) || - (mul_nsrc > 0 && inst->alu.mul.a.raddr == raddr) || - (mul_nsrc > 1 && inst->alu.mul.b.raddr == raddr); + return (add_nsrc > 0 && !inst->sig.small_imm_a && inst->alu.add.a.raddr == raddr) || + (add_nsrc > 1 && !inst->sig.small_imm_b && inst->alu.add.b.raddr == raddr) || + (mul_nsrc > 0 && !inst->sig.small_imm_c && inst->alu.mul.a.raddr == raddr) || + (mul_nsrc > 1 && !inst->sig.small_imm_d && inst->alu.mul.b.raddr == raddr); } bool diff --git a/src/broadcom/qpu/qpu_instr.h b/src/broadcom/qpu/qpu_instr.h index dece45c5c54..d408fb426fa 100644 --- a/src/broadcom/qpu/qpu_instr.h +++ b/src/broadcom/qpu/qpu_instr.h @@ -402,7 +402,7 @@ struct v3d_qpu_instr { uint8_t sig_addr; bool sig_magic; /* If the signal writes to a magic address */ uint8_t raddr_a; /* V3D 4.x */ - uint8_t raddr_b; /* V3D 4.x*/ + uint8_t raddr_b; /* V3D 4.x (holds packed small immediate in 7.x too) */ struct v3d_qpu_flags flags; union { diff --git a/src/broadcom/qpu/qpu_pack.c b/src/broadcom/qpu/qpu_pack.c index ed5a8bc667d..7984712d527 100644 --- a/src/broadcom/qpu/qpu_pack.c +++ b/src/broadcom/qpu/qpu_pack.c @@ -1218,16 +1218,11 @@ v3d71_qpu_add_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst instr->alu.add.op = desc->op; - /* FADD/FADDNF and FMIN/FMAX are determined by the orders of the + /* FADD/FADDNF and FMIN/FMAX are determined by the order of the * operands. */ - /* FIXME: for now hardcoded values, until we got the small_imm support - * in place - */ - uint32_t small_imm_a = 0; - uint32_t small_imm_b = 0; - if (small_imm_a * 256 + ((op >> 2) & 3) * 64 + raddr_a > - small_imm_b *256 + (op & 3) * 64 + raddr_b) { + if (instr->sig.small_imm_a * 256 + ((op >> 2) & 3) * 64 + raddr_a > + instr->sig.small_imm_b * 256 + (op & 3) * 64 + raddr_b) { if (instr->alu.add.op == V3D_QPU_A_FMIN) instr->alu.add.op = V3D_QPU_A_FMAX; if (instr->alu.add.op == V3D_QPU_A_FADD) @@ -1858,11 +1853,6 @@ v3d71_qpu_add_pack(const struct v3d_device_info *devinfo, uint32_t output_pack; uint32_t a_unpack; uint32_t b_unpack; - /* FIXME: for now hardcoded values, until we got the small_imm - * support in place - */ - uint32_t small_imm_a = 0; - uint32_t small_imm_b = 0; if (instr->alu.add.op != V3D_QPU_A_FCMP) { if (!v3d_qpu_float32_pack_pack(instr->alu.add.output_pack, @@ -1886,8 +1876,8 @@ v3d71_qpu_add_pack(const struct v3d_device_info *devinfo, * distinguished by which order their operands come in. */ bool ordering = - small_imm_a * 256 + a_unpack * 64 + raddr_a > - small_imm_b * 256 + b_unpack * 64 + raddr_b; + instr->sig.small_imm_a * 256 + a_unpack * 64 + raddr_a > + instr->sig.small_imm_b * 256 + b_unpack * 64 + raddr_b; if (((instr->alu.add.op == V3D_QPU_A_FMIN || instr->alu.add.op == V3D_QPU_A_FADD) && ordering) || ((instr->alu.add.op == V3D_QPU_A_FMAX || @@ -1901,6 +1891,22 @@ v3d71_qpu_add_pack(const struct v3d_device_info *devinfo, temp = raddr_a; raddr_a = raddr_b; raddr_b = temp; + + /* If we are swapping raddr_a/b we also need to swap + * small_imm_a/b. + */ + if (instr->sig.small_imm_a || instr->sig.small_imm_b) { + assert(instr->sig.small_imm_a != + instr->sig.small_imm_b); + struct v3d_qpu_sig new_sig = instr->sig; + new_sig.small_imm_a = !instr->sig.small_imm_a; + new_sig.small_imm_b = !instr->sig.small_imm_b; + uint32_t sig; + if (!v3d_qpu_sig_pack(devinfo, &new_sig, &sig)) + return false; + *packed_instr &= ~V3D_QPU_SIG_MASK; + *packed_instr |= QPU_SET_FIELD(sig, V3D_QPU_SIG); + } } opcode |= a_unpack << 2; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0058-broadcom-compiler-update-thread-end-restrictions-for.patch ================================================ From 3af87d2672da7c928ecf8a0a1cd1bef8a6729364 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Mon, 22 Nov 2021 12:56:03 +0100 Subject: [PATCH 058/142] broadcom/compiler: update thread end restrictions for v7.x In 4.x it is not allowed to write to the register file in the last 3 instructions, but in 7.x we only have this restriction in the thread end instruction itself, and only if the write comes from the ALU ports. --- src/broadcom/compiler/qpu_schedule.c | 31 ++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index bd1c920848a..cba16c77d67 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -1938,17 +1938,30 @@ qpu_inst_valid_in_thrend_slot(struct v3d_compile *c, return false; } - /* No writing physical registers at the end. */ - bool add_is_nop = inst->alu.add.op == V3D_QPU_A_NOP; - bool mul_is_nop = inst->alu.mul.op == V3D_QPU_M_NOP; - if ((!add_is_nop && !inst->alu.add.magic_write) || - (!mul_is_nop && !inst->alu.mul.magic_write)) { - return false; + if (c->devinfo->ver <= 42) { + /* No writing physical registers at the end. */ + bool add_is_nop = inst->alu.add.op == V3D_QPU_A_NOP; + bool mul_is_nop = inst->alu.mul.op == V3D_QPU_M_NOP; + if ((!add_is_nop && !inst->alu.add.magic_write) || + (!mul_is_nop && !inst->alu.mul.magic_write)) { + return false; + } + + if (v3d_qpu_sig_writes_address(c->devinfo, &inst->sig) && + !inst->sig_magic) { + return false; + } } - if (v3d_qpu_sig_writes_address(c->devinfo, &inst->sig) && - !inst->sig_magic) { - return false; + if (c->devinfo->ver >= 71) { + /* The thread end instruction must not write to the + * register file via the add/mul ALUs. + */ + if (slot == 0 && + (!inst->alu.add.magic_write || + !inst->alu.mul.magic_write)) { + return false; + } } if (c->devinfo->ver < 40 && inst->alu.add.op == V3D_QPU_A_SETMSF) -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0059-broadcom-compiler-update-ldvary-thread-switch-delay-.patch ================================================ From 7cfd5b808bb2f1cb17f57435cb5d411c4ac3aa6c Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 23 Nov 2021 10:04:49 +0100 Subject: [PATCH 059/142] broadcom/compiler: update ldvary thread switch delay slot restriction for v7.x In V3D 7.x we don't have accumulators which would not survive a thread switch, so the only restriction is that ldvary can't be placed in the second delay slot of a thread switch. shader-db results for UnrealEngine4 shaders: total instructions in shared programs: 446458 -> 446401 (-0.01%) instructions in affected programs: 13492 -> 13435 (-0.42%) helped: 58 HURT: 3 Instructions are helped. total nops in shared programs: 19571 -> 19541 (-0.15%) nops in affected programs: 161 -> 131 (-18.63%) helped: 30 HURT: 0 Nops are helped. --- src/broadcom/compiler/qpu_schedule.c | 33 +++++++++++++++++++++------- src/broadcom/compiler/qpu_validate.c | 10 +++++++-- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index cba16c77d67..32f651851cf 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -1491,11 +1491,20 @@ retry: * ldvary now if the follow-up fixup would place * it in the delay slots of a thrsw, which is not * allowed and would prevent the fixup from being - * successful. + * successful. In V3D 7.x we can allow this to happen + * as long as it is not the last delay slot. */ - if (inst->sig.ldvary && - scoreboard->last_thrsw_tick + 2 >= scoreboard->tick - 1) { - continue; + if (inst->sig.ldvary) { + if (c->devinfo->ver <= 42 && + scoreboard->last_thrsw_tick + 2 >= + scoreboard->tick - 1) { + continue; + } + if (c->devinfo->ver >= 71 && + scoreboard->last_thrsw_tick + 2 == + scoreboard->tick - 1) { + continue; + } } /* We can emit a new tmu lookup with a previous ldtmu @@ -2020,8 +2029,12 @@ qpu_inst_before_thrsw_valid_in_delay_slot(struct v3d_compile *c, if (slot > 0 && v3d_qpu_instr_is_legacy_sfu(&qinst->qpu)) return false; - if (slot > 0 && qinst->qpu.sig.ldvary) - return false; + if (qinst->qpu.sig.ldvary) { + if (c->devinfo->ver <= 42 && slot > 0) + return false; + if (c->devinfo->ver >= 71 && slot == 2) + return false; + } /* unifa and the following 3 instructions can't overlap a * thread switch/end. The docs further clarify that this means @@ -2618,9 +2631,13 @@ fixup_pipelined_ldvary(struct v3d_compile *c, /* We can't put an ldvary in the delay slots of a thrsw. We should've * prevented this when pairing up the ldvary with another instruction - * and flagging it for a fixup. + * and flagging it for a fixup. In V3D 7.x this is limited only to the + * second delay slot. */ - assert(scoreboard->last_thrsw_tick + 2 < scoreboard->tick - 1); + assert((devinfo->ver <= 42 && + scoreboard->last_thrsw_tick + 2 < scoreboard->tick - 1) || + (devinfo->ver >= 71 && + scoreboard->last_thrsw_tick + 2 != scoreboard->tick - 1)); /* Move the ldvary to the previous instruction and remove it from the * current one. diff --git a/src/broadcom/compiler/qpu_validate.c b/src/broadcom/compiler/qpu_validate.c index 41070484286..4f09aa8aef4 100644 --- a/src/broadcom/compiler/qpu_validate.c +++ b/src/broadcom/compiler/qpu_validate.c @@ -215,8 +215,14 @@ qpu_validate_inst(struct v3d_qpu_validate_state *state, struct qinst *qinst) "SFU write started during THRSW delay slots "); } - if (inst->sig.ldvary) - fail_instr(state, "LDVARY during THRSW delay slots"); + if (inst->sig.ldvary) { + if (devinfo->ver <= 42) + fail_instr(state, "LDVARY during THRSW delay slots"); + if (devinfo->ver >= 71 && + state->ip - state->last_thrsw_ip == 2) { + fail_instr(state, "LDVARY in 2nd THRSW delay slot"); + } + } } (void)qpu_magic_waddr_matches; /* XXX */ -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0060-broadcom-compiler-lift-restriction-for-branch-msfign.patch ================================================ From ca4063d627cd31c589a8e8688f2876dd8211d1bc Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Thu, 25 Nov 2021 08:31:02 +0100 Subject: [PATCH 060/142] broadcom/compiler: lift restriction for branch + msfign after setmsf for v7.x --- src/broadcom/compiler/qpu_schedule.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index 32f651851cf..476eae691ab 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -2373,10 +2373,11 @@ emit_branch(struct v3d_compile *c, assert(scoreboard->last_branch_tick + 3 < branch_tick); assert(scoreboard->last_unifa_write_tick + 3 < branch_tick); - /* Can't place a branch with msfign != 0 and cond != 0,2,3 after + /* V3D 4.x can't place a branch with msfign != 0 and cond != 0,2,3 after * setmsf. */ bool is_safe_msf_branch = + c->devinfo->ver >= 71 || inst->qpu.branch.msfign == V3D_QPU_MSFIGN_NONE || inst->qpu.branch.cond == V3D_QPU_BRANCH_COND_ALWAYS || inst->qpu.branch.cond == V3D_QPU_BRANCH_COND_A0 || -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0061-broadcom-compiler-start-allocating-from-RF-4-in-V7.x.patch ================================================ From 167510aa43bbcf06e57a64495cee40e8cdaf5f8b Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Fri, 26 Nov 2021 10:37:05 +0100 Subject: [PATCH 061/142] broadcom/compiler: start allocating from RF 4 in V7.x In V3D 4.x we start at RF3 so that we allocate RF0-2 only if there aren't any other RFs available. This is useful with small shaders to ensure that our TLB writes don't use these registers because these are the last instructions we emit in fragment shaders and the last instructions in a program can't write to these registers, so if we do, we need to emit NOPs. In V3D 7.x the registers affected by this restriction are RF2-3, so we choose to start at RF4. --- src/broadcom/compiler/vir_register_allocate.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/broadcom/compiler/vir_register_allocate.c b/src/broadcom/compiler/vir_register_allocate.c index 6f7b1ca0589..440b093a636 100644 --- a/src/broadcom/compiler/vir_register_allocate.c +++ b/src/broadcom/compiler/vir_register_allocate.c @@ -1234,9 +1234,10 @@ v3d_register_allocate(struct v3d_compile *c) .phys_index = phys_index, .next_acc = 0, /* Start at RF3, to try to keep the TLB writes from using - * RF0-2. + * RF0-2. Start at RF4 in 7.x to prevent TLB writes from + * using RF2-3. */ - .next_phys = 3, + .next_phys = c->devinfo->ver <= 42 ? 3 : 4, .nodes = &c->nodes, .devinfo = c->devinfo, }; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0062-broadcom-compiler-validate-restrictions-after-TLB-Z-.patch ================================================ From d47ea903b96e43b07bdef21f8026da818e30fcd1 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Thu, 25 Nov 2021 13:00:34 +0100 Subject: [PATCH 062/142] broadcom/compiler: validate restrictions after TLB Z write --- src/broadcom/compiler/qpu_validate.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/broadcom/compiler/qpu_validate.c b/src/broadcom/compiler/qpu_validate.c index 4f09aa8aef4..1082fb7d50a 100644 --- a/src/broadcom/compiler/qpu_validate.c +++ b/src/broadcom/compiler/qpu_validate.c @@ -41,6 +41,7 @@ struct v3d_qpu_validate_state { int last_sfu_write; int last_branch_ip; int last_thrsw_ip; + int first_tlb_z_write; /* Set when we've found the last-THRSW signal, or if we were started * in single-segment mode. @@ -110,11 +111,37 @@ static void qpu_validate_inst(struct v3d_qpu_validate_state *state, struct qinst *qinst) { const struct v3d_device_info *devinfo = state->c->devinfo; + + if (qinst->is_tlb_z_write && state->ip < state->first_tlb_z_write) + state->first_tlb_z_write = state->ip; + const struct v3d_qpu_instr *inst = &qinst->qpu; + if (inst->type == V3D_QPU_INSTR_TYPE_BRANCH && + state->first_tlb_z_write >= 0 && + state->ip > state->first_tlb_z_write && + inst->branch.msfign != V3D_QPU_MSFIGN_NONE && + inst->branch.cond != V3D_QPU_BRANCH_COND_ALWAYS && + inst->branch.cond != V3D_QPU_BRANCH_COND_A0 && + inst->branch.cond != V3D_QPU_BRANCH_COND_NA0) { + fail_instr(state, "Implicit branch MSF read after TLB Z write"); + } + if (inst->type != V3D_QPU_INSTR_TYPE_ALU) return; + if (inst->alu.add.op == V3D_QPU_A_SETMSF && + state->first_tlb_z_write >= 0 && + state->ip > state->first_tlb_z_write) { + fail_instr(state, "SETMSF after TLB Z write"); + } + + if (state->first_tlb_z_write >= 0 && + state->ip > state->first_tlb_z_write && + inst->alu.add.op == V3D_QPU_A_MSF) { + fail_instr(state, "MSF read after TLB Z write"); + } + if (devinfo->ver < 71) { if (inst->sig.small_imm_a || inst->sig.small_imm_c || inst->sig.small_imm_d) { @@ -348,6 +375,7 @@ qpu_validate(struct v3d_compile *c) .last_sfu_write = -10, .last_thrsw_ip = -10, .last_branch_ip = -10, + .first_tlb_z_write = INT_MAX, .ip = 0, .last_thrsw_found = !c->last_thrsw, -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0063-broadcom-compiler-lift-restriction-on-vpmwt-in-last-.patch ================================================ From 6cdf01fad49489b5fc66d231b527de5245d5de32 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Mon, 29 Nov 2021 13:23:11 +0100 Subject: [PATCH 063/142] broadcom/compiler: lift restriction on vpmwt in last instruction for V3D 7.x --- src/broadcom/compiler/qpu_schedule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index 476eae691ab..77fb6a794e6 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -1934,7 +1934,7 @@ qpu_inst_valid_in_thrend_slot(struct v3d_compile *c, if (slot > 0 && qinst->uniform != ~0) return false; - if (v3d_qpu_waits_vpm(inst)) + if (c->devinfo->ver <= 42 && v3d_qpu_waits_vpm(inst)) return false; if (inst->sig.ldvary) -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0064-broadcom-compiler-fix-up-copy-propagation-for-v71.patch ================================================ From acc54637f0787ba4dc887130c25c628ccdaf4e38 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 9 Nov 2021 11:34:59 +0100 Subject: [PATCH 064/142] broadcom/compiler: fix up copy propagation for v71 Update rules for unsafe copy propagations to match v7.x. --- .../compiler/vir_opt_copy_propagate.c | 83 +++++++++++++------ 1 file changed, 56 insertions(+), 27 deletions(-) diff --git a/src/broadcom/compiler/vir_opt_copy_propagate.c b/src/broadcom/compiler/vir_opt_copy_propagate.c index c4aa7255a17..1260838ca05 100644 --- a/src/broadcom/compiler/vir_opt_copy_propagate.c +++ b/src/broadcom/compiler/vir_opt_copy_propagate.c @@ -35,7 +35,7 @@ #include "v3d_compiler.h" static bool -is_copy_mov(struct qinst *inst) +is_copy_mov(const struct v3d_device_info *devinfo, struct qinst *inst) { if (!inst) return false; @@ -62,36 +62,65 @@ is_copy_mov(struct qinst *inst) return false; } - switch (inst->src[0].file) { - case QFILE_MAGIC: - /* No copy propagating from R3/R4/R5 -- the MOVs from those - * are there to register allocate values produced into R3/4/5 - * to other regs (though hopefully r3/4/5). - */ - switch (inst->src[0].index) { - case V3D_QPU_WADDR_R3: - case V3D_QPU_WADDR_R4: - case V3D_QPU_WADDR_R5: - return false; + if (devinfo->ver <= 42) { + switch (inst->src[0].file) { + case QFILE_MAGIC: + /* No copy propagating from R3/R4/R5 -- the MOVs from + * those are there to register allocate values produced + * into R3/4/5 to other regs (though hopefully r3/4/5). + */ + switch (inst->src[0].index) { + case V3D_QPU_WADDR_R3: + case V3D_QPU_WADDR_R4: + case V3D_QPU_WADDR_R5: + return false; + default: + break; + } + break; + + case QFILE_REG: + switch (inst->src[0].index) { + case 0: + case 1: + case 2: + /* MOVs from rf0/1/2 are only to track the live + * intervals for W/centroid W/Z. + */ + return false; + } + break; + default: break; } - break; - - case QFILE_REG: - switch (inst->src[0].index) { - case 0: - case 1: - case 2: - /* MOVs from rf0/1/2 are only to track the live + } else { + assert(devinfo->ver >= 71); + switch (inst->src[0].file) { + case QFILE_REG: + switch (inst->src[0].index) { + /* MOVs from rf1/2/3 are only to track the live * intervals for W/centroid W/Z. + * + * Note: rf0 can be implicitly written by ldvary + * (no temp involved), so it is not an SSA value and + * could clash with writes to other temps that are + * also allocated to rf0. In theory, that would mean + * that we can't copy propagate from it, but we handle + * this at register allocation time, preventing temps + * from being allocated to rf0 while the rf0 value from + * ldvary is still live. */ - return false; - } - break; + case 1: + case 2: + case 3: + return false; + } + break; - default: - break; + default: + break; + } } return true; @@ -135,7 +164,7 @@ try_copy_prop(struct v3d_compile *c, struct qinst *inst, struct qinst **movs) */ struct qinst *mov = movs[inst->src[i].index]; if (!mov) { - if (!is_copy_mov(c->defs[inst->src[i].index])) + if (!is_copy_mov(c->devinfo, c->defs[inst->src[i].index])) continue; mov = c->defs[inst->src[i].index]; @@ -245,7 +274,7 @@ vir_opt_copy_propagate(struct v3d_compile *c) apply_kills(c, movs, inst); - if (is_copy_mov(inst)) + if (is_copy_mov(c->devinfo, inst)) movs[inst->dst.index] = inst; } } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0065-broadcom-qpu-new-packing-conversion-v71-instructions.patch ================================================ From c340f7f1eb4a1e5c0fafe1ea2f801f2ebaf82d8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Fri, 26 Nov 2021 01:24:12 +0100 Subject: [PATCH 065/142] broadcom/qpu: new packing/conversion v71 instructions This commits adds the qpu definitions for several new v71 instructions. Packing: * vpack does a 2x32 to 2x16 bit integer pack * v8pack: Pack 2 x 2x16 bit integers into 4x8 bits * v10pack packs parts of 2 2x16 bit integer into r10g10b10a2. * v11fpack packs parts of 2 2x16 bit float into r11g11b10 rounding to nearest Conversion to unorm/snorm: * vftounorm8/vftosnorm8: converts from 2x16-bit floating point to 2x8 bit unorm/snorm. * ftounorm16/ftosnorm16: converts floating point to 16-bit unorm/snorm * vftounorm10lo: Convert 2x16-bit floating point to 2x10-bit unorm * vftounorm10hi: Convert 2x16-bit floating point to one 2-bit and one 10-bit unorm --- src/broadcom/qpu/qpu_instr.c | 20 ++++++++++++++++++++ src/broadcom/qpu/qpu_instr.h | 12 ++++++++++++ src/broadcom/qpu/qpu_pack.c | 12 ++++++++++++ 3 files changed, 44 insertions(+) diff --git a/src/broadcom/qpu/qpu_instr.c b/src/broadcom/qpu/qpu_instr.c index c30f4bbbccf..44f20618a5a 100644 --- a/src/broadcom/qpu/qpu_instr.c +++ b/src/broadcom/qpu/qpu_instr.c @@ -179,6 +179,10 @@ v3d_qpu_add_op_name(enum v3d_qpu_add_op op) [V3D_QPU_A_UTOF] = "utof", [V3D_QPU_A_MOV] = "mov", [V3D_QPU_A_FMOV] = "fmov", + [V3D_QPU_A_VPACK] = "vpack", + [V3D_QPU_A_V8PACK] = "v8pack", + [V3D_QPU_A_V10PACK] = "v10pack", + [V3D_QPU_A_V11FPACK] = "v11fpack", }; if (op >= ARRAY_SIZE(op_names)) @@ -201,6 +205,12 @@ v3d_qpu_mul_op_name(enum v3d_qpu_mul_op op) [V3D_QPU_M_MOV] = "mov", [V3D_QPU_M_NOP] = "nop", [V3D_QPU_M_FMUL] = "fmul", + [V3D_QPU_M_FTOUNORM16] = "ftounorm16", + [V3D_QPU_M_FTOSNORM16] = "ftosnorm16", + [V3D_QPU_M_VFTOUNORM8] = "vftounorm8", + [V3D_QPU_M_VFTOSNORM8] = "vftosnorm8", + [V3D_QPU_M_VFTOUNORM10LO] = "vftounorm10lo", + [V3D_QPU_M_VFTOUNORM10HI] = "vftounorm10hi", }; if (op >= ARRAY_SIZE(op_names)) @@ -463,6 +473,10 @@ static const uint8_t add_op_args[] = { [V3D_QPU_A_MOV] = D | A, [V3D_QPU_A_FMOV] = D | A, + [V3D_QPU_A_VPACK] = D | A | B, + [V3D_QPU_A_V8PACK] = D | A | B, + [V3D_QPU_A_V10PACK] = D | A | B, + [V3D_QPU_A_V11FPACK] = D | A | B, }; static const uint8_t mul_op_args[] = { @@ -476,6 +490,12 @@ static const uint8_t mul_op_args[] = { [V3D_QPU_M_NOP] = 0, [V3D_QPU_M_MOV] = D | A, [V3D_QPU_M_FMUL] = D | A | B, + [V3D_QPU_M_FTOUNORM16] = D | A, + [V3D_QPU_M_FTOSNORM16] = D | A, + [V3D_QPU_M_VFTOUNORM8] = D | A, + [V3D_QPU_M_VFTOSNORM8] = D | A, + [V3D_QPU_M_VFTOUNORM10LO] = D | A, + [V3D_QPU_M_VFTOUNORM10HI] = D | A, }; bool diff --git a/src/broadcom/qpu/qpu_instr.h b/src/broadcom/qpu/qpu_instr.h index d408fb426fa..56eee9f9cac 100644 --- a/src/broadcom/qpu/qpu_instr.h +++ b/src/broadcom/qpu/qpu_instr.h @@ -231,6 +231,10 @@ enum v3d_qpu_add_op { /* V3D 7.x */ V3D_QPU_A_FMOV, V3D_QPU_A_MOV, + V3D_QPU_A_VPACK, + V3D_QPU_A_V8PACK, + V3D_QPU_A_V10PACK, + V3D_QPU_A_V11FPACK, }; enum v3d_qpu_mul_op { @@ -244,6 +248,14 @@ enum v3d_qpu_mul_op { V3D_QPU_M_MOV, V3D_QPU_M_NOP, V3D_QPU_M_FMUL, + + /* V3D 7.x */ + V3D_QPU_M_FTOUNORM16, + V3D_QPU_M_FTOSNORM16, + V3D_QPU_M_VFTOUNORM8, + V3D_QPU_M_VFTOSNORM8, + V3D_QPU_M_VFTOUNORM10LO, + V3D_QPU_M_VFTOUNORM10HI, }; enum v3d_qpu_output_pack { diff --git a/src/broadcom/qpu/qpu_pack.c b/src/broadcom/qpu/qpu_pack.c index 7984712d527..6cd75adac6d 100644 --- a/src/broadcom/qpu/qpu_pack.c +++ b/src/broadcom/qpu/qpu_pack.c @@ -783,6 +783,9 @@ static const struct opcode_desc add_ops_v71[] = { { 246, 246, .raddr_mask = OP_RANGE(32, 34), V3D_QPU_A_ITOF, 71 }, { 246, 246, .raddr_mask = OP_RANGE(36, 38), V3D_QPU_A_UTOF, 71 }, + { 247, 247, .raddr_mask = ANYOPMASK, V3D_QPU_A_VPACK, 71 }, + { 248, 248, .raddr_mask = ANYOPMASK, V3D_QPU_A_V8PACK, 71 }, + { 249, 249, .raddr_mask = OP_RANGE(0, 2), V3D_QPU_A_FMOV, 71 }, { 249, 249, .raddr_mask = OP_RANGE(4, 6), V3D_QPU_A_FMOV, 71 }, { 249, 249, .raddr_mask = OP_RANGE(8, 10), V3D_QPU_A_FMOV, 71 }, @@ -797,6 +800,8 @@ static const struct opcode_desc add_ops_v71[] = { { 249, 249, .raddr_mask = OP_MASK(15), V3D_QPU_A_MOV, 71 }, { 249, 249, .raddr_mask = OP_MASK(19), V3D_QPU_A_MOV, 71 }, + { 250, 250, .raddr_mask = ANYOPMASK, V3D_QPU_A_V10PACK, 71 }, + { 251, 251, .raddr_mask = ANYOPMASK, V3D_QPU_A_V11FPACK, 71 }, }; static const struct opcode_desc mul_ops_v71[] = { @@ -822,6 +827,13 @@ static const struct opcode_desc mul_ops_v71[] = { { 14, 14, .raddr_mask = OP_MASK(15), V3D_QPU_M_MOV, 71 }, { 14, 14, .raddr_mask = OP_MASK(19), V3D_QPU_M_MOV, 71 }, + { 14, 14, .raddr_mask = OP_MASK(32), V3D_QPU_M_FTOUNORM16, 71 }, + { 14, 14, .raddr_mask = OP_MASK(33), V3D_QPU_M_FTOSNORM16, 71 }, + { 14, 14, .raddr_mask = OP_MASK(34), V3D_QPU_M_VFTOUNORM8, 71 }, + { 14, 14, .raddr_mask = OP_MASK(35), V3D_QPU_M_VFTOSNORM8, 71 }, + { 14, 14, .raddr_mask = OP_MASK(48), V3D_QPU_M_VFTOUNORM10LO, 71 }, + { 14, 14, .raddr_mask = OP_MASK(49), V3D_QPU_M_VFTOUNORM10HI, 71 }, + { 14, 14, .raddr_mask = OP_MASK(63), V3D_QPU_M_NOP, 71 }, { 16, 63, .raddr_mask = ANYOPMASK, V3D_QPU_M_FMUL }, -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0066-nir-add-new-opcodes-to-map-new-v71-packing-conversio.patch ================================================ From 4f33de7771621e15aae3e3c60c09fd5a2f29bdac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Tue, 30 Nov 2021 02:39:20 +0100 Subject: [PATCH 066/142] nir: add new opcodes to map new v71 packing/conversion instructions Since v71, broadcom hw include specific packing/conversion instructions, so this commit adds opcodes to be able to make use of them, specially for image stores: * vftounorm8/vftosnorm8: 2x16-bit floating point to 2x8-bit unorm/snorm * ftounorm16/ftosnorm16: floating point to 16-bit unorm/snorm * vftounorm10lo/vftounorm10hi: used to convert a floating point to a r10g10b10a2 unorm * v11fpack: packs 2 2x16 FP into R11G11B10. * v10pack: pack 2 2x16 integer into R10G10B10A2 * v8pack: packs 2 2x16 bit integer into 4x8 bits. * vpack: 2x32 bit to 2x16 integer pack For the latter, it can be easly confused with the existing and general pack_32_2x16_split. But note that this one receives two 16bit integer, and packs them on a 32bit integer. But broadcom opcode takes two 32bit integer, takes the lower halfword, and packs them as 2x16 on a 32bit integer. Interestingly broadcom also defines a similar one that packs the higher halfword. Not used yet. FIXME: vftounorm10lo/hi constant expression implementation is somewhat convoluted. It is likely that it could be implemented in a more easy way. But it works (passing the tests added with CTS issue #3372, created with this change in mind). --- src/compiler/nir/nir_constant_expressions.py | 106 +++++++++++++++++++ src/compiler/nir/nir_opcodes.py | 44 ++++++++ 2 files changed, 150 insertions(+) diff --git a/src/compiler/nir/nir_constant_expressions.py b/src/compiler/nir/nir_constant_expressions.py index e6383b67737..46395d79a89 100644 --- a/src/compiler/nir/nir_constant_expressions.py +++ b/src/compiler/nir/nir_constant_expressions.py @@ -62,6 +62,8 @@ template = """\ #include "util/softfloat.h" #include "util/bigmath.h" #include "util/format/format_utils.h" +#include "util/format_r11g11b10f.h" +#include "util/u_math.h" #include "nir_constant_expressions.h" /** @@ -277,6 +279,110 @@ unpack_half_1x16(uint16_t u) return _mesa_half_to_float(u); } +/* Broadcom v3d specific instructions */ +/** + * Packs 2 2x16 floating split into a r11g11b10f + */ +static uint32_t v11fpack_v3d(const uint32_t src0, + const uint32_t src1) +{ + float rgb[3]; + + rgb[0] = unpack_half_1x16((src0 & 0xffff)); + rgb[1] = unpack_half_1x16((src0 >> 16)); + rgb[2] = unpack_half_1x16((src1 & 0xffff)); + + return float3_to_r11g11b10f(rgb); +} + +/** + * The three methods below are basically wrappers over pack_s/unorm_1x8/1x16, + * as it receives a uint16_t val instead of a float + */ +static uint8_t _mesa_half_to_snorm8(uint16_t val) +{ + float x = _mesa_half_to_float(val); + + return pack_snorm_1x8(x); +} + +static uint16_t _mesa_float_to_snorm16(uint32_t val) +{ + union fi aux; + aux.ui = val; + return pack_snorm_1x16(aux.f); +} + +static uint16_t _mesa_float_to_unorm16(uint32_t val) +{ + union fi aux; + aux.ui = val; + return pack_unorm_1x16(aux.f); +} + +/* FIXME: the implementation below of vftounorm10hi/lo is somewhat too + * verbose. It is likely that there would be a simpler way to implement + * it. + */ +static uint32_t float_pack16_v3d(uint32_t f32) +{ + float f = uif(f32); + return _mesa_float_to_half(f); +} + +static uint32_t float_unpack16_v3d(uint32_t f16) +{ + float f = _mesa_half_to_float(f16); + return fui(f); +} + +static uint32_t vfpack_v3d(uint32_t a, uint32_t b) +{ + return float_pack16_v3d(b) << 16 | float_pack16_v3d(a); +} + +static uint32_t vfsat_v3d(uint32_t a) +{ + return vfpack_v3d( + fui(SATURATE(_mesa_half_to_float(a & 0xffff))), + fui(SATURATE(_mesa_half_to_float(a >> 16)))); +} + +static uint32_t fmul_v3d(uint32_t a, uint32_t b) +{ + float f = uif(a); + float g = uif(b); + + float x = f * g; + + return fui(x); +} + +#define L(x) float_unpack16_v3d((x) & 0xffff) +#define H(x) float_unpack16_v3d((x) >> 16) +#define V(f,a,b) vfpack_v3d(f(L(a), L(b)), f(H(a), H(b))) + +static uint32_t vfmul_v3d(uint32_t a, uint32_t b) +{ + return V(fmul_v3d, a, b); +} + +/* Convert 2x16-bit floating point to 2x10-bit unorm */ +static uint32_t vftounorm10lo(uint32_t src0) +{ + return vfmul_v3d(vfsat_v3d(src0), 0x03ff03ff); +} + +/* + * Convert 2x16-bit floating point to one 2-bit and one + * 10-bit unorm + */ +static uint32_t vftounorm10hi(uint32_t src0) +{ + return vfmul_v3d(vfsat_v3d(src0), 0x000303ff); +} + + /* Some typed vector structures to make things like src0.y work */ typedef int8_t int1_t; typedef uint8_t uint1_t; diff --git a/src/compiler/nir/nir_opcodes.py b/src/compiler/nir/nir_opcodes.py index e4d87aa6126..63aa7cfa315 100644 --- a/src/compiler/nir/nir_opcodes.py +++ b/src/compiler/nir/nir_opcodes.py @@ -1393,6 +1393,50 @@ for (int i = 0; i < 32; i += 8) { } """) +# v3d-specific opcodes + +# v3d-specific (v71) instruction that packs parts of 2 2x16 floating point into +# r11g11b10 bits, rounding to nearest even +binop_convert("v11fpack_v3d", tuint32, tuint32, "", + "v11fpack_v3d(src0, src1)") + +# v3d-specific (v71) instruction that packs 2x32 bit to 2x16 bit integer. The +# difference with pack_32_2x16_split is that the sources are 32bit too. So it +# receives 2 32-bit integer, and pack the lower halfword as 2x16 on a 32-bit +# pack. +binop_horiz("vpack_v3d", 1, tuint32, 1, tuint32, 1, tuint32, + "(src0.x & 0xffff) | (src1.x << 16)") + +# v3d-specific (v71) instruction that packs parts of 2 2x16 integers into r10g10b10a2 +binop_convert("v10pack_v3d", tuint32, tuint32, "", + "(src0 & 0x3ff) | ((src0 >> 16) & 0x3ff) << 10 | (src1 & 0x3ff) << 20 | ((src1 >> 16) & 0x3ff) << 30") + +# v3d-specific (v71) instruction that packs 2 2x16 bit integers into 4x8 bits: +# dst[7:0] = src0[7:0] +# dst[15:8] = src0[23:16] +# dst[23:16] = src1[7:0] +# dst[31:24] = src1[23:16] +opcode("v8pack_v3d", 0, tuint32, [0, 0], [tuint32, tuint32], + False, "", + "(src0 & 0x000000ff) | (src0 & 0x00ff0000) >> 8 | (src1 & 0x000000ff) << 16 | (src1 & 0x00ff0000) << 8") + +# v3d-specific (v71) instructions to convert 2x16 floating point to 2x8 bit unorm/snorm +unop("vftounorm8_v3d", tuint32, + "_mesa_half_to_unorm(src0 & 0xffff, 8) | (_mesa_half_to_unorm(src0 >> 16, 8) << 16)") +unop("vftosnorm8_v3d", tuint32, + "_mesa_half_to_snorm(src0 & 0xffff, 8) | (_mesa_half_to_snorm(src0 >> 16, 8) << 16)") + +# v3d-specific (v71) instructions to convert 32-bit floating point to 16 bit unorm/snorm +unop("ftounorm16_v3d", tuint32, "_mesa_float_to_unorm16(src0)") +unop("ftosnorm16_v3d", tuint32, "_mesa_float_to_snorm16(src0)") + +# v3d-specific (v71) instructions to convert 2x16 bit floating points to 2x10 bit unorm +unop("vftounorm10lo_v3d", tuint32, "vftounorm10lo(src0)") + +# v3d-specific (v71) instructions to convert 2x16 bit floating points to one 2-bit +# and one 10 bit unorm +unop("vftounorm10hi_v3d", tuint32, "vftounorm10hi(src0)") + # Mali-specific opcodes unop("fsat_signed_mali", tfloat, ("fmin(fmax(src0, -1.0), 1.0)")) unop("fclamp_pos_mali", tfloat, ("fmax(src0, 0.0)")) -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0067-broadcom-compiler-update-image-store-lowering-to-use.patch ================================================ From 381c29e3ff5237c89380cc53eb2271d1985f4e34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 2 Dec 2021 13:26:43 +0100 Subject: [PATCH 067/142] broadcom/compiler: update image store lowering to use v71 new packing/conversion instructions Vulkan shaderdb stats with pattern dEQP-VK.image.*.with_format.*.*: total instructions in shared programs: 35993 -> 33245 (-7.63%) instructions in affected programs: 21153 -> 18405 (-12.99%) helped: 394 HURT: 1 Instructions are helped. total uniforms in shared programs: 8550 -> 7418 (-13.24%) uniforms in affected programs: 5136 -> 4004 (-22.04%) helped: 399 HURT: 0 Uniforms are helped. total max-temps in shared programs: 6014 -> 5905 (-1.81%) max-temps in affected programs: 473 -> 364 (-23.04%) helped: 58 HURT: 0 Max-temps are helped. total nops in shared programs: 1515 -> 1504 (-0.73%) nops in affected programs: 46 -> 35 (-23.91%) helped: 14 HURT: 2 Inconclusive result (%-change mean confidence interval includes 0). FWIW, that one HURT on the instructions count is for just one instruction. --- src/broadcom/compiler/nir_to_vir.c | 39 +++ src/broadcom/compiler/v3d_compiler.h | 16 +- .../compiler/v3d_nir_lower_image_load_store.c | 246 +++++++++++++++++- src/broadcom/compiler/vir.c | 2 +- 4 files changed, 294 insertions(+), 9 deletions(-) diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index 90fe1d1e7f0..a8cf02dd386 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -1689,6 +1689,22 @@ ntq_emit_alu(struct v3d_compile *c, nir_alu_instr *instr) result = vir_VFPACK(c, src[0], src[1]); break; + case nir_op_vpack_v3d: + result = vir_VPACK(c, src[0], src[1]); + break; + + case nir_op_v11fpack_v3d: + result = vir_V11FPACK(c, src[0], src[1]); + break; + + case nir_op_v10pack_v3d: + result = vir_V10PACK(c, src[0], src[1]); + break; + + case nir_op_v8pack_v3d: + result = vir_V8PACK(c, src[0], src[1]); + break; + case nir_op_unpack_half_2x16_split_x: result = vir_FMOV(c, src[0]); vir_set_unpack(c->defs[result.index], 0, V3D_QPU_UNPACK_L); @@ -1719,6 +1735,29 @@ ntq_emit_alu(struct v3d_compile *c, nir_alu_instr *instr) result = vir_FMOV(c, vir_SEL(c, V3D_QPU_COND_IFNA, tmp, zero)); break; } + case nir_op_vftounorm8_v3d: + result = vir_VFTOUNORM8(c, src[0]); + break; + + case nir_op_vftosnorm8_v3d: + result = vir_VFTOSNORM8(c, src[0]); + break; + + case nir_op_vftounorm10lo_v3d: + result = vir_VFTOUNORM10LO(c, src[0]); + break; + + case nir_op_vftounorm10hi_v3d: + result = vir_VFTOUNORM10HI(c, src[0]); + break; + + case nir_op_ftounorm16_v3d: + result = vir_FTOUNORM16(c, src[0]); + break; + + case nir_op_ftosnorm16_v3d: + result = vir_FTOSNORM16(c, src[0]); + break; default: fprintf(stderr, "unknown NIR ALU inst: "); diff --git a/src/broadcom/compiler/v3d_compiler.h b/src/broadcom/compiler/v3d_compiler.h index 36adf8830b5..425ab0cdf9d 100644 --- a/src/broadcom/compiler/v3d_compiler.h +++ b/src/broadcom/compiler/v3d_compiler.h @@ -1186,7 +1186,7 @@ bool v3d_nir_lower_line_smooth(nir_shader *shader); bool v3d_nir_lower_logic_ops(nir_shader *s, struct v3d_compile *c); bool v3d_nir_lower_scratch(nir_shader *s); bool v3d_nir_lower_txf_ms(nir_shader *s); -bool v3d_nir_lower_image_load_store(nir_shader *s); +bool v3d_nir_lower_image_load_store(nir_shader *s, struct v3d_compile *c); bool v3d_nir_lower_load_store_bitsize(nir_shader *s); void v3d33_vir_vpm_read_setup(struct v3d_compile *c, int num_components); @@ -1427,6 +1427,20 @@ VIR_SFU(LOG) VIR_SFU(SIN) VIR_SFU(RSQRT2) +VIR_A_ALU2(VPACK) +VIR_A_ALU2(V8PACK) +VIR_A_ALU2(V10PACK) +VIR_A_ALU2(V11FPACK) + +VIR_M_ALU1(FTOUNORM16) +VIR_M_ALU1(FTOSNORM16) + +VIR_M_ALU1(VFTOUNORM8) +VIR_M_ALU1(VFTOSNORM8) + +VIR_M_ALU1(VFTOUNORM10LO) +VIR_M_ALU1(VFTOUNORM10HI) + static inline struct qinst * vir_MOV_cond(struct v3d_compile *c, enum v3d_qpu_cond cond, struct qreg dest, struct qreg src) diff --git a/src/broadcom/compiler/v3d_nir_lower_image_load_store.c b/src/broadcom/compiler/v3d_nir_lower_image_load_store.c index 2900a29817f..bbb55be4a14 100644 --- a/src/broadcom/compiler/v3d_nir_lower_image_load_store.c +++ b/src/broadcom/compiler/v3d_nir_lower_image_load_store.c @@ -40,6 +40,10 @@ * calculations and load/store using the TMU general memory access path. */ +static const unsigned bits_8[4] = {8, 8, 8, 8}; +static const unsigned bits_16[4] = {16, 16, 16, 16}; +static const unsigned bits_1010102[4] = {10, 10, 10, 2}; + bool v3d_gl_format_is_return_32(enum pipe_format format) { @@ -59,6 +63,8 @@ v3d_gl_format_is_return_32(enum pipe_format format) /* Packs a 32-bit vector of colors in the range [0, (1 << bits[i]) - 1] to a * 32-bit SSA value, with as many channels as necessary to store all the bits + * + * This is the generic helper, using all common nir operations. */ static nir_ssa_def * pack_bits(nir_builder *b, nir_ssa_def *color, const unsigned *bits, @@ -91,8 +97,185 @@ pack_bits(nir_builder *b, nir_ssa_def *color, const unsigned *bits, return nir_vec(b, results, DIV_ROUND_UP(offset, 32)); } +/* Utility wrapper as half_2x16_split is mapped to vfpack, and sometimes it is + * just easier to read vfpack on the code, specially while using the PRM as + * reference + */ +static nir_ssa_def * +nir_vfpack(nir_builder *b, nir_ssa_def *p1, nir_ssa_def *p2) +{ + return nir_pack_half_2x16_split(b, p1, p2); +} + +static inline nir_ssa_def * +pack_11f11f10f(nir_builder *b, nir_ssa_def *color) +{ + nir_ssa_def *p1 = nir_vfpack(b, nir_channel(b, color, 0), + nir_channel(b, color, 1)); + /* FIXME: we noted that we could just use p2 again as the second + * element to pack, and CTS tests still works. Just using undef as is + * slightly more correct + */ + nir_ssa_def *undef = nir_ssa_undef(b, 1, color->bit_size); + nir_ssa_def *p2 = nir_vfpack(b, nir_channel(b, color, 2), undef); + + return nir_v11fpack_v3d(b, p1, p2); +} + +static inline nir_ssa_def * +pack_r10g10b10a2_uint(nir_builder *b, nir_ssa_def *color) +{ + nir_ssa_def *p1 = nir_vpack_v3d(b, nir_channel(b, color, 0), + nir_channel(b, color, 1)); + nir_ssa_def *p2 = nir_vpack_v3d(b, nir_channel(b, color, 2), + nir_channel(b, color, 3)); + + return nir_v10pack_v3d(b, p1, p2); +} + +static inline nir_ssa_def * +pack_r10g10b10a2_unorm(nir_builder *b, nir_ssa_def *color) +{ + nir_ssa_def *p1 = nir_vfpack(b, nir_channel(b, color, 0), + nir_channel(b, color, 1)); + p1 = nir_vftounorm10lo_v3d(b, p1); + + nir_ssa_def *p2 = nir_vfpack(b, nir_channel(b, color, 2), + nir_channel(b, color, 3)); + p2 = nir_vftounorm10hi_v3d(b, p2); + + return nir_v10pack_v3d(b, p1, p2); +} + +enum hw_conversion { + NONE, + TO_SNORM, + TO_UNORM +}; + +static inline nir_ssa_def * +pack_8bit(nir_builder *b, nir_ssa_def *color, + unsigned num_components, + enum hw_conversion conversion) +{ + /* Note that usually you should not use this method (that relies on + * custom packing) for 1 component if we are not doing any + * conversion. But we support also that case, and let the caller + * decide which method to use. + */ + nir_ssa_def *p1; + nir_ssa_def *p2; + + if (conversion == NONE) { + p1 = nir_vpack_v3d(b, nir_channel(b, color, 0), + nir_channel(b, color, num_components == 1 ? 0 : 1)); + } else { + p1 = nir_vfpack(b, nir_channel(b, color, 0), + nir_channel(b, color, num_components == 1 ? 0 : 1)); + p1 = (conversion == TO_UNORM) ? + nir_vftounorm8_v3d(b, p1) : nir_vftosnorm8_v3d(b, p1); + } + if (num_components == 4) { + if (conversion == NONE) { + p2 = nir_vpack_v3d(b, nir_channel(b, color, 2), + nir_channel(b, color, 3)); + } else { + p2 = nir_vfpack(b, nir_channel(b, color, 2), + nir_channel(b, color, 3)); + p2 = (conversion == TO_UNORM) ? + nir_vftounorm8_v3d(b, p2) : nir_vftosnorm8_v3d(b, p2); + } + } else { + /* As mentioned on the comment before, using an undef here + * would be more correct. But for this case we are getting + * worse values, and in fact even some worse instruction count + * with some CTS tests, so we just reuse the first packing + */ + p2 = p1; + } + + return nir_v8pack_v3d(b, p1, p2); +} + +static inline nir_ssa_def * +pack_16bit(nir_builder *b, nir_ssa_def *color, + unsigned num_components, + enum hw_conversion conversion) +{ + nir_ssa_def *results[2]; + nir_ssa_def *channels[4]; + + /* Note that usually you should not use this method (that relies on + * custom packing) if we are not doing any conversion. But we support + * also that case, and let the caller decide which method to use. + */ + + for (unsigned i = 0; i < num_components; i++) { + channels[i] = nir_channel(b, color, i); + switch (conversion) { + case TO_SNORM: + channels[i] = nir_ftosnorm16_v3d(b, channels[i]); + break; + case TO_UNORM: + channels[i] = nir_ftounorm16_v3d(b, channels[i]); + break; + default: + break; + } + } + + switch (num_components) { + case 1: + results[0] = channels[0]; + break; + case 4: + results[1] = nir_vpack_v3d(b, channels[2], channels[3]); + FALLTHROUGH; + case 2: + results[0] = nir_vpack_v3d(b, channels[0], channels[1]); + break; + } + + return nir_vec(b, results, DIV_ROUND_UP(num_components, 2)); +} + +static inline nir_ssa_def * +pack_xbit(nir_builder *b, nir_ssa_def *color, + unsigned num_components, + const struct util_format_channel_description *r_chan) +{ + bool pack_mask = (r_chan->type == UTIL_FORMAT_TYPE_SIGNED); + enum hw_conversion conversion = NONE; + if (r_chan->normalized) { + conversion = + (r_chan->type == UTIL_FORMAT_TYPE_UNSIGNED) ? TO_UNORM : TO_SNORM; + } + + switch (r_chan->size) { + case 8: + if (conversion == NONE && num_components < 2) + return pack_bits(b, color, bits_8, num_components, pack_mask); + else + return pack_8bit(b, color, num_components, conversion); + break; + case 16: + /* pack_mask implies that the generic packing method would + * need to include extra operations to handle negative values, + * so in that case, even without a conversion, it is better to + * use the packing using custom hw operations. + */ + if (conversion == NONE && !pack_mask) + return pack_bits(b, color, bits_16, num_components, pack_mask); + else + return pack_16bit(b, color, num_components, conversion); + break; + default: + unreachable("unrecognized bits"); + } +} + static bool -v3d_nir_lower_image_store(nir_builder *b, nir_intrinsic_instr *instr) +v3d_nir_lower_image_store_v42(nir_builder *b, nir_intrinsic_instr *instr) { enum pipe_format format = nir_intrinsic_format(instr); assert(format != PIPE_FORMAT_NONE); @@ -118,9 +301,6 @@ v3d_nir_lower_image_store(nir_builder *b, nir_intrinsic_instr *instr) */ formatted = color; } else { - static const unsigned bits_8[4] = {8, 8, 8, 8}; - static const unsigned bits_16[4] = {16, 16, 16, 16}; - static const unsigned bits_1010102[4] = {10, 10, 10, 2}; const unsigned *bits; switch (r_chan->size) { @@ -171,6 +351,52 @@ v3d_nir_lower_image_store(nir_builder *b, nir_intrinsic_instr *instr) return true; } + +static bool +v3d_nir_lower_image_store_v71(nir_builder *b, nir_intrinsic_instr *instr) +{ + enum pipe_format format = nir_intrinsic_format(instr); + assert(format != PIPE_FORMAT_NONE); + const struct util_format_description *desc = + util_format_description(format); + const struct util_format_channel_description *r_chan = &desc->channel[0]; + unsigned num_components = util_format_get_nr_components(format); + b->cursor = nir_before_instr(&instr->instr); + + nir_ssa_def *color = nir_channels(b, + nir_ssa_for_src(b, instr->src[3], 4), + (1 << num_components) - 1); + nir_ssa_def *formatted = NULL; + if (format == PIPE_FORMAT_R9G9B9E5_FLOAT) { + formatted = nir_format_pack_r9g9b9e5(b, color); + } else if (format == PIPE_FORMAT_R11G11B10_FLOAT) { + formatted = pack_11f11f10f(b, color); + } else if (format == PIPE_FORMAT_R10G10B10A2_UINT) { + formatted = pack_r10g10b10a2_uint(b, color); + } else if (format == PIPE_FORMAT_R10G10B10A2_UNORM) { + formatted = pack_r10g10b10a2_unorm(b, color); + } else if (r_chan->size == 32) { + /* For 32-bit formats, we just have to move the vector + * across (possibly reducing the number of channels). + */ + formatted = color; + } else if (r_chan->type == UTIL_FORMAT_TYPE_FLOAT) { + assert(r_chan->size == 16); + formatted = nir_format_float_to_half(b, color); + formatted = pack_bits(b, formatted, bits_16, num_components, + false); + } else { + assert(r_chan->size == 8 || r_chan->size == 16); + formatted = pack_xbit(b, color, num_components, r_chan); + } + + nir_instr_rewrite_src(&instr->instr, &instr->src[3], + nir_src_for_ssa(formatted)); + instr->num_components = formatted->num_components; + + return true; +} + static bool v3d_nir_lower_image_load(nir_builder *b, nir_intrinsic_instr *instr) { @@ -215,11 +441,17 @@ v3d_nir_lower_image_load_store_cb(nir_builder *b, nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); + struct v3d_compile *c = (struct v3d_compile *) _state; + switch (intr->intrinsic) { case nir_intrinsic_image_load: return v3d_nir_lower_image_load(b, intr); case nir_intrinsic_image_store: - return v3d_nir_lower_image_store(b, intr); + if (c->devinfo->ver >= 71) + return v3d_nir_lower_image_store_v71(b, intr); + else + return v3d_nir_lower_image_store_v42(b, intr); + break; default: return false; } @@ -228,9 +460,9 @@ v3d_nir_lower_image_load_store_cb(nir_builder *b, } bool -v3d_nir_lower_image_load_store(nir_shader *s) +v3d_nir_lower_image_load_store(nir_shader *s, struct v3d_compile *c) { return nir_shader_instructions_pass(s, v3d_nir_lower_image_load_store_cb, nir_metadata_block_index | - nir_metadata_dominance, NULL); + nir_metadata_dominance, c); } diff --git a/src/broadcom/compiler/vir.c b/src/broadcom/compiler/vir.c index aea113f050e..7612eed7130 100644 --- a/src/broadcom/compiler/vir.c +++ b/src/broadcom/compiler/vir.c @@ -1576,7 +1576,7 @@ v3d_attempt_compile(struct v3d_compile *c) NIR_PASS(_, c->s, v3d_nir_lower_io, c); NIR_PASS(_, c->s, v3d_nir_lower_txf_ms); - NIR_PASS(_, c->s, v3d_nir_lower_image_load_store); + NIR_PASS(_, c->s, v3d_nir_lower_image_load_store, c); NIR_PASS(_, c->s, nir_opt_idiv_const, 8); nir_lower_idiv_options idiv_options = { -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0068-broadcom-compiler-don-t-allocate-spill-base-to-rf0-i.patch ================================================ From f6082e941a3454c8735df2ff2713ae49b3daa74f Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 18 Apr 2023 08:50:13 +0200 Subject: [PATCH 068/142] broadcom/compiler: don't allocate spill base to rf0 in V3D 7.x Otherwise it can be stomped by instructions doing implicit rf0 writes. --- src/broadcom/compiler/vir_register_allocate.c | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/broadcom/compiler/vir_register_allocate.c b/src/broadcom/compiler/vir_register_allocate.c index 440b093a636..121c9b2794f 100644 --- a/src/broadcom/compiler/vir_register_allocate.c +++ b/src/broadcom/compiler/vir_register_allocate.c @@ -582,7 +582,8 @@ interferes(int32_t t0_start, int32_t t0_end, int32_t t1_start, int32_t t1_end) } static void -v3d_spill_reg(struct v3d_compile *c, int *acc_nodes, int spill_temp) +v3d_spill_reg(struct v3d_compile *c, int *acc_nodes, int *implicit_rf_nodes, + int spill_temp) { c->spill_start_num_temps = c->num_temps; c->spilling = true; @@ -594,8 +595,20 @@ v3d_spill_reg(struct v3d_compile *c, int *acc_nodes, int spill_temp) spill_offset = c->spill_size; c->spill_size += V3D_CHANNELS * sizeof(uint32_t); - if (spill_offset == 0) + if (spill_offset == 0) { v3d_setup_spill_base(c); + + /* Don't allocate our spill base to rf0 to avoid + * conflicts with instructions doing implicit writes + * to that register. + */ + if (!c->devinfo->has_accumulators) { + ra_add_node_interference( + c->g, + temp_to_node(c, c->spill_base.index), + implicit_rf_nodes[0]); + } + } } struct qinst *last_thrsw = c->last_thrsw; @@ -1346,7 +1359,7 @@ v3d_register_allocate(struct v3d_compile *c) int node = v3d_choose_spill_node(c); uint32_t temp = node_to_temp(c, node); if (node != -1) { - v3d_spill_reg(c, acc_nodes, temp); + v3d_spill_reg(c, acc_nodes, implicit_rf_nodes, temp); continue; } } @@ -1363,7 +1376,7 @@ v3d_register_allocate(struct v3d_compile *c) enum temp_spill_type spill_type = get_spill_type_for_temp(c, temp); if (spill_type != SPILL_TYPE_TMU || tmu_spilling_allowed(c)) { - v3d_spill_reg(c, acc_nodes, temp); + v3d_spill_reg(c, acc_nodes, implicit_rf_nodes, temp); if (c->spills + c->fills > c->max_tmu_spills) goto spill_fail; } else { -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0069-broadcom-compiler-improve-allocation-for-final-progr.patch ================================================ From 0e9577fbb18a026390f653ca22f5a98a69a5fe59 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 2 May 2023 10:12:37 +0200 Subject: [PATCH 069/142] broadcom/compiler: improve allocation for final program instructions The last 3 instructions can't use specific registers so flag all the nodes for temps used in the last program instructions and try to avoid assigning any of these. This may help us avoid injecting nops for the last thread switch instruction. Because regisster allocation needs to happen before QPU scheduling and instruction merging we can't tell exactly what the last 3 instructions will be, so we do this for a few more instructions than just 3. We only do this for fragment shaders because other shader stages always end with VPM store instructions that take an small immediate and therefore will never allow us to merge the final thread switch earlier, so limiting allocation for these shaders will never improve anything and might instead be detrimental. total instructions in shared programs: 11471389 -> 11464335 (-0.06%) instructions in affected programs: 582908 -> 575854 (-1.21%) helped: 4669 HURT: 578 Instructions are helped. total max-temps in shared programs: 2230497 -> 2230150 (-0.02%) max-temps in affected programs: 5662 -> 5315 (-6.13%) helped: 344 HURT: 44 Max-temps are helped. total sfu-stalls in shared programs: 18068 -> 18077 (0.05%) sfu-stalls in affected programs: 264 -> 273 (3.41%) helped: 37 HURT: 48 Inconclusive result (value mean confidence interval includes 0). total inst-and-stalls in shared programs: 11489457 -> 11482412 (-0.06%) inst-and-stalls in affected programs: 585180 -> 578135 (-1.20%) helped: 4659 HURT: 588 Inst-and-stalls are helped. total nops in shared programs: 301738 -> 298140 (-1.19%) nops in affected programs: 14680 -> 11082 (-24.51%) helped: 3252 HURT: 108 Nops are helped. --- src/broadcom/compiler/v3d_compiler.h | 1 + src/broadcom/compiler/vir_register_allocate.c | 69 +++++++++++++++++-- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/broadcom/compiler/v3d_compiler.h b/src/broadcom/compiler/v3d_compiler.h index 425ab0cdf9d..2642d23b629 100644 --- a/src/broadcom/compiler/v3d_compiler.h +++ b/src/broadcom/compiler/v3d_compiler.h @@ -613,6 +613,7 @@ struct v3d_ra_node_info { struct { uint32_t priority; uint8_t class_bits; + bool is_program_end; /* V3D 7.x */ bool is_ldunif_dst; diff --git a/src/broadcom/compiler/vir_register_allocate.c b/src/broadcom/compiler/vir_register_allocate.c index 121c9b2794f..495644bb557 100644 --- a/src/broadcom/compiler/vir_register_allocate.c +++ b/src/broadcom/compiler/vir_register_allocate.c @@ -385,6 +385,7 @@ add_node(struct v3d_compile *c, uint32_t temp, uint8_t class_bits) c->nodes.info[node].class_bits = class_bits; c->nodes.info[node].priority = 0; c->nodes.info[node].is_ldunif_dst = false; + c->nodes.info[node].is_program_end = false; } /* The spill offset for this thread takes a bit of setup, so do it once at @@ -929,6 +930,17 @@ v3d_ra_select_rf(struct v3d_ra_select_callback_data *v3d_ra, return true; } + /* The last 3 instructions in a shader can't use some specific registers + * (usually early rf registers, depends on v3d version) so try to + * avoid allocating these to registers used by the last instructions + * in the shader. + */ + const uint32_t safe_rf_start = v3d_ra->devinfo->ver <= 42 ? 3 : 4; + if (v3d_ra->nodes->info[node].is_program_end && + v3d_ra->next_phys < safe_rf_start) { + v3d_ra->next_phys = safe_rf_start; + } + for (int i = 0; i < PHYS_COUNT; i++) { int phys_off = (v3d_ra->next_phys + i) % PHYS_COUNT; int phys = v3d_ra->phys_index + phys_off; @@ -1218,6 +1230,44 @@ update_graph_and_reg_classes_for_inst(struct v3d_compile *c, } } +static void +flag_program_end_nodes(struct v3d_compile *c) +{ + /* Only look for registers used in this many instructions */ + uint32_t last_set_count = 6; + + struct qblock *last_block = vir_exit_block(c); + list_for_each_entry_rev(struct qinst, inst, &last_block->instructions, link) { + if (!inst->qpu.type == V3D_QPU_INSTR_TYPE_ALU) + continue; + + int num_src = v3d_qpu_add_op_num_src(inst->qpu.alu.add.op); + for (int i = 0; i < num_src; i++) { + if (inst->src[i].file == QFILE_TEMP) { + int node = temp_to_node(c, inst->src[i].index); + c->nodes.info[node].is_program_end = true; + } + } + + num_src = v3d_qpu_mul_op_num_src(inst->qpu.alu.mul.op); + for (int i = 0; i < num_src; i++) { + if (inst->src[i].file == QFILE_TEMP) { + int node = temp_to_node(c, inst->src[i].index); + c->nodes.info[node].is_program_end = true; + + } + } + + if (inst->dst.file == QFILE_TEMP) { + int node = temp_to_node(c, inst->dst.index); + c->nodes.info[node].is_program_end = true; + } + + if (--last_set_count == 0) + break; + } +} + /** * Returns a mapping from QFILE_TEMP indices to struct qpu_regs. * @@ -1280,17 +1330,16 @@ v3d_register_allocate(struct v3d_compile *c) */ for (uint32_t i = 0; i < num_ra_nodes; i++) { c->nodes.info[i].is_ldunif_dst = false; + c->nodes.info[i].is_program_end = false; + c->nodes.info[i].priority = 0; + c->nodes.info[i].class_bits = 0; if (c->devinfo->has_accumulators && i < ACC_COUNT) { acc_nodes[i] = i; ra_set_node_reg(c->g, acc_nodes[i], ACC_INDEX + i); - c->nodes.info[i].priority = 0; - c->nodes.info[i].class_bits = 0; } else if (!c->devinfo->has_accumulators && i < ARRAY_SIZE(implicit_rf_nodes)) { implicit_rf_nodes[i] = i; ra_set_node_reg(c->g, implicit_rf_nodes[i], phys_index + i); - c->nodes.info[i].priority = 0; - c->nodes.info[i].class_bits = 0; } else { uint32_t t = node_to_temp(c, i); c->nodes.info[i].priority = @@ -1327,6 +1376,18 @@ v3d_register_allocate(struct v3d_compile *c) last_ldvary_ip, inst); } + /* Flag the nodes that are used in the last instructions of the program + * (there are some registers that cannot be used in the last 3 + * instructions). We only do this for fragment shaders, because the idea + * is that by avoiding this conflict we may be able to emit the last + * thread switch earlier in some cases, however, in non-fragment shaders + * this won't happen because the last instructions are always VPM stores + * with a small immediate, which conflicts with other signals, + * preventing us from ever moving the thrsw earlier. + */ + if (c->s->info.stage == MESA_SHADER_FRAGMENT) + flag_program_end_nodes(c); + /* Set the register classes for all our temporaries in the graph */ for (uint32_t i = 0; i < c->num_temps; i++) { ra_set_node_class(c->g, temp_to_node(c, i), -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0070-broadcom-compiler-don-t-assign-registers-to-unused-n.patch ================================================ From 645fe451bcecbe3345a144222306d06fb39f6b9f Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 2 May 2023 10:17:47 +0200 Subject: [PATCH 070/142] broadcom/compiler: don't assign registers to unused nodes/temps In programs with a lot of unused temps, if we don't do this, we may end up recycling previously used rfs more often, which can be detrimental to instruction pairing. total instructions in shared programs: 11464335 -> 11444136 (-0.18%) instructions in affected programs: 8976743 -> 8956544 (-0.23%) helped: 33196 HURT: 33778 Inconclusive result total max-temps in shared programs: 2230150 -> 2229445 (-0.03%) max-temps in affected programs: 86413 -> 85708 (-0.82%) helped: 2217 HURT: 1523 Max-temps are helped. total sfu-stalls in shared programs: 18077 -> 17104 (-5.38%) sfu-stalls in affected programs: 8669 -> 7696 (-11.22%) helped: 2657 HURT: 2182 Sfu-stalls are helped. total inst-and-stalls in shared programs: 11482412 -> 11461240 (-0.18%) inst-and-stalls in affected programs: 8995697 -> 8974525 (-0.24%) helped: 33319 HURT: 33708 Inconclusive result total nops in shared programs: 298140 -> 296185 (-0.66%) nops in affected programs: 52805 -> 50850 (-3.70%) helped: 3797 HURT: 2662 Inconclusive result --- src/broadcom/compiler/v3d_compiler.h | 1 + src/broadcom/compiler/vir_register_allocate.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/broadcom/compiler/v3d_compiler.h b/src/broadcom/compiler/v3d_compiler.h index 2642d23b629..f1a807e38fd 100644 --- a/src/broadcom/compiler/v3d_compiler.h +++ b/src/broadcom/compiler/v3d_compiler.h @@ -614,6 +614,7 @@ struct v3d_ra_node_info { uint32_t priority; uint8_t class_bits; bool is_program_end; + bool unused; /* V3D 7.x */ bool is_ldunif_dst; diff --git a/src/broadcom/compiler/vir_register_allocate.c b/src/broadcom/compiler/vir_register_allocate.c index 495644bb557..0ab0474424f 100644 --- a/src/broadcom/compiler/vir_register_allocate.c +++ b/src/broadcom/compiler/vir_register_allocate.c @@ -386,6 +386,7 @@ add_node(struct v3d_compile *c, uint32_t temp, uint8_t class_bits) c->nodes.info[node].priority = 0; c->nodes.info[node].is_ldunif_dst = false; c->nodes.info[node].is_program_end = false; + c->nodes.info[node].unused = false; } /* The spill offset for this thread takes a bit of setup, so do it once at @@ -918,6 +919,12 @@ v3d_ra_select_rf(struct v3d_ra_select_callback_data *v3d_ra, BITSET_WORD *regs, unsigned int *out) { + /* If this node is for an unused temp, ignore. */ + if (v3d_ra->nodes->info[node].unused) { + *out = 0; + return true; + } + /* In V3D 7.x, try to assign rf0 to temps used as ldunif's dst * so we can avoid turning them into ldunifrf (which uses the * cond field to encode the dst and would prevent merge with @@ -1331,6 +1338,7 @@ v3d_register_allocate(struct v3d_compile *c) for (uint32_t i = 0; i < num_ra_nodes; i++) { c->nodes.info[i].is_ldunif_dst = false; c->nodes.info[i].is_program_end = false; + c->nodes.info[i].unused = false; c->nodes.info[i].priority = 0; c->nodes.info[i].class_bits = 0; if (c->devinfo->has_accumulators && i < ACC_COUNT) { @@ -1396,6 +1404,12 @@ v3d_register_allocate(struct v3d_compile *c) /* Add register interferences based on liveness data */ for (uint32_t i = 0; i < c->num_temps; i++) { + /* And while we are here, let's also flag nodes for + * unused temps. + */ + if (c->temp_start[i] > c->temp_end[i]) + c->nodes.info[temp_to_node(c, i)].unused = true; + for (uint32_t j = i + 1; j < c->num_temps; j++) { if (interferes(c->temp_start[i], c->temp_end[i], c->temp_start[j], c->temp_end[j])) { -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0071-broadcom-compiler-only-assign-rf0-as-last-resort-in-.patch ================================================ From 851704169d59e28c5429b06d05e5ef952be893a2 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Mon, 15 May 2023 10:02:10 +0200 Subject: [PATCH 071/142] broadcom/compiler: only assign rf0 as last resort in V3D 7.x So we can use it for ldunif(a) and avoid generating ldunif(a)rf which can't be paired with conditional instructions. shader-db (pi5): total instructions in shared programs: 11357802 -> 11338883 (-0.17%) instructions in affected programs: 7117889 -> 7098970 (-0.27%) helped: 24264 HURT: 17574 Instructions are helped. total uniforms in shared programs: 3857808 -> 3857815 (<.01%) uniforms in affected programs: 92 -> 99 (7.61%) helped: 0 HURT: 1 total max-temps in shared programs: 2230904 -> 2230199 (-0.03%) max-temps in affected programs: 52309 -> 51604 (-1.35%) helped: 1219 HURT: 725 Max-temps are helped. total sfu-stalls in shared programs: 15021 -> 15236 (1.43%) sfu-stalls in affected programs: 6848 -> 7063 (3.14%) helped: 1866 HURT: 1704 Inconclusive result total inst-and-stalls in shared programs: 11372823 -> 11354119 (-0.16%) inst-and-stalls in affected programs: 7149177 -> 7130473 (-0.26%) helped: 24315 HURT: 17561 Inst-and-stalls are helped. total nops in shared programs: 273624 -> 273711 (0.03%) nops in affected programs: 31562 -> 31649 (0.28%) helped: 1619 HURT: 1854 Inconclusive result (value mean confidence interval includes 0). --- src/broadcom/compiler/vir_register_allocate.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/broadcom/compiler/vir_register_allocate.c b/src/broadcom/compiler/vir_register_allocate.c index 0ab0474424f..8eac2b75bd7 100644 --- a/src/broadcom/compiler/vir_register_allocate.c +++ b/src/broadcom/compiler/vir_register_allocate.c @@ -950,6 +950,11 @@ v3d_ra_select_rf(struct v3d_ra_select_callback_data *v3d_ra, for (int i = 0; i < PHYS_COUNT; i++) { int phys_off = (v3d_ra->next_phys + i) % PHYS_COUNT; + + /* Try to keep rf0 available for ldunif in 7.x (see above). */ + if (v3d_ra->devinfo->ver >= 71 && phys_off == 0) + continue; + int phys = v3d_ra->phys_index + phys_off; if (BITSET_TEST(regs, phys)) { @@ -959,6 +964,14 @@ v3d_ra_select_rf(struct v3d_ra_select_callback_data *v3d_ra, } } + /* If we couldn't allocate, do try to assign rf0 if it is available. */ + if (v3d_ra->devinfo->ver >= 71 && + BITSET_TEST(regs, v3d_ra->phys_index)) { + v3d_ra->next_phys = 1; + *out = v3d_ra->phys_index; + return true; + } + return false; } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0072-v3dv-recover-non-conformant-warning-for-not-fully-su.patch ================================================ From 0d3fd30d67ffc0195b0783e30ab6afbbe403310a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Wed, 28 Apr 2021 14:31:38 +0200 Subject: [PATCH 072/142] v3dv: recover non-conformant warning for not fully supported hw --- src/broadcom/vulkan/v3dv_device.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index d5de3517670..d29ffad3531 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -1212,6 +1212,12 @@ create_physical_device(struct v3dv_instance *instance, list_addtail(&device->vk.link, &instance->vk.physical_devices.list); + if (device->devinfo.ver != 42) { + fprintf(stderr, "WARNING: v3dv support for hw version %i is neither " + "a complete nor a conformant Vulkan implementation. Testing " + "use only.\n", device->devinfo.ver); + } + return VK_SUCCESS; fail: -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0073-v3dv-meson-add-v71-hw-generation.patch ================================================ From 52b5ac62b367ae89574c8031fdcf7c1dae05c942 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Tue, 29 Jun 2021 11:59:53 +0200 Subject: [PATCH 073/142] v3dv/meson: add v71 hw generation Starting point for v71 version inclusion. This just adds it as one of the versions to be compiled (on meson), updates the v3dX/v3dv_X macros, and update the code enough to get it compiling when building using the two versions. For any packet not available on v71 we just provide a generic asserted placeholder of generation not supported. Any real v71 support will be implemented on following commits. --- src/broadcom/vulkan/meson.build | 6 +- src/broadcom/vulkan/v3dv_private.h | 7 +++ src/broadcom/vulkan/v3dvx_cmd_buffer.c | 75 +++++++++++++++++++++++-- src/broadcom/vulkan/v3dvx_image.c | 16 +++++- src/broadcom/vulkan/v3dvx_meta_common.c | 32 +++++++++++ src/broadcom/vulkan/v3dvx_pipeline.c | 5 ++ src/broadcom/vulkan/v3dvx_queue.c | 11 ++++ 7 files changed, 142 insertions(+), 10 deletions(-) diff --git a/src/broadcom/vulkan/meson.build b/src/broadcom/vulkan/meson.build index ad032d832ad..3da7364686f 100644 --- a/src/broadcom/vulkan/meson.build +++ b/src/broadcom/vulkan/meson.build @@ -27,6 +27,7 @@ v3dv_entrypoints = custom_target( '--out-h', '@OUTPUT0@', '--out-c', '@OUTPUT1@', '--prefix', 'v3dv', '--beta', with_vulkan_beta.to_string(), '--device-prefix', 'ver42', + '--device-prefix', 'ver71', ], depend_files : vk_entrypoints_gen_depend_files, ) @@ -67,10 +68,7 @@ files_per_version = files( 'v3dvx_queue.c', ) -# The vulkan driver only supports version >= 42, which is the version present in -# Rpi4. We need to explicitly set it as we are reusing pieces from the GL v3d -# driver. -v3d_versions = ['42'] +v3d_versions = ['42', '71'] v3dv_flags = [] diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index c6707211529..6bdf338c67b 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -2608,6 +2608,9 @@ u64_compare(const void *key1, const void *key2) case 42: \ v3d_X_thing = &v3d42_##thing; \ break; \ + case 71: \ + v3d_X_thing = &v3d71_##thing; \ + break; \ default: \ unreachable("Unsupported hardware generation"); \ } \ @@ -2626,6 +2629,10 @@ u64_compare(const void *key1, const void *key2) # define v3dX(x) v3d42_##x # include "v3dvx_private.h" # undef v3dX + +# define v3dX(x) v3d71_##x +# include "v3dvx_private.h" +# undef v3dX #endif #ifdef ANDROID diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index f182b790d36..b958e634c82 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -56,10 +56,15 @@ v3dX(job_emit_enable_double_buffer)(struct v3dv_job *job) }; config.width_in_pixels = tiling->width; config.height_in_pixels = tiling->height; +#if V3D_VERSION == 42 config.number_of_render_targets = MAX2(tiling->render_target_count, 1); config.multisample_mode_4x = tiling->msaa; config.double_buffer_in_non_ms_mode = tiling->double_buffer; config.maximum_bpp_of_all_render_targets = tiling->internal_bpp; +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif uint8_t *rewrite_addr = (uint8_t *)job->bcl_tile_binning_mode_ptr; cl_packet_pack(TILE_BINNING_MODE_CFG)(NULL, rewrite_addr, &config); @@ -82,10 +87,15 @@ v3dX(job_emit_binning_prolog)(struct v3dv_job *job, cl_emit(&job->bcl, TILE_BINNING_MODE_CFG, config) { config.width_in_pixels = tiling->width; config.height_in_pixels = tiling->height; +#if V3D_VERSION == 42 config.number_of_render_targets = MAX2(tiling->render_target_count, 1); config.multisample_mode_4x = tiling->msaa; config.double_buffer_in_non_ms_mode = tiling->double_buffer; config.maximum_bpp_of_all_render_targets = tiling->internal_bpp; +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif } /* There's definitely nothing in the VCD cache we want. */ @@ -649,10 +659,15 @@ cmd_buffer_render_pass_emit_stores(struct v3dv_cmd_buffer *cmd_buffer, * bit and instead we have to emit a single clear of all tile buffers. */ if (use_global_zs_clear || use_global_rt_clear) { +#if V3D_VERSION == 42 cl_emit(cl, CLEAR_TILE_BUFFERS, clear) { clear.clear_z_stencil_buffer = use_global_zs_clear; clear.clear_all_render_targets = use_global_rt_clear; } +#endif +#if V3D_VERSION >= 71 + unreachable("Hardware generation 71 not supported yet."); +#endif } } @@ -824,7 +839,12 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) config.number_of_render_targets = MAX2(subpass->color_count, 1); config.multisample_mode_4x = tiling->msaa; config.double_buffer_in_non_ms_mode = tiling->double_buffer; +#if V3D_VERSION == 42 config.maximum_bpp_of_all_render_targets = tiling->internal_bpp; +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif if (ds_attachment_idx != VK_ATTACHMENT_UNUSED) { const struct v3dv_image_view *iview = @@ -920,7 +940,7 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) const struct v3d_resource_slice *slice = &image->planes[plane].slices[iview->vk.base_mip_level]; - const uint32_t *clear_color = + UNUSED const uint32_t *clear_color = &state->attachments[attachment_idx].clear_value.color[0]; uint32_t clear_pad = 0; @@ -937,13 +957,19 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) } } +#if V3D_VERSION == 42 cl_emit(rcl, TILE_RENDERING_MODE_CFG_CLEAR_COLORS_PART1, clear) { clear.clear_color_low_32_bits = clear_color[0]; clear.clear_color_next_24_bits = clear_color[1] & 0xffffff; clear.render_target_number = i; }; +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif if (iview->planes[0].internal_bpp >= V3D_INTERNAL_BPP_64) { +#if V3D_VERSION == 42 cl_emit(rcl, TILE_RENDERING_MODE_CFG_CLEAR_COLORS_PART2, clear) { clear.clear_color_mid_low_32_bits = ((clear_color[1] >> 24) | (clear_color[2] << 8)); @@ -951,17 +977,28 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) ((clear_color[2] >> 24) | ((clear_color[3] & 0xffff) << 8)); clear.render_target_number = i; }; +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif + } if (iview->planes[0].internal_bpp >= V3D_INTERNAL_BPP_128 || clear_pad) { +#if V3D_VERSION == 42 cl_emit(rcl, TILE_RENDERING_MODE_CFG_CLEAR_COLORS_PART3, clear) { clear.uif_padded_height_in_uif_blocks = clear_pad; clear.clear_color_high_16_bits = clear_color[3] >> 16; clear.render_target_number = i; }; +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif } } +#if V3D_VERSION == 42 cl_emit(rcl, TILE_RENDERING_MODE_CFG_COLOR, rt) { v3dX(cmd_buffer_render_pass_setup_render_target) (cmd_buffer, 0, &rt.render_target_0_internal_bpp, @@ -976,6 +1013,10 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) (cmd_buffer, 3, &rt.render_target_3_internal_bpp, &rt.render_target_3_internal_type, &rt.render_target_3_clamp); } +#endif +#if V3D_VERSION >= 71 + unreachable("Hardware generation 71 not supported yet."); +#endif /* Ends rendering mode config. */ if (ds_attachment_idx != VK_ATTACHMENT_UNUSED) { @@ -1036,10 +1077,15 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) } if (cmd_buffer->state.tile_aligned_render_area && (i == 0 || v3dv_do_double_initial_tile_clear(tiling))) { +#if V3D_VERSION == 42 cl_emit(rcl, CLEAR_TILE_BUFFERS, clear) { clear.clear_z_stencil_buffer = !job->early_zs_clear; clear.clear_all_render_targets = true; } +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif } cl_emit(rcl, END_OF_TILE_MARKER, end); } @@ -1065,7 +1111,9 @@ v3dX(cmd_buffer_emit_viewport)(struct v3dv_cmd_buffer *cmd_buffer) * now, would need to change if we allow multiple viewports */ float *vptranslate = dynamic->viewport.translate[0]; +#if V3D_VERSION == 42 float *vpscale = dynamic->viewport.scale[0]; +#endif struct v3dv_job *job = cmd_buffer->state.job; assert(job); @@ -1078,10 +1126,15 @@ v3dX(cmd_buffer_emit_viewport)(struct v3dv_cmd_buffer *cmd_buffer) v3dv_cl_ensure_space_with_branch(&job->bcl, required_cl_size); v3dv_return_if_oom(cmd_buffer, NULL); +#if V3D_VERSION == 42 cl_emit(&job->bcl, CLIPPER_XY_SCALING, clip) { clip.viewport_half_width_in_1_256th_of_pixel = vpscale[0] * 256.0f; clip.viewport_half_height_in_1_256th_of_pixel = vpscale[1] * 256.0f; } +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif float translate_z, scale_z; v3dv_cmd_buffer_state_get_viewport_z_xform(&cmd_buffer->state, 0, @@ -1591,16 +1644,20 @@ v3dX(cmd_buffer_emit_configuration_bits)(struct v3dv_cmd_buffer *cmd_buffer) struct v3dv_pipeline *pipeline = cmd_buffer->state.gfx.pipeline; assert(pipeline); - bool enable_ez = job_update_ez_state(job, pipeline, cmd_buffer); - v3dv_cl_ensure_space_with_branch(&job->bcl, cl_packet_length(CFG_BITS)); v3dv_return_if_oom(cmd_buffer, NULL); +#if V3D_VERSION == 42 + bool enable_ez = job_update_ez_state(job, pipeline, cmd_buffer); cl_emit_with_prepacked(&job->bcl, CFG_BITS, pipeline->cfg_bits, config) { config.early_z_enable = enable_ez; config.early_z_updates_enable = config.early_z_enable && pipeline->z_updates_enable; } +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif } void @@ -2031,10 +2088,12 @@ v3dX(cmd_buffer_emit_gl_shader_state)(struct v3dv_cmd_buffer *cmd_buffer) pipeline->vpm_cfg.Gv); } +#if V3D_VERSION == 42 struct v3dv_bo *default_attribute_values = pipeline->default_attribute_values != NULL ? pipeline->default_attribute_values : pipeline->device->default_attribute_float; +#endif cl_emit_with_prepacked(&job->indirect, GL_SHADER_STATE_RECORD, pipeline->shader_state_record, shader) { @@ -2060,8 +2119,10 @@ v3dX(cmd_buffer_emit_gl_shader_state)(struct v3dv_cmd_buffer *cmd_buffer) shader.vertex_shader_uniforms_address = cmd_buffer->state.uniforms.vs; shader.fragment_shader_uniforms_address = cmd_buffer->state.uniforms.fs; +#if V3D_VERSION == 42 shader.address_of_default_attribute_values = v3dv_cl_address(default_attribute_values, 0); +#endif shader.any_shader_reads_hardware_written_primitive_id = (pipeline->has_gs && prog_data_gs->uses_pid) || prog_data_fs->uses_pid; @@ -2399,11 +2460,17 @@ v3dX(cmd_buffer_render_pass_setup_render_target)(struct v3dv_cmd_buffer *cmd_buf assert(iview->plane_count == 1); *rt_bpp = iview->planes[0].internal_bpp; - *rt_type = iview->planes[0].internal_type; if (vk_format_is_int(iview->vk.view_format)) +#if V3D_VERSION == 42 + *rt_type = iview->planes[0].internal_type; + if (vk_format_is_int(iview->vk.format)) *rt_clamp = V3D_RENDER_TARGET_CLAMP_INT; else if (vk_format_is_srgb(iview->vk.view_format)) *rt_clamp = V3D_RENDER_TARGET_CLAMP_NORM; else *rt_clamp = V3D_RENDER_TARGET_CLAMP_NONE; +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif } diff --git a/src/broadcom/vulkan/v3dvx_image.c b/src/broadcom/vulkan/v3dvx_image.c index 80a3e5bfde8..dac6ff2741f 100644 --- a/src/broadcom/vulkan/v3dvx_image.c +++ b/src/broadcom/vulkan/v3dvx_image.c @@ -76,8 +76,6 @@ pack_texture_shader_state_helper(struct v3dv_device *device, tex.swizzle_b = v3d_translate_pipe_swizzle(image_view->planes[plane].swizzle[2]); tex.swizzle_a = v3d_translate_pipe_swizzle(image_view->planes[plane].swizzle[3]); - tex.reverse_standard_border_color = image_view->planes[plane].channel_reverse; - tex.texture_type = image_view->format->planes[plane].tex_type; if (image->vk.image_type == VK_IMAGE_TYPE_3D) { @@ -110,7 +108,16 @@ pack_texture_shader_state_helper(struct v3dv_device *device, tex.array_stride_64_byte_aligned = image->planes[iplane].cube_map_stride / 64; +#if V3D_VERSION == 42 + tex.reverse_standard_border_color = image_view->planes[plane].channel_reverse; +#endif + +#if V3D_VERSION == 42 tex.srgb = vk_format_is_srgb(image_view->vk.view_format); +#endif +#if V3D_VERSION >= 71 + unreachable("Hardware generation 71 not supported yet."); +#endif /* At this point we don't have the job. That's the reason the first * parameter is NULL, to avoid a crash when cl_pack_emit_reloc tries to @@ -166,7 +173,12 @@ v3dX(pack_texture_shader_state_from_buffer_view)(struct v3dv_device *device, assert(buffer_view->format->plane_count == 1); tex.texture_type = buffer_view->format->planes[0].tex_type; +#if V3D_VERSION == 42 tex.srgb = vk_format_is_srgb(buffer_view->vk_format); +#endif +#if V3D_VERSION >= 71 + unreachable("Hardware generation 71 not supported yet."); +#endif /* At this point we don't have the job. That's the reason the first * parameter is NULL, to avoid a crash when cl_pack_emit_reloc tries to diff --git a/src/broadcom/vulkan/v3dvx_meta_common.c b/src/broadcom/vulkan/v3dvx_meta_common.c index 04147b82cbd..2db07ea7427 100644 --- a/src/broadcom/vulkan/v3dvx_meta_common.c +++ b/src/broadcom/vulkan/v3dvx_meta_common.c @@ -58,7 +58,12 @@ emit_rcl_prologue(struct v3dv_job *job, config.number_of_render_targets = 1; config.multisample_mode_4x = tiling->msaa; config.double_buffer_in_non_ms_mode = tiling->double_buffer; +#if V3D_VERSION == 42 config.maximum_bpp_of_all_render_targets = tiling->internal_bpp; +#endif +#if V3D_VERSION >= 71 + unreachable("Hardware generation 71 not supported yet."); +#endif config.internal_depth_type = fb->internal_depth_type; } @@ -88,14 +93,20 @@ emit_rcl_prologue(struct v3dv_job *job, } } +#if V3D_VERSION == 42 const uint32_t *color = &clear_info->clear_value->color[0]; cl_emit(rcl, TILE_RENDERING_MODE_CFG_CLEAR_COLORS_PART1, clear) { clear.clear_color_low_32_bits = color[0]; clear.clear_color_next_24_bits = color[1] & 0x00ffffff; clear.render_target_number = 0; }; +#endif +#if V3D_VERSION >= 71 + unreachable("Hardware generation 71 not supported yet."); +#endif if (tiling->internal_bpp >= V3D_INTERNAL_BPP_64) { +#if V3D_VERSION == 42 cl_emit(rcl, TILE_RENDERING_MODE_CFG_CLEAR_COLORS_PART2, clear) { clear.clear_color_mid_low_32_bits = ((color[1] >> 24) | (color[2] << 8)); @@ -103,22 +114,37 @@ emit_rcl_prologue(struct v3dv_job *job, ((color[2] >> 24) | ((color[3] & 0xffff) << 8)); clear.render_target_number = 0; }; +#endif +#if V3D_VERSION >= 71 + unreachable("Hardware generation 71 not supported yet."); +#endif + } if (tiling->internal_bpp >= V3D_INTERNAL_BPP_128 || clear_pad) { +#if V3D_VERSION == 42 cl_emit(rcl, TILE_RENDERING_MODE_CFG_CLEAR_COLORS_PART3, clear) { clear.uif_padded_height_in_uif_blocks = clear_pad; clear.clear_color_high_16_bits = color[3] >> 16; clear.render_target_number = 0; }; +#endif +#if V3D_VERSION >= 71 + unreachable("Hardware generation 71 not supported yet."); +#endif } } +#if V3D_VERSION == 42 cl_emit(rcl, TILE_RENDERING_MODE_CFG_COLOR, rt) { rt.render_target_0_internal_bpp = tiling->internal_bpp; rt.render_target_0_internal_type = fb->internal_type; rt.render_target_0_clamp = V3D_RENDER_TARGET_CLAMP_NONE; } +#endif +#if V3D_VERSION >= 71 + unreachable("Hardware generation 71 not supported yet."); +#endif cl_emit(rcl, TILE_RENDERING_MODE_CFG_ZS_CLEAR_VALUES, clear) { clear.z_clear_value = clear_info ? clear_info->clear_value->z : 1.0f; @@ -179,10 +205,16 @@ emit_frame_setup(struct v3dv_job *job, */ if (clear_value && (i == 0 || v3dv_do_double_initial_tile_clear(tiling))) { +#if V3D_VERSION == 42 cl_emit(rcl, CLEAR_TILE_BUFFERS, clear) { clear.clear_z_stencil_buffer = true; clear.clear_all_render_targets = true; } +#endif +#if V3D_VERSION >= 71 + unreachable("Hardware generation 71 not supported yet."); +#endif + } cl_emit(rcl, END_OF_TILE_MARKER, end); } diff --git a/src/broadcom/vulkan/v3dvx_pipeline.c b/src/broadcom/vulkan/v3dvx_pipeline.c index 5d32d414ed8..922698b08a2 100644 --- a/src/broadcom/vulkan/v3dvx_pipeline.c +++ b/src/broadcom/vulkan/v3dvx_pipeline.c @@ -447,10 +447,15 @@ pack_shader_state_record(struct v3dv_pipeline *pipeline) /* FIXME: Use combined input/output size flag in the common case (also * on v3d, see v3dx_draw). */ +#if V3D_VERSION == 42 shader.coordinate_shader_has_separate_input_and_output_vpm_blocks = prog_data_vs_bin->separate_segments; shader.vertex_shader_has_separate_input_and_output_vpm_blocks = prog_data_vs->separate_segments; +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif shader.coordinate_shader_input_vpm_segment_size = prog_data_vs_bin->separate_segments ? diff --git a/src/broadcom/vulkan/v3dvx_queue.c b/src/broadcom/vulkan/v3dvx_queue.c index efe63de425c..1a26d04aef7 100644 --- a/src/broadcom/vulkan/v3dvx_queue.c +++ b/src/broadcom/vulkan/v3dvx_queue.c @@ -42,14 +42,25 @@ v3dX(job_emit_noop)(struct v3dv_job *job) config.image_height_pixels = 1; config.number_of_render_targets = 1; config.multisample_mode_4x = false; +#if V3D_VERSION == 42 config.maximum_bpp_of_all_render_targets = V3D_INTERNAL_BPP_32; +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif } +#if V3D_VERSION == 42 cl_emit(rcl, TILE_RENDERING_MODE_CFG_COLOR, rt) { rt.render_target_0_internal_bpp = V3D_INTERNAL_BPP_32; rt.render_target_0_internal_type = V3D_INTERNAL_TYPE_8; rt.render_target_0_clamp = V3D_RENDER_TARGET_CLAMP_NONE; } +#endif +#if V3D_VERSION >= 71 + unreachable("Hardware generation 71 not supported yet."); +#endif + cl_emit(rcl, TILE_RENDERING_MODE_CFG_ZS_CLEAR_VALUES, clear) { clear.z_clear_value = 1.0f; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0074-v3dv-expose-V3D-revision-number-in-device-name.patch ================================================ From 7aa016bca8bb1bf449ea79505692353c0bd174b8 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 10 Nov 2021 10:06:50 +0100 Subject: [PATCH 074/142] v3dv: expose V3D revision number in device name --- src/broadcom/vulkan/v3dv_device.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index d29ffad3531..3034b561480 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -1123,8 +1123,10 @@ create_physical_device(struct v3dv_instance *instance, device->next_program_id = 0; ASSERTED int len = - asprintf(&device->name, "V3D %d.%d", - device->devinfo.ver / 10, device->devinfo.ver % 10); + asprintf(&device->name, "V3D %d.%d.%d", + device->devinfo.ver / 10, + device->devinfo.ver % 10, + device->devinfo.rev); assert(len != -1); v3dv_physical_device_init_disk_cache(device); -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0075-v3dv-device-handle-new-rpi5-device-bcm2712.patch ================================================ From fb9e95b7e1d5987fd25e914635c4e09d81ea9561 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 10 Nov 2021 07:54:35 +0100 Subject: [PATCH 075/142] v3dv/device: handle new rpi5 device (bcm2712) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This includes both master and primary devices. Signed-off-by: Iago Toral Quiroga <itoral@igalia.com> Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com> --- src/broadcom/vulkan/v3dv_device.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 3034b561480..c8719d33f15 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -1287,7 +1287,8 @@ enumerate_devices(struct vk_instance *vk_instance) if (devices[i]->available_nodes & 1 << DRM_NODE_RENDER) { char **compat = devices[i]->deviceinfo.platform->compatible; while (*compat) { - if (strncmp(*compat, "brcm,2711-v3d", 13) == 0) { + if (strncmp(*compat, "brcm,2711-v3d", 13) == 0 || + strncmp(*compat, "brcm,2712-v3d", 13) == 0) { v3d_idx = i; break; } @@ -1296,8 +1297,9 @@ enumerate_devices(struct vk_instance *vk_instance) } else if (devices[i]->available_nodes & 1 << DRM_NODE_PRIMARY) { char **compat = devices[i]->deviceinfo.platform->compatible; while (*compat) { - if (strncmp(*compat, "brcm,bcm2711-vc5", 16) == 0 || - strncmp(*compat, "brcm,bcm2835-vc4", 16) == 0 ) { + if (strncmp(*compat, "brcm,bcm2712-vc6", 16) == 0 || + strncmp(*compat, "brcm,bcm2711-vc5", 16) == 0 || + strncmp(*compat, "brcm,bcm2835-vc4", 16) == 0) { vc4_idx = i; break; } @@ -1334,6 +1336,8 @@ v3dv_physical_device_device_id(struct v3dv_physical_device *dev) switch (dev->devinfo.ver) { case 42: return 0xBE485FD3; /* Broadcom deviceID for 2711 */ + case 71: + return 0x55701C33; /* Broadcom deviceID for 2712 */ default: unreachable("Unsupported V3D version"); } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0076-v3dv-cmd_buffer-emit-TILE_BINNING_MODE_CFG-for-v71.patch ================================================ From c4f957af4fb0e10abf0a7ffad4f7a468633b7d99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Tue, 20 Jul 2021 14:00:44 +0200 Subject: [PATCH 076/142] v3dv/cmd_buffer: emit TILE_BINNING_MODE_CFG for v71 --- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index b958e634c82..17b2f46850d 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -94,7 +94,14 @@ v3dX(job_emit_binning_prolog)(struct v3dv_job *job, config.maximum_bpp_of_all_render_targets = tiling->internal_bpp; #endif #if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); + config.log2_tile_width = log2_tile_size(tiling->tile_width); + config.log2_tile_height = log2_tile_size(tiling->tile_height); + /* FIXME: ideally we would like next assert on the packet header (as is + * general, so also applies to GL). We would need to expand + * gen_pack_header for that. + */ + assert(config.log2_tile_width == config.log2_tile_height || + config.log2_tile_width == config.log2_tile_height + 1); #endif } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0077-v3dv-emit-TILE_RENDERING_MODE_CFG_COMMON-for-v71.patch ================================================ From 1934ac07df73cb685f6550b8b0f5b4f2ead11396 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Tue, 20 Jul 2021 14:33:00 +0200 Subject: [PATCH 077/142] v3dv: emit TILE_RENDERING_MODE_CFG_COMMON for v71 --- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 9 ++++++++- src/broadcom/vulkan/v3dvx_meta_common.c | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index 17b2f46850d..7837b460051 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -850,7 +850,14 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) config.maximum_bpp_of_all_render_targets = tiling->internal_bpp; #endif #if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); + config.log2_tile_width = log2_tile_size(tiling->tile_width); + config.log2_tile_height = log2_tile_size(tiling->tile_height); + /* FIXME: ideallly we would like next assert on the packet header (as is + * general, so also applies to GL). We would need to expand + * gen_pack_header for that. + */ + assert(config.log2_tile_width == config.log2_tile_height || + config.log2_tile_width == config.log2_tile_height + 1); #endif if (ds_attachment_idx != VK_ATTACHMENT_UNUSED) { diff --git a/src/broadcom/vulkan/v3dvx_meta_common.c b/src/broadcom/vulkan/v3dvx_meta_common.c index 2db07ea7427..e4084d851fc 100644 --- a/src/broadcom/vulkan/v3dvx_meta_common.c +++ b/src/broadcom/vulkan/v3dvx_meta_common.c @@ -62,7 +62,14 @@ emit_rcl_prologue(struct v3dv_job *job, config.maximum_bpp_of_all_render_targets = tiling->internal_bpp; #endif #if V3D_VERSION >= 71 - unreachable("Hardware generation 71 not supported yet."); + config.log2_tile_width = log2_tile_size(tiling->tile_width); + config.log2_tile_height = log2_tile_size(tiling->tile_height); + /* FIXME: ideallly we would like next assert on the packet header (as is + * general, so also applies to GL). We would need to expand + * gen_pack_header for that. + */ + assert(config.log2_tile_width == config.log2_tile_height || + config.log2_tile_width == config.log2_tile_height + 1); #endif config.internal_depth_type = fb->internal_depth_type; } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0078-v3dv-cmd_buffer-emit-TILE_RENDERING_MODE_CFG_RENDER_.patch ================================================ From f0f9eea3cad83ed8824c6a7686150327407a5286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 22 Jul 2021 14:26:13 +0200 Subject: [PATCH 078/142] v3dv/cmd_buffer: emit TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1 for v71 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com> Signed-off-by: Iago Toral Quiroga <itoral@igalia.com> --- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 186 +++++++++++++++++------- src/broadcom/vulkan/v3dvx_meta_common.c | 12 +- src/broadcom/vulkan/v3dvx_private.h | 11 +- 3 files changed, 147 insertions(+), 62 deletions(-) diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index 7837b460051..c6307890da5 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -800,6 +800,103 @@ set_rcl_early_z_config(struct v3dv_job *job, } } +/* Note that for v71, render target cfg packets has just one field that + * combined the internal type and clamp mode. For simplicity we keep just one + * helper. + * + * Note: rt_type is in fact a "enum V3DX(Internal_Type)". + * + * FIXME: for v71 we are not returning all the possible combinations for + * render target internal type and clamp. For example for int types we are + * always using clamp int, and for 16f we are using clamp none or pos (that + * seem the equivalent for no-clamp on 4.2), but not pq or hlg. In summary + * right now we are just porting what we were doing on 4.2 + */ +uint32_t +v3dX(clamp_for_format_and_type)(uint32_t rt_type, + VkFormat vk_format) +{ +#if V3D_VERSION == 42 + if (vk_format_is_int(vk_format)) + return V3D_RENDER_TARGET_CLAMP_INT; + else if (vk_format_is_srgb(vk_format)) + return V3D_RENDER_TARGET_CLAMP_NORM; + else + return V3D_RENDER_TARGET_CLAMP_NONE; +#endif +#if V3D_VERSION >= 71 + switch (rt_type) { + case V3D_INTERNAL_TYPE_8I: + return V3D_RENDER_TARGET_TYPE_CLAMP_8I_CLAMPED; + case V3D_INTERNAL_TYPE_8UI: + return V3D_RENDER_TARGET_TYPE_CLAMP_8UI_CLAMPED; + case V3D_INTERNAL_TYPE_8: + return V3D_RENDER_TARGET_TYPE_CLAMP_8; + case V3D_INTERNAL_TYPE_16I: + return V3D_RENDER_TARGET_TYPE_CLAMP_16I_CLAMPED; + case V3D_INTERNAL_TYPE_16UI: + return V3D_RENDER_TARGET_TYPE_CLAMP_16UI_CLAMPED; + case V3D_INTERNAL_TYPE_16F: + return vk_format_is_srgb(vk_format) ? + V3D_RENDER_TARGET_TYPE_CLAMP_16F_CLAMP_NORM : + V3D_RENDER_TARGET_TYPE_CLAMP_16F; + case V3D_INTERNAL_TYPE_32I: + return V3D_RENDER_TARGET_TYPE_CLAMP_32I_CLAMPED; + case V3D_INTERNAL_TYPE_32UI: + return V3D_RENDER_TARGET_TYPE_CLAMP_32UI_CLAMPED; + case V3D_INTERNAL_TYPE_32F: + return V3D_RENDER_TARGET_TYPE_CLAMP_32F; + default: + unreachable("Unknown internal render target type"); + } + + return V3D_RENDER_TARGET_TYPE_CLAMP_INVALID; +#endif +} + +static void +cmd_buffer_render_pass_setup_render_target(struct v3dv_cmd_buffer *cmd_buffer, + int rt, + uint32_t *rt_bpp, +#if V3D_VERSION == 42 + uint32_t *rt_type, + uint32_t *rt_clamp) +#else + uint32_t *rt_type_clamp) +#endif +{ + const struct v3dv_cmd_buffer_state *state = &cmd_buffer->state; + + assert(state->subpass_idx < state->pass->subpass_count); + const struct v3dv_subpass *subpass = + &state->pass->subpasses[state->subpass_idx]; + + if (rt >= subpass->color_count) + return; + + struct v3dv_subpass_attachment *attachment = &subpass->color_attachments[rt]; + const uint32_t attachment_idx = attachment->attachment; + if (attachment_idx == VK_ATTACHMENT_UNUSED) + return; + + assert(attachment_idx < state->framebuffer->attachment_count && + attachment_idx < state->attachment_alloc_count); + struct v3dv_image_view *iview = state->attachments[attachment_idx].image_view; + assert(vk_format_is_color(iview->vk.format)); + + assert(iview->plane_count == 1); + *rt_bpp = iview->planes[0].internal_bpp; +#if V3D_VERSION == 42 + *rt_type = iview->planes[0].internal_type; + *rt_clamp = v3dX(clamp_for_format_and_type)(iview->planes[0].internal_type, + iview->vk.format); +#endif +#if V3D_VERSION >= 71 + *rt_type_clamp = v3dX(clamp_for_format_and_type)(iview->planes[0].internal_type, + iview->vk.format); +#endif +} + void v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) { @@ -939,10 +1036,20 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) */ job->early_zs_clear = do_early_zs_clear; +#if V3D_VERSION >= 71 + uint32_t base_addr = 0; +#endif for (uint32_t i = 0; i < subpass->color_count; i++) { uint32_t attachment_idx = subpass->color_attachments[i].attachment; - if (attachment_idx == VK_ATTACHMENT_UNUSED) + if (attachment_idx == VK_ATTACHMENT_UNUSED) { +#if V3D_VERSION >= 71 + cl_emit(rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1, rt) { + rt.render_target_number = i; + rt.stride = 1; /* Unused */ + } +#endif continue; + } struct v3dv_image_view *iview = state->attachments[attachment_idx].image_view; @@ -978,9 +1085,6 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) clear.render_target_number = i; }; #endif -#if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); -#endif if (iview->planes[0].internal_bpp >= V3D_INTERNAL_BPP_64) { #if V3D_VERSION == 42 @@ -1010,27 +1114,44 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) unreachable("HW generation 71 not supported yet."); #endif } + +#if V3D_VERSION >= 71 + cl_emit(rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1, rt) { + rt.clear_color_low_bits = clear_color[0]; + cmd_buffer_render_pass_setup_render_target(cmd_buffer, i, &rt.internal_bpp, + &rt.internal_type_and_clamping); + rt.stride = + v3d_compute_rt_row_row_stride_128_bits(tiling->tile_width, + v3d_internal_bpp_words(rt.internal_bpp)); + rt.base_address = base_addr; + rt.render_target_number = i; + + /* base_addr in multiples of 512 bits. We divide by 8 because stride + * is in 128-bit units, but it is packing 2 rows worth of data, so we + * need to divide it by 2 so it is only 1 row, and then again by 4 so + * it is in 512-bit units. + */ + base_addr += (tiling->tile_height * rt.stride) / 8; + } +#endif } #if V3D_VERSION == 42 cl_emit(rcl, TILE_RENDERING_MODE_CFG_COLOR, rt) { - v3dX(cmd_buffer_render_pass_setup_render_target) + cmd_buffer_render_pass_setup_render_target (cmd_buffer, 0, &rt.render_target_0_internal_bpp, &rt.render_target_0_internal_type, &rt.render_target_0_clamp); - v3dX(cmd_buffer_render_pass_setup_render_target) + cmd_buffer_render_pass_setup_render_target (cmd_buffer, 1, &rt.render_target_1_internal_bpp, &rt.render_target_1_internal_type, &rt.render_target_1_clamp); - v3dX(cmd_buffer_render_pass_setup_render_target) + cmd_buffer_render_pass_setup_render_target (cmd_buffer, 2, &rt.render_target_2_internal_bpp, &rt.render_target_2_internal_type, &rt.render_target_2_clamp); - v3dX(cmd_buffer_render_pass_setup_render_target) + cmd_buffer_render_pass_setup_render_target (cmd_buffer, 3, &rt.render_target_3_internal_bpp, &rt.render_target_3_internal_type, &rt.render_target_3_clamp); } #endif -#if V3D_VERSION >= 71 - unreachable("Hardware generation 71 not supported yet."); -#endif /* Ends rendering mode config. */ if (ds_attachment_idx != VK_ATTACHMENT_UNUSED) { @@ -2445,46 +2566,3 @@ v3dX(cmd_buffer_emit_indexed_indirect)(struct v3dv_cmd_buffer *cmd_buffer, buffer->mem_offset + offset); } } - -void -v3dX(cmd_buffer_render_pass_setup_render_target)(struct v3dv_cmd_buffer *cmd_buffer, - int rt, - uint32_t *rt_bpp, - uint32_t *rt_type, - uint32_t *rt_clamp) -{ - const struct v3dv_cmd_buffer_state *state = &cmd_buffer->state; - - assert(state->subpass_idx < state->pass->subpass_count); - const struct v3dv_subpass *subpass = - &state->pass->subpasses[state->subpass_idx]; - - if (rt >= subpass->color_count) - return; - - struct v3dv_subpass_attachment *attachment = &subpass->color_attachments[rt]; - const uint32_t attachment_idx = attachment->attachment; - if (attachment_idx == VK_ATTACHMENT_UNUSED) - return; - - assert(attachment_idx < state->framebuffer->attachment_count && - attachment_idx < state->attachment_alloc_count); - struct v3dv_image_view *iview = state->attachments[attachment_idx].image_view; - assert(vk_format_is_color(iview->vk.format)); - - assert(iview->plane_count == 1); - *rt_bpp = iview->planes[0].internal_bpp; - if (vk_format_is_int(iview->vk.view_format)) -#if V3D_VERSION == 42 - *rt_type = iview->planes[0].internal_type; - if (vk_format_is_int(iview->vk.format)) - *rt_clamp = V3D_RENDER_TARGET_CLAMP_INT; - else if (vk_format_is_srgb(iview->vk.view_format)) - *rt_clamp = V3D_RENDER_TARGET_CLAMP_NORM; - else - *rt_clamp = V3D_RENDER_TARGET_CLAMP_NONE; -#endif -#if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); -#endif -} diff --git a/src/broadcom/vulkan/v3dvx_meta_common.c b/src/broadcom/vulkan/v3dvx_meta_common.c index e4084d851fc..c6391bc6d83 100644 --- a/src/broadcom/vulkan/v3dvx_meta_common.c +++ b/src/broadcom/vulkan/v3dvx_meta_common.c @@ -26,6 +26,7 @@ #include "broadcom/common/v3d_macros.h" #include "broadcom/common/v3d_tfu.h" +#include "broadcom/common/v3d_util.h" #include "broadcom/cle/v3dx_pack.h" #include "broadcom/compiler/v3d_compiler.h" @@ -150,7 +151,16 @@ emit_rcl_prologue(struct v3dv_job *job, } #endif #if V3D_VERSION >= 71 - unreachable("Hardware generation 71 not supported yet."); + cl_emit(rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1, rt) { + rt.internal_bpp = tiling->internal_bpp; + rt.internal_type_and_clamping = v3dX(clamp_for_format_and_type)(fb->internal_type, + fb->vk_format); + rt.stride = + v3d_compute_rt_row_row_stride_128_bits(tiling->tile_width, + v3d_internal_bpp_words(rt.internal_bpp)); + rt.base_address = 0; + rt.render_target_number = 0; + } #endif cl_emit(rcl, TILE_RENDERING_MODE_CFG_ZS_CLEAR_VALUES, clear) { diff --git a/src/broadcom/vulkan/v3dvx_private.h b/src/broadcom/vulkan/v3dvx_private.h index ad8ddfa5731..a4157d11c7c 100644 --- a/src/broadcom/vulkan/v3dvx_private.h +++ b/src/broadcom/vulkan/v3dvx_private.h @@ -125,13 +125,6 @@ v3dX(get_hw_clear_color)(const VkClearColorValue *color, uint32_t internal_size, uint32_t *hw_color); -void -v3dX(cmd_buffer_render_pass_setup_render_target)(struct v3dv_cmd_buffer *cmd_buffer, - int rt, - uint32_t *rt_bpp, - uint32_t *rt_type, - uint32_t *rt_clamp); - /* Used at v3dv_device */ void @@ -325,3 +318,7 @@ uint32_t v3dX(max_descriptor_bo_size)(void); uint32_t v3dX(combined_image_sampler_texture_state_offset)(uint8_t plane); uint32_t v3dX(combined_image_sampler_sampler_state_offset)(uint8_t plane); + +uint32_t +v3dX(clamp_for_format_and_type)(uint32_t rt_type, + VkFormat vk_format); -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0079-v3dvx-cmd_buffer-emit-CLEAR_RENDER_TARGETS-for-v71.patch ================================================ From 7c89d8026fd550282d54933f37ffc2773869326f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Mon, 26 Jul 2021 15:08:11 +0200 Subject: [PATCH 079/142] v3dvx/cmd_buffer: emit CLEAR_RENDER_TARGETS for v71 --- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index c6307890da5..ae1c21ae00b 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -1219,7 +1219,7 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) } #endif #if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); + cl_emit(rcl, CLEAR_RENDER_TARGETS, clear_rt); #endif } cl_emit(rcl, END_OF_TILE_MARKER, end); -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0080-v3dv-cmd_buffer-emit-CLIPPER_XY_SCALING-for-v71.patch ================================================ From 2eb29b57fde2acda76e12953b3a1050f3056b39d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Sun, 19 Sep 2021 23:37:32 +0200 Subject: [PATCH 080/142] v3dv/cmd_buffer: emit CLIPPER_XY_SCALING for v71 --- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index ae1c21ae00b..2e525a11619 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -1246,9 +1246,7 @@ v3dX(cmd_buffer_emit_viewport)(struct v3dv_cmd_buffer *cmd_buffer) * now, would need to change if we allow multiple viewports */ float *vptranslate = dynamic->viewport.translate[0]; -#if V3D_VERSION == 42 float *vpscale = dynamic->viewport.scale[0]; -#endif struct v3dv_job *job = cmd_buffer->state.job; assert(job); @@ -1268,7 +1266,10 @@ v3dX(cmd_buffer_emit_viewport)(struct v3dv_cmd_buffer *cmd_buffer) } #endif #if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); + cl_emit(&job->bcl, CLIPPER_XY_SCALING, clip) { + clip.viewport_half_width_in_1_64th_of_pixel = vpscale[0] * 64.0f; + clip.viewport_half_height_in_1_64th_of_pixel = vpscale[1] * 64.0f; + } #endif float translate_z, scale_z; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0081-v3dv-uniforms-update-VIEWPORT_X-Y_SCALE-uniforms-for.patch ================================================ From 611bf6a7445837c7e20416ff9f11a6dad9c543d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Tue, 14 Sep 2021 10:08:19 +0200 Subject: [PATCH 081/142] v3dv/uniforms: update VIEWPORT_X/Y_SCALE uniforms for v71 As the packet CLIPPER_XY scaling, this needs to be computed on 1/64ths of pixel, instead of 1/256ths of pixels. As this is the usual values that we get from macros, we add manually a v42 and v71 macro, and define a new helper (V3DV_X) to get the value for the current hw version. --- src/broadcom/vulkan/v3dv_private.h | 17 +++++++++++++++++ src/broadcom/vulkan/v3dv_uniforms.c | 7 ++++--- src/broadcom/vulkan/v3dvx_private.h | 9 +++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 6bdf338c67b..cd6811b19c2 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -2617,6 +2617,23 @@ u64_compare(const void *key1, const void *key2) v3d_X_thing; \ }) +/* Helper to get hw-specific macro values */ +#define V3DV_X(device, thing) ({ \ + __typeof(V3D42_##thing) V3D_X_THING; \ + switch (device->devinfo.ver) { \ + case 42: \ + V3D_X_THING = V3D42_##thing; \ + break; \ + case 71: \ + V3D_X_THING = V3D71_##thing; \ + break; \ + default: \ + unreachable("Unsupported hardware generation"); \ + } \ + V3D_X_THING; \ +}) + + /* v3d_macros from common requires v3dX and V3DX definitions. Below we need to * define v3dX for each version supported, because when we compile code that diff --git a/src/broadcom/vulkan/v3dv_uniforms.c b/src/broadcom/vulkan/v3dv_uniforms.c index 72fa9a1b39c..0e681cc4ee2 100644 --- a/src/broadcom/vulkan/v3dv_uniforms.c +++ b/src/broadcom/vulkan/v3dv_uniforms.c @@ -497,7 +497,8 @@ v3dv_write_uniforms_wg_offsets(struct v3dv_cmd_buffer *cmd_buffer, struct v3dv_cl_reloc uniform_stream = v3dv_cl_get_address(&job->indirect); struct v3dv_cl_out *uniforms = cl_start(&job->indirect); - + float clipper_xy_granularity = + V3DV_X(cmd_buffer->device, CLIPPER_XY_GRANULARITY); for (int i = 0; i < uinfo->count; i++) { uint32_t data = uinfo->data[i]; @@ -520,11 +521,11 @@ v3dv_write_uniforms_wg_offsets(struct v3dv_cmd_buffer *cmd_buffer, break; case QUNIFORM_VIEWPORT_X_SCALE: - cl_aligned_f(&uniforms, dynamic->viewport.scale[0][0] * 256.0f); + cl_aligned_f(&uniforms, dynamic->viewport.scale[0][0] * clipper_xy_granularity); break; case QUNIFORM_VIEWPORT_Y_SCALE: - cl_aligned_f(&uniforms, dynamic->viewport.scale[0][1] * 256.0f); + cl_aligned_f(&uniforms, dynamic->viewport.scale[0][1] * clipper_xy_granularity); break; case QUNIFORM_VIEWPORT_Z_OFFSET: { diff --git a/src/broadcom/vulkan/v3dvx_private.h b/src/broadcom/vulkan/v3dvx_private.h index a4157d11c7c..ff9ba75cf93 100644 --- a/src/broadcom/vulkan/v3dvx_private.h +++ b/src/broadcom/vulkan/v3dvx_private.h @@ -319,6 +319,15 @@ uint32_t v3dX(combined_image_sampler_texture_state_offset)(uint8_t plane); uint32_t v3dX(combined_image_sampler_sampler_state_offset)(uint8_t plane); +/* General utils */ + +uint32_t +v3dX(clamp_for_format_and_type)(uint32_t rt_type, + VkFormat vk_format); + +#define V3D42_CLIPPER_XY_GRANULARITY 256.0f +#define V3D71_CLIPPER_XY_GRANULARITY 64.0f + uint32_t v3dX(clamp_for_format_and_type)(uint32_t rt_type, VkFormat vk_format); -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0082-v3dv-cmd_buffer-just-don-t-fill-up-early-z-fields-fo.patch ================================================ From 3819efaf2bb6fd8bd9cd45d54fb7254377b2296a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Tue, 27 Jul 2021 14:02:30 +0200 Subject: [PATCH 082/142] v3dv/cmd_buffer: just don't fill up early-z fields for CFG_BITS for v71 For v71 early_z_enable/early_z_updates_enable is configured with packet 121. --- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index 2e525a11619..fe9f7e43596 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -1783,17 +1783,14 @@ v3dX(cmd_buffer_emit_configuration_bits)(struct v3dv_cmd_buffer *cmd_buffer) v3dv_cl_ensure_space_with_branch(&job->bcl, cl_packet_length(CFG_BITS)); v3dv_return_if_oom(cmd_buffer, NULL); -#if V3D_VERSION == 42 - bool enable_ez = job_update_ez_state(job, pipeline, cmd_buffer); cl_emit_with_prepacked(&job->bcl, CFG_BITS, pipeline->cfg_bits, config) { +#if V3D_VERSION == 42 + bool enable_ez = job_update_ez_state(job, pipeline, cmd_buffer); config.early_z_enable = enable_ez; config.early_z_updates_enable = config.early_z_enable && pipeline->z_updates_enable; - } -#endif -#if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); #endif + } } void -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0083-v3dv-default-vertex-attribute-values-are-gen-dependa.patch ================================================ From e3b1a578f45ea830d790970115b6de978d56edb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Wed, 28 Jul 2021 12:01:38 +0200 Subject: [PATCH 083/142] v3dv: default vertex attribute values are gen dependant Content, structure and size would depend on the generation. Even if it is needed at all. So let's move it to the v3dvx files. --- src/broadcom/vulkan/v3dv_device.c | 2 +- src/broadcom/vulkan/v3dv_pipeline.c | 61 ++------------------------- src/broadcom/vulkan/v3dv_private.h | 4 -- src/broadcom/vulkan/v3dvx_pipeline.c | 63 ++++++++++++++++++++++++++++ src/broadcom/vulkan/v3dvx_private.h | 8 ++++ 5 files changed, 75 insertions(+), 63 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index c8719d33f15..01e2dd7ac2d 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -2043,7 +2043,7 @@ v3dv_CreateDevice(VkPhysicalDevice physicalDevice, v3dv_pipeline_cache_init(&device->default_pipeline_cache, device, 0, device->instance->default_pipeline_cache_enabled); device->default_attribute_float = - v3dv_pipeline_create_default_attribute_values(device, NULL); + v3dv_X(device, create_default_attribute_values)(device, NULL); device->device_address_mem_ctx = ralloc_context(NULL); util_dynarray_init(&device->device_address_bo_list, diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index 22f01bdf64b..d012ff8f948 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -2802,62 +2802,6 @@ pipeline_set_ez_state(struct v3dv_pipeline *pipeline, } } -static bool -pipeline_has_integer_vertex_attrib(struct v3dv_pipeline *pipeline) -{ - for (uint8_t i = 0; i < pipeline->va_count; i++) { - if (vk_format_is_int(pipeline->va[i].vk_format)) - return true; - } - return false; -} - -/* @pipeline can be NULL. We assume in that case that all the attributes have - * a float format (we only create an all-float BO once and we reuse it with - * all float pipelines), otherwise we look at the actual type of each - * attribute used with the specific pipeline passed in. - */ -struct v3dv_bo * -v3dv_pipeline_create_default_attribute_values(struct v3dv_device *device, - struct v3dv_pipeline *pipeline) -{ - uint32_t size = MAX_VERTEX_ATTRIBS * sizeof(float) * 4; - struct v3dv_bo *bo; - - bo = v3dv_bo_alloc(device, size, "default_vi_attributes", true); - - if (!bo) { - fprintf(stderr, "failed to allocate memory for the default " - "attribute values\n"); - return NULL; - } - - bool ok = v3dv_bo_map(device, bo, size); - if (!ok) { - fprintf(stderr, "failed to map default attribute values buffer\n"); - return false; - } - - uint32_t *attrs = bo->map; - uint8_t va_count = pipeline != NULL ? pipeline->va_count : 0; - for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++) { - attrs[i * 4 + 0] = 0; - attrs[i * 4 + 1] = 0; - attrs[i * 4 + 2] = 0; - VkFormat attr_format = - pipeline != NULL ? pipeline->va[i].vk_format : VK_FORMAT_UNDEFINED; - if (i < va_count && vk_format_is_int(attr_format)) { - attrs[i * 4 + 3] = 1; - } else { - attrs[i * 4 + 3] = fui(1.0); - } - } - - v3dv_bo_unmap(device, bo); - - return bo; -} - static void pipeline_set_sample_mask(struct v3dv_pipeline *pipeline, const VkPipelineMultisampleStateCreateInfo *ms_info) @@ -2992,9 +2936,10 @@ pipeline_init(struct v3dv_pipeline *pipeline, v3dv_X(device, pipeline_pack_compile_state)(pipeline, vi_info, vd_info); - if (pipeline_has_integer_vertex_attrib(pipeline)) { + if (v3dv_X(device, pipeline_needs_default_attribute_values)(pipeline)) { pipeline->default_attribute_values = - v3dv_pipeline_create_default_attribute_values(pipeline->device, pipeline); + v3dv_X(pipeline->device, create_default_attribute_values)(pipeline->device, pipeline); + if (!pipeline->default_attribute_values) return VK_ERROR_OUT_OF_DEVICE_MEMORY; } else { diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index cd6811b19c2..a9fab24d19e 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -2500,10 +2500,6 @@ void v3dv_pipeline_cache_upload_pipeline(struct v3dv_pipeline *pipeline, struct v3dv_pipeline_cache *cache); -struct v3dv_bo * -v3dv_pipeline_create_default_attribute_values(struct v3dv_device *device, - struct v3dv_pipeline *pipeline); - VkResult v3dv_create_compute_pipeline_from_nir(struct v3dv_device *device, nir_shader *nir, diff --git a/src/broadcom/vulkan/v3dvx_pipeline.c b/src/broadcom/vulkan/v3dvx_pipeline.c index 922698b08a2..e235220cb14 100644 --- a/src/broadcom/vulkan/v3dvx_pipeline.c +++ b/src/broadcom/vulkan/v3dvx_pipeline.c @@ -664,3 +664,66 @@ v3dX(pipeline_pack_compile_state)(struct v3dv_pipeline *pipeline, } } } + +static bool +pipeline_has_integer_vertex_attrib(struct v3dv_pipeline *pipeline) +{ + for (uint8_t i = 0; i < pipeline->va_count; i++) { + if (vk_format_is_int(pipeline->va[i].vk_format)) + return true; + } + return false; +} + +bool +v3dX(pipeline_needs_default_attribute_values)(struct v3dv_pipeline *pipeline) +{ + return pipeline_has_integer_vertex_attrib(pipeline); +} + +/* @pipeline can be NULL. In that case we assume the most common case. For + * example, for v42 we assume in that case that all the attributes have a + * float format (we only create an all-float BO once and we reuse it with all + * float pipelines), otherwise we look at the actual type of each attribute + * used with the specific pipeline passed in. + */ +struct v3dv_bo * +v3dX(create_default_attribute_values)(struct v3dv_device *device, + struct v3dv_pipeline *pipeline) +{ + uint32_t size = MAX_VERTEX_ATTRIBS * sizeof(float) * 4; + struct v3dv_bo *bo; + + bo = v3dv_bo_alloc(device, size, "default_vi_attributes", true); + + if (!bo) { + fprintf(stderr, "failed to allocate memory for the default " + "attribute values\n"); + return NULL; + } + + bool ok = v3dv_bo_map(device, bo, size); + if (!ok) { + fprintf(stderr, "failed to map default attribute values buffer\n"); + return NULL; + } + + uint32_t *attrs = bo->map; + uint8_t va_count = pipeline != NULL ? pipeline->va_count : 0; + for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++) { + attrs[i * 4 + 0] = 0; + attrs[i * 4 + 1] = 0; + attrs[i * 4 + 2] = 0; + VkFormat attr_format = + pipeline != NULL ? pipeline->va[i].vk_format : VK_FORMAT_UNDEFINED; + if (i < va_count && vk_format_is_int(attr_format)) { + attrs[i * 4 + 3] = 1; + } else { + attrs[i * 4 + 3] = fui(1.0); + } + } + + v3dv_bo_unmap(device, bo); + + return bo; +} diff --git a/src/broadcom/vulkan/v3dvx_private.h b/src/broadcom/vulkan/v3dvx_private.h index ff9ba75cf93..036ce11b455 100644 --- a/src/broadcom/vulkan/v3dvx_private.h +++ b/src/broadcom/vulkan/v3dvx_private.h @@ -306,6 +306,14 @@ void v3dX(pipeline_pack_compile_state)(struct v3dv_pipeline *pipeline, const VkPipelineVertexInputStateCreateInfo *vi_info, const VkPipelineVertexInputDivisorStateCreateInfoEXT *vd_info); + +bool +v3dX(pipeline_needs_default_attribute_values)(struct v3dv_pipeline *pipeline); + +struct v3dv_bo * +v3dX(create_default_attribute_values)(struct v3dv_device *device, + struct v3dv_pipeline *pipeline); + /* Used at v3dv_queue */ void v3dX(job_emit_noop)(struct v3dv_job *job); -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0084-v3dv-pipeline-default-vertex-attributes-values-are-n.patch ================================================ From 8464dc8869f3d2eccfecac7b4358cc0ffe05f081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Wed, 28 Jul 2021 12:05:26 +0200 Subject: [PATCH 084/142] v3dv/pipeline: default vertex attributes values are not needed for v71 There are not part of the shader state record. --- src/broadcom/vulkan/v3dv_private.h | 10 +++++++++- src/broadcom/vulkan/v3dvx_pipeline.c | 10 ++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index a9fab24d19e..300a1ec8ae1 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -581,6 +581,10 @@ struct v3dv_device { * being float being float, allowing us to reuse the same BO for all * pipelines matching this requirement. Pipelines that need integer * attributes will create their own BO. + * + * Note that since v71 the default attribute values are not needed, so this + * can be NULL. + * */ struct v3dv_bo *default_attribute_float; @@ -2289,11 +2293,15 @@ struct v3dv_pipeline { unsigned char sha1[20]; /* In general we can reuse v3dv_device->default_attribute_float, so note - * that the following can be NULL. + * that the following can be NULL. In 7.x this is not used, so it will be + * NULL. * * FIXME: the content of this BO will be small, so it could be improved to * be uploaded to a common BO. But as in most cases it will be NULL, it is * not a priority. + * + * Note that since v71 the default attribute values are not needed, so this + * can be NULL. */ struct v3dv_bo *default_attribute_values; diff --git a/src/broadcom/vulkan/v3dvx_pipeline.c b/src/broadcom/vulkan/v3dvx_pipeline.c index e235220cb14..4dc6d70efe1 100644 --- a/src/broadcom/vulkan/v3dvx_pipeline.c +++ b/src/broadcom/vulkan/v3dvx_pipeline.c @@ -665,6 +665,7 @@ v3dX(pipeline_pack_compile_state)(struct v3dv_pipeline *pipeline, } } +#if V3D_VERSION == 42 static bool pipeline_has_integer_vertex_attrib(struct v3dv_pipeline *pipeline) { @@ -674,11 +675,16 @@ pipeline_has_integer_vertex_attrib(struct v3dv_pipeline *pipeline) } return false; } +#endif bool v3dX(pipeline_needs_default_attribute_values)(struct v3dv_pipeline *pipeline) { +#if V3D_VERSION == 42 return pipeline_has_integer_vertex_attrib(pipeline); +#endif + + return false; } /* @pipeline can be NULL. In that case we assume the most common case. For @@ -691,6 +697,10 @@ struct v3dv_bo * v3dX(create_default_attribute_values)(struct v3dv_device *device, struct v3dv_pipeline *pipeline) { +#if V3D_VERSION >= 71 + return NULL; +#endif + uint32_t size = MAX_VERTEX_ATTRIBS * sizeof(float) * 4; struct v3dv_bo *bo; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0085-v3dv-pipeline-handle-GL_SHADER_STATE_RECORD-changed-.patch ================================================ From 339096598660ec34be8087007dd4d66581de1c4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Wed, 28 Jul 2021 13:45:52 +0200 Subject: [PATCH 085/142] v3dv/pipeline: handle GL_SHADER_STATE_RECORD changed size on v71 It is likely that we would need more changes, as this packet changed, but this is enough to get basic tests running. Any additional support will be handled with new commits. --- src/broadcom/vulkan/v3dvx_pipeline.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/broadcom/vulkan/v3dvx_pipeline.c b/src/broadcom/vulkan/v3dvx_pipeline.c index 4dc6d70efe1..a640c1d084a 100644 --- a/src/broadcom/vulkan/v3dvx_pipeline.c +++ b/src/broadcom/vulkan/v3dvx_pipeline.c @@ -360,7 +360,7 @@ v3dX(pipeline_pack_state)(struct v3dv_pipeline *pipeline, static void pack_shader_state_record(struct v3dv_pipeline *pipeline) { - assert(sizeof(pipeline->shader_state_record) == + assert(sizeof(pipeline->shader_state_record) >= cl_packet_length(GL_SHADER_STATE_RECORD)); struct v3d_fs_prog_data *prog_data_fs = @@ -453,9 +453,6 @@ pack_shader_state_record(struct v3dv_pipeline *pipeline) shader.vertex_shader_has_separate_input_and_output_vpm_blocks = prog_data_vs->separate_segments; #endif -#if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); -#endif shader.coordinate_shader_input_vpm_segment_size = prog_data_vs_bin->separate_segments ? -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0086-v3dv-setup-render-pass-color-clears-for-any-format-b.patch ================================================ From 5b1342eb1e255d17619b1a7b33eaf7b31f5e50a5 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 22 Sep 2021 12:03:58 +0200 Subject: [PATCH 086/142] v3dv: setup render pass color clears for any format bpp in v71 --- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 33 ++++++++++++++++---------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index fe9f7e43596..1b39e230580 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -1064,7 +1064,7 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) UNUSED const uint32_t *clear_color = &state->attachments[attachment_idx].clear_value.color[0]; - uint32_t clear_pad = 0; + UNUSED uint32_t clear_pad = 0; if (slice->tiling == V3D_TILING_UIF_NO_XOR || slice->tiling == V3D_TILING_UIF_XOR) { int uif_block_height = v3d_utile_height(image->planes[plane].cpp) * 2; @@ -1084,10 +1084,8 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) clear.clear_color_next_24_bits = clear_color[1] & 0xffffff; clear.render_target_number = i; }; -#endif if (iview->planes[0].internal_bpp >= V3D_INTERNAL_BPP_64) { -#if V3D_VERSION == 42 cl_emit(rcl, TILE_RENDERING_MODE_CFG_CLEAR_COLORS_PART2, clear) { clear.clear_color_mid_low_32_bits = ((clear_color[1] >> 24) | (clear_color[2] << 8)); @@ -1095,25 +1093,16 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) ((clear_color[2] >> 24) | ((clear_color[3] & 0xffff) << 8)); clear.render_target_number = i; }; -#endif -#if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); -#endif - } if (iview->planes[0].internal_bpp >= V3D_INTERNAL_BPP_128 || clear_pad) { -#if V3D_VERSION == 42 cl_emit(rcl, TILE_RENDERING_MODE_CFG_CLEAR_COLORS_PART3, clear) { clear.uif_padded_height_in_uif_blocks = clear_pad; clear.clear_color_high_16_bits = clear_color[3] >> 16; clear.render_target_number = i; }; -#endif -#if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); -#endif } +#endif #if V3D_VERSION >= 71 cl_emit(rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1, rt) { @@ -1133,6 +1122,24 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) */ base_addr += (tiling->tile_height * rt.stride) / 8; } + + if (iview->planes[0].internal_bpp >= V3D_INTERNAL_BPP_64) { + cl_emit(rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART2, rt) { + rt.clear_color_mid_bits = /* 40 bits (32 + 8) */ + ((uint64_t) clear_color[1]) | + (((uint64_t) (clear_color[2] & 0xff)) << 32); + rt.render_target_number = i; + } + } + + if (iview->planes[0].internal_bpp >= V3D_INTERNAL_BPP_128) { + cl_emit(rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART3, rt) { + rt.clear_color_top_bits = /* 56 bits (24 + 32) */ + (((uint64_t) (clear_color[2] & 0xffffff00)) >> 8) | + (((uint64_t) (clear_color[3])) << 24); + rt.render_target_number = i; + } + } #endif } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0087-v3dv-setup-TLB-clear-color-for-meta-operations-in-v7.patch ================================================ From ff5b5d4405b1d5600d7f1c4355202fd303f56700 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 22 Sep 2021 12:04:21 +0200 Subject: [PATCH 087/142] v3dv: setup TLB clear color for meta operations in v71 --- src/broadcom/vulkan/v3dvx_meta_common.c | 46 +++++++++++++++---------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/src/broadcom/vulkan/v3dvx_meta_common.c b/src/broadcom/vulkan/v3dvx_meta_common.c index c6391bc6d83..09ebcfa97c1 100644 --- a/src/broadcom/vulkan/v3dvx_meta_common.c +++ b/src/broadcom/vulkan/v3dvx_meta_common.c @@ -75,8 +75,9 @@ emit_rcl_prologue(struct v3dv_job *job, config.internal_depth_type = fb->internal_depth_type; } + const uint32_t *color = NULL; if (clear_info && (clear_info->aspects & VK_IMAGE_ASPECT_COLOR_BIT)) { - uint32_t clear_pad = 0; + UNUSED uint32_t clear_pad = 0; if (clear_info->image) { const struct v3dv_image *image = clear_info->image; @@ -101,20 +102,16 @@ emit_rcl_prologue(struct v3dv_job *job, } } + color = &clear_info->clear_value->color[0]; + #if V3D_VERSION == 42 - const uint32_t *color = &clear_info->clear_value->color[0]; cl_emit(rcl, TILE_RENDERING_MODE_CFG_CLEAR_COLORS_PART1, clear) { clear.clear_color_low_32_bits = color[0]; clear.clear_color_next_24_bits = color[1] & 0x00ffffff; clear.render_target_number = 0; }; -#endif -#if V3D_VERSION >= 71 - unreachable("Hardware generation 71 not supported yet."); -#endif if (tiling->internal_bpp >= V3D_INTERNAL_BPP_64) { -#if V3D_VERSION == 42 cl_emit(rcl, TILE_RENDERING_MODE_CFG_CLEAR_COLORS_PART2, clear) { clear.clear_color_mid_low_32_bits = ((color[1] >> 24) | (color[2] << 8)); @@ -122,25 +119,16 @@ emit_rcl_prologue(struct v3dv_job *job, ((color[2] >> 24) | ((color[3] & 0xffff) << 8)); clear.render_target_number = 0; }; -#endif -#if V3D_VERSION >= 71 - unreachable("Hardware generation 71 not supported yet."); -#endif - } if (tiling->internal_bpp >= V3D_INTERNAL_BPP_128 || clear_pad) { -#if V3D_VERSION == 42 cl_emit(rcl, TILE_RENDERING_MODE_CFG_CLEAR_COLORS_PART3, clear) { clear.uif_padded_height_in_uif_blocks = clear_pad; clear.clear_color_high_16_bits = color[3] >> 16; clear.render_target_number = 0; }; -#endif -#if V3D_VERSION >= 71 - unreachable("Hardware generation 71 not supported yet."); -#endif } +#endif } #if V3D_VERSION == 42 @@ -150,8 +138,11 @@ emit_rcl_prologue(struct v3dv_job *job, rt.render_target_0_clamp = V3D_RENDER_TARGET_CLAMP_NONE; } #endif + #if V3D_VERSION >= 71 cl_emit(rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1, rt) { + if (color) + rt.clear_color_low_bits = color[0]; rt.internal_bpp = tiling->internal_bpp; rt.internal_type_and_clamping = v3dX(clamp_for_format_and_type)(fb->internal_type, fb->vk_format); @@ -161,6 +152,24 @@ emit_rcl_prologue(struct v3dv_job *job, rt.base_address = 0; rt.render_target_number = 0; } + + if (color && tiling->internal_bpp >= V3D_INTERNAL_BPP_64) { + cl_emit(rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART2, rt) { + rt.clear_color_mid_bits = /* 40 bits (32 + 8) */ + ((uint64_t) color[1]) | + (((uint64_t) (color[2] & 0xff)) << 32); + rt.render_target_number = 0; + } + } + + if (color && tiling->internal_bpp >= V3D_INTERNAL_BPP_128) { + cl_emit(rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART3, rt) { + rt.clear_color_top_bits = /* 56 bits (24 + 32) */ + (((uint64_t) (color[2] & 0xffffff00)) >> 8) | + (((uint64_t) (color[3])) << 24); + rt.render_target_number = 0; + } + } #endif cl_emit(rcl, TILE_RENDERING_MODE_CFG_ZS_CLEAR_VALUES, clear) { @@ -229,9 +238,8 @@ emit_frame_setup(struct v3dv_job *job, } #endif #if V3D_VERSION >= 71 - unreachable("Hardware generation 71 not supported yet."); + cl_emit(rcl, CLEAR_RENDER_TARGETS, clear); #endif - } cl_emit(rcl, END_OF_TILE_MARKER, end); } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0088-v3dv-fix-up-texture-shader-state-for-v71.patch ================================================ From 1e9d7d69849fa646b331f7661c74ee138badc4bb Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Mon, 25 Oct 2021 01:37:12 +0200 Subject: [PATCH 088/142] v3dv: fix up texture shader state for v71 There are some new fields for YCbCr with pointers for the various planes in multi-planar formats. These need to match the base address pointer in the texture state, or the hardware will assume this is a multi-planar texture. --- src/broadcom/vulkan/v3dvx_image.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/broadcom/vulkan/v3dvx_image.c b/src/broadcom/vulkan/v3dvx_image.c index dac6ff2741f..848290c2a47 100644 --- a/src/broadcom/vulkan/v3dvx_image.c +++ b/src/broadcom/vulkan/v3dvx_image.c @@ -129,6 +129,14 @@ pack_texture_shader_state_helper(struct v3dv_device *device, v3dv_layer_offset(image, 0, image_view->vk.base_array_layer, iplane); tex.texture_base_pointer = v3dv_cl_address(NULL, base_offset); + +#if V3D_VERSION >= 71 + tex.chroma_offset_x = 1; + tex.chroma_offset_y = 1; + /* See comment in XML field definition for rationale of the shifts */ + tex.texture_base_pointer_cb = base_offset >> 6; + tex.texture_base_pointer_cr = base_offset >> 6; +#endif } } } @@ -191,5 +199,13 @@ v3dX(pack_texture_shader_state_from_buffer_view)(struct v3dv_device *device, buffer_view->offset; tex.texture_base_pointer = v3dv_cl_address(NULL, base_offset); + +#if V3D_VERSION >= 71 + tex.chroma_offset_x = 1; + tex.chroma_offset_y = 1; + /* See comment in XML field definition for rationale of the shifts */ + tex.texture_base_pointer_cb = base_offset >> 6; + tex.texture_base_pointer_cr = base_offset >> 6; +#endif } } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0089-v3dv-handle-new-texture-state-transfer-functions-in-.patch ================================================ From 1f150a3a92741f7654a13626bd5b27b5575f2b76 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Mon, 25 Oct 2021 01:38:31 +0200 Subject: [PATCH 089/142] v3dv: handle new texture state transfer functions in v71 --- src/broadcom/vulkan/v3dvx_image.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/broadcom/vulkan/v3dvx_image.c b/src/broadcom/vulkan/v3dvx_image.c index 848290c2a47..437d4588c7e 100644 --- a/src/broadcom/vulkan/v3dvx_image.c +++ b/src/broadcom/vulkan/v3dvx_image.c @@ -108,15 +108,16 @@ pack_texture_shader_state_helper(struct v3dv_device *device, tex.array_stride_64_byte_aligned = image->planes[iplane].cube_map_stride / 64; + bool is_srgb = vk_format_is_srgb(image_view->vk.format); #if V3D_VERSION == 42 tex.reverse_standard_border_color = image_view->planes[plane].channel_reverse; #endif #if V3D_VERSION == 42 - tex.srgb = vk_format_is_srgb(image_view->vk.view_format); + tex.srgb = is_srgb; #endif #if V3D_VERSION >= 71 - unreachable("Hardware generation 71 not supported yet."); + tex.transfer_func = is_srgb ? TRANSFER_FUNC_SRGB : TRANSFER_FUNC_NONE; #endif /* At this point we don't have the job. That's the reason the first @@ -181,11 +182,13 @@ v3dX(pack_texture_shader_state_from_buffer_view)(struct v3dv_device *device, assert(buffer_view->format->plane_count == 1); tex.texture_type = buffer_view->format->planes[0].tex_type; + + bool is_srgb = vk_format_is_srgb(buffer_view->vk_format); #if V3D_VERSION == 42 - tex.srgb = vk_format_is_srgb(buffer_view->vk_format); + tex.srgb = is_srgb; #endif #if V3D_VERSION >= 71 - unreachable("Hardware generation 71 not supported yet."); + tex.transfer_func = is_srgb ? TRANSFER_FUNC_SRGB : TRANSFER_FUNC_NONE; #endif /* At this point we don't have the job. That's the reason the first -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0090-v3dv-implement-noop-job-for-v71.patch ================================================ From 45de9f019ee92635de9a505db58439f0f4561281 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 28 Sep 2021 08:14:11 +0200 Subject: [PATCH 090/142] v3dv: implement noop job for v71 --- src/broadcom/vulkan/v3dvx_queue.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/broadcom/vulkan/v3dvx_queue.c b/src/broadcom/vulkan/v3dvx_queue.c index 1a26d04aef7..f8cee36e3bf 100644 --- a/src/broadcom/vulkan/v3dvx_queue.c +++ b/src/broadcom/vulkan/v3dvx_queue.c @@ -46,7 +46,8 @@ v3dX(job_emit_noop)(struct v3dv_job *job) config.maximum_bpp_of_all_render_targets = V3D_INTERNAL_BPP_32; #endif #if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); + config.log2_tile_width = 3; /* Tile size 64 */ + config.log2_tile_height = 3; /* Tile size 64 */ #endif } @@ -58,10 +59,13 @@ v3dX(job_emit_noop)(struct v3dv_job *job) } #endif #if V3D_VERSION >= 71 - unreachable("Hardware generation 71 not supported yet."); + cl_emit(rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1, rt) { + rt.internal_bpp = V3D_INTERNAL_BPP_32; + rt.internal_type_and_clamping = V3D_RENDER_TARGET_TYPE_CLAMP_8; + rt.stride = 1; /* Unused RT */ + } #endif - cl_emit(rcl, TILE_RENDERING_MODE_CFG_ZS_CLEAR_VALUES, clear) { clear.z_clear_value = 1.0f; clear.stencil_clear_value = 0; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0091-v3dv-handle-render-pass-global-clear-for-v71.patch ================================================ From 3e607bb28056bb52242be6878281efae84026813 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 28 Sep 2021 08:23:48 +0200 Subject: [PATCH 091/142] v3dv: handle render pass global clear for v71 --- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 66 ++++++++++++++++---------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index 1b39e230580..48b2e319e51 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -362,6 +362,11 @@ cmd_buffer_render_pass_emit_store(struct v3dv_cmd_buffer *cmd_buffer, iview->vk.base_array_layer + layer, image_plane); + /* The Clear Buffer bit is not supported for Z/Stencil stores in 7.x and it + * is broken in earlier V3D versions. + */ + assert((buffer != Z && buffer != STENCIL && buffer != ZSTENCIL) || !clear); + cl_emit(cl, STORE_TILE_BUFFER_GENERAL, store) { store.buffer_to_store = buffer; store.address = v3dv_cl_address(image->planes[image_plane].mem->bo, layer_offset); @@ -484,6 +489,30 @@ cmd_buffer_render_pass_emit_stores(struct v3dv_cmd_buffer *cmd_buffer, const VkImageAspectFlags aspects = vk_format_aspects(ds_attachment->desc.format); +#if V3D_VERSION <= 42 + /* GFXH-1689: The per-buffer store command's clear buffer bit is broken + * for depth/stencil. + * + * There used to be some confusion regarding the Clear Tile Buffers + * Z/S bit also being broken, but we confirmed with Broadcom that this + * is not the case, it was just that some other hardware bugs (that we + * need to work around, such as GFXH-1461) could cause this bit to behave + * incorrectly. + * + * There used to be another issue where the RTs bit in the Clear Tile + * Buffers packet also cleared Z/S, but Broadcom confirmed this is + * fixed since V3D 4.1. + * + * So if we have to emit a clear of depth or stencil we don't use + * the per-buffer store clear bit, even if we need to store the buffers, + * instead we always have to use the Clear Tile Buffers Z/S bit. + * If we have configured the job to do early Z/S clearing, then we + * don't want to emit any Clear Tile Buffers command at all here. + * + * Note that GFXH-1689 is not reproduced in the simulator, where + * using the clear buffer bit in depth/stencil stores works fine. + */ + /* Only clear once on the first subpass that uses the attachment */ uint32_t ds_first_subpass = !state->pass->multiview_enabled ? ds_attachment->first_subpass : @@ -503,6 +532,17 @@ cmd_buffer_render_pass_emit_stores(struct v3dv_cmd_buffer *cmd_buffer, ds_attachment->desc.stencilLoadOp, subpass->do_stencil_clear_with_draw); + use_global_zs_clear = !state->job->early_zs_clear && + (needs_depth_clear || needs_stencil_clear); +#endif +#if V3D_VERSION >= 71 + /* The store command's clear buffer bit cannot be used for Z/S stencil: + * since V3D 4.5.6 Z/S buffers are automatically cleared between tiles, + * so we don't want to emit redundant clears here. + */ + use_global_zs_clear = false; +#endif + /* Skip the last store if it is not required */ uint32_t ds_last_subpass = !pass->multiview_enabled ? ds_attachment->last_subpass : @@ -545,30 +585,6 @@ cmd_buffer_render_pass_emit_stores(struct v3dv_cmd_buffer *cmd_buffer, needs_stencil_store = subpass->resolve_stencil; } - /* GFXH-1689: The per-buffer store command's clear buffer bit is broken - * for depth/stencil. - * - * There used to be some confusion regarding the Clear Tile Buffers - * Z/S bit also being broken, but we confirmed with Broadcom that this - * is not the case, it was just that some other hardware bugs (that we - * need to work around, such as GFXH-1461) could cause this bit to behave - * incorrectly. - * - * There used to be another issue where the RTs bit in the Clear Tile - * Buffers packet also cleared Z/S, but Broadcom confirmed this is - * fixed since V3D 4.1. - * - * So if we have to emit a clear of depth or stencil we don't use - * the per-buffer store clear bit, even if we need to store the buffers, - * instead we always have to use the Clear Tile Buffers Z/S bit. - * If we have configured the job to do early Z/S clearing, then we - * don't want to emit any Clear Tile Buffers command at all here. - * - * Note that GFXH-1689 is not reproduced in the simulator, where - * using the clear buffer bit in depth/stencil stores works fine. - */ - use_global_zs_clear = !state->job->early_zs_clear && - (needs_depth_clear || needs_stencil_clear); if (needs_depth_store || needs_stencil_store) { const uint32_t zs_buffer = v3dv_zs_buffer(needs_depth_store, needs_stencil_store); @@ -673,7 +689,7 @@ cmd_buffer_render_pass_emit_stores(struct v3dv_cmd_buffer *cmd_buffer, } #endif #if V3D_VERSION >= 71 - unreachable("Hardware generation 71 not supported yet."); + cl_emit(cl, CLEAR_RENDER_TARGETS, clear); #endif } } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0092-v3dv-GFX-1461-does-not-affect-V3D-7.x.patch ================================================ From 3794f6f08c559c4e442b57e992d501fb7d515b9b Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 28 Sep 2021 08:31:04 +0200 Subject: [PATCH 092/142] v3dv: GFX-1461 does not affect V3D 7.x --- src/broadcom/vulkan/v3dv_pass.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_pass.c b/src/broadcom/vulkan/v3dv_pass.c index 20f5014268d..3e82c15df88 100644 --- a/src/broadcom/vulkan/v3dv_pass.c +++ b/src/broadcom/vulkan/v3dv_pass.c @@ -236,11 +236,13 @@ v3dv_CreateRenderPass2(VkDevice _device, /* GFXH-1461: if depth is cleared but stencil is loaded (or vice versa), * the clear might get lost. If a subpass has this then we can't emit - * the clear using the TLB and we have to do it as a draw call. + * the clear using the TLB and we have to do it as a draw call. This + * issue is fixed since V3D 4.3.18. * * FIXME: separate stencil. */ - if (subpass->ds_attachment.attachment != VK_ATTACHMENT_UNUSED) { + if (device->devinfo.ver == 42 && + subpass->ds_attachment.attachment != VK_ATTACHMENT_UNUSED) { struct v3dv_render_pass_attachment *att = &pass->attachments[subpass->ds_attachment.attachment]; if (att->desc.format == VK_FORMAT_D24_UNORM_S8_UINT) { -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0093-v3dv-update-thread-end-restrictions-validation-for-v.patch ================================================ From 5be7f484210103e40b77fa3135042da4a8406659 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 28 Sep 2021 08:59:08 +0200 Subject: [PATCH 093/142] v3dv: update thread end restrictions validation for v71 --- src/broadcom/compiler/qpu_validate.c | 37 +++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/broadcom/compiler/qpu_validate.c b/src/broadcom/compiler/qpu_validate.c index 1082fb7d50a..0466ee5d0b6 100644 --- a/src/broadcom/compiler/qpu_validate.c +++ b/src/broadcom/compiler/qpu_validate.c @@ -316,17 +316,48 @@ qpu_validate_inst(struct v3d_qpu_validate_state *state, struct qinst *qinst) inst->type == V3D_QPU_INSTR_TYPE_ALU) { if ((inst->alu.add.op != V3D_QPU_A_NOP && !inst->alu.add.magic_write)) { - fail_instr(state, "RF write after THREND"); + if (devinfo->ver <= 42) { + fail_instr(state, "RF write after THREND"); + } else if (devinfo->ver >= 71) { + if (state->last_thrsw_ip - state->ip == 0) { + fail_instr(state, + "ADD RF write at THREND"); + } + if (inst->alu.add.waddr == 2 || + inst->alu.add.waddr == 3) { + fail_instr(state, + "RF2-3 write after THREND"); + } + } } if ((inst->alu.mul.op != V3D_QPU_M_NOP && !inst->alu.mul.magic_write)) { - fail_instr(state, "RF write after THREND"); + if (devinfo->ver <= 42) { + fail_instr(state, "RF write after THREND"); + } else if (devinfo->ver >= 71) { + if (state->last_thrsw_ip - state->ip == 0) { + fail_instr(state, + "MUL RF write at THREND"); + } + + if (inst->alu.mul.waddr == 2 || + inst->alu.mul.waddr == 3) { + fail_instr(state, + "RF2-3 write after THREND"); + } + } } if (v3d_qpu_sig_writes_address(devinfo, &inst->sig) && !inst->sig_magic) { - fail_instr(state, "RF write after THREND"); + if (devinfo->ver <= 42) { + fail_instr(state, "RF write after THREND"); + } else if (devinfo->ver >= 71 && + (inst->sig_addr == 2 || + inst->sig_addr == 3)) { + fail_instr(state, "RF2-3 write after THREND"); + } } /* GFXH-1625: No TMUWT in the last instruction */ -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0094-v3dv-handle-early-Z-S-clears-for-v71.patch ================================================ From a751dff57b6d769f5b031054cc65415cc3b44c08 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 29 Sep 2021 08:22:59 +0200 Subject: [PATCH 094/142] v3dv: handle early Z/S clears for v71 --- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 30 ++++++++++++++++++++------ 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index 48b2e319e51..4580e2a4650 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -998,6 +998,10 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) * Early-Z/S clearing is independent of Early Z/S testing, so it is * possible to enable one but not the other so long as their * respective requirements are met. + * + * From V3D 4.5.6, Z/S buffers are always cleared automatically + * between tiles, but we still want to enable early ZS clears + * when Z/S are not loaded or stored. */ struct v3dv_render_pass_attachment *ds_attachment = &pass->attachments[ds_attachment_idx]; @@ -1005,21 +1009,33 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) const VkImageAspectFlags ds_aspects = vk_format_aspects(ds_attachment->desc.format); - bool needs_depth_clear = - check_needs_clear(state, - ds_aspects & VK_IMAGE_ASPECT_DEPTH_BIT, - ds_attachment->first_subpass, - ds_attachment->desc.loadOp, - subpass->do_depth_clear_with_draw); - bool needs_depth_store = v3dv_cmd_buffer_check_needs_store(state, ds_aspects & VK_IMAGE_ASPECT_DEPTH_BIT, ds_attachment->last_subpass, ds_attachment->desc.storeOp) || subpass->resolve_depth; +#if V3D_VERSION <= 42 + bool needs_depth_clear = + check_needs_clear(state, + ds_aspects & VK_IMAGE_ASPECT_DEPTH_BIT, + ds_attachment->first_subpass, + ds_attachment->desc.loadOp, + subpass->do_depth_clear_with_draw); do_early_zs_clear = needs_depth_clear && !needs_depth_store; +#endif +#if V3D_VERSION >= 71 + bool needs_depth_load = + v3dv_cmd_buffer_check_needs_load(state, + ds_aspects & VK_IMAGE_ASPECT_DEPTH_BIT, + ds_attachment->first_subpass, + ds_attachment->desc.loadOp, + ds_attachment->last_subpass, + ds_attachment->desc.storeOp); + do_early_zs_clear = !needs_depth_load && !needs_depth_store; +#endif + if (do_early_zs_clear && vk_format_has_stencil(ds_attachment->desc.format)) { bool needs_stencil_load = -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0095-v3dv-handle-RTs-with-no-color-targets-in-v71.patch ================================================ From 2add46ebce4760bf8349606201324ee0e6b1f9da Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 29 Sep 2021 09:07:28 +0200 Subject: [PATCH 095/142] v3dv: handle RTs with no color targets in v71 --- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index 4580e2a4650..750486a6ccf 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -1175,6 +1175,17 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) #endif } +#if V3D_VERSION >= 71 + /* If we don't have any color RTs, we still need to emit one and flag + * it as not used using stride = 1. + */ + if (subpass->color_count == 0) { + cl_emit(rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1, rt) { + rt.stride = 1; + } + } +#endif + #if V3D_VERSION == 42 cl_emit(rcl, TILE_RENDERING_MODE_CFG_COLOR, rt) { cmd_buffer_render_pass_setup_render_target -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0096-v3dv-no-specific-separate_segments-flag-for-V3D-7.1.patch ================================================ From 019abbd34d2d904d6bb33f9fa4433cb53ca7899c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Fri, 1 Oct 2021 15:18:38 +0200 Subject: [PATCH 096/142] v3dv: no specific separate_segments flag for V3D 7.1 On V3D 7.1 there is not a flag on the Shader State Record to specify if we are using shared or separate segments. This is done by setting the vpm input size to 0 (so we need to ensure that the output would be the max needed for input/output). We were already doing the latter on the prog_data_vs, so we just need to use those values, instead of assigning default values. As we are here, we also add some comments on the compiler part. --- src/broadcom/compiler/qpu_schedule.c | 4 ++++ src/broadcom/compiler/vir.c | 4 ++++ src/broadcom/vulkan/v3dvx_pipeline.c | 15 +++++++++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index 77fb6a794e6..4f767296860 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -297,6 +297,10 @@ calculate_deps(struct schedule_state *state, struct schedule_node *n) /* If the input and output segments are shared, then all VPM reads to * a location need to happen before all writes. We handle this by * serializing all VPM operations for now. + * + * FIXME: we are assuming that the segments are shared. That is + * correct right now as we are only using shared, but technically you + * can choose. */ bool separate_vpm_segment = false; diff --git a/src/broadcom/compiler/vir.c b/src/broadcom/compiler/vir.c index 7612eed7130..dd0aa761c43 100644 --- a/src/broadcom/compiler/vir.c +++ b/src/broadcom/compiler/vir.c @@ -745,6 +745,10 @@ v3d_vs_set_prog_data(struct v3d_compile *c, /* Set us up for shared input/output segments. This is apparently * necessary for our VCM setup to avoid varying corruption. + * + * FIXME: initially testing on V3D 7.1 seems to work fine when using + * separate segments. So we could try to reevaluate in the future, if + * there is any advantage of using separate segments. */ prog_data->separate_segments = false; prog_data->vpm_output_size = MAX2(prog_data->vpm_output_size, diff --git a/src/broadcom/vulkan/v3dvx_pipeline.c b/src/broadcom/vulkan/v3dvx_pipeline.c index a640c1d084a..a72ca3c241b 100644 --- a/src/broadcom/vulkan/v3dvx_pipeline.c +++ b/src/broadcom/vulkan/v3dvx_pipeline.c @@ -452,14 +452,25 @@ pack_shader_state_record(struct v3dv_pipeline *pipeline) prog_data_vs_bin->separate_segments; shader.vertex_shader_has_separate_input_and_output_vpm_blocks = prog_data_vs->separate_segments; -#endif - shader.coordinate_shader_input_vpm_segment_size = prog_data_vs_bin->separate_segments ? prog_data_vs_bin->vpm_input_size : 1; shader.vertex_shader_input_vpm_segment_size = prog_data_vs->separate_segments ? prog_data_vs->vpm_input_size : 1; +#endif + + /* On V3D 7.1 there isn't a specific flag to set if we are using + * shared/separate segments or not. We just set the value of + * vpm_input_size to 0, and set output to the max needed. That should be + * already properly set on prog_data_vs_bin + */ +#if V3D_VERSION == 71 + shader.coordinate_shader_input_vpm_segment_size = + prog_data_vs_bin->vpm_input_size; + shader.vertex_shader_input_vpm_segment_size = + prog_data_vs->vpm_input_size; +#endif shader.coordinate_shader_output_vpm_segment_size = prog_data_vs_bin->vpm_output_size; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0097-v3dv-don-t-convert-floating-point-border-colors-in-v.patch ================================================ From 4f6b4f91577ec04aab907d59d836d0c17731a9d0 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Thu, 7 Oct 2021 12:43:49 +0200 Subject: [PATCH 097/142] v3dv: don't convert floating point border colors in v71 The TMU does this for us now. --- src/broadcom/vulkan/v3dvx_device.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/broadcom/vulkan/v3dvx_device.c b/src/broadcom/vulkan/v3dvx_device.c index e235983864c..72daefadb08 100644 --- a/src/broadcom/vulkan/v3dvx_device.c +++ b/src/broadcom/vulkan/v3dvx_device.c @@ -118,7 +118,11 @@ static union pipe_color_union encode_border_color( (1 << (desc->channel[i].size - 1)) - 1); } - /* convert from float to expected format */ +#if V3D_VERSION <= 42 + /* The TMU in V3D 7.x always takes 32-bit floats and handles conversions + * for us. In V3D 4.x we need to manually convert floating point color + * values to the expected format. + */ if (vk_format_is_srgb(bc_info->format) || vk_format_is_compressed(bc_info->format)) { for (int i = 0; i < 4; i++) @@ -170,6 +174,7 @@ static union pipe_color_union encode_border_color( } } } +#endif return border; } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0098-v3dv-handle-Z-clipping-in-v71.patch ================================================ From d8083cb8f104e0f035f5b812e000a500fa52d66f Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Fri, 15 Oct 2021 13:06:31 +0200 Subject: [PATCH 098/142] v3dv: handle Z clipping in v71 Fixes the following tests: dEQP-VK.clipping.clip_volume.* dEQP-VK.draw.inverted_depth_ranges.nodepthclamp_* (except deltazero) --- src/broadcom/vulkan/v3dvx_pipeline.c | 33 ++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/broadcom/vulkan/v3dvx_pipeline.c b/src/broadcom/vulkan/v3dvx_pipeline.c index a72ca3c241b..7b1133f8173 100644 --- a/src/broadcom/vulkan/v3dvx_pipeline.c +++ b/src/broadcom/vulkan/v3dvx_pipeline.c @@ -227,6 +227,39 @@ pack_cfg_bits(struct v3dv_pipeline *pipeline, ds_info ? ds_info->stencilTestEnable && has_ds_attachment: false; pipeline->z_updates_enable = config.z_updates_enable; + +#if V3D_VERSION >= 71 + /* From the Vulkan spec: + * + * "depthClampEnable controls whether to clamp the fragment’s depth + * values as described in Depth Test. If the pipeline is not created + * with VkPipelineRasterizationDepthClipStateCreateInfoEXT present + * then enabling depth clamp will also disable clipping primitives to + * the z planes of the frustrum as described in Primitive Clipping. + * Otherwise depth clipping is controlled by the state set in + * VkPipelineRasterizationDepthClipStateCreateInfoEXT." + * + * Note: neither depth clamping nor VK_EXT_depth_clip_enable are actually + * supported in the driver yet, so in practice we are always enabling Z + * clipping for now. + */ + bool z_clip_enable = false; + const VkPipelineRasterizationDepthClipStateCreateInfoEXT *clip_info = + ds_info ? vk_find_struct_const(ds_info->pNext, + PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT) : + NULL; + if (clip_info) + z_clip_enable = clip_info->depthClipEnable; + else if (!(rs_info && rs_info->depthClampEnable)) + z_clip_enable = true; + + if (z_clip_enable) { + config.z_clipping_mode = pipeline->negative_one_to_one ? + V3D_Z_CLIP_MODE_MIN_ONE_TO_ONE : V3D_Z_CLIP_MODE_ZERO_TO_ONE; + } else { + config.z_clipping_mode = V3D_Z_CLIP_MODE_NONE; + } +#endif }; } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0099-broadcom-common-add-TFU-register-definitions-for-v71.patch ================================================ From 2925fa6dc936d9268a59d8d7d4a775e89fd3fbdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Wed, 17 Nov 2021 11:33:59 +0100 Subject: [PATCH 099/142] broadcom/common: add TFU register definitions for v71 --- src/broadcom/common/v3d_tfu.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/broadcom/common/v3d_tfu.h b/src/broadcom/common/v3d_tfu.h index 80da224ca2d..572d0074794 100644 --- a/src/broadcom/common/v3d_tfu.h +++ b/src/broadcom/common/v3d_tfu.h @@ -48,4 +48,27 @@ #define V3D33_TFU_ICFG_FORMAT_UIF_NO_XOR 14 #define V3D33_TFU_ICFG_FORMAT_UIF_XOR 15 +/* Disable level 0 write, just write following mipmaps */ +#define V3D71_TFU_IOC_DIMTW (1 << 0) +#define V3D71_TFU_IOC_FORMAT_SHIFT 12 +#define V3D71_TFU_IOC_FORMAT_LINEARTILE 3 +#define V3D71_TFU_IOA_FORMAT_UBLINEAR_1_COLUMN 4 +#define V3D71_TFU_IOA_FORMAT_UBLINEAR_2_COLUMN 5 +#define V3D71_TFU_IOA_FORMAT_UIF_NO_XOR 6 +#define V3D71_TFU_IOA_FORMAT_UIF_XOR 7 + +#define V3D71_TFU_IOC_STRIDE_SHIFT 16 +#define V3D71_TFU_IOC_NUMMM_SHIFT 4 + +#define V3D71_TFU_ICFG_OTYPE_SHIFT 16 +#define V3D71_TFU_ICFG_IFORMAT_SHIFT 23 +#define V3D71_TFU_ICFG_FORMAT_RASTER 0 +#define V3D71_TFU_ICFG_FORMAT_SAND_128 1 +#define V3D71_TFU_ICFG_FORMAT_SAND_256 2 +#define V3D71_TFU_ICFG_FORMAT_LINEARTILE 11 +#define V3D71_TFU_ICFG_FORMAT_UBLINEAR_1_COLUMN 12 +#define V3D71_TFU_ICFG_FORMAT_UBLINEAR_2_COLUMN 13 +#define V3D71_TFU_ICFG_FORMAT_UIF_NO_XOR 14 +#define V3D71_TFU_ICFG_FORMAT_UIF_XOR 15 + #endif -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0100-broadcom-simulator-TFU-register-names-changed-for-v7.patch ================================================ From 6d10aa8a64e009d4d1f4f05885621bd2d9a72465 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Thu, 23 Sep 2021 13:09:41 +0200 Subject: [PATCH 100/142] broadcom/simulator: TFU register names changed for v71 --- src/broadcom/simulator/v3dx_simulator.c | 39 +++++++++++++++---------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/src/broadcom/simulator/v3dx_simulator.c b/src/broadcom/simulator/v3dx_simulator.c index f23b0538de3..494f44a6b5d 100644 --- a/src/broadcom/simulator/v3dx_simulator.c +++ b/src/broadcom/simulator/v3dx_simulator.c @@ -182,26 +182,33 @@ v3d_flush_caches(struct v3d_hw *v3d) v3d_flush_l2t(v3d); } +#if V3D_VERSION < 71 +#define TFU_REG(NAME) V3D_TFU_ ## NAME +#else +#define TFU_REG(NAME) V3D_IFC_ ## NAME +#endif + + int v3dX(simulator_submit_tfu_ioctl)(struct v3d_hw *v3d, struct drm_v3d_submit_tfu *args) { - int last_vtct = V3D_READ(V3D_TFU_CS) & V3D_TFU_CS_CVTCT_SET; - - V3D_WRITE(V3D_TFU_IIA, args->iia); - V3D_WRITE(V3D_TFU_IIS, args->iis); - V3D_WRITE(V3D_TFU_ICA, args->ica); - V3D_WRITE(V3D_TFU_IUA, args->iua); - V3D_WRITE(V3D_TFU_IOA, args->ioa); - V3D_WRITE(V3D_TFU_IOS, args->ios); - V3D_WRITE(V3D_TFU_COEF0, args->coef[0]); - V3D_WRITE(V3D_TFU_COEF1, args->coef[1]); - V3D_WRITE(V3D_TFU_COEF2, args->coef[2]); - V3D_WRITE(V3D_TFU_COEF3, args->coef[3]); - - V3D_WRITE(V3D_TFU_ICFG, args->icfg); - - while ((V3D_READ(V3D_TFU_CS) & V3D_TFU_CS_CVTCT_SET) == last_vtct) { + int last_vtct = V3D_READ(TFU_REG(CS)) & V3D_TFU_CS_CVTCT_SET; + + V3D_WRITE(TFU_REG(IIA), args->iia); + V3D_WRITE(TFU_REG(IIS), args->iis); + V3D_WRITE(TFU_REG(ICA), args->ica); + V3D_WRITE(TFU_REG(IUA), args->iua); + V3D_WRITE(TFU_REG(IOA), args->ioa); + V3D_WRITE(TFU_REG(IOS), args->ios); + V3D_WRITE(TFU_REG(COEF0), args->coef[0]); + V3D_WRITE(TFU_REG(COEF1), args->coef[1]); + V3D_WRITE(TFU_REG(COEF2), args->coef[2]); + V3D_WRITE(TFU_REG(COEF3), args->coef[3]); + + V3D_WRITE(TFU_REG(ICFG), args->icfg); + + while ((V3D_READ(TFU_REG(CS)) & V3D_TFU_CS_CVTCT_SET) == last_vtct) { v3d_hw_tick(v3d); } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0101-v3dv-add-support-for-TFU-jobs-in-v71.patch ================================================ From 780f012747f2cc6e816b1955081dbeca9a0abe5c Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Thu, 23 Sep 2021 12:12:18 +0200 Subject: [PATCH 101/142] v3dv: add support for TFU jobs in v71 --- include/drm-uapi/v3d_drm.h | 5 ++++ src/broadcom/simulator/v3dx_simulator.c | 3 ++ src/broadcom/vulkan/v3dvx_meta_common.c | 37 +++++++++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/include/drm-uapi/v3d_drm.h b/include/drm-uapi/v3d_drm.h index 3dfc0af8756..1a7d7a689de 100644 --- a/include/drm-uapi/v3d_drm.h +++ b/include/drm-uapi/v3d_drm.h @@ -319,6 +319,11 @@ struct drm_v3d_submit_tfu { /* Pointer to an array of ioctl extensions*/ __u64 extensions; + + struct { + __u32 ioc; + __u32 pad; + } v71; }; /* Submits a compute shader for dispatch. This job will block on any diff --git a/src/broadcom/simulator/v3dx_simulator.c b/src/broadcom/simulator/v3dx_simulator.c index 494f44a6b5d..4ea177c9bb7 100644 --- a/src/broadcom/simulator/v3dx_simulator.c +++ b/src/broadcom/simulator/v3dx_simulator.c @@ -200,6 +200,9 @@ v3dX(simulator_submit_tfu_ioctl)(struct v3d_hw *v3d, V3D_WRITE(TFU_REG(ICA), args->ica); V3D_WRITE(TFU_REG(IUA), args->iua); V3D_WRITE(TFU_REG(IOA), args->ioa); +#if V3D_VERSION >= 71 + V3D_WRITE(TFU_REG(IOC), args->v71.ioc); +#endif V3D_WRITE(TFU_REG(IOS), args->ios); V3D_WRITE(TFU_REG(COEF0), args->coef[0]); V3D_WRITE(TFU_REG(COEF1), args->coef[1]); diff --git a/src/broadcom/vulkan/v3dvx_meta_common.c b/src/broadcom/vulkan/v3dvx_meta_common.c index 09ebcfa97c1..b8f3297bc94 100644 --- a/src/broadcom/vulkan/v3dvx_meta_common.c +++ b/src/broadcom/vulkan/v3dvx_meta_common.c @@ -950,6 +950,7 @@ v3dX(meta_emit_tfu_job)(struct v3dv_cmd_buffer *cmd_buffer, tfu.iia |= src_offset; +#if V3D_VERSION <= 42 if (src_tiling == V3D_TILING_RASTER) { tfu.icfg = V3D33_TFU_ICFG_FORMAT_RASTER << V3D33_TFU_ICFG_FORMAT_SHIFT; } else { @@ -958,12 +959,46 @@ v3dX(meta_emit_tfu_job)(struct v3dv_cmd_buffer *cmd_buffer, V3D33_TFU_ICFG_FORMAT_SHIFT; } tfu.icfg |= format_plane->tex_type << V3D33_TFU_ICFG_TTYPE_SHIFT; +#endif +#if V3D_VERSION >= 71 + if (src_tiling == V3D_TILING_RASTER) { + tfu.icfg = V3D71_TFU_ICFG_FORMAT_RASTER << V3D71_TFU_ICFG_IFORMAT_SHIFT; + } else { + tfu.icfg = (V3D71_TFU_ICFG_FORMAT_LINEARTILE + + (src_tiling - V3D_TILING_LINEARTILE)) << + V3D71_TFU_ICFG_IFORMAT_SHIFT; + } + tfu.icfg |= format_plane->tex_type << V3D71_TFU_ICFG_OTYPE_SHIFT; +#endif tfu.ioa = dst_offset; +#if V3D_VERSION <= 42 tfu.ioa |= (V3D33_TFU_IOA_FORMAT_LINEARTILE + (dst_tiling - V3D_TILING_LINEARTILE)) << V3D33_TFU_IOA_FORMAT_SHIFT; +#endif + +#if V3D_VERSION >= 71 + tfu.v71.ioc = (V3D71_TFU_IOC_FORMAT_LINEARTILE + + (dst_tiling - V3D_TILING_LINEARTILE)) << + V3D71_TFU_IOC_FORMAT_SHIFT; + + switch (dst_tiling) { + case V3D_TILING_UIF_NO_XOR: + case V3D_TILING_UIF_XOR: + tfu.v71.ioc |= + (dst_padded_height_or_stride / (2 * v3d_utile_height(dst_cpp))) << + V3D71_TFU_IOC_STRIDE_SHIFT; + break; + case V3D_TILING_RASTER: + tfu.v71.ioc |= (dst_padded_height_or_stride / dst_cpp) << + V3D71_TFU_IOC_STRIDE_SHIFT; + break; + default: + break; + } +#endif switch (src_tiling) { case V3D_TILING_UIF_NO_XOR: @@ -980,6 +1015,7 @@ v3dX(meta_emit_tfu_job)(struct v3dv_cmd_buffer *cmd_buffer, /* The TFU can handle raster sources but always produces UIF results */ assert(dst_tiling != V3D_TILING_RASTER); +#if V3D_VERSION <= 42 /* If we're writing level 0 (!IOA_DIMTW), then we need to supply the * OPAD field for the destination (how many extra UIF blocks beyond * those necessary to cover the height). @@ -991,6 +1027,7 @@ v3dX(meta_emit_tfu_job)(struct v3dv_cmd_buffer *cmd_buffer, uif_block_h; tfu.icfg |= icfg << V3D33_TFU_ICFG_OPAD_SHIFT; } +#endif v3dv_cmd_buffer_add_tfu_job(cmd_buffer, &tfu); } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0102-v3dv-make-v3dv_viewport_compute_xform-depend-on-the-.patch ================================================ From 07cba940af2fe0c40641816bee280b57a40973fb Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 20 Oct 2021 11:22:11 +0200 Subject: [PATCH 102/142] v3dv: make v3dv_viewport_compute_xform depend on the V3D version For 4.x we have a workaround for too small Z scale values that is not required for V3D 7.x. --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 40 +++----------------------- src/broadcom/vulkan/v3dv_pipeline.c | 7 +++-- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 37 ++++++++++++++++++++++++ src/broadcom/vulkan/v3dvx_private.h | 5 ++++ 4 files changed, 50 insertions(+), 39 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 96360a96b44..bda0a614523 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -2131,39 +2131,6 @@ v3dv_CmdBindPipeline(VkCommandBuffer commandBuffer, } } -/* FIXME: C&P from radv. tu has similar code. Perhaps common place? */ -void -v3dv_viewport_compute_xform(const VkViewport *viewport, - float scale[3], - float translate[3]) -{ - float x = viewport->x; - float y = viewport->y; - float half_width = 0.5f * viewport->width; - float half_height = 0.5f * viewport->height; - double n = viewport->minDepth; - double f = viewport->maxDepth; - - scale[0] = half_width; - translate[0] = half_width + x; - scale[1] = half_height; - translate[1] = half_height + y; - - scale[2] = (f - n); - translate[2] = n; - - /* It seems that if the scale is small enough the hardware won't clip - * correctly so we work around this my choosing the smallest scale that - * seems to work. - * - * This case is exercised by CTS: - * dEQP-VK.draw.inverted_depth_ranges.nodepthclamp_deltazero - */ - const float min_abs_scale = 0.000009f; - if (fabs(scale[2]) < min_abs_scale) - scale[2] = scale[2] < 0 ? -min_abs_scale : min_abs_scale; -} - /* Considers the pipeline's negative_one_to_one state and applies it to the * current viewport transform if needed to produce the resulting Z translate * and scale parameters. @@ -2216,9 +2183,10 @@ v3dv_CmdSetViewport(VkCommandBuffer commandBuffer, viewportCount * sizeof(*pViewports)); for (uint32_t i = firstViewport; i < total_count; i++) { - v3dv_viewport_compute_xform(&state->dynamic.viewport.viewports[i], - state->dynamic.viewport.scale[i], - state->dynamic.viewport.translate[i]); + v3dv_X(cmd_buffer->device, viewport_compute_xform) + (&state->dynamic.viewport.viewports[i], + state->dynamic.viewport.scale[i], + state->dynamic.viewport.translate[i]); } cmd_buffer->state.dirty |= V3DV_CMD_DIRTY_VIEWPORT; diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index d012ff8f948..2156176d4cc 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -2661,9 +2661,10 @@ pipeline_init_dynamic_state( pViewportState->viewportCount); for (uint32_t i = 0; i < dynamic->viewport.count; i++) { - v3dv_viewport_compute_xform(&dynamic->viewport.viewports[i], - dynamic->viewport.scale[i], - dynamic->viewport.translate[i]); + v3dv_X(pipeline->device, viewport_compute_xform) + (&dynamic->viewport.viewports[i], + dynamic->viewport.scale[i], + dynamic->viewport.translate[i]); } } diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index 750486a6ccf..f7c13a22423 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -1285,6 +1285,43 @@ v3dX(cmd_buffer_emit_render_pass_rcl)(struct v3dv_cmd_buffer *cmd_buffer) cl_emit(rcl, END_OF_RENDERING, end); } +void +v3dX(viewport_compute_xform)(const VkViewport *viewport, + float scale[3], + float translate[3]) +{ + float x = viewport->x; + float y = viewport->y; + float half_width = 0.5f * viewport->width; + float half_height = 0.5f * viewport->height; + double n = viewport->minDepth; + double f = viewport->maxDepth; + + scale[0] = half_width; + translate[0] = half_width + x; + scale[1] = half_height; + translate[1] = half_height + y; + + scale[2] = (f - n); + translate[2] = n; + + /* It seems that if the scale is small enough the hardware won't clip + * correctly so we work around this my choosing the smallest scale that + * seems to work. + * + * This case is exercised by CTS: + * dEQP-VK.draw.renderpass.inverted_depth_ranges.nodepthclamp_deltazero + * + * V3D 7.x fixes this by using the new + * CLIPPER_Z_SCALE_AND_OFFSET_NO_GUARDBAND. + */ +#if V3D_VERSION <= 42 + const float min_abs_scale = 0.0005f; + if (fabs(scale[2]) < min_abs_scale) + scale[2] = scale[2] < 0 ? -min_abs_scale : min_abs_scale; +#endif +} + void v3dX(cmd_buffer_emit_viewport)(struct v3dv_cmd_buffer *cmd_buffer) { diff --git a/src/broadcom/vulkan/v3dvx_private.h b/src/broadcom/vulkan/v3dvx_private.h index 036ce11b455..81715520913 100644 --- a/src/broadcom/vulkan/v3dvx_private.h +++ b/src/broadcom/vulkan/v3dvx_private.h @@ -339,3 +339,8 @@ v3dX(clamp_for_format_and_type)(uint32_t rt_type, uint32_t v3dX(clamp_for_format_and_type)(uint32_t rt_type, VkFormat vk_format); + +void +v3dX(viewport_compute_xform)(const VkViewport *viewport, + float scale[3], + float translate[3]); -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0103-v3dv-fix-depth-clipping-then-Z-scale-is-too-small-in.patch ================================================ From c6b60ee47c50474030f8a0a92bd4c6a071f926dc Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 14 Feb 2023 10:09:53 +0100 Subject: [PATCH 103/142] v3dv: fix depth clipping then Z scale is too small in V3D 7.x When the Z scale is too small guardband clipping may not clip correctly, so disable it, which is a new option in V3D 7.x. This fixes this test in V3D 7.x without needing any workarounds: dEQP-VK.draw.renderpass.inverted_depth_ranges.nodepthclamp_deltazero --- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index f7c13a22423..3566649aafd 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -1363,10 +1363,28 @@ v3dX(cmd_buffer_emit_viewport)(struct v3dv_cmd_buffer *cmd_buffer) v3dv_cmd_buffer_state_get_viewport_z_xform(&cmd_buffer->state, 0, &translate_z, &scale_z); +#if V3D_VERSION == 42 cl_emit(&job->bcl, CLIPPER_Z_SCALE_AND_OFFSET, clip) { clip.viewport_z_offset_zc_to_zs = translate_z; clip.viewport_z_scale_zc_to_zs = scale_z; } +#endif + +#if V3D_VERSION >= 71 + /* If the Z scale is too small guardband clipping may not clip correctly */ + if (fabsf(scale_z) < 0.01f) { + cl_emit(&job->bcl, CLIPPER_Z_SCALE_AND_OFFSET_NO_GUARDBAND, clip) { + clip.viewport_z_offset_zc_to_zs = translate_z; + clip.viewport_z_scale_zc_to_zs = scale_z; + } + } else { + cl_emit(&job->bcl, CLIPPER_Z_SCALE_AND_OFFSET, clip) { + clip.viewport_z_offset_zc_to_zs = translate_z; + clip.viewport_z_scale_zc_to_zs = scale_z; + } + } +#endif + cl_emit(&job->bcl, CLIPPER_Z_MIN_MAX_CLIPPING_PLANES, clip) { /* Vulkan's default Z NDC is [0..1]. If 'negative_one_to_one' is enabled, * we are using OpenGL's [-1, 1] instead. -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0104-v3d-add-a-non-conformant-warning-for-not-fully-suppo.patch ================================================ From 46e2b22f43290e6fe92f5435af174c4b18bb6ef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 21 Oct 2021 22:52:47 +0200 Subject: [PATCH 104/142] v3d: add a non-conformant warning for not fully supported hw --- src/gallium/drivers/v3d/v3d_screen.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/gallium/drivers/v3d/v3d_screen.c b/src/gallium/drivers/v3d/v3d_screen.c index 98ca9bb69e6..efdb7d615ae 100644 --- a/src/gallium/drivers/v3d/v3d_screen.c +++ b/src/gallium/drivers/v3d/v3d_screen.c @@ -922,6 +922,12 @@ v3d_screen_create(int fd, const struct pipe_screen_config *config, if (!v3d_get_device_info(screen->fd, &screen->devinfo, &v3d_ioctl)) goto fail; + if (screen->devinfo.ver >= 71) { + fprintf(stderr, "WARNING: v3d support for hw version %i is neither " + "a complete nor a conformant OpenGL implementation. Testing " + "use only.\n", screen->devinfo.ver); + } + driParseConfigFiles(config->options, config->options_info, 0, "v3d", NULL, NULL, NULL, 0, NULL, 0); -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0105-v3d-add-v71-hw-generation.patch ================================================ From 46ffdc57ac7fbe71e92b22e1fe93185f3d33a3ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Tue, 23 May 2023 23:32:37 +0200 Subject: [PATCH 105/142] v3d: add v71 hw generation Starting point for v71 version inclusion: * Adds as one of the versions to be compiled on meson * Updated the v3d_X and v3dX macros to include version 71 * Update the code enough to get it building when using v71. Any real v71 support will be implemented on following commits. --- src/gallium/drivers/v3d/meson.build | 2 +- src/gallium/drivers/v3d/v3d_context.h | 22 +++++++++++++---- src/gallium/drivers/v3d/v3dx_draw.c | 21 +++++++++++++--- src/gallium/drivers/v3d/v3dx_emit.c | 11 +++++++++ src/gallium/drivers/v3d/v3dx_rcl.c | 35 ++++++++++++++++++++++----- src/gallium/drivers/v3d/v3dx_state.c | 12 +++++++++ 6 files changed, 88 insertions(+), 15 deletions(-) diff --git a/src/gallium/drivers/v3d/meson.build b/src/gallium/drivers/v3d/meson.build index dfa1e88097b..526a131ae9b 100644 --- a/src/gallium/drivers/v3d/meson.build +++ b/src/gallium/drivers/v3d/meson.build @@ -58,7 +58,7 @@ if dep_v3dv3.found() v3d_args += '-DUSE_V3D_SIMULATOR' endif -v3d_versions = ['33', '42'] +v3d_versions = ['33', '42', '71'] per_version_libs = [] foreach ver : v3d_versions diff --git a/src/gallium/drivers/v3d/v3d_context.h b/src/gallium/drivers/v3d/v3d_context.h index 97850b0363e..ad267d5033c 100644 --- a/src/gallium/drivers/v3d/v3d_context.h +++ b/src/gallium/drivers/v3d/v3d_context.h @@ -818,13 +818,21 @@ void v3d_disk_cache_store(struct v3d_context *v3d, /* Helper to call hw ver specific functions */ #define v3d_X(devinfo, thing) ({ \ - __typeof(&v3d42_##thing) v3d_X_thing; \ - if ((devinfo)->ver >= 42) \ - v3d_X_thing = &v3d42_##thing; \ - else if ((devinfo)->ver >= 33) \ + __typeof(&v3d33_##thing) v3d_X_thing; \ + switch (devinfo->ver) { \ + case 33: \ + case 40: \ v3d_X_thing = &v3d33_##thing; \ - else \ + break; \ + case 42: \ + v3d_X_thing = &v3d42_##thing; \ + break; \ + case 71: \ + v3d_X_thing = &v3d71_##thing; \ + break; \ + default: \ unreachable("Unsupported hardware generation"); \ + } \ v3d_X_thing; \ }) @@ -838,6 +846,10 @@ void v3d_disk_cache_store(struct v3d_context *v3d, # define v3dX(x) v3d42_##x # include "v3dx_context.h" # undef v3dX + +# define v3dX(x) v3d71_##x +# include "v3dx_context.h" +# undef v3dX #endif #endif /* V3D_CONTEXT_H */ diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c index 17442500ea9..2c74c5973c9 100644 --- a/src/gallium/drivers/v3d/v3dx_draw.c +++ b/src/gallium/drivers/v3d/v3dx_draw.c @@ -95,7 +95,11 @@ v3dX(start_binning)(struct v3d_context *v3d, struct v3d_job *job) #endif assert(!job->msaa || !job->double_buffer); -#if V3D_VERSION >= 40 +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif + +#if V3D_VERSION >= 40 && V3D_VERSION <= 42 cl_emit(&job->bcl, TILE_BINNING_MODE_CFG, config) { config.width_in_pixels = job->draw_width; config.height_in_pixels = job->draw_height; @@ -107,7 +111,8 @@ v3dX(start_binning)(struct v3d_context *v3d, struct v3d_job *job) config.maximum_bpp_of_all_render_targets = job->internal_bpp; } -#else /* V3D_VERSION < 40 */ +#endif +#if V3D_VERSION < 40 /* "Binning mode lists start with a Tile Binning Mode Configuration * item (120)" * @@ -134,7 +139,7 @@ v3dX(start_binning)(struct v3d_context *v3d, struct v3d_job *job) config.maximum_bpp_of_all_render_targets = job->internal_bpp; } -#endif /* V3D_VERSION < 40 */ +#endif /* There's definitely nothing in the VCD cache we want. */ cl_emit(&job->bcl, FLUSH_VCD_CACHE, bin); @@ -655,10 +660,15 @@ v3d_emit_gl_shader_state(struct v3d_context *v3d, /* XXX: Use combined input/output size flag in the common * case. */ +#if V3D_VERSION <= 42 shader.coordinate_shader_has_separate_input_and_output_vpm_blocks = v3d->prog.cs->prog_data.vs->separate_segments; shader.vertex_shader_has_separate_input_and_output_vpm_blocks = v3d->prog.vs->prog_data.vs->separate_segments; +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif shader.coordinate_shader_input_vpm_segment_size = v3d->prog.cs->prog_data.vs->separate_segments ? @@ -724,9 +734,14 @@ v3d_emit_gl_shader_state(struct v3d_context *v3d, shader.instance_id_read_by_vertex_shader = v3d->prog.vs->prog_data.vs->uses_iid; +#if V3D_VERSION <= 42 shader.address_of_default_attribute_values = cl_address(v3d_resource(vtx->defaults)->bo, vtx->defaults_offset); +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif } bool cs_loaded_any = false; diff --git a/src/gallium/drivers/v3d/v3dx_emit.c b/src/gallium/drivers/v3d/v3dx_emit.c index 0ad3fb68b1e..5af3d03b337 100644 --- a/src/gallium/drivers/v3d/v3dx_emit.c +++ b/src/gallium/drivers/v3d/v3dx_emit.c @@ -512,6 +512,7 @@ v3dX(emit_state)(struct pipe_context *pctx) /* Note: EZ state may update based on the compiled FS, * along with ZSA */ +#if V3D_VERSION <= 42 config.early_z_updates_enable = (job->ez_state != V3D_EZ_DISABLED); if (v3d->zsa->base.depth_enabled) { @@ -524,6 +525,10 @@ v3dX(emit_state)(struct pipe_context *pctx) } else { config.depth_test_function = PIPE_FUNC_ALWAYS; } +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif config.stencil_enable = v3d->zsa->base.stencil[0].enabled; @@ -564,12 +569,18 @@ v3dX(emit_state)(struct pipe_context *pctx) } if (v3d->dirty & V3D_DIRTY_VIEWPORT) { +#if V3D_VERSION <= 42 cl_emit(&job->bcl, CLIPPER_XY_SCALING, clip) { clip.viewport_half_width_in_1_256th_of_pixel = v3d->viewport.scale[0] * 256.0f; clip.viewport_half_height_in_1_256th_of_pixel = v3d->viewport.scale[1] * 256.0f; } +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif + cl_emit(&job->bcl, CLIPPER_Z_SCALE_AND_OFFSET, clip) { clip.viewport_z_offset_zc_to_zs = diff --git a/src/gallium/drivers/v3d/v3dx_rcl.c b/src/gallium/drivers/v3d/v3dx_rcl.c index 82547437c25..166cc34e4ee 100644 --- a/src/gallium/drivers/v3d/v3dx_rcl.c +++ b/src/gallium/drivers/v3d/v3dx_rcl.c @@ -419,10 +419,16 @@ v3d_rcl_emit_stores(struct v3d_job *job, struct v3d_cl *cl, int layer) * clearing Z/S. */ if (job->clear) { +#if V3D_VERSION <= 42 cl_emit(cl, CLEAR_TILE_BUFFERS, clear) { clear.clear_z_stencil_buffer = !job->early_zs_clear; clear.clear_all_render_targets = true; } +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif + } #endif /* V3D_VERSION >= 40 */ } @@ -483,7 +489,7 @@ v3d_rcl_emit_generic_per_tile_list(struct v3d_job *job, int layer) } } -#if V3D_VERSION >= 40 +#if V3D_VERSION >= 40 && V3D_VERSION <= 42 static void v3d_setup_render_target(struct v3d_job *job, int cbuf, uint32_t *rt_bpp, uint32_t *rt_type, uint32_t *rt_clamp) @@ -507,9 +513,9 @@ v3d_setup_render_target(struct v3d_job *job, int cbuf, else *rt_clamp = V3D_RENDER_TARGET_CLAMP_NONE; } +#endif -#else /* V3D_VERSION < 40 */ - +#if V3D_VERSION < 40 static void v3d_emit_z_stencil_config(struct v3d_job *job, struct v3d_surface *surf, struct v3d_resource *rsc, bool is_separate_stencil) @@ -656,7 +662,8 @@ emit_render_layer(struct v3d_job *job, uint32_t layer) cl_emit(&job->rcl, STORE_TILE_BUFFER_GENERAL, store) { store.buffer_to_store = NONE; } -#else +#endif +#if V3D_VERSION >= 40 && V3D_VERSION <= 42 for (int i = 0; i < 2; i++) { if (i > 0) cl_emit(&job->rcl, TILE_COORDINATES, coords); @@ -673,6 +680,10 @@ emit_render_layer(struct v3d_job *job, uint32_t layer) cl_emit(&job->rcl, END_OF_TILE_MARKER, end); } #endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif + cl_emit(&job->rcl, FLUSH_VCD_CACHE, flush); @@ -775,7 +786,13 @@ v3dX(emit_rcl)(struct v3d_job *job) config.multisample_mode_4x = job->msaa; config.double_buffer_in_non_ms_mode = job->double_buffer; +#if V3D_VERSION <= 42 config.maximum_bpp_of_all_render_targets = job->internal_bpp; +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif + } for (int i = 0; i < job->nr_cbufs; i++) { @@ -786,7 +803,7 @@ v3dX(emit_rcl)(struct v3d_job *job) struct v3d_resource *rsc = v3d_resource(psurf->texture); UNUSED uint32_t config_pad = 0; - uint32_t clear_pad = 0; + UNUSED uint32_t clear_pad = 0; /* XXX: Set the pad for raster. */ if (surf->tiling == V3D_TILING_UIF_NO_XOR || @@ -819,6 +836,7 @@ v3dX(emit_rcl)(struct v3d_job *job) } #endif /* V3D_VERSION < 40 */ +#if V3D_VERSION <= 42 cl_emit(&job->rcl, TILE_RENDERING_MODE_CFG_CLEAR_COLORS_PART1, clear) { clear.clear_color_low_32_bits = job->clear_color[i][0]; @@ -847,9 +865,10 @@ v3dX(emit_rcl)(struct v3d_job *job) clear.render_target_number = i; }; } +#endif } -#if V3D_VERSION >= 40 +#if V3D_VERSION >= 40 && V3D_VERSION <= 42 cl_emit(&job->rcl, TILE_RENDERING_MODE_CFG_COLOR, rt) { v3d_setup_render_target(job, 0, &rt.render_target_0_internal_bpp, @@ -870,6 +889,10 @@ v3dX(emit_rcl)(struct v3d_job *job) } #endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif + #if V3D_VERSION < 40 /* FIXME: Don't bother emitting if we don't load/clear Z/S. */ if (job->zsbuf) { diff --git a/src/gallium/drivers/v3d/v3dx_state.c b/src/gallium/drivers/v3d/v3dx_state.c index 0f1735fee66..a93d5be091e 100644 --- a/src/gallium/drivers/v3d/v3dx_state.c +++ b/src/gallium/drivers/v3d/v3dx_state.c @@ -990,7 +990,13 @@ v3dX(create_texture_shader_state_bo)(struct v3d_context *v3d, cso->u.buf.size); } +#if V3D_VERSION <= 42 tex.srgb = util_format_is_srgb(cso->format); +#endif + +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif #if V3D_VERSION >= 40 tex.swizzle_r = v3d_translate_pipe_swizzle(so->swizzle[0]); @@ -1040,7 +1046,13 @@ v3dX(create_texture_shader_state_bo)(struct v3d_context *v3d, * shader code if we wanted to read an MSAA sRGB * texture without sRGB decode. */ +#if V3D_VERSION <= 42 tex.srgb = false; +#endif +#if V3D_VERSION >= 71 + unreachable("HW generation 71 not supported yet."); +#endif + } else { tex.texture_type = v3d_get_tex_format(&screen->devinfo, cso->format); -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0106-v3d-emit-TILE_BINNING_MODE_CFG-for-v71.patch ================================================ From 1ef6241854666a00d43401039809f2470d3a2cc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Wed, 20 Oct 2021 14:31:10 +0200 Subject: [PATCH 106/142] v3d: emit TILE_BINNING_MODE_CFG for v71 --- src/gallium/drivers/v3d/v3dx_draw.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c index 2c74c5973c9..9f38baa0bbf 100644 --- a/src/gallium/drivers/v3d/v3dx_draw.c +++ b/src/gallium/drivers/v3d/v3dx_draw.c @@ -96,7 +96,21 @@ v3dX(start_binning)(struct v3d_context *v3d, struct v3d_job *job) assert(!job->msaa || !job->double_buffer); #if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); + cl_emit(&job->bcl, TILE_BINNING_MODE_CFG, config) { + config.width_in_pixels = job->draw_width; + config.height_in_pixels = job->draw_height; + + config.log2_tile_width = log2_tile_size(job->tile_width); + config.log2_tile_height = log2_tile_size(job->tile_height); + + /* FIXME: ideallly we would like next assert on the packet header (as is + * general, so also applies to GL). We would need to expand + * gen_pack_header for that. + */ + assert(config.log2_tile_width == config.log2_tile_height || + config.log2_tile_width == config.log2_tile_height + 1); + } + #endif #if V3D_VERSION >= 40 && V3D_VERSION <= 42 -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0107-v3d-emit-TILE_RENDERING_MODE_CFG_COMMON-for-v71.patch ================================================ From dfdfcf3853d7178acff288a368dfc169018c186a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Wed, 20 Oct 2021 14:42:43 +0200 Subject: [PATCH 107/142] v3d: emit TILE_RENDERING_MODE_CFG_COMMON for v71 --- src/gallium/drivers/v3d/v3dx_rcl.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/v3d/v3dx_rcl.c b/src/gallium/drivers/v3d/v3dx_rcl.c index 166cc34e4ee..3f5eb293c4e 100644 --- a/src/gallium/drivers/v3d/v3dx_rcl.c +++ b/src/gallium/drivers/v3d/v3dx_rcl.c @@ -23,8 +23,9 @@ #include "util/format/u_format.h" #include "v3d_context.h" -#include "broadcom/common/v3d_tiling.h" #include "broadcom/common/v3d_macros.h" +#include "broadcom/common/v3d_tiling.h" +#include "broadcom/common/v3d_util.h" #include "broadcom/cle/v3dx_pack.h" #define PIPE_CLEAR_COLOR_BUFFERS (PIPE_CLEAR_COLOR0 | \ @@ -790,7 +791,15 @@ v3dX(emit_rcl)(struct v3d_job *job) config.maximum_bpp_of_all_render_targets = job->internal_bpp; #endif #if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); + config.log2_tile_width = log2_tile_size(job->tile_width); + config.log2_tile_height = log2_tile_size(job->tile_height); + + /* FIXME: ideallly we would like next assert on the packet header (as is + * general, so also applies to GL). We would need to expand + * gen_pack_header for that. + */ + assert(config.log2_tile_width == config.log2_tile_height || + config.log2_tile_width == config.log2_tile_height + 1); #endif } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0108-v3d-TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1.patch ================================================ From 34b32f1ee504449e39529110631c389fa9e9e409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Wed, 20 Oct 2021 15:12:15 +0200 Subject: [PATCH 108/142] v3d: TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1 --- src/gallium/drivers/v3d/v3dx_rcl.c | 130 +++++++++++++++++++++++++---- 1 file changed, 115 insertions(+), 15 deletions(-) diff --git a/src/gallium/drivers/v3d/v3dx_rcl.c b/src/gallium/drivers/v3d/v3dx_rcl.c index 3f5eb293c4e..815e1098c22 100644 --- a/src/gallium/drivers/v3d/v3dx_rcl.c +++ b/src/gallium/drivers/v3d/v3dx_rcl.c @@ -490,10 +490,86 @@ v3d_rcl_emit_generic_per_tile_list(struct v3d_job *job, int layer) } } +#if V3D_VERSION > 33 +/* Note that for v71, render target cfg packets has just one field that + * combined the internal type and clamp mode. For simplicity we keep just one + * helper. + * + * Note: rt_type is in fact a "enum V3DX(Internal_Type)". + * + */ +static uint32_t +v3dX(clamp_for_format_and_type)(uint32_t rt_type, + enum pipe_format format) +{ +#if V3D_VERSION == 42 + if (util_format_is_pure_integer(format)) { + return V3D_RENDER_TARGET_CLAMP_INT; + } else if (util_format_is_srgb(format)) { + return V3D_RENDER_TARGET_CLAMP_NORM; + } else { + return V3D_RENDER_TARGET_CLAMP_NONE; + } +#endif +#if V3D_VERSION >= 71 + switch (rt_type) { + case V3D_INTERNAL_TYPE_8I: + return V3D_RENDER_TARGET_TYPE_CLAMP_8I_CLAMPED; + case V3D_INTERNAL_TYPE_8UI: + return V3D_RENDER_TARGET_TYPE_CLAMP_8UI_CLAMPED; + case V3D_INTERNAL_TYPE_8: + return V3D_RENDER_TARGET_TYPE_CLAMP_8; + case V3D_INTERNAL_TYPE_16I: + return V3D_RENDER_TARGET_TYPE_CLAMP_16I_CLAMPED; + case V3D_INTERNAL_TYPE_16UI: + return V3D_RENDER_TARGET_TYPE_CLAMP_16UI_CLAMPED; + case V3D_INTERNAL_TYPE_16F: + return util_format_is_srgb(format) ? + V3D_RENDER_TARGET_TYPE_CLAMP_16F_CLAMP_NORM : + V3D_RENDER_TARGET_TYPE_CLAMP_16F; + case V3D_INTERNAL_TYPE_32I: + return V3D_RENDER_TARGET_TYPE_CLAMP_32I_CLAMPED; + case V3D_INTERNAL_TYPE_32UI: + return V3D_RENDER_TARGET_TYPE_CLAMP_32UI_CLAMPED; + case V3D_INTERNAL_TYPE_32F: + return V3D_RENDER_TARGET_TYPE_CLAMP_32F; + default: + unreachable("Unknown internal render target type"); + } + return V3D_RENDER_TARGET_TYPE_CLAMP_INVALID; +#endif + return 0; +} +#endif + +#if V3D_VERSION >= 71 +static void +v3d_setup_render_target(struct v3d_job *job, + int cbuf, + uint32_t *rt_bpp, + uint32_t *rt_type_clamp) +{ + if (!job->cbufs[cbuf]) + return; + + struct v3d_surface *surf = v3d_surface(job->cbufs[cbuf]); + *rt_bpp = surf->internal_bpp; + if (job->bbuf) { + struct v3d_surface *bsurf = v3d_surface(job->bbuf); + *rt_bpp = MAX2(*rt_bpp, bsurf->internal_bpp); + } + *rt_type_clamp = v3dX(clamp_for_format_and_type)(surf->internal_type, + surf->base.format); +} +#endif + #if V3D_VERSION >= 40 && V3D_VERSION <= 42 static void -v3d_setup_render_target(struct v3d_job *job, int cbuf, - uint32_t *rt_bpp, uint32_t *rt_type, uint32_t *rt_clamp) +v3d_setup_render_target(struct v3d_job *job, + int cbuf, + uint32_t *rt_bpp, + uint32_t *rt_type, + uint32_t *rt_clamp) { if (!job->cbufs[cbuf]) return; @@ -505,14 +581,8 @@ v3d_setup_render_target(struct v3d_job *job, int cbuf, *rt_bpp = MAX2(*rt_bpp, bsurf->internal_bpp); } *rt_type = surf->internal_type; - if (util_format_is_srgb(surf->base.format)) - *rt_clamp = V3D_RENDER_TARGET_CLAMP_NORM; -#if V3D_VERSION >= 42 - else if (util_format_is_pure_integer(surf->base.format)) - *rt_clamp = V3D_RENDER_TARGET_CLAMP_INT; -#endif - else - *rt_clamp = V3D_RENDER_TARGET_CLAMP_NONE; + *rt_clamp = v3dX(clamp_for_format_and_type)(surf->internal_type, + surf->base.format); } #endif @@ -804,10 +874,30 @@ v3dX(emit_rcl)(struct v3d_job *job) } +#if V3D_VERSION >= 71 + uint32_t base_addr = 0; + + /* If we don't have any color RTs, we sill need to emit one and flat + * it as not used using stride = 1 + */ + if (job->nr_cbufs == 0) { + cl_emit(&job->rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1, rt) { + rt.stride = 1; /* Unused */ + } + } +#endif for (int i = 0; i < job->nr_cbufs; i++) { struct pipe_surface *psurf = job->cbufs[i]; - if (!psurf) + if (!psurf) { +#if V3D_VERSION >= 71 + cl_emit(&job->rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1, rt) { + rt.render_target_number = i; + rt.stride = 1; /* Unused */ + } +#endif continue; + } + struct v3d_surface *surf = v3d_surface(psurf); struct v3d_resource *rsc = v3d_resource(psurf->texture); @@ -874,6 +964,20 @@ v3dX(emit_rcl)(struct v3d_job *job) clear.render_target_number = i; }; } +#endif +#if V3D_VERSION >= 71 + cl_emit(&job->rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1, rt) { + rt.clear_color_low_bits = job->clear_color[i][0]; + v3d_setup_render_target(job, i, &rt.internal_bpp, + &rt.internal_type_and_clamping); + rt.stride = + v3d_compute_rt_row_row_stride_128_bits(job->tile_width, + v3d_internal_bpp_words(rt.internal_bpp)); + rt.base_address = base_addr; + rt.render_target_number = i; + + base_addr += (job->tile_height * rt.stride) / 8; + } #endif } @@ -898,10 +1002,6 @@ v3dX(emit_rcl)(struct v3d_job *job) } #endif -#if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); -#endif - #if V3D_VERSION < 40 /* FIXME: Don't bother emitting if we don't load/clear Z/S. */ if (job->zsbuf) { -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0109-v3d-emit-CLEAR_RENDER_TARGETS-for-v71.patch ================================================ From 8496282476420e7e5d9d31f6cfd87f3f3b136446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 21 Oct 2021 01:47:29 +0200 Subject: [PATCH 109/142] v3d: emit CLEAR_RENDER_TARGETS for v71 --- src/gallium/drivers/v3d/v3dx_rcl.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/v3d/v3dx_rcl.c b/src/gallium/drivers/v3d/v3dx_rcl.c index 815e1098c22..4274be042bd 100644 --- a/src/gallium/drivers/v3d/v3dx_rcl.c +++ b/src/gallium/drivers/v3d/v3dx_rcl.c @@ -427,7 +427,7 @@ v3d_rcl_emit_stores(struct v3d_job *job, struct v3d_cl *cl, int layer) } #endif #if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); + cl_emit(cl, CLEAR_RENDER_TARGETS, clear); #endif } @@ -734,7 +734,7 @@ emit_render_layer(struct v3d_job *job, uint32_t layer) store.buffer_to_store = NONE; } #endif -#if V3D_VERSION >= 40 && V3D_VERSION <= 42 +#if V3D_VERSION >= 40 for (int i = 0; i < 2; i++) { if (i > 0) cl_emit(&job->rcl, TILE_COORDINATES, coords); @@ -742,20 +742,20 @@ emit_render_layer(struct v3d_job *job, uint32_t layer) cl_emit(&job->rcl, STORE_TILE_BUFFER_GENERAL, store) { store.buffer_to_store = NONE; } + if (i == 0 || do_double_initial_tile_clear(job)) { +#if V3D_VERSION < 71 cl_emit(&job->rcl, CLEAR_TILE_BUFFERS, clear) { clear.clear_z_stencil_buffer = !job->early_zs_clear; clear.clear_all_render_targets = true; } +#else + cl_emit(&job->rcl, CLEAR_RENDER_TARGETS, clear); +#endif } cl_emit(&job->rcl, END_OF_TILE_MARKER, end); } #endif -#if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); -#endif - - cl_emit(&job->rcl, FLUSH_VCD_CACHE, flush); v3d_rcl_emit_generic_per_tile_list(job, layer); -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0110-v3d-just-don-t-fill-up-early-z-fields-for-CFG_BITS-f.patch ================================================ From 4de1ace1c7b3b6436a5de8e4c6a2f52d6308ff5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 21 Oct 2021 13:09:03 +0200 Subject: [PATCH 110/142] v3d: just don't fill up early-z fields for CFG_BITS for v71 v71 doesn't include early_z_enable/early_z_updates_enable. They are configured with packet 121. --- src/gallium/drivers/v3d/v3dx_emit.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/v3d/v3dx_emit.c b/src/gallium/drivers/v3d/v3dx_emit.c index 5af3d03b337..de05ae29d04 100644 --- a/src/gallium/drivers/v3d/v3dx_emit.c +++ b/src/gallium/drivers/v3d/v3dx_emit.c @@ -515,20 +515,19 @@ v3dX(emit_state)(struct pipe_context *pctx) #if V3D_VERSION <= 42 config.early_z_updates_enable = (job->ez_state != V3D_EZ_DISABLED); +#endif if (v3d->zsa->base.depth_enabled) { config.z_updates_enable = v3d->zsa->base.depth_writemask; +#if V3D_VERSION <= 42 config.early_z_enable = config.early_z_updates_enable; +#endif config.depth_test_function = v3d->zsa->base.depth_func; } else { config.depth_test_function = PIPE_FUNC_ALWAYS; } -#endif -#if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); -#endif config.stencil_enable = v3d->zsa->base.stencil[0].enabled; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0111-v3d-emit-CLIPPER_XY_SCALING-for-v71.patch ================================================ From 0683f6db1cd50659829fe53f49427bfdacb707b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 21 Oct 2021 13:14:32 +0200 Subject: [PATCH 111/142] v3d: emit CLIPPER_XY_SCALING for v71 --- src/gallium/drivers/v3d/v3dx_emit.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/v3d/v3dx_emit.c b/src/gallium/drivers/v3d/v3dx_emit.c index de05ae29d04..58c886bb29e 100644 --- a/src/gallium/drivers/v3d/v3dx_emit.c +++ b/src/gallium/drivers/v3d/v3dx_emit.c @@ -577,7 +577,12 @@ v3dX(emit_state)(struct pipe_context *pctx) } #endif #if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); + cl_emit(&job->bcl, CLIPPER_XY_SCALING, clip) { + clip.viewport_half_width_in_1_64th_of_pixel = + v3d->viewport.scale[0] * 64.0f; + clip.viewport_half_height_in_1_64th_of_pixel = + v3d->viewport.scale[1] * 64.0f; + } #endif -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0112-v3d-no-specific-separate_segments-flag-for-V3D-7.1.patch ================================================ From 1d1aa5ce739644c72b44ffe547b7233ad19e26b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 21 Oct 2021 13:19:49 +0200 Subject: [PATCH 112/142] v3d: no specific separate_segments flag for V3D 7.1 On V3D 7.1 there is not a flag on the Shader State Record to specify if we are using shared or separate segments. This is done by setting the vpm input size to 0 (so we need to ensure that the output would be the max needed for input/output). We were already doing the latter on the prog_data_vs, so we just need to use those values, instead of assigning default values. --- src/gallium/drivers/v3d/v3dx_draw.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c index 9f38baa0bbf..dd13e5177fe 100644 --- a/src/gallium/drivers/v3d/v3dx_draw.c +++ b/src/gallium/drivers/v3d/v3dx_draw.c @@ -679,17 +679,24 @@ v3d_emit_gl_shader_state(struct v3d_context *v3d, v3d->prog.cs->prog_data.vs->separate_segments; shader.vertex_shader_has_separate_input_and_output_vpm_blocks = v3d->prog.vs->prog_data.vs->separate_segments; -#endif -#if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); -#endif - shader.coordinate_shader_input_vpm_segment_size = v3d->prog.cs->prog_data.vs->separate_segments ? v3d->prog.cs->prog_data.vs->vpm_input_size : 1; shader.vertex_shader_input_vpm_segment_size = v3d->prog.vs->prog_data.vs->separate_segments ? v3d->prog.vs->prog_data.vs->vpm_input_size : 1; +#endif + /* On V3D 7.1 there isn't a specific flag to set if we are using + * shared/separate segments or not. We just set the value of + * vpm_input_size to 0, and set output to the max needed. That should be + * already properly set on prog_data_vs_bin + */ +#if V3D_VERSION == 71 + shader.coordinate_shader_input_vpm_segment_size = + v3d->prog.cs->prog_data.vs->vpm_input_size; + shader.vertex_shader_input_vpm_segment_size = + v3d->prog.vs->prog_data.vs->vpm_input_size; +#endif shader.coordinate_shader_output_vpm_segment_size = v3d->prog.cs->prog_data.vs->vpm_output_size; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0113-v3d-default-vertex-attributes-values-are-not-needed-.patch ================================================ From 3a790ddd27c8406c59426599fb9cadb5de5c024d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 21 Oct 2021 13:37:46 +0200 Subject: [PATCH 113/142] v3d: default vertex attributes values are not needed for v71 --- src/gallium/drivers/v3d/v3d_context.h | 1 + src/gallium/drivers/v3d/v3dx_draw.c | 3 -- src/gallium/drivers/v3d/v3dx_state.c | 53 ++++++++++++++++++--------- 3 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/gallium/drivers/v3d/v3d_context.h b/src/gallium/drivers/v3d/v3d_context.h index ad267d5033c..c0aac741fdc 100644 --- a/src/gallium/drivers/v3d/v3d_context.h +++ b/src/gallium/drivers/v3d/v3d_context.h @@ -265,6 +265,7 @@ struct v3d_vertex_stateobj { unsigned num_elements; uint8_t attrs[16 * (V3D_MAX_VS_INPUTS / 4)]; + /* defaults can be NULL for some hw generation */ struct pipe_resource *defaults; uint32_t defaults_offset; }; diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c index dd13e5177fe..4bff2ea6478 100644 --- a/src/gallium/drivers/v3d/v3dx_draw.c +++ b/src/gallium/drivers/v3d/v3dx_draw.c @@ -759,9 +759,6 @@ v3d_emit_gl_shader_state(struct v3d_context *v3d, shader.address_of_default_attribute_values = cl_address(v3d_resource(vtx->defaults)->bo, vtx->defaults_offset); -#endif -#if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); #endif } diff --git a/src/gallium/drivers/v3d/v3dx_state.c b/src/gallium/drivers/v3d/v3dx_state.c index a93d5be091e..3d3c4fb0f47 100644 --- a/src/gallium/drivers/v3d/v3dx_state.c +++ b/src/gallium/drivers/v3d/v3dx_state.c @@ -337,6 +337,20 @@ v3d_zsa_state_bind(struct pipe_context *pctx, void *hwcso) v3d->dirty |= V3D_DIRTY_ZSA; } + +static bool +needs_default_attribute_values(void) +{ +#if V3D_VERSION <= 42 + /* FIXME: on vulkan we are able to refine even further, as we know in + * advance when we create the pipeline if we have a integer vertex + * attrib. Pending to check if we could do something similar here. + */ + return true; +#endif + return false; +} + static void * v3d_vertex_state_create(struct pipe_context *pctx, unsigned num_elements, const struct pipe_vertex_element *elements) @@ -414,24 +428,29 @@ v3d_vertex_state_create(struct pipe_context *pctx, unsigned num_elements, } } - /* Set up the default attribute values in case any of the vertex - * elements use them. - */ - uint32_t *attrs; - u_upload_alloc(v3d->state_uploader, 0, - V3D_MAX_VS_INPUTS * sizeof(float), 16, - &so->defaults_offset, &so->defaults, (void **)&attrs); - - for (int i = 0; i < V3D_MAX_VS_INPUTS / 4; i++) { - attrs[i * 4 + 0] = 0; - attrs[i * 4 + 1] = 0; - attrs[i * 4 + 2] = 0; - if (i < so->num_elements && - util_format_is_pure_integer(so->pipe[i].src_format)) { - attrs[i * 4 + 3] = 1; - } else { - attrs[i * 4 + 3] = fui(1.0); + if (needs_default_attribute_values()) { + /* Set up the default attribute values in case any of the vertex + * elements use them. + */ + uint32_t *attrs; + u_upload_alloc(v3d->state_uploader, 0, + V3D_MAX_VS_INPUTS * sizeof(float), 16, + &so->defaults_offset, &so->defaults, (void **)&attrs); + + for (int i = 0; i < V3D_MAX_VS_INPUTS / 4; i++) { + attrs[i * 4 + 0] = 0; + attrs[i * 4 + 1] = 0; + attrs[i * 4 + 2] = 0; + if (i < so->num_elements && + util_format_is_pure_integer(so->pipe[i].src_format)) { + attrs[i * 4 + 3] = 1; + } else { + attrs[i * 4 + 3] = fui(1.0); + } } + } else { + so->defaults = NULL; + so->defaults_offset = 0; } u_upload_unmap(v3d->state_uploader); -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0114-v3d-uniforms-update-VIEWPORT_X-Y_SCALE-uniforms-for-.patch ================================================ From 8e3a2a35df5789687993d05436602821186e1cf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 21 Oct 2021 13:46:11 +0200 Subject: [PATCH 114/142] v3d/uniforms: update VIEWPORT_X/Y_SCALE uniforms for v71 As the packet CLIPPER_XY scaling, this needs to be computed on 1/64ths of pixel, instead of 1/256ths of pixels. As this is the usual values that we get from macros, we add manually a v42 and v71 macro, and define a new helper to get those. Those granularity values are the same for Vulkan and OpenGL, so perhaps we should move them to a common place. As with v3dv, V3D_X macro name is somewhat confusing. It is specifically created to ask for define values that depends on the version. But I also felt that V3D_DEFINE_X was too long. --- src/gallium/drivers/v3d/v3d_context.h | 28 ++++++++++++++++++++++++++ src/gallium/drivers/v3d/v3d_uniforms.c | 8 ++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/v3d/v3d_context.h b/src/gallium/drivers/v3d/v3d_context.h index c0aac741fdc..21ee10a90cc 100644 --- a/src/gallium/drivers/v3d/v3d_context.h +++ b/src/gallium/drivers/v3d/v3d_context.h @@ -837,6 +837,34 @@ void v3d_disk_cache_store(struct v3d_context *v3d, v3d_X_thing; \ }) +/* FIXME: The same for vulkan/opengl. Common place? define it at the + * v3d_packet files? + */ +#define V3D33_CLIPPER_XY_GRANULARITY 256.0f +#define V3D42_CLIPPER_XY_GRANULARITY 256.0f +#define V3D71_CLIPPER_XY_GRANULARITY 64.0f + +/* Helper to get hw-specific macro values */ +#define V3DV_X(devinfo, thing) ({ \ + __typeof(V3D33_##thing) V3D_X_THING; \ + switch (devinfo->ver) { \ + case 33: \ + case 40: \ + V3D_X_THING = V3D33_##thing; \ + break; \ + case 41: \ + case 42: \ + V3D_X_THING = V3D42_##thing; \ + break; \ + case 71: \ + V3D_X_THING = V3D71_##thing; \ + break; \ + default: \ + unreachable("Unsupported hardware generation"); \ + } \ + V3D_X_THING; \ +}) + #ifdef v3dX # include "v3dx_context.h" #else diff --git a/src/gallium/drivers/v3d/v3d_uniforms.c b/src/gallium/drivers/v3d/v3d_uniforms.c index 95eb838954f..1b8758bae7d 100644 --- a/src/gallium/drivers/v3d/v3d_uniforms.c +++ b/src/gallium/drivers/v3d/v3d_uniforms.c @@ -261,6 +261,7 @@ v3d_write_uniforms(struct v3d_context *v3d, struct v3d_job *job, struct v3d_compiled_shader *shader, enum pipe_shader_type stage) { + struct v3d_device_info *devinfo = &v3d->screen->devinfo; struct v3d_constbuf_stateobj *cb = &v3d->constbuf[stage]; struct v3d_texture_stateobj *texstate = &v3d->tex[stage]; struct v3d_uniform_list *uinfo = &shader->prog_data.base->uniforms; @@ -282,6 +283,9 @@ v3d_write_uniforms(struct v3d_context *v3d, struct v3d_job *job, struct v3d_cl_out *uniforms = cl_start(&job->indirect); + float clipper_xy_granularity = + V3DV_X(devinfo, CLIPPER_XY_GRANULARITY); + for (int i = 0; i < uinfo->count; i++) { uint32_t data = uinfo->data[i]; @@ -293,10 +297,10 @@ v3d_write_uniforms(struct v3d_context *v3d, struct v3d_job *job, cl_aligned_u32(&uniforms, gallium_uniforms[data]); break; case QUNIFORM_VIEWPORT_X_SCALE: - cl_aligned_f(&uniforms, v3d->viewport.scale[0] * 256.0f); + cl_aligned_f(&uniforms, v3d->viewport.scale[0] * clipper_xy_granularity); break; case QUNIFORM_VIEWPORT_Y_SCALE: - cl_aligned_f(&uniforms, v3d->viewport.scale[1] * 256.0f); + cl_aligned_f(&uniforms, v3d->viewport.scale[1] * clipper_xy_granularity); break; case QUNIFORM_VIEWPORT_Z_OFFSET: -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0115-v3d-handle-new-texture-state-transfer-functions-in-v.patch ================================================ From aa6f70116d9e7be56cdb52b55d75419bf7209185 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Thu, 21 Oct 2021 23:21:02 +0200 Subject: [PATCH 115/142] v3d: handle new texture state transfer functions in v71 --- src/gallium/drivers/v3d/v3dx_state.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/v3d/v3dx_state.c b/src/gallium/drivers/v3d/v3dx_state.c index 3d3c4fb0f47..b5e572b13c5 100644 --- a/src/gallium/drivers/v3d/v3dx_state.c +++ b/src/gallium/drivers/v3d/v3dx_state.c @@ -1009,12 +1009,12 @@ v3dX(create_texture_shader_state_bo)(struct v3d_context *v3d, cso->u.buf.size); } + bool is_srgb = util_format_is_srgb(cso->format); #if V3D_VERSION <= 42 - tex.srgb = util_format_is_srgb(cso->format); + tex.srgb = is_srgb; #endif - #if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); + tex.transfer_func = is_srgb ? TRANSFER_FUNC_SRGB : TRANSFER_FUNC_NONE; #endif #if V3D_VERSION >= 40 @@ -1068,9 +1068,6 @@ v3dX(create_texture_shader_state_bo)(struct v3d_context *v3d, #if V3D_VERSION <= 42 tex.srgb = false; #endif -#if V3D_VERSION >= 71 - unreachable("HW generation 71 not supported yet."); -#endif } else { tex.texture_type = v3d_get_tex_format(&screen->devinfo, -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0116-v3d-handle-new-TEXTURE_SHADER_STATE-v71-YCbCr-fields.patch ================================================ From aefc98b6aefc38caa6f6efd421db6d02c42596a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Fri, 22 Oct 2021 10:54:24 +0200 Subject: [PATCH 116/142] v3d: handle new TEXTURE_SHADER_STATE v71 YCbCr fields There are some new fields for YCbCr with pointers for the various planes in multi-planar formats. These need to match the base address pointer in the texture state, or the hardware will assume this is a multi-planar texture. Notice we don't use an address type for these fields in the XML description. This is because the addresses are 64-bit aligned (even though the PRM doesn't say it) which means the 6 LSB bits are implicitly 0, but the fields are encoded before the 6th bit of their starting byte, so we can't use the usual trick we do with address types where the first 6 bits in the byte are implicitly overwritten by other fields and we have to encode this manually as a uint field. This would mean that if we had an actual BO we would also need to add it manually to the job's list, but since we don't have one, we don't have to do anything about it. --- src/gallium/drivers/v3d/v3dx_state.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/v3d/v3dx_state.c b/src/gallium/drivers/v3d/v3dx_state.c index b5e572b13c5..c08a072157b 100644 --- a/src/gallium/drivers/v3d/v3dx_state.c +++ b/src/gallium/drivers/v3d/v3dx_state.c @@ -936,17 +936,26 @@ v3d_setup_texture_shader_state(struct V3DX(TEXTURE_SHADER_STATE) *tex, } tex->base_level = base_level; + #if V3D_VERSION >= 40 tex->max_level = last_level; /* Note that we don't have a job to reference the texture's sBO * at state create time, so any time this sampler view is used * we need to add the texture to the job. */ - tex->texture_base_pointer = - cl_address(NULL, - rsc->bo->offset + - v3d_layer_offset(prsc, 0, first_layer)); + const uint32_t base_offset = rsc->bo->offset + + v3d_layer_offset(prsc, 0, first_layer); + + tex->texture_base_pointer = cl_address(NULL, base_offset); #endif +#if V3D_VERSION >= 71 + tex->chroma_offset_x = 1; + tex->chroma_offset_y = 1; + /* See comment in XML field definition for rationale of the shifts */ + tex->texture_base_pointer_cb = base_offset >> 6; + tex->texture_base_pointer_cr = base_offset >> 6; +#endif + tex->array_stride_64_byte_aligned = rsc->cube_map_stride / 64; /* Since other platform devices may produce UIF images even -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0117-v3d-setup-render-pass-color-clears-for-any-format-bp.patch ================================================ From fcb3fc1ead4344da59c4b26a81878d53f8f4a291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Fri, 22 Oct 2021 11:40:49 +0200 Subject: [PATCH 117/142] v3d: setup render pass color clears for any format bpp in v71 --- src/gallium/drivers/v3d/v3dx_rcl.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/gallium/drivers/v3d/v3dx_rcl.c b/src/gallium/drivers/v3d/v3dx_rcl.c index 4274be042bd..d3fbc9aff5d 100644 --- a/src/gallium/drivers/v3d/v3dx_rcl.c +++ b/src/gallium/drivers/v3d/v3dx_rcl.c @@ -978,6 +978,24 @@ v3dX(emit_rcl)(struct v3d_job *job) base_addr += (job->tile_height * rt.stride) / 8; } + + if (surf->internal_bpp >= V3D_INTERNAL_BPP_64) { + cl_emit(&job->rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART2, rt) { + rt.clear_color_mid_bits = /* 40 bits (32 + 8) */ + ((uint64_t) job->clear_color[i][1]) | + (((uint64_t) (job->clear_color[i][2] & 0xff)) << 32); + rt.render_target_number = i; + } + } + + if (surf->internal_bpp >= V3D_INTERNAL_BPP_128) { + cl_emit(&job->rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART3, rt) { + rt.clear_color_top_bits = /* 56 bits (24 + 32) */ + (((uint64_t) (job->clear_color[i][2] & 0xffffff00)) >> 8) | + (((uint64_t) (job->clear_color[i][3])) << 24); + rt.render_target_number = i; + } + } #endif } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0118-v3d-GFX-1461-does-not-affect-V3D-7.x.patch ================================================ From ceb088c05f351b40df14069bd6e0de777288ece4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Fri, 22 Oct 2021 12:17:45 +0200 Subject: [PATCH 118/142] v3d: GFX-1461 does not affect V3D 7.x --- src/gallium/drivers/v3d/v3dx_draw.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c index 4bff2ea6478..04cc3bc3ae1 100644 --- a/src/gallium/drivers/v3d/v3dx_draw.c +++ b/src/gallium/drivers/v3d/v3dx_draw.c @@ -1593,9 +1593,10 @@ v3d_tlb_clear(struct v3d_job *job, unsigned buffers, /* GFXH-1461: If we were to emit a load of just depth or just stencil, * then the clear for the other may get lost. We need to decide now * if it would be possible to need to emit a load of just one after - * we've set up our TLB clears. + * we've set up our TLB clears. This issue is fixed since V3D 4.3.18. */ - if (buffers & PIPE_CLEAR_DEPTHSTENCIL && + if (v3d->screen->devinfo.ver <= 42 && + buffers & PIPE_CLEAR_DEPTHSTENCIL && (buffers & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL && job->zsbuf && util_format_is_depth_and_stencil(job->zsbuf->texture->format)) { -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0119-v3d-don-t-convert-floating-point-border-colors-in-v7.patch ================================================ From b44a8785c5436fb28b6734d3bac806d3a82c828d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Fri, 22 Oct 2021 13:41:09 +0200 Subject: [PATCH 119/142] v3d: don't convert floating point border colors in v71 The TMU does this for us now. --- src/gallium/drivers/v3d/v3dx_state.c | 29 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/gallium/drivers/v3d/v3dx_state.c b/src/gallium/drivers/v3d/v3dx_state.c index c08a072157b..348a7bcf3da 100644 --- a/src/gallium/drivers/v3d/v3dx_state.c +++ b/src/gallium/drivers/v3d/v3dx_state.c @@ -718,21 +718,22 @@ v3d_upload_sampler_state_variant(void *map, break; } - if (variant >= V3D_SAMPLER_STATE_32) { - sampler.border_color_word_0 = border.ui[0]; - sampler.border_color_word_1 = border.ui[1]; - sampler.border_color_word_2 = border.ui[2]; - sampler.border_color_word_3 = border.ui[3]; - } else { - sampler.border_color_word_0 = - _mesa_float_to_half(border.f[0]); - sampler.border_color_word_1 = - _mesa_float_to_half(border.f[1]); - sampler.border_color_word_2 = - _mesa_float_to_half(border.f[2]); - sampler.border_color_word_3 = - _mesa_float_to_half(border.f[3]); +#if V3D_VERSION <= 42 + /* The TMU in V3D 7.x always takes 32-bit floats and handles conversions + * for us. In V3D 4.x we need to manually convert floating point color + * values to the expected format. + */ + if (variant < V3D_SAMPLER_STATE_32) { + border.ui[0] = _mesa_float_to_half(border.f[0]); + border.ui[1] = _mesa_float_to_half(border.f[1]); + border.ui[2] = _mesa_float_to_half(border.f[2]); + border.ui[3] = _mesa_float_to_half(border.f[3]); } +#endif + sampler.border_color_word_0 = border.ui[0]; + sampler.border_color_word_1 = border.ui[1]; + sampler.border_color_word_2 = border.ui[2]; + sampler.border_color_word_3 = border.ui[3]; } } } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0120-v3d-handle-Z-clipping-in-v71.patch ================================================ From ecc1a5fa6b09a684a1e831c342121ec417f1a101 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Fri, 22 Oct 2021 14:26:29 +0200 Subject: [PATCH 120/142] v3d: handle Z clipping in v71 --- src/gallium/drivers/v3d/v3dx_emit.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/v3d/v3dx_emit.c b/src/gallium/drivers/v3d/v3dx_emit.c index 58c886bb29e..75751dc9ab6 100644 --- a/src/gallium/drivers/v3d/v3dx_emit.c +++ b/src/gallium/drivers/v3d/v3dx_emit.c @@ -539,8 +539,21 @@ v3dX(emit_state)(struct pipe_context *pctx) v3d_line_smoothing_enabled(v3d) ? V3D_LINE_RASTERIZATION_PERP_END_CAPS : V3D_LINE_RASTERIZATION_DIAMOND_EXIT; - } +#if V3D_VERSION >= 71 + /* The following follows the logic implemented at v3dv + * plus the definition of depth_clip_near/far and + * depth_clamp. + * + * Note: some extensions are not supported by v3d + * (like ARB_depth_clamp) that would affect this, but + * the values on rasterizer are taking that into + * account. + */ + config.z_clipping_mode = v3d->rasterizer->base.depth_clip_near || + v3d->rasterizer->base.depth_clip_far; +#endif + } } if (v3d->dirty & V3D_DIRTY_RASTERIZER && -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0121-v3d-add-support-for-TFU-blit-in-v71.patch ================================================ From ecac3d8441b75011446b566320194df17beba352 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Wed, 27 Oct 2021 02:03:10 +0200 Subject: [PATCH 121/142] v3d: add support for TFU blit in v71 TFU has changed on v71, specially on which registers to use, so that means that support code change across versions. So as part of this commit TFU copying is moved to a v3dx file. --- src/gallium/drivers/v3d/meson.build | 1 + src/gallium/drivers/v3d/v3d_blit.c | 164 +++----------------- src/gallium/drivers/v3d/v3dx_context.h | 10 ++ src/gallium/drivers/v3d/v3dx_tfu.c | 202 +++++++++++++++++++++++++ 4 files changed, 232 insertions(+), 145 deletions(-) create mode 100644 src/gallium/drivers/v3d/v3dx_tfu.c diff --git a/src/gallium/drivers/v3d/meson.build b/src/gallium/drivers/v3d/meson.build index 526a131ae9b..b2e748573b7 100644 --- a/src/gallium/drivers/v3d/meson.build +++ b/src/gallium/drivers/v3d/meson.build @@ -49,6 +49,7 @@ files_per_version = files( 'v3dx_job.c', 'v3dx_rcl.c', 'v3dx_state.c', + 'v3dx_tfu.c', ) v3d_args = ['-DV3D_BUILD_NEON'] diff --git a/src/gallium/drivers/v3d/v3d_blit.c b/src/gallium/drivers/v3d/v3d_blit.c index 0260bdde6d1..96179f654a4 100644 --- a/src/gallium/drivers/v3d/v3d_blit.c +++ b/src/gallium/drivers/v3d/v3d_blit.c @@ -210,140 +210,6 @@ v3d_stencil_blit(struct pipe_context *ctx, struct pipe_blit_info *info) info->mask &= ~PIPE_MASK_S; } -static bool -v3d_tfu(struct pipe_context *pctx, - struct pipe_resource *pdst, - struct pipe_resource *psrc, - unsigned int src_level, - unsigned int base_level, - unsigned int last_level, - unsigned int src_layer, - unsigned int dst_layer, - bool for_mipmap) -{ - struct v3d_context *v3d = v3d_context(pctx); - struct v3d_screen *screen = v3d->screen; - struct v3d_resource *src = v3d_resource(psrc); - struct v3d_resource *dst = v3d_resource(pdst); - struct v3d_resource_slice *src_base_slice = &src->slices[src_level]; - struct v3d_resource_slice *dst_base_slice = &dst->slices[base_level]; - int msaa_scale = pdst->nr_samples > 1 ? 2 : 1; - int width = u_minify(pdst->width0, base_level) * msaa_scale; - int height = u_minify(pdst->height0, base_level) * msaa_scale; - enum pipe_format pformat; - - if (psrc->format != pdst->format) - return false; - if (psrc->nr_samples != pdst->nr_samples) - return false; - - /* Can't write to raster. */ - if (dst_base_slice->tiling == V3D_TILING_RASTER) - return false; - - /* When using TFU for blit, we are doing exact copies (both input and - * output format must be the same, no scaling, etc), so there is no - * pixel format conversions. Thus we can rewrite the format to use one - * that is TFU compatible based on its texel size. - */ - if (for_mipmap) { - pformat = pdst->format; - } else { - switch (dst->cpp) { - case 16: pformat = PIPE_FORMAT_R32G32B32A32_FLOAT; break; - case 8: pformat = PIPE_FORMAT_R16G16B16A16_FLOAT; break; - case 4: pformat = PIPE_FORMAT_R32_FLOAT; break; - case 2: pformat = PIPE_FORMAT_R16_FLOAT; break; - case 1: pformat = PIPE_FORMAT_R8_UNORM; break; - default: unreachable("unsupported format bit-size"); break; - }; - } - - uint32_t tex_format = v3d_get_tex_format(&screen->devinfo, pformat); - struct v3d_device_info *devinfo = &screen->devinfo; - - if (!v3d_X(devinfo, tfu_supports_tex_format)(tex_format, for_mipmap)) { - assert(for_mipmap); - return false; - } - - v3d_flush_jobs_writing_resource(v3d, psrc, V3D_FLUSH_DEFAULT, false); - v3d_flush_jobs_reading_resource(v3d, pdst, V3D_FLUSH_DEFAULT, false); - - struct drm_v3d_submit_tfu tfu = { - .ios = (height << 16) | width, - .bo_handles = { - dst->bo->handle, - src != dst ? src->bo->handle : 0 - }, - .in_sync = v3d->out_sync, - .out_sync = v3d->out_sync, - }; - uint32_t src_offset = (src->bo->offset + - v3d_layer_offset(psrc, src_level, src_layer)); - tfu.iia |= src_offset; - if (src_base_slice->tiling == V3D_TILING_RASTER) { - tfu.icfg |= (V3D33_TFU_ICFG_FORMAT_RASTER << - V3D33_TFU_ICFG_FORMAT_SHIFT); - } else { - tfu.icfg |= ((V3D33_TFU_ICFG_FORMAT_LINEARTILE + - (src_base_slice->tiling - V3D_TILING_LINEARTILE)) << - V3D33_TFU_ICFG_FORMAT_SHIFT); - } - - uint32_t dst_offset = (dst->bo->offset + - v3d_layer_offset(pdst, base_level, dst_layer)); - tfu.ioa |= dst_offset; - if (last_level != base_level) - tfu.ioa |= V3D33_TFU_IOA_DIMTW; - tfu.ioa |= ((V3D33_TFU_IOA_FORMAT_LINEARTILE + - (dst_base_slice->tiling - V3D_TILING_LINEARTILE)) << - V3D33_TFU_IOA_FORMAT_SHIFT); - - tfu.icfg |= tex_format << V3D33_TFU_ICFG_TTYPE_SHIFT; - tfu.icfg |= (last_level - base_level) << V3D33_TFU_ICFG_NUMMM_SHIFT; - - switch (src_base_slice->tiling) { - case V3D_TILING_UIF_NO_XOR: - case V3D_TILING_UIF_XOR: - tfu.iis |= (src_base_slice->padded_height / - (2 * v3d_utile_height(src->cpp))); - break; - case V3D_TILING_RASTER: - tfu.iis |= src_base_slice->stride / src->cpp; - break; - case V3D_TILING_LINEARTILE: - case V3D_TILING_UBLINEAR_1_COLUMN: - case V3D_TILING_UBLINEAR_2_COLUMN: - break; - } - - /* If we're writing level 0 (!IOA_DIMTW), then we need to supply the - * OPAD field for the destination (how many extra UIF blocks beyond - * those necessary to cover the height). When filling mipmaps, the - * miplevel 1+ tiling state is inferred. - */ - if (dst_base_slice->tiling == V3D_TILING_UIF_NO_XOR || - dst_base_slice->tiling == V3D_TILING_UIF_XOR) { - int uif_block_h = 2 * v3d_utile_height(dst->cpp); - int implicit_padded_height = align(height, uif_block_h); - - tfu.icfg |= (((dst_base_slice->padded_height - - implicit_padded_height) / uif_block_h) << - V3D33_TFU_ICFG_OPAD_SHIFT); - } - - int ret = v3d_ioctl(screen->fd, DRM_IOCTL_V3D_SUBMIT_TFU, &tfu); - if (ret != 0) { - fprintf(stderr, "Failed to submit TFU job: %d\n", ret); - return false; - } - - dst->writes++; - - return true; -} - bool v3d_generate_mipmap(struct pipe_context *pctx, struct pipe_resource *prsc, @@ -362,12 +228,16 @@ v3d_generate_mipmap(struct pipe_context *pctx, if (first_layer != last_layer) return false; - return v3d_tfu(pctx, - prsc, prsc, - base_level, - base_level, last_level, - first_layer, first_layer, - true); + struct v3d_context *v3d = v3d_context(pctx); + struct v3d_screen *screen = v3d->screen; + struct v3d_device_info *devinfo = &screen->devinfo; + + return v3d_X(devinfo, tfu)(pctx, + prsc, prsc, + base_level, + base_level, last_level, + first_layer, first_layer, + true); } static void @@ -396,11 +266,15 @@ v3d_tfu_blit(struct pipe_context *pctx, struct pipe_blit_info *info) if (info->dst.format != info->src.format) return; - if (v3d_tfu(pctx, info->dst.resource, info->src.resource, - info->src.level, - info->dst.level, info->dst.level, - info->src.box.z, info->dst.box.z, - false)) { + struct v3d_context *v3d = v3d_context(pctx); + struct v3d_screen *screen = v3d->screen; + struct v3d_device_info *devinfo = &screen->devinfo; + + if (v3d_X(devinfo, tfu)(pctx, info->dst.resource, info->src.resource, + info->src.level, + info->dst.level, info->dst.level, + info->src.box.z, info->dst.box.z, + false)) { info->mask &= ~PIPE_MASK_RGBA; } } diff --git a/src/gallium/drivers/v3d/v3dx_context.h b/src/gallium/drivers/v3d/v3dx_context.h index 03d7c244ea2..e0a5cbfb2f3 100644 --- a/src/gallium/drivers/v3d/v3dx_context.h +++ b/src/gallium/drivers/v3d/v3dx_context.h @@ -51,3 +51,13 @@ void v3dX(get_internal_type_bpp_for_output_format)(uint32_t format, */ bool v3dX(tfu_supports_tex_format)(uint32_t tex_format, bool for_mipmap); + +bool v3dX(tfu)(struct pipe_context *pctx, + struct pipe_resource *pdst, + struct pipe_resource *psrc, + unsigned int src_level, + unsigned int base_level, + unsigned int last_level, + unsigned int src_layer, + unsigned int dst_layer, + bool for_mipmap); diff --git a/src/gallium/drivers/v3d/v3dx_tfu.c b/src/gallium/drivers/v3d/v3dx_tfu.c new file mode 100644 index 00000000000..d6b51390a11 --- /dev/null +++ b/src/gallium/drivers/v3d/v3dx_tfu.c @@ -0,0 +1,202 @@ +/* + * Copyright © 2021 Broadcom + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "v3d_context.h" +#include "broadcom/common/v3d_tfu.h" + +bool +v3dX(tfu)(struct pipe_context *pctx, + struct pipe_resource *pdst, + struct pipe_resource *psrc, + unsigned int src_level, + unsigned int base_level, + unsigned int last_level, + unsigned int src_layer, + unsigned int dst_layer, + bool for_mipmap) +{ + struct v3d_context *v3d = v3d_context(pctx); + struct v3d_screen *screen = v3d->screen; + struct v3d_resource *src = v3d_resource(psrc); + struct v3d_resource *dst = v3d_resource(pdst); + struct v3d_resource_slice *src_base_slice = &src->slices[src_level]; + struct v3d_resource_slice *dst_base_slice = &dst->slices[base_level]; + int msaa_scale = pdst->nr_samples > 1 ? 2 : 1; + int width = u_minify(pdst->width0, base_level) * msaa_scale; + int height = u_minify(pdst->height0, base_level) * msaa_scale; + enum pipe_format pformat; + + if (psrc->format != pdst->format) + return false; + if (psrc->nr_samples != pdst->nr_samples) + return false; + + if (pdst->target != PIPE_TEXTURE_2D || psrc->target != PIPE_TEXTURE_2D) + return false; + + /* Can't write to raster. */ + if (dst_base_slice->tiling == V3D_TILING_RASTER) + return false; + + /* When using TFU for blit, we are doing exact copies (both input and + * output format must be the same, no scaling, etc), so there is no + * pixel format conversions. Thus we can rewrite the format to use one + * that is TFU compatible based on its texel size. + */ + if (for_mipmap) { + pformat = pdst->format; + } else { + switch (dst->cpp) { + case 16: pformat = PIPE_FORMAT_R32G32B32A32_FLOAT; break; + case 8: pformat = PIPE_FORMAT_R16G16B16A16_FLOAT; break; + case 4: pformat = PIPE_FORMAT_R32_FLOAT; break; + case 2: pformat = PIPE_FORMAT_R16_FLOAT; break; + case 1: pformat = PIPE_FORMAT_R8_UNORM; break; + default: unreachable("unsupported format bit-size"); break; + }; + } + + uint32_t tex_format = v3d_get_tex_format(&screen->devinfo, pformat); + + if (!v3dX(tfu_supports_tex_format)(tex_format, for_mipmap)) { + assert(for_mipmap); + return false; + } + + v3d_flush_jobs_writing_resource(v3d, psrc, V3D_FLUSH_DEFAULT, false); + v3d_flush_jobs_reading_resource(v3d, pdst, V3D_FLUSH_DEFAULT, false); + + struct drm_v3d_submit_tfu tfu = { + .ios = (height << 16) | width, + .bo_handles = { + dst->bo->handle, + src != dst ? src->bo->handle : 0 + }, + .in_sync = v3d->out_sync, + .out_sync = v3d->out_sync, + }; + uint32_t src_offset = (src->bo->offset + + v3d_layer_offset(psrc, src_level, src_layer)); + tfu.iia |= src_offset; + + uint32_t dst_offset = (dst->bo->offset + + v3d_layer_offset(pdst, base_level, dst_layer)); + tfu.ioa |= dst_offset; + + switch (src_base_slice->tiling) { + case V3D_TILING_UIF_NO_XOR: + case V3D_TILING_UIF_XOR: + tfu.iis |= (src_base_slice->padded_height / + (2 * v3d_utile_height(src->cpp))); + break; + case V3D_TILING_RASTER: + tfu.iis |= src_base_slice->stride / src->cpp; + break; + case V3D_TILING_LINEARTILE: + case V3D_TILING_UBLINEAR_1_COLUMN: + case V3D_TILING_UBLINEAR_2_COLUMN: + break; + } + +#if V3D_VERSION <= 42 + if (src_base_slice->tiling == V3D_TILING_RASTER) { + tfu.icfg |= (V3D33_TFU_ICFG_FORMAT_RASTER << + V3D33_TFU_ICFG_FORMAT_SHIFT); + } else { + tfu.icfg |= ((V3D33_TFU_ICFG_FORMAT_LINEARTILE + + (src_base_slice->tiling - V3D_TILING_LINEARTILE)) << + V3D33_TFU_ICFG_FORMAT_SHIFT); + } + tfu.icfg |= tex_format << V3D33_TFU_ICFG_TTYPE_SHIFT; + + if (last_level != base_level) + tfu.ioa |= V3D33_TFU_IOA_DIMTW; + + tfu.ioa |= ((V3D33_TFU_IOA_FORMAT_LINEARTILE + + (dst_base_slice->tiling - V3D_TILING_LINEARTILE)) << + V3D33_TFU_IOA_FORMAT_SHIFT); + + tfu.icfg |= (last_level - base_level) << V3D33_TFU_ICFG_NUMMM_SHIFT; + + /* If we're writing level 0 (!IOA_DIMTW), then we need to supply the + * OPAD field for the destination (how many extra UIF blocks beyond + * those necessary to cover the height). When filling mipmaps, the + * miplevel 1+ tiling state is inferred. + */ + if (dst_base_slice->tiling == V3D_TILING_UIF_NO_XOR || + dst_base_slice->tiling == V3D_TILING_UIF_XOR) { + int uif_block_h = 2 * v3d_utile_height(dst->cpp); + int implicit_padded_height = align(height, uif_block_h); + + tfu.icfg |= (((dst_base_slice->padded_height - + implicit_padded_height) / uif_block_h) << + V3D33_TFU_ICFG_OPAD_SHIFT); + } +#endif /* V3D_VERSION <= 42 */ + +#if V3D_VERSION >= 71 + if (src_base_slice->tiling == V3D_TILING_RASTER) { + tfu.icfg = V3D71_TFU_ICFG_FORMAT_RASTER << V3D71_TFU_ICFG_IFORMAT_SHIFT; + } else { + tfu.icfg = (V3D71_TFU_ICFG_FORMAT_LINEARTILE + + (src_base_slice->tiling - V3D_TILING_LINEARTILE)) << + V3D71_TFU_ICFG_IFORMAT_SHIFT; + } + tfu.icfg |= tex_format << V3D71_TFU_ICFG_OTYPE_SHIFT; + + if (last_level != base_level) + tfu.v71.ioc |= V3D71_TFU_IOC_DIMTW; + + tfu.v71.ioc |= ((V3D71_TFU_IOC_FORMAT_LINEARTILE + + (dst_base_slice->tiling - V3D_TILING_LINEARTILE)) << + V3D71_TFU_IOC_FORMAT_SHIFT); + + switch (dst_base_slice->tiling) { + case V3D_TILING_UIF_NO_XOR: + case V3D_TILING_UIF_XOR: + tfu.v71.ioc |= + (dst_base_slice->padded_height / (2 * v3d_utile_height(dst->cpp))) << + V3D71_TFU_IOC_STRIDE_SHIFT; + break; + case V3D_TILING_RASTER: + tfu.v71.ioc |= (dst_base_slice->padded_height / dst->cpp) << + V3D71_TFU_IOC_STRIDE_SHIFT; + break; + default: + break; + } + + tfu.v71.ioc |= (last_level - base_level) << V3D71_TFU_IOC_NUMMM_SHIFT; +#endif /* V3D_VERSION >= 71*/ + + int ret = v3d_ioctl(screen->fd, DRM_IOCTL_V3D_SUBMIT_TFU, &tfu); + if (ret != 0) { + fprintf(stderr, "Failed to submit TFU job: %d\n", ret); + return false; + } + + dst->writes++; + + return true; +} + -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0122-v3d-v3dv-fix-texture-state-array-stride-packing-for-.patch ================================================ From ed7e118a6cc0c9bba9f02929e98bc51252331950 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 16 May 2023 00:28:27 +0200 Subject: [PATCH 122/142] v3d/v3dv: fix texture state array stride packing for V3D 7.1.5 --- src/broadcom/vulkan/v3dvx_image.c | 7 +++++++ src/gallium/drivers/v3d/v3dx_state.c | 20 +++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/broadcom/vulkan/v3dvx_image.c b/src/broadcom/vulkan/v3dvx_image.c index 437d4588c7e..ae6eaa88d0c 100644 --- a/src/broadcom/vulkan/v3dvx_image.c +++ b/src/broadcom/vulkan/v3dvx_image.c @@ -118,6 +118,13 @@ pack_texture_shader_state_helper(struct v3dv_device *device, #endif #if V3D_VERSION >= 71 tex.transfer_func = is_srgb ? TRANSFER_FUNC_SRGB : TRANSFER_FUNC_NONE; + + /* V3D 7.1.5 has array stride starting one bit later than previous + * V3D versions to make room for the new RB swap bit, but we don't + * handle that in the CLE parser. + */ + if (device->devinfo.rev >= 5) + tex.array_stride_64_byte_aligned <<= 1; #endif /* At this point we don't have the job. That's the reason the first diff --git a/src/gallium/drivers/v3d/v3dx_state.c b/src/gallium/drivers/v3d/v3dx_state.c index 348a7bcf3da..88e57cd072b 100644 --- a/src/gallium/drivers/v3d/v3dx_state.c +++ b/src/gallium/drivers/v3d/v3dx_state.c @@ -889,7 +889,8 @@ v3d_setup_texture_shader_state_from_buffer(struct V3DX(TEXTURE_SHADER_STATE) *te } static void -v3d_setup_texture_shader_state(struct V3DX(TEXTURE_SHADER_STATE) *tex, +v3d_setup_texture_shader_state(const struct v3d_device_info *devinfo, + struct V3DX(TEXTURE_SHADER_STATE) *tex, struct pipe_resource *prsc, int base_level, int last_level, int first_layer, int last_layer, @@ -949,15 +950,22 @@ v3d_setup_texture_shader_state(struct V3DX(TEXTURE_SHADER_STATE) *tex, tex->texture_base_pointer = cl_address(NULL, base_offset); #endif + + tex->array_stride_64_byte_aligned = rsc->cube_map_stride / 64; + #if V3D_VERSION >= 71 tex->chroma_offset_x = 1; tex->chroma_offset_y = 1; /* See comment in XML field definition for rationale of the shifts */ tex->texture_base_pointer_cb = base_offset >> 6; tex->texture_base_pointer_cr = base_offset >> 6; -#endif - tex->array_stride_64_byte_aligned = rsc->cube_map_stride / 64; + /* V3D 7.1.5 has array stride start at bit 33 instead of bit 32 to + * make room for the RB swap bit. + */ + if (devinfo->rev >= 5) + tex->array_stride_64_byte_aligned <<= 1; +#endif /* Since other platform devices may produce UIF images even * when they're not big enough for V3D to assume they're UIF, @@ -1006,7 +1014,8 @@ v3dX(create_texture_shader_state_bo)(struct v3d_context *v3d, v3dx_pack(map, TEXTURE_SHADER_STATE, tex) { if (prsc->target != PIPE_BUFFER) { - v3d_setup_texture_shader_state(&tex, prsc, + v3d_setup_texture_shader_state(&v3d->screen->devinfo, + &tex, prsc, cso->u.tex.first_level, cso->u.tex.last_level, cso->u.tex.first_layer, @@ -1442,7 +1451,8 @@ v3d_create_image_view_texture_shader_state(struct v3d_context *v3d, v3dx_pack(map, TEXTURE_SHADER_STATE, tex) { if (prsc->target != PIPE_BUFFER) { - v3d_setup_texture_shader_state(&tex, prsc, + v3d_setup_texture_shader_state(&v3d->screen->devinfo, + &tex, prsc, iview->base.u.tex.level, iview->base.u.tex.level, iview->base.u.tex.first_layer, -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0123-v3d-v3dv-support-up-to-8-render-targets-in-v7.1.patch ================================================ From 48893b056a07b7eda4fe3dea7f068c403981b621 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Fri, 12 Nov 2021 10:35:59 +0100 Subject: [PATCH 123/142] v3d,v3dv: support up to 8 render targets in v7.1+ --- src/broadcom/common/v3d_limits.h | 3 +- src/broadcom/common/v3d_util.c | 49 ++++++++++++++++++++++++-- src/broadcom/common/v3d_util.h | 6 ++-- src/broadcom/compiler/nir_to_vir.c | 10 +++--- src/broadcom/vulkan/v3dv_cmd_buffer.c | 5 +-- src/broadcom/vulkan/v3dv_device.c | 6 ++-- src/broadcom/vulkan/v3dv_limits.h | 2 -- src/broadcom/vulkan/v3dv_meta_clear.c | 8 +++-- src/broadcom/vulkan/v3dv_pass.c | 6 ++-- src/broadcom/vulkan/v3dv_pipeline.c | 4 ++- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 7 ++-- src/broadcom/vulkan/v3dvx_device.c | 1 - src/gallium/drivers/v3d/v3d_blit.c | 2 +- src/gallium/drivers/v3d/v3d_context.c | 5 +-- src/gallium/drivers/v3d/v3d_context.h | 3 +- src/gallium/drivers/v3d/v3d_job.c | 6 ++-- src/gallium/drivers/v3d/v3d_screen.c | 3 +- src/gallium/drivers/v3d/v3dx_emit.c | 14 +++++--- src/gallium/drivers/v3d/v3dx_state.c | 5 +-- 19 files changed, 104 insertions(+), 41 deletions(-) diff --git a/src/broadcom/common/v3d_limits.h b/src/broadcom/common/v3d_limits.h index 46f38bd7484..354c8784914 100644 --- a/src/broadcom/common/v3d_limits.h +++ b/src/broadcom/common/v3d_limits.h @@ -42,7 +42,8 @@ #define V3D_MAX_SAMPLES 4 -#define V3D_MAX_DRAW_BUFFERS 4 +#define V3D_MAX_DRAW_BUFFERS 8 +#define V3D_MAX_RENDER_TARGETS(ver) (ver < 71 ? 4 : 8) #define V3D_MAX_POINT_SIZE 512.0f #define V3D_MAX_LINE_WIDTH 32 diff --git a/src/broadcom/common/v3d_util.c b/src/broadcom/common/v3d_util.c index 26f5c6b336f..209a5eceaa1 100644 --- a/src/broadcom/common/v3d_util.c +++ b/src/broadcom/common/v3d_util.c @@ -88,8 +88,10 @@ v3d_csd_choose_workgroups_per_supergroup(struct v3d_device_info *devinfo, } void -v3d_choose_tile_size(uint32_t color_attachment_count, uint32_t max_color_bpp, - bool msaa, bool double_buffer, +v3d_choose_tile_size(const struct v3d_device_info *devinfo, + uint32_t color_attachment_count, + uint32_t max_color_bpp, bool msaa, + bool double_buffer, uint32_t *width, uint32_t *height) { static const uint8_t tile_sizes[] = { @@ -103,7 +105,9 @@ v3d_choose_tile_size(uint32_t color_attachment_count, uint32_t max_color_bpp, }; uint32_t idx = 0; - if (color_attachment_count > 2) + if (color_attachment_count > 4) + idx += 3; + else if (color_attachment_count > 2) idx += 2; else if (color_attachment_count > 1) idx += 1; @@ -117,6 +121,45 @@ v3d_choose_tile_size(uint32_t color_attachment_count, uint32_t max_color_bpp, idx += max_color_bpp; + if (devinfo->ver >= 71) { + /* In V3D 7.x the TLB has an auxiliary buffer of 8KB that will be + * automatically used for depth instead of the main 16KB depth TLB buffer + * when the depth tile fits in the auxiliary buffer, allowing the hardware + * to allocate the 16KB from the main depth TLB to the color TLB. If + * we can do that, then we are effectively doubling the memory we have + * for color and we can increase our tile dimensions by a factor of 2 + * (reduce idx by 1). + * + * If we have computed a tile size that would be smaller than the minimum + * of 8x8, then it is certain that depth will fit in the aux depth TLB + * (even in MSAA mode). + * + * Otherwise, we need check if we can fit depth in the aux TLB buffer + * using a larger tile size. + * + * FIXME: the docs state that depth TLB memory can be used for color + * if depth testing is not used by setting the 'depth disable' bit in the + * rendering configuration. However, this comes with a requirement that + * occlussion queries must not be active. We need to clarify if this means + * active at the point at which we emit a tile rendering configuration + * item, meaning that the we have a query spanning a full render pass + * (this is something we can tell before we emit the rendering + * configuration item) or active in the subpass for which we are enabling + * the bit (which we can't tell until later, when we record commands for + * the subpass). If it is the latter, then we cannot use this feature. + */ + if (idx >= ARRAY_SIZE(tile_sizes) / 2) { + idx--; + } else if (idx > 0) { + /* Depth is always 32bpp (4x32bpp for 4x MSAA) */ + uint32_t depth_bpp = !msaa ? 4 : 16; + uint32_t tile_w = tile_sizes[(idx - 1) * 2]; + uint32_t tile_h = tile_sizes[(idx - 1) * 2 + 1]; + if (tile_w * tile_h * depth_bpp <= 8192) + idx--; + } + } + assert(idx < ARRAY_SIZE(tile_sizes) / 2); *width = tile_sizes[idx * 2]; diff --git a/src/broadcom/common/v3d_util.h b/src/broadcom/common/v3d_util.h index 864fc949ffa..5a7e244a0a5 100644 --- a/src/broadcom/common/v3d_util.h +++ b/src/broadcom/common/v3d_util.h @@ -37,8 +37,10 @@ v3d_csd_choose_workgroups_per_supergroup(struct v3d_device_info *devinfo, uint32_t wg_size); void -v3d_choose_tile_size(uint32_t color_attachment_count, uint32_t max_color_bpp, - bool msaa, bool double_buffer, +v3d_choose_tile_size(const struct v3d_device_info *devinfo, + uint32_t color_attachment_count, + uint32_t max_color_bpp, bool msaa, + bool double_buffer, uint32_t *width, uint32_t *height); uint32_t diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index a8cf02dd386..531e85a1212 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -2483,15 +2483,17 @@ ntq_setup_outputs(struct v3d_compile *c) switch (var->data.location) { case FRAG_RESULT_COLOR: - c->output_color_var[0] = var; - c->output_color_var[1] = var; - c->output_color_var[2] = var; - c->output_color_var[3] = var; + for (int i = 0; i < V3D_MAX_DRAW_BUFFERS; i++) + c->output_color_var[i] = var; break; case FRAG_RESULT_DATA0: case FRAG_RESULT_DATA1: case FRAG_RESULT_DATA2: case FRAG_RESULT_DATA3: + case FRAG_RESULT_DATA4: + case FRAG_RESULT_DATA5: + case FRAG_RESULT_DATA6: + case FRAG_RESULT_DATA7: c->output_color_var[var->data.location - FRAG_RESULT_DATA0] = var; break; diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index bda0a614523..11d161b19b7 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -365,7 +365,8 @@ job_compute_frame_tiling(struct v3dv_job *job, /* Double-buffer is incompatible with MSAA */ assert(!tiling->msaa || !tiling->double_buffer); - v3d_choose_tile_size(render_target_count, max_internal_bpp, + v3d_choose_tile_size(&job->device->devinfo, + render_target_count, max_internal_bpp, tiling->msaa, tiling->double_buffer, &tiling->tile_width, &tiling->tile_height); @@ -1374,7 +1375,7 @@ cmd_buffer_emit_subpass_clears(struct v3dv_cmd_buffer *cmd_buffer) } uint32_t att_count = 0; - VkClearAttachment atts[V3D_MAX_DRAW_BUFFERS + 1]; /* 4 color + D/S */ + VkClearAttachment atts[V3D_MAX_DRAW_BUFFERS + 1]; /* +1 for D/S */ /* We only need to emit subpass clears as draw calls for color attachments * if the render area is not aligned to tile boundaries. diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 01e2dd7ac2d..19e58542414 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -1366,6 +1366,8 @@ v3dv_GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, const VkSampleCountFlags supported_sample_counts = VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT; + const uint8_t max_rts = V3D_MAX_RENDER_TARGETS(pdevice->devinfo.ver); + struct timespec clock_res; clock_getres(CLOCK_MONOTONIC, &clock_res); const float timestamp_period = @@ -1436,7 +1438,7 @@ v3dv_GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, .maxFragmentInputComponents = max_varying_components, .maxFragmentOutputAttachments = 4, .maxFragmentDualSrcAttachments = 0, - .maxFragmentCombinedOutputResources = MAX_RENDER_TARGETS + + .maxFragmentCombinedOutputResources = max_rts + MAX_STORAGE_BUFFERS + MAX_STORAGE_IMAGES, @@ -1476,7 +1478,7 @@ v3dv_GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, .framebufferDepthSampleCounts = supported_sample_counts, .framebufferStencilSampleCounts = supported_sample_counts, .framebufferNoAttachmentsSampleCounts = supported_sample_counts, - .maxColorAttachments = MAX_RENDER_TARGETS, + .maxColorAttachments = max_rts, .sampledImageColorSampleCounts = supported_sample_counts, .sampledImageIntegerSampleCounts = supported_sample_counts, .sampledImageDepthSampleCounts = supported_sample_counts, diff --git a/src/broadcom/vulkan/v3dv_limits.h b/src/broadcom/vulkan/v3dv_limits.h index 9cda9f0d6d2..8ac99724105 100644 --- a/src/broadcom/vulkan/v3dv_limits.h +++ b/src/broadcom/vulkan/v3dv_limits.h @@ -50,8 +50,6 @@ #define MAX_DYNAMIC_BUFFERS (MAX_DYNAMIC_UNIFORM_BUFFERS + \ MAX_DYNAMIC_STORAGE_BUFFERS) -#define MAX_RENDER_TARGETS 4 - #define MAX_MULTIVIEW_VIEW_COUNT 16 /* These are tunable parameters in the HW design, but all the V3D diff --git a/src/broadcom/vulkan/v3dv_meta_clear.c b/src/broadcom/vulkan/v3dv_meta_clear.c index d376c179e1c..0a7905b49d5 100644 --- a/src/broadcom/vulkan/v3dv_meta_clear.c +++ b/src/broadcom/vulkan/v3dv_meta_clear.c @@ -747,7 +747,7 @@ get_color_clear_pipeline_cache_key(uint32_t rt_idx, uint32_t bit_offset = 0; key |= rt_idx; - bit_offset += 2; + bit_offset += 3; key |= ((uint64_t) format) << bit_offset; bit_offset += 32; @@ -1189,9 +1189,11 @@ v3dv_CmdClearAttachments(VkCommandBuffer commandBuffer, { V3DV_FROM_HANDLE(v3dv_cmd_buffer, cmd_buffer, commandBuffer); - /* We can only clear attachments in the current subpass */ - assert(attachmentCount <= 5); /* 4 color + D/S */ + /* We can have at most max_color_RTs + 1 D/S attachments */ + assert(attachmentCount <= + V3D_MAX_RENDER_TARGETS(cmd_buffer->device->devinfo.ver) + 1); + /* We can only clear attachments in the current subpass */ struct v3dv_render_pass *pass = cmd_buffer->state.pass; assert(cmd_buffer->state.subpass_idx < pass->subpass_count); diff --git a/src/broadcom/vulkan/v3dv_pass.c b/src/broadcom/vulkan/v3dv_pass.c index 3e82c15df88..7f2e2bbc710 100644 --- a/src/broadcom/vulkan/v3dv_pass.c +++ b/src/broadcom/vulkan/v3dv_pass.c @@ -322,11 +322,11 @@ subpass_get_granularity(struct v3dv_device *device, /* Granularity is defined by the tile size */ assert(subpass_idx < pass->subpass_count); struct v3dv_subpass *subpass = &pass->subpasses[subpass_idx]; - const uint32_t color_attachment_count = subpass->color_count; + const uint32_t color_count = subpass->color_count; bool msaa = false; uint32_t max_bpp = 0; - for (uint32_t i = 0; i < color_attachment_count; i++) { + for (uint32_t i = 0; i < color_count; i++) { uint32_t attachment_idx = subpass->color_attachments[i].attachment; if (attachment_idx == VK_ATTACHMENT_UNUSED) continue; @@ -349,7 +349,7 @@ subpass_get_granularity(struct v3dv_device *device, * heuristics so we choose a conservative granularity here, with it disabled. */ uint32_t width, height; - v3d_choose_tile_size(color_attachment_count, max_bpp, msaa, + v3d_choose_tile_size(&device->devinfo, color_count, max_bpp, msaa, false /* double-buffer */, &width, &height); *granularity = (VkExtent2D) { .width = width, diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index 2156176d4cc..3bcdcc9a853 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -2632,6 +2632,7 @@ pipeline_init_dynamic_state( const VkPipelineColorWriteCreateInfoEXT *pColorWriteState) { /* Initialize to default values */ + const struct v3d_device_info *devinfo = &pipeline->device->devinfo; struct v3dv_dynamic_state *dynamic = &pipeline->dynamic_state; memset(dynamic, 0, sizeof(*dynamic)); dynamic->stencil_compare_mask.front = ~0; @@ -2639,7 +2640,8 @@ pipeline_init_dynamic_state( dynamic->stencil_write_mask.front = ~0; dynamic->stencil_write_mask.back = ~0; dynamic->line_width = 1.0f; - dynamic->color_write_enable = (1ull << (4 * V3D_MAX_DRAW_BUFFERS)) - 1; + dynamic->color_write_enable = + (1ull << (4 * V3D_MAX_RENDER_TARGETS(devinfo->ver))) - 1; /* Create a mask of enabled dynamic states */ uint32_t dynamic_states = 0; diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index 3566649aafd..bf5e47018e8 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -1550,10 +1550,13 @@ v3dX(cmd_buffer_emit_blend)(struct v3dv_cmd_buffer *cmd_buffer) struct v3dv_pipeline *pipeline = cmd_buffer->state.gfx.pipeline; assert(pipeline); + const struct v3d_device_info *devinfo = &cmd_buffer->device->devinfo; + const uint32_t max_color_rts = V3D_MAX_RENDER_TARGETS(devinfo->ver); + const uint32_t blend_packets_size = cl_packet_length(BLEND_ENABLES) + cl_packet_length(BLEND_CONSTANT_COLOR) + - cl_packet_length(BLEND_CFG) * V3D_MAX_DRAW_BUFFERS; + cl_packet_length(BLEND_CFG) * max_color_rts; v3dv_cl_ensure_space_with_branch(&job->bcl, blend_packets_size); v3dv_return_if_oom(cmd_buffer, NULL); @@ -1565,7 +1568,7 @@ v3dX(cmd_buffer_emit_blend)(struct v3dv_cmd_buffer *cmd_buffer) } } - for (uint32_t i = 0; i < V3D_MAX_DRAW_BUFFERS; i++) { + for (uint32_t i = 0; i < max_color_rts; i++) { if (pipeline->blend.enables & (1 << i)) cl_emit_prepacked(&job->bcl, &pipeline->blend.cfg[i]); } diff --git a/src/broadcom/vulkan/v3dvx_device.c b/src/broadcom/vulkan/v3dvx_device.c index 72daefadb08..4d17a2691a5 100644 --- a/src/broadcom/vulkan/v3dvx_device.c +++ b/src/broadcom/vulkan/v3dvx_device.c @@ -49,7 +49,6 @@ vk_to_v3d_compare_func[] = { [VK_COMPARE_OP_ALWAYS] = V3D_COMPARE_FUNC_ALWAYS, }; - static union pipe_color_union encode_border_color( const VkSamplerCustomBorderColorCreateInfoEXT *bc_info) { diff --git a/src/gallium/drivers/v3d/v3d_blit.c b/src/gallium/drivers/v3d/v3d_blit.c index 96179f654a4..51ddc292ff7 100644 --- a/src/gallium/drivers/v3d/v3d_blit.c +++ b/src/gallium/drivers/v3d/v3d_blit.c @@ -369,7 +369,7 @@ v3d_tlb_blit(struct pipe_context *pctx, struct pipe_blit_info *info) bool double_buffer = V3D_DBG(DOUBLE_BUFFER) && !msaa; uint32_t tile_width, tile_height, max_bpp; - v3d_get_tile_buffer_size(msaa, double_buffer, + v3d_get_tile_buffer_size(devinfo, msaa, double_buffer, is_color_blit ? 1 : 0, surfaces, src_surf, &tile_width, &tile_height, &max_bpp); diff --git a/src/gallium/drivers/v3d/v3d_context.c b/src/gallium/drivers/v3d/v3d_context.c index f12e8c92139..def546e9ef5 100644 --- a/src/gallium/drivers/v3d/v3d_context.c +++ b/src/gallium/drivers/v3d/v3d_context.c @@ -220,7 +220,8 @@ v3d_flag_dirty_sampler_state(struct v3d_context *v3d, } void -v3d_get_tile_buffer_size(bool is_msaa, +v3d_get_tile_buffer_size(const struct v3d_device_info *devinfo, + bool is_msaa, bool double_buffer, uint32_t nr_cbufs, struct pipe_surface **cbufs, @@ -247,7 +248,7 @@ v3d_get_tile_buffer_size(bool is_msaa, *max_bpp = MAX2(*max_bpp, bsurf->internal_bpp); } - v3d_choose_tile_size(max_cbuf_idx + 1, *max_bpp, + v3d_choose_tile_size(devinfo, max_cbuf_idx + 1, *max_bpp, is_msaa, double_buffer, tile_width, tile_height); } diff --git a/src/gallium/drivers/v3d/v3d_context.h b/src/gallium/drivers/v3d/v3d_context.h index 21ee10a90cc..eb184b4b203 100644 --- a/src/gallium/drivers/v3d/v3d_context.h +++ b/src/gallium/drivers/v3d/v3d_context.h @@ -795,7 +795,8 @@ void v3d_ensure_prim_counts_allocated(struct v3d_context *ctx); void v3d_flag_dirty_sampler_state(struct v3d_context *v3d, enum pipe_shader_type shader); -void v3d_get_tile_buffer_size(bool is_msaa, +void v3d_get_tile_buffer_size(const struct v3d_device_info *devinfo, + bool is_msaa, bool double_buffer, uint32_t nr_cbufs, struct pipe_surface **cbufs, diff --git a/src/gallium/drivers/v3d/v3d_job.c b/src/gallium/drivers/v3d/v3d_job.c index b022ed45073..577890a06c3 100644 --- a/src/gallium/drivers/v3d/v3d_job.c +++ b/src/gallium/drivers/v3d/v3d_job.c @@ -383,9 +383,11 @@ v3d_get_job_for_fbo(struct v3d_context *v3d) job->double_buffer = false; } - v3d_get_tile_buffer_size(job->msaa, job->double_buffer, + v3d_get_tile_buffer_size(&v3d->screen->devinfo, + job->msaa, job->double_buffer, job->nr_cbufs, job->cbufs, job->bbuf, - &job->tile_width, &job->tile_height, + &job->tile_width, + &job->tile_height, &job->internal_bpp); /* The dirty flags are tracking what's been updated while v3d->job has diff --git a/src/gallium/drivers/v3d/v3d_screen.c b/src/gallium/drivers/v3d/v3d_screen.c index efdb7d615ae..2225edf85bd 100644 --- a/src/gallium/drivers/v3d/v3d_screen.c +++ b/src/gallium/drivers/v3d/v3d_screen.c @@ -255,9 +255,8 @@ v3d_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS: return V3D_MAX_ARRAY_LAYERS; - /* Render targets. */ case PIPE_CAP_MAX_RENDER_TARGETS: - return 4; + return V3D_MAX_RENDER_TARGETS(screen->devinfo.ver); case PIPE_CAP_VENDOR_ID: return 0x14E4; diff --git a/src/gallium/drivers/v3d/v3dx_emit.c b/src/gallium/drivers/v3d/v3dx_emit.c index 75751dc9ab6..87e75281dc9 100644 --- a/src/gallium/drivers/v3d/v3dx_emit.c +++ b/src/gallium/drivers/v3d/v3dx_emit.c @@ -661,8 +661,10 @@ v3dX(emit_state)(struct pipe_context *pctx) } #endif + const uint32_t max_rts = + V3D_MAX_RENDER_TARGETS(v3d->screen->devinfo.ver); if (blend->base.independent_blend_enable) { - for (int i = 0; i < V3D_MAX_DRAW_BUFFERS; i++) + for (int i = 0; i < max_rts; i++) emit_rt_blend(v3d, job, &blend->base, i, (1 << i), v3d->blend_dst_alpha_one & (1 << i)); @@ -678,16 +680,16 @@ v3dX(emit_state)(struct pipe_context *pctx) * RTs without. */ emit_rt_blend(v3d, job, &blend->base, 0, - ((1 << V3D_MAX_DRAW_BUFFERS) - 1) & + ((1 << max_rts) - 1) & v3d->blend_dst_alpha_one, true); emit_rt_blend(v3d, job, &blend->base, 0, - ((1 << V3D_MAX_DRAW_BUFFERS) - 1) & + ((1 << max_rts) - 1) & ~v3d->blend_dst_alpha_one, false); } else { emit_rt_blend(v3d, job, &blend->base, 0, - (1 << V3D_MAX_DRAW_BUFFERS) - 1, + (1 << max_rts) - 1, v3d->blend_dst_alpha_one); } } @@ -696,8 +698,10 @@ v3dX(emit_state)(struct pipe_context *pctx) if (v3d->dirty & V3D_DIRTY_BLEND) { struct pipe_blend_state *blend = &v3d->blend->base; + const uint32_t max_rts = + V3D_MAX_RENDER_TARGETS(v3d->screen->devinfo.ver); cl_emit(&job->bcl, COLOR_WRITE_MASKS, mask) { - for (int i = 0; i < 4; i++) { + for (int i = 0; i < max_rts; i++) { int rt = blend->independent_blend_enable ? i : 0; int rt_mask = blend->rt[rt].colormask; diff --git a/src/gallium/drivers/v3d/v3dx_state.c b/src/gallium/drivers/v3d/v3dx_state.c index 88e57cd072b..970a082aa85 100644 --- a/src/gallium/drivers/v3d/v3dx_state.c +++ b/src/gallium/drivers/v3d/v3dx_state.c @@ -138,8 +138,9 @@ v3d_create_blend_state(struct pipe_context *pctx, so->base = *cso; + uint32_t max_rts = V3D_MAX_RENDER_TARGETS(V3D_VERSION); if (cso->independent_blend_enable) { - for (int i = 0; i < V3D_MAX_DRAW_BUFFERS; i++) { + for (int i = 0; i < max_rts; i++) { so->blend_enables |= cso->rt[i].blend_enable << i; /* V3D 4.x is when we got independent blend enables. */ @@ -148,7 +149,7 @@ v3d_create_blend_state(struct pipe_context *pctx, } } else { if (cso->rt[0].blend_enable) - so->blend_enables = (1 << V3D_MAX_DRAW_BUFFERS) - 1; + so->blend_enables = (1 << max_rts) - 1; } return so; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0124-v3d-v3dv-don-t-use-max-internal-bpp-for-tile-sizing-.patch ================================================ From cc5afd808039f3e0b81fe0615745b74cbb31d0bf Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 16 Nov 2021 11:26:17 +0100 Subject: [PATCH 124/142] v3d,v3dv: don't use max internal bpp for tile sizing in V3D 7.x We can use the actual bpp of each color attachment to compute real tile memory requirements, which may allow us to choose a larger tile size configuration than in V3D 4.2 in certain scenarios. --- src/broadcom/common/v3d_util.c | 112 +++++++++++++++--------- src/broadcom/common/v3d_util.h | 7 +- src/broadcom/vulkan/v3dv_cmd_buffer.c | 20 +++-- src/broadcom/vulkan/v3dv_meta_clear.c | 1 + src/broadcom/vulkan/v3dv_meta_copy.c | 19 ++-- src/broadcom/vulkan/v3dv_pass.c | 9 +- src/broadcom/vulkan/v3dv_private.h | 2 + src/broadcom/vulkan/v3dvx_device.c | 21 +++-- src/broadcom/vulkan/v3dvx_meta_common.c | 10 ++- src/broadcom/vulkan/v3dvx_private.h | 4 +- src/broadcom/vulkan/v3dvx_queue.c | 3 +- src/gallium/drivers/v3d/v3d_context.c | 6 +- 12 files changed, 140 insertions(+), 74 deletions(-) diff --git a/src/broadcom/common/v3d_util.c b/src/broadcom/common/v3d_util.c index 209a5eceaa1..8a50d279985 100644 --- a/src/broadcom/common/v3d_util.c +++ b/src/broadcom/common/v3d_util.c @@ -87,12 +87,37 @@ v3d_csd_choose_workgroups_per_supergroup(struct v3d_device_info *devinfo, return best_wgs_per_sg; } +#define V3D71_TLB_COLOR_SIZE (16 * 1024) +#define V3D71_TLB_DETPH_SIZE (16 * 1024) +#define V3D71_TLB_AUX_DETPH_SIZE (8 * 1024) + +static bool +tile_size_valid(uint32_t pixel_count, uint32_t color_bpp, uint32_t depth_bpp) +{ + /* First, we check if we can fit this tile size allocating the depth + * TLB memory to color. + */ + if (pixel_count * depth_bpp <= V3D71_TLB_AUX_DETPH_SIZE && + pixel_count * color_bpp <= V3D71_TLB_COLOR_SIZE + V3D71_TLB_DETPH_SIZE) { + return true; + } + + /* Otherwise the tile must fit in the main TLB buffers */ + return pixel_count * depth_bpp <= V3D71_TLB_DETPH_SIZE && + pixel_count * color_bpp <= V3D71_TLB_COLOR_SIZE; +} + void v3d_choose_tile_size(const struct v3d_device_info *devinfo, uint32_t color_attachment_count, - uint32_t max_color_bpp, bool msaa, + /* V3D 4.x max internal bpp of all RTs */ + uint32_t max_internal_bpp, + /* V3D 7.x accumulated bpp for all RTs (in bytes) */ + uint32_t total_color_bpp, + bool msaa, bool double_buffer, - uint32_t *width, uint32_t *height) + uint32_t *width, + uint32_t *height) { static const uint8_t tile_sizes[] = { 64, 64, @@ -105,37 +130,19 @@ v3d_choose_tile_size(const struct v3d_device_info *devinfo, }; uint32_t idx = 0; - if (color_attachment_count > 4) - idx += 3; - else if (color_attachment_count > 2) - idx += 2; - else if (color_attachment_count > 1) - idx += 1; - - /* MSAA and double-buffer are mutually exclusive */ - assert(!msaa || !double_buffer); - if (msaa) - idx += 2; - else if (double_buffer) - idx += 1; - - idx += max_color_bpp; - if (devinfo->ver >= 71) { - /* In V3D 7.x the TLB has an auxiliary buffer of 8KB that will be - * automatically used for depth instead of the main 16KB depth TLB buffer - * when the depth tile fits in the auxiliary buffer, allowing the hardware - * to allocate the 16KB from the main depth TLB to the color TLB. If - * we can do that, then we are effectively doubling the memory we have - * for color and we can increase our tile dimensions by a factor of 2 - * (reduce idx by 1). + /* In V3D 7.x, we use the actual bpp used by color attachments to compute + * the tile size instead of the maximum bpp. This may allow us to choose a + * larger tile size than we would in 4.x in scenarios with multiple RTs + * with different bpps. * - * If we have computed a tile size that would be smaller than the minimum - * of 8x8, then it is certain that depth will fit in the aux depth TLB - * (even in MSAA mode). - * - * Otherwise, we need check if we can fit depth in the aux TLB buffer - * using a larger tile size. + * Also, the TLB has an auxiliary buffer of 8KB that will be automatically + * used for depth instead of the main 16KB depth TLB buffer when the depth + * tile fits in the auxiliary buffer, allowing the hardware to allocate + * the 16KB from the main depth TLB to the color TLB. If we can do that, + * then we are effectively doubling the memory we have for color and we + * can also select a larger tile size. This is necessary to support + * the most expensive configuration: 8x128bpp RTs + MSAA. * * FIXME: the docs state that depth TLB memory can be used for color * if depth testing is not used by setting the 'depth disable' bit in the @@ -147,17 +154,40 @@ v3d_choose_tile_size(const struct v3d_device_info *devinfo, * configuration item) or active in the subpass for which we are enabling * the bit (which we can't tell until later, when we record commands for * the subpass). If it is the latter, then we cannot use this feature. + * + * FIXME: pending handling double_buffer. */ - if (idx >= ARRAY_SIZE(tile_sizes) / 2) { - idx--; - } else if (idx > 0) { - /* Depth is always 32bpp (4x32bpp for 4x MSAA) */ - uint32_t depth_bpp = !msaa ? 4 : 16; - uint32_t tile_w = tile_sizes[(idx - 1) * 2]; - uint32_t tile_h = tile_sizes[(idx - 1) * 2 + 1]; - if (tile_w * tile_h * depth_bpp <= 8192) - idx--; - } + const uint32_t color_bpp = total_color_bpp * (msaa ? 4 : 1); + const uint32_t depth_bpp = 4 * (msaa ? 4 : 1); + do { + const uint32_t tile_w = tile_sizes[idx * 2]; + const uint32_t tile_h = tile_sizes[idx * 2 + 1]; + if (tile_size_valid(tile_w * tile_h, color_bpp, depth_bpp)) + break; + idx++; + } while (idx < ARRAY_SIZE(tile_sizes) / 2); + + /* FIXME: pending handling double_buffer */ + assert(!double_buffer); + } else { + /* On V3D 4.x tile size is selected based on the number of RTs, the + * maximum bpp across all of them and whether 4x MSAA is used. + */ + if (color_attachment_count > 4) + idx += 3; + else if (color_attachment_count > 2) + idx += 2; + else if (color_attachment_count > 1) + idx += 1; + + /* MSAA and double-buffer are mutually exclusive */ + assert(!msaa || !double_buffer); + if (msaa) + idx += 2; + else if (double_buffer) + idx += 1; + + idx += max_internal_bpp; } assert(idx < ARRAY_SIZE(tile_sizes) / 2); diff --git a/src/broadcom/common/v3d_util.h b/src/broadcom/common/v3d_util.h index 5a7e244a0a5..d02d41dd089 100644 --- a/src/broadcom/common/v3d_util.h +++ b/src/broadcom/common/v3d_util.h @@ -39,9 +39,12 @@ v3d_csd_choose_workgroups_per_supergroup(struct v3d_device_info *devinfo, void v3d_choose_tile_size(const struct v3d_device_info *devinfo, uint32_t color_attachment_count, - uint32_t max_color_bpp, bool msaa, + uint32_t max_internal_bpp, + uint32_t total_color_bpp, + bool msaa, bool double_buffer, - uint32_t *width, uint32_t *height); + uint32_t *width, + uint32_t *height); uint32_t v3d_translate_pipe_swizzle(enum pipe_swizzle swizzle); diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 11d161b19b7..f65388c10ec 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -348,6 +348,7 @@ job_compute_frame_tiling(struct v3dv_job *job, uint32_t layers, uint32_t render_target_count, uint8_t max_internal_bpp, + uint8_t total_color_bpp, bool msaa, bool double_buffer) { @@ -360,14 +361,16 @@ job_compute_frame_tiling(struct v3dv_job *job, tiling->render_target_count = render_target_count; tiling->msaa = msaa; tiling->internal_bpp = max_internal_bpp; + tiling->total_color_bpp = total_color_bpp; tiling->double_buffer = double_buffer; /* Double-buffer is incompatible with MSAA */ assert(!tiling->msaa || !tiling->double_buffer); v3d_choose_tile_size(&job->device->devinfo, - render_target_count, max_internal_bpp, - tiling->msaa, tiling->double_buffer, + render_target_count, + max_internal_bpp, total_color_bpp, msaa, + tiling->double_buffer, &tiling->tile_width, &tiling->tile_height); tiling->draw_tiles_x = DIV_ROUND_UP(width, tiling->tile_width); @@ -458,6 +461,7 @@ v3dv_job_start_frame(struct v3dv_job *job, bool allocate_tile_state_now, uint32_t render_target_count, uint8_t max_internal_bpp, + uint8_t total_color_bpp, bool msaa) { assert(job); @@ -468,7 +472,7 @@ v3dv_job_start_frame(struct v3dv_job *job, const struct v3dv_frame_tiling *tiling = job_compute_frame_tiling(job, width, height, layers, render_target_count, max_internal_bpp, - msaa, false); + total_color_bpp, msaa, false); v3dv_cl_ensure_space_with_branch(&job->bcl, 256); v3dv_return_if_oom(NULL, job); @@ -529,6 +533,7 @@ cmd_buffer_end_render_pass_frame(struct v3dv_cmd_buffer *cmd_buffer) job->frame_tiling.layers, job->frame_tiling.render_target_count, job->frame_tiling.internal_bpp, + job->frame_tiling.total_color_bpp, job->frame_tiling.msaa, true); @@ -1673,10 +1678,11 @@ cmd_buffer_subpass_create_job(struct v3dv_cmd_buffer *cmd_buffer, const struct v3dv_framebuffer *framebuffer = state->framebuffer; - uint8_t internal_bpp; + uint8_t max_internal_bpp, total_color_bpp; bool msaa; v3dv_X(job->device, framebuffer_compute_internal_bpp_msaa) - (framebuffer, state->attachments, subpass, &internal_bpp, &msaa); + (framebuffer, state->attachments, subpass, + &max_internal_bpp, &total_color_bpp, &msaa); /* From the Vulkan spec: * @@ -1700,7 +1706,8 @@ cmd_buffer_subpass_create_job(struct v3dv_cmd_buffer *cmd_buffer, layers, true, false, subpass->color_count, - internal_bpp, + max_internal_bpp, + total_color_bpp, msaa); } @@ -2668,6 +2675,7 @@ cmd_buffer_restart_job_for_msaa_if_needed(struct v3dv_cmd_buffer *cmd_buffer) true, false, old_job->frame_tiling.render_target_count, old_job->frame_tiling.internal_bpp, + old_job->frame_tiling.total_color_bpp, true /* msaa */); v3dv_job_destroy(old_job); diff --git a/src/broadcom/vulkan/v3dv_meta_clear.c b/src/broadcom/vulkan/v3dv_meta_clear.c index 0a7905b49d5..1c0d66c977c 100644 --- a/src/broadcom/vulkan/v3dv_meta_clear.c +++ b/src/broadcom/vulkan/v3dv_meta_clear.c @@ -127,6 +127,7 @@ clear_image_tlb(struct v3dv_cmd_buffer *cmd_buffer, v3dv_job_start_frame(job, width, height, max_layer, false, true, 1, internal_bpp, + 4 * v3d_internal_bpp_words(internal_bpp), image->vk.samples > VK_SAMPLE_COUNT_1_BIT); struct v3dv_meta_framebuffer framebuffer; diff --git a/src/broadcom/vulkan/v3dv_meta_copy.c b/src/broadcom/vulkan/v3dv_meta_copy.c index c0ec888b8c7..2d30c611e17 100644 --- a/src/broadcom/vulkan/v3dv_meta_copy.c +++ b/src/broadcom/vulkan/v3dv_meta_copy.c @@ -453,8 +453,9 @@ copy_image_to_buffer_tlb(struct v3dv_cmd_buffer *cmd_buffer, const uint32_t width = DIV_ROUND_UP(region->imageExtent.width, block_w); const uint32_t height = DIV_ROUND_UP(region->imageExtent.height, block_h); - v3dv_job_start_frame(job, width, height, num_layers, false, true, - 1, internal_bpp, false); + v3dv_job_start_frame(job, width, height, num_layers, false, true, 1, + internal_bpp, 4 * v3d_internal_bpp_words(internal_bpp), + false); struct v3dv_meta_framebuffer framebuffer; v3dv_X(job->device, meta_framebuffer_init)(&framebuffer, fb_format, @@ -1323,8 +1324,8 @@ copy_image_tlb(struct v3dv_cmd_buffer *cmd_buffer, const uint32_t width = DIV_ROUND_UP(region->extent.width, block_w); const uint32_t height = DIV_ROUND_UP(region->extent.height, block_h); - v3dv_job_start_frame(job, width, height, num_layers, - false, true, 1, internal_bpp, + v3dv_job_start_frame(job, width, height, num_layers, false, true, 1, + internal_bpp, 4 * v3d_internal_bpp_words(internal_bpp), src->vk.samples > VK_SAMPLE_COUNT_1_BIT); struct v3dv_meta_framebuffer framebuffer; @@ -1978,8 +1979,9 @@ copy_buffer_to_image_tlb(struct v3dv_cmd_buffer *cmd_buffer, const uint32_t width = DIV_ROUND_UP(region->imageExtent.width, block_w); const uint32_t height = DIV_ROUND_UP(region->imageExtent.height, block_h); - v3dv_job_start_frame(job, width, height, num_layers, false, true, - 1, internal_bpp, false); + v3dv_job_start_frame(job, width, height, num_layers, false, true, 1, + internal_bpp, 4 * v3d_internal_bpp_words(internal_bpp), + false); struct v3dv_meta_framebuffer framebuffer; v3dv_X(job->device, meta_framebuffer_init)(&framebuffer, fb_format, @@ -4884,8 +4886,9 @@ resolve_image_tlb(struct v3dv_cmd_buffer *cmd_buffer, (fb_format, region->srcSubresource.aspectMask, &internal_type, &internal_bpp); - v3dv_job_start_frame(job, width, height, num_layers, false, true, - 1, internal_bpp, true); + v3dv_job_start_frame(job, width, height, num_layers, false, true, 1, + internal_bpp, 4 * v3d_internal_bpp_words(internal_bpp), + true); struct v3dv_meta_framebuffer framebuffer; v3dv_X(job->device, meta_framebuffer_init)(&framebuffer, fb_format, diff --git a/src/broadcom/vulkan/v3dv_pass.c b/src/broadcom/vulkan/v3dv_pass.c index 7f2e2bbc710..0583faf6f9a 100644 --- a/src/broadcom/vulkan/v3dv_pass.c +++ b/src/broadcom/vulkan/v3dv_pass.c @@ -325,7 +325,8 @@ subpass_get_granularity(struct v3dv_device *device, const uint32_t color_count = subpass->color_count; bool msaa = false; - uint32_t max_bpp = 0; + uint32_t max_internal_bpp = 0; + uint32_t total_color_bpp = 0; for (uint32_t i = 0; i < color_count; i++) { uint32_t attachment_idx = subpass->color_attachments[i].attachment; if (attachment_idx == VK_ATTACHMENT_UNUSED) @@ -339,7 +340,8 @@ subpass_get_granularity(struct v3dv_device *device, v3dv_X(device, get_internal_type_bpp_for_output_format) (format->planes[0].rt_type, &internal_type, &internal_bpp); - max_bpp = MAX2(max_bpp, internal_bpp); + max_internal_bpp = MAX2(max_internal_bpp, internal_bpp); + total_color_bpp += 4 * v3d_internal_bpp_words(internal_bpp); if (desc->samples > VK_SAMPLE_COUNT_1_BIT) msaa = true; @@ -349,7 +351,8 @@ subpass_get_granularity(struct v3dv_device *device, * heuristics so we choose a conservative granularity here, with it disabled. */ uint32_t width, height; - v3d_choose_tile_size(&device->devinfo, color_count, max_bpp, msaa, + v3d_choose_tile_size(&device->devinfo, color_count, + max_internal_bpp, total_color_bpp, msaa, false /* double-buffer */, &width, &height); *granularity = (VkExtent2D) { .width = width, diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 300a1ec8ae1..9375cdd58c0 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -950,6 +950,7 @@ struct v3dv_frame_tiling { uint32_t layers; uint32_t render_target_count; uint32_t internal_bpp; + uint32_t total_color_bpp; bool msaa; bool double_buffer; uint32_t tile_width; @@ -1373,6 +1374,7 @@ void v3dv_job_start_frame(struct v3dv_job *job, bool allocate_tile_state_now, uint32_t render_target_count, uint8_t max_internal_bpp, + uint8_t total_color_bpp, bool msaa); bool v3dv_job_type_is_gpu(struct v3dv_job *job); diff --git a/src/broadcom/vulkan/v3dvx_device.c b/src/broadcom/vulkan/v3dvx_device.c index 4d17a2691a5..61ad98c1217 100644 --- a/src/broadcom/vulkan/v3dvx_device.c +++ b/src/broadcom/vulkan/v3dvx_device.c @@ -257,11 +257,13 @@ v3dX(framebuffer_compute_internal_bpp_msaa)( const struct v3dv_framebuffer *framebuffer, const struct v3dv_cmd_buffer_attachment_state *attachments, const struct v3dv_subpass *subpass, - uint8_t *max_bpp, + uint8_t *max_internal_bpp, + uint8_t *total_color_bpp, bool *msaa) { STATIC_ASSERT(V3D_INTERNAL_BPP_32 == 0); - *max_bpp = V3D_INTERNAL_BPP_32; + *max_internal_bpp = V3D_INTERNAL_BPP_32; + *total_color_bpp = 0; *msaa = false; if (subpass) { @@ -274,8 +276,11 @@ v3dX(framebuffer_compute_internal_bpp_msaa)( assert(att); assert(att->plane_count == 1); - if (att->vk.aspects & VK_IMAGE_ASPECT_COLOR_BIT) - *max_bpp = MAX2(*max_bpp, att->planes[0].internal_bpp); + if (att->vk.aspects & VK_IMAGE_ASPECT_COLOR_BIT) { + const uint32_t internal_bpp = att->planes[0].internal_bpp; + *max_internal_bpp = MAX2(*max_internal_bpp, internal_bpp); + *total_color_bpp += 4 * v3d_internal_bpp_words(internal_bpp); + } if (att->vk.image->samples > VK_SAMPLE_COUNT_1_BIT) *msaa = true; @@ -289,7 +294,6 @@ v3dX(framebuffer_compute_internal_bpp_msaa)( if (att->vk.image->samples > VK_SAMPLE_COUNT_1_BIT) *msaa = true; } - return; } @@ -299,8 +303,11 @@ v3dX(framebuffer_compute_internal_bpp_msaa)( assert(att); assert(att->plane_count == 1); - if (att->vk.aspects & VK_IMAGE_ASPECT_COLOR_BIT) - *max_bpp = MAX2(*max_bpp, att->planes[0].internal_bpp); + if (att->vk.aspects & VK_IMAGE_ASPECT_COLOR_BIT) { + const uint32_t internal_bpp = att->planes[0].internal_bpp; + *max_internal_bpp = MAX2(*max_internal_bpp, internal_bpp); + *total_color_bpp += 4 * v3d_internal_bpp_words(internal_bpp); + } if (att->vk.image->samples > VK_SAMPLE_COUNT_1_BIT) *msaa = true; diff --git a/src/broadcom/vulkan/v3dvx_meta_common.c b/src/broadcom/vulkan/v3dvx_meta_common.c index b8f3297bc94..858096f9e4b 100644 --- a/src/broadcom/vulkan/v3dvx_meta_common.c +++ b/src/broadcom/vulkan/v3dvx_meta_common.c @@ -1408,8 +1408,9 @@ v3dX(meta_copy_buffer)(struct v3dv_cmd_buffer *cmd_buffer, uint32_t width, height; framebuffer_size_for_pixel_count(num_items, &width, &height); - v3dv_job_start_frame(job, width, height, 1, true, true, - 1, internal_bpp, false); + v3dv_job_start_frame(job, width, height, 1, true, true, 1, + internal_bpp, 4 * v3d_internal_bpp_words(internal_bpp), + false); struct v3dv_meta_framebuffer framebuffer; v3dX(meta_framebuffer_init)(&framebuffer, vk_format, internal_type, @@ -1455,8 +1456,9 @@ v3dX(meta_fill_buffer)(struct v3dv_cmd_buffer *cmd_buffer, uint32_t width, height; framebuffer_size_for_pixel_count(num_items, &width, &height); - v3dv_job_start_frame(job, width, height, 1, true, true, - 1, internal_bpp, false); + v3dv_job_start_frame(job, width, height, 1, true, true, 1, + internal_bpp, 4 * v3d_internal_bpp_words(internal_bpp), + false); struct v3dv_meta_framebuffer framebuffer; v3dX(meta_framebuffer_init)(&framebuffer, VK_FORMAT_R8G8B8A8_UINT, diff --git a/src/broadcom/vulkan/v3dvx_private.h b/src/broadcom/vulkan/v3dvx_private.h index 81715520913..709b129926f 100644 --- a/src/broadcom/vulkan/v3dvx_private.h +++ b/src/broadcom/vulkan/v3dvx_private.h @@ -136,7 +136,9 @@ void v3dX(framebuffer_compute_internal_bpp_msaa)(const struct v3dv_framebuffer *framebuffer, const struct v3dv_cmd_buffer_attachment_state *attachments, const struct v3dv_subpass *subpass, - uint8_t *max_bpp, bool *msaa); + uint8_t *max_internal_bpp, + uint8_t *total_color_bpp, + bool *msaa); #ifdef DEBUG void diff --git a/src/broadcom/vulkan/v3dvx_queue.c b/src/broadcom/vulkan/v3dvx_queue.c index f8cee36e3bf..6eed2de9d54 100644 --- a/src/broadcom/vulkan/v3dvx_queue.c +++ b/src/broadcom/vulkan/v3dvx_queue.c @@ -29,7 +29,8 @@ void v3dX(job_emit_noop)(struct v3dv_job *job) { - v3dv_job_start_frame(job, 1, 1, 1, true, true, 1, V3D_INTERNAL_BPP_32, false); + v3dv_job_start_frame(job, 1, 1, 1, true, true, 1, + V3D_INTERNAL_BPP_32, 4, false); v3dX(job_emit_binning_flush)(job); struct v3dv_cl *rcl = &job->rcl; diff --git a/src/gallium/drivers/v3d/v3d_context.c b/src/gallium/drivers/v3d/v3d_context.c index def546e9ef5..1dc4bd017fe 100644 --- a/src/gallium/drivers/v3d/v3d_context.c +++ b/src/gallium/drivers/v3d/v3d_context.c @@ -233,11 +233,13 @@ v3d_get_tile_buffer_size(const struct v3d_device_info *devinfo, assert(!is_msaa || !double_buffer); uint32_t max_cbuf_idx = 0; + uint32_t total_bpp = 0; *max_bpp = 0; for (int i = 0; i < nr_cbufs; i++) { if (cbufs[i]) { struct v3d_surface *surf = v3d_surface(cbufs[i]); *max_bpp = MAX2(*max_bpp, surf->internal_bpp); + total_bpp += 4 * v3d_internal_bpp_words(surf->internal_bpp); max_cbuf_idx = MAX2(i, max_cbuf_idx); } } @@ -246,9 +248,11 @@ v3d_get_tile_buffer_size(const struct v3d_device_info *devinfo, struct v3d_surface *bsurf = v3d_surface(bbuf); assert(bbuf->texture->nr_samples <= 1 || is_msaa); *max_bpp = MAX2(*max_bpp, bsurf->internal_bpp); + total_bpp += 4 * v3d_internal_bpp_words(bsurf->internal_bpp); } - v3d_choose_tile_size(devinfo, max_cbuf_idx + 1, *max_bpp, + v3d_choose_tile_size(devinfo, max_cbuf_idx + 1, + *max_bpp, total_bpp, is_msaa, double_buffer, tile_width, tile_height); } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0125-v3dv-implement-depthBounds-support-for-v71.patch ================================================ From 210338b6b1b030d36acaebad504ed2bec4a2cd74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Fri, 19 Nov 2021 10:51:37 +0100 Subject: [PATCH 125/142] v3dv: implement depthBounds support for v71 Just for for v71, as that feature is not supported by older hw. --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 19 ++++++++++++--- src/broadcom/vulkan/v3dv_device.c | 2 +- src/broadcom/vulkan/v3dv_pipeline.c | 17 ++++++++------ src/broadcom/vulkan/v3dv_private.h | 12 +++++++++- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 32 ++++++++++++++++++++++++++ src/broadcom/vulkan/v3dvx_pipeline.c | 3 +++ src/broadcom/vulkan/v3dvx_private.h | 3 +++ 7 files changed, 76 insertions(+), 12 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index f65388c10ec..36bd7960985 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -2070,6 +2070,14 @@ cmd_buffer_bind_pipeline_static_state(struct v3dv_cmd_buffer *cmd_buffer, } } + if (!(dynamic_mask & V3DV_DYNAMIC_DEPTH_BOUNDS)) { + if (memcmp(&dest->depth_bounds, &src->depth_bounds, + sizeof(src->depth_bounds))) { + memcpy(&dest->depth_bounds, &src->depth_bounds, sizeof(src->depth_bounds)); + dirty |= V3DV_CMD_DIRTY_DEPTH_BOUNDS; + } + } + if (!(dynamic_mask & V3DV_DYNAMIC_LINE_WIDTH)) { if (dest->line_width != src->line_width) { dest->line_width = src->line_width; @@ -2940,6 +2948,9 @@ v3dv_cmd_buffer_emit_pre_draw(struct v3dv_cmd_buffer *cmd_buffer, if (*dirty & (V3DV_CMD_DIRTY_PIPELINE | V3DV_CMD_DIRTY_DEPTH_BIAS)) v3dv_X(device, cmd_buffer_emit_depth_bias)(cmd_buffer); + if (*dirty & V3DV_CMD_DIRTY_DEPTH_BOUNDS) + v3dv_X(device, cmd_buffer_emit_depth_bounds)(cmd_buffer); + if (*dirty & (V3DV_CMD_DIRTY_PIPELINE | V3DV_CMD_DIRTY_BLEND_CONSTANTS)) v3dv_X(device, cmd_buffer_emit_blend)(cmd_buffer); @@ -3369,9 +3380,11 @@ v3dv_CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) { - /* We do not support depth bounds testing so we just ignore this. We are - * already asserting that pipelines don't enable the feature anyway. - */ + V3DV_FROM_HANDLE(v3dv_cmd_buffer, cmd_buffer, commandBuffer); + + cmd_buffer->state.dynamic.depth_bounds.min = minDepthBounds; + cmd_buffer->state.dynamic.depth_bounds.max = maxDepthBounds; + cmd_buffer->state.dirty |= V3DV_CMD_DIRTY_DEPTH_BOUNDS; } VKAPI_ATTR void VKAPI_CALL diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 19e58542414..1de9b5ce683 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -227,7 +227,7 @@ get_features(const struct v3dv_physical_device *physical_device, .depthClamp = false, /* Only available since V3D 4.5.1.1 */ .depthBiasClamp = true, .fillModeNonSolid = true, - .depthBounds = false, /* Only available since V3D 4.3.16.2 */ + .depthBounds = physical_device->devinfo.ver >= 71, .wideLines = true, .largePoints = true, .alphaToOne = true, diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index 3bcdcc9a853..ba782b8268a 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -2608,13 +2608,8 @@ v3dv_dynamic_state_mask(VkDynamicState state) return V3DV_DYNAMIC_LINE_WIDTH; case VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT: return V3DV_DYNAMIC_COLOR_WRITE_ENABLE; - - /* Depth bounds testing is not available in in V3D 4.2 so here we are just - * ignoring this dynamic state. We are already asserting at pipeline creation - * time that depth bounds testing is not enabled. - */ case VK_DYNAMIC_STATE_DEPTH_BOUNDS: - return 0; + return V3DV_DYNAMIC_DEPTH_BOUNDS; default: unreachable("Unhandled dynamic state"); @@ -2642,6 +2637,7 @@ pipeline_init_dynamic_state( dynamic->line_width = 1.0f; dynamic->color_write_enable = (1ull << (4 * V3D_MAX_RENDER_TARGETS(devinfo->ver))) - 1; + dynamic->depth_bounds.max = 1.0f; /* Create a mask of enabled dynamic states */ uint32_t dynamic_states = 0; @@ -2694,6 +2690,11 @@ pipeline_init_dynamic_state( dynamic->stencil_reference.front = pDepthStencilState->front.reference; dynamic->stencil_reference.back = pDepthStencilState->back.reference; } + + if (!(dynamic_states & V3DV_DYNAMIC_DEPTH_BOUNDS)) { + dynamic->depth_bounds.min = pDepthStencilState->minDepthBounds; + dynamic->depth_bounds.max = pDepthStencilState->maxDepthBounds; + } } if (pColorBlendState && !(dynamic_states & V3DV_DYNAMIC_BLEND_CONSTANTS)) { @@ -2907,7 +2908,9 @@ pipeline_init(struct v3dv_pipeline *pipeline, /* V3D 4.2 doesn't support depth bounds testing so we don't advertise that * feature and it shouldn't be used by any pipeline. */ - assert(!ds_info || !ds_info->depthBoundsTestEnable); + assert(device->devinfo.ver >= 71 || + !ds_info || !ds_info->depthBoundsTestEnable); + pipeline->depth_bounds_test_enabled = ds_info && ds_info->depthBoundsTestEnable; enable_depth_bias(pipeline, rs_info); diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 9375cdd58c0..a074e0a981c 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -1045,7 +1045,8 @@ enum v3dv_dynamic_state_bits { V3DV_DYNAMIC_DEPTH_BIAS = 1 << 6, V3DV_DYNAMIC_LINE_WIDTH = 1 << 7, V3DV_DYNAMIC_COLOR_WRITE_ENABLE = 1 << 8, - V3DV_DYNAMIC_ALL = (1 << 9) - 1, + V3DV_DYNAMIC_DEPTH_BOUNDS = 1 << 9, + V3DV_DYNAMIC_ALL = (1 << 10) - 1, }; /* Flags for dirty pipeline state. @@ -1070,6 +1071,7 @@ enum v3dv_cmd_dirty_bits { V3DV_CMD_DIRTY_LINE_WIDTH = 1 << 16, V3DV_CMD_DIRTY_VIEW_INDEX = 1 << 17, V3DV_CMD_DIRTY_COLOR_WRITE_ENABLE = 1 << 18, + V3DV_CMD_DIRTY_DEPTH_BOUNDS = 1 << 19, }; struct v3dv_dynamic_state { @@ -1106,6 +1108,11 @@ struct v3dv_dynamic_state { float slope_factor; } depth_bias; + struct { + float min; + float max; + } depth_bounds; + float line_width; uint32_t color_write_enable; @@ -2333,6 +2340,9 @@ struct v3dv_pipeline { bool is_z16; } depth_bias; + /* Depth bounds */ + bool depth_bounds_test_enabled; + struct { void *mem_ctx; struct util_dynarray data; /* Array of v3dv_pipeline_executable_data */ diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index bf5e47018e8..9307a6e9d93 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -1507,6 +1507,38 @@ v3dX(cmd_buffer_emit_depth_bias)(struct v3dv_cmd_buffer *cmd_buffer) cmd_buffer->state.dirty &= ~V3DV_CMD_DIRTY_DEPTH_BIAS; } +void +v3dX(cmd_buffer_emit_depth_bounds)(struct v3dv_cmd_buffer *cmd_buffer) +{ + /* No depthBounds support for v42, so this method is empty on that case. + * + * Note that this method is being called as v3dv_job_init flag all state as + * dirty. See FIXME note at v3dv_job_init. + */ + +#if V3D_VERSION >= 71 + struct v3dv_pipeline *pipeline = cmd_buffer->state.gfx.pipeline; + assert(pipeline); + + if (!pipeline->depth_bounds_test_enabled) + return; + + struct v3dv_job *job = cmd_buffer->state.job; + assert(job); + + v3dv_cl_ensure_space_with_branch(&job->bcl, cl_packet_length(DEPTH_BOUNDS_TEST_LIMITS)); + v3dv_return_if_oom(cmd_buffer, NULL); + + struct v3dv_dynamic_state *dynamic = &cmd_buffer->state.dynamic; + cl_emit(&job->bcl, DEPTH_BOUNDS_TEST_LIMITS, bounds) { + bounds.lower_test_limit = dynamic->depth_bounds.min; + bounds.upper_test_limit = dynamic->depth_bounds.max; + } + + cmd_buffer->state.dirty &= ~V3DV_CMD_DIRTY_DEPTH_BOUNDS; +#endif +} + void v3dX(cmd_buffer_emit_line_width)(struct v3dv_cmd_buffer *cmd_buffer) { diff --git a/src/broadcom/vulkan/v3dvx_pipeline.c b/src/broadcom/vulkan/v3dvx_pipeline.c index 7b1133f8173..83ab2f19e4f 100644 --- a/src/broadcom/vulkan/v3dvx_pipeline.c +++ b/src/broadcom/vulkan/v3dvx_pipeline.c @@ -259,6 +259,9 @@ pack_cfg_bits(struct v3dv_pipeline *pipeline, } else { config.z_clipping_mode = V3D_Z_CLIP_MODE_NONE; } + + config.depth_bounds_test_enable = + ds_info && ds_info->depthBoundsTestEnable && has_ds_attachment; #endif }; } diff --git a/src/broadcom/vulkan/v3dvx_private.h b/src/broadcom/vulkan/v3dvx_private.h index 709b129926f..1ce4789c5ac 100644 --- a/src/broadcom/vulkan/v3dvx_private.h +++ b/src/broadcom/vulkan/v3dvx_private.h @@ -54,6 +54,9 @@ v3dX(cmd_buffer_emit_stencil)(struct v3dv_cmd_buffer *cmd_buffer); void v3dX(cmd_buffer_emit_depth_bias)(struct v3dv_cmd_buffer *cmd_buffer); +void +v3dX(cmd_buffer_emit_depth_bounds)(struct v3dv_cmd_buffer *cmd_buffer); + void v3dX(cmd_buffer_emit_line_width)(struct v3dv_cmd_buffer *cmd_buffer); -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0126-v3d-v3dv-propagate-NaNs-bits-in-shader-state-records.patch ================================================ From be6508ffef8c0e9fbc47175739db80a3eeff2cdb Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Fri, 3 Dec 2021 13:20:22 +0100 Subject: [PATCH 126/142] v3d,v3dv: propagate NaNs bits in shader state records are reserved in v7.x --- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 4 ++++ src/broadcom/vulkan/v3dvx_pipeline.c | 10 +++++----- src/gallium/drivers/v3d/v3dx_draw.c | 14 +++++++++----- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index 9307a6e9d93..580aeb8ba2b 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -2175,7 +2175,9 @@ emit_gs_shader_state_record(struct v3dv_job *job, gs_bin->prog_data.gs->base.threads == 4; shader.geometry_bin_mode_shader_start_in_final_thread_section = gs_bin->prog_data.gs->base.single_seg; +#if V3D_VERSION <= 42 shader.geometry_bin_mode_shader_propagate_nans = true; +#endif shader.geometry_bin_mode_shader_uniforms_address = gs_bin_uniforms; @@ -2185,7 +2187,9 @@ emit_gs_shader_state_record(struct v3dv_job *job, gs->prog_data.gs->base.threads == 4; shader.geometry_render_mode_shader_start_in_final_thread_section = gs->prog_data.gs->base.single_seg; +#if V3D_VERSION <= 42 shader.geometry_render_mode_shader_propagate_nans = true; +#endif shader.geometry_render_mode_shader_uniforms_address = gs_render_uniforms; } diff --git a/src/broadcom/vulkan/v3dvx_pipeline.c b/src/broadcom/vulkan/v3dvx_pipeline.c index 83ab2f19e4f..c9b537f4b32 100644 --- a/src/broadcom/vulkan/v3dvx_pipeline.c +++ b/src/broadcom/vulkan/v3dvx_pipeline.c @@ -471,19 +471,19 @@ pack_shader_state_record(struct v3dv_pipeline *pipeline) shader.number_of_varyings_in_fragment_shader = prog_data_fs->num_inputs; - shader.coordinate_shader_propagate_nans = true; - shader.vertex_shader_propagate_nans = true; - shader.fragment_shader_propagate_nans = true; - /* Note: see previous note about addresses */ /* shader.coordinate_shader_code_address */ /* shader.vertex_shader_code_address */ /* shader.fragment_shader_code_address */ +#if V3D_VERSION == 42 + shader.coordinate_shader_propagate_nans = true; + shader.vertex_shader_propagate_nans = true; + shader.fragment_shader_propagate_nans = true; + /* FIXME: Use combined input/output size flag in the common case (also * on v3d, see v3dx_draw). */ -#if V3D_VERSION == 42 shader.coordinate_shader_has_separate_input_and_output_vpm_blocks = prog_data_vs_bin->separate_segments; shader.vertex_shader_has_separate_input_and_output_vpm_blocks = diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c index 04cc3bc3ae1..e4b414b0676 100644 --- a/src/gallium/drivers/v3d/v3dx_draw.c +++ b/src/gallium/drivers/v3d/v3dx_draw.c @@ -396,7 +396,9 @@ v3d_emit_gs_state_record(struct v3d_job *job, gs_bin->prog_data.gs->base.threads == 4; shader.geometry_bin_mode_shader_start_in_final_thread_section = gs_bin->prog_data.gs->base.single_seg; +#if V3D_VERSION <= 42 shader.geometry_bin_mode_shader_propagate_nans = true; +#endif shader.geometry_bin_mode_shader_uniforms_address = gs_bin_uniforms; @@ -406,7 +408,9 @@ v3d_emit_gs_state_record(struct v3d_job *job, gs->prog_data.gs->base.threads == 4; shader.geometry_render_mode_shader_start_in_final_thread_section = gs->prog_data.gs->base.single_seg; +#if V3D_VERSION <= 42 shader.geometry_render_mode_shader_propagate_nans = true; +#endif shader.geometry_render_mode_shader_uniforms_address = gs_render_uniforms; } @@ -657,10 +661,6 @@ v3d_emit_gl_shader_state(struct v3d_context *v3d, shader.number_of_varyings_in_fragment_shader = v3d->prog.fs->prog_data.fs->num_inputs; - shader.coordinate_shader_propagate_nans = true; - shader.vertex_shader_propagate_nans = true; - shader.fragment_shader_propagate_nans = true; - shader.coordinate_shader_code_address = cl_address(v3d_resource(v3d->prog.cs->resource)->bo, v3d->prog.cs->offset); @@ -671,10 +671,14 @@ v3d_emit_gl_shader_state(struct v3d_context *v3d, cl_address(v3d_resource(v3d->prog.fs->resource)->bo, v3d->prog.fs->offset); +#if V3D_VERSION <= 42 + shader.coordinate_shader_propagate_nans = true; + shader.vertex_shader_propagate_nans = true; + shader.fragment_shader_propagate_nans = true; + /* XXX: Use combined input/output size flag in the common * case. */ -#if V3D_VERSION <= 42 shader.coordinate_shader_has_separate_input_and_output_vpm_blocks = v3d->prog.cs->prog_data.vs->separate_segments; shader.vertex_shader_has_separate_input_and_output_vpm_blocks = -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0127-v3dv-use-new-texture-shader-state-rb_swap-and-revers.patch ================================================ From c74ba2b39e7b9fe6c5415c20c98cd231d2674df6 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Tue, 16 May 2023 00:38:40 +0200 Subject: [PATCH 127/142] v3dv: use new texture shader state rb_swap and reverse fields in v3d 7.x In v3d 4.x we handle formats that are reversed or R/B swapped by applying a format swizzle. This doesn't work on border colors though, and for that there is a specific bit to reverse the border color in the texture shader state. In v3d 7.x we have new reverse and swap R/B bits and we no longer have a bit to reverse the border color because the new reverse bit applies to border texels too. Because of this, we absolutely need to use these new bits in order to get correct border colors in all cases with these formats. When we enable the reverse and/or swap R/B bits, we are effectively applying the format swizzle through them, so in these cases we need to make sure the swizzle we program in the texture shader state is the view swizzle provided by the API and not the composition of the format swizzle with the view swizzle like we do in 4.x for all formats. The same applies to custom border colors: we must not apply the format swizzle to them for formats that are reversed or R/B swapped, because again, this format swizzle is already applied through these new bits. While we are doing this, we also fully adopt the texture shader state spec from v3d 7.1.5 for v3d 7.x instead of using a description from 7.1.2 which is incompatible and required the driver to manually pack some of the bits. --- src/broadcom/vulkan/v3dv_device.c | 2 +- src/broadcom/vulkan/v3dv_image.c | 7 ++-- src/broadcom/vulkan/v3dv_private.h | 13 ++++++- src/broadcom/vulkan/v3dvx_device.c | 24 ++++++++++-- src/broadcom/vulkan/v3dvx_image.c | 56 ++++++++++++++++++---------- src/broadcom/vulkan/v3dvx_private.h | 3 +- src/gallium/drivers/v3d/v3dx_state.c | 6 --- 7 files changed, 75 insertions(+), 36 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 1de9b5ce683..b520bfa0002 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -2989,7 +2989,7 @@ v3dv_CreateSampler(VkDevice _device, } } - v3dv_X(device, pack_sampler_state)(sampler, pCreateInfo, bc_info); + v3dv_X(device, pack_sampler_state)(device, sampler, pCreateInfo, bc_info); *pSampler = v3dv_sampler_to_handle(sampler); diff --git a/src/broadcom/vulkan/v3dv_image.c b/src/broadcom/vulkan/v3dv_image.c index ebbd60e4c03..e01e2e1bd19 100644 --- a/src/broadcom/vulkan/v3dv_image.c +++ b/src/broadcom/vulkan/v3dv_image.c @@ -671,7 +671,6 @@ create_image_view(struct v3dv_device *device, * makes sense to implement swizzle composition using VkSwizzle directly. */ VkFormat format; - uint8_t image_view_swizzle[4]; if (pCreateInfo->format == VK_FORMAT_D24_UNORM_S8_UINT && range->aspectMask == VK_IMAGE_ASPECT_STENCIL_BIT) { format = VK_FORMAT_R8G8B8A8_UINT; @@ -682,11 +681,11 @@ create_image_view(struct v3dv_device *device, vk_component_mapping_to_pipe_swizzle(iview->vk.swizzle, view_swizzle); util_format_compose_swizzles(stencil_aspect_swizzle, view_swizzle, - image_view_swizzle); + iview->view_swizzle); } else { format = pCreateInfo->format; vk_component_mapping_to_pipe_swizzle(iview->vk.swizzle, - image_view_swizzle); + iview->view_swizzle); } iview->vk.view_format = format; @@ -711,7 +710,7 @@ create_image_view(struct v3dv_device *device, const uint8_t *format_swizzle = v3dv_get_format_swizzle(device, format, plane); - util_format_compose_swizzles(format_swizzle, image_view_swizzle, + util_format_compose_swizzles(format_swizzle, iview->view_swizzle, iview->planes[plane].swizzle); iview->planes[plane].swap_rb = v3dv_format_swizzle_needs_rb_swap(format_swizzle); diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index a074e0a981c..8adb8873efd 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -776,6 +776,8 @@ struct v3dv_image_view { const struct v3dv_format *format; + uint8_t view_swizzle[4]; + uint8_t plane_count; struct { uint8_t image_plane; @@ -786,8 +788,8 @@ struct v3dv_image_view { uint32_t internal_type; uint32_t offset; - /* Precomputed (composed from createinfo->components and formar swizzle) - * swizzles to pass in to the shader key. + /* Precomputed swizzle (composed from the view swizzle and the format + * swizzle). * * This could be also included on the descriptor bo, but the shader state * packet doesn't need it on a bo, so we can just avoid a memory copy @@ -2358,6 +2360,13 @@ struct v3dv_pipeline { uint8_t stencil_cfg[2][V3DV_STENCIL_CFG_LENGTH]; }; +static inline bool +v3dv_texture_shader_state_has_rb_swap_reverse_bits(const struct v3dv_device *device) +{ + return device->devinfo.ver > 71 || + (device->devinfo.ver == 71 && device->devinfo.rev >= 5); +} + static inline VkPipelineBindPoint v3dv_pipeline_get_binding_point(struct v3dv_pipeline *pipeline) { diff --git a/src/broadcom/vulkan/v3dvx_device.c b/src/broadcom/vulkan/v3dvx_device.c index 61ad98c1217..1b50d51e19f 100644 --- a/src/broadcom/vulkan/v3dvx_device.c +++ b/src/broadcom/vulkan/v3dvx_device.c @@ -50,6 +50,7 @@ vk_to_v3d_compare_func[] = { }; static union pipe_color_union encode_border_color( + const struct v3dv_device *device, const VkSamplerCustomBorderColorCreateInfoEXT *bc_info) { const struct util_format_description *desc = @@ -76,12 +77,28 @@ static union pipe_color_union encode_border_color( * colors so we need to fix up the swizzle manually for this case. */ uint8_t swizzle[4]; - if (v3dv_format_swizzle_needs_reverse(format->planes[0].swizzle) && + const bool v3d_has_reverse_swap_rb_bits = + v3dv_texture_shader_state_has_rb_swap_reverse_bits(device); + if (!v3d_has_reverse_swap_rb_bits && + v3dv_format_swizzle_needs_reverse(format->planes[0].swizzle) && v3dv_format_swizzle_needs_rb_swap(format->planes[0].swizzle)) { swizzle[0] = PIPE_SWIZZLE_W; swizzle[1] = PIPE_SWIZZLE_X; swizzle[2] = PIPE_SWIZZLE_Y; swizzle[3] = PIPE_SWIZZLE_Z; + } + /* In v3d 7.x we no longer have a reverse flag for the border color. Instead + * we have to use the new reverse and swap_r/b flags in the texture shader + * state which will apply the format swizzle automatically when sampling + * the border color too and we should not apply it manually here. + */ + else if (v3d_has_reverse_swap_rb_bits && + (v3dv_format_swizzle_needs_rb_swap(format->planes[0].swizzle) || + v3dv_format_swizzle_needs_reverse(format->planes[0].swizzle))) { + swizzle[0] = PIPE_SWIZZLE_X; + swizzle[1] = PIPE_SWIZZLE_Y; + swizzle[2] = PIPE_SWIZZLE_Z; + swizzle[3] = PIPE_SWIZZLE_W; } else { memcpy(swizzle, format->planes[0].swizzle, sizeof (swizzle)); } @@ -179,7 +196,8 @@ static union pipe_color_union encode_border_color( } void -v3dX(pack_sampler_state)(struct v3dv_sampler *sampler, +v3dX(pack_sampler_state)(const struct v3dv_device *device, + struct v3dv_sampler *sampler, const VkSamplerCreateInfo *pCreateInfo, const VkSamplerCustomBorderColorCreateInfoEXT *bc_info) { @@ -221,7 +239,7 @@ v3dX(pack_sampler_state)(struct v3dv_sampler *sampler, s.border_color_mode = border_color_mode; if (s.border_color_mode == V3D_BORDER_COLOR_FOLLOWS) { - union pipe_color_union border = encode_border_color(bc_info); + union pipe_color_union border = encode_border_color(device, bc_info); s.border_color_word_0 = border.ui[0]; s.border_color_word_1 = border.ui[1]; diff --git a/src/broadcom/vulkan/v3dvx_image.c b/src/broadcom/vulkan/v3dvx_image.c index ae6eaa88d0c..de984e81220 100644 --- a/src/broadcom/vulkan/v3dvx_image.c +++ b/src/broadcom/vulkan/v3dvx_image.c @@ -108,25 +108,6 @@ pack_texture_shader_state_helper(struct v3dv_device *device, tex.array_stride_64_byte_aligned = image->planes[iplane].cube_map_stride / 64; - bool is_srgb = vk_format_is_srgb(image_view->vk.format); -#if V3D_VERSION == 42 - tex.reverse_standard_border_color = image_view->planes[plane].channel_reverse; -#endif - -#if V3D_VERSION == 42 - tex.srgb = is_srgb; -#endif -#if V3D_VERSION >= 71 - tex.transfer_func = is_srgb ? TRANSFER_FUNC_SRGB : TRANSFER_FUNC_NONE; - - /* V3D 7.1.5 has array stride starting one bit later than previous - * V3D versions to make room for the new RB swap bit, but we don't - * handle that in the CLE parser. - */ - if (device->devinfo.rev >= 5) - tex.array_stride_64_byte_aligned <<= 1; -#endif - /* At this point we don't have the job. That's the reason the first * parameter is NULL, to avoid a crash when cl_pack_emit_reloc tries to * add the bo to the job. This also means that we need to add manually @@ -138,7 +119,44 @@ pack_texture_shader_state_helper(struct v3dv_device *device, iplane); tex.texture_base_pointer = v3dv_cl_address(NULL, base_offset); + bool is_srgb = vk_format_is_srgb(image_view->vk.format); + + /* V3D 4.x doesn't have the reverse and swap_r/b bits, so we compose + * the reverse and/or swap_r/b swizzle from the format table with the + * image view swizzle. This, however, doesn't work for border colors, + * for that there is the reverse_standard_border_color. + * + * In v3d 7.x, however, there is no reverse_standard_border_color bit, + * since the reverse and swap_r/b bits also affect border colors. It is + * because of this that we absolutely need to use these bits with + * reversed and swpaped formats, since that's the only way to ensure + * correct border colors. In that case we don't want to program the + * swizzle to the composition of the format swizzle and the view + * swizzle like we do in v3d 4.x, since the format swizzle is applied + * via the reverse and swap_r/b bits. + */ +#if V3D_VERSION == 42 + tex.srgb = is_srgb; + tex.reverse_standard_border_color = + image_view->planes[plane].channel_reverse; +#endif #if V3D_VERSION >= 71 + tex.transfer_func = is_srgb ? TRANSFER_FUNC_SRGB : TRANSFER_FUNC_NONE; + + tex.reverse = image_view->planes[plane].channel_reverse; + tex.r_b_swap = image_view->planes[plane].swap_rb; + + if (tex.reverse || tex.r_b_swap) { + tex.swizzle_r = + v3d_translate_pipe_swizzle(image_view->view_swizzle[0]); + tex.swizzle_g = + v3d_translate_pipe_swizzle(image_view->view_swizzle[1]); + tex.swizzle_b = + v3d_translate_pipe_swizzle(image_view->view_swizzle[2]); + tex.swizzle_a = + v3d_translate_pipe_swizzle(image_view->view_swizzle[3]); + } + tex.chroma_offset_x = 1; tex.chroma_offset_y = 1; /* See comment in XML field definition for rationale of the shifts */ diff --git a/src/broadcom/vulkan/v3dvx_private.h b/src/broadcom/vulkan/v3dvx_private.h index 1ce4789c5ac..27d6736c0e3 100644 --- a/src/broadcom/vulkan/v3dvx_private.h +++ b/src/broadcom/vulkan/v3dvx_private.h @@ -131,7 +131,8 @@ v3dX(get_hw_clear_color)(const VkClearColorValue *color, /* Used at v3dv_device */ void -v3dX(pack_sampler_state)(struct v3dv_sampler *sampler, +v3dX(pack_sampler_state)(const struct v3dv_device *device, + struct v3dv_sampler *sampler, const VkSamplerCreateInfo *pCreateInfo, const VkSamplerCustomBorderColorCreateInfoEXT *bc_info); diff --git a/src/gallium/drivers/v3d/v3dx_state.c b/src/gallium/drivers/v3d/v3dx_state.c index 970a082aa85..8cca1a5030b 100644 --- a/src/gallium/drivers/v3d/v3dx_state.c +++ b/src/gallium/drivers/v3d/v3dx_state.c @@ -960,12 +960,6 @@ v3d_setup_texture_shader_state(const struct v3d_device_info *devinfo, /* See comment in XML field definition for rationale of the shifts */ tex->texture_base_pointer_cb = base_offset >> 6; tex->texture_base_pointer_cr = base_offset >> 6; - - /* V3D 7.1.5 has array stride start at bit 33 instead of bit 32 to - * make room for the RB swap bit. - */ - if (devinfo->rev >= 5) - tex->array_stride_64_byte_aligned <<= 1; #endif /* Since other platform devices may produce UIF images even -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0128-v3dv-fix-color-write-mask-for-v3d-7.x.patch ================================================ From ef1159ad68e4969992a61b1fcdf9103409f689ca Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 8 Feb 2023 08:41:12 +0100 Subject: [PATCH 128/142] v3dv: fix color write mask for v3d 7.x --- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index 580aeb8ba2b..6827c829934 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -1627,9 +1627,15 @@ v3dX(cmd_buffer_emit_color_write_mask)(struct v3dv_cmd_buffer *cmd_buffer) struct v3dv_pipeline *pipeline = cmd_buffer->state.gfx.pipeline; struct v3dv_dynamic_state *dynamic = &cmd_buffer->state.dynamic; + uint32_t color_write_mask = ~dynamic->color_write_enable | + pipeline->blend.color_write_masks; +#if V3D_VERSION <= 42 + /* Only 4 RTs */ + color_write_mask &= 0xffff; +#endif + cl_emit(&job->bcl, COLOR_WRITE_MASKS, mask) { - mask.mask = (~dynamic->color_write_enable | - pipeline->blend.color_write_masks) & 0xffff; + mask.mask = color_write_mask; } cmd_buffer->state.dirty &= ~V3DV_CMD_DIRTY_COLOR_WRITE_ENABLE; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0129-v3d-v3dv-fix-depth-bias-for-v3d-7.x.patch ================================================ From aee0180b79a6a546d1e7263d89ef868016082687 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 8 Feb 2023 09:04:02 +0100 Subject: [PATCH 129/142] v3d,v3dv: fix depth bias for v3d 7.x In v3d 7.x we don't need to scale up depth bias for D16 buffers. --- src/broadcom/vulkan/v3dvx_cmd_buffer.c | 2 ++ src/gallium/drivers/v3d/v3dx_emit.c | 3 ++- src/gallium/drivers/v3d/v3dx_state.c | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index 6827c829934..1bd634f5027 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -1499,8 +1499,10 @@ v3dX(cmd_buffer_emit_depth_bias)(struct v3dv_cmd_buffer *cmd_buffer) cl_emit(&job->bcl, DEPTH_OFFSET, bias) { bias.depth_offset_factor = dynamic->depth_bias.slope_factor; bias.depth_offset_units = dynamic->depth_bias.constant_factor; +#if V3D_VERSION <= 42 if (pipeline->depth_bias.is_z16) bias.depth_offset_units *= 256.0f; +#endif bias.limit = dynamic->depth_bias.depth_bias_clamp; } diff --git a/src/gallium/drivers/v3d/v3dx_emit.c b/src/gallium/drivers/v3d/v3dx_emit.c index 87e75281dc9..82a45e44f82 100644 --- a/src/gallium/drivers/v3d/v3dx_emit.c +++ b/src/gallium/drivers/v3d/v3dx_emit.c @@ -558,7 +558,8 @@ v3dX(emit_state)(struct pipe_context *pctx) if (v3d->dirty & V3D_DIRTY_RASTERIZER && v3d->rasterizer->base.offset_tri) { - if (job->zsbuf && + if (v3d->screen->devinfo.ver <= 42 && + job->zsbuf && job->zsbuf->format == PIPE_FORMAT_Z16_UNORM) { cl_emit_prepacked_sized(&job->bcl, v3d->rasterizer->depth_offset_z16, diff --git a/src/gallium/drivers/v3d/v3dx_state.c b/src/gallium/drivers/v3d/v3dx_state.c index 8cca1a5030b..a7fad572a2d 100644 --- a/src/gallium/drivers/v3d/v3dx_state.c +++ b/src/gallium/drivers/v3d/v3dx_state.c @@ -111,9 +111,10 @@ v3d_create_rasterizer_state(struct pipe_context *pctx, #endif } - /* The HW treats polygon offset units based on a Z24 buffer, so we + /* V3d 4.x treats polygon offset units based on a Z24 buffer, so we * need to scale up offset_units if we're only Z16. */ +#if V3D_VERSION <= 42 v3dx_pack(&so->depth_offset_z16, DEPTH_OFFSET, depth) { depth.depth_offset_factor = cso->offset_scale; depth.depth_offset_units = cso->offset_units * 256.0; @@ -121,6 +122,7 @@ v3d_create_rasterizer_state(struct pipe_context *pctx, depth.limit = cso->offset_clamp; #endif } +#endif return so; } -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0130-v3d-v3dv-fix-compute-for-V3D-7.1.6.patch ================================================ From 221d4079c616752b249cefb352268fce5758b578 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Thu, 9 Mar 2023 19:05:19 +0100 Subject: [PATCH 130/142] v3d,v3dv: fix compute for V3D 7.1.6+ --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 25 +++++++++++++++++++++---- src/broadcom/vulkan/v3dv_private.h | 3 ++- src/broadcom/vulkan/v3dv_queue.c | 2 +- src/gallium/drivers/v3d/v3dx_draw.c | 14 +++++++++++--- 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 36bd7960985..609c7acfa8f 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -3816,6 +3816,7 @@ cmd_buffer_emit_pre_dispatch(struct v3dv_cmd_buffer *cmd_buffer) void v3dv_cmd_buffer_rewrite_indirect_csd_job( + struct v3dv_device *device, struct v3dv_csd_indirect_cpu_job_info *info, const uint32_t *wg_counts) { @@ -3835,8 +3836,15 @@ v3dv_cmd_buffer_rewrite_indirect_csd_job( submit->cfg[1] = wg_counts[1] << V3D_CSD_CFG012_WG_COUNT_SHIFT; submit->cfg[2] = wg_counts[2] << V3D_CSD_CFG012_WG_COUNT_SHIFT; - submit->cfg[4] = DIV_ROUND_UP(info->wg_size, 16) * - (wg_counts[0] * wg_counts[1] * wg_counts[2]) - 1; + uint32_t num_batches = DIV_ROUND_UP(info->wg_size, 16) * + (wg_counts[0] * wg_counts[1] * wg_counts[2]); + /* V3D 7.1.6 and later don't subtract 1 from the number of batches */ + if (device->devinfo.ver < 71 || + (device->devinfo.ver == 71 && device->devinfo.rev < 6)) { + submit->cfg[4] = num_batches - 1; + } else { + submit->cfg[4] = num_batches; + } assert(submit->cfg[4] != ~0); if (info->needs_wg_uniform_rewrite) { @@ -3869,6 +3877,7 @@ cmd_buffer_create_csd_job(struct v3dv_cmd_buffer *cmd_buffer, uint32_t **wg_uniform_offsets_out, uint32_t *wg_size_out) { + struct v3dv_device *device = cmd_buffer->device; struct v3dv_pipeline *pipeline = cmd_buffer->state.compute.pipeline; assert(pipeline && pipeline->shared_data->variants[BROADCOM_SHADER_COMPUTE]); struct v3dv_shader_variant *cs_variant = @@ -3927,18 +3936,26 @@ cmd_buffer_create_csd_job(struct v3dv_cmd_buffer *cmd_buffer, if (wg_size_out) *wg_size_out = wg_size; - submit->cfg[4] = num_batches - 1; + /* V3D 7.1.6 and later don't subtract 1 from the number of batches */ + if (device->devinfo.ver < 71 || + (device->devinfo.ver == 71 && device->devinfo.rev < 6)) { + submit->cfg[4] = num_batches - 1; + } else { + submit->cfg[4] = num_batches; + } assert(submit->cfg[4] != ~0); assert(pipeline->shared_data->assembly_bo); struct v3dv_bo *cs_assembly_bo = pipeline->shared_data->assembly_bo; submit->cfg[5] = cs_assembly_bo->offset + cs_variant->assembly_offset; - submit->cfg[5] |= V3D_CSD_CFG5_PROPAGATE_NANS; if (cs_variant->prog_data.base->single_seg) submit->cfg[5] |= V3D_CSD_CFG5_SINGLE_SEG; if (cs_variant->prog_data.base->threads == 4) submit->cfg[5] |= V3D_CSD_CFG5_THREADING; + /* V3D 7.x has made the PROPAGATE_NANS bit in CFG5 reserved */ + if (device->devinfo.ver < 71) + submit->cfg[5] |= V3D_CSD_CFG5_PROPAGATE_NANS; if (cs_variant->prog_data.cs->shared_size > 0) { job->csd.shared_memory = diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 8adb8873efd..2f3ef185126 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -1818,7 +1818,8 @@ void v3dv_cmd_buffer_copy_query_results(struct v3dv_cmd_buffer *cmd_buffer, void v3dv_cmd_buffer_add_tfu_job(struct v3dv_cmd_buffer *cmd_buffer, struct drm_v3d_submit_tfu *tfu); -void v3dv_cmd_buffer_rewrite_indirect_csd_job(struct v3dv_csd_indirect_cpu_job_info *info, +void v3dv_cmd_buffer_rewrite_indirect_csd_job(struct v3dv_device *device, + struct v3dv_csd_indirect_cpu_job_info *info, const uint32_t *wg_counts); void v3dv_cmd_buffer_add_private_obj(struct v3dv_cmd_buffer *cmd_buffer, diff --git a/src/broadcom/vulkan/v3dv_queue.c b/src/broadcom/vulkan/v3dv_queue.c index b4aae195180..429d14a9196 100644 --- a/src/broadcom/vulkan/v3dv_queue.c +++ b/src/broadcom/vulkan/v3dv_queue.c @@ -408,7 +408,7 @@ handle_csd_indirect_cpu_job(struct v3dv_queue *queue, if (memcmp(group_counts, info->csd_job->csd.wg_count, sizeof(info->csd_job->csd.wg_count)) != 0) { - v3dv_cmd_buffer_rewrite_indirect_csd_job(info, group_counts); + v3dv_cmd_buffer_rewrite_indirect_csd_job(queue->device, info, group_counts); } return VK_SUCCESS; diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c index e4b414b0676..4e1af41d50e 100644 --- a/src/gallium/drivers/v3d/v3dx_draw.c +++ b/src/gallium/drivers/v3d/v3dx_draw.c @@ -1473,8 +1473,15 @@ v3d_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info) submit.cfg[3] |= (wg_size & 0xff) << V3D_CSD_CFG3_WG_SIZE_SHIFT; - /* Number of batches the dispatch will invoke (minus 1). */ - submit.cfg[4] = num_batches - 1; + /* Number of batches the dispatch will invoke. + * V3D 7.1.6 and later don't subtract 1 from the number of batches + */ + if (v3d->screen->devinfo.ver < 71 || + (v3d->screen->devinfo.ver == 71 && v3d->screen->devinfo.rev < 6)) { + submit.cfg[4] = num_batches - 1; + } else { + submit.cfg[4] = num_batches; + } /* Make sure we didn't accidentally underflow. */ assert(submit.cfg[4] != ~0); @@ -1482,7 +1489,8 @@ v3d_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info) v3d_job_add_bo(job, v3d_resource(v3d->prog.compute->resource)->bo); submit.cfg[5] = (v3d_resource(v3d->prog.compute->resource)->bo->offset + v3d->prog.compute->offset); - submit.cfg[5] |= V3D_CSD_CFG5_PROPAGATE_NANS; + if (v3d->screen->devinfo.ver < 71) + submit.cfg[5] |= V3D_CSD_CFG5_PROPAGATE_NANS; if (v3d->prog.compute->prog_data.base->single_seg) submit.cfg[5] |= V3D_CSD_CFG5_SINGLE_SEG; if (v3d->prog.compute->prog_data.base->threads == 4) -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0131-broadcom-add-performance-counters-for-V3D-7.x.patch ================================================ From be6c7ba62dbdb9c5babd33a518a042dd554679d7 Mon Sep 17 00:00:00 2001 From: "Juan A. Suarez Romero" <jasuarez@igalia.com> Date: Wed, 22 Feb 2023 09:43:40 +0100 Subject: [PATCH 131/142] broadcom: add performance counters for V3D 7.x Some of the counters need to be defined correctly. v2: Remove references to extended performance counters. The hw does not support them. Signed-off-by: Juan A. Suarez Romero <jasuarez@igalia.com> --- .../common/v3d_performance_counters.h | 108 ++++++++++++++++++ src/broadcom/simulator/v3d_simulator.c | 8 +- src/broadcom/simulator/v3dx_simulator.c | 2 +- src/broadcom/vulkan/meson.build | 1 + src/broadcom/vulkan/v3dv_private.h | 7 +- src/broadcom/vulkan/v3dv_query.c | 43 +------ src/broadcom/vulkan/v3dvx_private.h | 6 + src/broadcom/vulkan/v3dvx_query.c | 67 +++++++++++ src/gallium/drivers/v3d/meson.build | 2 +- src/gallium/drivers/v3d/v3d_query.c | 20 +++- src/gallium/drivers/v3d/v3d_query.h | 6 - src/gallium/drivers/v3d/v3dx_context.h | 10 ++ ...d_query_perfcnt.c => v3dx_query_perfcnt.c} | 12 +- 13 files changed, 233 insertions(+), 59 deletions(-) create mode 100644 src/broadcom/vulkan/v3dvx_query.c rename src/gallium/drivers/v3d/{v3d_query_perfcnt.c => v3dx_query_perfcnt.c} (94%) diff --git a/src/broadcom/common/v3d_performance_counters.h b/src/broadcom/common/v3d_performance_counters.h index 08d750c2cbe..a8f0cff8784 100644 --- a/src/broadcom/common/v3d_performance_counters.h +++ b/src/broadcom/common/v3d_performance_counters.h @@ -28,6 +28,110 @@ #define V3D_PERFCNT_NAME 1 #define V3D_PERFCNT_DESCRIPTION 2 +#ifndef V3D_VERSION +# error "The V3D_VERSION macro must be defined" +#endif + +#if (V3D_VERSION >= 71) + +static const char *v3d_performance_counters[][3] = { + {"CORE", "cycle-count", "[CORE] Cycle counter"}, + {"CORE", "core-active", "[CORE] Bin/Render/Compute active cycles"}, + {"CLE", "CLE-bin-thread-active-cycles", "[CLE] Bin thread active cycles"}, + {"CLE", "CLE-render-thread-active-cycles", "[CLE] Render thread active cycles"}, + {"CORE", "compute-active-cycles", "[CORE] Compute active cycles"}, + {"FEP", "FEP-valid-primitives-no-rendered-pixels", "[FEP] Valid primitives that result in no rendered pixels, for all rendered tiles"}, + {"FEP", "FEP-valid-primitives-rendered-pixels", "[FEP] Valid primitives for all rendered tiles (primitives may be counted in more than one tile)"}, + {"FEP", "FEP-clipped-quads", "[FEP] Early-Z/Near/Far clipped quads"}, + {"FEP", "FEP-valid-quads", "[FEP] Valid quads"}, + {"TLB", "TLB-quads-not-passing-stencil-test", "[TLB] Quads with no pixels passing the stencil test"}, + {"TLB", "TLB-quads-not-passing-z-and-stencil-test", "[TLB] Quads with no pixels passing the Z and stencil tests"}, + {"TLB", "TLB-quads-passing-z-and-stencil-test", "[TLB] Quads with any pixels passing the Z and stencil tests"}, + {"TLB", "TLB-quads-written-to-color-buffer", "[TLB] Quads with valid pixels written to colour buffer"}, + {"TLB", "TLB-partial-quads-written-to-color-buffer", "[TLB] Partial quads written to the colour buffer"}, + {"PTB", "PTB-primitives-need-clipping", "[PTB] Primitives that need clipping"}, + {"PTB", "PTB-primitives-discarded-outside-viewport", "[PTB] Primitives discarded by being outside the viewport"}, + {"PTB", "PTB-primitives-binned", "[PTB] Total primitives binned"}, + {"PTB", "PTB-primitives-discarded-reversed", "[PTB] Primitives that are discarded because they are reversed"}, + {"QPU", "QPU-total-instr-cache-hit", "[QPU] Total instruction cache hits for all slices"}, + {"QPU", "QPU-total-instr-cache-miss", "[QPU] Total instruction cache misses for all slices"}, + {"QPU", "QPU-total-uniform-cache-hit", "[QPU] Total uniforms cache hits for all slices"}, + {"QPU", "QPU-total-uniform-cache-miss", "[QPU] Total uniforms cache misses for all slices"}, + {"TMU", "TMU-active-cycles", "[TMU] Active cycles"}, + {"TMU", "TMU-stalled-cycles", "[TMU] Stalled cycles"}, + {"TMU", "TMU-total-text-quads-access", "[TMU] Total texture cache accesses"}, + {"TMU", "TMU-cache-x4-active-cycles", "[TMU] Cache active cycles for x4 access"}, + {"TMU", "TMU-cache-x4-stalled-cycles", "[TMU] Cache stalled cycles for x4 access"}, + {"TMU", "TMU-total-text-quads-x4-access", "[TMU] Total texture cache x4 access"}, + {"L2T", "L2T-total-cache-hit", "[L2T] Total Level 2 cache hits"}, + {"L2T", "L2T-total-cache-miss", "[L2T] Total Level 2 cache misses"}, + {"L2T", "L2T-local", "[L2T] Local mode access"}, + {"L2T", "L2T-writeback", "[L2T] Writeback"}, + {"L2T", "L2T-zero", "[L2T] Zero"}, + {"L2T", "L2T-merge", "[L2T] Merge"}, + {"L2T", "L2T-fill", "[L2T] Fill"}, + {"L2T", "L2T-stalls-no-wid", "[L2T] Stalls because no WID available"}, + {"L2T", "L2T-stalls-no-rid", "[L2T] Stalls because no RID available"}, + {"L2T", "L2T-stalls-queue-full", "[L2T] Stalls because internal queue full"}, + {"L2T", "L2T-stalls-wrightback", "[L2T] Stalls because writeback in flight"}, + {"L2T", "L2T-stalls-mem", "[L2T] Stalls because AXI blocks read"}, + {"L2T", "L2T-stalls-fill", "[L2T] Stalls because fill pending for victim cache-line"}, + {"L2T", "L2T-hitq", "[L2T] Sent request via hit queue"}, + {"L2T", "L2T-hitq-full", "[L2T] Sent request via main queue because hit queue is full"}, + {"L2T", "L2T-stalls-read-data", "[L2T] Stalls because waiting for data from SDRAM"}, + {"L2T", "L2T-TMU-read-hits", "[L2T] TMU read hits"}, + {"L2T", "L2T-TMU-read-miss", "[L2T] TMU read misses"}, + {"L2T", "L2T-VCD-read-hits", "[L2T] VCD read hits"}, + {"L2T", "L2T-VCD-read-miss", "[L2T] VCD read misses"}, + {"L2T", "L2T-SLC-read-hits", "[L2T] SLC read hits (all slices)"}, + {"L2T", "L2T-SLC-read-miss", "[L2T] SLC read misses (all slices)"}, + {"AXI", "AXI-writes-seen-watch-0", "[AXI] Writes seen by watch 0"}, + {"AXI", "AXI-reads-seen-watch-0", "[AXI] Reads seen by watch 0"}, + {"AXI", "AXI-writes-stalled-seen-watch-0", "[AXI] Write stalls seen by watch 0"}, + {"AXI", "AXI-reads-stalled-seen-watch-0", "[AXI] Read stalls seen by watch 0"}, + {"AXI", "AXI-write-bytes-seen-watch-0", "[AXI] Total bytes written seen by watch 0"}, + {"AXI", "AXI-read-bytes-seen-watch-0", "[AXI] Total bytes read seen by watch 0"}, + {"AXI", "AXI-writes-seen-watch-1", "[AXI] Writes seen by watch 1"}, + {"AXI", "AXI-reads-seen-watch-1", "[AXI] Reads seen by watch 1"}, + {"AXI", "AXI-writes-stalled-seen-watch-1", "[AXI] Write stalls seen by watch 1"}, + {"AXI", "AXI-reads-stalled-seen-watch-1", "[AXI] Read stalls seen by watch 1"}, + {"AXI", "AXI-write-bytes-seen-watch-1", "[AXI] Total bytes written seen by watch 1"}, + {"AXI", "AXI-read-bytes-seen-watch-1", "[AXI] Total bytes read seen by watch 1"}, + {"CORE", "core-memory-writes", "[CORE] Total memory writes"}, + {"L2T", "L2T-memory-writes", "[L2T] Total memory writes"}, + {"PTB", "PTB-memory-writes", "[PTB] Total memory writes"}, + {"TLB", "TLB-memory-writes", "[TLB] Total memory writes"}, + {"CORE", "core-memory-reads", "[CORE] Total memory reads"}, + {"L2T", "L2T-memory-reads", "[L2T] Total memory reads"}, + {"PTB", "PTB-memory-reads", "[PTB] Total memory reads"}, + {"PSE", "PSE-memory-reads", "[PSE] Total memory reads"}, + {"TLB", "TLB-memory-reads", "[TLB] Total memory reads"}, + {"PTB", "PTB-memory-words-writes", "[PTB] Total memory words written"}, + {"TLB", "TLB-memory-words-writes", "[TLB] Total memory words written"}, + {"PSE", "PSE-memory-words-reads", "[PSE] Total memory words read"}, + {"TLB", "TLB-memory-words-reads", "[TLB] Total memory words read"}, + {"AXI", "AXI-read-trans", "[AXI] Read transaction count"}, + {"AXI", "AXI-write-trans", "[AXI] Write transaction count"}, + {"AXI", "AXI-read-wait-cycles", "[AXI] Read total wait cycles"}, + {"AXI", "AXI-write-wait-cycles", "[AXI] Write total wait cycles"}, + {"AXI", "AXI-max-outstanding-reads", "[AXI] Maximium outstanding read transactions"}, + {"AXI", "AXI-max-outstanding-writes", "[AXI] Maximum outstanding write transactions"}, + {"QPU", "QPU-wait-bubble", "[QPU] Pipeline bubble in qcycles due all threads waiting"}, + {"QPU", "QPU-ic-miss-bubble", "[QPU] Pipeline bubble in qcycles due instruction-cache miss"}, + {"QPU", "QPU-active", "[QPU] Executed shader instruction"}, + {"QPU", "QPU-total-active-clk-cycles-fragment-shading", "[QPU] Total active clock cycles for all QPUs doing fragment shading (counts only when QPU is not stalled)"}, + {"QPU", "QPU-stalls", "[QPU] Stalled qcycles executing shader instruction"}, + {"QPU", "QPU-total-clk-cycles-waiting-fragment-shading", "[QPU] Total stalled clock cycles for all QPUs doing fragment shading"}, + {"QPU", "QPU-stalls-TMU", "[QPU] Stalled qcycles waiting for TMU"}, + {"QPU", "QPU-stalls-TLB", "[QPU] Stalled qcycles waiting for TLB"}, + {"QPU", "QPU-stalls-VPM", "[QPU] Stalled qcycles waiting for VPM"}, + {"QPU", "QPU-stalls-uniforms", "[QPU] Stalled qcycles waiting for uniforms"}, + {"QPU", "QPU-stalls-SFU", "[QPU] Stalled qcycles waiting for SFU"}, + {"QPU", "QPU-stalls-other", "[QPU] Stalled qcycles waiting for any other reason (vary/W/Z)"}, +}; + +#elif (V3D_VERSION >= 41) + static const char *v3d_performance_counters[][3] = { {"FEP", "FEP-valid-primitives-no-rendered-pixels", "[FEP] Valid primitives that result in no rendered pixels, for all rendered tiles"}, {"FEP", "FEP-valid-primitives-rendered-pixels", "[FEP] Valid primitives for all rendered tiles (primitives may be counted in more than one tile)"}, @@ -118,4 +222,8 @@ static const char *v3d_performance_counters[][3] = { {"CORE", "compute-active-cycles", "[CORE] Compute active cycles"}, }; +#else +static const char *v3d_performance_counters[][3] = { }; +#endif + #endif diff --git a/src/broadcom/simulator/v3d_simulator.c b/src/broadcom/simulator/v3d_simulator.c index 5cceb1a82cc..36e719296f4 100644 --- a/src/broadcom/simulator/v3d_simulator.c +++ b/src/broadcom/simulator/v3d_simulator.c @@ -92,6 +92,9 @@ static struct v3d_simulator_state { /** Last performance monitor ID. */ uint32_t last_perfid; + /** Total performance counters */ + uint32_t perfcnt_total; + struct util_dynarray bin_oom; int refcount; } sim_state = { @@ -751,7 +754,7 @@ v3d_simulator_perfmon_create_ioctl(int fd, struct drm_v3d_perfmon_create *args) perfmon->ncounters = args->ncounters; for (int i = 0; i < args->ncounters; i++) { - if (args->counters[i] >= V3D_PERFCNT_NUM) { + if (args->counters[i] >= sim_state.perfcnt_total) { ralloc_free(perfmon); return -EINVAL; } else { @@ -918,13 +921,16 @@ v3d_simulator_init_global() switch(sim_state.ver) { case 33: v3d33_simulator_init_regs(sim_state.v3d); + sim_state.perfcnt_total = 0; break; case 41: case 42: v3d41_simulator_init_regs(sim_state.v3d); + sim_state.perfcnt_total = 87; break; case 71: v3d71_simulator_init_regs(sim_state.v3d); + sim_state.perfcnt_total = 93; break; default: unreachable("Not supported V3D version\n"); diff --git a/src/broadcom/simulator/v3dx_simulator.c b/src/broadcom/simulator/v3dx_simulator.c index 4ea177c9bb7..4520fe75719 100644 --- a/src/broadcom/simulator/v3dx_simulator.c +++ b/src/broadcom/simulator/v3dx_simulator.c @@ -50,7 +50,7 @@ #include "libs/core/v3d/registers/7.1.5.1/v3d.h" #else #if V3D_VERSION == 41 || V3D_VERSION == 42 -#include "libs/core/v3d/registers/4.1.35.0/v3d.h" +#include "libs/core/v3d/registers/4.2.14.0/v3d.h" #else #include "libs/core/v3d/registers/3.3.0.0/v3d.h" #endif diff --git a/src/broadcom/vulkan/meson.build b/src/broadcom/vulkan/meson.build index 3da7364686f..182388a35b4 100644 --- a/src/broadcom/vulkan/meson.build +++ b/src/broadcom/vulkan/meson.build @@ -65,6 +65,7 @@ files_per_version = files( 'v3dvx_pipeline.c', 'v3dvx_meta_common.c', 'v3dvx_pipeline.c', + 'v3dvx_query.c', 'v3dvx_queue.c', ) diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 2f3ef185126..89e2f1c7e5c 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -123,6 +123,9 @@ struct v3d_simulator_file; /* Minimum required by the Vulkan 1.1 spec */ #define MAX_MEMORY_ALLOCATION_SIZE (1ull << 30) +/* Maximum performance counters number */ +#define V3D_MAX_PERFCNT 93 + struct v3dv_physical_device { struct vk_physical_device vk; @@ -1210,7 +1213,7 @@ struct v3dv_timestamp_query_cpu_job_info { }; /* Number of perfmons required to handle all supported performance counters */ -#define V3DV_MAX_PERFMONS DIV_ROUND_UP(V3D_PERFCNT_NUM, \ +#define V3DV_MAX_PERFMONS DIV_ROUND_UP(V3D_MAX_PERFCNT, \ DRM_V3D_MAX_PERF_COUNTERS) struct v3dv_perf_query { @@ -1682,7 +1685,7 @@ struct v3dv_query_pool { /* Only used with performance queries */ struct { uint32_t ncounters; - uint8_t counters[V3D_PERFCNT_NUM]; + uint8_t counters[V3D_MAX_PERFCNT]; /* V3D has a limit on the number of counters we can track in a * single performance monitor, so if too many counters are requested diff --git a/src/broadcom/vulkan/v3dv_query.c b/src/broadcom/vulkan/v3dv_query.c index 3284c467d74..deb7821f02b 100644 --- a/src/broadcom/vulkan/v3dv_query.c +++ b/src/broadcom/vulkan/v3dv_query.c @@ -23,7 +23,6 @@ #include "v3dv_private.h" -#include "common/v3d_performance_counters.h" #include "util/timespec.h" #include "compiler/nir/nir_builder.h" @@ -48,7 +47,7 @@ kperfmon_create(struct v3dv_device *device, DRM_IOCTL_V3D_PERFMON_CREATE, &req); if (ret) - fprintf(stderr, "Failed to create perfmon: %s\n", strerror(ret)); + fprintf(stderr, "Failed to create perfmon for query %d: %s\n", query, strerror(ret)); pool->queries[query].perf.kperfmon_ids[i] = req.id; } @@ -303,7 +302,6 @@ v3dv_CreateQueryPool(VkDevice _device, QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR); assert(pq_info); - assert(pq_info->counterIndexCount <= V3D_PERFCNT_NUM); pool->perfmon.ncounters = pq_info->counterIndexCount; for (uint32_t i = 0; i < pq_info->counterIndexCount; i++) @@ -592,7 +590,7 @@ write_performance_query_result(struct v3dv_device *device, assert(pool && pool->query_type == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR); struct v3dv_query *q = &pool->queries[query]; - uint64_t counter_values[V3D_PERFCNT_NUM]; + uint64_t counter_values[V3D_MAX_PERFCNT]; for (uint32_t i = 0; i < pool->perfmon.nperfmons; i++) { struct drm_v3d_perfmon_get_values req = { @@ -1284,40 +1282,11 @@ v3dv_EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR( VkPerformanceCounterKHR *pCounters, VkPerformanceCounterDescriptionKHR *pCounterDescriptions) { - uint32_t desc_count = *pCounterCount; + V3DV_FROM_HANDLE(v3dv_physical_device, pDevice, physicalDevice); - VK_OUTARRAY_MAKE_TYPED(VkPerformanceCounterKHR, - out, pCounters, pCounterCount); - VK_OUTARRAY_MAKE_TYPED(VkPerformanceCounterDescriptionKHR, - out_desc, pCounterDescriptions, &desc_count); - - for (int i = 0; i < ARRAY_SIZE(v3d_performance_counters); i++) { - vk_outarray_append_typed(VkPerformanceCounterKHR, &out, counter) { - counter->unit = VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR; - counter->scope = VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_KHR; - counter->storage = VK_PERFORMANCE_COUNTER_STORAGE_UINT64_KHR; - - unsigned char sha1_result[20]; - _mesa_sha1_compute(v3d_performance_counters[i][V3D_PERFCNT_NAME], - strlen(v3d_performance_counters[i][V3D_PERFCNT_NAME]), - sha1_result); - - memcpy(counter->uuid, sha1_result, sizeof(counter->uuid)); - } - - vk_outarray_append_typed(VkPerformanceCounterDescriptionKHR, - &out_desc, desc) { - desc->flags = 0; - snprintf(desc->name, sizeof(desc->name), "%s", - v3d_performance_counters[i][V3D_PERFCNT_NAME]); - snprintf(desc->category, sizeof(desc->category), "%s", - v3d_performance_counters[i][V3D_PERFCNT_CATEGORY]); - snprintf(desc->description, sizeof(desc->description), "%s", - v3d_performance_counters[i][V3D_PERFCNT_DESCRIPTION]); - } - } - - return vk_outarray_status(&out); + return v3dv_X(pDevice, enumerate_performance_query_counters)(pCounterCount, + pCounters, + pCounterDescriptions); } VKAPI_ATTR void VKAPI_CALL diff --git a/src/broadcom/vulkan/v3dvx_private.h b/src/broadcom/vulkan/v3dvx_private.h index 27d6736c0e3..0f5887eab93 100644 --- a/src/broadcom/vulkan/v3dvx_private.h +++ b/src/broadcom/vulkan/v3dvx_private.h @@ -324,6 +324,12 @@ v3dX(create_default_attribute_values)(struct v3dv_device *device, void v3dX(job_emit_noop)(struct v3dv_job *job); +/* Used at v3dv_query */ +VkResult +v3dX(enumerate_performance_query_counters)(uint32_t *pCounterCount, + VkPerformanceCounterKHR *pCounters, + VkPerformanceCounterDescriptionKHR *pCounterDescriptions); + /* Used at v3dv_descriptor_set, and other descriptor set utils */ uint32_t v3dX(descriptor_bo_size)(VkDescriptorType type); diff --git a/src/broadcom/vulkan/v3dvx_query.c b/src/broadcom/vulkan/v3dvx_query.c new file mode 100644 index 00000000000..e59a1e84ff6 --- /dev/null +++ b/src/broadcom/vulkan/v3dvx_query.c @@ -0,0 +1,67 @@ +/* + * Copyright © 2023 Raspberry Pi Ltd + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "v3dv_private.h" + +#include "common/v3d_performance_counters.h" + +VkResult +v3dX(enumerate_performance_query_counters)(uint32_t *pCounterCount, + VkPerformanceCounterKHR *pCounters, + VkPerformanceCounterDescriptionKHR *pCounterDescriptions) +{ + uint32_t desc_count = *pCounterCount; + + VK_OUTARRAY_MAKE_TYPED(VkPerformanceCounterKHR, + out, pCounters, pCounterCount); + VK_OUTARRAY_MAKE_TYPED(VkPerformanceCounterDescriptionKHR, + out_desc, pCounterDescriptions, &desc_count); + + for (int i = 0; i < ARRAY_SIZE(v3d_performance_counters); i++) { + vk_outarray_append_typed(VkPerformanceCounterKHR, &out, counter) { + counter->unit = VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR; + counter->scope = VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_KHR; + counter->storage = VK_PERFORMANCE_COUNTER_STORAGE_UINT64_KHR; + + unsigned char sha1_result[20]; + _mesa_sha1_compute(v3d_performance_counters[i][V3D_PERFCNT_NAME], + strlen(v3d_performance_counters[i][V3D_PERFCNT_NAME]), + sha1_result); + + memcpy(counter->uuid, sha1_result, sizeof(counter->uuid)); + } + + vk_outarray_append_typed(VkPerformanceCounterDescriptionKHR, + &out_desc, desc) { + desc->flags = 0; + snprintf(desc->name, sizeof(desc->name), "%s", + v3d_performance_counters[i][V3D_PERFCNT_NAME]); + snprintf(desc->category, sizeof(desc->category), "%s", + v3d_performance_counters[i][V3D_PERFCNT_CATEGORY]); + snprintf(desc->description, sizeof(desc->description), "%s", + v3d_performance_counters[i][V3D_PERFCNT_DESCRIPTION]); + } + } + + return vk_outarray_status(&out); +} diff --git a/src/gallium/drivers/v3d/meson.build b/src/gallium/drivers/v3d/meson.build index b2e748573b7..289473d2ca1 100644 --- a/src/gallium/drivers/v3d/meson.build +++ b/src/gallium/drivers/v3d/meson.build @@ -34,7 +34,6 @@ files_libv3d = files( 'v3d_query.c', 'v3d_query.h', 'v3d_query_pipe.c', - 'v3d_query_perfcnt.c', 'v3d_resource.c', 'v3d_resource.h', 'v3d_screen.c', @@ -47,6 +46,7 @@ files_per_version = files( 'v3dx_emit.c', 'v3dx_format_table.c', 'v3dx_job.c', + 'v3dx_query_perfcnt.c', 'v3dx_rcl.c', 'v3dx_state.c', 'v3dx_tfu.c', diff --git a/src/gallium/drivers/v3d/v3d_query.c b/src/gallium/drivers/v3d/v3d_query.c index db98c89625f..83f82e44a3d 100644 --- a/src/gallium/drivers/v3d/v3d_query.c +++ b/src/gallium/drivers/v3d/v3d_query.c @@ -28,8 +28,11 @@ v3d_get_driver_query_group_info(struct pipe_screen *pscreen, unsigned index, struct pipe_driver_query_group_info *info) { struct v3d_screen *screen = v3d_screen(pscreen); + struct v3d_device_info *devinfo = &screen->devinfo; - return v3d_get_driver_query_group_info_perfcnt(screen, index, info); + return v3d_X(devinfo, get_driver_query_group_info_perfcnt)(screen, + index, + info); } int @@ -37,8 +40,11 @@ v3d_get_driver_query_info(struct pipe_screen *pscreen, unsigned index, struct pipe_driver_query_info *info) { struct v3d_screen *screen = v3d_screen(pscreen); + struct v3d_device_info *devinfo = &screen->devinfo; - return v3d_get_driver_query_info_perfcnt(screen, index, info); + return v3d_X(devinfo, get_driver_query_info_perfcnt)(screen, + index, + info); } static struct pipe_query * @@ -53,9 +59,13 @@ static struct pipe_query * v3d_create_batch_query(struct pipe_context *pctx, unsigned num_queries, unsigned *query_types) { - return v3d_create_batch_query_perfcnt(v3d_context(pctx), - num_queries, - query_types); + struct v3d_context *v3d = v3d_context(pctx); + struct v3d_screen *screen = v3d->screen; + struct v3d_device_info *devinfo = &screen->devinfo; + + return v3d_X(devinfo, create_batch_query_perfcnt)(v3d_context(pctx), + num_queries, + query_types); } static void diff --git a/src/gallium/drivers/v3d/v3d_query.h b/src/gallium/drivers/v3d/v3d_query.h index 3e1426b8d86..605ed1a12f9 100644 --- a/src/gallium/drivers/v3d/v3d_query.h +++ b/src/gallium/drivers/v3d/v3d_query.h @@ -42,11 +42,5 @@ struct v3d_query }; struct pipe_query *v3d_create_query_pipe(struct v3d_context *v3d, unsigned query_type, unsigned index); -struct pipe_query *v3d_create_batch_query_perfcnt(struct v3d_context *v3d, unsigned num_queries, - unsigned *query_types); -int v3d_get_driver_query_group_info_perfcnt(struct v3d_screen *screen, unsigned index, - struct pipe_driver_query_group_info *info); -int v3d_get_driver_query_info_perfcnt(struct v3d_screen *screen, unsigned index, - struct pipe_driver_query_info *info); #endif /* V3D_QUERY_H */ diff --git a/src/gallium/drivers/v3d/v3dx_context.h b/src/gallium/drivers/v3d/v3dx_context.h index e0a5cbfb2f3..c487ac3b996 100644 --- a/src/gallium/drivers/v3d/v3dx_context.h +++ b/src/gallium/drivers/v3d/v3dx_context.h @@ -61,3 +61,13 @@ bool v3dX(tfu)(struct pipe_context *pctx, unsigned int src_layer, unsigned int dst_layer, bool for_mipmap); + +int v3dX(get_driver_query_group_info_perfcnt)(struct v3d_screen *screen, + unsigned index, + struct pipe_driver_query_group_info *info); +int v3dX(get_driver_query_info_perfcnt)(struct v3d_screen *screen, + unsigned index, + struct pipe_driver_query_info *info); +struct pipe_query *v3dX(create_batch_query_perfcnt)(struct v3d_context *v3d, + unsigned num_queries, + unsigned *query_types); diff --git a/src/gallium/drivers/v3d/v3d_query_perfcnt.c b/src/gallium/drivers/v3d/v3dx_query_perfcnt.c similarity index 94% rename from src/gallium/drivers/v3d/v3d_query_perfcnt.c rename to src/gallium/drivers/v3d/v3dx_query_perfcnt.c index e00d84e375f..431aad14b4f 100644 --- a/src/gallium/drivers/v3d/v3d_query_perfcnt.c +++ b/src/gallium/drivers/v3d/v3dx_query_perfcnt.c @@ -52,8 +52,8 @@ kperfmon_destroy(struct v3d_context *v3d, struct v3d_perfmon_state *perfmon) } int -v3d_get_driver_query_group_info_perfcnt(struct v3d_screen *screen, unsigned index, - struct pipe_driver_query_group_info *info) +v3dX(get_driver_query_group_info_perfcnt)(struct v3d_screen *screen, unsigned index, + struct pipe_driver_query_group_info *info) { if (!screen->has_perfmon) return 0; @@ -72,8 +72,8 @@ v3d_get_driver_query_group_info_perfcnt(struct v3d_screen *screen, unsigned inde } int -v3d_get_driver_query_info_perfcnt(struct v3d_screen *screen, unsigned index, - struct pipe_driver_query_info *info) +v3dX(get_driver_query_info_perfcnt)(struct v3d_screen *screen, unsigned index, + struct pipe_driver_query_info *info) { if (!screen->has_perfmon) return 0; @@ -222,8 +222,8 @@ static const struct v3d_query_funcs perfcnt_query_funcs = { }; struct pipe_query * -v3d_create_batch_query_perfcnt(struct v3d_context *v3d, unsigned num_queries, - unsigned *query_types) +v3dX(create_batch_query_perfcnt)(struct v3d_context *v3d, unsigned num_queries, + unsigned *query_types) { struct v3d_query_perfcnt *pquery = NULL; struct v3d_query *query; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0132-broadcom-simulator-add-per-hw-version-calls.patch ================================================ From f7d5b57bca07eb9ba6fb292852e3b5057c0a8b8f Mon Sep 17 00:00:00 2001 From: "Juan A. Suarez Romero" <jasuarez@igalia.com> Date: Mon, 20 Mar 2023 16:48:51 +0100 Subject: [PATCH 132/142] broadcom/simulator: add per-hw version calls Add a wrapper to allow calling the right simulator function based on the hardware under simulation. Signed-off-by: Juan A. Suarez Romero <jasuarez@igalia.com> --- src/broadcom/simulator/v3d_simulator.c | 86 ++++--------------------- src/broadcom/simulator/v3d_simulator.h | 21 ++++++ src/broadcom/simulator/v3dx_simulator.c | 9 ++- 3 files changed, 41 insertions(+), 75 deletions(-) diff --git a/src/broadcom/simulator/v3d_simulator.c b/src/broadcom/simulator/v3d_simulator.c index 36e719296f4..c4bbd61abc2 100644 --- a/src/broadcom/simulator/v3d_simulator.c +++ b/src/broadcom/simulator/v3d_simulator.c @@ -439,15 +439,15 @@ v3d_simulator_perfmon_switch(int fd, uint32_t perfid) perfmon = v3d_get_simulator_perfmon(fd, file->active_perfid); if (perfmon) - v3d41_simulator_perfmon_stop(sim_state.v3d, - perfmon->ncounters, - perfmon->values); + v3d_X_simulator(perfmon_stop)(sim_state.v3d, + perfmon->ncounters, + perfmon->values); perfmon = v3d_get_simulator_perfmon(fd, perfid); if (perfmon) - v3d41_simulator_perfmon_start(sim_state.v3d, - perfmon->ncounters, - perfmon->counters); + v3d_X_simulator(perfmon_start)(sim_state.v3d, + perfmon->ncounters, + perfmon->counters); file->active_perfid = perfid; } @@ -492,21 +492,7 @@ v3d_simulator_submit_cl_ioctl(int fd, struct drm_v3d_submit_cl *submit) bin_fd = fd; v3d_simulator_perfmon_switch(fd, submit->perfmon_id); - - switch(sim_state.ver) { - case 33: - v3d33_simulator_submit_cl_ioctl(sim_state.v3d, submit, file->gmp->ofs); - break; - case 41: - case 42: - v3d41_simulator_submit_cl_ioctl(sim_state.v3d, submit, file->gmp->ofs); - break; - case 71: - v3d71_simulator_submit_cl_ioctl(sim_state.v3d, submit, file->gmp->ofs); - break; - default: - unreachable("Unsupported V3D version\n"); - } + v3d_X_simulator(submit_cl_ioctl)(sim_state.v3d, submit, file->gmp->ofs); util_dynarray_foreach(&sim_state.bin_oom, struct v3d_simulator_bo *, sim_bo) { @@ -645,22 +631,6 @@ v3d_simulator_gem_close_ioctl(int fd, struct drm_gem_close *args) return drmIoctl(fd, DRM_IOCTL_GEM_CLOSE, args); } -static int -v3d_simulator_get_param_ioctl(int fd, struct drm_v3d_get_param *args) -{ - switch(sim_state.ver) { - case 33: - return v3d33_simulator_get_param_ioctl(sim_state.v3d, args); - case 41: - case 42: - return v3d41_simulator_get_param_ioctl(sim_state.v3d, args); - case 71: - return v3d71_simulator_get_param_ioctl(sim_state.v3d, args); - default: - unreachable("Unsupported V3D version\n"); - } -} - static int v3d_simulator_submit_tfu_ioctl(int fd, struct drm_v3d_submit_tfu *args) { @@ -672,20 +642,7 @@ v3d_simulator_submit_tfu_ioctl(int fd, struct drm_v3d_submit_tfu *args) v3d_simulator_copy_in_handle(file, args->bo_handles[2]); v3d_simulator_copy_in_handle(file, args->bo_handles[3]); - switch(sim_state.ver) { - case 33: - ret = v3d33_simulator_submit_tfu_ioctl(sim_state.v3d, args); - break; - case 41: - case 42: - ret = v3d41_simulator_submit_tfu_ioctl(sim_state.v3d, args); - break; - case 71: - ret = v3d71_simulator_submit_tfu_ioctl(sim_state.v3d, args); - break; - default: - unreachable("Unsupported V3D version\n"); - } + ret = v3d_X_simulator(submit_tfu_ioctl)(sim_state.v3d, args); v3d_simulator_copy_out_handle(file, args->bo_handles[0]); @@ -712,19 +669,8 @@ v3d_simulator_submit_csd_ioctl(int fd, struct drm_v3d_submit_csd *args) v3d_simulator_perfmon_switch(fd, args->perfmon_id); - switch(sim_state.ver) { - case 41: - case 42: - ret = v3d41_simulator_submit_csd_ioctl(sim_state.v3d, args, - file->gmp->ofs); - break; - case 71: - ret = v3d71_simulator_submit_csd_ioctl(sim_state.v3d, args, - file->gmp->ofs); - break; - default: - ret = -1; - } + ret = v3d_X_simulator(submit_csd_ioctl)(sim_state.v3d, args, + file->gmp->ofs); for (int i = 0; i < args->bo_handle_count; i++) v3d_simulator_copy_out_handle(file, bo_handles[i]); @@ -835,7 +781,7 @@ v3d_simulator_ioctl(int fd, unsigned long request, void *args) return 0; case DRM_IOCTL_V3D_GET_PARAM: - return v3d_simulator_get_param_ioctl(fd, args); + return v3d_X_simulator(get_param_ioctl)(sim_state.v3d, args); case DRM_IOCTL_GEM_CLOSE: return v3d_simulator_gem_close_ioctl(fd, args); @@ -918,22 +864,18 @@ v3d_simulator_init_global() util_dynarray_init(&sim_state.bin_oom, NULL); + v3d_X_simulator(init_regs)(sim_state.v3d); + switch(sim_state.ver) { - case 33: - v3d33_simulator_init_regs(sim_state.v3d); - sim_state.perfcnt_total = 0; - break; case 41: case 42: - v3d41_simulator_init_regs(sim_state.v3d); sim_state.perfcnt_total = 87; break; case 71: - v3d71_simulator_init_regs(sim_state.v3d); sim_state.perfcnt_total = 93; break; default: - unreachable("Not supported V3D version\n"); + sim_state.perfcnt_total = 0; } } diff --git a/src/broadcom/simulator/v3d_simulator.h b/src/broadcom/simulator/v3d_simulator.h index 1472c313a03..92305634468 100644 --- a/src/broadcom/simulator/v3d_simulator.h +++ b/src/broadcom/simulator/v3d_simulator.h @@ -59,4 +59,25 @@ uint32_t v3d_simulator_get_mem_free(void); #endif +/* Helper to call simulator ver specific functions */ +#define v3d_X_simulator(thing) ({ \ + __typeof(&v3d33_simulator_##thing) v3d_X_sim_thing;\ + switch (sim_state.ver) { \ + case 33: \ + case 40: \ + v3d_X_sim_thing = &v3d33_simulator_##thing; \ + break; \ + case 41: \ + case 42: \ + v3d_X_sim_thing = &v3d41_simulator_##thing; \ + break; \ + case 71: \ + v3d_X_sim_thing = &v3d71_simulator_##thing; \ + break; \ + default: \ + unreachable("Unsupported hardware generation"); \ + } \ + v3d_X_sim_thing; \ +}) + #endif diff --git a/src/broadcom/simulator/v3dx_simulator.c b/src/broadcom/simulator/v3dx_simulator.c index 4520fe75719..01cf6b22663 100644 --- a/src/broadcom/simulator/v3dx_simulator.c +++ b/src/broadcom/simulator/v3dx_simulator.c @@ -218,12 +218,12 @@ v3dX(simulator_submit_tfu_ioctl)(struct v3d_hw *v3d, return 0; } -#if V3D_VERSION >= 41 int v3dX(simulator_submit_csd_ioctl)(struct v3d_hw *v3d, struct drm_v3d_submit_csd *args, uint32_t gmp_ofs) { +#if V3D_VERSION >= 41 int last_completed_jobs = (V3D_READ(V3D_CSD_0_STATUS) & V3D_CSD_0_STATUS_NUM_COMPLETED_JOBS_SET); g_gmp_ofs = gmp_ofs; @@ -256,8 +256,10 @@ v3dX(simulator_submit_csd_ioctl)(struct v3d_hw *v3d, v3d_flush_caches(v3d); return 0; -} +#else + return -1; #endif +} int v3dX(simulator_get_param_ioctl)(struct v3d_hw *v3d, @@ -545,7 +547,8 @@ v3dX(simulator_submit_cl_ioctl)(struct v3d_hw *v3d, #define V3D_PCTR_0_SRC_N(x) (V3D_PCTR_0_SRC_0_3 + 4 * (x)) #define V3D_PCTR_0_SRC_N_SHIFT(x) ((x) * 8) #define V3D_PCTR_0_SRC_N_MASK(x) (BITFIELD_RANGE(V3D_PCTR_0_SRC_N_SHIFT(x), \ - V3D_PCTR_0_SRC_N_SHIFT(x) + 6)) + V3D_PCTR_0_SRC_N_SHIFT(x) + \ + V3D_PCTR_0_SRC_0_3_PCTRS0_MSB)) #endif void -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0133-v3dv-expose-fullDrawIndexUint32-in-V3D-7.x.patch ================================================ From 151c13365703631f88ad77ba07afbd2ba9fa172c Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 31 May 2023 09:23:51 +0200 Subject: [PATCH 133/142] v3dv: expose fullDrawIndexUint32 in V3D 7.x --- src/broadcom/vulkan/v3dv_device.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index b520bfa0002..ca5f676b6f7 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -214,7 +214,7 @@ get_features(const struct v3dv_physical_device *physical_device, *features = (struct vk_features) { /* Vulkan 1.0 */ .robustBufferAccess = true, /* This feature is mandatory */ - .fullDrawIndexUint32 = false, /* Only available since V3D 4.4.9.1 */ + .fullDrawIndexUint32 = physical_device->devinfo.ver >= 71, .imageCubeArray = true, .independentBlend = true, .geometryShader = true, @@ -1451,7 +1451,8 @@ v3dv_GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, .subPixelPrecisionBits = V3D_COORD_SHIFT, .subTexelPrecisionBits = 8, .mipmapPrecisionBits = 8, - .maxDrawIndexedIndexValue = 0x00ffffff, + .maxDrawIndexedIndexValue = pdevice->devinfo.ver >= 71 ? + 0xffffffff : 0x00ffffff, .maxDrawIndirectCount = 0x7fffffff, .maxSamplerLodBias = 14.0f, .maxSamplerAnisotropy = 16.0f, -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0134-v3dv-expose-depthClamp-in-V3D-7.x.patch ================================================ From aec0c613e651984e577f580aedceb3561d6a3b19 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 31 May 2023 10:38:59 +0200 Subject: [PATCH 134/142] v3dv: expose depthClamp in V3D 7.x --- src/broadcom/vulkan/v3dv_device.c | 2 +- src/broadcom/vulkan/v3dvx_pipeline.c | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index ca5f676b6f7..30a9894789b 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -224,7 +224,7 @@ get_features(const struct v3dv_physical_device *physical_device, .logicOp = true, .multiDrawIndirect = false, .drawIndirectFirstInstance = true, - .depthClamp = false, /* Only available since V3D 4.5.1.1 */ + .depthClamp = physical_device->devinfo.ver >= 71, .depthBiasClamp = true, .fillModeNonSolid = true, .depthBounds = physical_device->devinfo.ver >= 71, diff --git a/src/broadcom/vulkan/v3dvx_pipeline.c b/src/broadcom/vulkan/v3dvx_pipeline.c index c9b537f4b32..ad22add155d 100644 --- a/src/broadcom/vulkan/v3dvx_pipeline.c +++ b/src/broadcom/vulkan/v3dvx_pipeline.c @@ -243,6 +243,7 @@ pack_cfg_bits(struct v3dv_pipeline *pipeline, * supported in the driver yet, so in practice we are always enabling Z * clipping for now. */ + bool z_clamp_enable = rs_info && rs_info->depthClampEnable; bool z_clip_enable = false; const VkPipelineRasterizationDepthClipStateCreateInfoEXT *clip_info = ds_info ? vk_find_struct_const(ds_info->pNext, @@ -250,7 +251,7 @@ pack_cfg_bits(struct v3dv_pipeline *pipeline, NULL; if (clip_info) z_clip_enable = clip_info->depthClipEnable; - else if (!(rs_info && rs_info->depthClampEnable)) + else if (!z_clamp_enable) z_clip_enable = true; if (z_clip_enable) { @@ -260,6 +261,8 @@ pack_cfg_bits(struct v3dv_pipeline *pipeline, config.z_clipping_mode = V3D_Z_CLIP_MODE_NONE; } + config.z_clamp_mode = z_clamp_enable; + config.depth_bounds_test_enable = ds_info && ds_info->depthBoundsTestEnable && has_ds_attachment; #endif -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0135-v3dv-temporary-disable-EXT_acquire_drm_display.patch ================================================ From 6bd92fecf57b5b1ae3f1f665726c4a0c43d3d90e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= <apinheiro@igalia.com> Date: Tue, 11 Apr 2023 13:11:39 +0200 Subject: [PATCH 135/142] v3dv/temporary: disable EXT_acquire_drm_display So we could made a conformance run, without the need to include the CTS patch for this issue: https://gitlab.khronos.org/Tracker/vk-gl-cts/-/issues/4377 --- src/broadcom/vulkan/v3dv_device.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 30a9894789b..c0ffc05750f 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -91,7 +91,7 @@ static const struct vk_instance_extension_table instance_extensions = { .KHR_display = true, .KHR_get_display_properties2 = true, .EXT_direct_mode_display = true, - .EXT_acquire_drm_display = true, + .EXT_acquire_drm_display = false, #endif .KHR_external_fence_capabilities = true, .KHR_external_memory_capabilities = true, -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0136-v3dv-expose-scalarBlockLayout-on-V3D-7.x.patch ================================================ From 7960516490008ab42ab31e921369b1ffb8f67bde Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga <itoral@igalia.com> Date: Wed, 21 Jun 2023 10:29:07 +0200 Subject: [PATCH 136/142] v3dv: expose scalarBlockLayout on V3D 7.x This version of V3D doesn't have the restriction that vector accesses must not cross 16-byte boundaries. --- src/broadcom/vulkan/v3dv_device.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index c0ffc05750f..8f8102ae46e 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -304,7 +304,7 @@ get_features(const struct v3dv_physical_device *physical_device, * problematic, we would always have to scalarize. Overall, this would * not lead to best performance so let's just not support it. */ - .scalarBlockLayout = false, + .scalarBlockLayout = physical_device->devinfo.ver >= 71, /* This tells applications 2 things: * * 1. If they can select just one aspect for barriers. For us barriers -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0137-dri-Limit-the-max_num_back-to-2-on-COMPLETE_MODE_FLI.patch ================================================ From b58e1d7fd1c315e6ada0ad9ec4961b65c88f0c2a Mon Sep 17 00:00:00 2001 From: Jose Maria Casanova Crespo <jmcasanova@igalia.com> Date: Mon, 4 Oct 2021 14:30:30 +0200 Subject: [PATCH 137/142] dri: Limit the max_num_back to 2 on COMPLETE_MODE_FLIP present mode This is limiting the number of back buffers that mesa can allocate, so this avoids triple buffering, although that is desirable in some cases. To get this to upstream, we could convert it to a DRI option and enable it only in the case of using mutter. It seems to be feasible to limit this to some kind of configuration, as we have access to the size of the back-buffer allocated. For example, only limit for 4k-dual screen setup. With this Raspberry OS start-up CMA usage is 210Mb with 4k-dual screen setup instead of 276Mb. The correct approach would be to check if we can make Mutter to wait for buffer swaps before starting a new frame. https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7033 --- src/loader/loader_dri3_helper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c index 32135770e9d..2534c817dcc 100644 --- a/src/loader/loader_dri3_helper.c +++ b/src/loader/loader_dri3_helper.c @@ -275,7 +275,7 @@ dri3_update_max_num_back(struct loader_dri3_drawable *draw) if (draw->swap_interval == 0) draw->max_num_back = 4; else - draw->max_num_back = 3; + draw->max_num_back = 2; assert(draw->max_num_back <= LOADER_DRI3_MAX_BACK); break; -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0138-v3d-Ignore-SCANOUT-usage-flags-when-not-needed-under.patch ================================================ From d0f2a99045fa9835fea822ada58a344e2fdc1b13 Mon Sep 17 00:00:00 2001 From: Jose Maria Casanova Crespo <jmcasanova@igalia.com> Date: Thu, 21 Oct 2021 22:04:57 +0200 Subject: [PATCH 138/142] v3d: Ignore SCANOUT usage flags when not needed under X These downstream patches force the usage of tiled formats when possible, they have been tested for the Rasbperry Pi OS desktop enviroment using Mutter+Xserver. It includes the following 3 patches: - v3d: Add driconf options to rewrite SCANOUT usages - v3d: Check if are under X session - v3d: enable options to ignore SCANOUT flag on resource creation v3d: Add driconf options to rewrite SCANOUT usages We create a new eviroment variable V3D_IGNORE_SCANOUT_USAGES that will affect v3d_resource_create_with_modifiers so SCANOUT usages can be ignored. It can be enabled under X11 with a compositor so applications are forces to use tiled render buffers instead of the default behaviour that uses SCANOUT and consume the limited CMA memory in the RPi4. The two new driconf options modulate the effect on two applications Xorg and mutter. "v3d_maintain_ignorable_scanout": is enabled in mutter, could be used in other compositors, the objective is that the enviroment has enable the V3D_IGNORE_SCANOUT_USAGES, they aren't ignored in the compositor. "v3d_is_xserver_process": is used to handle a particular case to avoid checking if an Xserver connection is available using XCB as in some cases the call stalls the Xserver on boot. Following patches will use this configuration options to ignore or not the SCANOUT usage on v3d_resource_allocation with modifiers. Upstreaming this patch need to review the effects of: ad50b47a14e9 ("gbm: assume USE_SCANOUT in create_with_modifiers") v2: driconf for v3d_is_xserver_process is needed under XWayland to avoid XCB connections in the XWayland process. v3d: Check if are under X session If we are using Wayland + XWayland, this is considered *not* being under X session. v3d: enable options to ignore SCANOUT flag on resource creation This is a downstream patch for enabling the usage of more tiled buffers in Raspberry OS under an enviroment using mutter and Xorg. This patch enables the following behaviour in order to reduce the number of CMA usage and use tiled layouts because we ignore the possible SCANOUT usage of the resource. This patch makes mutter to not ignore SCANOUT flags because as compositor it should allocate linear render buffers suitable for display. Then if the Xserver has enabled the dmabuf_capable option, the buffers backing the windows pixmaps will allocate using modifiers, in the patched Xserver downstream making pixmaps exportable will use gbm_gbm_bo_create_with_modifiers2 that does not add the SCANOUT flag for exporting pixmaps. With the Mutter compositor we didn't find a situation were this pixmaps needed to be SCANOUT. But this is not sure, but it allows us to not use CMA for every window opened, and having them in tiled format saves all linear->tiled conversion for sampling. Finally to take advantage of using Tiled render buffers for applications we can enable in the enviroment V3D_IGNORE_SCANOUT_USAGES so all render targes use the tiled UIF format without CMA memory instead of a linear one. As the compositor mutter will composite the final surface for display we aren't going to use the SCANOUT flag. This only applies if we are under an X11 session. v2: v3d: ignore V3D_IGNORE_SCANOUT if only LINEAR modifier available This is a fixup for the behaviour of ignoring SCANOUT flags so we don't allocate CMA memory on V3D for render targets under X11 as UIF isn't included and only LINEAR is a valid modifier when Xserver is using msdri3. So we cannot ignore the SCANOUT flag. As the Xserver in this situation is limiting the available modifiers to linear, we can identify this case just not ignoring the SCANOUT flag when we can only allocate linear resources. --- src/gallium/drivers/v3d/driinfo_v3d.h | 2 + src/gallium/drivers/v3d/meson.build | 17 +++++--- src/gallium/drivers/v3d/v3d_resource.c | 31 ++++++++++++-- src/gallium/drivers/v3d/v3d_screen.c | 59 ++++++++++++++++++++++++++ src/gallium/drivers/v3d/v3d_screen.h | 6 +++ src/util/00-mesa-defaults.conf | 3 ++ src/util/driconf.h | 8 ++++ 7 files changed, 117 insertions(+), 9 deletions(-) diff --git a/src/gallium/drivers/v3d/driinfo_v3d.h b/src/gallium/drivers/v3d/driinfo_v3d.h index 147ad0b49bd..8f989e8aa57 100644 --- a/src/gallium/drivers/v3d/driinfo_v3d.h +++ b/src/gallium/drivers/v3d/driinfo_v3d.h @@ -2,4 +2,6 @@ DRI_CONF_SECTION_MISCELLANEOUS DRI_CONF_V3D_NONMSAA_TEXTURE_SIZE_LIMIT(false) + DRI_CONF_V3D_MAINTAIN_IGNORABLE_SCANOUT(false) + DRI_CONF_V3D_IS_XSERVER_PROCESS(false) DRI_CONF_SECTION_END diff --git a/src/gallium/drivers/v3d/meson.build b/src/gallium/drivers/v3d/meson.build index 289473d2ca1..e47682db1aa 100644 --- a/src/gallium/drivers/v3d/meson.build +++ b/src/gallium/drivers/v3d/meson.build @@ -61,6 +61,16 @@ endif v3d_versions = ['33', '42', '71'] +v3d_deps = [dep_v3dv3, dep_libdrm, dep_valgrind, idep_nir_headers] + +if with_platform_x11 + v3d_deps += dep_xcb +endif + +if with_platform_wayland + v3d_deps += dep_wayland_client +endif + per_version_libs = [] foreach ver : v3d_versions per_version_libs += static_library( @@ -72,7 +82,7 @@ foreach ver : v3d_versions ], c_args : [v3d_args, '-DV3D_VERSION=' + ver], gnu_symbol_visibility : 'hidden', - dependencies : [dep_v3dv3, dep_libdrm, dep_valgrind, idep_nir_headers], + dependencies : v3d_deps, ) endforeach @@ -95,10 +105,7 @@ libv3d = static_library( c_args : [v3d_args], cpp_args : [v3d_args], gnu_symbol_visibility : 'hidden', - dependencies : [ - dep_v3dv3, dep_libdrm, dep_valgrind, - idep_nir_headers, idep_mesautil, - ], + dependencies : v3d_deps + idep_mesautil, link_with: [per_version_libs], ) diff --git a/src/gallium/drivers/v3d/v3d_resource.c b/src/gallium/drivers/v3d/v3d_resource.c index a0a210ccad5..46de1b16ae0 100644 --- a/src/gallium/drivers/v3d/v3d_resource.c +++ b/src/gallium/drivers/v3d/v3d_resource.c @@ -439,7 +439,7 @@ v3d_resource_get_handle(struct pipe_screen *pscreen, case WINSYS_HANDLE_TYPE_SHARED: return v3d_bo_flink(bo, &whandle->handle); case WINSYS_HANDLE_TYPE_KMS: - if (screen->ro) { + if (screen->ro && rsc->scanout) { if (renderonly_get_handle(rsc->scanout, whandle)) { whandle->stride = rsc->slices[0].stride; return true; @@ -785,6 +785,27 @@ v3d_resource_setup(struct pipe_screen *pscreen, return rsc; } +static bool +v3d_resource_should_scanout(struct pipe_screen *pscreen, + const struct pipe_resource *tmpl, + const uint64_t *modifiers, + int count) +{ + struct v3d_screen *screen = v3d_screen(pscreen); + + if (tmpl->bind & PIPE_BIND_SCANOUT) { + if (screen->maintain_ignorable_scanout) + return true; + if (screen->has_x_session && screen->ignore_scanout_usages) { + if (drm_find_modifier(DRM_FORMAT_MOD_BROADCOM_UIF, + modifiers, count)) + return false; + } + return true; + } + return false; +} + static struct pipe_resource * v3d_resource_create_with_modifiers(struct pipe_screen *pscreen, const struct pipe_resource *tmpl, @@ -798,6 +819,8 @@ v3d_resource_create_with_modifiers(struct pipe_screen *pscreen, struct pipe_resource *prsc = &rsc->base; /* Use a tiled layout if we can, for better 3D performance. */ bool should_tile = true; + bool should_scanout = v3d_resource_should_scanout(pscreen, tmpl, + modifiers, count); assert(tmpl->target != PIPE_BUFFER || (tmpl->format == PIPE_FORMAT_NONE || @@ -827,7 +850,7 @@ v3d_resource_create_with_modifiers(struct pipe_screen *pscreen, /* If using the old-school SCANOUT flag, we don't know what the screen * might support other than linear. Just force linear. */ - if (tmpl->bind & PIPE_BIND_SCANOUT) + if ((tmpl->bind & PIPE_BIND_SCANOUT) && should_scanout) should_tile = false; /* No user-specified modifier; determine our own. */ @@ -849,7 +872,7 @@ v3d_resource_create_with_modifiers(struct pipe_screen *pscreen, v3d_setup_slices(rsc, 0, tmpl->bind & PIPE_BIND_SHARED); - if (screen->ro && (tmpl->bind & PIPE_BIND_SCANOUT)) { + if (screen->ro && should_scanout) { struct winsys_handle handle; struct pipe_resource scanout_tmpl = { .target = prsc->target, @@ -979,7 +1002,7 @@ v3d_resource_from_handle(struct pipe_screen *pscreen, } } - if (screen->ro) { + if (screen->ro && !rsc->tiled) { /* Make sure that renderonly has a handle to our buffer in the * display's fd, so that a later renderonly_get_handle() * returns correct handles or GEM names. diff --git a/src/gallium/drivers/v3d/v3d_screen.c b/src/gallium/drivers/v3d/v3d_screen.c index 2225edf85bd..1d4f619d710 100644 --- a/src/gallium/drivers/v3d/v3d_screen.c +++ b/src/gallium/drivers/v3d/v3d_screen.c @@ -47,6 +47,42 @@ #include "compiler/v3d_compiler.h" #include "drm-uapi/drm_fourcc.h" +#ifdef HAVE_WAYLAND_PLATFORM +#include <wayland-client.h> +#endif + +#ifdef HAVE_X11_PLATFORM +#include <xcb/xcb.h> +#endif + +static bool +check_x_session() +{ + bool xcb_connection = false; + +#ifdef HAVE_WAYLAND_PLATFORM + struct wl_display *display; + + display = wl_display_connect(NULL); + + if (display) { + wl_display_disconnect(display); + return xcb_connection; + } +#endif + +#ifdef HAVE_X11_PLATFORM + xcb_connection_t *conn; + + conn = xcb_connect(NULL, NULL); + + if (!xcb_connection_has_error(conn)) + xcb_connection = true; + xcb_disconnect(conn); +#endif + return xcb_connection; +} + static const char * v3d_screen_get_name(struct pipe_screen *pscreen) { @@ -945,6 +981,29 @@ v3d_screen_create(int fd, const struct pipe_screen_config *config, v3d_has_feature(screen, DRM_V3D_PARAM_SUPPORTS_CACHE_FLUSH); screen->has_perfmon = v3d_has_feature(screen, DRM_V3D_PARAM_SUPPORTS_PERFMON); + screen->ignore_scanout_usages = getenv("V3D_IGNORE_SCANOUT_USAGES"); + + const char *is_xserver_process = + "v3d_is_xserver_process"; + screen->is_xserver_process = + driCheckOption(config->options, + is_xserver_process, + DRI_BOOL) && + driQueryOptionb(config->options, + is_xserver_process); + + const char *maintain_ignorable_scanout_name = + "v3d_maintain_ignorable_scanout"; + screen->maintain_ignorable_scanout = + driCheckOption(config->options, + maintain_ignorable_scanout_name, + DRI_BOOL) && + driQueryOptionb(config->options, + maintain_ignorable_scanout_name); + + screen->has_x_session = !screen->is_xserver_process && + check_x_session(); + v3d_fence_init(screen); v3d_process_debug_variable(); diff --git a/src/gallium/drivers/v3d/v3d_screen.h b/src/gallium/drivers/v3d/v3d_screen.h index 1da9b83c965..c0f22707075 100644 --- a/src/gallium/drivers/v3d/v3d_screen.h +++ b/src/gallium/drivers/v3d/v3d_screen.h @@ -83,6 +83,12 @@ struct v3d_screen { bool has_cache_flush; bool has_perfmon; bool nonmsaa_texture_size_limit; + bool ignore_scanout_usages; + bool is_xserver_process; + bool maintain_ignorable_scanout; + + /* Are we running in an X session? */ + bool has_x_session; struct v3d_simulator_file *sim_file; diff --git a/src/util/00-mesa-defaults.conf b/src/util/00-mesa-defaults.conf index 948c1ef78ba..2de7505521c 100644 --- a/src/util/00-mesa-defaults.conf +++ b/src/util/00-mesa-defaults.conf @@ -77,6 +77,7 @@ TODO: document the other workarounds. <!-- using vulkan wsi for xservers causes deadlocks --> <application name="Xwayland" executable="Xwayland"> <option name="disable_xcb_surface" value="true" /> + <option name="v3d_is_xserver_process" value="true" /> </application> <application name="Unigine Heaven (32-bit)" executable="heaven_x86"> @@ -767,6 +768,7 @@ TODO: document the other workarounds. <application name="mutter" executable="mutter"> <option name="adaptive_sync" value="false" /> <option name="v3d_nonmsaa_texture_size_limit" value="true" /> + <option name="v3d_maintain_ignorable_scanout" value="true" /> </application> <application name="muffin" executable="muffin"> <option name="adaptive_sync" value="false" /> @@ -818,6 +820,7 @@ TODO: document the other workarounds. </application> <application name="Xorg" executable="Xorg"> <option name="v3d_nonmsaa_texture_size_limit" value="true" /> + <option name="v3d_is_xserver_process" value="true" /> </application> <application name="gfxbench" executable="testfw_app"> diff --git a/src/util/driconf.h b/src/util/driconf.h index 042ee27d9a3..56511f6615e 100644 --- a/src/util/driconf.h +++ b/src/util/driconf.h @@ -521,6 +521,14 @@ DRI_CONF_OPT_B(v3d_nonmsaa_texture_size_limit, def, \ "Report the non-MSAA-only texture size limit") +#define DRI_CONF_V3D_IS_XSERVER_PROCESS(def) \ + DRI_CONF_OPT_B(v3d_is_xserver_process, def, \ + "Identifies if the application is the Xserver.") + +#define DRI_CONF_V3D_MAINTAIN_IGNORABLE_SCANOUT(def) \ + DRI_CONF_OPT_B(v3d_maintain_ignorable_scanout, def, \ + "Maintain SCANOUT usage on resource allocations when the environment allows ignoring SCANOUT usage.") + /** * \brief virgl specific configuration options */ -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0139-Add-a-hack-to-avoid-the-shadow-tex-update-for-import.patch ================================================ From fc1fe85f01a67ef6e5758f1022950ad79b1b305a Mon Sep 17 00:00:00 2001 From: Neil Roberts <nroberts@igalia.com> Date: Mon, 5 Jul 2021 20:19:06 +0200 Subject: [PATCH 139/142] Add a hack to avoid the shadow tex update for imported linear texs This adds a hacky interface so that an application can override the mechanism used to detect when to update the shadow texture which is used when importing a linear texture. The application can enable this by calling: glTexParameteri(GL_TEXTURE_2D, GL_SYNC_CONDITION, 1); And then whenever it determines that the shadow texture should be updated it can call: glTexParameteri(GL_TEXTURE_2D, GL_SYNC_STATUS, 1); (cherry picked from commit 1269e2cfbfa876fdc85037b9435085174d76ad57) --- src/gallium/drivers/v3d/v3d_resource.c | 5 ++++- src/gallium/include/pipe/p_state.h | 4 ++++ src/mesa/main/mtypes.h | 3 +++ src/mesa/main/texparam.c | 18 ++++++++++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/v3d/v3d_resource.c b/src/gallium/drivers/v3d/v3d_resource.c index 46de1b16ae0..8e31acb0ff0 100644 --- a/src/gallium/drivers/v3d/v3d_resource.c +++ b/src/gallium/drivers/v3d/v3d_resource.c @@ -1048,7 +1048,9 @@ v3d_update_shadow_texture(struct pipe_context *pctx, assert(view->texture != pview->texture); - if (shadow->writes == orig->writes && orig->bo->private) + if (shadow->writes == orig->writes && + orig->base.sync_status == 0 && + (orig->bo->private || orig->base.sync_condition)) return; perf_debug("Updating %dx%d@%d shadow for linear texture\n", @@ -1091,6 +1093,7 @@ v3d_update_shadow_texture(struct pipe_context *pctx, } shadow->writes = orig->writes; + orig->base.sync_status = 0; } static struct pipe_surface * diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h index 549e4d21c05..abc58552544 100644 --- a/src/gallium/include/pipe/p_state.h +++ b/src/gallium/include/pipe/p_state.h @@ -610,6 +610,10 @@ struct pipe_resource unsigned bind; /**< bitmask of PIPE_BIND_x */ unsigned flags; /**< bitmask of PIPE_RESOURCE_FLAG_x */ + /* Hack for avoiding sync on v3d */ + unsigned sync_condition; + unsigned sync_status; + /** * For planar images, ie. YUV EGLImage external, etc, pointer to the * next plane. diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 77c38bf48d5..1eb2dac8018 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1058,6 +1058,9 @@ struct gl_texture_object * the pipe_resource *pt above. */ bool needs_validation; + + /* Hack for avoiding sync on v3d */ + GLboolean SyncCondition; }; diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c index 001cc185722..139db3ce3e2 100644 --- a/src/mesa/main/texparam.c +++ b/src/mesa/main/texparam.c @@ -274,6 +274,13 @@ set_tex_parameteri(struct gl_context *ctx, } switch (pname) { + case GL_SYNC_CONDITION: + if (!!texObj->SyncCondition == !!params[0]) + return GL_FALSE; + texObj->SyncCondition = !!params[0]; + return GL_TRUE; + case GL_SYNC_STATUS: + return GL_TRUE; case GL_TEXTURE_MIN_FILTER: if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target)) goto invalid_dsa; @@ -931,6 +938,17 @@ _mesa_texture_parameter_invalidate(struct gl_context *ctx, { if (texparam_invalidates_sampler_views(pname)) st_texture_release_all_sampler_views(st_context(ctx), texObj); + + switch (pname) { + case GL_SYNC_CONDITION: + texObj->pt->sync_condition = texObj->SyncCondition; + break; + case GL_SYNC_STATUS: + texObj->pt->sync_status = 1; + break; + default: + ; /* nothing */ + } } void -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0140-vc4-Fix-mask-RGBA-validation-at-YUV-blit.patch ================================================ From 270deb428f1de371492a5e6185fe410c4329eab4 Mon Sep 17 00:00:00 2001 From: Jose Maria Casanova Crespo <jmcasanova@igalia.com> Date: Mon, 25 Sep 2023 21:16:59 +0200 Subject: [PATCH 140/142] vc4: Fix mask RGBA validation at YUV blit Solves regression on video players using GPU for video decoding that just displays the video in green. Fixes: d13da7782cd80 ("vc4: call blit paths in chain") --- src/gallium/drivers/vc4/vc4_blit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gallium/drivers/vc4/vc4_blit.c b/src/gallium/drivers/vc4/vc4_blit.c index 2cf65b5f585..87b2369b7ad 100644 --- a/src/gallium/drivers/vc4/vc4_blit.c +++ b/src/gallium/drivers/vc4/vc4_blit.c @@ -347,7 +347,7 @@ vc4_yuv_blit(struct pipe_context *pctx, struct pipe_blit_info *info) struct vc4_resource *dst = vc4_resource(info->dst.resource); bool ok; - if (info->mask & PIPE_MASK_RGBA) + if (!(info->mask & PIPE_MASK_RGBA)) return; if (src->tiled) -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0141-vc4-mark-buffers-as-initialized-at-vc4_texture_subda.patch ================================================ From f843fbceb381f8c82074e8b68583fbfe57c48a6e Mon Sep 17 00:00:00 2001 From: Jose Maria Casanova Crespo <jmcasanova@igalia.com> Date: Thu, 8 Jun 2023 00:57:15 +0200 Subject: [PATCH 141/142] vc4: mark buffers as initialized at vc4_texture_subdata This fixes several tests when the initially uploaded buffer from CPU was being ignored because vc4_texture_subdata was not marking the resource as written/initialized. The usage flags management available at vc4_resource_transfer_map is generalized into vc4_map_usage_prep and reused at vc4_resource_transfer_map. This makes vc4 implementation more similar to v3d. This fixes 7 text in the following subgroups: -dEQP-GLES2.functional.fbo.render.texsubimage.* -dEQP-GLES2.functional.texture.specification.basic_copytexsubimage2d.* -spec@arb_clear_texture@arb_clear_texture-* Cc: mesa-stable Reviewed-by: Juan A. Suarez <jasuarez@igalia.com> Reviewed-by: Emma Anholt <emma@anholt.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25297> --- src/broadcom/ci/broadcom-rpi3-fails.txt | 11 ---- src/gallium/drivers/vc4/vc4_resource.c | 71 +++++++++++++++---------- 2 files changed, 44 insertions(+), 38 deletions(-) diff --git a/src/broadcom/ci/broadcom-rpi3-fails.txt b/src/broadcom/ci/broadcom-rpi3-fails.txt index 5522310d91a..e49e77b1436 100644 --- a/src/broadcom/ci/broadcom-rpi3-fails.txt +++ b/src/broadcom/ci/broadcom-rpi3-fails.txt @@ -18,11 +18,6 @@ dEQP-GLES2.functional.clipping.line.wide_line_clip_viewport_corner,Fail dEQP-GLES2.functional.depth_stencil_clear.depth_stencil_masked,Fail -# A glTexImage, glDraw, glTexSubImage sequence into a texture is missing what looks like the drawing. -dEQP-GLES2.functional.fbo.render.texsubimage.after_render_tex2d_rgba,Fail -# A glTexImage, glDraw, glTexSubImage, glDraw sequence into a texture is missing what looks like the first drawing. -dEQP-GLES2.functional.fbo.render.texsubimage.between_render_tex2d_rgba,Fail - # Sampling grid slightly off in test 2? dEQP-GLES2.functional.texture.filtering.2d.nearest_mipmap_linear_linear_mirror_rgba8888,Fail dEQP-GLES2.functional.texture.filtering.2d.nearest_mipmap_linear_linear_repeat_rgba8888,Fail @@ -38,12 +33,6 @@ dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_linear_clamp_non_square,Fa dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_linear_mirror_non_square,Fail dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_linear_repeat_non_square,Fail -# Sequence of glTexImage, glDraw, glCopyTexSubImage. -# background red/green checkerboard on the left side is incorrectly white. -dEQP-GLES2.functional.texture.specification.basic_copytexsubimage2d.2d_rgba,Fail -# Maybe it was copied as RGB instead of RGBA? -dEQP-GLES2.functional.texture.specification.basic_copytexsubimage2d.cube_rgba,Fail - # One of the pixels on the left edge near the bottom is wrong for both min and # mag. Also a line of pixels through the image in minification. dEQP-GLES2.functional.texture.wrap.clamp_clamp_nearest_npot_etc1,Fail diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c index ad2791aa972..0a3a435a46c 100644 --- a/src/gallium/drivers/vc4/vc4_resource.c +++ b/src/gallium/drivers/vc4/vc4_resource.c @@ -95,34 +95,13 @@ vc4_resource_transfer_unmap(struct pipe_context *pctx, slab_free(&vc4->transfer_pool, ptrans); } -static void * -vc4_resource_transfer_map(struct pipe_context *pctx, - struct pipe_resource *prsc, - unsigned level, unsigned usage, - const struct pipe_box *box, - struct pipe_transfer **pptrans) +static void +vc4_map_usage_prep(struct pipe_context *pctx, + struct pipe_resource *prsc, + unsigned usage) { struct vc4_context *vc4 = vc4_context(pctx); struct vc4_resource *rsc = vc4_resource(prsc); - struct vc4_transfer *trans; - struct pipe_transfer *ptrans; - enum pipe_format format = prsc->format; - char *buf; - - /* Upgrade DISCARD_RANGE to WHOLE_RESOURCE if the whole resource is - * being mapped. - */ - if ((usage & PIPE_MAP_DISCARD_RANGE) && - !(usage & PIPE_MAP_UNSYNCHRONIZED) && - !(prsc->flags & PIPE_RESOURCE_FLAG_MAP_PERSISTENT) && - prsc->last_level == 0 && - prsc->width0 == box->width && - prsc->height0 == box->height && - prsc->depth0 == box->depth && - prsc->array_size == 1 && - rsc->bo->private) { - usage |= PIPE_MAP_DISCARD_WHOLE_RESOURCE; - } if (usage & PIPE_MAP_DISCARD_WHOLE_RESOURCE) { if (vc4_resource_bo_alloc(rsc)) { @@ -131,6 +110,8 @@ vc4_resource_transfer_map(struct pipe_context *pctx, */ if (prsc->bind & PIPE_BIND_VERTEX_BUFFER) vc4->dirty |= VC4_DIRTY_VTXBUF; + if (prsc->bind & PIPE_BIND_CONSTANT_BUFFER) + vc4->dirty |= VC4_DIRTY_CONSTBUF; } else { /* If we failed to reallocate, flush users so that we * don't violate any syncing requirements. @@ -139,7 +120,7 @@ vc4_resource_transfer_map(struct pipe_context *pctx, } } else if (!(usage & PIPE_MAP_UNSYNCHRONIZED)) { /* If we're writing and the buffer is being used by the CL, we - * have to flush the CL first. If we're only reading, we need + * have to flush the CL first. If we're only reading, we need * to flush if the CL has written our buffer. */ if (usage & PIPE_MAP_WRITE) @@ -152,6 +133,38 @@ vc4_resource_transfer_map(struct pipe_context *pctx, rsc->writes++; rsc->initialized_buffers = ~0; } +} + +static void * +vc4_resource_transfer_map(struct pipe_context *pctx, + struct pipe_resource *prsc, + unsigned level, unsigned usage, + const struct pipe_box *box, + struct pipe_transfer **pptrans) +{ + struct vc4_context *vc4 = vc4_context(pctx); + struct vc4_resource *rsc = vc4_resource(prsc); + struct vc4_transfer *trans; + struct pipe_transfer *ptrans; + enum pipe_format format = prsc->format; + char *buf; + + /* Upgrade DISCARD_RANGE to WHOLE_RESOURCE if the whole resource is + * being mapped. + */ + if ((usage & PIPE_MAP_DISCARD_RANGE) && + !(usage & PIPE_MAP_UNSYNCHRONIZED) && + !(prsc->flags & PIPE_RESOURCE_FLAG_MAP_PERSISTENT) && + prsc->last_level == 0 && + prsc->width0 == box->width && + prsc->height0 == box->height && + prsc->depth0 == box->depth && + prsc->array_size == 1 && + rsc->bo->private) { + usage |= PIPE_MAP_DISCARD_WHOLE_RESOURCE; + } + + vc4_map_usage_prep(pctx, prsc, usage); trans = slab_zalloc(&vc4->transfer_pool); if (!trans) @@ -240,8 +253,12 @@ vc4_texture_subdata(struct pipe_context *pctx, } /* Otherwise, map and store the texture data directly into the tiled - * texture. + * texture. Note that gallium's texture_subdata may be called with + * obvious usage flags missing! */ + vc4_map_usage_prep(pctx, prsc, usage | (PIPE_MAP_WRITE | + PIPE_MAP_DISCARD_RANGE)); + void *buf; if (usage & PIPE_MAP_UNSYNCHRONIZED) buf = vc4_bo_map_unsynchronized(rsc->bo); -- 2.39.2 ================================================ FILE: projects/RPi/devices/RPi5/patches/mesa/0142-gallium-Add-kmsro-drivers-for-RP1-DSI-DPI-and-VEC-de.patch ================================================ From 3322c102282cf726ae575b122358060abd5b24db Mon Sep 17 00:00:00 2001 From: Dave Stevenson <dave.stevenson@raspberrypi.com> Date: Thu, 5 Oct 2023 19:32:10 +0100 Subject: [PATCH 142/142] gallium: Add kmsro drivers for RP1 DSI, DPI, and VEC devices Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com> --- src/gallium/targets/dri/meson.build | 3 +++ src/gallium/targets/dri/target.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/gallium/targets/dri/meson.build b/src/gallium/targets/dri/meson.build index fbec1da957b..59daf3b6fb6 100644 --- a/src/gallium/targets/dri/meson.build +++ b/src/gallium/targets/dri/meson.build @@ -68,6 +68,9 @@ libgallium_dri = shared_library( foreach d : [[with_gallium_kmsro, [ 'armada-drm_dri.so', + 'drm-rp1-dpi_dri.so', + 'drm-rp1-dsi_dri.so', + 'drm-rp1-vec_dri.so', 'exynos_dri.so', 'hx8357d_dri.so', 'ili9225_dri.so', diff --git a/src/gallium/targets/dri/target.c b/src/gallium/targets/dri/target.c index d506869cbb4..ecb25edd03b 100644 --- a/src/gallium/targets/dri/target.c +++ b/src/gallium/targets/dri/target.c @@ -98,6 +98,9 @@ DEFINE_LOADER_DRM_ENTRYPOINT(tegra); #if defined(GALLIUM_KMSRO) DEFINE_LOADER_DRM_ENTRYPOINT(armada_drm) +DEFINE_LOADER_DRM_ENTRYPOINT(drm_rp1_dpi) +DEFINE_LOADER_DRM_ENTRYPOINT(drm_rp1_dsi) +DEFINE_LOADER_DRM_ENTRYPOINT(drm_rp1_vec) DEFINE_LOADER_DRM_ENTRYPOINT(exynos) DEFINE_LOADER_DRM_ENTRYPOINT(hx8357d) DEFINE_LOADER_DRM_ENTRYPOINT(ili9225) -- 2.39.2 ================================================ FILE: projects/RPi/filesystem/usr/bin/cputemp ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) TEMP="$(cat /sys/class/thermal/thermal_zone0/temp)" echo "$(( $TEMP / 1000 )) C" ================================================ FILE: projects/RPi/filesystem/usr/lib/udev/rules.d/80-alsa-preallocsize.rules ================================================ ACTION=="add", SUBSYSTEM=="sound", KERNEL=="pcmC*", ATTRS{id}=="vc4hdmi*", \ ENV{.snd_card}="$id", \ RUN+="/bin/sh -c 'echo 1280 > /proc/asound/$env{.snd_card}/pcm0p/sub0/prealloc'" ================================================ FILE: projects/RPi/filesystem/usr/share/alsa/cards/RPi-WM8804.conf ================================================ <confdir:pcm/iec958.conf> RPi-WM8804.pcm.iec958.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type hooks slave.pcm { type hw card $CARD } } ================================================ FILE: projects/RPi/filesystem/usr/share/alsa/cards/bcm2835_alsa.conf ================================================ <confdir:pcm/iec958.conf> bcm2835_alsa.pcm.iec958.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type hooks slave.pcm { type hw card $CARD device 1 } hooks.0 { type ctl_elems hook_args [ { interface PCM name "IEC958 Playback Default" lock true preserve true value [ $AES0 $AES1 $AES2 $AES3 ] } ] } } ================================================ FILE: projects/RPi/kodi/advancedsettings.xml ================================================ <advancedsettings> <fanartres>720</fanartres> <imageres>540</imageres> </advancedsettings> ================================================ FILE: projects/RPi/kodi/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8" ?> <settings version="1"> <section id="system"> <category id="audio"> <group id="1"> <setting id="audiooutput.audiodevice"> <default>ALSA:hdmi:CARD=vc4hdmi,DEV=0</default> </setting> </group> </category> <category id="display"> <group id="1"> <setting id="videoscreen.limitguisize"> <visible>true</visible> <default>3</default> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/RPi/options ================================================ ################################################################################ # setup system defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in arm) # Valid TARGET_CPU for Raspberry Pi based devices are: # arm1176jzf-s cortex-a7 cortex-a53 if [ "$DEVICE" = "RPi" ]; then TARGET_CPU="arm1176jzf-s" elif [ "$DEVICE" = "RPi2" ]; then TARGET_CPU="cortex-a7" elif [ "$DEVICE" = "RPi4" ]; then TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc" fi # TARGET_FLOAT: # Specifies which floating-point ABI to use. Permissible values are: # soft hard TARGET_FLOAT="hard" # Valid TARGET_FPU for Raspberry Pi based devices: # This specifies what floating point hardware (or hardware emulation) is # available on the target. Permissible names are: # vfp neon-vfpv4 neon-fp-armv8 if [ "$DEVICE" = "RPi" ]; then TARGET_FPU="vfp" elif [ "$DEVICE" = "RPi2" ]; then TARGET_FPU="neon-vfpv4" elif [ "$DEVICE" = "RPi4" ]; then TARGET_FPU="neon-fp-armv8" fi ;; esac # Bootloader to use (bcm2835-bootloader) BOOTLOADER="bcm2835-bootloader" # Kernel target KERNEL_TARGET="zImage" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="dtbs" # Additional kernel dependencies KERNEL_EXTRA_DEPENDS_TARGET="" # Kernel to use. values can be: # default: default mainline kernel LINUX="raspberrypi" # use framebuffer console EXTRA_CMDLINE="console=tty0" ################################################################################ # setup build defaults ################################################################################ # Project CFLAGS PROJECT_CFLAGS="" # SquashFS compression method (gzip / lzo / xz / zstd) SQUASHFS_COMPRESSION="zstd" ################################################################################ # setup project defaults ################################################################################ # OpenGL(X) implementation to use (no / mesa) OPENGL="no" # OpenGL-ES implementation to use (no / bcm2835-driver / mesa) OPENGLES="mesa" # Vulkan implementation to use (vulkan-loader / no) VULKAN="no" # Displayserver to use (wl / no) DISPLAYSERVER="no" # Windowmanager to use (weston / no) WINDOWMANAGER="no" # Xorg Graphic drivers to use (all / vc4 / none) # Space separated list is supported, # e.g. GRAPHIC_DRIVERS="vc4" GRAPHIC_DRIVERS="vc4" # KODI Player implementation to use (default / bcm2835-driver / mesa) KODIPLAYER_DRIVER="mesa" # use the kernel CEC framework for libcec (yes / no) CEC_FRAMEWORK_SUPPORT="yes" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" FIRMWARE="misc-firmware wlan-firmware dvb-firmware brcmfmac_sdio-firmware-rpi" # build with installer (yes / no) INSTALLER_SUPPORT="no" # kernel image name KERNEL_NAME="kernel.img" # additional drivers to install: # for a list of additional drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS+=" DRIVER1 DRIVER2" ADDITIONAL_DRIVERS+=" bcm2835-driver" if [ "${ALSA_SUPPORT}" = "yes" ]; then ADDITIONAL_DRIVERS+=" rpi-cirrus-config" fi # build and install driver addons (yes / no) DRIVER_ADDONS_SUPPORT="no" # driver addons to install: # for a list of additional drivers see packages/linux-driver-addons # Space separated list is supported, DRIVER_ADDONS="crazycat dvb-latest" # debug tty path DEBUG_TTY="/dev/console" ================================================ FILE: projects/RPi/packages/linux/modprobe.d/ath9k.conf ================================================ # ath9k.conf: setup modload options for module ath9k. # # enable "Channel Context support" to avoid buffering in live TV options ath9k use_chanctx=1 ================================================ FILE: projects/RPi/packages/systemd/scripts/cpufreq ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2015 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) SYS_CPUFREQ_GOV=$( cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor ) SYS_ONDEMAND_DIR="/sys/devices/system/cpu/cpufreq/ondemand/" # Configure frequency scaling properties if [ "${SYS_CPUFREQ_GOV}" = "ondemand" ]; then echo 1 > "${SYS_ONDEMAND_DIR}/io_is_busy" echo 50 > "${SYS_ONDEMAND_DIR}/up_threshold" echo 100000 > "${SYS_ONDEMAND_DIR}/sampling_rate" echo 50 > "${SYS_ONDEMAND_DIR}/sampling_down_factor" else echo "cpufreq: settings not found for current cpu governor." | systemd-cat -p info fi ================================================ FILE: projects/RPi/patches/kodi/0001-CDVDVideoCodecDRMPRIME-Also-support-YUV420-buffers.patch ================================================ From 97d39a46091b65e4355ce7e545bdec46ff2f87de Mon Sep 17 00:00:00 2001 From: popcornmix <popcornmix@gmail.com> Date: Sat, 11 Sep 2021 14:03:05 +0100 Subject: [PATCH 1/7] CDVDVideoCodecDRMPRIME: Also support YUV420 buffers CDVDVideoCodecDRMPRIME: Add support for deinterlace of sw decoded buffers Need to call SetDimensions earlier and store the drm descriptor in expected place --- .../DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp index 20a5c24f53..a36107c515 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp @@ -582,7 +582,7 @@ bool CDVDVideoCodecDRMPRIME::SetPictureParams(VideoPicture* pVideoPicture) pVideoPicture->videoBuffer = nullptr; } - if (IsSupportedHwFormat(static_cast<AVPixelFormat>(m_pFrame->format))) + if (m_pFrame->format == AV_PIX_FMT_DRM_PRIME) { CVideoBufferDRMPRIMEFFmpeg* buffer = dynamic_cast<CVideoBufferDRMPRIMEFFmpeg*>(m_videoBufferPool->Get()); @@ -660,7 +660,7 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) const AVFilter* srcFilter = avfilter_get_by_name("buffer"); const AVFilter* outFilter = avfilter_get_by_name("buffersink"); - enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_DRM_PRIME, AV_PIX_FMT_NONE }; + enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_DRM_PRIME, AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }; std::string args = StringUtils::Format("video_size={}x{}:pix_fmt={}:time_base={}/{}:" "pixel_aspect={}/{}", @@ -808,6 +808,16 @@ void CDVDVideoCodecDRMPRIME::FilterClose() CDVDVideoCodec::VCReturn CDVDVideoCodecDRMPRIME::ProcessFilterIn() { + // sw decoded buffers need cache flush and for descripter to be set + if (!IsSupportedHwFormat(static_cast<AVPixelFormat>(m_pFrame->format)) && m_pFrame->opaque != nullptr) + { + CVideoBufferDMA* buffer = static_cast<CVideoBufferDMA*>(m_pFrame->opaque); + buffer->SetDimensions(m_pFrame->width, m_pFrame->height); + buffer->SyncEnd(); + auto descriptor = buffer->GetDescriptor(); + m_pFrame->data[0] = reinterpret_cast<uint8_t*>(descriptor); + } + int ret = av_buffersrc_add_frame(m_pFilterIn, m_pFrame); if (ret < 0) { -- 2.39.2 ================================================ FILE: projects/RPi/patches/kodi/0002-gbm-Set-max-bpc-for-high-bit-depth-videos.patch ================================================ From 42b30508bfe5451d4dc2884acfde9e0ec2d58c92 Mon Sep 17 00:00:00 2001 From: Dom Cobley <popcornmix@gmail.com> Date: Fri, 3 Dec 2021 16:00:50 +0000 Subject: [PATCH 2/7] gbm: Set max bpc for high bit depth videos --- .../HwDecRender/VideoLayerBridgeDRMPRIME.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp index 4b8ee5afbb..bd6623e8d1 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp @@ -34,6 +34,14 @@ void CVideoLayerBridgeDRMPRIME::Disable() { // disable video plane auto plane = m_DRM->GetVideoPlane(); + auto connector = m_DRM->GetConnector(); + + // reset max bpc back to default of 8 + int bpc = 8; + bool result = m_DRM->AddProperty(connector, "max bpc", bpc); + CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", + __FUNCTION__, bpc, result); + m_DRM->AddProperty(plane, "FB_ID", 0); m_DRM->AddProperty(plane, "CRTC_ID", 0); @@ -175,6 +183,14 @@ void CVideoLayerBridgeDRMPRIME::Configure(CVideoBufferDRMPRIME* buffer) std::tie(result, value) = plane->GetPropertyValue("COLOR_RANGE", GetColorRange(picture)); if (result) m_DRM->AddProperty(plane, "COLOR_RANGE", value); + + // set max bpc to allow the drm driver to choose a deep colour mode + int bpc = buffer->GetPicture().colorBits > 8 ? 12 : 8; + auto connector = m_DRM->GetConnector(); + result = m_DRM->AddProperty(connector, "max bpc", bpc); + CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", __FUNCTION__, + bpc, result); + } void CVideoLayerBridgeDRMPRIME::SetVideoPlane(CVideoBufferDRMPRIME* buffer, const CRect& destRect) -- 2.39.2 ================================================ FILE: projects/RPi/patches/kodi/0003-CVideoLayerBridgeDRMPRIME-add-colourspace-connector-.patch ================================================ From 0b9b204c6560f3aff39697f92616b48102840dfe Mon Sep 17 00:00:00 2001 From: Lukas Rusak <lorusak@gmail.com> Date: Mon, 29 Apr 2019 18:48:45 -0700 Subject: [PATCH 3/7] CVideoLayerBridgeDRMPRIME add colourspace connector property --- .../Buffers/VideoBufferDRMPRIME.cpp | 12 ++++++++++++ .../VideoPlayer/Buffers/VideoBufferDRMPRIME.h | 1 + .../HwDecRender/VideoLayerBridgeDRMPRIME.cpp | 19 +++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp index b1c23ffc3d..a5fb7ddf44 100644 --- a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp +++ b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp @@ -20,6 +20,18 @@ extern "C" namespace DRMPRIME { +std::string GetColorimetry(const VideoPicture& picture) +{ + switch (picture.color_space) + { + case AVCOL_SPC_BT2020_CL: + case AVCOL_SPC_BT2020_NCL: + return "BT2020_RGB"; + } + + return "Default"; +} + std::string GetColorEncoding(const VideoPicture& picture) { switch (picture.color_space) diff --git a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h index e77f75b58b..4de9732308 100644 --- a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h +++ b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h @@ -34,6 +34,7 @@ enum hdmi_eotf HDMI_EOTF_BT_2100_HLG, }; +std::string GetColorimetry(const VideoPicture& picture); std::string GetColorEncoding(const VideoPicture& picture); std::string GetColorRange(const VideoPicture& picture); uint8_t GetEOTF(const VideoPicture& picture); diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp index bd6623e8d1..a1342595c6 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp @@ -42,6 +42,16 @@ void CVideoLayerBridgeDRMPRIME::Disable() CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", __FUNCTION__, bpc, result); + uint64_t value; + std::tie(result, value) = connector->GetPropertyValue("Colorspace", "Default"); + if (result) + { + CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting connector colorspace to Default", + __FUNCTION__); + m_DRM->AddProperty(connector, "Colorspace", value); + m_DRM->SetActive(true); + } + m_DRM->AddProperty(plane, "FB_ID", 0); m_DRM->AddProperty(plane, "CRTC_ID", 0); @@ -191,6 +201,15 @@ void CVideoLayerBridgeDRMPRIME::Configure(CVideoBufferDRMPRIME* buffer) CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", __FUNCTION__, bpc, result); + std::tie(result, value) = connector->GetPropertyValue("Colorspace", GetColorimetry(picture)); + if (result) + { + CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting connector colorspace to {}", + __FUNCTION__, GetColorimetry(picture)); + m_DRM->AddProperty(connector, "Colorspace", value); + m_DRM->SetActive(true); + } + } void CVideoLayerBridgeDRMPRIME::SetVideoPlane(CVideoBufferDRMPRIME* buffer, const CRect& destRect) -- 2.39.2 ================================================ FILE: projects/RPi/patches/kodi/0004-CDVDVideoCodecDRMPRIME-Adjust-av-formats-to-match-re.patch ================================================ From 518d8487d090af854fb72a7d0e5efc075d97228c Mon Sep 17 00:00:00 2001 From: Dom Cobley <popcornmix@gmail.com> Date: Wed, 18 Jan 2023 16:41:00 +0000 Subject: [PATCH 4/7] CDVDVideoCodecDRMPRIME: Adjust av formats to match recent ffmpeg changes --- .../VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp index a36107c515..d5b3289680 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp @@ -319,6 +319,7 @@ bool CDVDVideoCodecDRMPRIME::Open(CDVDStreamInfo& hints, CDVDCodecOptions& optio m_pCodecContext->bits_per_coded_sample = hints.bitsperpixel; m_pCodecContext->time_base.num = 1; m_pCodecContext->time_base.den = DVD_TIME_BASE; + m_pCodecContext->thread_safe_callbacks = 1; m_pCodecContext->thread_count = CServiceBroker::GetCPUInfo()->GetCPUCount(); if (hints.extradata && hints.extrasize > 0) @@ -660,13 +661,13 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) const AVFilter* srcFilter = avfilter_get_by_name("buffer"); const AVFilter* outFilter = avfilter_get_by_name("buffersink"); - enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_DRM_PRIME, AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }; + enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_DRM_PRIME, AV_PIX_FMT_NONE }; std::string args = StringUtils::Format("video_size={}x{}:pix_fmt={}:time_base={}/{}:" "pixel_aspect={}/{}", m_pCodecContext->width, m_pCodecContext->height, - m_pCodecContext->pix_fmt, + AV_PIX_FMT_DRM_PRIME, m_pCodecContext->time_base.num ? m_pCodecContext->time_base.num : 1, m_pCodecContext->time_base.num ? @@ -818,6 +819,7 @@ CDVDVideoCodec::VCReturn CDVDVideoCodecDRMPRIME::ProcessFilterIn() m_pFrame->data[0] = reinterpret_cast<uint8_t*>(descriptor); } + m_pFrame->format = AV_PIX_FMT_DRM_PRIME; int ret = av_buffersrc_add_frame(m_pFilterIn, m_pFrame); if (ret < 0) { -- 2.39.2 ================================================ FILE: projects/RPi/patches/kodi/0005-DVDVideoCodecDRMPRIME-Support-YUV422-and-YUV444-form.patch ================================================ From a11461db2d442e0648ebb9255a2399a647d8f5be Mon Sep 17 00:00:00 2001 From: Dom Cobley <popcornmix@gmail.com> Date: Wed, 25 Jan 2023 18:42:24 +0000 Subject: [PATCH 5/7] DVDVideoCodecDRMPRIME: Support YUV422 and YUV444 formats See: https://github.com/xbmc/xbmc/issues/20017 We currently can't play YUV422 and YUV444 videos with drm but they can be made to work with straightforward plumbing --- .../Buffers/VideoBufferPoolDMA.cpp | 6 +++++ .../DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp | 27 +++++++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/xbmc/cores/VideoPlayer/Buffers/VideoBufferPoolDMA.cpp b/xbmc/cores/VideoPlayer/Buffers/VideoBufferPoolDMA.cpp index fb2dfc6c78..e6b071117e 100644 --- a/xbmc/cores/VideoPlayer/Buffers/VideoBufferPoolDMA.cpp +++ b/xbmc/cores/VideoPlayer/Buffers/VideoBufferPoolDMA.cpp @@ -123,6 +123,12 @@ uint32_t CVideoBufferPoolDMA::TranslateFormat(AVPixelFormat format) case AV_PIX_FMT_YUV420P: case AV_PIX_FMT_YUVJ420P: return DRM_FORMAT_YUV420; + case AV_PIX_FMT_YUV422P: + case AV_PIX_FMT_YUVJ422P: + return DRM_FORMAT_YUV422; + case AV_PIX_FMT_YUV444P: + case AV_PIX_FMT_YUVJ444P: + return DRM_FORMAT_YUV444; default: return 0; } diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp index d5b3289680..4af903ecf5 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp @@ -142,7 +142,8 @@ static bool IsSupportedHwFormat(const enum AVPixelFormat fmt) static bool IsSupportedSwFormat(const enum AVPixelFormat fmt) { - return fmt == AV_PIX_FMT_YUV420P || fmt == AV_PIX_FMT_YUVJ420P; + return fmt == AV_PIX_FMT_YUV420P || fmt == AV_PIX_FMT_YUVJ420P || fmt == AV_PIX_FMT_YUV422P || + fmt == AV_PIX_FMT_YUVJ422P || fmt == AV_PIX_FMT_YUV444P || fmt == AV_PIX_FMT_YUVJ444P; } static const AVCodecHWConfig* FindHWConfig(const AVCodec* codec) @@ -206,7 +207,14 @@ enum AVPixelFormat CDVDVideoCodecDRMPRIME::GetFormat(struct AVCodecContext* avct } } - CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::{} - unsupported pixel format", __FUNCTION__); + std::vector<std::string> formats; + for (int n = 0; fmt[n] != AV_PIX_FMT_NONE; n++) + { + formats.emplace_back(av_get_pix_fmt_name(fmt[n])); + } + CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::{} - no supported pixel formats: {}", __FUNCTION__, + StringUtils::Join(formats, ", ")); + return AV_PIX_FMT_NONE; } @@ -226,6 +234,14 @@ int CDVDVideoCodecDRMPRIME::GetBuffer(struct AVCodecContext* avctx, AVFrame* fra case AV_PIX_FMT_YUVJ420P: size = width * height * 3 / 2; break; + case AV_PIX_FMT_YUV422P: + case AV_PIX_FMT_YUVJ422P: + size = width * height * 2; + break; + case AV_PIX_FMT_YUV444P: + case AV_PIX_FMT_YUVJ444P: + size = width * height * 3; + break; default: return -1; } @@ -512,9 +528,10 @@ bool CDVDVideoCodecDRMPRIME::SetPictureParams(VideoPicture* pVideoPicture) (static_cast<int>(lrint(pVideoPicture->iWidth / aspect_ratio))) & -3; } - pVideoPicture->color_range = m_pFrame->color_range == AVCOL_RANGE_JPEG || - m_pFrame->format == AV_PIX_FMT_YUVJ420P || - m_hints.colorRange == AVCOL_RANGE_JPEG; + pVideoPicture->color_range = + m_pFrame->color_range == AVCOL_RANGE_JPEG || m_pFrame->format == AV_PIX_FMT_YUVJ420P || + m_pFrame->format == AV_PIX_FMT_YUVJ422P || m_pFrame->format == AV_PIX_FMT_YUVJ444P || + m_hints.colorRange == AVCOL_RANGE_JPEG; pVideoPicture->color_primaries = m_pFrame->color_primaries == AVCOL_PRI_UNSPECIFIED ? m_hints.colorPrimaries : m_pFrame->color_primaries; -- 2.39.2 ================================================ FILE: projects/RPi/patches/kodi/0006-VideoBufferDMA-Support-exporting-YCbCr444-buffers.patch ================================================ From 7b820fa6812e8389613238c6ab3a12fc1dee0276 Mon Sep 17 00:00:00 2001 From: Dom Cobley <popcornmix@gmail.com> Date: Tue, 31 Jan 2023 14:13:00 +0000 Subject: [PATCH 6/7] VideoBufferDMA: Support exporting YCbCr444 buffers The current code assumes chroma is decimated by two, but that is not necessarily the case. DRMPRIME decode with EGL rendering of YCbCr444 video will have corrupted colours. Ask ffmpeg what the chroma decimation is. --- .../VideoPlayer/Buffers/VideoBufferDMA.cpp | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDMA.cpp b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDMA.cpp index 2dd7c1341d..3e6bf0dc7a 100644 --- a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDMA.cpp +++ b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDMA.cpp @@ -119,20 +119,27 @@ bool CVideoBufferDMA::Alloc() void CVideoBufferDMA::Export(AVFrame* frame, uint32_t width, uint32_t height) { - m_planes = av_pix_fmt_count_planes(static_cast<AVPixelFormat>(frame->format)); + AVPixelFormat pix_fmt = static_cast<AVPixelFormat>(frame->format); + m_planes = av_pix_fmt_count_planes(pix_fmt); + int h_shift; + int v_shift; - if (m_planes < 2) - throw std::runtime_error( - "non-planar formats not supported: " + - std::string(av_get_pix_fmt_name(static_cast<AVPixelFormat>(frame->format)))); + if (av_pix_fmt_get_chroma_sub_sample(pix_fmt, &h_shift, &v_shift)) + throw std::runtime_error("unable to determine chroma_sub_sample: " + + std::string(av_get_pix_fmt_name(pix_fmt))); + + if (m_planes < 2 || m_planes > 3) + throw std::runtime_error("only 2 or 3 plane formats supported: " + + std::string(av_get_pix_fmt_name(pix_fmt))); for (uint32_t plane = 0; plane < m_planes; plane++) { m_strides[plane] = av_image_get_linesize(static_cast<AVPixelFormat>(frame->format), width, plane); - m_offsets[plane] = - plane == 0 ? 0 : (m_offsets[plane - 1] + m_strides[plane - 1] * (height >> (plane - 1))); } + m_offsets[0] = 0; + m_offsets[1] = m_strides[0] * height; + m_offsets[2] = m_offsets[1] + (m_strides[1] * height >> v_shift); if (CServiceBroker::GetLogging().CanLogComponent(LOGVIDEO)) { -- 2.39.2 ================================================ FILE: projects/RPi/patches/kodi/0007-DVDVideoCodecDRMPRIME-Add-support-for-arbitrary-outp.patch ================================================ From ae91030c1a84693fd0d34b919f9f8434b08e00c9 Mon Sep 17 00:00:00 2001 From: Dom Cobley <popcornmix@gmail.com> Date: Mon, 6 Feb 2023 15:19:51 +0000 Subject: [PATCH 7/7] DVDVideoCodecDRMPRIME: Add support for arbitrary output pixel formats This enables any ffmpeg pixel formats to be supported by DRMPRIME decoder by creating a scale ffmpeg filter to convert it to a supported format. This allows formats like h264 Hi10P and hevc 12-bit 444 to be software decoded, converted and displayed through DRM. This will be a cheaper path than disabling DRMPRIME, which is also software decode, convert, but then needs convert to texture and display through GL. And it happens automatically without requiring user video settings --- .../DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp | 124 +++++++++++------- .../DVDCodecs/Video/DVDVideoCodecDRMPRIME.h | 3 +- 2 files changed, 77 insertions(+), 50 deletions(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp index 4af903ecf5..92a182608d 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp @@ -199,7 +199,7 @@ enum AVPixelFormat CDVDVideoCodecDRMPRIME::GetFormat(struct AVCodecContext* avct { for (int n = 0; fmt[n] != AV_PIX_FMT_NONE; n++) { - if (IsSupportedHwFormat(fmt[n]) || IsSupportedSwFormat(fmt[n])) + //if (IsSupportedHwFormat(fmt[n]) || IsSupportedSwFormat(fmt[n])) { CDVDVideoCodecDRMPRIME* ctx = static_cast<CDVDVideoCodecDRMPRIME*>(avctx->opaque); ctx->UpdateProcessInfo(avctx, fmt[n]); @@ -220,7 +220,8 @@ enum AVPixelFormat CDVDVideoCodecDRMPRIME::GetFormat(struct AVCodecContext* avct int CDVDVideoCodecDRMPRIME::GetBuffer(struct AVCodecContext* avctx, AVFrame* frame, int flags) { - if (IsSupportedSwFormat(static_cast<AVPixelFormat>(frame->format))) + AVPixelFormat pix_fmt = static_cast<AVPixelFormat>(frame->format); + if (IsSupportedSwFormat(pix_fmt)) { int width = frame->width; int height = frame->height; @@ -228,7 +229,7 @@ int CDVDVideoCodecDRMPRIME::GetBuffer(struct AVCodecContext* avctx, AVFrame* fra AlignedSize(avctx, width, height); int size; - switch (avctx->pix_fmt) + switch (pix_fmt) { case AV_PIX_FMT_YUV420P: case AV_PIX_FMT_YUVJ420P: @@ -248,13 +249,12 @@ int CDVDVideoCodecDRMPRIME::GetBuffer(struct AVCodecContext* avctx, AVFrame* fra CDVDVideoCodecDRMPRIME* ctx = static_cast<CDVDVideoCodecDRMPRIME*>(avctx->opaque); auto buffer = dynamic_cast<CVideoBufferDMA*>( - ctx->m_processInfo.GetVideoBufferManager().Get(avctx->pix_fmt, size, nullptr)); + ctx->m_processInfo.GetVideoBufferManager().Get(pix_fmt, size, nullptr)); if (!buffer) return -1; - frame->opaque = static_cast<void*>(buffer); frame->opaque_ref = - av_buffer_create(nullptr, 0, ReleaseBuffer, frame->opaque, AV_BUFFER_FLAG_READONLY); + av_buffer_create(nullptr, 0, ReleaseBuffer, static_cast<void*>(buffer), AV_BUFFER_FLAG_READONLY); buffer->Export(frame, width, height); buffer->SyncStart(); @@ -608,9 +608,9 @@ bool CDVDVideoCodecDRMPRIME::SetPictureParams(VideoPicture* pVideoPicture) buffer->SetRef(m_pFrame); pVideoPicture->videoBuffer = buffer; } - else if (m_pFrame->opaque) + else if (IsSupportedSwFormat(static_cast<AVPixelFormat>(m_pFrame->format))) { - CVideoBufferDMA* buffer = static_cast<CVideoBufferDMA*>(m_pFrame->opaque); + CVideoBufferDMA* buffer = static_cast<CVideoBufferDMA*>(av_buffer_get_opaque(m_pFrame->buf[0])); buffer->SetPictureParams(*pVideoPicture); buffer->Acquire(); buffer->SyncEnd(); @@ -644,13 +644,13 @@ void CDVDVideoCodecDRMPRIME::FilterTest() if (name.find("deinterlace") != std::string::npos) { - if (FilterOpen(name, true)) + bool ret = FilterOpen(name, false, true); + FilterClose(); + if (ret) { m_deintFilterName = name; - CLog::Log(LOGDEBUG, "CDVDVideoCodecDRMPRIME::{} - found deinterlacing filter {}", __FUNCTION__, name); - return; } } @@ -660,14 +660,31 @@ void CDVDVideoCodecDRMPRIME::FilterTest() __FUNCTION__); } -bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) +AVFrame *CDVDVideoCodecDRMPRIME::alloc_filter_frame(AVFilterContext * ctx, void * v, int w, int h) +{ + int result; + CDVDVideoCodecDRMPRIME* me = static_cast<CDVDVideoCodecDRMPRIME*>(v); + AVFrame *frame = av_frame_alloc(); + frame->width = w; + frame->height = h; + frame->format = AV_PIX_FMT_YUV420P; + + if ((result = CDVDVideoCodecDRMPRIME::GetBuffer(me->m_pCodecContext, frame, 0)) < 0) + { + CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::alloc_filter_frame - failed to GetBuffer ({})", result); + return nullptr; + } + return frame; +} + +bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool scale, bool test) { int result; if (m_pFilterGraph) FilterClose(); - if (filters.empty()) + if (filters.empty() && !scale) return true; if (!(m_pFilterGraph = avfilter_graph_alloc())) @@ -678,13 +695,13 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) const AVFilter* srcFilter = avfilter_get_by_name("buffer"); const AVFilter* outFilter = avfilter_get_by_name("buffersink"); - enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_DRM_PRIME, AV_PIX_FMT_NONE }; + enum AVPixelFormat pix_fmts[] = { scale ? AV_PIX_FMT_YUV420P : AV_PIX_FMT_DRM_PRIME, AV_PIX_FMT_NONE }; std::string args = StringUtils::Format("video_size={}x{}:pix_fmt={}:time_base={}/{}:" "pixel_aspect={}/{}", m_pCodecContext->width, m_pCodecContext->height, - AV_PIX_FMT_DRM_PRIME, + scale ? m_pCodecContext->pix_fmt : AV_PIX_FMT_DRM_PRIME, m_pCodecContext->time_base.num ? m_pCodecContext->time_base.num : 1, m_pCodecContext->time_base.num ? @@ -703,7 +720,6 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - avfilter_graph_create_filter: src: {} ({})", err, result); - FilterClose(); return false; } @@ -711,7 +727,6 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) if (!par) { CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - unable to alloc buffersrc"); - FilterClose(); return false; } @@ -727,7 +742,6 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - av_buffersrc_parameters_set: {} ({})", err, result); - FilterClose(); return false; } av_freep(&par); @@ -741,7 +755,6 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - avfilter_graph_create_filter: out: {} ({})", err, result); - FilterClose(); return false; } @@ -750,32 +763,46 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) if (result < 0) { CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - failed settings pix formats"); - FilterClose(); return false; } - AVFilterInOut* outputs = avfilter_inout_alloc(); - AVFilterInOut* inputs = avfilter_inout_alloc(); + if (!filters.empty()) + { + AVFilterInOut* outputs = avfilter_inout_alloc(); + AVFilterInOut* inputs = avfilter_inout_alloc(); - outputs->name = av_strdup("in"); - outputs->filter_ctx = m_pFilterIn; - outputs->pad_idx = 0; - outputs->next = nullptr; + outputs->name = av_strdup("in"); + outputs->filter_ctx = m_pFilterIn; + outputs->pad_idx = 0; + outputs->next = nullptr; - inputs->name = av_strdup("out"); - inputs->filter_ctx = m_pFilterOut; - inputs->pad_idx = 0; - inputs->next = nullptr; + inputs->name = av_strdup("out"); + inputs->filter_ctx = m_pFilterOut; + inputs->pad_idx = 0; + inputs->next = nullptr; - result = avfilter_graph_parse_ptr(m_pFilterGraph, filters.c_str(), &inputs, &outputs, NULL); - avfilter_inout_free(&outputs); - avfilter_inout_free(&inputs); + result = avfilter_graph_parse_ptr(m_pFilterGraph, filters.c_str(), &inputs, &outputs, NULL); + avfilter_inout_free(&outputs); + avfilter_inout_free(&inputs); - if (result < 0) + if (result < 0) + { + CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - avfilter_graph_parse"); + return false; + } + } + else { - CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - avfilter_graph_parse"); - FilterClose(); - return false; + if ((result = av_buffersink_set_alloc_video_frame(m_pFilterOut, alloc_filter_frame, static_cast<void*>(this))) < 0) + { + CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - av_buffersink_set_alloc_video_frame = {}", result); + return result; + } + if ((result = avfilter_link(m_pFilterIn, 0, m_pFilterOut, 0)) < 0) + { + CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - avfilter_link"); + return false; + } } if ((result = avfilter_graph_config(m_pFilterGraph, nullptr)) < 0) @@ -784,15 +811,11 @@ bool CDVDVideoCodecDRMPRIME::FilterOpen(const std::string& filters, bool test) av_strerror(result, err, AV_ERROR_MAX_STRING_SIZE); CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::FilterOpen - avfilter_graph_config: {} ({})", err, result); - FilterClose(); return false; } if (test) - { - FilterClose(); return true; - } m_processInfo.SetVideoDeintMethod(filters); @@ -827,16 +850,16 @@ void CDVDVideoCodecDRMPRIME::FilterClose() CDVDVideoCodec::VCReturn CDVDVideoCodecDRMPRIME::ProcessFilterIn() { // sw decoded buffers need cache flush and for descripter to be set - if (!IsSupportedHwFormat(static_cast<AVPixelFormat>(m_pFrame->format)) && m_pFrame->opaque != nullptr) + if (!IsSupportedHwFormat(static_cast<AVPixelFormat>(m_pFrame->format)) && IsSupportedSwFormat(static_cast<AVPixelFormat>(m_pFrame->format))) { - CVideoBufferDMA* buffer = static_cast<CVideoBufferDMA*>(m_pFrame->opaque); + CVideoBufferDMA* buffer = static_cast<CVideoBufferDMA*>(av_buffer_get_opaque(m_pFrame->buf[0])); buffer->SetDimensions(m_pFrame->width, m_pFrame->height); buffer->SyncEnd(); auto descriptor = buffer->GetDescriptor(); m_pFrame->data[0] = reinterpret_cast<uint8_t*>(descriptor); + m_pFrame->format = AV_PIX_FMT_DRM_PRIME; } - m_pFrame->format = AV_PIX_FMT_DRM_PRIME; int ret = av_buffersrc_add_frame(m_pFilterIn, m_pFrame); if (ret < 0) { @@ -929,25 +952,28 @@ CDVDVideoCodec::VCReturn CDVDVideoCodecDRMPRIME::GetPicture(VideoPicture* pVideo return VC_ERROR; } + // we need to scale if the buffer isn't in DRM_PRIME format + bool need_scale = !IsSupportedSwFormat(static_cast<AVPixelFormat>(m_pFrame->format)) && !IsSupportedHwFormat(static_cast<AVPixelFormat>(m_pFrame->format)); + if (!m_processInfo.GetVideoInterlaced() && m_pFrame->interlaced_frame) m_processInfo.SetVideoInterlaced(true); std::string filterChain = GetFilterChain(m_pFrame->interlaced_frame); - if (!filterChain.empty()) + if (!filterChain.empty() || need_scale) { bool reopenFilter = false; if (m_filters != filterChain) reopenFilter = true; if (m_pFilterGraph && - (m_pFilterIn->outputs[0]->w != m_pCodecContext->width || - m_pFilterIn->outputs[0]->h != m_pCodecContext->height)) + (m_pFilterIn->outputs[0]->w != m_pFrame->width || + m_pFilterIn->outputs[0]->h != m_pFrame->height)) reopenFilter = true; - if (reopenFilter) + if (reopenFilter || (need_scale && m_pFilterGraph == nullptr)) { m_filters = filterChain; - if (!FilterOpen(filterChain, false)) + if (!FilterOpen(filterChain, need_scale, false)) FilterClose(); } diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.h b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.h index fab3431d40..bb88fde1f9 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.h +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.h @@ -44,7 +44,8 @@ protected: CDVDVideoCodec::VCReturn ProcessFilterOut(); static enum AVPixelFormat GetFormat(struct AVCodecContext* avctx, const enum AVPixelFormat* fmt); static int GetBuffer(struct AVCodecContext* avctx, AVFrame* frame, int flags); - bool FilterOpen(const std::string& filters, bool test); + static AVFrame *alloc_filter_frame(AVFilterContext * ctx, void * v, int w, int h); + bool FilterOpen(const std::string& filters, bool scale, bool test); void FilterClose(); void FilterTest(); std::string GetFilterChain(bool interlaced); -- 2.39.2 ================================================ FILE: projects/Rockchip/README.md ================================================ # Rockchip This project is for Rockchip SoC devices ## Devices **RK3288** * [ASUS Tinker Board](devices/RK3288) * [mqmaker MiQi](devices/RK3288) **RK3328** * [Beelink A1 TV BOX](devices/RK3328) * [PINE64 ROCK64](devices/RK3328) * [Popcorn Hour Transformer](devices/RK3328) * [Firefly ROC-RK3328-CC](devices/RK3328) **RK3399** * [96rocks ROCK960](devices/RK3399) * [Hugsun X99 TV BOX](devices/RK3399) * [Khadas Edge](devices/RK3399) * [FriendlyARM NanoPC-T4](devices/RK3399) * [FriendlyARM NanoPi M4](devices/RK3399) * [Orange Pi RK3399](devices/RK3399) * [PINE64 RockPro64](devices/RK3399) * [Radxa ROCK Pi 4](devices/RK3399) * [Radxa ROCK Pi 4+](devices/RK3399) * [Radxa ROCK Pi N10](devices/RK3399) * [ROC-RK3399-PC](devices/RK3399) * [ROC-RK3399-PC-PLUS](devices/RK3399) * [Rockchip Sapphire Board](devices/RK3399) **My single-board computer is not listed, will it be added in the future?**<br> If your single-board computer uses a current generation SoC listed on http://opensource.rock-chips.com/wiki_Main_Page the odds are in your favor. **My Android device is not listed, will it be added in the future?**<br> You may have luck if your device vendor is open source friendly, otherwise keep using Android for best support. **My device does not boot and I don't understand why.**<br> If your device has Android or any sort of vendor u-boot preinstalled in EMMC or SPI, make sure to add `ROCKCHIP_LEGACY_BOOT=1` when building an image. This is done automatically for supported devices, which are known to come with Android preinstalled. ## Links * http://opensource.rock-chips.com ## Useful debug commands * `cat /sys/kernel/debug/dri/0/state` * `cat /sys/kernel/debug/dri/0/framebuffer` * `cat /sys/kernel/debug/dma_buf/bufinfo` * `cat /sys/kernel/debug/cec/cec0/status` * `hexdump -C /sys/class/drm/card0-HDMI-A-1/edid` * `edid-decode /sys/class/drm/card0-HDMI-A-1/edid` * `cat /sys/kernel/debug/clk/clk_summary` * `cat /sys/kernel/debug/regulator/regulator_summary` ================================================ FILE: projects/Rockchip/bootloader/canupdate.sh ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # devices have been renamed after LE9.2 if [ "${1}" = "TinkerBoard.arm" -o "${1}" = "MiQi.arm" ]; then if [ "${2}" = "RK3288.arm" ]; then exit 0 fi fi # Allow upgrades between arm and aarch64 if [ "${1}" = "@PROJECT@.arm" -o "${1}" = "@PROJECT@.aarch64" ]; then exit 0 else exit 1 fi ================================================ FILE: projects/Rockchip/bootloader/config ================================================ CONFIG_BOOTDELAY=1 # CONFIG_DM_VIDEO is not set # CONFIG_DISPLAY is not set # CONFIG_ENV_IS_IN_MMC is not set # CONFIG_NET_RANDOM_ETHADDR is not set # CONFIG_USB_KEYBOARD is not set # CONFIG_TPL_DRIVERS_MISC is not set CONFIG_MISC=y CONFIG_MISC_INIT_R=y CONFIG_ROCKCHIP_EFUSE=y CONFIG_SHA256=y ================================================ FILE: projects/Rockchip/bootloader/firmware ================================================ [ -z "${ROCKCHIP_LEGACY_BOOT}" ] && export ROCKCHIP_LEGACY_BOOT=$("${ROOT}/${SCRIPTS}/uboot_helper" "${PROJECT}" "${DEVICE}" "${UBOOT_SYSTEM}" rockchip_legacy_boot) if [ "${ROCKCHIP_LEGACY_BOOT}" = "1" ]; then export UBOOT_TARGET="u-boot-dtb.bin" else export UBOOT_TARGET="" fi if [ -n "${ATF_PLATFORM}" ]; then if [ -f "$(get_install_dir atf)/usr/share/bootloader/bl31.elf" ]; then export BL31="$(get_install_dir atf)/usr/share/bootloader/bl31.elf" fi fi ================================================ FILE: projects/Rockchip/bootloader/install ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_RKBIN="$(get_build_dir rkbin)" PKG_SOC="${DEVICE/RK/rk}" if [ "${ROCKCHIP_LEGACY_BOOT}" = "1" ]; then echo "install: building Rockchip legacy boot chain ..." if [ ! -f u-boot-dtb.bin ]; then echo "install: u-boot-dtb.bin does not exist UBOOT_TARGET: ${UBOOT_TARGET}" exit 1 fi PKG_BOOT_INI="${PKG_RKBIN}"/RKBOOT/"${DEVICE}"MINIALL.ini if [ ! -f "${PKG_BOOT_INI}" ]; then echo "install: ${PKG_BOOT_INI} does not exist" exit 1 fi PKG_DDR_BIN="${PKG_RKBIN}"/$(sed -n "/FlashData/s/FlashData=//p" "${PKG_BOOT_INI}") PKG_MINILOADER="${PKG_RKBIN}"/$(sed -n "/FlashBoot/s/FlashBoot=//p" "${PKG_BOOT_INI}") PKG_LOAD_ADDR=$(sed -n "/SYS_TEXT_BASE/s/#define CONFIG_SYS_TEXT_BASE //p" u-boot.cfg) # Override sdram frequency if [ "${DEVICE}" = "RK3328" ]; then sed -s 's/\x4d\x1\x4d\x1\x4d\x1\x4d\x1\x4d\x1\x4d\x1/\x20\x3\x20\x3\x20\x3\x20\x3\x20\x3\x20\x3/g' -i "${PKG_DDR_BIN}" sed -s 's/\x90\x1\x90\x1\x90\x1\x90\x1\x90\x1\x90\x1/\x20\x3\x20\x3\x20\x3\x20\x3\x20\x3\x20\x3/g' -i "${PKG_DDR_BIN}" fi ${PKG_RKBIN}/tools/mkimage -n "${PKG_SOC}" -T rksd -d "${PKG_DDR_BIN}":"${PKG_MINILOADER}" idbloader.img.rk || exit 1 ${PKG_RKBIN}/tools/loaderimage --pack --uboot u-boot-dtb.bin uboot.img.rk "${PKG_LOAD_ADDR}" || exit 1 dd if=idbloader.img.rk of="${UBOOT_FIT_IMAGE}" seek=0 conv=fsync,notrunc > /dev/null 2>&1 || exit 1 dd if=uboot.img.rk of="${UBOOT_FIT_IMAGE}" seek=16320 conv=fsync,notrunc > /dev/null 2>&1 || exit 1 if [ "${TARGET_ARCH}" = "aarch64" -o "${TARGET_KERNEL_ARCH}" = "arm64" ]; then PKG_ATF_INI="${PKG_RKBIN}"/RKTRUST/"${DEVICE}"TRUST.ini if [ ! -f "${PKG_ATF_INI}" ]; then echo "install: ${PKG_ATF_INI} does not exist" exit 1 fi "${PKG_RKBIN}"/tools/trust_merger --ignore-bl32 --prepath "${PKG_RKBIN}"/ "${PKG_ATF_INI}" || exit 1 dd if=trust.img of="${UBOOT_FIT_IMAGE}" seek=24512 conv=fsync,notrunc > /dev/null 2>&1 || exit 1 fi fi if [ -f "${UBOOT_FIT_IMAGE}" ]; then cp -av "${UBOOT_FIT_IMAGE}" "${INSTALL}"/usr/share/bootloader else echo "install: bootloader ${UBOOT_FIT_IMAGE} was not built." exit 1 fi ================================================ FILE: projects/Rockchip/bootloader/mkimage ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) if [ -n "${UBOOT_SYSTEM}" ]; then BOOTLOADER_PATH="${RELEASE_DIR}/3rdparty/bootloader/u-boot-rockchip.bin" if [ -f "${BOOTLOADER_PATH}" ]; then echo "image: burn bootloader to image..." dd if="${BOOTLOADER_PATH}" of="${DISK}" bs=32k seek=1 conv=fsync,notrunc >"${SAVE_ERROR}" 2>&1 || show_error else echo "image: bootloader ${BOOTLOADER_PATH} does not exist."; exit 1 fi fi ================================================ FILE: projects/Rockchip/bootloader/release ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) SRCDIR="${BUILD}"/image/system/usr/share/bootloader DSTDIR="${RELEASE_DIR}"/3rdparty/bootloader mkdir -p "${DSTDIR}" if [ -n "${UBOOT_SYSTEM}" ]; then if [ -f "${SRCDIR}"/"${UBOOT_FIT_IMAGE}" ]; then cp -av "${SRCDIR}"/"${UBOOT_FIT_IMAGE}" "${DSTDIR}" && \ ln -sfv "${UBOOT_FIT_IMAGE}" "${DSTDIR}"/idbloader.img || exit 1 if [ "${ROCKCHIP_LEGACY_BOOT}" = "1" ]; then touch "${DSTDIR}"/.rockchip_boot_chain_old else touch "${DSTDIR}"/.rockchip_boot_chain_new fi else echo "release: bootloader image ${SRCDIR}/${UBOOT_FIT_IMAGE} does not exist." exit 1 fi fi cp -av "${SRCDIR}"/"${DEVICE,,}"*.dtb "${DSTDIR}" ================================================ FILE: projects/Rockchip/bootloader/update.sh ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) [ -z "${SYSTEM_ROOT}" ] && SYSTEM_ROOT="" [ -z "${BOOT_ROOT}" ] && BOOT_ROOT="/flash" [ -z "${BOOT_PART}" ] && BOOT_PART=$(df "${BOOT_ROOT}" | tail -1 | awk {' print $1 '}) if [ -z "${BOOT_DISK}" ]; then case ${BOOT_PART} in /dev/sd[a-z][0-9]*) BOOT_DISK=$(echo ${BOOT_PART} | sed -e "s,[0-9]*,,g") ;; /dev/mmcblk*) BOOT_DISK=$(echo ${BOOT_PART} | sed -e "s,p[0-9]*,,g") ;; esac fi # mount ${BOOT_ROOT} r/w mount -o remount,rw ${BOOT_ROOT} # update device tree for all_dtb in ${BOOT_ROOT}/*.dtb; do dtb=$(basename ${all_dtb}) # device tree mappings for update from vendor to mainline kernel case "${dtb}" in rk3288-miniarm.dtb) new_dtb=rk3288-tinker-s.dtb ;; rk3328-box.dtb|rk3328-box-trn9.dtb|rk3328-box-z28.dtb|rk3328-rockbox.dtb) new_dtb=rk3328-a1.dtb ;; rk3399-rock-pi-4.dtb) new_dtb=rk3399-rock-pi-4b.dtb ;; *) new_dtb="${dtb}" ;; esac if [ "${dtb}" != "${new_dtb}" -a -f ${SYSTEM_ROOT}/usr/share/bootloader/${new_dtb} ]; then echo -n "Replacing ${dtb} with ${new_dtb} ... " cp -p ${SYSTEM_ROOT}/usr/share/bootloader/${new_dtb} ${BOOT_ROOT} && \ sed -e "s/FDT \/${dtb}/FDT \/${new_dtb}/g" \ -i ${BOOT_ROOT}/extlinux/extlinux.conf && \ rm -f ${BOOT_ROOT}/${dtb} echo "done" else if [ -f ${SYSTEM_ROOT}/usr/share/bootloader/${dtb} ]; then echo -n "Updating ${dtb}... " cp -p ${SYSTEM_ROOT}/usr/share/bootloader/${dtb} ${BOOT_ROOT} echo "done" elif [ "$(grep -c "FDT /${dtb}" ${BOOT_ROOT}/extlinux/extlinux.conf)" -ne 0 ]; then non_existend_dtb="${dtb}" fi fi done # update bootloader if [ -f ${SYSTEM_ROOT}/usr/share/bootloader/u-boot-rockchip.bin ]; then echo -n "Updating fit image u-boot-rockchip.bin ... " dd if=${SYSTEM_ROOT}/usr/share/bootloader/u-boot-rockchip.bin of=${BOOT_DISK} bs=32k seek=1 conv=fsync,notrunc &>/dev/null echo "done" fi # mount ${BOOT_ROOT} r/o sync mount -o remount,ro ${BOOT_ROOT} # warning if device tree was not updated if [ -n "${non_existend_dtb}" ]; then echo "The device tree ${non_existend_dtb} your installation uses does not exist in this update package." echo "The updated system will continue to use the device tree from the previous system and your installation might be broken." echo "Please check documentation to find out which boards are supported by this package." sleep 10 fi ================================================ FILE: projects/Rockchip/devices/GameForce/README.md ================================================ # GameForce CHI This is for GameForce CHI device using RK3326 SOC **Build** * `PROJECT=Rockchip DEVICE=GameForce ARCH=aarch64 make image` ================================================ FILE: projects/Rockchip/devices/GameForce/bootloader/canupdate.sh ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Allow upgrades between arm and aarch64 if [ "$1" = "@PROJECT@.arm" -o "$1" = "@PROJECT@.aarch64" ]; then exit 0 else exit 1 fi ================================================ FILE: projects/Rockchip/devices/GameForce/bootloader/config ================================================ CONFIG_BOOTDELAY=1 # CONFIG_EFI_LOADER is not set CONFIG_FIT=y CONFIG_FIT_SIGNATURE=n ================================================ FILE: projects/Rockchip/devices/GameForce/bootloader/install ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_RKBIN="$(get_build_dir rkbin)" PKG_SOC=$UBOOT_SYSTEM if [ "$DEVICE" = "RK3328" -o "$DEVICE" = "RK3399" ]; then PKG_SOC="${DEVICE/RK/rk}" fi if [ "$DEVICE" == "OdroidGoAdvance" ] || [ "$DEVICE" == "GameForce" ]; then PKG_SOC="px30" fi case "$PKG_SOC" in rk3036) PKG_DATAFILE="spl/u-boot-spl-nodtb.bin" PKG_LOADER="u-boot-dtb.bin" ;; rk3288) PKG_DATAFILE="$PKG_RKBIN/rk32/rk3288_ddr_400MHz_v1.06.bin" PKG_LOADER="$PKG_RKBIN/rk32/rk3288_miniloader_v2.36.bin" PKG_LOAD_ADDR="0x0" ;; px30) PKG_DATAFILE="$PKG_RKBIN/bin/rk33/rk3326_ddr_333MHz_v1.14.bin" PKG_LOADER="$PKG_RKBIN/bin/rk33/rk3326_miniloader_v1.20.bin" PKG_BL31="$PKG_RKBIN/bin/rk33/rk3326_bl31_v1.18.elf" PKG_BL32="$PKG_RKBIN/bin/rk33/rk3326_bl32_v1.13.bin" PKG_LOAD_ADDR="0x00200000" ;; rk3328) PKG_DATAFILE="$PKG_RKBIN/rk33/rk3328_ddr_786MHz_v1.13.bin" PKG_LOADER="$PKG_RKBIN/rk33/rk3328_miniloader_v2.49.bin" PKG_BL31="$PKG_RKBIN/rk33/rk3328_bl31_v1.40.elf" PKG_LOAD_ADDR="0x200000" ;; rk3399) PKG_DATAFILE="$PKG_RKBIN/rk33/rk3399_ddr_800MHz_v1.17.bin" PKG_LOADER="$PKG_RKBIN/rk33/rk3399_miniloader_v1.15.bin" PKG_BL31="$PKG_RKBIN/rk33/rk3399_bl31_v1.24.elf" PKG_LOAD_ADDR="0x200000" ;; *) PKG_DATAFILE="spl/u-boot-spl-dtb.bin" PKG_LOADER="u-boot-dtb.bin" ;; esac if [ -n "$PKG_DATAFILE" -a -n "$PKG_LOADER" ]; then tools/mkimage -n $PKG_SOC -T rksd -d "$PKG_DATAFILE" idbloader.img cat "$PKG_LOADER" >> idbloader.img cp -av idbloader.img $INSTALL/usr/share/bootloader fi if [ -n "$PKG_LOAD_ADDR" ]; then $PKG_RKBIN/tools/loaderimage --pack --uboot u-boot-dtb.bin uboot.img $PKG_LOAD_ADDR cp -av uboot.img $INSTALL/usr/share/bootloader fi if [ $DEVICE = "AndroidGoAdvance" ]; then if [ -n "$PKG_BL31" ]; then cat >trust.ini <<EOF [VERSION] MAJOR=1 MINOR=0 [BL30_OPTION] SEC=0 [BL31_OPTION] SEC=1 PATH=$PKG_BL31 ADDR=0x00010000 [BL32_OPTION] SEC=1 PATH=$PKG_BL32 ADDR=0x08400000 [BL33_OPTION] SEC=0 [OUTPUT] PATH=trust.img EOF $PKG_RKBIN/tools/trust_merger --rsa 3 --verbose trust.ini cp -av trust.img $INSTALL/usr/share/bootloader fi else if [ -n "$PKG_BL31" ]; then cat >trust.ini <<EOF [BL30_OPTION] SEC=0 [BL31_OPTION] SEC=1 PATH=$PKG_BL31 ADDR=0x00010000 [BL32_OPTION] SEC=0 [BL33_OPTION] SEC=0 [OUTPUT] PATH=trust.img EOF $PKG_RKBIN/tools/trust_merger --verbose trust.ini cp -av trust.img $INSTALL/usr/share/bootloader fi fi LE_TMP=$(mktemp -d) mkdir -p "${LE_TMP}/extlinux" mkdir -p $INSTALL/usr/share/bootloader/extlinux LINUX_DTS_DIR=$(get_build_dir linux)/.install_pkg/usr/share/bootloader for dtb in $LINUX_DTS_DIR/*.dtb; do if [ ! -f $dtb ]; then continue fi cat << EOF > "${LE_TMP}/extlinux/$(basename ${dtb}).conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDT /$(basename ${dtb}) APPEND boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@ quiet ${EXTRA_CMDLINE} EOF cp -a "${LE_TMP}/extlinux/$(basename ${dtb}).conf" $INSTALL/usr/share/bootloader/extlinux done ================================================ FILE: projects/Rockchip/devices/GameForce/bootloader/mkimage ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) if [ -f "$RELEASE_DIR/3rdparty/bootloader/idbloader.img" ]; then echo "image: burn idbloader.img to image..." dd if="$RELEASE_DIR/3rdparty/bootloader/idbloader.img" of="$DISK" bs=32k seek=1 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/uboot.img" ]; then echo "image: burn uboot.img to image..." dd if="$RELEASE_DIR/3rdparty/bootloader/uboot.img" of="$DISK" bs=64k seek=128 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/trust.img" ]; then echo "image: burn trust.img to image..." dd if="$RELEASE_DIR/3rdparty/bootloader/trust.img" of="$DISK" bs=64k seek=192 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/boot.ini" ]; then echo "image: copying boot.ini to root" mcopy "$RELEASE_DIR/3rdparty/bootloader/boot.ini" :: fi mkdir -p "${LE_TMP}/extlinux" # copy device trees to part1 for dtb in $RELEASE_DIR/3rdparty/bootloader/*.dtb; do if [ ! -f $dtb ]; then continue fi cat << EOF > "${LE_TMP}/extlinux/$(basename ${dtb}).conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDT /$(basename ${dtb}) APPEND boot=UUID=${UUID_SYSTEM} disk=UUID=${UUID_STORAGE} quiet ${EXTRA_CMDLINE} EOF [ -e "$dtb" ] && mcopy -o "$dtb" :: done mcopy -so "${LE_TMP}/extlinux" :: ================================================ FILE: projects/Rockchip/devices/GameForce/bootloader/release ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) mkdir -p $RELEASE_DIR/3rdparty/bootloader if [ -n "$UBOOT_SYSTEM" ]; then BOOTLOADER_DIR=$(get_build_dir $BOOTLOADER) if [ -f $BOOTLOADER_DIR/idbloader.img ]; then cp -a $BOOTLOADER_DIR/idbloader.img $RELEASE_DIR/3rdparty/bootloader fi if [ -f $BOOTLOADER_DIR/uboot.img ]; then cp -a $BOOTLOADER_DIR/uboot.img $RELEASE_DIR/3rdparty/bootloader fi if [ -f $BOOTLOADER_DIR/trust.img ]; then cp -a $BOOTLOADER_DIR/trust.img $RELEASE_DIR/3rdparty/bootloader fi fi if [ -f $INSTALL/usr/share/bootloader/boot.ini ]; then cp -a $INSTALL/usr/share/bootloader/boot.ini $RELEASE_DIR/3rdparty/bootloader fi LINUX_DTS_DIR=$(get_build_dir linux)/arch/$TARGET_KERNEL_ARCH/boot/dts for dtb in $LINUX_DTS_DIR/*.dtb $LINUX_DTS_DIR/*/*.dtb; do if [ -f $dtb ]; then cp -a $dtb $RELEASE_DIR/3rdparty/bootloader fi done LE_TMP=$(mktemp -d) mkdir -p "${LE_TMP}/extlinux" mkdir -p $RELEASE_DIR/3rdparty/bootloader LINUX_DTS_DIR=$(get_build_dir linux)/.install_pkg/usr/share/bootloader for dtb in $RELEASE_DIR/3rdparty/bootloader/*.dtb; do if [ ! -f $dtb ]; then continue fi cat << EOF > "${LE_TMP}/extlinux/$(basename ${dtb}).conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDT /$(basename ${dtb}) APPEND boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@ quiet ${EXTRA_CMDLINE} EOF cp -a "${LE_TMP}/extlinux/$(basename ${dtb}).conf" $RELEASE_DIR/3rdparty/bootloader done ================================================ FILE: projects/Rockchip/devices/GameForce/bootloader/update.sh ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) [ -z "$SYSTEM_ROOT" ] && SYSTEM_ROOT="" [ -z "$BOOT_ROOT" ] && BOOT_ROOT="/flash" [ -z "$BOOT_PART" ] && BOOT_PART=$(df "$BOOT_ROOT" | tail -1 | awk {' print $1 '}) if [ -z "$BOOT_DISK" ]; then case $BOOT_PART in /dev/sd[a-z][0-9]*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,[0-9]*,,g") ;; /dev/mmcblk*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,p[0-9]*,,g") ;; esac fi # mount $BOOT_ROOT r/w mount -o remount,rw $BOOT_ROOT for arg in $(cat /proc/cmdline); do case $arg in boot=*) boot="${arg#*=}" case $boot in /dev/mmc*) BOOT_UUID="$(blkid $boot | sed 's/.* UUID="//;s/".*//g')" ;; UUID=*|LABEL=*) BOOT_UUID="$(blkid | sed 's/"//g' | grep -m 1 -i " $boot " | sed 's/.* UUID=//;s/ .*//g')" ;; FOLDER=*) BOOT_UUID="$(blkid ${boot#*=} | sed 's/.* UUID="//;s/".*//g')" ;; esac ;; disk=*) disk="${arg#*=}" case $disk in /dev/mmc*) DISK_UUID="$(blkid $disk | sed 's/.* UUID="//;s/".*//g')" ;; UUID=*|LABEL=*) DISK_UUID="$(blkid | sed 's/"//g' | grep -m 1 -i " $disk " | sed 's/.* UUID=//;s/ .*//g')" ;; FOLDER=*) DISK_UUID="$(blkid ${disk#*=} | sed 's/.* UUID="//;s/".*//g')" ;; esac ;; esac done CONFS=$SYSTEM_ROOT/usr/share/bootloader/extlinux/*.conf for all_conf in $CONFS; do conf="$(basename ${all_conf})" echo "Updating ${conf}..." cp -p $SYSTEM_ROOT/usr/share/bootloader/extlinux/${conf} $BOOT_ROOT/extlinux/${conf} sed -e "s/@BOOT_UUID@/$BOOT_UUID/" \ -e "s/@DISK_UUID@/$DISK_UUID/" \ -i $BOOT_ROOT/extlinux/${conf} done if [ -f $SYSTEM_ROOT/usr/share/bootloader/boot.ini ]; then echo "Updating boot.ini..." cp -p $SYSTEM_ROOT/usr/share/bootloader/boot.ini $BOOT_ROOT/boot.ini fi # update device tree for all_dtb in $SYSTEM_ROOT/usr/share/bootloader/*.dtb; do dtb=$(basename $all_dtb) echo -n "Updating $dtb... " cp -p $SYSTEM_ROOT/usr/share/bootloader/$dtb $BOOT_ROOT echo "done" done # update bootloader if [ -f $SYSTEM_ROOT/usr/share/bootloader/idbloader.img ]; then echo -n "Updating idbloader.img... " dd if=$SYSTEM_ROOT/usr/share/bootloader/idbloader.img of=$BOOT_DISK bs=32k seek=1 conv=fsync &>/dev/null echo "done" fi if [ -f $SYSTEM_ROOT/usr/share/bootloader/uboot.img ]; then echo -n "Updating uboot.img... " dd if=$SYSTEM_ROOT/usr/share/bootloader/uboot.img of=$BOOT_DISK bs=64k seek=128 conv=fsync &>/dev/null echo "done" fi if [ -f $SYSTEM_ROOT/usr/share/bootloader/trust.img ]; then echo -n "Updating trust.img... " dd if=$SYSTEM_ROOT/usr/share/bootloader/trust.img of=$BOOT_DISK bs=64k seek=192 conv=fsync &>/dev/null echo "done" fi # mount $BOOT_ROOT r/o sync mount -o remount,ro $BOOT_ROOT # Leave a hint that we just did an update echo "UPDATE" > /storage/.config/boot.hint ================================================ FILE: projects/Rockchip/devices/GameForce/linux/gameforce-4.4/linux.aarch64.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm64 4.4.189 Kernel Configuration # CONFIG_ARM64=y CONFIG_64BIT=y CONFIG_ARCH_PHYS_ADDR_T_64BIT=y CONFIG_MMU=y CONFIG_ARCH_MMAP_RND_BITS_MIN=18 CONFIG_ARCH_MMAP_RND_BITS_MAX=24 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_ARM64_PAGE_SHIFT=12 CONFIG_ARM64_CONT_SHIFT=4 CONFIG_NO_IOPORT_MAP=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_LOCKDEP_SUPPORT=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CSUM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ZONE_DMA=y CONFIG_HAVE_GENERIC_RCU_GUP=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_SMP=y CONFIG_SWIOTLB=y CONFIG_IOMMU_HELPER=y CONFIG_KERNEL_MODE_NEON=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_PGTABLE_LEVELS=3 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_EXTABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 CONFIG_CROSS_COMPILE="" # CONFIG_COMPILE_TEST is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y # CONFIG_POSIX_MQUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y CONFIG_FHANDLE=y CONFIG_USELIB=y # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_HANDLE_DOMAIN_IRQ=y # CONFIG_IRQ_DOMAIN_DEBUG is not set CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set # CONFIG_SCHED_WALT is not set # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_TASKSTATS is not set # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y # CONFIG_TASKS_RCU is not set CONFIG_RCU_STALL_COMMON=y # CONFIG_TREE_RCU_TRACE is not set # CONFIG_RCU_EXPEDITE_BOOT is not set # CONFIG_BUILD_BIN2C is not set # CONFIG_IKCONFIG is not set CONFIG_LOG_BUF_SHIFT=18 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_GENERIC_SCHED_CLOCK=y CONFIG_CGROUPS=y # CONFIG_CGROUP_DEBUG is not set CONFIG_CGROUP_FREEZER=y # CONFIG_CGROUP_PIDS is not set CONFIG_CGROUP_DEVICE=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_CPUACCT=y # CONFIG_MEMCG is not set # CONFIG_CGROUP_PERF is not set CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set # CONFIG_BLK_CGROUP is not set # CONFIG_CHECKPOINT_RESTORE is not set CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SCHED_TUNE is not set CONFIG_DEFAULT_USE_ENERGY_AWARE=y # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE=" " CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 CONFIG_RD_GZIP=y CONFIG_RD_BZIP2=y CONFIG_RD_LZMA=y CONFIG_RD_XZ=y CONFIG_RD_LZO=y CONFIG_RD_LZ4=y # CONFIG_INITRD_ASYNC is not set CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_SYSCTL=y CONFIG_ANON_INODES=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_BPF=y CONFIG_EXPERT=y CONFIG_UID16=y CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set CONFIG_SYSFS_SYSCALL=y # CONFIG_SYSCTL_SYSCALL is not set # CONFIG_KALLSYMS is not set # CONFIG_KALLSYMS_ALL is not set CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y # CONFIG_BPF_SYSCALL is not set CONFIG_SHMEM=y CONFIG_AIO=y CONFIG_ADVISE_SYSCALLS=y # CONFIG_USERFAULTFD is not set CONFIG_MEMBARRIER=y CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y CONFIG_PERF_USE_VMALLOC=y # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLUB_DEBUG=y # CONFIG_COMPAT_BRK is not set # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_SYSTEM_DATA_VERIFICATION is not set CONFIG_PROFILING=y # CONFIG_KPROBES is not set # CONFIG_JUMP_LABEL is not set # CONFIG_UPROBES is not set # CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_ATTRS=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_CLK=y CONFIG_HAVE_DMA_API_DEBUG=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_RCU_TABLE_FREE=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP_FILTER=y CONFIG_HAVE_CC_STACKPROTECTOR=y # CONFIG_CC_STACKPROTECTOR is not set CONFIG_CC_STACKPROTECTOR_NONE=y # CONFIG_CC_STACKPROTECTOR_REGULAR is not set # CONFIG_CC_STACKPROTECTOR_STRONG is not set CONFIG_HAVE_CONTEXT_TRACKING=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=18 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y CONFIG_HAVE_GENERIC_DMA_COHERENT=y CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y CONFIG_MODULE_FORCE_LOAD=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set # CONFIG_MODULE_COMPRESS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLK_DEV_BSG=y # CONFIG_BLK_DEV_BSGLIB is not set # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_CMDLINE_PARSER is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set CONFIG_RK_PARTITION=y # CONFIG_CMDLINE_PARTITION is not set CONFIG_BLOCK_COMPAT=y # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y # CONFIG_DEFAULT_DEADLINE is not set CONFIG_DEFAULT_CFQ=y # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="cfq" CONFIG_PREEMPT_NOTIFIERS=y CONFIG_ASN1=y CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_FREEZER=y # # Platform selection # # CONFIG_ARCH_BCM_IPROC is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_EXYNOS7 is not set # CONFIG_ARCH_LAYERSCAPE is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_MEDIATEK is not set # CONFIG_ARCH_QCOM is not set CONFIG_ARCH_ROCKCHIP=y CONFIG_ARCH_ROCKCHIP_ODROIDGOA=y # CONFIG_ARCH_SEATTLE is not set # CONFIG_ARCH_STRATIX10 is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_SPRD is not set # CONFIG_ARCH_THUNDER is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_XGENE is not set # CONFIG_ARCH_ZYNQMP is not set # # Bus support # # CONFIG_PCI is not set # CONFIG_PCI_DOMAINS is not set # CONFIG_PCI_DOMAINS_GENERIC is not set # CONFIG_PCI_SYSCALL is not set # # Kernel Features # # # ARM errata workarounds via the alternatives framework # # CONFIG_ARM64_ERRATUM_826319 is not set # CONFIG_ARM64_ERRATUM_827319 is not set # CONFIG_ARM64_ERRATUM_824069 is not set # CONFIG_ARM64_ERRATUM_819472 is not set # CONFIG_ARM64_ERRATUM_832075 is not set CONFIG_ARM64_ERRATUM_834220=y CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y # CONFIG_ARM64_ERRATUM_1024718 is not set # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set CONFIG_CAVIUM_ERRATUM_27456=y CONFIG_ARM64_4K_PAGES=y # CONFIG_ARM64_16K_PAGES is not set # CONFIG_ARM64_64K_PAGES is not set CONFIG_ARM64_VA_BITS_39=y # CONFIG_ARM64_VA_BITS_48 is not set CONFIG_ARM64_VA_BITS=39 # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_SCHED_MC=y # CONFIG_SCHED_SMT is not set CONFIG_NR_CPUS=4 CONFIG_HOTPLUG_CPU=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set # CONFIG_HZ_100 is not set CONFIG_HZ_250=y # CONFIG_HZ_300 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=250 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_HAVE_ARCH_PFN_VALID=y CONFIG_HW_PERF_EVENTS=y CONFIG_SYS_SUPPORTS_HUGETLBFS=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SPARSEMEM_MANUAL=y CONFIG_SPARSEMEM=y CONFIG_HAVE_MEMORY_PRESENT=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_MEMBLOCK=y CONFIG_NO_BOOTMEM=y # CONFIG_HAVE_BOOTMEM_INFO_NODE is not set CONFIG_SPLIT_PTLOCK_CPUS=4 # CONFIG_COMPACTION is not set CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_ZONE_DMA_FLAG=1 CONFIG_BOUNCE=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 # CONFIG_TRANSPARENT_HUGEPAGE is not set # CONFIG_CLEANCACHE is not set # CONFIG_FRONTSWAP is not set # CONFIG_CMA is not set # CONFIG_ZPOOL is not set # CONFIG_ZBUD is not set CONFIG_ZSMALLOC=y # CONFIG_PGTABLE_MAPPING is not set # CONFIG_ZSMALLOC_STAT is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_SECCOMP=y # CONFIG_KEXEC is not set # CONFIG_CRASH_DUMP is not set # CONFIG_XEN is not set CONFIG_FORCE_MAX_ZONEORDER=11 CONFIG_UNMAP_KERNEL_AT_EL0=y CONFIG_ARMV8_DEPRECATED=y CONFIG_SWP_EMULATION=y CONFIG_CP15_BARRIER_EMULATION=y CONFIG_SETEND_EMULATION=y # CONFIG_ARM64_SW_TTBR0_PAN is not set # # ARMv8.1 architectural features # CONFIG_ARM64_HW_AFDBM=y CONFIG_ARM64_PAN=y # CONFIG_ARM64_LSE_ATOMICS is not set CONFIG_ARM64_UAO=y CONFIG_ARM64_MODULE_CMODEL_LARGE=y # CONFIG_RANDOMIZE_BASE is not set # # Boot options # CONFIG_CMDLINE="" # CONFIG_EFI is not set # CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE is not set # # Userspace binary formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y # CONFIG_HAVE_AOUT is not set # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y CONFIG_COMPAT=y CONFIG_SYSVIPC_COMPAT=y CONFIG_KEYS_COMPAT=y # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_SUSPEND_SKIP_SYNC is not set CONFIG_HAS_WAKELOCK=y CONFIG_WAKELOCK=y CONFIG_HIBERNATE_CALLBACKS=y CONFIG_HIBERNATION=y CONFIG_PM_STD_PARTITION="" CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y CONFIG_PM_DEBUG=y CONFIG_PM_ADVANCED_DEBUG=y # CONFIG_PM_TEST_SUSPEND is not set CONFIG_PM_SLEEP_DEBUG=y # CONFIG_DPM_WATCHDOG is not set CONFIG_PM_OPP=y CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y CONFIG_PM_GENERIC_DOMAINS_SLEEP=y CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_HIBERNATION_HEADER=y CONFIG_ARCH_SUSPEND_POSSIBLE=y # # CPU Power Management # # # CPU Idle # CONFIG_CPU_IDLE=y CONFIG_CPU_IDLE_GOV_LADDER=y CONFIG_CPU_IDLE_GOV_MENU=y CONFIG_DT_IDLE_STATES=y # # ARM CPU Idle Drivers # CONFIG_ARM_CPUIDLE=y # CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_STAT_DETAILS is not set CONFIG_CPU_FREQ_TIMES=y CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y CONFIG_CPU_FREQ_GOV_INTERACTIVE=y # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y # CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set # CONFIG_ARM_KIRKWOOD_CPUFREQ is not set CONFIG_ARM_ROCKCHIP_CPUFREQ=y CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y CONFIG_NET_INGRESS=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_DIAG=y CONFIG_UNIX=y CONFIG_UNIX_DIAG=y CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set CONFIG_XFRM_MIGRATE=y # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_IPCOMP=m CONFIG_NET_KEY=m CONFIG_NET_KEY_MIGRATE=y CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_IP_FIB_TRIE_STATS=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y CONFIG_IP_ROUTE_CLASSID=y CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y CONFIG_IP_PNP_RARP=y CONFIG_NET_IPIP=m CONFIG_NET_IPGRE_DEMUX=m CONFIG_NET_IP_TUNNEL=m CONFIG_NET_IPGRE=m CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y CONFIG_IP_MROUTE_MULTIPLE_TABLES=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y CONFIG_SYN_COOKIES=y CONFIG_NET_IPVTI=m CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set CONFIG_INET_AH=m CONFIG_INET_ESP=m CONFIG_INET_IPCOMP=m CONFIG_INET_XFRM_TUNNEL=m CONFIG_INET_TUNNEL=m CONFIG_INET_XFRM_MODE_TRANSPORT=m CONFIG_INET_XFRM_MODE_TUNNEL=m CONFIG_INET_XFRM_MODE_BEET=m CONFIG_INET_LRO=m CONFIG_INET_DIAG=m CONFIG_INET_TCP_DIAG=m CONFIG_INET_UDP_DIAG=m CONFIG_INET_DIAG_DESTROY=y CONFIG_TCP_CONG_ADVANCED=y CONFIG_TCP_CONG_BIC=m CONFIG_TCP_CONG_CUBIC=m CONFIG_TCP_CONG_WESTWOOD=m CONFIG_TCP_CONG_HTCP=m CONFIG_TCP_CONG_HSTCP=m CONFIG_TCP_CONG_HYBLA=m CONFIG_TCP_CONG_VEGAS=m CONFIG_TCP_CONG_SCALABLE=m CONFIG_TCP_CONG_LP=m CONFIG_TCP_CONG_VENO=m CONFIG_TCP_CONG_YEAH=m CONFIG_TCP_CONG_ILLINOIS=m CONFIG_TCP_CONG_DCTCP=m CONFIG_TCP_CONG_CDG=m CONFIG_DEFAULT_RENO=y CONFIG_DEFAULT_TCP_CONG="reno" CONFIG_TCP_MD5SIG=y CONFIG_IPV6=m CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y CONFIG_IPV6_OPTIMISTIC_DAD=y CONFIG_INET6_AH=m CONFIG_INET6_ESP=m CONFIG_INET6_IPCOMP=m CONFIG_IPV6_MIP6=m CONFIG_IPV6_ILA=m CONFIG_INET6_XFRM_TUNNEL=m CONFIG_INET6_TUNNEL=m CONFIG_INET6_XFRM_MODE_TRANSPORT=m CONFIG_INET6_XFRM_MODE_TUNNEL=m CONFIG_INET6_XFRM_MODE_BEET=m CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m CONFIG_IPV6_VTI=m CONFIG_IPV6_SIT=m CONFIG_IPV6_SIT_6RD=y CONFIG_IPV6_NDISC_NODETYPE=y CONFIG_IPV6_TUNNEL=m CONFIG_IPV6_GRE=m CONFIG_IPV6_MULTIPLE_TABLES=y CONFIG_IPV6_SUBTREES=y CONFIG_IPV6_MROUTE=y CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y CONFIG_IPV6_PIMSM_V2=y # CONFIG_ANDROID_PARANOID_NETWORK is not set CONFIG_NETWORK_SECMARK=y CONFIG_NET_PTP_CLASSIFY=y # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_NETLINK_ACCT=m CONFIG_NETFILTER_NETLINK_QUEUE=m CONFIG_NETFILTER_NETLINK_LOG=m CONFIG_NF_CONNTRACK=m CONFIG_NF_LOG_COMMON=m CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_SECMARK=y # CONFIG_NF_CONNTRACK_ZONES is not set CONFIG_NF_CONNTRACK_PROCFS=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CONNTRACK_TIMEOUT=y CONFIG_NF_CONNTRACK_TIMESTAMP=y CONFIG_NF_CONNTRACK_LABELS=y CONFIG_NF_CT_PROTO_DCCP=m CONFIG_NF_CT_PROTO_GRE=m CONFIG_NF_CT_PROTO_SCTP=m CONFIG_NF_CT_PROTO_UDPLITE=m CONFIG_NF_CONNTRACK_AMANDA=m CONFIG_NF_CONNTRACK_FTP=m CONFIG_NF_CONNTRACK_H323=m CONFIG_NF_CONNTRACK_IRC=m CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m CONFIG_NF_CONNTRACK_SNMP=m CONFIG_NF_CONNTRACK_PPTP=m CONFIG_NF_CONNTRACK_SANE=m CONFIG_NF_CONNTRACK_SIP=m CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m CONFIG_NF_CT_NETLINK_TIMEOUT=m CONFIG_NF_CT_NETLINK_HELPER=m CONFIG_NETFILTER_NETLINK_GLUE_CT=y CONFIG_NF_NAT=m CONFIG_NF_NAT_NEEDED=y CONFIG_NF_NAT_PROTO_DCCP=m CONFIG_NF_NAT_PROTO_UDPLITE=m CONFIG_NF_NAT_PROTO_SCTP=m CONFIG_NF_NAT_AMANDA=m CONFIG_NF_NAT_FTP=m CONFIG_NF_NAT_IRC=m CONFIG_NF_NAT_SIP=m CONFIG_NF_NAT_TFTP=m CONFIG_NF_NAT_REDIRECT=m CONFIG_NETFILTER_SYNPROXY=m CONFIG_NF_TABLES=m CONFIG_NF_TABLES_INET=m CONFIG_NF_TABLES_NETDEV=m CONFIG_NFT_EXTHDR=m CONFIG_NFT_META=m CONFIG_NFT_CT=m CONFIG_NFT_RBTREE=m CONFIG_NFT_HASH=m CONFIG_NFT_COUNTER=m CONFIG_NFT_LOG=m CONFIG_NFT_LIMIT=m CONFIG_NFT_MASQ=m CONFIG_NFT_REDIR=m CONFIG_NFT_NAT=m CONFIG_NFT_QUEUE=m CONFIG_NFT_REJECT=m CONFIG_NFT_REJECT_INET=m CONFIG_NFT_COMPAT=m CONFIG_NETFILTER_XTABLES=m # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m CONFIG_NETFILTER_XT_CONNMARK=m CONFIG_NETFILTER_XT_SET=m # # Xtables targets # CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m CONFIG_NETFILTER_XT_TARGET_CONNMARK=m CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m CONFIG_NETFILTER_XT_TARGET_CT=m CONFIG_NETFILTER_XT_TARGET_DSCP=m CONFIG_NETFILTER_XT_TARGET_HL=m CONFIG_NETFILTER_XT_TARGET_HMARK=m CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m CONFIG_NETFILTER_XT_TARGET_LED=m CONFIG_NETFILTER_XT_TARGET_LOG=m CONFIG_NETFILTER_XT_TARGET_MARK=m CONFIG_NETFILTER_XT_NAT=m CONFIG_NETFILTER_XT_TARGET_NETMAP=m CONFIG_NETFILTER_XT_TARGET_NFLOG=m CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m CONFIG_NETFILTER_XT_TARGET_NOTRACK=m CONFIG_NETFILTER_XT_TARGET_RATEEST=m CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_TEE=m CONFIG_NETFILTER_XT_TARGET_TPROXY=m CONFIG_NETFILTER_XT_TARGET_TRACE=m CONFIG_NETFILTER_XT_TARGET_SECMARK=m CONFIG_NETFILTER_XT_TARGET_TCPMSS=m CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m CONFIG_NETFILTER_XT_MATCH_BPF=m CONFIG_NETFILTER_XT_MATCH_CGROUP=m CONFIG_NETFILTER_XT_MATCH_CLUSTER=m CONFIG_NETFILTER_XT_MATCH_COMMENT=m CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m CONFIG_NETFILTER_XT_MATCH_CONNMARK=m CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m CONFIG_NETFILTER_XT_MATCH_CPU=m CONFIG_NETFILTER_XT_MATCH_DCCP=m CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m CONFIG_NETFILTER_XT_MATCH_DSCP=m CONFIG_NETFILTER_XT_MATCH_ECN=m CONFIG_NETFILTER_XT_MATCH_ESP=m CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m CONFIG_NETFILTER_XT_MATCH_HELPER=m CONFIG_NETFILTER_XT_MATCH_HL=m CONFIG_NETFILTER_XT_MATCH_IPCOMP=m CONFIG_NETFILTER_XT_MATCH_IPRANGE=m CONFIG_NETFILTER_XT_MATCH_IPVS=m CONFIG_NETFILTER_XT_MATCH_L2TP=m CONFIG_NETFILTER_XT_MATCH_LENGTH=m CONFIG_NETFILTER_XT_MATCH_LIMIT=m CONFIG_NETFILTER_XT_MATCH_MAC=m CONFIG_NETFILTER_XT_MATCH_MARK=m CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m CONFIG_NETFILTER_XT_MATCH_NFACCT=m CONFIG_NETFILTER_XT_MATCH_OSF=m CONFIG_NETFILTER_XT_MATCH_OWNER=m CONFIG_NETFILTER_XT_MATCH_POLICY=m # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m CONFIG_NETFILTER_XT_MATCH_QUOTA=m CONFIG_NETFILTER_XT_MATCH_QUOTA2=m CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG=y CONFIG_NETFILTER_XT_MATCH_RATEEST=m CONFIG_NETFILTER_XT_MATCH_REALM=m CONFIG_NETFILTER_XT_MATCH_RECENT=m CONFIG_NETFILTER_XT_MATCH_SCTP=m CONFIG_NETFILTER_XT_MATCH_SOCKET=m CONFIG_NETFILTER_XT_MATCH_STATE=m CONFIG_NETFILTER_XT_MATCH_STATISTIC=m CONFIG_NETFILTER_XT_MATCH_STRING=m CONFIG_NETFILTER_XT_MATCH_TCPMSS=m CONFIG_NETFILTER_XT_MATCH_TIME=m CONFIG_NETFILTER_XT_MATCH_U32=m CONFIG_IP_SET=m CONFIG_IP_SET_MAX=256 CONFIG_IP_SET_BITMAP_IP=m CONFIG_IP_SET_BITMAP_IPMAC=m CONFIG_IP_SET_BITMAP_PORT=m CONFIG_IP_SET_HASH_IP=m CONFIG_IP_SET_HASH_IPMARK=m CONFIG_IP_SET_HASH_IPPORT=m CONFIG_IP_SET_HASH_IPPORTIP=m CONFIG_IP_SET_HASH_IPPORTNET=m CONFIG_IP_SET_HASH_MAC=m CONFIG_IP_SET_HASH_NETPORTNET=m CONFIG_IP_SET_HASH_NET=m CONFIG_IP_SET_HASH_NETNET=m CONFIG_IP_SET_HASH_NETPORT=m CONFIG_IP_SET_HASH_NETIFACE=m CONFIG_IP_SET_LIST_SET=m CONFIG_IP_VS=m CONFIG_IP_VS_IPV6=y CONFIG_IP_VS_DEBUG=y CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y CONFIG_IP_VS_PROTO_AH_ESP=y CONFIG_IP_VS_PROTO_ESP=y CONFIG_IP_VS_PROTO_AH=y CONFIG_IP_VS_PROTO_SCTP=y # # IPVS scheduler # CONFIG_IP_VS_RR=m CONFIG_IP_VS_WRR=m CONFIG_IP_VS_LC=m CONFIG_IP_VS_WLC=m CONFIG_IP_VS_FO=m CONFIG_IP_VS_OVF=m CONFIG_IP_VS_LBLC=m CONFIG_IP_VS_LBLCR=m CONFIG_IP_VS_DH=m CONFIG_IP_VS_SH=m CONFIG_IP_VS_SED=m CONFIG_IP_VS_NQ=m # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS application helper # CONFIG_IP_VS_FTP=m CONFIG_IP_VS_NFCT=y CONFIG_IP_VS_PE_SIP=m # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m CONFIG_NF_CONNTRACK_IPV4=m CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_NF_TABLES_IPV4=m CONFIG_NFT_CHAIN_ROUTE_IPV4=m CONFIG_NFT_REJECT_IPV4=m CONFIG_NFT_DUP_IPV4=m CONFIG_NF_TABLES_ARP=m CONFIG_NF_DUP_IPV4=m CONFIG_NF_LOG_ARP=m CONFIG_NF_LOG_IPV4=m CONFIG_NF_REJECT_IPV4=m CONFIG_NF_NAT_IPV4=m CONFIG_NFT_CHAIN_NAT_IPV4=m CONFIG_NF_NAT_MASQUERADE_IPV4=m CONFIG_NFT_MASQ_IPV4=m CONFIG_NFT_REDIR_IPV4=m CONFIG_NF_NAT_SNMP_BASIC=m CONFIG_NF_NAT_PROTO_GRE=m CONFIG_NF_NAT_PPTP=m CONFIG_NF_NAT_H323=m CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_MATCH_AH=m CONFIG_IP_NF_MATCH_ECN=m CONFIG_IP_NF_MATCH_RPFILTER=m CONFIG_IP_NF_MATCH_TTL=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m CONFIG_IP_NF_TARGET_SYNPROXY=m CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_NETMAP=m CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m CONFIG_IP_NF_TARGET_CLUSTERIP=m CONFIG_IP_NF_TARGET_ECN=m CONFIG_IP_NF_TARGET_TTL=m CONFIG_IP_NF_RAW=m CONFIG_IP_NF_ARPTABLES=m CONFIG_IP_NF_ARPFILTER=m CONFIG_IP_NF_ARP_MANGLE=m # # IPv6: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV6=m CONFIG_NF_CONNTRACK_IPV6=m CONFIG_NF_TABLES_IPV6=m CONFIG_NFT_CHAIN_ROUTE_IPV6=m CONFIG_NFT_REJECT_IPV6=m CONFIG_NFT_DUP_IPV6=m CONFIG_NF_DUP_IPV6=m CONFIG_NF_REJECT_IPV6=m CONFIG_NF_LOG_IPV6=m CONFIG_NF_NAT_IPV6=m CONFIG_NFT_CHAIN_NAT_IPV6=m CONFIG_NF_NAT_MASQUERADE_IPV6=m CONFIG_NFT_MASQ_IPV6=m CONFIG_NFT_REDIR_IPV6=m CONFIG_IP6_NF_IPTABLES=m CONFIG_IP6_NF_MATCH_AH=m CONFIG_IP6_NF_MATCH_EUI64=m CONFIG_IP6_NF_MATCH_FRAG=m CONFIG_IP6_NF_MATCH_OPTS=m CONFIG_IP6_NF_MATCH_HL=m CONFIG_IP6_NF_MATCH_IPV6HEADER=m CONFIG_IP6_NF_MATCH_MH=m CONFIG_IP6_NF_MATCH_RPFILTER=m CONFIG_IP6_NF_MATCH_RT=m CONFIG_IP6_NF_TARGET_HL=m CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m CONFIG_IP6_NF_TARGET_SYNPROXY=m CONFIG_IP6_NF_MANGLE=m CONFIG_IP6_NF_RAW=m CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m CONFIG_IP6_NF_TARGET_NPT=m # CONFIG_NF_TABLES_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set CONFIG_RDS=m CONFIG_RDS_TCP=m # CONFIG_RDS_DEBUG is not set # CONFIG_TIPC is not set CONFIG_ATM=m CONFIG_ATM_CLIP=m CONFIG_ATM_CLIP_NO_ICMP=y CONFIG_ATM_LANE=m CONFIG_ATM_MPOA=m CONFIG_ATM_BR2684=m CONFIG_ATM_BR2684_IPFILTER=y CONFIG_L2TP=m # CONFIG_L2TP_DEBUGFS is not set CONFIG_L2TP_V3=y CONFIG_L2TP_IP=m CONFIG_L2TP_ETH=m CONFIG_STP=m CONFIG_GARP=m CONFIG_MRP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y CONFIG_HAVE_NET_DSA=y CONFIG_NET_DSA=m CONFIG_NET_DSA_HWMON=y CONFIG_VLAN_8021Q=m CONFIG_VLAN_8021Q_GVRP=y CONFIG_VLAN_8021Q_MVRP=y # CONFIG_DECNET is not set CONFIG_LLC=m # CONFIG_LLC2 is not set CONFIG_IPX=m CONFIG_IPX_INTERN=y CONFIG_ATALK=m CONFIG_DEV_APPLETALK=m CONFIG_IPDDP=m CONFIG_IPDDP_ENCAP=y # CONFIG_X25 is not set # CONFIG_LAPB is not set CONFIG_PHONET=m CONFIG_6LOWPAN=m CONFIG_6LOWPAN_NHC=m CONFIG_6LOWPAN_NHC_DEST=m CONFIG_6LOWPAN_NHC_FRAGMENT=m CONFIG_6LOWPAN_NHC_HOP=m CONFIG_6LOWPAN_NHC_IPV6=m CONFIG_6LOWPAN_NHC_MOBILITY=m CONFIG_6LOWPAN_NHC_ROUTING=m CONFIG_6LOWPAN_NHC_UDP=m CONFIG_IEEE802154=m CONFIG_IEEE802154_NL802154_EXPERIMENTAL=y CONFIG_IEEE802154_SOCKET=m CONFIG_IEEE802154_6LOWPAN=m CONFIG_MAC802154=m CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_CBQ=m CONFIG_NET_SCH_HTB=m CONFIG_NET_SCH_HFSC=m CONFIG_NET_SCH_ATM=m CONFIG_NET_SCH_PRIO=m CONFIG_NET_SCH_MULTIQ=m CONFIG_NET_SCH_RED=m CONFIG_NET_SCH_SFB=m CONFIG_NET_SCH_SFQ=m CONFIG_NET_SCH_TEQL=m CONFIG_NET_SCH_TBF=m CONFIG_NET_SCH_GRED=m CONFIG_NET_SCH_DSMARK=m CONFIG_NET_SCH_NETEM=m CONFIG_NET_SCH_DRR=m CONFIG_NET_SCH_MQPRIO=m CONFIG_NET_SCH_CHOKE=m CONFIG_NET_SCH_QFQ=m CONFIG_NET_SCH_CODEL=m CONFIG_NET_SCH_FQ_CODEL=m CONFIG_NET_SCH_FQ=m CONFIG_NET_SCH_HHF=m CONFIG_NET_SCH_PIE=m CONFIG_NET_SCH_INGRESS=m CONFIG_NET_SCH_PLUG=m # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=m CONFIG_NET_CLS_TCINDEX=m CONFIG_NET_CLS_ROUTE4=m CONFIG_NET_CLS_FW=m CONFIG_NET_CLS_U32=m CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=m CONFIG_NET_CLS_RSVP6=m CONFIG_NET_CLS_FLOW=m CONFIG_NET_CLS_CGROUP=m CONFIG_NET_CLS_BPF=m CONFIG_NET_CLS_FLOWER=m CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=m CONFIG_NET_EMATCH_NBYTE=m CONFIG_NET_EMATCH_U32=m CONFIG_NET_EMATCH_META=m CONFIG_NET_EMATCH_TEXT=m CONFIG_NET_EMATCH_IPSET=m CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=m CONFIG_NET_ACT_GACT=m CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=m CONFIG_NET_ACT_IPT=m CONFIG_NET_ACT_NAT=m CONFIG_NET_ACT_PEDIT=m CONFIG_NET_ACT_SIMP=m CONFIG_NET_ACT_SKBEDIT=m CONFIG_NET_ACT_CSUM=m CONFIG_NET_ACT_VLAN=m CONFIG_NET_ACT_BPF=m CONFIG_NET_ACT_CONNMARK=m CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y CONFIG_BATMAN_ADV=m CONFIG_BATMAN_ADV_BLA=y CONFIG_BATMAN_ADV_DAT=y CONFIG_BATMAN_ADV_NC=y CONFIG_BATMAN_ADV_MCAST=y # CONFIG_BATMAN_ADV_DEBUG is not set CONFIG_OPENVSWITCH=m CONFIG_OPENVSWITCH_GRE=m CONFIG_VSOCKETS=m CONFIG_NETLINK_DIAG=m CONFIG_MPLS=y CONFIG_NET_MPLS_GSO=m # CONFIG_MPLS_ROUTING is not set # CONFIG_HSR is not set CONFIG_NET_SWITCHDEV=y # CONFIG_NET_L3_MASTER_DEV is not set CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_XPS=y # CONFIG_CGROUP_NET_PRIO is not set CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_JIT is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set CONFIG_BT=y CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m # CONFIG_BT_RFCOMM_TTY is not set # CONFIG_BT_BNEP is not set CONFIG_BT_HIDP=m CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_6LOWPAN is not set # CONFIG_BT_SELFTEST is not set CONFIG_BT_DEBUGFS=y # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m # CONFIG_BT_RTKBTUSB is not set CONFIG_BT_HCIBTUSB=m CONFIG_BT_HCIBTUSB_BCM=y CONFIG_BT_HCIBTUSB_RTL=y # CONFIG_BT_HCIBTSDIO is not set # CONFIG_BT_HCIUART is not set # CONFIG_BT_HCIBCM203X is not set CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIVHCI=m CONFIG_BT_MRVL=m CONFIG_BT_MRVL_SDIO=m # CONFIG_BT_ATH3K is not set # CONFIG_AF_RXRPC is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=y CONFIG_NL80211_TESTMODE=y # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_REG_DEBUG is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set # CONFIG_CFG80211_INTERNAL_REGDB is not set CONFIG_CFG80211_CRDA_SUPPORT=y CONFIG_CFG80211_WEXT=y # CONFIG_LIB80211 is not set CONFIG_MAC80211=y CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_MINSTREL_HT=y CONFIG_MAC80211_RC_MINSTREL_VHT=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 # CONFIG_WIMAX is not set CONFIG_RFKILL=y CONFIG_RFKILL_PM=y CONFIG_RFKILL_LEDS=y # CONFIG_RFKILL_INPUT is not set # CONFIG_RFKILL_REGULATOR is not set # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set CONFIG_LWTUNNEL=y CONFIG_DST_CACHE=y CONFIG_HAVE_BPF_JIT=y CONFIG_HAVE_EBPF_JIT=y # # Device Drivers # CONFIG_ARM_AMBA=y # CONFIG_TEGRA_AHB is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER=y CONFIG_UEVENT_HELPER_PATH="" CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set CONFIG_WANT_DEV_COREDUMP=y CONFIG_ALLOW_DEV_COREDUMP=y CONFIG_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set CONFIG_DEBUG_DEVRES=y # CONFIG_SYS_HYPERVISOR is not set # CONFIG_GENERIC_CPU_DEVICES is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_FENCE_TRACE is not set # # Bus devices # # CONFIG_ARM_CCI400_PMU is not set # CONFIG_ARM_CCI500_PMU is not set # CONFIG_ARM_CCN is not set # CONFIG_VEXPRESS_CONFIG is not set CONFIG_CONNECTOR=y CONFIG_PROC_EVENTS=y CONFIG_MTD=y # CONFIG_MTD_TESTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set # CONFIG_MTD_CMDLINE_PARTS is not set CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AR7_PARTS is not set # # User Modules And Translation Layers # # CONFIG_MTD_BLOCK is not set # CONFIG_MTD_BLOCK_RO is not set # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # CONFIG_RFD_FTL is not set # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set # CONFIG_MTD_OOPS is not set # CONFIG_MTD_SWAP is not set # CONFIG_MTD_PARTITIONED_MASTER is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_CFI_I4 is not set # CONFIG_MTD_CFI_I8 is not set # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_PLATRAM is not set # # Self-contained MTD device drivers # # CONFIG_MTD_DATAFLASH is not set CONFIG_MTD_M25P80=y # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLOCK2MTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOCG3 is not set # CONFIG_MTD_NAND_IDS is not set # CONFIG_MTD_NAND is not set # CONFIG_MTD_ONENAND is not set # # LPDDR & LPDDR2 PCM memory drivers # # CONFIG_MTD_LPDDR is not set CONFIG_MTD_SPI_NOR=y CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y # CONFIG_MTD_UBI is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_NET=y CONFIG_OF_MDIO=y CONFIG_OF_MTD=y CONFIG_OF_RESERVED_MEM=y # CONFIG_OF_OVERLAY is not set # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_ZRAM=y # CONFIG_ZRAM_WRITEBACK is not set # CONFIG_ZRAM_MEMORY_TRACKING is not set # CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=1 CONFIG_BLK_DEV_RAM_SIZE=4096 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set # # Misc devices # # CONFIG_ROCKCHIP_SCR is not set # CONFIG_SENSORS_LIS3LV02D is not set # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1780 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_TI_DAC7512 is not set # CONFIG_BMP085_I2C is not set # CONFIG_BMP085_SPI is not set # CONFIG_USB_SWITCH_FSA9480 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set # CONFIG_MEMORY_STATE_TIME is not set # CONFIG_USB_CAM_GPIO is not set # CONFIG_GPIO_DET is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # # Altera FPGA firmware download module # # CONFIG_ALTERA_STAPL is not set # # Intel MIC Bus Driver # # # SCIF Bus Driver # # # Intel MIC Host Driver # # # Intel MIC Card Driver # # # SCIF Driver # # # Intel MIC Coprocessor State Management (COSM) Drivers # # CONFIG_ECHO is not set # CONFIG_CXL_BASE is not set # CONFIG_CXL_KERNEL_API is not set # CONFIG_CXL_EEH is not set # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_NETLINK is not set # CONFIG_SCSI_MQ_DEFAULT is not set CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set # CONFIG_CHR_DEV_OSST is not set CONFIG_BLK_DEV_SR=y # CONFIG_BLK_DEV_SR_VENDOR is not set # CONFIG_CHR_DEV_SG is not set # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set CONFIG_SCSI_SCAN_ASYNC=y # # SCSI Transports # CONFIG_SCSI_SPI_ATTRS=y # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set # CONFIG_SCSI_DH is not set # CONFIG_SCSI_OSD_INITIATOR is not set CONFIG_HAVE_PATA_PLATFORM=y # CONFIG_ATA is not set # CONFIG_MD is not set # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set # CONFIG_BLK_DEV_DM is not set # CONFIG_TARGET_CORE is not set CONFIG_NETDEVICES=y CONFIG_MII=m CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set # CONFIG_EQUALIZER is not set # CONFIG_IFB is not set # CONFIG_NET_TEAM is not set # CONFIG_MACVLAN is not set # CONFIG_IPVLAN is not set # CONFIG_VXLAN is not set # CONFIG_GENEVE is not set CONFIG_NETCONSOLE=m # CONFIG_NETCONSOLE_DYNAMIC is not set CONFIG_NETPOLL=y CONFIG_NET_POLL_CONTROLLER=y CONFIG_TUN=m CONFIG_TUN_VNET_CROSS_LE=y CONFIG_VETH=m CONFIG_NLMON=m CONFIG_ATM_DRIVERS=y # CONFIG_ATM_DUMMY is not set CONFIG_ATM_TCP=m # # CAIF transport drivers # # # Distributed Switch Architecture drivers # # CONFIG_NET_DSA_MV88E6XXX is not set # CONFIG_NET_DSA_MV88E6060 is not set # CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set # CONFIG_NET_DSA_MV88E6131 is not set # CONFIG_NET_DSA_MV88E6123_61_65 is not set # CONFIG_NET_DSA_MV88E6171 is not set # CONFIG_NET_DSA_MV88E6352 is not set # CONFIG_NET_DSA_BCM_SF2 is not set # CONFIG_ETHERNET is not set CONFIG_PHYLIB=y # # MII PHY device drivers # # CONFIG_AQUANTIA_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_AMD_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_QSEMI_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_TERANETICS_PHY is not set CONFIG_ROCKCHIP_PHY=y # CONFIG_SMSC_PHY is not set # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_REALTEK_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_STE10XP is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MICREL_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_MICROCHIP_PHY is not set # CONFIG_FIXED_PHY is not set # CONFIG_MDIO_BITBANG is not set # CONFIG_MDIO_OCTEON is not set # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MICREL_KS8995MA is not set CONFIG_PPP=m CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m CONFIG_PPP_FILTER=y CONFIG_PPP_MPPE=m CONFIG_PPP_MULTILINK=y CONFIG_PPPOATM=m CONFIG_PPPOE=m CONFIG_PPTP=m CONFIG_PPPOL2TP=m CONFIG_PPPOLAC=m CONFIG_PPPOPNS=m CONFIG_PPP_ASYNC=m CONFIG_PPP_SYNC_TTY=m CONFIG_SLIP=m CONFIG_SLHC=m CONFIG_SLIP_COMPRESSED=y CONFIG_SLIP_SMART=y CONFIG_SLIP_MODE_SLIP6=y CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set CONFIG_USB_RTL8150=m CONFIG_USB_RTL8152=m # CONFIG_USB_LAN78XX is not set CONFIG_USB_USBNET=m CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m # CONFIG_USB_NET_CDC_EEM is not set CONFIG_USB_NET_CDC_NCM=m # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set CONFIG_USB_NET_CDC_MBIM=m # CONFIG_USB_NET_DM9601 is not set # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=m # CONFIG_USB_NET_GL620A is not set # CONFIG_USB_NET_NET1080 is not set # CONFIG_USB_NET_PLUSB is not set # CONFIG_USB_NET_MCS7830 is not set CONFIG_USB_NET_RNDIS_HOST=m # CONFIG_USB_NET_CDC_SUBSET is not set # CONFIG_USB_NET_ZAURUS is not set # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set # CONFIG_USB_HSO is not set # CONFIG_USB_NET_INT51X1 is not set # CONFIG_USB_CDC_PHONET is not set # CONFIG_USB_IPHETH is not set # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set CONFIG_WLAN=y # CONFIG_LIBERTAS_THINFIRM is not set # CONFIG_AT76C50X_USB is not set # CONFIG_USB_ZD1201 is not set # CONFIG_USB_NET_RNDIS_WLAN is not set CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y # CONFIG_MAC80211_HWSIM is not set # CONFIG_VIRT_WIFI is not set # CONFIG_ATH_CARDS is not set # CONFIG_B43 is not set # CONFIG_B43LEGACY is not set # CONFIG_BRCMSMAC is not set # CONFIG_BRCMFMAC is not set # CONFIG_HOSTAP is not set # CONFIG_LIBERTAS is not set # CONFIG_P54_COMMON is not set CONFIG_RT2X00=m CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y # CONFIG_RT2800USB_UNKNOWN is not set CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WL_MEDIATEK=y CONFIG_MT7601U=m CONFIG_MT76_CORE=m CONFIG_MT76_LEDS=y CONFIG_MT76_USB=m CONFIG_MT76x02_LIB=m CONFIG_MT76x02_USB=m CONFIG_MT76x0_COMMON=m CONFIG_MT76x0U=m CONFIG_MT76x2_COMMON=m CONFIG_MT76x2U=m CONFIG_WLAN_VENDOR_MEDIATEK=y # CONFIG_RTL_CARDS is not set CONFIG_RTL8192CU=m # CONFIG_RTL8XXXU is not set CONFIG_WL_ROCKCHIP=y CONFIG_WIFI_BUILD_MODULE=y # CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP is not set # CONFIG_WIFI_GENERATE_RANDOM_MAC_ADDR is not set # CONFIG_AP6XXX is not set # CONFIG_CYW_BCMDHD is not set CONFIG_RTL_WIRELESS_SOLUTION=y # CONFIG_RTL8188EU is not set # CONFIG_RTL8188FU is not set # CONFIG_RTL8189ES is not set # CONFIG_RTL8189FS is not set # CONFIG_RTL8723BS is not set # CONFIG_RTL8723BU is not set # CONFIG_RTL8723CS is not set CONFIG_RTL8723DS=m # CONFIG_MVL88W8977 is not set # # SouthSV 6XXX WLAN support # # CONFIG_SSV6051 is not set # CONFIG_WL_TI is not set # CONFIG_ZD1211RW is not set # CONFIG_MWIFIEX is not set # CONFIG_CW1200 is not set # CONFIG_RSI_91X is not set CONFIG_RTL8812AU=m CONFIG_RTL8822BU=m CONFIG_RTL8821CU=m CONFIG_ESP8089=m CONFIG_ESP8089_DEBUG_FS=y # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set CONFIG_IEEE802154_DRIVERS=m # CONFIG_IEEE802154_FAKELB is not set # CONFIG_IEEE802154_AT86RF230 is not set # CONFIG_IEEE802154_MRF24J40 is not set # CONFIG_IEEE802154_CC2520 is not set # CONFIG_IEEE802154_ATUSB is not set # CONFIG_ISDN is not set # CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y CONFIG_INPUT_POLLDEV=y # CONFIG_INPUT_SPARSEKMAP is not set CONFIG_INPUT_MATRIXKMAP=y # # Userland interfaces # # CONFIG_INPUT_MOUSEDEV is not set CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # CONFIG_INPUT_KEYRESET is not set # CONFIG_INPUT_KEYCOMBO is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_ADC=y # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=m # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=m # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_OMAP4 is not set CONFIG_KEYBOARD_ROCKCHIP=y CONFIG_KEYBOARD_XTKBD=m # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set CONFIG_INPUT_MOUSE=y # CONFIG_MOUSE_PS2 is not set # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set # CONFIG_MOUSE_CYAPA is not set # CONFIG_MOUSE_ELAN_I2C is not set # CONFIG_MOUSE_VSXXXAA is not set # CONFIG_MOUSE_GPIO is not set # CONFIG_MOUSE_SYNAPTICS_I2C is not set # CONFIG_MOUSE_SYNAPTICS_USB is not set CONFIG_INPUT_JOYSTICK=y CONFIG_JOYSTICK_ANALOG=m CONFIG_JOYSTICK_A3D=m CONFIG_JOYSTICK_ADI=m CONFIG_JOYSTICK_COBRA=m CONFIG_JOYSTICK_GF2K=m CONFIG_JOYSTICK_GRIP=m CONFIG_JOYSTICK_GRIP_MP=m CONFIG_JOYSTICK_GUILLEMOT=m CONFIG_JOYSTICK_INTERACT=m CONFIG_JOYSTICK_SIDEWINDER=m CONFIG_JOYSTICK_TMDC=m CONFIG_JOYSTICK_IFORCE=m CONFIG_JOYSTICK_IFORCE_USB=y # CONFIG_JOYSTICK_IFORCE_232 is not set CONFIG_JOYSTICK_WARRIOR=m CONFIG_JOYSTICK_MAGELLAN=m CONFIG_JOYSTICK_SPACEORB=m CONFIG_JOYSTICK_SPACEBALL=m CONFIG_JOYSTICK_STINGER=m CONFIG_JOYSTICK_TWIDJOY=m CONFIG_JOYSTICK_ZHENHUA=m CONFIG_JOYSTICK_AS5011=m CONFIG_JOYSTICK_JOYDUMP=m CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y # CONFIG_JOYSTICK_ADC is not set # CONFIG_JOYSTICK_ODROIDGO2 is not set # CONFIG_JOYSTICK_ODROIDGO3 is not set CONFIG_DRM_PANEL_ODROID_ST7701S=y # CONFIG_QCA_CLD_WLAN is not set CONFIG_JOYSTICK_GAMEFORCE=y # CONFIG_INPUT_TABLET is not set # CONFIG_INPUT_TOUCHSCREEN is not set # CONFIG_ROCKCHIP_REMOTECTL is not set # # handle all sensors # # CONFIG_SENSOR_DEVICE is not set 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_MMA8450 is not set # CONFIG_INPUT_MPU3050 is not set # CONFIG_INPUT_GP2A is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_TILT_POLLED is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYCHORD is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_RK8XX_PWRKEY=y CONFIG_INPUT_UINPUT=y CONFIG_INPUT_GPIO=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_SOC_BUTTON_ARRAY is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # # Hardware I/O ports # CONFIG_SERIO=m CONFIG_SERIO_SERPORT=m # CONFIG_SERIO_AMBAKMI is not set CONFIG_SERIO_LIBPS2=m # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_USERIO is not set CONFIG_GAMEPORT=m # CONFIG_GAMEPORT_NS558 is not set # CONFIG_GAMEPORT_L4 is not set # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y CONFIG_DEVPTS_MULTIPLE_INSTANCES=y # CONFIG_LEGACY_PTYS is not set # 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 is not set # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_DMA=y CONFIG_SERIAL_8250_NR_UARTS=5 CONFIG_SERIAL_8250_RUNTIME_UARTS=5 # CONFIG_SERIAL_8250_EXTENDED is not set CONFIG_SERIAL_8250_FSL=y CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_INGENIC is not set # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set # CONFIG_SERIAL_AMBA_PL011 is not set # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_SERIAL_OF_PLATFORM=y # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_IFX6X60 is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_TTY_PRINTK is not set # CONFIG_HVC_DCC is not set # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set CONFIG_HW_RANDOM_TPM=y # CONFIG_HW_RANDOM_ROCKCHIP is not set # # PCMCIA character devices # # CONFIG_RAW_DRIVER is not set CONFIG_TCG_TPM=y # CONFIG_TCG_TIS_I2C_ATMEL is not set CONFIG_TCG_TIS_I2C_INFINEON=y # CONFIG_TCG_TIS_I2C_NUVOTON is not set # CONFIG_TCG_TIS_ST33ZP24 is not set # CONFIG_XILLYBUS is not set # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # CONFIG_I2C_ARB_GPIO_CHALLENGE=m CONFIG_I2C_MUX_GPIO=m # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set # CONFIG_I2C_MUX_PINCTRL is not set # CONFIG_I2C_MUX_REG is not set CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CADENCE is not set # CONFIG_I2C_CBUS_GPIO is not set # CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_EMEV2 is not set # CONFIG_I2C_GPIO is not set # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_PXA_PCI is not set CONFIG_I2C_RK3X=y # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set CONFIG_SPI_BITBANG=m # CONFIG_SPI_CADENCE is not set CONFIG_SPI_GPIO=m # CONFIG_SPI_FSL_SPI is not set # CONFIG_SPI_OC_TINY is not set # CONFIG_SPI_PL022 is not set # CONFIG_SPI_PXA2XX_PCI is not set CONFIG_SPI_ROCKCHIP=m # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_DESIGNWARE is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=m # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPMI is not set # CONFIG_HSI is not set # # PPS support # CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # CONFIG_PINCTRL=y # # Pin controllers # CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_AMD is not set CONFIG_PINCTRL_ROCKCHIP=y # CONFIG_PINCTRL_SINGLE is not set CONFIG_PINCTRL_RK805=y CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y CONFIG_ARCH_REQUIRE_GPIOLIB=y CONFIG_GPIOLIB=y CONFIG_GPIO_DEVRES=y CONFIG_OF_GPIO=y CONFIG_DEBUG_GPIO=y CONFIG_GPIO_SYSFS=y CONFIG_GPIO_GENERIC=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_DWAPB is not set CONFIG_GPIO_GENERIC_PLATFORM=y # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_PL061 is not set # CONFIG_GPIO_SYSCON is not set # CONFIG_GPIO_XGENE is not set # CONFIG_GPIO_XILINX is not set # CONFIG_GPIO_ZX is not set # # I2C GPIO expanders # # CONFIG_GPIO_ADP5588 is not set # CONFIG_GPIO_ADNP is not set # CONFIG_GPIO_MAX7300 is not set # CONFIG_GPIO_MAX732X is not set # CONFIG_GPIO_PCA953X is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_SX150X is not set # # MFD GPIO expanders # CONFIG_GPIO_RK8XX=y # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # # SPI or I2C GPIO expanders # # CONFIG_GPIO_MCP23S08 is not set # # USB GPIO expanders # # CONFIG_W1 is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_TEST_POWER is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set CONFIG_CHARGER_GPIO=y # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ25700 is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_CHARGER_SY6982C is not set # CONFIG_CHARGER_UNIVERSAL is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_EC is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_RK816 is not set CONFIG_BATTERY_RK817=y CONFIG_CHARGER_RK817=y # CONFIG_BATTERY_RK818 is not set # CONFIG_CHARGER_RK818 is not set # CONFIG_CHARGER_RT9455 is not set CONFIG_POWER_RESET=y CONFIG_POWER_RESET_GPIO=y CONFIG_POWER_RESET_GPIO_RESTART=y # CONFIG_POWER_RESET_LTC2952 is not set # CONFIG_POWER_RESET_RESTART is not set # CONFIG_POWER_RESET_XGENE is not set # CONFIG_POWER_RESET_SYSCON is not set # CONFIG_POWER_RESET_SYSCON_POWEROFF is not set CONFIG_REBOOT_MODE=y CONFIG_SYSCON_REBOOT_MODE=y CONFIG_POWER_AVS=y CONFIG_ROCKCHIP_IODOMAIN=y CONFIG_HWMON=y # CONFIG_HWMON_VID is not set # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_GPIO_FAN is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IIO_HWMON is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_HTU21 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set # CONFIG_SENSORS_PWM_FAN is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH56XX_COMMON is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS1015 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y CONFIG_THERMAL_WRITABLE_TRIPS=y # CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE is not set # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR=y CONFIG_THERMAL_GOV_FAIR_SHARE=y CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y CONFIG_CPU_THERMAL=y # CONFIG_CLOCK_THERMAL is not set CONFIG_DEVFREQ_THERMAL=y # CONFIG_THERMAL_EMULATION is not set # CONFIG_IMX_THERMAL is not set CONFIG_ROCKCHIP_THERMAL=y # CONFIG_RK_VIRTUAL_THERMAL is not set # CONFIG_RK3368_THERMAL is not set CONFIG_WATCHDOG=y # CONFIG_WATCHDOG_CORE is not set # CONFIG_WATCHDOG_NOWAYOUT is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set CONFIG_DW_WATCHDOG=y # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_BCM7038_WDT is not set # CONFIG_MEN_A21_WDT is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y # # Sonics Silicon Backplane # # CONFIG_SSB is not set CONFIG_BCMA_POSSIBLE=y # # Broadcom specific AMBA # # CONFIG_BCMA is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_AXP20X is not set # CONFIG_MFD_CROS_EC is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_INTEL_SOC_PMIC is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RTSX_USB is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_RK618 is not set CONFIG_MFD_RK808=y # CONFIG_MFD_RN5T618 is not set # CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_SMSC is not set # CONFIG_ABX500_CORE is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_MFD_TPS80031 is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TC3589X is not set # CONFIG_MFD_TMIO is not set # CONFIG_MFD_ARIZONA_I2C is not set # CONFIG_MFD_ARIZONA_SPI is not set # CONFIG_MFD_WM8400 is not set # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_RK1000 is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_FUSB_30X is not set CONFIG_REGULATOR=y CONFIG_REGULATOR_DEBUG=y CONFIG_REGULATOR_FIXED_VOLTAGE=y CONFIG_REGULATOR_VIRTUAL_CONSUMER=y CONFIG_REGULATOR_USERSPACE_CONSUMER=y # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_ANATOP is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8752 is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MP8865 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PFUZE100 is not set CONFIG_REGULATOR_PWM=y CONFIG_REGULATOR_RK808=y CONFIG_REGULATOR_RK818=y # CONFIG_REGULATOR_SYR82X is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS549B22 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_XZ3216 is not set CONFIG_MEDIA_SUPPORT=y # # Multimedia core support # CONFIG_MEDIA_CAMERA_SUPPORT=y # CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set # CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set # CONFIG_MEDIA_RADIO_SUPPORT is not set # CONFIG_MEDIA_SDR_SUPPORT is not set CONFIG_MEDIA_RC_SUPPORT=y # CONFIG_MEDIA_CEC_SUPPORT is not set CONFIG_MEDIA_CONTROLLER=y CONFIG_VIDEO_DEV=y CONFIG_VIDEO_V4L2_SUBDEV_API=y CONFIG_VIDEO_V4L2=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_V4L2_MEM2MEM_DEV=y CONFIG_V4L2_FWNODE=y CONFIG_VIDEOBUF_GEN=y CONFIG_VIDEOBUF2_CORE=y CONFIG_VIDEOBUF2_MEMOPS=y CONFIG_VIDEOBUF2_DMA_CONTIG=y CONFIG_VIDEOBUF2_VMALLOC=y CONFIG_VIDEOBUF2_DMA_SG=y # CONFIG_TTPCI_EEPROM is not set # # Media drivers # CONFIG_RC_CORE=y CONFIG_RC_MAP=y # CONFIG_LIRC is not set CONFIG_RC_DECODERS=y CONFIG_IR_NEC_DECODER=y # CONFIG_IR_RC5_DECODER is not set # CONFIG_IR_RC6_DECODER is not set # CONFIG_IR_JVC_DECODER is not set # CONFIG_IR_SONY_DECODER is not set # CONFIG_IR_SANYO_DECODER is not set # CONFIG_IR_SHARP_DECODER is not set # CONFIG_IR_MCE_KBD_DECODER is not set # CONFIG_IR_XMP_DECODER is not set # CONFIG_IR_IMON_DECODER is not set # CONFIG_RC_DEVICES is not set CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # CONFIG_USB_VIDEO_CLASS=y # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_VIDEO_CPIA2 is not set # CONFIG_USB_ZR364XX is not set # CONFIG_USB_STKWEBCAM is not set # CONFIG_USB_S2255 is not set # CONFIG_VIDEO_USBTV is not set # CONFIG_NPU_USB_ACM is not set # # Webcam, TV (analog/digital) USB devices # # CONFIG_VIDEO_EM28XX is not set CONFIG_V4L_PLATFORM_DRIVERS=y CONFIG_SOC_CAMERA=y # CONFIG_SOC_CAMERA_PLATFORM is not set # CONFIG_VIDEO_XILINX is not set # CONFIG_VIDEO_RK_CIF_ISP10 is not set CONFIG_VIDEO_ROCKCHIP_CIF=y CONFIG_ROCKCHIP_CIF_WORKMODE_PINGPONG=y # CONFIG_ROCKCHIP_CIF_WORKMODE_ONEFRAME is not set CONFIG_VIDEO_ROCKCHIP_ISP1=y CONFIG_V4L_MEM2MEM_DRIVERS=y # CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set # CONFIG_VIDEO_SH_VEU is not set CONFIG_VIDEO_ROCKCHIP_RGA=y # CONFIG_VIDEO_ROCKCHIP_VPU is not set # CONFIG_V4L_TEST_DRIVERS is not set # CONFIG_ROCKCHIP_TSP is not set # # Supported MMC/SDIO adapters # # CONFIG_CYPRESS_FIRMWARE is not set # # Media ancillary drivers (tuners, sensors, i2c, spi, frontends) # # CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set # CONFIG_VIDEO_IR_I2C is not set # # I2C Encoders, decoders, sensors and other helper chips # # # Audio decoders, processors and mixers # # CONFIG_VIDEO_TVAUDIO is not set # CONFIG_VIDEO_TDA7432 is not set # CONFIG_VIDEO_TDA9840 is not set # CONFIG_VIDEO_TEA6415C is not set # CONFIG_VIDEO_TEA6420 is not set # CONFIG_VIDEO_MSP3400 is not set # CONFIG_VIDEO_CS5345 is not set # CONFIG_VIDEO_CS53L32A is not set # CONFIG_VIDEO_TLV320AIC23B is not set # CONFIG_VIDEO_UDA1342 is not set # CONFIG_VIDEO_WM8775 is not set # CONFIG_VIDEO_WM8739 is not set # CONFIG_VIDEO_VP27SMPX is not set # CONFIG_VIDEO_SONY_BTF_MPX is not set # # RDS decoders # # CONFIG_VIDEO_SAA6588 is not set # # Video decoders # # CONFIG_VIDEO_ADV7180 is not set # CONFIG_VIDEO_ADV7181D is not set # CONFIG_VIDEO_ADV7183 is not set # CONFIG_VIDEO_ADV7604 is not set # CONFIG_VIDEO_ADV7842 is not set # CONFIG_VIDEO_BT819 is not set # CONFIG_VIDEO_BT856 is not set # CONFIG_VIDEO_BT866 is not set # CONFIG_VIDEO_KS0127 is not set # CONFIG_VIDEO_ML86V7667 is not set # CONFIG_VIDEO_SAA7110 is not set # CONFIG_VIDEO_SAA711X is not set # CONFIG_VIDEO_TC35874X is not set # CONFIG_VIDEO_TVP514X is not set # CONFIG_VIDEO_TVP5150 is not set # CONFIG_VIDEO_TVP7002 is not set # CONFIG_VIDEO_TW2804 is not set # CONFIG_VIDEO_TW9903 is not set # CONFIG_VIDEO_TW9906 is not set # CONFIG_VIDEO_VPX3220 is not set # # Video and audio decoders # # CONFIG_VIDEO_SAA717X is not set # CONFIG_VIDEO_CX25840 is not set # # Video encoders # # CONFIG_VIDEO_SAA7127 is not set # CONFIG_VIDEO_SAA7185 is not set # CONFIG_VIDEO_ADV7170 is not set # CONFIG_VIDEO_ADV7175 is not set # CONFIG_VIDEO_ADV7343 is not set # CONFIG_VIDEO_ADV7393 is not set # CONFIG_VIDEO_ADV7511 is not set # CONFIG_VIDEO_AD9389B is not set # CONFIG_VIDEO_AK881X is not set # CONFIG_VIDEO_THS8200 is not set # # Camera sensor devices # # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX317 is not set # CONFIG_VIDEO_IMX323 is not set # CONFIG_VIDEO_IMX327 is not set # CONFIG_VIDEO_VIRT_CAMERA is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV2718 is not set # CONFIG_VIDEO_OV2735 is not set # CONFIG_VIDEO_OV4689 is not set CONFIG_VIDEO_OV5647=y # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV7251 is not set # CONFIG_VIDEO_OV7640 is not set # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV7725 is not set # CONFIG_VIDEO_OV7750 is not set # CONFIG_VIDEO_OV8858 is not set # CONFIG_VIDEO_OV9281 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_OV9750 is not set # CONFIG_VIDEO_OV13850 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9V011 is not set # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_AR0230 is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_M5MOLS is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_SMIAPP is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_GC2155 is not set # CONFIG_VIDEO_GC0312 is not set # CONFIG_VIDEO_GC2145 is not set # CONFIG_VIDEO_GC2355 is not set # CONFIG_VIDEO_GC2385 is not set # CONFIG_VIDEO_GC5025 is not set # CONFIG_VIDEO_GC5035 is not set # CONFIG_VIDEO_GC8034 is not set # CONFIG_VIDEO_SC031GS is not set # CONFIG_VIDEO_SC132GS is not set # CONFIG_VIDEO_GC0329 is not set # CONFIG_VIDEO_GC2035 is not set # CONFIG_VIDEO_BF3925 is not set # CONFIG_VIDEO_JX_H65 is not set # CONFIG_VIDEO_PREISP_DUMMY_SENSOR is not set # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_AS3645A is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # CONFIG_VIDEO_SGM3784 is not set # # Video improvement chips # # CONFIG_VIDEO_UPD64031A is not set # CONFIG_VIDEO_UPD64083 is not set # # Camera lens devices # # CONFIG_VIDEO_VM149C is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_FP5510 is not set # # Audio/Video compression chips # # CONFIG_VIDEO_SAA6752HS is not set # # Miscellaneous helper chips # # CONFIG_VIDEO_THS7303 is not set # CONFIG_VIDEO_M52790 is not set # CONFIG_VIDEO_NVP6324 is not set # # Sensors used on soc_camera driver # # # soc_camera sensor drivers # # CONFIG_SOC_CAMERA_IMX074 is not set # CONFIG_SOC_CAMERA_MT9M001 is not set # CONFIG_SOC_CAMERA_MT9M111 is not set # CONFIG_SOC_CAMERA_MT9T031 is not set # CONFIG_SOC_CAMERA_MT9T112 is not set # CONFIG_SOC_CAMERA_MT9V022 is not set # CONFIG_SOC_CAMERA_OV2640 is not set # CONFIG_SOC_CAMERA_OV5642 is not set # CONFIG_SOC_CAMERA_OV6650 is not set # CONFIG_SOC_CAMERA_OV772X is not set # CONFIG_SOC_CAMERA_OV9640 is not set # CONFIG_SOC_CAMERA_OV9740 is not set # CONFIG_SOC_CAMERA_RJ54N1 is not set # CONFIG_SOC_CAMERA_TW9910 is not set # # SPI helper chips # # CONFIG_VIDEO_GS1662 is not set # CONFIG_VIDEO_IMX327_SPI is not set CONFIG_VIDEO_ROCKCHIP_PREISP=y # # Customise DVB Frontends # # CONFIG_DVB_AU8522_V4L is not set # CONFIG_DVB_TUNER_DIB0070 is not set # CONFIG_DVB_TUNER_DIB0090 is not set # # Tools to develop new frontends # # CONFIG_DVB_DUMMY_FE is not set # CONFIG_CAMSYS_DRV is not set # CONFIG_ROCK_CHIP_SOC_CAMERA is not set # # Graphics support # CONFIG_DRM=y CONFIG_DRM_IGNORE_IOTCL_PERMIT=y CONFIG_DRM_MIPI_DSI=y CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_KMS_FB_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_LOAD_EDID_FIRMWARE=y # CONFIG_DRM_DP_CEC is not set # CONFIG_DRM_SCDC_HELPER is not set CONFIG_DRM_DMA_SYNC=y # # I2C encoder or helper chips # # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_VGEM is not set CONFIG_DRM_ROCKCHIP=y # CONFIG_ROCKCHIP_DRM_DEBUG is not set # CONFIG_ROCKCHIP_DW_HDMI is not set CONFIG_ROCKCHIP_DW_MIPI_DSI=y # CONFIG_ROCKCHIP_MIPI_CSI_TX is not set # CONFIG_ROCKCHIP_ANALOGIX_DP is not set # CONFIG_ROCKCHIP_INNO_HDMI is not set # CONFIG_ROCKCHIP_LVDS is not set # CONFIG_ROCKCHIP_DRM_TVE is not set # CONFIG_ROCKCHIP_RGB is not set # CONFIG_ROCKCHIP_DRM_BACKLIGHT is not set # CONFIG_ROCKCHIP_RK3066_HDMI is not set # CONFIG_DRM_UDL is not set CONFIG_DRM_PANEL=y # # Display Panels # CONFIG_DRM_PANEL_SIMPLE=y # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set CONFIG_DRM_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_RK1000 is not set # CONFIG_DRM_DUMB_VGA_DAC is not set # CONFIG_DRM_LONTIUM_LT8912 is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set # CONFIG_POWERVR_ROGUE_M is not set # CONFIG_MALI400 is not set CONFIG_MALI_MIDGARD_FOR_ANDROID=y # CONFIG_MALI_MIDGARD_FOR_LINUX is not set # CONFIG_MALI_MIDGARD is not set # CONFIG_MALI_CORESTACK is not set CONFIG_MALI_PWRSOFT_765=y # CONFIG_MALI_KUTF is not set # CONFIG_MALI_BIFROST_FOR_ANDROID is not set CONFIG_MALI_BIFROST_FOR_LINUX=y CONFIG_MALI_BIFROST=y CONFIG_MALI_BIFROST_GATOR_SUPPORT=y # CONFIG_MALI_BIFROST_ENABLE_TRACE is not set CONFIG_MALI_BIFROST_DEVFREQ=y # CONFIG_MALI_BIFROST_DMA_FENCE is not set CONFIG_MALI_PLATFORM_NAME="rk" CONFIG_MALI_BIFROST_EXPERT=y # CONFIG_MALI_BIFROST_PRFCNT_SET_SECONDARY is not set # CONFIG_MALI_BIFROST_DEBUG is not set # CONFIG_MALI_BIFROST_NO_MALI is not set # CONFIG_MALI_BIFROST_TRACE_TIMELINE is not set # CONFIG_MALI_BIFROST_SYSTEM_TRACE is not set # CONFIG_MALI_JOB_DUMP is not set # CONFIG_MALI_2MB_ALLOC is not set # # Frame buffer Devices # CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CMDLINE=y # CONFIG_FB_DDC is not set # CONFIG_FB_BOOT_VESA_SUPPORT is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y # CONFIG_FB_SVGALIB is not set # CONFIG_FB_MACMODES is not set # CONFIG_FB_BACKLIGHT is not set # CONFIG_FB_MODE_HELPERS is not set # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_UVESA is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_BROADSHEET is not set # CONFIG_FB_AUO_K190X is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set CONFIG_BACKLIGHT_LCD_SUPPORT=y # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y CONFIG_BACKLIGHT_GENERIC=y CONFIG_BACKLIGHT_PWM=y # CONFIG_BACKLIGHT_PM8941_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # # Rockchip Misc Video driver # # CONFIG_FB_ROCKCHIP is not set # CONFIG_LCDC_RK3368 is not set CONFIG_LCD_GENERAL=y # CONFIG_LCD_MIPI is not set # CONFIG_RK_TRSM is not set # CONFIG_RK_HDMI is not set # # RGA # # CONFIG_ROCKCHIP_RGA is not set # # RGA2 # CONFIG_ROCKCHIP_RGA2=y # # VCODEC # CONFIG_RK_VCODEC=y # # IEP # # CONFIG_IEP is not set # CONFIG_IEP_MMU is not set # # DP # # # ROCKCHIP_MPP # CONFIG_ROCKCHIP_MPP_SERVICE=y CONFIG_ROCKCHIP_MPP_DEVICE=y # CONFIG_VGASTATE is not set CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y # CONFIG_LOGO is not set CONFIG_SOUND=y # CONFIG_SOUND_OSS_CORE is not set CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_HWDEP=y CONFIG_SND_RAWMIDI=y CONFIG_SND_JACK=y CONFIG_SND_SEQUENCER=y CONFIG_SND_SEQ_DUMMY=y # CONFIG_SND_MIXER_OSS is not set # CONFIG_SND_PCM_OSS is not set CONFIG_SND_PCM_TIMER=y # CONFIG_SND_SEQUENCER_OSS is not set CONFIG_SND_HRTIMER=y CONFIG_SND_SEQ_HRTIMER_DEFAULT=y CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 # CONFIG_SND_SUPPORT_OLD_API is not set CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set # CONFIG_SND_DEBUG is not set CONFIG_SND_RAWMIDI_SEQ=y # CONFIG_SND_OPL3_LIB_SEQ is not set # CONFIG_SND_OPL4_LIB_SEQ is not set # CONFIG_SND_SBAWE_SEQ is not set # CONFIG_SND_EMU10K1_SEQ is not set CONFIG_SND_DRIVERS=y # CONFIG_SND_DUMMY is not set # CONFIG_SND_ALOOP is not set # CONFIG_SND_VIRMIDI is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_MPU401 is not set # # HD-Audio # CONFIG_SND_HDA_PREALLOC_SIZE=64 # CONFIG_SND_SPI is not set CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y # CONFIG_SND_USB_UA101 is not set # CONFIG_SND_USB_CAIAQ is not set # CONFIG_SND_USB_6FIRE is not set # CONFIG_SND_USB_HIFACE is not set # CONFIG_SND_BCD2000 is not set # CONFIG_SND_USB_POD is not set # CONFIG_SND_USB_PODHD is not set # CONFIG_SND_USB_TONEPORT is not set # CONFIG_SND_USB_VARIAX is not set CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # 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_IMX_AUDMUX is not set CONFIG_SND_SOC_ROCKCHIP=y # CONFIG_SND_SOC_ROCKCHIP_FORCE_SRAM is not set CONFIG_SND_SOC_ROCKCHIP_I2S=y # CONFIG_SND_SOC_ROCKCHIP_I2S_TDM is not set CONFIG_SND_SOC_ROCKCHIP_MULTI_DAIS=y CONFIG_SND_SOC_ROCKCHIP_PDM=y # CONFIG_SND_SOC_ROCKCHIP_SPDIF is not set # CONFIG_SND_SOC_ROCKCHIP_SPDIFRX is not set # CONFIG_SND_SOC_ROCKCHIP_VAD is not set # CONFIG_SND_SOC_ROCKCHIP_DA7219 is not set # CONFIG_SND_SOC_ROCKCHIP_HDMI_ANALOG is not set # CONFIG_SND_SOC_ROCKCHIP_MAX98090 is not set CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y # CONFIG_SND_SOC_ROCKCHIP_RT5645 is not set # CONFIG_SND_SOC_ROCKCHIP_RT5651_TC358749 is not set # CONFIG_SND_SOC_ROCKCHIP_CDNDP is not set # # Allwinner SoC Audio support # # CONFIG_SND_SUN4I_CODEC is not set # CONFIG_SND_SOC_XTFPGA_I2S is not set CONFIG_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4554 is not set # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_CS35L32 is not set # CONFIG_SND_SOC_CS42L51_I2C is not set # CONFIG_SND_SOC_CS42L52 is not set # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # CONFIG_SND_SOC_CS4271_SPI is not set # CONFIG_SND_SOC_CS42XX8_I2C is not set # CONFIG_SND_SOC_CS4349 is not set # CONFIG_SND_SOC_CX2072X is not set # CONFIG_SND_SOC_CX20810 is not set # CONFIG_SND_SOC_DUMMY_CODEC is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_ES8316 is not set # CONFIG_SND_SOC_ES8323 is not set # CONFIG_SND_SOC_ES8328 is not set # CONFIG_SND_SOC_ES8328_I2C is not set # CONFIG_SND_SOC_ES8396 is not set # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_GVA_CODEC is not set # CONFIG_SND_SOC_FM1288 is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1792A is not set # CONFIG_SND_SOC_PCM512x_I2C is not set # CONFIG_SND_SOC_PCM512x_SPI is not set # CONFIG_SND_SOC_RK312X is not set # CONFIG_SND_SOC_RK3228 is not set # CONFIG_SND_SOC_RK3308 is not set # CONFIG_SND_SOC_RK3328 is not set CONFIG_SND_SOC_RK817=y # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set # CONFIG_SND_SOC_RT5640 is not set # CONFIG_SND_SOC_RT5651 is not set # CONFIG_SND_SOC_RT5677_SPI is not set # CONFIG_SND_SOC_SGTL5000 is not set # CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set # CONFIG_SND_SOC_SPDIF is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TC358749X is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC3X is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731 is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # 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_WM8962 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_TPA6130A2 is not set CONFIG_SND_SIMPLE_CARD=y # CONFIG_SOUND_PRIME is not set # # HID support # CONFIG_HID=y CONFIG_HID_BATTERY_STRENGTH=y CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACRUX is not set # CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set # CONFIG_HID_BETOP_FF is not set # CONFIG_HID_CHERRY is not set # CONFIG_HID_CHICONY is not set # CONFIG_HID_CORSAIR is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CYPRESS is not set # CONFIG_HID_DRAGONRISE is not set # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set # CONFIG_HID_EZKEY is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_HOLTEK 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_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_TWINHAN is not set CONFIG_HID_KENSINGTON=y # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO is not set # CONFIG_HID_LOGITECH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set CONFIG_HID_MULTITOUCH=y # CONFIG_HID_NTRIG is not set # CONFIG_HID_ORTEK is not set # CONFIG_HID_PANTHERLORD is not set # CONFIG_HID_PENMOUNT is not set # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set # CONFIG_HID_SONY is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEELSERIES is not set # CONFIG_HID_SUNPLUS is not set # CONFIG_HID_RMI is not set # CONFIG_HID_GREENASIA is not set # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_WACOM is not set # CONFIG_HID_WIIMOTE is not set # CONFIG_HID_XINMO is not set # CONFIG_HID_ZEROPLUS is not set # CONFIG_HID_ZYDACRON is not set # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_RKVR is not set # CONFIG_HID_ALPS is not set # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # # I2C HID support # CONFIG_I2C_HID=y CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # # CONFIG_USB_DEFAULT_PERSIST is not set # CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_OTG=y # CONFIG_USB_OTG_WHITELIST is not set # CONFIG_USB_OTG_BLACKLIST_HUB is not set # CONFIG_USB_OTG_FSM is not set # CONFIG_USB_ULPI_BUS is not set CONFIG_USB_MON=m # CONFIG_USB_WUSB_CBAF is not set # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set # CONFIG_USB_XHCI_HCD is not set CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_ROOT_HUB_TT=y CONFIG_USB_EHCI_TT_NEWSCHED=y CONFIG_USB_EHCI_HCD_PLATFORM=y # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_ISP1362_HCD is not set # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD_PLATFORM=y # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=y # CONFIG_USB_PRINTER is not set CONFIG_USB_WDM=y # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=m # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set CONFIG_USB_UAS=m # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set CONFIG_USB_DWC2=m CONFIG_USB_DWC2_HOST=y # # Gadget/Dual-role mode requires USB Gadget support to be enabled # # CONFIG_USB_DWC2_DEBUG is not set CONFIG_USB_DWC2_DUAL_ROLE=y # CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set # CONFIG_USB_CHIPIDEA is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # CONFIG_USB_SERIAL=y # CONFIG_USB_SERIAL_CONSOLE is not set CONFIG_USB_SERIAL_GENERIC=y # CONFIG_USB_SERIAL_SIMPLE is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set # CONFIG_USB_SERIAL_CH341 is not set # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set CONFIG_USB_SERIAL_CP210X=m # CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_EMPEG is not set CONFIG_USB_SERIAL_FTDI_SIO=m # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_F81232 is not set # CONFIG_USB_SERIAL_GARMIN is not set # CONFIG_USB_SERIAL_IPW is not set # CONFIG_USB_SERIAL_IUU is not set # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set CONFIG_USB_SERIAL_KEYSPAN=m # CONFIG_USB_SERIAL_KEYSPAN_MPR is not set # CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set # CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set # CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set # CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set # CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set # CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set # CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set # CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set # CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set # CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set # CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_METRO is not set # CONFIG_USB_SERIAL_MOS7720 is not set # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MXUPORT is not set # CONFIG_USB_SERIAL_NAVMAN is not set CONFIG_USB_SERIAL_PL2303=m CONFIG_USB_SERIAL_OTI6858=m # CONFIG_USB_SERIAL_QCAUX is not set CONFIG_USB_SERIAL_QUALCOMM=m # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SAFE is not set CONFIG_USB_SERIAL_SIERRAWIRELESS=m # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_XIRCOM is not set CONFIG_USB_SERIAL_WWAN=m CONFIG_USB_SERIAL_OPTION=m # CONFIG_USB_SERIAL_OMNINET is not set # CONFIG_USB_SERIAL_OPTICON is not set # CONFIG_USB_SERIAL_XSENS_MT is not set # CONFIG_USB_SERIAL_WISHBONE is not set # CONFIG_USB_SERIAL_SSU100 is not set # CONFIG_USB_SERIAL_QT2 is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_RIO500 is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_LED is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set CONFIG_USB_EZUSB_FX2=y # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # CONFIG_USB_ATM is not set # # USB Physical Layer drivers # # CONFIG_USB_PHY is not set # CONFIG_USB_OTG_WAKELOCK is not set # CONFIG_NOP_USB_XCEIV is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set # CONFIG_USB_ULPI is not set # CONFIG_USB_GADGET is not set # # ROCKCHIP USB Support # # CONFIG_USB20_HOST is not set # CONFIG_USB20_OTG is not set # CONFIG_USB_LED_TRIG is not set # CONFIG_UWB is not set CONFIG_MMC=y # CONFIG_MMC_DEBUG is not set # CONFIG_MMC_EMBEDDED_SDIO is not set # CONFIG_MMC_PARANOID_SD_INIT is not set # # MMC/SD/SDIO Card Drivers # CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 CONFIG_MMC_BLOCK_BOUNCE=y # CONFIG_SDIO_UART is not set CONFIG_MMC_TEST=y # CONFIG_MMC_SIMULATE_MAX_SPEED is not set # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_ARMMMCI is not set # CONFIG_MMC_SDHCI is not set # CONFIG_MMC_SPI is not set CONFIG_MMC_DW=y CONFIG_MMC_DW_PLTFM=y # CONFIG_MMC_DW_EXYNOS is not set # CONFIG_MMC_DW_K3 is not set CONFIG_MMC_DW_ROCKCHIP=y # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set # CONFIG_MMC_MTK is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y # CONFIG_LEDS_CLASS_FLASH is not set # # LED drivers # # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP5521 is not set # CONFIG_LEDS_LP5523 is not set # CONFIG_LEDS_LP5562 is not set # CONFIG_LEDS_LP8501 is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set # CONFIG_LEDS_PWM is not set # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_SYSCON is not set # # LED Triggers # CONFIG_LEDS_TRIGGERS=y # CONFIG_LEDS_TRIGGER_TIMER is not set # CONFIG_LEDS_TRIGGER_ONESHOT is not set CONFIG_LEDS_TRIGGER_HEARTBEAT=y # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set CONFIG_LEDS_TRIGGER_CPU=y CONFIG_LEDS_TRIGGER_GPIO=y # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set # CONFIG_SWITCH is not set # CONFIG_ACCESSIBILITY is not set CONFIG_EDAC_SUPPORT=y # CONFIG_EDAC is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # I2C RTC drivers # # CONFIG_RTC_DRV_ABB5ZES3 is not set # CONFIG_RTC_DRV_ABX80X is not set # CONFIG_RTC_DRV_DS1307 is not set # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_FAKE is not set # CONFIG_RTC_DRV_HYM8563 is not set # CONFIG_RTC_DRV_MAX6900 is not set CONFIG_RTC_DRV_RK808=y # CONFIG_RTC_DRV_RK_TIMER is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12057 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8581 is not set # CONFIG_RTC_DRV_RX8025 is not set # CONFIG_RTC_DRV_EM3027 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RV8803 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_DS3234 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_MCP795 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_PL030 is not set # CONFIG_RTC_DRV_PL031 is not set # CONFIG_RTC_DRV_SNVS is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_HID_SENSOR_TIME is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_OF=y # CONFIG_AMBA_PL08X is not set # CONFIG_FSL_EDMA is not set # CONFIG_INTEL_IDMA64 is not set CONFIG_PL330_DMA=y # CONFIG_DW_DMAC is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set # # Virtio drivers # # CONFIG_VIRTIO_MMIO is not set # # Microsoft Hyper-V guest support # CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_COMEDI is not set # CONFIG_RTLLIB is not set CONFIG_R8712U=m CONFIG_R8188EU=m CONFIG_88EU_AP_MODE=y CONFIG_R8723AU=m CONFIG_8723AU_AP_MODE=y CONFIG_8723AU_BT_COEXIST=y # CONFIG_VT6656 is not set # # IIO staging drivers # # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16203 is not set # CONFIG_ADIS16204 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADIS16220 is not set # CONFIG_ADIS16240 is not set # CONFIG_LIS3L02DQ is not set # CONFIG_SCA3000 is not set # # Analog to digital converters # # CONFIG_AD7606 is not set # CONFIG_AD7780 is not set # CONFIG_AD7816 is not set # CONFIG_AD7192 is not set # CONFIG_AD7280 is not set # # Analog digital bi-direction converters # # CONFIG_ADT7316 is not set # # Capacitance to digital converters # # CONFIG_AD7150 is not set # CONFIG_AD7152 is not set # CONFIG_AD7746 is not set # # Direct Digital Synthesis # # CONFIG_AD9832 is not set # CONFIG_AD9834 is not set # # Digital gyroscope sensors # # CONFIG_ADIS16060 is not set # # Network Analyzer, Impedance Converters # # CONFIG_AD5933 is not set # CONFIG_INV_MPU_IIO is not set # # Light sensors # CONFIG_SENSORS_ISL29018=y # CONFIG_SENSORS_ISL29028 is not set CONFIG_TSL2583=y # CONFIG_TSL2x7x is not set # # Magnetometer sensors # # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # # Active energy metering IC # # CONFIG_ADE7753 is not set # CONFIG_ADE7754 is not set # CONFIG_ADE7758 is not set # CONFIG_ADE7759 is not set # CONFIG_ADE7854 is not set # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1200 is not set # CONFIG_AD2S1210 is not set # # Triggers - standalone # # CONFIG_IIO_PERIODIC_RTC_TRIGGER is not set # CONFIG_IIO_SIMPLE_DUMMY is not set # # Speakup console speech # # CONFIG_SPEAKUP is not set # CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set # CONFIG_STAGING_MEDIA is not set # # Android # # CONFIG_ASHMEM is not set # CONFIG_ANDROID_TIMED_OUTPUT is not set # CONFIG_ANDROID_LOW_MEMORY_KILLER is not set # CONFIG_SYNC is not set # CONFIG_ION is not set CONFIG_FIQ_DEBUGGER=y CONFIG_FIQ_DEBUGGER_NO_SLEEP=y # CONFIG_FIQ_DEBUGGER_WAKEUP_IRQ_ALWAYS_ON is not set CONFIG_FIQ_DEBUGGER_CONSOLE=y CONFIG_FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE=y # CONFIG_FIQ_DEBUGGER_TRUST_ZONE is not set # CONFIG_FIQ_DEBUGGER_UART_OVERLAY is not set # CONFIG_FIQ_WATCHDOG is not set # CONFIG_RK_CONSOLE_THREAD is not set # CONFIG_STAGING_BOARD is not set # CONFIG_WIMAX_GDM72XX is not set # CONFIG_LTE_GDM724X is not set # CONFIG_LUSTRE_FS is not set # CONFIG_DGAP is not set # CONFIG_GS_FPGABOOT is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set # CONFIG_FB_TFT is not set # CONFIG_FSL_MC_BUS is not set # CONFIG_WILC1000_DRIVER is not set # CONFIG_MOST is not set # CONFIG_POWERVR_ROGUE_N is not set # CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Common Clock Framework # # CONFIG_COMMON_CLK_VERSATILE is not set CONFIG_COMMON_CLK_RK808=y # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_CLK_QORIQ is not set # CONFIG_COMMON_CLK_XGENE is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_PXA is not set # CONFIG_COMMON_CLK_CDCE706 is not set # # Hardware Spinlock drivers # # CONFIG_HWSPINLOCK_ROCKCHIP is not set # # Clock Source drivers # CONFIG_CLKSRC_OF=y CONFIG_CLKSRC_PROBE=y CONFIG_ROCKCHIP_TIMER=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y # CONFIG_ARM_ARCH_TIMER_VCT_ACCESS is not set # CONFIG_ARM_TIMER_SP804 is not set # CONFIG_ATMEL_PIT is not set # CONFIG_SH_TIMER_CMT is not set # CONFIG_SH_TIMER_MTU2 is not set # CONFIG_SH_TIMER_TMU is not set # CONFIG_EM_TIMER_STI is not set # CONFIG_MAILBOX is not set CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # # CONFIG_IOMMU_IO_PGTABLE_LPAE is not set CONFIG_IOMMU_IOVA=y CONFIG_OF_IOMMU=y CONFIG_IOMMU_DMA=y CONFIG_ROCKCHIP_IOMMU=y # CONFIG_RK_IOMMU is not set # CONFIG_ARM_SMMU is not set # # Remoteproc drivers # # CONFIG_STE_MODEM_RPROC is not set # # Rpmsg drivers # # # SOC (System On Chip) specific Drivers # # # Rockchip CPU selection # CONFIG_CPU_PX30=y # CONFIG_CPU_RK1808 is not set # CONFIG_CPU_RK3308 is not set CONFIG_CPU_RK3328=y # CONFIG_CPU_RK3366 is not set CONFIG_CPU_RK3368=y CONFIG_CPU_RK3399=y CONFIG_ANDROID_VERSION=0x07010000 CONFIG_ROCKCHIP_CPUINFO=y # CONFIG_ROCKCHIP_DEVICEINFO is not set CONFIG_ROCKCHIP_IPA=y CONFIG_ROCKCHIP_OPP=y # CONFIG_ROCKCHIP_PM_TEST is not set CONFIG_ROCKCHIP_GRF=y CONFIG_ROCKCHIP_PM_DOMAINS=y CONFIG_ROCKCHIP_PVTM=y CONFIG_ROCKCHIP_SUSPEND_MODE=y CONFIG_ROCKCHIP_SYSTEM_MONITOR=y # CONFIG_ROCKCHIP_VENDOR_STORAGE_UPDATE_LOADER is not set # CONFIG_SUNXI_SRAM is not set # CONFIG_SOC_TI is not set CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y CONFIG_DEVFREQ_GOV_PERFORMANCE=y CONFIG_DEVFREQ_GOV_POWERSAVE=y CONFIG_DEVFREQ_GOV_USERSPACE=y # # DEVFREQ Drivers # # CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ is not set CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y CONFIG_PM_DEVFREQ_EVENT=y CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y # CONFIG_DEVFREQ_EVENT_ROCKCHIP_NOCP is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_GPIO is not set # CONFIG_EXTCON_RT8973A is not set # CONFIG_EXTCON_SM5502 is not set # CONFIG_EXTCON_USB_GPIO is not set CONFIG_MEMORY=y # CONFIG_ARM_PL172_MPMC is not set CONFIG_IIO=y CONFIG_IIO_BUFFER=y # CONFIG_IIO_BUFFER_CB is not set CONFIG_IIO_KFIFO_BUF=y CONFIG_IIO_TRIGGER=y CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # # Accelerometers # # CONFIG_BMA180 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MXC4005 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # # Analog to digital converters # # CONFIG_AD7266 is not set # CONFIG_AD7291 is not set # CONFIG_AD7298 is not set # CONFIG_AD7476 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD799X is not set # CONFIG_CC10001_ADC is not set # CONFIG_GPIO_MUXADC is not set # CONFIG_HI8435 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX1363 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_NAU7802 is not set CONFIG_ROCKCHIP_SARADC=y # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_VF610_ADC is not set # # Amplifiers # # CONFIG_AD8366 is not set # # Chemical Sensors # # CONFIG_VZ89X is not set # # Hid Sensor IIO Common # # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # # Digital to analog converters # # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_AD5686 is not set # CONFIG_AD5755 is not set # CONFIG_AD5764 is not set # CONFIG_AD5791 is not set # CONFIG_AD7303 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # # Humidity sensors # # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16480 is not set # CONFIG_KMX61 is not set # CONFIG_INV_MPU6050_IIO is not set # # Light sensors # # CONFIG_ADJD_S311 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_BH1750 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM36651 is not set # CONFIG_GP2AP020A00F is not set # CONFIG_ISL29125 is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_STK3310 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set CONFIG_SENSORS_TSL2563=y # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VL6180 is not set # # Magnetometer sensors # # CONFIG_AK8975 is not set # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN is not set # CONFIG_MAG3110 is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # # Inclinometer sensors # # # Triggers - standalone # # CONFIG_IIO_INTERRUPT_TRIGGER is not set CONFIG_IIO_SYSFS_TRIGGER=y # # Digital potentiometers # # CONFIG_MCP4531 is not set # # Pressure sensors # # CONFIG_BMP280 is not set # CONFIG_MPL115 is not set # CONFIG_MPL3115 is not set # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # # Lightning sensors # # CONFIG_AS3935 is not set # # Proximity sensors # # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_SRF04 is not set # CONFIG_SX9500 is not set # # Temperature sensors # # CONFIG_MLX90614 is not set # CONFIG_TMP006 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_FSL_FTM is not set # CONFIG_PWM_GPIO is not set # CONFIG_PWM_PCA9685 is not set CONFIG_PWM_ROCKCHIP=y # CONFIG_PWM_ROCKCHIP_I2S is not set CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_V3=y CONFIG_PARTITION_PERCPU=y # CONFIG_IPACK_BUS is not set CONFIG_ARCH_HAS_RESET_CONTROLLER=y CONFIG_RESET_CONTROLLER=y # CONFIG_FMC is not set # # PHY Subsystem # CONFIG_GENERIC_PHY=y # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_BCM_KONA_USB2_PHY is not set # CONFIG_PHY_SAMSUNG_USB2 is not set # CONFIG_PHY_XGENE is not set # CONFIG_PHY_ROCKCHIP_USB is not set # CONFIG_PHY_ROCKCHIP_INNO_COMBPHY is not set CONFIG_PHY_ROCKCHIP_INNO_USB2=y # CONFIG_PHY_ROCKCHIP_INNO_USB3 is not set # CONFIG_PHY_ROCKCHIP_EMMC is not set # CONFIG_PHY_ROCKCHIP_DP is not set CONFIG_PHY_ROCKCHIP_MIPI_RX=y # CONFIG_PHY_ROCKCHIP_INNO_MIPI_DPHY is not set # CONFIG_PHY_ROCKCHIP_INNO_HDMI_PHY is not set # CONFIG_PHY_ROCKCHIP_INNO_VIDEO_PHY is not set CONFIG_PHY_ROCKCHIP_INNO_VIDEO_COMBO_PHY=y # CONFIG_PHY_ROCKCHIP_TYPEC is not set # CONFIG_PHY_ROCKCHIP_PCIE is not set # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # CONFIG_ARM_PMU=y CONFIG_RAS=y # # Android # CONFIG_ANDROID=y # CONFIG_ANDROID_BINDER_IPC is not set # CONFIG_LIBNVDIMM is not set CONFIG_NVMEM=y # CONFIG_ROCKCHIP_EFUSE is not set CONFIG_ROCKCHIP_OTP=y # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # # FPGA Configuration Support # # CONFIG_FPGA is not set # CONFIG_TEE is not set CONFIG_RK_FLASH=y # # Rockchip Flash Devices # # CONFIG_RK_NANDC_NAND is not set CONFIG_RK_SFC_NAND=y CONFIG_RK_SFC_NOR=y CONFIG_RK_SFC_NOR_MTD=y # CONFIG_RK_NAND is not set # # Headset device support # # CONFIG_RK_HEADSET is not set # # Gator module for ARM streamline # CONFIG_GATOR=m CONFIG_GATOR_DO_NOT_ONLINE_CORES_AT_STARTUP=y CONFIG_GATOR_WITH_MALI_SUPPORT=y # CONFIG_GATOR_MALI_4XXMP is not set CONFIG_GATOR_MALI_MIDGARD=y CONFIG_GATOR_MALI_MIDGARD_PATH="drivers/gpu/arm/bifrost_for_linux" # # Firmware Drivers # CONFIG_ARM_PSCI_FW=y # CONFIG_FIRMWARE_MEMMAP is not set CONFIG_HAVE_ARM_SMCCC=y CONFIG_ROCKCHIP_SIP=y # # File systems # CONFIG_DCACHE_WORD_ACCESS=y # CONFIG_EXT2_FS is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_POSIX_ACL=y # CONFIG_EXT3_FS_SECURITY is not set 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 CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set # CONFIG_XFS_FS is not set # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set # CONFIG_FS_DAX is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set CONFIG_FSNOTIFY=y # CONFIG_DNOTIFY is not set CONFIG_INOTIFY_USER=y # CONFIG_FANOTIFY is not set # CONFIG_QUOTA is not set # CONFIG_QUOTACTL is not set CONFIG_AUTOFS4_FS=y CONFIG_FUSE_FS=y # CONFIG_CUSE is not set CONFIG_OVERLAY_FS=y # # Caches # CONFIG_FSCACHE=y # CONFIG_FSCACHE_STATS is not set # CONFIG_FSCACHE_HISTOGRAM is not set # CONFIG_FSCACHE_DEBUG is not set # CONFIG_FSCACHE_OBJECT_LIST is not set # CONFIG_CACHEFILES is not set # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=936 CONFIG_FAT_DEFAULT_IOCHARSET="utf8" CONFIG_FAT_DEFAULT_UTF8=y CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_CODEPAGE=936 CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" CONFIG_EXFAT_VIRTUAL_XATTR=y CONFIG_EXFAT_VIRTUAL_XATTR_SELINUX_LABEL="u:object_r:exfat:s0" CONFIG_EXFAT_DEBUG=n CONFIG_EXFAT_UEVENT=n # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_UID=y CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_HUGETLBFS is not set # CONFIG_HUGETLB_PAGE is not set CONFIG_CONFIGFS_FS=y CONFIG_MISC_FILESYSTEMS=y # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set # CONFIG_SDCARD_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS2_FS is not set # CONFIG_LOGFS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y CONFIG_SQUASHFS_DECOMP_SINGLE=y # CONFIG_SQUASHFS_DECOMP_MULTI is not set # CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y # CONFIG_SQUASHFS_LZ4 is not set CONFIG_SQUASHFS_LZO=y # CONFIG_SQUASHFS_XZ is not set # CONFIG_SQUASHFS_ZSTD is not set # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y CONFIG_PSTORE_CONSOLE=y # CONFIG_PSTORE_PMSG is not set # CONFIG_PSTORE_FTRACE is not set CONFIG_PSTORE_RAM=y # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFS_SWAP=y # CONFIG_NFS_V4_1 is not set # CONFIG_ROOT_NFS is not set # CONFIG_NFS_FSCACHE is not set # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_SWAP=y # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set # CONFIG_CIFS_WEAK_PW_HASH is not set # CONFIG_CIFS_UPCALL is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_CIFS_ACL=y CONFIG_CIFS_DEBUG=y # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DFS_UPCALL is not set CONFIG_CIFS_SMB2=y # CONFIG_CIFS_SMB311 is not set CONFIG_CIFS_FSCACHE=y # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set CONFIG_NLS_CODEPAGE_936=y # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set CONFIG_HAVE_KVM_IRQFD=y CONFIG_HAVE_KVM_EVENTFD=y CONFIG_KVM_MMIO=y CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y CONFIG_KVM_VFIO=y CONFIG_HAVE_KVM_ARCH_TLB_FLUSH_ALL=y CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y CONFIG_KVM_COMPAT=y CONFIG_VIRTUALIZATION=y CONFIG_KVM_ARM_VGIC_V3=y CONFIG_KVM=y CONFIG_KVM_ARM_HOST=y CONFIG_VHOST_NET=m # CONFIG_VHOST_VSOCK is not set CONFIG_VHOST=m # CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_PROCESS is not set CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set # CONFIG_DYNAMIC_DEBUG is not set # # Compile-time checks and compiler options # # CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_INFO_SPLIT is not set # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_GDB_SCRIPTS is not set CONFIG_ENABLE_WARN_DEPRECATED=y CONFIG_ENABLE_MUST_CHECK=y 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 CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0 CONFIG_DEBUG_KERNEL=y # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_ARCH_KASAN=y # CONFIG_KASAN is not set # CONFIG_DEBUG_SHIRQ is not set # # Debug Lockups and Hangs # CONFIG_LOCKUP_DETECTOR=y CONFIG_HARDLOCKUP_DETECTOR_OTHER_CPU=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=1 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=1 # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 # CONFIG_SCHED_DEBUG is not set # CONFIG_SCHED_INFO is not set # CONFIG_PANIC_ON_RT_THROTTLING is not set # CONFIG_SCHEDSTATS is not set # CONFIG_SCHED_STACK_END_CHECK is not set # CONFIG_DEBUG_TIMEKEEPING is not set # CONFIG_TIMER_STATS is not set # # Lock Debugging (spinlocks, mutexes, etc...) # # CONFIG_DEBUG_RT_MUTEXES is not set CONFIG_DEBUG_SPINLOCK=y # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set CONFIG_STACKTRACE=y # CONFIG_DEBUG_KOBJECT is not set CONFIG_HAVE_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_BUGVERBOSE is not set # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PI_LIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set CONFIG_DEBUG_CREDENTIALS=y # # RCU Debugging # # CONFIG_PROVE_RCU is not set # CONFIG_SPARSE_RCU_POINTER is not set # CONFIG_TORTURE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=60 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_GPU_TRACEPOINTS=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y # CONFIG_PREEMPTIRQ_EVENTS is not set # CONFIG_IRQSOFF_TRACER is not set # CONFIG_SCHED_TRACER is not set # CONFIG_FTRACE_SYSCALLS is not set # CONFIG_TRACER_SNAPSHOT is not set CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set # CONFIG_STACK_TRACER is not set CONFIG_BLK_DEV_IO_TRACE=y # CONFIG_PROBE_EVENTS is not set # CONFIG_FTRACE is not set # CONFIG_FUNCTION_PROFILER is not set CONFIG_FTRACE_MCOUNT_RECORD=y # CONFIG_FTRACE_STARTUP_TEST is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_TRACE_ENUM_MAP_FILE is not set CONFIG_TRACING_EVENTS_GPIO=y # # Runtime Testing # # CONFIG_LKDTM is not set # CONFIG_TEST_LIST_SORT is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_RBTREE_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_RHASHTABLE is not set # CONFIG_DMA_API_DEBUG is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_UDELAY is not set # CONFIG_MEMTEST is not set # CONFIG_TEST_STATIC_KEYS 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_ARM64_PTDUMP is not set CONFIG_STRICT_DEVMEM=y # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set CONFIG_DEBUG_SET_MODULE_RONX=y CONFIG_DEBUG_RODATA=y # CONFIG_DEBUG_ALIGN_RODATA is not set # CONFIG_CORESIGHT is not set # # Security options # CONFIG_KEYS=y # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_BIG_KEYS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY_PERF_EVENTS_RESTRICT is not set # CONFIG_SECURITY is not set CONFIG_SECURITYFS=y CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HAVE_ARCH_HARDENED_USERCOPY=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_TEE_SUPPORT is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_DEFAULT_SECURITY="" CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_PCOMP2=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y # CONFIG_CRYPTO_RSA is not set CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_WORKQUEUE=y CONFIG_CRYPTO_CRYPTD=y # CONFIG_CRYPTO_MCRYPTD is not set CONFIG_CRYPTO_AUTHENC=m # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_ABLK_HELPER=y # # Authenticated Encryption with Associated Data # CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=m # # Block modes # CONFIG_CRYPTO_CBC=m # CONFIG_CRYPTO_HEH is not set CONFIG_CRYPTO_CTR=y # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # CONFIG_CRYPTO_KEYWRAP is not set # # Hash modes # CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_VMAC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_CRC32 is not set CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_GHASH=y # CONFIG_CRYPTO_POLY1305 is not set CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_ANUBIS is not set CONFIG_CRYPTO_ARC4=y # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_CHACHA20 is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set CONFIG_CRYPTO_TWOFISH=y CONFIG_CRYPTO_TWOFISH_COMMON=y # # Compression # CONFIG_CRYPTO_DEFLATE=m # CONFIG_CRYPTO_ZLIB is not set CONFIG_CRYPTO_LZO=y # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # # Random Number Generation # CONFIG_CRYPTO_ANSI_CPRNG=y CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set # CONFIG_CRYPTO_USER_API_AEAD is not set CONFIG_CRYPTO_HASH_INFO=y CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_CCP is not set # CONFIG_CRYPTO_DEV_ROCKCHIP_V1 is not set # CONFIG_CRYPTO_DEV_ROCKCHIP_V2 is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_PUBLIC_KEY_ALGO_RSA=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" CONFIG_ARM64_CRYPTO=y CONFIG_CRYPTO_SHA1_ARM64_CE=y CONFIG_CRYPTO_SHA2_ARM64_CE=y CONFIG_CRYPTO_GHASH_ARM64_CE=y # CONFIG_CRYPTO_POLY_HASH_ARM64_CE is not set CONFIG_CRYPTO_AES_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64_CE_CCM=y CONFIG_CRYPTO_AES_ARM64_CE_BLK=y # CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set # CONFIG_CRYPTO_CRC32_ARM64 is not set CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_RATIONAL=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_GENERIC_IO=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_CRC_CCITT=y CONFIG_CRC16=y CONFIG_CRC_T10DIF=y CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set CONFIG_CRC7=y CONFIG_LIBCRC32C=y # CONFIG_CRC8 is not set CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_XZ_DEC=y # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set # CONFIG_XZ_DEC_IA64 is not set CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y # CONFIG_XZ_DEC_SPARC is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_GZIP=y CONFIG_DECOMPRESS_BZIP2=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DECOMPRESS_XZ=y CONFIG_DECOMPRESS_LZO=y CONFIG_DECOMPRESS_LZ4=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=m CONFIG_TEXTSEARCH_BM=m CONFIG_TEXTSEARCH_FSM=m CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_DMA=y CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_NLATTR=y CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y CONFIG_CLZ_TAB=y # CONFIG_CORDIC is not set # CONFIG_DDR is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y # CONFIG_SG_SPLIT is not set CONFIG_ARCH_HAS_SG_CHAIN=y ================================================ FILE: projects/Rockchip/devices/GameForce/options ================================================ ################################################################################ # setup device defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) TARGET_CPU="cortex-a35" TARGET_CPU_FLAGS="+crc+crypto" TARGET_FEATURES="64bit" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_PATCH_ARCH="aarch64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a35" TARGET_CPU_FLAGS="+crc" TARGET_FPU="crypto-neon-fp-armv8" TARGET_FEATURES="32bit" ;; esac # Kernel target KERNEL_TARGET="Image" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="" KERNEL_MAKE_EXTRACMD+=" rockchip/rk3326-gameforce-linux.dtb" # Mali GPU family MALI_FAMILY="g31" OPENGLES="mali-bifrost" # kernel serial console EXTRA_CMDLINE="console=ttyFIQ0 console=tty0 net.iframes=0 ssh consoleblank=0" LINUX="gameforce-4.4" UBOOT_SYSTEM="chi" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" FIRMWARE="wlan-firmware misc-firmware" #rockchip-firmware dvb-firmware # additional drivers to install: # for a list of additional drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="" #RTL8192CU RTL8192DU RTL8192EU RTL8188EU RTL8812AU RTL8821CU" # driver addons to install: # for a list of additinoal drivers see packages/linux-driver-addons # Space separated list is supported, DRIVER_ADDONS="" #dvb-latest" # additional packages to install ADDITIONAL_PACKAGES="dtc uinput_joystick rkwifibt bootini" # debug tty path DEBUG_TTY="/dev/ttyFIQ0" # SquashFS compression method (gzip / lzo / xz / zstd) SQUASHFS_COMPRESSION="lzo" # Skins to install (Estuary) # Space separated list is supported, # e.g. SKINS="Estuary" SKINS="Estuary" # Default Skin (Estuary) SKIN_DEFAULT="Estuary" # Select whether to use default (upstream xbmc/xbmc) repo, or specific vendor repo KODI_VENDOR="default" # install extra subtitle Fonts for KODI (yes / no) KODI_EXTRA_FONTS="yes" # build and install PulseAudio support (yes / no) PULSEAUDIO_SUPPORT="yes" # build and install espeak support (yes / no) ESPEAK_SUPPORT="no" # build and install with BluRay support (yes / no) KODI_BLURAY_SUPPORT="no" # build and install with BD+ support # (BD+ decryption support in KODI) (yes / no) BLURAY_BDPLUS_SUPPORT="no" # build and install with AACS support # (BD decryption support in KODI) (yes / no) BLURAY_AACS_SUPPORT="no" # build and install with DVDCSS support # (DVD decryption support in KODI) (yes / no) KODI_DVDCSS_SUPPORT="no" # build and install bluetooth support (yes / no) BLUETOOTH_SUPPORT="yes" # build and install with KODI webfrontend (yes / no) KODI_WEBSERVER_SUPPORT="no" # build and install Avahi (Zeroconf) daemon (yes / no) AVAHI_DAEMON="no" # build with UPnP support (yes / no) KODI_UPNP_SUPPORT="no" # build with MySQL support (mysql / mariadb / none) KODI_MYSQL_SUPPORT="none" # build xbmc with optical drive support (yes / no) KODI_OPTICAL_SUPPORT="no" # build with AirPlay support (stream videos from iDevices to KODI) (yes / no) KODI_AIRPLAY_SUPPORT="no" # build with AirTunes support (stream music from iDevices to KODI) (yes / no) KODI_AIRTUNES_SUPPORT="no" # build with libnfs support (mounting nfs shares with KODI) (yes / no) KODI_NFS_SUPPORT="no" # build with Samba Client support (mounting SAMBA shares with KODI) (yes / no) KODI_SAMBA_SUPPORT="no" # build with NFS support (mounting nfs shares via the OS) (yes / no) NFS_SUPPORT="no" # build with Samba Client support (mounting samba shares via the OS) (yes / no) SAMBA_SUPPORT="yes" # build and install Samba Server (yes / no) SAMBA_SERVER="yes" # build and install SFTP Server (yes / no) SFTP_SERVER="yes" # build and install OpenVPN support (yes / no) OPENVPN_SUPPORT="no" # build and install diskmounter support (udevil) # this service provide auto mounting support for external drives in the # mediacenter also automount internally drives at boottime via udev (yes / no) UDEVIL="yes" # build and install exFAT fuse support (yes / no) EXFAT="yes" # build and install NTFS-3G fuse support (yes / no) NTFS3G="yes" # build and install hfs filesystem utilities (yes / no) HFSTOOLS="yes" # build and install remote support (yes / no) REMOTE_SUPPORT="no" # build and install CEC adapter support (yes / no) CEC_SUPPORT="no" # build and install CEC framework support (yes / no) CEC_FRAMEWORK_SUPPORT="no" # build and install iSCSI support - iscsistart (yes / no) ISCSI_SUPPORT="no" # Support for partitioning and formating disks in initramfs (yes / no) # This adds support for parted and mkfs.ext3/4 to initramfs for OEM usage INITRAMFS_PARTED_SUPPORT="no" # build with swap support (yes / no) SWAP_SUPPORT="yes" # swap support enabled per default (yes / no) SWAP_ENABLED_DEFAULT="yes" # swapfile size if SWAP_SUPPORT=yes in MB SWAPFILESIZE="128" # cron support (yes / no) CRON_SUPPORT="no" # Distribution Specific source location DISTRO_MIRROR="http://sources.libreelec.tv/mirror" DISTRO_SRC="http://sources.libreelec.tv/$LIBREELEC_VERSION" # Addon Server Url ADDON_SERVER_URL="" # Addon ID of the default addon repository ADDON_REPO_ID="" # Name of the default addon repository ADDON_REPO_NAME="" # Version of the default addon repository ADDON_REPO_VERSION="" # set the addon dirs ADDON_PATH="" ADDON_URL="" # Settings package name - blank if not required DISTRO_PKG_SETTINGS="" # IR remote protocols supported in default config IR_REMOTE_PROTOCOLS="" # IR remote keymaps supported in default config IR_REMOTE_KEYMAPS="" ================================================ FILE: projects/Rockchip/devices/GameForce/packages/enable-oga-sleep/package.mk ================================================ PKG_NAME="enable-oga-sleep" PKG_VERSION="" PKG_SHA256="" PKG_ARCH="any" PKG_LICENSE="OSS" PKG_DEPENDS_TARGET="systemd" PKG_SITE="" PKG_URL="" PKG_LONGDESC="Sleep configuration" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p $INSTALL/usr/config/sleep.conf.d cp sleep.conf $INSTALL/usr/config/sleep.conf.d/sleep.conf mkdir -p $INSTALL/usr/lib/systemd/system-sleep/ cp sleep.sh $INSTALL/usr/lib/systemd/system-sleep/sleep } ================================================ FILE: projects/Rockchip/devices/GameForce/packages/enable-oga-sleep/sources/sleep.conf ================================================ # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # # Entries in this file show the compile time defaults. # You can change settings by editing this file. # Defaults can be restored by simply deleting this file. # # See systemd-sleep.conf(5) for details [Sleep] AllowSuspend=yes #AllowHibernation=yes #AllowSuspendThenHibernate=yes #AllowHybridSleep=yes #SuspendMode=suspend SuspendState=mem standby freeze #HibernateMode=platform shutdown #HibernateState=disk #HybridSleepMode=suspend platform shutdown #HybridSleepState=disk #HibernateDelaySec=180min ================================================ FILE: projects/Rockchip/devices/GameForce/packages/enable-oga-sleep/sources/sleep.sh ================================================ #!/bin/bash OGA=$(cat /proc/device-tree/compatible) case $1 in pre) # unload esp8090 WiFi module [[ "${OGA}" == *"gameforce"* ]] && modprobe -r rtl8723ds # Store sound state. Try to avoid having max volume after resume alsactl store -f /tmp/asound.state # workaround until dwc2 is fixed modprobe -r dwc2 # stop hotkey service systemctl stop odroidgoa-headphones.service ;; post) # Restore pre-sleep sound state alsactl restore -f /tmp/asound.state # workaround until dwc2 is fixed modprobe -r dwc2 modprobe -i dwc2 # re-load WiFi module [[ "${OGA}" == *"gameforce"* ]] && modprobe rtl8723ds # re-detect and reapply sound, brightness and hp state systemctl start odroidgoa-headphones.service ;; esac ================================================ FILE: projects/Rockchip/devices/GameForce/packages/odroidgoa-utils/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="odroidgoa-utils" PKG_VERSION="" PKG_SHA256="" PKG_ARCH="any" PKG_LICENSE="OSS" PKG_DEPENDS_TARGET="toolchain python-evdev enable-oga-sleep usb-modeswitch light retrorun" PKG_SITE="" PKG_URL="" PKG_LONGDESC="Support scripts for the ODROID-GO Advance" PKG_TOOLCHAIN="manual" if [ "${ARCH}" = "aarch64" ]; then PKG_DEPENDS_TARGET+=" lib32-retrorun" fi makeinstall_target() { mkdir -p $INSTALL/usr/bin cp * $INSTALL/usr/bin } post_install() { enable_service odroidgoa-hotkeys.service enable_service odroidgoa-headphones.service } ================================================ FILE: projects/Rockchip/devices/GameForce/packages/odroidgoa-utils/sources/headphone_sense.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile # Switch to headphones if we have them already connected at boot GPIO=$(cat /sys/class/gpio/gpio86/value) [[ "$GPIO" == "1" ]] && set_ee_setting "audio.device" "headphone" || set_ee_setting "audio.device" "speakers" if [ -e "/emuelec/configs/emuelec.conf" ]; then /usr/bin/odroidgoa_utils.sh setaudio $(get_ee_setting "audio.device") /usr/bin/odroidgoa_utils.sh vol $(get_ee_setting "audio.volume") /usr/bin/odroidgoa_utils.sh bright $(get_ee_setting "brightness.level") fi # Headphone sensing DEVICE='/dev/input/event1' HP_ON='*(SW_HEADPHONE_INSERT), value 1*' HP_OFF='*(SW_HEADPHONE_INSERT), value 0*' evtest "${DEVICE}" | while read line; do case $line in (${HP_ON}) amixer cset name='Playback Path' HP set_ee_setting "audio.device" "headphone" ;; (${HP_OFF}) amixer cset name='Playback Path' SPK set_ee_setting "audio.device" "speakers" ;; esac done ================================================ FILE: projects/Rockchip/devices/GameForce/packages/odroidgoa-utils/sources/odroidgoa_utils.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # THESE NEEDS TO BE CLEANED UP, MAYBE WITH CASE OR FUNCTIONS # Source predefined functions and variables . /etc/profile if [ "${1}" == "toggleaudio" ];then # Toggle audio output CURRENTAUDIO=$(get_ee_setting "audio.device") case "${CURRENTAUDIO}" in "headphone") echo "setting speakers" amixer cset name='Playback Path' SPK set_ee_setting "audio.device" "speakers" ;; "auto"|"speakers"|*) echo "setting headphones" amixer cset name='Playback Path' HP set_ee_setting "audio.device" "headphone" ;; esac fi if [ "${1}" == "setaudio" ];then # Set audio output second parameter is either headphones or speakers case "${2}" in "headphone") echo "setting headphones" amixer cset name='Playback Path' HP set_ee_setting "audio.device" "headphone" ;; "auto"|"speakers"|*) echo "setting speakers" amixer cset name='Playback Path' SPK set_ee_setting "audio.device" "speakers" ;; esac fi if [ "${1}" == "vol" ];then VOLSTEP=5 CURRENTVOL=$(get_ee_setting "audio.volume") MAXVOL=100 MINVOL=0 if [ "${2}" == "+" ]; then STEPVOL=$(($CURRENTVOL+$VOLSTEP)) elif [ "${2}" == "-" ]; then STEPVOL=$(($CURRENTVOL-$VOLSTEP)) else STEPVOL=${2} fi [ "$STEPVOL" -ge "$MAXVOL" ] && STEPVOL="$MAXVOL" [ "$STEPVOL" -le "$MINVOL" ] && STEPVOL="$MINVOL" amixer set 'Playback' ${STEPVOL}% set_ee_setting "audio.volume" ${STEPVOL} fi if [ "${1}" == "bright" ]; then STEPS="5" CURBRIGHT=$(cat /sys/class/backlight/backlight/brightness) MAXSYSBRIGHT=$(cat /sys/class/backlight/backlight/max_brightness) CURRENTBRIGHT=$(awk -v a="$CURBRIGHT" -v b="$MAXSYSBRIGHT" 'BEGIN{print int((a*100/b)+0.5)}') MAXBRIGHT="100" MINBRIGHT="5" if [ "${2}" == "+" ]; then STEPBRIGHT=$(($CURRENTBRIGHT+$STEPS)) elif [ "${2}" == "-" ]; then STEPBRIGHT=$(($CURRENTBRIGHT-$STEPS)) else STEPBRIGHT=${2} fi [ "$STEPBRIGHT" -ge "$MAXBRIGHT" ] && STEPBRIGHT="$MAXBRIGHT" [ "$STEPBRIGHT" -le "$MINBRIGHT" ] && STEPBRIGHT="$MINBRIGHT" #echo "Setting bright to $STEPBRIGHT" NEWVAL=$(awk -v a="$STEPBRIGHT" -v b="$MAXSYSBRIGHT" 'BEGIN{print int((a*b/100)+0.5)}') echo "${NEWVAL}" > /sys/class/backlight/backlight/brightness set_ee_setting "brightness.level" $STEPBRIGHT fi if [ "${1}" == "oga_oc" ]; then case ${2} in "1.4ghz") gov="userspace" freq="1416000" ;; "1.5ghz") gov="userspace" freq="1512000" ;; *) gov="performance" freq="1296000" ;; esac echo ${gov} > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor echo ${freq} > /sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed echo ${freq} > /sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq fi if [ "${1}" == "bl" ]; then case "${2}" in "red") echo 1 > /sys/class/leds/red/brightness echo 0 > /sys/class/leds/green/brightness echo 0 > /sys/class/leds/blue/brightness ;; "green") echo 0 > /sys/class/leds/red/brightness echo 1 > /sys/class/leds/green/brightness echo 0 > /sys/class/leds/blue/brightness ;; "blue") echo 0 > /sys/class/leds/red/brightness echo 0 > /sys/class/leds/green/brightness echo 1 > /sys/class/leds/blue/brightness ;; "white") echo 1 > /sys/class/leds/red/brightness echo 1 > /sys/class/leds/green/brightness echo 1 > /sys/class/leds/blue/brightness ;; "purple") echo 1 > /sys/class/leds/red/brightness echo 0 > /sys/class/leds/green/brightness echo 1 > /sys/class/leds/blue/brightness ;; "yellow") echo 1 > /sys/class/leds/red/brightness echo 1 > /sys/class/leds/green/brightness echo 0 > /sys/class/leds/blue/brightness ;; "cyan") echo 0 > /sys/class/leds/red/brightness echo 1 > /sys/class/leds/green/brightness echo 1 > /sys/class/leds/blue/brightness ;; "off") echo 0 > /sys/class/leds/red/brightness echo 0 > /sys/class/leds/green/brightness echo 0 > /sys/class/leds/blue/brightness ;; esac fi if [ "${1}" == "pl" ]; then case "${2}" in "off") echo 0 > /sys/class/leds/heartbeat/brightness ;; "heartbeat") echo "heartbeat" > /sys/class/leds/heartbeat/trigger ;; "on") echo 0 > /sys/class/leds/heartbeat/brightness echo 1 > /sys/class/leds/heartbeat/brightness ;; esac fi ================================================ FILE: projects/Rockchip/devices/GameForce/packages/odroidgoa-utils/sources/oga_events.py ================================================ #!/usr/bin/env python3 import evdev import asyncio import time from subprocess import check_output pwrkey = evdev.InputDevice("/dev/input/event0") gameforce_joypad = evdev.InputDevice("/dev/input/by-path/platform-gameforce-gamepad-event-joystick") #adc_joypad = evdev.InputDevice("/dev/input/by-path/platform-adc-keys-event") need_to_swallow_pwr_key = False # After a resume, we swallow the pwr input that triggered the resume class Power: pwr = 116 class Joypad: l1 = 310 r1 = 311 up = 544 down = 545 left = 546 right = 547 #hotkey = 706 hotkey = 704 # volup = 704 # voldown = 705 def runcmd(cmd, *args, **kw): print(f">>> {cmd}") check_output(cmd, *args, **kw) async def handle_event(device): async for event in device.async_read_loop(): global need_to_swallow_pwr_key if device.name == "rk8xx_pwrkey": keys = gameforce_joypad.active_keys() if event.value == 1 and event.code == Power.pwr: # pwr on release if need_to_swallow_pwr_key == False: need_to_swallow_pwr_key = True if Joypad.hotkey in keys: runcmd("/bin/systemctl poweroff || true", shell=True) else: runcmd("/bin/systemctl suspend || true", shell=True) else: need_to_swallow_pwr_key = False elif device.name.find('gameforce') != -1: keys = gameforce_joypad.active_keys() print(keys) if event.value == 1 and Joypad.hotkey in keys: if event.code == Joypad.up: runcmd("/usr/bin/odroidgoa_utils.sh vol +", shell=True) elif event.code == Joypad.down: runcmd("/usr/bin/odroidgoa_utils.sh vol -", shell=True) elif event.code == Joypad.right: runcmd("/usr/bin/odroidgoa_utils.sh bright +", shell=True) elif event.code == Joypad.left: runcmd("/usr/bin/odroidgoa_utils.sh bright -", shell=True) elif event.code == Joypad.r1: runcmd("/usr/bin/odroidgoa_utils.sh toggleaudio", shell=True) if event.code != 0: print(device.name, event) time.sleep(0.001) def run(): asyncio.ensure_future(handle_event(pwrkey)) asyncio.ensure_future(handle_event(gameforce_joypad)) loop = asyncio.get_event_loop() loop.run_forever() if __name__ == "__main__": # admire run() ================================================ FILE: projects/Rockchip/devices/GameForce/packages/odroidgoa-utils/system.d/odroidgoa-headphones.service ================================================ [Unit] Description=Odroid Go Advance Headphone Sense ConditionPathExists=/dev/input/event1 Before=emuelec.target [Service] Environment=HOME=/storage EnvironmentFile=/storage/.config/emulationstation/scripts/es_env.sh ExecStart=/usr/bin/headphone_sense.sh Restart=on-failure [Install] WantedBy=multi-user.target ================================================ FILE: projects/Rockchip/devices/GameForce/packages/odroidgoa-utils/system.d/odroidgoa-hotkeys.service ================================================ [Unit] Description=Odroid Go Advance Hotkeys ConditionPathExists=/dev/input/event0 ConditionPathExists=/dev/input/event2 Before=emuelec.target [Service] Environment=HOME=/storage EnvironmentFile=/storage/.config/emulationstation/scripts/es_env.sh ExecStart=/usr/bin/oga_events.py Type=simple [Install] WantedBy=multi-user.target ================================================ FILE: projects/Rockchip/devices/GameForce/packages/rkwifibt/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="rkwifibt" PKG_VERSION="a389710ca130405a0e6e4f22bc0335c976a5c4b0" PKG_SITE="https://github.com/shantigilbert/rkwifibt" PKG_URL="$PKG_SITE.git" PKG_LICENSE="Unspecified" PKG_DEPENDS_TARGET="toolchain linux" PKG_LONGDESC="rkwifibt" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_IS_KERNEL_PKG="yes" PKG_TOOLCHAIN="manual" BT_TTY_DEV="ttyS1" RKWIFIBT_TOOLCHAIN=${TOOLCHAIN} RKARCH="arm64" pre_make_target() { unset LDFLAGS } make_target() { ${CC} -o ${PKG_BUILD}/brcm_tools/brcm_patchram_plus1 ${PKG_BUILD}/brcm_tools/brcm_patchram_plus1.c ${CC} -o ${PKG_BUILD}/brcm_tools/dhd_priv ${PKG_BUILD}/brcm_tools/dhd_priv.c ${CC} -o ${PKG_BUILD}/src/rk_wifi_init ${PKG_BUILD}/src/rk_wifi_init.c make -C ${PKG_BUILD}/realtek/rtk_hciattach/ CC=${CC} make -C $(kernel_path) M=${PKG_BUILD}/realtek/bluetooth_uart_driver ARCH=$TARGET_KERNEL_ARCH CROSS_COMPILE=$TARGET_KERNEL_PREFIX } makeinstall_target() { mkdir -p $INSTALL/etc cp -rf ${PKG_BUILD}/wpa_supplicant.conf ${INSTALL}/etc/ cp -rf ${PKG_BUILD}/dnsmasq.conf ${INSTALL}/etc/ mkdir -p $INSTALL/usr/bin cp -rf ${PKG_BUILD}/wifi_start.sh ${INSTALL}/usr/bin/ cp -rf ${PKG_BUILD}/src/rk_wifi_init ${INSTALL}/usr/bin/ cp -rf ${PKG_BUILD}/realtek/rtk_hciattach/rtk_hciattach ${INSTALL}/usr/bin/ mkdir -p $INSTALL/$(get_full_firmware_dir)/RTL8723DS cp ${PKG_BUILD}/realtek/RTL8723DS/* $INSTALL/$(get_full_firmware_dir)/RTL8723DS/ mkdir -p $INSTALL/$(get_full_module_dir)/RTL8723DS cp ${PKG_BUILD}/realtek/bluetooth_uart_driver/hci_uart.ko $INSTALL/$(get_full_module_dir)/RTL8723DS/ # $(kernel_path)/build.sh modules #kernel_make -C $(kernel_path) M=${PKG_BUILD}/realtek/bluetooth_uart_driver ARCH=$TARGET_KERNEL_ARCH CROSS_COMPILE=$TARGET_KERNEL_PREFIX \ #INSTALL_MOD_PATH=$INSTALL/$(get_kernel_overlay_dir) INSTALL_MOD_STRIP=1 DEPMOD=: \ #modules_install #find $(kernel_path)/drivers/net/wireless/rockchip_wlan/* -name *8723ds*.ko | xargs -n1 -i cp {} $INSTALL/$(get_full_module_dir)/$PKG_NAME #usr/lib/kernel-overlays/base/lib/modules/4.4.189/kernel/drivers/net/wireless/rockchip_wlan/rtl8723ds #cp *.ko $INSTALL/$(get_full_module_dir)/$PKG_NAME } ================================================ FILE: projects/Rockchip/devices/GameForce/packages/uinput_joystick/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="uinput_joystick" PKG_VERSION="bea7d56f4947b547db2b827640bc9966fe770f84" PKG_SITE="https://github.com/shantigilbert/uinput_joystick" PKG_URL="$PKG_SITE.git" PKG_LICENSE="Apachev2+" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Rockchip uinput joystick for r602" PKG_TOOLCHAIN="make" makeinstall_target() { mkdir -p $INSTALL/usr/bin/ cp $PKG_BUILD/uinput_joystick $INSTALL/usr/bin/uinput_joystick cp $PKG_BUILD/fftest $INSTALL/usr/bin/fftest } post_install() { enable_service uinput_joystick.service } ================================================ FILE: projects/Rockchip/devices/GameForce/packages/uinput_joystick/system.d/uinput_joystick.service ================================================ [Unit] Description=uinput_joystick Before=emustation.service Wants=emustation.service [Service] Environment=HOME=/storage ExecStart=/usr/bin/uinput_joystick KillMode=process TimeoutStopSec=3 Restart=always RestartSec=2 StartLimitInterval=0 [Install] WantedBy=multi-user.target ================================================ FILE: projects/Rockchip/devices/GameForce/patches/lib32-retrorun/flycast_gameforce_chi_rotation_fix.patch ================================================ diff --git a/src/video.cpp b/src/video.cpp index d168eda..66238ee 100755 --- a/src/video.cpp +++ b/src/video.cpp @@ -763,7 +764,7 @@ void core_video_refresh(const void *data, unsigned width, unsigned height, size_ real_aspect_ratio = aspect_ratio; _351BlitRotation = isTate ? GO2_ROTATION_DEGREES_270 : GO2_ROTATION_DEGREES_0; - _351Rotation = isTate ? GO2_ROTATION_DEGREES_180 : GO2_ROTATION_DEGREES_270; + _351Rotation = isTate ? GO2_ROTATION_DEGREES_270 : GO2_ROTATION_DEGREES_0; // test first_video_refresh = false; } if (height != currentHeight || width != currentWidth) ================================================ FILE: projects/Rockchip/devices/GameForce/patches/libgo2/libgo2-gameforce-gamepad.patch ================================================ --- a/src/input.c +++ b/src/input.c @@ -41,6 +41,7 @@ static const char* EVDEV_NAME = "/dev/input/by-path/platform-odroidgo2-joypad-event-joystick"; static const char* EVDEV_NAME_2 = "/dev/input/by-path/platform-odroidgo3-joypad-event-joystick"; +static const char* EVDEV_NAME_3 = "/dev/input/by-path/platform-gameforce-gamepad-event-joystick"; static const char* BATTERY_STATUS_NAME = "/sys/class/power_supply/battery/status"; static const char* BATTERY_CAPACITY_NAME = "/sys/class/power_supply/battery/capacity"; @@ -178,6 +179,9 @@ input->current_state.buttons[Go2InputButton_TopLeft] = libevdev_get_event_value(input->dev, EV_KEY, BTN_TL) ? ButtonState_Pressed : ButtonState_Released; input->current_state.buttons[Go2InputButton_TopRight] = libevdev_get_event_value(input->dev, EV_KEY, BTN_TR) ? ButtonState_Pressed : ButtonState_Released; + input->current_state.buttons[Go2InputButton_SELECT] = libevdev_get_event_value(input->dev, EV_KEY, BTN_SELECT) ? ButtonState_Pressed : ButtonState_Released; + input->current_state.buttons[Go2InputButton_START] = libevdev_get_event_value(input->dev, EV_KEY, BTN_START) ? ButtonState_Pressed : ButtonState_Released; + input->current_state.buttons[Go2InputButton_F1] = libevdev_get_event_value(input->dev, EV_KEY, BTN_TRIGGER_HAPPY1) ? ButtonState_Pressed : ButtonState_Released; input->current_state.buttons[Go2InputButton_F2] = libevdev_get_event_value(input->dev, EV_KEY, BTN_TRIGGER_HAPPY2) ? ButtonState_Pressed : ButtonState_Released; input->current_state.buttons[Go2InputButton_F3] = libevdev_get_event_value(input->dev, EV_KEY, BTN_TRIGGER_HAPPY3) ? ButtonState_Pressed : ButtonState_Released; @@ -188,11 +192,11 @@ input->current_state.buttons[Go2InputButton_TriggerLeft] = libevdev_get_event_value(input->dev, EV_KEY, BTN_TL2) ? ButtonState_Pressed : ButtonState_Released; input->current_state.buttons[Go2InputButton_TriggerRight] = libevdev_get_event_value(input->dev, EV_KEY, BTN_TR2) ? ButtonState_Pressed : ButtonState_Released; - input->current_state.thumbs[Go2InputThumbstick_Left].x = libevdev_get_event_value(input->dev, EV_ABS, ABS_X) / (float)abs_x_max; - input->current_state.thumbs[Go2InputThumbstick_Left].y = libevdev_get_event_value(input->dev, EV_ABS, ABS_Y) / (float)abs_y_max; - - input->current_state.thumbs[Go2InputThumbstick_Right].x = libevdev_get_event_value(input->dev, EV_ABS, ABS_RX) / (float)abs_rx_max; - input->current_state.thumbs[Go2InputThumbstick_Right].y = libevdev_get_event_value(input->dev, EV_ABS, ABS_RY) / (float)abs_ry_max; + input->current_state.thumbs[Go2InputThumbstick_Left].y = libevdev_get_event_value(input->dev, EV_ABS, ABS_X) / (float)abs_y_max; + input->current_state.thumbs[Go2InputThumbstick_Left].x = libevdev_get_event_value(input->dev, EV_ABS, ABS_Y) / (float)abs_x_max; + + input->current_state.thumbs[Go2InputThumbstick_Right].y = libevdev_get_event_value(input->dev, EV_ABS, ABS_RX) / (float)abs_ry_max; + input->current_state.thumbs[Go2InputThumbstick_Right].x = libevdev_get_event_value(input->dev, EV_ABS, ABS_RY) / (float)abs_rx_max; // Events @@ -249,6 +253,13 @@ input->pending_state.buttons[Go2InputButton_TopRight] = state; break; + case BTN_SELECT: + input->pending_state.buttons[Go2InputButton_SELECT] = state; + break; + case BTN_START: + input->pending_state.buttons[Go2InputButton_START] = state; + break; + case BTN_TRIGGER_HAPPY1: input->pending_state.buttons[Go2InputButton_F1] = state; break; @@ -282,17 +293,17 @@ switch (ev.code) { case ABS_X: + input->pending_state.thumbs[Go2InputThumbstick_Left].y = ev.value / (float)abs_y_max; + break; + case ABS_Y: input->pending_state.thumbs[Go2InputThumbstick_Left].x = ev.value / (float)abs_x_max; break; - case ABS_Y: - input->pending_state.thumbs[Go2InputThumbstick_Left].y = ev.value / (float)abs_y_max; - break; case ABS_RX: + input->pending_state.thumbs[Go2InputThumbstick_Right].y = ev.value / (float)abs_ry_max; + break; + case ABS_RY: input->pending_state.thumbs[Go2InputThumbstick_Right].x = ev.value / (float)abs_rx_max; - break; - case ABS_RY: - input->pending_state.thumbs[Go2InputThumbstick_Right].y = ev.value / (float)abs_ry_max; break; } } @@ -334,7 +345,11 @@ result->fd = open(EVDEV_NAME_2, O_RDONLY); if (result->fd < 0) { - printf("Joystick: No gamepad found.\n"); + result->fd = open(EVDEV_NAME_3, O_RDONLY); + if (result->fd < 0) + { + printf("Joystick: No gamepad found.\n"); + } } } @@ -401,8 +416,8 @@ { pthread_mutex_lock(&input->gamepadMutex); - outGamepadState->thumb.x = input->current_state.thumbs[Go2InputThumbstick_Left].x; - outGamepadState->thumb.y = input->current_state.thumbs[Go2InputThumbstick_Left].y; + outGamepadState->thumb.x = input->current_state.thumbs[Go2InputThumbstick_Left].y; + outGamepadState->thumb.y = input->current_state.thumbs[Go2InputThumbstick_Left].x; outGamepadState->dpad.up = input->current_state.buttons[Go2InputButton_DPadUp]; outGamepadState->dpad.down = input->current_state.buttons[Go2InputButton_DPadDown]; @@ -416,6 +431,9 @@ outGamepadState->buttons.top_left = input->current_state.buttons[Go2InputButton_TopLeft]; outGamepadState->buttons.top_right = input->current_state.buttons[Go2InputButton_TopRight]; + + outGamepadState->buttons.select = input->current_state.buttons[Go2InputButton_SELECT]; + outGamepadState->buttons.start = input->current_state.buttons[Go2InputButton_START]; outGamepadState->buttons.f1 = input->current_state.buttons[Go2InputButton_F1]; outGamepadState->buttons.f2 = input->current_state.buttons[Go2InputButton_F2]; --- a/src/input.h +++ b/src/input.h @@ -44,6 +44,9 @@ go2_button_state_t top_left; go2_button_state_t top_right; + + go2_button_state_t select; + go2_button_state_t start; go2_button_state_t f1; go2_button_state_t f2; @@ -122,6 +125,8 @@ Go2InputButton_F4, Go2InputButton_F5, Go2InputButton_F6, + Go2InputButton_SELECT, + Go2InputButton_START, Go2InputButton_TopLeft, Go2InputButton_TopRight, ================================================ FILE: projects/Rockchip/devices/GameForce/patches/retrorun/flycast_gameforce_chi_rotation_fix.patch ================================================ diff --git a/src/video.cpp b/src/video.cpp index d168eda..66238ee 100755 --- a/src/video.cpp +++ b/src/video.cpp @@ -763,7 +764,7 @@ void core_video_refresh(const void *data, unsigned width, unsigned height, size_ real_aspect_ratio = aspect_ratio; _351BlitRotation = isTate ? GO2_ROTATION_DEGREES_270 : GO2_ROTATION_DEGREES_0; - _351Rotation = isTate ? GO2_ROTATION_DEGREES_180 : GO2_ROTATION_DEGREES_270; + _351Rotation = isTate ? GO2_ROTATION_DEGREES_270 : GO2_ROTATION_DEGREES_0; // test first_video_refresh = false; } if (height != currentHeight || width != currentWidth) ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/README.md ================================================ # OdroidGoAdvance This is for Odroid Go Advance device using RK3326 SOC **Build** * `PROJECT=Rockchip DEVICE=OdroidGoAdvance ARCH=aarch64 make image` ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/bootloader/canupdate.sh ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Allow upgrades between arm and aarch64 if [ "$1" = "@PROJECT@.arm" -o "$1" = "@PROJECT@.aarch64" ]; then exit 0 else exit 1 fi ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/bootloader/config ================================================ CONFIG_BOOTDELAY=1 # CONFIG_EFI_LOADER is not set CONFIG_FIT=y CONFIG_FIT_SIGNATURE=n ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/bootloader/install ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_RKBIN="$(get_build_dir rkbin)" PKG_SOC=$UBOOT_SYSTEM if [ "$DEVICE" = "RK3328" -o "$DEVICE" = "RK3399" ]; then PKG_SOC="${DEVICE/RK/rk}" fi if [ "$DEVICE" == "OdroidGoAdvance" ]; then PKG_SOC="px30" fi case "$PKG_SOC" in rk3036) PKG_DATAFILE="spl/u-boot-spl-nodtb.bin" PKG_LOADER="u-boot-dtb.bin" ;; rk3288) PKG_DATAFILE="$PKG_RKBIN/rk32/rk3288_ddr_400MHz_v1.06.bin" PKG_LOADER="$PKG_RKBIN/rk32/rk3288_miniloader_v2.36.bin" PKG_LOAD_ADDR="0x0" ;; px30) PKG_DATAFILE="$PKG_RKBIN/bin/rk33/rk3326_ddr_333MHz_v1.14.bin" PKG_LOADER="$PKG_RKBIN/bin/rk33/rk3326_miniloader_v1.20.bin" PKG_BL31="$PKG_RKBIN/bin/rk33/rk3326_bl31_v1.18.elf" PKG_BL32="$PKG_RKBIN/bin/rk33/rk3326_bl32_v1.13.bin" PKG_LOAD_ADDR="0x00200000" ;; rk3328) PKG_DATAFILE="$PKG_RKBIN/rk33/rk3328_ddr_786MHz_v1.13.bin" PKG_LOADER="$PKG_RKBIN/rk33/rk3328_miniloader_v2.49.bin" PKG_BL31="$PKG_RKBIN/rk33/rk3328_bl31_v1.40.elf" PKG_LOAD_ADDR="0x200000" ;; rk3399) PKG_DATAFILE="$PKG_RKBIN/rk33/rk3399_ddr_800MHz_v1.17.bin" PKG_LOADER="$PKG_RKBIN/rk33/rk3399_miniloader_v1.15.bin" PKG_BL31="$PKG_RKBIN/rk33/rk3399_bl31_v1.24.elf" PKG_LOAD_ADDR="0x200000" ;; *) PKG_DATAFILE="spl/u-boot-spl-dtb.bin" PKG_LOADER="u-boot-dtb.bin" ;; esac if [ -n "$PKG_DATAFILE" -a -n "$PKG_LOADER" ]; then tools/mkimage -n $PKG_SOC -T rksd -d "$PKG_DATAFILE" idbloader.img cat "$PKG_LOADER" >> idbloader.img cp -av idbloader.img $INSTALL/usr/share/bootloader fi if [ -n "$PKG_LOAD_ADDR" ]; then $PKG_RKBIN/tools/loaderimage --pack --uboot u-boot-dtb.bin uboot.img $PKG_LOAD_ADDR cp -av uboot.img $INSTALL/usr/share/bootloader fi if [ $DEVICE = "OdroidGoAdvance" ]; then if [ -n "$PKG_BL31" ]; then cat >trust.ini <<EOF [VERSION] MAJOR=1 MINOR=0 [BL30_OPTION] SEC=0 [BL31_OPTION] SEC=1 PATH=$PKG_BL31 ADDR=0x00010000 [BL32_OPTION] SEC=1 PATH=$PKG_BL32 ADDR=0x08400000 [BL33_OPTION] SEC=0 [OUTPUT] PATH=trust.img EOF $PKG_RKBIN/tools/trust_merger --rsa 3 --verbose trust.ini cp -av trust.img $INSTALL/usr/share/bootloader fi else if [ -n "$PKG_BL31" ]; then cat >trust.ini <<EOF [BL30_OPTION] SEC=0 [BL31_OPTION] SEC=1 PATH=$PKG_BL31 ADDR=0x00010000 [BL32_OPTION] SEC=0 [BL33_OPTION] SEC=0 [OUTPUT] PATH=trust.img EOF $PKG_RKBIN/tools/trust_merger --verbose trust.ini cp -av trust.img $INSTALL/usr/share/bootloader fi fi LE_TMP=$(mktemp -d) mkdir -p "${LE_TMP}/extlinux" mkdir -p $INSTALL/usr/share/bootloader/extlinux LINUX_DTS_DIR=$(get_build_dir linux)/.install_pkg/usr/share/bootloader for dtb in $LINUX_DTS_DIR/*.dtb; do if [ ! -f $dtb ]; then continue fi cat << EOF > "${LE_TMP}/extlinux/$(basename ${dtb}).conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDT /$(basename ${dtb}) APPEND boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@ quiet ${EXTRA_CMDLINE} EOF cp -a "${LE_TMP}/extlinux/$(basename ${dtb}).conf" $INSTALL/usr/share/bootloader/extlinux done ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/bootloader/mkimage ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) if [ -f "$RELEASE_DIR/3rdparty/bootloader/idbloader.img" ]; then echo "image: burn idbloader.img to image..." dd if="$RELEASE_DIR/3rdparty/bootloader/idbloader.img" of="$DISK" bs=32k seek=1 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/uboot.img" ]; then echo "image: burn uboot.img to image..." dd if="$RELEASE_DIR/3rdparty/bootloader/uboot.img" of="$DISK" bs=64k seek=128 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/trust.img" ]; then echo "image: burn trust.img to image..." dd if="$RELEASE_DIR/3rdparty/bootloader/trust.img" of="$DISK" bs=64k seek=192 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/boot.ini" ]; then echo "image: copying boot.ini to root" mcopy "$RELEASE_DIR/3rdparty/bootloader/boot.ini" :: fi mkdir -p "${LE_TMP}/extlinux" # copy device trees to part1 for dtb in $RELEASE_DIR/3rdparty/bootloader/*.dtb; do if [ ! -f $dtb ]; then continue fi cat << EOF > "${LE_TMP}/extlinux/$(basename ${dtb}).conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDT /$(basename ${dtb}) APPEND boot=UUID=${UUID_SYSTEM} disk=UUID=${UUID_STORAGE} quiet ${EXTRA_CMDLINE} EOF [ -e "$dtb" ] && mcopy -o "$dtb" :: done mcopy -so "${LE_TMP}/extlinux" :: ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/bootloader/release ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) mkdir -p $RELEASE_DIR/3rdparty/bootloader if [ -n "$UBOOT_SYSTEM" ]; then BOOTLOADER_DIR=$(get_build_dir $BOOTLOADER) if [ -f $BOOTLOADER_DIR/idbloader.img ]; then cp -a $BOOTLOADER_DIR/idbloader.img $RELEASE_DIR/3rdparty/bootloader fi if [ -f $BOOTLOADER_DIR/uboot.img ]; then cp -a $BOOTLOADER_DIR/uboot.img $RELEASE_DIR/3rdparty/bootloader fi if [ -f $BOOTLOADER_DIR/trust.img ]; then cp -a $BOOTLOADER_DIR/trust.img $RELEASE_DIR/3rdparty/bootloader fi fi if [ -f $INSTALL/usr/share/bootloader/boot.ini ]; then cp -a $INSTALL/usr/share/bootloader/boot.ini $RELEASE_DIR/3rdparty/bootloader fi LINUX_DTS_DIR=$(get_build_dir linux)/arch/$TARGET_KERNEL_ARCH/boot/dts for dtb in $LINUX_DTS_DIR/*.dtb $LINUX_DTS_DIR/*/*.dtb; do if [ -f $dtb ]; then cp -a $dtb $RELEASE_DIR/3rdparty/bootloader fi done LE_TMP=$(mktemp -d) mkdir -p "${LE_TMP}/extlinux" mkdir -p $RELEASE_DIR/3rdparty/bootloader LINUX_DTS_DIR=$(get_build_dir linux)/.install_pkg/usr/share/bootloader for dtb in $RELEASE_DIR/3rdparty/bootloader/*.dtb; do if [ ! -f $dtb ]; then continue fi cat << EOF > "${LE_TMP}/extlinux/$(basename ${dtb}).conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDT /$(basename ${dtb}) APPEND boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@ quiet ${EXTRA_CMDLINE} EOF cp -a "${LE_TMP}/extlinux/$(basename ${dtb}).conf" $RELEASE_DIR/3rdparty/bootloader done ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/bootloader/update.sh ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) [ -z "$SYSTEM_ROOT" ] && SYSTEM_ROOT="" [ -z "$BOOT_ROOT" ] && BOOT_ROOT="/flash" [ -z "$BOOT_PART" ] && BOOT_PART=$(df "$BOOT_ROOT" | tail -1 | awk {' print $1 '}) if [ -z "$BOOT_DISK" ]; then case $BOOT_PART in /dev/sd[a-z][0-9]*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,[0-9]*,,g") ;; /dev/mmcblk*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,p[0-9]*,,g") ;; esac fi # mount $BOOT_ROOT r/w mount -o remount,rw $BOOT_ROOT for arg in $(cat /proc/cmdline); do case $arg in boot=*) boot="${arg#*=}" case $boot in /dev/mmc*) BOOT_UUID="$(blkid $boot | sed 's/.* UUID="//;s/".*//g')" ;; UUID=*|LABEL=*) BOOT_UUID="$(blkid | sed 's/"//g' | grep -m 1 -i " $boot " | sed 's/.* UUID=//;s/ .*//g')" ;; FOLDER=*) BOOT_UUID="$(blkid ${boot#*=} | sed 's/.* UUID="//;s/".*//g')" ;; esac ;; disk=*) disk="${arg#*=}" case $disk in /dev/mmc*) DISK_UUID="$(blkid $disk | sed 's/.* UUID="//;s/".*//g')" ;; UUID=*|LABEL=*) DISK_UUID="$(blkid | sed 's/"//g' | grep -m 1 -i " $disk " | sed 's/.* UUID=//;s/ .*//g')" ;; FOLDER=*) DISK_UUID="$(blkid ${disk#*=} | sed 's/.* UUID="//;s/".*//g')" ;; esac ;; esac done CONFS=$SYSTEM_ROOT/usr/share/bootloader/extlinux/*.conf for all_conf in $CONFS; do conf="$(basename ${all_conf})" echo "Updating ${conf}..." cp -p $SYSTEM_ROOT/usr/share/bootloader/extlinux/${conf} $BOOT_ROOT/extlinux/${conf} sed -e "s/@BOOT_UUID@/$BOOT_UUID/" \ -e "s/@DISK_UUID@/$DISK_UUID/" \ -i $BOOT_ROOT/extlinux/${conf} done if [ -f $SYSTEM_ROOT/usr/share/bootloader/boot.ini ]; then echo "Updating boot.ini..." cp -p $SYSTEM_ROOT/usr/share/bootloader/boot.ini $BOOT_ROOT/boot.ini fi # update device tree for all_dtb in $SYSTEM_ROOT/usr/share/bootloader/*.dtb; do dtb=$(basename $all_dtb) echo -n "Updating $dtb... " cp -p $SYSTEM_ROOT/usr/share/bootloader/$dtb $BOOT_ROOT echo "done" done # update bootloader if [ -f $SYSTEM_ROOT/usr/share/bootloader/idbloader.img ]; then echo -n "Updating idbloader.img... " dd if=$SYSTEM_ROOT/usr/share/bootloader/idbloader.img of=$BOOT_DISK bs=32k seek=1 conv=fsync &>/dev/null echo "done" fi if [ -f $SYSTEM_ROOT/usr/share/bootloader/uboot.img ]; then echo -n "Updating uboot.img... " dd if=$SYSTEM_ROOT/usr/share/bootloader/uboot.img of=$BOOT_DISK bs=64k seek=128 conv=fsync &>/dev/null echo "done" fi if [ -f $SYSTEM_ROOT/usr/share/bootloader/trust.img ]; then echo -n "Updating trust.img... " dd if=$SYSTEM_ROOT/usr/share/bootloader/trust.img of=$BOOT_DISK bs=64k seek=192 conv=fsync &>/dev/null echo "done" fi # mount $BOOT_ROOT r/o sync mount -o remount,ro $BOOT_ROOT # Leave a hint that we just did an update echo "UPDATE" > /storage/.config/boot.hint ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/linux/odroid-go-a-4.4/linux.aarch64.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm64 4.4.189 Kernel Configuration # CONFIG_ARM64=y CONFIG_64BIT=y CONFIG_ARCH_PHYS_ADDR_T_64BIT=y CONFIG_MMU=y CONFIG_ARCH_MMAP_RND_BITS_MIN=18 CONFIG_ARCH_MMAP_RND_BITS_MAX=24 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_ARM64_PAGE_SHIFT=12 CONFIG_ARM64_CONT_SHIFT=4 CONFIG_NO_IOPORT_MAP=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_LOCKDEP_SUPPORT=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CSUM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ZONE_DMA=y CONFIG_HAVE_GENERIC_RCU_GUP=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_SMP=y CONFIG_SWIOTLB=y CONFIG_IOMMU_HELPER=y CONFIG_KERNEL_MODE_NEON=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_PGTABLE_LEVELS=3 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_EXTABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 CONFIG_CROSS_COMPILE="" # CONFIG_COMPILE_TEST is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y # CONFIG_POSIX_MQUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y CONFIG_FHANDLE=y CONFIG_USELIB=y # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_HANDLE_DOMAIN_IRQ=y # CONFIG_IRQ_DOMAIN_DEBUG is not set CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set # CONFIG_SCHED_WALT is not set # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_TASKSTATS is not set # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y # CONFIG_TASKS_RCU is not set CONFIG_RCU_STALL_COMMON=y # CONFIG_TREE_RCU_TRACE is not set # CONFIG_RCU_EXPEDITE_BOOT is not set # CONFIG_BUILD_BIN2C is not set # CONFIG_IKCONFIG is not set CONFIG_LOG_BUF_SHIFT=18 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_GENERIC_SCHED_CLOCK=y CONFIG_CGROUPS=y # CONFIG_CGROUP_DEBUG is not set CONFIG_CGROUP_FREEZER=y # CONFIG_CGROUP_PIDS is not set CONFIG_CGROUP_DEVICE=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_CPUACCT=y # CONFIG_MEMCG is not set # CONFIG_CGROUP_PERF is not set CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set # CONFIG_BLK_CGROUP is not set # CONFIG_CHECKPOINT_RESTORE is not set CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SCHED_TUNE is not set CONFIG_DEFAULT_USE_ENERGY_AWARE=y # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y # CONFIG_INITRD_ASYNC is not set CONFIG_INITRAMFS_SOURCE=" " CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 CONFIG_RD_GZIP=y CONFIG_RD_BZIP2=y CONFIG_RD_LZMA=y CONFIG_RD_XZ=y CONFIG_RD_LZO=y CONFIG_RD_LZ4=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_SYSCTL=y CONFIG_ANON_INODES=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_BPF=y CONFIG_EXPERT=y CONFIG_UID16=y CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set CONFIG_SYSFS_SYSCALL=y # CONFIG_SYSCTL_SYSCALL is not set CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y # CONFIG_BPF_SYSCALL is not set CONFIG_SHMEM=y CONFIG_AIO=y CONFIG_ADVISE_SYSCALLS=y # CONFIG_USERFAULTFD is not set CONFIG_MEMBARRIER=y CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y CONFIG_PERF_USE_VMALLOC=y # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLUB_DEBUG=y CONFIG_COMPAT_BRK=y # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_SYSTEM_DATA_VERIFICATION is not set CONFIG_PROFILING=y CONFIG_TRACEPOINTS=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set # CONFIG_UPROBES is not set # CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_ATTRS=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_CLK=y CONFIG_HAVE_DMA_API_DEBUG=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_RCU_TABLE_FREE=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP_FILTER=y CONFIG_HAVE_CC_STACKPROTECTOR=y # CONFIG_CC_STACKPROTECTOR is not set CONFIG_CC_STACKPROTECTOR_NONE=y # CONFIG_CC_STACKPROTECTOR_REGULAR is not set # CONFIG_CC_STACKPROTECTOR_STRONG is not set CONFIG_HAVE_CONTEXT_TRACKING=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=18 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y CONFIG_HAVE_GENERIC_DMA_COHERENT=y CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y CONFIG_MODULE_FORCE_LOAD=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set # CONFIG_MODULE_COMPRESS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLK_DEV_BSG=y # CONFIG_BLK_DEV_BSGLIB is not set # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_CMDLINE_PARSER is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set CONFIG_RK_PARTITION=y # CONFIG_CMDLINE_PARTITION is not set CONFIG_BLOCK_COMPAT=y # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y # CONFIG_DEFAULT_DEADLINE is not set CONFIG_DEFAULT_CFQ=y # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="cfq" CONFIG_PREEMPT_NOTIFIERS=y CONFIG_ASN1=y CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_FREEZER=y # # Platform selection # # CONFIG_ARCH_BCM_IPROC is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_EXYNOS7 is not set # CONFIG_ARCH_LAYERSCAPE is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_MEDIATEK is not set # CONFIG_ARCH_QCOM is not set CONFIG_ARCH_ROCKCHIP=y CONFIG_ARCH_ROCKCHIP_ODROIDGOA=y # CONFIG_ARCH_SEATTLE is not set # CONFIG_ARCH_STRATIX10 is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_SPRD is not set # CONFIG_ARCH_THUNDER is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_XGENE is not set # CONFIG_ARCH_ZYNQMP is not set # # Bus support # # CONFIG_PCI is not set # CONFIG_PCI_DOMAINS is not set # CONFIG_PCI_DOMAINS_GENERIC is not set # CONFIG_PCI_SYSCALL is not set # # Kernel Features # # # ARM errata workarounds via the alternatives framework # # CONFIG_ARM64_ERRATUM_826319 is not set # CONFIG_ARM64_ERRATUM_827319 is not set # CONFIG_ARM64_ERRATUM_824069 is not set # CONFIG_ARM64_ERRATUM_819472 is not set # CONFIG_ARM64_ERRATUM_832075 is not set CONFIG_ARM64_ERRATUM_834220=y CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y # CONFIG_ARM64_ERRATUM_1024718 is not set # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set CONFIG_CAVIUM_ERRATUM_27456=y CONFIG_ARM64_4K_PAGES=y # CONFIG_ARM64_16K_PAGES is not set # CONFIG_ARM64_64K_PAGES is not set CONFIG_ARM64_VA_BITS_39=y # CONFIG_ARM64_VA_BITS_48 is not set CONFIG_ARM64_VA_BITS=39 # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_SCHED_MC=y # CONFIG_SCHED_SMT is not set CONFIG_NR_CPUS=4 CONFIG_HOTPLUG_CPU=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set # CONFIG_HZ_100 is not set # CONFIG_HZ_250 is not set CONFIG_HZ_300=y # CONFIG_HZ_1000 is not set CONFIG_HZ=300 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_HAVE_ARCH_PFN_VALID=y CONFIG_HW_PERF_EVENTS=y CONFIG_SYS_SUPPORTS_HUGETLBFS=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SPARSEMEM_MANUAL=y CONFIG_SPARSEMEM=y CONFIG_HAVE_MEMORY_PRESENT=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_MEMBLOCK=y CONFIG_NO_BOOTMEM=y # CONFIG_HAVE_BOOTMEM_INFO_NODE is not set CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_COMPACTION=y CONFIG_MIGRATION=y CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_ZONE_DMA_FLAG=1 CONFIG_BOUNCE=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 # CONFIG_TRANSPARENT_HUGEPAGE is not set # CONFIG_CLEANCACHE is not set # CONFIG_FRONTSWAP is not set # CONFIG_CMA is not set # CONFIG_ZPOOL is not set # CONFIG_ZBUD is not set CONFIG_ZSMALLOC=y # CONFIG_PGTABLE_MAPPING is not set # CONFIG_ZSMALLOC_STAT is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_FRAME_VECTOR=y CONFIG_SECCOMP=y # CONFIG_KEXEC is not set # CONFIG_CRASH_DUMP is not set # CONFIG_XEN is not set CONFIG_FORCE_MAX_ZONEORDER=11 CONFIG_UNMAP_KERNEL_AT_EL0=y CONFIG_ARMV8_DEPRECATED=y CONFIG_SWP_EMULATION=y CONFIG_CP15_BARRIER_EMULATION=y CONFIG_SETEND_EMULATION=y # CONFIG_ARM64_SW_TTBR0_PAN is not set # # ARMv8.1 architectural features # CONFIG_ARM64_HW_AFDBM=y CONFIG_ARM64_PAN=y CONFIG_ARM64_LSE_ATOMICS=y CONFIG_ARM64_UAO=y CONFIG_ARM64_MODULE_CMODEL_LARGE=y # CONFIG_RANDOMIZE_BASE is not set # # Boot options # CONFIG_CMDLINE="" # CONFIG_EFI is not set # CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE is not set # # Userspace binary formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y # CONFIG_HAVE_AOUT is not set # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y CONFIG_COMPAT=y CONFIG_SYSVIPC_COMPAT=y CONFIG_KEYS_COMPAT=y # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_SUSPEND_SKIP_SYNC is not set CONFIG_HAS_WAKELOCK=y CONFIG_WAKELOCK=y CONFIG_HIBERNATE_CALLBACKS=y CONFIG_HIBERNATION=y CONFIG_PM_STD_PARTITION="" CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y CONFIG_PM_DEBUG=y CONFIG_PM_ADVANCED_DEBUG=y # CONFIG_PM_TEST_SUSPEND is not set CONFIG_PM_SLEEP_DEBUG=y # CONFIG_DPM_WATCHDOG is not set CONFIG_PM_OPP=y CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y CONFIG_PM_GENERIC_DOMAINS_SLEEP=y CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_HIBERNATION_HEADER=y CONFIG_ARCH_SUSPEND_POSSIBLE=y # # CPU Power Management # # # CPU Idle # CONFIG_CPU_IDLE=y CONFIG_CPU_IDLE_GOV_LADDER=y CONFIG_CPU_IDLE_GOV_MENU=y CONFIG_DT_IDLE_STATES=y # # ARM CPU Idle Drivers # CONFIG_ARM_CPUIDLE=y # CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_STAT_DETAILS is not set # CONFIG_CPU_FREQ_TIMES is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y CONFIG_CPU_FREQ_GOV_INTERACTIVE=y # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y # CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set # CONFIG_ARM_KIRKWOOD_CPUFREQ is not set CONFIG_ARM_ROCKCHIP_CPUFREQ=y CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y CONFIG_NET_INGRESS=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_DIAG=y CONFIG_UNIX=y CONFIG_UNIX_DIAG=y CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set CONFIG_XFRM_MIGRATE=y # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_IPCOMP=m CONFIG_NET_KEY=m CONFIG_NET_KEY_MIGRATE=y CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_IP_FIB_TRIE_STATS=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y CONFIG_IP_ROUTE_CLASSID=y CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y CONFIG_IP_PNP_RARP=y CONFIG_NET_IPIP=m CONFIG_NET_IPGRE_DEMUX=m CONFIG_NET_IP_TUNNEL=m CONFIG_NET_IPGRE=m CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y CONFIG_IP_MROUTE_MULTIPLE_TABLES=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y CONFIG_SYN_COOKIES=y CONFIG_NET_IPVTI=m CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set CONFIG_INET_AH=m CONFIG_INET_ESP=m CONFIG_INET_IPCOMP=m CONFIG_INET_XFRM_TUNNEL=m CONFIG_INET_TUNNEL=m CONFIG_INET_XFRM_MODE_TRANSPORT=m CONFIG_INET_XFRM_MODE_TUNNEL=m CONFIG_INET_XFRM_MODE_BEET=m CONFIG_INET_LRO=m CONFIG_INET_DIAG=m CONFIG_INET_TCP_DIAG=m CONFIG_INET_UDP_DIAG=m CONFIG_INET_DIAG_DESTROY=y CONFIG_TCP_CONG_ADVANCED=y CONFIG_TCP_CONG_BIC=m CONFIG_TCP_CONG_CUBIC=m CONFIG_TCP_CONG_WESTWOOD=m CONFIG_TCP_CONG_HTCP=m CONFIG_TCP_CONG_HSTCP=m CONFIG_TCP_CONG_HYBLA=m CONFIG_TCP_CONG_VEGAS=m CONFIG_TCP_CONG_SCALABLE=m CONFIG_TCP_CONG_LP=m CONFIG_TCP_CONG_VENO=m CONFIG_TCP_CONG_YEAH=m CONFIG_TCP_CONG_ILLINOIS=m CONFIG_TCP_CONG_DCTCP=m CONFIG_TCP_CONG_CDG=m CONFIG_DEFAULT_RENO=y CONFIG_DEFAULT_TCP_CONG="reno" CONFIG_TCP_MD5SIG=y CONFIG_IPV6=m CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y CONFIG_IPV6_OPTIMISTIC_DAD=y CONFIG_INET6_AH=m CONFIG_INET6_ESP=m CONFIG_INET6_IPCOMP=m CONFIG_IPV6_MIP6=m CONFIG_IPV6_ILA=m CONFIG_INET6_XFRM_TUNNEL=m CONFIG_INET6_TUNNEL=m CONFIG_INET6_XFRM_MODE_TRANSPORT=m CONFIG_INET6_XFRM_MODE_TUNNEL=m CONFIG_INET6_XFRM_MODE_BEET=m CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m CONFIG_IPV6_VTI=m CONFIG_IPV6_SIT=m CONFIG_IPV6_SIT_6RD=y CONFIG_IPV6_NDISC_NODETYPE=y CONFIG_IPV6_TUNNEL=m CONFIG_IPV6_GRE=m CONFIG_IPV6_MULTIPLE_TABLES=y CONFIG_IPV6_SUBTREES=y CONFIG_IPV6_MROUTE=y CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y CONFIG_IPV6_PIMSM_V2=y # CONFIG_ANDROID_PARANOID_NETWORK is not set CONFIG_NETWORK_SECMARK=y CONFIG_NET_PTP_CLASSIFY=y # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_DEBUG=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_NETLINK_ACCT=m CONFIG_NETFILTER_NETLINK_QUEUE=m CONFIG_NETFILTER_NETLINK_LOG=m CONFIG_NF_CONNTRACK=m CONFIG_NF_LOG_COMMON=m CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_SECMARK=y # CONFIG_NF_CONNTRACK_ZONES is not set CONFIG_NF_CONNTRACK_PROCFS=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CONNTRACK_TIMEOUT=y CONFIG_NF_CONNTRACK_TIMESTAMP=y CONFIG_NF_CONNTRACK_LABELS=y CONFIG_NF_CT_PROTO_DCCP=m CONFIG_NF_CT_PROTO_GRE=m CONFIG_NF_CT_PROTO_SCTP=m CONFIG_NF_CT_PROTO_UDPLITE=m CONFIG_NF_CONNTRACK_AMANDA=m CONFIG_NF_CONNTRACK_FTP=m CONFIG_NF_CONNTRACK_H323=m CONFIG_NF_CONNTRACK_IRC=m CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m CONFIG_NF_CONNTRACK_SNMP=m CONFIG_NF_CONNTRACK_PPTP=m CONFIG_NF_CONNTRACK_SANE=m CONFIG_NF_CONNTRACK_SIP=m CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m CONFIG_NF_CT_NETLINK_TIMEOUT=m CONFIG_NF_CT_NETLINK_HELPER=m CONFIG_NETFILTER_NETLINK_GLUE_CT=y CONFIG_NF_NAT=m CONFIG_NF_NAT_NEEDED=y CONFIG_NF_NAT_PROTO_DCCP=m CONFIG_NF_NAT_PROTO_UDPLITE=m CONFIG_NF_NAT_PROTO_SCTP=m CONFIG_NF_NAT_AMANDA=m CONFIG_NF_NAT_FTP=m CONFIG_NF_NAT_IRC=m CONFIG_NF_NAT_SIP=m CONFIG_NF_NAT_TFTP=m CONFIG_NF_NAT_REDIRECT=m CONFIG_NETFILTER_SYNPROXY=m CONFIG_NF_TABLES=m CONFIG_NF_TABLES_INET=m CONFIG_NF_TABLES_NETDEV=m CONFIG_NFT_EXTHDR=m CONFIG_NFT_META=m CONFIG_NFT_CT=m CONFIG_NFT_RBTREE=m CONFIG_NFT_HASH=m CONFIG_NFT_COUNTER=m CONFIG_NFT_LOG=m CONFIG_NFT_LIMIT=m CONFIG_NFT_MASQ=m CONFIG_NFT_REDIR=m CONFIG_NFT_NAT=m CONFIG_NFT_QUEUE=m CONFIG_NFT_REJECT=m CONFIG_NFT_REJECT_INET=m CONFIG_NFT_COMPAT=m CONFIG_NETFILTER_XTABLES=m # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m CONFIG_NETFILTER_XT_CONNMARK=m CONFIG_NETFILTER_XT_SET=m # # Xtables targets # CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m CONFIG_NETFILTER_XT_TARGET_CONNMARK=m CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m CONFIG_NETFILTER_XT_TARGET_CT=m CONFIG_NETFILTER_XT_TARGET_DSCP=m CONFIG_NETFILTER_XT_TARGET_HL=m CONFIG_NETFILTER_XT_TARGET_HMARK=m CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m CONFIG_NETFILTER_XT_TARGET_LED=m CONFIG_NETFILTER_XT_TARGET_LOG=m CONFIG_NETFILTER_XT_TARGET_MARK=m CONFIG_NETFILTER_XT_NAT=m CONFIG_NETFILTER_XT_TARGET_NETMAP=m CONFIG_NETFILTER_XT_TARGET_NFLOG=m CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m CONFIG_NETFILTER_XT_TARGET_NOTRACK=m CONFIG_NETFILTER_XT_TARGET_RATEEST=m CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_TEE=m CONFIG_NETFILTER_XT_TARGET_TPROXY=m CONFIG_NETFILTER_XT_TARGET_TRACE=m CONFIG_NETFILTER_XT_TARGET_SECMARK=m CONFIG_NETFILTER_XT_TARGET_TCPMSS=m CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m CONFIG_NETFILTER_XT_MATCH_BPF=m CONFIG_NETFILTER_XT_MATCH_CGROUP=m CONFIG_NETFILTER_XT_MATCH_CLUSTER=m CONFIG_NETFILTER_XT_MATCH_COMMENT=m CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m CONFIG_NETFILTER_XT_MATCH_CONNMARK=m CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m CONFIG_NETFILTER_XT_MATCH_CPU=m CONFIG_NETFILTER_XT_MATCH_DCCP=m CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m CONFIG_NETFILTER_XT_MATCH_DSCP=m CONFIG_NETFILTER_XT_MATCH_ECN=m CONFIG_NETFILTER_XT_MATCH_ESP=m CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m CONFIG_NETFILTER_XT_MATCH_HELPER=m CONFIG_NETFILTER_XT_MATCH_HL=m CONFIG_NETFILTER_XT_MATCH_IPCOMP=m CONFIG_NETFILTER_XT_MATCH_IPRANGE=m CONFIG_NETFILTER_XT_MATCH_IPVS=m CONFIG_NETFILTER_XT_MATCH_L2TP=m CONFIG_NETFILTER_XT_MATCH_LENGTH=m CONFIG_NETFILTER_XT_MATCH_LIMIT=m CONFIG_NETFILTER_XT_MATCH_MAC=m CONFIG_NETFILTER_XT_MATCH_MARK=m CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m CONFIG_NETFILTER_XT_MATCH_NFACCT=m CONFIG_NETFILTER_XT_MATCH_OSF=m CONFIG_NETFILTER_XT_MATCH_OWNER=m CONFIG_NETFILTER_XT_MATCH_POLICY=m # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m CONFIG_NETFILTER_XT_MATCH_QUOTA=m CONFIG_NETFILTER_XT_MATCH_QUOTA2=m CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG=y CONFIG_NETFILTER_XT_MATCH_RATEEST=m CONFIG_NETFILTER_XT_MATCH_REALM=m CONFIG_NETFILTER_XT_MATCH_RECENT=m CONFIG_NETFILTER_XT_MATCH_SCTP=m CONFIG_NETFILTER_XT_MATCH_SOCKET=m CONFIG_NETFILTER_XT_MATCH_STATE=m CONFIG_NETFILTER_XT_MATCH_STATISTIC=m CONFIG_NETFILTER_XT_MATCH_STRING=m CONFIG_NETFILTER_XT_MATCH_TCPMSS=m CONFIG_NETFILTER_XT_MATCH_TIME=m CONFIG_NETFILTER_XT_MATCH_U32=m CONFIG_IP_SET=m CONFIG_IP_SET_MAX=256 CONFIG_IP_SET_BITMAP_IP=m CONFIG_IP_SET_BITMAP_IPMAC=m CONFIG_IP_SET_BITMAP_PORT=m CONFIG_IP_SET_HASH_IP=m CONFIG_IP_SET_HASH_IPMARK=m CONFIG_IP_SET_HASH_IPPORT=m CONFIG_IP_SET_HASH_IPPORTIP=m CONFIG_IP_SET_HASH_IPPORTNET=m CONFIG_IP_SET_HASH_MAC=m CONFIG_IP_SET_HASH_NETPORTNET=m CONFIG_IP_SET_HASH_NET=m CONFIG_IP_SET_HASH_NETNET=m CONFIG_IP_SET_HASH_NETPORT=m CONFIG_IP_SET_HASH_NETIFACE=m CONFIG_IP_SET_LIST_SET=m CONFIG_IP_VS=m CONFIG_IP_VS_IPV6=y CONFIG_IP_VS_DEBUG=y CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y CONFIG_IP_VS_PROTO_AH_ESP=y CONFIG_IP_VS_PROTO_ESP=y CONFIG_IP_VS_PROTO_AH=y CONFIG_IP_VS_PROTO_SCTP=y # # IPVS scheduler # CONFIG_IP_VS_RR=m CONFIG_IP_VS_WRR=m CONFIG_IP_VS_LC=m CONFIG_IP_VS_WLC=m CONFIG_IP_VS_FO=m CONFIG_IP_VS_OVF=m CONFIG_IP_VS_LBLC=m CONFIG_IP_VS_LBLCR=m CONFIG_IP_VS_DH=m CONFIG_IP_VS_SH=m CONFIG_IP_VS_SED=m CONFIG_IP_VS_NQ=m # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS application helper # CONFIG_IP_VS_FTP=m CONFIG_IP_VS_NFCT=y CONFIG_IP_VS_PE_SIP=m # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m CONFIG_NF_CONNTRACK_IPV4=m CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_NF_TABLES_IPV4=m CONFIG_NFT_CHAIN_ROUTE_IPV4=m CONFIG_NFT_REJECT_IPV4=m CONFIG_NFT_DUP_IPV4=m CONFIG_NF_TABLES_ARP=m CONFIG_NF_DUP_IPV4=m CONFIG_NF_LOG_ARP=m CONFIG_NF_LOG_IPV4=m CONFIG_NF_REJECT_IPV4=m CONFIG_NF_NAT_IPV4=m CONFIG_NFT_CHAIN_NAT_IPV4=m CONFIG_NF_NAT_MASQUERADE_IPV4=m CONFIG_NFT_MASQ_IPV4=m CONFIG_NFT_REDIR_IPV4=m CONFIG_NF_NAT_SNMP_BASIC=m CONFIG_NF_NAT_PROTO_GRE=m CONFIG_NF_NAT_PPTP=m CONFIG_NF_NAT_H323=m CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_MATCH_AH=m CONFIG_IP_NF_MATCH_ECN=m CONFIG_IP_NF_MATCH_RPFILTER=m CONFIG_IP_NF_MATCH_TTL=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m CONFIG_IP_NF_TARGET_SYNPROXY=m CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_NETMAP=m CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m CONFIG_IP_NF_TARGET_CLUSTERIP=m CONFIG_IP_NF_TARGET_ECN=m CONFIG_IP_NF_TARGET_TTL=m CONFIG_IP_NF_RAW=m CONFIG_IP_NF_ARPTABLES=m CONFIG_IP_NF_ARPFILTER=m CONFIG_IP_NF_ARP_MANGLE=m # # IPv6: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV6=m CONFIG_NF_CONNTRACK_IPV6=m CONFIG_NF_TABLES_IPV6=m CONFIG_NFT_CHAIN_ROUTE_IPV6=m CONFIG_NFT_REJECT_IPV6=m CONFIG_NFT_DUP_IPV6=m CONFIG_NF_DUP_IPV6=m CONFIG_NF_REJECT_IPV6=m CONFIG_NF_LOG_IPV6=m CONFIG_NF_NAT_IPV6=m CONFIG_NFT_CHAIN_NAT_IPV6=m CONFIG_NF_NAT_MASQUERADE_IPV6=m CONFIG_NFT_MASQ_IPV6=m CONFIG_NFT_REDIR_IPV6=m CONFIG_IP6_NF_IPTABLES=m CONFIG_IP6_NF_MATCH_AH=m CONFIG_IP6_NF_MATCH_EUI64=m CONFIG_IP6_NF_MATCH_FRAG=m CONFIG_IP6_NF_MATCH_OPTS=m CONFIG_IP6_NF_MATCH_HL=m CONFIG_IP6_NF_MATCH_IPV6HEADER=m CONFIG_IP6_NF_MATCH_MH=m CONFIG_IP6_NF_MATCH_RPFILTER=m CONFIG_IP6_NF_MATCH_RT=m CONFIG_IP6_NF_TARGET_HL=m CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m CONFIG_IP6_NF_TARGET_SYNPROXY=m CONFIG_IP6_NF_MANGLE=m CONFIG_IP6_NF_RAW=m CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m CONFIG_IP6_NF_TARGET_NPT=m # CONFIG_NF_TABLES_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set CONFIG_RDS=m CONFIG_RDS_TCP=m # CONFIG_RDS_DEBUG is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_L2TP=m CONFIG_L2TP_DEBUGFS=m CONFIG_L2TP_V3=y CONFIG_L2TP_IP=m CONFIG_L2TP_ETH=m CONFIG_STP=m CONFIG_GARP=m CONFIG_MRP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y CONFIG_HAVE_NET_DSA=y CONFIG_NET_DSA=m CONFIG_NET_DSA_HWMON=y CONFIG_VLAN_8021Q=m CONFIG_VLAN_8021Q_GVRP=y CONFIG_VLAN_8021Q_MVRP=y # CONFIG_DECNET is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set CONFIG_6LOWPAN=m CONFIG_6LOWPAN_NHC=m CONFIG_6LOWPAN_NHC_DEST=m CONFIG_6LOWPAN_NHC_FRAGMENT=m CONFIG_6LOWPAN_NHC_HOP=m CONFIG_6LOWPAN_NHC_IPV6=m CONFIG_6LOWPAN_NHC_MOBILITY=m CONFIG_6LOWPAN_NHC_ROUTING=m CONFIG_6LOWPAN_NHC_UDP=m CONFIG_IEEE802154=m CONFIG_IEEE802154_NL802154_EXPERIMENTAL=y CONFIG_IEEE802154_SOCKET=m CONFIG_IEEE802154_6LOWPAN=m CONFIG_MAC802154=m CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_CBQ=m CONFIG_NET_SCH_HTB=m CONFIG_NET_SCH_HFSC=m CONFIG_NET_SCH_PRIO=m CONFIG_NET_SCH_MULTIQ=m CONFIG_NET_SCH_RED=m CONFIG_NET_SCH_SFB=m CONFIG_NET_SCH_SFQ=m CONFIG_NET_SCH_TEQL=m CONFIG_NET_SCH_TBF=m CONFIG_NET_SCH_GRED=m CONFIG_NET_SCH_DSMARK=m CONFIG_NET_SCH_NETEM=m CONFIG_NET_SCH_DRR=m CONFIG_NET_SCH_MQPRIO=m CONFIG_NET_SCH_CHOKE=m CONFIG_NET_SCH_QFQ=m CONFIG_NET_SCH_CODEL=m CONFIG_NET_SCH_FQ_CODEL=m CONFIG_NET_SCH_FQ=m CONFIG_NET_SCH_HHF=m CONFIG_NET_SCH_PIE=m CONFIG_NET_SCH_INGRESS=m CONFIG_NET_SCH_PLUG=m # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=m CONFIG_NET_CLS_TCINDEX=m CONFIG_NET_CLS_ROUTE4=m CONFIG_NET_CLS_FW=m CONFIG_NET_CLS_U32=m CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=m CONFIG_NET_CLS_RSVP6=m CONFIG_NET_CLS_FLOW=m CONFIG_NET_CLS_CGROUP=m CONFIG_NET_CLS_BPF=m CONFIG_NET_CLS_FLOWER=m CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=m CONFIG_NET_EMATCH_NBYTE=m CONFIG_NET_EMATCH_U32=m CONFIG_NET_EMATCH_META=m CONFIG_NET_EMATCH_TEXT=m CONFIG_NET_EMATCH_IPSET=m CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=m CONFIG_NET_ACT_GACT=m CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=m CONFIG_NET_ACT_IPT=m CONFIG_NET_ACT_NAT=m CONFIG_NET_ACT_PEDIT=m CONFIG_NET_ACT_SIMP=m CONFIG_NET_ACT_SKBEDIT=m CONFIG_NET_ACT_CSUM=m CONFIG_NET_ACT_VLAN=m CONFIG_NET_ACT_BPF=m CONFIG_NET_ACT_CONNMARK=m CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set CONFIG_NETLINK_DIAG=y # CONFIG_MPLS is not set # CONFIG_HSR is not set CONFIG_NET_SWITCHDEV=y # CONFIG_NET_L3_MASTER_DEV is not set CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_XPS=y # CONFIG_CGROUP_NET_PRIO is not set CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_JIT is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set CONFIG_BT=y CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m # CONFIG_BT_RFCOMM_TTY is not set CONFIG_BT_BNEP=y CONFIG_BT_BNEP_MC_FILTER=y CONFIG_BT_BNEP_PROTO_FILTER=y CONFIG_BT_HIDP=m CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_6LOWPAN is not set # CONFIG_BT_SELFTEST is not set CONFIG_BT_DEBUGFS=y # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m # CONFIG_BT_RTKBTUSB is not set CONFIG_BT_HCIBTUSB=m CONFIG_BT_HCIBTUSB_BCM=y CONFIG_BT_HCIBTUSB_RTL=y # CONFIG_BT_HCIBTSDIO is not set CONFIG_BT_HCIUART=m CONFIG_BT_HCIUART_H4=y CONFIG_BT_HCIUART_BCSP=y CONFIG_BT_HCIUART_ATH3K=y CONFIG_BT_HCIUART_LL=y # CONFIG_BT_HCIUART_3WIRE is not set # CONFIG_BT_HCIUART_INTEL is not set # CONFIG_BT_HCIUART_BCM is not set # CONFIG_BT_HCIUART_QCA is not set # CONFIG_BT_HCIBCM203X is not set # CONFIG_BT_HCIBPA10X is not set CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIVHCI=m CONFIG_BT_MRVL=m CONFIG_BT_MRVL_SDIO=m # CONFIG_BT_ATH3K is not set # CONFIG_AF_RXRPC is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=y CONFIG_NL80211_TESTMODE=y # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_REG_DEBUG is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set # CONFIG_CFG80211_INTERNAL_REGDB is not set CONFIG_CFG80211_CRDA_SUPPORT=y CONFIG_CFG80211_WEXT=y # CONFIG_LIB80211 is not set CONFIG_MAC80211=y CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_MINSTREL_HT=y CONFIG_MAC80211_RC_MINSTREL_VHT=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 # CONFIG_WIMAX is not set CONFIG_RFKILL=y CONFIG_RFKILL_PM=y CONFIG_RFKILL_LEDS=y # CONFIG_RFKILL_INPUT is not set # CONFIG_RFKILL_REGULATOR is not set # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set CONFIG_LWTUNNEL=y CONFIG_DST_CACHE=y CONFIG_HAVE_BPF_JIT=y CONFIG_HAVE_EBPF_JIT=y # # Device Drivers # CONFIG_ARM_AMBA=y # CONFIG_TEGRA_AHB is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER=y CONFIG_UEVENT_HELPER_PATH="" CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set CONFIG_WANT_DEV_COREDUMP=y CONFIG_ALLOW_DEV_COREDUMP=y CONFIG_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set CONFIG_DEBUG_DEVRES=y # CONFIG_SYS_HYPERVISOR is not set # CONFIG_GENERIC_CPU_DEVICES is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_FENCE_TRACE is not set # # Bus devices # # CONFIG_ARM_CCI400_PMU is not set # CONFIG_ARM_CCI500_PMU is not set # CONFIG_ARM_CCN is not set # CONFIG_VEXPRESS_CONFIG is not set CONFIG_CONNECTOR=y CONFIG_PROC_EVENTS=y CONFIG_MTD=y # CONFIG_MTD_TESTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set # CONFIG_MTD_CMDLINE_PARTS is not set CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AR7_PARTS is not set # # User Modules And Translation Layers # # CONFIG_MTD_BLOCK is not set # CONFIG_MTD_BLOCK_RO is not set # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # CONFIG_RFD_FTL is not set # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set # CONFIG_MTD_OOPS is not set # CONFIG_MTD_SWAP is not set # CONFIG_MTD_PARTITIONED_MASTER is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_CFI_I4 is not set # CONFIG_MTD_CFI_I8 is not set # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_PLATRAM is not set # # Self-contained MTD device drivers # # CONFIG_MTD_DATAFLASH is not set CONFIG_MTD_M25P80=y # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLOCK2MTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOCG3 is not set # CONFIG_MTD_NAND_IDS is not set # CONFIG_MTD_NAND is not set # CONFIG_MTD_ONENAND is not set # # LPDDR & LPDDR2 PCM memory drivers # # CONFIG_MTD_LPDDR is not set CONFIG_MTD_SPI_NOR=y CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y # CONFIG_MTD_UBI is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_NET=y CONFIG_OF_MDIO=y CONFIG_OF_MTD=y CONFIG_OF_RESERVED_MEM=y # CONFIG_OF_OVERLAY is not set # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_ZRAM=y # CONFIG_ZRAM_WRITEBACK is not set # CONFIG_ZRAM_MEMORY_TRACKING is not set # CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=1 CONFIG_BLK_DEV_RAM_SIZE=4096 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set # # Misc devices # # CONFIG_ROCKCHIP_SCR is not set # CONFIG_SENSORS_LIS3LV02D is not set # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1780 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_TI_DAC7512 is not set # CONFIG_BMP085_I2C is not set # CONFIG_BMP085_SPI is not set # CONFIG_USB_SWITCH_FSA9480 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set # CONFIG_MEMORY_STATE_TIME is not set # CONFIG_USB_CAM_GPIO is not set # CONFIG_GPIO_DET is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # # Altera FPGA firmware download module # # CONFIG_ALTERA_STAPL is not set # # Intel MIC Bus Driver # # # SCIF Bus Driver # # # Intel MIC Host Driver # # # Intel MIC Card Driver # # # SCIF Driver # # # Intel MIC Coprocessor State Management (COSM) Drivers # # CONFIG_ECHO is not set # CONFIG_CXL_BASE is not set # CONFIG_CXL_KERNEL_API is not set # CONFIG_CXL_EEH is not set # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_NETLINK is not set # CONFIG_SCSI_MQ_DEFAULT is not set CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set # CONFIG_CHR_DEV_OSST is not set CONFIG_BLK_DEV_SR=y # CONFIG_BLK_DEV_SR_VENDOR is not set # CONFIG_CHR_DEV_SG is not set # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set CONFIG_SCSI_SCAN_ASYNC=y # # SCSI Transports # CONFIG_SCSI_SPI_ATTRS=y # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set # CONFIG_SCSI_DH is not set # CONFIG_SCSI_OSD_INITIATOR is not set CONFIG_HAVE_PATA_PLATFORM=y # CONFIG_ATA is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set # CONFIG_BLK_DEV_DM is not set # CONFIG_TARGET_CORE is not set CONFIG_NETDEVICES=y CONFIG_MII=m CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set # CONFIG_EQUALIZER is not set # CONFIG_IFB is not set # CONFIG_NET_TEAM is not set # CONFIG_MACVLAN is not set # CONFIG_IPVLAN is not set # CONFIG_VXLAN is not set # CONFIG_GENEVE is not set CONFIG_NETCONSOLE=m # CONFIG_NETCONSOLE_DYNAMIC is not set CONFIG_NETPOLL=y CONFIG_NET_POLL_CONTROLLER=y CONFIG_TUN=m CONFIG_TUN_VNET_CROSS_LE=y CONFIG_VETH=m CONFIG_NLMON=m # # CAIF transport drivers # # # Distributed Switch Architecture drivers # # CONFIG_NET_DSA_MV88E6XXX is not set # CONFIG_NET_DSA_MV88E6060 is not set # CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set # CONFIG_NET_DSA_MV88E6131 is not set # CONFIG_NET_DSA_MV88E6123_61_65 is not set # CONFIG_NET_DSA_MV88E6171 is not set # CONFIG_NET_DSA_MV88E6352 is not set # CONFIG_NET_DSA_BCM_SF2 is not set # CONFIG_ETHERNET is not set CONFIG_PHYLIB=y # # MII PHY device drivers # # CONFIG_AQUANTIA_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_AMD_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_QSEMI_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_TERANETICS_PHY is not set CONFIG_ROCKCHIP_PHY=y # CONFIG_SMSC_PHY is not set # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_REALTEK_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_STE10XP is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MICREL_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set CONFIG_MICROCHIP_PHY=m # CONFIG_FIXED_PHY is not set # CONFIG_MDIO_BITBANG is not set # CONFIG_MDIO_OCTEON is not set # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MICREL_KS8995MA is not set CONFIG_PPP=m CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m CONFIG_PPP_FILTER=y CONFIG_PPP_MPPE=m CONFIG_PPP_MULTILINK=y CONFIG_PPPOE=m CONFIG_PPTP=m CONFIG_PPPOL2TP=m CONFIG_PPPOLAC=m CONFIG_PPPOPNS=m CONFIG_PPP_ASYNC=m CONFIG_PPP_SYNC_TTY=m # CONFIG_SLIP is not set CONFIG_SLHC=m CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set CONFIG_USB_RTL8150=m CONFIG_USB_RTL8152=m # CONFIG_USB_LAN78XX is not set CONFIG_USB_USBNET=m CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m # CONFIG_USB_NET_CDC_EEM is not set CONFIG_USB_NET_CDC_NCM=m # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set CONFIG_USB_NET_CDC_MBIM=m # CONFIG_USB_NET_DM9601 is not set # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=m # CONFIG_USB_NET_GL620A is not set # CONFIG_USB_NET_NET1080 is not set # CONFIG_USB_NET_PLUSB is not set # CONFIG_USB_NET_MCS7830 is not set CONFIG_USB_NET_RNDIS_HOST=m # CONFIG_USB_NET_CDC_SUBSET is not set # CONFIG_USB_NET_ZAURUS is not set # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set # CONFIG_USB_HSO is not set # CONFIG_USB_NET_INT51X1 is not set # CONFIG_USB_IPHETH is not set # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set CONFIG_WLAN=y # CONFIG_LIBERTAS_THINFIRM is not set # CONFIG_AT76C50X_USB is not set # CONFIG_USB_ZD1201 is not set # CONFIG_USB_NET_RNDIS_WLAN is not set CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y # CONFIG_MAC80211_HWSIM is not set # CONFIG_VIRT_WIFI is not set # CONFIG_ATH_CARDS is not set # CONFIG_B43 is not set # CONFIG_B43LEGACY is not set # CONFIG_BRCMSMAC is not set # CONFIG_BRCMFMAC is not set # CONFIG_HOSTAP is not set # CONFIG_LIBERTAS is not set # CONFIG_P54_COMMON is not set CONFIG_RT2X00=m CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y # CONFIG_RT2800USB_UNKNOWN is not set CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WL_MEDIATEK=y CONFIG_MT7601U=m CONFIG_MT76_CORE=m CONFIG_MT76_LEDS=y CONFIG_MT76_USB=m CONFIG_MT76x02_LIB=m CONFIG_MT76x02_USB=m CONFIG_MT76x0_COMMON=m CONFIG_MT76x0U=m CONFIG_MT76x2_COMMON=m CONFIG_MT76x2U=m CONFIG_WLAN_VENDOR_MEDIATEK=y # CONFIG_RTL_CARDS is not set CONFIG_RTL8192CU=m # CONFIG_RTL8XXXU is not set # CONFIG_WL_ROCKCHIP is not set CONFIG_RTL8723BU=m # CONFIG_WL_TI is not set # CONFIG_ZD1211RW is not set # CONFIG_MWIFIEX is not set # CONFIG_CW1200 is not set # CONFIG_RSI_91X is not set CONFIG_RTL8812AU=m CONFIG_RTL8822BU=m CONFIG_RTL8821CU=m CONFIG_ESP8089=m CONFIG_ESP8089_DEBUG_FS=y # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set CONFIG_IEEE802154_DRIVERS=m # CONFIG_IEEE802154_FAKELB is not set # CONFIG_IEEE802154_AT86RF230 is not set # CONFIG_IEEE802154_MRF24J40 is not set # CONFIG_IEEE802154_CC2520 is not set # CONFIG_IEEE802154_ATUSB is not set # CONFIG_ISDN is not set # CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y CONFIG_INPUT_POLLDEV=y # CONFIG_INPUT_SPARSEKMAP is not set CONFIG_INPUT_MATRIXKMAP=y # # Userland interfaces # # CONFIG_INPUT_MOUSEDEV is not set CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set CONFIG_INPUT_KEYRESET=y CONFIG_INPUT_KEYCOMBO=y # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADC is not set # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=m # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=m # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_OMAP4 is not set CONFIG_KEYBOARD_ROCKCHIP=y CONFIG_KEYBOARD_XTKBD=m # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set CONFIG_INPUT_MOUSE=y # CONFIG_MOUSE_PS2 is not set # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set # CONFIG_MOUSE_CYAPA is not set # CONFIG_MOUSE_ELAN_I2C is not set # CONFIG_MOUSE_VSXXXAA is not set # CONFIG_MOUSE_GPIO is not set # CONFIG_MOUSE_SYNAPTICS_I2C is not set # CONFIG_MOUSE_SYNAPTICS_USB is not set CONFIG_INPUT_JOYSTICK=y CONFIG_JOYSTICK_ANALOG=m CONFIG_JOYSTICK_A3D=m CONFIG_JOYSTICK_ADI=m CONFIG_JOYSTICK_COBRA=m CONFIG_JOYSTICK_GF2K=m CONFIG_JOYSTICK_GRIP=m CONFIG_JOYSTICK_GRIP_MP=m CONFIG_JOYSTICK_GUILLEMOT=m CONFIG_JOYSTICK_INTERACT=m CONFIG_JOYSTICK_SIDEWINDER=m CONFIG_JOYSTICK_TMDC=m CONFIG_JOYSTICK_IFORCE=m CONFIG_JOYSTICK_IFORCE_USB=y # CONFIG_JOYSTICK_IFORCE_232 is not set CONFIG_JOYSTICK_WARRIOR=m CONFIG_JOYSTICK_MAGELLAN=m CONFIG_JOYSTICK_SPACEORB=m CONFIG_JOYSTICK_SPACEBALL=m CONFIG_JOYSTICK_STINGER=m CONFIG_JOYSTICK_TWIDJOY=m CONFIG_JOYSTICK_ZHENHUA=m CONFIG_JOYSTICK_AS5011=m CONFIG_JOYSTICK_JOYDUMP=m CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y # CONFIG_JOYSTICK_ADC is not set CONFIG_JOYSTICK_ODROIDGO2=y CONFIG_JOYSTICK_ODROIDGO3=y CONFIG_DRM_PANEL_ODROID_ST7701S=y # CONFIG_QCA_CLD_WLAN is not set # CONFIG_INPUT_TABLET is not set # CONFIG_INPUT_TOUCHSCREEN is not set # CONFIG_ROCKCHIP_REMOTECTL is not set # # handle all sensors # # CONFIG_SENSOR_DEVICE is not set 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_MMA8450 is not set # CONFIG_INPUT_MPU3050 is not set # CONFIG_INPUT_GP2A is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_TILT_POLLED is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYCHORD is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_RK8XX_PWRKEY=y CONFIG_INPUT_UINPUT=y CONFIG_INPUT_GPIO=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_SOC_BUTTON_ARRAY is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # # Hardware I/O ports # CONFIG_SERIO=m CONFIG_SERIO_SERPORT=m # CONFIG_SERIO_AMBAKMI is not set CONFIG_SERIO_LIBPS2=m # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_USERIO is not set CONFIG_GAMEPORT=m # CONFIG_GAMEPORT_NS558 is not set # CONFIG_GAMEPORT_L4 is not set # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y CONFIG_DEVPTS_MULTIPLE_INSTANCES=y # CONFIG_LEGACY_PTYS is not set # 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 is not set # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_DMA=y CONFIG_SERIAL_8250_NR_UARTS=5 CONFIG_SERIAL_8250_RUNTIME_UARTS=5 # CONFIG_SERIAL_8250_EXTENDED is not set CONFIG_SERIAL_8250_FSL=y CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_INGENIC is not set # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set # CONFIG_SERIAL_AMBA_PL011 is not set # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_SERIAL_OF_PLATFORM=y # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_IFX6X60 is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_TTY_PRINTK is not set # CONFIG_HVC_DCC is not set # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set CONFIG_HW_RANDOM_TPM=y # CONFIG_HW_RANDOM_ROCKCHIP is not set # # PCMCIA character devices # # CONFIG_RAW_DRIVER is not set CONFIG_TCG_TPM=y # CONFIG_TCG_TIS_I2C_ATMEL is not set CONFIG_TCG_TIS_I2C_INFINEON=y # CONFIG_TCG_TIS_I2C_NUVOTON is not set # CONFIG_TCG_TIS_ST33ZP24 is not set # CONFIG_XILLYBUS is not set # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # CONFIG_I2C_ARB_GPIO_CHALLENGE=m CONFIG_I2C_MUX_GPIO=m # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set # CONFIG_I2C_MUX_PINCTRL is not set # CONFIG_I2C_MUX_REG is not set CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CADENCE is not set # CONFIG_I2C_CBUS_GPIO is not set # CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_EMEV2 is not set # CONFIG_I2C_GPIO is not set # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_PXA_PCI is not set CONFIG_I2C_RK3X=y # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set CONFIG_SPI_BITBANG=m # CONFIG_SPI_CADENCE is not set CONFIG_SPI_GPIO=m # CONFIG_SPI_FSL_SPI is not set # CONFIG_SPI_OC_TINY is not set # CONFIG_SPI_PL022 is not set # CONFIG_SPI_PXA2XX_PCI is not set CONFIG_SPI_ROCKCHIP=m # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_DESIGNWARE is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=m # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPMI is not set # CONFIG_HSI is not set # # PPS support # CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # CONFIG_PINCTRL=y # # Pin controllers # CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_AMD is not set CONFIG_PINCTRL_ROCKCHIP=y # CONFIG_PINCTRL_SINGLE is not set CONFIG_PINCTRL_RK805=y CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y CONFIG_ARCH_REQUIRE_GPIOLIB=y CONFIG_GPIOLIB=y CONFIG_GPIO_DEVRES=y CONFIG_OF_GPIO=y CONFIG_DEBUG_GPIO=y CONFIG_GPIO_SYSFS=y CONFIG_GPIO_GENERIC=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_DWAPB is not set CONFIG_GPIO_GENERIC_PLATFORM=y # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_PL061 is not set # CONFIG_GPIO_SYSCON is not set # CONFIG_GPIO_XGENE is not set # CONFIG_GPIO_XILINX is not set # CONFIG_GPIO_ZX is not set # # I2C GPIO expanders # # CONFIG_GPIO_ADP5588 is not set # CONFIG_GPIO_ADNP is not set # CONFIG_GPIO_MAX7300 is not set # CONFIG_GPIO_MAX732X is not set # CONFIG_GPIO_PCA953X is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_SX150X is not set # # MFD GPIO expanders # CONFIG_GPIO_RK8XX=y # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # # SPI or I2C GPIO expanders # # CONFIG_GPIO_MCP23S08 is not set # # USB GPIO expanders # # CONFIG_W1 is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_TEST_POWER is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set CONFIG_CHARGER_GPIO=y # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ25700 is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_CHARGER_SY6982C is not set # CONFIG_CHARGER_UNIVERSAL is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_EC is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_RK816 is not set CONFIG_BATTERY_RK817=y CONFIG_CHARGER_RK817=y # CONFIG_BATTERY_RK818 is not set # CONFIG_CHARGER_RK818 is not set # CONFIG_CHARGER_RT9455 is not set CONFIG_POWER_RESET=y CONFIG_POWER_RESET_GPIO=y CONFIG_POWER_RESET_GPIO_RESTART=y # CONFIG_POWER_RESET_LTC2952 is not set # CONFIG_POWER_RESET_RESTART is not set # CONFIG_POWER_RESET_XGENE is not set # CONFIG_POWER_RESET_SYSCON is not set # CONFIG_POWER_RESET_SYSCON_POWEROFF is not set CONFIG_REBOOT_MODE=y CONFIG_SYSCON_REBOOT_MODE=y CONFIG_POWER_AVS=y CONFIG_ROCKCHIP_IODOMAIN=y CONFIG_HWMON=y # CONFIG_HWMON_VID is not set # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_GPIO_FAN is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IIO_HWMON is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_HTU21 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set # CONFIG_SENSORS_PWM_FAN is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH56XX_COMMON is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS1015 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y CONFIG_THERMAL_WRITABLE_TRIPS=y # CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE is not set # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR=y CONFIG_THERMAL_GOV_FAIR_SHARE=y CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y CONFIG_CPU_THERMAL=y # CONFIG_CLOCK_THERMAL is not set CONFIG_DEVFREQ_THERMAL=y # CONFIG_THERMAL_EMULATION is not set # CONFIG_IMX_THERMAL is not set CONFIG_ROCKCHIP_THERMAL=y # CONFIG_RK_VIRTUAL_THERMAL is not set # CONFIG_RK3368_THERMAL is not set # CONFIG_WATCHDOG is not set CONFIG_SSB_POSSIBLE=y # # Sonics Silicon Backplane # # CONFIG_SSB is not set CONFIG_BCMA_POSSIBLE=y # # Broadcom specific AMBA # # CONFIG_BCMA is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_AXP20X is not set # CONFIG_MFD_CROS_EC is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_INTEL_SOC_PMIC is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RTSX_USB is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_RK618 is not set CONFIG_MFD_RK808=y # CONFIG_MFD_RN5T618 is not set # CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_SMSC is not set # CONFIG_ABX500_CORE is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_MFD_TPS80031 is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TC3589X is not set # CONFIG_MFD_TMIO is not set # CONFIG_MFD_ARIZONA_I2C is not set # CONFIG_MFD_ARIZONA_SPI is not set # CONFIG_MFD_WM8400 is not set # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_RK1000 is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_FUSB_30X is not set CONFIG_REGULATOR=y CONFIG_REGULATOR_DEBUG=y CONFIG_REGULATOR_FIXED_VOLTAGE=y CONFIG_REGULATOR_VIRTUAL_CONSUMER=y CONFIG_REGULATOR_USERSPACE_CONSUMER=y # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_ANATOP is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8752 is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MP8865 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PFUZE100 is not set CONFIG_REGULATOR_PWM=y CONFIG_REGULATOR_RK808=y CONFIG_REGULATOR_RK818=y # CONFIG_REGULATOR_SYR82X is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS549B22 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_XZ3216 is not set CONFIG_MEDIA_SUPPORT=y # # Multimedia core support # CONFIG_MEDIA_CAMERA_SUPPORT=y # CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set # CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set # CONFIG_MEDIA_RADIO_SUPPORT is not set # CONFIG_MEDIA_SDR_SUPPORT is not set CONFIG_MEDIA_RC_SUPPORT=y # CONFIG_MEDIA_CEC_SUPPORT is not set CONFIG_MEDIA_CONTROLLER=y CONFIG_VIDEO_DEV=y CONFIG_VIDEO_V4L2_SUBDEV_API=y CONFIG_VIDEO_V4L2=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_V4L2_MEM2MEM_DEV=y CONFIG_V4L2_FWNODE=y CONFIG_VIDEOBUF_GEN=y CONFIG_VIDEOBUF2_CORE=y CONFIG_VIDEOBUF2_MEMOPS=y CONFIG_VIDEOBUF2_DMA_CONTIG=y CONFIG_VIDEOBUF2_VMALLOC=y CONFIG_VIDEOBUF2_DMA_SG=y # CONFIG_TTPCI_EEPROM is not set # # Media drivers # CONFIG_RC_CORE=y CONFIG_RC_MAP=y # CONFIG_LIRC is not set CONFIG_RC_DECODERS=y CONFIG_IR_NEC_DECODER=y # CONFIG_IR_RC5_DECODER is not set # CONFIG_IR_RC6_DECODER is not set # CONFIG_IR_JVC_DECODER is not set # CONFIG_IR_SONY_DECODER is not set # CONFIG_IR_SANYO_DECODER is not set # CONFIG_IR_SHARP_DECODER is not set # CONFIG_IR_MCE_KBD_DECODER is not set # CONFIG_IR_XMP_DECODER is not set # CONFIG_IR_IMON_DECODER is not set # CONFIG_RC_DEVICES is not set CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # CONFIG_USB_VIDEO_CLASS=y # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_VIDEO_CPIA2 is not set # CONFIG_USB_ZR364XX is not set # CONFIG_USB_STKWEBCAM is not set # CONFIG_USB_S2255 is not set # CONFIG_VIDEO_USBTV is not set # CONFIG_NPU_USB_ACM is not set # # Webcam, TV (analog/digital) USB devices # # CONFIG_VIDEO_EM28XX is not set CONFIG_V4L_PLATFORM_DRIVERS=y CONFIG_SOC_CAMERA=y # CONFIG_SOC_CAMERA_PLATFORM is not set # CONFIG_VIDEO_XILINX is not set # CONFIG_VIDEO_RK_CIF_ISP10 is not set CONFIG_VIDEO_ROCKCHIP_CIF=y CONFIG_ROCKCHIP_CIF_WORKMODE_PINGPONG=y # CONFIG_ROCKCHIP_CIF_WORKMODE_ONEFRAME is not set CONFIG_VIDEO_ROCKCHIP_ISP1=y CONFIG_V4L_MEM2MEM_DRIVERS=y # CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set # CONFIG_VIDEO_SH_VEU is not set CONFIG_VIDEO_ROCKCHIP_RGA=y # CONFIG_VIDEO_ROCKCHIP_VPU is not set # CONFIG_V4L_TEST_DRIVERS is not set # CONFIG_ROCKCHIP_TSP is not set # # Supported MMC/SDIO adapters # # CONFIG_CYPRESS_FIRMWARE is not set # # Media ancillary drivers (tuners, sensors, i2c, spi, frontends) # # CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set # CONFIG_VIDEO_IR_I2C is not set # # I2C Encoders, decoders, sensors and other helper chips # # # Audio decoders, processors and mixers # # CONFIG_VIDEO_TVAUDIO is not set # CONFIG_VIDEO_TDA7432 is not set # CONFIG_VIDEO_TDA9840 is not set # CONFIG_VIDEO_TEA6415C is not set # CONFIG_VIDEO_TEA6420 is not set # CONFIG_VIDEO_MSP3400 is not set # CONFIG_VIDEO_CS5345 is not set # CONFIG_VIDEO_CS53L32A is not set # CONFIG_VIDEO_TLV320AIC23B is not set # CONFIG_VIDEO_UDA1342 is not set # CONFIG_VIDEO_WM8775 is not set # CONFIG_VIDEO_WM8739 is not set # CONFIG_VIDEO_VP27SMPX is not set # CONFIG_VIDEO_SONY_BTF_MPX is not set # # RDS decoders # # CONFIG_VIDEO_SAA6588 is not set # # Video decoders # # CONFIG_VIDEO_ADV7180 is not set # CONFIG_VIDEO_ADV7181D is not set # CONFIG_VIDEO_ADV7183 is not set # CONFIG_VIDEO_ADV7604 is not set # CONFIG_VIDEO_ADV7842 is not set # CONFIG_VIDEO_BT819 is not set # CONFIG_VIDEO_BT856 is not set # CONFIG_VIDEO_BT866 is not set # CONFIG_VIDEO_KS0127 is not set # CONFIG_VIDEO_ML86V7667 is not set # CONFIG_VIDEO_SAA7110 is not set # CONFIG_VIDEO_SAA711X is not set # CONFIG_VIDEO_TC35874X is not set # CONFIG_VIDEO_TVP514X is not set # CONFIG_VIDEO_TVP5150 is not set # CONFIG_VIDEO_TVP7002 is not set # CONFIG_VIDEO_TW2804 is not set # CONFIG_VIDEO_TW9903 is not set # CONFIG_VIDEO_TW9906 is not set # CONFIG_VIDEO_VPX3220 is not set # # Video and audio decoders # # CONFIG_VIDEO_SAA717X is not set # CONFIG_VIDEO_CX25840 is not set # # Video encoders # # CONFIG_VIDEO_SAA7127 is not set # CONFIG_VIDEO_SAA7185 is not set # CONFIG_VIDEO_ADV7170 is not set # CONFIG_VIDEO_ADV7175 is not set # CONFIG_VIDEO_ADV7343 is not set # CONFIG_VIDEO_ADV7393 is not set # CONFIG_VIDEO_ADV7511 is not set # CONFIG_VIDEO_AD9389B is not set # CONFIG_VIDEO_AK881X is not set # CONFIG_VIDEO_THS8200 is not set # # Camera sensor devices # # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX317 is not set # CONFIG_VIDEO_IMX323 is not set # CONFIG_VIDEO_IMX327 is not set # CONFIG_VIDEO_VIRT_CAMERA is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV2718 is not set # CONFIG_VIDEO_OV2735 is not set # CONFIG_VIDEO_OV4689 is not set CONFIG_VIDEO_OV5647=y # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV7251 is not set # CONFIG_VIDEO_OV7640 is not set # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV7725 is not set # CONFIG_VIDEO_OV7750 is not set # CONFIG_VIDEO_OV8858 is not set # CONFIG_VIDEO_OV9281 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_OV9750 is not set # CONFIG_VIDEO_OV13850 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9V011 is not set # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_AR0230 is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_M5MOLS is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_SMIAPP is not set # CONFIG_VIDEO_S5C73M3 is not set CONFIG_VIDEO_GC2155=y # CONFIG_VIDEO_GC0312 is not set # CONFIG_VIDEO_GC2145 is not set CONFIG_VIDEO_GC2355=y # CONFIG_VIDEO_GC2385 is not set # CONFIG_VIDEO_GC5025 is not set # CONFIG_VIDEO_GC5035 is not set # CONFIG_VIDEO_GC8034 is not set CONFIG_VIDEO_SC031GS=y # CONFIG_VIDEO_SC132GS is not set # CONFIG_VIDEO_GC0329 is not set # CONFIG_VIDEO_GC2035 is not set # CONFIG_VIDEO_BF3925 is not set # CONFIG_VIDEO_JX_H65 is not set CONFIG_VIDEO_PREISP_DUMMY_SENSOR=y # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_AS3645A is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # CONFIG_VIDEO_SGM3784 is not set # # Video improvement chips # # CONFIG_VIDEO_UPD64031A is not set # CONFIG_VIDEO_UPD64083 is not set # # Camera lens devices # # CONFIG_VIDEO_VM149C is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_FP5510 is not set # # Audio/Video compression chips # # CONFIG_VIDEO_SAA6752HS is not set # # Miscellaneous helper chips # # CONFIG_VIDEO_THS7303 is not set # CONFIG_VIDEO_M52790 is not set # CONFIG_VIDEO_NVP6324 is not set # # Sensors used on soc_camera driver # # # soc_camera sensor drivers # # CONFIG_SOC_CAMERA_IMX074 is not set # CONFIG_SOC_CAMERA_MT9M001 is not set # CONFIG_SOC_CAMERA_MT9M111 is not set # CONFIG_SOC_CAMERA_MT9T031 is not set # CONFIG_SOC_CAMERA_MT9T112 is not set # CONFIG_SOC_CAMERA_MT9V022 is not set # CONFIG_SOC_CAMERA_OV2640 is not set # CONFIG_SOC_CAMERA_OV5642 is not set # CONFIG_SOC_CAMERA_OV6650 is not set # CONFIG_SOC_CAMERA_OV772X is not set # CONFIG_SOC_CAMERA_OV9640 is not set # CONFIG_SOC_CAMERA_OV9740 is not set # CONFIG_SOC_CAMERA_RJ54N1 is not set # CONFIG_SOC_CAMERA_TW9910 is not set # # SPI helper chips # # CONFIG_VIDEO_GS1662 is not set # CONFIG_VIDEO_IMX327_SPI is not set CONFIG_VIDEO_ROCKCHIP_PREISP=y # # Customise DVB Frontends # # CONFIG_DVB_AU8522_V4L is not set # CONFIG_DVB_TUNER_DIB0070 is not set # CONFIG_DVB_TUNER_DIB0090 is not set # # Tools to develop new frontends # # CONFIG_DVB_DUMMY_FE is not set # CONFIG_CAMSYS_DRV is not set # CONFIG_ROCK_CHIP_SOC_CAMERA is not set # # Graphics support # CONFIG_DRM=y CONFIG_DRM_IGNORE_IOTCL_PERMIT=y CONFIG_DRM_MIPI_DSI=y CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_KMS_FB_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_LOAD_EDID_FIRMWARE=y # CONFIG_DRM_DP_CEC is not set # CONFIG_DRM_SCDC_HELPER is not set CONFIG_DRM_DMA_SYNC=y # # I2C encoder or helper chips # # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_VGEM is not set CONFIG_DRM_ROCKCHIP=y # CONFIG_ROCKCHIP_DRM_DEBUG is not set # CONFIG_ROCKCHIP_DW_HDMI is not set CONFIG_ROCKCHIP_DW_MIPI_DSI=y # CONFIG_ROCKCHIP_MIPI_CSI_TX is not set # CONFIG_ROCKCHIP_ANALOGIX_DP is not set # CONFIG_ROCKCHIP_INNO_HDMI is not set # CONFIG_ROCKCHIP_LVDS is not set # CONFIG_ROCKCHIP_DRM_TVE is not set # CONFIG_ROCKCHIP_RGB is not set # CONFIG_ROCKCHIP_DRM_BACKLIGHT is not set # CONFIG_ROCKCHIP_RK3066_HDMI is not set # CONFIG_DRM_UDL is not set CONFIG_DRM_PANEL=y # # Display Panels # CONFIG_DRM_PANEL_SIMPLE=y # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set CONFIG_DRM_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_RK1000 is not set # CONFIG_DRM_DUMB_VGA_DAC is not set # CONFIG_DRM_LONTIUM_LT8912 is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set # CONFIG_POWERVR_ROGUE_M is not set # CONFIG_MALI400 is not set CONFIG_MALI_MIDGARD_FOR_ANDROID=y # CONFIG_MALI_MIDGARD_FOR_LINUX is not set # CONFIG_MALI_MIDGARD is not set # CONFIG_MALI_CORESTACK is not set CONFIG_MALI_PWRSOFT_765=y # CONFIG_MALI_KUTF is not set # CONFIG_MALI_BIFROST_FOR_ANDROID is not set CONFIG_MALI_BIFROST_FOR_LINUX=y CONFIG_MALI_BIFROST=y CONFIG_MALI_BIFROST_GATOR_SUPPORT=y # CONFIG_MALI_BIFROST_ENABLE_TRACE is not set CONFIG_MALI_BIFROST_DEVFREQ=y # CONFIG_MALI_BIFROST_DMA_FENCE is not set CONFIG_MALI_PLATFORM_NAME="rk" CONFIG_MALI_BIFROST_EXPERT=y # CONFIG_MALI_BIFROST_PRFCNT_SET_SECONDARY is not set # CONFIG_MALI_BIFROST_DEBUG is not set # CONFIG_MALI_BIFROST_NO_MALI is not set # CONFIG_MALI_BIFROST_TRACE_TIMELINE is not set # CONFIG_MALI_BIFROST_SYSTEM_TRACE is not set # CONFIG_MALI_JOB_DUMP is not set # CONFIG_MALI_2MB_ALLOC is not set # # Frame buffer Devices # CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CMDLINE=y # CONFIG_FB_DDC is not set # CONFIG_FB_BOOT_VESA_SUPPORT is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y # CONFIG_FB_SVGALIB is not set # CONFIG_FB_MACMODES is not set # CONFIG_FB_BACKLIGHT is not set # CONFIG_FB_MODE_HELPERS is not set # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_UVESA is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_BROADSHEET is not set # CONFIG_FB_AUO_K190X is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set CONFIG_BACKLIGHT_LCD_SUPPORT=y # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y CONFIG_BACKLIGHT_GENERIC=y CONFIG_BACKLIGHT_PWM=y # CONFIG_BACKLIGHT_PM8941_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # # Rockchip Misc Video driver # # CONFIG_FB_ROCKCHIP is not set # CONFIG_LCDC_RK3368 is not set CONFIG_LCD_GENERAL=y # CONFIG_LCD_MIPI is not set # CONFIG_RK_TRSM is not set # CONFIG_RK_HDMI is not set # # RGA # # CONFIG_ROCKCHIP_RGA is not set # # RGA2 # CONFIG_ROCKCHIP_RGA2=y # # VCODEC # CONFIG_RK_VCODEC=y # # IEP # # CONFIG_IEP is not set # CONFIG_IEP_MMU is not set # # DP # # # ROCKCHIP_MPP # CONFIG_ROCKCHIP_MPP_SERVICE=y CONFIG_ROCKCHIP_MPP_DEVICE=y # CONFIG_VGASTATE is not set CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y # CONFIG_LOGO is not set CONFIG_SOUND=y # CONFIG_SOUND_OSS_CORE is not set CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_HWDEP=y CONFIG_SND_RAWMIDI=y CONFIG_SND_JACK=y CONFIG_SND_SEQUENCER=y CONFIG_SND_SEQ_DUMMY=y # CONFIG_SND_MIXER_OSS is not set # CONFIG_SND_PCM_OSS is not set CONFIG_SND_PCM_TIMER=y # CONFIG_SND_SEQUENCER_OSS is not set CONFIG_SND_HRTIMER=y CONFIG_SND_SEQ_HRTIMER_DEFAULT=y CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 # CONFIG_SND_SUPPORT_OLD_API is not set CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set # CONFIG_SND_DEBUG is not set CONFIG_SND_RAWMIDI_SEQ=y # CONFIG_SND_OPL3_LIB_SEQ is not set # CONFIG_SND_OPL4_LIB_SEQ is not set # CONFIG_SND_SBAWE_SEQ is not set # CONFIG_SND_EMU10K1_SEQ is not set CONFIG_SND_DRIVERS=y # CONFIG_SND_DUMMY is not set # CONFIG_SND_ALOOP is not set # CONFIG_SND_VIRMIDI is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_MPU401 is not set # # HD-Audio # CONFIG_SND_HDA_PREALLOC_SIZE=128 # CONFIG_SND_SPI is not set CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y # CONFIG_SND_USB_UA101 is not set # CONFIG_SND_USB_CAIAQ is not set # CONFIG_SND_USB_6FIRE is not set # CONFIG_SND_USB_HIFACE is not set # CONFIG_SND_BCD2000 is not set # CONFIG_SND_USB_POD is not set # CONFIG_SND_USB_PODHD is not set # CONFIG_SND_USB_TONEPORT is not set # CONFIG_SND_USB_VARIAX is not set CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # 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_IMX_AUDMUX is not set CONFIG_SND_SOC_ROCKCHIP=y # CONFIG_SND_SOC_ROCKCHIP_FORCE_SRAM is not set CONFIG_SND_SOC_ROCKCHIP_I2S=y # CONFIG_SND_SOC_ROCKCHIP_I2S_TDM is not set CONFIG_SND_SOC_ROCKCHIP_MULTI_DAIS=y CONFIG_SND_SOC_ROCKCHIP_PDM=y # CONFIG_SND_SOC_ROCKCHIP_SPDIF is not set # CONFIG_SND_SOC_ROCKCHIP_SPDIFRX is not set # CONFIG_SND_SOC_ROCKCHIP_VAD is not set # CONFIG_SND_SOC_ROCKCHIP_DA7219 is not set # CONFIG_SND_SOC_ROCKCHIP_HDMI_ANALOG is not set # CONFIG_SND_SOC_ROCKCHIP_MAX98090 is not set CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y # CONFIG_SND_SOC_ROCKCHIP_RT5645 is not set # CONFIG_SND_SOC_ROCKCHIP_RT5651_TC358749 is not set # CONFIG_SND_SOC_ROCKCHIP_CDNDP is not set # # Allwinner SoC Audio support # # CONFIG_SND_SUN4I_CODEC is not set # CONFIG_SND_SOC_XTFPGA_I2S is not set CONFIG_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4554 is not set # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_CS35L32 is not set # CONFIG_SND_SOC_CS42L51_I2C is not set # CONFIG_SND_SOC_CS42L52 is not set # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # CONFIG_SND_SOC_CS4271_SPI is not set # CONFIG_SND_SOC_CS42XX8_I2C is not set # CONFIG_SND_SOC_CS4349 is not set # CONFIG_SND_SOC_CX2072X is not set # CONFIG_SND_SOC_CX20810 is not set # CONFIG_SND_SOC_DUMMY_CODEC is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_ES8316 is not set # CONFIG_SND_SOC_ES8323 is not set # CONFIG_SND_SOC_ES8328 is not set # CONFIG_SND_SOC_ES8328_I2C is not set # CONFIG_SND_SOC_ES8396 is not set # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_GVA_CODEC is not set # CONFIG_SND_SOC_FM1288 is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1792A is not set # CONFIG_SND_SOC_PCM512x_I2C is not set # CONFIG_SND_SOC_PCM512x_SPI is not set # CONFIG_SND_SOC_RK312X is not set # CONFIG_SND_SOC_RK3228 is not set # CONFIG_SND_SOC_RK3308 is not set # CONFIG_SND_SOC_RK3328 is not set CONFIG_SND_SOC_RK817=y # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set # CONFIG_SND_SOC_RT5640 is not set # CONFIG_SND_SOC_RT5651 is not set # CONFIG_SND_SOC_RT5677_SPI is not set # CONFIG_SND_SOC_SGTL5000 is not set # CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set # CONFIG_SND_SOC_SPDIF is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TC358749X is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC3X is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731 is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # 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_WM8962 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_TPA6130A2 is not set CONFIG_SND_SIMPLE_CARD=y # CONFIG_SOUND_PRIME is not set # # HID support # CONFIG_HID=y CONFIG_HID_BATTERY_STRENGTH=y CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACRUX is not set # CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set # CONFIG_HID_BETOP_FF is not set # CONFIG_HID_CHERRY is not set # CONFIG_HID_CHICONY is not set # CONFIG_HID_CORSAIR is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CYPRESS is not set # CONFIG_HID_DRAGONRISE is not set # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set # CONFIG_HID_EZKEY is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_HOLTEK 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_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_TWINHAN is not set # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO is not set # CONFIG_HID_LOGITECH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set # CONFIG_HID_MULTITOUCH is not set # CONFIG_HID_NTRIG is not set # CONFIG_HID_ORTEK is not set # CONFIG_HID_PANTHERLORD is not set # CONFIG_HID_PENMOUNT is not set # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set # CONFIG_HID_SONY is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEELSERIES is not set # CONFIG_HID_SUNPLUS is not set # CONFIG_HID_RMI is not set # CONFIG_HID_GREENASIA is not set # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_WACOM is not set # CONFIG_HID_WIIMOTE is not set # CONFIG_HID_XINMO is not set # CONFIG_HID_ZEROPLUS is not set # CONFIG_HID_ZYDACRON is not set # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_RKVR is not set # CONFIG_HID_ALPS is not set # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # # I2C HID support # CONFIG_I2C_HID=y CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_OTG=y # CONFIG_USB_OTG_WHITELIST is not set # CONFIG_USB_OTG_BLACKLIST_HUB is not set # CONFIG_USB_OTG_FSM is not set # CONFIG_USB_ULPI_BUS is not set CONFIG_USB_MON=m # CONFIG_USB_WUSB_CBAF is not set # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set # CONFIG_USB_XHCI_HCD is not set CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_ROOT_HUB_TT=y CONFIG_USB_EHCI_TT_NEWSCHED=y CONFIG_USB_EHCI_HCD_PLATFORM=y # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_ISP1362_HCD is not set # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD_PLATFORM=y # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=y # CONFIG_USB_PRINTER is not set CONFIG_USB_WDM=y # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=m # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set CONFIG_USB_UAS=m # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set CONFIG_USB_DWC2=m CONFIG_USB_DWC2_HOST=y # # Gadget/Dual-role mode requires USB Gadget support to be enabled # # CONFIG_USB_DWC2_DEBUG is not set # CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set # CONFIG_USB_CHIPIDEA is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # CONFIG_USB_SERIAL=y # CONFIG_USB_SERIAL_CONSOLE is not set CONFIG_USB_SERIAL_GENERIC=y # CONFIG_USB_SERIAL_SIMPLE is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set # CONFIG_USB_SERIAL_CH341 is not set # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set CONFIG_USB_SERIAL_CP210X=m # CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_EMPEG is not set CONFIG_USB_SERIAL_FTDI_SIO=m # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_F81232 is not set # CONFIG_USB_SERIAL_GARMIN is not set # CONFIG_USB_SERIAL_IPW is not set # CONFIG_USB_SERIAL_IUU is not set # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set CONFIG_USB_SERIAL_KEYSPAN=m # CONFIG_USB_SERIAL_KEYSPAN_MPR is not set # CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set # CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set # CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set # CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set # CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set # CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set # CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set # CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set # CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set # CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set # CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_METRO is not set # CONFIG_USB_SERIAL_MOS7720 is not set # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MXUPORT is not set # CONFIG_USB_SERIAL_NAVMAN is not set CONFIG_USB_SERIAL_PL2303=m CONFIG_USB_SERIAL_OTI6858=m # CONFIG_USB_SERIAL_QCAUX is not set CONFIG_USB_SERIAL_QUALCOMM=m # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SAFE is not set CONFIG_USB_SERIAL_SIERRAWIRELESS=m # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_XIRCOM is not set CONFIG_USB_SERIAL_WWAN=m CONFIG_USB_SERIAL_OPTION=m # CONFIG_USB_SERIAL_OMNINET is not set # CONFIG_USB_SERIAL_OPTICON is not set # CONFIG_USB_SERIAL_XSENS_MT is not set # CONFIG_USB_SERIAL_WISHBONE is not set # CONFIG_USB_SERIAL_SSU100 is not set # CONFIG_USB_SERIAL_QT2 is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_RIO500 is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_LED is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set CONFIG_USB_EZUSB_FX2=y # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # # USB Physical Layer drivers # # CONFIG_USB_PHY is not set # CONFIG_USB_OTG_WAKELOCK is not set # CONFIG_NOP_USB_XCEIV is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set # CONFIG_USB_ULPI is not set # CONFIG_USB_GADGET is not set # # ROCKCHIP USB Support # # CONFIG_USB20_HOST is not set # CONFIG_USB20_OTG is not set # CONFIG_USB_LED_TRIG is not set # CONFIG_UWB is not set CONFIG_MMC=y # CONFIG_MMC_DEBUG is not set # CONFIG_MMC_EMBEDDED_SDIO is not set # CONFIG_MMC_PARANOID_SD_INIT is not set # # MMC/SD/SDIO Card Drivers # CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 CONFIG_MMC_BLOCK_BOUNCE=y # CONFIG_SDIO_UART is not set CONFIG_MMC_TEST=y # CONFIG_MMC_SIMULATE_MAX_SPEED is not set # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_ARMMMCI is not set # CONFIG_MMC_SDHCI is not set # CONFIG_MMC_SPI is not set CONFIG_MMC_DW=y CONFIG_MMC_DW_PLTFM=y # CONFIG_MMC_DW_EXYNOS is not set # CONFIG_MMC_DW_K3 is not set CONFIG_MMC_DW_ROCKCHIP=y # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set # CONFIG_MMC_MTK is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y # CONFIG_LEDS_CLASS_FLASH is not set # # LED drivers # # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP5521 is not set # CONFIG_LEDS_LP5523 is not set # CONFIG_LEDS_LP5562 is not set # CONFIG_LEDS_LP8501 is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set # CONFIG_LEDS_PWM is not set # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_SYSCON is not set # # LED Triggers # CONFIG_LEDS_TRIGGERS=y # CONFIG_LEDS_TRIGGER_TIMER is not set # CONFIG_LEDS_TRIGGER_ONESHOT is not set CONFIG_LEDS_TRIGGER_HEARTBEAT=y # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set CONFIG_LEDS_TRIGGER_CPU=y CONFIG_LEDS_TRIGGER_GPIO=y # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set # CONFIG_SWITCH is not set # CONFIG_ACCESSIBILITY is not set CONFIG_EDAC_SUPPORT=y # CONFIG_EDAC is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # I2C RTC drivers # # CONFIG_RTC_DRV_ABB5ZES3 is not set # CONFIG_RTC_DRV_ABX80X is not set # CONFIG_RTC_DRV_DS1307 is not set # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_FAKE is not set # CONFIG_RTC_DRV_HYM8563 is not set # CONFIG_RTC_DRV_MAX6900 is not set CONFIG_RTC_DRV_RK808=y # CONFIG_RTC_DRV_RK_TIMER is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12057 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8581 is not set # CONFIG_RTC_DRV_RX8025 is not set # CONFIG_RTC_DRV_EM3027 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RV8803 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_DS3234 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_MCP795 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_PL030 is not set # CONFIG_RTC_DRV_PL031 is not set # CONFIG_RTC_DRV_SNVS is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_HID_SENSOR_TIME is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_OF=y # CONFIG_AMBA_PL08X is not set # CONFIG_FSL_EDMA is not set # CONFIG_INTEL_IDMA64 is not set CONFIG_PL330_DMA=y # CONFIG_DW_DMAC is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set # # Virtio drivers # # CONFIG_VIRTIO_MMIO is not set # # Microsoft Hyper-V guest support # CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_COMEDI is not set # CONFIG_RTLLIB is not set CONFIG_R8712U=m CONFIG_R8188EU=m # CONFIG_88EU_AP_MODE is not set CONFIG_R8723AU=m # CONFIG_8723AU_AP_MODE is not set CONFIG_8723AU_BT_COEXIST=y # CONFIG_VT6656 is not set # # IIO staging drivers # # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16203 is not set # CONFIG_ADIS16204 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADIS16220 is not set # CONFIG_ADIS16240 is not set # CONFIG_LIS3L02DQ is not set # CONFIG_SCA3000 is not set # # Analog to digital converters # # CONFIG_AD7606 is not set # CONFIG_AD7780 is not set # CONFIG_AD7816 is not set # CONFIG_AD7192 is not set # CONFIG_AD7280 is not set # # Analog digital bi-direction converters # # CONFIG_ADT7316 is not set # # Capacitance to digital converters # # CONFIG_AD7150 is not set # CONFIG_AD7152 is not set # CONFIG_AD7746 is not set # # Direct Digital Synthesis # # CONFIG_AD9832 is not set # CONFIG_AD9834 is not set # # Digital gyroscope sensors # # CONFIG_ADIS16060 is not set # # Network Analyzer, Impedance Converters # # CONFIG_AD5933 is not set # CONFIG_INV_MPU_IIO is not set # # Light sensors # CONFIG_SENSORS_ISL29018=y # CONFIG_SENSORS_ISL29028 is not set CONFIG_TSL2583=y # CONFIG_TSL2x7x is not set # # Magnetometer sensors # # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # # Active energy metering IC # # CONFIG_ADE7753 is not set # CONFIG_ADE7754 is not set # CONFIG_ADE7758 is not set # CONFIG_ADE7759 is not set # CONFIG_ADE7854 is not set # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1200 is not set # CONFIG_AD2S1210 is not set # # Triggers - standalone # # CONFIG_IIO_PERIODIC_RTC_TRIGGER is not set # CONFIG_IIO_SIMPLE_DUMMY is not set # # Speakup console speech # # CONFIG_SPEAKUP is not set # CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set # CONFIG_STAGING_MEDIA is not set # # Android # # CONFIG_ASHMEM is not set # CONFIG_ANDROID_TIMED_OUTPUT is not set # CONFIG_ANDROID_LOW_MEMORY_KILLER is not set # CONFIG_SYNC is not set # CONFIG_ION is not set CONFIG_FIQ_DEBUGGER=y CONFIG_FIQ_DEBUGGER_NO_SLEEP=y # CONFIG_FIQ_DEBUGGER_WAKEUP_IRQ_ALWAYS_ON is not set CONFIG_FIQ_DEBUGGER_CONSOLE=y CONFIG_FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE=y # CONFIG_FIQ_DEBUGGER_TRUST_ZONE is not set # CONFIG_FIQ_DEBUGGER_UART_OVERLAY is not set # CONFIG_FIQ_WATCHDOG is not set # CONFIG_RK_CONSOLE_THREAD is not set # CONFIG_STAGING_BOARD is not set # CONFIG_WIMAX_GDM72XX is not set # CONFIG_LTE_GDM724X is not set # CONFIG_LUSTRE_FS is not set # CONFIG_DGAP is not set # CONFIG_GS_FPGABOOT is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set # CONFIG_FB_TFT is not set # CONFIG_FSL_MC_BUS is not set # CONFIG_WILC1000_DRIVER is not set # CONFIG_MOST is not set # CONFIG_POWERVR_ROGUE_N is not set # CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Common Clock Framework # # CONFIG_COMMON_CLK_VERSATILE is not set CONFIG_COMMON_CLK_RK808=y # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_CLK_QORIQ is not set # CONFIG_COMMON_CLK_XGENE is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_PXA is not set # CONFIG_COMMON_CLK_CDCE706 is not set # # Hardware Spinlock drivers # # CONFIG_HWSPINLOCK_ROCKCHIP is not set # # Clock Source drivers # CONFIG_CLKSRC_OF=y CONFIG_CLKSRC_PROBE=y CONFIG_ROCKCHIP_TIMER=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y # CONFIG_ARM_ARCH_TIMER_VCT_ACCESS is not set # CONFIG_ARM_TIMER_SP804 is not set # CONFIG_ATMEL_PIT is not set # CONFIG_SH_TIMER_CMT is not set # CONFIG_SH_TIMER_MTU2 is not set # CONFIG_SH_TIMER_TMU is not set # CONFIG_EM_TIMER_STI is not set # CONFIG_MAILBOX is not set CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # # CONFIG_IOMMU_IO_PGTABLE_LPAE is not set CONFIG_IOMMU_IOVA=y CONFIG_OF_IOMMU=y CONFIG_IOMMU_DMA=y CONFIG_ROCKCHIP_IOMMU=y # CONFIG_RK_IOMMU is not set # CONFIG_ARM_SMMU is not set # # Remoteproc drivers # # CONFIG_STE_MODEM_RPROC is not set # # Rpmsg drivers # # # SOC (System On Chip) specific Drivers # # # Rockchip CPU selection # CONFIG_CPU_PX30=y # CONFIG_CPU_RK1808 is not set # CONFIG_CPU_RK3308 is not set CONFIG_CPU_RK3328=y # CONFIG_CPU_RK3366 is not set CONFIG_CPU_RK3368=y CONFIG_CPU_RK3399=y CONFIG_ANDROID_VERSION=0x07010000 CONFIG_ROCKCHIP_CPUINFO=y # CONFIG_ROCKCHIP_DEVICEINFO is not set CONFIG_ROCKCHIP_IPA=y CONFIG_ROCKCHIP_OPP=y # CONFIG_ROCKCHIP_PM_TEST is not set CONFIG_ROCKCHIP_GRF=y CONFIG_ROCKCHIP_PM_DOMAINS=y CONFIG_ROCKCHIP_PVTM=y CONFIG_ROCKCHIP_SUSPEND_MODE=y CONFIG_ROCKCHIP_SYSTEM_MONITOR=y # CONFIG_ROCKCHIP_VENDOR_STORAGE_UPDATE_LOADER is not set # CONFIG_SUNXI_SRAM is not set # CONFIG_SOC_TI is not set CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y CONFIG_DEVFREQ_GOV_PERFORMANCE=y CONFIG_DEVFREQ_GOV_POWERSAVE=y CONFIG_DEVFREQ_GOV_USERSPACE=y # # DEVFREQ Drivers # # CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ is not set CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y CONFIG_PM_DEVFREQ_EVENT=y CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y # CONFIG_DEVFREQ_EVENT_ROCKCHIP_NOCP is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_GPIO is not set # CONFIG_EXTCON_RT8973A is not set # CONFIG_EXTCON_SM5502 is not set # CONFIG_EXTCON_USB_GPIO is not set CONFIG_MEMORY=y # CONFIG_ARM_PL172_MPMC is not set CONFIG_IIO=y CONFIG_IIO_BUFFER=y # CONFIG_IIO_BUFFER_CB is not set CONFIG_IIO_KFIFO_BUF=y CONFIG_IIO_TRIGGER=y CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # # Accelerometers # # CONFIG_BMA180 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MXC4005 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # # Analog to digital converters # # CONFIG_AD7266 is not set # CONFIG_AD7291 is not set # CONFIG_AD7298 is not set # CONFIG_AD7476 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD799X is not set # CONFIG_CC10001_ADC is not set # CONFIG_GPIO_MUXADC is not set # CONFIG_HI8435 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX1363 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_NAU7802 is not set CONFIG_ROCKCHIP_SARADC=y # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_VF610_ADC is not set # # Amplifiers # # CONFIG_AD8366 is not set # # Chemical Sensors # # CONFIG_VZ89X is not set # # Hid Sensor IIO Common # # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # # Digital to analog converters # # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_AD5686 is not set # CONFIG_AD5755 is not set # CONFIG_AD5764 is not set # CONFIG_AD5791 is not set # CONFIG_AD7303 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # # Humidity sensors # # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16480 is not set # CONFIG_KMX61 is not set # CONFIG_INV_MPU6050_IIO is not set # # Light sensors # # CONFIG_ADJD_S311 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_BH1750 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM36651 is not set # CONFIG_GP2AP020A00F is not set # CONFIG_ISL29125 is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_STK3310 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set CONFIG_SENSORS_TSL2563=y # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VL6180 is not set # # Magnetometer sensors # # CONFIG_AK8975 is not set # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN is not set # CONFIG_MAG3110 is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # # Inclinometer sensors # # # Triggers - standalone # # CONFIG_IIO_INTERRUPT_TRIGGER is not set CONFIG_IIO_SYSFS_TRIGGER=y # # Digital potentiometers # # CONFIG_MCP4531 is not set # # Pressure sensors # # CONFIG_BMP280 is not set # CONFIG_MPL115 is not set # CONFIG_MPL3115 is not set # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # # Lightning sensors # # CONFIG_AS3935 is not set # # Proximity sensors # # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_SRF04 is not set # CONFIG_SX9500 is not set # # Temperature sensors # # CONFIG_MLX90614 is not set # CONFIG_TMP006 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_FSL_FTM is not set # CONFIG_PWM_GPIO is not set # CONFIG_PWM_PCA9685 is not set CONFIG_PWM_ROCKCHIP=y # CONFIG_PWM_ROCKCHIP_I2S is not set CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_V3=y CONFIG_PARTITION_PERCPU=y # CONFIG_IPACK_BUS is not set CONFIG_ARCH_HAS_RESET_CONTROLLER=y CONFIG_RESET_CONTROLLER=y # CONFIG_FMC is not set # # PHY Subsystem # CONFIG_GENERIC_PHY=y # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_BCM_KONA_USB2_PHY is not set # CONFIG_PHY_SAMSUNG_USB2 is not set # CONFIG_PHY_XGENE is not set # CONFIG_PHY_ROCKCHIP_USB is not set # CONFIG_PHY_ROCKCHIP_INNO_COMBPHY is not set CONFIG_PHY_ROCKCHIP_INNO_USB2=y # CONFIG_PHY_ROCKCHIP_INNO_USB3 is not set # CONFIG_PHY_ROCKCHIP_EMMC is not set # CONFIG_PHY_ROCKCHIP_DP is not set CONFIG_PHY_ROCKCHIP_MIPI_RX=y # CONFIG_PHY_ROCKCHIP_INNO_MIPI_DPHY is not set # CONFIG_PHY_ROCKCHIP_INNO_HDMI_PHY is not set # CONFIG_PHY_ROCKCHIP_INNO_VIDEO_PHY is not set CONFIG_PHY_ROCKCHIP_INNO_VIDEO_COMBO_PHY=y # CONFIG_PHY_ROCKCHIP_TYPEC is not set # CONFIG_PHY_ROCKCHIP_PCIE is not set # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # CONFIG_ARM_PMU=y CONFIG_RAS=y # # Android # CONFIG_ANDROID=y # CONFIG_ANDROID_BINDER_IPC is not set # CONFIG_LIBNVDIMM is not set CONFIG_NVMEM=y # CONFIG_ROCKCHIP_EFUSE is not set CONFIG_ROCKCHIP_OTP=y # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # # FPGA Configuration Support # # CONFIG_FPGA is not set # CONFIG_TEE is not set CONFIG_RK_FLASH=y # # Rockchip Flash Devices # # CONFIG_RK_NANDC_NAND is not set CONFIG_RK_SFC_NAND=y CONFIG_RK_SFC_NOR=y CONFIG_RK_SFC_NOR_MTD=y # CONFIG_RK_NAND is not set # # Headset device support # # CONFIG_RK_HEADSET is not set # # Gator module for ARM streamline # CONFIG_GATOR=m CONFIG_GATOR_DO_NOT_ONLINE_CORES_AT_STARTUP=y CONFIG_GATOR_WITH_MALI_SUPPORT=y # CONFIG_GATOR_MALI_4XXMP is not set CONFIG_GATOR_MALI_MIDGARD=y CONFIG_GATOR_MALI_MIDGARD_PATH="drivers/gpu/arm/bifrost_for_linux" # # Firmware Drivers # CONFIG_ARM_PSCI_FW=y # CONFIG_FIRMWARE_MEMMAP is not set CONFIG_HAVE_ARM_SMCCC=y CONFIG_ROCKCHIP_SIP=y # # File systems # CONFIG_DCACHE_WORD_ACCESS=y # CONFIG_EXT2_FS is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_POSIX_ACL=y # CONFIG_EXT3_FS_SECURITY is not set 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 CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set # CONFIG_XFS_FS is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set # CONFIG_FS_DAX is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set CONFIG_FSNOTIFY=y # CONFIG_DNOTIFY is not set CONFIG_INOTIFY_USER=y # CONFIG_FANOTIFY is not set # CONFIG_QUOTA is not set # CONFIG_QUOTACTL is not set CONFIG_AUTOFS4_FS=y CONFIG_FUSE_FS=y # CONFIG_CUSE is not set CONFIG_OVERLAY_FS=y # # Caches # CONFIG_FSCACHE=y # CONFIG_FSCACHE_STATS is not set # CONFIG_FSCACHE_HISTOGRAM is not set # CONFIG_FSCACHE_DEBUG is not set # CONFIG_FSCACHE_OBJECT_LIST is not set # CONFIG_CACHEFILES is not set # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=936 CONFIG_FAT_DEFAULT_IOCHARSET="utf8" CONFIG_FAT_DEFAULT_UTF8=y CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_CODEPAGE=936 CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" CONFIG_EXFAT_VIRTUAL_XATTR=y CONFIG_EXFAT_VIRTUAL_XATTR_SELINUX_LABEL="u:object_r:exfat:s0" CONFIG_EXFAT_DEBUG=n CONFIG_EXFAT_UEVENT=n # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_UID=y CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_HUGETLBFS is not set # CONFIG_HUGETLB_PAGE is not set CONFIG_CONFIGFS_FS=y CONFIG_MISC_FILESYSTEMS=y # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set # CONFIG_SDCARD_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS2_FS is not set # CONFIG_LOGFS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y CONFIG_SQUASHFS_DECOMP_SINGLE=y # CONFIG_SQUASHFS_DECOMP_MULTI is not set # CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y # CONFIG_SQUASHFS_LZ4 is not set CONFIG_SQUASHFS_LZO=y # CONFIG_SQUASHFS_XZ is not set # CONFIG_SQUASHFS_ZSTD is not set # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y CONFIG_PSTORE_CONSOLE=y # CONFIG_PSTORE_PMSG is not set # CONFIG_PSTORE_FTRACE is not set CONFIG_PSTORE_RAM=y # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFS_SWAP=y # CONFIG_NFS_V4_1 is not set # CONFIG_ROOT_NFS is not set # CONFIG_NFS_FSCACHE is not set # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_SWAP=y # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set # CONFIG_CIFS_WEAK_PW_HASH is not set # CONFIG_CIFS_UPCALL is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_CIFS_ACL=y CONFIG_CIFS_DEBUG=y # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DFS_UPCALL is not set CONFIG_CIFS_SMB2=y # CONFIG_CIFS_SMB311 is not set CONFIG_CIFS_FSCACHE=y # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set CONFIG_NLS_CODEPAGE_936=y # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set CONFIG_HAVE_KVM_IRQFD=y CONFIG_HAVE_KVM_EVENTFD=y CONFIG_KVM_MMIO=y CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y CONFIG_KVM_VFIO=y CONFIG_HAVE_KVM_ARCH_TLB_FLUSH_ALL=y CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y CONFIG_KVM_COMPAT=y CONFIG_VIRTUALIZATION=y CONFIG_KVM_ARM_VGIC_V3=y CONFIG_KVM=y CONFIG_KVM_ARM_HOST=y CONFIG_VHOST_NET=m CONFIG_VHOST=m # CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_PROCESS is not set CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y # # Compile-time checks and compiler options # CONFIG_DEBUG_INFO=y # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_INFO_SPLIT is not set # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_GDB_SCRIPTS is not set CONFIG_ENABLE_WARN_DEPRECATED=y CONFIG_ENABLE_MUST_CHECK=y 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 CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0 CONFIG_DEBUG_KERNEL=y # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_ARCH_KASAN=y # CONFIG_KASAN is not set # CONFIG_DEBUG_SHIRQ is not set # # Debug Lockups and Hangs # CONFIG_LOCKUP_DETECTOR=y CONFIG_HARDLOCKUP_DETECTOR_OTHER_CPU=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=1 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=1 # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 CONFIG_SCHED_DEBUG=y CONFIG_SCHED_INFO=y # CONFIG_PANIC_ON_RT_THROTTLING is not set CONFIG_SCHEDSTATS=y # CONFIG_SCHED_STACK_END_CHECK is not set # CONFIG_DEBUG_TIMEKEEPING is not set CONFIG_TIMER_STATS=y # # Lock Debugging (spinlocks, mutexes, etc...) # # CONFIG_DEBUG_RT_MUTEXES is not set CONFIG_DEBUG_SPINLOCK=y # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set CONFIG_STACKTRACE=y # CONFIG_DEBUG_KOBJECT is not set CONFIG_HAVE_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PI_LIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set CONFIG_DEBUG_CREDENTIALS=y # # RCU Debugging # # CONFIG_PROVE_RCU is not set # CONFIG_SPARSE_RCU_POINTER is not set # CONFIG_TORTURE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=60 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_GPU_TRACEPOINTS=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y # CONFIG_PREEMPTIRQ_EVENTS is not set # CONFIG_IRQSOFF_TRACER is not set # CONFIG_SCHED_TRACER is not set # CONFIG_FTRACE_SYSCALLS is not set # CONFIG_TRACER_SNAPSHOT is not set CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set # CONFIG_STACK_TRACER is not set CONFIG_BLK_DEV_IO_TRACE=y # CONFIG_PROBE_EVENTS is not set CONFIG_DYNAMIC_FTRACE=y # CONFIG_FUNCTION_PROFILER is not set CONFIG_FTRACE_MCOUNT_RECORD=y # CONFIG_FTRACE_STARTUP_TEST is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_TRACE_ENUM_MAP_FILE is not set CONFIG_TRACING_EVENTS_GPIO=y # # Runtime Testing # CONFIG_LKDTM=y # CONFIG_TEST_LIST_SORT is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_RBTREE_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_RHASHTABLE is not set # CONFIG_DMA_API_DEBUG is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_UDELAY is not set # CONFIG_MEMTEST is not set # CONFIG_TEST_STATIC_KEYS 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_ARM64_PTDUMP is not set CONFIG_STRICT_DEVMEM=y # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set CONFIG_DEBUG_SET_MODULE_RONX=y CONFIG_DEBUG_RODATA=y # CONFIG_DEBUG_ALIGN_RODATA is not set # CONFIG_CORESIGHT is not set # # Security options # CONFIG_KEYS=y # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_BIG_KEYS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY_PERF_EVENTS_RESTRICT is not set # CONFIG_SECURITY is not set CONFIG_SECURITYFS=y CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HAVE_ARCH_HARDENED_USERCOPY=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_TEE_SUPPORT is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_DEFAULT_SECURITY="" CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_PCOMP2=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y CONFIG_CRYPTO_USER=y CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_WORKQUEUE=y CONFIG_CRYPTO_CRYPTD=y # CONFIG_CRYPTO_MCRYPTD is not set CONFIG_CRYPTO_AUTHENC=m # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_ABLK_HELPER=y # # Authenticated Encryption with Associated Data # CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=m # # Block modes # CONFIG_CRYPTO_CBC=m # CONFIG_CRYPTO_HEH is not set CONFIG_CRYPTO_CTR=y # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y # CONFIG_CRYPTO_KEYWRAP is not set # # Hash modes # CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_VMAC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_GHASH=y # CONFIG_CRYPTO_POLY1305 is not set CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_ANUBIS is not set CONFIG_CRYPTO_ARC4=y # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_CHACHA20 is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set CONFIG_CRYPTO_TWOFISH=y CONFIG_CRYPTO_TWOFISH_COMMON=y # # Compression # CONFIG_CRYPTO_DEFLATE=m # CONFIG_CRYPTO_ZLIB is not set CONFIG_CRYPTO_LZO=y # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # # Random Number Generation # CONFIG_CRYPTO_ANSI_CPRNG=y CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set # CONFIG_CRYPTO_USER_API_AEAD is not set CONFIG_CRYPTO_HASH_INFO=y CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_CCP is not set # CONFIG_CRYPTO_DEV_ROCKCHIP_V1 is not set # CONFIG_CRYPTO_DEV_ROCKCHIP_V2 is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_PUBLIC_KEY_ALGO_RSA=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" CONFIG_ARM64_CRYPTO=y CONFIG_CRYPTO_SHA1_ARM64_CE=y CONFIG_CRYPTO_SHA2_ARM64_CE=y CONFIG_CRYPTO_GHASH_ARM64_CE=y # CONFIG_CRYPTO_POLY_HASH_ARM64_CE is not set CONFIG_CRYPTO_AES_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64_CE_CCM=y CONFIG_CRYPTO_AES_ARM64_CE_BLK=y CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y CONFIG_CRYPTO_CRC32_ARM64=y CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_RATIONAL=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_GENERIC_IO=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_CRC_CCITT=y CONFIG_CRC16=y CONFIG_CRC_T10DIF=y CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set CONFIG_CRC7=y CONFIG_LIBCRC32C=y # CONFIG_CRC8 is not set CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_XZ_DEC=y # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set # CONFIG_XZ_DEC_IA64 is not set CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y # CONFIG_XZ_DEC_SPARC is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_GZIP=y CONFIG_DECOMPRESS_BZIP2=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DECOMPRESS_XZ=y CONFIG_DECOMPRESS_LZO=y CONFIG_DECOMPRESS_LZ4=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=m CONFIG_TEXTSEARCH_BM=m CONFIG_TEXTSEARCH_FSM=m CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_DMA=y CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_NLATTR=y CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y CONFIG_CLZ_TAB=y # CONFIG_CORDIC is not set # CONFIG_DDR is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y # CONFIG_SG_SPLIT is not set CONFIG_ARCH_HAS_SG_CHAIN=y ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/options ================================================ ################################################################################ # setup device defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) TARGET_KERNEL_ARCH="arm64" TARGET_PATCH_ARCH="aarch64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a35" TARGET_CPU_FLAGS="+crc+crypto+fp+simd" TARGET_FPU="fp-armv8" TARGET_FEATURES="64bit" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_PATCH_ARCH="aarch64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a35" TARGET_CPU_FLAGS="+crc" TARGET_FPU="crypto-neon-fp-armv8" TARGET_FEATURES="32bit" ;; esac # Kernel target KERNEL_TARGET="Image" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="" KERNEL_MAKE_EXTRACMD+=" rockchip/rk3326-odroidgo2-linux.dtb" KERNEL_MAKE_EXTRACMD+=" rockchip/rk3326-odroidgo2-linux-v11.dtb" KERNEL_MAKE_EXTRACMD+=" rockchip/rk3326-odroidgo3-linux.dtb" # Mali GPU family MALI_FAMILY="g31" OPENGLES="mali-bifrost" # kernel serial console EXTRA_CMDLINE="console=ttyFIQ0 console=tty0 net.iframes=0 fbcon=rotate:3 ssh consoleblank=0" LINUX="odroid-go-a-4.4" UBOOT_SYSTEM="odroidgo2" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" FIRMWARE="wlan-firmware misc-firmware" #rockchip-firmware dvb-firmware # additional drivers to install: # for a list of additional drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="RTL8812AU" #RTL8192CU RTL8192DU RTL8192EU RTL8188EU RTL8812AU RTL8821CU" # driver addons to install: # for a list of additinoal drivers see packages/linux-driver-addons # Space separated list is supported, DRIVER_ADDONS="" #dvb-latest" # additional packages to install ADDITIONAL_PACKAGES="dtc bootini" # debug tty path DEBUG_TTY="/dev/ttyFIQ0" # SquashFS compression method (gzip / lzo / xz / zstd) SQUASHFS_COMPRESSION="lzo" # build and install PulseAudio support (yes / no) PULSEAUDIO_SUPPORT="yes" # build and install espeak support (yes / no) ESPEAK_SUPPORT="no" # build and install bluetooth support (yes / no) BLUETOOTH_SUPPORT="yes" # build and install Avahi (Zeroconf) daemon (yes / no) AVAHI_DAEMON="no" # build with UPnP support (yes / no) KODI_UPNP_SUPPORT="no" # build with NFS support (mounting nfs shares via the OS) (yes / no) NFS_SUPPORT="no" # build with Samba Client support (mounting samba shares via the OS) (yes / no) SAMBA_SUPPORT="yes" # build and install Samba Server (yes / no) SAMBA_SERVER="yes" # build and install SFTP Server (yes / no) SFTP_SERVER="yes" # build and install OpenVPN support (yes / no) OPENVPN_SUPPORT="no" # build and install diskmounter support (udevil) # this service provide auto mounting support for external drives in the # mediacenter also automount internally drives at boottime via udev (yes / no) UDEVIL="yes" # build and install exFAT fuse support (yes / no) EXFAT="yes" # build and install NTFS-3G fuse support (yes / no) NTFS3G="yes" # build and install hfs filesystem utilities (yes / no) HFSTOOLS="yes" # build and install remote support (yes / no) REMOTE_SUPPORT="no" # build and install CEC adapter support (yes / no) CEC_SUPPORT="no" # build and install CEC framework support (yes / no) CEC_FRAMEWORK_SUPPORT="no" # build and install iSCSI support - iscsistart (yes / no) ISCSI_SUPPORT="no" # build with swap support (yes / no) SWAP_SUPPORT="yes" # swap support enabled per default (yes / no) SWAP_ENABLED_DEFAULT="no" # swapfile size if SWAP_SUPPORT=yes in MB SWAPFILESIZE="300" # cron support (yes / no) CRON_SUPPORT="no" # Distribution Specific source location DISTRO_MIRROR="http://sources.libreelec.tv/mirror" DISTRO_SRC="http://sources.libreelec.tv/$LIBREELEC_VERSION" # Settings package name - blank if not required DISTRO_PKG_SETTINGS="" # IR remote protocols supported in default config IR_REMOTE_PROTOCOLS="" # IR remote keymaps supported in default config IR_REMOTE_KEYMAPS="" ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/packages/enable-oga-sleep/package.mk ================================================ PKG_NAME="enable-oga-sleep" PKG_VERSION="" PKG_SHA256="" PKG_ARCH="any" PKG_LICENSE="OSS" PKG_DEPENDS_TARGET="systemd" PKG_SITE="" PKG_URL="" PKG_LONGDESC="Sleep configuration" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p $INSTALL/usr/config/sleep.conf.d cp sleep.conf $INSTALL/usr/config/sleep.conf.d/sleep.conf mkdir -p $INSTALL/usr/lib/systemd/system-sleep/ cp sleep.sh $INSTALL/usr/lib/systemd/system-sleep/sleep } ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/packages/enable-oga-sleep/sources/sleep.conf ================================================ # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # # Entries in this file show the compile time defaults. # You can change settings by editing this file. # Defaults can be restored by simply deleting this file. # # See systemd-sleep.conf(5) for details [Sleep] AllowSuspend=yes #AllowHibernation=yes #AllowSuspendThenHibernate=yes #AllowHybridSleep=yes #SuspendMode=suspend SuspendState=mem standby freeze #HibernateMode=platform shutdown #HibernateState=disk #HybridSleepMode=suspend platform shutdown #HybridSleepState=disk #HibernateDelaySec=180min ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/packages/enable-oga-sleep/sources/sleep.sh ================================================ #!/bin/bash OGA=$(cat /proc/device-tree/compatible) case $1 in pre) # unload esp8090 WiFi module [[ "${OGA}" == *"v11"* ]] && modprobe -r esp8089 # Store sound state. Try to avoid having max volume after resume alsactl store -f /tmp/asound.state # workaround until dwc2 is fixed modprobe -r dwc2 # stop hotkey service systemctl stop odroidgoa-headphones.service ;; post) # Restore pre-sleep sound state alsactl restore -f /tmp/asound.state # workaround until dwc2 is fixed modprobe -r dwc2 modprobe -i dwc2 # re-load WiFi module [[ "${OGA}" == *"v11"* ]] && modprobe esp8089 # re-detect and reapply sound, brightness and hp state systemctl start odroidgoa-headphones.service ;; esac ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/packages/odroidgoa-utils/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="odroidgoa-utils" PKG_VERSION="" PKG_SHA256="" PKG_ARCH="any" PKG_LICENSE="OSS" PKG_DEPENDS_TARGET="toolchain python-evdev enable-oga-sleep usb-modeswitch light retrorun" PKG_SITE="" PKG_URL="" PKG_LONGDESC="Support scripts for the ODROID-GO Advance" PKG_TOOLCHAIN="manual" if [ "${ARCH}" = "aarch64" ]; then PKG_DEPENDS_TARGET+=" lib32-retrorun" fi makeinstall_target() { mkdir -p $INSTALL/usr/bin cp * $INSTALL/usr/bin } post_install() { enable_service odroidgoa-hotkeys.service enable_service odroidgoa-headphones.service } ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/packages/odroidgoa-utils/sources/headphone_sense.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile # Switch to headphones if we have them already connected at boot GPIO=$(cat /sys/class/gpio/gpio86/value) [[ "$GPIO" == "1" ]] && set_ee_setting "audio.device" "headphone" || set_ee_setting "audio.device" "speakers" if [ -e "/emuelec/configs/emuelec.conf" ]; then /usr/bin/odroidgoa_utils.sh setaudio $(get_ee_setting "audio.device") /usr/bin/odroidgoa_utils.sh vol $(get_ee_setting "audio.volume") /usr/bin/odroidgoa_utils.sh bright $(get_ee_setting "brightness.level") fi # Headphone sensing DEVICE='/dev/input/event1' HP_ON='*(SW_HEADPHONE_INSERT), value 0*' HP_OFF='*(SW_HEADPHONE_INSERT), value 1*' evtest "${DEVICE}" | while read line; do case $line in (${HP_ON}) amixer cset name='Playback Path' HP set_ee_setting "audio.device" "headphone" ;; (${HP_OFF}) amixer cset name='Playback Path' SPK set_ee_setting "audio.device" "speakers" ;; esac done ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/packages/odroidgoa-utils/sources/odroidgoa_utils.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # THESE NEEDS TO BE CLEANED UP, MAYBE WITH CASE OR FUNCTIONS # Source predefined functions and variables . /etc/profile if [ "${1}" == "toggleaudio" ];then # Toggle audio output CURRENTAUDIO=$(get_ee_setting "audio.device") case "${CURRENTAUDIO}" in "headphone") echo "setting speakers" amixer cset name='Playback Path' SPK set_ee_setting "audio.device" "speakers" ;; "auto"|"speakers"|*) echo "setting headphones" amixer cset name='Playback Path' HP set_ee_setting "audio.device" "headphone" ;; esac fi if [ "${1}" == "setaudio" ];then # Set audio output second parameter is either headphones or speakers case "${2}" in "headphone") echo "setting headphones" amixer cset name='Playback Path' HP set_ee_setting "audio.device" "headphone" ;; "auto"|"speakers"|*) echo "setting speakers" amixer cset name='Playback Path' SPK set_ee_setting "audio.device" "speakers" ;; esac fi if [ "${1}" == "vol" ];then VOLSTEP=5 CURRENTVOL=$(get_ee_setting "audio.volume") MAXVOL=100 MINVOL=0 if [ "${2}" == "+" ]; then STEPVOL=$(($CURRENTVOL+$VOLSTEP)) elif [ "${2}" == "-" ]; then STEPVOL=$(($CURRENTVOL-$VOLSTEP)) else STEPVOL=${2} fi [ "$STEPVOL" -ge "$MAXVOL" ] && STEPVOL="$MAXVOL" [ "$STEPVOL" -le "$MINVOL" ] && STEPVOL="$MINVOL" amixer set 'Playback' ${STEPVOL}% set_ee_setting "audio.volume" ${STEPVOL} fi if [ "${1}" == "bright" ]; then STEPS="5" CURBRIGHT=$(cat /sys/class/backlight/backlight/brightness) MAXSYSBRIGHT=$(cat /sys/class/backlight/backlight/max_brightness) CURRENTBRIGHT=$(awk -v a="$CURBRIGHT" -v b="$MAXSYSBRIGHT" 'BEGIN{print int((a*100/b)+0.5)}') MAXBRIGHT="100" MINBRIGHT="5" if [ "${2}" == "+" ]; then STEPBRIGHT=$(($CURRENTBRIGHT+$STEPS)) elif [ "${2}" == "-" ]; then STEPBRIGHT=$(($CURRENTBRIGHT-$STEPS)) else STEPBRIGHT=${2} fi [ "$STEPBRIGHT" -ge "$MAXBRIGHT" ] && STEPBRIGHT="$MAXBRIGHT" [ "$STEPBRIGHT" -le "$MINBRIGHT" ] && STEPBRIGHT="$MINBRIGHT" #echo "Setting bright to $STEPBRIGHT" NEWVAL=$(awk -v a="$STEPBRIGHT" -v b="$MAXSYSBRIGHT" 'BEGIN{print int((a*b/100)+0.5)}') echo "${NEWVAL}" > /sys/class/backlight/backlight/brightness set_ee_setting "brightness.level" $STEPBRIGHT fi if [ "${1}" == "oga_oc" ]; then case ${2} in "1.4ghz") gov="userspace" freq="1416000" ;; "1.5ghz") gov="userspace" freq="1512000" ;; *) gov="performance" freq="1296000" ;; esac echo ${gov} > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor echo ${freq} > /sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed echo ${freq} > /sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq fi ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/packages/odroidgoa-utils/sources/oga_events.py ================================================ #!/usr/bin/env python3 import evdev import asyncio import time import os.path from subprocess import check_output pwrkey = evdev.InputDevice("/dev/input/event0") if os.path.exists("/dev/input/by-path/platform-odroidgo3-joypad-event-joystick"): odroidgo_joypad = evdev.InputDevice("/dev/input/by-path/platform-odroidgo3-joypad-event-joystick") devicename = "GO-Super Gamepad" odroidgo_volume = evdev.InputDevice("/dev/input/by-path/platform-odroidgo3-keys-event") else: odroidgo_joypad = evdev.InputDevice("/dev/input/by-path/platform-odroidgo2-joypad-event-joystick") devicename = "GO-Advance Gamepad" need_to_swallow_pwr_key = False # After a resume, we swallow the pwr input that triggered the resume class Power: pwr = 116 class Joypad: l1 = 310 r1 = 311 up = 544 down = 545 left = 546 right = 547 f1 = 704 f2 = 705 f5 = 708 volu = 115 vold = 114 def runcmd(cmd, *args, **kw): print(f">>> {cmd}") check_output(cmd, *args, **kw) async def handle_event(device): async for event in device.async_read_loop(): global need_to_swallow_pwr_key if device.name == "rk8xx_pwrkey": keys = odroidgo_joypad.active_keys() if event.value == 1 and event.code == Power.pwr: # pwr on release if need_to_swallow_pwr_key == False: need_to_swallow_pwr_key = True if Joypad.f5 in keys: runcmd("/bin/systemctl poweroff || true", shell=True) else: runcmd("/bin/systemctl suspend || true", shell=True) else: need_to_swallow_pwr_key = False elif device.name == "odroidgo3-keys": keys = odroidgo_volume.active_keys() if event.value == 1: if Joypad.volu in keys: runcmd("/usr/bin/odroidgoa_utils.sh vol +", shell=True) elif Joypad.vold in keys: runcmd("/usr/bin/odroidgoa_utils.sh vol -", shell=True) elif device.name.find(devicename) != -1: keys = odroidgo_joypad.active_keys() print(keys) if event.value == 1 and Joypad.f5 in keys: if event.code == Joypad.up: runcmd("/usr/bin/odroidgoa_utils.sh vol +", shell=True) elif event.code == Joypad.down: runcmd("/usr/bin/odroidgoa_utils.sh vol -", shell=True) elif event.code == Joypad.right: runcmd("/usr/bin/odroidgoa_utils.sh bright +", shell=True) elif event.code == Joypad.left: runcmd("/usr/bin/odroidgoa_utils.sh bright -", shell=True) elif event.code == Joypad.r1: runcmd("/usr/bin/odroidgoa_utils.sh toggleaudio", shell=True) if event.code != 0: print(device.name, event) time.sleep(0.001) def run(): asyncio.ensure_future(handle_event(pwrkey)) asyncio.ensure_future(handle_event(odroidgo_joypad)) if os.path.exists("/dev/input/by-path/platform-odroidgo3-joypad-event-joystick"): asyncio.ensure_future(handle_event(odroidgo_volume)) loop = asyncio.get_event_loop() loop.run_forever() if __name__ == "__main__": # admire run() ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/packages/odroidgoa-utils/system.d/odroidgoa-headphones.service ================================================ [Unit] Description=Odroid Go Advance Headphone Sense ConditionPathExists=/dev/input/event1 Before=emuelec.target [Service] Environment=HOME=/storage EnvironmentFile=/storage/.config/emulationstation/scripts/es_env.sh ExecStart=/usr/bin/headphone_sense.sh Restart=on-failure [Install] WantedBy=multi-user.target ================================================ FILE: projects/Rockchip/devices/OdroidGoAdvance/packages/odroidgoa-utils/system.d/odroidgoa-hotkeys.service ================================================ [Unit] Description=Odroid Go Advance Hotkeys ConditionPathExists=/dev/input/event0 ConditionPathExists=/dev/input/event2 Before=emuelec.target [Service] Environment=HOME=/storage EnvironmentFile=/storage/.config/emulationstation/scripts/es_env.sh ExecStart=/usr/bin/oga_events.py Type=simple [Install] WantedBy=multi-user.target ================================================ FILE: projects/Rockchip/devices/OdroidM1/README.md ================================================ # OdroidM1 This is for OdroidM1 devices using RK3568 SOC **Build** * `PROJECT=Rockchip DEVICE=OdroidM1 ARCH=aarch64 make image` ================================================ FILE: projects/Rockchip/devices/OdroidM1/bootloader/canupdate.sh ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Allow upgrades between arm and aarch64 if [ "$1" = "@PROJECT@.arm" -o "$1" = "@PROJECT@.aarch64" ]; then exit 0 else exit 1 fi ================================================ FILE: projects/Rockchip/devices/OdroidM1/bootloader/config ================================================ CONFIG_BOOTDELAY=1 # CONFIG_EFI_LOADER is not set CONFIG_FIT=y CONFIG_FIT_SIGNATURE=n ================================================ FILE: projects/Rockchip/devices/OdroidM1/bootloader/install ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) #cp -av idblock.bin $INSTALL/usr/share/bootloader/idbloader.img #mv idblock.bin idbloader.img cp -av uboot.img $INSTALL/usr/share/bootloader #cp -av trust.img $INSTALL/usr/share/bootloader LE_TMP=$(mktemp -d) mkdir -p "${LE_TMP}/extlinux" mkdir -p $INSTALL/usr/share/bootloader/extlinux LINUX_DTS_DIR=$(get_build_dir linux)/.install_pkg/usr/share/bootloader for dtb in $LINUX_DTS_DIR/*.dtb; do if [ ! -f $dtb ]; then continue fi cat << EOF > "${LE_TMP}/extlinux/$(basename ${dtb}).conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDT /$(basename ${dtb}) APPEND boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@ quiet ${EXTRA_CMDLINE} EOF cp -a "${LE_TMP}/extlinux/$(basename ${dtb}).conf" $INSTALL/usr/share/bootloader/extlinux done ================================================ FILE: projects/Rockchip/devices/OdroidM1/bootloader/mkimage ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) #if [ -f "$RELEASE_DIR/3rdparty/bootloader/idbloader.img" ]; then # echo "image: burn Odroid M1 idblock.bin to image..." # dd if="$RELEASE_DIR/3rdparty/bootloader/idbloader.img" of="$DISK" bs=32k seek=1 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error #fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/uboot.img" ]; then echo "image: burn Odroid M1 uboot.img to image..." dd if="$RELEASE_DIR/3rdparty/bootloader/uboot.img" of="$DISK" bs=64k seek=128 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error fi #if [ -f "$RELEASE_DIR/3rdparty/bootloader/trust.img" ]; then # echo "image: burn Odroid M1 trust.img to image..." # dd if="$RELEASE_DIR/3rdparty/bootloader/trust.img" of="$DISK" bs=64k seek=192 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error #fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/boot.ini" ]; then echo "image: copying boot.ini to root" mcopy "$RELEASE_DIR/3rdparty/bootloader/boot.ini" :: fi mkdir -p "${LE_TMP}/extlinux" # copy device trees to part1 for dtb in $RELEASE_DIR/3rdparty/bootloader/*.dtb; do if [ ! -f $dtb ]; then continue fi cat << EOF > "${LE_TMP}/extlinux/$(basename ${dtb}).conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDT /$(basename ${dtb}) APPEND boot=UUID=${UUID_SYSTEM} disk=UUID=${UUID_STORAGE} quiet ${EXTRA_CMDLINE} EOF [ -e "$dtb" ] && mcopy -o "$dtb" :: done cat << EOF > "${LE_TMP}/boot.cmd" setenv bootlabel "${DISTRO}" load \${devtype} \${devnum}:\${partition} \${loadaddr} \${prefix}config.ini && ini generic \${loadaddr} setenv bootargs "boot=UUID=\${boot_uuid} disk=UUID=\${disk_uuid} \${extra_cmds}" load \${devtype} \${devnum}:\${partition} \${kernel_addr_r} \${prefix}KERNEL load \${devtype} \${devnum}:\${partition} \${fdt_addr_r} \${prefix}\${dtb_file} booti \${kernel_addr_r} - \${fdt_addr_r} EOF ${TOOLCHAIN}/bin/mkimage -C none -T script -A arm64 -d ${LE_TMP}/boot.cmd ${LE_TMP}/boot.scr cat << EOF > "${LE_TMP}/config.ini" [generic] boot_uuid="${UUID_SYSTEM}" disk_uuid="${UUID_STORAGE}" extra_cmds="${EXTRA_CMDLINE}" dtb_file="rk3568-odroid-m1.dtb" EOF mcopy -so "${LE_TMP}/extlinux" :: mcopy -so "${LE_TMP}/boot.scr" :: mcopy -so "${LE_TMP}/config.ini" :: ================================================ FILE: projects/Rockchip/devices/OdroidM1/bootloader/release ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) mkdir -p $RELEASE_DIR/3rdparty/bootloader if [ -n "$UBOOT_SYSTEM" ]; then BOOTLOADER_DIR=$(get_build_dir $BOOTLOADER) if [ -f $BOOTLOADER_DIR/idbloader.img ]; then cp -a $BOOTLOADER_DIR/idbloader.img $RELEASE_DIR/3rdparty/bootloader fi if [ -f $BOOTLOADER_DIR/uboot.img ]; then cp -a $BOOTLOADER_DIR/uboot.img $RELEASE_DIR/3rdparty/bootloader fi if [ -f $BOOTLOADER_DIR/trust.img ]; then cp -a $BOOTLOADER_DIR/trust.img $RELEASE_DIR/3rdparty/bootloader fi fi if [ -f $INSTALL/usr/share/bootloader/boot.ini ]; then cp -a $INSTALL/usr/share/bootloader/boot.ini $RELEASE_DIR/3rdparty/bootloader fi LINUX_DTS_DIR=$(get_build_dir linux)/arch/$TARGET_KERNEL_ARCH/boot/dts for dtb in $LINUX_DTS_DIR/*.dtb $LINUX_DTS_DIR/*/*.dtb; do if [ -f $dtb ]; then cp -a $dtb $RELEASE_DIR/3rdparty/bootloader fi done LE_TMP=$(mktemp -d) mkdir -p "${LE_TMP}/extlinux" mkdir -p $RELEASE_DIR/3rdparty/bootloader LINUX_DTS_DIR=$(get_build_dir linux)/.install_pkg/usr/share/bootloader for dtb in $RELEASE_DIR/3rdparty/bootloader/*.dtb; do if [ ! -f $dtb ]; then continue fi cat << EOF > "${LE_TMP}/extlinux/$(basename ${dtb}).conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDT /$(basename ${dtb}) APPEND boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@ quiet ${EXTRA_CMDLINE} EOF cp -a "${LE_TMP}/extlinux/$(basename ${dtb}).conf" $RELEASE_DIR/3rdparty/bootloader done cat << EOF > "${LE_TMP}/config.ini" [generic] boot_uuid="@BOOT_UUID@" disk_uuid="@DISK_UUID@" extra_cmds="${EXTRA_CMDLINE}" dtb_file="rk3568-odroid-m1.dtb" EOF cp -a "${LE_TMP}/config.ini" $RELEASE_DIR/3rdparty/bootloader ================================================ FILE: projects/Rockchip/devices/OdroidM1/bootloader/update.sh ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) [ -z "$SYSTEM_ROOT" ] && SYSTEM_ROOT="" [ -z "$BOOT_ROOT" ] && BOOT_ROOT="/flash" [ -z "$BOOT_PART" ] && BOOT_PART=$(df "$BOOT_ROOT" | tail -1 | awk {' print $1 '}) if [ -z "$BOOT_DISK" ]; then case $BOOT_PART in /dev/sd[a-z][0-9]*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,[0-9]*,,g") ;; /dev/mmcblk*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,p[0-9]*,,g") ;; esac fi # mount $BOOT_ROOT r/w mount -o remount,rw $BOOT_ROOT for arg in $(cat /proc/cmdline); do case $arg in boot=*) boot="${arg#*=}" case $boot in /dev/mmc*) BOOT_UUID="$(blkid $boot | sed 's/.* UUID="//;s/".*//g')" ;; UUID=*|LABEL=*) BOOT_UUID="$(blkid | sed 's/"//g' | grep -m 1 -i " $boot " | sed 's/.* UUID=//;s/ .*//g')" ;; FOLDER=*) BOOT_UUID="$(blkid ${boot#*=} | sed 's/.* UUID="//;s/".*//g')" ;; esac ;; disk=*) disk="${arg#*=}" case $disk in /dev/mmc*) DISK_UUID="$(blkid $disk | sed 's/.* UUID="//;s/".*//g')" ;; UUID=*|LABEL=*) DISK_UUID="$(blkid | sed 's/"//g' | grep -m 1 -i " $disk " | sed 's/.* UUID=//;s/ .*//g')" ;; FOLDER=*) DISK_UUID="$(blkid ${disk#*=} | sed 's/.* UUID="//;s/".*//g')" ;; esac ;; esac done CONFS=$SYSTEM_ROOT/usr/share/bootloader/extlinux/*.conf for all_conf in $CONFS; do conf="$(basename ${all_conf})" echo "Updating ${conf}..." cp -p $SYSTEM_ROOT/usr/share/bootloader/extlinux/${conf} $BOOT_ROOT/extlinux/${conf} sed -e "s/@BOOT_UUID@/${BOOT_UUID}/" \ -e "s/@DISK_UUID@/${DISK_UUID}/" \ -i $BOOT_ROOT/extlinux/${conf} done if [ -f $SYSTEM_ROOT/usr/share/bootloader/boot.scr ]; then echo "Updating boot.scr..." cp -p $SYSTEM_ROOT/usr/share/bootloader/boot.scr $BOOT_ROOT/boot.scr fi if [ -f $SYSTEM_ROOT/usr/share/bootloader/config.ini ]; then echo "Updating config.ini..." cp -p $SYSTEM_ROOT/usr/share/bootloader/config.ini $BOOT_ROOT/config.ini sed -e "s/@BOOT_UUID@/${BOOT_UUID}/" \ -e "s/@DISK_UUID@/${DISK_UUID}/" \ -i $BOOT_ROOT/config.ini fi # update device tree for all_dtb in $SYSTEM_ROOT/usr/share/bootloader/*.dtb; do dtb=$(basename $all_dtb) echo -n "Updating $dtb... " cp -p $SYSTEM_ROOT/usr/share/bootloader/$dtb $BOOT_ROOT echo "done" done # update bootloader if [ -f $SYSTEM_ROOT/usr/share/bootloader/idbloader.img ]; then echo -n "Updating idbloader.img... " dd if=$SYSTEM_ROOT/usr/share/bootloader/idbloader.img of=$BOOT_DISK bs=32k seek=1 conv=fsync &>/dev/null echo "done" fi if [ -f $SYSTEM_ROOT/usr/share/bootloader/uboot.img ]; then echo -n "Updating uboot.img... " dd if=$SYSTEM_ROOT/usr/share/bootloader/uboot.img of=$BOOT_DISK bs=64k seek=128 conv=fsync &>/dev/null echo "done" fi if [ -f $SYSTEM_ROOT/usr/share/bootloader/trust.img ]; then echo -n "Updating trust.img... " dd if=$SYSTEM_ROOT/usr/share/bootloader/trust.img of=$BOOT_DISK bs=64k seek=192 conv=fsync &>/dev/null echo "done" fi # mount $BOOT_ROOT r/o sync mount -o remount,ro $BOOT_ROOT # Leave a hint that we just did an update echo "UPDATE" > /storage/.config/boot.hint ================================================ FILE: projects/Rockchip/devices/OdroidM1/linux/OdroidM1-4.19/linux.aarch64.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm64 4.19.193 Kernel Configuration # # # Compiler: aarch64-linux-gnu-gcc (Linaro GCC 7.5-2019.12) 7.5.0 # CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=70500 CONFIG_CLANG_VERSION=0 CONFIG_CC_HAS_ASM_GOTO=y CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_EXTABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION_AUTO=y CONFIG_BUILD_SALT="" CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_LZ4=y CONFIG_KERNEL_GZIP=y # CONFIG_KERNEL_LZ4 is not set CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y # CONFIG_POSIX_MQUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_HANDLE_DOMAIN_IRQ=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set CONFIG_GENERIC_IRQ_MULTI_HANDLER=y CONFIG_ARCH_CLOCKSOURCE_DATA=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_TASKSTATS is not set # CONFIG_PSI is not set CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y CONFIG_BUILD_BIN2C=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_CGROUPS=y # CONFIG_MEMCG is not set # CONFIG_BLK_CGROUP is not set CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set # CONFIG_CGROUP_PIDS is not set # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y # CONFIG_CGROUP_PERF is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SCHED_TUNE is not set # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE=" " CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 CONFIG_RD_GZIP=y CONFIG_RD_BZIP2=y CONFIG_RD_LZMA=y CONFIG_RD_XZ=y CONFIG_RD_LZO=y CONFIG_RD_LZ4=y CONFIG_INITRAMFS_COMPRESSION=".gz" # CONFIG_INITRD_ASYNC is not set # CONFIG_ROCKCHIP_ONE_INITRD is not set # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_BPF=y CONFIG_EXPERT=y CONFIG_UID16=y CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set CONFIG_SYSFS_SYSCALL=y # CONFIG_SYSCTL_SYSCALL is not set CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y CONFIG_ADVISE_SYSCALLS=y CONFIG_MEMBARRIER=y CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_BASE_RELATIVE=y # CONFIG_BPF_SYSCALL is not set # CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y # CONFIG_PC104 is not set # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLUB_SYSFS=y CONFIG_SLUB_DEBUG=y # CONFIG_COMPAT_BRK is not set # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set CONFIG_SLUB_CPU_PARTIAL=y CONFIG_SYSTEM_DATA_VERIFICATION=y CONFIG_PROFILING=y CONFIG_TRACEPOINTS=y CONFIG_ARM64=y CONFIG_64BIT=y CONFIG_MMU=y CONFIG_ARM64_PAGE_SHIFT=12 CONFIG_ARM64_CONT_SHIFT=4 CONFIG_ARCH_MMAP_RND_BITS_MIN=18 CONFIG_ARCH_MMAP_RND_BITS_MAX=24 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_STACKTRACE_SUPPORT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_LOCKDEP_SUPPORT=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CSUM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ZONE_DMA32=y CONFIG_HAVE_GENERIC_GUP=y CONFIG_SMP=y CONFIG_KERNEL_MODE_NEON=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_PGTABLE_LEVELS=3 CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_ARCH_PROC_KCORE_TEXT=y # # Platform selection # # CONFIG_ARCH_ACTIONS is not set # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_BCM2835 is not set # CONFIG_ARCH_BCM_IPROC is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_BRCMSTB is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_K3 is not set # CONFIG_ARCH_LAYERSCAPE is not set # CONFIG_ARCH_LG1K is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_MEDIATEK is not set # CONFIG_ARCH_MESON is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_REALTEK is not set CONFIG_ARCH_ROCKCHIP=y # CONFIG_ARCH_SEATTLE is not set # CONFIG_ARCH_SYNQUACER is not set # CONFIG_ARCH_RENESAS is not set # CONFIG_ARCH_STRATIX10 is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_SPRD is not set # CONFIG_ARCH_THUNDER is not set # CONFIG_ARCH_THUNDER2 is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_XGENE is not set # CONFIG_ARCH_ZX is not set # CONFIG_ARCH_ZYNQMP is not set CONFIG_ARCH_ROCKCHIP_ODROID_COMMON=y CONFIG_ARCH_ROCKCHIP_ODROIDM1=y # # Bus support # CONFIG_PCI=y CONFIG_PCI_DOMAINS=y CONFIG_PCI_DOMAINS_GENERIC=y CONFIG_PCI_SYSCALL=y CONFIG_PCIEPORTBUS=y CONFIG_PCIEAER=y # CONFIG_PCIEAER_INJECT is not set # CONFIG_PCIE_ECRC is not set CONFIG_PCIEASPM=y # CONFIG_PCIEASPM_DEBUG is not set # CONFIG_PCIEASPM_DEFAULT is not set # CONFIG_PCIEASPM_POWERSAVE is not set # CONFIG_PCIEASPM_POWER_SUPERSAVE is not set CONFIG_PCIEASPM_PERFORMANCE=y CONFIG_PCIE_PME=y # CONFIG_PCIE_DPC is not set # CONFIG_PCIE_PTM is not set CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y CONFIG_PCI_QUIRKS=y CONFIG_PCI_DEBUG=y # CONFIG_PCI_STUB is not set # CONFIG_PCI_IOV is not set # CONFIG_PCI_PRI is not set # CONFIG_PCI_PASID is not set # CONFIG_HOTPLUG_PCI is not set # # PCI controller drivers # # # Cadence PCIe controllers support # # CONFIG_PCIE_CADENCE_HOST is not set # CONFIG_PCI_FTPCI100 is not set # CONFIG_PCI_HOST_GENERIC is not set # CONFIG_PCIE_XILINX is not set # CONFIG_PCI_XGENE is not set # CONFIG_PCI_HOST_THUNDER_PEM is not set # CONFIG_PCI_HOST_THUNDER_ECAM is not set # CONFIG_PCIE_ROCKCHIP_HOST is not set # CONFIG_ROCKCHIP_PCIE_DMA_OBJ is not set # # DesignWare PCI Core Support # CONFIG_PCIE_DW=y CONFIG_PCIE_DW_HOST=y # CONFIG_PCIE_DW_PLAT_HOST is not set CONFIG_PCIE_DW_ROCKCHIP=y # CONFIG_PCI_HISI is not set # CONFIG_PCIE_KIRIN is not set # # PCI Endpoint # # CONFIG_PCI_ENDPOINT is not set # # PCI switch controller drivers # # CONFIG_PCI_SW_SWITCHTEC is not set # # Kernel Features # # # ARM errata workarounds via the alternatives framework # # CONFIG_ARM64_ERRATUM_826319 is not set # CONFIG_ARM64_ERRATUM_827319 is not set # CONFIG_ARM64_ERRATUM_824069 is not set # CONFIG_ARM64_ERRATUM_819472 is not set # CONFIG_ARM64_ERRATUM_832075 is not set CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_ERRATUM_1024718=y CONFIG_ARM64_ERRATUM_1463225=y CONFIG_ARM64_ERRATUM_1542419=y # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set CONFIG_CAVIUM_ERRATUM_27456=y CONFIG_CAVIUM_ERRATUM_30115=y CONFIG_QCOM_FALKOR_ERRATUM_1003=y CONFIG_QCOM_FALKOR_ERRATUM_1009=y CONFIG_QCOM_QDF2400_ERRATUM_0065=y CONFIG_SOCIONEXT_SYNQUACER_PREITS=y CONFIG_HISILICON_ERRATUM_161600802=y CONFIG_QCOM_FALKOR_ERRATUM_E1041=y CONFIG_ARM64_4K_PAGES=y # CONFIG_ARM64_16K_PAGES is not set # CONFIG_ARM64_64K_PAGES is not set CONFIG_ARM64_VA_BITS_39=y # CONFIG_ARM64_VA_BITS_48 is not set CONFIG_ARM64_VA_BITS=39 CONFIG_ARM64_PA_BITS_48=y CONFIG_ARM64_PA_BITS=48 # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_SCHED_MC=y # CONFIG_SCHED_SMT is not set CONFIG_NR_CPUS=8 CONFIG_HOTPLUG_CPU=y # CONFIG_NUMA is not set CONFIG_HOLES_IN_ZONE=y # CONFIG_HZ_100 is not set # CONFIG_HZ_250 is not set CONFIG_HZ_300=y # CONFIG_HZ_1000 is not set CONFIG_HZ=300 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ARCH_FLATMEM_ENABLE=y CONFIG_HAVE_ARCH_PFN_VALID=y CONFIG_HW_PERF_EVENTS=y CONFIG_SYS_SUPPORTS_HUGETLBFS=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y # CONFIG_ARM64_DMA_USE_IOMMU is not set CONFIG_SECCOMP=y # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_KEXEC is not set # CONFIG_CRASH_DUMP is not set # CONFIG_XEN is not set CONFIG_FORCE_MAX_ZONEORDER=11 CONFIG_UNMAP_KERNEL_AT_EL0=y CONFIG_HARDEN_BRANCH_PREDICTOR=y CONFIG_HARDEN_EL2_VECTORS=y CONFIG_ARM64_SSBD=y CONFIG_ARM64_TAGGED_ADDR_ABI=y CONFIG_ARMV8_DEPRECATED=y CONFIG_SWP_EMULATION=y CONFIG_CP15_BARRIER_EMULATION=y CONFIG_SETEND_EMULATION=y # CONFIG_ARM64_SW_TTBR0_PAN is not set # # ARMv8.1 architectural features # CONFIG_ARM64_HW_AFDBM=y CONFIG_ARM64_PAN=y CONFIG_ARM64_LSE_ATOMICS=y CONFIG_ARM64_VHE=y # # ARMv8.2 architectural features # CONFIG_ARM64_UAO=y # CONFIG_ARM64_PMEM is not set CONFIG_ARM64_RAS_EXTN=y CONFIG_ARM64_SVE=y CONFIG_ARM64_MODULE_PLTS=y # CONFIG_RANDOMIZE_BASE is not set # # Boot options # CONFIG_CMDLINE="" # CONFIG_EFI is not set CONFIG_COMPAT=y CONFIG_KUSER_HELPERS=y CONFIG_SYSVIPC_COMPAT=y # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_SUSPEND_SKIP_SYNC is not set CONFIG_HAS_WAKELOCK=y CONFIG_WAKELOCK=y # CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y CONFIG_PM_DEBUG=y CONFIG_PM_ADVANCED_DEBUG=y # CONFIG_PM_TEST_SUSPEND is not set CONFIG_PM_SLEEP_DEBUG=y # CONFIG_DPM_WATCHDOG is not set CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y CONFIG_PM_GENERIC_DOMAINS_SLEEP=y CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y # # CPU Power Management # # # CPU Idle # 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_DT_IDLE_STATES=y # # ARM CPU Idle Drivers # CONFIG_ARM_CPUIDLE=y # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y # CONFIG_CPU_FREQ_STAT is not set # CONFIG_CPU_FREQ_TIMES is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE=y CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y # CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_INTERACTIVE=y # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y # CONFIG_CPUFREQ_DUMMY is not set # CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set CONFIG_ARM_ROCKCHIP_CPUFREQ=y # CONFIG_ARM_SCMI_CPUFREQ is not set # CONFIG_QORIQ_CPUFREQ is not set # # Firmware Drivers # CONFIG_ARM_PSCI_FW=y # CONFIG_ARM_PSCI_CHECKER is not set CONFIG_ARM_SCMI_PROTOCOL=y CONFIG_ARM_SCMI_POWER_DOMAIN=y # CONFIG_ARM_SCPI_PROTOCOL is not set # CONFIG_ARM_SDE_INTERFACE is not set # CONFIG_FIRMWARE_MEMMAP is not set # CONFIG_FW_CFG_SYSFS is not set CONFIG_ROCKCHIP_SIP=y CONFIG_HAVE_ARM_SMCCC=y # CONFIG_GOOGLE_FIRMWARE is not set # # Tegra firmware driver # # CONFIG_VIRTUALIZATION is not set CONFIG_ARM64_CRYPTO=y CONFIG_CRYPTO_SHA256_ARM64=y # CONFIG_CRYPTO_SHA512_ARM64 is not set CONFIG_CRYPTO_SHA1_ARM64_CE=y CONFIG_CRYPTO_SHA2_ARM64_CE=y # CONFIG_CRYPTO_SHA512_ARM64_CE is not set # CONFIG_CRYPTO_SHA3_ARM64 is not set # CONFIG_CRYPTO_SM3_ARM64_CE is not set # CONFIG_CRYPTO_SM4_ARM64_CE is not set CONFIG_CRYPTO_GHASH_ARM64_CE=y # CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set # CONFIG_CRYPTO_CRC32_ARM64_CE is not set CONFIG_CRYPTO_AES_ARM64=y CONFIG_CRYPTO_AES_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64_CE_CCM=y CONFIG_CRYPTO_AES_ARM64_CE_BLK=y # CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set # CONFIG_CRYPTO_CHACHA20_NEON is not set # CONFIG_CRYPTO_POLY1305_NEON is not set # CONFIG_CRYPTO_AES_ARM64_BS is not set # # General architecture-dependent options # # CONFIG_KPROBES is not set # CONFIG_JUMP_LABEL is not set CONFIG_UPROBES=y CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_NMI=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y 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_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_CLK=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_RCU_TABLE_FREE=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP_FILTER=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_CC_HAS_STACKPROTECTOR_NONE=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_ARCH_SUPPORTS_LTO_CLANG=y CONFIG_ARCH_SUPPORTS_THINLTO=y CONFIG_LTO_NONE=y CONFIG_HAVE_CONTEXT_TRACKING=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=18 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_REFCOUNT_FULL=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y CONFIG_PLUGIN_HOSTCC="" CONFIG_HAVE_GCC_PLUGINS=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y CONFIG_MODULE_FORCE_LOAD=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set # CONFIG_MODULE_COMPRESS is not set # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLK_SCSI_REQUEST=y CONFIG_BLK_DEV_BSG=y # CONFIG_BLK_DEV_BSGLIB is not set # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set # CONFIG_BLK_CMDLINE_PARSER is not set # CONFIG_BLK_WBT is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set CONFIG_BLOCK_COMPAT=y CONFIG_BLK_MQ_PCI=y # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y # CONFIG_DEFAULT_DEADLINE is not set CONFIG_DEFAULT_CFQ=y # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="cfq" CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y # CONFIG_IOSCHED_BFQ is not set CONFIG_ASN1=y CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y CONFIG_ARCH_INLINE_SPIN_LOCK=y CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_SPIN_UNLOCK=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y CONFIG_ARCH_INLINE_READ_LOCK=y CONFIG_ARCH_INLINE_READ_LOCK_BH=y CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_READ_UNLOCK=y CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y CONFIG_ARCH_INLINE_WRITE_LOCK=y CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_WRITE_UNLOCK=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y CONFIG_QUEUED_SPINLOCKS=y CONFIG_ARCH_USE_QUEUED_RWLOCKS=y CONFIG_QUEUED_RWLOCKS=y CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y # CONFIG_GKI_HIDDEN_DRM_CONFIGS is not set # CONFIG_GKI_HIDDEN_REGMAP_CONFIGS is not set # CONFIG_GKI_HIDDEN_CRYPTO_CONFIGS is not set # CONFIG_GKI_HIDDEN_SND_CONFIGS is not set # CONFIG_GKI_HIDDEN_SND_SOC_CONFIGS is not set # CONFIG_GKI_HIDDEN_GPIO_CONFIGS is not set # CONFIG_GKI_HIDDEN_VIRTUAL_CONFIGS is not set # CONFIG_GKI_LEGACY_WEXT_ALLCONFIG is not set # CONFIG_GKI_HIDDEN_SOC_PM_CONFIGS is not set # CONFIG_GKI_HIDDEN_VIDEOBUF2_CONFIGS is not set # CONFIG_GKI_HIDDEN_USB_CONFIGS is not set # CONFIG_GKI_HIDDEN_SOC_BUS_CONFIGS is not set # CONFIG_GKI_HIDDEN_GPU_CONFIGS is not set # CONFIG_GKI_HIDDEN_IRQ_CONFIGS is not set # CONFIG_GKI_HACKS_TO_FIX is not set CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ELFCORE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y # # Memory Management options # CONFIG_SELECT_MEMORY_MODEL=y # CONFIG_FLATMEM_MANUAL is not set CONFIG_SPARSEMEM_MANUAL=y CONFIG_SPARSEMEM=y CONFIG_HAVE_MEMORY_PRESENT=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_MEMBLOCK=y CONFIG_NO_BOOTMEM=y CONFIG_MEMORY_ISOLATION=y CONFIG_SPLIT_PTLOCK_CPUS=4 # CONFIG_COMPACTION is not set CONFIG_MIGRATION=y CONFIG_PHYS_ADDR_T_64BIT=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set # CONFIG_TRANSPARENT_HUGEPAGE is not set # CONFIG_CLEANCACHE is not set # CONFIG_FRONTSWAP is not set CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set # CONFIG_CMA_DEBUGFS is not set CONFIG_CMA_AREAS=7 # CONFIG_ZPOOL is not set # CONFIG_ZBUD is not set CONFIG_ZSMALLOC=y # CONFIG_PGTABLE_MAPPING is not set # CONFIG_ZSMALLOC_STAT is not set # CONFIG_MM_EVENT_STAT is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_FRAME_VECTOR=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_BENCHMARK is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y CONFIG_NET_INGRESS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_INTERFACE is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set # CONFIG_IP_MULTIPLE_TABLES is not set # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set # CONFIG_IP_PNP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_IP_MROUTE_COMMON=y CONFIG_IP_MROUTE=y # CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set # CONFIG_IP_PIMSM_V1 is not set # CONFIG_IP_PIMSM_V2 is not set CONFIG_SYN_COOKIES=y # CONFIG_NET_FOU is not set # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_DIAG is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_INET6_XFRM_MODE_TRANSPORT is not set # CONFIG_INET6_XFRM_MODE_TUNNEL is not set # CONFIG_INET6_XFRM_MODE_BEET is not set # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set # CONFIG_IPV6_SIT is not set # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NET_PTP_CLASSIFY=y # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set # CONFIG_NETFILTER_NETLINK_LOG is not set # CONFIG_NETFILTER_NETLINK_OSF is not set # CONFIG_NF_CONNTRACK is not set # CONFIG_NF_LOG_NETDEV is not set # CONFIG_NF_TABLES is not set CONFIG_NETFILTER_XTABLES=y # # Xtables combined modules # # CONFIG_NETFILTER_XT_MARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_NETFILTER_XT_MATCH_OWNER is not set # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA2 is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # CONFIG_IP_SET is not set # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set # CONFIG_NF_REJECT_IPV4 is not set CONFIG_IP_NF_IPTABLES=y # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set # CONFIG_IP_NF_FILTER is not set CONFIG_IP_NF_MANGLE=y # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_ARPTABLES is not set # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set # CONFIG_NF_REJECT_IPV6 is not set # CONFIG_NF_LOG_IPV6 is not set # CONFIG_IP6_NF_IPTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set # CONFIG_BRIDGE is not set CONFIG_HAVE_NET_DSA=y # CONFIG_NET_DSA is not set # CONFIG_VLAN_8021Q is not set # CONFIG_DECNET is not set # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set # CONFIG_NET_SCHED is not set # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set # CONFIG_NET_L3_MASTER_DEV is not set # CONFIG_NET_NCSI is not set CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_XPS=y # CONFIG_CGROUP_NET_PRIO is not set # CONFIG_CGROUP_NET_CLASSID is not set CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_JIT is not set CONFIG_ETHTOOL=y CONFIG_FILTER=y CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # CONFIG_HAMRADIO is not set CONFIG_CAN=y CONFIG_CAN_ROCKCHIP=y CONFIG_CANFD_ROCKCHIP=y CONFIG_BT=y CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=y # CONFIG_BT_RFCOMM_TTY is not set # CONFIG_BT_BNEP is not set CONFIG_BT_HIDP=y CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_LEDS is not set # CONFIG_BT_SELFTEST is not set CONFIG_BT_DEBUGFS=y # # Bluetooth device drivers # CONFIG_BT_INTEL=y CONFIG_BT_BCM=y CONFIG_BT_RTL=y CONFIG_BT_HCIBTUSB=y # CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set CONFIG_BT_HCIBTUSB_BCM=y CONFIG_BT_HCIBTUSB_RTL=y # CONFIG_BT_HCIBTSDIO is not set CONFIG_BT_HCIUART=y CONFIG_BT_HCIUART_H4=y # CONFIG_BT_HCIUART_BCSP is not set CONFIG_BT_HCIUART_ATH3K=y # CONFIG_BT_HCIUART_INTEL is not set # CONFIG_BT_HCIUART_AG6XX is not set # CONFIG_BT_HCIUART_MRVL is not set # CONFIG_BT_HCIBCM203X is not set # CONFIG_BT_HCIBPA10X is not set CONFIG_BT_HCIBFUSB=y CONFIG_BT_HCIVHCI=y CONFIG_BT_MRVL=y CONFIG_BT_MRVL_SDIO=y # CONFIG_BT_ATH3K is not set # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=y CONFIG_NL80211_TESTMODE=y # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y CONFIG_CFG80211_DEFAULT_PS=y CONFIG_CFG80211_DEBUGFS=y CONFIG_CFG80211_CRDA_SUPPORT=y CONFIG_CFG80211_WEXT=y CONFIG_MAC80211=y CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_MINSTREL_HT=y # CONFIG_MAC80211_RC_MINSTREL_VHT is not set CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y CONFIG_MAC80211_DEBUGFS=y # CONFIG_MAC80211_MESSAGE_TRACING is not set CONFIG_MAC80211_DEBUG_MENU=y # CONFIG_MAC80211_NOINLINE is not set CONFIG_MAC80211_VERBOSE_DEBUG=y # CONFIG_MAC80211_MLME_DEBUG is not set # CONFIG_MAC80211_STA_DEBUG is not set # CONFIG_MAC80211_HT_DEBUG is not set # CONFIG_MAC80211_OCB_DEBUG is not set # CONFIG_MAC80211_IBSS_DEBUG is not set # CONFIG_MAC80211_PS_DEBUG is not set # CONFIG_MAC80211_TDLS_DEBUG is not set # CONFIG_MAC80211_DEBUG_COUNTERS is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 # CONFIG_WIMAX is not set CONFIG_RFKILL=y CONFIG_RFKILL_LEDS=y # CONFIG_RFKILL_INPUT is not set # CONFIG_RFKILL_GPIO is not set CONFIG_RFKILL_RK=y # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set 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 # # Device Drivers # CONFIG_ARM_AMBA=y # # Generic Driver Options # CONFIG_UEVENT_HELPER=y CONFIG_UEVENT_HELPER_PATH="" CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set CONFIG_FW_CACHE=y CONFIG_WANT_DEV_COREDUMP=y CONFIG_ALLOW_DEV_COREDUMP=y CONFIG_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set CONFIG_DEBUG_DEVRES=y # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y # CONFIG_MALI_MEMORY_GROUP_MANAGER is not set 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=16 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 # # Bus devices # # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_SIMPLE_PM_BUS is not set # CONFIG_VEXPRESS_CONFIG is not set CONFIG_CONNECTOR=y CONFIG_PROC_EVENTS=y # CONFIG_GNSS is not set CONFIG_MTD=y # CONFIG_MTD_TESTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set CONFIG_MTD_CMDLINE_PARTS=y # CONFIG_MTD_AFS_PARTS is not set CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AR7_PARTS is not set # # Partition parsers # # # User Modules And Translation Layers # CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # CONFIG_RFD_FTL is not set # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set # CONFIG_MTD_OOPS is not set # CONFIG_MTD_SWAP is not set # CONFIG_MTD_PARTITIONED_MASTER is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_INTEL_VR_NOR is not set # CONFIG_MTD_PLATRAM is not set # # Self-contained MTD device drivers # # CONFIG_MTD_PMC551 is not set # CONFIG_MTD_DATAFLASH is not set # CONFIG_MTD_MCHP23K256 is not set # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLOCK2MTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOCG3 is not set # CONFIG_MTD_ONENAND is not set # CONFIG_MTD_NAND is not set # CONFIG_MTD_SPI_NAND is not set # # LPDDR & LPDDR2 PCM memory drivers # # CONFIG_MTD_LPDDR is not set # CONFIG_MTD_SPI_NOR is not set CONFIG_MTD_UBI=y CONFIG_MTD_UBI_WL_THRESHOLD=4096 CONFIG_MTD_UBI_BEB_LIMIT=20 # CONFIG_MTD_UBI_FASTMAP is not set # CONFIG_MTD_UBI_GLUEBI is not set # CONFIG_MTD_UBI_BLOCK is not set CONFIG_DTC=y CONFIG_OF=y CONFIG_DTC_SYMBOLS=y # CONFIG_DTC_OMIT_DISABLED is not set # CONFIG_DTC_OMIT_EMPTY is not set # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_NET=y CONFIG_OF_MDIO=y CONFIG_OF_RESERVED_MEM=y # CONFIG_OF_OVERLAY is not set # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set CONFIG_ZRAM=y # CONFIG_ZRAM_WRITEBACK is not set # CONFIG_ZRAM_MEMORY_TRACKING is not set # CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_SKD is not set # CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=1 CONFIG_BLK_DEV_RAM_SIZE=4096 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_RSXX is not set # # NVME Support # CONFIG_NVME_CORE=y CONFIG_BLK_DEV_NVME=y # CONFIG_NVME_MULTIPATH is not set # CONFIG_NVME_FC is not set # CONFIG_NVME_TARGET is not set # # Misc devices # # CONFIG_ROCKCHIP_SCR is not set # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_PHANTOM is not set # CONFIG_SGI_IOC4 is not set # CONFIG_TIFM_CORE is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HP_ILO is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_USB_SWITCH_FSA9480 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set CONFIG_SRAM=y # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_PIR_ASCHIP is not set # CONFIG_RK803 is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set # CONFIG_EEPROM_93CX6 is not set # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_CB710_CORE is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # # Intel MIC & related support # # # Intel MIC Bus Driver # # # SCIF Bus Driver # # # VOP Bus Driver # # # Intel MIC Host Driver # # # Intel MIC Card Driver # # # SCIF Driver # # # Intel MIC Coprocessor State Management (COSM) Drivers # # # VOP Driver # # CONFIG_GENWQE is not set # CONFIG_ECHO is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI=y CONFIG_SCSI_DMA=y CONFIG_SCSI_MQ_DEFAULT=y CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set # CONFIG_CHR_DEV_OSST is not set CONFIG_BLK_DEV_SR=y # CONFIG_CHR_DEV_SG is not set # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set CONFIG_SCSI_SCAN_ASYNC=y # # SCSI Transports # CONFIG_SCSI_SPI_ATTRS=y # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_CXGB3_ISCSI is not set # CONFIG_SCSI_CXGB4_ISCSI is not set # CONFIG_SCSI_BNX2_ISCSI is not set # CONFIG_BE2ISCSI is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_HPSA is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_3W_SAS is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_HISI_SAS is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set # CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set # CONFIG_SCSI_SMARTPQI is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_STEX is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_IPR is not set # CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLA_ISCSI is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_AM53C974 is not set # CONFIG_SCSI_WD719X is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_PMCRAID is not set # CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_LOWLEVEL_PCMCIA 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 CONFIG_SATA_PMP=y # # Controllers with non-SFF native interface # CONFIG_SATA_AHCI=y CONFIG_SATA_MOBILE_LPM_POLICY=0 CONFIG_SATA_AHCI_PLATFORM=y # CONFIG_AHCI_CEVA is not set # CONFIG_AHCI_QORIQ is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set # CONFIG_ATA_SFF is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set # CONFIG_BLK_DEV_DM is not set # CONFIG_TARGET_CORE is not set # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # # CONFIG_FIREWIRE is not set # CONFIG_FIREWIRE_NOSY is not set CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set # CONFIG_WIREGUARD is not set # CONFIG_EQUALIZER is not set # CONFIG_NET_FC is not set # CONFIG_NET_TEAM is not set # CONFIG_MACVLAN is not set # CONFIG_IPVLAN is not set # CONFIG_VXLAN is not set # CONFIG_GENEVE is not set # CONFIG_GTP is not set # CONFIG_MACSEC is not set # CONFIG_NETCONSOLE is not set # CONFIG_TUN is not set # CONFIG_TUN_VNET_CROSS_LE is not set # CONFIG_VETH is not set # CONFIG_NLMON is not set # CONFIG_ARCNET is not set # # CAIF transport drivers # # # Distributed Switch Architecture drivers # CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set # CONFIG_NET_VENDOR_AGERE is not set CONFIG_NET_VENDOR_ALACRITECH=y # CONFIG_SLICOSS is not set # CONFIG_NET_VENDOR_ALTEON is not set # CONFIG_ALTERA_TSE is not set CONFIG_NET_VENDOR_AMAZON=y # CONFIG_ENA_ETHERNET is not set # CONFIG_NET_VENDOR_AMD is not set CONFIG_NET_VENDOR_AQUANTIA=y # CONFIG_NET_VENDOR_ARC is not set # CONFIG_NET_VENDOR_ATHEROS is not set CONFIG_NET_VENDOR_AURORA=y # CONFIG_AURORA_NB8800 is not set # CONFIG_NET_VENDOR_BROADCOM is not set # CONFIG_NET_VENDOR_BROCADE is not set CONFIG_NET_VENDOR_CADENCE=y # CONFIG_MACB is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set CONFIG_NET_VENDOR_CORTINA=y # CONFIG_GEMINI_ETHERNET is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set # CONFIG_NET_VENDOR_EZCHIP is not set # CONFIG_NET_VENDOR_HISILICON is not set # CONFIG_NET_VENDOR_HP is not set CONFIG_NET_VENDOR_HUAWEI=y # CONFIG_HINIC is not set # CONFIG_NET_VENDOR_INTEL is not set # CONFIG_JME is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set CONFIG_NET_VENDOR_MICROSEMI=y # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set # CONFIG_NET_VENDOR_NATSEMI is not set CONFIG_NET_VENDOR_NETERION=y # CONFIG_S2IO is not set # CONFIG_VXGE is not set CONFIG_NET_VENDOR_NETRONOME=y # CONFIG_NFP is not set CONFIG_NET_VENDOR_NI=y # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set CONFIG_NET_VENDOR_PACKET_ENGINES=y # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_NET_VENDOR_QLOGIC is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_REALTEK is not set # CONFIG_NET_VENDOR_RENESAS is not set # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set CONFIG_NET_VENDOR_SOLARFLARE=y # CONFIG_SFC is not set # CONFIG_SFC_FALCON is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set # CONFIG_NET_VENDOR_SMSC is not set CONFIG_NET_VENDOR_SOCIONEXT=y CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=y CONFIG_STMMAC_ETHTOOL=y CONFIG_STMMAC_FULL=y CONFIG_STMMAC_PTP=y CONFIG_STMMAC_PLATFORM=y # CONFIG_DWMAC_DWC_QOS_ETH is not set CONFIG_DWMAC_GENERIC=y CONFIG_DWMAC_ROCKCHIP=y CONFIG_DWMAC_ROCKCHIP_TOOL=y # CONFIG_STMMAC_PCI is not set # CONFIG_NET_VENDOR_SUN is not set # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MDIO_BITBANG is not set # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_OCTEON is not set # CONFIG_MDIO_THUNDER is not set CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_AQUANTIA_PHY is not set # CONFIG_AX88796B_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_BROADCOM_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_ICPLUS_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MICREL_PHY is not set # CONFIG_MICROCHIP_PHY is not set # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_QSEMI_PHY is not set CONFIG_REALTEK_PHY=y # CONFIG_RENESAS_PHY is not set # CONFIG_ROCKCHIP_PHY is not set # CONFIG_SMSC_PHY is not set # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set # CONFIG_PPP is not set # CONFIG_SLIP is not set CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set CONFIG_USB_RTL8150=m CONFIG_USB_RTL8152=m # CONFIG_USB_LAN78XX is not set CONFIG_USB_USBNET=y CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=y # CONFIG_USB_NET_CDC_EEM is not set CONFIG_USB_NET_CDC_NCM=y # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set CONFIG_USB_NET_CDC_MBIM=m # CONFIG_USB_NET_DM9601 is not set # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set # CONFIG_USB_NET_SMSC75XX is not set # CONFIG_USB_NET_SMSC95XX is not set # CONFIG_USB_NET_GL620A is not set # CONFIG_USB_NET_NET1080 is not set # CONFIG_USB_NET_PLUSB is not set # CONFIG_USB_NET_MCS7830 is not set CONFIG_USB_NET_RNDIS_HOST=y # CONFIG_USB_NET_CDC_SUBSET is not set # CONFIG_USB_NET_ZAURUS is not set # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set # CONFIG_USB_HSO is not set # CONFIG_USB_NET_INT51X1 is not set # CONFIG_USB_IPHETH is not set # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set CONFIG_WLAN=y # CONFIG_WIRELESS_WDS is not set # CONFIG_WLAN_VENDOR_ADMTEK is not set CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set # CONFIG_ATH5K is not set # CONFIG_ATH5K_PCI is not set # CONFIG_ATH9K is not set # CONFIG_ATH9K_HTC is not set # CONFIG_CARL9170 is not set # CONFIG_ATH6KL is not set # CONFIG_AR5523 is not set # CONFIG_WIL6210 is not set # CONFIG_ATH10K is not set # CONFIG_WCN36XX is not set CONFIG_WLAN_VENDOR_ATMEL=y # CONFIG_ATMEL is not set # CONFIG_AT76C50X_USB is not set CONFIG_WLAN_VENDOR_BROADCOM=y # CONFIG_B43 is not set # CONFIG_B43LEGACY is not set # CONFIG_BRCMSMAC is not set # CONFIG_BRCMFMAC is not set CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y # CONFIG_IPW2100 is not set # CONFIG_IPW2200 is not set # CONFIG_IWL4965 is not set # CONFIG_IWL3945 is not set # CONFIG_IWLWIFI is not set CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_HOSTAP is not set # CONFIG_HERMES is not set # CONFIG_P54_COMMON is not set # CONFIG_PRISM54 is not set CONFIG_WLAN_VENDOR_MARVELL=y # CONFIG_LIBERTAS is not set CONFIG_LIBERTAS_THINFIRM=m # CONFIG_LIBERTAS_THINFIRM_DEBUG is not set # CONFIG_LIBERTAS_THINFIRM_USB is not set CONFIG_MWIFIEX=m CONFIG_MWIFIEX_SDIO=m # CONFIG_MWIFIEX_PCIE is not set # CONFIG_MWIFIEX_USB is not set # CONFIG_MWL8K is not set CONFIG_WLAN_VENDOR_MEDIATEK=y # CONFIG_MT7601U is not set # CONFIG_MT76x0U is not set # CONFIG_MT76x2E is not set # CONFIG_MT76x2U is not set CONFIG_WLAN_VENDOR_RALINK=y # CONFIG_RT2X00 is not set CONFIG_WLAN_VENDOR_REALTEK=y # CONFIG_RTL8180 is not set # CONFIG_RTL8187 is not set CONFIG_RTL_CARDS=m # CONFIG_RTL8192CE is not set # CONFIG_RTL8192SE is not set # CONFIG_RTL8192DE is not set # CONFIG_RTL8723AE is not set # CONFIG_RTL8723BE is not set # CONFIG_RTL8188EE is not set # CONFIG_RTL8192EE is not set # CONFIG_RTL8821AE is not set # CONFIG_RTL8192CU is not set # CONFIG_RTL8XXXU is not set CONFIG_WLAN_VENDOR_RSI=y # CONFIG_RSI_91X is not set CONFIG_WLAN_VENDOR_ST=y # CONFIG_CW1200 is not set CONFIG_WLAN_VENDOR_TI=y # CONFIG_WL1251 is not set # CONFIG_WL12XX is not set # CONFIG_WL18XX is not set # CONFIG_WLCORE is not set CONFIG_WLAN_VENDOR_ZYDAS=y # CONFIG_USB_ZD1201 is not set # CONFIG_ZD1211RW is not set CONFIG_WLAN_VENDOR_QUANTENNA=y # CONFIG_QTNFMAC_PEARL_PCIE is not set CONFIG_WL_ROCKCHIP=m CONFIG_WIFI_BUILD_MODULE=y CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP=y # CONFIG_WIFI_GENERATE_RANDOM_MAC_ADDR is not set CONFIG_BCMDHD=y CONFIG_AP6XXX=m # CONFIG_AP6XXX_WIFI6 is not set # CONFIG_AP6XXX_INDEP_POWER is not set CONFIG_BCMDHD_FW_PATH="/vendor/etc/firmware/fw_bcmdhd.bin" CONFIG_BCMDHD_NVRAM_PATH="/vendor/etc/firmware/nvram.txt" # CONFIG_BCMDHD_STATIC_IF is not set CONFIG_RTL_WIRELESS_SOLUTION=y # CONFIG_RTL8188EU is not set # CONFIG_RTL8188FU is not set # CONFIG_RTL8189FS is not set # CONFIG_RTL8723CS is not set # CONFIG_RTL8723DS is not set # CONFIG_RTL8821CS is not set # CONFIG_RTL8822BS is not set # CONFIG_MVL88W8977 is not set # CONFIG_CYW_BCMDHD is not set # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set # CONFIG_VMXNET3 is not set # CONFIG_LTE is not set # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set # CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y CONFIG_INPUT_POLLDEV=y # CONFIG_INPUT_SPARSEKMAP is not set CONFIG_INPUT_MATRIXKMAP=y # # Userland interfaces # # CONFIG_INPUT_MOUSEDEV is not set # CONFIG_INPUT_JOYDEV is not set CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_ADC=y # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set # CONFIG_KEYBOARD_ATKBD is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=y CONFIG_KEYBOARD_GPIO_POLLED=y # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # 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=y # CONFIG_MOUSE_PS2 is not set # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set CONFIG_MOUSE_CYAPA=y CONFIG_MOUSE_ELAN_I2C=y CONFIG_MOUSE_ELAN_I2C_I2C=y # CONFIG_MOUSE_ELAN_I2C_SMBUS is not set # CONFIG_MOUSE_VSXXXAA is not set # CONFIG_MOUSE_GPIO is not set # CONFIG_MOUSE_SYNAPTICS_I2C is not set # CONFIG_MOUSE_SYNAPTICS_USB is not set CONFIG_INPUT_JOYSTICK=y CONFIG_JOYSTICK_ANALOG=m CONFIG_JOYSTICK_A3D=m CONFIG_JOYSTICK_ADI=m CONFIG_JOYSTICK_COBRA=m CONFIG_JOYSTICK_GF2K=m CONFIG_JOYSTICK_GRIP=m CONFIG_JOYSTICK_GRIP_MP=m CONFIG_JOYSTICK_GUILLEMOT=m CONFIG_JOYSTICK_INTERACT=m CONFIG_JOYSTICK_SIDEWINDER=m CONFIG_JOYSTICK_TMDC=m CONFIG_JOYSTICK_IFORCE=m CONFIG_JOYSTICK_IFORCE_USB=y # CONFIG_JOYSTICK_IFORCE_232 is not set CONFIG_JOYSTICK_WARRIOR=m CONFIG_JOYSTICK_MAGELLAN=m CONFIG_JOYSTICK_SPACEORB=m CONFIG_JOYSTICK_SPACEBALL=m CONFIG_JOYSTICK_STINGER=m CONFIG_JOYSTICK_TWIDJOY=m CONFIG_JOYSTICK_ZHENHUA=m CONFIG_JOYSTICK_AS5011=m CONFIG_JOYSTICK_JOYDUMP=m CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y # CONFIG_JOYSTICK_ADC is not set # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_PROPERTIES=y CONFIG_TOUCHSCREEN_ADS7846=m # CONFIG_TOUCHSCREEN_AD7877 is not set # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_ADC is not set # CONFIG_TOUCHSCREEN_AR1021_I2C is not set CONFIG_TOUCHSCREEN_ATMEL_MXT=y # CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_BU21029 is not set # CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set # CONFIG_TOUCHSCREEN_CY8C40XX is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set # CONFIG_TOUCHSCREEN_EGALAX is not set # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set # CONFIG_TOUCHSCREEN_EXC3000 is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set CONFIG_TOUCHSCREEN_GOODIX=y # CONFIG_TOUCHSCREEN_GSLX6801 is not set # CONFIG_TOUCHSCREEN_GSLX680A is not set # CONFIG_TOUCHSCREEN_GSLX680_D708 is not set # CONFIG_TOUCHSCREEN_GSLX680_PAD is not set CONFIG_TOUCHSCREEN_GSLX680_VR=y # CONFIG_TOUCHSCREEN_GSLX680_FIREFLY is not set CONFIG_TOUCHSCREEN_GSL3673=y # CONFIG_TOUCHSCREEN_GSL3673_800X1280 is not set # CONFIG_TOUCHSCREEN_GSL3676 is not set CONFIG_TOUCHSCREEN_GT9XX=y # CONFIG_TOUCHSCREEN_HIDEEP is not set # CONFIG_TOUCHSCREEN_HYN_CST2XX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_S6SY761 is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set CONFIG_TOUCHSCREEN_ELAN=y # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set CONFIG_TOUCHSCREEN_WACOM_W9013=y # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set # CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set CONFIG_TOUCHSCREEN_USB_COMPOSITE=y CONFIG_TOUCHSCREEN_USB_EGALAX=y CONFIG_TOUCHSCREEN_USB_PANJIT=y CONFIG_TOUCHSCREEN_USB_3M=y CONFIG_TOUCHSCREEN_USB_ITM=y CONFIG_TOUCHSCREEN_USB_ETURBO=y CONFIG_TOUCHSCREEN_USB_GUNZE=y CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y CONFIG_TOUCHSCREEN_USB_IRTOUCH=y CONFIG_TOUCHSCREEN_USB_IDEALTEK=y CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y CONFIG_TOUCHSCREEN_USB_GOTOP=y CONFIG_TOUCHSCREEN_USB_JASTEC=y CONFIG_TOUCHSCREEN_USB_ELO=y CONFIG_TOUCHSCREEN_USB_E2I=y CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y CONFIG_TOUCHSCREEN_USB_NEXIO=y CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2004 is not set # CONFIG_TOUCHSCREEN_TSC2005 is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_RM_TS is not set # CONFIG_TOUCHSCREEN_SILEAD is not set # CONFIG_TOUCHSCREEN_SIS_I2C is not set # CONFIG_TOUCHSCREEN_ST1232 is not set # CONFIG_TOUCHSCREEN_STMFTS is not set # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set # CONFIG_TOUCHSCREEN_SX8654 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZET6223 is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_VTL_CT36X is not set CONFIG_TOUCHSCREEN_GT1X=y # CONFIG_TOUCHSCREEN_FTS is not set # CONFIG_TOUCHSCREEN_FT5436 is not set CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5=y CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEVICETREE_SUPPORT=y CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_I2C=y # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_SPI is not set # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_MT_A is not set CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_MT_B=y # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_BUTTON is not set # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_PROXIMITY is not set CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEVICE_ACCESS=y # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEVICE_ACCESS_API is not set CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_LOADER=y # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_PLATFORM_FW_UPGRADE is not set # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_BINARY_FW_UPGRADE is not set # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_PLATFORM_TTCONFIG_UPGRADE is not set # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_MANUAL_TTCONFIG_UPGRADE is not set # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEBUG_MDL is not set CONFIG_TOUCHSCREEN_DWAV_USB_MT=m CONFIG_ROCKCHIP_REMOTECTL=y CONFIG_ROCKCHIP_REMOTECTL_PWM=y # # handle all sensors # # CONFIG_SENSOR_DEVICE is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GP2A is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set CONFIG_INPUT_RK805_PWRKEY=y # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_SOC_BUTTON_ARRAY is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_RMI4_CORE is not set # # Hardware I/O ports # # CONFIG_SERIO is not set # CONFIG_GAMEPORT is not set # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_NOZOMI is not set # CONFIG_N_GSM is not set # CONFIG_TRACE_SINK is not set CONFIG_LDISC_AUTOLOAD=y CONFIG_DEVMEM=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_DMA=y # CONFIG_SERIAL_8250_PCI is not set CONFIG_SERIAL_8250_NR_UARTS=10 CONFIG_SERIAL_8250_RUNTIME_UARTS=10 # CONFIG_SERIAL_8250_EXTENDED is not set # CONFIG_SERIAL_8250_ASPEED_VUART is not set CONFIG_SERIAL_8250_FSL=y CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_MOXA is not set CONFIG_SERIAL_OF_PLATFORM=y # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set # CONFIG_SERIAL_AMBA_PL011 is not set # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_MSM_GENI_HALF_SAMPLING is not set # CONFIG_SERIAL_MSM_GENI_EARLY_CONSOLE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_IFX6X60 is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_RP2 is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_DEV_BUS is not set # CONFIG_TTY_PRINTK is not set # CONFIG_HVC_DCC is not set # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set CONFIG_HW_RANDOM_CAVIUM=y CONFIG_HW_RANDOM_ROCKCHIP=y # CONFIG_APPLICOM is not set # # PCMCIA character devices # # CONFIG_RAW_DRIVER is not set CONFIG_TCG_TPM=y CONFIG_HW_RANDOM_TPM=y # CONFIG_TCG_TIS is not set # CONFIG_TCG_TIS_SPI is not set # CONFIG_TCG_TIS_I2C_ATMEL is not set CONFIG_TCG_TIS_I2C_INFINEON=y # CONFIG_TCG_TIS_I2C_NUVOTON is not set # CONFIG_TCG_ATMEL is not set # CONFIG_TCG_VTPM_PROXY is not set # CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TCG_TIS_ST33ZP24_SPI is not set CONFIG_DEVPORT=y # CONFIG_XILLYBUS is not set # CONFIG_RANDOM_TRUST_BOOTLOADER is not set # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_GPMUX is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set # CONFIG_I2C_MUX_PINCTRL is not set # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_DEMUX_PINCTRL is not set # CONFIG_I2C_MUX_MLXCPLD is not set CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # PC SMBus host controller drivers # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_ISCH is not set # CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CADENCE is not set # CONFIG_I2C_CBUS_GPIO is not set # CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_DESIGNWARE_PCI is not set # CONFIG_I2C_EMEV2 is not set # CONFIG_I2C_GPIO is not set # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set CONFIG_I2C_RK3X=y # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_THUNDERX is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # CONFIG_I2C_CROS_EC_TUNNEL=y # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y # CONFIG_SPI_MEM is not set # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set CONFIG_SPI_BITBANG=y # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_DESIGNWARE 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 is not set # CONFIG_SPI_PXA2XX is not set CONFIG_SPI_ROCKCHIP=y # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_THUNDERX is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=y # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set # CONFIG_SPMI is not set # CONFIG_HSI is not set CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # CONFIG_PINCTRL=y CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_AMD is not set # CONFIG_PINCTRL_MCP23S08 is not set CONFIG_PINCTRL_ROCKCHIP=y # CONFIG_PINCTRL_SINGLE is not set # CONFIG_PINCTRL_SX150X is not set CONFIG_PINCTRL_RK805=y CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y CONFIG_GPIO_GENERIC=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_DWAPB is not set # CONFIG_GPIO_FTGPIO010 is not set CONFIG_GPIO_GENERIC_PLATFORM=y # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HLWD is not set # CONFIG_GPIO_MB86S7X is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_PL061 is not set CONFIG_GPIO_ROCKCHIP=y # CONFIG_GPIO_SYSCON is not set # CONFIG_GPIO_XGENE is not set # CONFIG_GPIO_XILINX is not set # # I2C GPIO expanders # # CONFIG_GPIO_ADP5588 is not set # CONFIG_GPIO_ADNP is not set # CONFIG_GPIO_MAX7300 is not set # CONFIG_GPIO_MAX732X is not set # CONFIG_GPIO_PCA953X is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # # MFD GPIO expanders # # CONFIG_GPIO_TPS6586X is not set # # PCI GPIO expanders # # CONFIG_GPIO_BT8XX is not set # CONFIG_GPIO_PCI_IDIO_16 is not set # CONFIG_GPIO_PCIE_IDIO_24 is not set # CONFIG_GPIO_RDC321X is not set # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # # USB GPIO expanders # # CONFIG_W1 is not set CONFIG_POWER_AVS=y CONFIG_ROCKCHIP_IODOMAIN=y CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_BRCMSTB is not set CONFIG_POWER_RESET_GPIO=y CONFIG_POWER_RESET_GPIO_RESTART=y # CONFIG_POWER_RESET_LTC2952 is not set # CONFIG_POWER_RESET_RESTART is not set # CONFIG_POWER_RESET_XGENE is not set # CONFIG_POWER_RESET_SYSCON is not set # CONFIG_POWER_RESET_SYSCON_POWEROFF is not set CONFIG_REBOOT_MODE=y CONFIG_SYSCON_REBOOT_MODE=y CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_LEGO_EV3 is not set CONFIG_BATTERY_SBS=y # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set CONFIG_CHARGER_GPIO=y # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LTC3651 is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set CONFIG_CHARGER_BQ24735=y # CONFIG_CHARGER_BQ25700 is not set # CONFIG_CHARGER_BQ25890 is not set # 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_BATTERY_CW2015 is not set # CONFIG_BATTERY_RK816 is not set CONFIG_BATTERY_RK817=y CONFIG_CHARGER_RK817=y # CONFIG_BATTERY_RK818 is not set # CONFIG_CHARGER_RK818 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_ARM_SCMI is not set # CONFIG_SENSORS_ASPEED is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_I5K_AMB is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_GPIO_FAN is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IIO_HWMON is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set CONFIG_SENSORS_PWM_FAN=m # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS1015 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_VT8231 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y CONFIG_THERMAL_WRITABLE_TRIPS=y CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set CONFIG_THERMAL_GOV_FAIR_SHARE=y CONFIG_THERMAL_GOV_STEP_WISE=y CONFIG_THERMAL_GOV_BANG_BANG=y CONFIG_THERMAL_GOV_USER_SPACE=y CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y CONFIG_CPU_THERMAL=y CONFIG_CLOCK_THERMAL=y CONFIG_DEVFREQ_THERMAL=y # CONFIG_THERMAL_EMULATION is not set # CONFIG_QORIQ_THERMAL is not set CONFIG_ROCKCHIP_THERMAL=y # CONFIG_RK_VIRTUAL_THERMAL is not set # CONFIG_RK3368_THERMAL is not set # # ACPI INT340X thermal drivers # # CONFIG_GENERIC_ADC_THERMAL is not set CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y # CONFIG_WATCHDOG_SYSFS is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_ARM_SBSA_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set CONFIG_DW_WATCHDOG=y # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_ALIM7101_WDT is not set # CONFIG_I6300ESB_WDT is not set # CONFIG_MEN_A21_WDT is not set # # PCI-based Watchdog Cards # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set CONFIG_SSB_POSSIBLE=y # CONFIG_SSB is not set CONFIG_BCMA_POSSIBLE=y # CONFIG_BCMA is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set CONFIG_MFD_CROS_EC=y # CONFIG_MFD_CROS_EC_CHARDEV is not set # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77620 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_CPCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RC5T583 is not set CONFIG_MFD_RK618=y # CONFIG_MFD_RK628 is not set # CONFIG_MFD_RK630 is not set # CONFIG_MFD_RK630_I2C is not set # CONFIG_MFD_RK630_SPI is not set CONFIG_MFD_RK808=y # CONFIG_MFD_RK1000 is not set # CONFIG_MFD_RN5T618 is not set # CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_SMSC is not set # CONFIG_ABX500_CORE is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set CONFIG_MFD_TPS6586X=y # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_MFD_TPS80031 is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TC3589X is not set # CONFIG_MFD_VX855 is not set # CONFIG_MFD_ARIZONA_I2C is not set # CONFIG_MFD_ARIZONA_SPI is not set # CONFIG_MFD_WM8400 is not set # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ROHM_BD718XX is not set CONFIG_FUSB_30X=y CONFIG_REGULATOR=y CONFIG_REGULATOR_DEBUG=y CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_PROXY_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set CONFIG_REGULATOR_ACT8865=y # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_ANATOP is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set CONFIG_REGULATOR_FAN53555=y CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set CONFIG_REGULATOR_LP8752=y # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set CONFIG_REGULATOR_MP8865=y # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set CONFIG_REGULATOR_PWM=y CONFIG_REGULATOR_RK808=y # CONFIG_REGULATOR_SY8106A is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS549B22 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set CONFIG_REGULATOR_TPS65132=y # CONFIG_REGULATOR_TPS6524X is not set CONFIG_REGULATOR_TPS6586X=y # CONFIG_REGULATOR_VCTRL is not set CONFIG_REGULATOR_XZ3216=y # CONFIG_REGULATOR_DIO5632 is not set CONFIG_CEC_CORE=y CONFIG_CEC_NOTIFIER=y # CONFIG_RC_CORE is not set CONFIG_MEDIA_SUPPORT=y # # Multimedia core support # CONFIG_MEDIA_CAMERA_SUPPORT=y # CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set # CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set # CONFIG_MEDIA_RADIO_SUPPORT is not set # CONFIG_MEDIA_SDR_SUPPORT is not set CONFIG_MEDIA_CEC_SUPPORT=y CONFIG_MEDIA_CONTROLLER=y CONFIG_VIDEO_DEV=y CONFIG_VIDEO_V4L2_SUBDEV_API=y CONFIG_VIDEO_V4L2=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set # CONFIG_VIDEO_PCI_SKELETON is not set CONFIG_V4L2_MEM2MEM_DEV=y CONFIG_V4L2_FWNODE=y # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # CONFIG_USB_VIDEO_CLASS=y # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_VIDEO_CPIA2 is not set # CONFIG_USB_ZR364XX is not set # CONFIG_USB_STKWEBCAM is not set # CONFIG_USB_S2255 is not set # CONFIG_VIDEO_USBTV is not set # # Webcam, TV (analog/digital) USB devices # # CONFIG_VIDEO_EM28XX is not set # # USB HDMI CEC adapters # # CONFIG_USB_PULSE8_CEC is not set # CONFIG_USB_RAINSHADOW_CEC is not set # CONFIG_MEDIA_PCI_SUPPORT is not set CONFIG_V4L_PLATFORM_DRIVERS=y # CONFIG_VIDEO_CAFE_CCIC is not set # CONFIG_VIDEO_CADENCE is not set # CONFIG_VIDEO_MUX is not set CONFIG_SOC_CAMERA=y # CONFIG_SOC_CAMERA_PLATFORM is not set # CONFIG_VIDEO_XILINX is not set # CONFIG_VIDEO_ROCKCHIP_CIF is not set CONFIG_VIDEO_ROCKCHIP_ISP1=y CONFIG_VIDEO_ROCKCHIP_ISP=m # CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V1X is not set # CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V20 is not set CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V21=y # CONFIG_VIDEO_ROCKCHIP_ISPP is not set CONFIG_V4L_MEM2MEM_DRIVERS=y # CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set # CONFIG_VIDEO_SH_VEU is not set CONFIG_VIDEO_ROCKCHIP_RGA=y # CONFIG_V4L_TEST_DRIVERS is not set # CONFIG_CEC_PLATFORM_DRIVERS is not set # # Supported MMC/SDIO adapters # # CONFIG_CYPRESS_FIRMWARE is not set CONFIG_VIDEOBUF2_CORE=y CONFIG_VIDEOBUF2_V4L2=y CONFIG_VIDEOBUF2_MEMOPS=y CONFIG_VIDEOBUF2_DMA_CONTIG=y CONFIG_VIDEOBUF2_VMALLOC=y CONFIG_VIDEOBUF2_DMA_SG=y # # Media ancillary drivers (tuners, sensors, i2c, spi, frontends) # # CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set # # I2C Encoders, decoders, sensors and other helper chips # # # Audio decoders, processors and mixers # # CONFIG_VIDEO_TVAUDIO is not set # CONFIG_VIDEO_TDA7432 is not set # CONFIG_VIDEO_TDA9840 is not set # CONFIG_VIDEO_TDA1997X is not set # CONFIG_VIDEO_TEA6415C is not set # CONFIG_VIDEO_TEA6420 is not set # CONFIG_VIDEO_MSP3400 is not set # CONFIG_VIDEO_CS3308 is not set # CONFIG_VIDEO_CS5345 is not set # CONFIG_VIDEO_CS53L32A is not set # CONFIG_VIDEO_TLV320AIC23B is not set # CONFIG_VIDEO_UDA1342 is not set # CONFIG_VIDEO_WM8775 is not set # CONFIG_VIDEO_WM8739 is not set # CONFIG_VIDEO_VP27SMPX is not set # CONFIG_VIDEO_SONY_BTF_MPX is not set # # RDS decoders # # CONFIG_VIDEO_SAA6588 is not set # # Video decoders # # CONFIG_VIDEO_ADV7180 is not set # CONFIG_VIDEO_ADV7183 is not set # CONFIG_VIDEO_ADV748X is not set # CONFIG_VIDEO_ADV7604 is not set # CONFIG_VIDEO_ADV7842 is not set # CONFIG_VIDEO_BT819 is not set # CONFIG_VIDEO_BT856 is not set # CONFIG_VIDEO_BT866 is not set # CONFIG_VIDEO_KS0127 is not set # CONFIG_VIDEO_ML86V7667 is not set # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9718 is not set # CONFIG_VIDEO_DW9807_VCM is not set # CONFIG_VIDEO_FP5501 is not set # CONFIG_VIDEO_FP5510 is not set # CONFIG_VIDEO_GT9760S is not set # CONFIG_VIDEO_VM149C is not set # CONFIG_VIDEO_SAA7110 is not set # CONFIG_VIDEO_SAA711X is not set # CONFIG_VIDEO_TC358743 is not set CONFIG_VIDEO_TC35874X=y CONFIG_VIDEO_RK628_CSI=y # CONFIG_VIDEO_LT6911UXC is not set # CONFIG_VIDEO_LT8619C is not set # CONFIG_VIDEO_TECHPOINT is not set # CONFIG_VIDEO_TVP514X is not set # CONFIG_VIDEO_TVP5150 is not set # CONFIG_VIDEO_TVP7002 is not set # CONFIG_VIDEO_TW2804 is not set # CONFIG_VIDEO_TW9903 is not set # CONFIG_VIDEO_TW9906 is not set # CONFIG_VIDEO_TW9910 is not set # CONFIG_VIDEO_VPX3220 is not set # # Video and audio decoders # # CONFIG_VIDEO_SAA717X is not set # CONFIG_VIDEO_CX25840 is not set # # Video encoders # # CONFIG_VIDEO_SAA7127 is not set # CONFIG_VIDEO_SAA7185 is not set # CONFIG_VIDEO_ADV7170 is not set # CONFIG_VIDEO_ADV7175 is not set # CONFIG_VIDEO_ADV7343 is not set # CONFIG_VIDEO_ADV7393 is not set # CONFIG_VIDEO_ADV7511 is not set # CONFIG_VIDEO_AD9389B is not set # CONFIG_VIDEO_AK881X is not set # CONFIG_VIDEO_THS8200 is not set # # Camera sensor devices # # CONFIG_VIDEO_IMX178 is not set CONFIG_VIDEO_IMX219=m # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX307 is not set # CONFIG_VIDEO_IMX317 is not set # CONFIG_VIDEO_IMX323 is not set # CONFIG_VIDEO_IMX327 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX347 is not set # CONFIG_VIDEO_IMX378 is not set # CONFIG_VIDEO_IMX415 is not set # CONFIG_VIDEO_IMX462 is not set # CONFIG_VIDEO_IMX464 is not set CONFIG_VIDEO_IMX477=m # CONFIG_VIDEO_OS02G10 is not set CONFIG_VIDEO_OS04A10=y # CONFIG_VIDEO_OS04C10 is not set # CONFIG_VIDEO_OS05A20 is not set # CONFIG_VIDEO_OS08A10 is not set # CONFIG_VIDEO_OS08A20 is not set # CONFIG_VIDEO_OV02B10 is not set # CONFIG_VIDEO_OV02K10 is not set # CONFIG_VIDEO_OV2640 is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV2718 is not set # CONFIG_VIDEO_OV2735 is not set # CONFIG_VIDEO_OV2775 is not set # CONFIG_VIDEO_OV4686 is not set # CONFIG_VIDEO_OV4688 is not set CONFIG_VIDEO_OV4689=y # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set CONFIG_VIDEO_OV5647=m # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set CONFIG_VIDEO_OV5695=y # CONFIG_VIDEO_OV6650 is not set CONFIG_VIDEO_OV7251=y # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7640 is not set # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV7750 is not set # CONFIG_VIDEO_OV8858 is not set # CONFIG_VIDEO_OV9281 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_OV9750 is not set # CONFIG_VIDEO_OV12D2Q is not set CONFIG_VIDEO_OV13850=y # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_PREISP_DUMMY_SENSOR is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set # CONFIG_VIDEO_MT9V011 is not set # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_AR0230 is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_M5MOLS is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5KGM1SP is not set # CONFIG_VIDEO_S5K4H7YX is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_SMIAPP is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_GC02M2 is not set # CONFIG_VIDEO_GC0312 is not set # CONFIG_VIDEO_GC0329 is not set # CONFIG_VIDEO_GC032A is not set # CONFIG_VIDEO_GC0403 is not set # CONFIG_VIDEO_GC2035 is not set # CONFIG_VIDEO_GC2053 is not set # CONFIG_VIDEO_GC2093 is not set # CONFIG_VIDEO_GC2145 is not set # CONFIG_VIDEO_GC2155 is not set # CONFIG_VIDEO_GC2355 is not set # CONFIG_VIDEO_GC2375H is not set # CONFIG_VIDEO_GC2385 is not set # CONFIG_VIDEO_GC4663 is not set # CONFIG_VIDEO_GC4C33 is not set # CONFIG_VIDEO_GC5024 is not set # CONFIG_VIDEO_GC5025 is not set # CONFIG_VIDEO_GC5035 is not set CONFIG_VIDEO_GC8034=y # CONFIG_VIDEO_BF3925 is not set # CONFIG_VIDEO_JX_F37 is not set # CONFIG_VIDEO_JX_H62 is not set # CONFIG_VIDEO_JX_H65 is not set # CONFIG_VIDEO_JX_K04 is not set # CONFIG_VIDEO_SC031GS is not set # CONFIG_VIDEO_SC035HGS is not set # CONFIG_VIDEO_SC132GS is not set # CONFIG_VIDEO_SC200AI is not set # CONFIG_VIDEO_SC210IOT is not set # CONFIG_VIDEO_SC2232 is not set # CONFIG_VIDEO_SC2239 is not set # CONFIG_VIDEO_SC2310 is not set # CONFIG_VIDEO_SC2335 is not set # CONFIG_VIDEO_SC401AI is not set # CONFIG_VIDEO_SC4238 is not set # CONFIG_VIDEO_SC430CS is not set # CONFIG_VIDEO_SC500AI is not set # CONFIG_VIDEO_SC5239 is not set # CONFIG_VIDEO_SC8220 is not set # CONFIG_VIDEO_SP250A is not set # CONFIG_VIDEO_HYNIX_HI556 is not set # CONFIG_VIDEO_HYNIX_HI846 is not set # CONFIG_VIDEO_HM5040 is not set # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # CONFIG_VIDEO_SGM3784 is not set # # Video improvement chips # # CONFIG_VIDEO_UPD64031A is not set # CONFIG_VIDEO_UPD64083 is not set # # Audio/Video compression chips # # CONFIG_VIDEO_SAA6752HS is not set # # SDR tuner chips # # # Miscellaneous helper chips # # CONFIG_VIDEO_THS7303 is not set # CONFIG_VIDEO_M52790 is not set # CONFIG_VIDEO_I2C is not set # CONFIG_VIDEO_NVP6158 is not set # CONFIG_VIDEO_NVP6188 is not set # CONFIG_VIDEO_NVP6324 is not set # CONFIG_VIDEO_HALL_DC_MOTOR is not set # CONFIG_VIDEO_RK_IRCUT is not set # CONFIG_VIDEO_MP6507 is not set # # Sensors used on soc_camera driver # # # soc_camera sensor drivers # # CONFIG_SOC_CAMERA_MT9M001 is not set # CONFIG_SOC_CAMERA_MT9M111 is not set # CONFIG_SOC_CAMERA_MT9T112 is not set # CONFIG_SOC_CAMERA_MT9V022 is not set # CONFIG_SOC_CAMERA_OV5642 is not set # CONFIG_SOC_CAMERA_OV772X is not set # CONFIG_SOC_CAMERA_OV9640 is not set # CONFIG_SOC_CAMERA_OV9740 is not set # CONFIG_SOC_CAMERA_RJ54N1 is not set # CONFIG_SOC_CAMERA_TW9910 is not set # # SPI helper chips # # CONFIG_VIDEO_GS1662 is not set # CONFIG_VIDEO_MS41908 is not set # CONFIG_VIDEO_ROCKCHIP_PREISP is not set # # Media SPI Adapters # # # Customise DVB Frontends # # # Tools to develop new frontends # # # Graphics support # # CONFIG_VGA_ARB is not set CONFIG_DRM=y CONFIG_DRM_DP=y CONFIG_DRM_EDID=y CONFIG_DRM_IGNORE_IOTCL_PERMIT=y CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DEBUG_MM is not set # CONFIG_DRM_DEBUG_SELFTEST is not set CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_KMS_FB_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set CONFIG_DRM_LOAD_EDID_FIRMWARE=y # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_GEM_CMA_HELPER=y # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_RADEON is not set # CONFIG_DRM_AMDGPU is not set # # ACP (Audio CoProcessor) Configuration # # # AMD Library routines # # CONFIG_DRM_NOUVEAU is not set # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set CONFIG_DRM_ROCKCHIP=y # CONFIG_ROCKCHIP_DRM_DEBUG is not set CONFIG_ROCKCHIP_VOP=y CONFIG_ROCKCHIP_VOP2=y CONFIG_ROCKCHIP_PSR=y CONFIG_ROCKCHIP_ANALOGIX_DP=y CONFIG_ROCKCHIP_CDN_DP=y CONFIG_ROCKCHIP_DW_HDMI=y CONFIG_ROCKCHIP_DW_MIPI_DSI=y CONFIG_ROCKCHIP_INNO_HDMI=y CONFIG_ROCKCHIP_LVDS=y CONFIG_ROCKCHIP_DRM_TVE=y CONFIG_ROCKCHIP_RGB=y # CONFIG_DRM_ROCKCHIP_VVOP is not set # CONFIG_ROCKCHIP_EBC_DEV is not set CONFIG_DRM_ROCKCHIP_RK618=y # CONFIG_DRM_UDL is not set # CONFIG_DRM_AST is not set # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_LVDS is not set # CONFIG_DRM_QXL is not set # CONFIG_DRM_BOCHS is not set CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_ARM_VERSATILE is not set # CONFIG_DRM_PANEL_LVDS is not set CONFIG_DRM_PANEL_SIMPLE=y # CONFIG_DRM_PANEL_SIMPLE_OF_ONLY is not set # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set CONFIG_DRM_PANEL_ILITEK_ILI9881C=y # CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set # CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set # CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set # CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set # CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_DUMB_VGA_DAC is not set # CONFIG_DRM_LVDS_ENCODER is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_RK1000_TVE is not set # CONFIG_DRM_SIL_SII8620 is not set CONFIG_DRM_SII902X=y # CONFIG_DRM_SII9234 is not set # CONFIG_DRM_THINE_THC63LVD1024 is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TI_TFP410 is not set CONFIG_DRM_ANALOGIX_DP=y # CONFIG_DRM_I2C_ADV7511 is not set 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_ARCPGU is not set # CONFIG_DRM_HISI_HIBMC is not set # CONFIG_DRM_HISI_KIRIN is not set # CONFIG_DRM_MXSFB is not set # CONFIG_DRM_TINYDRM is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_MALI400=y CONFIG_MALI450=y # CONFIG_MALI470 is not set # CONFIG_MALI400_DEBUG is not set # CONFIG_MALI400_PROFILING is not set # CONFIG_MALI400_UMP is not set CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH=y CONFIG_MALI_SHARED_INTERRUPTS=y # CONFIG_MALI_PMU_PARALLEL_POWER_UP is not set CONFIG_MALI_DT=y CONFIG_MALI_DEVFREQ=y # CONFIG_MALI_QUIET is not set CONFIG_MALI_MIDGARD=y # CONFIG_MALI_GATOR_SUPPORT is not set # CONFIG_MALI_MIDGARD_ENABLE_TRACE is not set # CONFIG_MALI_DMA_FENCE is not set CONFIG_MALI_EXPERT=y # CONFIG_MALI_CORESTACK is not set # CONFIG_MALI_PRFCNT_SET_SECONDARY is not set # CONFIG_MALI_PLATFORM_FAKE is not set # CONFIG_MALI_PLATFORM_DEVICETREE is not set CONFIG_MALI_PLATFORM_THIRDPARTY=y CONFIG_MALI_PLATFORM_THIRDPARTY_NAME="rk" CONFIG_MALI_DEBUG=y CONFIG_MALI_FENCE_DEBUG=y # CONFIG_MALI_NO_MALI is not set # CONFIG_MALI_TRACE_TIMELINE is not set # CONFIG_MALI_SYSTEM_TRACE is not set # CONFIG_MALI_GPU_MMU_AARCH64 is not set CONFIG_MALI_PWRSOFT_765=y # CONFIG_MALI_KUTF is not set CONFIG_MALI_BIFROST=y # CONFIG_MALI_BIFROST_GATOR_SUPPORT is not set # CONFIG_MALI_BIFROST_ENABLE_TRACE is not set CONFIG_MALI_BIFROST_DEVFREQ=y # CONFIG_MALI_BIFROST_DMA_FENCE is not set CONFIG_MALI_PLATFORM_NAME="rk" # CONFIG_MALI_ARBITER_SUPPORT is not set # CONFIG_MALI_BIFROST_EXPERT is not set CONFIG_MALI_REAL_HW=y # CONFIG_MALI_DMA_BUF_MAP_ON_DEMAND is not set # CONFIG_MALI_DMA_BUF_LEGACY_COMPAT is not set # CONFIG_MALI_GEM5_BUILD is not set # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y # CONFIG_FB_MODE_HELPERS is not set # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_UVESA is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_I740 is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_S3 is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VT8623 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_ARK is not set # CONFIG_FB_PM3 is not set # CONFIG_FB_CARMINE is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set # CONFIG_FB_BROADSHEET is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # CONFIG_FB_SM712 is not set CONFIG_BACKLIGHT_LCD_SUPPORT=y # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y CONFIG_BACKLIGHT_GENERIC=y CONFIG_BACKLIGHT_PWM=y # CONFIG_BACKLIGHT_PM8941_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # # Rockchip Misc Video driver # # # RGA # # CONFIG_ROCKCHIP_RGA is not set CONFIG_ROCKCHIP_RGA2=y # CONFIG_ROCKCHIP_RGA2_PROC_FS is not set CONFIG_ROCKCHIP_RGA2_DEBUG_FS=y CONFIG_ROCKCHIP_RGA2_DEBUGGER=y # # IEP # # CONFIG_IEP is not set # CONFIG_IEP_MMU is not set CONFIG_ROCKCHIP_MPP_SERVICE=y CONFIG_ROCKCHIP_MPP_PROC_FS=y CONFIG_ROCKCHIP_MPP_RKVDEC=y CONFIG_ROCKCHIP_MPP_RKVDEC2=y CONFIG_ROCKCHIP_MPP_RKVENC=y CONFIG_ROCKCHIP_MPP_VDPU1=y CONFIG_ROCKCHIP_MPP_VEPU1=y CONFIG_ROCKCHIP_MPP_VDPU2=y CONFIG_ROCKCHIP_MPP_VEPU2=y CONFIG_ROCKCHIP_MPP_IEP2=y CONFIG_ROCKCHIP_MPP_JPGDEC=y CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set CONFIG_LOGO=y CONFIG_LOGO_LINUX_MONO=y CONFIG_LOGO_LINUX_VGA16=y CONFIG_LOGO_LINUX_CLUT224=y CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_HWDEP=y CONFIG_SND_SEQ_DEVICE=y CONFIG_SND_RAWMIDI=y CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y CONFIG_SND_HRTIMER=y CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 # CONFIG_SND_SUPPORT_OLD_API is not set CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set # CONFIG_SND_DEBUG is not set CONFIG_SND_SEQUENCER=y CONFIG_SND_SEQ_DUMMY=y CONFIG_SND_SEQ_HRTIMER_DEFAULT=y CONFIG_SND_SEQ_MIDI_EVENT=y CONFIG_SND_SEQ_MIDI=y CONFIG_SND_DRIVERS=y # CONFIG_SND_DUMMY is not set # CONFIG_SND_ALOOP is not set # CONFIG_SND_VIRMIDI is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_MPU401 is not set # CONFIG_SND_PCI is not set # # HD-Audio # CONFIG_SND_HDA_PREALLOC_SIZE=64 # CONFIG_SND_SPI is not set CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y # CONFIG_SND_USB_UA101 is not set # CONFIG_SND_USB_CAIAQ is not set # CONFIG_SND_USB_6FIRE is not set # CONFIG_SND_USB_HIFACE is not set # CONFIG_SND_BCD2000 is not set # CONFIG_SND_USB_POD is not set # CONFIG_SND_USB_PODHD is not set # CONFIG_SND_USB_TONEPORT is not set # CONFIG_SND_USB_VARIAX is not set CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # 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_IMX_AUDMUX is not set # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set CONFIG_SND_SOC_ROCKCHIP=y CONFIG_SND_SOC_ROCKCHIP_PREALLOC_BUFFER_SIZE=512 # CONFIG_SND_SOC_ROCKCHIP_AUDIO_PWM is not set CONFIG_SND_SOC_ROCKCHIP_I2S=y CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y CONFIG_SND_SOC_ROCKCHIP_PDM=y CONFIG_SND_SOC_ROCKCHIP_SPDIF=y # CONFIG_SND_SOC_ROCKCHIP_VAD is not set CONFIG_SND_SOC_ROCKCHIP_MAX98090=y CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y CONFIG_SND_SOC_ROCKCHIP_RT5645=y # CONFIG_SND_SOC_ROCKCHIP_RT5651 is not set # CONFIG_SND_SOC_ROCKCHIP_RT5651_RK628 is not set # CONFIG_SND_SOC_ROCKCHIP_HDMI is not set # CONFIG_SND_SOC_RK3288_HDMI_ANALOG is not set # CONFIG_SND_SOC_RK3399_GRU_SOUND is not set # # STMicroelectronics STM32 SOC audio support # # CONFIG_SND_SOC_XTFPGA_I2S is not set # CONFIG_ZX_TDM is not set CONFIG_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set # CONFIG_SND_SOC_ADAU7002 is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4458 is not set # CONFIG_SND_SOC_AK4554 is not set # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # CONFIG_SND_SOC_CS35L33 is not set # CONFIG_SND_SOC_CS35L34 is not set # CONFIG_SND_SOC_CS35L35 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # 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_CS4349 is not set # CONFIG_SND_SOC_CS53L30 is not set # CONFIG_SND_SOC_CX2072X is not set CONFIG_SND_SOC_DUMMY_CODEC=y CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_ES7134 is not set CONFIG_SND_SOC_ES7202=y CONFIG_SND_SOC_ES7202_MIC_MAX_CHANNELS=4 CONFIG_SND_SOC_ES7202_I2C_BUS=1 # CONFIG_SND_SOC_ES7210 is not set # CONFIG_SND_SOC_ES7241 is not set CONFIG_SND_SOC_ES7243E=y CONFIG_SND_SOC_ES8311=y CONFIG_SND_SOC_ES8316=y # CONFIG_SND_SOC_ES8323 is not set # CONFIG_SND_SOC_ES8328_I2C is not set # CONFIG_SND_SOC_ES8328_SPI is not set # CONFIG_SND_SOC_ES8396 is not set # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set CONFIG_SND_SOC_MAX98090=y # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98373 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set # CONFIG_SND_SOC_PCM186X_I2C is not set # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # 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_RK312X is not set # CONFIG_SND_SOC_RK3228 is not set CONFIG_SND_SOC_RK3308=y CONFIG_SND_SOC_RK3328=y CONFIG_SND_SOC_RK817=y CONFIG_SND_SOC_RK_CODEC_DIGITAL=y CONFIG_SND_SOC_RL6231=y CONFIG_SND_SOC_RT5616=y # CONFIG_SND_SOC_RT5631 is not set CONFIG_SND_SOC_RT5640=y CONFIG_SND_SOC_RT5645=y CONFIG_SND_SOC_RT5651=y # CONFIG_SND_SOC_SGTL5000 is not set # CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set # CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set CONFIG_SND_SOC_SPDIF=y # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set # CONFIG_SND_SOC_TLV320AIC3X is not set CONFIG_SND_SOC_TS3A227E=y # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731 is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set # 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_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set # 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_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8824 is not set # 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 is not set # CONFIG_SND_AUDIO_GRAPH_SCU_CARD is not set # # HID support # CONFIG_HID=y CONFIG_HID_BATTERY_STRENGTH=y CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set # CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_ASUS is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set # CONFIG_HID_BETOP_FF is not set # CONFIG_HID_CHERRY is not set # CONFIG_HID_CHICONY is not set # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CYPRESS is not set # CONFIG_HID_DRAGONRISE is not set # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set # CONFIG_HID_EZKEY is not set # 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_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set # CONFIG_HID_JABRA is not set # CONFIG_HID_TWINHAN is not set CONFIG_HID_KENSINGTON=y # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LED is not set # CONFIG_HID_LENOVO is not set # CONFIG_HID_LOGITECH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MAYFLASH is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set CONFIG_HID_MULTITOUCH=y # CONFIG_HID_NINTENDO is not set # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set # CONFIG_HID_ORTEK is not set # CONFIG_HID_PANTHERLORD is not set # CONFIG_HID_PENMOUNT is not set # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set # CONFIG_HID_SONY is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set # CONFIG_HID_SUNPLUS is not set # CONFIG_HID_RMI is not set # CONFIG_HID_GREENASIA is not set # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_WACOM is not set # CONFIG_HID_WIIMOTE is not set # CONFIG_HID_XINMO is not set # CONFIG_HID_ZEROPLUS is not set # CONFIG_HID_ZYDACRON is not set # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # # I2C HID support # CONFIG_I2C_HID=y CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_PCI=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # # CONFIG_USB_DEFAULT_PERSIST is not set # CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_OTG=y # CONFIG_USB_OTG_WHITELIST is not set # 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_MON=y # CONFIG_USB_WUSB_CBAF is not set # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y # CONFIG_USB_XHCI_DBGCAP is not set CONFIG_USB_XHCI_PCI=y 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_PCI=y CONFIG_USB_EHCI_HCD_PLATFORM=y # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y # CONFIG_USB_OHCI_HCD_PCI is not set CONFIG_USB_OHCI_HCD_PLATFORM=y # CONFIG_USB_UHCI_HCD is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=y # CONFIG_USB_PRINTER is not set CONFIG_USB_WDM=y # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set CONFIG_USB_UAS=y # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_MUSB_HDRC is not set CONFIG_USB_DWC3=y # CONFIG_USB_DWC3_HOST is not set # CONFIG_USB_DWC3_GADGET is not set CONFIG_USB_DWC3_DUAL_ROLE=y # # Platform Glue Driver Support # CONFIG_USB_DWC3_HAPS=y CONFIG_USB_DWC3_OF_SIMPLE=y CONFIG_USB_DWC3_ROCKCHIP_INNO=y CONFIG_USB_DWC2=y # CONFIG_USB_DWC2_HOST is not set # # Gadget/Dual-role mode requires USB Gadget support to be enabled # # CONFIG_USB_DWC2_PERIPHERAL is not set CONFIG_USB_DWC2_DUAL_ROLE=y # CONFIG_USB_DWC2_PCI is not set # CONFIG_USB_DWC2_DEBUG is not set # CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set # CONFIG_USB_CHIPIDEA is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # CONFIG_USB_SERIAL=y # CONFIG_USB_SERIAL_CONSOLE is not set CONFIG_USB_SERIAL_GENERIC=y # CONFIG_USB_SERIAL_SIMPLE is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set # CONFIG_USB_SERIAL_CH341 is not set # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set CONFIG_USB_SERIAL_CP210X=y # CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_EMPEG is not set CONFIG_USB_SERIAL_FTDI_SIO=y # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_F81232 is not set # CONFIG_USB_SERIAL_F8153X is not set # CONFIG_USB_SERIAL_GARMIN is not set # CONFIG_USB_SERIAL_IPW is not set # CONFIG_USB_SERIAL_IUU is not set # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set CONFIG_USB_SERIAL_KEYSPAN=y # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_METRO is not set # CONFIG_USB_SERIAL_MOS7720 is not set # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MXUPORT is not set # CONFIG_USB_SERIAL_NAVMAN is not set CONFIG_USB_SERIAL_PL2303=y CONFIG_USB_SERIAL_OTI6858=y # CONFIG_USB_SERIAL_QCAUX is not set CONFIG_USB_SERIAL_QUALCOMM=y # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SAFE is not set CONFIG_USB_SERIAL_SIERRAWIRELESS=y # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_XIRCOM is not set CONFIG_USB_SERIAL_WWAN=y CONFIG_USB_SERIAL_OPTION=y # CONFIG_USB_SERIAL_OMNINET is not set # CONFIG_USB_SERIAL_OPTICON is not set # CONFIG_USB_SERIAL_XSENS_MT is not set # CONFIG_USB_SERIAL_WISHBONE is not set # CONFIG_USB_SERIAL_SSU100 is not set # CONFIG_USB_SERIAL_QT2 is not set # CONFIG_USB_SERIAL_UPD78F0730 is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set CONFIG_USB_EZUSB_FX2=y # CONFIG_USB_HUB_USB251XB is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # # USB Physical Layer drivers # CONFIG_USB_PHY=y # CONFIG_NOP_USB_XCEIV is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set # CONFIG_USB_ULPI is not set CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG is not set CONFIG_USB_GADGET_DEBUG_FILES=y # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=500 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # CONFIG_U_SERIAL_CONSOLE is not set # # USB Peripheral Controller # # CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set # CONFIG_USB_SNP_UDC_PLAT is not set # CONFIG_USB_M66592 is not set # CONFIG_USB_BDC_UDC is not set # CONFIG_USB_AMD5536UDC is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_NET2280 is not set # CONFIG_USB_GOKU is not set # CONFIG_USB_EG20T is not set # CONFIG_USB_GADGET_XILINX is not set # CONFIG_USB_DUMMY_HCD is not set CONFIG_USB_LIBCOMPOSITE=y CONFIG_USB_F_ACM=y CONFIG_USB_U_SERIAL=y CONFIG_USB_F_MASS_STORAGE=y CONFIG_USB_F_FS=y CONFIG_USB_F_UVC=y CONFIG_USB_CONFIGFS=y CONFIG_USB_CONFIGFS_UEVENT=y # CONFIG_USB_CONFIGFS_SERIAL is not set CONFIG_USB_CONFIGFS_ACM=y # CONFIG_USB_CONFIGFS_OBEX is not set # CONFIG_USB_CONFIGFS_NCM is not set # CONFIG_USB_CONFIGFS_ECM is not set # CONFIG_USB_CONFIGFS_ECM_SUBSET is not set # CONFIG_USB_CONFIGFS_RNDIS is not set # CONFIG_USB_CONFIGFS_EEM is not set CONFIG_USB_CONFIGFS_MASS_STORAGE=y # CONFIG_USB_CONFIGFS_F_LB_SS is not set CONFIG_USB_CONFIGFS_F_FS=y # CONFIG_USB_CONFIGFS_F_ACC is not set # CONFIG_USB_CONFIGFS_F_AUDIO_SRC is not set # CONFIG_USB_CONFIGFS_F_UAC1 is not set # CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set # CONFIG_USB_CONFIGFS_F_UAC2 is not set # CONFIG_USB_CONFIGFS_F_MIDI is not set # CONFIG_USB_CONFIGFS_F_HID is not set CONFIG_USB_CONFIGFS_F_UVC=y # CONFIG_USB_CONFIGFS_F_PRINTER is not set # CONFIG_TYPEC is not set # CONFIG_USB_ROLE_SWITCH is not set # CONFIG_USB_LED_TRIG is not set # CONFIG_USB_ULPI_BUS is not set # CONFIG_UWB is not set CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y # CONFIG_PWRSEQ_SD8787 is not set CONFIG_PWRSEQ_SIMPLE=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 # CONFIG_SDIO_UART is not set CONFIG_MMC_TEST=y CONFIG_SDIO_KEEPALIVE=y # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_DEBUG is not set # CONFIG_MMC_ARMMMCI is not set CONFIG_MMC_SDHCI=y # CONFIG_MMC_SDHCI_PCI is not set CONFIG_MMC_SDHCI_PLTFM=y CONFIG_MMC_SDHCI_OF_ARASAN=y # CONFIG_MMC_SDHCI_OF_AT91 is not set CONFIG_MMC_SDHCI_OF_DWCMSHC=y # CONFIG_MMC_SDHCI_CADENCE is not set # CONFIG_MMC_SDHCI_F_SDH30 is not set # CONFIG_MMC_TIFM_SD is not set # CONFIG_MMC_SPI is not set # CONFIG_MMC_CB710 is not set # CONFIG_MMC_VIA_SDMMC is not set CONFIG_MMC_DW=y CONFIG_MMC_DW_PLTFM=y # CONFIG_MMC_DW_BLUEFIELD is not set # CONFIG_MMC_DW_EXYNOS is not set # CONFIG_MMC_DW_HI3798CV200 is not set # CONFIG_MMC_DW_K3 is not set # CONFIG_MMC_DW_PCI is not set CONFIG_MMC_DW_ROCKCHIP=y # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_CQHCI=y # CONFIG_MMC_TOSHIBA_PCI is not set # CONFIG_MMC_MTK is not set # CONFIG_MMC_SDHCI_XENON is not set # CONFIG_MMC_SDHCI_OMAP is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y # CONFIG_LEDS_CLASS_FLASH is not set # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP5521 is not set # CONFIG_LEDS_LP5523 is not set # CONFIG_LEDS_LP5562 is not set # CONFIG_LEDS_LP8501 is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set # CONFIG_LEDS_PWM is not set # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_SYSCON is not set # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # # LED Triggers # CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y # CONFIG_LEDS_TRIGGER_ONESHOT is not set # CONFIG_LEDS_TRIGGER_DISK is not set # CONFIG_LEDS_TRIGGER_MTD is not set CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_BACKLIGHT=m # CONFIG_LEDS_TRIGGER_CPU is not set # CONFIG_LEDS_TRIGGER_ACTIVITY is not set CONFIG_LEDS_TRIGGER_GPIO=y # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set # CONFIG_LEDS_TRIGGER_PANIC is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_SUPPORT=y # CONFIG_EDAC is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # I2C RTC drivers # # CONFIG_RTC_DRV_ABB5ZES3 is not set # CONFIG_RTC_DRV_ABX80X is not set # CONFIG_RTC_DRV_DS1307 is not set # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_FAKE is not set CONFIG_RTC_DRV_HYM8563=y # CONFIG_RTC_DRV_MAX6900 is not set CONFIG_RTC_DRV_RK808=y # CONFIG_RTC_DRV_RK_TIMER is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_TPS6586X is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # CONFIG_RTC_DRV_RX8581 is not set # CONFIG_RTC_DRV_RX8025 is not set # CONFIG_RTC_DRV_EM3027 is not set # CONFIG_RTC_DRV_RV8803 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RX6110 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # 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 is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_PL030 is not set # CONFIG_RTC_DRV_PL031 is not set # CONFIG_RTC_DRV_FTRTC010 is not set # CONFIG_RTC_DRV_SNVS is not set # CONFIG_RTC_DRV_R7301 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_HID_SENSOR_TIME is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_OF=y # CONFIG_ALTERA_MSGDMA is not set # CONFIG_AMBA_PL08X is not set # CONFIG_DW_AXI_DMAC is not set # CONFIG_FSL_EDMA is not set # CONFIG_INTEL_IDMA64 is not set # CONFIG_MV_XOR_V2 is not set CONFIG_PL330_DMA=y # CONFIG_XILINX_DMA is not set # CONFIG_XILINX_ZYNQMP_DMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set # CONFIG_DW_DMAC is not set # CONFIG_DW_DMAC_PCI is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set CONFIG_VIRTIO_MENU=y # CONFIG_VIRTIO_PCI is not set # CONFIG_VIRTIO_MMIO is not set # # Microsoft Hyper-V guest support # CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_COMEDI is not set # CONFIG_RTL8192U is not set # CONFIG_RTLLIB is not set # CONFIG_RTL8723BS is not set # CONFIG_R8712U is not set # CONFIG_R8188EU is not set # CONFIG_R8822BE is not set # CONFIG_RTS5208 is not set # CONFIG_VT6655 is not set # CONFIG_VT6656 is not set # # IIO staging drivers # # # Accelerometers # # CONFIG_ADIS16203 is not set # CONFIG_ADIS16240 is not set # # Analog to digital converters # # CONFIG_AD7606 is not set # CONFIG_AD7780 is not set # CONFIG_AD7816 is not set # CONFIG_AD7192 is not set # CONFIG_AD7280 is not set # # Analog digital bi-direction converters # # CONFIG_ADT7316 is not set # # Capacitance to digital converters # # CONFIG_AD7150 is not set # CONFIG_AD7152 is not set # CONFIG_AD7746 is not set # # Direct Digital Synthesis # # CONFIG_AD9832 is not set # CONFIG_AD9834 is not set # # Network Analyzer, Impedance Converters # # CONFIG_AD5933 is not set # # Active energy metering IC # # CONFIG_ADE7854 is not set # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1210 is not set # CONFIG_FB_SM750 is not set # CONFIG_FB_XGI is not set # # Speakup console speech # # CONFIG_SPEAKUP is not set # CONFIG_STAGING_MEDIA is not set # # Android # # CONFIG_ASHMEM is not set # CONFIG_ANDROID_VSOC is not set # CONFIG_ION is not set CONFIG_FIQ_DEBUGGER=y CONFIG_FIQ_DEBUGGER_NO_SLEEP=y # CONFIG_FIQ_DEBUGGER_WAKEUP_IRQ_ALWAYS_ON is not set CONFIG_FIQ_DEBUGGER_CONSOLE=y CONFIG_FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE=y CONFIG_FIQ_DEBUGGER_TRUST_ZONE=y # CONFIG_FIQ_DEBUGGER_UART_OVERLAY is not set CONFIG_RK_CONSOLE_THREAD=y # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_DGNC is not set # CONFIG_GS_FPGABOOT is not set # CONFIG_UNISYSSPAR is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set CONFIG_FB_TFT=m CONFIG_FB_TFT_HKTFT32=m CONFIG_FB_TFT_FBTFT_DEVICE=m # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set # CONFIG_MOST is not set # CONFIG_KS7010 is not set # CONFIG_GREYBUS is not set # CONFIG_PI433 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_POWERVR_ROGUE_N is not set # CONFIG_GOLDFISH is not set CONFIG_CHROME_PLATFORMS=y # CONFIG_CROS_EC_I2C is not set # CONFIG_CROS_EC_SPI is not set CONFIG_CROS_EC_PROTO=y CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Common Clock Framework # CONFIG_COMMON_CLK_DEBUGFS=y # CONFIG_COMMON_CLK_PROCFS is not set # CONFIG_COMMON_CLK_VERSATILE is not set # CONFIG_CLK_HSDK is not set # CONFIG_COMMON_CLK_MAX9485 is not set CONFIG_COMMON_CLK_RK808=y CONFIG_COMMON_CLK_SCMI=y # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set # CONFIG_CLK_QORIQ is not set CONFIG_COMMON_CLK_XGENE=y # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_VC5 is not set CONFIG_COMMON_CLK_ROCKCHIP=y # CONFIG_ROCKCHIP_CLK_COMPENSATION is not set CONFIG_ROCKCHIP_CLK_BOOST=y CONFIG_ROCKCHIP_CLK_INV=y CONFIG_ROCKCHIP_CLK_PVTM=y CONFIG_ROCKCHIP_DCLK_DIV=y # CONFIG_ROCKCHIP_DDRCLK_SCPI is not set CONFIG_ROCKCHIP_DDRCLK_SIP=y # CONFIG_ROCKCHIP_PLL_RK3066 is not set CONFIG_ROCKCHIP_PLL_RK3399=y CONFIG_COMMON_CLK_ROCKCHIP_REGMAP=y CONFIG_CLK_RK618=y # CONFIG_HWSPINLOCK is not set # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_PROBE=y CONFIG_CLKSRC_MMIO=y CONFIG_ROCKCHIP_TIMER=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y CONFIG_FSL_ERRATUM_A008585=y CONFIG_HISILICON_ERRATUM_161010101=y CONFIG_ARM64_ERRATUM_858921=y # CONFIG_ARM_TIMER_SP804 is not set CONFIG_MAILBOX=y # CONFIG_ARM_MHU is not set # CONFIG_PLATFORM_MHU is not set # CONFIG_PL320_MBOX is not set # CONFIG_ROCKCHIP_MBOX is not set # CONFIG_ALTERA_MBOX is not set # CONFIG_MAILBOX_TEST is not set # CONFIG_RK3368_MBOX is not set CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # # CONFIG_IOMMU_IO_PGTABLE_LPAE is not set # CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set # CONFIG_IOMMU_DEBUGFS is not set # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_IOMMU_IOVA=y CONFIG_OF_IOMMU=y CONFIG_IOMMU_DMA=y CONFIG_ROCKCHIP_IOMMU=y # CONFIG_ARM_SMMU is not set # CONFIG_ARM_SMMU_V3 is not set # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # # Rpmsg drivers # # CONFIG_RPMSG_QCOM_GLINK_RPM is not set # CONFIG_RPMSG_VIRTIO is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # # Broadcom SoC drivers # # CONFIG_SOC_BRCMSTB is not set # # NXP/Freescale QorIQ SoC drivers # # # i.MX SoC drivers # # # Qualcomm SoC drivers # # # Rockchip CPU selection # CONFIG_CPU_PX30=y CONFIG_CPU_RK1808=y # CONFIG_CPU_RK3308 is not set CONFIG_CPU_RK3328=y # CONFIG_CPU_RK3368 is not set CONFIG_CPU_RK3399=y CONFIG_CPU_RK3568=y CONFIG_ANDROID_VERSION=0x08010000 CONFIG_ROCKCHIP_CPUINFO=y CONFIG_ROCKCHIP_GRF=y # CONFIG_ROCKCHIP_HW_DECOMPRESS is not set CONFIG_ROCKCHIP_IPA=y CONFIG_ROCKCHIP_OPP=y CONFIG_ROCKCHIP_PM_DOMAINS=y CONFIG_ROCKCHIP_PVTM=y # CONFIG_ROCKCHIP_RAMDISK is not set CONFIG_ROCKCHIP_SUSPEND_MODE=y CONFIG_ROCKCHIP_SYSTEM_MONITOR=y # CONFIG_ROCKCHIP_MTD_VENDOR_STORAGE is not set # CONFIG_ROCKCHIP_VENDOR_STORAGE_UPDATE_LOADER is not set CONFIG_ROCKCHIP_DEBUG=y # CONFIG_ROCKCHIP_LOW_PERFORMANCE is not set # CONFIG_ROCKCHIP_THUNDER_BOOT is not set # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # CONFIG_XILINX_VCU is not set CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y CONFIG_DEVFREQ_GOV_PERFORMANCE=y CONFIG_DEVFREQ_GOV_POWERSAVE=y CONFIG_DEVFREQ_GOV_USERSPACE=y # CONFIG_DEVFREQ_GOV_PASSIVE is not set # # DEVFREQ Drivers # CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=y CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y # CONFIG_ARM_ROCKCHIP_DMC_DEBUG is not set CONFIG_PM_DEVFREQ_EVENT=y CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y # CONFIG_DEVFREQ_EVENT_ROCKCHIP_NOCP is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_GPIO is not set # CONFIG_EXTCON_MAX3355 is not set # CONFIG_EXTCON_RT8973A is not set # CONFIG_EXTCON_SM5502 is not set # CONFIG_EXTCON_USB_GPIO is not set # CONFIG_EXTCON_USBC_CROS_EC is not set CONFIG_MEMORY=y # CONFIG_ARM_PL172_MPMC is not set CONFIG_IIO=y CONFIG_IIO_BUFFER=y # CONFIG_IIO_BUFFER_CB is not set # CONFIG_IIO_BUFFER_HW_CONSUMER is not set CONFIG_IIO_KFIFO_BUF=y # CONFIG_IIO_CONFIGFS is not set CONFIG_IIO_TRIGGER=y CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # CONFIG_IIO_SW_DEVICE is not set # CONFIG_IIO_SW_TRIGGER is not set # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADXL345_I2C is not set # CONFIG_ADXL345_SPI is not set # CONFIG_BMA180 is not set # CONFIG_BMA220 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_DA280 is not set # CONFIG_DA311 is not set # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_DMARD10 is not set # CONFIG_IIO_CROS_EC_ACCEL_LEGACY is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MC3230 is not set # CONFIG_MMA7455_I2C is not set # CONFIG_MMA7455_SPI is not set # CONFIG_MMA7660 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MXC4005 is not set # CONFIG_MXC6255 is not set # CONFIG_SCA3000 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # # Analog to digital converters # # CONFIG_AD7266 is not set # CONFIG_AD7291 is not set # CONFIG_AD7298 is not set # CONFIG_AD7476 is not set # CONFIG_AD7766 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD799X is not set # CONFIG_CC10001_ADC is not set # CONFIG_ENVELOPE_DETECTOR is not set # CONFIG_HI8435 is not set # CONFIG_HX711 is not set # CONFIG_INA2XX_ADC is not set # CONFIG_LTC2471 is not set # CONFIG_LTC2485 is not set # CONFIG_LTC2497 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX11100 is not set # CONFIG_MAX1118 is not set # CONFIG_MAX1363 is not set # CONFIG_MAX9611 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_NAU7802 is not set CONFIG_ROCKCHIP_SARADC=y # CONFIG_ROCKCHIP_SARADC_TEST_CHN is not set # CONFIG_SD_ADC_MODULATOR is not set # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC0832 is not set # CONFIG_TI_ADC084S021 is not set # CONFIG_TI_ADC12138 is not set # CONFIG_TI_ADC108S102 is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_TI_ADC161S626 is not set # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS7950 is not set # CONFIG_TI_ADS8688 is not set # CONFIG_TI_TLC4541 is not set # CONFIG_VF610_ADC is not set # # Analog Front Ends # # CONFIG_IIO_RESCALE is not set # # Amplifiers # # CONFIG_AD8366 is not set # # Chemical Sensors # # CONFIG_ATLAS_PH_SENSOR is not set # CONFIG_BME680 is not set # CONFIG_CCS811 is not set # CONFIG_IAQCORE is not set # CONFIG_VZ89X is not set # CONFIG_IIO_CROS_EC_SENSORS_CORE is not set # # Hid Sensor IIO Common # # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # # Counters # # # Digital to analog converters # # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5592R is not set # CONFIG_AD5593R is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_LTC2632 is not set # CONFIG_AD5686_SPI is not set # CONFIG_AD5696_I2C is not set # CONFIG_AD5755 is not set # CONFIG_AD5758 is not set # CONFIG_AD5761 is not set # CONFIG_AD5764 is not set # CONFIG_AD5791 is not set # CONFIG_AD7303 is not set # CONFIG_AD8801 is not set # CONFIG_DPOT_DAC is not set # CONFIG_DS4424 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # CONFIG_TI_DAC082S085 is not set # CONFIG_TI_DAC5571 is not set # CONFIG_VF610_DAC is not set # # IIO dummy driver # # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_MPU3050_I2C is not set # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # # Health Sensors # # # Heart Rate Monitors # # CONFIG_AFE4403 is not set # CONFIG_AFE4404 is not set # CONFIG_MAX30100 is not set # CONFIG_MAX30102 is not set # # Humidity sensors # # CONFIG_AM2315 is not set # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HTS221 is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set # CONFIG_KMX61 is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set # CONFIG_IIO_ST_LSM6DSX is not set # # Light sensors # # CONFIG_ADJD_S311 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_BH1750 is not set # CONFIG_BH1780 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM3605 is not set # CONFIG_CM36651 is not set # CONFIG_GP2AP020A00F is not set CONFIG_SENSORS_ISL29018=y # CONFIG_SENSORS_ISL29028 is not set # CONFIG_ISL29125 is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_LV0104CS is not set # CONFIG_MAX44000 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1133 is not set # CONFIG_SI1145 is not set # CONFIG_STK3310 is not set # CONFIG_ST_UVIS25 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set CONFIG_SENSORS_TSL2563=y CONFIG_TSL2583=y # CONFIG_TSL2772 is not set # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VEML6070 is not set # CONFIG_VL6180 is not set # CONFIG_ZOPT2201 is not set # # Magnetometer sensors # # CONFIG_AK8974 is not set # CONFIG_AK8975 is not set # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN_I2C is not set # CONFIG_BMC150_MAGN_SPI is not set # CONFIG_MAG3110 is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # # Multiplexers # # CONFIG_IIO_MUX is not set # # Inclinometer sensors # # # Triggers - standalone # # CONFIG_IIO_INTERRUPT_TRIGGER is not set CONFIG_IIO_SYSFS_TRIGGER=y # # Digital potentiometers # # CONFIG_AD5272 is not set # CONFIG_DS1803 is not set # CONFIG_MAX5481 is not set # CONFIG_MAX5487 is not set # CONFIG_MCP4018 is not set # CONFIG_MCP4131 is not set # CONFIG_MCP4531 is not set # CONFIG_TPL0102 is not set # # Digital potentiostats # # CONFIG_LMP91000 is not set # # Pressure sensors # # CONFIG_ABP060MG is not set # CONFIG_BMP280 is not set # CONFIG_HP03 is not set # CONFIG_MPL115_I2C is not set # CONFIG_MPL115_SPI is not set # CONFIG_MPL3115 is not set # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # CONFIG_HP206C is not set # CONFIG_ZPA2326 is not set # # Lightning sensors # # CONFIG_AS3935 is not set # # Proximity and distance sensors # # CONFIG_ISL29501 is not set # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_RFD77402 is not set # CONFIG_SRF04 is not set # CONFIG_SX9500 is not set # CONFIG_SRF08 is not set # # Resolver to digital converters # # CONFIG_AD2S1200 is not set # # Temperature sensors # # CONFIG_MAXIM_THERMOCOUPLE is not set # CONFIG_MLX90614 is not set # CONFIG_MLX90632 is not set # CONFIG_TMP006 is not set # CONFIG_TMP007 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_NTB is not set # CONFIG_VME_BUS is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_CROS_EC is not set # CONFIG_PWM_FSL_FTM is not set # CONFIG_PWM_PCA9685 is not set CONFIG_PWM_ROCKCHIP=y # CONFIG_PWM_ROCKCHIP_ONESHOT is not set # # IRQ chip support # CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 CONFIG_ARM_GIC_V2M=y CONFIG_ARM_GIC_V3=y CONFIG_ARM_GIC_V3_ITS=y CONFIG_ARM_GIC_V3_ITS_PCI=y CONFIG_PARTITION_PERCPU=y # CONFIG_IPACK_BUS is not set CONFIG_ARCH_HAS_RESET_CONTROLLER=y CONFIG_RESET_CONTROLLER=y CONFIG_RESET_SCMI=y # CONFIG_RESET_TI_SYSCON is not set # CONFIG_FMC is not set # # PHY Subsystem # CONFIG_GENERIC_PHY=y # CONFIG_PHY_XGENE is not set # CONFIG_BCM_KONA_USB2_PHY is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_CPCAP_USB is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set CONFIG_PHY_ROCKCHIP_CSI2_DPHY=y CONFIG_PHY_ROCKCHIP_DP=y CONFIG_PHY_ROCKCHIP_EMMC=y # CONFIG_PHY_ROCKCHIP_INNO_COMBPHY is not set CONFIG_PHY_ROCKCHIP_INNO_HDMI_PHY=y CONFIG_PHY_ROCKCHIP_INNO_MIPI_DPHY=y CONFIG_PHY_ROCKCHIP_INNO_USB2=y CONFIG_PHY_ROCKCHIP_INNO_USB3=y CONFIG_PHY_ROCKCHIP_INNO_VIDEO_COMBO_PHY=y # CONFIG_PHY_ROCKCHIP_INNO_VIDEO_PHY is not set CONFIG_PHY_ROCKCHIP_MIPI_RX=y CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y CONFIG_PHY_ROCKCHIP_NANENG_EDP=y # CONFIG_PHY_ROCKCHIP_NANENG_USB2 is not set CONFIG_PHY_ROCKCHIP_PCIE=y CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=y CONFIG_PHY_ROCKCHIP_TYPEC=y CONFIG_PHY_ROCKCHIP_USB=y # CONFIG_PHY_SAMSUNG_USB2 is not set # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCI_PMU is not set # CONFIG_ARM_CCN is not set CONFIG_ARM_PMU=y # CONFIG_ARM_DSU_PMU is not set # CONFIG_ARM_SPE_PMU is not set CONFIG_RAS=y # # Android # CONFIG_ANDROID=y # CONFIG_ANDROID_BINDER_IPC is not set # CONFIG_LIBNVDIMM is not set # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y CONFIG_ROCKCHIP_EFUSE=y CONFIG_ROCKCHIP_OTP=y # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # CONFIG_FPGA is not set # CONFIG_FSI is not set # CONFIG_TEE is not set CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_LEGACY_ENERGY_MODEL_DT is not set CONFIG_RK_FLASH=y # # Rockchip Flash Devices # # CONFIG_RK_NANDC_NAND is not set # CONFIG_RK_SFC_NAND is not set CONFIG_RK_SFC_NOR=y CONFIG_RK_SFC_NOR_MTD=y # CONFIG_RK_NAND is not set # # Headset device support # # CONFIG_RK_HEADSET is not set # # RKNPU # CONFIG_ROCKCHIP_RKNPU=m # # File systems # CONFIG_DCACHE_WORD_ACCESS=y CONFIG_FS_IOMAP=y # CONFIG_EXT2_FS is not set # CONFIG_EXT3_FS is not set 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 CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_XFS_FS=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_ONLINE_SCRUB is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set # CONFIG_FS_DAX is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y # CONFIG_DNOTIFY is not set CONFIG_INOTIFY_USER=y # CONFIG_FANOTIFY is not set # CONFIG_QUOTA is not set # CONFIG_AUTOFS4_FS is not set # CONFIG_AUTOFS_FS is not set CONFIG_FUSE_FS=y # CONFIG_CUSE is not set CONFIG_OVERLAY_FS=y # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_XINO_AUTO is not set # CONFIG_OVERLAY_FS_METACOPY is not set # CONFIG_INCREMENTAL_FS is not set # # Caches # # CONFIG_FSCACHE is not set # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=936 CONFIG_FAT_DEFAULT_IOCHARSET="utf8" CONFIG_FAT_DEFAULT_UTF8=y CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_CODEPAGE=936 CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" CONFIG_EXFAT_VIRTUAL_XATTR=y CONFIG_EXFAT_VIRTUAL_XATTR_SELINUX_LABEL="u:object_r:exfat:s0" # CONFIG_EXFAT_DEBUG is not set # CONFIG_EXFAT_UEVENT is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set # CONFIG_PROC_UID is not set CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_HUGETLBFS is not set CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=y CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set # CONFIG_SDCARD_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_DEBUG=0 CONFIG_JFFS2_FS_WRITEBUFFER=y # CONFIG_JFFS2_FS_WBUF_VERIFY is not set # CONFIG_JFFS2_SUMMARY is not set # CONFIG_JFFS2_FS_XATTR is not set # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set CONFIG_JFFS2_ZLIB=y CONFIG_JFFS2_RTIME=y CONFIG_UBIFS_FS=y CONFIG_UBIFS_FS_ADVANCED_COMPR=y CONFIG_UBIFS_FS_LZO=y CONFIG_UBIFS_FS_ZLIB=y # CONFIG_UBIFS_ATIME_SUPPORT is not set CONFIG_UBIFS_FS_XATTR=y CONFIG_UBIFS_FS_SECURITY=y # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y CONFIG_SQUASHFS_FILE_CACHE=y # CONFIG_SQUASHFS_FILE_DIRECT is not set CONFIG_SQUASHFS_DECOMP_SINGLE=y # CONFIG_SQUASHFS_DECOMP_MULTI is not set # CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y # CONFIG_SQUASHFS_LZ4 is not set CONFIG_SQUASHFS_LZO=y # CONFIG_SQUASHFS_XZ is not set # CONFIG_SQUASHFS_ZSTD is not set # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y CONFIG_PSTORE_DEFLATE_COMPRESS=y # CONFIG_PSTORE_LZO_COMPRESS is not set # CONFIG_PSTORE_LZ4_COMPRESS is not set # CONFIG_PSTORE_LZ4HC_COMPRESS is not set # CONFIG_PSTORE_842_COMPRESS is not set # CONFIG_PSTORE_ZSTD_COMPRESS is not set CONFIG_PSTORE_COMPRESS=y CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" CONFIG_PSTORE_CONSOLE=y # CONFIG_PSTORE_CONSOLE_FORCE is not set # CONFIG_PSTORE_PMSG is not set # CONFIG_PSTORE_FTRACE is not set CONFIG_PSTORE_RAM=y # CONFIG_PSTORE_MCU_LOG is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFS_SWAP=y # CONFIG_NFS_V4_1 is not set # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_SWAP=y # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS2=y CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set CONFIG_CIFS_DEBUG=y # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DEBUG_DUMP_KEYS is not set # CONFIG_CIFS_DFS_UPCALL is not set # CONFIG_CIFS_SWN_UPCALL is not set # CONFIG_CIFS_ROOT is not set # CONFIG_SMB_SERVER is not set CONFIG_SMBFS_COMMON=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set CONFIG_NLS_CODEPAGE_936=y # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set CONFIG_UNICODE=y # CONFIG_UNICODE_NORMALIZATION_SELFTEST is not set # # Security options # CONFIG_KEYS=y CONFIG_KEYS_COMPAT=y # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_BIG_KEYS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set # CONFIG_KEY_DH_OPERATIONS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY_PERF_EVENTS_RESTRICT is not set # CONFIG_SECURITY is not set CONFIG_SECURITYFS=y CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_TEE_SUPPORT is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_DEFAULT_SECURITY="" # # Kernel hardening options # # # Memory initialization # CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_RSA=y # CONFIG_CRYPTO_DH is not set CONFIG_CRYPTO_ECDH=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_WORKQUEUE=y CONFIG_CRYPTO_CRYPTD=y # CONFIG_CRYPTO_MCRYPTD is not set # CONFIG_CRYPTO_AUTHENC is not set # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_SIMD=y # CONFIG_CRYPTO_CURVE25519 is not set # # Authenticated Encryption with Associated Data # CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y # CONFIG_CRYPTO_CHACHA20POLY1305 is not set # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_AEGIS128L is not set # CONFIG_CRYPTO_AEGIS256 is not set # CONFIG_CRYPTO_MORUS640 is not set # CONFIG_CRYPTO_MORUS1280 is not set CONFIG_CRYPTO_SEQIV=y # CONFIG_CRYPTO_ECHAINIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CFB=y CONFIG_CRYPTO_CTR=y # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_ADIANTUM is not set # # Hash modes # CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_VMAC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_CRC32 is not set # CONFIG_CRYPTO_BLAKE2S is not set CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_GHASH=y # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set CONFIG_CRYPTO_SM3=y # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set CONFIG_CRYPTO_ARC4=y # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_CHACHA20 is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SM4 is not set # CONFIG_CRYPTO_TEA is not set CONFIG_CRYPTO_TWOFISH=y CONFIG_CRYPTO_TWOFISH_COMMON=y # # Compression # CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_LZO=y # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # # Random Number Generation # CONFIG_CRYPTO_ANSI_CPRNG=y CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set # CONFIG_CRYPTO_USER_API_AEAD is not set CONFIG_CRYPTO_HASH_INFO=y # # Crypto library routines # # CONFIG_CRYPTO_LIB_BLAKE2S is not set # CONFIG_CRYPTO_LIB_CHACHA is not set CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 # CONFIG_CRYPTO_LIB_POLY1305 is not set # CONFIG_CRYPTO_LIB_CURVE25519 is not set # CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_CCP is not set # CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set # CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set CONFIG_CRYPTO_DEV_ROCKCHIP=y # CONFIG_CRYPTO_DEV_CCREE is not set # CONFIG_CRYPTO_DEV_HISI_SEC is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_RATIONAL=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y # CONFIG_INDIRECT_PIO is not set CONFIG_CRC_CCITT=y CONFIG_CRC16=y CONFIG_CRC_T10DIF=y CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set CONFIG_CRC7=y CONFIG_LIBCRC32C=y # CONFIG_CRC8 is not set CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_XZ_DEC=y # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set # CONFIG_XZ_DEC_IA64 is not set CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y # CONFIG_XZ_DEC_SPARC is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_GZIP=y CONFIG_DECOMPRESS_BZIP2=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DECOMPRESS_XZ=y CONFIG_DECOMPRESS_LZO=y CONFIG_DECOMPRESS_LZ4=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y 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_DIRECT_OPS=y CONFIG_SWIOTLB=y CONFIG_SGL_ALLOC=y CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_CORDIC is not set # CONFIG_DDR is not set # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_ARCH_HAS_SG_CHAIN=y CONFIG_SBITMAP=y # CONFIG_STRING_SELFTEST is not set # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_TIME_FROM_ARM_ARCH_TIMER is not set # CONFIG_PRINTK_PROCESS is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y # # Compile-time checks and compiler options # CONFIG_DEBUG_INFO=y # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_INFO_SPLIT is not set # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_GDB_SCRIPTS is not set CONFIG_ENABLE_MUST_CHECK=y 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 CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_DEBUG_KERNEL=y # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_PAGE_REF is not set # CONFIG_DEBUG_RODATA_TEST is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_DEBUG_VM is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y CONFIG_CC_HAS_KASAN_GENERIC=y # CONFIG_KASAN is not set CONFIG_KASAN_STACK=1 CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_DEBUG_SHIRQ is not set # # Debug Lockups and Hangs # # CONFIG_SOFTLOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 CONFIG_SCHED_DEBUG=y CONFIG_SCHED_INFO=y CONFIG_SCHEDSTATS=y # CONFIG_SCHED_STACK_END_CHECK is not set # CONFIG_DEBUG_TIMEKEEPING is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set CONFIG_DEBUG_SPINLOCK=y # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set CONFIG_HAVE_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PI_LIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set CONFIG_DEBUG_CREDENTIALS=y # # RCU Debugging # # CONFIG_RCU_PERF_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=60 CONFIG_RCU_TRACE=y # CONFIG_RCU_EQS_DEBUG is not set # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set # CONFIG_LATENCYTOP is not set CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y # CONFIG_PREEMPTIRQ_EVENTS is not set # CONFIG_IRQSOFF_TRACER is not set # CONFIG_SCHED_TRACER is not set # CONFIG_HWLAT_TRACER is not set # CONFIG_FTRACE_SYSCALLS is not set # CONFIG_TRACER_SNAPSHOT is not set CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set # CONFIG_STACK_TRACER is not set CONFIG_BLK_DEV_IO_TRACE=y CONFIG_UPROBE_EVENTS=y CONFIG_PROBE_EVENTS=y CONFIG_DYNAMIC_FTRACE=y # CONFIG_FUNCTION_PROFILER is not set CONFIG_FTRACE_MCOUNT_RECORD=y # CONFIG_FTRACE_STARTUP_TEST is not set # CONFIG_HIST_TRIGGERS is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_PREEMPTIRQ_DELAY_TEST is not set # CONFIG_TRACE_EVAL_MAP_FILE is not set CONFIG_TRACING_EVENTS_GPIO=y # CONFIG_DMA_API_DEBUG is not set CONFIG_RUNTIME_TESTING_MENU=y CONFIG_LKDTM=y # CONFIG_TEST_LIST_SORT is not set # CONFIG_TEST_SORT is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_RBTREE_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_BITFIELD is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_OVERFLOW is not set # CONFIG_TEST_RHASHTABLE is not set # CONFIG_TEST_HASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_FIND_BIT_BENCHMARK is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_SYSCTL is not set # CONFIG_TEST_UDELAY is not set # CONFIG_TEST_STATIC_KEYS is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMINIT 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_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y CONFIG_STRICT_DEVMEM=y # CONFIG_IO_STRICT_DEVMEM is not set # CONFIG_ARM64_PTDUMP_DEBUGFS is not set # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set # CONFIG_DEBUG_WX is not set # CONFIG_DEBUG_ALIGN_RODATA is not set # CONFIG_ARM64_RELOC_TEST is not set # CONFIG_CORESIGHT is not set ================================================ FILE: projects/Rockchip/devices/OdroidM1/options ================================================ ################################################################################ # setup device defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) TARGET_KERNEL_ARCH="arm64" TARGET_PATCH_ARCH="aarch64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a55" TARGET_CPU_FLAGS="+crc+crypto+fp+simd" TARGET_FPU="fp-armv8" TARGET_FEATURES="64bit" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_PATCH_ARCH="aarch64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc" TARGET_FPU="crypto-neon-fp-armv8" TARGET_FEATURES="32bit" ;; esac # Kernel target KERNEL_TARGET="Image" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="" KERNEL_MAKE_EXTRACMD+=" rockchip/rk3568-odroid-m1.dtb" # Mali GPU family MALI_FAMILY="g52" OPENGLES="mali-bifrost" # kernel serial console EXTRA_CMDLINE="quiet console=ttyFIQ0,1500000 console=tty0 ssh pci=nomsi" LINUX="OdroidM1-4.19" UBOOT_SYSTEM="OdroidM1" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" FIRMWARE="wlan-firmware misc-firmware" #rockchip-firmware dvb-firmware # additional drivers to install: # for a list of additional drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="RTL8812AU" #RTL8192CU RTL8192DU RTL8192EU RTL8188EU RTL8812AU RTL8821CU" # driver addons to install: # for a list of additinoal drivers see packages/linux-driver-addons # Space separated list is supported, DRIVER_ADDONS="" #dvb-latest" # additional packages to install ADDITIONAL_PACKAGES="dtc u-boot-tools:host" # debug tty path DEBUG_TTY="/dev/ttyFIQ0" # SquashFS compression method (gzip / lzo / xz / zstd) SQUASHFS_COMPRESSION="lzo" # build and install PulseAudio support (yes / no) PULSEAUDIO_SUPPORT="yes" # build and install espeak support (yes / no) ESPEAK_SUPPORT="no" # build and install bluetooth support (yes / no) BLUETOOTH_SUPPORT="yes" # build and install Avahi (Zeroconf) daemon (yes / no) AVAHI_DAEMON="no" # build with UPnP support (yes / no) KODI_UPNP_SUPPORT="no" # build with NFS support (mounting nfs shares via the OS) (yes / no) NFS_SUPPORT="no" # build with Samba Client support (mounting samba shares via the OS) (yes / no) SAMBA_SUPPORT="yes" # build and install Samba Server (yes / no) SAMBA_SERVER="yes" # build and install SFTP Server (yes / no) SFTP_SERVER="yes" # build and install OpenVPN support (yes / no) OPENVPN_SUPPORT="no" # build and install diskmounter support (udevil) # this service provide auto mounting support for external drives in the # mediacenter also automount internally drives at boottime via udev (yes / no) UDEVIL="yes" # build and install exFAT fuse support (yes / no) EXFAT="yes" # build and install NTFS-3G fuse support (yes / no) NTFS3G="yes" # build and install hfs filesystem utilities (yes / no) HFSTOOLS="yes" # build and install remote support (yes / no) REMOTE_SUPPORT="no" # build and install CEC adapter support (yes / no) CEC_SUPPORT="no" # build and install CEC framework support (yes / no) CEC_FRAMEWORK_SUPPORT="no" # build and install iSCSI support - iscsistart (yes / no) ISCSI_SUPPORT="no" # build with swap support (yes / no) SWAP_SUPPORT="yes" # swap support enabled per default (yes / no) SWAP_ENABLED_DEFAULT="no" # swapfile size if SWAP_SUPPORT=yes in MB SWAPFILESIZE="300" # cron support (yes / no) CRON_SUPPORT="no" # Distribution Specific source location DISTRO_MIRROR="http://sources.libreelec.tv/mirror" DISTRO_SRC="http://sources.libreelec.tv/$LIBREELEC_VERSION" # Settings package name - blank if not required DISTRO_PKG_SETTINGS="" # IR remote protocols supported in default config IR_REMOTE_PROTOCOLS="" # IR remote keymaps supported in default config IR_REMOTE_KEYMAPS="" ================================================ FILE: projects/Rockchip/devices/OdroidM1/packages/dtc/package.mk ================================================ # 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) PKG_NAME="dtc" PKG_VERSION="1.6.1" PKG_SHA256="264d355e2e547a4964d55b83b113f89be1aea5e61dbe0547ab798d0fde2be180" PKG_LICENSE="GPL" PKG_SITE="https://git.kernel.org/pub/scm/utils/dtc/dtc.git/" PKG_URL="https://git.kernel.org/pub/scm/utils/dtc/dtc.git/snapshot/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="The Device Tree Compiler" PKG_TOOLCHAIN="make" PKG_MAKE_OPTS_TARGET="dtc fdtput fdtget libfdt" PKG_MAKE_OPTS_HOST="dtc fdtput fdtget libfdt" pre_make_host() { mkdir -p ${PKG_BUILD}/.${HOST_NAME} cp -a ${PKG_BUILD}/* ${PKG_BUILD}/.${HOST_NAME} cd ${PKG_BUILD}/.${HOST_NAME} } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp -P ${PKG_BUILD}/.${HOST_NAME}/dtc ${TOOLCHAIN}/bin cp -P ${PKG_BUILD}/.${HOST_NAME}/fdtput ${TOOLCHAIN}/bin cp -P ${PKG_BUILD}/.${HOST_NAME}/fdtget ${TOOLCHAIN}/bin mkdir -p ${TOOLCHAIN}/lib cp -P ${PKG_BUILD}/.${HOST_NAME}/libfdt/{libfdt.so,libfdt.so.1} ${TOOLCHAIN}/lib } pre_make_target() { mkdir -p ${PKG_BUILD}/.${TARGET_NAME} cp -a ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME} cd ${PKG_BUILD}/.${TARGET_NAME} } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -P ${PKG_BUILD}/.${TARGET_NAME}/dtc ${INSTALL}/usr/bin cp -P ${PKG_BUILD}/.${TARGET_NAME}/fdtput ${INSTALL}/usr/bin/ cp -P ${PKG_BUILD}/.${TARGET_NAME}/fdtget ${INSTALL}/usr/bin/ mkdir -p ${INSTALL}/usr/lib cp -P ${PKG_BUILD}/.${TARGET_NAME}/libfdt/{libfdt.so,libfdt.so.1} ${INSTALL}/usr/lib/ } ================================================ FILE: projects/Rockchip/devices/OdroidM1/packages/dtc/patches/dtc-0001-libfdt-soname-version.patch ================================================ diff --git a/libfdt/Makefile.libfdt b/libfdt/Makefile.libfdt index e546397..dd71746 100644 --- a/libfdt/Makefile.libfdt +++ b/libfdt/Makefile.libfdt @@ -10,7 +10,7 @@ LIBFDT_VERSION = version.lds LIBFDT_SRCS = fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c fdt_empty_tree.c \ fdt_addresses.c fdt_overlay.c fdt_check.c LIBFDT_OBJS = $(LIBFDT_SRCS:%.c=%.o) -LIBFDT_LIB = libfdt-$(DTC_VERSION).$(SHAREDLIB_EXT) +LIBFDT_LIB = libfdt.$(SHAREDLIB_EXT) libfdt_clean: @$(VECHO) CLEAN "(libfdt)" ================================================ FILE: projects/Rockchip/devices/OdroidM1/packages/enable-oga-sleep/package.mk ================================================ PKG_NAME="enable-oga-sleep" PKG_VERSION="" PKG_SHA256="" PKG_ARCH="any" PKG_LICENSE="OSS" PKG_DEPENDS_TARGET="systemd" PKG_SITE="" PKG_URL="" PKG_LONGDESC="Sleep configuration" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p $INSTALL/usr/config/sleep.conf.d cp sleep.conf $INSTALL/usr/config/sleep.conf.d/sleep.conf mkdir -p $INSTALL/usr/lib/systemd/system-sleep/ cp sleep.sh $INSTALL/usr/lib/systemd/system-sleep/sleep } ================================================ FILE: projects/Rockchip/devices/OdroidM1/packages/enable-oga-sleep/sources/sleep.conf ================================================ # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # # Entries in this file show the compile time defaults. # You can change settings by editing this file. # Defaults can be restored by simply deleting this file. # # See systemd-sleep.conf(5) for details [Sleep] AllowSuspend=yes #AllowHibernation=yes #AllowSuspendThenHibernate=yes #AllowHybridSleep=yes #SuspendMode=suspend SuspendState=mem standby freeze #HibernateMode=platform shutdown #HibernateState=disk #HybridSleepMode=suspend platform shutdown #HybridSleepState=disk #HibernateDelaySec=180min ================================================ FILE: projects/Rockchip/devices/OdroidM1/packages/enable-oga-sleep/sources/sleep.sh ================================================ #!/bin/bash OGA=$(cat /proc/device-tree/compatible) case $1 in pre) # unload esp8090 WiFi module [[ "${OGA}" == *"v11"* ]] && modprobe -r esp8089 # Store sound state. Try to avoid having max volume after resume alsactl store -f /tmp/asound.state # workaround until dwc2 is fixed modprobe -r dwc2 # stop hotkey service systemctl stop odroidgoa-headphones.service ;; post) # Restore pre-sleep sound state alsactl restore -f /tmp/asound.state # workaround until dwc2 is fixed modprobe -r dwc2 modprobe -i dwc2 # re-load WiFi module [[ "${OGA}" == *"v11"* ]] && modprobe esp8089 # re-detect and reapply sound, brightness and hp state systemctl start odroidgoa-headphones.service ;; esac ================================================ FILE: projects/Rockchip/devices/OdroidM1/packages/odroidgoa-utils/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="odroidgoa-utils" PKG_VERSION="" PKG_SHA256="" PKG_ARCH="any" PKG_LICENSE="OSS" PKG_DEPENDS_TARGET="toolchain python-evdev enable-oga-sleep usb-modeswitch light retrorun" PKG_SITE="" PKG_URL="" PKG_LONGDESC="Support scripts for the ODROID-GO Advance" PKG_TOOLCHAIN="manual" if [ "${ARCH}" = "aarch64" ]; then PKG_DEPENDS_TARGET+=" lib32-retrorun" fi makeinstall_target() { mkdir -p $INSTALL/usr/bin cp * $INSTALL/usr/bin } post_install() { enable_service odroidgoa-hotkeys.service enable_service odroidgoa-headphones.service } ================================================ FILE: projects/Rockchip/devices/OdroidM1/packages/odroidgoa-utils/sources/headphone_sense.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile # Switch to headphones if we have them already connected at boot GPIO=$(cat /sys/class/gpio/gpio86/value) [[ "$GPIO" == "1" ]] && set_ee_setting "audio.device" "headphone" || set_ee_setting "audio.device" "speakers" if [ -e "/emuelec/configs/emuelec.conf" ]; then /usr/bin/odroidgoa_utils.sh setaudio $(get_ee_setting "audio.device") /usr/bin/odroidgoa_utils.sh vol $(get_ee_setting "audio.volume") /usr/bin/odroidgoa_utils.sh bright $(get_ee_setting "brightness.level") fi # Headphone sensing DEVICE='/dev/input/event1' HP_ON='*(SW_HEADPHONE_INSERT), value 0*' HP_OFF='*(SW_HEADPHONE_INSERT), value 1*' evtest "${DEVICE}" | while read line; do case $line in (${HP_ON}) amixer cset name='Playback Path' HP set_ee_setting "audio.device" "headphone" ;; (${HP_OFF}) amixer cset name='Playback Path' SPK set_ee_setting "audio.device" "speakers" ;; esac done ================================================ FILE: projects/Rockchip/devices/OdroidM1/packages/odroidgoa-utils/sources/odroidgoa_utils.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # THESE NEEDS TO BE CLEANED UP, MAYBE WITH CASE OR FUNCTIONS # Source predefined functions and variables . /etc/profile if [ "${1}" == "toggleaudio" ];then # Toggle audio output CURRENTAUDIO=$(get_ee_setting "audio.device") case "${CURRENTAUDIO}" in "headphone") echo "setting speakers" amixer cset name='Playback Path' SPK set_ee_setting "audio.device" "speakers" ;; "auto"|"speakers"|*) echo "setting headphones" amixer cset name='Playback Path' HP set_ee_setting "audio.device" "headphone" ;; esac fi if [ "${1}" == "setaudio" ];then # Set audio output second parameter is either headphones or speakers case "${2}" in "headphone") echo "setting headphones" amixer cset name='Playback Path' HP set_ee_setting "audio.device" "headphone" ;; "auto"|"speakers"|*) echo "setting speakers" amixer cset name='Playback Path' SPK set_ee_setting "audio.device" "speakers" ;; esac fi if [ "${1}" == "vol" ];then VOLSTEP=5 CURRENTVOL=$(get_ee_setting "audio.volume") MAXVOL=100 MINVOL=0 if [ "${2}" == "+" ]; then STEPVOL=$(($CURRENTVOL+$VOLSTEP)) elif [ "${2}" == "-" ]; then STEPVOL=$(($CURRENTVOL-$VOLSTEP)) else STEPVOL=${2} fi [ "$STEPVOL" -ge "$MAXVOL" ] && STEPVOL="$MAXVOL" [ "$STEPVOL" -le "$MINVOL" ] && STEPVOL="$MINVOL" amixer set 'Playback' ${STEPVOL}% set_ee_setting "audio.volume" ${STEPVOL} fi if [ "${1}" == "bright" ]; then STEPS="5" CURBRIGHT=$(cat /sys/class/backlight/backlight/brightness) MAXSYSBRIGHT=$(cat /sys/class/backlight/backlight/max_brightness) CURRENTBRIGHT=$(awk -v a="$CURBRIGHT" -v b="$MAXSYSBRIGHT" 'BEGIN{print int((a*100/b)+0.5)}') MAXBRIGHT="100" MINBRIGHT="5" if [ "${2}" == "+" ]; then STEPBRIGHT=$(($CURRENTBRIGHT+$STEPS)) elif [ "${2}" == "-" ]; then STEPBRIGHT=$(($CURRENTBRIGHT-$STEPS)) else STEPBRIGHT=${2} fi [ "$STEPBRIGHT" -ge "$MAXBRIGHT" ] && STEPBRIGHT="$MAXBRIGHT" [ "$STEPBRIGHT" -le "$MINBRIGHT" ] && STEPBRIGHT="$MINBRIGHT" #echo "Setting bright to $STEPBRIGHT" NEWVAL=$(awk -v a="$STEPBRIGHT" -v b="$MAXSYSBRIGHT" 'BEGIN{print int((a*b/100)+0.5)}') echo "${NEWVAL}" > /sys/class/backlight/backlight/brightness set_ee_setting "brightness.level" $STEPBRIGHT fi if [ "${1}" == "oga_oc" ]; then case ${2} in "1.4ghz") gov="userspace" freq="1416000" ;; "1.5ghz") gov="userspace" freq="1512000" ;; *) gov="performance" freq="1296000" ;; esac echo ${gov} > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor echo ${freq} > /sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed echo ${freq} > /sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq fi ================================================ FILE: projects/Rockchip/devices/OdroidM1/packages/odroidgoa-utils/sources/oga_events.py ================================================ #!/usr/bin/env python3 import evdev import asyncio import time import os.path from subprocess import check_output pwrkey = evdev.InputDevice("/dev/input/event0") if os.path.exists("/dev/input/by-path/platform-odroidgo3-joypad-event-joystick"): odroidgo_joypad = evdev.InputDevice("/dev/input/by-path/platform-odroidgo3-joypad-event-joystick") devicename = "GO-Super Gamepad" odroidgo_volume = evdev.InputDevice("/dev/input/by-path/platform-odroidgo3-keys-event") else: odroidgo_joypad = evdev.InputDevice("/dev/input/by-path/platform-odroidgo2-joypad-event-joystick") devicename = "GO-Advance Gamepad" need_to_swallow_pwr_key = False # After a resume, we swallow the pwr input that triggered the resume class Power: pwr = 116 class Joypad: l1 = 310 r1 = 311 up = 544 down = 545 left = 546 right = 547 f1 = 704 f2 = 705 f5 = 708 volu = 115 vold = 114 def runcmd(cmd, *args, **kw): print(f">>> {cmd}") check_output(cmd, *args, **kw) async def handle_event(device): async for event in device.async_read_loop(): global need_to_swallow_pwr_key if device.name == "rk8xx_pwrkey": keys = odroidgo_joypad.active_keys() if event.value == 1 and event.code == Power.pwr: # pwr on release if need_to_swallow_pwr_key == False: need_to_swallow_pwr_key = True if Joypad.f5 in keys: runcmd("/bin/systemctl poweroff || true", shell=True) else: runcmd("/bin/systemctl suspend || true", shell=True) else: need_to_swallow_pwr_key = False elif device.name == "odroidgo3-keys": keys = odroidgo_volume.active_keys() if event.value == 1: if Joypad.volu in keys: runcmd("/usr/bin/odroidgoa_utils.sh vol +", shell=True) elif Joypad.vold in keys: runcmd("/usr/bin/odroidgoa_utils.sh vol -", shell=True) elif device.name.find(devicename) != -1: keys = odroidgo_joypad.active_keys() print(keys) if event.value == 1 and Joypad.f5 in keys: if event.code == Joypad.up: runcmd("/usr/bin/odroidgoa_utils.sh vol +", shell=True) elif event.code == Joypad.down: runcmd("/usr/bin/odroidgoa_utils.sh vol -", shell=True) elif event.code == Joypad.right: runcmd("/usr/bin/odroidgoa_utils.sh bright +", shell=True) elif event.code == Joypad.left: runcmd("/usr/bin/odroidgoa_utils.sh bright -", shell=True) elif event.code == Joypad.r1: runcmd("/usr/bin/odroidgoa_utils.sh toggleaudio", shell=True) if event.code != 0: print(device.name, event) time.sleep(0.001) def run(): asyncio.ensure_future(handle_event(pwrkey)) asyncio.ensure_future(handle_event(odroidgo_joypad)) if os.path.exists("/dev/input/by-path/platform-odroidgo3-joypad-event-joystick"): asyncio.ensure_future(handle_event(odroidgo_volume)) loop = asyncio.get_event_loop() loop.run_forever() if __name__ == "__main__": # admire run() ================================================ FILE: projects/Rockchip/devices/OdroidM1/packages/odroidgoa-utils/system.d/odroidgoa-headphones.service ================================================ [Unit] Description=Odroid Go Advance Headphone Sense ConditionPathExists=/dev/input/event1 Before=emuelec.target [Service] Environment=HOME=/storage EnvironmentFile=/storage/.config/emulationstation/scripts/es_env.sh ExecStart=/usr/bin/headphone_sense.sh Restart=on-failure [Install] WantedBy=multi-user.target ================================================ FILE: projects/Rockchip/devices/OdroidM1/packages/odroidgoa-utils/system.d/odroidgoa-hotkeys.service ================================================ [Unit] Description=Odroid Go Advance Hotkeys ConditionPathExists=/dev/input/event0 ConditionPathExists=/dev/input/event2 Before=emuelec.target [Service] Environment=HOME=/storage EnvironmentFile=/storage/.config/emulationstation/scripts/es_env.sh ExecStart=/usr/bin/oga_events.py Type=simple [Install] WantedBy=multi-user.target ================================================ FILE: projects/Rockchip/devices/OdroidM1/packages/rkbin/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rkbin" PKG_VERSION="bcab36925d63303514de496dc46767760e8b4511" PKG_SHA256="11749b4957a8544172066b6234c35eeee084f1bb2c31c59fa0aeda6805982662" PKG_ARCH="arm aarch64" PKG_LICENSE="nonfree" PKG_SITE="https://github.com/hardkernel/rk3568_rkbin" PKG_URL="https://github.com/hardkernel/rk3568_rkbin/archive/$PKG_VERSION.tar.gz" PKG_LONGDESC="rkbin: Rockchip Firmware and Tool Binaries" PKG_TOOLCHAIN="manual" ================================================ FILE: projects/Rockchip/devices/OdroidM1/packages/u-boot-tools/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="u-boot-tools" PKG_VERSION="2022.07" PKG_SHA256="92b08eb49c24da14c1adbf70a71ae8f37cc53eeb4230e859ad8b6733d13dcf5e" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_URL="https://ftp.denx.de/pub/u-boot/u-boot-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_HOST="ccache:host bison:host flex:host openssl:host pkg-config:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." make_host() { make qemu-x86_64_defconfig HOSTCC="${HOST_CC}" HOSTCFLAGS="-I${TOOLCHAIN}/include" HOSTLDFLAGS="${HOST_LDFLAGS}" make tools-only HOSTCC="${HOST_CC}" HOSTCFLAGS="-I${TOOLCHAIN}/include" HOSTLDFLAGS="${HOST_LDFLAGS}" } make_target() { : # host-only package } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp tools/mkimage ${TOOLCHAIN}/bin } ================================================ FILE: projects/Rockchip/devices/RK3288/README.md ================================================ # RK3288 This is a SoC device for RK3288 **Build** * `PROJECT=Rockchip DEVICE=RK3288 ARCH=arm UBOOT_SYSTEM=miqi make image` * `PROJECT=Rockchip DEVICE=RK3288 ARCH=arm UBOOT_SYSTEM=tinker make image` ================================================ FILE: projects/Rockchip/devices/RK3288/bootloader/config ================================================ CONFIG_BOOTDELAY=1 # CONFIG_DM_VIDEO is not set # CONFIG_DISPLAY is not set # CONFIG_ENV_IS_IN_MMC is not set # CONFIG_NET_RANDOM_ETHADDR is not set # CONFIG_USB_KEYBOARD is not set # CONFIG_FIT is not set # CONFIG_FIT_VERBOSE is not set # CONFIG_SPL_LOAD_FIT is not set # CONFIG_SPL_OPTEE_IMAGE # CONFIG_TPL_DRIVERS_MISC is not set # CONFIG_SPL_TEXT_BASE is not set # CONFIG_SPL_ROCKCHIP_BACK_TO_BROM is not set CONFIG_SPL_TEXT_BASE=0x0 CONFIG_MISC=y CONFIG_MISC_INIT_R=y CONFIG_ROCKCHIP_EFUSE=y CONFIG_SHA256=y CONFIG_TPL=y CONFIG_SPL_SIZE_LIMIT=0x4b000 CONFIG_SYS_TEXT_BASE=0x01000000 ================================================ FILE: projects/Rockchip/devices/RK3288/filesystem/usr/bin/cputemp ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) TEMP="$(cat /sys/class/thermal/thermal_zone0/temp)" echo "$(( $TEMP / 1000 )) C" ================================================ FILE: projects/Rockchip/devices/RK3288/filesystem/usr/bin/gputemp ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) TEMP="$(cat /sys/class/thermal/thermal_zone1/temp)" echo "$(( $TEMP / 1000 )) C" ================================================ FILE: projects/Rockchip/devices/RK3288/linux/default/linux.arm.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm 6.1.63 Kernel Configuration # CONFIG_CC_VERSION_TEXT="armv7ve-libreelec-linux-gnueabihf-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_LZMA=y CONFIG_HAVE_KERNEL_XZ=y CONFIG_HAVE_KERNEL_LZO=y CONFIG_HAVE_KERNEL_LZ4=y # CONFIG_KERNEL_GZIP is not set # CONFIG_KERNEL_LZMA is not set # CONFIG_KERNEL_XZ is not set # CONFIG_KERNEL_LZO is not set CONFIG_KERNEL_LZ4=y CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_IRQ_IPI=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_GENERIC_IRQ_MULTI_HANDLER=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_CONTEXT_TRACKING=y CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y # CONFIG_BPF_JIT is not set # CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_BPF_PRELOAD is not set # end of BPF subsystem CONFIG_PREEMPT_VOLUNTARY_BUILD=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_SCHED_AVG_IRQ=y CONFIG_SCHED_THERMAL_PRESSURE=y CONFIG_BSD_PROCESS_ACCT=y CONFIG_BSD_PROCESS_ACCT_V3=y CONFIG_TASKSTATS=y CONFIG_TASK_DELAY_ACCT=y CONFIG_TASK_XACCT=y CONFIG_TASK_IO_ACCOUNTING=y # CONFIG_PSI is not set # end of CPU/Task time and stats accounting CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=17 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 # CONFIG_PRINTK_INDEX is not set CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # # CONFIG_UCLAMP_TASK is not set # end of Scheduler features CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set CONFIG_CGROUP_PIDS=y # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y # CONFIG_CGROUP_MISC is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y CONFIG_CHECKPOINT_RESTORE=y CONFIG_SCHED_AUTOGROUP=y # CONFIG_SYSFS_DEPRECATED is not set # CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 # CONFIG_RD_GZIP is not set # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set # CONFIG_RD_LZ4 is not set CONFIG_RD_ZSTD=y # CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set CONFIG_INITRAMFS_COMPRESSION_NONE=y # CONFIG_BOOT_CONFIG is not set CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y # CONFIG_EXPERT is not set CONFIG_UID16=y CONFIG_MULTIUSER=y CONFIG_SYSFS_SYSCALL=y CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y 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 CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_EMBEDDED is not set CONFIG_HAVE_PERF_EVENTS=y CONFIG_PERF_USE_VMALLOC=y # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_SYSTEM_DATA_VERIFICATION=y # CONFIG_PROFILING is not set CONFIG_TRACEPOINTS=y # end of General setup CONFIG_ARM=y CONFIG_ARM_HAS_GROUP_RELOCS=y CONFIG_ARM_DMA_USE_IOMMU=y CONFIG_ARM_DMA_IOMMU_ALIGNMENT=8 CONFIG_SYS_SUPPORTS_APM_EMULATION=y CONFIG_HAVE_PROC_CPU=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_LOCKDEP_SUPPORT=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_ARM_PATCH_PHYS_VIRT=y CONFIG_GENERIC_BUG=y CONFIG_PGTABLE_LEVELS=2 # # System Type # CONFIG_MMU=y CONFIG_ARCH_MMAP_RND_BITS_MIN=8 CONFIG_ARCH_MMAP_RND_BITS_MAX=16 CONFIG_ARCH_MULTIPLATFORM=y # # Platform selection # # # CPU Core family selection # # CONFIG_ARCH_MULTI_V6 is not set CONFIG_ARCH_MULTI_V7=y CONFIG_ARCH_MULTI_V6_V7=y # end of Platform selection # CONFIG_ARCH_VIRT is not set # CONFIG_ARCH_AIROHA is not set # CONFIG_ARCH_ACTIONS is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_ARTPEC is not set # CONFIG_ARCH_ASPEED is not set # CONFIG_ARCH_AT91 is not set # CONFIG_ARCH_BCM is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_DIGICOLOR is not set # CONFIG_ARCH_DOVE is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_HIGHBANK is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_HPE is not set # CONFIG_ARCH_MXC is not set # 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_MSTARV7 is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_NPCM is not set # # TI OMAP/AM/DM/DRA Family # # CONFIG_ARCH_OMAP3 is not set # CONFIG_ARCH_OMAP4 is not set # CONFIG_SOC_OMAP5 is not set # CONFIG_SOC_AM33XX is not set # CONFIG_SOC_AM43XX is not set # CONFIG_SOC_DRA7XX is not set # end of TI OMAP/AM/DM/DRA Family # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_RDA is not set # CONFIG_ARCH_REALTEK is not set CONFIG_ARCH_ROCKCHIP=y # CONFIG_ARCH_S5PV210 is not set # CONFIG_ARCH_RENESAS is not set # CONFIG_ARCH_INTEL_SOCFPGA is not set # CONFIG_PLAT_SPEAR is not set # CONFIG_ARCH_STI is not set # CONFIG_ARCH_STM32 is not set # CONFIG_ARCH_SUNPLUS is not set # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_U8500 is not set # CONFIG_ARCH_REALVIEW is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_WM8850 is not set # CONFIG_ARCH_ZYNQ is not set # # Processor Type # CONFIG_CPU_V7=y CONFIG_CPU_THUMB_CAPABLE=y CONFIG_CPU_32v6K=y CONFIG_CPU_32v7=y CONFIG_CPU_ABRT_EV7=y CONFIG_CPU_PABRT_V7=y CONFIG_CPU_CACHE_V7=y CONFIG_CPU_CACHE_VIPT=y CONFIG_CPU_COPY_V6=y CONFIG_CPU_TLB_V7=y CONFIG_CPU_HAS_ASID=y CONFIG_CPU_CP15=y CONFIG_CPU_CP15_MMU=y # # Processor Features # # CONFIG_ARM_LPAE is not set CONFIG_ARM_THUMB=y CONFIG_ARM_THUMBEE=y CONFIG_ARM_VIRT_EXT=y CONFIG_SWP_EMULATE=y CONFIG_CPU_LITTLE_ENDIAN=y # CONFIG_CPU_BIG_ENDIAN is not set # CONFIG_CPU_ICACHE_DISABLE is not set # CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND is not set # CONFIG_CPU_BPREDICT_DISABLE is not set CONFIG_CPU_SPECTRE=y CONFIG_HARDEN_BRANCH_PREDICTOR=y CONFIG_HARDEN_BRANCH_HISTORY=y CONFIG_KUSER_HELPERS=y CONFIG_VDSO=y CONFIG_OUTER_CACHE=y CONFIG_OUTER_CACHE_SYNC=y CONFIG_MIGHT_HAVE_CACHE_L2X0=y CONFIG_CACHE_L2X0=y # CONFIG_CACHE_L2X0_PMU is not set # CONFIG_PL310_ERRATA_588369 is not set # CONFIG_PL310_ERRATA_727915 is not set # CONFIG_PL310_ERRATA_753970 is not set # CONFIG_PL310_ERRATA_769419 is not set CONFIG_ARM_L1_CACHE_SHIFT_6=y CONFIG_ARM_L1_CACHE_SHIFT=6 CONFIG_ARM_DMA_MEM_BUFFERABLE=y CONFIG_ARM_HEAVY_MB=y CONFIG_DEBUG_ALIGN_RODATA=y # CONFIG_ARM_ERRATA_430973 is not set CONFIG_ARM_ERRATA_643719=y # CONFIG_ARM_ERRATA_720789 is not set # CONFIG_ARM_ERRATA_754322 is not set # CONFIG_ARM_ERRATA_754327 is not set # CONFIG_ARM_ERRATA_764369 is not set # CONFIG_ARM_ERRATA_764319 is not set # CONFIG_ARM_ERRATA_775420 is not set # CONFIG_ARM_ERRATA_798181 is not set # CONFIG_ARM_ERRATA_773022 is not set # CONFIG_ARM_ERRATA_818325_852422 is not set # CONFIG_ARM_ERRATA_821420 is not set # CONFIG_ARM_ERRATA_825619 is not set # CONFIG_ARM_ERRATA_857271 is not set # CONFIG_ARM_ERRATA_852421 is not set # CONFIG_ARM_ERRATA_852423 is not set # CONFIG_ARM_ERRATA_857272 is not set # end of System Type # # Bus support # # CONFIG_ARM_ERRATA_814220 is not set # end of Bus support # # Kernel Features # CONFIG_HAVE_SMP=y CONFIG_SMP=y CONFIG_SMP_ON_UP=y CONFIG_CURRENT_POINTER_IN_TPIDRURO=y CONFIG_IRQSTACKS=y CONFIG_ARM_CPU_TOPOLOGY=y # CONFIG_SCHED_MC is not set # CONFIG_SCHED_SMT is not set CONFIG_HAVE_ARM_SCU=y CONFIG_HAVE_ARM_ARCH_TIMER=y CONFIG_HAVE_ARM_TWD=y # CONFIG_MCPM is not set # CONFIG_BIG_LITTLE is not set CONFIG_VMSPLIT_3G=y # CONFIG_VMSPLIT_3G_OPT is not set # CONFIG_VMSPLIT_2G is not set # CONFIG_VMSPLIT_1G is not set CONFIG_PAGE_OFFSET=0xC0000000 CONFIG_NR_CPUS=4 CONFIG_HOTPLUG_CPU=y # CONFIG_ARM_PSCI is not set CONFIG_ARCH_NR_GPIO=288 CONFIG_HZ_FIXED=0 # CONFIG_HZ_100 is not set # CONFIG_HZ_200 is not set # CONFIG_HZ_250 is not set CONFIG_HZ_300=y # CONFIG_HZ_500 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=300 CONFIG_SCHED_HRTICK=y # CONFIG_THUMB2_KERNEL is not set CONFIG_ARM_PATCH_IDIV=y CONFIG_AEABI=y # CONFIG_OABI_COMPAT is not set CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ARCH_FLATMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_HIGHMEM=y CONFIG_HIGHPTE=y CONFIG_CPU_SW_DOMAIN_PAN=y CONFIG_HW_PERF_EVENTS=y # CONFIG_ARM_MODULE_PLTS is not set CONFIG_ARCH_FORCE_MAX_ORDER=11 CONFIG_ALIGNMENT_TRAP=y # CONFIG_UACCESS_WITH_MEMCPY is not set # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_XEN is not set CONFIG_CC_HAVE_STACKPROTECTOR_TLS=y CONFIG_STACKPROTECTOR_PER_TASK=y # end of Kernel Features # # Boot options # CONFIG_USE_OF=y CONFIG_ATAGS=y # CONFIG_UNUSED_BOARD_FILES is not set # CONFIG_DEPRECATED_PARAM_STRUCT is not set CONFIG_ZBOOT_ROM_TEXT=0 CONFIG_ZBOOT_ROM_BSS=0 CONFIG_ARM_APPENDED_DTB=y CONFIG_ARM_ATAG_DTB_COMPAT=y CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y # CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND is not set CONFIG_CMDLINE="" # CONFIG_KEXEC is not set # CONFIG_CRASH_DUMP is not set CONFIG_AUTO_ZRELADDR=y # CONFIG_EFI is not set # end of Boot options # # CPU Power Management # # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=m CONFIG_CPU_FREQ_GOV_USERSPACE=m CONFIG_CPU_FREQ_GOV_ONDEMAND=y CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y CONFIG_CPUFREQ_DT_PLATDEV=y # CONFIG_ARM_SCPI_CPUFREQ is not set # CONFIG_ARM_SCMI_CPUFREQ is not set # end of CPU Frequency scaling # # CPU Idle # 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 # # ARM CPU Idle Drivers # CONFIG_ARM_CPUIDLE=y # end of ARM CPU Idle Drivers # end of CPU Idle # end of CPU Power Management # # Floating point emulation # # # At least one emulation must be selected # CONFIG_VFP=y CONFIG_VFPv3=y CONFIG_NEON=y CONFIG_KERNEL_MODE_NEON=y # end of Floating point emulation # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_USERSPACE_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y # CONFIG_PM_DEBUG is not set # CONFIG_APM_EMULATION is not set CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_PM_GENERIC_DOMAINS_SLEEP=y CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ARM_CPU_SUSPEND=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y # end of Power management options CONFIG_AS_VFP_VMRS_FPINST=y # # General architecture-dependent options # # CONFIG_KPROBES is not set # CONFIG_JUMP_LABEL is not set CONFIG_UPROBES=y CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_ARCH_USE_BUILTIN_BSWAP=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_KEEPINITRD=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_CPU_FINALIZE_INIT=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_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_LTO_NONE=y CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_REL=y CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=8 CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_HAVE_ARCH_PFN_VALID=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_GZIP is not set # CONFIG_MODULE_COMPRESS_XZ is not set # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y # CONFIG_BLOCK_LEGACY_AUTOLOAD is not set CONFIG_BLK_CGROUP_RWSTAT=y CONFIG_BLK_DEV_BSG_COMMON=y # CONFIG_BLK_DEV_BSGLIB is not set # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_DEV_THROTTLING_LOW is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_CGROUP_IOLATENCY is not set # CONFIG_BLK_CGROUP_IOCOST is not set # CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set CONFIG_LDM_PARTITION=y # CONFIG_LDM_DEBUG is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set # end of Partition Types CONFIG_BLK_MQ_VIRTIO=y CONFIG_BLK_PM=y CONFIG_BLOCK_HOLDER_DEPRECATED=y CONFIG_BLK_MQ_STACKING=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y # CONFIG_IOSCHED_BFQ is not set # end of IO Schedulers CONFIG_ASN1=y CONFIG_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_INLINE_READ_UNLOCK=y CONFIG_INLINE_READ_UNLOCK_IRQ=y CONFIG_INLINE_WRITE_UNLOCK=y CONFIG_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_ELF_FDPIC is not set CONFIG_ELFCORE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y CONFIG_ARCH_HAS_BINFMT_FLAT=y # CONFIG_BINFMT_FLAT is not set CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # CONFIG_SWAP=y # CONFIG_ZSWAP is not set # # SLAB allocator options # # CONFIG_SLAB is not set CONFIG_SLUB=y CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y # end of SLAB allocator options # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set CONFIG_COMPAT_BRK=y CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_ARCH_KEEP_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_COMPACTION=y CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 # CONFIG_PAGE_REPORTING is not set CONFIG_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_BOUNCE=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set # CONFIG_CMA_DEBUGFS is not set # CONFIG_CMA_SYSFS is not set CONFIG_CMA_AREAS=7 CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set CONFIG_KMAP_LOCAL=y CONFIG_KMAP_LOCAL_NON_LINEAR_PTE_ARRAY=y # CONFIG_ANON_VMA_NAME is not set # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set CONFIG_LOCK_MM_AND_FIND_VMA=y # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y CONFIG_NET_INGRESS=y CONFIG_NET_EGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_INTERFACE is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_AH=m CONFIG_XFRM_ESP=y CONFIG_XFRM_IPCOMP=m # CONFIG_NET_KEY is not set # CONFIG_XDP_SOCKETS is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y CONFIG_IP_PNP_RARP=y # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=y # CONFIG_IP_MROUTE is not set # CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set CONFIG_INET_ESP=y # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=y CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_INET_UDP_DIAG is not set # CONFIG_INET_RAW_DIAG is not set # CONFIG_INET_DIAG_DESTROY is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y # CONFIG_IPV6_ROUTE_INFO is not set CONFIG_IPV6_OPTIMISTIC_DAD=y CONFIG_INET6_AH=m CONFIG_INET6_ESP=m # CONFIG_INET6_ESP_OFFLOAD is not set # CONFIG_INET6_ESPINTCP is not set CONFIG_INET6_IPCOMP=m CONFIG_IPV6_MIP6=m # CONFIG_IPV6_ILA is not set CONFIG_INET6_XFRM_TUNNEL=m CONFIG_INET6_TUNNEL=m # CONFIG_IPV6_VTI is not set CONFIG_IPV6_SIT=y # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y CONFIG_IPV6_TUNNEL=m CONFIG_IPV6_FOU=m CONFIG_IPV6_MULTIPLE_TABLES=y # CONFIG_IPV6_SUBTREES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set # CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NET_PTP_CLASSIFY=y # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_EGRESS=y CONFIG_NETFILTER_FAMILY_BRIDGE=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set # CONFIG_NETFILTER_NETLINK_LOG is not set # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=m # CONFIG_NF_LOG_SYSLOG is not set # CONFIG_NF_CONNTRACK_MARK is not set # CONFIG_NF_CONNTRACK_ZONES is not set # CONFIG_NF_CONNTRACK_PROCFS is not set # CONFIG_NF_CONNTRACK_EVENTS is not set # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set # CONFIG_NF_CONNTRACK_IRC is not set # CONFIG_NF_CONNTRACK_NETBIOS_NS is not set # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set # CONFIG_NF_CONNTRACK_SIP is not set CONFIG_NF_CONNTRACK_TFTP=m # CONFIG_NF_CT_NETLINK is not set CONFIG_NF_NAT=m 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 # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set CONFIG_NETFILTER_XT_MATCH_IPVS=m # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_NETFILTER_XT_MATCH_OWNER is not set # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set # CONFIG_NETFILTER_XT_MATCH_STATE is not set # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set CONFIG_IP_VS=m # CONFIG_IP_VS_IPV6 is not set # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # CONFIG_IP_VS_PROTO_ESP is not set # CONFIG_IP_VS_PROTO_AH is not set # CONFIG_IP_VS_PROTO_SCTP is not set # # IPVS scheduler # CONFIG_IP_VS_RR=m # CONFIG_IP_VS_WRR is not set # CONFIG_IP_VS_LC is not set # CONFIG_IP_VS_WLC is not set # CONFIG_IP_VS_FO is not set # CONFIG_IP_VS_OVF is not set # CONFIG_IP_VS_LBLC is not set # CONFIG_IP_VS_LBLCR is not set # CONFIG_IP_VS_DH is not set # CONFIG_IP_VS_SH is not set # CONFIG_IP_VS_MH is not set # CONFIG_IP_VS_SED is not set # CONFIG_IP_VS_NQ is not set # CONFIG_IP_VS_TWOS is not set # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS MH scheduler # CONFIG_IP_VS_MH_TAB_INDEX=12 # # IPVS application helper # # CONFIG_IP_VS_FTP is not set CONFIG_IP_VS_NFCT=y # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set CONFIG_NF_REJECT_IPV4=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_ARPTABLES is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m # CONFIG_NF_LOG_IPV6 is not set CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_MATCH_SRH is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m # CONFIG_IP6_NF_TARGET_NPT is not set # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_CONNTRACK_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y # CONFIG_BRIDGE_MRP is not set # CONFIG_BRIDGE_CFM is not set CONFIG_NET_DSA=m # CONFIG_NET_DSA_TAG_AR9331 is not set CONFIG_NET_DSA_TAG_BRCM_COMMON=m CONFIG_NET_DSA_TAG_BRCM=m CONFIG_NET_DSA_TAG_BRCM_LEGACY=m CONFIG_NET_DSA_TAG_BRCM_PREPEND=m # CONFIG_NET_DSA_TAG_HELLCREEK is not set # CONFIG_NET_DSA_TAG_GSWIP is not set # CONFIG_NET_DSA_TAG_DSA is not set # CONFIG_NET_DSA_TAG_EDSA is not set # CONFIG_NET_DSA_TAG_MTK is not set # CONFIG_NET_DSA_TAG_KSZ is not set # CONFIG_NET_DSA_TAG_OCELOT is not set # CONFIG_NET_DSA_TAG_OCELOT_8021Q is not set # CONFIG_NET_DSA_TAG_QCA is not set # CONFIG_NET_DSA_TAG_RTL4_A is not set # CONFIG_NET_DSA_TAG_RTL8_4 is not set # CONFIG_NET_DSA_TAG_RZN1_A5PSW is not set # CONFIG_NET_DSA_TAG_LAN9303 is not set # CONFIG_NET_DSA_TAG_SJA1105 is not set # CONFIG_NET_DSA_TAG_TRAILER is not set # CONFIG_NET_DSA_TAG_XRS700X is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set # CONFIG_NET_SCH_FQ_CODEL is not set # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set # CONFIG_NET_SCH_DEFAULT is not set # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_FLOW is not set CONFIG_NET_CLS_CGROUP=m # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set CONFIG_NET_SWITCHDEV=y CONFIG_NET_L3_MASTER_DEV=y # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_STREAM_PARSER is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # end of Network testing # end of Networking options # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=m CONFIG_BT_BREDR=y # CONFIG_BT_RFCOMM is not set # CONFIG_BT_BNEP is not set # CONFIG_BT_HIDP is not set CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_LEDS is not set # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set CONFIG_BT_DEBUGFS=y # CONFIG_BT_SELFTEST is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_QCA=m CONFIG_BT_MTK=m CONFIG_BT_HCIBTUSB=m # CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set CONFIG_BT_HCIBTUSB_BCM=y # CONFIG_BT_HCIBTUSB_MTK is not set 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 is not set # CONFIG_BT_HCIUART_ATH3K is not set # CONFIG_BT_HCIUART_LL is not set CONFIG_BT_HCIUART_3WIRE=y # CONFIG_BT_HCIUART_INTEL is not set CONFIG_BT_HCIUART_BCM=y CONFIG_BT_HCIUART_RTL=y CONFIG_BT_HCIUART_QCA=y CONFIG_BT_HCIUART_AG6XX=y CONFIG_BT_HCIUART_MRVL=y CONFIG_BT_HCIBCM203X=m CONFIG_BT_HCIBPA10X=m CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIVHCI=m CONFIG_BT_MRVL=m CONFIG_BT_MRVL_SDIO=m CONFIG_BT_ATH3K=m # CONFIG_BT_MTKSDIO is not set CONFIG_BT_MTKUART=m CONFIG_BT_HCIRSI=m # CONFIG_BT_VIRTIO is not set # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_SPY=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set CONFIG_CFG80211_CRDA_SUPPORT=y CONFIG_CFG80211_WEXT=y CONFIG_LIB80211=m CONFIG_LIB80211_CRYPT_WEP=m CONFIG_LIB80211_CRYPT_CCMP=m # CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=m CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y CONFIG_RFKILL_GPIO=m # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_NET_DEVLINK=y CONFIG_PAGE_POOL=y # CONFIG_PAGE_POOL_STATS is not set CONFIG_FAILOVER=y CONFIG_ETHTOOL_NETLINK=y # # Device Drivers # CONFIG_ARM_AMBA=y CONFIG_HAVE_PCI=y # CONFIG_PCI is not set # CONFIG_PCCARD is not set # # Generic Driver Options # # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y # CONFIG_DEVTMPFS_SAFE is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set CONFIG_FW_CACHE=y # CONFIG_FW_UPLOAD is not set # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y CONFIG_ALLOW_DEV_COREDUMP=y CONFIG_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set CONFIG_GENERIC_ARCH_TOPOLOGY=y # end of Generic Driver Options # # Bus devices # # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_MOXTET is not set # CONFIG_VEXPRESS_CONFIG is not set # CONFIG_MHI_BUS is not set # CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # CONFIG_ARM_SCMI_PROTOCOL=y CONFIG_ARM_SCMI_HAVE_TRANSPORT=y CONFIG_ARM_SCMI_HAVE_SHMEM=y CONFIG_ARM_SCMI_TRANSPORT_MAILBOX=y # CONFIG_ARM_SCMI_TRANSPORT_VIRTIO is not set CONFIG_ARM_SCMI_POWER_DOMAIN=m # CONFIG_ARM_SCMI_POWER_CONTROL is not set # end of ARM System Control and Management Interface Protocol CONFIG_ARM_SCPI_PROTOCOL=m CONFIG_ARM_SCPI_POWER_DOMAIN=m # CONFIG_FW_CFG_SYSFS is not set # CONFIG_TRUSTED_FOUNDATIONS is not set # CONFIG_GOOGLE_FIRMWARE is not set CONFIG_HAVE_ARM_SMCCC=y # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set CONFIG_MTD=y # CONFIG_MTD_TESTS is not set # # Partition parsers # # CONFIG_MTD_AR7_PARTS is not set CONFIG_MTD_CMDLINE_PARTS=y CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AFS_PARTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set # end of Partition parsers # # User Modules And Translation Layers # CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y # # Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK. # # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # CONFIG_RFD_FTL is not set # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set # CONFIG_MTD_OOPS is not set # CONFIG_MTD_SWAP is not set # CONFIG_MTD_PARTITIONED_MASTER is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # end of RAM/ROM/Flash chip drivers # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_PLATRAM is not set # end of Mapping drivers for chip access # # Self-contained MTD device drivers # # CONFIG_MTD_DATAFLASH is not set # CONFIG_MTD_MCHP23K256 is not set # CONFIG_MTD_MCHP48L640 is not set # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLOCK2MTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOCG3 is not set # end of Self-contained MTD device drivers # # NAND # # CONFIG_MTD_ONENAND is not set # CONFIG_MTD_RAW_NAND is not set # CONFIG_MTD_SPI_NAND is not set # # ECC engine support # # CONFIG_MTD_NAND_ECC_SW_HAMMING is not set # CONFIG_MTD_NAND_ECC_SW_BCH is not set # CONFIG_MTD_NAND_ECC_MXIC is not set # end of ECC engine support # end of NAND # # LPDDR & LPDDR2 PCM memory drivers # # CONFIG_MTD_LPDDR is not set # CONFIG_MTD_LPDDR2_NVM is not set # end of LPDDR & LPDDR2 PCM memory drivers CONFIG_MTD_SPI_NOR=y CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y # CONFIG_MTD_SPI_NOR_SWP_DISABLE is not set CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y # CONFIG_MTD_SPI_NOR_SWP_KEEP is not set CONFIG_MTD_UBI=y CONFIG_MTD_UBI_WL_THRESHOLD=4096 CONFIG_MTD_UBI_BEB_LIMIT=20 # CONFIG_MTD_UBI_FASTMAP is not set # CONFIG_MTD_UBI_GLUEBI is not set # CONFIG_MTD_UBI_BLOCK is not set # CONFIG_MTD_HYPERBUS is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_DYNAMIC=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_RESERVED_MEM=y CONFIG_OF_RESOLVE=y CONFIG_OF_OVERLAY=y CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_CDROM=y # CONFIG_ZRAM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set CONFIG_VIRTIO_BLK=y # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_UBLK is not set # # NVME Support # # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set # CONFIG_NVME_TARGET is not set # end of NVME Support # # Misc devices # CONFIG_AD525X_DPOT=y CONFIG_AD525X_DPOT_I2C=y # CONFIG_AD525X_DPOT_SPI is not set # CONFIG_DUMMY_IRQ is not set CONFIG_ICS932S401=y # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HI6421V600_IRQ is not set CONFIG_APDS9802ALS=y CONFIG_ISL29003=y # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set # CONFIG_XILINX_SDFEC is not set # CONFIG_HISI_HIKEY_USB is not set # CONFIG_OPEN_DICE is not set # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set # # EEPROM support # CONFIG_EEPROM_AT24=y # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=y # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # CONFIG_ECHO is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_UACCE is not set # CONFIG_PVPANIC is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=m CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_SCAN_ASYNC is not set # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_VIRTIO is not set # CONFIG_SCSI_DH is not set # end of SCSI device support # CONFIG_ATA is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=m # CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m # CONFIG_DM_UNSTRIPED is not set # CONFIG_DM_CRYPT is not set # CONFIG_DM_SNAPSHOT is not set CONFIG_DM_THIN_PROVISIONING=m # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_ERA is not set # CONFIG_DM_CLONE is not set # CONFIG_DM_MIRROR is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_DUST is not set # CONFIG_DM_UEVENT is not set # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_DM_INTEGRITY is not set # CONFIG_TARGET_CORE is not set CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set CONFIG_DUMMY=m CONFIG_WIREGUARD=m # CONFIG_WIREGUARD_DEBUG is not set # CONFIG_EQUALIZER is not set # 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 # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_AMT is not set # CONFIG_MACSEC is not set # CONFIG_NETCONSOLE is not set CONFIG_TUN=m CONFIG_TAP=m # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m CONFIG_VIRTIO_NET=y CONFIG_NLMON=m # CONFIG_NET_VRF is not set # # Distributed Switch Architecture drivers # CONFIG_B53=m CONFIG_B53_SPI_DRIVER=m CONFIG_B53_MDIO_DRIVER=m CONFIG_B53_MMAP_DRIVER=m CONFIG_B53_SRAB_DRIVER=m # CONFIG_B53_SERDES is not set CONFIG_NET_DSA_BCM_SF2=m # CONFIG_NET_DSA_LOOP is not set # CONFIG_NET_DSA_LANTIQ_GSWIP is not set # CONFIG_NET_DSA_MT7530 is not set # CONFIG_NET_DSA_MV88E6060 is not set # CONFIG_NET_DSA_MICROCHIP_KSZ_COMMON is not set # CONFIG_NET_DSA_MV88E6XXX is not set # CONFIG_NET_DSA_AR9331 is not set # CONFIG_NET_DSA_QCA8K is not set # CONFIG_NET_DSA_SJA1105 is not set # CONFIG_NET_DSA_XRS700X_I2C is not set # CONFIG_NET_DSA_XRS700X_MDIO is not set # CONFIG_NET_DSA_REALTEK is not set # CONFIG_NET_DSA_SMSC_LAN9303_I2C is not set # CONFIG_NET_DSA_SMSC_LAN9303_MDIO is not set # CONFIG_NET_DSA_VITESSE_VSC73XX_SPI is not set # CONFIG_NET_DSA_VITESSE_VSC73XX_PLATFORM is not set # end of Distributed Switch Architecture drivers CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_ALACRITECH is not set # CONFIG_ALTERA_TSE is not set # CONFIG_NET_VENDOR_AMAZON is not set # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set # CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_BROADCOM is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CIRRUS is not set # CONFIG_NET_VENDOR_CORTINA is not set # CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_ENGLEDER is not set # CONFIG_NET_VENDOR_EZCHIP is not set # CONFIG_NET_VENDOR_FARADAY is not set # CONFIG_NET_VENDOR_FUNGIBLE is not set CONFIG_NET_VENDOR_GOOGLE=y # CONFIG_NET_VENDOR_HISILICON is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_INTEL is not set # CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_NET_VENDOR_ADI is not set # CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set # CONFIG_NET_VENDOR_MICROSOFT is not set # CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NETRONOME is not set # CONFIG_ETHOC is not set # CONFIG_NET_VENDOR_PENSANDO is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RENESAS is not set # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set # CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=y # CONFIG_STMMAC_SELFTESTS is not set CONFIG_STMMAC_PLATFORM=y CONFIG_DWMAC_DWC_QOS_ETH=y CONFIG_DWMAC_GENERIC=y CONFIG_DWMAC_ROCKCHIP=y # CONFIG_DWMAC_INTEL_PLAT is not set # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set CONFIG_PHYLINK=y CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_SFP is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_ADIN_PHY is not set # CONFIG_ADIN1100_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=m # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM54140_PHY is not set CONFIG_BCM7XXX_PHY=m # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set CONFIG_BCM_NET_PHYLIB=m # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set # CONFIG_MAXLINEAR_GPHY is not set # CONFIG_MEDIATEK_GE_PHY is not set # CONFIG_MICREL_PHY is not set CONFIG_MICROCHIP_PHY=m # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set # CONFIG_MOTORCOMM_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_QSEMI_PHY is not set CONFIG_REALTEK_PHY=y # CONFIG_RENESAS_PHY is not set CONFIG_ROCKCHIP_PHY=y CONFIG_SMSC_PHY=m # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_DP83TD510_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set # CONFIG_PSE_CONTROLLER is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_OF_MDIO=y CONFIG_MDIO_DEVRES=y # CONFIG_MDIO_BITBANG is not set CONFIG_MDIO_BCM_UNIMAC=m # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_IPQ4019 is not set # CONFIG_MDIO_IPQ8064 is not set # # MDIO Multiplexers # # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # # PCS device drivers # CONFIG_PCS_XPCS=y # end of PCS device drivers # CONFIG_PPP is not set # CONFIG_SLIP is not set CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set CONFIG_USB_PEGASUS=m CONFIG_USB_RTL8150=m CONFIG_USB_RTL8152=m CONFIG_USB_LAN78XX=m CONFIG_USB_USBNET=m CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m # CONFIG_USB_NET_CDC_EEM is not set CONFIG_USB_NET_CDC_NCM=m # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set CONFIG_USB_NET_DM9601=m # CONFIG_USB_NET_SR9700 is not set CONFIG_USB_NET_SR9800=m CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=m # CONFIG_USB_NET_GL620A is not set CONFIG_USB_NET_NET1080=m CONFIG_USB_NET_PLUSB=m CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m CONFIG_USB_NET_CDC_SUBSET_ENABLE=m CONFIG_USB_NET_CDC_SUBSET=m # CONFIG_USB_ALI_M5632 is not set # CONFIG_USB_AN2720 is not set CONFIG_USB_BELKIN=y CONFIG_USB_ARMLINUX=y # CONFIG_USB_EPSON2888 is not set # CONFIG_USB_KC2190 is not set CONFIG_USB_NET_ZAURUS=m # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set # CONFIG_USB_HSO is not set # CONFIG_USB_NET_INT51X1 is not set # CONFIG_USB_IPHETH is not set # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m # CONFIG_ATH9K_AHB is not set # CONFIG_ATH9K_DEBUGFS is not set # CONFIG_ATH9K_DYNACK is not set # CONFIG_ATH9K_WOW is not set CONFIG_ATH9K_RFKILL=y CONFIG_ATH9K_CHANNEL_CONTEXT=y CONFIG_ATH9K_PCOEM=y CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_ATH9K_HWRNG=y CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y CONFIG_CARL9170_HWRNG=y CONFIG_ATH6KL=m # CONFIG_ATH6KL_SDIO is not set CONFIG_ATH6KL_USB=m # CONFIG_ATH6KL_DEBUG is not set # CONFIG_ATH6KL_TRACING is not set CONFIG_AR5523=m CONFIG_ATH10K=m CONFIG_ATH10K_CE=y # CONFIG_ATH10K_SDIO is not set CONFIG_ATH10K_USB=m # CONFIG_ATH10K_DEBUG is not set # CONFIG_ATH10K_DEBUGFS is not set # CONFIG_ATH10K_TRACING is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set CONFIG_WLAN_VENDOR_ATMEL=y CONFIG_AT76C50X_USB=m CONFIG_WLAN_VENDOR_BROADCOM=y CONFIG_B43=m CONFIG_B43_BCMA=y CONFIG_B43_SSB=y CONFIG_B43_BUSES_BCMA_AND_SSB=y # CONFIG_B43_BUSES_BCMA is not set # CONFIG_B43_BUSES_SSB is not set # CONFIG_B43_SDIO is not set CONFIG_B43_BCMA_PIO=y CONFIG_B43_PIO=y CONFIG_B43_PHY_G=y CONFIG_B43_PHY_N=y CONFIG_B43_PHY_LP=y CONFIG_B43_PHY_HT=y CONFIG_B43_LEDS=y CONFIG_B43_HWRNG=y # CONFIG_B43_DEBUG is not set # CONFIG_B43LEGACY is not set CONFIG_BRCMUTIL=m # CONFIG_BRCMSMAC is not set CONFIG_BRCMFMAC=m CONFIG_BRCMFMAC_PROTO_BCDC=y CONFIG_BRCMFMAC_SDIO=y CONFIG_BRCMFMAC_USB=y # CONFIG_BRCM_TRACING is not set # CONFIG_BRCMDBG is not set CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_HOSTAP is not set CONFIG_P54_COMMON=m CONFIG_P54_USB=m # CONFIG_P54_SPI is not set CONFIG_P54_LEDS=y CONFIG_WLAN_VENDOR_MARVELL=y CONFIG_LIBERTAS=m CONFIG_LIBERTAS_USB=m # CONFIG_LIBERTAS_SDIO is not set # CONFIG_LIBERTAS_SPI is not set # CONFIG_LIBERTAS_DEBUG is not set # CONFIG_LIBERTAS_MESH is not set CONFIG_LIBERTAS_THINFIRM=m # CONFIG_LIBERTAS_THINFIRM_DEBUG is not set CONFIG_LIBERTAS_THINFIRM_USB=m CONFIG_MWIFIEX=m # CONFIG_MWIFIEX_SDIO is not set CONFIG_MWIFIEX_USB=m CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m CONFIG_MT76_CORE=m CONFIG_MT76_LEDS=y CONFIG_MT76_USB=m CONFIG_MT76_SDIO=m CONFIG_MT76x02_LIB=m CONFIG_MT76x02_USB=m CONFIG_MT76_CONNAC_LIB=m CONFIG_MT76x0_COMMON=m CONFIG_MT76x0U=m CONFIG_MT76x2_COMMON=m CONFIG_MT76x2U=m CONFIG_MT7615_COMMON=m CONFIG_MT7663_USB_SDIO_COMMON=m CONFIG_MT7663U=m CONFIG_MT7663S=m # CONFIG_MT7921S is not set # CONFIG_MT7921U is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set # CONFIG_WLAN_VENDOR_PURELIFI is not set CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WLAN_VENDOR_REALTEK=y CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y CONFIG_RTL_CARDS=m # CONFIG_RTL8192CU is not set CONFIG_RTL8XXXU=m CONFIG_RTL8XXXU_UNTESTED=y CONFIG_RTW88=m CONFIG_RTW88_CORE=m CONFIG_RTW88_USB=m CONFIG_RTW88_8822B=m CONFIG_RTW88_8822C=m CONFIG_RTW88_8723D=m CONFIG_RTW88_8821C=m # CONFIG_RTW88_8822BS is not set CONFIG_RTW88_8822BU=m # CONFIG_RTW88_8822CS is not set CONFIG_RTW88_8822CU=m CONFIG_RTW88_8723DU=m # CONFIG_RTW88_8821CS is not set CONFIG_RTW88_8821CU=m # CONFIG_RTW88_DEBUG is not set # CONFIG_RTW88_DEBUGFS is not set # CONFIG_RTW89 is not set CONFIG_WLAN_VENDOR_RSI=y CONFIG_RSI_91X=m # CONFIG_RSI_DEBUGFS is not set # CONFIG_RSI_SDIO is not set CONFIG_RSI_USB=m CONFIG_RSI_COEX=y # CONFIG_WLAN_VENDOR_SILABS is not set CONFIG_WLAN_VENDOR_ST=y # CONFIG_CW1200 is not set CONFIG_WLAN_VENDOR_TI=y # CONFIG_WL1251 is not set CONFIG_WL12XX=m CONFIG_WL18XX=m CONFIG_WLCORE=m # CONFIG_WLCORE_SPI is not set # CONFIG_WLCORE_SDIO is not set CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_USB_ZD1201=m CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set CONFIG_WLAN_VENDOR_QUANTENNA=y # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN # CONFIG_NETDEVSIM is not set CONFIG_NET_FAILOVER=y # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_SPARSEKMAP is not set CONFIG_INPUT_MATRIXKMAP=m # # Userland interfaces # # CONFIG_INPUT_MOUSEDEV is not set CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADC is not set # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set # CONFIG_KEYBOARD_ATKBD is not set # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=y # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_PINEPHONE is not set # CONFIG_KEYBOARD_PMIC8XXX is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_STMPE is not set # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CROS_EC is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set # CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADC is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set CONFIG_JOYSTICK_GF2K=m # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set CONFIG_JOYSTICK_IFORCE=m CONFIG_JOYSTICK_IFORCE_USB=m # CONFIG_JOYSTICK_IFORCE_232 is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y # CONFIG_JOYSTICK_PSXPAD_SPI is not set # CONFIG_JOYSTICK_PXRC is not set # CONFIG_JOYSTICK_QWIIC is not set # CONFIG_JOYSTICK_FSIA6B is not set # CONFIG_JOYSTICK_SENSEHAT is not set # CONFIG_INPUT_TABLET is not set # CONFIG_INPUT_TOUCHSCREEN is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_PM8XXX_VIBRATOR is not set # CONFIG_INPUT_PMIC8XXX_PWRKEY is not set CONFIG_INPUT_MAX77693_HAPTIC=m CONFIG_INPUT_MAX8997_HAPTIC=m # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set CONFIG_INPUT_CPCAP_PWRBUTTON=m # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set # CONFIG_INPUT_TPS65218_PWRBUTTON is not set CONFIG_INPUT_AXP20X_PEK=m CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PALMAS_PWRBUTTON is not set # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set CONFIG_INPUT_RK805_PWRKEY=y # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_DA9063_ONKEY is not set CONFIG_INPUT_ADXL34X=m CONFIG_INPUT_ADXL34X_I2C=m CONFIG_INPUT_ADXL34X_SPI=m # CONFIG_INPUT_IBM_PANEL is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_RMI4_CORE is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_SERIO_SERPORT=y CONFIG_SERIO_AMBAKMI=y CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_SERIO_GPIO_PS2 is not set # CONFIG_USERIO is not set CONFIG_GAMEPORT=m # CONFIG_GAMEPORT_NS558 is not set # CONFIG_GAMEPORT_L4 is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y # CONFIG_SERIAL_8250_16550A_VARIANTS is not set # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_DMA=y CONFIG_SERIAL_8250_NR_UARTS=5 CONFIG_SERIAL_8250_RUNTIME_UARTS=5 CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_MANY_PORTS=y CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_RSA is not set CONFIG_SERIAL_8250_DWLIB=y CONFIG_SERIAL_8250_FSL=y CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set CONFIG_SERIAL_OF_PLATFORM=y # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set # CONFIG_SERIAL_AMBA_PL011 is not set # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_SIFIVE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set CONFIG_SERIAL_XILINX_PS_UART=y CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set CONFIG_SERIAL_ST_ASC=m # CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_NULL_TTY is not set CONFIG_HVC_DRIVER=y # CONFIG_HVC_DCC is not set # CONFIG_RPMSG_TTY is not set CONFIG_SERIAL_DEV_BUS=y CONFIG_SERIAL_DEV_CTRL_TTYPORT=y CONFIG_VIRTIO_CONSOLE=y # CONFIG_IPMI_HANDLER is not set # CONFIG_IPMB_DEVICE_INTERFACE is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_BA431 is not set # CONFIG_HW_RANDOM_VIRTIO is not set CONFIG_HW_RANDOM_OPTEE=m # CONFIG_HW_RANDOM_CCTRNG is not set # CONFIG_HW_RANDOM_XIPHERA is not set CONFIG_DEVMEM=y # CONFIG_TCG_TPM is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # CONFIG_I2C_ARB_GPIO_CHALLENGE=m # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_GPMUX is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set CONFIG_I2C_MUX_PCA954x=y CONFIG_I2C_MUX_PINCTRL=y # CONFIG_I2C_MUX_REG is not set CONFIG_I2C_DEMUX_PINCTRL=y # CONFIG_I2C_MUX_MLXCPLD is not set # end of Multiplexer I2C Chip support CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CBUS_GPIO is not set CONFIG_I2C_DESIGNWARE_CORE=y # CONFIG_I2C_DESIGNWARE_SLAVE is not set CONFIG_I2C_DESIGNWARE_PLATFORM=y CONFIG_I2C_EMEV2=m CONFIG_I2C_GPIO=m # CONFIG_I2C_GPIO_FAULT_INJECTOR is not set # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set CONFIG_I2C_RK3X=y # CONFIG_I2C_SIMTEC is not set CONFIG_I2C_XILINX=y # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # CONFIG_I2C_CROS_EC_TUNNEL=m # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set CONFIG_I2C_SLAVE=y CONFIG_I2C_SLAVE_EEPROM=y # CONFIG_I2C_SLAVE_TESTUNIT is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y CONFIG_SPI_MEM=y # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set CONFIG_SPI_BITBANG=y CONFIG_SPI_CADENCE=y # CONFIG_SPI_CADENCE_QUADSPI is not set # CONFIG_SPI_CADENCE_XSPI is not set # CONFIG_SPI_DESIGNWARE is not set # CONFIG_SPI_NXP_FLEXSPI is not set CONFIG_SPI_GPIO=m # CONFIG_SPI_FSL_SPI is not set # CONFIG_SPI_MICROCHIP_CORE is not set # CONFIG_SPI_MICROCHIP_CORE_QSPI is not set # CONFIG_SPI_OC_TINY is not set CONFIG_SPI_PL022=y CONFIG_SPI_ROCKCHIP=m # CONFIG_SPI_ROCKCHIP_SFC is not set # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_SIFIVE is not set # CONFIG_SPI_MXIC is not set # CONFIG_SPI_XCOMM is not set CONFIG_SPI_XILINX=y # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_AMD is not set # # SPI Multiplexer support # # CONFIG_SPI_MUX is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=y # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set CONFIG_SPI_DYNAMIC=y CONFIG_SPMI=y # CONFIG_SPMI_HISI3670 is not set # CONFIG_HSI is not set CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # # CONFIG_PTP_1588_CLOCK_IDT82P33 is not set # CONFIG_PTP_1588_CLOCK_IDTCM is not set # end of PTP clock support CONFIG_PINCTRL=y CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set CONFIG_PINCTRL_AS3722=y # CONFIG_PINCTRL_AXP209 is not set # CONFIG_PINCTRL_CY8C95X0 is not set # CONFIG_PINCTRL_MCP23S08 is not set # CONFIG_PINCTRL_MICROCHIP_SGPIO is not set # CONFIG_PINCTRL_OCELOT is not set CONFIG_PINCTRL_PALMAS=y # CONFIG_PINCTRL_RK805 is not set CONFIG_PINCTRL_ROCKCHIP=y # CONFIG_PINCTRL_SINGLE is not set # CONFIG_PINCTRL_STMFX is not set # CONFIG_PINCTRL_SX150X is not set # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_CDEV=y CONFIG_GPIO_CDEV_V1=y CONFIG_GPIO_GENERIC=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_CADENCE is not set CONFIG_GPIO_DWAPB=y # CONFIG_GPIO_FTGPIO010 is not set # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HLWD is not set # CONFIG_GPIO_LOGICVC is not set # CONFIG_GPIO_MB86S7X is not set # CONFIG_GPIO_MPC8XXX is not set # CONFIG_GPIO_PL061 is not set CONFIG_GPIO_ROCKCHIP=y # CONFIG_GPIO_SIFIVE is not set CONFIG_GPIO_SYSCON=y CONFIG_GPIO_XILINX=y # CONFIG_GPIO_ZEVIO is not set # CONFIG_GPIO_AMD_FCH is not set # end of Memory mapped GPIO drivers # # I2C GPIO expanders # # 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 CONFIG_GPIO_PCA953X_IRQ=y # CONFIG_GPIO_PCA9570 is not set CONFIG_GPIO_PCF857X=y # CONFIG_GPIO_TPIC2810 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # # CONFIG_HTC_EGPIO is not set CONFIG_GPIO_PALMAS=y # CONFIG_GPIO_STMPE is not set # CONFIG_GPIO_TPS65218 is not set CONFIG_GPIO_TPS6586X=y CONFIG_GPIO_TPS65910=y # end of MFD GPIO expanders # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # end of SPI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_VIRTIO is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers # CONFIG_W1 is not set # CONFIG_POWER_RESET is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_ACT8945A is not set CONFIG_BATTERY_CPCAP=y # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_AXP20X_POWER is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_MAX14577 is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set # CONFIG_CHARGER_MAX77693 is not set # CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_MAX8997 is not set # CONFIG_CHARGER_MAX8998 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_RK817 is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_CHARGER_TPS65090 is not set # CONFIG_CHARGER_TPS65217 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_CROS_USBPD is not set # CONFIG_CHARGER_CROS_PCHG is not set # CONFIG_CHARGER_UCS1002 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set CONFIG_SENSORS_ARM_SCMI=m CONFIG_SENSORS_ARM_SCPI=m # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_GPIO_FAN is not set # CONFIG_SENSORS_HIH6130 is not set CONFIG_SENSORS_IIO_HWMON=y # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX31730 is not set # CONFIG_SENSORS_MAX31760 is not set # CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set CONFIG_SENSORS_LM90=y # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_NZXT_KRAKEN2 is not set # CONFIG_SENSORS_NZXT_SMART2 is not set # CONFIG_SENSORS_OCC_P8_I2C is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set CONFIG_SENSORS_PWM_FAN=m # CONFIG_SENSORS_SBTSI is not set # CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set CONFIG_SENSORS_INA2XX=m # CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y # CONFIG_THERMAL_WRITABLE_TRIPS is not set CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set CONFIG_CPU_THERMAL=y CONFIG_CPU_FREQ_THERMAL=y CONFIG_DEVFREQ_THERMAL=y CONFIG_THERMAL_EMULATION=y # CONFIG_THERMAL_MMIO is not set CONFIG_ROCKCHIP_THERMAL=y # CONFIG_TI_SOC_THERMAL is not set # CONFIG_GENERIC_ADC_THERMAL is not set CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 # CONFIG_WATCHDOG_SYSFS is not set # CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set CONFIG_DA9063_WATCHDOG=m # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_FTWDT010_WATCHDOG is not set CONFIG_DW_WATCHDOG=y CONFIG_RN5T618_WATCHDOG=y # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_ARM_SMC_WATCHDOG is not set # CONFIG_MEN_A21_WDT is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y CONFIG_SSB=m CONFIG_SSB_BLOCKIO=y CONFIG_SSB_SDIOHOST_POSSIBLE=y # CONFIG_SSB_SDIOHOST is not set # CONFIG_SSB_DRIVER_GPIO is not set CONFIG_BCMA_POSSIBLE=y CONFIG_BCMA=m CONFIG_BCMA_BLOCKIO=y # CONFIG_BCMA_HOST_SOC is not set # CONFIG_BCMA_DRIVER_GMAC_CMN is not set # CONFIG_BCMA_DRIVER_GPIO is not set # CONFIG_BCMA_DEBUG is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y CONFIG_MFD_ACT8945A=y CONFIG_MFD_AS3711=y CONFIG_MFD_AS3722=y # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set CONFIG_MFD_ATMEL_FLEXCOM=y CONFIG_MFD_ATMEL_HLCDC=m CONFIG_MFD_BCM590XX=y # CONFIG_MFD_BD9571MWV is not set CONFIG_MFD_AXP20X=y CONFIG_MFD_AXP20X_I2C=y CONFIG_MFD_CROS_EC_DEV=m # CONFIG_MFD_MADERA is not set # CONFIG_MFD_ASIC3 is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set CONFIG_MFD_DA9063=m # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_GATEWORKS_GSC is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_MFD_HI6421_SPMI is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set CONFIG_MFD_MAX14577=y # CONFIG_MFD_MAX77620 is not set # CONFIG_MFD_MAX77650 is not set CONFIG_MFD_MAX77686=y CONFIG_MFD_MAX77693=m # CONFIG_MFD_MAX77714 is not set # CONFIG_MFD_MAX77843 is not set CONFIG_MFD_MAX8907=y # CONFIG_MFD_MAX8925 is not set CONFIG_MFD_MAX8997=y CONFIG_MFD_MAX8998=y # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_OCELOT is not set # CONFIG_EZX_PCAP is not set CONFIG_MFD_CPCAP=y # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_NTXEC is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set CONFIG_MFD_PM8XXX=y # CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set CONFIG_MFD_RK808=y CONFIG_MFD_RN5T618=y CONFIG_MFD_SEC_CORE=y # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set CONFIG_MFD_STMPE=y # # STMicroelectronics STMPE Interface Drivers # CONFIG_STMPE_I2C=y # CONFIG_STMPE_SPI is not set # end of STMicroelectronics STMPE Interface Drivers CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set CONFIG_MFD_PALMAS=y # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set CONFIG_MFD_TPS65090=y CONFIG_MFD_TPS65217=y # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set CONFIG_MFD_TPS65218=y CONFIG_MFD_TPS6586X=y CONFIG_MFD_TPS65910=y # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set CONFIG_MFD_WL1273_CORE=m # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TC3589X is not set # 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 # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ROHM_BD718XX is not set # CONFIG_MFD_ROHM_BD71828 is not set # CONFIG_MFD_ROHM_BD957XMUF is not set # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_MFD_KHADAS_MCU is not set # CONFIG_MFD_QCOM_PM8008 is not set # CONFIG_RAVE_SP_CORE is not set # CONFIG_MFD_INTEL_M10_BMC is not set # CONFIG_MFD_RSMU_I2C is not set # CONFIG_MFD_RSMU_SPI is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set CONFIG_REGULATOR_ACT8865=y CONFIG_REGULATOR_ACT8945A=y # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_ARM_SCMI is not set CONFIG_REGULATOR_AS3711=y CONFIG_REGULATOR_AS3722=y CONFIG_REGULATOR_AXP20X=y CONFIG_REGULATOR_BCM590XX=y CONFIG_REGULATOR_CPCAP=y # CONFIG_REGULATOR_CROS_EC is not set # CONFIG_REGULATOR_DA9063 is not set # CONFIG_REGULATOR_DA9121 is not set CONFIG_REGULATOR_DA9210=y # CONFIG_REGULATOR_DA9211 is not set CONFIG_REGULATOR_FAN53555=y # CONFIG_REGULATOR_FAN53880 is not set CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set CONFIG_REGULATOR_LP872X=y # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set CONFIG_REGULATOR_MAX14577=m # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set CONFIG_REGULATOR_MAX8907=y # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set CONFIG_REGULATOR_MAX8997=m CONFIG_REGULATOR_MAX8998=m # CONFIG_REGULATOR_MAX20086 is not set CONFIG_REGULATOR_MAX77686=y CONFIG_REGULATOR_MAX77693=m CONFIG_REGULATOR_MAX77802=m # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MCP16502 is not set # CONFIG_REGULATOR_MP5416 is not set # CONFIG_REGULATOR_MP8859 is not set # CONFIG_REGULATOR_MP886X is not set # CONFIG_REGULATOR_MPQ7920 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_MT6315 is not set CONFIG_REGULATOR_PALMAS=y # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PF8X00 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set CONFIG_REGULATOR_PWM=y # CONFIG_REGULATOR_QCOM_SPMI is not set # CONFIG_REGULATOR_QCOM_USB_VBUS is not set # CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set CONFIG_REGULATOR_RK808=y CONFIG_REGULATOR_RN5T618=y # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set # CONFIG_REGULATOR_S2MPA01 is not set CONFIG_REGULATOR_S2MPS11=y CONFIG_REGULATOR_S5M8767=y # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_SY8106A is not set # CONFIG_REGULATOR_SY8824X is not set # CONFIG_REGULATOR_SY8827N is not set CONFIG_REGULATOR_TPS51632=y CONFIG_REGULATOR_TPS62360=y # CONFIG_REGULATOR_TPS6286X is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set CONFIG_REGULATOR_TPS65090=y # CONFIG_REGULATOR_TPS65132 is not set CONFIG_REGULATOR_TPS65217=y CONFIG_REGULATOR_TPS65218=y # CONFIG_REGULATOR_TPS6524X is not set CONFIG_REGULATOR_TPS6586X=y CONFIG_REGULATOR_TPS65910=y # CONFIG_REGULATOR_VCTRL is not set # CONFIG_REGULATOR_QCOM_LABIBB is not set CONFIG_RC_CORE=y CONFIG_BPF_LIRC_MODE2=y CONFIG_LIRC=y CONFIG_RC_MAP=m CONFIG_RC_DECODERS=y CONFIG_IR_IMON_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_MCE_KBD_DECODER=m CONFIG_IR_NEC_DECODER=m CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m CONFIG_IR_RCMM_DECODER=m CONFIG_IR_SANYO_DECODER=m CONFIG_IR_SHARP_DECODER=m CONFIG_IR_SONY_DECODER=m CONFIG_IR_XMP_DECODER=m CONFIG_RC_DEVICES=y CONFIG_IR_GPIO_CIR=m CONFIG_IR_GPIO_TX=m CONFIG_IR_HIX5HD2=m CONFIG_IR_IGORPLUGUSB=m CONFIG_IR_IGUANA=m CONFIG_IR_IMON=m CONFIG_IR_IMON_RAW=m CONFIG_IR_MCEUSB=m CONFIG_IR_PWM_TX=m CONFIG_IR_REDRAT3=m CONFIG_IR_SERIAL=m # CONFIG_IR_SERIAL_TRANSMITTER is not set CONFIG_IR_SPI=m CONFIG_IR_STREAMZAP=m CONFIG_IR_TOY=m CONFIG_IR_TTUSBIR=m CONFIG_RC_ATI_REMOTE=m # CONFIG_RC_LOOPBACK is not set CONFIG_RC_XBOX_DVD=m CONFIG_CEC_CORE=y CONFIG_CEC_NOTIFIER=y # # CEC support # # CONFIG_MEDIA_CEC_RC is not set CONFIG_MEDIA_CEC_SUPPORT=y # CONFIG_CEC_CH7322 is not set # CONFIG_CEC_CROS_EC is not set CONFIG_USB_PULSE8_CEC=m CONFIG_USB_RAINSHADOW_CEC=m # end of CEC support CONFIG_MEDIA_SUPPORT=y CONFIG_MEDIA_SUPPORT_FILTER=y CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y CONFIG_MEDIA_RADIO_SUPPORT=y # CONFIG_MEDIA_SDR_SUPPORT is not set CONFIG_MEDIA_PLATFORM_SUPPORT=y # CONFIG_MEDIA_TEST_SUPPORT is not set # end of Media device types CONFIG_VIDEO_DEV=y CONFIG_MEDIA_CONTROLLER=y CONFIG_DVB_CORE=y # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y CONFIG_VIDEO_V4L2_SUBDEV_API=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_VIDEO_TUNER=m CONFIG_V4L2_H264=m CONFIG_V4L2_VP9=m CONFIG_V4L2_MEM2MEM_DEV=m # CONFIG_V4L2_FLASH_LED_CLASS is not set CONFIG_V4L2_FWNODE=y CONFIG_V4L2_ASYNC=y CONFIG_VIDEOBUF_GEN=m CONFIG_VIDEOBUF_VMALLOC=m # end of Video4Linux options # # Media controller options # CONFIG_MEDIA_CONTROLLER_DVB=y CONFIG_MEDIA_CONTROLLER_REQUEST_API=y # end of Media controller options # # Digital TV options # # CONFIG_DVB_MMAP is not set CONFIG_DVB_NET=y CONFIG_DVB_MAX_ADAPTERS=16 # CONFIG_DVB_DYNAMIC_MINORS is not set # CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set # CONFIG_DVB_ULE_DEBUG is not set # end of Digital TV options # # Media drivers # # # Drivers filtered as selected at 'Filter media drivers' # # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # CONFIG_USB_GSPCA=m # CONFIG_USB_GSPCA_BENQ is not set # CONFIG_USB_GSPCA_CONEX is not set # CONFIG_USB_GSPCA_CPIA1 is not set # CONFIG_USB_GSPCA_DTCS033 is not set # CONFIG_USB_GSPCA_ETOMS is not set # CONFIG_USB_GSPCA_FINEPIX is not set # CONFIG_USB_GSPCA_JEILINJ is not set # CONFIG_USB_GSPCA_JL2005BCD is not set # CONFIG_USB_GSPCA_KINECT is not set # CONFIG_USB_GSPCA_KONICA is not set # CONFIG_USB_GSPCA_MARS is not set # CONFIG_USB_GSPCA_MR97310A is not set # CONFIG_USB_GSPCA_NW80X is not set # CONFIG_USB_GSPCA_OV519 is not set # CONFIG_USB_GSPCA_OV534 is not set # CONFIG_USB_GSPCA_OV534_9 is not set # CONFIG_USB_GSPCA_PAC207 is not set # CONFIG_USB_GSPCA_PAC7302 is not set # CONFIG_USB_GSPCA_PAC7311 is not set # CONFIG_USB_GSPCA_SE401 is not set # CONFIG_USB_GSPCA_SN9C2028 is not set # CONFIG_USB_GSPCA_SN9C20X is not set # CONFIG_USB_GSPCA_SONIXB is not set # CONFIG_USB_GSPCA_SONIXJ is not set # CONFIG_USB_GSPCA_SPCA1528 is not set # CONFIG_USB_GSPCA_SPCA500 is not set # CONFIG_USB_GSPCA_SPCA501 is not set # CONFIG_USB_GSPCA_SPCA505 is not set # CONFIG_USB_GSPCA_SPCA506 is not set # CONFIG_USB_GSPCA_SPCA508 is not set # CONFIG_USB_GSPCA_SPCA561 is not set # CONFIG_USB_GSPCA_SQ905 is not set # CONFIG_USB_GSPCA_SQ905C is not set # CONFIG_USB_GSPCA_SQ930X is not set # CONFIG_USB_GSPCA_STK014 is not set # CONFIG_USB_GSPCA_STK1135 is not set # CONFIG_USB_GSPCA_STV0680 is not set # CONFIG_USB_GSPCA_SUNPLUS is not set # CONFIG_USB_GSPCA_T613 is not set # CONFIG_USB_GSPCA_TOPRO is not set # CONFIG_USB_GSPCA_TOUPTEK is not set # CONFIG_USB_GSPCA_TV8532 is not set # CONFIG_USB_GSPCA_VC032X is not set # CONFIG_USB_GSPCA_VICAM is not set # CONFIG_USB_GSPCA_XIRLINK_CIT is not set # CONFIG_USB_GSPCA_ZC3XX is not set # CONFIG_USB_GL860 is not set # CONFIG_USB_M5602 is not set # CONFIG_USB_STV06XX is not set # CONFIG_USB_PWC is not set # CONFIG_USB_S2255 is not set # CONFIG_VIDEO_USBTV is not set CONFIG_USB_VIDEO_CLASS=m CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y # # Analog TV USB devices # CONFIG_VIDEO_GO7007=m CONFIG_VIDEO_GO7007_USB=m CONFIG_VIDEO_GO7007_LOADER=m CONFIG_VIDEO_GO7007_USB_S2250_BOARD=m CONFIG_VIDEO_HDPVR=m CONFIG_VIDEO_PVRUSB2=m CONFIG_VIDEO_PVRUSB2_SYSFS=y CONFIG_VIDEO_PVRUSB2_DVB=y # CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set CONFIG_VIDEO_STK1160_COMMON=m CONFIG_VIDEO_STK1160=m # # Analog/digital TV USB devices # CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_AU0828_V4L2=y CONFIG_VIDEO_AU0828_RC=y CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y CONFIG_VIDEO_CX231XX_ALSA=m CONFIG_VIDEO_CX231XX_DVB=m # # Digital TV USB devices # CONFIG_DVB_AS102=m CONFIG_DVB_B2C2_FLEXCOP_USB=m # CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set CONFIG_DVB_USB_V2=m CONFIG_DVB_USB_AF9015=m CONFIG_DVB_USB_AF9035=m CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_AZ6007=m CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_DVBSKY=m CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_GL861=m CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m CONFIG_DVB_USB_ZD1301=m CONFIG_DVB_USB=m # CONFIG_DVB_USB_DEBUG is not set CONFIG_DVB_USB_A800=m CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_CXUSB=m CONFIG_DVB_USB_CXUSB_ANALOG=y CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_DIB3000MC=m CONFIG_DVB_USB_DIBUSB_MB=m CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y CONFIG_DVB_USB_DIBUSB_MC=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_DTT200U=m CONFIG_DVB_USB_DTV5100=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_GP8PSK=m CONFIG_DVB_USB_M920X=m CONFIG_DVB_USB_NOVA_T_USB2=m CONFIG_DVB_USB_OPERA1=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_TTUSB2=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_VP7045=m CONFIG_SMS_USB_DRV=m # # Webcam, TV (analog/digital) USB devices # CONFIG_VIDEO_EM28XX=m CONFIG_VIDEO_EM28XX_V4L2=m CONFIG_VIDEO_EM28XX_ALSA=m CONFIG_VIDEO_EM28XX_DVB=m CONFIG_VIDEO_EM28XX_RC=m CONFIG_RADIO_ADAPTERS=y CONFIG_RADIO_SAA7706H=m CONFIG_RADIO_SHARK=m CONFIG_RADIO_SHARK2=m CONFIG_RADIO_SI4713=m CONFIG_RADIO_TEA575X=m CONFIG_RADIO_TEA5764=m CONFIG_RADIO_TEF6862=m CONFIG_RADIO_WL1273=m CONFIG_USB_DSBR=m CONFIG_USB_KEENE=m CONFIG_USB_MA901=m CONFIG_USB_MR800=m CONFIG_USB_RAREMONO=m CONFIG_RADIO_SI470X=m CONFIG_USB_SI470X=m CONFIG_I2C_SI470X=m CONFIG_USB_SI4713=m CONFIG_PLATFORM_SI4713=m CONFIG_I2C_SI4713=m CONFIG_MEDIA_PLATFORM_DRIVERS=y # CONFIG_V4L_PLATFORM_DRIVERS is not set # CONFIG_DVB_PLATFORM_DRIVERS is not set CONFIG_V4L_MEM2MEM_DRIVERS=y # CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set # # Allegro DVT media platform drivers # # # Amlogic media platform drivers # # # Amphion drivers # # # Aspeed media platform drivers # # # Atmel media platform drivers # # # Cadence media platform drivers # # CONFIG_VIDEO_CADENCE_CSI2RX is not set # CONFIG_VIDEO_CADENCE_CSI2TX is not set # # Chips&Media media platform drivers # # # Intel media platform drivers # # # Marvell media platform drivers # # # Mediatek media platform drivers # # # NVidia media platform drivers # # # NXP media platform drivers # # # Qualcomm media platform drivers # # # Renesas media platform drivers # # # Rockchip media platform drivers # CONFIG_VIDEO_ROCKCHIP_IEP=m CONFIG_VIDEO_ROCKCHIP_RGA=m # # Samsung media platform drivers # # # STMicroelectronics media platform drivers # # # Sunxi media platform drivers # # # Texas Instruments drivers # # # Verisilicon media platform drivers # CONFIG_VIDEO_HANTRO=m CONFIG_VIDEO_HANTRO_ROCKCHIP=y # # VIA media platform drivers # # # Xilinx media platform drivers # # # MMC/SDIO DVB adapters # # CONFIG_SMS_SDIO_DRV is not set CONFIG_MEDIA_COMMON_OPTIONS=y # # common driver options # CONFIG_CYPRESS_FIRMWARE=m CONFIG_TTPCI_EEPROM=m CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_SMS_SIANO_MDTV=m CONFIG_SMS_SIANO_RC=y CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_DMA_CONTIG=m CONFIG_VIDEOBUF2_VMALLOC=m CONFIG_VIDEOBUF2_DMA_SG=m # end of Media drivers CONFIG_MEDIA_HIDE_ANCILLARY_SUBDRV=y # # Media ancillary drivers # CONFIG_MEDIA_ATTACH=y # # IR I2C driver auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_IR_I2C=y CONFIG_VIDEO_CAMERA_SENSOR=y # CONFIG_VIDEO_AR0521 is not set # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_HI846 is not set # CONFIG_VIDEO_HI847 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_IMX412 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set CONFIG_VIDEO_MT9V011=m # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set CONFIG_VIDEO_OV2640=m # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5693 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV7251 is not set CONFIG_VIDEO_OV7640=m # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9282 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_M5MOLS is not set # # Lens drivers # # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # audio, video and radio I2C drivers auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_CS53L32A=m CONFIG_VIDEO_MSP3400=m CONFIG_VIDEO_SONY_BTF_MPX=m CONFIG_VIDEO_UDA1342=m CONFIG_VIDEO_WM8775=m CONFIG_VIDEO_SAA711X=m CONFIG_VIDEO_TVP5150=m CONFIG_VIDEO_TW2804=m CONFIG_VIDEO_TW9903=m CONFIG_VIDEO_TW9906=m # # Video and audio decoders # CONFIG_VIDEO_CX25840=m # # SPI I2C drivers auto-selected by 'Autoselect ancillary drivers' # # # Media SPI Adapters # # CONFIG_CXD2880_SPI_DRV is not set # CONFIG_VIDEO_GS1662 is not set # end of Media SPI Adapters CONFIG_MEDIA_TUNER=y # # Tuner drivers auto-selected by 'Autoselect ancillary drivers' # CONFIG_MEDIA_TUNER_E4000=m CONFIG_MEDIA_TUNER_FC0011=m CONFIG_MEDIA_TUNER_FC0012=m CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_FC2580=m CONFIG_MEDIA_TUNER_IT913X=m CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_MC44S803=y CONFIG_MEDIA_TUNER_MT2060=m CONFIG_MEDIA_TUNER_MT2063=m CONFIG_MEDIA_TUNER_MT20XX=y CONFIG_MEDIA_TUNER_MT2266=m CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m CONFIG_MEDIA_TUNER_QM1D1C0042=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_R820T=m CONFIG_MEDIA_TUNER_SI2157=m CONFIG_MEDIA_TUNER_SIMPLE=y CONFIG_MEDIA_TUNER_TDA18212=m CONFIG_MEDIA_TUNER_TDA18218=m CONFIG_MEDIA_TUNER_TDA18250=m CONFIG_MEDIA_TUNER_TDA18271=y CONFIG_MEDIA_TUNER_TDA827X=y CONFIG_MEDIA_TUNER_TDA8290=y CONFIG_MEDIA_TUNER_TDA9887=y CONFIG_MEDIA_TUNER_TEA5761=y CONFIG_MEDIA_TUNER_TEA5767=y CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_MEDIA_TUNER_XC2028=y CONFIG_MEDIA_TUNER_XC4000=y CONFIG_MEDIA_TUNER_XC5000=y # # DVB Frontend drivers auto-selected by 'Autoselect ancillary drivers' # # # Multistandard (satellite) frontends # CONFIG_DVB_M88DS3103=m CONFIG_DVB_STB0899=m CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m CONFIG_DVB_STV6110x=m # # Multistandard (cable + terrestrial) frontends # CONFIG_DVB_DRXK=m CONFIG_DVB_MN88472=m CONFIG_DVB_MN88473=m CONFIG_DVB_SI2165=m CONFIG_DVB_TDA18271C2DD=m # # DVB-S (satellite) frontends # CONFIG_DVB_CX24116=m CONFIG_DVB_CX24120=m CONFIG_DVB_CX24123=m CONFIG_DVB_DS3000=m CONFIG_DVB_MT312=m CONFIG_DVB_S5H1420=m CONFIG_DVB_SI21XX=m CONFIG_DVB_STB6000=m CONFIG_DVB_STV0288=m CONFIG_DVB_STV0299=m CONFIG_DVB_STV0900=m CONFIG_DVB_STV6110=m CONFIG_DVB_TDA10071=m CONFIG_DVB_TDA10086=m CONFIG_DVB_TDA826X=m CONFIG_DVB_TS2020=m CONFIG_DVB_TUNER_CX24113=m CONFIG_DVB_TUNER_ITD1000=m CONFIG_DVB_ZL10039=m # # DVB-T (terrestrial) frontends # CONFIG_DVB_AF9013=m CONFIG_DVB_AS102_FE=m CONFIG_DVB_CX22702=m CONFIG_DVB_CXD2820R=m CONFIG_DVB_CXD2841ER=m CONFIG_DVB_DIB3000MB=m CONFIG_DVB_DIB3000MC=m CONFIG_DVB_DIB7000M=m CONFIG_DVB_DIB7000P=m CONFIG_DVB_DRXD=m CONFIG_DVB_EC100=m CONFIG_DVB_GP8PSK_FE=m CONFIG_DVB_MT352=m CONFIG_DVB_NXT6000=m CONFIG_DVB_RTL2830=m CONFIG_DVB_RTL2832=m CONFIG_DVB_SI2168=m CONFIG_DVB_TDA10048=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_ZD1301_DEMOD=m CONFIG_DVB_ZL10353=m # # DVB-C (cable) frontends # CONFIG_DVB_STV0297=m CONFIG_DVB_TDA10023=m # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # CONFIG_DVB_AU8522=m CONFIG_DVB_AU8522_DTV=m CONFIG_DVB_AU8522_V4L=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LG2160=m CONFIG_DVB_LGDT3305=m CONFIG_DVB_LGDT3306A=m CONFIG_DVB_LGDT330X=m CONFIG_DVB_MXL692=m CONFIG_DVB_NXT200X=m CONFIG_DVB_S5H1409=m CONFIG_DVB_S5H1411=m # # ISDB-T (terrestrial) frontends # CONFIG_DVB_DIB8000=m CONFIG_DVB_MB86A20S=m CONFIG_DVB_S921=m # # ISDB-S (satellite) & ISDB-T (terrestrial) frontends # CONFIG_DVB_TC90522=m # # Digital terrestrial only tuners/PLL # CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m CONFIG_DVB_TUNER_DIB0090=m # # SEC control devices for DVB-S # CONFIG_DVB_A8293=m CONFIG_DVB_AF9033=m CONFIG_DVB_ATBM8830=m CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m CONFIG_DVB_IX2505V=m CONFIG_DVB_LGS8GXX=m CONFIG_DVB_LNBP21=m CONFIG_DVB_LNBP22=m CONFIG_DVB_M88RS2000=m CONFIG_DVB_DRX39XYJ=m # # Common Interface (EN50221) controller drivers # CONFIG_DVB_SP2=m # end of Media ancillary drivers # # Graphics support # # CONFIG_IMX_IPUV3_CORE is not set CONFIG_DRM=y # CONFIG_DRM_DEBUG_MM is not set CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_DP_AUX_BUS=y CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_DISPLAY_DP_HELPER=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_GEM_DMA_HELPER=y CONFIG_DRM_GEM_SHMEM_HELPER=y CONFIG_DRM_SCHED=y # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # end of I2C encoder or helper chips # # ARM devices # # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_KOMEDA is not set # end of ARM devices # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set # CONFIG_DRM_EXYNOS is not set CONFIG_DRM_ROCKCHIP=y CONFIG_ROCKCHIP_VOP=y # CONFIG_ROCKCHIP_VOP2 is not set # CONFIG_ROCKCHIP_ANALOGIX_DP is not set # CONFIG_ROCKCHIP_CDN_DP is not set CONFIG_ROCKCHIP_DW_HDMI=y # CONFIG_ROCKCHIP_DW_MIPI_DSI is not set # CONFIG_ROCKCHIP_INNO_HDMI is not set # CONFIG_ROCKCHIP_LVDS is not set # CONFIG_ROCKCHIP_RGB is not set # CONFIG_ROCKCHIP_RK3066_HDMI is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_ARMADA is not set # CONFIG_DRM_ATMEL_HLCDC is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_USE_LVDS is not set # CONFIG_DRM_RCAR_USE_MIPI_DSI is not set # CONFIG_DRM_OMAP is not set # CONFIG_DRM_TILCDC is not set # CONFIG_DRM_VIRTIO_GPU is not set # CONFIG_DRM_FSL_DCU is not set # CONFIG_DRM_STM is not set CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_ABT_Y030XX067A is not set # CONFIG_DRM_PANEL_ARM_VERSATILE is not set # CONFIG_DRM_PANEL_LVDS is not set CONFIG_DRM_PANEL_SIMPLE=y CONFIG_DRM_PANEL_EDP=y # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LB035Q02 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set # CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set # CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set # CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set # CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set # CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set # CONFIG_DRM_PANEL_SONY_ACX565AKM is not set # CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set # CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set # CONFIG_DRM_PANEL_TPO_TPG110 is not set # CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_CROS_EC_ANX7688 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set # CONFIG_DRM_LONTIUM_LT9611 is not set # CONFIG_DRM_LONTIUM_LT9611UXC is not set # CONFIG_DRM_ITE_IT66121 is not set # CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NWL_MIPI_DSI is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_PARADE_PS8640 is not set # CONFIG_DRM_SIL_SII8620 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_SII9234 is not set # CONFIG_DRM_SIMPLE_BRIDGE is not set # CONFIG_DRM_THINE_THC63LVD1024 is not set # CONFIG_DRM_TOSHIBA_TC358762 is not set # CONFIG_DRM_TOSHIBA_TC358764 is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TOSHIBA_TC358768 is not set # CONFIG_DRM_TOSHIBA_TC358775 is not set # CONFIG_DRM_TI_DLPC3433 is not set # CONFIG_DRM_TI_TFP410 is not set # CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_ANALOGIX_ANX7625 is not set # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_CDNS_MHDP8546 is not set 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_GP_AUDIO is not set CONFIG_DRM_DW_HDMI_CEC=y # end of Display Interface Bridges # CONFIG_DRM_STI is not set # CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_LOGICVC is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_PANEL_MIPI_DBI is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9163 is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set # CONFIG_TINYDRM_ILI9486 is not set # CONFIG_TINYDRM_MI0283QT is not set # CONFIG_TINYDRM_REPAPER is not set # CONFIG_TINYDRM_ST7586 is not set # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_TVE200 is not set # CONFIG_DRM_LIMA is not set CONFIG_DRM_PANFROST=y # CONFIG_DRM_MCDE is not set # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_DRM_NOMODESET=y # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # end of Frame buffer Devices # # Backlight & LCD device support # # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_KTD253 is not set CONFIG_BACKLIGHT_PWM=y # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set # CONFIG_BACKLIGHT_TPS65217 is not set CONFIG_BACKLIGHT_AS3711=y CONFIG_BACKLIGHT_GPIO=y # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # CONFIG_BACKLIGHT_LED is not set # end of Backlight & LCD device support CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support # CONFIG_LOGO is not set # end of Graphics support CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y # CONFIG_SND_HRTIMER is not set # CONFIG_SND_DYNAMIC_MINORS is not set CONFIG_SND_SUPPORT_OLD_API=y CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_CTL_INPUT_VALIDATION is not set # CONFIG_SND_SEQUENCER is not set CONFIG_SND_DRIVERS=y # CONFIG_SND_DUMMY is not set # CONFIG_SND_ALOOP is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_SERIAL_GENERIC is not set # CONFIG_SND_MPU401 is not set # # HD-Audio # # end of HD-Audio CONFIG_SND_HDA_PREALLOC_SIZE=64 CONFIG_SND_ARM=y # CONFIG_SND_ARMAACI is not set CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=m CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y # CONFIG_SND_USB_UA101 is not set # CONFIG_SND_USB_CAIAQ is not set # CONFIG_SND_USB_6FIRE is not set # CONFIG_SND_USB_HIFACE is not set # CONFIG_SND_BCD2000 is not set # CONFIG_SND_USB_POD is not set # CONFIG_SND_USB_PODHD is not set # CONFIG_SND_USB_TONEPORT is not set # CONFIG_SND_USB_VARIAX is not set CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y # CONFIG_SND_SOC_ADI is not set # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_AMD_ACP_CONFIG is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # CONFIG_SND_SOC_FSL_AUDMIX is not set # 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_FSL_XCVR is not set # CONFIG_SND_SOC_FSL_RPMSG is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # end of SoC Audio for Freescale CPUs # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_MTK_BTCVSD is not set CONFIG_SND_SOC_ROCKCHIP=y CONFIG_SND_SOC_ROCKCHIP_I2S=y CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y CONFIG_SND_SOC_ROCKCHIP_PDM=m CONFIG_SND_SOC_ROCKCHIP_SPDIF=y CONFIG_SND_SOC_ROCKCHIP_MAX98090=m CONFIG_SND_SOC_ROCKCHIP_RT5645=m CONFIG_SND_SOC_RK3288_HDMI_ANALOG=m # CONFIG_SND_SOC_RK3399_GRU_SOUND is not set # CONFIG_SND_SOC_SOF_TOPLEVEL is not set # # STMicroelectronics STM32 SOC audio support # # end of 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_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1372_SPI is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set # CONFIG_SND_SOC_ADAU7002 is not set # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4375 is not set # CONFIG_SND_SOC_AK4458 is not set # CONFIG_SND_SOC_AK4554 is not set # CONFIG_SND_SOC_AK4613 is not set CONFIG_SND_SOC_AK4642=m # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set CONFIG_SND_SOC_CPCAP=m # CONFIG_SND_SOC_CROS_EC_CODEC is not set # CONFIG_SND_SOC_CS35L32 is not set # 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_CS35L41_SPI is not set # CONFIG_SND_SOC_CS35L41_I2C is not set # CONFIG_SND_SOC_CS35L45_SPI is not set # CONFIG_SND_SOC_CS35L45_I2C 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS42L83 is not set # CONFIG_SND_SOC_CS4234 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # 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_CX2072X is not set # CONFIG_SND_SOC_DA7213 is not set # CONFIG_SND_SOC_DMIC is not set CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_ES7134 is not set # CONFIG_SND_SOC_ES7241 is not set # CONFIG_SND_SOC_ES8316 is not set # CONFIG_SND_SOC_ES8326 is not set CONFIG_SND_SOC_ES8328=m CONFIG_SND_SOC_ES8328_I2C=m CONFIG_SND_SOC_ES8328_SPI=m # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_HDA is not set # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set # CONFIG_SND_SOC_MAX98088 is not set CONFIG_SND_SOC_MAX98090=m # CONFIG_SND_SOC_MAX98357A is not set # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98520 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX98396 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_ANALOG is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set # CONFIG_SND_SOC_PCM186X_I2C is not set # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set # CONFIG_SND_SOC_PCM5102A 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_RK817 is not set CONFIG_SND_SOC_RL6231=m # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set # CONFIG_SND_SOC_RT5640 is not set CONFIG_SND_SOC_RT5645=m # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_RT9120 is not set CONFIG_SND_SOC_SGTL5000=m # CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set # CONFIG_SND_SOC_SIMPLE_MUX is not set CONFIG_SND_SOC_SPDIF=m # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set CONFIG_SND_SOC_STI_SAS=m # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS2780 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805M is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320ADC3XXX is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set # CONFIG_SND_SOC_TLV320AIC3X_I2C is not set # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set CONFIG_SND_SOC_TS3A227E=m # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731_I2C is not set # CONFIG_SND_SOC_WM8731_SPI is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set # 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_WM8940 is not set # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set CONFIG_SND_SOC_WM8978=m # CONFIG_SND_SOC_WM8985 is not set # CONFIG_SND_SOC_ZL38060 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_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8821 is not set # CONFIG_SND_SOC_NAU8822 is not set # CONFIG_SND_SOC_NAU8824 is not set # CONFIG_SND_SOC_TPA6130A2 is not set # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set # end of CODEC drivers CONFIG_SND_SIMPLE_CARD_UTILS=y CONFIG_SND_SIMPLE_CARD=y CONFIG_SND_AUDIO_GRAPH_CARD=y # CONFIG_SND_AUDIO_GRAPH_CARD2 is not set # CONFIG_SND_TEST_COMPONENT is not set # CONFIG_SND_VIRTIO is not set # # HID support # CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set CONFIG_HID_ASUS=y CONFIG_HID_AUREAL=y CONFIG_HID_BELKIN=y # CONFIG_HID_BETOP_FF is not set CONFIG_HID_BIGBEN_FF=m CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CREATIVE_SB0540 is not set CONFIG_HID_CYPRESS=y CONFIG_HID_DRAGONRISE=m CONFIG_DRAGONRISE_FF=y # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_FT260 is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_GLORIOUS is not set # CONFIG_HID_HOLTEK is not set # CONFIG_HID_GOOGLE_HAMMER is not set # CONFIG_HID_VIVALDI is not set # CONFIG_HID_GT683R is not set # CONFIG_HID_KEYTOUCH is not set CONFIG_HID_KYE=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set # CONFIG_HID_VRC2 is not set # CONFIG_HID_XIAOMI is not set CONFIG_HID_GYRATION=y # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set # CONFIG_HID_JABRA is not set CONFIG_HID_TWINHAN=y CONFIG_HID_KENSINGTON=y CONFIG_HID_LCPOWER=y # CONFIG_HID_LED is not set CONFIG_HID_LENOVO=y # CONFIG_HID_LETSKETCH is not set CONFIG_HID_LOGITECH=y CONFIG_HID_LOGITECH_DJ=y CONFIG_HID_LOGITECH_HIDPP=y CONFIG_LOGITECH_FF=y 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_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=m CONFIG_HID_NINTENDO=m CONFIG_NINTENDO_FF=y # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set CONFIG_HID_ORTEK=y CONFIG_HID_OUYA=y CONFIG_HID_PANTHERLORD=y CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=y CONFIG_HID_PETALYNX=y # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PXRC is not set # CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set CONFIG_HID_SAMSUNG=y # CONFIG_HID_SEMITEK is not set # CONFIG_HID_SIGMAMICRO is not set CONFIG_HID_SONY=y CONFIG_SONY_FF=y # CONFIG_HID_SPEEDLINK is not set CONFIG_HID_STEAM=m # CONFIG_HID_STEELSERIES is not set CONFIG_HID_SUNPLUS=y # CONFIG_HID_RMI is not set # CONFIG_HID_GREENASIA is not set CONFIG_HID_SMARTJOYPLUS=m CONFIG_SMARTJOYPLUS_FF=y CONFIG_HID_TIVO=y CONFIG_HID_TOPSEED=y # CONFIG_HID_TOPRE is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set CONFIG_HID_WIIMOTE=m CONFIG_HID_XINMO=y # CONFIG_HID_ZEROPLUS is not set CONFIG_HID_ZYDACRON=y # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # end of USB HID support # # I2C HID support # # CONFIG_I2C_HID_OF is not set # CONFIG_I2C_HID_OF_ELAN is not set # CONFIG_I2C_HID_OF_GOODIX is not set # end of I2C HID support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y # CONFIG_USB_LED_TRIG is not set CONFIG_USB_ULPI_BUS=y # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_OTG=y # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_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 # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y # CONFIG_USB_XHCI_DBGCAP is not set # CONFIG_USB_XHCI_PCI_RENESAS is not set 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 # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD_PLATFORM=y # CONFIG_USB_SL811_HCD is not set CONFIG_USB_R8A66597_HCD=m # CONFIG_USB_HCD_BCMA is not set # CONFIG_USB_HCD_SSB is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=y # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set CONFIG_USB_UAS=m # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_CDNS_SUPPORT is not set CONFIG_USB_MUSB_HDRC=m # CONFIG_USB_MUSB_HOST is not set # CONFIG_USB_MUSB_GADGET is not set CONFIG_USB_MUSB_DUAL_ROLE=y # # Platform Glue Layer # # # MUSB DMA mode # # CONFIG_MUSB_PIO_ONLY is not set CONFIG_USB_DWC3=y # CONFIG_USB_DWC3_ULPI is not set # CONFIG_USB_DWC3_HOST is not set # CONFIG_USB_DWC3_GADGET is not set CONFIG_USB_DWC3_DUAL_ROLE=y # # Platform Glue Driver Support # CONFIG_USB_DWC3_OF_SIMPLE=y CONFIG_USB_DWC2=y # CONFIG_USB_DWC2_HOST is not set # # Gadget/Dual-role mode requires USB Gadget support to be enabled # # CONFIG_USB_DWC2_PERIPHERAL is not set CONFIG_USB_DWC2_DUAL_ROLE=y # CONFIG_USB_DWC2_DEBUG is not set # CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set CONFIG_USB_CHIPIDEA=y CONFIG_USB_CHIPIDEA_UDC=y CONFIG_USB_CHIPIDEA_HOST=y CONFIG_USB_CHIPIDEA_MSM=y CONFIG_USB_CHIPIDEA_IMX=y CONFIG_USB_CHIPIDEA_GENERIC=y CONFIG_USB_CHIPIDEA_TEGRA=y CONFIG_USB_ISP1760=y CONFIG_USB_ISP1760_HCD=y CONFIG_USB_ISP1761_UDC=y # CONFIG_USB_ISP1760_HOST_ROLE is not set # CONFIG_USB_ISP1760_GADGET_ROLE is not set CONFIG_USB_ISP1760_DUAL_ROLE=y # # USB port drivers # # CONFIG_USB_SERIAL is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HUB_USB251XB is not set CONFIG_USB_HSIC_USB3503=y # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # CONFIG_USB_ONBOARD_HUB is not set # # USB Physical Layer drivers # CONFIG_USB_PHY=y CONFIG_NOP_USB_XCEIV=m CONFIG_AM335X_CONTROL_USB=m CONFIG_AM335X_PHY_USB=m CONFIG_USB_GPIO_VBUS=y CONFIG_USB_ISP1301=y # CONFIG_USB_ULPI is not set # end of USB Physical Layer drivers CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GADGET_DEBUG_FILES is not set # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # CONFIG_U_SERIAL_CONSOLE is not set # # USB Peripheral Controller # # CONFIG_USB_FUSB300 is not set # CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set # CONFIG_USB_SNP_UDC_PLAT is not set # CONFIG_USB_M66592 is not set # CONFIG_USB_BDC_UDC is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_GADGET_XILINX is not set # CONFIG_USB_MAX3420_UDC is not set # CONFIG_USB_DUMMY_HCD is not set # end of USB Peripheral Controller CONFIG_USB_LIBCOMPOSITE=m CONFIG_USB_F_ACM=m CONFIG_USB_F_SS_LB=m CONFIG_USB_U_SERIAL=m CONFIG_USB_U_ETHER=m CONFIG_USB_U_AUDIO=m CONFIG_USB_F_SERIAL=m CONFIG_USB_F_OBEX=m CONFIG_USB_F_NCM=m CONFIG_USB_F_ECM=m CONFIG_USB_F_EEM=m CONFIG_USB_F_SUBSET=m CONFIG_USB_F_RNDIS=m CONFIG_USB_F_MASS_STORAGE=m CONFIG_USB_F_FS=m CONFIG_USB_F_UAC1=m CONFIG_USB_F_UAC1_LEGACY=m CONFIG_USB_F_UAC2=m CONFIG_USB_F_UVC=m CONFIG_USB_F_MIDI=m CONFIG_USB_F_HID=m CONFIG_USB_F_PRINTER=m CONFIG_USB_CONFIGFS=m CONFIG_USB_CONFIGFS_SERIAL=y CONFIG_USB_CONFIGFS_ACM=y CONFIG_USB_CONFIGFS_OBEX=y CONFIG_USB_CONFIGFS_NCM=y CONFIG_USB_CONFIGFS_ECM=y CONFIG_USB_CONFIGFS_ECM_SUBSET=y CONFIG_USB_CONFIGFS_RNDIS=y CONFIG_USB_CONFIGFS_EEM=y CONFIG_USB_CONFIGFS_MASS_STORAGE=y CONFIG_USB_CONFIGFS_F_LB_SS=y CONFIG_USB_CONFIGFS_F_FS=y CONFIG_USB_CONFIGFS_F_UAC1=y CONFIG_USB_CONFIGFS_F_UAC1_LEGACY=y CONFIG_USB_CONFIGFS_F_UAC2=y CONFIG_USB_CONFIGFS_F_MIDI=y CONFIG_USB_CONFIGFS_F_HID=y CONFIG_USB_CONFIGFS_F_UVC=y CONFIG_USB_CONFIGFS_F_PRINTER=y # # USB Gadget precomposed configurations # # CONFIG_USB_ZERO is not set # CONFIG_USB_AUDIO is not set CONFIG_USB_ETH=m CONFIG_USB_ETH_RNDIS=y # CONFIG_USB_ETH_EEM is not set # CONFIG_USB_G_NCM is not set # CONFIG_USB_GADGETFS is not set # CONFIG_USB_FUNCTIONFS is not set # CONFIG_USB_MASS_STORAGE is not set # CONFIG_USB_G_SERIAL is not set # CONFIG_USB_MIDI_GADGET is not set # CONFIG_USB_G_PRINTER is not set # CONFIG_USB_CDC_COMPOSITE is not set # CONFIG_USB_G_ACM_MS is not set # CONFIG_USB_G_MULTI is not set # CONFIG_USB_G_HID is not set # CONFIG_USB_G_DBGP is not set # CONFIG_USB_G_WEBCAM is not set # CONFIG_USB_RAW_GADGET is not set # end of USB Gadget precomposed configurations # CONFIG_TYPEC is not set CONFIG_USB_ROLE_SWITCH=y CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y # CONFIG_PWRSEQ_SD8787 is not set CONFIG_PWRSEQ_SIMPLE=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=16 # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_DEBUG is not set CONFIG_MMC_ARMMMCI=y CONFIG_MMC_STM32_SDMMC=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_PLTFM=y CONFIG_MMC_SDHCI_OF_ARASAN=y CONFIG_MMC_SDHCI_OF_AT91=y # CONFIG_MMC_SDHCI_OF_DWCMSHC is not set # CONFIG_MMC_SDHCI_CADENCE is not set # CONFIG_MMC_SDHCI_F_SDH30 is not set # CONFIG_MMC_SDHCI_MILBEAUT is not set # CONFIG_MMC_SPI is not set CONFIG_MMC_DW=y CONFIG_MMC_DW_PLTFM=y # CONFIG_MMC_DW_BLUEFIELD is not set # CONFIG_MMC_DW_EXYNOS is not set # CONFIG_MMC_DW_HI3798CV200 is not set # CONFIG_MMC_DW_K3 is not set CONFIG_MMC_DW_ROCKCHIP=y # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_CQHCI=y # CONFIG_MMC_HSQ is not set # CONFIG_MMC_MTK is not set # CONFIG_MMC_SDHCI_XENON is not set CONFIG_MMC_SDHCI_OMAP=y # CONFIG_MMC_SDHCI_AM654 is not set CONFIG_MMC_SDHCI_EXTERNAL_DMA=y # CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y CONFIG_LEDS_CLASS_FLASH=m # CONFIG_LEDS_CLASS_MULTICOLOR is not set # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_AW2013 is not set # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set CONFIG_LEDS_CPCAP=m # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_EL15203000 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP50XX is not set # CONFIG_LEDS_LP55XX_COMMON is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set CONFIG_LEDS_PWM=y # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set CONFIG_LEDS_MAX8997=m # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_SYSCON is not set # CONFIG_LEDS_PM8058 is not set # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_SPI_BYTE is not set # CONFIG_LEDS_TI_LMU_COMMON is not set # # Flash and Torch LED drivers # # CONFIG_LEDS_AAT1290 is not set # CONFIG_LEDS_AS3645A is not set # CONFIG_LEDS_KTD2692 is not set # CONFIG_LEDS_LM3601X is not set # CONFIG_LEDS_MAX77693 is not set # CONFIG_LEDS_RT4505 is not set # CONFIG_LEDS_RT8515 is not set # CONFIG_LEDS_SGM3140 is not set # # RGB LED drivers # # # LED Triggers # CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y # CONFIG_LEDS_TRIGGER_MTD is not set CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_BACKLIGHT=y CONFIG_LEDS_TRIGGER_CPU=y CONFIG_LEDS_TRIGGER_ACTIVITY=y CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # # iptables trigger is under Netfilter config (LED target) # CONFIG_LEDS_TRIGGER_TRANSIENT=y CONFIG_LEDS_TRIGGER_CAMERA=y # CONFIG_LEDS_TRIGGER_PANIC is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set # CONFIG_LEDS_TRIGGER_AUDIO is not set # CONFIG_LEDS_TRIGGER_TTY is not set # # Simple LED drivers # # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_ATOMIC_SCRUB=y CONFIG_EDAC_SUPPORT=y CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # 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_AS3722=y CONFIG_RTC_DRV_DS1307=y # CONFIG_RTC_DRV_DS1307_CENTURY is not set # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set CONFIG_RTC_DRV_HYM8563=m # CONFIG_RTC_DRV_MAX6900 is not set CONFIG_RTC_DRV_MAX8907=y CONFIG_RTC_DRV_MAX8998=m CONFIG_RTC_DRV_MAX8997=m CONFIG_RTC_DRV_MAX77686=y # CONFIG_RTC_DRV_NCT3018Y is not set CONFIG_RTC_DRV_RK808=y CONFIG_RTC_DRV_RS5C372=m # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set CONFIG_RTC_DRV_BQ32K=m CONFIG_RTC_DRV_PALMAS=y CONFIG_RTC_DRV_TPS6586X=y CONFIG_RTC_DRV_TPS65910=y # CONFIG_RTC_DRV_RC5T619 is not set CONFIG_RTC_DRV_S35390A=m # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set CONFIG_RTC_DRV_RX8581=m # CONFIG_RTC_DRV_RX8025 is not set CONFIG_RTC_DRV_EM3027=y # CONFIG_RTC_DRV_RV3028 is not set # CONFIG_RTC_DRV_RV3032 is not set # CONFIG_RTC_DRV_RV8803 is not set CONFIG_RTC_DRV_S5M=m # CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_CMOS is not set # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set CONFIG_RTC_DRV_DA9063=m # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_OPTEE is not set # CONFIG_RTC_DRV_ZYNQMP is not set # CONFIG_RTC_DRV_CROS_EC is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_PL030 is not set CONFIG_RTC_DRV_PL031=y # CONFIG_RTC_DRV_CADENCE is not set # CONFIG_RTC_DRV_FTRTC010 is not set # CONFIG_RTC_DRV_PM8XXX is not set # CONFIG_RTC_DRV_R7301 is not set CONFIG_RTC_DRV_CPCAP=m # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_VIRTUAL_CHANNELS=y CONFIG_DMA_OF=y # CONFIG_ALTERA_MSGDMA is not set # CONFIG_AMBA_PL08X is not set # CONFIG_DW_AXI_DMAC is not set CONFIG_FSL_EDMA=y # CONFIG_FSL_QDMA is not set # CONFIG_INTEL_IDMA64 is not set # CONFIG_NBPFAXI_DMA is not set CONFIG_PL330_DMA=y # CONFIG_XILINX_ZYNQMP_DPDMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set CONFIG_DW_DMAC_CORE=y CONFIG_DW_DMAC=y # CONFIG_SF_PDMA is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set CONFIG_DMABUF_HEAPS=y # CONFIG_DMABUF_SYSFS_STATS is not set CONFIG_DMABUF_HEAPS_SYSTEM=y CONFIG_DMABUF_HEAPS_CMA=y # end of DMABUF options # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set CONFIG_VIRTIO_ANCHOR=y CONFIG_VIRTIO=y CONFIG_VIRTIO_MENU=y # CONFIG_VIRTIO_BALLOON is not set # CONFIG_VIRTIO_INPUT is not set CONFIG_VIRTIO_MMIO=y # CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set # CONFIG_VDPA is not set CONFIG_VHOST_MENU=y # CONFIG_VHOST_NET is not set # CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set # # Microsoft Hyper-V guest support # # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_RTLLIB is not set CONFIG_RTL8723BS=m # CONFIG_R8712U is not set CONFIG_R8188EU=m # CONFIG_VT6656 is not set # # IIO staging drivers # # # Accelerometers # # CONFIG_ADIS16203 is not set # CONFIG_ADIS16240 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7816 is not set # end of Analog to digital converters # # Analog digital bi-direction converters # # CONFIG_ADT7316 is not set # end of Analog digital bi-direction converters # # Direct Digital Synthesis # # CONFIG_AD9832 is not set # CONFIG_AD9834 is not set # end of Direct Digital Synthesis # # Network Analyzer, Impedance Converters # # CONFIG_AD5933 is not set # end of Network Analyzer, Impedance Converters # # Active energy metering IC # # CONFIG_ADE7854 is not set # end of Active energy metering IC # # Resolver to digital converters # # CONFIG_AD2S1210 is not set # end of Resolver to digital converters # end of IIO staging drivers CONFIG_STAGING_MEDIA=y # CONFIG_VIDEO_MAX96712 is not set CONFIG_VIDEO_ROCKCHIP_VDEC=m CONFIG_STAGING_MEDIA_DEPRECATED=y # CONFIG_VIDEO_CPIA2 is not set # CONFIG_VIDEO_STKWEBCAM is not set CONFIG_VIDEO_TM6000=m CONFIG_VIDEO_TM6000_ALSA=m CONFIG_VIDEO_TM6000_DVB=m # CONFIG_USB_ZR364XX is not set # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_FB_TFT is not set # CONFIG_KS7010 is not set # CONFIG_PI433 is not set # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_FIELDBUS_DEV is not set # CONFIG_GOLDFISH is not set CONFIG_CHROME_PLATFORMS=y CONFIG_CROS_EC=m # CONFIG_CROS_EC_I2C is not set # CONFIG_CROS_EC_RPMSG is not set # CONFIG_CROS_EC_SPI is not set CONFIG_CROS_EC_PROTO=y # CONFIG_CROS_KBD_LED_BACKLIGHT is not set CONFIG_CROS_EC_CHARDEV=m CONFIG_CROS_EC_LIGHTBAR=m CONFIG_CROS_EC_VBC=m CONFIG_CROS_EC_DEBUGFS=m CONFIG_CROS_EC_SENSORHUB=m CONFIG_CROS_EC_SYSFS=m CONFIG_CROS_USBPD_NOTIFY=m # CONFIG_MELLANOX_PLATFORM is not set CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Clock driver for ARM Reference designs # # CONFIG_CLK_ICST is not set # CONFIG_CLK_SP810 is not set # end of Clock driver for ARM Reference designs # CONFIG_LMK04832 is not set CONFIG_COMMON_CLK_MAX77686=y # CONFIG_COMMON_CLK_MAX9485 is not set CONFIG_COMMON_CLK_RK808=y CONFIG_COMMON_CLK_SCMI=m CONFIG_COMMON_CLK_SCPI=m # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set CONFIG_COMMON_CLK_S2MPS11=m # CONFIG_COMMON_CLK_AXI_CLKGEN is not set # CONFIG_COMMON_CLK_PALMAS is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_RS9_PCIE is not set # CONFIG_COMMON_CLK_VC5 is not set # CONFIG_COMMON_CLK_VC7 is not set # CONFIG_COMMON_CLK_FIXED_MMIO is not set CONFIG_COMMON_CLK_ROCKCHIP=y # CONFIG_CLK_RV110X is not set # CONFIG_CLK_RV1126 is not set # CONFIG_CLK_RK3036 is not set # CONFIG_CLK_RK312X is not set # CONFIG_CLK_RK3188 is not set # CONFIG_CLK_RK322X is not set CONFIG_CLK_RK3288=y # CONFIG_XILINX_VCU is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set # CONFIG_HWSPINLOCK is not set # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_PROBE=y CONFIG_CLKSRC_MMIO=y CONFIG_DW_APB_TIMER=y CONFIG_DW_APB_TIMER_OF=y CONFIG_ROCKCHIP_TIMER=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y CONFIG_ARM_GLOBAL_TIMER=y CONFIG_ARM_GT_INITIAL_PRESCALER_VAL=1 CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK=y # CONFIG_MICROCHIP_PIT64B is not set # end of Clock Source drivers CONFIG_MAILBOX=y CONFIG_ARM_MHU=m # CONFIG_ARM_MHU_V2 is not set CONFIG_PLATFORM_MHU=m # CONFIG_PL320_MBOX is not set CONFIG_ROCKCHIP_MBOX=y # CONFIG_ALTERA_MBOX is not set # CONFIG_MAILBOX_TEST is not set CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # CONFIG_IOMMU_IO_PGTABLE=y CONFIG_IOMMU_IO_PGTABLE_LPAE=y # CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set # CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set CONFIG_IOMMU_DEFAULT_DMA_STRICT=y # CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_OF_IOMMU=y CONFIG_ROCKCHIP_IOMMU=y # CONFIG_ARM_SMMU is not set # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # end of Remoteproc drivers # # Rpmsg drivers # CONFIG_RPMSG=m # CONFIG_RPMSG_CHAR is not set # CONFIG_RPMSG_CTRL is not set CONFIG_RPMSG_NS=m # CONFIG_RPMSG_QCOM_GLINK_RPM is not set CONFIG_RPMSG_VIRTIO=m # end of Rpmsg drivers # CONFIG_SOUNDWIRE is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # end of Amlogic SoC drivers # # Broadcom SoC drivers # # CONFIG_SOC_BRCMSTB is not set # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # CONFIG_QUICC_ENGINE is not set # CONFIG_FSL_RCPM is not set # end of NXP/Freescale QorIQ SoC drivers # # fujitsu SoC drivers # # end of fujitsu SoC drivers # # i.MX SoC drivers # # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # CONFIG_LITEX_SOC_CONTROLLER is not set # end of Enable LiteX SoC Builder specific drivers # # Qualcomm SoC drivers # # end of Qualcomm SoC drivers CONFIG_ROCKCHIP_GRF=y CONFIG_ROCKCHIP_IODOMAIN=y CONFIG_ROCKCHIP_PM_DOMAINS=y # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y CONFIG_DEVFREQ_GOV_PERFORMANCE=y CONFIG_DEVFREQ_GOV_POWERSAVE=y CONFIG_DEVFREQ_GOV_USERSPACE=y CONFIG_DEVFREQ_GOV_PASSIVE=y # # DEVFREQ Drivers # # CONFIG_ARM_RK3399_DMC_DEVFREQ is not set CONFIG_PM_DEVFREQ_EVENT=y # CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_FSA9480 is not set # CONFIG_EXTCON_GPIO is not set # CONFIG_EXTCON_MAX14577 is not set # CONFIG_EXTCON_MAX3355 is not set # CONFIG_EXTCON_MAX77693 is not set # CONFIG_EXTCON_MAX8997 is not set # CONFIG_EXTCON_PALMAS 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 # CONFIG_EXTCON_USBC_CROS_EC is not set # CONFIG_MEMORY is not set CONFIG_IIO=y CONFIG_IIO_BUFFER=y CONFIG_IIO_BUFFER_CB=m # CONFIG_IIO_BUFFER_DMA is not set # CONFIG_IIO_BUFFER_DMAENGINE is not set # CONFIG_IIO_BUFFER_HW_CONSUMER is not set CONFIG_IIO_KFIFO_BUF=y CONFIG_IIO_TRIGGERED_BUFFER=y CONFIG_IIO_CONFIGFS=y CONFIG_IIO_TRIGGER=y CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # CONFIG_IIO_SW_DEVICE is not set CONFIG_IIO_SW_TRIGGER=y # CONFIG_IIO_TRIGGERED_EVENT is not set # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADXL313_I2C is not set # CONFIG_ADXL313_SPI is not set # CONFIG_ADXL355_I2C is not set # CONFIG_ADXL355_SPI is not set # CONFIG_ADXL367_SPI is not set # CONFIG_ADXL367_I2C is not set # CONFIG_ADXL372_SPI is not set # CONFIG_ADXL372_I2C is not set # CONFIG_BMA180 is not set # CONFIG_BMA220 is not set # CONFIG_BMA400 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_BMI088_ACCEL is not set # CONFIG_DA280 is not set # CONFIG_DA311 is not set # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_DMARD10 is not set # CONFIG_FXLS8962AF_I2C is not set # CONFIG_FXLS8962AF_SPI is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MC3230 is not set # CONFIG_MMA7455_I2C is not set # CONFIG_MMA7455_SPI is not set # CONFIG_MMA7660 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MSA311 is not set # CONFIG_MXC4005 is not set # CONFIG_MXC6255 is not set # CONFIG_SCA3000 is not set # CONFIG_SCA3300 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7091R5 is not set # CONFIG_AD7124 is not set # CONFIG_AD7192 is not set # CONFIG_AD7266 is not set # CONFIG_AD7280 is not set # CONFIG_AD7291 is not set # CONFIG_AD7292 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_AD7780 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD7949 is not set # CONFIG_AD799X is not set # CONFIG_ADI_AXI_ADC is not set # CONFIG_AXP20X_ADC is not set # CONFIG_AXP288_ADC is not set # CONFIG_CC10001_ADC is not set CONFIG_CPCAP_ADC=m # CONFIG_ENVELOPE_DETECTOR is not set # CONFIG_HI8435 is not set # CONFIG_HX711 is not set # CONFIG_INA2XX_ADC is not set # CONFIG_LTC2471 is not set # CONFIG_LTC2485 is not set # CONFIG_LTC2496 is not set # CONFIG_LTC2497 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX11100 is not set # CONFIG_MAX1118 is not set # CONFIG_MAX11205 is not set # CONFIG_MAX1241 is not set # CONFIG_MAX1363 is not set # CONFIG_MAX9611 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_MCP3911 is not set # CONFIG_NAU7802 is not set # CONFIG_PALMAS_GPADC is not set # CONFIG_QCOM_PM8XXX_XOADC is not set # CONFIG_QCOM_SPMI_IADC is not set # CONFIG_QCOM_SPMI_VADC is not set # CONFIG_QCOM_SPMI_ADC5 is not set # CONFIG_RN5T618_ADC is not set CONFIG_ROCKCHIP_SARADC=y # CONFIG_RICHTEK_RTQ6056 is not set # CONFIG_SD_ADC_MODULATOR is not set # CONFIG_STMPE_ADC is not set # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC0832 is not set # CONFIG_TI_ADC084S021 is not set # CONFIG_TI_ADC12138 is not set # CONFIG_TI_ADC108S102 is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_TI_ADC161S626 is not set # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS7950 is not set # CONFIG_TI_ADS8344 is not set # CONFIG_TI_ADS8688 is not set # CONFIG_TI_ADS124S08 is not set # CONFIG_TI_ADS131E08 is not set # CONFIG_TI_TLC4541 is not set # CONFIG_TI_TSC2046 is not set CONFIG_VF610_ADC=m # CONFIG_XILINX_XADC is not set # end of Analog to digital converters # # Analog to digital and digital to analog converters # # CONFIG_AD74413R is not set # end of Analog to digital and digital to analog converters # # Analog Front Ends # # CONFIG_IIO_RESCALE is not set # end of Analog Front Ends # # Amplifiers # # CONFIG_AD8366 is not set # CONFIG_ADA4250 is not set # CONFIG_HMC425 is not set # end of Amplifiers # # Capacitance to digital converters # # CONFIG_AD7150 is not set # CONFIG_AD7746 is not set # end of Capacitance to digital converters # # Chemical Sensors # # CONFIG_ATLAS_PH_SENSOR is not set # CONFIG_ATLAS_EZO_SENSOR is not set # CONFIG_BME680 is not set # CONFIG_CCS811 is not set # CONFIG_IAQCORE is not set # CONFIG_PMS7003 is not set # CONFIG_SCD30_CORE is not set # CONFIG_SCD4X is not set # CONFIG_SENSIRION_SGP30 is not set # CONFIG_SENSIRION_SGP40 is not set # CONFIG_SPS30_I2C is not set # CONFIG_SPS30_SERIAL is not set # CONFIG_SENSEAIR_SUNRISE_CO2 is not set # CONFIG_VZ89X is not set # end of Chemical Sensors # CONFIG_IIO_CROS_EC_SENSORS_CORE is not set # # Hid Sensor IIO Common # # end of Hid Sensor IIO Common # # IIO SCMI Sensors # # CONFIG_IIO_SCMI is not set # end of IIO SCMI Sensors # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # end of SSP Sensor Common # # Digital to analog converters # # CONFIG_AD3552R is not set # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5592R is not set # CONFIG_AD5593R is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_LTC2688 is not set # CONFIG_AD5686_SPI is not set # CONFIG_AD5696_I2C is not set # CONFIG_AD5755 is not set # CONFIG_AD5758 is not set # CONFIG_AD5761 is not set # CONFIG_AD5764 is not set # CONFIG_AD5766 is not set # CONFIG_AD5770R is not set # CONFIG_AD5791 is not set # CONFIG_AD7293 is not set # CONFIG_AD7303 is not set # CONFIG_AD8801 is not set # CONFIG_DPOT_DAC is not set # CONFIG_DS4424 is not set # CONFIG_LTC1660 is not set # CONFIG_LTC2632 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # 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 # end of Digital to analog converters # # IIO dummy driver # # end of IIO dummy driver # # Filters # # end of Filters # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # end of Clock Generator/Distribution # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # CONFIG_ADF4371 is not set # CONFIG_ADMV1013 is not set # CONFIG_ADMV4420 is not set # CONFIG_ADRF6780 is not set # end of Phase-Locked Loop (PLL) frequency synthesizers # end of Frequency Synthesizers DDS/PLL # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS290 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_FXAS21002C is not set CONFIG_MPU3050=y CONFIG_MPU3050_I2C=y # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # end of Digital gyroscope sensors # # Health Sensors # # # Heart Rate Monitors # # CONFIG_AFE4403 is not set # CONFIG_AFE4404 is not set # CONFIG_MAX30100 is not set # CONFIG_MAX30102 is not set # end of Heart Rate Monitors # end of Health Sensors # # Humidity sensors # # CONFIG_AM2315 is not set # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HDC2010 is not set # CONFIG_HTS221 is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # end of Humidity sensors # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16460 is not set # CONFIG_ADIS16475 is not set # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set # CONFIG_BOSCH_BNO055_SERIAL is not set # CONFIG_BOSCH_BNO055_I2C is not set # CONFIG_FXOS8700_I2C is not set # CONFIG_FXOS8700_SPI is not set # CONFIG_KMX61 is not set # CONFIG_INV_ICM42600_I2C is not set # CONFIG_INV_ICM42600_SPI is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set # CONFIG_IIO_ST_LSM6DSX is not set # CONFIG_IIO_ST_LSM9DS0 is not set # end of Inertial measurement units # # Light sensors # # CONFIG_ADJD_S311 is not set # CONFIG_ADUX1020 is not set # CONFIG_AL3010 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_AS73211 is not set # CONFIG_BH1750 is not set # CONFIG_BH1780 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM3605 is not set CONFIG_CM36651=m # CONFIG_GP2AP002 is not set # CONFIG_GP2AP020A00F is not set CONFIG_SENSORS_ISL29018=y CONFIG_SENSORS_ISL29028=y # CONFIG_ISL29125 is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_LTRF216A is not set # CONFIG_LV0104CS is not set # CONFIG_MAX44000 is not set # CONFIG_MAX44009 is not set # CONFIG_NOA1305 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1133 is not set # CONFIG_SI1145 is not set # CONFIG_STK3310 is not set # CONFIG_ST_UVIS25 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set # CONFIG_SENSORS_TSL2563 is not set # CONFIG_TSL2583 is not set # CONFIG_TSL2591 is not set # CONFIG_TSL2772 is not set # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VCNL4035 is not set # CONFIG_VEML6030 is not set # CONFIG_VEML6070 is not set # CONFIG_VL6180 is not set # CONFIG_ZOPT2201 is not set # end of Light sensors # # Magnetometer sensors # # CONFIG_AK8974 is not set CONFIG_AK8975=y # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN_I2C is not set # CONFIG_BMC150_MAGN_SPI is not set # CONFIG_MAG3110 is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # CONFIG_SENSORS_RM3100_I2C is not set # CONFIG_SENSORS_RM3100_SPI is not set # CONFIG_YAMAHA_YAS530 is not set # end of Magnetometer sensors # # Multiplexers # # CONFIG_IIO_MUX is not set # end of Multiplexers # # Inclinometer sensors # # end of Inclinometer sensors # # Triggers - standalone # CONFIG_IIO_HRTIMER_TRIGGER=y # CONFIG_IIO_INTERRUPT_TRIGGER is not set # CONFIG_IIO_TIGHTLOOP_TRIGGER is not set # CONFIG_IIO_SYSFS_TRIGGER is not set # end of Triggers - standalone # # Linear and angular position sensors # # end of Linear and angular position sensors # # Digital potentiometers # # CONFIG_AD5110 is not set # CONFIG_AD5272 is not set # CONFIG_DS1803 is not set # CONFIG_MAX5432 is not set # CONFIG_MAX5481 is not set # CONFIG_MAX5487 is not set # CONFIG_MCP4018 is not set # CONFIG_MCP4131 is not set # CONFIG_MCP4531 is not set # CONFIG_MCP41010 is not set # CONFIG_TPL0102 is not set # end of Digital potentiometers # # Digital potentiostats # # CONFIG_LMP91000 is not set # end of Digital potentiostats # # Pressure sensors # # CONFIG_ABP060MG is not set # CONFIG_BMP280 is not set # CONFIG_DLHL60D is not set # CONFIG_DPS310 is not set # CONFIG_HP03 is not set # CONFIG_ICP10100 is not set # CONFIG_MPL115_I2C is not set # CONFIG_MPL115_SPI is not set # CONFIG_MPL3115 is not set # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # CONFIG_HP206C is not set # CONFIG_ZPA2326 is not set # end of Pressure sensors # # Lightning sensors # # CONFIG_AS3935 is not set # end of Lightning sensors # # Proximity and distance sensors # # CONFIG_CROS_EC_MKBP_PROXIMITY is not set # CONFIG_ISL29501 is not set # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_MB1232 is not set # CONFIG_PING is not set # CONFIG_RFD77402 is not set # CONFIG_SRF04 is not set # CONFIG_SX9310 is not set # CONFIG_SX9324 is not set # CONFIG_SX9360 is not set # CONFIG_SX9500 is not set # CONFIG_SRF08 is not set # CONFIG_VCNL3020 is not set # CONFIG_VL53L0X_I2C is not set # end of Proximity and distance sensors # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1200 is not set # end of Resolver to digital converters # # Temperature sensors # # CONFIG_LTC2983 is not set # CONFIG_MAXIM_THERMOCOUPLE is not set # CONFIG_MLX90614 is not set # CONFIG_MLX90632 is not set # CONFIG_TMP006 is not set # CONFIG_TMP007 is not set # CONFIG_TMP117 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_MAX31856 is not set # CONFIG_MAX31865 is not set # end of Temperature sensors CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_DEBUG is not set CONFIG_PWM_ATMEL_HLCDC_PWM=m # CONFIG_PWM_ATMEL_TCB is not set # CONFIG_PWM_CLK is not set # CONFIG_PWM_CROS_EC is not set CONFIG_PWM_FSL_FTM=m # CONFIG_PWM_PCA9685 is not set CONFIG_PWM_ROCKCHIP=y # CONFIG_PWM_STMPE is not set # CONFIG_PWM_XILINX is not set # # IRQ chip support # CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 # CONFIG_AL_FIC is not set # CONFIG_XILINX_INTC is not set # end of IRQ chip support # CONFIG_IPACK_BUS is not set CONFIG_ARCH_HAS_RESET_CONTROLLER=y CONFIG_RESET_CONTROLLER=y CONFIG_RESET_SCMI=y # CONFIG_RESET_TI_SYSCON is not set # CONFIG_RESET_TI_TPS380X is not set # # PHY Subsystem # CONFIG_GENERIC_PHY=y # CONFIG_PHY_CAN_TRANSCEIVER is not set # # PHY drivers for Broadcom platforms # # CONFIG_BCM_KONA_USB2_PHY is not set # end of PHY drivers for Broadcom platforms # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_DPHY_RX is not set # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_CADENCE_SALVO is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_LAN966X_SERDES is not set # CONFIG_PHY_CPCAP_USB is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set # CONFIG_PHY_OCELOT_SERDES is not set # CONFIG_PHY_QCOM_USB_HS is not set # CONFIG_PHY_QCOM_USB_HSIC is not set CONFIG_PHY_ROCKCHIP_DP=m # CONFIG_PHY_ROCKCHIP_DPHY_RX0 is not set CONFIG_PHY_ROCKCHIP_EMMC=m # CONFIG_PHY_ROCKCHIP_INNO_HDMI is not set CONFIG_PHY_ROCKCHIP_INNO_USB2=m # CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY is not set # CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY is not set # CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY is not set # CONFIG_PHY_ROCKCHIP_PCIE is not set # CONFIG_PHY_ROCKCHIP_SNPS_PCIE3 is not set # CONFIG_PHY_ROCKCHIP_TYPEC is not set CONFIG_PHY_ROCKCHIP_USB=y # CONFIG_PHY_SAMSUNG_USB2 is not set # CONFIG_PHY_TUSB1210 is not set # end of PHY Subsystem # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCI_PMU is not set # CONFIG_ARM_CCN is not set CONFIG_ARM_PMU=y # end of Performance monitor support # CONFIG_RAS is not set # # Android # # CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y # CONFIG_NVMEM_RMEM is not set CONFIG_NVMEM_ROCKCHIP_EFUSE=y CONFIG_NVMEM_ROCKCHIP_OTP=m # CONFIG_NVMEM_SPMI_SDAM is not set CONFIG_NVMEM_U_BOOT_ENV=m # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_FSI is not set CONFIG_TEE=y CONFIG_OPTEE=m CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set # CONFIG_PECI is not set # CONFIG_HTE is not set # end of Device Drivers # # 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 CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=m CONFIG_XFS_SUPPORT_V4=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_ONLINE_SCRUB is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_BTRFS_FS_REF_VERIFY is not set # CONFIG_NILFS2_FS is not set CONFIG_F2FS_FS=y CONFIG_F2FS_STAT_FS=y # CONFIG_F2FS_FS_XATTR is not set CONFIG_F2FS_CHECK_FS=y # CONFIG_F2FS_FAULT_INJECTION is not set # CONFIG_F2FS_FS_COMPRESSION is not set CONFIG_F2FS_IOSTAT=y # CONFIG_F2FS_UNFAIR_RWSEM is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QUOTA_DEBUG is not set # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS4_FS=y CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=m CONFIG_CUSE=m # CONFIG_VIRTIO_FS is not set CONFIG_OVERLAY_FS=m # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_METACOPY is not set # # Caches # CONFIG_NETFS_SUPPORT=y # CONFIG_NETFS_STATS is not set CONFIG_FSCACHE=y # CONFIG_FSCACHE_STATS is not set # CONFIG_FSCACHE_DEBUG is not set # CONFIG_CACHEFILES is not set # end of Caches # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=y # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=m CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set CONFIG_NTFS3_FS=m # CONFIG_NTFS3_LZX_XPRESS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_PROC_CHILDREN=y CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y CONFIG_MEMFD_CREATE=y CONFIG_CONFIGFS_FS=y # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set CONFIG_HFS_FS=y CONFIG_HFSPLUS_FS=y # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS2_FS is not set # CONFIG_UBIFS_FS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y CONFIG_SQUASHFS_FILE_CACHE=y # CONFIG_SQUASHFS_FILE_DIRECT is not set # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 CONFIG_PSTORE_DEFLATE_COMPRESS=y # CONFIG_PSTORE_LZO_COMPRESS is not set # CONFIG_PSTORE_LZ4_COMPRESS is not set # CONFIG_PSTORE_LZ4HC_COMPRESS is not set # CONFIG_PSTORE_842_COMPRESS is not set # CONFIG_PSTORE_ZSTD_COMPRESS is not set CONFIG_PSTORE_COMPRESS=y CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" CONFIG_PSTORE_CONSOLE=y CONFIG_PSTORE_PMSG=y CONFIG_PSTORE_RAM=y # CONFIG_PSTORE_BLK is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y # CONFIG_NFS_SWAP is not set CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=m CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" CONFIG_NFS_V4_1_MIGRATION=y CONFIG_ROOT_NFS=y CONFIG_NFS_FSCACHE=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFS_DISABLE_UDP_SUPPORT=y # CONFIG_NFS_V4_2_READ_PLUS is not set # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_COMMON=y CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS2=y CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set CONFIG_CIFS_DEBUG=y # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DEBUG_DUMP_KEYS is not set # CONFIG_CIFS_DFS_UPCALL is not set # CONFIG_CIFS_SWN_UPCALL is not set CONFIG_CIFS_FSCACHE=y # CONFIG_CIFS_ROOT is not set # CONFIG_SMB_SERVER is not set CONFIG_SMBFS=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEY_DH_OPERATIONS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_LSM="yama,loadpin,safesetid,integrity" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_STACK_ALL_PATTERN is not set # CONFIG_INIT_STACK_ALL_ZERO is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization CONFIG_RANDSTRUCT_NONE=y # CONFIG_RANDSTRUCT_FULL is not set # CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y CONFIG_CRYPTO_USER=m CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_SIMD=y CONFIG_CRYPTO_ENGINE=m # end of Crypto core or helper # # Public-key cryptography # CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y # CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set CONFIG_CRYPTO_ECC=m CONFIG_CRYPTO_ECDH=m # CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set CONFIG_CRYPTO_CURVE25519=m # end of Public-key cryptography # # Block ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SM4_GENERIC is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set CONFIG_CRYPTO_CTR=y # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set CONFIG_CRYPTO_NHPOLY1305=y # end of Length-preserving ciphers and modes # # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y # CONFIG_CRYPTO_ESSIV is not set # end of AEAD (authenticated encryption with associated data) ciphers # # Hashes, digests, and MACs # CONFIG_CRYPTO_BLAKE2B=y CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_XCBC is not set CONFIG_CRYPTO_XXHASH=m # end of Hashes, digests, and MACs # # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y # CONFIG_CRYPTO_CRCT10DIF is not set # end of CRCs (cyclic redundancy checks) # # Compression # CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_LZO=y # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set CONFIG_CRYPTO_ZSTD=y # end of Compression # # Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation # # Userspace interface # CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y CONFIG_CRYPTO_USER_API_RNG=m # CONFIG_CRYPTO_USER_API_RNG_CAVP is not set CONFIG_CRYPTO_USER_API_AEAD=m CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # CONFIG_CRYPTO_STATS is not set # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y # # Accelerated Cryptographic Algorithms for CPU (arm) # CONFIG_CRYPTO_CURVE25519_NEON=y # CONFIG_CRYPTO_GHASH_ARM_CE is not set CONFIG_CRYPTO_NHPOLY1305_NEON=y CONFIG_CRYPTO_POLY1305_ARM=y CONFIG_CRYPTO_BLAKE2S_ARM=y CONFIG_CRYPTO_BLAKE2B_NEON=y CONFIG_CRYPTO_SHA1_ARM=y CONFIG_CRYPTO_SHA1_ARM_NEON=y # CONFIG_CRYPTO_SHA1_ARM_CE is not set # CONFIG_CRYPTO_SHA2_ARM_CE is not set CONFIG_CRYPTO_SHA256_ARM=y CONFIG_CRYPTO_SHA512_ARM=y CONFIG_CRYPTO_AES_ARM=y CONFIG_CRYPTO_AES_ARM_BS=y # CONFIG_CRYPTO_AES_ARM_CE is not set CONFIG_CRYPTO_CHACHA20_NEON=y CONFIG_CRYPTO_CRC32_ARM_CE=y # end of Accelerated Cryptographic Algorithms for CPU (arm) CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_ATMEL_ECC is not set # CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set # CONFIG_CRYPTO_DEV_ROCKCHIP is not set CONFIG_CRYPTO_DEV_VIRTIO=m # CONFIG_CRYPTO_DEV_SAFEXCEL is not set # CONFIG_CRYPTO_DEV_CCREE is not set # CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS8_PRIVATE_KEY_PARSER=m CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m CONFIG_RAID6_PQ_BENCHMARK=y CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_CORDIC=m # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y # # Crypto library routines # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CHACHA=m CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=y CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=y CONFIG_CRYPTO_LIB_CURVE25519=m CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y CONFIG_CRYPTO_LIB_POLY1305=m CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_CRC_CCITT=m CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC64_ROCKSOFT is not set CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=m # CONFIG_CRC8 is not set CONFIG_XXHASH=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=y CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y CONFIG_XZ_DEC_POWERPC=y CONFIG_XZ_DEC_IA64=y CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y CONFIG_XZ_DEC_SPARC=y # CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_ZSTD=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_DMA_DECLARE_COHERENT=y CONFIG_ARCH_HAS_SETUP_DMA_OPS=y CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_CMA=y # CONFIG_DMA_PERNUMA_CMA is not set # # Default contiguous memory area size: # CONFIG_CMA_SIZE_MBYTES=64 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_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y # CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_32=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y # end of Library routines CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set # CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_SYMBOLIC_ERRNAME=y CONFIG_DEBUG_BUGVERBOSE=y # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Compile-time checks and compiler options # CONFIG_DEBUG_INFO=y CONFIG_AS_HAS_NON_CONST_LEB128=y # CONFIG_DEBUG_INFO_NONE is not set CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_INFO_COMPRESSED is not set # CONFIG_DEBUG_INFO_SPLIT is not set # CONFIG_DEBUG_INFO_BTF is not set # CONFIG_GDB_SCRIPTS is not set CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # # CONFIG_MAGIC_SYSRQ is not set CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set # CONFIG_UBSAN is not set CONFIG_HAVE_KCSAN_COMPILER=y # end of Generic Kernel Debugging Instruments # # Networking Debugging # # CONFIG_NET_DEV_REFCNT_TRACKER is not set # CONFIG_NET_NS_REFCNT_TRACKER is not set # CONFIG_DEBUG_NET is not set # end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_DEBUG_ON 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 # CONFIG_DEBUG_WX is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set # CONFIG_DEBUG_VM is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_DEBUG_PER_CPU_MAPS is not set # CONFIG_DEBUG_KMAP_LOCAL is not set # CONFIG_DEBUG_HIGHMEM is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y # CONFIG_KFENCE is not set # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 # CONFIG_SOFTLOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # CONFIG_SCHED_DEBUG=y CONFIG_SCHED_INFO=y # CONFIG_SCHEDSTATS is not set # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # end of Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 CONFIG_RCU_TRACE=y # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_TRACING=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y # CONFIG_BOOTTIME_TRACING is not set # CONFIG_FUNCTION_TRACER is not set # CONFIG_STACK_TRACER is not set # CONFIG_IRQSOFF_TRACER is not set # CONFIG_SCHED_TRACER is not set # CONFIG_HWLAT_TRACER is not set # CONFIG_OSNOISE_TRACER is not set # CONFIG_TIMERLAT_TRACER is not set # CONFIG_ENABLE_DEFAULT_TRACERS is not set # CONFIG_FTRACE_SYSCALLS is not set # CONFIG_TRACER_SNAPSHOT is not set CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set # CONFIG_BLK_DEV_IO_TRACE is not set CONFIG_UPROBE_EVENTS=y CONFIG_BPF_EVENTS=y CONFIG_DYNAMIC_EVENTS=y CONFIG_PROBE_EVENTS=y # CONFIG_SYNTH_EVENTS is not set # CONFIG_HIST_TRIGGERS is not set # CONFIG_TRACE_EVENT_INJECT is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_TRACE_EVAL_MAP_FILE is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set # CONFIG_PREEMPTIRQ_DELAY_TEST is not set # CONFIG_RV is not set # CONFIG_SAMPLES is not set # CONFIG_STRICT_DEVMEM is not set # # arm Debugging # # CONFIG_ARM_PTDUMP_DEBUGFS is not set # CONFIG_UNWINDER_FRAME_POINTER is not set CONFIG_UNWINDER_ARM=y CONFIG_ARM_UNWIND=y # CONFIG_DEBUG_USER is not set # CONFIG_DEBUG_LL is not set CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_CORESIGHT is not set # end of arm Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set # CONFIG_TEST_MIN_HEAP is not set # CONFIG_TEST_DIV64 is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_TEST_REF_TRACKER is not set # CONFIG_RBTREE_TEST is not set # CONFIG_REED_SOLOMON_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set # CONFIG_STRING_SELFTEST is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_STRSCPY is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_SCANF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_XARRAY is not set # CONFIG_TEST_MAPLE_TREE is not set # CONFIG_TEST_RHASHTABLE is not set # CONFIG_TEST_SIPHASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_BITOPS is not set # CONFIG_TEST_VMALLOC is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_TEST_BLACKHOLE_DEV is not set # CONFIG_FIND_BIT_BENCHMARK is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_SYSCTL is not set # CONFIG_TEST_UDELAY is not set # CONFIG_TEST_STATIC_KEYS is not set # CONFIG_TEST_DYNAMIC_DEBUG is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMCAT_P is not set # CONFIG_TEST_MEMINIT is not set # CONFIG_TEST_FREE_PAGES is not set CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage # # Rust hacking # # end of Rust hacking # end of Kernel hacking ================================================ FILE: projects/Rockchip/devices/RK3288/options ================================================ ################################################################################ # setup device defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in arm) TARGET_FLOAT="hard" TARGET_CPU="cortex-a17" TARGET_FPU="neon-vfpv4" ;; esac # Kernel target KERNEL_TARGET="zImage" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="" KERNEL_MAKE_EXTRACMD+=" rk3288-miqi.dtb" KERNEL_MAKE_EXTRACMD+=" rk3288-tinker.dtb" KERNEL_MAKE_EXTRACMD+=" rk3288-tinker-s.dtb" # Mali GPU family MALI_FAMILY="t760" GRAPHIC_DRIVERS="panfrost" # kernel serial console EXTRA_CMDLINE="console=uart8250,mmio32,0xff690000 console=tty0 coherent_pool=2M cec.debounce_ms=5000" # set the addon project ADDON_PROJECT="ARMv7" ================================================ FILE: projects/Rockchip/devices/RK3328/README.md ================================================ # RK3328 This is a SoC device for RK3328 **Build** * `PROJECT=Rockchip DEVICE=RK3328 ARCH=arm UBOOT_SYSTEM=a1 make image` * `PROJECT=Rockchip DEVICE=RK3328 ARCH=arm UBOOT_SYSTEM=roc-cc make image` * `PROJECT=Rockchip DEVICE=RK3328 ARCH=arm UBOOT_SYSTEM=rock64 make image` **How to use on an Android device** - Flash image to a sd-card - Insert sd-card into the device - Plug in power and LibreELEC should boot instead of Android - Remove sd-card from device to boot into Android ================================================ FILE: projects/Rockchip/devices/RK3328/linux/default/linux.aarch64.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm64 6.1.63 Kernel Configuration # CONFIG_CC_VERSION_TEXT="aarch64-none-elf-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_SYSVIPC_COMPAT=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_IRQ_IPI=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_IRQ_MSI_IOMMU=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_CONTEXT_TRACKING=y CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y # CONFIG_BPF_JIT_ALWAYS_ON is not set CONFIG_BPF_JIT_DEFAULT_ON=y # CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_BPF_PRELOAD is not set # end of BPF subsystem CONFIG_PREEMPT_VOLUNTARY_BUILD=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set # CONFIG_PREEMPT_DYNAMIC is not set # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_SCHED_AVG_IRQ=y CONFIG_SCHED_THERMAL_PRESSURE=y CONFIG_BSD_PROCESS_ACCT=y CONFIG_BSD_PROCESS_ACCT_V3=y CONFIG_TASKSTATS=y CONFIG_TASK_DELAY_ACCT=y CONFIG_TASK_XACCT=y CONFIG_TASK_IO_ACCOUNTING=y # CONFIG_PSI is not set # end of CPU/Task time and stats accounting CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=17 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 # CONFIG_PRINTK_INDEX is not set CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # # CONFIG_UCLAMP_TASK is not set # end of Scheduler features CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_CC_HAS_INT128=y CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set CONFIG_CGROUP_PIDS=y # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y # CONFIG_CGROUP_MISC is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_TIME_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y CONFIG_CHECKPOINT_RESTORE=y CONFIG_SCHED_AUTOGROUP=y # CONFIG_SYSFS_DEPRECATED is not set # CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 # CONFIG_RD_GZIP is not set # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set CONFIG_RD_LZ4=y CONFIG_RD_ZSTD=y CONFIG_INITRAMFS_COMPRESSION_LZ4=y # CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y # CONFIG_EXPERT is not set CONFIG_UID16=y CONFIG_MULTIUSER=y CONFIG_SYSFS_SYSCALL=y CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y 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 CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_EMBEDDED is not set CONFIG_HAVE_PERF_EVENTS=y # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_SYSTEM_DATA_VERIFICATION=y CONFIG_PROFILING=y # end of General setup CONFIG_ARM64=y CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_64BIT=y CONFIG_MMU=y CONFIG_ARM64_PAGE_SHIFT=12 CONFIG_ARM64_CONT_PTE_SHIFT=4 CONFIG_ARM64_CONT_PMD_SHIFT=4 CONFIG_ARCH_MMAP_RND_BITS_MIN=18 CONFIG_ARCH_MMAP_RND_BITS_MAX=33 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_NO_IOPORT_MAP=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_LOCKDEP_SUPPORT=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CSUM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y CONFIG_SMP=y CONFIG_KERNEL_MODE_NEON=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_PGTABLE_LEVELS=4 CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_ARCH_PROC_KCORE_TEXT=y # # Platform selection # # CONFIG_ARCH_ACTIONS is not set # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_APPLE is not set # CONFIG_ARCH_BCM is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_BITMAIN is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_SPARX5 is not set # CONFIG_ARCH_K3 is not set # CONFIG_ARCH_LG1K is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_KEEMBAY is not set # CONFIG_ARCH_MEDIATEK is not set # CONFIG_ARCH_MESON is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_NXP is not set # CONFIG_ARCH_NPCM is not set # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_REALTEK is not set # CONFIG_ARCH_RENESAS is not set CONFIG_ARCH_ROCKCHIP=y # CONFIG_ARCH_SEATTLE is not set # CONFIG_ARCH_INTEL_SOCFPGA is not set # CONFIG_ARCH_SYNQUACER is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_SPRD is not set # CONFIG_ARCH_THUNDER is not set # CONFIG_ARCH_THUNDER2 is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_VISCONTI is not set # CONFIG_ARCH_XGENE is not set # CONFIG_ARCH_ZYNQMP is not set # end of Platform selection # # Kernel Features # # # ARM errata workarounds via the alternatives framework # # CONFIG_AMPERE_ERRATUM_AC03_CPU_38 is not set CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y CONFIG_ARM64_ERRATUM_826319=y CONFIG_ARM64_ERRATUM_827319=y CONFIG_ARM64_ERRATUM_824069=y CONFIG_ARM64_ERRATUM_819472=y # CONFIG_ARM64_ERRATUM_832075 is not set # CONFIG_ARM64_ERRATUM_1742098 is not set CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y # CONFIG_ARM64_ERRATUM_1024718 is not set # CONFIG_ARM64_ERRATUM_1418040 is not set # CONFIG_ARM64_ERRATUM_1165522 is not set # CONFIG_ARM64_ERRATUM_1319367 is not set # CONFIG_ARM64_ERRATUM_1530923 is not set # CONFIG_ARM64_ERRATUM_2441007 is not set # CONFIG_ARM64_ERRATUM_1286807 is not set # CONFIG_ARM64_ERRATUM_1463225 is not set # CONFIG_ARM64_ERRATUM_1542419 is not set # CONFIG_ARM64_ERRATUM_1508412 is not set # CONFIG_ARM64_ERRATUM_2051678 is not set # CONFIG_ARM64_ERRATUM_2077057 is not set # CONFIG_ARM64_ERRATUM_2658417 is not set # CONFIG_ARM64_ERRATUM_2054223 is not set # CONFIG_ARM64_ERRATUM_2067961 is not set # CONFIG_ARM64_ERRATUM_2441009 is not set # CONFIG_ARM64_ERRATUM_2966298 is not set # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set # CONFIG_CAVIUM_ERRATUM_27456 is not set # CONFIG_CAVIUM_ERRATUM_30115 is not set # CONFIG_CAVIUM_TX2_ERRATUM_219 is not set # CONFIG_FUJITSU_ERRATUM_010001 is not set # CONFIG_HISILICON_ERRATUM_161600802 is not set # CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set # CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set # CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set # CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set # CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set # CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set # end of ARM errata workarounds via the alternatives framework CONFIG_ARM64_4K_PAGES=y # CONFIG_ARM64_16K_PAGES is not set # CONFIG_ARM64_64K_PAGES is not set # CONFIG_ARM64_VA_BITS_39 is not set CONFIG_ARM64_VA_BITS_48=y CONFIG_ARM64_VA_BITS=48 CONFIG_ARM64_PA_BITS_48=y CONFIG_ARM64_PA_BITS=48 # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_CPU_LITTLE_ENDIAN=y CONFIG_SCHED_MC=y # CONFIG_SCHED_CLUSTER is not set # CONFIG_SCHED_SMT is not set CONFIG_NR_CPUS=4 CONFIG_HOTPLUG_CPU=y # CONFIG_NUMA is not set # CONFIG_HZ_100 is not set # CONFIG_HZ_250 is not set CONFIG_HZ_300=y # CONFIG_HZ_1000 is not set CONFIG_HZ=300 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_HW_PERF_EVENTS=y CONFIG_CC_HAVE_SHADOW_CALL_STACK=y # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_KEXEC is not set # CONFIG_KEXEC_FILE is not set # CONFIG_CRASH_DUMP is not set # CONFIG_XEN is not set CONFIG_ARCH_FORCE_MAX_ORDER=11 CONFIG_UNMAP_KERNEL_AT_EL0=y CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y CONFIG_RODATA_FULL_DEFAULT_ENABLED=y # CONFIG_ARM64_SW_TTBR0_PAN is not set CONFIG_ARM64_TAGGED_ADDR_ABI=y CONFIG_COMPAT=y CONFIG_KUSER_HELPERS=y # CONFIG_COMPAT_ALIGNMENT_FIXUPS is not set # CONFIG_ARMV8_DEPRECATED is not set # # ARMv8.1 architectural features # # CONFIG_ARM64_HW_AFDBM is not set # CONFIG_ARM64_PAN is not set CONFIG_AS_HAS_LDAPR=y CONFIG_AS_HAS_LSE_ATOMICS=y # CONFIG_ARM64_USE_LSE_ATOMICS is not set # end of ARMv8.1 architectural features # # ARMv8.2 architectural features # CONFIG_AS_HAS_ARMV8_2=y CONFIG_AS_HAS_SHA3=y # CONFIG_ARM64_PMEM is not set # CONFIG_ARM64_RAS_EXTN is not set # CONFIG_ARM64_CNP is not set # end of ARMv8.2 architectural features # # ARMv8.3 architectural features # # CONFIG_ARM64_PTR_AUTH is not set CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y CONFIG_AS_HAS_PAC=y CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y # end of ARMv8.3 architectural features # # ARMv8.4 architectural features # # CONFIG_ARM64_AMU_EXTN is not set CONFIG_AS_HAS_ARMV8_4=y # CONFIG_ARM64_TLB_RANGE is not set # end of ARMv8.4 architectural features # # ARMv8.5 architectural features # CONFIG_AS_HAS_ARMV8_5=y # CONFIG_ARM64_BTI is not set CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y # CONFIG_ARM64_E0PD is not set CONFIG_ARM64_AS_HAS_MTE=y # end of ARMv8.5 architectural features # # ARMv8.7 architectural features # # end of ARMv8.7 architectural features CONFIG_ARM64_SVE=y CONFIG_ARM64_SME=y CONFIG_ARM64_MODULE_PLTS=y # CONFIG_ARM64_PSEUDO_NMI is not set CONFIG_RELOCATABLE=y # CONFIG_RANDOMIZE_BASE is not set CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y CONFIG_STACKPROTECTOR_PER_TASK=y CONFIG_ARCH_NR_GPIO=0 # end of Kernel Features # # Boot options # CONFIG_CMDLINE="" # CONFIG_EFI is not set # end of Boot options # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_USERSPACE_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y # CONFIG_PM_DEBUG is not set CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y CONFIG_PM_GENERIC_DOMAINS_SLEEP=y CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y # end of Power management options # # CPU Power Management # # # CPU Idle # 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 CONFIG_DT_IDLE_GENPD=y # # ARM CPU Idle Drivers # CONFIG_ARM_PSCI_CPUIDLE=y CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y # end of ARM CPU Idle Drivers # end of CPU Idle # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=m CONFIG_CPU_FREQ_GOV_USERSPACE=m CONFIG_CPU_FREQ_GOV_ONDEMAND=y CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y CONFIG_CPUFREQ_DT_PLATDEV=y CONFIG_ARM_SCPI_CPUFREQ=y # end of CPU Frequency scaling # end of CPU Power Management CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set # # General architecture-dependent options # # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_HAVE_IOREMAP_PROT=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_KEEPINITRD=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y CONFIG_MMU_GATHER_TABLE_FREE=y CONFIG_MMU_GATHER_RCU_TABLE_FREE=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y # CONFIG_SHADOW_CALL_STACK is not set CONFIG_ARCH_SUPPORTS_LTO_CLANG=y CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y CONFIG_LTO_NONE=y CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=18 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y CONFIG_RANDOMIZE_KSTACK_OFFSET=y # CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_COMPILER_H=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_HAS_RELR=y CONFIG_HAVE_PREEMPT_DYNAMIC=y CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set CONFIG_MODVERSIONS=y CONFIG_ASM_MODVERSIONS=y # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_GZIP is not set # CONFIG_MODULE_COMPRESS_XZ is not set # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y # CONFIG_BLOCK_LEGACY_AUTOLOAD is not set CONFIG_BLK_CGROUP_RWSTAT=y CONFIG_BLK_DEV_BSG_COMMON=y # CONFIG_BLK_DEV_BSGLIB is not set # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_DEV_THROTTLING_LOW is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_CGROUP_IOLATENCY is not set # CONFIG_BLK_CGROUP_IOCOST is not set # CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set CONFIG_LDM_PARTITION=y # CONFIG_LDM_DEBUG is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set # end of Partition Types CONFIG_BLOCK_COMPAT=y CONFIG_BLK_MQ_VIRTIO=y CONFIG_BLK_PM=y CONFIG_BLOCK_HOLDER_DEPRECATED=y CONFIG_BLK_MQ_STACKING=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y # CONFIG_IOSCHED_BFQ is not set # end of IO Schedulers CONFIG_ASN1=y CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y CONFIG_ARCH_INLINE_SPIN_LOCK=y CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_SPIN_UNLOCK=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y CONFIG_ARCH_INLINE_READ_LOCK=y CONFIG_ARCH_INLINE_READ_LOCK_BH=y CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_READ_UNLOCK=y CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y CONFIG_ARCH_INLINE_WRITE_LOCK=y CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_WRITE_UNLOCK=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y CONFIG_INLINE_SPIN_TRYLOCK=y CONFIG_INLINE_SPIN_TRYLOCK_BH=y CONFIG_INLINE_SPIN_LOCK=y CONFIG_INLINE_SPIN_LOCK_BH=y CONFIG_INLINE_SPIN_LOCK_IRQ=y CONFIG_INLINE_SPIN_LOCK_IRQSAVE=y CONFIG_INLINE_SPIN_UNLOCK_BH=y CONFIG_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE=y CONFIG_INLINE_READ_LOCK=y CONFIG_INLINE_READ_LOCK_BH=y CONFIG_INLINE_READ_LOCK_IRQ=y CONFIG_INLINE_READ_LOCK_IRQSAVE=y CONFIG_INLINE_READ_UNLOCK=y CONFIG_INLINE_READ_UNLOCK_BH=y CONFIG_INLINE_READ_UNLOCK_IRQ=y CONFIG_INLINE_READ_UNLOCK_IRQRESTORE=y CONFIG_INLINE_WRITE_LOCK=y CONFIG_INLINE_WRITE_LOCK_BH=y CONFIG_INLINE_WRITE_LOCK_IRQ=y CONFIG_INLINE_WRITE_LOCK_IRQSAVE=y CONFIG_INLINE_WRITE_UNLOCK=y CONFIG_INLINE_WRITE_UNLOCK_BH=y CONFIG_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y CONFIG_QUEUED_SPINLOCKS=y CONFIG_ARCH_USE_QUEUED_RWLOCKS=y CONFIG_QUEUED_RWLOCKS=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ARCH_BINFMT_ELF_STATE=y CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y CONFIG_ARCH_HAVE_ELF_PROT=y CONFIG_ARCH_USE_GNU_PROPERTY=y CONFIG_ELFCORE=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set CONFIG_BINFMT_SCRIPT=y # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # CONFIG_SWAP=y # CONFIG_ZSWAP is not set # # SLAB allocator options # # CONFIG_SLAB is not set CONFIG_SLUB=y CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y # end of SLAB allocator options # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set # CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y CONFIG_ARCH_KEEP_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_EXCLUSIVE_SYSTEM_RAM=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_MEMORY_BALLOON=y CONFIG_BALLOON_COMPACTION=y CONFIG_COMPACTION=y CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 CONFIG_PAGE_REPORTING=y CONFIG_MIGRATION=y CONFIG_ARCH_ENABLE_THP_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_KSM=y CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y CONFIG_MEMORY_FAILURE=y # CONFIG_HWPOISON_INJECT is not set CONFIG_ARCH_WANTS_THP_SWAP=y CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set CONFIG_THP_SWAP=y # CONFIG_READ_ONLY_THP_FOR_FS is not set CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set # CONFIG_CMA_DEBUGFS is not set # CONFIG_CMA_SYSFS is not set CONFIG_CMA_AREAS=7 CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y CONFIG_ZONE_DMA=y CONFIG_ZONE_DMA32=y CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y CONFIG_SECRETMEM=y # CONFIG_ANON_VMA_NAME is not set # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set CONFIG_LOCK_MM_AND_FIND_VMA=y # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y CONFIG_NET_INGRESS=y CONFIG_NET_EGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_INTERFACE is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_ESP=y # CONFIG_NET_KEY is not set # CONFIG_XDP_SOCKETS is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=m # CONFIG_IP_MROUTE is not set # CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set CONFIG_INET_ESP=y # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=m CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_INET_UDP_DIAG is not set # CONFIG_INET_RAW_DIAG is not set # CONFIG_INET_DIAG_DESTROY is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_IPV6_VTI is not set CONFIG_IPV6_SIT=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set CONFIG_IPV6_FOU=m # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set # CONFIG_NETLABEL is not set # CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NET_PTP_CLASSIFY=y # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_EGRESS=y CONFIG_NETFILTER_FAMILY_BRIDGE=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set # CONFIG_NETFILTER_NETLINK_LOG is not set # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=m CONFIG_NF_LOG_SYSLOG=m # CONFIG_NF_CONNTRACK_MARK is not set # CONFIG_NF_CONNTRACK_ZONES is not set CONFIG_NF_CONNTRACK_PROCFS=y CONFIG_NF_CONNTRACK_EVENTS=y # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set # CONFIG_NF_CONNTRACK_IRC is not set # CONFIG_NF_CONNTRACK_NETBIOS_NS is not set # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set # CONFIG_NF_CONNTRACK_SIP is not set CONFIG_NF_CONNTRACK_TFTP=m # CONFIG_NF_CT_NETLINK is not set CONFIG_NF_NAT=m 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 CONFIG_NETFILTER_XTABLES_COMPAT=y # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set CONFIG_NETFILTER_XT_TARGET_LOG=m # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set CONFIG_NETFILTER_XT_MATCH_IPVS=m # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_NETFILTER_XT_MATCH_OWNER is not set # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set # CONFIG_NETFILTER_XT_MATCH_STATE is not set # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set CONFIG_IP_VS=m # CONFIG_IP_VS_IPV6 is not set # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # CONFIG_IP_VS_PROTO_ESP is not set # CONFIG_IP_VS_PROTO_AH is not set # CONFIG_IP_VS_PROTO_SCTP is not set # # IPVS scheduler # CONFIG_IP_VS_RR=m # CONFIG_IP_VS_WRR is not set # CONFIG_IP_VS_LC is not set # CONFIG_IP_VS_WLC is not set # CONFIG_IP_VS_FO is not set # CONFIG_IP_VS_OVF is not set # CONFIG_IP_VS_LBLC is not set # CONFIG_IP_VS_LBLCR is not set # CONFIG_IP_VS_DH is not set # CONFIG_IP_VS_SH is not set # CONFIG_IP_VS_MH is not set # CONFIG_IP_VS_SED is not set # CONFIG_IP_VS_NQ is not set # CONFIG_IP_VS_TWOS is not set # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS MH scheduler # CONFIG_IP_VS_MH_TAB_INDEX=12 # # IPVS application helper # # CONFIG_IP_VS_FTP is not set CONFIG_IP_VS_NFCT=y # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set CONFIG_NF_LOG_IPV4=m CONFIG_NF_REJECT_IPV4=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_SECURITY is not set # CONFIG_IP_NF_ARPTABLES is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m CONFIG_NF_LOG_IPV6=m CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_MATCH_SRH is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set # CONFIG_IP6_NF_SECURITY is not set CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m # CONFIG_IP6_NF_TARGET_NPT is not set # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_CONNTRACK_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y # CONFIG_BRIDGE_MRP is not set # CONFIG_BRIDGE_CFM is not set # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set # CONFIG_NET_SCH_FQ_CODEL is not set # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set # CONFIG_NET_SCH_DEFAULT is not set # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_FLOW is not set CONFIG_NET_CLS_CGROUP=m # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set CONFIG_NET_L3_MASTER_DEV=y # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_STREAM_PARSER is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # end of Network testing # end of Networking options # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=m CONFIG_BT_BREDR=y # CONFIG_BT_RFCOMM is not set # CONFIG_BT_BNEP is not set CONFIG_BT_HIDP=m # CONFIG_BT_HS is not set # CONFIG_BT_LE is not set CONFIG_BT_LEDS=y # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set # CONFIG_BT_DEBUGFS is not set # CONFIG_BT_SELFTEST is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_QCA=m CONFIG_BT_MTK=m CONFIG_BT_HCIBTUSB=m # CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set CONFIG_BT_HCIBTUSB_BCM=y # CONFIG_BT_HCIBTUSB_MTK is not set 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 is not set # CONFIG_BT_HCIUART_ATH3K is not set # CONFIG_BT_HCIUART_LL is not set CONFIG_BT_HCIUART_3WIRE=y # CONFIG_BT_HCIUART_INTEL is not set CONFIG_BT_HCIUART_BCM=y CONFIG_BT_HCIUART_RTL=y CONFIG_BT_HCIUART_QCA=y CONFIG_BT_HCIUART_AG6XX=y CONFIG_BT_HCIUART_MRVL=y CONFIG_BT_HCIBCM203X=m CONFIG_BT_HCIBPA10X=m CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIVHCI=m CONFIG_BT_MRVL=m CONFIG_BT_MRVL_SDIO=m CONFIG_BT_ATH3K=m # CONFIG_BT_MTKSDIO is not set CONFIG_BT_MTKUART=m CONFIG_BT_HCIRSI=m # CONFIG_BT_VIRTIO is not set # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_SPY=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set CONFIG_CFG80211_CRDA_SUPPORT=y CONFIG_CFG80211_WEXT=y CONFIG_LIB80211=m CONFIG_LIB80211_CRYPT_WEP=m CONFIG_LIB80211_CRYPT_CCMP=m # CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=m CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y CONFIG_RFKILL_GPIO=m # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_PAGE_POOL=y # CONFIG_PAGE_POOL_STATS is not set CONFIG_FAILOVER=y CONFIG_ETHTOOL_NETLINK=y # # Device Drivers # CONFIG_ARM_AMBA=y CONFIG_HAVE_PCI=y # CONFIG_PCI is not set # CONFIG_PCCARD is not set # # Generic Driver Options # # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y # CONFIG_DEVTMPFS_SAFE is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set CONFIG_FW_CACHE=y # CONFIG_FW_UPLOAD is not set # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y CONFIG_ALLOW_DEV_COREDUMP=y CONFIG_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_SOC_BUS=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set CONFIG_GENERIC_ARCH_TOPOLOGY=y # end of Generic Driver Options # # Bus devices # # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_MOXTET is not set # CONFIG_VEXPRESS_CONFIG is not set # CONFIG_MHI_BUS is not set # CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # # CONFIG_ARM_SCMI_PROTOCOL is not set # end of ARM System Control and Management Interface Protocol CONFIG_ARM_SCPI_PROTOCOL=y CONFIG_ARM_SCPI_POWER_DOMAIN=y # CONFIG_ARM_FFA_TRANSPORT is not set # CONFIG_GOOGLE_FIRMWARE is not set CONFIG_ARM_PSCI_FW=y # CONFIG_ARM_PSCI_CHECKER is not set CONFIG_HAVE_ARM_SMCCC=y CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y CONFIG_ARM_SMCCC_SOC_ID=y # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set CONFIG_MTD=y # CONFIG_MTD_TESTS is not set # # Partition parsers # # CONFIG_MTD_AR7_PARTS is not set # CONFIG_MTD_CMDLINE_PARTS is not set CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AFS_PARTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set # end of Partition parsers # # User Modules And Translation Layers # CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y # # Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK. # # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # CONFIG_RFD_FTL is not set # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set # CONFIG_MTD_OOPS is not set # CONFIG_MTD_SWAP is not set # CONFIG_MTD_PARTITIONED_MASTER is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # end of RAM/ROM/Flash chip drivers # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_PLATRAM is not set # end of Mapping drivers for chip access # # Self-contained MTD device drivers # # CONFIG_MTD_DATAFLASH is not set # CONFIG_MTD_MCHP23K256 is not set # CONFIG_MTD_MCHP48L640 is not set # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLOCK2MTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOCG3 is not set # end of Self-contained MTD device drivers # # NAND # # CONFIG_MTD_ONENAND is not set # CONFIG_MTD_RAW_NAND is not set # CONFIG_MTD_SPI_NAND is not set # # ECC engine support # # CONFIG_MTD_NAND_ECC_SW_HAMMING is not set # CONFIG_MTD_NAND_ECC_SW_BCH is not set # CONFIG_MTD_NAND_ECC_MXIC is not set # end of ECC engine support # end of NAND # # LPDDR & LPDDR2 PCM memory drivers # # CONFIG_MTD_LPDDR is not set # end of LPDDR & LPDDR2 PCM memory drivers CONFIG_MTD_SPI_NOR=y CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y # CONFIG_MTD_SPI_NOR_SWP_DISABLE is not set CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y # CONFIG_MTD_SPI_NOR_SWP_KEEP is not set # CONFIG_MTD_UBI is not set # CONFIG_MTD_HYPERBUS is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_DYNAMIC=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_RESERVED_MEM=y CONFIG_OF_RESOLVE=y CONFIG_OF_OVERLAY=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_CDROM=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_DRBD is not set CONFIG_BLK_DEV_NBD=m # CONFIG_BLK_DEV_RAM is not set # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set CONFIG_VIRTIO_BLK=y # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_UBLK is not set # # NVME Support # # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set # CONFIG_NVME_TARGET is not set # end of NVME Support # # Misc devices # # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HI6421V600_IRQ is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set CONFIG_SRAM=y # CONFIG_XILINX_SDFEC is not set # CONFIG_HISI_HIKEY_USB is not set # CONFIG_OPEN_DICE is not set # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set CONFIG_EEPROM_AT25=m # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # CONFIG_ECHO is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_UACCE is not set # CONFIG_PVPANIC is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=m CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_SCAN_ASYNC is not set # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_VIRTIO is not set # CONFIG_SCSI_DH is not set # end of SCSI device support # CONFIG_ATA is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=m # CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m # CONFIG_DM_UNSTRIPED is not set # CONFIG_DM_CRYPT is not set # CONFIG_DM_SNAPSHOT is not set CONFIG_DM_THIN_PROVISIONING=m # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_EBS is not set # CONFIG_DM_ERA is not set # CONFIG_DM_CLONE is not set # CONFIG_DM_MIRROR is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_DUST is not set # CONFIG_DM_UEVENT is not set # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_DM_INTEGRITY is not set # CONFIG_TARGET_CORE is not set CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set CONFIG_DUMMY=m CONFIG_WIREGUARD=m # CONFIG_WIREGUARD_DEBUG is not set # CONFIG_EQUALIZER is not set # 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 # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_AMT is not set # CONFIG_MACSEC is not set # CONFIG_NETCONSOLE is not set CONFIG_TUN=m CONFIG_TAP=m # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m CONFIG_VIRTIO_NET=y CONFIG_NLMON=m CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_ALACRITECH is not set # CONFIG_ALTERA_TSE is not set # CONFIG_NET_VENDOR_AMAZON is not set # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set # CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_BROADCOM is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CORTINA is not set # CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_ENGLEDER is not set # CONFIG_NET_VENDOR_EZCHIP is not set # CONFIG_NET_VENDOR_FUNGIBLE is not set CONFIG_NET_VENDOR_GOOGLE=y # CONFIG_NET_VENDOR_HISILICON is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_INTEL is not set # CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_NET_VENDOR_ADI is not set # CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set # CONFIG_NET_VENDOR_MICROSOFT is not set # CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NETRONOME is not set # CONFIG_ETHOC is not set # CONFIG_NET_VENDOR_PENSANDO is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RENESAS is not set # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set # CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=y # CONFIG_STMMAC_SELFTESTS is not set CONFIG_STMMAC_PLATFORM=y CONFIG_DWMAC_DWC_QOS_ETH=y CONFIG_DWMAC_GENERIC=y CONFIG_DWMAC_ROCKCHIP=y # CONFIG_DWMAC_INTEL_PLAT is not set # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set CONFIG_PHYLINK=y CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_SFP is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_ADIN_PHY is not set # CONFIG_ADIN1100_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=m # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM54140_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set # CONFIG_MAXLINEAR_GPHY is not set # CONFIG_MEDIATEK_GE_PHY is not set # CONFIG_MICREL_PHY is not set CONFIG_MICROCHIP_PHY=m # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set # CONFIG_MOTORCOMM_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_QSEMI_PHY is not set CONFIG_REALTEK_PHY=y # CONFIG_RENESAS_PHY is not set CONFIG_ROCKCHIP_PHY=y CONFIG_SMSC_PHY=m # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_DP83TD510_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set # CONFIG_PSE_CONTROLLER is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_OF_MDIO=y CONFIG_MDIO_DEVRES=y CONFIG_MDIO_BITBANG=y # CONFIG_MDIO_BCM_UNIMAC is not set CONFIG_MDIO_GPIO=y # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_OCTEON is not set # CONFIG_MDIO_IPQ4019 is not set # CONFIG_MDIO_IPQ8064 is not set # # MDIO Multiplexers # CONFIG_MDIO_BUS_MUX=y CONFIG_MDIO_BUS_MUX_GPIO=y CONFIG_MDIO_BUS_MUX_MULTIPLEXER=y CONFIG_MDIO_BUS_MUX_MMIOREG=y # # PCS device drivers # CONFIG_PCS_XPCS=y # end of PCS device drivers # CONFIG_PPP is not set # CONFIG_SLIP is not set CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set CONFIG_USB_PEGASUS=m CONFIG_USB_RTL8150=m CONFIG_USB_RTL8152=m CONFIG_USB_LAN78XX=m CONFIG_USB_USBNET=m CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m # CONFIG_USB_NET_CDC_EEM is not set CONFIG_USB_NET_CDC_NCM=m # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set CONFIG_USB_NET_DM9601=m # CONFIG_USB_NET_SR9700 is not set CONFIG_USB_NET_SR9800=m CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=m # CONFIG_USB_NET_GL620A is not set CONFIG_USB_NET_NET1080=m CONFIG_USB_NET_PLUSB=m CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m CONFIG_USB_NET_CDC_SUBSET_ENABLE=m CONFIG_USB_NET_CDC_SUBSET=m # CONFIG_USB_ALI_M5632 is not set # CONFIG_USB_AN2720 is not set CONFIG_USB_BELKIN=y CONFIG_USB_ARMLINUX=y # CONFIG_USB_EPSON2888 is not set # CONFIG_USB_KC2190 is not set CONFIG_USB_NET_ZAURUS=m # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set # CONFIG_USB_HSO is not set # CONFIG_USB_NET_INT51X1 is not set # CONFIG_USB_IPHETH is not set # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m # CONFIG_ATH9K_AHB is not set # CONFIG_ATH9K_DEBUGFS is not set # CONFIG_ATH9K_DYNACK is not set # CONFIG_ATH9K_WOW is not set CONFIG_ATH9K_RFKILL=y CONFIG_ATH9K_CHANNEL_CONTEXT=y CONFIG_ATH9K_PCOEM=y CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_ATH9K_HWRNG=y CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y CONFIG_CARL9170_HWRNG=y CONFIG_ATH6KL=m # CONFIG_ATH6KL_SDIO is not set CONFIG_ATH6KL_USB=m # CONFIG_ATH6KL_DEBUG is not set CONFIG_AR5523=m CONFIG_ATH10K=m CONFIG_ATH10K_CE=y # CONFIG_ATH10K_SDIO is not set CONFIG_ATH10K_USB=m # CONFIG_ATH10K_DEBUG is not set # CONFIG_ATH10K_DEBUGFS is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set CONFIG_WLAN_VENDOR_ATMEL=y CONFIG_AT76C50X_USB=m CONFIG_WLAN_VENDOR_BROADCOM=y CONFIG_B43=m CONFIG_B43_BCMA=y CONFIG_B43_SSB=y CONFIG_B43_BUSES_BCMA_AND_SSB=y # CONFIG_B43_BUSES_BCMA is not set # CONFIG_B43_BUSES_SSB is not set # CONFIG_B43_SDIO is not set CONFIG_B43_BCMA_PIO=y CONFIG_B43_PIO=y CONFIG_B43_PHY_G=y CONFIG_B43_PHY_N=y CONFIG_B43_PHY_LP=y CONFIG_B43_PHY_HT=y CONFIG_B43_LEDS=y CONFIG_B43_HWRNG=y # CONFIG_B43_DEBUG is not set # CONFIG_B43LEGACY is not set CONFIG_BRCMUTIL=m # CONFIG_BRCMSMAC is not set CONFIG_BRCMFMAC=m CONFIG_BRCMFMAC_PROTO_BCDC=y CONFIG_BRCMFMAC_SDIO=y CONFIG_BRCMFMAC_USB=y # CONFIG_BRCM_TRACING is not set # CONFIG_BRCMDBG is not set CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_HOSTAP is not set CONFIG_P54_COMMON=m CONFIG_P54_USB=m # CONFIG_P54_SPI is not set CONFIG_P54_LEDS=y CONFIG_WLAN_VENDOR_MARVELL=y CONFIG_LIBERTAS=m CONFIG_LIBERTAS_USB=m # CONFIG_LIBERTAS_SDIO is not set # CONFIG_LIBERTAS_SPI is not set # CONFIG_LIBERTAS_DEBUG is not set # CONFIG_LIBERTAS_MESH is not set CONFIG_LIBERTAS_THINFIRM=m # CONFIG_LIBERTAS_THINFIRM_DEBUG is not set CONFIG_LIBERTAS_THINFIRM_USB=m CONFIG_MWIFIEX=m # CONFIG_MWIFIEX_SDIO is not set CONFIG_MWIFIEX_USB=m CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m CONFIG_MT76_CORE=m CONFIG_MT76_LEDS=y CONFIG_MT76_USB=m CONFIG_MT76_SDIO=m CONFIG_MT76x02_LIB=m CONFIG_MT76x02_USB=m CONFIG_MT76_CONNAC_LIB=m CONFIG_MT76x0_COMMON=m CONFIG_MT76x0U=m CONFIG_MT76x2_COMMON=m CONFIG_MT76x2U=m CONFIG_MT7615_COMMON=m CONFIG_MT7663_USB_SDIO_COMMON=m CONFIG_MT7663U=m CONFIG_MT7663S=m # CONFIG_MT7921S is not set # CONFIG_MT7921U is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set # CONFIG_WLAN_VENDOR_PURELIFI is not set CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WLAN_VENDOR_REALTEK=y CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y CONFIG_RTL_CARDS=m # CONFIG_RTL8192CU is not set CONFIG_RTL8XXXU=m CONFIG_RTL8XXXU_UNTESTED=y CONFIG_RTW88=m CONFIG_RTW88_CORE=m CONFIG_RTW88_USB=m CONFIG_RTW88_8822B=m CONFIG_RTW88_8822C=m CONFIG_RTW88_8723D=m CONFIG_RTW88_8821C=m # CONFIG_RTW88_8822BS is not set CONFIG_RTW88_8822BU=m # CONFIG_RTW88_8822CS is not set CONFIG_RTW88_8822CU=m CONFIG_RTW88_8723DU=m # CONFIG_RTW88_8821CS is not set CONFIG_RTW88_8821CU=m # CONFIG_RTW88_DEBUG is not set # CONFIG_RTW88_DEBUGFS is not set # CONFIG_RTW89 is not set CONFIG_WLAN_VENDOR_RSI=y CONFIG_RSI_91X=m # CONFIG_RSI_DEBUGFS is not set # CONFIG_RSI_SDIO is not set CONFIG_RSI_USB=m CONFIG_RSI_COEX=y # CONFIG_WLAN_VENDOR_SILABS is not set CONFIG_WLAN_VENDOR_ST=y # CONFIG_CW1200 is not set CONFIG_WLAN_VENDOR_TI=y # CONFIG_WL1251 is not set CONFIG_WL12XX=m CONFIG_WL18XX=m CONFIG_WLCORE=m # CONFIG_WLCORE_SPI is not set # CONFIG_WLCORE_SDIO is not set CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_USB_ZD1201=m CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set CONFIG_WLAN_VENDOR_QUANTENNA=y # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN # CONFIG_NETDEVSIM is not set CONFIG_NET_FAILOVER=y # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_SPARSEKMAP is not set CONFIG_INPUT_MATRIXKMAP=y # # Userland interfaces # # CONFIG_INPUT_MOUSEDEV is not set CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADC is not set # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set # CONFIG_KEYBOARD_ATKBD is not set # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=y # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_PINEPHONE is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set # CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADC is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set CONFIG_JOYSTICK_GF2K=m # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set CONFIG_JOYSTICK_IFORCE=m CONFIG_JOYSTICK_IFORCE_USB=m # CONFIG_JOYSTICK_IFORCE_232 is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y # CONFIG_JOYSTICK_PSXPAD_SPI is not set # CONFIG_JOYSTICK_PXRC is not set # CONFIG_JOYSTICK_QWIIC is not set # CONFIG_JOYSTICK_FSIA6B is not set # CONFIG_JOYSTICK_SENSEHAT is not set # CONFIG_INPUT_TABLET is not set # CONFIG_INPUT_TOUCHSCREEN is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set CONFIG_INPUT_RK805_PWRKEY=y # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_RMI4_CORE is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_SERIO_SERPORT=m CONFIG_SERIO_AMBAKMI=y CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_SERIO_GPIO_PS2 is not set # CONFIG_USERIO is not set CONFIG_GAMEPORT=m # CONFIG_GAMEPORT_NS558 is not set # CONFIG_GAMEPORT_L4 is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y # CONFIG_SERIAL_8250_16550A_VARIANTS is not set # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_DMA=y CONFIG_SERIAL_8250_NR_UARTS=5 CONFIG_SERIAL_8250_RUNTIME_UARTS=5 CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_MANY_PORTS=y CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_RSA is not set CONFIG_SERIAL_8250_DWLIB=y CONFIG_SERIAL_8250_FSL=y CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set CONFIG_SERIAL_OF_PLATFORM=y # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set # CONFIG_SERIAL_AMBA_PL011 is not set # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_SIFIVE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set CONFIG_SERIAL_XILINX_PS_UART=y CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_NULL_TTY is not set CONFIG_HVC_DRIVER=y # CONFIG_HVC_DCC is not set CONFIG_SERIAL_DEV_BUS=y CONFIG_SERIAL_DEV_CTRL_TTYPORT=y CONFIG_VIRTIO_CONSOLE=y # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=m # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_BA431 is not set # CONFIG_HW_RANDOM_VIRTIO is not set CONFIG_HW_RANDOM_OPTEE=m # CONFIG_HW_RANDOM_CCTRNG is not set # CONFIG_HW_RANDOM_XIPHERA is not set CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=m CONFIG_DEVMEM=y # CONFIG_TCG_TPM is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_GPMUX is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set CONFIG_I2C_MUX_PCA954x=y CONFIG_I2C_MUX_PINCTRL=y # CONFIG_I2C_MUX_REG is not set CONFIG_I2C_DEMUX_PINCTRL=y # CONFIG_I2C_MUX_MLXCPLD is not set # end of Multiplexer I2C Chip support CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CADENCE is not set # CONFIG_I2C_CBUS_GPIO is not set CONFIG_I2C_DESIGNWARE_CORE=y # CONFIG_I2C_DESIGNWARE_SLAVE is not set CONFIG_I2C_DESIGNWARE_PLATFORM=y # CONFIG_I2C_EMEV2 is not set CONFIG_I2C_GPIO=m # CONFIG_I2C_GPIO_FAULT_INJECTOR is not set # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set CONFIG_I2C_RK3X=y # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y CONFIG_SPI_MEM=y # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set CONFIG_SPI_BITBANG=m # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_CADENCE_QUADSPI is not set # CONFIG_SPI_CADENCE_XSPI is not set # CONFIG_SPI_DESIGNWARE is not set # CONFIG_SPI_NXP_FLEXSPI is not set CONFIG_SPI_GPIO=m # CONFIG_SPI_FSL_SPI is not set # CONFIG_SPI_MICROCHIP_CORE is not set # CONFIG_SPI_MICROCHIP_CORE_QSPI is not set # CONFIG_SPI_OC_TINY is not set CONFIG_SPI_PL022=y CONFIG_SPI_ROCKCHIP=m # CONFIG_SPI_ROCKCHIP_SFC is not set # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_SIFIVE is not set # CONFIG_SPI_MXIC is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_AMD is not set # # SPI Multiplexer support # # CONFIG_SPI_MUX is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=m # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set CONFIG_SPI_DYNAMIC=y CONFIG_SPMI=y # CONFIG_SPMI_HISI3670 is not set # CONFIG_HSI is not set CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # # CONFIG_PTP_1588_CLOCK_KVM is not set # CONFIG_PTP_1588_CLOCK_IDT82P33 is not set # CONFIG_PTP_1588_CLOCK_IDTCM is not set # end of PTP clock support CONFIG_PINCTRL=y CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_CY8C95X0 is not set CONFIG_PINCTRL_MAX77620=y # CONFIG_PINCTRL_MCP23S08 is not set # CONFIG_PINCTRL_MICROCHIP_SGPIO is not set # CONFIG_PINCTRL_OCELOT is not set CONFIG_PINCTRL_RK805=y CONFIG_PINCTRL_ROCKCHIP=y # CONFIG_PINCTRL_SINGLE is not set # CONFIG_PINCTRL_STMFX is not set # CONFIG_PINCTRL_SX150X is not set # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_CDEV=y CONFIG_GPIO_CDEV_V1=y CONFIG_GPIO_GENERIC=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_CADENCE is not set CONFIG_GPIO_DWAPB=y # CONFIG_GPIO_FTGPIO010 is not set # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HLWD is not set # CONFIG_GPIO_LOGICVC is not set # CONFIG_GPIO_MB86S7X is not set CONFIG_GPIO_PL061=y CONFIG_GPIO_ROCKCHIP=y # CONFIG_GPIO_SIFIVE is not set CONFIG_GPIO_SYSCON=y # CONFIG_GPIO_XGENE is not set # CONFIG_GPIO_XILINX is not set # CONFIG_GPIO_AMD_FCH is not set # end of Memory mapped GPIO drivers # # I2C GPIO expanders # # 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 CONFIG_GPIO_PCA953X_IRQ=y # CONFIG_GPIO_PCA9570 is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # CONFIG_GPIO_MAX77620=y # end of MFD GPIO expanders # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # end of SPI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_VIRTIO is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers # CONFIG_W1 is not set CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_BRCMSTB is not set # CONFIG_POWER_RESET_GPIO is not set # CONFIG_POWER_RESET_GPIO_RESTART is not set # CONFIG_POWER_RESET_LTC2952 is not set CONFIG_POWER_RESET_REGULATOR=y # CONFIG_POWER_RESET_RESTART is not set # CONFIG_POWER_RESET_XGENE is not set CONFIG_POWER_RESET_SYSCON=y # CONFIG_POWER_RESET_SYSCON_POWEROFF is not set CONFIG_REBOOT_MODE=y CONFIG_SYSCON_REBOOT_MODE=y # CONFIG_NVMEM_REBOOT_MODE is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set # CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_RK817 is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_UCS1002 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set CONFIG_SENSORS_ARM_SCPI=y # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_GPIO_FAN is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IIO_HWMON is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX31730 is not set # CONFIG_SENSORS_MAX31760 is not set # CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set CONFIG_SENSORS_LM90=m # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_NZXT_KRAKEN2 is not set # CONFIG_SENSORS_NZXT_SMART2 is not set # CONFIG_SENSORS_OCC_P8_I2C is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set CONFIG_SENSORS_PWM_FAN=m # CONFIG_SENSORS_SBTSI is not set # CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set CONFIG_SENSORS_INA2XX=m # CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y # CONFIG_THERMAL_WRITABLE_TRIPS is not set CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set CONFIG_CPU_THERMAL=y CONFIG_CPU_FREQ_THERMAL=y CONFIG_DEVFREQ_THERMAL=y CONFIG_THERMAL_EMULATION=y # CONFIG_THERMAL_MMIO is not set # CONFIG_MAX77620_THERMAL is not set CONFIG_ROCKCHIP_THERMAL=y # CONFIG_GENERIC_ADC_THERMAL is not set CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 # CONFIG_WATCHDOG_SYSFS is not set # CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_ARM_SBSA_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set CONFIG_DW_WATCHDOG=y # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_MAX77620_WATCHDOG is not set # CONFIG_ARM_SMC_WATCHDOG is not set # CONFIG_MEN_A21_WDT is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y CONFIG_SSB=m CONFIG_SSB_BLOCKIO=y CONFIG_SSB_SDIOHOST_POSSIBLE=y # CONFIG_SSB_SDIOHOST is not set # CONFIG_SSB_DRIVER_GPIO is not set CONFIG_BCMA_POSSIBLE=y CONFIG_BCMA=m CONFIG_BCMA_BLOCKIO=y # CONFIG_BCMA_HOST_SOC is not set # CONFIG_BCMA_DRIVER_GMAC_CMN is not set # CONFIG_BCMA_DRIVER_GPIO is not set # CONFIG_BCMA_DEBUG is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_GATEWORKS_GSC is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_MFD_HI6421_SPMI is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set CONFIG_MFD_MAX77620=y # CONFIG_MFD_MAX77650 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77714 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_OCELOT is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_CPCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_NTXEC is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set CONFIG_MFD_RK808=y # CONFIG_MFD_RN5T618 is not set CONFIG_MFD_SEC_CORE=y # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set CONFIG_MFD_WL1273_CORE=m # 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 # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ROHM_BD718XX is not set # CONFIG_MFD_ROHM_BD71828 is not set # CONFIG_MFD_ROHM_BD957XMUF is not set # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_MFD_KHADAS_MCU is not set # CONFIG_MFD_QCOM_PM8008 is not set # CONFIG_RAVE_SP_CORE is not set # CONFIG_MFD_INTEL_M10_BMC is not set # CONFIG_MFD_RSMU_I2C is not set # CONFIG_MFD_RSMU_SPI is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_DA9121 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set CONFIG_REGULATOR_FAN53555=y # CONFIG_REGULATOR_FAN53880 is not set CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX77620 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MAX20086 is not set # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MCP16502 is not set # CONFIG_REGULATOR_MP5416 is not set # CONFIG_REGULATOR_MP8859 is not set # CONFIG_REGULATOR_MP886X is not set # CONFIG_REGULATOR_MPQ7920 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_MT6315 is not set # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PF8X00 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set CONFIG_REGULATOR_PWM=y # CONFIG_REGULATOR_QCOM_SPMI is not set # CONFIG_REGULATOR_QCOM_USB_VBUS is not set # CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set CONFIG_REGULATOR_RK808=y # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set # CONFIG_REGULATOR_S2MPA01 is not set # CONFIG_REGULATOR_S2MPS11 is not set # CONFIG_REGULATOR_S5M8767 is not set # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_SY8106A is not set # CONFIG_REGULATOR_SY8824X is not set # CONFIG_REGULATOR_SY8827N is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS6286X is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_VCTRL is not set # CONFIG_REGULATOR_QCOM_LABIBB is not set CONFIG_RC_CORE=y CONFIG_BPF_LIRC_MODE2=y CONFIG_LIRC=y CONFIG_RC_MAP=m CONFIG_RC_DECODERS=y CONFIG_IR_IMON_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_MCE_KBD_DECODER=m CONFIG_IR_NEC_DECODER=m CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m CONFIG_IR_RCMM_DECODER=m CONFIG_IR_SANYO_DECODER=m CONFIG_IR_SHARP_DECODER=m CONFIG_IR_SONY_DECODER=m CONFIG_IR_XMP_DECODER=m CONFIG_RC_DEVICES=y CONFIG_IR_GPIO_CIR=m CONFIG_IR_GPIO_TX=m CONFIG_IR_HIX5HD2=m CONFIG_IR_IGORPLUGUSB=m CONFIG_IR_IGUANA=m CONFIG_IR_IMON=m CONFIG_IR_IMON_RAW=m CONFIG_IR_MCEUSB=m CONFIG_IR_PWM_TX=m CONFIG_IR_REDRAT3=m CONFIG_IR_SERIAL=m # CONFIG_IR_SERIAL_TRANSMITTER is not set CONFIG_IR_SPI=m CONFIG_IR_STREAMZAP=m CONFIG_IR_TOY=m CONFIG_IR_TTUSBIR=m CONFIG_RC_ATI_REMOTE=m # CONFIG_RC_LOOPBACK is not set CONFIG_RC_XBOX_DVD=m CONFIG_CEC_CORE=y CONFIG_CEC_NOTIFIER=y # # CEC support # # CONFIG_MEDIA_CEC_RC is not set CONFIG_MEDIA_CEC_SUPPORT=y # CONFIG_CEC_CH7322 is not set CONFIG_USB_PULSE8_CEC=m CONFIG_USB_RAINSHADOW_CEC=m # end of CEC support CONFIG_MEDIA_SUPPORT=y CONFIG_MEDIA_SUPPORT_FILTER=y CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y CONFIG_MEDIA_RADIO_SUPPORT=y # CONFIG_MEDIA_SDR_SUPPORT is not set CONFIG_MEDIA_PLATFORM_SUPPORT=y # CONFIG_MEDIA_TEST_SUPPORT is not set # end of Media device types CONFIG_VIDEO_DEV=y CONFIG_MEDIA_CONTROLLER=y CONFIG_DVB_CORE=y # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y CONFIG_VIDEO_V4L2_SUBDEV_API=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_VIDEO_TUNER=m CONFIG_V4L2_H264=m CONFIG_V4L2_VP9=m CONFIG_V4L2_MEM2MEM_DEV=m CONFIG_V4L2_FLASH_LED_CLASS=m CONFIG_V4L2_FWNODE=y CONFIG_V4L2_ASYNC=y CONFIG_VIDEOBUF_GEN=m CONFIG_VIDEOBUF_VMALLOC=m # end of Video4Linux options # # Media controller options # CONFIG_MEDIA_CONTROLLER_DVB=y CONFIG_MEDIA_CONTROLLER_REQUEST_API=y # end of Media controller options # # Digital TV options # # CONFIG_DVB_MMAP is not set CONFIG_DVB_NET=y CONFIG_DVB_MAX_ADAPTERS=16 # CONFIG_DVB_DYNAMIC_MINORS is not set # CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set # CONFIG_DVB_ULE_DEBUG is not set # end of Digital TV options # # Media drivers # # # Drivers filtered as selected at 'Filter media drivers' # # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_USB_S2255 is not set # CONFIG_VIDEO_USBTV is not set # CONFIG_USB_VIDEO_CLASS is not set # # Analog TV USB devices # CONFIG_VIDEO_GO7007=m CONFIG_VIDEO_GO7007_USB=m CONFIG_VIDEO_GO7007_LOADER=m CONFIG_VIDEO_GO7007_USB_S2250_BOARD=m CONFIG_VIDEO_HDPVR=m CONFIG_VIDEO_PVRUSB2=m CONFIG_VIDEO_PVRUSB2_SYSFS=y CONFIG_VIDEO_PVRUSB2_DVB=y # CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set CONFIG_VIDEO_STK1160_COMMON=m CONFIG_VIDEO_STK1160=m # # Analog/digital TV USB devices # CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_AU0828_V4L2=y CONFIG_VIDEO_AU0828_RC=y CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y CONFIG_VIDEO_CX231XX_ALSA=m CONFIG_VIDEO_CX231XX_DVB=m # # Digital TV USB devices # CONFIG_DVB_AS102=m CONFIG_DVB_B2C2_FLEXCOP_USB=m # CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set CONFIG_DVB_USB_V2=m CONFIG_DVB_USB_AF9015=m CONFIG_DVB_USB_AF9035=m CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_AZ6007=m CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_DVBSKY=m CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_GL861=m CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m CONFIG_DVB_USB_ZD1301=m CONFIG_DVB_USB=m # CONFIG_DVB_USB_DEBUG is not set CONFIG_DVB_USB_A800=m CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_CXUSB=m CONFIG_DVB_USB_CXUSB_ANALOG=y CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_DIB3000MC=m CONFIG_DVB_USB_DIBUSB_MB=m CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y CONFIG_DVB_USB_DIBUSB_MC=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_DTT200U=m CONFIG_DVB_USB_DTV5100=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_GP8PSK=m CONFIG_DVB_USB_M920X=m CONFIG_DVB_USB_NOVA_T_USB2=m CONFIG_DVB_USB_OPERA1=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_TTUSB2=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_VP7045=m CONFIG_SMS_USB_DRV=m # # Webcam, TV (analog/digital) USB devices # CONFIG_VIDEO_EM28XX=m CONFIG_VIDEO_EM28XX_V4L2=m CONFIG_VIDEO_EM28XX_ALSA=m CONFIG_VIDEO_EM28XX_DVB=m CONFIG_VIDEO_EM28XX_RC=m CONFIG_RADIO_ADAPTERS=y CONFIG_RADIO_SAA7706H=m CONFIG_RADIO_SHARK=m CONFIG_RADIO_SHARK2=m CONFIG_RADIO_SI4713=m CONFIG_RADIO_TEA575X=m CONFIG_RADIO_TEA5764=m CONFIG_RADIO_TEF6862=m CONFIG_RADIO_WL1273=m CONFIG_USB_DSBR=m CONFIG_USB_KEENE=m CONFIG_USB_MA901=m CONFIG_USB_MR800=m CONFIG_USB_RAREMONO=m CONFIG_RADIO_SI470X=m CONFIG_USB_SI470X=m CONFIG_I2C_SI470X=m CONFIG_USB_SI4713=m CONFIG_PLATFORM_SI4713=m CONFIG_I2C_SI4713=m CONFIG_MEDIA_PLATFORM_DRIVERS=y # CONFIG_V4L_PLATFORM_DRIVERS is not set # CONFIG_DVB_PLATFORM_DRIVERS is not set CONFIG_V4L_MEM2MEM_DRIVERS=y # CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set # # Allegro DVT media platform drivers # # # Amlogic media platform drivers # # # Amphion drivers # # # Aspeed media platform drivers # # # Atmel media platform drivers # # # Cadence media platform drivers # # CONFIG_VIDEO_CADENCE_CSI2RX is not set # CONFIG_VIDEO_CADENCE_CSI2TX is not set # # Chips&Media media platform drivers # # # Intel media platform drivers # # # Marvell media platform drivers # # # Mediatek media platform drivers # # # NVidia media platform drivers # # # NXP media platform drivers # # # Qualcomm media platform drivers # # # Renesas media platform drivers # # # Rockchip media platform drivers # CONFIG_VIDEO_ROCKCHIP_IEP=m CONFIG_VIDEO_ROCKCHIP_RGA=m # # Samsung media platform drivers # # # STMicroelectronics media platform drivers # # # Sunxi media platform drivers # # # Texas Instruments drivers # # # Verisilicon media platform drivers # CONFIG_VIDEO_HANTRO=m CONFIG_VIDEO_HANTRO_ROCKCHIP=y # # VIA media platform drivers # # # Xilinx media platform drivers # # # MMC/SDIO DVB adapters # # CONFIG_SMS_SDIO_DRV is not set CONFIG_MEDIA_COMMON_OPTIONS=y # # common driver options # CONFIG_CYPRESS_FIRMWARE=m CONFIG_TTPCI_EEPROM=m CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_SMS_SIANO_MDTV=m CONFIG_SMS_SIANO_RC=y CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_DMA_CONTIG=m CONFIG_VIDEOBUF2_VMALLOC=m CONFIG_VIDEOBUF2_DMA_SG=m # end of Media drivers CONFIG_MEDIA_HIDE_ANCILLARY_SUBDRV=y # # Media ancillary drivers # CONFIG_MEDIA_ATTACH=y # # IR I2C driver auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_IR_I2C=y CONFIG_VIDEO_CAMERA_SENSOR=y # CONFIG_VIDEO_AR0521 is not set # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_HI846 is not set # CONFIG_VIDEO_HI847 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_IMX412 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set CONFIG_VIDEO_MT9V011=m # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set CONFIG_VIDEO_OV2640=m # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5693 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV7251 is not set CONFIG_VIDEO_OV7640=m # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9282 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_M5MOLS is not set # # Lens drivers # # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # audio, video and radio I2C drivers auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_CS53L32A=m CONFIG_VIDEO_MSP3400=m CONFIG_VIDEO_SONY_BTF_MPX=m CONFIG_VIDEO_UDA1342=m CONFIG_VIDEO_WM8775=m CONFIG_VIDEO_SAA711X=m CONFIG_VIDEO_TVP5150=m CONFIG_VIDEO_TW2804=m CONFIG_VIDEO_TW9903=m CONFIG_VIDEO_TW9906=m # # Video and audio decoders # CONFIG_VIDEO_CX25840=m # # SPI I2C drivers auto-selected by 'Autoselect ancillary drivers' # # # Media SPI Adapters # # CONFIG_CXD2880_SPI_DRV is not set # CONFIG_VIDEO_GS1662 is not set # end of Media SPI Adapters CONFIG_MEDIA_TUNER=y # # Tuner drivers auto-selected by 'Autoselect ancillary drivers' # CONFIG_MEDIA_TUNER_E4000=m CONFIG_MEDIA_TUNER_FC0011=m CONFIG_MEDIA_TUNER_FC0012=m CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_FC2580=m CONFIG_MEDIA_TUNER_IT913X=m CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_MC44S803=y CONFIG_MEDIA_TUNER_MT2060=m CONFIG_MEDIA_TUNER_MT2063=m CONFIG_MEDIA_TUNER_MT20XX=y CONFIG_MEDIA_TUNER_MT2266=m CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m CONFIG_MEDIA_TUNER_QM1D1C0042=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_R820T=m CONFIG_MEDIA_TUNER_SI2157=m CONFIG_MEDIA_TUNER_SIMPLE=y CONFIG_MEDIA_TUNER_TDA18212=m CONFIG_MEDIA_TUNER_TDA18218=m CONFIG_MEDIA_TUNER_TDA18250=m CONFIG_MEDIA_TUNER_TDA18271=y CONFIG_MEDIA_TUNER_TDA827X=y CONFIG_MEDIA_TUNER_TDA8290=y CONFIG_MEDIA_TUNER_TDA9887=y CONFIG_MEDIA_TUNER_TEA5761=y CONFIG_MEDIA_TUNER_TEA5767=y CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_MEDIA_TUNER_XC2028=y CONFIG_MEDIA_TUNER_XC4000=y CONFIG_MEDIA_TUNER_XC5000=y # # DVB Frontend drivers auto-selected by 'Autoselect ancillary drivers' # # # Multistandard (satellite) frontends # CONFIG_DVB_M88DS3103=m CONFIG_DVB_STB0899=m CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m CONFIG_DVB_STV6110x=m # # Multistandard (cable + terrestrial) frontends # CONFIG_DVB_DRXK=m CONFIG_DVB_MN88472=m CONFIG_DVB_MN88473=m CONFIG_DVB_SI2165=m CONFIG_DVB_TDA18271C2DD=m # # DVB-S (satellite) frontends # CONFIG_DVB_CX24116=m CONFIG_DVB_CX24120=m CONFIG_DVB_CX24123=m CONFIG_DVB_DS3000=m CONFIG_DVB_MT312=m CONFIG_DVB_S5H1420=m CONFIG_DVB_SI21XX=m CONFIG_DVB_STB6000=m CONFIG_DVB_STV0288=m CONFIG_DVB_STV0299=m CONFIG_DVB_STV0900=m CONFIG_DVB_STV6110=m CONFIG_DVB_TDA10071=m CONFIG_DVB_TDA10086=m CONFIG_DVB_TDA826X=m CONFIG_DVB_TS2020=m CONFIG_DVB_TUNER_CX24113=m CONFIG_DVB_TUNER_ITD1000=m CONFIG_DVB_ZL10039=m # # DVB-T (terrestrial) frontends # CONFIG_DVB_AF9013=m CONFIG_DVB_AS102_FE=m CONFIG_DVB_CX22702=m CONFIG_DVB_CXD2820R=m CONFIG_DVB_CXD2841ER=m CONFIG_DVB_DIB3000MB=m CONFIG_DVB_DIB3000MC=m CONFIG_DVB_DIB7000M=m CONFIG_DVB_DIB7000P=m CONFIG_DVB_DRXD=m CONFIG_DVB_EC100=m CONFIG_DVB_GP8PSK_FE=m CONFIG_DVB_MT352=m CONFIG_DVB_NXT6000=m CONFIG_DVB_RTL2830=m CONFIG_DVB_RTL2832=m CONFIG_DVB_SI2168=m CONFIG_DVB_TDA10048=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_ZD1301_DEMOD=m CONFIG_DVB_ZL10353=m # # DVB-C (cable) frontends # CONFIG_DVB_STV0297=m CONFIG_DVB_TDA10023=m # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # CONFIG_DVB_AU8522=m CONFIG_DVB_AU8522_DTV=m CONFIG_DVB_AU8522_V4L=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LG2160=m CONFIG_DVB_LGDT3305=m CONFIG_DVB_LGDT3306A=m CONFIG_DVB_LGDT330X=m CONFIG_DVB_MXL692=m CONFIG_DVB_NXT200X=m CONFIG_DVB_S5H1409=m CONFIG_DVB_S5H1411=m # # ISDB-T (terrestrial) frontends # CONFIG_DVB_DIB8000=m CONFIG_DVB_MB86A20S=m CONFIG_DVB_S921=m # # ISDB-S (satellite) & ISDB-T (terrestrial) frontends # CONFIG_DVB_TC90522=m # # Digital terrestrial only tuners/PLL # CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m CONFIG_DVB_TUNER_DIB0090=m # # SEC control devices for DVB-S # CONFIG_DVB_A8293=m CONFIG_DVB_AF9033=m CONFIG_DVB_ATBM8830=m CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m CONFIG_DVB_IX2505V=m CONFIG_DVB_LGS8GXX=m CONFIG_DVB_LNBP21=m CONFIG_DVB_LNBP22=m CONFIG_DVB_M88RS2000=m CONFIG_DVB_DRX39XYJ=m # # Common Interface (EN50221) controller drivers # CONFIG_DVB_SP2=m # end of Media ancillary drivers # # Graphics support # CONFIG_DRM=y # CONFIG_DRM_DEBUG_MM is not set CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_DP_AUX_BUS=y CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_DISPLAY_DP_HELPER=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_GEM_DMA_HELPER=y CONFIG_DRM_GEM_SHMEM_HELPER=y CONFIG_DRM_SCHED=y # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # end of I2C encoder or helper chips # # ARM devices # # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_KOMEDA is not set # end of ARM devices # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set CONFIG_DRM_ROCKCHIP=y CONFIG_ROCKCHIP_VOP=y # CONFIG_ROCKCHIP_VOP2 is not set # CONFIG_ROCKCHIP_ANALOGIX_DP is not set # CONFIG_ROCKCHIP_CDN_DP is not set CONFIG_ROCKCHIP_DW_HDMI=y # CONFIG_ROCKCHIP_DW_MIPI_DSI is not set # CONFIG_ROCKCHIP_INNO_HDMI is not set # CONFIG_ROCKCHIP_LVDS is not set # CONFIG_ROCKCHIP_RGB is not set # CONFIG_ROCKCHIP_RK3066_HDMI is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_USE_LVDS is not set # CONFIG_DRM_RCAR_USE_MIPI_DSI is not set # CONFIG_DRM_VIRTIO_GPU is not set CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_ABT_Y030XX067A is not set # CONFIG_DRM_PANEL_ARM_VERSATILE is not set # CONFIG_DRM_PANEL_LVDS is not set # CONFIG_DRM_PANEL_SIMPLE is not set CONFIG_DRM_PANEL_EDP=y # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LB035Q02 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set # CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set # CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set # CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set # CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set # CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set # CONFIG_DRM_PANEL_SONY_ACX565AKM is not set # CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set # CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set # CONFIG_DRM_PANEL_TPO_TPG110 is not set # CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set # CONFIG_DRM_LONTIUM_LT9611 is not set # CONFIG_DRM_LONTIUM_LT9611UXC is not set # CONFIG_DRM_ITE_IT66121 is not set # CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NWL_MIPI_DSI is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_PARADE_PS8640 is not set # CONFIG_DRM_SIL_SII8620 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_SII9234 is not set # CONFIG_DRM_SIMPLE_BRIDGE is not set # CONFIG_DRM_THINE_THC63LVD1024 is not set # CONFIG_DRM_TOSHIBA_TC358762 is not set # CONFIG_DRM_TOSHIBA_TC358764 is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TOSHIBA_TC358768 is not set # CONFIG_DRM_TOSHIBA_TC358775 is not set # CONFIG_DRM_TI_DLPC3433 is not set # CONFIG_DRM_TI_TFP410 is not set # CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_ANALOGIX_ANX7625 is not set # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_CDNS_MHDP8546 is not set 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_GP_AUDIO is not set CONFIG_DRM_DW_HDMI_CEC=y # end of Display Interface Bridges # CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_HISI_KIRIN is not set # CONFIG_DRM_LOGICVC is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_PANEL_MIPI_DBI is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9163 is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set # CONFIG_TINYDRM_ILI9486 is not set # CONFIG_TINYDRM_MI0283QT is not set # CONFIG_TINYDRM_REPAPER is not set # CONFIG_TINYDRM_ST7586 is not set # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set CONFIG_DRM_LIMA=y # CONFIG_DRM_PANFROST is not set # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_DRM_NOMODESET=y # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # end of Frame buffer Devices # # Backlight & LCD device support # # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_KTD253 is not set # CONFIG_BACKLIGHT_PWM is not set # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # CONFIG_BACKLIGHT_LED is not set # end of Backlight & LCD device support CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support # CONFIG_LOGO is not set # end of Graphics support CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y # CONFIG_SND_HRTIMER is not set # CONFIG_SND_DYNAMIC_MINORS is not set CONFIG_SND_SUPPORT_OLD_API=y CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_CTL_INPUT_VALIDATION is not set # CONFIG_SND_SEQUENCER is not set CONFIG_SND_DRIVERS=y # CONFIG_SND_DUMMY is not set # CONFIG_SND_ALOOP is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_SERIAL_GENERIC is not set # CONFIG_SND_MPU401 is not set # # HD-Audio # # end of HD-Audio CONFIG_SND_HDA_PREALLOC_SIZE=64 CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=m CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y # CONFIG_SND_USB_UA101 is not set # CONFIG_SND_USB_CAIAQ is not set # CONFIG_SND_USB_6FIRE is not set # CONFIG_SND_USB_HIFACE is not set # CONFIG_SND_BCD2000 is not set # CONFIG_SND_USB_POD is not set # CONFIG_SND_USB_PODHD is not set # CONFIG_SND_USB_TONEPORT is not set # CONFIG_SND_USB_VARIAX is not set CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y # CONFIG_SND_SOC_ADI is not set # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_AMD_ACP_CONFIG is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # CONFIG_SND_SOC_FSL_AUDMIX is not set # 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_FSL_XCVR is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # end of SoC Audio for Freescale CPUs # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_MTK_BTCVSD is not set CONFIG_SND_SOC_ROCKCHIP=y CONFIG_SND_SOC_ROCKCHIP_I2S=y CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y CONFIG_SND_SOC_ROCKCHIP_PDM=m CONFIG_SND_SOC_ROCKCHIP_SPDIF=y CONFIG_SND_SOC_ROCKCHIP_MAX98090=m CONFIG_SND_SOC_ROCKCHIP_RT5645=m CONFIG_SND_SOC_RK3288_HDMI_ANALOG=m CONFIG_SND_SOC_RK3399_GRU_SOUND=m # CONFIG_SND_SOC_SOF_TOPLEVEL is not set # # STMicroelectronics STM32 SOC audio support # # end of 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_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1372_SPI is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set # CONFIG_SND_SOC_ADAU7002 is not set # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4375 is not set # CONFIG_SND_SOC_AK4458 is not set # CONFIG_SND_SOC_AK4554 is not set CONFIG_SND_SOC_AK4613=m # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # 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_CS35L41_SPI is not set # CONFIG_SND_SOC_CS35L41_I2C is not set # CONFIG_SND_SOC_CS35L45_SPI is not set # CONFIG_SND_SOC_CS35L45_I2C 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS42L83 is not set # CONFIG_SND_SOC_CS4234 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # 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_CX2072X is not set # CONFIG_SND_SOC_DA7213 is not set CONFIG_SND_SOC_DA7219=m CONFIG_SND_SOC_DMIC=m CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_ES7134 is not set # CONFIG_SND_SOC_ES7241 is not set CONFIG_SND_SOC_ES8316=y # CONFIG_SND_SOC_ES8326 is not set CONFIG_SND_SOC_ES8328=m CONFIG_SND_SOC_ES8328_I2C=m CONFIG_SND_SOC_ES8328_SPI=m # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_HDA is not set # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set # CONFIG_SND_SOC_MAX98088 is not set CONFIG_SND_SOC_MAX98090=m CONFIG_SND_SOC_MAX98357A=m # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98520 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX98396 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_ANALOG is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set # CONFIG_SND_SOC_PCM186X_I2C is not set # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set # CONFIG_SND_SOC_PCM5102A is not set # CONFIG_SND_SOC_PCM512x_I2C is not set # CONFIG_SND_SOC_PCM512x_SPI is not set CONFIG_SND_SOC_RK3328=y # CONFIG_SND_SOC_RK817 is not set CONFIG_SND_SOC_RL6231=m CONFIG_SND_SOC_RT5514=m CONFIG_SND_SOC_RT5514_SPI=m # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set # CONFIG_SND_SOC_RT5640 is not set CONFIG_SND_SOC_RT5645=m # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_RT9120 is not set # CONFIG_SND_SOC_SGTL5000 is not set # CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set # CONFIG_SND_SOC_SIMPLE_MUX is not set CONFIG_SND_SOC_SPDIF=y # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS2780 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805M is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320ADC3XXX is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set # CONFIG_SND_SOC_TLV320AIC3X_I2C is not set # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set CONFIG_SND_SOC_TS3A227E=m # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731_I2C is not set # CONFIG_SND_SOC_WM8731_SPI is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set # 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_WM8940 is not set # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set # CONFIG_SND_SOC_ZL38060 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_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8821 is not set # CONFIG_SND_SOC_NAU8822 is not set # CONFIG_SND_SOC_NAU8824 is not set # CONFIG_SND_SOC_TPA6130A2 is not set # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set # end of CODEC drivers CONFIG_SND_SIMPLE_CARD_UTILS=y CONFIG_SND_SIMPLE_CARD=y CONFIG_SND_AUDIO_GRAPH_CARD=y # CONFIG_SND_AUDIO_GRAPH_CARD2 is not set # CONFIG_SND_TEST_COMPONENT is not set # CONFIG_SND_VIRTIO is not set # # HID support # CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set CONFIG_HID_ASUS=y CONFIG_HID_AUREAL=y CONFIG_HID_BELKIN=y # CONFIG_HID_BETOP_FF is not set CONFIG_HID_BIGBEN_FF=m CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CREATIVE_SB0540 is not set CONFIG_HID_CYPRESS=y CONFIG_HID_DRAGONRISE=m CONFIG_DRAGONRISE_FF=y # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_FT260 is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_GLORIOUS is not set # CONFIG_HID_HOLTEK is not set # CONFIG_HID_VIVALDI is not set # CONFIG_HID_GT683R is not set # CONFIG_HID_KEYTOUCH is not set CONFIG_HID_KYE=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set # CONFIG_HID_VRC2 is not set # CONFIG_HID_XIAOMI is not set CONFIG_HID_GYRATION=y # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set # CONFIG_HID_JABRA is not set CONFIG_HID_TWINHAN=y CONFIG_HID_KENSINGTON=y CONFIG_HID_LCPOWER=y # CONFIG_HID_LED is not set CONFIG_HID_LENOVO=y # CONFIG_HID_LETSKETCH is not set CONFIG_HID_LOGITECH=y CONFIG_HID_LOGITECH_DJ=y CONFIG_HID_LOGITECH_HIDPP=y CONFIG_LOGITECH_FF=y 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_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=m CONFIG_HID_NINTENDO=m CONFIG_NINTENDO_FF=y # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set CONFIG_HID_ORTEK=y CONFIG_HID_OUYA=y CONFIG_HID_PANTHERLORD=y CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=y CONFIG_HID_PETALYNX=y # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PXRC is not set # CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set CONFIG_HID_SAMSUNG=y # CONFIG_HID_SEMITEK is not set # CONFIG_HID_SIGMAMICRO is not set CONFIG_HID_SONY=y CONFIG_SONY_FF=y # CONFIG_HID_SPEEDLINK is not set CONFIG_HID_STEAM=m # CONFIG_HID_STEELSERIES is not set CONFIG_HID_SUNPLUS=y # CONFIG_HID_RMI is not set # CONFIG_HID_GREENASIA is not set CONFIG_HID_SMARTJOYPLUS=m CONFIG_SMARTJOYPLUS_FF=y CONFIG_HID_TIVO=y CONFIG_HID_TOPSEED=y # CONFIG_HID_TOPRE is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set CONFIG_HID_WIIMOTE=m CONFIG_HID_XINMO=y # CONFIG_HID_ZEROPLUS is not set CONFIG_HID_ZYDACRON=y # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # end of USB HID support # # I2C HID support # # CONFIG_I2C_HID_OF is not set # CONFIG_I2C_HID_OF_ELAN is not set # CONFIG_I2C_HID_OF_GOODIX is not set # end of I2C HID support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y # CONFIG_USB_LED_TRIG is not set CONFIG_USB_ULPI_BUS=y # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_OTG=y # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_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 # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y # CONFIG_USB_XHCI_DBGCAP is not set # CONFIG_USB_XHCI_PCI_RENESAS is not set 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 # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD_PLATFORM=y # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_BCMA is not set # CONFIG_USB_HCD_SSB is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=y # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set CONFIG_USB_UAS=y # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_CDNS_SUPPORT is not set CONFIG_USB_MUSB_HDRC=y # CONFIG_USB_MUSB_HOST is not set # CONFIG_USB_MUSB_GADGET is not set CONFIG_USB_MUSB_DUAL_ROLE=y # # Platform Glue Layer # # # MUSB DMA mode # # CONFIG_MUSB_PIO_ONLY is not set CONFIG_USB_DWC3=y # CONFIG_USB_DWC3_ULPI is not set # CONFIG_USB_DWC3_HOST is not set # CONFIG_USB_DWC3_GADGET is not set CONFIG_USB_DWC3_DUAL_ROLE=y # # Platform Glue Driver Support # CONFIG_USB_DWC3_OF_SIMPLE=y CONFIG_USB_DWC2=y # CONFIG_USB_DWC2_HOST is not set # # Gadget/Dual-role mode requires USB Gadget support to be enabled # # CONFIG_USB_DWC2_PERIPHERAL is not set CONFIG_USB_DWC2_DUAL_ROLE=y # CONFIG_USB_DWC2_DEBUG is not set # CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set CONFIG_USB_CHIPIDEA=y CONFIG_USB_CHIPIDEA_UDC=y CONFIG_USB_CHIPIDEA_HOST=y CONFIG_USB_CHIPIDEA_MSM=y CONFIG_USB_CHIPIDEA_IMX=y CONFIG_USB_CHIPIDEA_GENERIC=y CONFIG_USB_CHIPIDEA_TEGRA=y CONFIG_USB_ISP1760=y CONFIG_USB_ISP1760_HCD=y CONFIG_USB_ISP1761_UDC=y # CONFIG_USB_ISP1760_HOST_ROLE is not set # CONFIG_USB_ISP1760_GADGET_ROLE is not set CONFIG_USB_ISP1760_DUAL_ROLE=y # # USB port drivers # # CONFIG_USB_SERIAL is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HUB_USB251XB is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # CONFIG_USB_ONBOARD_HUB is not set # # USB Physical Layer drivers # CONFIG_USB_PHY=y CONFIG_NOP_USB_XCEIV=y # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set CONFIG_USB_ULPI=y CONFIG_USB_ULPI_VIEWPORT=y # end of USB Physical Layer drivers CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GADGET_DEBUG_FILES is not set # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # # USB Peripheral Controller # # CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set # CONFIG_USB_SNP_UDC_PLAT is not set # CONFIG_USB_M66592 is not set # CONFIG_USB_BDC_UDC is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_GADGET_XILINX is not set # CONFIG_USB_MAX3420_UDC is not set # CONFIG_USB_DUMMY_HCD is not set # end of USB Peripheral Controller # CONFIG_USB_CONFIGFS is not set # # USB Gadget precomposed configurations # # CONFIG_USB_ZERO is not set # CONFIG_USB_AUDIO is not set # CONFIG_USB_ETH is not set # CONFIG_USB_G_NCM is not set # CONFIG_USB_GADGETFS is not set # CONFIG_USB_FUNCTIONFS is not set # CONFIG_USB_MASS_STORAGE is not set # CONFIG_USB_G_SERIAL is not set # CONFIG_USB_MIDI_GADGET is not set # CONFIG_USB_G_PRINTER is not set # CONFIG_USB_CDC_COMPOSITE is not set # CONFIG_USB_G_ACM_MS is not set # CONFIG_USB_G_MULTI is not set # CONFIG_USB_G_HID is not set # CONFIG_USB_G_DBGP is not set # CONFIG_USB_G_WEBCAM is not set # CONFIG_USB_RAW_GADGET is not set # end of USB Gadget precomposed configurations # CONFIG_TYPEC is not set CONFIG_USB_ROLE_SWITCH=y CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y # CONFIG_PWRSEQ_SD8787 is not set CONFIG_PWRSEQ_SIMPLE=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_DEBUG is not set CONFIG_MMC_ARMMMCI=y CONFIG_MMC_STM32_SDMMC=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_PLTFM=y CONFIG_MMC_SDHCI_OF_ARASAN=y # CONFIG_MMC_SDHCI_OF_AT91 is not set # CONFIG_MMC_SDHCI_OF_DWCMSHC is not set # CONFIG_MMC_SDHCI_CADENCE is not set # CONFIG_MMC_SDHCI_F_SDH30 is not set # CONFIG_MMC_SDHCI_MILBEAUT is not set CONFIG_MMC_SPI=y CONFIG_MMC_DW=y CONFIG_MMC_DW_PLTFM=y # CONFIG_MMC_DW_BLUEFIELD is not set # CONFIG_MMC_DW_EXYNOS is not set # CONFIG_MMC_DW_HI3798CV200 is not set CONFIG_MMC_DW_K3=y CONFIG_MMC_DW_ROCKCHIP=y # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_CQHCI=y # CONFIG_MMC_HSQ is not set # CONFIG_MMC_MTK is not set # CONFIG_MMC_SDHCI_XENON is not set # CONFIG_MMC_SDHCI_OMAP is not set # CONFIG_MMC_SDHCI_AM654 is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y CONFIG_LEDS_CLASS_FLASH=m # CONFIG_LEDS_CLASS_MULTICOLOR is not set # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_AW2013 is not set # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_EL15203000 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP50XX is not set # CONFIG_LEDS_LP55XX_COMMON is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set CONFIG_LEDS_PWM=y # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set CONFIG_LEDS_SYSCON=y # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_SPI_BYTE is not set # CONFIG_LEDS_TI_LMU_COMMON is not set # # Flash and Torch LED drivers # # CONFIG_LEDS_AAT1290 is not set # CONFIG_LEDS_AS3645A is not set # CONFIG_LEDS_KTD2692 is not set # CONFIG_LEDS_LM3601X is not set # CONFIG_LEDS_RT4505 is not set # CONFIG_LEDS_RT8515 is not set # CONFIG_LEDS_SGM3140 is not set # # RGB LED drivers # # # LED Triggers # CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y # CONFIG_LEDS_TRIGGER_MTD is not set CONFIG_LEDS_TRIGGER_HEARTBEAT=y # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set CONFIG_LEDS_TRIGGER_CPU=y CONFIG_LEDS_TRIGGER_ACTIVITY=y CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set CONFIG_LEDS_TRIGGER_PANIC=y # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set # CONFIG_LEDS_TRIGGER_AUDIO is not set # CONFIG_LEDS_TRIGGER_TTY is not set # # Simple LED drivers # # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_SUPPORT=y CONFIG_EDAC=y CONFIG_EDAC_LEGACY_SYSFS=y # CONFIG_EDAC_DEBUG is not set # CONFIG_EDAC_XGENE is not set # CONFIG_EDAC_DMC520 is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # 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 # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_HYM8563 is not set # CONFIG_RTC_DRV_MAX6900 is not set CONFIG_RTC_DRV_MAX77686=y # CONFIG_RTC_DRV_NCT3018Y is not set CONFIG_RTC_DRV_RK808=y # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # 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_RV3032 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 # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # CONFIG_RTC_DRV_DS3232=y CONFIG_RTC_DRV_DS3232_HWMON=y # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_OPTEE is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_PL030 is not set CONFIG_RTC_DRV_PL031=y # CONFIG_RTC_DRV_CADENCE is not set # CONFIG_RTC_DRV_FTRTC010 is not set # CONFIG_RTC_DRV_R7301 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_OF=y # CONFIG_ALTERA_MSGDMA is not set # CONFIG_AMBA_PL08X is not set # CONFIG_BCM_SBA_RAID is not set # 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 is not set CONFIG_PL330_DMA=y # CONFIG_XILINX_DMA is not set # CONFIG_XILINX_ZYNQMP_DMA is not set # CONFIG_XILINX_ZYNQMP_DPDMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set # CONFIG_DW_DMAC is not set # CONFIG_SF_PDMA is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set CONFIG_DMABUF_HEAPS=y # CONFIG_DMABUF_SYSFS_STATS is not set CONFIG_DMABUF_HEAPS_SYSTEM=y CONFIG_DMABUF_HEAPS_CMA=y # end of DMABUF options # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set CONFIG_VFIO=y CONFIG_VFIO_IOMMU_TYPE1=y # CONFIG_VFIO_NOIOMMU is not set # CONFIG_VFIO_PLATFORM is not set # CONFIG_VFIO_MDEV is not set # CONFIG_VIRT_DRIVERS is not set CONFIG_VIRTIO_ANCHOR=y CONFIG_VIRTIO=y CONFIG_VIRTIO_MENU=y CONFIG_VIRTIO_BALLOON=y # CONFIG_VIRTIO_INPUT is not set CONFIG_VIRTIO_MMIO=y # CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set # CONFIG_VDPA is not set CONFIG_VHOST_MENU=y # CONFIG_VHOST_NET is not set # CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set # # Microsoft Hyper-V guest support # # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_RTLLIB is not set CONFIG_RTL8723BS=m # CONFIG_R8712U is not set CONFIG_R8188EU=m # CONFIG_VT6656 is not set # # IIO staging drivers # # # Accelerometers # # CONFIG_ADIS16203 is not set # CONFIG_ADIS16240 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7816 is not set # end of Analog to digital converters # # Analog digital bi-direction converters # # CONFIG_ADT7316 is not set # end of Analog digital bi-direction converters # # Direct Digital Synthesis # # CONFIG_AD9832 is not set # CONFIG_AD9834 is not set # end of Direct Digital Synthesis # # Network Analyzer, Impedance Converters # # CONFIG_AD5933 is not set # end of Network Analyzer, Impedance Converters # # Active energy metering IC # # CONFIG_ADE7854 is not set # end of Active energy metering IC # # Resolver to digital converters # # CONFIG_AD2S1210 is not set # end of Resolver to digital converters # end of IIO staging drivers CONFIG_STAGING_MEDIA=y # CONFIG_VIDEO_MAX96712 is not set CONFIG_VIDEO_ROCKCHIP_VDEC=m CONFIG_STAGING_MEDIA_DEPRECATED=y # CONFIG_VIDEO_CPIA2 is not set # CONFIG_VIDEO_STKWEBCAM is not set CONFIG_VIDEO_TM6000=m CONFIG_VIDEO_TM6000_ALSA=m CONFIG_VIDEO_TM6000_DVB=m # CONFIG_USB_ZR364XX is not set # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_FB_TFT is not set # CONFIG_KS7010 is not set # CONFIG_PI433 is not set # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_FIELDBUS_DEV is not set # CONFIG_GOLDFISH is not set CONFIG_CHROME_PLATFORMS=y # CONFIG_CROS_EC is not set # CONFIG_MELLANOX_PLATFORM is not set # CONFIG_SURFACE_PLATFORMS is not set CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Clock driver for ARM Reference designs # # CONFIG_CLK_ICST is not set # CONFIG_CLK_SP810 is not set # end of Clock driver for ARM Reference designs # CONFIG_LMK04832 is not set # CONFIG_COMMON_CLK_MAX77686 is not set # CONFIG_COMMON_CLK_MAX9485 is not set CONFIG_COMMON_CLK_RK808=y CONFIG_COMMON_CLK_SCPI=y # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set CONFIG_COMMON_CLK_CS2000_CP=y CONFIG_COMMON_CLK_S2MPS11=y # CONFIG_COMMON_CLK_AXI_CLKGEN is not set CONFIG_COMMON_CLK_XGENE=y CONFIG_COMMON_CLK_PWM=y # CONFIG_COMMON_CLK_RS9_PCIE is not set # CONFIG_COMMON_CLK_VC5 is not set # CONFIG_COMMON_CLK_VC7 is not set # CONFIG_COMMON_CLK_FIXED_MMIO is not set CONFIG_COMMON_CLK_ROCKCHIP=y # CONFIG_CLK_PX30 is not set # CONFIG_CLK_RK3308 is not set CONFIG_CLK_RK3328=y # CONFIG_CLK_RK3368 is not set # CONFIG_CLK_RK3399 is not set # CONFIG_CLK_RK3568 is not set # CONFIG_XILINX_VCU is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set CONFIG_HWSPINLOCK=y # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_PROBE=y CONFIG_CLKSRC_MMIO=y CONFIG_ROCKCHIP_TIMER=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y CONFIG_FSL_ERRATUM_A008585=y CONFIG_HISILICON_ERRATUM_161010101=y CONFIG_ARM64_ERRATUM_858921=y # CONFIG_MICROCHIP_PIT64B is not set # end of Clock Source drivers CONFIG_MAILBOX=y CONFIG_ARM_MHU=y CONFIG_ARM_MHU_V2=m CONFIG_PLATFORM_MHU=y # CONFIG_PL320_MBOX is not set CONFIG_ROCKCHIP_MBOX=y # CONFIG_ALTERA_MBOX is not set # CONFIG_MAILBOX_TEST is not set CONFIG_IOMMU_IOVA=y CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # CONFIG_IOMMU_IO_PGTABLE=y CONFIG_IOMMU_IO_PGTABLE_LPAE=y # CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set # CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set # CONFIG_IOMMU_IO_PGTABLE_DART is not set # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set CONFIG_IOMMU_DEFAULT_DMA_STRICT=y # CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_OF_IOMMU=y CONFIG_IOMMU_DMA=y CONFIG_ROCKCHIP_IOMMU=y CONFIG_ARM_SMMU=y # CONFIG_ARM_SMMU_LEGACY_DT_BINDINGS is not set CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT=y CONFIG_ARM_SMMU_V3=y # CONFIG_ARM_SMMU_V3_SVA is not set # CONFIG_VIRTIO_IOMMU is not set # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # end of Remoteproc drivers # # Rpmsg drivers # # CONFIG_RPMSG_QCOM_GLINK_RPM is not set # CONFIG_RPMSG_VIRTIO is not set # end of Rpmsg drivers # CONFIG_SOUNDWIRE is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # end of Amlogic SoC drivers # # Broadcom SoC drivers # # CONFIG_SOC_BRCMSTB is not set # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # CONFIG_QUICC_ENGINE is not set # CONFIG_FSL_RCPM is not set # end of NXP/Freescale QorIQ SoC drivers # # fujitsu SoC drivers # # end of fujitsu SoC drivers # # i.MX SoC drivers # # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # CONFIG_LITEX_SOC_CONTROLLER is not set # end of Enable LiteX SoC Builder specific drivers # # Qualcomm SoC drivers # # end of Qualcomm SoC drivers CONFIG_ROCKCHIP_GRF=y CONFIG_ROCKCHIP_IODOMAIN=y CONFIG_ROCKCHIP_PM_DOMAINS=y # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y CONFIG_DEVFREQ_GOV_PERFORMANCE=y CONFIG_DEVFREQ_GOV_POWERSAVE=y CONFIG_DEVFREQ_GOV_USERSPACE=y CONFIG_DEVFREQ_GOV_PASSIVE=y # # DEVFREQ Drivers # # CONFIG_ARM_RK3399_DMC_DEVFREQ is not set CONFIG_PM_DEVFREQ_EVENT=y # CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_FSA9480 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_MEMORY is not set CONFIG_IIO=y CONFIG_IIO_BUFFER=y # CONFIG_IIO_BUFFER_CB is not set # CONFIG_IIO_BUFFER_DMA is not set # CONFIG_IIO_BUFFER_DMAENGINE is not set # CONFIG_IIO_BUFFER_HW_CONSUMER is not set CONFIG_IIO_KFIFO_BUF=y CONFIG_IIO_TRIGGERED_BUFFER=y # CONFIG_IIO_CONFIGFS is not set CONFIG_IIO_TRIGGER=y CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # CONFIG_IIO_SW_DEVICE is not set # CONFIG_IIO_SW_TRIGGER is not set # CONFIG_IIO_TRIGGERED_EVENT is not set # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADXL313_I2C is not set # CONFIG_ADXL313_SPI is not set # CONFIG_ADXL345_I2C is not set # CONFIG_ADXL345_SPI is not set # CONFIG_ADXL355_I2C is not set # CONFIG_ADXL355_SPI is not set # CONFIG_ADXL367_SPI is not set # CONFIG_ADXL367_I2C is not set # CONFIG_ADXL372_SPI is not set # CONFIG_ADXL372_I2C is not set # CONFIG_BMA180 is not set # CONFIG_BMA220 is not set # CONFIG_BMA400 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_BMI088_ACCEL is not set # CONFIG_DA280 is not set # CONFIG_DA311 is not set # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_DMARD10 is not set # CONFIG_FXLS8962AF_I2C is not set # CONFIG_FXLS8962AF_SPI is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MC3230 is not set # CONFIG_MMA7455_I2C is not set # CONFIG_MMA7455_SPI is not set # CONFIG_MMA7660 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MSA311 is not set # CONFIG_MXC4005 is not set # CONFIG_MXC6255 is not set # CONFIG_SCA3000 is not set # CONFIG_SCA3300 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7091R5 is not set # CONFIG_AD7124 is not set # CONFIG_AD7192 is not set # CONFIG_AD7266 is not set # CONFIG_AD7280 is not set # CONFIG_AD7291 is not set # CONFIG_AD7292 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_AD7780 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD7949 is not set # CONFIG_AD799X is not set # CONFIG_ADI_AXI_ADC is not set # CONFIG_CC10001_ADC is not set # CONFIG_ENVELOPE_DETECTOR is not set # CONFIG_HI8435 is not set # CONFIG_HX711 is not set # CONFIG_INA2XX_ADC is not set # CONFIG_LTC2471 is not set # CONFIG_LTC2485 is not set # CONFIG_LTC2496 is not set # CONFIG_LTC2497 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX11100 is not set # CONFIG_MAX1118 is not set # CONFIG_MAX11205 is not set # CONFIG_MAX1241 is not set # CONFIG_MAX1363 is not set # CONFIG_MAX9611 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_MCP3911 is not set # CONFIG_NAU7802 is not set # CONFIG_QCOM_SPMI_IADC is not set # CONFIG_QCOM_SPMI_VADC is not set # CONFIG_QCOM_SPMI_ADC5 is not set CONFIG_ROCKCHIP_SARADC=y # CONFIG_RICHTEK_RTQ6056 is not set # CONFIG_SD_ADC_MODULATOR is not set # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC0832 is not set # CONFIG_TI_ADC084S021 is not set # CONFIG_TI_ADC12138 is not set # CONFIG_TI_ADC108S102 is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_TI_ADC161S626 is not set # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS7950 is not set # CONFIG_TI_ADS8344 is not set # CONFIG_TI_ADS8688 is not set # CONFIG_TI_ADS124S08 is not set # CONFIG_TI_ADS131E08 is not set # CONFIG_TI_TLC4541 is not set # CONFIG_TI_TSC2046 is not set # CONFIG_VF610_ADC is not set # CONFIG_XILINX_XADC is not set # end of Analog to digital converters # # Analog to digital and digital to analog converters # # CONFIG_AD74413R is not set # end of Analog to digital and digital to analog converters # # Analog Front Ends # # CONFIG_IIO_RESCALE is not set # end of Analog Front Ends # # Amplifiers # # CONFIG_AD8366 is not set # CONFIG_ADA4250 is not set # CONFIG_HMC425 is not set # end of Amplifiers # # Capacitance to digital converters # # CONFIG_AD7150 is not set # CONFIG_AD7746 is not set # end of Capacitance to digital converters # # Chemical Sensors # # CONFIG_ATLAS_PH_SENSOR is not set # CONFIG_ATLAS_EZO_SENSOR is not set # CONFIG_BME680 is not set # CONFIG_CCS811 is not set # CONFIG_IAQCORE is not set # CONFIG_PMS7003 is not set # CONFIG_SCD30_CORE is not set # CONFIG_SCD4X is not set # CONFIG_SENSIRION_SGP30 is not set # CONFIG_SENSIRION_SGP40 is not set # CONFIG_SPS30_I2C is not set # CONFIG_SPS30_SERIAL is not set # CONFIG_SENSEAIR_SUNRISE_CO2 is not set # CONFIG_VZ89X is not set # end of Chemical Sensors # # Hid Sensor IIO Common # # end of Hid Sensor IIO Common # # IIO SCMI Sensors # # end of IIO SCMI Sensors # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # end of SSP Sensor Common # # Digital to analog converters # # CONFIG_AD3552R is not set # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5592R is not set # CONFIG_AD5593R is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_LTC2688 is not set # CONFIG_AD5686_SPI is not set # CONFIG_AD5696_I2C is not set # CONFIG_AD5755 is not set # CONFIG_AD5758 is not set # CONFIG_AD5761 is not set # CONFIG_AD5764 is not set # CONFIG_AD5766 is not set # CONFIG_AD5770R is not set # CONFIG_AD5791 is not set # CONFIG_AD7293 is not set # CONFIG_AD7303 is not set # CONFIG_AD8801 is not set # CONFIG_DPOT_DAC is not set # CONFIG_DS4424 is not set # CONFIG_LTC1660 is not set # CONFIG_LTC2632 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # 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 # end of Digital to analog converters # # IIO dummy driver # # end of IIO dummy driver # # Filters # # CONFIG_ADMV8818 is not set # end of Filters # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # end of Clock Generator/Distribution # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # CONFIG_ADF4371 is not set # CONFIG_ADMV1013 is not set # CONFIG_ADMV1014 is not set # CONFIG_ADMV4420 is not set # CONFIG_ADRF6780 is not set # end of Phase-Locked Loop (PLL) frequency synthesizers # end of Frequency Synthesizers DDS/PLL # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS290 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_FXAS21002C is not set # CONFIG_MPU3050_I2C is not set # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # end of Digital gyroscope sensors # # Health Sensors # # # Heart Rate Monitors # # CONFIG_AFE4403 is not set # CONFIG_AFE4404 is not set # CONFIG_MAX30100 is not set # CONFIG_MAX30102 is not set # end of Heart Rate Monitors # end of Health Sensors # # Humidity sensors # # CONFIG_AM2315 is not set # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HDC2010 is not set # CONFIG_HTS221 is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # end of Humidity sensors # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16460 is not set # CONFIG_ADIS16475 is not set # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set # CONFIG_BOSCH_BNO055_SERIAL is not set # CONFIG_BOSCH_BNO055_I2C is not set # CONFIG_FXOS8700_I2C is not set # CONFIG_FXOS8700_SPI is not set # CONFIG_KMX61 is not set # CONFIG_INV_ICM42600_I2C is not set # CONFIG_INV_ICM42600_SPI is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set # CONFIG_IIO_ST_LSM6DSX is not set # CONFIG_IIO_ST_LSM9DS0 is not set # end of Inertial measurement units # # Light sensors # # CONFIG_ADJD_S311 is not set # CONFIG_ADUX1020 is not set # CONFIG_AL3010 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_AS73211 is not set # CONFIG_BH1750 is not set # CONFIG_BH1780 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM3605 is not set # CONFIG_CM36651 is not set # CONFIG_GP2AP002 is not set # CONFIG_GP2AP020A00F is not set # CONFIG_SENSORS_ISL29018 is not set # CONFIG_SENSORS_ISL29028 is not set # CONFIG_ISL29125 is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_LTRF216A is not set # CONFIG_LV0104CS is not set # CONFIG_MAX44000 is not set # CONFIG_MAX44009 is not set # CONFIG_NOA1305 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1133 is not set # CONFIG_SI1145 is not set # CONFIG_STK3310 is not set # CONFIG_ST_UVIS25 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set # CONFIG_SENSORS_TSL2563 is not set # CONFIG_TSL2583 is not set # CONFIG_TSL2591 is not set # CONFIG_TSL2772 is not set # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VCNL4035 is not set # CONFIG_VEML6030 is not set # CONFIG_VEML6070 is not set # CONFIG_VL6180 is not set # CONFIG_ZOPT2201 is not set # end of Light sensors # # Magnetometer sensors # # CONFIG_AK8974 is not set # CONFIG_AK8975 is not set # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN_I2C is not set # CONFIG_BMC150_MAGN_SPI is not set # CONFIG_MAG3110 is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # CONFIG_SENSORS_RM3100_I2C is not set # CONFIG_SENSORS_RM3100_SPI is not set # CONFIG_YAMAHA_YAS530 is not set # end of Magnetometer sensors # # Multiplexers # # CONFIG_IIO_MUX is not set # end of Multiplexers # # Inclinometer sensors # # end of Inclinometer sensors # # Triggers - standalone # # CONFIG_IIO_INTERRUPT_TRIGGER is not set # CONFIG_IIO_SYSFS_TRIGGER is not set # end of Triggers - standalone # # Linear and angular position sensors # # end of Linear and angular position sensors # # Digital potentiometers # # CONFIG_AD5110 is not set # CONFIG_AD5272 is not set # CONFIG_DS1803 is not set # CONFIG_MAX5432 is not set # CONFIG_MAX5481 is not set # CONFIG_MAX5487 is not set # CONFIG_MCP4018 is not set # CONFIG_MCP4131 is not set # CONFIG_MCP4531 is not set # CONFIG_MCP41010 is not set # CONFIG_TPL0102 is not set # end of Digital potentiometers # # Digital potentiostats # # CONFIG_LMP91000 is not set # end of Digital potentiostats # # Pressure sensors # # CONFIG_ABP060MG is not set # CONFIG_BMP280 is not set # CONFIG_DLHL60D is not set # CONFIG_DPS310 is not set # CONFIG_HP03 is not set # CONFIG_ICP10100 is not set # CONFIG_MPL115_I2C is not set # CONFIG_MPL115_SPI is not set # CONFIG_MPL3115 is not set # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # CONFIG_HP206C is not set # CONFIG_ZPA2326 is not set # end of Pressure sensors # # Lightning sensors # # CONFIG_AS3935 is not set # end of Lightning sensors # # Proximity and distance sensors # # CONFIG_ISL29501 is not set # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_MB1232 is not set # CONFIG_PING is not set # CONFIG_RFD77402 is not set # CONFIG_SRF04 is not set # CONFIG_SX9310 is not set # CONFIG_SX9324 is not set # CONFIG_SX9360 is not set # CONFIG_SX9500 is not set # CONFIG_SRF08 is not set # CONFIG_VCNL3020 is not set # CONFIG_VL53L0X_I2C is not set # end of Proximity and distance sensors # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1200 is not set # end of Resolver to digital converters # # Temperature sensors # # CONFIG_LTC2983 is not set # CONFIG_MAXIM_THERMOCOUPLE is not set # CONFIG_MLX90614 is not set # CONFIG_MLX90632 is not set # CONFIG_TMP006 is not set # CONFIG_TMP007 is not set # CONFIG_TMP117 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_MAX31856 is not set # CONFIG_MAX31865 is not set # end of Temperature sensors CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_DEBUG is not set # CONFIG_PWM_ATMEL_TCB is not set # CONFIG_PWM_CLK is not set # CONFIG_PWM_FSL_FTM is not set # CONFIG_PWM_PCA9685 is not set CONFIG_PWM_ROCKCHIP=y # CONFIG_PWM_XILINX is not set # # IRQ chip support # CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 CONFIG_ARM_GIC_V3=y CONFIG_ARM_GIC_V3_ITS=y # CONFIG_AL_FIC is not set # CONFIG_XILINX_INTC is not set CONFIG_PARTITION_PERCPU=y # end of IRQ chip support # CONFIG_IPACK_BUS is not set CONFIG_ARCH_HAS_RESET_CONTROLLER=y CONFIG_RESET_CONTROLLER=y # CONFIG_RESET_TI_SYSCON is not set # CONFIG_RESET_TI_TPS380X is not set # # PHY Subsystem # CONFIG_GENERIC_PHY=y # CONFIG_PHY_XGENE is not set # CONFIG_PHY_CAN_TRANSCEIVER is not set # # PHY drivers for Broadcom platforms # # CONFIG_BCM_KONA_USB2_PHY is not set # end of PHY drivers for Broadcom platforms # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_DPHY_RX is not set # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_CADENCE_SALVO is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_LAN966X_SERDES is not set # CONFIG_PHY_CPCAP_USB is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set # CONFIG_PHY_OCELOT_SERDES is not set # CONFIG_PHY_QCOM_USB_HS is not set # CONFIG_PHY_QCOM_USB_HSIC is not set CONFIG_PHY_ROCKCHIP_DP=y # CONFIG_PHY_ROCKCHIP_DPHY_RX0 is not set CONFIG_PHY_ROCKCHIP_EMMC=y CONFIG_PHY_ROCKCHIP_INNO_HDMI=y CONFIG_PHY_ROCKCHIP_INNO_USB2=y # CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY is not set # CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY is not set # CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY is not set CONFIG_PHY_ROCKCHIP_PCIE=m # CONFIG_PHY_ROCKCHIP_SNPS_PCIE3 is not set CONFIG_PHY_ROCKCHIP_TYPEC=y CONFIG_PHY_ROCKCHIP_USB=y # CONFIG_PHY_SAMSUNG_USB2 is not set # CONFIG_PHY_TUSB1210 is not set # end of PHY Subsystem # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCI_PMU is not set # CONFIG_ARM_CCN is not set # CONFIG_ARM_CMN is not set CONFIG_ARM_PMU=y # CONFIG_ARM_DSU_PMU is not set # CONFIG_ARM_SPE_PMU is not set # end of Performance monitor support CONFIG_RAS=y # # Android # # CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_LIBNVDIMM is not set # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y # CONFIG_NVMEM_RMEM is not set CONFIG_NVMEM_ROCKCHIP_EFUSE=y CONFIG_NVMEM_ROCKCHIP_OTP=m # CONFIG_NVMEM_SPMI_SDAM is not set CONFIG_NVMEM_U_BOOT_ENV=m # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_FSI is not set CONFIG_TEE=y CONFIG_OPTEE=m CONFIG_MULTIPLEXER=y # # Multiplexer drivers # # CONFIG_MUX_ADG792A is not set # CONFIG_MUX_ADGS1408 is not set # CONFIG_MUX_GPIO is not set # CONFIG_MUX_MMIO is not set # end of Multiplexer drivers CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set # CONFIG_PECI is not set # CONFIG_HTE is not set # end of Device Drivers # # 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 CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=m CONFIG_XFS_SUPPORT_V4=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_ONLINE_SCRUB is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_BTRFS_FS_REF_VERIFY is not set # CONFIG_NILFS2_FS is not set CONFIG_F2FS_FS=y CONFIG_F2FS_STAT_FS=y # CONFIG_F2FS_FS_XATTR is not set CONFIG_F2FS_CHECK_FS=y # CONFIG_F2FS_FAULT_INJECTION is not set # CONFIG_F2FS_FS_COMPRESSION is not set CONFIG_F2FS_IOSTAT=y # CONFIG_F2FS_UNFAIR_RWSEM is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QUOTA_DEBUG is not set # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS4_FS=y CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=m CONFIG_CUSE=m # CONFIG_VIRTIO_FS is not set CONFIG_OVERLAY_FS=m # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_XINO_AUTO is not set # CONFIG_OVERLAY_FS_METACOPY is not set # # Caches # CONFIG_NETFS_SUPPORT=y # CONFIG_NETFS_STATS is not set CONFIG_FSCACHE=y # CONFIG_FSCACHE_STATS is not set # CONFIG_FSCACHE_DEBUG is not set # CONFIG_CACHEFILES is not set # end of Caches # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=y # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=m CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set CONFIG_NTFS3_FS=m # CONFIG_NTFS3_64BIT_CLUSTER is not set # CONFIG_NTFS3_LZX_XPRESS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_PROC_CHILDREN=y CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_TMPFS_INODE64 is not set CONFIG_ARCH_SUPPORTS_HUGETLBFS=y # CONFIG_HUGETLBFS is not set CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=y # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set CONFIG_HFS_FS=y CONFIG_HFSPLUS_FS=y # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS2_FS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y CONFIG_SQUASHFS_FILE_CACHE=y # CONFIG_SQUASHFS_FILE_DIRECT is not set # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 CONFIG_PSTORE_DEFLATE_COMPRESS=y # CONFIG_PSTORE_LZO_COMPRESS is not set # CONFIG_PSTORE_LZ4_COMPRESS is not set # CONFIG_PSTORE_LZ4HC_COMPRESS is not set # CONFIG_PSTORE_842_COMPRESS is not set # CONFIG_PSTORE_ZSTD_COMPRESS is not set CONFIG_PSTORE_COMPRESS=y CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" CONFIG_PSTORE_CONSOLE=y CONFIG_PSTORE_PMSG=y CONFIG_PSTORE_RAM=y # CONFIG_PSTORE_BLK is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y # CONFIG_NFS_SWAP is not set CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=m CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" CONFIG_NFS_V4_1_MIGRATION=y CONFIG_NFS_V4_SECURITY_LABEL=y CONFIG_ROOT_NFS=y CONFIG_NFS_FSCACHE=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFS_DISABLE_UDP_SUPPORT=y # CONFIG_NFS_V4_2_READ_PLUS is not set # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_COMMON=y CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS2=y CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set CONFIG_CIFS_DEBUG=y # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DEBUG_DUMP_KEYS is not set # CONFIG_CIFS_DFS_UPCALL is not set # CONFIG_CIFS_SWN_UPCALL is not set CONFIG_CIFS_FSCACHE=y # CONFIG_CIFS_ROOT is not set # CONFIG_SMB_SERVER is not set CONFIG_SMBFS=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEY_DH_OPERATIONS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set CONFIG_SECURITY=y # CONFIG_SECURITYFS is not set # CONFIG_SECURITY_NETWORK is not set # CONFIG_SECURITY_PATH is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_SECURITY_SMACK is not set # CONFIG_SECURITY_TOMOYO is not set # 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_SECURITY_LOCKDOWN_LSM is not set # CONFIG_SECURITY_LANDLOCK is not set CONFIG_INTEGRITY=y # CONFIG_INTEGRITY_SIGNATURE is not set # CONFIG_IMA is not set # CONFIG_EVM is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_LSM="yama,loadpin,safesetid,integrity" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_STACK_ALL_PATTERN is not set # CONFIG_INIT_STACK_ALL_ZERO is not set # CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization CONFIG_RANDSTRUCT_NONE=y # CONFIG_RANDSTRUCT_FULL is not set # CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_ENGINE=m # end of Crypto core or helper # # Public-key cryptography # CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y # CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set CONFIG_CRYPTO_ECC=m CONFIG_CRYPTO_ECDH=m # CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set CONFIG_CRYPTO_CURVE25519=m # end of Public-key cryptography # # Block ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set CONFIG_CRYPTO_SM4=y # CONFIG_CRYPTO_SM4_GENERIC is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_ARC4 is not set CONFIG_CRYPTO_CHACHA20=m CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set CONFIG_CRYPTO_CTR=y # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set CONFIG_CRYPTO_NHPOLY1305=y # end of Length-preserving ciphers and modes # # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y # CONFIG_CRYPTO_ESSIV is not set # end of AEAD (authenticated encryption with associated data) ciphers # # Hashes, digests, and MACs # CONFIG_CRYPTO_BLAKE2B=m CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set CONFIG_CRYPTO_POLYVAL=y CONFIG_CRYPTO_POLY1305=m # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set CONFIG_CRYPTO_SM3=y # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_XCBC is not set CONFIG_CRYPTO_XXHASH=m # end of Hashes, digests, and MACs # # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y # CONFIG_CRYPTO_CRCT10DIF is not set # end of CRCs (cyclic redundancy checks) # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_LZO is not set # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # end of Compression # # Random number generation # CONFIG_CRYPTO_ANSI_CPRNG=y CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation # # Userspace interface # CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set # CONFIG_CRYPTO_USER_API_AEAD is not set CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y CONFIG_CRYPTO_NHPOLY1305_NEON=y CONFIG_CRYPTO_CHACHA20_NEON=y # # Accelerated Cryptographic Algorithms for CPU (arm64) # CONFIG_CRYPTO_GHASH_ARM64_CE=y CONFIG_CRYPTO_POLY1305_NEON=y CONFIG_CRYPTO_SHA1_ARM64_CE=y CONFIG_CRYPTO_SHA256_ARM64=y CONFIG_CRYPTO_SHA2_ARM64_CE=y CONFIG_CRYPTO_SHA512_ARM64=y CONFIG_CRYPTO_SHA512_ARM64_CE=y # CONFIG_CRYPTO_SHA3_ARM64 is not set CONFIG_CRYPTO_SM3_NEON=y # CONFIG_CRYPTO_SM3_ARM64_CE is not set CONFIG_CRYPTO_POLYVAL_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64=y CONFIG_CRYPTO_AES_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64_CE_BLK=y CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y CONFIG_CRYPTO_AES_ARM64_BS=y # CONFIG_CRYPTO_SM4_ARM64_CE is not set CONFIG_CRYPTO_SM4_ARM64_CE_BLK=y CONFIG_CRYPTO_SM4_ARM64_NEON_BLK=y CONFIG_CRYPTO_AES_ARM64_CE_CCM=y # end of Accelerated Cryptographic Algorithms for CPU (arm64) CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_ATMEL_ECC is not set # CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set # CONFIG_CRYPTO_DEV_CCP is not set # CONFIG_CRYPTO_DEV_ROCKCHIP is not set CONFIG_CRYPTO_DEV_VIRTIO=m # CONFIG_CRYPTO_DEV_SAFEXCEL is not set # CONFIG_CRYPTO_DEV_CCREE is not set # CONFIG_CRYPTO_DEV_HISI_SEC is not set # CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS8_PRIVATE_KEY_PARSER=m CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m CONFIG_RAID6_PQ_BENCHMARK=y CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_CORDIC=m # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y # CONFIG_INDIRECT_PIO is not set # # Crypto library routines # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y CONFIG_CRYPTO_LIB_CHACHA=m CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m CONFIG_CRYPTO_LIB_CURVE25519=m CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y CONFIG_CRYPTO_LIB_POLY1305=m CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_CRC_CCITT=m CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC64_ROCKSOFT is not set CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set CONFIG_CRC7=y CONFIG_LIBCRC32C=m # CONFIG_CRC8 is not set CONFIG_XXHASH=y CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=m CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=m CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y CONFIG_XZ_DEC_POWERPC=y CONFIG_XZ_DEC_IA64=y CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y CONFIG_XZ_DEC_SPARC=y # CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_LZ4=y CONFIG_DECOMPRESS_ZSTD=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_INTERVAL_TREE=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_DMA_DECLARE_COHERENT=y CONFIG_ARCH_HAS_SETUP_DMA_OPS=y CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y CONFIG_SWIOTLB=y # CONFIG_DMA_RESTRICTED_POOL is not set CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_COHERENT_POOL=y CONFIG_DMA_DIRECT_REMAP=y CONFIG_DMA_CMA=y # CONFIG_DMA_PERNUMA_CMA is not set # # Default contiguous memory area size: # CONFIG_CMA_SIZE_MBYTES=64 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_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y # CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_TIME_NS=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_ARCH_STACKWALK=y CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y # end of Library routines CONFIG_GENERIC_IOREMAP=y CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set # CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_SYMBOLIC_ERRNAME=y CONFIG_DEBUG_BUGVERBOSE=y # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Compile-time checks and compiler options # CONFIG_DEBUG_INFO=y CONFIG_AS_HAS_NON_CONST_LEB128=y # CONFIG_DEBUG_INFO_NONE is not set CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_INFO_COMPRESSED is not set # CONFIG_DEBUG_INFO_SPLIT is not set # CONFIG_DEBUG_INFO_BTF is not set # CONFIG_GDB_SCRIPTS is not set CONFIG_FRAME_WARN=2048 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set CONFIG_HAVE_KCSAN_COMPILER=y # end of Generic Kernel Debugging Instruments # # Networking Debugging # # CONFIG_NET_DEV_REFCNT_TRACKER is not set # CONFIG_NET_NS_REFCNT_TRACKER is not set # CONFIG_DEBUG_NET is not set # end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_PTDUMP_DEBUGFS is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM_PGTABLE is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_KASAN_SW_TAGS=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y # CONFIG_KFENCE is not set # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 # CONFIG_SOFTLOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # # CONFIG_SCHED_DEBUG is not set CONFIG_SCHED_INFO=y # CONFIG_SCHEDSTATS is not set # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_SAMPLES is not set CONFIG_STRICT_DEVMEM=y # CONFIG_IO_STRICT_DEVMEM is not set # # arm64 Debugging # # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_ARM64_RELOC_TEST is not set # CONFIG_CORESIGHT is not set # end of arm64 Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_RUNTIME_TESTING_MENU is not set CONFIG_ARCH_USE_MEMTEST=y CONFIG_MEMTEST=y # end of Kernel Testing and Coverage # # Rust hacking # # end of Rust hacking # end of Kernel hacking ================================================ FILE: projects/Rockchip/devices/RK3328/options ================================================ ################################################################################ # setup device defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc+crypto" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc" TARGET_FPU="crypto-neon-fp-armv8" ;; esac # Firmware UBOOT_FIRMWARE+=" atf" ATF_PLATFORM="rk3328" ATF_BL31_BINARY="bl31/bl31.elf" # Kernel target KERNEL_TARGET="Image" # Mali GPU family MALI_FAMILY="450" GRAPHIC_DRIVERS="lima" # kernel serial console EXTRA_CMDLINE="console=uart8250,mmio32,0xff130000 console=tty0 coherent_pool=2M cec.debounce_ms=5000" # set the addon project ADDON_PROJECT="ARMv8" ================================================ FILE: projects/Rockchip/devices/RK3399/README.md ================================================ # RK3399 This is a SoC device for RK3399 **Build** * `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=hugsun-x99 make image` * `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=khadas-edge make image` * `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=nanopc-t4 make image` * `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=nanopi-m4 make image` * `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=orangepi make image` * `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=rock960 make image` * `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=rock-pi-4 make image` * `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=rock-pi-4-plus make image` * `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=rock-pi-n10 make image` * `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=rockpro64 make image` * `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=roc-pc make image` * `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=roc-pc-plus make image` * `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=sapphire make image` ================================================ FILE: projects/Rockchip/devices/RK3399/linux/default/linux.aarch64.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm64 6.1.63 Kernel Configuration # CONFIG_CC_VERSION_TEXT="aarch64-none-elf-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_SYSVIPC_COMPAT=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_IRQ_IPI=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_IRQ_MSI_IOMMU=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_CONTEXT_TRACKING=y CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y # CONFIG_BPF_JIT_ALWAYS_ON is not set CONFIG_BPF_JIT_DEFAULT_ON=y # CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_BPF_PRELOAD is not set # end of BPF subsystem CONFIG_PREEMPT_VOLUNTARY_BUILD=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set # CONFIG_PREEMPT_DYNAMIC is not set # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_SCHED_AVG_IRQ=y CONFIG_SCHED_THERMAL_PRESSURE=y CONFIG_BSD_PROCESS_ACCT=y CONFIG_BSD_PROCESS_ACCT_V3=y CONFIG_TASKSTATS=y CONFIG_TASK_DELAY_ACCT=y CONFIG_TASK_XACCT=y CONFIG_TASK_IO_ACCOUNTING=y # CONFIG_PSI is not set # end of CPU/Task time and stats accounting CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=17 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 # CONFIG_PRINTK_INDEX is not set CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # # CONFIG_UCLAMP_TASK is not set # end of Scheduler features CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_CC_HAS_INT128=y CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set CONFIG_CGROUP_PIDS=y # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y # CONFIG_CGROUP_MISC is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_TIME_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y CONFIG_CHECKPOINT_RESTORE=y CONFIG_SCHED_AUTOGROUP=y # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 # CONFIG_RD_GZIP is not set # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set CONFIG_RD_LZ4=y CONFIG_RD_ZSTD=y CONFIG_INITRAMFS_COMPRESSION_LZ4=y # CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y # CONFIG_EXPERT is not set CONFIG_UID16=y CONFIG_MULTIUSER=y CONFIG_SYSFS_SYSCALL=y CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y 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 CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_EMBEDDED is not set CONFIG_HAVE_PERF_EVENTS=y # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_SYSTEM_DATA_VERIFICATION=y CONFIG_PROFILING=y # end of General setup CONFIG_ARM64=y CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_64BIT=y CONFIG_MMU=y CONFIG_ARM64_PAGE_SHIFT=12 CONFIG_ARM64_CONT_PTE_SHIFT=4 CONFIG_ARM64_CONT_PMD_SHIFT=4 CONFIG_ARCH_MMAP_RND_BITS_MIN=18 CONFIG_ARCH_MMAP_RND_BITS_MAX=33 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_STACKTRACE_SUPPORT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_LOCKDEP_SUPPORT=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CSUM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y CONFIG_SMP=y CONFIG_KERNEL_MODE_NEON=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_PGTABLE_LEVELS=4 CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_ARCH_PROC_KCORE_TEXT=y # # Platform selection # # CONFIG_ARCH_ACTIONS is not set # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_APPLE is not set # CONFIG_ARCH_BCM is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_BITMAIN is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_SPARX5 is not set # CONFIG_ARCH_K3 is not set # CONFIG_ARCH_LG1K is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_KEEMBAY is not set # CONFIG_ARCH_MEDIATEK is not set # CONFIG_ARCH_MESON is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_NXP is not set # CONFIG_ARCH_NPCM is not set # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_REALTEK is not set # CONFIG_ARCH_RENESAS is not set CONFIG_ARCH_ROCKCHIP=y # CONFIG_ARCH_SEATTLE is not set # CONFIG_ARCH_INTEL_SOCFPGA is not set # CONFIG_ARCH_SYNQUACER is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_SPRD is not set # CONFIG_ARCH_THUNDER is not set # CONFIG_ARCH_THUNDER2 is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_VISCONTI is not set # CONFIG_ARCH_XGENE is not set # CONFIG_ARCH_ZYNQMP is not set # end of Platform selection # # Kernel Features # # # ARM errata workarounds via the alternatives framework # # CONFIG_AMPERE_ERRATUM_AC03_CPU_38 is not set CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y CONFIG_ARM64_ERRATUM_826319=y CONFIG_ARM64_ERRATUM_827319=y CONFIG_ARM64_ERRATUM_824069=y CONFIG_ARM64_ERRATUM_819472=y # CONFIG_ARM64_ERRATUM_832075 is not set CONFIG_ARM64_ERRATUM_1742098=y CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y # CONFIG_ARM64_ERRATUM_1024718 is not set # CONFIG_ARM64_ERRATUM_1418040 is not set CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y # CONFIG_ARM64_ERRATUM_1165522 is not set CONFIG_ARM64_ERRATUM_1319367=y # CONFIG_ARM64_ERRATUM_1530923 is not set # CONFIG_ARM64_ERRATUM_2441007 is not set # CONFIG_ARM64_ERRATUM_1286807 is not set # CONFIG_ARM64_ERRATUM_1463225 is not set # CONFIG_ARM64_ERRATUM_1542419 is not set # CONFIG_ARM64_ERRATUM_1508412 is not set # CONFIG_ARM64_ERRATUM_2051678 is not set # CONFIG_ARM64_ERRATUM_2077057 is not set # CONFIG_ARM64_ERRATUM_2658417 is not set # CONFIG_ARM64_ERRATUM_2054223 is not set # CONFIG_ARM64_ERRATUM_2067961 is not set # CONFIG_ARM64_ERRATUM_2441009 is not set # CONFIG_ARM64_ERRATUM_2966298 is not set # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set # CONFIG_CAVIUM_ERRATUM_27456 is not set # CONFIG_CAVIUM_ERRATUM_30115 is not set # CONFIG_CAVIUM_TX2_ERRATUM_219 is not set # CONFIG_FUJITSU_ERRATUM_010001 is not set # CONFIG_HISILICON_ERRATUM_161600802 is not set # CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set # CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set # CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set # CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set # CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set # CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set # end of ARM errata workarounds via the alternatives framework CONFIG_ARM64_4K_PAGES=y # CONFIG_ARM64_16K_PAGES is not set # CONFIG_ARM64_64K_PAGES is not set # CONFIG_ARM64_VA_BITS_39 is not set CONFIG_ARM64_VA_BITS_48=y CONFIG_ARM64_VA_BITS=48 CONFIG_ARM64_PA_BITS_48=y CONFIG_ARM64_PA_BITS=48 # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_CPU_LITTLE_ENDIAN=y CONFIG_SCHED_MC=y # CONFIG_SCHED_CLUSTER is not set # CONFIG_SCHED_SMT is not set CONFIG_NR_CPUS=6 CONFIG_HOTPLUG_CPU=y # CONFIG_NUMA is not set # CONFIG_HZ_100 is not set # CONFIG_HZ_250 is not set CONFIG_HZ_300=y # CONFIG_HZ_1000 is not set CONFIG_HZ=300 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_HW_PERF_EVENTS=y CONFIG_CC_HAVE_SHADOW_CALL_STACK=y # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_KEXEC is not set # CONFIG_KEXEC_FILE is not set # CONFIG_CRASH_DUMP is not set # CONFIG_XEN is not set CONFIG_ARCH_FORCE_MAX_ORDER=11 CONFIG_UNMAP_KERNEL_AT_EL0=y CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y CONFIG_RODATA_FULL_DEFAULT_ENABLED=y # CONFIG_ARM64_SW_TTBR0_PAN is not set CONFIG_ARM64_TAGGED_ADDR_ABI=y CONFIG_COMPAT=y CONFIG_KUSER_HELPERS=y # CONFIG_COMPAT_ALIGNMENT_FIXUPS is not set # CONFIG_ARMV8_DEPRECATED is not set # # ARMv8.1 architectural features # # CONFIG_ARM64_HW_AFDBM is not set # CONFIG_ARM64_PAN is not set CONFIG_AS_HAS_LDAPR=y CONFIG_AS_HAS_LSE_ATOMICS=y # CONFIG_ARM64_USE_LSE_ATOMICS is not set # end of ARMv8.1 architectural features # # ARMv8.2 architectural features # CONFIG_AS_HAS_ARMV8_2=y CONFIG_AS_HAS_SHA3=y # CONFIG_ARM64_PMEM is not set # CONFIG_ARM64_RAS_EXTN is not set # CONFIG_ARM64_CNP is not set # end of ARMv8.2 architectural features # # ARMv8.3 architectural features # # CONFIG_ARM64_PTR_AUTH is not set CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y CONFIG_AS_HAS_PAC=y CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y # end of ARMv8.3 architectural features # # ARMv8.4 architectural features # # CONFIG_ARM64_AMU_EXTN is not set CONFIG_AS_HAS_ARMV8_4=y # CONFIG_ARM64_TLB_RANGE is not set # end of ARMv8.4 architectural features # # ARMv8.5 architectural features # CONFIG_AS_HAS_ARMV8_5=y # CONFIG_ARM64_BTI is not set CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y # CONFIG_ARM64_E0PD is not set CONFIG_ARM64_AS_HAS_MTE=y # end of ARMv8.5 architectural features # # ARMv8.7 architectural features # # end of ARMv8.7 architectural features CONFIG_ARM64_SVE=y CONFIG_ARM64_SME=y CONFIG_ARM64_MODULE_PLTS=y # CONFIG_ARM64_PSEUDO_NMI is not set CONFIG_RELOCATABLE=y # CONFIG_RANDOMIZE_BASE is not set CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y CONFIG_STACKPROTECTOR_PER_TASK=y CONFIG_ARCH_NR_GPIO=0 # end of Kernel Features # # Boot options # CONFIG_CMDLINE="" # CONFIG_EFI is not set # end of Boot options # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_USERSPACE_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y # CONFIG_PM_DEBUG is not set CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y CONFIG_PM_GENERIC_DOMAINS_SLEEP=y CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y # end of Power management options # # CPU Power Management # # # CPU Idle # 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 CONFIG_DT_IDLE_GENPD=y # # ARM CPU Idle Drivers # CONFIG_ARM_PSCI_CPUIDLE=y CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y # end of ARM CPU Idle Drivers # end of CPU Idle # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=m CONFIG_CPU_FREQ_GOV_USERSPACE=m CONFIG_CPU_FREQ_GOV_ONDEMAND=y CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y CONFIG_CPUFREQ_DT_PLATDEV=y CONFIG_ARM_SCPI_CPUFREQ=y # end of CPU Frequency scaling # end of CPU Power Management CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set # # General architecture-dependent options # # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_HAVE_IOREMAP_PROT=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_KEEPINITRD=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y CONFIG_MMU_GATHER_TABLE_FREE=y CONFIG_MMU_GATHER_RCU_TABLE_FREE=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y # CONFIG_SHADOW_CALL_STACK is not set CONFIG_ARCH_SUPPORTS_LTO_CLANG=y CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y CONFIG_LTO_NONE=y CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=18 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y CONFIG_RANDOMIZE_KSTACK_OFFSET=y # CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_COMPILER_H=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_HAS_RELR=y CONFIG_HAVE_PREEMPT_DYNAMIC=y CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_GZIP is not set # CONFIG_MODULE_COMPRESS_XZ is not set # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y # CONFIG_BLOCK_LEGACY_AUTOLOAD is not set CONFIG_BLK_CGROUP_RWSTAT=y CONFIG_BLK_DEV_BSG_COMMON=y # CONFIG_BLK_DEV_BSGLIB is not set # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_DEV_THROTTLING_LOW is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_CGROUP_IOLATENCY is not set # CONFIG_BLK_CGROUP_FC_APPID is not set # CONFIG_BLK_CGROUP_IOCOST is not set # CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set CONFIG_LDM_PARTITION=y # CONFIG_LDM_DEBUG is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set # end of Partition Types CONFIG_BLOCK_COMPAT=y CONFIG_BLK_MQ_PCI=y CONFIG_BLK_MQ_VIRTIO=y CONFIG_BLK_PM=y CONFIG_BLOCK_HOLDER_DEPRECATED=y CONFIG_BLK_MQ_STACKING=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y # CONFIG_IOSCHED_BFQ is not set # end of IO Schedulers CONFIG_ASN1=y CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y CONFIG_ARCH_INLINE_SPIN_LOCK=y CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_SPIN_UNLOCK=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y CONFIG_ARCH_INLINE_READ_LOCK=y CONFIG_ARCH_INLINE_READ_LOCK_BH=y CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_READ_UNLOCK=y CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y CONFIG_ARCH_INLINE_WRITE_LOCK=y CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_WRITE_UNLOCK=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y CONFIG_INLINE_SPIN_TRYLOCK=y CONFIG_INLINE_SPIN_TRYLOCK_BH=y CONFIG_INLINE_SPIN_LOCK=y CONFIG_INLINE_SPIN_LOCK_BH=y CONFIG_INLINE_SPIN_LOCK_IRQ=y CONFIG_INLINE_SPIN_LOCK_IRQSAVE=y CONFIG_INLINE_SPIN_UNLOCK_BH=y CONFIG_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE=y CONFIG_INLINE_READ_LOCK=y CONFIG_INLINE_READ_LOCK_BH=y CONFIG_INLINE_READ_LOCK_IRQ=y CONFIG_INLINE_READ_LOCK_IRQSAVE=y CONFIG_INLINE_READ_UNLOCK=y CONFIG_INLINE_READ_UNLOCK_BH=y CONFIG_INLINE_READ_UNLOCK_IRQ=y CONFIG_INLINE_READ_UNLOCK_IRQRESTORE=y CONFIG_INLINE_WRITE_LOCK=y CONFIG_INLINE_WRITE_LOCK_BH=y CONFIG_INLINE_WRITE_LOCK_IRQ=y CONFIG_INLINE_WRITE_LOCK_IRQSAVE=y CONFIG_INLINE_WRITE_UNLOCK=y CONFIG_INLINE_WRITE_UNLOCK_BH=y CONFIG_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y CONFIG_QUEUED_SPINLOCKS=y CONFIG_ARCH_USE_QUEUED_RWLOCKS=y CONFIG_QUEUED_RWLOCKS=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ARCH_BINFMT_ELF_STATE=y CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y CONFIG_ARCH_HAVE_ELF_PROT=y CONFIG_ARCH_USE_GNU_PROPERTY=y CONFIG_ELFCORE=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set CONFIG_BINFMT_SCRIPT=y # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # CONFIG_SWAP=y # CONFIG_ZSWAP is not set # # SLAB allocator options # # CONFIG_SLAB is not set CONFIG_SLUB=y CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y # end of SLAB allocator options # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set # CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y CONFIG_ARCH_KEEP_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_EXCLUSIVE_SYSTEM_RAM=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_MEMORY_BALLOON=y CONFIG_BALLOON_COMPACTION=y CONFIG_COMPACTION=y CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 CONFIG_PAGE_REPORTING=y CONFIG_MIGRATION=y CONFIG_ARCH_ENABLE_THP_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_KSM=y CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y CONFIG_MEMORY_FAILURE=y # CONFIG_HWPOISON_INJECT is not set CONFIG_ARCH_WANTS_THP_SWAP=y CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set CONFIG_THP_SWAP=y # CONFIG_READ_ONLY_THP_FOR_FS is not set CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set # CONFIG_CMA_DEBUGFS is not set # CONFIG_CMA_SYSFS is not set CONFIG_CMA_AREAS=7 CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y CONFIG_ZONE_DMA=y CONFIG_ZONE_DMA32=y CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y CONFIG_SECRETMEM=y # CONFIG_ANON_VMA_NAME is not set # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set CONFIG_LOCK_MM_AND_FIND_VMA=y # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y CONFIG_NET_INGRESS=y CONFIG_NET_EGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_INTERFACE is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_ESP=y # CONFIG_NET_KEY is not set # CONFIG_XDP_SOCKETS is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=m # CONFIG_IP_MROUTE is not set # CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set CONFIG_INET_ESP=y # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=m CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_INET_UDP_DIAG is not set # CONFIG_INET_RAW_DIAG is not set # CONFIG_INET_DIAG_DESTROY is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_IPV6_VTI is not set CONFIG_IPV6_SIT=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set CONFIG_IPV6_FOU=m # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set # CONFIG_NETLABEL is not set # CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NET_PTP_CLASSIFY=y # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_EGRESS=y CONFIG_NETFILTER_FAMILY_BRIDGE=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set # CONFIG_NETFILTER_NETLINK_LOG is not set # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=m CONFIG_NF_LOG_SYSLOG=m # CONFIG_NF_CONNTRACK_MARK is not set # CONFIG_NF_CONNTRACK_ZONES is not set CONFIG_NF_CONNTRACK_PROCFS=y CONFIG_NF_CONNTRACK_EVENTS=y # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set # CONFIG_NF_CONNTRACK_IRC is not set # CONFIG_NF_CONNTRACK_NETBIOS_NS is not set # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set # CONFIG_NF_CONNTRACK_SIP is not set CONFIG_NF_CONNTRACK_TFTP=m # CONFIG_NF_CT_NETLINK is not set CONFIG_NF_NAT=m 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 CONFIG_NETFILTER_XTABLES_COMPAT=y # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set CONFIG_NETFILTER_XT_TARGET_LOG=m # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set CONFIG_NETFILTER_XT_MATCH_IPVS=m # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_NETFILTER_XT_MATCH_OWNER is not set # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set # CONFIG_NETFILTER_XT_MATCH_STATE is not set # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set CONFIG_IP_VS=m # CONFIG_IP_VS_IPV6 is not set # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # CONFIG_IP_VS_PROTO_ESP is not set # CONFIG_IP_VS_PROTO_AH is not set # CONFIG_IP_VS_PROTO_SCTP is not set # # IPVS scheduler # CONFIG_IP_VS_RR=m # CONFIG_IP_VS_WRR is not set # CONFIG_IP_VS_LC is not set # CONFIG_IP_VS_WLC is not set # CONFIG_IP_VS_FO is not set # CONFIG_IP_VS_OVF is not set # CONFIG_IP_VS_LBLC is not set # CONFIG_IP_VS_LBLCR is not set # CONFIG_IP_VS_DH is not set # CONFIG_IP_VS_SH is not set # CONFIG_IP_VS_MH is not set # CONFIG_IP_VS_SED is not set # CONFIG_IP_VS_NQ is not set # CONFIG_IP_VS_TWOS is not set # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS MH scheduler # CONFIG_IP_VS_MH_TAB_INDEX=12 # # IPVS application helper # # CONFIG_IP_VS_FTP is not set CONFIG_IP_VS_NFCT=y # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set CONFIG_NF_LOG_IPV4=m CONFIG_NF_REJECT_IPV4=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_SECURITY is not set # CONFIG_IP_NF_ARPTABLES is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m CONFIG_NF_LOG_IPV6=m CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_MATCH_SRH is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set # CONFIG_IP6_NF_SECURITY is not set CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m # CONFIG_IP6_NF_TARGET_NPT is not set # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_CONNTRACK_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y # CONFIG_BRIDGE_MRP is not set # CONFIG_BRIDGE_CFM is not set # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set # CONFIG_NET_SCH_FQ_CODEL is not set # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set # CONFIG_NET_SCH_DEFAULT is not set # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_FLOW is not set CONFIG_NET_CLS_CGROUP=m # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set CONFIG_NET_L3_MASTER_DEV=y # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_STREAM_PARSER is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # end of Network testing # end of Networking options # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=m CONFIG_BT_BREDR=y # CONFIG_BT_RFCOMM is not set # CONFIG_BT_BNEP is not set CONFIG_BT_HIDP=m # CONFIG_BT_HS is not set # CONFIG_BT_LE is not set CONFIG_BT_LEDS=y # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set # CONFIG_BT_DEBUGFS is not set # CONFIG_BT_SELFTEST is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_QCA=m CONFIG_BT_MTK=m CONFIG_BT_HCIBTUSB=m # CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set CONFIG_BT_HCIBTUSB_BCM=y # CONFIG_BT_HCIBTUSB_MTK is not set 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 is not set # CONFIG_BT_HCIUART_ATH3K is not set # CONFIG_BT_HCIUART_LL is not set CONFIG_BT_HCIUART_3WIRE=y # CONFIG_BT_HCIUART_INTEL is not set CONFIG_BT_HCIUART_BCM=y CONFIG_BT_HCIUART_RTL=y CONFIG_BT_HCIUART_QCA=y CONFIG_BT_HCIUART_AG6XX=y CONFIG_BT_HCIUART_MRVL=y CONFIG_BT_HCIBCM203X=m CONFIG_BT_HCIBPA10X=m CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIVHCI=m CONFIG_BT_MRVL=m CONFIG_BT_MRVL_SDIO=m CONFIG_BT_ATH3K=m # CONFIG_BT_MTKSDIO is not set CONFIG_BT_MTKUART=m CONFIG_BT_HCIRSI=m # CONFIG_BT_VIRTIO is not set # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_SPY=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set CONFIG_CFG80211_CRDA_SUPPORT=y CONFIG_CFG80211_WEXT=y CONFIG_LIB80211=m CONFIG_LIB80211_CRYPT_WEP=m CONFIG_LIB80211_CRYPT_CCMP=m # CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=m CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y CONFIG_RFKILL_GPIO=m # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_PAGE_POOL=y # CONFIG_PAGE_POOL_STATS is not set CONFIG_FAILOVER=y CONFIG_ETHTOOL_NETLINK=y # # Device Drivers # CONFIG_ARM_AMBA=y CONFIG_HAVE_PCI=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y CONFIG_PCI_DOMAINS_GENERIC=y CONFIG_PCI_SYSCALL=y # CONFIG_PCIEPORTBUS is not set CONFIG_PCIEASPM=y CONFIG_PCIEASPM_DEFAULT=y # CONFIG_PCIEASPM_POWERSAVE is not set # CONFIG_PCIEASPM_POWER_SUPERSAVE is not set # CONFIG_PCIEASPM_PERFORMANCE is not set # CONFIG_PCIE_PTM is not set CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y CONFIG_PCI_QUIRKS=y # CONFIG_PCI_DEBUG is not set # CONFIG_PCI_STUB is not set # CONFIG_PCI_IOV is not set # CONFIG_PCI_PRI is not set # CONFIG_PCI_PASID is not set CONFIG_VGA_ARB=y CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # # PCI controller drivers # # CONFIG_PCI_FTPCI100 is not set # CONFIG_PCI_HOST_GENERIC is not set # CONFIG_PCIE_XILINX is not set # CONFIG_PCI_XGENE is not set # CONFIG_PCIE_ALTERA is not set # CONFIG_PCI_HOST_THUNDER_PEM is not set # CONFIG_PCI_HOST_THUNDER_ECAM is not set CONFIG_PCIE_ROCKCHIP=y CONFIG_PCIE_ROCKCHIP_HOST=y # CONFIG_PCIE_MICROCHIP_HOST is not set # # DesignWare PCI Core Support # # CONFIG_PCIE_DW_PLAT_HOST is not set # CONFIG_PCI_HISI is not set # CONFIG_PCIE_ROCKCHIP_DW_HOST is not set # CONFIG_PCIE_KIRIN is not set # CONFIG_PCI_MESON is not set # CONFIG_PCIE_AL is not set # end of DesignWare PCI Core Support # # Mobiveil PCIe Core Support # # end of Mobiveil PCIe Core Support # # Cadence PCIe controllers support # # CONFIG_PCIE_CADENCE_PLAT_HOST is not set # CONFIG_PCI_J721E_HOST is not set # end of Cadence PCIe controllers support # end of PCI controller drivers # # PCI Endpoint # # CONFIG_PCI_ENDPOINT is not set # end of PCI Endpoint # # PCI switch controller drivers # # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers # CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set # # Generic Driver Options # # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y # CONFIG_DEVTMPFS_SAFE is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set CONFIG_FW_CACHE=y # CONFIG_FW_UPLOAD is not set # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y CONFIG_ALLOW_DEV_COREDUMP=y CONFIG_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_SOC_BUS=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set CONFIG_GENERIC_ARCH_TOPOLOGY=y # end of Generic Driver Options # # Bus devices # # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_MOXTET is not set # CONFIG_VEXPRESS_CONFIG is not set # CONFIG_MHI_BUS is not set # CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # # CONFIG_ARM_SCMI_PROTOCOL is not set # end of ARM System Control and Management Interface Protocol CONFIG_ARM_SCPI_PROTOCOL=y CONFIG_ARM_SCPI_POWER_DOMAIN=y # CONFIG_FW_CFG_SYSFS is not set # CONFIG_ARM_FFA_TRANSPORT is not set # CONFIG_GOOGLE_FIRMWARE is not set CONFIG_ARM_PSCI_FW=y # CONFIG_ARM_PSCI_CHECKER is not set CONFIG_HAVE_ARM_SMCCC=y CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y CONFIG_ARM_SMCCC_SOC_ID=y # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set CONFIG_MTD=y # CONFIG_MTD_TESTS is not set # # Partition parsers # # CONFIG_MTD_AR7_PARTS is not set # CONFIG_MTD_CMDLINE_PARTS is not set CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AFS_PARTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set # end of Partition parsers # # User Modules And Translation Layers # CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y # # Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK. # # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # CONFIG_RFD_FTL is not set # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set # CONFIG_MTD_OOPS is not set # CONFIG_MTD_SWAP is not set # CONFIG_MTD_PARTITIONED_MASTER is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # end of RAM/ROM/Flash chip drivers # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_INTEL_VR_NOR is not set # CONFIG_MTD_PLATRAM is not set # end of Mapping drivers for chip access # # Self-contained MTD device drivers # # CONFIG_MTD_PMC551 is not set # CONFIG_MTD_DATAFLASH is not set # CONFIG_MTD_MCHP23K256 is not set # CONFIG_MTD_MCHP48L640 is not set # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLOCK2MTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOCG3 is not set # end of Self-contained MTD device drivers # # NAND # # CONFIG_MTD_ONENAND is not set # CONFIG_MTD_RAW_NAND is not set # CONFIG_MTD_SPI_NAND is not set # # ECC engine support # # CONFIG_MTD_NAND_ECC_SW_HAMMING is not set # CONFIG_MTD_NAND_ECC_SW_BCH is not set # CONFIG_MTD_NAND_ECC_MXIC is not set # end of ECC engine support # end of NAND # # LPDDR & LPDDR2 PCM memory drivers # # CONFIG_MTD_LPDDR is not set # end of LPDDR & LPDDR2 PCM memory drivers CONFIG_MTD_SPI_NOR=y CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y # CONFIG_MTD_SPI_NOR_SWP_DISABLE is not set CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y # CONFIG_MTD_SPI_NOR_SWP_KEEP is not set # CONFIG_MTD_UBI is not set # CONFIG_MTD_HYPERBUS is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_DYNAMIC=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_RESERVED_MEM=y CONFIG_OF_RESOLVE=y CONFIG_OF_OVERLAY=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_DRBD is not set CONFIG_BLK_DEV_NBD=m # CONFIG_BLK_DEV_RAM is not set # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set CONFIG_VIRTIO_BLK=y # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_UBLK is not set # # NVME Support # CONFIG_NVME_CORE=y CONFIG_BLK_DEV_NVME=y CONFIG_NVME_MULTIPATH=y # CONFIG_NVME_VERBOSE_ERRORS is not set # CONFIG_NVME_HWMON is not set CONFIG_NVME_FABRICS=m CONFIG_NVME_FC=m # CONFIG_NVME_TCP is not set # CONFIG_NVME_AUTH is not set CONFIG_NVME_TARGET=m # CONFIG_NVME_TARGET_PASSTHRU is not set CONFIG_NVME_TARGET_LOOP=m CONFIG_NVME_TARGET_FC=m # CONFIG_NVME_TARGET_FCLOOP is not set # CONFIG_NVME_TARGET_TCP is not set # CONFIG_NVME_TARGET_AUTH is not set # end of NVME Support # # Misc devices # # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_PHANTOM is not set # CONFIG_TIFM_CORE is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HI6421V600_IRQ is not set # CONFIG_HP_ILO is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set CONFIG_SRAM=y # CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set # CONFIG_HISI_HIKEY_USB is not set # CONFIG_OPEN_DICE is not set # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set CONFIG_EEPROM_AT25=m # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # CONFIG_CB710_CORE is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set CONFIG_ALTERA_STAPL=m # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set # CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set # CONFIG_PVPANIC is not set # CONFIG_GP_PCI1XXXX is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=m CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_SCAN_ASYNC is not set # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_CXGB3_ISCSI is not set # CONFIG_SCSI_CXGB4_ISCSI is not set # CONFIG_SCSI_BNX2_ISCSI is not set # CONFIG_BE2ISCSI is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_HPSA is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_3W_SAS is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_HISI_SAS is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set # CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set # CONFIG_SCSI_MPI3MR is not set # CONFIG_SCSI_SMARTPQI is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_MYRB is not set # CONFIG_SCSI_MYRS is not set # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FDOMAIN_PCI is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_STEX is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_IPR is not set # CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLA_ISCSI is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_AM53C974 is not set # CONFIG_SCSI_WD719X is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_PMCRAID is not set # CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_VIRTIO is not set # CONFIG_SCSI_DH is not set # end of SCSI device support CONFIG_ATA=m CONFIG_SATA_HOST=y CONFIG_ATA_VERBOSE_ERROR=y CONFIG_ATA_FORCE=y CONFIG_SATA_PMP=y # # Controllers with non-SFF native interface # CONFIG_SATA_AHCI=m CONFIG_SATA_MOBILE_LPM_POLICY=0 # CONFIG_SATA_AHCI_PLATFORM is not set # CONFIG_AHCI_DWC is not set # CONFIG_AHCI_CEVA is not set # CONFIG_AHCI_QORIQ is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set CONFIG_ATA_SFF=y # # SFF controllers with custom DMA interface # # CONFIG_PDC_ADMA is not set # CONFIG_SATA_QSTOR is not set # CONFIG_SATA_SX4 is not set CONFIG_ATA_BMDMA=y # # SATA SFF controllers with BMDMA # # CONFIG_ATA_PIIX is not set # CONFIG_SATA_DWC is not set # CONFIG_SATA_MV is not set # CONFIG_SATA_NV is not set # CONFIG_SATA_PROMISE is not set # CONFIG_SATA_SIL is not set # CONFIG_SATA_SIS is not set # CONFIG_SATA_SVW is not set # CONFIG_SATA_ULI is not set # CONFIG_SATA_VIA is not set # CONFIG_SATA_VITESSE is not set # # PATA SFF controllers with BMDMA # # CONFIG_PATA_ALI is not set # CONFIG_PATA_AMD is not set # CONFIG_PATA_ARTOP is not set # CONFIG_PATA_ATIIXP is not set # CONFIG_PATA_ATP867X is not set # CONFIG_PATA_CMD64X is not set # CONFIG_PATA_CYPRESS is not set # CONFIG_PATA_EFAR is not set # CONFIG_PATA_HPT366 is not set # CONFIG_PATA_HPT37X is not set # CONFIG_PATA_HPT3X2N is not set # CONFIG_PATA_HPT3X3 is not set # CONFIG_PATA_IT8213 is not set # CONFIG_PATA_IT821X is not set # CONFIG_PATA_JMICRON is not set # CONFIG_PATA_MARVELL is not set # CONFIG_PATA_NETCELL is not set # CONFIG_PATA_NINJA32 is not set # CONFIG_PATA_NS87415 is not set # CONFIG_PATA_OLDPIIX is not set # CONFIG_PATA_OPTIDMA is not set # CONFIG_PATA_PDC2027X is not set # CONFIG_PATA_PDC_OLD is not set # CONFIG_PATA_RADISYS is not set # CONFIG_PATA_RDC is not set # CONFIG_PATA_SCH is not set # CONFIG_PATA_SERVERWORKS is not set # CONFIG_PATA_SIL680 is not set # CONFIG_PATA_SIS is not set # CONFIG_PATA_TOSHIBA is not set # CONFIG_PATA_TRIFLEX is not set # CONFIG_PATA_VIA is not set # CONFIG_PATA_WINBOND is not set # # PIO-only SFF controllers # # CONFIG_PATA_CMD640_PCI is not set # CONFIG_PATA_MPIIX is not set # CONFIG_PATA_NS87410 is not set # CONFIG_PATA_OPTI is not set # CONFIG_PATA_OF_PLATFORM is not set # CONFIG_PATA_RZ1000 is not set # # Generic fallback / legacy drivers # # CONFIG_ATA_GENERIC is not set # CONFIG_PATA_LEGACY is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=m # CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m # CONFIG_DM_UNSTRIPED is not set # CONFIG_DM_CRYPT is not set # CONFIG_DM_SNAPSHOT is not set CONFIG_DM_THIN_PROVISIONING=m # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_EBS is not set # CONFIG_DM_ERA is not set # CONFIG_DM_CLONE is not set # CONFIG_DM_MIRROR is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_DUST is not set # CONFIG_DM_UEVENT is not set # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_DM_INTEGRITY is not set # CONFIG_TARGET_CORE is not set # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # # CONFIG_FIREWIRE is not set # CONFIG_FIREWIRE_NOSY is not set # end of IEEE 1394 (FireWire) support CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set CONFIG_DUMMY=m CONFIG_WIREGUARD=m # CONFIG_WIREGUARD_DEBUG is not set # CONFIG_EQUALIZER is not set # CONFIG_NET_FC is not set # 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 # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_AMT is not set # CONFIG_MACSEC is not set # CONFIG_NETCONSOLE is not set CONFIG_TUN=m CONFIG_TAP=m # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m CONFIG_VIRTIO_NET=y CONFIG_NLMON=m # CONFIG_ARCNET is not set CONFIG_ETHERNET=y CONFIG_NET_VENDOR_3COM=y # CONFIG_VORTEX is not set # CONFIG_TYPHOON is not set CONFIG_NET_VENDOR_ADAPTEC=y # CONFIG_ADAPTEC_STARFIRE is not set CONFIG_NET_VENDOR_AGERE=y # CONFIG_ET131X is not set # CONFIG_NET_VENDOR_ALACRITECH is not set CONFIG_NET_VENDOR_ALTEON=y # CONFIG_ACENIC is not set # CONFIG_ALTERA_TSE is not set # CONFIG_NET_VENDOR_AMAZON is not set # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set # CONFIG_NET_VENDOR_ASIX is not set CONFIG_NET_VENDOR_ATHEROS=y # CONFIG_ATL2 is not set # CONFIG_ATL1 is not set # CONFIG_ATL1E is not set # CONFIG_ATL1C is not set # CONFIG_ALX is not set # CONFIG_NET_VENDOR_BROADCOM is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set CONFIG_NET_VENDOR_CHELSIO=y # CONFIG_CHELSIO_T1 is not set # CONFIG_CHELSIO_T3 is not set # CONFIG_CHELSIO_T4 is not set # CONFIG_CHELSIO_T4VF is not set CONFIG_NET_VENDOR_CISCO=y # CONFIG_ENIC is not set # CONFIG_NET_VENDOR_CORTINA is not set # CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set CONFIG_NET_VENDOR_DEC=y # CONFIG_NET_TULIP is not set CONFIG_NET_VENDOR_DLINK=y # CONFIG_DL2K is not set # CONFIG_SUNDANCE is not set CONFIG_NET_VENDOR_EMULEX=y # CONFIG_BE2NET is not set # CONFIG_NET_VENDOR_ENGLEDER is not set # CONFIG_NET_VENDOR_EZCHIP is not set # CONFIG_NET_VENDOR_FUNGIBLE is not set CONFIG_NET_VENDOR_GOOGLE=y # CONFIG_GVE is not set # CONFIG_NET_VENDOR_HISILICON is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_INTEL is not set # CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_JME is not set # CONFIG_NET_VENDOR_ADI is not set # CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set # CONFIG_NET_VENDOR_MICROSOFT is not set CONFIG_NET_VENDOR_MYRI=y # CONFIG_MYRI10GE is not set # CONFIG_FEALNX is not set # CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set CONFIG_NET_VENDOR_NETERION=y # CONFIG_S2IO is not set # CONFIG_NET_VENDOR_NETRONOME is not set CONFIG_NET_VENDOR_NVIDIA=y # CONFIG_FORCEDETH is not set CONFIG_NET_VENDOR_OKI=y # CONFIG_ETHOC is not set CONFIG_NET_VENDOR_PACKET_ENGINES=y # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_NET_VENDOR_PENSANDO is not set CONFIG_NET_VENDOR_QLOGIC=y # CONFIG_QLA3XXX is not set # CONFIG_QLCNIC is not set # CONFIG_NETXEN_NIC is not set # CONFIG_QED is not set CONFIG_NET_VENDOR_BROCADE=y # CONFIG_BNA is not set # CONFIG_NET_VENDOR_QUALCOMM is not set CONFIG_NET_VENDOR_RDC=y # CONFIG_R6040 is not set CONFIG_NET_VENDOR_REALTEK=y # CONFIG_8139CP is not set # CONFIG_8139TOO is not set # CONFIG_R8169 is not set # CONFIG_NET_VENDOR_RENESAS is not set # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set CONFIG_NET_VENDOR_SILAN=y # CONFIG_SC92031 is not set CONFIG_NET_VENDOR_SIS=y # CONFIG_SIS900 is not set # CONFIG_SIS190 is not set # CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=y # CONFIG_STMMAC_SELFTESTS is not set CONFIG_STMMAC_PLATFORM=y CONFIG_DWMAC_DWC_QOS_ETH=y CONFIG_DWMAC_GENERIC=y CONFIG_DWMAC_ROCKCHIP=y # CONFIG_DWMAC_INTEL_PLAT is not set # CONFIG_DWMAC_LOONGSON is not set # CONFIG_STMMAC_PCI is not set CONFIG_NET_VENDOR_SUN=y # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set # CONFIG_CASSINI is not set # CONFIG_NIU is not set # CONFIG_NET_VENDOR_SYNOPSYS is not set CONFIG_NET_VENDOR_TEHUTI=y # CONFIG_TEHUTI is not set CONFIG_NET_VENDOR_TI=y # CONFIG_TI_CPSW_PHY_SEL is not set # CONFIG_TLAN is not set # CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set CONFIG_PHYLINK=y CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_SFP is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_ADIN_PHY is not set # CONFIG_ADIN1100_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=m # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM54140_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set # CONFIG_MAXLINEAR_GPHY is not set # CONFIG_MEDIATEK_GE_PHY is not set # CONFIG_MICREL_PHY is not set CONFIG_MICROCHIP_PHY=m # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set # CONFIG_MOTORCOMM_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_QSEMI_PHY is not set CONFIG_REALTEK_PHY=y # CONFIG_RENESAS_PHY is not set CONFIG_ROCKCHIP_PHY=y CONFIG_SMSC_PHY=m # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_DP83TD510_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set # CONFIG_PSE_CONTROLLER is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_OF_MDIO=y CONFIG_MDIO_DEVRES=y CONFIG_MDIO_BITBANG=y # CONFIG_MDIO_BCM_UNIMAC is not set CONFIG_MDIO_GPIO=y # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_OCTEON is not set # CONFIG_MDIO_IPQ4019 is not set # CONFIG_MDIO_IPQ8064 is not set # CONFIG_MDIO_THUNDER is not set # # MDIO Multiplexers # CONFIG_MDIO_BUS_MUX=y CONFIG_MDIO_BUS_MUX_GPIO=y CONFIG_MDIO_BUS_MUX_MULTIPLEXER=y CONFIG_MDIO_BUS_MUX_MMIOREG=y # # PCS device drivers # CONFIG_PCS_XPCS=y # end of PCS device drivers # CONFIG_PPP is not set # CONFIG_SLIP is not set CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set CONFIG_USB_PEGASUS=m CONFIG_USB_RTL8150=m CONFIG_USB_RTL8152=m CONFIG_USB_LAN78XX=m CONFIG_USB_USBNET=m CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_AX88179_178A=m CONFIG_USB_NET_CDCETHER=m # CONFIG_USB_NET_CDC_EEM is not set CONFIG_USB_NET_CDC_NCM=m # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set CONFIG_USB_NET_DM9601=m # CONFIG_USB_NET_SR9700 is not set CONFIG_USB_NET_SR9800=m CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=m # CONFIG_USB_NET_GL620A is not set CONFIG_USB_NET_NET1080=m CONFIG_USB_NET_PLUSB=m CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m CONFIG_USB_NET_CDC_SUBSET_ENABLE=m CONFIG_USB_NET_CDC_SUBSET=m # CONFIG_USB_ALI_M5632 is not set # CONFIG_USB_AN2720 is not set CONFIG_USB_BELKIN=y CONFIG_USB_ARMLINUX=y # CONFIG_USB_EPSON2888 is not set # CONFIG_USB_KC2190 is not set CONFIG_USB_NET_ZAURUS=m # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set # CONFIG_USB_HSO is not set # CONFIG_USB_NET_INT51X1 is not set # CONFIG_USB_IPHETH is not set # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y # CONFIG_ADM8211 is not set CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set # CONFIG_ATH5K is not set # CONFIG_ATH5K_PCI is not set CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m CONFIG_ATH9K_PCI=y # CONFIG_ATH9K_AHB is not set # CONFIG_ATH9K_DEBUGFS is not set # CONFIG_ATH9K_DYNACK is not set # CONFIG_ATH9K_WOW is not set CONFIG_ATH9K_RFKILL=y CONFIG_ATH9K_CHANNEL_CONTEXT=y CONFIG_ATH9K_PCOEM=y # CONFIG_ATH9K_PCI_NO_EEPROM is not set CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_ATH9K_HWRNG=y CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y CONFIG_CARL9170_HWRNG=y CONFIG_ATH6KL=m # CONFIG_ATH6KL_SDIO is not set CONFIG_ATH6KL_USB=m # CONFIG_ATH6KL_DEBUG is not set CONFIG_AR5523=m # CONFIG_WIL6210 is not set CONFIG_ATH10K=m CONFIG_ATH10K_CE=y CONFIG_ATH10K_PCI=m # CONFIG_ATH10K_AHB is not set # CONFIG_ATH10K_SDIO is not set CONFIG_ATH10K_USB=m # CONFIG_ATH10K_DEBUG is not set # CONFIG_ATH10K_DEBUGFS is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set CONFIG_WLAN_VENDOR_ATMEL=y # CONFIG_ATMEL is not set CONFIG_AT76C50X_USB=m CONFIG_WLAN_VENDOR_BROADCOM=y CONFIG_B43=m CONFIG_B43_BCMA=y CONFIG_B43_SSB=y CONFIG_B43_BUSES_BCMA_AND_SSB=y # CONFIG_B43_BUSES_BCMA is not set # CONFIG_B43_BUSES_SSB is not set CONFIG_B43_PCI_AUTOSELECT=y CONFIG_B43_PCICORE_AUTOSELECT=y # CONFIG_B43_SDIO is not set CONFIG_B43_BCMA_PIO=y CONFIG_B43_PIO=y CONFIG_B43_PHY_G=y CONFIG_B43_PHY_N=y CONFIG_B43_PHY_LP=y CONFIG_B43_PHY_HT=y CONFIG_B43_LEDS=y CONFIG_B43_HWRNG=y # CONFIG_B43_DEBUG is not set # CONFIG_B43LEGACY is not set CONFIG_BRCMUTIL=m # CONFIG_BRCMSMAC is not set CONFIG_BRCMFMAC=m CONFIG_BRCMFMAC_PROTO_BCDC=y CONFIG_BRCMFMAC_PROTO_MSGBUF=y CONFIG_BRCMFMAC_SDIO=y CONFIG_BRCMFMAC_USB=y CONFIG_BRCMFMAC_PCIE=y # CONFIG_BRCM_TRACING is not set # CONFIG_BRCMDBG is not set CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y # CONFIG_IPW2100 is not set # CONFIG_IPW2200 is not set CONFIG_IWLEGACY=m CONFIG_IWL4965=m # CONFIG_IWL3945 is not set # # iwl3945 / iwl4965 Debugging Options # # CONFIG_IWLEGACY_DEBUG is not set # end of iwl3945 / iwl4965 Debugging Options CONFIG_IWLWIFI=m CONFIG_IWLWIFI_LEDS=y CONFIG_IWLDVM=m CONFIG_IWLMVM=m CONFIG_IWLWIFI_OPMODE_MODULAR=y # # Debugging Options # # CONFIG_IWLWIFI_DEBUG is not set # end of Debugging Options CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_HOSTAP is not set # CONFIG_HERMES is not set CONFIG_P54_COMMON=m CONFIG_P54_USB=m # CONFIG_P54_PCI is not set # CONFIG_P54_SPI is not set CONFIG_P54_LEDS=y CONFIG_WLAN_VENDOR_MARVELL=y CONFIG_LIBERTAS=m CONFIG_LIBERTAS_USB=m # CONFIG_LIBERTAS_SDIO is not set # CONFIG_LIBERTAS_SPI is not set # CONFIG_LIBERTAS_DEBUG is not set # CONFIG_LIBERTAS_MESH is not set CONFIG_LIBERTAS_THINFIRM=m # CONFIG_LIBERTAS_THINFIRM_DEBUG is not set CONFIG_LIBERTAS_THINFIRM_USB=m CONFIG_MWIFIEX=m # CONFIG_MWIFIEX_SDIO is not set CONFIG_MWIFIEX_PCIE=m CONFIG_MWIFIEX_USB=m # CONFIG_MWL8K is not set CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m CONFIG_MT76_CORE=m CONFIG_MT76_LEDS=y CONFIG_MT76_USB=m CONFIG_MT76_SDIO=m CONFIG_MT76x02_LIB=m CONFIG_MT76x02_USB=m CONFIG_MT76_CONNAC_LIB=m CONFIG_MT76x0_COMMON=m CONFIG_MT76x0U=m CONFIG_MT76x0E=m CONFIG_MT76x2_COMMON=m CONFIG_MT76x2E=m CONFIG_MT76x2U=m CONFIG_MT7603E=m CONFIG_MT7615_COMMON=m CONFIG_MT7615E=m CONFIG_MT7663_USB_SDIO_COMMON=m CONFIG_MT7663U=m CONFIG_MT7663S=m CONFIG_MT7915E=m # CONFIG_MT7921E is not set # CONFIG_MT7921S is not set # CONFIG_MT7921U is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set # CONFIG_WLAN_VENDOR_PURELIFI is not set CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m # CONFIG_RT2400PCI is not set # CONFIG_RT2500PCI is not set # CONFIG_RT61PCI is not set # CONFIG_RT2800PCI is not set CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WLAN_VENDOR_REALTEK=y # CONFIG_RTL8180 is not set CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y CONFIG_RTL_CARDS=m # CONFIG_RTL8192CE is not set # CONFIG_RTL8192SE is not set # CONFIG_RTL8192DE is not set # CONFIG_RTL8723AE is not set # CONFIG_RTL8723BE is not set # CONFIG_RTL8188EE is not set # CONFIG_RTL8192EE is not set # CONFIG_RTL8821AE is not set # CONFIG_RTL8192CU is not set CONFIG_RTL8XXXU=m CONFIG_RTL8XXXU_UNTESTED=y CONFIG_RTW88=m CONFIG_RTW88_CORE=m CONFIG_RTW88_PCI=m CONFIG_RTW88_USB=m CONFIG_RTW88_8822B=m CONFIG_RTW88_8822C=m CONFIG_RTW88_8723D=m CONFIG_RTW88_8821C=m CONFIG_RTW88_8822BE=m # CONFIG_RTW88_8822BS is not set CONFIG_RTW88_8822BU=m CONFIG_RTW88_8822CE=m # CONFIG_RTW88_8822CS is not set CONFIG_RTW88_8822CU=m CONFIG_RTW88_8723DE=m CONFIG_RTW88_8723DU=m CONFIG_RTW88_8821CE=m # CONFIG_RTW88_8821CS is not set CONFIG_RTW88_8821CU=m # CONFIG_RTW88_DEBUG is not set # CONFIG_RTW88_DEBUGFS is not set # CONFIG_RTW89 is not set CONFIG_WLAN_VENDOR_RSI=y CONFIG_RSI_91X=m # CONFIG_RSI_DEBUGFS is not set # CONFIG_RSI_SDIO is not set CONFIG_RSI_USB=m CONFIG_RSI_COEX=y # CONFIG_WLAN_VENDOR_SILABS is not set CONFIG_WLAN_VENDOR_ST=y # CONFIG_CW1200 is not set CONFIG_WLAN_VENDOR_TI=y # CONFIG_WL1251 is not set CONFIG_WL12XX=m CONFIG_WL18XX=m CONFIG_WLCORE=m # CONFIG_WLCORE_SPI is not set # CONFIG_WLCORE_SDIO is not set CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_USB_ZD1201=m CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set CONFIG_WLAN_VENDOR_QUANTENNA=y # CONFIG_QTNFMAC_PCIE is not set # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN # CONFIG_VMXNET3 is not set # CONFIG_NETDEVSIM is not set CONFIG_NET_FAILOVER=y # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_SPARSEKMAP is not set CONFIG_INPUT_MATRIXKMAP=y # # Userland interfaces # # CONFIG_INPUT_MOUSEDEV is not set CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADC is not set # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set # CONFIG_KEYBOARD_ATKBD is not set # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=y # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_PINEPHONE is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set # CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADC is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set CONFIG_JOYSTICK_GF2K=m # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set CONFIG_JOYSTICK_IFORCE=m CONFIG_JOYSTICK_IFORCE_USB=m # CONFIG_JOYSTICK_IFORCE_232 is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y # CONFIG_JOYSTICK_PSXPAD_SPI is not set # CONFIG_JOYSTICK_PXRC is not set # CONFIG_JOYSTICK_QWIIC is not set # CONFIG_JOYSTICK_FSIA6B is not set # CONFIG_JOYSTICK_SENSEHAT is not set # CONFIG_INPUT_TABLET is not set # CONFIG_INPUT_TOUCHSCREEN is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set CONFIG_INPUT_RK805_PWRKEY=y # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_RMI4_CORE is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_SERIO_SERPORT=m CONFIG_SERIO_AMBAKMI=y # CONFIG_SERIO_PCIPS2 is not set CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_SERIO_GPIO_PS2 is not set # CONFIG_USERIO is not set CONFIG_GAMEPORT=m # CONFIG_GAMEPORT_NS558 is not set # CONFIG_GAMEPORT_L4 is not set # CONFIG_GAMEPORT_EMU10K1 is not set # CONFIG_GAMEPORT_FM801 is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y # CONFIG_SERIAL_8250_16550A_VARIANTS is not set # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_DMA=y CONFIG_SERIAL_8250_PCI=y CONFIG_SERIAL_8250_EXAR=y CONFIG_SERIAL_8250_NR_UARTS=5 CONFIG_SERIAL_8250_RUNTIME_UARTS=5 CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_MANY_PORTS=y CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_RSA is not set CONFIG_SERIAL_8250_DWLIB=y CONFIG_SERIAL_8250_FSL=y CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_PERICOM is not set CONFIG_SERIAL_OF_PLATFORM=y # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set # CONFIG_SERIAL_AMBA_PL011 is not set # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_SIFIVE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set CONFIG_SERIAL_XILINX_PS_UART=y CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_RP2 is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set CONFIG_HVC_DRIVER=y # CONFIG_HVC_DCC is not set CONFIG_SERIAL_DEV_BUS=y CONFIG_SERIAL_DEV_CTRL_TTYPORT=y CONFIG_VIRTIO_CONSOLE=y # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=m # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_BA431 is not set # CONFIG_HW_RANDOM_VIRTIO is not set CONFIG_HW_RANDOM_OPTEE=m # CONFIG_HW_RANDOM_CCTRNG is not set # CONFIG_HW_RANDOM_XIPHERA is not set CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=m # CONFIG_HW_RANDOM_CN10K is not set # CONFIG_APPLICOM is not set CONFIG_DEVMEM=y CONFIG_DEVPORT=y # CONFIG_TCG_TPM is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_GPMUX is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set CONFIG_I2C_MUX_PCA954x=y CONFIG_I2C_MUX_PINCTRL=y # CONFIG_I2C_MUX_REG is not set CONFIG_I2C_DEMUX_PINCTRL=y # CONFIG_I2C_MUX_MLXCPLD is not set # end of Multiplexer I2C Chip support CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # PC SMBus host controller drivers # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_ISCH is not set # CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_NVIDIA_GPU is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CADENCE is not set # CONFIG_I2C_CBUS_GPIO is not set CONFIG_I2C_DESIGNWARE_CORE=y # CONFIG_I2C_DESIGNWARE_SLAVE is not set CONFIG_I2C_DESIGNWARE_PLATFORM=y # CONFIG_I2C_DESIGNWARE_PCI is not set # CONFIG_I2C_EMEV2 is not set CONFIG_I2C_GPIO=m # CONFIG_I2C_GPIO_FAULT_INJECTOR is not set # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set CONFIG_I2C_RK3X=y # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_THUNDERX is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_PCI1XXXX is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y CONFIG_SPI_MEM=y # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set CONFIG_SPI_BITBANG=m # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_CADENCE_QUADSPI is not set # CONFIG_SPI_CADENCE_XSPI is not set # CONFIG_SPI_DESIGNWARE is not set # CONFIG_SPI_NXP_FLEXSPI is not set CONFIG_SPI_GPIO=m # CONFIG_SPI_FSL_SPI is not set # CONFIG_SPI_MICROCHIP_CORE is not set # CONFIG_SPI_MICROCHIP_CORE_QSPI is not set # CONFIG_SPI_OC_TINY is not set CONFIG_SPI_PL022=y # CONFIG_SPI_PXA2XX is not set CONFIG_SPI_ROCKCHIP=m # CONFIG_SPI_ROCKCHIP_SFC is not set # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_SIFIVE is not set # CONFIG_SPI_MXIC is not set # CONFIG_SPI_THUNDERX is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_AMD is not set # # SPI Multiplexer support # # CONFIG_SPI_MUX is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=m # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set CONFIG_SPI_DYNAMIC=y CONFIG_SPMI=y # CONFIG_SPMI_HISI3670 is not set # CONFIG_HSI is not set CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # # CONFIG_PTP_1588_CLOCK_KVM is not set # CONFIG_PTP_1588_CLOCK_IDT82P33 is not set # CONFIG_PTP_1588_CLOCK_IDTCM is not set # CONFIG_PTP_1588_CLOCK_OCP is not set # end of PTP clock support CONFIG_PINCTRL=y CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_CY8C95X0 is not set CONFIG_PINCTRL_MAX77620=y # CONFIG_PINCTRL_MCP23S08 is not set # CONFIG_PINCTRL_MICROCHIP_SGPIO is not set # CONFIG_PINCTRL_OCELOT is not set CONFIG_PINCTRL_RK805=y CONFIG_PINCTRL_ROCKCHIP=y # CONFIG_PINCTRL_SINGLE is not set # CONFIG_PINCTRL_STMFX is not set # CONFIG_PINCTRL_SX150X is not set # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_CDEV=y CONFIG_GPIO_CDEV_V1=y CONFIG_GPIO_GENERIC=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_CADENCE is not set CONFIG_GPIO_DWAPB=y # CONFIG_GPIO_EXAR is not set # CONFIG_GPIO_FTGPIO010 is not set # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HLWD is not set # CONFIG_GPIO_LOGICVC is not set # CONFIG_GPIO_MB86S7X is not set CONFIG_GPIO_PL061=y CONFIG_GPIO_ROCKCHIP=y # CONFIG_GPIO_SIFIVE is not set CONFIG_GPIO_SYSCON=y # CONFIG_GPIO_XGENE is not set # CONFIG_GPIO_XILINX is not set # CONFIG_GPIO_AMD_FCH is not set # end of Memory mapped GPIO drivers # # I2C GPIO expanders # # 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 CONFIG_GPIO_PCA953X_IRQ=y # CONFIG_GPIO_PCA9570 is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # CONFIG_GPIO_MAX77620=y # end of MFD GPIO expanders # # PCI GPIO expanders # # CONFIG_GPIO_BT8XX is not set # CONFIG_GPIO_PCI_IDIO_16 is not set # CONFIG_GPIO_PCIE_IDIO_24 is not set # CONFIG_GPIO_RDC321X is not set # end of PCI GPIO expanders # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # end of SPI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_VIRTIO is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers # CONFIG_W1 is not set CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_BRCMSTB is not set # CONFIG_POWER_RESET_GPIO is not set # CONFIG_POWER_RESET_GPIO_RESTART is not set # CONFIG_POWER_RESET_LTC2952 is not set CONFIG_POWER_RESET_REGULATOR=y # CONFIG_POWER_RESET_RESTART is not set # CONFIG_POWER_RESET_XGENE is not set CONFIG_POWER_RESET_SYSCON=y # CONFIG_POWER_RESET_SYSCON_POWEROFF is not set CONFIG_REBOOT_MODE=y CONFIG_SYSCON_REBOOT_MODE=y # CONFIG_NVMEM_REBOOT_MODE is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set # CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_RK817 is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_UCS1002 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set CONFIG_SENSORS_ARM_SCPI=y # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DRIVETEMP is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_I5K_AMB is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_GPIO_FAN is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IIO_HWMON is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX31730 is not set # CONFIG_SENSORS_MAX31760 is not set # CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set CONFIG_SENSORS_LM90=m # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_NZXT_KRAKEN2 is not set # CONFIG_SENSORS_NZXT_SMART2 is not set # CONFIG_SENSORS_OCC_P8_I2C is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set CONFIG_SENSORS_PWM_FAN=m # CONFIG_SENSORS_SBTSI is not set # CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set CONFIG_SENSORS_INA2XX=m # CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_VT8231 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y # CONFIG_THERMAL_WRITABLE_TRIPS is not set CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set CONFIG_CPU_THERMAL=y CONFIG_CPU_FREQ_THERMAL=y CONFIG_DEVFREQ_THERMAL=y CONFIG_THERMAL_EMULATION=y # CONFIG_THERMAL_MMIO is not set # CONFIG_MAX77620_THERMAL is not set CONFIG_ROCKCHIP_THERMAL=y # CONFIG_GENERIC_ADC_THERMAL is not set CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 # CONFIG_WATCHDOG_SYSFS is not set # CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_ARM_SBSA_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set CONFIG_DW_WATCHDOG=y # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_MAX77620_WATCHDOG is not set # CONFIG_ARM_SMC_WATCHDOG is not set # CONFIG_ALIM7101_WDT is not set # CONFIG_I6300ESB_WDT is not set # CONFIG_HP_WATCHDOG is not set # CONFIG_MEN_A21_WDT is not set # # PCI-based Watchdog Cards # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y CONFIG_SSB=m CONFIG_SSB_SPROM=y CONFIG_SSB_BLOCKIO=y CONFIG_SSB_PCIHOST_POSSIBLE=y CONFIG_SSB_PCIHOST=y CONFIG_SSB_B43_PCI_BRIDGE=y CONFIG_SSB_SDIOHOST_POSSIBLE=y # CONFIG_SSB_SDIOHOST is not set CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y CONFIG_SSB_DRIVER_PCICORE=y # CONFIG_SSB_DRIVER_GPIO is not set CONFIG_BCMA_POSSIBLE=y CONFIG_BCMA=m CONFIG_BCMA_BLOCKIO=y CONFIG_BCMA_HOST_PCI_POSSIBLE=y CONFIG_BCMA_HOST_PCI=y # CONFIG_BCMA_HOST_SOC is not set CONFIG_BCMA_DRIVER_PCI=y # CONFIG_BCMA_DRIVER_GMAC_CMN is not set # CONFIG_BCMA_DRIVER_GPIO is not set # CONFIG_BCMA_DEBUG is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_GATEWORKS_GSC is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_MFD_HI6421_SPMI is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set CONFIG_MFD_MAX77620=y # CONFIG_MFD_MAX77650 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77714 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_OCELOT is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_CPCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_NTXEC is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set CONFIG_MFD_RK808=y # CONFIG_MFD_RN5T618 is not set CONFIG_MFD_SEC_CORE=y # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set CONFIG_MFD_WL1273_CORE=m # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TC3589X is not set # CONFIG_MFD_TQMX86 is not set # CONFIG_MFD_VX855 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 # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ROHM_BD718XX is not set # CONFIG_MFD_ROHM_BD71828 is not set # CONFIG_MFD_ROHM_BD957XMUF is not set # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_MFD_KHADAS_MCU is not set # CONFIG_MFD_QCOM_PM8008 is not set # CONFIG_RAVE_SP_CORE is not set # CONFIG_MFD_INTEL_M10_BMC is not set # CONFIG_MFD_RSMU_I2C is not set # CONFIG_MFD_RSMU_SPI is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_DA9121 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set CONFIG_REGULATOR_FAN53555=y # CONFIG_REGULATOR_FAN53880 is not set CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX77620 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MAX20086 is not set # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MCP16502 is not set # CONFIG_REGULATOR_MP5416 is not set CONFIG_REGULATOR_MP8859=y # CONFIG_REGULATOR_MP886X is not set # CONFIG_REGULATOR_MPQ7920 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_MT6315 is not set # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PF8X00 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set CONFIG_REGULATOR_PWM=y # CONFIG_REGULATOR_QCOM_SPMI is not set # CONFIG_REGULATOR_QCOM_USB_VBUS is not set # CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set CONFIG_REGULATOR_RK808=y # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set # CONFIG_REGULATOR_S2MPA01 is not set # CONFIG_REGULATOR_S2MPS11 is not set # CONFIG_REGULATOR_S5M8767 is not set # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_SY8106A is not set # CONFIG_REGULATOR_SY8824X is not set # CONFIG_REGULATOR_SY8827N is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS6286X is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_VCTRL is not set # CONFIG_REGULATOR_QCOM_LABIBB is not set CONFIG_RC_CORE=y CONFIG_BPF_LIRC_MODE2=y CONFIG_LIRC=y CONFIG_RC_MAP=m CONFIG_RC_DECODERS=y CONFIG_IR_IMON_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_MCE_KBD_DECODER=m CONFIG_IR_NEC_DECODER=m CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m CONFIG_IR_RCMM_DECODER=m CONFIG_IR_SANYO_DECODER=m CONFIG_IR_SHARP_DECODER=m CONFIG_IR_SONY_DECODER=m CONFIG_IR_XMP_DECODER=m CONFIG_RC_DEVICES=y CONFIG_IR_GPIO_CIR=m CONFIG_IR_GPIO_TX=m CONFIG_IR_HIX5HD2=m CONFIG_IR_IGORPLUGUSB=m CONFIG_IR_IGUANA=m CONFIG_IR_IMON=m CONFIG_IR_IMON_RAW=m CONFIG_IR_MCEUSB=m CONFIG_IR_PWM_TX=m CONFIG_IR_REDRAT3=m CONFIG_IR_SERIAL=m # CONFIG_IR_SERIAL_TRANSMITTER is not set CONFIG_IR_SPI=m CONFIG_IR_STREAMZAP=m CONFIG_IR_TOY=m CONFIG_IR_TTUSBIR=m CONFIG_RC_ATI_REMOTE=m # CONFIG_RC_LOOPBACK is not set CONFIG_RC_XBOX_DVD=m CONFIG_CEC_CORE=y CONFIG_CEC_NOTIFIER=y # # CEC support # # CONFIG_MEDIA_CEC_RC is not set CONFIG_MEDIA_CEC_SUPPORT=y # CONFIG_CEC_CH7322 is not set CONFIG_USB_PULSE8_CEC=m CONFIG_USB_RAINSHADOW_CEC=m # end of CEC support CONFIG_MEDIA_SUPPORT=y CONFIG_MEDIA_SUPPORT_FILTER=y CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y CONFIG_MEDIA_RADIO_SUPPORT=y # CONFIG_MEDIA_SDR_SUPPORT is not set CONFIG_MEDIA_PLATFORM_SUPPORT=y # CONFIG_MEDIA_TEST_SUPPORT is not set # end of Media device types CONFIG_VIDEO_DEV=y CONFIG_MEDIA_CONTROLLER=y CONFIG_DVB_CORE=y # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y CONFIG_VIDEO_V4L2_SUBDEV_API=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_VIDEO_TUNER=m CONFIG_V4L2_H264=m CONFIG_V4L2_VP9=m CONFIG_V4L2_MEM2MEM_DEV=m CONFIG_V4L2_FLASH_LED_CLASS=m CONFIG_V4L2_FWNODE=y CONFIG_V4L2_ASYNC=y CONFIG_VIDEOBUF_GEN=m CONFIG_VIDEOBUF_DMA_SG=m CONFIG_VIDEOBUF_VMALLOC=m # end of Video4Linux options # # Media controller options # CONFIG_MEDIA_CONTROLLER_DVB=y CONFIG_MEDIA_CONTROLLER_REQUEST_API=y # end of Media controller options # # Digital TV options # # CONFIG_DVB_MMAP is not set CONFIG_DVB_NET=y CONFIG_DVB_MAX_ADAPTERS=16 # CONFIG_DVB_DYNAMIC_MINORS is not set # CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set # CONFIG_DVB_ULE_DEBUG is not set # end of Digital TV options # # Media drivers # # # Drivers filtered as selected at 'Filter media drivers' # # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_USB_S2255 is not set # CONFIG_VIDEO_USBTV is not set # CONFIG_USB_VIDEO_CLASS is not set # # Analog TV USB devices # CONFIG_VIDEO_GO7007=m CONFIG_VIDEO_GO7007_USB=m CONFIG_VIDEO_GO7007_LOADER=m CONFIG_VIDEO_GO7007_USB_S2250_BOARD=m CONFIG_VIDEO_HDPVR=m CONFIG_VIDEO_PVRUSB2=m CONFIG_VIDEO_PVRUSB2_SYSFS=y CONFIG_VIDEO_PVRUSB2_DVB=y # CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set CONFIG_VIDEO_STK1160_COMMON=m CONFIG_VIDEO_STK1160=m # # Analog/digital TV USB devices # CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_AU0828_V4L2=y CONFIG_VIDEO_AU0828_RC=y CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y CONFIG_VIDEO_CX231XX_ALSA=m CONFIG_VIDEO_CX231XX_DVB=m # # Digital TV USB devices # CONFIG_DVB_AS102=m CONFIG_DVB_B2C2_FLEXCOP_USB=m # CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set CONFIG_DVB_USB_V2=m CONFIG_DVB_USB_AF9015=m CONFIG_DVB_USB_AF9035=m CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_AZ6007=m CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_DVBSKY=m CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_GL861=m CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m CONFIG_DVB_USB_ZD1301=m CONFIG_DVB_USB=m # CONFIG_DVB_USB_DEBUG is not set CONFIG_DVB_USB_A800=m CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_CXUSB=m CONFIG_DVB_USB_CXUSB_ANALOG=y CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_DIB3000MC=m CONFIG_DVB_USB_DIBUSB_MB=m CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y CONFIG_DVB_USB_DIBUSB_MC=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_DTT200U=m CONFIG_DVB_USB_DTV5100=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_GP8PSK=m CONFIG_DVB_USB_M920X=m CONFIG_DVB_USB_NOVA_T_USB2=m CONFIG_DVB_USB_OPERA1=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_TTUSB2=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_VP7045=m CONFIG_SMS_USB_DRV=m # CONFIG_DVB_TTUSB_BUDGET is not set # CONFIG_DVB_TTUSB_DEC is not set # # Webcam, TV (analog/digital) USB devices # CONFIG_VIDEO_EM28XX=m CONFIG_VIDEO_EM28XX_V4L2=m CONFIG_VIDEO_EM28XX_ALSA=m CONFIG_VIDEO_EM28XX_DVB=m CONFIG_VIDEO_EM28XX_RC=m CONFIG_MEDIA_PCI_SUPPORT=y # # Media capture support # # CONFIG_VIDEO_SOLO6X10 is not set # CONFIG_VIDEO_TW5864 is not set # CONFIG_VIDEO_TW68 is not set # CONFIG_VIDEO_TW686X is not set # CONFIG_VIDEO_ZORAN is not set # # Media capture/analog TV support # # CONFIG_VIDEO_DT3155 is not set # CONFIG_VIDEO_IVTV is not set # # Media capture/analog/hybrid TV support # # CONFIG_VIDEO_BT848 is not set # CONFIG_VIDEO_CX18 is not set CONFIG_VIDEO_CX23885=m CONFIG_MEDIA_ALTERA_CI=m CONFIG_VIDEO_CX25821=m CONFIG_VIDEO_CX25821_ALSA=m # CONFIG_VIDEO_CX88 is not set # CONFIG_VIDEO_SAA7134 is not set CONFIG_VIDEO_SAA7164=m # # Media digital TV PCI Adapters # # CONFIG_DVB_B2C2_FLEXCOP_PCI is not set CONFIG_DVB_DDBRIDGE=m # CONFIG_DVB_DDBRIDGE_MSIENABLE is not set # CONFIG_DVB_DM1105 is not set CONFIG_MANTIS_CORE=m # CONFIG_DVB_MANTIS is not set # CONFIG_DVB_HOPPER is not set CONFIG_DVB_NETUP_UNIDVB=m CONFIG_DVB_NGENE=m # CONFIG_DVB_PLUTO2 is not set # CONFIG_DVB_PT1 is not set CONFIG_DVB_PT3=m CONFIG_DVB_SMIPCIE=m CONFIG_RADIO_ADAPTERS=y # CONFIG_RADIO_MAXIRADIO is not set CONFIG_RADIO_SAA7706H=m CONFIG_RADIO_SHARK=m CONFIG_RADIO_SHARK2=m CONFIG_RADIO_SI4713=m CONFIG_RADIO_TEA575X=m CONFIG_RADIO_TEA5764=m CONFIG_RADIO_TEF6862=m CONFIG_RADIO_WL1273=m CONFIG_USB_DSBR=m CONFIG_USB_KEENE=m CONFIG_USB_MA901=m CONFIG_USB_MR800=m CONFIG_USB_RAREMONO=m CONFIG_RADIO_SI470X=m CONFIG_USB_SI470X=m CONFIG_I2C_SI470X=m CONFIG_USB_SI4713=m CONFIG_PLATFORM_SI4713=m CONFIG_I2C_SI4713=m CONFIG_MEDIA_PLATFORM_DRIVERS=y CONFIG_V4L_PLATFORM_DRIVERS=y # CONFIG_DVB_PLATFORM_DRIVERS is not set CONFIG_V4L_MEM2MEM_DRIVERS=y # CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set # CONFIG_VIDEO_MUX is not set # # Allegro DVT media platform drivers # # # Amlogic media platform drivers # # # Amphion drivers # # # Aspeed media platform drivers # # CONFIG_VIDEO_ASPEED is not set # # Atmel media platform drivers # # # Cadence media platform drivers # # CONFIG_VIDEO_CADENCE_CSI2RX is not set # CONFIG_VIDEO_CADENCE_CSI2TX is not set # # Chips&Media media platform drivers # # # Intel media platform drivers # # # Marvell media platform drivers # # CONFIG_VIDEO_CAFE_CCIC is not set # # Mediatek media platform drivers # # # NVidia media platform drivers # # # NXP media platform drivers # # # Qualcomm media platform drivers # # # Renesas media platform drivers # # # Rockchip media platform drivers # CONFIG_VIDEO_ROCKCHIP_IEP=m CONFIG_VIDEO_ROCKCHIP_RGA=m CONFIG_VIDEO_ROCKCHIP_ISP1=m # # Samsung media platform drivers # # # STMicroelectronics media platform drivers # # # Sunxi media platform drivers # # # Texas Instruments drivers # # # Verisilicon media platform drivers # CONFIG_VIDEO_HANTRO=m CONFIG_VIDEO_HANTRO_ROCKCHIP=y # # VIA media platform drivers # # # Xilinx media platform drivers # # CONFIG_VIDEO_XILINX is not set # # MMC/SDIO DVB adapters # # CONFIG_SMS_SDIO_DRV is not set CONFIG_MEDIA_COMMON_OPTIONS=y # # common driver options # CONFIG_CYPRESS_FIRMWARE=m CONFIG_TTPCI_EEPROM=m CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_SMS_SIANO_MDTV=m CONFIG_SMS_SIANO_RC=y CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_DMA_CONTIG=m CONFIG_VIDEOBUF2_VMALLOC=m CONFIG_VIDEOBUF2_DMA_SG=m CONFIG_VIDEOBUF2_DVB=m # end of Media drivers CONFIG_MEDIA_HIDE_ANCILLARY_SUBDRV=y # # Media ancillary drivers # CONFIG_MEDIA_ATTACH=y # # IR I2C driver auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_IR_I2C=y CONFIG_VIDEO_CAMERA_SENSOR=y # CONFIG_VIDEO_AR0521 is not set # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_HI846 is not set # CONFIG_VIDEO_HI847 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_IMX412 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set CONFIG_VIDEO_MT9V011=m # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set CONFIG_VIDEO_OV2640=m # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5693 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV7251 is not set CONFIG_VIDEO_OV7640=m # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9282 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_M5MOLS is not set # # Lens drivers # # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # audio, video and radio I2C drivers auto-selected by 'Autoselect ancillary drivers' # CONFIG_VIDEO_CS3308=m CONFIG_VIDEO_CS53L32A=m CONFIG_VIDEO_MSP3400=m CONFIG_VIDEO_SONY_BTF_MPX=m CONFIG_VIDEO_UDA1342=m CONFIG_VIDEO_WM8775=m CONFIG_VIDEO_SAA711X=m CONFIG_VIDEO_TVP5150=m CONFIG_VIDEO_TW2804=m CONFIG_VIDEO_TW9903=m CONFIG_VIDEO_TW9906=m # # Video and audio decoders # CONFIG_VIDEO_CX25840=m # # SPI I2C drivers auto-selected by 'Autoselect ancillary drivers' # # # Media SPI Adapters # # CONFIG_CXD2880_SPI_DRV is not set # CONFIG_VIDEO_GS1662 is not set # end of Media SPI Adapters CONFIG_MEDIA_TUNER=y # # Tuner drivers auto-selected by 'Autoselect ancillary drivers' # CONFIG_MEDIA_TUNER_E4000=m CONFIG_MEDIA_TUNER_FC0011=m CONFIG_MEDIA_TUNER_FC0012=m CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_FC2580=m CONFIG_MEDIA_TUNER_IT913X=m CONFIG_MEDIA_TUNER_M88RS6000T=m CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_MC44S803=y CONFIG_MEDIA_TUNER_MT2060=m CONFIG_MEDIA_TUNER_MT2063=m CONFIG_MEDIA_TUNER_MT20XX=y CONFIG_MEDIA_TUNER_MT2131=m CONFIG_MEDIA_TUNER_MT2266=m CONFIG_MEDIA_TUNER_MXL301RF=m CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m CONFIG_MEDIA_TUNER_QM1D1C0042=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_R820T=m CONFIG_MEDIA_TUNER_SI2157=m CONFIG_MEDIA_TUNER_SIMPLE=y CONFIG_MEDIA_TUNER_TDA18212=m CONFIG_MEDIA_TUNER_TDA18218=m CONFIG_MEDIA_TUNER_TDA18250=m CONFIG_MEDIA_TUNER_TDA18271=y CONFIG_MEDIA_TUNER_TDA827X=y CONFIG_MEDIA_TUNER_TDA8290=y CONFIG_MEDIA_TUNER_TDA9887=y CONFIG_MEDIA_TUNER_TEA5761=y CONFIG_MEDIA_TUNER_TEA5767=y CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_MEDIA_TUNER_XC2028=y CONFIG_MEDIA_TUNER_XC4000=y CONFIG_MEDIA_TUNER_XC5000=y # # DVB Frontend drivers auto-selected by 'Autoselect ancillary drivers' # # # Multistandard (satellite) frontends # CONFIG_DVB_M88DS3103=m CONFIG_DVB_MXL5XX=m CONFIG_DVB_STB0899=m CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m CONFIG_DVB_STV0910=m CONFIG_DVB_STV6110x=m CONFIG_DVB_STV6111=m # # Multistandard (cable + terrestrial) frontends # CONFIG_DVB_DRXK=m CONFIG_DVB_MN88472=m CONFIG_DVB_MN88473=m CONFIG_DVB_SI2165=m CONFIG_DVB_TDA18271C2DD=m # # DVB-S (satellite) frontends # CONFIG_DVB_CX24116=m CONFIG_DVB_CX24117=m CONFIG_DVB_CX24120=m CONFIG_DVB_CX24123=m CONFIG_DVB_DS3000=m CONFIG_DVB_MT312=m CONFIG_DVB_S5H1420=m CONFIG_DVB_SI21XX=m CONFIG_DVB_STB6000=m CONFIG_DVB_STV0288=m CONFIG_DVB_STV0299=m CONFIG_DVB_STV0900=m CONFIG_DVB_STV6110=m CONFIG_DVB_TDA10071=m CONFIG_DVB_TDA10086=m CONFIG_DVB_TDA8083=m CONFIG_DVB_TDA826X=m CONFIG_DVB_TS2020=m CONFIG_DVB_TUNER_CX24113=m CONFIG_DVB_TUNER_ITD1000=m CONFIG_DVB_VES1X93=m CONFIG_DVB_ZL10039=m # # DVB-T (terrestrial) frontends # CONFIG_DVB_AF9013=m CONFIG_DVB_AS102_FE=m CONFIG_DVB_CX22702=m CONFIG_DVB_CXD2820R=m CONFIG_DVB_CXD2841ER=m CONFIG_DVB_DIB3000MB=m CONFIG_DVB_DIB3000MC=m CONFIG_DVB_DIB7000M=m CONFIG_DVB_DIB7000P=m CONFIG_DVB_DRXD=m CONFIG_DVB_EC100=m CONFIG_DVB_GP8PSK_FE=m CONFIG_DVB_L64781=m CONFIG_DVB_MT352=m CONFIG_DVB_NXT6000=m CONFIG_DVB_RTL2830=m CONFIG_DVB_RTL2832=m CONFIG_DVB_SI2168=m CONFIG_DVB_STV0367=m CONFIG_DVB_TDA10048=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_ZD1301_DEMOD=m CONFIG_DVB_ZL10353=m # # DVB-C (cable) frontends # CONFIG_DVB_STV0297=m CONFIG_DVB_TDA10023=m CONFIG_DVB_VES1820=m # # ATSC (North American/Korean Terrestrial/Cable DTV) frontends # CONFIG_DVB_AU8522=m CONFIG_DVB_AU8522_DTV=m CONFIG_DVB_AU8522_V4L=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LG2160=m CONFIG_DVB_LGDT3305=m CONFIG_DVB_LGDT3306A=m CONFIG_DVB_LGDT330X=m CONFIG_DVB_MXL692=m CONFIG_DVB_NXT200X=m CONFIG_DVB_S5H1409=m CONFIG_DVB_S5H1411=m # # ISDB-T (terrestrial) frontends # CONFIG_DVB_DIB8000=m CONFIG_DVB_MB86A20S=m CONFIG_DVB_S921=m # # ISDB-S (satellite) & ISDB-T (terrestrial) frontends # CONFIG_DVB_TC90522=m # # Digital terrestrial only tuners/PLL # CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m CONFIG_DVB_TUNER_DIB0090=m # # SEC control devices for DVB-S # CONFIG_DVB_A8293=m CONFIG_DVB_AF9033=m CONFIG_DVB_ASCOT2E=m CONFIG_DVB_ATBM8830=m CONFIG_DVB_HELENE=m CONFIG_DVB_HORUS3A=m CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m CONFIG_DVB_IX2505V=m CONFIG_DVB_LGS8GXX=m CONFIG_DVB_LNBH25=m CONFIG_DVB_LNBP21=m CONFIG_DVB_LNBP22=m CONFIG_DVB_M88RS2000=m CONFIG_DVB_DRX39XYJ=m # # Common Interface (EN50221) controller drivers # CONFIG_DVB_CXD2099=m CONFIG_DVB_SP2=m # end of Media ancillary drivers # # Graphics support # CONFIG_DRM=y CONFIG_DRM_MIPI_DBI=y CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DEBUG_MM is not set CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_DP_AUX_BUS=y CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_DISPLAY_DP_HELPER=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_GEM_DMA_HELPER=y CONFIG_DRM_GEM_SHMEM_HELPER=y CONFIG_DRM_SCHED=y # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # end of I2C encoder or helper chips # # ARM devices # # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_KOMEDA is not set # end of ARM devices # CONFIG_DRM_RADEON is not set # CONFIG_DRM_AMDGPU is not set # CONFIG_DRM_NOUVEAU is not set # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set CONFIG_DRM_ROCKCHIP=y CONFIG_ROCKCHIP_VOP=y # CONFIG_ROCKCHIP_VOP2 is not set # CONFIG_ROCKCHIP_ANALOGIX_DP is not set # CONFIG_ROCKCHIP_CDN_DP is not set CONFIG_ROCKCHIP_DW_HDMI=y CONFIG_ROCKCHIP_DW_MIPI_DSI=y # CONFIG_ROCKCHIP_INNO_HDMI is not set # CONFIG_ROCKCHIP_LVDS is not set # CONFIG_ROCKCHIP_RGB is not set # CONFIG_ROCKCHIP_RK3066_HDMI is not set # CONFIG_DRM_VMWGFX is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_AST is not set # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_USE_LVDS is not set # CONFIG_DRM_RCAR_USE_MIPI_DSI is not set # CONFIG_DRM_QXL is not set # CONFIG_DRM_VIRTIO_GPU is not set CONFIG_DRM_PANEL=y # # Display Panels # CONFIG_DRM_PANEL_ABT_Y030XX067A=y CONFIG_DRM_PANEL_ARM_VERSATILE=y CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596=y CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0=y CONFIG_DRM_PANEL_BOE_HIMAX8279D=y CONFIG_DRM_PANEL_BOE_TV101WUM_NL6=y CONFIG_DRM_PANEL_DSI_CM=y # CONFIG_DRM_PANEL_LVDS is not set CONFIG_DRM_PANEL_SIMPLE=y # CONFIG_DRM_PANEL_EDP is not set CONFIG_DRM_PANEL_EBBG_FT8719=y CONFIG_DRM_PANEL_ELIDA_KD35T133=y CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02=y CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D=y CONFIG_DRM_PANEL_ILITEK_IL9322=y CONFIG_DRM_PANEL_ILITEK_ILI9341=y CONFIG_DRM_PANEL_ILITEK_ILI9881C=y CONFIG_DRM_PANEL_INNOLUX_EJ030NA=y CONFIG_DRM_PANEL_INNOLUX_P079ZCA=y CONFIG_DRM_PANEL_JDI_LT070ME05000=y CONFIG_DRM_PANEL_JDI_R63452=y CONFIG_DRM_PANEL_KHADAS_TS050=y CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04=y CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W=y CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829=y CONFIG_DRM_PANEL_SAMSUNG_LD9040=y CONFIG_DRM_PANEL_LG_LB035Q02=y CONFIG_DRM_PANEL_LG_LG4573=y CONFIG_DRM_PANEL_NEC_NL8048HL11=y CONFIG_DRM_PANEL_NEWVISION_NV3052C=y CONFIG_DRM_PANEL_NOVATEK_NT35510=y CONFIG_DRM_PANEL_NOVATEK_NT35560=y CONFIG_DRM_PANEL_NOVATEK_NT35950=y CONFIG_DRM_PANEL_NOVATEK_NT36672A=y CONFIG_DRM_PANEL_NOVATEK_NT39016=y CONFIG_DRM_PANEL_MANTIX_MLAF057WE51=y CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO=y CONFIG_DRM_PANEL_ORISETECH_OTM8009A=y CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS=y CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00=y CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=y CONFIG_DRM_PANEL_RAYDIUM_RM67191=y CONFIG_DRM_PANEL_RAYDIUM_RM68200=y CONFIG_DRM_PANEL_RONBO_RB070D30=y CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20=y CONFIG_DRM_PANEL_SAMSUNG_DB7430=y CONFIG_DRM_PANEL_SAMSUNG_S6D16D0=y CONFIG_DRM_PANEL_SAMSUNG_S6D27A1=y CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2=y CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03=y CONFIG_DRM_PANEL_SAMSUNG_S6E63M0=y # CONFIG_DRM_PANEL_SAMSUNG_S6E63M0_SPI is not set CONFIG_DRM_PANEL_SAMSUNG_S6E63M0_DSI=y # CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0=y CONFIG_DRM_PANEL_SAMSUNG_SOFEF00=y CONFIG_DRM_PANEL_SEIKO_43WVF1G=y CONFIG_DRM_PANEL_SHARP_LQ101R1SX01=y CONFIG_DRM_PANEL_SHARP_LS037V7DW01=y CONFIG_DRM_PANEL_SHARP_LS043T1LE01=y CONFIG_DRM_PANEL_SHARP_LS060T1SX01=y CONFIG_DRM_PANEL_SITRONIX_ST7701=y CONFIG_DRM_PANEL_SITRONIX_ST7703=y CONFIG_DRM_PANEL_SITRONIX_ST7789V=y CONFIG_DRM_PANEL_SONY_ACX565AKM=y CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521=y CONFIG_DRM_PANEL_TDO_TL070WSH30=y CONFIG_DRM_PANEL_TPO_TD028TTEC1=y CONFIG_DRM_PANEL_TPO_TD043MTEA1=y CONFIG_DRM_PANEL_TPO_TPG110=y CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA=y CONFIG_DRM_PANEL_VISIONOX_RM69299=y CONFIG_DRM_PANEL_WIDECHIPS_WS2401=y CONFIG_DRM_PANEL_XINPENG_XPP055C272=y # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set CONFIG_DRM_DISPLAY_CONNECTOR=y # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set # CONFIG_DRM_LONTIUM_LT9611 is not set # CONFIG_DRM_LONTIUM_LT9611UXC is not set # CONFIG_DRM_ITE_IT66121 is not set # CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NWL_MIPI_DSI is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_PARADE_PS8640 is not set # CONFIG_DRM_SIL_SII8620 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_SII9234 is not set # CONFIG_DRM_SIMPLE_BRIDGE is not set # CONFIG_DRM_THINE_THC63LVD1024 is not set # CONFIG_DRM_TOSHIBA_TC358762 is not set # CONFIG_DRM_TOSHIBA_TC358764 is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TOSHIBA_TC358768 is not set # CONFIG_DRM_TOSHIBA_TC358775 is not set # CONFIG_DRM_TI_DLPC3433 is not set # CONFIG_DRM_TI_TFP410 is not set # CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_ANALOGIX_ANX7625 is not set # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_CDNS_MHDP8546 is not set 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_GP_AUDIO is not set CONFIG_DRM_DW_HDMI_CEC=y CONFIG_DRM_DW_MIPI_DSI=y # end of Display Interface Bridges # CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_HISI_HIBMC is not set # CONFIG_DRM_HISI_KIRIN is not set # CONFIG_DRM_LOGICVC is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_BOCHS is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_PANEL_MIPI_DBI is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9163 is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set # CONFIG_TINYDRM_ILI9486 is not set # CONFIG_TINYDRM_MI0283QT is not set # CONFIG_TINYDRM_REPAPER is not set # CONFIG_TINYDRM_ST7586 is not set # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_LIMA is not set CONFIG_DRM_PANFROST=y # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_DRM_NOMODESET=y # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_I740 is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_S3 is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VT8623 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_ARK is not set # CONFIG_FB_PM3 is not set # CONFIG_FB_CARMINE is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # CONFIG_FB_SM712 is not set # end of Frame buffer Devices # # Backlight & LCD device support # # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_KTD253 is not set CONFIG_BACKLIGHT_PWM=y # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # CONFIG_BACKLIGHT_LED is not set # end of Backlight & LCD device support CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support # CONFIG_LOGO is not set # end of Graphics support CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y # CONFIG_SND_HRTIMER is not set # CONFIG_SND_DYNAMIC_MINORS is not set CONFIG_SND_SUPPORT_OLD_API=y CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_CTL_INPUT_VALIDATION is not set # CONFIG_SND_SEQUENCER is not set CONFIG_SND_DRIVERS=y # CONFIG_SND_DUMMY is not set # CONFIG_SND_ALOOP is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_SERIAL_GENERIC is not set # CONFIG_SND_MPU401 is not set CONFIG_SND_PCI=y # CONFIG_SND_AD1889 is not set # CONFIG_SND_ALS300 is not set # CONFIG_SND_ALI5451 is not set # CONFIG_SND_ATIIXP is not set # CONFIG_SND_ATIIXP_MODEM is not set # CONFIG_SND_AU8810 is not set # CONFIG_SND_AU8820 is not set # CONFIG_SND_AU8830 is not set # CONFIG_SND_AW2 is not set # CONFIG_SND_AZT3328 is not set # CONFIG_SND_BT87X is not set # CONFIG_SND_CA0106 is not set # CONFIG_SND_CMIPCI is not set # CONFIG_SND_OXYGEN is not set # CONFIG_SND_CS4281 is not set # CONFIG_SND_CS46XX is not set # CONFIG_SND_CTXFI is not set # CONFIG_SND_DARLA20 is not set # CONFIG_SND_GINA20 is not set # CONFIG_SND_LAYLA20 is not set # CONFIG_SND_DARLA24 is not set # CONFIG_SND_GINA24 is not set # CONFIG_SND_LAYLA24 is not set # CONFIG_SND_MONA is not set # CONFIG_SND_MIA is not set # CONFIG_SND_ECHO3G is not set # CONFIG_SND_INDIGO is not set # CONFIG_SND_INDIGOIO is not set # CONFIG_SND_INDIGODJ is not set # CONFIG_SND_INDIGOIOX is not set # CONFIG_SND_INDIGODJX is not set # CONFIG_SND_EMU10K1 is not set # CONFIG_SND_EMU10K1X is not set # CONFIG_SND_ENS1370 is not set # CONFIG_SND_ENS1371 is not set # CONFIG_SND_ES1938 is not set # CONFIG_SND_ES1968 is not set # CONFIG_SND_FM801 is not set # CONFIG_SND_HDSP is not set # CONFIG_SND_HDSPM is not set # CONFIG_SND_ICE1712 is not set # CONFIG_SND_ICE1724 is not set # CONFIG_SND_INTEL8X0 is not set # CONFIG_SND_INTEL8X0M is not set # CONFIG_SND_KORG1212 is not set # CONFIG_SND_LOLA is not set # CONFIG_SND_LX6464ES is not set # CONFIG_SND_MAESTRO3 is not set # CONFIG_SND_MIXART is not set # CONFIG_SND_NM256 is not set # CONFIG_SND_PCXHR is not set # CONFIG_SND_RIPTIDE is not set # CONFIG_SND_RME32 is not set # CONFIG_SND_RME96 is not set # CONFIG_SND_RME9652 is not set # CONFIG_SND_SE6X is not set # CONFIG_SND_SONICVIBES is not set # CONFIG_SND_TRIDENT is not set # CONFIG_SND_VIA82XX is not set # CONFIG_SND_VIA82XX_MODEM is not set # CONFIG_SND_VIRTUOSO is not set # CONFIG_SND_VX222 is not set # CONFIG_SND_YMFPCI is not set # # HD-Audio # # CONFIG_SND_HDA_INTEL is not set # end of HD-Audio CONFIG_SND_HDA_PREALLOC_SIZE=64 CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=m CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y # CONFIG_SND_USB_UA101 is not set # CONFIG_SND_USB_CAIAQ is not set # CONFIG_SND_USB_6FIRE is not set # CONFIG_SND_USB_HIFACE is not set # CONFIG_SND_BCD2000 is not set # CONFIG_SND_USB_POD is not set # CONFIG_SND_USB_PODHD is not set # CONFIG_SND_USB_TONEPORT is not set # CONFIG_SND_USB_VARIAX is not set CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y # CONFIG_SND_SOC_ADI is not set # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_AMD_ACP_CONFIG is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # CONFIG_SND_SOC_FSL_AUDMIX is not set # 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_FSL_XCVR is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # end of SoC Audio for Freescale CPUs # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_MTK_BTCVSD is not set CONFIG_SND_SOC_ROCKCHIP=y CONFIG_SND_SOC_ROCKCHIP_I2S=y CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y CONFIG_SND_SOC_ROCKCHIP_PDM=m CONFIG_SND_SOC_ROCKCHIP_SPDIF=y CONFIG_SND_SOC_ROCKCHIP_MAX98090=m CONFIG_SND_SOC_ROCKCHIP_RT5645=m CONFIG_SND_SOC_RK3288_HDMI_ANALOG=m CONFIG_SND_SOC_RK3399_GRU_SOUND=m # CONFIG_SND_SOC_SOF_TOPLEVEL is not set # # STMicroelectronics STM32 SOC audio support # # end of 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_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1372_SPI is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set # CONFIG_SND_SOC_ADAU7002 is not set # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4375 is not set # CONFIG_SND_SOC_AK4458 is not set # CONFIG_SND_SOC_AK4554 is not set CONFIG_SND_SOC_AK4613=m # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # 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_CS35L41_SPI is not set # CONFIG_SND_SOC_CS35L41_I2C is not set # CONFIG_SND_SOC_CS35L45_SPI is not set # CONFIG_SND_SOC_CS35L45_I2C 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS42L83 is not set # CONFIG_SND_SOC_CS4234 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # 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_CX2072X is not set # CONFIG_SND_SOC_DA7213 is not set CONFIG_SND_SOC_DA7219=m CONFIG_SND_SOC_DMIC=m CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_ES7134 is not set # CONFIG_SND_SOC_ES7241 is not set CONFIG_SND_SOC_ES8316=y # CONFIG_SND_SOC_ES8326 is not set CONFIG_SND_SOC_ES8328=m CONFIG_SND_SOC_ES8328_I2C=m CONFIG_SND_SOC_ES8328_SPI=m # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_HDA is not set # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set # CONFIG_SND_SOC_MAX98088 is not set CONFIG_SND_SOC_MAX98090=m CONFIG_SND_SOC_MAX98357A=m # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98520 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX98396 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_ANALOG is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set # CONFIG_SND_SOC_PCM186X_I2C is not set # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set # CONFIG_SND_SOC_PCM5102A 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_RK817=m CONFIG_SND_SOC_RL6231=m CONFIG_SND_SOC_RT5514=m CONFIG_SND_SOC_RT5514_SPI=m # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set # CONFIG_SND_SOC_RT5640 is not set CONFIG_SND_SOC_RT5645=m # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_RT9120 is not set # CONFIG_SND_SOC_SGTL5000 is not set CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m # CONFIG_SND_SOC_SIMPLE_MUX is not set CONFIG_SND_SOC_SPDIF=y # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS2780 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805M is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320ADC3XXX is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set # CONFIG_SND_SOC_TLV320AIC3X_I2C is not set # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set CONFIG_SND_SOC_TS3A227E=m # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731_I2C is not set # CONFIG_SND_SOC_WM8731_SPI is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set # 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_WM8940 is not set # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set # CONFIG_SND_SOC_ZL38060 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_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8821 is not set # CONFIG_SND_SOC_NAU8822 is not set # CONFIG_SND_SOC_NAU8824 is not set # CONFIG_SND_SOC_TPA6130A2 is not set # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set # end of CODEC drivers CONFIG_SND_SIMPLE_CARD_UTILS=y CONFIG_SND_SIMPLE_CARD=y CONFIG_SND_AUDIO_GRAPH_CARD=y # CONFIG_SND_AUDIO_GRAPH_CARD2 is not set # CONFIG_SND_TEST_COMPONENT is not set # CONFIG_SND_VIRTIO is not set # # HID support # CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set CONFIG_HID_ASUS=y CONFIG_HID_AUREAL=y CONFIG_HID_BELKIN=y # CONFIG_HID_BETOP_FF is not set CONFIG_HID_BIGBEN_FF=m CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CREATIVE_SB0540 is not set CONFIG_HID_CYPRESS=y CONFIG_HID_DRAGONRISE=m CONFIG_DRAGONRISE_FF=y # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_FT260 is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_GLORIOUS is not set # CONFIG_HID_HOLTEK is not set # CONFIG_HID_VIVALDI is not set # CONFIG_HID_GT683R is not set # CONFIG_HID_KEYTOUCH is not set CONFIG_HID_KYE=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set # CONFIG_HID_VRC2 is not set # CONFIG_HID_XIAOMI is not set CONFIG_HID_GYRATION=y # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set # CONFIG_HID_JABRA is not set CONFIG_HID_TWINHAN=y CONFIG_HID_KENSINGTON=y CONFIG_HID_LCPOWER=y # CONFIG_HID_LED is not set CONFIG_HID_LENOVO=y # CONFIG_HID_LETSKETCH is not set CONFIG_HID_LOGITECH=y CONFIG_HID_LOGITECH_DJ=y CONFIG_HID_LOGITECH_HIDPP=y CONFIG_LOGITECH_FF=y 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_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=m CONFIG_HID_NINTENDO=m CONFIG_NINTENDO_FF=y # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set CONFIG_HID_ORTEK=y CONFIG_HID_OUYA=y CONFIG_HID_PANTHERLORD=y CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=y CONFIG_HID_PETALYNX=y # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PXRC is not set # CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set CONFIG_HID_SAMSUNG=y # CONFIG_HID_SEMITEK is not set # CONFIG_HID_SIGMAMICRO is not set CONFIG_HID_SONY=y CONFIG_SONY_FF=y # CONFIG_HID_SPEEDLINK is not set CONFIG_HID_STEAM=m # CONFIG_HID_STEELSERIES is not set CONFIG_HID_SUNPLUS=y # CONFIG_HID_RMI is not set # CONFIG_HID_GREENASIA is not set CONFIG_HID_SMARTJOYPLUS=m CONFIG_SMARTJOYPLUS_FF=y CONFIG_HID_TIVO=y CONFIG_HID_TOPSEED=y # CONFIG_HID_TOPRE is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set CONFIG_HID_WIIMOTE=m CONFIG_HID_XINMO=y # CONFIG_HID_ZEROPLUS is not set CONFIG_HID_ZYDACRON=y # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # end of USB HID support # # I2C HID support # # CONFIG_I2C_HID_OF is not set # CONFIG_I2C_HID_OF_ELAN is not set # CONFIG_I2C_HID_OF_GOODIX is not set # end of I2C HID support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y # CONFIG_USB_LED_TRIG is not set CONFIG_USB_ULPI_BUS=y # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_PCI=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_OTG=y # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_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 # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y # CONFIG_USB_XHCI_DBGCAP is not set CONFIG_USB_XHCI_PCI=y # CONFIG_USB_XHCI_PCI_RENESAS is not set 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_PCI=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 # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD_PCI=y CONFIG_USB_OHCI_HCD_PLATFORM=y # CONFIG_USB_UHCI_HCD is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_BCMA is not set # CONFIG_USB_HCD_SSB is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=y # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set CONFIG_USB_UAS=y # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_CDNS_SUPPORT is not set CONFIG_USB_MUSB_HDRC=y # CONFIG_USB_MUSB_HOST is not set # CONFIG_USB_MUSB_GADGET is not set CONFIG_USB_MUSB_DUAL_ROLE=y # # Platform Glue Layer # # # MUSB DMA mode # # CONFIG_MUSB_PIO_ONLY is not set CONFIG_USB_DWC3=y # CONFIG_USB_DWC3_ULPI is not set # CONFIG_USB_DWC3_HOST is not set # CONFIG_USB_DWC3_GADGET is not set CONFIG_USB_DWC3_DUAL_ROLE=y # # Platform Glue Driver Support # CONFIG_USB_DWC3_HAPS=y CONFIG_USB_DWC3_OF_SIMPLE=y CONFIG_USB_DWC2=y # CONFIG_USB_DWC2_HOST is not set # # Gadget/Dual-role mode requires USB Gadget support to be enabled # # CONFIG_USB_DWC2_PERIPHERAL is not set CONFIG_USB_DWC2_DUAL_ROLE=y # CONFIG_USB_DWC2_PCI is not set # CONFIG_USB_DWC2_DEBUG is not set # CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set CONFIG_USB_CHIPIDEA=y CONFIG_USB_CHIPIDEA_UDC=y CONFIG_USB_CHIPIDEA_HOST=y CONFIG_USB_CHIPIDEA_PCI=y CONFIG_USB_CHIPIDEA_MSM=y CONFIG_USB_CHIPIDEA_IMX=y CONFIG_USB_CHIPIDEA_GENERIC=y CONFIG_USB_CHIPIDEA_TEGRA=y CONFIG_USB_ISP1760=y CONFIG_USB_ISP1760_HCD=y CONFIG_USB_ISP1761_UDC=y # CONFIG_USB_ISP1760_HOST_ROLE is not set # CONFIG_USB_ISP1760_GADGET_ROLE is not set CONFIG_USB_ISP1760_DUAL_ROLE=y # # USB port drivers # # CONFIG_USB_SERIAL is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HUB_USB251XB is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # CONFIG_USB_ONBOARD_HUB is not set # # USB Physical Layer drivers # CONFIG_USB_PHY=y CONFIG_NOP_USB_XCEIV=y # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set CONFIG_USB_ULPI=y CONFIG_USB_ULPI_VIEWPORT=y # end of USB Physical Layer drivers CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GADGET_DEBUG_FILES is not set # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # # USB Peripheral Controller # # CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set # CONFIG_USB_SNP_UDC_PLAT is not set # CONFIG_USB_M66592 is not set # CONFIG_USB_BDC_UDC is not set # CONFIG_USB_AMD5536UDC is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_NET2280 is not set # CONFIG_USB_GOKU is not set # CONFIG_USB_EG20T is not set # CONFIG_USB_GADGET_XILINX is not set # CONFIG_USB_MAX3420_UDC is not set # CONFIG_USB_DUMMY_HCD is not set # end of USB Peripheral Controller # CONFIG_USB_CONFIGFS is not set # # USB Gadget precomposed configurations # # CONFIG_USB_ZERO is not set # CONFIG_USB_AUDIO is not set # CONFIG_USB_ETH is not set # CONFIG_USB_G_NCM is not set # CONFIG_USB_GADGETFS is not set # CONFIG_USB_FUNCTIONFS is not set # CONFIG_USB_MASS_STORAGE is not set # CONFIG_USB_G_SERIAL is not set # CONFIG_USB_MIDI_GADGET is not set # CONFIG_USB_G_PRINTER is not set # CONFIG_USB_CDC_COMPOSITE is not set # CONFIG_USB_G_ACM_MS is not set # CONFIG_USB_G_MULTI is not set # CONFIG_USB_G_HID is not set # CONFIG_USB_G_DBGP is not set # CONFIG_USB_G_WEBCAM is not set # CONFIG_USB_RAW_GADGET is not set # end of USB Gadget precomposed configurations CONFIG_TYPEC=y CONFIG_TYPEC_TCPM=m # CONFIG_TYPEC_TCPCI is not set CONFIG_TYPEC_FUSB302=m # CONFIG_TYPEC_UCSI is not set # CONFIG_TYPEC_TPS6598X is not set # CONFIG_TYPEC_ANX7411 is not set # CONFIG_TYPEC_RT1719 is not set # CONFIG_TYPEC_HD3SS3220 is not set # CONFIG_TYPEC_STUSB160X is not set # CONFIG_TYPEC_WUSB3801 is not set # # USB Type-C Multiplexer/DeMultiplexer Switch support # # CONFIG_TYPEC_MUX_FSA4480 is not set # CONFIG_TYPEC_MUX_PI3USB30532 is not set # end of USB Type-C Multiplexer/DeMultiplexer Switch support # # USB Type-C Alternate Mode drivers # CONFIG_TYPEC_DP_ALTMODE=y # CONFIG_TYPEC_NVIDIA_ALTMODE is not set # end of USB Type-C Alternate Mode drivers CONFIG_USB_ROLE_SWITCH=y CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y # CONFIG_PWRSEQ_SD8787 is not set CONFIG_PWRSEQ_SIMPLE=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_DEBUG is not set CONFIG_MMC_ARMMMCI=y CONFIG_MMC_STM32_SDMMC=y CONFIG_MMC_SDHCI=y # CONFIG_MMC_SDHCI_PCI is not set CONFIG_MMC_SDHCI_PLTFM=y CONFIG_MMC_SDHCI_OF_ARASAN=y # CONFIG_MMC_SDHCI_OF_AT91 is not set # CONFIG_MMC_SDHCI_OF_DWCMSHC is not set # CONFIG_MMC_SDHCI_CADENCE is not set # CONFIG_MMC_SDHCI_F_SDH30 is not set # CONFIG_MMC_SDHCI_MILBEAUT is not set # CONFIG_MMC_TIFM_SD is not set CONFIG_MMC_SPI=y # CONFIG_MMC_CB710 is not set # CONFIG_MMC_VIA_SDMMC is not set CONFIG_MMC_DW=y CONFIG_MMC_DW_PLTFM=y # CONFIG_MMC_DW_BLUEFIELD is not set # CONFIG_MMC_DW_EXYNOS is not set # CONFIG_MMC_DW_HI3798CV200 is not set CONFIG_MMC_DW_K3=y # CONFIG_MMC_DW_PCI is not set CONFIG_MMC_DW_ROCKCHIP=y # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_CQHCI=y # CONFIG_MMC_HSQ is not set # CONFIG_MMC_TOSHIBA_PCI is not set # CONFIG_MMC_MTK is not set # CONFIG_MMC_SDHCI_XENON is not set # CONFIG_MMC_SDHCI_OMAP is not set # CONFIG_MMC_SDHCI_AM654 is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y CONFIG_LEDS_CLASS_FLASH=m # CONFIG_LEDS_CLASS_MULTICOLOR is not set # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_AW2013 is not set # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_EL15203000 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP50XX is not set # CONFIG_LEDS_LP55XX_COMMON is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set CONFIG_LEDS_PWM=y # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set CONFIG_LEDS_SYSCON=y # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_SPI_BYTE is not set # CONFIG_LEDS_TI_LMU_COMMON is not set # # Flash and Torch LED drivers # # CONFIG_LEDS_AAT1290 is not set # CONFIG_LEDS_AS3645A is not set # CONFIG_LEDS_KTD2692 is not set # CONFIG_LEDS_LM3601X is not set # CONFIG_LEDS_RT4505 is not set # CONFIG_LEDS_RT8515 is not set # CONFIG_LEDS_SGM3140 is not set # # RGB LED drivers # # # LED Triggers # CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y # CONFIG_LEDS_TRIGGER_DISK is not set # CONFIG_LEDS_TRIGGER_MTD is not set CONFIG_LEDS_TRIGGER_HEARTBEAT=y # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set CONFIG_LEDS_TRIGGER_CPU=y CONFIG_LEDS_TRIGGER_ACTIVITY=y CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set CONFIG_LEDS_TRIGGER_PANIC=y # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set # CONFIG_LEDS_TRIGGER_AUDIO is not set # CONFIG_LEDS_TRIGGER_TTY is not set # # Simple LED drivers # # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_SUPPORT=y CONFIG_EDAC=y CONFIG_EDAC_LEGACY_SYSFS=y # CONFIG_EDAC_DEBUG is not set # CONFIG_EDAC_THUNDERX is not set # CONFIG_EDAC_XGENE is not set # CONFIG_EDAC_DMC520 is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # 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 # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_HYM8563 is not set # CONFIG_RTC_DRV_MAX6900 is not set CONFIG_RTC_DRV_MAX77686=y # CONFIG_RTC_DRV_NCT3018Y is not set CONFIG_RTC_DRV_RK808=y # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # 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_RV3032 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 # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # CONFIG_RTC_DRV_DS3232=y CONFIG_RTC_DRV_DS3232_HWMON=y # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_OPTEE is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_PL030 is not set CONFIG_RTC_DRV_PL031=y # CONFIG_RTC_DRV_CADENCE is not set # CONFIG_RTC_DRV_FTRTC010 is not set # CONFIG_RTC_DRV_R7301 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_OF=y # CONFIG_ALTERA_MSGDMA is not set # CONFIG_AMBA_PL08X is not set # CONFIG_BCM_SBA_RAID is not set # 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 is not set CONFIG_PL330_DMA=y # CONFIG_PLX_DMA is not set # CONFIG_XILINX_DMA is not set # CONFIG_XILINX_ZYNQMP_DMA is not set # CONFIG_XILINX_ZYNQMP_DPDMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set # CONFIG_DW_DMAC is not set # CONFIG_DW_DMAC_PCI is not set # CONFIG_DW_EDMA is not set # CONFIG_DW_EDMA_PCIE is not set # CONFIG_SF_PDMA is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set CONFIG_DMABUF_HEAPS=y # CONFIG_DMABUF_SYSFS_STATS is not set CONFIG_DMABUF_HEAPS_SYSTEM=y CONFIG_DMABUF_HEAPS_CMA=y # end of DMABUF options # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set CONFIG_VFIO=y CONFIG_VFIO_IOMMU_TYPE1=y # CONFIG_VFIO_NOIOMMU is not set CONFIG_VFIO_PCI_MMAP=y CONFIG_VFIO_PCI_INTX=y # CONFIG_VFIO_PCI is not set # CONFIG_VFIO_PLATFORM is not set # CONFIG_VFIO_MDEV is not set # CONFIG_VIRT_DRIVERS is not set CONFIG_VIRTIO_ANCHOR=y CONFIG_VIRTIO=y CONFIG_VIRTIO_MENU=y # CONFIG_VIRTIO_PCI is not set CONFIG_VIRTIO_BALLOON=y # CONFIG_VIRTIO_INPUT is not set CONFIG_VIRTIO_MMIO=y # CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set # CONFIG_VDPA is not set CONFIG_VHOST_MENU=y # CONFIG_VHOST_NET is not set # CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set # # Microsoft Hyper-V guest support # # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_RTL8192U is not set # CONFIG_RTLLIB is not set CONFIG_RTL8723BS=m # CONFIG_R8712U is not set CONFIG_R8188EU=m # CONFIG_RTS5208 is not set # CONFIG_VT6655 is not set # CONFIG_VT6656 is not set # # IIO staging drivers # # # Accelerometers # # CONFIG_ADIS16203 is not set # CONFIG_ADIS16240 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7816 is not set # end of Analog to digital converters # # Analog digital bi-direction converters # # CONFIG_ADT7316 is not set # end of Analog digital bi-direction converters # # Direct Digital Synthesis # # CONFIG_AD9832 is not set # CONFIG_AD9834 is not set # end of Direct Digital Synthesis # # Network Analyzer, Impedance Converters # # CONFIG_AD5933 is not set # end of Network Analyzer, Impedance Converters # # Active energy metering IC # # CONFIG_ADE7854 is not set # end of Active energy metering IC # # Resolver to digital converters # # CONFIG_AD2S1210 is not set # end of Resolver to digital converters # end of IIO staging drivers # CONFIG_FB_SM750 is not set CONFIG_STAGING_MEDIA=y # CONFIG_VIDEO_MAX96712 is not set CONFIG_VIDEO_ROCKCHIP_VDEC=m CONFIG_STAGING_MEDIA_DEPRECATED=y # CONFIG_VIDEO_CPIA2 is not set CONFIG_VIDEO_SAA7146=m CONFIG_VIDEO_SAA7146_VV=m CONFIG_DVB_AV7110_IR=y CONFIG_DVB_AV7110=m # CONFIG_DVB_AV7110_OSD is not set CONFIG_DVB_SP8870=m # CONFIG_VIDEO_HEXIUM_GEMINI is not set # CONFIG_VIDEO_HEXIUM_ORION is not set # CONFIG_VIDEO_MXB is not set # CONFIG_DVB_BUDGET_CORE is not set # CONFIG_VIDEO_STKWEBCAM is not set CONFIG_VIDEO_TM6000=m CONFIG_VIDEO_TM6000_ALSA=m CONFIG_VIDEO_TM6000_DVB=m # CONFIG_USB_ZR364XX is not set # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_FB_TFT is not set # CONFIG_KS7010 is not set # CONFIG_PI433 is not set # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_FIELDBUS_DEV is not set # CONFIG_QLGE is not set # CONFIG_VME_BUS is not set # CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set # CONFIG_SURFACE_PLATFORMS is not set CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Clock driver for ARM Reference designs # # CONFIG_CLK_ICST is not set # CONFIG_CLK_SP810 is not set # end of Clock driver for ARM Reference designs # CONFIG_LMK04832 is not set # CONFIG_COMMON_CLK_MAX77686 is not set # CONFIG_COMMON_CLK_MAX9485 is not set CONFIG_COMMON_CLK_RK808=y CONFIG_COMMON_CLK_SCPI=y # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set CONFIG_COMMON_CLK_CS2000_CP=y CONFIG_COMMON_CLK_S2MPS11=y # CONFIG_COMMON_CLK_AXI_CLKGEN is not set CONFIG_COMMON_CLK_XGENE=y CONFIG_COMMON_CLK_PWM=y # CONFIG_COMMON_CLK_RS9_PCIE is not set # CONFIG_COMMON_CLK_VC5 is not set # CONFIG_COMMON_CLK_VC7 is not set # CONFIG_COMMON_CLK_FIXED_MMIO is not set CONFIG_COMMON_CLK_ROCKCHIP=y # CONFIG_CLK_PX30 is not set # CONFIG_CLK_RK3308 is not set # CONFIG_CLK_RK3328 is not set # CONFIG_CLK_RK3368 is not set CONFIG_CLK_RK3399=y # CONFIG_CLK_RK3568 is not set # CONFIG_XILINX_VCU is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set CONFIG_HWSPINLOCK=y # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_PROBE=y CONFIG_CLKSRC_MMIO=y CONFIG_ROCKCHIP_TIMER=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y # CONFIG_FSL_ERRATUM_A008585 is not set # CONFIG_HISILICON_ERRATUM_161010101 is not set # CONFIG_ARM64_ERRATUM_858921 is not set # CONFIG_MICROCHIP_PIT64B is not set # end of Clock Source drivers CONFIG_MAILBOX=y CONFIG_ARM_MHU=y CONFIG_ARM_MHU_V2=m CONFIG_PLATFORM_MHU=y # CONFIG_PL320_MBOX is not set # CONFIG_ROCKCHIP_MBOX is not set # CONFIG_ALTERA_MBOX is not set # CONFIG_MAILBOX_TEST is not set CONFIG_IOMMU_IOVA=y CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # CONFIG_IOMMU_IO_PGTABLE=y CONFIG_IOMMU_IO_PGTABLE_LPAE=y # CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set # CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set # CONFIG_IOMMU_IO_PGTABLE_DART is not set # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set CONFIG_IOMMU_DEFAULT_DMA_STRICT=y # CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_OF_IOMMU=y CONFIG_IOMMU_DMA=y CONFIG_ROCKCHIP_IOMMU=y CONFIG_ARM_SMMU=y # CONFIG_ARM_SMMU_LEGACY_DT_BINDINGS is not set CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT=y CONFIG_ARM_SMMU_V3=y # CONFIG_ARM_SMMU_V3_SVA is not set # CONFIG_VIRTIO_IOMMU is not set # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # end of Remoteproc drivers # # Rpmsg drivers # # CONFIG_RPMSG_QCOM_GLINK_RPM is not set # CONFIG_RPMSG_VIRTIO is not set # end of Rpmsg drivers # CONFIG_SOUNDWIRE is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # end of Amlogic SoC drivers # # Broadcom SoC drivers # # CONFIG_SOC_BRCMSTB is not set # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # CONFIG_QUICC_ENGINE is not set # CONFIG_FSL_RCPM is not set # end of NXP/Freescale QorIQ SoC drivers # # fujitsu SoC drivers # # end of fujitsu SoC drivers # # i.MX SoC drivers # # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # CONFIG_LITEX_SOC_CONTROLLER is not set # end of Enable LiteX SoC Builder specific drivers # # Qualcomm SoC drivers # # end of Qualcomm SoC drivers CONFIG_ROCKCHIP_GRF=y CONFIG_ROCKCHIP_IODOMAIN=y CONFIG_ROCKCHIP_PM_DOMAINS=y # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y CONFIG_DEVFREQ_GOV_PERFORMANCE=y CONFIG_DEVFREQ_GOV_POWERSAVE=y CONFIG_DEVFREQ_GOV_USERSPACE=y CONFIG_DEVFREQ_GOV_PASSIVE=y # # DEVFREQ Drivers # CONFIG_ARM_RK3399_DMC_DEVFREQ=m CONFIG_PM_DEVFREQ_EVENT=y CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_FSA9480 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_TUSB320 is not set # CONFIG_MEMORY is not set CONFIG_IIO=y CONFIG_IIO_BUFFER=y # CONFIG_IIO_BUFFER_CB is not set # CONFIG_IIO_BUFFER_DMA is not set # CONFIG_IIO_BUFFER_DMAENGINE is not set # CONFIG_IIO_BUFFER_HW_CONSUMER is not set CONFIG_IIO_KFIFO_BUF=y CONFIG_IIO_TRIGGERED_BUFFER=y # CONFIG_IIO_CONFIGFS is not set CONFIG_IIO_TRIGGER=y CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # CONFIG_IIO_SW_DEVICE is not set # CONFIG_IIO_SW_TRIGGER is not set # CONFIG_IIO_TRIGGERED_EVENT is not set # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADXL313_I2C is not set # CONFIG_ADXL313_SPI is not set # CONFIG_ADXL345_I2C is not set # CONFIG_ADXL345_SPI is not set # CONFIG_ADXL355_I2C is not set # CONFIG_ADXL355_SPI is not set # CONFIG_ADXL367_SPI is not set # CONFIG_ADXL367_I2C is not set # CONFIG_ADXL372_SPI is not set # CONFIG_ADXL372_I2C is not set # CONFIG_BMA180 is not set # CONFIG_BMA220 is not set # CONFIG_BMA400 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_BMI088_ACCEL is not set # CONFIG_DA280 is not set # CONFIG_DA311 is not set # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_DMARD10 is not set # CONFIG_FXLS8962AF_I2C is not set # CONFIG_FXLS8962AF_SPI is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MC3230 is not set # CONFIG_MMA7455_I2C is not set # CONFIG_MMA7455_SPI is not set # CONFIG_MMA7660 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MSA311 is not set # CONFIG_MXC4005 is not set # CONFIG_MXC6255 is not set # CONFIG_SCA3000 is not set # CONFIG_SCA3300 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7091R5 is not set # CONFIG_AD7124 is not set # CONFIG_AD7192 is not set # CONFIG_AD7266 is not set # CONFIG_AD7280 is not set # CONFIG_AD7291 is not set # CONFIG_AD7292 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_AD7780 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD7949 is not set # CONFIG_AD799X is not set # CONFIG_ADI_AXI_ADC is not set # CONFIG_CC10001_ADC is not set # CONFIG_ENVELOPE_DETECTOR is not set # CONFIG_HI8435 is not set # CONFIG_HX711 is not set # CONFIG_INA2XX_ADC is not set # CONFIG_LTC2471 is not set # CONFIG_LTC2485 is not set # CONFIG_LTC2496 is not set # CONFIG_LTC2497 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX11100 is not set # CONFIG_MAX1118 is not set # CONFIG_MAX11205 is not set # CONFIG_MAX1241 is not set # CONFIG_MAX1363 is not set # CONFIG_MAX9611 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_MCP3911 is not set # CONFIG_NAU7802 is not set # CONFIG_QCOM_SPMI_IADC is not set # CONFIG_QCOM_SPMI_VADC is not set # CONFIG_QCOM_SPMI_ADC5 is not set CONFIG_ROCKCHIP_SARADC=y # CONFIG_RICHTEK_RTQ6056 is not set # CONFIG_SD_ADC_MODULATOR is not set # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC0832 is not set # CONFIG_TI_ADC084S021 is not set # CONFIG_TI_ADC12138 is not set # CONFIG_TI_ADC108S102 is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_TI_ADC161S626 is not set # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS7950 is not set # CONFIG_TI_ADS8344 is not set # CONFIG_TI_ADS8688 is not set # CONFIG_TI_ADS124S08 is not set # CONFIG_TI_ADS131E08 is not set # CONFIG_TI_TLC4541 is not set # CONFIG_TI_TSC2046 is not set # CONFIG_VF610_ADC is not set # CONFIG_XILINX_XADC is not set # end of Analog to digital converters # # Analog to digital and digital to analog converters # # CONFIG_AD74413R is not set # end of Analog to digital and digital to analog converters # # Analog Front Ends # # CONFIG_IIO_RESCALE is not set # end of Analog Front Ends # # Amplifiers # # CONFIG_AD8366 is not set # CONFIG_ADA4250 is not set # CONFIG_HMC425 is not set # end of Amplifiers # # Capacitance to digital converters # # CONFIG_AD7150 is not set # CONFIG_AD7746 is not set # end of Capacitance to digital converters # # Chemical Sensors # # CONFIG_ATLAS_PH_SENSOR is not set # CONFIG_ATLAS_EZO_SENSOR is not set # CONFIG_BME680 is not set # CONFIG_CCS811 is not set # CONFIG_IAQCORE is not set # CONFIG_PMS7003 is not set # CONFIG_SCD30_CORE is not set # CONFIG_SCD4X is not set # CONFIG_SENSIRION_SGP30 is not set # CONFIG_SENSIRION_SGP40 is not set # CONFIG_SPS30_I2C is not set # CONFIG_SPS30_SERIAL is not set # CONFIG_SENSEAIR_SUNRISE_CO2 is not set # CONFIG_VZ89X is not set # end of Chemical Sensors # # Hid Sensor IIO Common # # end of Hid Sensor IIO Common # # IIO SCMI Sensors # # end of IIO SCMI Sensors # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # end of SSP Sensor Common # # Digital to analog converters # # CONFIG_AD3552R is not set # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5592R is not set # CONFIG_AD5593R is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_LTC2688 is not set # CONFIG_AD5686_SPI is not set # CONFIG_AD5696_I2C is not set # CONFIG_AD5755 is not set # CONFIG_AD5758 is not set # CONFIG_AD5761 is not set # CONFIG_AD5764 is not set # CONFIG_AD5766 is not set # CONFIG_AD5770R is not set # CONFIG_AD5791 is not set # CONFIG_AD7293 is not set # CONFIG_AD7303 is not set # CONFIG_AD8801 is not set # CONFIG_DPOT_DAC is not set # CONFIG_DS4424 is not set # CONFIG_LTC1660 is not set # CONFIG_LTC2632 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # 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 # end of Digital to analog converters # # IIO dummy driver # # end of IIO dummy driver # # Filters # # CONFIG_ADMV8818 is not set # end of Filters # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # end of Clock Generator/Distribution # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # CONFIG_ADF4371 is not set # CONFIG_ADMV1013 is not set # CONFIG_ADMV1014 is not set # CONFIG_ADMV4420 is not set # CONFIG_ADRF6780 is not set # end of Phase-Locked Loop (PLL) frequency synthesizers # end of Frequency Synthesizers DDS/PLL # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS290 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_FXAS21002C is not set # CONFIG_MPU3050_I2C is not set # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # end of Digital gyroscope sensors # # Health Sensors # # # Heart Rate Monitors # # CONFIG_AFE4403 is not set # CONFIG_AFE4404 is not set # CONFIG_MAX30100 is not set # CONFIG_MAX30102 is not set # end of Heart Rate Monitors # end of Health Sensors # # Humidity sensors # # CONFIG_AM2315 is not set # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HDC2010 is not set # CONFIG_HTS221 is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # end of Humidity sensors # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16460 is not set # CONFIG_ADIS16475 is not set # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set # CONFIG_BOSCH_BNO055_SERIAL is not set # CONFIG_BOSCH_BNO055_I2C is not set # CONFIG_FXOS8700_I2C is not set # CONFIG_FXOS8700_SPI is not set # CONFIG_KMX61 is not set # CONFIG_INV_ICM42600_I2C is not set # CONFIG_INV_ICM42600_SPI is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set # CONFIG_IIO_ST_LSM6DSX is not set # CONFIG_IIO_ST_LSM9DS0 is not set # end of Inertial measurement units # # Light sensors # # CONFIG_ADJD_S311 is not set # CONFIG_ADUX1020 is not set # CONFIG_AL3010 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_AS73211 is not set # CONFIG_BH1750 is not set # CONFIG_BH1780 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM3605 is not set # CONFIG_CM36651 is not set # CONFIG_GP2AP002 is not set # CONFIG_GP2AP020A00F is not set # CONFIG_SENSORS_ISL29018 is not set # CONFIG_SENSORS_ISL29028 is not set # CONFIG_ISL29125 is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_LTRF216A is not set # CONFIG_LV0104CS is not set # CONFIG_MAX44000 is not set # CONFIG_MAX44009 is not set # CONFIG_NOA1305 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1133 is not set # CONFIG_SI1145 is not set # CONFIG_STK3310 is not set # CONFIG_ST_UVIS25 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set # CONFIG_SENSORS_TSL2563 is not set # CONFIG_TSL2583 is not set # CONFIG_TSL2591 is not set # CONFIG_TSL2772 is not set # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VCNL4035 is not set # CONFIG_VEML6030 is not set # CONFIG_VEML6070 is not set # CONFIG_VL6180 is not set # CONFIG_ZOPT2201 is not set # end of Light sensors # # Magnetometer sensors # # CONFIG_AK8974 is not set # CONFIG_AK8975 is not set # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN_I2C is not set # CONFIG_BMC150_MAGN_SPI is not set # CONFIG_MAG3110 is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # CONFIG_SENSORS_RM3100_I2C is not set # CONFIG_SENSORS_RM3100_SPI is not set # CONFIG_YAMAHA_YAS530 is not set # end of Magnetometer sensors # # Multiplexers # # CONFIG_IIO_MUX is not set # end of Multiplexers # # Inclinometer sensors # # end of Inclinometer sensors # # Triggers - standalone # # CONFIG_IIO_INTERRUPT_TRIGGER is not set # CONFIG_IIO_SYSFS_TRIGGER is not set # end of Triggers - standalone # # Linear and angular position sensors # # end of Linear and angular position sensors # # Digital potentiometers # # CONFIG_AD5110 is not set # CONFIG_AD5272 is not set # CONFIG_DS1803 is not set # CONFIG_MAX5432 is not set # CONFIG_MAX5481 is not set # CONFIG_MAX5487 is not set # CONFIG_MCP4018 is not set # CONFIG_MCP4131 is not set # CONFIG_MCP4531 is not set # CONFIG_MCP41010 is not set # CONFIG_TPL0102 is not set # end of Digital potentiometers # # Digital potentiostats # # CONFIG_LMP91000 is not set # end of Digital potentiostats # # Pressure sensors # # CONFIG_ABP060MG is not set # CONFIG_BMP280 is not set # CONFIG_DLHL60D is not set # CONFIG_DPS310 is not set # CONFIG_HP03 is not set # CONFIG_ICP10100 is not set # CONFIG_MPL115_I2C is not set # CONFIG_MPL115_SPI is not set # CONFIG_MPL3115 is not set # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # CONFIG_HP206C is not set # CONFIG_ZPA2326 is not set # end of Pressure sensors # # Lightning sensors # # CONFIG_AS3935 is not set # end of Lightning sensors # # Proximity and distance sensors # # CONFIG_ISL29501 is not set # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_MB1232 is not set # CONFIG_PING is not set # CONFIG_RFD77402 is not set # CONFIG_SRF04 is not set # CONFIG_SX9310 is not set # CONFIG_SX9324 is not set # CONFIG_SX9360 is not set # CONFIG_SX9500 is not set # CONFIG_SRF08 is not set # CONFIG_VCNL3020 is not set # CONFIG_VL53L0X_I2C is not set # end of Proximity and distance sensors # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1200 is not set # end of Resolver to digital converters # # Temperature sensors # # CONFIG_LTC2983 is not set # CONFIG_MAXIM_THERMOCOUPLE is not set # CONFIG_MLX90614 is not set # CONFIG_MLX90632 is not set # CONFIG_TMP006 is not set # CONFIG_TMP007 is not set # CONFIG_TMP117 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_MAX31856 is not set # CONFIG_MAX31865 is not set # end of Temperature sensors # CONFIG_NTB is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_DEBUG is not set # CONFIG_PWM_ATMEL_TCB is not set # CONFIG_PWM_CLK is not set # CONFIG_PWM_DWC is not set # CONFIG_PWM_FSL_FTM is not set # CONFIG_PWM_PCA9685 is not set CONFIG_PWM_ROCKCHIP=y # CONFIG_PWM_XILINX is not set # # IRQ chip support # CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 CONFIG_ARM_GIC_V2M=y CONFIG_ARM_GIC_V3=y CONFIG_ARM_GIC_V3_ITS=y CONFIG_ARM_GIC_V3_ITS_PCI=y # CONFIG_AL_FIC is not set # CONFIG_XILINX_INTC is not set CONFIG_PARTITION_PERCPU=y # end of IRQ chip support # CONFIG_IPACK_BUS is not set CONFIG_ARCH_HAS_RESET_CONTROLLER=y CONFIG_RESET_CONTROLLER=y # CONFIG_RESET_TI_SYSCON is not set # CONFIG_RESET_TI_TPS380X is not set # # PHY Subsystem # CONFIG_GENERIC_PHY=y CONFIG_GENERIC_PHY_MIPI_DPHY=y # CONFIG_PHY_XGENE is not set # CONFIG_PHY_CAN_TRANSCEIVER is not set # # PHY drivers for Broadcom platforms # # CONFIG_BCM_KONA_USB2_PHY is not set # end of PHY drivers for Broadcom platforms # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_DPHY_RX is not set # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_CADENCE_SALVO is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_LAN966X_SERDES is not set # CONFIG_PHY_CPCAP_USB is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set # CONFIG_PHY_OCELOT_SERDES is not set # CONFIG_PHY_QCOM_USB_HS is not set # CONFIG_PHY_QCOM_USB_HSIC is not set CONFIG_PHY_ROCKCHIP_DP=y # CONFIG_PHY_ROCKCHIP_DPHY_RX0 is not set CONFIG_PHY_ROCKCHIP_EMMC=y # CONFIG_PHY_ROCKCHIP_INNO_HDMI is not set CONFIG_PHY_ROCKCHIP_INNO_USB2=y # CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY is not set # CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY is not set # CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY is not set CONFIG_PHY_ROCKCHIP_PCIE=y # CONFIG_PHY_ROCKCHIP_SNPS_PCIE3 is not set CONFIG_PHY_ROCKCHIP_TYPEC=y CONFIG_PHY_ROCKCHIP_USB=y # CONFIG_PHY_SAMSUNG_USB2 is not set # CONFIG_PHY_TUSB1210 is not set # end of PHY Subsystem # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCI_PMU is not set # CONFIG_ARM_CCN is not set # CONFIG_ARM_CMN is not set CONFIG_ARM_PMU=y # CONFIG_ARM_DSU_PMU is not set # CONFIG_ARM_SPE_PMU is not set # CONFIG_HISI_PCIE_PMU is not set # CONFIG_HNS3_PMU is not set # end of Performance monitor support CONFIG_RAS=y # CONFIG_USB4 is not set # # Android # # CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_LIBNVDIMM is not set # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y CONFIG_NVMEM_RMEM=m CONFIG_NVMEM_ROCKCHIP_EFUSE=y CONFIG_NVMEM_ROCKCHIP_OTP=m # CONFIG_NVMEM_SPMI_SDAM is not set CONFIG_NVMEM_U_BOOT_ENV=m # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # CONFIG_HISI_PTT is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_FSI is not set CONFIG_TEE=y CONFIG_OPTEE=m CONFIG_MULTIPLEXER=y # # Multiplexer drivers # # CONFIG_MUX_ADG792A is not set # CONFIG_MUX_ADGS1408 is not set # CONFIG_MUX_GPIO is not set # CONFIG_MUX_MMIO is not set # end of Multiplexer drivers CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set # CONFIG_PECI is not set # CONFIG_HTE is not set # end of Device Drivers # # 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 CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=m CONFIG_XFS_SUPPORT_V4=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_ONLINE_SCRUB is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_BTRFS_FS_REF_VERIFY is not set # CONFIG_NILFS2_FS is not set CONFIG_F2FS_FS=y CONFIG_F2FS_STAT_FS=y # CONFIG_F2FS_FS_XATTR is not set CONFIG_F2FS_CHECK_FS=y # CONFIG_F2FS_FAULT_INJECTION is not set # CONFIG_F2FS_FS_COMPRESSION is not set CONFIG_F2FS_IOSTAT=y # CONFIG_F2FS_UNFAIR_RWSEM is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QUOTA_DEBUG is not set # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS4_FS=y CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=m CONFIG_CUSE=m # CONFIG_VIRTIO_FS is not set CONFIG_OVERLAY_FS=m # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_XINO_AUTO is not set # CONFIG_OVERLAY_FS_METACOPY is not set # # Caches # CONFIG_NETFS_SUPPORT=y # CONFIG_NETFS_STATS is not set CONFIG_FSCACHE=y # CONFIG_FSCACHE_STATS is not set # CONFIG_FSCACHE_DEBUG is not set # CONFIG_CACHEFILES is not set # end of Caches # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=y # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=m CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set CONFIG_NTFS3_FS=m # CONFIG_NTFS3_64BIT_CLUSTER is not set # CONFIG_NTFS3_LZX_XPRESS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_PROC_CHILDREN=y CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_TMPFS_INODE64 is not set CONFIG_ARCH_SUPPORTS_HUGETLBFS=y # CONFIG_HUGETLBFS is not set CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=y # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set CONFIG_HFS_FS=y CONFIG_HFSPLUS_FS=y # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS2_FS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y CONFIG_SQUASHFS_FILE_CACHE=y # CONFIG_SQUASHFS_FILE_DIRECT is not set # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 CONFIG_PSTORE_DEFLATE_COMPRESS=y # CONFIG_PSTORE_LZO_COMPRESS is not set # CONFIG_PSTORE_LZ4_COMPRESS is not set # CONFIG_PSTORE_LZ4HC_COMPRESS is not set # CONFIG_PSTORE_842_COMPRESS is not set # CONFIG_PSTORE_ZSTD_COMPRESS is not set CONFIG_PSTORE_COMPRESS=y CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" CONFIG_PSTORE_CONSOLE=y CONFIG_PSTORE_PMSG=y CONFIG_PSTORE_RAM=y # CONFIG_PSTORE_BLK is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y # CONFIG_NFS_SWAP is not set CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=m CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" CONFIG_NFS_V4_1_MIGRATION=y CONFIG_NFS_V4_SECURITY_LABEL=y CONFIG_ROOT_NFS=y CONFIG_NFS_FSCACHE=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFS_DISABLE_UDP_SUPPORT=y CONFIG_NFS_V4_2_READ_PLUS=y # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_COMMON=y CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS2=y CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set CONFIG_CIFS_DEBUG=y # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DEBUG_DUMP_KEYS is not set # CONFIG_CIFS_DFS_UPCALL is not set # CONFIG_CIFS_SWN_UPCALL is not set CONFIG_CIFS_FSCACHE=y # CONFIG_CIFS_ROOT is not set # CONFIG_SMB_SERVER is not set CONFIG_SMBFS=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEY_DH_OPERATIONS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set CONFIG_SECURITY=y # CONFIG_SECURITYFS is not set # CONFIG_SECURITY_NETWORK is not set # CONFIG_SECURITY_PATH is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_SECURITY_SMACK is not set # CONFIG_SECURITY_TOMOYO is not set # 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_SECURITY_LOCKDOWN_LSM is not set # CONFIG_SECURITY_LANDLOCK is not set CONFIG_INTEGRITY=y # CONFIG_INTEGRITY_SIGNATURE is not set # CONFIG_IMA is not set # CONFIG_EVM is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_LSM="yama,loadpin,safesetid,integrity" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_STACK_ALL_PATTERN is not set # CONFIG_INIT_STACK_ALL_ZERO is not set # CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization CONFIG_RANDSTRUCT_NONE=y # CONFIG_RANDSTRUCT_FULL is not set # CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_ENGINE=m # end of Crypto core or helper # # Public-key cryptography # CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y # CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set CONFIG_CRYPTO_ECC=m CONFIG_CRYPTO_ECDH=m # CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set CONFIG_CRYPTO_CURVE25519=m # end of Public-key cryptography # # Block ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set CONFIG_CRYPTO_SM4=y # CONFIG_CRYPTO_SM4_GENERIC is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_ARC4 is not set CONFIG_CRYPTO_CHACHA20=m CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set CONFIG_CRYPTO_CTR=y # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set CONFIG_CRYPTO_NHPOLY1305=y # end of Length-preserving ciphers and modes # # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y # CONFIG_CRYPTO_ESSIV is not set # end of AEAD (authenticated encryption with associated data) ciphers # # Hashes, digests, and MACs # CONFIG_CRYPTO_BLAKE2B=m CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set CONFIG_CRYPTO_POLYVAL=y CONFIG_CRYPTO_POLY1305=m # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set CONFIG_CRYPTO_SM3=y # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_XCBC is not set CONFIG_CRYPTO_XXHASH=m # end of Hashes, digests, and MACs # # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y # CONFIG_CRYPTO_CRCT10DIF is not set # end of CRCs (cyclic redundancy checks) # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_LZO is not set # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # end of Compression # # Random number generation # CONFIG_CRYPTO_ANSI_CPRNG=y CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation # # Userspace interface # CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set # CONFIG_CRYPTO_USER_API_AEAD is not set CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y CONFIG_CRYPTO_NHPOLY1305_NEON=y CONFIG_CRYPTO_CHACHA20_NEON=y # # Accelerated Cryptographic Algorithms for CPU (arm64) # CONFIG_CRYPTO_GHASH_ARM64_CE=y CONFIG_CRYPTO_POLY1305_NEON=y CONFIG_CRYPTO_SHA1_ARM64_CE=y CONFIG_CRYPTO_SHA256_ARM64=y CONFIG_CRYPTO_SHA2_ARM64_CE=y CONFIG_CRYPTO_SHA512_ARM64=y CONFIG_CRYPTO_SHA512_ARM64_CE=y # CONFIG_CRYPTO_SHA3_ARM64 is not set CONFIG_CRYPTO_SM3_NEON=y # CONFIG_CRYPTO_SM3_ARM64_CE is not set CONFIG_CRYPTO_POLYVAL_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64=y CONFIG_CRYPTO_AES_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64_CE_BLK=y CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y CONFIG_CRYPTO_AES_ARM64_BS=y # CONFIG_CRYPTO_SM4_ARM64_CE is not set CONFIG_CRYPTO_SM4_ARM64_CE_BLK=y CONFIG_CRYPTO_SM4_ARM64_NEON_BLK=y CONFIG_CRYPTO_AES_ARM64_CE_CCM=y # end of Accelerated Cryptographic Algorithms for CPU (arm64) CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_ATMEL_ECC is not set # CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set # CONFIG_CRYPTO_DEV_CCP is not set # CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set # CONFIG_CRYPTO_DEV_QAT_C3XXX is not set # CONFIG_CRYPTO_DEV_QAT_C62X is not set # CONFIG_CRYPTO_DEV_QAT_4XXX is not set # CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set # CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set # CONFIG_CRYPTO_DEV_QAT_C62XVF is not set # CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set # CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set CONFIG_CRYPTO_DEV_ROCKCHIP=m CONFIG_CRYPTO_DEV_VIRTIO=m # CONFIG_CRYPTO_DEV_SAFEXCEL is not set # CONFIG_CRYPTO_DEV_CCREE is not set # CONFIG_CRYPTO_DEV_HISI_SEC is not set # CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS8_PRIVATE_KEY_PARSER=m CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m CONFIG_RAID6_PQ_BENCHMARK=y CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_CORDIC=m # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y # CONFIG_INDIRECT_PIO is not set # # Crypto library routines # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y CONFIG_CRYPTO_LIB_CHACHA=m CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m CONFIG_CRYPTO_LIB_CURVE25519=m CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y CONFIG_CRYPTO_LIB_POLY1305=m CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_CRC_CCITT=m CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC64_ROCKSOFT is not set CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set CONFIG_CRC7=y CONFIG_LIBCRC32C=m # CONFIG_CRC8 is not set CONFIG_XXHASH=y CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=m CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=m CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y CONFIG_XZ_DEC_POWERPC=y CONFIG_XZ_DEC_IA64=y CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y CONFIG_XZ_DEC_SPARC=y # CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_LZ4=y CONFIG_DECOMPRESS_ZSTD=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_INTERVAL_TREE=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_DMA_DECLARE_COHERENT=y CONFIG_ARCH_HAS_SETUP_DMA_OPS=y CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y CONFIG_SWIOTLB=y # CONFIG_DMA_RESTRICTED_POOL is not set CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_COHERENT_POOL=y CONFIG_DMA_DIRECT_REMAP=y CONFIG_DMA_CMA=y # CONFIG_DMA_PERNUMA_CMA is not set # # Default contiguous memory area size: # CONFIG_CMA_SIZE_MBYTES=64 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_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y # CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_TIME_NS=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_ARCH_STACKWALK=y CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y # end of Library routines CONFIG_GENERIC_IOREMAP=y CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set # CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_SYMBOLIC_ERRNAME=y CONFIG_DEBUG_BUGVERBOSE=y # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Compile-time checks and compiler options # CONFIG_DEBUG_INFO=y CONFIG_AS_HAS_NON_CONST_LEB128=y # CONFIG_DEBUG_INFO_NONE is not set CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_INFO_COMPRESSED is not set # CONFIG_DEBUG_INFO_SPLIT is not set # CONFIG_DEBUG_INFO_BTF is not set # CONFIG_GDB_SCRIPTS is not set CONFIG_FRAME_WARN=2048 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set CONFIG_HAVE_KCSAN_COMPILER=y # end of Generic Kernel Debugging Instruments # # Networking Debugging # # CONFIG_NET_DEV_REFCNT_TRACKER is not set # CONFIG_NET_NS_REFCNT_TRACKER is not set # CONFIG_DEBUG_NET is not set # end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_PTDUMP_DEBUGFS is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM_PGTABLE is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_KASAN_SW_TAGS=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y # CONFIG_KFENCE is not set # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 # CONFIG_SOFTLOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # # CONFIG_SCHED_DEBUG is not set CONFIG_SCHED_INFO=y # CONFIG_SCHEDSTATS is not set # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_SAMPLES is not set CONFIG_STRICT_DEVMEM=y # CONFIG_IO_STRICT_DEVMEM is not set # # arm64 Debugging # # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_ARM64_RELOC_TEST is not set # CONFIG_CORESIGHT is not set # end of arm64 Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_RUNTIME_TESTING_MENU is not set CONFIG_ARCH_USE_MEMTEST=y CONFIG_MEMTEST=y # end of Kernel Testing and Coverage # # Rust hacking # # end of Rust hacking # end of Kernel hacking ================================================ FILE: projects/Rockchip/devices/RK3399/options ================================================ ################################################################################ # setup device defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) TARGET_CPU="cortex-a72.cortex-a53" TARGET_CPU_FLAGS="+crc+crypto" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a72.cortex-a53" TARGET_CPU_FLAGS="+crc" TARGET_FPU="crypto-neon-fp-armv8" ;; esac # Firmware UBOOT_FIRMWARE+=" atf" ATF_PLATFORM="rk3399" ATF_BL31_BINARY="bl31/bl31.elf" # Kernel target KERNEL_TARGET="Image" # Mali GPU family MALI_FAMILY="t860" GRAPHIC_DRIVERS="panfrost" # kernel serial console EXTRA_CMDLINE="console=uart8250,mmio32,0xff1a0000 console=tty0 coherent_pool=2M cec.debounce_ms=5000" # set the addon project ADDON_PROJECT="ARMv8" # additional packages ADDITIONAL_PACKAGES+=" pciutils" ================================================ FILE: projects/Rockchip/devices/RK356x/README.md ================================================ # RK356x This is for RK356x devices using RK3566 and RK3568 SOCs **Build** * `PROJECT=Rockchip DEVICE=RK356x ARCH=aarch64 make image` ================================================ FILE: projects/Rockchip/devices/RK356x/bootloader/canupdate.sh ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # Allow upgrades between arm and aarch64 if [ "$1" = "@PROJECT@.arm" -o "$1" = "@PROJECT@.aarch64" ]; then exit 0 else exit 1 fi ================================================ FILE: projects/Rockchip/devices/RK356x/bootloader/config ================================================ CONFIG_BOOTDELAY=1 # CONFIG_EFI_LOADER is not set CONFIG_FIT=y CONFIG_FIT_SIGNATURE=n ================================================ FILE: projects/Rockchip/devices/RK356x/bootloader/install ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_RKBIN="$(get_build_dir rkbin)" PKG_SOC=$UBOOT_SYSTEM if [ "$DEVICE" = "RK3328" -o "$DEVICE" = "RK3399" ]; then PKG_SOC="${DEVICE/RK/rk}" fi if [ "$DEVICE" = "RK3568" ]; then PKG_SOC="rk3568" fi if [ "$DEVICE" == "OdroidGoAdvance" ]; then PKG_SOC="px30" fi case "$PKG_SOC" in rk3036) PKG_DATAFILE="spl/u-boot-spl-nodtb.bin" PKG_LOADER="u-boot-dtb.bin" ;; rk3288) PKG_DATAFILE="$PKG_RKBIN/rk32/rk3288_ddr_400MHz_v1.06.bin" PKG_LOADER="$PKG_RKBIN/rk32/rk3288_miniloader_v2.36.bin" PKG_LOAD_ADDR="0x0" ;; px30) PKG_DATAFILE="$PKG_RKBIN/bin/rk33/rk3326_ddr_333MHz_v1.14.bin" PKG_LOADER="$PKG_RKBIN/bin/rk33/rk3326_miniloader_v1.20.bin" PKG_BL31="$PKG_RKBIN/bin/rk33/rk3326_bl31_v1.18.elf" PKG_BL32="$PKG_RKBIN/bin/rk33/rk3326_bl32_v1.13.bin" PKG_LOAD_ADDR="0x00200000" ;; rk3328) PKG_DATAFILE="$PKG_RKBIN/rk33/rk3328_ddr_786MHz_v1.13.bin" PKG_LOADER="$PKG_RKBIN/rk33/rk3328_miniloader_v2.49.bin" PKG_BL31="$PKG_RKBIN/rk33/rk3328_bl31_v1.40.elf" PKG_LOAD_ADDR="0x200000" ;; rk3399) PKG_DATAFILE="$PKG_RKBIN/rk33/rk3399_ddr_800MHz_v1.17.bin" PKG_LOADER="$PKG_RKBIN/rk33/rk3399_miniloader_v1.15.bin" PKG_BL31="$PKG_RKBIN/rk33/rk3399_bl31_v1.24.elf" PKG_LOAD_ADDR="0x200000" ;; rk3568) PKG_DATAFILE="$PKG_RKBIN/bin/rk35/rk3568_ddr_1560MHz_v1.05-firefly.bin" PKG_LOADER="$PKG_RKBIN/bin/rk35/rk3568_miniloader_spinand_v1.09.bin" PKG_BL31="$PKG_RKBIN/bin/rk35/rk3568_bl31_v1.28.elf" PKG_BL32="$PKG_RKBIN/bin/rk35/rk3568_bl32_v1.05.bin" PKG_LOAD_ADDR="0x0a100000" ;; *) PKG_DATAFILE="spl/u-boot-spl-dtb.bin" PKG_LOADER="u-boot-dtb.bin" ;; esac #if [ -n "$PKG_DATAFILE" -a -n "$PKG_LOADER" ]; then # tools/mkimage -n $PKG_SOC -T rksd -d "$PKG_DATAFILE" idbloader.img # echo "tools/mkimage -n $PKG_SOC -T rksd -d \"$PKG_DATAFILE\" idbloader.img" # cat "$PKG_LOADER" >> idbloader.img # cp -av idbloader.img $INSTALL/usr/share/bootloader #fi #./scripts/fit.sh --ini-trust $(get_build_dir rkbin)/RKTRUST/RK3568TRUST.ini --ini-loader $(get_build_dir rkbin)/RKBOOT/RK3568MINIALL.ini --chip RK3568 #cp -av rk356x_spl_loader_v1.09.111.bin $INSTALL/usr/share/bootloader/idbloader.img #cp -av rk356x_spl_loader_v1.09.111.bin $INSTALL/usr/share/bootloader cp -av idblock.bin $INSTALL/usr/share/bootloader/idbloader.img mv idblock.bin idbloader.img cp -av uboot.img $INSTALL/usr/share/bootloader #if [ -n "$PKG_LOAD_ADDR" ]; then # echo "$PKG_RKBIN/tools/loaderimage --pack --uboot u-boot-dtb.bin uboot.img $PKG_LOAD_ADDR" # $PKG_RKBIN/tools/loaderimage --pack --uboot u-boot-dtb.bin uboot.img $PKG_LOAD_ADDR # cp -av uboot.img $INSTALL/usr/share/bootloader #fi LE_TMP=$(mktemp -d) mkdir -p "${LE_TMP}/extlinux" mkdir -p $INSTALL/usr/share/bootloader/extlinux LINUX_DTS_DIR=$(get_build_dir linux)/.install_pkg/usr/share/bootloader for dtb in $LINUX_DTS_DIR/*.dtb; do if [ ! -f $dtb ]; then continue fi cat << EOF > "${LE_TMP}/extlinux/$(basename ${dtb}).conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDT /$(basename ${dtb}) APPEND boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@ quiet ${EXTRA_CMDLINE} EOF cp -a "${LE_TMP}/extlinux/$(basename ${dtb}).conf" $INSTALL/usr/share/bootloader/extlinux done ================================================ FILE: projects/Rockchip/devices/RK356x/bootloader/mkimage ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) if [ -f "$RELEASE_DIR/3rdparty/bootloader/idbloader.img" ]; then echo "image: burn RK356x idblock.img to image..." dd if="$RELEASE_DIR/3rdparty/bootloader/idbloader.img" of="$DISK" bs=32k seek=1 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/uboot.img" ]; then echo "image: burn RK356x uboot.img to image..." dd if="$RELEASE_DIR/3rdparty/bootloader/uboot.img" of="$DISK" bs=64k seek=128 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/trust.img" ]; then echo "image: burn RK356x trust.img to image..." dd if="$RELEASE_DIR/3rdparty/bootloader/trust.img" of="$DISK" bs=64k seek=192 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error fi if [ -f "$RELEASE_DIR/3rdparty/bootloader/boot.ini" ]; then echo "image: copying boot.ini to root" mcopy "$RELEASE_DIR/3rdparty/bootloader/boot.ini" :: fi mkdir -p "${LE_TMP}/extlinux" # copy device trees to part1 for dtb in $RELEASE_DIR/3rdparty/bootloader/*.dtb; do if [ ! -f $dtb ]; then continue fi cat << EOF > "${LE_TMP}/extlinux/$(basename ${dtb}).conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDT /$(basename ${dtb}) APPEND boot=UUID=${UUID_SYSTEM} disk=UUID=${UUID_STORAGE} quiet ${EXTRA_CMDLINE} EOF [ -e "$dtb" ] && mcopy -o "$dtb" :: done mcopy -so "${LE_TMP}/extlinux" :: ================================================ FILE: projects/Rockchip/devices/RK356x/bootloader/release ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) mkdir -p $RELEASE_DIR/3rdparty/bootloader if [ -n "$UBOOT_SYSTEM" ]; then BOOTLOADER_DIR=$(get_build_dir $BOOTLOADER) if [ -f $BOOTLOADER_DIR/idbloader.img ]; then cp -a $BOOTLOADER_DIR/idbloader.img $RELEASE_DIR/3rdparty/bootloader fi if [ -f $BOOTLOADER_DIR/uboot.img ]; then cp -a $BOOTLOADER_DIR/uboot.img $RELEASE_DIR/3rdparty/bootloader fi if [ -f $BOOTLOADER_DIR/trust.img ]; then cp -a $BOOTLOADER_DIR/trust.img $RELEASE_DIR/3rdparty/bootloader fi fi if [ -f $INSTALL/usr/share/bootloader/boot.ini ]; then cp -a $INSTALL/usr/share/bootloader/boot.ini $RELEASE_DIR/3rdparty/bootloader fi LINUX_DTS_DIR=$(get_build_dir linux)/arch/$TARGET_KERNEL_ARCH/boot/dts for dtb in $LINUX_DTS_DIR/*.dtb $LINUX_DTS_DIR/*/*.dtb; do if [ -f $dtb ]; then cp -a $dtb $RELEASE_DIR/3rdparty/bootloader fi done LE_TMP=$(mktemp -d) mkdir -p "${LE_TMP}/extlinux" mkdir -p $RELEASE_DIR/3rdparty/bootloader LINUX_DTS_DIR=$(get_build_dir linux)/.install_pkg/usr/share/bootloader for dtb in $RELEASE_DIR/3rdparty/bootloader/*.dtb; do if [ ! -f $dtb ]; then continue fi cat << EOF > "${LE_TMP}/extlinux/$(basename ${dtb}).conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDT /$(basename ${dtb}) APPEND boot=UUID=@BOOT_UUID@ disk=UUID=@DISK_UUID@ quiet ${EXTRA_CMDLINE} EOF cp -a "${LE_TMP}/extlinux/$(basename ${dtb}).conf" $RELEASE_DIR/3rdparty/bootloader done ================================================ FILE: projects/Rockchip/devices/RK356x/bootloader/update.sh ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) [ -z "$SYSTEM_ROOT" ] && SYSTEM_ROOT="" [ -z "$BOOT_ROOT" ] && BOOT_ROOT="/flash" [ -z "$BOOT_PART" ] && BOOT_PART=$(df "$BOOT_ROOT" | tail -1 | awk {' print $1 '}) if [ -z "$BOOT_DISK" ]; then case $BOOT_PART in /dev/sd[a-z][0-9]*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,[0-9]*,,g") ;; /dev/mmcblk*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,p[0-9]*,,g") ;; esac fi # mount $BOOT_ROOT r/w mount -o remount,rw $BOOT_ROOT for arg in $(cat /proc/cmdline); do case $arg in boot=*) boot="${arg#*=}" case $boot in /dev/mmc*) BOOT_UUID="$(blkid $boot | sed 's/.* UUID="//;s/".*//g')" ;; UUID=*|LABEL=*) BOOT_UUID="$(blkid | sed 's/"//g' | grep -m 1 -i " $boot " | sed 's/.* UUID=//;s/ .*//g')" ;; FOLDER=*) BOOT_UUID="$(blkid ${boot#*=} | sed 's/.* UUID="//;s/".*//g')" ;; esac ;; disk=*) disk="${arg#*=}" case $disk in /dev/mmc*) DISK_UUID="$(blkid $disk | sed 's/.* UUID="//;s/".*//g')" ;; UUID=*|LABEL=*) DISK_UUID="$(blkid | sed 's/"//g' | grep -m 1 -i " $disk " | sed 's/.* UUID=//;s/ .*//g')" ;; FOLDER=*) DISK_UUID="$(blkid ${disk#*=} | sed 's/.* UUID="//;s/".*//g')" ;; esac ;; esac done CONFS=$SYSTEM_ROOT/usr/share/bootloader/extlinux/*.conf for all_conf in $CONFS; do conf="$(basename ${all_conf})" echo "Updating ${conf}..." cp -p $SYSTEM_ROOT/usr/share/bootloader/extlinux/${conf} $BOOT_ROOT/extlinux/${conf} sed -e "s/@BOOT_UUID@/$BOOT_UUID/" \ -e "s/@DISK_UUID@/$DISK_UUID/" \ -i $BOOT_ROOT/extlinux/${conf} done if [ -f $SYSTEM_ROOT/usr/share/bootloader/boot.ini ]; then echo "Updating boot.ini..." cp -p $SYSTEM_ROOT/usr/share/bootloader/boot.ini $BOOT_ROOT/boot.ini fi # update device tree for all_dtb in $SYSTEM_ROOT/usr/share/bootloader/*.dtb; do dtb=$(basename $all_dtb) echo -n "Updating $dtb... " cp -p $SYSTEM_ROOT/usr/share/bootloader/$dtb $BOOT_ROOT echo "done" done # update bootloader if [ -f $SYSTEM_ROOT/usr/share/bootloader/idbloader.img ]; then echo -n "Updating idbloader.img... " dd if=$SYSTEM_ROOT/usr/share/bootloader/idbloader.img of=$BOOT_DISK bs=32k seek=1 conv=fsync &>/dev/null echo "done" fi if [ -f $SYSTEM_ROOT/usr/share/bootloader/uboot.img ]; then echo -n "Updating uboot.img... " dd if=$SYSTEM_ROOT/usr/share/bootloader/uboot.img of=$BOOT_DISK bs=64k seek=128 conv=fsync &>/dev/null echo "done" fi if [ -f $SYSTEM_ROOT/usr/share/bootloader/trust.img ]; then echo -n "Updating trust.img... " dd if=$SYSTEM_ROOT/usr/share/bootloader/trust.img of=$BOOT_DISK bs=64k seek=192 conv=fsync &>/dev/null echo "done" fi # mount $BOOT_ROOT r/o sync mount -o remount,ro $BOOT_ROOT # Leave a hint that we just did an update echo "UPDATE" > /storage/.config/boot.hint ================================================ FILE: projects/Rockchip/devices/RK356x/linux/rk356x-4.19/linux.aarch64.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm64 4.19.206 Kernel Configuration # # # Compiler: aarch64-libreelec-linux-gnueabi-gcc-10.3.0 (GCC) 10.3.0 # CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=100300 CONFIG_CLANG_VERSION=0 CONFIG_LLD_VERSION=0 CONFIG_CC_HAS_ASM_GOTO=y CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_EXTABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_LZ4=y CONFIG_KERNEL_GZIP=y # CONFIG_KERNEL_LZ4 is not set CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y # CONFIG_POSIX_MQUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_HANDLE_DOMAIN_IRQ=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set CONFIG_GENERIC_IRQ_MULTI_HANDLER=y CONFIG_ARCH_CLOCKSOURCE_DATA=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_TASKSTATS is not set # CONFIG_PSI is not set CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y CONFIG_BUILD_BIN2C=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_CGROUPS=y # CONFIG_MEMCG is not set CONFIG_BLK_CGROUP=y # CONFIG_DEBUG_BLK_CGROUP is not set CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set # CONFIG_CGROUP_PIDS is not set # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y # CONFIG_CGROUP_PERF is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SCHED_TUNE is not set # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE=" " CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 CONFIG_RD_GZIP=y CONFIG_RD_BZIP2=y CONFIG_RD_LZMA=y CONFIG_RD_XZ=y CONFIG_RD_LZO=y CONFIG_RD_LZ4=y CONFIG_INITRAMFS_COMPRESSION=".gz" # CONFIG_INITRD_ASYNC is not set # CONFIG_ROCKCHIP_ONE_INITRD is not set # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_BPF=y CONFIG_EXPERT=y CONFIG_UID16=y CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set CONFIG_SYSFS_SYSCALL=y # CONFIG_SYSCTL_SYSCALL is not set CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y CONFIG_ADVISE_SYSCALLS=y CONFIG_MEMBARRIER=y CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_BASE_RELATIVE=y # CONFIG_BPF_SYSCALL is not set # CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y # CONFIG_PC104 is not set # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLUB_SYSFS=y CONFIG_SLUB_DEBUG=y # CONFIG_COMPAT_BRK is not set # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLOB is not set CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set CONFIG_SLUB_CPU_PARTIAL=y CONFIG_SYSTEM_DATA_VERIFICATION=y CONFIG_PROFILING=y CONFIG_TRACEPOINTS=y CONFIG_ARM64=y CONFIG_64BIT=y CONFIG_MMU=y CONFIG_ARM64_PAGE_SHIFT=12 CONFIG_ARM64_CONT_SHIFT=4 CONFIG_ARCH_MMAP_RND_BITS_MIN=18 CONFIG_ARCH_MMAP_RND_BITS_MAX=24 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_STACKTRACE_SUPPORT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_LOCKDEP_SUPPORT=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CSUM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ZONE_DMA32=y CONFIG_HAVE_GENERIC_GUP=y CONFIG_SMP=y CONFIG_KERNEL_MODE_NEON=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_PGTABLE_LEVELS=3 CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_ARCH_PROC_KCORE_TEXT=y # # Platform selection # # CONFIG_ARCH_ACTIONS is not set # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_BCM2835 is not set # CONFIG_ARCH_BCM_IPROC is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_BRCMSTB is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_K3 is not set # CONFIG_ARCH_LAYERSCAPE is not set # CONFIG_ARCH_LG1K is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_MEDIATEK is not set # CONFIG_ARCH_MESON is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_REALTEK is not set CONFIG_ARCH_ROCKCHIP=y # CONFIG_ARCH_SEATTLE is not set # CONFIG_ARCH_SYNQUACER is not set # CONFIG_ARCH_RENESAS is not set # CONFIG_ARCH_STRATIX10 is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_SPRD is not set # CONFIG_ARCH_THUNDER is not set # CONFIG_ARCH_THUNDER2 is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_XGENE is not set # CONFIG_ARCH_ZX is not set # CONFIG_ARCH_ZYNQMP is not set # # Bus support # CONFIG_PCI=y CONFIG_PCI_DOMAINS=y CONFIG_PCI_DOMAINS_GENERIC=y CONFIG_PCI_SYSCALL=y CONFIG_PCIEPORTBUS=y CONFIG_PCIEAER=y # CONFIG_PCIEAER_INJECT is not set # CONFIG_PCIE_ECRC is not set CONFIG_PCIEASPM=y # CONFIG_PCIEASPM_DEBUG is not set CONFIG_PCIEASPM_DEFAULT=y # CONFIG_PCIEASPM_POWERSAVE is not set # CONFIG_PCIEASPM_POWER_SUPERSAVE is not set # CONFIG_PCIEASPM_PERFORMANCE is not set CONFIG_PCIE_PME=y # CONFIG_PCIE_DPC is not set # CONFIG_PCIE_PTM is not set CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y CONFIG_PCI_QUIRKS=y # CONFIG_PCI_DEBUG is not set # CONFIG_PCI_STUB is not set # CONFIG_PCI_IOV is not set # CONFIG_PCI_PRI is not set # CONFIG_PCI_PASID is not set # CONFIG_HOTPLUG_PCI is not set # # PCI controller drivers # # # Cadence PCIe controllers support # # CONFIG_PCIE_CADENCE_HOST is not set # CONFIG_PCI_FTPCI100 is not set # CONFIG_PCI_HOST_GENERIC is not set # CONFIG_PCIE_XILINX is not set # CONFIG_PCI_XGENE is not set # CONFIG_PCI_HOST_THUNDER_PEM is not set # CONFIG_PCI_HOST_THUNDER_ECAM is not set # CONFIG_PCIE_ROCKCHIP_HOST is not set # CONFIG_ROCKCHIP_PCIE_DMA_OBJ is not set # # DesignWare PCI Core Support # CONFIG_PCIE_DW=y CONFIG_PCIE_DW_HOST=y # CONFIG_PCIE_DW_PLAT_HOST is not set CONFIG_PCIE_DW_ROCKCHIP=y # CONFIG_PCI_HISI is not set # CONFIG_PCIE_KIRIN is not set # # PCI Endpoint # # CONFIG_PCI_ENDPOINT is not set # # PCI switch controller drivers # # CONFIG_PCI_SW_SWITCHTEC is not set # # Kernel Features # # # ARM errata workarounds via the alternatives framework # # CONFIG_ARM64_ERRATUM_826319 is not set # CONFIG_ARM64_ERRATUM_827319 is not set # CONFIG_ARM64_ERRATUM_824069 is not set # CONFIG_ARM64_ERRATUM_819472 is not set # CONFIG_ARM64_ERRATUM_832075 is not set CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_ERRATUM_1024718=y CONFIG_ARM64_ERRATUM_1463225=y CONFIG_ARM64_ERRATUM_1542419=y # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set CONFIG_CAVIUM_ERRATUM_27456=y CONFIG_CAVIUM_ERRATUM_30115=y CONFIG_QCOM_FALKOR_ERRATUM_1003=y CONFIG_QCOM_FALKOR_ERRATUM_1009=y CONFIG_QCOM_QDF2400_ERRATUM_0065=y CONFIG_SOCIONEXT_SYNQUACER_PREITS=y CONFIG_HISILICON_ERRATUM_161600802=y CONFIG_QCOM_FALKOR_ERRATUM_E1041=y CONFIG_ARM64_4K_PAGES=y # CONFIG_ARM64_16K_PAGES is not set # CONFIG_ARM64_64K_PAGES is not set CONFIG_ARM64_VA_BITS_39=y # CONFIG_ARM64_VA_BITS_48 is not set CONFIG_ARM64_VA_BITS=39 CONFIG_ARM64_PA_BITS_48=y CONFIG_ARM64_PA_BITS=48 # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_SCHED_MC=y # CONFIG_SCHED_SMT is not set CONFIG_NR_CPUS=8 CONFIG_HOTPLUG_CPU=y # CONFIG_NUMA is not set CONFIG_HOLES_IN_ZONE=y # CONFIG_HZ_100 is not set # CONFIG_HZ_250 is not set CONFIG_HZ_300=y # CONFIG_HZ_1000 is not set CONFIG_HZ=300 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ARCH_FLATMEM_ENABLE=y CONFIG_HAVE_ARCH_PFN_VALID=y CONFIG_HW_PERF_EVENTS=y CONFIG_SYS_SUPPORTS_HUGETLBFS=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y # CONFIG_ARM64_DMA_USE_IOMMU is not set CONFIG_SECCOMP=y # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_KEXEC is not set # CONFIG_CRASH_DUMP is not set # CONFIG_XEN is not set CONFIG_FORCE_MAX_ZONEORDER=11 CONFIG_UNMAP_KERNEL_AT_EL0=y CONFIG_HARDEN_BRANCH_PREDICTOR=y CONFIG_HARDEN_EL2_VECTORS=y CONFIG_ARM64_SSBD=y CONFIG_ARM64_TAGGED_ADDR_ABI=y CONFIG_ARMV8_DEPRECATED=y CONFIG_SWP_EMULATION=y CONFIG_CP15_BARRIER_EMULATION=y CONFIG_SETEND_EMULATION=y # CONFIG_ARM64_SW_TTBR0_PAN is not set # # ARMv8.1 architectural features # CONFIG_ARM64_HW_AFDBM=y CONFIG_ARM64_PAN=y CONFIG_ARM64_LSE_ATOMICS=y CONFIG_ARM64_VHE=y # # ARMv8.2 architectural features # CONFIG_ARM64_UAO=y # CONFIG_ARM64_PMEM is not set CONFIG_ARM64_RAS_EXTN=y CONFIG_ARM64_SVE=y CONFIG_ARM64_MODULE_PLTS=y # CONFIG_RANDOMIZE_BASE is not set # # Boot options # CONFIG_CMDLINE="" # CONFIG_EFI is not set CONFIG_COMPAT=y CONFIG_KUSER_HELPERS=y CONFIG_SYSVIPC_COMPAT=y # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_SUSPEND_SKIP_SYNC is not set CONFIG_HAS_WAKELOCK=y CONFIG_WAKELOCK=y # CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y CONFIG_PM_DEBUG=y CONFIG_PM_ADVANCED_DEBUG=y # CONFIG_PM_TEST_SUSPEND is not set CONFIG_PM_SLEEP_DEBUG=y # CONFIG_DPM_WATCHDOG is not set CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y CONFIG_PM_GENERIC_DOMAINS_SLEEP=y CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y CONFIG_ENERGY_MODEL=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y # # CPU Power Management # # # CPU Idle # 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_DT_IDLE_STATES=y # # ARM CPU Idle Drivers # CONFIG_ARM_CPUIDLE=y # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y # CONFIG_CPU_FREQ_STAT is not set # CONFIG_CPU_FREQ_TIMES is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE=y CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y # CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_INTERACTIVE=y # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y # CONFIG_CPUFREQ_DUMMY is not set # CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set CONFIG_ARM_ROCKCHIP_CPUFREQ=y # CONFIG_ARM_SCMI_CPUFREQ is not set # CONFIG_QORIQ_CPUFREQ is not set # # Firmware Drivers # CONFIG_ARM_PSCI_FW=y # CONFIG_ARM_PSCI_CHECKER is not set CONFIG_ARM_SCMI_PROTOCOL=y CONFIG_ARM_SCMI_POWER_DOMAIN=y # CONFIG_ARM_SCPI_PROTOCOL is not set # CONFIG_ARM_SDE_INTERFACE is not set # CONFIG_FIRMWARE_MEMMAP is not set # CONFIG_FW_CFG_SYSFS is not set CONFIG_ROCKCHIP_SIP=y CONFIG_HAVE_ARM_SMCCC=y # CONFIG_GOOGLE_FIRMWARE is not set # # Tegra firmware driver # # CONFIG_VIRTUALIZATION is not set CONFIG_ARM64_CRYPTO=y CONFIG_CRYPTO_SHA256_ARM64=y # CONFIG_CRYPTO_SHA512_ARM64 is not set CONFIG_CRYPTO_SHA1_ARM64_CE=y CONFIG_CRYPTO_SHA2_ARM64_CE=y # CONFIG_CRYPTO_SHA512_ARM64_CE is not set # CONFIG_CRYPTO_SHA3_ARM64 is not set # CONFIG_CRYPTO_SM3_ARM64_CE is not set # CONFIG_CRYPTO_SM4_ARM64_CE is not set CONFIG_CRYPTO_GHASH_ARM64_CE=y # CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set # CONFIG_CRYPTO_CRC32_ARM64_CE is not set CONFIG_CRYPTO_AES_ARM64=y CONFIG_CRYPTO_AES_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64_CE_CCM=y CONFIG_CRYPTO_AES_ARM64_CE_BLK=y # CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set # CONFIG_CRYPTO_CHACHA20_NEON is not set # CONFIG_CRYPTO_POLY1305_NEON is not set # CONFIG_CRYPTO_AES_ARM64_BS is not set # # General architecture-dependent options # # CONFIG_KPROBES is not set # CONFIG_JUMP_LABEL is not set CONFIG_UPROBES=y CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_NMI=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y 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_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_CLK=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_RCU_TABLE_FREE=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP_FILTER=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_CC_HAS_STACKPROTECTOR_NONE=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_ARCH_SUPPORTS_LTO_CLANG=y CONFIG_ARCH_SUPPORTS_THINLTO=y CONFIG_LTO_NONE=y CONFIG_HAVE_CONTEXT_TRACKING=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=18 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_REFCOUNT_FULL=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y CONFIG_PLUGIN_HOSTCC="" CONFIG_HAVE_GCC_PLUGINS=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y CONFIG_MODULE_FORCE_LOAD=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set # CONFIG_MODULE_COMPRESS is not set # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLK_SCSI_REQUEST=y CONFIG_BLK_DEV_BSG=y # CONFIG_BLK_DEV_BSGLIB is not set # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set # CONFIG_BLK_DEV_THROTTLING is not set # CONFIG_BLK_CMDLINE_PARSER is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_CGROUP_IOLATENCY is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set CONFIG_BLOCK_COMPAT=y CONFIG_BLK_MQ_PCI=y # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y # CONFIG_CFQ_GROUP_IOSCHED is not set # CONFIG_DEFAULT_DEADLINE is not set CONFIG_DEFAULT_CFQ=y # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="cfq" CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y # CONFIG_IOSCHED_BFQ is not set CONFIG_ASN1=y CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y CONFIG_ARCH_INLINE_SPIN_LOCK=y CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_SPIN_UNLOCK=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y CONFIG_ARCH_INLINE_READ_LOCK=y CONFIG_ARCH_INLINE_READ_LOCK_BH=y CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_READ_UNLOCK=y CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y CONFIG_ARCH_INLINE_WRITE_LOCK=y CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y CONFIG_ARCH_INLINE_WRITE_UNLOCK=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y CONFIG_QUEUED_SPINLOCKS=y CONFIG_ARCH_USE_QUEUED_RWLOCKS=y CONFIG_QUEUED_RWLOCKS=y CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y # CONFIG_GKI_HIDDEN_DRM_CONFIGS is not set # CONFIG_GKI_HIDDEN_REGMAP_CONFIGS is not set # CONFIG_GKI_HIDDEN_CRYPTO_CONFIGS is not set # CONFIG_GKI_HIDDEN_SND_CONFIGS is not set # CONFIG_GKI_HIDDEN_SND_SOC_CONFIGS is not set # CONFIG_GKI_HIDDEN_GPIO_CONFIGS is not set # CONFIG_GKI_HIDDEN_VIRTUAL_CONFIGS is not set # CONFIG_GKI_LEGACY_WEXT_ALLCONFIG is not set # CONFIG_GKI_HIDDEN_SOC_PM_CONFIGS is not set # CONFIG_GKI_HIDDEN_VIDEOBUF2_CONFIGS is not set # CONFIG_GKI_HIDDEN_USB_CONFIGS is not set # CONFIG_GKI_HIDDEN_SOC_BUS_CONFIGS is not set # CONFIG_GKI_HIDDEN_GPU_CONFIGS is not set # CONFIG_GKI_HIDDEN_IRQ_CONFIGS is not set # CONFIG_GKI_HACKS_TO_FIX is not set CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ELFCORE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y # # Memory Management options # CONFIG_SELECT_MEMORY_MODEL=y # CONFIG_FLATMEM_MANUAL is not set CONFIG_SPARSEMEM_MANUAL=y CONFIG_SPARSEMEM=y CONFIG_HAVE_MEMORY_PRESENT=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_MEMBLOCK=y CONFIG_NO_BOOTMEM=y CONFIG_MEMORY_ISOLATION=y CONFIG_SPLIT_PTLOCK_CPUS=4 # CONFIG_COMPACTION is not set CONFIG_MIGRATION=y CONFIG_PHYS_ADDR_T_64BIT=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set # CONFIG_TRANSPARENT_HUGEPAGE is not set # CONFIG_CLEANCACHE is not set # CONFIG_FRONTSWAP is not set CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set # CONFIG_CMA_DEBUGFS is not set CONFIG_CMA_AREAS=7 # CONFIG_ZPOOL is not set # CONFIG_ZBUD is not set CONFIG_ZSMALLOC=y # CONFIG_PGTABLE_MAPPING is not set # CONFIG_ZSMALLOC_STAT is not set # CONFIG_MM_EVENT_STAT is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_FRAME_VECTOR=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_BENCHMARK is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y CONFIG_NET_INGRESS=y # # Networking options # 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 CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_INTERFACE is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set # CONFIG_IP_MULTIPLE_TABLES is not set # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set # CONFIG_IP_PNP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_IP_MROUTE_COMMON=y CONFIG_IP_MROUTE=y # CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set # CONFIG_IP_PIMSM_V1 is not set # CONFIG_IP_PIMSM_V2 is not set CONFIG_SYN_COOKIES=y # CONFIG_NET_FOU is not set # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_DIAG is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_INET6_XFRM_MODE_TRANSPORT is not set # CONFIG_INET6_XFRM_MODE_TUNNEL is not set # CONFIG_INET6_XFRM_MODE_BEET is not set # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set # CONFIG_IPV6_SIT is not set # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NET_PTP_CLASSIFY=y # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y # CONFIG_BRIDGE_NETFILTER is not set # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set # CONFIG_NETFILTER_NETLINK_LOG is not set # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=y # CONFIG_NF_LOG_NETDEV is not set # CONFIG_NF_CONNTRACK_MARK is not set # CONFIG_NF_CONNTRACK_ZONES is not set CONFIG_NF_CONNTRACK_PROCFS=y # CONFIG_NF_CONNTRACK_EVENTS is not set # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y # CONFIG_NF_CONNTRACK_AMANDA is not set # CONFIG_NF_CONNTRACK_FTP is not set # CONFIG_NF_CONNTRACK_H323 is not set # CONFIG_NF_CONNTRACK_IRC is not set # CONFIG_NF_CONNTRACK_NETBIOS_NS is not set # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set # CONFIG_NF_CONNTRACK_SIP is not set # CONFIG_NF_CONNTRACK_TFTP is not set # CONFIG_NF_CT_NETLINK is not set CONFIG_NF_NAT=y CONFIG_NF_NAT_NEEDED=y CONFIG_NF_NAT_PROTO_DCCP=y CONFIG_NF_NAT_PROTO_UDPLITE=y CONFIG_NF_NAT_PROTO_SCTP=y # CONFIG_NF_TABLES is not set CONFIG_NETFILTER_XTABLES=y # # Xtables combined modules # # CONFIG_NETFILTER_XT_MARK is not set # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=y # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set # CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set # CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_NETFILTER_XT_MATCH_OWNER is not set # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA2 is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set CONFIG_NETFILTER_XT_MATCH_STATE=y # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # CONFIG_IP_SET is not set # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=y # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set CONFIG_NF_REJECT_IPV4=y CONFIG_NF_NAT_IPV4=y CONFIG_NF_NAT_MASQUERADE_IPV4=y CONFIG_IP_NF_IPTABLES=y # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=y CONFIG_IP_NF_TARGET_MASQUERADE=y # CONFIG_IP_NF_TARGET_NETMAP is not set # CONFIG_IP_NF_TARGET_REDIRECT is not set CONFIG_IP_NF_MANGLE=y # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_ARPTABLES is not set # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # 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=y # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=y CONFIG_BRIDGE=y CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_HAVE_NET_DSA=y # CONFIG_NET_DSA is not set # CONFIG_VLAN_8021Q is not set # CONFIG_DECNET is not set CONFIG_LLC=y # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set # CONFIG_NET_SCHED is not set # CONFIG_DCB is not set # CONFIG_DNS_RESOLVER is not set # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set # CONFIG_NET_L3_MASTER_DEV is not set # CONFIG_NET_NCSI is not set CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_XPS=y # CONFIG_CGROUP_NET_PRIO is not set # CONFIG_CGROUP_NET_CLASSID is not set CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_JIT is not set CONFIG_ETHTOOL=y CONFIG_FILTER=y CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # CONFIG_HAMRADIO is not set CONFIG_CAN=y CONFIG_CAN_RAW=y CONFIG_CAN_BCM=y CONFIG_CAN_GW=y # # CAN Device Drivers # # CONFIG_CAN_VCAN is not set # CONFIG_CAN_VXCAN is not set # CONFIG_CAN_SLCAN is not set CONFIG_CAN_DEV=y CONFIG_CAN_CALC_BITTIMING=y # CONFIG_CAN_GRCAN is not set # CONFIG_CAN_XILINXCAN is not set # CONFIG_CAN_C_CAN is not set # CONFIG_CAN_CC770 is not set # CONFIG_CAN_IFI_CANFD is not set # CONFIG_CAN_M_CAN is not set # CONFIG_CAN_PEAK_PCIEFD is not set CONFIG_CAN_ROCKCHIP=y CONFIG_CANFD_ROCKCHIP=y # CONFIG_CAN_SJA1000 is not set # CONFIG_CAN_SOFTING is not set # # CAN SPI interfaces # # CONFIG_CAN_HI311X is not set # CONFIG_CAN_MCP251X is not set # # CAN USB interfaces # # CONFIG_CAN_8DEV_USB is not set # CONFIG_CAN_EMS_USB is not set # CONFIG_CAN_ESD_USB2 is not set # CONFIG_CAN_GS_USB is not set # CONFIG_CAN_KVASER_USB is not set # CONFIG_CAN_MCBA_USB is not set # CONFIG_CAN_PEAK_USB is not set # CONFIG_CAN_UCAN is not set # CONFIG_CAN_DEBUG_DEVICES is not set CONFIG_BT=y CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=y # CONFIG_BT_RFCOMM_TTY is not set # CONFIG_BT_BNEP is not set CONFIG_BT_HIDP=y CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_LEDS is not set # CONFIG_BT_SELFTEST is not set CONFIG_BT_DEBUGFS=y # # Bluetooth device drivers # CONFIG_BT_INTEL=y CONFIG_BT_BCM=y CONFIG_BT_RTL=y CONFIG_BT_HCIBTUSB=y # CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set CONFIG_BT_HCIBTUSB_BCM=y CONFIG_BT_HCIBTUSB_RTL=y # CONFIG_BT_HCIBTSDIO is not set CONFIG_BT_HCIUART=y CONFIG_BT_HCIUART_SERDEV=y CONFIG_BT_HCIUART_H4=y # CONFIG_BT_HCIUART_NOKIA is not set # CONFIG_BT_HCIUART_BCSP is not set CONFIG_BT_HCIUART_ATH3K=y # CONFIG_BT_HCIUART_LL is not set # CONFIG_BT_HCIUART_3WIRE is not set # CONFIG_BT_HCIUART_INTEL is not set CONFIG_BT_HCIUART_BCM=y # CONFIG_BT_HCIUART_QCA is not set # CONFIG_BT_HCIUART_AG6XX is not set # CONFIG_BT_HCIUART_MRVL is not set # CONFIG_BT_HCIBCM203X is not set # CONFIG_BT_HCIBPA10X is not set CONFIG_BT_HCIBFUSB=y CONFIG_BT_HCIVHCI=y CONFIG_BT_MRVL=y CONFIG_BT_MRVL_SDIO=y # CONFIG_BT_ATH3K is not set # CONFIG_BT_MTKUART is not set # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=y CONFIG_NL80211_TESTMODE=y # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y CONFIG_CFG80211_DEFAULT_PS=y CONFIG_CFG80211_DEBUGFS=y CONFIG_CFG80211_CRDA_SUPPORT=y CONFIG_CFG80211_WEXT=y CONFIG_MAC80211=y CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_MINSTREL_HT=y # CONFIG_MAC80211_RC_MINSTREL_VHT is not set CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y CONFIG_MAC80211_DEBUGFS=y # CONFIG_MAC80211_MESSAGE_TRACING is not set CONFIG_MAC80211_DEBUG_MENU=y # CONFIG_MAC80211_NOINLINE is not set CONFIG_MAC80211_VERBOSE_DEBUG=y # CONFIG_MAC80211_MLME_DEBUG is not set # CONFIG_MAC80211_STA_DEBUG is not set # CONFIG_MAC80211_HT_DEBUG is not set # CONFIG_MAC80211_OCB_DEBUG is not set # CONFIG_MAC80211_IBSS_DEBUG is not set # CONFIG_MAC80211_PS_DEBUG is not set # CONFIG_MAC80211_TDLS_DEBUG is not set # CONFIG_MAC80211_DEBUG_COUNTERS is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 # CONFIG_WIMAX is not set CONFIG_RFKILL=y CONFIG_RFKILL_LEDS=y # CONFIG_RFKILL_INPUT is not set # CONFIG_RFKILL_GPIO is not set CONFIG_RFKILL_RK=y # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set 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 # # Device Drivers # CONFIG_ARM_AMBA=y # # Generic Driver Options # CONFIG_UEVENT_HELPER=y CONFIG_UEVENT_HELPER_PATH="" CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set CONFIG_FW_CACHE=y CONFIG_WANT_DEV_COREDUMP=y CONFIG_ALLOW_DEV_COREDUMP=y CONFIG_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set CONFIG_DEBUG_DEVRES=y # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y # CONFIG_MALI_BASE_MODULES is not set 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=16 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 # # Bus devices # # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_SIMPLE_PM_BUS is not set # CONFIG_VEXPRESS_CONFIG is not set CONFIG_CONNECTOR=y CONFIG_PROC_EVENTS=y # CONFIG_GNSS is not set CONFIG_MTD=y # CONFIG_MTD_TESTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set CONFIG_MTD_CMDLINE_PARTS=y # CONFIG_MTD_AFS_PARTS is not set CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AR7_PARTS is not set # # Partition parsers # # # User Modules And Translation Layers # CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # CONFIG_RFD_FTL is not set # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set # CONFIG_MTD_OOPS is not set # CONFIG_MTD_SWAP is not set # CONFIG_MTD_PARTITIONED_MASTER is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_INTEL_VR_NOR is not set # CONFIG_MTD_PLATRAM is not set # # Self-contained MTD device drivers # # CONFIG_MTD_PMC551 is not set # CONFIG_MTD_DATAFLASH is not set # CONFIG_MTD_MCHP23K256 is not set # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLOCK2MTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOCG3 is not set # CONFIG_MTD_ONENAND is not set # CONFIG_MTD_NAND is not set # CONFIG_MTD_SPI_NAND is not set # # LPDDR & LPDDR2 PCM memory drivers # # CONFIG_MTD_LPDDR is not set # CONFIG_MTD_SPI_NOR is not set CONFIG_MTD_UBI=y CONFIG_MTD_UBI_WL_THRESHOLD=4096 CONFIG_MTD_UBI_BEB_LIMIT=20 # CONFIG_MTD_UBI_FASTMAP is not set # CONFIG_MTD_UBI_GLUEBI is not set # CONFIG_MTD_UBI_BLOCK is not set CONFIG_DTC=y CONFIG_OF=y CONFIG_DTC_SYMBOLS=y # CONFIG_DTC_OMIT_DISABLED is not set # CONFIG_DTC_OMIT_EMPTY is not set # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_NET=y CONFIG_OF_MDIO=y CONFIG_OF_RESERVED_MEM=y # CONFIG_OF_OVERLAY is not set # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set CONFIG_ZRAM=y # CONFIG_ZRAM_WRITEBACK is not set # CONFIG_ZRAM_MEMORY_TRACKING is not set # CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_SKD is not set # CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=1 CONFIG_BLK_DEV_RAM_SIZE=4096 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_RSXX is not set # # NVME Support # CONFIG_NVME_CORE=y CONFIG_BLK_DEV_NVME=y # CONFIG_NVME_MULTIPATH is not set # CONFIG_NVME_FC is not set # CONFIG_NVME_TARGET is not set # # Misc devices # # CONFIG_ROCKCHIP_SCR is not set # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_PHANTOM is not set # CONFIG_SGI_IOC4 is not set # CONFIG_TIFM_CORE is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HP_ILO is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_USB_SWITCH_FSA9480 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set CONFIG_SRAM=y # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_PIR_ASCHIP is not set # CONFIG_RK803 is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set # CONFIG_EEPROM_93CX6 is not set # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_CB710_CORE is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # # Intel MIC & related support # # # Intel MIC Bus Driver # # # SCIF Bus Driver # # # VOP Bus Driver # # # Intel MIC Host Driver # # # Intel MIC Card Driver # # # SCIF Driver # # # Intel MIC Coprocessor State Management (COSM) Drivers # # # VOP Driver # # CONFIG_GENWQE is not set # CONFIG_ECHO is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI=y CONFIG_SCSI_DMA=y CONFIG_SCSI_MQ_DEFAULT=y CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set # CONFIG_CHR_DEV_OSST is not set CONFIG_BLK_DEV_SR=y # CONFIG_CHR_DEV_SG is not set # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set CONFIG_SCSI_SCAN_ASYNC=y # # SCSI Transports # CONFIG_SCSI_SPI_ATTRS=y # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_CXGB3_ISCSI is not set # CONFIG_SCSI_CXGB4_ISCSI is not set # CONFIG_SCSI_BNX2_ISCSI is not set # CONFIG_BE2ISCSI is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_HPSA is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_3W_SAS is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_HISI_SAS is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set # CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set # CONFIG_SCSI_SMARTPQI is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_STEX is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_IPR is not set # CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLA_ISCSI is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_AM53C974 is not set # CONFIG_SCSI_WD719X is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_PMCRAID is not set # CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_LOWLEVEL_PCMCIA 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 CONFIG_SATA_PMP=y # # Controllers with non-SFF native interface # CONFIG_SATA_AHCI=y CONFIG_SATA_MOBILE_LPM_POLICY=0 CONFIG_SATA_AHCI_PLATFORM=y # CONFIG_AHCI_CEVA is not set # CONFIG_AHCI_QORIQ is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set # CONFIG_ATA_SFF is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set # CONFIG_BLK_DEV_DM is not set # CONFIG_TARGET_CORE is not set # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # # CONFIG_FIREWIRE is not set # CONFIG_FIREWIRE_NOSY is not set CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set # CONFIG_WIREGUARD is not set # CONFIG_EQUALIZER is not set # CONFIG_NET_FC is not set # CONFIG_NET_TEAM is not set # CONFIG_MACVLAN is not set # CONFIG_IPVLAN is not set # CONFIG_VXLAN is not set # CONFIG_GENEVE is not set # CONFIG_GTP is not set # CONFIG_MACSEC is not set # CONFIG_NETCONSOLE is not set # CONFIG_TUN is not set # CONFIG_TUN_VNET_CROSS_LE is not set # CONFIG_VETH is not set # CONFIG_NLMON is not set # CONFIG_ARCNET is not set # # CAIF transport drivers # # # Distributed Switch Architecture drivers # CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set # CONFIG_NET_VENDOR_AGERE is not set CONFIG_NET_VENDOR_ALACRITECH=y # CONFIG_SLICOSS is not set # CONFIG_NET_VENDOR_ALTEON is not set # CONFIG_ALTERA_TSE is not set CONFIG_NET_VENDOR_AMAZON=y # CONFIG_ENA_ETHERNET is not set # CONFIG_NET_VENDOR_AMD is not set CONFIG_NET_VENDOR_AQUANTIA=y # CONFIG_NET_VENDOR_ARC is not set # CONFIG_NET_VENDOR_ATHEROS is not set CONFIG_NET_VENDOR_AURORA=y # CONFIG_AURORA_NB8800 is not set # CONFIG_NET_VENDOR_BROADCOM is not set # CONFIG_NET_VENDOR_BROCADE is not set CONFIG_NET_VENDOR_CADENCE=y # CONFIG_MACB is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set CONFIG_NET_VENDOR_CORTINA=y # CONFIG_GEMINI_ETHERNET is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set # CONFIG_NET_VENDOR_EZCHIP is not set # CONFIG_NET_VENDOR_HISILICON is not set # CONFIG_NET_VENDOR_HP is not set CONFIG_NET_VENDOR_HUAWEI=y # CONFIG_HINIC is not set # CONFIG_NET_VENDOR_INTEL is not set # CONFIG_JME is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set CONFIG_NET_VENDOR_MICROSEMI=y # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set # CONFIG_NET_VENDOR_NATSEMI is not set CONFIG_NET_VENDOR_NETERION=y # CONFIG_S2IO is not set # CONFIG_VXGE is not set CONFIG_NET_VENDOR_NETRONOME=y # CONFIG_NFP is not set CONFIG_NET_VENDOR_NI=y # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set CONFIG_NET_VENDOR_PACKET_ENGINES=y # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_NET_VENDOR_QLOGIC is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_REALTEK is not set # CONFIG_NET_VENDOR_RENESAS is not set # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set CONFIG_NET_VENDOR_SOLARFLARE=y # CONFIG_SFC is not set # CONFIG_SFC_FALCON is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set # CONFIG_NET_VENDOR_SMSC is not set CONFIG_NET_VENDOR_SOCIONEXT=y CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=y CONFIG_STMMAC_ETHTOOL=y CONFIG_STMMAC_FULL=y CONFIG_STMMAC_PTP=y CONFIG_STMMAC_PLATFORM=y # CONFIG_DWMAC_DWC_QOS_ETH is not set CONFIG_DWMAC_GENERIC=y CONFIG_DWMAC_ROCKCHIP=y CONFIG_DWMAC_ROCKCHIP_TOOL=y # CONFIG_STMMAC_PCI is not set # CONFIG_NET_VENDOR_SUN is not set # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MDIO_BITBANG is not set # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_OCTEON is not set # CONFIG_MDIO_THUNDER is not set CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_AQUANTIA_PHY is not set # CONFIG_AX88796B_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_BROADCOM_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_ICPLUS_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MICREL_PHY is not set # CONFIG_MICROCHIP_PHY is not set # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_QSEMI_PHY is not set # CONFIG_REALTEK_PHY is not set # CONFIG_RENESAS_PHY is not set CONFIG_ROCKCHIP_PHY=y # CONFIG_SMSC_PHY is not set # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set # CONFIG_PPP is not set # CONFIG_SLIP is not set CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set CONFIG_USB_RTL8150=y CONFIG_USB_RTL8152=y # CONFIG_USB_LAN78XX is not set CONFIG_USB_USBNET=y CONFIG_USB_NET_AX8817X=y CONFIG_USB_NET_AX88179_178A=y CONFIG_USB_NET_CDCETHER=y # CONFIG_USB_NET_CDC_EEM is not set CONFIG_USB_NET_CDC_NCM=y # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set CONFIG_USB_NET_CDC_MBIM=y # CONFIG_USB_NET_DM9601 is not set # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set # CONFIG_USB_NET_SMSC75XX is not set # CONFIG_USB_NET_SMSC95XX is not set # CONFIG_USB_NET_GL620A is not set # CONFIG_USB_NET_NET1080 is not set # CONFIG_USB_NET_PLUSB is not set # CONFIG_USB_NET_MCS7830 is not set CONFIG_USB_NET_RNDIS_HOST=y # CONFIG_USB_NET_CDC_SUBSET is not set # CONFIG_USB_NET_ZAURUS is not set # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set CONFIG_USB_NET_QMI_WWAN=y # CONFIG_USB_HSO is not set # CONFIG_USB_NET_INT51X1 is not set # CONFIG_USB_IPHETH is not set # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set CONFIG_WLAN=y # CONFIG_WIRELESS_WDS is not set CONFIG_WLAN_VENDOR_ADMTEK=y # CONFIG_ADM8211 is not set CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set # CONFIG_ATH5K is not set # CONFIG_ATH5K_PCI is not set # CONFIG_ATH9K is not set # CONFIG_ATH9K_HTC is not set # CONFIG_CARL9170 is not set # CONFIG_ATH6KL is not set # CONFIG_AR5523 is not set # CONFIG_WIL6210 is not set # CONFIG_ATH10K is not set # CONFIG_WCN36XX is not set CONFIG_WLAN_VENDOR_ATMEL=y # CONFIG_ATMEL is not set # CONFIG_AT76C50X_USB is not set CONFIG_WLAN_VENDOR_BROADCOM=y # CONFIG_B43 is not set # CONFIG_B43LEGACY is not set # CONFIG_BRCMSMAC is not set # CONFIG_BRCMFMAC is not set CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y # CONFIG_IPW2100 is not set # CONFIG_IPW2200 is not set # CONFIG_IWL4965 is not set # CONFIG_IWL3945 is not set # CONFIG_IWLWIFI is not set CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_HOSTAP is not set # CONFIG_HERMES is not set # CONFIG_P54_COMMON is not set # CONFIG_PRISM54 is not set CONFIG_WLAN_VENDOR_MARVELL=y # CONFIG_LIBERTAS is not set CONFIG_LIBERTAS_THINFIRM=y # CONFIG_LIBERTAS_THINFIRM_DEBUG is not set # CONFIG_LIBERTAS_THINFIRM_USB is not set CONFIG_MWIFIEX=m CONFIG_MWIFIEX_SDIO=m # CONFIG_MWIFIEX_PCIE is not set # CONFIG_MWIFIEX_USB is not set # CONFIG_MWL8K is not set CONFIG_WLAN_VENDOR_MEDIATEK=y # CONFIG_MT7601U is not set # CONFIG_MT76x0U is not set # CONFIG_MT76x2E is not set # CONFIG_MT76x2U is not set CONFIG_WLAN_VENDOR_RALINK=y # CONFIG_RT2X00 is not set CONFIG_WLAN_VENDOR_REALTEK=y # CONFIG_RTL8180 is not set # CONFIG_RTL8187 is not set CONFIG_RTL_CARDS=y # CONFIG_RTL8192CE is not set # CONFIG_RTL8192SE is not set # CONFIG_RTL8192DE is not set # CONFIG_RTL8723AE is not set # CONFIG_RTL8723BE is not set # CONFIG_RTL8188EE is not set # CONFIG_RTL8192EE is not set # CONFIG_RTL8821AE is not set # CONFIG_RTL8192CU is not set # CONFIG_RTL8XXXU is not set CONFIG_WLAN_VENDOR_RSI=y # CONFIG_RSI_91X is not set CONFIG_WLAN_VENDOR_ST=y # CONFIG_CW1200 is not set CONFIG_WLAN_VENDOR_TI=y # CONFIG_WL1251 is not set # CONFIG_WL12XX is not set # CONFIG_WL18XX is not set # CONFIG_WLCORE is not set CONFIG_WLAN_VENDOR_ZYDAS=y # CONFIG_USB_ZD1201 is not set # CONFIG_ZD1211RW is not set CONFIG_WLAN_VENDOR_QUANTENNA=y # CONFIG_QTNFMAC_PEARL_PCIE is not set CONFIG_WL_ROCKCHIP=y # CONFIG_WIFI_BUILD_MODULE is not set CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP=y # CONFIG_WIFI_GENERATE_RANDOM_MAC_ADDR is not set CONFIG_BCMDHD=y CONFIG_AP6XXX=m CONFIG_AP6XXX_WIFI6=m # CONFIG_AP6XXX_INDEP_POWER is not set CONFIG_BCMDHD_FW_PATH="/etc/firmware/fw_bcmdhd.bin" CONFIG_BCMDHD_NVRAM_PATH="/etc/firmware/nvram.txt" # CONFIG_BCMDHD_STATIC_IF is not set # CONFIG_RTL_WIRELESS_SOLUTION is not set # CONFIG_MVL88W8977 is not set # CONFIG_CYW_BCMDHD is not set # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=y # CONFIG_VIRT_WIFI is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set # CONFIG_VMXNET3 is not set # CONFIG_LTE is not set # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set # CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y CONFIG_INPUT_POLLDEV=y # CONFIG_INPUT_SPARSEKMAP is not set CONFIG_INPUT_MATRIXKMAP=y # # Userland interfaces # # CONFIG_INPUT_MOUSEDEV is not set # CONFIG_INPUT_JOYDEV is not set CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_ADC=y # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set # CONFIG_KEYBOARD_ATKBD is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=y CONFIG_KEYBOARD_GPIO_POLLED=y # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # 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=y # CONFIG_MOUSE_PS2 is not set # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set CONFIG_MOUSE_CYAPA=y CONFIG_MOUSE_ELAN_I2C=y CONFIG_MOUSE_ELAN_I2C_I2C=y # CONFIG_MOUSE_ELAN_I2C_SMBUS is not set # CONFIG_MOUSE_VSXXXAA is not set # CONFIG_MOUSE_GPIO is not set # CONFIG_MOUSE_SYNAPTICS_I2C is not set # CONFIG_MOUSE_SYNAPTICS_USB is not set CONFIG_INPUT_JOYSTICK=y CONFIG_JOYSTICK_ANALOG=m CONFIG_JOYSTICK_A3D=m CONFIG_JOYSTICK_ADI=m CONFIG_JOYSTICK_COBRA=m CONFIG_JOYSTICK_GF2K=m CONFIG_JOYSTICK_GRIP=m CONFIG_JOYSTICK_GRIP_MP=m CONFIG_JOYSTICK_GUILLEMOT=m CONFIG_JOYSTICK_INTERACT=m CONFIG_JOYSTICK_SIDEWINDER=m CONFIG_JOYSTICK_TMDC=m CONFIG_JOYSTICK_IFORCE=m CONFIG_JOYSTICK_IFORCE_USB=y CONFIG_JOYSTICK_IFORCE_232=y CONFIG_JOYSTICK_WARRIOR=m CONFIG_JOYSTICK_MAGELLAN=m CONFIG_JOYSTICK_SPACEORB=m CONFIG_JOYSTICK_SPACEBALL=m CONFIG_JOYSTICK_STINGER=m CONFIG_JOYSTICK_TWIDJOY=m CONFIG_JOYSTICK_ZHENHUA=m # CONFIG_JOYSTICK_DB9 is not set CONFIG_JOYSTICK_GAMECON=y # CONFIG_JOYSTICK_TURBOGRAFX is not set CONFIG_JOYSTICK_AS5011=m CONFIG_JOYSTICK_JOYDUMP=m CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y # CONFIG_JOYSTICK_WALKERA0701 is not set # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_PROPERTIES=y # CONFIG_TOUCHSCREEN_ADS7846 is not set # CONFIG_TOUCHSCREEN_AD7877 is not set # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_ADC is not set # CONFIG_TOUCHSCREEN_AR1021_I2C is not set CONFIG_TOUCHSCREEN_ATMEL_MXT=y # CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_BU21029 is not set # CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set # CONFIG_TOUCHSCREEN_CY8C40XX is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set # CONFIG_TOUCHSCREEN_EGALAX is not set # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set # CONFIG_TOUCHSCREEN_EXC3000 is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_GSLX6801 is not set # CONFIG_TOUCHSCREEN_GSLX680A is not set # CONFIG_TOUCHSCREEN_GSLX680_D708 is not set # CONFIG_TOUCHSCREEN_GSLX680_PAD is not set # CONFIG_TOUCHSCREEN_GSLX680_VR is not set CONFIG_TOUCHSCREEN_GSLX680_FIREFLY=y # CONFIG_TOUCHSCREEN_GSL3673 is not set # CONFIG_TOUCHSCREEN_GSL3673_800X1280 is not set # CONFIG_TOUCHSCREEN_GSL3676 is not set # CONFIG_TOUCHSCREEN_GT9XX is not set # CONFIG_TOUCHSCREEN_HIDEEP is not set # CONFIG_TOUCHSCREEN_HYN_CST2XX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_S6SY761 is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set CONFIG_TOUCHSCREEN_ELAN=y # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set CONFIG_TOUCHSCREEN_WACOM_W9013=y # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set # CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set CONFIG_TOUCHSCREEN_USB_COMPOSITE=y CONFIG_TOUCHSCREEN_USB_EGALAX=y CONFIG_TOUCHSCREEN_USB_PANJIT=y CONFIG_TOUCHSCREEN_USB_3M=y CONFIG_TOUCHSCREEN_USB_ITM=y CONFIG_TOUCHSCREEN_USB_ETURBO=y CONFIG_TOUCHSCREEN_USB_GUNZE=y CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y CONFIG_TOUCHSCREEN_USB_IRTOUCH=y CONFIG_TOUCHSCREEN_USB_IDEALTEK=y CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y CONFIG_TOUCHSCREEN_USB_GOTOP=y CONFIG_TOUCHSCREEN_USB_JASTEC=y CONFIG_TOUCHSCREEN_USB_ELO=y CONFIG_TOUCHSCREEN_USB_E2I=y CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y CONFIG_TOUCHSCREEN_USB_NEXIO=y CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2004 is not set # CONFIG_TOUCHSCREEN_TSC2005 is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_RM_TS is not set # CONFIG_TOUCHSCREEN_SILEAD is not set # CONFIG_TOUCHSCREEN_SIS_I2C is not set # CONFIG_TOUCHSCREEN_ST1232 is not set # CONFIG_TOUCHSCREEN_STMFTS is not set # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set # CONFIG_TOUCHSCREEN_SX8654 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZET6223 is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_VTL_CT36X is not set CONFIG_TOUCHSCREEN_GT1X=y # CONFIG_TOUCHSCREEN_FTS is not set # CONFIG_TOUCHSCREEN_FT5436 is not set CONFIG_TOUCHSCREEN_HX83102=y CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5=y CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEVICETREE_SUPPORT=y CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_I2C=y # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_SPI is not set # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_MT_A is not set CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_MT_B=y # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_BUTTON is not set # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_PROXIMITY is not set CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEVICE_ACCESS=y # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEVICE_ACCESS_API is not set CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_LOADER=y # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_PLATFORM_FW_UPGRADE is not set # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_BINARY_FW_UPGRADE is not set # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_PLATFORM_TTCONFIG_UPGRADE is not set # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_MANUAL_TTCONFIG_UPGRADE is not set # CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEBUG_MDL is not set CONFIG_ROCKCHIP_REMOTECTL=y CONFIG_ROCKCHIP_REMOTECTL_PWM=y # # handle all sensors # CONFIG_SENSOR_DEVICE=y # CONFIG_ANGLE_DEVICE is not set CONFIG_GSENSOR_DEVICE=y # CONFIG_GS_MMA8452 is not set # CONFIG_STK8BAXX_ACC is not set # CONFIG_MPU6880_ACC is not set # CONFIG_MPU6500_ACC is not set # CONFIG_GS_KXTIK is not set # CONFIG_GS_KXTJ9 is not set # CONFIG_GS_LIS3DH is not set # CONFIG_GS_MMA7660 is not set CONFIG_GS_MC3230=y # CONFIG_GS_SC7660 is not set # CONFIG_GS_SC7A20 is not set # CONFIG_GS_SC7A30 is not set # CONFIG_GS_MXC6225 is not set # CONFIG_GS_MXC6655XA is not set # CONFIG_GS_DMT10 is not set # CONFIG_GS_LSM303D is not set # CONFIG_GS_BMA023 is not set # CONFIG_LSM330_ACC is not set # CONFIG_BMA2XX_ACC is not set # CONFIG_GS_DA215S is not set # CONFIG_GS_DA223 is not set # CONFIG_GS_DA228E is not set # CONFIG_ICM2060X_ACC is not set # CONFIG_COMPASS_DEVICE is not set # CONFIG_GYROSCOPE_DEVICE is not set # CONFIG_LIGHT_DEVICE is not set # CONFIG_PROXIMITY_DEVICE is not set # CONFIG_TEMPERATURE_DEVICE is not set # CONFIG_PRESSURE_DEVICE is not set # CONFIG_HALL_DEVICE is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GP2A is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set CONFIG_INPUT_RK805_PWRKEY=y # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_SOC_BUTTON_ARRAY is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_RMI4_CORE is not set # # Hardware I/O ports # # CONFIG_SERIO is not set # CONFIG_GAMEPORT is not set # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_NOZOMI is not set # CONFIG_N_GSM is not set # CONFIG_TRACE_SINK is not set CONFIG_LDISC_AUTOLOAD=y CONFIG_DEVMEM=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_DMA=y # CONFIG_SERIAL_8250_PCI is not set CONFIG_SERIAL_8250_NR_UARTS=10 CONFIG_SERIAL_8250_RUNTIME_UARTS=10 # CONFIG_SERIAL_8250_EXTENDED is not set # CONFIG_SERIAL_8250_ASPEED_VUART is not set CONFIG_SERIAL_8250_FSL=y CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_MOXA is not set CONFIG_SERIAL_OF_PLATFORM=y # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set # CONFIG_SERIAL_AMBA_PL011 is not set # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_MSM_GENI_HALF_SAMPLING is not set # CONFIG_SERIAL_MSM_GENI_EARLY_CONSOLE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_IFX6X60 is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_RP2 is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR 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=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set CONFIG_HW_RANDOM_CAVIUM=y CONFIG_HW_RANDOM_ROCKCHIP=y # CONFIG_APPLICOM is not set # # PCMCIA character devices # # CONFIG_RAW_DRIVER is not set CONFIG_TCG_TPM=y CONFIG_HW_RANDOM_TPM=y # CONFIG_TCG_TIS is not set # CONFIG_TCG_TIS_SPI is not set # CONFIG_TCG_TIS_I2C_ATMEL is not set CONFIG_TCG_TIS_I2C_INFINEON=y # CONFIG_TCG_TIS_I2C_NUVOTON is not set # CONFIG_TCG_ATMEL is not set # CONFIG_TCG_VTPM_PROXY is not set # CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TCG_TIS_ST33ZP24_SPI is not set CONFIG_DEVPORT=y # CONFIG_XILLYBUS is not set # CONFIG_RANDOM_TRUST_BOOTLOADER is not set # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # # CONFIG_I2C_ARB_GPIO_CHALLENGE is not set # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_GPMUX is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set # CONFIG_I2C_MUX_PINCTRL is not set # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_DEMUX_PINCTRL is not set # CONFIG_I2C_MUX_MLXCPLD is not set CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # PC SMBus host controller drivers # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_ISCH is not set # CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CADENCE is not set # CONFIG_I2C_CBUS_GPIO is not set # CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_DESIGNWARE_PCI is not set # CONFIG_I2C_EMEV2 is not set # CONFIG_I2C_GPIO is not set # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set CONFIG_I2C_RK3X=y # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_THUNDERX is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # CONFIG_I2C_CROS_EC_TUNNEL=y # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y # CONFIG_SPI_MEM is not set # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set CONFIG_SPI_BITBANG=y # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_DESIGNWARE 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 is not set # CONFIG_SPI_PXA2XX is not set CONFIG_SPI_ROCKCHIP=y # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_THUNDERX is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=y # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set CONFIG_SPI_WK2XXX=y # CONFIG_SPI_SLAVE is not set # CONFIG_SPMI is not set # CONFIG_HSI is not set CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # CONFIG_PINCTRL=y CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_AMD is not set # CONFIG_PINCTRL_MCP23S08 is not set CONFIG_PINCTRL_ROCKCHIP=y # CONFIG_PINCTRL_SINGLE is not set # CONFIG_PINCTRL_SX150X is not set CONFIG_PINCTRL_RK805=y CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y CONFIG_GPIO_GENERIC=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_DWAPB is not set # CONFIG_GPIO_FTGPIO010 is not set CONFIG_GPIO_GENERIC_PLATFORM=y # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HLWD is not set # CONFIG_GPIO_MB86S7X is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_PL061 is not set CONFIG_GPIO_ROCKCHIP=y # CONFIG_GPIO_SYSCON is not set # CONFIG_GPIO_XGENE is not set # CONFIG_GPIO_XILINX is not set # # I2C GPIO expanders # # CONFIG_GPIO_ADP5588 is not set # CONFIG_GPIO_ADNP is not set # CONFIG_GPIO_MAX7300 is not set # CONFIG_GPIO_MAX732X is not set CONFIG_GPIO_PCA953X=y # CONFIG_GPIO_PCA953X_IRQ is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # # MFD GPIO expanders # # CONFIG_GPIO_TPS6586X is not set # # PCI GPIO expanders # # CONFIG_GPIO_BT8XX is not set # CONFIG_GPIO_PCI_IDIO_16 is not set # CONFIG_GPIO_PCIE_IDIO_24 is not set # CONFIG_GPIO_RDC321X is not set # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # # USB GPIO expanders # # CONFIG_W1 is not set CONFIG_POWER_AVS=y CONFIG_ROCKCHIP_IODOMAIN=y CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_BRCMSTB is not set CONFIG_POWER_RESET_GPIO=y CONFIG_POWER_RESET_GPIO_RESTART=y # CONFIG_POWER_RESET_LTC2952 is not set # CONFIG_POWER_RESET_RESTART is not set # CONFIG_POWER_RESET_XGENE is not set # CONFIG_POWER_RESET_SYSCON is not set # CONFIG_POWER_RESET_SYSCON_POWEROFF is not set CONFIG_REBOOT_MODE=y CONFIG_SYSCON_REBOOT_MODE=y CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_LEGO_EV3 is not set CONFIG_BATTERY_SBS=y # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set CONFIG_CHARGER_GPIO=y # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LTC3651 is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set CONFIG_CHARGER_BQ24735=y # CONFIG_CHARGER_BQ25700 is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_CROS_USBPD is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_RK816 is not set CONFIG_BATTERY_RK817=y CONFIG_CHARGER_RK817=y # CONFIG_BATTERY_RK818 is not set # CONFIG_CHARGER_RK818 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_ARM_SCMI is not set # CONFIG_SENSORS_ASPEED is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_I5K_AMB is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_GPIO_FAN is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IIO_HWMON is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set # CONFIG_SENSORS_PWM_FAN is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS1015 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_VT8231 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y CONFIG_THERMAL_WRITABLE_TRIPS=y # CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE is not set # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR=y CONFIG_THERMAL_GOV_FAIR_SHARE=y CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y CONFIG_CPU_THERMAL=y # CONFIG_CLOCK_THERMAL is not set CONFIG_DEVFREQ_THERMAL=y # CONFIG_THERMAL_EMULATION is not set # CONFIG_QORIQ_THERMAL is not set CONFIG_ROCKCHIP_THERMAL=y # CONFIG_RK_VIRTUAL_THERMAL is not set # CONFIG_RK3368_THERMAL is not set # # ACPI INT340X thermal drivers # # CONFIG_GENERIC_ADC_THERMAL is not set CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y # CONFIG_WATCHDOG_SYSFS is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_ARM_SBSA_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set CONFIG_DW_WATCHDOG=y # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_ALIM7101_WDT is not set # CONFIG_I6300ESB_WDT is not set # CONFIG_MEN_A21_WDT is not set # # PCI-based Watchdog Cards # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set CONFIG_SSB_POSSIBLE=y # CONFIG_SSB is not set CONFIG_BCMA_POSSIBLE=y # CONFIG_BCMA is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set CONFIG_MFD_CROS_EC=y # CONFIG_MFD_CROS_EC_CHARDEV is not set # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77620 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_CPCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_RK618 is not set # CONFIG_MFD_RK628 is not set # CONFIG_MFD_RK630 is not set # CONFIG_MFD_RK630_I2C is not set # CONFIG_MFD_RK630_SPI is not set CONFIG_MFD_RK808=y # CONFIG_MFD_RK1000 is not set # CONFIG_MFD_RN5T618 is not set # CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_SMSC is not set # CONFIG_ABX500_CORE is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set CONFIG_MFD_TPS6586X=y # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_MFD_TPS80031 is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TC3589X is not set # CONFIG_MFD_VX855 is not set # CONFIG_MFD_ARIZONA_I2C is not set # CONFIG_MFD_ARIZONA_SPI is not set # CONFIG_MFD_WM8400 is not set # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ROHM_BD718XX is not set # CONFIG_RAVE_SP_CORE is not set CONFIG_FUSB_30X=y CONFIG_REGULATOR=y CONFIG_REGULATOR_DEBUG=y CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_PROXY_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set CONFIG_REGULATOR_ACT8865=y # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_ANATOP is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set CONFIG_REGULATOR_FAN53555=y CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set CONFIG_REGULATOR_LP8752=y # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set CONFIG_REGULATOR_MP8865=y # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set CONFIG_REGULATOR_PWM=y CONFIG_REGULATOR_RK808=y # CONFIG_REGULATOR_RK860X is not set # CONFIG_REGULATOR_SY8106A is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS549B22 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set CONFIG_REGULATOR_TPS65132=y # CONFIG_REGULATOR_TPS6524X is not set CONFIG_REGULATOR_TPS6586X=y # CONFIG_REGULATOR_VCTRL is not set CONFIG_REGULATOR_XZ3216=y # CONFIG_REGULATOR_DIO5632 is not set CONFIG_CEC_CORE=y CONFIG_CEC_NOTIFIER=y # CONFIG_RC_CORE is not set CONFIG_MEDIA_SUPPORT=y # # Multimedia core support # CONFIG_MEDIA_CAMERA_SUPPORT=y # CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set # CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set # CONFIG_MEDIA_RADIO_SUPPORT is not set # CONFIG_MEDIA_SDR_SUPPORT is not set CONFIG_MEDIA_CEC_SUPPORT=y CONFIG_MEDIA_CONTROLLER=y CONFIG_VIDEO_DEV=y CONFIG_VIDEO_V4L2_SUBDEV_API=y CONFIG_VIDEO_V4L2=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set # CONFIG_VIDEO_PCI_SKELETON is not set CONFIG_V4L2_MEM2MEM_DEV=y # CONFIG_V4L2_FLASH_LED_CLASS is not set CONFIG_V4L2_FWNODE=y # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # CONFIG_USB_VIDEO_CLASS=y # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_VIDEO_CPIA2 is not set # CONFIG_USB_ZR364XX is not set # CONFIG_USB_STKWEBCAM is not set # CONFIG_USB_S2255 is not set # CONFIG_VIDEO_USBTV is not set # # Webcam, TV (analog/digital) USB devices # # CONFIG_VIDEO_EM28XX is not set # # USB HDMI CEC adapters # # CONFIG_USB_PULSE8_CEC is not set # CONFIG_USB_RAINSHADOW_CEC is not set # CONFIG_MEDIA_PCI_SUPPORT is not set CONFIG_V4L_PLATFORM_DRIVERS=y # CONFIG_VIDEO_CAFE_CCIC is not set # CONFIG_VIDEO_CADENCE is not set # CONFIG_VIDEO_MUX is not set CONFIG_SOC_CAMERA=y # CONFIG_SOC_CAMERA_PLATFORM is not set # CONFIG_VIDEO_XILINX is not set CONFIG_VIDEO_ROCKCHIP_CIF=y CONFIG_ROCKCHIP_CIF_WORKMODE_PINGPONG=y # CONFIG_ROCKCHIP_CIF_WORKMODE_ONEFRAME is not set CONFIG_ROCKCHIP_CIF_USE_DUMMY_BUF=y # CONFIG_ROCKCHIP_CIF_USE_NONE_DUMMY_BUF is not set CONFIG_VIDEO_ROCKCHIP_ISP1=y CONFIG_VIDEO_ROCKCHIP_ISP=y CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V1X=y # CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V20 is not set CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V21=y # CONFIG_VIDEO_ROCKCHIP_ISPP is not set CONFIG_V4L_MEM2MEM_DRIVERS=y # CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set # CONFIG_VIDEO_SH_VEU is not set CONFIG_VIDEO_ROCKCHIP_RGA=y # CONFIG_V4L_TEST_DRIVERS is not set # CONFIG_CEC_PLATFORM_DRIVERS is not set # # Supported MMC/SDIO adapters # # CONFIG_CYPRESS_FIRMWARE is not set CONFIG_VIDEOBUF2_CORE=y CONFIG_VIDEOBUF2_V4L2=y CONFIG_VIDEOBUF2_MEMOPS=y CONFIG_VIDEOBUF2_DMA_CONTIG=y CONFIG_VIDEOBUF2_VMALLOC=y CONFIG_VIDEOBUF2_DMA_SG=y # # Media ancillary drivers (tuners, sensors, i2c, spi, frontends) # # CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set # # I2C Encoders, decoders, sensors and other helper chips # # # Audio decoders, processors and mixers # # CONFIG_VIDEO_TVAUDIO is not set # CONFIG_VIDEO_TDA7432 is not set # CONFIG_VIDEO_TDA9840 is not set # CONFIG_VIDEO_TDA1997X is not set # CONFIG_VIDEO_TEA6415C is not set # CONFIG_VIDEO_TEA6420 is not set # CONFIG_VIDEO_MSP3400 is not set # CONFIG_VIDEO_CS3308 is not set # CONFIG_VIDEO_CS5345 is not set # CONFIG_VIDEO_CS53L32A is not set # CONFIG_VIDEO_TLV320AIC23B is not set # CONFIG_VIDEO_UDA1342 is not set # CONFIG_VIDEO_WM8775 is not set # CONFIG_VIDEO_WM8739 is not set # CONFIG_VIDEO_VP27SMPX is not set # CONFIG_VIDEO_SONY_BTF_MPX is not set # # RDS decoders # # CONFIG_VIDEO_SAA6588 is not set # # Video decoders # # CONFIG_VIDEO_ADV7180 is not set # CONFIG_VIDEO_ADV7183 is not set # CONFIG_VIDEO_ADV748X is not set # CONFIG_VIDEO_ADV7604 is not set # CONFIG_VIDEO_ADV7842 is not set # CONFIG_VIDEO_BT819 is not set # CONFIG_VIDEO_BT856 is not set # CONFIG_VIDEO_BT866 is not set # CONFIG_VIDEO_KS0127 is not set # CONFIG_VIDEO_ML86V7667 is not set # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9718 is not set # CONFIG_VIDEO_DW9807_VCM is not set # CONFIG_VIDEO_FP5501 is not set # CONFIG_VIDEO_FP5510 is not set # CONFIG_VIDEO_GT9760S is not set # CONFIG_VIDEO_VM149C is not set # CONFIG_VIDEO_OTP_EEPROM is not set # CONFIG_VIDEO_SAA7110 is not set # CONFIG_VIDEO_SAA711X is not set # CONFIG_VIDEO_TC358743 is not set CONFIG_VIDEO_TC35874X=y # CONFIG_VIDEO_RK628_CSI is not set # CONFIG_VIDEO_LT6911UXC is not set # CONFIG_VIDEO_LT8619C is not set # CONFIG_VIDEO_TECHPOINT is not set # CONFIG_VIDEO_TVP514X is not set # CONFIG_VIDEO_TVP5150 is not set # CONFIG_VIDEO_TVP7002 is not set # CONFIG_VIDEO_TW2804 is not set # CONFIG_VIDEO_TW9903 is not set # CONFIG_VIDEO_TW9906 is not set # CONFIG_VIDEO_TW9910 is not set # CONFIG_VIDEO_VPX3220 is not set # # Video and audio decoders # # CONFIG_VIDEO_SAA717X is not set # CONFIG_VIDEO_CX25840 is not set # # Video encoders # # CONFIG_VIDEO_SAA7127 is not set # CONFIG_VIDEO_SAA7185 is not set # CONFIG_VIDEO_ADV7170 is not set # CONFIG_VIDEO_ADV7175 is not set # CONFIG_VIDEO_ADV7343 is not set # CONFIG_VIDEO_ADV7393 is not set # CONFIG_VIDEO_ADV7511 is not set # CONFIG_VIDEO_AD9389B is not set # CONFIG_VIDEO_AK881X is not set # CONFIG_VIDEO_THS8200 is not set # # Camera sensor devices # # CONFIG_VIDEO_IMX178 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX307 is not set # CONFIG_VIDEO_IMX317 is not set # CONFIG_VIDEO_IMX323 is not set # CONFIG_VIDEO_IMX327 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX347 is not set # CONFIG_VIDEO_IMX378 is not set # CONFIG_VIDEO_IMX415 is not set # CONFIG_VIDEO_IMX462 is not set # CONFIG_VIDEO_IMX464 is not set # CONFIG_VIDEO_OS02G10 is not set CONFIG_VIDEO_OS04A10=y # CONFIG_VIDEO_OS04C10 is not set # CONFIG_VIDEO_OS05A20 is not set # CONFIG_VIDEO_OS08A10 is not set # CONFIG_VIDEO_OS08A20 is not set # CONFIG_VIDEO_OV02B10 is not set # CONFIG_VIDEO_OV02K10 is not set # CONFIG_VIDEO_OV2640 is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV2718 is not set # CONFIG_VIDEO_OV2735 is not set # CONFIG_VIDEO_OV2775 is not set # CONFIG_VIDEO_OV4686 is not set # CONFIG_VIDEO_OV4688 is not set CONFIG_VIDEO_OV4689=y # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set CONFIG_VIDEO_OV5695=y # CONFIG_VIDEO_OV6650 is not set CONFIG_VIDEO_OV7251=y # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7640 is not set # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV7750 is not set # CONFIG_VIDEO_OV8858 is not set # CONFIG_VIDEO_OV9281 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_OV9750 is not set # CONFIG_VIDEO_OV12D2Q is not set CONFIG_VIDEO_OV13850=y # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set # CONFIG_VIDEO_PREISP_DUMMY_SENSOR is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set # CONFIG_VIDEO_MT9V011 is not set # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_AR0230 is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_M5MOLS is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5KGM1SP is not set # CONFIG_VIDEO_S5K4H7YX is not set # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_SMIAPP is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_GC02M2 is not set # CONFIG_VIDEO_GC0312 is not set # CONFIG_VIDEO_GC0329 is not set # CONFIG_VIDEO_GC032A is not set # CONFIG_VIDEO_GC0403 is not set # CONFIG_VIDEO_GC2035 is not set CONFIG_VIDEO_GC2053=y CONFIG_VIDEO_GC2093=y # CONFIG_VIDEO_GC2145 is not set # CONFIG_VIDEO_GC2155 is not set # CONFIG_VIDEO_GC2355 is not set # CONFIG_VIDEO_GC2375H is not set # CONFIG_VIDEO_GC2385 is not set # CONFIG_VIDEO_GC4663 is not set # CONFIG_VIDEO_GC4C33 is not set # CONFIG_VIDEO_GC5024 is not set # CONFIG_VIDEO_GC5025 is not set # CONFIG_VIDEO_GC5035 is not set CONFIG_VIDEO_GC8034=y # CONFIG_VIDEO_BF3925 is not set # CONFIG_VIDEO_JX_F37 is not set # CONFIG_VIDEO_JX_H62 is not set # CONFIG_VIDEO_JX_H65 is not set # CONFIG_VIDEO_JX_K04 is not set # CONFIG_VIDEO_SC031GS is not set # CONFIG_VIDEO_SC035HGS is not set # CONFIG_VIDEO_SC132GS is not set # CONFIG_VIDEO_SC200AI is not set # CONFIG_VIDEO_SC210IOT is not set # CONFIG_VIDEO_SC2232 is not set # CONFIG_VIDEO_SC2239 is not set # CONFIG_VIDEO_SC223A is not set # CONFIG_VIDEO_SC2310 is not set # CONFIG_VIDEO_SC2335 is not set # CONFIG_VIDEO_SC401AI is not set # CONFIG_VIDEO_SC4238 is not set # CONFIG_VIDEO_SC430CS is not set # CONFIG_VIDEO_SC500AI is not set # CONFIG_VIDEO_SC5239 is not set # CONFIG_VIDEO_SC8220 is not set # CONFIG_VIDEO_SP250A is not set # CONFIG_VIDEO_HYNIX_HI556 is not set # CONFIG_VIDEO_HYNIX_HI846 is not set # CONFIG_VIDEO_HM5040 is not set # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # CONFIG_VIDEO_SGM3784 is not set # # Video improvement chips # # CONFIG_VIDEO_UPD64031A is not set # CONFIG_VIDEO_UPD64083 is not set # # Audio/Video compression chips # # CONFIG_VIDEO_SAA6752HS is not set # # SDR tuner chips # # # Miscellaneous helper chips # # CONFIG_VIDEO_THS7303 is not set # CONFIG_VIDEO_M52790 is not set # CONFIG_VIDEO_I2C is not set # CONFIG_VIDEO_NVP6158 is not set # CONFIG_VIDEO_NVP6188 is not set # CONFIG_VIDEO_NVP6324 is not set # CONFIG_VIDEO_HALL_DC_MOTOR is not set # CONFIG_VIDEO_RK_IRCUT is not set # CONFIG_VIDEO_MP6507 is not set CONFIG_VIDEO_XC7022=y CONFIG_VIDEO_XC7160=y # # Sensors used on soc_camera driver # # # soc_camera sensor drivers # # CONFIG_SOC_CAMERA_MT9M001 is not set # CONFIG_SOC_CAMERA_MT9M111 is not set # CONFIG_SOC_CAMERA_MT9T112 is not set # CONFIG_SOC_CAMERA_MT9V022 is not set # CONFIG_SOC_CAMERA_OV5642 is not set # CONFIG_SOC_CAMERA_OV772X is not set # CONFIG_SOC_CAMERA_OV9640 is not set # CONFIG_SOC_CAMERA_OV9740 is not set # CONFIG_SOC_CAMERA_RJ54N1 is not set # CONFIG_SOC_CAMERA_TW9910 is not set # # SPI helper chips # # CONFIG_VIDEO_GS1662 is not set # CONFIG_VIDEO_MS41908 is not set # CONFIG_VIDEO_ROCKCHIP_PREISP is not set # # Media SPI Adapters # # # Customise DVB Frontends # # # Tools to develop new frontends # # # Graphics support # # CONFIG_VGA_ARB is not set CONFIG_DRM=y CONFIG_DRM_DP=y CONFIG_DRM_EDID=y CONFIG_DRM_IGNORE_IOTCL_PERMIT=y CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DEBUG_MM is not set # CONFIG_DRM_DEBUG_SELFTEST is not set CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_KMS_FB_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set CONFIG_DRM_LOAD_EDID_FIRMWARE=y # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_GEM_CMA_HELPER=y # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_RADEON is not set # CONFIG_DRM_AMDGPU is not set # # ACP (Audio CoProcessor) Configuration # # # AMD Library routines # # CONFIG_DRM_NOUVEAU is not set # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set CONFIG_DRM_ROCKCHIP=y # CONFIG_ROCKCHIP_DRM_DEBUG is not set CONFIG_ROCKCHIP_VOP=y CONFIG_ROCKCHIP_VOP2=y CONFIG_ROCKCHIP_PSR=y CONFIG_ROCKCHIP_ANALOGIX_DP=y CONFIG_ROCKCHIP_CDN_DP=y CONFIG_ROCKCHIP_DW_HDMI=y CONFIG_ROCKCHIP_DW_MIPI_DSI=y CONFIG_ROCKCHIP_INNO_HDMI=y CONFIG_ROCKCHIP_LVDS=y CONFIG_ROCKCHIP_DRM_TVE=y CONFIG_ROCKCHIP_RGB=y # CONFIG_DRM_ROCKCHIP_VVOP is not set # CONFIG_ROCKCHIP_EBC_DEV is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_AST is not set # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_LVDS is not set # CONFIG_DRM_QXL is not set # CONFIG_DRM_BOCHS is not set CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_ARM_VERSATILE is not set # CONFIG_DRM_PANEL_LVDS is not set CONFIG_DRM_PANEL_SIMPLE=y # CONFIG_DRM_PANEL_SIMPLE_OF_ONLY is not set # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set # CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set # CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set # CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set # CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set # CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_DUMB_VGA_DAC is not set # CONFIG_DRM_LVDS_ENCODER is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set # CONFIG_DRM_RK1000_TVE is not set # CONFIG_DRM_SIL_SII8620 is not set CONFIG_DRM_SII902X=y # CONFIG_DRM_SII9234 is not set # CONFIG_DRM_THINE_THC63LVD1024 is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TI_TFP410 is not set CONFIG_DRM_ANALOGIX_DP=y # CONFIG_DRM_I2C_ADV7511 is not set 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_ARCPGU is not set # CONFIG_DRM_HISI_HIBMC is not set # CONFIG_DRM_HISI_KIRIN is not set # CONFIG_DRM_MXSFB is not set # CONFIG_DRM_TINYDRM is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_MALI400=y CONFIG_MALI450=y # CONFIG_MALI470 is not set # CONFIG_MALI400_DEBUG is not set # CONFIG_MALI400_PROFILING is not set # CONFIG_MALI400_UMP is not set CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH=y CONFIG_MALI_SHARED_INTERRUPTS=y # CONFIG_MALI_PMU_PARALLEL_POWER_UP is not set CONFIG_MALI_DT=y CONFIG_MALI_DEVFREQ=y # CONFIG_MALI_QUIET is not set CONFIG_MALI_MIDGARD=y # CONFIG_MALI_GATOR_SUPPORT is not set # CONFIG_MALI_MIDGARD_ENABLE_TRACE is not set # CONFIG_MALI_DMA_FENCE is not set CONFIG_MALI_EXPERT=y # CONFIG_MALI_CORESTACK is not set # CONFIG_MALI_PRFCNT_SET_SECONDARY is not set # CONFIG_MALI_PLATFORM_FAKE is not set # CONFIG_MALI_PLATFORM_DEVICETREE is not set CONFIG_MALI_PLATFORM_THIRDPARTY=y CONFIG_MALI_PLATFORM_THIRDPARTY_NAME="rk" CONFIG_MALI_DEBUG=y CONFIG_MALI_FENCE_DEBUG=y # CONFIG_MALI_NO_MALI is not set # CONFIG_MALI_TRACE_TIMELINE is not set # CONFIG_MALI_SYSTEM_TRACE is not set # CONFIG_MALI_GPU_MMU_AARCH64 is not set CONFIG_MALI_PWRSOFT_765=y # CONFIG_MALI_KUTF is not set CONFIG_MALI_BIFROST=y CONFIG_MALI_PLATFORM_NAME="rk" CONFIG_MALI_REAL_HW=y # # Platform specific options # CONFIG_MALI_BIFROST_DEVFREQ=y CONFIG_MALI_BIFROST_GATOR_SUPPORT=y # CONFIG_MALI_BIFROST_ENABLE_TRACE is not set # CONFIG_MALI_BIFROST_DMA_FENCE is not set # CONFIG_MALI_ARBITER_SUPPORT is not set # CONFIG_MALI_DMA_BUF_MAP_ON_DEMAND is not set # CONFIG_MALI_DMA_BUF_LEGACY_COMPAT is not set # CONFIG_MALI_BIFROST_EXPERT is not set # CONFIG_MALI_ARBITRATION is not set # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y # CONFIG_FB_MODE_HELPERS is not set # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_UVESA is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_I740 is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_S3 is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VT8623 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_ARK is not set # CONFIG_FB_PM3 is not set # CONFIG_FB_CARMINE is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set # CONFIG_FB_BROADSHEET is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # CONFIG_FB_SM712 is not set CONFIG_BACKLIGHT_LCD_SUPPORT=y # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y CONFIG_BACKLIGHT_GENERIC=y CONFIG_BACKLIGHT_PWM=y # CONFIG_BACKLIGHT_PM8941_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # # Rockchip Misc Video driver # # # RGA # # CONFIG_ROCKCHIP_RGA is not set CONFIG_ROCKCHIP_RGA2=y # CONFIG_ROCKCHIP_RGA2_PROC_FS is not set CONFIG_ROCKCHIP_RGA2_DEBUG_FS=y CONFIG_ROCKCHIP_RGA2_DEBUGGER=y # # IEP # # CONFIG_IEP is not set # CONFIG_IEP_MMU is not set CONFIG_ROCKCHIP_MPP_SERVICE=y CONFIG_ROCKCHIP_MPP_PROC_FS=y CONFIG_ROCKCHIP_MPP_RKVDEC=y CONFIG_ROCKCHIP_MPP_RKVDEC2=y CONFIG_ROCKCHIP_MPP_RKVENC=y CONFIG_ROCKCHIP_MPP_VDPU1=y CONFIG_ROCKCHIP_MPP_VEPU1=y CONFIG_ROCKCHIP_MPP_VDPU2=y CONFIG_ROCKCHIP_MPP_VEPU2=y CONFIG_ROCKCHIP_MPP_IEP2=y CONFIG_ROCKCHIP_MPP_JPGDEC=y CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER=y # CONFIG_LOGO is not set CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_HWDEP=y CONFIG_SND_SEQ_DEVICE=y CONFIG_SND_RAWMIDI=y CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y CONFIG_SND_HRTIMER=y CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 # CONFIG_SND_SUPPORT_OLD_API is not set CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set # CONFIG_SND_DEBUG is not set CONFIG_SND_SEQUENCER=y CONFIG_SND_SEQ_DUMMY=y CONFIG_SND_SEQ_HRTIMER_DEFAULT=y CONFIG_SND_SEQ_MIDI_EVENT=y CONFIG_SND_SEQ_MIDI=y CONFIG_SND_DRIVERS=y # CONFIG_SND_DUMMY is not set # CONFIG_SND_ALOOP is not set # CONFIG_SND_VIRMIDI is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_MPU401 is not set # CONFIG_SND_PCI is not set # # HD-Audio # CONFIG_SND_HDA_PREALLOC_SIZE=64 # CONFIG_SND_SPI is not set CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y # CONFIG_SND_USB_UA101 is not set # CONFIG_SND_USB_CAIAQ is not set # CONFIG_SND_USB_6FIRE is not set # CONFIG_SND_USB_HIFACE is not set # CONFIG_SND_BCD2000 is not set # CONFIG_SND_USB_POD is not set # CONFIG_SND_USB_PODHD is not set # CONFIG_SND_USB_TONEPORT is not set # CONFIG_SND_USB_VARIAX is not set CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # 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_IMX_AUDMUX is not set # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set CONFIG_SND_SOC_ROCKCHIP=y # CONFIG_SND_SOC_ROCKCHIP_AUDIO_PWM is not set CONFIG_SND_SOC_ROCKCHIP_I2S=y CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y CONFIG_SND_SOC_ROCKCHIP_PDM=y CONFIG_SND_SOC_ROCKCHIP_SPDIF=y # CONFIG_SND_SOC_ROCKCHIP_VAD is not set CONFIG_SND_SOC_ROCKCHIP_MAX98090=y CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y CONFIG_SND_SOC_ROCKCHIP_RT5645=y # CONFIG_SND_SOC_ROCKCHIP_RT5651 is not set # CONFIG_SND_SOC_ROCKCHIP_RT5651_RK628 is not set # CONFIG_SND_SOC_ROCKCHIP_HDMI is not set # CONFIG_SND_SOC_RK3288_HDMI_ANALOG is not set # CONFIG_SND_SOC_RK3399_GRU_SOUND is not set # # STMicroelectronics STM32 SOC audio support # # CONFIG_SND_SOC_XTFPGA_I2S is not set # CONFIG_ZX_TDM is not set CONFIG_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set # CONFIG_SND_SOC_ADAU7002 is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4458 is not set # CONFIG_SND_SOC_AK4554 is not set # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # CONFIG_SND_SOC_CS35L33 is not set # CONFIG_SND_SOC_CS35L34 is not set # CONFIG_SND_SOC_CS35L35 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # 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_CS4349 is not set # CONFIG_SND_SOC_CS53L30 is not set # CONFIG_SND_SOC_CX2072X is not set CONFIG_SND_SOC_DUMMY_CODEC=y CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_ES7134 is not set CONFIG_SND_SOC_ES7202=y CONFIG_SND_SOC_ES7202_MIC_MAX_CHANNELS=4 CONFIG_SND_SOC_ES7202_I2C_BUS=1 # CONFIG_SND_SOC_ES7210 is not set # CONFIG_SND_SOC_ES7241 is not set CONFIG_SND_SOC_ES7243E=y # CONFIG_SND_SOC_ES8311 is not set CONFIG_SND_SOC_ES8316=y # CONFIG_SND_SOC_ES8323 is not set # CONFIG_SND_SOC_ES8328_I2C is not set # CONFIG_SND_SOC_ES8328_SPI is not set # CONFIG_SND_SOC_ES8396 is not set # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set CONFIG_SND_SOC_MAX98090=y # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98373 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set # CONFIG_SND_SOC_PCM186X_I2C is not set # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # 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_RK312X is not set # CONFIG_SND_SOC_RK3228 is not set CONFIG_SND_SOC_RK3308=y CONFIG_SND_SOC_RK3328=y CONFIG_SND_SOC_RK817=y CONFIG_SND_SOC_RK_CODEC_DIGITAL=y CONFIG_SND_SOC_RL6231=y CONFIG_SND_SOC_RT5616=y # CONFIG_SND_SOC_RT5631 is not set CONFIG_SND_SOC_RT5640=y CONFIG_SND_SOC_RT5645=y CONFIG_SND_SOC_RT5651=y # CONFIG_SND_SOC_SGTL5000 is not set # CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set # CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set CONFIG_SND_SOC_SPDIF=y # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set # CONFIG_SND_SOC_TLV320AIC3X is not set CONFIG_SND_SOC_TS3A227E=y # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731 is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set # 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_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set # 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_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8824 is not set # 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 is not set # CONFIG_SND_AUDIO_GRAPH_SCU_CARD is not set # # HID support # CONFIG_HID=y CONFIG_HID_BATTERY_STRENGTH=y CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_GENERIC=y # # Special HID drivers # # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set # CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_ASUS is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set # CONFIG_HID_BETOP_FF is not set # CONFIG_HID_CHERRY is not set # CONFIG_HID_CHICONY is not set # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CYPRESS is not set # CONFIG_HID_DRAGONRISE is not set # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set # CONFIG_HID_EZKEY is not set # 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_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set # CONFIG_HID_JABRA is not set # CONFIG_HID_TWINHAN is not set CONFIG_HID_KENSINGTON=y # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LED is not set # CONFIG_HID_LENOVO is not set # CONFIG_HID_LOGITECH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MAYFLASH is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set CONFIG_HID_MULTITOUCH=y # CONFIG_HID_NINTENDO is not set # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set # CONFIG_HID_ORTEK is not set # CONFIG_HID_PANTHERLORD is not set # CONFIG_HID_PENMOUNT is not set # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set # CONFIG_HID_SONY is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set # CONFIG_HID_SUNPLUS is not set # CONFIG_HID_RMI is not set # CONFIG_HID_GREENASIA is not set # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_WACOM is not set # CONFIG_HID_WIIMOTE is not set # CONFIG_HID_XINMO is not set # CONFIG_HID_ZEROPLUS is not set # CONFIG_HID_ZYDACRON is not set # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set CONFIG_USB_HIDDEV=y # # I2C HID support # CONFIG_I2C_HID=y CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_PCI=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # # CONFIG_USB_DEFAULT_PERSIST is not set # CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_OTG=y # CONFIG_USB_OTG_WHITELIST is not set # 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_MON=y # CONFIG_USB_WUSB_CBAF is not set # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y # CONFIG_USB_XHCI_DBGCAP is not set CONFIG_USB_XHCI_PCI=y 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_PCI=y CONFIG_USB_EHCI_HCD_PLATFORM=y # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y # CONFIG_USB_OHCI_HCD_PCI is not set CONFIG_USB_OHCI_HCD_PLATFORM=y # CONFIG_USB_UHCI_HCD is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=y # CONFIG_USB_PRINTER is not set CONFIG_USB_WDM=y # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set CONFIG_USB_UAS=y # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_MUSB_HDRC is not set CONFIG_USB_DWC3=y # CONFIG_USB_DWC3_HOST is not set # CONFIG_USB_DWC3_GADGET is not set CONFIG_USB_DWC3_DUAL_ROLE=y # # Platform Glue Driver Support # CONFIG_USB_DWC3_HAPS=y CONFIG_USB_DWC3_OF_SIMPLE=y CONFIG_USB_DWC3_ROCKCHIP_INNO=y CONFIG_USB_DWC2=y # CONFIG_USB_DWC2_HOST is not set # # Gadget/Dual-role mode requires USB Gadget support to be enabled # # CONFIG_USB_DWC2_PERIPHERAL is not set CONFIG_USB_DWC2_DUAL_ROLE=y # CONFIG_USB_DWC2_PCI is not set # CONFIG_USB_DWC2_DEBUG is not set # CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set # CONFIG_USB_CHIPIDEA is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # CONFIG_USB_SERIAL=y # CONFIG_USB_SERIAL_CONSOLE is not set CONFIG_USB_SERIAL_GENERIC=y # CONFIG_USB_SERIAL_SIMPLE is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set # CONFIG_USB_SERIAL_CH341 is not set # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set CONFIG_USB_SERIAL_CP210X=y # CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_EMPEG is not set CONFIG_USB_SERIAL_FTDI_SIO=y # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_F81232 is not set # CONFIG_USB_SERIAL_F8153X is not set # CONFIG_USB_SERIAL_GARMIN is not set # CONFIG_USB_SERIAL_IPW is not set # CONFIG_USB_SERIAL_IUU is not set # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set CONFIG_USB_SERIAL_KEYSPAN=y # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_METRO is not set # CONFIG_USB_SERIAL_MOS7720 is not set # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MXUPORT is not set # CONFIG_USB_SERIAL_NAVMAN is not set CONFIG_USB_SERIAL_PL2303=y CONFIG_USB_SERIAL_OTI6858=y # CONFIG_USB_SERIAL_QCAUX is not set CONFIG_USB_SERIAL_QUALCOMM=y # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SAFE is not set CONFIG_USB_SERIAL_SIERRAWIRELESS=y # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_XIRCOM is not set CONFIG_USB_SERIAL_WWAN=y CONFIG_USB_SERIAL_OPTION=y # CONFIG_USB_SERIAL_OMNINET is not set # CONFIG_USB_SERIAL_OPTICON is not set # CONFIG_USB_SERIAL_XSENS_MT is not set # CONFIG_USB_SERIAL_WISHBONE is not set # CONFIG_USB_SERIAL_SSU100 is not set # CONFIG_USB_SERIAL_QT2 is not set # CONFIG_USB_SERIAL_UPD78F0730 is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set CONFIG_USB_EZUSB_FX2=y # CONFIG_USB_HUB_USB251XB is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # # USB Physical Layer drivers # CONFIG_USB_PHY=y # CONFIG_NOP_USB_XCEIV is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set # CONFIG_USB_ULPI is not set CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG is not set CONFIG_USB_GADGET_DEBUG_FILES=y # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=500 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # CONFIG_U_SERIAL_CONSOLE is not set # # USB Peripheral Controller # # CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set # CONFIG_USB_SNP_UDC_PLAT is not set # CONFIG_USB_M66592 is not set # CONFIG_USB_BDC_UDC is not set # CONFIG_USB_AMD5536UDC is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_NET2280 is not set # CONFIG_USB_GOKU is not set # CONFIG_USB_EG20T is not set # CONFIG_USB_GADGET_XILINX is not set # CONFIG_USB_DUMMY_HCD is not set CONFIG_USB_LIBCOMPOSITE=y CONFIG_USB_F_ACM=y CONFIG_USB_U_SERIAL=y CONFIG_USB_F_MASS_STORAGE=y CONFIG_USB_F_FS=y CONFIG_USB_F_UVC=y CONFIG_USB_CONFIGFS=y CONFIG_USB_CONFIGFS_UEVENT=y # CONFIG_USB_CONFIGFS_SERIAL is not set CONFIG_USB_CONFIGFS_ACM=y # CONFIG_USB_CONFIGFS_OBEX is not set # CONFIG_USB_CONFIGFS_NCM is not set # CONFIG_USB_CONFIGFS_ECM is not set # CONFIG_USB_CONFIGFS_ECM_SUBSET is not set # CONFIG_USB_CONFIGFS_RNDIS is not set # CONFIG_USB_CONFIGFS_EEM is not set CONFIG_USB_CONFIGFS_MASS_STORAGE=y # CONFIG_USB_CONFIGFS_F_LB_SS is not set CONFIG_USB_CONFIGFS_F_FS=y # CONFIG_USB_CONFIGFS_F_ACC is not set # CONFIG_USB_CONFIGFS_F_AUDIO_SRC is not set # CONFIG_USB_CONFIGFS_F_UAC1 is not set # CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set # CONFIG_USB_CONFIGFS_F_UAC2 is not set # CONFIG_USB_CONFIGFS_F_MIDI is not set # CONFIG_USB_CONFIGFS_F_HID is not set CONFIG_USB_CONFIGFS_F_UVC=y # CONFIG_USB_CONFIGFS_F_PRINTER is not set # CONFIG_TYPEC is not set # CONFIG_USB_ROLE_SWITCH is not set # CONFIG_USB_LED_TRIG is not set # CONFIG_USB_ULPI_BUS is not set # CONFIG_UWB is not set CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y # CONFIG_PWRSEQ_SD8787 is not set CONFIG_PWRSEQ_SIMPLE=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 # CONFIG_SDIO_UART is not set CONFIG_MMC_TEST=y CONFIG_SDIO_KEEPALIVE=y # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_DEBUG is not set # CONFIG_MMC_ARMMMCI is not set CONFIG_MMC_SDHCI=y # CONFIG_MMC_SDHCI_PCI is not set CONFIG_MMC_SDHCI_PLTFM=y CONFIG_MMC_SDHCI_OF_ARASAN=y # CONFIG_MMC_SDHCI_OF_AT91 is not set CONFIG_MMC_SDHCI_OF_DWCMSHC=y # CONFIG_MMC_SDHCI_CADENCE is not set # CONFIG_MMC_SDHCI_F_SDH30 is not set # CONFIG_MMC_TIFM_SD is not set # CONFIG_MMC_SPI is not set # CONFIG_MMC_CB710 is not set # CONFIG_MMC_VIA_SDMMC is not set CONFIG_MMC_DW=y CONFIG_MMC_DW_PLTFM=y # CONFIG_MMC_DW_BLUEFIELD is not set # CONFIG_MMC_DW_EXYNOS is not set # CONFIG_MMC_DW_HI3798CV200 is not set # CONFIG_MMC_DW_K3 is not set # CONFIG_MMC_DW_PCI is not set CONFIG_MMC_DW_ROCKCHIP=y # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_CQHCI=y # CONFIG_MMC_TOSHIBA_PCI is not set # CONFIG_MMC_MTK is not set # CONFIG_MMC_SDHCI_XENON is not set # CONFIG_MMC_SDHCI_OMAP is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y CONFIG_LEDS_CLASS_FLASH=y # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_AAT1290 is not set # CONFIG_LEDS_AS3645A is not set # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_LM3601X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP5521 is not set # CONFIG_LEDS_LP5523 is not set # CONFIG_LEDS_LP5562 is not set # CONFIG_LEDS_LP8501 is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set # CONFIG_LEDS_PWM is not set # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_KTD2692 is not set # CONFIG_LEDS_IS31FL319X is not set CONFIG_LEDS_IS31FL32XX=y CONFIG_LEDS_RGB13H=y # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_SYSCON is not set # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # # LED Triggers # CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y # CONFIG_LEDS_TRIGGER_ONESHOT is not set # CONFIG_LEDS_TRIGGER_DISK is not set # CONFIG_LEDS_TRIGGER_MTD is not set # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set # CONFIG_LEDS_TRIGGER_CPU is not set # CONFIG_LEDS_TRIGGER_ACTIVITY is not set # CONFIG_LEDS_TRIGGER_GPIO is not set # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set # CONFIG_LEDS_TRIGGER_PANIC is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_SUPPORT=y # CONFIG_EDAC is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # I2C RTC drivers # # CONFIG_RTC_DRV_ABB5ZES3 is not set # CONFIG_RTC_DRV_ABX80X is not set # CONFIG_RTC_DRV_DS1307 is not set # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_FAKE is not set CONFIG_RTC_DRV_HYM8563=y # CONFIG_RTC_DRV_MAX6900 is not set CONFIG_RTC_DRV_RK808=y # CONFIG_RTC_DRV_RK_TIMER is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_TPS6586X is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # CONFIG_RTC_DRV_RX8581 is not set # CONFIG_RTC_DRV_RX8025 is not set # CONFIG_RTC_DRV_EM3027 is not set # CONFIG_RTC_DRV_RV8803 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RX6110 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # 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 is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_PL030 is not set # CONFIG_RTC_DRV_PL031 is not set # CONFIG_RTC_DRV_FTRTC010 is not set # CONFIG_RTC_DRV_SNVS is not set # CONFIG_RTC_DRV_R7301 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_HID_SENSOR_TIME is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_OF=y # CONFIG_ALTERA_MSGDMA is not set # CONFIG_AMBA_PL08X is not set # CONFIG_DW_AXI_DMAC is not set # CONFIG_FSL_EDMA is not set # CONFIG_INTEL_IDMA64 is not set # CONFIG_MV_XOR_V2 is not set CONFIG_PL330_DMA=y # CONFIG_XILINX_DMA is not set # CONFIG_XILINX_ZYNQMP_DMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set # CONFIG_DW_DMAC is not set # CONFIG_DW_DMAC_PCI is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set # # DMABUF options # CONFIG_DMABUF_CACHE=y CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set CONFIG_VIRTIO_MENU=y # CONFIG_VIRTIO_PCI is not set # CONFIG_VIRTIO_MMIO is not set # # Microsoft Hyper-V guest support # CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_COMEDI is not set # CONFIG_RTL8192U is not set # CONFIG_RTLLIB is not set # CONFIG_RTL8723BS is not set # CONFIG_R8712U is not set # CONFIG_R8188EU is not set # CONFIG_R8822BE is not set # CONFIG_RTS5208 is not set # CONFIG_VT6655 is not set # CONFIG_VT6656 is not set # # IIO staging drivers # # # Accelerometers # # CONFIG_ADIS16203 is not set # CONFIG_ADIS16240 is not set # # Analog to digital converters # # CONFIG_AD7606 is not set # CONFIG_AD7780 is not set # CONFIG_AD7816 is not set # CONFIG_AD7192 is not set # CONFIG_AD7280 is not set # # Analog digital bi-direction converters # # CONFIG_ADT7316 is not set # # Capacitance to digital converters # # CONFIG_AD7150 is not set # CONFIG_AD7152 is not set # CONFIG_AD7746 is not set # # Direct Digital Synthesis # # CONFIG_AD9832 is not set # CONFIG_AD9834 is not set # # Network Analyzer, Impedance Converters # # CONFIG_AD5933 is not set # # Active energy metering IC # # CONFIG_ADE7854 is not set # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1210 is not set # CONFIG_FB_SM750 is not set # CONFIG_FB_XGI is not set # # Speakup console speech # # CONFIG_SPEAKUP is not set # CONFIG_STAGING_MEDIA is not set # # Android # # CONFIG_ASHMEM is not set # CONFIG_ANDROID_VSOC is not set # CONFIG_ION is not set CONFIG_FIQ_DEBUGGER=y CONFIG_FIQ_DEBUGGER_NO_SLEEP=y # CONFIG_FIQ_DEBUGGER_WAKEUP_IRQ_ALWAYS_ON is not set CONFIG_FIQ_DEBUGGER_CONSOLE=y CONFIG_FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE=y CONFIG_FIQ_DEBUGGER_TRUST_ZONE=y # CONFIG_FIQ_DEBUGGER_UART_OVERLAY is not set CONFIG_RK_CONSOLE_THREAD=y # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_DGNC is not set # CONFIG_GS_FPGABOOT is not set # CONFIG_UNISYSSPAR is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set # CONFIG_FB_TFT is not set # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set # CONFIG_MOST is not set # CONFIG_KS7010 is not set # CONFIG_GREYBUS is not set # CONFIG_PI433 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_POWERVR_ROGUE_N is not set # CONFIG_GOLDFISH is not set CONFIG_CHROME_PLATFORMS=y # CONFIG_CROS_EC_I2C is not set # CONFIG_CROS_EC_SPI is not set CONFIG_CROS_EC_PROTO=y CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Common Clock Framework # CONFIG_COMMON_CLK_DEBUGFS=y # CONFIG_COMMON_CLK_PROCFS is not set # CONFIG_COMMON_CLK_VERSATILE is not set # CONFIG_CLK_HSDK is not set # CONFIG_COMMON_CLK_MAX9485 is not set CONFIG_COMMON_CLK_RK808=y CONFIG_COMMON_CLK_SCMI=y # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set # CONFIG_CLK_QORIQ is not set CONFIG_COMMON_CLK_XGENE=y # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_VC5 is not set CONFIG_COMMON_CLK_ROCKCHIP=y # CONFIG_ROCKCHIP_CLK_COMPENSATION is not set CONFIG_ROCKCHIP_CLK_BOOST=y CONFIG_ROCKCHIP_CLK_INV=y CONFIG_ROCKCHIP_CLK_PVTM=y CONFIG_ROCKCHIP_DCLK_DIV=y # CONFIG_ROCKCHIP_DDRCLK_SCPI is not set CONFIG_ROCKCHIP_DDRCLK_SIP=y # CONFIG_ROCKCHIP_PLL_RK3066 is not set CONFIG_ROCKCHIP_PLL_RK3399=y # CONFIG_HWSPINLOCK is not set # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_PROBE=y CONFIG_CLKSRC_MMIO=y CONFIG_ROCKCHIP_TIMER=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y CONFIG_FSL_ERRATUM_A008585=y CONFIG_HISILICON_ERRATUM_161010101=y CONFIG_ARM64_ERRATUM_858921=y # CONFIG_ARM_TIMER_SP804 is not set CONFIG_MAILBOX=y # CONFIG_ARM_MHU is not set # CONFIG_PLATFORM_MHU is not set # CONFIG_PL320_MBOX is not set # CONFIG_ROCKCHIP_MBOX is not set # CONFIG_ALTERA_MBOX is not set # CONFIG_MAILBOX_TEST is not set # CONFIG_RK3368_MBOX is not set CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # # CONFIG_IOMMU_IO_PGTABLE_LPAE is not set # CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set # CONFIG_IOMMU_DEBUGFS is not set # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_IOMMU_IOVA=y CONFIG_OF_IOMMU=y CONFIG_IOMMU_DMA=y CONFIG_ROCKCHIP_IOMMU=y # CONFIG_ARM_SMMU is not set # CONFIG_ARM_SMMU_V3 is not set # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # # Rpmsg drivers # # CONFIG_RPMSG_QCOM_GLINK_RPM is not set # CONFIG_RPMSG_VIRTIO is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # # Broadcom SoC drivers # # CONFIG_SOC_BRCMSTB is not set # # NXP/Freescale QorIQ SoC drivers # # # i.MX SoC drivers # # # Qualcomm SoC drivers # # # Rockchip CPU selection # CONFIG_CPU_PX30=y CONFIG_CPU_RK1808=y # CONFIG_CPU_RK3308 is not set CONFIG_CPU_RK3328=y # CONFIG_CPU_RK3368 is not set CONFIG_CPU_RK3399=y CONFIG_CPU_RK3568=y CONFIG_ANDROID_VERSION=0x08010000 CONFIG_ROCKCHIP_CPUINFO=y CONFIG_ROCKCHIP_GRF=y # CONFIG_ROCKCHIP_HW_DECOMPRESS is not set CONFIG_ROCKCHIP_IPA=y CONFIG_ROCKCHIP_OPP=y CONFIG_ROCKCHIP_PM_DOMAINS=y CONFIG_ROCKCHIP_PVTM=y # CONFIG_ROCKCHIP_RAMDISK is not set CONFIG_ROCKCHIP_SUSPEND_MODE=y CONFIG_ROCKCHIP_SYSTEM_MONITOR=y CONFIG_ROCKCHIP_MTD_VENDOR_STORAGE=y CONFIG_ROCKCHIP_VENDOR_STORAGE_UPDATE_LOADER=y CONFIG_ROCKCHIP_DEBUG=y # CONFIG_ROCKCHIP_LOW_PERFORMANCE is not set # CONFIG_ROCKCHIP_THUNDER_BOOT is not set CONFIG_ROCKCHIP_SCHED_PERFORMANCE_BIAS=y # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # CONFIG_XILINX_VCU is not set CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y CONFIG_DEVFREQ_GOV_PERFORMANCE=y CONFIG_DEVFREQ_GOV_POWERSAVE=y CONFIG_DEVFREQ_GOV_USERSPACE=y # CONFIG_DEVFREQ_GOV_PASSIVE is not set # # DEVFREQ Drivers # CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=y CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y # CONFIG_ARM_ROCKCHIP_DMC_DEBUG is not set CONFIG_PM_DEVFREQ_EVENT=y CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y # CONFIG_DEVFREQ_EVENT_ROCKCHIP_NOCP is not set CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_GPIO is not set # CONFIG_EXTCON_MAX3355 is not set # CONFIG_EXTCON_RT8973A is not set # CONFIG_EXTCON_SM5502 is not set # CONFIG_EXTCON_USB_GPIO is not set # CONFIG_EXTCON_USBC_CROS_EC is not set CONFIG_MEMORY=y # CONFIG_ARM_PL172_MPMC is not set CONFIG_IIO=y CONFIG_IIO_BUFFER=y # CONFIG_IIO_BUFFER_CB is not set # CONFIG_IIO_BUFFER_HW_CONSUMER is not set CONFIG_IIO_KFIFO_BUF=y # CONFIG_IIO_CONFIGFS is not set CONFIG_IIO_TRIGGER=y CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # CONFIG_IIO_SW_DEVICE is not set # CONFIG_IIO_SW_TRIGGER is not set # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADXL345_I2C is not set # CONFIG_ADXL345_SPI is not set # CONFIG_BMA180 is not set # CONFIG_BMA220 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_DA280 is not set # CONFIG_DA311 is not set # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_DMARD10 is not set # CONFIG_IIO_CROS_EC_ACCEL_LEGACY is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MC3230 is not set # CONFIG_MMA7455_I2C is not set # CONFIG_MMA7455_SPI is not set # CONFIG_MMA7660 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MXC4005 is not set # CONFIG_MXC6255 is not set # CONFIG_SCA3000 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # # Analog to digital converters # # CONFIG_AD7266 is not set # CONFIG_AD7291 is not set # CONFIG_AD7298 is not set # CONFIG_AD7476 is not set # CONFIG_AD7766 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD799X is not set # CONFIG_CC10001_ADC is not set # CONFIG_ENVELOPE_DETECTOR is not set # CONFIG_HI8435 is not set # CONFIG_HX711 is not set # CONFIG_INA2XX_ADC is not set # CONFIG_LTC2471 is not set # CONFIG_LTC2485 is not set # CONFIG_LTC2497 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX11100 is not set # CONFIG_MAX1118 is not set # CONFIG_MAX1363 is not set # CONFIG_MAX9611 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_NAU7802 is not set CONFIG_ROCKCHIP_SARADC=y # CONFIG_ROCKCHIP_SARADC_TEST_CHN is not set # CONFIG_SD_ADC_MODULATOR is not set # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC0832 is not set # CONFIG_TI_ADC084S021 is not set # CONFIG_TI_ADC12138 is not set # CONFIG_TI_ADC108S102 is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_TI_ADC161S626 is not set # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS7950 is not set # CONFIG_TI_ADS8688 is not set # CONFIG_TI_TLC4541 is not set # CONFIG_VF610_ADC is not set # # Analog Front Ends # # CONFIG_IIO_RESCALE is not set # # Amplifiers # # CONFIG_AD8366 is not set # # Chemical Sensors # # CONFIG_ATLAS_PH_SENSOR is not set # CONFIG_BME680 is not set # CONFIG_CCS811 is not set # CONFIG_IAQCORE is not set # CONFIG_VZ89X is not set # CONFIG_IIO_CROS_EC_SENSORS_CORE is not set # # Hid Sensor IIO Common # # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # # Counters # # # Digital to analog converters # # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5592R is not set # CONFIG_AD5593R is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_LTC2632 is not set # CONFIG_AD5686_SPI is not set # CONFIG_AD5696_I2C is not set # CONFIG_AD5755 is not set # CONFIG_AD5758 is not set # CONFIG_AD5761 is not set # CONFIG_AD5764 is not set # CONFIG_AD5791 is not set # CONFIG_AD7303 is not set # CONFIG_AD8801 is not set # CONFIG_DPOT_DAC is not set # CONFIG_DS4424 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # CONFIG_TI_DAC082S085 is not set # CONFIG_TI_DAC5571 is not set # CONFIG_VF610_DAC is not set # # IIO dummy driver # # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_MPU3050_I2C is not set # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # # Health Sensors # # # Heart Rate Monitors # # CONFIG_AFE4403 is not set # CONFIG_AFE4404 is not set # CONFIG_MAX30100 is not set # CONFIG_MAX30102 is not set # # Humidity sensors # # CONFIG_AM2315 is not set # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HTS221 is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set # CONFIG_KMX61 is not set # CONFIG_INV_ICM42600_I2C is not set # CONFIG_INV_ICM42600_SPI is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set # CONFIG_IIO_ST_LSM6DSX is not set # # Light sensors # # CONFIG_ADJD_S311 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_BH1750 is not set # CONFIG_BH1780 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM3605 is not set # CONFIG_CM36651 is not set # CONFIG_GP2AP020A00F is not set CONFIG_SENSORS_ISL29018=y # CONFIG_SENSORS_ISL29028 is not set # CONFIG_ISL29125 is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_LV0104CS is not set # CONFIG_MAX44000 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1133 is not set # CONFIG_SI1145 is not set # CONFIG_STK3310 is not set # CONFIG_ST_UVIS25 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set CONFIG_SENSORS_TSL2563=y CONFIG_TSL2583=y # CONFIG_TSL2772 is not set # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VEML6070 is not set # CONFIG_VL6180 is not set # CONFIG_ZOPT2201 is not set # # Magnetometer sensors # # CONFIG_AK8974 is not set # CONFIG_AK8975 is not set # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN_I2C is not set # CONFIG_BMC150_MAGN_SPI is not set # CONFIG_MAG3110 is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # # Multiplexers # # CONFIG_IIO_MUX is not set # # Inclinometer sensors # # # Triggers - standalone # # CONFIG_IIO_INTERRUPT_TRIGGER is not set CONFIG_IIO_SYSFS_TRIGGER=y # # Digital potentiometers # # CONFIG_AD5272 is not set # CONFIG_DS1803 is not set # CONFIG_MAX5481 is not set # CONFIG_MAX5487 is not set # CONFIG_MCP4018 is not set # CONFIG_MCP4131 is not set # CONFIG_MCP4531 is not set # CONFIG_TPL0102 is not set # # Digital potentiostats # # CONFIG_LMP91000 is not set # # Pressure sensors # # CONFIG_ABP060MG is not set # CONFIG_BMP280 is not set # CONFIG_HP03 is not set # CONFIG_MPL115_I2C is not set # CONFIG_MPL115_SPI is not set # CONFIG_MPL3115 is not set # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # CONFIG_HP206C is not set # CONFIG_ZPA2326 is not set # # Lightning sensors # # CONFIG_AS3935 is not set # # Proximity and distance sensors # # CONFIG_ISL29501 is not set # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_RFD77402 is not set # CONFIG_SRF04 is not set # CONFIG_SX9500 is not set # CONFIG_SRF08 is not set # # Resolver to digital converters # # CONFIG_AD2S1200 is not set # # Temperature sensors # # CONFIG_MAXIM_THERMOCOUPLE is not set # CONFIG_MLX90614 is not set # CONFIG_MLX90632 is not set # CONFIG_TMP006 is not set # CONFIG_TMP007 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_NTB is not set # CONFIG_VME_BUS is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_CROS_EC is not set # CONFIG_PWM_FSL_FTM is not set # CONFIG_PWM_PCA9685 is not set CONFIG_PWM_ROCKCHIP=y # CONFIG_PWM_ROCKCHIP_ONESHOT is not set # # IRQ chip support # CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 CONFIG_ARM_GIC_V2M=y CONFIG_ARM_GIC_V3=y CONFIG_ARM_GIC_V3_ITS=y CONFIG_ARM_GIC_V3_ITS_PCI=y CONFIG_PARTITION_PERCPU=y # CONFIG_IPACK_BUS is not set CONFIG_ARCH_HAS_RESET_CONTROLLER=y CONFIG_RESET_CONTROLLER=y CONFIG_RESET_SCMI=y # CONFIG_RESET_TI_SYSCON is not set # CONFIG_FMC is not set # # PHY Subsystem # CONFIG_GENERIC_PHY=y # CONFIG_PHY_XGENE is not set # CONFIG_BCM_KONA_USB2_PHY is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_CPCAP_USB is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set CONFIG_PHY_ROCKCHIP_CSI2_DPHY=y CONFIG_PHY_ROCKCHIP_DP=y CONFIG_PHY_ROCKCHIP_EMMC=y # CONFIG_PHY_ROCKCHIP_INNO_COMBPHY is not set CONFIG_PHY_ROCKCHIP_INNO_HDMI_PHY=y CONFIG_PHY_ROCKCHIP_INNO_MIPI_DPHY=y CONFIG_PHY_ROCKCHIP_INNO_USB2=y CONFIG_PHY_ROCKCHIP_INNO_USB3=y CONFIG_PHY_ROCKCHIP_INNO_VIDEO_COMBO_PHY=y # CONFIG_PHY_ROCKCHIP_INNO_VIDEO_PHY is not set CONFIG_PHY_ROCKCHIP_MIPI_RX=y CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y CONFIG_PHY_ROCKCHIP_NANENG_EDP=y # CONFIG_PHY_ROCKCHIP_NANENG_USB2 is not set CONFIG_PHY_ROCKCHIP_PCIE=y CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=y CONFIG_PHY_ROCKCHIP_TYPEC=y CONFIG_PHY_ROCKCHIP_USB=y # CONFIG_PHY_SAMSUNG_USB2 is not set # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCI_PMU is not set # CONFIG_ARM_CCN is not set CONFIG_ARM_PMU=y # CONFIG_ARM_DSU_PMU is not set # CONFIG_ARM_SPE_PMU is not set CONFIG_RAS=y # # Android # CONFIG_ANDROID=y # CONFIG_ANDROID_BINDER_IPC is not set # CONFIG_LIBNVDIMM is not set # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y CONFIG_ROCKCHIP_EFUSE=y CONFIG_ROCKCHIP_OTP=y # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # CONFIG_FPGA is not set # CONFIG_FSI is not set # CONFIG_TEE is not set CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_LEGACY_ENERGY_MODEL_DT is not set CONFIG_RK_FLASH=y # # Rockchip Flash Devices # # CONFIG_RK_NANDC_NAND is not set CONFIG_RK_SFC_NAND=y CONFIG_RK_SFC_NAND_MTD=y CONFIG_RK_SFC_NOR=y CONFIG_RK_SFC_NOR_MTD=y # CONFIG_RK_NAND is not set # # Headset device support # # CONFIG_RK_HEADSET is not set # # RKNPU # CONFIG_ROCKCHIP_RKNPU=y # # File systems # CONFIG_DCACHE_WORD_ACCESS=y CONFIG_FS_IOMAP=y # CONFIG_EXT2_FS is not set # CONFIG_EXT3_FS is not set 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 CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_XFS_FS=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_ONLINE_SCRUB is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set # CONFIG_FS_DAX is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y # CONFIG_DNOTIFY is not set CONFIG_INOTIFY_USER=y # CONFIG_FANOTIFY is not set # CONFIG_QUOTA is not set # CONFIG_AUTOFS4_FS is not set # CONFIG_AUTOFS_FS is not set CONFIG_FUSE_FS=y # CONFIG_CUSE is not set CONFIG_OVERLAY_FS=y # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_XINO_AUTO is not set # CONFIG_OVERLAY_FS_METACOPY is not set # CONFIG_INCREMENTAL_FS is not set # # Caches # # CONFIG_FSCACHE is not set # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=936 CONFIG_FAT_DEFAULT_IOCHARSET="utf8" CONFIG_FAT_DEFAULT_UTF8=y CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_CODEPAGE=936 CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" CONFIG_EXFAT_VIRTUAL_XATTR=y CONFIG_EXFAT_VIRTUAL_XATTR_SELINUX_LABEL="u:object_r:exfat:s0" # CONFIG_EXFAT_DEBUG is not set # CONFIG_EXFAT_UEVENT is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set # CONFIG_PROC_UID is not set CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_HUGETLBFS is not set CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=y CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set # CONFIG_SDCARD_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_DEBUG=0 CONFIG_JFFS2_FS_WRITEBUFFER=y # CONFIG_JFFS2_FS_WBUF_VERIFY is not set # CONFIG_JFFS2_SUMMARY is not set # CONFIG_JFFS2_FS_XATTR is not set # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set CONFIG_JFFS2_ZLIB=y CONFIG_JFFS2_RTIME=y CONFIG_UBIFS_FS=y CONFIG_UBIFS_FS_ADVANCED_COMPR=y CONFIG_UBIFS_FS_LZO=y CONFIG_UBIFS_FS_ZLIB=y # CONFIG_UBIFS_ATIME_SUPPORT is not set CONFIG_UBIFS_FS_XATTR=y CONFIG_UBIFS_FS_SECURITY=y # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y CONFIG_SQUASHFS_FILE_CACHE=y # CONFIG_SQUASHFS_FILE_DIRECT is not set CONFIG_SQUASHFS_DECOMP_SINGLE=y # CONFIG_SQUASHFS_DECOMP_MULTI is not set # CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y # CONFIG_SQUASHFS_LZ4 is not set CONFIG_SQUASHFS_LZO=y # CONFIG_SQUASHFS_XZ is not set # CONFIG_SQUASHFS_ZSTD is not set # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y CONFIG_PSTORE_DEFLATE_COMPRESS=y # CONFIG_PSTORE_LZO_COMPRESS is not set # CONFIG_PSTORE_LZ4_COMPRESS is not set # CONFIG_PSTORE_LZ4HC_COMPRESS is not set # CONFIG_PSTORE_842_COMPRESS is not set # CONFIG_PSTORE_ZSTD_COMPRESS is not set CONFIG_PSTORE_COMPRESS=y CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" CONFIG_PSTORE_CONSOLE=y # CONFIG_PSTORE_CONSOLE_FORCE is not set # CONFIG_PSTORE_PMSG is not set # CONFIG_PSTORE_FTRACE is not set CONFIG_PSTORE_RAM=y # CONFIG_PSTORE_MCU_LOG is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y # CONFIG_NFS_FS is not set # CONFIG_NFSD is not set # CONFIG_CEPH_FS is not set # CONFIG_CIFS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set CONFIG_NLS_CODEPAGE_936=y # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set CONFIG_UNICODE=y # CONFIG_UNICODE_NORMALIZATION_SELFTEST is not set # # Security options # CONFIG_KEYS=y CONFIG_KEYS_COMPAT=y # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_BIG_KEYS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set # CONFIG_KEY_DH_OPERATIONS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY_PERF_EVENTS_RESTRICT is not set # CONFIG_SECURITY is not set CONFIG_SECURITYFS=y CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_TEE_SUPPORT is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_DEFAULT_SECURITY="" # # Kernel hardening options # # # Memory initialization # CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_RSA=y # CONFIG_CRYPTO_DH is not set CONFIG_CRYPTO_ECDH=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_WORKQUEUE=y CONFIG_CRYPTO_CRYPTD=y # CONFIG_CRYPTO_MCRYPTD is not set # CONFIG_CRYPTO_AUTHENC is not set # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_SIMD=y # CONFIG_CRYPTO_CURVE25519 is not set # # Authenticated Encryption with Associated Data # CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y # CONFIG_CRYPTO_CHACHA20POLY1305 is not set # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_AEGIS128L is not set # CONFIG_CRYPTO_AEGIS256 is not set # CONFIG_CRYPTO_MORUS640 is not set # CONFIG_CRYPTO_MORUS1280 is not set CONFIG_CRYPTO_SEQIV=y # CONFIG_CRYPTO_ECHAINIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CFB=y CONFIG_CRYPTO_CTR=y # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_ADIANTUM is not set # # Hash modes # CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_VMAC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_CRC32 is not set # CONFIG_CRYPTO_BLAKE2S is not set CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_GHASH=y # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set CONFIG_CRYPTO_SM3=y # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set CONFIG_CRYPTO_ARC4=y # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_CHACHA20 is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SM4 is not set # CONFIG_CRYPTO_TEA is not set CONFIG_CRYPTO_TWOFISH=y CONFIG_CRYPTO_TWOFISH_COMMON=y # # Compression # CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_LZO=y # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # # Random Number Generation # CONFIG_CRYPTO_ANSI_CPRNG=y CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set # CONFIG_CRYPTO_USER_API_AEAD is not set CONFIG_CRYPTO_HASH_INFO=y # # Crypto library routines # # CONFIG_CRYPTO_LIB_BLAKE2S is not set # CONFIG_CRYPTO_LIB_CHACHA is not set CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 # CONFIG_CRYPTO_LIB_POLY1305 is not set # CONFIG_CRYPTO_LIB_CURVE25519 is not set # CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_CCP is not set # CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set # CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set CONFIG_CRYPTO_DEV_ROCKCHIP=y # CONFIG_CRYPTO_DEV_CCREE is not set # CONFIG_CRYPTO_DEV_HISI_SEC is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_RATIONAL=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y # CONFIG_INDIRECT_PIO is not set CONFIG_CRC_CCITT=y CONFIG_CRC16=y CONFIG_CRC_T10DIF=y CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set CONFIG_CRC7=y CONFIG_LIBCRC32C=y # CONFIG_CRC8 is not set CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_XZ_DEC=y # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set # CONFIG_XZ_DEC_IA64 is not set CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y # CONFIG_XZ_DEC_SPARC is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_GZIP=y CONFIG_DECOMPRESS_BZIP2=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DECOMPRESS_XZ=y CONFIG_DECOMPRESS_LZO=y CONFIG_DECOMPRESS_LZ4=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y 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_DIRECT_OPS=y CONFIG_SWIOTLB=y CONFIG_SGL_ALLOC=y CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_CORDIC is not set # CONFIG_DDR is not set # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_ARCH_HAS_SG_CHAIN=y CONFIG_SBITMAP=y # CONFIG_STRING_SELFTEST is not set # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_TIME_FROM_ARM_ARCH_TIMER is not set # CONFIG_PRINTK_PROCESS is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y # # Compile-time checks and compiler options # CONFIG_DEBUG_INFO=y # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_INFO_SPLIT is not set # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_GDB_SCRIPTS is not set CONFIG_ENABLE_MUST_CHECK=y 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 CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_DEBUG_KERNEL=y # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_PAGE_REF is not set # CONFIG_DEBUG_RODATA_TEST is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_DEBUG_VM is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y CONFIG_CC_HAS_KASAN_GENERIC=y # CONFIG_KASAN is not set CONFIG_KASAN_STACK=1 CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_DEBUG_SHIRQ is not set # # Debug Lockups and Hangs # # CONFIG_SOFTLOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 CONFIG_SCHED_DEBUG=y CONFIG_SCHED_INFO=y CONFIG_SCHEDSTATS=y # CONFIG_SCHED_STACK_END_CHECK is not set # CONFIG_DEBUG_TIMEKEEPING is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set CONFIG_DEBUG_SPINLOCK=y # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set CONFIG_HAVE_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PI_LIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set CONFIG_DEBUG_CREDENTIALS=y # # RCU Debugging # # CONFIG_RCU_PERF_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=60 CONFIG_RCU_TRACE=y # CONFIG_RCU_EQS_DEBUG is not set # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set # CONFIG_LATENCYTOP is not set CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y # CONFIG_PREEMPTIRQ_EVENTS is not set # CONFIG_IRQSOFF_TRACER is not set # CONFIG_SCHED_TRACER is not set # CONFIG_HWLAT_TRACER is not set # CONFIG_FTRACE_SYSCALLS is not set # CONFIG_TRACER_SNAPSHOT is not set CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set # CONFIG_STACK_TRACER is not set CONFIG_BLK_DEV_IO_TRACE=y CONFIG_UPROBE_EVENTS=y CONFIG_PROBE_EVENTS=y CONFIG_DYNAMIC_FTRACE=y # CONFIG_FUNCTION_PROFILER is not set CONFIG_FTRACE_MCOUNT_RECORD=y # CONFIG_FTRACE_STARTUP_TEST is not set # CONFIG_HIST_TRIGGERS is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_PREEMPTIRQ_DELAY_TEST is not set # CONFIG_TRACE_EVAL_MAP_FILE is not set CONFIG_TRACING_EVENTS_GPIO=y # CONFIG_DMA_API_DEBUG is not set CONFIG_RUNTIME_TESTING_MENU=y CONFIG_LKDTM=y # CONFIG_TEST_LIST_SORT is not set # CONFIG_TEST_SORT is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_RBTREE_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_BITFIELD is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_OVERFLOW is not set # CONFIG_TEST_RHASHTABLE is not set # CONFIG_TEST_HASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_FIND_BIT_BENCHMARK is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_SYSCTL is not set # CONFIG_TEST_UDELAY is not set # CONFIG_TEST_STATIC_KEYS is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMINIT 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_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y CONFIG_STRICT_DEVMEM=y # CONFIG_IO_STRICT_DEVMEM is not set # CONFIG_ARM64_PTDUMP_DEBUGFS is not set # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set # CONFIG_DEBUG_WX is not set # CONFIG_DEBUG_ALIGN_RODATA is not set # CONFIG_ARM64_RELOC_TEST is not set # CONFIG_CORESIGHT is not set ================================================ FILE: projects/Rockchip/devices/RK356x/options ================================================ ################################################################################ # setup device defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in aarch64) TARGET_KERNEL_ARCH="arm64" TARGET_PATCH_ARCH="aarch64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a55" TARGET_CPU_FLAGS="+crc+crypto+fp+simd" TARGET_FPU="fp-armv8" TARGET_FEATURES="64bit" ;; arm) TARGET_KERNEL_ARCH="arm64" TARGET_PATCH_ARCH="aarch64" TARGET_FLOAT="hard" TARGET_CPU="cortex-a53" TARGET_CPU_FLAGS="+crc" TARGET_FPU="crypto-neon-fp-armv8" TARGET_FEATURES="32bit" ;; esac # Kernel target KERNEL_TARGET="Image" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="" KERNEL_MAKE_EXTRACMD+=" rockchip/rk3568-firefly-roc-pc.dtb" KERNEL_MAKE_EXTRACMD+=" rockchip/rk3566-firefly-roc-pc.dtb" # Mali GPU family MALI_FAMILY="g52" OPENGLES="mali-bifrost" # kernel serial console EXTRA_CMDLINE="console=ttyFIQ0,1500000 console=tty0 ssh" LINUX="rk356x-4.19" UBOOT_SYSTEM="rk356x" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" FIRMWARE="wlan-firmware misc-firmware" #rockchip-firmware dvb-firmware # additional drivers to install: # for a list of additional drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="RTL8812AU" #RTL8192CU RTL8192DU RTL8192EU RTL8188EU RTL8812AU RTL8821CU" # driver addons to install: # for a list of additinoal drivers see packages/linux-driver-addons # Space separated list is supported, DRIVER_ADDONS="" #dvb-latest" # additional packages to install ADDITIONAL_PACKAGES="dtc:host dtc" # debug tty path DEBUG_TTY="/dev/ttyFIQ0" # SquashFS compression method (gzip / lzo / xz / zstd) SQUASHFS_COMPRESSION="lzo" # build and install PulseAudio support (yes / no) PULSEAUDIO_SUPPORT="yes" # build and install espeak support (yes / no) ESPEAK_SUPPORT="no" # build and install bluetooth support (yes / no) BLUETOOTH_SUPPORT="yes" # build and install Avahi (Zeroconf) daemon (yes / no) AVAHI_DAEMON="no" # build with UPnP support (yes / no) KODI_UPNP_SUPPORT="no" # build with NFS support (mounting nfs shares via the OS) (yes / no) NFS_SUPPORT="no" # build with Samba Client support (mounting samba shares via the OS) (yes / no) SAMBA_SUPPORT="yes" # build and install Samba Server (yes / no) SAMBA_SERVER="yes" # build and install SFTP Server (yes / no) SFTP_SERVER="yes" # build and install OpenVPN support (yes / no) OPENVPN_SUPPORT="no" # build and install diskmounter support (udevil) # this service provide auto mounting support for external drives in the # mediacenter also automount internally drives at boottime via udev (yes / no) UDEVIL="yes" # build and install exFAT fuse support (yes / no) EXFAT="yes" # build and install NTFS-3G fuse support (yes / no) NTFS3G="yes" # build and install hfs filesystem utilities (yes / no) HFSTOOLS="yes" # build and install remote support (yes / no) REMOTE_SUPPORT="no" # build and install CEC adapter support (yes / no) CEC_SUPPORT="no" # build and install CEC framework support (yes / no) CEC_FRAMEWORK_SUPPORT="no" # build and install iSCSI support - iscsistart (yes / no) ISCSI_SUPPORT="no" # build with swap support (yes / no) SWAP_SUPPORT="yes" # swap support enabled per default (yes / no) SWAP_ENABLED_DEFAULT="no" # swapfile size if SWAP_SUPPORT=yes in MB SWAPFILESIZE="300" # cron support (yes / no) CRON_SUPPORT="no" # Distribution Specific source location DISTRO_MIRROR="http://sources.libreelec.tv/mirror" DISTRO_SRC="http://sources.libreelec.tv/$LIBREELEC_VERSION" # Settings package name - blank if not required DISTRO_PKG_SETTINGS="" # IR remote protocols supported in default config IR_REMOTE_PROTOCOLS="" # IR remote keymaps supported in default config IR_REMOTE_KEYMAPS="" ================================================ FILE: projects/Rockchip/devices/RK356x/packages/dtc/package.mk ================================================ # 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) PKG_NAME="dtc" PKG_VERSION="1.6.1" PKG_SHA256="264d355e2e547a4964d55b83b113f89be1aea5e61dbe0547ab798d0fde2be180" PKG_LICENSE="GPL" PKG_SITE="https://git.kernel.org/pub/scm/utils/dtc/dtc.git/" PKG_URL="https://git.kernel.org/pub/scm/utils/dtc/dtc.git/snapshot/${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="The Device Tree Compiler" PKG_TOOLCHAIN="make" PKG_MAKE_OPTS_TARGET="dtc fdtput fdtget libfdt" PKG_MAKE_OPTS_HOST="dtc fdtput fdtget libfdt" pre_make_host() { mkdir -p ${PKG_BUILD}/.${HOST_NAME} cp -a ${PKG_BUILD}/* ${PKG_BUILD}/.${HOST_NAME} cd ${PKG_BUILD}/.${HOST_NAME} } makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin cp -P ${PKG_BUILD}/.${HOST_NAME}/dtc ${TOOLCHAIN}/bin cp -P ${PKG_BUILD}/.${HOST_NAME}/fdtput ${TOOLCHAIN}/bin cp -P ${PKG_BUILD}/.${HOST_NAME}/fdtget ${TOOLCHAIN}/bin mkdir -p ${TOOLCHAIN}/lib cp -P ${PKG_BUILD}/.${HOST_NAME}/libfdt/{libfdt.so,libfdt.so.1} ${TOOLCHAIN}/lib } pre_make_target() { mkdir -p ${PKG_BUILD}/.${TARGET_NAME} cp -a ${PKG_BUILD}/* ${PKG_BUILD}/.${TARGET_NAME} cd ${PKG_BUILD}/.${TARGET_NAME} } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp -P ${PKG_BUILD}/.${TARGET_NAME}/dtc ${INSTALL}/usr/bin cp -P ${PKG_BUILD}/.${TARGET_NAME}/fdtput ${INSTALL}/usr/bin/ cp -P ${PKG_BUILD}/.${TARGET_NAME}/fdtget ${INSTALL}/usr/bin/ mkdir -p ${INSTALL}/usr/lib cp -P ${PKG_BUILD}/.${TARGET_NAME}/libfdt/{libfdt.so,libfdt.so.1} ${INSTALL}/usr/lib/ } ================================================ FILE: projects/Rockchip/devices/RK356x/packages/dtc/patches/dtc-0001-libfdt-soname-version.patch ================================================ diff --git a/libfdt/Makefile.libfdt b/libfdt/Makefile.libfdt index e546397..dd71746 100644 --- a/libfdt/Makefile.libfdt +++ b/libfdt/Makefile.libfdt @@ -10,7 +10,7 @@ LIBFDT_VERSION = version.lds LIBFDT_SRCS = fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c fdt_empty_tree.c \ fdt_addresses.c fdt_overlay.c fdt_check.c LIBFDT_OBJS = $(LIBFDT_SRCS:%.c=%.o) -LIBFDT_LIB = libfdt-$(DTC_VERSION).$(SHAREDLIB_EXT) +LIBFDT_LIB = libfdt.$(SHAREDLIB_EXT) libfdt_clean: @$(VECHO) CLEAN "(libfdt)" ================================================ FILE: projects/Rockchip/devices/RK356x/packages/enable-oga-sleep/package.mk ================================================ PKG_NAME="enable-oga-sleep" PKG_VERSION="" PKG_SHA256="" PKG_ARCH="any" PKG_LICENSE="OSS" PKG_DEPENDS_TARGET="systemd" PKG_SITE="" PKG_URL="" PKG_LONGDESC="Sleep configuration" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p $INSTALL/usr/config/sleep.conf.d cp sleep.conf $INSTALL/usr/config/sleep.conf.d/sleep.conf mkdir -p $INSTALL/usr/lib/systemd/system-sleep/ cp sleep.sh $INSTALL/usr/lib/systemd/system-sleep/sleep } ================================================ FILE: projects/Rockchip/devices/RK356x/packages/enable-oga-sleep/sources/sleep.conf ================================================ # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # # Entries in this file show the compile time defaults. # You can change settings by editing this file. # Defaults can be restored by simply deleting this file. # # See systemd-sleep.conf(5) for details [Sleep] AllowSuspend=yes #AllowHibernation=yes #AllowSuspendThenHibernate=yes #AllowHybridSleep=yes #SuspendMode=suspend SuspendState=mem standby freeze #HibernateMode=platform shutdown #HibernateState=disk #HybridSleepMode=suspend platform shutdown #HybridSleepState=disk #HibernateDelaySec=180min ================================================ FILE: projects/Rockchip/devices/RK356x/packages/enable-oga-sleep/sources/sleep.sh ================================================ #!/bin/bash OGA=$(cat /proc/device-tree/compatible) case $1 in pre) # unload esp8090 WiFi module [[ "${OGA}" == *"v11"* ]] && modprobe -r esp8089 # Store sound state. Try to avoid having max volume after resume alsactl store -f /tmp/asound.state # workaround until dwc2 is fixed modprobe -r dwc2 # stop hotkey service systemctl stop odroidgoa-headphones.service ;; post) # Restore pre-sleep sound state alsactl restore -f /tmp/asound.state # workaround until dwc2 is fixed modprobe -r dwc2 modprobe -i dwc2 # re-load WiFi module [[ "${OGA}" == *"v11"* ]] && modprobe esp8089 # re-detect and reapply sound, brightness and hp state systemctl start odroidgoa-headphones.service ;; esac ================================================ FILE: projects/Rockchip/devices/RK356x/packages/odroidgoa-utils/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="odroidgoa-utils" PKG_VERSION="" PKG_SHA256="" PKG_ARCH="any" PKG_LICENSE="OSS" PKG_DEPENDS_TARGET="toolchain python-evdev enable-oga-sleep usb-modeswitch light retrorun" PKG_SITE="" PKG_URL="" PKG_LONGDESC="Support scripts for the ODROID-GO Advance" PKG_TOOLCHAIN="manual" if [ "${ARCH}" = "aarch64" ]; then PKG_DEPENDS_TARGET+=" lib32-retrorun" fi makeinstall_target() { mkdir -p $INSTALL/usr/bin cp * $INSTALL/usr/bin } post_install() { enable_service odroidgoa-hotkeys.service enable_service odroidgoa-headphones.service } ================================================ FILE: projects/Rockchip/devices/RK356x/packages/odroidgoa-utils/sources/headphone_sense.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # Source predefined functions and variables . /etc/profile # Switch to headphones if we have them already connected at boot GPIO=$(cat /sys/class/gpio/gpio86/value) [[ "$GPIO" == "1" ]] && set_ee_setting "audio.device" "headphone" || set_ee_setting "audio.device" "speakers" if [ -e "/emuelec/configs/emuelec.conf" ]; then /usr/bin/odroidgoa_utils.sh setaudio $(get_ee_setting "audio.device") /usr/bin/odroidgoa_utils.sh vol $(get_ee_setting "audio.volume") /usr/bin/odroidgoa_utils.sh bright $(get_ee_setting "brightness.level") fi # Headphone sensing DEVICE='/dev/input/event1' HP_ON='*(SW_HEADPHONE_INSERT), value 0*' HP_OFF='*(SW_HEADPHONE_INSERT), value 1*' evtest "${DEVICE}" | while read line; do case $line in (${HP_ON}) amixer cset name='Playback Path' HP set_ee_setting "audio.device" "headphone" ;; (${HP_OFF}) amixer cset name='Playback Path' SPK set_ee_setting "audio.device" "speakers" ;; esac done ================================================ FILE: projects/Rockchip/devices/RK356x/packages/odroidgoa-utils/sources/odroidgoa_utils.sh ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) # THESE NEEDS TO BE CLEANED UP, MAYBE WITH CASE OR FUNCTIONS # Source predefined functions and variables . /etc/profile if [ "${1}" == "toggleaudio" ];then # Toggle audio output CURRENTAUDIO=$(get_ee_setting "audio.device") case "${CURRENTAUDIO}" in "headphone") echo "setting speakers" amixer cset name='Playback Path' SPK set_ee_setting "audio.device" "speakers" ;; "auto"|"speakers"|*) echo "setting headphones" amixer cset name='Playback Path' HP set_ee_setting "audio.device" "headphone" ;; esac fi if [ "${1}" == "setaudio" ];then # Set audio output second parameter is either headphones or speakers case "${2}" in "headphone") echo "setting headphones" amixer cset name='Playback Path' HP set_ee_setting "audio.device" "headphone" ;; "auto"|"speakers"|*) echo "setting speakers" amixer cset name='Playback Path' SPK set_ee_setting "audio.device" "speakers" ;; esac fi if [ "${1}" == "vol" ];then VOLSTEP=5 CURRENTVOL=$(get_ee_setting "audio.volume") MAXVOL=100 MINVOL=0 if [ "${2}" == "+" ]; then STEPVOL=$(($CURRENTVOL+$VOLSTEP)) elif [ "${2}" == "-" ]; then STEPVOL=$(($CURRENTVOL-$VOLSTEP)) else STEPVOL=${2} fi [ "$STEPVOL" -ge "$MAXVOL" ] && STEPVOL="$MAXVOL" [ "$STEPVOL" -le "$MINVOL" ] && STEPVOL="$MINVOL" amixer set 'Playback' ${STEPVOL}% set_ee_setting "audio.volume" ${STEPVOL} fi if [ "${1}" == "bright" ]; then STEPS="5" CURBRIGHT=$(cat /sys/class/backlight/backlight/brightness) MAXSYSBRIGHT=$(cat /sys/class/backlight/backlight/max_brightness) CURRENTBRIGHT=$(awk -v a="$CURBRIGHT" -v b="$MAXSYSBRIGHT" 'BEGIN{print int((a*100/b)+0.5)}') MAXBRIGHT="100" MINBRIGHT="5" if [ "${2}" == "+" ]; then STEPBRIGHT=$(($CURRENTBRIGHT+$STEPS)) elif [ "${2}" == "-" ]; then STEPBRIGHT=$(($CURRENTBRIGHT-$STEPS)) else STEPBRIGHT=${2} fi [ "$STEPBRIGHT" -ge "$MAXBRIGHT" ] && STEPBRIGHT="$MAXBRIGHT" [ "$STEPBRIGHT" -le "$MINBRIGHT" ] && STEPBRIGHT="$MINBRIGHT" #echo "Setting bright to $STEPBRIGHT" NEWVAL=$(awk -v a="$STEPBRIGHT" -v b="$MAXSYSBRIGHT" 'BEGIN{print int((a*b/100)+0.5)}') echo "${NEWVAL}" > /sys/class/backlight/backlight/brightness set_ee_setting "brightness.level" $STEPBRIGHT fi if [ "${1}" == "oga_oc" ]; then case ${2} in "1.4ghz") gov="userspace" freq="1416000" ;; "1.5ghz") gov="userspace" freq="1512000" ;; *) gov="performance" freq="1296000" ;; esac echo ${gov} > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor echo ${freq} > /sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed echo ${freq} > /sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq fi ================================================ FILE: projects/Rockchip/devices/RK356x/packages/odroidgoa-utils/sources/oga_events.py ================================================ #!/usr/bin/env python3 import evdev import asyncio import time import os.path from subprocess import check_output pwrkey = evdev.InputDevice("/dev/input/event0") if os.path.exists("/dev/input/by-path/platform-odroidgo3-joypad-event-joystick"): odroidgo_joypad = evdev.InputDevice("/dev/input/by-path/platform-odroidgo3-joypad-event-joystick") devicename = "GO-Super Gamepad" odroidgo_volume = evdev.InputDevice("/dev/input/by-path/platform-odroidgo3-keys-event") else: odroidgo_joypad = evdev.InputDevice("/dev/input/by-path/platform-odroidgo2-joypad-event-joystick") devicename = "GO-Advance Gamepad" need_to_swallow_pwr_key = False # After a resume, we swallow the pwr input that triggered the resume class Power: pwr = 116 class Joypad: l1 = 310 r1 = 311 up = 544 down = 545 left = 546 right = 547 f1 = 704 f2 = 705 f5 = 708 volu = 115 vold = 114 def runcmd(cmd, *args, **kw): print(f">>> {cmd}") check_output(cmd, *args, **kw) async def handle_event(device): async for event in device.async_read_loop(): global need_to_swallow_pwr_key if device.name == "rk8xx_pwrkey": keys = odroidgo_joypad.active_keys() if event.value == 1 and event.code == Power.pwr: # pwr on release if need_to_swallow_pwr_key == False: need_to_swallow_pwr_key = True if Joypad.f5 in keys: runcmd("/bin/systemctl poweroff || true", shell=True) else: runcmd("/bin/systemctl suspend || true", shell=True) else: need_to_swallow_pwr_key = False elif device.name == "odroidgo3-keys": keys = odroidgo_volume.active_keys() if event.value == 1: if Joypad.volu in keys: runcmd("/usr/bin/odroidgoa_utils.sh vol +", shell=True) elif Joypad.vold in keys: runcmd("/usr/bin/odroidgoa_utils.sh vol -", shell=True) elif device.name.find(devicename) != -1: keys = odroidgo_joypad.active_keys() print(keys) if event.value == 1 and Joypad.f5 in keys: if event.code == Joypad.up: runcmd("/usr/bin/odroidgoa_utils.sh vol +", shell=True) elif event.code == Joypad.down: runcmd("/usr/bin/odroidgoa_utils.sh vol -", shell=True) elif event.code == Joypad.right: runcmd("/usr/bin/odroidgoa_utils.sh bright +", shell=True) elif event.code == Joypad.left: runcmd("/usr/bin/odroidgoa_utils.sh bright -", shell=True) elif event.code == Joypad.r1: runcmd("/usr/bin/odroidgoa_utils.sh toggleaudio", shell=True) if event.code != 0: print(device.name, event) time.sleep(0.001) def run(): asyncio.ensure_future(handle_event(pwrkey)) asyncio.ensure_future(handle_event(odroidgo_joypad)) if os.path.exists("/dev/input/by-path/platform-odroidgo3-joypad-event-joystick"): asyncio.ensure_future(handle_event(odroidgo_volume)) loop = asyncio.get_event_loop() loop.run_forever() if __name__ == "__main__": # admire run() ================================================ FILE: projects/Rockchip/devices/RK356x/packages/odroidgoa-utils/system.d/odroidgoa-headphones.service ================================================ [Unit] Description=Odroid Go Advance Headphone Sense ConditionPathExists=/dev/input/event1 Before=emuelec.target [Service] Environment=HOME=/storage EnvironmentFile=/storage/.config/emulationstation/scripts/es_env.sh ExecStart=/usr/bin/headphone_sense.sh Restart=on-failure [Install] WantedBy=multi-user.target ================================================ FILE: projects/Rockchip/devices/RK356x/packages/odroidgoa-utils/system.d/odroidgoa-hotkeys.service ================================================ [Unit] Description=Odroid Go Advance Hotkeys ConditionPathExists=/dev/input/event0 ConditionPathExists=/dev/input/event2 Before=emuelec.target [Service] Environment=HOME=/storage EnvironmentFile=/storage/.config/emulationstation/scripts/es_env.sh ExecStart=/usr/bin/oga_events.py Type=simple [Install] WantedBy=multi-user.target ================================================ FILE: projects/Rockchip/devices/RK356x/packages/rkbin/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rkbin" PKG_VERSION="18918b724e9961b2cec3dee2c21019b9092198a2" PKG_SHA256="935cd438a19971d4d64817aa6c6c4f7448a29636b972c7f34031cfd09c14c5b9" PKG_ARCH="arm aarch64" PKG_LICENSE="nonfree" PKG_SITE="https://github.com/rockchip-linux/rkbin" PKG_URL="https://gitlab.com/firefly-linux/rkbin/-/archive/$PKG_VERSION/rkbin-$PKG_VERSION.tar.gz" PKG_LONGDESC="rkbin: Rockchip Firmware and Tool Binaries" PKG_TOOLCHAIN="manual" ================================================ FILE: projects/Rockchip/devices/RK356x/patches/linux/linux-disablerk3568mmu.patch ================================================ diff --git a/arch/arm64/boot/dts/rockchip/rk3568-firefly-core.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-firefly-core.dtsi index e00a9dd46266..18255b5dad08 100644 --- a/arch/arm64/boot/dts/rockchip/rk3568-firefly-core.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3568-firefly-core.dtsi @@ -601,17 +601,17 @@ &rknpu { rknpu-supply = <&vdd_npu>; - status = "okay"; + status = "disabled"; }; &rknpu_mmu { - status = "okay"; + status = "disabled"; }; &bus_npu { bus-supply = <&vdd_logic>; pvtm-supply = <&vdd_cpu>; - status = "okay"; + status = "disabled"; }; &saradc { --- a/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi @@ -6,7 +6,7 @@ / { chosen: chosen { - bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 root=PARTLABEL=rootfs rootfstype=ext4 ro rootwait overlayroot=device:dev=PARTLABEL=userdata,fstype=ext4,mkfs=1 coherent_pool=1m systemd.gpt_auto=0 cgroup_enable=memory swapaccount=1"; + bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 console=tty0 root=PARTLABEL=EMUELEC rootfstype=ext4 ro rootwait overlayroot=device:dev=PARTLABEL=STORAGE,fstype=ext4,mkfs=1 coherent_pool=1m systemd.gpt_auto=0 cgroup_enable=memory swapaccount=1"; }; fiq-debugger { ================================================ FILE: projects/Rockchip/filesystem/usr/bin/cputemp ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) TEMP="$(cat /sys/class/thermal/thermal_zone0/temp)" echo "$(( $TEMP / 1000 )) C" ================================================ FILE: projects/Rockchip/filesystem/usr/lib/systemd/sleep.conf.d/sleep.conf ================================================ [Sleep] SuspendMode=false HibernateMode=false ================================================ FILE: projects/Rockchip/filesystem/usr/share/alsa/cards/Analog.conf ================================================ # # Configuration for Analog # <confdir:pcm/front.conf> Analog.pcm.front.0 { @args [ CARD ] @args.CARD { type string } type hw card $CARD } ================================================ FILE: projects/Rockchip/filesystem/usr/share/alsa/cards/SPDIF.conf ================================================ # # Configuration for SPDIF # <confdir:pcm/iec958.conf> SPDIF.pcm.iec958.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type hooks slave.pcm { type hw card $CARD device 0 } hooks.0 { type ctl_elems hook_args [ { interface PCM name "IEC958 Playback Default" lock true preserve true optional true value [ $AES0 $AES1 $AES2 $AES3 ] } ] } hint.device 0 } ================================================ FILE: projects/Rockchip/filesystem/usr/share/alsa/cards/simple-card.conf ================================================ # # Configuration for HDMI # <confdir:pcm/hdmi.conf> simple-card.pcm.hdmi."hdmi-sound" "cards.simple-card.pcm.hdmi.HDMI" simple-card.pcm.hdmi."rockchip_tinker-codec" "cards.simple-card.pcm.hdmi.HDMI" simple-card.pcm.hdmi."HDMI" { @args [ CARD DEVICE AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.DEVICE { type integer } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type hooks slave.pcm { type hw card $CARD device $DEVICE } hooks.0 { type ctl_elems hook_args [ { interface PCM name "IEC958 Playback Default" lock true preserve true optional true value [ $AES0 $AES1 $AES2 $AES3 ] } ] } hint.device $DEVICE } simple-card.pcm.hdmi.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } @func refer name { @func concat strings [ "cards.simple-card.pcm.hdmi." { @func card_name card $CARD } ":CARD=" $CARD "," "DEVICE=0," "AES0=" $AES0 "," "AES1=" $AES1 "," "AES2=" $AES2 "," "AES3=" $AES3 ] } default { # point to non-existent device card $CARD device 999 hint.device 999 } } # # Configuration for SPDIF # <confdir:pcm/iec958.conf> simple-card.pcm.iec958."SPDIF" { @args [ CARD DEVICE AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.DEVICE { type integer } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type hooks slave.pcm { type hw card $CARD device $DEVICE } hooks.0 { type ctl_elems hook_args [ { interface PCM name "IEC958 Playback Default" lock true preserve true optional true value [ $AES0 $AES1 $AES2 $AES3 ] } ] } hint.device $DEVICE } simple-card.pcm.iec958.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } @func refer name { @func concat strings [ "cards.simple-card.pcm.iec958." { @func card_name card $CARD } ":CARD=" $CARD "," "DEVICE=0," "AES0=" $AES0 "," "AES1=" $AES1 "," "AES2=" $AES2 "," "AES3=" $AES3 ] } default { # point to non-existent device card $CARD device 999 hint.device 999 } } simple-card.pcm.iec958.1 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } @func refer name { @func concat strings [ "cards.simple-card.pcm.iec958." { @func card_name card $CARD } ":CARD=" $CARD "," "DEVICE=0," "AES0=" $AES0 "," "AES1=" $AES1 "," "AES2=" $AES2 "," "AES3=" $AES3 ] } default { # point to non-existent device card $CARD device 999 hint.device 999 } } # # Configuration for Analog/I2S # <confdir:pcm/front.conf> simple-card.pcm.front."I2S" "cards.simple-card.pcm.front.Analog" simple-card.pcm.front."Analog" { @args [ CARD DEVICE ] @args.CARD { type string } @args.DEVICE { type integer } type hw card $CARD hint.device $DEVICE } simple-card.pcm.front.0 { @args [ CARD ] @args.CARD { type string } @func refer name { @func concat strings [ "cards.simple-card.pcm.front." { @func card_name card $CARD } ":CARD=" $CARD "," "DEVICE=0" ] } default { # point to non-existent device card $CARD device 999 hint.device 999 } } ================================================ FILE: projects/Rockchip/kodi/appliance.xml ================================================ <?xml version="1.0" encoding="utf-8"?> <settings version="1"> <section id="system"> <category id="display"> <group id="1"> <setting id="videoscreen.blankdisplays"> <visible>false</visible> </setting> <setting id="videoscreen.limitguisize"> <default>3</default> <visible>true</visible> </setting> </group> <group id="4"> <setting id="videoscreen.noofbuffers"> <default>2</default> <visible>false</visible> </setting> </group> </category> <category id="audio"> <group id="1"> <setting id="audiooutput.audiodevice"> <default>ALSA:hdmi:CARD=HDMI,DEV=0</default> </setting> </group> <group id="3"> <visible>false</visible> <setting id="audiooutput.passthrough"> <default>false</default> </setting> </group> </category> </section> </settings> ================================================ FILE: projects/Rockchip/options ================================================ ################################################################################ # setup system defaults ################################################################################ # Bootloader to use (syslinux / u-boot / bcm2835-bootloader) BOOTLOADER="u-boot" # U-Boot firmware package(s) to use UBOOT_FIRMWARE="rkbin" UBOOT_FIT_IMAGE="u-boot-rockchip.bin" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="dtbs" # Additional kernel dependencies KERNEL_EXTRA_DEPENDS_TARGET="lz4:host" # Kernel to use. values can be: # default: default mainline kernel LINUX="${LINUX:-default}" ################################################################################ # setup build defaults ################################################################################ # Project CFLAGS PROJECT_CFLAGS="" # SquashFS compression method (gzip / lzo / xz / zstd) SQUASHFS_COMPRESSION="zstd" ################################################################################ # setup project defaults ################################################################################ # OpenGL(X) implementation to use (no / mesa) OPENGL="no" # OpenGL-ES implementation to use (no / libmali / mesa) OPENGLES="${OPENGLES:-mesa}" # Vulkan implementation to use (vulkan-loader / no) VULKAN="no" # Displayserver to use (wl / no) DISPLAYSERVER="no" # Windowmanager to use (weston / no) WINDOWMANAGER="no" # Xorg Graphic drivers to use (all / lima,panfrost) # Space separated list is supported, # e.g. GRAPHIC_DRIVERS="lima panfrost" GRAPHIC_DRIVERS="" # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap) KODIPLAYER_DRIVER="$OPENGLES" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" FIRMWARE="misc-firmware wlan-firmware dvb-firmware brcmfmac_sdio-firmware" # additional packages to install ADDITIONAL_PACKAGES+=" dtc" # build and install CEC framework support (yes / no) CEC_FRAMEWORK_SUPPORT="yes" # build with installer (yes / no) INSTALLER_SUPPORT="no" # Start boot partition at 16MiB, same as https://github.com/rockchip-linux/build images SYSTEM_PART_START=32768 # build and install driver addons (yes / no) DRIVER_ADDONS_SUPPORT="no" # driver addons to install: # for a list of additinoal drivers see packages/linux-driver-addons # Space separated list is supported, DRIVER_ADDONS="dvb-latest" # debug tty path DEBUG_TTY="/dev/ttyS2" ================================================ FILE: projects/Rockchip/packages/bootini/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="bootini" PKG_VERSION="" PKG_LICENSE="various" PKG_SITE="" PKG_URL="" PKG_DEPENDS_TARGET="toolchain" PKG_TOOLCHAIN="manual" makeinstall_target() { mkdir -p $INSTALL/usr/share/bootloader if [ "$DEVICE" == "OdroidGoAdvance" ]; then cp boot_oga.ini $INSTALL/usr/share/bootloader/boot.ini elif [ "$DEVICE" == "GameForce" ]; then cp boot_gameforce.ini $INSTALL/usr/share/bootloader/boot.ini fi } ================================================ FILE: projects/Rockchip/packages/bootini/sources/boot_gameforce.ini ================================================ ODROIDGOA-UBOOT-CONFIG setenv fdt_addr_r "0x01f00000" setenv dtb_name "rk3326-gameforce-linux.dtb" setenv loadaddr "0x100000" setenv scriptaddr "0x00500000" setenv kernel_addr_r "0x02008000" sysboot mmc 1:1 any ${scriptaddr} /extlinux/rk3326-gameforce-linux.dtb.conf ================================================ FILE: projects/Rockchip/packages/bootini/sources/boot_oga.ini ================================================ ODROIDGOA-UBOOT-CONFIG setenv fdt_addr_r "0x01f00000" setenv dtb_name "rk3326-odroidgo2-linux.dtb" setenv loadaddr "0x100000" setenv scriptaddr "0x00500000" setenv kernel_addr_r "0x02008000" if test ${hwrev} = 'v11'; then sysboot mmc 1:1 any ${scriptaddr} /extlinux/rk3326-odroidgo2-linux-v11.dtb.conf elif test ${hwrev} = 'v10-go3'; then sysboot mmc 1:1 any ${scriptaddr} /extlinux/rk3326-odroidgo3-linux.dtb.conf else sysboot mmc 1:1 any ${scriptaddr} /extlinux/rk3326-odroidgo2-linux.dtb.conf fi ================================================ FILE: projects/Rockchip/packages/iptables/config/README ================================================ To create your own set of Netfilters you can save your rules in: /storage/.config/iptables/rules.v4 for ipv4 /storage/.config/iptables/rules.v6 for ipv6 To modify tables, edit with nano then save with: iptables-save >/storage/.config/iptables/rules.v4 ip6tables-save >/storage/.config/iptables/rules.v6 To disable iptables use the following command: systemctl mask iptables To enable iptables again: systemctl unmask iptables ================================================ FILE: projects/Rockchip/packages/iptables/config/home.v4 ================================================ *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] :DOCKER-USER - [0:0] :private-subnets - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i tether -p udp -m conntrack --ctstate NEW -j ACCEPT -A INPUT -j private-subnets -A FORWARD -i tether -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT -A FORWARD -o tether -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A DOCKER-USER -j private-subnets -A private-subnets -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A private-subnets -s 10.0.0.0/8 -i eth+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 172.16.0.0/12 -i eth+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 192.168.0.0/16 -i eth+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 10.0.0.0/8 -i en+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 172.16.0.0/12 -i en+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 192.168.0.0/16 -i en+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 10.0.0.0/8 -i wl+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 172.16.0.0/12 -i wl+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 192.168.0.0/16 -i wl+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 10.0.0.0/8 -i tether -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 172.16.0.0/12 -i tether -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 192.168.0.0/16 -i tether -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 10.0.0.0/8 -i docker+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 172.16.0.0/12 -i docker+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s 192.168.0.0/16 -i docker+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -j REJECT --reject-with icmp-port-unreachable COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT ================================================ FILE: projects/Rockchip/packages/iptables/config/home.v6 ================================================ *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] :DOCKER-USER - [0:0] :private-subnets - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i tether -p udp -m conntrack --ctstate NEW -j ACCEPT -A INPUT -j private-subnets -A FORWARD -i tether -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT -A FORWARD -o tether -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A DOCKER-USER -j private-subnets -A private-subnets -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A private-subnets -s fc00::/7 -i eth+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s fc00::/7 -i en+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s fc00::/7 -i wl+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s fc00::/7 -i tether -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -s fc00::/7 -i docker+ -m conntrack --ctstate NEW -j ACCEPT -A private-subnets -j REJECT --reject-with icmp6-port-unreachable COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT ================================================ FILE: projects/Rockchip/packages/iptables/config/public.v4 ================================================ # Netfilter rules for public "untrusted" networks *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] :DOCKER-USER - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Allow tethered Wifi AP -A INPUT -i tether -p udp -m conntrack --ctstate NEW -j ACCEPT -A INPUT -i tether -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i tether -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i tether -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -o tether -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Block DOCKER -A DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j RETURN -A DOCKER-USER -j REJECT --reject-with icmp-port-unreachable COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT ================================================ FILE: projects/Rockchip/packages/iptables/config/public.v6 ================================================ # Netfilter Rules for trusted home networks. *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] :DOCKER-USER - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Allow tethered Wifi AP -A INPUT -i tether -p udp -m conntrack --ctstate NEW -j ACCEPT -A INPUT -i tether -s fc00::/7 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i tether -s fc00::/7 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i tether -s fc00::/7 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -o tether -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A DOCKER-USER -j REJECT --reject-with icmp6-port-unreachable COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT ================================================ FILE: projects/Rockchip/packages/iptables/package.mk ================================================ # 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) PKG_NAME="iptables" PKG_VERSION="1.8.7" PKG_SHA256="c109c96bb04998cd44156622d36f8e04b140701ec60531a10668cfdff5e8d8f0" PKG_LICENSE="GPL" PKG_SITE="https://www.netfilter.org/" PKG_URL="https://www.netfilter.org/projects/iptables/files/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain linux:host libmnl libnftnl" PKG_LONGDESC="IP packet filter administration." PKG_TOOLCHAIN="autotools" post_configure_target() { libtool_remove_rpath libtool } post_makeinstall_target() { mkdir -p ${INSTALL}/usr/config/iptables/ cp -PR ${PKG_DIR}/config/README ${INSTALL}/usr/config/iptables/ mkdir -p ${INSTALL}/etc/iptables/ cp -PR ${PKG_DIR}/config/* ${INSTALL}/etc/iptables/ mkdir -p ${INSTALL}/usr/lib/libreelec cp ${PKG_DIR}/scripts/iptables_helper ${INSTALL}/usr/lib/libreelec } post_install() { enable_service iptables.service } ================================================ FILE: projects/Rockchip/packages/iptables/scripts/iptables_helper ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) IPTABLES4="/usr/sbin/iptables" IPTABLES6="/usr/sbin/ip6tables" IPTABLES_CMDS="$IPTABLES4 $IPTABLES6" PUBLIC_RULES="/etc/iptables/public.v" HOME_RULES="/etc/iptables/home.v" CUSTOM_RULES="/storage/.config/iptables/rules.v" DOCKER="service.system.docker.service" SYSTEMCTL="/usr/bin/systemctl" CONNMANCTL="/usr/bin/connmanctl" check_docker() { $SYSTEMCTL is-active --quiet $DOCKER && $SYSTEMCTL restart $DOCKER } get_technology_config() { $CONNMANCTL technologies | awk -v pattern="^/.*/technology/$1$" -e 'BEGIN {S=0}; /^\/.*/ {S=0}; $0 ~ pattern {S=1}; S==1 {print $0}' } check_tether() { for technology in wifi ethernet; do if get_technology_config $technology | grep -q 'Tethering = True'; then $CONNMANCTL tether $technology off sleep 1 $CONNMANCTL tether $technology on break fi done } flush() { for cmd in $IPTABLES_CMDS; do $cmd -F $cmd -X $cmd -t nat -F $cmd -t nat -X $cmd -t mangle -F $cmd -t mangle -X $cmd -P INPUT ACCEPT $cmd -P FORWARD ACCEPT $cmd -P OUTPUT ACCEPT done check_docker check_tether } enable() { for cmd in $IPTABLES_CMDS; do case "$cmd" in *6*) rules="$RULES6" ipv="6" ;; *) rules="$RULES4" ipv="4" ;; esac if [ -e "$rules" ]; then "$cmd-restore" "$rules" fi done check_docker check_tether } if [ "$1" = "enable" ]; then case "${RULES}" in "none") flush ;; "public") RULES4="${PUBLIC_RULES}4" RULES6="${PUBLIC_RULES}6" ;; "home") RULES4="${HOME_RULES}4" RULES6="${HOME_RULES}6" ;; "custom") RULES4="${CUSTOM_RULES}4" RULES6="${CUSTOM_RULES}6" ;; *) exit 1 ;; esac enable elif [ "$1" = "disable" ]; then flush else exit 1 fi exit 0 ================================================ FILE: projects/Rockchip/packages/iptables/system.d/iptables.service ================================================ [Unit] Description=IPTABLES Packet Filtering ConditionPathExists=/usr/lib/libreelec/iptables_helper ConditionPathExists=|/storage/.cache/services/iptables.conf Before=network.target Wants=network.target [Service] Type=oneshot EnvironmentFile=-/storage/.cache/services/iptables.conf ExecStart=/usr/lib/libreelec/iptables_helper enable ExecReload=/usr/lib/libreelec/iptables_helper enable ExecStop=/usr/lib/libreelec/iptables_helper disable RemainAfterExit=yes [Install] WantedBy=multi-user.target ================================================ FILE: projects/Rockchip/packages/kmscon/libtsm/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="libtsm" PKG_VERSION="6d1cc890183fb6a433f4683aba98cdc8d6fe8549" PKG_SHA256="25910f8c03cd305479b10f1ee04111b274ef7e0ff331fe8d35bee110535cfe15" PKG_LICENSE="GPLv2+" PKG_SITE="https://github.com/syuu1228/libtsm" PKG_URL="$PKG_SITE/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Linux KMS/DRM based virtual Console Emulator" PKG_TOOLCHAIN="autotools" #pre_configure_target() { #} #makeinstall_target() { #} ================================================ FILE: projects/Rockchip/packages/kmscon/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="kmscon" PKG_VERSION="0b3452719992f855b64fa21c9d7fbd6158a8d23a" PKG_SHA256="6b7efdb4f9b6715208898ee4757364c04d1bb903182bba1667644dd68c11524d" PKG_LICENSE="GPLv2+" PKG_SITE="https://github.com/dvdhrm/kmscon" PKG_URL="$PKG_SITE/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain libtsm libxkbcommon" PKG_LONGDESC="Linux KMS/DRM based virtual Console Emulator" PKG_TOOLCHAIN="autotools" PKG_CONFIGURE_OPTS_TARGET=" --disable-debug --with-video=fbdev,drm2d,drm3d --disable-multi-seat --with-sessions=dummy,terminal" ================================================ FILE: projects/Rockchip/packages/kmscon/patches/kmscon-fixbuild.patch ================================================ --- a/src/pty.c +++ b/src/pty.c @@ -45,6 +45,7 @@ #define LOG_SUBSYSTEM "pty" #define KMSCON_NREAD 16384 +#define SIGUNUSED 31 struct kmscon_pty { unsigned long ref; --- a/src/uterm_vt.c +++ b/src/uterm_vt.c @@ -40,6 +40,7 @@ #include <sys/ioctl.h> #include <sys/signalfd.h> #include <sys/stat.h> +#include <sys/sysmacros.h> #include <termios.h> #include <time.h> #include <unistd.h> --- a/configure.ac +++ a/configure.ac @@ -761,7 +761,7 @@ # check for offline man-pages stylesheet AC_MSG_CHECKING([for docbook manpages stylesheet]) -BUILD_MANPAGES_STYLESHEET="http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl" +BUILD_MANPAGES_STYLESHEET="https://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl" AC_PATH_PROGS_FEATURE_CHECK([XSLTPROC_TMP], [xsltproc], AS_IF([`"$ac_path_XSLTPROC_TMP" --nonet "$BUILD_MANPAGES_STYLESHEET" > /dev/null 2>&1`], [BUILD_HAVE_MANPAGES_STYLESHEET=yes])) ================================================ FILE: projects/Rockchip/packages/libgo2/librga/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="librga" PKG_VERSION="1fc02d56d97041c86f01bc1284b7971c6098c5fb" PKG_ARCH="arm aarch64" PKG_LICENSE="GNU" PKG_DEPENDS_TARGET="toolchain libdrm" PKG_SITE="https://github.com/shantigilbert/linux-rga" PKG_URL="$PKG_SITE/archive/$PKG_VERSION.tar.gz" PKG_LONGDESC="The RGA driver userspace " PKG_TOOLCHAIN="auto" ================================================ FILE: projects/Rockchip/packages/libgo2/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="libgo2" PKG_VERSION="bc992566bb86f2fe0c8d981d4db46e2e2beb5b0e" PKG_SHA256="89ad1cf229d581fa8e4498f4f4c526215176e79885e935bd7dc48c5872655f92" PKG_ARCH="arm aarch64" PKG_LICENSE="LGPL" PKG_DEPENDS_TARGET="toolchain libevdev librga libpng openal-soft ${OPENGLES}" PKG_SITE="https://github.com/OtherCrashOverride/libgo2" PKG_URL="$PKG_SITE/archive/$PKG_VERSION.tar.gz" PKG_LONGDESC="Support library for the ODROID-GO Advance " PKG_TOOLCHAIN="make" PKG_MAKE_OPTS_TARGET=" config=release ARCH= INCLUDES=-I$SYSROOT_PREFIX/usr/include/libdrm -I$SYSROOT_PREFIX/usr/include " makeinstall_target() { mkdir -p $INSTALL/usr/lib cp libgo2.so $INSTALL/usr/lib mkdir -p $SYSROOT_PREFIX/usr/include/go2 cp src/*.h $SYSROOT_PREFIX/usr/include/go2 mkdir -p $SYSROOT_PREFIX/usr/lib cp libgo2.so $SYSROOT_PREFIX/usr/lib } ================================================ FILE: projects/Rockchip/packages/linux/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="linux" PKG_LICENSE="GPL" PKG_SITE="http://www.kernel.org" PKG_DEPENDS_HOST="ccache:host rsync:host openssl:host" PKG_DEPENDS_TARGET="toolchain linux:host kmod:host xz:host keyutils ${KERNEL_EXTRA_DEPENDS_TARGET}" PKG_NEED_UNPACK="${LINUX_DEPENDS} $(get_pkg_directory initramfs) $(get_pkg_variable initramfs PKG_NEED_UNPACK)" PKG_LONGDESC="This package contains a precompiled kernel image and the modules." PKG_IS_KERNEL_PKG="yes" PKG_STAMP="${KERNEL_TARGET} ${KERNEL_MAKE_EXTRACMD}" PKG_PATCH_DIRS="${LINUX}" case "$LINUX" in rockchip-4.4) PKG_VERSION="aa8bacf821e5c8ae6dd8cae8d64011c741659945" PKG_SHA256="a2760fe89a15aa7be142fd25fb08ebd357c5d855c41f1612cf47c6e89de39bb3" PKG_URL="https://github.com/rockchip-linux/kernel/archive/$PKG_VERSION.tar.gz" PKG_SOURCE_NAME="linux-$LINUX-$PKG_VERSION.tar.gz" ;; rk356x-4.19) PKG_VERSION="c0c173e0214eeaa0d057599d2f1c6a83213483b1" PKG_SHA256="d748bc0f272373ed219a9bfd242566871dafd0437f88d0212780b8469ea89e5e" PKG_URL="https://gitlab.com/firefly-linux/kernel/-/archive/$PKG_VERSION/kernel-$PKG_VERSION.tar.gz" PKG_SOURCE_NAME="linux-$LINUX-$PKG_VERSION.tar.gz" PKG_PATCH_DIRS="RK356x" ;; OdroidM1-4.19) PKG_VERSION="e45b118834e1395eeacbed77e8b8f35e8105663e" PKG_SHA256="3c4f1bea0b8c26d9951c8b46c6c93127fc0929ff9947c5eb8e479fbaf05fa1f4" PKG_URL="https://github.com/hardkernel/linux/archive/$PKG_VERSION.tar.gz" PKG_SOURCE_NAME="linux-$LINUX-$PKG_VERSION.tar.gz" PKG_PATCH_DIRS="RK356x" ;; odroid-go-a-4.4) PKG_VERSION="faeb665a41b53ebb386e69fe737ccf0707aaf07b" PKG_SHA256="bef15386f296b282e1e75ed78f14c7c0762058806da37854d09af642a15594ae" PKG_URL="https://github.com/hardkernel/linux/archive/$PKG_VERSION.tar.gz" PKG_SOURCE_NAME="linux-$LINUX-$PKG_VERSION.tar.gz" PKG_PATCH_DIRS="OdroidGoAdvance base" ;; gameforce-4.4) PKG_VERSION="8eddb294dcb1a1b0cf63bdf04ea5cdc41a9bd601" PKG_SHA256="ad2f6fee44dfb19c8a43722ca02601f6742af39129f0c79c990ed582709f63cf" PKG_URL="https://github.com/shantigilbert/hardkernel-linux/archive/$PKG_VERSION.tar.gz" PKG_SOURCE_NAME="linux-$LINUX-$PKG_VERSION.tar.gz" PKG_PATCH_DIRS="GameForce base" ;; raspberrypi) PKG_VERSION="3c235dcfe80a7c7ba360219e4a3ecb256f294376" # 4.19.83 PKG_SHA256="23a222d8864107b296b3bf580106421899964af879bb7f1c440e875e565fd6f3" PKG_URL="https://github.com/raspberrypi/linux/archive/$PKG_VERSION.tar.gz" PKG_SOURCE_NAME="linux-$LINUX-$PKG_VERSION.tar.gz" ;; *) PKG_VERSION="5.1.16" PKG_SHA256="8a3e55be3e788700836db6f75875b4d3b824a581d1eacfc2fcd29ed4e727ba3e" PKG_URL="https://www.kernel.org/pub/linux/kernel/v5.x/$PKG_NAME-$PKG_VERSION.tar.xz" PKG_PATCH_DIRS="default" ;; esac PKG_KERNEL_CFG_FILE=$(kernel_config_path) || die if [ -n "${KERNEL_TOOLCHAIN}" ]; then PKG_DEPENDS_HOST+=" gcc-${KERNEL_TOOLCHAIN}:host" PKG_DEPENDS_TARGET+=" gcc-${KERNEL_TOOLCHAIN}:host" HEADERS_ARCH=${TARGET_ARCH} fi if [ "${PKG_BUILD_PERF}" != "no" ] && grep -q ^CONFIG_PERF_EVENTS= ${PKG_KERNEL_CFG_FILE}; then PKG_BUILD_PERF="yes" PKG_DEPENDS_TARGET+=" binutils elfutils libunwind zlib openssl" fi if [ "${TARGET_ARCH}" = "x86_64" ]; then PKG_DEPENDS_TARGET+=" elfutils:host pciutils" PKG_DEPENDS_UNPACK+=" intel-ucode kernel-firmware" elif [ "${TARGET_ARCH}" = "arm" -a "${DEVICE}" = "iMX6" ]; then PKG_DEPENDS_UNPACK+=" firmware-imx" fi if [[ "${KERNEL_TARGET}" = uImage* ]]; then PKG_DEPENDS_TARGET+=" u-boot-tools:host" fi # Ensure that the dependencies of initramfs:target are built correctly, but # we don't want to add initramfs:target as a direct dependency as we install # this "manually" from within linux:target for pkg in $(get_pkg_variable initramfs PKG_DEPENDS_TARGET); do ! listcontains "${PKG_DEPENDS_TARGET}" "${pkg}" && PKG_DEPENDS_TARGET+=" ${pkg}" || true done post_patch() { # linux was already built and its build dir autoremoved - prepare it again for kernel packages if [ -d ${PKG_INSTALL}/.image ]; then cp -p ${PKG_INSTALL}/.image/.config ${PKG_BUILD} kernel_make -C ${PKG_BUILD} prepare # restore the required Module.symvers from an earlier build cp -p ${PKG_INSTALL}/.image/Module.symvers ${PKG_BUILD} fi } post_unpack() { # Add exFAT ${SCRIPTS}/get exfat-linux local PKG_BUILD_EXFAT="${PKG_BUILD}/fs/exfat" [ -e "$PKG_BUILD_EXFAT" ] && rm -rf "$PKG_BUILD_EXFAT" mkdir -p "$PKG_BUILD_EXFAT" tar --strip-components=1 -xf "${SOURCES}/exfat-linux/exfat-linux-$(get_pkg_version exfat-linux).tar.gz" -C "$PKG_BUILD_EXFAT" sed -i '/source "fs\/fat\/Kconfig"/a source "fs\/exfat\/Kconfig"' "${PKG_BUILD}/fs/Kconfig" sed -i '/obj-$(CONFIG_FAT_FS).*+= fat\//a obj-$(CONFIG_EXFAT_FS)\t\t+= exfat\/' "${PKG_BUILD}/fs/Makefile" } make_host() { : } makeinstall_host() { make \ ARCH=${HEADERS_ARCH:-${TARGET_KERNEL_ARCH}} \ HOSTCC="${TOOLCHAIN}/bin/host-gcc" \ HOSTCXX="${TOOLCHAIN}/bin/host-g++" \ HOSTCFLAGS="${HOST_CFLAGS}" \ HOSTCXXFLAGS="${HOST_CXXFLAGS}" \ HOSTLDFLAGS="${HOST_LDFLAGS}" \ INSTALL_HDR_PATH=dest \ headers_install mkdir -p ${SYSROOT_PREFIX}/usr/include cp -R dest/include/* ${SYSROOT_PREFIX}/usr/include } pre_make_target() { ( cd ${ROOT} rm -rf ${BUILD}/initramfs rm -f ${STAMPS_INSTALL}/initramfs/install_target ${STAMPS_INSTALL}/*/install_init ${SCRIPTS}/install initramfs ) pkg_lock_status "ACTIVE" "linux:target" "build" cp ${PKG_KERNEL_CFG_FILE} ${PKG_BUILD}/.config # set initramfs source ${PKG_BUILD}/scripts/config --set-str CONFIG_INITRAMFS_SOURCE "$(kernel_initramfs_confs) ${BUILD}/initramfs" # set default hostname based on ${DISTRONAME} ${PKG_BUILD}/scripts/config --set-str CONFIG_DEFAULT_HOSTNAME "${DISTRONAME}" # disable swap support if not enabled if [ ! "${SWAP_SUPPORT}" = yes ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_SWAP fi # disable nfs support if not enabled if [ ! "${NFS_SUPPORT}" = yes ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_NFS_FS fi # disable cifs support if not enabled if [ ! "${SAMBA_SUPPORT}" = yes ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_CIFS fi # disable iscsi support if not enabled if [ ! "${ISCSI_SUPPORT}" = yes ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_SCSI_ISCSI_ATTRS ${PKG_BUILD}/scripts/config --disable CONFIG_ISCSI_TCP ${PKG_BUILD}/scripts/config --disable CONFIG_ISCSI_BOOT_SYSFS ${PKG_BUILD}/scripts/config --disable CONFIG_ISCSI_IBFT_FIND ${PKG_BUILD}/scripts/config --disable CONFIG_ISCSI_IBFT fi # disable lima/panfrost if libmali is configured if [ "${OPENGLES}" = "libmali" ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_DRM_LIMA ${PKG_BUILD}/scripts/config --disable CONFIG_DRM_PANFROST fi # disable wireguard support if not enabled if [ ! "${WIREGUARD_SUPPORT}" = yes ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_WIREGUARD fi if [ "${TARGET_ARCH}" = "x86_64" ]; then # copy some extra firmware to linux tree mkdir -p ${PKG_BUILD}/external-firmware cp -a $(get_build_dir kernel-firmware)/.copied-firmware/{amdgpu,amd-ucode,i915,radeon,e100,rtl_nic} ${PKG_BUILD}/external-firmware cp -a $(get_build_dir intel-ucode)/intel-ucode ${PKG_BUILD}/external-firmware FW_LIST="$(find ${PKG_BUILD}/external-firmware \( -type f -o -type l \) \( -iname '*.bin' -o -iname '*.fw' -o -path '*/intel-ucode/*' \) | sed 's|.*external-firmware/||' | sort | xargs)" ${PKG_BUILD}/scripts/config --set-str CONFIG_EXTRA_FIRMWARE "${FW_LIST}" ${PKG_BUILD}/scripts/config --set-str CONFIG_EXTRA_FIRMWARE_DIR "external-firmware" elif [ "${TARGET_ARCH}" = "arm" -a "${DEVICE}" = "iMX6" ]; then mkdir -p ${PKG_BUILD}/external-firmware/imx/sdma cp -a $(get_build_dir firmware-imx)/firmware/sdma/*imx6*.bin ${PKG_BUILD}/external-firmware/imx/sdma cp -a $(get_build_dir firmware-imx)/firmware/vpu/*imx6*.bin ${PKG_BUILD}/external-firmware FW_LIST="$(find ${PKG_BUILD}/external-firmware -type f | sed 's|.*external-firmware/||' | sort | xargs)" ${PKG_BUILD}/scripts/config --set-str CONFIG_EXTRA_FIRMWARE "${FW_LIST}" ${PKG_BUILD}/scripts/config --set-str CONFIG_EXTRA_FIRMWARE_DIR "external-firmware" fi kernel_make oldconfig if [ -f "${DISTRO_DIR}/${DISTRO}/kernel_options" ]; then while read OPTION; do [ -z "${OPTION}" -o -n "$(echo "${OPTION}" | grep '^#')" ] && continue if [ "${OPTION##*=}" == "n" -a "$(${PKG_BUILD}/scripts/config --state ${OPTION%%=*})" == "undef" ]; then continue fi if [ "$(${PKG_BUILD}/scripts/config --state ${OPTION%%=*})" != "$(echo ${OPTION##*=} | tr -d '"')" ]; then MISSING_KERNEL_OPTIONS+="\t${OPTION}\n" fi done < ${DISTRO_DIR}/${DISTRO}/kernel_options if [ -n "${MISSING_KERNEL_OPTIONS}" ]; then print_color CLR_WARNING "LINUX: kernel options not correct: \n${MISSING_KERNEL_OPTIONS%%}\nPlease run ./tools/check_kernel_config\n" fi fi } make_target() { export KCFLAGS="-Wno-deprecated-declarations -Wno-stringop-overflow -Wno-array-bounds -Wno-misleading-indentation -Wno-array-compare -Wno-address -Wno-dangling-pointer -Wno-stringop-overread" # 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 if [ -z "${KERNEL_UIMAGE_LOADADDR}" -o -z "${KERNEL_UIMAGE_ENTRYADDR}" ]; then die "ERROR: KERNEL_UIMAGE_LOADADDR and KERNEL_UIMAGE_ENTRYADDR have to be set to build uImage - aborting" fi KERNEL_UIMAGE_TARGET="${KERNEL_TARGET}" KERNEL_TARGET="${KERNEL_TARGET/uImage/Image}" fi DTC_FLAGS=-@ kernel_make ${KERNEL_TARGET} ${KERNEL_MAKE_EXTRACMD} modules if [ "${PKG_BUILD_PERF}" = "yes" ]; then ( cd tools/perf # arch specific perf build args case "${TARGET_ARCH}" in x86_64) PERF_BUILD_ARGS="ARCH=x86" ;; aarch64) PERF_BUILD_ARGS="ARCH=arm64" ;; *) PERF_BUILD_ARGS="ARCH=${TARGET_ARCH}" ;; esac WERROR=0 \ NO_LIBPERL=1 \ NO_LIBPYTHON=1 \ NO_SLANG=1 \ NO_GTK2=1 \ NO_LIBNUMA=1 \ NO_LIBAUDIT=1 \ NO_LZMA=1 \ NO_SDT=1 \ CROSS_COMPILE="${TARGET_PREFIX}" \ JOBS="${CONCURRENCY_MAKE_LEVEL}" \ make ${PERF_BUILD_ARGS} mkdir -p ${INSTALL}/usr/bin cp perf ${INSTALL}/usr/bin ) fi if [ -n "${KERNEL_UIMAGE_TARGET}" ]; then # determine compression used for kernel image KERNEL_UIMAGE_COMP=${KERNEL_UIMAGE_TARGET:7} KERNEL_UIMAGE_COMP=$(echo ${KERNEL_UIMAGE_COMP:-none} | sed 's/gz/gzip/; s/bz2/bzip2/') # calculate new load address to make kernel Image unpack to memory area after compressed image if [ "${KERNEL_UIMAGE_COMP}" != "none" ]; then COMPRESSED_SIZE=$(stat -t "arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET}" | awk '{print $2}') # align to 1 MiB COMPRESSED_SIZE=$(( ((${COMPRESSED_SIZE} - 1 >> 20) + 1) << 20 )) PKG_KERNEL_UIMAGE_LOADADDR=$(printf '%X' "$(( ${KERNEL_UIMAGE_LOADADDR} + ${COMPRESSED_SIZE} ))") PKG_KERNEL_UIMAGE_ENTRYADDR=$(printf '%X' "$(( ${KERNEL_UIMAGE_ENTRYADDR} + ${COMPRESSED_SIZE} ))") else PKG_KERNEL_UIMAGE_LOADADDR=${KERNEL_UIMAGE_LOADADDR} PKG_KERNEL_UIMAGE_ENTRYADDR=${KERNEL_UIMAGE_ENTRYADDR} fi mkimage -A ${TARGET_KERNEL_ARCH} \ -O linux \ -T kernel \ -C ${KERNEL_UIMAGE_COMP} \ -a ${PKG_KERNEL_UIMAGE_LOADADDR} \ -e ${PKG_KERNEL_UIMAGE_ENTRYADDR} \ -d arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET} \ arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_UIMAGE_TARGET} KERNEL_TARGET="${KERNEL_UIMAGE_TARGET}" fi } makeinstall_target() { mkdir -p ${INSTALL}/.image cp -p arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET} System.map .config Module.symvers ${INSTALL}/.image/ kernel_make INSTALL_MOD_PATH=${INSTALL}/$(get_kernel_overlay_dir) modules_install rm -f ${INSTALL}/$(get_kernel_overlay_dir)/lib/modules/*/build rm -f ${INSTALL}/$(get_kernel_overlay_dir)/lib/modules/*/source if [ "${BOOTLOADER}" = "u-boot" ]; then mkdir -p ${INSTALL}/usr/share/bootloader for dtb in arch/${TARGET_KERNEL_ARCH}/boot/dts/*.dtb arch/${TARGET_KERNEL_ARCH}/boot/dts/*/*.dtb; do if [ -f ${dtb} ]; then cp -v ${dtb} ${INSTALL}/usr/share/bootloader fi done elif [ "${BOOTLOADER}" = "bcm2835-bootloader" ]; then mkdir -p ${INSTALL}/usr/share/bootloader/overlays # install platform dtbs, but remove upstream kernel dtbs (i.e. without downstream # drivers and decent USB support) as these are not required by LibreELEC for dtb in arch/${TARGET_KERNEL_ARCH}/boot/dts/*.dtb arch/${TARGET_KERNEL_ARCH}/boot/dts/*/*.dtb; do if [ -f ${dtb} ]; then cp -v ${dtb} ${INSTALL}/usr/share/bootloader fi done rm -f ${INSTALL}/usr/share/bootloader/bcm283*.dtb # duplicated in overlays below safe_remove ${INSTALL}/usr/share/bootloader/overlay_map.dtb # install overlay dtbs for dtb in arch/arm/boot/dts/overlays/*.dtb \ arch/arm/boot/dts/overlays/*.dtbo; do cp ${dtb} ${INSTALL}/usr/share/bootloader/overlays 2>/dev/null || : done cp -p arch/${TARGET_KERNEL_ARCH}/boot/dts/overlays/README ${INSTALL}/usr/share/bootloader/overlays fi } ================================================ FILE: projects/Rockchip/packages/linux/patches/GameForce/linux-999-Valadaa-OC-1.5.patch ================================================ diff --git a/arch/arm64/boot/dts/rockchip/px30.dtsi b/arch/arm64/boot/dts/rockchip/px30.dtsi index 91dd42686b18f..65093245fc4a0 100644 --- a/arch/arm64/boot/dts/rockchip/px30.dtsi +++ b/arch/arm64/boot/dts/rockchip/px30.dtsi @@ -111,14 +111,14 @@ rockchip,temp-hysteresis = <5000>; rockchip,low-temp = <0>; rockchip,low-temp-min-volt = <1000000>; - rockchip,low-temp-adjust-volt = < - /* MHz MHz uV */ - 0 1512 50000 - >; +// rockchip,low-temp-adjust-volt = < +// /* MHz MHz uV */ +// 0 1512 50000 +// >; clocks = <&cru PLL_APLL>; rockchip,avs-scale = <4>; - rockchip,max-volt = <1350000>; + rockchip,max-volt = <1400000>; rockchip,evb-irdrop = <25000>; nvmem-cells = <&cpu_leakage>, <&performance>; nvmem-cell-names = "cpu_leakage", "performance"; @@ -218,11 +218,7 @@ }; opp-1512000000 { opp-hz = /bits/ 64 <1512000000>; - opp-microvolt = <1350000 1350000 1350000>; - opp-microvolt-L0 = <1350000 1350000 1350000>; - opp-microvolt-L1 = <1350000 1350000 1350000>; - opp-microvolt-L2 = <1300000 1300000 1350000>; - opp-microvolt-L3 = <1250000 1250000 1350000>; + opp-microvolt = <1400000>; clock-latency-ns = <40000>; }; }; --- a/arch/arm64/boot/dts/rockchip/rk3326-gameforce-linux.dts +++ b/arch/arm64/boot/dts/rockchip/rk3326-gameforce-linux.dts @@ -416,11 +416,11 @@ 1 13 >; - /delete-node/ opp-408000000; /delete-node/ opp-600000000; /delete-node/ opp-816000000; - /delete-node/ opp-1416000000; - /delete-node/ opp-1512000000; + /delete-node/ opp-1008000000; + /delete-node/ opp-1200000000; + /delete-node/ opp-1248000000; }; &display_subsystem { @@ -716,7 +716,7 @@ regulator-always-on; regulator-boot-on; regulator-min-microvolt = <950000>; - regulator-max-microvolt = <1350000>; + regulator-max-microvolt = <1400000>; regulator-ramp-delay = <6001>; regulator-initial-mode = <0x2>; regulator-name = "vdd_arm"; ================================================ FILE: projects/Rockchip/packages/linux/patches/OdroidGoAdvance/linux-998-Revert_ODROID-GOA_Support_overclock.patch_ ================================================ From 8eddb294dcb1a1b0cf63bdf04ea5cdc41a9bd601 Mon Sep 17 00:00:00 2001 From: shantigilbert <shantic@gmail.com> Date: Thu, 3 Jun 2021 00:40:11 -0500 Subject: [PATCH] Revert "ODROID-GOA: Support overclock" This reverts commit 0cdc293751a9cc918ab178e4448cdf37eac2b462. --- arch/arm64/boot/dts/rockchip/px30.dtsi | 39 +-------- .../rockchip/rk3326-odroidgo2-linux-v11.dts | 11 ++- .../dts/rockchip/rk3326-odroidgo2-linux.dts | 11 ++- .../dts/rockchip/rk3326-odroidgo3-linux.dts | 11 ++- arch/arm64/configs/odroidgoa_defconfig | 6 +- drivers/soc/rockchip/rockchip_opp_select.c | 79 ------------------- 6 files changed, 27 insertions(+), 130 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/px30.dtsi b/arch/arm64/boot/dts/rockchip/px30.dtsi index fad37b2dd8cc4a..91dd42686b18fd 100644 --- a/arch/arm64/boot/dts/rockchip/px30.dtsi +++ b/arch/arm64/boot/dts/rockchip/px30.dtsi @@ -111,11 +111,10 @@ rockchip,temp-hysteresis = <5000>; rockchip,low-temp = <0>; rockchip,low-temp-min-volt = <1000000>; - /* rockchip,low-temp-adjust-volt = < + /* MHz MHz uV */ 0 1512 50000 >; - */ clocks = <&cru PLL_APLL>; rockchip,avs-scale = <4>; @@ -208,15 +207,6 @@ opp-microvolt-L3 = <1250000 1250000 1350000>; clock-latency-ns = <40000>; }; - opp-1368000000 { - opp-hz = /bits/ 64 <1368000000>; - opp-microvolt = <1350000 1350000 1350000>; - opp-microvolt-L0 = <1350000 1350000 1350000>; - opp-microvolt-L1 = <1350000 1350000 1350000>; - opp-microvolt-L2 = <1300000 1300000 1350000>; - opp-microvolt-L3 = <1250000 1250000 1350000>; - clock-latency-ns = <40000>; - }; opp-1416000000 { opp-hz = /bits/ 64 <1416000000>; opp-microvolt = <1350000 1350000 1350000>; @@ -226,26 +216,8 @@ opp-microvolt-L3 = <1250000 1250000 1350000>; clock-latency-ns = <40000>; }; - opp-1440000000 { - opp-hz = /bits/ 64 <1440000000>; - opp-microvolt = <1350000 1350000 1350000>; - opp-microvolt-L0 = <1350000 1350000 1350000>; - opp-microvolt-L1 = <1350000 1350000 1350000>; - opp-microvolt-L2 = <1300000 1300000 1350000>; - opp-microvolt-L3 = <1250000 1250000 1350000>; - clock-latency-ns = <40000>; - }; - opp-1464000000 { - opp-hz = /bits/ 64 <1464000000>; - opp-microvolt = <1350000 1350000 1350000>; - opp-microvolt-L0 = <1350000 1350000 1350000>; - opp-microvolt-L1 = <1350000 1350000 1350000>; - opp-microvolt-L2 = <1300000 1300000 1350000>; - opp-microvolt-L3 = <1250000 1250000 1350000>; - clock-latency-ns = <40000>; - }; - opp-1488000000 { - opp-hz = /bits/ 64 <1488000000>; + opp-1512000000 { + opp-hz = /bits/ 64 <1512000000>; opp-microvolt = <1350000 1350000 1350000>; opp-microvolt-L0 = <1350000 1350000 1350000>; opp-microvolt-L1 = <1350000 1350000 1350000>; @@ -253,11 +225,6 @@ opp-microvolt-L3 = <1250000 1250000 1350000>; clock-latency-ns = <40000>; }; - opp-1512000000 { - opp-hz = /bits/ 64 <1512000000>; - opp-microvolt = <1350000 1350000 1350000>; - clock-latency-ns = <40000>; - }; }; arm-pmu { diff --git a/arch/arm64/boot/dts/rockchip/rk3326-odroidgo2-linux-v11.dts b/arch/arm64/boot/dts/rockchip/rk3326-odroidgo2-linux-v11.dts index ff1bc435106ddd..a9c18390d36761 100644 --- a/arch/arm64/boot/dts/rockchip/rk3326-odroidgo2-linux-v11.dts +++ b/arch/arm64/boot/dts/rockchip/rk3326-odroidgo2-linux-v11.dts @@ -341,14 +341,17 @@ &cpu0_opp_table { rockchip,avs = <1>; - /* default 1.296GHz */ + /* bin scaling clock 1.296MHz */ rockchip,bin-scaling-sel = < - 0 13 - 1 13 + 0 13 + 1 13 >; + /delete-node/ opp-408000000; + /delete-node/ opp-600000000; /delete-node/ opp-816000000; - /delete-node/ opp-1248000000; + /delete-node/ opp-1416000000; + /delete-node/ opp-1512000000; }; &display_subsystem { diff --git a/arch/arm64/boot/dts/rockchip/rk3326-odroidgo2-linux.dts b/arch/arm64/boot/dts/rockchip/rk3326-odroidgo2-linux.dts index 71c1ac36bbfe39..3e3600368ffe04 100644 --- a/arch/arm64/boot/dts/rockchip/rk3326-odroidgo2-linux.dts +++ b/arch/arm64/boot/dts/rockchip/rk3326-odroidgo2-linux.dts @@ -324,14 +324,17 @@ &cpu0_opp_table { rockchip,avs = <1>; - /* default 1.296GHz */ + /* bin scaling clock 1.296MHz */ rockchip,bin-scaling-sel = < - 0 13 - 1 13 + 0 13 + 1 13 >; + /delete-node/ opp-408000000; + /delete-node/ opp-600000000; /delete-node/ opp-816000000; - /delete-node/ opp-1248000000; + /delete-node/ opp-1416000000; + /delete-node/ opp-1512000000; }; &display_subsystem { diff --git a/arch/arm64/boot/dts/rockchip/rk3326-odroidgo3-linux.dts b/arch/arm64/boot/dts/rockchip/rk3326-odroidgo3-linux.dts index 4b8872f36483a2..b14dc0627efe1c 100644 --- a/arch/arm64/boot/dts/rockchip/rk3326-odroidgo3-linux.dts +++ b/arch/arm64/boot/dts/rockchip/rk3326-odroidgo3-linux.dts @@ -344,14 +344,17 @@ &cpu0_opp_table { rockchip,avs = <1>; - /* default 1.296GHz */ + /* bin scaling clock 1.296MHz */ rockchip,bin-scaling-sel = < - 0 13 - 1 13 + 0 13 + 1 13 >; + /delete-node/ opp-408000000; + /delete-node/ opp-600000000; /delete-node/ opp-816000000; - /delete-node/ opp-1248000000; + /delete-node/ opp-1416000000; + /delete-node/ opp-1512000000; }; &display_subsystem { diff --git a/arch/arm64/configs/odroidgoa_defconfig b/arch/arm64/configs/odroidgoa_defconfig index 84eeeade0db416..a5ccbaea26a811 100644 --- a/arch/arm64/configs/odroidgoa_defconfig +++ b/arch/arm64/configs/odroidgoa_defconfig @@ -522,9 +522,9 @@ CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_STAT_DETAILS is not set CONFIG_CPU_FREQ_TIMES=y -# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set -CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set @@ -534,7 +534,7 @@ CONFIG_CPU_FREQ_GOV_POWERSAVE=y CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y CONFIG_CPU_FREQ_GOV_INTERACTIVE=y -# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # diff --git a/drivers/soc/rockchip/rockchip_opp_select.c b/drivers/soc/rockchip/rockchip_opp_select.c index bf1c4ee2ac7912..e712f3e6cef2a0 100644 --- a/drivers/soc/rockchip/rockchip_opp_select.c +++ b/drivers/soc/rockchip/rockchip_opp_select.c @@ -50,70 +50,6 @@ struct pvtm_config { struct thermal_zone_device *tz; }; -#ifdef CONFIG_ARCH_ROCKCHIP_ODROIDGOA -static int opp_bin_sel = 13; /* default 13 */ -static unsigned long max_cpufreq = 1296000; -static int __init opp_bin_sel_setup(char *__str) -{ - int r; - unsigned long cpufreq; - - if (__str == NULL) { - opp_bin_sel = 13; /* default 1.296GHz */ - return 0; - } - - r = kstrtoul(__str, 10, &cpufreq); - max_cpufreq = cpufreq * 1000; - - switch (cpufreq) { - case 408: - opp_bin_sel = 39; - break; - case 600: - opp_bin_sel = 35; - break; - case 1008: - opp_bin_sel = 20; - break; - case 1200: - opp_bin_sel = 16; - break; - case 1296: - opp_bin_sel = 13; - break; - case 1368: - opp_bin_sel = 10; - break; - case 1416: - opp_bin_sel = 8; - break; - case 1440: - opp_bin_sel = 7; - break; - case 1464: - opp_bin_sel = 6; - break; - case 1488: - opp_bin_sel = 5; - break; - case 1512: - opp_bin_sel = 4; - break; - default: - pr_info("[oga-avs]no available cpufreq, set 1.296\n"); - opp_bin_sel = 13; - break; - } - - pr_info("[oga-avs]cpufreq %lu, max_cpufreq %lu, opp_bin_sel %d\n", - cpufreq, max_cpufreq, opp_bin_sel); - - return 0; -} -__setup("max_cpufreq=", opp_bin_sel_setup); -#endif /* CONFIG_ARCH_ROCKCHIP_ODROIDGOA */ - #define PVTM_CH_MAX 8 #define PVTM_SUB_CH_MAX 8 static int pvtm_value[PVTM_CH_MAX][PVTM_SUB_CH_MAX]; @@ -572,14 +508,6 @@ void rockchip_of_get_bin_sel(struct device *dev, struct device_node *np, bin, scale_sel); if (!ret) dev_info(dev, "bin-scale=%d\n", *scale_sel); - -#ifdef CONFIG_ARCH_ROCKCHIP_ODROIDGOA - if (!strncmp(dev_name(dev), "cpu0", 4) && opp_bin_sel) { - *scale_sel = opp_bin_sel; - dev_info(dev, "[oga-avs]bin-scale=%d, dev %s\n", - *scale_sel, dev_name(dev)); - } -#endif } EXPORT_SYMBOL(rockchip_of_get_bin_sel); @@ -797,13 +725,6 @@ int rockchip_adjust_power_scale(struct device *dev, int scale) of_property_read_u32(np, "rockchip,avs-enable", &avs); of_property_read_u32(np, "rockchip,avs", &avs); of_property_read_u32(np, "rockchip,avs-scale", &avs_scale); -#ifdef CONFIG_ARCH_ROCKCHIP_ODROIDGOA - if (!strncmp(dev_name(dev), "cpu0", 4) && opp_bin_sel) { - dev_info(dev, "[oga-avs]set avs_scale : dev %s, avs_scale=%d, maxfreq %ld\n", - dev_name(dev), avs_scale, max_cpufreq); - avs_scale = opp_bin_sel; - } -#endif rockchip_adjust_opp_by_irdrop(dev, np, &safe_rate, &max_rate); dev_info(dev, "avs=%d\n", avs); ================================================ FILE: projects/Rockchip/packages/linux/patches/OdroidGoAdvance/linux-999-Valadaa-OC-1.5.patch_ ================================================ From 14155e36778b31e04f0e754db79c4d6eef835e14 Mon Sep 17 00:00:00 2001 From: valadaa48 <valadaa48@gmx.com> Date: Thu, 31 Dec 2020 21:34:29 -0500 Subject: [PATCH] OGS overclock --- .../boot/dts/rockchip/rk3326-odroidgo3-linux.dts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3326-odroidgo3-linux.dts b/arch/arm64/boot/dts/rockchip/rk3326-odroidgo3-linux.dts index b9c47738512c8..7a79f1c894716 100644 --- a/arch/arm64/boot/dts/rockchip/rk3326-odroidgo3-linux.dts +++ b/arch/arm64/boot/dts/rockchip/rk3326-odroidgo3-linux.dts @@ -341,15 +341,17 @@ /* bin scaling clock 1.296MHz */ rockchip,bin-scaling-sel = < - 0 13 - 1 13 + 0 4 + 1 8 + 2 13 + 3 39 >; - /delete-node/ opp-408000000; /delete-node/ opp-600000000; /delete-node/ opp-816000000; - /delete-node/ opp-1416000000; - /delete-node/ opp-1512000000; + /delete-node/ opp-1008000000; + /delete-node/ opp-1200000000; + /delete-node/ opp-1248000000; }; &display_subsystem { @@ -657,7 +659,7 @@ regulator-always-on; regulator-boot-on; regulator-min-microvolt = <950000>; - regulator-max-microvolt = <1350000>; + regulator-max-microvolt = <1400000>; regulator-ramp-delay = <6001>; regulator-initial-mode = <0x2>; regulator-name = "vdd_arm"; From 89d7bcefdeb04e9b906f224780b8dafcb1c9fffe Mon Sep 17 00:00:00 2001 From: valadaa48 <valadaa48@gmx.com> Date: Sat, 12 Dec 2020 17:04:59 -0500 Subject: [PATCH] initial overclock --- arch/arm64/boot/dts/rockchip/px30.dtsi | 16 ++++++---------- .../dts/rockchip/rk3326-odroidgo2-linux-v11.dts | 15 ++++++++------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/px30.dtsi b/arch/arm64/boot/dts/rockchip/px30.dtsi index 91dd42686b18f..65093245fc4a0 100644 --- a/arch/arm64/boot/dts/rockchip/px30.dtsi +++ b/arch/arm64/boot/dts/rockchip/px30.dtsi @@ -111,14 +111,14 @@ rockchip,temp-hysteresis = <5000>; rockchip,low-temp = <0>; rockchip,low-temp-min-volt = <1000000>; - rockchip,low-temp-adjust-volt = < - /* MHz MHz uV */ - 0 1512 50000 - >; +// rockchip,low-temp-adjust-volt = < +// /* MHz MHz uV */ +// 0 1512 50000 +// >; clocks = <&cru PLL_APLL>; rockchip,avs-scale = <4>; - rockchip,max-volt = <1350000>; + rockchip,max-volt = <1400000>; rockchip,evb-irdrop = <25000>; nvmem-cells = <&cpu_leakage>, <&performance>; nvmem-cell-names = "cpu_leakage", "performance"; @@ -218,11 +218,7 @@ }; opp-1512000000 { opp-hz = /bits/ 64 <1512000000>; - opp-microvolt = <1350000 1350000 1350000>; - opp-microvolt-L0 = <1350000 1350000 1350000>; - opp-microvolt-L1 = <1350000 1350000 1350000>; - opp-microvolt-L2 = <1300000 1300000 1350000>; - opp-microvolt-L3 = <1250000 1250000 1350000>; + opp-microvolt = <1400000>; clock-latency-ns = <40000>; }; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3326-odroidgo2-linux-v11.dts b/arch/arm64/boot/dts/rockchip/rk3326-odroidgo2-linux-v11.dts index 219892adf9931..8089303e1982d 100644 --- a/arch/arm64/boot/dts/rockchip/rk3326-odroidgo2-linux-v11.dts +++ b/arch/arm64/boot/dts/rockchip/rk3326-odroidgo2-linux-v11.dts @@ -336,17 +336,18 @@ &cpu0_opp_table { rockchip,avs = <1>; - /* bin scaling clock 1.296MHz */ rockchip,bin-scaling-sel = < - 0 13 - 1 13 + 0 4 + 1 8 + 2 13 + 3 39 >; - /delete-node/ opp-408000000; /delete-node/ opp-600000000; /delete-node/ opp-816000000; - /delete-node/ opp-1416000000; - /delete-node/ opp-1512000000; + /delete-node/ opp-1008000000; + /delete-node/ opp-1200000000; + /delete-node/ opp-1248000000; }; &display_subsystem { @@ -620,7 +621,7 @@ regulator-always-on; regulator-boot-on; regulator-min-microvolt = <950000>; - regulator-max-microvolt = <1350000>; + regulator-max-microvolt = <1400000>; regulator-ramp-delay = <6001>; regulator-initial-mode = <0x2>; regulator-name = "vdd_arm"; ================================================ FILE: projects/Rockchip/packages/linux/patches/OdroidGoAdvance/r13p0_20200103.patch ================================================ From fbfe5c30bf5643f44cc8c87c9b53b1ba2a0bfa49 Mon Sep 17 00:00:00 2001 From: Joy Cho <joy.cho@hardkernel.com> Date: Tue, 19 Jan 2021 14:42:03 +0900 Subject: [PATCH] gpu: bifrost_for_linux: Apply patches for Vulkan release_r13p0_20200103_with_vulkan_cl_kernel Change-Id: I7dc414e7714242e4876b5db9ee1e4013020fd10a --- drivers/gpu/arm/bifrost_for_linux/Kbuild | 32 +- drivers/gpu/arm/bifrost_for_linux/Kconfig | 47 +- drivers/gpu/arm/bifrost_for_linux/Makefile | 22 +- .../gpu/arm/bifrost_for_linux/Makefile.kbase | 14 +- drivers/gpu/arm/bifrost_for_linux/Mconfig | 209 +++ .../arm/bifrost_for_linux/backend/gpu/Kbuild | 14 +- .../backend/gpu/mali_kbase_backend_config.h | 15 +- .../gpu/mali_kbase_cache_policy_backend.c | 15 +- .../gpu/mali_kbase_cache_policy_backend.h | 15 +- .../gpu/mali_kbase_debug_job_fault_backend.c | 15 +- .../backend/gpu/mali_kbase_devfreq.c | 66 +- .../backend/gpu/mali_kbase_devfreq.h | 15 +- .../backend/gpu/mali_kbase_device_hw.c | 15 +- .../backend/gpu/mali_kbase_device_internal.h | 15 +- .../backend/gpu/mali_kbase_gpu.c | 22 +- .../backend/gpu/mali_kbase_gpuprops_backend.c | 23 +- .../backend/gpu/mali_kbase_instr_backend.c | 37 +- .../backend/gpu/mali_kbase_instr_defs.h | 15 +- .../backend/gpu/mali_kbase_instr_internal.h | 15 +- .../backend/gpu/mali_kbase_irq_internal.h | 15 +- .../backend/gpu/mali_kbase_irq_linux.c | 15 +- .../backend/gpu/mali_kbase_jm_as.c | 31 +- .../backend/gpu/mali_kbase_jm_defs.h | 29 +- .../backend/gpu/mali_kbase_jm_hw.c | 135 +- .../backend/gpu/mali_kbase_jm_internal.h | 15 +- .../backend/gpu/mali_kbase_jm_rb.c | 33 +- .../backend/gpu/mali_kbase_jm_rb.h | 25 +- .../backend/gpu/mali_kbase_js_affinity.c | 15 +- .../backend/gpu/mali_kbase_js_affinity.h | 15 +- .../backend/gpu/mali_kbase_js_backend.c | 44 +- .../backend/gpu/mali_kbase_js_internal.h | 15 +- .../backend/gpu/mali_kbase_mmu_hw_direct.c | 18 +- .../backend/gpu/mali_kbase_mmu_hw_direct.h | 15 +- .../backend/gpu/mali_kbase_pm_always_on.c | 15 +- .../backend/gpu/mali_kbase_pm_always_on.h | 15 +- .../backend/gpu/mali_kbase_pm_backend.c | 106 +- .../backend/gpu/mali_kbase_pm_ca.c | 15 +- .../backend/gpu/mali_kbase_pm_ca.h | 15 +- .../backend/gpu/mali_kbase_pm_ca_devfreq.c | 15 +- .../backend/gpu/mali_kbase_pm_ca_devfreq.h | 15 +- .../backend/gpu/mali_kbase_pm_ca_fixed.c | 15 +- .../backend/gpu/mali_kbase_pm_ca_fixed.h | 15 +- .../backend/gpu/mali_kbase_pm_coarse_demand.c | 15 +- .../backend/gpu/mali_kbase_pm_coarse_demand.h | 15 +- .../backend/gpu/mali_kbase_pm_defs.h | 74 +- .../backend/gpu/mali_kbase_pm_demand.c | 15 +- .../backend/gpu/mali_kbase_pm_demand.h | 15 +- .../backend/gpu/mali_kbase_pm_driver.c | 43 +- .../backend/gpu/mali_kbase_pm_internal.h | 44 +- .../backend/gpu/mali_kbase_pm_metrics.c | 206 +-- .../backend/gpu/mali_kbase_pm_policy.c | 37 +- .../backend/gpu/mali_kbase_pm_policy.h | 15 +- .../backend/gpu/mali_kbase_time.c | 15 +- .../backend/gpu/mali_kbase_time.h | 15 +- drivers/gpu/arm/bifrost_for_linux/build.bp | 101 ++ .../gpu/arm/bifrost_for_linux/docs/Doxyfile | 20 +- .../docs/policy_operation_diagram.dot | 15 +- .../docs/policy_overview.dot | 15 +- drivers/gpu/arm/bifrost_for_linux/ipa/Kbuild | 21 +- .../bifrost_for_linux/ipa/mali_kbase_ipa.c | 138 +- .../bifrost_for_linux/ipa/mali_kbase_ipa.h | 111 +- .../ipa/mali_kbase_ipa_debugfs.c | 61 +- .../ipa/mali_kbase_ipa_debugfs.h | 29 +- .../ipa/mali_kbase_ipa_simple.c | 84 +- .../ipa/mali_kbase_ipa_simple.h | 15 +- .../ipa/mali_kbase_ipa_vinstr_common.c | 263 ++- .../ipa/mali_kbase_ipa_vinstr_common.h | 100 +- .../ipa/mali_kbase_ipa_vinstr_g7x.c | 311 ++++ .../mali_base_hwconfig_features.h | 203 ++- .../mali_base_hwconfig_issues.h | 110 +- .../arm/bifrost_for_linux/mali_base_kernel.h | 281 ++- .../bifrost_for_linux/mali_base_mem_priv.h | 15 +- .../mali_base_vendor_specific_func.h | 15 +- .../gpu/arm/bifrost_for_linux/mali_kbase.h | 89 +- .../mali_kbase_10969_workaround.c | 22 +- .../mali_kbase_10969_workaround.h | 26 +- .../mali_kbase_as_fault_debugfs.c | 39 +- .../mali_kbase_as_fault_debugfs.h | 15 +- .../mali_kbase_cache_policy.c | 15 +- .../mali_kbase_cache_policy.h | 15 +- .../arm/bifrost_for_linux/mali_kbase_config.c | 25 +- .../arm/bifrost_for_linux/mali_kbase_config.h | 68 +- .../mali_kbase_config_defaults.h | 104 +- .../bifrost_for_linux/mali_kbase_context.c | 59 +- .../bifrost_for_linux/mali_kbase_context.h | 45 +- .../bifrost_for_linux/mali_kbase_core_linux.c | 1556 +++++------------ .../bifrost_for_linux/mali_kbase_ctx_sched.c | 15 +- .../bifrost_for_linux/mali_kbase_ctx_sched.h | 66 +- .../arm/bifrost_for_linux/mali_kbase_debug.c | 15 +- .../arm/bifrost_for_linux/mali_kbase_debug.h | 15 +- .../mali_kbase_debug_job_fault.c | 15 +- .../mali_kbase_debug_job_fault.h | 15 +- .../mali_kbase_debug_mem_view.c | 21 +- .../mali_kbase_debug_mem_view.h | 15 +- .../arm/bifrost_for_linux/mali_kbase_defs.h | 1260 +++++++++---- .../arm/bifrost_for_linux/mali_kbase_device.c | 22 +- .../mali_kbase_disjoint_events.c | 15 +- .../bifrost_for_linux/mali_kbase_dma_fence.c | 15 +- .../bifrost_for_linux/mali_kbase_dma_fence.h | 15 +- .../arm/bifrost_for_linux/mali_kbase_event.c | 15 +- .../arm/bifrost_for_linux/mali_kbase_fence.c | 24 +- .../arm/bifrost_for_linux/mali_kbase_fence.h | 24 +- .../bifrost_for_linux/mali_kbase_fence_defs.h | 29 +- .../arm/bifrost_for_linux/mali_kbase_gator.h | 15 +- .../bifrost_for_linux/mali_kbase_gator_api.c | 21 +- .../bifrost_for_linux/mali_kbase_gator_api.h | 15 +- .../mali_kbase_gator_hwcnt_names.h | 21 +- .../mali_kbase_gator_hwcnt_names_tgox.h | 296 ++++ .../mali_kbase_gator_hwcnt_names_thex.h | 17 +- .../mali_kbase_gator_hwcnt_names_tkax.h | 296 ++++ .../mali_kbase_gator_hwcnt_names_tmix.h | 17 +- .../mali_kbase_gator_hwcnt_names_tnox.h | 296 ++++ .../mali_kbase_gator_hwcnt_names_tsix.h | 21 +- .../mali_kbase_gator_hwcnt_names_ttrx.h | 296 ++++ .../arm/bifrost_for_linux/mali_kbase_gpu_id.h | 96 +- .../mali_kbase_gpu_memory_debugfs.c | 19 +- .../mali_kbase_gpu_memory_debugfs.h | 15 +- .../bifrost_for_linux/mali_kbase_gpuprops.c | 100 +- .../bifrost_for_linux/mali_kbase_gpuprops.h | 27 +- .../mali_kbase_gpuprops_types.h | 20 +- .../arm/bifrost_for_linux/mali_kbase_gwt.c | 270 +++ .../arm/bifrost_for_linux/mali_kbase_gwt.h | 55 + .../gpu/arm/bifrost_for_linux/mali_kbase_hw.c | 62 +- .../gpu/arm/bifrost_for_linux/mali_kbase_hw.h | 15 +- .../mali_kbase_hwaccess_backend.h | 15 +- .../mali_kbase_hwaccess_defs.h | 31 +- .../mali_kbase_hwaccess_gpuprops.h | 21 +- .../mali_kbase_hwaccess_instr.h | 23 +- .../mali_kbase_hwaccess_jm.h | 23 +- .../mali_kbase_hwaccess_pm.h | 15 +- .../mali_kbase_hwaccess_time.h | 15 +- .../mali_kbase_hwcnt_reader.h | 15 +- .../arm/bifrost_for_linux/mali_kbase_ioctl.h | 214 ++- .../gpu/arm/bifrost_for_linux/mali_kbase_jd.c | 274 +-- .../bifrost_for_linux/mali_kbase_jd_debugfs.c | 16 +- .../bifrost_for_linux/mali_kbase_jd_debugfs.h | 15 +- .../gpu/arm/bifrost_for_linux/mali_kbase_jm.c | 27 +- .../gpu/arm/bifrost_for_linux/mali_kbase_jm.h | 15 +- .../gpu/arm/bifrost_for_linux/mali_kbase_js.c | 298 ++-- .../gpu/arm/bifrost_for_linux/mali_kbase_js.h | 77 +- .../mali_kbase_js_ctx_attr.c | 15 +- .../mali_kbase_js_ctx_attr.h | 15 +- .../bifrost_for_linux/mali_kbase_js_defs.h | 79 +- .../arm/bifrost_for_linux/mali_kbase_linux.h | 15 +- .../arm/bifrost_for_linux/mali_kbase_mem.c | 1211 ++++++++++--- .../arm/bifrost_for_linux/mali_kbase_mem.h | 371 +++- .../bifrost_for_linux/mali_kbase_mem_linux.c | 448 +---- .../bifrost_for_linux/mali_kbase_mem_linux.h | 131 +- .../mali_kbase_mem_lowlevel.h | 78 +- .../bifrost_for_linux/mali_kbase_mem_pool.c | 265 ++- .../mali_kbase_mem_pool_debugfs.c | 15 +- .../mali_kbase_mem_pool_debugfs.h | 15 +- .../mali_kbase_mem_profile_debugfs.c | 15 +- .../mali_kbase_mem_profile_debugfs.h | 15 +- .../mali_kbase_mem_profile_debugfs_buf_size.h | 20 +- .../arm/bifrost_for_linux/mali_kbase_mmu.c | 401 ++++- .../arm/bifrost_for_linux/mali_kbase_mmu_hw.h | 15 +- .../mali_kbase_mmu_mode_aarch64.c | 46 +- .../mali_kbase_mmu_mode_lpae.c | 47 +- .../mali_kbase_platform_fake.c | 15 +- .../gpu/arm/bifrost_for_linux/mali_kbase_pm.c | 39 +- .../gpu/arm/bifrost_for_linux/mali_kbase_pm.h | 15 +- .../mali_kbase_profiling_gator_api.h | 15 +- .../mali_kbase_regs_history_debugfs.c | 15 +- .../mali_kbase_regs_history_debugfs.h | 15 +- .../arm/bifrost_for_linux/mali_kbase_replay.c | 38 +- .../arm/bifrost_for_linux/mali_kbase_smc.c | 15 +- .../arm/bifrost_for_linux/mali_kbase_smc.h | 15 +- .../bifrost_for_linux/mali_kbase_softjobs.c | 115 +- .../bifrost_for_linux/mali_kbase_strings.c | 15 +- .../bifrost_for_linux/mali_kbase_strings.h | 15 +- .../arm/bifrost_for_linux/mali_kbase_sync.h | 15 +- .../mali_kbase_sync_android.c | 15 +- .../mali_kbase_sync_common.c | 15 +- .../bifrost_for_linux/mali_kbase_sync_file.c | 25 +- .../bifrost_for_linux/mali_kbase_tlstream.c | 100 +- .../bifrost_for_linux/mali_kbase_tlstream.h | 45 +- .../bifrost_for_linux/mali_kbase_trace_defs.h | 15 +- .../mali_kbase_trace_timeline.c | 15 +- .../mali_kbase_trace_timeline.h | 15 +- .../mali_kbase_trace_timeline_defs.h | 15 +- .../bifrost_for_linux/mali_kbase_utility.c | 15 +- .../bifrost_for_linux/mali_kbase_utility.h | 41 +- .../arm/bifrost_for_linux/mali_kbase_vinstr.c | 417 ++++- .../arm/bifrost_for_linux/mali_kbase_vinstr.h | 53 +- .../mali_linux_kbase_trace.h | 15 +- .../arm/bifrost_for_linux/mali_linux_trace.h | 15 +- .../gpu/arm/bifrost_for_linux/mali_malisw.h | 15 +- .../bifrost_for_linux/mali_midg_coherency.h | 15 +- .../arm/bifrost_for_linux/mali_midg_regmap.h | 31 +- .../gpu/arm/bifrost_for_linux/mali_timeline.h | 15 +- drivers/gpu/arm/bifrost_for_linux/mali_uk.h | 15 +- .../arm/bifrost_for_linux/platform/Kconfig | 14 +- .../platform/devicetree/Kbuild | 14 +- .../devicetree/mali_kbase_config_devicetree.c | 23 +- .../devicetree/mali_kbase_config_platform.h | 50 +- .../devicetree/mali_kbase_runtime_pm.c | 21 +- .../platform/rk/mali_kbase_config_rk.c | 53 +- .../platform/vexpress/Kbuild | 15 +- .../vexpress/mali_kbase_config_platform.h | 52 +- .../vexpress/mali_kbase_config_vexpress.c | 38 +- .../platform/vexpress_1xv7_a57/Kbuild | 14 +- .../mali_kbase_config_platform.h | 50 +- .../mali_kbase_config_vexpress.c | 36 +- .../platform/vexpress_6xvirtex7_10mhz/Kbuild | 14 +- .../mali_kbase_config_platform.h | 52 +- .../mali_kbase_config_vexpress.c | 38 +- .../platform_dummy/mali_ukk_os.h | 15 +- .../protected_mode_switcher.h | 15 +- drivers/gpu/arm/bifrost_for_linux/sconscript | 30 +- .../gpu/arm/bifrost_for_linux/tests/Kbuild | 14 +- .../gpu/arm/bifrost_for_linux/tests/Kconfig | 14 +- .../gpu/arm/bifrost_for_linux/tests/Mconfig | 22 + .../gpu/arm/bifrost_for_linux/tests/build.bp | 36 + .../tests/include/kutf/kutf_helpers.h | 217 +-- .../tests/include/kutf/kutf_helpers_user.h | 64 +- .../tests/include/kutf/kutf_mem.h | 15 +- .../tests/include/kutf/kutf_resultset.h | 92 +- .../tests/include/kutf/kutf_suite.h | 113 +- .../tests/include/kutf/kutf_utils.h | 15 +- .../arm/bifrost_for_linux/tests/kutf/Kbuild | 14 +- .../arm/bifrost_for_linux/tests/kutf/Kconfig | 14 +- .../arm/bifrost_for_linux/tests/kutf/Makefile | 14 +- .../arm/bifrost_for_linux/tests/kutf/build.bp | 31 + .../tests/kutf/kutf_helpers.c | 777 +------- .../tests/kutf/kutf_helpers_user.c | 132 +- .../bifrost_for_linux/tests/kutf/kutf_mem.c | 16 +- .../tests/kutf/kutf_resultset.c | 113 +- .../bifrost_for_linux/tests/kutf/kutf_suite.c | 631 +++---- .../bifrost_for_linux/tests/kutf/kutf_utils.c | 15 +- .../bifrost_for_linux/tests/kutf/sconscript | 14 +- .../tests/mali_kutf_irq_test/Kbuild | 14 +- .../tests/mali_kutf_irq_test/Kconfig | 14 +- .../tests/mali_kutf_irq_test/Makefile | 21 +- .../tests/mali_kutf_irq_test/build.bp | 27 + .../mali_kutf_irq_test_main.c | 15 +- .../tests/mali_kutf_irq_test/sconscript | 18 +- .../arm/bifrost_for_linux/tests/sconscript | 14 +- .../thirdparty/mali_kbase_mmap.c | 322 ++++ 239 files changed, 11476 insertions(+), 6794 deletions(-) create mode 100644 drivers/gpu/arm/bifrost_for_linux/Mconfig create mode 100644 drivers/gpu/arm/bifrost_for_linux/build.bp create mode 100644 drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_g7x.c create mode 100644 drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tgox.h create mode 100644 drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tkax.h create mode 100644 drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tnox.h create mode 100644 drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_ttrx.h create mode 100644 drivers/gpu/arm/bifrost_for_linux/mali_kbase_gwt.c create mode 100644 drivers/gpu/arm/bifrost_for_linux/mali_kbase_gwt.h create mode 100644 drivers/gpu/arm/bifrost_for_linux/tests/Mconfig create mode 100644 drivers/gpu/arm/bifrost_for_linux/tests/build.bp create mode 100644 drivers/gpu/arm/bifrost_for_linux/tests/kutf/build.bp create mode 100644 drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/build.bp create mode 100644 drivers/gpu/arm/bifrost_for_linux/thirdparty/mali_kbase_mmap.c diff --git a/drivers/gpu/arm/bifrost_for_linux/Kbuild b/drivers/gpu/arm/bifrost_for_linux/Kbuild index 531b92126b985a..65a3468736a819 100644 --- a/drivers/gpu/arm/bifrost_for_linux/Kbuild +++ b/drivers/gpu/arm/bifrost_for_linux/Kbuild @@ -1,37 +1,38 @@ # -# (C) COPYRIGHT 2012-2016, 2017 ARM Limited. All rights reserved. +# (C) COPYRIGHT 2012-2018 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # # Driver version string which is returned to userspace via an ioctl -MALI_RELEASE_NAME ?= "r8p0-01rel0" +MALI_RELEASE_NAME ?= "r12p0-01rel0" # Paths required for build KBASE_PATH = $(src) KBASE_PLATFORM_PATH = $(KBASE_PATH)/platform_dummy UMP_PATH = $(src)/../../../base -ifeq ($(CONFIG_MALI_BIFROST_ERROR_INJECT),y) -MALI_ERROR_INJECT_ON = 1 -endif - # Set up defaults if not defined by build system MALI_CUSTOMER_RELEASE ?= 1 MALI_UNIT_TEST ?= 0 MALI_KERNEL_TEST_API ?= 0 -MALI_ERROR_INJECT_ON ?= 0 MALI_MOCK_TEST ?= 0 MALI_COVERAGE ?= 0 -MALI_INSTRUMENTATION_LEVEL ?= 0 CONFIG_MALI_PLATFORM_NAME ?= "devicetree" # This workaround is for what seems to be a compiler bug we observed in # GCC 4.7 on AOSP 4.3. The bug caused an intermittent failure compiling @@ -50,10 +51,8 @@ DEFINES = \ -DMALI_CUSTOMER_RELEASE=$(MALI_CUSTOMER_RELEASE) \ -DMALI_KERNEL_TEST_API=$(MALI_KERNEL_TEST_API) \ -DMALI_UNIT_TEST=$(MALI_UNIT_TEST) \ - -DMALI_ERROR_INJECT_ON=$(MALI_ERROR_INJECT_ON) \ -DMALI_MOCK_TEST=$(MALI_MOCK_TEST) \ -DMALI_COVERAGE=$(MALI_COVERAGE) \ - -DMALI_INSTRUMENTATION_LEVEL=$(MALI_INSTRUMENTATION_LEVEL) \ -DMALI_RELEASE_NAME=\"$(MALI_RELEASE_NAME)\" \ -DMALI_GCC_WORKAROUND_MIDCOM_4598=$(MALI_GCC_WORKAROUND_MIDCOM_4598) @@ -111,10 +110,13 @@ SRC := \ mali_kbase_tlstream.c \ mali_kbase_strings.c \ mali_kbase_as_fault_debugfs.c \ - mali_kbase_regs_history_debugfs.c - + mali_kbase_regs_history_debugfs.c \ + thirdparty/mali_kbase_mmap.c +ifeq ($(CONFIG_MALI_JOB_DUMP),y) + SRC += mali_kbase_gwt.c +endif ifeq ($(MALI_UNIT_TEST),1) SRC += mali_kbase_tlstream_test.c diff --git a/drivers/gpu/arm/bifrost_for_linux/Kconfig b/drivers/gpu/arm/bifrost_for_linux/Kconfig index e78b634031eeb4..f4fecdaca0e4b8 100644 --- a/drivers/gpu/arm/bifrost_for_linux/Kconfig +++ b/drivers/gpu/arm/bifrost_for_linux/Kconfig @@ -1,21 +1,28 @@ # -# (C) COPYRIGHT 2012-2017 ARM Limited. All rights reserved. +# (C) COPYRIGHT 2012-2018 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - menuconfig MALI_BIFROST - tristate "Mali Bifrost series support (Linux only)" + tristate "Mali Bifrost series support" + select GPU_TRACEPOINTS if ANDROID default n help Enable this option to build support for a ARM Mali Bifrost GPU. @@ -60,13 +67,13 @@ config MALI_BIFROST_DEVFREQ config MALI_BIFROST_DMA_FENCE bool "DMA_BUF fence support for Mali" - depends on MALI_BIFROST && !KDS + depends on MALI_BIFROST default n help Support DMA_BUF fences for Mali. - This option should only be enabled if KDS is not present and - the Linux Kernel has built in support for DMA_BUF fences. + This option should only be enabled if the Linux Kernel has built in + support for DMA_BUF fences. config MALI_PLATFORM_NAME depends on MALI_BIFROST @@ -169,7 +176,17 @@ config MALI_BIFROST_SYSTEM_TRACE default n help Choose this option to enable system trace events for each - kbase event. This is typically used for debugging but has + kbase event. This is typically used for debugging but has + minimal overhead when not in use. Enable only if you know what + you are doing. + +config MALI_JOB_DUMP + bool "Enable system level support needed for job dumping" + depends on MALI_BIFROST && MALI_BIFROST_EXPERT + default n + help + Choose this option to enable system level support needed for + job dumping. This is typically used for instrumentation but has minimal overhead when not in use. Enable only if you know what you are doing. @@ -186,11 +203,15 @@ config MALI_2MB_ALLOC config MALI_PWRSOFT_765 bool "PWRSOFT-765 ticket" + depends on MALI_BIFROST && MALI_BIFROST_EXPERT default n help - PWRSOFT-765 fixes devfreq cooling devices issues. However, they are - not merged in mainline kernel yet. So this define helps to guard those - parts of the code. + PWRSOFT-765 fixes devfreq cooling devices issues. The fix was merged + in kernel v4.10, however if backported into the kernel then this + option must be manually selected. + + If using kernel >= v4.10 then say N, otherwise if devfreq cooling + changes have been backported say Y to avoid compilation errors. source "drivers/gpu/arm/bifrost/platform/Kconfig" # source "drivers/gpu/arm/bifrost/tests/Kconfig" diff --git a/drivers/gpu/arm/bifrost_for_linux/Makefile b/drivers/gpu/arm/bifrost_for_linux/Makefile index 26522d566dd09c..13af9f473890c5 100644 --- a/drivers/gpu/arm/bifrost_for_linux/Makefile +++ b/drivers/gpu/arm/bifrost_for_linux/Makefile @@ -1,26 +1,29 @@ # -# (C) COPYRIGHT 2010-2016, 2017 ARM Limited. All rights reserved. +# (C) COPYRIGHT 2010-2018 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - KDIR ?= /lib/modules/$(shell uname -r)/build BUSLOG_PATH_RELATIVE = $(CURDIR)/../../../.. -UMP_PATH_RELATIVE = $(CURDIR)/../../../base/ump KBASE_PATH_RELATIVE = $(CURDIR) -KDS_PATH_RELATIVE = $(CURDIR)/../../../.. -EXTRA_SYMBOLS = $(UMP_PATH_RELATIVE)/src/Module.symvers ifeq ($(MALI_UNIT_TEST), 1) EXTRA_SYMBOLS += $(KBASE_PATH_RELATIVE)/tests/internal/src/kernel_assert_module/linux/Module.symvers @@ -31,9 +34,6 @@ ifeq ($(CONFIG_MALI_FPGA_BUS_LOGGER),y) EXTRA_SYMBOLS += $(BUSLOG_PATH_RELATIVE)/drivers/base/bus_logger/Module.symvers endif -# GPL driver supports KDS -EXTRA_SYMBOLS += $(KDS_PATH_RELATIVE)/drivers/base/kds/Module.symvers - # we get the symbols from modules using KBUILD_EXTRA_SYMBOLS to prevent warnings about unknown functions all: $(MAKE) -C $(KDIR) M=$(CURDIR) EXTRA_CFLAGS="-I$(CURDIR)/../../../../include -I$(CURDIR)/../../../../tests/include $(SCONS_CFLAGS)" $(SCONS_CONFIGS) KBUILD_EXTRA_SYMBOLS="$(EXTRA_SYMBOLS)" modules diff --git a/drivers/gpu/arm/bifrost_for_linux/Makefile.kbase b/drivers/gpu/arm/bifrost_for_linux/Makefile.kbase index 2bef9c25eaeb89..d7898cb3d1a537 100644 --- a/drivers/gpu/arm/bifrost_for_linux/Makefile.kbase +++ b/drivers/gpu/arm/bifrost_for_linux/Makefile.kbase @@ -6,12 +6,18 @@ # 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - EXTRA_CFLAGS += -I$(ROOT) -I$(KBASE_PATH) -I$(OSK_PATH)/src/linux/include -I$(KBASE_PATH)/platform_$(PLATFORM) diff --git a/drivers/gpu/arm/bifrost_for_linux/Mconfig b/drivers/gpu/arm/bifrost_for_linux/Mconfig new file mode 100644 index 00000000000000..d9847e3dffa279 --- /dev/null +++ b/drivers/gpu/arm/bifrost_for_linux/Mconfig @@ -0,0 +1,209 @@ +# +# (C) COPYRIGHT 2012-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. +# +# + + +menuconfig MALI_BIFROST + bool "Mali Midgard series support" + default y + help + Enable this option to build support for a ARM Mali Midgard GPU. + + To compile this driver as a module, choose M here: + this will generate a single module, called mali_kbase. + +config MALI_BIFROST_GATOR_SUPPORT + bool "Streamline support via Gator" + depends on MALI_BIFROST + default y if INSTRUMENTATION_STREAMLINE_OLD + default n + help + Adds diagnostic support for use with the ARM Streamline Performance Analyzer. + You will need the Gator device driver already loaded before loading this driver when enabling + Streamline debug support. + This is a legacy interface required by older versions of Streamline. + +config MALI_BIFROST_DVFS + bool "Enable legacy DVFS" + depends on MALI_BIFROST && !MALI_BIFROST_DEVFREQ + default n + help + Choose this option to enable legacy DVFS in the Mali Midgard DDK. + +config MALI_BIFROST_ENABLE_TRACE + bool "Enable kbase tracing" + depends on MALI_BIFROST + default n + help + Enables tracing in kbase. Trace log available through + the "mali_trace" debugfs file, when the CONFIG_DEBUG_FS is enabled + +config MALI_BIFROST_DEVFREQ + bool "devfreq support for Mali" + depends on MALI_BIFROST + default y if PLATFORM_JUNO + default y if PLATFORM_CUSTOM + help + Support devfreq for Mali. + + Using the devfreq framework and, by default, the simpleondemand + governor, the frequency of Mali will be dynamically selected from the + available OPPs. + +config MALI_BIFROST_DMA_FENCE + bool "DMA_BUF fence support for Mali" + depends on MALI_BIFROST + default n + help + Support DMA_BUF fences for Mali. + + This option should only be enabled if the Linux Kernel has built in + support for DMA_BUF fences. + +config MALI_PLATFORM_NAME + depends on MALI_BIFROST + string "Platform name" + default "arndale" if PLATFORM_ARNDALE + default "arndale_octa" if PLATFORM_ARNDALE_OCTA + default "rk" if PLATFORM_FIREFLY + default "hisilicon" if PLATFORM_HIKEY960 + default "vexpress" if PLATFORM_VEXPRESS + default "devicetree" + help + Enter the name of the desired platform configuration directory to + include in the build. 'platform/$(MALI_PLATFORM_NAME)/Kbuild' must + exist. + +config MALI_MOCK_TEST + bool + depends on MALI_BIFROST && !RELEASE + default y + +# MALI_BIFROST_EXPERT configuration options + +menuconfig MALI_BIFROST_EXPERT + depends on MALI_BIFROST + bool "Enable Expert Settings" + default y + help + Enabling this option and modifying the default settings may produce a driver with performance or + other limitations. + +config MALI_CORESTACK + bool "Support controlling power to the GPU core stack" + depends on MALI_BIFROST && MALI_BIFROST_EXPERT + default n + help + Enabling this feature on supported GPUs will let the driver powering + on/off the GPU core stack independently without involving the Power + Domain Controller. This should only be enabled on platforms which + integration of the PDC to the Mali GPU is known to be problematic. + This feature is currently only supported on t-Six and t-HEx GPUs. + + If unsure, say N. + +config MALI_BIFROST_PRFCNT_SET_SECONDARY + bool "Use secondary set of performance counters" + depends on MALI_BIFROST && MALI_BIFROST_EXPERT + default n + help + Select this option to use secondary set of performance counters. Kernel + features that depend on an access to the primary set of counters may + become unavailable. Enabling this option will prevent power management + from working optimally and may cause instrumentation tools to return + bogus results. + + If unsure, say N. + +config MALI_BIFROST_DEBUG + bool "Debug build" + depends on MALI_BIFROST && MALI_BIFROST_EXPERT + default y if DEBUG + default n + help + Select this option for increased checking and reporting of errors. + +config MALI_BIFROST_FENCE_DEBUG + bool "Debug sync fence usage" + depends on MALI_BIFROST && MALI_BIFROST_EXPERT + default y if MALI_BIFROST_DEBUG + help + Select this option to enable additional checking and reporting on the + use of sync fences in the Mali driver. + + This will add a 3s timeout to all sync fence waits in the Mali + driver, so that when work for Mali has been waiting on a sync fence + for a long time a debug message will be printed, detailing what fence + is causing the block, and which dependent Mali atoms are blocked as a + result of this. + + The timeout can be changed at runtime through the js_soft_timeout + device attribute, where the timeout is specified in milliseconds. + +config MALI_BIFROST_ERROR_INJECT + bool "Error injection" + depends on MALI_BIFROST && MALI_BIFROST_EXPERT && NO_MALI + default n + help + Enables insertion of errors to test module failure and recovery mechanisms. + +config MALI_ERROR_INJECT_RANDOM + bool "Random error injection" + depends on MALI_BIFROST && MALI_BIFROST_EXPERT && NO_MALI && MALI_BIFROST_ERROR_INJECT + default n + help + Injected errors are random, rather than user-driven. + +config MALI_BIFROST_TRACE_TIMELINE + bool "Timeline tracing" + depends on MALI_BIFROST && MALI_BIFROST_EXPERT + default n + help + Enables timeline tracing through the kernel tracepoint system. + +config MALI_BIFROST_SYSTEM_TRACE + bool "Enable system event tracing support" + depends on MALI_BIFROST && MALI_BIFROST_EXPERT + default n + help + Choose this option to enable system trace events for each + kbase event. This is typically used for debugging but has + minimal overhead when not in use. Enable only if you know what + you are doing. + +config MALI_2MB_ALLOC + bool "Attempt to allocate 2MB pages" + depends on MALI_BIFROST && MALI_BIFROST_EXPERT + default n + help + Rather than allocating all GPU memory page-by-page, attempt to + allocate 2MB pages from the kernel. This reduces TLB pressure and + helps to prevent memory fragmentation. + + If in doubt, say N + +config MALI_FPGA_BUS_LOGGER + bool "Enable bus log integration" + depends on MALI_BIFROST && MALI_BIFROST_EXPERT + default n + +config MALI_PWRSOFT_765 + bool "PWRSOFT-765 ticket" + depends on MALI_BIFROST && MALI_BIFROST_EXPERT + default n + help + PWRSOFT-765 fixes devfreq cooling devices issues. However, they are + not merged in mainline kernel yet. So this define helps to guard those + parts of the code. + +source "kernel/drivers/gpu/arm/midgard/tests/Mconfig" diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/Kbuild b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/Kbuild index 5eeba1b14710c6..be255c65a5fc30 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/Kbuild +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/Kbuild @@ -6,12 +6,18 @@ # 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - BACKEND += \ backend/gpu/mali_kbase_cache_policy_backend.c \ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_backend_config.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_backend_config.h index c8ae87eb84a283..196a776f7f9dfe 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_backend_config.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_backend_config.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Backend specific configuration */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_cache_policy_backend.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_cache_policy_backend.c index fef9a2cb743ebd..49567f785d2c9e 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_cache_policy_backend.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_cache_policy_backend.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include "backend/gpu/mali_kbase_cache_policy_backend.h" #include <backend/gpu/mali_kbase_device_internal.h> diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_cache_policy_backend.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_cache_policy_backend.h index fe9869109a8257..f78ada74f605e8 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_cache_policy_backend.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_cache_policy_backend.h @@ -7,15 +7,20 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_CACHE_POLICY_BACKEND_H_ #define _KBASE_CACHE_POLICY_BACKEND_H_ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_debug_job_fault_backend.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_debug_job_fault_backend.c index 7851ea6466c78e..c9c463eb458d00 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_debug_job_fault_backend.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_debug_job_fault_backend.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> #include <backend/gpu/mali_kbase_device_internal.h> #include "mali_kbase_debug_job_fault.h" diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_devfreq.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_devfreq.c index 0a961885b76673..ddda6934003b10 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_devfreq.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_devfreq.c @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> #include <mali_kbase_tlstream.h> #include <mali_kbase_config_defaults.h> @@ -42,7 +47,6 @@ #define dev_pm_opp_find_freq_ceil opp_find_freq_ceil #define dev_pm_opp_find_freq_floor opp_find_freq_floor #endif /* Linux >= 3.13 */ - #include <soc/rockchip/rockchip_opp_select.h> #include <soc/rockchip/rockchip_system_monitor.h> @@ -96,15 +100,21 @@ kbase_devfreq_target(struct device *dev, unsigned long *target_freq, u32 flags) freq = *target_freq; +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0) rcu_read_lock(); +#endif opp = devfreq_recommended_opp(dev, &freq, flags); - if (IS_ERR(opp)) { - rcu_read_unlock(); + voltage = dev_pm_opp_get_voltage(opp); +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0) + rcu_read_unlock(); +#endif + if (IS_ERR_OR_NULL(opp)) { dev_err(dev, "Failed to get opp (%ld)\n", PTR_ERR(opp)); return PTR_ERR(opp); } - voltage = dev_pm_opp_get_voltage(opp); - rcu_read_unlock(); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) + dev_pm_opp_put(opp); +#endif nominal_freq = freq; /* @@ -169,8 +179,6 @@ kbase_devfreq_target(struct device *dev, unsigned long *target_freq, u32 flags) KBASE_TLSTREAM_AUX_DEVFREQ_TARGET((u64)nominal_freq); - kbase_pm_reset_dvfs_utilisation(kbdev); - return err; } @@ -188,10 +196,13 @@ static int kbase_devfreq_status(struct device *dev, struct devfreq_dev_status *stat) { struct kbase_device *kbdev = dev_get_drvdata(dev); + struct kbasep_pm_metrics diff; - kbase_pm_get_dvfs_utilisation(kbdev, - &stat->total_time, &stat->busy_time); + kbase_pm_get_dvfs_metrics(kbdev, &kbdev->last_devfreq_metrics, &diff); + stat->busy_time = diff.time_busy; + stat->total_time = diff.time_busy + diff.time_idle; + stat->current_frequency = kbdev->current_nominal_freq; stat->private_data = NULL; return 0; @@ -205,28 +216,37 @@ static int kbase_devfreq_init_freq_table(struct kbase_device *kbdev, unsigned long freq; struct dev_pm_opp *opp; +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0) rcu_read_lock(); +#endif count = dev_pm_opp_get_opp_count(kbdev->dev); - if (count < 0) { - rcu_read_unlock(); - return count; - } +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0) rcu_read_unlock(); +#endif + if (count < 0) + return count; dp->freq_table = kmalloc_array(count, sizeof(dp->freq_table[0]), GFP_KERNEL); if (!dp->freq_table) return -ENOMEM; +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0) rcu_read_lock(); +#endif for (i = 0, freq = ULONG_MAX; i < count; i++, freq--) { opp = dev_pm_opp_find_freq_floor(kbdev->dev, &freq); if (IS_ERR(opp)) break; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) + dev_pm_opp_put(opp); +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) */ dp->freq_table[i] = freq; } +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0) rcu_read_unlock(); +#endif if (count != i) dev_warn(kbdev->dev, "Unable to enumerate all OPPs (%d!=%d\n", @@ -351,6 +371,12 @@ int kbase_devfreq_init(struct kbase_device *kbdev) if (kbase_devfreq_init_freq_table(kbdev, dp)) return -EFAULT; + if (dp->max_state > 0) { + /* Record the maximum frequency possible */ + kbdev->gpu_props.props.core_props.gpu_freq_khz_max = + dp->freq_table[0] / 1000; + }; + err = kbase_devfreq_init_core_mask_table(kbdev); if (err) return err; @@ -358,7 +384,7 @@ int kbase_devfreq_init(struct kbase_device *kbdev) kbdev->devfreq = devfreq_add_device(kbdev->dev, dp, "simple_ondemand", NULL); if (IS_ERR(kbdev->devfreq)) { - kbase_devfreq_term_freq_table(kbdev); + kfree(dp->freq_table); return PTR_ERR(kbdev->devfreq); } diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_devfreq.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_devfreq.h index 7bcc350f3006ce..ed484366db2413 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_devfreq.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_devfreq.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _BASE_DEVFREQ_H_ #define _BASE_DEVFREQ_H_ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_device_hw.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_device_hw.c index 17f253308ffce0..adc72b7805cb82 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_device_hw.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_device_hw.c @@ -7,15 +7,20 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_device_internal.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_device_internal.h index 5b20445932fb62..729256ec6ce317 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_device_internal.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_device_internal.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Backend-specific HW access device APIs */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_gpu.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_gpu.c index a7c3a77d8ac807..3897a9fd9baff2 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_gpu.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_gpu.c @@ -7,15 +7,20 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Register-based HW access backend APIs */ @@ -34,6 +39,10 @@ int kbase_backend_early_init(struct kbase_device *kbdev) if (err) return err; + err = kbase_pm_runtime_init(kbdev); + if (err) + goto fail_runtime_pm; + /* Ensure we can access the GPU registers */ kbase_pm_register_access_enable(kbdev); @@ -56,6 +65,8 @@ int kbase_backend_early_init(struct kbase_device *kbdev) fail_pm: kbase_release_interrupts(kbdev); fail_interrupts: + kbase_pm_runtime_term(kbdev); +fail_runtime_pm: kbasep_platform_device_term(kbdev); return err; @@ -65,6 +76,7 @@ void kbase_backend_early_term(struct kbase_device *kbdev) { kbase_hwaccess_pm_term(kbdev); kbase_release_interrupts(kbdev); + kbase_pm_runtime_term(kbdev); kbasep_platform_device_term(kbdev); } diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_gpuprops_backend.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_gpuprops_backend.c index b395325b556bb2..8809ab0bed5b1b 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_gpuprops_backend.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_gpuprops_backend.c @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2014-2016 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Base kernel property query backend APIs */ @@ -36,8 +41,8 @@ void kbase_backend_gpuprops_get(struct kbase_device *kbdev, regdump->l2_features = kbase_reg_read(kbdev, GPU_CONTROL_REG(L2_FEATURES), NULL); - regdump->suspend_size = kbase_reg_read(kbdev, - GPU_CONTROL_REG(SUSPEND_SIZE), NULL); + regdump->core_features = kbase_reg_read(kbdev, + GPU_CONTROL_REG(CORE_FEATURES), NULL); regdump->tiler_features = kbase_reg_read(kbdev, GPU_CONTROL_REG(TILER_FEATURES), NULL); regdump->mem_features = kbase_reg_read(kbdev, @@ -66,6 +71,8 @@ void kbase_backend_gpuprops_get(struct kbase_device *kbdev, GPU_CONTROL_REG(THREAD_MAX_BARRIER_SIZE), NULL); regdump->thread_features = kbase_reg_read(kbdev, GPU_CONTROL_REG(THREAD_FEATURES), NULL); + regdump->thread_tls_alloc = kbase_reg_read(kbdev, + GPU_CONTROL_REG(THREAD_TLS_ALLOC), NULL); regdump->shader_present_lo = kbase_reg_read(kbdev, GPU_CONTROL_REG(SHADER_PRESENT_LO), NULL); diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_backend.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_backend.c index 8084d054cc5ba5..3a6545db909294 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_backend.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_backend.c @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2014-2016 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014-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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * GPU backend instrumentation APIs. */ @@ -63,7 +68,7 @@ static void kbasep_instr_hwcnt_cacheclean(struct kbase_device *kbdev) int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev, struct kbase_context *kctx, - struct kbase_uk_hwcnt_setup *setup) + struct kbase_ioctl_hwcnt_enable *enable) { unsigned long flags, pm_flags; int err = -EINVAL; @@ -76,7 +81,7 @@ int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev, KBASE_PM_CORE_SHADER); /* alignment failure */ - if ((setup->dump_buffer == 0ULL) || (setup->dump_buffer & (2048 - 1))) + if ((enable->dump_buffer == 0ULL) || (enable->dump_buffer & (2048 - 1))) goto out_err; /* Override core availability policy to ensure all cores are available @@ -105,7 +110,7 @@ int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev, /* In use, this context is the owner */ kbdev->hwcnt.kctx = kctx; /* Remember the dump address so we can reprogram it later */ - kbdev->hwcnt.addr = setup->dump_buffer; + kbdev->hwcnt.addr = enable->dump_buffer; /* Request the clean */ kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_REQUEST_CLEAN; @@ -145,15 +150,15 @@ int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev, prfcnt_config | PRFCNT_CONFIG_MODE_OFF, kctx); kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_BASE_LO), - setup->dump_buffer & 0xFFFFFFFF, kctx); + enable->dump_buffer & 0xFFFFFFFF, kctx); kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_BASE_HI), - setup->dump_buffer >> 32, kctx); + enable->dump_buffer >> 32, kctx); kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_JM_EN), - setup->jm_bm, kctx); + enable->jm_bm, kctx); kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_SHADER_EN), - setup->shader_bm, kctx); + enable->shader_bm, kctx); kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_MMU_L2_EN), - setup->mmu_l2_bm, kctx); + enable->mmu_l2_bm, kctx); /* Due to PRLAM-8186 we need to disable the Tiler before we enable the * HW counter dump. */ if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8186)) @@ -161,7 +166,7 @@ int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev, kctx); else kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_TILER_EN), - setup->tiler_bm, kctx); + enable->tiler_bm, kctx); kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_CONFIG), prfcnt_config | PRFCNT_CONFIG_MODE_MANUAL, kctx); @@ -170,7 +175,7 @@ int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev, */ if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8186)) kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_TILER_EN), - setup->tiler_bm, kctx); + enable->tiler_bm, kctx); spin_lock_irqsave(&kbdev->hwcnt.lock, flags); diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_defs.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_defs.h index 4794672da8f098..fb55d2d56f2c64 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_defs.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_defs.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Backend-specific instrumentation definitions */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_internal.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_internal.h index e96aeae786e1e5..608379e4ca0f61 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_internal.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_internal.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Backend-specific HW access instrumentation APIs */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_irq_internal.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_irq_internal.h index 8781561e73d001..ca3c048b637a01 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_irq_internal.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_irq_internal.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Backend specific IRQ APIs */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_irq_linux.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_irq_linux.c index d0666c86cf5913..e68deaf3f41ebc 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_irq_linux.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_irq_linux.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> #include <backend/gpu/mali_kbase_device_internal.h> #include <backend/gpu/mali_kbase_irq_internal.h> diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_as.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_as.c index c660c80341f476..c8153ba4c12162 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_as.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_as.c @@ -1,21 +1,26 @@ /* * - * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Register backend context / address space management */ @@ -63,11 +68,12 @@ static void assign_and_activate_kctx_addr_space(struct kbase_device *kbdev, } bool kbase_backend_use_ctx_sched(struct kbase_device *kbdev, - struct kbase_context *kctx) + struct kbase_context *kctx, + int js) { int i; - if (kbdev->hwaccess.active_kctx == kctx) { + if (kbdev->hwaccess.active_kctx[js] == kctx) { /* Context is already active */ return true; } @@ -208,12 +214,15 @@ bool kbase_backend_use_ctx(struct kbase_device *kbdev, { struct kbasep_js_device_data *js_devdata; struct kbase_as *new_address_space = NULL; + int js; js_devdata = &kbdev->js_data; - if (kbdev->hwaccess.active_kctx == kctx) { - WARN(1, "Context is already scheduled in\n"); - return false; + for (js = 0; js < BASE_JM_MAX_NR_SLOTS; js++) { + if (kbdev->hwaccess.active_kctx[js] == kctx) { + WARN(1, "Context is already scheduled in\n"); + return false; + } } new_address_space = &kbdev->as[as_nr]; diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_defs.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_defs.h index 08a7400e66d588..b4d2ae1cc4e824 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_defs.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_defs.h @@ -1,21 +1,26 @@ /* * - * (C) COPYRIGHT 2014-2016 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014-2016, 2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Register-based HW access backend specific definitions */ @@ -108,16 +113,4 @@ struct kbase_backend_data { bool timeouts_updated; }; -/** - * struct kbase_jd_atom_backend - GPU backend specific katom data - */ -struct kbase_jd_atom_backend { -}; - -/** - * struct kbase_context_backend - GPU backend specific context data - */ -struct kbase_context_backend { -}; - #endif /* _KBASE_HWACCESS_GPU_DEFS_H_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_hw.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_hw.c index cbca5eac82f193..c6a8b7f34a0363 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_hw.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_hw.c @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Base kernel job manager APIs */ @@ -235,16 +240,11 @@ void kbase_job_done(struct kbase_device *kbdev, u32 done) int i; u32 count = 0; ktime_t end_timestamp = ktime_get(); - struct kbasep_js_device_data *js_devdata; KBASE_DEBUG_ASSERT(kbdev); - js_devdata = &kbdev->js_data; KBASE_TRACE_ADD(kbdev, JM_IRQ, NULL, NULL, 0, done); - memset(&kbdev->slot_submit_count_irq[0], 0, - sizeof(kbdev->slot_submit_count_irq)); - spin_lock_irqsave(&kbdev->hwaccess_lock, flags); while (done) { @@ -309,7 +309,7 @@ void kbase_job_done(struct kbase_device *kbdev, u32 done) completion_code)); } - kbase_gpu_irq_evict(kbdev, i); + kbase_gpu_irq_evict(kbdev, i, completion_code); } kbase_reg_write(kbdev, JOB_CONTROL_REG(JOB_IRQ_CLEAR), @@ -742,12 +742,14 @@ void kbase_job_slot_ctx_priority_check_locked(struct kbase_context *kctx, if (!katom) continue; - if (katom->kctx != kctx) + if ((kbdev->js_ctx_scheduling_mode == + KBASE_JS_PROCESS_LOCAL_PRIORITY_MODE) && + (katom->kctx != kctx)) continue; if (katom->sched_priority > priority) { if (!stop_sent) - KBASE_TLSTREAM_TL_ATTRIB_ATOM_PRIORITY_CHANGE( + KBASE_TLSTREAM_TL_ATTRIB_ATOM_PRIORITIZED( target_katom); kbase_job_slot_softstop(kbdev, js, katom); @@ -756,92 +758,43 @@ void kbase_job_slot_ctx_priority_check_locked(struct kbase_context *kctx, } } -struct zap_reset_data { - /* The stages are: - * 1. The timer has never been called - * 2. The zap has timed out, all slots are soft-stopped - the GPU reset - * will happen. The GPU has been reset when - * kbdev->hwaccess.backend.reset_waitq is signalled - * - * (-1 - The timer has been cancelled) - */ - int stage; - struct kbase_device *kbdev; - struct hrtimer timer; - spinlock_t lock; /* protects updates to stage member */ -}; - -static enum hrtimer_restart zap_timeout_callback(struct hrtimer *timer) -{ - struct zap_reset_data *reset_data = container_of(timer, - struct zap_reset_data, timer); - struct kbase_device *kbdev = reset_data->kbdev; - unsigned long flags; - - spin_lock_irqsave(&reset_data->lock, flags); - - if (reset_data->stage == -1) - goto out; - -#if KBASE_GPU_RESET_EN - if (kbase_prepare_to_reset_gpu(kbdev)) { - dev_err(kbdev->dev, "Issueing GPU soft-reset because jobs failed to be killed (within %d ms) as part of context termination (e.g. process exit)\n", - ZAP_TIMEOUT); - kbase_reset_gpu(kbdev); - } -#endif /* KBASE_GPU_RESET_EN */ - reset_data->stage = 2; - - out: - spin_unlock_irqrestore(&reset_data->lock, flags); - - return HRTIMER_NORESTART; -} - void kbase_jm_wait_for_zero_jobs(struct kbase_context *kctx) { struct kbase_device *kbdev = kctx->kbdev; - struct zap_reset_data reset_data; - unsigned long flags; - - hrtimer_init_on_stack(&reset_data.timer, CLOCK_MONOTONIC, - HRTIMER_MODE_REL); - reset_data.timer.function = zap_timeout_callback; + unsigned long timeout = msecs_to_jiffies(ZAP_TIMEOUT); - spin_lock_init(&reset_data.lock); + timeout = wait_event_timeout(kctx->jctx.zero_jobs_wait, + kctx->jctx.job_nr == 0, timeout); - reset_data.kbdev = kbdev; - reset_data.stage = 1; + if (timeout != 0) + timeout = wait_event_timeout( + kctx->jctx.sched_info.ctx.is_scheduled_wait, + !kbase_ctx_flag(kctx, KCTX_SCHEDULED), + timeout); - hrtimer_start(&reset_data.timer, HR_TIMER_DELAY_MSEC(ZAP_TIMEOUT), - HRTIMER_MODE_REL); + /* Neither wait timed out; all done! */ + if (timeout != 0) + goto exit; - /* Wait for all jobs to finish, and for the context to be not-scheduled - * (due to kbase_job_zap_context(), we also guarentee it's not in the JS - * policy queue either */ - wait_event(kctx->jctx.zero_jobs_wait, kctx->jctx.job_nr == 0); - wait_event(kctx->jctx.sched_info.ctx.is_scheduled_wait, - !kbase_ctx_flag(kctx, KCTX_SCHEDULED)); - - spin_lock_irqsave(&reset_data.lock, flags); - if (reset_data.stage == 1) { - /* The timer hasn't run yet - so cancel it */ - reset_data.stage = -1; +#if KBASE_GPU_RESET_EN + if (kbase_prepare_to_reset_gpu(kbdev)) { + dev_err(kbdev->dev, + "Issueing GPU soft-reset because jobs failed to be killed (within %d ms) as part of context termination (e.g. process exit)\n", + ZAP_TIMEOUT); + kbase_reset_gpu(kbdev); } - spin_unlock_irqrestore(&reset_data.lock, flags); - hrtimer_cancel(&reset_data.timer); - - if (reset_data.stage == 2) { - /* The reset has already started. - * Wait for the reset to complete - */ - wait_event(kbdev->hwaccess.backend.reset_wait, - atomic_read(&kbdev->hwaccess.backend.reset_gpu) - == KBASE_RESET_GPU_NOT_PENDING); - } - destroy_hrtimer_on_stack(&reset_data.timer); + /* Wait for the reset to complete */ + wait_event(kbdev->hwaccess.backend.reset_wait, + atomic_read(&kbdev->hwaccess.backend.reset_gpu) + == KBASE_RESET_GPU_NOT_PENDING); +#else + dev_warn(kbdev->dev, + "Jobs failed to be killed (within %d ms) as part of context termination (e.g. process exit)\n", + ZAP_TIMEOUT); +#endif +exit: dev_dbg(kbdev->dev, "Zap: Finished Context %p", kctx); /* Ensure that the signallers of the waitqs have finished */ @@ -874,8 +827,6 @@ int kbase_job_slot_init(struct kbase_device *kbdev) if (NULL == kbdev->hwaccess.backend.reset_workq) return -EINVAL; - KBASE_DEBUG_ASSERT(0 == - object_is_on_stack(&kbdev->hwaccess.backend.reset_work)); INIT_WORK(&kbdev->hwaccess.backend.reset_work, kbasep_reset_timeout_worker); diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_internal.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_internal.h index 1f382b3c1af41f..d71a9edab94fea 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_internal.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_internal.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Job Manager backend-specific low-level APIs. */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_rb.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_rb.c index a41e7b5b7afbff..7f09fd229748eb 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_rb.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_rb.c @@ -1,21 +1,26 @@ /* * - * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Register-based HW access backend specific APIs */ @@ -1242,7 +1247,8 @@ void kbase_backend_run_atom(struct kbase_device *kbdev, #define HAS_DEP(katom) (katom->pre_dep || katom->atom_flags & \ (KBASE_KATOM_FLAG_X_DEP_BLOCKED | KBASE_KATOM_FLAG_FAIL_BLOCKER)) -bool kbase_gpu_irq_evict(struct kbase_device *kbdev, int js) +bool kbase_gpu_irq_evict(struct kbase_device *kbdev, int js, + u32 completion_code) { struct kbase_jd_atom *katom; struct kbase_jd_atom *next_katom; @@ -1263,14 +1269,16 @@ bool kbase_gpu_irq_evict(struct kbase_device *kbdev, int js) JS_COMMAND_NOP, NULL); next_katom->gpu_rb_state = KBASE_ATOM_GPU_RB_READY; - KBASE_TLSTREAM_TL_NRET_ATOM_LPU(katom, + if (completion_code == BASE_JD_EVENT_STOPPED) { + KBASE_TLSTREAM_TL_NRET_ATOM_LPU(katom, &kbdev->gpu_props.props.raw_props.js_features [katom->slot_nr]); - KBASE_TLSTREAM_TL_NRET_ATOM_AS(katom, &kbdev->as + KBASE_TLSTREAM_TL_NRET_ATOM_AS(katom, &kbdev->as [katom->kctx->as_nr]); - KBASE_TLSTREAM_TL_NRET_CTX_LPU(katom->kctx, + KBASE_TLSTREAM_TL_NRET_CTX_LPU(katom->kctx, &kbdev->gpu_props.props.raw_props.js_features [katom->slot_nr]); + } return true; } @@ -1510,8 +1518,7 @@ void kbase_backend_reset(struct kbase_device *kbdev, ktime_t *end_timestamp) if (!katom) break; if (katom->protected_state.exit == - KBASE_ATOM_EXIT_PROTECTED_RESET_WAIT) - { + KBASE_ATOM_EXIT_PROTECTED_RESET_WAIT) { KBASE_TLSTREAM_AUX_PROTECTED_LEAVE_END(kbdev); kbase_vinstr_resume(kbdev->vinstr_ctx); @@ -1678,7 +1685,7 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev, katom_idx0->kctx->blocked_js[js][prio_idx0] = true; } else { /* katom_idx0 is on GPU */ - if (katom_idx1 && katom_idx1->gpu_rb_state == + if (katom_idx1_valid && katom_idx1->gpu_rb_state == KBASE_ATOM_GPU_RB_SUBMITTED) { /* katom_idx0 and katom_idx1 are on GPU */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_rb.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_rb.h index 1e0e05ad3ea450..c3b9f2d855369a 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_rb.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_rb.h @@ -1,21 +1,26 @@ /* * - * (C) COPYRIGHT 2014-2016 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Register-based HW access backend specific APIs */ @@ -28,15 +33,17 @@ /** * kbase_gpu_irq_evict - Evict an atom from a NEXT slot * - * @kbdev: Device pointer - * @js: Job slot to evict from + * @kbdev: Device pointer + * @js: Job slot to evict from + * @completion_code: Event code from job that was run. * * Evict the atom in the NEXT slot for the specified job slot. This function is * called from the job complete IRQ handler when the previous job has failed. * * Return: true if job evicted from NEXT registers, false otherwise */ -bool kbase_gpu_irq_evict(struct kbase_device *kbdev, int js); +bool kbase_gpu_irq_evict(struct kbase_device *kbdev, int js, + u32 completion_code); /** * kbase_gpu_complete_hw - Complete an atom on job slot js diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_affinity.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_affinity.c index 54d8ddd8009760..c937eca8c166da 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_affinity.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_affinity.c @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Base kernel affinity manager APIs */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_affinity.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_affinity.h index 35d9781ae092c6..dbabd94564c788 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_affinity.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_affinity.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Affinity Manager internal APIs. */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_backend.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_backend.c index d392fa2a85d9b8..729b971ee0721b 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_backend.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_backend.c @@ -1,21 +1,26 @@ /* * - * (C) COPYRIGHT 2014-2016 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014-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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Register-based HW access backend specific job scheduler APIs */ @@ -25,14 +30,6 @@ #include <backend/gpu/mali_kbase_jm_internal.h> #include <backend/gpu/mali_kbase_js_internal.h> -/* - * Define for when dumping is enabled. - * This should not be based on the instrumentation level as whether dumping is - * enabled for a particular level is down to the integrator. However this is - * being used for now as otherwise the cinstr headers would be needed. - */ -#define CINSTR_DUMPING_ENABLED (2 == MALI_INSTRUMENTATION_LEVEL) - /* * Hold the runpool_mutex for this */ @@ -119,7 +116,7 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer) if (!kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_5736)) { u32 ticks = atom->ticks++; -#if !CINSTR_DUMPING_ENABLED +#ifndef CONFIG_MALI_JOB_DUMP u32 soft_stop_ticks, hard_stop_ticks, gpu_reset_ticks; if (atom->core_req & BASE_JD_REQ_ONLY_COMPUTE) { @@ -150,16 +147,17 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer) /* Job is Soft-Stoppable */ if (ticks == soft_stop_ticks) { - int disjoint_threshold = - KBASE_DISJOINT_STATE_INTERLEAVED_CONTEXT_COUNT_THRESHOLD; - u32 softstop_flags = 0u; /* Job has been scheduled for at least * js_devdata->soft_stop_ticks ticks. * Soft stop the slot so we can run * other jobs. */ - dev_dbg(kbdev->dev, "Soft-stop"); #if !KBASE_DISABLE_SCHEDULING_SOFT_STOPS + int disjoint_threshold = + KBASE_DISJOINT_STATE_INTERLEAVED_CONTEXT_COUNT_THRESHOLD; + u32 softstop_flags = 0u; + + dev_dbg(kbdev->dev, "Soft-stop"); /* nr_user_contexts_running is updated * with the runpool_mutex, but we can't * take that here. @@ -209,8 +207,8 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer) */ reset_needed = true; } -#else /* !CINSTR_DUMPING_ENABLED */ - /* NOTE: During CINSTR_DUMPING_ENABLED, we use +#else /* !CONFIG_MALI_JOB_DUMP */ + /* NOTE: During CONFIG_MALI_JOB_DUMP, we use * the alternate timeouts, which makes the hard- * stop and GPU reset timeout much longer. We * also ensure that we don't soft-stop at all. @@ -219,7 +217,7 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer) /* Job has been scheduled for at least * js_devdata->soft_stop_ticks. We do * not soft-stop during - * CINSTR_DUMPING_ENABLED, however. + * CONFIG_MALI_JOB_DUMP, however. */ dev_dbg(kbdev->dev, "Soft-stop"); } else if (ticks == @@ -248,7 +246,7 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer) */ reset_needed = true; } -#endif /* !CINSTR_DUMPING_ENABLED */ +#endif /* !CONFIG_MALI_JOB_DUMP */ } } } diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_internal.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_internal.h index 3f53779c67471f..6576e55d2e39de 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_internal.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_internal.h @@ -7,15 +7,20 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Register-based HW access backend specific job scheduler APIs */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_mmu_hw_direct.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_mmu_hw_direct.c index aa1817c8bca92c..9cd29828016aa9 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_mmu_hw_direct.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_mmu_hw_direct.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <linux/bitops.h> #include <mali_kbase.h> @@ -180,8 +185,7 @@ void kbase_mmu_interrupt(struct kbase_device *kbdev, u32 irq_stat) /* Mark the fault protected or not */ as->protected_mode = kbdev->protected_mode; - if (kbdev->protected_mode && as->fault_addr) - { + if (kbdev->protected_mode && as->fault_addr) { /* check if address reporting is allowed */ validate_protected_page_fault(kbdev, kctx); } diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_mmu_hw_direct.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_mmu_hw_direct.h index c02253c6acc301..1f76eeda2324a2 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_mmu_hw_direct.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_mmu_hw_direct.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Interface file for the direct implementation for MMU hardware access * diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_always_on.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_always_on.c index 0614348e935ac6..2ed7dfdde6cc2e 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_always_on.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_always_on.c @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * "Always on" power management policy */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_always_on.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_always_on.h index f9d244b01bc235..d61d0d0e3640f4 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_always_on.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_always_on.h @@ -8,16 +8,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * "Always on" power management policy */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_backend.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_backend.c index cd8932650ed509..e57834350e8c62 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_backend.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_backend.c @@ -1,21 +1,26 @@ /* * - * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * GPU backend implementation of base kernel power management APIs */ @@ -32,6 +37,57 @@ static void kbase_pm_gpu_poweroff_wait_wq(struct work_struct *data); +int kbase_pm_runtime_init(struct kbase_device *kbdev) +{ + struct kbase_pm_callback_conf *callbacks; + + callbacks = (struct kbase_pm_callback_conf *)POWER_MANAGEMENT_CALLBACKS; + if (callbacks) { + kbdev->pm.backend.callback_power_on = + callbacks->power_on_callback; + kbdev->pm.backend.callback_power_off = + callbacks->power_off_callback; + kbdev->pm.backend.callback_power_suspend = + callbacks->power_suspend_callback; + kbdev->pm.backend.callback_power_resume = + callbacks->power_resume_callback; + kbdev->pm.callback_power_runtime_init = + callbacks->power_runtime_init_callback; + kbdev->pm.callback_power_runtime_term = + callbacks->power_runtime_term_callback; + kbdev->pm.backend.callback_power_runtime_on = + callbacks->power_runtime_on_callback; + kbdev->pm.backend.callback_power_runtime_off = + callbacks->power_runtime_off_callback; + kbdev->pm.backend.callback_power_runtime_idle = + callbacks->power_runtime_idle_callback; + + if (callbacks->power_runtime_init_callback) + return callbacks->power_runtime_init_callback(kbdev); + else + return 0; + } + + kbdev->pm.backend.callback_power_on = NULL; + kbdev->pm.backend.callback_power_off = NULL; + kbdev->pm.backend.callback_power_suspend = NULL; + kbdev->pm.backend.callback_power_resume = NULL; + kbdev->pm.callback_power_runtime_init = NULL; + kbdev->pm.callback_power_runtime_term = NULL; + kbdev->pm.backend.callback_power_runtime_on = NULL; + kbdev->pm.backend.callback_power_runtime_off = NULL; + kbdev->pm.backend.callback_power_runtime_idle = NULL; + + return 0; +} + +void kbase_pm_runtime_term(struct kbase_device *kbdev) +{ + if (kbdev->pm.callback_power_runtime_term) { + kbdev->pm.callback_power_runtime_term(kbdev); + } +} + void kbase_pm_register_access_enable(struct kbase_device *kbdev) { struct kbase_pm_callback_conf *callbacks; @@ -59,7 +115,6 @@ void kbase_pm_register_access_disable(struct kbase_device *kbdev) int kbase_hwaccess_pm_init(struct kbase_device *kbdev) { int ret = 0; - struct kbase_pm_callback_conf *callbacks; KBASE_DEBUG_ASSERT(kbdev != NULL); @@ -81,38 +136,6 @@ int kbase_hwaccess_pm_init(struct kbase_device *kbdev) kbdev->pm.backend.gpu_in_desired_state = true; init_waitqueue_head(&kbdev->pm.backend.gpu_in_desired_state_wait); - callbacks = (struct kbase_pm_callback_conf *)POWER_MANAGEMENT_CALLBACKS; - if (callbacks) { - kbdev->pm.backend.callback_power_on = - callbacks->power_on_callback; - kbdev->pm.backend.callback_power_off = - callbacks->power_off_callback; - kbdev->pm.backend.callback_power_suspend = - callbacks->power_suspend_callback; - kbdev->pm.backend.callback_power_resume = - callbacks->power_resume_callback; - kbdev->pm.callback_power_runtime_init = - callbacks->power_runtime_init_callback; - kbdev->pm.callback_power_runtime_term = - callbacks->power_runtime_term_callback; - kbdev->pm.backend.callback_power_runtime_on = - callbacks->power_runtime_on_callback; - kbdev->pm.backend.callback_power_runtime_off = - callbacks->power_runtime_off_callback; - kbdev->pm.backend.callback_power_runtime_idle = - callbacks->power_runtime_idle_callback; - } else { - kbdev->pm.backend.callback_power_on = NULL; - kbdev->pm.backend.callback_power_off = NULL; - kbdev->pm.backend.callback_power_suspend = NULL; - kbdev->pm.backend.callback_power_resume = NULL; - kbdev->pm.callback_power_runtime_init = NULL; - kbdev->pm.callback_power_runtime_term = NULL; - kbdev->pm.backend.callback_power_runtime_on = NULL; - kbdev->pm.backend.callback_power_runtime_off = NULL; - kbdev->pm.backend.callback_power_runtime_idle = NULL; - } - /* Initialise the metrics subsystem */ ret = kbasep_pm_metrics_init(kbdev); if (ret) @@ -229,7 +252,10 @@ static void kbase_pm_gpu_poweroff_wait_wq(struct work_struct *data) /* Turn off clock now that fault have been handled. We * dropped locks so poweron_required may have changed - - * power back on if this is the case.*/ + * power back on if this is the case (effectively only + * re-enabling of the interrupts would be done in this + * case, as the clocks to GPU were not withdrawn yet). + */ if (backend->poweron_required) kbase_pm_clock_on(kbdev, false); else diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca.c index c17db8be88774e..7be810004056fd 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Base kernel core availability APIs */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca.h index ee9e751f2d79b6..2b005c9fe4e3b7 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Base kernel core availability APIs */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_devfreq.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_devfreq.c index 66bf660cffb6ef..4bb4c400efe794 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_devfreq.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_devfreq.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * A core availability policy implementing core mask selection from devfreq OPPs * diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_devfreq.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_devfreq.h index 7ab3cd4d846012..f67ec650c98142 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_devfreq.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_devfreq.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * A core availability policy for use with devfreq, where core masks are * associated with OPPs. diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_fixed.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_fixed.c index 864612d31f9b36..1eea7e877f61c9 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_fixed.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_fixed.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * A power policy implementing fixed core availability */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_fixed.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_fixed.h index a763155cb703d8..68a2eac4a12177 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_fixed.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_fixed.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * A power policy implementing fixed core availability */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_coarse_demand.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_coarse_demand.c index f891fa225a89f1..602e175dbbb9c5 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_coarse_demand.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_coarse_demand.c @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * "Coarse Demand" power management policy */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_coarse_demand.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_coarse_demand.h index 749d305eee9a90..f2b49eb4bcacb2 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_coarse_demand.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_coarse_demand.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * "Coarse Demand" power management policy */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_defs.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_defs.h index 564fbda1116a02..2b3b1f864cccdd 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_defs.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_defs.h @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Backend-specific Power Manager definitions */ @@ -66,58 +71,67 @@ enum kbase_pm_core_type { }; /** - * struct kbasep_pm_metrics_data - Metrics data collected for use by the power - * management framework. + * struct kbasep_pm_metrics - Metrics data collected for use by the power + * management framework. * - * @time_period_start: time at which busy/idle measurements started * @time_busy: number of ns the GPU was busy executing jobs since the * @time_period_start timestamp. * @time_idle: number of ns since time_period_start the GPU was not executing * jobs since the @time_period_start timestamp. - * @prev_busy: busy time in ns of previous time period. - * Updated when metrics are reset. - * @prev_idle: idle time in ns of previous time period - * Updated when metrics are reset. - * @gpu_active: true when the GPU is executing jobs. false when - * not. Updated when the job scheduler informs us a job in submitted - * or removed from a GPU slot. * @busy_cl: number of ns the GPU was busy executing CL jobs. Note that * if two CL jobs were active for 400ns, this value would be updated * with 800. * @busy_gl: number of ns the GPU was busy executing GL jobs. Note that * if two GL jobs were active for 400ns, this value would be updated * with 800. + */ +struct kbasep_pm_metrics { + u32 time_busy; + u32 time_idle; + u32 busy_cl[2]; + u32 busy_gl; +}; + +/** + * struct kbasep_pm_metrics_state - State required to collect the metrics in + * struct kbasep_pm_metrics + * @time_period_start: time at which busy/idle measurements started + * @gpu_active: true when the GPU is executing jobs. false when + * not. Updated when the job scheduler informs us a job in submitted + * or removed from a GPU slot. * @active_cl_ctx: number of CL jobs active on the GPU. Array is per-device. * @active_gl_ctx: number of GL jobs active on the GPU. Array is per-slot. As * GL jobs never run on slot 2 this slot is not recorded. * @lock: spinlock protecting the kbasep_pm_metrics_data structure + * @platform_data: pointer to data controlled by platform specific code + * @kbdev: pointer to kbase device for which metrics are collected + * @values: The current values of the power management metrics. The + * kbase_pm_get_dvfs_metrics() function is used to compare these + * current values with the saved values from a previous invocation. * @timer: timer to regularly make DVFS decisions based on the power * management metrics. * @timer_active: boolean indicating @timer is running - * @platform_data: pointer to data controlled by platform specific code - * @kbdev: pointer to kbase device for which metrics are collected - * + * @dvfs_last: values of the PM metrics from the last DVFS tick + * @dvfs_diff: different between the current and previous PM metrics. */ -struct kbasep_pm_metrics_data { +struct kbasep_pm_metrics_state { ktime_t time_period_start; - u32 time_busy; - u32 time_idle; - u32 prev_busy; - u32 prev_idle; bool gpu_active; - u32 busy_cl[2]; - u32 busy_gl; u32 active_cl_ctx[2]; u32 active_gl_ctx[2]; /* GL jobs can only run on 2 of the 3 job slots */ spinlock_t lock; + void *platform_data; + struct kbase_device *kbdev; + + struct kbasep_pm_metrics values; + #ifdef CONFIG_MALI_BIFROST_DVFS struct hrtimer timer; bool timer_active; + struct kbasep_pm_metrics dvfs_last; + struct kbasep_pm_metrics dvfs_diff; #endif - - void *platform_data; - struct kbase_device *kbdev; }; union kbase_pm_policy_data { @@ -286,7 +300,7 @@ struct kbase_pm_backend_data { spinlock_t gpu_powered_lock; - struct kbasep_pm_metrics_data metrics; + struct kbasep_pm_metrics_state metrics; int gpu_poweroff_pending; int shader_poweroff_pending_time; diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_demand.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_demand.c index 81322fd0dd1757..e0edddc2504d4a 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_demand.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_demand.c @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * A simple demand based power management policy */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_demand.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_demand.h index c0c84b6e918914..5ee182463bd4af 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_demand.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_demand.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * A simple demand based power management policy */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_driver.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_driver.c index 707f71a79a7754..e9089e35afd62c 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_driver.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_driver.c @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Base kernel Power Management hardware control */ @@ -304,10 +309,8 @@ u64 kbase_pm_get_present_cores(struct kbase_device *kbdev, return kbdev->gpu_props.props.raw_props.shader_present; case KBASE_PM_CORE_TILER: return kbdev->gpu_props.props.raw_props.tiler_present; -#ifdef CONFIG_MALI_CORESTACK case KBASE_PM_CORE_STACK: return kbdev->gpu_props.props.raw_props.stack_present; -#endif /* CONFIG_MALI_CORESTACK */ default: break; } @@ -585,7 +588,7 @@ u64 kbase_pm_core_stack_mask(u64 cores) if (test_bit(i, (unsigned long *)&cores)) { /* Every core which ID >= 16 is filled to stacks 4-7 * instead of 0-3 */ - size_t const stack_num = (i > 16) ? + size_t const stack_num = (i >= 16) ? (i % NUM_CORES_PER_STACK) + 4 : (i % NUM_CORES_PER_STACK); set_bit(stack_num, (unsigned long *)&stack_mask); @@ -1229,15 +1232,25 @@ static void kbase_pm_hw_issues_detect(struct kbase_device *kbdev) kbdev->hw_quirks_mmu = kbase_reg_read(kbdev, GPU_CONTROL_REG(L2_MMU_CONFIG), NULL); - /* Limit read ID width for AXI */ - kbdev->hw_quirks_mmu &= ~(L2_MMU_CONFIG_LIMIT_EXTERNAL_READS); - kbdev->hw_quirks_mmu |= (DEFAULT_ARID_LIMIT & 0x3) << + + /* Limit read & write ID width for AXI */ + if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_3BIT_EXT_RW_L2_MMU_CONFIG)) { + kbdev->hw_quirks_mmu &= ~(L2_MMU_CONFIG_3BIT_LIMIT_EXTERNAL_READS); + kbdev->hw_quirks_mmu |= (DEFAULT_3BIT_ARID_LIMIT & 0x7) << + L2_MMU_CONFIG_3BIT_LIMIT_EXTERNAL_READS_SHIFT; + + kbdev->hw_quirks_mmu &= ~(L2_MMU_CONFIG_3BIT_LIMIT_EXTERNAL_WRITES); + kbdev->hw_quirks_mmu |= (DEFAULT_3BIT_AWID_LIMIT & 0x7) << + L2_MMU_CONFIG_3BIT_LIMIT_EXTERNAL_WRITES_SHIFT; + } else { + kbdev->hw_quirks_mmu &= ~(L2_MMU_CONFIG_LIMIT_EXTERNAL_READS); + kbdev->hw_quirks_mmu |= (DEFAULT_ARID_LIMIT & 0x3) << L2_MMU_CONFIG_LIMIT_EXTERNAL_READS_SHIFT; - /* Limit write ID width for AXI */ - kbdev->hw_quirks_mmu &= ~(L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES); - kbdev->hw_quirks_mmu |= (DEFAULT_AWID_LIMIT & 0x3) << + kbdev->hw_quirks_mmu &= ~(L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES); + kbdev->hw_quirks_mmu |= (DEFAULT_AWID_LIMIT & 0x3) << L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_SHIFT; + } if (kbdev->system_coherency == COHERENCY_ACE) { /* Allow memory configuration disparity to be ignored, we @@ -1297,6 +1310,8 @@ static void kbase_pm_hw_issues_detect(struct kbase_device *kbdev) } } + if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_TLS_HASHING)) + kbdev->hw_quirks_sc |= SC_TLS_HASH_ENABLE; if (!kbdev->hw_quirks_jm) kbdev->hw_quirks_jm = kbase_reg_read(kbdev, diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_internal.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_internal.h index 9fbe094541c58f..624efc833f9874 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_internal.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_internal.h @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Power management API definitions used internally by GPU backend */ @@ -410,15 +415,30 @@ void kbase_pm_release_gpu_cycle_counter_nolock(struct kbase_device *kbdev); */ void kbase_pm_wait_for_poweroff_complete(struct kbase_device *kbdev); +/** + * kbase_pm_runtime_init - Initialize runtime-pm for Mali GPU platform device + * + * Setup the power management callbacks and initialize/enable the runtime-pm + * for the Mali GPU platform device, using the callback function. This must be + * called before the kbase_pm_register_access_enable() function. + * + * @kbdev: The kbase device structure for the device (must be a valid pointer) + */ +int kbase_pm_runtime_init(struct kbase_device *kbdev); + +/** + * kbase_pm_runtime_term - Disable runtime-pm for Mali GPU platform device + * + * @kbdev: The kbase device structure for the device (must be a valid pointer) + */ +void kbase_pm_runtime_term(struct kbase_device *kbdev); + /** * kbase_pm_register_access_enable - Enable access to GPU registers * * Enables access to the GPU registers before power management has powered up * the GPU with kbase_pm_powerup(). * - * Access to registers should be done using kbase_os_reg_read()/write() at this - * stage, not kbase_reg_read()/write(). - * * This results in the power management callbacks provided in the driver * configuration to get called to turn on power and/or clocks to the GPU. See * kbase_pm_callback_conf. @@ -487,9 +507,9 @@ void kbase_pm_do_poweron(struct kbase_device *kbdev, bool is_resume); void kbase_pm_do_poweroff(struct kbase_device *kbdev, bool is_suspend); #if defined(CONFIG_MALI_BIFROST_DEVFREQ) || defined(CONFIG_MALI_BIFROST_DVFS) -void kbase_pm_get_dvfs_utilisation(struct kbase_device *kbdev, - unsigned long *total, unsigned long *busy); -void kbase_pm_reset_dvfs_utilisation(struct kbase_device *kbdev); +void kbase_pm_get_dvfs_metrics(struct kbase_device *kbdev, + struct kbasep_pm_metrics *last, + struct kbasep_pm_metrics *diff); #endif /* defined(CONFIG_MALI_BIFROST_DEVFREQ) || defined(CONFIG_MALI_BIFROST_DVFS) */ #ifdef CONFIG_MALI_BIFROST_DVFS diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_metrics.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_metrics.c index ba13bcd8b29122..aabd6541402c9a 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_metrics.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_metrics.c @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2011-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Metrics for power management */ @@ -25,6 +30,7 @@ #include <mali_kbase_pm.h> #include <backend/gpu/mali_kbase_pm_internal.h> #include <backend/gpu/mali_kbase_jm_rb.h> +#include <backend/gpu/mali_kbase_pm_defs.h> /* When VSync is being hit aim for utilisation between 70-90% */ #define KBASE_PM_VSYNC_MIN_UTILISATION 70 @@ -38,19 +44,15 @@ * under 11s. Exceeding this will cause overflow */ #define KBASE_PM_TIME_SHIFT 8 -/* Maximum time between sampling of utilization data, without resetting the - * counters. */ -#define MALI_UTILIZATION_MAX_PERIOD 100000 /* ns = 100ms */ - #ifdef CONFIG_MALI_BIFROST_DVFS static enum hrtimer_restart dvfs_callback(struct hrtimer *timer) { unsigned long flags; - struct kbasep_pm_metrics_data *metrics; + struct kbasep_pm_metrics_state *metrics; KBASE_DEBUG_ASSERT(timer != NULL); - metrics = container_of(timer, struct kbasep_pm_metrics_data, timer); + metrics = container_of(timer, struct kbasep_pm_metrics_state, timer); kbase_pm_get_dvfs_action(metrics->kbdev); spin_lock_irqsave(&metrics->lock, flags); @@ -73,18 +75,17 @@ int kbasep_pm_metrics_init(struct kbase_device *kbdev) kbdev->pm.backend.metrics.kbdev = kbdev; kbdev->pm.backend.metrics.time_period_start = ktime_get(); - kbdev->pm.backend.metrics.time_busy = 0; - kbdev->pm.backend.metrics.time_idle = 0; - kbdev->pm.backend.metrics.prev_busy = 0; - kbdev->pm.backend.metrics.prev_idle = 0; kbdev->pm.backend.metrics.gpu_active = false; kbdev->pm.backend.metrics.active_cl_ctx[0] = 0; kbdev->pm.backend.metrics.active_cl_ctx[1] = 0; kbdev->pm.backend.metrics.active_gl_ctx[0] = 0; kbdev->pm.backend.metrics.active_gl_ctx[1] = 0; - kbdev->pm.backend.metrics.busy_cl[0] = 0; - kbdev->pm.backend.metrics.busy_cl[1] = 0; - kbdev->pm.backend.metrics.busy_gl = 0; + + kbdev->pm.backend.metrics.values.time_busy = 0; + kbdev->pm.backend.metrics.values.time_idle = 0; + kbdev->pm.backend.metrics.values.busy_cl[0] = 0; + kbdev->pm.backend.metrics.values.busy_cl[1] = 0; + kbdev->pm.backend.metrics.values.busy_gl = 0; spin_lock_init(&kbdev->pm.backend.metrics.lock); @@ -138,17 +139,17 @@ static void kbase_pm_get_dvfs_utilisation_calc(struct kbase_device *kbdev, if (kbdev->pm.backend.metrics.gpu_active) { u32 ns_time = (u32) (ktime_to_ns(diff) >> KBASE_PM_TIME_SHIFT); - kbdev->pm.backend.metrics.time_busy += ns_time; + kbdev->pm.backend.metrics.values.time_busy += ns_time; if (kbdev->pm.backend.metrics.active_cl_ctx[0]) - kbdev->pm.backend.metrics.busy_cl[0] += ns_time; + kbdev->pm.backend.metrics.values.busy_cl[0] += ns_time; if (kbdev->pm.backend.metrics.active_cl_ctx[1]) - kbdev->pm.backend.metrics.busy_cl[1] += ns_time; + kbdev->pm.backend.metrics.values.busy_cl[1] += ns_time; if (kbdev->pm.backend.metrics.active_gl_ctx[0]) - kbdev->pm.backend.metrics.busy_gl += ns_time; + kbdev->pm.backend.metrics.values.busy_gl += ns_time; if (kbdev->pm.backend.metrics.active_gl_ctx[1]) - kbdev->pm.backend.metrics.busy_gl += ns_time; + kbdev->pm.backend.metrics.values.busy_gl += ns_time; } else { - kbdev->pm.backend.metrics.time_idle += (u32) (ktime_to_ns(diff) + kbdev->pm.backend.metrics.values.time_idle += (u32) (ktime_to_ns(diff) >> KBASE_PM_TIME_SHIFT); } @@ -156,160 +157,53 @@ static void kbase_pm_get_dvfs_utilisation_calc(struct kbase_device *kbdev, } #if defined(CONFIG_MALI_BIFROST_DEVFREQ) || defined(CONFIG_MALI_BIFROST_DVFS) -/* Caller needs to hold kbdev->pm.backend.metrics.lock before calling this - * function. - */ -static void kbase_pm_reset_dvfs_utilisation_unlocked(struct kbase_device *kbdev, - ktime_t now) -{ - /* Store previous value */ - kbdev->pm.backend.metrics.prev_idle = - kbdev->pm.backend.metrics.time_idle; - kbdev->pm.backend.metrics.prev_busy = - kbdev->pm.backend.metrics.time_busy; - - /* Reset current values */ - kbdev->pm.backend.metrics.time_period_start = now; - kbdev->pm.backend.metrics.time_idle = 0; - kbdev->pm.backend.metrics.time_busy = 0; - kbdev->pm.backend.metrics.busy_cl[0] = 0; - kbdev->pm.backend.metrics.busy_cl[1] = 0; - kbdev->pm.backend.metrics.busy_gl = 0; -} - -void kbase_pm_reset_dvfs_utilisation(struct kbase_device *kbdev) +void kbase_pm_get_dvfs_metrics(struct kbase_device *kbdev, + struct kbasep_pm_metrics *last, + struct kbasep_pm_metrics *diff) { + struct kbasep_pm_metrics *cur = &kbdev->pm.backend.metrics.values; unsigned long flags; spin_lock_irqsave(&kbdev->pm.backend.metrics.lock, flags); - kbase_pm_reset_dvfs_utilisation_unlocked(kbdev, ktime_get()); - spin_unlock_irqrestore(&kbdev->pm.backend.metrics.lock, flags); -} + kbase_pm_get_dvfs_utilisation_calc(kbdev, ktime_get()); -void kbase_pm_get_dvfs_utilisation(struct kbase_device *kbdev, - unsigned long *total_out, unsigned long *busy_out) -{ - ktime_t now = ktime_get(); - unsigned long flags, busy, total; + memset(diff, 0, sizeof(*diff)); + diff->time_busy = cur->time_busy - last->time_busy; + diff->time_idle = cur->time_idle - last->time_idle; + diff->busy_cl[0] = cur->busy_cl[0] - last->busy_cl[0]; + diff->busy_cl[1] = cur->busy_cl[1] - last->busy_cl[1]; + diff->busy_gl = cur->busy_gl - last->busy_gl; - spin_lock_irqsave(&kbdev->pm.backend.metrics.lock, flags); - kbase_pm_get_dvfs_utilisation_calc(kbdev, now); - - busy = kbdev->pm.backend.metrics.time_busy; - total = busy + kbdev->pm.backend.metrics.time_idle; - - /* Reset stats if older than MALI_UTILIZATION_MAX_PERIOD (default - * 100ms) */ - if (total >= MALI_UTILIZATION_MAX_PERIOD) { - kbase_pm_reset_dvfs_utilisation_unlocked(kbdev, now); - } else if (total < (MALI_UTILIZATION_MAX_PERIOD / 2)) { - total += kbdev->pm.backend.metrics.prev_idle + - kbdev->pm.backend.metrics.prev_busy; - busy += kbdev->pm.backend.metrics.prev_busy; - } + *last = *cur; - *total_out = total; - *busy_out = busy; spin_unlock_irqrestore(&kbdev->pm.backend.metrics.lock, flags); } +KBASE_EXPORT_TEST_API(kbase_pm_get_dvfs_metrics); #endif #ifdef CONFIG_MALI_BIFROST_DVFS - -/* caller needs to hold kbdev->pm.backend.metrics.lock before calling this - * function - */ -int kbase_pm_get_dvfs_utilisation_old(struct kbase_device *kbdev, - int *util_gl_share, - int util_cl_share[2], - ktime_t now) -{ - int utilisation; - int busy; - - kbase_pm_get_dvfs_utilisation_calc(kbdev, now); - - if (kbdev->pm.backend.metrics.time_idle + - kbdev->pm.backend.metrics.time_busy == 0) { - /* No data - so we return NOP */ - utilisation = -1; - if (util_gl_share) - *util_gl_share = -1; - if (util_cl_share) { - util_cl_share[0] = -1; - util_cl_share[1] = -1; - } - goto out; - } - - utilisation = (100 * kbdev->pm.backend.metrics.time_busy) / - (kbdev->pm.backend.metrics.time_idle + - kbdev->pm.backend.metrics.time_busy); - - busy = kbdev->pm.backend.metrics.busy_gl + - kbdev->pm.backend.metrics.busy_cl[0] + - kbdev->pm.backend.metrics.busy_cl[1]; - - if (busy != 0) { - if (util_gl_share) - *util_gl_share = - (100 * kbdev->pm.backend.metrics.busy_gl) / - busy; - if (util_cl_share) { - util_cl_share[0] = - (100 * kbdev->pm.backend.metrics.busy_cl[0]) / - busy; - util_cl_share[1] = - (100 * kbdev->pm.backend.metrics.busy_cl[1]) / - busy; - } - } else { - if (util_gl_share) - *util_gl_share = -1; - if (util_cl_share) { - util_cl_share[0] = -1; - util_cl_share[1] = -1; - } - } - -out: - return utilisation; -} - void kbase_pm_get_dvfs_action(struct kbase_device *kbdev) { - unsigned long flags; int utilisation, util_gl_share; int util_cl_share[2]; - ktime_t now; + int busy; + struct kbasep_pm_metrics *diff; KBASE_DEBUG_ASSERT(kbdev != NULL); - spin_lock_irqsave(&kbdev->pm.backend.metrics.lock, flags); + diff = &kbdev->pm.backend.metrics.dvfs_diff; - now = ktime_get(); + kbase_pm_get_dvfs_metrics(kbdev, &kbdev->pm.backend.metrics.dvfs_last, diff); - utilisation = kbase_pm_get_dvfs_utilisation_old(kbdev, &util_gl_share, - util_cl_share, now); + utilisation = (100 * diff->time_busy) / + max(diff->time_busy + diff->time_idle, 1u); - if (utilisation < 0 || util_gl_share < 0 || util_cl_share[0] < 0 || - util_cl_share[1] < 0) { - utilisation = 0; - util_gl_share = 0; - util_cl_share[0] = 0; - util_cl_share[1] = 0; - goto out; - } - -out: -#ifdef CONFIG_MALI_BIFROST_DVFS - kbase_platform_dvfs_event(kbdev, utilisation, util_gl_share, - util_cl_share); -#endif /*CONFIG_MALI_BIFROST_DVFS */ + busy = max(diff->busy_gl + diff->busy_cl[0] + diff->busy_cl[1], 1u); + util_gl_share = (100 * diff->busy_gl) / busy; + util_cl_share[0] = (100 * diff->busy_cl[0]) / busy; + util_cl_share[1] = (100 * diff->busy_cl[1]) / busy; - kbase_pm_reset_dvfs_utilisation_unlocked(kbdev, now); - - spin_unlock_irqrestore(&kbdev->pm.backend.metrics.lock, flags); + kbase_platform_dvfs_event(kbdev, utilisation, util_gl_share, util_cl_share); } bool kbase_pm_metrics_is_active(struct kbase_device *kbdev) diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_policy.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_policy.c index b98c68d9a42a8e..0bf133494f03aa 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_policy.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_policy.c @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2010-2016 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Power policy API implementations */ @@ -378,6 +383,7 @@ void kbase_pm_update_active(struct kbase_device *kbdev) /* Power on the GPU and any cores requested by the policy */ if (pm->backend.poweroff_wait_in_progress) { + KBASE_DEBUG_ASSERT(kbdev->pm.backend.gpu_powered); pm->backend.poweron_required = true; spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags); } else { @@ -922,19 +928,24 @@ KBASE_EXPORT_TEST_API(kbase_pm_request_cores_sync); void kbase_pm_request_l2_caches(struct kbase_device *kbdev) { unsigned long flags; - u32 prior_l2_users_count; spin_lock_irqsave(&kbdev->hwaccess_lock, flags); - prior_l2_users_count = kbdev->l2_users_count++; + kbdev->l2_users_count++; KBASE_DEBUG_ASSERT(kbdev->l2_users_count != 0); - /* if the GPU is reset while the l2 is on, l2 will be off but - * prior_l2_users_count will be > 0. l2_available_bitmap will have been - * set to 0 though by kbase_pm_init_hw */ - if (!prior_l2_users_count || !kbdev->l2_available_bitmap) - kbase_pm_check_transitions_nolock(kbdev); + /* Check for the required L2 transitions. + * Caller would block here for the L2 caches of all core groups to be + * powered on, so need to inform the Hw to power up all the L2 caches. + * Can't rely on the l2_users_count value being non-zero previously to + * avoid checking for the transition, as the count could be non-zero + * even if not all the instances of L2 cache are powered up since + * currently the power status of L2 is not tracked separately for each + * core group. Also if the GPU is reset while the L2 is on, L2 will be + * off but the count will be non-zero. + */ + kbase_pm_check_transitions_nolock(kbdev); spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags); wait_event(kbdev->pm.backend.l2_powered_wait, diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_policy.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_policy.h index 611a90e66e6593..852fedd346ba37 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_policy.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_policy.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Power policy API definitions */ diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_time.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_time.c index 0068e1091f4c67..cd0c534ffc1f33 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_time.c +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_time.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> #include <mali_kbase_hwaccess_time.h> #include <backend/gpu/mali_kbase_device_internal.h> diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_time.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_time.h index 0559b2f7097d1c..c17a23f560a44f 100644 --- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_time.h +++ b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_time.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_BACKEND_TIME_H_ #define _KBASE_BACKEND_TIME_H_ diff --git a/drivers/gpu/arm/bifrost_for_linux/build.bp b/drivers/gpu/arm/bifrost_for_linux/build.bp new file mode 100644 index 00000000000000..0676a2494875e1 --- /dev/null +++ b/drivers/gpu/arm/bifrost_for_linux/build.bp @@ -0,0 +1,101 @@ +/* + * Copyright: + * ---------------------------------------------------------------------------- + * This confidential and proprietary software may be used only as authorized + * by a licensing agreement from ARM Limited. + * (C) COPYRIGHT 2017-2018 ARM Limited, ALL RIGHTS RESERVED + * The entire notice above must be reproduced on all authorized copies and + * copies may only be made to the extent permitted by a licensing agreement + * from ARM Limited. + * ---------------------------------------------------------------------------- + */ + +/* Kernel-side tests may include mali_kbase's headers. Therefore any config + * options which affect the sizes of any structs (e.g. adding extra members) + * must be included in these defaults, so that the structs are consistent in + * both mali_kbase and the test modules. */ +bob_defaults { + name: "mali_kbase_shared_config_defaults", + no_mali: { + kbuild_options: ["CONFIG_MALI_BIFROST_NO_MALI=y"], + }, + mali_corestack: { + kbuild_options: ["CONFIG_MALI_CORESTACK=y"], + }, + mali_devfreq: { + kbuild_options: ["CONFIG_MALI_BIFROST_DEVFREQ=y"], + }, + mali_midgard_dvfs: { + kbuild_options: ["CONFIG_MALI_BIFROST_DVFS=y"], + }, + mali_trace_timeline: { + kbuild_options: ["CONFIG_MALI_BIFROST_TRACE_TIMELINE=y"], + }, + mali_debug: { + kbuild_options: ["CONFIG_MALI_BIFROST_DEBUG=y"], + }, + mali_fpga_bus_logger: { + kbuild_options: ["CONFIG_MALI_FPGA_BUS_LOGGER=y"], + }, + cinstr_job_dump: { + kbuild_options: ["CONFIG_MALI_JOB_DUMP=y"], + }, + mali_gator_support: { + kbuild_options: ["CONFIG_MALI_BIFROST_GATOR_SUPPORT=y"], + }, + mali_system_trace: { + kbuild_options: ["CONFIG_MALI_BIFROST_SYSTEM_TRACE=y"], + }, + kbuild_options: [ + "MALI_UNIT_TEST={{.unit_test_code}}", + "MALI_CUSTOMER_RELEASE={{.release}}", + "MALI_KERNEL_TEST_API={{.debug}}", + ], + defaults: ["kernel_defaults"], +} + +bob_kernel_module { + name: "mali_kbase", + srcs: [ + "*.c", + "*.h", + "Kbuild", + "backend/gpu/*.c", + "backend/gpu/*.h", + "backend/gpu/Kbuild", + "ipa/*.c", + "ipa/*.h", + "ipa/Kbuild", + "platform/*.h", + "platform/*/*.c", + "platform/*/*.h", + "platform/*/Kbuild", + "thirdparty/*.c", + ], + kbuild_options: [ + "CONFIG_MALI_KUTF=n", + "CONFIG_MALI_MIDGARD=m", + "CONFIG_MALI_NO_MALI_DEFAULT_GPU={{.gpu}}", + "CONFIG_MALI_PLATFORM_NAME={{.mali_platform_name}}", + "MALI_KERNEL_TEST_API={{.unit_test_code}}", + "MALI_MOCK_TEST={{.mali_mock_test}}", + ], + mali_error_inject: { + kbuild_options: ["CONFIG_MALI_BIFROST_ERROR_INJECT=y"], + }, + mali_error_inject_random: { + kbuild_options: ["CONFIG_MALI_ERROR_INJECT_RANDOM=y"], + }, + mali_prfcnt_set_secondary: { + kbuild_options: ["CONFIG_MALI_BIFROST_PRFCNT_SET_SECONDARY=y"], + }, + mali_2mb_alloc: { + kbuild_options: ["CONFIG_MALI_2MB_ALLOC=y"], + }, + mali_mock_test: { + srcs: ["tests/internal/src/mock/mali_kbase_pm_driver_mock.c"], + }, + defaults: ["mali_kbase_shared_config_defaults"], +} + +optional_subdirs = ["tests"] diff --git a/drivers/gpu/arm/bifrost_for_linux/docs/Doxyfile b/drivers/gpu/arm/bifrost_for_linux/docs/Doxyfile index 35ff2f1ce4a068..6498dcbc1840d5 100644 --- a/drivers/gpu/arm/bifrost_for_linux/docs/Doxyfile +++ b/drivers/gpu/arm/bifrost_for_linux/docs/Doxyfile @@ -1,17 +1,23 @@ # -# (C) COPYRIGHT 2011-2013, 2015 ARM Limited. All rights reserved. +# (C) COPYRIGHT 2011-2013, 2015, 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - ############################################################################## @@ -32,7 +38,7 @@ # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT += ../../kernel/drivers/gpu/arm/midgard/ +INPUT += ../../kernel/drivers/gpu/arm/midgard/ ############################################################################## # Everything below here is optional, and in most cases not required @@ -64,7 +70,7 @@ FILE_PATTERNS += # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. -EXCLUDE += ../../kernel/drivers/gpu/arm/midgard/platform ../../kernel/drivers/gpu/arm/midgard/platform_dummy ../../kernel/drivers/gpu/arm/midgard/scripts ../../kernel/drivers/gpu/arm/midgard/tests ../../kernel/drivers/gpu/arm/midgard/Makefile ../../kernel/drivers/gpu/arm/midgard/Makefile.kbase ../../kernel/drivers/gpu/arm/midgard/Kbuild ../../kernel/drivers/gpu/arm/midgard/Kconfig ../../kernel/drivers/gpu/arm/midgard/sconscript ../../kernel/drivers/gpu/arm/midgard/docs ../../kernel/drivers/gpu/arm/midgard/pm_test_script.sh ../../kernel/drivers/gpu/arm/midgard/mali_uk.h ../../kernel/drivers/gpu/arm/midgard/Makefile +EXCLUDE += ../../kernel/drivers/gpu/arm/midgard/platform ../../kernel/drivers/gpu/arm/midgard/platform_dummy ../../kernel/drivers/gpu/arm/midgard/scripts ../../kernel/drivers/gpu/arm/midgard/tests ../../kernel/drivers/gpu/arm/midgard/Makefile ../../kernel/drivers/gpu/arm/midgard/Makefile.kbase ../../kernel/drivers/gpu/arm/midgard/Kbuild ../../kernel/drivers/gpu/arm/midgard/Kconfig ../../kernel/drivers/gpu/arm/midgard/sconscript ../../kernel/drivers/gpu/arm/midgard/docs ../../kernel/drivers/gpu/arm/midgard/mali_uk.h ../../kernel/drivers/gpu/arm/midgard/Makefile # If the value of the INPUT tag contains directories, you can use the diff --git a/drivers/gpu/arm/bifrost_for_linux/docs/policy_operation_diagram.dot b/drivers/gpu/arm/bifrost_for_linux/docs/policy_operation_diagram.dot index 7ae05c2f8ded45..a15b5581148285 100644 --- a/drivers/gpu/arm/bifrost_for_linux/docs/policy_operation_diagram.dot +++ b/drivers/gpu/arm/bifrost_for_linux/docs/policy_operation_diagram.dot @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - digraph policy_objects_diagram { rankdir=LR; size="12,8"; diff --git a/drivers/gpu/arm/bifrost_for_linux/docs/policy_overview.dot b/drivers/gpu/arm/bifrost_for_linux/docs/policy_overview.dot index 159b993b7d61f6..6b873359319193 100644 --- a/drivers/gpu/arm/bifrost_for_linux/docs/policy_overview.dot +++ b/drivers/gpu/arm/bifrost_for_linux/docs/policy_overview.dot @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - digraph policy_objects_diagram { rankdir=LR size="6,6" diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/Kbuild b/drivers/gpu/arm/bifrost_for_linux/ipa/Kbuild index 0776428fce4fab..1df2e9de9d5a41 100644 --- a/drivers/gpu/arm/bifrost_for_linux/ipa/Kbuild +++ b/drivers/gpu/arm/bifrost_for_linux/ipa/Kbuild @@ -1,17 +1,23 @@ # -# (C) COPYRIGHT 2016-2017 ARM Limited. All rights reserved. +# (C) COPYRIGHT 2016-2018 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - bifrost_kbase-y += \ ipa/mali_kbase_ipa_simple.o \ @@ -19,9 +25,8 @@ bifrost_kbase-y += \ bifrost_kbase-$(CONFIG_DEBUG_FS) += ipa/mali_kbase_ipa_debugfs.o -ifneq ($(wildcard $(srctree)/$(src)/ipa/mali_kbase_ipa_vinstr_g71.c),) +ifneq ($(wildcard $(srctree)/$(src)/ipa/mali_kbase_ipa_vinstr_common.c),) bifrost_kbase-y += \ - ipa/mali_kbase_ipa_vinstr_g71.o \ + ipa/mali_kbase_ipa_vinstr_g7x.o \ ipa/mali_kbase_ipa_vinstr_common.o - endif diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa.c b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa.c index d6332b55e9701b..23ac2ec16dfb78 100644 --- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa.c +++ b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa.c @@ -1,19 +1,24 @@ /* * - * (C) COPYRIGHT 2016-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2016-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <linux/thermal.h> #include <linux/devfreq_cooling.h> #include <linux/of.h> @@ -21,6 +26,7 @@ #include "mali_kbase_ipa.h" #include "mali_kbase_ipa_debugfs.h" #include "mali_kbase_ipa_simple.h" +#include "backend/gpu/mali_kbase_pm_internal.h" #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)) #include <linux/pm_opp.h> @@ -33,10 +39,14 @@ #define KBASE_IPA_FALLBACK_MODEL_NAME "mali-simple-power-model" #define KBASE_IPA_G71_MODEL_NAME "mali-g71-power-model" +#define KBASE_IPA_G72_MODEL_NAME "mali-g72-power-model" +#define KBASE_IPA_TNOX_MODEL_NAME "mali-tnox-power-model" static struct kbase_ipa_model_ops *kbase_ipa_all_model_ops[] = { &kbase_simple_ipa_model_ops, - &kbase_g71_ipa_model_ops + &kbase_g71_ipa_model_ops, + &kbase_g72_ipa_model_ops, + &kbase_tnox_ipa_model_ops }; int kbase_ipa_model_recalculate(struct kbase_ipa_model *model) @@ -93,6 +103,15 @@ const char *kbase_ipa_model_name_from_id(u32 gpu_id) switch (GPU_ID2_MODEL_MATCH_VALUE(prod_id)) { case GPU_ID2_PRODUCT_TMIX: return KBASE_IPA_G71_MODEL_NAME; + case GPU_ID2_PRODUCT_THEX: + return KBASE_IPA_G72_MODEL_NAME; + case GPU_ID2_PRODUCT_TNOX: + return KBASE_IPA_TNOX_MODEL_NAME; + case GPU_ID2_PRODUCT_TGOX: + if ((gpu_id & GPU_ID2_VERSION_MAJOR) == + (0 << GPU_ID2_VERSION_MAJOR_SHIFT)) + /* TGOX r0 shares a power model with TNOX */ + return KBASE_IPA_TNOX_MODEL_NAME; default: return KBASE_IPA_FALLBACK_MODEL_NAME; } @@ -109,6 +128,10 @@ static struct device_node *get_model_dt_node(struct kbase_ipa_model *model) snprintf(compat_string, sizeof(compat_string), "arm,%s", model->ops->name); + /* of_find_compatible_node() will call of_node_put() on the root node, + * so take a reference on it first. + */ + of_node_get(model->kbdev->dev->of_node); model_dt_node = of_find_compatible_node(model->kbdev->dev->of_node, NULL, compat_string); if (!model_dt_node && !model->missing_dt_node_warning) { @@ -130,6 +153,10 @@ int kbase_ipa_model_add_param_s32(struct kbase_ipa_model *model, char *origin; err = of_property_read_u32_array(model_dt_node, name, addr, num_elems); + /* We're done with model_dt_node now, so drop the reference taken in + * get_model_dt_node()/of_find_compatible_node(). + */ + of_node_put(model_dt_node); if (err && dt_required) { memset(addr, 0, sizeof(s32) * num_elems); @@ -177,6 +204,12 @@ int kbase_ipa_model_add_param_string(struct kbase_ipa_model *model, err = of_property_read_string(model_dt_node, name, &string_prop_value); + + /* We're done with model_dt_node now, so drop the reference taken in + * get_model_dt_node()/of_find_compatible_node(). + */ + of_node_put(model_dt_node); + if (err && dt_required) { strncpy(addr, "", size - 1); dev_warn(model->kbdev->dev, @@ -198,7 +231,6 @@ int kbase_ipa_model_add_param_string(struct kbase_ipa_model *model, err = kbase_ipa_model_param_add(model, name, addr, size, PARAM_TYPE_STRING); - return err; } @@ -287,14 +319,6 @@ int kbase_ipa_init(struct kbase_device *kbdev) /* The simple IPA model must *always* be present.*/ ops = kbase_ipa_model_ops_find(kbdev, KBASE_IPA_FALLBACK_MODEL_NAME); - if (!ops->do_utilization_scaling_in_framework) { - dev_err(kbdev->dev, - "Fallback IPA model %s should not account for utilization\n", - ops->name); - err = -EINVAL; - goto end; - } - default_model = kbase_ipa_init_model(kbdev, ops); if (!default_model) { err = -EINVAL; @@ -325,8 +349,11 @@ int kbase_ipa_init(struct kbase_device *kbdev) ops = kbase_ipa_model_ops_find(kbdev, model_name); kbdev->ipa.configured_model = kbase_ipa_init_model(kbdev, ops); if (!kbdev->ipa.configured_model) { - err = -EINVAL; - goto end; + dev_warn(kbdev->dev, + "Failed to initialize ipa-model: \'%s\'\n" + "Falling back on default model\n", + model_name); + kbdev->ipa.configured_model = default_model; } } else { kbdev->ipa.configured_model = default_model; @@ -390,7 +417,7 @@ static u32 kbase_scale_dynamic_power(const u32 c, const u32 freq, const u64 v2fc = (u64) c * (u64) v2f; /* Range: 0 < v2fc / 1000 < 2^13 mW */ - return v2fc / 1000; + return div_u64(v2fc, 1000); } /** @@ -419,7 +446,7 @@ u32 kbase_scale_static_power(const u32 c, const u32 voltage) const u64 v3c_big = (u64) c * (u64) v3; /* Range: 0 < v3c_big / 1000000 < 2^13 mW */ - return v3c_big / 1000000; + return div_u64(v3c_big, 1000000); } static struct kbase_ipa_model *get_current_model(struct kbase_device *kbdev) @@ -455,7 +482,8 @@ static u32 get_static_power_locked(struct kbase_device *kbdev, return power; } -#ifdef CONFIG_MALI_PWRSOFT_765 +#if defined(CONFIG_MALI_PWRSOFT_765) || \ + LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) static unsigned long kbase_get_static_power(struct devfreq *df, unsigned long voltage) #else @@ -464,7 +492,8 @@ static unsigned long kbase_get_static_power(unsigned long voltage) { struct kbase_ipa_model *model; u32 power = 0; -#ifdef CONFIG_MALI_PWRSOFT_765 +#if defined(CONFIG_MALI_PWRSOFT_765) || \ + LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) struct kbase_device *kbdev = dev_get_drvdata(&df->dev); #else struct kbase_device *kbdev = kbase_find_device(-1); @@ -477,14 +506,16 @@ static unsigned long kbase_get_static_power(unsigned long voltage) mutex_unlock(&kbdev->ipa.lock); -#ifndef CONFIG_MALI_PWRSOFT_765 +#if !(defined(CONFIG_MALI_PWRSOFT_765) || \ + LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)) kbase_release_device(kbdev); #endif return power; } -#ifdef CONFIG_MALI_PWRSOFT_765 +#if defined(CONFIG_MALI_PWRSOFT_765) || \ + LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) static unsigned long kbase_get_dynamic_power(struct devfreq *df, unsigned long freq, unsigned long voltage) @@ -496,7 +527,8 @@ static unsigned long kbase_get_dynamic_power(unsigned long freq, struct kbase_ipa_model *model; u32 power_coeff = 0, power = 0; int err = 0; -#ifdef CONFIG_MALI_PWRSOFT_765 +#if defined(CONFIG_MALI_PWRSOFT_765) || \ + LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) struct kbase_device *kbdev = dev_get_drvdata(&df->dev); #else struct kbase_device *kbdev = kbase_find_device(-1); @@ -506,7 +538,7 @@ static unsigned long kbase_get_dynamic_power(unsigned long freq, model = kbdev->ipa.fallback_model; - err = model->ops->get_dynamic_coeff(model, &power_coeff, freq); + err = model->ops->get_dynamic_coeff(model, &power_coeff); if (!err) power = kbase_scale_dynamic_power(power_coeff, freq, voltage); @@ -517,55 +549,71 @@ static unsigned long kbase_get_dynamic_power(unsigned long freq, mutex_unlock(&kbdev->ipa.lock); -#ifndef CONFIG_MALI_PWRSOFT_765 +#if !(defined(CONFIG_MALI_PWRSOFT_765) || \ + LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)) kbase_release_device(kbdev); #endif return power; } -int kbase_get_real_power(struct devfreq *df, u32 *power, +int kbase_get_real_power_locked(struct kbase_device *kbdev, u32 *power, unsigned long freq, unsigned long voltage) { struct kbase_ipa_model *model; u32 power_coeff = 0; int err = 0; - struct kbase_device *kbdev = dev_get_drvdata(&df->dev); + struct kbasep_pm_metrics diff; + u64 total_time; - mutex_lock(&kbdev->ipa.lock); + lockdep_assert_held(&kbdev->ipa.lock); + + kbase_pm_get_dvfs_metrics(kbdev, &kbdev->ipa.last_metrics, &diff); model = get_current_model(kbdev); - err = model->ops->get_dynamic_coeff(model, &power_coeff, freq); + err = model->ops->get_dynamic_coeff(model, &power_coeff); - /* If we switch to protected model between get_current_model() and - * get_dynamic_coeff(), counter reading could fail. If that happens - * (unlikely, but possible), revert to the fallback model. */ + /* If the counter model returns an error (e.g. switching back to + * protected mode and failing to read counters, or a counter sample + * with too few cycles), revert to the fallback model. + */ if (err && model != kbdev->ipa.fallback_model) { model = kbdev->ipa.fallback_model; - err = model->ops->get_dynamic_coeff(model, &power_coeff, freq); + err = model->ops->get_dynamic_coeff(model, &power_coeff); } if (err) - goto exit_unlock; + return err; *power = kbase_scale_dynamic_power(power_coeff, freq, voltage); - if (model->ops->do_utilization_scaling_in_framework) { - struct devfreq_dev_status *status = &df->last_status; - unsigned long total_time = max(status->total_time, 1ul); - u64 busy_time = min(status->busy_time, total_time); - - *power = ((u64) *power * (u64) busy_time) / total_time; - } + /* time_busy / total_time cannot be >1, so assigning the 64-bit + * result of div_u64 to *power cannot overflow. + */ + total_time = diff.time_busy + (u64) diff.time_idle; + *power = div_u64(*power * (u64) diff.time_busy, + max(total_time, 1ull)); *power += get_static_power_locked(kbdev, model, voltage); -exit_unlock: + return err; +} +KBASE_EXPORT_TEST_API(kbase_get_real_power_locked); + +int kbase_get_real_power(struct devfreq *df, u32 *power, + unsigned long freq, + unsigned long voltage) +{ + int ret; + struct kbase_device *kbdev = dev_get_drvdata(&df->dev); + + mutex_lock(&kbdev->ipa.lock); + ret = kbase_get_real_power_locked(kbdev, power, freq, voltage); mutex_unlock(&kbdev->ipa.lock); - return err; + return ret; } KBASE_EXPORT_TEST_API(kbase_get_real_power); diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa.h b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa.h index 67478fe911ea48..844723a74bdaa8 100644 --- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa.h +++ b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa.h @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2016-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2016-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_IPA_H_ #define _KBASE_IPA_H_ @@ -22,8 +27,17 @@ struct devfreq; +/** + * struct kbase_ipa_model - Object describing a particular IPA model. + * @kbdev: pointer to kbase device + * @model_data: opaque pointer to model specific data, accessed + * only by model specific methods. + * @ops: pointer to object containing model specific methods. + * @params: head of the list of debugfs params added for model + * @missing_dt_node_warning: flag to limit the matching power model DT not found + * warning to once. + */ struct kbase_ipa_model { - struct list_head link; struct kbase_device *kbdev; void *model_data; struct kbase_ipa_model_ops *ops; @@ -82,8 +96,6 @@ struct kbase_ipa_model_ops { * get_dynamic_coeff() - calculate dynamic power coefficient * @model: pointer to model * @coeffp: pointer to return value location - * @current_freq: frequency the GPU has been running at for the - * previous sampling period. * * Calculate a dynamic power coefficient, with units pW/(Hz V^2), which * is then scaled by the IPA framework according to the current OPP's @@ -91,8 +103,7 @@ struct kbase_ipa_model_ops { * * Return: 0 on success, or an error code. */ - int (*get_dynamic_coeff)(struct kbase_ipa_model *model, u32 *coeffp, - u32 current_freq); + int (*get_dynamic_coeff)(struct kbase_ipa_model *model, u32 *coeffp); /* * get_static_coeff() - calculate static power coefficient * @model: pointer to model @@ -104,29 +115,74 @@ struct kbase_ipa_model_ops { * Return: 0 on success, or an error code. */ int (*get_static_coeff)(struct kbase_ipa_model *model, u32 *coeffp); - /* If false, the model's get_dynamic_coeff() method accounts for how - * long the GPU was active over the sample period. If true, the - * framework will scale the calculated power according to the - * utilization stats recorded by devfreq in get_real_power(). */ - bool do_utilization_scaling_in_framework; }; -/* Models can be registered only in the platform's platform_init_func call */ -int kbase_ipa_model_ops_register(struct kbase_device *kbdev, - struct kbase_ipa_model_ops *new_model_ops); -struct kbase_ipa_model *kbase_ipa_get_model(struct kbase_device *kbdev, - const char *name); - +/** + * kbase_ipa_init - Initialize the IPA feature + * @kbdev: pointer to kbase device + * + * simple IPA power model is initialized as a fallback model and if that + * initialization fails then IPA is not used. + * The device tree is read for the name of ipa model to be used, by using the + * property string "ipa-model". If that ipa model is supported then it is + * initialized but if the initialization fails then simple power model is used. + * + * Return: 0 on success, negative -errno on error + */ int kbase_ipa_init(struct kbase_device *kbdev); + +/** + * kbase_ipa_term - Terminate the IPA feature + * @kbdev: pointer to kbase device + * + * Both simple IPA power model and model retrieved from device tree are + * terminated. + */ void kbase_ipa_term(struct kbase_device *kbdev); -void kbase_ipa_model_use_fallback_locked(struct kbase_device *kbdev); -void kbase_ipa_model_use_configured_locked(struct kbase_device *kbdev); + +/** + * kbase_ipa_model_recalculate - Recalculate the model coefficients + * @model: pointer to the IPA model object, already initialized + * + * It shall be called immediately after the model has been initialized + * or when the model parameter has changed, so that any coefficients + * derived from parameters can be recalculated. + * Its a wrapper for the module specific recalculate() method. + * + * Return: 0 on success, negative -errno on error + */ int kbase_ipa_model_recalculate(struct kbase_ipa_model *model); + +/** + * kbase_ipa_init_model - Initilaize the particular IPA model + * @kbdev: pointer to the IPA model object, already initialized + * @ops: pointer to object containing model specific methods. + * + * Initialize the model corresponding to the @ops pointer passed. + * The init() method specified in @ops would be called. + * + * Return: pointer to kbase_ipa_model on success, NULL on error + */ struct kbase_ipa_model *kbase_ipa_init_model(struct kbase_device *kbdev, struct kbase_ipa_model_ops *ops); +/** + * kbase_ipa_term_model - Terminate the particular IPA model + * @model: pointer to the IPA model object, already initialized + * + * Terminate the model, using the term() method. + * Module specific parameters would be freed. + */ void kbase_ipa_term_model(struct kbase_ipa_model *model); +/* Switch to the fallback model */ +void kbase_ipa_model_use_fallback_locked(struct kbase_device *kbdev); + +/* Switch to the model retrieved from device tree */ +void kbase_ipa_model_use_configured_locked(struct kbase_device *kbdev); + extern struct kbase_ipa_model_ops kbase_g71_ipa_model_ops; +extern struct kbase_ipa_model_ops kbase_g72_ipa_model_ops; +extern struct kbase_ipa_model_ops kbase_tnox_ipa_model_ops; #if MALI_UNIT_TEST /** @@ -144,6 +200,13 @@ extern struct kbase_ipa_model_ops kbase_g71_ipa_model_ops; int kbase_get_real_power(struct devfreq *df, u32 *power, unsigned long freq, unsigned long voltage); + +/* Called by kbase_get_real_power() to invoke the power models. + * Must be called with kbdev->ipa.lock held. + */ +int kbase_get_real_power_locked(struct kbase_device *kbdev, u32 *power, + unsigned long freq, + unsigned long voltage); #endif /* MALI_UNIT_TEST */ #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0) diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_debugfs.c b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_debugfs.c index eafc14009ddcc2..029023c6036b57 100644 --- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_debugfs.c +++ b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_debugfs.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <linux/debugfs.h> #include <linux/list.h> #include <linux/mutex.h> @@ -56,14 +61,18 @@ static int param_int_set(void *data, u64 val) struct kbase_ipa_model_param *param = data; struct kbase_ipa_model *model = param->model; s64 sval = (s64) val; + s32 old_val; int err = 0; if (sval < S32_MIN || sval > S32_MAX) return -ERANGE; mutex_lock(¶m->model->kbdev->ipa.lock); + old_val = *param->addr.s32p; *param->addr.s32p = val; err = kbase_ipa_model_recalculate(model); + if (err < 0) + *param->addr.s32p = old_val; mutex_unlock(¶m->model->kbdev->ipa.lock); return err; @@ -92,6 +101,7 @@ static ssize_t param_string_set(struct file *file, const char __user *user_buf, { struct kbase_ipa_model_param *param = file->private_data; struct kbase_ipa_model *model = param->model; + char *old_str = NULL; ssize_t ret = count; size_t buf_size; int err; @@ -103,6 +113,12 @@ static ssize_t param_string_set(struct file *file, const char __user *user_buf, goto end; } + old_str = kstrndup(param->addr.str, param->size, GFP_KERNEL); + if (!old_str) { + ret = -ENOMEM; + goto end; + } + buf_size = min(param->size - 1, count); if (copy_from_user(param->addr.str, user_buf, buf_size)) { ret = -EFAULT; @@ -112,10 +128,13 @@ static ssize_t param_string_set(struct file *file, const char __user *user_buf, param->addr.str[buf_size] = '\0'; err = kbase_ipa_model_recalculate(model); - if (err < 0) + if (err < 0) { ret = err; + strlcpy(param->addr.str, old_str, param->size); + } end: + kfree(old_str); mutex_unlock(&model->kbdev->ipa.lock); return ret; @@ -142,6 +161,12 @@ int kbase_ipa_model_param_add(struct kbase_ipa_model *model, const char *name, /* 'name' is stack-allocated for array elements, so copy it into * heap-allocated storage */ param->name = kstrdup(name, GFP_KERNEL); + + if (!param->name) { + kfree(param); + return -ENOMEM; + } + param->addr.voidp = addr; param->size = size; param->type = type; @@ -207,6 +232,30 @@ static void kbase_ipa_model_debugfs_init(struct kbase_ipa_model *model) } } +void kbase_ipa_model_param_set_s32(struct kbase_ipa_model *model, + const char *name, s32 val) +{ + struct kbase_ipa_model_param *param; + + mutex_lock(&model->kbdev->ipa.lock); + + list_for_each_entry(param, &model->params, link) { + if (!strcmp(param->name, name)) { + if (param->type == PARAM_TYPE_S32) { + *param->addr.s32p = val; + } else { + dev_err(model->kbdev->dev, + "Wrong type for %s parameter %s\n", + model->ops->name, param->name); + } + break; + } + } + + mutex_unlock(&model->kbdev->ipa.lock); +} +KBASE_EXPORT_TEST_API(kbase_ipa_model_param_set_s32); + void kbase_ipa_debugfs_init(struct kbase_device *kbdev) { mutex_lock(&kbdev->ipa.lock); diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_debugfs.h b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_debugfs.h index ec06e2096f9427..a983d9c1421665 100644 --- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_debugfs.h +++ b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_debugfs.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_IPA_DEBUGFS_H_ #define _KBASE_IPA_DEBUGFS_H_ @@ -31,6 +36,20 @@ int kbase_ipa_model_param_add(struct kbase_ipa_model *model, const char *name, enum kbase_ipa_model_param_type type); void kbase_ipa_model_param_free_all(struct kbase_ipa_model *model); +/** + * kbase_ipa_model_param_set_s32 - Set an integer model parameter + * + * @model: pointer to IPA model + * @name: name of corresponding debugfs entry + * @val: new value of the parameter + * + * This function is only exposed for use by unit tests running in + * kernel space. Normally it is expected that parameter values will + * instead be set via debugfs. + */ +void kbase_ipa_model_param_set_s32(struct kbase_ipa_model *model, + const char *name, s32 val); + #else /* CONFIG_DEBUG_FS */ static inline int kbase_ipa_model_param_add(struct kbase_ipa_model *model, diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_simple.c b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_simple.c index 1144eb6a6ef821..31eee62ccbd053 100644 --- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_simple.c +++ b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_simple.c @@ -1,21 +1,27 @@ /* * - * (C) COPYRIGHT 2016-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2016-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <linux/freezer.h> +#include <uapi/linux/thermal.h> #include <linux/thermal.h> #ifdef CONFIG_DEVFREQ_THERMAL #include <linux/devfreq_cooling.h> @@ -38,7 +44,7 @@ static int kbase_simple_power_model_get_dummy_temp( struct thermal_zone_device *tz, unsigned long *temp) { - *temp = ACCESS_ONCE(dummy_temp); + *temp = READ_ONCE(dummy_temp); return 0; } @@ -47,9 +53,9 @@ static int dummy_temp; static int kbase_simple_power_model_get_dummy_temp( struct thermal_zone_device *tz, - int *dummy_temp) + int *temp) { - *temp = ACCESS_ONCE(dummy_temp); + *temp = READ_ONCE(dummy_temp); return 0; } #endif @@ -63,7 +69,7 @@ static int kbase_simple_power_model_get_dummy_temp( void kbase_simple_power_model_set_dummy_temp(int temp) { - ACCESS_ONCE(dummy_temp) = temp; + WRITE_ONCE(dummy_temp, temp); } KBASE_EXPORT_TEST_API(kbase_simple_power_model_set_dummy_temp); @@ -92,7 +98,7 @@ struct kbase_ipa_model_simple_data { u32 dynamic_coefficient; u32 static_coefficient; s32 ts[4]; - char tz_name[16]; + char tz_name[THERMAL_NAME_LENGTH]; struct thermal_zone_device *gpu_tz; struct task_struct *poll_temperature_thread; int current_temperature; @@ -114,10 +120,10 @@ struct kbase_ipa_model_simple_data { static u32 calculate_temp_scaling_factor(s32 ts[4], s64 t) { /* Range: -2^24 < t2 < 2^24 m(Deg^2) */ - const s64 t2 = (t * t) / 1000; + const s64 t2 = div_s64((t * t), 1000); /* Range: -2^31 < t3 < 2^31 m(Deg^3) */ - const s64 t3 = (t * t2) / 1000; + const s64 t3 = div_s64((t * t2), 1000); /* * Sum the parts. t^[1-3] are in m(Deg^N), but the coefficients are in @@ -130,7 +136,7 @@ static u32 calculate_temp_scaling_factor(s32 ts[4], s64 t) + ts[0] * 1000; /* +/- 2^41 */ /* Range: -2^60 < res_unclamped < 2^60 */ - s64 res_unclamped = res_big / 1000; + s64 res_unclamped = div_s64(res_big, 1000); /* Clamp to range of 0x to 10x the static power */ return clamp(res_unclamped, (s64) 0, (s64) 10000000); @@ -152,7 +158,7 @@ static int poll_temperature(void *data) set_freezable(); while (!kthread_should_stop()) { - struct thermal_zone_device *tz = ACCESS_ONCE(model_data->gpu_tz); + struct thermal_zone_device *tz = READ_ONCE(model_data->gpu_tz); if (tz) { int ret; @@ -167,9 +173,9 @@ static int poll_temperature(void *data) temp = FALLBACK_STATIC_TEMPERATURE; } - ACCESS_ONCE(model_data->current_temperature) = temp; + WRITE_ONCE(model_data->current_temperature, temp); - msleep_interruptible(ACCESS_ONCE(model_data->temperature_poll_interval_ms)); + msleep_interruptible(READ_ONCE(model_data->temperature_poll_interval_ms)); try_to_freeze(); } @@ -185,7 +191,7 @@ static int model_static_coeff(struct kbase_ipa_model *model, u32 *coeffp) u64 coeff_big; int temp; - temp = ACCESS_ONCE(model_data->current_temperature); + temp = READ_ONCE(model_data->current_temperature); /* Range: 0 <= temp_scaling_factor < 2^24 */ temp_scaling_factor = calculate_temp_scaling_factor(model_data->ts, @@ -197,13 +203,12 @@ static int model_static_coeff(struct kbase_ipa_model *model, u32 *coeffp) * 0 <= static_coefficient < 2^28. */ coeff_big = (u64) model_data->static_coefficient * (u64) temp_scaling_factor; - *coeffp = coeff_big / 1000000; + *coeffp = div_u64(coeff_big, 1000000); return 0; } -static int model_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp, - u32 current_freq) +static int model_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp) { struct kbase_ipa_model_simple_data *model_data = (struct kbase_ipa_model_simple_data *) model->model_data; @@ -288,20 +293,43 @@ static int kbase_simple_power_model_recalculate(struct kbase_ipa_model *model) (struct kbase_ipa_model_simple_data *)model->model_data; struct thermal_zone_device *tz; + lockdep_assert_held(&model->kbdev->ipa.lock); + if (!strnlen(model_data->tz_name, sizeof(model_data->tz_name))) { - tz = NULL; + model_data->gpu_tz = NULL; } else { - tz = thermal_zone_get_zone_by_name(model_data->tz_name); + char tz_name[THERMAL_NAME_LENGTH]; + + strlcpy(tz_name, model_data->tz_name, sizeof(tz_name)); + + /* Release ipa.lock so that thermal_list_lock is not acquired + * with ipa.lock held, thereby avoid lock ordering violation + * lockdep warning. The warning comes as a chain of locks + * ipa.lock --> thermal_list_lock --> tz->lock gets formed + * on registering devfreq cooling device when probe method + * of mali platform driver is invoked. + */ + mutex_unlock(&model->kbdev->ipa.lock); + tz = thermal_zone_get_zone_by_name(tz_name); + mutex_lock(&model->kbdev->ipa.lock); if (IS_ERR_OR_NULL(tz)) { pr_warn_ratelimited("Error %ld getting thermal zone \'%s\', not yet ready?\n", - PTR_ERR(tz), model_data->tz_name); - tz = NULL; + PTR_ERR(tz), tz_name); return -EPROBE_DEFER; } - } - ACCESS_ONCE(model_data->gpu_tz) = tz; + /* Check if another thread raced against us & updated the + * thermal zone name string. Update the gpu_tz pointer only if + * the name string did not change whilst we retrieved the new + * thermal_zone_device pointer, otherwise model_data->tz_name & + * model_data->gpu_tz would become inconsistent with each other. + * The below check will succeed only for the thread which last + * updated the name string. + */ + if (strncmp(tz_name, model_data->tz_name, sizeof(tz_name)) == 0) + model_data->gpu_tz = tz; + } return 0; } @@ -323,5 +351,5 @@ struct kbase_ipa_model_ops kbase_simple_ipa_model_ops = { .term = &kbase_simple_power_model_term, .get_dynamic_coeff = &model_dynamic_coeff, .get_static_coeff = &model_static_coeff, - .do_utilization_scaling_in_framework = true, }; +KBASE_EXPORT_TEST_API(kbase_simple_ipa_model_ops); diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_simple.h b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_simple.h index 23cd55f5867dcf..84534e07ec55c8 100644 --- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_simple.h +++ b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_simple.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_IPA_SIMPLE_H_ #define _KBASE_IPA_SIMPLE_H_ diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_common.c b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_common.c index d3964d0d3c731c..4019657f41a321 100644 --- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_common.c +++ b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_common.c @@ -1,38 +1,35 @@ /* * - * (C) COPYRIGHT 2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2017-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include "mali_kbase_ipa_vinstr_common.h" +#include "mali_kbase_ipa_debugfs.h" -#if MALI_UNIT_TEST -static ktime_t dummy_time; - -/* Intercept calls to the kernel function using a macro */ -#ifdef ktime_get -#undef ktime_get -#endif -#define ktime_get() (ACCESS_ONCE(dummy_time)) +#define DEFAULT_SCALING_FACTOR 5 -void kbase_ipa_set_dummy_time(ktime_t t) -{ - ACCESS_ONCE(dummy_time) = t; -} -KBASE_EXPORT_TEST_API(kbase_ipa_set_dummy_time); - -#endif /* MALI_UNIT_TEST */ +/* If the value of GPU_ACTIVE is below this, use the simple model + * instead, to avoid extrapolating small amounts of counter data across + * large sample periods. + */ +#define DEFAULT_MIN_SAMPLE_CYCLES 10000 /** * read_hwcnt() - read a counter value @@ -82,10 +79,8 @@ s64 kbase_ipa_sum_all_shader_cores( core_mask >>= 1; } - /* Range: -2^54 < ret < 2^54 */ - ret *= coeff; - - return ret / 1000000; + /* Range: -2^54 < ret * coeff < 2^54 */ + return ret * coeff; } s64 kbase_ipa_single_counter( @@ -96,16 +91,49 @@ s64 kbase_ipa_single_counter( const u32 counter_value = kbase_ipa_read_hwcnt(model_data, counter); /* Range: -2^49 < ret < 2^49 */ - const s64 multiplied = (s64) counter_value * (s64) coeff; + return counter_value * (s64) coeff; +} + +/** + * kbase_ipa_gpu_active - Inform IPA that GPU is now active + * @model_data: Pointer to model data + * + * This function may cause vinstr to become active. + */ +static void kbase_ipa_gpu_active(struct kbase_ipa_model_vinstr_data *model_data) +{ + struct kbase_device *kbdev = model_data->kbdev; - /* Range: -2^29 < return < 2^29 */ - return multiplied / 1000000; + lockdep_assert_held(&kbdev->pm.lock); + + if (!kbdev->ipa.vinstr_active) { + kbdev->ipa.vinstr_active = true; + kbase_vinstr_resume_client(model_data->vinstr_cli); + } +} + +/** + * kbase_ipa_gpu_idle - Inform IPA that GPU is now idle + * @model_data: Pointer to model data + * + * This function may cause vinstr to become idle. + */ +static void kbase_ipa_gpu_idle(struct kbase_ipa_model_vinstr_data *model_data) +{ + struct kbase_device *kbdev = model_data->kbdev; + + lockdep_assert_held(&kbdev->pm.lock); + + if (kbdev->ipa.vinstr_active) { + kbase_vinstr_suspend_client(model_data->vinstr_cli); + kbdev->ipa.vinstr_active = false; + } } int kbase_ipa_attach_vinstr(struct kbase_ipa_model_vinstr_data *model_data) { struct kbase_device *kbdev = model_data->kbdev; - struct kbase_uk_hwcnt_reader_setup setup; + struct kbase_ioctl_hwcnt_reader_setup setup; size_t dump_size; dump_size = kbase_vinstr_dump_size(kbdev); @@ -128,90 +156,183 @@ int kbase_ipa_attach_vinstr(struct kbase_ipa_model_vinstr_data *model_data) return -1; } - model_data->last_sample_read_time = ktime_get(); kbase_vinstr_hwc_clear(model_data->vinstr_cli); + kbdev->ipa.gpu_active_callback = kbase_ipa_gpu_active; + kbdev->ipa.gpu_idle_callback = kbase_ipa_gpu_idle; + kbdev->ipa.model_data = model_data; + kbdev->ipa.vinstr_active = false; + /* Suspend vinstr, to ensure that the GPU is powered off until there is + * something to execute. + */ + kbase_vinstr_suspend_client(model_data->vinstr_cli); + return 0; } void kbase_ipa_detach_vinstr(struct kbase_ipa_model_vinstr_data *model_data) { + struct kbase_device *kbdev = model_data->kbdev; + + kbdev->ipa.gpu_active_callback = NULL; + kbdev->ipa.gpu_idle_callback = NULL; + kbdev->ipa.model_data = NULL; + kbdev->ipa.vinstr_active = false; + if (model_data->vinstr_cli) kbase_vinstr_detach_client(model_data->vinstr_cli); + model_data->vinstr_cli = NULL; kfree(model_data->vinstr_buffer); model_data->vinstr_buffer = NULL; } -int kbase_ipa_vinstr_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp, - u32 current_freq) +int kbase_ipa_vinstr_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp) { struct kbase_ipa_model_vinstr_data *model_data = (struct kbase_ipa_model_vinstr_data *)model->model_data; + struct kbase_device *kbdev = model_data->kbdev; s64 energy = 0; size_t i; - ktime_t now = ktime_get(); - ktime_t time_since_last_sample = - ktime_sub(now, model_data->last_sample_read_time); - /* Range: 2^0 < time_since_last_sample_ms < 2^10 (1-1000ms) */ - s64 time_since_last_sample_ms = ktime_to_ms(time_since_last_sample); - u64 coeff = 0; - u64 num_cycles; + u64 coeff = 0, coeff_mul = 0; + u32 active_cycles; int err = 0; + if (!kbdev->ipa.vinstr_active) + goto err0; /* GPU powered off - no counters to collect */ + err = kbase_vinstr_hwc_dump(model_data->vinstr_cli, BASE_HWCNT_READER_EVENT_MANUAL); if (err) goto err0; - model_data->last_sample_read_time = now; + /* Range: 0 (GPU not used at all), to the max sampling interval, say + * 1s, * max GPU frequency (GPU 100% utilized). + * 0 <= active_cycles <= 1 * ~2GHz + * 0 <= active_cycles < 2^31 + */ + active_cycles = model_data->get_active_cycles(model_data); + + if (active_cycles < (u32) max(model_data->min_sample_cycles, 0)) { + err = -ENODATA; + goto err0; + } - /* Range of 'energy' is +/- 2^34 * number of IPA groups, so around - * -2^38 < energy < 2^38 */ + /* Range: 1 <= active_cycles < 2^31 */ + active_cycles = max(1u, active_cycles); + + /* Range of 'energy' is +/- 2^54 * number of IPA groups (~8), so around + * -2^57 < energy < 2^57 + */ for (i = 0; i < model_data->groups_def_num; i++) { const struct kbase_ipa_group *group = &model_data->groups_def[i]; - s32 coeff, group_energy; - - coeff = model_data->group_values[i]; - group_energy = group->op(model_data, coeff, group->counter); + s32 coeff = model_data->group_values[i]; + s64 group_energy = group->op(model_data, coeff, + group->counter_block_offset); energy = kbase_ipa_add_saturate(energy, group_energy); } - /* Range: 0 <= coeff < 2^38 */ + /* Range: 0 <= coeff < 2^57 */ if (energy > 0) coeff = energy; - /* Scale by user-specified factor and divide by 1000. But actually - * cancel the division out, because we want the num_cycles in KHz and - * don't want to lose precision. */ + /* Range: 0 <= coeff < 2^57 (because active_cycles >= 1). However, this + * can be constrained further: Counter values can only be increased by + * a theoretical maximum of about 64k per clock cycle. Beyond this, + * we'd have to sample every 1ms to avoid them overflowing at the + * lowest clock frequency (say 100MHz). Therefore, we can write the + * range of 'coeff' in terms of active_cycles: + * + * coeff = SUM(coeffN * counterN * num_cores_for_counterN) + * coeff <= SUM(coeffN * counterN) * max_num_cores + * coeff <= num_IPA_groups * max_coeff * max_counter * max_num_cores + * (substitute max_counter = 2^16 * active_cycles) + * coeff <= num_IPA_groups * max_coeff * 2^16 * active_cycles * max_num_cores + * coeff <= 2^3 * 2^22 * 2^16 * active_cycles * 2^5 + * coeff <= 2^46 * active_cycles + * + * So after the division: 0 <= coeff <= 2^46 + */ + coeff = div_u64(coeff, active_cycles); + + /* Scale by user-specified factor (where unity is 1000). + * Range: 0 <= coeff_mul < 2^61 + */ + coeff_mul = coeff * model_data->scaling_factor; + + /* Range: 0 <= coeff_mul < 2^51 */ + coeff_mul = div_u64(coeff_mul, 1000u); - /* Range: 0 < coeff < 2^53 */ - coeff = coeff * model_data->scaling_factor; +err0: + /* Clamp to a sensible range - 2^16 gives about 14W at 400MHz/750mV */ + *coeffp = clamp(coeff_mul, (u64) 0, (u64) 1 << 16); + return err; +} - if (time_since_last_sample_ms == 0) { - time_since_last_sample_ms = 1; - } else if (time_since_last_sample_ms < 0) { - err = -ERANGE; - goto err0; +int kbase_ipa_vinstr_common_model_init(struct kbase_ipa_model *model, + const struct kbase_ipa_group *ipa_groups_def, + size_t ipa_group_size, + kbase_ipa_get_active_cycles_callback get_active_cycles) +{ + int err = 0; + size_t i; + struct kbase_ipa_model_vinstr_data *model_data; + + if (!model || !ipa_groups_def || !ipa_group_size || !get_active_cycles) + return -EINVAL; + + model_data = kzalloc(sizeof(*model_data), GFP_KERNEL); + if (!model_data) + return -ENOMEM; + + model_data->kbdev = model->kbdev; + model_data->groups_def = ipa_groups_def; + model_data->groups_def_num = ipa_group_size; + model_data->get_active_cycles = get_active_cycles; + + model->model_data = (void *) model_data; + + for (i = 0; i < model_data->groups_def_num; ++i) { + const struct kbase_ipa_group *group = &model_data->groups_def[i]; + + model_data->group_values[i] = group->default_value; + err = kbase_ipa_model_add_param_s32(model, group->name, + &model_data->group_values[i], + 1, false); + if (err) + goto exit; } - /* Range: 2^20 < num_cycles < 2^40 mCycles */ - num_cycles = (u64) current_freq * (u64) time_since_last_sample_ms; - /* Range: 2^10 < num_cycles < 2^30 Cycles */ - num_cycles /= 1000000; + model_data->scaling_factor = DEFAULT_SCALING_FACTOR; + err = kbase_ipa_model_add_param_s32(model, "scale", + &model_data->scaling_factor, + 1, false); + if (err) + goto exit; - /* num_cycles should never be 0 in _normal_ usage (because we expect - * frequencies on the order of MHz and >10ms polling intervals), but - * protect against divide-by-zero anyway. */ - if (num_cycles == 0) - num_cycles = 1; + model_data->min_sample_cycles = DEFAULT_MIN_SAMPLE_CYCLES; + err = kbase_ipa_model_add_param_s32(model, "min_sample_cycles", + &model_data->min_sample_cycles, + 1, false); + if (err) + goto exit; - /* Range: 0 < coeff < 2^43 */ - coeff = div_u64(coeff, num_cycles); + err = kbase_ipa_attach_vinstr(model_data); -err0: - /* Clamp to a sensible range - 2^16 gives about 14W at 400MHz/750mV */ - *coeffp = clamp(coeff, (u64) 0, (u64) 1 << 16); +exit: + if (err) { + kbase_ipa_model_param_free_all(model); + kfree(model_data); + } return err; } + +void kbase_ipa_vinstr_common_model_term(struct kbase_ipa_model *model) +{ + struct kbase_ipa_model_vinstr_data *model_data = + (struct kbase_ipa_model_vinstr_data *)model->model_data; + + kbase_ipa_detach_vinstr(model_data); + kfree(model_data); +} diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_common.h b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_common.h index 25b36c8e308903..c9288e8c01f7cf 100644 --- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_common.h +++ b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_common.h @@ -1,28 +1,30 @@ /* * - * (C) COPYRIGHT 2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2017-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_IPA_VINSTR_COMMON_H_ #define _KBASE_IPA_VINSTR_COMMON_H_ #include "mali_kbase.h" -/* Maximum length for the name of an IPA group. */ -#define KBASE_IPA_MAX_GROUP_NAME_LEN 15 - /* Maximum number of IPA groups for an IPA model. */ #define KBASE_IPA_MAX_GROUP_DEF_NUM 16 @@ -36,30 +38,41 @@ #define KBASE_IPA_NR_BYTES_PER_BLOCK \ (KBASE_IPA_NR_CNT_PER_BLOCK * KBASE_IPA_NR_BYTES_PER_CNT) +struct kbase_ipa_model_vinstr_data; +typedef u32 (*kbase_ipa_get_active_cycles_callback)(struct kbase_ipa_model_vinstr_data *); /** * struct kbase_ipa_model_vinstr_data - IPA context per device * @kbdev: pointer to kbase device * @groups_def: Array of IPA groups. * @groups_def_num: Number of elements in the array of IPA groups. + * @get_active_cycles: Callback to return number of active cycles during + * counter sample period * @vinstr_cli: vinstr client handle * @vinstr_buffer: buffer to dump hardware counters onto - * @last_sample_read_time: timestamp of last vinstr buffer read * @scaling_factor: user-specified power scaling factor. This is * interpreted as a fraction where the denominator is * 1000. Range approx 0.0-32.0: * 0 < scaling_factor < 2^15 + * @min_sample_cycles: If the value of the GPU_ACTIVE counter (the number of + * cycles the GPU was working) is less than + * min_sample_cycles, the counter model will return an + * error, causing the IPA framework to approximate using + * the cached simple model results instead. This may be + * more accurate than extrapolating using a very small + * counter dump. */ struct kbase_ipa_model_vinstr_data { struct kbase_device *kbdev; s32 group_values[KBASE_IPA_MAX_GROUP_DEF_NUM]; const struct kbase_ipa_group *groups_def; size_t groups_def_num; + kbase_ipa_get_active_cycles_callback get_active_cycles; struct kbase_vinstr_client *vinstr_cli; void *vinstr_buffer; - ktime_t last_sample_read_time; s32 scaling_factor; + s32 min_sample_cycles; }; /** @@ -69,45 +82,47 @@ struct kbase_ipa_model_vinstr_data { * Coefficients are interpreted as fractions where the * denominator is 1000000. * @op: which operation to be performed on the counter values - * @counter: counter used to calculate energy for IPA group + * @counter_block_offset: block offset in bytes of the counter used to calculate energy for IPA group */ struct kbase_ipa_group { - char name[KBASE_IPA_MAX_GROUP_NAME_LEN + 1]; + const char *name; s32 default_value; s64 (*op)(struct kbase_ipa_model_vinstr_data *, s32, u32); - u32 counter; + u32 counter_block_offset; }; -/* +/** * sum_all_shader_cores() - sum a counter over all cores * @model_data pointer to model data * @coeff model coefficient. Unity is ~2^20, so range approx * +/- 4.0: -2^22 < coeff < 2^22 - + * @counter offset in bytes of the counter used to calculate energy for IPA group + * * Calculate energy estimation based on hardware counter `counter' * across all shader cores. * - * Return: Sum of counter values. Range: -2^34 < ret < 2^34 + * Return: Sum of counter values. Range: -2^54 < ret < 2^54 */ s64 kbase_ipa_sum_all_shader_cores( struct kbase_ipa_model_vinstr_data *model_data, s32 coeff, u32 counter); -/* +/** * sum_single_counter() - sum a single counter * @model_data pointer to model data * @coeff model coefficient. Unity is ~2^20, so range approx * +/- 4.0: -2^22 < coeff < 2^22 - + * @counter offset in bytes of the counter used to calculate energy for IPA group + * * Calculate energy estimation based on hardware counter `counter'. * - * Return: Counter value. Range: -2^34 < ret < 2^34 + * Return: Counter value. Range: -2^49 < ret < 2^49 */ s64 kbase_ipa_single_counter( struct kbase_ipa_model_vinstr_data *model_data, s32 coeff, u32 counter); -/* +/** * attach_vinstr() - attach a vinstr_buffer to an IPA model. * @model_data pointer to model data * @@ -119,7 +134,7 @@ s64 kbase_ipa_single_counter( */ int kbase_ipa_attach_vinstr(struct kbase_ipa_model_vinstr_data *model_data); -/* +/** * detach_vinstr() - detach a vinstr_buffer from an IPA model. * @model_data pointer to model data * @@ -132,9 +147,6 @@ void kbase_ipa_detach_vinstr(struct kbase_ipa_model_vinstr_data *model_data); * @model: pointer to instantiated model * @coeffp: pointer to location where calculated power, in * pW/(Hz V^2), is stored. - * @current_freq: frequency the GPU has been running at over the sample - * period. In Hz. Range: 10 MHz < 1GHz, - * 2^20 < current_freq < 2^30 * * This is a GPU-agnostic implementation of the get_dynamic_coeff() * function of an IPA model. It relies on the model being populated @@ -142,20 +154,36 @@ void kbase_ipa_detach_vinstr(struct kbase_ipa_model_vinstr_data *model_data); * * Return: 0 on success, or an error code. */ -int kbase_ipa_vinstr_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp, - u32 current_freq); +int kbase_ipa_vinstr_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp); + +/** + * kbase_ipa_vinstr_common_model_init() - initialize ipa power model + * @model: ipa power model to initialize + * @ipa_groups_def: array of ipa groups which sets coefficients for + * the corresponding counters used in the ipa model + * @ipa_group_size: number of elements in the array @ipa_groups_def + * @get_active_cycles: callback to return the number of cycles the GPU was + * active during the counter sample period. + * + * This initialization function performs initialization steps common + * for ipa models based on counter values. In each call, the model + * passes its specific coefficient values per ipa counter group via + * @ipa_groups_def array. + * + * Return: 0 on success, error code otherwise + */ +int kbase_ipa_vinstr_common_model_init(struct kbase_ipa_model *model, + const struct kbase_ipa_group *ipa_groups_def, + size_t ipa_group_size, + kbase_ipa_get_active_cycles_callback get_active_cycles); -#if MALI_UNIT_TEST /** - * kbase_ipa_set_dummy_time() - set a dummy monotonic time value - * @t: a monotonic time value + * kbase_ipa_vinstr_common_model_term() - terminate ipa power model + * @model: ipa power model to terminate * - * This is only intended for use in unit tests, to ensure that the kernel time - * values used by a power model are predictable. Deterministic behavior is - * necessary to allow validation of the dynamic power values computed by the - * model. + * This function performs all necessary steps to terminate ipa power model + * including clean up of resources allocated to hold model data. */ -void kbase_ipa_set_dummy_time(ktime_t t); -#endif /* MALI_UNIT_TEST */ +void kbase_ipa_vinstr_common_model_term(struct kbase_ipa_model *model); #endif /* _KBASE_IPA_VINSTR_COMMON_H_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_g7x.c b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_g7x.c new file mode 100644 index 00000000000000..7951b7475a181f --- /dev/null +++ b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_g7x.c @@ -0,0 +1,311 @@ +/* + * + * (C) COPYRIGHT 2016-2018 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 + * + */ +#include <linux/thermal.h> + +#include "mali_kbase_ipa_vinstr_common.h" +#include "mali_kbase.h" +#include "mali_kbase_ipa_debugfs.h" + + +/* Performance counter blocks base offsets */ +#define JM_BASE (0 * KBASE_IPA_NR_BYTES_PER_BLOCK) +#define TILER_BASE (1 * KBASE_IPA_NR_BYTES_PER_BLOCK) +#define MEMSYS_BASE (2 * KBASE_IPA_NR_BYTES_PER_BLOCK) +#define SC0_BASE_ONE_MEMSYS (3 * KBASE_IPA_NR_BYTES_PER_BLOCK) +#define SC0_BASE_TWO_MEMSYS (4 * KBASE_IPA_NR_BYTES_PER_BLOCK) + +/* JM counter block offsets */ +#define JM_GPU_ACTIVE (KBASE_IPA_NR_BYTES_PER_CNT * 6) + +/* Tiler counter block offsets */ +#define TILER_ACTIVE (KBASE_IPA_NR_BYTES_PER_CNT * 45) + +/* MEMSYS counter block offsets */ +#define MEMSYS_L2_ANY_LOOKUP (KBASE_IPA_NR_BYTES_PER_CNT * 25) + +/* SC counter block offsets */ +#define SC_FRAG_ACTIVE (KBASE_IPA_NR_BYTES_PER_CNT * 4) +#define SC_EXEC_CORE_ACTIVE (KBASE_IPA_NR_BYTES_PER_CNT * 26) +#define SC_EXEC_INSTR_COUNT (KBASE_IPA_NR_BYTES_PER_CNT * 28) +#define SC_TEX_COORD_ISSUE (KBASE_IPA_NR_BYTES_PER_CNT * 40) +#define SC_TEX_TFCH_NUM_OPERATIONS (KBASE_IPA_NR_BYTES_PER_CNT * 42) +#define SC_VARY_INSTR (KBASE_IPA_NR_BYTES_PER_CNT * 49) +#define SC_VARY_SLOT_32 (KBASE_IPA_NR_BYTES_PER_CNT * 50) +#define SC_VARY_SLOT_16 (KBASE_IPA_NR_BYTES_PER_CNT * 51) +#define SC_BEATS_RD_LSC (KBASE_IPA_NR_BYTES_PER_CNT * 56) +#define SC_BEATS_WR_LSC (KBASE_IPA_NR_BYTES_PER_CNT * 61) +#define SC_BEATS_WR_TIB (KBASE_IPA_NR_BYTES_PER_CNT * 62) + +/** Maximum number of cores for which a single Memory System block of performance counters is present. */ +#define KBASE_G7x_SINGLE_MEMSYS_MAX_NUM_CORES ((u8)4) + + +/** + * get_jm_counter() - get performance counter offset inside the Job Manager block + * @model_data: pointer to GPU model data. + * @counter_block_offset: offset in bytes of the performance counter inside the Job Manager block. + * + * Return: Block offset in bytes of the required performance counter. + */ +static u32 kbase_g7x_power_model_get_jm_counter(struct kbase_ipa_model_vinstr_data *model_data, + u32 counter_block_offset) +{ + return JM_BASE + counter_block_offset; +} + +/** + * get_memsys_counter() - get performance counter offset inside the Memory System block + * @model_data: pointer to GPU model data. + * @counter_block_offset: offset in bytes of the performance counter inside the (first) Memory System block. + * + * Return: Block offset in bytes of the required performance counter. + */ +static u32 kbase_g7x_power_model_get_memsys_counter(struct kbase_ipa_model_vinstr_data *model_data, + u32 counter_block_offset) +{ + /* The base address of Memory System performance counters is always the same, although their number + * may vary based on the number of cores. For the moment it's ok to return a constant. + */ + return MEMSYS_BASE + counter_block_offset; +} + +/** + * get_sc_counter() - get performance counter offset inside the Shader Cores block + * @model_data: pointer to GPU model data. + * @counter_block_offset: offset in bytes of the performance counter inside the (first) Shader Cores block. + * + * Return: Block offset in bytes of the required performance counter. + */ +static u32 kbase_g7x_power_model_get_sc_counter(struct kbase_ipa_model_vinstr_data *model_data, + u32 counter_block_offset) +{ + const u32 sc_base = model_data->kbdev->gpu_props.num_cores <= KBASE_G7x_SINGLE_MEMSYS_MAX_NUM_CORES ? + SC0_BASE_ONE_MEMSYS : + SC0_BASE_TWO_MEMSYS; + + return sc_base + counter_block_offset; +} + +/** + * memsys_single_counter() - calculate energy for a single Memory System performance counter. + * @model_data: pointer to GPU model data. + * @coeff: default value of coefficient for IPA group. + * @offset: offset in bytes of the counter inside the block it belongs to. + * + * Return: Energy estimation for a single Memory System performance counter. + */ +static s64 kbase_g7x_memsys_single_counter( + struct kbase_ipa_model_vinstr_data *model_data, + s32 coeff, + u32 offset) +{ + u32 counter; + + counter = kbase_g7x_power_model_get_memsys_counter(model_data, offset); + return kbase_ipa_single_counter(model_data, coeff, counter); +} + +/** + * sum_all_shader_cores() - calculate energy for a Shader Cores performance counter for all cores. + * @model_data: pointer to GPU model data. + * @coeff: default value of coefficient for IPA group. + * @counter_block_offset: offset in bytes of the counter inside the block it belongs to. + * + * Return: Energy estimation for a Shader Cores performance counter for all cores. + */ +static s64 kbase_g7x_sum_all_shader_cores( + struct kbase_ipa_model_vinstr_data *model_data, + s32 coeff, + u32 counter_block_offset) +{ + u32 counter; + + counter = kbase_g7x_power_model_get_sc_counter(model_data, + counter_block_offset); + return kbase_ipa_sum_all_shader_cores(model_data, coeff, counter); +} + +/** + * jm_single_counter() - calculate energy for a single Job Manager performance counter. + * @model_data: pointer to GPU model data. + * @coeff: default value of coefficient for IPA group. + * @counter_block_offset: offset in bytes of the counter inside the block it belongs to. + * + * Return: Energy estimation for a single Job Manager performance counter. + */ +static s64 kbase_g7x_jm_single_counter( + struct kbase_ipa_model_vinstr_data *model_data, + s32 coeff, + u32 counter_block_offset) +{ + u32 counter; + + counter = kbase_g7x_power_model_get_jm_counter(model_data, + counter_block_offset); + return kbase_ipa_single_counter(model_data, coeff, counter); +} + +/** + * get_active_cycles() - return the GPU_ACTIVE counter + * @model_data: pointer to GPU model data. + * + * Return: the number of cycles the GPU was active during the counter sampling + * period. + */ +static u32 kbase_g7x_get_active_cycles( + struct kbase_ipa_model_vinstr_data *model_data) +{ + u32 counter = kbase_g7x_power_model_get_jm_counter(model_data, JM_GPU_ACTIVE); + + /* Counters are only 32-bit, so we can safely multiply by 1 then cast + * the 64-bit result back to a u32. + */ + return kbase_ipa_single_counter(model_data, 1, counter); +} + +/** Table of IPA group definitions. + * + * For each IPA group, this table defines a function to access the given performance block counter (or counters, + * if the operation needs to be iterated on multiple blocks) and calculate energy estimation. + */ + +static const struct kbase_ipa_group ipa_groups_def_g71[] = { + { + .name = "l2_access", + .default_value = 526300, + .op = kbase_g7x_memsys_single_counter, + .counter_block_offset = MEMSYS_L2_ANY_LOOKUP, + }, + { + .name = "exec_instr_count", + .default_value = 301100, + .op = kbase_g7x_sum_all_shader_cores, + .counter_block_offset = SC_EXEC_INSTR_COUNT, + }, + { + .name = "tex_issue", + .default_value = 197400, + .op = kbase_g7x_sum_all_shader_cores, + .counter_block_offset = SC_TEX_COORD_ISSUE, + }, + { + .name = "tile_wb", + .default_value = -156400, + .op = kbase_g7x_sum_all_shader_cores, + .counter_block_offset = SC_BEATS_WR_TIB, + }, + { + .name = "gpu_active", + .default_value = 115800, + .op = kbase_g7x_jm_single_counter, + .counter_block_offset = JM_GPU_ACTIVE, + }, +}; + +static const struct kbase_ipa_group ipa_groups_def_g72[] = { + { + .name = "l2_access", + .default_value = 393000, + .op = kbase_g7x_memsys_single_counter, + .counter_block_offset = MEMSYS_L2_ANY_LOOKUP, + }, + { + .name = "exec_instr_count", + .default_value = 227000, + .op = kbase_g7x_sum_all_shader_cores, + .counter_block_offset = SC_EXEC_INSTR_COUNT, + }, + { + .name = "tex_issue", + .default_value = 181900, + .op = kbase_g7x_sum_all_shader_cores, + .counter_block_offset = SC_TEX_COORD_ISSUE, + }, + { + .name = "tile_wb", + .default_value = -120200, + .op = kbase_g7x_sum_all_shader_cores, + .counter_block_offset = SC_BEATS_WR_TIB, + }, + { + .name = "gpu_active", + .default_value = 133100, + .op = kbase_g7x_jm_single_counter, + .counter_block_offset = JM_GPU_ACTIVE, + }, +}; + +static const struct kbase_ipa_group ipa_groups_def_tnox[] = { + { + .name = "gpu_active", + .default_value = 122000, + .op = kbase_g7x_jm_single_counter, + .counter_block_offset = JM_GPU_ACTIVE, + }, + { + .name = "exec_instr_count", + .default_value = 488900, + .op = kbase_g7x_sum_all_shader_cores, + .counter_block_offset = SC_EXEC_INSTR_COUNT, + }, + { + .name = "vary_instr", + .default_value = 212100, + .op = kbase_g7x_sum_all_shader_cores, + .counter_block_offset = SC_VARY_INSTR, + }, + { + .name = "tex_tfch_num_operations", + .default_value = 288000, + .op = kbase_g7x_sum_all_shader_cores, + .counter_block_offset = SC_TEX_TFCH_NUM_OPERATIONS, + }, + { + .name = "l2_access", + .default_value = 378100, + .op = kbase_g7x_memsys_single_counter, + .counter_block_offset = MEMSYS_L2_ANY_LOOKUP, + }, +}; + +#define STANDARD_POWER_MODEL(gpu) \ + static int kbase_ ## gpu ## _power_model_init(\ + struct kbase_ipa_model *model) \ + { \ + BUILD_BUG_ON(ARRAY_SIZE(ipa_groups_def_ ## gpu) > \ + KBASE_IPA_MAX_GROUP_DEF_NUM); \ + return kbase_ipa_vinstr_common_model_init(model, \ + ipa_groups_def_ ## gpu, \ + ARRAY_SIZE(ipa_groups_def_ ## gpu), \ + kbase_g7x_get_active_cycles); \ + } \ + struct kbase_ipa_model_ops kbase_ ## gpu ## _ipa_model_ops = { \ + .name = "mali-" #gpu "-power-model", \ + .init = kbase_ ## gpu ## _power_model_init, \ + .term = kbase_ipa_vinstr_common_model_term, \ + .get_dynamic_coeff = kbase_ipa_vinstr_dynamic_coeff, \ + }; \ + KBASE_EXPORT_TEST_API(kbase_ ## gpu ## _ipa_model_ops) + +STANDARD_POWER_MODEL(g71); +STANDARD_POWER_MODEL(g72); +STANDARD_POWER_MODEL(tnox); diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_base_hwconfig_features.h b/drivers/gpu/arm/bifrost_for_linux/mali_base_hwconfig_features.h index 219586d4d2da1a..10da0c58e9ebd3 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_base_hwconfig_features.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_base_hwconfig_features.h @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2015-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* AUTOMATICALLY GENERATED FILE. If you want to amend the issues/features, * please update base/tools/hwconfig_generator/hwc_{issues,features}.py * For more information see base/tools/hwconfig_generator/README @@ -26,7 +31,6 @@ enum base_hw_feature { BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION, BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS, - BASE_HW_FEATURE_33BIT_VA, BASE_HW_FEATURE_XAFFINITY, BASE_HW_FEATURE_OUT_OF_ORDER_EXEC, BASE_HW_FEATURE_MRT, @@ -53,6 +57,8 @@ enum base_hw_feature { 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 }; @@ -63,6 +69,7 @@ static const enum base_hw_feature base_hw_features_generic[] = { 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 }; @@ -71,17 +78,18 @@ static const enum base_hw_feature base_hw_features_t62x[] = { 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 }; static const enum base_hw_feature base_hw_features_t72x[] = { - BASE_HW_FEATURE_33BIT_VA, BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS, BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL, 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, @@ -103,6 +111,7 @@ static const enum base_hw_feature base_hw_features_t76x[] = { 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 }; @@ -123,11 +132,11 @@ static const enum base_hw_feature base_hw_features_tFxx[] = { 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 }; static const enum base_hw_feature base_hw_features_t83x[] = { - BASE_HW_FEATURE_33BIT_VA, BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION, BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS, BASE_HW_FEATURE_XAFFINITY, @@ -145,11 +154,11 @@ static const enum base_hw_feature base_hw_features_t83x[] = { 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 }; static const enum base_hw_feature base_hw_features_t82x[] = { - BASE_HW_FEATURE_33BIT_VA, BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION, BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS, BASE_HW_FEATURE_XAFFINITY, @@ -167,6 +176,7 @@ static const enum base_hw_feature base_hw_features_t82x[] = { 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 }; @@ -189,6 +199,7 @@ static const enum base_hw_feature base_hw_features_tMIx[] = { 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, @@ -214,6 +225,7 @@ static const enum base_hw_feature base_hw_features_tHEx[] = { 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, @@ -222,7 +234,6 @@ static const enum base_hw_feature base_hw_features_tHEx[] = { }; static const enum base_hw_feature base_hw_features_tSIx[] = { - BASE_HW_FEATURE_33BIT_VA, BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION, BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS, BASE_HW_FEATURE_XAFFINITY, @@ -241,6 +252,7 @@ static const enum base_hw_feature base_hw_features_tSIx[] = { 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, @@ -249,7 +261,6 @@ static const enum base_hw_feature base_hw_features_tSIx[] = { }; static const enum base_hw_feature base_hw_features_tDVx[] = { - BASE_HW_FEATURE_33BIT_VA, BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION, BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS, BASE_HW_FEATURE_XAFFINITY, @@ -268,6 +279,7 @@ static const enum base_hw_feature base_hw_features_tDVx[] = { 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, @@ -275,8 +287,175 @@ static const enum base_hw_feature base_hw_features_tDVx[] = { BASE_HW_FEATURE_END }; +static const enum base_hw_feature base_hw_features_tNOx[] = { + BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION, + BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS, + BASE_HW_FEATURE_XAFFINITY, + BASE_HW_FEATURE_WARPING, + BASE_HW_FEATURE_INTERPIPE_REG_ALIASING, + BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS, + BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL, + BASE_HW_FEATURE_BRNDOUT_CC, + BASE_HW_FEATURE_BRNDOUT_KILL, + BASE_HW_FEATURE_LD_ST_LEA_TEX, + BASE_HW_FEATURE_LD_ST_TILEBUFFER, + BASE_HW_FEATURE_LINEAR_FILTER_FLOAT, + BASE_HW_FEATURE_MRT, + BASE_HW_FEATURE_MSAA_16X, + BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE, + 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, + BASE_HW_FEATURE_COHERENCY_REG, + BASE_HW_FEATURE_AARCH64_MMU, + BASE_HW_FEATURE_TLS_HASHING, + BASE_HW_FEATURE_3BIT_EXT_RW_L2_MMU_CONFIG, + BASE_HW_FEATURE_END +}; +static const enum base_hw_feature base_hw_features_tGOx[] = { + BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION, + BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS, + BASE_HW_FEATURE_XAFFINITY, + BASE_HW_FEATURE_WARPING, + BASE_HW_FEATURE_INTERPIPE_REG_ALIASING, + BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS, + BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL, + BASE_HW_FEATURE_BRNDOUT_CC, + BASE_HW_FEATURE_BRNDOUT_KILL, + BASE_HW_FEATURE_LD_ST_LEA_TEX, + BASE_HW_FEATURE_LD_ST_TILEBUFFER, + BASE_HW_FEATURE_LINEAR_FILTER_FLOAT, + BASE_HW_FEATURE_MRT, + BASE_HW_FEATURE_MSAA_16X, + BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE, + 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, + BASE_HW_FEATURE_COHERENCY_REG, + BASE_HW_FEATURE_AARCH64_MMU, + BASE_HW_FEATURE_TLS_HASHING, + BASE_HW_FEATURE_3BIT_EXT_RW_L2_MMU_CONFIG, + BASE_HW_FEATURE_END +}; +static const enum base_hw_feature base_hw_features_tKAx[] = { + BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION, + BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS, + BASE_HW_FEATURE_XAFFINITY, + BASE_HW_FEATURE_WARPING, + BASE_HW_FEATURE_INTERPIPE_REG_ALIASING, + BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS, + BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL, + BASE_HW_FEATURE_BRNDOUT_CC, + BASE_HW_FEATURE_BRNDOUT_KILL, + BASE_HW_FEATURE_LD_ST_LEA_TEX, + BASE_HW_FEATURE_LD_ST_TILEBUFFER, + BASE_HW_FEATURE_LINEAR_FILTER_FLOAT, + BASE_HW_FEATURE_MRT, + BASE_HW_FEATURE_MSAA_16X, + BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE, + BASE_HW_FEATURE_OUT_OF_ORDER_EXEC, + BASE_HW_FEATURE_T7XX_PAIRING_RULES, + BASE_HW_FEATURE_TEST4_DATUM_MODE, + BASE_HW_FEATURE_FLUSH_REDUCTION, + BASE_HW_FEATURE_PROTECTED_MODE, + BASE_HW_FEATURE_PROTECTED_DEBUG_MODE, + BASE_HW_FEATURE_COHERENCY_REG, + BASE_HW_FEATURE_AARCH64_MMU, + BASE_HW_FEATURE_END +}; + +static const enum base_hw_feature base_hw_features_tTRx[] = { + BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION, + BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS, + BASE_HW_FEATURE_XAFFINITY, + BASE_HW_FEATURE_WARPING, + BASE_HW_FEATURE_INTERPIPE_REG_ALIASING, + BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS, + BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL, + BASE_HW_FEATURE_BRNDOUT_CC, + BASE_HW_FEATURE_BRNDOUT_KILL, + BASE_HW_FEATURE_LD_ST_LEA_TEX, + BASE_HW_FEATURE_LD_ST_TILEBUFFER, + BASE_HW_FEATURE_LINEAR_FILTER_FLOAT, + BASE_HW_FEATURE_MRT, + BASE_HW_FEATURE_MSAA_16X, + BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE, + BASE_HW_FEATURE_OUT_OF_ORDER_EXEC, + BASE_HW_FEATURE_T7XX_PAIRING_RULES, + BASE_HW_FEATURE_TEST4_DATUM_MODE, + BASE_HW_FEATURE_FLUSH_REDUCTION, + BASE_HW_FEATURE_PROTECTED_MODE, + BASE_HW_FEATURE_PROTECTED_DEBUG_MODE, + BASE_HW_FEATURE_COHERENCY_REG, + BASE_HW_FEATURE_AARCH64_MMU, + BASE_HW_FEATURE_END +}; +static const enum base_hw_feature base_hw_features_tBOx[] = { + BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION, + BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS, + BASE_HW_FEATURE_XAFFINITY, + BASE_HW_FEATURE_WARPING, + BASE_HW_FEATURE_INTERPIPE_REG_ALIASING, + BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS, + BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL, + BASE_HW_FEATURE_BRNDOUT_CC, + BASE_HW_FEATURE_BRNDOUT_KILL, + BASE_HW_FEATURE_LD_ST_LEA_TEX, + BASE_HW_FEATURE_LD_ST_TILEBUFFER, + BASE_HW_FEATURE_LINEAR_FILTER_FLOAT, + BASE_HW_FEATURE_MRT, + BASE_HW_FEATURE_MSAA_16X, + BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE, + BASE_HW_FEATURE_OUT_OF_ORDER_EXEC, + BASE_HW_FEATURE_T7XX_PAIRING_RULES, + BASE_HW_FEATURE_TEST4_DATUM_MODE, + BASE_HW_FEATURE_FLUSH_REDUCTION, + BASE_HW_FEATURE_PROTECTED_MODE, + BASE_HW_FEATURE_PROTECTED_DEBUG_MODE, + BASE_HW_FEATURE_COHERENCY_REG, + BASE_HW_FEATURE_AARCH64_MMU, + BASE_HW_FEATURE_END +}; + +static const enum base_hw_feature base_hw_features_tEGx[] = { + BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION, + BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS, + BASE_HW_FEATURE_XAFFINITY, + BASE_HW_FEATURE_WARPING, + BASE_HW_FEATURE_INTERPIPE_REG_ALIASING, + BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS, + BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL, + BASE_HW_FEATURE_BRNDOUT_CC, + BASE_HW_FEATURE_BRNDOUT_KILL, + BASE_HW_FEATURE_LD_ST_LEA_TEX, + BASE_HW_FEATURE_LD_ST_TILEBUFFER, + BASE_HW_FEATURE_LINEAR_FILTER_FLOAT, + BASE_HW_FEATURE_MRT, + BASE_HW_FEATURE_MSAA_16X, + BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE, + 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, + BASE_HW_FEATURE_COHERENCY_REG, + BASE_HW_FEATURE_AARCH64_MMU, + BASE_HW_FEATURE_TLS_HASHING, + BASE_HW_FEATURE_3BIT_EXT_RW_L2_MMU_CONFIG, + BASE_HW_FEATURE_END +}; #endif /* _BASE_HWCONFIG_FEATURES_H_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_base_hwconfig_issues.h b/drivers/gpu/arm/bifrost_for_linux/mali_base_hwconfig_issues.h index 1c5ee496ac858b..bcd6c5ffbb25f1 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_base_hwconfig_issues.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_base_hwconfig_issues.h @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2015-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* AUTOMATICALLY GENERATED FILE. If you want to amend the issues/features, * please update base/tools/hwconfig_generator/hwc_{issues,features}.py * For more information see base/tools/hwconfig_generator/README @@ -118,6 +123,7 @@ enum base_hw_issue { GPUCORE_1619, BASE_HW_ISSUE_TSIX_1116, BASE_HW_ISSUE_TMIX_8438, + BASE_HW_ISSUE_TNOX_1194, BASE_HW_ISSUE_END }; @@ -1101,7 +1107,6 @@ static const enum base_hw_issue base_hw_issues_model_tSIx[] = { static const enum base_hw_issue base_hw_issues_tDVx_r0p0[] = { BASE_HW_ISSUE_9435, - BASE_HW_ISSUE_11054, BASE_HW_ISSUE_TMIX_8133, BASE_HW_ISSUE_TSIX_1116, BASE_HW_ISSUE_END @@ -1115,12 +1120,103 @@ static const enum base_hw_issue base_hw_issues_model_tDVx[] = { BASE_HW_ISSUE_END }; +static const enum base_hw_issue base_hw_issues_tNOx_r0p0[] = { + BASE_HW_ISSUE_9435, + BASE_HW_ISSUE_TMIX_8133, + BASE_HW_ISSUE_TSIX_1116, + BASE_HW_ISSUE_TNOX_1194, + BASE_HW_ISSUE_END +}; +static const enum base_hw_issue base_hw_issues_model_tNOx[] = { + BASE_HW_ISSUE_5736, + BASE_HW_ISSUE_9435, + BASE_HW_ISSUE_TMIX_8133, + BASE_HW_ISSUE_TSIX_1116, + BASE_HW_ISSUE_END +}; +static const enum base_hw_issue base_hw_issues_tGOx_r0p0[] = { + BASE_HW_ISSUE_9435, + BASE_HW_ISSUE_TMIX_8133, + BASE_HW_ISSUE_TSIX_1116, + BASE_HW_ISSUE_TNOX_1194, + BASE_HW_ISSUE_END +}; +static const enum base_hw_issue base_hw_issues_tGOx_r1p0[] = { + BASE_HW_ISSUE_9435, + BASE_HW_ISSUE_TMIX_8133, + BASE_HW_ISSUE_TSIX_1116, + BASE_HW_ISSUE_END +}; +static const enum base_hw_issue base_hw_issues_model_tGOx[] = { + BASE_HW_ISSUE_5736, + BASE_HW_ISSUE_9435, + BASE_HW_ISSUE_TMIX_8133, + BASE_HW_ISSUE_TSIX_1116, + BASE_HW_ISSUE_END +}; +static const enum base_hw_issue base_hw_issues_tKAx_r0p0[] = { + BASE_HW_ISSUE_9435, + BASE_HW_ISSUE_TMIX_8133, + BASE_HW_ISSUE_TSIX_1116, + BASE_HW_ISSUE_END +}; +static const enum base_hw_issue base_hw_issues_model_tKAx[] = { + BASE_HW_ISSUE_5736, + BASE_HW_ISSUE_9435, + BASE_HW_ISSUE_TMIX_8133, + BASE_HW_ISSUE_TSIX_1116, + BASE_HW_ISSUE_END +}; + +static const enum base_hw_issue base_hw_issues_tTRx_r0p0[] = { + BASE_HW_ISSUE_9435, + BASE_HW_ISSUE_TMIX_8133, + BASE_HW_ISSUE_TSIX_1116, + BASE_HW_ISSUE_END +}; + +static const enum base_hw_issue base_hw_issues_model_tTRx[] = { + BASE_HW_ISSUE_5736, + BASE_HW_ISSUE_9435, + BASE_HW_ISSUE_TMIX_8133, + BASE_HW_ISSUE_TSIX_1116, + BASE_HW_ISSUE_END +}; + +static const enum base_hw_issue base_hw_issues_tBOx_r0p0[] = { + BASE_HW_ISSUE_9435, + BASE_HW_ISSUE_TMIX_8133, + BASE_HW_ISSUE_TSIX_1116, + BASE_HW_ISSUE_END +}; + +static const enum base_hw_issue base_hw_issues_model_tBOx[] = { + BASE_HW_ISSUE_5736, + BASE_HW_ISSUE_9435, + BASE_HW_ISSUE_TMIX_8133, + BASE_HW_ISSUE_TSIX_1116, + BASE_HW_ISSUE_END +}; + +static const enum base_hw_issue base_hw_issues_tEGx_r0p0[] = { + BASE_HW_ISSUE_9435, + BASE_HW_ISSUE_TMIX_8133, + BASE_HW_ISSUE_TSIX_1116, + BASE_HW_ISSUE_END +}; +static const enum base_hw_issue base_hw_issues_model_tEGx[] = { + BASE_HW_ISSUE_5736, + BASE_HW_ISSUE_9435, + BASE_HW_ISSUE_TMIX_8133, + BASE_HW_ISSUE_TSIX_1116, + BASE_HW_ISSUE_END +}; #endif /* _BASE_HWCONFIG_ISSUES_H_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_base_kernel.h b/drivers/gpu/arm/bifrost_for_linux/mali_base_kernel.h index 6f5c68e288cd32..e53528e29fe00b 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_base_kernel.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_base_kernel.h @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Base structures shared with the kernel. */ @@ -24,12 +29,6 @@ #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; @@ -52,7 +51,7 @@ typedef struct base_mem_handle { #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 3 +#define BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS 4 #define BASE_MAX_COHERENT_GROUPS 16 @@ -64,12 +63,14 @@ typedef struct base_mem_handle { #error assert macro not defined! #endif -#if defined PAGE_MASK +#if defined(PAGE_MASK) && defined(PAGE_SHIFT) +#define LOCAL_PAGE_SHIFT PAGE_SHIFT #define LOCAL_PAGE_LSB ~PAGE_MASK #else #include <osu/mali_osu.h> #if defined OSU_CONFIG_CPU_PAGE_SIZE_LOG2 +#define LOCAL_PAGE_SHIFT OSU_CONFIG_CPU_PAGE_SIZE_LOG2 #define LOCAL_PAGE_LSB ((1ul << OSU_CONFIG_CPU_PAGE_SIZE_LOG2) - 1) #else #error Failed to find page size @@ -136,6 +137,10 @@ typedef u32 base_mem_alloc_flags; * RESERVED: (1U << 7) * RESERVED: (1U << 8) */ +#define BASE_MEM_RESERVED_BIT_5 ((base_mem_alloc_flags)1 << 5) +#define BASE_MEM_RESERVED_BIT_6 ((base_mem_alloc_flags)1 << 6) +#define BASE_MEM_RESERVED_BIT_7 ((base_mem_alloc_flags)1 << 7) +#define BASE_MEM_RESERVED_BIT_8 ((base_mem_alloc_flags)1 << 8) /* Grow backing store on GPU Page Fault */ @@ -185,14 +190,21 @@ typedef u32 base_mem_alloc_flags; * Bit 19 is reserved. * * Do not remove, use the next unreserved bit for new flags - **/ + */ #define BASE_MEM_RESERVED_BIT_19 ((base_mem_alloc_flags)1 << 19) +/** + * Memory starting from the end of the initial commit is aligned to 'extent' + * pages, where 'extent' must be a power of 2 and no more than + * BASE_MEM_TILER_ALIGN_TOP_EXTENT_MAX_PAGES + */ +#define BASE_MEM_TILER_ALIGN_TOP ((base_mem_alloc_flags)1 << 20) + /* Number of bits used as flags for base memory management * * Must be kept in sync with the base_mem_alloc_flags flags */ -#define BASE_MEM_FLAGS_NR_BITS 20 +#define BASE_MEM_FLAGS_NR_BITS 21 /* A mask for all output bits, excluding IN/OUT bits. */ @@ -210,11 +222,26 @@ typedef u32 base_mem_alloc_flags; (BASE_MEM_DONT_NEED | BASE_MEM_COHERENT_SYSTEM | \ BASE_MEM_COHERENT_LOCAL) + +/* A mask of all currently reserved flags + */ +#define BASE_MEM_FLAGS_RESERVED \ + (BASE_MEM_RESERVED_BIT_5 | BASE_MEM_RESERVED_BIT_6 | \ + BASE_MEM_RESERVED_BIT_7 | BASE_MEM_RESERVED_BIT_8 | \ + BASE_MEM_RESERVED_BIT_19) + +/* A mask of all the flags that can be returned via the base_mem_get_flags() + * interface. + */ +#define BASE_MEM_FLAGS_QUERYABLE \ + (BASE_MEM_FLAGS_INPUT_MASK & ~(BASE_MEM_SAME_VA | \ + BASE_MEM_COHERENT_SYSTEM_REQUIRED | BASE_MEM_DONT_NEED | \ + BASE_MEM_IMPORT_SHARED | BASE_MEM_FLAGS_RESERVED)) + /** * enum base_mem_import_type - Memory types supported by @a base_mem_import * * @BASE_MEM_IMPORT_TYPE_INVALID: Invalid type - * @BASE_MEM_IMPORT_TYPE_UMP: UMP import. Handle type is ump_secure_id. * @BASE_MEM_IMPORT_TYPE_UMM: UMM import. Handle type is a file descriptor (int) * @BASE_MEM_IMPORT_TYPE_USER_BUFFER: User buffer import. Handle is a * base_mem_import_user_buffer @@ -229,7 +256,9 @@ typedef u32 base_mem_alloc_flags; */ typedef enum base_mem_import_type { BASE_MEM_IMPORT_TYPE_INVALID = 0, - BASE_MEM_IMPORT_TYPE_UMP = 1, + /** + * Import type with value 1 is deprecated. + */ BASE_MEM_IMPORT_TYPE_UMM = 2, BASE_MEM_IMPORT_TYPE_USER_BUFFER = 3 } base_mem_import_type; @@ -283,6 +312,16 @@ struct base_mem_import_user_buffer { /* Mask to detect 4GB boundary alignment */ #define BASE_MEM_MASK_4GB 0xfffff000UL +/** + * Limit on the 'extent' parameter for an allocation with the + * BASE_MEM_TILER_ALIGN_TOP flag set + * + * This is the same as the maximum limit for a Buffer Descriptor's chunk size + */ +#define BASE_MEM_TILER_ALIGN_TOP_EXTENT_MAX_PAGES_LOG2 \ + (21u - (LOCAL_PAGE_SHIFT)) +#define BASE_MEM_TILER_ALIGN_TOP_EXTENT_MAX_PAGES \ + (1ull << (BASE_MEM_TILER_ALIGN_TOP_EXTENT_MAX_PAGES_LOG2)) /* Bit mask of cookies used for for memory allocation setup */ #define KBASE_COOKIE_MASK ~1UL /* bit 0 is reserved */ @@ -397,6 +436,13 @@ struct base_mem_aliasing_info { u64 length; }; +/** + * Similar to BASE_MEM_TILER_ALIGN_TOP, memory starting from the end of the + * initial commit is aligned to 'extent' pages, where 'extent' must be a power + * of 2 and no more than BASE_MEM_TILER_ALIGN_TOP_EXTENT_MAX_PAGES + */ +#define BASE_JIT_ALLOC_MEM_TILER_ALIGN_TOP (1 << 0) + /** * struct base_jit_alloc_info - Structure which describes a JIT allocation * request. @@ -410,6 +456,18 @@ struct base_mem_aliasing_info { * @id: Unique ID provided by the caller, this is used * to pair allocation and free requests. * Zero is not a valid value. + * @bin_id: The JIT allocation bin, used in conjunction with + * @max_allocations to limit the number of each + * type of JIT allocation. + * @max_allocations: The maximum number of allocations allowed within + * the bin specified by @bin_id. Should be the same + * for all JIT allocations within the same bin. + * @flags: flags specifying the special requirements for + * the JIT allocation. + * @padding: Expansion space - should be initialised to zero + * @usage_id: A hint about which allocation should be reused. + * The kernel should attempt to use a previous + * allocation with the same usage_id */ struct base_jit_alloc_info { u64 gpu_alloc_addr; @@ -417,6 +475,11 @@ struct base_jit_alloc_info { u64 commit_pages; u64 extent; u8 id; + u8 bin_id; + u8 max_allocations; + u8 flags; + u8 padding[2]; + u16 usage_id; }; /** @@ -510,7 +573,8 @@ typedef u32 base_jd_core_req; * The first pre_dep object must be configured for the external resouces to use, * the second pre_dep object can be used to create other dependencies. * - * This bit may not be used in combination with BASE_JD_REQ_EVENT_COALESCE. + * This bit may not be used in combination with BASE_JD_REQ_EVENT_COALESCE and + * BASE_JD_REQ_SOFT_EVENT_WAIT. */ #define BASE_JD_REQ_EXTERNAL_RESOURCES ((base_jd_core_req)1 << 8) @@ -1264,9 +1328,9 @@ typedef struct base_dump_cpu_gpu_counters { * Architecture, but is <b>necessary for OpenCL's clGetDeviceInfo() function</b>. * * The GPU properties are obtained by a call to - * _mali_base_get_gpu_props(). This simply returns a pointer to a const + * base_get_gpu_props(). This simply returns a pointer to a const * base_gpu_props structure. It is constant for the life of a base - * context. Multiple calls to _mali_base_get_gpu_props() to a base context + * context. Multiple calls to base_get_gpu_props() to a base context * return the same pointer to a constant structure. This avoids cache pollution * of the common data. * @@ -1275,96 +1339,6 @@ typedef struct base_dump_cpu_gpu_counters { * base_context. * * - * @section sec_base_user_api_gpuprops_config Platform Config Compile-time Properties - * - * The Platform Config File sets up gpu properties that are specific to a - * certain platform. Properties that are 'Implementation Defined' in the - * Midgard Architecture spec are placed here. - * - * @note Reference configurations are provided for Midgard Implementations, such as - * the Mali-T600 family. The customer need not repeat this information, and can select one of - * these reference configurations. For example, VA_BITS, PA_BITS and the - * maximum number of samples per pixel might vary between Midgard Implementations, but - * \b not for platforms using the Mali-T604. This information is placed in - * the reference configuration files. - * - * The System Integrator creates the following structure: - * - platform_XYZ - * - platform_XYZ/plat - * - platform_XYZ/plat/plat_config.h - * - * They then edit plat_config.h, using the example plat_config.h files as a - * guide. - * - * At the very least, the customer must set @ref CONFIG_GPU_CORE_TYPE, and will - * receive a helpful \#error message if they do not do this correctly. This - * selects the Reference Configuration for the Midgard Implementation. The rationale - * behind this decision (against asking the customer to write \#include - * <gpus/mali_t600.h> in their plat_config.h) is as follows: - * - This mechanism 'looks' like a regular config file (such as Linux's - * .config) - * - It is difficult to get wrong in a way that will produce strange build - * errors: - * - They need not know where the mali_t600.h, other_midg_gpu.h etc. files are stored - and - * so they won't accidentally pick another file with 'mali_t600' in its name - * - When the build doesn't work, the System Integrator may think the DDK is - * doesn't work, and attempt to fix it themselves: - * - For the @ref CONFIG_GPU_CORE_TYPE mechanism, the only way to get past the - * error is to set @ref CONFIG_GPU_CORE_TYPE, and this is what the \#error tells - * you. - * - For a \#include mechanism, checks must still be made elsewhere, which the - * System Integrator may try working around by setting \#defines (such as - * VA_BITS) themselves in their plat_config.h. In the worst case, they may - * set the prevention-mechanism \#define of - * "A_CORRECT_MIDGARD_CORE_WAS_CHOSEN". - * - In this case, they would believe they are on the right track, because - * the build progresses with their fix, but with errors elsewhere. - * - * However, there is nothing to prevent the customer using \#include to organize - * their own configurations files hierarchically. - * - * The mechanism for the header file processing is as follows: - * - * @dot - digraph plat_config_mechanism { - rankdir=BT - size="6,6" - - "mali_base.h"; - "gpu/mali_gpu.h"; - - node [ shape=box ]; - { - rank = same; ordering = out; - - "gpu/mali_gpu_props.h"; - "base/midg_gpus/mali_t600.h"; - "base/midg_gpus/other_midg_gpu.h"; - } - { rank = same; "plat/plat_config.h"; } - { - rank = same; - "gpu/mali_gpu.h" [ shape=box ]; - gpu_chooser [ label="" style="invisible" width=0 height=0 fixedsize=true ]; - select_gpu [ label="Mali-T600 | Other\n(select_gpu.h)" shape=polygon,sides=4,distortion=0.25 width=3.3 height=0.99 fixedsize=true ] ; - } - node [ shape=box ]; - { rank = same; "plat/plat_config.h"; } - { rank = same; "mali_base.h"; } - - "mali_base.h" -> "gpu/mali_gpu.h" -> "gpu/mali_gpu_props.h"; - "mali_base.h" -> "plat/plat_config.h" ; - "mali_base.h" -> select_gpu ; - - "plat/plat_config.h" -> gpu_chooser [style="dotted,bold" dir=none weight=4] ; - gpu_chooser -> select_gpu [style="dotted,bold"] ; - - select_gpu -> "base/midg_gpus/mali_t600.h" ; - select_gpu -> "base/midg_gpus/other_midg_gpu.h" ; - } - @enddot - * - * * @section sec_base_user_api_gpuprops_kernel Kernel Operation * * During Base Context Create time, user-side makes a single kernel call: @@ -1403,7 +1377,7 @@ typedef struct base_dump_cpu_gpu_counters { * @{ */ -#define BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS 3 +#define BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS 4 #define BASE_MAX_COHERENT_GROUPS 16 @@ -1435,23 +1409,10 @@ struct mali_base_gpu_core_props { u16 padding; - /** - * 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. + /* The maximum GPU frequency. Reported to applications by + * clGetDeviceInfo() */ u32 gpu_freq_khz_max; - u32 gpu_freq_khz_min; /** * Size of the shader program counter, in bits. @@ -1478,6 +1439,11 @@ struct mali_base_gpu_core_props { * client will not be expecting to allocate anywhere near this value. */ u64 gpu_available_memory_size; + + /** + * The number of execution engines. + */ + u8 num_exec_engines; }; /** @@ -1508,7 +1474,10 @@ struct mali_base_gpu_thread_props { u8 max_task_queue; /* Max. tasks [1..255] which may be sent to a core before it becomes blocked. */ u8 max_thread_group_split; /* Max. allowed value [1..15] of the Thread Group Split field. */ u8 impl_tech; /* 0 = Not specified, 1 = Silicon, 2 = FPGA, 3 = SW Model/Emulation */ - u8 padding[7]; + u8 padding[3]; + u32 tls_alloc; /* Number of threads per core that TLS must + * be allocated for + */ }; /** @@ -1590,7 +1559,7 @@ struct gpu_raw_gpu_props { u64 stack_present; u32 l2_features; - u32 suspend_size; /* API 8.2+ */ + u32 core_features; u32 mem_features; u32 mmu_features; @@ -1599,7 +1568,7 @@ struct gpu_raw_gpu_props { u32 js_present; u32 js_features[GPU_MAX_JOB_SLOTS]; u32 tiler_features; - u32 texture_features[3]; + u32 texture_features[BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS]; u32 gpu_id; @@ -1613,10 +1582,12 @@ struct gpu_raw_gpu_props { * available modes as exposed in the coherency_features register. */ u32 coherency_mode; + + u32 thread_tls_alloc; }; /** - * Return structure for _mali_base_get_gpu_props(). + * Return structure for base_get_gpu_props(). * * NOTE: the raw_props member in this data structure contains the register * values from which the value of the other members are derived. The derived @@ -1624,7 +1595,7 @@ struct gpu_raw_gpu_props { * of the layout of the registers. * */ -typedef struct mali_base_gpu_props { +typedef struct base_gpu_props { struct mali_base_gpu_core_props core_props; struct mali_base_gpu_l2_cache_props l2_props; u64 unused_1; /* keep for backwards compatibility */ @@ -1648,36 +1619,40 @@ typedef struct mali_base_gpu_props { */ /** - * \enum base_context_create_flags - * * Flags to pass to ::base_context_init. * Flags can be ORed together to enable multiple things. * * These share the same space as BASEP_CONTEXT_FLAG_*, and so must * not collide with them. */ -enum base_context_create_flags { - /** No flags set */ - BASE_CONTEXT_CREATE_FLAG_NONE = 0, +typedef u32 base_context_create_flags; - /** Base context is embedded in a cctx object (flag used for CINSTR software counter macros) */ - BASE_CONTEXT_CCTX_EMBEDDED = (1u << 0), +/** No flags set */ +#define BASE_CONTEXT_CREATE_FLAG_NONE ((base_context_create_flags)0) - /** Base context is a 'System Monitor' context for Hardware counters. - * - * One important side effect of this is that job submission is disabled. */ - BASE_CONTEXT_SYSTEM_MONITOR_SUBMIT_DISABLED = (1u << 1) -}; +/** Base context is embedded in a cctx object (flag used for CINSTR + * software counter macros) + */ +#define BASE_CONTEXT_CCTX_EMBEDDED ((base_context_create_flags)1 << 0) + +/** Base context is a 'System Monitor' context for Hardware counters. + * + * One important side effect of this is that job submission is disabled. + */ +#define BASE_CONTEXT_SYSTEM_MONITOR_SUBMIT_DISABLED \ + ((base_context_create_flags)1 << 1) /** - * Bitpattern describing the ::base_context_create_flags that can be passed to base_context_init() + * Bitpattern describing the ::base_context_create_flags that can be + * passed to base_context_init() */ #define BASE_CONTEXT_CREATE_ALLOWED_FLAGS \ (((u32)BASE_CONTEXT_CCTX_EMBEDDED) | \ ((u32)BASE_CONTEXT_SYSTEM_MONITOR_SUBMIT_DISABLED)) /** - * Bitpattern describing the ::base_context_create_flags that can be passed to the kernel + * Bitpattern describing the ::base_context_create_flags that can be + * passed to the kernel */ #define BASE_CONTEXT_CREATE_KERNEL_FLAGS \ ((u32)BASE_CONTEXT_SYSTEM_MONITOR_SUBMIT_DISABLED) @@ -1766,20 +1741,6 @@ typedef struct base_jd_replay_payload { 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/drivers/gpu/arm/bifrost_for_linux/mali_base_mem_priv.h b/drivers/gpu/arm/bifrost_for_linux/mali_base_mem_priv.h index 4a98a72cc37a73..52c8a4f7d2d809 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_base_mem_priv.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_base_mem_priv.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _BASE_MEM_PRIV_H_ #define _BASE_MEM_PRIV_H_ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_base_vendor_specific_func.h b/drivers/gpu/arm/bifrost_for_linux/mali_base_vendor_specific_func.h index be454a216a3999..5e8add8838f24e 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_base_vendor_specific_func.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_base_vendor_specific_func.h @@ -7,15 +7,20 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _BASE_VENDOR_SPEC_FUNC_H_ #define _BASE_VENDOR_SPEC_FUNC_H_ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase.h index 369a2d4706fe68..35ce1b9e06a0fd 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase.h @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_H_ #define _KBASE_H_ @@ -24,14 +29,12 @@ #include <mali_kbase_debug.h> -#include <asm/page.h> - #include <linux/atomic.h> #include <linux/highmem.h> #include <linux/hrtimer.h> #include <linux/ktime.h> #include <linux/list.h> -#include <linux/mm_types.h> +#include <linux/mm.h> #include <linux/mutex.h> #include <linux/rwsem.h> #include <linux/sched.h> @@ -45,7 +48,6 @@ #include <linux/workqueue.h> #include "mali_base_kernel.h" -#include <mali_kbase_uku.h> #include <mali_kbase_linux.h> /* @@ -59,8 +61,8 @@ #include "mali_kbase_mem_lowlevel.h" #include "mali_kbase_trace_timeline.h" #include "mali_kbase_js.h" -#include "mali_kbase_mem.h" #include "mali_kbase_utility.h" +#include "mali_kbase_mem.h" #include "mali_kbase_gpu_memory_debugfs.h" #include "mali_kbase_mem_profile_debugfs.h" #include "mali_kbase_debug_job_fault.h" @@ -109,9 +111,48 @@ void kbase_release_device(struct kbase_device *kbdev); void kbase_set_profiling_control(struct kbase_device *kbdev, u32 control, u32 value); -struct kbase_context * -kbase_create_context(struct kbase_device *kbdev, bool is_compat); -void kbase_destroy_context(struct kbase_context *kctx); + +/** + * kbase_get_unmapped_area() - get an address range which is currently + * unmapped. + * @filp: File operations associated with kbase device. + * @addr: CPU mapped address (set to 0 since MAP_FIXED mapping is not allowed + * as Mali GPU driver decides about the mapping). + * @len: Length of the address range. + * @pgoff: Page offset within the GPU address space of the kbase context. + * @flags: Flags for the allocation. + * + * Finds the unmapped address range which satisfies requirements specific to + * GPU and those provided by the call parameters. + * + * 1) Requirement for allocations greater than 2MB: + * - alignment offset is set to 2MB and the alignment mask to 2MB decremented + * by 1. + * + * 2) Requirements imposed for the shader memory alignment: + * - alignment is decided by the number of GPU pc bits which can be read from + * GPU properties of the device associated with this kbase context; alignment + * offset is set to this value in bytes and the alignment mask to the offset + * decremented by 1. + * - allocations must not to be at 4GB boundaries. Such cases are indicated + * by the flag KBASE_REG_GPU_NX not being set (check the flags of the kbase + * region). 4GB boundaries can be checked against @ref BASE_MEM_MASK_4GB. + * + * 3) Requirements imposed for tiler memory alignment, cases indicated by + * the flag @ref KBASE_REG_TILER_ALIGN_TOP (check the flags of the kbase + * region): + * - alignment offset is set to the difference between the kbase region + * extent (converted from the original value in pages to bytes) and the kbase + * region initial_commit (also converted from the original value in pages to + * bytes); alignment mask is set to the kbase region extent in bytes and + * decremented by 1. + * + * Return: if successful, address of the unmapped area aligned as required; + * error code (negative) in case of failure; + */ +unsigned long kbase_get_unmapped_area(struct file *filp, + const unsigned long addr, const unsigned long len, + const unsigned long pgoff, const unsigned long flags); int kbase_jd_init(struct kbase_context *kctx); void kbase_jd_exit(struct kbase_context *kctx); @@ -213,7 +254,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 *timer); void kbasep_complete_triggered_soft_events(struct kbase_context *kctx, u64 evt); /* api used internally for register access. Contains validation and tracing */ @@ -222,10 +263,6 @@ int kbase_device_trace_buffer_install( struct kbase_context *kctx, u32 *tb, size_t size); void kbase_device_trace_buffer_uninstall(struct kbase_context *kctx); -/* api to be ported per OS, only need to do the raw register access */ -void kbase_os_reg_write(struct kbase_device *kbdev, u16 offset, u32 value); -u32 kbase_os_reg_read(struct kbase_device *kbdev, u16 offset); - void kbasep_as_do_poke(struct work_struct *work); /** Returns the name associated with a Mali exception code @@ -546,20 +583,6 @@ void kbasep_trace_clear(struct kbase_device *kbdev); /** PRIVATE - do not use directly. Use KBASE_TRACE_DUMP() instead */ void kbasep_trace_dump(struct kbase_device *kbdev); -#ifdef CONFIG_MALI_BIFROST_DEBUG -/** - * kbase_set_driver_inactive - Force driver to go inactive - * @kbdev: Device pointer - * @inactive: true if driver should go inactive, false otherwise - * - * Forcing the driver inactive will cause all future IOCTLs to wait until the - * driver is made active again. This is intended solely for the use of tests - * which require that no jobs are running while the test executes. - */ -void kbase_set_driver_inactive(struct kbase_device *kbdev, bool inactive); -#endif /* CONFIG_MALI_BIFROST_DEBUG */ - - #if defined(CONFIG_DEBUG_FS) && !defined(CONFIG_MALI_BIFROST_NO_MALI) /* kbase_io_history_init - initialize data struct for register access history diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_10969_workaround.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_10969_workaround.c index 6b3559d933510b..f3e71d1a40d08f 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_10969_workaround.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_10969_workaround.c @@ -1,28 +1,28 @@ /* * - * (C) COPYRIGHT 2013-2015,2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2013-2015,2017-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <linux/dma-mapping.h> #include <mali_kbase.h> #include <mali_kbase_10969_workaround.h> -/* This function is used to solve an HW issue with single iterator GPUs. - * If a fragment job is soft-stopped on the edge of its bounding box, can happen that the - * restart index is out of bounds and the rerun causes a tile range fault. If this happens - * we try to clamp the restart index to a correct value and rerun the job. - */ /* Mask of X and Y coordinates for the coordinates words in the descriptors*/ #define X_COORDINATE_MASK 0x00000FFF #define Y_COORDINATE_MASK 0x0FFF0000 diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_10969_workaround.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_10969_workaround.h index 099a29861672e6..379a05a1a12807 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_10969_workaround.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_10969_workaround.h @@ -1,23 +1,37 @@ /* * - * (C) COPYRIGHT 2013-2014 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2013-2014, 2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_10969_WORKAROUND_ #define _KBASE_10969_WORKAROUND_ +/** + * kbasep_10969_workaround_clamp_coordinates - Apply the WA to clamp the restart indices + * @katom: atom representing the fragment job for which the WA has to be applied + * + * This workaround is used to solve an HW issue with single iterator GPUs. + * If a fragment job is soft-stopped on the edge of its bounding box, it can happen + * that the restart index is out of bounds and the rerun causes a tile range + * fault. If this happens we try to clamp the restart index to a correct value. + */ int kbasep_10969_workaround_clamp_coordinates(struct kbase_jd_atom *katom); #endif /* _KBASE_10969_WORKAROUND_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_as_fault_debugfs.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_as_fault_debugfs.c index cc729d4168586c..44aa237a74971f 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_as_fault_debugfs.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_as_fault_debugfs.c @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2016 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2016-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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <linux/debugfs.h> #include <mali_kbase.h> @@ -36,13 +41,14 @@ static int kbase_as_fault_read(struct seq_file *sfile, void *data) list_for_each(entry, kbdev_list) { kbdev = list_entry(entry, struct kbase_device, entry); - if(kbdev->debugfs_as_read_bitmap & (1ULL << as_no)) { + if (kbdev->debugfs_as_read_bitmap & (1ULL << as_no)) { /* don't show this one again until another fault occors */ kbdev->debugfs_as_read_bitmap &= ~(1ULL << as_no); /* output the last page fault addr */ - seq_printf(sfile, "%llu\n", (u64) kbdev->as[as_no].fault_addr); + seq_printf(sfile, "%llu\n", + (u64) kbdev->as[as_no].fault_addr); } } @@ -54,7 +60,7 @@ static int kbase_as_fault_read(struct seq_file *sfile, void *data) static int kbase_as_fault_debugfs_open(struct inode *in, struct file *file) { - return single_open(file, kbase_as_fault_read , in->i_private); + return single_open(file, kbase_as_fault_read, in->i_private); } static const struct file_operations as_fault_fops = { @@ -84,17 +90,20 @@ void kbase_as_fault_debugfs_init(struct kbase_device *kbdev) KBASE_DEBUG_ASSERT(sizeof(kbdev->as[0].fault_addr) == sizeof(u64)); debugfs_directory = debugfs_create_dir("address_spaces", - kbdev->mali_debugfs_directory); + kbdev->mali_debugfs_directory); - if(debugfs_directory) { - for(i = 0; i < kbdev->nr_hw_address_spaces; i++) { + if (debugfs_directory) { + for (i = 0; i < kbdev->nr_hw_address_spaces; i++) { snprintf(as_name, ARRAY_SIZE(as_name), "as%u", i); debugfs_create_file(as_name, S_IRUGO, - debugfs_directory, (void*) ((uintptr_t) i), &as_fault_fops); + debugfs_directory, + (void *)(uintptr_t)i, + &as_fault_fops); } + } else { + dev_warn(kbdev->dev, + "unable to create address_spaces debugfs directory"); } - else - dev_warn(kbdev->dev, "unable to create address_spaces debugfs directory"); #endif /* CONFIG_MALI_BIFROST_DEBUG */ #endif /* CONFIG_DEBUG_FS */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_as_fault_debugfs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_as_fault_debugfs.h index 66387e1c3f6aed..58d7fcf030a460 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_as_fault_debugfs.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_as_fault_debugfs.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_AS_FAULT_DEBUG_FS_H #define _KBASE_AS_FAULT_DEBUG_FS_H diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_cache_policy.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_cache_policy.c index 1d11de67aa8058..18444b8a9c6355 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_cache_policy.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_cache_policy.c @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Cache Policy API. */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_cache_policy.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_cache_policy.h index 0c18bdb357b0a6..8a1e5291bf5f1c 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_cache_policy.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_cache_policy.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Cache Policy API. */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config.c index fb615ae02ead96..ce7070d1d634c3 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config.c @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2011-2015 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2011-2015,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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> #include <mali_kbase_defs.h> #include <mali_kbase_config_defaults.h> @@ -41,11 +46,3 @@ void kbasep_platform_device_term(struct kbase_device *kbdev) platform_funcs_p->platform_term_func(kbdev); } -int kbase_cpuprops_get_default_clock_speed(u32 * const clock_speed) -{ - KBASE_DEBUG_ASSERT(NULL != clock_speed); - - *clock_speed = 100; - return 0; -} - diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config.h index 212e3b14d96c81..1637fcbc4d297f 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_config.h * Configuration API and Attributes for KBase @@ -25,10 +30,10 @@ #ifndef _KBASE_CONFIG_H_ #define _KBASE_CONFIG_H_ -#include <asm/page.h> - +#include <linux/mm.h> #include <mali_malisw.h> #include <mali_kbase_backend_config.h> +#include <linux/rbtree.h> /** * @addtogroup base_api @@ -45,8 +50,6 @@ * @{ */ -#include <linux/rbtree.h> - /* Forward declaration of struct kbase_device */ struct kbase_device; @@ -208,41 +211,6 @@ struct kbase_pm_callback_conf { int (*power_runtime_idle_callback)(struct kbase_device *kbdev); }; -/** - * kbase_cpuprops_get_default_clock_speed - default for CPU_SPEED_FUNC - * @clock_speed - see kbase_cpu_clk_speed_func for details on the parameters - * - * Returns 0 on success, negative error code otherwise. - * - * Default implementation of CPU_SPEED_FUNC. This function sets clock_speed - * to 100, so will be an underestimate for any real system. - */ -int kbase_cpuprops_get_default_clock_speed(u32 * const clock_speed); - -/** - * kbase_cpu_clk_speed_func - Type of the function pointer for CPU_SPEED_FUNC - * @param clock_speed - pointer to store the current CPU clock speed in MHz - * - * Returns 0 on success, otherwise negative error code. - * - * This is mainly used to implement OpenCL's clGetDeviceInfo(). - */ -typedef int (*kbase_cpu_clk_speed_func) (u32 *clock_speed); - -/** - * kbase_gpu_clk_speed_func - Type of the function pointer for GPU_SPEED_FUNC - * @param clock_speed - pointer to store the current GPU clock speed in MHz - * - * Returns 0 on success, otherwise negative error code. - * When an error is returned the caller assumes maximum GPU speed stored in - * gpu_freq_khz_max. - * - * If the system timer is not available then this function is required - * for the OpenCL queue profiling to return correct timing information. - * - */ -typedef int (*kbase_gpu_clk_speed_func) (u32 *clock_speed); - #ifdef CONFIG_OF struct kbase_platform_config { }; @@ -304,18 +272,6 @@ int kbasep_platform_device_init(struct kbase_device *kbdev); */ void kbasep_platform_device_term(struct kbase_device *kbdev); - -/** - * kbase_platform_early_init - Early initialisation of the platform code - * - * This function will be called when the module is loaded to perform any - * early initialisation required by the platform code. Such as reading - * platform specific device tree entries for the GPU. - * - * Return: 0 for success, any other fail causes module initialisation to fail - */ -int kbase_platform_early_init(void); - #ifndef CONFIG_OF /** * kbase_platform_register - Register a platform device for the GPU diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config_defaults.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config_defaults.h index 69079e7d9680fc..9d918a804b2fba 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config_defaults.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config_defaults.h @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2013-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2013-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_config_defaults.h * @@ -74,6 +79,35 @@ enum { KBASE_AID_4 = 0x1 }; +enum { + /** + * Use unrestricted Address ID width on the AXI bus. + * Restricting ID width will reduce performance & bus load due to GPU. + */ + KBASE_3BIT_AID_32 = 0x0, + + /* Restrict GPU to 7/8 of maximum Address ID count. */ + KBASE_3BIT_AID_28 = 0x1, + + /* Restrict GPU to 3/4 of maximum Address ID count. */ + KBASE_3BIT_AID_24 = 0x2, + + /* Restrict GPU to 5/8 of maximum Address ID count. */ + KBASE_3BIT_AID_20 = 0x3, + + /* Restrict GPU to 1/2 of maximum Address ID count. */ + KBASE_3BIT_AID_16 = 0x4, + + /* Restrict GPU to 3/8 of maximum Address ID count. */ + KBASE_3BIT_AID_12 = 0x5, + + /* Restrict GPU to 1/4 of maximum Address ID count. */ + KBASE_3BIT_AID_8 = 0x6, + + /* Restrict GPU to 1/8 of maximum Address ID count. */ + KBASE_3BIT_AID_4 = 0x7 +}; + /** * Default setting for read Address ID limiting on AXI bus. * @@ -101,17 +135,27 @@ enum { #define DEFAULT_AWID_LIMIT KBASE_AID_32 /** - * Default UMP device mapping. A UMP_DEVICE_<device>_SHIFT value which - * defines which UMP device this GPU should be mapped to. + * Default setting for read Address ID limiting on AXI bus. + * + * Default value: KBASE_3BIT_AID_32 (no limit). Note hardware implementation + * may limit to a lower value. */ -#define DEFAULT_UMP_GPU_DEVICE_SHIFT UMP_DEVICE_Z_SHIFT +#define DEFAULT_3BIT_ARID_LIMIT KBASE_3BIT_AID_32 -/* +/** + * Default setting for write Address ID limiting on AXI. + * + * Default value: KBASE_3BIT_AID_32 (no limit). Note hardware implementation + * may limit to a lower value. + */ +#define DEFAULT_3BIT_AWID_LIMIT KBASE_3BIT_AID_32 + +/** * Default period for DVFS sampling */ #define DEFAULT_PM_DVFS_PERIOD 100 /* 100ms */ -/* +/** * Power Management poweroff tick granuality. This is in nanoseconds to * allow HR timer support. * @@ -121,22 +165,22 @@ enum { */ #define DEFAULT_PM_GPU_POWEROFF_TICK_NS (400000) /* 400us */ -/* +/** * Power Manager number of ticks before shader cores are powered off */ #define DEFAULT_PM_POWEROFF_TICK_SHADER (2) /* 400-800us */ -/* +/** * Power Manager number of ticks before GPU is powered off */ #define DEFAULT_PM_POWEROFF_TICK_GPU (2) /* 400-800us */ -/* +/** * Default scheduling tick granuality */ #define DEFAULT_JS_SCHEDULING_PERIOD_NS (100000000u) /* 100ms */ -/* +/** * Default minimum number of scheduling ticks before jobs are soft-stopped. * * This defines the time-slice for a job (which may be different from that of a @@ -144,60 +188,60 @@ enum { */ #define DEFAULT_JS_SOFT_STOP_TICKS (1) /* 100ms-200ms */ -/* +/** * Default minimum number of scheduling ticks before CL jobs are soft-stopped. */ #define DEFAULT_JS_SOFT_STOP_TICKS_CL (1) /* 100ms-200ms */ -/* +/** * Default minimum number of scheduling ticks before jobs are hard-stopped */ #define DEFAULT_JS_HARD_STOP_TICKS_SS (50) /* 5s */ #define DEFAULT_JS_HARD_STOP_TICKS_SS_8408 (300) /* 30s */ -/* +/** * Default minimum number of scheduling ticks before CL jobs are hard-stopped. */ #define DEFAULT_JS_HARD_STOP_TICKS_CL (50) /* 5s */ -/* +/** * Default minimum number of scheduling ticks before jobs are hard-stopped * during dumping */ #define DEFAULT_JS_HARD_STOP_TICKS_DUMPING (15000) /* 1500s */ -/* +/** * Default timeout for some software jobs, after which the software event wait * jobs will be cancelled. */ #define DEFAULT_JS_SOFT_JOB_TIMEOUT (3000) /* 3s */ -/* +/** * Default minimum number of scheduling ticks before the GPU is reset to clear a * "stuck" job */ #define DEFAULT_JS_RESET_TICKS_SS (55) /* 5.5s */ #define DEFAULT_JS_RESET_TICKS_SS_8408 (450) /* 45s */ -/* +/** * Default minimum number of scheduling ticks before the GPU is reset to clear a * "stuck" CL job. */ #define DEFAULT_JS_RESET_TICKS_CL (55) /* 5.5s */ -/* +/** * Default minimum number of scheduling ticks before the GPU is reset to clear a * "stuck" job during dumping. */ #define DEFAULT_JS_RESET_TICKS_DUMPING (15020) /* 1502s */ -/* +/** * Default number of milliseconds given for other jobs on the GPU to be * soft-stopped when the GPU needs to be reset. */ #define DEFAULT_RESET_TIMEOUT_MS (3000) /* 3s */ -/* +/** * Default timeslice that a context is scheduled in for, in nanoseconds. * * When a context has used up this amount of time across its jobs, it is @@ -208,7 +252,7 @@ enum { */ #define DEFAULT_JS_CTX_TIMESLICE_NS (50000000) /* 50ms */ -/* +/** * Perform GPU power down using only platform specific code, skipping DDK power * management. * @@ -222,5 +266,13 @@ enum { */ #define PLATFORM_POWER_DOWN_ONLY (0) +/** + * Maximum frequency (in kHz) that the GPU can be clocked. For some platforms + * this isn't available, so we simply define a dummy value here. If devfreq + * is enabled the value will be read from there, otherwise this should be + * overridden by defining GPU_FREQ_KHZ_MAX in the platform file. + */ +#define DEFAULT_GPU_FREQ_KHZ_MAX (5000) + #endif /* _KBASE_CONFIG_DEFAULTS_H_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_context.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_context.c index 17821fee6cbaf1..e9de7239b1e110 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_context.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_context.c @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Base kernel context APIs */ @@ -27,15 +32,6 @@ #include <mali_kbase_dma_fence.h> #include <mali_kbase_ctx_sched.h> -/** - * kbase_create_context() - Create a kernel base context. - * @kbdev: Kbase device - * @is_compat: Force creation of a 32-bit context - * - * Allocate and init a kernel base context. - * - * Return: new kbase context - */ struct kbase_context * kbase_create_context(struct kbase_device *kbdev, bool is_compat) { @@ -59,6 +55,11 @@ kbase_create_context(struct kbase_device *kbdev, bool is_compat) atomic_set(&kctx->refcount, 0); if (is_compat) kbase_ctx_flag_set(kctx, KCTX_COMPAT); +#if defined(CONFIG_64BIT) + else + kbase_ctx_flag_set(kctx, KCTX_FORCE_SAME_VA); +#endif /* !defined(CONFIG_64BIT) */ + #ifdef CONFIG_MALI_BIFROST_TRACE_TIMELINE kctx->timeline.owner_tgid = task_tgid_nr(current); #endif @@ -114,9 +115,6 @@ kbase_create_context(struct kbase_device *kbdev, bool is_compat) INIT_LIST_HEAD(&kctx->waiting_soft_jobs); spin_lock_init(&kctx->waiting_soft_jobs_lock); -#ifdef CONFIG_KDS - INIT_LIST_HEAD(&kctx->waiting_kds_resource); -#endif err = kbase_dma_fence_init(kctx); if (err) goto free_event; @@ -168,9 +166,8 @@ kbase_create_context(struct kbase_device *kbdev, bool is_compat) mutex_init(&kctx->vinstr_cli_lock); - setup_timer(&kctx->soft_job_timeout, - kbasep_soft_job_timeout_worker, - (uintptr_t)kctx); + kbase_timer_setup(&kctx->soft_job_timeout, + kbasep_soft_job_timeout_worker); return kctx; @@ -218,13 +215,6 @@ static void kbase_reg_pending_dtor(struct kbase_va_region *reg) kfree(reg); } -/** - * kbase_destroy_context - Destroy a kernel base context. - * @kctx: Context to destroy - * - * Calls kbase_destroy_os_context() to free OS specific structures. - * Will release all outstanding regions. - */ void kbase_destroy_context(struct kbase_context *kctx) { struct kbase_device *kbdev; @@ -245,6 +235,8 @@ void kbase_destroy_context(struct kbase_context *kctx) * thread. */ kbase_pm_context_active(kbdev); + kbase_mem_pool_mark_dying(&kctx->mem_pool); + kbase_jd_zap_context(kctx); #ifdef CONFIG_DEBUG_FS @@ -296,8 +288,6 @@ void kbase_destroy_context(struct kbase_context *kctx) kbase_jd_exit(kctx); - kbase_pm_context_idle(kbdev); - kbase_dma_fence_term(kctx); mutex_lock(&kbdev->mmu_hw_mutex); @@ -318,16 +308,11 @@ void kbase_destroy_context(struct kbase_context *kctx) WARN_ON(atomic_read(&kctx->nonmapped_pages) != 0); vfree(kctx); + + kbase_pm_context_idle(kbdev); } KBASE_EXPORT_SYMBOL(kbase_destroy_context); -/** - * kbase_context_set_create_flags - Set creation flags on a context - * @kctx: Kbase context - * @flags: Flags to set - * - * Return: 0 on success - */ int kbase_context_set_create_flags(struct kbase_context *kctx, u32 flags) { int err = 0; diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_context.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_context.h index a3f5bb0ce0da38..30b0f649806bbe 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_context.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_context.h @@ -1,26 +1,59 @@ /* * - * (C) COPYRIGHT 2011-2016 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2011-2016, 2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_CONTEXT_H_ #define _KBASE_CONTEXT_H_ #include <linux/atomic.h> +/** + * kbase_create_context() - Create a kernel base context. + * @kbdev: Kbase device + * @is_compat: Force creation of a 32-bit context + * + * Allocate and init a kernel base context. + * + * Return: new kbase context + */ +struct kbase_context * +kbase_create_context(struct kbase_device *kbdev, bool is_compat); +/** + * kbase_destroy_context - Destroy a kernel base context. + * @kctx: Context to destroy + * + * Calls kbase_destroy_os_context() to free OS specific structures. + * Will release all outstanding regions. + */ +void kbase_destroy_context(struct kbase_context *kctx); + +/** + * kbase_context_set_create_flags - Set creation flags on a context + * @kctx: Kbase context + * @flags: Flags to set, which shall be one of the flags of + * BASE_CONTEXT_CREATE_KERNEL_FLAGS. + * + * Return: 0 on success, -EINVAL otherwise when an invalid flag is specified. + */ int kbase_context_set_create_flags(struct kbase_context *kctx, u32 flags); /** diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_core_linux.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_core_linux.c index b15fc1f2b8d198..0a744c35ae1df9 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_core_linux.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_core_linux.c @@ -1,23 +1,27 @@ /* * - * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> #include <mali_kbase_config_defaults.h> -#include <mali_kbase_uku.h> #include <mali_midg_regmap.h> #include <mali_kbase_gator.h> #include <mali_kbase_mem_linux.h> @@ -30,6 +34,7 @@ #endif /* CONFIG_MALI_BIFROST_DEVFREQ */ #ifdef CONFIG_MALI_BIFROST_NO_MALI #include "mali_kbase_model_linux.h" +#include <backend/gpu/mali_kbase_model_dummy.h> #endif /* CONFIG_MALI_BIFROST_NO_MALI */ #include "mali_kbase_mem_profile_debugfs_buf_size.h" #include "mali_kbase_debug_mem_view.h" @@ -45,6 +50,10 @@ #include <backend/gpu/mali_kbase_device_internal.h> #include "mali_kbase_ioctl.h" +#ifdef CONFIG_MALI_JOB_DUMP +#include "mali_kbase_gwt.h" +#endif + #include <linux/module.h> #include <linux/init.h> #include <linux/poll.h> @@ -60,22 +69,23 @@ #include <linux/uaccess.h> #include <linux/interrupt.h> #include <linux/mm.h> -#include <linux/compat.h> /* is_compat_task */ +#include <linux/compat.h> /* is_compat_task/in_compat_syscall */ #include <linux/mman.h> #include <linux/version.h> #include <mali_kbase_hw.h> -#include <platform/mali_kbase_platform_common.h> #if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE) #include <mali_kbase_sync.h> #endif /* CONFIG_SYNC || CONFIG_SYNC_FILE */ #include <linux/clk.h> #include <linux/delay.h> +#include <linux/log2.h> #include <mali_kbase_config.h> -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)) +#if (KERNEL_VERSION(3, 13, 0) <= LINUX_VERSION_CODE) #include <linux/pm_opp.h> +#include <soc/rockchip/rockchip_opp_select.h> #else #include <linux/opp.h> #endif @@ -89,36 +99,28 @@ #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); static LIST_HEAD(kbase_dev_list); #define KERNEL_SIDE_DDK_VERSION_STRING "K:" MALI_RELEASE_NAME "(GPL)" -static inline void __compile_time_asserts(void) -{ - CSTD_COMPILE_TIME_ASSERT(sizeof(KERNEL_SIDE_DDK_VERSION_STRING) <= KBASE_GET_VERSION_BUFFER_SIZE); -} static int kbase_api_handshake(struct kbase_context *kctx, - struct kbase_ioctl_version_check *version) + struct kbase_ioctl_version_check *version) { switch (version->major) { case BASE_UK_VERSION_MAJOR: /* set minor to be the lowest common */ version->minor = min_t(int, BASE_UK_VERSION_MINOR, - (int)version->minor); + (int)version->minor); break; default: /* We return our actual version regardless if it * matches the version returned by userspace - * userspace can bail if it can't handle this - * version */ + * version + */ version->major = BASE_UK_VERSION_MAJOR; version->minor = BASE_UK_VERSION_MINOR; break; @@ -152,7 +154,9 @@ enum mali_error { enum { inited_mem = (1u << 0), inited_js = (1u << 1), - inited_pm_runtime_init = (1u << 2), + /* Bit number 2 was earlier assigned to the runtime-pm initialization + * stage (which has been merged with the backend_early stage). + */ #ifdef CONFIG_MALI_BIFROST_DEVFREQ inited_devfreq = (1u << 3), #endif /* CONFIG_MALI_BIFROST_DEVFREQ */ @@ -177,742 +181,6 @@ enum { inited_ctx_sched = (1u << 22) }; - -#ifdef CONFIG_MALI_BIFROST_DEBUG -#define INACTIVE_WAIT_MS (5000) - -void kbase_set_driver_inactive(struct kbase_device *kbdev, bool inactive) -{ - kbdev->driver_inactive = inactive; - wake_up(&kbdev->driver_inactive_wait); - - /* Wait for any running IOCTLs to complete */ - if (inactive) - msleep(INACTIVE_WAIT_MS); -} -KBASE_EXPORT_TEST_API(kbase_set_driver_inactive); -#endif /* CONFIG_MALI_BIFROST_DEBUG */ - -/** - * 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_BIFROST_DEBUG - wait_event(kbdev->driver_inactive_wait, - kbdev->driver_inactive == false); -#endif /* CONFIG_MALI_BIFROST_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; - - 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_BIFROST_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_BIFROST_ERROR_INJECT */ - break; - } - - case KBASE_FUNC_MODEL_CONTROL: - { -#ifdef CONFIG_MALI_BIFROST_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_BIFROST_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_BIFROST_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_BIFROST_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); @@ -1065,6 +333,55 @@ static const struct file_operations kbase_infinite_cache_fops = { .read = read_ctx_infinite_cache, }; +static ssize_t write_ctx_force_same_va(struct file *f, const char __user *ubuf, + size_t size, loff_t *off) +{ + struct kbase_context *kctx = f->private_data; + int err; + bool value; + + err = kstrtobool_from_user(ubuf, size, &value); + if (err) + return err; + + if (value) { +#if defined(CONFIG_64BIT) + /* 32-bit clients cannot force SAME_VA */ + if (kbase_ctx_flag(kctx, KCTX_COMPAT)) + return -EINVAL; + kbase_ctx_flag_set(kctx, KCTX_FORCE_SAME_VA); +#else /* defined(CONFIG_64BIT) */ + /* 32-bit clients cannot force SAME_VA */ + return -EINVAL; +#endif /* defined(CONFIG_64BIT) */ + } else { + kbase_ctx_flag_clear(kctx, KCTX_FORCE_SAME_VA); + } + + return size; +} + +static ssize_t read_ctx_force_same_va(struct file *f, char __user *ubuf, + size_t size, loff_t *off) +{ + struct kbase_context *kctx = f->private_data; + char buf[32]; + int count; + bool value; + + value = kbase_ctx_flag(kctx, KCTX_FORCE_SAME_VA); + + count = scnprintf(buf, sizeof(buf), "%s\n", value ? "Y" : "N"); + + return simple_read_from_buffer(ubuf, size, off, buf, count); +} + +static const struct file_operations kbase_force_same_va_fops = { + .open = simple_open, + .write = write_ctx_force_same_va, + .read = read_ctx_force_same_va, +}; + static int kbase_open(struct inode *inode, struct file *filp) { struct kbase_device *kbdev = NULL; @@ -1079,7 +396,11 @@ static int kbase_open(struct inode *inode, struct file *filp) if (!kbdev) return -ENODEV; +#if (KERNEL_VERSION(4, 6, 0) <= LINUX_VERSION_CODE) + kctx = kbase_create_context(kbdev, in_compat_syscall()); +#else kctx = kbase_create_context(kbdev, is_compat_task()); +#endif /* (KERNEL_VERSION(4, 6, 0) <= LINUX_VERSION_CODE) */ if (!kctx) { ret = -ENOMEM; goto out; @@ -1104,7 +425,9 @@ static int kbase_open(struct inode *inode, struct file *filp) } debugfs_create_file("infinite_cache", 0644, kctx->kctx_dentry, - kctx, &kbase_infinite_cache_fops); + kctx, &kbase_infinite_cache_fops); + debugfs_create_file("force_same_va", S_IRUSR | S_IWUSR, + kctx->kctx_dentry, kctx, &kbase_force_same_va_fops); mutex_init(&kctx->mem_profile_lock); @@ -1177,11 +500,11 @@ static int kbase_release(struct inode *inode, struct file *filp) /* If this client was performing hwcnt dumping and did not explicitly * detach itself, remove it from the vinstr core now */ if (kctx->vinstr_cli) { - struct kbase_uk_hwcnt_setup setup; + struct kbase_ioctl_hwcnt_enable enable; - setup.dump_buffer = 0llu; + enable.dump_buffer = 0llu; kbase_vinstr_legacy_hwc_setup( - kbdev->vinstr_ctx, &kctx->vinstr_cli, &setup); + kbdev->vinstr_ctx, &kctx->vinstr_cli, &enable); } mutex_unlock(&kctx->vinstr_cli_lock); @@ -1192,33 +515,6 @@ static int kbase_release(struct inode *inode, struct file *filp) 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) { @@ -1284,12 +580,11 @@ static int kbase_api_mem_alloc(struct kbase_context *kctx, u64 flags = alloc->in.flags; u64 gpu_va; -#if defined(CONFIG_64BIT) - if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) { + if ((!kbase_ctx_flag(kctx, KCTX_COMPAT)) && + kbase_ctx_flag(kctx, KCTX_FORCE_SAME_VA)) { /* force SAME_VA if a 64-bit client */ flags |= BASE_MEM_SAME_VA; } -#endif reg = kbase_mem_alloc(kctx, alloc->in.va_pages, alloc->in.commit_pages, @@ -1322,38 +617,22 @@ static int kbase_api_hwcnt_reader_setup(struct kbase_context *kctx, struct kbase_ioctl_hwcnt_reader_setup *setup) { int ret; - struct kbase_uk_hwcnt_reader_setup args = { - .buffer_count = setup->buffer_count, - .jm_bm = setup->jm_bm, - .shader_bm = setup->shader_bm, - .tiler_bm = setup->tiler_bm, - .mmu_l2_bm = setup->mmu_l2_bm - }; mutex_lock(&kctx->vinstr_cli_lock); - ret = kbase_vinstr_hwcnt_reader_setup(kctx->kbdev->vinstr_ctx, &args); + ret = kbase_vinstr_hwcnt_reader_setup(kctx->kbdev->vinstr_ctx, setup); mutex_unlock(&kctx->vinstr_cli_lock); - if (ret) - return ret; - return args.fd; + return ret; } static int kbase_api_hwcnt_enable(struct kbase_context *kctx, struct kbase_ioctl_hwcnt_enable *enable) { int ret; - struct kbase_uk_hwcnt_setup args = { - .dump_buffer = enable->dump_buffer, - .jm_bm = enable->jm_bm, - .shader_bm = enable->shader_bm, - .tiler_bm = enable->tiler_bm, - .mmu_l2_bm = enable->mmu_l2_bm - }; mutex_lock(&kctx->vinstr_cli_lock); ret = kbase_vinstr_legacy_hwc_setup(kctx->kbdev->vinstr_ctx, - &kctx->vinstr_cli, &args); + &kctx->vinstr_cli, enable); mutex_unlock(&kctx->vinstr_cli_lock); return ret; @@ -1382,6 +661,18 @@ static int kbase_api_hwcnt_clear(struct kbase_context *kctx) return ret; } +#ifdef CONFIG_MALI_BIFROST_NO_MALI +static int kbase_api_hwcnt_set(struct kbase_context *kctx, + struct kbase_ioctl_hwcnt_values *values) +{ + gpu_model_set_dummy_prfcnt_sample( + (u32 __user *)(uintptr_t)values->data, + values->size); + + return 0; +} +#endif + static int kbase_api_disjoint_query(struct kbase_context *kctx, struct kbase_ioctl_disjoint_query *query) { @@ -1412,10 +703,37 @@ static int kbase_api_get_ddk_version(struct kbase_context *kctx, return len; } +/* Defaults for legacy JIT init ioctl */ +#define DEFAULT_MAX_JIT_ALLOCATIONS 255 +#define JIT_LEGACY_TRIM_LEVEL (0) /* No trimming */ + +static int kbase_api_mem_jit_init_old(struct kbase_context *kctx, + struct kbase_ioctl_mem_jit_init_old *jit_init) +{ + kctx->jit_version = 1; + + return kbase_region_tracker_init_jit(kctx, jit_init->va_pages, + DEFAULT_MAX_JIT_ALLOCATIONS, + JIT_LEGACY_TRIM_LEVEL); +} + static int kbase_api_mem_jit_init(struct kbase_context *kctx, struct kbase_ioctl_mem_jit_init *jit_init) { - return kbase_region_tracker_init_jit(kctx, jit_init->va_pages); + int i; + + kctx->jit_version = 2; + + for (i = 0; i < sizeof(jit_init->padding); i++) { + /* Ensure all padding bytes are 0 for potential future + * extension + */ + if (jit_init->padding[i]) + return -EINVAL; + } + + return kbase_region_tracker_init_jit(kctx, jit_init->va_pages, + jit_init->max_allocations, jit_init->trim_level); } static int kbase_api_mem_sync(struct kbase_context *kctx, @@ -1441,6 +759,17 @@ static int kbase_api_mem_find_cpu_offset(struct kbase_context *kctx, &find->out.offset); } +static int kbase_api_mem_find_gpu_start_and_offset(struct kbase_context *kctx, + union kbase_ioctl_mem_find_gpu_start_and_offset *find) +{ + return kbasep_find_enclosing_gpu_mapping_start_and_offset( + kctx, + find->in.gpu_addr, + find->in.size, + &find->out.start, + &find->out.offset); +} + static int kbase_api_get_context_id(struct kbase_context *kctx, struct kbase_ioctl_get_context_id *info) { @@ -1478,6 +807,9 @@ static int kbase_api_mem_alias(struct kbase_context *kctx, if (alias->in.nents == 0 || alias->in.nents > 2048) return -EINVAL; + if (alias->in.stride > (U64_MAX / 2048)) + return -EINVAL; + ai = vmalloc(sizeof(*ai) * alias->in.nents); if (!ai) return -ENOMEM; @@ -1616,6 +948,74 @@ static int kbase_api_soft_event_update(struct kbase_context *kctx, return kbase_soft_event_update(kctx, update->event, update->new_status); } +static int kbase_api_sticky_resource_map(struct kbase_context *kctx, + struct kbase_ioctl_sticky_resource_map *map) +{ + int ret; + u64 i; + u64 gpu_addr[BASE_EXT_RES_COUNT_MAX]; + + if (!map->count || map->count > BASE_EXT_RES_COUNT_MAX) + return -EOVERFLOW; + + ret = copy_from_user(gpu_addr, u64_to_user_ptr(map->address), + sizeof(u64) * map->count); + + if (ret != 0) + return -EFAULT; + + kbase_gpu_vm_lock(kctx); + + for (i = 0; i < map->count; i++) { + if (!kbase_sticky_resource_acquire(kctx, gpu_addr[i])) { + /* Invalid resource */ + ret = -EINVAL; + break; + } + } + + if (ret != 0) { + while (i > 0) { + i--; + kbase_sticky_resource_release(kctx, NULL, gpu_addr[i]); + } + } + + kbase_gpu_vm_unlock(kctx); + + return ret; +} + +static int kbase_api_sticky_resource_unmap(struct kbase_context *kctx, + struct kbase_ioctl_sticky_resource_unmap *unmap) +{ + int ret; + u64 i; + u64 gpu_addr[BASE_EXT_RES_COUNT_MAX]; + + if (!unmap->count || unmap->count > BASE_EXT_RES_COUNT_MAX) + return -EOVERFLOW; + + ret = copy_from_user(gpu_addr, u64_to_user_ptr(unmap->address), + sizeof(u64) * unmap->count); + + if (ret != 0) + return -EFAULT; + + kbase_gpu_vm_lock(kctx); + + for (i = 0; i < unmap->count; i++) { + if (!kbase_sticky_resource_release(kctx, NULL, gpu_addr[i])) { + /* Invalid resource, but we keep going anyway */ + ret = -EINVAL; + } + } + + kbase_gpu_vm_unlock(kctx); + + return ret; +} + #if MALI_UNIT_TEST static int kbase_api_tlstream_test(struct kbase_context *kctx, struct kbase_ioctl_tlstream_test *test) @@ -1641,14 +1041,12 @@ static int kbase_api_tlstream_stats(struct kbase_context *kctx, #endif /* MALI_UNIT_TEST */ #define KBASE_HANDLE_IOCTL(cmd, function) \ - case cmd: \ do { \ BUILD_BUG_ON(_IOC_DIR(cmd) != _IOC_NONE); \ return function(kctx); \ } while (0) #define KBASE_HANDLE_IOCTL_IN(cmd, function, type) \ - case cmd: \ do { \ type param; \ int err; \ @@ -1661,7 +1059,6 @@ static int kbase_api_tlstream_stats(struct kbase_context *kctx, } while (0) #define KBASE_HANDLE_IOCTL_OUT(cmd, function, type) \ - case cmd: \ do { \ type param; \ int ret, err; \ @@ -1675,7 +1072,6 @@ static int kbase_api_tlstream_stats(struct kbase_context *kctx, } while (0) #define KBASE_HANDLE_IOCTL_INOUT(cmd, function, type) \ - case cmd: \ do { \ type param; \ int ret, err; \ @@ -1697,28 +1093,19 @@ static long kbase_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 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) { + case KBASE_IOCTL_VERSION_CHECK: KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_VERSION_CHECK, kbase_api_handshake, struct kbase_ioctl_version_check); + break; + + case KBASE_IOCTL_SET_FLAGS: KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_SET_FLAGS, kbase_api_set_flags, struct kbase_ioctl_set_flags); + break; } /* Block call until version handshake and setup is complete */ @@ -1727,91 +1114,192 @@ static long kbase_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) /* Normal ioctls */ switch (cmd) { + case KBASE_IOCTL_JOB_SUBMIT: KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_JOB_SUBMIT, kbase_api_job_submit, struct kbase_ioctl_job_submit); + break; + case KBASE_IOCTL_GET_GPUPROPS: KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_GET_GPUPROPS, kbase_api_get_gpuprops, struct kbase_ioctl_get_gpuprops); + break; + case KBASE_IOCTL_POST_TERM: KBASE_HANDLE_IOCTL(KBASE_IOCTL_POST_TERM, kbase_api_post_term); + break; + case KBASE_IOCTL_MEM_ALLOC: KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_MEM_ALLOC, kbase_api_mem_alloc, union kbase_ioctl_mem_alloc); + break; + case KBASE_IOCTL_MEM_QUERY: KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_MEM_QUERY, kbase_api_mem_query, union kbase_ioctl_mem_query); + break; + case KBASE_IOCTL_MEM_FREE: KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_MEM_FREE, kbase_api_mem_free, struct kbase_ioctl_mem_free); - KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_HWCNT_READER_SETUP, - kbase_api_hwcnt_reader_setup, - struct kbase_ioctl_hwcnt_reader_setup); - KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_HWCNT_ENABLE, - kbase_api_hwcnt_enable, - struct kbase_ioctl_hwcnt_enable); - KBASE_HANDLE_IOCTL(KBASE_IOCTL_HWCNT_DUMP, - kbase_api_hwcnt_dump); - KBASE_HANDLE_IOCTL(KBASE_IOCTL_HWCNT_CLEAR, - kbase_api_hwcnt_clear); + break; + case KBASE_IOCTL_DISJOINT_QUERY: KBASE_HANDLE_IOCTL_OUT(KBASE_IOCTL_DISJOINT_QUERY, kbase_api_disjoint_query, struct kbase_ioctl_disjoint_query); + break; + case KBASE_IOCTL_GET_DDK_VERSION: KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_GET_DDK_VERSION, kbase_api_get_ddk_version, struct kbase_ioctl_get_ddk_version); + break; + case KBASE_IOCTL_MEM_JIT_INIT_OLD: + KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_MEM_JIT_INIT_OLD, + kbase_api_mem_jit_init_old, + struct kbase_ioctl_mem_jit_init_old); + break; + case KBASE_IOCTL_MEM_JIT_INIT: KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_MEM_JIT_INIT, kbase_api_mem_jit_init, struct kbase_ioctl_mem_jit_init); + break; + case KBASE_IOCTL_MEM_SYNC: KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_MEM_SYNC, kbase_api_mem_sync, struct kbase_ioctl_mem_sync); + break; + case KBASE_IOCTL_MEM_FIND_CPU_OFFSET: KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_MEM_FIND_CPU_OFFSET, kbase_api_mem_find_cpu_offset, union kbase_ioctl_mem_find_cpu_offset); + break; + case KBASE_IOCTL_MEM_FIND_GPU_START_AND_OFFSET: + KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_MEM_FIND_GPU_START_AND_OFFSET, + kbase_api_mem_find_gpu_start_and_offset, + union kbase_ioctl_mem_find_gpu_start_and_offset); + break; + case KBASE_IOCTL_GET_CONTEXT_ID: KBASE_HANDLE_IOCTL_OUT(KBASE_IOCTL_GET_CONTEXT_ID, kbase_api_get_context_id, struct kbase_ioctl_get_context_id); + break; + case KBASE_IOCTL_TLSTREAM_ACQUIRE: KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_TLSTREAM_ACQUIRE, kbase_api_tlstream_acquire, struct kbase_ioctl_tlstream_acquire); + break; + case KBASE_IOCTL_TLSTREAM_FLUSH: KBASE_HANDLE_IOCTL(KBASE_IOCTL_TLSTREAM_FLUSH, kbase_api_tlstream_flush); + break; + case KBASE_IOCTL_MEM_COMMIT: KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_MEM_COMMIT, kbase_api_mem_commit, struct kbase_ioctl_mem_commit); + break; + case KBASE_IOCTL_MEM_ALIAS: KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_MEM_ALIAS, kbase_api_mem_alias, union kbase_ioctl_mem_alias); + break; + case KBASE_IOCTL_MEM_IMPORT: KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_MEM_IMPORT, kbase_api_mem_import, union kbase_ioctl_mem_import); + break; + case KBASE_IOCTL_MEM_FLAGS_CHANGE: KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_MEM_FLAGS_CHANGE, kbase_api_mem_flags_change, struct kbase_ioctl_mem_flags_change); + break; + case KBASE_IOCTL_STREAM_CREATE: KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_STREAM_CREATE, kbase_api_stream_create, struct kbase_ioctl_stream_create); + break; + case KBASE_IOCTL_FENCE_VALIDATE: KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_FENCE_VALIDATE, kbase_api_fence_validate, struct kbase_ioctl_fence_validate); + break; + case KBASE_IOCTL_GET_PROFILING_CONTROLS: KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_GET_PROFILING_CONTROLS, kbase_api_get_profiling_controls, struct kbase_ioctl_get_profiling_controls); + break; + case KBASE_IOCTL_MEM_PROFILE_ADD: KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_MEM_PROFILE_ADD, kbase_api_mem_profile_add, struct kbase_ioctl_mem_profile_add); + break; + case KBASE_IOCTL_SOFT_EVENT_UPDATE: KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_SOFT_EVENT_UPDATE, kbase_api_soft_event_update, struct kbase_ioctl_soft_event_update); + break; + case KBASE_IOCTL_STICKY_RESOURCE_MAP: + KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_STICKY_RESOURCE_MAP, + kbase_api_sticky_resource_map, + struct kbase_ioctl_sticky_resource_map); + break; + case KBASE_IOCTL_STICKY_RESOURCE_UNMAP: + KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_STICKY_RESOURCE_UNMAP, + kbase_api_sticky_resource_unmap, + struct kbase_ioctl_sticky_resource_unmap); + break; + /* Instrumentation. */ + case KBASE_IOCTL_HWCNT_READER_SETUP: + KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_HWCNT_READER_SETUP, + kbase_api_hwcnt_reader_setup, + struct kbase_ioctl_hwcnt_reader_setup); + break; + case KBASE_IOCTL_HWCNT_ENABLE: + KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_HWCNT_ENABLE, + kbase_api_hwcnt_enable, + struct kbase_ioctl_hwcnt_enable); + break; + case KBASE_IOCTL_HWCNT_DUMP: + KBASE_HANDLE_IOCTL(KBASE_IOCTL_HWCNT_DUMP, + kbase_api_hwcnt_dump); + break; + case KBASE_IOCTL_HWCNT_CLEAR: + KBASE_HANDLE_IOCTL(KBASE_IOCTL_HWCNT_CLEAR, + kbase_api_hwcnt_clear); + break; +#ifdef CONFIG_MALI_BIFROST_NO_MALI + case KBASE_IOCTL_HWCNT_SET: + KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_HWCNT_SET, + kbase_api_hwcnt_set, + struct kbase_ioctl_hwcnt_values); + break; +#endif +#ifdef CONFIG_MALI_JOB_DUMP + case KBASE_IOCTL_CINSTR_GWT_START: + KBASE_HANDLE_IOCTL(KBASE_IOCTL_CINSTR_GWT_START, + kbase_gpu_gwt_start); + break; + case KBASE_IOCTL_CINSTR_GWT_STOP: + KBASE_HANDLE_IOCTL(KBASE_IOCTL_CINSTR_GWT_STOP, + kbase_gpu_gwt_stop); + break; + case KBASE_IOCTL_CINSTR_GWT_DUMP: + KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_CINSTR_GWT_DUMP, + kbase_gpu_gwt_dump, + union kbase_ioctl_cinstr_gwt_dump); + break; +#endif #if MALI_UNIT_TEST + case KBASE_IOCTL_TLSTREAM_TEST: KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_TLSTREAM_TEST, kbase_api_tlstream_test, struct kbase_ioctl_tlstream_test); + break; + case KBASE_IOCTL_TLSTREAM_STATS: KBASE_HANDLE_IOCTL_OUT(KBASE_IOCTL_TLSTREAM_STATS, kbase_api_tlstream_stats, struct kbase_ioctl_tlstream_stats); + break; #endif } @@ -1890,242 +1378,6 @@ static int kbase_check_flags(int flags) return 0; } - -/** - * align_and_check - Align the specified pointer to the provided alignment and - * check that it is still in range. - * @gap_end: Highest possible start address for allocation (end of gap in - * address space) - * @gap_start: Start address of current memory area / gap in address space - * @info: vm_unmapped_area_info structure passed to caller, containing - * alignment, length and limits for the allocation - * @is_shader_code: True if the allocation is for shader code (which has - * additional alignment requirements) - * - * Return: true if gap_end is now aligned correctly and is still in range, - * false otherwise - */ -static bool align_and_check(unsigned long *gap_end, unsigned long gap_start, - struct vm_unmapped_area_info *info, bool is_shader_code) -{ - /* Compute highest gap address at the desired alignment */ - (*gap_end) -= info->length; - (*gap_end) -= (*gap_end - info->align_offset) & info->align_mask; - - if (is_shader_code) { - /* Check for 4GB boundary */ - if (0 == (*gap_end & BASE_MEM_MASK_4GB)) - (*gap_end) -= (info->align_offset ? info->align_offset : - info->length); - if (0 == ((*gap_end + info->length) & BASE_MEM_MASK_4GB)) - (*gap_end) -= (info->align_offset ? info->align_offset : - info->length); - - if (!(*gap_end & BASE_MEM_MASK_4GB) || !((*gap_end + - info->length) & BASE_MEM_MASK_4GB)) - return false; - } - - - if ((*gap_end < info->low_limit) || (*gap_end < gap_start)) - return false; - - - return true; -} - -/* The following function is taken from the kernel and just - * renamed. As it's not exported to modules we must copy-paste it here. - */ - -static unsigned long kbase_unmapped_area_topdown(struct vm_unmapped_area_info - *info, bool is_shader_code) -{ - struct mm_struct *mm = current->mm; - struct vm_area_struct *vma; - unsigned long length, low_limit, high_limit, gap_start, gap_end; - - /* Adjust search length to account for worst case alignment overhead */ - length = info->length + info->align_mask; - if (length < info->length) - return -ENOMEM; - - /* - * Adjust search limits by the desired length. - * See implementation comment at top of unmapped_area(). - */ - gap_end = info->high_limit; - if (gap_end < length) - return -ENOMEM; - high_limit = gap_end - length; - - if (info->low_limit > high_limit) - return -ENOMEM; - low_limit = info->low_limit + length; - - /* Check highest gap, which does not precede any rbtree node */ - gap_start = mm->highest_vm_end; - if (gap_start <= high_limit) { - if (align_and_check(&gap_end, gap_start, info, is_shader_code)) - return gap_end; - } - - /* Check if rbtree root looks promising */ - if (RB_EMPTY_ROOT(&mm->mm_rb)) - return -ENOMEM; - vma = rb_entry(mm->mm_rb.rb_node, struct vm_area_struct, vm_rb); - if (vma->rb_subtree_gap < length) - return -ENOMEM; - - while (true) { - /* Visit right subtree if it looks promising */ - gap_start = vma->vm_prev ? vma->vm_prev->vm_end : 0; - if (gap_start <= high_limit && vma->vm_rb.rb_right) { - struct vm_area_struct *right = - rb_entry(vma->vm_rb.rb_right, - struct vm_area_struct, vm_rb); - if (right->rb_subtree_gap >= length) { - vma = right; - continue; - } - } - -check_current: - /* Check if current node has a suitable gap */ - gap_end = vma->vm_start; - if (gap_end < low_limit) - return -ENOMEM; - if (gap_start <= high_limit && gap_end - gap_start >= length) { - /* We found a suitable gap. Clip it with the original - * high_limit. */ - if (gap_end > info->high_limit) - gap_end = info->high_limit; - - if (align_and_check(&gap_end, gap_start, info, - is_shader_code)) - return gap_end; - } - - /* Visit left subtree if it looks promising */ - if (vma->vm_rb.rb_left) { - struct vm_area_struct *left = - rb_entry(vma->vm_rb.rb_left, - struct vm_area_struct, vm_rb); - if (left->rb_subtree_gap >= length) { - vma = left; - continue; - } - } - - /* Go back up the rbtree to find next candidate node */ - while (true) { - struct rb_node *prev = &vma->vm_rb; - if (!rb_parent(prev)) - return -ENOMEM; - vma = rb_entry(rb_parent(prev), - struct vm_area_struct, vm_rb); - if (prev == vma->vm_rb.rb_right) { - gap_start = vma->vm_prev ? - vma->vm_prev->vm_end : 0; - goto check_current; - } - } - } - - return -ENOMEM; -} - -static unsigned long kbase_get_unmapped_area(struct file *filp, - const unsigned long addr, const unsigned long len, - const unsigned long pgoff, const unsigned long flags) -{ - /* based on get_unmapped_area, but simplified slightly due to that some - * values are known in advance */ - struct kbase_context *kctx = filp->private_data; - struct mm_struct *mm = current->mm; - struct vm_unmapped_area_info info; - unsigned long align_offset = 0; - unsigned long align_mask = 0; - unsigned long high_limit = mm->mmap_base; - unsigned long low_limit = PAGE_SIZE; - int cpu_va_bits = BITS_PER_LONG; - int gpu_pc_bits = - kctx->kbdev->gpu_props.props.core_props.log2_program_counter_size; - bool is_shader_code = false; - unsigned long ret; - - /* err on fixed address */ - if ((flags & MAP_FIXED) || addr) - return -EINVAL; - -#ifdef CONFIG_64BIT - /* too big? */ - if (len > TASK_SIZE - SZ_2M) - return -ENOMEM; - - if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) { - - if (kbase_hw_has_feature(kctx->kbdev, - BASE_HW_FEATURE_33BIT_VA)) { - high_limit = kctx->same_va_end << PAGE_SHIFT; - } else { - high_limit = min_t(unsigned long, mm->mmap_base, - (kctx->same_va_end << PAGE_SHIFT)); - if (len >= SZ_2M) { - align_offset = SZ_2M; - align_mask = SZ_2M - 1; - } - } - - low_limit = SZ_2M; - } else { - cpu_va_bits = 32; - } -#endif /* CONFIG_64BIT */ - if ((PFN_DOWN(BASE_MEM_COOKIE_BASE) <= pgoff) && - (PFN_DOWN(BASE_MEM_FIRST_FREE_ADDRESS) > pgoff)) { - int cookie = pgoff - PFN_DOWN(BASE_MEM_COOKIE_BASE); - - if (!kctx->pending_regions[cookie]) - return -EINVAL; - - if (!(kctx->pending_regions[cookie]->flags & - KBASE_REG_GPU_NX)) { - if (cpu_va_bits > gpu_pc_bits) { - align_offset = 1ULL << gpu_pc_bits; - align_mask = align_offset - 1; - is_shader_code = true; - } - } -#ifndef CONFIG_64BIT - } else { - return current->mm->get_unmapped_area(filp, addr, len, pgoff, - flags); -#endif - } - - info.flags = 0; - info.length = len; - info.low_limit = low_limit; - info.high_limit = high_limit; - info.align_offset = align_offset; - info.align_mask = align_mask; - - ret = kbase_unmapped_area_topdown(&info, is_shader_code); - - if (IS_ERR_VALUE(ret) && high_limit == mm->mmap_base && - high_limit < (kctx->same_va_end << PAGE_SHIFT)) { - /* Retry above mmap_base */ - info.low_limit = mm->mmap_base; - info.high_limit = min_t(u64, TASK_SIZE, - (kctx->same_va_end << PAGE_SHIFT)); - - ret = kbase_unmapped_area_topdown(&info, is_shader_code); - } - - return ret; -} - static const struct file_operations kbase_fops = { .owner = THIS_MODULE, .open = kbase_open, @@ -2139,18 +1391,6 @@ static const struct file_operations kbase_fops = { .get_unmapped_area = kbase_get_unmapped_area, }; -#ifndef CONFIG_MALI_BIFROST_NO_MALI -void kbase_os_reg_write(struct kbase_device *kbdev, u16 offset, u32 value) -{ - writel(value, kbdev->reg + offset); -} - -u32 kbase_os_reg_read(struct kbase_device *kbdev, u16 offset) -{ - return readl(kbdev->reg + offset); -} -#endif /* !CONFIG_MALI_BIFROST_NO_MALI */ - /** * show_policy - Show callback for the power_policy sysfs file. * @@ -3170,8 +2410,12 @@ static ssize_t kbase_show_gpuinfo(struct device *dev, .name = "Mali-G72" }, { .id = GPU_ID2_PRODUCT_TSIX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT, .name = "Mali-G51" }, + { .id = GPU_ID2_PRODUCT_TNOX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT, + .name = "Mali-TNOx" }, { .id = GPU_ID2_PRODUCT_TDVX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT, .name = "Mali-G31" }, + { .id = GPU_ID2_PRODUCT_TGOX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT, + .name = "Mali-G52" }, }; const char *product_name = "(Unknown Mali GPU)"; struct kbase_device *kbdev; @@ -3204,7 +2448,7 @@ static ssize_t kbase_show_gpuinfo(struct device *dev, } } - return scnprintf(buf, PAGE_SIZE, "%s %d cores 2EE r%dp%d 0x%04X\n", + return scnprintf(buf, PAGE_SIZE, "%s %d cores r%dp%d 0x%04X\n", product_name, kbdev->gpu_props.num_cores, (gpu_id & GPU_ID_VERSION_MAJOR) >> GPU_ID_VERSION_MAJOR_SHIFT, (gpu_id & GPU_ID_VERSION_MINOR) >> GPU_ID_VERSION_MINOR_SHIFT, @@ -3611,6 +2855,88 @@ static ssize_t set_lp_mem_pool_max_size(struct device *dev, static DEVICE_ATTR(lp_mem_pool_max_size, S_IRUGO | S_IWUSR, show_lp_mem_pool_max_size, set_lp_mem_pool_max_size); +/** + * show_js_ctx_scheduling_mode - Show callback for js_ctx_scheduling_mode sysfs + * entry. + * @dev: The device this sysfs file is for. + * @attr: The attributes of the sysfs file. + * @buf: The output buffer to receive the context scheduling mode information. + * + * This function is called to get the context scheduling mode being used by JS. + * + * Return: The number of bytes output to @buf. + */ +static ssize_t show_js_ctx_scheduling_mode(struct device *dev, + struct device_attribute *attr, char * const buf) +{ + struct kbase_device *kbdev; + + kbdev = to_kbase_device(dev); + if (!kbdev) + return -ENODEV; + + return scnprintf(buf, PAGE_SIZE, "%u\n", kbdev->js_ctx_scheduling_mode); +} + +/** + * set_js_ctx_scheduling_mode - Set callback for js_ctx_scheduling_mode sysfs + * entry. + * @dev: The device this sysfs file is for. + * @attr: The attributes of the sysfs file. + * @buf: The value written to the sysfs file. + * @count: The number of bytes written to the sysfs file. + * + * This function is called when the js_ctx_scheduling_mode sysfs file is written + * to. It checks the data written, and if valid updates the ctx scheduling mode + * being by JS. + * + * Return: @count if the function succeeded. An error code on failure. + */ +static ssize_t set_js_ctx_scheduling_mode(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct kbasep_kctx_list_element *element; + u32 new_js_ctx_scheduling_mode; + struct kbase_device *kbdev; + unsigned long flags; + int ret; + + kbdev = to_kbase_device(dev); + if (!kbdev) + return -ENODEV; + + ret = kstrtouint(buf, 0, &new_js_ctx_scheduling_mode); + if (ret || new_js_ctx_scheduling_mode >= KBASE_JS_PRIORITY_MODE_COUNT) { + dev_err(kbdev->dev, "Couldn't process js_ctx_scheduling_mode" + " write operation.\n" + "Use format <js_ctx_scheduling_mode>\n"); + return -EINVAL; + } + + if (new_js_ctx_scheduling_mode == kbdev->js_ctx_scheduling_mode) + return count; + + mutex_lock(&kbdev->kctx_list_lock); + spin_lock_irqsave(&kbdev->hwaccess_lock, flags); + + /* Update the context priority mode */ + kbdev->js_ctx_scheduling_mode = new_js_ctx_scheduling_mode; + + /* Adjust priority of all the contexts as per the new mode */ + list_for_each_entry(element, &kbdev->kctx_list, link) + kbase_js_update_ctx_priority(element->kctx); + + spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags); + mutex_unlock(&kbdev->kctx_list_lock); + + dev_dbg(kbdev->dev, "JS ctx scheduling mode: %u\n", new_js_ctx_scheduling_mode); + + return count; +} + +static DEVICE_ATTR(js_ctx_scheduling_mode, S_IRUGO | S_IWUSR, + show_js_ctx_scheduling_mode, + set_js_ctx_scheduling_mode); #ifdef CONFIG_DEBUG_FS /* Number of entries in serialize_jobs_settings[] */ @@ -3908,7 +3234,7 @@ static int power_control_init(struct platform_device *pdev) } #endif /* LINUX_VERSION_CODE >= 3, 12, 0 */ - kbdev->clock = clk_get(kbdev->dev, "clk_mali"); + kbdev->clock = of_clk_get(kbdev->dev->of_node, 0); if (IS_ERR_OR_NULL(kbdev->clock)) { err = PTR_ERR(kbdev->clock); kbdev->clock = NULL; @@ -4260,6 +3586,7 @@ static struct attribute *kbase_attrs[] = { &dev_attr_mem_pool_max_size.attr, &dev_attr_lp_mem_pool_size.attr, &dev_attr_lp_mem_pool_max_size.attr, + &dev_attr_js_ctx_scheduling_mode.attr, NULL }; @@ -4316,10 +3643,6 @@ static int kbase_platform_device_remove(struct platform_device *pdev) kbase_debug_job_fault_dev_term(kbdev); kbdev->inited_subsys &= ~inited_job_fault; } - if (kbdev->inited_subsys & inited_vinstr) { - kbase_vinstr_term(kbdev->vinstr_ctx); - kbdev->inited_subsys &= ~inited_vinstr; - } #ifdef CONFIG_MALI_BIFROST_DEVFREQ if (kbdev->inited_subsys & inited_devfreq) { @@ -4328,6 +3651,11 @@ static int kbase_platform_device_remove(struct platform_device *pdev) } #endif + if (kbdev->inited_subsys & inited_vinstr) { + kbase_vinstr_term(kbdev->vinstr_ctx); + kbdev->inited_subsys &= ~inited_vinstr; + } + if (kbdev->inited_subsys & inited_backend_late) { kbase_backend_late_term(kbdev); kbdev->inited_subsys &= ~inited_backend_late; @@ -4361,11 +3689,6 @@ static int kbase_platform_device_remove(struct platform_device *pdev) kbdev->inited_subsys &= ~inited_mem; } - if (kbdev->inited_subsys & inited_pm_runtime_init) { - kbdev->pm.callback_power_runtime_term(kbdev); - kbdev->inited_subsys &= ~inited_pm_runtime_init; - } - if (kbdev->inited_subsys & inited_ctx_sched) { kbase_ctx_sched_term(kbdev); kbdev->inited_subsys &= ~inited_ctx_sched; @@ -4425,14 +3748,6 @@ static int kbase_platform_device_probe(struct platform_device *pdev) const struct list_head *dev_list; int err = 0; -#ifdef CONFIG_OF - err = kbase_platform_early_init(); - if (err) { - dev_err(&pdev->dev, "Early platform initialization failed\n"); - kbase_platform_device_remove(pdev); - return err; - } -#endif kbdev = kbase_device_alloc(); if (!kbdev) { dev_err(&pdev->dev, "Allocate device failed\n"); @@ -4498,10 +3813,15 @@ static int kbase_platform_device_probe(struct platform_device *pdev) kbase_disjoint_init(kbdev); - /* obtain min/max configured gpu frequencies */ + /* obtain max configured gpu frequency, if devfreq is enabled then + * this will be overridden by the highest operating point found + */ core_props = &(kbdev->gpu_props.props.core_props); - core_props->gpu_freq_khz_min = GPU_FREQ_KHZ_MIN; +#ifdef GPU_FREQ_KHZ_MAX core_props->gpu_freq_khz_max = GPU_FREQ_KHZ_MAX; +#else + core_props->gpu_freq_khz_max = DEFAULT_GPU_FREQ_KHZ_MAX; +#endif err = kbase_device_init(kbdev); if (err) { @@ -4520,17 +3840,6 @@ static int kbase_platform_device_probe(struct platform_device *pdev) } kbdev->inited_subsys |= inited_ctx_sched; - if (kbdev->pm.callback_power_runtime_init) { - err = kbdev->pm.callback_power_runtime_init(kbdev); - if (err) { - dev_err(kbdev->dev, - "Runtime PM initialization failed\n"); - kbase_platform_device_remove(pdev); - return err; - } - kbdev->inited_subsys |= inited_pm_runtime_init; - } - err = kbase_mem_init(kbdev); if (err) { dev_err(kbdev->dev, "Memory subsystem initialization failed\n"); @@ -4624,6 +3933,7 @@ static int kbase_platform_device_probe(struct platform_device *pdev) kbdev->mdev.name = kbdev->devname; kbdev->mdev.fops = &kbase_fops; kbdev->mdev.parent = get_device(kbdev->dev); + kbdev->mdev.mode = 0666; kbdev->inited_subsys |= inited_get_device; /* This needs to happen before registering the device with misc_register(), @@ -4877,10 +4187,6 @@ static int __init kbase_driver_init(void) { int ret; - ret = kbase_platform_early_init(); - if (ret) - return ret; - ret = kbase_platform_register(); if (ret) return ret; diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ctx_sched.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ctx_sched.c index e2f7baabad43fd..85a6afdb4ef345 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ctx_sched.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ctx_sched.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> #include <mali_kbase_config_defaults.h> diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ctx_sched.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ctx_sched.h index 2330d48c8e519f..ab57a0dc1ca8b0 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ctx_sched.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ctx_sched.h @@ -1,26 +1,32 @@ /* * - * (C) COPYRIGHT 2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2017-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_CTX_SCHED_H_ #define _KBASE_CTX_SCHED_H_ #include <mali_kbase.h> -/* The Context Scheduler manages address space assignment and reference +/** + * The Context Scheduler manages address space assignment and reference * counting to kbase_context. The interface has been designed to minimise * interactions between the Job Scheduler and Power Management/MMU to support * the existing Job Scheduler interface. @@ -28,41 +34,36 @@ * The initial implementation of the Context Scheduler does not schedule * contexts. Instead it relies on the Job Scheduler to make decisions of * when to schedule/evict contexts if address spaces are starved. In the - * future, once an interface between the CS and JS have been devised to + * future, once an interface between the CS and JS has been devised to * provide enough information about how each context is consuming GPU resources, * those decisions can be made in the CS itself, thereby reducing duplicated * code. */ -/* base_ctx_sched_init - Initialise the context scheduler +/** + * kbase_ctx_sched_init - Initialise the context scheduler + * @kbdev: The device for which the context scheduler needs to be initialised * - * @kbdev: The device for which the context scheduler needs to be - * initialised + * This must be called during device initialisation. The number of hardware + * address spaces must already be established before calling this function. * * Return: 0 for success, otherwise failure - * - * This must be called during device initilisation. The number of hardware - * address spaces must already be established before calling this function. */ int kbase_ctx_sched_init(struct kbase_device *kbdev); -/* base_ctx_sched_term - Terminate the context scheduler - * - * @kbdev: The device for which the context scheduler needs to be - * terminated +/** + * kbase_ctx_sched_term - Terminate the context scheduler + * @kbdev: The device for which the context scheduler needs to be terminated * * This must be called during device termination after all contexts have been * destroyed. */ void kbase_ctx_sched_term(struct kbase_device *kbdev); -/* kbase_ctx_sched_retain_ctx - Retain a reference to the @ref kbase_context - * +/** + * kbase_ctx_sched_retain_ctx - Retain a reference to the @ref kbase_context * @kctx: The context to which to retain a reference * - * Return: The address space that the context has been assigned to or - * KBASEP_AS_NR_INVALID if no address space was available. - * * This function should be called whenever an address space should be assigned * to a context and programmed onto the MMU. It should typically be called * when jobs are ready to be submitted to the GPU. @@ -72,11 +73,14 @@ void kbase_ctx_sched_term(struct kbase_device *kbdev); * * The kbase_device::mmu_hw_mutex and kbase_device::hwaccess_lock locks must be * held whilst calling this function. + * + * Return: The address space that the context has been assigned to or + * KBASEP_AS_NR_INVALID if no address space was available. */ int kbase_ctx_sched_retain_ctx(struct kbase_context *kctx); -/* kbase_ctx_sched_retain_ctx_refcount - * +/** + * kbase_ctx_sched_retain_ctx_refcount * @kctx: The context to which to retain a reference * * This function only retains a reference to the context. It must be called @@ -90,8 +94,8 @@ int kbase_ctx_sched_retain_ctx(struct kbase_context *kctx); */ void kbase_ctx_sched_retain_ctx_refcount(struct kbase_context *kctx); -/* kbase_ctx_sched_release_ctx - Release a reference to the @ref kbase_context - * +/** + * kbase_ctx_sched_release_ctx - Release a reference to the @ref kbase_context * @kctx: The context from which to release a reference * * This function should be called whenever an address space could be unassigned @@ -103,8 +107,8 @@ void kbase_ctx_sched_retain_ctx_refcount(struct kbase_context *kctx); */ void kbase_ctx_sched_release_ctx(struct kbase_context *kctx); -/* kbase_ctx_sched_remove_ctx - Unassign previously assigned address space - * +/** + * kbase_ctx_sched_remove_ctx - Unassign previously assigned address space * @kctx: The context to be removed * * This function should be called when a context is being destroyed. The @@ -116,8 +120,8 @@ void kbase_ctx_sched_release_ctx(struct kbase_context *kctx); */ void kbase_ctx_sched_remove_ctx(struct kbase_context *kctx); -/* kbase_ctx_sched_restore_all_as - Reprogram all address spaces - * +/** + * kbase_ctx_sched_restore_all_as - Reprogram all address spaces * @kbdev: The device for which address spaces to be reprogrammed * * This function shall reprogram all address spaces previously assigned to diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug.c index fb57ac2e31adb8..118f787fb74ccd 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug.c @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> static struct kbasep_debug_assert_cb kbasep_debug_assert_registered_cb = { diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug.h index 31b754c5507b1a..f33413908405f0 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_DEBUG_H #define _KBASE_DEBUG_H diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_job_fault.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_job_fault.c index f29430ddf8f9bd..d2c09d6658f214 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_job_fault.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_job_fault.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> #include <linux/spinlock.h> #include <mali_kbase_hwaccess_jm.h> diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_job_fault.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_job_fault.h index a2bf8983c37c8e..f5ab0a44c1d417 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_job_fault.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_job_fault.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_DEBUG_JOB_FAULT_H #define _KBASE_DEBUG_JOB_FAULT_H diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_mem_view.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_mem_view.c index aa271566e91755..857fe9712ef968 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_mem_view.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_mem_view.c @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2013-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2013-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Debugfs interface to dump the memory visible to the GPU */ @@ -219,7 +224,7 @@ static int debug_mem_open(struct inode *i, struct file *file) } ret = debug_mem_zone_open(&kctx->reg_rbtree_exec, mem_data); - if (0 != ret) { + if (ret != 0) { kbase_gpu_vm_unlock(kctx); goto out; } @@ -299,7 +304,7 @@ void kbase_debug_mem_view_init(struct file *kctx_file) { struct kbase_context *kctx = kctx_file->private_data; - debugfs_create_file("mem_view", S_IRUGO, kctx->kctx_dentry, kctx_file, + debugfs_create_file("mem_view", S_IRUSR, kctx->kctx_dentry, kctx_file, &kbase_debug_mem_view_fops); } diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_mem_view.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_mem_view.h index 20ab51a776c6c9..886ca9448cf572 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_mem_view.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_mem_view.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_DEBUG_MEM_VIEW_H #define _KBASE_DEBUG_MEM_VIEW_H diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_defs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_defs.h index 727c263aa586a3..a49070e129cc24 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_defs.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_defs.h @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2011-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_defs.h * @@ -34,6 +39,7 @@ #include <mali_kbase_mmu_hw.h> #include <mali_kbase_instr_defs.h> #include <mali_kbase_pm.h> +#include <mali_kbase_gpuprops_types.h> #include <protected_mode_switcher.h> #include <linux/atomic.h> @@ -47,10 +53,6 @@ #endif -#ifdef CONFIG_KDS -#include <linux/kds.h> -#endif /* CONFIG_KDS */ - #if defined(CONFIG_SYNC) #include <sync.h> #else @@ -145,11 +147,7 @@ #define MIDGARD_MMU_LEVEL(x) (x) -#if MIDGARD_MMU_VA_BITS > 39 #define MIDGARD_MMU_TOPLEVEL MIDGARD_MMU_LEVEL(0) -#else -#define MIDGARD_MMU_TOPLEVEL MIDGARD_MMU_LEVEL(1) -#endif #define MIDGARD_MMU_BOTTOMLEVEL MIDGARD_MMU_LEVEL(3) @@ -177,6 +175,9 @@ #define KBASE_KATOM_FLAG_BEEN_SOFT_STOPPPED (1<<1) /** Atom has been previously retried to execute */ #define KBASE_KATOM_FLAGS_RERUN (1<<2) +/* Atom submitted with JOB_CHAIN_FLAG bit set in JS_CONFIG_NEXT register, helps to + * disambiguate short-running job chains during soft/hard stopping of jobs + */ #define KBASE_KATOM_FLAGS_JOBCHAIN (1<<3) /** Atom has been previously hard-stopped. */ #define KBASE_KATOM_FLAG_BEEN_HARD_STOPPED (1<<4) @@ -227,8 +228,27 @@ struct kbase_context; struct kbase_device; struct kbase_as; struct kbase_mmu_setup; +struct kbase_ipa_model_vinstr_data; #ifdef CONFIG_DEBUG_FS +/** + * struct base_job_fault_event - keeps track of the atom which faulted or which + * completed after the faulty atom but before the + * debug data for faulty atom was dumped. + * + * @event_code: event code for the atom, should != BASE_JD_EVENT_DONE for the + * atom which faulted. + * @katom: pointer to the atom for which job fault occurred or which completed + * after the faulty atom. + * @job_fault_work: work item, queued only for the faulty atom, which waits for + * the dumping to get completed and then does the bottom half + * of job done for the atoms which followed the faulty atom. + * @head: List head used to store the atom in the global list of faulty + * atoms or context specific list of atoms which got completed + * during the dump. + * @reg_offset: offset of the register to be dumped next, only applicable for + * the faulty atom. + */ struct base_job_fault_event { u32 event_code; @@ -240,6 +260,12 @@ struct base_job_fault_event { #endif +/** + * struct kbase_jd_atom_dependency - Contains the dependency info for an atom. + * @atom: pointer to the dependee atom. + * @dep_type: type of dependency on the dependee @atom, i.e. order or data + * dependency. BASE_JD_DEP_TYPE_INVALID indicates no dependency. + */ struct kbase_jd_atom_dependency { struct kbase_jd_atom *atom; u8 dep_type; @@ -279,14 +305,14 @@ struct kbase_io_history { }; /** - * @brief The function retrieves a read-only reference to the atom field from - * the kbase_jd_atom_dependency structure - * - * @param[in] dep kbase jd atom dependency. + * kbase_jd_katom_dep_atom - Retrieves a read-only reference to the + * dependee atom. + * @dep: pointer to the dependency info structure. * - * @return readonly reference to dependent ATOM. + * Return: readonly reference to dependee atom. */ -static inline const struct kbase_jd_atom * kbase_jd_katom_dep_atom(const struct kbase_jd_atom_dependency *dep) +static inline const struct kbase_jd_atom * +kbase_jd_katom_dep_atom(const struct kbase_jd_atom_dependency *dep) { LOCAL_ASSERT(dep != NULL); @@ -294,12 +320,11 @@ static inline const struct kbase_jd_atom * kbase_jd_katom_dep_atom(const struct } /** - * @brief The function retrieves a read-only reference to the dependency type field from - * the kbase_jd_atom_dependency structure + * kbase_jd_katom_dep_type - Retrieves the dependency type info * - * @param[in] dep kbase jd atom dependency. + * @dep: pointer to the dependency info structure. * - * @return A dependency type value. + * Return: the type of dependency there is on the dependee atom. */ static inline u8 kbase_jd_katom_dep_type(const struct kbase_jd_atom_dependency *dep) { @@ -309,12 +334,11 @@ static inline u8 kbase_jd_katom_dep_type(const struct kbase_jd_atom_dependency * } /** - * @brief Setter macro for dep_atom array entry in kbase_jd_atom - * - * @param[in] dep The kbase jd atom dependency. - * @param[in] a The ATOM to be set as a dependency. - * @param type The ATOM dependency type to be set. - * + * kbase_jd_katom_dep_set - sets up the dependency info structure + * as per the values passed. + * @const_dep: pointer to the dependency info structure to be setup. + * @a: pointer to the dependee atom. + * @type: type of dependency there is on the dependee atom. */ static inline void kbase_jd_katom_dep_set(const struct kbase_jd_atom_dependency *const_dep, struct kbase_jd_atom *a, u8 type) @@ -330,10 +354,9 @@ static inline void kbase_jd_katom_dep_set(const struct kbase_jd_atom_dependency } /** - * @brief Setter macro for dep_atom array entry in kbase_jd_atom - * - * @param[in] dep The kbase jd atom dependency to be cleared. + * kbase_jd_katom_dep_clear - resets the dependency info structure * + * @const_dep: pointer to the dependency info structure to be setup. */ static inline void kbase_jd_katom_dep_clear(const struct kbase_jd_atom_dependency *const_dep) { @@ -347,74 +370,212 @@ static inline void kbase_jd_katom_dep_clear(const struct kbase_jd_atom_dependenc dep->dep_type = BASE_JD_DEP_TYPE_INVALID; } +/** + * enum kbase_atom_gpu_rb_state - The state of an atom, pertinent after it becomes + * runnable, with respect to job slot ringbuffer/fifo. + * @KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB: Atom not currently present in slot fifo, which + * implies that either atom has not become runnable + * due to dependency or has completed the execution + * on GPU. + * @KBASE_ATOM_GPU_RB_WAITING_BLOCKED: Atom has been added to slot fifo but is blocked + * due to cross slot dependency, can't be submitted to GPU. + * @KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_PREV: Atom has been added to slot fifo but + * is waiting for the completion of previously added atoms + * in current & other slots, as their protected mode + * requirements do not match with the current atom. + * @KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_TRANSITION: Atom is in slot fifo and is + * waiting for completion of protected mode transition, + * needed before the atom is submitted to GPU. + * @KBASE_ATOM_GPU_RB_WAITING_FOR_CORE_AVAILABLE: Atom is in slot fifo but is waiting + * for the cores, which are needed to execute the job + * chain represented by the atom, to become available + * @KBASE_ATOM_GPU_RB_WAITING_AFFINITY: Atom is in slot fifo but is blocked on + * affinity due to rmu workaround for Hw issue 8987. + * @KBASE_ATOM_GPU_RB_READY: Atom is in slot fifo and can be submitted to GPU. + * @KBASE_ATOM_GPU_RB_SUBMITTED: Atom is in slot fifo and has been submitted to GPU. + * @KBASE_ATOM_GPU_RB_RETURN_TO_JS: Atom must be returned to JS due to some failure, + * but only after the previously added atoms in fifo + * have completed or have also been returned to JS. + */ enum kbase_atom_gpu_rb_state { - /* Atom is not currently present in slot ringbuffer */ KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB, - /* Atom is in slot ringbuffer but is blocked on a previous atom */ KBASE_ATOM_GPU_RB_WAITING_BLOCKED, - /* Atom is in slot ringbuffer but is waiting for a previous protected - * mode transition to complete */ KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_PREV, - /* Atom is in slot ringbuffer but is waiting for proected mode - * transition */ KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_TRANSITION, - /* Atom is in slot ringbuffer but is waiting for cores to become - * available */ KBASE_ATOM_GPU_RB_WAITING_FOR_CORE_AVAILABLE, - /* Atom is in slot ringbuffer but is blocked on affinity */ KBASE_ATOM_GPU_RB_WAITING_AFFINITY, - /* Atom is in slot ringbuffer and ready to run */ KBASE_ATOM_GPU_RB_READY, - /* Atom is in slot ringbuffer and has been submitted to the GPU */ KBASE_ATOM_GPU_RB_SUBMITTED, - /* Atom must be returned to JS as soon as it reaches the head of the - * ringbuffer due to a previous failure */ KBASE_ATOM_GPU_RB_RETURN_TO_JS = -1 }; +/** + * enum kbase_atom_enter_protected_state - The state of an atom with respect to the + * preparation for GPU's entry into protected mode, becomes + * pertinent only after atom's state with respect to slot + * ringbuffer is KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_TRANSITION + * @KBASE_ATOM_ENTER_PROTECTED_CHECK: Starting state. Check if there are any atoms + * currently submitted to GPU and protected mode transition is + * not already in progress. + * @KBASE_ATOM_ENTER_PROTECTED_VINSTR: Wait for vinstr to suspend before entry into + * protected mode. + * @KBASE_ATOM_ENTER_PROTECTED_IDLE_L2: Wait for the L2 to become idle in preparation + * for the coherency change. L2 shall be powered down and GPU shall + * come out of fully coherent mode before entering protected mode. + * @KBASE_ATOM_ENTER_PROTECTED_FINISHED: End state; Prepare coherency change and switch + * GPU to protected mode. + */ enum kbase_atom_enter_protected_state { - /* - * Starting state: - * Check if a transition into protected mode is required. - * - * NOTE: The integer value of this must - * match KBASE_ATOM_EXIT_PROTECTED_CHECK. + /** + * NOTE: The integer value of this must match KBASE_ATOM_EXIT_PROTECTED_CHECK. */ KBASE_ATOM_ENTER_PROTECTED_CHECK = 0, - /* Wait for vinstr to suspend. */ KBASE_ATOM_ENTER_PROTECTED_VINSTR, - /* Wait for the L2 to become idle in preparation for - * the coherency change. */ KBASE_ATOM_ENTER_PROTECTED_IDLE_L2, - /* End state; - * Prepare coherency change. */ KBASE_ATOM_ENTER_PROTECTED_FINISHED, }; +/** + * enum kbase_atom_exit_protected_state - The state of an atom with respect to the + * preparation for GPU's exit from protected mode, becomes + * pertinent only after atom's state with respect to slot + * ringbuffer is KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_TRANSITION + * @KBASE_ATOM_EXIT_PROTECTED_CHECK: Starting state. Check if there are any atoms + * currently submitted to GPU and protected mode transition is + * not already in progress. + * @KBASE_ATOM_EXIT_PROTECTED_IDLE_L2: Wait for the L2 to become idle in preparation + * for the reset, as exiting protected mode requires a reset. + * @KBASE_ATOM_EXIT_PROTECTED_RESET: Issue the reset to trigger exit from protected mode + * @KBASE_ATOM_EXIT_PROTECTED_RESET_WAIT: End state, Wait for the reset to complete + */ enum kbase_atom_exit_protected_state { - /* - * Starting state: - * Check if a transition out of protected mode is required. - * - * NOTE: The integer value of this must - * match KBASE_ATOM_ENTER_PROTECTED_CHECK. + /** + * NOTE: The integer value of this must match KBASE_ATOM_ENTER_PROTECTED_CHECK. */ KBASE_ATOM_EXIT_PROTECTED_CHECK = 0, - /* Wait for the L2 to become idle in preparation - * for the reset. */ KBASE_ATOM_EXIT_PROTECTED_IDLE_L2, - /* Issue the protected reset. */ KBASE_ATOM_EXIT_PROTECTED_RESET, - /* End state; - * Wait for the reset to complete. */ KBASE_ATOM_EXIT_PROTECTED_RESET_WAIT, }; +/** + * struct kbase_ext_res - Contains the info for external resources referred + * by an atom, which have been mapped on GPU side. + * @gpu_address: Start address of the memory region allocated for + * the resource from GPU virtual address space. + * @alloc: pointer to physical pages tracking object, set on + * mapping the external resource on GPU side. + */ struct kbase_ext_res { u64 gpu_address; struct kbase_mem_phy_alloc *alloc; }; +/** + * struct kbase_jd_atom - object representing the atom, containing the complete + * state and attributes of an atom. + * @work: work item for the bottom half processing of the atom, + * by JD or JS, after it got executed on GPU or the input + * fence got signaled + * @start_timestamp: time at which the atom was submitted to the GPU, by + * updating the JS_HEAD_NEXTn register. + * @udata: copy of the user data sent for the atom in base_jd_submit. + * @kctx: Pointer to the base context with which the atom is associated. + * @dep_head: Array of 2 list heads, pointing to the two list of atoms + * which are blocked due to dependency on this atom. + * @dep_item: Array of 2 list heads, used to store the atom in the list of + * other atoms depending on the same dependee atom. + * @dep: Array containing the dependency info for the 2 atoms on which + * the atom depends upon. + * @jd_item: List head used during job dispatch job_done processing - as + * dependencies may not be entirely resolved at this point, + * we need to use a separate list head. + * @in_jd_list: flag set to true if atom's @jd_item is currently on a list, + * prevents atom being processed twice. + * @nr_extres: number of external resources referenced by the atom. + * @extres: pointer to the location containing info about @nr_extres + * external resources referenced by the atom. + * @device_nr: indicates the coregroup with which the atom is associated, + * when BASE_JD_REQ_SPECIFIC_COHERENT_GROUP specified. + * @affinity: bitmask of the shader cores on which the atom can execute. + * @jc: GPU address of the job-chain. + * @softjob_data: Copy of data read from the user space buffer that @jc + * points to. + * @coreref_state: state of the atom with respect to retention of shader + * cores for affinity & power management. + * @fence: Stores either an input or output sync fence, depending + * on soft-job type + * @sync_waiter: Pointer to the sync fence waiter structure passed to the + * callback function on signaling of the input fence. + * @dma_fence: object containing pointers to both input & output fences + * and other related members used for explicit sync through + * soft jobs and for the implicit synchronization required + * on access to external resources. + * @event_code: Event code for the job chain represented by the atom, both + * HW and low-level SW events are represented by event codes. + * @core_req: bitmask of BASE_JD_REQ_* flags specifying either Hw or Sw + * requirements for the job chain represented by the atom. + * @ticks: Number of scheduling ticks for which atom has been running + * on the GPU. + * @sched_priority: Priority of the atom for Job scheduling, as per the + * KBASE_JS_ATOM_SCHED_PRIO_*. + * @poking: Indicates whether poking of MMU is ongoing for the atom, + * as a WA for the issue HW_ISSUE_8316. + * @completed: Wait queue to wait upon for the completion of atom. + * @status: Indicates at high level at what stage the atom is in, + * as per KBASE_JD_ATOM_STATE_*, that whether it is not in + * use or its queued in JD or given to JS or submitted to Hw + * or it completed the execution on Hw. + * @work_id: used for GPU tracepoints, its a snapshot of the 'work_id' + * counter in kbase_jd_context which is incremented on + * every call to base_jd_submit. + * @slot_nr: Job slot chosen for the atom. + * @atom_flags: bitmask of KBASE_KATOM_FLAG* flags capturing the exact + * low level state of the atom. + * @retry_count: Number of times this atom has been retried. Used by replay + * soft job. + * @gpu_rb_state: bitmnask of KBASE_ATOM_GPU_RB_* flags, precisely tracking + * atom's state after it has entered Job scheduler on becoming + * runnable. Atom could be blocked due to cross slot dependency + * or waiting for the shader cores to become available or + * waiting for protected mode transitions to complete. + * @need_cache_flush_cores_retained: flag indicating that manual flush of GPU + * cache is needed for the atom and the shader cores used + * for atom have been kept on. + * @blocked: flag indicating that atom's resubmission to GPU is + * blocked till the work item is scheduled to return the + * atom to JS. + * @pre_dep: Pointer to atom that this atom has same-slot dependency on + * @post_dep: Pointer to atom that has same-slot dependency on this atom + * @x_pre_dep: Pointer to atom that this atom has cross-slot dependency on + * @x_post_dep: Pointer to atom that has cross-slot dependency on this atom + * @flush_id: The GPU's flush count recorded at the time of submission, + * used for the cache flush optimisation + * @fault_event: Info for dumping the debug data on Job fault. + * @queue: List head used for 4 different purposes : + * Adds atom to the list of dma-buf fence waiting atoms. + * Adds atom to the list of atoms blocked due to cross + * slot dependency. + * Adds atom to the list of softjob atoms for which JIT + * allocation has been deferred + * Adds atom to the list of softjob atoms waiting for the + * signaling of fence. + * @jit_node: Used to keep track of all JIT free/alloc jobs in submission order + * @jit_blocked: Flag indicating that JIT allocation requested through + * softjob atom will be reattempted after the impending + * free of other active JIT allocations. + * @will_fail_event_code: If non-zero, this indicates that the atom will fail + * with the set event_code when the atom is processed. + * Used for special handling of atoms, which have a data + * dependency on the failed atoms. + * @protected_state: State of the atom, as per KBASE_ATOM_(ENTER|EXIT)_PROTECTED_*, + * when transitioning into or out of protected mode. Atom will + * be either entering or exiting the protected mode. + * @runnable_tree_node: The node added to context's job slot specific rb tree + * when the atom becomes runnable. + * @age: Age of atom relative to other atoms in the context, is + * snapshot of the age_count counter in kbase context. + */ struct kbase_jd_atom { struct work_struct work; ktime_t start_timestamp; @@ -425,12 +586,7 @@ struct kbase_jd_atom { struct list_head dep_head[2]; struct list_head dep_item[2]; const struct kbase_jd_atom_dependency dep[2]; - /* List head used during job dispatch job_done processing - as - * dependencies may not be entirely resolved at this point, we need to - * use a separate list head. */ struct list_head jd_item; - /* true if atom's jd_item is currently on a list. Prevents atom being - * processed twice. */ bool in_jd_list; u16 nr_extres; @@ -439,14 +595,9 @@ struct kbase_jd_atom { u32 device_nr; u64 affinity; u64 jc; + void *softjob_data; enum kbase_atom_coreref_state coreref_state; -#ifdef CONFIG_KDS - struct list_head node; - struct kds_resource_set *kds_rset; - bool kds_dep_satisfied; -#endif /* CONFIG_KDS */ #if defined(CONFIG_SYNC) - /* Stores either an input or output fence, depending on soft-job type */ struct sync_fence *fence; struct sync_fence_waiter sync_waiter; #endif /* CONFIG_SYNC */ @@ -520,30 +671,22 @@ struct kbase_jd_atom { /* Note: refer to kbasep_js_atom_retained_state, which will take a copy of some of the following members */ enum base_jd_event_code event_code; - base_jd_core_req core_req; /**< core requirements */ - /** Job Slot to retry submitting to if submission from IRQ handler failed - * - * NOTE: see if this can be unified into the another member e.g. the event */ - int retry_submit_on_slot; + base_jd_core_req core_req; u32 ticks; - /* JS atom priority with respect to other atoms on its kctx. */ int sched_priority; - int poking; /* BASE_HW_ISSUE_8316 */ + int poking; wait_queue_head_t completed; enum kbase_jd_atom_state status; #ifdef CONFIG_GPU_TRACEPOINTS int work_id; #endif - /* Assigned after atom is completed. Used to check whether PRLAM-10676 workaround should be applied */ int slot_nr; u32 atom_flags; - /* Number of times this atom has been retried. Used by replay soft job. - */ int retry_count; enum kbase_atom_gpu_rb_state gpu_rb_state; @@ -552,45 +695,25 @@ struct kbase_jd_atom { atomic_t blocked; - /* Pointer to atom that this atom has same-slot dependency on */ struct kbase_jd_atom *pre_dep; - /* Pointer to atom that has same-slot dependency on this atom */ struct kbase_jd_atom *post_dep; - /* Pointer to atom that this atom has cross-slot dependency on */ struct kbase_jd_atom *x_pre_dep; - /* Pointer to atom that has cross-slot dependency on this atom */ struct kbase_jd_atom *x_post_dep; - /* The GPU's flush count recorded at the time of submission, used for - * the cache flush optimisation */ u32 flush_id; - struct kbase_jd_atom_backend backend; #ifdef CONFIG_DEBUG_FS struct base_job_fault_event fault_event; #endif - /* List head used for three different purposes: - * 1. Overflow list for JS ring buffers. If an atom is ready to run, - * but there is no room in the JS ring buffer, then the atom is put - * on the ring buffer's overflow list using this list node. - * 2. List of waiting soft jobs. - */ struct list_head queue; - /* Used to keep track of all JIT free/alloc jobs in submission order - */ struct list_head jit_node; bool jit_blocked; - /* If non-zero, this indicates that the atom will fail with the set - * event_code when the atom is processed. */ enum base_jd_event_code will_fail_event_code; - /* Atoms will only ever be transitioning into, or out of - * protected mode so we do not need two separate fields. - */ union { enum kbase_atom_enter_protected_state enter; enum kbase_atom_exit_protected_state exit; @@ -598,7 +721,6 @@ struct kbase_jd_atom { struct rb_node runnable_tree_node; - /* 'Age' of atom relative to other atoms in the context. */ u32 age; }; @@ -617,47 +739,63 @@ static inline bool kbase_jd_katom_is_protected(const struct kbase_jd_atom *katom #define KBASE_JD_DEP_QUEUE_SIZE 256 +/** + * struct kbase_jd_context - per context object encapsulating all the Job dispatcher + * related state. + * @lock: lock to serialize the updates made to the Job dispatcher + * state and kbase_jd_atom objects. + * @sched_info: Structure encapsulating all the Job scheduling info. + * @atoms: Array of the objects representing atoms, containing + * the complete state and attributes of an atom. + * @job_nr: Tracks the number of atoms being processed by the + * kbase. This includes atoms that are not tracked by + * scheduler: 'not ready to run' & 'dependency-only' jobs. + * @zero_jobs_wait: Waitq that reflects whether there are no jobs + * (including SW-only dependency jobs). This is set + * when no jobs are present on the ctx, and clear when + * there are jobs. + * This must be updated atomically with @job_nr. + * note: Job Dispatcher knows about more jobs than the + * Job Scheduler as it is unaware of jobs that are + * blocked on dependencies and SW-only dependency jobs. + * This waitq can be waited upon to find out when the + * context jobs are all done/cancelled (including those + * that might've been blocked on dependencies) - and so, + * whether it can be terminated. However, it should only + * be terminated once it is not present in the run-pool. + * Since the waitq is only set under @lock, the waiter + * should also briefly obtain and drop @lock to guarantee + * that the setter has completed its work on the kbase_context + * @job_done_wq: Workqueue to which the per atom work item is queued + * for bottom half processing when the atom completes + * execution on GPU or the input fence get signaled. + * @tb_lock: Lock to serialize the write access made to @tb to + * to store the register access trace messages. + * @tb: Pointer to the Userspace accessible buffer storing + * the trace messages for register read/write accesses + * made by the Kbase. The buffer is filled in circular + * fashion. + * @tb_wrap_offset: Offset to the end location in the trace buffer, the + * write pointer is moved to the beginning on reaching + * this offset. + * @work_id: atomic variable used for GPU tracepoints, incremented + * on every call to base_jd_submit. + */ struct kbase_jd_context { struct mutex lock; struct kbasep_js_kctx_info sched_info; struct kbase_jd_atom atoms[BASE_JD_ATOM_COUNT]; - /** Tracks all job-dispatch jobs. This includes those not tracked by - * the scheduler: 'not ready to run' and 'dependency-only' jobs. */ u32 job_nr; - /** Waitq that reflects whether there are no jobs (including SW-only - * dependency jobs). This is set when no jobs are present on the ctx, - * and clear when there are jobs. - * - * @note: Job Dispatcher knows about more jobs than the Job Scheduler: - * the Job Scheduler is unaware of jobs that are blocked on dependencies, - * and SW-only dependency jobs. - * - * This waitq can be waited upon to find out when the context jobs are all - * done/cancelled (including those that might've been blocked on - * dependencies) - and so, whether it can be terminated. However, it should - * only be terminated once it is not present in the run-pool (see - * kbasep_js_kctx_info::ctx::is_scheduled). - * - * Since the waitq is only set under kbase_jd_context::lock, - * the waiter should also briefly obtain and drop kbase_jd_context::lock to - * guarentee that the setter has completed its work on the kbase_context - * - * This must be updated atomically with: - * - kbase_jd_context::job_nr */ wait_queue_head_t zero_jobs_wait; - /** Job Done workqueue. */ struct workqueue_struct *job_done_wq; spinlock_t tb_lock; u32 *tb; size_t tb_wrap_offset; -#ifdef CONFIG_KDS - struct kds_callback kds_cb; -#endif /* CONFIG_KDS */ #ifdef CONFIG_GPU_TRACEPOINTS atomic_t work_id; #endif @@ -683,15 +821,34 @@ struct kbase_mmu_setup { }; /** - * Important: Our code makes assumptions that a struct kbase_as structure is always at - * kbase_device->as[number]. This is used to recover the containing - * struct kbase_device from a struct kbase_as structure. - * - * Therefore, struct kbase_as structures must not be allocated anywhere else. + * struct kbase_as - object representing an address space of GPU. + * @number: Index at which this address space structure is present + * in an array of address space structures embedded inside the + * struct kbase_device. + * @pf_wq: Workqueue for processing work items related to Bus fault + * and Page fault handling. + * @work_pagefault: Work item for the Page fault handling. + * @work_busfault: Work item for the Bus fault handling. + * @fault_type: Type of fault which occured for this address space, + * regular/unexpected Bus or Page fault. + * @protected_mode: Flag indicating whether the fault occurred in protected + * mode or not. + * @fault_status: Records the fault status as reported by Hw. + * @fault_addr: Records the faulting address. + * @fault_extra_addr: Records the secondary fault address. + * @current_setup: Stores the MMU configuration for this address space. + * @poke_wq: Workqueue to process the work items queue for poking the + * MMU as a WA for BASE_HW_ISSUE_8316. + * @poke_work: Work item to do the poking of MMU for this address space. + * @poke_refcount: Refcount for the need of poking MMU. While the refcount is + * non zero the poking of MMU will continue. + * Protected by hwaccess_lock. + * @poke_state: State indicating whether poking is in progress or it has + * been stopped. Protected by hwaccess_lock. + * @poke_timer: Timer used to schedule the poking at regular intervals. */ struct kbase_as { int number; - struct workqueue_struct *pf_wq; struct work_struct work_pagefault; struct work_struct work_busfault; @@ -700,15 +857,10 @@ struct kbase_as { u32 fault_status; u64 fault_addr; u64 fault_extra_addr; - struct kbase_mmu_setup current_setup; - - /* BASE_HW_ISSUE_8316 */ struct workqueue_struct *poke_wq; struct work_struct poke_work; - /** Protected by hwaccess_lock */ int poke_refcount; - /** Protected by hwaccess_lock */ kbase_as_poke_state poke_state; struct hrtimer poke_timer; }; @@ -746,6 +898,37 @@ enum kbase_trace_code { #define KBASE_TRACE_FLAG_REFCOUNT (((u8)1) << 0) #define KBASE_TRACE_FLAG_JOBSLOT (((u8)1) << 1) +/** + * struct kbase_trace - object representing a trace message added to trace buffer + * kbase_device::trace_rbuf + * @timestamp: CPU timestamp at which the trace message was added. + * @thread_id: id of the thread in the context of which trace message + * was added. + * @cpu: indicates which CPU the @thread_id was scheduled on when + * the trace message was added. + * @ctx: Pointer to the kbase context for which the trace message + * was added. Will be NULL for certain trace messages like + * for traces added corresponding to power management events. + * Will point to the appropriate context corresponding to + * job-slot & context's reference count related events. + * @katom: indicates if the trace message has atom related info. + * @atom_number: id of the atom for which trace message was added. + * Only valid if @katom is true. + * @atom_udata: Copy of the user data sent for the atom in base_jd_submit. + * Only valid if @katom is true. + * @gpu_addr: GPU address of the job-chain represented by atom. Could + * be valid even if @katom is false. + * @info_val: value specific to the type of event being traced. For the + * case where @katom is true, will be set to atom's affinity, + * i.e. bitmask of shader cores chosen for atom's execution. + * @code: Identifies the event, refer enum kbase_trace_code. + * @jobslot: job-slot for which trace message was added, valid only for + * job-slot management events. + * @refcount: reference count for the context, valid for certain events + * related to scheduler core and policy. + * @flags: indicates if info related to @jobslot & @refcount is present + * in the trace message, used during dumping of the message. + */ struct kbase_trace { struct timespec timestamp; u32 thread_id; @@ -912,19 +1095,23 @@ struct kbase_pm_device_data { /** * struct kbase_mem_pool - Page based memory pool for kctx/kbdev - * @kbdev: Kbase device where memory is used - * @cur_size: Number of free pages currently in the pool (may exceed @max_size - * in some corner cases) - * @max_size: Maximum number of free pages in the pool - * @order: order = 0 refers to a pool of 4 KB pages - * order = 9 refers to a pool of 2 MB pages (2^9 * 4KB = 2 MB) - * @pool_lock: Lock protecting the pool - must be held when modifying @cur_size - * and @page_list - * @page_list: List of free pages in the pool - * @reclaim: Shrinker for kernel reclaim of free pages - * @next_pool: Pointer to next pool where pages can be allocated when this pool - * is empty. Pages will spill over to the next pool when this pool - * is full. Can be NULL if there is no next pool. + * @kbdev: Kbase device where memory is used + * @cur_size: Number of free pages currently in the pool (may exceed + * @max_size in some corner cases) + * @max_size: Maximum number of free pages in the pool + * @order: order = 0 refers to a pool of 4 KB pages + * order = 9 refers to a pool of 2 MB pages (2^9 * 4KB = 2 MB) + * @pool_lock: Lock protecting the pool - must be held when modifying + * @cur_size and @page_list + * @page_list: List of free pages in the pool + * @reclaim: Shrinker for kernel reclaim of free pages + * @next_pool: Pointer to next pool where pages can be allocated when this + * pool is empty. Pages will spill over to the next pool when + * this pool is full. Can be NULL if there is no next pool. + * @dying: true if the pool is being terminated, and any ongoing + * operations should be abandoned + * @dont_reclaim: true if the shrinker is forbidden from reclaiming memory from + * this pool, eg during a grow operation */ struct kbase_mem_pool { struct kbase_device *kbdev; @@ -936,6 +1123,9 @@ struct kbase_mem_pool { struct shrinker reclaim; struct kbase_mem_pool *next_pool; + + bool dying; + bool dont_reclaim; }; /** @@ -971,9 +1161,261 @@ struct kbase_mmu_mode const *kbase_mmu_mode_get_aarch64(void); #define DEVNAME_SIZE 16 +/** + * struct kbase_device - Object representing an instance of GPU platform device, + * allocated from the probe method of mali driver. + * @hw_quirks_sc: Configuration to be used for the shader cores as per + * the HW issues present in the GPU. + * @hw_quirks_tiler: Configuration to be used for the Tiler as per the HW + * issues present in the GPU. + * @hw_quirks_mmu: Configuration to be used for the MMU as per the HW + * issues present in the GPU. + * @hw_quirks_jm: Configuration to be used for the Job Manager as per + * the HW issues present in the GPU. + * @entry: Links the device instance to the global list of GPU + * devices. The list would have as many entries as there + * are GPU device instances. + * @dev: Pointer to the kernel's generic/base representation + * of the GPU platform device. + * @mdev: Pointer to the miscellaneous device registered to + * provide Userspace access to kernel driver through the + * device file /dev/malixx. + * @reg_start: Base address of the region in physical address space + * where GPU registers have been mapped. + * @reg_size: Size of the region containing GPU registers + * @reg: Kernel virtual address of the region containing GPU + * registers, using which Driver will access the registers. + * @irqs: Array containing IRQ resource info for 3 types of + * interrupts : Job scheduling, MMU & GPU events (like + * power management, cache etc.) + * @clock: Pointer to the input clock resource (having an id of 0), + * referenced by the GPU device node. + * @regulator: Pointer to the struct corresponding to the regulator + * for GPU device + * @devname: string containing the name used for GPU device instance, + * miscellaneous device is registered using the same name. + * @model: Pointer, valid only when Driver is compiled to not access + * the real GPU Hw, to the dummy model which tries to mimic + * to some extent the state & behavior of GPU Hw in response + * to the register accesses made by the Driver. + * @irq_slab: slab cache for allocating the work items queued when + * model mimics raising of IRQ to cause an interrupt on CPU. + * @irq_workq: workqueue for processing the irq work items. + * @serving_job_irq: function to execute work items queued when model mimics + * the raising of JS irq, mimics the interrupt handler + * processing JS interrupts. + * @serving_gpu_irq: function to execute work items queued when model mimics + * the raising of GPU irq, mimics the interrupt handler + * processing GPU interrupts. + * @serving_mmu_irq: function to execute work items queued when model mimics + * the raising of MMU irq, mimics the interrupt handler + * processing MMU interrupts. + * @reg_op_lock: lock used by model to serialize the handling of register + * accesses made by the driver. + * @pm: Per device object for storing data for power management + * framework. + * @js_data: Per device object encapsulating the current context of + * Job Scheduler, which is global to the device and is not + * tied to any particular struct kbase_context running on + * the device + * @mem_pool: Object containing the state for global pool of 4KB size + * physical pages which can be used by all the contexts. + * @lp_mem_pool: Object containing the state for global pool of 2MB size + * physical pages which can be used by all the contexts. + * @memdev: keeps track of the in use physical pages allocated by + * the Driver. + * @mmu_mode: Pointer to the object containing methods for programming + * the MMU, depending on the type of MMU supported by Hw. + * @as: Array of objects representing address spaces of GPU. + * @as_free: Bitpattern of free/available address space lots + * @as_to_kctx: Array of pointers to struct kbase_context, having + * GPU adrress spaces assigned to them. + * @mmu_mask_change: Lock to serialize the access to MMU interrupt mask + * register used in the handling of Bus & Page faults. + * @gpu_props: Object containing complete information about the + * configuration/properties of GPU HW device in use. + * @hw_issues_mask: List of SW workarounds for HW issues + * @hw_features_mask: List of available HW features. + * shader_inuse_bitmap: Bitmaps of shader cores that are currently in use. + * These should be kept up to date by the job scheduler. + * The bit to be set in this bitmap should already be set + * in the @shader_needed_bitmap. + * @pm.power_change_lock should be held when accessing + * these members. + * @shader_inuse_cnt: Usage count for each of the 64 shader cores + * @shader_needed_bitmap: Bitmaps of cores the JS needs for jobs ready to run + * kbase_pm_check_transitions_nolock() should be called + * when the bitmap is modified to update the power + * management system and allow transitions to occur. + * @shader_needed_cnt: Count for each of the 64 shader cores, incremented + * when the core is requested for use and decremented + * later when the core is known to be powered up for use. + * @tiler_inuse_cnt: Usage count for the Tiler block. @tiler_needed_cnt + * should be non zero at the time of incrementing the + * usage count. + * @tiler_needed_cnt: Count for the Tiler block shader cores, incremented + * when Tiler is requested for use and decremented + * later when Tiler is known to be powered up for use. + * @disjoint_event: struct for keeping track of the disjoint information, + * that whether the GPU is in a disjoint state and the + * number of disjoint events that have occurred on GPU. + * @l2_users_count: Refcount for tracking users of the l2 cache, e.g. + * when using hardware counter instrumentation. + * @shader_available_bitmap: Bitmap of shader cores that are currently available, + * powered up and the power policy is happy for jobs + * to be submitted to these cores. These are updated + * by the power management code. The job scheduler + * should avoid submitting new jobs to any cores + * that are not marked as available. + * @tiler_available_bitmap: Bitmap of tiler units that are currently available. + * @l2_available_bitmap: Bitmap of the currently available Level 2 caches. + * @stack_available_bitmap: Bitmap of the currently available Core stacks. + * @shader_ready_bitmap: Bitmap of shader cores that are ready (powered on) + * @shader_transitioning_bitmap: Bitmap of shader cores that are currently changing + * power state. + * @nr_hw_address_spaces: Number of address spaces actually available in the + * GPU, remains constant after driver initialisation. + * @nr_user_address_spaces: Number of address spaces available to user contexts + * @hwcnt: Structure used for instrumentation and HW counters + * dumping + * @vinstr_ctx: vinstr context created per device + * @trace_lock: Lock to serialize the access to trace buffer. + * @trace_first_out: Index/offset in the trace buffer at which the first + * unread message is present. + * @trace_next_in: Index/offset in the trace buffer at which the new + * message will be written. + * @trace_rbuf: Pointer to the buffer storing debug messages/prints + * tracing the various events in Driver. + * The buffer is filled in circular fashion. + * @reset_timeout_ms: Number of milliseconds to wait for the soft stop to + * complete for the GPU jobs before proceeding with the + * GPU reset. + * @cacheclean_lock: Lock to serialize the clean & invalidation of GPU caches, + * between Job Manager backend & Instrumentation code. + * @platform_context: Platform specific private data to be accessed by + * platform specific config files only. + * @kctx_list: List of kbase_contexts created for the device, including + * the kbase_context created for vinstr_ctx. + * @kctx_list_lock: Lock protecting concurrent accesses to @kctx_list. + * @devfreq_profile: Describes devfreq profile for the Mali GPU device, passed + * to devfreq_add_device() to add devfreq feature to Mali + * GPU device. + * @devfreq: Pointer to devfreq structure for Mali GPU device, + * returned on the call to devfreq_add_device(). + * @current_freq: The real frequency, corresponding to @current_nominal_freq, + * at which the Mali GPU device is currently operating, as + * retrieved from @opp_table in the target callback of + * @devfreq_profile. + * @current_nominal_freq: The nominal frequency currently used for the Mali GPU + * device as retrieved through devfreq_recommended_opp() + * using the freq value passed as an argument to target + * callback of @devfreq_profile + * @current_voltage: The voltage corresponding to @current_nominal_freq, as + * retrieved through dev_pm_opp_get_voltage(). + * @current_core_mask: bitmask of shader cores that are currently desired & + * enabled, corresponding to @current_nominal_freq as + * retrieved from @opp_table in the target callback of + * @devfreq_profile. + * @opp_table: Pointer to the lookup table for converting between nominal + * OPP (operating performance point) frequency, and real + * frequency and core mask. This table is constructed according + * to operating-points-v2-mali table in devicetree. + * @num_opps: Number of operating performance points available for the Mali + * GPU device. + * @devfreq_cooling: Pointer returned on registering devfreq cooling device + * corresponding to @devfreq. + * @ipa_use_configured_model: set to TRUE when configured model is used for IPA and + * FALSE when fallback model is used. + * @ipa: Top level structure for IPA, containing pointers to both + * configured & fallback models. + * @timeline: Stores the global timeline tracking information. + * @job_fault_debug: Flag to control the dumping of debug data for job faults, + * set when the 'job_fault' debugfs file is opened. + * @mali_debugfs_directory: Root directory for the debugfs files created by the driver + * @debugfs_ctx_directory: Directory inside the @mali_debugfs_directory containing + * a sub-directory for every context. + * @debugfs_as_read_bitmap: bitmap of address spaces for which the bus or page fault + * has occurred. + * @job_fault_wq: Waitqueue to block the job fault dumping daemon till the + * occurrence of a job fault. + * @job_fault_resume_wq: Waitqueue on which every context with a faulty job wait + * for the job fault dumping to complete before they can + * do bottom half of job done for the atoms which followed + * the faulty atom. + * @job_fault_resume_workq: workqueue to process the work items queued for the faulty + * atoms, whereby the work item function waits for the dumping + * to get completed. + * @job_fault_event_list: List of atoms, each belonging to a different context, which + * generated a job fault. + * @job_fault_event_lock: Lock to protect concurrent accesses to @job_fault_event_list + * @regs_dump_debugfs_data: Contains the offset of register to be read through debugfs + * file "read_register". + * @kbase_profiling_controls: Profiling controls set by gator to control frame buffer + * dumping and s/w counter reporting. + * @force_replay_limit: Number of gpu jobs, having replay atoms associated with them, + * that are run before a job is forced to fail and replay. + * Set to 0 to disable forced failures. + * @force_replay_count: Count of gpu jobs, having replay atoms associated with them, + * between forced failures. Incremented on each gpu job which + * has replay atoms dependent on it. A gpu job is forced to + * fail once this is greater than or equal to @force_replay_limit + * @force_replay_core_req: Core requirements, set through the sysfs file, for the replay + * job atoms to consider the associated gpu job for forceful + * failure and replay. May be zero + * @force_replay_random: Set to 1 to randomize the @force_replay_limit, in the + * range of 1 - KBASEP_FORCE_REPLAY_RANDOM_LIMIT. + * @ctx_num: Total number of contexts created for the device. + * @io_history: Pointer to an object keeping a track of all recent + * register accesses. The history of register accesses + * can be read through "regs_history" debugfs file. + * @hwaccess: Contains a pointer to active kbase context and GPU + * backend specific data for HW access layer. + * @faults_pending: Count of page/bus faults waiting for bottom half processing + * via workqueues. + * @poweroff_pending: Set when power off operation for GPU is started, reset when + * power on for GPU is started. + * @infinite_cache_active_default: Set to enable using infinite cache for all the + * allocations of a new context. + * @mem_pool_max_size_default: Initial/default value for the maximum size of both + * types of pool created for a new context. + * @current_gpu_coherency_mode: coherency mode in use, which can be different + * from @system_coherency, when using protected mode. + * @system_coherency: coherency mode as retrieved from the device tree. + * @cci_snoop_enabled: Flag to track when CCI snoops have been enabled. + * @snoop_enable_smc: SMC function ID to call into Trusted firmware to + * enable cache snooping. Value of 0 indicates that it + * is not used. + * @snoop_disable_smc: SMC function ID to call disable cache snooping. + * @protected_ops: Pointer to the methods for switching in or out of the + * protected mode, as per the @protected_dev being used. + * @protected_dev: Pointer to the protected mode switcher device attached + * to the GPU device retrieved through device tree if + * GPU do not support protected mode switching natively. + * @protected_mode: set to TRUE when GPU is put into protected mode + * @protected_mode_transition: set to TRUE when GPU is transitioning into or + * out of protected mode. + * @protected_mode_support: set to true if protected mode is supported. + * @buslogger: Pointer to the structure required for interfacing + * with the bus logger module to set the size of buffer + * used by the module for capturing bus logs. + * @irq_reset_flush: Flag to indicate that GPU reset is in-flight and flush of + * IRQ + bottom half is being done, to prevent the writes + * to MMU_IRQ_CLEAR & MMU_IRQ_MASK registers. + * @inited_subsys: Bitmap of inited sub systems at the time of device probe. + * Used during device remove or for handling error in probe. + * @hwaccess_lock: Lock, which can be taken from IRQ context, to serialize + * the updates made to Job dispatcher + scheduler states. + * @mmu_hw_mutex: Protects access to MMU operations and address space + * related state. + * @serialize_jobs: Currently used mode for serialization of jobs, both + * intra & inter slots serialization is supported. + * @backup_serialize_jobs: Copy of the original value of @serialize_jobs taken + * when GWT is enabled. Used to restore the original value + * on disabling of GWT. + * @js_ctx_scheduling_mode: Context scheduling mode currently being used by + * Job Scheduler + */ struct kbase_device { - s8 slot_submit_count_irq[BASE_JM_MAX_NR_SLOTS]; - u32 hw_quirks_sc; u32 hw_quirks_tiler; u32 hw_quirks_mmu; @@ -1015,12 +1457,7 @@ struct kbase_device { struct kbase_mmu_mode const *mmu_mode; struct kbase_as as[BASE_MAX_NR_AS]; - /* The below variables (as_free and as_to_kctx) are managed by the - * Context Scheduler. The kbasep_js_device_data::runpool_irq::lock must - * be held whilst accessing these. - */ u16 as_free; /* Bitpattern of free Address Spaces */ - /* Mapping from active Address Spaces to kbase_context */ struct kbase_context *as_to_kctx[BASE_MAX_NR_AS]; @@ -1028,53 +1465,28 @@ struct kbase_device { struct kbase_gpu_props gpu_props; - /** List of SW workarounds for HW issues */ unsigned long hw_issues_mask[(BASE_HW_ISSUE_END + BITS_PER_LONG - 1) / BITS_PER_LONG]; - /** List of features available */ unsigned long hw_features_mask[(BASE_HW_FEATURE_END + BITS_PER_LONG - 1) / BITS_PER_LONG]; - /* Bitmaps of cores that are currently in use (running jobs). - * These should be kept up to date by the job scheduler. - * - * pm.power_change_lock should be held when accessing these members. - * - * kbase_pm_check_transitions_nolock() should be called when bits are - * cleared to update the power management system and allow transitions to - * occur. */ u64 shader_inuse_bitmap; - /* Refcount for cores in use */ u32 shader_inuse_cnt[64]; - /* Bitmaps of cores the JS needs for jobs ready to run */ u64 shader_needed_bitmap; - /* Refcount for cores needed */ u32 shader_needed_cnt[64]; u32 tiler_inuse_cnt; u32 tiler_needed_cnt; - /* struct for keeping track of the disjoint information - * - * The state is > 0 if the GPU is in a disjoint state. Otherwise 0 - * The count is the number of disjoint events that have occurred on the GPU - */ struct { atomic_t count; atomic_t state; } disjoint_event; - /* Refcount for tracking users of the l2 cache, e.g. when using hardware counter instrumentation. */ u32 l2_users_count; - /* Bitmaps of cores that are currently available (powered up and the power policy is happy for jobs to be - * submitted to these cores. These are updated by the power management code. The job scheduler should avoid - * submitting new jobs to any cores that are not marked as available. - * - * pm.power_change_lock should be held when accessing these members. - */ u64 shader_available_bitmap; u64 tiler_available_bitmap; u64 l2_available_bitmap; @@ -1083,10 +1495,9 @@ struct kbase_device { u64 shader_ready_bitmap; u64 shader_transitioning_bitmap; - s8 nr_hw_address_spaces; /**< Number of address spaces in the GPU (constant after driver initialisation) */ - s8 nr_user_address_spaces; /**< Number of address spaces available to user contexts */ + s8 nr_hw_address_spaces; + s8 nr_user_address_spaces; - /* Structure used for instrumentation and HW counters dumping */ struct kbase_hwcnt { /* The lock should be used when accessing any of the following members */ spinlock_t lock; @@ -1110,10 +1521,8 @@ struct kbase_device { struct mutex cacheclean_lock; - /* Platform specific private data to be accessed by mali_kbase_config_xxx.c only */ void *platform_context; - /* List of kbase_contexts created */ struct list_head kctx_list; struct mutex kctx_list_lock; @@ -1126,6 +1535,7 @@ struct kbase_device { u64 current_core_mask; struct kbase_devfreq_opp *opp_table; int num_opps; + struct kbasep_pm_metrics last_devfreq_metrics; struct monitor_dev_info *mdev_info; #ifdef CONFIG_DEVFREQ_THERMAL #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0) @@ -1133,13 +1543,38 @@ struct kbase_device { #else struct thermal_cooling_device *devfreq_cooling; #endif - /* Current IPA model - true for configured model, false for fallback */ atomic_t ipa_use_configured_model; struct { /* Access to this struct must be with ipa.lock held */ struct mutex lock; struct kbase_ipa_model *configured_model; struct kbase_ipa_model *fallback_model; + + /* Values of the PM utilization metrics from last time the + * power model was invoked. The utilization is calculated as + * the difference between last_metrics and the current values. + */ + struct kbasep_pm_metrics last_metrics; + + /* + * gpu_active_callback - Inform IPA that GPU is now active + * @model_data: Pointer to model data + */ + void (*gpu_active_callback)( + struct kbase_ipa_model_vinstr_data *model_data); + + /* + * gpu_idle_callback - Inform IPA that GPU is now idle + * @model_data: Pointer to model data + */ + void (*gpu_idle_callback)( + struct kbase_ipa_model_vinstr_data *model_data); + + /* Model data to pass to ipa_gpu_active/idle() */ + struct kbase_ipa_model_vinstr_data *model_data; + + /* true if IPA is currently using vinstr */ + bool vinstr_active; } ipa; #endif /* CONFIG_DEVFREQ_THERMAL */ #endif /* CONFIG_MALI_BIFROST_DEVFREQ */ @@ -1149,79 +1584,52 @@ struct kbase_device { struct kbase_trace_kbdev_timeline timeline; #endif - /* - * Control for enabling job dump on failure, set when control debugfs - * is opened. - */ bool job_fault_debug; #ifdef CONFIG_DEBUG_FS - /* directory for debugfs entries */ struct dentry *mali_debugfs_directory; - /* Root directory for per context entry */ struct dentry *debugfs_ctx_directory; #ifdef CONFIG_MALI_BIFROST_DEBUG - /* bit for each as, set if there is new data to report */ u64 debugfs_as_read_bitmap; #endif /* CONFIG_MALI_BIFROST_DEBUG */ - /* failed job dump, used for separate debug process */ wait_queue_head_t job_fault_wq; wait_queue_head_t job_fault_resume_wq; struct workqueue_struct *job_fault_resume_workq; struct list_head job_fault_event_list; spinlock_t job_fault_event_lock; - struct kbase_context *kctx_fault; #if !MALI_CUSTOMER_RELEASE - /* Per-device data for register dumping interface */ struct { - u16 reg_offset; /* Offset of a GPU_CONTROL register to be - dumped upon request */ + u16 reg_offset; } regs_dump_debugfs_data; #endif /* !MALI_CUSTOMER_RELEASE */ #endif /* CONFIG_DEBUG_FS */ - /* fbdump profiling controls set by gator */ u32 kbase_profiling_controls[FBDUMP_CONTROL_MAX]; #if MALI_CUSTOMER_RELEASE == 0 - /* Number of jobs that are run before a job is forced to fail and - * replay. May be KBASEP_FORCE_REPLAY_DISABLED, to disable forced - * failures. */ int force_replay_limit; - /* Count of jobs between forced failures. Incremented on each job. A - * job is forced to fail once this is greater than or equal to - * force_replay_limit. */ int force_replay_count; - /* Core requirement for jobs to be failed and replayed. May be zero. */ base_jd_core_req force_replay_core_req; - /* true if force_replay_limit should be randomized. The random - * value will be in the range of 1 - KBASEP_FORCE_REPLAY_RANDOM_LIMIT. - */ bool force_replay_random; #endif - /* Total number of created contexts */ atomic_t ctx_num; #ifdef CONFIG_DEBUG_FS - /* Holds the most recent register accesses */ struct kbase_io_history io_history; #endif /* CONFIG_DEBUG_FS */ struct kbase_hwaccess_data hwaccess; - /* Count of page/bus faults waiting for workqueues to process */ atomic_t faults_pending; - /* true if GPU is powered off or power off operation is in progress */ bool poweroff_pending; - /* defaults for new context created for this device */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)) bool infinite_cache_active_default; #else @@ -1229,65 +1637,45 @@ struct kbase_device { #endif size_t mem_pool_max_size_default; - /* current gpu coherency mode */ u32 current_gpu_coherency_mode; - /* system coherency mode */ u32 system_coherency; - /* Flag to track when cci snoops have been enabled on the interface */ + bool cci_snoop_enabled; - /* SMC function IDs to call into Trusted firmware to enable/disable - * cache snooping. Value of 0 indicates that they are not used - */ u32 snoop_enable_smc; u32 snoop_disable_smc; - /* Protected mode operations */ struct protected_mode_ops *protected_ops; - /* Protected device attached to this kbase device */ struct protected_mode_device *protected_dev; - /* - * true when GPU is put into protected mode - */ bool protected_mode; - /* - * true when GPU is transitioning into or out of protected mode - */ bool protected_mode_transition; - /* - * true if protected mode is supported - */ bool protected_mode_support; - -#ifdef CONFIG_MALI_BIFROST_DEBUG - wait_queue_head_t driver_inactive_wait; - bool driver_inactive; -#endif /* CONFIG_MALI_BIFROST_DEBUG */ - #ifdef CONFIG_MALI_FPGA_BUS_LOGGER - /* - * Bus logger integration. - */ struct bus_logger_client *buslogger; #endif - /* Boolean indicating if an IRQ flush during reset is in progress. */ + bool irq_reset_flush; - /* list of inited sub systems. Used during terminate/error recovery */ u32 inited_subsys; spinlock_t hwaccess_lock; - /* Protects access to MMU operations */ struct mutex mmu_hw_mutex; - /* Current serialization mode. See KBASE_SERIALIZE_* for details */ + /* See KBASE_SERIALIZE_* for details */ u8 serialize_jobs; + +#ifdef CONFIG_MALI_JOB_DUMP + u8 backup_serialize_jobs; +#endif + + /* See KBASE_JS_*_PRIORITY_MODE for details. */ + u32 js_ctx_scheduling_mode; }; /** @@ -1344,6 +1732,26 @@ struct jsctx_queue { * context, to disable use of implicit dma-buf fences. This is used to avoid * potential synchronization deadlocks. * + * @KCTX_FORCE_SAME_VA: Set when BASE_MEM_SAME_VA should be forced on memory + * allocations. For 64-bit clients it is enabled by default, and disabled by + * default on 32-bit clients. Being able to clear this flag is only used for + * testing purposes of the custom zone allocation on 64-bit user-space builds, + * where we also require more control than is available through e.g. the JIT + * allocation mechanism. However, the 64-bit user-space client must still + * reserve a JIT region using KBASE_IOCTL_MEM_JIT_INIT + * + * @KCTX_PULLED_SINCE_ACTIVE_JS0: Set when the context has had an atom pulled + * from it for job slot 0. This is reset when the context first goes active or + * is re-activated on that slot. + * + * @KCTX_PULLED_SINCE_ACTIVE_JS1: Set when the context has had an atom pulled + * from it for job slot 1. This is reset when the context first goes active or + * is re-activated on that slot. + * + * @KCTX_PULLED_SINCE_ACTIVE_JS2: Set when the context has had an atom pulled + * from it for job slot 2. This is reset when the context first goes active or + * is re-activated on that slot. + * * All members need to be separate bits. This enum is intended for use in a * bitmask where multiple values get OR-ed together. */ @@ -1359,6 +1767,10 @@ enum kbase_context_flags { KCTX_SCHEDULED = 1U << 8, KCTX_DYING = 1U << 9, KCTX_NO_IMPLICIT_SYNC = 1U << 10, + KCTX_FORCE_SAME_VA = 1U << 11, + KCTX_PULLED_SINCE_ACTIVE_JS0 = 1U << 12, + KCTX_PULLED_SINCE_ACTIVE_JS1 = 1U << 13, + KCTX_PULLED_SINCE_ACTIVE_JS2 = 1U << 14, }; struct kbase_sub_alloc { @@ -1367,10 +1779,239 @@ struct kbase_sub_alloc { DECLARE_BITMAP(sub_pages, SZ_2M / SZ_4K); }; +/** + * struct kbase_context - Object representing an entity, among which GPU is + * scheduled and gets its own GPU address space. + * Created when the device file /dev/malixx is opened. + * @filp: Pointer to the struct file corresponding to device file + * /dev/malixx instance, passed to the file's open method. + * @kbdev: Pointer to the Kbase device for which the context is created. + * @id: Unique indentifier for the context, indicates the number of + * contexts which have been created for the device so far. + * @api_version: contains the version number for User/kernel interface, + * used for compatibility check. + * @pgd: Physical address of the page allocated for the top level + * page table of the context, this will be used for MMU Hw + * programming as the address translation will start from + * the top level page table. + * @event_list: list of posted events about completed atoms, to be sent to + * event handling thread of Userpsace. + * @event_coalesce_list: list containing events corresponding to successive atoms + * which have requested deferred delivery of the completion + * events to Userspace. + * @event_mutex: Lock to protect the concurrent access to @event_list & + * @event_mutex. + * @event_closed: Flag set through POST_TERM ioctl, indicates that Driver + * should stop posting events and also inform event handling + * thread that context termination is in progress. + * @event_workq: Workqueue for processing work items corresponding to atoms + * that do not return an event to Userspace or have to perform + * a replay job + * @event_count: Count of the posted events to be consumed by Userspace. + * @event_coalesce_count: Count of the events present in @event_coalesce_list. + * @flags: bitmap of enums from kbase_context_flags, indicating the + * state & attributes for the context. + * @setup_complete: Indicates if the setup for context has completed, i.e. + * flags have been set for the context. Driver allows only + * 2 ioctls until the setup is done. Valid only for + * @api_version value 0. + * @setup_in_progress: Indicates if the context's setup is in progress and other + * setup calls during that shall be rejected. + * @mmu_teardown_pages: Buffer of 4 Pages in size, used to cache the entries of + * top & intermediate level page tables to avoid repeated + * calls to kmap_atomic during the MMU teardown. + * @aliasing_sink_page: Special page used for KBASE_MEM_TYPE_ALIAS allocations, + * which can alias number of memory regions. The page is + * represent a region where it is mapped with a write-alloc + * cache setup, typically used when the write result of the + * GPU isn't needed, but the GPU must write anyway. + * @mem_partials_lock: Lock for protecting the operations done on the elements + * added to @mem_partials list. + * @mem_partials: List head for the list of large pages, 2MB in size, which + * which have been split into 4 KB pages and are used + * partially for the allocations >= 2 MB in size. + * @mmu_lock: Lock to serialize the accesses made to multi level GPU + * page tables, maintained for every context. + * @reg_lock: Lock used for GPU virtual address space management operations, + * like adding/freeing a memory region in the address space. + * Can be converted to a rwlock ?. + * @reg_rbtree_same: RB tree of the memory regions allocated from the SAME_VA + * zone of the GPU virtual address space. Used for allocations + * having the same value for GPU & CPU virtual address. + * @reg_rbtree_exec: RB tree of the memory regions allocated from the EXEC + * zone of the GPU virtual address space. Used for + * allocations containing executable code for + * shader programs. + * @reg_rbtree_custom: RB tree of the memory regions allocated from the CUSTOM_VA + * zone of the GPU virtual address space. + * @cookies: Bitmask containing of BITS_PER_LONG bits, used mainly for + * SAME_VA allocations to defer the reservation of memory region + * (from the GPU virtual address space) from base_mem_alloc + * ioctl to mmap system call. This helps returning unique + * handles, disguised as GPU VA, to Userspace from base_mem_alloc + * and later retrieving the pointer to memory region structure + * in the mmap handler. + * @pending_regions: Array containing pointers to memory region structures, + * used in conjunction with @cookies bitmask mainly for + * providing a mechansim to have the same value for CPU & + * GPU virtual address. + * @event_queue: Wait queue used for blocking the thread, which consumes + * the base_jd_event corresponding to an atom, when there + * are no more posted events. + * @tgid: thread group id of the process, whose thread opened the + * device file /dev/malixx instance to create a context. + * @pid: id of the thread, corresponding to process @tgid, which + * actually which opened the device file. + * @jctx: object encapsulating all the Job dispatcher related state, + * including the array of atoms. + * @used_pages: Keeps a track of the number of 4KB physical pages in use + * for the context. + * @nonmapped_pages: Updated in the same way as @used_pages, except for the case + * when special tracking page is freed by userspace where it + * is reset to 0. + * @mem_pool: Object containing the state for the context specific pool of + * 4KB size physical pages. + * @lp_mem_pool: Object containing the state for the context specific pool of + * 2MB size physical pages. + * @reclaim: Shrinker object registered with the kernel containing + * the pointer to callback function which is invoked under + * low memory conditions. In the callback function Driver + * frees up the memory for allocations marked as + * evictable/reclaimable. + * @evict_list: List head for the list containing the allocations which + * can be evicted or freed up in the shrinker callback. + * @waiting_soft_jobs: List head for the list containing softjob atoms, which + * are either waiting for the event set operation, or waiting + * for the signaling of input fence or waiting for the GPU + * device to powered on so as to dump the CPU/GPU timestamps. + * @waiting_soft_jobs_lock: Lock to protect @waiting_soft_jobs list from concurrent + * accesses. + * @dma_fence: Object containing list head for the list of dma-buf fence + * waiting atoms and the waitqueue to process the work item + * queued for the atoms blocked on the signaling of dma-buf + * fences. + * @as_nr: id of the address space being used for the scheduled in + * context. This is effectively part of the Run Pool, because + * it only has a valid setting (!=KBASEP_AS_NR_INVALID) whilst + * the context is scheduled in. The hwaccess_lock must be held + * whilst accessing this. + * If the context relating to this value of as_nr is required, + * then the context must be retained to ensure that it doesn't + * disappear whilst it is being used. Alternatively, hwaccess_lock + * can be held to ensure the context doesn't disappear (but this + * has restrictions on what other locks can be taken simutaneously). + * @refcount: Keeps track of the number of users of this context. A user + * can be a job that is available for execution, instrumentation + * needing to 'pin' a context for counter collection, etc. + * If the refcount reaches 0 then this context is considered + * inactive and the previously programmed AS might be cleared + * at any point. + * Generally the reference count is incremented when the context + * is scheduled in and an atom is pulled from the context's per + * slot runnable tree. + * @mm_update_lock: lock used for handling of special tracking page. + * @process_mm: Pointer to the memory descriptor of the process which + * created the context. Used for accounting the physical + * pages used for GPU allocations, done for the context, + * to the memory consumed by the process. + * @same_va_end: End address of the SAME_VA zone (in 4KB page units) + * @timeline: Object tracking the number of atoms currently in flight for + * the context and thread group id of the process, i.e. @tgid. + * @mem_profile_data: Buffer containing the profiling information provided by + * Userspace, can be read through the mem_profile debugfs file. + * @mem_profile_size: Size of the @mem_profile_data. + * @mem_profile_lock: Lock to serialize the operations related to mem_profile + * debugfs file. + * @kctx_dentry: Pointer to the debugfs directory created for every context, + * inside kbase_device::debugfs_ctx_directory, containing + * context specific files. + * @reg_dump: Buffer containing a register offset & value pair, used + * for dumping job fault debug info. + * @job_fault_count: Indicates that a job fault occurred for the context and + * dumping of its debug info is in progress. + * @job_fault_resume_event_list: List containing atoms completed after the faulty + * atom but before the debug data for faulty atom was dumped. + * @jsctx_queue: Per slot & priority arrays of object containing the root + * of RB-tree holding currently runnable atoms on the job slot + * and the head item of the linked list of atoms blocked on + * cross-slot dependencies. + * @atoms_pulled: Total number of atoms currently pulled from the context. + * @atoms_pulled_slot: Per slot count of the number of atoms currently pulled + * from the context. + * @atoms_pulled_slot_pri: Per slot & priority count of the number of atoms currently + * pulled from the context. hwaccess_lock shall be held when + * accessing it. + * @blocked_js: Indicates if the context is blocked from submitting atoms + * on a slot at a given priority. This is set to true, when + * the atom corresponding to context is soft/hard stopped or + * removed from the HEAD_NEXT register in response to + * soft/hard stop. + * @slots_pullable: Bitmask of slots, indicating the slots for which the + * context has pullable atoms in the runnable tree. + * @work: Work structure used for deferred ASID assignment. + * @vinstr_cli: Pointer to the legacy userspace vinstr client, there can + * be only such client per kbase context. + * @vinstr_cli_lock: Lock used for the vinstr ioctl calls made for @vinstr_cli. + * @completed_jobs: List containing completed atoms for which base_jd_event is + * to be posted. + * @work_count: Number of work items, corresponding to atoms, currently + * pending on job_done workqueue of @jctx. + * @soft_job_timeout: Timer object used for failing/cancelling the waiting + * soft-jobs which have been blocked for more than the + * timeout value used for the soft-jobs + * @jit_alloc: Array of 256 pointers to GPU memory regions, used for + * for JIT allocations. + * @jit_max_allocations: Maximum number of JIT allocations allowed at once. + * @jit_current_allocations: Current number of in-flight JIT allocations. + * @jit_current_allocations_per_bin: Current number of in-flight JIT allocations per bin + * @jit_version: version number indicating whether userspace is using + * old or new version of interface for JIT allocations + * 1 -> client used KBASE_IOCTL_MEM_JIT_INIT_OLD + * 2 -> client used KBASE_IOCTL_MEM_JIT_INIT + * @jit_active_head: List containing the JIT allocations which are in use. + * @jit_pool_head: List containing the JIT allocations which have been + * freed up by userpsace and so not being used by them. + * Driver caches them to quickly fulfill requests for new + * JIT allocations. They are released in case of memory + * pressure as they are put on the @evict_list when they + * are freed up by userspace. + * @jit_destroy_head: List containing the JIT allocations which were moved to it + * from @jit_pool_head, in the shrinker callback, after freeing + * their backing physical pages. + * @jit_evict_lock: Lock used for operations done on JIT allocations and also + * for accessing @evict_list. + * @jit_work: Work item queued to defer the freeing of memory region when + * JIT allocation is moved to @jit_destroy_head. + * @jit_atoms_head: A list of the JIT soft-jobs, both alloc & free, in submission + * order, protected by kbase_jd_context.lock. + * @jit_pending_alloc: A list of JIT alloc soft-jobs for which allocation will be + * reattempted after the impending free of other active JIT + * allocations. + * @ext_res_meta_head: A list of sticky external resources which were requested to + * be mapped on GPU side, through a softjob atom of type + * EXT_RES_MAP or STICKY_RESOURCE_MAP ioctl. + * @drain_pending: Used to record that a flush/invalidate of the GPU caches was + * requested from atomic context, so that the next flush request + * can wait for the flush of GPU writes. + * @age_count: Counter incremented on every call to jd_submit_atom, + * atom is assigned the snapshot of this counter, which + * is used to determine the atom's age when it is added to + * the runnable RB-tree. + * @trim_level: Level of JIT allocation trimming to perform on free (0-100%) + * @gwt_enabled: Indicates if tracking of GPU writes is enabled, protected by + * kbase_context.reg_lock. + * @gwt_was_enabled: Simple sticky bit flag to know if GWT was ever enabled. + * @gwt_current_list: A list of addresses for which GPU has generated write faults, + * after the last snapshot of it was sent to userspace. + * @gwt_snapshot_list: Snapshot of the @gwt_current_list for sending to user space. + * @priority: Indicates the context priority. Used along with @atoms_count + * for context scheduling, protected by hwaccess_lock. + * @atoms_count: Number of gpu atoms currently in use, per priority + */ struct kbase_context { struct file *filp; struct kbase_device *kbdev; - u32 id; /* System wide unique id */ + u32 id; unsigned long api_version; phys_addr_t pgd; struct list_head event_list; @@ -1394,13 +2035,10 @@ struct kbase_context { struct list_head mem_partials; struct mutex mmu_lock; - struct mutex reg_lock; /* To be converted to a rwlock? */ - struct rb_root reg_rbtree_same; /* RB tree of GPU (live) regions, - * SAME_VA zone */ - struct rb_root reg_rbtree_exec; /* RB tree of GPU (live) regions, - * EXEC zone */ - struct rb_root reg_rbtree_custom; /* RB tree of GPU (live) regions, - * CUSTOM_VA zone */ + struct mutex reg_lock; + struct rb_root reg_rbtree_same; + struct rb_root reg_rbtree_exec; + struct rb_root reg_rbtree_custom; unsigned long cookies; struct kbase_va_region *pending_regions[BITS_PER_LONG]; @@ -1421,33 +2059,15 @@ struct kbase_context { struct list_head waiting_soft_jobs; spinlock_t waiting_soft_jobs_lock; -#ifdef CONFIG_KDS - struct list_head waiting_kds_resource; -#endif #ifdef CONFIG_MALI_BIFROST_DMA_FENCE struct { struct list_head waiting_resource; struct workqueue_struct *wq; } dma_fence; #endif /* CONFIG_MALI_BIFROST_DMA_FENCE */ - /** This is effectively part of the Run Pool, because it only has a valid - * setting (!=KBASEP_AS_NR_INVALID) whilst the context is scheduled in - * - * The hwaccess_lock must be held whilst accessing this. - * - * If the context relating to this as_nr is required, you must use - * kbasep_js_runpool_retain_ctx() to ensure that the context doesn't disappear - * whilst you're using it. Alternatively, just hold the hwaccess_lock - * to ensure the context doesn't disappear (but this has restrictions on what other locks - * you can take whilst doing this) */ + int as_nr; - /* Keeps track of the number of users of this context. A user can be a - * job that is available for execution, instrumentation needing to 'pin' - * a context for counter collection, etc. If the refcount reaches 0 then - * this context is considered inactive and the previously programmed - * AS might be cleared at any point. - */ atomic_t refcount; /* NOTE: @@ -1458,28 +2078,19 @@ struct kbase_context { * All other flags must be added there */ spinlock_t mm_update_lock; struct mm_struct *process_mm; - /* End of the SAME_VA zone */ u64 same_va_end; #ifdef CONFIG_MALI_BIFROST_TRACE_TIMELINE struct kbase_trace_kctx_timeline timeline; #endif #ifdef CONFIG_DEBUG_FS - /* Content of mem_profile file */ char *mem_profile_data; - /* Size of @c mem_profile_data */ size_t mem_profile_size; - /* Mutex guarding memory profile state */ struct mutex mem_profile_lock; - /* Memory profile directory under debugfs */ struct dentry *kctx_dentry; - /* for job fault debug */ unsigned int *reg_dump; atomic_t job_fault_count; - /* This list will keep the following atoms during the dump - * in the same context - */ struct list_head job_fault_resume_event_list; #endif /* CONFIG_DEBUG_FS */ @@ -1487,67 +2098,82 @@ struct kbase_context { struct jsctx_queue jsctx_queue [KBASE_JS_ATOM_SCHED_PRIO_COUNT][BASE_JM_MAX_NR_SLOTS]; - /* Number of atoms currently pulled from this context */ atomic_t atoms_pulled; - /* Number of atoms currently pulled from this context, per slot */ atomic_t atoms_pulled_slot[BASE_JM_MAX_NR_SLOTS]; - /* Number of atoms currently pulled from this context, per slot and - * priority. Hold hwaccess_lock when accessing */ int atoms_pulled_slot_pri[BASE_JM_MAX_NR_SLOTS][ KBASE_JS_ATOM_SCHED_PRIO_COUNT]; - /* true if slot is blocked on the given priority. This will be set on a - * soft-stop */ bool blocked_js[BASE_JM_MAX_NR_SLOTS][KBASE_JS_ATOM_SCHED_PRIO_COUNT]; - /* Bitmask of slots that can be pulled from */ u32 slots_pullable; - /* Backend specific data */ - struct kbase_context_backend backend; - - /* Work structure used for deferred ASID assignment */ struct work_struct work; - /* Only one userspace vinstr client per kbase context */ struct kbase_vinstr_client *vinstr_cli; struct mutex vinstr_cli_lock; - /* List of completed jobs waiting for events to be posted */ struct list_head completed_jobs; - /* Number of work items currently pending on job_done_wq */ atomic_t work_count; - /* Waiting soft-jobs will fail when this timer expires */ struct timer_list soft_job_timeout; - /* JIT allocation management */ struct kbase_va_region *jit_alloc[256]; + u8 jit_max_allocations; + u8 jit_current_allocations; + u8 jit_current_allocations_per_bin[256]; + u8 jit_version; struct list_head jit_active_head; struct list_head jit_pool_head; struct list_head jit_destroy_head; struct mutex jit_evict_lock; struct work_struct jit_work; - /* A list of the JIT soft-jobs in submission order - * (protected by kbase_jd_context.lock) - */ struct list_head jit_atoms_head; - /* A list of pending JIT alloc soft-jobs (using the 'queue' list_head) - * (protected by kbase_jd_context.lock) - */ struct list_head jit_pending_alloc; - /* External sticky resource management */ struct list_head ext_res_meta_head; - /* Used to record that a drain was requested from atomic context */ atomic_t drain_pending; - /* Current age count, used to determine age for newly submitted atoms */ u32 age_count; + + u8 trim_level; + +#ifdef CONFIG_MALI_JOB_DUMP + bool gwt_enabled; + + bool gwt_was_enabled; + + struct list_head gwt_current_list; + + struct list_head gwt_snapshot_list; +#endif + + int priority; + s16 atoms_count[KBASE_JS_ATOM_SCHED_PRIO_COUNT]; }; +#ifdef CONFIG_MALI_JOB_DUMP +/** + * struct kbasep_gwt_list_element - Structure used to collect GPU + * write faults. + * @link: List head for adding write faults. + * @region: Details of the region where we have the + * faulting page address. + * @page_addr: Page address where GPU write fault occurred. + * @num_pages: The number of pages modified. + * + * Using this structure all GPU write faults are stored in a list. + */ +struct kbasep_gwt_list_element { + struct list_head link; + struct kbase_va_region *region; + u64 page_addr; + u64 num_pages; +}; + +#endif + /** * struct kbase_ctx_ext_res_meta - Structure which binds an external resource * to a @kbase_context. diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_device.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_device.c index 2d11f11f3be0f9..005ae088686bdb 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_device.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_device.c @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Base kernel device APIs */ @@ -94,7 +99,6 @@ static int kbase_device_as_init(struct kbase_device *kbdev, int i) destroy_workqueue(kbdev->as[i].pf_wq); return -EINVAL; } - KBASE_DEBUG_ASSERT(!object_is_on_stack(poke_work)); INIT_WORK(poke_work, kbasep_as_do_poke); hrtimer_init(poke_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); @@ -250,10 +254,6 @@ int kbase_device_init(struct kbase_device * const kbdev) else kbdev->mmu_mode = kbase_mmu_mode_get_lpae(); -#ifdef CONFIG_MALI_BIFROST_DEBUG - init_waitqueue_head(&kbdev->driver_inactive_wait); -#endif /* CONFIG_MALI_BIFROST_DEBUG */ - return 0; term_trace: kbasep_trace_term(kbdev); diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_disjoint_events.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_disjoint_events.c index f70bcccf4050f5..68eb4ed0715dd5 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_disjoint_events.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_disjoint_events.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Base kernel disjoint events helper functions */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_dma_fence.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_dma_fence.c index 8a571266534b1f..9af59bb56d1cbd 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_dma_fence.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_dma_fence.c @@ -7,15 +7,20 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* Include mali_kbase_dma_fence.h before checking for CONFIG_MALI_BIFROST_DMA_FENCE as * it will be set there. */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_dma_fence.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_dma_fence.h index b02ea9774c4f93..1adb4fa00469b4 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_dma_fence.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_dma_fence.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_DMA_FENCE_H_ #define _KBASE_DMA_FENCE_H_ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_event.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_event.c index 188148645f374b..e290fceea6cd17 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_event.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_event.c @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> #include <mali_kbase_debug.h> #include <mali_kbase_tlstream.h> diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence.c index fcb373372596a1..ac8272c900bba3 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <linux/atomic.h> #include <linux/list.h> #include <linux/spinlock.h> @@ -176,8 +181,13 @@ kbase_fence_add_callback(struct kbase_jd_atom *katom, err = dma_fence_add_callback(fence, &kbase_fence_cb->fence_cb, callback); if (err == -ENOENT) { - /* Fence signaled, clear the error and return */ - err = 0; + /* Fence signaled, get the completion result */ + err = dma_fence_get_status(fence); + + /* remap success completion to err code */ + if (err == 1) + err = 0; + kfree(kbase_fence_cb); } else if (err) { kfree(kbase_fence_cb); diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence.h index 9f59d30a1e2e8f..414f3f4d743675 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence.h @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_FENCE_H_ #define _KBASE_FENCE_H_ @@ -134,8 +139,11 @@ static inline bool kbase_fence_out_is_ours(struct kbase_jd_atom *katom) static inline int kbase_fence_out_signal(struct kbase_jd_atom *katom, int status) { -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)) - katom->dma_fence.fence->error = status; +#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE && \ + KERNEL_VERSION(4, 9, 68) <= LINUX_VERSION_CODE) + fence_set_error(katom->dma_fence.fence, status); +#elif (KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE) + dma_fence_set_error(katom->dma_fence.fence, status); #else katom->dma_fence.fence->status = status; #endif diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence_defs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence_defs.h index d2d7c436918c60..475136430649c9 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence_defs.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence_defs.h @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_FENCE_DEFS_H_ #define _KBASE_FENCE_DEFS_H_ @@ -40,10 +45,22 @@ #define dma_fence_add_callback(a, b, c) fence_add_callback(a, b, c) #define dma_fence_remove_callback(a, b) fence_remove_callback(a, b) +#if (KERNEL_VERSION(4, 9, 68) <= LINUX_VERSION_CODE) +#define dma_fence_get_status(a) (fence_is_signaled(a) ? (a)->error ?: 1 : 0) +#else +#define dma_fence_get_status(a) (fence_is_signaled(a) ? (a)->status ?: 1 : 0) +#endif + #else #include <linux/dma-fence.h> +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)) +#define dma_fence_get_status(a) (dma_fence_is_signaled(a) ? \ + (a)->status ?: 1 \ + : 0) +#endif + #endif /* < 4.10.0 */ #endif /* CONFIG_MALI_BIFROST_DMA_FENCE || CONFIG_SYNC_FILE */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator.h index 87697b15d9869d..aeaf439d30976d 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* NB taken from gator */ /* * List of possible actions to be controlled by DS-5 Streamline. diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_api.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_api.c index 860e10159fb35d..040b2096bec6f6 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_api.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_api.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include "mali_kbase.h" #include "mali_kbase_hw.h" #include "mali_kbase_mem_linux.h" @@ -68,6 +73,10 @@ const char * const *kbase_gator_hwcnt_init_names(uint32_t *total_counters) hardware_counters = hardware_counters_mali_tSIx; count = ARRAY_SIZE(hardware_counters_mali_tSIx); break; + case GPU_ID2_PRODUCT_TNOX: + hardware_counters = hardware_counters_mali_tNOx; + count = ARRAY_SIZE(hardware_counters_mali_tNOx); + break; default: hardware_counters = NULL; count = 0; @@ -149,7 +158,7 @@ KBASE_EXPORT_SYMBOL(kbase_gator_hwcnt_term_names); struct kbase_gator_hwcnt_handles *kbase_gator_hwcnt_init(struct kbase_gator_hwcnt_info *in_out_info) { struct kbase_gator_hwcnt_handles *hand; - struct kbase_uk_hwcnt_reader_setup setup; + struct kbase_ioctl_hwcnt_reader_setup setup; uint32_t dump_size = 0, i = 0; if (!in_out_info) diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_api.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_api.h index ef9ac0f7b633d9..bd0589ed6c1a0e 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_api.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_api.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_GATOR_API_H_ #define _KBASE_GATOR_API_H_ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names.h index 24103e292453d5..5d38c7b735531b 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_GATOR_HWCNT_NAMES_H_ #define _KBASE_GATOR_HWCNT_NAMES_H_ @@ -2162,6 +2167,12 @@ static const char * const hardware_counters_mali_t88x[] = { #include "mali_kbase_gator_hwcnt_names_tsix.h" +#include "mali_kbase_gator_hwcnt_names_tnox.h" + +#include "mali_kbase_gator_hwcnt_names_tgox.h" + +#include "mali_kbase_gator_hwcnt_names_tkax.h" +#include "mali_kbase_gator_hwcnt_names_ttrx.h" #endif diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tgox.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tgox.h new file mode 100644 index 00000000000000..72b5266622a9d2 --- /dev/null +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tgox.h @@ -0,0 +1,296 @@ +/* + * + * (C) COPYRIGHT 2016-2018 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 + * + */ + +/* + * This header was autogenerated, it should not be edited. + */ + +#ifndef _KBASE_GATOR_HWCNT_NAMES_TGOX_H_ +#define _KBASE_GATOR_HWCNT_NAMES_TGOX_H_ + +static const char * const hardware_counters_mali_tGOx[] = { + /* Performance counters for the Job Manager */ + "", + "", + "", + "", + "TGOx_MESSAGES_SENT", + "TGOx_MESSAGES_RECEIVED", + "TGOx_GPU_ACTIVE", + "TGOx_IRQ_ACTIVE", + "TGOx_JS0_JOBS", + "TGOx_JS0_TASKS", + "TGOx_JS0_ACTIVE", + "", + "TGOx_JS0_WAIT_READ", + "TGOx_JS0_WAIT_ISSUE", + "TGOx_JS0_WAIT_DEPEND", + "TGOx_JS0_WAIT_FINISH", + "TGOx_JS1_JOBS", + "TGOx_JS1_TASKS", + "TGOx_JS1_ACTIVE", + "", + "TGOx_JS1_WAIT_READ", + "TGOx_JS1_WAIT_ISSUE", + "TGOx_JS1_WAIT_DEPEND", + "TGOx_JS1_WAIT_FINISH", + "TGOx_JS2_JOBS", + "TGOx_JS2_TASKS", + "TGOx_JS2_ACTIVE", + "", + "TGOx_JS2_WAIT_READ", + "TGOx_JS2_WAIT_ISSUE", + "TGOx_JS2_WAIT_DEPEND", + "TGOx_JS2_WAIT_FINISH", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + + /* Performance counters for the Tiler */ + "", + "", + "", + "", + "TGOx_TILER_ACTIVE", + "TGOx_JOBS_PROCESSED", + "TGOx_TRIANGLES", + "TGOx_LINES", + "TGOx_POINTS", + "TGOx_FRONT_FACING", + "TGOx_BACK_FACING", + "TGOx_PRIM_VISIBLE", + "TGOx_PRIM_CULLED", + "TGOx_PRIM_CLIPPED", + "TGOx_PRIM_SAT_CULLED", + "TGOx_BIN_ALLOC_INIT", + "TGOx_BIN_ALLOC_OVERFLOW", + "TGOx_BUS_READ", + "", + "TGOx_BUS_WRITE", + "TGOx_LOADING_DESC", + "TGOx_IDVS_POS_SHAD_REQ", + "TGOx_IDVS_POS_SHAD_WAIT", + "TGOx_IDVS_POS_SHAD_STALL", + "TGOx_IDVS_POS_FIFO_FULL", + "TGOx_PREFETCH_STALL", + "TGOx_VCACHE_HIT", + "TGOx_VCACHE_MISS", + "TGOx_VCACHE_LINE_WAIT", + "TGOx_VFETCH_POS_READ_WAIT", + "TGOx_VFETCH_VERTEX_WAIT", + "TGOx_VFETCH_STALL", + "TGOx_PRIMASSY_STALL", + "TGOx_BBOX_GEN_STALL", + "TGOx_IDVS_VBU_HIT", + "TGOx_IDVS_VBU_MISS", + "TGOx_IDVS_VBU_LINE_DEALLOCATE", + "TGOx_IDVS_VAR_SHAD_REQ", + "TGOx_IDVS_VAR_SHAD_STALL", + "TGOx_BINNER_STALL", + "TGOx_ITER_STALL", + "TGOx_COMPRESS_MISS", + "TGOx_COMPRESS_STALL", + "TGOx_PCACHE_HIT", + "TGOx_PCACHE_MISS", + "TGOx_PCACHE_MISS_STALL", + "TGOx_PCACHE_EVICT_STALL", + "TGOx_PMGR_PTR_WR_STALL", + "TGOx_PMGR_PTR_RD_STALL", + "TGOx_PMGR_CMD_WR_STALL", + "TGOx_WRBUF_ACTIVE", + "TGOx_WRBUF_HIT", + "TGOx_WRBUF_MISS", + "TGOx_WRBUF_NO_FREE_LINE_STALL", + "TGOx_WRBUF_NO_AXI_ID_STALL", + "TGOx_WRBUF_AXI_STALL", + "", + "", + "", + "TGOx_UTLB_TRANS", + "TGOx_UTLB_TRANS_HIT", + "TGOx_UTLB_TRANS_STALL", + "TGOx_UTLB_TRANS_MISS_DELAY", + "TGOx_UTLB_MMU_REQ", + + /* Performance counters for the Shader Core */ + "", + "", + "", + "", + "TGOx_FRAG_ACTIVE", + "TGOx_FRAG_PRIMITIVES", + "TGOx_FRAG_PRIM_RAST", + "TGOx_FRAG_FPK_ACTIVE", + "TGOx_FRAG_STARVING", + "TGOx_FRAG_WARPS", + "TGOx_FRAG_PARTIAL_WARPS", + "TGOx_FRAG_QUADS_RAST", + "TGOx_FRAG_QUADS_EZS_TEST", + "TGOx_FRAG_QUADS_EZS_UPDATE", + "TGOx_FRAG_QUADS_EZS_KILL", + "TGOx_FRAG_LZS_TEST", + "TGOx_FRAG_LZS_KILL", + "TGOx_WARP_REG_SIZE_64", + "TGOx_FRAG_PTILES", + "TGOx_FRAG_TRANS_ELIM", + "TGOx_QUAD_FPK_KILLER", + "TGOx_FULL_QUAD_WARPS", + "TGOx_COMPUTE_ACTIVE", + "TGOx_COMPUTE_TASKS", + "TGOx_COMPUTE_WARPS", + "TGOx_COMPUTE_STARVING", + "TGOx_EXEC_CORE_ACTIVE", + "TGOx_EXEC_ACTIVE", + "TGOx_EXEC_INSTR_COUNT", + "TGOx_EXEC_INSTR_DIVERGED", + "TGOx_EXEC_INSTR_STARVING", + "TGOx_ARITH_INSTR_SINGLE_FMA", + "TGOx_ARITH_INSTR_DOUBLE", + "TGOx_ARITH_INSTR_MSG", + "TGOx_ARITH_INSTR_MSG_ONLY", + "TGOx_TEX_MSGI_NUM_QUADS", + "TGOx_TEX_DFCH_NUM_PASSES", + "TGOx_TEX_DFCH_NUM_PASSES_MISS", + "TGOx_TEX_DFCH_NUM_PASSES_MIP_MAP", + "TGOx_TEX_TIDX_NUM_SPLIT_MIP_MAP", + "TGOx_TEX_TFCH_NUM_LINES_FETCHED", + "TGOx_TEX_TFCH_NUM_LINES_FETCHED_BLOCK", + "TGOx_TEX_TFCH_NUM_OPERATIONS", + "TGOx_TEX_FILT_NUM_OPERATIONS", + "TGOx_LS_MEM_READ_FULL", + "TGOx_LS_MEM_READ_SHORT", + "TGOx_LS_MEM_WRITE_FULL", + "TGOx_LS_MEM_WRITE_SHORT", + "TGOx_LS_MEM_ATOMIC", + "TGOx_VARY_INSTR", + "TGOx_VARY_SLOT_32", + "TGOx_VARY_SLOT_16", + "TGOx_ATTR_INSTR", + "TGOx_ARITH_INSTR_FP_MUL", + "TGOx_BEATS_RD_FTC", + "TGOx_BEATS_RD_FTC_EXT", + "TGOx_BEATS_RD_LSC", + "TGOx_BEATS_RD_LSC_EXT", + "TGOx_BEATS_RD_TEX", + "TGOx_BEATS_RD_TEX_EXT", + "TGOx_BEATS_RD_OTHER", + "TGOx_BEATS_WR_LSC_WB", + "TGOx_BEATS_WR_TIB", + "TGOx_BEATS_WR_LSC_OTHER", + + /* Performance counters for the Memory System */ + "", + "", + "", + "", + "TGOx_MMU_REQUESTS", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "TGOx_L2_RD_MSG_IN", + "TGOx_L2_RD_MSG_IN_STALL", + "TGOx_L2_WR_MSG_IN", + "TGOx_L2_WR_MSG_IN_STALL", + "TGOx_L2_SNP_MSG_IN", + "TGOx_L2_SNP_MSG_IN_STALL", + "TGOx_L2_RD_MSG_OUT", + "TGOx_L2_RD_MSG_OUT_STALL", + "TGOx_L2_WR_MSG_OUT", + "TGOx_L2_ANY_LOOKUP", + "TGOx_L2_READ_LOOKUP", + "TGOx_L2_WRITE_LOOKUP", + "TGOx_L2_EXT_SNOOP_LOOKUP", + "TGOx_L2_EXT_READ", + "TGOx_L2_EXT_READ_NOSNP", + "TGOx_L2_EXT_READ_UNIQUE", + "TGOx_L2_EXT_READ_BEATS", + "TGOx_L2_EXT_AR_STALL", + "TGOx_L2_EXT_AR_CNT_Q1", + "TGOx_L2_EXT_AR_CNT_Q2", + "TGOx_L2_EXT_AR_CNT_Q3", + "TGOx_L2_EXT_RRESP_0_127", + "TGOx_L2_EXT_RRESP_128_191", + "TGOx_L2_EXT_RRESP_192_255", + "TGOx_L2_EXT_RRESP_256_319", + "TGOx_L2_EXT_RRESP_320_383", + "TGOx_L2_EXT_WRITE", + "TGOx_L2_EXT_WRITE_NOSNP_FULL", + "TGOx_L2_EXT_WRITE_NOSNP_PTL", + "TGOx_L2_EXT_WRITE_SNP_FULL", + "TGOx_L2_EXT_WRITE_SNP_PTL", + "TGOx_L2_EXT_WRITE_BEATS", + "TGOx_L2_EXT_W_STALL", + "TGOx_L2_EXT_AW_CNT_Q1", + "TGOx_L2_EXT_AW_CNT_Q2", + "TGOx_L2_EXT_AW_CNT_Q3", + "TGOx_L2_EXT_SNOOP", + "TGOx_L2_EXT_SNOOP_STALL", + "TGOx_L2_EXT_SNOOP_RESP_CLEAN", + "TGOx_L2_EXT_SNOOP_RESP_DATA", + "TGOx_L2_EXT_SNOOP_INTERNAL", + "", + "", + "", + "", + "", + "", + "", +}; + +#endif /* _KBASE_GATOR_HWCNT_NAMES_TGOX_H_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_thex.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_thex.h index 15fd4efdc6ca24..e24e91ab1ca4cb 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_thex.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_thex.h @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2016-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2016-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * This header was autogenerated, it should not be edited. */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tkax.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tkax.h new file mode 100644 index 00000000000000..73db45c232f17e --- /dev/null +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tkax.h @@ -0,0 +1,296 @@ +/* + * + * (C) COPYRIGHT 2016-2018 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 + * + */ + +/* + * This header was autogenerated, it should not be edited. + */ + +#ifndef _KBASE_GATOR_HWCNT_NAMES_TKAX_H_ +#define _KBASE_GATOR_HWCNT_NAMES_TKAX_H_ + +static const char * const hardware_counters_mali_tKAx[] = { + /* Performance counters for the Job Manager */ + "", + "", + "", + "", + "TKAx_MESSAGES_SENT", + "TKAx_MESSAGES_RECEIVED", + "TKAx_GPU_ACTIVE", + "TKAx_IRQ_ACTIVE", + "TKAx_JS0_JOBS", + "TKAx_JS0_TASKS", + "TKAx_JS0_ACTIVE", + "", + "TKAx_JS0_WAIT_READ", + "TKAx_JS0_WAIT_ISSUE", + "TKAx_JS0_WAIT_DEPEND", + "TKAx_JS0_WAIT_FINISH", + "TKAx_JS1_JOBS", + "TKAx_JS1_TASKS", + "TKAx_JS1_ACTIVE", + "", + "TKAx_JS1_WAIT_READ", + "TKAx_JS1_WAIT_ISSUE", + "TKAx_JS1_WAIT_DEPEND", + "TKAx_JS1_WAIT_FINISH", + "TKAx_JS2_JOBS", + "TKAx_JS2_TASKS", + "TKAx_JS2_ACTIVE", + "", + "TKAx_JS2_WAIT_READ", + "TKAx_JS2_WAIT_ISSUE", + "TKAx_JS2_WAIT_DEPEND", + "TKAx_JS2_WAIT_FINISH", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + + /* Performance counters for the Tiler */ + "", + "", + "", + "", + "TKAx_TILER_ACTIVE", + "TKAx_JOBS_PROCESSED", + "TKAx_TRIANGLES", + "TKAx_LINES", + "TKAx_POINTS", + "TKAx_FRONT_FACING", + "TKAx_BACK_FACING", + "TKAx_PRIM_VISIBLE", + "TKAx_PRIM_CULLED", + "TKAx_PRIM_CLIPPED", + "TKAx_PRIM_SAT_CULLED", + "TKAx_BIN_ALLOC_INIT", + "TKAx_BIN_ALLOC_OVERFLOW", + "TKAx_BUS_READ", + "", + "TKAx_BUS_WRITE", + "TKAx_LOADING_DESC", + "TKAx_IDVS_POS_SHAD_REQ", + "TKAx_IDVS_POS_SHAD_WAIT", + "TKAx_IDVS_POS_SHAD_STALL", + "TKAx_IDVS_POS_FIFO_FULL", + "TKAx_PREFETCH_STALL", + "TKAx_VCACHE_HIT", + "TKAx_VCACHE_MISS", + "TKAx_VCACHE_LINE_WAIT", + "TKAx_VFETCH_POS_READ_WAIT", + "TKAx_VFETCH_VERTEX_WAIT", + "TKAx_VFETCH_STALL", + "TKAx_PRIMASSY_STALL", + "TKAx_BBOX_GEN_STALL", + "TKAx_IDVS_VBU_HIT", + "TKAx_IDVS_VBU_MISS", + "TKAx_IDVS_VBU_LINE_DEALLOCATE", + "TKAx_IDVS_VAR_SHAD_REQ", + "TKAx_IDVS_VAR_SHAD_STALL", + "TKAx_BINNER_STALL", + "TKAx_ITER_STALL", + "TKAx_COMPRESS_MISS", + "TKAx_COMPRESS_STALL", + "TKAx_PCACHE_HIT", + "TKAx_PCACHE_MISS", + "TKAx_PCACHE_MISS_STALL", + "TKAx_PCACHE_EVICT_STALL", + "TKAx_PMGR_PTR_WR_STALL", + "TKAx_PMGR_PTR_RD_STALL", + "TKAx_PMGR_CMD_WR_STALL", + "TKAx_WRBUF_ACTIVE", + "TKAx_WRBUF_HIT", + "TKAx_WRBUF_MISS", + "TKAx_WRBUF_NO_FREE_LINE_STALL", + "TKAx_WRBUF_NO_AXI_ID_STALL", + "TKAx_WRBUF_AXI_STALL", + "", + "", + "", + "TKAx_UTLB_TRANS", + "TKAx_UTLB_TRANS_HIT", + "TKAx_UTLB_TRANS_STALL", + "TKAx_UTLB_TRANS_MISS_DELAY", + "TKAx_UTLB_MMU_REQ", + + /* Performance counters for the Shader Core */ + "", + "", + "", + "", + "TKAx_FRAG_ACTIVE", + "TKAx_FRAG_PRIMITIVES", + "TKAx_FRAG_PRIM_RAST", + "TKAx_FRAG_FPK_ACTIVE", + "TKAx_FRAG_STARVING", + "TKAx_FRAG_WARPS", + "TKAx_FRAG_PARTIAL_WARPS", + "TKAx_FRAG_QUADS_RAST", + "TKAx_FRAG_QUADS_EZS_TEST", + "TKAx_FRAG_QUADS_EZS_UPDATE", + "TKAx_FRAG_QUADS_EZS_KILL", + "TKAx_FRAG_LZS_TEST", + "TKAx_FRAG_LZS_KILL", + "TKAx_WARP_REG_SIZE_64", + "TKAx_FRAG_PTILES", + "TKAx_FRAG_TRANS_ELIM", + "TKAx_QUAD_FPK_KILLER", + "TKAx_FULL_QUAD_WARPS", + "TKAx_COMPUTE_ACTIVE", + "TKAx_COMPUTE_TASKS", + "TKAx_COMPUTE_WARPS", + "TKAx_COMPUTE_STARVING", + "TKAx_EXEC_CORE_ACTIVE", + "TKAx_EXEC_ACTIVE", + "TKAx_EXEC_INSTR_COUNT", + "TKAx_EXEC_INSTR_DIVERGED", + "TKAx_EXEC_INSTR_STARVING", + "TKAx_ARITH_INSTR_SINGLE_FMA", + "TKAx_ARITH_INSTR_DOUBLE", + "TKAx_ARITH_INSTR_MSG", + "TKAx_ARITH_INSTR_MSG_ONLY", + "TKAx_TEX_MSGI_NUM_QUADS", + "TKAx_TEX_DFCH_NUM_PASSES", + "TKAx_TEX_DFCH_NUM_PASSES_MISS", + "TKAx_TEX_DFCH_NUM_PASSES_MIP_MAP", + "TKAx_TEX_TIDX_NUM_SPLIT_MIP_MAP", + "TKAx_TEX_TFCH_NUM_LINES_FETCHED", + "TKAx_TEX_TFCH_NUM_LINES_FETCHED_BLOCK", + "TKAx_TEX_TFCH_NUM_OPERATIONS", + "TKAx_TEX_FILT_NUM_OPERATIONS", + "TKAx_LS_MEM_READ_FULL", + "TKAx_LS_MEM_READ_SHORT", + "TKAx_LS_MEM_WRITE_FULL", + "TKAx_LS_MEM_WRITE_SHORT", + "TKAx_LS_MEM_ATOMIC", + "TKAx_VARY_INSTR", + "TKAx_VARY_SLOT_32", + "TKAx_VARY_SLOT_16", + "TKAx_ATTR_INSTR", + "TKAx_ARITH_INSTR_FP_MUL", + "TKAx_BEATS_RD_FTC", + "TKAx_BEATS_RD_FTC_EXT", + "TKAx_BEATS_RD_LSC", + "TKAx_BEATS_RD_LSC_EXT", + "TKAx_BEATS_RD_TEX", + "TKAx_BEATS_RD_TEX_EXT", + "TKAx_BEATS_RD_OTHER", + "TKAx_BEATS_WR_LSC_OTHER", + "TKAx_BEATS_WR_TIB", + "TKAx_BEATS_WR_LSC_WB", + + /* Performance counters for the Memory System */ + "", + "", + "", + "", + "TKAx_MMU_REQUESTS", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "TKAx_L2_RD_MSG_IN", + "TKAx_L2_RD_MSG_IN_STALL", + "TKAx_L2_WR_MSG_IN", + "TKAx_L2_WR_MSG_IN_STALL", + "TKAx_L2_SNP_MSG_IN", + "TKAx_L2_SNP_MSG_IN_STALL", + "TKAx_L2_RD_MSG_OUT", + "TKAx_L2_RD_MSG_OUT_STALL", + "TKAx_L2_WR_MSG_OUT", + "TKAx_L2_ANY_LOOKUP", + "TKAx_L2_READ_LOOKUP", + "TKAx_L2_WRITE_LOOKUP", + "TKAx_L2_EXT_SNOOP_LOOKUP", + "TKAx_L2_EXT_READ", + "TKAx_L2_EXT_READ_NOSNP", + "TKAx_L2_EXT_READ_UNIQUE", + "TKAx_L2_EXT_READ_BEATS", + "TKAx_L2_EXT_AR_STALL", + "TKAx_L2_EXT_AR_CNT_Q1", + "TKAx_L2_EXT_AR_CNT_Q2", + "TKAx_L2_EXT_AR_CNT_Q3", + "TKAx_L2_EXT_RRESP_0_127", + "TKAx_L2_EXT_RRESP_128_191", + "TKAx_L2_EXT_RRESP_192_255", + "TKAx_L2_EXT_RRESP_256_319", + "TKAx_L2_EXT_RRESP_320_383", + "TKAx_L2_EXT_WRITE", + "TKAx_L2_EXT_WRITE_NOSNP_FULL", + "TKAx_L2_EXT_WRITE_NOSNP_PTL", + "TKAx_L2_EXT_WRITE_SNP_FULL", + "TKAx_L2_EXT_WRITE_SNP_PTL", + "TKAx_L2_EXT_WRITE_BEATS", + "TKAx_L2_EXT_W_STALL", + "TKAx_L2_EXT_AW_CNT_Q1", + "TKAx_L2_EXT_AW_CNT_Q2", + "TKAx_L2_EXT_AW_CNT_Q3", + "TKAx_L2_EXT_SNOOP", + "TKAx_L2_EXT_SNOOP_STALL", + "TKAx_L2_EXT_SNOOP_RESP_CLEAN", + "TKAx_L2_EXT_SNOOP_RESP_DATA", + "TKAx_L2_EXT_SNOOP_INTERNAL", + "", + "", + "", + "", + "", + "", + "", +}; + +#endif /* _KBASE_GATOR_HWCNT_NAMES_TKAX_H_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tmix.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tmix.h index 8a215f723570cc..63eac50e0cc723 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tmix.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tmix.h @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2016-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2016-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * This header was autogenerated, it should not be edited. */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tnox.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tnox.h new file mode 100644 index 00000000000000..932663cfb6a958 --- /dev/null +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tnox.h @@ -0,0 +1,296 @@ +/* + * + * (C) COPYRIGHT 2016-2018 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 + * + */ + +/* + * This header was autogenerated, it should not be edited. + */ + +#ifndef _KBASE_GATOR_HWCNT_NAMES_TNOX_H_ +#define _KBASE_GATOR_HWCNT_NAMES_TNOX_H_ + +static const char * const hardware_counters_mali_tNOx[] = { + /* Performance counters for the Job Manager */ + "", + "", + "", + "", + "TNOx_MESSAGES_SENT", + "TNOx_MESSAGES_RECEIVED", + "TNOx_GPU_ACTIVE", + "TNOx_IRQ_ACTIVE", + "TNOx_JS0_JOBS", + "TNOx_JS0_TASKS", + "TNOx_JS0_ACTIVE", + "", + "TNOx_JS0_WAIT_READ", + "TNOx_JS0_WAIT_ISSUE", + "TNOx_JS0_WAIT_DEPEND", + "TNOx_JS0_WAIT_FINISH", + "TNOx_JS1_JOBS", + "TNOx_JS1_TASKS", + "TNOx_JS1_ACTIVE", + "", + "TNOx_JS1_WAIT_READ", + "TNOx_JS1_WAIT_ISSUE", + "TNOx_JS1_WAIT_DEPEND", + "TNOx_JS1_WAIT_FINISH", + "TNOx_JS2_JOBS", + "TNOx_JS2_TASKS", + "TNOx_JS2_ACTIVE", + "", + "TNOx_JS2_WAIT_READ", + "TNOx_JS2_WAIT_ISSUE", + "TNOx_JS2_WAIT_DEPEND", + "TNOx_JS2_WAIT_FINISH", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + + /* Performance counters for the Tiler */ + "", + "", + "", + "", + "TNOx_TILER_ACTIVE", + "TNOx_JOBS_PROCESSED", + "TNOx_TRIANGLES", + "TNOx_LINES", + "TNOx_POINTS", + "TNOx_FRONT_FACING", + "TNOx_BACK_FACING", + "TNOx_PRIM_VISIBLE", + "TNOx_PRIM_CULLED", + "TNOx_PRIM_CLIPPED", + "TNOx_PRIM_SAT_CULLED", + "TNOx_BIN_ALLOC_INIT", + "TNOx_BIN_ALLOC_OVERFLOW", + "TNOx_BUS_READ", + "", + "TNOx_BUS_WRITE", + "TNOx_LOADING_DESC", + "TNOx_IDVS_POS_SHAD_REQ", + "TNOx_IDVS_POS_SHAD_WAIT", + "TNOx_IDVS_POS_SHAD_STALL", + "TNOx_IDVS_POS_FIFO_FULL", + "TNOx_PREFETCH_STALL", + "TNOx_VCACHE_HIT", + "TNOx_VCACHE_MISS", + "TNOx_VCACHE_LINE_WAIT", + "TNOx_VFETCH_POS_READ_WAIT", + "TNOx_VFETCH_VERTEX_WAIT", + "TNOx_VFETCH_STALL", + "TNOx_PRIMASSY_STALL", + "TNOx_BBOX_GEN_STALL", + "TNOx_IDVS_VBU_HIT", + "TNOx_IDVS_VBU_MISS", + "TNOx_IDVS_VBU_LINE_DEALLOCATE", + "TNOx_IDVS_VAR_SHAD_REQ", + "TNOx_IDVS_VAR_SHAD_STALL", + "TNOx_BINNER_STALL", + "TNOx_ITER_STALL", + "TNOx_COMPRESS_MISS", + "TNOx_COMPRESS_STALL", + "TNOx_PCACHE_HIT", + "TNOx_PCACHE_MISS", + "TNOx_PCACHE_MISS_STALL", + "TNOx_PCACHE_EVICT_STALL", + "TNOx_PMGR_PTR_WR_STALL", + "TNOx_PMGR_PTR_RD_STALL", + "TNOx_PMGR_CMD_WR_STALL", + "TNOx_WRBUF_ACTIVE", + "TNOx_WRBUF_HIT", + "TNOx_WRBUF_MISS", + "TNOx_WRBUF_NO_FREE_LINE_STALL", + "TNOx_WRBUF_NO_AXI_ID_STALL", + "TNOx_WRBUF_AXI_STALL", + "", + "", + "", + "TNOx_UTLB_TRANS", + "TNOx_UTLB_TRANS_HIT", + "TNOx_UTLB_TRANS_STALL", + "TNOx_UTLB_TRANS_MISS_DELAY", + "TNOx_UTLB_MMU_REQ", + + /* Performance counters for the Shader Core */ + "", + "", + "", + "", + "TNOx_FRAG_ACTIVE", + "TNOx_FRAG_PRIMITIVES", + "TNOx_FRAG_PRIM_RAST", + "TNOx_FRAG_FPK_ACTIVE", + "TNOx_FRAG_STARVING", + "TNOx_FRAG_WARPS", + "TNOx_FRAG_PARTIAL_WARPS", + "TNOx_FRAG_QUADS_RAST", + "TNOx_FRAG_QUADS_EZS_TEST", + "TNOx_FRAG_QUADS_EZS_UPDATE", + "TNOx_FRAG_QUADS_EZS_KILL", + "TNOx_FRAG_LZS_TEST", + "TNOx_FRAG_LZS_KILL", + "TNOx_WARP_REG_SIZE_64", + "TNOx_FRAG_PTILES", + "TNOx_FRAG_TRANS_ELIM", + "TNOx_QUAD_FPK_KILLER", + "TNOx_FULL_QUAD_WARPS", + "TNOx_COMPUTE_ACTIVE", + "TNOx_COMPUTE_TASKS", + "TNOx_COMPUTE_WARPS", + "TNOx_COMPUTE_STARVING", + "TNOx_EXEC_CORE_ACTIVE", + "TNOx_EXEC_ACTIVE", + "TNOx_EXEC_INSTR_COUNT", + "TNOx_EXEC_INSTR_DIVERGED", + "TNOx_EXEC_INSTR_STARVING", + "TNOx_ARITH_INSTR_SINGLE_FMA", + "TNOx_ARITH_INSTR_DOUBLE", + "TNOx_ARITH_INSTR_MSG", + "TNOx_ARITH_INSTR_MSG_ONLY", + "TNOx_TEX_MSGI_NUM_QUADS", + "TNOx_TEX_DFCH_NUM_PASSES", + "TNOx_TEX_DFCH_NUM_PASSES_MISS", + "TNOx_TEX_DFCH_NUM_PASSES_MIP_MAP", + "TNOx_TEX_TIDX_NUM_SPLIT_MIP_MAP", + "TNOx_TEX_TFCH_NUM_LINES_FETCHED", + "TNOx_TEX_TFCH_NUM_LINES_FETCHED_BLOCK", + "TNOx_TEX_TFCH_NUM_OPERATIONS", + "TNOx_TEX_FILT_NUM_OPERATIONS", + "TNOx_LS_MEM_READ_FULL", + "TNOx_LS_MEM_READ_SHORT", + "TNOx_LS_MEM_WRITE_FULL", + "TNOx_LS_MEM_WRITE_SHORT", + "TNOx_LS_MEM_ATOMIC", + "TNOx_VARY_INSTR", + "TNOx_VARY_SLOT_32", + "TNOx_VARY_SLOT_16", + "TNOx_ATTR_INSTR", + "TNOx_ARITH_INSTR_FP_MUL", + "TNOx_BEATS_RD_FTC", + "TNOx_BEATS_RD_FTC_EXT", + "TNOx_BEATS_RD_LSC", + "TNOx_BEATS_RD_LSC_EXT", + "TNOx_BEATS_RD_TEX", + "TNOx_BEATS_RD_TEX_EXT", + "TNOx_BEATS_RD_OTHER", + "TNOx_BEATS_WR_LSC_OTHER", + "TNOx_BEATS_WR_TIB", + "TNOx_BEATS_WR_LSC_WB", + + /* Performance counters for the Memory System */ + "", + "", + "", + "", + "TNOx_MMU_REQUESTS", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "TNOx_L2_RD_MSG_IN", + "TNOx_L2_RD_MSG_IN_STALL", + "TNOx_L2_WR_MSG_IN", + "TNOx_L2_WR_MSG_IN_STALL", + "TNOx_L2_SNP_MSG_IN", + "TNOx_L2_SNP_MSG_IN_STALL", + "TNOx_L2_RD_MSG_OUT", + "TNOx_L2_RD_MSG_OUT_STALL", + "TNOx_L2_WR_MSG_OUT", + "TNOx_L2_ANY_LOOKUP", + "TNOx_L2_READ_LOOKUP", + "TNOx_L2_WRITE_LOOKUP", + "TNOx_L2_EXT_SNOOP_LOOKUP", + "TNOx_L2_EXT_READ", + "TNOx_L2_EXT_READ_NOSNP", + "TNOx_L2_EXT_READ_UNIQUE", + "TNOx_L2_EXT_READ_BEATS", + "TNOx_L2_EXT_AR_STALL", + "TNOx_L2_EXT_AR_CNT_Q1", + "TNOx_L2_EXT_AR_CNT_Q2", + "TNOx_L2_EXT_AR_CNT_Q3", + "TNOx_L2_EXT_RRESP_0_127", + "TNOx_L2_EXT_RRESP_128_191", + "TNOx_L2_EXT_RRESP_192_255", + "TNOx_L2_EXT_RRESP_256_319", + "TNOx_L2_EXT_RRESP_320_383", + "TNOx_L2_EXT_WRITE", + "TNOx_L2_EXT_WRITE_NOSNP_FULL", + "TNOx_L2_EXT_WRITE_NOSNP_PTL", + "TNOx_L2_EXT_WRITE_SNP_FULL", + "TNOx_L2_EXT_WRITE_SNP_PTL", + "TNOx_L2_EXT_WRITE_BEATS", + "TNOx_L2_EXT_W_STALL", + "TNOx_L2_EXT_AW_CNT_Q1", + "TNOx_L2_EXT_AW_CNT_Q2", + "TNOx_L2_EXT_AW_CNT_Q3", + "TNOx_L2_EXT_SNOOP", + "TNOx_L2_EXT_SNOOP_STALL", + "TNOx_L2_EXT_SNOOP_RESP_CLEAN", + "TNOx_L2_EXT_SNOOP_RESP_DATA", + "TNOx_L2_EXT_SNOOP_INTERNAL", + "", + "", + "", + "", + "", + "", + "", +}; + +#endif /* _KBASE_GATOR_HWCNT_NAMES_TNOX_H_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tsix.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tsix.h index fb6a1437a1f671..b8dde32bc529eb 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tsix.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tsix.h @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2016-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2016-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * This header was autogenerated, it should not be edited. */ @@ -217,9 +222,9 @@ static const char * const hardware_counters_mali_tSIx[] = { "TSIx_BEATS_RD_TEX", "TSIx_BEATS_RD_TEX_EXT", "TSIx_BEATS_RD_OTHER", - "TSIx_BEATS_WR_LSC", + "TSIx_BEATS_WR_LSC_OTHER", "TSIx_BEATS_WR_TIB", - "", + "TSIx_BEATS_WR_LSC_WB", /* Performance counters for the Memory System */ "", diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_ttrx.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_ttrx.h new file mode 100644 index 00000000000000..a17870d03b2172 --- /dev/null +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_ttrx.h @@ -0,0 +1,296 @@ +/* + * + * (C) COPYRIGHT 2016-2018 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 + * + */ + +/* + * This header was autogenerated, it should not be edited. + */ + +#ifndef _KBASE_GATOR_HWCNT_NAMES_TTRX_H_ +#define _KBASE_GATOR_HWCNT_NAMES_TTRX_H_ + +static const char * const hardware_counters_mali_tTRx[] = { + /* Performance counters for the Job Manager */ + "", + "", + "", + "", + "TTRx_MESSAGES_SENT", + "TTRx_MESSAGES_RECEIVED", + "TTRx_GPU_ACTIVE", + "TTRx_IRQ_ACTIVE", + "TTRx_JS0_JOBS", + "TTRx_JS0_TASKS", + "TTRx_JS0_ACTIVE", + "", + "TTRx_JS0_WAIT_READ", + "TTRx_JS0_WAIT_ISSUE", + "TTRx_JS0_WAIT_DEPEND", + "TTRx_JS0_WAIT_FINISH", + "TTRx_JS1_JOBS", + "TTRx_JS1_TASKS", + "TTRx_JS1_ACTIVE", + "", + "TTRx_JS1_WAIT_READ", + "TTRx_JS1_WAIT_ISSUE", + "TTRx_JS1_WAIT_DEPEND", + "TTRx_JS1_WAIT_FINISH", + "TTRx_JS2_JOBS", + "TTRx_JS2_TASKS", + "TTRx_JS2_ACTIVE", + "", + "TTRx_JS2_WAIT_READ", + "TTRx_JS2_WAIT_ISSUE", + "TTRx_JS2_WAIT_DEPEND", + "TTRx_JS2_WAIT_FINISH", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + + /* Performance counters for the Tiler */ + "", + "", + "", + "", + "TTRx_TILER_ACTIVE", + "TTRx_JOBS_PROCESSED", + "TTRx_TRIANGLES", + "TTRx_LINES", + "TTRx_POINTS", + "TTRx_FRONT_FACING", + "TTRx_BACK_FACING", + "TTRx_PRIM_VISIBLE", + "TTRx_PRIM_CULLED", + "TTRx_PRIM_CLIPPED", + "TTRx_PRIM_SAT_CULLED", + "TTRx_BIN_ALLOC_INIT", + "TTRx_BIN_ALLOC_OVERFLOW", + "TTRx_BUS_READ", + "", + "TTRx_BUS_WRITE", + "TTRx_LOADING_DESC", + "", + "", + "", + "", + "TTRx_PREFETCH_STALL", + "TTRx_VCACHE_HIT", + "TTRx_VCACHE_MISS", + "TTRx_VCACHE_LINE_WAIT", + "TTRx_VFETCH_POS_READ_WAIT", + "TTRx_VFETCH_VERTEX_WAIT", + "TTRx_VFETCH_STALL", + "TTRx_PRIMASSY_STALL", + "TTRx_BBOX_GEN_STALL", + "", + "", + "", + "", + "", + "TTRx_BINNER_STALL", + "TTRx_ITER_STALL", + "TTRx_COMPRESS_MISS", + "TTRx_COMPRESS_STALL", + "TTRx_PCACHE_HIT", + "TTRx_PCACHE_MISS", + "TTRx_PCACHE_MISS_STALL", + "TTRx_PCACHE_EVICT_STALL", + "TTRx_PMGR_PTR_WR_STALL", + "TTRx_PMGR_PTR_RD_STALL", + "TTRx_PMGR_CMD_WR_STALL", + "TTRx_WRBUF_ACTIVE", + "TTRx_WRBUF_HIT", + "TTRx_WRBUF_MISS", + "TTRx_WRBUF_NO_FREE_LINE_STALL", + "TTRx_WRBUF_NO_AXI_ID_STALL", + "TTRx_WRBUF_AXI_STALL", + "", + "", + "", + "TTRx_UTLB_TRANS", + "TTRx_UTLB_TRANS_HIT", + "TTRx_UTLB_TRANS_STALL", + "TTRx_UTLB_TRANS_MISS_DELAY", + "TTRx_UTLB_MMU_REQ", + + /* Performance counters for the Shader Core */ + "", + "", + "", + "", + "TTRx_FRAG_ACTIVE", + "TTRx_FRAG_PRIMITIVES", + "TTRx_FRAG_PRIM_RAST", + "TTRx_FRAG_FPK_ACTIVE", + "TTRx_FRAG_STARVING", + "TTRx_FRAG_WARPS", + "TTRx_FRAG_PARTIAL_WARPS", + "TTRx_FRAG_QUADS_RAST", + "TTRx_FRAG_QUADS_EZS_TEST", + "TTRx_FRAG_QUADS_EZS_UPDATE", + "TTRx_FRAG_QUADS_EZS_KILL", + "TTRx_FRAG_LZS_TEST", + "TTRx_FRAG_LZS_KILL", + "TTRx_WARP_REG_SIZE_64", + "TTRx_FRAG_PTILES", + "TTRx_FRAG_TRANS_ELIM", + "TTRx_QUAD_FPK_KILLER", + "TTRx_FULL_QUAD_WARPS", + "TTRx_COMPUTE_ACTIVE", + "TTRx_COMPUTE_TASKS", + "TTRx_COMPUTE_WARPS", + "TTRx_COMPUTE_STARVING", + "TTRx_EXEC_CORE_ACTIVE", + "TTRx_EXEC_INSTR_FMA", + "TTRx_EXEC_INSTR_CVT", + "TTRx_EXEC_INSTR_SFU", + "TTRx_EXEC_INSTR_MSG", + "TTRx_EXEC_INSTR_DIVERGED", + "TTRx_EXEC_ICACHE_MISS", + "TTRx_EXEC_STARVE_ARITH", + "TTRx_CALL_BLEND_SHADER", + "TTRx_TEX_INSTR", + "TTRx_TEX_INSTR_MIPMAP", + "TTRx_TEX_INSTR_COMPRESSED", + "TTRx_TEX_INSTR_3D", + "TTRx_TEX_INSTR_TRILINEAR", + "TTRx_TEX_COORD_ISSUE", + "TTRx_TEX_COORD_STALL", + "TTRx_TEX_STARVE_CACHE", + "TTRx_TEX_STARVE_FILTER", + "TTRx_LS_MEM_READ_FULL", + "TTRx_LS_MEM_READ_SHORT", + "TTRx_LS_MEM_WRITE_FULL", + "TTRx_LS_MEM_WRITE_SHORT", + "TTRx_LS_MEM_ATOMIC", + "TTRx_VARY_INSTR", + "TTRx_VARY_SLOT_32", + "TTRx_VARY_SLOT_16", + "TTRx_ATTR_INSTR", + "TTRx_ARITH_INSTR_FP_MUL", + "TTRx_BEATS_RD_FTC", + "TTRx_BEATS_RD_FTC_EXT", + "TTRx_BEATS_RD_LSC", + "TTRx_BEATS_RD_LSC_EXT", + "TTRx_BEATS_RD_TEX", + "TTRx_BEATS_RD_TEX_EXT", + "TTRx_BEATS_RD_OTHER", + "", + "TTRx_BEATS_WR_TIB", + "TTRx_BEATS_WR_LSC", + + /* Performance counters for the Memory System */ + "", + "", + "", + "", + "TTRx_MMU_REQUESTS", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "TTRx_L2_RD_MSG_IN", + "TTRx_L2_RD_MSG_IN_STALL", + "TTRx_L2_WR_MSG_IN", + "TTRx_L2_WR_MSG_IN_STALL", + "TTRx_L2_SNP_MSG_IN", + "TTRx_L2_SNP_MSG_IN_STALL", + "TTRx_L2_RD_MSG_OUT", + "TTRx_L2_RD_MSG_OUT_STALL", + "TTRx_L2_WR_MSG_OUT", + "TTRx_L2_ANY_LOOKUP", + "TTRx_L2_READ_LOOKUP", + "TTRx_L2_WRITE_LOOKUP", + "TTRx_L2_EXT_SNOOP_LOOKUP", + "TTRx_L2_EXT_READ", + "TTRx_L2_EXT_READ_NOSNP", + "TTRx_L2_EXT_READ_UNIQUE", + "TTRx_L2_EXT_READ_BEATS", + "TTRx_L2_EXT_AR_STALL", + "TTRx_L2_EXT_AR_CNT_Q1", + "TTRx_L2_EXT_AR_CNT_Q2", + "TTRx_L2_EXT_AR_CNT_Q3", + "TTRx_L2_EXT_RRESP_0_127", + "TTRx_L2_EXT_RRESP_128_191", + "TTRx_L2_EXT_RRESP_192_255", + "TTRx_L2_EXT_RRESP_256_319", + "TTRx_L2_EXT_RRESP_320_383", + "TTRx_L2_EXT_WRITE", + "TTRx_L2_EXT_WRITE_NOSNP_FULL", + "TTRx_L2_EXT_WRITE_NOSNP_PTL", + "TTRx_L2_EXT_WRITE_SNP_FULL", + "TTRx_L2_EXT_WRITE_SNP_PTL", + "TTRx_L2_EXT_WRITE_BEATS", + "TTRx_L2_EXT_W_STALL", + "TTRx_L2_EXT_AW_CNT_Q1", + "TTRx_L2_EXT_AW_CNT_Q2", + "TTRx_L2_EXT_AW_CNT_Q3", + "TTRx_L2_EXT_SNOOP", + "TTRx_L2_EXT_SNOOP_STALL", + "TTRx_L2_EXT_SNOOP_RESP_CLEAN", + "TTRx_L2_EXT_SNOOP_RESP_DATA", + "TTRx_L2_EXT_SNOOP_INTERNAL", + "", + "", + "", + "", + "", + "", + "", +}; + +#endif /* _KBASE_GATOR_HWCNT_NAMES_TTRX_H_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_id.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_id.h index 2d368dfaf64417..218e63a61c6caf 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_id.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_id.h @@ -1,19 +1,24 @@ /* * - * (C) COPYRIGHT 2015-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2015-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_GPU_ID_H_ #define _KBASE_GPU_ID_H_ @@ -22,20 +27,20 @@ #define GPU_ID_VERSION_MINOR_SHIFT 4 #define GPU_ID_VERSION_MAJOR_SHIFT 12 #define GPU_ID_VERSION_PRODUCT_ID_SHIFT 16 -#define GPU_ID_VERSION_STATUS (0xF << GPU_ID_VERSION_STATUS_SHIFT) -#define GPU_ID_VERSION_MINOR (0xFF << GPU_ID_VERSION_MINOR_SHIFT) -#define GPU_ID_VERSION_MAJOR (0xF << GPU_ID_VERSION_MAJOR_SHIFT) -#define GPU_ID_VERSION_PRODUCT_ID (0xFFFF << GPU_ID_VERSION_PRODUCT_ID_SHIFT) +#define GPU_ID_VERSION_STATUS (0xFu << GPU_ID_VERSION_STATUS_SHIFT) +#define GPU_ID_VERSION_MINOR (0xFFu << GPU_ID_VERSION_MINOR_SHIFT) +#define GPU_ID_VERSION_MAJOR (0xFu << GPU_ID_VERSION_MAJOR_SHIFT) +#define GPU_ID_VERSION_PRODUCT_ID (0xFFFFu << GPU_ID_VERSION_PRODUCT_ID_SHIFT) /* Values for GPU_ID_VERSION_PRODUCT_ID bitfield */ -#define GPU_ID_PI_T60X 0x6956 -#define GPU_ID_PI_T62X 0x0620 -#define GPU_ID_PI_T76X 0x0750 -#define GPU_ID_PI_T72X 0x0720 -#define GPU_ID_PI_TFRX 0x0880 -#define GPU_ID_PI_T86X 0x0860 -#define GPU_ID_PI_T82X 0x0820 -#define GPU_ID_PI_T83X 0x0830 +#define GPU_ID_PI_T60X 0x6956u +#define GPU_ID_PI_T62X 0x0620u +#define GPU_ID_PI_T76X 0x0750u +#define GPU_ID_PI_T72X 0x0720u +#define GPU_ID_PI_TFRX 0x0880u +#define GPU_ID_PI_T86X 0x0860u +#define GPU_ID_PI_T82X 0x0820u +#define GPU_ID_PI_T83X 0x0830u /* New GPU ID format when PRODUCT_ID is >= 0x1000 (and not 0x6956) */ #define GPU_ID_PI_NEW_FORMAT_START 0x1000 @@ -50,13 +55,13 @@ #define GPU_ID2_ARCH_REV_SHIFT 20 #define GPU_ID2_ARCH_MINOR_SHIFT 24 #define GPU_ID2_ARCH_MAJOR_SHIFT 28 -#define GPU_ID2_VERSION_STATUS (0xF << GPU_ID2_VERSION_STATUS_SHIFT) -#define GPU_ID2_VERSION_MINOR (0xFF << GPU_ID2_VERSION_MINOR_SHIFT) -#define GPU_ID2_VERSION_MAJOR (0xF << GPU_ID2_VERSION_MAJOR_SHIFT) -#define GPU_ID2_PRODUCT_MAJOR (0xF << GPU_ID2_PRODUCT_MAJOR_SHIFT) -#define GPU_ID2_ARCH_REV (0xF << GPU_ID2_ARCH_REV_SHIFT) -#define GPU_ID2_ARCH_MINOR (0xF << GPU_ID2_ARCH_MINOR_SHIFT) -#define GPU_ID2_ARCH_MAJOR (0xF << GPU_ID2_ARCH_MAJOR_SHIFT) +#define GPU_ID2_VERSION_STATUS (0xFu << GPU_ID2_VERSION_STATUS_SHIFT) +#define GPU_ID2_VERSION_MINOR (0xFFu << GPU_ID2_VERSION_MINOR_SHIFT) +#define GPU_ID2_VERSION_MAJOR (0xFu << GPU_ID2_VERSION_MAJOR_SHIFT) +#define GPU_ID2_PRODUCT_MAJOR (0xFu << GPU_ID2_PRODUCT_MAJOR_SHIFT) +#define GPU_ID2_ARCH_REV (0xFu << GPU_ID2_ARCH_REV_SHIFT) +#define GPU_ID2_ARCH_MINOR (0xFu << GPU_ID2_ARCH_MINOR_SHIFT) +#define GPU_ID2_ARCH_MAJOR (0xFu << GPU_ID2_ARCH_MAJOR_SHIFT) #define GPU_ID2_PRODUCT_MODEL (GPU_ID2_ARCH_MAJOR | GPU_ID2_PRODUCT_MAJOR) #define GPU_ID2_VERSION (GPU_ID2_VERSION_MAJOR | \ GPU_ID2_VERSION_MINOR | \ @@ -65,17 +70,17 @@ /* Helper macro to create a partial GPU_ID (new format) that defines a product ignoring its version. */ #define GPU_ID2_PRODUCT_MAKE(arch_major, arch_minor, arch_rev, product_major) \ - (((arch_major) << GPU_ID2_ARCH_MAJOR_SHIFT) | \ - ((arch_minor) << GPU_ID2_ARCH_MINOR_SHIFT) | \ - ((arch_rev) << GPU_ID2_ARCH_REV_SHIFT) | \ - ((product_major) << GPU_ID2_PRODUCT_MAJOR_SHIFT)) + ((((u32)arch_major) << GPU_ID2_ARCH_MAJOR_SHIFT) | \ + (((u32)arch_minor) << GPU_ID2_ARCH_MINOR_SHIFT) | \ + (((u32)arch_rev) << GPU_ID2_ARCH_REV_SHIFT) | \ + (((u32)product_major) << GPU_ID2_PRODUCT_MAJOR_SHIFT)) /* Helper macro to create a partial GPU_ID (new format) that specifies the revision (major, minor, status) of a product */ #define GPU_ID2_VERSION_MAKE(version_major, version_minor, version_status) \ - (((version_major) << GPU_ID2_VERSION_MAJOR_SHIFT) | \ - ((version_minor) << GPU_ID2_VERSION_MINOR_SHIFT) | \ - ((version_status) << GPU_ID2_VERSION_STATUS_SHIFT)) + ((((u32)version_major) << GPU_ID2_VERSION_MAJOR_SHIFT) | \ + (((u32)version_minor) << GPU_ID2_VERSION_MINOR_SHIFT) | \ + (((u32)version_status) << GPU_ID2_VERSION_STATUS_SHIFT)) /* Helper macro to create a complete GPU_ID (new format) */ #define GPU_ID2_MAKE(arch_major, arch_minor, arch_rev, product_major, \ @@ -88,20 +93,25 @@ /* Helper macro to create a partial GPU_ID (new format) that identifies a particular GPU model by its arch_major and product_major. */ #define GPU_ID2_MODEL_MAKE(arch_major, product_major) \ - (((arch_major) << GPU_ID2_ARCH_MAJOR_SHIFT) | \ - ((product_major) << GPU_ID2_PRODUCT_MAJOR_SHIFT)) + ((((u32)arch_major) << GPU_ID2_ARCH_MAJOR_SHIFT) | \ + (((u32)product_major) << GPU_ID2_PRODUCT_MAJOR_SHIFT)) /* Strip off the non-relevant bits from a product_id value and make it suitable for comparison against the GPU_ID2_PRODUCT_xxx values which identify a GPU model. */ #define GPU_ID2_MODEL_MATCH_VALUE(product_id) \ - (((product_id) << GPU_ID2_PRODUCT_MAJOR_SHIFT) & \ + ((((u32)product_id) << GPU_ID2_PRODUCT_MAJOR_SHIFT) & \ GPU_ID2_PRODUCT_MODEL) -#define GPU_ID2_PRODUCT_TMIX GPU_ID2_MODEL_MAKE(6u, 0) -#define GPU_ID2_PRODUCT_THEX GPU_ID2_MODEL_MAKE(6u, 1) -#define GPU_ID2_PRODUCT_TSIX GPU_ID2_MODEL_MAKE(7u, 0) -#define GPU_ID2_PRODUCT_TDVX GPU_ID2_MODEL_MAKE(7u, 3) +#define GPU_ID2_PRODUCT_TMIX GPU_ID2_MODEL_MAKE(6, 0) +#define GPU_ID2_PRODUCT_THEX GPU_ID2_MODEL_MAKE(6, 1) +#define GPU_ID2_PRODUCT_TSIX GPU_ID2_MODEL_MAKE(7, 0) +#define GPU_ID2_PRODUCT_TDVX GPU_ID2_MODEL_MAKE(7, 3) +#define GPU_ID2_PRODUCT_TNOX GPU_ID2_MODEL_MAKE(7, 1) +#define GPU_ID2_PRODUCT_TGOX GPU_ID2_MODEL_MAKE(7, 2) +#define GPU_ID2_PRODUCT_TKAX GPU_ID2_MODEL_MAKE(8, 0) +#define GPU_ID2_PRODUCT_TTRX GPU_ID2_MODEL_MAKE(9, 0) +#define GPU_ID2_PRODUCT_TBOX GPU_ID2_MODEL_MAKE(8, 2) /* Values for GPU_ID_VERSION_STATUS field for PRODUCT_ID GPU_ID_PI_T60X */ #define GPU_ID_S_15DEV0 0x1 @@ -110,9 +120,9 @@ /* Helper macro to create a GPU_ID assuming valid values for id, major, minor, status */ #define GPU_ID_MAKE(id, major, minor, status) \ - (((id) << GPU_ID_VERSION_PRODUCT_ID_SHIFT) | \ - ((major) << GPU_ID_VERSION_MAJOR_SHIFT) | \ - ((minor) << GPU_ID_VERSION_MINOR_SHIFT) | \ - ((status) << GPU_ID_VERSION_STATUS_SHIFT)) + ((((u32)id) << GPU_ID_VERSION_PRODUCT_ID_SHIFT) | \ + (((u32)major) << GPU_ID_VERSION_MAJOR_SHIFT) | \ + (((u32)minor) << GPU_ID_VERSION_MINOR_SHIFT) | \ + (((u32)status) << GPU_ID_VERSION_STATUS_SHIFT)) #endif /* _KBASE_GPU_ID_H_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_memory_debugfs.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_memory_debugfs.c index 6df0a1cb1264a2..514b065d48674e 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_memory_debugfs.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_memory_debugfs.c @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2012-2016 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2012-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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> #ifdef CONFIG_DEBUG_FS @@ -65,7 +70,7 @@ static int kbasep_gpu_memory_seq_show(struct seq_file *sfile, void *data) */ static int kbasep_gpu_memory_debugfs_open(struct inode *in, struct file *file) { - return single_open(file, kbasep_gpu_memory_seq_show , NULL); + return single_open(file, kbasep_gpu_memory_seq_show, NULL); } static const struct file_operations kbasep_gpu_memory_debugfs_fops = { diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_memory_debugfs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_memory_debugfs.h index 7045693eb91096..28a871a0da4fd7 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_memory_debugfs.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_memory_debugfs.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_gpu_memory_debugfs.h * Header file for gpu_memory entry in debugfs diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops.c index 4130810f103834..62ba105ca4173e 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops.c @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2011-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Base kernel property query APIs */ @@ -24,7 +29,6 @@ #include <mali_kbase.h> #include <mali_midg_regmap.h> #include <mali_kbase_gpuprops.h> -#include <mali_kbase_config_defaults.h> #include <mali_kbase_hwaccess_gpuprops.h> #include "mali_kbase_ioctl.h" #include <linux/clk.h> @@ -43,54 +47,6 @@ #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) -{ - 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) GPU_SPEED_FUNC; - if (get_gpu_speed_mhz != NULL) { - rc = get_gpu_speed_mhz(&gpu_speed_mhz); -#ifdef CONFIG_MALI_BIFROST_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_BIFROST_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; @@ -182,7 +138,7 @@ static void kbase_gpuprops_get_props(base_gpu_props * const gpu_props, struct kb gpu_props->raw_props.mem_features = regdump.mem_features; gpu_props->raw_props.mmu_features = regdump.mmu_features; gpu_props->raw_props.l2_features = regdump.l2_features; - gpu_props->raw_props.suspend_size = regdump.suspend_size; + gpu_props->raw_props.core_features = regdump.core_features; gpu_props->raw_props.as_present = regdump.as_present; gpu_props->raw_props.js_present = regdump.js_present; @@ -195,13 +151,9 @@ static void kbase_gpuprops_get_props(base_gpu_props * const gpu_props, struct kb gpu_props->raw_props.l2_present = ((u64) regdump.l2_present_hi << 32) + regdump.l2_present_lo; -#ifdef CONFIG_MALI_CORESTACK gpu_props->raw_props.stack_present = ((u64) regdump.stack_present_hi << 32) + regdump.stack_present_lo; -#else /* CONFIG_MALI_CORESTACK */ - gpu_props->raw_props.stack_present = 0; -#endif /* CONFIG_MALI_CORESTACK */ for (i = 0; i < GPU_MAX_JOB_SLOTS; i++) gpu_props->raw_props.js_features[i] = regdump.js_features[i]; @@ -213,6 +165,7 @@ static void kbase_gpuprops_get_props(base_gpu_props * const gpu_props, struct kb gpu_props->raw_props.thread_max_threads = regdump.thread_max_threads; gpu_props->raw_props.thread_max_workgroup_size = regdump.thread_max_workgroup_size; gpu_props->raw_props.thread_features = regdump.thread_features; + gpu_props->raw_props.thread_tls_alloc = regdump.thread_tls_alloc; } void kbase_gpuprops_update_core_props_gpu_id(base_gpu_props * const gpu_props) @@ -243,6 +196,8 @@ static void kbase_gpuprops_calculate_props(base_gpu_props * const gpu_props, str kbase_gpuprops_update_core_props_gpu_id(gpu_props); gpu_props->core_props.log2_program_counter_size = KBASE_GPU_PC_SIZE_LOG2; gpu_props->core_props.gpu_available_memory_size = totalram_pages << PAGE_SHIFT; + gpu_props->core_props.num_exec_engines = + KBASE_UBFX32(gpu_props->raw_props.core_features, 0, 4); 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]; @@ -274,6 +229,13 @@ static void kbase_gpuprops_calculate_props(base_gpu_props * const gpu_props, str else gpu_props->thread_props.max_barrier_size = gpu_props->raw_props.thread_max_barrier_size; + if (gpu_props->raw_props.thread_tls_alloc == 0) + gpu_props->thread_props.tls_alloc = + gpu_props->thread_props.max_threads; + else + gpu_props->thread_props.tls_alloc = + gpu_props->raw_props.thread_tls_alloc; + gpu_props->thread_props.max_registers = KBASE_UBFX32(gpu_props->raw_props.thread_features, 0U, 16); gpu_props->thread_props.max_task_queue = KBASE_UBFX32(gpu_props->raw_props.thread_features, 16U, 8); gpu_props->thread_props.max_thread_group_split = KBASE_UBFX32(gpu_props->raw_props.thread_features, 24U, 6); @@ -336,6 +298,9 @@ void kbase_gpuprops_set_features(struct kbase_device *kbdev) */ 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 { @@ -344,20 +309,20 @@ static struct { int size; } gpu_property_mapping[] = { #define PROP(name, member) \ - {KBASE_GPUPROP_ ## name, offsetof(struct mali_base_gpu_props, member), \ - sizeof(((struct mali_base_gpu_props *)0)->member)} + {KBASE_GPUPROP_ ## name, offsetof(struct base_gpu_props, member), \ + sizeof(((struct base_gpu_props *)0)->member)} PROP(PRODUCT_ID, core_props.product_id), PROP(VERSION_STATUS, core_props.version_status), PROP(MINOR_REVISION, core_props.minor_revision), PROP(MAJOR_REVISION, core_props.major_revision), - PROP(GPU_SPEED_MHZ, core_props.gpu_speed_mhz), PROP(GPU_FREQ_KHZ_MAX, core_props.gpu_freq_khz_max), - PROP(GPU_FREQ_KHZ_MIN, core_props.gpu_freq_khz_min), PROP(LOG2_PROGRAM_COUNTER_SIZE, core_props.log2_program_counter_size), 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(NUM_EXEC_ENGINES, core_props.num_exec_engines), PROP(L2_LOG2_LINE_SIZE, l2_props.log2_line_size), PROP(L2_LOG2_CACHE_SIZE, l2_props.log2_cache_size), @@ -373,13 +338,14 @@ static struct { PROP(MAX_TASK_QUEUE, thread_props.max_task_queue), PROP(MAX_THREAD_GROUP_SPLIT, thread_props.max_thread_group_split), PROP(IMPL_TECH, thread_props.impl_tech), + PROP(TLS_ALLOC, thread_props.tls_alloc), PROP(RAW_SHADER_PRESENT, raw_props.shader_present), PROP(RAW_TILER_PRESENT, raw_props.tiler_present), PROP(RAW_L2_PRESENT, raw_props.l2_present), PROP(RAW_STACK_PRESENT, raw_props.stack_present), PROP(RAW_L2_FEATURES, raw_props.l2_features), - PROP(RAW_SUSPEND_SIZE, raw_props.suspend_size), + PROP(RAW_CORE_FEATURES, raw_props.core_features), PROP(RAW_MEM_FEATURES, raw_props.mem_features), PROP(RAW_MMU_FEATURES, raw_props.mmu_features), PROP(RAW_AS_PRESENT, raw_props.as_present), @@ -404,12 +370,14 @@ static struct { 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, raw_props.thread_max_workgroup_size), PROP(RAW_THREAD_MAX_BARRIER_SIZE, raw_props.thread_max_barrier_size), PROP(RAW_THREAD_FEATURES, raw_props.thread_features), + PROP(RAW_THREAD_TLS_ALLOC, raw_props.thread_tls_alloc), PROP(RAW_COHERENCY_MODE, raw_props.coherency_mode), PROP(COHERENCY_NUM_GROUPS, coherency_info.num_groups), @@ -438,7 +406,7 @@ static struct { int kbase_gpuprops_populate_user_buffer(struct kbase_device *kbdev) { struct kbase_gpu_props *kprops = &kbdev->gpu_props; - struct mali_base_gpu_props *props = &kprops->props; + struct base_gpu_props *props = &kprops->props; u32 count = ARRAY_SIZE(gpu_property_mapping); u32 i; u32 size = 0; diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops.h index 57b3eaf9cd5326..37d9c08770bf80 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_gpuprops.h * Base kernel property query APIs @@ -49,18 +54,6 @@ void kbase_gpuprops_set(struct kbase_device *kbdev); */ 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/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops_types.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops_types.h index 10794fc273186b..d7877d1d4a5763 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops_types.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops_types.h @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2011-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_gpuprops_types.h * Base kernel property query APIs @@ -33,7 +38,7 @@ struct kbase_gpuprops_regdump { u32 gpu_id; u32 l2_features; - u32 suspend_size; /* API 8.2+ */ + u32 core_features; u32 tiler_features; u32 mem_features; u32 mmu_features; @@ -43,6 +48,7 @@ struct kbase_gpuprops_regdump { u32 thread_max_workgroup_size; u32 thread_max_barrier_size; u32 thread_features; + u32 thread_tls_alloc; u32 texture_features[BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS]; u32 js_features[GPU_MAX_JOB_SLOTS]; u32 shader_present_lo; diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gwt.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gwt.c new file mode 100644 index 00000000000000..b36254641327ce --- /dev/null +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gwt.c @@ -0,0 +1,270 @@ +/* + * + * (C) COPYRIGHT 2010-2018 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 + * + */ + +#include "mali_kbase_gwt.h" +#include <linux/list_sort.h> + +static inline void kbase_gpu_gwt_setup_page_permission( + struct kbase_context *kctx, + unsigned long flag, + struct rb_node *node) +{ + struct rb_node *rbnode = node; + + while (rbnode) { + struct kbase_va_region *reg; + int err = 0; + + reg = rb_entry(rbnode, struct kbase_va_region, rblink); + if (reg->nr_pages && !(reg->flags & KBASE_REG_FREE) && + (reg->flags & KBASE_REG_GPU_WR)) { + err = kbase_mmu_update_pages(kctx, reg->start_pfn, + kbase_get_gpu_phy_pages(reg), + reg->gpu_alloc->nents, + reg->flags & flag); + if (err) + dev_warn(kctx->kbdev->dev, "kbase_mmu_update_pages failure\n"); + } + + rbnode = rb_next(rbnode); + } +} + +static void kbase_gpu_gwt_setup_pages(struct kbase_context *kctx, + unsigned long flag) +{ + kbase_gpu_gwt_setup_page_permission(kctx, flag, + rb_first(&(kctx->reg_rbtree_same))); + kbase_gpu_gwt_setup_page_permission(kctx, flag, + rb_first(&(kctx->reg_rbtree_exec))); + kbase_gpu_gwt_setup_page_permission(kctx, flag, + rb_first(&(kctx->reg_rbtree_custom))); +} + + +int kbase_gpu_gwt_start(struct kbase_context *kctx) +{ + kbase_gpu_vm_lock(kctx); + if (kctx->gwt_enabled) { + kbase_gpu_vm_unlock(kctx); + return -EBUSY; + } + + INIT_LIST_HEAD(&kctx->gwt_current_list); + INIT_LIST_HEAD(&kctx->gwt_snapshot_list); + + /* If GWT is enabled using new vector dumping format + * from user space, back up status of the job serialization flag and + * use full serialisation of jobs for dumping. + * Status will be restored on end of dumping in gwt_stop. + */ + kctx->kbdev->backup_serialize_jobs = kctx->kbdev->serialize_jobs; + kctx->kbdev->serialize_jobs = KBASE_SERIALIZE_INTRA_SLOT | + KBASE_SERIALIZE_INTER_SLOT; + + /* Mark gwt enabled before making pages read only in case a + write page fault is triggered while we're still in this loop. + (kbase_gpu_vm_lock() doesn't prevent this!) + */ + kctx->gwt_enabled = true; + kctx->gwt_was_enabled = true; + + kbase_gpu_gwt_setup_pages(kctx, ~KBASE_REG_GPU_WR); + + kbase_gpu_vm_unlock(kctx); + return 0; +} + +int kbase_gpu_gwt_stop(struct kbase_context *kctx) +{ + struct kbasep_gwt_list_element *pos, *n; + + kbase_gpu_vm_lock(kctx); + if (!kctx->gwt_enabled) { + kbase_gpu_vm_unlock(kctx); + return -EINVAL; + } + + list_for_each_entry_safe(pos, n, &kctx->gwt_current_list, link) { + list_del(&pos->link); + kfree(pos); + } + + list_for_each_entry_safe(pos, n, &kctx->gwt_snapshot_list, link) { + list_del(&pos->link); + kfree(pos); + } + + kctx->kbdev->serialize_jobs = kctx->kbdev->backup_serialize_jobs; + + kbase_gpu_gwt_setup_pages(kctx, ~0UL); + + kctx->gwt_enabled = false; + kbase_gpu_vm_unlock(kctx); + return 0; +} + + +static int list_cmp_function(void *priv, struct list_head *a, + struct list_head *b) +{ + struct kbasep_gwt_list_element *elementA = container_of(a, + struct kbasep_gwt_list_element, link); + struct kbasep_gwt_list_element *elementB = container_of(b, + struct kbasep_gwt_list_element, link); + + CSTD_UNUSED(priv); + + if (elementA->page_addr > elementB->page_addr) + return 1; + return -1; +} + +static void kbase_gpu_gwt_collate(struct kbase_context *kctx, + struct list_head *snapshot_list) +{ + struct kbasep_gwt_list_element *pos, *n; + struct kbasep_gwt_list_element *collated = NULL; + + /* Sort the list */ + list_sort(NULL, snapshot_list, list_cmp_function); + + /* Combine contiguous areas. */ + list_for_each_entry_safe(pos, n, snapshot_list, link) { + if (collated == NULL || collated->region != + pos->region || + (collated->page_addr + + (collated->num_pages * PAGE_SIZE)) != + pos->page_addr) { + /* This is the first time through, a new region or + * is not contiguous - start collating to this element + */ + collated = pos; + } else { + /* contiguous so merge */ + collated->num_pages += pos->num_pages; + /* remove element from list */ + list_del(&pos->link); + kfree(pos); + } + } +} + +int kbase_gpu_gwt_dump(struct kbase_context *kctx, + union kbase_ioctl_cinstr_gwt_dump *gwt_dump) +{ + const u32 ubuf_size = gwt_dump->in.len; + u32 ubuf_count = 0; + __user void *user_addr = (__user void *) + (uintptr_t)gwt_dump->in.addr_buffer; + __user void *user_sizes = (__user void *) + (uintptr_t)gwt_dump->in.size_buffer; + + kbase_gpu_vm_lock(kctx); + + if (!kctx->gwt_enabled) { + kbase_gpu_vm_unlock(kctx); + /* gwt_dump shouldn't be called when gwt is disabled */ + return -EPERM; + } + + if (!gwt_dump->in.len || !gwt_dump->in.addr_buffer + || !gwt_dump->in.size_buffer) { + kbase_gpu_vm_unlock(kctx); + /* We don't have any valid user space buffer to copy the + * write modified addresses. + */ + return -EINVAL; + } + + if (list_empty(&kctx->gwt_snapshot_list) && + !list_empty(&kctx->gwt_current_list)) { + + list_replace_init(&kctx->gwt_current_list, + &kctx->gwt_snapshot_list); + + /* We have collected all write faults so far + * and they will be passed on to user space. + * Reset the page flags state to allow collection of + * further write faults. + */ + kbase_gpu_gwt_setup_pages(kctx, ~KBASE_REG_GPU_WR); + + /* Sort and combine consecutive pages in the dump list*/ + kbase_gpu_gwt_collate(kctx, &kctx->gwt_snapshot_list); + } + + while ((!list_empty(&kctx->gwt_snapshot_list))) { + u64 addr_buffer[32]; + u64 num_page_buffer[32]; + u32 count = 0; + int err; + struct kbasep_gwt_list_element *dump_info, *n; + + list_for_each_entry_safe(dump_info, n, + &kctx->gwt_snapshot_list, link) { + addr_buffer[count] = dump_info->page_addr; + num_page_buffer[count] = dump_info->num_pages; + count++; + list_del(&dump_info->link); + kfree(dump_info); + if (ARRAY_SIZE(addr_buffer) == count || + ubuf_size == (ubuf_count + count)) + break; + } + + if (count) { + err = copy_to_user((user_addr + + (ubuf_count * sizeof(u64))), + (void *)addr_buffer, + count * sizeof(u64)); + if (err) { + dev_err(kctx->kbdev->dev, "Copy to user failure\n"); + kbase_gpu_vm_unlock(kctx); + return err; + } + err = copy_to_user((user_sizes + + (ubuf_count * sizeof(u64))), + (void *)num_page_buffer, + count * sizeof(u64)); + if (err) { + dev_err(kctx->kbdev->dev, "Copy to user failure\n"); + kbase_gpu_vm_unlock(kctx); + return err; + } + + ubuf_count += count; + } + + if (ubuf_count == ubuf_size) + break; + } + + if (!list_empty(&kctx->gwt_snapshot_list)) + gwt_dump->out.more_data_available = 1; + else + gwt_dump->out.more_data_available = 0; + + gwt_dump->out.no_of_addr_collected = ubuf_count; + kbase_gpu_vm_unlock(kctx); + return 0; +} diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gwt.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gwt.h new file mode 100644 index 00000000000000..7e7746e6491542 --- /dev/null +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gwt.h @@ -0,0 +1,55 @@ +/* + * + * (C) COPYRIGHT 2010-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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 + * + */ + +#if !defined(_KBASE_GWT_H) +#define _KBASE_GWT_H + +#include <mali_kbase.h> +#include <mali_kbase_ioctl.h> + +/** + * kbase_gpu_gwt_start - Start the GPU write tracking + * @kctx: Pointer to kernel context + * + * @return 0 on success, error on failure. + */ +int kbase_gpu_gwt_start(struct kbase_context *kctx); + +/** + * kbase_gpu_gwt_stop - Stop the GPU write tracking + * @kctx: Pointer to kernel context + * + * @return 0 on success, error on failure. + */ +int kbase_gpu_gwt_stop(struct kbase_context *kctx); + +/** + * kbase_gpu_gwt_dump - Pass page address of faulting addresses to user space. + * @kctx: Pointer to kernel context + * @gwt_dump: User space data to be passed. + * + * @return 0 on success, error on failure. + */ +int kbase_gpu_gwt_dump(struct kbase_context *kctx, + union kbase_ioctl_cinstr_gwt_dump *gwt_dump); + +#endif /* _KBASE_GWT_H */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hw.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hw.c index eb8368ccee5e5f..f34f53a919b8d6 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hw.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hw.c @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Run-time work-arounds helpers */ @@ -51,6 +56,21 @@ void kbase_hw_set_features_mask(struct kbase_device *kbdev) case GPU_ID2_PRODUCT_TDVX: features = base_hw_features_tDVx; break; + case GPU_ID2_PRODUCT_TNOX: + features = base_hw_features_tNOx; + break; + case GPU_ID2_PRODUCT_TGOX: + features = base_hw_features_tGOx; + break; + case GPU_ID2_PRODUCT_TKAX: + features = base_hw_features_tKAx; + break; + case GPU_ID2_PRODUCT_TTRX: + features = base_hw_features_tTRx; + break; + case GPU_ID2_PRODUCT_TBOX: + features = base_hw_features_tBOx; + break; default: features = base_hw_features_generic; break; @@ -150,9 +170,26 @@ static const enum base_hw_issue *kbase_hw_get_issues_for_new_id( {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tDVx_r0p0}, {U32_MAX, NULL} } }, + {GPU_ID2_PRODUCT_TNOX, + {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tNOx_r0p0}, + {U32_MAX, NULL} } }, + + {GPU_ID2_PRODUCT_TGOX, + {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tGOx_r0p0}, + {GPU_ID2_VERSION_MAKE(1, 0, 0), base_hw_issues_tGOx_r1p0}, + {U32_MAX, NULL} } }, + {GPU_ID2_PRODUCT_TKAX, + {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tKAx_r0p0}, + {U32_MAX, NULL} } }, + {GPU_ID2_PRODUCT_TTRX, + {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tTRx_r0p0}, + {U32_MAX, NULL} } }, + {GPU_ID2_PRODUCT_TBOX, + {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tBOx_r0p0}, + {U32_MAX, NULL} } }, }; u32 gpu_id = kbdev->gpu_props.props.raw_props.gpu_id; @@ -370,6 +407,21 @@ int kbase_hw_set_issues_mask(struct kbase_device *kbdev) case GPU_ID2_PRODUCT_TDVX: issues = base_hw_issues_model_tDVx; break; + case GPU_ID2_PRODUCT_TNOX: + issues = base_hw_issues_model_tNOx; + break; + case GPU_ID2_PRODUCT_TGOX: + issues = base_hw_issues_model_tGOx; + break; + case GPU_ID2_PRODUCT_TKAX: + issues = base_hw_issues_model_tKAx; + break; + case GPU_ID2_PRODUCT_TTRX: + issues = base_hw_issues_model_tTRx; + break; + case GPU_ID2_PRODUCT_TBOX: + issues = base_hw_issues_model_tBOx; + break; default: dev_err(kbdev->dev, "Unknown GPU ID %x", gpu_id); diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hw.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hw.h index 754250ce968d94..f386b1624317e7 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hw.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hw.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file * Run-time work-arounds helpers diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_backend.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_backend.h index b09be99e6b4e10..dde4965c426a5a 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_backend.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_backend.h @@ -7,15 +7,20 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * HW access backend common APIs */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_defs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_defs.h index 0acf297192fdcf..124a2d9cf0c314 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_defs.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_defs.h @@ -1,21 +1,26 @@ /* * - * (C) COPYRIGHT 2014, 2016 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014, 2016, 2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_hwaccess_gpu_defs.h * HW access common definitions @@ -26,9 +31,19 @@ #include <mali_kbase_jm_defs.h> -/* The hwaccess_lock (a spinlock) must be held when accessing this structure */ +/** + * struct kbase_hwaccess_data - object encapsulating the GPU backend specific + * data for the HW access layer. + * hwaccess_lock (a spinlock) must be held when + * accessing this structure. + * @active_kctx: pointer to active kbase context which last submitted an + * atom to GPU and while the context is active it can + * submit new atoms to GPU from the irq context also, without + * going through the bottom half of job completion path. + * @backend: GPU backend specific data for HW access layer + */ struct kbase_hwaccess_data { - struct kbase_context *active_kctx; + struct kbase_context *active_kctx[BASE_JM_MAX_NR_SLOTS]; struct kbase_backend_data backend; }; diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_gpuprops.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_gpuprops.h index cf8a8131c22ed2..63844d97ce0218 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_gpuprops.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_gpuprops.h @@ -1,21 +1,26 @@ /* * - * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014-2015, 2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * Base kernel property query backend APIs */ @@ -28,6 +33,8 @@ * GPU * @kbdev: Device pointer * @regdump: Pointer to struct kbase_gpuprops_regdump structure + * + * The caller should ensure that GPU remains powered-on during this function. */ void kbase_backend_gpuprops_get(struct kbase_device *kbdev, struct kbase_gpuprops_regdump *regdump); @@ -38,7 +45,7 @@ void kbase_backend_gpuprops_get(struct kbase_device *kbdev, * @regdump: Pointer to struct kbase_gpuprops_regdump structure * * This function reads GPU properties that are dependent on the hardware - * features bitmask + * features bitmask. It will power-on the GPU if required. */ void kbase_backend_gpuprops_get_features(struct kbase_device *kbdev, struct kbase_gpuprops_regdump *regdump); diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_instr.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_instr.h index 5de2b7535bb47c..0c5ceffb0e47ae 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_instr.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_instr.h @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014-2015, 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * HW Access instrumentation common APIs */ @@ -30,15 +35,15 @@ * kbase_instr_hwcnt_enable_internal - Enable HW counters collection * @kbdev: Kbase device * @kctx: Kbase context - * @setup: HW counter setup parameters + * @enable: HW counter setup parameters * * Context: might sleep, waiting for reset to complete * * Return: 0 on success */ int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev, - struct kbase_context *kctx, - struct kbase_uk_hwcnt_setup *setup); + struct kbase_context *kctx, + struct kbase_ioctl_hwcnt_enable *enable); /** * kbase_instr_hwcnt_disable_internal - Disable HW counters collection diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_jm.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_jm.h index 750fda2cd81dec..ea87913a7a39d5 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_jm.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_jm.h @@ -1,21 +1,26 @@ /* * - * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * HW access job manager common APIs */ @@ -81,6 +86,7 @@ bool kbase_backend_use_ctx(struct kbase_device *kbdev, * kbase_backend_use_ctx_sched() - Activate a context. * @kbdev: Device pointer * @kctx: Context pointer + * @js: Job slot to activate context on * * kbase_gpu_next_job() will pull atoms from the active context. * @@ -94,7 +100,7 @@ bool kbase_backend_use_ctx(struct kbase_device *kbdev, * not have an address space assigned) */ bool kbase_backend_use_ctx_sched(struct kbase_device *kbdev, - struct kbase_context *kctx); + struct kbase_context *kctx, int js); /** * kbase_backend_release_ctx_irq - Release a context from the GPU. This will @@ -376,6 +382,9 @@ bool kbase_reset_gpu_active(struct kbase_device *kbdev); void kbase_job_slot_hardstop(struct kbase_context *kctx, int js, struct kbase_jd_atom *target_katom); +/* Object containing callbacks for enabling/disabling protected mode, used + * on GPU which supports protected mode switching natively. + */ extern struct protected_mode_ops kbase_native_protected_ops; #endif /* _KBASE_HWACCESS_JM_H_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_pm.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_pm.h index 71c7d495c40ab9..4598d8099765b0 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_pm.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_pm.h @@ -7,15 +7,20 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_hwaccess_pm.h * HW access power manager common APIs diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_time.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_time.h index b9fe8e669c63b6..72a476a447a1a9 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_time.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_time.h @@ -7,15 +7,20 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwcnt_reader.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwcnt_reader.h index cf7bf1b35dc59e..10706b8d25486d 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwcnt_reader.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwcnt_reader.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_HWCNT_READER_H_ #define _KBASE_HWCNT_READER_H_ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ioctl.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ioctl.h index e7c1daee470bf1..fcb9ad31e93743 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ioctl.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ioctl.h @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2017-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_IOCTL_H_ #define _KBASE_IOCTL_H_ @@ -22,20 +27,33 @@ extern "C" { #endif +#include <asm-generic/ioctl.h> #include <linux/types.h> #define KBASE_IOCTL_TYPE 0x80 -#ifdef ANDROID -/* Android's definition of ioctl is incorrect, specifying the type argument as - * 'int'. This creates a warning when using _IOWR (as the top bit is set). Work - * round this by redefining _IOC to include a case to 'int'. +/* + * 11.1: + * - Add BASE_MEM_TILER_ALIGN_TOP under base_mem_alloc_flags + * 11.2: + * - KBASE_MEM_QUERY_FLAGS can return KBASE_REG_PF_GROW and KBASE_REG_SECURE, + * which some user-side clients prior to 11.2 might fault if they received + * them + * 11.3: + * - New ioctls KBASE_IOCTL_STICKY_RESOURCE_MAP and + * KBASE_IOCTL_STICKY_RESOURCE_UNMAP + * 11.4: + * - New ioctl KBASE_IOCTL_MEM_FIND_GPU_START_AND_OFFSET + * 11.5: + * - New ioctl: KBASE_IOCTL_MEM_JIT_INIT (old ioctl renamed to _OLD) + * 11.6: + * - Added flags field to base_jit_alloc_info structure, which can be used to + * specify pseudo chunked tiler alignment for JIT allocations. + * 11.7: + * - Removed UMP support */ -#undef _IOC -#define _IOC(dir, type, nr, size) \ - ((int)(((dir) << _IOC_DIRSHIFT) | ((type) << _IOC_TYPESHIFT) | \ - ((nr) << _IOC_NRSHIFT) | ((size) << _IOC_SIZESHIFT))) -#endif +#define BASE_UK_VERSION_MAJOR 11 +#define BASE_UK_VERSION_MINOR 7 /** * struct kbase_ioctl_version_check - Check version compatibility with kernel @@ -170,9 +188,9 @@ union kbase_ioctl_mem_query { #define KBASE_IOCTL_MEM_QUERY \ _IOWR(KBASE_IOCTL_TYPE, 6, union kbase_ioctl_mem_query) -#define KBASE_MEM_QUERY_COMMIT_SIZE 1 -#define KBASE_MEM_QUERY_VA_SIZE 2 -#define KBASE_MEM_QUERY_FLAGS 3 +#define KBASE_MEM_QUERY_COMMIT_SIZE ((u64)1) +#define KBASE_MEM_QUERY_VA_SIZE ((u64)2) +#define KBASE_MEM_QUERY_FLAGS ((u64)3) /** * struct kbase_ioctl_mem_free - Free a memory region @@ -231,6 +249,21 @@ struct kbase_ioctl_hwcnt_enable { #define KBASE_IOCTL_HWCNT_CLEAR \ _IO(KBASE_IOCTL_TYPE, 11) +/** + * struct kbase_ioctl_hwcnt_values - Values to set dummy the dummy counters to. + * @data: Counter samples for the dummy model. + * @size: Size of the counter sample data. + * @padding: Padding. + */ +struct kbase_ioctl_hwcnt_values { + __u64 data; + __u32 size; + __u32 padding; +}; + +#define KBASE_IOCTL_HWCNT_SET \ + _IOW(KBASE_IOCTL_TYPE, 32, struct kbase_ioctl_hwcnt_values) + /** * struct kbase_ioctl_disjoint_query - Query the disjoint counter * @counter: A counter of disjoint events in the kernel @@ -246,28 +279,58 @@ struct kbase_ioctl_disjoint_query { * 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 + * + * The ioctl request code has to be _IOW because the data in ioctl struct is + * being copied to the kernel, even though the kernel then writes out the + * version info to the buffer specified in the ioctl. */ struct kbase_ioctl_get_ddk_version { __u64 version_buffer; __u32 size; + __u32 padding; }; #define KBASE_IOCTL_GET_DDK_VERSION \ _IOW(KBASE_IOCTL_TYPE, 13, struct kbase_ioctl_get_ddk_version) +/** + * struct kbase_ioctl_mem_jit_init_old - Initialise the JIT memory allocator + * + * @va_pages: Number of VA pages to reserve for JIT + * + * Note that depending on the VA size of the application and GPU, the value + * specified in @va_pages may be ignored. + * + * New code should use KBASE_IOCTL_MEM_JIT_INIT instead, this is kept for + * backwards compatibility. + */ +struct kbase_ioctl_mem_jit_init_old { + __u64 va_pages; +}; + +#define KBASE_IOCTL_MEM_JIT_INIT_OLD \ + _IOW(KBASE_IOCTL_TYPE, 14, struct kbase_ioctl_mem_jit_init_old) + /** * struct kbase_ioctl_mem_jit_init - Initialise the JIT memory allocator * * @va_pages: Number of VA pages to reserve for JIT + * @max_allocations: Maximum number of concurrent allocations + * @trim_level: Level of JIT allocation trimming to perform on free (0 - 100%) + * @padding: Currently unused, must be zero * * Note that depending on the VA size of the application and GPU, the value * specified in @va_pages may be ignored. */ struct kbase_ioctl_mem_jit_init { __u64 va_pages; + __u8 max_allocations; + __u8 trim_level; + __u8 padding[6]; }; #define KBASE_IOCTL_MEM_JIT_INIT \ @@ -472,10 +535,12 @@ struct kbase_ioctl_fence_validate { * 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 \ @@ -513,7 +578,104 @@ struct kbase_ioctl_soft_event_update { #define KBASE_IOCTL_SOFT_EVENT_UPDATE \ _IOW(KBASE_IOCTL_TYPE, 28, struct kbase_ioctl_soft_event_update) -/* IOCTLs 29-32 are reserved */ +/** + * struct kbase_ioctl_sticky_resource_map - Permanently map an external resource + * @count: Number of resources + * @address: Array of u64 GPU addresses of the external resources to map + */ +struct kbase_ioctl_sticky_resource_map { + __u64 count; + __u64 address; +}; + +#define KBASE_IOCTL_STICKY_RESOURCE_MAP \ + _IOW(KBASE_IOCTL_TYPE, 29, struct kbase_ioctl_sticky_resource_map) + +/** + * struct kbase_ioctl_sticky_resource_map - Unmap a resource mapped which was + * previously permanently mapped + * @count: Number of resources + * @address: Array of u64 GPU addresses of the external resources to unmap + */ +struct kbase_ioctl_sticky_resource_unmap { + __u64 count; + __u64 address; +}; + +#define KBASE_IOCTL_STICKY_RESOURCE_UNMAP \ + _IOW(KBASE_IOCTL_TYPE, 30, struct kbase_ioctl_sticky_resource_unmap) + +/** + * union kbase_ioctl_mem_find_gpu_start_and_offset - Find the start address of + * the GPU memory region for + * the given gpu address and + * the offset of that address + * into the region + * + * @gpu_addr: GPU virtual address + * @size: Size in bytes within the region + * @start: Address of the beginning of the memory region enclosing @gpu_addr + * for the length of @offset bytes + * @offset: The offset from the start of the memory region to @gpu_addr + * + * @in: Input parameters + * @out: Output parameters + */ +union kbase_ioctl_mem_find_gpu_start_and_offset { + struct { + __u64 gpu_addr; + __u64 size; + } in; + struct { + __u64 start; + __u64 offset; + } out; +}; + +#define KBASE_IOCTL_MEM_FIND_GPU_START_AND_OFFSET \ + _IOWR(KBASE_IOCTL_TYPE, 31, union kbase_ioctl_mem_find_gpu_start_and_offset) + + +#define KBASE_IOCTL_CINSTR_GWT_START \ + _IO(KBASE_IOCTL_TYPE, 33) + +#define KBASE_IOCTL_CINSTR_GWT_STOP \ + _IO(KBASE_IOCTL_TYPE, 34) + +/** + * union kbase_ioctl_gwt_dump - Used to collect all GPU write fault addresses. + * @addr_buffer: Address of buffer to hold addresses of gpu modified areas. + * @size_buffer: Address of buffer to hold size of modified areas (in pages) + * @len: Number of addresses the buffers can hold. + * @more_data_available: Status indicating if more addresses are available. + * @no_of_addr_collected: Number of addresses collected into addr_buffer. + * + * @in: Input parameters + * @out: Output parameters + * This structure is used when performing a call to dump GPU write fault + * addresses. + */ +union kbase_ioctl_cinstr_gwt_dump { + struct { + __u64 addr_buffer; + __u64 size_buffer; + __u32 len; + __u32 padding; + + } in; + struct { + __u32 no_of_addr_collected; + __u8 more_data_available; + __u8 padding[27]; + } out; +}; + +#define KBASE_IOCTL_CINSTR_GWT_DUMP \ + _IOWR(KBASE_IOCTL_TYPE, 35, union kbase_ioctl_cinstr_gwt_dump) + +/* IOCTLs 36-41 are reserved */ + +/* IOCTL 42 is free for use */ /*************** * test ioctls * @@ -570,9 +732,9 @@ struct kbase_ioctl_tlstream_stats { #define KBASE_GPUPROP_VERSION_STATUS 2 #define KBASE_GPUPROP_MINOR_REVISION 3 #define KBASE_GPUPROP_MAJOR_REVISION 4 -#define KBASE_GPUPROP_GPU_SPEED_MHZ 5 +/* 5 previously used for GPU speed */ #define KBASE_GPUPROP_GPU_FREQ_KHZ_MAX 6 -#define KBASE_GPUPROP_GPU_FREQ_KHZ_MIN 7 +/* 7 previously used for minimum GPU speed */ #define KBASE_GPUPROP_LOG2_PROGRAM_COUNTER_SIZE 8 #define KBASE_GPUPROP_TEXTURE_FEATURES_0 9 #define KBASE_GPUPROP_TEXTURE_FEATURES_1 10 @@ -599,7 +761,7 @@ struct kbase_ioctl_tlstream_stats { #define KBASE_GPUPROP_RAW_L2_PRESENT 27 #define KBASE_GPUPROP_RAW_STACK_PRESENT 28 #define KBASE_GPUPROP_RAW_L2_FEATURES 29 -#define KBASE_GPUPROP_RAW_SUSPEND_SIZE 30 +#define KBASE_GPUPROP_RAW_CORE_FEATURES 30 #define KBASE_GPUPROP_RAW_MEM_FEATURES 31 #define KBASE_GPUPROP_RAW_MMU_FEATURES 32 #define KBASE_GPUPROP_RAW_AS_PRESENT 33 @@ -651,6 +813,14 @@ struct kbase_ioctl_tlstream_stats { #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 + +#define KBASE_GPUPROP_NUM_EXEC_ENGINES 82 + +#define KBASE_GPUPROP_RAW_THREAD_TLS_ALLOC 83 +#define KBASE_GPUPROP_TLS_ALLOC 84 + #ifdef __cpluscplus } #endif diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd.c index 144ebfcdfc5930..be3592674fb304 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd.c @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #if defined(CONFIG_DMA_SHARED_BUFFER) #include <linux/dma-buf.h> #endif /* defined(CONFIG_DMA_SHARED_BUFFER) */ @@ -24,7 +29,6 @@ #include <linux/compat.h> #endif #include <mali_kbase.h> -#include <mali_kbase_uku.h> #include <linux/random.h> #include <linux/version.h> #include <linux/ratelimit.h> @@ -106,7 +110,7 @@ static int jd_run_atom(struct kbase_jd_atom *katom) return kbasep_js_add_job(kctx, katom); } -#if defined(CONFIG_KDS) || defined(CONFIG_MALI_BIFROST_DMA_FENCE) +#if defined(CONFIG_MALI_BIFROST_DMA_FENCE) void kbase_jd_dep_clear_locked(struct kbase_jd_atom *katom) { struct kbase_device *kbdev; @@ -139,91 +143,8 @@ void kbase_jd_dep_clear_locked(struct kbase_jd_atom *katom) } #endif -#ifdef CONFIG_KDS - -/* Add the katom to the kds waiting list. - * Atoms must be added to the waiting list after a successful call to kds_async_waitall. - * The caller must hold the kbase_jd_context.lock */ - -static void kbase_jd_kds_waiters_add(struct kbase_jd_atom *katom) -{ - struct kbase_context *kctx; - - KBASE_DEBUG_ASSERT(katom); - - kctx = katom->kctx; - - list_add_tail(&katom->node, &kctx->waiting_kds_resource); -} - -/* Remove the katom from the kds waiting list. - * Atoms must be removed from the waiting list before a call to kds_resource_set_release_sync. - * The supplied katom must first have been added to the list with a call to kbase_jd_kds_waiters_add. - * The caller must hold the kbase_jd_context.lock */ - -static void kbase_jd_kds_waiters_remove(struct kbase_jd_atom *katom) -{ - KBASE_DEBUG_ASSERT(katom); - list_del(&katom->node); -} - -static void kds_dep_clear(void *callback_parameter, void *callback_extra_parameter) -{ - struct kbase_jd_atom *katom; - struct kbase_jd_context *ctx; - - katom = (struct kbase_jd_atom *)callback_parameter; - KBASE_DEBUG_ASSERT(katom); - - ctx = &katom->kctx->jctx; - - /* If KDS resource has already been satisfied (e.g. due to zapping) - * do nothing. - */ - mutex_lock(&ctx->lock); - if (!katom->kds_dep_satisfied) { - katom->kds_dep_satisfied = true; - kbase_jd_dep_clear_locked(katom); - } - mutex_unlock(&ctx->lock); -} - -static void kbase_cancel_kds_wait_job(struct kbase_jd_atom *katom) -{ - KBASE_DEBUG_ASSERT(katom); - - /* Prevent job_done_nolock from being called twice on an atom when - * there is a race between job completion and cancellation */ - - if (katom->status == KBASE_JD_ATOM_STATE_QUEUED) { - /* Wait was cancelled - zap the atom */ - katom->event_code = BASE_JD_EVENT_JOB_CANCELLED; - if (jd_done_nolock(katom, NULL)) - kbase_js_sched_all(katom->kctx->kbdev); - } -} -#endif /* CONFIG_KDS */ - void kbase_jd_free_external_resources(struct kbase_jd_atom *katom) { -#ifdef CONFIG_KDS - if (katom->kds_rset) { - struct kbase_jd_context *jctx = &katom->kctx->jctx; - - /* - * As the atom is no longer waiting, remove it from - * the waiting list. - */ - - mutex_lock(&jctx->lock); - kbase_jd_kds_waiters_remove(katom); - mutex_unlock(&jctx->lock); - - /* Release the kds resource or cancel if zapping */ - kds_resource_set_release_sync(&katom->kds_rset); - } -#endif /* CONFIG_KDS */ - #ifdef CONFIG_MALI_BIFROST_DMA_FENCE /* Flush dma-fence workqueue to ensure that any callbacks that may have * been queued are done before continuing. @@ -240,12 +161,6 @@ static void kbase_jd_post_external_resources(struct kbase_jd_atom *katom) KBASE_DEBUG_ASSERT(katom); KBASE_DEBUG_ASSERT(katom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES); -#ifdef CONFIG_KDS - /* Prevent the KDS resource from triggering the atom in case of zapping */ - if (katom->kds_rset) - katom->kds_dep_satisfied = true; -#endif /* CONFIG_KDS */ - #ifdef CONFIG_MALI_BIFROST_DMA_FENCE kbase_dma_fence_signal(katom); #endif /* CONFIG_MALI_BIFROST_DMA_FENCE */ @@ -281,11 +196,6 @@ static int kbase_jd_pre_external_resources(struct kbase_jd_atom *katom, const st { int err_ret_val = -EINVAL; u32 res_no; -#ifdef CONFIG_KDS - u32 kds_res_count = 0; - struct kds_resource **kds_resources = NULL; - unsigned long *kds_access_bitmap = NULL; -#endif /* CONFIG_KDS */ #ifdef CONFIG_MALI_BIFROST_DMA_FENCE struct kbase_dma_fence_resv_info info = { .dma_fence_resv_count = 0, @@ -332,25 +242,6 @@ static int kbase_jd_pre_external_resources(struct kbase_jd_atom *katom, const st err_ret_val = -EINVAL; goto early_err_out; } -#ifdef CONFIG_KDS - /* assume we have to wait for all */ - KBASE_DEBUG_ASSERT(0 != katom->nr_extres); - kds_resources = kmalloc_array(katom->nr_extres, sizeof(struct kds_resource *), GFP_KERNEL); - - if (!kds_resources) { - err_ret_val = -ENOMEM; - goto early_err_out; - } - - KBASE_DEBUG_ASSERT(0 != katom->nr_extres); - kds_access_bitmap = kcalloc(BITS_TO_LONGS(katom->nr_extres), - sizeof(unsigned long), - GFP_KERNEL); - if (!kds_access_bitmap) { - err_ret_val = -ENOMEM; - goto early_err_out; - } -#endif /* CONFIG_KDS */ #ifdef CONFIG_MALI_BIFROST_DMA_FENCE if (implicit_sync) { @@ -401,12 +292,7 @@ static int kbase_jd_pre_external_resources(struct kbase_jd_atom *katom, const st } alloc = kbase_map_external_resource(katom->kctx, reg, - current->mm -#ifdef CONFIG_KDS - , &kds_res_count, kds_resources, - kds_access_bitmap, exclusive -#endif - ); + current->mm); if (!alloc) { err_ret_val = -EINVAL; goto failed_loop; @@ -434,36 +320,12 @@ static int kbase_jd_pre_external_resources(struct kbase_jd_atom *katom, const st katom->extres[res_no].alloc = alloc; } /* successfully parsed the extres array */ - /* drop the vm lock before we call into kds */ + /* drop the vm lock now */ kbase_gpu_vm_unlock(katom->kctx); /* Release the processes mmap lock */ up_read(¤t->mm->mmap_sem); -#ifdef CONFIG_KDS - if (kds_res_count) { - int wait_failed; - - /* We have resources to wait for with kds */ - katom->kds_dep_satisfied = false; - - wait_failed = kds_async_waitall(&katom->kds_rset, - &katom->kctx->jctx.kds_cb, katom, NULL, - kds_res_count, kds_access_bitmap, - kds_resources); - - if (wait_failed) - goto failed_kds_setup; - else - kbase_jd_kds_waiters_add(katom); - } else { - /* Nothing to wait for, so kds dep met */ - katom->kds_dep_satisfied = true; - } - kfree(kds_resources); - kfree(kds_access_bitmap); -#endif /* CONFIG_KDS */ - #ifdef CONFIG_MALI_BIFROST_DMA_FENCE if (implicit_sync) { if (info.dma_fence_resv_count) { @@ -486,24 +348,6 @@ static int kbase_jd_pre_external_resources(struct kbase_jd_atom *katom, const st #ifdef CONFIG_MALI_BIFROST_DMA_FENCE failed_dma_fence_setup: -#ifdef CONFIG_KDS - /* If we are here, dma_fence setup failed but KDS didn't. - * Revert KDS setup if any. - */ - if (kds_res_count) { - mutex_unlock(&katom->kctx->jctx.lock); - kds_resource_set_release_sync(&katom->kds_rset); - mutex_lock(&katom->kctx->jctx.lock); - - kbase_jd_kds_waiters_remove(katom); - katom->kds_dep_satisfied = true; - } -#endif /* CONFIG_KDS */ -#endif /* CONFIG_MALI_BIFROST_DMA_FENCE */ -#ifdef CONFIG_KDS -failed_kds_setup: -#endif -#if defined(CONFIG_KDS) || defined(CONFIG_MALI_BIFROST_DMA_FENCE) /* Lock the processes mmap lock */ down_read(¤t->mm->mmap_sem); @@ -526,10 +370,6 @@ static int kbase_jd_pre_external_resources(struct kbase_jd_atom *katom, const st early_err_out: kfree(katom->extres); katom->extres = NULL; -#ifdef CONFIG_KDS - kfree(kds_resources); - kfree(kds_access_bitmap); -#endif /* CONFIG_KDS */ #ifdef CONFIG_MALI_BIFROST_DMA_FENCE if (implicit_sync) { kfree(info.resv_objs); @@ -559,15 +399,6 @@ static inline void jd_resolve_dep(struct list_head *out_list, if (katom->event_code != BASE_JD_EVENT_DONE && (dep_type != BASE_JD_DEP_TYPE_ORDER)) { -#ifdef CONFIG_KDS - if (!dep_atom->kds_dep_satisfied) { - /* Just set kds_dep_satisfied to true. If the callback happens after this then it will early out and - * do nothing. If the callback doesn't happen then kbase_jd_post_external_resources will clean up - */ - dep_atom->kds_dep_satisfied = true; - } -#endif - #ifdef CONFIG_MALI_BIFROST_DMA_FENCE kbase_dma_fence_cancel_callbacks(dep_atom); #endif @@ -576,7 +407,7 @@ static inline void jd_resolve_dep(struct list_head *out_list, KBASE_DEBUG_ASSERT(dep_atom->status != KBASE_JD_ATOM_STATE_UNUSED); - if ((dep_atom->core_req & BASE_JD_REQ_SOFT_REPLAY) + if ((dep_atom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE) != BASE_JD_REQ_SOFT_REPLAY) { dep_atom->will_fail_event_code = dep_atom->event_code; @@ -617,10 +448,6 @@ static inline void jd_resolve_dep(struct list_head *out_list, } #endif /* CONFIG_MALI_BIFROST_DMA_FENCE */ -#ifdef CONFIG_KDS - dep_satisfied = dep_satisfied && dep_atom->kds_dep_satisfied; -#endif - if (dep_satisfied) { dep_atom->in_jd_list = true; list_add_tail(&dep_atom->jd_item, out_list); @@ -756,10 +583,6 @@ static void jd_try_submitting_deps(struct list_head *out_list, dep_satisfied = false; } #endif /* CONFIG_MALI_BIFROST_DMA_FENCE */ -#ifdef CONFIG_KDS - dep_satisfied = dep_satisfied && - dep_atom->kds_dep_satisfied; -#endif if (dep0_valid && dep1_valid && dep_satisfied) { dep_atom->in_jd_list = true; @@ -997,6 +820,7 @@ bool jd_submit_atom(struct kbase_context *kctx, const struct base_jd_atom_v2 *us katom->x_pre_dep = NULL; katom->x_post_dep = NULL; katom->will_fail_event_code = BASE_JD_EVENT_NOT_STARTED; + katom->softjob_data = NULL; /* Implicitly sets katom->protected_state.enter as well. */ katom->protected_state.exit = KBASE_ATOM_EXIT_PROTECTED_CHECK; @@ -1004,12 +828,6 @@ bool jd_submit_atom(struct kbase_context *kctx, const struct base_jd_atom_v2 *us katom->age = kctx->age_count++; INIT_LIST_HEAD(&katom->jd_item); -#ifdef CONFIG_KDS - /* Start by assuming that the KDS dependencies are satisfied, - * kbase_jd_pre_external_resources will correct this if there are dependencies */ - katom->kds_dep_satisfied = true; - katom->kds_rset = NULL; -#endif /* CONFIG_KDS */ #ifdef CONFIG_MALI_BIFROST_DMA_FENCE kbase_fence_dep_count_set(katom, -1); #endif @@ -1185,6 +1003,16 @@ bool jd_submit_atom(struct kbase_context *kctx, const struct base_jd_atom_v2 *us goto out; } + /* Reject fence wait soft-job atoms accessing external resources */ + if ((katom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES) && + ((katom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE) == BASE_JD_REQ_SOFT_FENCE_WAIT)) { + dev_warn(kctx->kbdev->dev, + "Rejecting fence wait soft-job atom accessing external resources"); + katom->event_code = BASE_JD_EVENT_JOB_INVALID; + ret = jd_done_nolock(katom, NULL); + goto out; + } + if (katom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES) { /* handle what we need to do to access the external resources */ if (kbase_jd_pre_external_resources(katom, user_atom) != 0) { @@ -1227,14 +1055,6 @@ bool jd_submit_atom(struct kbase_context *kctx, const struct base_jd_atom_v2 *us ret = false; goto out; } -#ifdef CONFIG_KDS - if (!katom->kds_dep_satisfied) { - /* Queue atom due to KDS dependency */ - ret = false; - goto out; - } -#endif /* CONFIG_KDS */ - #ifdef CONFIG_MALI_BIFROST_DMA_FENCE if (kbase_fence_dep_count_read(katom) != -1) { @@ -1322,12 +1142,6 @@ int kbase_jd_submit(struct kbase_context *kctx, 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); @@ -1673,7 +1487,6 @@ void kbase_jd_done(struct kbase_jd_atom *katom, int slot_nr, #endif WARN_ON(work_pending(&katom->work)); - KBASE_DEBUG_ASSERT(0 == object_is_on_stack(&katom->work)); INIT_WORK(&katom->work, kbase_jd_done_worker); queue_work(kctx->jctx.job_done_wq, &katom->work); } @@ -1698,7 +1511,6 @@ void kbase_jd_cancel(struct kbase_device *kbdev, struct kbase_jd_atom *katom) katom->event_code = BASE_JD_EVENT_JOB_CANCELLED; - KBASE_DEBUG_ASSERT(0 == object_is_on_stack(&katom->work)); INIT_WORK(&katom->work, jd_cancel_worker); queue_work(kctx->jctx.job_done_wq, &katom->work); } @@ -1732,24 +1544,6 @@ void kbase_jd_zap_context(struct kbase_context *kctx) } -#ifdef CONFIG_KDS - - /* For each job waiting on a kds resource, cancel the wait and force the job to - * complete early, this is done so that we don't leave jobs outstanding waiting - * on kds resources which may never be released when contexts are zapped, resulting - * in a hang. - * - * Note that we can safely iterate over the list as the struct kbase_jd_context lock is held, - * this prevents items being removed when calling job_done_nolock in kbase_cancel_kds_wait_job. - */ - - list_for_each(entry, &kctx->waiting_kds_resource) { - katom = list_entry(entry, struct kbase_jd_atom, node); - - kbase_cancel_kds_wait_job(katom); - } -#endif - #ifdef CONFIG_MALI_BIFROST_DMA_FENCE kbase_dma_fence_cancel_all_atoms(kctx); #endif @@ -1772,9 +1566,6 @@ int kbase_jd_init(struct kbase_context *kctx) { int i; int mali_err = 0; -#ifdef CONFIG_KDS - int err; -#endif /* CONFIG_KDS */ KBASE_DEBUG_ASSERT(kctx); @@ -1809,24 +1600,12 @@ int kbase_jd_init(struct kbase_context *kctx) spin_lock_init(&kctx->jctx.tb_lock); -#ifdef CONFIG_KDS - err = kds_callback_init(&kctx->jctx.kds_cb, 0, kds_dep_clear); - if (0 != err) { - mali_err = -EINVAL; - goto out2; - } -#endif /* CONFIG_KDS */ - kctx->jctx.job_nr = 0; INIT_LIST_HEAD(&kctx->completed_jobs); atomic_set(&kctx->work_count, 0); return 0; -#ifdef CONFIG_KDS - out2: - destroy_workqueue(kctx->jctx.job_done_wq); -#endif /* CONFIG_KDS */ out1: return mali_err; } @@ -1837,9 +1616,6 @@ void kbase_jd_exit(struct kbase_context *kctx) { KBASE_DEBUG_ASSERT(kctx); -#ifdef CONFIG_KDS - kds_callback_term(&kctx->jctx.kds_cb); -#endif /* CONFIG_KDS */ /* Work queue is emptied by this */ destroy_workqueue(kctx->jctx.job_done_wq); } diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd_debugfs.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd_debugfs.c index fed4ad5816aba7..2dda5fbf286ff9 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd_debugfs.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd_debugfs.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifdef CONFIG_DEBUG_FS #include <linux/seq_file.h> @@ -24,6 +29,7 @@ #if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE) #include <mali_kbase_sync.h> #endif +#include <mali_kbase_ioctl.h> struct kbase_jd_debugfs_depinfo { u8 id; diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd_debugfs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd_debugfs.h index fae32919b22f19..ce0cb61f8c2797 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd_debugfs.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd_debugfs.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_jd_debugfs.h * Header file for job dispatcher-related entries in debugfs diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jm.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jm.c index 0c5c6a6f78cb39..da78a1670d9b8c 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jm.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jm.c @@ -1,21 +1,26 @@ /* * - * (C) COPYRIGHT 2014-2016 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * HW access job manager common APIs */ @@ -39,7 +44,7 @@ static bool kbase_jm_next_job(struct kbase_device *kbdev, int js, struct kbase_context *kctx; int i; - kctx = kbdev->hwaccess.active_kctx; + kctx = kbdev->hwaccess.active_kctx[js]; if (!kctx) return true; @@ -101,10 +106,14 @@ void kbase_jm_try_kick_all(struct kbase_device *kbdev) void kbase_jm_idle_ctx(struct kbase_device *kbdev, struct kbase_context *kctx) { + int js; + lockdep_assert_held(&kbdev->hwaccess_lock); - if (kbdev->hwaccess.active_kctx == kctx) - kbdev->hwaccess.active_kctx = NULL; + for (js = 0; js < BASE_JM_MAX_NR_SLOTS; js++) { + if (kbdev->hwaccess.active_kctx[js] == kctx) + kbdev->hwaccess.active_kctx[js] = NULL; + } } struct kbase_jd_atom *kbase_jm_return_atom_to_js(struct kbase_device *kbdev, diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jm.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jm.h index a74ee24c8058fa..c468ea4d20a54e 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jm.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jm.h @@ -7,15 +7,20 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Job manager common APIs */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js.c index 677e438aedfacd..0ef7cf67cd3872 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js.c @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2011-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Job Scheduler Implementation */ @@ -140,13 +145,11 @@ static void kbase_js_sync_timers(struct kbase_device *kbdev) bool kbasep_js_runpool_retain_ctx_nolock(struct kbase_device *kbdev, struct kbase_context *kctx) { - struct kbasep_js_device_data *js_devdata; bool result = false; int as_nr; KBASE_DEBUG_ASSERT(kbdev != NULL); KBASE_DEBUG_ASSERT(kctx != NULL); - js_devdata = &kbdev->js_data; lockdep_assert_held(&kbdev->hwaccess_lock); @@ -419,7 +422,7 @@ static bool kbase_js_ctx_list_add_unpullable_nolock(struct kbase_device *kbdev, int kbasep_js_devdata_init(struct kbase_device * const kbdev) { struct kbasep_js_device_data *jsdd; - int i; + int i, j; KBASE_DEBUG_ASSERT(kbdev != NULL); @@ -524,8 +527,10 @@ int kbasep_js_devdata_init(struct kbase_device * const kbdev) sema_init(&jsdd->schedule_sem, 1); for (i = 0; i < kbdev->gpu_props.num_job_slots; ++i) { - INIT_LIST_HEAD(&jsdd->ctx_list_pullable[i]); - INIT_LIST_HEAD(&jsdd->ctx_list_unpullable[i]); + for (j = 0; j < KBASE_JS_ATOM_SCHED_PRIO_COUNT; ++j) { + INIT_LIST_HEAD(&jsdd->ctx_list_pullable[i][j]); + INIT_LIST_HEAD(&jsdd->ctx_list_unpullable[i][j]); + } } return 0; @@ -549,13 +554,13 @@ void kbasep_js_devdata_term(struct kbase_device *kbdev) */ KBASE_DEBUG_ASSERT(js_devdata->nr_all_contexts_running == 0); KBASE_DEBUG_ASSERT(memcmp( - js_devdata->runpool_irq.ctx_attr_ref_count, - zero_ctx_attr_ref_count, - sizeof(zero_ctx_attr_ref_count)) == 0); + js_devdata->runpool_irq.ctx_attr_ref_count, + zero_ctx_attr_ref_count, + sizeof(zero_ctx_attr_ref_count)) == 0); CSTD_UNUSED(zero_ctx_attr_ref_count); } -int kbasep_js_kctx_init(struct kbase_context * const kctx) +int kbasep_js_kctx_init(struct kbase_context *const kctx) { struct kbase_device *kbdev; struct kbasep_js_kctx_info *js_kctx_info; @@ -663,7 +668,7 @@ static bool kbase_js_ctx_list_add_pullable_nolock(struct kbase_device *kbdev, list_del_init(&kctx->jctx.sched_info.ctx.ctx_list_entry[js]); list_add_tail(&kctx->jctx.sched_info.ctx.ctx_list_entry[js], - &kbdev->js_data.ctx_list_pullable[js]); + &kbdev->js_data.ctx_list_pullable[js][kctx->priority]); if (!kctx->slots_pullable) { kbdev->js_data.nr_contexts_pullable++; @@ -703,7 +708,7 @@ static bool kbase_js_ctx_list_add_pullable_head_nolock( list_del_init(&kctx->jctx.sched_info.ctx.ctx_list_entry[js]); list_add(&kctx->jctx.sched_info.ctx.ctx_list_entry[js], - &kbdev->js_data.ctx_list_pullable[js]); + &kbdev->js_data.ctx_list_pullable[js][kctx->priority]); if (!kctx->slots_pullable) { kbdev->js_data.nr_contexts_pullable++; @@ -774,7 +779,7 @@ static bool kbase_js_ctx_list_add_unpullable_nolock(struct kbase_device *kbdev, lockdep_assert_held(&kbdev->hwaccess_lock); list_move_tail(&kctx->jctx.sched_info.ctx.ctx_list_entry[js], - &kbdev->js_data.ctx_list_unpullable[js]); + &kbdev->js_data.ctx_list_unpullable[js][kctx->priority]); if (kctx->slots_pullable == (1 << js)) { kbdev->js_data.nr_contexts_pullable--; @@ -849,19 +854,23 @@ static struct kbase_context *kbase_js_ctx_list_pop_head_nolock( int js) { struct kbase_context *kctx; + int i; lockdep_assert_held(&kbdev->hwaccess_lock); - if (list_empty(&kbdev->js_data.ctx_list_pullable[js])) - return NULL; + for (i = 0; i < KBASE_JS_ATOM_SCHED_PRIO_COUNT; i++) { + if (list_empty(&kbdev->js_data.ctx_list_pullable[js][i])) + continue; - kctx = list_entry(kbdev->js_data.ctx_list_pullable[js].next, - struct kbase_context, - jctx.sched_info.ctx.ctx_list_entry[js]); + kctx = list_entry(kbdev->js_data.ctx_list_pullable[js][i].next, + struct kbase_context, + jctx.sched_info.ctx.ctx_list_entry[js]); - list_del_init(&kctx->jctx.sched_info.ctx.ctx_list_entry[js]); + list_del_init(&kctx->jctx.sched_info.ctx.ctx_list_entry[js]); - return kctx; + return kctx; + } + return NULL; } /** @@ -1062,6 +1071,51 @@ static bool kbase_js_dep_validate(struct kbase_context *kctx, return ret; } +void kbase_js_set_ctx_priority(struct kbase_context *kctx, int new_priority) +{ + struct kbase_device *kbdev = kctx->kbdev; + int js; + + lockdep_assert_held(&kbdev->hwaccess_lock); + + /* Move kctx to the pullable/upullable list as per the new priority */ + if (new_priority != kctx->priority) { + for (js = 0; js < kbdev->gpu_props.num_job_slots; js++) { + if (kctx->slots_pullable & (1 << js)) + list_move_tail(&kctx->jctx.sched_info.ctx.ctx_list_entry[js], + &kbdev->js_data.ctx_list_pullable[js][new_priority]); + else + list_move_tail(&kctx->jctx.sched_info.ctx.ctx_list_entry[js], + &kbdev->js_data.ctx_list_unpullable[js][new_priority]); + } + + kctx->priority = new_priority; + } +} + +void kbase_js_update_ctx_priority(struct kbase_context *kctx) +{ + struct kbase_device *kbdev = kctx->kbdev; + int new_priority = KBASE_JS_ATOM_SCHED_PRIO_LOW; + int prio; + + lockdep_assert_held(&kbdev->hwaccess_lock); + + if (kbdev->js_ctx_scheduling_mode == KBASE_JS_SYSTEM_PRIORITY_MODE) { + /* Determine the new priority for context, as per the priority + * of currently in-use atoms. + */ + for (prio = 0; prio < KBASE_JS_ATOM_SCHED_PRIO_COUNT; prio++) { + if (kctx->atoms_count[prio]) { + new_priority = prio; + break; + } + } + } + + kbase_js_set_ctx_priority(kctx, new_priority); +} + bool kbasep_js_add_job(struct kbase_context *kctx, struct kbase_jd_atom *atom) { @@ -1093,12 +1147,12 @@ bool kbasep_js_add_job(struct kbase_context *kctx, KBASE_DEBUG_ASSERT(js_kctx_info->ctx.nr_jobs < U32_MAX); ++(js_kctx_info->ctx.nr_jobs); - /* Setup any scheduling information */ - kbasep_js_clear_job_retry_submit(atom); - /* Lock for state available during IRQ */ spin_lock_irqsave(&kbdev->hwaccess_lock, flags); + if (++kctx->atoms_count[atom->sched_priority] == 1) + kbase_js_update_ctx_priority(kctx); + if (!kbase_js_dep_validate(kctx, atom)) { /* Dependencies could not be represented */ --(js_kctx_info->ctx.nr_jobs); @@ -1107,6 +1161,19 @@ bool kbasep_js_add_job(struct kbase_context *kctx, * dependencies */ atom->status = KBASE_JD_ATOM_STATE_QUEUED; + /* Undo the count, as the atom will get added again later but + * leave the context priority adjusted or boosted, in case if + * this was the first higher priority atom received for this + * context. + * This will prevent the scenario of priority inversion, where + * another context having medium priority atoms keeps getting + * scheduled over this context, which is having both lower and + * higher priority atoms, but higher priority atoms are blocked + * due to dependency on lower priority atoms. With priority + * boost the high priority atom will get to run at earliest. + */ + kctx->atoms_count[atom->sched_priority]--; + spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags); mutex_unlock(&js_devdata->runpool_mutex); @@ -1134,7 +1201,8 @@ bool kbasep_js_add_job(struct kbase_context *kctx, } /* If this context is active and the atom is the first on its slot, * kick the job manager to attempt to fast-start the atom */ - if (enqueue_required && kctx == kbdev->hwaccess.active_kctx) + if (enqueue_required && kctx == + kbdev->hwaccess.active_kctx[atom->slot_nr]) kbase_jm_try_kick(kbdev, 1 << atom->slot_nr); spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags); @@ -1146,9 +1214,8 @@ bool kbasep_js_add_job(struct kbase_context *kctx, if (!kbase_ctx_flag(kctx, KCTX_SCHEDULED)) { if (kbase_ctx_flag(kctx, KCTX_DYING)) { /* A job got added while/after kbase_job_zap_context() - * was called on a non-scheduled context (e.g. KDS - * dependency resolved). Kill that job by killing the - * context. */ + * was called on a non-scheduled context. Kill that job + * by killing the context. */ kbasep_js_runpool_requeue_or_kill_ctx(kbdev, kctx, false); } else if (js_kctx_info->ctx.nr_jobs == 1) { @@ -1174,13 +1241,12 @@ void kbasep_js_remove_job(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbase_jd_atom *atom) { struct kbasep_js_kctx_info *js_kctx_info; - struct kbasep_js_device_data *js_devdata; + unsigned long flags; KBASE_DEBUG_ASSERT(kbdev != NULL); KBASE_DEBUG_ASSERT(kctx != NULL); KBASE_DEBUG_ASSERT(atom != NULL); - js_devdata = &kbdev->js_data; js_kctx_info = &kctx->jctx.sched_info; KBASE_TRACE_ADD_REFCOUNT(kbdev, JS_REMOVE_JOB, kctx, atom, atom->jc, @@ -1189,6 +1255,11 @@ void kbasep_js_remove_job(struct kbase_device *kbdev, /* De-refcount ctx.nr_jobs */ KBASE_DEBUG_ASSERT(js_kctx_info->ctx.nr_jobs > 0); --(js_kctx_info->ctx.nr_jobs); + + spin_lock_irqsave(&kbdev->hwaccess_lock, flags); + if (--kctx->atoms_count[atom->sched_priority] == 0) + kbase_js_update_ctx_priority(kctx); + spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags); } bool kbasep_js_remove_cancelled_job(struct kbase_device *kbdev, @@ -1196,15 +1267,12 @@ bool kbasep_js_remove_cancelled_job(struct kbase_device *kbdev, { unsigned long flags; struct kbasep_js_atom_retained_state katom_retained_state; - struct kbasep_js_device_data *js_devdata; bool attr_state_changed; KBASE_DEBUG_ASSERT(kbdev != NULL); KBASE_DEBUG_ASSERT(kctx != NULL); KBASE_DEBUG_ASSERT(katom != NULL); - js_devdata = &kbdev->js_data; - kbasep_js_atom_retained_state_copy(&katom_retained_state, katom); kbasep_js_remove_job(kbdev, kctx, katom); @@ -1227,11 +1295,9 @@ bool kbasep_js_runpool_retain_ctx(struct kbase_device *kbdev, struct kbase_context *kctx) { unsigned long flags; - struct kbasep_js_device_data *js_devdata; bool result; KBASE_DEBUG_ASSERT(kbdev != NULL); - js_devdata = &kbdev->js_data; mutex_lock(&kbdev->mmu_hw_mutex); spin_lock_irqsave(&kbdev->hwaccess_lock, flags); @@ -1264,9 +1330,8 @@ struct kbase_context *kbasep_js_runpool_lookup_ctx(struct kbase_device *kbdev, } /** - * kbasep_js_release_result - Try running more jobs after releasing a context - * and/or atom - * + * kbasep_js_run_jobs_after_ctx_and_atom_release - Try running more jobs after + * releasing a context and/or atom * @kbdev: The kbase_device to operate on * @kctx: The kbase_context to operate on * @katom_retained_state: Retained state from the atom @@ -1301,32 +1366,26 @@ static kbasep_js_release_result kbasep_js_run_jobs_after_ctx_and_atom_release( lockdep_assert_held(&js_devdata->runpool_mutex); lockdep_assert_held(&kbdev->hwaccess_lock); - if (js_devdata->nr_user_contexts_running != 0) { - bool retry_submit = false; - int retry_jobslot = 0; + if (js_devdata->nr_user_contexts_running != 0 && runpool_ctx_attr_change) { + /* A change in runpool ctx attributes might mean we can + * run more jobs than before */ + result = KBASEP_JS_RELEASE_RESULT_SCHED_ALL; - if (katom_retained_state) - retry_submit = kbasep_js_get_atom_retry_submit_slot( - katom_retained_state, &retry_jobslot); - - if (runpool_ctx_attr_change || retry_submit) { - /* A change in runpool ctx attributes might mean we can - * run more jobs than before */ - result = KBASEP_JS_RELEASE_RESULT_SCHED_ALL; - - KBASE_TRACE_ADD_SLOT(kbdev, JD_DONE_TRY_RUN_NEXT_JOB, - kctx, NULL, 0u, retry_jobslot); - } + KBASE_TRACE_ADD_SLOT(kbdev, JD_DONE_TRY_RUN_NEXT_JOB, + kctx, NULL, 0u, 0); } return result; } -/* - * Internal function to release the reference on a ctx and an atom's "retained - * state", only taking the runpool and as transaction mutexes +/** + * kbasep_js_runpool_release_ctx_internal - Internal function to release the reference + * on a ctx and an atom's "retained state", only + * taking the runpool and as transaction mutexes + * @kbdev: The kbase_device to operate on + * @kctx: The kbase_context to operate on + * @katom_retained_state: Retained state from the atom * - * This also starts more jobs running in the case of an ctx-attribute state - * change + * This also starts more jobs running in the case of an ctx-attribute state change * * This does none of the followup actions for scheduling: * - It does not schedule in a new context @@ -1334,11 +1393,15 @@ static kbasep_js_release_result kbasep_js_run_jobs_after_ctx_and_atom_release( * * For those tasks, just call kbasep_js_runpool_release_ctx() instead * - * Requires: + * Has following requirements * - Context is scheduled in, and kctx->as_nr matches kctx_as_nr * - Context has a non-zero refcount * - Caller holds js_kctx_info->ctx.jsctx_mutex * - Caller holds js_devdata->runpool_mutex + * + * Return: A bitpattern, containing KBASEP_JS_RELEASE_RESULT_* flags, indicating + * the result of releasing a context that whether the caller should try + * scheduling a new context or should try scheduling all contexts. */ static kbasep_js_release_result kbasep_js_runpool_release_ctx_internal( struct kbase_device *kbdev, @@ -1424,8 +1487,10 @@ static kbasep_js_release_result kbasep_js_runpool_release_ctx_internal( kbase_backend_release_ctx_irq(kbdev, kctx); - if (kbdev->hwaccess.active_kctx == kctx) - kbdev->hwaccess.active_kctx = NULL; + for (slot = 0; slot < num_slots; slot++) { + if (kbdev->hwaccess.active_kctx[slot] == kctx) + kbdev->hwaccess.active_kctx[slot] = NULL; + } /* Ctx Attribute handling * @@ -1617,7 +1682,8 @@ void kbase_js_set_timeouts(struct kbase_device *kbdev) } static bool kbasep_js_schedule_ctx(struct kbase_device *kbdev, - struct kbase_context *kctx) + struct kbase_context *kctx, + int js) { struct kbasep_js_device_data *js_devdata; struct kbasep_js_kctx_info *js_kctx_info; @@ -1693,7 +1759,7 @@ static bool kbasep_js_schedule_ctx(struct kbase_device *kbdev, return false; } - kbdev->hwaccess.active_kctx = kctx; + kbdev->hwaccess.active_kctx[js] = kctx; #if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT) kbase_trace_mali_mmu_as_in_use(kctx->as_nr); @@ -1726,6 +1792,8 @@ static bool kbasep_js_schedule_ctx(struct kbase_device *kbdev, kctx_suspended = true; } + kbase_ctx_flag_clear(kctx, KCTX_PULLED_SINCE_ACTIVE_JS0 << js); + /* Transaction complete */ spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags); mutex_unlock(&kbdev->mmu_hw_mutex); @@ -1750,23 +1818,27 @@ static bool kbasep_js_schedule_ctx(struct kbase_device *kbdev, } static bool kbase_js_use_ctx(struct kbase_device *kbdev, - struct kbase_context *kctx) + struct kbase_context *kctx, + int js) { unsigned long flags; spin_lock_irqsave(&kbdev->hwaccess_lock, flags); if (kbase_ctx_flag(kctx, KCTX_SCHEDULED) && - kbase_backend_use_ctx_sched(kbdev, kctx)) { + kbase_backend_use_ctx_sched(kbdev, kctx, js)) { /* Context already has ASID - mark as active */ - kbdev->hwaccess.active_kctx = kctx; + if (kbdev->hwaccess.active_kctx[js] != kctx) { + kbdev->hwaccess.active_kctx[js] = kctx; + kbase_ctx_flag_clear(kctx, + KCTX_PULLED_SINCE_ACTIVE_JS0 << js); + } spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags); return true; /* Context already scheduled */ } spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags); - - return kbasep_js_schedule_ctx(kbdev, kctx); + return kbasep_js_schedule_ctx(kbdev, kctx, js); } void kbasep_js_schedule_privileged_ctx(struct kbase_device *kbdev, @@ -1897,7 +1969,7 @@ void kbasep_js_suspend(struct kbase_device *kbdev) void kbasep_js_resume(struct kbase_device *kbdev) { struct kbasep_js_device_data *js_devdata; - int js; + int js, prio; KBASE_DEBUG_ASSERT(kbdev); js_devdata = &kbdev->js_data; @@ -1905,31 +1977,33 @@ void kbasep_js_resume(struct kbase_device *kbdev) mutex_lock(&js_devdata->queue_mutex); for (js = 0; js < kbdev->gpu_props.num_job_slots; js++) { - struct kbase_context *kctx, *n; + for (prio = 0; prio < KBASE_JS_ATOM_SCHED_PRIO_COUNT; prio++) { + struct kbase_context *kctx, *n; - list_for_each_entry_safe(kctx, n, - &kbdev->js_data.ctx_list_unpullable[js], - jctx.sched_info.ctx.ctx_list_entry[js]) { - struct kbasep_js_kctx_info *js_kctx_info; - unsigned long flags; - bool timer_sync = false; + list_for_each_entry_safe(kctx, n, + &kbdev->js_data.ctx_list_unpullable[js][prio], + jctx.sched_info.ctx.ctx_list_entry[js]) { + struct kbasep_js_kctx_info *js_kctx_info; + unsigned long flags; + bool timer_sync = false; - js_kctx_info = &kctx->jctx.sched_info; + js_kctx_info = &kctx->jctx.sched_info; - mutex_lock(&js_kctx_info->ctx.jsctx_mutex); - mutex_lock(&js_devdata->runpool_mutex); - spin_lock_irqsave(&kbdev->hwaccess_lock, flags); + mutex_lock(&js_kctx_info->ctx.jsctx_mutex); + mutex_lock(&js_devdata->runpool_mutex); + spin_lock_irqsave(&kbdev->hwaccess_lock, flags); - if (!kbase_ctx_flag(kctx, KCTX_SCHEDULED) && - kbase_js_ctx_pullable(kctx, js, false)) - timer_sync = - kbase_js_ctx_list_add_pullable_nolock( - kbdev, kctx, js); - spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags); - if (timer_sync) - kbase_backend_ctx_count_changed(kbdev); - mutex_unlock(&js_devdata->runpool_mutex); - mutex_unlock(&js_kctx_info->ctx.jsctx_mutex); + if (!kbase_ctx_flag(kctx, KCTX_SCHEDULED) && + kbase_js_ctx_pullable(kctx, js, false)) + timer_sync = + kbase_js_ctx_list_add_pullable_nolock( + kbdev, kctx, js); + spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags); + if (timer_sync) + kbase_backend_ctx_count_changed(kbdev); + mutex_unlock(&js_devdata->runpool_mutex); + mutex_unlock(&js_kctx_info->ctx.jsctx_mutex); + } } } mutex_unlock(&js_devdata->queue_mutex); @@ -2136,6 +2210,7 @@ struct kbase_jd_atom *kbase_js_pull(struct kbase_context *kctx, int js) } kbase_ctx_flag_set(kctx, KCTX_PULLED); + kbase_ctx_flag_set(kctx, (KCTX_PULLED_SINCE_ACTIVE_JS0 << js)); pulled = atomic_inc_return(&kctx->atoms_pulled); if (pulled == 1 && !kctx->slots_pullable) { @@ -2280,7 +2355,6 @@ void kbase_js_unpull(struct kbase_context *kctx, struct kbase_jd_atom *katom) kbase_job_check_leave_disjoint(kctx->kbdev, katom); - KBASE_DEBUG_ASSERT(0 == object_is_on_stack(&katom->work)); INIT_WORK(&katom->work, js_return_worker); queue_work(kctx->jctx.job_done_wq, &katom->work); } @@ -2438,20 +2512,22 @@ struct kbase_jd_atom *kbase_js_complete_atom(struct kbase_jd_atom *katom, void kbase_js_sched(struct kbase_device *kbdev, int js_mask) { struct kbasep_js_device_data *js_devdata; - struct kbase_context *last_active; + struct kbase_context *last_active[BASE_JM_MAX_NR_SLOTS]; bool timer_sync = false; - bool ctx_waiting = false; + bool ctx_waiting[BASE_JM_MAX_NR_SLOTS]; + int js; js_devdata = &kbdev->js_data; down(&js_devdata->schedule_sem); mutex_lock(&js_devdata->queue_mutex); - last_active = kbdev->hwaccess.active_kctx; + for (js = 0; js < BASE_JM_MAX_NR_SLOTS; js++) { + last_active[js] = kbdev->hwaccess.active_kctx[js]; + ctx_waiting[js] = false; + } while (js_mask) { - int js; - js = ffs(js_mask) - 1; while (1) { @@ -2488,7 +2564,7 @@ void kbase_js_sched(struct kbase_device *kbdev, int js_mask) kbase_ctx_flag_set(kctx, KCTX_ACTIVE); } - if (!kbase_js_use_ctx(kbdev, kctx)) { + if (!kbase_js_use_ctx(kbdev, kctx, js)) { mutex_lock( &kctx->jctx.sched_info.ctx.jsctx_mutex); /* Context can not be used at this time */ @@ -2533,7 +2609,10 @@ void kbase_js_sched(struct kbase_device *kbdev, int js_mask) * Unless this context is already 'active', in * which case it's effectively already scheduled * so push it to the back of the list. */ - if (pullable && kctx == last_active) + if (pullable && kctx == last_active[js] && + kbase_ctx_flag(kctx, + (KCTX_PULLED_SINCE_ACTIVE_JS0 << + js))) timer_sync |= kbase_js_ctx_list_add_pullable_nolock( kctx->kbdev, @@ -2555,10 +2634,10 @@ void kbase_js_sched(struct kbase_device *kbdev, int js_mask) * marker to prevent it from submitting atoms in * the IRQ handler, which would prevent this * context from making progress. */ - if (last_active && kctx != last_active && - kbase_js_ctx_pullable( - last_active, js, true)) - ctx_waiting = true; + if (last_active[js] && kctx != last_active[js] + && kbase_js_ctx_pullable( + last_active[js], js, true)) + ctx_waiting[js] = true; if (context_idle) { kbase_jm_idle_ctx(kbdev, kctx); @@ -2598,8 +2677,11 @@ void kbase_js_sched(struct kbase_device *kbdev, int js_mask) if (timer_sync) kbase_js_sync_timers(kbdev); - if (kbdev->hwaccess.active_kctx == last_active && ctx_waiting) - kbdev->hwaccess.active_kctx = NULL; + for (js = 0; js < BASE_JM_MAX_NR_SLOTS; js++) { + if (kbdev->hwaccess.active_kctx[js] == last_active[js] && + ctx_waiting[js]) + kbdev->hwaccess.active_kctx[js] = NULL; + } mutex_unlock(&js_devdata->queue_mutex); up(&js_devdata->schedule_sem); diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js.h index ddada8e468a19b..963cef903209f7 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_js.h * Job Scheduler APIs. @@ -591,6 +596,27 @@ bool kbase_js_is_atom_valid(struct kbase_device *kbdev, */ void kbase_js_set_timeouts(struct kbase_device *kbdev); +/** + * kbase_js_set_ctx_priority - set the context priority + * @kctx: Context pointer + * @new_priority: New priority value for the Context + * + * The context priority is set to a new value and it is moved to the + * pullable/unpullable list as per the new priority. + */ +void kbase_js_set_ctx_priority(struct kbase_context *kctx, int new_priority); + + +/** + * kbase_js_update_ctx_priority - update the context priority + * @kctx: Context pointer + * + * The context priority gets updated as per the priority of atoms currently in + * use for that context, but only if system priority mode for context scheduling + * is being used. + */ +void kbase_js_update_ctx_priority(struct kbase_context *kctx); + /* * Helpers follow */ @@ -666,37 +692,6 @@ static inline void kbasep_js_clear_submit_allowed(struct kbasep_js_device_data * js_devdata->runpool_irq.submit_allowed &= clear_mask; } -/** - * @brief Manage the 'retry_submit_on_slot' part of a kbase_jd_atom - */ -static inline void kbasep_js_clear_job_retry_submit(struct kbase_jd_atom *atom) -{ - atom->retry_submit_on_slot = KBASEP_JS_RETRY_SUBMIT_SLOT_INVALID; -} - -/** - * Mark a slot as requiring resubmission by carrying that information on a - * completing atom. - * - * @note This can ASSERT in debug builds if the submit slot has been set to - * something other than the current value for @a js. This is because you might - * be unintentionally stopping more jobs being submitted on the old submit - * slot, and that might cause a scheduling-hang. - * - * @note If you can guarantee that the atoms for the original slot will be - * submitted on some other slot, then call kbasep_js_clear_job_retry_submit() - * first to silence the ASSERT. - */ -static inline void kbasep_js_set_job_retry_submit_slot(struct kbase_jd_atom *atom, int js) -{ - KBASE_DEBUG_ASSERT(0 <= js && js <= BASE_JM_MAX_NR_SLOTS); - KBASE_DEBUG_ASSERT((atom->retry_submit_on_slot == - KBASEP_JS_RETRY_SUBMIT_SLOT_INVALID) - || (atom->retry_submit_on_slot == js)); - - atom->retry_submit_on_slot = js; -} - /** * Create an initial 'invalid' atom retained state, that requires no * atom-related work to be done on releasing with @@ -706,7 +701,6 @@ static inline void kbasep_js_atom_retained_state_init_invalid(struct kbasep_js_a { retained_state->event_code = BASE_JD_EVENT_NOT_STARTED; retained_state->core_req = KBASEP_JS_ATOM_RETAINED_STATE_CORE_REQ_INVALID; - retained_state->retry_submit_on_slot = KBASEP_JS_RETRY_SUBMIT_SLOT_INVALID; } /** @@ -717,7 +711,6 @@ static inline void kbasep_js_atom_retained_state_copy(struct kbasep_js_atom_reta { retained_state->event_code = katom->event_code; retained_state->core_req = katom->core_req; - retained_state->retry_submit_on_slot = katom->retry_submit_on_slot; retained_state->sched_priority = katom->sched_priority; retained_state->device_nr = katom->device_nr; } @@ -753,14 +746,6 @@ static inline bool kbasep_js_atom_retained_state_is_valid(const struct kbasep_js return (bool) (katom_retained_state->core_req != KBASEP_JS_ATOM_RETAINED_STATE_CORE_REQ_INVALID); } -static inline bool kbasep_js_get_atom_retry_submit_slot(const struct kbasep_js_atom_retained_state *katom_retained_state, int *res) -{ - int js = katom_retained_state->retry_submit_on_slot; - - *res = js; - return (bool) (js >= 0); -} - /** * @brief Variant of kbasep_js_runpool_lookup_ctx() that can be used when the * context is guaranteed to be already previously retained. diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_ctx_attr.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_ctx_attr.c index 321506ada83597..6fd908aceb6653 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_ctx_attr.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_ctx_attr.c @@ -7,15 +7,20 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> #include <mali_kbase_config.h> diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_ctx_attr.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_ctx_attr.h index ce9183326a576f..be781e60c822a9 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_ctx_attr.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_ctx_attr.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_js_ctx_attr.h * Job Scheduler Context Attribute APIs diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_defs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_defs.h index 0b4890d6b50e68..b53f4adf00d3f4 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_defs.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_defs.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_js.h * Job Scheduler Type Definitions @@ -141,6 +146,48 @@ enum { /** Combination of KBASE_JS_ATOM_DONE_<...> bits */ typedef u32 kbasep_js_atom_done_code; +/* + * Context scheduling mode defines for kbase_device::js_ctx_scheduling_mode + */ +enum { + /* + * In this mode, the context containing higher priority atoms will be + * scheduled first and also the new runnable higher priority atoms can + * preempt lower priority atoms currently running on the GPU, even if + * they belong to a different context. + */ + KBASE_JS_SYSTEM_PRIORITY_MODE = 0, + + /* + * In this mode, the contexts are scheduled in round-robin fashion and + * the new runnable higher priority atoms can preempt the lower priority + * atoms currently running on the GPU, only if they belong to the same + * context. + */ + KBASE_JS_PROCESS_LOCAL_PRIORITY_MODE, + + /* Must be the last in the enum */ + KBASE_JS_PRIORITY_MODE_COUNT, +}; + +/* + * Internal atom priority defines for kbase_jd_atom::sched_prio + */ +enum { + KBASE_JS_ATOM_SCHED_PRIO_HIGH = 0, + KBASE_JS_ATOM_SCHED_PRIO_MED, + KBASE_JS_ATOM_SCHED_PRIO_LOW, + KBASE_JS_ATOM_SCHED_PRIO_COUNT, +}; + +/* Invalid priority for kbase_jd_atom::sched_prio */ +#define KBASE_JS_ATOM_SCHED_PRIO_INVALID -1 + +/* Default priority in the case of contexts with no atoms, or being lenient + * about invalid priorities from userspace. + */ +#define KBASE_JS_ATOM_SCHED_PRIO_DEFAULT KBASE_JS_ATOM_SCHED_PRIO_MED + /** * @brief KBase Device Data Job Scheduler sub-structure * @@ -224,12 +271,12 @@ struct kbasep_js_device_data { /** * List of contexts that can currently be pulled from */ - struct list_head ctx_list_pullable[BASE_JM_MAX_NR_SLOTS]; + struct list_head ctx_list_pullable[BASE_JM_MAX_NR_SLOTS][KBASE_JS_ATOM_SCHED_PRIO_COUNT]; /** * List of contexts that can not currently be pulled from, but have * jobs currently running. */ - struct list_head ctx_list_unpullable[BASE_JM_MAX_NR_SLOTS]; + struct list_head ctx_list_unpullable[BASE_JM_MAX_NR_SLOTS][KBASE_JS_ATOM_SCHED_PRIO_COUNT]; /** Number of currently scheduled user contexts (excluding ones that are not submitting jobs) */ s8 nr_user_contexts_running; @@ -334,8 +381,6 @@ struct kbasep_js_atom_retained_state { base_jd_core_req core_req; /* priority */ int sched_priority; - /** Job Slot to retry submitting to if submission from IRQ handler failed */ - int retry_submit_on_slot; /* Core group atom was executed on */ u32 device_nr; @@ -362,22 +407,6 @@ struct kbasep_js_atom_retained_state { */ #define KBASEP_JS_TICK_RESOLUTION_US 1 -/* - * Internal atom priority defines for kbase_jd_atom::sched_prio - */ -enum { - KBASE_JS_ATOM_SCHED_PRIO_HIGH = 0, - KBASE_JS_ATOM_SCHED_PRIO_MED, - KBASE_JS_ATOM_SCHED_PRIO_LOW, - KBASE_JS_ATOM_SCHED_PRIO_COUNT, -}; - -/* Invalid priority for kbase_jd_atom::sched_prio */ -#define KBASE_JS_ATOM_SCHED_PRIO_INVALID -1 - -/* Default priority in the case of contexts with no atoms, or being lenient - * about invalid priorities from userspace */ -#define KBASE_JS_ATOM_SCHED_PRIO_DEFAULT KBASE_JS_ATOM_SCHED_PRIO_MED /** @} *//* end group kbase_js */ /** @} *//* end group base_kbase_api */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_linux.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_linux.h index 6d1e61fd41e038..003ac9e68a76c0 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_linux.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_linux.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_linux.h * Base kernel APIs, Linux implementation. diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem.c index fffe1fc43bffb6..bec4439fc06638 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem.c @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_mem.c * Base kernel memory APIs @@ -24,13 +29,11 @@ #ifdef CONFIG_DMA_SHARED_BUFFER #include <linux/dma-buf.h> #endif /* CONFIG_DMA_SHARED_BUFFER */ -#ifdef CONFIG_UMP -#include <linux/ump.h> -#endif /* CONFIG_UMP */ #include <linux/kernel.h> #include <linux/bug.h> #include <linux/compat.h> #include <linux/version.h> +#include <linux/log2.h> #include <mali_kbase_config.h> #include <mali_kbase.h> @@ -231,7 +234,10 @@ struct kbase_va_region *kbase_region_tracker_find_region_base_address(struct kba KBASE_EXPORT_TEST_API(kbase_region_tracker_find_region_base_address); /* Find region meeting given requirements */ -static struct kbase_va_region *kbase_region_tracker_find_region_meeting_reqs(struct kbase_context *kctx, struct kbase_va_region *reg_reqs, size_t nr_pages, size_t align) +static struct kbase_va_region *kbase_region_tracker_find_region_meeting_reqs( + struct kbase_context *kctx, struct kbase_va_region *reg_reqs, + size_t nr_pages, size_t align_offset, size_t align_mask, + u64 *out_start_pfn) { struct rb_node *rbnode = NULL; struct kbase_va_region *reg = NULL; @@ -239,7 +245,6 @@ static struct kbase_va_region *kbase_region_tracker_find_region_meeting_reqs(str /* Note that this search is a linear search, as we do not have a target address in mind, so does not benefit from the rbtree search */ - rbtree = kbase_reg_flags_to_rbtree(kctx, reg_reqs); rbnode = rb_first(rbtree); @@ -249,12 +254,23 @@ static struct kbase_va_region *kbase_region_tracker_find_region_meeting_reqs(str if ((reg->nr_pages >= nr_pages) && (reg->flags & KBASE_REG_FREE)) { /* Check alignment */ - u64 start_pfn = (reg->start_pfn + align - 1) & ~(align - 1); + u64 start_pfn = reg->start_pfn; + + /* When align_offset == align, this sequence is + * equivalent to: + * (start_pfn + align_mask) & ~(align_mask) + * + * Otherwise, it aligns to n*align + offset, for the + * lowest value n that makes this still >start_pfn */ + start_pfn += align_mask; + start_pfn -= (start_pfn - align_offset) & (align_mask); if ((start_pfn >= reg->start_pfn) && (start_pfn <= (reg->start_pfn + reg->nr_pages - 1)) && - ((start_pfn + nr_pages - 1) <= (reg->start_pfn + reg->nr_pages - 1))) + ((start_pfn + nr_pages - 1) <= (reg->start_pfn + reg->nr_pages - 1))) { + *out_start_pfn = start_pfn; return reg; + } } rbnode = rb_next(rbnode); } @@ -425,7 +441,7 @@ int kbase_add_va_region(struct kbase_context *kctx, align = 1; /* must be a power of 2 */ - KBASE_DEBUG_ASSERT((align & (align - 1)) == 0); + KBASE_DEBUG_ASSERT(is_power_of_2(align)); KBASE_DEBUG_ASSERT(nr_pages > 0); /* Path 1: Map a specific address. Find the enclosing region, which *must* be free. */ @@ -458,38 +474,44 @@ int kbase_add_va_region(struct kbase_context *kctx, goto exit; } - /* Path 2: Map any free address which meets the requirements. */ - { + /* Path 2: Map any free address which meets the requirements. + * + * Depending on the zone the allocation request is for + * we might need to retry it. */ + do { u64 start_pfn; + size_t align_offset = align; + size_t align_mask = align - 1; + + if ((reg->flags & KBASE_REG_TILER_ALIGN_TOP)) { + WARN(align > 1, + "kbase_add_va_region with align %lx might not be honored for KBASE_REG_TILER_ALIGN_TOP memory", + (unsigned long)align); + align_mask = reg->extent - 1; + align_offset = reg->extent - reg->initial_commit; + } + + tmp = kbase_region_tracker_find_region_meeting_reqs(kctx, reg, + nr_pages, align_offset, align_mask, + &start_pfn); + if (tmp) { + err = kbase_insert_va_region_nolock(kctx, reg, tmp, + start_pfn, nr_pages); + break; + } /* - * Depending on the zone the allocation request is for - * we might need to retry it. + * If the allocation is not from the same zone as JIT + * then don't retry, we're out of VA and there is + * nothing which can be done about it. */ - do { - tmp = kbase_region_tracker_find_region_meeting_reqs( - kctx, reg, nr_pages, align); - if (tmp) { - start_pfn = (tmp->start_pfn + align - 1) & - ~(align - 1); - err = kbase_insert_va_region_nolock(kctx, reg, - tmp, start_pfn, nr_pages); - break; - } - - /* - * If the allocation is not from the same zone as JIT - * then don't retry, we're out of VA and there is - * nothing which can be done about it. - */ - if ((reg->flags & KBASE_REG_ZONE_MASK) != - KBASE_REG_ZONE_CUSTOM_VA) - break; - } while (kbase_jit_evict(kctx)); + if ((reg->flags & KBASE_REG_ZONE_MASK) != + KBASE_REG_ZONE_CUSTOM_VA) + break; + } while (kbase_jit_evict(kctx)); - if (!tmp) - err = -ENOMEM; - } + if (!tmp) + err = -ENOMEM; exit: return err; @@ -510,7 +532,8 @@ static void kbase_region_tracker_ds_init(struct kbase_context *kctx, /* Although exec and custom_va_reg don't always exist, * initialize unconditionally because of the mem_view debugfs - * implementation which relies on these being empty */ + * implementation which relies on these being empty + */ kctx->reg_rbtree_exec = RB_ROOT; kctx->reg_rbtree_custom = RB_ROOT; @@ -542,6 +565,32 @@ void kbase_region_tracker_term(struct kbase_context *kctx) kbase_region_tracker_erase_rbtree(&kctx->reg_rbtree_custom); } +static size_t kbase_get_same_va_bits(struct kbase_context *kctx) +{ +#if defined(CONFIG_ARM64) + /* VA_BITS can be as high as 48 bits, but all bits are available for + * both user and kernel. + */ + size_t cpu_va_bits = VA_BITS; +#elif defined(CONFIG_X86_64) + /* x86_64 can access 48 bits of VA, but the 48th is used to denote + * kernel (1) vs userspace (0), so the max here is 47. + */ + size_t cpu_va_bits = 47; +#elif defined(CONFIG_ARM) || defined(CONFIG_X86_32) + size_t cpu_va_bits = sizeof(void *) * BITS_PER_BYTE; +#else +#error "Unknown CPU VA width for this architecture" +#endif + +#ifdef CONFIG_64BIT + if (kbase_ctx_flag(kctx, KCTX_COMPAT)) + cpu_va_bits = 32; +#endif + + return min(cpu_va_bits, (size_t) kctx->kbdev->gpu_props.mmu.va_bits); +} + /** * Initialize the region tracker data structure. */ @@ -550,7 +599,7 @@ int kbase_region_tracker_init(struct kbase_context *kctx) struct kbase_va_region *same_va_reg; struct kbase_va_region *exec_reg = NULL; struct kbase_va_region *custom_va_reg = NULL; - size_t same_va_bits = sizeof(void *) * BITS_PER_BYTE; + size_t same_va_bits = kbase_get_same_va_bits(kctx); u64 custom_va_size = KBASE_REG_ZONE_CUSTOM_VA_SIZE; u64 gpu_va_limit = (1ULL << kctx->kbdev->gpu_props.mmu.va_bits) >> PAGE_SHIFT; u64 same_va_pages; @@ -559,26 +608,6 @@ int kbase_region_tracker_init(struct kbase_context *kctx) /* Take the lock as kbase_free_alloced_region requires it */ kbase_gpu_vm_lock(kctx); -#if defined(CONFIG_ARM64) - same_va_bits = VA_BITS; -#elif defined(CONFIG_X86_64) - same_va_bits = 47; -#elif defined(CONFIG_64BIT) -#error Unsupported 64-bit architecture -#endif - -#ifdef CONFIG_64BIT - if (kbase_ctx_flag(kctx, KCTX_COMPAT)) - same_va_bits = 32; - else if (kbase_hw_has_feature(kctx->kbdev, BASE_HW_FEATURE_33BIT_VA)) - same_va_bits = 33; -#endif - - if (kctx->kbdev->gpu_props.mmu.va_bits < same_va_bits) { - err = -EINVAL; - goto fail_unlock; - } - same_va_pages = (1ULL << (same_va_bits - PAGE_SHIFT)) - 1; /* all have SAME_VA */ same_va_reg = kbase_alloc_free_region(kctx, 1, @@ -627,7 +656,8 @@ int kbase_region_tracker_init(struct kbase_context *kctx) } #endif - kbase_region_tracker_ds_init(kctx, same_va_reg, exec_reg, custom_va_reg); + kbase_region_tracker_ds_init(kctx, same_va_reg, exec_reg, + custom_va_reg); kctx->same_va_end = same_va_pages + 1; @@ -643,33 +673,16 @@ int kbase_region_tracker_init(struct kbase_context *kctx) return err; } -int kbase_region_tracker_init_jit(struct kbase_context *kctx, u64 jit_va_pages) -{ #ifdef CONFIG_64BIT +static int kbase_region_tracker_init_jit_64(struct kbase_context *kctx, + u64 jit_va_pages) +{ struct kbase_va_region *same_va; struct kbase_va_region *custom_va_reg; - u64 same_va_bits; + u64 same_va_bits = kbase_get_same_va_bits(kctx); u64 total_va_size; int err; - /* - * Nothing to do for 32-bit clients, JIT uses the existing - * custom VA zone. - */ - if (kbase_ctx_flag(kctx, KCTX_COMPAT)) - return 0; - -#if defined(CONFIG_ARM64) - same_va_bits = VA_BITS; -#elif defined(CONFIG_X86_64) - same_va_bits = 47; -#elif defined(CONFIG_64BIT) -#error Unsupported 64-bit architecture -#endif - - if (kbase_hw_has_feature(kctx->kbdev, BASE_HW_FEATURE_33BIT_VA)) - same_va_bits = 33; - total_va_size = (1ULL << (same_va_bits - PAGE_SHIFT)) - 1; kbase_gpu_vm_lock(kctx); @@ -729,9 +742,27 @@ int kbase_region_tracker_init_jit(struct kbase_context *kctx, u64 jit_va_pages) fail_unlock: kbase_gpu_vm_unlock(kctx); return err; -#else - return 0; +} +#endif + +int kbase_region_tracker_init_jit(struct kbase_context *kctx, u64 jit_va_pages, + u8 max_allocations, u8 trim_level) +{ + if (trim_level > 100) + return -EINVAL; + + kctx->jit_max_allocations = max_allocations; + kctx->trim_level = trim_level; + +#ifdef CONFIG_64BIT + if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) + return kbase_region_tracker_init_jit_64(kctx, jit_va_pages); #endif + /* + * Nothing to do for 32-bit clients, JIT uses the existing + * custom VA zone. + */ + return 0; } int kbase_mem_init(struct kbase_device *kbdev) @@ -799,7 +830,8 @@ KBASE_EXPORT_TEST_API(kbase_mem_term); * The allocated object is not part of any list yet, and is flagged as * KBASE_REG_FREE. No mapping is allocated yet. * - * zone is KBASE_REG_ZONE_CUSTOM_VA, KBASE_REG_ZONE_SAME_VA, or KBASE_REG_ZONE_EXEC + * zone is KBASE_REG_ZONE_CUSTOM_VA, KBASE_REG_ZONE_SAME_VA, + * or KBASE_REG_ZONE_EXEC * */ struct kbase_va_region *kbase_alloc_free_region(struct kbase_context *kctx, u64 start_pfn, size_t nr_pages, int zone) @@ -829,6 +861,8 @@ struct kbase_va_region *kbase_alloc_free_region(struct kbase_context *kctx, u64 new_reg->start_pfn = start_pfn; new_reg->nr_pages = nr_pages; + INIT_LIST_HEAD(&new_reg->jit_node); + return new_reg; } @@ -847,6 +881,8 @@ KBASE_EXPORT_TEST_API(kbase_alloc_free_region); void kbase_free_alloced_region(struct kbase_va_region *reg) { if (!(reg->flags & KBASE_REG_FREE)) { + mutex_lock(®->kctx->jit_evict_lock); + /* * The physical allocation should have been removed from the * eviction list before this function is called. However, in the @@ -855,6 +891,8 @@ void kbase_free_alloced_region(struct kbase_va_region *reg) * on the list at termination time of the region tracker. */ if (!list_empty(®->gpu_alloc->evict_node)) { + mutex_unlock(®->kctx->jit_evict_lock); + /* * Unlink the physical allocation before unmaking it * evictable so that the allocation isn't grown back to @@ -877,6 +915,8 @@ void kbase_free_alloced_region(struct kbase_va_region *reg) KBASE_MEM_TYPE_NATIVE); kbase_mem_evictable_unmake(reg->gpu_alloc); } + } else { + mutex_unlock(®->kctx->jit_evict_lock); } /* @@ -902,6 +942,12 @@ int kbase_gpu_mmap(struct kbase_context *kctx, struct kbase_va_region *reg, u64 size_t i = 0; unsigned long attr; unsigned long mask = ~KBASE_REG_MEMATTR_MASK; + unsigned long gwt_mask = ~0; + +#ifdef CONFIG_MALI_JOB_DUMP + if (kctx->gwt_enabled) + gwt_mask = ~KBASE_REG_GPU_WR; +#endif if ((kctx->kbdev->system_coherency == COHERENCY_ACE) && (reg->flags & KBASE_REG_SHARE_BOTH)) @@ -929,7 +975,7 @@ int kbase_gpu_mmap(struct kbase_context *kctx, struct kbase_va_region *reg, u64 reg->start_pfn + (i * stride), alloc->imported.alias.aliased[i].alloc->pages + alloc->imported.alias.aliased[i].offset, alloc->imported.alias.aliased[i].length, - reg->flags); + reg->flags & gwt_mask); if (err) goto bad_insert; @@ -939,7 +985,7 @@ int kbase_gpu_mmap(struct kbase_context *kctx, struct kbase_va_region *reg, u64 reg->start_pfn + i * stride, kctx->aliasing_sink_page, alloc->imported.alias.aliased[i].length, - (reg->flags & mask) | attr); + (reg->flags & mask & gwt_mask) | attr); if (err) goto bad_insert; @@ -949,7 +995,7 @@ int kbase_gpu_mmap(struct kbase_context *kctx, struct kbase_va_region *reg, u64 err = kbase_mmu_insert_pages(kctx, reg->start_pfn, kbase_get_gpu_phy_pages(reg), kbase_reg_current_backed_size(reg), - reg->flags); + reg->flags & gwt_mask); if (err) goto bad_insert; kbase_mem_phy_alloc_gpu_mapped(reg->gpu_alloc); @@ -1085,6 +1131,36 @@ int kbasep_find_enclosing_cpu_mapping_offset( KBASE_EXPORT_TEST_API(kbasep_find_enclosing_cpu_mapping_offset); +int kbasep_find_enclosing_gpu_mapping_start_and_offset(struct kbase_context *kctx, + u64 gpu_addr, size_t size, u64 *start, u64 *offset) +{ + struct kbase_va_region *region; + + kbase_gpu_vm_lock(kctx); + + region = kbase_region_tracker_find_region_enclosing_address(kctx, gpu_addr); + + if (!region) { + kbase_gpu_vm_unlock(kctx); + return -EINVAL; + } + + *start = region->start_pfn << PAGE_SHIFT; + + *offset = gpu_addr - *start; + + if (((region->start_pfn + region->nr_pages) << PAGE_SHIFT) < (gpu_addr + size)) { + kbase_gpu_vm_unlock(kctx); + return -EINVAL; + } + + kbase_gpu_vm_unlock(kctx); + + return 0; +} + +KBASE_EXPORT_TEST_API(kbasep_find_enclosing_gpu_mapping_start_and_offset); + void kbase_sync_single(struct kbase_context *kctx, struct tagged_addr t_cpu_pa, struct tagged_addr t_gpu_pa, off_t offset, size_t size, enum kbase_sync_type sync_fn) @@ -1268,6 +1344,11 @@ int kbase_mem_free_region(struct kbase_context *kctx, struct kbase_va_region *re KBASE_DEBUG_ASSERT(NULL != reg); lockdep_assert_held(&kctx->reg_lock); + if (reg->flags & KBASE_REG_JIT) { + dev_warn(reg->kctx->kbdev->dev, "Attempt to free JIT memory!\n"); + return -EINVAL; + } + /* * Unlink the physical allocation before unmaking it evictable so * that the allocation isn't grown back to its last backed size @@ -1413,6 +1494,9 @@ int kbase_update_region_flags(struct kbase_context *kctx, reg->flags |= KBASE_REG_SHARE_IN; } + if (flags & BASE_MEM_TILER_ALIGN_TOP) + reg->flags |= KBASE_REG_TILER_ALIGN_TOP; + /* Set up default MEMATTR usage */ if (kctx->kbdev->system_coherency == COHERENCY_ACE && (reg->flags & KBASE_REG_SHARE_BOTH)) { @@ -1426,12 +1510,10 @@ int kbase_update_region_flags(struct kbase_context *kctx, return 0; } -int kbase_alloc_phy_pages_helper( - struct kbase_mem_phy_alloc *alloc, - size_t nr_pages_requested) +int kbase_alloc_phy_pages_helper(struct kbase_mem_phy_alloc *alloc, + size_t nr_pages_requested) { int new_page_count __maybe_unused; - size_t old_page_count = alloc->nents; size_t nr_left = nr_pages_requested; int res; struct kbase_context *kctx; @@ -1440,6 +1522,11 @@ int kbase_alloc_phy_pages_helper( KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_NATIVE); KBASE_DEBUG_ASSERT(alloc->imported.kctx); + if (alloc->reg) { + if (nr_pages_requested > alloc->reg->nr_pages - alloc->nents) + goto invalid_request; + } + kctx = alloc->imported.kctx; if (nr_pages_requested == 0) @@ -1454,7 +1541,7 @@ int kbase_alloc_phy_pages_helper( * allocation is visible to the OOM killer */ kbase_process_page_usage_inc(kctx, nr_pages_requested); - tp = alloc->pages + old_page_count; + tp = alloc->pages + alloc->nents; #ifdef CONFIG_MALI_2MB_ALLOC /* Check if we have enough pages requested so we can allocate a large @@ -1564,15 +1651,6 @@ int kbase_alloc_phy_pages_helper( goto alloc_failed; } - /* - * Request a zone cache update, this scans only the new pages an - * appends their information to the zone cache. if the update - * fails then clear the cache so we fall-back to doing things - * page by page. - */ - if (kbase_zone_cache_update(alloc, old_page_count) != 0) - kbase_zone_cache_clear(alloc); - KBASE_TLSTREAM_AUX_PAGESALLOC( kctx->id, (u64)new_page_count); @@ -1583,21 +1661,201 @@ int kbase_alloc_phy_pages_helper( alloc_failed: /* rollback needed if got one or more 2MB but failed later */ - if (nr_left != nr_pages_requested) - kbase_mem_pool_free_pages(&kctx->lp_mem_pool, - nr_pages_requested - nr_left, - alloc->pages + old_page_count, - false, - false); + if (nr_left != nr_pages_requested) { + size_t nr_pages_to_free = nr_pages_requested - nr_left; + + alloc->nents += nr_pages_to_free; + + kbase_process_page_usage_inc(kctx, nr_pages_to_free); + kbase_atomic_add_pages(nr_pages_to_free, &kctx->used_pages); + kbase_atomic_add_pages(nr_pages_to_free, + &kctx->kbdev->memdev.used_pages); + + kbase_free_phy_pages_helper(alloc, nr_pages_to_free); + } kbase_process_page_usage_dec(kctx, nr_pages_requested); kbase_atomic_sub_pages(nr_pages_requested, &kctx->used_pages); kbase_atomic_sub_pages(nr_pages_requested, &kctx->kbdev->memdev.used_pages); +invalid_request: return -ENOMEM; } +struct tagged_addr *kbase_alloc_phy_pages_helper_locked( + struct kbase_mem_phy_alloc *alloc, struct kbase_mem_pool *pool, + size_t nr_pages_requested, + struct kbase_sub_alloc **prealloc_sa) +{ + int new_page_count __maybe_unused; + size_t nr_left = nr_pages_requested; + int res; + struct kbase_context *kctx; + struct tagged_addr *tp; + struct tagged_addr *new_pages = NULL; + + KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_NATIVE); + KBASE_DEBUG_ASSERT(alloc->imported.kctx); + + lockdep_assert_held(&pool->pool_lock); + +#if !defined(CONFIG_MALI_2MB_ALLOC) + WARN_ON(pool->order); +#endif + + if (alloc->reg) { + if (nr_pages_requested > alloc->reg->nr_pages - alloc->nents) + goto invalid_request; + } + + kctx = alloc->imported.kctx; + + lockdep_assert_held(&kctx->mem_partials_lock); + + if (nr_pages_requested == 0) + goto done; /*nothing to do*/ + + new_page_count = kbase_atomic_add_pages( + nr_pages_requested, &kctx->used_pages); + kbase_atomic_add_pages(nr_pages_requested, + &kctx->kbdev->memdev.used_pages); + + /* Increase mm counters before we allocate pages so that this + * allocation is visible to the OOM killer + */ + kbase_process_page_usage_inc(kctx, nr_pages_requested); + + tp = alloc->pages + alloc->nents; + new_pages = tp; + +#ifdef CONFIG_MALI_2MB_ALLOC + if (pool->order) { + int nr_lp = nr_left / (SZ_2M / SZ_4K); + + res = kbase_mem_pool_alloc_pages_locked(pool, + nr_lp * (SZ_2M / SZ_4K), + tp); + + if (res > 0) { + nr_left -= res; + tp += res; + } + + if (nr_left) { + struct kbase_sub_alloc *sa, *temp_sa; + + list_for_each_entry_safe(sa, temp_sa, + &kctx->mem_partials, link) { + int pidx = 0; + + while (nr_left) { + pidx = find_next_zero_bit(sa->sub_pages, + SZ_2M / SZ_4K, + pidx); + bitmap_set(sa->sub_pages, pidx, 1); + *tp++ = as_tagged_tag(page_to_phys( + sa->page + pidx), + FROM_PARTIAL); + nr_left--; + + if (bitmap_full(sa->sub_pages, + SZ_2M / SZ_4K)) { + /* unlink from partial list when + * full + */ + list_del_init(&sa->link); + break; + } + } + } + } + + /* only if we actually have a chunk left <512. If more it + * indicates that we couldn't allocate a 2MB above, so no point + * to retry here. + */ + if (nr_left > 0 && nr_left < (SZ_2M / SZ_4K)) { + /* create a new partial and suballocate the rest from it + */ + struct page *np = NULL; + + np = kbase_mem_pool_alloc_locked(pool); + + if (np) { + int i; + struct kbase_sub_alloc *const sa = *prealloc_sa; + struct page *p; + + /* store pointers back to the control struct */ + np->lru.next = (void *)sa; + for (p = np; p < np + SZ_2M / SZ_4K; p++) + p->lru.prev = (void *)np; + INIT_LIST_HEAD(&sa->link); + bitmap_zero(sa->sub_pages, SZ_2M / SZ_4K); + sa->page = np; + + for (i = 0; i < nr_left; i++) + *tp++ = as_tagged_tag( + page_to_phys(np + i), + FROM_PARTIAL); + + bitmap_set(sa->sub_pages, 0, nr_left); + nr_left = 0; + /* Indicate to user that we'll free this memory + * later. + */ + *prealloc_sa = NULL; + + /* expose for later use */ + list_add(&sa->link, &kctx->mem_partials); + } + } + if (nr_left) + goto alloc_failed; + } else { +#endif + res = kbase_mem_pool_alloc_pages_locked(pool, + nr_left, + tp); + if (res <= 0) + goto alloc_failed; +#ifdef CONFIG_MALI_2MB_ALLOC + } +#endif + + KBASE_TLSTREAM_AUX_PAGESALLOC( + kctx->id, + (u64)new_page_count); + + alloc->nents += nr_pages_requested; +done: + return new_pages; + +alloc_failed: + /* rollback needed if got one or more 2MB but failed later */ + if (nr_left != nr_pages_requested) { + size_t nr_pages_to_free = nr_pages_requested - nr_left; + + alloc->nents += nr_pages_to_free; + + kbase_process_page_usage_inc(kctx, nr_pages_to_free); + kbase_atomic_add_pages(nr_pages_to_free, &kctx->used_pages); + kbase_atomic_add_pages(nr_pages_to_free, + &kctx->kbdev->memdev.used_pages); + + kbase_free_phy_pages_helper(alloc, nr_pages_to_free); + } + + kbase_process_page_usage_dec(kctx, nr_pages_requested); + kbase_atomic_sub_pages(nr_pages_requested, &kctx->used_pages); + kbase_atomic_sub_pages(nr_pages_requested, + &kctx->kbdev->memdev.used_pages); + +invalid_request: + return NULL; +} + static void free_partial(struct kbase_context *kctx, struct tagged_addr tp) { struct page *p, *head_page; @@ -1650,15 +1908,6 @@ int kbase_free_phy_pages_helper( start_free++; } - /* - * Clear the zone cache, we don't expect JIT allocations to be - * shrunk in parts so there is no point trying to optimize for that - * by scanning for the changes caused by freeing this memory and - * updating the existing cache entries. - */ - kbase_zone_cache_clear(alloc); - - while (nr_pages_to_free) { if (is_huge_head(*start_free)) { /* This is a 2MB entry, so free all the 512 pages that @@ -1718,20 +1967,141 @@ int kbase_free_phy_pages_helper( return 0; } -void kbase_mem_kref_free(struct kref *kref) +static void free_partial_locked(struct kbase_context *kctx, + struct kbase_mem_pool *pool, struct tagged_addr tp) { - struct kbase_mem_phy_alloc *alloc; + struct page *p, *head_page; + struct kbase_sub_alloc *sa; - alloc = container_of(kref, struct kbase_mem_phy_alloc, kref); + lockdep_assert_held(&pool->pool_lock); + lockdep_assert_held(&kctx->mem_partials_lock); - switch (alloc->type) { - case KBASE_MEM_TYPE_NATIVE: { - WARN_ON(!alloc->imported.kctx); - /* - * The physical allocation must have been removed from the - * eviction list before trying to free it. - */ - WARN_ON(!list_empty(&alloc->evict_node)); + p = phys_to_page(as_phys_addr_t(tp)); + head_page = (struct page *)p->lru.prev; + sa = (struct kbase_sub_alloc *)head_page->lru.next; + clear_bit(p - head_page, sa->sub_pages); + if (bitmap_empty(sa->sub_pages, SZ_2M / SZ_4K)) { + list_del(&sa->link); + kbase_mem_pool_free(pool, head_page, true); + kfree(sa); + } else if (bitmap_weight(sa->sub_pages, SZ_2M / SZ_4K) == + SZ_2M / SZ_4K - 1) { + /* expose the partial again */ + list_add(&sa->link, &kctx->mem_partials); + } +} + +void kbase_free_phy_pages_helper_locked(struct kbase_mem_phy_alloc *alloc, + struct kbase_mem_pool *pool, struct tagged_addr *pages, + size_t nr_pages_to_free) +{ + struct kbase_context *kctx = alloc->imported.kctx; + bool syncback; + bool reclaimed = (alloc->evicted != 0); + struct tagged_addr *start_free; + size_t freed = 0; + + KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_NATIVE); + KBASE_DEBUG_ASSERT(alloc->imported.kctx); + KBASE_DEBUG_ASSERT(alloc->nents >= nr_pages_to_free); + + lockdep_assert_held(&pool->pool_lock); + lockdep_assert_held(&kctx->mem_partials_lock); + + /* early out if nothing to do */ + if (!nr_pages_to_free) + return; + + start_free = pages; + + syncback = alloc->properties & KBASE_MEM_PHY_ALLOC_ACCESSED_CACHED; + + /* pad start_free to a valid start location */ + while (nr_pages_to_free && is_huge(*start_free) && + !is_huge_head(*start_free)) { + nr_pages_to_free--; + start_free++; + } + + while (nr_pages_to_free) { + if (is_huge_head(*start_free)) { + /* This is a 2MB entry, so free all the 512 pages that + * it points to + */ + WARN_ON(!pool->order); + kbase_mem_pool_free_pages_locked(pool, + 512, + start_free, + syncback, + reclaimed); + nr_pages_to_free -= 512; + start_free += 512; + freed += 512; + } else if (is_partial(*start_free)) { + WARN_ON(!pool->order); + free_partial_locked(kctx, pool, *start_free); + nr_pages_to_free--; + start_free++; + freed++; + } else { + struct tagged_addr *local_end_free; + + WARN_ON(pool->order); + local_end_free = start_free; + while (nr_pages_to_free && + !is_huge(*local_end_free) && + !is_partial(*local_end_free)) { + local_end_free++; + nr_pages_to_free--; + } + kbase_mem_pool_free_pages_locked(pool, + local_end_free - start_free, + start_free, + syncback, + reclaimed); + freed += local_end_free - start_free; + start_free += local_end_free - start_free; + } + } + + alloc->nents -= freed; + + /* + * If the allocation was not evicted (i.e. evicted == 0) then + * the page accounting needs to be done. + */ + if (!reclaimed) { + int new_page_count; + + kbase_process_page_usage_dec(kctx, freed); + new_page_count = kbase_atomic_sub_pages(freed, + &kctx->used_pages); + kbase_atomic_sub_pages(freed, + &kctx->kbdev->memdev.used_pages); + + KBASE_TLSTREAM_AUX_PAGESALLOC( + kctx->id, + (u64)new_page_count); + } +} + +void kbase_mem_kref_free(struct kref *kref) +{ + struct kbase_mem_phy_alloc *alloc; + + alloc = container_of(kref, struct kbase_mem_phy_alloc, kref); + + switch (alloc->type) { + case KBASE_MEM_TYPE_NATIVE: { + if (!WARN_ON(!alloc->imported.kctx)) { + /* + * The physical allocation must have been removed from + * the eviction list before trying to free it. + */ + mutex_lock(&alloc->imported.kctx->jit_evict_lock); + WARN_ON(!list_empty(&alloc->evict_node)); + mutex_unlock(&alloc->imported.kctx->jit_evict_lock); + } kbase_free_phy_pages_helper(alloc, alloc->nents); break; } @@ -1752,11 +2122,6 @@ void kbase_mem_kref_free(struct kref *kref) case KBASE_MEM_TYPE_RAW: /* raw pages, external cleanup */ break; - #ifdef CONFIG_UMP - case KBASE_MEM_TYPE_IMPORTED_UMP: - ump_dd_release(alloc->imported.ump_handle); - break; -#endif #ifdef CONFIG_DMA_SHARED_BUFFER case KBASE_MEM_TYPE_IMPORTED_UMM: dma_buf_detach(alloc->imported.umm.dma_buf, @@ -1846,8 +2211,13 @@ bool kbase_check_alloc_flags(unsigned long flags) if ((flags & (BASE_MEM_PROT_CPU_WR | BASE_MEM_PROT_GPU_WR)) == 0) return false; - /* GPU cannot be writing to GPU executable memory and cannot grow the memory on page fault. */ - if ((flags & BASE_MEM_PROT_GPU_EX) && (flags & (BASE_MEM_PROT_GPU_WR | BASE_MEM_GROW_ON_GPF))) + /* GPU executable memory cannot: + * - Be written by the GPU + * - Be grown on GPU page fault + * - Have the top of its initial commit aligned to 'extent' */ + if ((flags & BASE_MEM_PROT_GPU_EX) && (flags & + (BASE_MEM_PROT_GPU_WR | BASE_MEM_GROW_ON_GPF | + BASE_MEM_TILER_ALIGN_TOP))) return false; /* GPU should have at least read or write access otherwise there is no @@ -1859,6 +2229,12 @@ bool kbase_check_alloc_flags(unsigned long flags) if ((flags & BASE_MEM_IMPORT_SHARED) == BASE_MEM_IMPORT_SHARED) return false; + /* Should not combine BASE_MEM_COHERENT_LOCAL with + * BASE_MEM_COHERENT_SYSTEM */ + if ((flags & (BASE_MEM_COHERENT_LOCAL | BASE_MEM_COHERENT_SYSTEM)) == + (BASE_MEM_COHERENT_LOCAL | BASE_MEM_COHERENT_SYSTEM)) + return false; + return true; } @@ -1880,6 +2256,10 @@ bool kbase_check_import_flags(unsigned long flags) if (flags & BASE_MEM_GROW_ON_GPF) return false; + /* Imported memory cannot be aligned to the end of its initial commit */ + if (flags & BASE_MEM_TILER_ALIGN_TOP) + return false; + /* GPU should have at least read or write access otherwise there is no reason for importing. */ if ((flags & (BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR)) == 0) @@ -1892,6 +2272,89 @@ bool kbase_check_import_flags(unsigned long flags) return true; } +int kbase_check_alloc_sizes(struct kbase_context *kctx, unsigned long flags, + u64 va_pages, u64 commit_pages, u64 large_extent) +{ + struct device *dev = kctx->kbdev->dev; + int gpu_pc_bits = kctx->kbdev->gpu_props.props.core_props.log2_program_counter_size; + u64 gpu_pc_pages_max = 1ULL << gpu_pc_bits >> PAGE_SHIFT; + struct kbase_va_region test_reg; + + /* kbase_va_region's extent member can be of variable size, so check against that type */ + test_reg.extent = large_extent; + +#define KBASE_MSG_PRE "GPU allocation attempted with " + + if (0 == va_pages) { + dev_warn(dev, KBASE_MSG_PRE "0 va_pages!"); + return -EINVAL; + } + + if (va_pages > (U64_MAX / PAGE_SIZE)) { + /* 64-bit address range is the max */ + dev_warn(dev, KBASE_MSG_PRE "va_pages==%lld larger than 64-bit address range!", + (unsigned long long)va_pages); + return -ENOMEM; + } + + /* Note: commit_pages is checked against va_pages during + * kbase_alloc_phy_pages() */ + + /* Limit GPU executable allocs to GPU PC size */ + if ((flags & BASE_MEM_PROT_GPU_EX) && (va_pages > gpu_pc_pages_max)) { + dev_warn(dev, KBASE_MSG_PRE "BASE_MEM_PROT_GPU_EX and va_pages==%lld larger than GPU PC range %lld", + (unsigned long long)va_pages, + (unsigned long long)gpu_pc_pages_max); + + return -EINVAL; + } + + if ((flags & (BASE_MEM_GROW_ON_GPF | BASE_MEM_TILER_ALIGN_TOP)) && + test_reg.extent == 0) { + dev_warn(dev, KBASE_MSG_PRE "BASE_MEM_GROW_ON_GPF or BASE_MEM_TILER_ALIGN_TOP but extent == 0\n"); + return -EINVAL; + } + + if (!(flags & (BASE_MEM_GROW_ON_GPF | BASE_MEM_TILER_ALIGN_TOP)) && + test_reg.extent != 0) { + dev_warn(dev, KBASE_MSG_PRE "neither BASE_MEM_GROW_ON_GPF nor BASE_MEM_TILER_ALIGN_TOP set but extent != 0\n"); + return -EINVAL; + } + + /* BASE_MEM_TILER_ALIGN_TOP memory has a number of restrictions */ + if (flags & BASE_MEM_TILER_ALIGN_TOP) { +#define KBASE_MSG_PRE_FLAG KBASE_MSG_PRE "BASE_MEM_TILER_ALIGN_TOP and " + unsigned long small_extent; + + if (large_extent > BASE_MEM_TILER_ALIGN_TOP_EXTENT_MAX_PAGES) { + dev_warn(dev, KBASE_MSG_PRE_FLAG "extent==%lld pages exceeds limit %lld", + (unsigned long long)large_extent, + BASE_MEM_TILER_ALIGN_TOP_EXTENT_MAX_PAGES); + return -EINVAL; + } + /* For use with is_power_of_2, which takes unsigned long, so + * must ensure e.g. on 32-bit kernel it'll fit in that type */ + small_extent = (unsigned long)large_extent; + + if (!is_power_of_2(small_extent)) { + dev_warn(dev, KBASE_MSG_PRE_FLAG "extent==%ld not a non-zero power of 2", + small_extent); + return -EINVAL; + } + + if (commit_pages > large_extent) { + dev_warn(dev, KBASE_MSG_PRE_FLAG "commit_pages==%ld exceeds extent==%ld", + (unsigned long)commit_pages, + (unsigned long)large_extent); + return -EINVAL; + } +#undef KBASE_MSG_PRE_FLAG + } + + return 0; +#undef KBASE_MSG_PRE +} + /** * @brief Acquire the per-context region list lock */ @@ -2120,6 +2583,7 @@ static void kbase_jit_destroy_worker(struct work_struct *work) mutex_unlock(&kctx->jit_evict_lock); kbase_gpu_vm_lock(kctx); + reg->flags &= ~KBASE_REG_JIT; kbase_mem_free_region(kctx, reg); kbase_gpu_vm_unlock(kctx); } while (1); @@ -2127,6 +2591,7 @@ static void kbase_jit_destroy_worker(struct work_struct *work) int kbase_jit_init(struct kbase_context *kctx) { + mutex_lock(&kctx->jit_evict_lock); INIT_LIST_HEAD(&kctx->jit_active_head); INIT_LIST_HEAD(&kctx->jit_pool_head); INIT_LIST_HEAD(&kctx->jit_destroy_head); @@ -2134,49 +2599,268 @@ int kbase_jit_init(struct kbase_context *kctx) INIT_LIST_HEAD(&kctx->jit_pending_alloc); INIT_LIST_HEAD(&kctx->jit_atoms_head); + mutex_unlock(&kctx->jit_evict_lock); + + kctx->jit_max_allocations = 0; + kctx->jit_current_allocations = 0; + kctx->trim_level = 0; return 0; } +/* Check if the allocation from JIT pool is of the same size as the new JIT + * allocation and also, if BASE_JIT_ALLOC_MEM_TILER_ALIGN_TOP is set, meets + * the alignment requirements. + */ +static bool meet_size_and_tiler_align_top_requirements(struct kbase_context *kctx, + struct kbase_va_region *walker, struct base_jit_alloc_info *info) +{ + bool meet_reqs = true; + + if (walker->nr_pages != info->va_pages) + meet_reqs = false; + else if (info->flags & BASE_JIT_ALLOC_MEM_TILER_ALIGN_TOP) { + size_t align = info->extent; + size_t align_mask = align - 1; + + if ((walker->start_pfn + info->commit_pages) & align_mask) + meet_reqs = false; + } + + return meet_reqs; +} + +static int kbase_jit_grow(struct kbase_context *kctx, + struct base_jit_alloc_info *info, struct kbase_va_region *reg) +{ + size_t delta; + size_t pages_required; + size_t old_size; + struct kbase_mem_pool *pool; + int ret = -ENOMEM; + struct tagged_addr *gpu_pages; + struct kbase_sub_alloc *prealloc_sas[2] = { NULL, NULL }; + int i; + + if (info->commit_pages > reg->nr_pages) { + /* Attempted to grow larger than maximum size */ + return -EINVAL; + } + + kbase_gpu_vm_lock(kctx); + + /* Make the physical backing no longer reclaimable */ + if (!kbase_mem_evictable_unmake(reg->gpu_alloc)) + goto update_failed; + + if (reg->gpu_alloc->nents >= info->commit_pages) + goto done; + + /* Grow the backing */ + old_size = reg->gpu_alloc->nents; + + /* Allocate some more pages */ + delta = info->commit_pages - reg->gpu_alloc->nents; + pages_required = delta; + +#ifdef CONFIG_MALI_2MB_ALLOC + /* Preallocate memory for the sub-allocation structs */ + for (i = 0; i != ARRAY_SIZE(prealloc_sas); ++i) { + prealloc_sas[i] = kmalloc(sizeof(*prealloc_sas[i]), + GFP_KERNEL); + if (!prealloc_sas[i]) + goto update_failed; + } + + if (pages_required >= (SZ_2M / SZ_4K)) { + pool = &kctx->lp_mem_pool; + /* Round up to number of 2 MB pages required */ + pages_required += ((SZ_2M / SZ_4K) - 1); + pages_required /= (SZ_2M / SZ_4K); + } else { +#endif + pool = &kctx->mem_pool; +#ifdef CONFIG_MALI_2MB_ALLOC + } +#endif + + if (reg->cpu_alloc != reg->gpu_alloc) + pages_required *= 2; + + mutex_lock(&kctx->mem_partials_lock); + kbase_mem_pool_lock(pool); + + /* As we can not allocate memory from the kernel with the vm_lock held, + * grow the pool to the required size with the lock dropped. We hold the + * pool lock to prevent another thread from allocating from the pool + * between the grow and allocation. + */ + while (kbase_mem_pool_size(pool) < pages_required) { + int pool_delta = pages_required - kbase_mem_pool_size(pool); + + kbase_mem_pool_unlock(pool); + mutex_unlock(&kctx->mem_partials_lock); + kbase_gpu_vm_unlock(kctx); + + if (kbase_mem_pool_grow(pool, pool_delta)) + goto update_failed_unlocked; + + kbase_gpu_vm_lock(kctx); + mutex_lock(&kctx->mem_partials_lock); + kbase_mem_pool_lock(pool); + } + + gpu_pages = kbase_alloc_phy_pages_helper_locked(reg->gpu_alloc, pool, + delta, &prealloc_sas[0]); + if (!gpu_pages) { + kbase_mem_pool_unlock(pool); + mutex_unlock(&kctx->mem_partials_lock); + goto update_failed; + } + + if (reg->cpu_alloc != reg->gpu_alloc) { + struct tagged_addr *cpu_pages; + + cpu_pages = kbase_alloc_phy_pages_helper_locked(reg->cpu_alloc, + pool, delta, &prealloc_sas[1]); + if (!cpu_pages) { + kbase_free_phy_pages_helper_locked(reg->gpu_alloc, + pool, gpu_pages, delta); + kbase_mem_pool_unlock(pool); + mutex_unlock(&kctx->mem_partials_lock); + goto update_failed; + } + } + kbase_mem_pool_unlock(pool); + mutex_unlock(&kctx->mem_partials_lock); + + ret = kbase_mem_grow_gpu_mapping(kctx, reg, info->commit_pages, + old_size); + /* + * The grow failed so put the allocation back in the + * pool and return failure. + */ + if (ret) + goto update_failed; + +done: + ret = 0; + + /* Update attributes of JIT allocation taken from the pool */ + reg->initial_commit = info->commit_pages; + reg->extent = info->extent; + +update_failed: + kbase_gpu_vm_unlock(kctx); +update_failed_unlocked: + for (i = 0; i != ARRAY_SIZE(prealloc_sas); ++i) + kfree(prealloc_sas[i]); + + return ret; +} + struct kbase_va_region *kbase_jit_allocate(struct kbase_context *kctx, struct base_jit_alloc_info *info) { struct kbase_va_region *reg = NULL; - struct kbase_va_region *walker; - struct kbase_va_region *temp; - size_t current_diff = SIZE_MAX; - int ret; + if (kctx->jit_current_allocations >= kctx->jit_max_allocations) { + /* Too many current allocations */ + return NULL; + } + if (info->max_allocations > 0 && + kctx->jit_current_allocations_per_bin[info->bin_id] >= + info->max_allocations) { + /* Too many current allocations in this bin */ + return NULL; + } mutex_lock(&kctx->jit_evict_lock); + /* * Scan the pool for an existing allocation which meets our * requirements and remove it. */ - list_for_each_entry_safe(walker, temp, &kctx->jit_pool_head, jit_node) { - - if (walker->nr_pages >= info->va_pages) { - size_t min_size, max_size, diff; + if (info->usage_id != 0) { + /* First scan for an allocation with the same usage ID */ + struct kbase_va_region *walker; + struct kbase_va_region *temp; + size_t current_diff = SIZE_MAX; + + list_for_each_entry_safe(walker, temp, &kctx->jit_pool_head, + jit_node) { + + if (walker->jit_usage_id == info->usage_id && + walker->jit_bin_id == info->bin_id && + meet_size_and_tiler_align_top_requirements( + kctx, walker, info)) { + size_t min_size, max_size, diff; + + /* + * The JIT allocations VA requirements have been + * met, it's suitable but other allocations + * might be a better fit. + */ + min_size = min_t(size_t, + walker->gpu_alloc->nents, + info->commit_pages); + max_size = max_t(size_t, + walker->gpu_alloc->nents, + info->commit_pages); + diff = max_size - min_size; + + if (current_diff > diff) { + current_diff = diff; + reg = walker; + } - /* - * The JIT allocations VA requirements have been - * meet, it's suitable but other allocations - * might be a better fit. - */ - min_size = min_t(size_t, walker->gpu_alloc->nents, - info->commit_pages); - max_size = max_t(size_t, walker->gpu_alloc->nents, - info->commit_pages); - diff = max_size - min_size; - - if (current_diff > diff) { - current_diff = diff; - reg = walker; + /* The allocation is an exact match */ + if (current_diff == 0) + break; } + } + } - /* The allocation is an exact match, stop looking */ - if (current_diff == 0) - break; + if (!reg) { + /* No allocation with the same usage ID, or usage IDs not in + * use. Search for an allocation we can reuse. + */ + struct kbase_va_region *walker; + struct kbase_va_region *temp; + size_t current_diff = SIZE_MAX; + + list_for_each_entry_safe(walker, temp, &kctx->jit_pool_head, + jit_node) { + + if (walker->jit_bin_id == info->bin_id && + meet_size_and_tiler_align_top_requirements( + kctx, walker, info)) { + size_t min_size, max_size, diff; + + /* + * The JIT allocations VA requirements have been + * met, it's suitable but other allocations + * might be a better fit. + */ + min_size = min_t(size_t, + walker->gpu_alloc->nents, + info->commit_pages); + max_size = max_t(size_t, + walker->gpu_alloc->nents, + info->commit_pages); + diff = max_size - min_size; + + if (current_diff > diff) { + current_diff = diff; + reg = walker; + } + + /* The allocation is an exact match, so stop + * looking. + */ + if (current_diff == 0) + break; + } } } @@ -2195,42 +2879,15 @@ struct kbase_va_region *kbase_jit_allocate(struct kbase_context *kctx, list_del_init(®->gpu_alloc->evict_node); mutex_unlock(&kctx->jit_evict_lock); - kbase_gpu_vm_lock(kctx); - - /* Make the physical backing no longer reclaimable */ - if (!kbase_mem_evictable_unmake(reg->gpu_alloc)) - goto update_failed; - - /* Grow the backing if required */ - if (reg->gpu_alloc->nents < info->commit_pages) { - size_t delta; - size_t old_size = reg->gpu_alloc->nents; - - /* Allocate some more pages */ - delta = info->commit_pages - reg->gpu_alloc->nents; - if (kbase_alloc_phy_pages_helper(reg->gpu_alloc, delta) - != 0) - goto update_failed; - - if (reg->cpu_alloc != reg->gpu_alloc) { - if (kbase_alloc_phy_pages_helper( - reg->cpu_alloc, delta) != 0) { - kbase_free_phy_pages_helper( - reg->gpu_alloc, delta); - goto update_failed; - } - } - - ret = kbase_mem_grow_gpu_mapping(kctx, reg, - info->commit_pages, old_size); + if (kbase_jit_grow(kctx, info, reg) < 0) { /* - * The grow failed so put the allocation back in the - * pool and return failure. + * An update to an allocation from the pool failed, + * chances are slim a new allocation would fair any + * better so return the allocation to the pool and + * return the function with failure. */ - if (ret) - goto update_failed; + goto update_failed_unlocked; } - kbase_gpu_vm_unlock(kctx); } else { /* No suitable JIT allocation was found so create a new one */ u64 flags = BASE_MEM_PROT_CPU_RD | BASE_MEM_PROT_GPU_RD | @@ -2240,25 +2897,30 @@ struct kbase_va_region *kbase_jit_allocate(struct kbase_context *kctx, mutex_unlock(&kctx->jit_evict_lock); + if (info->flags & BASE_JIT_ALLOC_MEM_TILER_ALIGN_TOP) + flags |= BASE_MEM_TILER_ALIGN_TOP; + reg = kbase_mem_alloc(kctx, info->va_pages, info->commit_pages, info->extent, &flags, &gpu_addr); if (!reg) goto out_unlocked; + reg->flags |= KBASE_REG_JIT; + mutex_lock(&kctx->jit_evict_lock); list_add(®->jit_node, &kctx->jit_active_head); mutex_unlock(&kctx->jit_evict_lock); } + kctx->jit_current_allocations++; + kctx->jit_current_allocations_per_bin[info->bin_id]++; + + reg->jit_usage_id = info->usage_id; + reg->jit_bin_id = info->bin_id; + return reg; -update_failed: - /* - * An update to an allocation from the pool failed, chances - * are slim a new allocation would fair any better so return - * the allocation to the pool and return the function with failure. - */ - kbase_gpu_vm_unlock(kctx); +update_failed_unlocked: mutex_lock(&kctx->jit_evict_lock); list_move(®->jit_node, &kctx->jit_pool_head); mutex_unlock(&kctx->jit_evict_lock); @@ -2268,13 +2930,53 @@ struct kbase_va_region *kbase_jit_allocate(struct kbase_context *kctx, void kbase_jit_free(struct kbase_context *kctx, struct kbase_va_region *reg) { - /* The physical backing of memory in the pool is always reclaimable */ + u64 old_pages; + + /* Get current size of JIT region */ + old_pages = kbase_reg_current_backed_size(reg); + if (reg->initial_commit < old_pages) { + /* Free trim_level % of region, but don't go below initial + * commit size + */ + u64 new_size = MAX(reg->initial_commit, + div_u64(old_pages * (100 - kctx->trim_level), 100)); + u64 delta = old_pages - new_size; + + if (delta) { + kbase_mem_shrink_cpu_mapping(kctx, reg, old_pages-delta, + old_pages); + kbase_mem_shrink_gpu_mapping(kctx, reg, old_pages-delta, + old_pages); + + kbase_free_phy_pages_helper(reg->cpu_alloc, delta); + if (reg->cpu_alloc != reg->gpu_alloc) + kbase_free_phy_pages_helper(reg->gpu_alloc, + delta); + } + } + + kctx->jit_current_allocations--; + kctx->jit_current_allocations_per_bin[reg->jit_bin_id]--; + + kbase_mem_evictable_mark_reclaim(reg->gpu_alloc); + kbase_gpu_vm_lock(kctx); - kbase_mem_evictable_make(reg->gpu_alloc); + reg->flags |= KBASE_REG_DONT_NEED; + kbase_mem_shrink_cpu_mapping(kctx, reg, 0, reg->gpu_alloc->nents); kbase_gpu_vm_unlock(kctx); + /* + * Add the allocation to the eviction list and the jit pool, after this + * point the shrink can reclaim it, or it may be reused. + */ mutex_lock(&kctx->jit_evict_lock); + + /* This allocation can't already be on a list. */ + WARN_ON(!list_empty(®->gpu_alloc->evict_node)); + list_add(®->gpu_alloc->evict_node, &kctx->evict_list); + list_move(®->jit_node, &kctx->jit_pool_head); + mutex_unlock(&kctx->jit_evict_lock); } @@ -2313,11 +3015,14 @@ bool kbase_jit_evict(struct kbase_context *kctx) reg = list_entry(kctx->jit_pool_head.prev, struct kbase_va_region, jit_node); list_del(®->jit_node); + list_del_init(®->gpu_alloc->evict_node); } mutex_unlock(&kctx->jit_evict_lock); - if (reg) + if (reg) { + reg->flags &= ~KBASE_REG_JIT; kbase_mem_free_region(kctx, reg); + } return (reg != NULL); } @@ -2328,12 +3033,6 @@ void kbase_jit_term(struct kbase_context *kctx) /* Free all allocations for this context */ - /* - * Flush the freeing of allocations whose backing has been freed - * (i.e. everything in jit_destroy_head). - */ - cancel_work_sync(&kctx->jit_work); - kbase_gpu_vm_lock(kctx); mutex_lock(&kctx->jit_evict_lock); /* Free all allocations from the pool */ @@ -2341,7 +3040,9 @@ void kbase_jit_term(struct kbase_context *kctx) walker = list_first_entry(&kctx->jit_pool_head, struct kbase_va_region, jit_node); list_del(&walker->jit_node); + list_del_init(&walker->gpu_alloc->evict_node); mutex_unlock(&kctx->jit_evict_lock); + walker->flags &= ~KBASE_REG_JIT; kbase_mem_free_region(kctx, walker); mutex_lock(&kctx->jit_evict_lock); } @@ -2351,12 +3052,20 @@ void kbase_jit_term(struct kbase_context *kctx) walker = list_first_entry(&kctx->jit_active_head, struct kbase_va_region, jit_node); list_del(&walker->jit_node); + list_del_init(&walker->gpu_alloc->evict_node); mutex_unlock(&kctx->jit_evict_lock); + walker->flags &= ~KBASE_REG_JIT; kbase_mem_free_region(kctx, walker); mutex_lock(&kctx->jit_evict_lock); } mutex_unlock(&kctx->jit_evict_lock); kbase_gpu_vm_unlock(kctx); + + /* + * Flush the freeing of allocations whose backing has been freed + * (i.e. everything in jit_destroy_head). + */ + cancel_work_sync(&kctx->jit_work); } static int kbase_jd_user_buf_map(struct kbase_context *kctx, @@ -2373,6 +3082,7 @@ static int kbase_jd_user_buf_map(struct kbase_context *kctx, struct device *dev; unsigned long offset; unsigned long local_size; + unsigned long gwt_mask = ~0; alloc = reg->gpu_alloc; pa = kbase_get_gpu_phy_pages(reg); @@ -2447,10 +3157,14 @@ static int kbase_jd_user_buf_map(struct kbase_context *kctx, } alloc->nents = pinned_pages; +#ifdef CONFIG_MALI_JOB_DUMP + if (kctx->gwt_enabled) + gwt_mask = ~KBASE_REG_GPU_WR; +#endif err = kbase_mmu_insert_pages(kctx, reg->start_pfn, pa, kbase_reg_current_backed_size(reg), - reg->flags); + reg->flags & gwt_mask); if (err == 0) return 0; @@ -2511,6 +3225,7 @@ static int kbase_jd_umm_map(struct kbase_context *kctx, int err; size_t count = 0; struct kbase_mem_phy_alloc *alloc; + unsigned long gwt_mask = ~0; alloc = reg->gpu_alloc; @@ -2560,10 +3275,16 @@ static int kbase_jd_umm_map(struct kbase_context *kctx, /* Update nents as we now have pages to map */ alloc->nents = reg->nr_pages; +#ifdef CONFIG_MALI_JOB_DUMP + if (kctx->gwt_enabled) + gwt_mask = ~KBASE_REG_GPU_WR; +#endif + err = kbase_mmu_insert_pages(kctx, reg->start_pfn, kbase_get_gpu_phy_pages(reg), count, - reg->flags | KBASE_REG_GPU_WR | KBASE_REG_GPU_RD); + (reg->flags | KBASE_REG_GPU_WR | KBASE_REG_GPU_RD) & + gwt_mask); if (err) goto err_unmap_attachment; @@ -2604,35 +3325,9 @@ static void kbase_jd_umm_unmap(struct kbase_context *kctx, } #endif /* CONFIG_DMA_SHARED_BUFFER */ -#if (defined(CONFIG_KDS) && defined(CONFIG_UMP)) \ - || defined(CONFIG_DMA_SHARED_BUFFER_USES_KDS) -static void add_kds_resource(struct kds_resource *kds_res, - struct kds_resource **kds_resources, u32 *kds_res_count, - unsigned long *kds_access_bitmap, bool exclusive) -{ - u32 i; - - for (i = 0; i < *kds_res_count; i++) { - /* Duplicate resource, ignore */ - if (kds_resources[i] == kds_res) - return; - } - - kds_resources[*kds_res_count] = kds_res; - if (exclusive) - set_bit(*kds_res_count, kds_access_bitmap); - (*kds_res_count)++; -} -#endif - struct kbase_mem_phy_alloc *kbase_map_external_resource( struct kbase_context *kctx, struct kbase_va_region *reg, - struct mm_struct *locked_mm -#ifdef CONFIG_KDS - , u32 *kds_res_count, struct kds_resource **kds_resources, - unsigned long *kds_access_bitmap, bool exclusive -#endif - ) + struct mm_struct *locked_mm) { int err; @@ -2652,35 +3347,8 @@ struct kbase_mem_phy_alloc *kbase_map_external_resource( } } break; - case KBASE_MEM_TYPE_IMPORTED_UMP: { -#if defined(CONFIG_KDS) && defined(CONFIG_UMP) - if (kds_res_count) { - struct kds_resource *kds_res; - - kds_res = ump_dd_kds_resource_get( - reg->gpu_alloc->imported.ump_handle); - if (kds_res) - add_kds_resource(kds_res, kds_resources, - kds_res_count, - kds_access_bitmap, exclusive); - } -#endif /*defined(CONFIG_KDS) && defined(CONFIG_UMP) */ - break; - } #ifdef CONFIG_DMA_SHARED_BUFFER case KBASE_MEM_TYPE_IMPORTED_UMM: { -#ifdef CONFIG_DMA_SHARED_BUFFER_USES_KDS - if (kds_res_count) { - struct kds_resource *kds_res; - - kds_res = get_dma_buf_kds_resource( - reg->gpu_alloc->imported.umm.dma_buf); - if (kds_res) - add_kds_resource(kds_res, kds_resources, - kds_res_count, - kds_access_bitmap, exclusive); - } -#endif reg->gpu_alloc->imported.umm.current_mapping_usage_count++; if (1 == reg->gpu_alloc->imported.umm.current_mapping_usage_count) { err = kbase_jd_umm_map(kctx, reg); @@ -2788,12 +3456,7 @@ struct kbase_ctx_ext_res_meta *kbase_sticky_resource_acquire( * Fill in the metadata object and acquire a reference * for the physical resource. */ - meta->alloc = kbase_map_external_resource(kctx, reg, NULL -#ifdef CONFIG_KDS - , NULL, NULL, - NULL, false -#endif - ); + meta->alloc = kbase_map_external_resource(kctx, reg, NULL); if (!meta->alloc) goto fail_map; diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem.h index 9d98947390f68b..36ed41c543e41f 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem.h @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_mem.h * Base kernel memory APIs @@ -30,12 +35,6 @@ #endif #include <linux/kref.h> -#ifdef CONFIG_KDS -#include <linux/kds.h> -#endif /* CONFIG_KDS */ -#ifdef CONFIG_UMP -#include <linux/ump.h> -#endif /* CONFIG_UMP */ #include "mali_base_kernel.h" #include <mali_kbase_hw.h> #include "mali_kbase_pm.h" @@ -75,7 +74,6 @@ struct kbase_cpu_mapping { enum kbase_memory_type { KBASE_MEM_TYPE_NATIVE, - KBASE_MEM_TYPE_IMPORTED_UMP, KBASE_MEM_TYPE_IMPORTED_UMM, KBASE_MEM_TYPE_IMPORTED_USER_BUF, KBASE_MEM_TYPE_ALIAS, @@ -129,13 +127,8 @@ struct kbase_mem_phy_alloc { unsigned long properties; - struct list_head zone_cache; - /* member in union valid based on @a type */ union { -#ifdef CONFIG_UMP - ump_dd_handle ump_handle; -#endif /* CONFIG_UMP */ #if defined(CONFIG_DMA_SHARED_BUFFER) struct { struct dma_buf *dma_buf; @@ -204,8 +197,7 @@ static inline void kbase_mem_phy_alloc_gpu_unmapped(struct kbase_mem_phy_alloc * */ static inline bool kbase_mem_is_imported(enum kbase_memory_type type) { - return (type == KBASE_MEM_TYPE_IMPORTED_UMP) || - (type == KBASE_MEM_TYPE_IMPORTED_UMM) || + return (type == KBASE_MEM_TYPE_IMPORTED_UMM) || (type == KBASE_MEM_TYPE_IMPORTED_USER_BUF); } @@ -238,6 +230,9 @@ struct kbase_va_region { u64 start_pfn; /* The PFN in GPU space */ size_t nr_pages; + /* Initial commit, for aligning the start address and correctly growing + * KBASE_REG_TILER_ALIGN_TOP regions */ + size_t initial_commit; /* Free region */ #define KBASE_REG_FREE (1ul << 0) @@ -289,6 +284,13 @@ struct kbase_va_region { * Do not remove, use the next unreserved bit for new flags */ #define KBASE_REG_RESERVED_BIT_22 (1ul << 22) +/* The top of the initial commit is aligned to extent pages. + * Extent must be a power of 2 */ +#define KBASE_REG_TILER_ALIGN_TOP (1ul << 23) + +/* Memory is handled by JIT - user space should not be able to free it */ +#define KBASE_REG_JIT (1ul << 24) + #define KBASE_REG_ZONE_SAME_VA KBASE_REG_ZONE(0) /* only used with 32-bit clients */ @@ -309,7 +311,9 @@ struct kbase_va_region { #define KBASE_REG_ZONE_EXEC_SIZE ((16ULL * 1024 * 1024) >> PAGE_SHIFT) #define KBASE_REG_ZONE_CUSTOM_VA KBASE_REG_ZONE(2) -#define KBASE_REG_ZONE_CUSTOM_VA_BASE (KBASE_REG_ZONE_EXEC_BASE + KBASE_REG_ZONE_EXEC_SIZE) /* Starting after KBASE_REG_ZONE_EXEC */ +/* Starting after KBASE_REG_ZONE_EXEC */ +#define KBASE_REG_ZONE_CUSTOM_VA_BASE \ + (KBASE_REG_ZONE_EXEC_BASE + KBASE_REG_ZONE_EXEC_SIZE) #define KBASE_REG_ZONE_CUSTOM_VA_SIZE (((1ULL << 44) >> PAGE_SHIFT) - KBASE_REG_ZONE_CUSTOM_VA_BASE) /* end 32-bit clients only */ @@ -320,11 +324,12 @@ struct kbase_va_region { struct kbase_mem_phy_alloc *cpu_alloc; /* the one alloc object we mmap to the CPU when mapping this region */ struct kbase_mem_phy_alloc *gpu_alloc; /* the one alloc object we mmap to the GPU when mapping this region */ - /* non-NULL if this memory object is a kds_resource */ - struct kds_resource *kds_res; - /* List head used to store the region in the JIT allocation pool */ struct list_head jit_node; + /* The last JIT usage ID for this region */ + u16 jit_usage_id; + /* The JIT bin this allocation came from */ + u8 jit_bin_id; }; /* Common functions */ @@ -406,7 +411,6 @@ static inline struct kbase_mem_phy_alloc *kbase_alloc_create(size_t nr_pages, en alloc->pages = (void *)(alloc + 1); INIT_LIST_HEAD(&alloc->mappings); alloc->type = type; - INIT_LIST_HEAD(&alloc->zone_cache); if (type == KBASE_MEM_TYPE_IMPORTED_USER_BUF) alloc->imported.user_buf.dma_addrs = @@ -429,24 +433,32 @@ static inline int kbase_reg_prepare_native(struct kbase_va_region *reg, return PTR_ERR(reg->cpu_alloc); else if (!reg->cpu_alloc) return -ENOMEM; + reg->cpu_alloc->imported.kctx = kctx; - INIT_LIST_HEAD(®->cpu_alloc->evict_node); if (kbase_ctx_flag(kctx, KCTX_INFINITE_CACHE) && (reg->flags & KBASE_REG_CPU_CACHED)) { reg->gpu_alloc = kbase_alloc_create(reg->nr_pages, KBASE_MEM_TYPE_NATIVE); + if (IS_ERR_OR_NULL(reg->gpu_alloc)) { + kbase_mem_phy_alloc_put(reg->cpu_alloc); + return -ENOMEM; + } reg->gpu_alloc->imported.kctx = kctx; - INIT_LIST_HEAD(®->gpu_alloc->evict_node); } else { reg->gpu_alloc = kbase_mem_phy_alloc_get(reg->cpu_alloc); } - INIT_LIST_HEAD(®->jit_node); + mutex_lock(&kctx->jit_evict_lock); + INIT_LIST_HEAD(®->cpu_alloc->evict_node); + INIT_LIST_HEAD(®->gpu_alloc->evict_node); + mutex_unlock(&kctx->jit_evict_lock); + reg->flags &= ~KBASE_REG_FREE; + return 0; } -static inline int kbase_atomic_add_pages(int num_pages, atomic_t *used_pages) +static inline u32 kbase_atomic_add_pages(u32 num_pages, atomic_t *used_pages) { int new_val = atomic_add_return(num_pages, used_pages); #if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT) @@ -455,7 +467,7 @@ static inline int kbase_atomic_add_pages(int num_pages, atomic_t *used_pages) return new_val; } -static inline int kbase_atomic_sub_pages(int num_pages, atomic_t *used_pages) +static inline u32 kbase_atomic_sub_pages(u32 num_pages, atomic_t *used_pages) { int new_val = atomic_sub_return(num_pages, used_pages); #if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT) @@ -534,9 +546,25 @@ void kbase_mem_pool_term(struct kbase_mem_pool *pool); * 3. Return NULL if no memory in the pool * * Return: Pointer to allocated page, or NULL if allocation failed. + * + * Note : This function should not be used if the pool lock is held. Use + * kbase_mem_pool_alloc_locked() instead. */ struct page *kbase_mem_pool_alloc(struct kbase_mem_pool *pool); +/** + * kbase_mem_pool_alloc_locked - Allocate a page from memory pool + * @pool: Memory pool to allocate from + * + * If there are free pages in the pool, this function allocates a page from + * @pool. This function does not use @next_pool. + * + * Return: Pointer to allocated page, or NULL if allocation failed. + * + * Note : Caller must hold the pool lock. + */ +struct page *kbase_mem_pool_alloc_locked(struct kbase_mem_pool *pool); + /** * kbase_mem_pool_free - Free a page to memory pool * @pool: Memory pool where page should be freed @@ -548,10 +576,27 @@ struct page *kbase_mem_pool_alloc(struct kbase_mem_pool *pool); * 2. Otherwise, if @next_pool is not NULL and not full, add @page to * @next_pool. * 3. Finally, free @page to the kernel. + * + * Note : This function should not be used if the pool lock is held. Use + * kbase_mem_pool_free_locked() instead. */ void kbase_mem_pool_free(struct kbase_mem_pool *pool, struct page *page, bool dirty); +/** + * kbase_mem_pool_free_locked - Free a page to memory pool + * @pool: Memory pool where page should be freed + * @p: Page to free to the pool + * @dirty: Whether some of the page may be dirty in the cache. + * + * If @pool is not full, this function adds @page to @pool. Otherwise, @page is + * freed to the kernel. This function does not use @next_pool. + * + * Note : Caller must hold the pool lock. + */ +void kbase_mem_pool_free_locked(struct kbase_mem_pool *pool, struct page *p, + bool dirty); + /** * kbase_mem_pool_alloc_pages - Allocate pages from memory pool * @pool: Memory pool to allocate from @@ -566,10 +611,57 @@ void kbase_mem_pool_free(struct kbase_mem_pool *pool, struct page *page, * On success number of pages allocated (could be less than nr_pages if * partial_allowed). * On error an error code. + * + * Note : This function should not be used if the pool lock is held. Use + * kbase_mem_pool_alloc_pages_locked() instead. + * + * The caller must not hold vm_lock, as this could cause a deadlock if + * the kernel OoM killer runs. If the caller must allocate pages while holding + * this lock, it should use kbase_mem_pool_alloc_pages_locked() instead. */ int kbase_mem_pool_alloc_pages(struct kbase_mem_pool *pool, size_t nr_pages, struct tagged_addr *pages, bool partial_allowed); +/** + * kbase_mem_pool_alloc_pages_locked - Allocate pages from memory pool + * @pool: Memory pool to allocate from + * @nr_4k_pages: Number of pages to allocate + * @pages: Pointer to array where the physical address of the allocated + * pages will be stored. + * + * Like kbase_mem_pool_alloc() but optimized for allocating many pages. This + * version does not allocate new pages from the kernel, and therefore will never + * trigger the OoM killer. Therefore, it can be run while the vm_lock is held. + * + * As new pages can not be allocated, the caller must ensure there are + * sufficient pages in the pool. Usage of this function should look like : + * + * kbase_gpu_vm_lock(kctx); + * kbase_mem_pool_lock(pool) + * while (kbase_mem_pool_size(pool) < pages_required) { + * kbase_mem_pool_unlock(pool) + * kbase_gpu_vm_unlock(kctx); + * kbase_mem_pool_grow(pool) + * kbase_gpu_vm_lock(kctx); + * kbase_mem_pool_lock(pool) + * } + * kbase_mem_pool_alloc_pages_locked(pool) + * kbase_mem_pool_unlock(pool) + * Perform other processing that requires vm_lock... + * kbase_gpu_vm_unlock(kctx); + * + * This ensures that the pool can be grown to the required size and that the + * allocation can complete without another thread using the newly grown pages. + * + * Return: + * On success number of pages allocated. + * On error an error code. + * + * Note : Caller must hold the pool lock. + */ +int kbase_mem_pool_alloc_pages_locked(struct kbase_mem_pool *pool, + size_t nr_4k_pages, struct tagged_addr *pages); + /** * kbase_mem_pool_free_pages - Free pages to memory pool * @pool: Memory pool where pages should be freed @@ -585,6 +677,22 @@ int kbase_mem_pool_alloc_pages(struct kbase_mem_pool *pool, size_t nr_pages, void kbase_mem_pool_free_pages(struct kbase_mem_pool *pool, size_t nr_pages, struct tagged_addr *pages, bool dirty, bool reclaimed); +/** + * kbase_mem_pool_free_pages_locked - Free pages to memory pool + * @pool: Memory pool where pages should be freed + * @nr_pages: Number of pages to free + * @pages: Pointer to array holding the physical addresses of the pages to + * free. + * @dirty: Whether any pages may be dirty in the cache. + * @reclaimed: Whether the pages where reclaimable and thus should bypass + * the pool and go straight to the kernel. + * + * Like kbase_mem_pool_free() but optimized for freeing many pages. + */ +void kbase_mem_pool_free_pages_locked(struct kbase_mem_pool *pool, + size_t nr_pages, struct tagged_addr *pages, bool dirty, + bool reclaimed); + /** * kbase_mem_pool_size - Get number of free pages in memory pool * @pool: Memory pool to inspect @@ -595,7 +703,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); } /** @@ -643,6 +751,15 @@ int kbase_mem_pool_grow(struct kbase_mem_pool *pool, size_t nr_to_grow); */ void kbase_mem_pool_trim(struct kbase_mem_pool *pool, size_t new_size); +/** + * kbase_mem_pool_mark_dying - Mark that this pool is dying + * @pool: Memory pool + * + * This will cause any ongoing allocation operations (eg growing on page fault) + * to be terminated. + */ +void kbase_mem_pool_mark_dying(struct kbase_mem_pool *pool); + /** * kbase_mem_alloc_page - Allocate a new page for a device * @pool: Memory pool to allocate a page from @@ -655,7 +772,8 @@ void kbase_mem_pool_trim(struct kbase_mem_pool *pool, size_t new_size); struct page *kbase_mem_alloc_page(struct kbase_mem_pool *pool); int kbase_region_tracker_init(struct kbase_context *kctx); -int kbase_region_tracker_init_jit(struct kbase_context *kctx, u64 jit_va_pages); +int kbase_region_tracker_init_jit(struct kbase_context *kctx, u64 jit_va_pages, + u8 max_allocations, u8 trim_level); void kbase_region_tracker_term(struct kbase_context *kctx); struct kbase_va_region *kbase_region_tracker_find_region_enclosing_address(struct kbase_context *kctx, u64 gpu_addr); @@ -674,6 +792,25 @@ int kbase_add_va_region(struct kbase_context *kctx, struct kbase_va_region *reg, bool kbase_check_alloc_flags(unsigned long flags); bool kbase_check_import_flags(unsigned long flags); +/** + * kbase_check_alloc_sizes - check user space sizes parameters for an + * allocation + * + * @kctx: kbase context + * @flags: The flags passed from user space + * @va_pages: The size of the requested region, in pages. + * @commit_pages: Number of pages to commit initially. + * @extent: Number of pages to grow by on GPU page fault and/or alignment + * (depending on flags) + * + * Makes checks on the size parameters passed in from user space for a memory + * allocation call, with respect to the flags requested. + * + * Return: 0 if sizes are valid for these flags, negative error code otherwise + */ +int kbase_check_alloc_sizes(struct kbase_context *kctx, unsigned long flags, + u64 va_pages, u64 commit_pages, u64 extent); + /** * kbase_update_region_flags - Convert user space flags to kernel region flags * @@ -710,6 +847,9 @@ int kbase_mmu_insert_single_page(struct kbase_context *kctx, u64 vpfn, unsigned long flags); int kbase_mmu_teardown_pages(struct kbase_context *kctx, u64 vpfn, size_t nr); +int kbase_mmu_update_pages_no_flush(struct kbase_context *kctx, u64 vpfn, + struct tagged_addr *phys, size_t nr, + unsigned long flags); int kbase_mmu_update_pages(struct kbase_context *kctx, u64 vpfn, struct tagged_addr *phys, size_t nr, unsigned long flags); @@ -864,21 +1004,98 @@ int kbasep_find_enclosing_cpu_mapping_offset( struct kbase_context *kctx, unsigned long uaddr, size_t size, u64 *offset); +/** + * kbasep_find_enclosing_gpu_mapping_start_and_offset() - Find the address of + * the start of GPU virtual memory region which encloses @gpu_addr for the + * @size length in bytes + * + * Searches for the memory region in GPU virtual memory space which contains + * the region defined by the @gpu_addr and @size, where @gpu_addr is the + * beginning and @size the length in bytes of the provided region. If found, + * the location of the start address of the GPU virtual memory region is + * passed in @start pointer and the location of the offset of the region into + * the GPU virtual memory region is passed in @offset pointer. + * + * @kctx: The kernel base context within which the memory is searched. + * @gpu_addr: GPU virtual address for which the region is sought; defines + * the beginning of the provided region. + * @size: The length (in bytes) of the provided region for which the + * GPU virtual memory region is sought. + * @start: Pointer to the location where the address of the start of + * the found GPU virtual memory region is. + * @offset: Pointer to the location where the offset of @gpu_addr into + * the found GPU virtual memory region is. + */ +int kbasep_find_enclosing_gpu_mapping_start_and_offset( + struct kbase_context *kctx, + u64 gpu_addr, size_t size, u64 *start, u64 *offset); + enum hrtimer_restart kbasep_as_poke_timer_callback(struct hrtimer *timer); void kbase_as_poking_timer_retain_atom(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbase_jd_atom *katom); void kbase_as_poking_timer_release_atom(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbase_jd_atom *katom); /** -* @brief Allocates physical pages. -* -* Allocates \a nr_pages_requested and updates the alloc object. -* -* @param[in] alloc allocation object to add pages to -* @param[in] nr_pages_requested number of physical pages to allocate -* -* @return 0 if all pages have been successfully allocated. Error code otherwise -*/ -int kbase_alloc_phy_pages_helper(struct kbase_mem_phy_alloc *alloc, size_t nr_pages_requested); + * kbase_alloc_phy_pages_helper - Allocates physical pages. + * @alloc: allocation object to add pages to + * @nr_pages_requested: number of physical pages to allocate + * + * Allocates \a nr_pages_requested and updates the alloc object. + * + * Return: 0 if all pages have been successfully allocated. Error code otherwise + * + * Note : The caller must not hold vm_lock, as this could cause a deadlock if + * the kernel OoM killer runs. If the caller must allocate pages while holding + * this lock, it should use kbase_mem_pool_alloc_pages_locked() instead. + */ +int kbase_alloc_phy_pages_helper(struct kbase_mem_phy_alloc *alloc, + size_t nr_pages_requested); + +/** + * kbase_alloc_phy_pages_helper_locked - Allocates physical pages. + * @alloc: allocation object to add pages to + * @pool: Memory pool to allocate from + * @nr_pages_requested: number of physical pages to allocate + * @prealloc_sa: Information about the partial allocation if the amount + * of memory requested is not a multiple of 2MB. + * + * Allocates \a nr_pages_requested and updates the alloc object. This function + * does not allocate new pages from the kernel, and therefore will never trigger + * the OoM killer. Therefore, it can be run while the vm_lock is held. + * + * As new pages can not be allocated, the caller must ensure there are + * sufficient pages in the pool. Usage of this function should look like : + * + * kbase_gpu_vm_lock(kctx); + * kbase_mem_pool_lock(pool) + * while (kbase_mem_pool_size(pool) < pages_required) { + * kbase_mem_pool_unlock(pool) + * kbase_gpu_vm_unlock(kctx); + * kbase_mem_pool_grow(pool) + * kbase_gpu_vm_lock(kctx); + * kbase_mem_pool_lock(pool) + * } + * kbase_alloc_phy_pages_helper_locked(pool) + * kbase_mem_pool_unlock(pool) + * Perform other processing that requires vm_lock... + * kbase_gpu_vm_unlock(kctx); + * + * This ensures that the pool can be grown to the required size and that the + * allocation can complete without another thread using the newly grown pages. + * + * If CONFIG_MALI_2MB_ALLOC is defined and the allocation is >= 2MB, then + * @pool must be alloc->imported.kctx->lp_mem_pool. Otherwise it must be + * alloc->imported.kctx->mem_pool. + * + * @prealloc_sa shall be set to NULL if it has been consumed by this function. + * + * Return: Pointer to array of allocated pages. NULL on failure. + * + * Note : Caller must hold pool->pool_lock + */ +struct tagged_addr *kbase_alloc_phy_pages_helper_locked( + struct kbase_mem_phy_alloc *alloc, struct kbase_mem_pool *pool, + size_t nr_pages_requested, + struct kbase_sub_alloc **prealloc_sa); /** * @brief Free physical pages. @@ -890,6 +1107,26 @@ int kbase_alloc_phy_pages_helper(struct kbase_mem_phy_alloc *alloc, size_t nr_pa */ int kbase_free_phy_pages_helper(struct kbase_mem_phy_alloc *alloc, size_t nr_pages_to_free); +/** + * kbase_free_phy_pages_helper_locked - Free pages allocated with + * kbase_alloc_phy_pages_helper_locked() + * @alloc: Allocation object to free pages from + * @pool: Memory pool to return freed pages to + * @pages: Pages allocated by kbase_alloc_phy_pages_helper_locked() + * @nr_pages_to_free: Number of physical pages to free + * + * This function atomically frees pages allocated with + * kbase_alloc_phy_pages_helper_locked(). @pages is the pointer to the page + * array that is returned by that function. @pool must be the pool that the + * pages were originally allocated from. + * + * If the mem_pool has been unlocked since the allocation then + * kbase_free_phy_pages_helper() should be used instead. + */ +void kbase_free_phy_pages_helper_locked(struct kbase_mem_phy_alloc *alloc, + struct kbase_mem_pool *pool, struct tagged_addr *pages, + size_t nr_pages_to_free); + static inline void kbase_set_dma_addr(struct page *p, dma_addr_t dma_addr) { SetPagePrivate(p); @@ -1040,22 +1277,13 @@ void kbase_jit_term(struct kbase_context *kctx); * @kctx: kbase context. * @reg: The region to map. * @locked_mm: The mm_struct which has been locked for this operation. - * @kds_res_count: The number of KDS resources. - * @kds_resources: Array of KDS resources. - * @kds_access_bitmap: Access bitmap for KDS. - * @exclusive: If the KDS resource requires exclusive access. * * Return: The physical allocation which backs the region on success or NULL * on failure. */ struct kbase_mem_phy_alloc *kbase_map_external_resource( struct kbase_context *kctx, struct kbase_va_region *reg, - struct mm_struct *locked_mm -#ifdef CONFIG_KDS - , u32 *kds_res_count, struct kds_resource **kds_resources, - unsigned long *kds_access_bitmap, bool exclusive -#endif - ); + struct mm_struct *locked_mm); /** * kbase_unmap_external_resource - Unmap an external resource from the GPU. @@ -1107,36 +1335,27 @@ bool kbase_sticky_resource_release(struct kbase_context *kctx, void kbase_sticky_resource_term(struct kbase_context *kctx); /** - * kbase_zone_cache_update - Update the memory zone cache after new pages have - * been added. - * @alloc: The physical memory allocation to build the cache for. - * @start_offset: Offset to where the new pages start. - * - * Updates an existing memory zone cache, updating the counters for the - * various zones. - * If the memory allocation doesn't already have a zone cache assume that - * one isn't created and thus don't do anything. - * - * Return: Zero cache was updated, negative error code on error. + * kbase_mem_pool_lock - Lock a memory pool + * @pool: Memory pool to lock */ -int kbase_zone_cache_update(struct kbase_mem_phy_alloc *alloc, - size_t start_offset); +static inline void kbase_mem_pool_lock(struct kbase_mem_pool *pool) +{ + spin_lock(&pool->pool_lock); +} /** - * kbase_zone_cache_build - Build the memory zone cache. - * @alloc: The physical memory allocation to build the cache for. - * - * Create a new zone cache for the provided physical memory allocation if - * one doesn't already exist, if one does exist then just return. - * - * Return: Zero if the zone cache was created, negative error code on error. + * kbase_mem_pool_lock - Release a memory pool + * @pool: Memory pool to lock */ -int kbase_zone_cache_build(struct kbase_mem_phy_alloc *alloc); +static inline void kbase_mem_pool_unlock(struct kbase_mem_pool *pool) +{ + spin_unlock(&pool->pool_lock); +} /** - * kbase_zone_cache_clear - Clear the memory zone cache. - * @alloc: The physical memory allocation to clear the cache on. + * kbase_mem_evictable_mark_reclaim - Mark the pages as reclaimable. + * @alloc: The physical allocation */ -void kbase_zone_cache_clear(struct kbase_mem_phy_alloc *alloc); +void kbase_mem_evictable_mark_reclaim(struct kbase_mem_phy_alloc *alloc); #endif /* _KBASE_MEM_H_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_linux.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_linux.c index c88ac64e1681d5..701def88352b0d 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_linux.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_linux.c @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_mem_linux.c * Base kernel memory APIs, Linux implementation. @@ -44,48 +49,15 @@ #include <mali_kbase_mem_linux.h> #include <mali_kbase_config_defaults.h> #include <mali_kbase_tlstream.h> +#include <mali_kbase_ioctl.h> static int kbase_tracking_page_setup(struct kbase_context *kctx, struct vm_area_struct *vma); -/** - * kbase_mem_shrink_cpu_mapping - Shrink the CPU mapping(s) of an allocation - * @kctx: Context the region belongs to - * @reg: The GPU region - * @new_pages: The number of pages after the shrink - * @old_pages: The number of pages before the shrink - * - * Shrink (or completely remove) all CPU mappings which reference the shrunk - * part of the allocation. - * - * Note: Caller must be holding the processes mmap_sem lock. - */ -static void kbase_mem_shrink_cpu_mapping(struct kbase_context *kctx, - struct kbase_va_region *reg, - u64 new_pages, u64 old_pages); - -/** - * kbase_mem_shrink_gpu_mapping - Shrink the GPU mapping of an allocation - * @kctx: Context the region belongs to - * @reg: The GPU region or NULL if there isn't one - * @new_pages: The number of pages after the shrink - * @old_pages: The number of pages before the shrink - * - * Return: 0 on success, negative -errno on error - * - * Unmap the shrunk pages from the GPU mapping. Note that the size of the region - * itself is unmodified as we still need to reserve the VA, only the page tables - * will be modified by this function. - */ -static int kbase_mem_shrink_gpu_mapping(struct kbase_context *kctx, - struct kbase_va_region *reg, - u64 new_pages, u64 old_pages); - struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx, u64 va_pages, u64 commit_pages, u64 extent, u64 *flags, u64 *gpu_va) { int zone; - int gpu_pc_bits; struct kbase_va_region *reg; struct device *dev; @@ -96,17 +68,6 @@ struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx, dev = kctx->kbdev->dev; *gpu_va = 0; /* return 0 on failure */ - gpu_pc_bits = kctx->kbdev->gpu_props.props.core_props.log2_program_counter_size; - - if (0 == va_pages) { - dev_warn(dev, "kbase_mem_alloc called with 0 va_pages!"); - goto bad_size; - } - - if (va_pages > (U64_MAX / PAGE_SIZE)) - /* 64-bit address range is the max */ - goto bad_size; - if (!kbase_check_alloc_flags(*flags)) { dev_warn(dev, "kbase_mem_alloc called with bad flags (%llx)", @@ -125,10 +86,8 @@ struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx, *flags &= ~BASE_MEM_COHERENT_SYSTEM; } - /* Limit GPU executable allocs to GPU PC size */ - if ((*flags & BASE_MEM_PROT_GPU_EX) && - (va_pages > (1ULL << gpu_pc_bits >> PAGE_SHIFT))) - goto bad_ex_size; + if (kbase_check_alloc_sizes(kctx, *flags, va_pages, commit_pages, extent)) + goto bad_sizes; /* find out which VA zone to use */ if (*flags & BASE_MEM_SAME_VA) @@ -152,10 +111,13 @@ struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx, goto prepare_failed; } - if (*flags & BASE_MEM_GROW_ON_GPF) + if (*flags & (BASE_MEM_GROW_ON_GPF|BASE_MEM_TILER_ALIGN_TOP)) { + /* kbase_check_alloc_sizes() already checks extent is valid for + * assigning to reg->extent */ reg->extent = extent; - else + } else { reg->extent = 0; + } if (kbase_alloc_phy_pages(reg, va_pages, commit_pages) != 0) { dev_warn(dev, "Failed to allocate %lld pages (va_pages=%lld)", @@ -163,6 +125,7 @@ struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx, (unsigned long long)va_pages); goto no_mem; } + reg->initial_commit = commit_pages; kbase_gpu_vm_lock(kctx); @@ -241,14 +204,14 @@ struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx, prepare_failed: kfree(reg); no_region: -bad_ex_size: +bad_sizes: bad_flags: -bad_size: return NULL; } KBASE_EXPORT_TEST_API(kbase_mem_alloc); -int kbase_mem_query(struct kbase_context *kctx, u64 gpu_addr, int query, u64 * const out) +int kbase_mem_query(struct kbase_context *kctx, + u64 gpu_addr, u64 query, u64 * const out) { struct kbase_va_region *reg; int ret = -EINVAL; @@ -303,6 +266,23 @@ int kbase_mem_query(struct kbase_context *kctx, u64 gpu_addr, int query, u64 * c *out |= BASE_MEM_COHERENT_SYSTEM; if (KBASE_REG_SHARE_IN & reg->flags) *out |= BASE_MEM_COHERENT_LOCAL; + if (kctx->api_version >= KBASE_API_VERSION(11, 2)) { + /* Prior to 11.2, these were known about by user-side + * but we did not return them. Returning some of these + * caused certain clients that were not expecting them + * to fail, so we omit all of them as a special-case + * for compatibility reasons */ + if (KBASE_REG_PF_GROW & reg->flags) + *out |= BASE_MEM_GROW_ON_GPF; + if (KBASE_REG_SECURE & reg->flags) + *out |= BASE_MEM_SECURE; + } + if (KBASE_REG_TILER_ALIGN_TOP & reg->flags) + *out |= BASE_MEM_TILER_ALIGN_TOP; + + WARN(*out & ~BASE_MEM_FLAGS_QUERYABLE, + "BASE_MEM_FLAGS_QUERYABLE needs updating\n"); + *out &= BASE_MEM_FLAGS_QUERYABLE; break; } default: @@ -455,133 +435,14 @@ void kbase_mem_evictable_deinit(struct kbase_context *kctx) unregister_shrinker(&kctx->reclaim); } -struct kbase_mem_zone_cache_entry { - /* List head used to link the cache entry to the memory allocation. */ - struct list_head zone_node; - /* The zone the cacheline is for. */ - struct zone *zone; - /* The number of pages in the allocation which belong to this zone. */ - u64 count; -}; - -static bool kbase_zone_cache_builder(struct kbase_mem_phy_alloc *alloc, - size_t start_offset) -{ - struct kbase_mem_zone_cache_entry *cache = NULL; - size_t i; - int ret = 0; - - for (i = start_offset; i < alloc->nents; i++) { - struct page *p = phys_to_page(as_phys_addr_t(alloc->pages[i])); - struct zone *zone = page_zone(p); - bool create = true; - - if (cache && (cache->zone == zone)) { - /* - * Fast path check as most of the time adjacent - * pages come from the same zone. - */ - create = false; - } else { - /* - * Slow path check, walk all the cache entries to see - * if we already know about this zone. - */ - list_for_each_entry(cache, &alloc->zone_cache, zone_node) { - if (cache->zone == zone) { - create = false; - break; - } - } - } - - /* This zone wasn't found in the cache, create an entry for it */ - if (create) { - cache = kmalloc(sizeof(*cache), GFP_KERNEL); - if (!cache) { - ret = -ENOMEM; - goto bail; - } - cache->zone = zone; - cache->count = 0; - list_add(&cache->zone_node, &alloc->zone_cache); - } - - cache->count++; - } - return 0; - -bail: - return ret; -} - -int kbase_zone_cache_update(struct kbase_mem_phy_alloc *alloc, - size_t start_offset) -{ - /* - * Bail if the zone cache is empty, only update the cache if it - * existed in the first place. - */ - if (list_empty(&alloc->zone_cache)) - return 0; - - return kbase_zone_cache_builder(alloc, start_offset); -} - -int kbase_zone_cache_build(struct kbase_mem_phy_alloc *alloc) -{ - /* Bail if the zone cache already exists */ - if (!list_empty(&alloc->zone_cache)) - return 0; - - return kbase_zone_cache_builder(alloc, 0); -} - -void kbase_zone_cache_clear(struct kbase_mem_phy_alloc *alloc) -{ - struct kbase_mem_zone_cache_entry *walker; - - while(!list_empty(&alloc->zone_cache)){ - walker = list_first_entry(&alloc->zone_cache, - struct kbase_mem_zone_cache_entry, zone_node); - list_del(&walker->zone_node); - kfree(walker); - } -} - /** * kbase_mem_evictable_mark_reclaim - Mark the pages as reclaimable. * @alloc: The physical allocation */ -static void kbase_mem_evictable_mark_reclaim(struct kbase_mem_phy_alloc *alloc) +void kbase_mem_evictable_mark_reclaim(struct kbase_mem_phy_alloc *alloc) { struct kbase_context *kctx = alloc->imported.kctx; - struct kbase_mem_zone_cache_entry *zone_cache; int __maybe_unused new_page_count; - int err; - - /* Attempt to build a zone cache of tracking */ - err = kbase_zone_cache_build(alloc); - if (err == 0) { - /* Bulk update all the zones */ - list_for_each_entry(zone_cache, &alloc->zone_cache, zone_node) { - zone_page_state_add(zone_cache->count, - zone_cache->zone, NR_SLAB_RECLAIMABLE); - } - } else { - /* Fall-back to page by page updates */ - int i; - - for (i = 0; i < alloc->nents; i++) { - struct page *p; - struct zone *zone; - - p = phys_to_page(as_phys_addr_t(alloc->pages[i])); - zone = page_zone(p); - - zone_page_state_add(1, zone, NR_SLAB_RECLAIMABLE); - } - } kbase_process_page_usage_dec(kctx, alloc->nents); new_page_count = kbase_atomic_sub_pages(alloc->nents, @@ -601,9 +462,7 @@ static void kbase_mem_evictable_unmark_reclaim(struct kbase_mem_phy_alloc *alloc) { struct kbase_context *kctx = alloc->imported.kctx; - struct kbase_mem_zone_cache_entry *zone_cache; int __maybe_unused new_page_count; - int err; new_page_count = kbase_atomic_add_pages(alloc->nents, &kctx->used_pages); @@ -611,31 +470,9 @@ void kbase_mem_evictable_unmark_reclaim(struct kbase_mem_phy_alloc *alloc) /* Increase mm counters so that the allocation is accounted for * against the process and thus is visible to the OOM killer, - * then remove it from the reclaimable accounting. */ + */ kbase_process_page_usage_inc(kctx, alloc->nents); - /* Attempt to build a zone cache of tracking */ - err = kbase_zone_cache_build(alloc); - if (err == 0) { - /* Bulk update all the zones */ - list_for_each_entry(zone_cache, &alloc->zone_cache, zone_node) { - zone_page_state_add(-zone_cache->count, - zone_cache->zone, NR_SLAB_RECLAIMABLE); - } - } else { - /* Fall-back to page by page updates */ - int i; - - for (i = 0; i < alloc->nents; i++) { - struct page *p; - struct zone *zone; - - p = phys_to_page(as_phys_addr_t(alloc->pages[i])); - zone = page_zone(p); - zone_page_state_add(-1, zone, NR_SLAB_RECLAIMABLE); - } - } - KBASE_TLSTREAM_AUX_PAGESALLOC( kctx->id, (u64)new_page_count); @@ -647,17 +484,17 @@ int kbase_mem_evictable_make(struct kbase_mem_phy_alloc *gpu_alloc) lockdep_assert_held(&kctx->reg_lock); - /* This alloction can't already be on a list. */ - WARN_ON(!list_empty(&gpu_alloc->evict_node)); - kbase_mem_shrink_cpu_mapping(kctx, gpu_alloc->reg, 0, gpu_alloc->nents); + mutex_lock(&kctx->jit_evict_lock); + /* This allocation can't already be on a list. */ + WARN_ON(!list_empty(&gpu_alloc->evict_node)); + /* * Add the allocation to the eviction list, after this point the shrink * can reclaim it. */ - mutex_lock(&kctx->jit_evict_lock); list_add(&gpu_alloc->evict_node, &kctx->evict_list); mutex_unlock(&kctx->jit_evict_lock); kbase_mem_evictable_mark_reclaim(gpu_alloc); @@ -673,11 +510,13 @@ bool kbase_mem_evictable_unmake(struct kbase_mem_phy_alloc *gpu_alloc) lockdep_assert_held(&kctx->reg_lock); + mutex_lock(&kctx->jit_evict_lock); /* * First remove the allocation from the eviction list as it's no * longer eligible for eviction. */ list_del_init(&gpu_alloc->evict_node); + mutex_unlock(&kctx->jit_evict_lock); if (gpu_alloc->evicted == 0) { /* @@ -777,8 +616,7 @@ int kbase_mem_flags_change(struct kbase_context *kctx, u64 gpu_addr, unsigned in } /* limit to imported memory */ - if ((reg->gpu_alloc->type != KBASE_MEM_TYPE_IMPORTED_UMP) && - (reg->gpu_alloc->type != KBASE_MEM_TYPE_IMPORTED_UMM)) + if (reg->gpu_alloc->type != KBASE_MEM_TYPE_IMPORTED_UMM) goto out_unlock; /* no change? */ @@ -793,28 +631,17 @@ int kbase_mem_flags_change(struct kbase_context *kctx, u64 gpu_addr, unsigned in reg->flags |= real_flags; /* Currently supporting only imported memory */ - switch (reg->gpu_alloc->type) { -#ifdef CONFIG_UMP - case KBASE_MEM_TYPE_IMPORTED_UMP: - ret = kbase_mmu_update_pages(kctx, reg->start_pfn, - kbase_get_gpu_phy_pages(reg), - reg->gpu_alloc->nents, reg->flags); - break; -#endif #ifdef CONFIG_DMA_SHARED_BUFFER - case KBASE_MEM_TYPE_IMPORTED_UMM: + if (reg->gpu_alloc->type == KBASE_MEM_TYPE_IMPORTED_UMM) { /* Future use will use the new flags, existing mapping will NOT be updated * as memory should not be in use by the GPU when updating the flags. */ ret = 0; WARN_ON(reg->gpu_alloc->imported.umm.current_mapping_usage_count); - break; -#endif - default: - break; } +#endif /* CONFIG_DMA_SHARED_BUFFER */ - /* roll back on error, i.e. not UMP */ + /* roll back on error */ if (ret) reg->flags = prev_flags; @@ -827,128 +654,6 @@ int kbase_mem_flags_change(struct kbase_context *kctx, u64 gpu_addr, unsigned in #define KBASE_MEM_IMPORT_HAVE_PAGES (1UL << BASE_MEM_FLAGS_NR_BITS) -#ifdef CONFIG_UMP -static struct kbase_va_region *kbase_mem_from_ump(struct kbase_context *kctx, ump_secure_id id, u64 *va_pages, u64 *flags) -{ - struct kbase_va_region *reg; - ump_dd_handle umph; - u64 block_count; - const ump_dd_physical_block_64 *block_array; - u64 i, j; - int page = 0; - ump_alloc_flags ump_flags; - ump_alloc_flags cpu_flags; - ump_alloc_flags gpu_flags; - - if (*flags & BASE_MEM_SECURE) - goto bad_flags; - - umph = ump_dd_from_secure_id(id); - if (UMP_DD_INVALID_MEMORY_HANDLE == umph) - goto bad_id; - - ump_flags = ump_dd_allocation_flags_get(umph); - cpu_flags = (ump_flags >> UMP_DEVICE_CPU_SHIFT) & UMP_DEVICE_MASK; - gpu_flags = (ump_flags >> DEFAULT_UMP_GPU_DEVICE_SHIFT) & - UMP_DEVICE_MASK; - - *va_pages = ump_dd_size_get_64(umph); - *va_pages >>= PAGE_SHIFT; - - if (!*va_pages) - goto bad_size; - - if (*va_pages > (U64_MAX / PAGE_SIZE)) - /* 64-bit address range is the max */ - goto bad_size; - - if (*flags & BASE_MEM_SAME_VA) - reg = kbase_alloc_free_region(kctx, 0, *va_pages, KBASE_REG_ZONE_SAME_VA); - else - reg = kbase_alloc_free_region(kctx, 0, *va_pages, KBASE_REG_ZONE_CUSTOM_VA); - - if (!reg) - goto no_region; - - /* we've got pages to map now, and support SAME_VA */ - *flags |= KBASE_MEM_IMPORT_HAVE_PAGES; - - reg->gpu_alloc = kbase_alloc_create(*va_pages, KBASE_MEM_TYPE_IMPORTED_UMP); - if (IS_ERR_OR_NULL(reg->gpu_alloc)) - goto no_alloc_obj; - - reg->cpu_alloc = kbase_mem_phy_alloc_get(reg->gpu_alloc); - - reg->gpu_alloc->imported.ump_handle = umph; - - reg->flags &= ~KBASE_REG_FREE; - reg->flags |= KBASE_REG_GPU_NX; /* UMP is always No eXecute */ - reg->flags &= ~KBASE_REG_GROWABLE; /* UMP cannot be grown */ - - /* Override import flags based on UMP flags */ - *flags &= ~(BASE_MEM_CACHED_CPU); - *flags &= ~(BASE_MEM_PROT_CPU_RD | BASE_MEM_PROT_CPU_WR); - *flags &= ~(BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR); - - if ((cpu_flags & (UMP_HINT_DEVICE_RD | UMP_HINT_DEVICE_WR)) == - (UMP_HINT_DEVICE_RD | UMP_HINT_DEVICE_WR)) { - reg->flags |= KBASE_REG_CPU_CACHED; - *flags |= BASE_MEM_CACHED_CPU; - } - - if (cpu_flags & UMP_PROT_CPU_WR) { - reg->flags |= KBASE_REG_CPU_WR; - *flags |= BASE_MEM_PROT_CPU_WR; - } - - if (cpu_flags & UMP_PROT_CPU_RD) { - reg->flags |= KBASE_REG_CPU_RD; - *flags |= BASE_MEM_PROT_CPU_RD; - } - - if ((gpu_flags & (UMP_HINT_DEVICE_RD | UMP_HINT_DEVICE_WR)) == - (UMP_HINT_DEVICE_RD | UMP_HINT_DEVICE_WR)) - reg->flags |= KBASE_REG_GPU_CACHED; - - if (gpu_flags & UMP_PROT_DEVICE_WR) { - reg->flags |= KBASE_REG_GPU_WR; - *flags |= BASE_MEM_PROT_GPU_WR; - } - - if (gpu_flags & UMP_PROT_DEVICE_RD) { - reg->flags |= KBASE_REG_GPU_RD; - *flags |= BASE_MEM_PROT_GPU_RD; - } - - /* ump phys block query */ - ump_dd_phys_blocks_get_64(umph, &block_count, &block_array); - - for (i = 0; i < block_count; i++) { - for (j = 0; j < (block_array[i].size >> PAGE_SHIFT); j++) { - struct tagged_addr tagged; - - tagged = as_tagged(block_array[i].addr + - (j << PAGE_SHIFT)); - reg->gpu_alloc->pages[page] = tagged; - page++; - } - } - reg->gpu_alloc->nents = *va_pages; - reg->extent = 0; - - return reg; - -no_alloc_obj: - kfree(reg); -no_region: -bad_size: - ump_dd_release(umph); -bad_id: -bad_flags: - return NULL; -} -#endif /* CONFIG_UMP */ - #ifdef CONFIG_DMA_SHARED_BUFFER static struct kbase_va_region *kbase_mem_from_umm(struct kbase_context *kctx, int fd, u64 *va_pages, u64 *flags, u32 padding) @@ -1034,6 +739,7 @@ static struct kbase_va_region *kbase_mem_from_umm(struct kbase_context *kctx, invalid_flags: kbase_mem_phy_alloc_put(reg->gpu_alloc); + kbase_mem_phy_alloc_put(reg->cpu_alloc); no_alloc_obj: kfree(reg); no_region: @@ -1141,6 +847,11 @@ static struct kbase_va_region *kbase_mem_from_user_buffer( user_buf->address = address; user_buf->nr_pages = *va_pages; user_buf->mm = current->mm; +#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE + atomic_inc(¤t->mm->mm_count); +#else + mmgrab(current->mm); +#endif user_buf->pages = kmalloc_array(*va_pages, sizeof(struct page *), GFP_KERNEL); @@ -1182,8 +893,6 @@ static struct kbase_va_region *kbase_mem_from_user_buffer( if (faulted_pages != *va_pages) goto fault_mismatch; - atomic_inc(¤t->mm->mm_count); - reg->gpu_alloc->nents = 0; reg->extent = 0; @@ -1230,7 +939,6 @@ static struct kbase_va_region *kbase_mem_from_user_buffer( for (i = 0; i < faulted_pages; i++) put_page(pages[i]); } - kfree(user_buf->pages); no_page_array: invalid_flags: kbase_mem_phy_alloc_put(reg->cpu_alloc); @@ -1444,10 +1152,9 @@ int kbase_mem_import(struct kbase_context *kctx, enum base_mem_import_type type, KBASE_DEBUG_ASSERT(va_pages); KBASE_DEBUG_ASSERT(flags); -#ifdef CONFIG_64BIT - if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) + if ((!kbase_ctx_flag(kctx, KCTX_COMPAT)) && + kbase_ctx_flag(kctx, KCTX_FORCE_SAME_VA)) *flags |= BASE_MEM_SAME_VA; -#endif if (!kbase_check_import_flags(*flags)) { dev_warn(kctx->kbdev->dev, @@ -1475,17 +1182,6 @@ int kbase_mem_import(struct kbase_context *kctx, enum base_mem_import_type type, } switch (type) { -#ifdef CONFIG_UMP - case BASE_MEM_IMPORT_TYPE_UMP: { - ump_secure_id id; - - if (get_user(id, (ump_secure_id __user *)phandle)) - reg = NULL; - else - reg = kbase_mem_from_ump(kctx, id, va_pages, flags); - } - break; -#endif /* CONFIG_UMP */ #ifdef CONFIG_DMA_SHARED_BUFFER case BASE_MEM_IMPORT_TYPE_UMM: { int fd; @@ -1598,7 +1294,7 @@ int kbase_mem_grow_gpu_mapping(struct kbase_context *kctx, return ret; } -static void kbase_mem_shrink_cpu_mapping(struct kbase_context *kctx, +void kbase_mem_shrink_cpu_mapping(struct kbase_context *kctx, struct kbase_va_region *reg, u64 new_pages, u64 old_pages) { @@ -1613,7 +1309,7 @@ static void kbase_mem_shrink_cpu_mapping(struct kbase_context *kctx, (old_pages - new_pages)<<PAGE_SHIFT, 1); } -static int kbase_mem_shrink_gpu_mapping(struct kbase_context *kctx, +int kbase_mem_shrink_gpu_mapping(struct kbase_context *kctx, struct kbase_va_region *reg, u64 new_pages, u64 old_pages) { @@ -2186,8 +1882,10 @@ int kbase_mmap(struct file *file, struct vm_area_struct *vma) dev_dbg(dev, "kbase_mmap\n"); - /* strip away corresponding VM_MAY% flags to the VM_% flags requested */ - vma->vm_flags &= ~((vma->vm_flags & (VM_READ | VM_WRITE)) << 4); + if (!(vma->vm_flags & VM_READ)) + vma->vm_flags &= ~VM_MAYREAD; + if (!(vma->vm_flags & VM_WRITE)) + vma->vm_flags &= ~VM_MAYWRITE; if (0 == nr_pages) { err = -EINVAL; @@ -2263,9 +1961,9 @@ int kbase_mmap(struct file *file, struct vm_area_struct *vma) } if ((vma->vm_flags & VM_READ && - !(reg->flags & KBASE_REG_CPU_RD)) || - (vma->vm_flags & VM_WRITE && - !(reg->flags & KBASE_REG_CPU_WR))) { + !(reg->flags & KBASE_REG_CPU_RD)) || + (vma->vm_flags & VM_WRITE && + !(reg->flags & KBASE_REG_CPU_WR))) { /* VM flags inconsistent with region flags */ err = -EPERM; dev_err(dev, "%s:%d inconsistent VM flags\n", @@ -2276,6 +1974,12 @@ int kbase_mmap(struct file *file, struct vm_area_struct *vma) #ifdef CONFIG_DMA_SHARED_BUFFER if (KBASE_MEM_TYPE_IMPORTED_UMM == reg->cpu_alloc->type) { + if (0 != (vma->vm_pgoff - reg->start_pfn)) { + err = -EINVAL; + dev_warn(dev, "%s:%d attempt to do a partial map in a dma_buf: non-zero offset to dma_buf mapping!\n", + __FILE__, __LINE__); + goto out_unlock; + } err = dma_buf_mmap( reg->cpu_alloc->imported.umm.dma_buf, vma, vma->vm_pgoff - reg->start_pfn); @@ -2612,7 +2316,7 @@ void *kbase_va_alloc(struct kbase_context *kctx, u32 size, struct kbase_hwc_dma_ page_array = kbase_get_cpu_phy_pages(reg); for (i = 0; i < pages; i++) - page_array[i] = as_tagged(dma_pa + (i << PAGE_SHIFT)); + page_array[i] = as_tagged(dma_pa + ((dma_addr_t)i << PAGE_SHIFT)); reg->cpu_alloc->nents = pages; diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_linux.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_linux.h index db35f62a7431fc..a14826ebc772e0 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_linux.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_linux.h @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2010, 2012-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010, 2012-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_mem_linux.h * Base kernel memory APIs, Linux implementation. @@ -32,14 +37,84 @@ struct kbase_hwc_dma_mapping { size_t size; }; +/** + * kbase_mem_alloc - Create a new allocation for GPU + * + * @kctx: The kernel context + * @va_pages: The number of pages of virtual address space to reserve + * @commit_pages: The number of physical pages to allocate upfront + * @extent: The number of extra pages to allocate on each GPU fault which + * grows the region. + * @flags: bitmask of BASE_MEM_* flags to convey special requirements & + * properties for the new allocation. + * @gpu_va: Start address of the memory region which was allocated from GPU + * virtual address space. + * + * Return: 0 on success or error code + */ struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx, u64 va_pages, u64 commit_pages, u64 extent, u64 *flags, u64 *gpu_va); -int kbase_mem_query(struct kbase_context *kctx, u64 gpu_addr, int query, u64 *const pages); + +/** + * kbase_mem_query - Query properties of a GPU memory region + * + * @kctx: The kernel context + * @gpu_addr: A GPU address contained within the memory region + * @query: The type of query, from KBASE_MEM_QUERY_* flags, which could be + * regarding the amount of backing physical memory allocated so far + * for the region or the size of the region or the flags associated + * with the region. + * @out: Pointer to the location to store the result of query. + * + * Return: 0 on success or error code + */ +int kbase_mem_query(struct kbase_context *kctx, u64 gpu_addr, u64 query, + u64 *const out); + +/** + * kbase_mem_import - Import the external memory for use by the GPU + * + * @kctx: The kernel context + * @type: Type of external memory + * @phandle: Handle to the external memory interpreted as per the type. + * @padding: Amount of extra VA pages to append to the imported buffer + * @gpu_va: GPU address assigned to the imported external memory + * @va_pages: Size of the memory region reserved from the GPU address space + * @flags: bitmask of BASE_MEM_* flags to convey special requirements & + * properties for the new allocation representing the external + * memory. + * Return: 0 on success or error code + */ int kbase_mem_import(struct kbase_context *kctx, enum base_mem_import_type type, void __user *phandle, u32 padding, u64 *gpu_va, u64 *va_pages, u64 *flags); + +/** + * kbase_mem_alias - Create a new allocation for GPU, aliasing one or more + * memory regions + * + * @kctx: The kernel context + * @flags: bitmask of BASE_MEM_* flags. + * @stride: Bytes between start of each memory region + * @nents: The number of regions to pack together into the alias + * @ai: Pointer to the struct containing the memory aliasing info + * @num_pages: Number of pages the alias will cover + * + * Return: 0 on failure or otherwise the GPU VA for the alias + */ u64 kbase_mem_alias(struct kbase_context *kctx, u64 *flags, u64 stride, u64 nents, struct base_mem_aliasing_info *ai, u64 *num_pages); + +/** + * kbase_mem_flags_change - Change the flags for a memory region + * + * @kctx: The kernel context + * @gpu_addr: A GPU address contained within the memory region to modify. + * @flags: The new flags to set + * @mask: Mask of the flags, from BASE_MEM_*, to modify. + * + * Return: 0 on success or error code + */ int kbase_mem_flags_change(struct kbase_context *kctx, u64 gpu_addr, unsigned int flags, unsigned int mask); /** @@ -53,10 +128,19 @@ int kbase_mem_flags_change(struct kbase_context *kctx, u64 gpu_addr, unsigned in */ int kbase_mem_commit(struct kbase_context *kctx, u64 gpu_addr, u64 new_pages); +/** + * kbase_mmap - Mmap method, gets invoked when mmap system call is issued on + * device file /dev/malixx. + * @file: Pointer to the device file /dev/malixx instance. + * @vma: Pointer to the struct containing the info where the GPU allocation + * will be mapped in virtual address space of CPU. + * + * Return: 0 on success or error code + */ int kbase_mmap(struct file *file, struct vm_area_struct *vma); /** - * kbase_mem_evictable_init - Initialize the Ephemeral memory the eviction + * kbase_mem_evictable_init - Initialize the Ephemeral memory eviction * mechanism. * @kctx: The kbase context to initialize. * @@ -237,4 +321,35 @@ void kbase_va_free(struct kbase_context *kctx, struct kbase_hwc_dma_mapping *han extern const struct vm_operations_struct kbase_vm_ops; +/** + * kbase_mem_shrink_cpu_mapping - Shrink the CPU mapping(s) of an allocation + * @kctx: Context the region belongs to + * @reg: The GPU region + * @new_pages: The number of pages after the shrink + * @old_pages: The number of pages before the shrink + * + * Shrink (or completely remove) all CPU mappings which reference the shrunk + * part of the allocation. + */ +void kbase_mem_shrink_cpu_mapping(struct kbase_context *kctx, + struct kbase_va_region *reg, + u64 new_pages, u64 old_pages); + +/** + * kbase_mem_shrink_gpu_mapping - Shrink the GPU mapping of an allocation + * @kctx: Context the region belongs to + * @reg: The GPU region or NULL if there isn't one + * @new_pages: The number of pages after the shrink + * @old_pages: The number of pages before the shrink + * + * Return: 0 on success, negative -errno on error + * + * Unmap the shrunk pages from the GPU mapping. Note that the size of the region + * itself is unmodified as we still need to reserve the VA, only the page tables + * will be modified by this function. + */ +int kbase_mem_shrink_gpu_mapping(struct kbase_context *kctx, + struct kbase_va_region *reg, + u64 new_pages, u64 old_pages); + #endif /* _KBASE_MEM_LINUX_H_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_lowlevel.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_lowlevel.h index f4e88491327e71..6581ecfc95a0e9 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_lowlevel.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_lowlevel.h @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2012-2014,2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2012-2014,2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_MEM_LOWLEVEL_H #define _KBASE_MEM_LOWLEVEL_H @@ -48,11 +53,39 @@ struct tagged_addr { phys_addr_t tagged_addr; }; #define HUGE_HEAD (1u << 1) #define FROM_PARTIAL (1u << 2) +/* + * Note: if macro for converting physical address to page is not defined + * in the kernel itself, it is defined hereby. This is to avoid build errors + * which are reported during builds for some architectures. + */ +#ifndef phys_to_page +#define phys_to_page(phys) (pfn_to_page((phys) >> PAGE_SHIFT)) +#endif + +/** + * as_phys_addr_t - Retrieve the physical address from tagged address by + * masking the lower order 12 bits. + * @t: tagged address to be translated. + * + * Return: physical address corresponding to tagged address. + */ static inline phys_addr_t as_phys_addr_t(struct tagged_addr t) { return t.tagged_addr & PAGE_MASK; } +/** + * as_tagged - Convert the physical address to tagged address type though + * there is no tag info present, the lower order 12 bits will be 0 + * @phys: physical address to be converted to tagged type + * + * This is used for 4KB physical pages allocated by the Driver or imported pages + * and is needed as physical pages tracking object stores the reference for + * physical pages using tagged address type in lieu of the type generally used + * for physical addresses. + * + * Return: address of tagged address type. + */ static inline struct tagged_addr as_tagged(phys_addr_t phys) { struct tagged_addr t; @@ -61,6 +94,16 @@ static inline struct tagged_addr as_tagged(phys_addr_t phys) return t; } +/** + * as_tagged_tag - Form the tagged address by storing the tag or metadata in the + * lower order 12 bits of physial address + * @phys: physical address to be converted to tagged address + * @tag: tag to be stored along with the physical address. + * + * The tag info is used while freeing up the pages + * + * Return: tagged address storing physical address & tag. + */ static inline struct tagged_addr as_tagged_tag(phys_addr_t phys, int tag) { struct tagged_addr t; @@ -69,11 +112,26 @@ static inline struct tagged_addr as_tagged_tag(phys_addr_t phys, int tag) return t; } +/** + * is_huge - Check if the physical page is one of the 512 4KB pages of the + * large page which was not split to be used partially + * @t: tagged address storing the tag in the lower order bits. + * + * Return: true if page belongs to large page, or false + */ static inline bool is_huge(struct tagged_addr t) { return t.tagged_addr & HUGE_PAGE; } +/** + * is_huge_head - Check if the physical page is the first 4KB page of the + * 512 4KB pages within a large page which was not split + * to be used partially + * @t: tagged address storing the tag in the lower order bits. + * + * Return: true if page is the first page of a large page, or false + */ static inline bool is_huge_head(struct tagged_addr t) { int mask = HUGE_HEAD | HUGE_PAGE; @@ -81,6 +139,14 @@ static inline bool is_huge_head(struct tagged_addr t) return mask == (t.tagged_addr & mask); } +/** + * is_partial - Check if the physical page is one of the 512 pages of the + * large page which was split in 4KB pages to be used + * partially for allocations >= 2 MB in size. + * @t: tagged address storing the tag in the lower order bits. + * + * Return: true if page was taken from large page used partially, or false + */ static inline bool is_partial(struct tagged_addr t) { return t.tagged_addr & FROM_PARTIAL; diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool.c index 696730ac5b2bee..1255df0fc1ae20 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> #include <linux/mm.h> #include <linux/dma-mapping.h> @@ -34,16 +39,6 @@ #define NOT_DIRTY false #define NOT_RECLAIMED false -static inline void kbase_mem_pool_lock(struct kbase_mem_pool *pool) -{ - spin_lock(&pool->pool_lock); -} - -static inline void kbase_mem_pool_unlock(struct kbase_mem_pool *pool) -{ - spin_unlock(&pool->pool_lock); -} - static size_t kbase_mem_pool_capacity(struct kbase_mem_pool *pool) { ssize_t max_size = kbase_mem_pool_max_size(pool); @@ -70,8 +65,6 @@ static void kbase_mem_pool_add_locked(struct kbase_mem_pool *pool, list_add(&p->lru, &pool->page_list); pool->cur_size++; - zone_page_state_add(1, page_zone(p), NR_SLAB_RECLAIMABLE); - pool_dbg(pool, "added page\n"); } @@ -85,14 +78,8 @@ static void kbase_mem_pool_add(struct kbase_mem_pool *pool, struct page *p) static void kbase_mem_pool_add_list_locked(struct kbase_mem_pool *pool, struct list_head *page_list, size_t nr_pages) { - struct page *p; - lockdep_assert_held(&pool->pool_lock); - list_for_each_entry(p, page_list, lru) { - zone_page_state_add(1, page_zone(p), NR_SLAB_RECLAIMABLE); - } - list_splice(page_list, &pool->page_list); pool->cur_size += nr_pages; @@ -120,8 +107,6 @@ static struct page *kbase_mem_pool_remove_locked(struct kbase_mem_pool *pool) list_del_init(&p->lru); pool->cur_size--; - zone_page_state_add(-1, page_zone(p), NR_SLAB_RECLAIMABLE); - pool_dbg(pool, "removed page\n"); return p; @@ -182,12 +167,6 @@ struct page *kbase_mem_alloc_page(struct kbase_mem_pool *pool) gfp = GFP_HIGHUSER | __GFP_ZERO; #endif - if (current->flags & PF_KTHREAD) { - /* Don't trigger OOM killer from kernel threads, e.g. when - * growing memory on GPU page fault */ - gfp |= __GFP_NORETRY; - } - /* don't warn on higer order failures */ if (pool->order) gfp |= __GFP_NOWARN; @@ -260,12 +239,33 @@ int kbase_mem_pool_grow(struct kbase_mem_pool *pool, struct page *p; size_t i; + kbase_mem_pool_lock(pool); + + pool->dont_reclaim = true; for (i = 0; i < nr_to_grow; i++) { + if (pool->dying) { + pool->dont_reclaim = false; + kbase_mem_pool_shrink_locked(pool, nr_to_grow); + kbase_mem_pool_unlock(pool); + + return -ENOMEM; + } + kbase_mem_pool_unlock(pool); + p = kbase_mem_alloc_page(pool); - if (!p) + if (!p) { + kbase_mem_pool_lock(pool); + pool->dont_reclaim = false; + kbase_mem_pool_unlock(pool); + return -ENOMEM; - kbase_mem_pool_add(pool, p); + } + + kbase_mem_pool_lock(pool); + kbase_mem_pool_add_locked(pool, p); } + pool->dont_reclaim = false; + kbase_mem_pool_unlock(pool); return 0; } @@ -317,10 +317,19 @@ static unsigned long kbase_mem_pool_reclaim_count_objects(struct shrinker *s, struct shrink_control *sc) { struct kbase_mem_pool *pool; + size_t pool_size; pool = container_of(s, struct kbase_mem_pool, reclaim); - pool_dbg(pool, "reclaim count: %zu\n", kbase_mem_pool_size(pool)); - return kbase_mem_pool_size(pool); + + kbase_mem_pool_lock(pool); + if (pool->dont_reclaim && !pool->dying) { + kbase_mem_pool_unlock(pool); + return 0; + } + pool_size = kbase_mem_pool_size(pool); + kbase_mem_pool_unlock(pool); + + return pool_size; } static unsigned long kbase_mem_pool_reclaim_scan_objects(struct shrinker *s, @@ -331,9 +340,17 @@ static unsigned long kbase_mem_pool_reclaim_scan_objects(struct shrinker *s, pool = container_of(s, struct kbase_mem_pool, reclaim); + kbase_mem_pool_lock(pool); + if (pool->dont_reclaim && !pool->dying) { + kbase_mem_pool_unlock(pool); + return 0; + } + pool_dbg(pool, "reclaim scan %ld:\n", sc->nr_to_scan); - freed = kbase_mem_pool_shrink(pool, sc->nr_to_scan); + freed = kbase_mem_pool_shrink_locked(pool, sc->nr_to_scan); + + kbase_mem_pool_unlock(pool); pool_dbg(pool, "reclaim freed %ld pages\n", freed); @@ -362,6 +379,7 @@ int kbase_mem_pool_init(struct kbase_mem_pool *pool, pool->order = order; pool->kbdev = kbdev; pool->next_pool = next_pool; + pool->dying = false; spin_lock_init(&pool->pool_lock); INIT_LIST_HEAD(&pool->page_list); @@ -386,6 +404,13 @@ int kbase_mem_pool_init(struct kbase_mem_pool *pool, return 0; } +void kbase_mem_pool_mark_dying(struct kbase_mem_pool *pool) +{ + kbase_mem_pool_lock(pool); + pool->dying = true; + kbase_mem_pool_unlock(pool); +} + void kbase_mem_pool_term(struct kbase_mem_pool *pool) { struct kbase_mem_pool *next_pool = pool->next_pool; @@ -449,6 +474,21 @@ struct page *kbase_mem_pool_alloc(struct kbase_mem_pool *pool) return NULL; } +struct page *kbase_mem_pool_alloc_locked(struct kbase_mem_pool *pool) +{ + struct page *p; + + lockdep_assert_held(&pool->pool_lock); + + pool_dbg(pool, "alloc_locked()\n"); + p = kbase_mem_pool_remove_locked(pool); + + if (p) + return p; + + return NULL; +} + void kbase_mem_pool_free(struct kbase_mem_pool *pool, struct page *p, bool dirty) { @@ -471,6 +511,25 @@ void kbase_mem_pool_free(struct kbase_mem_pool *pool, struct page *p, } } +void kbase_mem_pool_free_locked(struct kbase_mem_pool *pool, struct page *p, + bool dirty) +{ + pool_dbg(pool, "free_locked()\n"); + + lockdep_assert_held(&pool->pool_lock); + + if (!kbase_mem_pool_is_full(pool)) { + /* Add to our own pool */ + if (dirty) + kbase_mem_pool_sync_page(pool, p); + + kbase_mem_pool_add_locked(pool, p); + } else { + /* Free page */ + kbase_mem_pool_free_page(pool, p); + } +} + int kbase_mem_pool_alloc_pages(struct kbase_mem_pool *pool, size_t nr_4k_pages, struct tagged_addr *pages, bool partial_allowed) { @@ -548,7 +607,6 @@ int kbase_mem_pool_alloc_pages(struct kbase_mem_pool *pool, size_t nr_4k_pages, done: pool_dbg(pool, "alloc_pages(%zu) done\n", i); - return i; err_rollback: @@ -556,6 +614,49 @@ int kbase_mem_pool_alloc_pages(struct kbase_mem_pool *pool, size_t nr_4k_pages, return err; } +int kbase_mem_pool_alloc_pages_locked(struct kbase_mem_pool *pool, + size_t nr_4k_pages, struct tagged_addr *pages) +{ + struct page *p; + size_t i; + size_t nr_pages_internal; + + lockdep_assert_held(&pool->pool_lock); + + nr_pages_internal = nr_4k_pages / (1u << (pool->order)); + + if (nr_pages_internal * (1u << pool->order) != nr_4k_pages) + return -EINVAL; + + pool_dbg(pool, "alloc_pages_locked(4k=%zu):\n", nr_4k_pages); + pool_dbg(pool, "alloc_pages_locked(internal=%zu):\n", + nr_pages_internal); + + if (kbase_mem_pool_size(pool) < nr_pages_internal) { + pool_dbg(pool, "Failed alloc\n"); + return -ENOMEM; + } + + for (i = 0; i < nr_pages_internal; i++) { + int j; + + p = kbase_mem_pool_remove_locked(pool); + if (pool->order) { + *pages++ = as_tagged_tag(page_to_phys(p), + HUGE_HEAD | HUGE_PAGE); + for (j = 1; j < (1u << pool->order); j++) { + *pages++ = as_tagged_tag(page_to_phys(p) + + PAGE_SIZE * j, + HUGE_PAGE); + } + } else { + *pages++ = as_tagged(page_to_phys(p)); + } + } + + return nr_4k_pages; +} + static void kbase_mem_pool_add_array(struct kbase_mem_pool *pool, size_t nr_pages, struct tagged_addr *pages, bool zero, bool sync) @@ -596,6 +697,48 @@ static void kbase_mem_pool_add_array(struct kbase_mem_pool *pool, nr_pages, nr_to_pool); } +static void kbase_mem_pool_add_array_locked(struct kbase_mem_pool *pool, + size_t nr_pages, struct tagged_addr *pages, + bool zero, bool sync) +{ + struct page *p; + size_t nr_to_pool = 0; + LIST_HEAD(new_page_list); + size_t i; + + lockdep_assert_held(&pool->pool_lock); + + if (!nr_pages) + return; + + pool_dbg(pool, "add_array_locked(%zu, zero=%d, sync=%d):\n", + nr_pages, zero, sync); + + /* Zero/sync pages first */ + for (i = 0; i < nr_pages; i++) { + if (unlikely(!as_phys_addr_t(pages[i]))) + continue; + + if (is_huge_head(pages[i]) || !is_huge(pages[i])) { + p = phys_to_page(as_phys_addr_t(pages[i])); + if (zero) + kbase_mem_pool_zero_page(pool, p); + else if (sync) + kbase_mem_pool_sync_page(pool, p); + + list_add(&p->lru, &new_page_list); + nr_to_pool++; + } + pages[i] = as_tagged(0); + } + + /* Add new page list to pool */ + kbase_mem_pool_add_list_locked(pool, &new_page_list, nr_to_pool); + + pool_dbg(pool, "add_array_locked(%zu) added %zu pages\n", + nr_pages, nr_to_pool); +} + void kbase_mem_pool_free_pages(struct kbase_mem_pool *pool, size_t nr_pages, struct tagged_addr *pages, bool dirty, bool reclaimed) { @@ -639,13 +782,53 @@ void kbase_mem_pool_free_pages(struct kbase_mem_pool *pool, size_t nr_pages, p = phys_to_page(as_phys_addr_t(pages[i])); - if (reclaimed) - zone_page_state_add(-1, page_zone(p), - NR_SLAB_RECLAIMABLE); - kbase_mem_pool_free_page(pool, p); pages[i] = as_tagged(0); } pool_dbg(pool, "free_pages(%zu) done\n", nr_pages); } + + +void kbase_mem_pool_free_pages_locked(struct kbase_mem_pool *pool, + size_t nr_pages, struct tagged_addr *pages, bool dirty, + bool reclaimed) +{ + struct page *p; + size_t nr_to_pool; + LIST_HEAD(to_pool_list); + size_t i = 0; + + lockdep_assert_held(&pool->pool_lock); + + pool_dbg(pool, "free_pages_locked(%zu):\n", nr_pages); + + if (!reclaimed) { + /* Add to this pool */ + nr_to_pool = kbase_mem_pool_capacity(pool); + nr_to_pool = min(nr_pages, nr_to_pool); + + kbase_mem_pool_add_array_locked(pool, nr_pages, pages, false, + dirty); + + i += nr_to_pool; + } + + /* Free any remaining pages to kernel */ + for (; i < nr_pages; i++) { + if (unlikely(!as_phys_addr_t(pages[i]))) + continue; + + if (is_huge(pages[i]) && !is_huge_head(pages[i])) { + pages[i] = as_tagged(0); + continue; + } + + p = phys_to_page(as_phys_addr_t(pages[i])); + + kbase_mem_pool_free_page(pool, p); + pages[i] = as_tagged(0); + } + + pool_dbg(pool, "free_pages_locked(%zu) done\n", nr_pages); +} diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool_debugfs.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool_debugfs.c index 319cf2568aba45..4b4eeb32d2c1fa 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool_debugfs.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool_debugfs.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <linux/debugfs.h> #include <linux/seq_file.h> diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool_debugfs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool_debugfs.h index 496eaf3f1e1aeb..990d91c8fbe7ee 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool_debugfs.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool_debugfs.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_MEM_POOL_DEBUGFS_H #define _KBASE_MEM_POOL_DEBUGFS_H diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs.c index d58fd8d62fdec9..d4f8433f408795 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> #ifdef CONFIG_DEBUG_FS diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs.h index a1dc2e0b165b9b..1462247c3bcaef 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_mem_profile_debugfs.h * Header file for mem profiles entries in debugfs diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs_buf_size.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs_buf_size.h index 82f0702974c202..7f44d81e34e268 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs_buf_size.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs_buf_size.h @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2014 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2014, 2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_mem_profile_debugfs_buf_size.h * Header file for the size of the buffer to accumulate the histogram report text in @@ -27,7 +32,8 @@ * The size of the buffer to accumulate the histogram report text in * @see @ref CCTXP_HIST_BUF_SIZE_MAX_LENGTH_REPORT */ -#define KBASE_MEM_PROFILE_MAX_BUF_SIZE ((size_t) (64 + ((80 + (56 * 64)) * 15) + 56)) +#define KBASE_MEM_PROFILE_MAX_BUF_SIZE \ + ((size_t) (64 + ((80 + (56 * 64)) * 31) + 56)) #endif /*_KBASE_MEM_PROFILE_DEBUGFS_BUF_SIZE_H_*/ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu.c index c63269aed53c91..7ec579d6dc6c30 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu.c @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_mmu.c * Base kernel MMU management. @@ -99,16 +104,199 @@ static void kbase_mmu_report_fault_and_kill(struct kbase_context *kctx, struct kbase_as *as, const char *reason_str); -static size_t make_multiple(size_t minimum, size_t multiple) +/** + * reg_grow_calc_extra_pages() - Calculate the number of backed pages to add to + * a region on a GPU page fault + * + * @reg: The region that will be backed with more pages + * @fault_rel_pfn: PFN of the fault relative to the start of the region + * + * This calculates how much to increase the backing of a region by, based on + * where a GPU page fault occurred and the flags in the region. + * + * This can be more than the minimum number of pages that would reach + * @fault_rel_pfn, for example to reduce the overall rate of page fault + * interrupts on a region, or to ensure that the end address is aligned. + * + * Return: the number of backed pages to increase by + */ +static size_t reg_grow_calc_extra_pages(struct kbase_va_region *reg, size_t fault_rel_pfn) { - size_t remainder = minimum % multiple; + size_t multiple = reg->extent; + size_t reg_current_size = kbase_reg_current_backed_size(reg); + size_t minimum_extra = fault_rel_pfn - reg_current_size + 1; + size_t remainder; + + if (!multiple) { + dev_warn(reg->kctx->kbdev->dev, + "VA Region 0x%llx extent was 0, allocator needs to set this properly for KBASE_REG_PF_GROW\n", + ((unsigned long long)reg->start_pfn) << PAGE_SHIFT); + return minimum_extra; + } + + /* Calculate the remainder to subtract from minimum_extra to make it + * the desired (rounded down) multiple of the extent. + * Depending on reg's flags, the base used for calculating multiples is + * different */ + if (reg->flags & KBASE_REG_TILER_ALIGN_TOP) { + /* multiple is based from the top of the initial commit, which + * has been allocated in such a way that (start_pfn + + * initial_commit) is already aligned to multiple. Hence the + * pfn for the end of committed memory will also be aligned to + * multiple */ + size_t initial_commit = reg->initial_commit; + + if (fault_rel_pfn < initial_commit) { + /* this case is just to catch in case it's been + * recommitted by userspace to be smaller than the + * initial commit */ + minimum_extra = initial_commit - reg_current_size; + remainder = 0; + } else { + /* same as calculating (fault_rel_pfn - initial_commit + 1) */ + size_t pages_after_initial = minimum_extra + reg_current_size - initial_commit; + + remainder = pages_after_initial % multiple; + } + } else { + /* multiple is based from the current backed size, even if the + * current backed size/pfn for end of committed memory are not + * themselves aligned to multiple */ + remainder = minimum_extra % multiple; + } if (remainder == 0) - return minimum; + return minimum_extra; + + return minimum_extra + multiple - remainder; +} - return minimum + multiple - remainder; +#ifdef CONFIG_MALI_JOB_DUMP +static void kbase_gpu_mmu_handle_write_faulting_as(struct kbase_context *kctx, + struct kbase_device *kbdev, + struct kbase_as *faulting_as, + u64 start_pfn, size_t nr, u32 op) +{ + mutex_lock(&kbdev->mmu_hw_mutex); + + kbase_mmu_hw_clear_fault(kbdev, faulting_as, kctx, + KBASE_MMU_FAULT_TYPE_PAGE); + kbase_mmu_hw_do_operation(kbdev, faulting_as, kctx, start_pfn, + nr, op, 1); + + mutex_unlock(&kbdev->mmu_hw_mutex); + + kbase_mmu_hw_enable_fault(kbdev, faulting_as, kctx, + KBASE_MMU_FAULT_TYPE_PAGE); } +static void kbase_gpu_mmu_handle_write_fault(struct kbase_context *kctx, + struct kbase_as *faulting_as) +{ + struct kbasep_gwt_list_element *pos; + struct kbase_va_region *region; + struct kbase_device *kbdev; + u64 fault_pfn, pfn_offset; + u32 op; + int ret; + int as_no; + + as_no = faulting_as->number; + kbdev = container_of(faulting_as, struct kbase_device, as[as_no]); + fault_pfn = faulting_as->fault_addr >> PAGE_SHIFT; + + kbase_gpu_vm_lock(kctx); + + /* Find region and check if it should be writable. */ + region = kbase_region_tracker_find_region_enclosing_address(kctx, + faulting_as->fault_addr); + if (!region || region->flags & KBASE_REG_FREE) { + kbase_gpu_vm_unlock(kctx); + kbase_mmu_report_fault_and_kill(kctx, faulting_as, + "Memory is not mapped on the GPU"); + return; + } + + if (!(region->flags & KBASE_REG_GPU_WR)) { + kbase_gpu_vm_unlock(kctx); + kbase_mmu_report_fault_and_kill(kctx, faulting_as, + "Region does not have write permissions"); + return; + } + + /* Capture addresses of faulting write location + * for job dumping if write tracking is enabled. + */ + if (kctx->gwt_enabled) { + u64 page_addr = faulting_as->fault_addr & PAGE_MASK; + bool found = false; + /* Check if this write was already handled. */ + list_for_each_entry(pos, &kctx->gwt_current_list, link) { + if (page_addr == pos->page_addr) { + found = true; + break; + } + } + + if (!found) { + pos = kmalloc(sizeof(*pos), GFP_KERNEL); + if (pos) { + pos->region = region; + pos->page_addr = page_addr; + pos->num_pages = 1; + list_add(&pos->link, &kctx->gwt_current_list); + } else { + dev_warn(kbdev->dev, "kmalloc failure"); + } + } + } + + pfn_offset = fault_pfn - region->start_pfn; + /* Now make this faulting page writable to GPU. */ + ret = kbase_mmu_update_pages_no_flush(kctx, fault_pfn, + &kbase_get_gpu_phy_pages(region)[pfn_offset], + 1, region->flags); + + /* flush L2 and unlock the VA (resumes the MMU) */ + if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_6367)) + op = AS_COMMAND_FLUSH; + else + op = AS_COMMAND_FLUSH_PT; + + kbase_gpu_mmu_handle_write_faulting_as(kctx, kbdev, faulting_as, + fault_pfn, 1, op); + + kbase_gpu_vm_unlock(kctx); +} + +static void kbase_gpu_mmu_handle_permission_fault(struct kbase_context *kctx, + struct kbase_as *faulting_as) +{ + u32 fault_status; + + fault_status = faulting_as->fault_status; + + switch (fault_status & AS_FAULTSTATUS_ACCESS_TYPE_MASK) { + case AS_FAULTSTATUS_ACCESS_TYPE_ATOMIC: + case AS_FAULTSTATUS_ACCESS_TYPE_WRITE: + kbase_gpu_mmu_handle_write_fault(kctx, faulting_as); + break; + case AS_FAULTSTATUS_ACCESS_TYPE_EX: + kbase_mmu_report_fault_and_kill(kctx, faulting_as, + "Execute Permission fault"); + break; + case AS_FAULTSTATUS_ACCESS_TYPE_READ: + kbase_mmu_report_fault_and_kill(kctx, faulting_as, + "Read Permission fault"); + break; + default: + kbase_mmu_report_fault_and_kill(kctx, faulting_as, + "Unknown Permission fault"); + break; + } +} +#endif + void page_fault_worker(struct work_struct *data) { u64 fault_pfn; @@ -122,6 +310,12 @@ void page_fault_worker(struct work_struct *data) struct kbase_va_region *region; int err; bool grown = false; + size_t min_pool_size; + struct kbase_mem_pool *pool; + int pages_to_grow; + struct tagged_addr *gpu_pages, *cpu_pages; + struct kbase_sub_alloc *prealloc_sas[2] = { NULL, NULL }; + int i; faulting_as = container_of(data, struct kbase_as, work_pagefault); fault_pfn = faulting_as->fault_addr >> PAGE_SHIFT; @@ -140,8 +334,7 @@ void page_fault_worker(struct work_struct *data) KBASE_DEBUG_ASSERT(kctx->kbdev == kbdev); - if (unlikely(faulting_as->protected_mode)) - { + if (unlikely(faulting_as->protected_mode)) { kbase_mmu_report_fault_and_kill(kctx, faulting_as, "Protected mode fault"); kbase_mmu_hw_clear_fault(kbdev, faulting_as, kctx, @@ -158,6 +351,17 @@ void page_fault_worker(struct work_struct *data) break; case AS_FAULTSTATUS_EXCEPTION_CODE_PERMISSION_FAULT: +#ifdef CONFIG_MALI_JOB_DUMP + /* If GWT was ever enabled then we need to handle + * write fault pages even if the feature was disabled later. + */ + if (kctx->gwt_was_enabled) { + kbase_gpu_mmu_handle_permission_fault(kctx, + faulting_as); + goto fault_done; + } +#endif + kbase_mmu_report_fault_and_kill(kctx, faulting_as, "Permission failure"); goto fault_done; @@ -196,6 +400,23 @@ void page_fault_worker(struct work_struct *data) goto fault_done; } +page_fault_retry: +#ifdef CONFIG_MALI_2MB_ALLOC + /* Preallocate memory for the sub-allocation structs if necessary */ + for (i = 0; i != ARRAY_SIZE(prealloc_sas); ++i) { + if (!prealloc_sas[i]) { + prealloc_sas[i] = kmalloc(sizeof(*prealloc_sas[i]), + GFP_KERNEL); + if (!prealloc_sas[i]) { + kbase_mmu_report_fault_and_kill( + kctx, faulting_as, + "Failed pre-allocating memory for sub-allocations' metadata"); + goto fault_done; + } + } + } +#endif /* CONFIG_MALI_2MB_ALLOC */ + /* so we have a translation fault, let's see if it is for growable * memory */ kbase_gpu_vm_lock(kctx); @@ -266,15 +487,10 @@ void page_fault_worker(struct work_struct *data) goto fault_done; } - new_pages = make_multiple(fault_rel_pfn - - kbase_reg_current_backed_size(region) + 1, - region->extent); + new_pages = reg_grow_calc_extra_pages(region, fault_rel_pfn); /* cap to max vsize */ - if (new_pages + kbase_reg_current_backed_size(region) > - region->nr_pages) - new_pages = region->nr_pages - - kbase_reg_current_backed_size(region); + new_pages = min(new_pages, region->nr_pages - kbase_reg_current_backed_size(region)); if (0 == new_pages) { mutex_lock(&kbdev->mmu_hw_mutex); @@ -294,20 +510,60 @@ void page_fault_worker(struct work_struct *data) goto fault_done; } - if (kbase_alloc_phy_pages_helper(region->gpu_alloc, new_pages) == 0) { - if (region->gpu_alloc != region->cpu_alloc) { - if (kbase_alloc_phy_pages_helper( - region->cpu_alloc, new_pages) == 0) { - grown = true; +#ifdef CONFIG_MALI_2MB_ALLOC + if (new_pages >= (SZ_2M / SZ_4K)) { + pool = &kctx->lp_mem_pool; + /* Round up to number of 2 MB pages required */ + min_pool_size = new_pages + ((SZ_2M / SZ_4K) - 1); + min_pool_size /= (SZ_2M / SZ_4K); + } else { +#endif + pool = &kctx->mem_pool; + min_pool_size = new_pages; +#ifdef CONFIG_MALI_2MB_ALLOC + } +#endif + + if (region->gpu_alloc != region->cpu_alloc) + min_pool_size *= 2; + + pages_to_grow = 0; + + mutex_lock(&kctx->mem_partials_lock); + kbase_mem_pool_lock(pool); + /* We can not allocate memory from the kernel with the vm_lock held, so + * check that there is enough memory in the pool. If not then calculate + * how much it has to grow by, grow the pool when the vm_lock is + * dropped, and retry the allocation. + */ + if (kbase_mem_pool_size(pool) >= min_pool_size) { + gpu_pages = kbase_alloc_phy_pages_helper_locked( + region->gpu_alloc, pool, new_pages, + &prealloc_sas[0]); + + if (gpu_pages) { + if (region->gpu_alloc != region->cpu_alloc) { + cpu_pages = kbase_alloc_phy_pages_helper_locked( + region->cpu_alloc, pool, + new_pages, &prealloc_sas[1]); + + if (cpu_pages) { + grown = true; + } else { + kbase_free_phy_pages_helper_locked( + region->gpu_alloc, + pool, gpu_pages, + new_pages); + } } else { - kbase_free_phy_pages_helper(region->gpu_alloc, - new_pages); + grown = true; } - } else { - grown = true; } + } else { + pages_to_grow = min_pool_size - kbase_mem_pool_size(pool); } - + kbase_mem_pool_unlock(pool); + mutex_unlock(&kctx->mem_partials_lock); if (grown) { u64 pfn_offset; @@ -377,15 +633,51 @@ void page_fault_worker(struct work_struct *data) /* reenable this in the mask */ kbase_mmu_hw_enable_fault(kbdev, faulting_as, kctx, KBASE_MMU_FAULT_TYPE_PAGE); + +#ifdef CONFIG_MALI_JOB_DUMP + if (kctx->gwt_enabled) { + /* GWT also tracks growable regions. */ + struct kbasep_gwt_list_element *pos; + + pos = kmalloc(sizeof(*pos), GFP_KERNEL); + if (pos) { + pos->region = region; + pos->page_addr = (region->start_pfn + + pfn_offset) << + PAGE_SHIFT; + pos->num_pages = new_pages; + list_add(&pos->link, + &kctx->gwt_current_list); + } else { + dev_warn(kbdev->dev, "kmalloc failure"); + } + } +#endif kbase_gpu_vm_unlock(kctx); } else { - /* failed to extend, handle as a normal PF */ + int ret = -ENOMEM; + kbase_gpu_vm_unlock(kctx); - kbase_mmu_report_fault_and_kill(kctx, faulting_as, - "Page allocation failure"); + + /* If the memory pool was insufficient then grow it and retry. + * Otherwise fail the allocation. + */ + if (pages_to_grow > 0) + ret = kbase_mem_pool_grow(pool, pages_to_grow); + + if (ret < 0) { + /* failed to extend, handle as a normal PF */ + kbase_mmu_report_fault_and_kill(kctx, faulting_as, + "Page allocation failure"); + } else { + goto page_fault_retry; + } } fault_done: + for (i = 0; i != ARRAY_SIZE(prealloc_sas); ++i) + kfree(prealloc_sas[i]); + /* * By this point, the fault was handled in some way, * so release the ctx refcount @@ -838,9 +1130,16 @@ int kbase_mmu_insert_pages_no_flush(struct kbase_context *kctx, u64 *target = &pgd_page[ofs]; /* Fail if the current page is a valid ATE entry + * unless gwt_was_enabled as in that case all + * pages will be valid from when + * kbase_gpu_gwt_start() cleared the gpu + * write flag. */ - KBASE_DEBUG_ASSERT(0 == (*target & 1UL)); - +#ifdef CONFIG_MALI_JOB_DUMP + if (!kctx->gwt_was_enabled) +#endif + KBASE_DEBUG_ASSERT + (0 == (*target & 1UL)); kctx->kbdev->mmu_mode->entry_set_ate(target, phys[i], flags, cur_level); } @@ -1202,13 +1501,12 @@ KBASE_EXPORT_TEST_API(kbase_mmu_teardown_pages); * already held by the caller. Refer to kbasep_js_runpool_release_ctx() for more * information. */ -int kbase_mmu_update_pages(struct kbase_context *kctx, u64 vpfn, - struct tagged_addr *phys, size_t nr, - unsigned long flags) +int kbase_mmu_update_pages_no_flush(struct kbase_context *kctx, u64 vpfn, + struct tagged_addr *phys, size_t nr, + unsigned long flags) { phys_addr_t pgd; u64 *pgd_page; - size_t requested_nr = nr; struct kbase_mmu_mode const *mmu_mode; int err; @@ -1224,9 +1522,6 @@ int kbase_mmu_update_pages(struct kbase_context *kctx, u64 vpfn, mmu_mode = kctx->kbdev->mmu_mode; - dev_warn(kctx->kbdev->dev, "kbase_mmu_update_pages(): updating page share flags on GPU PFN 0x%llx from phys %p, %zu pages", - vpfn, phys, nr); - while (nr) { unsigned int i; unsigned int index = vpfn & 0x1FF; @@ -1278,12 +1573,21 @@ int kbase_mmu_update_pages(struct kbase_context *kctx, u64 vpfn, } mutex_unlock(&kctx->mmu_lock); - kbase_mmu_flush_invalidate(kctx, vpfn, requested_nr, true); return 0; fail_unlock: mutex_unlock(&kctx->mmu_lock); - kbase_mmu_flush_invalidate(kctx, vpfn, requested_nr, true); + return err; +} + +int kbase_mmu_update_pages(struct kbase_context *kctx, u64 vpfn, + struct tagged_addr *phys, size_t nr, + unsigned long flags) +{ + int err; + + err = kbase_mmu_update_pages_no_flush(kctx, vpfn, phys, nr, flags); + kbase_mmu_flush_invalidate(kctx, vpfn, nr, true); return err; } @@ -1534,8 +1838,7 @@ void bus_fault_worker(struct work_struct *data) return; } - if (unlikely(faulting_as->protected_mode)) - { + if (unlikely(faulting_as->protected_mode)) { kbase_mmu_report_fault_and_kill(kctx, faulting_as, "Permission failure"); kbase_mmu_hw_clear_fault(kbdev, faulting_as, kctx, @@ -2114,14 +2417,10 @@ void kbase_mmu_interrupt_process(struct kbase_device *kbdev, struct kbase_contex * We need to switch to UNMAPPED mode - but we do this in a * worker so that we can sleep */ - KBASE_DEBUG_ASSERT(0 == object_is_on_stack(&as->work_busfault)); - WARN_ON(work_pending(&as->work_busfault)); - queue_work(as->pf_wq, &as->work_busfault); + WARN_ON(!queue_work(as->pf_wq, &as->work_busfault)); atomic_inc(&kbdev->faults_pending); } else { - KBASE_DEBUG_ASSERT(0 == object_is_on_stack(&as->work_pagefault)); - WARN_ON(work_pending(&as->work_pagefault)); - queue_work(as->pf_wq, &as->work_pagefault); + WARN_ON(!queue_work(as->pf_wq, &as->work_pagefault)); atomic_inc(&kbdev->faults_pending); } } diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_hw.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_hw.h index 986e959e9a0c77..92aa55dc2b35e9 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_hw.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_hw.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file * Interface file for accessing MMU hardware functionality diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_mode_aarch64.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_mode_aarch64.c index 0fb717b67af92c..aa0c4038b563e9 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_mode_aarch64.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_mode_aarch64.c @@ -7,16 +7,20 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - - #include "mali_kbase.h" #include "mali_midg_regmap.h" #include "mali_kbase_defs.h" @@ -43,29 +47,25 @@ */ static inline void page_table_entry_set(u64 *pte, u64 phy) { +#if KERNEL_VERSION(3, 18, 13) <= LINUX_VERSION_CODE + WRITE_ONCE(*pte, phy); +#else #ifdef CONFIG_64BIT + barrier(); *pte = phy; + barrier(); #elif defined(CONFIG_ARM) - /* - * In order to prevent the compiler keeping cached copies of - * memory, we have to explicitly say that we have updated memory. - * - * Note: We could manually move the data ourselves into R0 and - * R1 by specifying register variables that are explicitly - * given registers assignments, the down side of this is that - * we have to assume cpu endianness. To avoid this we can use - * the ldrd to read the data from memory into R0 and R1 which - * will respect the cpu endianness, we then use strd to make - * the 64 bit assignment to the page table entry. - */ - asm volatile("ldrd r0, r1, [%[ptemp]]\n\t" - "strd r0, r1, [%[pte]]\n\t" - : "=m" (*pte) - : [ptemp] "r" (&phy), [pte] "r" (pte), "m" (phy) - : "r0", "r1"); + barrier(); + asm volatile("ldrd r0, [%1]\n\t" + "strd r0, %0\n\t" + : "=m" (*pte) + : "r" (&phy) + : "r0", "r1"); + barrier(); #else #error "64-bit atomic write must be implemented for your architecture" #endif +#endif } static void mmu_get_as_setup(struct kbase_context *kctx, diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_mode_lpae.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_mode_lpae.c index f080fdc0be8865..7dc38fcb792b7a 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_mode_lpae.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_mode_lpae.c @@ -7,16 +7,20 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - - #include "mali_kbase.h" #include "mali_midg_regmap.h" #include "mali_kbase_defs.h" @@ -41,30 +45,25 @@ */ static inline void page_table_entry_set(u64 *pte, u64 phy) { +#if KERNEL_VERSION(3, 18, 13) <= LINUX_VERSION_CODE + WRITE_ONCE(*pte, phy); +#else #ifdef CONFIG_64BIT + barrier(); *pte = phy; + barrier(); #elif defined(CONFIG_ARM) - /* - * In order to prevent the compiler keeping cached copies of - * memory, we have to explicitly say that we have updated - * memory. - * - * Note: We could manually move the data ourselves into R0 and - * R1 by specifying register variables that are explicitly - * given registers assignments, the down side of this is that - * we have to assume cpu endianness. To avoid this we can use - * the ldrd to read the data from memory into R0 and R1 which - * will respect the cpu endianness, we then use strd to make - * the 64 bit assignment to the page table entry. - */ - asm volatile("ldrd r0, r1, [%[ptemp]]\n\t" - "strd r0, r1, [%[pte]]\n\t" - : "=m" (*pte) - : [ptemp] "r" (&phy), [pte] "r" (pte), "m" (phy) - : "r0", "r1"); + barrier(); + asm volatile("ldrd r0, [%1]\n\t" + "strd r0, %0\n\t" + : "=m" (*pte) + : "r" (&phy) + : "r0", "r1"); + barrier(); #else #error "64-bit atomic write must be implemented for your architecture" #endif +#endif } static void mmu_get_as_setup(struct kbase_context *kctx, diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_platform_fake.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_platform_fake.c index 0152b35f711b4b..fbb090e6c21f30 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_platform_fake.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_platform_fake.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <linux/errno.h> #include <linux/export.h> #include <linux/ioport.h> diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_pm.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_pm.c index 97d543464c28bb..c226350ff88c12 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_pm.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_pm.c @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2010-2016 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_pm.c * Base kernel power management APIs @@ -89,10 +94,15 @@ int kbase_pm_context_active_handle_suspend(struct kbase_device *kbdev, enum kbas if (old_count == 0) kbase_timeline_pm_handle_event(kbdev, KBASE_TIMELINE_PM_EVENT_GPU_ACTIVE); - if (c == 1) + if (c == 1) { /* First context active: Power on the GPU and any cores requested by * the policy */ kbase_hwaccess_pm_gpu_active(kbdev); + } +#if defined(CONFIG_DEVFREQ_THERMAL) && defined(CONFIG_MALI_BIFROST_DEVFREQ) + if (kbdev->ipa.gpu_active_callback) + kbdev->ipa.gpu_active_callback(kbdev->ipa.model_data); +#endif mutex_unlock(&kbdev->pm.lock); mutex_unlock(&js_devdata->runpool_mutex); @@ -141,6 +151,21 @@ void kbase_pm_context_idle(struct kbase_device *kbdev) wake_up(&kbdev->pm.zero_active_count_wait); } +#if defined(CONFIG_DEVFREQ_THERMAL) && defined(CONFIG_MALI_BIFROST_DEVFREQ) + /* IPA may be using vinstr, in which case there may be one PM reference + * still held when all other contexts have left the GPU. Inform IPA that + * the GPU is now idle so that vinstr can drop it's reference. + * + * If the GPU was only briefly active then it might have gone idle + * before vinstr has taken a PM reference, meaning that active_count is + * zero. We still need to inform IPA in this case, so that vinstr can + * drop the PM reference and avoid keeping the GPU powered + * unnecessarily. + */ + if (c <= 1 && kbdev->ipa.gpu_idle_callback) + kbdev->ipa.gpu_idle_callback(kbdev->ipa.model_data); +#endif + mutex_unlock(&kbdev->pm.lock); mutex_unlock(&js_devdata->runpool_mutex); } diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_pm.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_pm.h index 37fa2479df74ba..8de17e1aca59eb 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_pm.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_pm.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_pm.h * Power management API definitions diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_profiling_gator_api.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_profiling_gator_api.h index 7fb674eded3734..15bca79fd64d65 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_profiling_gator_api.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_profiling_gator_api.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_profiling_gator_api.h * Model interface diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_regs_history_debugfs.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_regs_history_debugfs.c index 9e73f9f4999e9f..4bcb7bdb3da250 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_regs_history_debugfs.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_regs_history_debugfs.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include "mali_kbase.h" #include "mali_kbase_regs_history_debugfs.h" diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_regs_history_debugfs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_regs_history_debugfs.h index fbb36b3f22e494..8cc11010a92b36 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_regs_history_debugfs.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_regs_history_debugfs.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * Header file for register access history support via debugfs * diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_replay.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_replay.c index 9f4dc372770d5e..6929af9c5c9439 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_replay.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_replay.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_replay.c * Replay soft job handlers @@ -659,8 +664,8 @@ static void kbasep_replay_create_atom(struct kbase_context *kctx, atom->prio = prio; atom->atom_number = atom_nr; - base_jd_atom_dep_set(&atom->pre_dep[0], 0 , BASE_JD_DEP_TYPE_INVALID); - base_jd_atom_dep_set(&atom->pre_dep[1], 0 , BASE_JD_DEP_TYPE_INVALID); + base_jd_atom_dep_set(&atom->pre_dep[0], 0, BASE_JD_DEP_TYPE_INVALID); + base_jd_atom_dep_set(&atom->pre_dep[1], 0, BASE_JD_DEP_TYPE_INVALID); atom->udata.blob[0] = 0; atom->udata.blob[1] = 0; @@ -708,7 +713,8 @@ static int kbasep_replay_create_atoms(struct kbase_context *kctx, kbasep_replay_create_atom(kctx, t_atom, t_atom_nr, prio); kbasep_replay_create_atom(kctx, f_atom, f_atom_nr, prio); - base_jd_atom_dep_set(&f_atom->pre_dep[0], t_atom_nr , BASE_JD_DEP_TYPE_DATA); + base_jd_atom_dep_set(&f_atom->pre_dep[0], t_atom_nr, + BASE_JD_DEP_TYPE_DATA); return 0; } @@ -772,22 +778,6 @@ static int kbasep_replay_parse_payload(struct kbase_context *kctx, 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_BIFROST_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/drivers/gpu/arm/bifrost_for_linux/mali_kbase_smc.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_smc.c index 43175c85988fd0..2176479959a5ee 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_smc.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_smc.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifdef CONFIG_ARM64 #include <mali_kbase.h> diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_smc.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_smc.h index 9bff3d2e8b4d87..221eb21a8c7f3f 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_smc.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_smc.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_SMC_H_ #define _KBASE_SMC_H_ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_softjobs.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_softjobs.c index cafc789ea253e7..3f87ac08eec696 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_softjobs.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_softjobs.c @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2011-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> #if defined(CONFIG_DMA_SHARED_BUFFER) @@ -370,12 +375,12 @@ static void kbase_fence_debug_timeout(struct kbase_jd_atom *katom) } #endif /* CONFIG_MALI_BIFROST_FENCE_DEBUG */ -void kbasep_soft_job_timeout_worker(unsigned long data) +void kbasep_soft_job_timeout_worker(struct timer_list *timer) { - struct kbase_context *kctx = (struct kbase_context *)data; + struct kbase_context *kctx = container_of(timer, struct kbase_context, + 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; ktime_t cur_time = ktime_get(); bool restarting = false; unsigned long lflags; @@ -521,8 +526,7 @@ static inline void free_user_buffer(struct kbase_debug_copy_buffer *buffer) static void kbase_debug_copy_finish(struct kbase_jd_atom *katom) { - struct kbase_debug_copy_buffer *buffers = - (struct kbase_debug_copy_buffer *)(uintptr_t)katom->jc; + struct kbase_debug_copy_buffer *buffers = katom->softjob_data; unsigned int i; unsigned int nr = katom->nr_extres; @@ -560,7 +564,7 @@ static void kbase_debug_copy_finish(struct kbase_jd_atom *katom) kbase_gpu_vm_unlock(katom->kctx); kfree(buffers); - katom->jc = 0; + katom->softjob_data = NULL; } static int kbase_debug_copy_prepare(struct kbase_jd_atom *katom) @@ -578,10 +582,9 @@ static int kbase_debug_copy_prepare(struct kbase_jd_atom *katom) buffers = kcalloc(nr, sizeof(*buffers), GFP_KERNEL); if (!buffers) { ret = -ENOMEM; - katom->jc = 0; goto out_cleanup; } - katom->jc = (u64)(uintptr_t)buffers; + katom->softjob_data = buffers; user_buffers = kmalloc_array(nr, sizeof(*user_buffers), GFP_KERNEL); @@ -688,13 +691,6 @@ static int kbase_debug_copy_prepare(struct kbase_jd_atom *katom) ret = 0; break; } - case KBASE_MEM_TYPE_IMPORTED_UMP: - { - dev_warn(katom->kctx->kbdev->dev, - "UMP is not supported for debug_copy jobs\n"); - ret = -EINVAL; - goto out_unlock; - } default: /* Nothing to be done. */ break; @@ -768,9 +764,11 @@ static int kbase_mem_copy_from_extres(struct kbase_context *kctx, u64 offset = buf_data->offset; size_t extres_size = buf_data->nr_extres_pages*PAGE_SIZE; size_t to_copy = min(extres_size, buf_data->size); - size_t dma_to_copy; struct kbase_mem_phy_alloc *gpu_alloc = buf_data->gpu_alloc; int ret = 0; +#ifdef CONFIG_DMA_SHARED_BUFFER + size_t dma_to_copy; +#endif KBASE_DEBUG_ASSERT(pages != NULL); @@ -853,10 +851,12 @@ static int kbase_mem_copy_from_extres(struct kbase_context *kctx, static int kbase_debug_copy(struct kbase_jd_atom *katom) { - struct kbase_debug_copy_buffer *buffers = - (struct kbase_debug_copy_buffer *)(uintptr_t)katom->jc; + struct kbase_debug_copy_buffer *buffers = katom->softjob_data; unsigned int i; + if (WARN_ON(!buffers)) + return -EINVAL; + for (i = 0; i < katom->nr_extres; i++) { int res = kbase_mem_copy_from_extres(katom->kctx, &buffers[i]); @@ -910,8 +910,34 @@ static int kbase_jit_allocate_prepare(struct kbase_jd_atom *katom) goto free_info; } - /* Replace the user pointer with our kernel allocated info structure */ - katom->jc = (u64)(uintptr_t) info; + if (kctx->jit_version == 1) { + /* Old JIT didn't have usage_id, max_allocations, bin_id + * or padding, so force them to zero + */ + info->usage_id = 0; + info->max_allocations = 0; + info->bin_id = 0; + info->flags = 0; + memset(info->padding, 0, sizeof(info->padding)); + } else { + int i; + + /* Check padding is all zeroed */ + for (i = 0; i < sizeof(info->padding); i++) { + if (info->padding[i] != 0) { + ret = -EINVAL; + goto free_info; + } + } + + /* No bit other than TILER_ALIGN_TOP shall be set */ + if (info->flags & ~BASE_JIT_ALLOC_MEM_TILER_ALIGN_TOP) { + ret = -EINVAL; + goto free_info; + } + } + + katom->softjob_data = info; katom->jit_blocked = false; lockdep_assert_held(&kctx->jctx.lock); @@ -933,13 +959,13 @@ static int kbase_jit_allocate_prepare(struct kbase_jd_atom *katom) free_info: kfree(info); fail: - katom->jc = 0; return ret; } static u8 kbase_jit_free_get_id(struct kbase_jd_atom *katom) { - if (WARN_ON(katom->core_req != BASE_JD_REQ_SOFT_JIT_FREE)) + if (WARN_ON((katom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE) != + BASE_JD_REQ_SOFT_JIT_FREE)) return 0; return (u8) katom->jc; @@ -958,7 +984,12 @@ static int kbase_jit_allocate_process(struct kbase_jd_atom *katom) katom->jit_blocked = false; } - info = (struct base_jit_alloc_info *) (uintptr_t) katom->jc; + info = katom->softjob_data; + + if (WARN_ON(!info)) { + katom->event_code = BASE_JD_EVENT_JOB_INVALID; + return 0; + } /* The JIT ID is still in use so fail the allocation */ if (kctx->jit_alloc[info->id]) { @@ -980,7 +1011,8 @@ static int kbase_jit_allocate_process(struct kbase_jd_atom *katom) list_for_each_entry(jit_atom, &kctx->jit_atoms_head, jit_node) { if (jit_atom == katom) break; - if (jit_atom->core_req == BASE_JD_REQ_SOFT_JIT_FREE) { + if ((jit_atom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE) == + BASE_JD_REQ_SOFT_JIT_FREE) { u8 free_id = kbase_jit_free_get_id(jit_atom); if (free_id && kctx->jit_alloc[free_id]) { @@ -1061,7 +1093,7 @@ static void kbase_jit_allocate_finish(struct kbase_jd_atom *katom) katom->jit_blocked = false; } - info = (struct base_jit_alloc_info *) (uintptr_t) katom->jc; + info = katom->softjob_data; /* Free the info structure */ kfree(info); } @@ -1184,11 +1216,7 @@ static int kbase_ext_res_prepare(struct kbase_jd_atom *katom) */ ext_res->count = count; - /* - * Replace the user pointer with our kernel allocated - * ext_res structure. - */ - katom->jc = (u64)(uintptr_t) ext_res; + katom->softjob_data = ext_res; return 0; @@ -1204,7 +1232,7 @@ static void kbase_ext_res_process(struct kbase_jd_atom *katom, bool map) int i; bool failed = false; - ext_res = (struct base_external_resource_list *) (uintptr_t) katom->jc; + ext_res = katom->softjob_data; if (!ext_res) goto failed_jc; @@ -1240,13 +1268,13 @@ static void kbase_ext_res_process(struct kbase_jd_atom *katom, bool map) return; failed_loop: - while (--i > 0) { - u64 gpu_addr; - - gpu_addr = ext_res->ext_res[i].ext_resource & + while (i > 0) { + u64 const gpu_addr = ext_res->ext_res[i - 1].ext_resource & ~BASE_EXT_RES_ACCESS_EXCLUSIVE; kbase_sticky_resource_release(katom->kctx, NULL, gpu_addr); + + --i; } katom->event_code = BASE_JD_EVENT_JOB_INVALID; @@ -1260,13 +1288,15 @@ static void kbase_ext_res_finish(struct kbase_jd_atom *katom) { struct base_external_resource_list *ext_res; - ext_res = (struct base_external_resource_list *) (uintptr_t) katom->jc; + ext_res = katom->softjob_data; /* Free the info structure */ kfree(ext_res); } int kbase_process_soft_job(struct kbase_jd_atom *katom) { + KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTJOB_START(katom); + switch (katom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE) { case BASE_JD_REQ_SOFT_DUMP_CPU_GPU_TIME: return kbase_dump_cpu_gpu_time(katom); @@ -1430,6 +1460,7 @@ int kbase_prepare_soft_job(struct kbase_jd_atom *katom) void kbase_finish_soft_job(struct kbase_jd_atom *katom) { + KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTJOB_END(katom); switch (katom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE) { case BASE_JD_REQ_SOFT_DUMP_CPU_GPU_TIME: /* Nothing to do */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_strings.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_strings.c index c98762cec24412..22caa4a6d81477 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_strings.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_strings.c @@ -7,13 +7,18 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include "mali_kbase_strings.h" #define KBASE_DRV_NAME "mali" diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_strings.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_strings.h index 41b8fdbec6a436..d2f1825314fe7e 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_strings.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_strings.h @@ -7,13 +7,18 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - extern const char kbase_drv_name[]; extern const char kbase_timeline_name[]; diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync.h index ca855b8d1b533a..550e0232856ad7 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_kbase_sync.h * diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_android.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_android.c index e4528e2b9f252b..41f740a7bc8c10 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_android.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_android.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Code for supporting explicit Android fences (CONFIG_SYNC) * Known to be good for kernels 4.5 and earlier. diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_common.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_common.c index 457def29668478..9520f5ac3b5ebe 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_common.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_common.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * @file mali_kbase_sync_common.c * diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_file.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_file.c index 509c0666f10f50..349a33ebafe27a 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_file.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_file.c @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2012-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2012-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* * Code for supporting explicit Linux fences (CONFIG_SYNC_FILE) * Introduced in kernel 4.9. @@ -161,7 +166,9 @@ static void kbase_fence_wait_callback(struct dma_fence *fence, struct kbase_context *kctx = katom->kctx; /* Cancel atom if fence is erroneous */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)) +#if (KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE || \ + (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE && \ + KERNEL_VERSION(4, 9, 68) <= LINUX_VERSION_CODE)) if (dma_fence_is_signaled(kcb->fence) && kcb->fence->error) #else if (dma_fence_is_signaled(kcb->fence) && kcb->fence->status < 0) @@ -277,7 +284,9 @@ static void kbase_sync_fence_info_get(struct dma_fence *fence, * 1 : signaled */ if (dma_fence_is_signaled(fence)) { -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)) +#if (KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE || \ + (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE && \ + KERNEL_VERSION(4, 9, 68) <= LINUX_VERSION_CODE)) int status = fence->error; #else int status = fence->status; diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_tlstream.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_tlstream.c index d01aa23b206ebc..2ff45f50bf16d6 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_tlstream.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_tlstream.c @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2015-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2015-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <linux/anon_inodes.h> #include <linux/atomic.h> #include <linux/file.h> @@ -144,12 +149,14 @@ enum tl_msg_id_obj { KBASE_TL_ATTRIB_ATOM_CONFIG, KBASE_TL_ATTRIB_ATOM_PRIORITY, KBASE_TL_ATTRIB_ATOM_STATE, - KBASE_TL_ATTRIB_ATOM_PRIORITY_CHANGE, + KBASE_TL_ATTRIB_ATOM_PRIORITIZED, KBASE_TL_ATTRIB_ATOM_JIT, KBASE_TL_ATTRIB_AS_CONFIG, KBASE_TL_EVENT_LPU_SOFTSTOP, KBASE_TL_EVENT_ATOM_SOFTSTOP_EX, KBASE_TL_EVENT_ATOM_SOFTSTOP_ISSUE, + KBASE_TL_EVENT_ATOM_SOFTJOB_START, + KBASE_TL_EVENT_ATOM_SOFTJOB_END, /* Job dump specific events. */ KBASE_JD_GPU_SOFT_RESET @@ -453,8 +460,8 @@ static const struct tp_desc tp_desc_obj[] = { "atom,state" }, { - KBASE_TL_ATTRIB_ATOM_PRIORITY_CHANGE, - __stringify(KBASE_TL_ATTRIB_ATOM_PRIORITY_CHANGE), + KBASE_TL_ATTRIB_ATOM_PRIORITIZED, + __stringify(KBASE_TL_ATTRIB_ATOM_PRIORITIZED), "atom caused priority change", "@p", "atom" @@ -494,6 +501,20 @@ static const struct tp_desc tp_desc_obj[] = { "@p", "atom" }, + { + KBASE_TL_EVENT_ATOM_SOFTJOB_START, + __stringify(KBASE_TL_EVENT_ATOM_SOFTJOB_START), + "atom soft job has started", + "@p", + "atom" + }, + { + KBASE_TL_EVENT_ATOM_SOFTJOB_END, + __stringify(KBASE_TL_EVENT_ATOM_SOFTJOB_END), + "atom soft job has completed", + "@p", + "atom" + }, { KBASE_JD_GPU_SOFT_RESET, __stringify(KBASE_JD_GPU_SOFT_RESET), @@ -1037,17 +1058,17 @@ static void kbasep_tlstream_flush_stream(enum tl_stream_type stype) /** * kbasep_tlstream_autoflush_timer_callback - autoflush timer callback - * @data: unused + * @timer: unused * * 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 *timer) { enum tl_stream_type stype; int rcode; - CSTD_UNUSED(data); + CSTD_UNUSED(timer); for (stype = 0; stype < TL_STREAM_TYPE_COUNT; stype++) { struct tl_stream *stream = tl_stream[stype]; @@ -1371,9 +1392,8 @@ int kbase_tlstream_init(void) /* Initialize autoflush timer. */ atomic_set(&autoflush_timer_active, 0); - setup_timer(&autoflush_timer, - kbasep_tlstream_autoflush_timer_callback, - 0); + kbase_timer_setup(&autoflush_timer, + kbasep_tlstream_autoflush_timer_callback); return 0; } @@ -2208,9 +2228,9 @@ void __kbase_tlstream_tl_attrib_atom_state(void *atom, u32 state) kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags); } -void __kbase_tlstream_tl_attrib_atom_priority_change(void *atom) +void __kbase_tlstream_tl_attrib_atom_prioritized(void *atom) { - const u32 msg_id = KBASE_TL_ATTRIB_ATOM_PRIORITY_CHANGE; + const u32 msg_id = KBASE_TL_ATTRIB_ATOM_PRIORITIZED; const size_t msg_size = sizeof(msg_id) + sizeof(u64) + sizeof(atom); unsigned long flags; @@ -2360,6 +2380,52 @@ void __kbase_tlstream_tl_event_atom_softstop_issue(void *atom) kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags); } +void __kbase_tlstream_tl_event_atom_softjob_start(void *atom) +{ + const u32 msg_id = KBASE_TL_EVENT_ATOM_SOFTJOB_START; + const size_t msg_size = + sizeof(msg_id) + sizeof(u64) + sizeof(atom); + unsigned long flags; + char *buffer; + size_t pos = 0; + + buffer = kbasep_tlstream_msgbuf_acquire( + TL_STREAM_TYPE_OBJ, + msg_size, &flags); + KBASE_DEBUG_ASSERT(buffer); + + pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id)); + pos = kbasep_tlstream_write_timestamp(buffer, pos); + pos = kbasep_tlstream_write_bytes( + buffer, pos, &atom, sizeof(atom)); + KBASE_DEBUG_ASSERT(msg_size == pos); + + kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags); +} + +void __kbase_tlstream_tl_event_atom_softjob_end(void *atom) +{ + const u32 msg_id = KBASE_TL_EVENT_ATOM_SOFTJOB_END; + const size_t msg_size = + sizeof(msg_id) + sizeof(u64) + sizeof(atom); + unsigned long flags; + char *buffer; + size_t pos = 0; + + buffer = kbasep_tlstream_msgbuf_acquire( + TL_STREAM_TYPE_OBJ, + msg_size, &flags); + KBASE_DEBUG_ASSERT(buffer); + + pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id)); + pos = kbasep_tlstream_write_timestamp(buffer, pos); + pos = kbasep_tlstream_write_bytes( + buffer, pos, &atom, sizeof(atom)); + KBASE_DEBUG_ASSERT(msg_size == pos); + + kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags); +} + void __kbase_tlstream_jd_gpu_soft_reset(void *gpu) { const u32 msg_id = KBASE_JD_GPU_SOFT_RESET; diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_tlstream.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_tlstream.h index c0a1117d5f25c1..bfa25d98264add 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_tlstream.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_tlstream.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #if !defined(_KBASE_TLSTREAM_H) #define _KBASE_TLSTREAM_H @@ -134,7 +139,7 @@ void __kbase_tlstream_tl_attrib_atom_config( void *atom, u64 jd, u64 affinity, u32 config); void __kbase_tlstream_tl_attrib_atom_priority(void *atom, u32 prio); void __kbase_tlstream_tl_attrib_atom_state(void *atom, u32 state); -void __kbase_tlstream_tl_attrib_atom_priority_change(void *atom); +void __kbase_tlstream_tl_attrib_atom_prioritized(void *atom); void __kbase_tlstream_tl_attrib_atom_jit( void *atom, u64 edit_addr, u64 new_addr); void __kbase_tlstream_tl_attrib_as_config( @@ -142,6 +147,8 @@ void __kbase_tlstream_tl_attrib_as_config( void __kbase_tlstream_tl_event_atom_softstop_ex(void *atom); void __kbase_tlstream_tl_event_lpu_softstop(void *lpu); void __kbase_tlstream_tl_event_atom_softstop_issue(void *atom); +void __kbase_tlstream_tl_event_atom_softjob_start(void *atom); +void __kbase_tlstream_tl_event_atom_softjob_end(void *atom); void __kbase_tlstream_jd_gpu_soft_reset(void *gpu); void __kbase_tlstream_aux_pm_state(u32 core_type, u64 state); void __kbase_tlstream_aux_pagefault(u32 ctx_nr, u64 page_count_change); @@ -480,13 +487,13 @@ extern atomic_t kbase_tlstream_enabled; __TRACE_IF_ENABLED_LATENCY(tl_attrib_atom_state, atom, state) /** - * KBASE_TLSTREAM_TL_ATTRIB_ATOM_PRIORITY_CHANGE - atom caused priority change + * KBASE_TLSTREAM_TL_ATTRIB_ATOM_PRIORITIZED - atom was prioritized * @atom: name of the atom object * * Function emits a timeline message signalling priority change */ -#define KBASE_TLSTREAM_TL_ATTRIB_ATOM_PRIORITY_CHANGE(atom) \ - __TRACE_IF_ENABLED_LATENCY(tl_attrib_atom_priority_change, atom) +#define KBASE_TLSTREAM_TL_ATTRIB_ATOM_PRIORITIZED(atom) \ + __TRACE_IF_ENABLED_LATENCY(tl_attrib_atom_prioritized, atom) /** * KBASE_TLSTREAM_TL_ATTRIB_ATOM_JIT - jit happened on atom @@ -510,26 +517,40 @@ extern atomic_t kbase_tlstream_enabled; __TRACE_IF_ENABLED(tl_attrib_as_config, as, transtab, memattr, transcfg) /** - * KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTSTOP_ex + * KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTSTOP_EX * @atom: atom identifier */ #define KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTSTOP_EX(atom) \ __TRACE_IF_ENABLED(tl_event_atom_softstop_ex, atom) /** - * KBASE_TLSTREAM_TL_EVENT_LPU_softstop + * KBASE_TLSTREAM_TL_EVENT_LPU_SOFTSTOP * @lpu: name of the LPU object */ #define KBASE_TLSTREAM_TL_EVENT_LPU_SOFTSTOP(lpu) \ __TRACE_IF_ENABLED(tl_event_lpu_softstop, lpu) /** - * KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTSTOP_issue + * KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTSTOP_ISSUE * @atom: atom identifier */ #define KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTSTOP_ISSUE(atom) \ __TRACE_IF_ENABLED(tl_event_atom_softstop_issue, atom) +/** + * KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTJOB_START + * @atom: atom identifier + */ +#define KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTJOB_START(atom) \ + __TRACE_IF_ENABLED(tl_event_atom_softjob_start, atom) + +/** + * KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTJOB_END + * @atom: atom identifier + */ +#define KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTJOB_END(atom) \ + __TRACE_IF_ENABLED(tl_event_atom_softjob_end, atom) + /** * KBASE_TLSTREAM_JD_GPU_SOFT_RESET - The GPU is being soft reset * @gpu: name of the GPU object diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_defs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_defs.h index e2e0544208cea1..32fffe0d80a93c 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_defs.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_defs.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* ***** IMPORTANT: THIS IS NOT A NORMAL HEADER FILE ***** * ***** DO NOT INCLUDE DIRECTLY ***** * ***** THE LACK OF HEADER GUARDS IS INTENTIONAL ***** */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline.c index d9854749f45bf3..d6b6f5c31d5c0c 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline.c @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> #include <mali_kbase_jm.h> #include <mali_kbase_hwaccess_jm.h> diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline.h index 4b517f396f8c19..306da6d3cb8016 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #if !defined(_KBASE_TRACE_TIMELINE_H) #define _KBASE_TRACE_TIMELINE_H diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline_defs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline_defs.h index 156a95a67f4aef..114bcac541e923 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline_defs.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline_defs.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* ***** IMPORTANT: THIS IS NOT A NORMAL HEADER FILE ***** * ***** DO NOT INCLUDE DIRECTLY ***** * ***** THE LACK OF HEADER GUARDS IS INTENTIONAL ***** */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_utility.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_utility.c index be474ff8740124..3ea234aabeecde 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_utility.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_utility.c @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> bool kbasep_list_member_of(const struct list_head *base, struct list_head *entry) diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_utility.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_utility.h index fd7252dab0de25..f2e5a3381e13c3 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_utility.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_utility.h @@ -1,22 +1,27 @@ /* * - * (C) COPYRIGHT 2012-2013, 2015 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2012-2013, 2015, 2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_UTILITY_H #define _KBASE_UTILITY_H @@ -34,4 +39,28 @@ */ bool kbasep_list_member_of(const struct list_head *base, struct list_head *entry); + +static inline void kbase_timer_setup(struct timer_list *timer, + void (*callback)(struct timer_list *timer)) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) + setup_timer(timer, (void (*)(unsigned long)) callback, + (unsigned long) timer); +#else + timer_setup(timer, callback, 0); +#endif +} + +#ifndef WRITE_ONCE + #ifdef ASSIGN_ONCE + #define WRITE_ONCE(x, val) ASSIGN_ONCE(val, x) + #else + #define WRITE_ONCE(x, val) (ACCESS_ONCE(x) = (val)) + #endif +#endif + +#ifndef READ_ONCE + #define READ_ONCE(x) ACCESS_ONCE(x) +#endif + #endif /* _KBASE_UTILITY_H */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_vinstr.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_vinstr.c index 9c5b2e46c0e550..e25338b3544af3 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_vinstr.c +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_vinstr.c @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2011-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <linux/anon_inodes.h> #include <linux/atomic.h> #include <linux/hrtimer.h> @@ -33,6 +38,9 @@ #include <mali_kbase_hwcnt_reader.h> #include <mali_kbase_mem_linux.h> #include <mali_kbase_tlstream.h> +#ifdef CONFIG_MALI_BIFROST_NO_MALI +#include <backend/gpu/mali_kbase_model_dummy.h> +#endif /*****************************************************************************/ @@ -74,7 +82,9 @@ enum vinstr_state { /** * struct kbase_vinstr_context - vinstr context per device - * @lock: protects the entire vinstr context + * @lock: protects the entire vinstr context, but the list of + * vinstr clients can be updated outside the lock using + * @state_lock. * @kbdev: pointer to kbase device * @kctx: pointer to kbase context * @vmap: vinstr vmap for mapping hwcnt dump buffer @@ -86,12 +96,14 @@ enum vinstr_state { * @reprogram: when true, reprogram hwcnt block with the new set of * counters * @state: vinstr state - * @state_lock: protects information about vinstr state + * @state_lock: protects information about vinstr state and list of + * clients. * @suspend_waitq: notification queue to trigger state re-validation * @suspend_cnt: reference counter of vinstr's suspend state * @suspend_work: worker to execute on entering suspended state * @resume_work: worker to execute on leaving suspended state - * @nclients: number of attached clients, pending or otherwise + * @nclients: number of attached clients, pending or idle + * @nclients_suspended: number of attached but suspended clients * @waiting_clients: head of list of clients being periodically sampled * @idle_clients: head of list of clients being idle * @suspended_clients: head of list of clients being suspended @@ -101,6 +113,10 @@ enum vinstr_state { * @clients_present: when true, we have at least one client * Note: this variable is in sync. with nclients and is * present to preserve simplicity. Protected by state_lock. + * @need_suspend: when true, a suspend has been requested while a resume is + * in progress. Resume worker should queue a suspend. + * @need_resume: when true, a resume has been requested while a suspend is + * in progress. Suspend worker should queue a resume. */ struct kbase_vinstr_context { struct mutex lock; @@ -122,6 +138,7 @@ struct kbase_vinstr_context { struct work_struct resume_work; u32 nclients; + u32 nclients_suspended; struct list_head waiting_clients; struct list_head idle_clients; struct list_head suspended_clients; @@ -131,6 +148,9 @@ struct kbase_vinstr_context { atomic_t request_pending; bool clients_present; + + bool need_suspend; + bool need_resume; }; /** @@ -153,6 +173,7 @@ struct kbase_vinstr_context { * @write_idx: index of buffer being written by dumping service * @waitq: client's notification queue * @pending: when true, client has attached but hwcnt not yet updated + * @suspended: when true, client is suspended */ struct kbase_vinstr_client { struct kbase_vinstr_context *vinstr_ctx; @@ -173,6 +194,7 @@ struct kbase_vinstr_client { atomic_t write_idx; wait_queue_head_t waitq; bool pending; + bool suspended; }; /** @@ -187,6 +209,9 @@ struct kbasep_vinstr_wake_up_timer { /*****************************************************************************/ +static void kbase_vinstr_update_suspend( + struct kbase_vinstr_context *vinstr_ctx); + static int kbasep_vinstr_service_task(void *data); static unsigned int kbasep_vinstr_hwcnt_reader_poll( @@ -218,14 +243,14 @@ static int enable_hwcnt(struct kbase_vinstr_context *vinstr_ctx) { struct kbase_context *kctx = vinstr_ctx->kctx; struct kbase_device *kbdev = kctx->kbdev; - struct kbase_uk_hwcnt_setup setup; + struct kbase_ioctl_hwcnt_enable enable; int err; - setup.dump_buffer = vinstr_ctx->gpu_va; - setup.jm_bm = vinstr_ctx->bitmap[JM_HWCNT_BM]; - setup.tiler_bm = vinstr_ctx->bitmap[TILER_HWCNT_BM]; - setup.shader_bm = vinstr_ctx->bitmap[SHADER_HWCNT_BM]; - setup.mmu_l2_bm = vinstr_ctx->bitmap[MMU_L2_HWCNT_BM]; + enable.dump_buffer = vinstr_ctx->gpu_va; + enable.jm_bm = vinstr_ctx->bitmap[JM_HWCNT_BM]; + enable.tiler_bm = vinstr_ctx->bitmap[TILER_HWCNT_BM]; + enable.shader_bm = vinstr_ctx->bitmap[SHADER_HWCNT_BM]; + enable.mmu_l2_bm = vinstr_ctx->bitmap[MMU_L2_HWCNT_BM]; /* Mark the context as active so the GPU is kept turned on */ /* A suspend won't happen here, because we're in a syscall from a @@ -234,7 +259,7 @@ static int enable_hwcnt(struct kbase_vinstr_context *vinstr_ctx) /* Schedule the context in */ kbasep_js_schedule_privileged_ctx(kbdev, kctx); - err = kbase_instr_hwcnt_enable_internal(kbdev, kctx, &setup); + err = kbase_instr_hwcnt_enable_internal(kbdev, kctx, &enable); if (err) { /* Release the context. This had its own Power Manager Active * reference */ @@ -464,18 +489,24 @@ static void kbasep_vinstr_destroy_kctx(struct kbase_vinstr_context *vinstr_ctx) struct kbasep_kctx_list_element *element; struct kbasep_kctx_list_element *tmp; bool found = false; + bool hwcnt_disabled = false; unsigned long flags; /* Release hw counters dumping resources. */ vinstr_ctx->thread = NULL; - disable_hwcnt(vinstr_ctx); - kbasep_vinstr_unmap_kernel_dump_buffer(vinstr_ctx); /* Simplify state transitions by specifying that we have no clients. */ spin_lock_irqsave(&vinstr_ctx->state_lock, flags); vinstr_ctx->clients_present = false; + if ((VINSTR_SUSPENDED == vinstr_ctx->state) || (VINSTR_RESUMING == vinstr_ctx->state)) + hwcnt_disabled = true; spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); + if (!hwcnt_disabled) + disable_hwcnt(vinstr_ctx); + + kbasep_vinstr_unmap_kernel_dump_buffer(vinstr_ctx); + /* Remove kernel context from the device's contexts list. */ mutex_lock(&kbdev->kctx_list_lock); list_for_each_entry_safe(element, tmp, &kbdev->kctx_list, link) { @@ -515,6 +546,8 @@ static struct kbase_vinstr_client *kbasep_vinstr_attach_client( { struct task_struct *thread = NULL; struct kbase_vinstr_client *cli; + unsigned long flags; + bool clients_present = false; KBASE_DEBUG_ASSERT(vinstr_ctx); @@ -540,10 +573,14 @@ static struct kbase_vinstr_client *kbasep_vinstr_attach_client( hwcnt_bitmap_union(vinstr_ctx->bitmap, cli->bitmap); vinstr_ctx->reprogram = true; + spin_lock_irqsave(&vinstr_ctx->state_lock, flags); + clients_present = (vinstr_ctx->nclients || vinstr_ctx->nclients_suspended); + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); + /* If this is the first client, create the vinstr kbase * context. This context is permanently resident until the * last client exits. */ - if (!vinstr_ctx->nclients) { + if (!clients_present) { hwcnt_bitmap_set(vinstr_ctx->bitmap, cli->bitmap); if (kbasep_vinstr_create_kctx(vinstr_ctx) < 0) goto error; @@ -598,8 +635,11 @@ static struct kbase_vinstr_client *kbasep_vinstr_attach_client( atomic_set(&cli->write_idx, 0); init_waitqueue_head(&cli->waitq); + spin_lock_irqsave(&vinstr_ctx->state_lock, flags); vinstr_ctx->nclients++; list_add(&cli->list, &vinstr_ctx->idle_clients); + kbase_vinstr_update_suspend(vinstr_ctx); + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); mutex_unlock(&vinstr_ctx->lock); @@ -612,7 +652,7 @@ static struct kbase_vinstr_client *kbasep_vinstr_attach_client( (unsigned long)cli->dump_buffers, get_order(cli->dump_size * cli->buffer_count)); kfree(cli->accum_buffer); - if (!vinstr_ctx->nclients && vinstr_ctx->kctx) { + if (!clients_present && vinstr_ctx->kctx) { thread = vinstr_ctx->thread; kbasep_vinstr_destroy_kctx(vinstr_ctx); } @@ -634,18 +674,19 @@ void kbase_vinstr_detach_client(struct kbase_vinstr_client *cli) struct task_struct *thread = NULL; u32 zerobitmap[4] = { 0 }; int cli_found = 0; + unsigned long flags; + bool clients_present; KBASE_DEBUG_ASSERT(cli); vinstr_ctx = cli->vinstr_ctx; KBASE_DEBUG_ASSERT(vinstr_ctx); mutex_lock(&vinstr_ctx->lock); + spin_lock_irqsave(&vinstr_ctx->state_lock, flags); list_for_each_entry_safe(iter, tmp, &vinstr_ctx->idle_clients, list) { if (iter == cli) { - vinstr_ctx->reprogram = true; cli_found = 1; - list_del(&iter->list); break; } } @@ -653,15 +694,47 @@ void kbase_vinstr_detach_client(struct kbase_vinstr_client *cli) list_for_each_entry_safe( iter, tmp, &vinstr_ctx->waiting_clients, list) { if (iter == cli) { - vinstr_ctx->reprogram = true; cli_found = 1; - list_del(&iter->list); + break; + } + } + } + if (!cli_found) { + list_for_each_entry_safe( + iter, tmp, &vinstr_ctx->suspended_clients, list) { + if (iter == cli) { + cli_found = 1; break; } } } KBASE_DEBUG_ASSERT(cli_found); + if (cli_found) { + vinstr_ctx->reprogram = true; + list_del(&iter->list); + } + + if (!cli->suspended) + vinstr_ctx->nclients--; + else + vinstr_ctx->nclients_suspended--; + + kbase_vinstr_update_suspend(vinstr_ctx); + + clients_present = (vinstr_ctx->nclients || vinstr_ctx->nclients_suspended); + + /* Rebuild context bitmap now that the client has detached */ + hwcnt_bitmap_set(vinstr_ctx->bitmap, zerobitmap); + list_for_each_entry(iter, &vinstr_ctx->idle_clients, list) + hwcnt_bitmap_union(vinstr_ctx->bitmap, iter->bitmap); + list_for_each_entry(iter, &vinstr_ctx->waiting_clients, list) + hwcnt_bitmap_union(vinstr_ctx->bitmap, iter->bitmap); + list_for_each_entry(iter, &vinstr_ctx->suspended_clients, list) + hwcnt_bitmap_union(vinstr_ctx->bitmap, iter->bitmap); + + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); + kfree(cli->dump_buffers_meta); free_pages( (unsigned long)cli->dump_buffers, @@ -669,19 +742,11 @@ void kbase_vinstr_detach_client(struct kbase_vinstr_client *cli) kfree(cli->accum_buffer); kfree(cli); - vinstr_ctx->nclients--; - if (!vinstr_ctx->nclients) { + if (!clients_present) { thread = vinstr_ctx->thread; kbasep_vinstr_destroy_kctx(vinstr_ctx); } - /* Rebuild context bitmap now that the client has detached */ - hwcnt_bitmap_set(vinstr_ctx->bitmap, zerobitmap); - list_for_each_entry(iter, &vinstr_ctx->idle_clients, list) - hwcnt_bitmap_union(vinstr_ctx->bitmap, iter->bitmap); - list_for_each_entry(iter, &vinstr_ctx->waiting_clients, list) - hwcnt_bitmap_union(vinstr_ctx->bitmap, iter->bitmap); - mutex_unlock(&vinstr_ctx->lock); /* Thread must be stopped after lock is released. */ @@ -970,8 +1035,7 @@ static int kbasep_vinstr_collect_and_accumulate( WARN_ON(rcode); spin_lock_irqsave(&vinstr_ctx->state_lock, flags); - switch (vinstr_ctx->state) - { + switch (vinstr_ctx->state) { case VINSTR_SUSPENDING: schedule_work(&vinstr_ctx->suspend_work); break; @@ -982,12 +1046,13 @@ static int kbasep_vinstr_collect_and_accumulate( default: break; } - spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); /* Accumulate values of collected counters. */ if (!rcode) accum_clients(vinstr_ctx); + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); + return rcode; } @@ -1092,6 +1157,7 @@ static void kbasep_vinstr_reprogram( if (!reprogram_hwcnt(vinstr_ctx)) { vinstr_ctx->reprogram = false; + spin_lock_irqsave(&vinstr_ctx->state_lock, flags); list_for_each_entry( iter, &vinstr_ctx->idle_clients, @@ -1102,6 +1168,7 @@ static void kbasep_vinstr_reprogram( &vinstr_ctx->waiting_clients, list) iter->pending = false; + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); } } } @@ -1120,6 +1187,7 @@ static int kbasep_vinstr_update_client( enum base_hwcnt_reader_event event_id) { int rcode = 0; + unsigned long flags; /* Copy collected counters to user readable buffer. */ if (cli->buffer_count) @@ -1130,18 +1198,23 @@ static int kbasep_vinstr_update_client( else rcode = kbasep_vinstr_fill_dump_buffer_legacy(cli); + /* Prepare for next request. */ + memset(cli->accum_buffer, 0, cli->dump_size); + + spin_lock_irqsave(&cli->vinstr_ctx->state_lock, flags); + /* Check if client was put to suspend state while it was being updated */ + if (cli->suspended) + rcode = -EINVAL; + spin_unlock_irqrestore(&cli->vinstr_ctx->state_lock, flags); + if (rcode) goto exit; - /* Notify client. Make sure all changes to memory are visible. */ wmb(); atomic_inc(&cli->write_idx); wake_up_interruptible(&cli->waitq); - /* Prepare for next request. */ - memset(cli->accum_buffer, 0, cli->dump_size); - exit: return rcode; } @@ -1200,6 +1273,7 @@ static int kbasep_vinstr_service_task(void *data) struct kbase_vinstr_client *cli = NULL; struct kbase_vinstr_client *tmp; int rcode; + unsigned long flags; u64 timestamp = kbasep_vinstr_get_timestamp(); u64 dump_time = 0; @@ -1212,6 +1286,7 @@ static int kbasep_vinstr_service_task(void *data) if (current == vinstr_ctx->thread) { atomic_set(&vinstr_ctx->request_pending, 0); + spin_lock_irqsave(&vinstr_ctx->state_lock, flags); if (!list_empty(&vinstr_ctx->waiting_clients)) { cli = list_first_entry( &vinstr_ctx->waiting_clients, @@ -1219,6 +1294,7 @@ static int kbasep_vinstr_service_task(void *data) list); dump_time = cli->dump_time; } + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); } if (!cli || ((s64)timestamp - (s64)dump_time < 0ll)) { @@ -1247,6 +1323,7 @@ static int kbasep_vinstr_service_task(void *data) INIT_LIST_HEAD(&expired_requests); + spin_lock_irqsave(&vinstr_ctx->state_lock, flags); /* Find all expired requests. */ list_for_each_entry_safe( cli, @@ -1265,18 +1342,29 @@ static int kbasep_vinstr_service_task(void *data) } /* Fill data for each request found. */ - list_for_each_entry_safe(cli, tmp, &expired_requests, list) { + while (!list_empty(&expired_requests)) { + cli = list_first_entry(&expired_requests, + struct kbase_vinstr_client, list); + /* Ensure that legacy buffer will not be used from * this kthread context. */ BUG_ON(0 == cli->buffer_count); /* Expect only periodically sampled clients. */ BUG_ON(0 == cli->dump_interval); + /* Release the spinlock, as filling the data in client's + * userspace buffer could result in page faults. */ + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); if (!rcode) kbasep_vinstr_update_client( cli, timestamp, BASE_HWCNT_READER_EVENT_PERIODIC); + spin_lock_irqsave(&cli->vinstr_ctx->state_lock, flags); + + /* This client got suspended, move to the next one. */ + if (cli->suspended) + continue; /* Set new dumping time. Drop missed probing times. */ do { @@ -1288,6 +1376,7 @@ static int kbasep_vinstr_service_task(void *data) cli, &vinstr_ctx->waiting_clients); } + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); /* Reprogram counters set if required. */ kbasep_vinstr_reprogram(vinstr_ctx); @@ -1402,10 +1491,18 @@ static long kbasep_vinstr_hwcnt_reader_ioctl_set_interval( struct kbase_vinstr_client *cli, u32 interval) { struct kbase_vinstr_context *vinstr_ctx = cli->vinstr_ctx; + unsigned long flags; KBASE_DEBUG_ASSERT(vinstr_ctx); mutex_lock(&vinstr_ctx->lock); + spin_lock_irqsave(&vinstr_ctx->state_lock, flags); + + if (cli->suspended) { + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); + mutex_unlock(&vinstr_ctx->lock); + return -ENOMEM; + } list_del(&cli->list); @@ -1427,6 +1524,7 @@ static long kbasep_vinstr_hwcnt_reader_ioctl_set_interval( list_add(&cli->list, &vinstr_ctx->idle_clients); } + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); mutex_unlock(&vinstr_ctx->lock); return 0; @@ -1731,17 +1829,29 @@ static void kbasep_vinstr_suspend_worker(struct work_struct *data) spin_lock_irqsave(&vinstr_ctx->state_lock, flags); vinstr_ctx->state = VINSTR_SUSPENDED; wake_up_all(&vinstr_ctx->suspend_waitq); - spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); - mutex_unlock(&vinstr_ctx->lock); + if (vinstr_ctx->need_resume) { + vinstr_ctx->need_resume = false; + vinstr_ctx->state = VINSTR_RESUMING; + schedule_work(&vinstr_ctx->resume_work); - /* Kick GPU scheduler to allow entering protected mode. - * This must happen after vinstr was suspended. */ - kbasep_vinstr_kick_scheduler(vinstr_ctx->kbdev); + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); + + mutex_unlock(&vinstr_ctx->lock); + } else { + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); + + mutex_unlock(&vinstr_ctx->lock); + + /* Kick GPU scheduler to allow entering protected mode. + * This must happen after vinstr was suspended. + */ + kbasep_vinstr_kick_scheduler(vinstr_ctx->kbdev); + } } /** - * kbasep_vinstr_suspend_worker - worker resuming vinstr module + * kbasep_vinstr_resume_worker - worker resuming vinstr module * @data: pointer to work structure */ static void kbasep_vinstr_resume_worker(struct work_struct *data) @@ -1760,15 +1870,27 @@ static void kbasep_vinstr_resume_worker(struct work_struct *data) spin_lock_irqsave(&vinstr_ctx->state_lock, flags); vinstr_ctx->state = VINSTR_IDLE; wake_up_all(&vinstr_ctx->suspend_waitq); - spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); - mutex_unlock(&vinstr_ctx->lock); + if (vinstr_ctx->need_suspend) { + vinstr_ctx->need_suspend = false; + vinstr_ctx->state = VINSTR_SUSPENDING; + schedule_work(&vinstr_ctx->suspend_work); + + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); + + mutex_unlock(&vinstr_ctx->lock); + } else { + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); - /* Kick GPU scheduler to allow entering protected mode. - * Note that scheduler state machine might requested re-entry to - * protected mode before vinstr was resumed. - * This must happen after vinstr was release. */ - kbasep_vinstr_kick_scheduler(vinstr_ctx->kbdev); + mutex_unlock(&vinstr_ctx->lock); + + /* Kick GPU scheduler to allow entering protected mode. + * Note that scheduler state machine might requested re-entry to + * protected mode before vinstr was resumed. + * This must happen after vinstr was release. + */ + kbasep_vinstr_kick_scheduler(vinstr_ctx->kbdev); + } } /*****************************************************************************/ @@ -1783,6 +1905,7 @@ struct kbase_vinstr_context *kbase_vinstr_init(struct kbase_device *kbdev) INIT_LIST_HEAD(&vinstr_ctx->idle_clients); INIT_LIST_HEAD(&vinstr_ctx->waiting_clients); + INIT_LIST_HEAD(&vinstr_ctx->suspended_clients); mutex_init(&vinstr_ctx->lock); spin_lock_init(&vinstr_ctx->state_lock); vinstr_ctx->kbdev = kbdev; @@ -1816,27 +1939,35 @@ void kbase_vinstr_term(struct kbase_vinstr_context *vinstr_ctx) if (list_empty(list)) { list = &vinstr_ctx->waiting_clients; - if (list_empty(list)) - break; + if (list_empty(list)) { + list = &vinstr_ctx->suspended_clients; + if (list_empty(list)) + break; + } } cli = list_first_entry(list, struct kbase_vinstr_client, list); list_del(&cli->list); + if (!cli->suspended) + vinstr_ctx->nclients--; + else + vinstr_ctx->nclients_suspended--; kfree(cli->accum_buffer); kfree(cli); - vinstr_ctx->nclients--; } KBASE_DEBUG_ASSERT(!vinstr_ctx->nclients); + KBASE_DEBUG_ASSERT(!vinstr_ctx->nclients_suspended); if (vinstr_ctx->kctx) kbasep_vinstr_destroy_kctx(vinstr_ctx); kfree(vinstr_ctx); } int kbase_vinstr_hwcnt_reader_setup(struct kbase_vinstr_context *vinstr_ctx, - struct kbase_uk_hwcnt_reader_setup *setup) + struct kbase_ioctl_hwcnt_reader_setup *setup) { struct kbase_vinstr_client *cli; u32 bitmap[4]; + int fd; KBASE_DEBUG_ASSERT(vinstr_ctx); KBASE_DEBUG_ASSERT(setup); @@ -1851,31 +1982,32 @@ int kbase_vinstr_hwcnt_reader_setup(struct kbase_vinstr_context *vinstr_ctx, vinstr_ctx, setup->buffer_count, bitmap, - &setup->fd, + &fd, NULL); if (!cli) return -ENOMEM; - return 0; + kbase_vinstr_wait_for_ready(vinstr_ctx); + return fd; } int kbase_vinstr_legacy_hwc_setup( struct kbase_vinstr_context *vinstr_ctx, struct kbase_vinstr_client **cli, - struct kbase_uk_hwcnt_setup *setup) + struct kbase_ioctl_hwcnt_enable *enable) { KBASE_DEBUG_ASSERT(vinstr_ctx); - KBASE_DEBUG_ASSERT(setup); + KBASE_DEBUG_ASSERT(enable); KBASE_DEBUG_ASSERT(cli); - if (setup->dump_buffer) { + if (enable->dump_buffer) { u32 bitmap[4]; - bitmap[SHADER_HWCNT_BM] = setup->shader_bm; - bitmap[TILER_HWCNT_BM] = setup->tiler_bm; - bitmap[MMU_L2_HWCNT_BM] = setup->mmu_l2_bm; - bitmap[JM_HWCNT_BM] = setup->jm_bm; + bitmap[SHADER_HWCNT_BM] = enable->shader_bm; + bitmap[TILER_HWCNT_BM] = enable->tiler_bm; + bitmap[MMU_L2_HWCNT_BM] = enable->mmu_l2_bm; + bitmap[JM_HWCNT_BM] = enable->jm_bm; if (*cli) return -EBUSY; @@ -1884,11 +2016,13 @@ int kbase_vinstr_legacy_hwc_setup( vinstr_ctx, 0, bitmap, - (void *)(long)setup->dump_buffer, + (void *)(uintptr_t)enable->dump_buffer, NULL); if (!(*cli)) return -ENOMEM; + + kbase_vinstr_wait_for_ready(vinstr_ctx); } else { if (!*cli) return -EINVAL; @@ -1902,9 +2036,10 @@ int kbase_vinstr_legacy_hwc_setup( struct kbase_vinstr_client *kbase_vinstr_hwcnt_kernel_setup( struct kbase_vinstr_context *vinstr_ctx, - struct kbase_uk_hwcnt_reader_setup *setup, + struct kbase_ioctl_hwcnt_reader_setup *setup, void *kernel_buffer) { + struct kbase_vinstr_client *kernel_client; u32 bitmap[4]; if (!vinstr_ctx || !setup || !kernel_buffer) @@ -1915,12 +2050,17 @@ struct kbase_vinstr_client *kbase_vinstr_hwcnt_kernel_setup( bitmap[MMU_L2_HWCNT_BM] = setup->mmu_l2_bm; bitmap[JM_HWCNT_BM] = setup->jm_bm; - return kbasep_vinstr_attach_client( - vinstr_ctx, - 0, - bitmap, - NULL, - kernel_buffer); + kernel_client = kbasep_vinstr_attach_client( + vinstr_ctx, + 0, + bitmap, + NULL, + kernel_buffer); + + if (kernel_client) + kbase_vinstr_wait_for_ready(vinstr_ctx); + + return kernel_client; } KBASE_EXPORT_TEST_API(kbase_vinstr_hwcnt_kernel_setup); @@ -2028,13 +2168,42 @@ int kbase_vinstr_try_suspend(struct kbase_vinstr_context *vinstr_ctx) vinstr_ctx->state = VINSTR_SUSPENDING; break; + case VINSTR_RESUMING: + vinstr_ctx->need_suspend = true; + break; + case VINSTR_SUSPENDING: - /* fall through */ + break; + + default: + KBASE_DEBUG_ASSERT(0); + break; + } + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); + + return ret; +} + +static int kbase_vinstr_is_ready(struct kbase_vinstr_context *vinstr_ctx) +{ + unsigned long flags; + int ret = -EAGAIN; + + KBASE_DEBUG_ASSERT(vinstr_ctx); + + spin_lock_irqsave(&vinstr_ctx->state_lock, flags); + switch (vinstr_ctx->state) { + case VINSTR_SUSPENDED: case VINSTR_RESUMING: + case VINSTR_SUSPENDING: break; + case VINSTR_IDLE: + case VINSTR_DUMPING: + ret = 0; + break; default: - BUG(); + KBASE_DEBUG_ASSERT(0); break; } spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); @@ -2048,6 +2217,58 @@ void kbase_vinstr_suspend(struct kbase_vinstr_context *vinstr_ctx) (0 == kbase_vinstr_try_suspend(vinstr_ctx))); } +void kbase_vinstr_wait_for_ready(struct kbase_vinstr_context *vinstr_ctx) +{ + wait_event(vinstr_ctx->suspend_waitq, + (0 == kbase_vinstr_is_ready(vinstr_ctx))); +} +KBASE_EXPORT_TEST_API(kbase_vinstr_wait_for_ready); + +/** + * kbase_vinstr_update_suspend - Update vinstr suspend/resume status depending + * on nclients + * @vinstr_ctx: vinstr context pointer + * + * This function should be called whenever vinstr_ctx->nclients changes. This + * may cause vinstr to be suspended or resumed, depending on the number of + * clients and whether IPA is suspended or not. + */ +static void kbase_vinstr_update_suspend(struct kbase_vinstr_context *vinstr_ctx) +{ + lockdep_assert_held(&vinstr_ctx->state_lock); + + switch (vinstr_ctx->state) { + case VINSTR_SUSPENDED: + if ((vinstr_ctx->nclients) && (0 == vinstr_ctx->suspend_cnt)) { + vinstr_ctx->state = VINSTR_RESUMING; + schedule_work(&vinstr_ctx->resume_work); + } + break; + + case VINSTR_SUSPENDING: + if (vinstr_ctx->nclients) + vinstr_ctx->need_resume = true; + break; + + case VINSTR_IDLE: + if (!vinstr_ctx->nclients) { + vinstr_ctx->state = VINSTR_SUSPENDING; + schedule_work(&vinstr_ctx->suspend_work); + } + break; + + case VINSTR_DUMPING: + if (!vinstr_ctx->nclients) + vinstr_ctx->state = VINSTR_SUSPENDING; + break; + + case VINSTR_RESUMING: + if (!vinstr_ctx->nclients) + vinstr_ctx->need_suspend = true; + break; + } +} + void kbase_vinstr_resume(struct kbase_vinstr_context *vinstr_ctx) { unsigned long flags; @@ -2070,3 +2291,45 @@ void kbase_vinstr_resume(struct kbase_vinstr_context *vinstr_ctx) } spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); } + +void kbase_vinstr_suspend_client(struct kbase_vinstr_client *client) +{ + struct kbase_vinstr_context *vinstr_ctx = client->vinstr_ctx; + unsigned long flags; + + spin_lock_irqsave(&vinstr_ctx->state_lock, flags); + + if (!client->suspended) { + list_del(&client->list); + list_add(&client->list, &vinstr_ctx->suspended_clients); + + vinstr_ctx->nclients--; + vinstr_ctx->nclients_suspended++; + kbase_vinstr_update_suspend(vinstr_ctx); + + client->suspended = true; + } + + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); +} + +void kbase_vinstr_resume_client(struct kbase_vinstr_client *client) +{ + struct kbase_vinstr_context *vinstr_ctx = client->vinstr_ctx; + unsigned long flags; + + spin_lock_irqsave(&vinstr_ctx->state_lock, flags); + + if (client->suspended) { + list_del(&client->list); + list_add(&client->list, &vinstr_ctx->idle_clients); + + vinstr_ctx->nclients++; + vinstr_ctx->nclients_suspended--; + kbase_vinstr_update_suspend(vinstr_ctx); + + client->suspended = false; + } + + spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags); +} diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_vinstr.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_vinstr.h index 6207d25aef06ce..d32799f74084d7 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_vinstr.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_vinstr.h @@ -1,25 +1,30 @@ /* * - * (C) COPYRIGHT 2015-2016 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2015-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KBASE_VINSTR_H_ #define _KBASE_VINSTR_H_ -#include <mali_kbase.h> #include <mali_kbase_hwcnt_reader.h> +#include <mali_kbase_ioctl.h> /*****************************************************************************/ @@ -47,24 +52,24 @@ void kbase_vinstr_term(struct kbase_vinstr_context *vinstr_ctx); * @vinstr_ctx: vinstr context * @setup: reader's configuration * - * Return: zero on success + * Return: file descriptor on success and a (negative) error code otherwise */ int kbase_vinstr_hwcnt_reader_setup( struct kbase_vinstr_context *vinstr_ctx, - struct kbase_uk_hwcnt_reader_setup *setup); + struct kbase_ioctl_hwcnt_reader_setup *setup); /** * kbase_vinstr_legacy_hwc_setup - configure hw counters for dumping * @vinstr_ctx: vinstr context * @cli: pointer where to store pointer to new vinstr client structure - * @setup: hwc configuration + * @enable: hwc configuration * * Return: zero on success */ int kbase_vinstr_legacy_hwc_setup( struct kbase_vinstr_context *vinstr_ctx, struct kbase_vinstr_client **cli, - struct kbase_uk_hwcnt_setup *setup); + struct kbase_ioctl_hwcnt_enable *enable); /** * kbase_vinstr_hwcnt_kernel_setup - configure hw counters for kernel side @@ -73,13 +78,13 @@ int kbase_vinstr_legacy_hwc_setup( * @setup: reader's configuration * @kernel_buffer: pointer to dump buffer * - * setup->buffer_count and setup->fd are not used for kernel side clients. + * setup->buffer_count is not used for kernel side clients. * * Return: pointer to client structure, or NULL on failure */ struct kbase_vinstr_client *kbase_vinstr_hwcnt_kernel_setup( struct kbase_vinstr_context *vinstr_ctx, - struct kbase_uk_hwcnt_reader_setup *setup, + struct kbase_ioctl_hwcnt_reader_setup *setup, void *kernel_buffer); /** @@ -128,6 +133,16 @@ int kbase_vinstr_try_suspend(struct kbase_vinstr_context *vinstr_ctx); */ void kbase_vinstr_suspend(struct kbase_vinstr_context *vinstr_ctx); +/** + * kbase_vinstr_wait_for_ready - waits for the vinstr context to get ready + * @vinstr_ctx: vinstr context + * + * Function waits for the vinstr to become ready for dumping. It can be in the + * resuming state after the client was attached but the client currently expects + * that vinstr is ready for dumping immediately post attach. + */ +void kbase_vinstr_wait_for_ready(struct kbase_vinstr_context *vinstr_ctx); + /** * kbase_vinstr_resume - resumes operation of a given vinstr context * @vinstr_ctx: vinstr context @@ -151,5 +166,17 @@ size_t kbase_vinstr_dump_size(struct kbase_device *kbdev); */ void kbase_vinstr_detach_client(struct kbase_vinstr_client *cli); +/** + * kbase_vinstr_suspend_client - Suspend vinstr client + * @client: pointer to vinstr client + */ +void kbase_vinstr_suspend_client(struct kbase_vinstr_client *client); + +/** + * kbase_vinstr_resume_client - Resume vinstr client + * @client: pointer to vinstr client + */ +void kbase_vinstr_resume_client(struct kbase_vinstr_client *client); + #endif /* _KBASE_VINSTR_H_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_linux_kbase_trace.h b/drivers/gpu/arm/bifrost_for_linux/mali_linux_kbase_trace.h index 5d6b4021d626f8..da2ffaffccc733 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_linux_kbase_trace.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_linux_kbase_trace.h @@ -7,15 +7,20 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #if !defined(_TRACE_MALI_KBASE_H) || defined(TRACE_HEADER_MULTI_READ) #define _TRACE_MALI_KBASE_H diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_linux_trace.h b/drivers/gpu/arm/bifrost_for_linux/mali_linux_trace.h index 2be06a5527689c..0741dfcab575b6 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_linux_trace.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_linux_trace.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #if !defined(_TRACE_MALI_H) || defined(TRACE_HEADER_MULTI_READ) #define _TRACE_MALI_H diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_malisw.h b/drivers/gpu/arm/bifrost_for_linux/mali_malisw.h index 99452933eab480..f17bd5edf7e1e8 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_malisw.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_malisw.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * Kernel-wide include for common macros and types. */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_midg_coherency.h b/drivers/gpu/arm/bifrost_for_linux/mali_midg_coherency.h index a509cbd5f17598..29d5df38c92b16 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_midg_coherency.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_midg_coherency.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _MIDG_COHERENCY_H_ #define _MIDG_COHERENCY_H_ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_midg_regmap.h b/drivers/gpu/arm/bifrost_for_linux/mali_midg_regmap.h index 554ed8dcb3eb7f..180850069f2eb9 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_midg_regmap.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_midg_regmap.h @@ -1,20 +1,25 @@ /* * - * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2018 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _MIDGARD_REGMAP_H_ #define _MIDGARD_REGMAP_H_ @@ -29,8 +34,7 @@ #define GPU_CONTROL_REG(r) (GPU_CONTROL_BASE + (r)) #define GPU_ID 0x000 /* (RO) GPU and revision identifier */ #define L2_FEATURES 0x004 /* (RO) Level 2 cache features */ -#define SUSPEND_SIZE 0x008 /* (RO) Fixed-function suspend buffer - size */ +#define CORE_FEATURES 0x008 /* (RO) Shader Core Features */ #define TILER_FEATURES 0x00C /* (RO) Tiler Features */ #define MEM_FEATURES 0x010 /* (RO) Memory system features */ #define MMU_FEATURES 0x014 /* (RO) MMU features */ @@ -88,10 +92,14 @@ #define THREAD_MAX_WORKGROUP_SIZE 0x0A4 /* (RO) Maximum workgroup size */ #define THREAD_MAX_BARRIER_SIZE 0x0A8 /* (RO) Maximum threads waiting at a barrier */ #define THREAD_FEATURES 0x0AC /* (RO) Thread features */ +#define THREAD_TLS_ALLOC 0x310 /* (RO) Number of threads per core that + * TLS must be allocated for + */ #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)) @@ -557,6 +565,13 @@ #define L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_OCTANT (0x1 << L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_SHIFT) #define L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_QUARTER (0x2 << L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_SHIFT) #define L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_HALF (0x3 << L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_SHIFT) + +#define L2_MMU_CONFIG_3BIT_LIMIT_EXTERNAL_READS_SHIFT (12) +#define L2_MMU_CONFIG_3BIT_LIMIT_EXTERNAL_READS (0x7 << L2_MMU_CONFIG_LIMIT_EXTERNAL_READS_SHIFT) + +#define L2_MMU_CONFIG_3BIT_LIMIT_EXTERNAL_WRITES_SHIFT (15) +#define L2_MMU_CONFIG_3BIT_LIMIT_EXTERNAL_WRITES (0x7 << L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_SHIFT) + /* End L2_MMU_CONFIG register */ /* THREAD_* registers */ diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_timeline.h b/drivers/gpu/arm/bifrost_for_linux/mali_timeline.h index bd5f6614b6bb08..d0deeadf479fad 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_timeline.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_timeline.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #undef TRACE_SYSTEM #define TRACE_SYSTEM mali_timeline diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_uk.h b/drivers/gpu/arm/bifrost_for_linux/mali_uk.h index 841d03fb5873bf..961a4a5c63ebf7 100644 --- a/drivers/gpu/arm/bifrost_for_linux/mali_uk.h +++ b/drivers/gpu/arm/bifrost_for_linux/mali_uk.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_uk.h * Types and definitions that are common across OSs for both the user diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/Kconfig b/drivers/gpu/arm/bifrost_for_linux/platform/Kconfig index 38835d3d1531c7..ef9fb963ecf560 100644 --- a/drivers/gpu/arm/bifrost_for_linux/platform/Kconfig +++ b/drivers/gpu/arm/bifrost_for_linux/platform/Kconfig @@ -6,12 +6,18 @@ # 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/Kbuild b/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/Kbuild index d40d7982ff049c..ce637fbb5ef7af 100644 --- a/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/Kbuild +++ b/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/Kbuild @@ -6,12 +6,18 @@ # 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - mali_kbase-y += \ $(MALI_PLATFORM_DIR)/mali_kbase_config_devicetree.o \ diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_config_devicetree.c b/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_config_devicetree.c index 29ccc29e412543..ccefddf882fdc4 100644 --- a/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_config_devicetree.c +++ b/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_config_devicetree.c @@ -7,22 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase_config.h> -int kbase_platform_early_init(void) -{ - /* Nothing needed at this stage */ - return 0; -} - static struct kbase_platform_config dummy_platform_config; struct kbase_platform_config *kbase_get_platform_config(void) @@ -30,6 +29,7 @@ struct kbase_platform_config *kbase_get_platform_config(void) return &dummy_platform_config; } +#ifndef CONFIG_OF int kbase_platform_register(void) { return 0; @@ -38,3 +38,4 @@ int kbase_platform_register(void) void kbase_platform_unregister(void) { } +#endif diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_config_platform.h index 2ceca34945b956..5990313308fae9 100644 --- a/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_config_platform.h +++ b/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_config_platform.h @@ -7,52 +7,18 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - */ - - - -/** - * Maximum frequency GPU will be clocked at. Given in kHz. - * This must be specified as there is no default value. - * - * Attached value: number in kHz - * Default value: NA - */ -#define GPU_FREQ_KHZ_MAX (5000) -/** - * Minimum frequency GPU will be clocked at. Given in kHz. - * This must be specified as there is no default value. - * - * Attached value: number in kHz - * Default value: NA - */ -#define GPU_FREQ_KHZ_MIN (5000) - -/** - * CPU_SPEED_FUNC - A pointer to a function that calculates the CPU clock - * - * CPU clock speed of the platform is in MHz - see kbase_cpu_clk_speed_func - * for the function prototype. - * - * Attached value: A kbase_cpu_clk_speed_func. - * Default Value: NA - */ -#define CPU_SPEED_FUNC (NULL) - -/** - * GPU_SPEED_FUNC - A pointer to a function that calculates the GPU clock + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. * - * GPU clock speed of the platform in MHz - see kbase_gpu_clk_speed_func - * for the function prototype. + * SPDX-License-Identifier: GPL-2.0 * - * Attached value: A kbase_gpu_clk_speed_func. - * Default Value: NA */ -#define GPU_SPEED_FUNC (NULL) /** * Power management configuration diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_runtime_pm.c b/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_runtime_pm.c index 9fe37c8d835ec4..c5f3ad70f43850 100644 --- a/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_runtime_pm.c +++ b/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_runtime_pm.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <mali_kbase.h> #include <mali_kbase_defs.h> #include <linux/pm_runtime.h> @@ -50,7 +55,8 @@ static void pm_callback_power_off(struct kbase_device *kbdev) pm_runtime_put_autosuspend(kbdev->dev); } -int kbase_device_runtime_init(struct kbase_device *kbdev) +#ifdef KBASE_PM_RUNTIME +static int kbase_device_runtime_init(struct kbase_device *kbdev) { int ret = 0; @@ -70,11 +76,12 @@ int kbase_device_runtime_init(struct kbase_device *kbdev) return ret; } -void kbase_device_runtime_disable(struct kbase_device *kbdev) +static void kbase_device_runtime_disable(struct kbase_device *kbdev) { dev_dbg(kbdev->dev, "kbase_device_runtime_disable\n"); pm_runtime_disable(kbdev->dev); } +#endif static int pm_callback_runtime_on(struct kbase_device *kbdev) { diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/rk/mali_kbase_config_rk.c b/drivers/gpu/arm/bifrost_for_linux/platform/rk/mali_kbase_config_rk.c index 926c2dd3f8c94b..e7fa0c84dc916b 100755 --- a/drivers/gpu/arm/bifrost_for_linux/platform/rk/mali_kbase_config_rk.c +++ b/drivers/gpu/arm/bifrost_for_linux/platform/rk/mali_kbase_config_rk.c @@ -14,6 +14,7 @@ #include <mali_kbase_defs.h> #include <mali_kbase_config.h> #include <backend/gpu/mali_kbase_pm_internal.h> +#include <backend/gpu/mali_kbase_pm_defs.h> #include <linux/pm_runtime.h> #include <linux/suspend.h> @@ -26,29 +27,6 @@ #include "mali_kbase_rk.h" -#define MAX_PROP_NAME_LEN 3 -#define LEAKAGE_TABLE_END ~1 -#define LEAKAGE_INVALID 0xff - -struct pvtm_config { - unsigned int freq; - unsigned int volt; - unsigned int ch[2]; - unsigned int sample_time; - unsigned int num; - unsigned int err; - unsigned int ref_temp; - int temp_prop[2]; - const char *tz_name; - struct thermal_zone_device *tz; -}; - -struct volt_sel_table { - int min; - int max; - int sel; -}; - /** * @file mali_kbase_config_rk.c * 对 platform_config_of_rk 的具体实现. @@ -399,22 +377,25 @@ static ssize_t utilisation_show(struct device *dev, struct rk_context *platform = get_rk_context(kbdev); ssize_t ret = 0; unsigned long period_in_us = platform->utilisation_period * 1000; - unsigned long total_time; - unsigned long busy_time; - unsigned long utilisation; - - kbase_pm_reset_dvfs_utilisation(kbdev); + u32 utilisation; + struct kbasep_pm_metrics metrics_when_start; + struct kbasep_pm_metrics metrics_diff; /* between start and end. */ + u32 total_time = 0; + u32 busy_time = 0; + + /* get current metrics data. */ + kbase_pm_get_dvfs_metrics(kbdev, &metrics_when_start, &metrics_diff); + /* sleep for 'period_in_us'. */ usleep_range(period_in_us, period_in_us + 100); - kbase_pm_get_dvfs_utilisation(kbdev, &total_time, &busy_time); - /* 'devfreq_dev_profile' instance registered to devfreq - * also uses kbase_pm_reset_dvfs_utilisation - * and kbase_pm_get_dvfs_utilisation. - * it's better to cat this file when DVFS is disabled. - */ - D("total_time : %lu, busy_time : %lu.", total_time, busy_time); + /* get metrics data between start and end. */ + kbase_pm_get_dvfs_metrics(kbdev, &metrics_when_start, &metrics_diff); + + total_time = metrics_diff.time_busy + metrics_diff.time_idle; + busy_time = metrics_diff.time_busy; + D("total_time : %u, busy_time : %u.", total_time, busy_time); utilisation = busy_time * 100 / total_time; - ret += snprintf(buf, PAGE_SIZE, "%ld\n", utilisation); + ret += snprintf(buf, PAGE_SIZE, "%d\n", utilisation); return ret; } diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/Kbuild b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/Kbuild index d9d5e90852317c..6780e4c9433b76 100644 --- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/Kbuild +++ b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/Kbuild @@ -6,14 +6,19 @@ # 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - mali_kbase-y += \ $(MALI_PLATFORM_DIR)/mali_kbase_config_vexpress.o \ - $(MALI_PLATFORM_DIR)/mali_kbase_cpu_vexpress.o \ mali_kbase_platform_fake.o diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_config_platform.h index 02835f129aa33a..fac3cd52182ffd 100644 --- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_config_platform.h +++ b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_config_platform.h @@ -7,54 +7,18 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - */ - - - -#include "mali_kbase_cpu_vexpress.h" - -/** - * Maximum frequency GPU will be clocked at. Given in kHz. - * This must be specified as there is no default value. - * - * Attached value: number in kHz - * Default value: NA - */ -#define GPU_FREQ_KHZ_MAX kbase_get_platform_max_freq() -/** - * Minimum frequency GPU will be clocked at. Given in kHz. - * This must be specified as there is no default value. - * - * Attached value: number in kHz - * Default value: NA - */ -#define GPU_FREQ_KHZ_MIN kbase_get_platform_min_freq() - -/** - * CPU_SPEED_FUNC - A pointer to a function that calculates the CPU clock - * - * CPU clock speed of the platform is in MHz - see kbase_cpu_clk_speed_func - * for the function prototype. - * - * Attached value: A kbase_cpu_clk_speed_func. - * Default Value: NA - */ -#define CPU_SPEED_FUNC (&kbase_get_vexpress_cpu_clock_speed) - -/** - * GPU_SPEED_FUNC - A pointer to a function that calculates the GPU clock + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. * - * GPU clock speed of the platform in MHz - see kbase_gpu_clk_speed_func - * for the function prototype. + * SPDX-License-Identifier: GPL-2.0 * - * Attached value: A kbase_gpu_clk_speed_func. - * Default Value: NA */ -#define GPU_SPEED_FUNC (NULL) /** * Power management configuration diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_config_vexpress.c b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_config_vexpress.c index 15ce2bc5eea5ee..d165ce2628148d 100644 --- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_config_vexpress.c +++ b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_config_vexpress.c @@ -1,31 +1,33 @@ /* * - * (C) COPYRIGHT 2011-2016 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2011-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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <linux/ioport.h> #include <mali_kbase.h> #include <mali_kbase_defs.h> #include <mali_kbase_config.h> -#include "mali_kbase_cpu_vexpress.h" #include "mali_kbase_config_platform.h" -#define HARD_RESET_AT_POWER_OFF 0 - #ifndef CONFIG_OF static struct kbase_io_resources io_resources = { .job_irq_number = 68, @@ -46,17 +48,6 @@ static int pm_callback_power_on(struct kbase_device *kbdev) static void pm_callback_power_off(struct kbase_device *kbdev) { -#if HARD_RESET_AT_POWER_OFF - /* Cause a GPU hard reset to test whether we have actually idled the GPU - * and that we properly reconfigure the GPU on power up. - * Usually this would be dangerous, but if the GPU is working correctly it should - * be completely safe as the GPU should not be active at this point. - * However this is disabled normally because it will most likely interfere with - * bus logging etc. - */ - KBASE_TRACE_ADD(kbdev, CORE_GPU_HARD_RESET, NULL, NULL, 0u, 0); - kbase_os_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND), GPU_COMMAND_HARD_RESET); -#endif } struct kbase_pm_callback_conf pm_callbacks = { @@ -76,10 +67,3 @@ struct kbase_platform_config *kbase_get_platform_config(void) { return &versatile_platform_config; } - - -int kbase_platform_early_init(void) -{ - /* Nothing needed at this stage */ - return 0; -} diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/Kbuild b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/Kbuild index df87c74f43baf3..51b408efd48ada 100644 --- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/Kbuild +++ b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/Kbuild @@ -6,12 +6,18 @@ # 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - mali_kbase-y += \ $(MALI_PLATFORM_DIR)/mali_kbase_config_vexpress.o \ diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/mali_kbase_config_platform.h index 0efbf3962f984c..fac3cd52182ffd 100644 --- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/mali_kbase_config_platform.h +++ b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/mali_kbase_config_platform.h @@ -7,52 +7,18 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - */ - - - -/** - * Maximum frequency GPU will be clocked at. Given in kHz. - * This must be specified as there is no default value. - * - * Attached value: number in kHz - * Default value: NA - */ -#define GPU_FREQ_KHZ_MAX 5000 -/** - * Minimum frequency GPU will be clocked at. Given in kHz. - * This must be specified as there is no default value. - * - * Attached value: number in kHz - * Default value: NA - */ -#define GPU_FREQ_KHZ_MIN 5000 - -/** - * CPU_SPEED_FUNC - A pointer to a function that calculates the CPU clock - * - * CPU clock speed of the platform is in MHz - see kbase_cpu_clk_speed_func - * for the function prototype. - * - * Attached value: A kbase_cpu_clk_speed_func. - * Default Value: NA - */ -#define CPU_SPEED_FUNC (&kbase_cpuprops_get_default_clock_speed) - -/** - * GPU_SPEED_FUNC - A pointer to a function that calculates the GPU clock + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. * - * GPU clock speed of the platform in MHz - see kbase_gpu_clk_speed_func - * for the function prototype. + * SPDX-License-Identifier: GPL-2.0 * - * Attached value: A kbase_gpu_clk_speed_func. - * Default Value: NA */ -#define GPU_SPEED_FUNC (NULL) /** * Power management configuration diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/mali_kbase_config_vexpress.c b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/mali_kbase_config_vexpress.c index 3ff0930fb4a3c9..efca0a5b3493b5 100644 --- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/mali_kbase_config_vexpress.c +++ b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/mali_kbase_config_vexpress.c @@ -1,27 +1,30 @@ /* * - * (C) COPYRIGHT 2011-2014 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2011-2014, 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <linux/ioport.h> #include <mali_kbase.h> #include <mali_kbase_defs.h> #include <mali_kbase_config.h> -#define HARD_RESET_AT_POWER_OFF 0 - #ifndef CONFIG_OF static struct kbase_io_resources io_resources = { .job_irq_number = 68, @@ -41,17 +44,6 @@ static int pm_callback_power_on(struct kbase_device *kbdev) static void pm_callback_power_off(struct kbase_device *kbdev) { -#if HARD_RESET_AT_POWER_OFF - /* Cause a GPU hard reset to test whether we have actually idled the GPU - * and that we properly reconfigure the GPU on power up. - * Usually this would be dangerous, but if the GPU is working correctly it should - * be completely safe as the GPU should not be active at this point. - * However this is disabled normally because it will most likely interfere with - * bus logging etc. - */ - KBASE_TRACE_ADD(kbdev, CORE_GPU_HARD_RESET, NULL, NULL, 0u, 0); - kbase_os_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND), GPU_COMMAND_HARD_RESET); -#endif } struct kbase_pm_callback_conf pm_callbacks = { @@ -71,9 +63,3 @@ struct kbase_platform_config *kbase_get_platform_config(void) { return &versatile_platform_config; } - -int kbase_platform_early_init(void) -{ - /* Nothing needed at this stage */ - return 0; -} diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/Kbuild b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/Kbuild index d9d5e90852317c..e07709c9b1a523 100644 --- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/Kbuild +++ b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/Kbuild @@ -6,12 +6,18 @@ # 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - mali_kbase-y += \ $(MALI_PLATFORM_DIR)/mali_kbase_config_vexpress.o \ diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_platform.h index dbdf21e009f994..fac3cd52182ffd 100644 --- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_platform.h +++ b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_platform.h @@ -7,54 +7,18 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - */ - - - -#include "mali_kbase_cpu_vexpress.h" - -/** - * Maximum frequency GPU will be clocked at. Given in kHz. - * This must be specified as there is no default value. - * - * Attached value: number in kHz - * Default value: NA - */ -#define GPU_FREQ_KHZ_MAX 10000 -/** - * Minimum frequency GPU will be clocked at. Given in kHz. - * This must be specified as there is no default value. - * - * Attached value: number in kHz - * Default value: NA - */ -#define GPU_FREQ_KHZ_MIN 10000 - -/** - * CPU_SPEED_FUNC - A pointer to a function that calculates the CPU clock - * - * CPU clock speed of the platform is in MHz - see kbase_cpu_clk_speed_func - * for the function prototype. - * - * Attached value: A kbase_cpu_clk_speed_func. - * Default Value: NA - */ -#define CPU_SPEED_FUNC (&kbase_get_vexpress_cpu_clock_speed) - -/** - * GPU_SPEED_FUNC - A pointer to a function that calculates the GPU clock + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. * - * GPU clock speed of the platform in MHz - see kbase_gpu_clk_speed_func - * for the function prototype. + * SPDX-License-Identifier: GPL-2.0 * - * Attached value: A kbase_gpu_clk_speed_func. - * Default Value: NA */ -#define GPU_SPEED_FUNC (NULL) /** * Power management configuration diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_vexpress.c b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_vexpress.c index 76ffe4a1e59ea2..b6714b95b77658 100644 --- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_vexpress.c +++ b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_vexpress.c @@ -1,29 +1,31 @@ /* * - * (C) COPYRIGHT 2011-2014 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2011-2014, 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <linux/ioport.h> #include <mali_kbase.h> #include <mali_kbase_defs.h> #include <mali_kbase_config.h> -#include "mali_kbase_cpu_vexpress.h" - -#define HARD_RESET_AT_POWER_OFF 0 #ifndef CONFIG_OF static struct kbase_io_resources io_resources = { @@ -44,17 +46,6 @@ static int pm_callback_power_on(struct kbase_device *kbdev) static void pm_callback_power_off(struct kbase_device *kbdev) { -#if HARD_RESET_AT_POWER_OFF - /* Cause a GPU hard reset to test whether we have actually idled the GPU - * and that we properly reconfigure the GPU on power up. - * Usually this would be dangerous, but if the GPU is working correctly it should - * be completely safe as the GPU should not be active at this point. - * However this is disabled normally because it will most likely interfere with - * bus logging etc. - */ - KBASE_TRACE_ADD(kbdev, CORE_GPU_HARD_RESET, NULL, NULL, 0u, 0); - kbase_os_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND), GPU_COMMAND_HARD_RESET); -#endif } struct kbase_pm_callback_conf pm_callbacks = { @@ -74,10 +65,3 @@ struct kbase_platform_config *kbase_get_platform_config(void) { return &versatile_platform_config; } - -int kbase_platform_early_init(void) -{ - /* Nothing needed at this stage */ - return 0; -} - diff --git a/drivers/gpu/arm/bifrost_for_linux/platform_dummy/mali_ukk_os.h b/drivers/gpu/arm/bifrost_for_linux/platform_dummy/mali_ukk_os.h index 5fa9b39c4bc0f1..ef1ec708edef00 100644 --- a/drivers/gpu/arm/bifrost_for_linux/platform_dummy/mali_ukk_os.h +++ b/drivers/gpu/arm/bifrost_for_linux/platform_dummy/mali_ukk_os.h @@ -7,16 +7,21 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /** * @file mali_ukk_os.h * Types and definitions that are common for Linux OSs for the kernel side of the diff --git a/drivers/gpu/arm/bifrost_for_linux/protected_mode_switcher.h b/drivers/gpu/arm/bifrost_for_linux/protected_mode_switcher.h index 5dc2f3ba8cf625..8778d812aea007 100644 --- a/drivers/gpu/arm/bifrost_for_linux/protected_mode_switcher.h +++ b/drivers/gpu/arm/bifrost_for_linux/protected_mode_switcher.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _PROTECTED_MODE_SWITCH_H_ #define _PROTECTED_MODE_SWITCH_H_ diff --git a/drivers/gpu/arm/bifrost_for_linux/sconscript b/drivers/gpu/arm/bifrost_for_linux/sconscript index e738dd7a386902..4c38f2a070459d 100644 --- a/drivers/gpu/arm/bifrost_for_linux/sconscript +++ b/drivers/gpu/arm/bifrost_for_linux/sconscript @@ -1,17 +1,23 @@ # -# (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved. +# (C) COPYRIGHT 2010-2018 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - import sys Import('env') @@ -27,6 +33,7 @@ kbase_src = [ Glob('internal/*/*.c'), Glob('ipa/*.c'), Glob('platform/%s/*.c' % env['platform_config']), + Glob('thirdparty/*.c'), ] if env['platform_config']=='juno_soc': @@ -40,30 +47,17 @@ if Glob('#kernel/drivers/gpu/arm/midgard/tests/internal/src/mock') and env['unit make_args = env.kernel_get_config_defines(ret_list = True) + [ 'PLATFORM=%s' % env['platform'], - 'MALI_ERROR_INJECT_ON=%s' % env['error_inject'], 'MALI_KERNEL_TEST_API=%s' % env['debug'], 'MALI_UNIT_TEST=%s' % env['unit'], 'MALI_RELEASE_NAME=%s' % env['mali_release_name'], 'MALI_MOCK_TEST=%s' % mock_test, 'MALI_CUSTOMER_RELEASE=%s' % env['release'], - 'MALI_INSTRUMENTATION_LEVEL=%s' % env['instr'], 'MALI_COVERAGE=%s' % env['coverage'], ] kbase = env.BuildKernelModule('$STATIC_LIB_PATH/mali_kbase.ko', kbase_src, make_args = make_args) -# Add a dependency on kds.ko. -# Only necessary when KDS is not built into the kernel. -# -if env['os'] != 'android': - if not env.KernelConfigEnabled("CONFIG_KDS"): - env.Depends(kbase, '$STATIC_LIB_PATH/kds.ko') - -# need Module.symvers from ump.ko build -if int(env['ump']) == 1: - env.Depends(kbase, '$STATIC_LIB_PATH/ump.ko') - if 'smc_protected_mode_switcher' in env: env.Depends('$STATIC_LIB_PATH/mali_kbase.ko', '$STATIC_LIB_PATH/smc_protected_mode_switcher.ko') diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/Kbuild b/drivers/gpu/arm/bifrost_for_linux/tests/Kbuild index b4bed047343910..df16a77a7f66ea 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/Kbuild +++ b/drivers/gpu/arm/bifrost_for_linux/tests/Kbuild @@ -6,12 +6,18 @@ # 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - obj-$(CONFIG_MALI_KUTF) += kutf/ obj-$(CONFIG_MALI_IRQ_LATENCY) += mali_kutf_irq_test/ diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/Kconfig b/drivers/gpu/arm/bifrost_for_linux/tests/Kconfig index da0515c065de90..fa91aea4ac5c50 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/Kconfig +++ b/drivers/gpu/arm/bifrost_for_linux/tests/Kconfig @@ -6,12 +6,18 @@ # 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - source "drivers/gpu/arm/midgard/tests/kutf/Kconfig" source "drivers/gpu/arm/midgard/tests/mali_kutf_irq_test/Kconfig" diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/Mconfig b/drivers/gpu/arm/bifrost_for_linux/tests/Mconfig new file mode 100644 index 00000000000000..35f85139cf12ab --- /dev/null +++ b/drivers/gpu/arm/bifrost_for_linux/tests/Mconfig @@ -0,0 +1,22 @@ +# +# (C) COPYRIGHT 2018 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. +# + +config UNIT_TEST_KERNEL_MODULES + bool + default y if UNIT_TEST_CODE && BUILD_KERNEL_MODULES + default n + +config BUILD_IPA_TESTS + bool + default y if UNIT_TEST_KERNEL_MODULES && MALI_BIFROST_DEVFREQ + default n diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/build.bp b/drivers/gpu/arm/bifrost_for_linux/tests/build.bp new file mode 100644 index 00000000000000..28a756b16dc1ae --- /dev/null +++ b/drivers/gpu/arm/bifrost_for_linux/tests/build.bp @@ -0,0 +1,36 @@ +/* + * Copyright: + * ---------------------------------------------------------------------------- + * This confidential and proprietary software may be used only as authorized + * by a licensing agreement from ARM Limited. + * (C) COPYRIGHT 2018 ARM Limited, ALL RIGHTS RESERVED + * The entire notice above must be reproduced on all authorized copies and + * copies may only be made to the extent permitted by a licensing agreement + * from ARM Limited. + * ---------------------------------------------------------------------------- + */ + +bob_defaults { + name: "kernel_test_module_defaults", + defaults: ["mali_kbase_shared_config_defaults"], + include_dirs: [ + "kernel/drivers/gpu/arm", + "kernel/drivers/gpu/arm/midgard", + "kernel/drivers/gpu/arm/midgard/backend/gpu", + "kernel/drivers/gpu/arm/midgard/tests/include", + ], + extra_symbols: ["kutf"], +} + +subdirs = [ + "kutf", + "mali_kutf_irq_test", +] + +optional_subdirs = [ + "kutf_test", + "kutf_test_runner", + "mali_kutf_ipa_test", + "mali_kutf_ipa_unit_test", + "mali_kutf_vinstr_test", +] diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_helpers.h b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_helpers.h index 3f1dfc244d3096..15e168c2385b79 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_helpers.h +++ b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_helpers.h @@ -7,210 +7,71 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KERNEL_UTF_HELPERS_H_ #define _KERNEL_UTF_HELPERS_H_ /* kutf_helpers.h * Test helper functions for the kernel UTF test infrastructure. * - * This collection of helper functions are provided as 'stock' implementation - * helpers for certain features of kutf. Tests can implement common/boilerplate - * functionality using these, whilst still providing them the option of - * implementing completely custom functions themselves to use those kutf - * features. + * These functions provide methods for enqueuing/dequeuing lines of text sent + * by user space. They are used to implement the transfer of "userdata" from + * user space to kernel. */ #include <kutf/kutf_suite.h> -#include <kutf/kutf_mem.h> -#include <linux/wait.h> - -/** - * enum kutf_helper_textbuf_flag - flags for textbufs - * @KUTF_HELPER_TEXTBUF_FLAG_DYING: Test is dying, textbuf should not allow - * writes, nor block on empty. - */ -enum kutf_helper_textbuf_flag { - KUTF_HELPER_TEXTBUF_FLAG_DYING = (1u << 0), -}; /** - * struct kutf_helper_textbuf_line - Structure representing a line of text + * kutf_helper_input_dequeue() - Dequeue a line sent by user space + * @context: KUTF context + * @str_size: Pointer to an integer to receive the size of the string * - * The string itself is stored immediately after this. + * If no line is available then this function will wait (interruptibly) until + * a line is available. * - * @node: List node for the textbuf's textbuf_list - * @str_size: Length of the string buffer, including the \0 terminator - * @str: 'Flexible array' for the string representing the line + * Return: The line dequeued, ERR_PTR(-EINTR) if interrupted or NULL on end + * of data. */ -struct kutf_helper_textbuf_line { - struct list_head node; - int str_size; - char str[]; -}; +char *kutf_helper_input_dequeue(struct kutf_context *context, size_t *str_size); /** - * struct kutf_helper_textbuf - Structure to representing sequential lines of - * text - * @lock: mutex to hold whilst accessing the structure - * @nr_user_clients: Number of userspace clients connected via an open() - * call - * @mempool: mempool for allocating lines - * @scratchpad: scratch area for receiving text of size max_line_size - * @used_bytes: number of valid bytes in the scratchpad - * @prev_pos: Previous position userspace has accessed - * @prev_line_pos: Previous start of line position userspace has accessed - * @textbuf_list: List head to store all the lines of text - * @max_line_size: Maximum size in memory allowed for a line of text - * @max_nr_lines: Maximum number of lines permitted in this textbuf - * @nr_lines: Number of entries in textbuf_list - * @flags: Flags indicating state of the textbuf, using values - * from enum kutf_helper_textbuf_flag - * @user_opened_wq: Waitq for when there's at least one userspace client - * connected to the textbuf via an open() call - * @not_full_wq: Waitq for when the textbuf can be enqueued into/can - * consume data from userspace - * @not_empty_wq: Waitq for when the textbuf can be dequeued from/can - * produce data for userspace - */ - -struct kutf_helper_textbuf { - struct mutex lock; - int nr_user_clients; - struct kutf_mempool *mempool; - char *scratchpad; - int used_bytes; - loff_t prev_pos; - loff_t prev_line_pos; - struct list_head textbuf_list; - int max_line_size; - int max_nr_lines; - int nr_lines; - unsigned long flags; - wait_queue_head_t user_opened_wq; - wait_queue_head_t not_full_wq; - wait_queue_head_t not_empty_wq; - -}; - -/* stock callbacks for userspace to read from/write to the 'data' file as a - * textbuf */ -extern struct kutf_userdata_ops kutf_helper_textbuf_userdata_ops; - -/** - * kutf_helper_textbuf_init() - init a textbuf for use as a 'data' file - * consumer/producer - * @textbuf: textbuf to initialize - * @mempool: mempool to allocate from - * @max_line_size: maximum line size expected to/from userspace - * @max_nr_lines: maximum number of lines to expect to/from userspace - * - * Initialize a textbuf so that it can consume writes made to the 'data' file, - * and produce reads for userspace on the 'data' file. Tests may then read the - * lines written by userspace, or fill the buffer so it may be read back by - * userspace. - * - * The caller should write the @textbuf pointer into the kutf_context's - * userdata_producer_priv or userdata_consumer_priv member during fixture - * creation. + * kutf_helper_input_enqueue() - Enqueue a line sent by user space + * @context: KUTF context + * @str: The user space address of the line + * @size: The length in bytes of the string * - * Usually a test will have separate textbufs for userspace to write to and - * read from. Using the same one for both will echo back to the user what they - * are writing. + * This function will use copy_from_user to copy the string out of user space. + * The string need not be NULL-terminated (@size should not include the NULL + * termination). * - * Lines are understood as being separated by the '\n' character, but no '\n' - * characters will be observed by the test + * As a special case @str==NULL and @size==0 is valid to mark the end of input, + * but callers should use kutf_helper_input_enqueue_end_of_data() instead. * - * @max_line_size puts an upper bound on the size of lines in a textbuf, - * including the \0 terminator. Lines exceeding this will be truncated, - * effectively ignoring incoming data until the next '\n' - * - * Combining this with @max_nr_lines puts an upper bound on the size of the - * file read in - * - * Return: 0 on success, or negative value on error. + * Return: 0 on success, -EFAULT if the line cannot be copied from user space, + * -ENOMEM if out of memory. */ -int kutf_helper_textbuf_init(struct kutf_helper_textbuf *textbuf, - struct kutf_mempool *mempool, int max_line_size, - int max_nr_lines); +int kutf_helper_input_enqueue(struct kutf_context *context, + const char __user *str, size_t size); /** - * kutf_helper_textbuf_wait_for_user() - wait for userspace to open the 'data' - * file - * @textbuf: textbuf to wait on - * - * This can be used to synchronize with userspace so that subsequent calls to - * kutf_helper_textbuf_dequeue() and kutf_helper_textbuf_enqueue() should - * succeed. - * - * Waiting is done on a timeout. - * - * There is of course no guarantee that userspace will keep the file open after - * this, but any error in the dequeue/enqueue functions afterwards can be - * treated as such rather than "we're still waiting for userspace to begin" - * - * Return: 0 if waited successfully, -ETIMEDOUT if we exceeded the - * timeout, or some other negative value if there was an - * error during waiting. - */ - -int kutf_helper_textbuf_wait_for_user(struct kutf_helper_textbuf *textbuf); - - -/** - * kutf_helper_textbuf_dequeue() - dequeue a line from a textbuf - * @textbuf: textbuf dequeue a line as a string from - * @str_size: pointer to storage to receive the size of the string, - * which includes the '\0' terminator, or NULL if not - * required - * - * Dequeue (remove) a line from the start of the textbuf as a string, and - * return it. - * - * If no lines are available, then this will block until a line has been - * submitted. If a userspace client is not connected and there are no remaining - * lines, then this function returns NULL instead. - * - * The memory for the string comes from the kutf_mempool given during - * initialization of the textbuf, and shares the same lifetime as it. - * - * Return: pointer to the next line of the textbuf. NULL indicated - * all userspace clients disconnected. An error value to be - * checked with IS_ERR() family of functions if a signal or - * some other error occurred - */ -char *kutf_helper_textbuf_dequeue(struct kutf_helper_textbuf *textbuf, - int *str_size); - -/** - * kutf_helper_textbuf_enqueue() - enqueue a line to a textbuf - * @textbuf: textbuf to enqueue a line as a string to - * @enqueue_str: pointer to the string to enqueue to the textbuf - * @buf_max_size: maximum size of the buffer holding @enqueue_str - * - * Enqueue (add) a line to the end of a textbuf as a string. - * - * The caller should avoid placing '\n' characters in their strings, as these - * will not be split into multiple lines. - * - * A copy of the string will be made into the textbuf, so @enqueue_str can be - * freed immediately after if.the caller wishes to do so. - * - * If the maximum amount of lines has been reached, then this will block until - * a line has been removed to make space. If a userspace client is not - * connected and there is no space available, then this function returns - * -EBUSY. + * kutf_helper_input_enqueue_end_of_data() - Signal no more data is to be sent + * @context: KUTF context * - * Return: 0 on success, or negative value on error + * After this function has been called, kutf_helper_input_dequeue() will always + * return NULL. */ -int kutf_helper_textbuf_enqueue(struct kutf_helper_textbuf *textbuf, - char *enqueue_str, int buf_max_size); +void kutf_helper_input_enqueue_end_of_data(struct kutf_context *context); #endif /* _KERNEL_UTF_HELPERS_H_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_helpers_user.h b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_helpers_user.h index 759bf717c7cd58..3b1300e1ce6f7b 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_helpers_user.h +++ b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_helpers_user.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KERNEL_UTF_HELPERS_USER_H_ #define _KERNEL_UTF_HELPERS_USER_H_ @@ -80,18 +85,16 @@ enum kutf_helper_err { }; -/* textbuf Send named NAME=value pair, u64 value +/* Send named NAME=value pair, u64 value * * NAME must match [A-Z0-9_]\+ and can be up to MAX_VAL_NAME_LEN characters long * - * This is assuming the kernel-side test is using the 'textbuf' helpers - * * Any failure will be logged on the suite's current test fixture * * Returns 0 on success, non-zero on failure */ -int kutf_helper_textbuf_send_named_u64(struct kutf_context *context, - struct kutf_helper_textbuf *textbuf, char *val_name, u64 val); +int kutf_helper_send_named_u64(struct kutf_context *context, + const char *val_name, u64 val); /* Get the maximum length of a string that can be represented as a particular * NAME="value" pair without string-value truncation in the kernel's buffer @@ -101,53 +104,48 @@ int kutf_helper_textbuf_send_named_u64(struct kutf_context *context, * without having the string value truncated. Any string longer than this will * be truncated at some point during communication to this size. * - * The calculation is valid both for sending strings of val_str_len to kernel, - * and for receiving a string that was originally val_str_len from the kernel. - * - * It is assumed that valname is a valid name for - * kutf_test_helpers_textbuf_send_named_str(), and no checking will be made to + * It is assumed that val_name is a valid name for + * kutf_helper_send_named_str(), and no checking will be made to * ensure this. * * Returns the maximum string length that can be represented, or a negative * value if the NAME="value" encoding itself wouldn't fit in kern_buf_sz */ -int kutf_helper_textbuf_max_str_len_for_kern(char *val_name, int kern_buf_sz); +int kutf_helper_max_str_len_for_kern(const char *val_name, int kern_buf_sz); -/* textbuf Send named NAME="str" pair +/* Send named NAME="str" pair * * no escaping allowed in str. Any of the following characters will terminate * the string: '"' '\\' '\n' * * NAME must match [A-Z0-9_]\+ and can be up to MAX_VAL_NAME_LEN characters long * - * This is assuming the kernel-side test is using the 'textbuf' helpers - * * Any failure will be logged on the suite's current test fixture * * Returns 0 on success, non-zero on failure */ -int kutf_helper_textbuf_send_named_str(struct kutf_context *context, - struct kutf_helper_textbuf *textbuf, char *val_name, - char *val_str); +int kutf_helper_send_named_str(struct kutf_context *context, + const char *val_name, const char *val_str); -/* textbuf Receive named NAME=value pair +/* Receive named NAME=value pair * * This can receive u64 and string values - check named_val->type * * If you are not planning on dynamic handling of the named value's name and - * type, then kutf_test_helpers_textbuf_receive_check_val() is more useful as a + * type, then kutf_helper_receive_check_val() is more useful as a * convenience function. * * String members of named_val will come from memory allocated on the fixture's mempool * - * Returns 0 on success. Negative value on failure to receive from the 'data' + * Returns 0 on success. Negative value on failure to receive from the 'run' * file, positive value indicates an enum kutf_helper_err value for correct * reception of data but invalid parsing */ -int kutf_helper_textbuf_receive_named_val(struct kutf_helper_named_val *named_val, - struct kutf_helper_textbuf *textbuf); +int kutf_helper_receive_named_val( + struct kutf_context *context, + struct kutf_helper_named_val *named_val); -/* textbuf Receive and validate NAME=value pair +/* Receive and validate NAME=value pair * - * As with kutf_test_helpers_textbuf_receive_named_val, but validate that the + * As with kutf_helper_receive_named_val, but validate that the * name and type are as expected, as a convenience for a common pattern found * in tests. * @@ -168,9 +166,11 @@ int kutf_helper_textbuf_receive_named_val(struct kutf_helper_named_val *named_va * * The rationale behind this is that we'd prefer to continue the rest of the * test with failures propagated, rather than hitting a timeout */ -int kutf_helper_textbuf_receive_check_val(struct kutf_helper_named_val *named_val, - struct kutf_context *context, struct kutf_helper_textbuf *textbuf, - char *expect_val_name, enum kutf_helper_valtype expect_val_type); +int kutf_helper_receive_check_val( + struct kutf_helper_named_val *named_val, + struct kutf_context *context, + const char *expect_val_name, + enum kutf_helper_valtype expect_val_type); /* Output a named value to kmsg */ void kutf_helper_output_named_val(struct kutf_helper_named_val *named_val); diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_mem.h b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_mem.h index 584c9dd4bc138f..988559de1edf33 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_mem.h +++ b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_mem.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KERNEL_UTF_MEM_H_ #define _KERNEL_UTF_MEM_H_ diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_resultset.h b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_resultset.h index 1cc85f1b7a46ad..49ebeb4ec546fd 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_resultset.h +++ b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_resultset.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KERNEL_UTF_RESULTSET_H_ #define _KERNEL_UTF_RESULTSET_H_ @@ -42,7 +47,12 @@ * @KUTF_RESULT_FATAL: The test result failed with a fatal error. * @KUTF_RESULT_ABORT: The test result failed due to a non-UTF * assertion failure. - * @KUTF_RESULT_COUNT: The current number of possible status messages. + * @KUTF_RESULT_USERDATA: User data is ready to be read, + * this is not seen outside the kernel + * @KUTF_RESULT_USERDATA_WAIT: Waiting for user data to be sent, + * this is not seen outside the kernel + * @KUTF_RESULT_TEST_FINISHED: The test has finished, no more results will + * be produced. This is not seen outside kutf */ enum kutf_result_status { KUTF_RESULT_BENCHMARK = -3, @@ -57,7 +67,9 @@ enum kutf_result_status { KUTF_RESULT_FATAL = 5, KUTF_RESULT_ABORT = 6, - KUTF_RESULT_COUNT + KUTF_RESULT_USERDATA = 7, + KUTF_RESULT_USERDATA_WAIT = 8, + KUTF_RESULT_TEST_FINISHED = 9 }; /* The maximum size of a kutf_result_status result when @@ -68,6 +80,9 @@ enum kutf_result_status { #ifdef __KERNEL__ #include <kutf/kutf_mem.h> +#include <linux/wait.h> + +struct kutf_context; /** * struct kutf_result - Represents a single test result. @@ -81,41 +96,86 @@ struct kutf_result { const char *message; }; +/** + * KUTF_RESULT_SET_WAITING_FOR_INPUT - Test is waiting for user data + * + * This flag is set within a struct kutf_result_set whenever the test is blocked + * waiting for user data. Attempts to dequeue results when this flag is set + * will cause a dummy %KUTF_RESULT_USERDATA_WAIT result to be produced. This + * is used to output a warning message and end of file. + */ +#define KUTF_RESULT_SET_WAITING_FOR_INPUT 1 + +/** + * struct kutf_result_set - Represents a set of results. + * @results: List head of a struct kutf_result list for storing the results + * @waitq: Wait queue signalled whenever new results are added. + * @flags: Flags see %KUTF_RESULT_SET_WAITING_FOR_INPUT + */ +struct kutf_result_set { + struct list_head results; + wait_queue_head_t waitq; + int flags; +}; + /** * kutf_create_result_set() - Create a new result set * to which results can be added. * - * Return: The created resultset. + * Return: The created result set. */ struct kutf_result_set *kutf_create_result_set(void); /** - * kutf_add_result() - Add a result to the end of an existing resultset. + * kutf_add_result() - Add a result to the end of an existing result set. * - * @mempool: The memory pool to allocate the result storage from. - * @set: The resultset to add the result to. + * @context: The kutf context * @status: The result status to add. * @message: The result message to add. + * + * Return: 0 if the result is successfully added. -ENOMEM if allocation fails. */ -void kutf_add_result(struct kutf_mempool *mempool, struct kutf_result_set *set, +int kutf_add_result(struct kutf_context *context, enum kutf_result_status status, const char *message); /** - * kutf_remove_result() - Remove a result from the head of a resultset. - * @set: The resultset. + * kutf_remove_result() - Remove a result from the head of a result set. + * @set: The result set. + * + * This function will block until there is a result to read. The wait is + * interruptible, so this function will return with an ERR_PTR if interrupted. * - * Return: result or NULL if there are no further results in the resultset. + * Return: result or ERR_PTR if interrupted */ struct kutf_result *kutf_remove_result( struct kutf_result_set *set); /** - * kutf_destroy_result_set() - Free a previously created resultset. + * kutf_destroy_result_set() - Free a previously created result set. * * @results: The result set whose resources to free. */ void kutf_destroy_result_set(struct kutf_result_set *results); +/** + * kutf_set_waiting_for_input() - The test is waiting for userdata + * + * @set: The result set to update + * + * Causes the result set to always have results and return a fake + * %KUTF_RESULT_USERDATA_WAIT result. + */ +void kutf_set_waiting_for_input(struct kutf_result_set *set); + +/** + * kutf_clear_waiting_for_input() - The test is no longer waiting for userdata + * + * @set: The result set to update + * + * Cancels the effect of kutf_set_waiting_for_input() + */ +void kutf_clear_waiting_for_input(struct kutf_result_set *set); + #endif /* __KERNEL__ */ #endif /* _KERNEL_UTF_RESULTSET_H_ */ diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_suite.h b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_suite.h index cba2b2d84d62e0..8d75f506f9eb84 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_suite.h +++ b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_suite.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KERNEL_UTF_SUITE_H_ #define _KERNEL_UTF_SUITE_H_ @@ -27,10 +32,17 @@ */ #include <linux/kref.h> +#include <linux/workqueue.h> +#include <linux/wait.h> #include <kutf/kutf_mem.h> #include <kutf/kutf_resultset.h> +/* Arbitrary maximum size to prevent user space allocating too much kernel + * memory + */ +#define KUTF_MAX_LINE_LENGTH (1024u) + /** * Pseudo-flag indicating an absence of any specified test class. Note that * tests should not be annotated with this constant as it is simply a zero @@ -149,24 +161,42 @@ union kutf_callback_data { }; /** - * struct kutf_userdata_ops- Structure defining methods to exchange data - * with userspace via the 'data' file - * @open: Function used to notify when the 'data' file was opened - * @release: Function used to notify when the 'data' file was closed - * @notify_ended: Function used to notify when the test has ended. - * @consumer: Function used to consume writes from userspace - * @producer: Function used to produce data for userspace to read + * struct kutf_userdata_line - A line of user data to be returned to the user + * @node: struct list_head to link this into a list + * @str: The line of user data to return to user space + * @size: The number of bytes within @str + */ +struct kutf_userdata_line { + struct list_head node; + char *str; + size_t size; +}; + +/** + * KUTF_USERDATA_WARNING_OUTPUT - Flag specifying that a warning has been output * - * All ops can be NULL. - */ -struct kutf_userdata_ops { - int (*open)(void *priv); - void (*release)(void *priv); - void (*notify_ended)(void *priv); - ssize_t (*consumer)(void *priv, const char __user *userbuf, - size_t userbuf_len, loff_t *ppos); - ssize_t (*producer)(void *priv, char __user *userbuf, - size_t userbuf_len, loff_t *ppos); + * If user space reads the "run" file while the test is waiting for user data, + * then the framework will output a warning message and set this flag within + * struct kutf_userdata. A subsequent read will then simply return an end of + * file condition rather than outputting the warning again. The upshot of this + * is that simply running 'cat' on a test which requires user data will produce + * the warning followed by 'cat' exiting due to EOF - which is much more user + * friendly than blocking indefinitely waiting for user data. + */ +#define KUTF_USERDATA_WARNING_OUTPUT 1 + +/** + * struct kutf_userdata - Structure holding user data + * @flags: See %KUTF_USERDATA_WARNING_OUTPUT + * @input_head: List of struct kutf_userdata_line containing user data + * to be read by the kernel space test. + * @input_waitq: Wait queue signalled when there is new user data to be + * read by the kernel space test. + */ +struct kutf_userdata { + unsigned long flags; + struct list_head input_head; + wait_queue_head_t input_waitq; }; /** @@ -185,13 +215,8 @@ struct kutf_userdata_ops { * @status: The status of the currently running fixture. * @expected_status: The expected status on exist of the currently * running fixture. - * @userdata_consumer_priv: Parameter to pass into kutf_userdata_ops - * consumer function. Must not be NULL if a - * consumer function was specified - * @userdata_producer_priv: Parameter to pass into kutf_userdata_ops - * producer function. Must not be NULL if a - * producer function was specified - * @userdata_dentry: The debugfs file for userdata exchange + * @work: Work item to enqueue onto the work queue to run the test + * @userdata: Structure containing the user data for the test to read */ struct kutf_context { struct kref kref; @@ -205,9 +230,9 @@ struct kutf_context { struct kutf_result_set *result_set; enum kutf_result_status status; enum kutf_result_status expected_status; - void *userdata_consumer_priv; - void *userdata_producer_priv; - struct dentry *userdata_dentry; + + struct work_struct work; + struct kutf_userdata userdata; }; /** @@ -391,30 +416,6 @@ void kutf_add_test_with_filters_and_data( unsigned int filters, union kutf_callback_data test_data); -/** - * kutf_add_test_with_filters_data_and_userdata() - Add a test to a kernel test suite with filters and setup for - * receiving data from userside - * @suite: The suite to add the test to. - * @id: The ID of the test. - * @name: The name of the test. - * @execute: Callback to the test function to run. - * @filters: A set of filtering flags, assigning test categories. - * @test_data: Test specific callback data, provided during the - * running of the test in the kutf_context - * @userdata_ops: Callbacks to use for sending and receiving data to - * userspace. A copy of the struct kutf_userdata_ops is - * taken. Each callback can be NULL. - * - */ -void kutf_add_test_with_filters_data_and_userdata( - struct kutf_suite *suite, - unsigned int id, - const char *name, - void (*execute)(struct kutf_context *context), - unsigned int filters, - union kutf_callback_data test_data, - struct kutf_userdata_ops *userdata_ops); - /* ============================================================================ Test functions diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_utils.h b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_utils.h index c458c1f73802b3..25b8285500d7da 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_utils.h +++ b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_utils.h @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #ifndef _KERNEL_UTF_UTILS_H_ #define _KERNEL_UTF_UTILS_H_ diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Kbuild b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Kbuild index 97f80057224f93..2531d41ca28d66 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Kbuild +++ b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Kbuild @@ -6,12 +6,18 @@ # 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - ccflags-y += -I$(src)/../include diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Kconfig b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Kconfig index 6a87bdbf746e76..0cdb474c06a3a2 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Kconfig +++ b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Kconfig @@ -6,12 +6,18 @@ # 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - config MALI_KUTF diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Makefile b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Makefile index 010c92ca39b9fd..d848e8774bd08f 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Makefile +++ b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Makefile @@ -6,12 +6,18 @@ # 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - # linux build system bootstrap for out-of-tree module diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/build.bp b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/build.bp new file mode 100644 index 00000000000000..f6d4c3fc7e1576 --- /dev/null +++ b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/build.bp @@ -0,0 +1,31 @@ +/* + * Copyright: + * ---------------------------------------------------------------------------- + * This confidential and proprietary software may be used only as authorized + * by a licensing agreement from ARM Limited. + * (C) COPYRIGHT 2018 ARM Limited, ALL RIGHTS RESERVED + * The entire notice above must be reproduced on all authorized copies and + * copies may only be made to the extent permitted by a licensing agreement + * from ARM Limited. + * ---------------------------------------------------------------------------- + */ + +bob_kernel_module { + name: "kutf", + defaults: ["kernel_defaults"], + srcs: [ + "Kbuild", + "kutf_helpers.c", + "kutf_helpers_user.c", + "kutf_mem.c", + "kutf_resultset.c", + "kutf_suite.c", + "kutf_utils.c", + ], + kbuild_options: ["CONFIG_MALI_KUTF=m"], + include_dirs: ["kernel/drivers/gpu/arm/midgard/tests/include"], + enabled: false, + unit_test_kernel_modules: { + enabled: true, + }, +} diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_helpers.c b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_helpers.c index 793d58c789ffa1..cab5add6d93c64 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_helpers.c +++ b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_helpers.c @@ -7,19 +7,22 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* Kernel UTF test helpers */ #include <kutf/kutf_helpers.h> -/* 10s timeout for user thread to open the 'data' file once the test is started */ -#define USERDATA_WAIT_TIMEOUT_MS 10000 #include <linux/err.h> #include <linux/jiffies.h> #include <linux/sched.h> @@ -27,742 +30,100 @@ #include <linux/wait.h> #include <linux/uaccess.h> +static DEFINE_SPINLOCK(kutf_input_lock); -int kutf_helper_textbuf_init(struct kutf_helper_textbuf *textbuf, - struct kutf_mempool *mempool, int max_line_size, - int max_nr_lines) -{ - textbuf->scratchpad = kutf_mempool_alloc(mempool, max_line_size); - - if (!textbuf->scratchpad) - return -ENOMEM; - - mutex_init(&textbuf->lock); - textbuf->nr_user_clients = 0; - textbuf->mempool = mempool; - textbuf->used_bytes = 0; - textbuf->prev_pos = 0; - textbuf->prev_line_pos = 0; - INIT_LIST_HEAD(&textbuf->textbuf_list); - textbuf->max_line_size = max_line_size; - textbuf->max_nr_lines = max_nr_lines; - textbuf->nr_lines = 0; - textbuf->flags = 0ul; - init_waitqueue_head(&textbuf->user_opened_wq); - init_waitqueue_head(&textbuf->not_full_wq); - init_waitqueue_head(&textbuf->not_empty_wq); - - return 0; -} -EXPORT_SYMBOL(kutf_helper_textbuf_init); - -/** - * kutf_helper_textbuf_open() - Notify that userspace has opened the 'data' - * file for a textbuf - * - * @priv: private pointer from a kutf_userdata_exchange, which - * should be a pointer to a struct kutf_helper_textbuf - * - * Return: 0 on success, or negative value on error. - */ -static int kutf_helper_textbuf_open(void *priv) -{ - struct kutf_helper_textbuf *textbuf = priv; - int ret; - - ret = mutex_lock_interruptible(&textbuf->lock); - if (ret) - return -ERESTARTSYS; - - ++(textbuf->nr_user_clients); - wake_up(&textbuf->user_opened_wq); - - mutex_unlock(&textbuf->lock); - return ret; -} - -/** - * kutf_helper_textbuf_release() - Notify that userspace has closed the 'data' - * file for a textbuf - * - * @priv: private pointer from a kutf_userdata_exchange, which - * should be a pointer to a struct kutf_helper_textbuf - */ -static void kutf_helper_textbuf_release(void *priv) -{ - struct kutf_helper_textbuf *textbuf = priv; - - /* Shouldn't use interruptible variants here because if a signal is - * pending, we can't abort and restart the call */ - mutex_lock(&textbuf->lock); - - --(textbuf->nr_user_clients); - if (!textbuf->nr_user_clients) { - /* All clients disconnected, wakeup kernel-side waiters */ - wake_up(&textbuf->not_full_wq); - wake_up(&textbuf->not_empty_wq); - } - - mutex_unlock(&textbuf->lock); -} - -/** - * kutf_helper_textbuf_notify_test_ended() - Notify that the test has ended - * - * @priv: private pointer from a kutf_userdata_exchange, which - * should be a pointer to a struct kutf_helper_textbuf - * - * After this call, userspace should be allowed to finish remaining reads but - * not make new ones, and not be allowed to make new writes. - */ -static void kutf_helper_textbuf_notify_test_ended(void *priv) -{ - struct kutf_helper_textbuf *textbuf = priv; - - /* Shouldn't use interruptible variants here because if a signal is - * pending, we can't abort and restart the call */ - mutex_lock(&textbuf->lock); - - textbuf->flags |= KUTF_HELPER_TEXTBUF_FLAG_DYING; - - /* Consumers waiting due to being full should wake up and abort */ - wake_up(&textbuf->not_full_wq); - /* Producers waiting due to being empty should wake up and abort */ - wake_up(&textbuf->not_empty_wq); - - mutex_unlock(&textbuf->lock); -} - -/* Collect text in a textbuf scratchpad up to (but excluding) specified - * newline_off, and add it as a textbuf_line - * - * newline_off is permissible to be at the character after the end of the - * scratchpad (i.e. equal to textbuf->max_line_size), for handling when the - * line was longer than the size of the scratchpad. Nevertheless, the resulting - * size of the line is kept at textbuf->max_line_size, including the '\0' - * terminator. That is, the string length will be textbuf->max_line_size-1. - * - * Remaining characters strictly after newline_off are moved to the beginning - * of the scratchpad, to allow space for a longer line to be collected. This - * means the character specified at newline_off will be removed from/no longer - * be within the valid region of the scratchpad - * - * Returns number of bytes the scratchpad was shortened by, or an error - * otherwise - */ -static size_t collect_line(struct kutf_helper_textbuf *textbuf, int newline_off) -{ - /* '\n' terminator will be replaced as '\0' */ - int str_buf_size; - struct kutf_helper_textbuf_line *textbuf_line; - char *str_start; - int bytes_remain; - char *scratch = textbuf->scratchpad; - int nextline_off; - - str_buf_size = newline_off + 1; - if (str_buf_size > textbuf->max_line_size) - str_buf_size = textbuf->max_line_size; - - /* String is stored immediately after the line */ - textbuf_line = kutf_mempool_alloc(textbuf->mempool, str_buf_size + sizeof(struct kutf_helper_textbuf_line)); - if (!textbuf_line) - return -ENOMEM; - - str_start = &textbuf_line->str[0]; - - /* Copy in string, excluding the terminating '\n' character, replacing - * it with '\0' */ - strncpy(str_start, scratch, str_buf_size - 1); - str_start[str_buf_size-1] = '\0'; - textbuf_line->str_size = str_buf_size; - - /* Append to the textbuf */ - list_add_tail(&textbuf_line->node, &textbuf->textbuf_list); - ++(textbuf->nr_lines); - - /* Move the rest of the scratchpad to the start */ - nextline_off = newline_off + 1; - if (nextline_off > textbuf->used_bytes) - nextline_off = textbuf->used_bytes; - - bytes_remain = textbuf->used_bytes - nextline_off; - memmove(scratch, scratch + nextline_off, bytes_remain); - textbuf->used_bytes = bytes_remain; - - /* Wakeup anyone blocked on empty */ - wake_up(&textbuf->not_empty_wq); - - return nextline_off; -} - -/* Buffer size for truncating a string to its newline. - * Allocated on the stack, so keep it moderately small (within PAGE_SIZE) */ -#define TRUNCATE_BUF_SZ 512 - -/* Discard input from a userbuf up to a newline, then collect what was in the - * scratchpad into a new textbuf line */ -static ssize_t collect_longline_truncate(struct kutf_helper_textbuf *textbuf, - const char __user *userbuf, size_t userbuf_len) -{ - ssize_t bytes_processed = 0; - - while (userbuf_len > 0) { - int userbuf_copy_sz = userbuf_len; - size_t res; - char *newline_ptr; - char truncate_buf[TRUNCATE_BUF_SZ]; - - if (userbuf_len > TRUNCATE_BUF_SZ) - userbuf_copy_sz = TRUNCATE_BUF_SZ; - else - userbuf_copy_sz = (int)userbuf_len; - - /* copy what we can */ - res = copy_from_user(truncate_buf, userbuf, userbuf_copy_sz); - if (res == userbuf_copy_sz) - return -EFAULT; - userbuf_copy_sz -= res; - - /* Search for newline in what was copied */ - newline_ptr = strnchr(truncate_buf, userbuf_copy_sz, '\n'); - - if (newline_ptr) { - ssize_t sres; - /* Newline found: collect scratchpad and exit out */ - int newline_off = newline_ptr - truncate_buf; - - sres = collect_line(textbuf, textbuf->used_bytes); - if (sres < 0) - return sres; - - bytes_processed += newline_off + 1; - break; - } - - /* Newline not yet found: advance to the next part to copy */ - userbuf += userbuf_copy_sz; - userbuf_len -= userbuf_copy_sz; - bytes_processed += userbuf_copy_sz; - } - - return bytes_processed; -} - -/** - * kutf_helper_textbuf_consume() - 'data' file consumer function for writing to - * a textbuf - * @priv: private pointer from a kutf_userdata_exchange, which - * should be a pointer to a struct kutf_helper_textbuf to - * write into - * @userbuf: the userspace buffer to read from - * @userbuf_len: size of the userspace buffer - * @ppos: the current position in the buffer - * - * This consumer function is used as a write consumer for the 'data' file, - * receiving data that has been written to the 'data' file by userspace. It - * will read from the userspace buffer @userbuf and separates it into '\n' - * delimited lines for the textbuf pointed to by @priv . - * - * If there is insufficient space in textbuf, then it will block until there is - * space - for example, a kernel-side test calls - * kutf_helper_textbuf_dequeue(). Since this is expected to be called in the - * context of a syscall, the call can only be cancelled by sending an - * appropriate signal to the userspace process. - * - * The current position @ppos is advanced by the number of bytes successfully - * read. - * - * Return: the number of bytes read, or negative value on error. - */ -static ssize_t kutf_helper_textbuf_consume(void *priv, - const char __user *userbuf, size_t userbuf_len, loff_t *ppos) +static bool pending_input(struct kutf_context *context) { - struct kutf_helper_textbuf *textbuf = priv; - int userbuf_copy_sz; - char *next_newline_ptr; - size_t bytes_processed = 0; - int newdata_off; - ssize_t ret; - - ret = mutex_lock_interruptible(&textbuf->lock); - if (ret) - return -ERESTARTSYS; - - /* Validate input */ - if (*ppos < 0) { - ret = -EINVAL; - goto out_unlock; - } - if (!userbuf_len) { - ret = 0; - goto out_unlock; - } - - while (textbuf->nr_lines >= textbuf->max_nr_lines && - !(textbuf->flags & KUTF_HELPER_TEXTBUF_FLAG_DYING)) { - /* Block on kernel-side dequeue making space available - * NOTE: should also handle O_NONBLOCK */ - mutex_unlock(&textbuf->lock); - ret = wait_event_interruptible(textbuf->not_full_wq, - (textbuf->nr_lines < textbuf->max_nr_lines || - (textbuf->flags & KUTF_HELPER_TEXTBUF_FLAG_DYING))); - if (ret) - return -ERESTARTSYS; - ret = mutex_lock_interruptible(&textbuf->lock); - if (ret) - return -ERESTARTSYS; - } - - if (textbuf->flags & KUTF_HELPER_TEXTBUF_FLAG_DYING) { - ret = -ENODEV; - goto out_unlock; - } - - if (textbuf->prev_pos != *ppos && textbuf->used_bytes) { - /* Seeking causes a new line to occur: - * Truncate what data was there into a textbuf-line, and reset - * the buffer */ - ret = collect_line(textbuf, textbuf->used_bytes); - if (ret < 0) - goto finish; - } else if (textbuf->used_bytes >= (textbuf->max_line_size - 1)) { - /* Line too long discard input until we find a '\n' */ - ret = collect_longline_truncate(textbuf, userbuf, userbuf_len); - - if (ret < 0) - goto finish; - - /* Update userbuf with how much was processed, which may be the - * entire buffer now */ - userbuf += ret; - userbuf_len -= ret; - bytes_processed += ret; - - /* If there's buffer remaining and we fault later (e.g. can't - * read or OOM) ensure ppos is updated */ - *ppos += ret; - - /* recheck in case entire buffer processed */ - if (!userbuf_len) - goto finish; - } - - /* An extra line may've been added, ensure we don't overfill */ - if (textbuf->nr_lines >= textbuf->max_nr_lines) - goto finish_noerr; - - userbuf_copy_sz = userbuf_len; - - /* Copy in as much as we can */ - if (userbuf_copy_sz > textbuf->max_line_size - textbuf->used_bytes) - userbuf_copy_sz = textbuf->max_line_size - textbuf->used_bytes; - - ret = copy_from_user(textbuf->scratchpad + textbuf->used_bytes, userbuf, userbuf_copy_sz); - if (ret == userbuf_copy_sz) { - ret = -EFAULT; - goto finish; - } - userbuf_copy_sz -= ret; - - newdata_off = textbuf->used_bytes; - textbuf->used_bytes += userbuf_copy_sz; - - while (textbuf->used_bytes && textbuf->nr_lines < textbuf->max_nr_lines) { - int new_bytes_remain = textbuf->used_bytes - newdata_off; - /* Find a new line - only the new part should be checked */ - next_newline_ptr = strnchr(textbuf->scratchpad + newdata_off, new_bytes_remain, '\n'); - - if (next_newline_ptr) { - int newline_off = next_newline_ptr - textbuf->scratchpad; - - /* if found, collect up to it, then memmove the rest */ - /* reset positions and see if we can fill any further */ - /* repeat until run out of data or line is filled */ - ret = collect_line(textbuf, newline_off); + bool input_pending; - /* If filled up or OOM, rollback the remaining new - * data. Instead we'll try to grab it next time we're - * called */ - if (textbuf->nr_lines >= textbuf->max_nr_lines || ret < 0) - textbuf->used_bytes = newdata_off; + spin_lock(&kutf_input_lock); - if (ret < 0) - goto finish; + input_pending = !list_empty(&context->userdata.input_head); - /* Fix up ppos etc in case we'll be ending the loop */ - *ppos += ret - newdata_off; - bytes_processed += ret - newdata_off; - newdata_off = 0; - } else { - /* there's bytes left, but no new-line, so try to fill up next time */ - *ppos += new_bytes_remain; - bytes_processed += new_bytes_remain; - break; - } - } - -finish_noerr: - ret = bytes_processed; -finish: - textbuf->prev_pos = *ppos; -out_unlock: - mutex_unlock(&textbuf->lock); + spin_unlock(&kutf_input_lock); - return ret; + return input_pending; } -/** - * kutf_helper_textbuf_produce() - 'data' file producer function for reading - * from a textbuf - * @priv: private pointer from a kutf_userdata_exchange, which - * should be a pointer to a struct kutf_helper_textbuf to - * read from - * @userbuf: the userspace buffer to write to - * @userbuf_len: size of the userspace buffer - * @ppos: the current position in the buffer - * - * This producer function is used as a read producer for the 'data' file, - * allowing userspace to read from the 'data' file. It will write to the - * userspace buffer @userbuf, taking lines from the textbuf pointed to by - * @priv, separating each line with '\n'. - * - * If there is no data in the textbuf, then it will block until some appears - - * for example, a kernel-side test calls kutf_helper_textbuf_enqueue(). Since - * this is expected to be called in the context of a syscall, the call can only - * be cancelled by sending an appropriate signal to the userspace process. - * - * The current position @ppos is advanced by the number of bytes successfully - * written. - * - * Return: the number of bytes written, or negative value on error - */ -static ssize_t kutf_helper_textbuf_produce(void *priv, char __user *userbuf, - size_t userbuf_len, loff_t *ppos) +char *kutf_helper_input_dequeue(struct kutf_context *context, size_t *str_size) { - struct kutf_helper_textbuf *textbuf = priv; - loff_t pos_offset; - struct kutf_helper_textbuf_line *line = NULL; - int line_start_pos; - size_t bytes_processed = 0; - ssize_t ret; - int copy_length; - - ret = mutex_lock_interruptible(&textbuf->lock); - if (ret) - return -ERESTARTSYS; - - /* Validate input */ - if (*ppos < 0) { - ret = -EINVAL; - goto finish; - } - if (!userbuf_len) { - ret = 0; - goto finish; - } - - /* Seeking to before the beginning of the line will have the effect of - * resetting the position to the start of the current data, since we've - * already discarded previous data */ - if (*ppos < textbuf->prev_line_pos) - textbuf->prev_line_pos = *ppos; - - while (!line) { - int needs_wake = 0; - - pos_offset = *ppos - textbuf->prev_line_pos; - line_start_pos = 0; - - /* Find the line for the offset, emptying the textbuf as we go */ - while (!list_empty(&textbuf->textbuf_list)) { - int line_end_pos; + struct kutf_userdata_line *line; - line = list_first_entry(&textbuf->textbuf_list, struct kutf_helper_textbuf_line, node); + spin_lock(&kutf_input_lock); - /* str_size used in line_end_pos because lines implicitly have - * a '\n', but we count the '\0' string terminator as that */ - line_end_pos = line_start_pos + line->str_size; - - if (pos_offset < line_end_pos) - break; - - line_start_pos += line->str_size; - /* Only discard a line when we're sure it's finished - * with, to avoid awkward rollback conditions if we've - * had to block */ - list_del(&line->node); - --(textbuf->nr_lines); - line = NULL; - needs_wake = 1; - } + while (list_empty(&context->userdata.input_head)) { + int err; - /* Update the start of the line pos for next time we're called */ - textbuf->prev_line_pos += line_start_pos; + kutf_set_waiting_for_input(context->result_set); - /* If space was freed up, wake waiters */ - if (needs_wake) - wake_up(&textbuf->not_full_wq); -; - if (!line) { - /* Only check before waiting, to ensure if the test - * does the last enqueue and immediately finishes, then - * we'll go back round the loop to receive the line - * instead of just dying straight away */ - if (textbuf->flags & KUTF_HELPER_TEXTBUF_FLAG_DYING) { - /* Indicate EOF rather than an error */ - ret = 0; - goto finish; - } + spin_unlock(&kutf_input_lock); - /* No lines found, block for new ones - * NOTE: should also handle O_NONBLOCK */ - mutex_unlock(&textbuf->lock); - ret = wait_event_interruptible(textbuf->not_empty_wq, - (textbuf->nr_lines > 0 || - (textbuf->flags & KUTF_HELPER_TEXTBUF_FLAG_DYING))); + err = wait_event_interruptible(context->userdata.input_waitq, + pending_input(context)); - /* signals here are not restartable */ - if (ret) - return ret; - ret = mutex_lock_interruptible(&textbuf->lock); - if (ret) - return ret; - } + if (err) + return ERR_PTR(-EINTR); + spin_lock(&kutf_input_lock); } - - /* Find offset within the line, guaranteed to be within line->str_size */ - pos_offset -= line_start_pos; - - while (userbuf_len && line) { - /* Copy at most to the end of string, excluding terminator */ - copy_length = line->str_size - 1 - pos_offset; - if (copy_length > userbuf_len) - copy_length = userbuf_len; - - if (copy_length) { - ret = copy_to_user(userbuf, &line->str[pos_offset], copy_length); - if (ret == copy_length) { - ret = -EFAULT; - goto finish; - } - copy_length -= ret; - - userbuf += copy_length; - userbuf_len -= copy_length; - bytes_processed += copy_length; - *ppos += copy_length; - if (ret) - goto finish_noerr; - } - - /* Add terminator if one was needed */ - if (userbuf_len) { - copy_length = 1; - ret = copy_to_user(userbuf, "\n", copy_length); - if (ret == copy_length) { - ret = -EFAULT; - goto finish; - } - copy_length -= ret; - - userbuf += copy_length; - userbuf_len -= copy_length; - bytes_processed += copy_length; - *ppos += copy_length; - } else { - /* string wasn't completely copied this time - try to - * finish it next call */ - break; - } - - /* Line Completed - only now can safely delete it */ - textbuf->prev_line_pos += line->str_size; + line = list_first_entry(&context->userdata.input_head, + struct kutf_userdata_line, node); + if (line->str) { + /* + * Unless it is the end-of-input marker, + * remove it from the list + */ list_del(&line->node); - --(textbuf->nr_lines); - line = NULL; - /* Space freed up, wake up waiters */ - wake_up(&textbuf->not_full_wq); - - /* Pick the next line */ - if (!list_empty(&textbuf->textbuf_list)) { - line = list_first_entry(&textbuf->textbuf_list, struct kutf_helper_textbuf_line, node); - pos_offset = 0; - } - /* if no more lines, we've copied at least some bytes, so only - * need to block on new lines the next time we're called */ } -finish_noerr: - ret = bytes_processed; -finish: - mutex_unlock(&textbuf->lock); + spin_unlock(&kutf_input_lock); - return ret; + if (str_size) + *str_size = line->size; + return line->str; } -int kutf_helper_textbuf_wait_for_user(struct kutf_helper_textbuf *textbuf) +int kutf_helper_input_enqueue(struct kutf_context *context, + const char __user *str, size_t size) { - int err; - unsigned long now; - unsigned long timeout_jiffies = msecs_to_jiffies(USERDATA_WAIT_TIMEOUT_MS); - unsigned long time_end; - int ret = 0; - - /* Mutex locking using non-interruptible variants, since a signal to - * the user process will generally have to wait until we finish the - * test, because we can't restart the test. The exception is where - * we're blocked on a waitq */ - mutex_lock(&textbuf->lock); + struct kutf_userdata_line *line; - now = jiffies; - time_end = now + timeout_jiffies; - - while (!textbuf->nr_user_clients && time_before_eq(now, time_end)) { - unsigned long time_to_wait = time_end - now; - /* No users yet, block or timeout */ - mutex_unlock(&textbuf->lock); - /* Use interruptible here - in case we block for a long time - * and want to kill the user process */ - err = wait_event_interruptible_timeout(textbuf->user_opened_wq, - (textbuf->nr_user_clients > 0), time_to_wait); - /* Any error is not restartable due to how kutf runs tests */ - if (err < 0) - return -EINTR; - mutex_lock(&textbuf->lock); + line = kutf_mempool_alloc(&context->fixture_pool, + sizeof(*line) + size + 1); + if (!line) + return -ENOMEM; + if (str) { + unsigned long bytes_not_copied; - now = jiffies; + line->size = size; + line->str = (void *)(line + 1); + bytes_not_copied = copy_from_user(line->str, str, size); + if (bytes_not_copied != 0) + return -EFAULT; + /* Zero terminate the string */ + line->str[size] = '\0'; + } else { + /* This is used to mark the end of input */ + WARN_ON(size); + line->size = 0; + line->str = NULL; } - if (!textbuf->nr_user_clients) - ret = -ETIMEDOUT; - - mutex_unlock(&textbuf->lock); - - return ret; -} -EXPORT_SYMBOL(kutf_helper_textbuf_wait_for_user); - -char *kutf_helper_textbuf_dequeue(struct kutf_helper_textbuf *textbuf, - int *str_size) -{ - struct kutf_helper_textbuf_line *line; - char *ret = NULL; - - /* Mutex locking using non-interruptible variants, since a signal to - * the user process will generally have to wait until we finish the - * test, because we can't restart the test. The exception is where - * we're blocked on a waitq */ - mutex_lock(&textbuf->lock); - - while (list_empty(&textbuf->textbuf_list)) { - int err; - if (!textbuf->nr_user_clients) { - /* No user-side clients - error */ - goto out; - } + spin_lock(&kutf_input_lock); - /* No lines found, block for new ones from user-side consumer */ - mutex_unlock(&textbuf->lock); - /* Use interruptible here - in case we block for a long time - * and want to kill the user process */ - err = wait_event_interruptible(textbuf->not_empty_wq, - (textbuf->nr_lines > 0 || !textbuf->nr_user_clients)); - /* Any error is not restartable due to how kutf runs tests */ - if (err) - return ERR_PTR(-EINTR); - mutex_lock(&textbuf->lock); - } + list_add_tail(&line->node, &context->userdata.input_head); - line = list_first_entry(&textbuf->textbuf_list, struct kutf_helper_textbuf_line, node); - list_del(&line->node); - --(textbuf->nr_lines); - /* Space freed up, wake up waiters */ - wake_up(&textbuf->not_full_wq); + kutf_clear_waiting_for_input(context->result_set); - if (str_size) - *str_size = line->str_size; + spin_unlock(&kutf_input_lock); - ret = &line->str[0]; + wake_up(&context->userdata.input_waitq); -out: - mutex_unlock(&textbuf->lock); - return ret; + return 0; } -EXPORT_SYMBOL(kutf_helper_textbuf_dequeue); -int kutf_helper_textbuf_enqueue(struct kutf_helper_textbuf *textbuf, - char *enqueue_str, int buf_max_size) +void kutf_helper_input_enqueue_end_of_data(struct kutf_context *context) { - struct kutf_helper_textbuf_line *textbuf_line; - int str_size = strnlen(enqueue_str, buf_max_size) + 1; - char *str_start; - int ret = 0; - - /* Mutex locking using non-interruptible variants, since a signal to - * the user process will generally have to wait until we finish the - * test, because we can't restart the test. The exception is where - * we're blocked on a waitq */ - mutex_lock(&textbuf->lock); - - if (str_size > textbuf->max_line_size) - str_size = textbuf->max_line_size; - - while (textbuf->nr_lines >= textbuf->max_nr_lines) { - if (!textbuf->nr_user_clients) { - /* No user-side clients - error */ - ret = -EBUSY; - goto out; - } - - /* Block on user-side producer making space available */ - mutex_unlock(&textbuf->lock); - /* Use interruptible here - in case we block for a long time - * and want to kill the user process */ - ret = wait_event_interruptible(textbuf->not_full_wq, - (textbuf->nr_lines < textbuf->max_nr_lines || !textbuf->nr_user_clients)); - /* Any error is not restartable due to how kutf runs tests */ - if (ret) - return -EINTR; - mutex_lock(&textbuf->lock); - } - - /* String is stored immediately after the line */ - textbuf_line = kutf_mempool_alloc(textbuf->mempool, str_size + sizeof(struct kutf_helper_textbuf_line)); - if (!textbuf_line) { - ret = -ENOMEM; - goto out; - } - - str_start = &textbuf_line->str[0]; - - /* Copy in string */ - strncpy(str_start, enqueue_str, str_size); - /* Enforce the '\0' termination */ - str_start[str_size-1] = '\0'; - textbuf_line->str_size = str_size; - - /* Append to the textbuf */ - list_add_tail(&textbuf_line->node, &textbuf->textbuf_list); - ++(textbuf->nr_lines); - - /* Wakeup anyone blocked on empty */ - wake_up(&textbuf->not_empty_wq); - -out: - mutex_unlock(&textbuf->lock); - return ret; + kutf_helper_input_enqueue(context, NULL, 0); } -EXPORT_SYMBOL(kutf_helper_textbuf_enqueue); - - -struct kutf_userdata_ops kutf_helper_textbuf_userdata_ops = { - .open = kutf_helper_textbuf_open, - .release = kutf_helper_textbuf_release, - .notify_ended = kutf_helper_textbuf_notify_test_ended, - .consumer = kutf_helper_textbuf_consume, - .producer = kutf_helper_textbuf_produce, -}; -EXPORT_SYMBOL(kutf_helper_textbuf_userdata_ops); diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_helpers_user.c b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_helpers_user.c index cf3b00563c5f0b..108fa82d9b2165 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_helpers_user.c +++ b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_helpers_user.c @@ -7,20 +7,27 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* Kernel UTF test helpers that mirror those for kutf-userside */ #include <kutf/kutf_helpers_user.h> +#include <kutf/kutf_helpers.h> #include <kutf/kutf_utils.h> #include <linux/err.h> #include <linux/slab.h> +#include <linux/export.h> const char *valtype_names[] = { "INVALID", @@ -48,7 +55,7 @@ static const char *get_val_type_name(enum kutf_helper_valtype valtype) * * - Has between 1 and KUTF_HELPER_MAX_VAL_NAME_LEN characters before the \0 terminator * - And, each char is in the character set [A-Z0-9_] */ -static int validate_val_name(char *val_str, int str_len) +static int validate_val_name(const char *val_str, int str_len) { int i = 0; @@ -81,24 +88,44 @@ static int validate_val_name(char *val_str, int str_len) * * That is, before any '\\', '\n' or '"' characters. This is so we don't have * to escape the string */ -static int find_quoted_string_valid_len(char *str) +static int find_quoted_string_valid_len(const char *str) { char *ptr; const char *check_chars = "\\\n\""; ptr = strpbrk(str, check_chars); if (ptr) - return ptr-str; + return (int)(ptr-str); + + return (int)strlen(str); +} + +static int kutf_helper_userdata_enqueue(struct kutf_context *context, + const char *str) +{ + char *str_copy; + size_t len; + int err; + + len = strlen(str)+1; + + str_copy = kutf_mempool_alloc(&context->fixture_pool, len); + if (!str_copy) + return -ENOMEM; + + strcpy(str_copy, str); - return strlen(str); + err = kutf_add_result(context, KUTF_RESULT_USERDATA, str_copy); + + return err; } #define MAX_U64_HEX_LEN 16 /* (Name size) + ("=0x" size) + (64-bit hex value size) + (terminator) */ #define NAMED_U64_VAL_BUF_SZ (KUTF_HELPER_MAX_VAL_NAME_LEN + 3 + MAX_U64_HEX_LEN + 1) -int kutf_helper_textbuf_send_named_u64(struct kutf_context *context, - struct kutf_helper_textbuf *textbuf, char *val_name, u64 val) +int kutf_helper_send_named_u64(struct kutf_context *context, + const char *val_name, u64 val) { int ret = 1; char msgbuf[NAMED_U64_VAL_BUF_SZ]; @@ -117,9 +144,8 @@ int kutf_helper_textbuf_send_named_u64(struct kutf_context *context, val_name, NAMED_U64_VAL_BUF_SZ, ret); goto out_err; } - msgbuf[NAMED_U64_VAL_BUF_SZ-1] = '\0'; - ret = kutf_helper_textbuf_enqueue(textbuf, msgbuf, NAMED_U64_VAL_BUF_SZ); + ret = kutf_helper_userdata_enqueue(context, msgbuf); if (ret) { errmsg = kutf_dsprintf(&context->fixture_pool, "Failed to send u64 value named '%s': send returned %d", @@ -132,33 +158,31 @@ int kutf_helper_textbuf_send_named_u64(struct kutf_context *context, kutf_test_fail(context, errmsg); return ret; } -EXPORT_SYMBOL(kutf_helper_textbuf_send_named_u64); +EXPORT_SYMBOL(kutf_helper_send_named_u64); #define NAMED_VALUE_SEP "=" #define NAMED_STR_START_DELIM NAMED_VALUE_SEP "\"" #define NAMED_STR_END_DELIM "\"" -int kutf_helper_textbuf_max_str_len_for_kern(char *val_name, +int kutf_helper_max_str_len_for_kern(const char *val_name, int kern_buf_sz) { - int val_name_len = strlen(val_name); - int start_delim_len = strlen(NAMED_STR_START_DELIM); - int max_msg_len = kern_buf_sz - 1; + const int val_name_len = strlen(val_name); + const int start_delim_len = strlen(NAMED_STR_START_DELIM); + const int end_delim_len = strlen(NAMED_STR_END_DELIM); + int max_msg_len = kern_buf_sz; int max_str_len; - /* We do not include the end delimiter. Providing there is a line - * ending character when sending the message, the end delimiter can be - * truncated off safely to allow proper NAME="value" reception when - * value's length is too long */ - max_str_len = max_msg_len - val_name_len - start_delim_len; + max_str_len = max_msg_len - val_name_len - start_delim_len - + end_delim_len; return max_str_len; } -EXPORT_SYMBOL(kutf_helper_textbuf_max_str_len_for_kern); +EXPORT_SYMBOL(kutf_helper_max_str_len_for_kern); -int kutf_helper_textbuf_send_named_str(struct kutf_context *context, - struct kutf_helper_textbuf *textbuf, char *val_name, - char *val_str) +int kutf_helper_send_named_str(struct kutf_context *context, + const char *val_name, + const char *val_str) { int val_str_len; int str_buf_sz; @@ -215,7 +239,7 @@ int kutf_helper_textbuf_send_named_str(struct kutf_context *context, /* Terminator */ *copy_ptr = '\0'; - ret = kutf_helper_textbuf_enqueue(textbuf, str_buf, str_buf_sz); + ret = kutf_helper_userdata_enqueue(context, str_buf); if (ret) { errmsg = kutf_dsprintf(&context->fixture_pool, @@ -232,12 +256,13 @@ int kutf_helper_textbuf_send_named_str(struct kutf_context *context, kfree(str_buf); return ret; } -EXPORT_SYMBOL(kutf_helper_textbuf_send_named_str); +EXPORT_SYMBOL(kutf_helper_send_named_str); -int kutf_helper_textbuf_receive_named_val(struct kutf_helper_named_val *named_val, - struct kutf_helper_textbuf *textbuf) +int kutf_helper_receive_named_val( + struct kutf_context *context, + struct kutf_helper_named_val *named_val) { - int recv_sz; + size_t recv_sz; char *recv_str; char *search_ptr; char *name_str = NULL; @@ -246,15 +271,13 @@ int kutf_helper_textbuf_receive_named_val(struct kutf_helper_named_val *named_va enum kutf_helper_valtype type = KUTF_HELPER_VALTYPE_INVALID; char *strval = NULL; u64 u64val = 0; - int orig_recv_sz; int err = KUTF_HELPER_ERR_INVALID_VALUE; - recv_str = kutf_helper_textbuf_dequeue(textbuf, &recv_sz); + recv_str = kutf_helper_input_dequeue(context, &recv_sz); if (!recv_str) return -EBUSY; else if (IS_ERR(recv_str)) return PTR_ERR(recv_str); - orig_recv_sz = recv_sz; /* Find the '=', grab the name and validate it */ search_ptr = strnchr(recv_str, recv_sz, NAMED_VALUE_SEP[0]); @@ -271,7 +294,8 @@ int kutf_helper_textbuf_receive_named_val(struct kutf_helper_named_val *named_va } } if (!name_str) { - pr_err("Invalid name part for recevied string '%s'\n", recv_str); + pr_err("Invalid name part for received string '%s'\n", + recv_str); return KUTF_HELPER_ERR_INVALID_NAME; } @@ -299,24 +323,6 @@ int kutf_helper_textbuf_receive_named_val(struct kutf_helper_named_val *named_va pr_err("String value contains invalid characters in rest of received string '%s'\n", recv_str); err = KUTF_HELPER_ERR_CHARS_AFTER_VAL; } - } else if (orig_recv_sz == textbuf->max_line_size) { - /* No end-delimiter found, but the line is at - * the max line size. Assume that before - * truncation the line had a closing delimiter - * anyway */ - strval_len = strlen(recv_str); - /* Validate the string to ensure it contains no quotes */ - if (strval_len == find_quoted_string_valid_len(recv_str)) { - strval = recv_str; - - /* Move to the end of the string */ - recv_str += strval_len; - recv_sz -= strval_len; - type = KUTF_HELPER_VALTYPE_STR; - } else { - pr_err("String value contains invalid characters in rest of received string '%s'\n", recv_str); - err = KUTF_HELPER_ERR_CHARS_AFTER_VAL; - } } else { pr_err("End of string delimiter not found in rest of received string '%s'\n", recv_str); err = KUTF_HELPER_ERR_NO_END_DELIMITER; @@ -357,8 +363,8 @@ int kutf_helper_textbuf_receive_named_val(struct kutf_helper_named_val *named_va named_val->u.val_str = strval; break; default: - pr_err("Unreachable, fix textbuf_receive_named_val\n"); - /* Coding error, report as though 'data' file failed */ + pr_err("Unreachable, fix kutf_helper_receive_named_val\n"); + /* Coding error, report as though 'run' file failed */ return -EINVAL; } @@ -367,16 +373,18 @@ int kutf_helper_textbuf_receive_named_val(struct kutf_helper_named_val *named_va return KUTF_HELPER_ERR_NONE; } -EXPORT_SYMBOL(kutf_helper_textbuf_receive_named_val); +EXPORT_SYMBOL(kutf_helper_receive_named_val); #define DUMMY_MSG "<placeholder due to test fail>" -int kutf_helper_textbuf_receive_check_val(struct kutf_helper_named_val *named_val, - struct kutf_context *context, struct kutf_helper_textbuf *textbuf, - char *expect_val_name, enum kutf_helper_valtype expect_val_type) +int kutf_helper_receive_check_val( + struct kutf_helper_named_val *named_val, + struct kutf_context *context, + const char *expect_val_name, + enum kutf_helper_valtype expect_val_type) { int err; - err = kutf_helper_textbuf_receive_named_val(named_val, textbuf); + err = kutf_helper_receive_named_val(context, named_val); if (err < 0) { const char *msg = kutf_dsprintf(&context->fixture_pool, "Failed to receive value named '%s'", @@ -438,7 +446,7 @@ int kutf_helper_textbuf_receive_check_val(struct kutf_helper_named_val *named_va /* But at least allow the caller to continue in the test with failures */ return 0; } -EXPORT_SYMBOL(kutf_helper_textbuf_receive_check_val); +EXPORT_SYMBOL(kutf_helper_receive_check_val); void kutf_helper_output_named_val(struct kutf_helper_named_val *named_val) { diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_mem.c b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_mem.c index a75e15fde05f72..fd98beaeb84a93 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_mem.c +++ b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_mem.c @@ -7,18 +7,24 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* Kernel UTF memory management functions */ #include <linux/list.h> #include <linux/slab.h> +#include <linux/export.h> #include <kutf/kutf_mem.h> diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_resultset.c b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_resultset.c index 5bd04969fd55f7..94ecfa4421e18a 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_resultset.c +++ b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_resultset.c @@ -7,29 +7,33 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* Kernel UTF result management functions */ #include <linux/list.h> #include <linux/slab.h> #include <linux/printk.h> +#include <linux/sched.h> +#include <linux/wait.h> +#include <linux/err.h> +#include <kutf/kutf_suite.h> #include <kutf/kutf_resultset.h> -/** - * struct kutf_result_set - Represents a set of results. - * @results: Pointer to the linked list where the results are stored. - */ -struct kutf_result_set { - struct list_head results; -}; +/* Lock to protect all result structures */ +static DEFINE_SPINLOCK(kutf_result_lock); struct kutf_result_set *kutf_create_result_set(void) { @@ -42,6 +46,8 @@ struct kutf_result_set *kutf_create_result_set(void) } INIT_LIST_HEAD(&set->results); + init_waitqueue_head(&set->waitq); + set->flags = 0; return set; @@ -49,11 +55,12 @@ struct kutf_result_set *kutf_create_result_set(void) return NULL; } -void kutf_add_result(struct kutf_mempool *mempool, - struct kutf_result_set *set, +int kutf_add_result(struct kutf_context *context, enum kutf_result_status status, const char *message) { + struct kutf_mempool *mempool = &context->fixture_pool; + struct kutf_result_set *set = context->result_set; /* Create the new result */ struct kutf_result *new_result; @@ -62,14 +69,22 @@ void kutf_add_result(struct kutf_mempool *mempool, new_result = kutf_mempool_alloc(mempool, sizeof(*new_result)); if (!new_result) { pr_err("Result allocation failed\n"); - return; + return -ENOMEM; } INIT_LIST_HEAD(&new_result->node); new_result->status = status; new_result->message = message; + spin_lock(&kutf_result_lock); + list_add_tail(&new_result->node, &set->results); + + spin_unlock(&kutf_result_lock); + + wake_up(&set->waitq); + + return 0; } void kutf_destroy_result_set(struct kutf_result_set *set) @@ -80,16 +95,70 @@ void kutf_destroy_result_set(struct kutf_result_set *set) kfree(set); } +static bool kutf_has_result(struct kutf_result_set *set) +{ + bool has_result; + + spin_lock(&kutf_result_lock); + if (set->flags & KUTF_RESULT_SET_WAITING_FOR_INPUT) + /* Pretend there are results if waiting for input */ + has_result = true; + else + has_result = !list_empty(&set->results); + spin_unlock(&kutf_result_lock); + + return has_result; +} + struct kutf_result *kutf_remove_result(struct kutf_result_set *set) { - if (!list_empty(&set->results)) { - struct kutf_result *ret; + struct kutf_result *result = NULL; + int ret; + + do { + ret = wait_event_interruptible(set->waitq, + kutf_has_result(set)); + + if (ret) + return ERR_PTR(ret); + + spin_lock(&kutf_result_lock); + + if (!list_empty(&set->results)) { + result = list_first_entry(&set->results, + struct kutf_result, + node); + list_del(&result->node); + } else if (set->flags & KUTF_RESULT_SET_WAITING_FOR_INPUT) { + /* Return a fake result */ + static struct kutf_result waiting = { + .status = KUTF_RESULT_USERDATA_WAIT + }; + result = &waiting; + } + /* If result == NULL then there was a race with the event + * being removed between the check in kutf_has_result and + * the lock being obtained. In this case we retry + */ + + spin_unlock(&kutf_result_lock); + } while (result == NULL); + + return result; +} - ret = list_first_entry(&set->results, struct kutf_result, node); - list_del(&ret->node); - return ret; - } +void kutf_set_waiting_for_input(struct kutf_result_set *set) +{ + spin_lock(&kutf_result_lock); + set->flags |= KUTF_RESULT_SET_WAITING_FOR_INPUT; + spin_unlock(&kutf_result_lock); - return NULL; + wake_up(&set->waitq); } +void kutf_clear_waiting_for_input(struct kutf_result_set *set) +{ + spin_lock(&kutf_result_lock); + set->flags &= ~KUTF_RESULT_SET_WAITING_FOR_INPUT; + spin_unlock(&kutf_result_lock); +} diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_suite.c b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_suite.c index ad30cc86a3b02f..1c350bb339fb77 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_suite.c +++ b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_suite.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* Kernel UTF suite, test and fixture management including user to kernel * interaction */ @@ -27,12 +32,14 @@ #include <linux/fs.h> #include <linux/version.h> #include <linux/atomic.h> +#include <linux/sched.h> #include <generated/autoconf.h> #include <kutf/kutf_suite.h> #include <kutf/kutf_resultset.h> #include <kutf/kutf_utils.h> +#include <kutf/kutf_helpers.h> #if defined(CONFIG_DEBUG_FS) @@ -61,8 +68,6 @@ struct kutf_application { * @variant_list: List head to store all the variants which can run on * this function * @dir: debugfs directory for this test function - * @userdata_ops: Callbacks to use for sending and receiving data to - * userspace. */ struct kutf_test_function { struct kutf_suite *suite; @@ -73,7 +78,6 @@ struct kutf_test_function { struct list_head node; struct list_head variant_list; struct dentry *dir; - struct kutf_userdata_ops userdata_ops; }; /** @@ -83,17 +87,16 @@ struct kutf_test_function { * @fixture_index: Index of this fixture * @node: List node for variant_list * @dir: debugfs directory for this test fixture - * @nr_running: Current count of user-clients running this fixture */ struct kutf_test_fixture { struct kutf_test_function *test_func; unsigned int fixture_index; struct list_head node; struct dentry *dir; - atomic_t nr_running; }; -struct dentry *base_dir; +static struct dentry *base_dir; +static struct workqueue_struct *kutf_workq; /** * struct kutf_convert_table - Structure which keeps test results @@ -183,26 +186,6 @@ static void kutf_set_result(struct kutf_context *context, static void kutf_set_expected_result(struct kutf_context *context, enum kutf_result_status expected_status); -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) -/* Pre 3.4.0 kernels don't have the simple_open helper */ - -/** - * simple_open() - Helper for file opening which stores the inode private data - * into the file private data - * @inode: File entry representation - * @file: A specific opening of the file - * - * Return: always 0; if inode private data do not exist, the file will not - * be assigned private data - */ -static int simple_open(struct inode *inode, struct file *file) -{ - if (inode->i_private) - file->private_data = inode->i_private; - return 0; -} -#endif - /** * kutf_result_to_string() - Converts a KUTF result into a string * @result_str: Output result string @@ -251,263 +234,6 @@ static const struct file_operations kutf_debugfs_const_string_ops = { .llseek = default_llseek, }; -/** - * kutf_debugfs_data_open() Debugfs open callback for the "data" entry. - * @inode: inode of the opened file - * @file: Opened file to read from - * - * This function notifies the userdata callbacks that the userdata file has - * been opened, for tracking purposes. - * - * It is called on both the context's userdata_consumer_priv and - * userdata_producer_priv. - * - * This takes a refcount on the kutf_context - * - * Return: 0 on success - */ -static int kutf_debugfs_data_open(struct inode *inode, struct file *file) -{ - struct kutf_context *test_context = inode->i_private; - struct kutf_test_fixture *test_fix = test_context->test_fix; - struct kutf_test_function *test_func = test_fix->test_func; - int err; - - simple_open(inode, file); - - /* This is not an error */ - if (!test_func->userdata_ops.open) - goto out_no_ops; - - /* This is safe here - the 'data' file is only openable whilst the - * initial refcount is still present, and the initial refcount is only - * dropped strictly after the 'data' file is removed */ - kutf_context_get(test_context); - - if (test_context->userdata_consumer_priv) { - err = test_func->userdata_ops.open(test_context->userdata_consumer_priv); - if (err) - goto out_consumer_fail; - } - - if (test_context->userdata_producer_priv) { - err = test_func->userdata_ops.open(test_context->userdata_producer_priv); - if (err) - goto out_producer_fail; - } - -out_no_ops: - return 0; - -out_producer_fail: - if (test_func->userdata_ops.release && test_context->userdata_consumer_priv) - test_func->userdata_ops.release(test_context->userdata_consumer_priv); -out_consumer_fail: - kutf_context_put(test_context); - - return err; -} - - -/** - * kutf_debugfs_data_read() Debugfs read callback for the "data" entry. - * @file: Opened file to read from - * @buf: User buffer to write the data into - * @len: Amount of data to read - * @ppos: Offset into file to read from - * - * This function allows user and kernel to exchange extra data necessary for - * the test fixture. - * - * The data is read from the first struct kutf_context running the fixture - * - * Return: Number of bytes read - */ -static ssize_t kutf_debugfs_data_read(struct file *file, char __user *buf, - size_t len, loff_t *ppos) -{ - struct kutf_context *test_context = file->private_data; - struct kutf_test_fixture *test_fix = test_context->test_fix; - struct kutf_test_function *test_func = test_fix->test_func; - ssize_t (*producer)(void *private, char __user *userbuf, - size_t userbuf_len, loff_t *ppos); - ssize_t count; - - producer = test_func->userdata_ops.producer; - /* Can only read if there's a producer callback */ - if (!producer) - return -ENODEV; - - count = producer(test_context->userdata_producer_priv, buf, len, ppos); - - return count; -} - -/** - * kutf_debugfs_data_write() Debugfs write callback for the "data" entry. - * @file: Opened file to write to - * @buf: User buffer to read the data from - * @len: Amount of data to write - * @ppos: Offset into file to write to - * - * This function allows user and kernel to exchange extra data necessary for - * the test fixture. - * - * The data is added to the first struct kutf_context running the fixture - * - * Return: Number of bytes written - */ -static ssize_t kutf_debugfs_data_write(struct file *file, - const char __user *buf, size_t len, loff_t *ppos) -{ - struct kutf_context *test_context = file->private_data; - struct kutf_test_fixture *test_fix = test_context->test_fix; - struct kutf_test_function *test_func = test_fix->test_func; - ssize_t (*consumer)(void *private, const char __user *userbuf, - size_t userbuf_len, loff_t *ppos); - ssize_t count; - - consumer = test_func->userdata_ops.consumer; - /* Can only write if there's a consumer callback */ - if (!consumer) - return -ENODEV; - - count = consumer(test_context->userdata_consumer_priv, buf, len, ppos); - - return count; -} - - -/** - * kutf_debugfs_data_release() - Debugfs release callback for the "data" entry. - * @inode: File entry representation - * @file: A specific opening of the file - * - * This function notifies the userdata callbacks that the userdata file has - * been closed, for tracking purposes. - * - * It is called on both the context's userdata_consumer_priv and - * userdata_producer_priv. - * - * It also drops the refcount on the kutf_context that was taken during - * kutf_debugfs_data_open() - */ -static int kutf_debugfs_data_release(struct inode *inode, struct file *file) -{ - struct kutf_context *test_context = file->private_data; - struct kutf_test_fixture *test_fix = test_context->test_fix; - struct kutf_test_function *test_func = test_fix->test_func; - - if (!test_func->userdata_ops.release) - return 0; - - if (test_context->userdata_consumer_priv) - test_func->userdata_ops.release(test_context->userdata_consumer_priv); - if (test_context->userdata_producer_priv) - test_func->userdata_ops.release(test_context->userdata_producer_priv); - - kutf_context_put(test_context); - - return 0; -} - - -static const struct file_operations kutf_debugfs_data_ops = { - .owner = THIS_MODULE, - .open = kutf_debugfs_data_open, - .read = kutf_debugfs_data_read, - .write = kutf_debugfs_data_write, - .release = kutf_debugfs_data_release, - .llseek = default_llseek, -}; - -/** - * userdata_init() - Initialize userspace data exchange for a test, if - * specified by that test - * @test_context: Test context - * - * Note that this allows new refcounts to be made on test_context by userspace - * threads opening the 'data' file. - * - * Return: 0 on success, negative value corresponding to error code in failure - * and kutf result will be set appropriately to indicate the error - */ -static int userdata_init(struct kutf_context *test_context) -{ - struct kutf_test_fixture *test_fix = test_context->test_fix; - struct kutf_test_function *test_func = test_fix->test_func; - int err = 0; - struct dentry *userdata_dentry; - - /* Valid to have neither a producer or consumer, which is the case for - * tests not requiring usersdata */ - if ((!test_func->userdata_ops.consumer) && (!test_func->userdata_ops.producer)) - return err; - - if (test_func->userdata_ops.consumer && !test_context->userdata_consumer_priv) { - kutf_test_fatal(test_context, - "incorrect test setup - userdata consumer provided without private data"); - return -EFAULT; - } - - if (test_func->userdata_ops.producer && !test_context->userdata_producer_priv) { - kutf_test_fatal(test_context, - "incorrect test setup - userdata producer provided without private data"); - return -EFAULT; - } - - userdata_dentry = debugfs_create_file("data", S_IROTH, test_fix->dir, - test_context, &kutf_debugfs_data_ops); - - if (!userdata_dentry) { - pr_err("Failed to create debugfs file \"data\" when running fixture\n"); - /* Not using Fatal (which stops other tests running), - * nor Abort (which indicates teardown should not be done) */ - kutf_test_fail(test_context, - "failed to create 'data' file for userside data exchange"); - - /* Error code is discarded by caller, but consistent with other - * debugfs_create_file failures */ - err = -EEXIST; - } else { - test_context->userdata_dentry = userdata_dentry; - } - - - return err; -} - -/** - * userdata_term() - Terminate userspace data exchange for a test, if specified - * by that test - * @test_context: Test context - * - * Note This also prevents new refcounts being made on @test_context by userspace - * threads opening the 'data' file for this test. Any existing open file descriptors - * to the 'data' file will still be safe to use by userspace. - */ -static void userdata_term(struct kutf_context *test_context) -{ - struct kutf_test_fixture *test_fix = test_context->test_fix; - struct kutf_test_function *test_func = test_fix->test_func; - void (*notify_ended)(void *priv) = test_func->userdata_ops.notify_ended; - - /* debugfs_remove() is safe when parameter is error or NULL */ - debugfs_remove(test_context->userdata_dentry); - - /* debugfs_remove() doesn't kill any currently open file descriptors on - * this file, and such fds are still safe to use providing test_context - * is properly refcounted */ - - if (notify_ended) { - if (test_context->userdata_consumer_priv) - notify_ended(test_context->userdata_consumer_priv); - if (test_context->userdata_producer_priv) - notify_ended(test_context->userdata_producer_priv); - } - -} - /** * kutf_add_explicit_result() - Check if an explicit result needs to be added * @context: KUTF test context @@ -563,75 +289,75 @@ static void kutf_add_explicit_result(struct kutf_context *context) } } +static void kutf_run_test(struct work_struct *data) +{ + struct kutf_context *test_context = container_of(data, + struct kutf_context, work); + struct kutf_suite *suite = test_context->suite; + struct kutf_test_function *test_func; + + test_func = test_context->test_fix->test_func; + + /* + * Call the create fixture function if required before the + * fixture is run + */ + if (suite->create_fixture) + test_context->fixture = suite->create_fixture(test_context); + + /* Only run the test if the fixture was created (if required) */ + if ((suite->create_fixture && test_context->fixture) || + (!suite->create_fixture)) { + /* Run this fixture */ + test_func->execute(test_context); + + if (suite->remove_fixture) + suite->remove_fixture(test_context); + + kutf_add_explicit_result(test_context); + } + + kutf_add_result(test_context, KUTF_RESULT_TEST_FINISHED, NULL); + + kutf_context_put(test_context); +} + /** * kutf_debugfs_run_open() Debugfs open callback for the "run" entry. * @inode: inode of the opened file * @file: Opened file to read from * - * This function retrieves the test fixture data that is associated with the - * opened file and works back to get the test, suite and application so - * it can then run the test that is associated with the file entry. + * This function creates a KUTF context and queues it onto a workqueue to be + * run asynchronously. The resulting file descriptor can be used to communicate + * userdata to the test and to read back the results of the test execution. * * Return: 0 on success */ static int kutf_debugfs_run_open(struct inode *inode, struct file *file) { struct kutf_test_fixture *test_fix = inode->i_private; - struct kutf_test_function *test_func = test_fix->test_func; - struct kutf_suite *suite = test_func->suite; struct kutf_context *test_context; int err = 0; - /* For the moment, only one user-client should be attempting to run - * this at a time. This simplifies how we lookup the kutf_context when - * using the 'data' file. - * Removing this restriction would require a rewrite of the mechanism - * of the 'data' file to pass data in, perhaps 'data' created here and - * based upon userspace thread's pid */ - if (atomic_inc_return(&test_fix->nr_running) != 1) { - err = -EBUSY; - goto finish; - } - test_context = kutf_create_context(test_fix); if (!test_context) { - err = -ENODEV; + err = -ENOMEM; goto finish; } file->private_data = test_context; - /* - * Call the create fixture function if required before the - * fixture is run - */ - if (suite->create_fixture) - test_context->fixture = suite->create_fixture(test_context); - - /* Only run the test if the fixture was created (if required) */ - if ((suite->create_fixture && test_context->fixture) || - (!suite->create_fixture)) { - int late_err; - /* Setup any userdata exchange */ - late_err = userdata_init(test_context); - - if (!late_err) - /* Run this fixture */ - test_func->execute(test_context); - - userdata_term(test_context); - - if (suite->remove_fixture) - suite->remove_fixture(test_context); + /* This reference is release by the kutf_run_test */ + kutf_context_get(test_context); - kutf_add_explicit_result(test_context); - } + queue_work(kutf_workq, &test_context->work); finish: - atomic_dec(&test_fix->nr_running); return err; } +#define USERDATA_WARNING_MESSAGE "WARNING: This test requires userdata\n" + /** * kutf_debugfs_run_read() - Debugfs read callback for the "run" entry. * @file: Opened file to read from @@ -639,8 +365,14 @@ static int kutf_debugfs_run_open(struct inode *inode, struct file *file) * @len: Amount of data to read * @ppos: Offset into file to read from * - * This function emits the results which where logged during the opening of - * the file kutf_debugfs_run_open. + * This function emits the results of the test, blocking until they are + * available. + * + * If the test involves user data then this will also return user data records + * to user space. If the test is waiting for user data then this function will + * output a message (to make the likes of 'cat' display it), followed by + * returning 0 to mark the end of file. + * * Results will be emitted one at a time, once all the results have been read * 0 will be returned to indicate there is no more data. * @@ -653,68 +385,153 @@ static ssize_t kutf_debugfs_run_read(struct file *file, char __user *buf, struct kutf_result *res; unsigned long bytes_not_copied; ssize_t bytes_copied = 0; + char *kutf_str_ptr = NULL; + size_t kutf_str_len = 0; + size_t message_len = 0; + char separator = ':'; + char terminator = '\n'; - /* Note: This code assumes a result is read completely */ res = kutf_remove_result(test_context->result_set); - if (res) { - char *kutf_str_ptr = NULL; - unsigned int kutf_str_len = 0; - unsigned int message_len = 0; - char separator = ':'; - char terminator = '\n'; - - kutf_result_to_string(&kutf_str_ptr, res->status); - if (kutf_str_ptr) - kutf_str_len = strlen(kutf_str_ptr); - - if (res->message) - message_len = strlen(res->message); - - if ((kutf_str_len + 1 + message_len + 1) > len) { - pr_err("Not enough space in user buffer for a single result"); + + if (IS_ERR(res)) + return PTR_ERR(res); + + /* + * Handle 'fake' results - these results are converted to another + * form before being returned from the kernel + */ + switch (res->status) { + case KUTF_RESULT_TEST_FINISHED: + return 0; + case KUTF_RESULT_USERDATA_WAIT: + if (test_context->userdata.flags & + KUTF_USERDATA_WARNING_OUTPUT) { + /* + * Warning message already output, + * signal end-of-file + */ return 0; } - /* First copy the result string */ - if (kutf_str_ptr) { - bytes_not_copied = copy_to_user(&buf[0], kutf_str_ptr, - kutf_str_len); - bytes_copied += kutf_str_len - bytes_not_copied; - if (bytes_not_copied) - goto exit; + message_len = sizeof(USERDATA_WARNING_MESSAGE)-1; + if (message_len > len) + message_len = len; + + bytes_not_copied = copy_to_user(buf, + USERDATA_WARNING_MESSAGE, + message_len); + if (bytes_not_copied != 0) + return -EFAULT; + test_context->userdata.flags |= KUTF_USERDATA_WARNING_OUTPUT; + return message_len; + case KUTF_RESULT_USERDATA: + message_len = strlen(res->message); + if (message_len > len-1) { + message_len = len-1; + pr_warn("User data truncated, read not long enough\n"); + } + bytes_not_copied = copy_to_user(buf, res->message, + message_len); + if (bytes_not_copied != 0) { + pr_warn("Failed to copy data to user space buffer\n"); + return -EFAULT; + } + /* Finally the terminator */ + bytes_not_copied = copy_to_user(&buf[message_len], + &terminator, 1); + if (bytes_not_copied != 0) { + pr_warn("Failed to copy data to user space buffer\n"); + return -EFAULT; } + return message_len+1; + default: + /* Fall through - this is a test result */ + break; + } - /* Then the separator */ - bytes_not_copied = copy_to_user(&buf[bytes_copied], - &separator, 1); - bytes_copied += 1 - bytes_not_copied; + /* Note: This code assumes a result is read completely */ + kutf_result_to_string(&kutf_str_ptr, res->status); + if (kutf_str_ptr) + kutf_str_len = strlen(kutf_str_ptr); + + if (res->message) + message_len = strlen(res->message); + + if ((kutf_str_len + 1 + message_len + 1) > len) { + pr_err("Not enough space in user buffer for a single result"); + return 0; + } + + /* First copy the result string */ + if (kutf_str_ptr) { + bytes_not_copied = copy_to_user(&buf[0], kutf_str_ptr, + kutf_str_len); + bytes_copied += kutf_str_len - bytes_not_copied; if (bytes_not_copied) goto exit; + } - /* Finally Next copy the result string */ - if (res->message) { - bytes_not_copied = copy_to_user(&buf[bytes_copied], - res->message, message_len); - bytes_copied += message_len - bytes_not_copied; - if (bytes_not_copied) - goto exit; - } + /* Then the separator */ + bytes_not_copied = copy_to_user(&buf[bytes_copied], + &separator, 1); + bytes_copied += 1 - bytes_not_copied; + if (bytes_not_copied) + goto exit; - /* Finally the terminator */ + /* Finally Next copy the result string */ + if (res->message) { bytes_not_copied = copy_to_user(&buf[bytes_copied], - &terminator, 1); - bytes_copied += 1 - bytes_not_copied; + res->message, message_len); + bytes_copied += message_len - bytes_not_copied; + if (bytes_not_copied) + goto exit; } + + /* Finally the terminator */ + bytes_not_copied = copy_to_user(&buf[bytes_copied], + &terminator, 1); + bytes_copied += 1 - bytes_not_copied; + exit: return bytes_copied; } +/** + * kutf_debugfs_run_write() Debugfs write callback for the "run" entry. + * @file: Opened file to write to + * @buf: User buffer to read the data from + * @len: Amount of data to write + * @ppos: Offset into file to write to + * + * This function allows user and kernel to exchange extra data necessary for + * the test fixture. + * + * The data is added to the first struct kutf_context running the fixture + * + * Return: Number of bytes written + */ +static ssize_t kutf_debugfs_run_write(struct file *file, + const char __user *buf, size_t len, loff_t *ppos) +{ + int ret = 0; + struct kutf_context *test_context = file->private_data; + + if (len > KUTF_MAX_LINE_LENGTH) + return -EINVAL; + + ret = kutf_helper_input_enqueue(test_context, buf, len); + if (ret < 0) + return ret; + + return len; +} + /** * kutf_debugfs_run_release() - Debugfs release callback for the "run" entry. * @inode: File entry representation * @file: A specific opening of the file * - * Release any resources that where created during the opening of the file + * Release any resources that were created during the opening of the file * * Note that resources may not be released immediately, that might only happen * later when other users of the kutf_context release their refcount. @@ -725,6 +542,8 @@ static int kutf_debugfs_run_release(struct inode *inode, struct file *file) { struct kutf_context *test_context = file->private_data; + kutf_helper_input_enqueue_end_of_data(test_context); + kutf_context_put(test_context); return 0; } @@ -733,6 +552,7 @@ static const struct file_operations kutf_debugfs_run_ops = { .owner = THIS_MODULE, .open = kutf_debugfs_run_open, .read = kutf_debugfs_run_read, + .write = kutf_debugfs_run_write, .release = kutf_debugfs_run_release, .llseek = default_llseek, }; @@ -763,7 +583,6 @@ static int create_fixture_variant(struct kutf_test_function *test_func, test_fix->test_func = test_func; test_fix->fixture_index = fixture_index; - atomic_set(&test_fix->nr_running, 0); snprintf(name, sizeof(name), "%d", fixture_index); test_fix->dir = debugfs_create_dir(name, test_func->dir); @@ -783,8 +602,14 @@ static int create_fixture_variant(struct kutf_test_function *test_func, goto fail_file; } - tmp = debugfs_create_file("run", S_IROTH, test_fix->dir, test_fix, - &kutf_debugfs_run_ops); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) + tmp = debugfs_create_file_unsafe( +#else + tmp = debugfs_create_file( +#endif + "run", 0600, test_fix->dir, + test_fix, + &kutf_debugfs_run_ops); if (!tmp) { pr_err("Failed to create debugfs file \"run\" when adding fixture\n"); /* Might not be the right error, we don't get it passed back to us */ @@ -813,14 +638,13 @@ static void kutf_remove_test_variant(struct kutf_test_fixture *test_fix) kfree(test_fix); } -void kutf_add_test_with_filters_data_and_userdata( +void kutf_add_test_with_filters_and_data( struct kutf_suite *suite, unsigned int id, const char *name, void (*execute)(struct kutf_context *context), unsigned int filters, - union kutf_callback_data test_data, - struct kutf_userdata_ops *userdata_ops) + union kutf_callback_data test_data) { struct kutf_test_function *test_func; struct dentry *tmp; @@ -873,7 +697,6 @@ void kutf_add_test_with_filters_data_and_userdata( test_func->suite = suite; test_func->execute = execute; test_func->test_data = test_data; - memcpy(&test_func->userdata_ops, userdata_ops, sizeof(*userdata_ops)); list_add(&test_func->node, &suite->test_list); return; @@ -885,27 +708,6 @@ void kutf_add_test_with_filters_data_and_userdata( fail_alloc: return; } -EXPORT_SYMBOL(kutf_add_test_with_filters_data_and_userdata); - -void kutf_add_test_with_filters_and_data( - struct kutf_suite *suite, - unsigned int id, - const char *name, - void (*execute)(struct kutf_context *context), - unsigned int filters, - union kutf_callback_data test_data) -{ - struct kutf_userdata_ops userdata_ops = { - .open = NULL, - .release = NULL, - .consumer = NULL, - .producer = NULL, - }; - - kutf_add_test_with_filters_data_and_userdata(suite, id, name, execute, - filters, test_data, &userdata_ops); -} - EXPORT_SYMBOL(kutf_add_test_with_filters_and_data); void kutf_add_test_with_filters( @@ -1150,7 +952,7 @@ static struct kutf_context *kutf_create_context( new_context->result_set = kutf_create_result_set(); if (!new_context->result_set) { - pr_err("Failed to create resultset"); + pr_err("Failed to create result set"); goto fail_result_set; } @@ -1165,9 +967,12 @@ static struct kutf_context *kutf_create_context( new_context->fixture_index = test_fix->fixture_index; new_context->fixture_name = NULL; new_context->test_data = test_fix->test_func->test_data; - new_context->userdata_consumer_priv = NULL; - new_context->userdata_producer_priv = NULL; - new_context->userdata_dentry = NULL; + + new_context->userdata.flags = 0; + INIT_LIST_HEAD(&new_context->userdata.input_head); + init_waitqueue_head(&new_context->userdata.input_waitq); + + INIT_WORK(&new_context->work, kutf_run_test); kref_init(&new_context->kref); @@ -1227,8 +1032,7 @@ static void kutf_test_log_result( context->status = new_status; if (context->expected_status != new_status) - kutf_add_result(&context->fixture_pool, context->result_set, - new_status, message); + kutf_add_result(context, new_status, message); } void kutf_test_log_result_external( @@ -1344,18 +1148,18 @@ EXPORT_SYMBOL(kutf_test_abort); */ static int __init init_kutf_core(void) { - int ret; + kutf_workq = alloc_workqueue("kutf workq", WQ_UNBOUND, 1); + if (!kutf_workq) + return -ENOMEM; base_dir = debugfs_create_dir("kutf_tests", NULL); if (!base_dir) { - ret = -ENODEV; - goto exit_dir; + destroy_workqueue(kutf_workq); + kutf_workq = NULL; + return -ENOMEM; } return 0; - -exit_dir: - return ret; } /** @@ -1366,6 +1170,9 @@ static int __init init_kutf_core(void) static void __exit exit_kutf_core(void) { debugfs_remove_recursive(base_dir); + + if (kutf_workq) + destroy_workqueue(kutf_workq); } #else /* defined(CONFIG_DEBUG_FS) */ diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_utils.c b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_utils.c index a429a2dbf7880e..7f5ac517fdb484 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_utils.c +++ b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_utils.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - /* Kernel UTF utility functions */ #include <linux/mutex.h> diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/sconscript b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/sconscript index d7f112448e42cc..98f64468dac975 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/sconscript +++ b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/sconscript @@ -6,12 +6,18 @@ # 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - Import('kutf_env') diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Kbuild b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Kbuild index 0cd9cebe9d8bd7..ca8c51273b4c81 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Kbuild +++ b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Kbuild @@ -6,12 +6,18 @@ # 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - ccflags-y += -I$(src)/../include -I$(src)/../../../ -I$(src)/../../ -I$(src)/../../backend/gpu -I$(srctree)/drivers/staging/android diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Kconfig b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Kconfig index 4caa8ec8a0e22b..78283307713d5f 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Kconfig +++ b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Kconfig @@ -6,12 +6,18 @@ # 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - config MALI_IRQ_LATENCY tristate "Mali GPU IRQ latency measurement" diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Makefile b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Makefile index ced37b08e53262..40df1179b86b0e 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Makefile +++ b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Makefile @@ -1,17 +1,23 @@ # -# (C) COPYRIGHT 2015, 2017 ARM Limited. All rights reserved. +# (C) COPYRIGHT 2015, 2017-2018 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - # linux build system bootstrap for out-of-tree module @@ -23,12 +29,7 @@ $(error Must specify KDIR to point to the kernel to target)) endif TEST_CCFLAGS := \ - -DMALI_DEBUG=$(MALI_BIFROST_DEBUG) \ - -DMALI_BACKEND_KERNEL=$(MALI_BACKEND_KERNEL) \ - -DMALI_NO_MALI=$(MALI_BIFROST_NO_MALI) \ -DMALI_UNIT_TEST=$(MALI_UNIT_TEST) \ - -DMALI_USE_UMP=$(MALI_USE_UMP) \ - -DMALI_ERROR_INJECT_ON=$(MALI_ERROR_INJECT_ON) \ -DMALI_CUSTOMER_RELEASE=$(MALI_CUSTOMER_RELEASE) \ $(SCONS_CFLAGS) \ -I$(CURDIR)/../include \ diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/build.bp b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/build.bp new file mode 100644 index 00000000000000..e1f77b0c5d7b8c --- /dev/null +++ b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/build.bp @@ -0,0 +1,27 @@ +/* + * Copyright: + * ---------------------------------------------------------------------------- + * This confidential and proprietary software may be used only as authorized + * by a licensing agreement from ARM Limited. + * (C) COPYRIGHT 2018 ARM Limited, ALL RIGHTS RESERVED + * The entire notice above must be reproduced on all authorized copies and + * copies may only be made to the extent permitted by a licensing agreement + * from ARM Limited. + * ---------------------------------------------------------------------------- + */ + +bob_kernel_module { + name: "mali_kutf_irq_test", + defaults: ["kernel_test_module_defaults"], + srcs: [ + "Kbuild", + "mali_kutf_irq_test_main.c", + ], + extra_symbols: ["mali_kbase"], + install_group: "IG_tests", + enabled: false, + unit_test_kernel_modules: { + enabled: true, + kbuild_options: ["CONFIG_MALI_IRQ_LATENCY=m"], + }, +} diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/mali_kutf_irq_test_main.c b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/mali_kutf_irq_test_main.c index c9cc4447cf37f5..5013a9d7cf895c 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/mali_kutf_irq_test_main.c +++ b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/mali_kutf_irq_test_main.c @@ -7,14 +7,19 @@ * 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. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 * */ - - #include <linux/module.h> #include <linux/delay.h> #include <linux/interrupt.h> diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/sconscript b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/sconscript index b06d9ea329245b..0ec5ce7e3632d4 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/sconscript +++ b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/sconscript @@ -1,17 +1,23 @@ # -# (C) COPYRIGHT 2015, 2017 ARM Limited. All rights reserved. +# (C) COPYRIGHT 2015-2018 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - import os Import('env') @@ -23,7 +29,7 @@ if env.GetOption('clean') : cmd = env.Command('$STATIC_LIB_PATH/mali_kutf_irq_test.ko', src, []) env.KernelObjTarget('mali_kutf_irq_test', cmd) else: - makeAction=Action("cd ${SOURCE.dir} && make MALI_BIFROST_DEBUG=${debug} MALI_BACKEND_KERNEL=1 MALI_ERROR_INJECT_ON=${error_inject} MALI_BIFROST_NO_MALI=${no_mali} MALI_UNIT_TEST=${unit} MALI_USE_UMP=${ump} MALI_CUSTOMER_RELEASE=${release} %s && ( ( [ -f mali_kutf_irq_test.ko ] && cp mali_kutf_irq_test.ko $STATIC_LIB_PATH/ ) || touch $STATIC_LIB_PATH/mali_kutf_irq_test.ko)" % env.kernel_get_config_defines(), '$MAKECOMSTR') + makeAction=Action("cd ${SOURCE.dir} && make MALI_UNIT_TEST=${unit} MALI_CUSTOMER_RELEASE=${release} %s && ( ( [ -f mali_kutf_irq_test.ko ] && cp mali_kutf_irq_test.ko $STATIC_LIB_PATH/ ) || touch $STATIC_LIB_PATH/mali_kutf_irq_test.ko)" % env.kernel_get_config_defines(), '$MAKECOMSTR') cmd = env.Command('$STATIC_LIB_PATH/mali_kutf_irq_test.ko', src, [makeAction]) env.Depends('$STATIC_LIB_PATH/mali_kutf_irq_test.ko', '$STATIC_LIB_PATH/kutf.ko') env.Depends('$STATIC_LIB_PATH/mali_kutf_irq_test.ko', '$STATIC_LIB_PATH/mali_kbase.ko') diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/sconscript b/drivers/gpu/arm/bifrost_for_linux/tests/sconscript index 04584117ccef9b..0bd24a5e3f3523 100644 --- a/drivers/gpu/arm/bifrost_for_linux/tests/sconscript +++ b/drivers/gpu/arm/bifrost_for_linux/tests/sconscript @@ -6,12 +6,18 @@ # 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. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, you can access it online at +# http://www.gnu.org/licenses/gpl-2.0.html. +# +# SPDX-License-Identifier: GPL-2.0 # # - Import ('env') diff --git a/drivers/gpu/arm/bifrost_for_linux/thirdparty/mali_kbase_mmap.c b/drivers/gpu/arm/bifrost_for_linux/thirdparty/mali_kbase_mmap.c new file mode 100644 index 00000000000000..6857eb761ee2a3 --- /dev/null +++ b/drivers/gpu/arm/bifrost_for_linux/thirdparty/mali_kbase_mmap.c @@ -0,0 +1,322 @@ +/* + * + * (C) COPYRIGHT 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0 + * + *//* + * 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. + */ + +#include "linux/mman.h" +#include "../mali_kbase.h" + +/* mali_kbase_mmap.c + * + * This file contains Linux specific implementation of + * kbase_get_unmapped_area() interface. + */ + + +/** + * align_and_check() - Align the specified pointer to the provided alignment and + * check that it is still in range. + * @gap_end: Highest possible start address for allocation (end of gap in + * address space) + * @gap_start: Start address of current memory area / gap in address space + * @info: vm_unmapped_area_info structure passed to caller, containing + * alignment, length and limits for the allocation + * @is_shader_code: True if the allocation is for shader code (which has + * additional alignment requirements) + * + * Return: true if gap_end is now aligned correctly and is still in range, + * false otherwise + */ +static bool align_and_check(unsigned long *gap_end, unsigned long gap_start, + struct vm_unmapped_area_info *info, bool is_shader_code) +{ + /* Compute highest gap address at the desired alignment */ + (*gap_end) -= info->length; + (*gap_end) -= (*gap_end - info->align_offset) & info->align_mask; + + if (is_shader_code) { + /* Check for 4GB boundary */ + if (0 == (*gap_end & BASE_MEM_MASK_4GB)) + (*gap_end) -= (info->align_offset ? info->align_offset : + info->length); + if (0 == ((*gap_end + info->length) & BASE_MEM_MASK_4GB)) + (*gap_end) -= (info->align_offset ? info->align_offset : + info->length); + + if (!(*gap_end & BASE_MEM_MASK_4GB) || !((*gap_end + + info->length) & BASE_MEM_MASK_4GB)) + return false; + } + + + if ((*gap_end < info->low_limit) || (*gap_end < gap_start)) + return false; + + + return true; +} + +/** + * kbase_unmapped_area_topdown() - allocates new areas top-down from + * below the stack limit. + * @info: Information about the memory area to allocate. + * @is_shader_code: Boolean which denotes whether the allocated area is + * intended for the use by shader core in which case a + * special alignment requirements apply. + * + * The unmapped_area_topdown() function in the Linux kernel is not exported + * using EXPORT_SYMBOL_GPL macro. To allow us to call this function from a + * module and also make use of the fact that some of the requirements for + * the unmapped area are known in advance, we implemented an extended version + * of this function and prefixed it with 'kbase_'. + * + * The difference in the call parameter list comes from the fact that + * kbase_unmapped_area_topdown() is called with additional parameter which + * is provided to denote whether the allocation is for a shader core memory + * or not. This is significant since the executable shader core memory has + * additional alignment requirements. + * + * The modification of the original Linux function lies in how the computation + * of the highest gap address at the desired alignment is performed once the + * gap with desirable properties is found. For this purpose a special function + * is introduced (@ref align_and_check()) which beside computing the gap end + * at the desired alignment also performs additional alignment check for the + * case when the memory is executable shader core memory. For such case, it is + * ensured that the gap does not end on a 4GB boundary. + * + * Return: address of the found gap end (high limit) if area is found; + * -ENOMEM if search is unsuccessful +*/ + +static unsigned long kbase_unmapped_area_topdown(struct vm_unmapped_area_info + *info, bool is_shader_code) +{ + struct mm_struct *mm = current->mm; + struct vm_area_struct *vma; + unsigned long length, low_limit, high_limit, gap_start, gap_end; + + /* Adjust search length to account for worst case alignment overhead */ + length = info->length + info->align_mask; + if (length < info->length) + return -ENOMEM; + + /* + * Adjust search limits by the desired length. + * See implementation comment at top of unmapped_area(). + */ + gap_end = info->high_limit; + if (gap_end < length) + return -ENOMEM; + high_limit = gap_end - length; + + if (info->low_limit > high_limit) + return -ENOMEM; + low_limit = info->low_limit + length; + + /* Check highest gap, which does not precede any rbtree node */ + gap_start = mm->highest_vm_end; + if (gap_start <= high_limit) { + if (align_and_check(&gap_end, gap_start, info, is_shader_code)) + return gap_end; + } + + /* Check if rbtree root looks promising */ + if (RB_EMPTY_ROOT(&mm->mm_rb)) + return -ENOMEM; + vma = rb_entry(mm->mm_rb.rb_node, struct vm_area_struct, vm_rb); + if (vma->rb_subtree_gap < length) + return -ENOMEM; + + while (true) { + /* Visit right subtree if it looks promising */ + gap_start = vma->vm_prev ? vma->vm_prev->vm_end : 0; + if (gap_start <= high_limit && vma->vm_rb.rb_right) { + struct vm_area_struct *right = + rb_entry(vma->vm_rb.rb_right, + struct vm_area_struct, vm_rb); + if (right->rb_subtree_gap >= length) { + vma = right; + continue; + } + } + +check_current: + /* Check if current node has a suitable gap */ + gap_end = vma->vm_start; + if (gap_end < low_limit) + return -ENOMEM; + if (gap_start <= high_limit && gap_end - gap_start >= length) { + /* We found a suitable gap. Clip it with the original + * high_limit. */ + if (gap_end > info->high_limit) + gap_end = info->high_limit; + + if (align_and_check(&gap_end, gap_start, info, + is_shader_code)) + return gap_end; + } + + /* Visit left subtree if it looks promising */ + if (vma->vm_rb.rb_left) { + struct vm_area_struct *left = + rb_entry(vma->vm_rb.rb_left, + struct vm_area_struct, vm_rb); + if (left->rb_subtree_gap >= length) { + vma = left; + continue; + } + } + + /* Go back up the rbtree to find next candidate node */ + while (true) { + struct rb_node *prev = &vma->vm_rb; + + if (!rb_parent(prev)) + return -ENOMEM; + vma = rb_entry(rb_parent(prev), + struct vm_area_struct, vm_rb); + if (prev == vma->vm_rb.rb_right) { + gap_start = vma->vm_prev ? + vma->vm_prev->vm_end : 0; + goto check_current; + } + } + } + + return -ENOMEM; +} + + +/* This function is based on Linux kernel's arch_get_unmapped_area, but + * simplified slightly. Modifications come from the fact that some values + * about the memory area are known in advance. + */ +unsigned long kbase_get_unmapped_area(struct file *filp, + const unsigned long addr, const unsigned long len, + const unsigned long pgoff, const unsigned long flags) +{ + struct kbase_context *kctx = filp->private_data; + struct mm_struct *mm = current->mm; + struct vm_unmapped_area_info info; + unsigned long align_offset = 0; + unsigned long align_mask = 0; + unsigned long high_limit = mm->mmap_base; + unsigned long low_limit = PAGE_SIZE; + int cpu_va_bits = BITS_PER_LONG; + int gpu_pc_bits = + kctx->kbdev->gpu_props.props.core_props.log2_program_counter_size; + bool is_shader_code = false; + unsigned long ret; + + /* err on fixed address */ + if ((flags & MAP_FIXED) || addr) + return -EINVAL; + +#ifdef CONFIG_64BIT + /* too big? */ + if (len > TASK_SIZE - SZ_2M) + return -ENOMEM; + + if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) { + + high_limit = min_t(unsigned long, mm->mmap_base, + (kctx->same_va_end << PAGE_SHIFT)); + + /* If there's enough (> 33 bits) of GPU VA space, align + * to 2MB boundaries. + */ + if (kctx->kbdev->gpu_props.mmu.va_bits > 33) { + if (len >= SZ_2M) { + align_offset = SZ_2M; + align_mask = SZ_2M - 1; + } + } + + low_limit = SZ_2M; + } else { + cpu_va_bits = 32; + } +#endif /* CONFIG_64BIT */ + if ((PFN_DOWN(BASE_MEM_COOKIE_BASE) <= pgoff) && + (PFN_DOWN(BASE_MEM_FIRST_FREE_ADDRESS) > pgoff)) { + int cookie = pgoff - PFN_DOWN(BASE_MEM_COOKIE_BASE); + struct kbase_va_region *reg = + kctx->pending_regions[cookie]; + + if (!reg) + return -EINVAL; + + if (!(reg->flags & KBASE_REG_GPU_NX)) { + if (cpu_va_bits > gpu_pc_bits) { + align_offset = 1ULL << gpu_pc_bits; + align_mask = align_offset - 1; + is_shader_code = true; + } + } else if (reg->flags & KBASE_REG_TILER_ALIGN_TOP) { + unsigned long extent_bytes = + (unsigned long)(reg->extent << PAGE_SHIFT); + /* kbase_check_alloc_sizes() already satisfies + * these checks, but they're here to avoid + * maintenance hazards due to the assumptions + * involved */ + WARN_ON(reg->extent > (ULONG_MAX >> PAGE_SHIFT)); + WARN_ON(reg->initial_commit > (ULONG_MAX >> PAGE_SHIFT)); + WARN_ON(!is_power_of_2(extent_bytes)); + align_mask = extent_bytes - 1; + align_offset = + extent_bytes - (reg->initial_commit << PAGE_SHIFT); + } +#ifndef CONFIG_64BIT + } else { + return current->mm->get_unmapped_area(filp, addr, len, pgoff, + flags); +#endif + } + + info.flags = 0; + info.length = len; + info.low_limit = low_limit; + info.high_limit = high_limit; + info.align_offset = align_offset; + info.align_mask = align_mask; + + ret = kbase_unmapped_area_topdown(&info, is_shader_code); + + if (IS_ERR_VALUE(ret) && high_limit == mm->mmap_base && + high_limit < (kctx->same_va_end << PAGE_SHIFT)) { + /* Retry above mmap_base */ + info.low_limit = mm->mmap_base; + info.high_limit = min_t(u64, TASK_SIZE, + (kctx->same_va_end << PAGE_SHIFT)); + + ret = kbase_unmapped_area_topdown(&info, is_shader_code); + } + + return ret; +} ================================================ FILE: projects/Rockchip/packages/linux/patches/RK356x/0001-perf-fix.patch ================================================ Reported-by: Jiri Olsa <jolsa@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Namhyung Kim <namhyung@kernel.org> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Ben Hutchings <ben@decadent.org.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> --- tools/perf/tests/bp_account.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) --- a/tools/perf/tests/bp_account.c +++ b/tools/perf/tests/bp_account.c @@ -23,7 +23,7 @@ #include "../perf-sys.h" #include "cloexec.h" -volatile long the_var; +static volatile long the_var; static noinline int test_function(void) { ================================================ FILE: projects/Rockchip/packages/linux/patches/RK356x/0002-perf-bench-Share-some-global-variables-to-fix-build-.patch ================================================ From 62b75df5f013d9f7b5b47ff5369dd4b3143ab965 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy <glex.spb@gmail.com> Date: Mon, 25 Jan 2021 00:52:10 +0000 Subject: [PATCH 02/12] perf bench: Share some global variables to fix build with gcc 10 Based on https://git.yoctoproject.org/cgit/cgit.cgi/meta-arm/tree/meta-arm-bsp/recipes-kernel/linux/linux-yocto-5.3/0003-perf-bench-Share-some-global-variables-to-fix-build-.patch Signed-off-by: Gleb Mazovetskiy <glex.spb@gmail.com> --- tools/perf/bench/bench.h | 4 ++++ tools/perf/bench/futex-hash.c | 12 ++++++------ tools/perf/bench/futex-lock-pi.c | 11 +++++------ 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/tools/perf/bench/bench.h b/tools/perf/bench/bench.h index a50df86f2b9b..e758896f4995 100644 --- a/tools/perf/bench/bench.h +++ b/tools/perf/bench/bench.h @@ -1,6 +1,10 @@ #ifndef BENCH_H #define BENCH_H +#include <sys/time.h> + +extern struct timeval bench__start, bench__end, bench__runtime; + /* * The madvise transparent hugepage constants were added in glibc * 2.13. For compatibility with older versions of glibc, define these diff --git a/tools/perf/bench/futex-hash.c b/tools/perf/bench/futex-hash.c index fc9bebd2cca0..80313b40d324 100644 --- a/tools/perf/bench/futex-hash.c +++ b/tools/perf/bench/futex-hash.c @@ -28,7 +28,7 @@ static unsigned int nfutexes = 1024; static bool fshared = false, done = false, silent = false; static int futex_flag = 0; -struct timeval start, end, runtime; +struct timeval bench__start, bench__end, bench__runtime; static pthread_mutex_t thread_lock; static unsigned int threads_starting; static struct stats throughput_stats; @@ -92,8 +92,8 @@ static void toggle_done(int sig __maybe_unused, { /* inform all threads that we're done for the day */ done = true; - gettimeofday(&end, NULL); - timersub(&end, &start, &runtime); + gettimeofday(&bench__end, NULL); + timersub(&bench__end, &bench__start, &bench__runtime); } static void print_summary(void) @@ -103,7 +103,7 @@ static void print_summary(void) printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", !silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg), - (int) runtime.tv_sec); + (int) bench__runtime.tv_sec); } int bench_futex_hash(int argc, const char **argv, @@ -148,7 +148,7 @@ int bench_futex_hash(int argc, const char **argv, threads_starting = nthreads; pthread_attr_init(&thread_attr); - gettimeofday(&start, NULL); + gettimeofday(&bench__start, NULL); for (i = 0; i < nthreads; i++) { worker[i].tid = i; worker[i].futex = calloc(nfutexes, sizeof(*worker[i].futex)); @@ -191,7 +191,7 @@ int bench_futex_hash(int argc, const char **argv, pthread_mutex_destroy(&thread_lock); for (i = 0; i < nthreads; i++) { - unsigned long t = worker[i].ops/runtime.tv_sec; + unsigned long t = worker[i].ops/bench__runtime.tv_sec; update_stats(&throughput_stats, t); if (!silent) { if (nfutexes == 1) diff --git a/tools/perf/bench/futex-lock-pi.c b/tools/perf/bench/futex-lock-pi.c index bc6a16adbca8..8d0f60456a95 100644 --- a/tools/perf/bench/futex-lock-pi.c +++ b/tools/perf/bench/futex-lock-pi.c @@ -29,7 +29,6 @@ static bool silent = false, multi = false; static bool done = false, fshared = false; static unsigned int ncpus, nthreads = 0; static int futex_flag = 0; -struct timeval start, end, runtime; static pthread_mutex_t thread_lock; static unsigned int threads_starting; static struct stats throughput_stats; @@ -56,7 +55,7 @@ static void print_summary(void) printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", !silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg), - (int) runtime.tv_sec); + (int) bench__runtime.tv_sec); } static void toggle_done(int sig __maybe_unused, @@ -65,8 +64,8 @@ static void toggle_done(int sig __maybe_unused, { /* inform all threads that we're done for the day */ done = true; - gettimeofday(&end, NULL); - timersub(&end, &start, &runtime); + gettimeofday(&bench__end, NULL); + timersub(&bench__end, &bench__start, &bench__runtime); } static void *workerfn(void *arg) @@ -172,7 +171,7 @@ int bench_futex_lock_pi(int argc, const char **argv, threads_starting = nthreads; pthread_attr_init(&thread_attr); - gettimeofday(&start, NULL); + gettimeofday(&bench__start, NULL); create_threads(worker, thread_attr); pthread_attr_destroy(&thread_attr); @@ -198,7 +197,7 @@ int bench_futex_lock_pi(int argc, const char **argv, pthread_mutex_destroy(&thread_lock); for (i = 0; i < nthreads; i++) { - unsigned long t = worker[i].ops/runtime.tv_sec; + unsigned long t = worker[i].ops/bench__runtime.tv_sec; update_stats(&throughput_stats, t); if (!silent) -- 2.27.0 ================================================ FILE: projects/Rockchip/packages/linux/patches/RK356x/linux-tools-libtraceevent.patch ================================================ --- a/tools/lib/traceevent/Makefile 2021-02-03 01:55:41.000000000 +0100 +++ b/tools/lib/traceevent/Makefile.patched 2021-03-09 19:30:54.508423866 +0100 @@ -263,7 +263,7 @@ xargs echo "U w W" | tr 'w ' 'W\n' | sort -u | xargs echo`;\ if [ "$$symbol_type" = "U W" ];then \ (echo '{'; \ - $(NM) -u -D $1 | awk 'NF>1 {print "\t"$$2";"}' | sort -u;\ + $(NM) -u -D $1 | awk 'NF>1 {sub("@.*", "", $$2); print "\t"$$2";"}' | sort -u;\ echo '};'; \ ) > $2; \ else \ ================================================ FILE: projects/Rockchip/packages/linux/patches/base/0001-BACKPORT-arm64-don-t-zero-in-__copy_from_user-_inato.patch ================================================ From 02bcb5a7a3dc63346c14fc7aaae3102db548542d Mon Sep 17 00:00:00 2001 From: Al Viro <viro@zeniv.linux.org.uk> Date: Sat, 10 Sep 2016 16:50:00 -0400 Subject: [PATCH] BACKPORT: arm64: don't zero in __copy_from_user{,_inatomic} Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> --- arch/arm64/include/asm/uaccess.h | 11 +++++++---- arch/arm64/lib/copy_from_user.S | 7 +------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/arch/arm64/include/asm/uaccess.h b/arch/arm64/include/asm/uaccess.h index d0919bcb1953..b26ad8507e93 100644 --- a/arch/arm64/include/asm/uaccess.h +++ b/arch/arm64/include/asm/uaccess.h @@ -410,12 +410,15 @@ static inline unsigned long __must_check __copy_to_user(void __user *to, const v static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n) { + unsigned long res = n; + if (access_ok(VERIFY_READ, from, n)) { check_object_size(to, n, false); - n = __arch_copy_from_user(to, from, n); - } else /* security hole - plug it */ - memset(to, 0, n); - return n; + res = __arch_copy_from_user(to, from, n); + } + if (unlikely(res)) + memset(to + (n - res), 0, res); + return res; } static inline unsigned long __must_check copy_to_user(void __user *to, const void *from, unsigned long n) diff --git a/arch/arm64/lib/copy_from_user.S b/arch/arm64/lib/copy_from_user.S index 683adc358be7..c7a7d9689e8f 100644 --- a/arch/arm64/lib/copy_from_user.S +++ b/arch/arm64/lib/copy_from_user.S @@ -74,11 +74,6 @@ ENDPROC(__arch_copy_from_user) .section .fixup,"ax" .align 2 -9998: - sub x0, end, dst -9999: - strb wzr, [dst], #1 // zero remaining buffer space - cmp dst, end - b.lo 9999b +9998: sub x0, end, dst // bytes not copied ret .previous -- 2.27.0 ================================================ FILE: projects/Rockchip/packages/linux/patches/base/0001-perf-cs-etm-fix-duplicate-def-of-traceid_list.patch ================================================ From 7cdd201761fea40d7467b97fb9f2e2bcd5ec63c4 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy <glex.spb@gmail.com> Date: Mon, 25 Jan 2021 00:41:55 +0000 Subject: [PATCH 01/12] perf: cs-etm: fix duplicate def of traceid_list Backport of 168200b6d6ea0cb5765943ec5da5b8149701f36a upstream Signed-off-by: Gleb Mazovetskiy <glex.spb@gmail.com> --- tools/perf/util/cs-etm.c | 3 +++ tools/perf/util/cs-etm.h | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c index ca93257a6cb7..ee23fd37f241 100644 --- a/tools/perf/util/cs-etm.c +++ b/tools/perf/util/cs-etm.c @@ -91,6 +91,9 @@ struct cs_etm_queue { bool kernel_mapped; }; +/* RB tree for quick conversion between traceID and metadata pointers */ +static struct intlist *traceid_list; + static int cs_etm__get_trace(struct cs_etm_buffer *buff, struct cs_etm_queue *etmq); static int cs_etm__update_queues(struct cs_etm_auxtrace *); static int cs_etm__process_queues(struct cs_etm_auxtrace *, u64); diff --git a/tools/perf/util/cs-etm.h b/tools/perf/util/cs-etm.h index ec6ff78f1905..1f785a92fb20 100644 --- a/tools/perf/util/cs-etm.h +++ b/tools/perf/util/cs-etm.h @@ -65,9 +65,6 @@ enum { CS_ETMV4_PRIV_MAX, }; -/* RB tree for quick conversion between traceID and CPUs */ -struct intlist *traceid_list; - #define KiB(x) ((x) * 1024) #define MiB(x) ((x) * 1024 * 1024) -- 2.27.0 ================================================ FILE: projects/Rockchip/packages/linux/patches/base/0001-scripts-dtc-Remove-redundant-YYLOC-global-declaratio.patch ================================================ From 11647f99b4de6bc460e106e876f72fc7af3e54a6 Mon Sep 17 00:00:00 2001 From: Dirk Mueller <dmueller@suse.com> Date: Tue, 14 Jan 2020 18:53:41 +0100 Subject: [PATCH] scripts/dtc: Remove redundant YYLOC global declaration commit e33a814e772cdc36436c8c188d8c42d019fda639 upstream. gcc 10 will default to -fno-common, which causes this error at link time: (.text+0x0): multiple definition of `yylloc'; dtc-lexer.lex.o (symbol from plugin):(.text+0x0): first defined here This is because both dtc-lexer as well as dtc-parser define the same global symbol yyloc. Before with -fcommon those were merged into one defintion. The proper solution would be to to mark this as "extern", however that leads to: dtc-lexer.l:26:16: error: redundant redeclaration of 'yylloc' [-Werror=redundant-decls] 26 | extern YYLTYPE yylloc; | ^~~~~~ In file included from dtc-lexer.l:24: dtc-parser.tab.h:127:16: note: previous declaration of 'yylloc' was here 127 | extern YYLTYPE yylloc; | ^~~~~~ cc1: all warnings being treated as errors which means the declaration is completely redundant and can just be dropped. Signed-off-by: Dirk Mueller <dmueller@suse.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au> [robh: cherry-pick from upstream] Cc: stable@vger.kernel.org Signed-off-by: Rob Herring <robh@kernel.org> [nc: Also apply to dtc-lexer.lex.c_shipped due to a lack of e039139be8c2, where dtc-lexer.l started being used] Signed-off-by: Nathan Chancellor <natechancellor@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Change-Id: I7f299451e99aab09375883546e47505ec0937c26 --- scripts/dtc/dtc-lexer.l | 1 - scripts/dtc/dtc-lexer.lex.c_shipped | 1 - 2 files changed, 2 deletions(-) diff --git a/scripts/dtc/dtc-lexer.l b/scripts/dtc/dtc-lexer.l index c600603044f..cf7707be43a 100644 --- a/scripts/dtc/dtc-lexer.l +++ b/scripts/dtc/dtc-lexer.l @@ -38,7 +38,6 @@ LINECOMMENT "//".*\n #include "srcpos.h" #include "dtc-parser.tab.h" -YYLTYPE yylloc; extern bool treesource_error; /* CAUTION: this will stop working if we ever use yyless() or yyunput() */ diff --git a/scripts/dtc/dtc-lexer.lex.c_shipped b/scripts/dtc/dtc-lexer.lex.c_shipped index 2c862bc86ad..e3663ce1af5 100644 --- a/scripts/dtc/dtc-lexer.lex.c_shipped +++ b/scripts/dtc/dtc-lexer.lex.c_shipped @@ -631,7 +631,6 @@ char *yytext; #include "srcpos.h" #include "dtc-parser.tab.h" -YYLTYPE yylloc; extern bool treesource_error; /* CAUTION: this will stop working if we ever use yyless() or yyunput() */ ================================================ FILE: projects/Rockchip/packages/linux/patches/base/0002-perf-bench-Share-some-global-variables-to-fix-build-.patch ================================================ From 62b75df5f013d9f7b5b47ff5369dd4b3143ab965 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy <glex.spb@gmail.com> Date: Mon, 25 Jan 2021 00:52:10 +0000 Subject: [PATCH 02/12] perf bench: Share some global variables to fix build with gcc 10 Based on https://git.yoctoproject.org/cgit/cgit.cgi/meta-arm/tree/meta-arm-bsp/recipes-kernel/linux/linux-yocto-5.3/0003-perf-bench-Share-some-global-variables-to-fix-build-.patch Signed-off-by: Gleb Mazovetskiy <glex.spb@gmail.com> --- tools/perf/bench/bench.h | 4 ++++ tools/perf/bench/futex-hash.c | 12 ++++++------ tools/perf/bench/futex-lock-pi.c | 11 +++++------ 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/tools/perf/bench/bench.h b/tools/perf/bench/bench.h index a50df86f2b9b..e758896f4995 100644 --- a/tools/perf/bench/bench.h +++ b/tools/perf/bench/bench.h @@ -1,6 +1,10 @@ #ifndef BENCH_H #define BENCH_H +#include <sys/time.h> + +extern struct timeval bench__start, bench__end, bench__runtime; + /* * The madvise transparent hugepage constants were added in glibc * 2.13. For compatibility with older versions of glibc, define these diff --git a/tools/perf/bench/futex-hash.c b/tools/perf/bench/futex-hash.c index fc9bebd2cca0..80313b40d324 100644 --- a/tools/perf/bench/futex-hash.c +++ b/tools/perf/bench/futex-hash.c @@ -28,7 +28,7 @@ static unsigned int nfutexes = 1024; static bool fshared = false, done = false, silent = false; static int futex_flag = 0; -struct timeval start, end, runtime; +struct timeval bench__start, bench__end, bench__runtime; static pthread_mutex_t thread_lock; static unsigned int threads_starting; static struct stats throughput_stats; @@ -92,8 +92,8 @@ static void toggle_done(int sig __maybe_unused, { /* inform all threads that we're done for the day */ done = true; - gettimeofday(&end, NULL); - timersub(&end, &start, &runtime); + gettimeofday(&bench__end, NULL); + timersub(&bench__end, &bench__start, &bench__runtime); } static void print_summary(void) @@ -103,7 +103,7 @@ static void print_summary(void) printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", !silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg), - (int) runtime.tv_sec); + (int) bench__runtime.tv_sec); } int bench_futex_hash(int argc, const char **argv, @@ -148,7 +148,7 @@ int bench_futex_hash(int argc, const char **argv, threads_starting = nthreads; pthread_attr_init(&thread_attr); - gettimeofday(&start, NULL); + gettimeofday(&bench__start, NULL); for (i = 0; i < nthreads; i++) { worker[i].tid = i; worker[i].futex = calloc(nfutexes, sizeof(*worker[i].futex)); @@ -191,7 +191,7 @@ int bench_futex_hash(int argc, const char **argv, pthread_mutex_destroy(&thread_lock); for (i = 0; i < nthreads; i++) { - unsigned long t = worker[i].ops/runtime.tv_sec; + unsigned long t = worker[i].ops/bench__runtime.tv_sec; update_stats(&throughput_stats, t); if (!silent) { if (nfutexes == 1) diff --git a/tools/perf/bench/futex-lock-pi.c b/tools/perf/bench/futex-lock-pi.c index bc6a16adbca8..8d0f60456a95 100644 --- a/tools/perf/bench/futex-lock-pi.c +++ b/tools/perf/bench/futex-lock-pi.c @@ -29,7 +29,6 @@ static bool silent = false, multi = false; static bool done = false, fshared = false; static unsigned int ncpus, nthreads = 0; static int futex_flag = 0; -struct timeval start, end, runtime; static pthread_mutex_t thread_lock; static unsigned int threads_starting; static struct stats throughput_stats; @@ -56,7 +55,7 @@ static void print_summary(void) printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", !silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg), - (int) runtime.tv_sec); + (int) bench__runtime.tv_sec); } static void toggle_done(int sig __maybe_unused, @@ -65,8 +64,8 @@ static void toggle_done(int sig __maybe_unused, { /* inform all threads that we're done for the day */ done = true; - gettimeofday(&end, NULL); - timersub(&end, &start, &runtime); + gettimeofday(&bench__end, NULL); + timersub(&bench__end, &bench__start, &bench__runtime); } static void *workerfn(void *arg) @@ -172,7 +171,7 @@ int bench_futex_lock_pi(int argc, const char **argv, threads_starting = nthreads; pthread_attr_init(&thread_attr); - gettimeofday(&start, NULL); + gettimeofday(&bench__start, NULL); create_threads(worker, thread_attr); pthread_attr_destroy(&thread_attr); @@ -198,7 +197,7 @@ int bench_futex_lock_pi(int argc, const char **argv, pthread_mutex_destroy(&thread_lock); for (i = 0; i < nthreads; i++) { - unsigned long t = worker[i].ops/runtime.tv_sec; + unsigned long t = worker[i].ops/bench__runtime.tv_sec; update_stats(&throughput_stats, t); if (!silent) -- 2.27.0 ================================================ FILE: projects/Rockchip/packages/linux/patches/base/0003-perf-Make-perf-able-to-build-with-latest-libbfd.patch ================================================ From 89b28cc5ae940970fa4530722c1419dd728a6e15 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy <glex.spb@gmail.com> Date: Mon, 25 Jan 2021 00:57:06 +0000 Subject: [PATCH 03/12] perf: Make perf able to build with latest libbfd Based on http://lore.kernel.org/lkml/20200128152938.31413-1-changbin.du@gmail.com Signed-off-by: Gleb Mazovetskiy <glex.spb@gmail.com> --- tools/perf/util/srcline.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c index b4db3f48e3b0..2853d4728ab9 100644 --- a/tools/perf/util/srcline.c +++ b/tools/perf/util/srcline.c @@ -86,16 +86,30 @@ static void find_address_in_section(bfd *abfd, asection *section, void *data) bfd_vma pc, vma; bfd_size_type size; struct a2l_data *a2l = data; + flagword flags; if (a2l->found) return; - if ((bfd_get_section_flags(abfd, section) & SEC_ALLOC) == 0) +#ifdef bfd_get_section_flags + flags = bfd_get_section_flags(abfd, section); +#else + flags = bfd_section_flags(section); +#endif + if ((flags & SEC_ALLOC) == 0) return; pc = a2l->addr; +#ifdef bfd_get_section_vma vma = bfd_get_section_vma(abfd, section); +#else + vma = bfd_section_vma(section); +#endif +#ifdef bfd_get_section_size size = bfd_get_section_size(section); +#else + size = bfd_section_size(section); +#endif if (pc < vma || pc >= vma + size) return; -- 2.27.0 ================================================ FILE: projects/Rockchip/packages/linux/patches/base/0004-tools-lib-api-fs-Fix-gcc9-stringop-truncation-compil.patch ================================================ From 186f5ff69e29e0b1add523bb03462a690b2348c0 Mon Sep 17 00:00:00 2001 From: Andrey Zhizhikin <andrey.z@gmail.com> Date: Wed, 11 Dec 2019 08:01:09 +0000 Subject: [PATCH 04/12] tools lib api fs: Fix gcc9 stringop-truncation compilation error GCC9 introduced string hardening mechanisms, which exhibits the error during fs api compilation: error: '__builtin_strncpy' specified bound 4096 equals destination size [-Werror=stringop-truncation] This comes when the length of copy passed to strncpy is is equal to destination size, which could potentially lead to buffer overflow. There is a need to mitigate this potential issue by limiting the size of destination by 1 and explicitly terminate the destination with NULL. Signed-off-by: Andrey Zhizhikin <andrey.zhizhikin@leica-geosystems.com> Reviewed-by: Petr Mladek <pmladek@suse.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: Alexei Starovoitov <ast@kernel.org> Cc: Andrii Nakryiko <andriin@fb.com> Cc: Daniel Borkmann <daniel@iogearbox.net> Cc: Kefeng Wang <wangkefeng.wang@huawei.com> Cc: Martin KaFai Lau <kafai@fb.com> Cc: Petr Mladek <pmladek@suse.com> Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com> Cc: Song Liu <songliubraving@fb.com> Cc: Yonghong Song <yhs@fb.com> Cc: bpf@vger.kernel.org Cc: netdev@vger.kernel.org Link: http://lore.kernel.org/lkml/20191211080109.18765-1-andrey.zhizhikin@leica-geosystems.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/lib/api/fs/fs.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/lib/api/fs/fs.c b/tools/lib/api/fs/fs.c index 459599d1b6c4..58f05748dd39 100644 --- a/tools/lib/api/fs/fs.c +++ b/tools/lib/api/fs/fs.c @@ -179,6 +179,7 @@ static bool fs__env_override(struct fs *fs) size_t name_len = strlen(fs->name); /* name + "_PATH" + '\0' */ char upper_name[name_len + 5 + 1]; + memcpy(upper_name, fs->name, name_len); mem_toupper(upper_name, name_len); strcpy(&upper_name[name_len], "_PATH"); @@ -188,7 +189,8 @@ static bool fs__env_override(struct fs *fs) return false; fs->found = true; - strncpy(fs->path, override_path, sizeof(fs->path)); + strncpy(fs->path, override_path, sizeof(fs->path) - 1); + fs->path[sizeof(fs->path) - 1] = '\0'; return true; } -- 2.27.0 ================================================ FILE: projects/Rockchip/packages/linux/patches/base/0005-Clean-the-new-GCC-9-Wmissing-attributes-warnings.patch ================================================ From 29d83afefdcd388e342ef73ecd7c9afaf4b30186 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy <glex.spb@gmail.com> Date: Mon, 25 Jan 2021 01:06:04 +0000 Subject: [PATCH 05/12] Clean the new GCC 9 -Wmissing-attributes warnings Backport https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0b999ae3614d09d97a1575936bcee884f912b10e Signed-off-by: Gleb Mazovetskiy <glex.spb@gmail.com> --- include/linux/compiler.h | 10 ++++++++++ include/linux/module.h | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/linux/compiler.h b/include/linux/compiler.h index ed772311ec1f..798f1fac3961 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -422,6 +422,16 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s #define __visible #endif +#if defined __has_attribute +# if __has_attribute (__copy__) +# define __copy(symbol) __attribute__((__copy__(symbol))) +# else +# define __copy(symbol) +# endif +#else +# define __copy(symbol) +#endif + /* * Assume alignment of return value. */ diff --git a/include/linux/module.h b/include/linux/module.h index d79e1e55c1d4..4b29f51443f8 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -127,13 +127,13 @@ extern void cleanup_module(void); #define module_init(initfn) \ static inline initcall_t __maybe_unused __inittest(void) \ { return initfn; } \ - int init_module(void) __attribute__((alias(#initfn))); + int init_module(void) __copy(initfn) __attribute__((alias(#initfn))); /* This is only required if you want to be unloadable. */ #define module_exit(exitfn) \ static inline exitcall_t __maybe_unused __exittest(void) \ { return exitfn; } \ - void cleanup_module(void) __attribute__((alias(#exitfn))); + void cleanup_module(void) __copy(exitfn) __attribute__((alias(#exitfn))); #endif -- 2.27.0 ================================================ FILE: projects/Rockchip/packages/linux/patches/base/0006-nf_conntrack_core-Fix-gcc-10-compilation.patch ================================================ From 0ce5411261e152c74a83fba2e29dfc34b6b53480 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy <glex.spb@gmail.com> Date: Mon, 25 Jan 2021 01:13:14 +0000 Subject: [PATCH 06/12] nf_conntrack_core: Fix gcc-10 compilation gcc-10 emits the following error: > warning: array subscript 0 is outside the bounds of an interior zero-length array 'u8[0]' {aka 'unsigned char[0]'} [-Wzero-length-bounds] Based on https://lkml.org/lkml/2020/4/30/1476 Signed-off-by: Gleb Mazovetskiy <glex.spb@gmail.com> --- include/net/netfilter/nf_conntrack.h | 2 +- net/netfilter/nf_conntrack_core.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h index fde4068eec0b..c818597b71e6 100644 --- a/include/net/netfilter/nf_conntrack.h +++ b/include/net/netfilter/nf_conntrack.h @@ -98,7 +98,7 @@ struct nf_conn { possible_net_t ct_net; /* all members below initialized via memset */ - u8 __nfct_init_offset[0]; + struct { } __nfct_init_offset; /* If we were expected by an expectation, this will be it */ struct nf_conn *master; diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 5f747089024f..3a290456507f 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c @@ -863,9 +863,9 @@ __nf_conntrack_alloc(struct net *net, /* Don't set timer yet: wait for confirmation */ setup_timer(&ct->timeout, death_by_timeout, (unsigned long)ct); write_pnet(&ct->ct_net, net); - memset(&ct->__nfct_init_offset[0], 0, + memset(&ct->__nfct_init_offset, 0, offsetof(struct nf_conn, proto) - - offsetof(struct nf_conn, __nfct_init_offset[0])); + offsetof(struct nf_conn, __nfct_init_offset)); if (zone && nf_ct_zone_add(ct, GFP_ATOMIC, zone) < 0) goto out_free; -- 2.27.0 ================================================ FILE: projects/Rockchip/packages/linux/patches/base/0007-wlcore-debugfs-Remove-unused-variable-res.patch ================================================ From 4e2bc2d535a5257c96bb95ab5f20f1169ea5f0f5 Mon Sep 17 00:00:00 2001 From: Lee Jones <lee.jones@linaro.org> Date: Wed, 26 Aug 2020 10:33:46 +0100 Subject: [PATCH 07/12] wlcore: debugfs: Remove unused variable 'res' Fixes the following W=1 kernel build warning(s): Cc: Kalle Valo <kvalo@codeaurora.org> Cc: "David S. Miller" <davem@davemloft.net> Cc: Jakub Kicinski <kuba@kernel.org> Cc: Luciano Coelho <luciano.coelho@nokia.com> Cc: linux-wireless@vger.kernel.org Cc: netdev@vger.kernel.org Signed-off-by: Lee Jones <lee.jones@linaro.org> Signed-off-by: Kalle Valo <kvalo@codeaurora.org> Link: https://lore.kernel.org/r/20200826093401.1458456-16-lee.jones@linaro.org --- drivers/net/wireless/ti/wlcore/debugfs.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/ti/wlcore/debugfs.h b/drivers/net/wireless/ti/wlcore/debugfs.h index bf14676e6515..bfb79399d40f 100644 --- a/drivers/net/wireless/ti/wlcore/debugfs.h +++ b/drivers/net/wireless/ti/wlcore/debugfs.h @@ -96,13 +96,13 @@ static ssize_t sub## _ ##name## _read(struct file *file, \ struct wl1271 *wl = file->private_data; \ struct struct_type *stats = wl->stats.fw_stats; \ char buf[DEBUGFS_FORMAT_BUFFER_SIZE] = ""; \ - int res, i; \ + int i; \ \ wl1271_debugfs_update_stats(wl); \ \ for (i = 0; i < len; i++) \ - res = snprintf(buf, sizeof(buf), "%s[%d] = %d\n", \ - buf, i, stats->sub.name[i]); \ + snprintf(buf, sizeof(buf), "%s[%d] = %d\n", \ + buf, i, stats->sub.name[i]); \ \ return wl1271_format_buffer(userbuf, count, ppos, "%s", buf); \ } \ -- 2.27.0 ================================================ FILE: projects/Rockchip/packages/linux/patches/base/0008-usb-ehci-avoid-gcc-10-zero-length-bounds-warning.patch ================================================ From 7eae4ba5981e9aa787b1fb6580f6cd4682b383de Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy <glex.spb@gmail.com> Date: Mon, 25 Jan 2021 01:29:37 +0000 Subject: [PATCH 08/12] usb: ehci: avoid gcc-10 zero-length-bounds warning Backport of https://lkml.org/lkml/2020/4/30/1475 Signed-off-by: Gleb Mazovetskiy <glex.spb@gmail.com> --- include/linux/usb/ehci_def.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/include/linux/usb/ehci_def.h b/include/linux/usb/ehci_def.h index e479033bd782..311e37cf7bb5 100644 --- a/include/linux/usb/ehci_def.h +++ b/include/linux/usb/ehci_def.h @@ -126,7 +126,8 @@ struct ehci_regs { #define FLAG_CF (1<<0) /* true: we'll support "high speed" */ /* PORTSC: offset 0x44 */ - u32 port_status[0]; /* up to N_PORTS */ + union { + u32 port_status[9]; /* up to N_PORTS */ /* EHCI 1.1 addendum */ #define PORTSC_SUSPEND_STS_ACK 0 #define PORTSC_SUSPEND_STS_NYET 1 @@ -164,7 +165,8 @@ struct ehci_regs { #define PORT_CONNECT (1<<0) /* device connected */ #define PORT_RWC_BITS (PORT_CSC | PORT_PEC | PORT_OCC) - u32 reserved3[9]; + u32 reserved3[9]; + }; /* USBMODE: offset 0x68 */ u32 usbmode; /* USB Device mode */ @@ -180,11 +182,13 @@ struct ehci_regs { * PORTSCx */ /* HOSTPC: offset 0x84 */ - u32 hostpc[0]; /* HOSTPC extension */ + union { + u32 hostpc[17]; /* HOSTPC extension */ #define HOSTPC_PHCD (1<<22) /* Phy clock disable */ #define HOSTPC_PSPD (3<<25) /* Port speed detection */ - u32 reserved5[17]; + u32 reserved5[17]; + }; /* USBMODE_EX: offset 0xc8 */ u32 usbmode_ex; /* USB Device mode extension */ -- 2.27.0 ================================================ FILE: projects/Rockchip/packages/linux/patches/base/0009-gcc-10-warnings-fix-low-hanging-fruit.patch ================================================ From 6fb2704ccabaede891301b7cae81054d63b09a52 Mon Sep 17 00:00:00 2001 From: Linus Torvalds <torvalds@linux-foundation.org> Date: Mon, 4 May 2020 09:16:37 -0700 Subject: [PATCH 09/12] gcc-10 warnings: fix low-hanging fruit Backport of 9d82973e032e246ff5663c9805fbb5407ae932e3 Original description below --- Due to a bug-report that was compiler-dependent, I updated one of my machines to gcc-10. That shows a lot of new warnings. Happily they seem to be mostly the valid kind, but it's going to cause a round of churn for getting rid of them.. This is the really low-hanging fruit of removing a couple of zero-sized arrays in some core code. We have had a round of these patches before, and we'll have many more coming, and there is nothing special about these except that they were particularly trivial, and triggered more warnings than most. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> --- include/linux/fs.h | 2 +- include/linux/tty.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/linux/fs.h b/include/linux/fs.h index c0f76c97359c..d036da45899f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -938,7 +938,7 @@ struct file_handle { __u32 handle_bytes; int handle_type; /* file identifier */ - unsigned char f_handle[0]; + unsigned char f_handle[]; }; static inline struct file *get_file(struct file *f) diff --git a/include/linux/tty.h b/include/linux/tty.h index bac8e6dc8689..f1e422acfda8 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -64,7 +64,7 @@ struct tty_buffer { int read; int flags; /* Data points here */ - unsigned long data[0]; + unsigned long data[]; }; /* Values for .flags field of tty_buffer */ -- 2.27.0 ================================================ FILE: projects/Rockchip/packages/linux/patches/base/0010-Fix-joystick-analog.c-GCC-10-Wrestrict-warning.patch ================================================ From e76f457cdfe034aa6618e445381e4a9f77807a8d Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy <glex.spb@gmail.com> Date: Mon, 25 Jan 2021 02:30:53 +0000 Subject: [PATCH 10/12] Fix joystick/analog.c GCC-10 -Wrestrict warning drivers/input/joystick/analog.c: In function 'analog_connect': drivers/input/joystick/analog.c:444:3: warning: 'snprintf' argument 4 overlaps destination object '<unknown>' [-Wrestrict] error, forbidden warning:analog.c:444 444 | snprintf(analog->name, sizeof(analog->name), "%s %d-hat", | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 445 | analog->name, hweight16(analog->mask & ANALOG_HATS_ALL)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Signed-off-by: Gleb Mazovetskiy <glex.spb@gmail.com> --- drivers/input/joystick/analog.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/input/joystick/analog.c b/drivers/input/joystick/analog.c index 6f8b084e13d0..1e7e29fa47c5 100644 --- a/drivers/input/joystick/analog.c +++ b/drivers/input/joystick/analog.c @@ -440,9 +440,11 @@ static void analog_name(struct analog *analog) hweight8(analog->mask & ANALOG_BTNS_STD) + !!(analog->mask & ANALOG_BTNS_CHF) * 2 + hweight16(analog->mask & ANALOG_BTNS_GAMEPAD) + !!(analog->mask & ANALOG_HBTN_CHF) * 4); - if (analog->mask & ANALOG_HATS_ALL) - snprintf(analog->name, sizeof(analog->name), "%s %d-hat", - analog->name, hweight16(analog->mask & ANALOG_HATS_ALL)); + if (analog->mask & ANALOG_HATS_ALL) { + size_t len = strnlen(analog->name, sizeof(analog->name)); + snprintf(analog->name + len, sizeof(analog->name) - len, " %d-hat", + hweight16(analog->mask & ANALOG_HATS_ALL)); + } if (analog->mask & ANALOG_HAT_FCS) strlcat(analog->name, " FCS", sizeof(analog->name)); -- 2.27.0 ================================================ FILE: projects/Rockchip/packages/linux/patches/base/0011-drivers-net-phy-mdio_bus-Fix-gcc-10-Wrestrict.patch ================================================ From c7c2392bf7c16ed73b043ba9726ac905845eebfb Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy <glex.spb@gmail.com> Date: Mon, 25 Jan 2021 02:36:54 +0000 Subject: [PATCH 11/12] drivers/net/phy/mdio_bus: Fix gcc-10 -Wrestrict Fixes drivers/net/phy/mdio_bus.c: In function 'phy_registers_show': drivers/net/phy/mdio_bus.c:665:3: warning: 'sprintf' argument 3 overlaps destination object 'buf' [-Wrestrict] error, forbidden warning:mdio_bus.c:665 665 | sprintf(buf, "%s%2d: 0x%x\n", buf, index, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | phy_read(phydev, index)); | ~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/phy/mdio_bus.c:659:77: note: destination object referenced by 'restrict'-qualified argument 1 was declared here 659 | phy_registers_show(struct device *dev, struct device_attribute *attr, char *buf) | ~~~~~~^~~ Signed-off-by: Gleb Mazovetskiy <glex.spb@gmail.com> --- drivers/net/phy/mdio_bus.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index d079ac58c7da..f20c0e31cb45 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -661,9 +661,12 @@ phy_registers_show(struct device *dev, struct device_attribute *attr, char *buf) struct phy_device *phydev = to_phy_device(dev); int index; - for (index = 0; index < 32; index++) - sprintf(buf, "%s%2d: 0x%x\n", buf, index, + char tmp[50]; + for (index = 0; index < 32; index++) { + snprintf(tmp, sizeof(tmp), "%2d: 0x%x\n", index, phy_read(phydev, index)); + strcat(buf, tmp); + } return strlen(buf); } -- 2.27.0 ================================================ FILE: projects/Rockchip/packages/linux/patches/base/0012-drivers-net-wireless-Fix-gcc-10-Wrestrict.patch ================================================ From e14af2d999d873c32d922fe39c72ba4b6e86b3f0 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy <glex.spb@gmail.com> Date: Mon, 25 Jan 2021 02:45:24 +0000 Subject: [PATCH 12/12] drivers/net/wireless: Fix gcc-10 -Wrestrict Fixes errors such as: drivers/net/wireless/rtl8821cu/os_dep/linux/ioctl_mp.c: In function 'rtw_mp_txpower_index': drivers/net/wireless/rtl8821cu/os_dep/linux/ioctl_mp.c:573:4: warning: 'sprintf' argument 3 overlaps destination object 'extra' [-Wrestrict] error, forbidden warning:ioctl_mp.c:573 573 | sprintf(extra, "%s,pathb=%d", extra, txpower_inx); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/wireless/rtl8821cu/os_dep/linux/ioctl_mp.c:546:34: note: destination object referenced by 'restrict'-qualified argument 1 was declared here 546 | struct iw_point *wrqu, char *extra) | ~~~~~~^~~~~ Signed-off-by: Gleb Mazovetskiy <glex.spb@gmail.com> --- drivers/net/wireless/ew-7611ulb/core/rtw_mp.c | 19 ++- .../ew-7611ulb/os_dep/linux/ioctl_mp.c | 14 +- .../rockchip_wlan/rtl8188eu/core/rtw_mp.c | 19 ++- .../rtl8188eu/os_dep/linux/ioctl_linux.c | 145 +++++++++--------- .../rtl8188eu/os_dep/linux/ioctl_mp.c | 127 +++++++-------- .../rockchip_wlan/rtl8188fu/core/rtw_mp.c | 4 +- .../rtl8188fu/os_dep/linux/ioctl_linux.c | 131 ++++++++-------- .../rtl8188fu/os_dep/linux/ioctl_mp.c | 126 +++++++-------- .../rockchip_wlan/rtl8189es/core/rtw_mp.c | 4 +- .../rtl8189es/os_dep/linux/ioctl_linux.c | 133 ++++++++-------- .../rtl8189es/os_dep/linux/ioctl_mp.c | 126 +++++++-------- .../rockchip_wlan/rtl8189fs/core/rtw_mp.c | 19 ++- .../rtl8189fs/os_dep/linux/ioctl_mp.c | 17 +- .../rockchip_wlan/rtl8723bs/core/rtw_mp.c | 19 ++- .../rtl8723bs/os_dep/linux/ioctl_mp.c | 17 +- .../rockchip_wlan/rtl8723bu/core/rtw_mp.c | 4 +- .../rtl8723bu/os_dep/linux/ioctl_linux.c | 129 ++++++++-------- .../rtl8723bu/os_dep/linux/ioctl_mp.c | 128 ++++++++-------- .../rockchip_wlan/rtl8723cs/core/rtw_mp.c | 19 ++- .../rtl8723cs/os_dep/linux/ioctl_linux.c | 145 +++++++++--------- .../rtl8723cs/os_dep/linux/ioctl_mp.c | 127 +++++++-------- .../rockchip_wlan/rtl8723ds/core/rtw_mp.c | 19 ++- .../rtl8723ds/os_dep/linux/ioctl_mp.c | 24 +-- .../rockchip_wlan/rtl8822be/core/rtw_mp.c | 19 ++- .../rtl8822be/os_dep/linux/ioctl_linux.c | 139 +++++++++-------- .../rtl8822be/os_dep/linux/ioctl_mp.c | 122 ++++++++------- drivers/net/wireless/rtl8192cu/core/rtw_mp.c | 4 +- .../rtl8192cu/os_dep/linux/ioctl_linux.c | 67 ++++---- drivers/net/wireless/rtl8812au/core/rtw_mp.c | 4 +- .../rtl8812au/os_dep/linux/ioctl_linux.c | 138 +++++++++-------- drivers/net/wireless/rtl8821cu/core/rtw_mp.c | 19 ++- .../rtl8821cu/os_dep/linux/ioctl_mp.c | 27 ++-- drivers/net/wireless/rtl88x2bu/core/rtw_mp.c | 19 ++- .../rtl88x2bu/os_dep/linux/ioctl_mp.c | 14 +- drivers/net/wireless/ti/wlcore/boot.c | 9 +- drivers/net/wireless/ti/wlcore/debugfs.h | 5 +- 36 files changed, 1129 insertions(+), 972 deletions(-) diff --git a/drivers/net/wireless/ew-7611ulb/core/rtw_mp.c b/drivers/net/wireless/ew-7611ulb/core/rtw_mp.c index a16da9b60103..39384d584f38 100644 --- a/drivers/net/wireless/ew-7611ulb/core/rtw_mp.c +++ b/drivers/net/wireless/ew-7611ulb/core/rtw_mp.c @@ -2093,14 +2093,17 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) data[0] = '\0'; - i = psd_start; - while (i < psd_stop) { - if (i >= psd_pts) - psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); - else - psd_data = rtw_GetPSDData(pAdapter, i); - sprintf(data, "%s%x ", data, psd_data); - i++; + { + size_t extra_len = strlen(data); + i = psd_start; + while (i < psd_stop) { + if (i >= psd_pts) + psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); + else + psd_data = rtw_GetPSDData(pAdapter, i); + extra_len += sprintf(data + extra_len, "%x ", psd_data); + i++; + } } #ifdef CONFIG_LONG_DELAY_ISSUE diff --git a/drivers/net/wireless/ew-7611ulb/os_dep/linux/ioctl_mp.c b/drivers/net/wireless/ew-7611ulb/os_dep/linux/ioctl_mp.c index ad2bb026739a..179d08d72e7f 100644 --- a/drivers/net/wireless/ew-7611ulb/os_dep/linux/ioctl_mp.c +++ b/drivers/net/wireless/ew-7611ulb/os_dep/linux/ioctl_mp.c @@ -1719,7 +1719,7 @@ int rtw_mp_tx(struct net_device *dev, char *pextra = extra; RTW_INFO("Got format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + pextra += sprintf(pextra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->current_channel = channel; @@ -2074,6 +2074,7 @@ int rtw_efuse_mask_file(struct net_device *dev, u8 count = 0; u8 i = 0; u32 datalen = 0; + size_t extra_len; ptmp = extra; pch = strsep(&ptmp, ","); @@ -2099,12 +2100,13 @@ int rtw_efuse_mask_file(struct net_device *dev, } while (count < 64); + extra_len = strlen(extra); for (i = 0; i < count; i++) - sprintf(extra, "%s:%02x", extra, maskfileBuffer[i]); + extra_len += sprintf(extra + extra_len, ":%02x", maskfileBuffer[i]); padapter->registrypriv.bFileMaskEfuse = _TRUE; - sprintf(extra, "%s\nLoad Efuse Mask data %d hex ok\n", extra, count); + extra_len += sprintf(extra + extra_len, "\nLoad Efuse Mask data %d hex ok\n", count); wrqu->data.length = strlen(extra); return 0; } @@ -2522,16 +2524,18 @@ todo: mptbt_BtControlProcess(padapter, &BtReq); if (readtherm == 0) { + size_t extra_len; sprintf(extra, "BT thermal="); for (i = 4; i < pMptCtx->mptOutLen; i++) { if ((pMptCtx->mptOutBuf[i] == 0x00) && (pMptCtx->mptOutBuf[i + 1] == 0x00)) goto exit; - sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i] & 0x1f)); + extra_len += sprintf(extra + extra_len, " %d ", (pMptCtx->mptOutBuf[i] & 0x1f)); } } else { + size_t extra_len; for (i = 4; i < pMptCtx->mptOutLen; i++) - sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]); + extra_len += sprintf(extra + extra_len, " 0x%x ", pMptCtx->mptOutBuf[i]); } exit: diff --git a/drivers/net/wireless/rockchip_wlan/rtl8188eu/core/rtw_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8188eu/core/rtw_mp.c index ec39412959b0..a7658d4e8e76 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8188eu/core/rtw_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8188eu/core/rtw_mp.c @@ -2119,14 +2119,17 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) data[0] = '\0'; - i = psd_start; - while (i < psd_stop) { - if (i >= psd_pts) - psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); - else - psd_data = rtw_GetPSDData(pAdapter, i); - sprintf(data, "%s%x ", data, psd_data); - i++; + { + size_t extra_len = strlen(data); + i = psd_start; + while (i < psd_stop) { + if (i >= psd_pts) + psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); + else + psd_data = rtw_GetPSDData(pAdapter, i); + extra_len += sprintf(data + extra_len, "%x ", psd_data); + i++; + } } #ifdef CONFIG_LONG_DELAY_ISSUE diff --git a/drivers/net/wireless/rockchip_wlan/rtl8188eu/os_dep/linux/ioctl_linux.c b/drivers/net/wireless/rockchip_wlan/rtl8188eu/os_dep/linux/ioctl_linux.c index 5537ead019c2..99ef17400999 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8188eu/os_dep/linux/ioctl_linux.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8188eu/os_dep/linux/ioctl_linux.c @@ -9034,6 +9034,7 @@ static int rtw_mp_efuse_get(struct net_device *dev, u16 mask_len; u8 mask_buf[64] = ""; int err; + size_t extra_len; #ifdef CONFIG_IOL u8 org_fw_iol = padapter->registrypriv.fw_iol;/* 0:Disable, 1:enable, 2:by usb speed */ #endif @@ -9108,18 +9109,18 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else drvmaporder = 0; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < cnt; i += 16) { - sprintf(extra, "%s0x%02x\t", extra, shift + i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", shift + i); for (j = 0; j < 8; j++) - sprintf(extra, "%s%02X ", extra, efuse[i + j]); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i + j]); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) - sprintf(extra, "%s%02X ", extra, efuse[i + j]); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i + j]); + extra_len += sprintf(extra + extra_len, "\n"); } if ((shift + cnt) < mapLen) - sprintf(extra, "%s\t...more (left:%d/%d)\n", extra, mapLen-(shift + cnt), mapLen); + extra_len += sprintf(extra + extra_len, "\t...more (left:%d/%d)\n", mapLen-(shift + cnt), mapLen); } else if (strcmp(tmp[0], "realmap") == 0) { static u8 order = 0; @@ -9158,18 +9159,18 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else order = 0; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < cnt; i += 16) { - sprintf(extra, "%s0x%02x\t", extra, shift + i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", shift + i); for (j = 0; j < 8; j++) - sprintf(extra, "%s%02X ", extra, efuse[i + j]); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i + j]); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) - sprintf(extra, "%s%02X ", extra, efuse[i + j]); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i + j]); + extra_len += sprintf(extra + extra_len, "\n"); } if ((shift + cnt) < mapLen) - sprintf(extra, "%s\t...more (left:%d/%d)\n", extra, mapLen-(shift + cnt), mapLen); + extra_len += sprintf(extra + extra_len, "\t...more (left:%d/%d)\n", mapLen-(shift + cnt), mapLen); } else if (strcmp(tmp[0], "rmap") == 0) { if ((tmp[1] == NULL) || (tmp[2] == NULL)) { RTW_INFO("%s: rmap Fail!! Parameters error!\n", __FUNCTION__); @@ -9204,9 +9205,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, /* RTW_INFO("%s: data={", __FUNCTION__); */ *extra = 0; + extra_len = 0; for (i = 0; i < cnts; i++) { /* RTW_INFO("0x%02x ", data[i]); */ - sprintf(extra, "%s0x%02X ", extra, data[i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", data[i]); } /* RTW_INFO("}\n"); */ } else if (strcmp(tmp[0], "realraw") == 0) { @@ -9235,18 +9237,18 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else raw_order = 0; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < cnt; i += 16) { - sprintf(extra, "%s0x%02x\t", extra, shift + i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", shift + i); for (j = 0; j < 8; j++) - sprintf(extra, "%s%02X ", extra, rawdata[i + j]); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "%02X ", rawdata[i + j]); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) - sprintf(extra, "%s%02X ", extra, rawdata[i + j]); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "%02X ", rawdata[i + j]); + extra_len += sprintf(extra + extra_len, "\n"); } if ((shift + cnt) < mapLen) - sprintf(extra, "%s\t...more (left:%d/%d)\n", extra, mapLen-(shift + cnt), mapLen); + extra_len += sprintf(extra + extra_len, "\t...more (left:%d/%d)\n", mapLen-(shift + cnt), mapLen); } else if (strcmp(tmp[0], "btrealraw") == 0) { static u8 bt_raw_order = 0; @@ -9282,18 +9284,18 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else bt_raw_order = 0; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < cnt; i += 16) { - sprintf(extra, "%s0x%02x\t", extra, shift + i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", shift + i); for (j = 0; j < 8; j++) - sprintf(extra, "%s%02X ", extra, rawdata[i + j]); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "%02X ", rawdata[i + j]); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) - sprintf(extra, "%s%02X ", extra, rawdata[i + j]); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "%02X ", rawdata[i + j]); + extra_len += sprintf(extra + extra_len, "\n"); } if ((shift + cnt) < mapLen) - sprintf(extra, "%s\t...more (left:%d/%d)\n", extra, mapLen-(shift + cnt), mapLen); + extra_len += sprintf(extra + extra_len, "\t...more (left:%d/%d)\n", mapLen-(shift + cnt), mapLen); } else if (strcmp(tmp[0], "mac") == 0) { if (hal_efuse_macaddr_offset(padapter) == -1) { @@ -9319,12 +9321,13 @@ static int rtw_mp_efuse_get(struct net_device *dev, /* RTW_INFO("%s: MAC address={", __FUNCTION__); */ *extra = 0; + extra_len = 0; for (i = 0; i < cnts; i++) { /* RTW_INFO("%02X", data[i]); */ - sprintf(extra, "%s%02X", extra, data[i]); + extra_len += sprintf(extra + extra_len, "%02X", data[i]); if (i != (cnts - 1)) { /* RTW_INFO(":"); */ - sprintf(extra, "%s:", extra); + extra_len += sprintf(extra + extra_len, ":"); } } /* RTW_INFO("}\n"); */ @@ -9382,12 +9385,13 @@ static int rtw_mp_efuse_get(struct net_device *dev, /* RTW_INFO("%s: {VID,PID}={", __FUNCTION__); */ *extra = 0; + extra_len = 0; for (i = 0; i < cnts; i++) { /* RTW_INFO("0x%02x", data[i]); */ - sprintf(extra, "%s0x%02X", extra, data[i]); + extra_len += sprintf(extra + extra_len, "0x%02X", data[i]); if (i != (cnts - 1)) { /* RTW_INFO(","); */ - sprintf(extra, "%s,", extra); + extra_len += sprintf(extra + extra_len, ","); } } /* RTW_INFO("}\n"); */ @@ -9415,22 +9419,22 @@ static int rtw_mp_efuse_get(struct net_device *dev, } /* RTW_INFO("OFFSET\tVALUE(hex)\n"); */ - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < 512; i += 16) { /* set 512 because the iwpriv's extra size have limit 0x7FF */ /* RTW_INFO("0x%03x\t", i); */ - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j = 0; j < 8; j++) { /* RTW_INFO("%02X ", pEfuseHal->BTEfuseInitMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i + j]); } /* RTW_INFO("\t"); */ - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) { /* RTW_INFO("%02X ", pEfuseHal->BTEfuseInitMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i + j]); } /* RTW_INFO("\n"); */ - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } /* RTW_INFO("\n"); */ } else if (strcmp(tmp[0], "btbmap") == 0) { @@ -9444,22 +9448,22 @@ static int rtw_mp_efuse_get(struct net_device *dev, } /* RTW_INFO("OFFSET\tVALUE(hex)\n"); */ - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 512; i < 1024 ; i += 16) { /* RTW_INFO("0x%03x\t", i); */ - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j = 0; j < 8; j++) { /* RTW_INFO("%02X ", data[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i + j]); } /* RTW_INFO("\t"); */ - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) { /* RTW_INFO("%02X ", data[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i + j]); } /* RTW_INFO("\n"); */ - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } /* RTW_INFO("\n"); */ } else if (strcmp(tmp[0], "btrmap") == 0) { @@ -9507,51 +9511,52 @@ static int rtw_mp_efuse_get(struct net_device *dev, } *extra = 0; + extra_len = 0; /* RTW_INFO("%s: bt efuse data={", __FUNCTION__); */ for (i = 0; i < cnts; i++) { /* RTW_INFO("0x%02x ", data[i]); */ - sprintf(extra, "%s 0x%02X ", extra, data[i]); + extra_len += sprintf(extra + extra_len, " 0x%02X ", data[i]); } /* RTW_INFO("}\n"); */ RTW_INFO(FUNC_ADPT_FMT ": BT MAC=[%s]\n", FUNC_ADPT_ARG(padapter), extra); } else if (strcmp(tmp[0], "btffake") == 0) { /* RTW_INFO("OFFSET\tVALUE(hex)\n"); */ - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < 512; i += 16) { /* RTW_INFO("0x%03x\t", i); */ - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j = 0; j < 8; j++) { /* RTW_INFO("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i + j]); } /* RTW_INFO("\t"); */ - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) { /* RTW_INFO("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i + j]); } /* RTW_INFO("\n"); */ - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } /* RTW_INFO("\n"); */ } else if (strcmp(tmp[0], "btbfake") == 0) { /* RTW_INFO("OFFSET\tVALUE(hex)\n"); */ - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 512; i < 1024; i += 16) { /* RTW_INFO("0x%03x\t", i); */ - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j = 0; j < 8; j++) { /* RTW_INFO("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i + j]); } /* RTW_INFO("\t"); */ - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) { /* RTW_INFO("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i + j]); } /* RTW_INFO("\n"); */ - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } /* RTW_INFO("\n"); */ } else if (strcmp(tmp[0], "wlrfkmap") == 0) { @@ -9572,18 +9577,18 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else fk_order = 0; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < cnt; i += 16) { - sprintf(extra, "%s0x%02x\t", extra, shift + i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", shift + i); for (j = 0; j < 8; j++) - sprintf(extra, "%s%02X ", extra, efuse[i + j]); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i + j]); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) - sprintf(extra, "%s%02X ", extra, efuse[i + j]); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i + j]); + extra_len += sprintf(extra + extra_len, "\n"); } if ((shift + cnt) < mapLen) - sprintf(extra, "%s\t...more\n", extra); + extra_len += sprintf(extra + extra_len, "\t...more\n"); } else if (strcmp(tmp[0], "wlrfkrmap") == 0) { if ((tmp[1] == NULL) || (tmp[2] == NULL)) { @@ -9605,9 +9610,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, /* RTW_INFO("%s: data={", __FUNCTION__); */ *extra = 0; + extra_len = 0; for (i = 0; i < cnts; i++) { RTW_INFO("wlrfkrmap = 0x%02x\n", pEfuseHal->fakeEfuseModifiedMap[addr + i]); - sprintf(extra, "%s0x%02X ", extra, pEfuseHal->fakeEfuseModifiedMap[addr + i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", pEfuseHal->fakeEfuseModifiedMap[addr + i]); } } else if (strcmp(tmp[0], "btrfkrmap") == 0) { if ((tmp[1] == NULL) || (tmp[2] == NULL)) { @@ -9629,9 +9635,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, /* RTW_INFO("%s: data={", __FUNCTION__); */ *extra = 0; + extra_len = 0; for (i = 0; i < cnts; i++) { RTW_INFO("wlrfkrmap = 0x%02x\n", pEfuseHal->fakeBTEfuseModifiedMap[addr + i]); - sprintf(extra, "%s0x%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[addr + i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", pEfuseHal->fakeBTEfuseModifiedMap[addr + i]); } } else if (strcmp(tmp[0], "mask") == 0) { *extra = 0; @@ -9641,9 +9648,9 @@ static int rtw_mp_efuse_get(struct net_device *dev, if (padapter->registrypriv.bFileMaskEfuse == _TRUE) _rtw_memcpy(mask_buf, maskfileBuffer, mask_len); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < mask_len; i++) - sprintf(extra, "%s0x%02X\n", extra, mask_buf[i]); + extra_len += sprintf(extra + extra_len, "0x%02X\n", mask_buf[i]); } else sprintf(extra, "Command not found!"); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8188eu/os_dep/linux/ioctl_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8188eu/os_dep/linux/ioctl_mp.c index b7109f9a81d1..b0c108e574b7 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8188eu/os_dep/linux/ioctl_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8188eu/os_dep/linux/ioctl_mp.c @@ -198,7 +198,7 @@ int rtw_mp_read_reg(struct net_device *dev, if (*pnext != '\0') { /*strtout = simple_strtoul(pnext , &ptmp, 16);*/ ret = sscanf(pnext, "%x", &strtout); - sprintf(extra, "%s %d" , extra , strtout); + sprintf(extra + strlen(extra), " %d", strtout); } else break; pch = pnext; @@ -230,7 +230,7 @@ int rtw_mp_read_reg(struct net_device *dev, pnext++; if (*pnext != '\0') { ret = sscanf(pnext, "%x", &strtout); - sprintf(extra, "%s %d" , extra , strtout); + sprintf(extra + strlen(extra), " %d", strtout); } else break; pch = pnext; @@ -341,20 +341,23 @@ int rtw_mp_read_rf(struct net_device *dev, pch = tmp; RTW_INFO("pch=%s", pch); - while (*pch != '\0') { - pnext = strpbrk(pch, " "); - if (!pnext) - break; - pnext++; - if (*pnext != '\0') { - /*strtou =simple_strtoul(pnext , &ptmp, 16);*/ - ret = sscanf(pnext, "%x", &strtou); - sprintf(extra, "%s %d" , extra , strtou); - } else - break; - pch = pnext; + { + size_t extra_len = strlen(extra); + while (*pch != '\0') { + pnext = strpbrk(pch, " "); + if (!pnext) + break; + pnext++; + if (*pnext != '\0') { + /*strtou =simple_strtoul(pnext , &ptmp, 16);*/ + ret = sscanf(pnext, "%x", &strtou); + extra_len += sprintf(extra + extra_len, " %d", strtou); + } else + break; + pch = pnext; + } + wrqu->length = extra_len; } - wrqu->length = strlen(extra); return 0; } @@ -1417,7 +1420,7 @@ int rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra) pmp_priv->mode = MP_ON; sprintf(extra, "Stop continuous Tx"); } else if (pmp_priv->tx.stop == 1) { - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500 count=%u\n", extra, pmp_priv->tx.count); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500 count=%u\n", pmp_priv->tx.count); pmp_priv->tx.stop = 0; SetPacketTx(padapter); } else @@ -1425,26 +1428,26 @@ int rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra) return 0; case MP_SINGLE_TONE_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetSingleToneTx(padapter, (u8)bStartTest); break; case MP_CONTINUOUS_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetContinuousTx(padapter, (u8)bStartTest); break; case MP_CARRIER_SUPPRISSION_TX: if (bStartTest != 0) { if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_11M) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); else - sprintf(extra, "%s\nSpecify carrier suppression but not CCK rate", extra); + sprintf(extra + strlen(extra), "\nSpecify carrier suppression but not CCK rate"); } SetCarrierSuppressionTx(padapter, (u8)bStartTest); break; case MP_SINGLE_CARRIER_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetSingleCarrierTx(padapter, (u8)bStartTest); break; @@ -1496,6 +1499,7 @@ int rtw_mp_tx(struct net_device *dev, u32 bandwidth = 0, sg = 0, channel = 6, txpower = 40, rate = 108, ant = 0, txmode = 1, count = 0; u8 i = 0, j = 0, bStartTest = 1, status = 0, Idx = 0, tmpU1B = 0; u16 antenna = 0; + size_t extra_len; if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length)) return -EFAULT; @@ -1522,13 +1526,13 @@ int rtw_mp_tx(struct net_device *dev, return 0; } else if (strncmp(extra, "setting", 7) == 0) { _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Current Setting :\n Channel:%d", pmp_priv->channel); - sprintf(extra, "%s\n Bandwidth:%d", extra, pmp_priv->bandwidth); - sprintf(extra, "%s\n Rate index:%d", extra, pmp_priv->rateidx); - sprintf(extra, "%s\n TxPower index:%d", extra, pmp_priv->txpoweridx); - sprintf(extra, "%s\n Antenna TxPath:%d", extra, pmp_priv->antenna_tx); - sprintf(extra, "%s\n Antenna RxPath:%d", extra, pmp_priv->antenna_rx); - sprintf(extra, "%s\n MP Mode:%d", extra, pmp_priv->mode); + extra_len = sprintf(extra, "Current Setting :\n Channel:%d", pmp_priv->channel); + extra_len += sprintf(extra + extra_len, "\n Bandwidth:%d", pmp_priv->bandwidth); + extra_len += sprintf(extra + extra_len, "\n Rate index:%d", pmp_priv->rateidx); + extra_len += sprintf(extra + extra_len, "\n TxPower index:%d", pmp_priv->txpoweridx); + extra_len += sprintf(extra + extra_len, "\n Antenna TxPath:%d", pmp_priv->antenna_tx); + extra_len += sprintf(extra + extra_len, "\n Antenna RxPath:%d", pmp_priv->antenna_rx); + extra_len += sprintf(extra + extra_len, "\n MP Mode:%d", pmp_priv->mode); wrqu->data.length = strlen(extra); return 0; #ifdef CONFIG_MP_VHT_HW_TX_MODE @@ -1666,25 +1670,25 @@ int rtw_mp_tx(struct net_device *dev, if (sscanf(extra, "ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d", &channel, &bandwidth, &rate, &txpower, &ant, &txmode) < 6) { RTW_INFO("Invalid format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "\n Please input correct format as bleow:\n"); - sprintf(extra, "%s\t ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d\n", extra, channel, bandwidth, rate, txpower, ant, txmode); - sprintf(extra, "%s\n [ ch : BGN = <1~14> , A or AC = <36~165> ]", extra); - sprintf(extra, "%s\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]", extra); - sprintf(extra, "%s\n [ rate : CCK: 1 2 5.5 11M X 2 = < 2 4 11 22 >]", extra); - sprintf(extra, "%s\n [ OFDM: 6 9 12 18 24 36 48 54M X 2 = < 12 18 24 36 48 72 96 108>", extra); - sprintf(extra, "%s\n [ HT 1S2SS MCS0 ~ MCS15 : < [MCS0]=128 ~ [MCS7]=135 ~ [MCS15]=143 >", extra); - sprintf(extra, "%s\n [ HT 3SS MCS16 ~ MCS32 : < [MCS16]=144 ~ [MCS23]=151 ~ [MCS32]=159 >", extra); - sprintf(extra, "%s\n [ VHT 1SS MCS0 ~ MCS9 : < [MCS0]=160 ~ [MCS9]=169 >", extra); - sprintf(extra, "%s\n [ txpower : 1~63 power index", extra); - sprintf(extra, "%s\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12", extra); - sprintf(extra, "%s\n [ txmode : < 0 = CONTINUOUS_TX, 1 = PACKET_TX, 2 = SINGLE_TONE_TX, 3 = CARRIER_SUPPRISSION_TX, 4 = SINGLE_CARRIER_TX>\n", extra); + extra_len = sprintf(extra, "\n Please input correct format as bleow:\n"); + extra_len += sprintf(extra + extra_len, "\t ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d\n", channel, bandwidth, rate, txpower, ant, txmode); + extra_len += sprintf(extra + extra_len, "\n [ ch : BGN = <1~14> , A or AC = <36~165> ]"); + extra_len += sprintf(extra + extra_len, "\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]"); + extra_len += sprintf(extra + extra_len, "\n [ rate : CCK: 1 2 5.5 11M X 2 = < 2 4 11 22 >]"); + extra_len += sprintf(extra + extra_len, "\n [ OFDM: 6 9 12 18 24 36 48 54M X 2 = < 12 18 24 36 48 72 96 108>"); + extra_len += sprintf(extra + extra_len, "\n [ HT 1S2SS MCS0 ~ MCS15 : < [MCS0]=128 ~ [MCS7]=135 ~ [MCS15]=143 >"); + extra_len += sprintf(extra + extra_len, "\n [ HT 3SS MCS16 ~ MCS32 : < [MCS16]=144 ~ [MCS23]=151 ~ [MCS32]=159 >"); + extra_len += sprintf(extra + extra_len, "\n [ VHT 1SS MCS0 ~ MCS9 : < [MCS0]=160 ~ [MCS9]=169 >"); + extra_len += sprintf(extra + extra_len, "\n [ txpower : 1~63 power index"); + extra_len += sprintf(extra + extra_len, "\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12"); + extra_len += sprintf(extra + extra_len, "\n [ txmode : < 0 = CONTINUOUS_TX, 1 = PACKET_TX, 2 = SINGLE_TONE_TX, 3 = CARRIER_SUPPRISSION_TX, 4 = SINGLE_CARRIER_TX>\n"); wrqu->data.length = strlen(extra); return status; } else { RTW_INFO("Got format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->current_channel = channel; @@ -1693,13 +1697,13 @@ int rtw_mp_tx(struct net_device *dev, bandwidth = CHANNEL_WIDTH_40; else if (bandwidth == 2) bandwidth = CHANNEL_WIDTH_80; - sprintf(extra, "%s\nChange Current Bandwidth %d to Bandwidth %d", extra, padapter->mppriv.bandwidth , bandwidth); + extra_len += sprintf(extra + extra_len, "\nChange Current Bandwidth %d to Bandwidth %d", padapter->mppriv.bandwidth , bandwidth); padapter->mppriv.bandwidth = (u8)bandwidth; padapter->mppriv.preamble = sg; SetBandwidth(padapter); pHalData->current_channel_bw = bandwidth; - sprintf(extra, "%s\nSet power level :%d", extra, txpower); + extra_len += sprintf(extra + extra_len, "\nSet power level :%d", txpower); padapter->mppriv.txpoweridx = (u8)txpower; pMptCtx->TxPwrLevel[ODM_RF_PATH_A] = (u8)txpower; pMptCtx->TxPwrLevel[ODM_RF_PATH_B] = (u8)txpower; @@ -1722,13 +1726,13 @@ int rtw_mp_tx(struct net_device *dev, RTW_INFO("%s: rate index=%d\n", __func__, rate); if (rate >= MPT_RATE_LAST) return -EINVAL; - sprintf(extra, "%s\nSet data rate to %d index %d", extra, padapter->mppriv.rateidx, rate); + extra_len += sprintf(extra + extra_len, "\nSet data rate to %d index %d", padapter->mppriv.rateidx, rate); padapter->mppriv.rateidx = rate; pMptCtx->mpt_rate_index = rate; SetDataRate(padapter); - sprintf(extra, "%s\nSet Antenna Path :%d", extra, ant); + extra_len += sprintf(extra + extra_len, "\nSet Antenna Path :%d", ant); switch (ant) { case 1: antenna = ANTENNA_A; @@ -1805,6 +1809,7 @@ int rtw_mp_rx(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { + size_t extra_len; PADAPTER padapter = rtw_netdev_priv(dev); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct mp_priv *pmp_priv = &padapter->mppriv; @@ -1836,19 +1841,19 @@ int rtw_mp_rx(struct net_device *dev, } else if (sscanf(extra, "ch=%d,bw=%d,ant=%d", &channel, &bandwidth, &ant) < 3) { RTW_INFO("Invalid format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "\n Please input correct format as bleow:\n"); - sprintf(extra, "%s\t ch=%d,bw=%d,ant=%d\n", extra, channel, bandwidth, ant); - sprintf(extra, "%s\n [ ch : BGN = <1~14> , A or AC = <36~165> ]", extra); - sprintf(extra, "%s\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]", extra); - sprintf(extra, "%s\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12", extra); - wrqu->data.length = strlen(extra); + extra_len = sprintf(extra, "\n Please input correct format as bleow:\n"); + extra_len += sprintf(extra + extra_len, "\t ch=%d,bw=%d,ant=%d\n", channel, bandwidth, ant); + extra_len += sprintf(extra + extra_len, "\n [ ch : BGN = <1~14> , A or AC = <36~165> ]"); + extra_len += sprintf(extra + extra_len, "\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]"); + extra_len += sprintf(extra + extra_len, "\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12"); + wrqu->data.length = extra_len; return 0; } else { bStartRx = 1; RTW_INFO("Got format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->current_channel = channel; @@ -1857,13 +1862,13 @@ int rtw_mp_rx(struct net_device *dev, bandwidth = CHANNEL_WIDTH_40; else if (bandwidth == 2) bandwidth = CHANNEL_WIDTH_80; - sprintf(extra, "%s\nChange Current Bandwidth %d to Bandwidth %d", extra, padapter->mppriv.bandwidth , bandwidth); + extra_len += sprintf(extra + extra_len, "\nChange Current Bandwidth %d to Bandwidth %d", padapter->mppriv.bandwidth , bandwidth); padapter->mppriv.bandwidth = (u8)bandwidth; padapter->mppriv.preamble = sg; SetBandwidth(padapter); pHalData->current_channel_bw = bandwidth; - sprintf(extra, "%s\nSet Antenna Path :%d", extra, ant); + extra_len += sprintf(extra + extra_len, "\nSet Antenna Path :%d", ant); switch (ant) { case 1: antenna = ANTENNA_A; @@ -1914,7 +1919,7 @@ int rtw_mp_rx(struct net_device *dev, pHalData->antenna_tx_path = antenna; SetAntenna(padapter); - sprintf(extra, "%s\nstart Rx", extra); + extra_len += sprintf(extra + extra_len, "\nstart Rx"); SetPacketRx(padapter, bStartRx, _FALSE); } wrqu->data.length = strlen(extra); @@ -1956,6 +1961,7 @@ int rtw_efuse_mask_file(struct net_device *dev, char *rtw_efuse_mask_file_path; u8 Status; PADAPTER padapter = rtw_netdev_priv(dev); + size_t extra_len; _rtw_memset(maskfileBuffer, 0x00, sizeof(maskfileBuffer)); @@ -2006,11 +2012,11 @@ int rtw_efuse_mask_file(struct net_device *dev, } while (count < 64); for (i = 0; i < count; i++) - sprintf(extra, "%s:%02x", extra, maskfileBuffer[i]); + extra_len += sprintf(extra + extra_len, ":%02x", maskfileBuffer[i]); padapter->registrypriv.bFileMaskEfuse = _TRUE; - sprintf(extra, "%s\nLoad Efuse Mask data %d hex ok\n", extra, count); + extra_len += sprintf(extra + extra_len, "\nLoad Efuse Mask data %d hex ok\n", count); wrqu->data.length = strlen(extra); return 0; } @@ -2388,16 +2394,17 @@ todo: mptbt_BtControlProcess(padapter, &BtReq); if (readtherm == 0) { - sprintf(extra, "BT thermal="); + size_t extra_len = sprintf(extra, "BT thermal="); for (i = 4; i < pMptCtx->mptOutLen; i++) { if ((pMptCtx->mptOutBuf[i] == 0x00) && (pMptCtx->mptOutBuf[i + 1] == 0x00)) goto exit; - sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i] & 0x1f)); + extra_len += sprintf(extra + extra_len, " %d ", (pMptCtx->mptOutBuf[i] & 0x1f)); } } else { + size_t extra_len = strlen(extra); for (i = 4; i < pMptCtx->mptOutLen; i++) - sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]); + extra_len += sprintf(extra + extra_len, " 0x%x ", pMptCtx->mptOutBuf[i]); } exit: diff --git a/drivers/net/wireless/rockchip_wlan/rtl8188fu/core/rtw_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8188fu/core/rtw_mp.c index e1a91cf8be4a..2d0d22790a5d 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8188fu/core/rtw_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8188fu/core/rtw_mp.c @@ -1906,7 +1906,7 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) { u32 i, psd_pts=0, psd_start=0, psd_stop=0; u32 psd_data=0; - + size_t data_len = 0; #ifdef PLATFORM_LINUX if (!netif_running(pAdapter->pnetdev)) { @@ -1938,7 +1938,7 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) } else { psd_data = rtw_GetPSDData(pAdapter, i); } - sprintf(data, "%s%x ", data, psd_data); + data_len += sprintf(data + data_len, "%x ", psd_data); i++; } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8188fu/os_dep/linux/ioctl_linux.c b/drivers/net/wireless/rockchip_wlan/rtl8188fu/os_dep/linux/ioctl_linux.c index fa829ba161f5..dbd1a64f0654 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8188fu/os_dep/linux/ioctl_linux.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8188fu/os_dep/linux/ioctl_linux.c @@ -9778,6 +9778,7 @@ static int rtw_mp_efuse_get(struct net_device *dev, #ifdef CONFIG_IOL u8 org_fw_iol = padapter->registrypriv.fw_iol;// 0:Disable, 1:enable, 2:by usb speed #endif + size_t extra_len; wrqu = (struct iw_point*)wdata; pwrctrlpriv = adapter_to_pwrctl(padapter); @@ -9838,23 +9839,23 @@ static int rtw_mp_efuse_get(struct net_device *dev, { mapLen = EFUSE_MAP_SIZE; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < EFUSE_MAP_SIZE; i += 16) { // DBG_871X("0x%02x\t", i); - sprintf(extra, "%s0x%02x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, PROMContent[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", PROMContent[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, PROMContent[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", PROMContent[i+j]); } // DBG_871X("\n"); - sprintf(extra,"%s\n",extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } @@ -9869,23 +9870,23 @@ static int rtw_mp_efuse_get(struct net_device *dev, } // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < EFUSE_MAP_SIZE; i += 16) { // DBG_871X("0x%02x\t", i); - sprintf(extra, "%s0x%02x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeEfuseInitMap[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeEfuseInitMap[i+j]); } // DBG_871X("\n"); - sprintf(extra,"%s\n",extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } @@ -9928,9 +9929,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: data={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { // DBG_871X("0x%02x ", data[i]); - sprintf(extra, "%s0x%02X ", extra, data[i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", data[i]); } // DBG_871X("}\n"); } @@ -9951,17 +9953,17 @@ static int rtw_mp_efuse_get(struct net_device *dev, _rtw_memset(extra,'\0',strlen(extra)); - sprintf(extra, "\n0x00\t"); + extra_len = sprintf(extra, "\n0x00\t"); for (i = 0; i < mapLen ; i++) { - sprintf(extra, "%s%02X", extra, rawdata[i]); + extra_len += sprintf(extra + extra_len, "%02X", rawdata[i]); if ((i & 0xF) == 0xF) { - sprintf(extra, "%s\n", extra); - sprintf(extra, "%s0x%02x\t", extra, i+1); + extra_len += sprintf(extra + extra_len, "\n"); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i+1); } else if ((i & 0x7) == 0x7) { - sprintf(extra, "%s \t", extra); + extra_len += sprintf(extra + extra_len, " \t"); } else { - sprintf(extra, "%s ", extra); + extra_len += sprintf(extra + extra_len, " "); } } @@ -9977,22 +9979,22 @@ static int rtw_mp_efuse_get(struct net_device *dev, } _rtw_memset(extra,'\0',strlen(extra)); // DBG_871X("%s: realraw={\n", __FUNCTION__); - sprintf(extra, "\n0x00\t"); + extra_len = sprintf(extra, "\n0x00\t"); for (i= 512; i< mapLen; i++) { // DBG_871X("%02X", rawdata[i]); - sprintf(extra, "%s%02X", extra, rawdata[i]); + extra_len += sprintf(extra + extra_len, "%02X", rawdata[i]); if ((i & 0xF) == 0xF) { // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); - sprintf(extra, "%s0x%02x\t", extra, i+1); + extra_len += sprintf(extra + extra_len, "\n"); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i+1); } else if ((i & 0x7) == 0x7){ // DBG_871X("\t"); - sprintf(extra, "%s \t", extra); + extra_len += sprintf(extra + extra_len, " \t"); } else { // DBG_871X(" "); - sprintf(extra, "%s ", extra); + extra_len += sprintf(extra + extra_len, " "); } } // DBG_871X("}\n"); @@ -10023,14 +10025,15 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: MAC address={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { // DBG_871X("%02X", data[i]); - sprintf(extra, "%s%02X", extra, data[i]); + extra_len += sprintf(extra + extra_len, "%02X", data[i]); if (i != (cnts-1)) { // DBG_871X(":"); - sprintf(extra,"%s:",extra); + extra_len += sprintf(extra + extra_len, ":"); } } // DBG_871X("}\n"); @@ -10085,14 +10088,15 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: {VID,PID}={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { // DBG_871X("0x%02x", data[i]); - sprintf(extra, "%s0x%02X", extra, data[i]); + extra_len += sprintf(extra + extra_len, "0x%02X", data[i]); if (i != (cnts-1)) { // DBG_871X(","); - sprintf(extra,"%s,",extra); + extra_len += sprintf(extra + extra_len, ","); } } // DBG_871X("}\n"); @@ -10117,23 +10121,23 @@ static int rtw_mp_efuse_get(struct net_device *dev, } // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=0; i<512; i+=16) // set 512 because the iwpriv's extra size have limit 0x7FF { // DBG_871X("0x%03x\t", i); - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", pEfuseHal->BTEfuseInitMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i+j]); } // DBG_871X("\t"); - sprintf(extra,"%s\t",extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", pEfuseHal->BTEfuseInitMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } @@ -10150,24 +10154,24 @@ static int rtw_mp_efuse_get(struct net_device *dev, } // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=512; i<1024 ; i+=16) { // DBG_871X("0x%03x\t", i); - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i+j]); } // DBG_871X("\t"); - sprintf(extra,"%s\t",extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } @@ -10209,11 +10213,12 @@ static int rtw_mp_efuse_get(struct net_device *dev, } *extra = 0; + extra_len = 0; // DBG_871X("%s: bt efuse data={", __FUNCTION__); for (i=0; i<cnts; i++) { // DBG_871X("0x%02x ", data[i]); - sprintf(extra, "%s 0x%02X ", extra, data[i]); + extra_len += sprintf(extra + extra_len, " 0x%02X ", data[i]); } // DBG_871X("}\n"); DBG_871X(FUNC_ADPT_FMT ": BT MAC=[%s]\n", FUNC_ADPT_ARG(padapter), extra); @@ -10221,69 +10226,69 @@ static int rtw_mp_efuse_get(struct net_device *dev, else if (strcmp(tmp[0], "btffake") == 0) { // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=0; i<512; i+=16) { // DBG_871X("0x%03x\t", i); - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } else if (strcmp(tmp[0],"btbfake") == 0) { // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=512; i<1024; i+=16) { // DBG_871X("0x%03x\t", i); - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } else if (strcmp(tmp[0],"wlrfkmap")== 0) { // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=0; i<EFUSE_MAP_SIZE; i+=16) { // DBG_871X("\t0x%02x\t", i); - sprintf(extra, "%s0x%02x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", pEfuseHal->fakeEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeEfuseModifiedMap[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", pEfuseHal->fakeEfuseModifiedMap[i+j]); - sprintf(extra, "%s %02X", extra, pEfuseHal->fakeEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, " %02X", pEfuseHal->fakeEfuseModifiedMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); @@ -10311,9 +10316,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: data={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { DBG_871X("wlrfkrmap = 0x%02x \n", pEfuseHal->fakeEfuseModifiedMap[addr+i]); - sprintf(extra, "%s0x%02X ", extra, pEfuseHal->fakeEfuseModifiedMap[addr+i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", pEfuseHal->fakeEfuseModifiedMap[addr+i]); } } else if (strcmp(tmp[0],"btrfkrmap")== 0) @@ -10339,9 +10345,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: data={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { DBG_871X("wlrfkrmap = 0x%02x \n", pEfuseHal->fakeBTEfuseModifiedMap[addr+i]); - sprintf(extra, "%s0x%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[addr+i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", pEfuseHal->fakeBTEfuseModifiedMap[addr+i]); } } else diff --git a/drivers/net/wireless/rockchip_wlan/rtl8188fu/os_dep/linux/ioctl_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8188fu/os_dep/linux/ioctl_mp.c index a3997958572a..11b61af4e8e7 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8188fu/os_dep/linux/ioctl_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8188fu/os_dep/linux/ioctl_mp.c @@ -198,7 +198,7 @@ int rtw_mp_read_reg(struct net_device *dev, if (*pnext != '\0') { /*strtout = simple_strtoul(pnext , &ptmp, 16);*/ ret = sscanf(pnext, "%x", &strtout); - sprintf(extra, "%s %d" , extra , strtout); + sprintf(extra + strlen(extra), " %d", strtout); } else break; pch = pnext; @@ -230,7 +230,7 @@ int rtw_mp_read_reg(struct net_device *dev, pnext++; if (*pnext != '\0') { ret = sscanf(pnext, "%x", &strtout); - sprintf(extra, "%s %d" , extra , strtout); + sprintf(extra + strlen(extra), " %d", strtout); } else break; pch = pnext; @@ -341,20 +341,23 @@ int rtw_mp_read_rf(struct net_device *dev, pch = tmp; DBG_871X("pch=%s", pch); - while (*pch != '\0') { - pnext = strpbrk(pch, " "); - if (!pnext) - break; - pnext++; - if (*pnext != '\0') { - /*strtou =simple_strtoul(pnext , &ptmp, 16);*/ - ret = sscanf(pnext, "%x", &strtou); - sprintf(extra, "%s %d" , extra , strtou); - } else - break; - pch = pnext; + { + size_t extra_len = strlen(extra); + while (*pch != '\0') { + pnext = strpbrk(pch, " "); + if (!pnext) + break; + pnext++; + if (*pnext != '\0') { + /*strtou =simple_strtoul(pnext , &ptmp, 16);*/ + ret = sscanf(pnext, "%x", &strtou); + extra_len += sprintf(extra + extra_len, " %d", strtou); + } else + break; + pch = pnext; + } + wrqu->length = extra_len; } - wrqu->length = strlen(extra); return 0; } @@ -1383,7 +1386,7 @@ int rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra) pmp_priv->mode = MP_ON; sprintf(extra, "Stop continuous Tx"); } else if (pmp_priv->tx.stop == 1) { - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500 count=%u\n", extra, pmp_priv->tx.count); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500 count=%u\n", pmp_priv->tx.count); pmp_priv->tx.stop = 0; SetPacketTx(padapter); } else { @@ -1392,26 +1395,26 @@ int rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra) return 0; case MP_SINGLE_TONE_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetSingleToneTx(padapter, (u8)bStartTest); break; case MP_CONTINUOUS_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetContinuousTx(padapter, (u8)bStartTest); break; case MP_CARRIER_SUPPRISSION_TX: if (bStartTest != 0) { if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_11M) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); else - sprintf(extra, "%s\nSpecify carrier suppression but not CCK rate", extra); + sprintf(extra + strlen(extra), "\nSpecify carrier suppression but not CCK rate"); } SetCarrierSuppressionTx(padapter, (u8)bStartTest); break; case MP_SINGLE_CARRIER_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetSingleCarrierTx(padapter, (u8)bStartTest); break; @@ -1463,6 +1466,7 @@ int rtw_mp_tx(struct net_device *dev, u32 bandwidth = 0, sg = 0, channel = 6, txpower = 40, rate = 108, ant = 0, txmode = 1, count = 0; u8 i = 0, j = 0, bStartTest = 1, status = 0, Idx = 0, tmpU1B = 0; u16 antenna = 0; + size_t extra_len; if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length)) return -EFAULT; @@ -1489,14 +1493,14 @@ int rtw_mp_tx(struct net_device *dev, return 0; } else if (strncmp(extra, "setting", 7) == 0) { _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Current Setting :\n Channel:%d", pmp_priv->channel); - sprintf(extra, "%s\n Bandwidth:%d", extra, pmp_priv->bandwidth); - sprintf(extra, "%s\n Rate index:%d", extra, pmp_priv->rateidx); - sprintf(extra, "%s\n TxPower index:%d", extra, pmp_priv->txpoweridx); - sprintf(extra, "%s\n Antenna TxPath:%d", extra, pmp_priv->antenna_tx); - sprintf(extra, "%s\n Antenna RxPath:%d", extra, pmp_priv->antenna_rx); - sprintf(extra, "%s\n MP Mode:%d", extra, pmp_priv->mode); - wrqu->data.length = strlen(extra); + extra_len = sprintf(extra, "Current Setting :\n Channel:%d", pmp_priv->channel); + extra_len += sprintf(extra + extra_len, "\n Bandwidth:%d", pmp_priv->bandwidth); + extra_len += sprintf(extra + extra_len, "\n Rate index:%d", pmp_priv->rateidx); + extra_len += sprintf(extra + extra_len, "\n TxPower index:%d", pmp_priv->txpoweridx); + extra_len += sprintf(extra + extra_len, "\n Antenna TxPath:%d", pmp_priv->antenna_tx); + extra_len += sprintf(extra + extra_len, "\n Antenna RxPath:%d", pmp_priv->antenna_rx); + extra_len += sprintf(extra + extra_len, "\n MP Mode:%d", pmp_priv->mode); + wrqu->data.length = extra_len; return 0; #ifdef CONFIG_MP_VHT_HW_TX_MODE } else if (strncmp(extra, "pmact", 5) == 0) { @@ -1633,25 +1637,25 @@ int rtw_mp_tx(struct net_device *dev, if (sscanf(extra, "ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d", &channel, &bandwidth, &rate, &txpower, &ant, &txmode) < 6) { DBG_871X("Invalid format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "\n Please input correct format as bleow:\n"); - sprintf(extra, "%s\t ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d\n", extra, channel, bandwidth, rate, txpower, ant, txmode); - sprintf(extra, "%s\n [ ch : BGN = <1~14> , A or AC = <36~165> ]", extra); - sprintf(extra, "%s\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]", extra); - sprintf(extra, "%s\n [ rate : CCK: 1 2 5.5 11M X 2 = < 2 4 11 22 >]", extra); - sprintf(extra, "%s\n [ OFDM: 6 9 12 18 24 36 48 54M X 2 = < 12 18 24 36 48 72 96 108>", extra); - sprintf(extra, "%s\n [ HT 1S2SS MCS0 ~ MCS15 : < [MCS0]=128 ~ [MCS7]=135 ~ [MCS15]=143 >", extra); - sprintf(extra, "%s\n [ HT 3SS MCS16 ~ MCS32 : < [MCS16]=144 ~ [MCS23]=151 ~ [MCS32]=159 >", extra); - sprintf(extra, "%s\n [ VHT 1SS MCS0 ~ MCS9 : < [MCS0]=160 ~ [MCS9]=169 >", extra); - sprintf(extra, "%s\n [ txpower : 1~63 power index", extra); - sprintf(extra, "%s\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12", extra); - sprintf(extra, "%s\n [ txmode : < 0 = CONTINUOUS_TX, 1 = PACKET_TX, 2 = SINGLE_TONE_TX, 3 = CARRIER_SUPPRISSION_TX, 4 = SINGLE_CARRIER_TX>\n", extra); - wrqu->data.length = strlen(extra); + extra_len = sprintf(extra, "\n Please input correct format as bleow:\n"); + extra_len += sprintf(extra + extra_len, "\t ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d\n", channel, bandwidth, rate, txpower, ant, txmode); + extra_len += sprintf(extra + extra_len, "\n [ ch : BGN = <1~14> , A or AC = <36~165> ]"); + extra_len += sprintf(extra + extra_len, "\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]"); + extra_len += sprintf(extra + extra_len, "\n [ rate : CCK: 1 2 5.5 11M X 2 = < 2 4 11 22 >]"); + extra_len += sprintf(extra + extra_len, "\n [ OFDM: 6 9 12 18 24 36 48 54M X 2 = < 12 18 24 36 48 72 96 108>"); + extra_len += sprintf(extra + extra_len, "\n [ HT 1S2SS MCS0 ~ MCS15 : < [MCS0]=128 ~ [MCS7]=135 ~ [MCS15]=143 >"); + extra_len += sprintf(extra + extra_len, "\n [ HT 3SS MCS16 ~ MCS32 : < [MCS16]=144 ~ [MCS23]=151 ~ [MCS32]=159 >"); + extra_len += sprintf(extra + extra_len, "\n [ VHT 1SS MCS0 ~ MCS9 : < [MCS0]=160 ~ [MCS9]=169 >"); + extra_len += sprintf(extra + extra_len, "\n [ txpower : 1~63 power index"); + extra_len += sprintf(extra + extra_len, "\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12"); + extra_len += sprintf(extra + extra_len, "\n [ txmode : < 0 = CONTINUOUS_TX, 1 = PACKET_TX, 2 = SINGLE_TONE_TX, 3 = CARRIER_SUPPRISSION_TX, 4 = SINGLE_CARRIER_TX>\n"); + wrqu->data.length = extra_len; return status; } else { DBG_871X("Got format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->CurrentChannel = channel; @@ -1660,13 +1664,13 @@ int rtw_mp_tx(struct net_device *dev, bandwidth = CHANNEL_WIDTH_40; else if (bandwidth == 2) bandwidth = CHANNEL_WIDTH_80; - sprintf(extra, "%s\nChange Current Bandwidth %d to Bandwidth %d", extra, padapter->mppriv.bandwidth , bandwidth); + extra_len += sprintf(extra + extra_len, "\nChange Current Bandwidth %d to Bandwidth %d", padapter->mppriv.bandwidth , bandwidth); padapter->mppriv.bandwidth = (u8)bandwidth; padapter->mppriv.preamble = sg; SetBandwidth(padapter); pHalData->CurrentChannelBW = bandwidth; - sprintf(extra, "%s\nSet power level :%d", extra, txpower); + extra_len += sprintf(extra + extra_len, "\nSet power level :%d", txpower); padapter->mppriv.txpoweridx = (u8)txpower; pMptCtx->TxPwrLevel[ODM_RF_PATH_A] = (u8)txpower; pMptCtx->TxPwrLevel[ODM_RF_PATH_B] = (u8)txpower; @@ -1689,13 +1693,13 @@ int rtw_mp_tx(struct net_device *dev, DBG_871X("%s: rate index=%d\n", __func__, rate); if (rate >= MPT_RATE_LAST) return -EINVAL; - sprintf(extra, "%s\nSet data rate to %d index %d", extra, padapter->mppriv.rateidx, rate); + extra_len += sprintf(extra + extra_len, "\nSet data rate to %d index %d", padapter->mppriv.rateidx, rate); padapter->mppriv.rateidx = rate; pMptCtx->MptRateIndex = rate; SetDataRate(padapter); - sprintf(extra, "%s\nSet Antenna Path :%d", extra, ant); + extra_len += sprintf(extra + extra_len, "\nSet Antenna Path :%d", ant); switch (ant) { case 1: antenna = ANTENNA_A; @@ -1781,6 +1785,7 @@ int rtw_mp_rx(struct net_device *dev, u32 bandwidth = 0, sg = 0, channel = 6, ant = 0; u16 antenna = 0; u8 bStartRx = 0; + size_t extra_len; if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length)) return -EFAULT; @@ -1804,19 +1809,19 @@ int rtw_mp_rx(struct net_device *dev, } else if (sscanf(extra, "ch=%d,bw=%d,ant=%d", &channel, &bandwidth, &ant) < 3) { DBG_871X("Invalid format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "\n Please input correct format as bleow:\n"); - sprintf(extra, "%s\t ch=%d,bw=%d,ant=%d\n", extra, channel, bandwidth, ant); - sprintf(extra, "%s\n [ ch : BGN = <1~14> , A or AC = <36~165> ]", extra); - sprintf(extra, "%s\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]", extra); - sprintf(extra, "%s\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12", extra); - wrqu->data.length = strlen(extra); + extra_len = sprintf(extra, "\n Please input correct format as bleow:\n"); + extra_len += sprintf(extra + extra_len, "\t ch=%d,bw=%d,ant=%d\n", channel, bandwidth, ant); + extra_len += sprintf(extra + extra_len, "\n [ ch : BGN = <1~14> , A or AC = <36~165> ]"); + extra_len += sprintf(extra + extra_len, "\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]"); + extra_len += sprintf(extra + extra_len, "\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12"); + wrqu->data.length = extra_len; return 0; } else { bStartRx = 1; DBG_871X("Got format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->CurrentChannel = channel; @@ -1825,13 +1830,13 @@ int rtw_mp_rx(struct net_device *dev, bandwidth = CHANNEL_WIDTH_40; else if (bandwidth == 2) bandwidth = CHANNEL_WIDTH_80; - sprintf(extra, "%s\nChange Current Bandwidth %d to Bandwidth %d", extra, padapter->mppriv.bandwidth , bandwidth); + extra_len += sprintf(extra + extra_len, "\nChange Current Bandwidth %d to Bandwidth %d", padapter->mppriv.bandwidth , bandwidth); padapter->mppriv.bandwidth = (u8)bandwidth; padapter->mppriv.preamble = sg; SetBandwidth(padapter); pHalData->CurrentChannelBW = bandwidth; - sprintf(extra, "%s\nSet Antenna Path :%d", extra, ant); + extra_len += sprintf(extra + extra_len, "\nSet Antenna Path :%d", ant); switch (ant) { case 1: antenna = ANTENNA_A; @@ -1882,7 +1887,7 @@ int rtw_mp_rx(struct net_device *dev, pHalData->AntennaTxPath = antenna; SetAntenna(padapter); - sprintf(extra, "%s\nstart Rx", extra); + extra_len += sprintf(extra + extra_len, "\nstart Rx"); SetPacketRx(padapter, bStartRx, _FALSE); } wrqu->data.length = strlen(extra); @@ -2310,16 +2315,17 @@ todo: mptbt_BtControlProcess(padapter, &BtReq); if (readtherm == 0) { - sprintf(extra, "BT thermal="); + size_t extra_len = sprintf(extra, "BT thermal="); for (i = 4; i < pMptCtx->mptOutLen; i++) { if ((pMptCtx->mptOutBuf[i] == 0x00) && (pMptCtx->mptOutBuf[i + 1] == 0x00)) goto exit; - sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i] & 0x1f)); + extra_len += sprintf(extra + extra_len, " %d ", (pMptCtx->mptOutBuf[i] & 0x1f)); } } else { + size_t extra_len = strlen(extra); for (i = 4; i < pMptCtx->mptOutLen; i++) - sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]); + extra_len += sprintf(extra + extra_len, " 0x%x ", pMptCtx->mptOutBuf[i]); } exit: diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_mp.c index b7b7da5889e0..0fe9b0a1cdc0 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_mp.c @@ -1912,7 +1912,7 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) { u32 i, psd_pts=0, psd_start=0, psd_stop=0; u32 psd_data=0; - + size_t data_len = 0; #ifdef PLATFORM_LINUX if (!netif_running(pAdapter->pnetdev)) { @@ -1944,7 +1944,7 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) } else { psd_data = rtw_GetPSDData(pAdapter, i); } - sprintf(data, "%s%x ", data, psd_data); + data_len += sprintf(data + data_len, "%x ", psd_data); i++; } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/ioctl_linux.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/ioctl_linux.c index b260fab148ea..7d1aff77979b 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/ioctl_linux.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/ioctl_linux.c @@ -9876,6 +9876,7 @@ static int rtw_mp_efuse_get(struct net_device *dev, #ifdef CONFIG_IOL u8 org_fw_iol = padapter->registrypriv.fw_iol;// 0:Disable, 1:enable, 2:by usb speed #endif + size_t extra_len; wrqu = (struct iw_point*)wdata; pwrctrlpriv = adapter_to_pwrctl(padapter); @@ -9936,23 +9937,23 @@ static int rtw_mp_efuse_get(struct net_device *dev, { mapLen = EFUSE_MAP_SIZE; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < EFUSE_MAP_SIZE; i += 16) { // DBG_871X("0x%02x\t", i); - sprintf(extra, "%s0x%02x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, PROMContent[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", PROMContent[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, PROMContent[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", PROMContent[i+j]); } // DBG_871X("\n"); - sprintf(extra,"%s\n",extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } @@ -9994,18 +9995,18 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else order = 0; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < cnt; i += 16) { - sprintf(extra, "%s0x%02x\t", extra, shift + i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", shift + i); for (j = 0; j < 8; j++) - sprintf(extra, "%s%02X ", extra, efuse[i+j]); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i+j]); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) - sprintf(extra, "%s%02X ", extra, efuse[i+j]); - sprintf(extra,"%s\n",extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i+j]); + extra_len += sprintf(extra + extra_len, "\n"); } if ((shift + cnt) < mapLen) - sprintf(extra, "%s\t...more\n", extra); + extra_len += sprintf(extra + extra_len, "\t...more\n"); } else if (strcmp(tmp[0], "rmap") == 0) { @@ -10046,9 +10047,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: data={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { // DBG_871X("0x%02x ", data[i]); - sprintf(extra, "%s0x%02X ", extra, data[i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", data[i]); } // DBG_871X("}\n"); } @@ -10069,17 +10071,17 @@ static int rtw_mp_efuse_get(struct net_device *dev, _rtw_memset(extra,'\0',strlen(extra)); - sprintf(extra, "\n0x00\t"); + extra_len = sprintf(extra, "\n0x00\t"); for (i = 0; i < mapLen ; i++) { - sprintf(extra, "%s%02X", extra, rawdata[i]); + extra_len += sprintf(extra + extra_len, "%02X", rawdata[i]); if ((i & 0xF) == 0xF) { - sprintf(extra, "%s\n", extra); - sprintf(extra, "%s0x%02x\t", extra, i+1); + extra_len += sprintf(extra + extra_len, "\n"); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i+1); } else if ((i & 0x7) == 0x7) { - sprintf(extra, "%s \t", extra); + extra_len += sprintf(extra + extra_len, " \t"); } else { - sprintf(extra, "%s ", extra); + extra_len += sprintf(extra + extra_len, " "); } } @@ -10095,22 +10097,22 @@ static int rtw_mp_efuse_get(struct net_device *dev, } _rtw_memset(extra,'\0',strlen(extra)); // DBG_871X("%s: realraw={\n", __FUNCTION__); - sprintf(extra, "\n0x00\t"); + extra_len = sprintf(extra, "\n0x00\t"); for (i= 512; i< mapLen; i++) { // DBG_871X("%02X", rawdata[i]); - sprintf(extra, "%s%02X", extra, rawdata[i]); + extra_len += sprintf(extra + extra_len, "%02X", rawdata[i]); if ((i & 0xF) == 0xF) { // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); - sprintf(extra, "%s0x%02x\t", extra, i+1); + extra_len += sprintf(extra + extra_len, "\n"); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i+1); } else if ((i & 0x7) == 0x7){ // DBG_871X("\t"); - sprintf(extra, "%s \t", extra); + extra_len += sprintf(extra + extra_len, " \t"); } else { // DBG_871X(" "); - sprintf(extra, "%s ", extra); + extra_len += sprintf(extra + extra_len, " "); } } // DBG_871X("}\n"); @@ -10141,14 +10143,15 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: MAC address={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { // DBG_871X("%02X", data[i]); - sprintf(extra, "%s%02X", extra, data[i]); + extra_len += sprintf(extra + extra_len, "%02X", data[i]); if (i != (cnts-1)) { // DBG_871X(":"); - sprintf(extra,"%s:",extra); + extra_len += sprintf(extra + extra_len, ":"); } } // DBG_871X("}\n"); @@ -10197,14 +10200,15 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: {VID,PID}={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { // DBG_871X("0x%02x", data[i]); - sprintf(extra, "%s0x%02X", extra, data[i]); + extra_len += sprintf(extra + extra_len, "0x%02X", data[i]); if (i != (cnts-1)) { // DBG_871X(","); - sprintf(extra,"%s,",extra); + extra_len += sprintf(extra + extra_len, ","); } } // DBG_871X("}\n"); @@ -10226,23 +10230,23 @@ static int rtw_mp_efuse_get(struct net_device *dev, } // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=0; i<512; i+=16) // set 512 because the iwpriv's extra size have limit 0x7FF { // DBG_871X("0x%03x\t", i); - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", pEfuseHal->BTEfuseInitMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i+j]); } // DBG_871X("\t"); - sprintf(extra,"%s\t",extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", pEfuseHal->BTEfuseInitMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } @@ -10259,24 +10263,24 @@ static int rtw_mp_efuse_get(struct net_device *dev, } // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=512; i<1024 ; i+=16) { // DBG_871X("0x%03x\t", i); - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i+j]); } // DBG_871X("\t"); - sprintf(extra,"%s\t",extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } @@ -10318,11 +10322,12 @@ static int rtw_mp_efuse_get(struct net_device *dev, } *extra = 0; + extra_len = 0; // DBG_871X("%s: bt efuse data={", __FUNCTION__); for (i=0; i<cnts; i++) { // DBG_871X("0x%02x ", data[i]); - sprintf(extra, "%s 0x%02X ", extra, data[i]); + extra_len += sprintf(extra + extra_len, " 0x%02X ", data[i]); } // DBG_871X("}\n"); DBG_871X(FUNC_ADPT_FMT ": BT MAC=[%s]\n", FUNC_ADPT_ARG(padapter), extra); @@ -10330,69 +10335,69 @@ static int rtw_mp_efuse_get(struct net_device *dev, else if (strcmp(tmp[0], "btffake") == 0) { // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=0; i<512; i+=16) { // DBG_871X("0x%03x\t", i); - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } else if (strcmp(tmp[0],"btbfake") == 0) { // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=512; i<1024; i+=16) { // DBG_871X("0x%03x\t", i); - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } else if (strcmp(tmp[0],"wlrfkmap")== 0) { // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=0; i<EFUSE_MAP_SIZE; i+=16) { // DBG_871X("\t0x%02x\t", i); - sprintf(extra, "%s0x%02x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", pEfuseHal->fakeEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeEfuseModifiedMap[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", pEfuseHal->fakeEfuseModifiedMap[i+j]); - sprintf(extra, "%s %02X", extra, pEfuseHal->fakeEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, " %02X", pEfuseHal->fakeEfuseModifiedMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); @@ -10420,9 +10425,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: data={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { DBG_871X("wlrfkrmap = 0x%02x \n", pEfuseHal->fakeEfuseModifiedMap[addr+i]); - sprintf(extra, "%s0x%02X ", extra, pEfuseHal->fakeEfuseModifiedMap[addr+i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", pEfuseHal->fakeEfuseModifiedMap[addr+i]); } } else if (strcmp(tmp[0],"btrfkrmap")== 0) @@ -10448,9 +10454,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: data={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { DBG_871X("wlrfkrmap = 0x%02x \n", pEfuseHal->fakeBTEfuseModifiedMap[addr+i]); - sprintf(extra, "%s0x%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[addr+i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", pEfuseHal->fakeBTEfuseModifiedMap[addr+i]); } } else diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/ioctl_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/ioctl_mp.c index 08aa41a2525c..46442d16b0a7 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/ioctl_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/ioctl_mp.c @@ -197,7 +197,7 @@ int rtw_mp_read_reg(struct net_device *dev, if (*pnext != '\0') { /*strtout = simple_strtoul(pnext , &ptmp, 16);*/ ret = sscanf(pnext, "%x", &strtout); - sprintf(extra, "%s %d" , extra , strtout); + sprintf(extra + strlen(extra), " %d", strtout); } else break; pch = pnext; @@ -229,7 +229,7 @@ int rtw_mp_read_reg(struct net_device *dev, pnext++; if (*pnext != '\0') { ret = sscanf(pnext, "%x", &strtout); - sprintf(extra, "%s %d" , extra , strtout); + sprintf(extra + strlen(extra), " %d", strtout); } else break; pch = pnext; @@ -340,20 +340,23 @@ int rtw_mp_read_rf(struct net_device *dev, pch = tmp; DBG_871X("pch=%s", pch); - while (*pch != '\0') { - pnext = strpbrk(pch, " "); - if (!pnext) - break; - pnext++; - if (*pnext != '\0') { - /*strtou =simple_strtoul(pnext , &ptmp, 16);*/ - ret = sscanf(pnext, "%x", &strtou); - sprintf(extra, "%s %d" , extra , strtou); - } else - break; - pch = pnext; + { + size_t extra_len = strlen(extra); + while (*pch != '\0') { + pnext = strpbrk(pch, " "); + if (!pnext) + break; + pnext++; + if (*pnext != '\0') { + /*strtou =simple_strtoul(pnext , &ptmp, 16);*/ + ret = sscanf(pnext, "%x", &strtou); + extra_len += sprintf(extra + extra_len, " %d", strtou); + } else + break; + pch = pnext; + } + wrqu->length = extra_len; } - wrqu->length = strlen(extra); return 0; } @@ -1366,7 +1369,7 @@ int rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra) pmp_priv->mode = MP_ON; sprintf(extra, "Stop continuous Tx"); } else if (pmp_priv->tx.stop == 1) { - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500 count=%u\n", extra, pmp_priv->tx.count); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500 count=%u\n", pmp_priv->tx.count); pmp_priv->tx.stop = 0; SetPacketTx(padapter); } else { @@ -1375,26 +1378,26 @@ int rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra) return 0; case MP_SINGLE_TONE_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetSingleToneTx(padapter, (u8)bStartTest); break; case MP_CONTINUOUS_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetContinuousTx(padapter, (u8)bStartTest); break; case MP_CARRIER_SUPPRISSION_TX: if (bStartTest != 0) { if (pmp_priv->rateidx <= MPT_RATE_11M) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); else - sprintf(extra, "%s\nSpecify carrier suppression but not CCK rate", extra); + sprintf(extra + strlen(extra), "\nSpecify carrier suppression but not CCK rate"); } SetCarrierSuppressionTx(padapter, (u8)bStartTest); break; case MP_SINGLE_CARRIER_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetSingleCarrierTx(padapter, (u8)bStartTest); break; @@ -1445,6 +1448,7 @@ int rtw_mp_tx(struct net_device *dev, u32 bandwidth = 0, sg = 0, channel = 6, txpower = 40, rate = 108, ant = 0, txmode = 1, count = 0; u8 i = 0, j = 0, bStartTest = 1, status = 0; u16 antenna = 0; + size_t extra_len; if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length)) return -EFAULT; @@ -1464,39 +1468,39 @@ int rtw_mp_tx(struct net_device *dev, return 0; } else if (strncmp(extra, "setting", 5) == 0) { _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Current Setting :\n Channel:%d", pmp_priv->channel); - sprintf(extra, "%s\n Bandwidth:%d", extra, pmp_priv->bandwidth); - sprintf(extra, "%s\n Rate index:%d", extra, pmp_priv->rateidx); - sprintf(extra, "%s\n TxPower index:%d", extra, pmp_priv->txpoweridx); - sprintf(extra, "%s\n Antenna TxPath:%d", extra, pmp_priv->antenna_tx); - sprintf(extra, "%s\n Antenna RxPath:%d", extra, pmp_priv->antenna_rx); - sprintf(extra, "%s\n MP Mode:%d", extra, pmp_priv->mode); - wrqu->data.length = strlen(extra); + extra_len = sprintf(extra, "Current Setting :\n Channel:%d", pmp_priv->channel); + extra_len += sprintf(extra + extra_len, "\n Bandwidth:%d", pmp_priv->bandwidth); + extra_len += sprintf(extra + extra_len, "\n Rate index:%d", pmp_priv->rateidx); + extra_len += sprintf(extra + extra_len, "\n TxPower index:%d", pmp_priv->txpoweridx); + extra_len += sprintf(extra + extra_len, "\n Antenna TxPath:%d", pmp_priv->antenna_tx); + extra_len += sprintf(extra + extra_len, "\n Antenna RxPath:%d", pmp_priv->antenna_rx); + extra_len += sprintf(extra + extra_len, "\n MP Mode:%d", pmp_priv->mode); + wrqu->data.length = extra_len; return 0; } else { if (sscanf(extra, "ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d", &channel, &bandwidth, &rate, &txpower, &ant, &txmode) < 6) { DBG_871X("Invalid format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "\n Please input correct format as bleow:\n"); - sprintf(extra, "%s\t ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d\n", extra, channel, bandwidth, rate, txpower, ant, txmode); - sprintf(extra, "%s\n [ ch : BGN = <1~14> , A or AC = <36~165> ]", extra); - sprintf(extra, "%s\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]", extra); - sprintf(extra, "%s\n [ rate : CCK: 1 2 5.5 11M X 2 = < 2 4 11 22 >]", extra); - sprintf(extra, "%s\n [ OFDM: 6 9 12 18 24 36 48 54M X 2 = < 12 18 24 36 48 72 96 108>", extra); - sprintf(extra, "%s\n [ HT 1S2SS MCS0 ~ MCS15 : < [MCS0]=128 ~ [MCS7]=135 ~ [MCS15]=143 >", extra); - sprintf(extra, "%s\n [ HT 3SS MCS16 ~ MCS32 : < [MCS16]=144 ~ [MCS23]=151 ~ [MCS32]=159 >", extra); - sprintf(extra, "%s\n [ VHT 1SS MCS0 ~ MCS9 : < [MCS0]=160 ~ [MCS9]=169 >", extra); - sprintf(extra, "%s\n [ txpower : 1~63 power index", extra); - sprintf(extra, "%s\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12", extra); - sprintf(extra, "%s\n [ txmode : < 0 = CONTINUOUS_TX, 1 = PACKET_TX, 2 = SINGLE_TONE_TX, 3 = CARRIER_SUPPRISSION_TX, 4 = SINGLE_CARRIER_TX>\n", extra); - wrqu->data.length = strlen(extra); + extra_len = sprintf(extra, "\n Please input correct format as bleow:\n"); + extra_len += sprintf(extra + extra_len, "\t ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d\n", channel, bandwidth, rate, txpower, ant, txmode); + extra_len += sprintf(extra + extra_len, "\n [ ch : BGN = <1~14> , A or AC = <36~165> ]"); + extra_len += sprintf(extra + extra_len, "\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]"); + extra_len += sprintf(extra + extra_len, "\n [ rate : CCK: 1 2 5.5 11M X 2 = < 2 4 11 22 >]"); + extra_len += sprintf(extra + extra_len, "\n [ OFDM: 6 9 12 18 24 36 48 54M X 2 = < 12 18 24 36 48 72 96 108>"); + extra_len += sprintf(extra + extra_len, "\n [ HT 1S2SS MCS0 ~ MCS15 : < [MCS0]=128 ~ [MCS7]=135 ~ [MCS15]=143 >"); + extra_len += sprintf(extra + extra_len, "\n [ HT 3SS MCS16 ~ MCS32 : < [MCS16]=144 ~ [MCS23]=151 ~ [MCS32]=159 >"); + extra_len += sprintf(extra + extra_len, "\n [ VHT 1SS MCS0 ~ MCS9 : < [MCS0]=160 ~ [MCS9]=169 >"); + extra_len += sprintf(extra + extra_len, "\n [ txpower : 1~63 power index"); + extra_len += sprintf(extra + extra_len, "\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12"); + extra_len += sprintf(extra + extra_len, "\n [ txmode : < 0 = CONTINUOUS_TX, 1 = PACKET_TX, 2 = SINGLE_TONE_TX, 3 = CARRIER_SUPPRISSION_TX, 4 = SINGLE_CARRIER_TX>\n"); + wrqu->data.length = extra_len; return status; } else { DBG_871X("Got format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->CurrentChannel = channel; @@ -1505,13 +1509,13 @@ int rtw_mp_tx(struct net_device *dev, bandwidth = CHANNEL_WIDTH_40; else if (bandwidth == 2) bandwidth = CHANNEL_WIDTH_80; - sprintf(extra, "%s\nChange Current Bandwidth %d to Bandwidth %d", extra, padapter->mppriv.bandwidth , bandwidth); + extra_len += sprintf(extra + extra_len, "\nChange Current Bandwidth %d to Bandwidth %d", padapter->mppriv.bandwidth , bandwidth); padapter->mppriv.bandwidth = (u8)bandwidth; padapter->mppriv.preamble = sg; SetBandwidth(padapter); pHalData->CurrentChannelBW = bandwidth; - sprintf(extra, "%s\nSet power level :%d", extra, txpower); + extra_len += sprintf(extra + extra_len, "\nSet power level :%d", txpower); padapter->mppriv.txpoweridx = (u8)txpower; pMptCtx->TxPwrLevel[ODM_RF_PATH_A] = (u8)txpower; pMptCtx->TxPwrLevel[ODM_RF_PATH_B] = (u8)txpower; @@ -1534,13 +1538,13 @@ int rtw_mp_tx(struct net_device *dev, DBG_871X("%s: rate index=%d\n", __func__, rate); if (rate >= MPT_RATE_LAST) return -EINVAL; - sprintf(extra, "%s\nSet data rate to %d index %d", extra, padapter->mppriv.rateidx, rate); + extra_len += sprintf(extra + extra_len, "\nSet data rate to %d index %d", padapter->mppriv.rateidx, rate); padapter->mppriv.rateidx = rate; pMptCtx->MptRateIndex = rate; SetDataRate(padapter); - sprintf(extra, "%s\nSet Antenna Path :%d", extra, ant); + extra_len += sprintf(extra + extra_len, "\nSet Antenna Path :%d", ant); switch (ant) { case 1: antenna = ANTENNA_A; @@ -1626,6 +1630,7 @@ int rtw_mp_rx(struct net_device *dev, u32 bandwidth = 0, sg = 0, channel = 6, ant = 0; u16 antenna = 0; u8 bStartRx = 0; + size_t extra_len; if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length)) return -EFAULT; @@ -1641,19 +1646,19 @@ int rtw_mp_rx(struct net_device *dev, } else if (sscanf(extra, "ch=%d,bw=%d,ant=%d", &channel, &bandwidth, &ant) < 3) { DBG_871X("Invalid format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "\n Please input correct format as bleow:\n"); - sprintf(extra, "%s\t ch=%d,bw=%d,ant=%d\n", extra, channel, bandwidth, ant); - sprintf(extra, "%s\n [ ch : BGN = <1~14> , A or AC = <36~165> ]", extra); - sprintf(extra, "%s\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]", extra); - sprintf(extra, "%s\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12", extra); - wrqu->data.length = strlen(extra); + extra_len = sprintf(extra, "\n Please input correct format as bleow:\n"); + extra_len += sprintf(extra + extra_len, "\t ch=%d,bw=%d,ant=%d\n", channel, bandwidth, ant); + extra_len += sprintf(extra + extra_len, "\n [ ch : BGN = <1~14> , A or AC = <36~165> ]"); + extra_len += sprintf(extra + extra_len, "\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]"); + extra_len += sprintf(extra + extra_len, "\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12"); + wrqu->data.length = extra_len; return 0; } else { bStartRx = 1; DBG_871X("Got format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->CurrentChannel = channel; @@ -1662,13 +1667,13 @@ int rtw_mp_rx(struct net_device *dev, bandwidth = CHANNEL_WIDTH_40; else if (bandwidth == 2) bandwidth = CHANNEL_WIDTH_80; - sprintf(extra, "%s\nChange Current Bandwidth %d to Bandwidth %d", extra, padapter->mppriv.bandwidth , bandwidth); + extra_len += sprintf(extra + extra_len, "\nChange Current Bandwidth %d to Bandwidth %d", padapter->mppriv.bandwidth , bandwidth); padapter->mppriv.bandwidth = (u8)bandwidth; padapter->mppriv.preamble = sg; SetBandwidth(padapter); pHalData->CurrentChannelBW = bandwidth; - sprintf(extra, "%s\nSet Antenna Path :%d", extra, ant); + extra_len += sprintf(extra + extra_len, "\nSet Antenna Path :%d", ant); switch (ant) { case 1: antenna = ANTENNA_A; @@ -1719,7 +1724,7 @@ int rtw_mp_rx(struct net_device *dev, pHalData->AntennaTxPath = antenna; SetAntenna(padapter); - sprintf(extra, "%s\nstart Rx", extra); + extra_len += sprintf(extra + extra_len, "\nstart Rx"); SetPacketRx(padapter, bStartRx, _FALSE); } wrqu->data.length = strlen(extra); @@ -2147,16 +2152,17 @@ todo: mptbt_BtControlProcess(padapter, &BtReq); if (readtherm == 0) { - sprintf(extra, "BT thermal="); + size_t extra_len = sprintf(extra, "BT thermal="); for (i = 4; i < pMptCtx->mptOutLen; i++) { if ((pMptCtx->mptOutBuf[i] == 0x00) && (pMptCtx->mptOutBuf[i + 1] == 0x00)) goto exit; - sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i] & 0x1f)); + extra_len += sprintf(extra + extra_len, " %d ", (pMptCtx->mptOutBuf[i] & 0x1f)); } } else { + size_t extra_len = strlen(extra); for (i = 4; i < pMptCtx->mptOutLen; i++) - sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]); + extra_len += sprintf(extra + extra_len, " 0x%x ", pMptCtx->mptOutBuf[i]); } exit: diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189fs/core/rtw_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8189fs/core/rtw_mp.c index ed3b7338f3bf..9c8d4509a2df 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8189fs/core/rtw_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8189fs/core/rtw_mp.c @@ -2170,14 +2170,17 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) data[0] = '\0'; - i = psd_start; - while (i < psd_stop) { - if (i >= psd_pts) - psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); - else - psd_data = rtw_GetPSDData(pAdapter, i); - sprintf(data, "%s%x ", data, psd_data); - i++; + { + size_t extra_len = strlen(data); + i = psd_start; + while (i < psd_stop) { + if (i >= psd_pts) + psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); + else + psd_data = rtw_GetPSDData(pAdapter, i); + extra_len += sprintf(data + extra_len, "%x ", psd_data); + i++; + } } #ifdef CONFIG_LONG_DELAY_ISSUE diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189fs/os_dep/linux/ioctl_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8189fs/os_dep/linux/ioctl_mp.c index 0e482ebeda72..84404cb32b48 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8189fs/os_dep/linux/ioctl_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8189fs/os_dep/linux/ioctl_mp.c @@ -1799,7 +1799,7 @@ int rtw_mp_tx(struct net_device *dev, char *pextra = extra; RTW_INFO("Got format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->current_channel = channel; @@ -1922,6 +1922,7 @@ int rtw_mp_rx(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { + size_t extra_len; PADAPTER padapter = rtw_netdev_priv(dev); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct mp_priv *pmp_priv = &padapter->mppriv; @@ -1966,7 +1967,7 @@ int rtw_mp_rx(struct net_device *dev, bStartRx = 1; RTW_INFO("Got format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->current_channel = channel; @@ -2138,6 +2139,7 @@ int rtw_efuse_mask_file(struct net_device *dev, char *rtw_efuse_mask_file_path; u8 Status; PADAPTER padapter = rtw_netdev_priv(dev); + size_t extra_len; _rtw_memset(maskfileBuffer, 0x00, sizeof(maskfileBuffer)); @@ -2189,11 +2191,11 @@ int rtw_efuse_mask_file(struct net_device *dev, } while (count < 64); for (i = 0; i < count; i++) - sprintf(extra, "%s:%02x", extra, maskfileBuffer[i]); + extra_len += sprintf(extra + extra_len, ":%02x", maskfileBuffer[i]); padapter->registrypriv.bFileMaskEfuse = _TRUE; - sprintf(extra, "%s\nLoad Efuse Mask data %d hex ok\n", extra, count); + extra_len += sprintf(extra + extra_len, "\nLoad Efuse Mask data %d hex ok\n", count); wrqu->data.length = strlen(extra); return 0; } @@ -2616,16 +2618,17 @@ todo: mptbt_BtControlProcess(padapter, &BtReq); if (readtherm == 0) { - sprintf(extra, "BT thermal="); + size_t extra_len = sprintf(extra, "BT thermal="); for (i = 4; i < pMptCtx->mptOutLen; i++) { if ((pMptCtx->mptOutBuf[i] == 0x00) && (pMptCtx->mptOutBuf[i + 1] == 0x00)) goto exit; - sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i] & 0x1f)); + extra_len += sprintf(extra + extra_len, " %d ", (pMptCtx->mptOutBuf[i] & 0x1f)); } } else { + size_t extra_len = strlen(extra); for (i = 4; i < pMptCtx->mptOutLen; i++) - sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]); + extra_len += sprintf(extra + extra_len, " 0x%x ", pMptCtx->mptOutBuf[i]); } exit: diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_mp.c index a16da9b60103..39384d584f38 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_mp.c @@ -2093,14 +2093,17 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) data[0] = '\0'; - i = psd_start; - while (i < psd_stop) { - if (i >= psd_pts) - psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); - else - psd_data = rtw_GetPSDData(pAdapter, i); - sprintf(data, "%s%x ", data, psd_data); - i++; + { + size_t extra_len = strlen(data); + i = psd_start; + while (i < psd_stop) { + if (i >= psd_pts) + psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); + else + psd_data = rtw_GetPSDData(pAdapter, i); + extra_len += sprintf(data + extra_len, "%x ", psd_data); + i++; + } } #ifdef CONFIG_LONG_DELAY_ISSUE diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/os_dep/linux/ioctl_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8723bs/os_dep/linux/ioctl_mp.c index ad2bb026739a..4f098330fcde 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bs/os_dep/linux/ioctl_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bs/os_dep/linux/ioctl_mp.c @@ -1719,7 +1719,7 @@ int rtw_mp_tx(struct net_device *dev, char *pextra = extra; RTW_INFO("Got format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->current_channel = channel; @@ -1842,6 +1842,7 @@ int rtw_mp_rx(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { + size_t extra_len; PADAPTER padapter = rtw_netdev_priv(dev); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct mp_priv *pmp_priv = &padapter->mppriv; @@ -1886,7 +1887,7 @@ int rtw_mp_rx(struct net_device *dev, bStartRx = 1; RTW_INFO("Got format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->current_channel = channel; @@ -2049,6 +2050,7 @@ int rtw_efuse_mask_file(struct net_device *dev, char *rtw_efuse_mask_file_path; u8 Status; PADAPTER padapter = rtw_netdev_priv(dev); + size_t extra_len; _rtw_memset(maskfileBuffer, 0x00, sizeof(maskfileBuffer)); @@ -2100,11 +2102,11 @@ int rtw_efuse_mask_file(struct net_device *dev, } while (count < 64); for (i = 0; i < count; i++) - sprintf(extra, "%s:%02x", extra, maskfileBuffer[i]); + extra_len += sprintf(extra + extra_len, ":%02x", maskfileBuffer[i]); padapter->registrypriv.bFileMaskEfuse = _TRUE; - sprintf(extra, "%s\nLoad Efuse Mask data %d hex ok\n", extra, count); + extra_len += sprintf(extra + extra_len, "\nLoad Efuse Mask data %d hex ok\n", count); wrqu->data.length = strlen(extra); return 0; } @@ -2522,16 +2524,17 @@ todo: mptbt_BtControlProcess(padapter, &BtReq); if (readtherm == 0) { - sprintf(extra, "BT thermal="); + size_t extra_len = sprintf(extra, "BT thermal="); for (i = 4; i < pMptCtx->mptOutLen; i++) { if ((pMptCtx->mptOutBuf[i] == 0x00) && (pMptCtx->mptOutBuf[i + 1] == 0x00)) goto exit; - sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i] & 0x1f)); + extra_len += sprintf(extra + extra_len, " %d ", (pMptCtx->mptOutBuf[i] & 0x1f)); } } else { + size_t extra_len = strlen(extra); for (i = 4; i < pMptCtx->mptOutLen; i++) - sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]); + extra_len += sprintf(extra + extra_len, " 0x%x ", pMptCtx->mptOutBuf[i]); } exit: diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mp.c index 970ad98bb5f7..357c15ddb446 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mp.c @@ -1909,7 +1909,7 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) { u32 i, psd_pts=0, psd_start=0, psd_stop=0; u32 psd_data=0; - + size_t data_len = 0; #ifdef PLATFORM_LINUX if (!netif_running(pAdapter->pnetdev)) { @@ -1941,7 +1941,7 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) } else { psd_data = rtw_GetPSDData(pAdapter, i); } - sprintf(data, "%s%x ", data, psd_data); + data_len += sprintf(data + data_len, "%x ", psd_data); i++; } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_linux.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_linux.c index 22bb5c2439b8..785cf61bfe18 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_linux.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_linux.c @@ -9776,6 +9776,7 @@ static int rtw_mp_efuse_get(struct net_device *dev, u16 i=0, j=0, mapLen=0, addr=0, cnts=0; u16 max_available_len = 0, raw_cursize = 0, raw_maxsize = 0; int err; + size_t extra_len; #ifdef CONFIG_IOL u8 org_fw_iol = padapter->registrypriv.fw_iol;// 0:Disable, 1:enable, 2:by usb speed #endif @@ -9839,23 +9840,23 @@ static int rtw_mp_efuse_get(struct net_device *dev, { mapLen = EFUSE_MAP_SIZE; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < EFUSE_MAP_SIZE; i += 16) { // DBG_871X("0x%02x\t", i); - sprintf(extra, "%s0x%02x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, PROMContent[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", PROMContent[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, PROMContent[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", PROMContent[i+j]); } // DBG_871X("\n"); - sprintf(extra,"%s\n",extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } @@ -9870,23 +9871,23 @@ static int rtw_mp_efuse_get(struct net_device *dev, } // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < EFUSE_MAP_SIZE; i += 16) { // DBG_871X("0x%02x\t", i); - sprintf(extra, "%s0x%02x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeEfuseInitMap[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeEfuseInitMap[i+j]); } // DBG_871X("\n"); - sprintf(extra,"%s\n",extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } @@ -9929,9 +9930,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: data={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { // DBG_871X("0x%02x ", data[i]); - sprintf(extra, "%s0x%02X ", extra, data[i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", data[i]); } // DBG_871X("}\n"); } @@ -9952,17 +9954,16 @@ static int rtw_mp_efuse_get(struct net_device *dev, _rtw_memset(extra,'\0',strlen(extra)); - sprintf(extra, "\n0x00\t"); + extra_len = sprintf(extra, "\n0x00\t"); for (i = 0; i < mapLen ; i++) { - sprintf(extra, "%s%02X", extra, rawdata[i]); + extra_len += sprintf(extra + extra_len, "%02X", rawdata[i]); if ((i & 0xF) == 0xF) { - sprintf(extra, "%s\n", extra); - sprintf(extra, "%s0x%02x\t", extra, i+1); + extra_len += sprintf(extra + extra_len, "\n0x%02x\t", i+1); } else if ((i & 0x7) == 0x7) { - sprintf(extra, "%s \t", extra); + extra_len += sprintf(extra + extra_len, " \t"); } else { - sprintf(extra, "%s ", extra); + extra_len += sprintf(extra + extra_len, " "); } } @@ -9978,22 +9979,21 @@ static int rtw_mp_efuse_get(struct net_device *dev, } _rtw_memset(extra,'\0',strlen(extra)); // DBG_871X("%s: realraw={\n", __FUNCTION__); - sprintf(extra, "\n0x00\t"); + extra_len = sprintf(extra, "\n0x00\t"); for (i= 512; i< mapLen; i++) { // DBG_871X("%02X", rawdata[i]); - sprintf(extra, "%s%02X", extra, rawdata[i]); + extra_len += sprintf(extra + extra_len, "%02X", rawdata[i]); if ((i & 0xF) == 0xF) { // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); - sprintf(extra, "%s0x%02x\t", extra, i+1); + extra_len += sprintf(extra + extra_len, "\n0x%02x\t", i+1); } else if ((i & 0x7) == 0x7){ // DBG_871X("\t"); - sprintf(extra, "%s \t", extra); + extra_len += sprintf(extra + extra_len, " \t"); } else { // DBG_871X(" "); - sprintf(extra, "%s ", extra); + extra_len += sprintf(extra + extra_len, " "); } } // DBG_871X("}\n"); @@ -10024,14 +10024,15 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: MAC address={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { // DBG_871X("%02X", data[i]); - sprintf(extra, "%s%02X", extra, data[i]); + extra_len += sprintf(extra + extra_len, "%02X", data[i]); if (i != (cnts-1)) { // DBG_871X(":"); - sprintf(extra,"%s:",extra); + extra_len += sprintf(extra + extra_len, ":"); } } // DBG_871X("}\n"); @@ -10086,14 +10087,15 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: {VID,PID}={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { // DBG_871X("0x%02x", data[i]); - sprintf(extra, "%s0x%02X", extra, data[i]); + extra_len += sprintf(extra + extra_len, "0x%02X", data[i]); if (i != (cnts-1)) { // DBG_871X(","); - sprintf(extra,"%s,",extra); + extra_len += sprintf(extra + extra_len, ","); } } // DBG_871X("}\n"); @@ -10118,23 +10120,23 @@ static int rtw_mp_efuse_get(struct net_device *dev, } // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=0; i<512; i+=16) // set 512 because the iwpriv's extra size have limit 0x7FF { // DBG_871X("0x%03x\t", i); - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", pEfuseHal->BTEfuseInitMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i+j]); } // DBG_871X("\t"); - sprintf(extra,"%s\t",extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", pEfuseHal->BTEfuseInitMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } @@ -10151,24 +10153,24 @@ static int rtw_mp_efuse_get(struct net_device *dev, } // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=512; i<1024 ; i+=16) { // DBG_871X("0x%03x\t", i); - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i+j]); } // DBG_871X("\t"); - sprintf(extra,"%s\t",extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } @@ -10210,11 +10212,12 @@ static int rtw_mp_efuse_get(struct net_device *dev, } *extra = 0; + extra_len = 0; // DBG_871X("%s: bt efuse data={", __FUNCTION__); for (i=0; i<cnts; i++) { // DBG_871X("0x%02x ", data[i]); - sprintf(extra, "%s 0x%02X ", extra, data[i]); + extra_len += sprintf(extra + extra_len, " 0x%02X ", data[i]); } // DBG_871X("}\n"); DBG_871X(FUNC_ADPT_FMT ": BT MAC=[%s]\n", FUNC_ADPT_ARG(padapter), extra); @@ -10222,69 +10225,69 @@ static int rtw_mp_efuse_get(struct net_device *dev, else if (strcmp(tmp[0], "btffake") == 0) { // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=0; i<512; i+=16) { // DBG_871X("0x%03x\t", i); - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } else if (strcmp(tmp[0],"btbfake") == 0) { // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=512; i<1024; i+=16) { // DBG_871X("0x%03x\t", i); - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } else if (strcmp(tmp[0],"wlrfkmap")== 0) { // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=0; i<EFUSE_MAP_SIZE; i+=16) { // DBG_871X("\t0x%02x\t", i); - sprintf(extra, "%s0x%02x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", pEfuseHal->fakeEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeEfuseModifiedMap[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", pEfuseHal->fakeEfuseModifiedMap[i+j]); - sprintf(extra, "%s %02X", extra, pEfuseHal->fakeEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, " %02X", pEfuseHal->fakeEfuseModifiedMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); @@ -10312,9 +10315,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: data={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { DBG_871X("wlrfkrmap = 0x%02x \n", pEfuseHal->fakeEfuseModifiedMap[addr+i]); - sprintf(extra, "%s0x%02X ", extra, pEfuseHal->fakeEfuseModifiedMap[addr+i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", pEfuseHal->fakeEfuseModifiedMap[addr+i]); } } else if (strcmp(tmp[0],"btrfkrmap")== 0) @@ -10340,9 +10344,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: data={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { DBG_871X("wlrfkrmap = 0x%02x \n", pEfuseHal->fakeBTEfuseModifiedMap[addr+i]); - sprintf(extra, "%s0x%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[addr+i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", pEfuseHal->fakeBTEfuseModifiedMap[addr+i]); } } else diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_mp.c index 96f1e4ee1c9e..13f7f39add77 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_mp.c @@ -198,7 +198,7 @@ int rtw_mp_read_reg(struct net_device *dev, if (*pnext != '\0') { /*strtout = simple_strtoul(pnext , &ptmp, 16);*/ ret = sscanf(pnext, "%x", &strtout); - sprintf(extra, "%s %d" , extra , strtout); + sprintf(extra + strlen(extra), " %d", strtout); } else break; pch = pnext; @@ -230,7 +230,7 @@ int rtw_mp_read_reg(struct net_device *dev, pnext++; if (*pnext != '\0') { ret = sscanf(pnext, "%x", &strtout); - sprintf(extra, "%s %d" , extra , strtout); + sprintf(extra + strlen(extra), " %d", strtout); } else break; pch = pnext; @@ -341,20 +341,23 @@ int rtw_mp_read_rf(struct net_device *dev, pch = tmp; DBG_871X("pch=%s", pch); - while (*pch != '\0') { - pnext = strpbrk(pch, " "); - if (!pnext) - break; - pnext++; - if (*pnext != '\0') { - /*strtou =simple_strtoul(pnext , &ptmp, 16);*/ - ret = sscanf(pnext, "%x", &strtou); - sprintf(extra, "%s %d" , extra , strtou); - } else - break; - pch = pnext; + { + size_t extra_len = strlen(extra); + while (*pch != '\0') { + pnext = strpbrk(pch, " "); + if (!pnext) + break; + pnext++; + if (*pnext != '\0') { + /*strtou =simple_strtoul(pnext , &ptmp, 16);*/ + ret = sscanf(pnext, "%x", &strtou); + extra_len += sprintf(extra + extra_len, " %d", strtou); + } else + break; + pch = pnext; + } + wrqu->length = extra_len; } - wrqu->length = strlen(extra); return 0; } @@ -1384,7 +1387,7 @@ int rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra) pmp_priv->mode = MP_ON; sprintf(extra, "Stop continuous Tx"); } else if (pmp_priv->tx.stop == 1) { - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500 count=%u\n", extra, pmp_priv->tx.count); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500 count=%u\n", pmp_priv->tx.count); pmp_priv->tx.stop = 0; SetPacketTx(padapter); } else { @@ -1393,26 +1396,26 @@ int rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra) return 0; case MP_SINGLE_TONE_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetSingleToneTx(padapter, (u8)bStartTest); break; case MP_CONTINUOUS_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetContinuousTx(padapter, (u8)bStartTest); break; case MP_CARRIER_SUPPRISSION_TX: if (bStartTest != 0) { if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_11M) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); else - sprintf(extra, "%s\nSpecify carrier suppression but not CCK rate", extra); + sprintf(extra + strlen(extra), "\nSpecify carrier suppression but not CCK rate"); } SetCarrierSuppressionTx(padapter, (u8)bStartTest); break; case MP_SINGLE_CARRIER_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetSingleCarrierTx(padapter, (u8)bStartTest); break; @@ -1464,6 +1467,7 @@ int rtw_mp_tx(struct net_device *dev, u32 bandwidth = 0, sg = 0, channel = 6, txpower = 40, rate = 108, ant = 0, txmode = 1, count = 0; u8 i = 0, j = 0, bStartTest = 1, status = 0, Idx = 0, tmpU1B = 0; u16 antenna = 0; + size_t extra_len; if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length)) return -EFAULT; @@ -1490,14 +1494,14 @@ int rtw_mp_tx(struct net_device *dev, return 0; } else if (strncmp(extra, "setting", 7) == 0) { _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Current Setting :\n Channel:%d", pmp_priv->channel); - sprintf(extra, "%s\n Bandwidth:%d", extra, pmp_priv->bandwidth); - sprintf(extra, "%s\n Rate index:%d", extra, pmp_priv->rateidx); - sprintf(extra, "%s\n TxPower index:%d", extra, pmp_priv->txpoweridx); - sprintf(extra, "%s\n Antenna TxPath:%d", extra, pmp_priv->antenna_tx); - sprintf(extra, "%s\n Antenna RxPath:%d", extra, pmp_priv->antenna_rx); - sprintf(extra, "%s\n MP Mode:%d", extra, pmp_priv->mode); - wrqu->data.length = strlen(extra); + extra_len = sprintf(extra, "Current Setting :\n Channel:%d", pmp_priv->channel); + extra_len += sprintf(extra + extra_len, "\n Bandwidth:%d", pmp_priv->bandwidth); + extra_len += sprintf(extra + extra_len, "\n Rate index:%d", pmp_priv->rateidx); + extra_len += sprintf(extra + extra_len, "\n TxPower index:%d", pmp_priv->txpoweridx); + extra_len += sprintf(extra + extra_len, "\n Antenna TxPath:%d", pmp_priv->antenna_tx); + extra_len += sprintf(extra + extra_len, "\n Antenna RxPath:%d", pmp_priv->antenna_rx); + extra_len += sprintf(extra + extra_len, "\n MP Mode:%d", pmp_priv->mode); + wrqu->data.length = extra_len; return 0; #ifdef CONFIG_MP_VHT_HW_TX_MODE } else if (strncmp(extra, "pmact", 5) == 0) { @@ -1634,25 +1638,25 @@ int rtw_mp_tx(struct net_device *dev, if (sscanf(extra, "ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d", &channel, &bandwidth, &rate, &txpower, &ant, &txmode) < 6) { DBG_871X("Invalid format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "\n Please input correct format as bleow:\n"); - sprintf(extra, "%s\t ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d\n", extra, channel, bandwidth, rate, txpower, ant, txmode); - sprintf(extra, "%s\n [ ch : BGN = <1~14> , A or AC = <36~165> ]", extra); - sprintf(extra, "%s\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]", extra); - sprintf(extra, "%s\n [ rate : CCK: 1 2 5.5 11M X 2 = < 2 4 11 22 >]", extra); - sprintf(extra, "%s\n [ OFDM: 6 9 12 18 24 36 48 54M X 2 = < 12 18 24 36 48 72 96 108>", extra); - sprintf(extra, "%s\n [ HT 1S2SS MCS0 ~ MCS15 : < [MCS0]=128 ~ [MCS7]=135 ~ [MCS15]=143 >", extra); - sprintf(extra, "%s\n [ HT 3SS MCS16 ~ MCS32 : < [MCS16]=144 ~ [MCS23]=151 ~ [MCS32]=159 >", extra); - sprintf(extra, "%s\n [ VHT 1SS MCS0 ~ MCS9 : < [MCS0]=160 ~ [MCS9]=169 >", extra); - sprintf(extra, "%s\n [ txpower : 1~63 power index", extra); - sprintf(extra, "%s\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12", extra); - sprintf(extra, "%s\n [ txmode : < 0 = CONTINUOUS_TX, 1 = PACKET_TX, 2 = SINGLE_TONE_TX, 3 = CARRIER_SUPPRISSION_TX, 4 = SINGLE_CARRIER_TX>\n", extra); - wrqu->data.length = strlen(extra); + extra_len = sprintf(extra, "\n Please input correct format as bleow:\n"); + extra_len += sprintf(extra + extra_len, "\t ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d\n", channel, bandwidth, rate, txpower, ant, txmode); + extra_len += sprintf(extra + extra_len, "\n [ ch : BGN = <1~14> , A or AC = <36~165> ]"); + extra_len += sprintf(extra + extra_len, "\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]"); + extra_len += sprintf(extra + extra_len, "\n [ rate : CCK: 1 2 5.5 11M X 2 = < 2 4 11 22 >]"); + extra_len += sprintf(extra + extra_len, "\n [ OFDM: 6 9 12 18 24 36 48 54M X 2 = < 12 18 24 36 48 72 96 108>"); + extra_len += sprintf(extra + extra_len, "\n [ HT 1S2SS MCS0 ~ MCS15 : < [MCS0]=128 ~ [MCS7]=135 ~ [MCS15]=143 >"); + extra_len += sprintf(extra + extra_len, "\n [ HT 3SS MCS16 ~ MCS32 : < [MCS16]=144 ~ [MCS23]=151 ~ [MCS32]=159 >"); + extra_len += sprintf(extra + extra_len, "\n [ VHT 1SS MCS0 ~ MCS9 : < [MCS0]=160 ~ [MCS9]=169 >"); + extra_len += sprintf(extra + extra_len, "\n [ txpower : 1~63 power index"); + extra_len += sprintf(extra + extra_len, "\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12"); + extra_len += sprintf(extra + extra_len, "\n [ txmode : < 0 = CONTINUOUS_TX, 1 = PACKET_TX, 2 = SINGLE_TONE_TX, 3 = CARRIER_SUPPRISSION_TX, 4 = SINGLE_CARRIER_TX>\n"); + wrqu->data.length = extra_len; return status; } else { DBG_871X("Got format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->CurrentChannel = channel; @@ -1661,13 +1665,14 @@ int rtw_mp_tx(struct net_device *dev, bandwidth = CHANNEL_WIDTH_40; else if (bandwidth == 2) bandwidth = CHANNEL_WIDTH_80; - sprintf(extra, "%s\nChange Current Bandwidth %d to Bandwidth %d", extra, padapter->mppriv.bandwidth , bandwidth); + extra_len = strlen(extra); + extra_len += sprintf(extra + extra_len, "\nChange Current Bandwidth %d to Bandwidth %d", padapter->mppriv.bandwidth , bandwidth); padapter->mppriv.bandwidth = (u8)bandwidth; padapter->mppriv.preamble = sg; SetBandwidth(padapter); pHalData->CurrentChannelBW = bandwidth; - sprintf(extra, "%s\nSet power level :%d", extra, txpower); + extra_len += sprintf(extra + extra_len, "\nSet power level :%d", txpower); padapter->mppriv.txpoweridx = (u8)txpower; pMptCtx->TxPwrLevel[ODM_RF_PATH_A] = (u8)txpower; pMptCtx->TxPwrLevel[ODM_RF_PATH_B] = (u8)txpower; @@ -1690,13 +1695,13 @@ int rtw_mp_tx(struct net_device *dev, DBG_871X("%s: rate index=%d\n", __func__, rate); if (rate >= MPT_RATE_LAST) return -EINVAL; - sprintf(extra, "%s\nSet data rate to %d index %d", extra, padapter->mppriv.rateidx, rate); + extra_len += sprintf(extra + extra_len, "\nSet data rate to %d index %d", padapter->mppriv.rateidx, rate); padapter->mppriv.rateidx = rate; pMptCtx->MptRateIndex = rate; SetDataRate(padapter); - sprintf(extra, "%s\nSet Antenna Path :%d", extra, ant); + extra_len += sprintf(extra + extra_len, "\nSet Antenna Path :%d", ant); switch (ant) { case 1: antenna = ANTENNA_A; @@ -1782,6 +1787,7 @@ int rtw_mp_rx(struct net_device *dev, u32 bandwidth = 0, sg = 0, channel = 6, ant = 0; u16 antenna = 0; u8 bStartRx = 0; + size_t extra_len; if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length)) return -EFAULT; @@ -1805,19 +1811,19 @@ int rtw_mp_rx(struct net_device *dev, } else if (sscanf(extra, "ch=%d,bw=%d,ant=%d", &channel, &bandwidth, &ant) < 3) { DBG_871X("Invalid format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "\n Please input correct format as bleow:\n"); - sprintf(extra, "%s\t ch=%d,bw=%d,ant=%d\n", extra, channel, bandwidth, ant); - sprintf(extra, "%s\n [ ch : BGN = <1~14> , A or AC = <36~165> ]", extra); - sprintf(extra, "%s\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]", extra); - sprintf(extra, "%s\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12", extra); - wrqu->data.length = strlen(extra); + extra_len = sprintf(extra, "\n Please input correct format as bleow:\n"); + extra_len += sprintf(extra + extra_len, "\t ch=%d,bw=%d,ant=%d\n", channel, bandwidth, ant); + extra_len += sprintf(extra + extra_len, "\n [ ch : BGN = <1~14> , A or AC = <36~165> ]"); + extra_len += sprintf(extra + extra_len, "\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]"); + extra_len += sprintf(extra + extra_len, "\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12"); + wrqu->data.length = extra_len; return 0; } else { bStartRx = 1; DBG_871X("Got format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len += sprintf(extra + extra_len, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->CurrentChannel = channel; @@ -1826,13 +1832,13 @@ int rtw_mp_rx(struct net_device *dev, bandwidth = CHANNEL_WIDTH_40; else if (bandwidth == 2) bandwidth = CHANNEL_WIDTH_80; - sprintf(extra, "%s\nChange Current Bandwidth %d to Bandwidth %d", extra, padapter->mppriv.bandwidth , bandwidth); + extra_len += sprintf(extra + extra_len, "\nChange Current Bandwidth %d to Bandwidth %d", padapter->mppriv.bandwidth , bandwidth); padapter->mppriv.bandwidth = (u8)bandwidth; padapter->mppriv.preamble = sg; SetBandwidth(padapter); pHalData->CurrentChannelBW = bandwidth; - sprintf(extra, "%s\nSet Antenna Path :%d", extra, ant); + extra_len += sprintf(extra + extra_len, "\nSet Antenna Path :%d", ant); switch (ant) { case 1: antenna = ANTENNA_A; @@ -1883,10 +1889,10 @@ int rtw_mp_rx(struct net_device *dev, pHalData->AntennaTxPath = antenna; SetAntenna(padapter); - sprintf(extra, "%s\nstart Rx", extra); + extra_len += sprintf(extra + extra_len, "\nstart Rx"); SetPacketRx(padapter, bStartRx, _FALSE); } - wrqu->data.length = strlen(extra); + wrqu->data.length = extra_len; return 0; } @@ -2014,6 +2020,7 @@ int rtw_mp_SetBT(struct net_device *dev, int testmode = 1, ready = 1, trxparam = 1, setgen = 1, getgen = 1, testctrl = 1, testbt = 1, readtherm = 1, setbtmac = 1; u32 i = 0, ii = 0, jj = 0, kk = 0, cnts = 0, status = 0; PRT_MP_FIRMWARE pBTFirmware = NULL; + size_t extra_len; if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length)) return -EFAULT; @@ -2310,17 +2317,18 @@ todo: mptbt_BtControlProcess(padapter, &BtReq); + extra_len = strlen(extra); if (readtherm == 0) { sprintf(extra, "BT thermal="); for (i = 4; i < pMptCtx->mptOutLen; i++) { if ((pMptCtx->mptOutBuf[i] == 0x00) && (pMptCtx->mptOutBuf[i + 1] == 0x00)) goto exit; - sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i] & 0x1f)); + extra_len += sprintf(extra + extra_len, " %d ", (pMptCtx->mptOutBuf[i] & 0x1f)); } } else { for (i = 4; i < pMptCtx->mptOutLen; i++) - sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]); + extra_len += sprintf(extra + extra_len, " 0x%x ", pMptCtx->mptOutBuf[i]); } exit: diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723cs/core/rtw_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8723cs/core/rtw_mp.c index 87ced9ab0180..a08b26f0f87f 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8723cs/core/rtw_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723cs/core/rtw_mp.c @@ -2119,14 +2119,17 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) data[0] = '\0'; - i = psd_start; - while (i < psd_stop) { - if (i >= psd_pts) - psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); - else - psd_data = rtw_GetPSDData(pAdapter, i); - sprintf(data, "%s%x ", data, psd_data); - i++; + { + size_t extra_len = strlen(data); + i = psd_start; + while (i < psd_stop) { + if (i >= psd_pts) + psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); + else + psd_data = rtw_GetPSDData(pAdapter, i); + extra_len += sprintf(data + extra_len, "%x ", psd_data); + i++; + } } #ifdef CONFIG_LONG_DELAY_ISSUE diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723cs/os_dep/linux/ioctl_linux.c b/drivers/net/wireless/rockchip_wlan/rtl8723cs/os_dep/linux/ioctl_linux.c index 268dee6f5113..0120a3aa52ad 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8723cs/os_dep/linux/ioctl_linux.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723cs/os_dep/linux/ioctl_linux.c @@ -9034,6 +9034,7 @@ static int rtw_mp_efuse_get(struct net_device *dev, #ifdef CONFIG_IOL u8 org_fw_iol = padapter->registrypriv.fw_iol;/* 0:Disable, 1:enable, 2:by usb speed */ #endif + size_t extra_len; wrqu = (struct iw_point *)wdata; pwrctrlpriv = adapter_to_pwrctl(padapter); @@ -9105,18 +9106,18 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else drvmaporder = 0; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < cnt; i += 16) { - sprintf(extra, "%s0x%02x\t", extra, shift + i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", shift + i); for (j = 0; j < 8; j++) - sprintf(extra, "%s%02X ", extra, efuse[i + j]); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i + j]); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) - sprintf(extra, "%s%02X ", extra, efuse[i + j]); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i + j]); + extra_len += sprintf(extra + extra_len, "\n"); } if ((shift + cnt) < mapLen) - sprintf(extra, "%s\t...more (left:%d/%d)\n", extra, mapLen-(shift + cnt), mapLen); + extra_len += sprintf(extra + extra_len, "\t...more (left:%d/%d)\n", mapLen-(shift + cnt), mapLen); } else if (strcmp(tmp[0], "realmap") == 0) { static u8 order = 0; @@ -9155,18 +9156,18 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else order = 0; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < cnt; i += 16) { - sprintf(extra, "%s0x%02x\t", extra, shift + i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", shift + i); for (j = 0; j < 8; j++) - sprintf(extra, "%s%02X ", extra, efuse[i + j]); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i + j]); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) - sprintf(extra, "%s%02X ", extra, efuse[i + j]); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i + j]); + extra_len += sprintf(extra + extra_len, "\n"); } if ((shift + cnt) < mapLen) - sprintf(extra, "%s\t...more (left:%d/%d)\n", extra, mapLen-(shift + cnt), mapLen); + extra_len += sprintf(extra + extra_len, "\t...more (left:%d/%d)\n", mapLen-(shift + cnt), mapLen); } else if (strcmp(tmp[0], "rmap") == 0) { if ((tmp[1] == NULL) || (tmp[2] == NULL)) { RTW_INFO("%s: rmap Fail!! Parameters error!\n", __FUNCTION__); @@ -9201,9 +9202,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, /* RTW_INFO("%s: data={", __FUNCTION__); */ *extra = 0; + extra_len = 0; for (i = 0; i < cnts; i++) { /* RTW_INFO("0x%02x ", data[i]); */ - sprintf(extra, "%s0x%02X ", extra, data[i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", data[i]); } /* RTW_INFO("}\n"); */ } else if (strcmp(tmp[0], "realraw") == 0) { @@ -9232,18 +9234,18 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else raw_order = 0; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < cnt; i += 16) { - sprintf(extra, "%s0x%02x\t", extra, shift + i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", shift + i); for (j = 0; j < 8; j++) - sprintf(extra, "%s%02X ", extra, rawdata[i + j]); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "%02X ", rawdata[i + j]); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) - sprintf(extra, "%s%02X ", extra, rawdata[i + j]); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "%02X ", rawdata[i + j]); + extra_len += sprintf(extra + extra_len, "\n"); } if ((shift + cnt) < mapLen) - sprintf(extra, "%s\t...more (left:%d/%d)\n", extra, mapLen-(shift + cnt), mapLen); + extra_len += sprintf(extra + extra_len, "\t...more (left:%d/%d)\n", mapLen-(shift + cnt), mapLen); } else if (strcmp(tmp[0], "btrealraw") == 0) { static u8 bt_raw_order = 0; @@ -9279,18 +9281,18 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else bt_raw_order = 0; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < cnt; i += 16) { - sprintf(extra, "%s0x%02x\t", extra, shift + i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", shift + i); for (j = 0; j < 8; j++) - sprintf(extra, "%s%02X ", extra, rawdata[i + j]); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "%02X ", rawdata[i + j]); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) - sprintf(extra, "%s%02X ", extra, rawdata[i + j]); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "%02X ", rawdata[i + j]); + extra_len += sprintf(extra + extra_len, "\n"); } if ((shift + cnt) < mapLen) - sprintf(extra, "%s\t...more (left:%d/%d)\n", extra, mapLen-(shift + cnt), mapLen); + extra_len += sprintf(extra + extra_len, "\t...more (left:%d/%d)\n", mapLen-(shift + cnt), mapLen); } else if (strcmp(tmp[0], "mac") == 0) { if (hal_efuse_macaddr_offset(padapter) == -1) { @@ -9316,12 +9318,13 @@ static int rtw_mp_efuse_get(struct net_device *dev, /* RTW_INFO("%s: MAC address={", __FUNCTION__); */ *extra = 0; + extra_len = 0; for (i = 0; i < cnts; i++) { /* RTW_INFO("%02X", data[i]); */ - sprintf(extra, "%s%02X", extra, data[i]); + extra_len += sprintf(extra + extra_len, "%02X", data[i]); if (i != (cnts - 1)) { /* RTW_INFO(":"); */ - sprintf(extra, "%s:", extra); + extra_len += sprintf(extra + extra_len, ":"); } } /* RTW_INFO("}\n"); */ @@ -9379,12 +9382,13 @@ static int rtw_mp_efuse_get(struct net_device *dev, /* RTW_INFO("%s: {VID,PID}={", __FUNCTION__); */ *extra = 0; + extra_len = 0; for (i = 0; i < cnts; i++) { /* RTW_INFO("0x%02x", data[i]); */ - sprintf(extra, "%s0x%02X", extra, data[i]); + extra_len += sprintf(extra + extra_len, "0x%02X", data[i]); if (i != (cnts - 1)) { /* RTW_INFO(","); */ - sprintf(extra, "%s,", extra); + extra_len += sprintf(extra + extra_len, ","); } } /* RTW_INFO("}\n"); */ @@ -9412,22 +9416,22 @@ static int rtw_mp_efuse_get(struct net_device *dev, } /* RTW_INFO("OFFSET\tVALUE(hex)\n"); */ - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < 512; i += 16) { /* set 512 because the iwpriv's extra size have limit 0x7FF */ /* RTW_INFO("0x%03x\t", i); */ - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j = 0; j < 8; j++) { /* RTW_INFO("%02X ", pEfuseHal->BTEfuseInitMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i + j]); } /* RTW_INFO("\t"); */ - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) { /* RTW_INFO("%02X ", pEfuseHal->BTEfuseInitMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i + j]); } /* RTW_INFO("\n"); */ - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } /* RTW_INFO("\n"); */ } else if (strcmp(tmp[0], "btbmap") == 0) { @@ -9441,22 +9445,22 @@ static int rtw_mp_efuse_get(struct net_device *dev, } /* RTW_INFO("OFFSET\tVALUE(hex)\n"); */ - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 512; i < 1024 ; i += 16) { /* RTW_INFO("0x%03x\t", i); */ - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j = 0; j < 8; j++) { /* RTW_INFO("%02X ", data[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i + j]); } /* RTW_INFO("\t"); */ - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) { /* RTW_INFO("%02X ", data[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i + j]); } /* RTW_INFO("\n"); */ - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } /* RTW_INFO("\n"); */ } else if (strcmp(tmp[0], "btrmap") == 0) { @@ -9504,51 +9508,52 @@ static int rtw_mp_efuse_get(struct net_device *dev, } *extra = 0; + extra_len = 0; /* RTW_INFO("%s: bt efuse data={", __FUNCTION__); */ for (i = 0; i < cnts; i++) { /* RTW_INFO("0x%02x ", data[i]); */ - sprintf(extra, "%s 0x%02X ", extra, data[i]); + extra_len += sprintf(extra + extra_len, " 0x%02X ", data[i]); } /* RTW_INFO("}\n"); */ RTW_INFO(FUNC_ADPT_FMT ": BT MAC=[%s]\n", FUNC_ADPT_ARG(padapter), extra); } else if (strcmp(tmp[0], "btffake") == 0) { /* RTW_INFO("OFFSET\tVALUE(hex)\n"); */ - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < 512; i += 16) { /* RTW_INFO("0x%03x\t", i); */ - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j = 0; j < 8; j++) { /* RTW_INFO("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i + j]); } /* RTW_INFO("\t"); */ - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) { /* RTW_INFO("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i + j]); } /* RTW_INFO("\n"); */ - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } /* RTW_INFO("\n"); */ } else if (strcmp(tmp[0], "btbfake") == 0) { /* RTW_INFO("OFFSET\tVALUE(hex)\n"); */ - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 512; i < 1024; i += 16) { /* RTW_INFO("0x%03x\t", i); */ - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j = 0; j < 8; j++) { /* RTW_INFO("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i + j]); } /* RTW_INFO("\t"); */ - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) { /* RTW_INFO("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i + j]); } /* RTW_INFO("\n"); */ - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } /* RTW_INFO("\n"); */ } else if (strcmp(tmp[0], "wlrfkmap") == 0) { @@ -9569,18 +9574,18 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else fk_order = 0; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < cnt; i += 16) { - sprintf(extra, "%s0x%02x\t", extra, shift + i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", shift + i); for (j = 0; j < 8; j++) - sprintf(extra, "%s%02X ", extra, efuse[i + j]); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i + j]); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) - sprintf(extra, "%s%02X ", extra, efuse[i + j]); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i + j]); + extra_len += sprintf(extra + extra_len, "\n"); } if ((shift + cnt) < mapLen) - sprintf(extra, "%s\t...more\n", extra); + extra_len += sprintf(extra + extra_len, "\t...more\n"); } else if (strcmp(tmp[0], "wlrfkrmap") == 0) { if ((tmp[1] == NULL) || (tmp[2] == NULL)) { @@ -9602,9 +9607,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, /* RTW_INFO("%s: data={", __FUNCTION__); */ *extra = 0; + extra_len = 0; for (i = 0; i < cnts; i++) { RTW_INFO("wlrfkrmap = 0x%02x\n", pEfuseHal->fakeEfuseModifiedMap[addr + i]); - sprintf(extra, "%s0x%02X ", extra, pEfuseHal->fakeEfuseModifiedMap[addr + i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", pEfuseHal->fakeEfuseModifiedMap[addr + i]); } } else if (strcmp(tmp[0], "btrfkrmap") == 0) { if ((tmp[1] == NULL) || (tmp[2] == NULL)) { @@ -9626,9 +9632,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, /* RTW_INFO("%s: data={", __FUNCTION__); */ *extra = 0; + extra_len = 0; for (i = 0; i < cnts; i++) { RTW_INFO("wlrfkrmap = 0x%02x\n", pEfuseHal->fakeBTEfuseModifiedMap[addr + i]); - sprintf(extra, "%s0x%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[addr + i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", pEfuseHal->fakeBTEfuseModifiedMap[addr + i]); } } else if (strcmp(tmp[0], "mask") == 0) { *extra = 0; @@ -9638,9 +9645,9 @@ static int rtw_mp_efuse_get(struct net_device *dev, if (padapter->registrypriv.bFileMaskEfuse == _TRUE) _rtw_memcpy(mask_buf, maskfileBuffer, mask_len); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < mask_len; i++) - sprintf(extra, "%s0x%02X\n", extra, mask_buf[i]); + extra_len += sprintf(extra + extra_len, "0x%02X\n", mask_buf[i]); } else sprintf(extra, "Command not found!"); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723cs/os_dep/linux/ioctl_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8723cs/os_dep/linux/ioctl_mp.c index 47b48aac288c..ca2681a9077b 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8723cs/os_dep/linux/ioctl_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723cs/os_dep/linux/ioctl_mp.c @@ -198,7 +198,7 @@ int rtw_mp_read_reg(struct net_device *dev, if (*pnext != '\0') { /*strtout = simple_strtoul(pnext , &ptmp, 16);*/ ret = sscanf(pnext, "%x", &strtout); - sprintf(extra, "%s %d" , extra , strtout); + sprintf(extra + strlen(extra), " %d", strtout); } else break; pch = pnext; @@ -230,7 +230,7 @@ int rtw_mp_read_reg(struct net_device *dev, pnext++; if (*pnext != '\0') { ret = sscanf(pnext, "%x", &strtout); - sprintf(extra, "%s %d" , extra , strtout); + sprintf(extra + strlen(extra), " %d", strtout); } else break; pch = pnext; @@ -341,20 +341,23 @@ int rtw_mp_read_rf(struct net_device *dev, pch = tmp; RTW_INFO("pch=%s", pch); - while (*pch != '\0') { - pnext = strpbrk(pch, " "); - if (!pnext) - break; - pnext++; - if (*pnext != '\0') { - /*strtou =simple_strtoul(pnext , &ptmp, 16);*/ - ret = sscanf(pnext, "%x", &strtou); - sprintf(extra, "%s %d" , extra , strtou); - } else - break; - pch = pnext; + { + size_t extra_len = strlen(extra); + while (*pch != '\0') { + pnext = strpbrk(pch, " "); + if (!pnext) + break; + pnext++; + if (*pnext != '\0') { + /*strtou =simple_strtoul(pnext , &ptmp, 16);*/ + ret = sscanf(pnext, "%x", &strtou); + extra_len += sprintf(extra + extra_len, " %d", strtou); + } else + break; + pch = pnext; + } + wrqu->length = extra_len; } - wrqu->length = strlen(extra); return 0; } @@ -1417,7 +1420,7 @@ int rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra) pmp_priv->mode = MP_ON; sprintf(extra, "Stop continuous Tx"); } else if (pmp_priv->tx.stop == 1) { - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500 count=%u\n", extra, pmp_priv->tx.count); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500 count=%u\n", pmp_priv->tx.count); pmp_priv->tx.stop = 0; SetPacketTx(padapter); } else @@ -1425,26 +1428,26 @@ int rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra) return 0; case MP_SINGLE_TONE_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetSingleToneTx(padapter, (u8)bStartTest); break; case MP_CONTINUOUS_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetContinuousTx(padapter, (u8)bStartTest); break; case MP_CARRIER_SUPPRISSION_TX: if (bStartTest != 0) { if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_11M) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); else - sprintf(extra, "%s\nSpecify carrier suppression but not CCK rate", extra); + sprintf(extra + strlen(extra), "\nSpecify carrier suppression but not CCK rate"); } SetCarrierSuppressionTx(padapter, (u8)bStartTest); break; case MP_SINGLE_CARRIER_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetSingleCarrierTx(padapter, (u8)bStartTest); break; @@ -1496,6 +1499,7 @@ int rtw_mp_tx(struct net_device *dev, u32 bandwidth = 0, sg = 0, channel = 6, txpower = 40, rate = 108, ant = 0, txmode = 1, count = 0; u8 i = 0, j = 0, bStartTest = 1, status = 0, Idx = 0, tmpU1B = 0; u16 antenna = 0; + size_t extra_len; if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length)) return -EFAULT; @@ -1522,13 +1526,13 @@ int rtw_mp_tx(struct net_device *dev, return 0; } else if (strncmp(extra, "setting", 7) == 0) { _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Current Setting :\n Channel:%d", pmp_priv->channel); - sprintf(extra, "%s\n Bandwidth:%d", extra, pmp_priv->bandwidth); - sprintf(extra, "%s\n Rate index:%d", extra, pmp_priv->rateidx); - sprintf(extra, "%s\n TxPower index:%d", extra, pmp_priv->txpoweridx); - sprintf(extra, "%s\n Antenna TxPath:%d", extra, pmp_priv->antenna_tx); - sprintf(extra, "%s\n Antenna RxPath:%d", extra, pmp_priv->antenna_rx); - sprintf(extra, "%s\n MP Mode:%d", extra, pmp_priv->mode); + extra_len = sprintf(extra, "Current Setting :\n Channel:%d", pmp_priv->channel); + extra_len += sprintf(extra + extra_len, "\n Bandwidth:%d", pmp_priv->bandwidth); + extra_len += sprintf(extra + extra_len, "\n Rate index:%d", pmp_priv->rateidx); + extra_len += sprintf(extra + extra_len, "\n TxPower index:%d", pmp_priv->txpoweridx); + extra_len += sprintf(extra + extra_len, "\n Antenna TxPath:%d", pmp_priv->antenna_tx); + extra_len += sprintf(extra + extra_len, "\n Antenna RxPath:%d", pmp_priv->antenna_rx); + extra_len += sprintf(extra + extra_len, "\n MP Mode:%d", pmp_priv->mode); wrqu->data.length = strlen(extra); return 0; #ifdef CONFIG_MP_VHT_HW_TX_MODE @@ -1666,25 +1670,25 @@ int rtw_mp_tx(struct net_device *dev, if (sscanf(extra, "ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d", &channel, &bandwidth, &rate, &txpower, &ant, &txmode) < 6) { RTW_INFO("Invalid format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "\n Please input correct format as bleow:\n"); - sprintf(extra, "%s\t ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d\n", extra, channel, bandwidth, rate, txpower, ant, txmode); - sprintf(extra, "%s\n [ ch : BGN = <1~14> , A or AC = <36~165> ]", extra); - sprintf(extra, "%s\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]", extra); - sprintf(extra, "%s\n [ rate : CCK: 1 2 5.5 11M X 2 = < 2 4 11 22 >]", extra); - sprintf(extra, "%s\n [ OFDM: 6 9 12 18 24 36 48 54M X 2 = < 12 18 24 36 48 72 96 108>", extra); - sprintf(extra, "%s\n [ HT 1S2SS MCS0 ~ MCS15 : < [MCS0]=128 ~ [MCS7]=135 ~ [MCS15]=143 >", extra); - sprintf(extra, "%s\n [ HT 3SS MCS16 ~ MCS32 : < [MCS16]=144 ~ [MCS23]=151 ~ [MCS32]=159 >", extra); - sprintf(extra, "%s\n [ VHT 1SS MCS0 ~ MCS9 : < [MCS0]=160 ~ [MCS9]=169 >", extra); - sprintf(extra, "%s\n [ txpower : 1~63 power index", extra); - sprintf(extra, "%s\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12", extra); - sprintf(extra, "%s\n [ txmode : < 0 = CONTINUOUS_TX, 1 = PACKET_TX, 2 = SINGLE_TONE_TX, 3 = CARRIER_SUPPRISSION_TX, 4 = SINGLE_CARRIER_TX>\n", extra); + extra_len = sprintf(extra, "\n Please input correct format as bleow:\n"); + extra_len += sprintf(extra + extra_len, "\t ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d\n", channel, bandwidth, rate, txpower, ant, txmode); + extra_len += sprintf(extra + extra_len, "\n [ ch : BGN = <1~14> , A or AC = <36~165> ]"); + extra_len += sprintf(extra + extra_len, "\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]"); + extra_len += sprintf(extra + extra_len, "\n [ rate : CCK: 1 2 5.5 11M X 2 = < 2 4 11 22 >]"); + extra_len += sprintf(extra + extra_len, "\n [ OFDM: 6 9 12 18 24 36 48 54M X 2 = < 12 18 24 36 48 72 96 108>"); + extra_len += sprintf(extra + extra_len, "\n [ HT 1S2SS MCS0 ~ MCS15 : < [MCS0]=128 ~ [MCS7]=135 ~ [MCS15]=143 >"); + extra_len += sprintf(extra + extra_len, "\n [ HT 3SS MCS16 ~ MCS32 : < [MCS16]=144 ~ [MCS23]=151 ~ [MCS32]=159 >"); + extra_len += sprintf(extra + extra_len, "\n [ VHT 1SS MCS0 ~ MCS9 : < [MCS0]=160 ~ [MCS9]=169 >"); + extra_len += sprintf(extra + extra_len, "\n [ txpower : 1~63 power index"); + extra_len += sprintf(extra + extra_len, "\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12"); + extra_len += sprintf(extra + extra_len, "\n [ txmode : < 0 = CONTINUOUS_TX, 1 = PACKET_TX, 2 = SINGLE_TONE_TX, 3 = CARRIER_SUPPRISSION_TX, 4 = SINGLE_CARRIER_TX>\n"); wrqu->data.length = strlen(extra); return status; } else { RTW_INFO("Got format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->current_channel = channel; @@ -1693,13 +1697,13 @@ int rtw_mp_tx(struct net_device *dev, bandwidth = CHANNEL_WIDTH_40; else if (bandwidth == 2) bandwidth = CHANNEL_WIDTH_80; - sprintf(extra, "%s\nChange Current Bandwidth %d to Bandwidth %d", extra, padapter->mppriv.bandwidth , bandwidth); + extra_len += sprintf(extra + extra_len, "\nChange Current Bandwidth %d to Bandwidth %d", padapter->mppriv.bandwidth , bandwidth); padapter->mppriv.bandwidth = (u8)bandwidth; padapter->mppriv.preamble = sg; SetBandwidth(padapter); pHalData->current_channel_bw = bandwidth; - sprintf(extra, "%s\nSet power level :%d", extra, txpower); + extra_len += sprintf(extra + extra_len, "\nSet power level :%d", txpower); padapter->mppriv.txpoweridx = (u8)txpower; pMptCtx->TxPwrLevel[ODM_RF_PATH_A] = (u8)txpower; pMptCtx->TxPwrLevel[ODM_RF_PATH_B] = (u8)txpower; @@ -1722,13 +1726,13 @@ int rtw_mp_tx(struct net_device *dev, RTW_INFO("%s: rate index=%d\n", __func__, rate); if (rate >= MPT_RATE_LAST) return -EINVAL; - sprintf(extra, "%s\nSet data rate to %d index %d", extra, padapter->mppriv.rateidx, rate); + extra_len += sprintf(extra + extra_len, "\nSet data rate to %d index %d", padapter->mppriv.rateidx, rate); padapter->mppriv.rateidx = rate; pMptCtx->mpt_rate_index = rate; SetDataRate(padapter); - sprintf(extra, "%s\nSet Antenna Path :%d", extra, ant); + extra_len += sprintf(extra + extra_len, "\nSet Antenna Path :%d", ant); switch (ant) { case 1: antenna = ANTENNA_A; @@ -1805,6 +1809,7 @@ int rtw_mp_rx(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { + size_t extra_len; PADAPTER padapter = rtw_netdev_priv(dev); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct mp_priv *pmp_priv = &padapter->mppriv; @@ -1836,19 +1841,19 @@ int rtw_mp_rx(struct net_device *dev, } else if (sscanf(extra, "ch=%d,bw=%d,ant=%d", &channel, &bandwidth, &ant) < 3) { RTW_INFO("Invalid format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "\n Please input correct format as bleow:\n"); - sprintf(extra, "%s\t ch=%d,bw=%d,ant=%d\n", extra, channel, bandwidth, ant); - sprintf(extra, "%s\n [ ch : BGN = <1~14> , A or AC = <36~165> ]", extra); - sprintf(extra, "%s\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]", extra); - sprintf(extra, "%s\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12", extra); - wrqu->data.length = strlen(extra); + extra_len = sprintf(extra, "\n Please input correct format as bleow:\n"); + extra_len += sprintf(extra + extra_len, "\t ch=%d,bw=%d,ant=%d\n", channel, bandwidth, ant); + extra_len += sprintf(extra + extra_len, "\n [ ch : BGN = <1~14> , A or AC = <36~165> ]"); + extra_len += sprintf(extra + extra_len, "\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]"); + extra_len += sprintf(extra + extra_len, "\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12"); + wrqu->data.length = extra_len; return 0; } else { bStartRx = 1; RTW_INFO("Got format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->current_channel = channel; @@ -1857,13 +1862,13 @@ int rtw_mp_rx(struct net_device *dev, bandwidth = CHANNEL_WIDTH_40; else if (bandwidth == 2) bandwidth = CHANNEL_WIDTH_80; - sprintf(extra, "%s\nChange Current Bandwidth %d to Bandwidth %d", extra, padapter->mppriv.bandwidth , bandwidth); + extra_len += sprintf(extra + extra_len, "\nChange Current Bandwidth %d to Bandwidth %d", padapter->mppriv.bandwidth , bandwidth); padapter->mppriv.bandwidth = (u8)bandwidth; padapter->mppriv.preamble = sg; SetBandwidth(padapter); pHalData->current_channel_bw = bandwidth; - sprintf(extra, "%s\nSet Antenna Path :%d", extra, ant); + extra_len += sprintf(extra + extra_len, "\nSet Antenna Path :%d", ant); switch (ant) { case 1: antenna = ANTENNA_A; @@ -1914,7 +1919,7 @@ int rtw_mp_rx(struct net_device *dev, pHalData->antenna_tx_path = antenna; SetAntenna(padapter); - sprintf(extra, "%s\nstart Rx", extra); + extra_len += sprintf(extra + extra_len, "\nstart Rx"); SetPacketRx(padapter, bStartRx, _FALSE); } wrqu->data.length = strlen(extra); @@ -1956,6 +1961,7 @@ int rtw_efuse_mask_file(struct net_device *dev, char *rtw_efuse_mask_file_path; u8 Status; PADAPTER padapter = rtw_netdev_priv(dev); + size_t extra_len; _rtw_memset(maskfileBuffer, 0x00, sizeof(maskfileBuffer)); @@ -2006,11 +2012,11 @@ int rtw_efuse_mask_file(struct net_device *dev, } while (count < 64); for (i = 0; i < count; i++) - sprintf(extra, "%s:%02x", extra, maskfileBuffer[i]); + extra_len += sprintf(extra + extra_len, ":%02x", maskfileBuffer[i]); padapter->registrypriv.bFileMaskEfuse = _TRUE; - sprintf(extra, "%s\nLoad Efuse Mask data %d hex ok\n", extra, count); + extra_len += sprintf(extra + extra_len, "\nLoad Efuse Mask data %d hex ok\n", count); wrqu->data.length = strlen(extra); return 0; } @@ -2388,16 +2394,17 @@ todo: mptbt_BtControlProcess(padapter, &BtReq); if (readtherm == 0) { - sprintf(extra, "BT thermal="); + size_t extra_len = sprintf(extra, "BT thermal="); for (i = 4; i < pMptCtx->mptOutLen; i++) { if ((pMptCtx->mptOutBuf[i] == 0x00) && (pMptCtx->mptOutBuf[i + 1] == 0x00)) goto exit; - sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i] & 0x1f)); + extra_len += sprintf(extra + extra_len, " %d ", (pMptCtx->mptOutBuf[i] & 0x1f)); } } else { + size_t extra_len = strlen(extra); for (i = 4; i < pMptCtx->mptOutLen; i++) - sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]); + extra_len += sprintf(extra + extra_len, " 0x%x ", pMptCtx->mptOutBuf[i]); } exit: diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723ds/core/rtw_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8723ds/core/rtw_mp.c index 548a293b73ff..3c48e1f674dc 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8723ds/core/rtw_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723ds/core/rtw_mp.c @@ -2444,14 +2444,17 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) data[0] = '\0'; - i = psd_start; - while (i < psd_stop) { - if (i >= psd_pts) - psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); - else - psd_data = rtw_GetPSDData(pAdapter, i); - sprintf(data, "%s%x ", data, psd_data); - i++; + { + size_t extra_len = strlen(data); + i = psd_start; + while (i < psd_stop) { + if (i >= psd_pts) + psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); + else + psd_data = rtw_GetPSDData(pAdapter, i); + extra_len += sprintf(data + extra_len, "%x ", psd_data); + i++; + } } #ifdef CONFIG_LONG_DELAY_ISSUE diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723ds/os_dep/linux/ioctl_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8723ds/os_dep/linux/ioctl_mp.c index afd10ab97fd8..9fa849e32212 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8723ds/os_dep/linux/ioctl_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723ds/os_dep/linux/ioctl_mp.c @@ -551,6 +551,7 @@ int rtw_mp_txpower_index(struct net_device *dev, char input[wrqu->length + 1]; u32 rfpath; u32 txpower_inx; + size_t extra_len; if (wrqu->length > 128) return -EFAULT; @@ -571,15 +572,15 @@ int rtw_mp_txpower_index(struct net_device *dev, sprintf(extra, "patha=%d", txpower_inx); if (phal_data->rf_type > RF_1T2R) { txpower_inx = mpt_ProQueryCalTxPower(padapter, 1); - sprintf(extra, "%s,pathb=%d", extra, txpower_inx); + extra_len += sprintf(extra + extra_len, ",pathb=%d", txpower_inx); } if (phal_data->rf_type > RF_2T4R) { txpower_inx = mpt_ProQueryCalTxPower(padapter, 2); - sprintf(extra, "%s,pathc=%d", extra, txpower_inx); + extra_len += sprintf(extra + extra_len, ",pathc=%d", txpower_inx); } if (phal_data->rf_type > RF_3T4R) { txpower_inx = mpt_ProQueryCalTxPower(padapter, 3); - sprintf(extra, "%s,pathd=%d", extra, txpower_inx); + extra_len += sprintf(extra + extra_len, ",pathd=%d", txpower_inx); } } wrqu->length = strlen(extra); @@ -1821,7 +1822,7 @@ int rtw_mp_tx(struct net_device *dev, char *pextra = extra; RTW_INFO("Got format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->current_channel = channel; @@ -1944,6 +1945,7 @@ int rtw_mp_rx(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { + size_t extra_len; PADAPTER padapter = rtw_netdev_priv(dev); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct mp_priv *pmp_priv = &padapter->mppriv; @@ -1987,7 +1989,7 @@ int rtw_mp_rx(struct net_device *dev, bStartRx = 1; RTW_INFO("Got format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->current_channel = channel; @@ -2158,6 +2160,7 @@ int rtw_efuse_mask_file(struct net_device *dev, char *rtw_efuse_mask_file_path; u8 Status; PADAPTER padapter = rtw_netdev_priv(dev); + size_t extra_len; _rtw_memset(maskfileBuffer, 0x00, sizeof(maskfileBuffer)); @@ -2208,11 +2211,11 @@ int rtw_efuse_mask_file(struct net_device *dev, } while (count < 64); for (i = 0; i < count; i++) - sprintf(extra, "%s:%02x", extra, maskfileBuffer[i]); + extra_len += sprintf(extra + extra_len, ":%02x", maskfileBuffer[i]); padapter->registrypriv.bFileMaskEfuse = _TRUE; - sprintf(extra, "%s\nLoad Efuse Mask data %d hex ok\n", extra, count); + extra_len += sprintf(extra + extra_len, "\nLoad Efuse Mask data %d hex ok\n", count); wrqu->data.length = strlen(extra); return 0; } @@ -2635,16 +2638,17 @@ todo: mptbt_BtControlProcess(padapter, &BtReq); if (readtherm == 0) { - sprintf(extra, "BT thermal="); + size_t extra_len = sprintf(extra, "BT thermal="); for (i = 4; i < pMptCtx->mptOutLen; i++) { if ((pMptCtx->mptOutBuf[i] == 0x00) && (pMptCtx->mptOutBuf[i + 1] == 0x00)) goto exit; - sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i] & 0x1f)); + extra_len += sprintf(extra + extra_len, " %d ", (pMptCtx->mptOutBuf[i] & 0x1f)); } } else { + size_t extra_len = strlen(extra); for (i = 4; i < pMptCtx->mptOutLen; i++) - sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]); + extra_len += sprintf(extra + extra_len, " 0x%x ", pMptCtx->mptOutBuf[i]); } exit: diff --git a/drivers/net/wireless/rockchip_wlan/rtl8822be/core/rtw_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8822be/core/rtw_mp.c index 98054d1338a2..590b4ac87825 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8822be/core/rtw_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8822be/core/rtw_mp.c @@ -2076,14 +2076,17 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) data[0] = '\0'; - i = psd_start; - while (i < psd_stop) { - if (i >= psd_pts) - psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); - else - psd_data = rtw_GetPSDData(pAdapter, i); - sprintf(data, "%s%x ", data, psd_data); - i++; + { + size_t extra_len = strlen(data); + i = psd_start; + while (i < psd_stop) { + if (i >= psd_pts) + psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); + else + psd_data = rtw_GetPSDData(pAdapter, i); + extra_len += sprintf(data + extra_len, "%x ", psd_data); + i++; + } } #ifdef CONFIG_LONG_DELAY_ISSUE diff --git a/drivers/net/wireless/rockchip_wlan/rtl8822be/os_dep/linux/ioctl_linux.c b/drivers/net/wireless/rockchip_wlan/rtl8822be/os_dep/linux/ioctl_linux.c index be44a62c438b..d80c366700b6 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8822be/os_dep/linux/ioctl_linux.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8822be/os_dep/linux/ioctl_linux.c @@ -9059,6 +9059,7 @@ static int rtw_mp_efuse_get(struct net_device *dev, #ifdef CONFIG_IOL u8 org_fw_iol = padapter->registrypriv.fw_iol;/* 0:Disable, 1:enable, 2:by usb speed */ #endif + size_t extra_len; wrqu = (struct iw_point *)wdata; pwrctrlpriv = adapter_to_pwrctl(padapter); @@ -9114,22 +9115,22 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else if (strcmp(tmp[0], "drvmap") == 0) { EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, _FALSE); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < mapLen; i += 16) { /*RTW_INFO("0x%02x\t", i);*/ - sprintf(extra, "%s0x%02x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i); for (j = 0; j < 8; j++) { /* RTW_INFO("%02X ", data[i+j]); */ - sprintf(extra, "%s%02X ", extra, PROMContent[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", PROMContent[i + j]); } /* RTW_INFO("\t"); */ - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) { /* RTW_INFO("%02X ", data[i+j]); */ - sprintf(extra, "%s%02X ", extra, PROMContent[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", PROMContent[i + j]); } /* RTW_INFO("\n"); */ - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } /* RTW_INFO("\n"); */ } else if (strcmp(tmp[0], "realmap") == 0) { @@ -9169,18 +9170,18 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else order = 0; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < cnt; i += 16) { - sprintf(extra, "%s0x%02x\t", extra, shift + i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", shift + i); for (j = 0; j < 8; j++) - sprintf(extra, "%s%02X ", extra, efuse[i + j]); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i + j]); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) - sprintf(extra, "%s%02X ", extra, efuse[i + j]); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i + j]); + extra_len += sprintf(extra + extra_len, "\n"); } if ((shift + cnt) < mapLen) - sprintf(extra, "%s\t...more\n", extra); + extra_len += sprintf(extra + extra_len, "\t...more\n"); } else if (strcmp(tmp[0], "rmap") == 0) { if ((tmp[1] == NULL) || (tmp[2] == NULL)) { RTW_INFO("%s: rmap Fail!! Parameters error!\n", __FUNCTION__); @@ -9215,9 +9216,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, /* RTW_INFO("%s: data={", __FUNCTION__); */ *extra = 0; + extra_len = 0; for (i = 0; i < cnts; i++) { /* RTW_INFO("0x%02x ", data[i]); */ - sprintf(extra, "%s0x%02X ", extra, data[i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", data[i]); } /* RTW_INFO("}\n"); */ } else if (strcmp(tmp[0], "realraw") == 0) { @@ -9244,18 +9246,18 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else raw_order = 0; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < cnt; i += 16) { - sprintf(extra, "%s0x%02x\t", extra, shift + i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", shift + i); for (j = 0; j < 8; j++) - sprintf(extra, "%s%02X ", extra, rawdata[i + j]); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "%02X ", rawdata[i + j]); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) - sprintf(extra, "%s%02X ", extra, rawdata[i + j]); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "%02X ", rawdata[i + j]); + extra_len += sprintf(extra + extra_len, "\n"); } if ((shift + cnt) < mapLen) - sprintf(extra, "%s\t...more (left:%d/%d)\n", extra, mapLen-(shift + cnt), mapLen); + extra_len += sprintf(extra + extra_len, "\t...more (left:%d/%d)\n", mapLen-(shift + cnt), mapLen); } else if (strcmp(tmp[0], "btrealraw") == 0) { static u8 bt_raw_order = 0; @@ -9290,19 +9292,19 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else bt_raw_order = 0; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < cnt; i += 16) { - sprintf(extra, "%s0x%02x\t", extra, shift + i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", shift + i); for (j = 0; j < 8; j++) - sprintf(extra, "%s%02X ", extra, rawdata[i + j]); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "%02X ", rawdata[i + j]); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) - sprintf(extra, "%s%02X ", extra, rawdata[i + j]); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "%02X ", rawdata[i + j]); + extra_len += sprintf(extra + extra_len, "\n"); } if ((shift + cnt) < mapLen) - sprintf(extra, "%s\t...more (left:%d/%d)\n", extra, mapLen-(shift + cnt), mapLen); + extra_len += sprintf(extra + extra_len, "\t...more (left:%d/%d)\n", mapLen-(shift + cnt), mapLen); } else if (strcmp(tmp[0], "mac") == 0) { if (hal_efuse_macaddr_offset(padapter) == -1) { err = -EFAULT; @@ -9327,12 +9329,13 @@ static int rtw_mp_efuse_get(struct net_device *dev, /* RTW_INFO("%s: MAC address={", __FUNCTION__); */ *extra = 0; + extra_len = 0; for (i = 0; i < cnts; i++) { /* RTW_INFO("%02X", data[i]); */ - sprintf(extra, "%s%02X", extra, data[i]); + extra_len += sprintf(extra + extra_len, "%02X", data[i]); if (i != (cnts - 1)) { /* RTW_INFO(":"); */ - sprintf(extra, "%s:", extra); + extra_len += sprintf(extra + extra_len, ":"); } } /* RTW_INFO("}\n"); */ @@ -9390,12 +9393,13 @@ static int rtw_mp_efuse_get(struct net_device *dev, /* RTW_INFO("%s: {VID,PID}={", __FUNCTION__); */ *extra = 0; + extra_len = 0; for (i = 0; i < cnts; i++) { /* RTW_INFO("0x%02x", data[i]); */ - sprintf(extra, "%s0x%02X", extra, data[i]); + extra_len += sprintf(extra + extra_len, "0x%02X", data[i]); if (i != (cnts - 1)) { /* RTW_INFO(","); */ - sprintf(extra, "%s,", extra); + extra_len += sprintf(extra + extra_len, ","); } } /* RTW_INFO("}\n"); */ @@ -9423,22 +9427,22 @@ static int rtw_mp_efuse_get(struct net_device *dev, } /* RTW_INFO("OFFSET\tVALUE(hex)\n"); */ - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < 512; i += 16) { /* set 512 because the iwpriv's extra size have limit 0x7FF */ /* RTW_INFO("0x%03x\t", i); */ - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j = 0; j < 8; j++) { /* RTW_INFO("%02X ", pEfuseHal->BTEfuseInitMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i + j]); } /* RTW_INFO("\t"); */ - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) { /* RTW_INFO("%02X ", pEfuseHal->BTEfuseInitMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i + j]); } /* RTW_INFO("\n"); */ - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } /* RTW_INFO("\n"); */ } else if (strcmp(tmp[0], "btbmap") == 0) { @@ -9452,22 +9456,22 @@ static int rtw_mp_efuse_get(struct net_device *dev, } /* RTW_INFO("OFFSET\tVALUE(hex)\n"); */ - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 512; i < 1024 ; i += 16) { /* RTW_INFO("0x%03x\t", i); */ - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j = 0; j < 8; j++) { /* RTW_INFO("%02X ", data[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i + j]); } /* RTW_INFO("\t"); */ - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) { /* RTW_INFO("%02X ", data[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i + j]); } /* RTW_INFO("\n"); */ - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } /* RTW_INFO("\n"); */ } else if (strcmp(tmp[0], "btrmap") == 0) { @@ -9517,51 +9521,52 @@ static int rtw_mp_efuse_get(struct net_device *dev, } *extra = 0; + extra_len = 0; /* RTW_INFO("%s: bt efuse data={", __FUNCTION__); */ for (i = 0; i < cnts; i++) { /* RTW_INFO("0x%02x ", data[i]); */ - sprintf(extra, "%s 0x%02X ", extra, data[i]); + extra_len += sprintf(extra + extra_len, " 0x%02X ", data[i]); } /* RTW_INFO("}\n"); */ RTW_INFO(FUNC_ADPT_FMT ": BT MAC=[%s]\n", FUNC_ADPT_ARG(padapter), extra); } else if (strcmp(tmp[0], "btffake") == 0) { /* RTW_INFO("OFFSET\tVALUE(hex)\n"); */ - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < 512; i += 16) { /* RTW_INFO("0x%03x\t", i); */ - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j = 0; j < 8; j++) { /* RTW_INFO("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i + j]); } /* RTW_INFO("\t"); */ - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) { /* RTW_INFO("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i + j]); } /* RTW_INFO("\n"); */ - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } /* RTW_INFO("\n"); */ } else if (strcmp(tmp[0], "btbfake") == 0) { /* RTW_INFO("OFFSET\tVALUE(hex)\n"); */ - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 512; i < 1024; i += 16) { /* RTW_INFO("0x%03x\t", i); */ - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j = 0; j < 8; j++) { /* RTW_INFO("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i + j]); } /* RTW_INFO("\t"); */ - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) { /* RTW_INFO("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); */ - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i + j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i + j]); } /* RTW_INFO("\n"); */ - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } /* RTW_INFO("\n"); */ } else if (strcmp(tmp[0], "wlrfkmap") == 0) { @@ -9582,18 +9587,18 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else fk_order = 0; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < cnt; i += 16) { - sprintf(extra, "%s0x%02x\t", extra, shift + i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", shift + i); for (j = 0; j < 8; j++) - sprintf(extra, "%s%02X ", extra, efuse[i + j]); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i + j]); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++) - sprintf(extra, "%s%02X ", extra, efuse[i + j]); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "%02X ", efuse[i + j]); + extra_len += sprintf(extra + extra_len, "\n"); } if ((shift + cnt) < mapLen) - sprintf(extra, "%s\t...more\n", extra); + extra_len += sprintf(extra + extra_len, "\t...more\n"); } else if (strcmp(tmp[0], "wlrfkrmap") == 0) { if ((tmp[1] == NULL) || (tmp[2] == NULL)) { @@ -9615,9 +9620,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, /* RTW_INFO("%s: data={", __FUNCTION__); */ *extra = 0; + extra_len = 0; for (i = 0; i < cnts; i++) { RTW_INFO("wlrfkrmap = 0x%02x\n", pEfuseHal->fakeEfuseModifiedMap[addr + i]); - sprintf(extra, "%s0x%02X ", extra, pEfuseHal->fakeEfuseModifiedMap[addr + i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", pEfuseHal->fakeEfuseModifiedMap[addr + i]); } } else if (strcmp(tmp[0], "btrfkrmap") == 0) { if ((tmp[1] == NULL) || (tmp[2] == NULL)) { @@ -9639,9 +9645,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, /* RTW_INFO("%s: data={", __FUNCTION__); */ *extra = 0; + extra_len = 0; for (i = 0; i < cnts; i++) { RTW_INFO("wlrfkrmap = 0x%02x\n", pEfuseHal->fakeBTEfuseModifiedMap[addr + i]); - sprintf(extra, "%s0x%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[addr + i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", pEfuseHal->fakeBTEfuseModifiedMap[addr + i]); } } else sprintf(extra, "Command not found!"); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8822be/os_dep/linux/ioctl_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8822be/os_dep/linux/ioctl_mp.c index ce3484d36fd1..c304e81e0a57 100644 --- a/drivers/net/wireless/rockchip_wlan/rtl8822be/os_dep/linux/ioctl_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8822be/os_dep/linux/ioctl_mp.c @@ -198,7 +198,7 @@ int rtw_mp_read_reg(struct net_device *dev, if (*pnext != '\0') { /*strtout = simple_strtoul(pnext , &ptmp, 16);*/ ret = sscanf(pnext, "%x", &strtout); - sprintf(extra, "%s %d" , extra , strtout); + sprintf(extra + strlen(extra), " %d", strtout); } else break; pch = pnext; @@ -230,7 +230,7 @@ int rtw_mp_read_reg(struct net_device *dev, pnext++; if (*pnext != '\0') { ret = sscanf(pnext, "%x", &strtout); - sprintf(extra, "%s %d" , extra , strtout); + sprintf(extra + strlen(extra), " %d", strtout); } else break; pch = pnext; @@ -341,20 +341,23 @@ int rtw_mp_read_rf(struct net_device *dev, pch = tmp; RTW_INFO("pch=%s", pch); - while (*pch != '\0') { - pnext = strpbrk(pch, " "); - if (!pnext) - break; - pnext++; - if (*pnext != '\0') { - /*strtou =simple_strtoul(pnext , &ptmp, 16);*/ - ret = sscanf(pnext, "%x", &strtou); - sprintf(extra, "%s %d" , extra , strtou); - } else - break; - pch = pnext; + { + size_t extra_len = strlen(extra); + while (*pch != '\0') { + pnext = strpbrk(pch, " "); + if (!pnext) + break; + pnext++; + if (*pnext != '\0') { + /*strtou =simple_strtoul(pnext , &ptmp, 16);*/ + ret = sscanf(pnext, "%x", &strtou); + extra_len += sprintf(extra + extra_len, " %d", strtou); + } else + break; + pch = pnext; + } + wrqu->length = extra_len; } - wrqu->length = strlen(extra); return 0; } @@ -1412,7 +1415,7 @@ int rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra) pmp_priv->mode = MP_ON; sprintf(extra, "Stop continuous Tx"); } else if (pmp_priv->tx.stop == 1) { - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500 count=%u\n", extra, pmp_priv->tx.count); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500 count=%u\n", pmp_priv->tx.count); pmp_priv->tx.stop = 0; SetPacketTx(padapter); } else @@ -1420,26 +1423,26 @@ int rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra) return 0; case MP_SINGLE_TONE_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetSingleToneTx(padapter, (u8)bStartTest); break; case MP_CONTINUOUS_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetContinuousTx(padapter, (u8)bStartTest); break; case MP_CARRIER_SUPPRISSION_TX: if (bStartTest != 0) { if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_11M) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); else - sprintf(extra, "%s\nSpecify carrier suppression but not CCK rate", extra); + sprintf(extra + strlen(extra), "\nSpecify carrier suppression but not CCK rate"); } SetCarrierSuppressionTx(padapter, (u8)bStartTest); break; case MP_SINGLE_CARRIER_TX: if (bStartTest != 0) - sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); + sprintf(extra + strlen(extra), "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes."); SetSingleCarrierTx(padapter, (u8)bStartTest); break; @@ -1517,13 +1520,13 @@ int rtw_mp_tx(struct net_device *dev, return 0; } else if (strncmp(extra, "setting", 7) == 0) { _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Current Setting :\n Channel:%d", pmp_priv->channel); - sprintf(extra, "%s\n Bandwidth:%d", extra, pmp_priv->bandwidth); - sprintf(extra, "%s\n Rate index:%d", extra, pmp_priv->rateidx); - sprintf(extra, "%s\n TxPower index:%d", extra, pmp_priv->txpoweridx); - sprintf(extra, "%s\n Antenna TxPath:%d", extra, pmp_priv->antenna_tx); - sprintf(extra, "%s\n Antenna RxPath:%d", extra, pmp_priv->antenna_rx); - sprintf(extra, "%s\n MP Mode:%d", extra, pmp_priv->mode); + extra_len = sprintf(extra, "Current Setting :\n Channel:%d", pmp_priv->channel); + extra_len += sprintf(extra + extra_len, "\n Bandwidth:%d", pmp_priv->bandwidth); + extra_len += sprintf(extra + extra_len, "\n Rate index:%d", pmp_priv->rateidx); + extra_len += sprintf(extra + extra_len, "\n TxPower index:%d", pmp_priv->txpoweridx); + extra_len += sprintf(extra + extra_len, "\n Antenna TxPath:%d", pmp_priv->antenna_tx); + extra_len += sprintf(extra + extra_len, "\n Antenna RxPath:%d", pmp_priv->antenna_rx); + extra_len += sprintf(extra + extra_len, "\n MP Mode:%d", pmp_priv->mode); wrqu->data.length = strlen(extra); return 0; #ifdef CONFIG_MP_VHT_HW_TX_MODE @@ -1661,25 +1664,25 @@ int rtw_mp_tx(struct net_device *dev, if (sscanf(extra, "ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d", &channel, &bandwidth, &rate, &txpower, &ant, &txmode) < 6) { RTW_INFO("Invalid format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "\n Please input correct format as bleow:\n"); - sprintf(extra, "%s\t ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d\n", extra, channel, bandwidth, rate, txpower, ant, txmode); - sprintf(extra, "%s\n [ ch : BGN = <1~14> , A or AC = <36~165> ]", extra); - sprintf(extra, "%s\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]", extra); - sprintf(extra, "%s\n [ rate : CCK: 1 2 5.5 11M X 2 = < 2 4 11 22 >]", extra); - sprintf(extra, "%s\n [ OFDM: 6 9 12 18 24 36 48 54M X 2 = < 12 18 24 36 48 72 96 108>", extra); - sprintf(extra, "%s\n [ HT 1S2SS MCS0 ~ MCS15 : < [MCS0]=128 ~ [MCS7]=135 ~ [MCS15]=143 >", extra); - sprintf(extra, "%s\n [ HT 3SS MCS16 ~ MCS32 : < [MCS16]=144 ~ [MCS23]=151 ~ [MCS32]=159 >", extra); - sprintf(extra, "%s\n [ VHT 1SS MCS0 ~ MCS9 : < [MCS0]=160 ~ [MCS9]=169 >", extra); - sprintf(extra, "%s\n [ txpower : 1~63 power index", extra); - sprintf(extra, "%s\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12", extra); - sprintf(extra, "%s\n [ txmode : < 0 = CONTINUOUS_TX, 1 = PACKET_TX, 2 = SINGLE_TONE_TX, 3 = CARRIER_SUPPRISSION_TX, 4 = SINGLE_CARRIER_TX>\n", extra); + extra_len = sprintf(extra, "\n Please input correct format as bleow:\n"); + extra_len += sprintf(extra + extra_len, "\t ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d\n", channel, bandwidth, rate, txpower, ant, txmode); + extra_len += sprintf(extra + extra_len, "\n [ ch : BGN = <1~14> , A or AC = <36~165> ]"); + extra_len += sprintf(extra + extra_len, "\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]"); + extra_len += sprintf(extra + extra_len, "\n [ rate : CCK: 1 2 5.5 11M X 2 = < 2 4 11 22 >]"); + extra_len += sprintf(extra + extra_len, "\n [ OFDM: 6 9 12 18 24 36 48 54M X 2 = < 12 18 24 36 48 72 96 108>"); + extra_len += sprintf(extra + extra_len, "\n [ HT 1S2SS MCS0 ~ MCS15 : < [MCS0]=128 ~ [MCS7]=135 ~ [MCS15]=143 >"); + extra_len += sprintf(extra + extra_len, "\n [ HT 3SS MCS16 ~ MCS32 : < [MCS16]=144 ~ [MCS23]=151 ~ [MCS32]=159 >"); + extra_len += sprintf(extra + extra_len, "\n [ VHT 1SS MCS0 ~ MCS9 : < [MCS0]=160 ~ [MCS9]=169 >"); + extra_len += sprintf(extra + extra_len, "\n [ txpower : 1~63 power index"); + extra_len += sprintf(extra + extra_len, "\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12"); + extra_len += sprintf(extra + extra_len, "\n [ txmode : < 0 = CONTINUOUS_TX, 1 = PACKET_TX, 2 = SINGLE_TONE_TX, 3 = CARRIER_SUPPRISSION_TX, 4 = SINGLE_CARRIER_TX>\n"); wrqu->data.length = strlen(extra); return status; } else { RTW_INFO("Got format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->CurrentChannel = channel; @@ -1688,13 +1691,13 @@ int rtw_mp_tx(struct net_device *dev, bandwidth = CHANNEL_WIDTH_40; else if (bandwidth == 2) bandwidth = CHANNEL_WIDTH_80; - sprintf(extra, "%s\nChange Current Bandwidth %d to Bandwidth %d", extra, padapter->mppriv.bandwidth , bandwidth); + extra_len += sprintf(extra + extra_len, "\nChange Current Bandwidth %d to Bandwidth %d", padapter->mppriv.bandwidth , bandwidth); padapter->mppriv.bandwidth = (u8)bandwidth; padapter->mppriv.preamble = sg; SetBandwidth(padapter); pHalData->CurrentChannelBW = bandwidth; - sprintf(extra, "%s\nSet power level :%d", extra, txpower); + extra_len += sprintf(extra + extra_len, "\nSet power level :%d", txpower); padapter->mppriv.txpoweridx = (u8)txpower; pMptCtx->TxPwrLevel[ODM_RF_PATH_A] = (u8)txpower; pMptCtx->TxPwrLevel[ODM_RF_PATH_B] = (u8)txpower; @@ -1717,13 +1720,13 @@ int rtw_mp_tx(struct net_device *dev, RTW_INFO("%s: rate index=%d\n", __func__, rate); if (rate >= MPT_RATE_LAST) return -EINVAL; - sprintf(extra, "%s\nSet data rate to %d index %d", extra, padapter->mppriv.rateidx, rate); + extra_len += sprintf(extra + extra_len, "\nSet data rate to %d index %d", padapter->mppriv.rateidx, rate); padapter->mppriv.rateidx = rate; pMptCtx->MptRateIndex = rate; SetDataRate(padapter); - sprintf(extra, "%s\nSet Antenna Path :%d", extra, ant); + extra_len += sprintf(extra + extra_len, "\nSet Antenna Path :%d", ant); switch (ant) { case 1: antenna = ANTENNA_A; @@ -1800,6 +1803,7 @@ int rtw_mp_rx(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { + size_t extra_len; PADAPTER padapter = rtw_netdev_priv(dev); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct mp_priv *pmp_priv = &padapter->mppriv; @@ -1831,19 +1835,19 @@ int rtw_mp_rx(struct net_device *dev, } else if (sscanf(extra, "ch=%d,bw=%d,ant=%d", &channel, &bandwidth, &ant) < 3) { RTW_INFO("Invalid format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "\n Please input correct format as bleow:\n"); - sprintf(extra, "%s\t ch=%d,bw=%d,ant=%d\n", extra, channel, bandwidth, ant); - sprintf(extra, "%s\n [ ch : BGN = <1~14> , A or AC = <36~165> ]", extra); - sprintf(extra, "%s\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]", extra); - sprintf(extra, "%s\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12", extra); - wrqu->data.length = strlen(extra); + extra_len = sprintf(extra, "\n Please input correct format as bleow:\n"); + extra_len += sprintf(extra + extra_len, "\t ch=%d,bw=%d,ant=%d\n", channel, bandwidth, ant); + extra_len += sprintf(extra + extra_len, "\n [ ch : BGN = <1~14> , A or AC = <36~165> ]"); + extra_len += sprintf(extra + extra_len, "\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]"); + extra_len += sprintf(extra + extra_len, "\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12"); + wrqu->data.length = extra_len; return 0; } else { bStartRx = 1; RTW_INFO("Got format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->CurrentChannel = channel; @@ -1852,13 +1856,13 @@ int rtw_mp_rx(struct net_device *dev, bandwidth = CHANNEL_WIDTH_40; else if (bandwidth == 2) bandwidth = CHANNEL_WIDTH_80; - sprintf(extra, "%s\nChange Current Bandwidth %d to Bandwidth %d", extra, padapter->mppriv.bandwidth , bandwidth); + extra_len += sprintf(extra + extra_len, "\nChange Current Bandwidth %d to Bandwidth %d", padapter->mppriv.bandwidth , bandwidth); padapter->mppriv.bandwidth = (u8)bandwidth; padapter->mppriv.preamble = sg; SetBandwidth(padapter); pHalData->CurrentChannelBW = bandwidth; - sprintf(extra, "%s\nSet Antenna Path :%d", extra, ant); + extra_len += sprintf(extra + extra_len, "\nSet Antenna Path :%d", ant); switch (ant) { case 1: antenna = ANTENNA_A; @@ -1909,7 +1913,7 @@ int rtw_mp_rx(struct net_device *dev, pHalData->AntennaTxPath = antenna; SetAntenna(padapter); - sprintf(extra, "%s\nstart Rx", extra); + extra_len += sprintf(extra + extra_len, "\nstart Rx"); SetPacketRx(padapter, bStartRx, _FALSE); } wrqu->data.length = strlen(extra); @@ -1951,6 +1955,7 @@ int rtw_efuse_mask_file(struct net_device *dev, char *rtw_efuse_mask_file_path; u8 Status; PADAPTER padapter = rtw_netdev_priv(dev); + size_t extra_len; _rtw_memset(maskfileBuffer, 0x00, sizeof(maskfileBuffer)); @@ -2339,16 +2344,17 @@ todo: mptbt_BtControlProcess(padapter, &BtReq); if (readtherm == 0) { - sprintf(extra, "BT thermal="); + size_t extra_len = sprintf(extra, "BT thermal="); for (i = 4; i < pMptCtx->mptOutLen; i++) { if ((pMptCtx->mptOutBuf[i] == 0x00) && (pMptCtx->mptOutBuf[i + 1] == 0x00)) goto exit; - sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i] & 0x1f)); + extra_len += sprintf(extra + extra_len, " %d ", (pMptCtx->mptOutBuf[i] & 0x1f)); } } else { + size_t extra_len = strlen(extra); for (i = 4; i < pMptCtx->mptOutLen; i++) - sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]); + extra_len += sprintf(extra + extra_len, " 0x%x ", pMptCtx->mptOutBuf[i]); } exit: diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_mp.c b/drivers/net/wireless/rtl8192cu/core/rtw_mp.c index 9af42cdc980a..73be688b5fed 100755 --- a/drivers/net/wireless/rtl8192cu/core/rtw_mp.c +++ b/drivers/net/wireless/rtl8192cu/core/rtw_mp.c @@ -1276,7 +1276,7 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) { u32 i, psd_pts=0, psd_start=0, psd_stop=0; u32 psd_data=0; - + size_t data_len = 0; #ifdef PLATFORM_LINUX if (!netif_running(pAdapter->pnetdev)) { RT_TRACE(_module_mp_, _drv_warning_, ("mp_query_psd: Fail! interface not opened!\n")); @@ -1307,7 +1307,7 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) } else { psd_data = GetPSDData(pAdapter, i); } - sprintf(data, "%s%x ", data, psd_data); + data_len += sprintf(data + data_len, "%x ", psd_data); i++; } diff --git a/drivers/net/wireless/rtl8192cu/os_dep/linux/ioctl_linux.c b/drivers/net/wireless/rtl8192cu/os_dep/linux/ioctl_linux.c index 9adbeaf16cf8..3e067fe7422c 100755 --- a/drivers/net/wireless/rtl8192cu/os_dep/linux/ioctl_linux.c +++ b/drivers/net/wireless/rtl8192cu/os_dep/linux/ioctl_linux.c @@ -8668,6 +8668,7 @@ static int rtw_mp_efuse_get(struct net_device *dev, u16 mapLen=0; char *pch, *ptmp, *token, *tmp[3]={0x00,0x00,0x00}; u16 addr = 0, cnts = 0, max_available_size = 0,raw_cursize = 0 ,raw_maxsize = 0; + size_t extra_len; _rtw_memset(data, '\0', sizeof(data)); _rtw_memset(rawdata, '\0', sizeof(rawdata)); @@ -8701,27 +8702,27 @@ static int rtw_mp_efuse_get(struct net_device *dev, } _rtw_memset(extra, '\0', sizeof(extra)); DBG_871X("\tOFFSET\tVALUE(hex)\n"); - sprintf(extra, "%s \n", extra); + extra_len = sprintf(extra, " \n"); for ( i = 0; i < EFUSE_MAP_SIZE; i += 16 ) { DBG_871X("\t0x%02x\t", i); - sprintf(extra, "%s \t0x%02x\t", extra,i); + extra_len += sprintf(extra + extra_len, " \t0x%02x\t",i); for (j = 0; j < 8; j++) { DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s %02X", extra, data[i+j]); + extra_len += sprintf(extra + extra_len, " %02X", data[i+j]); } DBG_871X("\t"); - sprintf(extra,"%s\t",extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j < 16; j++){ DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s %02X", extra, data[i+j]); + extra_len += sprintf(extra + extra_len, " %02X", data[i+j]); } DBG_871X("\n"); - sprintf(extra,"%s\n",extra); + extra_len += sprintf(extra + extra_len, "\n"); } DBG_871X("\n"); - wrqu->length = strlen(extra); + wrqu->length = extra_len; return 0; } @@ -8753,14 +8754,15 @@ static int rtw_mp_efuse_get(struct net_device *dev, } _rtw_memset(extra, '\0', sizeof(extra)); + extra_len = 0; for ( i = 0; i < cnts; i ++) { DBG_871X("0x%02x", data[i]); - sprintf(extra, "%s 0x%02X", extra, data[i]); + extra_len += sprintf(extra + extra_len, " 0x%02X", data[i]); DBG_871X(" "); - sprintf(extra,"%s ",extra); + extra_len += sprintf(extra + extra_len, " "); } - wrqu->length = strlen(extra)+1; + wrqu->length = extra_len; DBG_871X("extra = %s ", extra); @@ -8780,20 +8782,21 @@ static int rtw_mp_efuse_get(struct net_device *dev, } _rtw_memset(extra, '\0', sizeof(extra)); + extra_len = 0; for ( i=0; i<mapLen; i++ ) { DBG_871X(" %02x", rawdata[i]); - sprintf(extra, "%s %02x", extra, rawdata[i] ); + extra_len += sprintf(extra + extra_len, " %02x", rawdata[i] ); if ((i & 0xF) == 0xF){ DBG_871X("\n\t"); - sprintf(extra, "%s\n\t", extra); + extra_len += sprintf(extra + extra_len, "\n\t"); } else if ((i & 0x7) == 0x7){ DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); } } - wrqu->length = strlen(extra); + wrqu->length = extra_len; return 0; } else if ( strcmp(tmp[0],"mac") == 0 ) { @@ -8819,13 +8822,14 @@ static int rtw_mp_efuse_get(struct net_device *dev, DBG_871X("rtw_efuse_access ok \n"); } _rtw_memset(extra, '\0', sizeof(extra)); + extra_len = 0; for ( i = 0; i < cnts; i ++) { DBG_871X("0x%02x", data[i]); - sprintf(extra, "%s 0x%02X", extra, data[i+j]); + extra_len += sprintf(extra + extra_len, " 0x%02X", data[i+j]); DBG_871X(" "); - sprintf(extra,"%s ",extra); + extra_len += sprintf(extra + extra_len, " "); } - wrqu->length = strlen(extra); + wrqu->length = extra_len; return 0; } else if ( strcmp(tmp[0],"vidpid") == 0 ) { @@ -8850,26 +8854,29 @@ static int rtw_mp_efuse_get(struct net_device *dev, DBG_871X("rtw_efuse_access ok \n"); } _rtw_memset(extra, '\0', sizeof(extra)); + extra_len = 0; for ( i = 0; i < cnts; i ++) { DBG_871X("0x%02x", data[i]); - sprintf(extra, "%s 0x%02X", extra, data[i+j]); + extra_len += sprintf(extra + extra_len, " 0x%02X", data[i+j]); DBG_871X(" "); - sprintf(extra,"%s ",extra); + extra_len += sprintf(extra + extra_len, " "); } - wrqu->length = strlen(extra); + wrqu->length = extra_len; return 0; } else if ( strcmp(tmp[0],"ableraw") == 0 ) { efuse_GetCurrentSize(padapter,&raw_cursize); raw_maxsize = efuse_GetMaxSize(padapter); - sprintf(extra, "%s : [ available raw size] = %d",extra,raw_maxsize-raw_cursize); - wrqu->length = strlen(extra); + extra_len = strlen(extra); + extra_len += sprintf(extra + extra_len, " : [ available raw size] = %d",raw_maxsize-raw_cursize); + wrqu->length = extra_len; return 0; }else { - sprintf(extra, "%s : Command not found\n",extra); - wrqu->length = strlen(extra); + extra_len = strlen(extra); + extra_len += sprintf(extra + extra_len, " : Command not found\n"); + wrqu->length = extra_len; return 0; } @@ -9140,6 +9147,7 @@ static int rtw_mp_read_reg(struct net_device *dev, //u32 *data = (u32*)extra; u32 ret, i=0, j=0, strtout=0; PADAPTER padapter = rtw_netdev_priv(dev); + size_t extra_len; if (wrqu->length > 128) return -EFAULT; @@ -9190,6 +9198,7 @@ static int rtw_mp_read_reg(struct net_device *dev, pch = tmp; DBG_871X("pch=%s",pch); + extra_len = strlen(extra); while( *pch != '\0' ) { pnext = strpbrk(pch, " "); @@ -9197,7 +9206,7 @@ static int rtw_mp_read_reg(struct net_device *dev, if ( *pnext != '\0' ) { strtout = simple_strtoul (pnext , &ptmp, 16); - sprintf( extra, "%s %d" ,extra ,strtout ); + extra_len += sprintf( extra + extra_len, " %d", strtout ); } else{ break; @@ -9224,6 +9233,7 @@ static int rtw_mp_read_reg(struct net_device *dev, pch = tmp; DBG_871X("pch=%s",pch); + extra_len = strlen(extra); while( *pch != '\0' ) { pnext = strpbrk(pch, " "); @@ -9231,7 +9241,7 @@ static int rtw_mp_read_reg(struct net_device *dev, if ( *pnext != '\0' ) { strtout = simple_strtoul (pnext , &ptmp, 16); - sprintf( extra, "%s %d" ,extra ,strtout ); + extra_len += sprintf( extra + extra_len, " %d", strtout ); } else{ break; @@ -9304,6 +9314,7 @@ static int rtw_mp_read_rf(struct net_device *dev, u32 path, addr; u32 ret,i=0 ,j=0,strtou=0; PADAPTER padapter = rtw_netdev_priv(dev); + size_t extra_len = 0; if (wrqu->length > 128) return -EFAULT; @@ -9341,14 +9352,14 @@ static int rtw_mp_read_rf(struct net_device *dev, if ( *pnext != '\0' ) { strtou = simple_strtoul (pnext , &ptmp, 16); - sprintf( extra, "%s %d" ,extra ,strtou ); + extra_len += sprintf( extra + extra_len, " %d", strtou ); } else{ break; } pch = pnext; } - wrqu->length = strlen(extra); + wrqu->length = extra_len; return 0; } diff --git a/drivers/net/wireless/rtl8812au/core/rtw_mp.c b/drivers/net/wireless/rtl8812au/core/rtw_mp.c index c2e400df1ce5..9884bb7f8a10 100644 --- a/drivers/net/wireless/rtl8812au/core/rtw_mp.c +++ b/drivers/net/wireless/rtl8812au/core/rtw_mp.c @@ -1840,7 +1840,7 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) { u32 i, psd_pts=0, psd_start=0, psd_stop=0; u32 psd_data=0; - + size_t data_len = 0; #ifdef PLATFORM_LINUX if (!netif_running(pAdapter->pnetdev)) { @@ -1871,7 +1871,7 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) } else { psd_data = rtw_GetPSDData(pAdapter, i); } - sprintf(data, "%s%x ", data, psd_data); + data_len += sprintf(data + data_len, "%x ", psd_data); i++; } diff --git a/drivers/net/wireless/rtl8812au/os_dep/linux/ioctl_linux.c b/drivers/net/wireless/rtl8812au/os_dep/linux/ioctl_linux.c index 4eba681b1cb6..62f472e020f2 100644 --- a/drivers/net/wireless/rtl8812au/os_dep/linux/ioctl_linux.c +++ b/drivers/net/wireless/rtl8812au/os_dep/linux/ioctl_linux.c @@ -9013,6 +9013,7 @@ static int rtw_mp_efuse_get(struct net_device *dev, #ifdef CONFIG_IOL u8 org_fw_iol = padapter->registrypriv.fw_iol;// 0:Disable, 1:enable, 2:by usb speed #endif + size_t extra_len; wrqu = (struct iw_point*)wdata; pwrctrlpriv = adapter_to_pwrctl(padapter); @@ -9065,22 +9066,22 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else if (strcmp(tmp[0], "drvmap") == 0) { mapLen = EFUSE_MAP_SIZE; - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < EFUSE_MAP_SIZE; i += 16) { // DBG_871X("0x%02x\t", i); - sprintf(extra, "%s0x%02x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, PROMContent[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", PROMContent[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, PROMContent[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", PROMContent[i+j]); } // DBG_871X("\n"); - sprintf(extra,"%s\n",extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } else if (strcmp(tmp[0], "realmap") == 0) { @@ -9092,22 +9093,22 @@ static int rtw_mp_efuse_get(struct net_device *dev, } // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i = 0; i < EFUSE_MAP_SIZE; i += 16) { // DBG_871X("0x%02x\t", i); - sprintf(extra, "%s0x%02x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeEfuseInitMap[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeEfuseInitMap[i+j]); } // DBG_871X("\n"); - sprintf(extra,"%s\n",extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } else if (strcmp(tmp[0], "rmap") == 0) { @@ -9144,9 +9145,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: data={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { // DBG_871X("0x%02x ", data[i]); - sprintf(extra, "%s0x%02X ", extra, data[i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", data[i]); } // DBG_871X("}\n"); } else if (strcmp(tmp[0], "realraw") == 0) { @@ -9159,20 +9161,20 @@ static int rtw_mp_efuse_get(struct net_device *dev, } _rtw_memset(extra,'\0',strlen(extra)); // DBG_871X("%s: realraw={\n", __FUNCTION__); - sprintf(extra, "\n0x00\t"); + extra_len = sprintf(extra, "\n0x00\t"); for (i=0; i< mapLen; i++) { // DBG_871X("%02X", rawdata[i]); - sprintf(extra, "%s%02X", extra, rawdata[i]); + extra_len += sprintf(extra + extra_len, "%02X", rawdata[i]); if ((i & 0xF) == 0xF) { // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); - sprintf(extra, "%s0x%02x\t", extra, i+1); + extra_len += sprintf(extra + extra_len, "\n"); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i+1); } else if ((i & 0x7) == 0x7) { // DBG_871X("\t"); - sprintf(extra, "%s \t", extra); + extra_len += sprintf(extra + extra_len, " \t"); } else { // DBG_871X(" "); - sprintf(extra, "%s ", extra); + extra_len += sprintf(extra + extra_len, " "); } } // DBG_871X("}\n"); @@ -9255,12 +9257,13 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: MAC address={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { // DBG_871X("%02X", data[i]); - sprintf(extra, "%s%02X", extra, data[i]); + extra_len += sprintf(extra + extra_len, "%02X", data[i]); if (i != (cnts-1)) { // DBG_871X(":"); - sprintf(extra,"%s:",extra); + extra_len += sprintf(extra + extra_len, ":"); } } // DBG_871X("}\n"); @@ -9316,12 +9319,13 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: {VID,PID}={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { // DBG_871X("0x%02x", data[i]); - sprintf(extra, "%s0x%02X", extra, data[i]); + extra_len += sprintf(extra + extra_len, "0x%02X", data[i]); if (i != (cnts-1)) { // DBG_871X(","); - sprintf(extra,"%s,",extra); + extra_len += sprintf(extra + extra_len, ","); } } // DBG_871X("}\n"); @@ -9341,21 +9345,22 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("OFFSET\tVALUE(hex)\n"); sprintf(extra, "\n"); + extra_len = 0; for (i=0; i<512; i+=16) { // set 512 because the iwpriv's extra size have limit 0x7FF // DBG_871X("0x%03x\t", i); - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", pEfuseHal->BTEfuseInitMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i+j]); } // DBG_871X("\t"); - sprintf(extra,"%s\t",extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", pEfuseHal->BTEfuseInitMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } else if (strcmp(tmp[0],"btbmap") == 0) { @@ -9369,22 +9374,22 @@ static int rtw_mp_efuse_get(struct net_device *dev, } // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=512; i<1024 ; i+=16) { // DBG_871X("0x%03x\t", i); - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i+j]); } // DBG_871X("\t"); - sprintf(extra,"%s\t",extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", data[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->BTEfuseInitMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->BTEfuseInitMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } else if (strcmp(tmp[0],"btrmap") == 0) { @@ -9421,71 +9426,72 @@ static int rtw_mp_efuse_get(struct net_device *dev, } *extra = 0; + extra_len = 0; // DBG_871X("%s: bt efuse data={", __FUNCTION__); for (i=0; i<cnts; i++) { // DBG_871X("0x%02x ", data[i]); - sprintf(extra, "%s 0x%02X ", extra, data[i]); + extra_len += sprintf(extra + extra_len, " 0x%02X ", data[i]); } // DBG_871X("}\n"); DBG_871X(FUNC_ADPT_FMT ": BT MAC=[%s]\n", FUNC_ADPT_ARG(padapter), extra); } else if (strcmp(tmp[0], "btffake") == 0) { // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=0; i<512; i+=16) { // DBG_871X("0x%03x\t", i); - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } else if (strcmp(tmp[0],"btbfake") == 0) { // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=512; i<1024; i+=16) { // DBG_871X("0x%03x\t", i); - sprintf(extra, "%s0x%03x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%03x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); } else if (strcmp(tmp[0],"wlrfkmap")== 0) { // DBG_871X("OFFSET\tVALUE(hex)\n"); - sprintf(extra, "\n"); + extra_len = sprintf(extra, "\n"); for (i=0; i<EFUSE_MAP_SIZE; i+=16) { // DBG_871X("\t0x%02x\t", i); - sprintf(extra, "%s0x%02x\t", extra, i); + extra_len += sprintf(extra + extra_len, "0x%02x\t", i); for (j=0; j<8; j++) { // DBG_871X("%02X ", pEfuseHal->fakeEfuseModifiedMap[i+j]); - sprintf(extra, "%s%02X ", extra, pEfuseHal->fakeEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, "%02X ", pEfuseHal->fakeEfuseModifiedMap[i+j]); } // DBG_871X("\t"); - sprintf(extra, "%s\t", extra); + extra_len += sprintf(extra + extra_len, "\t"); for (; j<16; j++) { // DBG_871X("%02X ", pEfuseHal->fakeEfuseModifiedMap[i+j]); - sprintf(extra, "%s %02X", extra, pEfuseHal->fakeEfuseModifiedMap[i+j]); + extra_len += sprintf(extra + extra_len, " %02X", pEfuseHal->fakeEfuseModifiedMap[i+j]); } // DBG_871X("\n"); - sprintf(extra, "%s\n", extra); + extra_len += sprintf(extra + extra_len, "\n"); } // DBG_871X("\n"); @@ -9509,9 +9515,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: data={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { DBG_871X("wlrfkrmap = 0x%02x \n", pEfuseHal->fakeEfuseModifiedMap[addr+i]); - sprintf(extra, "%s0x%02X ", extra, pEfuseHal->fakeEfuseModifiedMap[addr+i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", pEfuseHal->fakeEfuseModifiedMap[addr+i]); } } else if (strcmp(tmp[0],"btrfkrmap")== 0) { if ((tmp[1]==NULL) || (tmp[2]==NULL)) { @@ -9533,9 +9540,10 @@ static int rtw_mp_efuse_get(struct net_device *dev, // DBG_871X("%s: data={", __FUNCTION__); *extra = 0; + extra_len = 0; for (i=0; i<cnts; i++) { DBG_871X("wlrfkrmap = 0x%02x \n", pEfuseHal->fakeBTEfuseModifiedMap[addr+i]); - sprintf(extra, "%s0x%02X ", extra, pEfuseHal->fakeBTEfuseModifiedMap[addr+i]); + extra_len += sprintf(extra + extra_len, "0x%02X ", pEfuseHal->fakeBTEfuseModifiedMap[addr+i]); } } else { sprintf(extra, "Command not found!"); @@ -10320,6 +10328,7 @@ static int rtw_mp_read_reg(struct net_device *dev, //u32 *data = (u32*)extra; u32 ret, i=0, j=0, strtout=0; PADAPTER padapter = rtw_netdev_priv(dev); + size_t extra_len; if (wrqu->length > 128) @@ -10370,6 +10379,7 @@ static int rtw_mp_read_reg(struct net_device *dev, pch = tmp; DBG_871X("pch=%s",pch); + extra_len = strlen(extra); while( *pch != '\0' ) { pnext = strpbrk(pch, " "); if (!pnext) @@ -10378,7 +10388,7 @@ static int rtw_mp_read_reg(struct net_device *dev, pnext++; if ( *pnext != '\0' ) { strtout = simple_strtoul (pnext , &ptmp, 16); - sprintf( extra, "%s %d" ,extra ,strtout ); + extra_len += sprintf( extra + extra_len, " %d", strtout ); } else { break; } @@ -10404,6 +10414,7 @@ static int rtw_mp_read_reg(struct net_device *dev, pch = tmp; DBG_871X("pch=%s",pch); + extra_len = strlen(extra); while( *pch != '\0' ) { pnext = strpbrk(pch, " "); if (!pnext) @@ -10412,7 +10423,7 @@ static int rtw_mp_read_reg(struct net_device *dev, pnext++; if ( *pnext != '\0' ) { strtout = simple_strtoul (pnext , &ptmp, 16); - sprintf( extra, "%s %d" ,extra ,strtout ); + extra_len += sprintf( extra + extra_len, " %d", strtout ); } else { break; } @@ -10490,6 +10501,7 @@ static int rtw_mp_read_rf(struct net_device *dev, u32 path, addr; u32 ret,i=0 ,j=0,strtou=0; PADAPTER padapter = rtw_netdev_priv(dev); + size_t extra_len = 0; if (wrqu->length > 128) return -EFAULT; @@ -10525,13 +10537,13 @@ static int rtw_mp_read_rf(struct net_device *dev, pnext++; if ( *pnext != '\0' ) { strtou = simple_strtoul (pnext , &ptmp, 16); - sprintf( extra, "%s %d" ,extra ,strtou ); + extra_len += sprintf( extra + extra_len, " %d", strtou ); } else { break; } pch = pnext; } - wrqu->length = strlen(extra); + wrqu->length = extra_len; return 0; } @@ -11979,20 +11991,20 @@ todo: mptbt_BtControlProcess(padapter, &BtReq); if (readtherm == 0) { - sprintf(extra, "BT thermal="); + extra_len = sprintf(extra, "BT thermal="); for (i=4; i<pMptCtx->mptOutLen; i++) { if ((pMptCtx->mptOutBuf[i]==0x00) && (pMptCtx->mptOutBuf[i+1]==0x00)) goto exit; #ifdef CONFIG_RTL8723A - sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i]& 0x3f)); + extra_len += sprintf(extra + extra_len, " %d ", (pMptCtx->mptOutBuf[i]& 0x3f)); #else - sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i]& 0x1f)); + extra_len += sprintf(extra + extra_len, " %d ", (pMptCtx->mptOutBuf[i]& 0x1f)); #endif } } else { for (i=4; i<pMptCtx->mptOutLen; i++) { - sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]); + extra_len += sprintf(extra + extra_len, " 0x%x ", pMptCtx->mptOutBuf[i]); } } diff --git a/drivers/net/wireless/rtl8821cu/core/rtw_mp.c b/drivers/net/wireless/rtl8821cu/core/rtw_mp.c index d966fac76f89..1cc3585750cf 100755 --- a/drivers/net/wireless/rtl8821cu/core/rtw_mp.c +++ b/drivers/net/wireless/rtl8821cu/core/rtw_mp.c @@ -2423,14 +2423,17 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) data[0] = '\0'; - i = psd_start; - while (i < psd_stop) { - if (i >= psd_pts) - psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); - else - psd_data = rtw_GetPSDData(pAdapter, i); - sprintf(data, "%s%x ", data, psd_data); - i++; + { + size_t extra_len = strlen(data); + i = psd_start; + while (i < psd_stop) { + if (i >= psd_pts) + psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); + else + psd_data = rtw_GetPSDData(pAdapter, i); + extra_len += sprintf(data + extra_len, "%x ", psd_data); + i++; + } } #ifdef CONFIG_LONG_DELAY_ISSUE diff --git a/drivers/net/wireless/rtl8821cu/os_dep/linux/ioctl_mp.c b/drivers/net/wireless/rtl8821cu/os_dep/linux/ioctl_mp.c index ad8df2d4e580..4408b3402a9f 100755 --- a/drivers/net/wireless/rtl8821cu/os_dep/linux/ioctl_mp.c +++ b/drivers/net/wireless/rtl8821cu/os_dep/linux/ioctl_mp.c @@ -570,15 +570,15 @@ int rtw_mp_txpower_index(struct net_device *dev, sprintf(extra, "patha=%d", txpower_inx); if (phal_data->rf_type > RF_1T2R) { txpower_inx = mpt_ProQueryCalTxPower(padapter, 1); - sprintf(extra, "%s,pathb=%d", extra, txpower_inx); + sprintf(extra + strlen(extra), ",pathb=%d", txpower_inx); } if (phal_data->rf_type > RF_2T4R) { txpower_inx = mpt_ProQueryCalTxPower(padapter, 2); - sprintf(extra, "%s,pathc=%d", extra, txpower_inx); + sprintf(extra + strlen(extra), ",pathc=%d", txpower_inx); } if (phal_data->rf_type > RF_3T4R) { txpower_inx = mpt_ProQueryCalTxPower(padapter, 3); - sprintf(extra, "%s,pathd=%d", extra, txpower_inx); + sprintf(extra + strlen(extra), ",pathd=%d", txpower_inx); } } wrqu->length = strlen(extra); @@ -1820,7 +1820,7 @@ int rtw_mp_tx(struct net_device *dev, char *pextra = extra; RTW_INFO("Got format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + pextra += sprintf(pextra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->current_channel = channel; @@ -2181,6 +2181,7 @@ int rtw_efuse_mask_file(struct net_device *dev, char *ptmp, tmp; u8 count = 0; u8 i = 0; + size_t extra_len; ptmp = extra; pch = strsep(&ptmp, ","); @@ -2206,13 +2207,15 @@ int rtw_efuse_mask_file(struct net_device *dev, } while (count < 64); - for (i = 0; i < count; i++) - sprintf(extra, "%s:%02x", extra, maskfileBuffer[i]); + extra_len = strlen(extra); + for (i = 0; i < count; i++) { + extra_len += sprintf(extra + extra_len, ":%02x", maskfileBuffer[i]); + } padapter->registrypriv.bFileMaskEfuse = _TRUE; - sprintf(extra, "%s\nLoad Efuse Mask data %d hex ok\n", extra, count); - wrqu->data.length = strlen(extra); + extra_len += sprintf(extra + extra_len, "\nLoad Efuse Mask data %d hex ok\n", count); + wrqu->data.length = extra_len; return 0; } rtw_efuse_mask_file_path = extra; @@ -2634,16 +2637,20 @@ todo: mptbt_BtControlProcess(padapter, &BtReq); if (readtherm == 0) { + size_t extra_len; sprintf(extra, "BT thermal="); + extra_len = strlen(extra); for (i = 4; i < pMptCtx->mptOutLen; i++) { if ((pMptCtx->mptOutBuf[i] == 0x00) && (pMptCtx->mptOutBuf[i + 1] == 0x00)) goto exit; - sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i] & 0x1f)); + extra_len += sprintf(extra + extra_len, " %d ", (pMptCtx->mptOutBuf[i] & 0x1f)); } } else { + size_t extra_len; + extra_len = strlen(extra); for (i = 4; i < pMptCtx->mptOutLen; i++) - sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]); + extra_len += sprintf(extra + extra_len, " 0x%x ", pMptCtx->mptOutBuf[i]); } exit: diff --git a/drivers/net/wireless/rtl88x2bu/core/rtw_mp.c b/drivers/net/wireless/rtl88x2bu/core/rtw_mp.c index ad9755b4da91..8272e6533fa4 100644 --- a/drivers/net/wireless/rtl88x2bu/core/rtw_mp.c +++ b/drivers/net/wireless/rtl88x2bu/core/rtw_mp.c @@ -2123,14 +2123,17 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) data[0] = '\0'; - i = psd_start; - while (i < psd_stop) { - if (i >= psd_pts) - psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); - else - psd_data = rtw_GetPSDData(pAdapter, i); - sprintf(data, "%s%x ", data, psd_data); - i++; + { + size_t extra_len = strlen(data); + i = psd_start; + while (i < psd_stop) { + if (i >= psd_pts) + psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); + else + psd_data = rtw_GetPSDData(pAdapter, i); + extra_len += sprintf(data + extra_len, "%x ", psd_data); + i++; + } } #ifdef CONFIG_LONG_DELAY_ISSUE diff --git a/drivers/net/wireless/rtl88x2bu/os_dep/linux/ioctl_mp.c b/drivers/net/wireless/rtl88x2bu/os_dep/linux/ioctl_mp.c index e82c39f6262c..0eaed1239317 100644 --- a/drivers/net/wireless/rtl88x2bu/os_dep/linux/ioctl_mp.c +++ b/drivers/net/wireless/rtl88x2bu/os_dep/linux/ioctl_mp.c @@ -1795,7 +1795,7 @@ int rtw_mp_tx(struct net_device *dev, char *pextra = extra; RTW_INFO("Got format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); - sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); + pextra += sprintf(pextra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); padapter->mppriv.channel = channel; SetChannel(padapter); pHalData->current_channel = channel; @@ -2159,6 +2159,7 @@ int rtw_efuse_mask_file(struct net_device *dev, u8 count = 0; u8 i = 0; u32 datalen = 0; + size_t extra_len; ptmp = extra; pch = strsep(&ptmp, ","); @@ -2184,12 +2185,13 @@ int rtw_efuse_mask_file(struct net_device *dev, } while (count < 64); + extra_len = strlen(extra); for (i = 0; i < count; i++) - sprintf(extra, "%s:%02x", extra, maskfileBuffer[i]); + extra_len += sprintf(extra + extra_len, ":%02x", maskfileBuffer[i]); padapter->registrypriv.bFileMaskEfuse = _TRUE; - sprintf(extra, "%s\nLoad Efuse Mask data %d hex ok\n", extra, count); + extra_len += sprintf(extra + extra_len, "\nLoad Efuse Mask data %d hex ok\n", count); wrqu->data.length = strlen(extra); return 0; } @@ -2612,16 +2614,18 @@ todo: mptbt_BtControlProcess(padapter, &BtReq); if (readtherm == 0) { + size_t extra_len; sprintf(extra, "BT thermal="); for (i = 4; i < pMptCtx->mptOutLen; i++) { if ((pMptCtx->mptOutBuf[i] == 0x00) && (pMptCtx->mptOutBuf[i + 1] == 0x00)) goto exit; - sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i] & 0x1f)); + extra_len += sprintf(extra + extra_len, " %d ", (pMptCtx->mptOutBuf[i] & 0x1f)); } } else { + size_t extra_len; for (i = 4; i < pMptCtx->mptOutLen; i++) - sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]); + extra_len += sprintf(extra + extra_len, " 0x%x ", pMptCtx->mptOutBuf[i]); } exit: diff --git a/drivers/net/wireless/ti/wlcore/boot.c b/drivers/net/wireless/ti/wlcore/boot.c index 19b7ec7b69c2..fe642b354a84 100644 --- a/drivers/net/wireless/ti/wlcore/boot.c +++ b/drivers/net/wireless/ti/wlcore/boot.c @@ -87,6 +87,7 @@ static int wlcore_validate_fw_ver(struct wl1271 *wl) wl->min_mr_fw_ver : wl->min_sr_fw_ver; char min_fw_str[32] = ""; int i; + size_t min_fw_len = 0; /* the chip must be exactly equal */ if ((min_ver[FW_VER_CHIP] != WLCORE_FW_VER_IGNORE) && @@ -121,11 +122,11 @@ static int wlcore_validate_fw_ver(struct wl1271 *wl) fail: for (i = 0; i < NUM_FW_VER; i++) if (min_ver[i] == WLCORE_FW_VER_IGNORE) - snprintf(min_fw_str, sizeof(min_fw_str), - "%s*.", min_fw_str); + min_fw_len += snprintf(min_fw_str + min_fw_len, + sizeof(min_fw_str) - min_fw_len, "*."); else - snprintf(min_fw_str, sizeof(min_fw_str), - "%s%u.", min_fw_str, min_ver[i]); + min_fw_len += snprintf(min_fw_str + min_fw_len, + sizeof(min_fw_str) - min_fw_len, "%u.", min_ver[i]); wl1271_error("Your WiFi FW version (%u.%u.%u.%u.%u) is invalid.\n" "Please use at least FW %s\n" diff --git a/drivers/net/wireless/ti/wlcore/debugfs.h b/drivers/net/wireless/ti/wlcore/debugfs.h index bfb79399d40f..31b4d4a77640 100644 --- a/drivers/net/wireless/ti/wlcore/debugfs.h +++ b/drivers/net/wireless/ti/wlcore/debugfs.h @@ -97,12 +97,13 @@ static ssize_t sub## _ ##name## _read(struct file *file, \ struct struct_type *stats = wl->stats.fw_stats; \ char buf[DEBUGFS_FORMAT_BUFFER_SIZE] = ""; \ int i; \ + size_t buf_len = 0; \ \ wl1271_debugfs_update_stats(wl); \ \ for (i = 0; i < len; i++) \ - snprintf(buf, sizeof(buf), "%s[%d] = %d\n", \ - buf, i, stats->sub.name[i]); \ + snprintf(buf + buf_len, sizeof(buf) - buf_len, \ + "[%d] = %d\n", i, stats->sub.name[i]); \ \ return wl1271_format_buffer(userbuf, count, ppos, "%s", buf); \ } \ -- 2.27.0 ================================================ FILE: projects/Rockchip/packages/linux/patches/base/esp8089.patch ================================================ diff --git a/drivers/net/wireless/esp8089/Makefile b/drivers/net/wireless/esp8089/Makefile index f90fa50..8a22adb 100755 --- a/drivers/net/wireless/esp8089/Makefile +++ b/drivers/net/wireless/esp8089/Makefile @@ -1,52 +1,5 @@ MODNAME = esp8089 -# By default, we try to compile the modules for the currently running -# kernel. But it's the first approximation, as we will re-read the -# version from the kernel sources. -KVERS_UNAME ?= $(shell uname -r) -KVERS_ARCH ?= $(shell arch) - -# KBUILD is the path to the Linux kernel build tree. It is usually the -# same as the kernel source tree, except when the kernel was compiled in -# a separate directory. -KBUILD ?= $(PWD) - -ifeq (,$(KBUILD)) -$(error Kernel build tree not found - please set KBUILD to configured kernel) -endif - -KCONFIG := $(KBUILD)/.config -ifeq (,$(wildcard $(KCONFIG))) -$(error No .config found in $(KBUILD), please set KBUILD to configured kernel) -endif - -ifneq (,$(wildcard $(KBUILD)/include/linux/version.h)) -ifneq (,$(wildcard $(KBUILD)/include/generated/uapi/linux/version.h)) -$(error Multiple copies of version.h found, please clean your build tree) -endif -endif - -# Kernel Makefile doesn't always know the exact kernel version, so we -# get it from the kernel headers instead and pass it to make. -VERSION_H := $(KBUILD)/include/generated/utsrelease.h -ifeq (,$(wildcard $(VERSION_H))) -VERSION_H := $(KBUILD)/include/linux/utsrelease.h -endif -ifeq (,$(wildcard $(VERSION_H))) -VERSION_H := $(KBUILD)/include/linux/version.h -endif -ifeq (,$(wildcard $(VERSION_H))) -$(error Please run 'make modules_prepare' in $(KBUILD)) -endif - -KVERS := $(shell sed -ne 's/"//g;s/^\#define UTS_RELEASE //p' $(VERSION_H)) - -ifeq (,$(KVERS)) -$(error Cannot find UTS_RELEASE in $(VERSION_H), please report) -endif - -INST_DIR = /lib/modules/$(KVERS)/misc - SRC_DIR=$(shell pwd) include $(KCONFIG) @@ -98,18 +51,6 @@ config_check: # Taken from here: # http://www.xkyle.com/building-linux-packages-for-kernel-drivers/ -dkms: - $(MAKE) config_check - echo $(DKMS_PATH) - echo "$(KVERS_UNAME)" - mkdir -p $(DKMS_PATH) - cp -r . $(DKMS_PATH) - -rm -rf $(DKMS_PATH)/.git - -rm $(DKMS_PATH)/.gitignore - -rm $(DKMS_PATH)/*deb - dkms add -m $(PACKAGE_NAME) -v $(PACKAGE_VERSION) - dkms build -m $(PACKAGE_NAME) -v $(PACKAGE_VERSION) - dkmsdeb: dkms dkms mkdsc -m $(PACKAGE_NAME) -v $(PACKAGE_VERSION) --source-only dkms mkdeb -m $(PACKAGE_NAME) -v $(PACKAGE_VERSION) --source-only @@ -130,19 +71,4 @@ clean: rm -f *.o *.ko .*.cmd *.mod.c *.symvers modules.order rm -rf .tmp_versions -install: config_check $(MODULE) - @/sbin/modinfo $(MODULE) | grep -q "^vermagic: *$(KVERS) " || \ - { echo "$(MODULE)" is not for Linux $(KVERS); exit 1; } - mkdir -p -m 755 $(DESTDIR)$(INST_DIR) - install -m 0644 $(MODULE) $(DESTDIR)$(INST_DIR) -ifndef DESTDIR - -/sbin/depmod -a $(KVERS) -endif - -uninstall: - rm -f $(DESTDIR)$(INST_DIR)/$(MODULE) -ifndef DESTDIR - -/sbin/depmod -a $(KVERS) -endif - .PHONY: all modules clean install config_check ================================================ FILE: projects/Rockchip/packages/linux/patches/base/linux-RTL8821CU-fix-compile.patch ================================================ --- a/drivers/net/wireless/rtl8821cu/hal/phydm/halrf/rtl8821c/halrf_iqk_8821c.c +++ b/drivers/net/wireless/rtl8821cu/hal/phydm/halrf/rtl8821c/halrf_iqk_8821c.c @@ -576,9 +576,9 @@ odm_write_4byte(dm, 0x1bd8, ((0xc0000000 >> idx) + 0x1) + (i * 4) + (iqk_info->iqk_cfir_imag[channel][path][idx][i] << 9)); } if (idx == 0) - odm_set_bb_reg(dm, iqk_apply[path], BIT(0), ~(iqk_info->iqk_fail_report[channel][path][idx])); + odm_set_bb_reg(dm, iqk_apply[path], BIT(0), !(iqk_info->iqk_fail_report[channel][path][idx])); else - odm_set_bb_reg(dm, iqk_apply[path], BIT(10), ~(iqk_info->iqk_fail_report[channel][path][idx])); + odm_set_bb_reg(dm, iqk_apply[path], BIT(10), !(iqk_info->iqk_fail_report[channel][path][idx])); } odm_set_bb_reg(dm, R_0x1bd8, MASKDWORD, 0x0); odm_set_bb_reg(dm, R_0x1b0c, BIT(13) | BIT(12), 0x0); ================================================ FILE: projects/Rockchip/packages/linux/patches/base/linux-emuelec-random_fixes_gcc10.patch ================================================ --- a/drivers/net/wireless/rockchip_wlan/rtl8723ds/os_dep/linux/ioctl_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723ds/os_dep/linux/ioctl_mp.c @@ -1820,6 +1820,7 @@ } else { char *pextra = extra; + size_t extra_len; RTW_INFO("Got format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode); _rtw_memset(extra, 0, wrqu->data.length); extra_len = sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel); --- a/drivers/net/wireless/rockchip_wlan/rtl8723ds/hal/rtl8723d/sdio/rtl8723ds_xmit.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723ds/hal/rtl8723d/sdio/rtl8723ds_xmit.c @@ -526,13 +526,14 @@ PADAPTER padapter; struct xmit_priv *pxmitpriv; u8 thread_name[20] = "RTWHALXT"; - + char tmp[50]; ret = _SUCCESS; padapter = (PADAPTER)context; pxmitpriv = &padapter->xmitpriv; - rtw_sprintf(thread_name, 20, "%s-"ADPT_FMT, thread_name, ADPT_ARG(padapter)); + rtw_sprintf(tmp, sizeof(tmp), "%s-"ADPT_FMT, thread_name, ADPT_ARG(padapter)); + strcat(thread_name, tmp); thread_enter(thread_name); RTW_INFO("start "FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); --- a/net/ipv4/ip_options.c +++ b/net/ipv4/ip_options.c @@ -8,6 +8,14 @@ * Authors: A.N.Kuznetsov * */ + +/* workaround for GCC 10.30 until a better fix for this error is found +net/ipv4/ip_options.c: In function 'ip_options_undo': +net/ipv4/ip_options.c:503:3: warning: writing 4 bytes into a region of size 0 [-Wstringop-overflow=] +error, forbidden warning:ip_options.c:503 +*/ +#pragma GCC diagnostic ignored "-Wstringop-overflow" +// end workaround #define pr_fmt(fmt) "IPv4: " fmt diff --git a/crypto/lrw.c b/crypto/lrw.c index 376d7ed3f1f8..3c734b81b3a2 100644 --- a/crypto/lrw.c +++ b/crypto/lrw.c @@ -377,7 +377,7 @@ return inst; } -static void free(struct crypto_instance *inst) +static void free_inst(struct crypto_instance *inst) { crypto_drop_spawn(crypto_instance_ctx(inst)); kfree(inst); @@ -386,7 +386,7 @@ static struct crypto_template crypto_tmpl = { .name = "lrw", .alloc = alloc, - .free = free, + .free = free_inst, .module = THIS_MODULE, }; diff --git a/crypto/xts.c b/crypto/xts.c index dbdd8af629e6..6d8cea94b3cf 100644 --- a/crypto/xts.c +++ b/crypto/xts.c @@ -334,7 +334,7 @@ return inst; } -static void free(struct crypto_instance *inst) +static void free_inst(struct crypto_instance *inst) { crypto_drop_spawn(crypto_instance_ctx(inst)); kfree(inst); @@ -343,7 +343,7 @@ static struct crypto_template crypto_tmpl = { .name = "xts", .alloc = alloc, - .free = free, + .free = free_inst, .module = THIS_MODULE, }; ================================================ FILE: projects/Rockchip/packages/linux/patches/base/linux-fix_bt.patch ================================================ The current codebase makes use of the zero-length array language extension to the C90 standard, but the preferred mechanism to declare variable-length types such as these ones is a flexible array member. Signed-off-by: Marcel Holtmann <marcel@xxxxxxxxxxxx> --- include/net/bluetooth/mgmt.h | 42 ++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h index 65dd6fd1fff3..9d4d87c6028e 100644 --- a/include/net/bluetooth/mgmt.h +++ b/include/net/bluetooth/mgmt.h @@ -70,14 +70,14 @@ struct mgmt_rp_read_commands { __le16 num_commands; __le16 num_events; - __le16 opcodes[0]; + __le16 opcodes[]; } __packed; #define MGMT_OP_READ_INDEX_LIST 0x0003 #define MGMT_READ_INDEX_LIST_SIZE 0 struct mgmt_rp_read_index_list { __le16 num_controllers; - __le16 index[0]; + __le16 index[]; } __packed; /* Reserve one extra byte for names in management messages so that they @@ -181,7 +181,7 @@ struct mgmt_cp_load_link_keys { __u8 debug_keys; __le16 key_count; - struct mgmt_link_key_info keys[0]; + struct mgmt_link_key_info keys[]; } __packed; #define MGMT_LOAD_LINK_KEYS_SIZE 3 @@ -204,7 +204,7 @@ #define MGMT_OP_LOAD_LONG_TERM_KEYS 0x0013 struct mgmt_cp_load_long_term_keys { __le16 key_count; - struct mgmt_ltk_info keys[0]; + struct mgmt_ltk_info keys[]; } __packed; #define MGMT_LOAD_LONG_TERM_KEYS_SIZE 2 @@ -221,7 +221,7 @@ #define MGMT_GET_CONNECTIONS_SIZE 0 struct mgmt_rp_get_connections { __le16 conn_count; - struct mgmt_addr_info addr[0]; + struct mgmt_addr_info addr[]; } __packed; #define MGMT_OP_PIN_CODE_REPLY 0x0016 @@ -411,7 +411,7 @@ #define MGMT_OP_LOAD_IRKS 0x0030 struct mgmt_cp_load_irks { __le16 irk_count; - struct mgmt_irk_info irks[0]; + struct mgmt_irk_info irks[]; } __packed; #define MGMT_LOAD_IRKS_SIZE 2 @@ -463,7 +463,7 @@ #define MGMT_OP_LOAD_CONN_PARAM 0x0035 struct mgmt_cp_load_conn_param { __le16 param_count; - struct mgmt_conn_param params[0]; + struct mgmt_conn_param params[]; } __packed; #define MGMT_LOAD_CONN_PARAM_SIZE 2 @@ -471,7 +471,7 @@ #define MGMT_READ_UNCONF_INDEX_LIST_SIZE 0 struct mgmt_rp_read_unconf_index_list { __le16 num_controllers; - __le16 index[0]; + __le16 index[]; } __packed; #define MGMT_OPTION_EXTERNAL_CONFIG 0x00000001 @@ -502,7 +502,7 @@ __u8 type; __s8 rssi; __le16 uuid_count; - __u8 uuids[0][16]; + __u8 uuids[][16]; } __packed; #define MGMT_START_SERVICE_DISCOVERY_SIZE 4 @@ -514,7 +514,7 @@ struct mgmt_rp_read_local_oob_ext_data { __u8 type; __le16 eir_len; - __u8 eir[0]; + __u8 eir[]; } __packed; #define MGMT_OP_READ_EXT_INDEX_LIST 0x003C @@ -525,7 +525,7 @@ __le16 index; __u8 type; __u8 bus; - } entry[0]; + } entry[]; } __packed; #define MGMT_OP_READ_ADV_FEATURES 0x0003D @@ -536,7 +536,7 @@ __u8 max_scan_rsp_len; __u8 max_instances; __u8 num_instances; - __u8 instance[0]; + __u8 instance[]; } __packed; #define MGMT_OP_ADD_ADVERTISING 0x003E @@ -547,7 +547,7 @@ __le16 timeout; __u8 adv_data_len; __u8 scan_rsp_len; - __u8 data[0]; + __u8 data[]; } __packed; #define MGMT_ADD_ADVERTISING_SIZE 11 struct mgmt_rp_add_advertising { @@ -575,7 +575,7 @@ struct mgmt_ev_cmd_complete { __le16 opcode; __u8 status; - __u8 data[0]; + __u8 data[]; } __packed; #define MGMT_EV_CMD_STATUS 0x0002 @@ -623,7 +623,7 @@ struct mgmt_addr_info addr; __le32 flags; __le16 eir_len; - __u8 eir[0]; + __u8 eir[]; } __packed; #define MGMT_DEV_DISCONN_UNKNOWN 0x00 @@ -677,7 +677,7 @@ __s8 rssi; __le32 flags; __le16 eir_len; - __u8 eir[0]; + __u8 eir[]; } __packed; #define MGMT_EV_DISCOVERING 0x0013 @@ -772,7 +772,7 @@ struct mgmt_ev_local_oob_data_updated { __u8 type; __le16 eir_len; - __u8 eir[0]; + __u8 eir[]; } __packed; #define MGMT_EV_ADVERTISING_ADDED 0x0023 gcc-10 warns about accesses to zero-length arrays: kernel/bpf/core.c: In function 'bpf_patch_insn_single': cc1: warning: writing 8 bytes into a region of size 0 [-Wstringop-overflow=] In file included from kernel/bpf/core.c:21: include/linux/filter.h:550:20: note: at offset 0 to object 'insnsi' with size 0 declared here 550 | struct bpf_insn insnsi[0]; | ^~~~~~ In this case, we really want to have two flexible-array members, but that is not possible. Removing the union to make insnsi a flexible-array member while leaving insns as a zero-length array fixes the warning, as nothing writes to the other one in that way. This trick only works on linux-3.18 or higher, as older versions had additional members in the union. Fixes: 60a3b2253c41 ("net: bpf: make eBPF interpreter images read-only") Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx> --- include/linux/filter.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/include/linux/filter.h b/include/linux/filter.h index af37318bb1c5..73d06a39e2d6 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h @@ -545,10 +545,8 @@ struct bpf_prog { unsigned int (*bpf_func)(const void *ctx, const struct bpf_insn *insn); /* Instructions for interpreter */ - union { - struct sock_filter insns[0]; - struct bpf_insn insnsi[0]; - }; + struct sock_filter insns[0]; + struct bpf_insn insnsi[]; }; struct sk_filter { -- 2.26.0 ================================================ FILE: projects/Rockchip/packages/linux/patches/base/linux-rtl8723bu.patch ================================================ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/usb_intf.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/usb_intf.c index f16e69e8f05b..ea10f500c1c0 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/usb_intf.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/usb_intf.c @@ -126,6 +126,7 @@ static void rtw_dev_shutdown(struct device *dev) #endif +#define USB_VENDER_ID_EDIMAX 0x7392 #define USB_VENDER_ID_REALTEK 0x0BDA @@ -194,6 +195,7 @@ static struct usb_device_id rtw_usb_id_tbl[] ={ //*=== Realtek demoboard ===*/ {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0xB720,0xff,0xff,0xff),.driver_info = RTL8723B}, /* 8723BU 1*1 */ //{USB_DEVICE(USB_VENDER_ID_REALTEK, 0xB720),.driver_info = RTL8723B}, /* 8723BU */ + {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_EDIMAX, 0xA611,0xff,0xff,0xff),.driver_info = RTL8723B}, /* 8723BU 1*1 */ #endif #ifdef CONFIG_RTL8703B ================================================ FILE: projects/Rockchip/packages/linux/patches/base/linux-tools-libtraceevent.patch ================================================ --- a/tools/lib/traceevent/Makefile 2021-02-03 01:55:41.000000000 +0100 +++ b/tools/lib/traceevent/Makefile.patched 2021-03-09 19:30:54.508423866 +0100 @@ -251,7 +251,7 @@ define do_generate_dynamic_list_file (echo '{'; \ - $(NM) -u -D $1 | awk 'NF>1 {print "\t"$$2";"}' | sort -u; \ + $(NM) -u -D $1 | awk 'NF>1 {sub("@.*", "", $$2); print "\t"$$2";"}' | sort -u;\ echo '};'; \ ) > $2 endef ================================================ FILE: projects/Rockchip/packages/linux/patches/base/linux-usbhid-quircks.patch ================================================ diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c index e6cfd32..7aa0ff0 100644 --- a/drivers/hid/usbhid/hid-quirks.c +++ b/drivers/hid/usbhid/hid-quirks.c @@ -163,6 +163,53 @@ static const struct hid_blacklist { { USB_VENDOR_ID_DRACAL_RAPHNET, USB_DEVICE_ID_RAPHNET_2NES2SNES, HID_QUIRK_MULTI_INPUT }, { USB_VENDOR_ID_DRACAL_RAPHNET, USB_DEVICE_ID_RAPHNET_4NES4SNES, HID_QUIRK_MULTI_INPUT }, +// Juyao + { 0x0314,0x0326,0x040 }, + { 0x0314,0x0328,0x040 }, + +// 4NES4SNES + { 0x1781,0x0A9D,0x040 }, + +// Retrolink SNES + { 0x1292,0x5346,0x040 }, + { 0x1292,0x5366,0x040 }, + +// Retrobit Atari to USB Driver + { 0x1292,0x4154,0x040 }, + +// Retrobit Genesis to PC USB Adapter + { 0x1292,0x4745,0x040 }, + +// Retrode + { 0x0403,0x97c1,0x040 }, + +// HuiJia USB GamePad Mayflash Sega Saturn + { 0x0e8f,0x3010,0x040 }, + +// HuiJia USB GamePad Mayflash NES SNES + { 0x0079,0x1804,0x040 }, + +// Mayflash Dreamcast + { 0x0e8f,0x3013,0x040 }, + +// Xin-Mo 2players 20pins + { 0x16c0,0x75e1,0x040 }, + +// Xinmo 18 pins USB THT 2P arcade controller THT 2P arcade controller + { 0x16c0,0x05e1,0x040 }, + +// USB PS2 Adapter GreenAsia Electronics + { 0xe8f,0x1013,0x040 }, + +// HuiJia USB GamePad Mayflash N64 - need test + { 0xe8f,0x3013,0x040 }, + +// XCSOURCE 2 Encoder USB - Twin USB Gamepad + { 0x810,0xe001,0x040 }, + +// 3H Dual Arcade 2Players + { 0x16c0,0x05e0,0x040 }, + { 0, 0 } }; ================================================ FILE: projects/Rockchip/packages/linux/patches/base/linux-wiimote-abs-not-hat.patch ================================================ diff --git a/drivers/hid/hid-wiimote-modules.c b/drivers/hid/hid-wiimote-modules.c index 4390eee..76ed60b 100644 --- a/drivers/hid/hid-wiimote-modules.c +++ b/drivers/hid/hid-wiimote-modules.c @@ -1113,12 +1113,12 @@ static void wiimod_classic_in_ext(struct wiimote_data *wdata, const __u8 *ext) rt <<= 1; lt <<= 1; - input_report_abs(wdata->extension.input, ABS_HAT1X, lx - 0x20); - input_report_abs(wdata->extension.input, ABS_HAT1Y, ly - 0x20); - input_report_abs(wdata->extension.input, ABS_HAT2X, rx - 0x20); - input_report_abs(wdata->extension.input, ABS_HAT2Y, ry - 0x20); - input_report_abs(wdata->extension.input, ABS_HAT3X, rt); - input_report_abs(wdata->extension.input, ABS_HAT3Y, lt); + input_report_abs(wdata->extension.input, ABS_HAT0X, lx - 0x20); + input_report_abs(wdata->extension.input, ABS_HAT0Y, ly - 0x20); + input_report_abs(wdata->extension.input, ABS_HAT1X, rx - 0x20); + input_report_abs(wdata->extension.input, ABS_HAT1Y, ry - 0x20); + input_report_abs(wdata->extension.input, ABS_HAT2X, rt); + input_report_abs(wdata->extension.input, ABS_HAT2Y, lt); input_report_key(wdata->extension.input, wiimod_classic_map[WIIMOD_CLASSIC_KEY_RIGHT], @@ -1228,12 +1228,16 @@ static int wiimod_classic_probe(const struct wiimod_ops *ops, wdata->extension.input->keybit); set_bit(EV_ABS, wdata->extension.input->evbit); + set_bit(ABS_HAT0X, wdata->extension.input->absbit); + set_bit(ABS_HAT0Y, wdata->extension.input->absbit); set_bit(ABS_HAT1X, wdata->extension.input->absbit); set_bit(ABS_HAT1Y, wdata->extension.input->absbit); set_bit(ABS_HAT2X, wdata->extension.input->absbit); set_bit(ABS_HAT2Y, wdata->extension.input->absbit); - set_bit(ABS_HAT3X, wdata->extension.input->absbit); - set_bit(ABS_HAT3Y, wdata->extension.input->absbit); + input_set_abs_params(wdata->extension.input, + ABS_HAT0X, -30, 30, 1, 1); + input_set_abs_params(wdata->extension.input, + ABS_HAT0Y, -30, 30, 1, 1); input_set_abs_params(wdata->extension.input, ABS_HAT1X, -30, 30, 1, 1); input_set_abs_params(wdata->extension.input, @@ -1242,10 +1246,6 @@ static int wiimod_classic_probe(const struct wiimod_ops *ops, ABS_HAT2X, -30, 30, 1, 1); input_set_abs_params(wdata->extension.input, ABS_HAT2Y, -30, 30, 1, 1); - input_set_abs_params(wdata->extension.input, - ABS_HAT3X, -30, 30, 1, 1); - input_set_abs_params(wdata->extension.input, - ABS_HAT3Y, -30, 30, 1, 1); ret = input_register_device(wdata->extension.input); if (ret) ================================================ FILE: projects/Rockchip/packages/linux/patches/base/v2-arm64-atomics-lse-Dereference-matching-size.diff ================================================ diff --git a/arch/arm64/include/asm/atomic_lse.h b/arch/arm64/include/asm/atomic_lse.h index d955ade5df7c..5d460f6b7675 100644 --- a/arch/arm64/include/asm/atomic_lse.h +++ b/arch/arm64/include/asm/atomic_lse.h @@ -249,7 +249,7 @@ __lse__cmpxchg_case_##name##sz(volatile void *ptr, \ " mov %" #w "[tmp], %" #w "[old]\n" \ " cas" #mb #sfx "\t%" #w "[tmp], %" #w "[new], %[v]\n" \ " mov %" #w "[ret], %" #w "[tmp]" \ - : [ret] "+r" (x0), [v] "+Q" (*(unsigned long *)ptr), \ + : [ret] "+r" (x0), [v] "+Q" (*(u##sz *)ptr), \ [tmp] "=&r" (tmp) \ : [old] "r" (x1), [new] "r" (x2) \ : cl); \ diff --git a/arch/arm64/include/asm/cmpxchg.h b/arch/arm64/include/asm/cmpxchg.h index f9bef42c1411..497acf134d99 100644 --- a/arch/arm64/include/asm/cmpxchg.h +++ b/arch/arm64/include/asm/cmpxchg.h @@ -243,7 +243,7 @@ static inline void __cmpwait_case_##sz(volatile void *ptr, \ " cbnz %" #w "[tmp], 1f\n" \ " wfe\n" \ "1:" \ - : [tmp] "=&r" (tmp), [v] "+Q" (*(unsigned long *)ptr) \ + : [tmp] "=&r" (tmp), [v] "+Q" (*(u##sz *)ptr) \ : [val] "r" (val)); \ } ================================================ FILE: projects/Rockchip/packages/linux/sysctl.d/network.conf ================================================ net.ipv4.tcp_no_metrics_save=1 ================================================ FILE: projects/Rockchip/packages/linux/sysctl.d/qdisc.conf ================================================ net.core.default_qdisc = fq_codel ================================================ FILE: projects/Rockchip/packages/linux/udev.d/30-disable-wakeup.rules ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) ACTION!="add|change", GOTO="end" DRIVER=="ehci-pci|xhci_hcd", RUN+="/usr/bin/sh -c 'echo disabled > /sys/$devpath/power/wakeup'" LABEL="end" ================================================ FILE: projects/Rockchip/packages/linux/udev.d/40-modeswitch.rules ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) ACTION!="add|change", GOTO="end_modeswitch" KERNEL!="sr[0-9]*", GOTO="end_modeswitch" SUBSYSTEM!="block", GOTO="end_modeswitch" # Atheros Wireless / Netgear WNDA3200 ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="20ff", RUN+="/usr/bin/eject '/dev/%k'" # Realtek 8211CU Wifi AC USB / Ships with Odroid-Go Super! ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="1a2b", RUN+="/usr/sbin/usb_modeswitch -K -v 0bda -p 1a2b" LABEL="end_modeswitch" ================================================ FILE: projects/Rockchip/packages/linux/udev.d/50-wlan-powersave.rules ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) ACTION=="add", SUBSYSTEM=="net", KERNEL=="wlan*" RUN+="/usr/sbin/iw dev %k set power_save off" ================================================ FILE: projects/Rockchip/packages/mali-bifrost/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="mali-bifrost" PKG_VERSION="ad4c28932c3d07c75fc41dd4a3333f9013a25e7f" PKG_SHA256="8b7bd1f969e778459d79a51e5f58c26eda0b818580966daba16ee2fc08f4c151" PKG_ARCH="arm aarch64" PKG_LICENSE="nonfree" PKG_SITE="https://github.com/emuelec/libmali" PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libdrm" PKG_LONGDESC="The Mali GPU library used in Rockchip Platform for Odroidgo Advance" #PKG_MESON_OPTS_TARGET+=" -Dplatform=gbm -Dgpu=bifrost-g52 -Dversion=g2p0" pre_configure_target() { if [ "${DEVICE}" != "RK356x" ] && [ "$DEVICE" != "OdroidM1" ]; then # Testing new version, Vulkan in the name means nothing, Vulkan is not working. BLOB_PKG="rk3326_r13p0_gbm_with_vulkan_and_cl.zip" BLOB_SUM="ef1a18fabf270d0a6029917d6b0e6237d328613c2f8be4d420ea23e022288dd9" if [ ! -e "${SOURCES}/${PKG_NAME}/${BLOB_PKG}" ] then curl -Lo "${SOURCES}/${PKG_NAME}/${BLOB_PKG}" "https://dn.odroid.com/RK3326/ODROID-GO-Advance/${BLOB_PKG}" fi DLD_SUM=$(sha256sum "${SOURCES}/${PKG_NAME}/${BLOB_PKG}" | awk '{printf $1}') if [ ! "${DLD_SUM}" == "${BLOB_SUM}" ] then echo "Blob package mismatch, exiting." exit 1 fi unzip -o "${SOURCES}/${PKG_NAME}/${BLOB_PKG}" -d ${PKG_BUILD} fi } REAL_SYSROOT=${SYSROOT_PREFIX} makeinstall_target() { # remove all the extra blobs, we only need one rm -rf ${INSTALL}/usr if [ "${DEVICE}" != "RK356x" ] && [ "$DEVICE" != "OdroidM1" ]; then if [ "$ARCH" == "arm" ]; then BLOB="libmali.so_rk3326_gbm_arm32_r13p0_with_vulkan_and_cl" else BLOB="libmali.so_rk3326_gbm_arm64_r13p0_with_vulkan_and_cl" fi else if [ "$ARCH" == "arm" ]; then BLOB="lib/arm-linux-gnueabihf/libmali-bifrost-g52-g2p0-gbm.so" else BLOB="lib/aarch64-linux-gnu/libmali-bifrost-g52-g2p0-gbm.so" fi fi mkdir -p ${INSTALL}/usr/lib/ cp ${PKG_BUILD}/${BLOB} ${INSTALL}/usr/lib/libmali.so ln -sf /usr/lib/libmali.so ${INSTALL}/usr/lib/libEGL.so ln -sf /usr/lib/libmali.so ${INSTALL}/usr/lib/libEGL.so.1 ln -sf /usr/lib/libmali.so ${INSTALL}/usr/lib/libgbm.so ln -sf /usr/lib/libmali.so ${INSTALL}/usr/lib/libgbm.so.1 ln -sf /usr/lib/libmali.so ${INSTALL}/usr/lib/libGLESv2.so ln -sf /usr/lib/libmali.so ${INSTALL}/usr/lib/libGLESv2.so.2 ln -sf /usr/lib/libmali.so ${INSTALL}/usr/lib/libGLESv3.so ln -sf /usr/lib/libmali.so ${INSTALL}/usr/lib/libGLESv3.so.3 ln -sf /usr/lib/libmali.so ${INSTALL}/usr/lib/libGLESv1_CM.so.1 ln -sf /usr/lib/libmali.so ${INSTALL}/usr/lib/libGLES_CM.so.1 ln -sf /usr/lib/libmali.so ${INSTALL}/usr/lib/libmali.so.1 cp ${PKG_BUILD}/.${TARGET_NAME}/meson-private/*.pc ${REAL_SYSROOT}/usr/lib/pkgconfig cp -pr ${PKG_BUILD}/include ${REAL_SYSROOT}/usr cp ${PKG_BUILD}/include/GBM/gbm.h ${REAL_SYSROOT}/usr/include/gbm.h cp ${PKG_BUILD}/include/KHR/mali_khrplatform.h ${REAL_SYSROOT}/usr/include/KHR/khrplatform.h mkdir -p ${REAL_SYSROOT}/usr/lib cp ${PKG_BUILD}/${BLOB} ${REAL_SYSROOT}/usr/lib/libmali.so ln -sf ${REAL_SYSROOT}/usr/lib/libmali.so ${REAL_SYSROOT}/usr/lib/libEGL.so ln -sf ${REAL_SYSROOT}/usr/lib/libmali.so ${REAL_SYSROOT}/usr/lib/libEGL.so.1 ln -sf ${REAL_SYSROOT}/usr/lib/libmali.so ${REAL_SYSROOT}/usr/lib/libgbm.so ln -sf ${REAL_SYSROOT}/usr/lib/libmali.so ${REAL_SYSROOT}/usr/lib/libgbm.so.1 ln -sf ${REAL_SYSROOT}/usr/lib/libmali.so ${REAL_SYSROOT}/usr/lib/libGLESv2.so ln -sf ${REAL_SYSROOT}/usr/lib/libmali.so ${REAL_SYSROOT}/usr/lib/libGLESv2.so.2 ln -sf ${REAL_SYSROOT}/usr/lib/libmali.so ${REAL_SYSROOT}/usr/lib/libGLESv3.so ln -sf ${REAL_SYSROOT}/usr/lib/libmali.so ${REAL_SYSROOT}/usr/lib/libGLESv3.so.3 ln -sf ${REAL_SYSROOT}/usr/lib/libmali.so ${REAL_SYSROOT}/usr/lib/libGLESv1_CM.so.1 ln -sf ${REAL_SYSROOT}/usr/lib/libmali.so ${REAL_SYSROOT}/usr/lib/libGLES_CM.so.1 ln -sf /usr/lib/libmali.so ${INSTALL}/usr/lib/libmali.so.1 } ================================================ FILE: projects/Rockchip/packages/mali-bifrost/patches/mali-bitfrost-001-gbminclude.patch ================================================ diff --git a/include/EGL/eglplatform.h b/include/EGL/eglplatform.h index 184e204..746a7ec 100644 --- a/include/EGL/eglplatform.h +++ b/include/EGL/eglplatform.h @@ -1,6 +1,7 @@ #ifndef __eglplatform_h_ #define __eglplatform_h_ +#include <gbm.h> /* ** Copyright (c) 2007-2016 The Khronos Group Inc. ** ================================================ FILE: projects/Rockchip/packages/retrorun/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="retrorun" PKG_VERSION="c83f1095351c82be9b04cdebd61ca0e03ef4cfb7" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/navy1978/retrorun-go2" PKG_URL="$PKG_SITE.git" PKG_DEPENDS_TARGET="toolchain libgo2 libdrm" PKG_TOOLCHAIN="make" pre_configure_target() { CFLAGS+=" -I$(get_build_dir libdrm)/include/drm" CFLAGS+=" -I$(get_build_dir linux)/include/uapi" CFLAGS+=" -I$(get_build_dir linux)/tools/include" PKG_MAKE_OPTS_TARGET=" config=release ARCH=" sed -i "s|/storage/.config/distribution/|/emuelec/|g" ${PKG_BUILD}/src/main.cpp rm ${PKG_BUILD}/retrorun } makeinstall_target() { mkdir -p ${INSTALL}/usr/bin mkdir -p ${INSTALL}/usr/config/emuelec/configs/ if [ ${ARCH} == "arm" ]; then cp retrorun $INSTALL/usr/bin/retrorun32 else cp retrorun ${INSTALL}/usr/bin/retrorun fi cp ${PKG_BUILD}/setting.cfg ${INSTALL}/usr/config/emuelec/configs/retrorun.cfg } ================================================ FILE: projects/Rockchip/packages/retrorun/patches/001-tatemode.patch ================================================ diff --git a/retrorun b/retrorun index 5491dd6..a5a26ec 100755 Binary files a/retrorun and b/retrorun differ diff --git a/src/globals.cpp b/src/globals.cpp index ff0621b..bc72f01 100755 --- a/src/globals.cpp +++ b/src/globals.cpp @@ -7,6 +7,7 @@ RETRORUN_CORE_TYPE Retrorun_Core = RETRORUN_CORE_UNKNOWN; Device device = UNKNOWN; bool force_left_analog_stick = true; +bool opt_is_tate = false; bool opt_triggers = false; bool gpio_joypad = false; float opt_aspect = 0.0f; diff --git a/src/globals.h b/src/globals.h index 23f3bc0..4cbf6de 100755 --- a/src/globals.h +++ b/src/globals.h @@ -47,6 +47,7 @@ extern bool force_left_analog_stick; extern float fps; extern bool opt_triggers; +extern bool opt_is_tate; extern bool gpio_joypad; extern float opt_aspect; extern float aspect_ratio; diff --git a/src/main.cpp b/src/main.cpp index 0cbbfe2..2d7a799 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -98,6 +98,7 @@ struct option longopts[] = { {"triggers", no_argument, NULL, 't'}, {"analog", no_argument, NULL, 'n'}, {"fps", no_argument, NULL, 'f'}, + {"tatemode", no_argument, NULL, 'z'}, {0, 0, 0, 0}}; static struct @@ -883,7 +884,7 @@ int main(int argc, char *argv[]) int c; int option_index = 0; - while ((c = getopt_long(argc, argv, "s:d:a:b:v:grtnfc:", longopts, &option_index)) != -1) + while ((c = getopt_long(argc, argv, "s:d:a:b:v:grtnfcz:", longopts, &option_index)) != -1) { switch (c) { @@ -929,7 +930,9 @@ int main(int argc, char *argv[]) case 'c': opt_setting_file = optarg; break; - + case 'z': + opt_is_tate = true; + break; default: printf("Unknown option. '%s'\n", longopts[option_index].name); exit(EXIT_FAILURE); diff --git a/src/video.cpp b/src/video.cpp index d168eda..66238ee 100755 --- a/src/video.cpp +++ b/src/video.cpp @@ -577,6 +577,7 @@ bool cmpf(float A, float B, float epsilon = 0.005f) void prepareScreen(int width, int height) { screen_aspect_ratio = (float)go2_display_height_get(display) / (float)go2_display_width_get(display); + isTate = opt_is_tate; if (aspect_ratio >= 1.0f) { if (isWideScreen) @@ -641,7 +642,7 @@ void prepareScreen(int width, int height) y = 0; h = go2_display_height_get(display); w = go2_display_width_get(display); - isTate = (Retrorun_Core == RETRORUN_CORE_FLYCAST); // we rotate the screen (Tate) for some arcade games when apsect ratio < 0 + // isTate = (Retrorun_Core == RETRORUN_CORE_FLYCAST); // we rotate the screen (Tate) for some arcade games when apsect ratio < 0 } } ================================================ FILE: projects/Rockchip/packages/systemd/scripts/cpufreq ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2015 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) SYS_CPUFREQ_GOV=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor) if [ "${SYS_CPUFREQ_GOV}" = "ondemand" ]; then for io_is_busy in $(find /sys/devices/system/cpu -name io_is_busy); do echo 1 > "${io_is_busy}" done for up_threshold in $(find /sys/devices/system/cpu -name up_threshold); do echo 50 > "${up_threshold}" done for sampling_rate in $(find /sys/devices/system/cpu -name sampling_rate); do echo 100000 > "${sampling_rate}" done for sampling_down_factor in $(find /sys/devices/system/cpu -name sampling_down_factor); do echo 50 > "${sampling_down_factor}" done else echo "cpufreq: settings not found for current cpu governor." | systemd-cat -p info fi ================================================ FILE: projects/Rockchip/packages/u-boot/package.mk ================================================ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="u-boot" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://www.denx.de/wiki/U-Boot" PKG_DEPENDS_TARGET="toolchain swig:host dtc:host" PKG_LONGDESC="Das U-Boot is a cross-platform bootloader for embedded systems." PKG_IS_KERNEL_PKG="yes" PKG_STAMP="$UBOOT_SYSTEM" [ -n "$ATF_PLATFORM" ] && PKG_DEPENDS_TARGET+=" atf" PKG_NEED_UNPACK="$PROJECT_DIR/$PROJECT/bootloader" [ -n "$DEVICE" ] && PKG_NEED_UNPACK+=" $PROJECT_DIR/$PROJECT/devices/$DEVICE/bootloader" case "$PROJECT" in Rockchip) if [ "$DEVICE" == "OdroidGoAdvance" ]; then # This is specific for the Rk3326 Odroid Go Advance/Super PKG_VERSION="0e26e35cb18a80005b7de45c95858c86a2f7f41e" PKG_SHA256="0e0939ba2fdb68dba26dca759092e63d4a63c43068af97deccbb2609e9675485" PKG_URL="https://github.com/hardkernel/u-boot/archive/$PKG_VERSION.tar.gz" PKG_PATCH_DIRS="OdroidGoAdvance base" elif [ "$DEVICE" == "GameForce" ]; then # This is specific for the Rk3326 GameForce Chi PKG_VERSION="3f696081df4f44ef2ccfe2d7033889607bb7dd45" PKG_SHA256="e192e74f708f93cbeabdb7c5c1fbc6e49b5b2e036ad484f5aecf19e03cfabc9e" PKG_URL="https://github.com/shantigilbert/u-boot/archive/$PKG_VERSION.tar.gz" PKG_PATCH_DIRS="GameForce base" elif [ "$DEVICE" == "OdroidM1" ]; then PKG_VERSION="0677e140ba015b95ccd6d762ce51a4c6860a49ca" PKG_SHA256="210b3c0f0e27a72be1aeff860a712bd2fc694c015f835ffd75dea6531502521a" PKG_URL="https://github.com/hardkernel/u-boot/archive/$PKG_VERSION.tar.gz" PKG_PATCH_DIRS="OdroidM1" elif [ "$DEVICE" == "RK356x" ]; then PKG_VERSION="fc354ea827411c1cc35ddf76162aed02f7a9c7d5" PKG_SHA256="eefe0b87e40d801a649a4ea6e062ed239aa08be1cbf81fa4e6a13e9344bf556d" PKG_URL="https://gitlab.com/firefly-linux/u-boot/-/archive/$PKG_VERSION/u-boot-$PKG_VERSION.tar.gz" PKG_PATCH_DIRS="RK356x" else PKG_VERSION="8659d08d2b589693d121c1298484e861b7dafc4f" PKG_SHA256="3f9f2bbd0c28be6d7d6eb909823fee5728da023aca0ce37aef3c8f67d1179ec1" PKG_URL="https://github.com/rockchip-linux/u-boot/archive/$PKG_VERSION.tar.gz" PKG_PATCH_DIRS="rockchip base" fi PKG_DEPENDS_TARGET+=" rkbin" PKG_NEED_UNPACK+=" $(get_pkg_directory rkbin)" ;; *) PKG_VERSION="2019.04" PKG_SHA256="76b7772d156b3ddd7644c8a1736081e55b78828537ff714065d21dbade229bef" PKG_URL="http://ftp.denx.de/pub/u-boot/u-boot-$PKG_VERSION.tar.bz2" ;; esac post_patch() { if [ -n "$UBOOT_SYSTEM" ] && find_file_path bootloader/config; then PKG_CONFIG_FILE="$PKG_BUILD/configs/$($ROOT/$SCRIPTS/uboot_helper $PROJECT $DEVICE $UBOOT_SYSTEM config)" if [ -f "$PKG_CONFIG_FILE" ]; then cat $FOUND_PATH >> "$PKG_CONFIG_FILE" fi fi } make_target() { export KCFLAGS="-Wno-error=address-of-packed-member -Wno-error=maybe-uninitialized -Wno-address" if [ -z "$UBOOT_SYSTEM" ]; then echo "UBOOT_SYSTEM must be set to build an image" echo "see './scripts/uboot_helper' for more information" else if [ "$DEVICE" == "RK356x" ]; then sed -i "s|CROSS_COMPILE_ARM64=\..*|CROSS_COMPILE_ARM64=${TOOLCHAIN}/bin/${TARGET_NAME}-|" make.sh sed -i "s|aarch64-linux-gnu|${TARGET_NAME}|g" make.sh sed -i "s|PATH\=$(get_build_dir rkbin)/bin/rk35/|PATH\=bin/rk35/|g" $(get_build_dir rkbin)/RKTRUST/RK3568TRUST.ini sed -i "s|1\=$(get_build_dir rkbin)/bin/rk35/|1\=bin/rk35/|g" $(get_build_dir rkbin)/RKBOOT/RK3568MINIALL.ini sed -i "s|python2|python3|g" arch/arm/mach-rockchip/decode_bl31.py sed -i "s|python2|python3|g" make.sh sed -i "s|\.\./rkbin|$(get_build_dir rkbin)|" make.sh sed -i "s|\.\./rkbin|$(get_build_dir rkbin)|" scripts/fit.sh cd $PKG_BUILD ./make.sh $($ROOT/$SCRIPTS/uboot_helper $PROJECT $DEVICE $UBOOT_SYSTEM config | sed "s|_defconfig||") --spl-new --burn-key-hash ./make.sh --idblock elif [ "$DEVICE" == "OdroidM1" ]; then sed -i "s|CROSS_COMPILE_ARM64=.*|CROSS_COMPILE_ARM64=${TOOLCHAIN}/bin/${TARGET_NAME}-|" make.sh sed -i "s|aarch64-linux-gnu|${TARGET_NAME}|g" make.sh sed -i "s|FlashBoot=../spl/u-boot-spl.bin|FlashBoot=${PKG_BUILD}/spl/u-boot-spl.bin|g" $(get_build_dir rkbin)/RKBOOT/RK3568-ODROIDM1.ini sed -i "s|python2|python3|g" arch/arm/mach-rockchip/decode_bl31.py sed -i "s|python2|python3|g" make.sh sed -i "s|RKBIN_TOOLS=.*|RKBIN_TOOLS=$(get_build_dir rkbin)/tools|" make.sh sed -i "s|RK_SIGN_TOOL=\"rkbin/tools|RK_SIGN_TOOL=\"$(get_build_dir rkbin)/tools|" scripts/fit.sh cd ${PKG_BUILD} sed -i "s|PATH=$(get_build_dir rkbin)/bin/rk35/|PATH\=bin/rk35/|g" $(get_build_dir rkbin)/RKTRUST/RK3568TRUST.ini ./make.sh $($ROOT/$SCRIPTS/uboot_helper $PROJECT $DEVICE $UBOOT_SYSTEM config | sed "s|_defconfig||") sed -i "s|SPL_BIN=\${RKBIN}.*|SPL_BIN=${PKG_BUILD}/spl/u-boot-spl.bin|g" make.sh ./make.sh --idblock sed -i "s|PATH=bin/rk35/|PATH\=$(get_build_dir rkbin)/bin/rk35/|g" $(get_build_dir rkbin)/RKTRUST/RK3568TRUST.ini $(get_build_dir rkbin)/tools/trust_merger --verbose $(get_build_dir rkbin)/RKTRUST/RK3568TRUST.ini ./make.sh loader $(get_build_dir rkbin)/RKBOOT/RK3568-ODROIDM1.ini else [ "${BUILD_WITH_DEBUG}" = "yes" ] && PKG_DEBUG=1 || PKG_DEBUG=0 [ -n "$ATF_PLATFORM" ] && cp -av $(get_build_dir atf)/bl31.bin . DEBUG=${PKG_DEBUG} CROSS_COMPILE="$TARGET_KERNEL_PREFIX" LDFLAGS="" ARCH=arm make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE="$TARGET_KERNEL_PREFIX" LDFLAGS="" ARCH=arm make $($ROOT/$SCRIPTS/uboot_helper $PROJECT $DEVICE $UBOOT_SYSTEM config) DEBUG=${PKG_DEBUG} CROSS_COMPILE="$TARGET_KERNEL_PREFIX" LDFLAGS="" ARCH=arm _python_sysroot="$TOOLCHAIN" _python_prefix=/ _python_exec_prefix=/ make HOSTCC="$HOST_CC" HOSTLDFLAGS="-L$TOOLCHAIN/lib" HOSTSTRIP="true" CONFIG_MKIMAGE_DTC_PATH="scripts/dtc/dtc" fi fi } makeinstall_target() { mkdir -p $INSTALL/usr/share/bootloader # Only install u-boot.img et al when building a board specific image if [ -n "$UBOOT_SYSTEM" ]; then find_file_path bootloader/install && . ${FOUND_PATH} fi # Always install the update script find_file_path bootloader/update.sh && cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader # Always install the canupdate script if find_file_path bootloader/canupdate.sh; then cp -av ${FOUND_PATH} $INSTALL/usr/share/bootloader sed -e "s/@PROJECT@/${DEVICE:-$PROJECT}/g" \ -i $INSTALL/usr/share/bootloader/canupdate.sh fi } ================================================ FILE: projects/Rockchip/packages/u-boot/patches/OdroidGoAdvance/01-u-boot-EmuELEC.patch ================================================ --- a/board/rockchip/odroidgoa/odroidgoa.c +++ b/board/rockchip/odroidgoa/odroidgoa.c @@ -143,10 +143,10 @@ } /* check launcher in ext4 fs of sd card */ - if (file_exists("mmc", "1:2", "/usr/local/bin/emulationstation/emulationstation", + if (!file_exists("mmc", "1:2", "/usr/local/bin/emulationstation/emulationstation", FS_TYPE_EXT)) { lcd_setfg_color("white"); - lcd_printf(0, 0, 1, "[ GO Advanced EMULATION Image ]"); + lcd_printf(0, 0, 1, "[ EmuELEC Odroid Go Advance ]"); } return; ================================================ FILE: projects/Rockchip/packages/u-boot/patches/base/0001-Kbuild-fix-escaping-in-.cmd-files-for-future-Make.patch ================================================ From e5e701c2b8470de044c5c71d2a54ecfc72680d59 Mon Sep 17 00:00:00 2001 From: Rasmus Villemoes <linux@rasmusvillemoes.dk> Date: Wed, 19 Sep 2018 11:35:56 +0900 Subject: [PATCH] Kbuild: fix # escaping in .cmd files for future Make MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ commit 9564a8cf422d7b58f6e857e3546d346fa970191e in Linux ] I tried building using a freshly built Make (4.2.1-69-g8a731d1), but already the objtool build broke with orc_dump.c: In function ‘orc_dump’: orc_dump.c:106:2: error: ‘elf_getshnum’ is deprecated [-Werror=deprecated-declarations] if (elf_getshdrnum(elf, &nr_sections)) { Turns out that with that new Make, the backslash was not removed, so cpp didn't see a #include directive, grep found nothing, and -DLIBELF_USE_DEPRECATED was wrongly put in CFLAGS. Now, that new Make behaviour is documented in their NEWS file: * WARNING: Backward-incompatibility! Number signs (#) appearing inside a macro reference or function invocation no longer introduce comments and should not be escaped with backslashes: thus a call such as: foo := $(shell echo '#') is legal. Previously the number sign needed to be escaped, for example: foo := $(shell echo '\#') Now this latter will resolve to "\#". If you want to write makefiles portable to both versions, assign the number sign to a variable: C := \# foo := $(shell echo '$C') This was claimed to be fixed in 3.81, but wasn't, for some reason. To detect this change search for 'nocomment' in the .FEATURES variable. This also fixes up the two make-cmd instances to replace # with $(pound) rather than with \#. There might very well be other places that need similar fixup in preparation for whatever future Make release contains the above change, but at least this builds an x86_64 defconfig with the new make. Link: https://bugzilla.kernel.org/show_bug.cgi?id=197847 Cc: Randy Dunlap <rdunlap@infradead.org> Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> --- scripts/Kbuild.include | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index 2c7918ad37..13ebddda65 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include @@ -7,6 +7,7 @@ quote := " squote := ' empty := space := $(empty) $(empty) +pound := \# ### # Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o @@ -242,11 +243,11 @@ endif # Replace >$< with >$$< to preserve $ when reloading the .cmd file # (needed for make) -# Replace >#< with >\#< to avoid starting a comment in the .cmd file +# Replace >#< with >$(pound)< to avoid starting a comment in the .cmd file # (needed for make) # Replace >'< with >'\''< to be able to enclose the whole string in '...' # (needed for the shell) -make-cmd = $(call escsq,$(subst \#,\\\#,$(subst $$,$$$$,$(cmd_$(1))))) +make-cmd = $(call escsq,$(subst $(pound),$$(pound),$(subst $$,$$$$,$(cmd_$(1))))) # Find any prerequisites that is newer than target or that does not exist. # PHONY targets skipped in both cases. -- 2.27.0 ================================================ FILE: projects/Rockchip/packages/u-boot/patches/base/0001-kbuild-fix-escaping-in-appending-U-Boot-own-DT.patch ================================================ From 0c544115379ed77c1843a194e26960e5b8f3d369 Mon Sep 17 00:00:00 2001 From: Masahiro Yamada <yamada.masahiro@socionext.com> Date: Wed, 19 Sep 2018 11:35:57 +0900 Subject: [PATCH] kbuild: fix # escaping in appending U-Boot own DT The escape sequence '\#' does not work for the latest GNU Make from the git tree. Replace it with $(pound) as Linux did. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> --- scripts/Makefile.lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index f8c3fff1d1..4dceb6d1b3 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -299,7 +299,7 @@ quiet_cmd_dtc = DTC $@ # Modified for U-Boot # Bring in any U-Boot-specific include at the end of the file cmd_dtc = mkdir -p $(dir ${dtc-tmp}) ; \ - (cat $<; $(if $(u_boot_dtsi),echo '\#include "$(u_boot_dtsi)"')) > $(pre-tmp); \ + (cat $<; $(if $(u_boot_dtsi),echo '$(pound)include "$(u_boot_dtsi)"')) > $(pre-tmp); \ $(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $(pre-tmp) ; \ $(DTC) -O dtb -o $@ -b 0 \ -i $(dir $<) $(DTC_FLAGS) \ -- 2.27.0 ================================================ FILE: projects/Rockchip/packages/u-boot/patches/base/0001-scripts-dtc-Remove-redundant-YYLOC-global-declaratio.patch ================================================ From d988ec14978819bc2e0662fd9f853f52aedce498 Mon Sep 17 00:00:00 2001 From: Dirk Mueller <dmueller@suse.com> Date: Tue, 14 Jan 2020 18:53:41 +0100 Subject: [PATCH] scripts/dtc: Remove redundant YYLOC global declaration commit e33a814e772cdc36436c8c188d8c42d019fda639 upstream. gcc 10 will default to -fno-common, which causes this error at link time: (.text+0x0): multiple definition of `yylloc'; dtc-lexer.lex.o (symbol from plugin):(.text+0x0): first defined here This is because both dtc-lexer as well as dtc-parser define the same global symbol yyloc. Before with -fcommon those were merged into one defintion. The proper solution would be to to mark this as "extern", however that leads to: dtc-lexer.l:26:16: error: redundant redeclaration of 'yylloc' [-Werror=redundant-decls] 26 | extern YYLTYPE yylloc; | ^~~~~~ In file included from dtc-lexer.l:24: dtc-parser.tab.h:127:16: note: previous declaration of 'yylloc' was here 127 | extern YYLTYPE yylloc; | ^~~~~~ cc1: all warnings being treated as errors which means the declaration is completely redundant and can just be dropped. Signed-off-by: Dirk Mueller <dmueller@suse.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au> [robh: cherry-pick from upstream] Cc: stable@vger.kernel.org Signed-off-by: Rob Herring <robh@kernel.org> [nc: Also apply to dtc-lexer.lex.c_shipped due to a lack of e039139be8c2, where dtc-lexer.l started being used] Signed-off-by: Nathan Chancellor <natechancellor@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Change-Id: I7f299451e99aab09375883546e47505ec0937c26 --- scripts/dtc/dtc-lexer.l | 1 - scripts/dtc/dtc-lexer.lex.c_shipped | 1 - 2 files changed, 2 deletions(-) diff --git a/scripts/dtc/dtc-lexer.l b/scripts/dtc/dtc-lexer.l index fd825ebba6..24af549977 100644 --- a/scripts/dtc/dtc-lexer.l +++ b/scripts/dtc/dtc-lexer.l @@ -38,7 +38,6 @@ LINECOMMENT "//".*\n #include "srcpos.h" #include "dtc-parser.tab.h" -YYLTYPE yylloc; extern bool treesource_error; /* CAUTION: this will stop working if we ever use yyless() or yyunput() */ diff --git a/scripts/dtc/dtc-lexer.lex.c_shipped b/scripts/dtc/dtc-lexer.lex.c_shipped index 011bb9632f..79952cd3ca 100644 --- a/scripts/dtc/dtc-lexer.lex.c_shipped +++ b/scripts/dtc/dtc-lexer.lex.c_shipped @@ -631,7 +631,6 @@ char *yytext; #include "srcpos.h" #include "dtc-parser.tab.h" -YYLTYPE yylloc; extern bool treesource_error; /* CAUTION: this will stop working if we ever use yyless() or yyunput() */ -- 2.27.0 ================================================ FILE: projects/Rockchip/patches/atf/0001-rk3399-atf-fix-baud.patch ================================================ diff --git a/plat/rockchip/rk3399/rk3399_def.h b/plat/rockchip/rk3399/rk3399_def.h index ba83242ebe..8d6ecfbe66 100644 --- a/plat/rockchip/rk3399/rk3399_def.h +++ b/plat/rockchip/rk3399/rk3399_def.h @@ -17,7 +17,7 @@ /************************************************************************** * UART related constants **************************************************************************/ -#define RK3399_BAUDRATE 115200 +#define RK3399_BAUDRATE 1500000 #define RK3399_UART_CLOCK 24000000 /****************************************************************************** ================================================ FILE: projects/Rockchip/patches/linux/default/linux-0002-rockchip-from-list.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sat, 10 Oct 2020 15:32:19 +0000 Subject: [PATCH] phy/rockchip: inno-hdmi: remove unused no_c from rk3328 recalc_rate no_c is not used in any calculation, lets remove it. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/phy/rockchip/phy-rockchip-inno-hdmi.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/phy/rockchip/phy-rockchip-inno-hdmi.c b/drivers/phy/rockchip/phy-rockchip-inno-hdmi.c index 15a008a1ac7b..4b936ca19920 100644 --- a/drivers/phy/rockchip/phy-rockchip-inno-hdmi.c +++ b/drivers/phy/rockchip/phy-rockchip-inno-hdmi.c @@ -714,7 +714,7 @@ unsigned long inno_hdmi_phy_rk3328_clk_recalc_rate(struct clk_hw *hw, { struct inno_hdmi_phy *inno = to_inno_hdmi_phy(hw); unsigned long frac; - u8 nd, no_a, no_b, no_c, no_d; + u8 nd, no_a, no_b, no_d; u64 vco; u16 nf; @@ -737,9 +737,6 @@ unsigned long inno_hdmi_phy_rk3328_clk_recalc_rate(struct clk_hw *hw, no_b = inno_read(inno, 0xa5) & RK3328_PRE_PLL_PCLK_DIV_B_MASK; no_b >>= RK3328_PRE_PLL_PCLK_DIV_B_SHIFT; no_b += 2; - no_c = inno_read(inno, 0xa6) & RK3328_PRE_PLL_PCLK_DIV_C_MASK; - no_c >>= RK3328_PRE_PLL_PCLK_DIV_C_SHIFT; - no_c = 1 << no_c; no_d = inno_read(inno, 0xa6) & RK3328_PRE_PLL_PCLK_DIV_D_MASK; do_div(vco, (nd * (no_a == 1 ? no_b : no_a) * no_d * 2)); From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Huicong Xu <xhc@rock-chips.com> Date: Sat, 10 Oct 2020 15:32:20 +0000 Subject: [PATCH] phy/rockchip: inno-hdmi: force set_rate on power_on Regular 8-bit and Deep Color video formats mainly differ in TMDS rate and not in pixel clock rate. When the hdmiphy clock is configured with the same pixel clock rate using clk_set_rate() the clock framework do not signal the hdmi phy driver to set_rate when switching between 8-bit and Deep Color. This result in pre/post pll not being re-configured when switching between regular 8-bit and Deep Color video formats. Fix this by calling set_rate in power_on to force pre pll re-configuration. Signed-off-by: Huicong Xu <xhc@rock-chips.com> Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/phy/rockchip/phy-rockchip-inno-hdmi.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/phy/rockchip/phy-rockchip-inno-hdmi.c b/drivers/phy/rockchip/phy-rockchip-inno-hdmi.c index 620961fcfc1d..2f01259823ea 100644 --- a/drivers/phy/rockchip/phy-rockchip-inno-hdmi.c +++ b/drivers/phy/rockchip/phy-rockchip-inno-hdmi.c @@ -245,6 +245,7 @@ struct inno_hdmi_phy { struct clk_hw hw; struct clk *phyclk; unsigned long pixclock; + unsigned long tmdsclock; }; struct pre_pll_config { @@ -485,6 +486,8 @@ static int inno_hdmi_phy_power_on(struct phy *phy) dev_dbg(inno->dev, "Inno HDMI PHY Power On\n"); + inno->plat_data->clk_ops->set_rate(&inno->hw, inno->pixclock, 24000000); + ret = clk_prepare_enable(inno->phyclk); if (ret) return ret; @@ -509,6 +512,8 @@ static int inno_hdmi_phy_power_off(struct phy *phy) clk_disable_unprepare(inno->phyclk); + inno->tmdsclock = 0; + dev_dbg(inno->dev, "Inno HDMI PHY Power Off\n"); return 0; @@ -628,6 +633,9 @@ static int inno_hdmi_phy_rk3228_clk_set_rate(struct clk_hw *hw, dev_dbg(inno->dev, "%s rate %lu tmdsclk %lu\n", __func__, rate, tmdsclock); + if (inno->pixclock == rate && inno->tmdsclock == tmdsclock) + return 0; + cfg = inno_hdmi_phy_get_pre_pll_cfg(inno, rate); if (IS_ERR(cfg)) return PTR_ERR(cfg); @@ -670,6 +678,7 @@ static int inno_hdmi_phy_rk3228_clk_set_rate(struct clk_hw *hw, } inno->pixclock = rate; + inno->tmdsclock = tmdsclock; return 0; } @@ -781,6 +790,9 @@ static int inno_hdmi_phy_rk3328_clk_set_rate(struct clk_hw *hw, dev_dbg(inno->dev, "%s rate %lu tmdsclk %lu\n", __func__, rate, tmdsclock); + if (inno->pixclock == rate && inno->tmdsclock == tmdsclock) + return 0; + cfg = inno_hdmi_phy_get_pre_pll_cfg(inno, rate); if (IS_ERR(cfg)) return PTR_ERR(cfg); @@ -820,6 +832,7 @@ static int inno_hdmi_phy_rk3328_clk_set_rate(struct clk_hw *hw, } inno->pixclock = rate; + inno->tmdsclock = tmdsclock; return 0; } From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sun, 17 Feb 2019 22:14:38 +0000 Subject: [PATCH] mmc: core: set initial signal voltage on power off Some boards have SD card connectors where the power rail cannot be switched off by the driver. If the card has not been power cycled, it may still be using 1.8V signaling after a warm re-boot. Bootroms expecting 3.3V signaling will fail to boot from a UHS card that continue to use 1.8V signaling. Set initial signal voltage in mmc_power_off() to allow re-boot to function. This fixes re-boot with UHS cards on Asus Tinker Board (Rockchip RK3288), same issue have been seen on some Rockchip RK3399 boards. I am sending this as a RFC because I have no insights into SD/MMC subsystem, this change fix a re-boot issue on my boards and does not break emmc/sdio. Is this an acceptable workaround? Any advice is appreciated. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/mmc/core/core.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index ef53a2578824..d4c53074154a 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -1358,6 +1358,14 @@ void mmc_power_off(struct mmc_host *host) if (host->ios.power_mode == MMC_POWER_OFF) return; + mmc_set_initial_signal_voltage(host); + + /* + * This delay should be sufficient to allow the power supply + * to reach the minimum voltage. + */ + mmc_delay(host->ios.power_delay_ms); + mmc_pwrseq_power_off(host); host->ios.clock = 0; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Wed, 23 Jun 2021 16:59:18 +0200 Subject: [PATCH] arm64: dts: rockchip: Add sdmmc_ext for RK3328 RK3328 SoC has a fourth mmc controller called SDMMC_EXT. Some boards have sdio wifi connected to it. In order to use it one would have to add the pinctrls from sdmmc0ext group which is done on board level. Signed-off-by: Alex Bee <knaerzche@gmail.com> --- arch/arm64/boot/dts/rockchip/rk3328.dtsi | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi index 49ae15708a0b..60348d517efb 100644 --- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi @@ -993,6 +993,20 @@ usb_host0_ohci: usb@ff5d0000 { status = "disabled"; }; + sdmmc_ext: mmc@ff5f0000 { + compatible = "rockchip,rk3328-dw-mshc", "rockchip,rk3288-dw-mshc"; + reg = <0x0 0xff5f0000 0x0 0x4000>; + interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru HCLK_SDMMC_EXT>, <&cru SCLK_SDMMC_EXT>, + <&cru SCLK_SDMMC_EXT_DRV>, <&cru SCLK_SDMMC_EXT_SAMPLE>; + clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; + fifo-depth = <0x100>; + max-frequency = <150000000>; + resets = <&cru SRST_SDMMCEXT>; + reset-names = "reset"; + status = "disabled"; + }; + usbdrd3: usb@ff600000 { compatible = "rockchip,rk3328-dwc3", "snps,dwc3"; reg = <0x0 0xff600000 0x0 0x100000>; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Wed, 23 Jun 2021 17:02:08 +0200 Subject: [PATCH] arm64: dts: rockchip: Add sdmmc/sdio/emmc reset controls for RK3328 The DW MCI controller driver will use them to reset the IP block before initialisation. Fixes: d717f7352ec6 ("arm64: dts: rockchip: add sdmmc/sdio/emmc nodes for RK3328 SoCs") Signed-off-by: Alex Bee <knaerzche@gmail.com> --- arch/arm64/boot/dts/rockchip/rk3328.dtsi | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi index 60348d517efb..d7e44d174d7b 100644 --- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi @@ -871,6 +871,8 @@ sdmmc: mmc@ff500000 { clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; fifo-depth = <0x100>; max-frequency = <150000000>; + resets = <&cru SRST_MMC0>; + reset-names = "reset"; status = "disabled"; }; @@ -883,6 +885,8 @@ sdio: mmc@ff510000 { clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; fifo-depth = <0x100>; max-frequency = <150000000>; + resets = <&cru SRST_SDIO>; + reset-names = "reset"; status = "disabled"; }; @@ -895,6 +899,8 @@ emmc: mmc@ff520000 { clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; fifo-depth = <0x100>; max-frequency = <150000000>; + resets = <&cru SRST_EMMC>; + reset-names = "reset"; status = "disabled"; }; ================================================ FILE: projects/Rockchip/patches/linux/default/linux-0011-v4l2-from-list.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Mon, 6 Jul 2020 21:54:35 +0000 Subject: [PATCH] media: v4l2-common: Add helpers to calculate bytesperline and sizeimage Add helper functions to calculate plane bytesperline and sizeimage, these new helpers consider block width and height when calculating plane bytesperline and sizeimage. This prepare support for new pixel formats added in next patch that make use of block width and height. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/media/v4l2-core/v4l2-common.c | 77 +++++++++++++-------------- 1 file changed, 38 insertions(+), 39 deletions(-) diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-core/v4l2-common.c index e0fbe6ba4b6c..cb2f1acab7cf 100644 --- a/drivers/media/v4l2-core/v4l2-common.c +++ b/drivers/media/v4l2-core/v4l2-common.c @@ -338,6 +338,33 @@ static inline unsigned int v4l2_format_block_height(const struct v4l2_format_inf return info->block_h[plane]; } +static inline unsigned int v4l2_format_plane_width(const struct v4l2_format_info *info, int plane, + unsigned int width) +{ + unsigned int hdiv = plane ? info->hdiv : 1; + unsigned int bytes = DIV_ROUND_UP(width * info->bpp[plane], + v4l2_format_block_width(info, plane) * + v4l2_format_block_height(info, plane)); + + return DIV_ROUND_UP(bytes, hdiv); +} + +static inline unsigned int v4l2_format_plane_height(const struct v4l2_format_info *info, int plane, + unsigned int height) +{ + unsigned int vdiv = plane ? info->vdiv : 1; + unsigned int lines = ALIGN(height, v4l2_format_block_height(info, plane)); + + return DIV_ROUND_UP(lines, vdiv); +} + +static inline unsigned int v4l2_format_plane_size(const struct v4l2_format_info *info, int plane, + unsigned int width, unsigned int height) +{ + return v4l2_format_plane_width(info, plane, width) * + v4l2_format_plane_height(info, plane, height); +} + void v4l2_apply_frmsize_constraints(u32 *width, u32 *height, const struct v4l2_frmsize_stepwise *frmsize) { @@ -373,37 +400,19 @@ int v4l2_fill_pixfmt_mp(struct v4l2_pix_format_mplane *pixfmt, if (info->mem_planes == 1) { plane = &pixfmt->plane_fmt[0]; - plane->bytesperline = ALIGN(width, v4l2_format_block_width(info, 0)) * info->bpp[0]; + plane->bytesperline = v4l2_format_plane_width(info, 0, width); plane->sizeimage = 0; - for (i = 0; i < info->comp_planes; i++) { - unsigned int hdiv = (i == 0) ? 1 : info->hdiv; - unsigned int vdiv = (i == 0) ? 1 : info->vdiv; - unsigned int aligned_width; - unsigned int aligned_height; - - aligned_width = ALIGN(width, v4l2_format_block_width(info, i)); - aligned_height = ALIGN(height, v4l2_format_block_height(info, i)); - - plane->sizeimage += info->bpp[i] * - DIV_ROUND_UP(aligned_width, hdiv) * - DIV_ROUND_UP(aligned_height, vdiv); - } + for (i = 0; i < info->comp_planes; i++) + plane->sizeimage += + v4l2_format_plane_size(info, i, width, height); } else { for (i = 0; i < info->comp_planes; i++) { - unsigned int hdiv = (i == 0) ? 1 : info->hdiv; - unsigned int vdiv = (i == 0) ? 1 : info->vdiv; - unsigned int aligned_width; - unsigned int aligned_height; - - aligned_width = ALIGN(width, v4l2_format_block_width(info, i)); - aligned_height = ALIGN(height, v4l2_format_block_height(info, i)); - plane = &pixfmt->plane_fmt[i]; plane->bytesperline = - info->bpp[i] * DIV_ROUND_UP(aligned_width, hdiv); - plane->sizeimage = - plane->bytesperline * DIV_ROUND_UP(aligned_height, vdiv); + v4l2_format_plane_width(info, i, width); + plane->sizeimage = plane->bytesperline * + v4l2_format_plane_height(info, i, height); } } return 0; @@ -427,22 +436,12 @@ int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat, pixfmt->width = width; pixfmt->height = height; pixfmt->pixelformat = pixelformat; - pixfmt->bytesperline = ALIGN(width, v4l2_format_block_width(info, 0)) * info->bpp[0]; + pixfmt->bytesperline = v4l2_format_plane_width(info, 0, width); pixfmt->sizeimage = 0; - for (i = 0; i < info->comp_planes; i++) { - unsigned int hdiv = (i == 0) ? 1 : info->hdiv; - unsigned int vdiv = (i == 0) ? 1 : info->vdiv; - unsigned int aligned_width; - unsigned int aligned_height; - - aligned_width = ALIGN(width, v4l2_format_block_width(info, i)); - aligned_height = ALIGN(height, v4l2_format_block_height(info, i)); - - pixfmt->sizeimage += info->bpp[i] * - DIV_ROUND_UP(aligned_width, hdiv) * - DIV_ROUND_UP(aligned_height, vdiv); - } + for (i = 0; i < info->comp_planes; i++) + pixfmt->sizeimage += + v4l2_format_plane_size(info, i, width, height); return 0; } EXPORT_SYMBOL_GPL(v4l2_fill_pixfmt); From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Mon, 6 Jul 2020 21:54:36 +0000 Subject: [PATCH] media: v4l2: Add NV15 and NV20 pixel formats Add NV15 and NV20 pixel formats used by the Rockchip Video Decoder for 10-bit buffers. NV15 and NV20 is a packed 10-bit 4:2:0/4:2:2 semi-planar Y/UV format similar to P010 and P210 but has no padding between components. Instead, luminance and chrominance samples are grouped into 4s so that each group is packed into an integer number of bytes: YYYY = UVUV = 4 * 10 bits = 40 bits = 5 bytes The '15' and '20' suffix refers to the optimum effective bits per pixel which is achieved when the total number of luminance samples is a multiple of 8 for NV15 and 4 for NV20. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/media/v4l2-core/v4l2-common.c | 3 +++ drivers/media/v4l2-core/v4l2-ioctl.c | 2 ++ include/uapi/linux/videodev2.h | 3 +++ 3 files changed, 8 insertions(+) diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-core/v4l2-common.c index cb2f1acab7cf..8446a1deffd8 100644 --- a/drivers/media/v4l2-core/v4l2-common.c +++ b/drivers/media/v4l2-core/v4l2-common.c @@ -268,6 +268,9 @@ const struct v4l2_format_info *v4l2_format_info(u32 format) { .format = V4L2_PIX_FMT_NV42, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 1, .vdiv = 1 }, { .format = V4L2_PIX_FMT_P010, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 2, 2, 0, 0 }, .hdiv = 2, .vdiv = 1 }, + { .format = V4L2_PIX_FMT_NV15, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 5, 5, 0, 0 }, .hdiv = 2, .vdiv = 2, .block_w = { 4, 2, 0, 0 }, .block_h = { 1, 1, 0, 0 } }, + { .format = V4L2_PIX_FMT_NV20, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 5, 5, 0, 0 }, .hdiv = 2, .vdiv = 1, .block_w = { 4, 2, 0, 0 }, .block_h = { 1, 1, 0, 0 } }, + { .format = V4L2_PIX_FMT_YUV410, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 3, .bpp = { 1, 1, 1, 0 }, .hdiv = 4, .vdiv = 4 }, { .format = V4L2_PIX_FMT_YVU410, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 3, .bpp = { 1, 1, 1, 0 }, .hdiv = 4, .vdiv = 4 }, { .format = V4L2_PIX_FMT_YUV411P, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 3, .bpp = { 1, 1, 1, 0 }, .hdiv = 4, .vdiv = 1 }, diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c index e6fd355a2e92..24771edaa4f2 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -1354,6 +1354,8 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) case V4L2_PIX_FMT_NV24: descr = "Y/UV 4:4:4"; break; case V4L2_PIX_FMT_NV42: descr = "Y/VU 4:4:4"; break; case V4L2_PIX_FMT_P010: descr = "10-bit Y/UV 4:2:0"; break; + case V4L2_PIX_FMT_NV15: descr = "10-bit Y/UV 4:2:0 (Packed)"; break; + case V4L2_PIX_FMT_NV20: descr = "10-bit Y/UV 4:2:2 (Packed)"; break; case V4L2_PIX_FMT_NV12_4L4: descr = "Y/UV 4:2:0 (4x4 Linear)"; break; case V4L2_PIX_FMT_NV12_16L16: descr = "Y/UV 4:2:0 (16x16 Linear)"; break; case V4L2_PIX_FMT_NV12_32L32: descr = "Y/UV 4:2:0 (32x32 Linear)"; break; diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h index 01e630f2ec78..cea44992aea3 100644 --- a/include/uapi/linux/videodev2.h +++ b/include/uapi/linux/videodev2.h @@ -628,6 +628,9 @@ struct v4l2_pix_format { #define V4L2_PIX_FMT_NV42 v4l2_fourcc('N', 'V', '4', '2') /* 24 Y/VU 4:4:4 */ #define V4L2_PIX_FMT_P010 v4l2_fourcc('P', '0', '1', '0') /* 24 Y/UV 4:2:0 10-bit per component */ +#define V4L2_PIX_FMT_NV15 v4l2_fourcc('N', 'V', '1', '5') /* 15 Y/UV 4:2:0 10-bit packed */ +#define V4L2_PIX_FMT_NV20 v4l2_fourcc('N', 'V', '2', '0') /* 20 Y/UV 4:2:2 10-bit packed */ + /* two non contiguous planes - one Y, one Cr + Cb interleaved */ #define V4L2_PIX_FMT_NV12M v4l2_fourcc('N', 'M', '1', '2') /* 12 Y/UV 4:2:0 */ #define V4L2_PIX_FMT_NV21M v4l2_fourcc('N', 'M', '2', '1') /* 21 Y/VU 4:2:0 */ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Mon, 6 Jul 2020 21:54:36 +0000 Subject: [PATCH] media: rkvdec: h264: Use bytesperline and buffer height to calculate stride Use bytesperline and buffer height to calculate the strides configured. This does not really change anything other than ensuring the bytesperline that is signaled to userspace matches what is configured in HW. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/staging/media/rkvdec/rkvdec-h264.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/staging/media/rkvdec/rkvdec-h264.c b/drivers/staging/media/rkvdec/rkvdec-h264.c index 4fc167b42cf0..a8635105e387 100644 --- a/drivers/staging/media/rkvdec/rkvdec-h264.c +++ b/drivers/staging/media/rkvdec/rkvdec-h264.c @@ -896,9 +896,9 @@ static void config_registers(struct rkvdec_ctx *ctx, dma_addr_t rlc_addr; dma_addr_t refer_addr; u32 rlc_len; - u32 hor_virstride = 0; - u32 ver_virstride = 0; - u32 y_virstride = 0; + u32 hor_virstride; + u32 ver_virstride; + u32 y_virstride; u32 yuv_virstride = 0; u32 offset; dma_addr_t dst_addr; @@ -909,8 +909,8 @@ static void config_registers(struct rkvdec_ctx *ctx, f = &ctx->decoded_fmt; dst_fmt = &f->fmt.pix_mp; - hor_virstride = (sps->bit_depth_luma_minus8 + 8) * dst_fmt->width / 8; - ver_virstride = round_up(dst_fmt->height, 16); + hor_virstride = dst_fmt->plane_fmt[0].bytesperline; + ver_virstride = dst_fmt->height; y_virstride = hor_virstride * ver_virstride; if (sps->chroma_format_idc == 0) From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Mon, 6 Jul 2020 21:54:37 +0000 Subject: [PATCH] media: rkvdec: Extract rkvdec_fill_decoded_pixfmt helper method This extract setting decoded pixfmt into a helper method, current code is replaced with a call to the new helper method. The helper method is also called from a new function in next patch. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/staging/media/rkvdec/rkvdec.c | 29 ++++++++++++++------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c index 7bab7586918c..40cc791aef26 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c @@ -27,6 +27,17 @@ #include "rkvdec.h" #include "rkvdec-regs.h" +static void rkvdec_fill_decoded_pixfmt(struct rkvdec_ctx *ctx, + struct v4l2_pix_format_mplane *pix_mp) +{ + v4l2_fill_pixfmt_mp(pix_mp, pix_mp->pixelformat, + pix_mp->width, pix_mp->height); + pix_mp->plane_fmt[0].sizeimage += 128 * + DIV_ROUND_UP(pix_mp->width, 16) * + DIV_ROUND_UP(pix_mp->height, 16); + pix_mp->field = V4L2_FIELD_NONE; +} + static int rkvdec_try_ctrl(struct v4l2_ctrl *ctrl) { struct rkvdec_ctx *ctx = container_of(ctrl->handler, struct rkvdec_ctx, ctrl_hdl); @@ -192,13 +203,9 @@ static void rkvdec_reset_decoded_fmt(struct rkvdec_ctx *ctx) rkvdec_reset_fmt(ctx, f, ctx->coded_fmt_desc->decoded_fmts[0]); f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; - v4l2_fill_pixfmt_mp(&f->fmt.pix_mp, - ctx->coded_fmt_desc->decoded_fmts[0], - ctx->coded_fmt.fmt.pix_mp.width, - ctx->coded_fmt.fmt.pix_mp.height); - f->fmt.pix_mp.plane_fmt[0].sizeimage += 128 * - DIV_ROUND_UP(f->fmt.pix_mp.width, 16) * - DIV_ROUND_UP(f->fmt.pix_mp.height, 16); + f->fmt.pix_mp.width = ctx->coded_fmt.fmt.pix_mp.width; + f->fmt.pix_mp.height = ctx->coded_fmt.fmt.pix_mp.height; + rkvdec_fill_decoded_pixfmt(ctx, &f->fmt.pix_mp); } static int rkvdec_enum_framesizes(struct file *file, void *priv, @@ -264,13 +271,7 @@ static int rkvdec_try_capture_fmt(struct file *file, void *priv, &pix_mp->height, &coded_desc->frmsize); - v4l2_fill_pixfmt_mp(pix_mp, pix_mp->pixelformat, - pix_mp->width, pix_mp->height); - pix_mp->plane_fmt[0].sizeimage += - 128 * - DIV_ROUND_UP(pix_mp->width, 16) * - DIV_ROUND_UP(pix_mp->height, 16); - pix_mp->field = V4L2_FIELD_NONE; + rkvdec_fill_decoded_pixfmt(ctx, pix_mp); return 0; } From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Mon, 6 Jul 2020 21:54:37 +0000 Subject: [PATCH] media: rkvdec: Lock capture pixel format in s_ctrl and s_fmt Add an optional valid_fmt operation that should return the valid pixelformat of CAPTURE buffers. This is used in next patch to ensure correct pixelformat is used for 10-bit and 4:2:2 content. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/staging/media/rkvdec/rkvdec.c | 67 +++++++++++++++++++++++---- drivers/staging/media/rkvdec/rkvdec.h | 2 + 2 files changed, 61 insertions(+), 8 deletions(-) diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c index 40cc791aef26..e93e1cb0f829 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c @@ -38,19 +38,56 @@ static void rkvdec_fill_decoded_pixfmt(struct rkvdec_ctx *ctx, pix_mp->field = V4L2_FIELD_NONE; } +static u32 rkvdec_valid_fmt(struct rkvdec_ctx *ctx, struct v4l2_ctrl *ctrl) +{ + const struct rkvdec_coded_fmt_desc *coded_desc = ctx->coded_fmt_desc; + + if (coded_desc->ops->valid_fmt) + return coded_desc->ops->valid_fmt(ctx, ctrl); + + return ctx->valid_fmt; +} + static int rkvdec_try_ctrl(struct v4l2_ctrl *ctrl) { struct rkvdec_ctx *ctx = container_of(ctrl->handler, struct rkvdec_ctx, ctrl_hdl); const struct rkvdec_coded_fmt_desc *desc = ctx->coded_fmt_desc; - if (desc->ops->try_ctrl) - return desc->ops->try_ctrl(ctx, ctrl); + if (desc->ops->try_ctrl) { + int ret; + ret = desc->ops->try_ctrl(ctx, ctrl); + if (ret) + return ret; + } + + if (ctx->valid_fmt && ctx->valid_fmt != rkvdec_valid_fmt(ctx, ctrl)) + /* Only current valid format */ + return -EINVAL; + + return 0; +} + +static int rkvdec_s_ctrl(struct v4l2_ctrl *ctrl) +{ + struct rkvdec_ctx *ctx = container_of(ctrl->handler, struct rkvdec_ctx, ctrl_hdl); + + if (ctrl->id == V4L2_CID_STATELESS_H264_SPS && !ctx->valid_fmt) { + ctx->valid_fmt = rkvdec_valid_fmt(ctx, ctrl); + if (ctx->valid_fmt) { + struct v4l2_pix_format_mplane *pix_mp; + + pix_mp = &ctx->decoded_fmt.fmt.pix_mp; + pix_mp->pixelformat = ctx->valid_fmt; + rkvdec_fill_decoded_pixfmt(ctx, pix_mp); + } + } return 0; } static const struct v4l2_ctrl_ops rkvdec_ctrl_ops = { .try_ctrl = rkvdec_try_ctrl, + .s_ctrl = rkvdec_s_ctrl, }; static const struct rkvdec_ctrl_desc rkvdec_h264_ctrl_descs[] = { @@ -201,6 +238,7 @@ static void rkvdec_reset_decoded_fmt(struct rkvdec_ctx *ctx) { struct v4l2_format *f = &ctx->decoded_fmt; + ctx->valid_fmt = 0; rkvdec_reset_fmt(ctx, f, ctx->coded_fmt_desc->decoded_fmts[0]); f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; f->fmt.pix_mp.width = ctx->coded_fmt.fmt.pix_mp.width; @@ -256,13 +294,17 @@ static int rkvdec_try_capture_fmt(struct file *file, void *priv, if (WARN_ON(!coded_desc)) return -EINVAL; - for (i = 0; i < coded_desc->num_decoded_fmts; i++) { - if (coded_desc->decoded_fmts[i] == pix_mp->pixelformat) - break; - } + if (ctx->valid_fmt) { + pix_mp->pixelformat = ctx->valid_fmt; + } else { + for (i = 0; i < coded_desc->num_decoded_fmts; i++) { + if (coded_desc->decoded_fmts[i] == pix_mp->pixelformat) + break; + } - if (i == coded_desc->num_decoded_fmts) - pix_mp->pixelformat = coded_desc->decoded_fmts[0]; + if (i == coded_desc->num_decoded_fmts) + pix_mp->pixelformat = coded_desc->decoded_fmts[0]; + } /* Always apply the frmsize constraint of the coded end. */ pix_mp->width = max(pix_mp->width, ctx->coded_fmt.fmt.pix_mp.width); @@ -326,6 +368,7 @@ static int rkvdec_s_capture_fmt(struct file *file, void *priv, return ret; ctx->decoded_fmt = *f; + ctx->valid_fmt = f->fmt.pix_mp.pixelformat; return 0; } @@ -429,6 +472,14 @@ static int rkvdec_enum_capture_fmt(struct file *file, void *priv, if (WARN_ON(!ctx->coded_fmt_desc)) return -EINVAL; + if (ctx->valid_fmt) { + if (f->index) + return -EINVAL; + + f->pixelformat = ctx->valid_fmt; + return 0; + } + if (f->index >= ctx->coded_fmt_desc->num_decoded_fmts) return -EINVAL; diff --git a/drivers/staging/media/rkvdec/rkvdec.h b/drivers/staging/media/rkvdec/rkvdec.h index 633335ebb9c4..b9e219438bc9 100644 --- a/drivers/staging/media/rkvdec/rkvdec.h +++ b/drivers/staging/media/rkvdec/rkvdec.h @@ -66,6 +66,7 @@ vb2_to_rkvdec_decoded_buf(struct vb2_buffer *buf) struct rkvdec_coded_fmt_ops { int (*adjust_fmt)(struct rkvdec_ctx *ctx, struct v4l2_format *f); + u32 (*valid_fmt)(struct rkvdec_ctx *ctx, struct v4l2_ctrl *ctrl); int (*start)(struct rkvdec_ctx *ctx); void (*stop)(struct rkvdec_ctx *ctx); int (*run)(struct rkvdec_ctx *ctx); @@ -101,6 +102,7 @@ struct rkvdec_ctx { struct v4l2_fh fh; struct v4l2_format coded_fmt; struct v4l2_format decoded_fmt; + u32 valid_fmt; const struct rkvdec_coded_fmt_desc *coded_fmt_desc; struct v4l2_ctrl_handler ctrl_hdl; struct rkvdec_dev *dev; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Mon, 6 Jul 2020 21:54:37 +0000 Subject: [PATCH] media: rkvdec: h264: Support High 10 and 4:2:2 profiles Add support and enable decoding of H264 High 10 and 4:2:2 profiles. Decoded CAPTURE buffer width is aligned to 64 pixels to accommodate HW requirement on 10-bit format buffers. The new valid_fmt operation is implemented and return a valid pixelformat for the provided SPS control. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/staging/media/rkvdec/rkvdec-h264.c | 33 ++++++++++++++++------ drivers/staging/media/rkvdec/rkvdec.c | 19 +++++++++---- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/drivers/staging/media/rkvdec/rkvdec-h264.c b/drivers/staging/media/rkvdec/rkvdec-h264.c index a8635105e387..0069d3d198db 100644 --- a/drivers/staging/media/rkvdec/rkvdec-h264.c +++ b/drivers/staging/media/rkvdec/rkvdec-h264.c @@ -1031,19 +1031,14 @@ static int rkvdec_h264_validate_sps(struct rkvdec_ctx *ctx, { unsigned int width, height; - /* - * TODO: The hardware supports 10-bit and 4:2:2 profiles, - * but it's currently broken in the driver. - * Reject them for now, until it's fixed. - */ - if (sps->chroma_format_idc > 1) - /* Only 4:0:0 and 4:2:0 are supported */ + if (sps->chroma_format_idc > 2) + /* Only 4:0:0, 4:2:0 and 4:2:2 are supported */ return -EINVAL; if (sps->bit_depth_luma_minus8 != sps->bit_depth_chroma_minus8) /* Luma and chroma bit depth mismatch */ return -EINVAL; - if (sps->bit_depth_luma_minus8 != 0) - /* Only 8-bit is supported */ + if (sps->bit_depth_luma_minus8 != 0 && sps->bit_depth_luma_minus8 != 2) + /* Only 8-bit and 10-bit is supported */ return -EINVAL; width = (sps->pic_width_in_mbs_minus1 + 1) * 16; @@ -1064,6 +1059,25 @@ static int rkvdec_h264_validate_sps(struct rkvdec_ctx *ctx, return 0; } +static u32 rkvdec_h264_valid_fmt(struct rkvdec_ctx *ctx, struct v4l2_ctrl *ctrl) +{ + const struct v4l2_ctrl_h264_sps *sps = ctrl->p_new.p_h264_sps; + + if (sps->bit_depth_luma_minus8 == 0) { + if (sps->chroma_format_idc == 2) + return V4L2_PIX_FMT_NV16; + else + return V4L2_PIX_FMT_NV12; + } else if (sps->bit_depth_luma_minus8 == 2) { + if (sps->chroma_format_idc == 2) + return V4L2_PIX_FMT_NV20; + else + return V4L2_PIX_FMT_NV15; + } + + return 0; +} + static int rkvdec_h264_start(struct rkvdec_ctx *ctx) { struct rkvdec_dev *rkvdec = ctx->dev; @@ -1185,6 +1199,7 @@ static int rkvdec_h264_try_ctrl(struct rkvdec_ctx *ctx, struct v4l2_ctrl *ctrl) const struct rkvdec_coded_fmt_ops rkvdec_h264_fmt_ops = { .adjust_fmt = rkvdec_h264_adjust_fmt, + .valid_fmt = rkvdec_h264_valid_fmt, .start = rkvdec_h264_start, .stop = rkvdec_h264_stop, .run = rkvdec_h264_run, diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c index e93e1cb0f829..4f5436c89e08 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c @@ -31,7 +31,7 @@ static void rkvdec_fill_decoded_pixfmt(struct rkvdec_ctx *ctx, struct v4l2_pix_format_mplane *pix_mp) { v4l2_fill_pixfmt_mp(pix_mp, pix_mp->pixelformat, - pix_mp->width, pix_mp->height); + ALIGN(pix_mp->width, 64), pix_mp->height); pix_mp->plane_fmt[0].sizeimage += 128 * DIV_ROUND_UP(pix_mp->width, 16) * DIV_ROUND_UP(pix_mp->height, 16); @@ -136,8 +136,11 @@ static const struct rkvdec_ctrls rkvdec_h264_ctrls = { .num_ctrls = ARRAY_SIZE(rkvdec_h264_ctrl_descs), }; -static const u32 rkvdec_h264_vp9_decoded_fmts[] = { +static const u32 rkvdec_h264_decoded_fmts[] = { V4L2_PIX_FMT_NV12, + V4L2_PIX_FMT_NV15, + V4L2_PIX_FMT_NV16, + V4L2_PIX_FMT_NV20, }; static const struct rkvdec_ctrl_desc rkvdec_vp9_ctrl_descs[] = { @@ -160,6 +163,10 @@ static const struct rkvdec_ctrls rkvdec_vp9_ctrls = { .num_ctrls = ARRAY_SIZE(rkvdec_vp9_ctrl_descs), }; +static const u32 rkvdec_vp9_decoded_fmts[] = { + V4L2_PIX_FMT_NV12, +}; + static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = { { .fourcc = V4L2_PIX_FMT_H264_SLICE, @@ -173,8 +180,8 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = { }, .ctrls = &rkvdec_h264_ctrls, .ops = &rkvdec_h264_fmt_ops, - .num_decoded_fmts = ARRAY_SIZE(rkvdec_h264_vp9_decoded_fmts), - .decoded_fmts = rkvdec_h264_vp9_decoded_fmts, + .num_decoded_fmts = ARRAY_SIZE(rkvdec_h264_decoded_fmts), + .decoded_fmts = rkvdec_h264_decoded_fmts, .subsystem_flags = VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF, }, { @@ -189,8 +196,8 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = { }, .ctrls = &rkvdec_vp9_ctrls, .ops = &rkvdec_vp9_fmt_ops, - .num_decoded_fmts = ARRAY_SIZE(rkvdec_h264_vp9_decoded_fmts), - .decoded_fmts = rkvdec_h264_vp9_decoded_fmts, + .num_decoded_fmts = ARRAY_SIZE(rkvdec_vp9_decoded_fmts), + .decoded_fmts = rkvdec_vp9_decoded_fmts, } }; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Sun, 27 Mar 2022 14:18:07 +0200 Subject: [PATCH] media: rkvdec-h264: Don't hardcode SPS/PPS parameters Some SPS/PPS parameters are currently hardcoded in the driver even though so do exist in the uapi which is stable by now. Use them instead of hardcoding them. Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/staging/media/rkvdec/rkvdec-h264.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/staging/media/rkvdec/rkvdec-h264.c b/drivers/staging/media/rkvdec/rkvdec-h264.c index 0069d3d198db..2c27acaba85e 100644 --- a/drivers/staging/media/rkvdec/rkvdec-h264.c +++ b/drivers/staging/media/rkvdec/rkvdec-h264.c @@ -655,13 +655,14 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx, #define WRITE_PPS(value, field) set_ps_field(hw_ps->info, field, value) /* write sps */ - WRITE_PPS(0xf, SEQ_PARAMETER_SET_ID); - WRITE_PPS(0xff, PROFILE_IDC); - WRITE_PPS(1, CONSTRAINT_SET3_FLAG); + WRITE_PPS(sps->seq_parameter_set_id, SEQ_PARAMETER_SET_ID); + WRITE_PPS(sps->profile_idc, PROFILE_IDC); + WRITE_PPS((sps->constraint_set_flags & 1 << 3) ? 1 : 0, CONSTRAINT_SET3_FLAG); WRITE_PPS(sps->chroma_format_idc, CHROMA_FORMAT_IDC); WRITE_PPS(sps->bit_depth_luma_minus8, BIT_DEPTH_LUMA); WRITE_PPS(sps->bit_depth_chroma_minus8, BIT_DEPTH_CHROMA); - WRITE_PPS(0, QPPRIME_Y_ZERO_TRANSFORM_BYPASS_FLAG); + WRITE_PPS(!!(sps->flags & V4L2_H264_SPS_FLAG_QPPRIME_Y_ZERO_TRANSFORM_BYPASS), + QPPRIME_Y_ZERO_TRANSFORM_BYPASS_FLAG); WRITE_PPS(sps->log2_max_frame_num_minus4, LOG2_MAX_FRAME_NUM_MINUS4); WRITE_PPS(sps->max_num_ref_frames, MAX_NUM_REF_FRAMES); WRITE_PPS(sps->pic_order_cnt_type, PIC_ORDER_CNT_TYPE); @@ -688,8 +689,8 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx, DIRECT_8X8_INFERENCE_FLAG); /* write pps */ - WRITE_PPS(0xff, PIC_PARAMETER_SET_ID); - WRITE_PPS(0x1f, PPS_SEQ_PARAMETER_SET_ID); + WRITE_PPS(pps->pic_parameter_set_id, PIC_PARAMETER_SET_ID); + WRITE_PPS(pps->seq_parameter_set_id, PPS_SEQ_PARAMETER_SET_ID); WRITE_PPS(!!(pps->flags & V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE), ENTROPY_CODING_MODE_FLAG); WRITE_PPS(!!(pps->flags & V4L2_H264_PPS_FLAG_BOTTOM_FIELD_PIC_ORDER_IN_FRAME_PRESENT), ================================================ FILE: projects/Rockchip/patches/linux/default/linux-0020-drm-from-list.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Mon, 6 Jul 2020 22:30:13 +0000 Subject: [PATCH] drm: drm_fourcc: add NV20 and NV30 YUV formats DRM_FORMAT_NV20 and DRM_FORMAT_NV30 formats is the 2x1 and non-subsampled variant of NV15, a 10-bit 2-plane YUV format that has no padding between components. Instead, luminance and chrominance samples are grouped into 4s so that each group is packed into an integer number of bytes: YYYY = UVUV = 4 * 10 bits = 40 bits = 5 bytes The '20' and '30' suffix refers to the optimum effective bits per pixel which is achieved when the total number of luminance samples is a multiple of 4. V2: Added NV30 format Signed-off-by: Jonas Karlman <jonas@kwiboo.se> Reviewed-by: Sandy Huang <hjc@rock-chips.com> --- drivers/gpu/drm/drm_fourcc.c | 8 ++++++++ include/uapi/drm/drm_fourcc.h | 2 ++ 2 files changed, 10 insertions(+) diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c index 07741b678798..5ec38456dc5d 100644 --- a/drivers/gpu/drm/drm_fourcc.c +++ b/drivers/gpu/drm/drm_fourcc.c @@ -261,6 +261,14 @@ const struct drm_format_info *__drm_format_info(u32 format) .num_planes = 2, .char_per_block = { 5, 5, 0 }, .block_w = { 4, 2, 0 }, .block_h = { 1, 1, 0 }, .hsub = 2, .vsub = 2, .is_yuv = true }, + { .format = DRM_FORMAT_NV20, .depth = 0, + .num_planes = 2, .char_per_block = { 5, 5, 0 }, + .block_w = { 4, 2, 0 }, .block_h = { 1, 1, 0 }, .hsub = 2, + .vsub = 1, .is_yuv = true }, + { .format = DRM_FORMAT_NV30, .depth = 0, + .num_planes = 2, .char_per_block = { 5, 5, 0 }, + .block_w = { 4, 2, 0 }, .block_h = { 1, 1, 0 }, .hsub = 1, + .vsub = 1, .is_yuv = true }, { .format = DRM_FORMAT_Q410, .depth = 0, .num_planes = 3, .char_per_block = { 2, 2, 2 }, .block_w = { 1, 1, 1 }, .block_h = { 1, 1, 1 }, .hsub = 0, diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h index 0206f812c569..fa49ee98f275 100644 --- a/include/uapi/drm/drm_fourcc.h +++ b/include/uapi/drm/drm_fourcc.h @@ -285,6 +285,8 @@ extern "C" { * index 1 = Cr:Cb plane, [39:0] Cr1:Cb1:Cr0:Cb0 little endian */ #define DRM_FORMAT_NV15 fourcc_code('N', 'V', '1', '5') /* 2x2 subsampled Cr:Cb plane */ +#define DRM_FORMAT_NV20 fourcc_code('N', 'V', '2', '0') /* 2x1 subsampled Cr:Cb plane */ +#define DRM_FORMAT_NV30 fourcc_code('N', 'V', '3', '0') /* non-subsampled Cr:Cb plane */ /* * 2 plane YCbCr MSB aligned From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Mon, 6 Jul 2020 22:30:13 +0000 Subject: [PATCH] drm: rockchip: add NV15, NV20 and NV30 support Add support for displaying 10-bit 4:2:0 and 4:2:2 formats produced by the Rockchip Video Decoder on RK322X, RK3288, RK3328, RK3368 and RK3399. Also add support for 10-bit 4:4:4 format while at it. V2: Added NV30 support Signed-off-by: Jonas Karlman <jonas@kwiboo.se> Reviewed-by: Sandy Huang <hjc@rock-chips.com> --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 29 +++++++++++++++++-- drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 1 + drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 32 +++++++++++++++++---- 3 files changed, 54 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index d32117633efe..9e71263ac770 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -280,6 +280,18 @@ static bool has_uv_swapped(uint32_t format) } } +static bool is_fmt_10(uint32_t format) +{ + switch (format) { + case DRM_FORMAT_NV15: + case DRM_FORMAT_NV20: + case DRM_FORMAT_NV30: + return true; + default: + return false; + } +} + static enum vop_data_format vop_convert_format(uint32_t format) { switch (format) { @@ -295,12 +307,15 @@ static enum vop_data_format vop_convert_format(uint32_t format) case DRM_FORMAT_BGR565: return VOP_FMT_RGB565; case DRM_FORMAT_NV12: + case DRM_FORMAT_NV15: case DRM_FORMAT_NV21: return VOP_FMT_YUV420SP; case DRM_FORMAT_NV16: + case DRM_FORMAT_NV20: case DRM_FORMAT_NV61: return VOP_FMT_YUV422SP; case DRM_FORMAT_NV24: + case DRM_FORMAT_NV30: case DRM_FORMAT_NV42: return VOP_FMT_YUV444SP; default: @@ -954,7 +969,12 @@ static void vop_plane_atomic_update(struct drm_plane *plane, dsp_sty = dest->y1 + crtc->mode.vtotal - crtc->mode.vsync_start; dsp_st = dsp_sty << 16 | (dsp_stx & 0xffff); - offset = (src->x1 >> 16) * fb->format->cpp[0]; + if (fb->format->block_w[0]) + offset = (src->x1 >> 16) * fb->format->char_per_block[0] / + fb->format->block_w[0]; + else + offset = (src->x1 >> 16) * fb->format->cpp[0]; + offset += (src->y1 >> 16) * fb->pitches[0]; dma_addr = rk_obj->dma_addr + offset + fb->offsets[0]; @@ -980,6 +1000,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane, } VOP_WIN_SET(vop, win, format, format); + VOP_WIN_SET(vop, win, fmt_10, is_fmt_10(fb->format->format)); VOP_WIN_SET(vop, win, yrgb_vir, DIV_ROUND_UP(fb->pitches[0], 4)); VOP_WIN_SET(vop, win, yrgb_mst, dma_addr); VOP_WIN_YUV2YUV_SET(vop, win_yuv2yuv, y2r_en, is_yuv); @@ -996,7 +1017,11 @@ static void vop_plane_atomic_update(struct drm_plane *plane, uv_obj = fb->obj[1]; rk_uv_obj = to_rockchip_obj(uv_obj); - offset = (src->x1 >> 16) * bpp / hsub; + if (fb->format->block_w[1]) + offset = (src->x1 >> 16) * bpp / + fb->format->block_w[1] / hsub; + else + offset = (src->x1 >> 16) * bpp / hsub; offset += (src->y1 >> 16) * fb->pitches[1] / vsub; dma_addr = rk_uv_obj->dma_addr + offset + fb->offsets[1]; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h index 8502849833d9..b6eea31109d5 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h @@ -181,6 +181,7 @@ struct vop_win_phy { struct vop_reg enable; struct vop_reg gate; struct vop_reg format; + struct vop_reg fmt_10; struct vop_reg rb_swap; struct vop_reg uv_swap; struct vop_reg act_info; diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c index 014f99e8928e..16e6aa01e400 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c @@ -53,6 +53,23 @@ static const uint32_t formats_win_full[] = { DRM_FORMAT_NV42, }; +static const uint32_t formats_win_full_10[] = { + DRM_FORMAT_XRGB8888, + DRM_FORMAT_ARGB8888, + DRM_FORMAT_XBGR8888, + DRM_FORMAT_ABGR8888, + DRM_FORMAT_RGB888, + DRM_FORMAT_BGR888, + DRM_FORMAT_RGB565, + DRM_FORMAT_BGR565, + DRM_FORMAT_NV12, + DRM_FORMAT_NV16, + DRM_FORMAT_NV24, + DRM_FORMAT_NV15, + DRM_FORMAT_NV20, + DRM_FORMAT_NV30, +}; + static const uint64_t format_modifiers_win_full[] = { DRM_FORMAT_MOD_LINEAR, DRM_FORMAT_MOD_INVALID, @@ -621,11 +638,12 @@ static const struct vop_scl_regs rk3288_win_full_scl = { static const struct vop_win_phy rk3288_win01_data = { .scl = &rk3288_win_full_scl, - .data_formats = formats_win_full, - .nformats = ARRAY_SIZE(formats_win_full), + .data_formats = formats_win_full_10, + .nformats = ARRAY_SIZE(formats_win_full_10), .format_modifiers = format_modifiers_win_full, .enable = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 0), .format = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 1), + .fmt_10 = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 4), .rb_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 12), .uv_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 15), .act_info = VOP_REG(RK3288_WIN0_ACT_INFO, 0x1fff1fff, 0), @@ -756,11 +774,12 @@ static const struct vop_intr rk3368_vop_intr = { static const struct vop_win_phy rk3368_win01_data = { .scl = &rk3288_win_full_scl, - .data_formats = formats_win_full, - .nformats = ARRAY_SIZE(formats_win_full), + .data_formats = formats_win_full_10, + .nformats = ARRAY_SIZE(formats_win_full_10), .format_modifiers = format_modifiers_win_full, .enable = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 0), .format = VOP_REG(RK3368_WIN0_CTRL0, 0x7, 1), + .fmt_10 = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 4), .rb_swap = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 12), .uv_swap = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 15), .x_mir_en = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 21), @@ -924,11 +943,12 @@ static const struct vop_win_yuv2yuv_data rk3399_vop_big_win_yuv2yuv_data[] = { static const struct vop_win_phy rk3399_win01_data = { .scl = &rk3288_win_full_scl, - .data_formats = formats_win_full, - .nformats = ARRAY_SIZE(formats_win_full), + .data_formats = formats_win_full_10, + .nformats = ARRAY_SIZE(formats_win_full_10), .format_modifiers = format_modifiers_win_full_afbc, .enable = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 0), .format = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 1), + .fmt_10 = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 4), .rb_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 12), .uv_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 15), .x_mir_en = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 21), ================================================ FILE: projects/Rockchip/patches/linux/default/linux-1000-drm-rockchip.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sun, 3 May 2020 16:51:31 +0000 Subject: [PATCH] drm/rockchip: vop: filter modes outside 0.5% pixel clock tolerance Filter modes that require a pixel clock that differ more then 0.5% from the requested pixel clock. This filter is only applied to tmds only connector and/or encoders. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 54 +++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index dbe4d411b30f..fac23d370ee0 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -1206,6 +1206,59 @@ static void vop_crtc_disable_vblank(struct drm_crtc *crtc) spin_unlock_irqrestore(&vop->irq_lock, flags); } +static bool vop_crtc_is_tmds(struct drm_crtc *crtc) +{ + struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state); + struct drm_encoder *encoder; + + switch (s->output_type) { + case DRM_MODE_CONNECTOR_LVDS: + case DRM_MODE_CONNECTOR_DSI: + return false; + case DRM_MODE_CONNECTOR_eDP: + case DRM_MODE_CONNECTOR_HDMIA: + case DRM_MODE_CONNECTOR_DisplayPort: + return true; + } + + drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) + if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS) + return true; + + return false; +} + +/* + * The VESA DMT standard specifies a 0.5% pixel clock frequency tolerance. + * The CVT spec reuses that tolerance in its examples. + */ +#define CLOCK_TOLERANCE_PER_MILLE 5 + +static enum drm_mode_status vop_crtc_mode_valid(struct drm_crtc *crtc, + const struct drm_display_mode *mode) +{ + struct vop *vop = to_vop(crtc); + long rounded_rate; + long lowest, highest; + + if (!vop_crtc_is_tmds(crtc)) + return MODE_OK; + + rounded_rate = clk_round_rate(vop->dclk, mode->clock * 1000 + 999); + if (rounded_rate < 0) + return MODE_NOCLOCK; + + lowest = mode->clock * (1000 - CLOCK_TOLERANCE_PER_MILLE); + if (rounded_rate < lowest) + return MODE_CLOCK_LOW; + + highest = mode->clock * (1000 + CLOCK_TOLERANCE_PER_MILLE); + if (rounded_rate > highest) + return MODE_CLOCK_HIGH; + + return MODE_OK; +} + static bool vop_crtc_mode_fixup(struct drm_crtc *crtc, const struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode) @@ -1617,6 +1670,7 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc, } static const struct drm_crtc_helper_funcs vop_crtc_helper_funcs = { + .mode_valid = vop_crtc_mode_valid, .mode_fixup = vop_crtc_mode_fixup, .atomic_check = vop_crtc_atomic_check, .atomic_begin = vop_crtc_atomic_begin, From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Mon, 20 Jul 2020 15:15:50 +0000 Subject: [PATCH] drm/rockchip: vop: filter interlaced modes The current version of the driver does not support interlaced modes, lets filter any interlaced mode. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index fac23d370ee0..9f7326c5b1f5 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -1244,6 +1244,9 @@ static enum drm_mode_status vop_crtc_mode_valid(struct drm_crtc *crtc, if (!vop_crtc_is_tmds(crtc)) return MODE_OK; + if (mode->flags & DRM_MODE_FLAG_INTERLACE) + return MODE_NO_INTERLACE; + rounded_rate = clk_round_rate(vop->dclk, mode->clock * 1000 + 999); if (rounded_rate < 0) return MODE_NOCLOCK; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sat, 10 Oct 2020 14:57:30 +0000 Subject: [PATCH] drm/rockchip: vop: define max output resolution supported Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 6 ++++++ drivers/gpu/drm/rockchip/rockchip_drm_vop2.h | 5 ----- drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 7 +++++++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h index b6eea31109d5..ca4e2b7415fe 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h @@ -214,6 +214,11 @@ struct vop_win_data { enum drm_plane_type type; }; +struct vop_rect { + int width; + int height; +}; + struct vop_data { uint32_t version; const struct vop_intr *intr; @@ -226,6 +231,7 @@ struct vop_data { const struct vop_win_data *win; unsigned int win_size; unsigned int lut_size; + struct vop_rect max_output; #define VOP_FEATURE_OUTPUT_RGB10 BIT(0) #define VOP_FEATURE_INTERNAL_RGB BIT(1) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h index c727093a06d6..f1234a151130 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h @@ -27,11 +27,6 @@ enum win_dly_mode { VOP2_DLY_MODE_MAX, }; -struct vop_rect { - int width; - int height; -}; - enum vop2_scale_up_mode { VOP2_SCALE_UP_NRST_NBOR, VOP2_SCALE_UP_BIL, diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c index 16e6aa01e400..9b25b8ffd0ce 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c @@ -743,6 +743,7 @@ static const struct vop_intr rk3288_vop_intr = { static const struct vop_data rk3288_vop = { .version = VOP_VERSION(3, 1), .feature = VOP_FEATURE_OUTPUT_RGB10, + .max_output = { 3840, 2160 }, .intr = &rk3288_vop_intr, .common = &rk3288_common, .modeset = &rk3288_modeset, @@ -845,6 +846,7 @@ static const struct vop_misc rk3368_misc = { static const struct vop_data rk3368_vop = { .version = VOP_VERSION(3, 2), + .max_output = { 4096, 2160 }, .intr = &rk3368_vop_intr, .common = &rk3288_common, .modeset = &rk3288_modeset, @@ -866,6 +868,7 @@ static const struct vop_intr rk3366_vop_intr = { static const struct vop_data rk3366_vop = { .version = VOP_VERSION(3, 4), + .max_output = { 4096, 2160 }, .intr = &rk3366_vop_intr, .common = &rk3288_common, .modeset = &rk3288_modeset, @@ -994,6 +997,7 @@ static const struct vop_afbc rk3399_vop_afbc = { static const struct vop_data rk3399_vop_big = { .version = VOP_VERSION(3, 5), .feature = VOP_FEATURE_OUTPUT_RGB10, + .max_output = { 4096, 2160 }, .intr = &rk3366_vop_intr, .common = &rk3399_common, .modeset = &rk3288_modeset, @@ -1021,6 +1025,7 @@ static const struct vop_win_yuv2yuv_data rk3399_vop_lit_win_yuv2yuv_data[] = { static const struct vop_data rk3399_vop_lit = { .version = VOP_VERSION(3, 6), + .max_output = { 2560, 1600 }, .intr = &rk3366_vop_intr, .common = &rk3399_common, .modeset = &rk3288_modeset, @@ -1042,6 +1047,7 @@ static const struct vop_win_data rk3228_vop_win_data[] = { static const struct vop_data rk3228_vop = { .version = VOP_VERSION(3, 7), .feature = VOP_FEATURE_OUTPUT_RGB10, + .max_output = { 4096, 2160 }, .intr = &rk3366_vop_intr, .common = &rk3288_common, .modeset = &rk3288_modeset, @@ -1113,6 +1119,7 @@ static const struct vop_win_data rk3328_vop_win_data[] = { static const struct vop_data rk3328_vop = { .version = VOP_VERSION(3, 8), .feature = VOP_FEATURE_OUTPUT_RGB10, + .max_output = { 4096, 2160 }, .intr = &rk3328_vop_intr, .common = &rk3328_common, .modeset = &rk3328_modeset, From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Mon, 20 Jul 2020 11:46:16 +0000 Subject: [PATCH] drm/rockchip: vop: filter modes above max output supported Filter any mode with a resolution not supported by the VOP. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 48 +++++++++++++++------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 9f7326c5b1f5..30e252ba7184 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -1228,6 +1228,24 @@ static bool vop_crtc_is_tmds(struct drm_crtc *crtc) return false; } +static enum drm_mode_status vop_crtc_size_valid(struct drm_crtc *crtc, + const struct drm_display_mode *mode) +{ + struct vop *vop = to_vop(crtc); + const struct vop_rect *max_output = &vop->data->max_output; + + if (max_output->width && max_output->height) { + /* only the size of the resulting rect matters */ + if(drm_mode_validate_size(mode, max_output->width, + max_output->height) != MODE_OK) { + return drm_mode_validate_size(mode, max_output->height, + max_output->width); + } + } + + return MODE_OK; +} + /* * The VESA DMT standard specifies a 0.5% pixel clock frequency tolerance. * The CVT spec reuses that tolerance in its examples. @@ -1241,25 +1259,24 @@ static enum drm_mode_status vop_crtc_mode_valid(struct drm_crtc *crtc, long rounded_rate; long lowest, highest; - if (!vop_crtc_is_tmds(crtc)) - return MODE_OK; - if (mode->flags & DRM_MODE_FLAG_INTERLACE) - return MODE_NO_INTERLACE; + return MODE_NO_INTERLACE; - rounded_rate = clk_round_rate(vop->dclk, mode->clock * 1000 + 999); - if (rounded_rate < 0) - return MODE_NOCLOCK; + if (vop_crtc_is_tmds(crtc)) { + rounded_rate = clk_round_rate(vop->dclk, mode->clock * 1000 + 999); + if (rounded_rate < 0) + return MODE_NOCLOCK; - lowest = mode->clock * (1000 - CLOCK_TOLERANCE_PER_MILLE); - if (rounded_rate < lowest) - return MODE_CLOCK_LOW; + lowest = mode->clock * (1000 - CLOCK_TOLERANCE_PER_MILLE); + if (rounded_rate < lowest) + return MODE_CLOCK_LOW; - highest = mode->clock * (1000 + CLOCK_TOLERANCE_PER_MILLE); - if (rounded_rate > highest) - return MODE_CLOCK_HIGH; + highest = mode->clock * (1000 + CLOCK_TOLERANCE_PER_MILLE); + if (rounded_rate > highest) + return MODE_CLOCK_HIGH; + } - return MODE_OK; + return vop_crtc_size_valid(crtc, mode); } static bool vop_crtc_mode_fixup(struct drm_crtc *crtc, @@ -1269,6 +1286,9 @@ static bool vop_crtc_mode_fixup(struct drm_crtc *crtc, struct vop *vop = to_vop(crtc); unsigned long rate; + if (vop_crtc_size_valid(crtc, adjusted_mode) != MODE_OK) + return false; + /* * Clock craziness. * From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Yakir Yang <ykk@rock-chips.com> Date: Mon, 11 Jul 2016 19:05:39 +0800 Subject: [PATCH] drm/rockchip: dw_hdmi: adjust cklvl & txlvl for RF/EMI Dut to the high HDMI signal voltage driver, Mickey have meet a serious RF/EMI problem, so we decided to reduce HDMI signal voltage to a proper value. The default params for phy is cklvl = 20 & txlvl = 13 (RF/EMI failed) ck: lvl = 13, term=100, vlo = 2.71, vhi=3.14, vswing = 0.43 tx: lvl = 20, term=100, vlo = 2.81, vhi=3.16, vswing = 0.35 1. We decided to reduce voltage value to lower, but VSwing still keep high, RF/EMI have been improved but still failed. ck: lvl = 6, term=100, vlo = 2.61, vhi=3.11, vswing = 0.50 tx: lvl = 6, term=100, vlo = 2.61, vhi=3.11, vswing = 0.50 2. We try to keep voltage value and vswing both lower, then RF/EMI test all passed ;) ck: lvl = 11, term= 66, vlo = 2.68, vhi=3.09, vswing = 0.40 tx: lvl = 11, term= 66, vlo = 2.68, vhi=3.09, vswing = 0.40 When we back to run HDMI different test and single-end test, we see different test passed, but signle-end test failed. The oscilloscope show that simgle-end clock's VL value is 1.78v (which remind LowLimit should not lower then 2.6v). 3. That's to say there are some different between PHY document and measure value. And according to experiment 2 results, we need to higher clock voltage and lower data voltage, then we can keep RF/EMI satisfied and single-end & differen test passed. ck: lvl = 9, term=100, vlo = 2.65, vhi=3.12, vswing = 0.47 tx: lvl = 16, term=100, vlo = 2.75, vhi=3.15, vswing = 0.39 Signed-off-by: Yakir Yang <ykk@rock-chips.com> Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index c14f88893868..4411ca8fd7ed 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -193,7 +193,7 @@ static const struct dw_hdmi_curr_ctrl rockchip_cur_ctr[] = { static const struct dw_hdmi_phy_config rockchip_phy_config[] = { /*pixelclk symbol term vlev*/ { 74250000, 0x8009, 0x0004, 0x0272}, - { 148500000, 0x802b, 0x0004, 0x028d}, + { 165000000, 0x802b, 0x0004, 0x0209}, { 297000000, 0x8039, 0x0005, 0x028d}, { ~0UL, 0x0000, 0x0000, 0x0000} }; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Nickey Yang <nickey.yang@rock-chips.com> Date: Mon, 13 Feb 2017 15:40:29 +0800 Subject: [PATCH] drm/rockchip: dw_hdmi: add phy_config for 594Mhz pixel clock Add phy_config for 594Mhz pixel clock used for 4K@60hz Signed-off-by: Nickey Yang <nickey.yang@rock-chips.com> Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 4411ca8fd7ed..bec381cde0bc 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -195,6 +195,7 @@ static const struct dw_hdmi_phy_config rockchip_phy_config[] = { { 74250000, 0x8009, 0x0004, 0x0272}, { 165000000, 0x802b, 0x0004, 0x0209}, { 297000000, 0x8039, 0x0005, 0x028d}, + { 594000000, 0x8039, 0x0000, 0x019d}, { ~0UL, 0x0000, 0x0000, 0x0000} }; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Douglas Anderson <dianders@chromium.org> Date: Mon, 11 Jul 2016 19:05:36 +0800 Subject: [PATCH] drm/rockchip: dw_hdmi: Set cur_ctr to 0 always Jitter was improved by lowering the MPLL bandwidth to account for high frequency noise in the rk3288 PLL. In each case MPLL bandwidth was lowered only enough to get us a comfortable margin. We believe that lowering the bandwidth like this is safe given sufficient testing. Signed-off-by: Douglas Anderson <dianders@chromium.org> Signed-off-by: Yakir Yang <ykk@rock-chips.com> Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index bec381cde0bc..72c1d65c7b75 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -172,20 +172,8 @@ static const struct dw_hdmi_mpll_config rockchip_mpll_cfg[] = { static const struct dw_hdmi_curr_ctrl rockchip_cur_ctr[] = { /* pixelclk bpp8 bpp10 bpp12 */ { - 40000000, { 0x0018, 0x0018, 0x0018 }, - }, { - 65000000, { 0x0028, 0x0028, 0x0028 }, - }, { - 66000000, { 0x0038, 0x0038, 0x0038 }, - }, { - 74250000, { 0x0028, 0x0038, 0x0038 }, - }, { - 83500000, { 0x0028, 0x0038, 0x0038 }, - }, { - 146250000, { 0x0038, 0x0038, 0x0038 }, - }, { - 148500000, { 0x0000, 0x0038, 0x0038 }, - }, { + 600000000, { 0x0000, 0x0000, 0x0000 }, + }, { ~0UL, { 0x0000, 0x0000, 0x0000}, } }; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Douglas Anderson <dianders@chromium.org> Date: Mon, 11 Jul 2016 19:05:42 +0800 Subject: [PATCH] drm/rockchip: dw_hdmi: Use auto-generated tables The previous tables for mpll_cfg and curr_ctrl were created using the 20-pages of example settings provided by the PHY vendor. Those example settings weren't particularly dense, so there were places where we were guessing what the settings would be for 10-bit and 12-bit (not that we use those anyway). It was also always a lot of extra work every time we wanted to add a new clock rate since we had to cross-reference several tables. In <http://crosreview.com/285855> I've gone through the work to figure out how to generate this table automatically. Let's now use the automatically generated table and then we'll never need to look at it again. We only support 8-bit mode right now and only support a small number of clock rates and and I've verified that the only 8-bit rate that was affected was 148.5. That mode appears to have been wrong in the old table. Signed-off-by: Douglas Anderson <dianders@chromium.org> Signed-off-by: Yakir Yang <ykk@rock-chips.com> Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 130 +++++++++++--------- 1 file changed, 69 insertions(+), 61 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 72c1d65c7b75..0370bb247fcb 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -91,80 +91,88 @@ static struct rockchip_hdmi *to_rockchip_hdmi(struct drm_encoder *encoder) static const struct dw_hdmi_mpll_config rockchip_mpll_cfg[] = { { - 27000000, { - { 0x00b3, 0x0000}, - { 0x2153, 0x0000}, - { 0x40f3, 0x0000} + 30666000, { + { 0x00b3, 0x0000 }, + { 0x2153, 0x0000 }, + { 0x40f3, 0x0000 }, }, - }, { - 36000000, { - { 0x00b3, 0x0000}, - { 0x2153, 0x0000}, - { 0x40f3, 0x0000} + }, { + 36800000, { + { 0x00b3, 0x0000 }, + { 0x2153, 0x0000 }, + { 0x40a2, 0x0001 }, }, - }, { - 40000000, { - { 0x00b3, 0x0000}, - { 0x2153, 0x0000}, - { 0x40f3, 0x0000} + }, { + 46000000, { + { 0x00b3, 0x0000 }, + { 0x2142, 0x0001 }, + { 0x40a2, 0x0001 }, }, - }, { - 54000000, { - { 0x0072, 0x0001}, - { 0x2142, 0x0001}, - { 0x40a2, 0x0001}, + }, { + 61333000, { + { 0x0072, 0x0001 }, + { 0x2142, 0x0001 }, + { 0x40a2, 0x0001 }, }, - }, { - 65000000, { - { 0x0072, 0x0001}, - { 0x2142, 0x0001}, - { 0x40a2, 0x0001}, + }, { + 73600000, { + { 0x0072, 0x0001 }, + { 0x2142, 0x0001 }, + { 0x4061, 0x0002 }, }, - }, { - 66000000, { - { 0x013e, 0x0003}, - { 0x217e, 0x0002}, - { 0x4061, 0x0002} + }, { + 92000000, { + { 0x0072, 0x0001 }, + { 0x2145, 0x0002 }, + { 0x4061, 0x0002 }, + }, + }, { + 122666000, { + { 0x0051, 0x0002 }, + { 0x2145, 0x0002 }, + { 0x4061, 0x0002 }, }, - }, { - 74250000, { - { 0x0072, 0x0001}, - { 0x2145, 0x0002}, - { 0x4061, 0x0002} + }, { + 147200000, { + { 0x0051, 0x0002 }, + { 0x2145, 0x0002 }, + { 0x4064, 0x0003 }, }, - }, { - 83500000, { - { 0x0072, 0x0001}, + }, { + 184000000, { + { 0x0051, 0x0002 }, + { 0x214c, 0x0003 }, + { 0x4064, 0x0003 }, }, - }, { - 108000000, { - { 0x0051, 0x0002}, - { 0x2145, 0x0002}, - { 0x4061, 0x0002} + }, { + 226666000, { + { 0x0040, 0x0003 }, + { 0x214c, 0x0003 }, + { 0x4064, 0x0003 }, }, - }, { - 106500000, { - { 0x0051, 0x0002}, - { 0x2145, 0x0002}, - { 0x4061, 0x0002} + }, { + 272000000, { + { 0x0040, 0x0003 }, + { 0x214c, 0x0003 }, + { 0x5a64, 0x0003 }, }, - }, { - 146250000, { - { 0x0051, 0x0002}, - { 0x2145, 0x0002}, - { 0x4061, 0x0002} + }, { + 340000000, { + { 0x0040, 0x0003 }, + { 0x3b4c, 0x0003 }, + { 0x5a64, 0x0003 }, }, - }, { - 148500000, { - { 0x0051, 0x0003}, - { 0x214c, 0x0003}, - { 0x4064, 0x0003} + }, { + 600000000, { + { 0x1a40, 0x0003 }, + { 0x3b4c, 0x0003 }, + { 0x5a64, 0x0003 }, }, - }, { + }, { ~0UL, { - { 0x00a0, 0x000a }, - { 0x2001, 0x000f }, - { 0x4002, 0x000f }, + { 0x0000, 0x0000 }, + { 0x0000, 0x0000 }, + { 0x0000, 0x0000 }, }, } }; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Wed, 8 Jan 2020 21:07:52 +0000 Subject: [PATCH] drm/rockchip: dw-hdmi: limit tmds to 340mhz RK3228/RK3328 does not provide a stable hdmi signal at TMDS rates above 371.25MHz (340MHz pixel clock). Limit the pixel clock rate to 340MHz to provide a stable signal. Also limit the pixel clock to the display reported max tmds clock. This also enables use of pixel clocks up to 340MHz on RK3288/RK3399. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 0370bb247fcb..55c0b8dddad5 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -242,19 +242,11 @@ dw_hdmi_rockchip_mode_valid(struct dw_hdmi *hdmi, void *data, const struct drm_display_info *info, const struct drm_display_mode *mode) { - const struct dw_hdmi_mpll_config *mpll_cfg = rockchip_mpll_cfg; - int pclk = mode->clock * 1000; - bool valid = false; - int i; - - for (i = 0; mpll_cfg[i].mpixelclock != (~0UL); i++) { - if (pclk == mpll_cfg[i].mpixelclock) { - valid = true; - break; - } - } + if (mode->clock > 340000 || + (info->max_tmds_clock && mode->clock > info->max_tmds_clock)) + return MODE_CLOCK_HIGH; - return (valid) ? MODE_OK : MODE_BAD; + return MODE_OK; } static void dw_hdmi_rockchip_encoder_disable(struct drm_encoder *encoder) From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Wed, 8 Jan 2020 21:07:49 +0000 Subject: [PATCH] drm/rockchip: dw-hdmi: allow high tmds bit rates Prepare support for High TMDS Bit Rates used by HDMI2.0 display modes. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 55c0b8dddad5..15ecb257b902 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -327,6 +327,8 @@ static int dw_hdmi_rockchip_genphy_init(struct dw_hdmi *dw_hdmi, void *data, { struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data; + dw_hdmi_set_high_tmds_clock_ratio(dw_hdmi, display); + return phy_power_on(hdmi->phy); } From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Wed, 8 Jan 2020 21:07:52 +0000 Subject: [PATCH] drm/rockchip: dw-hdmi: remove unused plat_data on rk3228/rk3328 mpll_cfg/cur_ctr/phy_config is not used when phy_force_vendor is true, lets remove them. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 15ecb257b902..38dded2baaf7 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -417,9 +417,6 @@ static struct rockchip_hdmi_chip_data rk3228_chip_data = { static const struct dw_hdmi_plat_data rk3228_hdmi_drv_data = { .mode_valid = dw_hdmi_rockchip_mode_valid, - .mpll_cfg = rockchip_mpll_cfg, - .cur_ctr = rockchip_cur_ctr, - .phy_config = rockchip_phy_config, .phy_data = &rk3228_chip_data, .phy_ops = &rk3228_hdmi_phy_ops, .phy_name = "inno_dw_hdmi_phy2", @@ -454,9 +451,6 @@ static struct rockchip_hdmi_chip_data rk3328_chip_data = { static const struct dw_hdmi_plat_data rk3328_hdmi_drv_data = { .mode_valid = dw_hdmi_rockchip_mode_valid, - .mpll_cfg = rockchip_mpll_cfg, - .cur_ctr = rockchip_cur_ctr, - .phy_config = rockchip_phy_config, .phy_data = &rk3328_chip_data, .phy_ops = &rk3328_hdmi_phy_ops, .phy_name = "inno_dw_hdmi_phy2", From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sat, 10 Oct 2020 10:16:32 +0000 Subject: [PATCH] drm/rockchip: dw-hdmi: encoder error handling Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 38dded2baaf7..9e460b7e14a4 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -558,7 +558,7 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, if (IS_ERR(hdmi->phy)) { ret = PTR_ERR(hdmi->phy); if (ret != -EPROBE_DEFER) - DRM_DEV_ERROR(hdmi->dev, "failed to get phy\n"); + DRM_DEV_ERROR(hdmi->dev, "Failed to get phy: %d\n", ret); return ret; } @@ -590,7 +590,12 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, } drm_encoder_helper_add(encoder, &dw_hdmi_rockchip_encoder_helper_funcs); - drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS); + + ret = drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS); + if (ret) { + DRM_DEV_ERROR(hdmi->dev, "Failed to init encoder: %d\n", ret); + goto err_disable_clk; + } platform_set_drvdata(pdev, hdmi); @@ -609,6 +614,7 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, err_bind: drm_encoder_cleanup(encoder); +err_disable_clk: clk_disable_unprepare(hdmi->ref_clk); err_clk: regulator_disable(hdmi->avdd_1v8); From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Wed, 8 Jan 2020 21:07:50 +0000 Subject: [PATCH] clk: rockchip: set parent rate for DCLK_VOP clock on rk3228 Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/clk/rockchip/clk-rk3228.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/clk/rockchip/clk-rk3228.c b/drivers/clk/rockchip/clk-rk3228.c index a24a35553e13..7343d2d7676b 100644 --- a/drivers/clk/rockchip/clk-rk3228.c +++ b/drivers/clk/rockchip/clk-rk3228.c @@ -409,7 +409,7 @@ static struct rockchip_clk_branch rk3228_clk_branches[] __initdata = { RK2928_CLKSEL_CON(29), 0, 3, DFLAGS), DIV(0, "sclk_vop_pre", "sclk_vop_src", 0, RK2928_CLKSEL_CON(27), 8, 8, DFLAGS), - MUX(DCLK_VOP, "dclk_vop", mux_dclk_vop_p, 0, + MUX(DCLK_VOP, "dclk_vop", mux_dclk_vop_p, CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, RK2928_CLKSEL_CON(27), 1, 1, MFLAGS), FACTOR(0, "xin12m", "xin24m", 0, 1, 2), From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sat, 10 Oct 2020 14:32:21 +0000 Subject: [PATCH] drm/rockchip: vop: split rk3288 vop Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c index 9b25b8ffd0ce..a2b281e290e0 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c @@ -740,7 +740,7 @@ static const struct vop_intr rk3288_vop_intr = { .clear = VOP_REG(RK3288_INTR_CTRL0, 0xf, 8), }; -static const struct vop_data rk3288_vop = { +static const struct vop_data rk3288_vop_big = { .version = VOP_VERSION(3, 1), .feature = VOP_FEATURE_OUTPUT_RGB10, .max_output = { 3840, 2160 }, @@ -753,6 +753,19 @@ static const struct vop_data rk3288_vop = { .lut_size = 1024, }; +static const struct vop_data rk3288_vop_lit = { + .version = VOP_VERSION(3, 1), + .feature = VOP_FEATURE_OUTPUT_RGB10, + .max_output = { 2560, 1600 }, + .intr = &rk3288_vop_intr, + .common = &rk3288_common, + .modeset = &rk3288_modeset, + .output = &rk3288_output, + .win = rk3288_vop_win_data, + .win_size = ARRAY_SIZE(rk3288_vop_win_data), + .lut_size = 1024, +}; + static const int rk3368_vop_intrs[] = { FS_INTR, 0, 0, @@ -1142,8 +1155,10 @@ static const struct of_device_id vop_driver_dt_match[] = { .data = &rk3066_vop }, { .compatible = "rockchip,rk3188-vop", .data = &rk3188_vop }, - { .compatible = "rockchip,rk3288-vop", - .data = &rk3288_vop }, + { .compatible = "rockchip,rk3288-vop-big", + .data = &rk3288_vop_big }, + { .compatible = "rockchip,rk3288-vop-lit", + .data = &rk3288_vop_lit }, { .compatible = "rockchip,rk3368-vop", .data = &rk3368_vop }, { .compatible = "rockchip,rk3366-vop", From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sat, 10 Oct 2020 14:33:30 +0000 Subject: [PATCH] ARM: dts: rockchip: split rk3288 vop Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- arch/arm/boot/dts/rk3288.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi index 487b0e03d4b4..c60eacab8a79 100644 --- a/arch/arm/boot/dts/rk3288.dtsi +++ b/arch/arm/boot/dts/rk3288.dtsi @@ -1017,7 +1017,7 @@ rga: rga@ff920000 { }; vopb: vop@ff930000 { - compatible = "rockchip,rk3288-vop"; + compatible = "rockchip,rk3288-vop-big"; reg = <0x0 0xff930000 0x0 0x19c>, <0x0 0xff931000 0x0 0x1000>; interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru ACLK_VOP0>, <&cru DCLK_VOP0>, <&cru HCLK_VOP0>; @@ -1066,7 +1066,7 @@ vopb_mmu: iommu@ff930300 { }; vopl: vop@ff940000 { - compatible = "rockchip,rk3288-vop"; + compatible = "rockchip,rk3288-vop-lit"; reg = <0x0 0xff940000 0x0 0x19c>, <0x0 0xff941000 0x0 0x1000>; interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru ACLK_VOP1>, <&cru DCLK_VOP1>, <&cru HCLK_VOP1>; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Mon, 20 Jul 2020 18:00:44 +0000 Subject: [PATCH] drm/bridge: dw-hdmi: add mtmdsclock parameter to phy configure ops Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 10 ++++++---- drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c | 3 ++- include/drm/bridge/dw_hdmi.h | 3 ++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index 40d8ca37f5bc..22af42a08980 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -138,7 +138,8 @@ struct dw_hdmi_phy_data { bool has_svsret; int (*configure)(struct dw_hdmi *hdmi, const struct dw_hdmi_plat_data *pdata, - unsigned long mpixelclock); + unsigned long mpixelclock, + unsigned long mtmdsclock); }; struct dw_hdmi { @@ -1585,7 +1586,8 @@ static int dw_hdmi_phy_power_on(struct dw_hdmi *hdmi) */ static int hdmi_phy_configure_dwc_hdmi_3d_tx(struct dw_hdmi *hdmi, const struct dw_hdmi_plat_data *pdata, - unsigned long mpixelclock) + unsigned long mpixelclock, + unsigned long mtmdsclock) { const struct dw_hdmi_mpll_config *mpll_config = pdata->mpll_cfg; const struct dw_hdmi_curr_ctrl *curr_ctrl = pdata->cur_ctr; @@ -1660,9 +1662,9 @@ static int hdmi_phy_configure(struct dw_hdmi *hdmi, /* Write to the PHY as configured by the platform */ if (pdata->configure_phy) - ret = pdata->configure_phy(hdmi, pdata->priv_data, mpixelclock); + ret = pdata->configure_phy(hdmi, pdata->priv_data, mpixelclock, mtmdsclock); else - ret = phy->configure(hdmi, pdata, mpixelclock); + ret = phy->configure(hdmi, pdata, mpixelclock, mtmdsclock); if (ret) { dev_err(hdmi->dev, "PHY configuration failed (clock %lu)\n", mpixelclock); diff --git a/drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c b/drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c index 18ed14911b98..9c75095a25c5 100644 --- a/drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c +++ b/drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c @@ -53,7 +53,8 @@ rcar_hdmi_mode_valid(struct dw_hdmi *hdmi, void *data, } static int rcar_hdmi_phy_configure(struct dw_hdmi *hdmi, void *data, - unsigned long mpixelclock) + unsigned long mpixelclock, + unsigned long mtmdsclock) { const struct rcar_hdmi_phy_params *params = rcar_hdmi_phy_params; diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h index f668e75fbabe..48fb72f9614f 100644 --- a/include/drm/bridge/dw_hdmi.h +++ b/include/drm/bridge/dw_hdmi.h @@ -159,7 +159,8 @@ struct dw_hdmi_plat_data { const struct dw_hdmi_curr_ctrl *cur_ctr; const struct dw_hdmi_phy_config *phy_config; int (*configure_phy)(struct dw_hdmi *hdmi, void *data, - unsigned long mpixelclock); + unsigned long mpixelclock, + unsigned long mtmdsclock); unsigned int disable_cec : 1; }; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Mon, 20 Jul 2020 21:34:48 +0000 Subject: [PATCH] drm/bridge: dw-hdmi: support configuring phy for deep color Q: Should we rename dw_hdmi_curr_ctrl and dw_hdmi_phy_config mpixelclock to mtmdsclock ? Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index 22af42a08980..7fd45a7006b1 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -1592,6 +1592,7 @@ static int hdmi_phy_configure_dwc_hdmi_3d_tx(struct dw_hdmi *hdmi, const struct dw_hdmi_mpll_config *mpll_config = pdata->mpll_cfg; const struct dw_hdmi_curr_ctrl *curr_ctrl = pdata->cur_ctr; const struct dw_hdmi_phy_config *phy_config = pdata->phy_config; + int depth; /* TOFIX Will need 420 specific PHY configuration tables */ @@ -1601,11 +1602,11 @@ static int hdmi_phy_configure_dwc_hdmi_3d_tx(struct dw_hdmi *hdmi, break; for (; curr_ctrl->mpixelclock != ~0UL; curr_ctrl++) - if (mpixelclock <= curr_ctrl->mpixelclock) + if (mtmdsclock <= curr_ctrl->mpixelclock) break; for (; phy_config->mpixelclock != ~0UL; phy_config++) - if (mpixelclock <= phy_config->mpixelclock) + if (mtmdsclock <= phy_config->mpixelclock) break; if (mpll_config->mpixelclock == ~0UL || @@ -1613,11 +1614,17 @@ static int hdmi_phy_configure_dwc_hdmi_3d_tx(struct dw_hdmi *hdmi, phy_config->mpixelclock == ~0UL) return -EINVAL; - dw_hdmi_phy_i2c_write(hdmi, mpll_config->res[0].cpce, + depth = hdmi_bus_fmt_color_depth(hdmi->hdmi_data.enc_out_bus_format); + if (depth > 8 && mpixelclock != mtmdsclock) + depth = fls(depth - 8) - 1; + else + depth = 0; + + dw_hdmi_phy_i2c_write(hdmi, mpll_config->res[depth].cpce, HDMI_3D_TX_PHY_CPCE_CTRL); - dw_hdmi_phy_i2c_write(hdmi, mpll_config->res[0].gmp, + dw_hdmi_phy_i2c_write(hdmi, mpll_config->res[depth].gmp, HDMI_3D_TX_PHY_GMPCTRL); - dw_hdmi_phy_i2c_write(hdmi, curr_ctrl->curr[0], + dw_hdmi_phy_i2c_write(hdmi, curr_ctrl->curr[depth], HDMI_3D_TX_PHY_CURRCTRL); dw_hdmi_phy_i2c_write(hdmi, 0, HDMI_3D_TX_PHY_PLLPHBYCTRL); From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Mon, 20 Jul 2020 22:25:15 +0000 Subject: [PATCH] drm/bridge: dw-hdmi: add mpll_cfg_420 for ycbcr420 mode Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 4 +++- include/drm/bridge/dw_hdmi.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index 7fd45a7006b1..a2d101ebf7a7 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -1594,7 +1594,9 @@ static int hdmi_phy_configure_dwc_hdmi_3d_tx(struct dw_hdmi *hdmi, const struct dw_hdmi_phy_config *phy_config = pdata->phy_config; int depth; - /* TOFIX Will need 420 specific PHY configuration tables */ + if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format) && + pdata->mpll_cfg_420) + mpll_config = pdata->mpll_cfg_420; /* PLL/MPLL Cfg - always match on final entry */ for (; mpll_config->mpixelclock != ~0UL; mpll_config++) diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h index 48fb72f9614f..02554d324b4b 100644 --- a/include/drm/bridge/dw_hdmi.h +++ b/include/drm/bridge/dw_hdmi.h @@ -156,6 +156,7 @@ struct dw_hdmi_plat_data { /* Synopsys PHY support */ const struct dw_hdmi_mpll_config *mpll_cfg; + const struct dw_hdmi_mpll_config *mpll_cfg_420; const struct dw_hdmi_curr_ctrl *cur_ctr; const struct dw_hdmi_phy_config *phy_config; int (*configure_phy)(struct dw_hdmi *hdmi, void *data, From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Wed, 15 Jul 2020 09:49:21 +0000 Subject: [PATCH] drm/rockchip: dw-hdmi: mode_valid: allow 420 clock rate Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 9e460b7e14a4..d42ac9fa3246 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -242,8 +242,15 @@ dw_hdmi_rockchip_mode_valid(struct dw_hdmi *hdmi, void *data, const struct drm_display_info *info, const struct drm_display_mode *mode) { - if (mode->clock > 340000 || - (info->max_tmds_clock && mode->clock > info->max_tmds_clock)) + struct dw_hdmi_plat_data *pdata = (struct dw_hdmi_plat_data *)data; + int clock = mode->clock; + + if (pdata->ycbcr_420_allowed && drm_mode_is_420(info, mode) && + (info->color_formats & DRM_COLOR_FORMAT_YCBCR420)) + clock /= 2; + + if (clock > 340000 || + (info->max_tmds_clock && clock > info->max_tmds_clock)) return MODE_CLOCK_HIGH; return MODE_OK; @@ -531,6 +538,7 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, return -ENOMEM; hdmi->dev = &pdev->dev; + plat_data->priv_data = plat_data; hdmi->chip_data = plat_data->phy_data; plat_data->phy_data = hdmi; encoder = &hdmi->encoder.encoder; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Mon, 20 Jul 2020 22:26:19 +0000 Subject: [PATCH] drm/rockchip: dw-hdmi: add YCbCr420 mpll cfg for rk3399 Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 41 +++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index d42ac9fa3246..a37565649c13 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -177,6 +177,46 @@ static const struct dw_hdmi_mpll_config rockchip_mpll_cfg[] = { } }; +static const struct dw_hdmi_mpll_config rockchip_mpll_cfg_420[] = { + { + 30666000, { + { 0x00b7, 0x0000 }, + { 0x2157, 0x0000 }, + { 0x40f7, 0x0000 }, + }, + }, { + 92000000, { + { 0x00b7, 0x0000 }, + { 0x2143, 0x0001 }, + { 0x40a3, 0x0001 }, + }, + }, { + 184000000, { + { 0x0073, 0x0001 }, + { 0x2146, 0x0002 }, + { 0x4062, 0x0002 }, + }, + }, { + 340000000, { + { 0x0052, 0x0003 }, + { 0x214d, 0x0003 }, + { 0x4065, 0x0003 }, + }, + }, { + 600000000, { + { 0x0041, 0x0003 }, + { 0x3b4d, 0x0003 }, + { 0x5a65, 0x0003 }, + }, + }, { + ~0UL, { + { 0x0000, 0x0000 }, + { 0x0000, 0x0000 }, + { 0x0000, 0x0000 }, + }, + } +}; + static const struct dw_hdmi_curr_ctrl rockchip_cur_ctr[] = { /* pixelclk bpp8 bpp10 bpp12 */ { @@ -474,6 +514,7 @@ static struct rockchip_hdmi_chip_data rk3399_chip_data = { static const struct dw_hdmi_plat_data rk3399_hdmi_drv_data = { .mode_valid = dw_hdmi_rockchip_mode_valid, .mpll_cfg = rockchip_mpll_cfg, + .mpll_cfg_420 = rockchip_mpll_cfg_420, .cur_ctr = rockchip_cur_ctr, .phy_config = rockchip_phy_config, .phy_data = &rk3399_chip_data, From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Shunqing Chen <csq@rock-chips.com> Date: Wed, 15 Jul 2020 15:19:11 +0800 Subject: [PATCH] drm/rockchip: dw-hdmi: add YCbCr420 mpll cfg for rk3288w Signed-off-by: Shunqing Chen <csq@rock-chips.com> Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 41 +++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index a37565649c13..66fee351f4a7 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -217,6 +217,46 @@ static const struct dw_hdmi_mpll_config rockchip_mpll_cfg_420[] = { } }; +static const struct dw_hdmi_mpll_config rockchip_rk3288w_mpll_cfg_420[] = { + { + 30666000, { + { 0x00b7, 0x0000 }, + { 0x2157, 0x0000 }, + { 0x40f7, 0x0000 }, + }, + }, { + 92000000, { + { 0x00b7, 0x0000 }, + { 0x2143, 0x0001 }, + { 0x40a3, 0x0001 }, + }, + }, { + 184000000, { + { 0x0073, 0x0001 }, + { 0x2146, 0x0002 }, + { 0x4062, 0x0002 }, + }, + }, { + 340000000, { + { 0x0052, 0x0003 }, + { 0x214d, 0x0003 }, + { 0x4065, 0x0003 }, + }, + }, { + 600000000, { + { 0x0040, 0x0003 }, + { 0x3b4c, 0x0003 }, + { 0x5a65, 0x0003 }, + }, + }, { + ~0UL, { + { 0x0000, 0x0000 }, + { 0x0000, 0x0000 }, + { 0x0000, 0x0000 }, + }, + } +}; + static const struct dw_hdmi_curr_ctrl rockchip_cur_ctr[] = { /* pixelclk bpp8 bpp10 bpp12 */ { @@ -479,6 +519,7 @@ static struct rockchip_hdmi_chip_data rk3288_chip_data = { static const struct dw_hdmi_plat_data rk3288_hdmi_drv_data = { .mode_valid = dw_hdmi_rockchip_mode_valid, .mpll_cfg = rockchip_mpll_cfg, + .mpll_cfg_420 = rockchip_rk3288w_mpll_cfg_420, .cur_ctr = rockchip_cur_ctr, .phy_config = rockchip_phy_config, .phy_data = &rk3288_chip_data, From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Fri, 20 Dec 2019 08:12:42 +0000 Subject: [PATCH] drm/rockchip: dw-hdmi: add bridge and switch to drm_bridge_funcs Switch the dw-hdmi driver to drm_bridge_funcs by implementing a new local bridge, connecting it to the dw-hdmi bridge. Also enable bridge format negotiation by implementing atomic_get_input_bus_fmts and support for 8-bit RGB 4:4:4. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 118 ++++++++++++++------ 1 file changed, 81 insertions(+), 37 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 66fee351f4a7..d6d8f3335813 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -5,6 +5,7 @@ #include <linux/clk.h> #include <linux/mfd/syscon.h> +#include <linux/media-bus-format.h> #include <linux/module.h> #include <linux/platform_device.h> #include <linux/phy/phy.h> @@ -72,6 +73,7 @@ struct rockchip_hdmi_chip_data { struct rockchip_hdmi { struct device *dev; struct regmap *regmap; + struct drm_bridge bridge; struct rockchip_encoder encoder; const struct rockchip_hdmi_chip_data *chip_data; struct clk *ref_clk; @@ -82,11 +84,9 @@ struct rockchip_hdmi { struct phy *phy; }; -static struct rockchip_hdmi *to_rockchip_hdmi(struct drm_encoder *encoder) +static struct rockchip_hdmi *to_rockchip_hdmi(struct drm_bridge *bridge) { - struct rockchip_encoder *rkencoder = to_rockchip_encoder(encoder); - - return container_of(rkencoder, struct rockchip_hdmi, encoder); + return container_of(bridge, struct rockchip_hdmi, bridge); } static const struct dw_hdmi_mpll_config rockchip_mpll_cfg[] = { @@ -335,31 +335,21 @@ dw_hdmi_rockchip_mode_valid(struct dw_hdmi *hdmi, void *data, return MODE_OK; } - -static void dw_hdmi_rockchip_encoder_disable(struct drm_encoder *encoder) +static void +dw_hdmi_rockchip_bridge_mode_set(struct drm_bridge *bridge, + const struct drm_display_mode *mode, + const struct drm_display_mode *adjusted_mode) { -} + struct rockchip_hdmi *hdmi = to_rockchip_hdmi(bridge); -static bool -dw_hdmi_rockchip_encoder_mode_fixup(struct drm_encoder *encoder, - const struct drm_display_mode *mode, - struct drm_display_mode *adj_mode) -{ - return true; + clk_set_rate(hdmi->ref_clk, adjusted_mode->clock * 1000); } -static void dw_hdmi_rockchip_encoder_mode_set(struct drm_encoder *encoder, - struct drm_display_mode *mode, - struct drm_display_mode *adj_mode) +static void dw_hdmi_rockchip_bridge_enable(struct drm_bridge *bridge) { - struct rockchip_hdmi *hdmi = to_rockchip_hdmi(encoder); + struct rockchip_hdmi *hdmi = to_rockchip_hdmi(bridge); + struct drm_encoder *encoder = bridge->encoder; - clk_set_rate(hdmi->ref_clk, adj_mode->clock * 1000); -} - -static void dw_hdmi_rockchip_encoder_enable(struct drm_encoder *encoder) -{ - struct rockchip_hdmi *hdmi = to_rockchip_hdmi(encoder); u32 val; int ret; @@ -387,10 +377,21 @@ static void dw_hdmi_rockchip_encoder_enable(struct drm_encoder *encoder) ret ? "LIT" : "BIG"); } +static bool is_rgb(u32 format) +{ + switch (format) { + case MEDIA_BUS_FMT_RGB888_1X24: + return true; + default: + return false; + } +} + static int -dw_hdmi_rockchip_encoder_atomic_check(struct drm_encoder *encoder, - struct drm_crtc_state *crtc_state, - struct drm_connector_state *conn_state) +dw_hdmi_rockchip_bridge_atomic_check(struct drm_bridge *bridge, + struct drm_bridge_state *bridge_state, + struct drm_crtc_state *crtc_state, + struct drm_connector_state *conn_state) { struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state); @@ -400,12 +401,38 @@ dw_hdmi_rockchip_encoder_atomic_check(struct drm_encoder *encoder, return 0; } -static const struct drm_encoder_helper_funcs dw_hdmi_rockchip_encoder_helper_funcs = { - .mode_fixup = dw_hdmi_rockchip_encoder_mode_fixup, - .mode_set = dw_hdmi_rockchip_encoder_mode_set, - .enable = dw_hdmi_rockchip_encoder_enable, - .disable = dw_hdmi_rockchip_encoder_disable, - .atomic_check = dw_hdmi_rockchip_encoder_atomic_check, +static u32 *dw_hdmi_rockchip_get_input_bus_fmts(struct drm_bridge *bridge, + struct drm_bridge_state *bridge_state, + struct drm_crtc_state *crtc_state, + struct drm_connector_state *conn_state, + u32 output_fmt, + unsigned int *num_input_fmts) +{ + u32 *input_fmt; + + *num_input_fmts = 0; + + if (!is_rgb(output_fmt)) + return NULL; + + input_fmt = kzalloc(sizeof(*input_fmt), GFP_KERNEL); + if (!input_fmt) + return NULL; + + *num_input_fmts = 1; + *input_fmt = output_fmt; + + return input_fmt; +} + +static const struct drm_bridge_funcs dw_hdmi_rockchip_bridge_funcs = { + .mode_set = dw_hdmi_rockchip_bridge_mode_set, + .enable = dw_hdmi_rockchip_bridge_enable, + .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, + .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, + .atomic_get_input_bus_fmts = dw_hdmi_rockchip_get_input_bus_fmts, + .atomic_check = dw_hdmi_rockchip_bridge_atomic_check, + .atomic_reset = drm_atomic_helper_bridge_reset, }; static int dw_hdmi_rockchip_genphy_init(struct dw_hdmi *dw_hdmi, void *data, @@ -602,6 +629,7 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, struct dw_hdmi_plat_data *plat_data; const struct of_device_id *match; struct drm_device *drm = data; + struct drm_bridge *next_bridge; struct drm_encoder *encoder; struct rockchip_hdmi *hdmi; int ret; @@ -679,20 +707,21 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, RK3568_HDMI_SCLIN_MSK)); } - drm_encoder_helper_add(encoder, &dw_hdmi_rockchip_encoder_helper_funcs); - ret = drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS); if (ret) { DRM_DEV_ERROR(hdmi->dev, "Failed to init encoder: %d\n", ret); goto err_disable_clk; } + hdmi->bridge.funcs = &dw_hdmi_rockchip_bridge_funcs; + drm_bridge_attach(encoder, &hdmi->bridge, NULL, 0); + platform_set_drvdata(pdev, hdmi); - hdmi->hdmi = dw_hdmi_bind(pdev, encoder, plat_data); + hdmi->hdmi = dw_hdmi_probe(pdev, plat_data); /* - * If dw_hdmi_bind() fails we'll never call dw_hdmi_unbind(), + * If dw_hdmi_probe() fails we'll never call dw_hdmi_unbind(), * which would have called the encoder cleanup. Do it manually. */ if (IS_ERR(hdmi->hdmi)) { @@ -700,8 +729,23 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, goto err_bind; } + next_bridge = of_drm_find_bridge(pdev->dev.of_node); + if (!next_bridge) { + ret = -EPROBE_DEFER; + goto err_dw_hdmi_remove; + } + + ret = drm_bridge_attach(encoder, next_bridge, &hdmi->bridge, 0); + if (ret) { + if (ret != -EPROBE_DEFER) + DRM_DEV_ERROR(hdmi->dev, "Failed to attach dw-hdmi bridge: %d\n", ret); + goto err_dw_hdmi_remove; + } + return 0; +err_dw_hdmi_remove: + dw_hdmi_remove(hdmi->hdmi); err_bind: drm_encoder_cleanup(encoder); err_disable_clk: @@ -719,7 +763,7 @@ static void dw_hdmi_rockchip_unbind(struct device *dev, struct device *master, { struct rockchip_hdmi *hdmi = dev_get_drvdata(dev); - dw_hdmi_unbind(hdmi->hdmi); + dw_hdmi_remove(hdmi->hdmi); drm_encoder_cleanup(&hdmi->encoder.encoder); clk_disable_unprepare(hdmi->ref_clk); From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Fri, 9 Oct 2020 15:29:27 +0000 Subject: [PATCH] drm/rockchip: vop: add immutable zpos property Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/rockchip_drm_fb.c | 2 ++ drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c index 092bf863110b..e2ee0d6a8d55 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c @@ -133,6 +133,8 @@ void rockchip_drm_mode_config_init(struct drm_device *dev) dev->mode_config.max_width = 4096; dev->mode_config.max_height = 4096; + dev->mode_config.normalize_zpos = true; + dev->mode_config.funcs = &rockchip_drm_mode_config_funcs; dev->mode_config.helper_private = &rockchip_mode_config_helpers; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 30e252ba7184..897f7980ee5d 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -1917,7 +1917,7 @@ static irqreturn_t vop_isr(int irq, void *data) return ret; } -static void vop_plane_add_properties(struct drm_plane *plane, +static void vop_plane_add_properties(struct drm_plane *plane, int zpos, const struct vop_win_data *win_data) { unsigned int flags = 0; @@ -1927,6 +1927,8 @@ static void vop_plane_add_properties(struct drm_plane *plane, if (flags) drm_plane_create_rotation_property(plane, DRM_MODE_ROTATE_0, DRM_MODE_ROTATE_0 | flags); + + drm_plane_create_zpos_immutable_property(plane, zpos); } static int vop_create_crtc(struct vop *vop) @@ -1967,7 +1969,7 @@ static int vop_create_crtc(struct vop *vop) plane = &vop_win->base; drm_plane_helper_add(plane, &plane_helper_funcs); - vop_plane_add_properties(plane, win_data); + vop_plane_add_properties(plane, i, win_data); if (plane->type == DRM_PLANE_TYPE_PRIMARY) primary = plane; else if (plane->type == DRM_PLANE_TYPE_CURSOR) From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sat, 10 Oct 2020 09:20:44 +0000 Subject: [PATCH] drm/rockchip: vop: add plane color properties Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 32 +++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 897f7980ee5d..eadf1b0f1704 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -1917,8 +1917,23 @@ static irqreturn_t vop_isr(int irq, void *data) return ret; } +static bool plane_supports_yuv_format(const struct drm_plane *plane) +{ + const struct drm_format_info *info; + int i; + + for (i = 0; i < plane->format_count; i++) { + info = drm_format_info(plane->format_types[i]); + if (info->is_yuv) + return true; + } + + return false; +} + static void vop_plane_add_properties(struct drm_plane *plane, int zpos, - const struct vop_win_data *win_data) + const struct vop_win_data *win_data, + const struct vop_data *vop_data) { unsigned int flags = 0; @@ -1929,6 +1944,19 @@ static void vop_plane_add_properties(struct drm_plane *plane, int zpos, DRM_MODE_ROTATE_0 | flags); drm_plane_create_zpos_immutable_property(plane, zpos); + + if (!plane_supports_yuv_format(plane)) + return; + + flags = BIT(DRM_COLOR_YCBCR_BT601) | BIT(DRM_COLOR_YCBCR_BT709); + if (vop_data->feature & VOP_FEATURE_OUTPUT_RGB10) + flags |= BIT(DRM_COLOR_YCBCR_BT2020); + + drm_plane_create_color_properties(plane, flags, + BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE), + DRM_COLOR_YCBCR_BT601, + DRM_COLOR_YCBCR_LIMITED_RANGE); } static int vop_create_crtc(struct vop *vop) @@ -1969,7 +1997,7 @@ static int vop_create_crtc(struct vop *vop) plane = &vop_win->base; drm_plane_helper_add(plane, &plane_helper_funcs); - vop_plane_add_properties(plane, i, win_data); + vop_plane_add_properties(plane, i, win_data, vop_data); if (plane->type == DRM_PLANE_TYPE_PRIMARY) primary = plane; else if (plane->type == DRM_PLANE_TYPE_CURSOR) From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Nickey Yang <nickey.yang@rock-chips.com> Date: Mon, 17 Jul 2017 16:35:34 +0800 Subject: [PATCH] HACK: clk: rockchip: rk3288: dedicate npll for vopb and hdmi use MINIARM: set npll be used for hdmi only Signed-off-by: Nickey Yang <nickey.yang@rock-chips.com> Signed-off-by: Jonas Karlman <jonas@kwiboo.se> Signed-off-by: Alex Bee <knaerzche@gmail.com> --- arch/arm/boot/dts/rk3288.dtsi | 2 ++ drivers/clk/rockchip/clk-rk3288.c | 9 +++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi index c60eacab8a79..d1ae42757242 100644 --- a/arch/arm/boot/dts/rk3288.dtsi +++ b/arch/arm/boot/dts/rk3288.dtsi @@ -1026,6 +1026,8 @@ vopb: vop@ff930000 { resets = <&cru SRST_LCDC0_AXI>, <&cru SRST_LCDC0_AHB>, <&cru SRST_LCDC0_DCLK>; reset-names = "axi", "ahb", "dclk"; iommus = <&vopb_mmu>; + assigned-clocks = <&cru DCLK_VOP0>; + assigned-clock-parents = <&cru PLL_NPLL>; status = "disabled"; vopb_out: port { diff --git a/drivers/clk/rockchip/clk-rk3288.c b/drivers/clk/rockchip/clk-rk3288.c index baa5aebd3277..5cfcbaaa154e 100644 --- a/drivers/clk/rockchip/clk-rk3288.c +++ b/drivers/clk/rockchip/clk-rk3288.c @@ -195,8 +195,9 @@ PNAME(mux_ddrphy_p) = { "dpll_ddr", "gpll_ddr" }; PNAME(mux_aclk_cpu_src_p) = { "cpll_aclk_cpu", "gpll_aclk_cpu" }; PNAME(mux_pll_src_cpll_gpll_p) = { "cpll", "gpll" }; -PNAME(mux_pll_src_npll_cpll_gpll_p) = { "npll", "cpll", "gpll" }; -PNAME(mux_pll_src_cpll_gpll_npll_p) = { "cpll", "gpll", "npll" }; +PNAME(mux_pll_src_npll_cpll_gpll_p) = { "prevent:npll", "cpll", "gpll" }; +PNAME(mux_pll_src_cpll_gpll_npll_p) = { "cpll", "gpll", "prevent:npll" }; +PNAME(vop0_mux_pll_src_cpll_gpll_npll_p) = { "prevent:cpll", "prevent:gpll", "npll" }; PNAME(mux_pll_src_cpll_gpll_usb480m_p) = { "cpll", "gpll", "unstable:usbphy480m_src" }; PNAME(mux_pll_src_cpll_gll_usb_npll_p) = { "cpll", "gpll", "unstable:usbphy480m_src", "npll" }; @@ -232,7 +233,7 @@ static struct rockchip_pll_clock rk3288_pll_clks[] __initdata = { [gpll] = PLL(pll_rk3066, PLL_GPLL, "gpll", mux_pll_p, 0, RK3288_PLL_CON(12), RK3288_MODE_CON, 12, 8, ROCKCHIP_PLL_SYNC_RATE, rk3288_pll_rates), [npll] = PLL(pll_rk3066, PLL_NPLL, "npll", mux_pll_p, 0, RK3288_PLL_CON(16), - RK3288_MODE_CON, 14, 9, ROCKCHIP_PLL_SYNC_RATE, rk3288_pll_rates), + RK3288_MODE_CON, 14, 9, 0, rk3288_pll_rates), }; static struct clk_div_table div_hclk_cpu_t[] = { @@ -442,7 +443,7 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { RK3288_CLKSEL_CON(30), 14, 2, MFLAGS, 8, 5, DFLAGS, RK3288_CLKGATE_CON(3), 4, GFLAGS), - COMPOSITE(DCLK_VOP0, "dclk_vop0", mux_pll_src_cpll_gpll_npll_p, 0, + COMPOSITE(DCLK_VOP0, "dclk_vop0", vop0_mux_pll_src_cpll_gpll_npll_p, CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT, RK3288_CLKSEL_CON(27), 0, 2, MFLAGS, 8, 8, DFLAGS, RK3288_CLKGATE_CON(3), 1, GFLAGS), COMPOSITE(DCLK_VOP1, "dclk_vop1", mux_pll_src_cpll_gpll_npll_p, 0, From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sat, 4 Aug 2018 14:51:14 +0200 Subject: [PATCH] HACK: clk: rockchip: rk3288: use npll table to to improve HDMI compatibility Based on https://github.com/TinkerBoard/debian_kernel/commit/3d90870530b8a2901681f7b7fa598ee7381e49f3 Signed-off-by: Jonas Karlman <jonas@kwiboo.se> Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/clk/rockchip/clk-rk3288.c | 39 ++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/drivers/clk/rockchip/clk-rk3288.c b/drivers/clk/rockchip/clk-rk3288.c index 5cfcbaaa154e..fa1c6e646bdf 100644 --- a/drivers/clk/rockchip/clk-rk3288.c +++ b/drivers/clk/rockchip/clk-rk3288.c @@ -121,6 +121,43 @@ static struct rockchip_pll_rate_table rk3288_pll_rates[] = { { /* sentinel */ }, }; +static struct rockchip_pll_rate_table rk3288_npll_rates[] = { + RK3066_PLL_RATE_NB(594000000, 1, 198, 8, 1), + RK3066_PLL_RATE_NB(585000000, 6, 585, 4, 32), + RK3066_PLL_RATE_NB(432000000, 3, 216, 4, 32), + RK3066_PLL_RATE_NB(426000000, 3, 213, 4, 32), + RK3066_PLL_RATE_NB(400000000, 1, 100, 6, 32), + RK3066_PLL_RATE(348500000, 8, 697, 6), + RK3066_PLL_RATE_NB(342000000, 3, 171, 4, 32), + RK3066_PLL_RATE_NB(297000000, 2, 198, 8, 16), + RK3066_PLL_RATE_NB(270000000, 1, 135, 12, 32), + RK3066_PLL_RATE_NB(260000000, 1, 130, 12, 32), + RK3066_PLL_RATE(241500000, 2, 161, 8), + RK3066_PLL_RATE(162000000, 1, 81, 12), + RK3066_PLL_RATE(154000000, 6, 539, 14), + RK3066_PLL_RATE_NB(148500000, 1, 99, 16, 32), + RK3066_PLL_RATE(148352000, 13, 1125, 14), + RK3066_PLL_RATE_NB(146250000, 6, 585, 16, 32), + RK3066_PLL_RATE(121750000, 6, 487, 16), + RK3066_PLL_RATE(119000000, 3, 238, 16), + RK3066_PLL_RATE_NB(108000000, 1, 54, 12, 32), + RK3066_PLL_RATE_NB(106500000, 4, 213, 12, 32), + RK3066_PLL_RATE(101000000, 3, 202, 16), + RK3066_PLL_RATE(88750000, 6, 355, 16), + RK3066_PLL_RATE_NB(85500000, 4, 171, 12, 32), + RK3066_PLL_RATE(83500000, 3, 167, 16), + RK3066_PLL_RATE(79500000, 1, 53, 16), + RK3066_PLL_RATE_NB(74250000, 4, 198, 16, 32), + RK3066_PLL_RATE(74176000, 26, 1125, 14), + RK3066_PLL_RATE(72000000, 1, 48, 16), + RK3066_PLL_RATE(71000000, 3, 142, 16), + RK3066_PLL_RATE(68250000, 2, 91, 16), + RK3066_PLL_RATE(65000000, 3, 130, 16), + RK3066_PLL_RATE(40000000, 3, 80, 16), + RK3066_PLL_RATE(33750000, 2, 45, 16), + { /* sentinel */ }, +}; + #define RK3288_DIV_ACLK_CORE_M0_MASK 0xf #define RK3288_DIV_ACLK_CORE_M0_SHIFT 0 #define RK3288_DIV_ACLK_CORE_MP_MASK 0xf @@ -233,7 +270,7 @@ static struct rockchip_pll_clock rk3288_pll_clks[] __initdata = { [gpll] = PLL(pll_rk3066, PLL_GPLL, "gpll", mux_pll_p, 0, RK3288_PLL_CON(12), RK3288_MODE_CON, 12, 8, ROCKCHIP_PLL_SYNC_RATE, rk3288_pll_rates), [npll] = PLL(pll_rk3066, PLL_NPLL, "npll", mux_pll_p, 0, RK3288_PLL_CON(16), - RK3288_MODE_CON, 14, 9, 0, rk3288_pll_rates), + RK3288_MODE_CON, 14, 9, 0, rk3288_npll_rates), }; static struct clk_div_table div_hclk_cpu_t[] = { From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Mon, 25 May 2020 20:36:45 +0000 Subject: [PATCH] HACK: clk: rockchip: rk3399: dedicate vpll for vopb and hdmi use Rockchip PLLs are kown provide the least jitter for vco rates between 800 MHz and 2 GHz. I added the rates for VPLL which are used for VOPs dclk and there- fore HDMI phy in that manner and used the rates which require the lowest frac divs. Additionally I added some rates which are useful to provide additional VESA and non-VESA rates for HDMI output. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/clk/rockchip/clk-rk3399.c | 49 ++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/drivers/clk/rockchip/clk-rk3399.c b/drivers/clk/rockchip/clk-rk3399.c index 306910a3a0d3..436d2789611c 100644 --- a/drivers/clk/rockchip/clk-rk3399.c +++ b/drivers/clk/rockchip/clk-rk3399.c @@ -105,6 +105,39 @@ static struct rockchip_pll_rate_table rk3399_pll_rates[] = { { /* sentinel */ }, }; +static struct rockchip_pll_rate_table rk3399_vpll_rates[] = { + /* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */ + RK3036_PLL_RATE( 594000000, 1, 74, 3, 1, 0, 4194304), /* vco = 1782000000 fout = 594000000 */ + RK3036_PLL_RATE( 593406592, 1, 74, 3, 1, 0, 2949838), /* vco = 1780219777 fout = 593406592.36908 */ + RK3036_PLL_RATE( 319750000, 1, 79, 6, 1, 0, 15728640), /* vco = 1918500000 fout = 319750000 */ + RK3036_PLL_RATE( 297000000, 1, 74, 6, 1, 0, 4194304), /* vco = 1782000000 fout = 297000000 */ + RK3036_PLL_RATE( 296703296, 1, 74, 6, 1, 0, 2949838), /* vco = 1780219777 fout = 296703296.18454 */ + RK3036_PLL_RATE( 241500000, 1, 60, 6, 1, 0, 6291456), /* vco = 1449000000 fout = 241500000 */ + RK3036_PLL_RATE( 162000000, 1, 67, 5, 2, 0, 8388608), /* vco = 1620000000 fout = 162000000 */ + RK3036_PLL_RATE( 148500000, 1, 74, 6, 2, 0, 4194304), /* vco = 1782000000 fout = 148500000*/ + RK3036_PLL_RATE( 148351648, 1, 74, 6, 2, 0, 2949838), /* vco = 1780219777 fout = 148351648.09227 */ + RK3036_PLL_RATE( 136750000, 1, 68, 2, 6, 0, 6291456), /* vco = 1641000000 fout = 136750000 */ + RK3036_PLL_RATE( 135000000, 1, 56, 5, 2, 0, 4194304), /* vco = 1350000000 fout = 135000000 */ + RK3036_PLL_RATE( 119000000, 1, 59, 6, 2, 0, 8388608), /* vco = 1428000000 fout = 119000000 */ + RK3036_PLL_RATE( 108000000, 1, 63, 7, 2, 1, 0), /* vco = 1512000000 fout = 108000000 */ + RK3036_PLL_RATE( 106500000, 1, 62, 7, 2, 0, 2097152), /* vco = 1491000000 fout = 106500000 */ + RK3036_PLL_RATE( 88750000, 1, 55, 5, 3, 0, 7864320), /* vco = 1331250000 fout = 88750000 */ + RK3036_PLL_RATE( 85500000, 1, 57, 4, 4, 1, 0), /* vco = 1368000000 fout = 85500000 */ + RK3036_PLL_RATE( 78750000, 1, 59, 6, 3, 0, 1048576), /* vco = 1417500000 fout = 78750000 */ + RK3036_PLL_RATE( 74250000, 1, 74, 6, 4, 0, 4194304), /* vco = 1782000000 fout = 74250000 */ + RK3036_PLL_RATE( 74175824, 1, 74, 6, 4, 0, 2949838), /* vco = 1780219777 fout = 74175824.046135 */ + RK3036_PLL_RATE( 71000000, 1, 71, 6, 4, 1, 0), /* vco = 1704000000 fout = 71000000 */ + RK3036_PLL_RATE( 65000000, 1, 65, 6, 4, 0, 0), /* vco = 1560000000 fout = 65000000 */ + RK3036_PLL_RATE( 59340659, 1, 59, 6, 4, 0, 5715310), /* vco = 1424175816 fout = 59340659.022331 */ + RK3036_PLL_RATE( 54000000, 1, 63, 7, 4, 1, 0), /* vco = 1512000000 fout = 54000000 */ + RK3036_PLL_RATE( 49500000, 1, 72, 5, 7, 0, 3145728), /* vco = 1732500000 fout = 49500000 */ + RK3036_PLL_RATE( 40000000, 1, 70, 7, 6, 1, 0), /* vco = 1680000000 fout = 40000000 */ + RK3036_PLL_RATE( 31500000, 1, 55, 7, 6, 0, 2097152), /* vco = 1323000000 fout = 31500000 */ + RK3036_PLL_RATE( 27000000, 1, 55, 7, 7, 0, 2097152), /* vco = 1323000000 fout = 27000000 */ + RK3036_PLL_RATE( 26973026, 1, 55, 7, 7, 0, 1173214), /* vco = 1321678296 fout = 26973026.450799 */ + { /* sentinel */ }, +}; + /* CRU parents */ PNAME(mux_pll_p) = { "xin24m", "xin32k" }; @@ -123,7 +156,7 @@ PNAME(mux_ddrclk_p) = { "clk_ddrc_lpll_src", PNAME(mux_aclk_cci_p) = { "cpll_aclk_cci_src", "gpll_aclk_cci_src", "npll_aclk_cci_src", - "vpll_aclk_cci_src" }; + "prevent:vpll" }; PNAME(mux_cci_trace_p) = { "cpll_cci_trace", "gpll_cci_trace" }; PNAME(mux_cs_p) = { "cpll_cs", "gpll_cs", @@ -149,10 +182,12 @@ PNAME(mux_pll_src_cpll_gpll_npll_upll_24m_p) = { "cpll", "gpll", "npll", PNAME(mux_pll_src_cpll_gpll_npll_ppll_upll_24m_p) = { "cpll", "gpll", "npll", "ppll", "upll", "xin24m" }; -PNAME(mux_pll_src_vpll_cpll_gpll_p) = { "vpll", "cpll", "gpll" }; -PNAME(mux_pll_src_vpll_cpll_gpll_npll_p) = { "vpll", "cpll", "gpll", +PNAME(mux_pll_src_vpll_cpll_gpll_p) = { "prevent:vpll", "cpll", "gpll" }; +PNAME(vop0_mux_pll_src_vpll_cpll_gpll_p) = { "vpll", "prevent:cpll", "prevent:gpll" }; + +PNAME(mux_pll_src_vpll_cpll_gpll_npll_p) = { "prevent:vpll", "cpll", "gpll", "npll" }; -PNAME(mux_pll_src_vpll_cpll_gpll_24m_p) = { "vpll", "cpll", "gpll", +PNAME(mux_pll_src_vpll_cpll_gpll_24m_p) = { "prevent:vpll", "cpll", "gpll", "xin24m" }; PNAME(mux_dclk_vop0_p) = { "dclk_vop0_div", @@ -229,7 +264,7 @@ static struct rockchip_pll_clock rk3399_pll_clks[] __initdata = { [npll] = PLL(pll_rk3399, PLL_NPLL, "npll", mux_pll_p, 0, RK3399_PLL_CON(40), RK3399_PLL_CON(43), 8, 31, ROCKCHIP_PLL_SYNC_RATE, rk3399_pll_rates), [vpll] = PLL(pll_rk3399, PLL_VPLL, "vpll", mux_pll_p, 0, RK3399_PLL_CON(48), - RK3399_PLL_CON(51), 8, 31, ROCKCHIP_PLL_SYNC_RATE, rk3399_pll_rates), + RK3399_PLL_CON(51), 8, 31, ROCKCHIP_PLL_SYNC_RATE, rk3399_vpll_rates), }; static struct rockchip_pll_clock rk3399_pmu_pll_clks[] __initdata = { @@ -279,7 +314,7 @@ static struct rockchip_clk_branch rk3399_uart4_pmu_fracmux __initdata = RK3399_PMU_CLKSEL_CON(5), 8, 2, MFLAGS); static struct rockchip_clk_branch rk3399_dclk_vop0_fracmux __initdata = - MUX(DCLK_VOP0, "dclk_vop0", mux_dclk_vop0_p, CLK_SET_RATE_PARENT, + MUX(DCLK_VOP0, "dclk_vop0", mux_dclk_vop0_p, CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, RK3399_CLKSEL_CON(49), 11, 1, MFLAGS); static struct rockchip_clk_branch rk3399_dclk_vop1_fracmux __initdata = @@ -1162,7 +1197,7 @@ static struct rockchip_clk_branch rk3399_clk_branches[] __initdata = { GATE(HCLK_VOP0_NOC, "hclk_vop0_noc", "hclk_vop0_pre", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(28), 0, GFLAGS), - COMPOSITE(DCLK_VOP0_DIV, "dclk_vop0_div", mux_pll_src_vpll_cpll_gpll_p, 0, + COMPOSITE(DCLK_VOP0_DIV, "dclk_vop0_div", vop0_mux_pll_src_vpll_cpll_gpll_p, CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, RK3399_CLKSEL_CON(49), 8, 2, MFLAGS, 0, 8, DFLAGS, RK3399_CLKGATE_CON(10), 12, GFLAGS), From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sun, 19 Jul 2020 16:35:11 +0000 Subject: [PATCH] HACK: dts: rockchip: do not use vopl for hdmi --- arch/arm/boot/dts/rk3288.dtsi | 9 --------- arch/arm64/boot/dts/rockchip/rk3399.dtsi | 9 --------- 2 files changed, 18 deletions(-) diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi index d1ae42757242..7b2cde230b87 100644 --- a/arch/arm/boot/dts/rk3288.dtsi +++ b/arch/arm/boot/dts/rk3288.dtsi @@ -1083,11 +1083,6 @@ vopl_out: port { #address-cells = <1>; #size-cells = <0>; - vopl_out_hdmi: endpoint@0 { - reg = <0>; - remote-endpoint = <&hdmi_in_vopl>; - }; - vopl_out_edp: endpoint@1 { reg = <1>; remote-endpoint = <&edp_in_vopl>; @@ -1227,10 +1222,6 @@ hdmi_in_vopb: endpoint@0 { reg = <0>; remote-endpoint = <&vopb_out_hdmi>; }; - hdmi_in_vopl: endpoint@1 { - reg = <1>; - remote-endpoint = <&vopl_out_hdmi>; - }; }; }; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi index 92c2207e686c..980b12cb0a49 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi @@ -1728,11 +1728,6 @@ vopl_out_edp: endpoint@1 { remote-endpoint = <&edp_in_vopl>; }; - vopl_out_hdmi: endpoint@2 { - reg = <2>; - remote-endpoint = <&hdmi_in_vopl>; - }; - vopl_out_mipi1: endpoint@3 { reg = <3>; remote-endpoint = <&mipi1_in_vopl>; @@ -1926,10 +1921,6 @@ hdmi_in_vopb: endpoint@0 { reg = <0>; remote-endpoint = <&vopb_out_hdmi>; }; - hdmi_in_vopl: endpoint@1 { - reg = <1>; - remote-endpoint = <&vopl_out_hdmi>; - }; }; }; }; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Fri, 20 Dec 2019 08:12:43 +0000 Subject: [PATCH] WIP: drm/bridge: dw-hdmi: limit mode and bus format to max_tmds_clock --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 120 ++++++++++++++-------- 1 file changed, 76 insertions(+), 44 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index a2d101ebf7a7..7f6ffbc3e7b2 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -2003,6 +2003,21 @@ static void hdmi_config_drm_infoframe(struct dw_hdmi *hdmi, HDMI_FC_PACKET_TX_EN_DRM_MASK, HDMI_FC_PACKET_TX_EN); } +static unsigned int +hdmi_get_tmdsclock(unsigned int bus_format, unsigned int pixelclock) +{ + int color_depth = hdmi_bus_fmt_color_depth(bus_format); + unsigned int tmdsclock = pixelclock; + + if (!hdmi_bus_fmt_is_yuv422(bus_format) && color_depth > 8) + tmdsclock = (u64)pixelclock * color_depth / 8; + + if (hdmi_bus_fmt_is_yuv420(bus_format)) + tmdsclock /= 2; + + return tmdsclock; +} + static void hdmi_av_composer(struct dw_hdmi *hdmi, const struct drm_display_info *display, const struct drm_display_mode *mode) @@ -2014,29 +2029,11 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi, unsigned int vdisplay, hdisplay; vmode->mpixelclock = mode->clock * 1000; + vmode->mtmdsclock = + hdmi_get_tmdsclock(hdmi->hdmi_data.enc_out_bus_format, + vmode->mpixelclock); dev_dbg(hdmi->dev, "final pixclk = %d\n", vmode->mpixelclock); - - vmode->mtmdsclock = vmode->mpixelclock; - - if (!hdmi_bus_fmt_is_yuv422(hdmi->hdmi_data.enc_out_bus_format)) { - switch (hdmi_bus_fmt_color_depth( - hdmi->hdmi_data.enc_out_bus_format)) { - case 16: - vmode->mtmdsclock = vmode->mpixelclock * 2; - break; - case 12: - vmode->mtmdsclock = vmode->mpixelclock * 3 / 2; - break; - case 10: - vmode->mtmdsclock = vmode->mpixelclock * 5 / 4; - break; - } - } - - if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format)) - vmode->mtmdsclock /= 2; - dev_dbg(hdmi->dev, "final tmdsclock = %d\n", vmode->mtmdsclock); /* Set up HDMI_FC_INVIDCONF */ @@ -2663,8 +2660,21 @@ static int dw_hdmi_connector_create(struct dw_hdmi *hdmi) * - MEDIA_BUS_FMT_RGB888_1X24, */ -/* Can return a maximum of 11 possible output formats for a mode/connector */ -#define MAX_OUTPUT_SEL_FORMATS 11 +/* Can return a maximum of 15 possible output formats for a mode/connector */ +#define MAX_OUTPUT_SEL_FORMATS 15 + +static bool is_tmds_allowed(struct drm_display_info *info, + struct drm_display_mode *mode, + u32 bus_format) +{ + unsigned long tmdsclock = hdmi_get_tmdsclock(bus_format, mode->clock); + int max_tmds_clock = info->max_tmds_clock ? info->max_tmds_clock : 340000; + + if (max_tmds_clock >= tmdsclock) + return true; + + return false; +} static u32 *dw_hdmi_bridge_atomic_get_output_bus_fmts(struct drm_bridge *bridge, struct drm_bridge_state *bridge_state, @@ -2676,8 +2686,6 @@ static u32 *dw_hdmi_bridge_atomic_get_output_bus_fmts(struct drm_bridge *bridge, struct drm_display_info *info = &conn->display_info; struct drm_display_mode *mode = &crtc_state->mode; u8 max_bpc = conn_state->max_requested_bpc; - bool is_hdmi2_sink = info->hdmi.scdc.supported || - (info->color_formats & DRM_COLOR_FORMAT_YCBCR420); u32 *output_fmts; unsigned int i = 0; @@ -2701,29 +2709,33 @@ static u32 *dw_hdmi_bridge_atomic_get_output_bus_fmts(struct drm_bridge *bridge, * If the current mode enforces 4:2:0, force the output but format * to 4:2:0 and do not add the YUV422/444/RGB formats */ - if (conn->ycbcr_420_allowed && - (drm_mode_is_420_only(info, mode) || - (is_hdmi2_sink && drm_mode_is_420_also(info, mode)))) { + if (conn->ycbcr_420_allowed && drm_mode_is_420(info, mode) && + (info->color_formats & DRM_COLOR_FORMAT_YCBCR420)) { /* Order bus formats from 16bit to 8bit if supported */ if (max_bpc >= 16 && info->bpc == 16 && - (info->hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_48)) + (info->hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_48) && + is_tmds_allowed(info, mode, MEDIA_BUS_FMT_UYYVYY16_0_5X48)) output_fmts[i++] = MEDIA_BUS_FMT_UYYVYY16_0_5X48; if (max_bpc >= 12 && info->bpc >= 12 && - (info->hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_36)) + (info->hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_36) && + is_tmds_allowed(info, mode, MEDIA_BUS_FMT_UYYVYY12_0_5X36)) output_fmts[i++] = MEDIA_BUS_FMT_UYYVYY12_0_5X36; if (max_bpc >= 10 && info->bpc >= 10 && - (info->hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_30)) + (info->hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_30) && + is_tmds_allowed(info, mode, MEDIA_BUS_FMT_UYYVYY10_0_5X30)) output_fmts[i++] = MEDIA_BUS_FMT_UYYVYY10_0_5X30; /* Default 8bit fallback */ - output_fmts[i++] = MEDIA_BUS_FMT_UYYVYY8_0_5X24; + if (is_tmds_allowed(info, mode, MEDIA_BUS_FMT_UYYVYY8_0_5X24)) + output_fmts[i++] = MEDIA_BUS_FMT_UYYVYY8_0_5X24; *num_output_fmts = i; - return output_fmts; + if (drm_mode_is_420_only(info, mode)) + return output_fmts; } /* @@ -2732,40 +2744,51 @@ static u32 *dw_hdmi_bridge_atomic_get_output_bus_fmts(struct drm_bridge *bridge, */ /* Default 8bit RGB fallback */ - output_fmts[i++] = MEDIA_BUS_FMT_RGB888_1X24; + if (is_tmds_allowed(info, mode, MEDIA_BUS_FMT_RGB888_1X24)) + output_fmts[i++] = MEDIA_BUS_FMT_RGB888_1X24; if (max_bpc >= 16 && info->bpc == 16) { - if (info->color_formats & DRM_COLOR_FORMAT_YCBCR444) + if ((info->color_formats & DRM_COLOR_FORMAT_YCBCR444) && + is_tmds_allowed(info, mode, MEDIA_BUS_FMT_YUV16_1X48)) output_fmts[i++] = MEDIA_BUS_FMT_YUV16_1X48; - output_fmts[i++] = MEDIA_BUS_FMT_RGB161616_1X48; + if (is_tmds_allowed(info, mode, MEDIA_BUS_FMT_RGB161616_1X48)) + output_fmts[i++] = MEDIA_BUS_FMT_RGB161616_1X48; } if (max_bpc >= 12 && info->bpc >= 12) { - if (info->color_formats & DRM_COLOR_FORMAT_YCBCR422) + if ((info->color_formats & DRM_COLOR_FORMAT_YCBCR422) && + is_tmds_allowed(info, mode, MEDIA_BUS_FMT_UYVY12_1X24)) output_fmts[i++] = MEDIA_BUS_FMT_UYVY12_1X24; - if (info->color_formats & DRM_COLOR_FORMAT_YCBCR444) + if ((info->color_formats & DRM_COLOR_FORMAT_YCBCR444) && + is_tmds_allowed(info, mode, MEDIA_BUS_FMT_YUV12_1X36)) output_fmts[i++] = MEDIA_BUS_FMT_YUV12_1X36; - output_fmts[i++] = MEDIA_BUS_FMT_RGB121212_1X36; + if (is_tmds_allowed(info, mode, MEDIA_BUS_FMT_RGB121212_1X36)) + output_fmts[i++] = MEDIA_BUS_FMT_RGB121212_1X36; } if (max_bpc >= 10 && info->bpc >= 10) { - if (info->color_formats & DRM_COLOR_FORMAT_YCBCR422) + if ((info->color_formats & DRM_COLOR_FORMAT_YCBCR422) && + is_tmds_allowed(info, mode, MEDIA_BUS_FMT_UYVY10_1X20)) output_fmts[i++] = MEDIA_BUS_FMT_UYVY10_1X20; - if (info->color_formats & DRM_COLOR_FORMAT_YCBCR444) + if ((info->color_formats & DRM_COLOR_FORMAT_YCBCR444) && + is_tmds_allowed(info, mode, MEDIA_BUS_FMT_YUV10_1X30)) output_fmts[i++] = MEDIA_BUS_FMT_YUV10_1X30; - output_fmts[i++] = MEDIA_BUS_FMT_RGB101010_1X30; + if (is_tmds_allowed(info, mode, MEDIA_BUS_FMT_RGB101010_1X30)) + output_fmts[i++] = MEDIA_BUS_FMT_RGB101010_1X30; } - if (info->color_formats & DRM_COLOR_FORMAT_YCBCR422) + if ((info->color_formats & DRM_COLOR_FORMAT_YCBCR422) && + is_tmds_allowed(info, mode, MEDIA_BUS_FMT_UYVY8_1X16)) output_fmts[i++] = MEDIA_BUS_FMT_UYVY8_1X16; - if (info->color_formats & DRM_COLOR_FORMAT_YCBCR444) + if ((info->color_formats & DRM_COLOR_FORMAT_YCBCR444) && + is_tmds_allowed(info, mode, MEDIA_BUS_FMT_YUV8_1X24)) output_fmts[i++] = MEDIA_BUS_FMT_YUV8_1X24; *num_output_fmts = i; @@ -2946,11 +2969,20 @@ dw_hdmi_bridge_mode_valid(struct drm_bridge *bridge, struct dw_hdmi *hdmi = bridge->driver_private; const struct dw_hdmi_plat_data *pdata = hdmi->plat_data; enum drm_mode_status mode_status = MODE_OK; + int max_tmds_clock = info->max_tmds_clock ? info->max_tmds_clock : 340000; + int clock = mode->clock; /* We don't support double-clocked modes */ if (mode->flags & DRM_MODE_FLAG_DBLCLK) return MODE_BAD; + if (pdata->ycbcr_420_allowed && drm_mode_is_420(info, mode) && + (info->color_formats & DRM_COLOR_FORMAT_YCBCR420)) + clock /= 2; + + if (clock > max_tmds_clock) + return MODE_CLOCK_HIGH; + if (pdata->mode_valid) mode_status = pdata->mode_valid(hdmi, pdata->priv_data, info, mode); From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Fri, 20 Dec 2019 08:12:42 +0000 Subject: [PATCH] WIP: drm/rockchip: dw_hdmi: add 10-bit rgb bus format --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 42 +++++++++++++++++++++ drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 1 + 2 files changed, 43 insertions(+) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index d6d8f3335813..89424c5bc24a 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -84,6 +84,8 @@ struct rockchip_hdmi { struct phy *phy; }; +#define to_crtc_state(x) container_of(x, struct drm_crtc_state, x) + static struct rockchip_hdmi *to_rockchip_hdmi(struct drm_bridge *bridge) { return container_of(bridge, struct rockchip_hdmi, bridge); @@ -341,6 +343,11 @@ dw_hdmi_rockchip_bridge_mode_set(struct drm_bridge *bridge, const struct drm_display_mode *adjusted_mode) { struct rockchip_hdmi *hdmi = to_rockchip_hdmi(bridge); + struct drm_crtc_state *crtc_state = to_crtc_state(adjusted_mode); + struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state); + + if (hdmi->phy) + phy_set_bus_width(hdmi->phy, s->bus_width); clk_set_rate(hdmi->ref_clk, adjusted_mode->clock * 1000); } @@ -381,6 +388,17 @@ static bool is_rgb(u32 format) { switch (format) { case MEDIA_BUS_FMT_RGB888_1X24: + case MEDIA_BUS_FMT_RGB101010_1X30: + return true; + default: + return false; + } +} + +static bool is_10bit(u32 format) +{ + switch (format) { + case MEDIA_BUS_FMT_RGB101010_1X30: return true; default: return false; @@ -394,9 +412,24 @@ dw_hdmi_rockchip_bridge_atomic_check(struct drm_bridge *bridge, struct drm_connector_state *conn_state) { struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state); + struct drm_atomic_state *state = bridge_state->base.state; + struct drm_crtc_state *old_crtc_state; + struct rockchip_crtc_state *old_state; + u32 format = bridge_state->output_bus_cfg.format; s->output_mode = ROCKCHIP_OUT_MODE_AAAA; s->output_type = DRM_MODE_CONNECTOR_HDMIA; + s->output_bpc = 10; + s->bus_format = format; + s->bus_width = is_10bit(format) ? 10 : 8; + + old_crtc_state = drm_atomic_get_old_crtc_state(state, conn_state->crtc); + if (old_crtc_state && !crtc_state->mode_changed) { + old_state = to_rockchip_crtc_state(old_crtc_state); + if (s->bus_format != old_state->bus_format || + s->bus_width != old_state->bus_width) + crtc_state->mode_changed = true; + } return 0; } @@ -408,10 +441,19 @@ static u32 *dw_hdmi_rockchip_get_input_bus_fmts(struct drm_bridge *bridge, u32 output_fmt, unsigned int *num_input_fmts) { + struct rockchip_hdmi *hdmi = to_rockchip_hdmi(bridge); + struct drm_encoder *encoder = bridge->encoder; u32 *input_fmt; + bool has_10bit = true; *num_input_fmts = 0; + if (drm_of_encoder_active_endpoint_id(hdmi->dev->of_node, encoder)) + has_10bit = false; + + if (!has_10bit && is_10bit(output_fmt)) + return NULL; + if (!is_rgb(output_fmt)) return NULL; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h index 1641440837af..381e5ccab5f3 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h @@ -34,6 +34,7 @@ struct rockchip_crtc_state { u32 bus_format; u32 bus_flags; int color_space; + int bus_width; }; #define to_rockchip_crtc_state(s) \ container_of(s, struct rockchip_crtc_state, base) From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sun, 8 Dec 2019 23:42:44 +0000 Subject: [PATCH] WIP: drm: dw-hdmi: add content type connector property Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index 7f6ffbc3e7b2..ae4c49e84470 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -1790,6 +1790,7 @@ static void hdmi_config_AVI(struct dw_hdmi *hdmi, const struct drm_connector *connector, const struct drm_display_mode *mode) { + const struct drm_connector_state *conn_state = connector->state; struct hdmi_avi_infoframe frame; u8 val; @@ -1847,6 +1848,8 @@ static void hdmi_config_AVI(struct dw_hdmi *hdmi, HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; } + drm_hdmi_avi_infoframe_content_type(&frame, conn_state); + /* * The Designware IP uses a different byte format from standard * AVI info frames, though generally the bits are in the correct @@ -2551,7 +2554,8 @@ static int dw_hdmi_connector_atomic_check(struct drm_connector *connector, if (!crtc) return 0; - if (!drm_connector_atomic_hdr_metadata_equal(old_state, new_state)) { + if (!drm_connector_atomic_hdr_metadata_equal(old_state, new_state) || + old_state->content_type != new_state->content_type) { crtc_state = drm_atomic_get_crtc_state(state, crtc); if (IS_ERR(crtc_state)) return PTR_ERR(crtc_state); @@ -2619,6 +2623,8 @@ static int dw_hdmi_connector_create(struct dw_hdmi *hdmi) drm_connector_attach_max_bpc_property(connector, 8, 16); + drm_connector_attach_content_type_property(connector); + if (hdmi->version >= 0x200a && hdmi->plat_data->use_drm_infoframe) drm_connector_attach_hdr_output_metadata_property(connector); From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Fri, 20 Dec 2019 08:12:43 +0000 Subject: [PATCH] WIP: drm/rockchip: add yuv444 support --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 29 ++++++++++++++++++++- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 29 +++++++++++++++++++++ drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 6 +++++ drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 19 ++++++++++++++ 4 files changed, 82 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 89424c5bc24a..05de2052d95d 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -68,6 +68,7 @@ struct rockchip_hdmi_chip_data { int lcdsel_grf_reg; u32 lcdsel_big; u32 lcdsel_lit; + bool ycbcr_444_allowed; }; struct rockchip_hdmi { @@ -395,10 +396,22 @@ static bool is_rgb(u32 format) } } +static bool is_yuv444(u32 format) +{ + switch (format) { + case MEDIA_BUS_FMT_YUV10_1X30: + case MEDIA_BUS_FMT_YUV8_1X24: + return true; + default: + return false; + } +} + static bool is_10bit(u32 format) { switch (format) { case MEDIA_BUS_FMT_RGB101010_1X30: + case MEDIA_BUS_FMT_YUV10_1X30: return true; default: return false; @@ -415,12 +428,22 @@ dw_hdmi_rockchip_bridge_atomic_check(struct drm_bridge *bridge, struct drm_atomic_state *state = bridge_state->base.state; struct drm_crtc_state *old_crtc_state; struct rockchip_crtc_state *old_state; + struct drm_bridge *next_bridge; + struct drm_bridge_state *next_bridge_state; u32 format = bridge_state->output_bus_cfg.format; s->output_mode = ROCKCHIP_OUT_MODE_AAAA; s->output_type = DRM_MODE_CONNECTOR_HDMIA; s->output_bpc = 10; s->bus_format = format; + + next_bridge = drm_bridge_get_next_bridge(bridge); + if (next_bridge) { + next_bridge_state = drm_atomic_get_new_bridge_state(state, + next_bridge); + format = next_bridge_state->output_bus_cfg.format; + } + s->bus_width = is_10bit(format) ? 10 : 8; old_crtc_state = drm_atomic_get_old_crtc_state(state, conn_state->crtc); @@ -454,7 +477,10 @@ static u32 *dw_hdmi_rockchip_get_input_bus_fmts(struct drm_bridge *bridge, if (!has_10bit && is_10bit(output_fmt)) return NULL; - if (!is_rgb(output_fmt)) + if (is_yuv444(output_fmt)) { + if (!hdmi->chip_data->ycbcr_444_allowed) + return NULL; + } else if (!is_rgb(output_fmt)) return NULL; input_fmt = kzalloc(sizeof(*input_fmt), GFP_KERNEL); @@ -604,6 +630,7 @@ static const struct dw_hdmi_phy_ops rk3328_hdmi_phy_ops = { static struct rockchip_hdmi_chip_data rk3328_chip_data = { .lcdsel_grf_reg = -1, + .ycbcr_444_allowed = true, }; static const struct dw_hdmi_plat_data rk3328_hdmi_drv_data = { diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index eadf1b0f1704..0e4eca0d5121 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -347,6 +347,17 @@ static int vop_convert_afbc_format(uint32_t format) return -EINVAL; } +static bool is_yuv_output(uint32_t bus_format) +{ + switch (bus_format) { + case MEDIA_BUS_FMT_YUV8_1X24: + case MEDIA_BUS_FMT_YUV10_1X30: + return true; + default: + return false; + } +} + static uint16_t scl_vop_cal_scale(enum scale_mode mode, uint32_t src, uint32_t dst, bool is_horizontal, int vsu_mode, int *vskiplines) @@ -1455,6 +1466,7 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc, u16 vact_end = vact_st + vdisplay; uint32_t pin_pol, val; int dither_bpc = s->output_bpc ? s->output_bpc : 10; + bool yuv_output = is_yuv_output(s->bus_format); int ret; if (old_state && old_state->self_refresh_active) { @@ -1520,6 +1532,8 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc, !(vop_data->feature & VOP_FEATURE_OUTPUT_RGB10)) s->output_mode = ROCKCHIP_OUT_MODE_P888; + VOP_REG_SET(vop, common, dsp_data_swap, yuv_output ? 2 : 0); + if (s->output_mode == ROCKCHIP_OUT_MODE_AAAA && dither_bpc <= 8) VOP_REG_SET(vop, common, pre_dither_down, 1); else @@ -1535,6 +1549,21 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc, VOP_REG_SET(vop, common, out_mode, s->output_mode); + VOP_REG_SET(vop, common, overlay_mode, yuv_output); + VOP_REG_SET(vop, common, dsp_out_yuv, yuv_output); + + /* + * Background color is 10bit depth if vop version >= 3.5 + */ + if (!yuv_output) + val = 0; + else if (VOP_MAJOR(vop_data->version) == 3 && + VOP_MINOR(vop_data->version) >= 5) + val = 0x20010200; + else + val = 0x801080; + VOP_REG_SET(vop, common, dsp_background, val); + VOP_REG_SET(vop, modeset, htotal_pw, (htotal << 16) | hsync_len); val = hact_st << 16; val |= hact_end; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h index ca4e2b7415fe..47ad74ef1afb 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h @@ -119,10 +119,16 @@ struct vop_common { struct vop_reg mmu_en; struct vop_reg out_mode; struct vop_reg standby; + + struct vop_reg overlay_mode; + struct vop_reg dsp_data_swap; + struct vop_reg dsp_out_yuv; + struct vop_reg dsp_background; }; struct vop_misc { struct vop_reg global_regdone_en; + struct vop_reg win_channel[4]; }; struct vop_intr { diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c index a2b281e290e0..b16a4c42773c 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c @@ -705,6 +705,11 @@ static const struct vop_common rk3288_common = { .dsp_blank = VOP_REG(RK3288_DSP_CTRL0, 0x3, 18), .out_mode = VOP_REG(RK3288_DSP_CTRL0, 0xf, 0), .cfg_done = VOP_REG_SYNC(RK3288_REG_CFG_DONE, 0x1, 0), + + .overlay_mode = VOP_REG(RK3288_SYS_CTRL, 0x1, 16), + .dsp_data_swap = VOP_REG(RK3288_DSP_CTRL0, 0x1f, 12), + .dsp_out_yuv = VOP_REG(RK3288_POST_SCL_CTRL, 0x1, 2), + .dsp_background = VOP_REG(RK3288_DSP_BG, 0xffffffff, 0), }; /* @@ -926,6 +931,11 @@ static const struct vop_common rk3399_common = { .dsp_blank = VOP_REG(RK3399_DSP_CTRL0, 0x3, 18), .out_mode = VOP_REG(RK3399_DSP_CTRL0, 0xf, 0), .cfg_done = VOP_REG_SYNC(RK3399_REG_CFG_DONE, 0x1, 0), + + .overlay_mode = VOP_REG(RK3399_SYS_CTRL, 0x1, 16), + .dsp_data_swap = VOP_REG(RK3399_DSP_CTRL0, 0x1f, 12), + .dsp_out_yuv = VOP_REG(RK3288_POST_SCL_CTRL, 0x1, 2), + .dsp_background = VOP_REG(RK3288_DSP_BG, 0xffffffff, 0), }; static const struct vop_yuv2yuv_phy rk3399_yuv2yuv_win01_data = { @@ -1096,6 +1106,10 @@ static const struct vop_output rk3328_output = { static const struct vop_misc rk3328_misc = { .global_regdone_en = VOP_REG(RK3328_SYS_CTRL, 0x1, 11), + + .win_channel[0] = VOP_REG(RK3328_WIN0_CTRL2, 0xff, 0), + .win_channel[1] = VOP_REG(RK3328_WIN1_CTRL2, 0xff, 0), + .win_channel[2] = VOP_REG(RK3328_WIN2_CTRL2, 0xff, 0), }; static const struct vop_common rk3328_common = { @@ -1108,6 +1122,11 @@ static const struct vop_common rk3328_common = { .dsp_blank = VOP_REG(RK3328_DSP_CTRL0, 0x3, 18), .out_mode = VOP_REG(RK3328_DSP_CTRL0, 0xf, 0), .cfg_done = VOP_REG_SYNC(RK3328_REG_CFG_DONE, 0x1, 0), + + .overlay_mode = VOP_REG(RK3328_SYS_CTRL, 0x1, 16), + .dsp_data_swap = VOP_REG(RK3328_DSP_CTRL0, 0x1f, 12), + .dsp_out_yuv = VOP_REG(RK3328_POST_SCL_CTRL, 0x1, 2), + .dsp_background = VOP_REG(RK3328_DSP_BG, 0xffffffff, 0), }; static const struct vop_intr rk3328_vop_intr = { From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Fri, 20 Dec 2019 08:12:43 +0000 Subject: [PATCH] WIP: drm/rockchip: add yuv420 support --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 22 +++++++++++++++++++++ drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 19 +++++++++++++++++- drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 10 ++++++---- drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 2 ++ 4 files changed, 48 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 05de2052d95d..cb201612199f 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -407,9 +407,21 @@ static bool is_yuv444(u32 format) } } +static bool is_yuv420(u32 format) +{ + switch (format) { + case MEDIA_BUS_FMT_UYYVYY10_0_5X30: + case MEDIA_BUS_FMT_UYYVYY8_0_5X24: + return true; + default: + return false; + } +} + static bool is_10bit(u32 format) { switch (format) { + case MEDIA_BUS_FMT_UYYVYY10_0_5X30: case MEDIA_BUS_FMT_RGB101010_1X30: case MEDIA_BUS_FMT_YUV10_1X30: return true; @@ -446,6 +458,11 @@ dw_hdmi_rockchip_bridge_atomic_check(struct drm_bridge *bridge, s->bus_width = is_10bit(format) ? 10 : 8; + if (is_yuv420(format)) { + s->output_mode = ROCKCHIP_OUT_MODE_YUV420; + s->bus_width /= 2; + } + old_crtc_state = drm_atomic_get_old_crtc_state(state, conn_state->crtc); if (old_crtc_state && !crtc_state->mode_changed) { old_state = to_rockchip_crtc_state(old_crtc_state); @@ -466,6 +483,7 @@ static u32 *dw_hdmi_rockchip_get_input_bus_fmts(struct drm_bridge *bridge, { struct rockchip_hdmi *hdmi = to_rockchip_hdmi(bridge); struct drm_encoder *encoder = bridge->encoder; + struct drm_connector *connector = conn_state->connector; u32 *input_fmt; bool has_10bit = true; @@ -480,6 +498,9 @@ static u32 *dw_hdmi_rockchip_get_input_bus_fmts(struct drm_bridge *bridge, if (is_yuv444(output_fmt)) { if (!hdmi->chip_data->ycbcr_444_allowed) return NULL; + } else if (is_yuv420(output_fmt)) { + if (!connector->ycbcr_420_allowed) + return NULL; } else if (!is_rgb(output_fmt)) return NULL; @@ -640,6 +661,7 @@ static const struct dw_hdmi_plat_data rk3328_hdmi_drv_data = { .phy_name = "inno_dw_hdmi_phy2", .phy_force_vendor = true, .use_drm_infoframe = true, + .ycbcr_420_allowed = true, }; static struct rockchip_hdmi_chip_data rk3399_chip_data = { diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 0e4eca0d5121..e50f71ad3ceb 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -10,6 +10,7 @@ #include <linux/iopoll.h> #include <linux/kernel.h> #include <linux/log2.h> +#include <linux/media-bus-format.h> #include <linux/module.h> #include <linux/of.h> #include <linux/of_device.h> @@ -348,6 +349,19 @@ static int vop_convert_afbc_format(uint32_t format) } static bool is_yuv_output(uint32_t bus_format) +{ + switch (bus_format) { + case MEDIA_BUS_FMT_YUV8_1X24: + case MEDIA_BUS_FMT_YUV10_1X30: + case MEDIA_BUS_FMT_UYYVYY8_0_5X24: + case MEDIA_BUS_FMT_UYYVYY10_0_5X30: + return true; + default: + return false; + } +} + +static bool bus_fmt_has_uv_swapped(uint32_t bus_format) { switch (bus_format) { case MEDIA_BUS_FMT_YUV8_1X24: @@ -1532,7 +1546,7 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc, !(vop_data->feature & VOP_FEATURE_OUTPUT_RGB10)) s->output_mode = ROCKCHIP_OUT_MODE_P888; - VOP_REG_SET(vop, common, dsp_data_swap, yuv_output ? 2 : 0); + VOP_REG_SET(vop, common, dsp_data_swap, bus_fmt_has_uv_swapped(s->bus_format) ? 2 : 0); if (s->output_mode == ROCKCHIP_OUT_MODE_AAAA && dither_bpc <= 8) VOP_REG_SET(vop, common, pre_dither_down, 1); @@ -1549,6 +1563,9 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc, VOP_REG_SET(vop, common, out_mode, s->output_mode); + VOP_REG_SET(vop, common, dclk_ddr, + s->output_mode == ROCKCHIP_OUT_MODE_YUV420 ? 1 : 0); + VOP_REG_SET(vop, common, overlay_mode, yuv_output); VOP_REG_SET(vop, common, dsp_out_yuv, yuv_output); diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h index 47ad74ef1afb..94a615dca672 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h @@ -121,6 +121,7 @@ struct vop_common { struct vop_reg standby; struct vop_reg overlay_mode; + struct vop_reg dclk_ddr; struct vop_reg dsp_data_swap; struct vop_reg dsp_out_yuv; struct vop_reg dsp_background; @@ -286,11 +287,12 @@ struct vop_data { /* * display output interface supported by rockchip lcdc */ -#define ROCKCHIP_OUT_MODE_P888 0 -#define ROCKCHIP_OUT_MODE_P666 1 -#define ROCKCHIP_OUT_MODE_P565 2 +#define ROCKCHIP_OUT_MODE_P888 0 +#define ROCKCHIP_OUT_MODE_P666 1 +#define ROCKCHIP_OUT_MODE_P565 2 +#define ROCKCHIP_OUT_MODE_YUV420 14 /* for use special outface */ -#define ROCKCHIP_OUT_MODE_AAAA 15 +#define ROCKCHIP_OUT_MODE_AAAA 15 /* output flags */ #define ROCKCHIP_OUTPUT_DSI_DUAL BIT(0) diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c index b16a4c42773c..5463b04240f7 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c @@ -707,6 +707,7 @@ static const struct vop_common rk3288_common = { .cfg_done = VOP_REG_SYNC(RK3288_REG_CFG_DONE, 0x1, 0), .overlay_mode = VOP_REG(RK3288_SYS_CTRL, 0x1, 16), + .dclk_ddr = VOP_REG(RK3288_DSP_CTRL0, 0x1, 8), .dsp_data_swap = VOP_REG(RK3288_DSP_CTRL0, 0x1f, 12), .dsp_out_yuv = VOP_REG(RK3288_POST_SCL_CTRL, 0x1, 2), .dsp_background = VOP_REG(RK3288_DSP_BG, 0xffffffff, 0), @@ -1124,6 +1125,7 @@ static const struct vop_common rk3328_common = { .cfg_done = VOP_REG_SYNC(RK3328_REG_CFG_DONE, 0x1, 0), .overlay_mode = VOP_REG(RK3328_SYS_CTRL, 0x1, 16), + .dclk_ddr = VOP_REG(RK3328_DSP_CTRL0, 0x1, 8), .dsp_data_swap = VOP_REG(RK3328_DSP_CTRL0, 0x1f, 12), .dsp_out_yuv = VOP_REG(RK3328_POST_SCL_CTRL, 0x1, 2), .dsp_background = VOP_REG(RK3328_DSP_BG, 0xffffffff, 0), From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Sat, 15 Aug 2020 23:20:34 +0200 Subject: [PATCH] drm/rockchip: enable ycbcr_420_allowed and ycbcr_444_allowed for RK3228 --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index cb201612199f..8627f6826bfe 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -616,6 +616,7 @@ static const struct dw_hdmi_phy_ops rk3228_hdmi_phy_ops = { static struct rockchip_hdmi_chip_data rk3228_chip_data = { .lcdsel_grf_reg = -1, + .ycbcr_444_allowed = true, }; static const struct dw_hdmi_plat_data rk3228_hdmi_drv_data = { @@ -624,6 +625,7 @@ static const struct dw_hdmi_plat_data rk3228_hdmi_drv_data = { .phy_ops = &rk3228_hdmi_phy_ops, .phy_name = "inno_dw_hdmi_phy2", .phy_force_vendor = true, + .ycbcr_420_allowed = true, }; static struct rockchip_hdmi_chip_data rk3288_chip_data = { From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Mon, 4 Jan 2021 22:38:26 +0100 Subject: [PATCH] drm/rockchip: seperate mode clock validation seperate mode clock validation between internal and external phy types. this will allow modes >= 2160p@50Hz on RK3288/RK3399 (RGB444) Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 8627f6826bfe..e259362f6414 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -326,16 +326,29 @@ dw_hdmi_rockchip_mode_valid(struct dw_hdmi *hdmi, void *data, const struct drm_display_mode *mode) { struct dw_hdmi_plat_data *pdata = (struct dw_hdmi_plat_data *)data; + const struct dw_hdmi_mpll_config *mpll_cfg = pdata->mpll_cfg; int clock = mode->clock; + unsigned int i = 0; if (pdata->ycbcr_420_allowed && drm_mode_is_420(info, mode) && - (info->color_formats & DRM_COLOR_FORMAT_YCBCR420)) + (info->color_formats & DRM_COLOR_FORMAT_YCBCR420)) { clock /= 2; + mpll_cfg = pdata->mpll_cfg_420; + } - if (clock > 340000 || + if ((!mpll_cfg && clock > 340000) || (info->max_tmds_clock && clock > info->max_tmds_clock)) return MODE_CLOCK_HIGH; + if (mpll_cfg) { + while ((clock * 1000) < mpll_cfg[i].mpixelclock && + mpll_cfg[i].mpixelclock != (~0UL)) + i++; + + if (mpll_cfg[i].mpixelclock == (~0UL)) + return MODE_CLOCK_HIGH; + } + return MODE_OK; } static void From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sat, 18 Nov 2017 11:09:39 +0100 Subject: [PATCH] rockchip: vop: force skip lines if image too big --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index e50f71ad3ceb..ef0a078c22f4 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -965,6 +965,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane, int format; int is_yuv = fb->format->is_yuv; int i; + int skiplines = 0; /* * can't update plane when vop is disabled. @@ -983,8 +984,14 @@ static void vop_plane_atomic_update(struct drm_plane *plane, obj = fb->obj[0]; rk_obj = to_rockchip_obj(obj); + /* + * Force skip lines when image is yuv and 3840 width, + * fixes a "jumping" green lines issue on RK3328. + */ actual_w = drm_rect_width(src) >> 16; - actual_h = drm_rect_height(src) >> 16; + if (actual_w == 3840 && is_yuv) + skiplines = 1; + actual_h = drm_rect_height(src) >> (16 + skiplines); act_info = (actual_h - 1) << 16 | ((actual_w - 1) & 0xffff); dsp_info = (drm_rect_height(dest) - 1) << 16; @@ -1026,7 +1033,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane, VOP_WIN_SET(vop, win, format, format); VOP_WIN_SET(vop, win, fmt_10, is_fmt_10(fb->format->format)); - VOP_WIN_SET(vop, win, yrgb_vir, DIV_ROUND_UP(fb->pitches[0], 4)); + VOP_WIN_SET(vop, win, yrgb_vir, DIV_ROUND_UP(fb->pitches[0], 4 >> skiplines)); VOP_WIN_SET(vop, win, yrgb_mst, dma_addr); VOP_WIN_YUV2YUV_SET(vop, win_yuv2yuv, y2r_en, is_yuv); VOP_WIN_SET(vop, win, y_mir_en, @@ -1050,7 +1057,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane, offset += (src->y1 >> 16) * fb->pitches[1] / vsub; dma_addr = rk_uv_obj->dma_addr + offset + fb->offsets[1]; - VOP_WIN_SET(vop, win, uv_vir, DIV_ROUND_UP(fb->pitches[1], 4)); + VOP_WIN_SET(vop, win, uv_vir, DIV_ROUND_UP(fb->pitches[1], 4 >> skiplines)); VOP_WIN_SET(vop, win, uv_mst, dma_addr); for (i = 0; i < NUM_YUV2YUV_COEFFICIENTS; i++) { From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Wed, 8 Jan 2020 21:07:51 +0000 Subject: [PATCH] arm64: dts: rockchip: increase vop clock rate on rk3328 The VOP on RK3328 needs to run at higher rate in order to produce a proper 3840x2160 signal. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- arch/arm64/boot/dts/rockchip/rk3328.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi index d7e44d174d7b..5519347232f6 100644 --- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi @@ -811,8 +811,8 @@ cru: clock-controller@ff440000 { <0>, <24000000>, <24000000>, <24000000>, <15000000>, <15000000>, - <100000000>, <100000000>, - <100000000>, <100000000>, + <300000000>, <100000000>, + <400000000>, <100000000>, <50000000>, <100000000>, <100000000>, <100000000>, <50000000>, <50000000>, From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Sat, 10 Apr 2021 16:54:26 +0200 Subject: [PATCH] drm/bridge: dw-hdmi: fix RGB to YUV color space conversion We are currently providing color space conversion coefficents for RGB to YUV conversion for full range to full range. This is wrong, since we are hardcoding YCC quantization range limited in the AVI infoframe (which is correct according to HDMI specs). This results in to dark colors if this conversion is used. I verfied this by setting YCC quantization range to full in AVI infoframe which resulted in correct colors. Doing this, however, will be ignored by some (most) sinks. This patch fixes this, by providing CSC coefficents which convert RGB full range to YUV limited range for both BT601 and BT709 colorspaces. Fixes: 9aaf880ed4ee ("imx-drm: Add mx6 hdmi transmitter support") Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index ae4c49e84470..92e621f2714f 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -82,15 +82,15 @@ static const u16 csc_coeff_rgb_out_eitu709[3][4] = { }; static const u16 csc_coeff_rgb_in_eitu601[3][4] = { - { 0x2591, 0x1322, 0x074b, 0x0000 }, - { 0x6535, 0x2000, 0x7acc, 0x0200 }, - { 0x6acd, 0x7534, 0x2000, 0x0200 } + { 0x2040, 0x1080, 0x0640, 0x0040 }, + { 0xe880, 0x1c00, 0xfb80, 0x0200 }, + { 0xed80, 0xf680, 0x1c00, 0x0200 } }; static const u16 csc_coeff_rgb_in_eitu709[3][4] = { - { 0x2dc5, 0x0d9b, 0x049e, 0x0000 }, - { 0x62f0, 0x2000, 0x7d11, 0x0200 }, - { 0x6756, 0x78ab, 0x2000, 0x0200 } + { 0x2740, 0x0bc0, 0x0400, 0x0040 }, + { 0xe680, 0x1c00, 0xfd80, 0x0200 }, + { 0xea40, 0xf980, 0x1c00, 0x0200 } }; static const u16 csc_coeff_rgb_full_to_rgb_limited[3][4] = { From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Tue, 23 Mar 2021 19:45:07 +0100 Subject: [PATCH] phy/rockchip: inno-hdmi: add more supported pre-pll rates This adds a bunch of new pixel clock- and tmds rates to the pre-pll table which are required to get more VESA and some DMT rates working. It has been completly re-calculated to match the min- and max-vco of (750 MHz - 3.2 GHz) requirements. If more than one configuration would have been possible the lowest fbdiv and refdiv (and therefore lowest vco rate) has been prefered. It's important to note, that RK3228 version of the phy does not support fractional dividers. In order to support the most possible rates for this version also in both 8-bit and 10-bit variant, some rates are not exact. The maximum deviation of the pixel clock is 0.26, which perfectly fits into vesa DMT recommendation of 0.5%. I tested all possible rates on serveral screens from different manufacturers with both RK3228 and RK3328. Both pre- and post-PLL locking are slighlty faster now. Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/phy/rockchip/phy-rockchip-inno-hdmi.c | 198 +++++++++++++++--- 1 file changed, 173 insertions(+), 25 deletions(-) diff --git a/drivers/phy/rockchip/phy-rockchip-inno-hdmi.c b/drivers/phy/rockchip/phy-rockchip-inno-hdmi.c index 2f01259823ea..1889e78e18ea 100644 --- a/drivers/phy/rockchip/phy-rockchip-inno-hdmi.c +++ b/drivers/phy/rockchip/phy-rockchip-inno-hdmi.c @@ -292,31 +292,179 @@ struct inno_hdmi_phy_drv_data { }; static const struct pre_pll_config pre_pll_cfg_table[] = { - { 27000000, 27000000, 1, 90, 3, 2, 2, 10, 3, 3, 4, 0, 0}, - { 27000000, 33750000, 1, 90, 1, 3, 3, 10, 3, 3, 4, 0, 0}, - { 40000000, 40000000, 1, 80, 2, 2, 2, 12, 2, 2, 2, 0, 0}, - { 59341000, 59341000, 1, 98, 3, 1, 2, 1, 3, 3, 4, 0, 0xE6AE6B}, - { 59400000, 59400000, 1, 99, 3, 1, 1, 1, 3, 3, 4, 0, 0}, - { 59341000, 74176250, 1, 98, 0, 3, 3, 1, 3, 3, 4, 0, 0xE6AE6B}, - { 59400000, 74250000, 1, 99, 1, 2, 2, 1, 3, 3, 4, 0, 0}, - { 74176000, 74176000, 1, 98, 1, 2, 2, 1, 2, 3, 4, 0, 0xE6AE6B}, - { 74250000, 74250000, 1, 99, 1, 2, 2, 1, 2, 3, 4, 0, 0}, - { 74176000, 92720000, 4, 494, 1, 2, 2, 1, 3, 3, 4, 0, 0x816817}, - { 74250000, 92812500, 4, 495, 1, 2, 2, 1, 3, 3, 4, 0, 0}, - {148352000, 148352000, 1, 98, 1, 1, 1, 1, 2, 2, 2, 0, 0xE6AE6B}, - {148500000, 148500000, 1, 99, 1, 1, 1, 1, 2, 2, 2, 0, 0}, - {148352000, 185440000, 4, 494, 0, 2, 2, 1, 3, 2, 2, 0, 0x816817}, - {148500000, 185625000, 4, 495, 0, 2, 2, 1, 3, 2, 2, 0, 0}, - {296703000, 296703000, 1, 98, 0, 1, 1, 1, 0, 2, 2, 0, 0xE6AE6B}, - {297000000, 297000000, 1, 99, 0, 1, 1, 1, 0, 2, 2, 0, 0}, - {296703000, 370878750, 4, 494, 1, 2, 0, 1, 3, 1, 1, 0, 0x816817}, - {297000000, 371250000, 4, 495, 1, 2, 0, 1, 3, 1, 1, 0, 0}, - {593407000, 296703500, 1, 98, 0, 1, 1, 1, 0, 2, 1, 0, 0xE6AE6B}, - {594000000, 297000000, 1, 99, 0, 1, 1, 1, 0, 2, 1, 0, 0}, - {593407000, 370879375, 4, 494, 1, 2, 0, 1, 3, 1, 1, 1, 0x816817}, - {594000000, 371250000, 4, 495, 1, 2, 0, 1, 3, 1, 1, 1, 0}, - {593407000, 593407000, 1, 98, 0, 2, 0, 1, 0, 1, 1, 0, 0xE6AE6B}, - {594000000, 594000000, 1, 99, 0, 2, 0, 1, 0, 1, 1, 0, 0}, + { 25175000, 25175000, 3, 125, 3, 1, 1, 1, 3, 3, 4, 0, 0xe00000}, + { 25175000, 31468750, 1, 41, 0, 3, 3, 1, 3, 3, 4, 0, 0xf5554f}, + { 27000000, 27000000, 1, 36, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, + { 27000000, 33750000, 1, 45, 0, 3, 3, 1, 3, 3, 4, 0, 0x0}, + { 31500000, 31500000, 1, 42, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, + { 31500000, 39375000, 1, 105, 1, 3, 3, 10, 0, 3, 4, 0, 0x0}, + { 33750000, 33750000, 1, 45, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, + { 33750000, 42187500, 1, 169, 2, 3, 3, 15, 0, 3, 4, 0, 0x0}, + { 35500000, 35500000, 1, 71, 2, 2, 2, 6, 0, 3, 4, 0, 0x0}, + { 35500000, 44375000, 1, 74, 3, 1, 1, 25, 0, 1, 1, 0, 0x0}, + { 36000000, 36000000, 1, 36, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, + { 36000000, 45000000, 1, 45, 2, 1, 1, 15, 0, 1, 1, 0, 0x0}, + { 40000000, 40000000, 1, 40, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, + { 40000000, 50000000, 1, 50, 2, 1, 1, 15, 0, 1, 1, 0, 0x0}, + { 49500000, 49500000, 1, 66, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, + { 49500000, 61875000, 1, 165, 1, 3, 3, 10, 0, 3, 4, 0, 0x0}, + { 50000000, 50000000, 1, 50, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, + { 50000000, 62500000, 1, 125, 2, 2, 2, 15, 0, 2, 2, 0, 0x0}, + { 54000000, 54000000, 1, 36, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, + { 54000000, 67500000, 1, 45, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, + { 56250000, 56250000, 1, 75, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, + { 56250000, 70312500, 1, 117, 3, 1, 1, 25, 0, 1, 1, 0, 0x0}, + { 59341000, 59341000, 1, 118, 2, 2, 2, 6, 0, 3, 4, 0, 0xae978d}, + { 59341000, 74176250, 2, 148, 2, 1, 1, 15, 0, 1, 1, 0, 0x5a3d70}, + { 59400000, 59400000, 1, 99, 3, 1, 1, 1, 3, 3, 4, 0, 0x0}, + { 59400000, 74250000, 1, 99, 0, 3, 3, 1, 3, 3, 4, 0, 0x0}, + { 65000000, 65000000, 1, 65, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, + { 65000000, 81250000, 3, 325, 0, 3, 3, 1, 3, 3, 4, 0, 0x0}, + { 68250000, 68250000, 1, 91, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, + { 68250000, 85312500, 1, 142, 3, 1, 1, 25, 0, 1, 1, 0, 0x0}, + { 71000000, 71000000, 1, 71, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, + { 71000000, 88750000, 3, 355, 0, 3, 3, 1, 3, 3, 4, 0, 0x0}, + { 72000000, 72000000, 1, 36, 2, 0, 0, 1, 1, 2, 2, 0, 0x0}, + { 72000000, 90000000, 1, 60, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, + { 73250000, 73250000, 3, 293, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, + { 73250000, 91562500, 1, 61, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, + { 74176000, 74176000, 1, 37, 2, 0, 0, 1, 1, 2, 2, 0, 0x16872b}, + { 74176000, 92720000, 2, 185, 2, 1, 1, 15, 0, 1, 1, 0, 0x70a3d7}, + { 74250000, 74250000, 1, 99, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, + { 74250000, 92812500, 4, 495, 0, 3, 3, 1, 3, 3, 4, 0, 0x0}, + { 75000000, 75000000, 1, 50, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, + { 75000000, 93750000, 1, 125, 0, 3, 3, 1, 3, 3, 4, 0, 0x0}, + { 78750000, 78750000, 1, 105, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, + { 78750000, 98437500, 1, 164, 3, 1, 1, 25, 0, 1, 1, 0, 0x0}, + { 79500000, 79500000, 1, 53, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, + { 79500000, 99375000, 1, 199, 2, 2, 2, 15, 0, 2, 2, 0, 0x0}, + { 83500000, 83500000, 2, 167, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, + { 83500000, 104375000, 1, 104, 2, 1, 1, 15, 0, 1, 1, 0, 0x600000}, + { 85500000, 85500000, 1, 57, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, + { 85500000, 106875000, 1, 178, 3, 1, 1, 25, 0, 1, 1, 0, 0x0}, + { 85750000, 85750000, 3, 343, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, + { 85750000, 107187500, 1, 143, 0, 3, 3, 1, 3, 3, 4, 0, 0x0}, + { 88750000, 88750000, 3, 355, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, + { 88750000, 110937500, 1, 110, 2, 1, 1, 15, 0, 1, 1, 0, 0xf00000}, + { 94500000, 94500000, 1, 63, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, + { 94500000, 118125000, 1, 197, 3, 1, 1, 25, 0, 1, 1, 0, 0x0}, + {101000000, 101000000, 1, 101, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, + {101000000, 126250000, 1, 42, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, + {102250000, 102250000, 4, 409, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, + {102250000, 127812500, 1, 128, 2, 1, 1, 15, 0, 1, 1, 0, 0x0}, + {106500000, 106500000, 1, 71, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, + {106500000, 133125000, 1, 133, 2, 1, 1, 15, 0, 1, 1, 0, 0x0}, + {108000000, 108000000, 1, 36, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, + {108000000, 135000000, 1, 45, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, + {115500000, 115500000, 1, 77, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, + {115500000, 144375000, 1, 48, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, + {117500000, 117500000, 2, 235, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, + {117500000, 146875000, 1, 49, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, + {119000000, 119000000, 1, 119, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, + {119000000, 148750000, 3, 148, 0, 1, 1, 1, 3, 1, 1, 0, 0xc00000}, + {121750000, 121750000, 4, 487, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, + {121750000, 152187500, 1, 203, 0, 3, 3, 1, 3, 3, 4, 0, 0x0}, + {122500000, 122500000, 2, 245, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, + {122500000, 153125000, 1, 51, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, + {135000000, 135000000, 1, 45, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, + {135000000, 168750000, 1, 169, 2, 1, 1, 15, 0, 1, 1, 0, 0x0}, + {136750000, 136750000, 1, 68, 2, 0, 0, 1, 1, 2, 2, 0, 0x600000}, + {136750000, 170937500, 1, 113, 0, 2, 2, 1, 3, 2, 2, 0, 0xf5554f}, + {140250000, 140250000, 2, 187, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, + {140250000, 175312500, 1, 117, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, + {146250000, 146250000, 2, 195, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, + {146250000, 182812500, 1, 61, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, + {148250000, 148250000, 3, 222, 2, 0, 0, 1, 1, 2, 2, 0, 0x600000}, + {148250000, 185312500, 1, 123, 0, 2, 2, 1, 3, 2, 2, 0, 0x8aaab0}, + {148352000, 148352000, 2, 148, 2, 0, 0, 1, 1, 2, 2, 0, 0x5a1cac}, + {148352000, 185440000, 3, 185, 0, 1, 1, 1, 3, 1, 1, 0, 0x70a3d7}, + {148500000, 148500000, 1, 99, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, + {148500000, 185625000, 4, 495, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, + {154000000, 154000000, 1, 77, 2, 0, 0, 1, 1, 2, 2, 0, 0x0}, + {154000000, 192500000, 1, 64, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, + {156000000, 156000000, 1, 52, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, + {156000000, 195000000, 1, 65, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, + {156750000, 156750000, 2, 209, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, + {156750000, 195937500, 1, 196, 2, 1, 1, 15, 0, 1, 1, 0, 0x0}, + {157000000, 157000000, 2, 157, 2, 0, 0, 1, 1, 2, 2, 0, 0x0}, + {157000000, 196250000, 1, 131, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, + {157500000, 157500000, 1, 105, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, + {157500000, 196875000, 1, 197, 2, 1, 1, 15, 0, 1, 1, 0, 0x0}, + {162000000, 162000000, 1, 54, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, + {162000000, 202500000, 2, 135, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, + {175500000, 175500000, 1, 117, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, + {175500000, 219375000, 1, 73, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, + {179500000, 179500000, 3, 359, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, + {179500000, 224375000, 1, 75, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, + {182750000, 182750000, 1, 91, 2, 0, 0, 1, 1, 2, 2, 0, 0x600000}, + {182750000, 228437500, 1, 152, 0, 2, 2, 1, 3, 2, 2, 0, 0x4aaab0}, + {182750000, 228437500, 1, 152, 0, 2, 2, 1, 3, 2, 2, 0, 0x4aaab0}, + {187000000, 187000000, 2, 187, 2, 0, 0, 1, 1, 2, 2, 0, 0x0}, + {187000000, 233750000, 1, 39, 0, 0, 0, 1, 3, 0, 0, 1, 0x0}, + {187250000, 187250000, 3, 280, 2, 0, 0, 1, 1, 2, 2, 0, 0xe00000}, + {187250000, 234062500, 1, 156, 0, 2, 2, 1, 3, 2, 2, 0, 0xaaab0}, + {189000000, 189000000, 1, 63, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, + {189000000, 236250000, 1, 79, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, + {193250000, 193250000, 3, 289, 2, 0, 0, 1, 1, 2, 2, 0, 0xe00000}, + {193250000, 241562500, 1, 161, 0, 2, 2, 1, 3, 2, 2, 0, 0xaaab0}, + {202500000, 202500000, 2, 135, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, + {202500000, 253125000, 1, 169, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, + {204750000, 204750000, 4, 273, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, + {204750000, 255937500, 1, 171, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, + {208000000, 208000000, 1, 104, 2, 0, 0, 1, 1, 2, 2, 0, 0x0}, + {208000000, 260000000, 1, 173, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, + {214750000, 214750000, 1, 107, 2, 0, 0, 1, 1, 2, 2, 0, 0x600000}, + {214750000, 268437500, 1, 178, 0, 2, 2, 1, 3, 2, 2, 0, 0xf5554f}, + {218250000, 218250000, 4, 291, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, + {218250000, 272812500, 1, 91, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, + {229500000, 229500000, 2, 153, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, + {229500000, 286875000, 1, 191, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, + {234000000, 234000000, 1, 39, 0, 0, 0, 1, 0, 1, 1, 0, 0x0}, + {234000000, 292500000, 1, 195, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, + {241500000, 241500000, 2, 161, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, + {241500000, 301875000, 1, 201, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, + {245250000, 245250000, 4, 327, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, + {245250000, 306562500, 1, 51, 0, 0, 0, 1, 3, 0, 0, 1, 0x0}, + {245500000, 245500000, 4, 491, 2, 0, 0, 1, 1, 2, 2, 0, 0x0}, + {245500000, 306875000, 1, 51, 0, 0, 0, 1, 3, 0, 0, 1, 0x0}, + {261000000, 261000000, 1, 87, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, + {261000000, 326250000, 1, 109, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, + {268250000, 268250000, 9, 402, 0, 0, 0, 1, 0, 1, 1, 0, 0x600000}, + {268250000, 335312500, 1, 111, 0, 1, 1, 1, 3, 1, 1, 0, 0xc5554f}, + {268500000, 268500000, 2, 179, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, + {268500000, 335625000, 1, 56, 0, 0, 0, 1, 3, 0, 0, 1, 0x0}, + {281250000, 281250000, 4, 375, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, + {281250000, 351562500, 1, 117, 0, 3, 1, 1, 3, 1, 1, 0, 0x0}, + {288000000, 288000000, 1, 48, 0, 0, 0, 1, 0, 1, 1, 0, 0x0}, + {288000000, 360000000, 1, 60, 0, 2, 0, 1, 3, 0, 0, 1, 0x0}, + {296703000, 296703000, 1, 49, 0, 0, 0, 1, 0, 1, 1, 0, 0x7353f7}, + {296703000, 370878750, 1, 123, 0, 3, 1, 1, 3, 1, 1, 0, 0xa051eb}, + {297000000, 297000000, 1, 99, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, + {297000000, 371250000, 4, 495, 0, 3, 1, 1, 3, 1, 1, 0, 0x0}, + {312250000, 312250000, 9, 468, 0, 0, 0, 1, 0, 1, 1, 0, 0x600000}, + {312250000, 390312500, 1, 130, 0, 3, 1, 1, 3, 1, 1, 0, 0x1aaab0}, + {317000000, 317000000, 3, 317, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, + {317000000, 396250000, 1, 66, 0, 2, 0, 1, 3, 0, 0, 1, 0x0}, + {319750000, 319750000, 3, 159, 0, 0, 0, 1, 0, 1, 1, 0, 0xe00000}, + {319750000, 399687500, 3, 199, 0, 2, 0, 1, 3, 0, 0, 1, 0xd80000}, + {333250000, 333250000, 9, 499, 0, 0, 0, 1, 0, 1, 1, 0, 0xe00000}, + {333250000, 416562500, 1, 138, 0, 3, 1, 1, 3, 1, 1, 0, 0xdaaab0}, + {348500000, 348500000, 9, 522, 0, 2, 0, 1, 0, 1, 1, 0, 0xc00000}, + {348500000, 435625000, 1, 145, 0, 3, 1, 1, 3, 1, 1, 0, 0x35554f}, + {356500000, 356500000, 9, 534, 0, 2, 0, 1, 0, 1, 1, 0, 0xc00000}, + {356500000, 445625000, 1, 148, 0, 3, 1, 1, 3, 1, 1, 0, 0x8aaab0}, + {380500000, 380500000, 9, 570, 0, 2, 0, 1, 0, 1, 1, 0, 0xc00000}, + {380500000, 475625000, 1, 158, 0, 3, 1, 1, 3, 1, 1, 0, 0x8aaab0}, + {443250000, 443250000, 1, 73, 0, 2, 0, 1, 0, 1, 1, 0, 0xe00000}, + {443250000, 554062500, 1, 92, 0, 2, 0, 1, 3, 0, 0, 1, 0x580000}, + {505250000, 505250000, 9, 757, 0, 2, 0, 1, 0, 1, 1, 0, 0xe00000}, + {552750000, 552750000, 3, 276, 0, 2, 0, 1, 0, 1, 1, 0, 0x600000}, + {593407000, 296703500, 3, 296, 0, 1, 1, 1, 0, 1, 1, 0, 0xb41893}, + {593407000, 370879375, 4, 494, 0, 3, 1, 1, 3, 0, 0, 1, 0x817e4a}, + {593407000, 593407000, 3, 296, 0, 2, 0, 1, 0, 1, 1, 0, 0xb41893}, + {594000000, 297000000, 1, 99, 0, 1, 1, 1, 0, 1, 1, 0, 0x0}, + {594000000, 371250000, 4, 495, 0, 3, 1, 1, 3, 0, 0, 1, 0x0}, + {594000000, 594000000, 1, 99, 0, 2, 0, 1, 0, 1, 1, 0, 0x0}, { /* sentinel */ } }; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Tue, 1 Jun 2021 19:24:37 +0200 Subject: [PATCH] drm/rockchip: allow 4096px width modes There is not reason to limit vop output to 3840px width modes. Also drop the limitation from dw_hdmi_rockchip_mode_valid, since the max dimenstions of the actual vop version is validated in vop_crtc_mode_valid anyways. Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index ef0a078c22f4..49619f794061 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -424,8 +424,8 @@ static void scl_vop_cal_scl_fac(struct vop *vop, const struct vop_win_data *win, if (info->is_yuv) is_yuv = true; - if (dst_w > 3840) { - DRM_DEV_ERROR(vop->dev, "Maximum dst width (3840) exceeded\n"); + if (dst_w > 4096) { + DRM_DEV_ERROR(vop->dev, "Maximum dst width (4096) exceeded\n"); return; } From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Tue, 1 Oct 2019 20:52:42 +0000 Subject: [PATCH] media: cec-adap: add debounce support when setting an invalid phys addr When EDID is refreshed, HDMI cable is unplugged/replugged or an AVR is power cycled the CEC phys addr gets invalidated. This can cause some disruption of CEC communication when adapter is being reconfigured. Add a debounce_ms module option that can be used to debounce setting an invalid phys addr. Default is not to use debouncing. Using a configured debounce_ms of e.g. 5000 ms, cec reconfiguring could be avoided when AVR was power cycled on my setup. Power off AVR (default cec.debounce_ms=0): [ 101.536866] cec-dw_hdmi: new physical address f.f.f.f [ 102.495686] cec-dw_hdmi: new physical address 2.1.0.0 [ 102.495913] cec-dw_hdmi: physical address: 2.1.0.0, claim 1 logical addresses [ 102.628574] cec-dw_hdmi: config: la 1 pa 2.1.0.0 [ 105.130115] cec-dw_hdmi: new physical address f.f.f.f [ 106.979705] cec-dw_hdmi: new physical address 2.1.0.0 [ 106.979872] cec-dw_hdmi: physical address: 2.1.0.0, claim 1 logical addresses [ 107.112399] cec-dw_hdmi: config: la 1 pa 2.1.0.0 [ 108.979408] cec-dw_hdmi: reported physical address 2.0.0.0 for logical address 5 [ 109.205386] cec-dw_hdmi: reported physical address 2.0.0.0 for logical address 11 Power on AVR (default cec.debounce_ms=0): [ 158.398447] cec-dw_hdmi: new physical address f.f.f.f [ 161.977714] cec-dw_hdmi: new physical address 2.1.0.0 [ 161.978766] cec-dw_hdmi: physical address: 2.1.0.0, claim 1 logical addresses [ 162.115624] cec-dw_hdmi: config: la 1 pa 2.1.0.0 [ 162.402750] cec-dw_hdmi: new physical address f.f.f.f [ 162.403389] cec-dw_hdmi: cec_transmit_msg_fh: adapter is unconfigured [ 162.886757] cec-dw_hdmi: new physical address 2.1.0.0 [ 162.886964] cec-dw_hdmi: physical address: 2.1.0.0, claim 1 logical addresses [ 163.510725] cec-dw_hdmi: config: la 1 pa 2.1.0.0 [ 173.034200] cec-dw_hdmi: message 10 89 02 05 timed out Power off AVR (cec.debounce_ms=5000): [ 251.720471] cec-dw_hdmi: reported physical address 2.0.0.0 for logical address 5 [ 251.922432] cec-dw_hdmi: reported physical address 2.0.0.0 for logical address 11 Power on AVR (cec.debounce_ms=5000): [ 291.154262] cec-dw_hdmi: reported physical address 2.0.0.0 for logical address 5 [ 291.296199] cec-dw_hdmi: reported physical address 2.0.0.0 for logical address 11 Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/media/cec/core/cec-adap.c | 9 ++++++++- drivers/media/cec/core/cec-core.c | 18 ++++++++++++++++++ drivers/media/cec/core/cec-priv.h | 1 + include/media/cec.h | 2 ++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/drivers/media/cec/core/cec-adap.c b/drivers/media/cec/core/cec-adap.c index 41a79293ee02..542ab1425339 100644 --- a/drivers/media/cec/core/cec-adap.c +++ b/drivers/media/cec/core/cec-adap.c @@ -1674,8 +1674,15 @@ void cec_s_phys_addr(struct cec_adapter *adap, u16 phys_addr, bool block) if (IS_ERR_OR_NULL(adap)) return; + cancel_delayed_work_sync(&adap->debounce_work); + mutex_lock(&adap->lock); - __cec_s_phys_addr(adap, phys_addr, block); + if (cec_debounce_ms > 0 && !block && phys_addr == CEC_PHYS_ADDR_INVALID && + adap->phys_addr != phys_addr) + schedule_delayed_work(&adap->debounce_work, + msecs_to_jiffies(cec_debounce_ms)); + else + __cec_s_phys_addr(adap, phys_addr, block); mutex_unlock(&adap->lock); } EXPORT_SYMBOL_GPL(cec_s_phys_addr); diff --git a/drivers/media/cec/core/cec-core.c b/drivers/media/cec/core/cec-core.c index af358e901b5f..bece8c56e5af 100644 --- a/drivers/media/cec/core/cec-core.c +++ b/drivers/media/cec/core/cec-core.c @@ -40,6 +40,10 @@ static bool debug_phys_addr; module_param(debug_phys_addr, bool, 0644); MODULE_PARM_DESC(debug_phys_addr, "add CEC_CAP_PHYS_ADDR if set"); +int cec_debounce_ms; +module_param_named(debounce_ms, cec_debounce_ms, int, 0644); +MODULE_PARM_DESC(debounce_ms, "debounce invalid phys addr"); + static dev_t cec_dev_t; /* Active devices */ @@ -188,6 +192,8 @@ static void cec_devnode_unregister(struct cec_adapter *adap) mutex_unlock(&devnode->lock); + cancel_delayed_work_sync(&adap->debounce_work); + mutex_lock(&adap->lock); __cec_s_phys_addr(adap, CEC_PHYS_ADDR_INVALID, false); __cec_s_log_addrs(adap, NULL, false); @@ -246,6 +252,17 @@ static const struct file_operations cec_error_inj_fops = { }; #endif +static void cec_s_phys_addr_debounce(struct work_struct *work) +{ + struct delayed_work *delayed_work = to_delayed_work(work); + struct cec_adapter *adap = + container_of(delayed_work, struct cec_adapter, debounce_work); + + mutex_lock(&adap->lock); + __cec_s_phys_addr(adap, CEC_PHYS_ADDR_INVALID, false); + mutex_unlock(&adap->lock); +} + struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops, void *priv, const char *name, u32 caps, u8 available_las) @@ -283,6 +300,7 @@ struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops, INIT_LIST_HEAD(&adap->transmit_queue); INIT_LIST_HEAD(&adap->wait_queue); init_waitqueue_head(&adap->kthread_waitq); + INIT_DELAYED_WORK(&adap->debounce_work, cec_s_phys_addr_debounce); /* adap->devnode initialization */ INIT_LIST_HEAD(&adap->devnode.fhs); diff --git a/drivers/media/cec/core/cec-priv.h b/drivers/media/cec/core/cec-priv.h index b78df931aa74..ebbea63ea9de 100644 --- a/drivers/media/cec/core/cec-priv.h +++ b/drivers/media/cec/core/cec-priv.h @@ -37,6 +37,7 @@ static inline bool msg_is_raw(const struct cec_msg *msg) /* cec-core.c */ extern int cec_debug; +extern int cec_debounce_ms; int cec_get_device(struct cec_devnode *devnode); void cec_put_device(struct cec_devnode *devnode); diff --git a/include/media/cec.h b/include/media/cec.h index abee41ae02d0..544eedb5d671 100644 --- a/include/media/cec.h +++ b/include/media/cec.h @@ -236,6 +236,8 @@ struct cec_adapter { struct task_struct *kthread; wait_queue_head_t kthread_waitq; + struct delayed_work debounce_work; + const struct cec_adap_ops *ops; void *priv; u32 capabilities; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Fri, 22 Oct 2021 11:17:30 +0200 Subject: [PATCH] WIP: drm/bridge: synopsys: Fix CEC not working after power-cyclying This fixes standby -> power-on on Rockchip platform for, at least, RK3288/RK3328/RK3399 where CEC wasn't working after powering on again. It might differ for other phy implementations: The whole HPD-detection part shoud be reworked and we should in general avoid to rely in RX_SENSE phy status (at least for HDMI), since it differs depending on sink's implementation. Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index 92e621f2714f..7551e3ab77d6 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -3179,12 +3179,6 @@ static irqreturn_t dw_hdmi_irq(int irq, void *dev_id) phy_stat & HDMI_PHY_HPD, phy_stat & HDMI_PHY_RX_SENSE); - if ((phy_stat & (HDMI_PHY_RX_SENSE | HDMI_PHY_HPD)) == 0) { - mutex_lock(&hdmi->cec_notifier_mutex); - cec_notifier_phys_addr_invalidate(hdmi->cec_notifier); - mutex_unlock(&hdmi->cec_notifier_mutex); - } - if (phy_stat & HDMI_PHY_HPD) status = connector_status_connected; @@ -3201,6 +3195,14 @@ static irqreturn_t dw_hdmi_irq(int irq, void *dev_id) drm_helper_hpd_irq_event(hdmi->bridge.dev); drm_bridge_hpd_notify(&hdmi->bridge, status); } + + if (status == connector_status_disconnected && + (phy_stat & HDMI_PHY_RX_SENSE) && + (phy_int_pol & HDMI_PHY_RX_SENSE)) { + mutex_lock(&hdmi->cec_notifier_mutex); + cec_notifier_phys_addr_invalidate(hdmi->cec_notifier); + mutex_unlock(&hdmi->cec_notifier_mutex); + } } hdmi_writeb(hdmi, intr_stat, HDMI_IH_PHY_STAT0); From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Fri, 9 Oct 2020 15:24:53 +0000 Subject: [PATCH] drm/rockchip: vop: create planes in window order Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 36 +++------------------ 1 file changed, 4 insertions(+), 32 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 49619f794061..9915bf124374 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -2023,19 +2023,10 @@ static int vop_create_crtc(struct vop *vop) int ret; int i; - /* - * Create drm_plane for primary and cursor planes first, since we need - * to pass them to drm_crtc_init_with_planes, which sets the - * "possible_crtcs" to the newly initialized crtc. - */ for (i = 0; i < vop_data->win_size; i++) { struct vop_win *vop_win = &vop->win[i]; const struct vop_win_data *win_data = vop_win->data; - if (win_data->type != DRM_PLANE_TYPE_PRIMARY && - win_data->type != DRM_PLANE_TYPE_CURSOR) - continue; - ret = drm_universal_plane_init(vop->drm_dev, &vop_win->base, 0, &vop_plane_funcs, win_data->phy->data_formats, @@ -2068,32 +2059,13 @@ static int vop_create_crtc(struct vop *vop) drm_crtc_enable_color_mgmt(crtc, 0, false, vop_data->lut_size); } - /* - * Create drm_planes for overlay windows with possible_crtcs restricted - * to the newly created crtc. - */ + /* Set possible_crtcs to the newly created crtc for overlay windows */ for (i = 0; i < vop_data->win_size; i++) { struct vop_win *vop_win = &vop->win[i]; - const struct vop_win_data *win_data = vop_win->data; - unsigned long possible_crtcs = drm_crtc_mask(crtc); - - if (win_data->type != DRM_PLANE_TYPE_OVERLAY) - continue; - ret = drm_universal_plane_init(vop->drm_dev, &vop_win->base, - possible_crtcs, - &vop_plane_funcs, - win_data->phy->data_formats, - win_data->phy->nformats, - win_data->phy->format_modifiers, - win_data->type, NULL); - if (ret) { - DRM_DEV_ERROR(vop->dev, "failed to init overlay %d\n", - ret); - goto err_cleanup_crtc; - } - drm_plane_helper_add(&vop_win->base, &plane_helper_funcs); - vop_plane_add_properties(&vop_win->base, win_data); + plane = &vop_win->base; + if (plane->type == DRM_PLANE_TYPE_OVERLAY) + plane->possible_crtcs = drm_crtc_mask(crtc); } port = of_get_child_by_name(dev->of_node, "port"); ================================================ FILE: projects/Rockchip/patches/linux/default/linux-1001-v4l2-rockchip.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sat, 23 May 2020 10:16:01 +0000 Subject: [PATCH] WIP: media: rkvdec: pm runtime dont use autosuspend before disable and cleanup Signed-off-by: Jonas Karlman <jonas@kwiboo.se> --- drivers/staging/media/rkvdec/rkvdec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c index 4f5436c89e08..eaf2f133a264 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c @@ -1125,9 +1125,9 @@ static int rkvdec_remove(struct platform_device *pdev) { struct rkvdec_dev *rkvdec = platform_get_drvdata(pdev); - rkvdec_v4l2_cleanup(rkvdec); - pm_runtime_disable(&pdev->dev); pm_runtime_dont_use_autosuspend(&pdev->dev); + pm_runtime_disable(&pdev->dev); + rkvdec_v4l2_cleanup(rkvdec); return 0; } From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Randy Li <ayaka@soulik.info> Date: Sun, 6 Jan 2019 01:48:37 +0800 Subject: [PATCH] soc: rockchip: power-domain: export idle request We need to put the power status of HEVC IP into IDLE unless we can't reset that IP or the SoC would crash down. rockchip_pmu_idle_request(dev, true)---> enter idle rockchip_pmu_idle_request(dev, false)---> exit idle Signed-off-by: Caesar Wang <wxt@rock-chips.com> Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> Signed-off-by: Randy Li <ayaka@soulik.info> --- drivers/soc/rockchip/pm_domains.c | 23 +++++++++++++++++++++++ include/linux/rockchip_pmu.h | 15 +++++++++++++++ include/soc/rockchip/pm_domains.h | 6 ++++++ 3 files changed, 44 insertions(+) create mode 100644 include/linux/rockchip_pmu.h diff --git a/drivers/soc/rockchip/pm_domains.c b/drivers/soc/rockchip/pm_domains.c index 89795abac951..ffb5d62c9d52 100644 --- a/drivers/soc/rockchip/pm_domains.c +++ b/drivers/soc/rockchip/pm_domains.c @@ -309,6 +309,29 @@ static int rockchip_pmu_set_idle_request(struct rockchip_pm_domain *pd, return 0; } +int rockchip_pmu_idle_request(struct device *dev, bool idle) +{ + struct generic_pm_domain *genpd; + struct rockchip_pm_domain *pd; + int ret; + + if (IS_ERR_OR_NULL(dev)) + return -EINVAL; + + if (IS_ERR_OR_NULL(dev->pm_domain)) + return -EINVAL; + + genpd = pd_to_genpd(dev->pm_domain); + pd = to_rockchip_pd(genpd); + + mutex_lock(&pd->pmu->mutex); + ret = rockchip_pmu_set_idle_request(pd, idle); + mutex_unlock(&pd->pmu->mutex); + + return ret; +} +EXPORT_SYMBOL(rockchip_pmu_idle_request); + static int rockchip_pmu_save_qos(struct rockchip_pm_domain *pd) { int i; diff --git a/include/linux/rockchip_pmu.h b/include/linux/rockchip_pmu.h new file mode 100644 index 000000000000..720b3314e71a --- /dev/null +++ b/include/linux/rockchip_pmu.h @@ -0,0 +1,15 @@ +/* + * pm_domain.h - Definitions and headers related to device power domains. + * + * Copyright (C) 2017 Randy Li <ayaka@soulik.info>. + * + * This file is released under the GPLv2. + */ + +#ifndef _LINUX_ROCKCHIP_PM_H +#define _LINUX_ROCKCHIP_PM_H +#include <linux/device.h> + +int rockchip_pmu_idle_request(struct device *dev, bool idle); + +#endif /* _LINUX_ROCKCHIP_PM_H */ diff --git a/include/soc/rockchip/pm_domains.h b/include/soc/rockchip/pm_domains.h index 7dbd941fc937..c5a59dd71754 100644 --- a/include/soc/rockchip/pm_domains.h +++ b/include/soc/rockchip/pm_domains.h @@ -10,6 +10,7 @@ int rockchip_pmu_block(void); void rockchip_pmu_unblock(void); +int rockchip_pmu_idle_request(struct device *dev, bool idle); #else /* CONFIG_ROCKCHIP_PM_DOMAINS */ @@ -20,6 +21,11 @@ static inline int rockchip_pmu_block(void) static inline void rockchip_pmu_unblock(void) { } +static inline int rockchip_pmu_idle_request(struct device *dev, bool idle) +{ + return -ENOTSUPP; +} + #endif /* CONFIG_ROCKCHIP_PM_DOMAINS */ #endif /* __SOC_ROCKCHIP_PM_DOMAINS_H__ */ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Wed, 20 May 2020 17:04:47 +0200 Subject: [PATCH] WIP: media: rkvdec: implement reset controls --- .../bindings/media/rockchip,vdec.yaml | 19 +++++++ drivers/staging/media/rkvdec/rkvdec-regs.h | 5 ++ drivers/staging/media/rkvdec/rkvdec.c | 53 +++++++++++++++++++ drivers/staging/media/rkvdec/rkvdec.h | 11 +++- 4 files changed, 87 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/media/rockchip,vdec.yaml b/Documentation/devicetree/bindings/media/rockchip,vdec.yaml index 3bcfb8e12333..dd6958df1de8 100644 --- a/Documentation/devicetree/bindings/media/rockchip,vdec.yaml +++ b/Documentation/devicetree/bindings/media/rockchip,vdec.yaml @@ -53,6 +53,18 @@ properties: iommus: maxItems: 1 + resets: + maxItems: 6 + + reset-names: + items: + - const: video_h + - const: video_a + - const: video_core + - const: video_cabac + - const: niu_a + - const: niu_h + required: - compatible - reg @@ -60,6 +72,8 @@ required: - clocks - clock-names - power-domains + - resets + - reset-names additionalProperties: false @@ -78,6 +92,11 @@ examples: clock-names = "axi", "ahb", "cabac", "core"; power-domains = <&power RK3399_PD_VDU>; iommus = <&vdec_mmu>; + resets = <&cru SRST_H_VDU>, <&cru SRST_A_VDU>, + <&cru SRST_VDU_CORE>, <&cru SRST_VDU_CA>, + <&cru SRST_A_VDU_NOC>, <&cru SRST_H_VDU_NOC>; + reset-names = "video_h", "video_a", "video_core", "video_cabac", + "niu_a", "niu_h"; }; ... diff --git a/drivers/staging/media/rkvdec/rkvdec-regs.h b/drivers/staging/media/rkvdec/rkvdec-regs.h index 15b9bee92016..3acc914888f6 100644 --- a/drivers/staging/media/rkvdec/rkvdec-regs.h +++ b/drivers/staging/media/rkvdec/rkvdec-regs.h @@ -28,6 +28,11 @@ #define RKVDEC_SOFTRST_EN_P BIT(20) #define RKVDEC_FORCE_SOFTRESET_VALID BIT(21) #define RKVDEC_SOFTRESET_RDY BIT(22) +#define RKVDEC_ERR_MASK (RKVDEC_BUS_STA \ + | RKVDEC_ERR_STA \ + | RKVDEC_TIMEOUT_STA \ + | RKVDEC_BUF_EMPTY_STA \ + | RKVDEC_COLMV_REF_ERR_STA ) #define RKVDEC_REG_SYSCTRL 0x008 #define RKVDEC_IN_ENDIAN BIT(0) diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c index eaf2f133a264..f55abb7c377f 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c @@ -10,12 +10,15 @@ */ #include <linux/clk.h> +#include <linux/delay.h> #include <linux/interrupt.h> #include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/pm.h> #include <linux/pm_runtime.h> +#include <linux/reset.h> +#include <linux/rockchip_pmu.h> #include <linux/slab.h> #include <linux/videodev2.h> #include <linux/workqueue.h> @@ -717,6 +720,11 @@ static void rkvdec_job_finish(struct rkvdec_ctx *ctx, pm_runtime_mark_last_busy(rkvdec->dev); pm_runtime_put_autosuspend(rkvdec->dev); + + if (result == VB2_BUF_STATE_ERROR && + rkvdec->reset_mask == RESET_NONE) + rkvdec->reset_mask |= RESET_SOFT; + rkvdec_job_finish_no_pm(ctx, result); } @@ -754,6 +762,33 @@ static void rkvdec_device_run(void *priv) if (WARN_ON(!desc)) return; + if (rkvdec->reset_mask != RESET_NONE) { + + if (rkvdec->reset_mask & RESET_SOFT) { + writel(RKVDEC_SOFTRST_EN_P, + rkvdec->regs + RKVDEC_REG_INTERRUPT); + udelay(RKVDEC_RESET_DELAY); + if (readl(rkvdec->regs + RKVDEC_REG_INTERRUPT) + & RKVDEC_SOFTRESET_RDY) + dev_info_ratelimited(rkvdec->dev, + "softreset failed\n"); + } + + if (rkvdec->reset_mask & RESET_HARD) { + rockchip_pmu_idle_request(rkvdec->dev, true); + ret = reset_control_assert(rkvdec->rstc); + if (!ret) { + udelay(RKVDEC_RESET_DELAY); + ret = reset_control_deassert(rkvdec->rstc); + } + rockchip_pmu_idle_request(rkvdec->dev, false); + if (ret) + dev_notice_ratelimited(rkvdec->dev, + "hardreset failed\n"); + } + rkvdec->reset_mask = RESET_NONE; + pm_runtime_suspend(rkvdec->dev); + } ret = pm_runtime_resume_and_get(rkvdec->dev); if (ret < 0) { @@ -1020,6 +1055,11 @@ static irqreturn_t rkvdec_irq_handler(int irq, void *priv) if (cancel_delayed_work(&rkvdec->watchdog_work)) { struct rkvdec_ctx *ctx; + if (state == VB2_BUF_STATE_ERROR) { + rkvdec->reset_mask |= (status & RKVDEC_ERR_MASK) ? + RESET_HARD : RESET_SOFT; + } + ctx = v4l2_m2m_get_curr_priv(rkvdec->m2m_dev); rkvdec_job_finish(ctx, state); } @@ -1037,6 +1077,7 @@ static void rkvdec_watchdog_func(struct work_struct *work) ctx = v4l2_m2m_get_curr_priv(rkvdec->m2m_dev); if (ctx) { dev_err(rkvdec->dev, "Frame processing timed out!\n"); + rkvdec->reset_mask |= RESET_HARD; writel(RKVDEC_IRQ_DIS, rkvdec->regs + RKVDEC_REG_INTERRUPT); writel(0, rkvdec->regs + RKVDEC_REG_SYSCTRL); rkvdec_job_finish(ctx, VB2_BUF_STATE_ERROR); @@ -1105,6 +1146,18 @@ static int rkvdec_probe(struct platform_device *pdev) return ret; } + + rkvdec->rstc = devm_reset_control_array_get(&pdev->dev, false, true); + if (IS_ERR(rkvdec->rstc)) { + dev_err(&pdev->dev, + "get resets failed %ld\n", PTR_ERR(rkvdec->rstc)); + return PTR_ERR(rkvdec->rstc); + } else { + dev_dbg(&pdev->dev, + "requested %d resets\n", + reset_control_get_count(&pdev->dev)); + } + pm_runtime_set_autosuspend_delay(&pdev->dev, 100); pm_runtime_use_autosuspend(&pdev->dev); pm_runtime_enable(&pdev->dev); diff --git a/drivers/staging/media/rkvdec/rkvdec.h b/drivers/staging/media/rkvdec/rkvdec.h index b9e219438bc9..f02f79c405f0 100644 --- a/drivers/staging/media/rkvdec/rkvdec.h +++ b/drivers/staging/media/rkvdec/rkvdec.h @@ -11,10 +11,11 @@ #ifndef RKVDEC_H_ #define RKVDEC_H_ +#include <linux/clk.h> #include <linux/platform_device.h> +#include <linux/reset.h> #include <linux/videodev2.h> #include <linux/wait.h> -#include <linux/clk.h> #include <media/v4l2-ctrls.h> #include <media/v4l2-device.h> @@ -22,6 +23,12 @@ #include <media/videobuf2-core.h> #include <media/videobuf2-dma-contig.h> +#define RESET_NONE 0 +#define RESET_SOFT BIT(0) +#define RESET_HARD BIT(1) + +#define RKVDEC_RESET_DELAY 5 + struct rkvdec_ctx; struct rkvdec_ctrl_desc { @@ -96,6 +103,8 @@ struct rkvdec_dev { void __iomem *regs; struct mutex vdev_lock; /* serializes ioctls */ struct delayed_work watchdog_work; + struct reset_control *rstc; + u8 reset_mask; }; struct rkvdec_ctx { From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Tue, 18 Aug 2020 11:38:04 +0200 Subject: [PATCH] WIP: arm64: dts: add resets to vdec for RK3399 --- arch/arm64/boot/dts/rockchip/rk3399.dtsi | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi index 980b12cb0a49..6e3149e587c5 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi @@ -1345,6 +1348,11 @@ vdec: video-codec@ff660000 { clock-names = "axi", "ahb", "cabac", "core"; iommus = <&vdec_mmu>; power-domains = <&power RK3399_PD_VDU>; + resets = <&cru SRST_H_VDU>, <&cru SRST_A_VDU>, + <&cru SRST_VDU_CORE>, <&cru SRST_VDU_CA>, + <&cru SRST_A_VDU_NOC>, <&cru SRST_H_VDU_NOC>; + reset-names = "video_h", "video_a", "video_core", "video_cabac", + "niu_a", "niu_h"; }; vdec_mmu: iommu@ff660480 { From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Sat, 21 Aug 2021 16:12:36 +0200 Subject: [PATCH] media: hantro: rockchip: Increase RK3288's max ACLK Required to proper decode H.264@4K Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/media/platform/verisilicon/rockchip_vpu_hw.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/verisilicon/rockchip_vpu_hw.c b/drivers/media/platform/verisilicon/rockchip_vpu_hw.c index 8de6fd2e8eef..002b1a600f93 100644 --- a/drivers/media/platform/verisilicon/rockchip_vpu_hw.c +++ b/drivers/media/platform/verisilicon/rockchip_vpu_hw.c @@ -15,7 +15,8 @@ #include "rockchip_vpu2_regs.h" #define RK3066_ACLK_MAX_FREQ (300 * 1000 * 1000) -#define RK3288_ACLK_MAX_FREQ (400 * 1000 * 1000) +#define RK3288_ACLK_MAX_FREQ (600 * 1000 * 1000) +#define RK3399_ACLK_MAX_FREQ (400 * 1000 * 1000) /* * Supported formats. @@ -346,13 +347,20 @@ static int rk3066_vpu_hw_init(struct hantro_dev *vpu) return 0; } -static int rockchip_vpu_hw_init(struct hantro_dev *vpu) +static int rk3288_vpu_hw_init(struct hantro_dev *vpu) { /* Bump ACLK to max. possible freq. to improve performance. */ clk_set_rate(vpu->clocks[0].clk, RK3288_ACLK_MAX_FREQ); return 0; } +static int rockchip_vpu_hw_init(struct hantro_dev *vpu) +{ + /* Bump ACLK to max. possible freq. to improve performance. */ + clk_set_rate(vpu->clocks[0].clk, RK3399_ACLK_MAX_FREQ); + return 0; +} + static void rk3066_vpu_dec_reset(struct hantro_ctx *ctx) { struct hantro_dev *vpu = ctx->dev; @@ -592,7 +600,7 @@ const struct hantro_variant rk3288_vpu_variant = { .codec_ops = rk3288_vpu_codec_ops, .irqs = rockchip_vpu1_irqs, .num_irqs = ARRAY_SIZE(rockchip_vpu1_irqs), - .init = rockchip_vpu_hw_init, + .init = rk3288_vpu_hw_init, .clk_names = rockchip_vpu_clk_names, .num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names) }; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Sun, 4 Jul 2021 15:19:44 +0200 Subject: [PATCH] media: rkvdec: disable QoS for VP9 (corruptions on RK3328 otherwise) Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/staging/media/rkvdec/rkvdec-regs.h | 2 ++ drivers/staging/media/rkvdec/rkvdec-vp9.c | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/drivers/staging/media/rkvdec/rkvdec-regs.h b/drivers/staging/media/rkvdec/rkvdec-regs.h index 3acc914888f6..265f5234f4eb 100644 --- a/drivers/staging/media/rkvdec/rkvdec-regs.h +++ b/drivers/staging/media/rkvdec/rkvdec-regs.h @@ -222,6 +222,8 @@ #define RKVDEC_REG_H264_ERR_E 0x134 #define RKVDEC_H264_ERR_EN_HIGHBITS(x) ((x) & 0x3fffffff) +#define RKVDEC_QOS_CTRL 0x18C + #define RKVDEC_REG_PREF_LUMA_CACHE_COMMAND 0x410 #define RKVDEC_REG_PREF_CHR_CACHE_COMMAND 0x450 diff --git a/drivers/staging/media/rkvdec/rkvdec-vp9.c b/drivers/staging/media/rkvdec/rkvdec-vp9.c index d8c1c0db15c7..a289bc968e91 100644 --- a/drivers/staging/media/rkvdec/rkvdec-vp9.c +++ b/drivers/staging/media/rkvdec/rkvdec-vp9.c @@ -802,6 +802,7 @@ static int rkvdec_vp9_run(struct rkvdec_ctx *ctx) struct rkvdec_dev *rkvdec = ctx->dev; struct rkvdec_vp9_run run = { }; int ret; + u32 reg; ret = rkvdec_vp9_run_preamble(ctx, &run); if (ret) { @@ -823,6 +824,13 @@ static int rkvdec_vp9_run(struct rkvdec_ctx *ctx) writel(1, rkvdec->regs + RKVDEC_REG_PREF_CHR_CACHE_COMMAND); writel(0xe, rkvdec->regs + RKVDEC_REG_STRMD_ERR_EN); + + /* disable QOS for RK3328 - no effect on other SoCs */ + reg = readl(rkvdec->regs + RKVDEC_QOS_CTRL); + reg |= 0xFFFF; + reg &= (~BIT(12)); + writel(reg, rkvdec->regs + RKVDEC_QOS_CTRL); + /* Start decoding! */ writel(RKVDEC_INTERRUPT_DEC_E | RKVDEC_CONFIG_DEC_CLK_GATE_E | RKVDEC_TIMEOUT_E | RKVDEC_BUF_EMPTY_E, From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Thu, 16 Jun 2022 13:18:22 +0200 Subject: [PATCH] WIP: arm64: dts: add resets to vdec for RK3328 --- arch/arm64/boot/dts/rockchip/rk3328.dtsi | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi index 5519347232f6..431c4ec198be 100644 --- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi @@ -674,6 +674,11 @@ vdec: video-codec@ff360000 { assigned-clocks = <&cru ACLK_RKVDEC>, <&cru SCLK_VDEC_CABAC>, <&cru SCLK_VDEC_CORE>; assigned-clock-rates = <400000000>, <400000000>, <300000000>; + resets = <&cru SRST_VDEC_H>, <&cru SRST_VDEC_A>, + <&cru SRST_VDEC_CORE>, <&cru SRST_VDEC_CABAC>, + <&cru SRST_VDEC_NIU_A>, <&cru SRST_VDEC_NIU_H>; + reset-names = "video_h", "video_a", "video_core", "video_cabac", + "niu_a", "niu_h"; iommus = <&vdec_mmu>; power-domains = <&power RK3328_PD_VIDEO>; }; ================================================ FILE: projects/Rockchip/patches/linux/default/linux-1002-for-libreelec.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Wed, 2 Sep 2020 19:52:02 +0200 Subject: [PATCH] arm64: dts: rockchip: add gpu powerdomain, gpu opp-table and cooling cell for RK3328 Note: since the regulator that supplies the GPU usually also supplies other SoC components, we have to make sure voltage is never lower then 1075 mV - also disable 500 MHz for now, since it will crash if rkvdec is running at the same time (voltage to high) Signed-off-by: Alex Bee <knaerzche@gmail.com> --- .../arm64/boot/dts/rockchip/rk3328-roc-cc.dts | 4 +++ .../arm64/boot/dts/rockchip/rk3328-rock64.dts | 4 +++ arch/arm64/boot/dts/rockchip/rk3328.dtsi | 35 +++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts index aa22a0c22265..51c7723d6762 100644 --- a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts +++ b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts @@ -166,6 +166,10 @@ &gmac2io { status = "okay"; }; +&gpu { + mali-supply = <&vdd_logic>; +}; + &hdmi { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts index f69a38f42d2d..c198a8a7f95a 100644 --- a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts +++ b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts @@ -162,6 +162,10 @@ &gmac2io { status = "okay"; }; +&gpu { + mali-supply = <&vdd_logic>; +}; + &hdmi { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi index 431c4ec198be..eec03adf0902 100644 --- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi @@ -300,6 +300,11 @@ power: power-controller { #address-cells = <1>; #size-cells = <0>; + power-domain@RK3328_PD_GPU { + reg = <RK3328_PD_GPU>; + clocks = <&cru ACLK_GPU>; + #power-domain-cells = <0>; + }; power-domain@RK3328_PD_HEVC { reg = <RK3328_PD_HEVC>; #power-domain-cells = <0>; @@ -539,6 +544,11 @@ map0 { <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; contribution = <4096>; }; + map1 { + trip = <&target>; + cooling-device = <&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + contribution = <4096>; + }; }; }; @@ -620,7 +630,32 @@ gpu: gpu@ff300000 { "ppmmu1"; clocks = <&cru ACLK_GPU>, <&cru ACLK_GPU>; clock-names = "bus", "core"; + operating-points-v2 = <&gpu_opp_table>; + power-domains = <&power RK3328_PD_GPU>; resets = <&cru SRST_GPU_A>; + #cooling-cells = <2>; + }; + + gpu_opp_table: gpu-opp-table { + compatible = "operating-points-v2"; + + opp-200000000 { + opp-hz = /bits/ 64 <200000000>; + opp-microvolt = <1075000>; + }; + opp-300000000 { + opp-hz = /bits/ 64 <300000000>; + opp-microvolt = <1075000>; + }; + opp-400000000 { + opp-hz = /bits/ 64 <400000000>; + opp-microvolt = <1075000>; + }; + opp-500000000 { + opp-hz = /bits/ 64 <500000000>; + opp-microvolt = <1150000>; + status = "disabled"; + }; }; h265e_mmu: iommu@ff330200 { From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Tue, 2 Feb 2021 17:22:21 +0200 Subject: [PATCH] ARM: dts: RK3288 miqi add hdmi sound nodes Signed-off-by: Alex Bee <knaerzche@gmail.com> --- arch/arm/boot/dts/rk3288-miqi.dts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/arch/arm/boot/dts/rk3288-miqi.dts b/arch/arm/boot/dts/rk3288-miqi.dts index 713f55e143c6..8d30c49f406e 100644 --- a/arch/arm/boot/dts/rk3288-miqi.dts +++ b/arch/arm/boot/dts/rk3288-miqi.dts @@ -78,6 +78,21 @@ vcc_sys: vsys-regulator { regulator-always-on; regulator-boot-on; }; + + sound { + compatible = "simple-audio-card"; + simple-audio-card,format = "i2s"; + simple-audio-card,name = "HDMI"; + simple-audio-card,mclk-fs = <512>; + + simple-audio-card,codec { + sound-dai = <&hdmi>; + }; + + simple-audio-card,cpu { + sound-dai = <&i2s>; + }; + }; }; &cpu0 { @@ -284,6 +299,11 @@ &i2c5 { status = "okay"; }; +&i2s { + #sound-dai-cells = <0>; + status = "okay"; +}; + &io_domains { status = "okay"; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Fri, 2 Apr 2021 17:54:22 +0200 Subject: [PATCH] ARM/arm64: dts: rockchip: align sound card names Signed-off-by: Alex Bee <knaerzche@gmail.com> --- arch/arm/boot/dts/rk3288-tinker.dtsi | 2 +- arch/arm64/boot/dts/rockchip/rk3399.dtsi | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm/boot/dts/rk3288-tinker.dtsi b/arch/arm/boot/dts/rk3288-tinker.dtsi index 09618bb7d872..db9106a3dd22 100644 --- a/arch/arm/boot/dts/rk3288-tinker.dtsi +++ b/arch/arm/boot/dts/rk3288-tinker.dtsi @@ -73,7 +73,7 @@ sdio_pwrseq: sdio-pwrseq { sound { compatible = "simple-audio-card"; simple-audio-card,format = "i2s"; - simple-audio-card,name = "rockchip,tinker-codec"; + simple-audio-card,name = "HDMI"; simple-audio-card,mclk-fs = <512>; simple-audio-card,codec { diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi index 093ebe070775..a10fe60b7680 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi @@ -1893,7 +1893,7 @@ hdmi_sound: hdmi-sound { compatible = "simple-audio-card"; simple-audio-card,format = "i2s"; simple-audio-card,mclk-fs = <256>; - simple-audio-card,name = "hdmi-sound"; + simple-audio-card,name = "HDMI"; status = "disabled"; simple-audio-card,cpu { From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sun, 25 Mar 2018 22:17:06 +0200 Subject: [PATCH] ASoC: hdmi-codec: fix channel allocation --- sound/soc/codecs/hdmi-codec.c | 113 ++++++++++++++++------------------ 1 file changed, 52 insertions(+), 61 deletions(-) diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c index 5679102de91f..f0cd183f7873 100644 --- a/sound/soc/codecs/hdmi-codec.c +++ b/sound/soc/codecs/hdmi-codec.c @@ -194,78 +194,69 @@ static const struct snd_pcm_chmap_elem hdmi_codec_8ch_chmaps[] = { */ static const struct hdmi_codec_cea_spk_alloc hdmi_codec_channel_alloc[] = { { .ca_id = 0x00, .n_ch = 2, - .mask = FL | FR}, - /* 2.1 */ - { .ca_id = 0x01, .n_ch = 4, - .mask = FL | FR | LFE}, - /* Dolby Surround */ + .mask = FL | FR }, + { .ca_id = 0x03, .n_ch = 4, + .mask = FL | FR | LFE | FC }, { .ca_id = 0x02, .n_ch = 4, .mask = FL | FR | FC }, - /* surround51 */ + { .ca_id = 0x01, .n_ch = 4, + .mask = FL | FR | LFE }, { .ca_id = 0x0b, .n_ch = 6, - .mask = FL | FR | LFE | FC | RL | RR}, - /* surround40 */ - { .ca_id = 0x08, .n_ch = 6, - .mask = FL | FR | RL | RR }, - /* surround41 */ - { .ca_id = 0x09, .n_ch = 6, - .mask = FL | FR | LFE | RL | RR }, - /* surround50 */ + .mask = FL | FR | LFE | FC | RL | RR }, { .ca_id = 0x0a, .n_ch = 6, .mask = FL | FR | FC | RL | RR }, - /* 6.1 */ - { .ca_id = 0x0f, .n_ch = 8, - .mask = FL | FR | LFE | FC | RL | RR | RC }, - /* surround71 */ + { .ca_id = 0x09, .n_ch = 6, + .mask = FL | FR | LFE | RL | RR }, + { .ca_id = 0x08, .n_ch = 6, + .mask = FL | FR | RL | RR }, + { .ca_id = 0x07, .n_ch = 6, + .mask = FL | FR | LFE | FC | RC }, + { .ca_id = 0x06, .n_ch = 6, + .mask = FL | FR | FC | RC }, + { .ca_id = 0x05, .n_ch = 6, + .mask = FL | FR | LFE | RC }, + { .ca_id = 0x04, .n_ch = 6, + .mask = FL | FR | RC }, { .ca_id = 0x13, .n_ch = 8, .mask = FL | FR | LFE | FC | RL | RR | RLC | RRC }, - /* others */ - { .ca_id = 0x03, .n_ch = 8, - .mask = FL | FR | LFE | FC }, - { .ca_id = 0x04, .n_ch = 8, - .mask = FL | FR | RC}, - { .ca_id = 0x05, .n_ch = 8, - .mask = FL | FR | LFE | RC }, - { .ca_id = 0x06, .n_ch = 8, - .mask = FL | FR | FC | RC }, - { .ca_id = 0x07, .n_ch = 8, - .mask = FL | FR | LFE | FC | RC }, - { .ca_id = 0x0c, .n_ch = 8, - .mask = FL | FR | RC | RL | RR }, - { .ca_id = 0x0d, .n_ch = 8, - .mask = FL | FR | LFE | RL | RR | RC }, - { .ca_id = 0x0e, .n_ch = 8, - .mask = FL | FR | FC | RL | RR | RC }, - { .ca_id = 0x10, .n_ch = 8, - .mask = FL | FR | RL | RR | RLC | RRC }, - { .ca_id = 0x11, .n_ch = 8, - .mask = FL | FR | LFE | RL | RR | RLC | RRC }, + { .ca_id = 0x1f, .n_ch = 8, + .mask = FL | FR | LFE | FC | RL | RR | FLC | FRC }, { .ca_id = 0x12, .n_ch = 8, .mask = FL | FR | FC | RL | RR | RLC | RRC }, - { .ca_id = 0x14, .n_ch = 8, - .mask = FL | FR | FLC | FRC }, - { .ca_id = 0x15, .n_ch = 8, - .mask = FL | FR | LFE | FLC | FRC }, - { .ca_id = 0x16, .n_ch = 8, - .mask = FL | FR | FC | FLC | FRC }, - { .ca_id = 0x17, .n_ch = 8, - .mask = FL | FR | LFE | FC | FLC | FRC }, - { .ca_id = 0x18, .n_ch = 8, - .mask = FL | FR | RC | FLC | FRC }, - { .ca_id = 0x19, .n_ch = 8, - .mask = FL | FR | LFE | RC | FLC | FRC }, - { .ca_id = 0x1a, .n_ch = 8, - .mask = FL | FR | RC | FC | FLC | FRC }, - { .ca_id = 0x1b, .n_ch = 8, - .mask = FL | FR | LFE | RC | FC | FLC | FRC }, - { .ca_id = 0x1c, .n_ch = 8, - .mask = FL | FR | RL | RR | FLC | FRC }, - { .ca_id = 0x1d, .n_ch = 8, - .mask = FL | FR | LFE | RL | RR | FLC | FRC }, { .ca_id = 0x1e, .n_ch = 8, .mask = FL | FR | FC | RL | RR | FLC | FRC }, - { .ca_id = 0x1f, .n_ch = 8, - .mask = FL | FR | LFE | FC | RL | RR | FLC | FRC }, + { .ca_id = 0x11, .n_ch = 8, + .mask = FL | FR | LFE | RL | RR | RLC | RRC }, + { .ca_id = 0x1d, .n_ch = 8, + .mask = FL | FR | LFE | RL | RR | FLC | FRC }, + { .ca_id = 0x10, .n_ch = 8, + .mask = FL | FR | RL | RR | RLC | RRC }, + { .ca_id = 0x1c, .n_ch = 8, + .mask = FL | FR | RL | RR | FLC | FRC }, + { .ca_id = 0x0f, .n_ch = 8, + .mask = FL | FR | LFE | FC | RL | RR | RC }, + { .ca_id = 0x1b, .n_ch = 8, + .mask = FL | FR | LFE | RC | FC | FLC | FRC }, + { .ca_id = 0x0e, .n_ch = 8, + .mask = FL | FR | FC | RL | RR | RC }, + { .ca_id = 0x1a, .n_ch = 8, + .mask = FL | FR | RC | FC | FLC | FRC }, + { .ca_id = 0x0d, .n_ch = 8, + .mask = FL | FR | LFE | RL | RR | RC }, + { .ca_id = 0x19, .n_ch = 8, + .mask = FL | FR | LFE | RC | FLC | FRC }, + { .ca_id = 0x0c, .n_ch = 8, + .mask = FL | FR | RC | RL | RR }, + { .ca_id = 0x18, .n_ch = 8, + .mask = FL | FR | RC | FLC | FRC }, + { .ca_id = 0x17, .n_ch = 8, + .mask = FL | FR | LFE | FC | FLC | FRC }, + { .ca_id = 0x16, .n_ch = 8, + .mask = FL | FR | FC | FLC | FRC }, + { .ca_id = 0x15, .n_ch = 8, + .mask = FL | FR | LFE | FLC | FRC }, + { .ca_id = 0x14, .n_ch = 8, + .mask = FL | FR | FLC | FRC }, }; struct hdmi_codec_priv { From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Sat, 27 Feb 2021 17:52:02 +0100 Subject: [PATCH] arm64: dts: rockchip: add SPDIF nodes for RK3328 A1 board Signed-off-by: Alex Bee <knaerzche@gmail.com> --- arch/arm64/boot/dts/rockchip/rk3328-a1.dts | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3328-a1.dts b/arch/arm64/boot/dts/rockchip/rk3328-a1.dts index 40bf808642b9..27a1799027c2 100644 --- a/arch/arm64/boot/dts/rockchip/rk3328-a1.dts +++ b/arch/arm64/boot/dts/rockchip/rk3328-a1.dts @@ -57,6 +57,24 @@ ir-receiver { gpios = <&gpio2 RK_PA2 GPIO_ACTIVE_LOW>; linux,rc-map-name = "rc-beelink-gs1"; }; + + spdif_sound: spdif-sound { + compatible = "simple-audio-card"; + simple-audio-card,name = "SPDIF"; + + simple-audio-card,cpu { + sound-dai = <&spdif>; + }; + + simple-audio-card,codec { + sound-dai = <&spdif_dit>; + }; + }; + + spdif_dit: spdif-dit { + compatible = "linux,spdif-dit"; + #sound-dai-cells = <0>; + }; }; &analog_sound { @@ -325,6 +343,11 @@ &sdmmc { status = "okay"; }; +&spdif { + pinctrl-0 = <&spdifm0_tx>; + status = "okay"; +}; + &tsadc { rockchip,hw-tshut-mode = <0>; rockchip,hw-tshut-polarity = <0>; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Sat, 27 Feb 2021 18:01:13 +0100 Subject: [PATCH] arm64: dts: rockchip: Add ir-receiver node for RK3328 ROC CC Signed-off-by: Alex Bee <knaerzche@gmail.com> --- arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts index 51c7723d6762..cf321302daec 100644 --- a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts +++ b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts @@ -88,6 +88,13 @@ vcc_phy: vcc-phy-regulator { regulator-boot-on; }; + ir-receiver { + compatible = "gpio-ir-receiver"; + gpios = <&gpio2 RK_PA2 GPIO_ACTIVE_LOW>; + pinctrl-0 = <&ir_int>; + pinctrl-names = "default"; + }; + leds { compatible = "gpio-leds"; @@ -312,6 +319,13 @@ &io_domains { }; &pinctrl { + + ir { + ir_int: ir-int { + rockchip,pins = <2 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + pmic { pmic_int_l: pmic-int-l { rockchip,pins = <1 RK_PD0 RK_FUNC_GPIO &pcfg_pull_up>; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Mon, 1 Mar 2021 21:24:15 +0100 Subject: [PATCH] ARM: dts: add cec pinctrl for RK3288 miqi board --- arch/arm/boot/dts/rk3288-miqi.dts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm/boot/dts/rk3288-miqi.dts b/arch/arm/boot/dts/rk3288-miqi.dts index 8d30c49f406e..6d90db5a3b75 100644 --- a/arch/arm/boot/dts/rk3288-miqi.dts +++ b/arch/arm/boot/dts/rk3288-miqi.dts @@ -145,6 +145,8 @@ &gpu { &hdmi { ddc-i2c-bus = <&i2c5>; + pinctrl-names = "default"; + pinctrl-0 = <&hdmi_cec_c0>; status = "okay"; }; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Mon, 1 Mar 2021 19:22:15 +0100 Subject: [PATCH] HACK: arm64: dts: enable FE phy for Beelink A1 also --- arch/arm64/boot/dts/rockchip/rk3328-a1.dts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3328-a1.dts b/arch/arm64/boot/dts/rockchip/rk3328-a1.dts index 27a1799027c2..7de9dfa71d89 100644 --- a/arch/arm64/boot/dts/rockchip/rk3328-a1.dts +++ b/arch/arm64/boot/dts/rockchip/rk3328-a1.dts @@ -147,6 +147,14 @@ rtl8211f: ethernet-phy@0 { }; }; +&gmac2phy { + clock_in_out = "output"; + assigned-clock-rate = <50000000>; + assigned-clocks = <&cru SCLK_MAC2PHY>; + assigned-clock-parents = <&cru SCLK_MAC2PHY_SRC>; + status = "okay"; +}; + &gpu { mali-supply = <&vdd_logic>; }; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> 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 c8f44bcb298a..d4280ce4542c 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c @@ -4,6 +4,7 @@ * * Copyright (C) 2015-2017 Russell King. */ +#include <linux/delay.h> #include <linux/interrupt.h> #include <linux/io.h> #include <linux/module.h> @@ -129,8 +130,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_debug("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) { @@ -141,6 +149,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) { @@ -173,6 +185,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) { From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Wed, 5 May 2021 19:11:12 +0200 Subject: [PATCH] arm64: boot: dts: Increase ACLK_PERILP0 clock rate for RK3399 As per vendor kernel. Leaving this clock at the lower rate will result in poor DMA controller performance Signed-off-by: Alex Bee <knaerzche@gmail.com> --- arch/arm64/boot/dts/rockchip/rk3399.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi index a10fe60b7680..dbe6a9cb98a5 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi @@ -1477,7 +1477,7 @@ cru: clock-controller@ff760000 { <1000000000>, <150000000>, <75000000>, <37500000>, - <100000000>, <100000000>, + <300000000>, <100000000>, <50000000>, <600000000>, <100000000>, <50000000>, <400000000>, <400000000>, From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Sat, 21 Aug 2021 17:04:46 +0200 Subject: [PATCH] arm64: dts: rockchip: Enable USB3 for rk3328 Beelink A1 Signed-off-by: Alex Bee <knaerzche@gmail.com> --- arch/arm64/boot/dts/rockchip/rk3328-a1.dts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3328-a1.dts b/arch/arm64/boot/dts/rockchip/rk3328-a1.dts index 7de9dfa71d89..e857e5a727f4 100644 --- a/arch/arm64/boot/dts/rockchip/rk3328-a1.dts +++ b/arch/arm64/boot/dts/rockchip/rk3328-a1.dts @@ -389,6 +389,11 @@ &usb_host0_ehci { status = "okay"; }; +&usbdrd3 { + dr_mode = "host"; + status = "okay"; +}; + &vop { status = "okay"; }; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Sat, 30 Oct 2021 12:19:19 +0200 Subject: [PATCH] WIP: drm: bridge: dw-hdmi: switch from .hw_parmas to .prepare for i2s Seems to be the only way to get AES bits correctly as set by userspace. TODO: check other consequences. Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c index a2f0860b20bb..8961f9c7885d 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c @@ -34,9 +34,9 @@ static inline u8 hdmi_read(struct dw_hdmi_i2s_audio_data *audio, int offset) return audio->read(hdmi, offset); } -static int dw_hdmi_i2s_hw_params(struct device *dev, void *data, - struct hdmi_codec_daifmt *fmt, - struct hdmi_codec_params *hparms) +static int dw_hdmi_i2s_prepare(struct device *dev, void *data, + struct hdmi_codec_daifmt *fmt, + struct hdmi_codec_params *hparms) { struct dw_hdmi_i2s_audio_data *audio = data; struct dw_hdmi *hdmi = audio->hdmi; @@ -178,7 +178,7 @@ static int dw_hdmi_i2s_hook_plugged_cb(struct device *dev, void *data, } static const struct hdmi_codec_ops dw_hdmi_i2s_ops = { - .hw_params = dw_hdmi_i2s_hw_params, + .prepare = dw_hdmi_i2s_prepare, .audio_startup = dw_hdmi_i2s_audio_startup, .audio_shutdown = dw_hdmi_i2s_audio_shutdown, .get_eld = dw_hdmi_i2s_get_eld, From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Sun, 18 Sep 2022 10:35:52 +0200 Subject: [PATCH] arm64: dts: rockchip: Disbake fusb for rk3399-roc-pc As it will lead to an unbootable device in case one if those ports is used to power up the device. See https://lkml.org/lkml/2022/6/20/413 --- arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi index 2f4b1b2e3ac7..7217ead94d39 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi @@ -215,7 +215,7 @@ vdd_log: vdd-log { regulator-name = "vdd_log"; regulator-always-on; regulator-boot-on; - regulator-min-microvolt = <450000>; + regulator-min-microvolt = <430000>; regulator-max-microvolt = <1400000>; pwm-supply = <&vcc3v3_sys>; }; @@ -536,7 +536,7 @@ fusb1: usb-typec@22 { pinctrl-names = "default"; pinctrl-0 = <&fusb1_int>; vbus-supply = <&vcc_vbus_typec1>; - status = "okay"; + status = "disabled"; }; }; @@ -553,7 +553,7 @@ fusb0: usb-typec@22 { pinctrl-names = "default"; pinctrl-0 = <&fusb0_int>; vbus-supply = <&vcc_vbus_typec0>; - status = "okay"; + status = "disabled"; }; mp8859: regulator@66 { ================================================ FILE: projects/Rockchip/patches/linux/default/linux-2000-v4l2-wip-rkvdec-hevc.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman <jonas@kwiboo.se> Date: Sat, 23 May 2020 15:17:45 +0000 Subject: [PATCH] WIP: media: rkvdec: add HEVC backend NOTE: cabac table and scailing list code is copied 1:1 from mpp TODO: fix lowdelay flag and rework the scaling list part Signed-off-by: Jonas Karlman <jonas@kwiboo.se> Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/staging/media/rkvdec/Makefile | 2 +- drivers/staging/media/rkvdec/rkvdec-hevc.c | 2572 ++++++++++++++++++++ drivers/staging/media/rkvdec/rkvdec-regs.h | 1 + drivers/staging/media/rkvdec/rkvdec.c | 73 +- drivers/staging/media/rkvdec/rkvdec.h | 1 + 5 files changed, 2647 insertions(+), 2 deletions(-) create mode 100644 drivers/staging/media/rkvdec/rkvdec-hevc.c diff --git a/drivers/staging/media/rkvdec/Makefile b/drivers/staging/media/rkvdec/Makefile index cb86b429cfaa..a77122641d14 100644 --- a/drivers/staging/media/rkvdec/Makefile +++ b/drivers/staging/media/rkvdec/Makefile @@ -1,3 +1,3 @@ obj-$(CONFIG_VIDEO_ROCKCHIP_VDEC) += rockchip-vdec.o -rockchip-vdec-y += rkvdec.o rkvdec-h264.o rkvdec-vp9.o +rockchip-vdec-y += rkvdec.o rkvdec-h264.o rkvdec-hevc.o rkvdec-vp9.o diff --git a/drivers/staging/media/rkvdec/rkvdec-hevc.c b/drivers/staging/media/rkvdec/rkvdec-hevc.c new file mode 100644 index 000000000000..7a375a23eaf1 --- /dev/null +++ b/drivers/staging/media/rkvdec/rkvdec-hevc.c @@ -0,0 +1,2572 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Rockchip Video Decoder HEVC backend + * + * Copyright (C) 2019 Collabora, Ltd. + * Boris Brezillon <boris.brezillon@collabora.com> + * + * Copyright (C) 2016 Rockchip Electronics Co., Ltd. + * Jeffy Chen <jeffy.chen@rock-chips.com> + */ + +#include <media/v4l2-mem2mem.h> + +#include "rkvdec.h" +#include "rkvdec-regs.h" + +/* Size in u8/u32 units. */ +#define RKV_CABAC_TABLE_SIZE 27456 +#define RKV_SCALING_LIST_SIZE 1360 +#define RKV_PPS_SIZE (80 / 4) +#define RKV_PPS_LEN 64 +#define RKV_RPS_SIZE (32 / 4) +#define RKV_RPS_LEN 600 + +struct rkvdec_sps_pps_packet { + u32 info[RKV_PPS_SIZE]; +}; + +struct rkvdec_rps_packet { + u32 info[RKV_RPS_SIZE]; +}; + +struct rkvdec_ps_field { + u16 offset; + u8 len; +}; + +#define PS_FIELD(_offset, _len) \ + ((struct rkvdec_ps_field){ _offset, _len }) + +/* SPS */ +#define VIDEO_PARAMETER_SET_ID PS_FIELD(0, 4) +#define SEQ_PARAMETER_SET_ID PS_FIELD(4, 4) +#define CHROMA_FORMAT_IDC PS_FIELD(8, 2) +#define PIC_WIDTH_IN_LUMA_SAMPLES PS_FIELD(10, 13) +#define PIC_HEIGHT_IN_LUMA_SAMPLES PS_FIELD(23, 13) +#define BIT_DEPTH_LUMA PS_FIELD(36, 4) +#define BIT_DEPTH_CHROMA PS_FIELD(40, 4) +#define LOG2_MAX_PIC_ORDER_CNT_LSB PS_FIELD(44, 5) +#define LOG2_DIFF_MAX_MIN_LUMA_CODING_BLOCK_SIZE PS_FIELD(49, 2) +#define LOG2_MIN_LUMA_CODING_BLOCK_SIZE PS_FIELD(51, 3) +#define LOG2_MIN_TRANSFORM_BLOCK_SIZE PS_FIELD(54, 3) +#define LOG2_DIFF_MAX_MIN_LUMA_TRANSFORM_BLOCK_SIZE PS_FIELD(57, 2) +#define MAX_TRANSFORM_HIERARCHY_DEPTH_INTER PS_FIELD(59, 3) +#define MAX_TRANSFORM_HIERARCHY_DEPTH_INTRA PS_FIELD(62, 3) +#define SCALING_LIST_ENABLED_FLAG PS_FIELD(65, 1) +#define AMP_ENABLED_FLAG PS_FIELD(66, 1) +#define SAMPLE_ADAPTIVE_OFFSET_ENABLED_FLAG PS_FIELD(67, 1) +#define PCM_ENABLED_FLAG PS_FIELD(68, 1) +#define PCM_SAMPLE_BIT_DEPTH_LUMA PS_FIELD(69, 4) +#define PCM_SAMPLE_BIT_DEPTH_CHROMA PS_FIELD(73, 4) +#define PCM_LOOP_FILTER_DISABLED_FLAG PS_FIELD(77, 1) +#define LOG2_DIFF_MAX_MIN_PCM_LUMA_CODING_BLOCK_SIZE PS_FIELD(78, 3) +#define LOG2_MIN_PCM_LUMA_CODING_BLOCK_SIZE PS_FIELD(81, 3) +#define NUM_SHORT_TERM_REF_PIC_SETS PS_FIELD(84, 7) +#define LONG_TERM_REF_PICS_PRESENT_FLAG PS_FIELD(91, 1) +#define NUM_LONG_TERM_REF_PICS_SPS PS_FIELD(92, 6) +#define SPS_TEMPORAL_MVP_ENABLED_FLAG PS_FIELD(98, 1) +#define STRONG_INTRA_SMOOTHING_ENABLED_FLAG PS_FIELD(99, 1) +/* PPS */ +#define PIC_PARAMETER_SET_ID PS_FIELD(128, 6) +#define PPS_SEQ_PARAMETER_SET_ID PS_FIELD(134, 4) +#define DEPENDENT_SLICE_SEGMENTS_ENABLED_FLAG PS_FIELD(138, 1) +#define OUTPUT_FLAG_PRESENT_FLAG PS_FIELD(139, 1) +#define NUM_EXTRA_SLICE_HEADER_BITS PS_FIELD(140, 13) +#define SIGN_DATA_HIDING_ENABLED_FLAG PS_FIELD(153, 1) +#define CABAC_INIT_PRESENT_FLAG PS_FIELD(154, 1) +#define NUM_REF_IDX_L0_DEFAULT_ACTIVE PS_FIELD(155, 4) +#define NUM_REF_IDX_L1_DEFAULT_ACTIVE PS_FIELD(159, 4) +#define INIT_QP_MINUS26 PS_FIELD(163, 7) +#define CONSTRAINED_INTRA_PRED_FLAG PS_FIELD(170, 1) +#define TRANSFORM_SKIP_ENABLED_FLAG PS_FIELD(171, 1) +#define CU_QP_DELTA_ENABLED_FLAG PS_FIELD(172, 1) +#define LOG2_MIN_CU_QP_DELTA_SIZE PS_FIELD(173, 3) +#define PPS_CB_QP_OFFSET PS_FIELD(176, 5) +#define PPS_CR_QP_OFFSET PS_FIELD(181, 5) +#define PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT_FLAG PS_FIELD(186, 1) +#define WEIGHTED_PRED_FLAG PS_FIELD(187, 1) +#define WEIGHTED_BIPRED_FLAG PS_FIELD(188, 1) +#define TRANSQUANT_BYPASS_ENABLED_FLAG PS_FIELD(189, 1) +#define TILES_ENABLED_FLAG PS_FIELD(190, 1) +#define ENTROPY_CODING_SYNC_ENABLED_FLAG PS_FIELD(191, 1) +#define PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED_FLAG PS_FIELD(192, 1) +#define LOOP_FILTER_ACROSS_TILES_ENABLED_FLAG PS_FIELD(193, 1) +#define DEBLOCKING_FILTER_OVERRIDE_ENABLED_FLAG PS_FIELD(194, 1) +#define PPS_DEBLOCKING_FILTER_DISABLED_FLAG PS_FIELD(195, 1) +#define PPS_BETA_OFFSET_DIV2 PS_FIELD(196, 4) +#define PPS_TC_OFFSET_DIV2 PS_FIELD(200, 4) +#define LISTS_MODIFICATION_PRESENT_FLAG PS_FIELD(204, 1) +#define LOG2_PARALLEL_MERGE_LEVEL PS_FIELD(205, 3) +#define SLICE_SEGMENT_HEADER_EXTENSION_PRESENT_FLAG PS_FIELD(208, 1) +#define NUM_TILE_COLUMNS PS_FIELD(212, 5) +#define NUM_TILE_ROWS PS_FIELD(217, 5) +#define COLUMN_WIDTH(i) PS_FIELD(256 + (i * 8), 8) +#define ROW_HEIGHT(i) PS_FIELD(416 + (i * 8), 8) +#define SCALING_LIST_ADDRESS PS_FIELD(592, 32) + +/* Data structure describing auxiliary buffer format. */ +struct rkvdec_hevc_priv_tbl { + u8 cabac_table[RKV_CABAC_TABLE_SIZE]; + u8 scaling_list[RKV_SCALING_LIST_SIZE]; + struct rkvdec_sps_pps_packet param_set[RKV_PPS_LEN]; + struct rkvdec_rps_packet rps[RKV_RPS_LEN]; +}; + +struct rkvdec_hevc_run { + struct rkvdec_run base; + const struct v4l2_ctrl_hevc_slice_params *slices_params; + const struct v4l2_ctrl_hevc_decode_params *decode_params; + const struct v4l2_ctrl_hevc_sps *sps; + const struct v4l2_ctrl_hevc_pps *pps; + const struct v4l2_ctrl_hevc_scaling_matrix *scaling_matrix; + int num_slices; +}; + +struct rkvdec_hevc_ctx { + struct rkvdec_aux_buf priv_tbl; + struct v4l2_ctrl_hevc_scaling_matrix scaling_matrix_cache; +}; + +// TODO: refactor scaling list code, was copied 1:1 from mpp + +typedef struct ScalingList { + /* This is a little wasteful, since sizeID 0 only needs 8 coeffs, + * and size ID 3 only has 2 arrays, not 6. */ + u8 sl[4][6][64]; + u8 sl_dc[2][6]; +} scalingList_t; + +typedef struct ScalingFactor_Model { + u8 scalingfactor0[1248]; + u8 scalingfactor1[96]; /*4X4 TU Rotate, total 16X4*/ + u8 scalingdc[12]; /*N1005 Vienna Meeting*/ + u8 reserverd[4]; /*16Bytes align*/ +} scalingFactor_t; + +#define SCALING_LIST_SIZE_NUM 4 + +static void +hal_record_scaling_list(scalingFactor_t *pScalingFactor_out, + scalingList_t *pScalingList) +{ + int i; + u32 g_scalingListNum_model[SCALING_LIST_SIZE_NUM] = {6, 6, 6, 2}; // from C Model + u32 nIndex = 0; + u32 sizeId, matrixId, listId; + u8 *p = pScalingFactor_out->scalingfactor0; + u8 tmpBuf[8 * 8]; + + //output non-default scalingFactor Table (1248 BYTES) + for (sizeId = 0; sizeId < SCALING_LIST_SIZE_NUM; sizeId++) { + for (listId = 0; listId < g_scalingListNum_model[sizeId]; listId++) { + if (sizeId < 3) { + for (i = 0; i < (sizeId == 0 ? 16 : 64); i++) { + pScalingFactor_out->scalingfactor0[nIndex++] = (u8)pScalingList->sl[sizeId][listId][i]; + } + } else { + for (i = 0; i < 64; i ++) { + pScalingFactor_out->scalingfactor0[nIndex++] = (u8)pScalingList->sl[sizeId][listId][i]; + } + for (i = 0; i < 128; i ++) { + pScalingFactor_out->scalingfactor0[nIndex++] = 0; + } + } + } + } + //output non-default scalingFactor Table Rotation(96 Bytes) + nIndex = 0; + for (listId = 0; listId < g_scalingListNum_model[0]; listId++) { + u8 temp16[16] = {0}; + for (i = 0; i < 16; i ++) { + temp16[i] = (u8)pScalingList->sl[0][listId][i]; + } + for (i = 0; i < 4; i ++) { + pScalingFactor_out->scalingfactor1[nIndex++] = temp16[i]; + pScalingFactor_out->scalingfactor1[nIndex++] = temp16[i + 4]; + pScalingFactor_out->scalingfactor1[nIndex++] = temp16[i + 8]; + pScalingFactor_out->scalingfactor1[nIndex++] = temp16[i + 12]; + } + } + //output non-default ScalingList_DC_Coeff (12 BYTES) + nIndex = 0; + for (listId = 0; listId < g_scalingListNum_model[2]; listId++) { //sizeId = 2 + pScalingFactor_out->scalingdc[nIndex++] = (u8)pScalingList->sl_dc[0][listId];// zrh warning: sl_dc differed from scalingList->getScalingListDC + } + for (listId = 0; listId < g_scalingListNum_model[3]; listId++) { //sizeId = 3 + pScalingFactor_out->scalingdc[nIndex++] = (u8)pScalingList->sl_dc[1][listId];// zrh warning: sl_dc differed from scalingList->getScalingListDC + pScalingFactor_out->scalingdc[nIndex++] = 0; + pScalingFactor_out->scalingdc[nIndex++] = 0; + } + + //align 16X address + nIndex = 0; + for (i = 0; i < 4; i ++) { + pScalingFactor_out->reserverd[nIndex++] = 0; + } + + //----------------------All above code show the normal store way in HM-------------------------- + //--------from now on, the scalingfactor0 is rotated 90', the scalingfactor1 is also rotated 90' + + //sizeId == 0 + for (matrixId = 0; matrixId < 6; matrixId++) { + p = pScalingFactor_out->scalingfactor0 + matrixId * 16; + + for (i = 0; i < 4; i++) { + tmpBuf[4 * 0 + i] = p[i * 4 + 0]; + tmpBuf[4 * 1 + i] = p[i * 4 + 1]; + tmpBuf[4 * 2 + i] = p[i * 4 + 2]; + tmpBuf[4 * 3 + i] = p[i * 4 + 3]; + } + memcpy(p, tmpBuf, 4 * 4 * sizeof(u8)); + } + //sizeId == 1 + for (matrixId = 0; matrixId < 6; matrixId++) { + p = pScalingFactor_out->scalingfactor0 + 6 * 16 + matrixId * 64; + + for (i = 0; i < 8; i++) { + tmpBuf[8 * 0 + i] = p[i * 8 + 0]; + tmpBuf[8 * 1 + i] = p[i * 8 + 1]; + tmpBuf[8 * 2 + i] = p[i * 8 + 2]; + tmpBuf[8 * 3 + i] = p[i * 8 + 3]; + tmpBuf[8 * 4 + i] = p[i * 8 + 4]; + tmpBuf[8 * 5 + i] = p[i * 8 + 5]; + tmpBuf[8 * 6 + i] = p[i * 8 + 6]; + tmpBuf[8 * 7 + i] = p[i * 8 + 7]; + } + memcpy(p, tmpBuf, 8 * 8 * sizeof(u8)); + } + //sizeId == 2 + for (matrixId = 0; matrixId < 6; matrixId++) { + p = pScalingFactor_out->scalingfactor0 + 6 * 16 + 6 * 64 + matrixId * 64; + + for (i = 0; i < 8; i++) { + tmpBuf[8 * 0 + i] = p[i * 8 + 0]; + tmpBuf[8 * 1 + i] = p[i * 8 + 1]; + tmpBuf[8 * 2 + i] = p[i * 8 + 2]; + tmpBuf[8 * 3 + i] = p[i * 8 + 3]; + tmpBuf[8 * 4 + i] = p[i * 8 + 4]; + tmpBuf[8 * 5 + i] = p[i * 8 + 5]; + tmpBuf[8 * 6 + i] = p[i * 8 + 6]; + tmpBuf[8 * 7 + i] = p[i * 8 + 7]; + } + memcpy(p, tmpBuf, 8 * 8 * sizeof(u8)); + } + //sizeId == 3 + for (matrixId = 0; matrixId < 6; matrixId++) { + p = pScalingFactor_out->scalingfactor0 + 6 * 16 + 6 * 64 + 6 * 64 + matrixId * 64; + + for (i = 0; i < 8; i++) { + tmpBuf[8 * 0 + i] = p[i * 8 + 0]; + tmpBuf[8 * 1 + i] = p[i * 8 + 1]; + tmpBuf[8 * 2 + i] = p[i * 8 + 2]; + tmpBuf[8 * 3 + i] = p[i * 8 + 3]; + tmpBuf[8 * 4 + i] = p[i * 8 + 4]; + tmpBuf[8 * 5 + i] = p[i * 8 + 5]; + tmpBuf[8 * 6 + i] = p[i * 8 + 6]; + tmpBuf[8 * 7 + i] = p[i * 8 + 7]; + } + memcpy(p, tmpBuf, 8 * 8 * sizeof(u8)); + } + + //sizeId == 0 + for (matrixId = 0; matrixId < 6; matrixId++) { + p = pScalingFactor_out->scalingfactor1 + matrixId * 16; + + for (i = 0; i < 4; i++) { + tmpBuf[4 * 0 + i] = p[i * 4 + 0]; + tmpBuf[4 * 1 + i] = p[i * 4 + 1]; + tmpBuf[4 * 2 + i] = p[i * 4 + 2]; + tmpBuf[4 * 3 + i] = p[i * 4 + 3]; + } + memcpy(p, tmpBuf, 4 * 4 * sizeof(u8)); + } +} + +static const u8 rkvdec_hevc_cabac_table[RKV_CABAC_TABLE_SIZE] = { + 0x07, 0x0f, 0x48, 0x58, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x0f, 0x40, 0x40, 0x40, 0x0f, 0x68, + 0x48, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x40, 0x40, 0x68, + 0x58, 0x60, 0x40, 0x1f, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x48, 0x48, 0x60, 0x60, 0x50, 0x58, + 0x50, 0x07, 0x58, 0x68, 0x50, 0x58, 0x68, 0x68, 0x68, 0x68, 0x68, 0x50, 0x48, 0x68, 0x60, 0x60, + 0x50, 0x58, 0x50, 0x07, 0x58, 0x68, 0x50, 0x58, 0x68, 0x68, 0x68, 0x68, 0x68, 0x50, 0x48, 0x68, + 0x48, 0x48, 0x1f, 0x58, 0x68, 0x68, 0x58, 0x60, 0x60, 0x60, 0x50, 0x50, 0x50, 0x48, 0x58, 0x58, + 0x37, 0x07, 0x58, 0x48, 0x58, 0x58, 0x37, 0x07, 0x58, 0x48, 0x58, 0x58, 0x37, 0x07, 0x58, 0x50, + 0x48, 0x1f, 0x1f, 0x0f, 0x0f, 0x0f, 0x0f, 0x07, 0x0f, 0x48, 0x68, 0x0f, 0x48, 0x68, 0x40, 0x40, + 0x50, 0x50, 0x07, 0x40, 0x50, 0x0f, 0x40, 0x48, 0x07, 0x40, 0x27, 0x50, 0x48, 0x48, 0x40, 0x0f, + 0x50, 0x37, 0x1f, 0x1f, 0x50, 0x37, 0x40, 0x27, 0x40, 0x07, 0x0f, 0x17, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x0f, 0x47, 0x57, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x0f, 0x40, 0x40, 0x40, 0x0f, 0x66, + 0x47, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x00, 0x00, 0x67, + 0x57, 0x5e, 0x00, 0x1f, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x47, 0x47, 0x5f, 0x5f, 0x4f, 0x57, + 0x4f, 0x07, 0x57, 0x67, 0x4f, 0x57, 0x67, 0x67, 0x67, 0x67, 0x66, 0x4f, 0x47, 0x66, 0x5f, 0x5f, + 0x4f, 0x57, 0x4f, 0x07, 0x57, 0x67, 0x4f, 0x57, 0x67, 0x67, 0x67, 0x67, 0x66, 0x4f, 0x47, 0x66, + 0x46, 0x48, 0x20, 0x57, 0x67, 0x67, 0x57, 0x5f, 0x5f, 0x5e, 0x4f, 0x4f, 0x4f, 0x47, 0x57, 0x57, + 0x37, 0x07, 0x57, 0x47, 0x57, 0x57, 0x37, 0x07, 0x57, 0x47, 0x57, 0x57, 0x37, 0x07, 0x57, 0x4f, + 0x47, 0x1f, 0x1f, 0x0f, 0x10, 0x0f, 0x10, 0x07, 0x10, 0x47, 0x67, 0x10, 0x47, 0x67, 0x40, 0x40, + 0x4f, 0x4e, 0x08, 0x00, 0x4f, 0x0f, 0x00, 0x47, 0x07, 0x01, 0x27, 0x4e, 0x47, 0x47, 0x00, 0x0f, + 0x4f, 0x37, 0x1f, 0x1f, 0x4f, 0x36, 0x00, 0x27, 0x00, 0x07, 0x10, 0x17, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x0e, 0x47, 0x57, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x0e, 0x40, 0x40, 0x40, 0x0e, 0x64, + 0x47, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x00, 0x00, 0x66, + 0x57, 0x5d, 0x00, 0x1e, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x47, 0x47, 0x5e, 0x5e, 0x4e, 0x56, + 0x4f, 0x07, 0x56, 0x66, 0x4f, 0x56, 0x66, 0x67, 0x66, 0x66, 0x64, 0x4e, 0x46, 0x64, 0x5e, 0x5e, + 0x4e, 0x56, 0x4f, 0x07, 0x56, 0x66, 0x4f, 0x56, 0x66, 0x67, 0x66, 0x66, 0x64, 0x4e, 0x46, 0x64, + 0x45, 0x48, 0x20, 0x57, 0x66, 0x66, 0x56, 0x5e, 0x5e, 0x5d, 0x4e, 0x4e, 0x4e, 0x46, 0x56, 0x57, + 0x36, 0x07, 0x56, 0x46, 0x56, 0x57, 0x36, 0x07, 0x56, 0x46, 0x56, 0x57, 0x36, 0x07, 0x56, 0x4f, + 0x47, 0x1e, 0x1e, 0x0f, 0x10, 0x0f, 0x10, 0x07, 0x10, 0x47, 0x66, 0x10, 0x47, 0x66, 0x40, 0x40, + 0x4f, 0x4d, 0x08, 0x00, 0x4f, 0x0f, 0x00, 0x47, 0x07, 0x03, 0x27, 0x4d, 0x47, 0x46, 0x01, 0x0f, + 0x4f, 0x36, 0x1f, 0x1e, 0x4f, 0x34, 0x01, 0x26, 0x00, 0x07, 0x10, 0x17, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x0d, 0x47, 0x57, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x0e, 0x40, 0x40, 0x40, 0x0e, 0x62, + 0x47, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x00, 0x00, 0x65, + 0x57, 0x5c, 0x00, 0x1e, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x47, 0x47, 0x5d, 0x5d, 0x4e, 0x56, + 0x4f, 0x07, 0x56, 0x66, 0x4f, 0x55, 0x65, 0x67, 0x66, 0x65, 0x63, 0x4d, 0x46, 0x62, 0x5d, 0x5d, + 0x4e, 0x56, 0x4f, 0x07, 0x56, 0x66, 0x4f, 0x55, 0x65, 0x67, 0x66, 0x65, 0x63, 0x4d, 0x46, 0x62, + 0x44, 0x48, 0x20, 0x57, 0x65, 0x65, 0x56, 0x5d, 0x5d, 0x5c, 0x4e, 0x4d, 0x4e, 0x45, 0x56, 0x57, + 0x36, 0x07, 0x56, 0x45, 0x56, 0x57, 0x36, 0x07, 0x56, 0x45, 0x56, 0x57, 0x36, 0x07, 0x56, 0x4f, + 0x47, 0x1e, 0x1e, 0x0f, 0x10, 0x0f, 0x10, 0x07, 0x10, 0x47, 0x65, 0x10, 0x47, 0x65, 0x40, 0x40, + 0x4f, 0x4c, 0x08, 0x00, 0x4f, 0x0f, 0x00, 0x47, 0x07, 0x04, 0x27, 0x4c, 0x47, 0x45, 0x01, 0x0f, + 0x4f, 0x36, 0x1f, 0x1e, 0x4f, 0x33, 0x01, 0x25, 0x00, 0x07, 0x10, 0x17, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x0c, 0x46, 0x56, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x0d, 0x40, 0x40, 0x40, 0x0d, 0x60, + 0x46, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x01, 0x01, 0x64, + 0x56, 0x5b, 0x01, 0x1d, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x46, 0x46, 0x5c, 0x5c, 0x4d, 0x55, + 0x4e, 0x07, 0x55, 0x65, 0x4e, 0x54, 0x64, 0x66, 0x65, 0x64, 0x61, 0x4c, 0x45, 0x60, 0x5c, 0x5c, + 0x4d, 0x55, 0x4e, 0x07, 0x55, 0x65, 0x4e, 0x54, 0x64, 0x66, 0x65, 0x64, 0x61, 0x4c, 0x45, 0x60, + 0x43, 0x49, 0x21, 0x56, 0x64, 0x64, 0x55, 0x5c, 0x5c, 0x5b, 0x4d, 0x4c, 0x4d, 0x44, 0x55, 0x56, + 0x35, 0x07, 0x55, 0x44, 0x55, 0x56, 0x35, 0x07, 0x55, 0x44, 0x55, 0x56, 0x35, 0x07, 0x55, 0x4e, + 0x46, 0x1d, 0x1d, 0x0f, 0x11, 0x0f, 0x11, 0x07, 0x11, 0x46, 0x64, 0x11, 0x46, 0x64, 0x40, 0x40, + 0x4e, 0x4b, 0x09, 0x01, 0x4e, 0x0f, 0x01, 0x46, 0x07, 0x06, 0x27, 0x4b, 0x46, 0x44, 0x02, 0x0f, + 0x4e, 0x35, 0x1e, 0x1d, 0x4e, 0x31, 0x02, 0x24, 0x01, 0x07, 0x11, 0x16, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x0b, 0x46, 0x56, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x0c, 0x40, 0x40, 0x40, 0x0c, 0x5e, + 0x46, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x01, 0x01, 0x63, + 0x56, 0x59, 0x01, 0x1c, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x46, 0x46, 0x5b, 0x5b, 0x4c, 0x54, + 0x4e, 0x07, 0x54, 0x64, 0x4e, 0x53, 0x63, 0x66, 0x64, 0x63, 0x60, 0x4b, 0x44, 0x5e, 0x5b, 0x5b, + 0x4c, 0x54, 0x4e, 0x07, 0x54, 0x64, 0x4e, 0x53, 0x63, 0x66, 0x64, 0x63, 0x60, 0x4b, 0x44, 0x5e, + 0x41, 0x49, 0x21, 0x56, 0x63, 0x63, 0x54, 0x5b, 0x5b, 0x59, 0x4c, 0x4b, 0x4c, 0x43, 0x54, 0x56, + 0x34, 0x07, 0x54, 0x43, 0x54, 0x56, 0x34, 0x07, 0x54, 0x43, 0x54, 0x56, 0x34, 0x07, 0x54, 0x4e, + 0x46, 0x1c, 0x1c, 0x0f, 0x11, 0x0f, 0x11, 0x07, 0x11, 0x46, 0x63, 0x11, 0x46, 0x63, 0x40, 0x40, + 0x4e, 0x49, 0x09, 0x01, 0x4e, 0x0f, 0x01, 0x46, 0x07, 0x07, 0x27, 0x49, 0x46, 0x43, 0x03, 0x0f, + 0x4e, 0x34, 0x1e, 0x1c, 0x4e, 0x30, 0x03, 0x23, 0x01, 0x07, 0x11, 0x16, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x0a, 0x46, 0x56, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x0c, 0x40, 0x40, 0x40, 0x0c, 0x5c, + 0x46, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x01, 0x01, 0x62, + 0x56, 0x58, 0x01, 0x1c, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x46, 0x46, 0x5a, 0x5a, 0x4c, 0x54, + 0x4e, 0x07, 0x54, 0x64, 0x4e, 0x52, 0x62, 0x66, 0x64, 0x62, 0x5e, 0x4a, 0x44, 0x5c, 0x5a, 0x5a, + 0x4c, 0x54, 0x4e, 0x07, 0x54, 0x64, 0x4e, 0x52, 0x62, 0x66, 0x64, 0x62, 0x5e, 0x4a, 0x44, 0x5c, + 0x40, 0x49, 0x21, 0x56, 0x62, 0x62, 0x54, 0x5a, 0x5a, 0x58, 0x4c, 0x4a, 0x4c, 0x42, 0x54, 0x56, + 0x34, 0x07, 0x54, 0x42, 0x54, 0x56, 0x34, 0x07, 0x54, 0x42, 0x54, 0x56, 0x34, 0x07, 0x54, 0x4e, + 0x46, 0x1c, 0x1c, 0x0f, 0x11, 0x0f, 0x11, 0x07, 0x11, 0x46, 0x62, 0x11, 0x46, 0x62, 0x40, 0x40, + 0x4e, 0x48, 0x09, 0x01, 0x4e, 0x0f, 0x01, 0x46, 0x07, 0x09, 0x27, 0x48, 0x46, 0x42, 0x03, 0x0f, + 0x4e, 0x34, 0x1e, 0x1c, 0x4e, 0x2e, 0x03, 0x22, 0x01, 0x07, 0x11, 0x16, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x09, 0x45, 0x55, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x0b, 0x40, 0x40, 0x40, 0x0b, 0x5a, + 0x45, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x02, 0x02, 0x61, + 0x55, 0x57, 0x02, 0x1b, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x45, 0x45, 0x59, 0x59, 0x4b, 0x53, + 0x4d, 0x07, 0x53, 0x63, 0x4d, 0x51, 0x61, 0x65, 0x63, 0x61, 0x5d, 0x49, 0x43, 0x5a, 0x59, 0x59, + 0x4b, 0x53, 0x4d, 0x07, 0x53, 0x63, 0x4d, 0x51, 0x61, 0x65, 0x63, 0x61, 0x5d, 0x49, 0x43, 0x5a, + 0x00, 0x4a, 0x22, 0x55, 0x61, 0x61, 0x53, 0x59, 0x59, 0x57, 0x4b, 0x49, 0x4b, 0x41, 0x53, 0x55, + 0x33, 0x07, 0x53, 0x41, 0x53, 0x55, 0x33, 0x07, 0x53, 0x41, 0x53, 0x55, 0x33, 0x07, 0x53, 0x4d, + 0x45, 0x1b, 0x1b, 0x0f, 0x12, 0x0f, 0x12, 0x07, 0x12, 0x45, 0x61, 0x12, 0x45, 0x61, 0x40, 0x40, + 0x4d, 0x47, 0x0a, 0x02, 0x4d, 0x0f, 0x02, 0x45, 0x07, 0x0a, 0x27, 0x47, 0x45, 0x41, 0x04, 0x0f, + 0x4d, 0x33, 0x1d, 0x1b, 0x4d, 0x2d, 0x04, 0x21, 0x02, 0x07, 0x12, 0x15, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x08, 0x45, 0x55, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x0a, 0x40, 0x40, 0x40, 0x0a, 0x59, + 0x45, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x02, 0x02, 0x60, + 0x55, 0x56, 0x02, 0x1a, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x45, 0x45, 0x58, 0x58, 0x4b, 0x53, + 0x4d, 0x07, 0x53, 0x63, 0x4d, 0x50, 0x60, 0x65, 0x63, 0x60, 0x5b, 0x48, 0x43, 0x59, 0x58, 0x58, + 0x4b, 0x53, 0x4d, 0x07, 0x53, 0x63, 0x4d, 0x50, 0x60, 0x65, 0x63, 0x60, 0x5b, 0x48, 0x43, 0x59, + 0x01, 0x4a, 0x22, 0x55, 0x60, 0x60, 0x53, 0x58, 0x58, 0x56, 0x4b, 0x48, 0x4b, 0x40, 0x53, 0x55, + 0x32, 0x07, 0x53, 0x40, 0x53, 0x55, 0x32, 0x07, 0x53, 0x40, 0x53, 0x55, 0x32, 0x07, 0x53, 0x4d, + 0x45, 0x1a, 0x1a, 0x0f, 0x12, 0x0f, 0x12, 0x07, 0x12, 0x45, 0x60, 0x12, 0x45, 0x60, 0x40, 0x40, + 0x4d, 0x46, 0x0a, 0x02, 0x4d, 0x0f, 0x02, 0x45, 0x07, 0x0c, 0x27, 0x46, 0x45, 0x40, 0x04, 0x0f, + 0x4d, 0x32, 0x1d, 0x1a, 0x4d, 0x2b, 0x04, 0x20, 0x02, 0x07, 0x12, 0x15, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x07, 0x45, 0x55, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x0a, 0x40, 0x40, 0x40, 0x0a, 0x57, + 0x45, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x02, 0x02, 0x5f, + 0x55, 0x54, 0x02, 0x1a, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x45, 0x45, 0x57, 0x57, 0x4a, 0x52, + 0x4d, 0x07, 0x52, 0x62, 0x4d, 0x4f, 0x5f, 0x65, 0x62, 0x5f, 0x59, 0x47, 0x42, 0x57, 0x57, 0x57, + 0x4a, 0x52, 0x4d, 0x07, 0x52, 0x62, 0x4d, 0x4f, 0x5f, 0x65, 0x62, 0x5f, 0x59, 0x47, 0x42, 0x57, + 0x03, 0x4a, 0x22, 0x55, 0x5f, 0x5f, 0x52, 0x57, 0x57, 0x54, 0x4a, 0x47, 0x4a, 0x00, 0x52, 0x55, + 0x32, 0x07, 0x52, 0x00, 0x52, 0x55, 0x32, 0x07, 0x52, 0x00, 0x52, 0x55, 0x32, 0x07, 0x52, 0x4d, + 0x45, 0x1a, 0x1a, 0x0f, 0x12, 0x0f, 0x12, 0x07, 0x12, 0x45, 0x5f, 0x12, 0x45, 0x5f, 0x40, 0x40, + 0x4d, 0x44, 0x0a, 0x02, 0x4d, 0x0f, 0x02, 0x45, 0x07, 0x0e, 0x27, 0x44, 0x45, 0x00, 0x05, 0x0f, + 0x4d, 0x32, 0x1d, 0x1a, 0x4d, 0x29, 0x05, 0x1f, 0x02, 0x07, 0x12, 0x15, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x06, 0x44, 0x54, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x09, 0x40, 0x40, 0x40, 0x09, 0x55, + 0x44, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x03, 0x03, 0x5e, + 0x54, 0x53, 0x03, 0x19, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x44, 0x44, 0x56, 0x56, 0x49, 0x51, + 0x4c, 0x07, 0x51, 0x61, 0x4c, 0x4e, 0x5e, 0x64, 0x61, 0x5e, 0x58, 0x46, 0x41, 0x55, 0x56, 0x56, + 0x49, 0x51, 0x4c, 0x07, 0x51, 0x61, 0x4c, 0x4e, 0x5e, 0x64, 0x61, 0x5e, 0x58, 0x46, 0x41, 0x55, + 0x04, 0x4b, 0x23, 0x54, 0x5e, 0x5e, 0x51, 0x56, 0x56, 0x53, 0x49, 0x46, 0x49, 0x01, 0x51, 0x54, + 0x31, 0x07, 0x51, 0x01, 0x51, 0x54, 0x31, 0x07, 0x51, 0x01, 0x51, 0x54, 0x31, 0x07, 0x51, 0x4c, + 0x44, 0x19, 0x19, 0x0f, 0x13, 0x0f, 0x13, 0x07, 0x13, 0x44, 0x5e, 0x13, 0x44, 0x5e, 0x40, 0x40, + 0x4c, 0x43, 0x0b, 0x03, 0x4c, 0x0f, 0x03, 0x44, 0x07, 0x0f, 0x27, 0x43, 0x44, 0x01, 0x06, 0x0f, + 0x4c, 0x31, 0x1c, 0x19, 0x4c, 0x28, 0x06, 0x1e, 0x03, 0x07, 0x13, 0x14, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x05, 0x44, 0x54, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x09, 0x40, 0x40, 0x40, 0x09, 0x53, + 0x44, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x03, 0x03, 0x5d, + 0x54, 0x52, 0x03, 0x19, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x44, 0x44, 0x55, 0x55, 0x49, 0x51, + 0x4c, 0x07, 0x51, 0x61, 0x4c, 0x4d, 0x5d, 0x64, 0x61, 0x5d, 0x56, 0x45, 0x41, 0x53, 0x55, 0x55, + 0x49, 0x51, 0x4c, 0x07, 0x51, 0x61, 0x4c, 0x4d, 0x5d, 0x64, 0x61, 0x5d, 0x56, 0x45, 0x41, 0x53, + 0x05, 0x4b, 0x23, 0x54, 0x5d, 0x5d, 0x51, 0x55, 0x55, 0x52, 0x49, 0x45, 0x49, 0x02, 0x51, 0x54, + 0x31, 0x07, 0x51, 0x02, 0x51, 0x54, 0x31, 0x07, 0x51, 0x02, 0x51, 0x54, 0x31, 0x07, 0x51, 0x4c, + 0x44, 0x19, 0x19, 0x0f, 0x13, 0x0f, 0x13, 0x07, 0x13, 0x44, 0x5d, 0x13, 0x44, 0x5d, 0x40, 0x40, + 0x4c, 0x42, 0x0b, 0x03, 0x4c, 0x0f, 0x03, 0x44, 0x07, 0x11, 0x27, 0x42, 0x44, 0x02, 0x06, 0x0f, + 0x4c, 0x31, 0x1c, 0x19, 0x4c, 0x26, 0x06, 0x1d, 0x03, 0x07, 0x13, 0x14, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x04, 0x44, 0x54, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x08, 0x40, 0x40, 0x40, 0x08, 0x51, + 0x44, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x03, 0x03, 0x5c, + 0x54, 0x51, 0x03, 0x18, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x44, 0x44, 0x54, 0x54, 0x48, 0x50, + 0x4c, 0x07, 0x50, 0x60, 0x4c, 0x4c, 0x5c, 0x64, 0x60, 0x5c, 0x55, 0x44, 0x40, 0x51, 0x54, 0x54, + 0x48, 0x50, 0x4c, 0x07, 0x50, 0x60, 0x4c, 0x4c, 0x5c, 0x64, 0x60, 0x5c, 0x55, 0x44, 0x40, 0x51, + 0x06, 0x4b, 0x23, 0x54, 0x5c, 0x5c, 0x50, 0x54, 0x54, 0x51, 0x48, 0x44, 0x48, 0x03, 0x50, 0x54, + 0x30, 0x07, 0x50, 0x03, 0x50, 0x54, 0x30, 0x07, 0x50, 0x03, 0x50, 0x54, 0x30, 0x07, 0x50, 0x4c, + 0x44, 0x18, 0x18, 0x0f, 0x13, 0x0f, 0x13, 0x07, 0x13, 0x44, 0x5c, 0x13, 0x44, 0x5c, 0x40, 0x40, + 0x4c, 0x41, 0x0b, 0x03, 0x4c, 0x0f, 0x03, 0x44, 0x07, 0x12, 0x27, 0x41, 0x44, 0x03, 0x07, 0x0f, + 0x4c, 0x30, 0x1c, 0x18, 0x4c, 0x25, 0x07, 0x1c, 0x03, 0x07, 0x13, 0x14, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x03, 0x43, 0x53, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x40, 0x40, 0x40, 0x07, 0x4f, + 0x43, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x04, 0x04, 0x5b, + 0x53, 0x4f, 0x04, 0x17, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x43, 0x43, 0x53, 0x53, 0x47, 0x4f, + 0x4b, 0x07, 0x4f, 0x5f, 0x4b, 0x4b, 0x5b, 0x63, 0x5f, 0x5b, 0x53, 0x43, 0x00, 0x4f, 0x53, 0x53, + 0x47, 0x4f, 0x4b, 0x07, 0x4f, 0x5f, 0x4b, 0x4b, 0x5b, 0x63, 0x5f, 0x5b, 0x53, 0x43, 0x00, 0x4f, + 0x08, 0x4c, 0x24, 0x53, 0x5b, 0x5b, 0x4f, 0x53, 0x53, 0x4f, 0x47, 0x43, 0x47, 0x04, 0x4f, 0x53, + 0x2f, 0x07, 0x4f, 0x04, 0x4f, 0x53, 0x2f, 0x07, 0x4f, 0x04, 0x4f, 0x53, 0x2f, 0x07, 0x4f, 0x4b, + 0x43, 0x17, 0x17, 0x0f, 0x14, 0x0f, 0x14, 0x07, 0x14, 0x43, 0x5b, 0x14, 0x43, 0x5b, 0x40, 0x40, + 0x4b, 0x00, 0x0c, 0x04, 0x4b, 0x0f, 0x04, 0x43, 0x07, 0x14, 0x27, 0x00, 0x43, 0x04, 0x08, 0x0f, + 0x4b, 0x2f, 0x1b, 0x17, 0x4b, 0x23, 0x08, 0x1b, 0x04, 0x07, 0x14, 0x13, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x02, 0x43, 0x53, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x40, 0x40, 0x40, 0x07, 0x4d, + 0x43, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x04, 0x04, 0x5a, + 0x53, 0x4e, 0x04, 0x17, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x43, 0x43, 0x52, 0x52, 0x47, 0x4f, + 0x4b, 0x07, 0x4f, 0x5f, 0x4b, 0x4a, 0x5a, 0x63, 0x5f, 0x5a, 0x52, 0x42, 0x00, 0x4d, 0x52, 0x52, + 0x47, 0x4f, 0x4b, 0x07, 0x4f, 0x5f, 0x4b, 0x4a, 0x5a, 0x63, 0x5f, 0x5a, 0x52, 0x42, 0x00, 0x4d, + 0x09, 0x4c, 0x24, 0x53, 0x5a, 0x5a, 0x4f, 0x52, 0x52, 0x4e, 0x47, 0x42, 0x47, 0x05, 0x4f, 0x53, + 0x2f, 0x07, 0x4f, 0x05, 0x4f, 0x53, 0x2f, 0x07, 0x4f, 0x05, 0x4f, 0x53, 0x2f, 0x07, 0x4f, 0x4b, + 0x43, 0x17, 0x17, 0x0f, 0x14, 0x0f, 0x14, 0x07, 0x14, 0x43, 0x5a, 0x14, 0x43, 0x5a, 0x40, 0x40, + 0x4b, 0x01, 0x0c, 0x04, 0x4b, 0x0f, 0x04, 0x43, 0x07, 0x15, 0x27, 0x01, 0x43, 0x05, 0x08, 0x0f, + 0x4b, 0x2f, 0x1b, 0x17, 0x4b, 0x22, 0x08, 0x1a, 0x04, 0x07, 0x14, 0x13, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x01, 0x43, 0x53, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x06, 0x40, 0x40, 0x40, 0x06, 0x4b, + 0x43, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x04, 0x04, 0x59, + 0x53, 0x4d, 0x04, 0x16, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x43, 0x43, 0x51, 0x51, 0x46, 0x4e, + 0x4b, 0x07, 0x4e, 0x5e, 0x4b, 0x49, 0x59, 0x63, 0x5e, 0x59, 0x50, 0x41, 0x01, 0x4b, 0x51, 0x51, + 0x46, 0x4e, 0x4b, 0x07, 0x4e, 0x5e, 0x4b, 0x49, 0x59, 0x63, 0x5e, 0x59, 0x50, 0x41, 0x01, 0x4b, + 0x0a, 0x4c, 0x24, 0x53, 0x59, 0x59, 0x4e, 0x51, 0x51, 0x4d, 0x46, 0x41, 0x46, 0x06, 0x4e, 0x53, + 0x2e, 0x07, 0x4e, 0x06, 0x4e, 0x53, 0x2e, 0x07, 0x4e, 0x06, 0x4e, 0x53, 0x2e, 0x07, 0x4e, 0x4b, + 0x43, 0x16, 0x16, 0x0f, 0x14, 0x0f, 0x14, 0x07, 0x14, 0x43, 0x59, 0x14, 0x43, 0x59, 0x40, 0x40, + 0x4b, 0x02, 0x0c, 0x04, 0x4b, 0x0f, 0x04, 0x43, 0x07, 0x17, 0x27, 0x02, 0x43, 0x06, 0x09, 0x0f, + 0x4b, 0x2e, 0x1b, 0x16, 0x4b, 0x20, 0x09, 0x19, 0x04, 0x07, 0x14, 0x13, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x43, 0x53, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x05, 0x40, 0x40, 0x40, 0x05, 0x4a, + 0x43, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x04, 0x04, 0x59, + 0x53, 0x4c, 0x04, 0x15, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x43, 0x43, 0x51, 0x51, 0x46, 0x4e, + 0x4b, 0x07, 0x4e, 0x5e, 0x4b, 0x49, 0x59, 0x63, 0x5e, 0x59, 0x4f, 0x41, 0x01, 0x4a, 0x51, 0x51, + 0x46, 0x4e, 0x4b, 0x07, 0x4e, 0x5e, 0x4b, 0x49, 0x59, 0x63, 0x5e, 0x59, 0x4f, 0x41, 0x01, 0x4a, + 0x0b, 0x4d, 0x24, 0x53, 0x59, 0x59, 0x4e, 0x51, 0x51, 0x4c, 0x46, 0x41, 0x46, 0x06, 0x4e, 0x53, + 0x2d, 0x07, 0x4e, 0x06, 0x4e, 0x53, 0x2d, 0x07, 0x4e, 0x06, 0x4e, 0x53, 0x2d, 0x07, 0x4e, 0x4b, + 0x43, 0x15, 0x15, 0x0f, 0x14, 0x0f, 0x14, 0x07, 0x14, 0x43, 0x59, 0x14, 0x43, 0x59, 0x40, 0x40, + 0x4b, 0x03, 0x0c, 0x04, 0x4b, 0x0f, 0x04, 0x43, 0x07, 0x18, 0x27, 0x03, 0x43, 0x06, 0x09, 0x0f, + 0x4b, 0x2d, 0x1a, 0x15, 0x4b, 0x1e, 0x09, 0x18, 0x04, 0x07, 0x14, 0x12, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x42, 0x52, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x05, 0x40, 0x40, 0x40, 0x05, 0x48, + 0x42, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x05, 0x05, 0x58, + 0x52, 0x4a, 0x05, 0x15, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0x42, 0x50, 0x50, 0x45, 0x4d, + 0x4a, 0x07, 0x4d, 0x5d, 0x4a, 0x48, 0x58, 0x62, 0x5d, 0x58, 0x4d, 0x40, 0x02, 0x48, 0x50, 0x50, + 0x45, 0x4d, 0x4a, 0x07, 0x4d, 0x5d, 0x4a, 0x48, 0x58, 0x62, 0x5d, 0x58, 0x4d, 0x40, 0x02, 0x48, + 0x0d, 0x4d, 0x25, 0x52, 0x58, 0x58, 0x4d, 0x50, 0x50, 0x4a, 0x45, 0x40, 0x45, 0x07, 0x4d, 0x52, + 0x2d, 0x07, 0x4d, 0x07, 0x4d, 0x52, 0x2d, 0x07, 0x4d, 0x07, 0x4d, 0x52, 0x2d, 0x07, 0x4d, 0x4a, + 0x42, 0x15, 0x15, 0x0f, 0x15, 0x0f, 0x15, 0x07, 0x15, 0x42, 0x58, 0x15, 0x42, 0x58, 0x40, 0x40, + 0x4a, 0x05, 0x0d, 0x05, 0x4a, 0x0f, 0x05, 0x42, 0x07, 0x1a, 0x27, 0x05, 0x42, 0x07, 0x0a, 0x0f, + 0x4a, 0x2d, 0x1a, 0x15, 0x4a, 0x1d, 0x0a, 0x18, 0x05, 0x07, 0x15, 0x12, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x40, 0x42, 0x52, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x04, 0x40, 0x40, 0x40, 0x04, 0x46, + 0x42, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x05, 0x05, 0x57, + 0x52, 0x49, 0x05, 0x14, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0x42, 0x4f, 0x4f, 0x44, 0x4c, + 0x4a, 0x07, 0x4c, 0x5c, 0x4a, 0x47, 0x57, 0x62, 0x5c, 0x57, 0x4b, 0x00, 0x03, 0x46, 0x4f, 0x4f, + 0x44, 0x4c, 0x4a, 0x07, 0x4c, 0x5c, 0x4a, 0x47, 0x57, 0x62, 0x5c, 0x57, 0x4b, 0x00, 0x03, 0x46, + 0x0e, 0x4d, 0x25, 0x52, 0x57, 0x57, 0x4c, 0x4f, 0x4f, 0x49, 0x44, 0x00, 0x44, 0x08, 0x4c, 0x52, + 0x2c, 0x07, 0x4c, 0x08, 0x4c, 0x52, 0x2c, 0x07, 0x4c, 0x08, 0x4c, 0x52, 0x2c, 0x07, 0x4c, 0x4a, + 0x42, 0x14, 0x14, 0x0f, 0x15, 0x0f, 0x15, 0x07, 0x15, 0x42, 0x57, 0x15, 0x42, 0x57, 0x40, 0x40, + 0x4a, 0x06, 0x0d, 0x05, 0x4a, 0x0f, 0x05, 0x42, 0x07, 0x1c, 0x27, 0x06, 0x42, 0x08, 0x0b, 0x0f, + 0x4a, 0x2c, 0x1a, 0x14, 0x4a, 0x1b, 0x0b, 0x17, 0x05, 0x07, 0x15, 0x12, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x41, 0x42, 0x52, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x04, 0x40, 0x40, 0x40, 0x04, 0x44, + 0x42, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x05, 0x05, 0x56, + 0x52, 0x48, 0x05, 0x14, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0x42, 0x4e, 0x4e, 0x44, 0x4c, + 0x4a, 0x07, 0x4c, 0x5c, 0x4a, 0x46, 0x56, 0x62, 0x5c, 0x56, 0x4a, 0x01, 0x03, 0x44, 0x4e, 0x4e, + 0x44, 0x4c, 0x4a, 0x07, 0x4c, 0x5c, 0x4a, 0x46, 0x56, 0x62, 0x5c, 0x56, 0x4a, 0x01, 0x03, 0x44, + 0x0f, 0x4d, 0x25, 0x52, 0x56, 0x56, 0x4c, 0x4e, 0x4e, 0x48, 0x44, 0x01, 0x44, 0x09, 0x4c, 0x52, + 0x2c, 0x07, 0x4c, 0x09, 0x4c, 0x52, 0x2c, 0x07, 0x4c, 0x09, 0x4c, 0x52, 0x2c, 0x07, 0x4c, 0x4a, + 0x42, 0x14, 0x14, 0x0f, 0x15, 0x0f, 0x15, 0x07, 0x15, 0x42, 0x56, 0x15, 0x42, 0x56, 0x40, 0x40, + 0x4a, 0x07, 0x0d, 0x05, 0x4a, 0x0f, 0x05, 0x42, 0x07, 0x1d, 0x27, 0x07, 0x42, 0x09, 0x0b, 0x0f, + 0x4a, 0x2c, 0x1a, 0x14, 0x4a, 0x1a, 0x0b, 0x16, 0x05, 0x07, 0x15, 0x12, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x42, 0x41, 0x51, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x03, 0x40, 0x40, 0x40, 0x03, 0x42, + 0x41, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x06, 0x06, 0x55, + 0x51, 0x47, 0x06, 0x13, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x4d, 0x4d, 0x43, 0x4b, + 0x49, 0x07, 0x4b, 0x5b, 0x49, 0x45, 0x55, 0x61, 0x5b, 0x55, 0x48, 0x02, 0x04, 0x42, 0x4d, 0x4d, + 0x43, 0x4b, 0x49, 0x07, 0x4b, 0x5b, 0x49, 0x45, 0x55, 0x61, 0x5b, 0x55, 0x48, 0x02, 0x04, 0x42, + 0x10, 0x4e, 0x26, 0x51, 0x55, 0x55, 0x4b, 0x4d, 0x4d, 0x47, 0x43, 0x02, 0x43, 0x0a, 0x4b, 0x51, + 0x2b, 0x07, 0x4b, 0x0a, 0x4b, 0x51, 0x2b, 0x07, 0x4b, 0x0a, 0x4b, 0x51, 0x2b, 0x07, 0x4b, 0x49, + 0x41, 0x13, 0x13, 0x0f, 0x16, 0x0f, 0x16, 0x07, 0x16, 0x41, 0x55, 0x16, 0x41, 0x55, 0x40, 0x40, + 0x49, 0x08, 0x0e, 0x06, 0x49, 0x0f, 0x06, 0x41, 0x07, 0x1f, 0x27, 0x08, 0x41, 0x0a, 0x0c, 0x0f, + 0x49, 0x2b, 0x19, 0x13, 0x49, 0x18, 0x0c, 0x15, 0x06, 0x07, 0x16, 0x11, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x43, 0x41, 0x51, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x02, 0x40, 0x40, 0x40, 0x02, 0x40, + 0x41, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x06, 0x06, 0x54, + 0x51, 0x45, 0x06, 0x12, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x4c, 0x4c, 0x42, 0x4a, + 0x49, 0x07, 0x4a, 0x5a, 0x49, 0x44, 0x54, 0x61, 0x5a, 0x54, 0x47, 0x03, 0x05, 0x40, 0x4c, 0x4c, + 0x42, 0x4a, 0x49, 0x07, 0x4a, 0x5a, 0x49, 0x44, 0x54, 0x61, 0x5a, 0x54, 0x47, 0x03, 0x05, 0x40, + 0x12, 0x4e, 0x26, 0x51, 0x54, 0x54, 0x4a, 0x4c, 0x4c, 0x45, 0x42, 0x03, 0x42, 0x0b, 0x4a, 0x51, + 0x2a, 0x07, 0x4a, 0x0b, 0x4a, 0x51, 0x2a, 0x07, 0x4a, 0x0b, 0x4a, 0x51, 0x2a, 0x07, 0x4a, 0x49, + 0x41, 0x12, 0x12, 0x0f, 0x16, 0x0f, 0x16, 0x07, 0x16, 0x41, 0x54, 0x16, 0x41, 0x54, 0x40, 0x40, + 0x49, 0x0a, 0x0e, 0x06, 0x49, 0x0f, 0x06, 0x41, 0x07, 0x20, 0x27, 0x0a, 0x41, 0x0b, 0x0d, 0x0f, + 0x49, 0x2a, 0x19, 0x12, 0x49, 0x17, 0x0d, 0x14, 0x06, 0x07, 0x16, 0x11, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x44, 0x41, 0x51, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x02, 0x40, 0x40, 0x40, 0x02, 0x01, + 0x41, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x06, 0x06, 0x53, + 0x51, 0x44, 0x06, 0x12, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x4b, 0x4b, 0x42, 0x4a, + 0x49, 0x07, 0x4a, 0x5a, 0x49, 0x43, 0x53, 0x61, 0x5a, 0x53, 0x45, 0x04, 0x05, 0x01, 0x4b, 0x4b, + 0x42, 0x4a, 0x49, 0x07, 0x4a, 0x5a, 0x49, 0x43, 0x53, 0x61, 0x5a, 0x53, 0x45, 0x04, 0x05, 0x01, + 0x13, 0x4e, 0x26, 0x51, 0x53, 0x53, 0x4a, 0x4b, 0x4b, 0x44, 0x42, 0x04, 0x42, 0x0c, 0x4a, 0x51, + 0x2a, 0x07, 0x4a, 0x0c, 0x4a, 0x51, 0x2a, 0x07, 0x4a, 0x0c, 0x4a, 0x51, 0x2a, 0x07, 0x4a, 0x49, + 0x41, 0x12, 0x12, 0x0f, 0x16, 0x0f, 0x16, 0x07, 0x16, 0x41, 0x53, 0x16, 0x41, 0x53, 0x40, 0x40, + 0x49, 0x0b, 0x0e, 0x06, 0x49, 0x0f, 0x06, 0x41, 0x07, 0x22, 0x27, 0x0b, 0x41, 0x0c, 0x0d, 0x0f, + 0x49, 0x2a, 0x19, 0x12, 0x49, 0x15, 0x0d, 0x13, 0x06, 0x07, 0x16, 0x11, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x45, 0x40, 0x50, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x01, 0x40, 0x40, 0x40, 0x01, 0x03, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x07, 0x07, 0x52, + 0x50, 0x43, 0x07, 0x11, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x4a, 0x4a, 0x41, 0x49, + 0x48, 0x07, 0x49, 0x59, 0x48, 0x42, 0x52, 0x60, 0x59, 0x52, 0x44, 0x05, 0x06, 0x03, 0x4a, 0x4a, + 0x41, 0x49, 0x48, 0x07, 0x49, 0x59, 0x48, 0x42, 0x52, 0x60, 0x59, 0x52, 0x44, 0x05, 0x06, 0x03, + 0x14, 0x4f, 0x27, 0x50, 0x52, 0x52, 0x49, 0x4a, 0x4a, 0x43, 0x41, 0x05, 0x41, 0x0d, 0x49, 0x50, + 0x29, 0x07, 0x49, 0x0d, 0x49, 0x50, 0x29, 0x07, 0x49, 0x0d, 0x49, 0x50, 0x29, 0x07, 0x49, 0x48, + 0x40, 0x11, 0x11, 0x0f, 0x17, 0x0f, 0x17, 0x07, 0x17, 0x40, 0x52, 0x17, 0x40, 0x52, 0x40, 0x40, + 0x48, 0x0c, 0x0f, 0x07, 0x48, 0x0f, 0x07, 0x40, 0x07, 0x23, 0x27, 0x0c, 0x40, 0x0d, 0x0e, 0x0f, + 0x48, 0x29, 0x18, 0x11, 0x48, 0x14, 0x0e, 0x12, 0x07, 0x07, 0x17, 0x10, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x46, 0x40, 0x50, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x40, 0x40, 0x40, 0x00, 0x04, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x07, 0x07, 0x51, + 0x50, 0x42, 0x07, 0x10, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x49, 0x49, 0x41, 0x49, + 0x48, 0x07, 0x49, 0x59, 0x48, 0x41, 0x51, 0x60, 0x59, 0x51, 0x42, 0x06, 0x06, 0x04, 0x49, 0x49, + 0x41, 0x49, 0x48, 0x07, 0x49, 0x59, 0x48, 0x41, 0x51, 0x60, 0x59, 0x51, 0x42, 0x06, 0x06, 0x04, + 0x15, 0x4f, 0x27, 0x50, 0x51, 0x51, 0x49, 0x49, 0x49, 0x42, 0x41, 0x06, 0x41, 0x0e, 0x49, 0x50, + 0x28, 0x07, 0x49, 0x0e, 0x49, 0x50, 0x28, 0x07, 0x49, 0x0e, 0x49, 0x50, 0x28, 0x07, 0x49, 0x48, + 0x40, 0x10, 0x10, 0x0f, 0x17, 0x0f, 0x17, 0x07, 0x17, 0x40, 0x51, 0x17, 0x40, 0x51, 0x40, 0x40, + 0x48, 0x0d, 0x0f, 0x07, 0x48, 0x0f, 0x07, 0x40, 0x07, 0x25, 0x27, 0x0d, 0x40, 0x0e, 0x0e, 0x0f, + 0x48, 0x28, 0x18, 0x10, 0x48, 0x12, 0x0e, 0x11, 0x07, 0x07, 0x17, 0x10, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x47, 0x40, 0x50, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x40, 0x40, 0x40, 0x00, 0x06, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x07, 0x07, 0x50, + 0x50, 0x40, 0x07, 0x10, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x48, 0x48, 0x40, 0x48, + 0x48, 0x07, 0x48, 0x58, 0x48, 0x40, 0x50, 0x60, 0x58, 0x50, 0x40, 0x07, 0x07, 0x06, 0x48, 0x48, + 0x40, 0x48, 0x48, 0x07, 0x48, 0x58, 0x48, 0x40, 0x50, 0x60, 0x58, 0x50, 0x40, 0x07, 0x07, 0x06, + 0x17, 0x4f, 0x27, 0x50, 0x50, 0x50, 0x48, 0x48, 0x48, 0x40, 0x40, 0x07, 0x40, 0x0f, 0x48, 0x50, + 0x28, 0x07, 0x48, 0x0f, 0x48, 0x50, 0x28, 0x07, 0x48, 0x0f, 0x48, 0x50, 0x28, 0x07, 0x48, 0x48, + 0x40, 0x10, 0x10, 0x0f, 0x17, 0x0f, 0x17, 0x07, 0x17, 0x40, 0x50, 0x17, 0x40, 0x50, 0x40, 0x40, + 0x48, 0x0f, 0x0f, 0x07, 0x48, 0x0f, 0x07, 0x40, 0x07, 0x27, 0x27, 0x0f, 0x40, 0x0f, 0x0f, 0x0f, + 0x48, 0x28, 0x18, 0x10, 0x48, 0x10, 0x0f, 0x10, 0x07, 0x07, 0x17, 0x10, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x48, 0x00, 0x4f, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x08, + 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x08, 0x08, 0x4f, + 0x4f, 0x00, 0x08, 0x0f, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x47, 0x47, 0x00, 0x47, + 0x47, 0x07, 0x47, 0x57, 0x47, 0x00, 0x4f, 0x5f, 0x57, 0x4f, 0x00, 0x08, 0x08, 0x08, 0x47, 0x47, + 0x00, 0x47, 0x47, 0x07, 0x47, 0x57, 0x47, 0x00, 0x4f, 0x5f, 0x57, 0x4f, 0x00, 0x08, 0x08, 0x08, + 0x18, 0x50, 0x28, 0x4f, 0x4f, 0x4f, 0x47, 0x47, 0x47, 0x00, 0x00, 0x08, 0x00, 0x10, 0x47, 0x4f, + 0x27, 0x07, 0x47, 0x10, 0x47, 0x4f, 0x27, 0x07, 0x47, 0x10, 0x47, 0x4f, 0x27, 0x07, 0x47, 0x47, + 0x00, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x18, 0x07, 0x18, 0x00, 0x4f, 0x18, 0x00, 0x4f, 0x40, 0x40, + 0x47, 0x10, 0x10, 0x08, 0x47, 0x0f, 0x08, 0x00, 0x07, 0x28, 0x27, 0x10, 0x00, 0x10, 0x10, 0x0f, + 0x47, 0x27, 0x17, 0x0f, 0x47, 0x0f, 0x10, 0x0f, 0x08, 0x07, 0x18, 0x0f, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x49, 0x00, 0x4f, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x0a, + 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x08, 0x08, 0x4e, + 0x4f, 0x01, 0x08, 0x0f, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x46, 0x46, 0x00, 0x47, + 0x47, 0x07, 0x47, 0x57, 0x47, 0x01, 0x4e, 0x5f, 0x57, 0x4e, 0x02, 0x09, 0x08, 0x0a, 0x46, 0x46, + 0x00, 0x47, 0x47, 0x07, 0x47, 0x57, 0x47, 0x01, 0x4e, 0x5f, 0x57, 0x4e, 0x02, 0x09, 0x08, 0x0a, + 0x19, 0x50, 0x28, 0x4f, 0x4e, 0x4e, 0x47, 0x46, 0x46, 0x01, 0x00, 0x09, 0x00, 0x11, 0x47, 0x4f, + 0x27, 0x07, 0x47, 0x11, 0x47, 0x4f, 0x27, 0x07, 0x47, 0x11, 0x47, 0x4f, 0x27, 0x07, 0x47, 0x47, + 0x00, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x18, 0x07, 0x18, 0x00, 0x4e, 0x18, 0x00, 0x4e, 0x40, 0x40, + 0x47, 0x11, 0x10, 0x08, 0x47, 0x0f, 0x08, 0x00, 0x07, 0x2a, 0x27, 0x11, 0x00, 0x11, 0x10, 0x0f, + 0x47, 0x27, 0x17, 0x0f, 0x47, 0x0d, 0x10, 0x0e, 0x08, 0x07, 0x18, 0x0f, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4a, 0x00, 0x4f, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x40, 0x40, 0x40, 0x41, 0x0c, + 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x08, 0x08, 0x4d, + 0x4f, 0x02, 0x08, 0x0e, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x45, 0x45, 0x01, 0x46, + 0x47, 0x07, 0x46, 0x56, 0x47, 0x02, 0x4d, 0x5f, 0x56, 0x4d, 0x03, 0x0a, 0x09, 0x0c, 0x45, 0x45, + 0x01, 0x46, 0x47, 0x07, 0x46, 0x56, 0x47, 0x02, 0x4d, 0x5f, 0x56, 0x4d, 0x03, 0x0a, 0x09, 0x0c, + 0x1a, 0x50, 0x28, 0x4f, 0x4d, 0x4d, 0x46, 0x45, 0x45, 0x02, 0x01, 0x0a, 0x01, 0x12, 0x46, 0x4f, + 0x26, 0x07, 0x46, 0x12, 0x46, 0x4f, 0x26, 0x07, 0x46, 0x12, 0x46, 0x4f, 0x26, 0x07, 0x46, 0x47, + 0x00, 0x0e, 0x0e, 0x0f, 0x18, 0x0f, 0x18, 0x07, 0x18, 0x00, 0x4d, 0x18, 0x00, 0x4d, 0x40, 0x40, + 0x47, 0x12, 0x10, 0x08, 0x47, 0x0f, 0x08, 0x00, 0x07, 0x2b, 0x27, 0x12, 0x00, 0x12, 0x11, 0x0f, + 0x47, 0x26, 0x17, 0x0e, 0x47, 0x0c, 0x11, 0x0d, 0x08, 0x07, 0x18, 0x0f, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4b, 0x01, 0x4e, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0x40, 0x40, 0x40, 0x42, 0x0e, + 0x01, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x09, 0x09, 0x4c, + 0x4e, 0x04, 0x09, 0x0d, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x01, 0x01, 0x44, 0x44, 0x02, 0x45, + 0x46, 0x07, 0x45, 0x55, 0x46, 0x03, 0x4c, 0x5e, 0x55, 0x4c, 0x05, 0x0b, 0x0a, 0x0e, 0x44, 0x44, + 0x02, 0x45, 0x46, 0x07, 0x45, 0x55, 0x46, 0x03, 0x4c, 0x5e, 0x55, 0x4c, 0x05, 0x0b, 0x0a, 0x0e, + 0x1c, 0x51, 0x29, 0x4e, 0x4c, 0x4c, 0x45, 0x44, 0x44, 0x04, 0x02, 0x0b, 0x02, 0x13, 0x45, 0x4e, + 0x25, 0x07, 0x45, 0x13, 0x45, 0x4e, 0x25, 0x07, 0x45, 0x13, 0x45, 0x4e, 0x25, 0x07, 0x45, 0x46, + 0x01, 0x0d, 0x0d, 0x0f, 0x19, 0x0f, 0x19, 0x07, 0x19, 0x01, 0x4c, 0x19, 0x01, 0x4c, 0x40, 0x40, + 0x46, 0x14, 0x11, 0x09, 0x46, 0x0f, 0x09, 0x01, 0x07, 0x2d, 0x27, 0x14, 0x01, 0x13, 0x12, 0x0f, + 0x46, 0x25, 0x16, 0x0d, 0x46, 0x0a, 0x12, 0x0c, 0x09, 0x07, 0x19, 0x0e, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4c, 0x01, 0x4e, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0x40, 0x40, 0x40, 0x42, 0x10, + 0x01, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x09, 0x09, 0x4b, + 0x4e, 0x05, 0x09, 0x0d, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x01, 0x01, 0x43, 0x43, 0x02, 0x45, + 0x46, 0x07, 0x45, 0x55, 0x46, 0x04, 0x4b, 0x5e, 0x55, 0x4b, 0x06, 0x0c, 0x0a, 0x10, 0x43, 0x43, + 0x02, 0x45, 0x46, 0x07, 0x45, 0x55, 0x46, 0x04, 0x4b, 0x5e, 0x55, 0x4b, 0x06, 0x0c, 0x0a, 0x10, + 0x1d, 0x51, 0x29, 0x4e, 0x4b, 0x4b, 0x45, 0x43, 0x43, 0x05, 0x02, 0x0c, 0x02, 0x14, 0x45, 0x4e, + 0x25, 0x07, 0x45, 0x14, 0x45, 0x4e, 0x25, 0x07, 0x45, 0x14, 0x45, 0x4e, 0x25, 0x07, 0x45, 0x46, + 0x01, 0x0d, 0x0d, 0x0f, 0x19, 0x0f, 0x19, 0x07, 0x19, 0x01, 0x4b, 0x19, 0x01, 0x4b, 0x40, 0x40, + 0x46, 0x15, 0x11, 0x09, 0x46, 0x0f, 0x09, 0x01, 0x07, 0x2e, 0x27, 0x15, 0x01, 0x14, 0x12, 0x0f, + 0x46, 0x25, 0x16, 0x0d, 0x46, 0x09, 0x12, 0x0b, 0x09, 0x07, 0x19, 0x0e, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4d, 0x01, 0x4e, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x43, 0x40, 0x40, 0x40, 0x43, 0x12, + 0x01, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x09, 0x09, 0x4a, + 0x4e, 0x06, 0x09, 0x0c, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x01, 0x01, 0x42, 0x42, 0x03, 0x44, + 0x46, 0x07, 0x44, 0x54, 0x46, 0x05, 0x4a, 0x5e, 0x54, 0x4a, 0x08, 0x0d, 0x0b, 0x12, 0x42, 0x42, + 0x03, 0x44, 0x46, 0x07, 0x44, 0x54, 0x46, 0x05, 0x4a, 0x5e, 0x54, 0x4a, 0x08, 0x0d, 0x0b, 0x12, + 0x1e, 0x51, 0x29, 0x4e, 0x4a, 0x4a, 0x44, 0x42, 0x42, 0x06, 0x03, 0x0d, 0x03, 0x15, 0x44, 0x4e, + 0x24, 0x07, 0x44, 0x15, 0x44, 0x4e, 0x24, 0x07, 0x44, 0x15, 0x44, 0x4e, 0x24, 0x07, 0x44, 0x46, + 0x01, 0x0c, 0x0c, 0x0f, 0x19, 0x0f, 0x19, 0x07, 0x19, 0x01, 0x4a, 0x19, 0x01, 0x4a, 0x40, 0x40, + 0x46, 0x16, 0x11, 0x09, 0x46, 0x0f, 0x09, 0x01, 0x07, 0x30, 0x27, 0x16, 0x01, 0x15, 0x13, 0x0f, + 0x46, 0x24, 0x16, 0x0c, 0x46, 0x07, 0x13, 0x0a, 0x09, 0x07, 0x19, 0x0e, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4e, 0x01, 0x4e, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x44, 0x40, 0x40, 0x40, 0x44, 0x13, + 0x01, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x09, 0x09, 0x4a, + 0x4e, 0x07, 0x09, 0x0b, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x01, 0x01, 0x42, 0x42, 0x03, 0x44, + 0x46, 0x07, 0x44, 0x54, 0x46, 0x05, 0x4a, 0x5e, 0x54, 0x4a, 0x09, 0x0d, 0x0b, 0x13, 0x42, 0x42, + 0x03, 0x44, 0x46, 0x07, 0x44, 0x54, 0x46, 0x05, 0x4a, 0x5e, 0x54, 0x4a, 0x09, 0x0d, 0x0b, 0x13, + 0x1f, 0x52, 0x29, 0x4e, 0x4a, 0x4a, 0x44, 0x42, 0x42, 0x07, 0x03, 0x0d, 0x03, 0x15, 0x44, 0x4e, + 0x23, 0x07, 0x44, 0x15, 0x44, 0x4e, 0x23, 0x07, 0x44, 0x15, 0x44, 0x4e, 0x23, 0x07, 0x44, 0x46, + 0x01, 0x0b, 0x0b, 0x0f, 0x19, 0x0f, 0x19, 0x07, 0x19, 0x01, 0x4a, 0x19, 0x01, 0x4a, 0x40, 0x40, + 0x46, 0x17, 0x11, 0x09, 0x46, 0x0f, 0x09, 0x01, 0x07, 0x31, 0x27, 0x17, 0x01, 0x15, 0x13, 0x0f, + 0x46, 0x23, 0x15, 0x0b, 0x46, 0x05, 0x13, 0x09, 0x09, 0x07, 0x19, 0x0d, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4e, 0x02, 0x4d, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x44, 0x40, 0x40, 0x40, 0x44, 0x15, + 0x02, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0a, 0x0a, 0x49, + 0x4d, 0x09, 0x0a, 0x0b, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x02, 0x02, 0x41, 0x41, 0x04, 0x43, + 0x45, 0x07, 0x43, 0x53, 0x45, 0x06, 0x49, 0x5d, 0x53, 0x49, 0x0b, 0x0e, 0x0c, 0x15, 0x41, 0x41, + 0x04, 0x43, 0x45, 0x07, 0x43, 0x53, 0x45, 0x06, 0x49, 0x5d, 0x53, 0x49, 0x0b, 0x0e, 0x0c, 0x15, + 0x21, 0x52, 0x2a, 0x4d, 0x49, 0x49, 0x43, 0x41, 0x41, 0x09, 0x04, 0x0e, 0x04, 0x16, 0x43, 0x4d, + 0x23, 0x07, 0x43, 0x16, 0x43, 0x4d, 0x23, 0x07, 0x43, 0x16, 0x43, 0x4d, 0x23, 0x07, 0x43, 0x45, + 0x02, 0x0b, 0x0b, 0x0f, 0x1a, 0x0f, 0x1a, 0x07, 0x1a, 0x02, 0x49, 0x1a, 0x02, 0x49, 0x40, 0x40, + 0x45, 0x19, 0x12, 0x0a, 0x45, 0x0f, 0x0a, 0x02, 0x07, 0x33, 0x27, 0x19, 0x02, 0x16, 0x14, 0x0f, + 0x45, 0x23, 0x15, 0x0b, 0x45, 0x04, 0x14, 0x09, 0x0a, 0x07, 0x1a, 0x0d, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4f, 0x02, 0x4d, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x45, 0x40, 0x40, 0x40, 0x45, 0x17, + 0x02, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0a, 0x0a, 0x48, + 0x4d, 0x0a, 0x0a, 0x0a, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x02, 0x02, 0x40, 0x40, 0x05, 0x42, + 0x45, 0x07, 0x42, 0x52, 0x45, 0x07, 0x48, 0x5d, 0x52, 0x48, 0x0d, 0x0f, 0x0d, 0x17, 0x40, 0x40, + 0x05, 0x42, 0x45, 0x07, 0x42, 0x52, 0x45, 0x07, 0x48, 0x5d, 0x52, 0x48, 0x0d, 0x0f, 0x0d, 0x17, + 0x22, 0x52, 0x2a, 0x4d, 0x48, 0x48, 0x42, 0x40, 0x40, 0x0a, 0x05, 0x0f, 0x05, 0x17, 0x42, 0x4d, + 0x22, 0x07, 0x42, 0x17, 0x42, 0x4d, 0x22, 0x07, 0x42, 0x17, 0x42, 0x4d, 0x22, 0x07, 0x42, 0x45, + 0x02, 0x0a, 0x0a, 0x0f, 0x1a, 0x0f, 0x1a, 0x07, 0x1a, 0x02, 0x48, 0x1a, 0x02, 0x48, 0x40, 0x40, + 0x45, 0x1a, 0x12, 0x0a, 0x45, 0x0f, 0x0a, 0x02, 0x07, 0x35, 0x27, 0x1a, 0x02, 0x17, 0x15, 0x0f, + 0x45, 0x22, 0x15, 0x0a, 0x45, 0x02, 0x15, 0x08, 0x0a, 0x07, 0x1a, 0x0d, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x50, 0x02, 0x4d, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x45, 0x40, 0x40, 0x40, 0x45, 0x19, + 0x02, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0a, 0x0a, 0x47, + 0x4d, 0x0b, 0x0a, 0x0a, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x02, 0x02, 0x00, 0x00, 0x05, 0x42, + 0x45, 0x07, 0x42, 0x52, 0x45, 0x08, 0x47, 0x5d, 0x52, 0x47, 0x0e, 0x10, 0x0d, 0x19, 0x00, 0x00, + 0x05, 0x42, 0x45, 0x07, 0x42, 0x52, 0x45, 0x08, 0x47, 0x5d, 0x52, 0x47, 0x0e, 0x10, 0x0d, 0x19, + 0x23, 0x52, 0x2a, 0x4d, 0x47, 0x47, 0x42, 0x00, 0x00, 0x0b, 0x05, 0x10, 0x05, 0x18, 0x42, 0x4d, + 0x22, 0x07, 0x42, 0x18, 0x42, 0x4d, 0x22, 0x07, 0x42, 0x18, 0x42, 0x4d, 0x22, 0x07, 0x42, 0x45, + 0x02, 0x0a, 0x0a, 0x0f, 0x1a, 0x0f, 0x1a, 0x07, 0x1a, 0x02, 0x47, 0x1a, 0x02, 0x47, 0x40, 0x40, + 0x45, 0x1b, 0x12, 0x0a, 0x45, 0x0f, 0x0a, 0x02, 0x07, 0x36, 0x27, 0x1b, 0x02, 0x18, 0x15, 0x0f, + 0x45, 0x22, 0x15, 0x0a, 0x45, 0x01, 0x15, 0x07, 0x0a, 0x07, 0x1a, 0x0d, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x51, 0x03, 0x4c, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x46, 0x40, 0x40, 0x40, 0x46, 0x1b, + 0x03, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0b, 0x0b, 0x46, + 0x4c, 0x0c, 0x0b, 0x09, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x03, 0x03, 0x01, 0x01, 0x06, 0x41, + 0x44, 0x07, 0x41, 0x51, 0x44, 0x09, 0x46, 0x5c, 0x51, 0x46, 0x10, 0x11, 0x0e, 0x1b, 0x01, 0x01, + 0x06, 0x41, 0x44, 0x07, 0x41, 0x51, 0x44, 0x09, 0x46, 0x5c, 0x51, 0x46, 0x10, 0x11, 0x0e, 0x1b, + 0x24, 0x53, 0x2b, 0x4c, 0x46, 0x46, 0x41, 0x01, 0x01, 0x0c, 0x06, 0x11, 0x06, 0x19, 0x41, 0x4c, + 0x21, 0x07, 0x41, 0x19, 0x41, 0x4c, 0x21, 0x07, 0x41, 0x19, 0x41, 0x4c, 0x21, 0x07, 0x41, 0x44, + 0x03, 0x09, 0x09, 0x0f, 0x1b, 0x0f, 0x1b, 0x07, 0x1b, 0x03, 0x46, 0x1b, 0x03, 0x46, 0x40, 0x40, + 0x44, 0x1c, 0x13, 0x0b, 0x44, 0x0f, 0x0b, 0x03, 0x07, 0x38, 0x27, 0x1c, 0x03, 0x19, 0x16, 0x0f, + 0x44, 0x21, 0x14, 0x09, 0x44, 0x40, 0x16, 0x06, 0x0b, 0x07, 0x1b, 0x0c, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x52, 0x03, 0x4c, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x47, 0x40, 0x40, 0x40, 0x47, 0x1d, + 0x03, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0b, 0x0b, 0x45, + 0x4c, 0x0e, 0x0b, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x03, 0x03, 0x02, 0x02, 0x07, 0x40, + 0x44, 0x07, 0x40, 0x50, 0x44, 0x0a, 0x45, 0x5c, 0x50, 0x45, 0x11, 0x12, 0x0f, 0x1d, 0x02, 0x02, + 0x07, 0x40, 0x44, 0x07, 0x40, 0x50, 0x44, 0x0a, 0x45, 0x5c, 0x50, 0x45, 0x11, 0x12, 0x0f, 0x1d, + 0x26, 0x53, 0x2b, 0x4c, 0x45, 0x45, 0x40, 0x02, 0x02, 0x0e, 0x07, 0x12, 0x07, 0x1a, 0x40, 0x4c, + 0x20, 0x07, 0x40, 0x1a, 0x40, 0x4c, 0x20, 0x07, 0x40, 0x1a, 0x40, 0x4c, 0x20, 0x07, 0x40, 0x44, + 0x03, 0x08, 0x08, 0x0f, 0x1b, 0x0f, 0x1b, 0x07, 0x1b, 0x03, 0x45, 0x1b, 0x03, 0x45, 0x40, 0x40, + 0x44, 0x1e, 0x13, 0x0b, 0x44, 0x0f, 0x0b, 0x03, 0x07, 0x39, 0x27, 0x1e, 0x03, 0x1a, 0x17, 0x0f, + 0x44, 0x20, 0x14, 0x08, 0x44, 0x41, 0x17, 0x05, 0x0b, 0x07, 0x1b, 0x0c, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x53, 0x03, 0x4c, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x47, 0x40, 0x40, 0x40, 0x47, 0x1f, + 0x03, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0b, 0x0b, 0x44, + 0x4c, 0x0f, 0x0b, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x03, 0x03, 0x03, 0x03, 0x07, 0x40, + 0x44, 0x07, 0x40, 0x50, 0x44, 0x0b, 0x44, 0x5c, 0x50, 0x44, 0x13, 0x13, 0x0f, 0x1f, 0x03, 0x03, + 0x07, 0x40, 0x44, 0x07, 0x40, 0x50, 0x44, 0x0b, 0x44, 0x5c, 0x50, 0x44, 0x13, 0x13, 0x0f, 0x1f, + 0x27, 0x53, 0x2b, 0x4c, 0x44, 0x44, 0x40, 0x03, 0x03, 0x0f, 0x07, 0x13, 0x07, 0x1b, 0x40, 0x4c, + 0x20, 0x07, 0x40, 0x1b, 0x40, 0x4c, 0x20, 0x07, 0x40, 0x1b, 0x40, 0x4c, 0x20, 0x07, 0x40, 0x44, + 0x03, 0x08, 0x08, 0x0f, 0x1b, 0x0f, 0x1b, 0x07, 0x1b, 0x03, 0x44, 0x1b, 0x03, 0x44, 0x40, 0x40, + 0x44, 0x1f, 0x13, 0x0b, 0x44, 0x0f, 0x0b, 0x03, 0x07, 0x3b, 0x27, 0x1f, 0x03, 0x1b, 0x17, 0x0f, + 0x44, 0x20, 0x14, 0x08, 0x44, 0x43, 0x17, 0x04, 0x0b, 0x07, 0x1b, 0x0c, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x54, 0x04, 0x4b, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x48, 0x40, 0x40, 0x40, 0x48, 0x21, + 0x04, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0c, 0x0c, 0x43, + 0x4b, 0x10, 0x0c, 0x07, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x04, 0x04, 0x04, 0x04, 0x08, 0x00, + 0x43, 0x07, 0x00, 0x4f, 0x43, 0x0c, 0x43, 0x5b, 0x4f, 0x43, 0x14, 0x14, 0x10, 0x21, 0x04, 0x04, + 0x08, 0x00, 0x43, 0x07, 0x00, 0x4f, 0x43, 0x0c, 0x43, 0x5b, 0x4f, 0x43, 0x14, 0x14, 0x10, 0x21, + 0x28, 0x54, 0x2c, 0x4b, 0x43, 0x43, 0x00, 0x04, 0x04, 0x10, 0x08, 0x14, 0x08, 0x1c, 0x00, 0x4b, + 0x1f, 0x07, 0x00, 0x1c, 0x00, 0x4b, 0x1f, 0x07, 0x00, 0x1c, 0x00, 0x4b, 0x1f, 0x07, 0x00, 0x43, + 0x04, 0x07, 0x07, 0x0f, 0x1c, 0x0f, 0x1c, 0x07, 0x1c, 0x04, 0x43, 0x1c, 0x04, 0x43, 0x40, 0x40, + 0x43, 0x20, 0x14, 0x0c, 0x43, 0x0f, 0x0c, 0x04, 0x07, 0x3c, 0x27, 0x20, 0x04, 0x1c, 0x18, 0x0f, + 0x43, 0x1f, 0x13, 0x07, 0x43, 0x44, 0x18, 0x03, 0x0c, 0x07, 0x1c, 0x0b, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x55, 0x04, 0x4b, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x49, 0x40, 0x40, 0x40, 0x49, 0x22, + 0x04, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0c, 0x0c, 0x42, + 0x4b, 0x11, 0x0c, 0x06, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x04, 0x04, 0x05, 0x05, 0x08, 0x00, + 0x43, 0x07, 0x00, 0x4f, 0x43, 0x0d, 0x42, 0x5b, 0x4f, 0x42, 0x16, 0x15, 0x10, 0x22, 0x05, 0x05, + 0x08, 0x00, 0x43, 0x07, 0x00, 0x4f, 0x43, 0x0d, 0x42, 0x5b, 0x4f, 0x42, 0x16, 0x15, 0x10, 0x22, + 0x29, 0x54, 0x2c, 0x4b, 0x42, 0x42, 0x00, 0x05, 0x05, 0x11, 0x08, 0x15, 0x08, 0x1d, 0x00, 0x4b, + 0x1e, 0x07, 0x00, 0x1d, 0x00, 0x4b, 0x1e, 0x07, 0x00, 0x1d, 0x00, 0x4b, 0x1e, 0x07, 0x00, 0x43, + 0x04, 0x06, 0x06, 0x0f, 0x1c, 0x0f, 0x1c, 0x07, 0x1c, 0x04, 0x42, 0x1c, 0x04, 0x42, 0x40, 0x40, + 0x43, 0x21, 0x14, 0x0c, 0x43, 0x0f, 0x0c, 0x04, 0x07, 0x3e, 0x27, 0x21, 0x04, 0x1d, 0x18, 0x0f, + 0x43, 0x1e, 0x13, 0x06, 0x43, 0x46, 0x18, 0x02, 0x0c, 0x07, 0x1c, 0x0b, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x56, 0x04, 0x4b, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x49, 0x40, 0x40, 0x40, 0x49, 0x24, + 0x04, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0c, 0x0c, 0x41, + 0x4b, 0x13, 0x0c, 0x06, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x04, 0x04, 0x06, 0x06, 0x09, 0x01, + 0x43, 0x07, 0x01, 0x4e, 0x43, 0x0e, 0x41, 0x5b, 0x4e, 0x41, 0x18, 0x16, 0x11, 0x24, 0x06, 0x06, + 0x09, 0x01, 0x43, 0x07, 0x01, 0x4e, 0x43, 0x0e, 0x41, 0x5b, 0x4e, 0x41, 0x18, 0x16, 0x11, 0x24, + 0x2b, 0x54, 0x2c, 0x4b, 0x41, 0x41, 0x01, 0x06, 0x06, 0x13, 0x09, 0x16, 0x09, 0x1e, 0x01, 0x4b, + 0x1e, 0x07, 0x01, 0x1e, 0x01, 0x4b, 0x1e, 0x07, 0x01, 0x1e, 0x01, 0x4b, 0x1e, 0x07, 0x01, 0x43, + 0x04, 0x06, 0x06, 0x0f, 0x1c, 0x0f, 0x1c, 0x07, 0x1c, 0x04, 0x41, 0x1c, 0x04, 0x41, 0x40, 0x40, + 0x43, 0x23, 0x14, 0x0c, 0x43, 0x0f, 0x0c, 0x04, 0x07, 0x3e, 0x27, 0x23, 0x04, 0x1e, 0x19, 0x0f, + 0x43, 0x1e, 0x13, 0x06, 0x43, 0x48, 0x19, 0x01, 0x0c, 0x07, 0x1c, 0x0b, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x57, 0x05, 0x4a, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x4a, 0x40, 0x40, 0x40, 0x4a, 0x26, + 0x05, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0d, 0x0d, 0x40, + 0x4a, 0x14, 0x0d, 0x05, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x05, 0x05, 0x07, 0x07, 0x0a, 0x02, + 0x42, 0x07, 0x02, 0x4d, 0x42, 0x0f, 0x40, 0x5a, 0x4d, 0x40, 0x19, 0x17, 0x12, 0x26, 0x07, 0x07, + 0x0a, 0x02, 0x42, 0x07, 0x02, 0x4d, 0x42, 0x0f, 0x40, 0x5a, 0x4d, 0x40, 0x19, 0x17, 0x12, 0x26, + 0x2c, 0x55, 0x2d, 0x4a, 0x40, 0x40, 0x02, 0x07, 0x07, 0x14, 0x0a, 0x17, 0x0a, 0x1f, 0x02, 0x4a, + 0x1d, 0x07, 0x02, 0x1f, 0x02, 0x4a, 0x1d, 0x07, 0x02, 0x1f, 0x02, 0x4a, 0x1d, 0x07, 0x02, 0x42, + 0x05, 0x05, 0x05, 0x0f, 0x1d, 0x0f, 0x1d, 0x07, 0x1d, 0x05, 0x40, 0x1d, 0x05, 0x40, 0x40, 0x40, + 0x42, 0x24, 0x15, 0x0d, 0x42, 0x0f, 0x0d, 0x05, 0x07, 0x3e, 0x27, 0x24, 0x05, 0x1f, 0x1a, 0x0f, + 0x42, 0x1d, 0x12, 0x05, 0x42, 0x49, 0x1a, 0x00, 0x0d, 0x07, 0x1d, 0x0a, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x58, 0x05, 0x4a, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x4a, 0x40, 0x40, 0x40, 0x4a, 0x28, + 0x05, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0d, 0x0d, 0x00, + 0x4a, 0x15, 0x0d, 0x05, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x05, 0x05, 0x08, 0x08, 0x0a, 0x02, + 0x42, 0x07, 0x02, 0x4d, 0x42, 0x10, 0x00, 0x5a, 0x4d, 0x00, 0x1b, 0x18, 0x12, 0x28, 0x08, 0x08, + 0x0a, 0x02, 0x42, 0x07, 0x02, 0x4d, 0x42, 0x10, 0x00, 0x5a, 0x4d, 0x00, 0x1b, 0x18, 0x12, 0x28, + 0x2d, 0x55, 0x2d, 0x4a, 0x00, 0x00, 0x02, 0x08, 0x08, 0x15, 0x0a, 0x18, 0x0a, 0x20, 0x02, 0x4a, + 0x1d, 0x07, 0x02, 0x20, 0x02, 0x4a, 0x1d, 0x07, 0x02, 0x20, 0x02, 0x4a, 0x1d, 0x07, 0x02, 0x42, + 0x05, 0x05, 0x05, 0x0f, 0x1d, 0x0f, 0x1d, 0x07, 0x1d, 0x05, 0x00, 0x1d, 0x05, 0x00, 0x40, 0x40, + 0x42, 0x25, 0x15, 0x0d, 0x42, 0x0f, 0x0d, 0x05, 0x07, 0x3e, 0x27, 0x25, 0x05, 0x20, 0x1a, 0x0f, + 0x42, 0x1d, 0x12, 0x05, 0x42, 0x4b, 0x1a, 0x40, 0x0d, 0x07, 0x1d, 0x0a, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x59, 0x05, 0x4a, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x4b, 0x40, 0x40, 0x40, 0x4b, 0x2a, + 0x05, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0d, 0x0d, 0x01, + 0x4a, 0x16, 0x0d, 0x04, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x05, 0x05, 0x09, 0x09, 0x0b, 0x03, + 0x42, 0x07, 0x03, 0x4c, 0x42, 0x11, 0x01, 0x5a, 0x4c, 0x01, 0x1c, 0x19, 0x13, 0x2a, 0x09, 0x09, + 0x0b, 0x03, 0x42, 0x07, 0x03, 0x4c, 0x42, 0x11, 0x01, 0x5a, 0x4c, 0x01, 0x1c, 0x19, 0x13, 0x2a, + 0x2e, 0x55, 0x2d, 0x4a, 0x01, 0x01, 0x03, 0x09, 0x09, 0x16, 0x0b, 0x19, 0x0b, 0x21, 0x03, 0x4a, + 0x1c, 0x07, 0x03, 0x21, 0x03, 0x4a, 0x1c, 0x07, 0x03, 0x21, 0x03, 0x4a, 0x1c, 0x07, 0x03, 0x42, + 0x05, 0x04, 0x04, 0x0f, 0x1d, 0x0f, 0x1d, 0x07, 0x1d, 0x05, 0x01, 0x1d, 0x05, 0x01, 0x40, 0x40, + 0x42, 0x26, 0x15, 0x0d, 0x42, 0x0f, 0x0d, 0x05, 0x07, 0x3e, 0x27, 0x26, 0x05, 0x21, 0x1b, 0x0f, + 0x42, 0x1c, 0x12, 0x04, 0x42, 0x4c, 0x1b, 0x41, 0x0d, 0x07, 0x1d, 0x0a, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x5a, 0x06, 0x49, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x4c, 0x40, 0x40, 0x40, 0x4c, 0x2c, + 0x06, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0e, 0x0e, 0x02, + 0x49, 0x18, 0x0e, 0x03, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x06, 0x06, 0x0a, 0x0a, 0x0c, 0x04, + 0x41, 0x07, 0x04, 0x4b, 0x41, 0x12, 0x02, 0x59, 0x4b, 0x02, 0x1e, 0x1a, 0x14, 0x2c, 0x0a, 0x0a, + 0x0c, 0x04, 0x41, 0x07, 0x04, 0x4b, 0x41, 0x12, 0x02, 0x59, 0x4b, 0x02, 0x1e, 0x1a, 0x14, 0x2c, + 0x30, 0x56, 0x2e, 0x49, 0x02, 0x02, 0x04, 0x0a, 0x0a, 0x18, 0x0c, 0x1a, 0x0c, 0x22, 0x04, 0x49, + 0x1b, 0x07, 0x04, 0x22, 0x04, 0x49, 0x1b, 0x07, 0x04, 0x22, 0x04, 0x49, 0x1b, 0x07, 0x04, 0x41, + 0x06, 0x03, 0x03, 0x0f, 0x1e, 0x0f, 0x1e, 0x07, 0x1e, 0x06, 0x02, 0x1e, 0x06, 0x02, 0x40, 0x40, + 0x41, 0x28, 0x16, 0x0e, 0x41, 0x0f, 0x0e, 0x06, 0x07, 0x3e, 0x27, 0x28, 0x06, 0x22, 0x1c, 0x0f, + 0x41, 0x1b, 0x11, 0x03, 0x41, 0x4e, 0x1c, 0x42, 0x0e, 0x07, 0x1e, 0x09, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x5b, 0x06, 0x49, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x4c, 0x40, 0x40, 0x40, 0x4c, 0x2e, + 0x06, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0e, 0x0e, 0x03, + 0x49, 0x19, 0x0e, 0x03, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x06, 0x06, 0x0b, 0x0b, 0x0c, 0x04, + 0x41, 0x07, 0x04, 0x4b, 0x41, 0x13, 0x03, 0x59, 0x4b, 0x03, 0x1f, 0x1b, 0x14, 0x2e, 0x0b, 0x0b, + 0x0c, 0x04, 0x41, 0x07, 0x04, 0x4b, 0x41, 0x13, 0x03, 0x59, 0x4b, 0x03, 0x1f, 0x1b, 0x14, 0x2e, + 0x31, 0x56, 0x2e, 0x49, 0x03, 0x03, 0x04, 0x0b, 0x0b, 0x19, 0x0c, 0x1b, 0x0c, 0x23, 0x04, 0x49, + 0x1b, 0x07, 0x04, 0x23, 0x04, 0x49, 0x1b, 0x07, 0x04, 0x23, 0x04, 0x49, 0x1b, 0x07, 0x04, 0x41, + 0x06, 0x03, 0x03, 0x0f, 0x1e, 0x0f, 0x1e, 0x07, 0x1e, 0x06, 0x03, 0x1e, 0x06, 0x03, 0x40, 0x40, + 0x41, 0x29, 0x16, 0x0e, 0x41, 0x0f, 0x0e, 0x06, 0x07, 0x3e, 0x27, 0x29, 0x06, 0x23, 0x1c, 0x0f, + 0x41, 0x1b, 0x11, 0x03, 0x41, 0x4f, 0x1c, 0x43, 0x0e, 0x07, 0x1e, 0x09, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x5c, 0x06, 0x49, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x4d, 0x40, 0x40, 0x40, 0x4d, 0x30, + 0x06, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0e, 0x0e, 0x04, + 0x49, 0x1a, 0x0e, 0x02, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x06, 0x06, 0x0c, 0x0c, 0x0d, 0x05, + 0x41, 0x07, 0x05, 0x4a, 0x41, 0x14, 0x04, 0x59, 0x4a, 0x04, 0x21, 0x1c, 0x15, 0x30, 0x0c, 0x0c, + 0x0d, 0x05, 0x41, 0x07, 0x05, 0x4a, 0x41, 0x14, 0x04, 0x59, 0x4a, 0x04, 0x21, 0x1c, 0x15, 0x30, + 0x32, 0x56, 0x2e, 0x49, 0x04, 0x04, 0x05, 0x0c, 0x0c, 0x1a, 0x0d, 0x1c, 0x0d, 0x24, 0x05, 0x49, + 0x1a, 0x07, 0x05, 0x24, 0x05, 0x49, 0x1a, 0x07, 0x05, 0x24, 0x05, 0x49, 0x1a, 0x07, 0x05, 0x41, + 0x06, 0x02, 0x02, 0x0f, 0x1e, 0x0f, 0x1e, 0x07, 0x1e, 0x06, 0x04, 0x1e, 0x06, 0x04, 0x40, 0x40, + 0x41, 0x2a, 0x16, 0x0e, 0x41, 0x0f, 0x0e, 0x06, 0x07, 0x3e, 0x27, 0x2a, 0x06, 0x24, 0x1d, 0x0f, + 0x41, 0x1a, 0x11, 0x02, 0x41, 0x51, 0x1d, 0x44, 0x0e, 0x07, 0x1e, 0x09, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x5d, 0x06, 0x49, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x4e, 0x40, 0x40, 0x40, 0x4e, 0x31, + 0x06, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0e, 0x0e, 0x04, + 0x49, 0x1b, 0x0e, 0x01, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x06, 0x06, 0x0c, 0x0c, 0x0d, 0x05, + 0x41, 0x07, 0x05, 0x4a, 0x41, 0x14, 0x04, 0x59, 0x4a, 0x04, 0x22, 0x1c, 0x15, 0x31, 0x0c, 0x0c, + 0x0d, 0x05, 0x41, 0x07, 0x05, 0x4a, 0x41, 0x14, 0x04, 0x59, 0x4a, 0x04, 0x22, 0x1c, 0x15, 0x31, + 0x33, 0x57, 0x2e, 0x49, 0x04, 0x04, 0x05, 0x0c, 0x0c, 0x1b, 0x0d, 0x1c, 0x0d, 0x24, 0x05, 0x49, + 0x19, 0x07, 0x05, 0x24, 0x05, 0x49, 0x19, 0x07, 0x05, 0x24, 0x05, 0x49, 0x19, 0x07, 0x05, 0x41, + 0x06, 0x01, 0x01, 0x0f, 0x1e, 0x0f, 0x1e, 0x07, 0x1e, 0x06, 0x04, 0x1e, 0x06, 0x04, 0x40, 0x40, + 0x41, 0x2b, 0x16, 0x0e, 0x41, 0x0f, 0x0e, 0x06, 0x07, 0x3e, 0x27, 0x2b, 0x06, 0x24, 0x1d, 0x0f, + 0x41, 0x19, 0x10, 0x01, 0x41, 0x53, 0x1d, 0x45, 0x0e, 0x07, 0x1e, 0x08, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x5d, 0x07, 0x48, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x4e, 0x40, 0x40, 0x40, 0x4e, 0x33, + 0x07, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0f, 0x0f, 0x05, + 0x48, 0x1d, 0x0f, 0x01, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x07, 0x0d, 0x0d, 0x0e, 0x06, + 0x40, 0x07, 0x06, 0x49, 0x40, 0x15, 0x05, 0x58, 0x49, 0x05, 0x24, 0x1d, 0x16, 0x33, 0x0d, 0x0d, + 0x0e, 0x06, 0x40, 0x07, 0x06, 0x49, 0x40, 0x15, 0x05, 0x58, 0x49, 0x05, 0x24, 0x1d, 0x16, 0x33, + 0x35, 0x57, 0x2f, 0x48, 0x05, 0x05, 0x06, 0x0d, 0x0d, 0x1d, 0x0e, 0x1d, 0x0e, 0x25, 0x06, 0x48, + 0x19, 0x07, 0x06, 0x25, 0x06, 0x48, 0x19, 0x07, 0x06, 0x25, 0x06, 0x48, 0x19, 0x07, 0x06, 0x40, + 0x07, 0x01, 0x01, 0x0f, 0x1f, 0x0f, 0x1f, 0x07, 0x1f, 0x07, 0x05, 0x1f, 0x07, 0x05, 0x40, 0x40, + 0x40, 0x2d, 0x17, 0x0f, 0x40, 0x0f, 0x0f, 0x07, 0x07, 0x3e, 0x27, 0x2d, 0x07, 0x25, 0x1e, 0x0f, + 0x40, 0x19, 0x10, 0x01, 0x40, 0x54, 0x1e, 0x45, 0x0f, 0x07, 0x1f, 0x08, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x5e, 0x07, 0x48, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x4f, 0x40, 0x40, 0x40, 0x4f, 0x35, + 0x07, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0f, 0x0f, 0x06, + 0x48, 0x1e, 0x0f, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x07, 0x0e, 0x0e, 0x0f, 0x07, + 0x40, 0x07, 0x07, 0x48, 0x40, 0x16, 0x06, 0x58, 0x48, 0x06, 0x26, 0x1e, 0x17, 0x35, 0x0e, 0x0e, + 0x0f, 0x07, 0x40, 0x07, 0x07, 0x48, 0x40, 0x16, 0x06, 0x58, 0x48, 0x06, 0x26, 0x1e, 0x17, 0x35, + 0x36, 0x57, 0x2f, 0x48, 0x06, 0x06, 0x07, 0x0e, 0x0e, 0x1e, 0x0f, 0x1e, 0x0f, 0x26, 0x07, 0x48, + 0x18, 0x07, 0x07, 0x26, 0x07, 0x48, 0x18, 0x07, 0x07, 0x26, 0x07, 0x48, 0x18, 0x07, 0x07, 0x40, + 0x07, 0x00, 0x00, 0x0f, 0x1f, 0x0f, 0x1f, 0x07, 0x1f, 0x07, 0x06, 0x1f, 0x07, 0x06, 0x40, 0x40, + 0x40, 0x2e, 0x17, 0x0f, 0x40, 0x0f, 0x0f, 0x07, 0x07, 0x3e, 0x27, 0x2e, 0x07, 0x26, 0x1f, 0x0f, + 0x40, 0x18, 0x10, 0x00, 0x40, 0x56, 0x1f, 0x46, 0x0f, 0x07, 0x1f, 0x08, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x5f, 0x07, 0x48, 0x58, 0x40, 0x40, 0x40, 0x40, 0x40, 0x4f, 0x40, 0x40, 0x40, 0x4f, 0x37, + 0x07, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x0f, 0x0f, 0x07, + 0x48, 0x1f, 0x0f, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x07, 0x0f, 0x0f, 0x0f, 0x07, + 0x40, 0x07, 0x07, 0x48, 0x40, 0x17, 0x07, 0x58, 0x48, 0x07, 0x27, 0x1f, 0x17, 0x37, 0x0f, 0x0f, + 0x0f, 0x07, 0x40, 0x07, 0x07, 0x48, 0x40, 0x17, 0x07, 0x58, 0x48, 0x07, 0x27, 0x1f, 0x17, 0x37, + 0x37, 0x57, 0x2f, 0x48, 0x07, 0x07, 0x07, 0x0f, 0x0f, 0x1f, 0x0f, 0x1f, 0x0f, 0x27, 0x07, 0x48, + 0x18, 0x07, 0x07, 0x27, 0x07, 0x48, 0x18, 0x07, 0x07, 0x27, 0x07, 0x48, 0x18, 0x07, 0x07, 0x40, + 0x07, 0x00, 0x00, 0x0f, 0x1f, 0x0f, 0x1f, 0x07, 0x1f, 0x07, 0x07, 0x1f, 0x07, 0x07, 0x40, 0x40, + 0x40, 0x2f, 0x17, 0x0f, 0x40, 0x0f, 0x0f, 0x07, 0x07, 0x3e, 0x27, 0x2f, 0x07, 0x27, 0x1f, 0x0f, + 0x40, 0x18, 0x10, 0x00, 0x40, 0x57, 0x1f, 0x47, 0x0f, 0x07, 0x1f, 0x08, 0x0f, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x07, 0x48, 0x48, 0x60, 0x40, 0x27, 0x07, 0x07, 0x27, 0x40, 0x48, 0x40, 0x40, 0x40, 0x0f, + 0x48, 0x68, 0x60, 0x40, 0x68, 0x68, 0x68, 0x68, 0x68, 0x07, 0x07, 0x0f, 0x50, 0x40, 0x60, 0x07, + 0x68, 0x27, 0x48, 0x17, 0x40, 0x50, 0x1f, 0x40, 0x40, 0x40, 0x48, 0x48, 0x58, 0x60, 0x60, 0x60, + 0x68, 0x68, 0x58, 0x68, 0x60, 0x60, 0x60, 0x68, 0x68, 0x68, 0x60, 0x50, 0x48, 0x50, 0x58, 0x60, + 0x60, 0x60, 0x68, 0x68, 0x58, 0x68, 0x60, 0x60, 0x60, 0x68, 0x68, 0x68, 0x60, 0x50, 0x48, 0x50, + 0x07, 0x50, 0x58, 0x40, 0x48, 0x40, 0x48, 0x07, 0x48, 0x48, 0x48, 0x68, 0x07, 0x1f, 0x17, 0x50, + 0x0f, 0x07, 0x40, 0x1f, 0x17, 0x50, 0x0f, 0x07, 0x40, 0x1f, 0x17, 0x50, 0x0f, 0x07, 0x40, 0x40, + 0x07, 0x48, 0x48, 0x48, 0x07, 0x48, 0x07, 0x17, 0x17, 0x17, 0x50, 0x17, 0x17, 0x50, 0x40, 0x40, + 0x40, 0x2f, 0x2f, 0x17, 0x40, 0x0f, 0x17, 0x1f, 0x1f, 0x1f, 0x27, 0x0f, 0x07, 0x07, 0x0f, 0x07, + 0x07, 0x3e, 0x1f, 0x17, 0x40, 0x17, 0x07, 0x1f, 0x48, 0x17, 0x48, 0x40, 0x48, 0x17, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x07, 0x47, 0x47, 0x5f, 0x40, 0x27, 0x07, 0x07, 0x27, 0x40, 0x47, 0x40, 0x40, 0x40, 0x0f, + 0x47, 0x66, 0x5f, 0x00, 0x66, 0x66, 0x66, 0x65, 0x65, 0x07, 0x07, 0x0f, 0x4f, 0x00, 0x5e, 0x07, + 0x67, 0x27, 0x47, 0x17, 0x40, 0x4f, 0x1f, 0x40, 0x40, 0x40, 0x47, 0x47, 0x57, 0x5f, 0x5e, 0x5f, + 0x66, 0x66, 0x57, 0x67, 0x5f, 0x5e, 0x5f, 0x67, 0x67, 0x66, 0x5e, 0x4f, 0x47, 0x4f, 0x57, 0x5f, + 0x5e, 0x5f, 0x66, 0x66, 0x57, 0x67, 0x5f, 0x5e, 0x5f, 0x67, 0x67, 0x66, 0x5e, 0x4f, 0x47, 0x4f, + 0x08, 0x4f, 0x56, 0x40, 0x48, 0x40, 0x47, 0x07, 0x47, 0x47, 0x47, 0x66, 0x07, 0x1f, 0x17, 0x4f, + 0x10, 0x07, 0x40, 0x1f, 0x17, 0x4f, 0x10, 0x07, 0x40, 0x1f, 0x17, 0x4f, 0x10, 0x07, 0x40, 0x40, + 0x07, 0x47, 0x47, 0x47, 0x08, 0x47, 0x08, 0x17, 0x17, 0x17, 0x4f, 0x17, 0x17, 0x4f, 0x40, 0x40, + 0x40, 0x2f, 0x2f, 0x17, 0x40, 0x0f, 0x17, 0x1f, 0x1f, 0x20, 0x27, 0x10, 0x07, 0x08, 0x10, 0x08, + 0x07, 0x3e, 0x1f, 0x17, 0x40, 0x17, 0x08, 0x1f, 0x47, 0x17, 0x46, 0x00, 0x47, 0x17, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x06, 0x46, 0x47, 0x5e, 0x40, 0x26, 0x06, 0x06, 0x27, 0x40, 0x47, 0x40, 0x40, 0x40, 0x0f, + 0x47, 0x64, 0x5e, 0x01, 0x65, 0x64, 0x64, 0x63, 0x63, 0x07, 0x07, 0x0f, 0x4e, 0x00, 0x5d, 0x07, + 0x66, 0x27, 0x46, 0x17, 0x40, 0x4f, 0x1e, 0x40, 0x40, 0x40, 0x47, 0x47, 0x56, 0x5e, 0x5d, 0x5e, + 0x65, 0x64, 0x56, 0x66, 0x5e, 0x5c, 0x5e, 0x66, 0x66, 0x65, 0x5d, 0x4e, 0x46, 0x4e, 0x56, 0x5e, + 0x5d, 0x5e, 0x65, 0x64, 0x56, 0x66, 0x5e, 0x5c, 0x5e, 0x66, 0x66, 0x65, 0x5d, 0x4e, 0x46, 0x4e, + 0x09, 0x4f, 0x54, 0x40, 0x48, 0x40, 0x47, 0x07, 0x47, 0x46, 0x46, 0x64, 0x07, 0x1f, 0x16, 0x4f, + 0x10, 0x07, 0x40, 0x1f, 0x16, 0x4f, 0x10, 0x07, 0x40, 0x1f, 0x16, 0x4f, 0x10, 0x07, 0x40, 0x40, + 0x07, 0x46, 0x46, 0x46, 0x09, 0x46, 0x09, 0x17, 0x17, 0x16, 0x4f, 0x17, 0x16, 0x4f, 0x40, 0x40, + 0x40, 0x2e, 0x2e, 0x17, 0x40, 0x0f, 0x17, 0x1e, 0x1e, 0x20, 0x27, 0x10, 0x07, 0x09, 0x10, 0x08, + 0x07, 0x3e, 0x1f, 0x17, 0x40, 0x17, 0x08, 0x1e, 0x46, 0x17, 0x45, 0x01, 0x46, 0x17, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x06, 0x45, 0x47, 0x5e, 0x40, 0x25, 0x06, 0x05, 0x27, 0x40, 0x47, 0x40, 0x40, 0x40, 0x0f, + 0x47, 0x63, 0x5d, 0x01, 0x64, 0x63, 0x62, 0x60, 0x60, 0x07, 0x07, 0x0f, 0x4e, 0x00, 0x5c, 0x07, + 0x65, 0x27, 0x45, 0x17, 0x40, 0x4f, 0x1d, 0x40, 0x40, 0x40, 0x47, 0x47, 0x56, 0x5d, 0x5c, 0x5d, + 0x64, 0x63, 0x56, 0x65, 0x5d, 0x5b, 0x5d, 0x65, 0x65, 0x64, 0x5c, 0x4d, 0x46, 0x4d, 0x56, 0x5d, + 0x5c, 0x5d, 0x64, 0x63, 0x56, 0x65, 0x5d, 0x5b, 0x5d, 0x65, 0x65, 0x64, 0x5c, 0x4d, 0x46, 0x4d, + 0x09, 0x4f, 0x52, 0x40, 0x48, 0x40, 0x47, 0x07, 0x47, 0x46, 0x46, 0x62, 0x07, 0x1f, 0x16, 0x4f, + 0x10, 0x07, 0x40, 0x1f, 0x16, 0x4f, 0x10, 0x07, 0x40, 0x1f, 0x16, 0x4f, 0x10, 0x07, 0x40, 0x40, + 0x07, 0x46, 0x46, 0x45, 0x09, 0x45, 0x09, 0x17, 0x17, 0x16, 0x4f, 0x17, 0x16, 0x4f, 0x40, 0x40, + 0x40, 0x2d, 0x2d, 0x17, 0x40, 0x0f, 0x17, 0x1e, 0x1e, 0x20, 0x27, 0x10, 0x07, 0x09, 0x10, 0x08, + 0x07, 0x3d, 0x1f, 0x17, 0x40, 0x17, 0x08, 0x1e, 0x45, 0x17, 0x44, 0x01, 0x45, 0x17, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x05, 0x44, 0x46, 0x5d, 0x40, 0x24, 0x05, 0x04, 0x27, 0x40, 0x46, 0x40, 0x40, 0x40, 0x0f, + 0x46, 0x61, 0x5c, 0x02, 0x63, 0x61, 0x60, 0x5e, 0x5e, 0x07, 0x07, 0x0e, 0x4d, 0x01, 0x5b, 0x07, + 0x64, 0x27, 0x44, 0x16, 0x40, 0x4e, 0x1c, 0x40, 0x40, 0x40, 0x46, 0x46, 0x55, 0x5c, 0x5b, 0x5c, + 0x63, 0x61, 0x55, 0x64, 0x5c, 0x59, 0x5c, 0x64, 0x64, 0x63, 0x5b, 0x4c, 0x45, 0x4c, 0x55, 0x5c, + 0x5b, 0x5c, 0x63, 0x61, 0x55, 0x64, 0x5c, 0x59, 0x5c, 0x64, 0x64, 0x63, 0x5b, 0x4c, 0x45, 0x4c, + 0x0a, 0x4e, 0x50, 0x40, 0x48, 0x40, 0x46, 0x07, 0x46, 0x45, 0x45, 0x60, 0x07, 0x1e, 0x15, 0x4e, + 0x11, 0x07, 0x40, 0x1e, 0x15, 0x4e, 0x11, 0x07, 0x40, 0x1e, 0x15, 0x4e, 0x11, 0x07, 0x40, 0x41, + 0x07, 0x45, 0x45, 0x44, 0x0a, 0x44, 0x0a, 0x16, 0x17, 0x15, 0x4e, 0x17, 0x15, 0x4e, 0x40, 0x40, + 0x40, 0x2c, 0x2c, 0x16, 0x40, 0x0f, 0x16, 0x1d, 0x1d, 0x21, 0x27, 0x11, 0x07, 0x0a, 0x11, 0x09, + 0x06, 0x3c, 0x1e, 0x16, 0x40, 0x16, 0x09, 0x1d, 0x44, 0x16, 0x43, 0x02, 0x44, 0x16, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x04, 0x43, 0x46, 0x5c, 0x40, 0x23, 0x04, 0x03, 0x27, 0x40, 0x46, 0x40, 0x40, 0x40, 0x0f, + 0x46, 0x60, 0x5b, 0x03, 0x61, 0x60, 0x5e, 0x5b, 0x5b, 0x07, 0x07, 0x0e, 0x4c, 0x01, 0x59, 0x07, + 0x63, 0x27, 0x43, 0x16, 0x40, 0x4e, 0x1b, 0x40, 0x40, 0x40, 0x46, 0x46, 0x54, 0x5b, 0x59, 0x5b, + 0x61, 0x60, 0x54, 0x63, 0x5b, 0x58, 0x5b, 0x63, 0x63, 0x61, 0x59, 0x4b, 0x44, 0x4b, 0x54, 0x5b, + 0x59, 0x5b, 0x61, 0x60, 0x54, 0x63, 0x5b, 0x58, 0x5b, 0x63, 0x63, 0x61, 0x59, 0x4b, 0x44, 0x4b, + 0x0b, 0x4e, 0x4e, 0x40, 0x48, 0x40, 0x46, 0x07, 0x46, 0x44, 0x44, 0x5e, 0x07, 0x1e, 0x14, 0x4e, + 0x11, 0x07, 0x40, 0x1e, 0x14, 0x4e, 0x11, 0x07, 0x40, 0x1e, 0x14, 0x4e, 0x11, 0x07, 0x40, 0x41, + 0x07, 0x44, 0x44, 0x43, 0x0b, 0x43, 0x0b, 0x16, 0x17, 0x14, 0x4e, 0x17, 0x14, 0x4e, 0x40, 0x40, + 0x40, 0x2b, 0x2b, 0x16, 0x40, 0x0f, 0x16, 0x1c, 0x1c, 0x21, 0x27, 0x11, 0x07, 0x0b, 0x11, 0x09, + 0x06, 0x3b, 0x1e, 0x16, 0x40, 0x16, 0x09, 0x1c, 0x43, 0x16, 0x41, 0x03, 0x43, 0x16, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x04, 0x42, 0x46, 0x5c, 0x40, 0x22, 0x04, 0x02, 0x27, 0x40, 0x46, 0x40, 0x40, 0x40, 0x0f, + 0x46, 0x5e, 0x5a, 0x03, 0x60, 0x5e, 0x5c, 0x59, 0x59, 0x07, 0x07, 0x0e, 0x4c, 0x01, 0x58, 0x07, + 0x62, 0x27, 0x42, 0x16, 0x40, 0x4e, 0x1a, 0x40, 0x40, 0x40, 0x46, 0x46, 0x54, 0x5a, 0x58, 0x5a, + 0x60, 0x5e, 0x54, 0x62, 0x5a, 0x56, 0x5a, 0x62, 0x62, 0x60, 0x58, 0x4a, 0x44, 0x4a, 0x54, 0x5a, + 0x58, 0x5a, 0x60, 0x5e, 0x54, 0x62, 0x5a, 0x56, 0x5a, 0x62, 0x62, 0x60, 0x58, 0x4a, 0x44, 0x4a, + 0x0b, 0x4e, 0x4c, 0x40, 0x48, 0x40, 0x46, 0x07, 0x46, 0x44, 0x44, 0x5c, 0x07, 0x1e, 0x14, 0x4e, + 0x11, 0x07, 0x40, 0x1e, 0x14, 0x4e, 0x11, 0x07, 0x40, 0x1e, 0x14, 0x4e, 0x11, 0x07, 0x40, 0x41, + 0x07, 0x44, 0x44, 0x42, 0x0b, 0x42, 0x0b, 0x16, 0x17, 0x14, 0x4e, 0x17, 0x14, 0x4e, 0x40, 0x40, + 0x40, 0x2a, 0x2a, 0x16, 0x40, 0x0f, 0x16, 0x1c, 0x1c, 0x21, 0x27, 0x11, 0x07, 0x0b, 0x11, 0x09, + 0x06, 0x3a, 0x1e, 0x16, 0x40, 0x16, 0x09, 0x1c, 0x42, 0x16, 0x40, 0x03, 0x42, 0x16, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x03, 0x41, 0x45, 0x5b, 0x40, 0x21, 0x03, 0x01, 0x27, 0x40, 0x45, 0x40, 0x40, 0x40, 0x0f, + 0x45, 0x5d, 0x59, 0x04, 0x5f, 0x5d, 0x5a, 0x56, 0x56, 0x07, 0x07, 0x0d, 0x4b, 0x02, 0x57, 0x07, + 0x61, 0x27, 0x41, 0x15, 0x40, 0x4d, 0x19, 0x40, 0x40, 0x40, 0x45, 0x45, 0x53, 0x59, 0x57, 0x59, + 0x5f, 0x5d, 0x53, 0x61, 0x59, 0x55, 0x59, 0x61, 0x61, 0x5f, 0x57, 0x49, 0x43, 0x49, 0x53, 0x59, + 0x57, 0x59, 0x5f, 0x5d, 0x53, 0x61, 0x59, 0x55, 0x59, 0x61, 0x61, 0x5f, 0x57, 0x49, 0x43, 0x49, + 0x0c, 0x4d, 0x4a, 0x40, 0x48, 0x40, 0x45, 0x07, 0x45, 0x43, 0x43, 0x5a, 0x07, 0x1d, 0x13, 0x4d, + 0x12, 0x07, 0x40, 0x1d, 0x13, 0x4d, 0x12, 0x07, 0x40, 0x1d, 0x13, 0x4d, 0x12, 0x07, 0x40, 0x42, + 0x07, 0x43, 0x43, 0x41, 0x0c, 0x41, 0x0c, 0x15, 0x17, 0x13, 0x4d, 0x17, 0x13, 0x4d, 0x40, 0x40, + 0x40, 0x29, 0x29, 0x15, 0x40, 0x0f, 0x15, 0x1b, 0x1b, 0x22, 0x27, 0x12, 0x07, 0x0c, 0x12, 0x0a, + 0x05, 0x39, 0x1d, 0x15, 0x40, 0x15, 0x0a, 0x1b, 0x41, 0x15, 0x00, 0x04, 0x41, 0x15, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x02, 0x40, 0x45, 0x5b, 0x40, 0x20, 0x02, 0x00, 0x27, 0x40, 0x45, 0x40, 0x40, 0x40, 0x0f, + 0x45, 0x5b, 0x58, 0x04, 0x5e, 0x5b, 0x59, 0x54, 0x54, 0x07, 0x07, 0x0d, 0x4b, 0x02, 0x56, 0x07, + 0x60, 0x27, 0x40, 0x15, 0x40, 0x4d, 0x18, 0x40, 0x40, 0x40, 0x45, 0x45, 0x53, 0x58, 0x56, 0x58, + 0x5e, 0x5b, 0x53, 0x60, 0x58, 0x53, 0x58, 0x60, 0x60, 0x5e, 0x56, 0x48, 0x43, 0x48, 0x53, 0x58, + 0x56, 0x58, 0x5e, 0x5b, 0x53, 0x60, 0x58, 0x53, 0x58, 0x60, 0x60, 0x5e, 0x56, 0x48, 0x43, 0x48, + 0x0c, 0x4d, 0x49, 0x40, 0x48, 0x40, 0x45, 0x07, 0x45, 0x43, 0x43, 0x59, 0x07, 0x1d, 0x12, 0x4d, + 0x12, 0x07, 0x40, 0x1d, 0x12, 0x4d, 0x12, 0x07, 0x40, 0x1d, 0x12, 0x4d, 0x12, 0x07, 0x40, 0x42, + 0x07, 0x43, 0x43, 0x40, 0x0c, 0x40, 0x0c, 0x15, 0x17, 0x12, 0x4d, 0x17, 0x12, 0x4d, 0x40, 0x40, + 0x40, 0x28, 0x28, 0x15, 0x40, 0x0f, 0x15, 0x1a, 0x1a, 0x22, 0x27, 0x12, 0x07, 0x0c, 0x12, 0x0a, + 0x05, 0x38, 0x1d, 0x15, 0x40, 0x15, 0x0a, 0x1a, 0x40, 0x15, 0x01, 0x04, 0x40, 0x15, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x02, 0x00, 0x45, 0x5a, 0x40, 0x1f, 0x02, 0x40, 0x27, 0x40, 0x45, 0x40, 0x40, 0x40, 0x0f, + 0x45, 0x59, 0x57, 0x05, 0x5c, 0x59, 0x57, 0x51, 0x51, 0x07, 0x07, 0x0d, 0x4a, 0x02, 0x54, 0x07, + 0x5f, 0x27, 0x00, 0x15, 0x40, 0x4d, 0x17, 0x40, 0x40, 0x40, 0x45, 0x45, 0x52, 0x57, 0x54, 0x57, + 0x5c, 0x59, 0x52, 0x5f, 0x57, 0x51, 0x57, 0x5f, 0x5f, 0x5c, 0x54, 0x47, 0x42, 0x47, 0x52, 0x57, + 0x54, 0x57, 0x5c, 0x59, 0x52, 0x5f, 0x57, 0x51, 0x57, 0x5f, 0x5f, 0x5c, 0x54, 0x47, 0x42, 0x47, + 0x0d, 0x4d, 0x47, 0x40, 0x48, 0x40, 0x45, 0x07, 0x45, 0x42, 0x42, 0x57, 0x07, 0x1d, 0x12, 0x4d, + 0x12, 0x07, 0x40, 0x1d, 0x12, 0x4d, 0x12, 0x07, 0x40, 0x1d, 0x12, 0x4d, 0x12, 0x07, 0x40, 0x42, + 0x07, 0x42, 0x42, 0x00, 0x0d, 0x00, 0x0d, 0x15, 0x17, 0x12, 0x4d, 0x17, 0x12, 0x4d, 0x40, 0x40, + 0x40, 0x27, 0x27, 0x15, 0x40, 0x0f, 0x15, 0x1a, 0x1a, 0x22, 0x27, 0x12, 0x07, 0x0d, 0x12, 0x0a, + 0x05, 0x37, 0x1d, 0x15, 0x40, 0x15, 0x0a, 0x1a, 0x00, 0x15, 0x03, 0x05, 0x00, 0x15, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x01, 0x01, 0x44, 0x59, 0x40, 0x1e, 0x01, 0x41, 0x27, 0x40, 0x44, 0x40, 0x40, 0x40, 0x0f, + 0x44, 0x58, 0x56, 0x06, 0x5b, 0x58, 0x55, 0x4f, 0x4f, 0x07, 0x07, 0x0c, 0x49, 0x03, 0x53, 0x07, + 0x5e, 0x27, 0x01, 0x14, 0x40, 0x4c, 0x16, 0x40, 0x40, 0x40, 0x44, 0x44, 0x51, 0x56, 0x53, 0x56, + 0x5b, 0x58, 0x51, 0x5e, 0x56, 0x50, 0x56, 0x5e, 0x5e, 0x5b, 0x53, 0x46, 0x41, 0x46, 0x51, 0x56, + 0x53, 0x56, 0x5b, 0x58, 0x51, 0x5e, 0x56, 0x50, 0x56, 0x5e, 0x5e, 0x5b, 0x53, 0x46, 0x41, 0x46, + 0x0e, 0x4c, 0x45, 0x40, 0x48, 0x40, 0x44, 0x07, 0x44, 0x41, 0x41, 0x55, 0x07, 0x1c, 0x11, 0x4c, + 0x13, 0x07, 0x40, 0x1c, 0x11, 0x4c, 0x13, 0x07, 0x40, 0x1c, 0x11, 0x4c, 0x13, 0x07, 0x40, 0x43, + 0x07, 0x41, 0x41, 0x01, 0x0e, 0x01, 0x0e, 0x14, 0x17, 0x11, 0x4c, 0x17, 0x11, 0x4c, 0x40, 0x40, + 0x40, 0x26, 0x26, 0x14, 0x40, 0x0f, 0x14, 0x19, 0x19, 0x23, 0x27, 0x13, 0x07, 0x0e, 0x13, 0x0b, + 0x04, 0x36, 0x1c, 0x14, 0x40, 0x14, 0x0b, 0x19, 0x01, 0x14, 0x04, 0x06, 0x01, 0x14, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x01, 0x02, 0x44, 0x59, 0x40, 0x1d, 0x01, 0x42, 0x27, 0x40, 0x44, 0x40, 0x40, 0x40, 0x0f, + 0x44, 0x56, 0x55, 0x06, 0x5a, 0x56, 0x53, 0x4c, 0x4c, 0x07, 0x07, 0x0c, 0x49, 0x03, 0x52, 0x07, + 0x5d, 0x27, 0x02, 0x14, 0x40, 0x4c, 0x15, 0x40, 0x40, 0x40, 0x44, 0x44, 0x51, 0x55, 0x52, 0x55, + 0x5a, 0x56, 0x51, 0x5d, 0x55, 0x4e, 0x55, 0x5d, 0x5d, 0x5a, 0x52, 0x45, 0x41, 0x45, 0x51, 0x55, + 0x52, 0x55, 0x5a, 0x56, 0x51, 0x5d, 0x55, 0x4e, 0x55, 0x5d, 0x5d, 0x5a, 0x52, 0x45, 0x41, 0x45, + 0x0e, 0x4c, 0x43, 0x40, 0x48, 0x40, 0x44, 0x07, 0x44, 0x41, 0x41, 0x53, 0x07, 0x1c, 0x11, 0x4c, + 0x13, 0x07, 0x40, 0x1c, 0x11, 0x4c, 0x13, 0x07, 0x40, 0x1c, 0x11, 0x4c, 0x13, 0x07, 0x40, 0x43, + 0x07, 0x41, 0x41, 0x02, 0x0e, 0x02, 0x0e, 0x14, 0x17, 0x11, 0x4c, 0x17, 0x11, 0x4c, 0x40, 0x40, + 0x40, 0x25, 0x25, 0x14, 0x40, 0x0f, 0x14, 0x19, 0x19, 0x23, 0x27, 0x13, 0x07, 0x0e, 0x13, 0x0b, + 0x04, 0x35, 0x1c, 0x14, 0x40, 0x14, 0x0b, 0x19, 0x02, 0x14, 0x05, 0x06, 0x02, 0x14, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x03, 0x44, 0x58, 0x40, 0x1c, 0x00, 0x43, 0x27, 0x40, 0x44, 0x40, 0x40, 0x40, 0x0f, + 0x44, 0x55, 0x54, 0x07, 0x59, 0x55, 0x51, 0x4a, 0x4a, 0x07, 0x07, 0x0c, 0x48, 0x03, 0x51, 0x07, + 0x5c, 0x27, 0x03, 0x14, 0x40, 0x4c, 0x14, 0x40, 0x40, 0x40, 0x44, 0x44, 0x50, 0x54, 0x51, 0x54, + 0x59, 0x55, 0x50, 0x5c, 0x54, 0x4d, 0x54, 0x5c, 0x5c, 0x59, 0x51, 0x44, 0x40, 0x44, 0x50, 0x54, + 0x51, 0x54, 0x59, 0x55, 0x50, 0x5c, 0x54, 0x4d, 0x54, 0x5c, 0x5c, 0x59, 0x51, 0x44, 0x40, 0x44, + 0x0f, 0x4c, 0x41, 0x40, 0x48, 0x40, 0x44, 0x07, 0x44, 0x40, 0x40, 0x51, 0x07, 0x1c, 0x10, 0x4c, + 0x13, 0x07, 0x40, 0x1c, 0x10, 0x4c, 0x13, 0x07, 0x40, 0x1c, 0x10, 0x4c, 0x13, 0x07, 0x40, 0x43, + 0x07, 0x40, 0x40, 0x03, 0x0f, 0x03, 0x0f, 0x14, 0x17, 0x10, 0x4c, 0x17, 0x10, 0x4c, 0x40, 0x40, + 0x40, 0x24, 0x24, 0x14, 0x40, 0x0f, 0x14, 0x18, 0x18, 0x23, 0x27, 0x13, 0x07, 0x0f, 0x13, 0x0b, + 0x04, 0x34, 0x1c, 0x14, 0x40, 0x14, 0x0b, 0x18, 0x03, 0x14, 0x06, 0x07, 0x03, 0x14, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x40, 0x04, 0x43, 0x57, 0x40, 0x1b, 0x40, 0x44, 0x27, 0x40, 0x43, 0x40, 0x40, 0x40, 0x0f, + 0x43, 0x53, 0x53, 0x08, 0x57, 0x53, 0x4f, 0x47, 0x47, 0x07, 0x07, 0x0b, 0x47, 0x04, 0x4f, 0x07, + 0x5b, 0x27, 0x04, 0x13, 0x40, 0x4b, 0x13, 0x40, 0x40, 0x40, 0x43, 0x43, 0x4f, 0x53, 0x4f, 0x53, + 0x57, 0x53, 0x4f, 0x5b, 0x53, 0x4b, 0x53, 0x5b, 0x5b, 0x57, 0x4f, 0x43, 0x00, 0x43, 0x4f, 0x53, + 0x4f, 0x53, 0x57, 0x53, 0x4f, 0x5b, 0x53, 0x4b, 0x53, 0x5b, 0x5b, 0x57, 0x4f, 0x43, 0x00, 0x43, + 0x10, 0x4b, 0x00, 0x40, 0x48, 0x40, 0x43, 0x07, 0x43, 0x00, 0x00, 0x4f, 0x07, 0x1b, 0x0f, 0x4b, + 0x14, 0x07, 0x40, 0x1b, 0x0f, 0x4b, 0x14, 0x07, 0x40, 0x1b, 0x0f, 0x4b, 0x14, 0x07, 0x40, 0x44, + 0x07, 0x00, 0x00, 0x04, 0x10, 0x04, 0x10, 0x13, 0x17, 0x0f, 0x4b, 0x17, 0x0f, 0x4b, 0x40, 0x40, + 0x40, 0x23, 0x23, 0x13, 0x40, 0x0f, 0x13, 0x17, 0x17, 0x24, 0x27, 0x14, 0x07, 0x10, 0x14, 0x0c, + 0x03, 0x33, 0x1b, 0x13, 0x40, 0x13, 0x0c, 0x17, 0x04, 0x13, 0x08, 0x08, 0x04, 0x13, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x40, 0x05, 0x43, 0x57, 0x40, 0x1a, 0x40, 0x45, 0x27, 0x40, 0x43, 0x40, 0x40, 0x40, 0x0f, + 0x43, 0x52, 0x52, 0x08, 0x56, 0x52, 0x4d, 0x45, 0x45, 0x07, 0x07, 0x0b, 0x47, 0x04, 0x4e, 0x07, + 0x5a, 0x27, 0x05, 0x13, 0x40, 0x4b, 0x12, 0x40, 0x40, 0x40, 0x43, 0x43, 0x4f, 0x52, 0x4e, 0x52, + 0x56, 0x52, 0x4f, 0x5a, 0x52, 0x4a, 0x52, 0x5a, 0x5a, 0x56, 0x4e, 0x42, 0x00, 0x42, 0x4f, 0x52, + 0x4e, 0x52, 0x56, 0x52, 0x4f, 0x5a, 0x52, 0x4a, 0x52, 0x5a, 0x5a, 0x56, 0x4e, 0x42, 0x00, 0x42, + 0x10, 0x4b, 0x02, 0x40, 0x48, 0x40, 0x43, 0x07, 0x43, 0x00, 0x00, 0x4d, 0x07, 0x1b, 0x0f, 0x4b, + 0x14, 0x07, 0x40, 0x1b, 0x0f, 0x4b, 0x14, 0x07, 0x40, 0x1b, 0x0f, 0x4b, 0x14, 0x07, 0x40, 0x44, + 0x07, 0x00, 0x00, 0x05, 0x10, 0x05, 0x10, 0x13, 0x17, 0x0f, 0x4b, 0x17, 0x0f, 0x4b, 0x40, 0x40, + 0x40, 0x22, 0x22, 0x13, 0x40, 0x0f, 0x13, 0x17, 0x17, 0x24, 0x27, 0x14, 0x07, 0x10, 0x14, 0x0c, + 0x03, 0x32, 0x1b, 0x13, 0x40, 0x13, 0x0c, 0x17, 0x05, 0x13, 0x09, 0x08, 0x05, 0x13, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x41, 0x06, 0x43, 0x56, 0x40, 0x19, 0x41, 0x46, 0x27, 0x40, 0x43, 0x40, 0x40, 0x40, 0x0f, + 0x43, 0x50, 0x51, 0x09, 0x55, 0x50, 0x4b, 0x42, 0x42, 0x07, 0x07, 0x0b, 0x46, 0x04, 0x4d, 0x07, + 0x59, 0x27, 0x06, 0x13, 0x40, 0x4b, 0x11, 0x40, 0x40, 0x40, 0x43, 0x43, 0x4e, 0x51, 0x4d, 0x51, + 0x55, 0x50, 0x4e, 0x59, 0x51, 0x48, 0x51, 0x59, 0x59, 0x55, 0x4d, 0x41, 0x01, 0x41, 0x4e, 0x51, + 0x4d, 0x51, 0x55, 0x50, 0x4e, 0x59, 0x51, 0x48, 0x51, 0x59, 0x59, 0x55, 0x4d, 0x41, 0x01, 0x41, + 0x11, 0x4b, 0x04, 0x40, 0x48, 0x40, 0x43, 0x07, 0x43, 0x01, 0x01, 0x4b, 0x07, 0x1b, 0x0e, 0x4b, + 0x14, 0x07, 0x40, 0x1b, 0x0e, 0x4b, 0x14, 0x07, 0x40, 0x1b, 0x0e, 0x4b, 0x14, 0x07, 0x40, 0x44, + 0x07, 0x01, 0x01, 0x06, 0x11, 0x06, 0x11, 0x13, 0x17, 0x0e, 0x4b, 0x17, 0x0e, 0x4b, 0x40, 0x40, + 0x40, 0x21, 0x21, 0x13, 0x40, 0x0f, 0x13, 0x16, 0x16, 0x24, 0x27, 0x14, 0x07, 0x11, 0x14, 0x0c, + 0x03, 0x31, 0x1b, 0x13, 0x40, 0x13, 0x0c, 0x16, 0x06, 0x13, 0x0a, 0x09, 0x06, 0x13, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x42, 0x06, 0x43, 0x56, 0x40, 0x18, 0x42, 0x47, 0x27, 0x40, 0x43, 0x40, 0x40, 0x40, 0x0f, + 0x43, 0x4f, 0x51, 0x09, 0x54, 0x4f, 0x4a, 0x40, 0x40, 0x07, 0x07, 0x0a, 0x46, 0x04, 0x4c, 0x07, + 0x59, 0x27, 0x06, 0x12, 0x40, 0x4b, 0x10, 0x40, 0x40, 0x40, 0x43, 0x43, 0x4e, 0x51, 0x4c, 0x51, + 0x54, 0x4f, 0x4e, 0x59, 0x51, 0x47, 0x51, 0x59, 0x59, 0x54, 0x4c, 0x41, 0x01, 0x41, 0x4e, 0x51, + 0x4c, 0x51, 0x54, 0x4f, 0x4e, 0x59, 0x51, 0x47, 0x51, 0x59, 0x59, 0x54, 0x4c, 0x41, 0x01, 0x41, + 0x11, 0x4b, 0x05, 0x40, 0x48, 0x40, 0x43, 0x07, 0x43, 0x01, 0x01, 0x4a, 0x07, 0x1a, 0x0d, 0x4b, + 0x14, 0x07, 0x40, 0x1a, 0x0d, 0x4b, 0x14, 0x07, 0x40, 0x1a, 0x0d, 0x4b, 0x14, 0x07, 0x40, 0x45, + 0x07, 0x01, 0x01, 0x06, 0x11, 0x06, 0x11, 0x12, 0x17, 0x0d, 0x4b, 0x17, 0x0d, 0x4b, 0x40, 0x40, + 0x40, 0x20, 0x20, 0x12, 0x40, 0x0f, 0x12, 0x15, 0x15, 0x24, 0x27, 0x14, 0x07, 0x11, 0x14, 0x0c, + 0x02, 0x30, 0x1a, 0x12, 0x40, 0x12, 0x0c, 0x15, 0x06, 0x12, 0x0b, 0x09, 0x06, 0x12, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x42, 0x07, 0x42, 0x55, 0x40, 0x18, 0x42, 0x47, 0x27, 0x40, 0x42, 0x40, 0x40, 0x40, 0x0f, + 0x42, 0x4d, 0x50, 0x0a, 0x52, 0x4d, 0x48, 0x02, 0x02, 0x07, 0x07, 0x0a, 0x45, 0x05, 0x4a, 0x07, + 0x58, 0x27, 0x07, 0x12, 0x40, 0x4a, 0x10, 0x40, 0x40, 0x40, 0x42, 0x42, 0x4d, 0x50, 0x4a, 0x50, + 0x52, 0x4d, 0x4d, 0x58, 0x50, 0x45, 0x50, 0x58, 0x58, 0x52, 0x4a, 0x40, 0x02, 0x40, 0x4d, 0x50, + 0x4a, 0x50, 0x52, 0x4d, 0x4d, 0x58, 0x50, 0x45, 0x50, 0x58, 0x58, 0x52, 0x4a, 0x40, 0x02, 0x40, + 0x12, 0x4a, 0x07, 0x40, 0x48, 0x40, 0x42, 0x07, 0x42, 0x02, 0x02, 0x48, 0x07, 0x1a, 0x0d, 0x4a, + 0x15, 0x07, 0x40, 0x1a, 0x0d, 0x4a, 0x15, 0x07, 0x40, 0x1a, 0x0d, 0x4a, 0x15, 0x07, 0x40, 0x45, + 0x07, 0x02, 0x02, 0x07, 0x12, 0x07, 0x12, 0x12, 0x17, 0x0d, 0x4a, 0x17, 0x0d, 0x4a, 0x40, 0x40, + 0x40, 0x20, 0x20, 0x12, 0x40, 0x0f, 0x12, 0x15, 0x15, 0x25, 0x27, 0x15, 0x07, 0x12, 0x15, 0x0d, + 0x02, 0x30, 0x1a, 0x12, 0x40, 0x12, 0x0d, 0x15, 0x07, 0x12, 0x0d, 0x0a, 0x07, 0x12, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x43, 0x08, 0x42, 0x54, 0x40, 0x17, 0x43, 0x48, 0x27, 0x40, 0x42, 0x40, 0x40, 0x40, 0x0f, + 0x42, 0x4b, 0x4f, 0x0b, 0x51, 0x4b, 0x46, 0x04, 0x04, 0x07, 0x07, 0x0a, 0x44, 0x05, 0x49, 0x07, + 0x57, 0x27, 0x08, 0x12, 0x40, 0x4a, 0x0f, 0x40, 0x40, 0x40, 0x42, 0x42, 0x4c, 0x4f, 0x49, 0x4f, + 0x51, 0x4b, 0x4c, 0x57, 0x4f, 0x43, 0x4f, 0x57, 0x57, 0x51, 0x49, 0x00, 0x03, 0x00, 0x4c, 0x4f, + 0x49, 0x4f, 0x51, 0x4b, 0x4c, 0x57, 0x4f, 0x43, 0x4f, 0x57, 0x57, 0x51, 0x49, 0x00, 0x03, 0x00, + 0x13, 0x4a, 0x09, 0x40, 0x48, 0x40, 0x42, 0x07, 0x42, 0x03, 0x03, 0x46, 0x07, 0x1a, 0x0c, 0x4a, + 0x15, 0x07, 0x40, 0x1a, 0x0c, 0x4a, 0x15, 0x07, 0x40, 0x1a, 0x0c, 0x4a, 0x15, 0x07, 0x40, 0x45, + 0x07, 0x03, 0x03, 0x08, 0x13, 0x08, 0x13, 0x12, 0x17, 0x0c, 0x4a, 0x17, 0x0c, 0x4a, 0x40, 0x40, + 0x40, 0x1f, 0x1f, 0x12, 0x40, 0x0f, 0x12, 0x14, 0x14, 0x25, 0x27, 0x15, 0x07, 0x13, 0x15, 0x0d, + 0x02, 0x2f, 0x1a, 0x12, 0x40, 0x12, 0x0d, 0x14, 0x08, 0x12, 0x0e, 0x0b, 0x08, 0x12, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x43, 0x09, 0x42, 0x54, 0x40, 0x16, 0x43, 0x49, 0x27, 0x40, 0x42, 0x40, 0x40, 0x40, 0x0f, + 0x42, 0x4a, 0x4e, 0x0b, 0x50, 0x4a, 0x44, 0x07, 0x07, 0x07, 0x07, 0x0a, 0x44, 0x05, 0x48, 0x07, + 0x56, 0x27, 0x09, 0x12, 0x40, 0x4a, 0x0e, 0x40, 0x40, 0x40, 0x42, 0x42, 0x4c, 0x4e, 0x48, 0x4e, + 0x50, 0x4a, 0x4c, 0x56, 0x4e, 0x42, 0x4e, 0x56, 0x56, 0x50, 0x48, 0x01, 0x03, 0x01, 0x4c, 0x4e, + 0x48, 0x4e, 0x50, 0x4a, 0x4c, 0x56, 0x4e, 0x42, 0x4e, 0x56, 0x56, 0x50, 0x48, 0x01, 0x03, 0x01, + 0x13, 0x4a, 0x0b, 0x40, 0x48, 0x40, 0x42, 0x07, 0x42, 0x03, 0x03, 0x44, 0x07, 0x1a, 0x0c, 0x4a, + 0x15, 0x07, 0x40, 0x1a, 0x0c, 0x4a, 0x15, 0x07, 0x40, 0x1a, 0x0c, 0x4a, 0x15, 0x07, 0x40, 0x45, + 0x07, 0x03, 0x03, 0x09, 0x13, 0x09, 0x13, 0x12, 0x17, 0x0c, 0x4a, 0x17, 0x0c, 0x4a, 0x40, 0x40, + 0x40, 0x1e, 0x1e, 0x12, 0x40, 0x0f, 0x12, 0x14, 0x14, 0x25, 0x27, 0x15, 0x07, 0x13, 0x15, 0x0d, + 0x02, 0x2e, 0x1a, 0x12, 0x40, 0x12, 0x0d, 0x14, 0x09, 0x12, 0x0f, 0x0b, 0x09, 0x12, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x44, 0x0a, 0x41, 0x53, 0x40, 0x15, 0x44, 0x4a, 0x27, 0x40, 0x41, 0x40, 0x40, 0x40, 0x0f, + 0x41, 0x48, 0x4d, 0x0c, 0x4f, 0x48, 0x42, 0x09, 0x09, 0x07, 0x07, 0x09, 0x43, 0x06, 0x47, 0x07, + 0x55, 0x27, 0x0a, 0x11, 0x40, 0x49, 0x0d, 0x40, 0x40, 0x40, 0x41, 0x41, 0x4b, 0x4d, 0x47, 0x4d, + 0x4f, 0x48, 0x4b, 0x55, 0x4d, 0x40, 0x4d, 0x55, 0x55, 0x4f, 0x47, 0x02, 0x04, 0x02, 0x4b, 0x4d, + 0x47, 0x4d, 0x4f, 0x48, 0x4b, 0x55, 0x4d, 0x40, 0x4d, 0x55, 0x55, 0x4f, 0x47, 0x02, 0x04, 0x02, + 0x14, 0x49, 0x0d, 0x40, 0x48, 0x40, 0x41, 0x07, 0x41, 0x04, 0x04, 0x42, 0x07, 0x19, 0x0b, 0x49, + 0x16, 0x07, 0x40, 0x19, 0x0b, 0x49, 0x16, 0x07, 0x40, 0x19, 0x0b, 0x49, 0x16, 0x07, 0x40, 0x46, + 0x07, 0x04, 0x04, 0x0a, 0x14, 0x0a, 0x14, 0x11, 0x17, 0x0b, 0x49, 0x17, 0x0b, 0x49, 0x40, 0x40, + 0x40, 0x1d, 0x1d, 0x11, 0x40, 0x0f, 0x11, 0x13, 0x13, 0x26, 0x27, 0x16, 0x07, 0x14, 0x16, 0x0e, + 0x01, 0x2d, 0x19, 0x11, 0x40, 0x11, 0x0e, 0x13, 0x0a, 0x11, 0x10, 0x0c, 0x0a, 0x11, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x45, 0x0b, 0x41, 0x52, 0x40, 0x14, 0x45, 0x4b, 0x27, 0x40, 0x41, 0x40, 0x40, 0x40, 0x0f, + 0x41, 0x47, 0x4c, 0x0d, 0x4d, 0x47, 0x40, 0x0c, 0x0c, 0x07, 0x07, 0x09, 0x42, 0x06, 0x45, 0x07, + 0x54, 0x27, 0x0b, 0x11, 0x40, 0x49, 0x0c, 0x40, 0x40, 0x40, 0x41, 0x41, 0x4a, 0x4c, 0x45, 0x4c, + 0x4d, 0x47, 0x4a, 0x54, 0x4c, 0x00, 0x4c, 0x54, 0x54, 0x4d, 0x45, 0x03, 0x05, 0x03, 0x4a, 0x4c, + 0x45, 0x4c, 0x4d, 0x47, 0x4a, 0x54, 0x4c, 0x00, 0x4c, 0x54, 0x54, 0x4d, 0x45, 0x03, 0x05, 0x03, + 0x15, 0x49, 0x0f, 0x40, 0x48, 0x40, 0x41, 0x07, 0x41, 0x05, 0x05, 0x40, 0x07, 0x19, 0x0a, 0x49, + 0x16, 0x07, 0x40, 0x19, 0x0a, 0x49, 0x16, 0x07, 0x40, 0x19, 0x0a, 0x49, 0x16, 0x07, 0x40, 0x46, + 0x07, 0x05, 0x05, 0x0b, 0x15, 0x0b, 0x15, 0x11, 0x17, 0x0a, 0x49, 0x17, 0x0a, 0x49, 0x40, 0x40, + 0x40, 0x1c, 0x1c, 0x11, 0x40, 0x0f, 0x11, 0x12, 0x12, 0x26, 0x27, 0x16, 0x07, 0x15, 0x16, 0x0e, + 0x01, 0x2c, 0x19, 0x11, 0x40, 0x11, 0x0e, 0x12, 0x0b, 0x11, 0x12, 0x0d, 0x0b, 0x11, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x45, 0x0c, 0x41, 0x52, 0x40, 0x13, 0x45, 0x4c, 0x27, 0x40, 0x41, 0x40, 0x40, 0x40, 0x0f, + 0x41, 0x45, 0x4b, 0x0d, 0x4c, 0x45, 0x01, 0x0e, 0x0e, 0x07, 0x07, 0x09, 0x42, 0x06, 0x44, 0x07, + 0x53, 0x27, 0x0c, 0x11, 0x40, 0x49, 0x0b, 0x40, 0x40, 0x40, 0x41, 0x41, 0x4a, 0x4b, 0x44, 0x4b, + 0x4c, 0x45, 0x4a, 0x53, 0x4b, 0x02, 0x4b, 0x53, 0x53, 0x4c, 0x44, 0x04, 0x05, 0x04, 0x4a, 0x4b, + 0x44, 0x4b, 0x4c, 0x45, 0x4a, 0x53, 0x4b, 0x02, 0x4b, 0x53, 0x53, 0x4c, 0x44, 0x04, 0x05, 0x04, + 0x15, 0x49, 0x11, 0x40, 0x48, 0x40, 0x41, 0x07, 0x41, 0x05, 0x05, 0x01, 0x07, 0x19, 0x0a, 0x49, + 0x16, 0x07, 0x40, 0x19, 0x0a, 0x49, 0x16, 0x07, 0x40, 0x19, 0x0a, 0x49, 0x16, 0x07, 0x40, 0x46, + 0x07, 0x05, 0x05, 0x0c, 0x15, 0x0c, 0x15, 0x11, 0x17, 0x0a, 0x49, 0x17, 0x0a, 0x49, 0x40, 0x40, + 0x40, 0x1b, 0x1b, 0x11, 0x40, 0x0f, 0x11, 0x12, 0x12, 0x26, 0x27, 0x16, 0x07, 0x15, 0x16, 0x0e, + 0x01, 0x2b, 0x19, 0x11, 0x40, 0x11, 0x0e, 0x12, 0x0c, 0x11, 0x13, 0x0d, 0x0c, 0x11, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x46, 0x0d, 0x40, 0x51, 0x40, 0x12, 0x46, 0x4d, 0x27, 0x40, 0x40, 0x40, 0x40, 0x40, 0x0f, + 0x40, 0x44, 0x4a, 0x0e, 0x4b, 0x44, 0x03, 0x11, 0x11, 0x07, 0x07, 0x08, 0x41, 0x07, 0x43, 0x07, + 0x52, 0x27, 0x0d, 0x10, 0x40, 0x48, 0x0a, 0x40, 0x40, 0x40, 0x40, 0x40, 0x49, 0x4a, 0x43, 0x4a, + 0x4b, 0x44, 0x49, 0x52, 0x4a, 0x03, 0x4a, 0x52, 0x52, 0x4b, 0x43, 0x05, 0x06, 0x05, 0x49, 0x4a, + 0x43, 0x4a, 0x4b, 0x44, 0x49, 0x52, 0x4a, 0x03, 0x4a, 0x52, 0x52, 0x4b, 0x43, 0x05, 0x06, 0x05, + 0x16, 0x48, 0x13, 0x40, 0x48, 0x40, 0x40, 0x07, 0x40, 0x06, 0x06, 0x03, 0x07, 0x18, 0x09, 0x48, + 0x17, 0x07, 0x40, 0x18, 0x09, 0x48, 0x17, 0x07, 0x40, 0x18, 0x09, 0x48, 0x17, 0x07, 0x40, 0x47, + 0x07, 0x06, 0x06, 0x0d, 0x16, 0x0d, 0x16, 0x10, 0x17, 0x09, 0x48, 0x17, 0x09, 0x48, 0x40, 0x40, + 0x40, 0x1a, 0x1a, 0x10, 0x40, 0x0f, 0x10, 0x11, 0x11, 0x27, 0x27, 0x17, 0x07, 0x16, 0x17, 0x0f, + 0x00, 0x2a, 0x18, 0x10, 0x40, 0x10, 0x0f, 0x11, 0x0d, 0x10, 0x14, 0x0e, 0x0d, 0x10, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x47, 0x0e, 0x40, 0x51, 0x40, 0x11, 0x47, 0x4e, 0x27, 0x40, 0x40, 0x40, 0x40, 0x40, 0x0f, + 0x40, 0x42, 0x49, 0x0e, 0x4a, 0x42, 0x04, 0x13, 0x13, 0x07, 0x07, 0x08, 0x41, 0x07, 0x42, 0x07, + 0x51, 0x27, 0x0e, 0x10, 0x40, 0x48, 0x09, 0x40, 0x40, 0x40, 0x40, 0x40, 0x49, 0x49, 0x42, 0x49, + 0x4a, 0x42, 0x49, 0x51, 0x49, 0x05, 0x49, 0x51, 0x51, 0x4a, 0x42, 0x06, 0x06, 0x06, 0x49, 0x49, + 0x42, 0x49, 0x4a, 0x42, 0x49, 0x51, 0x49, 0x05, 0x49, 0x51, 0x51, 0x4a, 0x42, 0x06, 0x06, 0x06, + 0x16, 0x48, 0x14, 0x40, 0x48, 0x40, 0x40, 0x07, 0x40, 0x06, 0x06, 0x04, 0x07, 0x18, 0x08, 0x48, + 0x17, 0x07, 0x40, 0x18, 0x08, 0x48, 0x17, 0x07, 0x40, 0x18, 0x08, 0x48, 0x17, 0x07, 0x40, 0x47, + 0x07, 0x06, 0x06, 0x0e, 0x16, 0x0e, 0x16, 0x10, 0x17, 0x08, 0x48, 0x17, 0x08, 0x48, 0x40, 0x40, + 0x40, 0x19, 0x19, 0x10, 0x40, 0x0f, 0x10, 0x10, 0x10, 0x27, 0x27, 0x17, 0x07, 0x16, 0x17, 0x0f, + 0x00, 0x29, 0x18, 0x10, 0x40, 0x10, 0x0f, 0x10, 0x0e, 0x10, 0x15, 0x0e, 0x0e, 0x10, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x47, 0x0f, 0x40, 0x50, 0x40, 0x10, 0x47, 0x4f, 0x27, 0x40, 0x40, 0x40, 0x40, 0x40, 0x0f, + 0x40, 0x40, 0x48, 0x0f, 0x48, 0x40, 0x06, 0x16, 0x16, 0x07, 0x07, 0x08, 0x40, 0x07, 0x40, 0x07, + 0x50, 0x27, 0x0f, 0x10, 0x40, 0x48, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x48, 0x48, 0x40, 0x48, + 0x48, 0x40, 0x48, 0x50, 0x48, 0x07, 0x48, 0x50, 0x50, 0x48, 0x40, 0x07, 0x07, 0x07, 0x48, 0x48, + 0x40, 0x48, 0x48, 0x40, 0x48, 0x50, 0x48, 0x07, 0x48, 0x50, 0x50, 0x48, 0x40, 0x07, 0x07, 0x07, + 0x17, 0x48, 0x16, 0x40, 0x48, 0x40, 0x40, 0x07, 0x40, 0x07, 0x07, 0x06, 0x07, 0x18, 0x08, 0x48, + 0x17, 0x07, 0x40, 0x18, 0x08, 0x48, 0x17, 0x07, 0x40, 0x18, 0x08, 0x48, 0x17, 0x07, 0x40, 0x47, + 0x07, 0x07, 0x07, 0x0f, 0x17, 0x0f, 0x17, 0x10, 0x17, 0x08, 0x48, 0x17, 0x08, 0x48, 0x40, 0x40, + 0x40, 0x18, 0x18, 0x10, 0x40, 0x0f, 0x10, 0x10, 0x10, 0x27, 0x27, 0x17, 0x07, 0x17, 0x17, 0x0f, + 0x00, 0x28, 0x18, 0x10, 0x40, 0x10, 0x0f, 0x10, 0x0f, 0x10, 0x17, 0x0f, 0x0f, 0x10, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x48, 0x10, 0x00, 0x4f, 0x40, 0x0f, 0x48, 0x50, 0x27, 0x40, 0x00, 0x40, 0x40, 0x40, 0x0f, + 0x00, 0x00, 0x47, 0x10, 0x47, 0x00, 0x08, 0x18, 0x18, 0x07, 0x07, 0x07, 0x00, 0x08, 0x00, 0x07, + 0x4f, 0x27, 0x10, 0x0f, 0x40, 0x47, 0x07, 0x40, 0x40, 0x40, 0x00, 0x00, 0x47, 0x47, 0x00, 0x47, + 0x47, 0x00, 0x47, 0x4f, 0x47, 0x08, 0x47, 0x4f, 0x4f, 0x47, 0x00, 0x08, 0x08, 0x08, 0x47, 0x47, + 0x00, 0x47, 0x47, 0x00, 0x47, 0x4f, 0x47, 0x08, 0x47, 0x4f, 0x4f, 0x47, 0x00, 0x08, 0x08, 0x08, + 0x18, 0x47, 0x18, 0x40, 0x48, 0x40, 0x00, 0x07, 0x00, 0x08, 0x08, 0x08, 0x07, 0x17, 0x07, 0x47, + 0x18, 0x07, 0x40, 0x17, 0x07, 0x47, 0x18, 0x07, 0x40, 0x17, 0x07, 0x47, 0x18, 0x07, 0x40, 0x48, + 0x07, 0x08, 0x08, 0x10, 0x18, 0x10, 0x18, 0x0f, 0x17, 0x07, 0x47, 0x17, 0x07, 0x47, 0x40, 0x40, + 0x40, 0x17, 0x17, 0x0f, 0x40, 0x0f, 0x0f, 0x0f, 0x0f, 0x28, 0x27, 0x18, 0x07, 0x18, 0x18, 0x10, + 0x40, 0x27, 0x17, 0x0f, 0x40, 0x0f, 0x10, 0x0f, 0x10, 0x0f, 0x18, 0x10, 0x10, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x48, 0x11, 0x00, 0x4f, 0x40, 0x0e, 0x48, 0x51, 0x27, 0x40, 0x00, 0x40, 0x40, 0x40, 0x0f, + 0x00, 0x02, 0x46, 0x10, 0x46, 0x02, 0x0a, 0x1b, 0x1b, 0x07, 0x07, 0x07, 0x00, 0x08, 0x01, 0x07, + 0x4e, 0x27, 0x11, 0x0f, 0x40, 0x47, 0x06, 0x40, 0x40, 0x40, 0x00, 0x00, 0x47, 0x46, 0x01, 0x46, + 0x46, 0x02, 0x47, 0x4e, 0x46, 0x0a, 0x46, 0x4e, 0x4e, 0x46, 0x01, 0x09, 0x08, 0x09, 0x47, 0x46, + 0x01, 0x46, 0x46, 0x02, 0x47, 0x4e, 0x46, 0x0a, 0x46, 0x4e, 0x4e, 0x46, 0x01, 0x09, 0x08, 0x09, + 0x18, 0x47, 0x1a, 0x40, 0x48, 0x40, 0x00, 0x07, 0x00, 0x08, 0x08, 0x0a, 0x07, 0x17, 0x07, 0x47, + 0x18, 0x07, 0x40, 0x17, 0x07, 0x47, 0x18, 0x07, 0x40, 0x17, 0x07, 0x47, 0x18, 0x07, 0x40, 0x48, + 0x07, 0x08, 0x08, 0x11, 0x18, 0x11, 0x18, 0x0f, 0x17, 0x07, 0x47, 0x17, 0x07, 0x47, 0x40, 0x40, + 0x40, 0x16, 0x16, 0x0f, 0x40, 0x0f, 0x0f, 0x0f, 0x0f, 0x28, 0x27, 0x18, 0x07, 0x18, 0x18, 0x10, + 0x40, 0x26, 0x17, 0x0f, 0x40, 0x0f, 0x10, 0x0f, 0x11, 0x0f, 0x19, 0x10, 0x11, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x49, 0x12, 0x00, 0x4e, 0x40, 0x0d, 0x49, 0x52, 0x27, 0x40, 0x00, 0x40, 0x40, 0x40, 0x0f, + 0x00, 0x03, 0x45, 0x11, 0x45, 0x03, 0x0c, 0x1d, 0x1d, 0x07, 0x07, 0x07, 0x01, 0x08, 0x02, 0x07, + 0x4d, 0x27, 0x12, 0x0f, 0x40, 0x47, 0x05, 0x40, 0x40, 0x40, 0x00, 0x00, 0x46, 0x45, 0x02, 0x45, + 0x45, 0x03, 0x46, 0x4d, 0x45, 0x0b, 0x45, 0x4d, 0x4d, 0x45, 0x02, 0x0a, 0x09, 0x0a, 0x46, 0x45, + 0x02, 0x45, 0x45, 0x03, 0x46, 0x4d, 0x45, 0x0b, 0x45, 0x4d, 0x4d, 0x45, 0x02, 0x0a, 0x09, 0x0a, + 0x19, 0x47, 0x1c, 0x40, 0x48, 0x40, 0x00, 0x07, 0x00, 0x09, 0x09, 0x0c, 0x07, 0x17, 0x06, 0x47, + 0x18, 0x07, 0x40, 0x17, 0x06, 0x47, 0x18, 0x07, 0x40, 0x17, 0x06, 0x47, 0x18, 0x07, 0x40, 0x48, + 0x07, 0x09, 0x09, 0x12, 0x19, 0x12, 0x19, 0x0f, 0x17, 0x06, 0x47, 0x17, 0x06, 0x47, 0x40, 0x40, + 0x40, 0x15, 0x15, 0x0f, 0x40, 0x0f, 0x0f, 0x0e, 0x0e, 0x28, 0x27, 0x18, 0x07, 0x19, 0x18, 0x10, + 0x40, 0x25, 0x17, 0x0f, 0x40, 0x0f, 0x10, 0x0e, 0x12, 0x0f, 0x1a, 0x11, 0x12, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4a, 0x13, 0x01, 0x4d, 0x40, 0x0c, 0x4a, 0x53, 0x27, 0x40, 0x01, 0x40, 0x40, 0x40, 0x0f, + 0x01, 0x05, 0x44, 0x12, 0x43, 0x05, 0x0e, 0x20, 0x20, 0x07, 0x07, 0x06, 0x02, 0x09, 0x04, 0x07, + 0x4c, 0x27, 0x13, 0x0e, 0x40, 0x46, 0x04, 0x40, 0x40, 0x40, 0x01, 0x01, 0x45, 0x44, 0x04, 0x44, + 0x43, 0x05, 0x45, 0x4c, 0x44, 0x0d, 0x44, 0x4c, 0x4c, 0x43, 0x04, 0x0b, 0x0a, 0x0b, 0x45, 0x44, + 0x04, 0x44, 0x43, 0x05, 0x45, 0x4c, 0x44, 0x0d, 0x44, 0x4c, 0x4c, 0x43, 0x04, 0x0b, 0x0a, 0x0b, + 0x1a, 0x46, 0x1e, 0x40, 0x48, 0x40, 0x01, 0x07, 0x01, 0x0a, 0x0a, 0x0e, 0x07, 0x16, 0x05, 0x46, + 0x19, 0x07, 0x40, 0x16, 0x05, 0x46, 0x19, 0x07, 0x40, 0x16, 0x05, 0x46, 0x19, 0x07, 0x40, 0x49, + 0x07, 0x0a, 0x0a, 0x13, 0x1a, 0x13, 0x1a, 0x0e, 0x17, 0x05, 0x46, 0x17, 0x05, 0x46, 0x40, 0x40, + 0x40, 0x14, 0x14, 0x0e, 0x40, 0x0f, 0x0e, 0x0d, 0x0d, 0x29, 0x27, 0x19, 0x07, 0x1a, 0x19, 0x11, + 0x41, 0x24, 0x16, 0x0e, 0x40, 0x0e, 0x11, 0x0d, 0x13, 0x0e, 0x1c, 0x12, 0x13, 0x0e, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4a, 0x14, 0x01, 0x4d, 0x40, 0x0b, 0x4a, 0x54, 0x27, 0x40, 0x01, 0x40, 0x40, 0x40, 0x0f, + 0x01, 0x06, 0x43, 0x12, 0x42, 0x06, 0x10, 0x22, 0x22, 0x07, 0x07, 0x06, 0x02, 0x09, 0x05, 0x07, + 0x4b, 0x27, 0x14, 0x0e, 0x40, 0x46, 0x03, 0x40, 0x40, 0x40, 0x01, 0x01, 0x45, 0x43, 0x05, 0x43, + 0x42, 0x06, 0x45, 0x4b, 0x43, 0x0e, 0x43, 0x4b, 0x4b, 0x42, 0x05, 0x0c, 0x0a, 0x0c, 0x45, 0x43, + 0x05, 0x43, 0x42, 0x06, 0x45, 0x4b, 0x43, 0x0e, 0x43, 0x4b, 0x4b, 0x42, 0x05, 0x0c, 0x0a, 0x0c, + 0x1a, 0x46, 0x20, 0x40, 0x48, 0x40, 0x01, 0x07, 0x01, 0x0a, 0x0a, 0x10, 0x07, 0x16, 0x05, 0x46, + 0x19, 0x07, 0x40, 0x16, 0x05, 0x46, 0x19, 0x07, 0x40, 0x16, 0x05, 0x46, 0x19, 0x07, 0x40, 0x49, + 0x07, 0x0a, 0x0a, 0x14, 0x1a, 0x14, 0x1a, 0x0e, 0x17, 0x05, 0x46, 0x17, 0x05, 0x46, 0x40, 0x40, + 0x40, 0x13, 0x13, 0x0e, 0x40, 0x0f, 0x0e, 0x0d, 0x0d, 0x29, 0x27, 0x19, 0x07, 0x1a, 0x19, 0x11, + 0x41, 0x23, 0x16, 0x0e, 0x40, 0x0e, 0x11, 0x0d, 0x14, 0x0e, 0x1d, 0x12, 0x14, 0x0e, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4b, 0x15, 0x01, 0x4c, 0x40, 0x0a, 0x4b, 0x55, 0x27, 0x40, 0x01, 0x40, 0x40, 0x40, 0x0f, + 0x01, 0x08, 0x42, 0x13, 0x41, 0x08, 0x12, 0x25, 0x25, 0x07, 0x07, 0x06, 0x03, 0x09, 0x06, 0x07, + 0x4a, 0x27, 0x15, 0x0e, 0x40, 0x46, 0x02, 0x40, 0x40, 0x40, 0x01, 0x01, 0x44, 0x42, 0x06, 0x42, + 0x41, 0x08, 0x44, 0x4a, 0x42, 0x10, 0x42, 0x4a, 0x4a, 0x41, 0x06, 0x0d, 0x0b, 0x0d, 0x44, 0x42, + 0x06, 0x42, 0x41, 0x08, 0x44, 0x4a, 0x42, 0x10, 0x42, 0x4a, 0x4a, 0x41, 0x06, 0x0d, 0x0b, 0x0d, + 0x1b, 0x46, 0x22, 0x40, 0x48, 0x40, 0x01, 0x07, 0x01, 0x0b, 0x0b, 0x12, 0x07, 0x16, 0x04, 0x46, + 0x19, 0x07, 0x40, 0x16, 0x04, 0x46, 0x19, 0x07, 0x40, 0x16, 0x04, 0x46, 0x19, 0x07, 0x40, 0x49, + 0x07, 0x0b, 0x0b, 0x15, 0x1b, 0x15, 0x1b, 0x0e, 0x17, 0x04, 0x46, 0x17, 0x04, 0x46, 0x40, 0x40, + 0x40, 0x12, 0x12, 0x0e, 0x40, 0x0f, 0x0e, 0x0c, 0x0c, 0x29, 0x27, 0x19, 0x07, 0x1b, 0x19, 0x11, + 0x41, 0x22, 0x16, 0x0e, 0x40, 0x0e, 0x11, 0x0c, 0x15, 0x0e, 0x1e, 0x13, 0x15, 0x0e, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4c, 0x15, 0x01, 0x4c, 0x40, 0x09, 0x4c, 0x56, 0x27, 0x40, 0x01, 0x40, 0x40, 0x40, 0x0f, + 0x01, 0x09, 0x42, 0x13, 0x40, 0x09, 0x13, 0x27, 0x27, 0x07, 0x07, 0x05, 0x03, 0x09, 0x07, 0x07, + 0x4a, 0x27, 0x15, 0x0d, 0x40, 0x46, 0x01, 0x40, 0x40, 0x40, 0x01, 0x01, 0x44, 0x42, 0x07, 0x42, + 0x40, 0x09, 0x44, 0x4a, 0x42, 0x11, 0x42, 0x4a, 0x4a, 0x40, 0x07, 0x0d, 0x0b, 0x0d, 0x44, 0x42, + 0x07, 0x42, 0x40, 0x09, 0x44, 0x4a, 0x42, 0x11, 0x42, 0x4a, 0x4a, 0x40, 0x07, 0x0d, 0x0b, 0x0d, + 0x1b, 0x46, 0x23, 0x40, 0x48, 0x40, 0x01, 0x07, 0x01, 0x0b, 0x0b, 0x13, 0x07, 0x15, 0x03, 0x46, + 0x19, 0x07, 0x40, 0x15, 0x03, 0x46, 0x19, 0x07, 0x40, 0x15, 0x03, 0x46, 0x19, 0x07, 0x40, 0x4a, + 0x07, 0x0b, 0x0b, 0x15, 0x1b, 0x15, 0x1b, 0x0d, 0x17, 0x03, 0x46, 0x17, 0x03, 0x46, 0x40, 0x40, + 0x40, 0x11, 0x11, 0x0d, 0x40, 0x0f, 0x0d, 0x0b, 0x0b, 0x29, 0x27, 0x19, 0x07, 0x1b, 0x19, 0x11, + 0x42, 0x21, 0x15, 0x0d, 0x40, 0x0d, 0x11, 0x0b, 0x15, 0x0d, 0x1f, 0x13, 0x15, 0x0d, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4c, 0x16, 0x02, 0x4b, 0x40, 0x09, 0x4c, 0x56, 0x27, 0x40, 0x02, 0x40, 0x40, 0x40, 0x0f, + 0x02, 0x0b, 0x41, 0x14, 0x01, 0x0b, 0x15, 0x2a, 0x2a, 0x07, 0x07, 0x05, 0x04, 0x0a, 0x09, 0x07, + 0x49, 0x27, 0x16, 0x0d, 0x40, 0x45, 0x01, 0x40, 0x40, 0x40, 0x02, 0x02, 0x43, 0x41, 0x09, 0x41, + 0x01, 0x0b, 0x43, 0x49, 0x41, 0x13, 0x41, 0x49, 0x49, 0x01, 0x09, 0x0e, 0x0c, 0x0e, 0x43, 0x41, + 0x09, 0x41, 0x01, 0x0b, 0x43, 0x49, 0x41, 0x13, 0x41, 0x49, 0x49, 0x01, 0x09, 0x0e, 0x0c, 0x0e, + 0x1c, 0x45, 0x25, 0x40, 0x48, 0x40, 0x02, 0x07, 0x02, 0x0c, 0x0c, 0x15, 0x07, 0x15, 0x03, 0x45, + 0x1a, 0x07, 0x40, 0x15, 0x03, 0x45, 0x1a, 0x07, 0x40, 0x15, 0x03, 0x45, 0x1a, 0x07, 0x40, 0x4a, + 0x07, 0x0c, 0x0c, 0x16, 0x1c, 0x16, 0x1c, 0x0d, 0x17, 0x03, 0x45, 0x17, 0x03, 0x45, 0x40, 0x40, + 0x40, 0x11, 0x11, 0x0d, 0x40, 0x0f, 0x0d, 0x0b, 0x0b, 0x2a, 0x27, 0x1a, 0x07, 0x1c, 0x1a, 0x12, + 0x42, 0x21, 0x15, 0x0d, 0x40, 0x0d, 0x12, 0x0b, 0x16, 0x0d, 0x21, 0x14, 0x16, 0x0d, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4d, 0x17, 0x02, 0x4a, 0x40, 0x08, 0x4d, 0x57, 0x27, 0x40, 0x02, 0x40, 0x40, 0x40, 0x0f, + 0x02, 0x0d, 0x40, 0x15, 0x02, 0x0d, 0x17, 0x2c, 0x2c, 0x07, 0x07, 0x05, 0x05, 0x0a, 0x0a, 0x07, + 0x48, 0x27, 0x17, 0x0d, 0x40, 0x45, 0x00, 0x40, 0x40, 0x40, 0x02, 0x02, 0x42, 0x40, 0x0a, 0x40, + 0x02, 0x0d, 0x42, 0x48, 0x40, 0x15, 0x40, 0x48, 0x48, 0x02, 0x0a, 0x0f, 0x0d, 0x0f, 0x42, 0x40, + 0x0a, 0x40, 0x02, 0x0d, 0x42, 0x48, 0x40, 0x15, 0x40, 0x48, 0x48, 0x02, 0x0a, 0x0f, 0x0d, 0x0f, + 0x1d, 0x45, 0x27, 0x40, 0x48, 0x40, 0x02, 0x07, 0x02, 0x0d, 0x0d, 0x17, 0x07, 0x15, 0x02, 0x45, + 0x1a, 0x07, 0x40, 0x15, 0x02, 0x45, 0x1a, 0x07, 0x40, 0x15, 0x02, 0x45, 0x1a, 0x07, 0x40, 0x4a, + 0x07, 0x0d, 0x0d, 0x17, 0x1d, 0x17, 0x1d, 0x0d, 0x17, 0x02, 0x45, 0x17, 0x02, 0x45, 0x40, 0x40, + 0x40, 0x10, 0x10, 0x0d, 0x40, 0x0f, 0x0d, 0x0a, 0x0a, 0x2a, 0x27, 0x1a, 0x07, 0x1d, 0x1a, 0x12, + 0x42, 0x20, 0x15, 0x0d, 0x40, 0x0d, 0x12, 0x0a, 0x17, 0x0d, 0x22, 0x15, 0x17, 0x0d, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4d, 0x18, 0x02, 0x4a, 0x40, 0x07, 0x4d, 0x58, 0x27, 0x40, 0x02, 0x40, 0x40, 0x40, 0x0f, + 0x02, 0x0e, 0x00, 0x15, 0x03, 0x0e, 0x19, 0x2f, 0x2f, 0x07, 0x07, 0x05, 0x05, 0x0a, 0x0b, 0x07, + 0x47, 0x27, 0x18, 0x0d, 0x40, 0x45, 0x40, 0x40, 0x40, 0x40, 0x02, 0x02, 0x42, 0x00, 0x0b, 0x00, + 0x03, 0x0e, 0x42, 0x47, 0x00, 0x16, 0x00, 0x47, 0x47, 0x03, 0x0b, 0x10, 0x0d, 0x10, 0x42, 0x00, + 0x0b, 0x00, 0x03, 0x0e, 0x42, 0x47, 0x00, 0x16, 0x00, 0x47, 0x47, 0x03, 0x0b, 0x10, 0x0d, 0x10, + 0x1d, 0x45, 0x29, 0x40, 0x48, 0x40, 0x02, 0x07, 0x02, 0x0d, 0x0d, 0x19, 0x07, 0x15, 0x02, 0x45, + 0x1a, 0x07, 0x40, 0x15, 0x02, 0x45, 0x1a, 0x07, 0x40, 0x15, 0x02, 0x45, 0x1a, 0x07, 0x40, 0x4a, + 0x07, 0x0d, 0x0d, 0x18, 0x1d, 0x18, 0x1d, 0x0d, 0x17, 0x02, 0x45, 0x17, 0x02, 0x45, 0x40, 0x40, + 0x40, 0x0f, 0x0f, 0x0d, 0x40, 0x0f, 0x0d, 0x0a, 0x0a, 0x2a, 0x27, 0x1a, 0x07, 0x1d, 0x1a, 0x12, + 0x42, 0x1f, 0x15, 0x0d, 0x40, 0x0d, 0x12, 0x0a, 0x18, 0x0d, 0x23, 0x15, 0x18, 0x0d, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4e, 0x19, 0x03, 0x49, 0x40, 0x06, 0x4e, 0x59, 0x27, 0x40, 0x03, 0x40, 0x40, 0x40, 0x0f, + 0x03, 0x10, 0x01, 0x16, 0x04, 0x10, 0x1b, 0x31, 0x31, 0x07, 0x07, 0x04, 0x06, 0x0b, 0x0c, 0x07, + 0x46, 0x27, 0x19, 0x0c, 0x40, 0x44, 0x41, 0x40, 0x40, 0x40, 0x03, 0x03, 0x41, 0x01, 0x0c, 0x01, + 0x04, 0x10, 0x41, 0x46, 0x01, 0x18, 0x01, 0x46, 0x46, 0x04, 0x0c, 0x11, 0x0e, 0x11, 0x41, 0x01, + 0x0c, 0x01, 0x04, 0x10, 0x41, 0x46, 0x01, 0x18, 0x01, 0x46, 0x46, 0x04, 0x0c, 0x11, 0x0e, 0x11, + 0x1e, 0x44, 0x2b, 0x40, 0x48, 0x40, 0x03, 0x07, 0x03, 0x0e, 0x0e, 0x1b, 0x07, 0x14, 0x01, 0x44, + 0x1b, 0x07, 0x40, 0x14, 0x01, 0x44, 0x1b, 0x07, 0x40, 0x14, 0x01, 0x44, 0x1b, 0x07, 0x40, 0x4b, + 0x07, 0x0e, 0x0e, 0x19, 0x1e, 0x19, 0x1e, 0x0c, 0x17, 0x01, 0x44, 0x17, 0x01, 0x44, 0x40, 0x40, + 0x40, 0x0e, 0x0e, 0x0c, 0x40, 0x0f, 0x0c, 0x09, 0x09, 0x2b, 0x27, 0x1b, 0x07, 0x1e, 0x1b, 0x13, + 0x43, 0x1e, 0x14, 0x0c, 0x40, 0x0c, 0x13, 0x09, 0x19, 0x0c, 0x24, 0x16, 0x19, 0x0c, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4f, 0x1a, 0x03, 0x48, 0x40, 0x05, 0x4f, 0x5a, 0x27, 0x40, 0x03, 0x40, 0x40, 0x40, 0x0f, + 0x03, 0x11, 0x02, 0x17, 0x06, 0x11, 0x1d, 0x34, 0x34, 0x07, 0x07, 0x04, 0x07, 0x0b, 0x0e, 0x07, + 0x45, 0x27, 0x1a, 0x0c, 0x40, 0x44, 0x42, 0x40, 0x40, 0x40, 0x03, 0x03, 0x40, 0x02, 0x0e, 0x02, + 0x06, 0x11, 0x40, 0x45, 0x02, 0x19, 0x02, 0x45, 0x45, 0x06, 0x0e, 0x12, 0x0f, 0x12, 0x40, 0x02, + 0x0e, 0x02, 0x06, 0x11, 0x40, 0x45, 0x02, 0x19, 0x02, 0x45, 0x45, 0x06, 0x0e, 0x12, 0x0f, 0x12, + 0x1f, 0x44, 0x2d, 0x40, 0x48, 0x40, 0x03, 0x07, 0x03, 0x0f, 0x0f, 0x1d, 0x07, 0x14, 0x00, 0x44, + 0x1b, 0x07, 0x40, 0x14, 0x00, 0x44, 0x1b, 0x07, 0x40, 0x14, 0x00, 0x44, 0x1b, 0x07, 0x40, 0x4b, + 0x07, 0x0f, 0x0f, 0x1a, 0x1f, 0x1a, 0x1f, 0x0c, 0x17, 0x00, 0x44, 0x17, 0x00, 0x44, 0x40, 0x40, + 0x40, 0x0d, 0x0d, 0x0c, 0x40, 0x0f, 0x0c, 0x08, 0x08, 0x2b, 0x27, 0x1b, 0x07, 0x1f, 0x1b, 0x13, + 0x43, 0x1d, 0x14, 0x0c, 0x40, 0x0c, 0x13, 0x08, 0x1a, 0x0c, 0x26, 0x17, 0x1a, 0x0c, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x4f, 0x1b, 0x03, 0x48, 0x40, 0x04, 0x4f, 0x5b, 0x27, 0x40, 0x03, 0x40, 0x40, 0x40, 0x0f, + 0x03, 0x13, 0x03, 0x17, 0x07, 0x13, 0x1f, 0x36, 0x36, 0x07, 0x07, 0x04, 0x07, 0x0b, 0x0f, 0x07, + 0x44, 0x27, 0x1b, 0x0c, 0x40, 0x44, 0x43, 0x40, 0x40, 0x40, 0x03, 0x03, 0x40, 0x03, 0x0f, 0x03, + 0x07, 0x13, 0x40, 0x44, 0x03, 0x1b, 0x03, 0x44, 0x44, 0x07, 0x0f, 0x13, 0x0f, 0x13, 0x40, 0x03, + 0x0f, 0x03, 0x07, 0x13, 0x40, 0x44, 0x03, 0x1b, 0x03, 0x44, 0x44, 0x07, 0x0f, 0x13, 0x0f, 0x13, + 0x1f, 0x44, 0x2f, 0x40, 0x48, 0x40, 0x03, 0x07, 0x03, 0x0f, 0x0f, 0x1f, 0x07, 0x14, 0x00, 0x44, + 0x1b, 0x07, 0x40, 0x14, 0x00, 0x44, 0x1b, 0x07, 0x40, 0x14, 0x00, 0x44, 0x1b, 0x07, 0x40, 0x4b, + 0x07, 0x0f, 0x0f, 0x1b, 0x1f, 0x1b, 0x1f, 0x0c, 0x17, 0x00, 0x44, 0x17, 0x00, 0x44, 0x40, 0x40, + 0x40, 0x0c, 0x0c, 0x0c, 0x40, 0x0f, 0x0c, 0x08, 0x08, 0x2b, 0x27, 0x1b, 0x07, 0x1f, 0x1b, 0x13, + 0x43, 0x1c, 0x14, 0x0c, 0x40, 0x0c, 0x13, 0x08, 0x1b, 0x0c, 0x27, 0x17, 0x1b, 0x0c, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x50, 0x1c, 0x04, 0x47, 0x40, 0x03, 0x50, 0x5c, 0x27, 0x40, 0x04, 0x40, 0x40, 0x40, 0x0f, + 0x04, 0x14, 0x04, 0x18, 0x08, 0x14, 0x21, 0x39, 0x39, 0x07, 0x07, 0x03, 0x08, 0x0c, 0x10, 0x07, + 0x43, 0x27, 0x1c, 0x0b, 0x40, 0x43, 0x44, 0x40, 0x40, 0x40, 0x04, 0x04, 0x00, 0x04, 0x10, 0x04, + 0x08, 0x14, 0x00, 0x43, 0x04, 0x1c, 0x04, 0x43, 0x43, 0x08, 0x10, 0x14, 0x10, 0x14, 0x00, 0x04, + 0x10, 0x04, 0x08, 0x14, 0x00, 0x43, 0x04, 0x1c, 0x04, 0x43, 0x43, 0x08, 0x10, 0x14, 0x10, 0x14, + 0x20, 0x43, 0x31, 0x40, 0x48, 0x40, 0x04, 0x07, 0x04, 0x10, 0x10, 0x21, 0x07, 0x13, 0x40, 0x43, + 0x1c, 0x07, 0x40, 0x13, 0x40, 0x43, 0x1c, 0x07, 0x40, 0x13, 0x40, 0x43, 0x1c, 0x07, 0x40, 0x4c, + 0x07, 0x10, 0x10, 0x1c, 0x20, 0x1c, 0x20, 0x0b, 0x17, 0x40, 0x43, 0x17, 0x40, 0x43, 0x40, 0x40, + 0x40, 0x0b, 0x0b, 0x0b, 0x40, 0x0f, 0x0b, 0x07, 0x07, 0x2c, 0x27, 0x1c, 0x07, 0x20, 0x1c, 0x14, + 0x44, 0x1b, 0x13, 0x0b, 0x40, 0x0b, 0x14, 0x07, 0x1c, 0x0b, 0x28, 0x18, 0x1c, 0x0b, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x51, 0x1d, 0x04, 0x47, 0x40, 0x02, 0x51, 0x5d, 0x27, 0x40, 0x04, 0x40, 0x40, 0x40, 0x0f, + 0x04, 0x16, 0x05, 0x18, 0x09, 0x16, 0x22, 0x3b, 0x3b, 0x07, 0x07, 0x03, 0x08, 0x0c, 0x11, 0x07, + 0x42, 0x27, 0x1d, 0x0b, 0x40, 0x43, 0x45, 0x40, 0x40, 0x40, 0x04, 0x04, 0x00, 0x05, 0x11, 0x05, + 0x09, 0x16, 0x00, 0x42, 0x05, 0x1e, 0x05, 0x42, 0x42, 0x09, 0x11, 0x15, 0x10, 0x15, 0x00, 0x05, + 0x11, 0x05, 0x09, 0x16, 0x00, 0x42, 0x05, 0x1e, 0x05, 0x42, 0x42, 0x09, 0x11, 0x15, 0x10, 0x15, + 0x20, 0x43, 0x32, 0x40, 0x48, 0x40, 0x04, 0x07, 0x04, 0x10, 0x10, 0x22, 0x07, 0x13, 0x41, 0x43, + 0x1c, 0x07, 0x40, 0x13, 0x41, 0x43, 0x1c, 0x07, 0x40, 0x13, 0x41, 0x43, 0x1c, 0x07, 0x40, 0x4c, + 0x07, 0x10, 0x10, 0x1d, 0x20, 0x1d, 0x20, 0x0b, 0x17, 0x41, 0x43, 0x17, 0x41, 0x43, 0x40, 0x40, + 0x40, 0x0a, 0x0a, 0x0b, 0x40, 0x0f, 0x0b, 0x06, 0x06, 0x2c, 0x27, 0x1c, 0x07, 0x20, 0x1c, 0x14, + 0x44, 0x1a, 0x13, 0x0b, 0x40, 0x0b, 0x14, 0x06, 0x1d, 0x0b, 0x29, 0x18, 0x1d, 0x0b, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x51, 0x1e, 0x04, 0x46, 0x40, 0x01, 0x51, 0x5e, 0x27, 0x40, 0x04, 0x40, 0x40, 0x40, 0x0f, + 0x04, 0x18, 0x06, 0x19, 0x0b, 0x18, 0x24, 0x3e, 0x3e, 0x07, 0x07, 0x03, 0x09, 0x0c, 0x13, 0x07, + 0x41, 0x27, 0x1e, 0x0b, 0x40, 0x43, 0x46, 0x40, 0x40, 0x40, 0x04, 0x04, 0x01, 0x06, 0x13, 0x06, + 0x0b, 0x18, 0x01, 0x41, 0x06, 0x20, 0x06, 0x41, 0x41, 0x0b, 0x13, 0x16, 0x11, 0x16, 0x01, 0x06, + 0x13, 0x06, 0x0b, 0x18, 0x01, 0x41, 0x06, 0x20, 0x06, 0x41, 0x41, 0x0b, 0x13, 0x16, 0x11, 0x16, + 0x21, 0x43, 0x34, 0x40, 0x48, 0x40, 0x04, 0x07, 0x04, 0x11, 0x11, 0x24, 0x07, 0x13, 0x41, 0x43, + 0x1c, 0x07, 0x40, 0x13, 0x41, 0x43, 0x1c, 0x07, 0x40, 0x13, 0x41, 0x43, 0x1c, 0x07, 0x40, 0x4c, + 0x07, 0x11, 0x11, 0x1e, 0x21, 0x1e, 0x21, 0x0b, 0x17, 0x41, 0x43, 0x17, 0x41, 0x43, 0x40, 0x40, + 0x40, 0x09, 0x09, 0x0b, 0x40, 0x0f, 0x0b, 0x06, 0x06, 0x2c, 0x27, 0x1c, 0x07, 0x21, 0x1c, 0x14, + 0x44, 0x19, 0x13, 0x0b, 0x40, 0x0b, 0x14, 0x06, 0x1e, 0x0b, 0x2b, 0x19, 0x1e, 0x0b, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x52, 0x1f, 0x05, 0x45, 0x40, 0x00, 0x52, 0x5f, 0x27, 0x40, 0x05, 0x40, 0x40, 0x40, 0x0f, + 0x05, 0x19, 0x07, 0x1a, 0x0c, 0x19, 0x26, 0x3e, 0x3e, 0x07, 0x07, 0x02, 0x0a, 0x0d, 0x14, 0x07, + 0x40, 0x27, 0x1f, 0x0a, 0x40, 0x42, 0x47, 0x40, 0x40, 0x40, 0x05, 0x05, 0x02, 0x07, 0x14, 0x07, + 0x0c, 0x19, 0x02, 0x40, 0x07, 0x21, 0x07, 0x40, 0x40, 0x0c, 0x14, 0x17, 0x12, 0x17, 0x02, 0x07, + 0x14, 0x07, 0x0c, 0x19, 0x02, 0x40, 0x07, 0x21, 0x07, 0x40, 0x40, 0x0c, 0x14, 0x17, 0x12, 0x17, + 0x22, 0x42, 0x36, 0x40, 0x48, 0x40, 0x05, 0x07, 0x05, 0x12, 0x12, 0x26, 0x07, 0x12, 0x42, 0x42, + 0x1d, 0x07, 0x40, 0x12, 0x42, 0x42, 0x1d, 0x07, 0x40, 0x12, 0x42, 0x42, 0x1d, 0x07, 0x40, 0x4d, + 0x07, 0x12, 0x12, 0x1f, 0x22, 0x1f, 0x22, 0x0a, 0x17, 0x42, 0x42, 0x17, 0x42, 0x42, 0x40, 0x40, + 0x40, 0x08, 0x08, 0x0a, 0x40, 0x0f, 0x0a, 0x05, 0x05, 0x2d, 0x27, 0x1d, 0x07, 0x22, 0x1d, 0x15, + 0x45, 0x18, 0x12, 0x0a, 0x40, 0x0a, 0x15, 0x05, 0x1f, 0x0a, 0x2c, 0x1a, 0x1f, 0x0a, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x52, 0x20, 0x05, 0x45, 0x40, 0x40, 0x52, 0x60, 0x27, 0x40, 0x05, 0x40, 0x40, 0x40, 0x0f, + 0x05, 0x1b, 0x08, 0x1a, 0x0d, 0x1b, 0x28, 0x3e, 0x3e, 0x07, 0x07, 0x02, 0x0a, 0x0d, 0x15, 0x07, + 0x00, 0x27, 0x20, 0x0a, 0x40, 0x42, 0x48, 0x40, 0x40, 0x40, 0x05, 0x05, 0x02, 0x08, 0x15, 0x08, + 0x0d, 0x1b, 0x02, 0x00, 0x08, 0x23, 0x08, 0x00, 0x00, 0x0d, 0x15, 0x18, 0x12, 0x18, 0x02, 0x08, + 0x15, 0x08, 0x0d, 0x1b, 0x02, 0x00, 0x08, 0x23, 0x08, 0x00, 0x00, 0x0d, 0x15, 0x18, 0x12, 0x18, + 0x22, 0x42, 0x38, 0x40, 0x48, 0x40, 0x05, 0x07, 0x05, 0x12, 0x12, 0x28, 0x07, 0x12, 0x42, 0x42, + 0x1d, 0x07, 0x40, 0x12, 0x42, 0x42, 0x1d, 0x07, 0x40, 0x12, 0x42, 0x42, 0x1d, 0x07, 0x40, 0x4d, + 0x07, 0x12, 0x12, 0x20, 0x22, 0x20, 0x22, 0x0a, 0x17, 0x42, 0x42, 0x17, 0x42, 0x42, 0x40, 0x40, + 0x40, 0x07, 0x07, 0x0a, 0x40, 0x0f, 0x0a, 0x05, 0x05, 0x2d, 0x27, 0x1d, 0x07, 0x22, 0x1d, 0x15, + 0x45, 0x17, 0x12, 0x0a, 0x40, 0x0a, 0x15, 0x05, 0x20, 0x0a, 0x2d, 0x1a, 0x20, 0x0a, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x53, 0x21, 0x05, 0x44, 0x40, 0x41, 0x53, 0x61, 0x27, 0x40, 0x05, 0x40, 0x40, 0x40, 0x0f, + 0x05, 0x1c, 0x09, 0x1b, 0x0e, 0x1c, 0x2a, 0x3e, 0x3e, 0x07, 0x07, 0x02, 0x0b, 0x0d, 0x16, 0x07, + 0x01, 0x27, 0x21, 0x0a, 0x40, 0x42, 0x49, 0x40, 0x40, 0x40, 0x05, 0x05, 0x03, 0x09, 0x16, 0x09, + 0x0e, 0x1c, 0x03, 0x01, 0x09, 0x24, 0x09, 0x01, 0x01, 0x0e, 0x16, 0x19, 0x13, 0x19, 0x03, 0x09, + 0x16, 0x09, 0x0e, 0x1c, 0x03, 0x01, 0x09, 0x24, 0x09, 0x01, 0x01, 0x0e, 0x16, 0x19, 0x13, 0x19, + 0x23, 0x42, 0x3a, 0x40, 0x48, 0x40, 0x05, 0x07, 0x05, 0x13, 0x13, 0x2a, 0x07, 0x12, 0x43, 0x42, + 0x1d, 0x07, 0x40, 0x12, 0x43, 0x42, 0x1d, 0x07, 0x40, 0x12, 0x43, 0x42, 0x1d, 0x07, 0x40, 0x4d, + 0x07, 0x13, 0x13, 0x21, 0x23, 0x21, 0x23, 0x0a, 0x17, 0x43, 0x42, 0x17, 0x43, 0x42, 0x40, 0x40, + 0x40, 0x06, 0x06, 0x0a, 0x40, 0x0f, 0x0a, 0x04, 0x04, 0x2d, 0x27, 0x1d, 0x07, 0x23, 0x1d, 0x15, + 0x45, 0x16, 0x12, 0x0a, 0x40, 0x0a, 0x15, 0x04, 0x21, 0x0a, 0x2e, 0x1b, 0x21, 0x0a, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x54, 0x22, 0x06, 0x43, 0x40, 0x42, 0x54, 0x62, 0x27, 0x40, 0x06, 0x40, 0x40, 0x40, 0x0f, + 0x06, 0x1e, 0x0a, 0x1c, 0x10, 0x1e, 0x2c, 0x3e, 0x3e, 0x07, 0x07, 0x01, 0x0c, 0x0e, 0x18, 0x07, + 0x02, 0x27, 0x22, 0x09, 0x40, 0x41, 0x4a, 0x40, 0x40, 0x40, 0x06, 0x06, 0x04, 0x0a, 0x18, 0x0a, + 0x10, 0x1e, 0x04, 0x02, 0x0a, 0x26, 0x0a, 0x02, 0x02, 0x10, 0x18, 0x1a, 0x14, 0x1a, 0x04, 0x0a, + 0x18, 0x0a, 0x10, 0x1e, 0x04, 0x02, 0x0a, 0x26, 0x0a, 0x02, 0x02, 0x10, 0x18, 0x1a, 0x14, 0x1a, + 0x24, 0x41, 0x3c, 0x40, 0x48, 0x40, 0x06, 0x07, 0x06, 0x14, 0x14, 0x2c, 0x07, 0x11, 0x44, 0x41, + 0x1e, 0x07, 0x40, 0x11, 0x44, 0x41, 0x1e, 0x07, 0x40, 0x11, 0x44, 0x41, 0x1e, 0x07, 0x40, 0x4e, + 0x07, 0x14, 0x14, 0x22, 0x24, 0x22, 0x24, 0x09, 0x17, 0x44, 0x41, 0x17, 0x44, 0x41, 0x40, 0x40, + 0x40, 0x05, 0x05, 0x09, 0x40, 0x0f, 0x09, 0x03, 0x03, 0x2e, 0x27, 0x1e, 0x07, 0x24, 0x1e, 0x16, + 0x46, 0x15, 0x11, 0x09, 0x40, 0x09, 0x16, 0x03, 0x22, 0x09, 0x30, 0x1c, 0x22, 0x09, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x54, 0x23, 0x06, 0x43, 0x40, 0x43, 0x54, 0x63, 0x27, 0x40, 0x06, 0x40, 0x40, 0x40, 0x0f, + 0x06, 0x1f, 0x0b, 0x1c, 0x11, 0x1f, 0x2e, 0x3e, 0x3e, 0x07, 0x07, 0x01, 0x0c, 0x0e, 0x19, 0x07, + 0x03, 0x27, 0x23, 0x09, 0x40, 0x41, 0x4b, 0x40, 0x40, 0x40, 0x06, 0x06, 0x04, 0x0b, 0x19, 0x0b, + 0x11, 0x1f, 0x04, 0x03, 0x0b, 0x27, 0x0b, 0x03, 0x03, 0x11, 0x19, 0x1b, 0x14, 0x1b, 0x04, 0x0b, + 0x19, 0x0b, 0x11, 0x1f, 0x04, 0x03, 0x0b, 0x27, 0x0b, 0x03, 0x03, 0x11, 0x19, 0x1b, 0x14, 0x1b, + 0x24, 0x41, 0x3e, 0x40, 0x48, 0x40, 0x06, 0x07, 0x06, 0x14, 0x14, 0x2e, 0x07, 0x11, 0x44, 0x41, + 0x1e, 0x07, 0x40, 0x11, 0x44, 0x41, 0x1e, 0x07, 0x40, 0x11, 0x44, 0x41, 0x1e, 0x07, 0x40, 0x4e, + 0x07, 0x14, 0x14, 0x23, 0x24, 0x23, 0x24, 0x09, 0x17, 0x44, 0x41, 0x17, 0x44, 0x41, 0x40, 0x40, + 0x40, 0x04, 0x04, 0x09, 0x40, 0x0f, 0x09, 0x03, 0x03, 0x2e, 0x27, 0x1e, 0x07, 0x24, 0x1e, 0x16, + 0x46, 0x14, 0x11, 0x09, 0x40, 0x09, 0x16, 0x03, 0x23, 0x09, 0x31, 0x1c, 0x23, 0x09, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x55, 0x24, 0x06, 0x42, 0x40, 0x44, 0x55, 0x64, 0x27, 0x40, 0x06, 0x40, 0x40, 0x40, 0x0f, + 0x06, 0x21, 0x0c, 0x1d, 0x12, 0x21, 0x30, 0x3e, 0x3e, 0x07, 0x07, 0x01, 0x0d, 0x0e, 0x1a, 0x07, + 0x04, 0x27, 0x24, 0x09, 0x40, 0x41, 0x4c, 0x40, 0x40, 0x40, 0x06, 0x06, 0x05, 0x0c, 0x1a, 0x0c, + 0x12, 0x21, 0x05, 0x04, 0x0c, 0x29, 0x0c, 0x04, 0x04, 0x12, 0x1a, 0x1c, 0x15, 0x1c, 0x05, 0x0c, + 0x1a, 0x0c, 0x12, 0x21, 0x05, 0x04, 0x0c, 0x29, 0x0c, 0x04, 0x04, 0x12, 0x1a, 0x1c, 0x15, 0x1c, + 0x25, 0x41, 0x3e, 0x40, 0x48, 0x40, 0x06, 0x07, 0x06, 0x15, 0x15, 0x30, 0x07, 0x11, 0x45, 0x41, + 0x1e, 0x07, 0x40, 0x11, 0x45, 0x41, 0x1e, 0x07, 0x40, 0x11, 0x45, 0x41, 0x1e, 0x07, 0x40, 0x4e, + 0x07, 0x15, 0x15, 0x24, 0x25, 0x24, 0x25, 0x09, 0x17, 0x45, 0x41, 0x17, 0x45, 0x41, 0x40, 0x40, + 0x40, 0x03, 0x03, 0x09, 0x40, 0x0f, 0x09, 0x02, 0x02, 0x2e, 0x27, 0x1e, 0x07, 0x25, 0x1e, 0x16, + 0x46, 0x13, 0x11, 0x09, 0x40, 0x09, 0x16, 0x02, 0x24, 0x09, 0x32, 0x1d, 0x24, 0x09, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x56, 0x24, 0x06, 0x42, 0x40, 0x45, 0x56, 0x65, 0x27, 0x40, 0x06, 0x40, 0x40, 0x40, 0x0f, + 0x06, 0x22, 0x0c, 0x1d, 0x13, 0x22, 0x31, 0x3e, 0x3e, 0x07, 0x07, 0x00, 0x0d, 0x0e, 0x1b, 0x07, + 0x04, 0x27, 0x24, 0x08, 0x40, 0x41, 0x4d, 0x40, 0x40, 0x40, 0x06, 0x06, 0x05, 0x0c, 0x1b, 0x0c, + 0x13, 0x22, 0x05, 0x04, 0x0c, 0x2a, 0x0c, 0x04, 0x04, 0x13, 0x1b, 0x1c, 0x15, 0x1c, 0x05, 0x0c, + 0x1b, 0x0c, 0x13, 0x22, 0x05, 0x04, 0x0c, 0x2a, 0x0c, 0x04, 0x04, 0x13, 0x1b, 0x1c, 0x15, 0x1c, + 0x25, 0x41, 0x3e, 0x40, 0x48, 0x40, 0x06, 0x07, 0x06, 0x15, 0x15, 0x31, 0x07, 0x10, 0x46, 0x41, + 0x1e, 0x07, 0x40, 0x10, 0x46, 0x41, 0x1e, 0x07, 0x40, 0x10, 0x46, 0x41, 0x1e, 0x07, 0x40, 0x4f, + 0x07, 0x15, 0x15, 0x24, 0x25, 0x24, 0x25, 0x08, 0x17, 0x46, 0x41, 0x17, 0x46, 0x41, 0x40, 0x40, + 0x40, 0x02, 0x02, 0x08, 0x40, 0x0f, 0x08, 0x01, 0x01, 0x2e, 0x27, 0x1e, 0x07, 0x25, 0x1e, 0x16, + 0x47, 0x12, 0x10, 0x08, 0x40, 0x08, 0x16, 0x01, 0x24, 0x08, 0x33, 0x1d, 0x24, 0x08, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x56, 0x25, 0x07, 0x41, 0x40, 0x45, 0x56, 0x65, 0x27, 0x40, 0x07, 0x40, 0x40, 0x40, 0x0f, + 0x07, 0x24, 0x0d, 0x1e, 0x15, 0x24, 0x33, 0x3e, 0x3e, 0x07, 0x07, 0x00, 0x0e, 0x0f, 0x1d, 0x07, + 0x05, 0x27, 0x25, 0x08, 0x40, 0x40, 0x4d, 0x40, 0x40, 0x40, 0x07, 0x07, 0x06, 0x0d, 0x1d, 0x0d, + 0x15, 0x24, 0x06, 0x05, 0x0d, 0x2c, 0x0d, 0x05, 0x05, 0x15, 0x1d, 0x1d, 0x16, 0x1d, 0x06, 0x0d, + 0x1d, 0x0d, 0x15, 0x24, 0x06, 0x05, 0x0d, 0x2c, 0x0d, 0x05, 0x05, 0x15, 0x1d, 0x1d, 0x16, 0x1d, + 0x26, 0x40, 0x3e, 0x40, 0x48, 0x40, 0x07, 0x07, 0x07, 0x16, 0x16, 0x33, 0x07, 0x10, 0x46, 0x40, + 0x1f, 0x07, 0x40, 0x10, 0x46, 0x40, 0x1f, 0x07, 0x40, 0x10, 0x46, 0x40, 0x1f, 0x07, 0x40, 0x4f, + 0x07, 0x16, 0x16, 0x25, 0x26, 0x25, 0x26, 0x08, 0x17, 0x46, 0x40, 0x17, 0x46, 0x40, 0x40, 0x40, + 0x40, 0x02, 0x02, 0x08, 0x40, 0x0f, 0x08, 0x01, 0x01, 0x2f, 0x27, 0x1f, 0x07, 0x26, 0x1f, 0x17, + 0x47, 0x12, 0x10, 0x08, 0x40, 0x08, 0x17, 0x01, 0x25, 0x08, 0x35, 0x1e, 0x25, 0x08, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x57, 0x26, 0x07, 0x40, 0x40, 0x46, 0x57, 0x66, 0x27, 0x40, 0x07, 0x40, 0x40, 0x40, 0x0f, + 0x07, 0x26, 0x0e, 0x1f, 0x16, 0x26, 0x35, 0x3e, 0x3e, 0x07, 0x07, 0x00, 0x0f, 0x0f, 0x1e, 0x07, + 0x06, 0x27, 0x26, 0x08, 0x40, 0x40, 0x4e, 0x40, 0x40, 0x40, 0x07, 0x07, 0x07, 0x0e, 0x1e, 0x0e, + 0x16, 0x26, 0x07, 0x06, 0x0e, 0x2e, 0x0e, 0x06, 0x06, 0x16, 0x1e, 0x1e, 0x17, 0x1e, 0x07, 0x0e, + 0x1e, 0x0e, 0x16, 0x26, 0x07, 0x06, 0x0e, 0x2e, 0x0e, 0x06, 0x06, 0x16, 0x1e, 0x1e, 0x17, 0x1e, + 0x27, 0x40, 0x3e, 0x40, 0x48, 0x40, 0x07, 0x07, 0x07, 0x17, 0x17, 0x35, 0x07, 0x10, 0x47, 0x40, + 0x1f, 0x07, 0x40, 0x10, 0x47, 0x40, 0x1f, 0x07, 0x40, 0x10, 0x47, 0x40, 0x1f, 0x07, 0x40, 0x4f, + 0x07, 0x17, 0x17, 0x26, 0x27, 0x26, 0x27, 0x08, 0x17, 0x47, 0x40, 0x17, 0x47, 0x40, 0x40, 0x40, + 0x40, 0x01, 0x01, 0x08, 0x40, 0x0f, 0x08, 0x00, 0x00, 0x2f, 0x27, 0x1f, 0x07, 0x27, 0x1f, 0x17, + 0x47, 0x11, 0x10, 0x08, 0x40, 0x08, 0x17, 0x00, 0x26, 0x08, 0x36, 0x1f, 0x26, 0x08, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x57, 0x27, 0x07, 0x40, 0x40, 0x47, 0x57, 0x67, 0x27, 0x40, 0x07, 0x40, 0x40, 0x40, 0x0f, + 0x07, 0x27, 0x0f, 0x1f, 0x17, 0x27, 0x37, 0x3e, 0x3e, 0x07, 0x07, 0x00, 0x0f, 0x0f, 0x1f, 0x07, + 0x07, 0x27, 0x27, 0x08, 0x40, 0x40, 0x4f, 0x40, 0x40, 0x40, 0x07, 0x07, 0x07, 0x0f, 0x1f, 0x0f, + 0x17, 0x27, 0x07, 0x07, 0x0f, 0x2f, 0x0f, 0x07, 0x07, 0x17, 0x1f, 0x1f, 0x17, 0x1f, 0x07, 0x0f, + 0x1f, 0x0f, 0x17, 0x27, 0x07, 0x07, 0x0f, 0x2f, 0x0f, 0x07, 0x07, 0x17, 0x1f, 0x1f, 0x17, 0x1f, + 0x27, 0x40, 0x3e, 0x40, 0x48, 0x40, 0x07, 0x07, 0x07, 0x17, 0x17, 0x37, 0x07, 0x10, 0x47, 0x40, + 0x1f, 0x07, 0x40, 0x10, 0x47, 0x40, 0x1f, 0x07, 0x40, 0x10, 0x47, 0x40, 0x1f, 0x07, 0x40, 0x4f, + 0x07, 0x17, 0x17, 0x27, 0x27, 0x27, 0x27, 0x08, 0x17, 0x47, 0x40, 0x17, 0x47, 0x40, 0x40, 0x40, + 0x40, 0x00, 0x00, 0x08, 0x40, 0x0f, 0x08, 0x00, 0x00, 0x2f, 0x27, 0x1f, 0x07, 0x27, 0x1f, 0x17, + 0x47, 0x10, 0x10, 0x08, 0x40, 0x08, 0x17, 0x00, 0x27, 0x08, 0x37, 0x1f, 0x27, 0x08, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x48, 0x48, 0x60, 0x40, 0x27, 0x07, 0x07, 0x1f, 0x40, 0x48, 0x40, 0x40, 0x17, 0x0f, + 0x48, 0x68, 0x40, 0x07, 0x68, 0x68, 0x68, 0x68, 0x68, 0x07, 0x07, 0x0f, 0x3e, 0x17, 0x40, 0x07, + 0x68, 0x27, 0x50, 0x17, 0x40, 0x07, 0x1f, 0x40, 0x40, 0x40, 0x48, 0x48, 0x58, 0x60, 0x50, 0x60, + 0x68, 0x60, 0x58, 0x68, 0x68, 0x68, 0x58, 0x60, 0x68, 0x68, 0x68, 0x50, 0x48, 0x58, 0x58, 0x60, + 0x50, 0x60, 0x68, 0x60, 0x58, 0x68, 0x68, 0x68, 0x58, 0x60, 0x68, 0x68, 0x68, 0x50, 0x48, 0x58, + 0x07, 0x50, 0x58, 0x40, 0x40, 0x40, 0x48, 0x07, 0x48, 0x48, 0x48, 0x68, 0x50, 0x1f, 0x17, 0x50, + 0x0f, 0x07, 0x40, 0x1f, 0x17, 0x50, 0x0f, 0x07, 0x40, 0x1f, 0x17, 0x50, 0x0f, 0x07, 0x40, 0x40, + 0x07, 0x40, 0x40, 0x40, 0x07, 0x40, 0x07, 0x17, 0x17, 0x17, 0x50, 0x17, 0x17, 0x50, 0x40, 0x40, + 0x40, 0x2f, 0x17, 0x17, 0x40, 0x0f, 0x17, 0x1f, 0x1f, 0x1f, 0x27, 0x0f, 0x07, 0x07, 0x0f, 0x40, + 0x07, 0x3e, 0x1f, 0x17, 0x40, 0x0f, 0x17, 0x1f, 0x48, 0x17, 0x48, 0x48, 0x48, 0x17, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x47, 0x47, 0x5f, 0x40, 0x27, 0x07, 0x07, 0x20, 0x40, 0x47, 0x40, 0x40, 0x17, 0x0f, + 0x47, 0x66, 0x40, 0x08, 0x66, 0x66, 0x66, 0x65, 0x65, 0x07, 0x07, 0x0f, 0x3e, 0x17, 0x00, 0x07, + 0x67, 0x27, 0x4e, 0x17, 0x40, 0x07, 0x1f, 0x40, 0x40, 0x40, 0x47, 0x47, 0x57, 0x5f, 0x4f, 0x5f, + 0x66, 0x5e, 0x57, 0x67, 0x67, 0x66, 0x57, 0x5f, 0x67, 0x67, 0x66, 0x4f, 0x47, 0x56, 0x57, 0x5f, + 0x4f, 0x5f, 0x66, 0x5e, 0x57, 0x67, 0x67, 0x66, 0x57, 0x5f, 0x67, 0x67, 0x66, 0x4f, 0x47, 0x56, + 0x08, 0x4f, 0x56, 0x40, 0x40, 0x40, 0x47, 0x07, 0x47, 0x47, 0x47, 0x66, 0x4f, 0x1f, 0x17, 0x4f, + 0x10, 0x07, 0x40, 0x1f, 0x17, 0x4f, 0x10, 0x07, 0x40, 0x1f, 0x17, 0x4f, 0x10, 0x07, 0x40, 0x40, + 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x17, 0x17, 0x17, 0x4f, 0x17, 0x17, 0x4f, 0x40, 0x40, + 0x40, 0x2f, 0x17, 0x17, 0x40, 0x0f, 0x17, 0x1f, 0x1f, 0x20, 0x27, 0x10, 0x07, 0x08, 0x10, 0x00, + 0x07, 0x3e, 0x1f, 0x17, 0x40, 0x0f, 0x17, 0x1f, 0x47, 0x17, 0x46, 0x47, 0x47, 0x17, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x46, 0x47, 0x5e, 0x40, 0x26, 0x06, 0x06, 0x20, 0x40, 0x47, 0x40, 0x40, 0x16, 0x0f, + 0x47, 0x64, 0x40, 0x08, 0x65, 0x64, 0x64, 0x63, 0x63, 0x07, 0x07, 0x0f, 0x3e, 0x17, 0x01, 0x07, + 0x66, 0x27, 0x4d, 0x17, 0x40, 0x07, 0x1e, 0x40, 0x40, 0x40, 0x47, 0x47, 0x56, 0x5e, 0x4e, 0x5e, + 0x65, 0x5d, 0x56, 0x66, 0x66, 0x64, 0x56, 0x5e, 0x66, 0x66, 0x64, 0x4e, 0x46, 0x55, 0x56, 0x5e, + 0x4e, 0x5e, 0x65, 0x5d, 0x56, 0x66, 0x66, 0x64, 0x56, 0x5e, 0x66, 0x66, 0x64, 0x4e, 0x46, 0x55, + 0x09, 0x4f, 0x54, 0x40, 0x40, 0x40, 0x47, 0x07, 0x47, 0x46, 0x46, 0x64, 0x4e, 0x1f, 0x16, 0x4f, + 0x10, 0x07, 0x40, 0x1f, 0x16, 0x4f, 0x10, 0x07, 0x40, 0x1f, 0x16, 0x4f, 0x10, 0x07, 0x40, 0x40, + 0x07, 0x00, 0x00, 0x01, 0x09, 0x01, 0x09, 0x17, 0x17, 0x16, 0x4f, 0x17, 0x16, 0x4f, 0x40, 0x40, + 0x40, 0x2e, 0x17, 0x17, 0x40, 0x0f, 0x17, 0x1e, 0x1e, 0x20, 0x27, 0x10, 0x07, 0x09, 0x10, 0x01, + 0x07, 0x3e, 0x1f, 0x17, 0x40, 0x0f, 0x17, 0x1e, 0x46, 0x17, 0x45, 0x46, 0x46, 0x17, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x45, 0x47, 0x5e, 0x40, 0x25, 0x06, 0x05, 0x20, 0x40, 0x47, 0x40, 0x40, 0x16, 0x0f, + 0x47, 0x63, 0x40, 0x08, 0x64, 0x63, 0x62, 0x60, 0x60, 0x07, 0x07, 0x0f, 0x3e, 0x17, 0x01, 0x07, + 0x65, 0x27, 0x4c, 0x17, 0x40, 0x07, 0x1d, 0x40, 0x40, 0x40, 0x47, 0x47, 0x56, 0x5d, 0x4e, 0x5d, + 0x64, 0x5c, 0x56, 0x65, 0x65, 0x63, 0x56, 0x5e, 0x65, 0x65, 0x63, 0x4d, 0x46, 0x54, 0x56, 0x5d, + 0x4e, 0x5d, 0x64, 0x5c, 0x56, 0x65, 0x65, 0x63, 0x56, 0x5e, 0x65, 0x65, 0x63, 0x4d, 0x46, 0x54, + 0x09, 0x4f, 0x52, 0x40, 0x40, 0x40, 0x47, 0x07, 0x47, 0x46, 0x46, 0x62, 0x4e, 0x1f, 0x16, 0x4f, + 0x10, 0x07, 0x40, 0x1f, 0x16, 0x4f, 0x10, 0x07, 0x40, 0x1f, 0x16, 0x4f, 0x10, 0x07, 0x40, 0x40, + 0x07, 0x00, 0x00, 0x01, 0x09, 0x01, 0x09, 0x17, 0x17, 0x16, 0x4f, 0x17, 0x16, 0x4f, 0x40, 0x40, + 0x40, 0x2d, 0x17, 0x17, 0x40, 0x0f, 0x17, 0x1e, 0x1e, 0x20, 0x27, 0x10, 0x07, 0x09, 0x10, 0x01, + 0x07, 0x3e, 0x1f, 0x17, 0x40, 0x0f, 0x17, 0x1e, 0x45, 0x17, 0x44, 0x45, 0x45, 0x17, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x44, 0x46, 0x5d, 0x40, 0x24, 0x05, 0x04, 0x21, 0x40, 0x46, 0x40, 0x40, 0x15, 0x0f, + 0x46, 0x61, 0x40, 0x09, 0x63, 0x61, 0x60, 0x5e, 0x5e, 0x07, 0x07, 0x0e, 0x3e, 0x16, 0x02, 0x07, + 0x64, 0x27, 0x4b, 0x16, 0x40, 0x06, 0x1c, 0x40, 0x40, 0x40, 0x46, 0x46, 0x55, 0x5c, 0x4d, 0x5c, + 0x63, 0x5b, 0x55, 0x64, 0x64, 0x61, 0x55, 0x5d, 0x64, 0x64, 0x61, 0x4c, 0x45, 0x53, 0x55, 0x5c, + 0x4d, 0x5c, 0x63, 0x5b, 0x55, 0x64, 0x64, 0x61, 0x55, 0x5d, 0x64, 0x64, 0x61, 0x4c, 0x45, 0x53, + 0x0a, 0x4e, 0x50, 0x40, 0x41, 0x40, 0x46, 0x07, 0x46, 0x45, 0x45, 0x60, 0x4d, 0x1e, 0x15, 0x4e, + 0x11, 0x07, 0x40, 0x1e, 0x15, 0x4e, 0x11, 0x07, 0x40, 0x1e, 0x15, 0x4e, 0x11, 0x07, 0x40, 0x41, + 0x07, 0x01, 0x01, 0x02, 0x0a, 0x02, 0x0a, 0x16, 0x17, 0x15, 0x4e, 0x17, 0x15, 0x4e, 0x40, 0x40, + 0x40, 0x2c, 0x16, 0x16, 0x40, 0x0f, 0x16, 0x1d, 0x1d, 0x21, 0x27, 0x11, 0x07, 0x0a, 0x11, 0x02, + 0x06, 0x3e, 0x1e, 0x16, 0x40, 0x0f, 0x16, 0x1d, 0x44, 0x16, 0x43, 0x44, 0x44, 0x16, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x43, 0x46, 0x5c, 0x40, 0x23, 0x04, 0x03, 0x21, 0x40, 0x46, 0x40, 0x40, 0x14, 0x0f, + 0x46, 0x60, 0x40, 0x09, 0x61, 0x60, 0x5e, 0x5b, 0x5b, 0x07, 0x07, 0x0e, 0x3e, 0x16, 0x03, 0x07, + 0x63, 0x27, 0x49, 0x16, 0x40, 0x06, 0x1b, 0x40, 0x40, 0x40, 0x46, 0x46, 0x54, 0x5b, 0x4c, 0x5b, + 0x61, 0x59, 0x54, 0x63, 0x63, 0x60, 0x54, 0x5c, 0x63, 0x63, 0x60, 0x4b, 0x44, 0x51, 0x54, 0x5b, + 0x4c, 0x5b, 0x61, 0x59, 0x54, 0x63, 0x63, 0x60, 0x54, 0x5c, 0x63, 0x63, 0x60, 0x4b, 0x44, 0x51, + 0x0b, 0x4e, 0x4e, 0x40, 0x41, 0x40, 0x46, 0x07, 0x46, 0x44, 0x44, 0x5e, 0x4c, 0x1e, 0x14, 0x4e, + 0x11, 0x07, 0x40, 0x1e, 0x14, 0x4e, 0x11, 0x07, 0x40, 0x1e, 0x14, 0x4e, 0x11, 0x07, 0x40, 0x41, + 0x07, 0x01, 0x01, 0x03, 0x0b, 0x03, 0x0b, 0x16, 0x17, 0x14, 0x4e, 0x17, 0x14, 0x4e, 0x40, 0x40, + 0x40, 0x2b, 0x16, 0x16, 0x40, 0x0f, 0x16, 0x1c, 0x1c, 0x21, 0x27, 0x11, 0x07, 0x0b, 0x11, 0x03, + 0x06, 0x3e, 0x1e, 0x16, 0x40, 0x0f, 0x16, 0x1c, 0x43, 0x16, 0x41, 0x43, 0x43, 0x16, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x42, 0x46, 0x5c, 0x40, 0x22, 0x04, 0x02, 0x21, 0x40, 0x46, 0x40, 0x40, 0x14, 0x0f, + 0x46, 0x5e, 0x40, 0x09, 0x60, 0x5e, 0x5c, 0x59, 0x59, 0x07, 0x07, 0x0e, 0x3e, 0x16, 0x03, 0x07, + 0x62, 0x27, 0x48, 0x16, 0x40, 0x06, 0x1a, 0x40, 0x40, 0x40, 0x46, 0x46, 0x54, 0x5a, 0x4c, 0x5a, + 0x60, 0x58, 0x54, 0x62, 0x62, 0x5e, 0x54, 0x5c, 0x62, 0x62, 0x5e, 0x4a, 0x44, 0x50, 0x54, 0x5a, + 0x4c, 0x5a, 0x60, 0x58, 0x54, 0x62, 0x62, 0x5e, 0x54, 0x5c, 0x62, 0x62, 0x5e, 0x4a, 0x44, 0x50, + 0x0b, 0x4e, 0x4c, 0x40, 0x41, 0x40, 0x46, 0x07, 0x46, 0x44, 0x44, 0x5c, 0x4c, 0x1e, 0x14, 0x4e, + 0x11, 0x07, 0x40, 0x1e, 0x14, 0x4e, 0x11, 0x07, 0x40, 0x1e, 0x14, 0x4e, 0x11, 0x07, 0x40, 0x41, + 0x07, 0x01, 0x01, 0x03, 0x0b, 0x03, 0x0b, 0x16, 0x17, 0x14, 0x4e, 0x17, 0x14, 0x4e, 0x40, 0x40, + 0x40, 0x2a, 0x16, 0x16, 0x40, 0x0f, 0x16, 0x1c, 0x1c, 0x21, 0x27, 0x11, 0x07, 0x0b, 0x11, 0x03, + 0x06, 0x3e, 0x1e, 0x16, 0x40, 0x0f, 0x16, 0x1c, 0x42, 0x16, 0x40, 0x42, 0x42, 0x16, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x41, 0x45, 0x5b, 0x40, 0x21, 0x03, 0x01, 0x22, 0x40, 0x45, 0x40, 0x40, 0x13, 0x0f, + 0x45, 0x5d, 0x40, 0x0a, 0x5f, 0x5d, 0x5a, 0x56, 0x56, 0x07, 0x07, 0x0d, 0x3e, 0x15, 0x04, 0x07, + 0x61, 0x27, 0x47, 0x15, 0x40, 0x05, 0x19, 0x40, 0x40, 0x40, 0x45, 0x45, 0x53, 0x59, 0x4b, 0x59, + 0x5f, 0x57, 0x53, 0x61, 0x61, 0x5d, 0x53, 0x5b, 0x61, 0x61, 0x5d, 0x49, 0x43, 0x4f, 0x53, 0x59, + 0x4b, 0x59, 0x5f, 0x57, 0x53, 0x61, 0x61, 0x5d, 0x53, 0x5b, 0x61, 0x61, 0x5d, 0x49, 0x43, 0x4f, + 0x0c, 0x4d, 0x4a, 0x40, 0x42, 0x40, 0x45, 0x07, 0x45, 0x43, 0x43, 0x5a, 0x4b, 0x1d, 0x13, 0x4d, + 0x12, 0x07, 0x40, 0x1d, 0x13, 0x4d, 0x12, 0x07, 0x40, 0x1d, 0x13, 0x4d, 0x12, 0x07, 0x40, 0x42, + 0x07, 0x02, 0x02, 0x04, 0x0c, 0x04, 0x0c, 0x15, 0x17, 0x13, 0x4d, 0x17, 0x13, 0x4d, 0x40, 0x40, + 0x40, 0x29, 0x15, 0x15, 0x40, 0x0f, 0x15, 0x1b, 0x1b, 0x22, 0x27, 0x12, 0x07, 0x0c, 0x12, 0x04, + 0x05, 0x3e, 0x1d, 0x15, 0x40, 0x0f, 0x15, 0x1b, 0x41, 0x15, 0x00, 0x41, 0x41, 0x15, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x40, 0x45, 0x5b, 0x40, 0x20, 0x02, 0x00, 0x22, 0x40, 0x45, 0x40, 0x40, 0x12, 0x0f, + 0x45, 0x5b, 0x40, 0x0a, 0x5e, 0x5b, 0x59, 0x54, 0x54, 0x07, 0x07, 0x0d, 0x3e, 0x15, 0x04, 0x07, + 0x60, 0x27, 0x46, 0x15, 0x40, 0x05, 0x18, 0x40, 0x40, 0x40, 0x45, 0x45, 0x53, 0x58, 0x4b, 0x58, + 0x5e, 0x56, 0x53, 0x60, 0x60, 0x5b, 0x53, 0x5b, 0x60, 0x60, 0x5b, 0x48, 0x43, 0x4e, 0x53, 0x58, + 0x4b, 0x58, 0x5e, 0x56, 0x53, 0x60, 0x60, 0x5b, 0x53, 0x5b, 0x60, 0x60, 0x5b, 0x48, 0x43, 0x4e, + 0x0c, 0x4d, 0x49, 0x40, 0x42, 0x40, 0x45, 0x07, 0x45, 0x43, 0x43, 0x59, 0x4b, 0x1d, 0x12, 0x4d, + 0x12, 0x07, 0x40, 0x1d, 0x12, 0x4d, 0x12, 0x07, 0x40, 0x1d, 0x12, 0x4d, 0x12, 0x07, 0x40, 0x42, + 0x07, 0x02, 0x02, 0x04, 0x0c, 0x04, 0x0c, 0x15, 0x17, 0x12, 0x4d, 0x17, 0x12, 0x4d, 0x40, 0x40, + 0x40, 0x28, 0x15, 0x15, 0x40, 0x0f, 0x15, 0x1a, 0x1a, 0x22, 0x27, 0x12, 0x07, 0x0c, 0x12, 0x04, + 0x05, 0x3e, 0x1d, 0x15, 0x40, 0x0f, 0x15, 0x1a, 0x40, 0x15, 0x01, 0x40, 0x40, 0x15, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x00, 0x45, 0x5a, 0x40, 0x1f, 0x02, 0x40, 0x22, 0x40, 0x45, 0x40, 0x40, 0x12, 0x0f, + 0x45, 0x59, 0x40, 0x0a, 0x5c, 0x59, 0x57, 0x51, 0x51, 0x07, 0x07, 0x0d, 0x3e, 0x15, 0x05, 0x07, + 0x5f, 0x27, 0x44, 0x15, 0x40, 0x05, 0x17, 0x40, 0x40, 0x40, 0x45, 0x45, 0x52, 0x57, 0x4a, 0x57, + 0x5c, 0x54, 0x52, 0x5f, 0x5f, 0x59, 0x52, 0x5a, 0x5f, 0x5f, 0x59, 0x47, 0x42, 0x4c, 0x52, 0x57, + 0x4a, 0x57, 0x5c, 0x54, 0x52, 0x5f, 0x5f, 0x59, 0x52, 0x5a, 0x5f, 0x5f, 0x59, 0x47, 0x42, 0x4c, + 0x0d, 0x4d, 0x47, 0x40, 0x42, 0x40, 0x45, 0x07, 0x45, 0x42, 0x42, 0x57, 0x4a, 0x1d, 0x12, 0x4d, + 0x12, 0x07, 0x40, 0x1d, 0x12, 0x4d, 0x12, 0x07, 0x40, 0x1d, 0x12, 0x4d, 0x12, 0x07, 0x40, 0x42, + 0x07, 0x02, 0x02, 0x05, 0x0d, 0x05, 0x0d, 0x15, 0x17, 0x12, 0x4d, 0x17, 0x12, 0x4d, 0x40, 0x40, + 0x40, 0x27, 0x15, 0x15, 0x40, 0x0f, 0x15, 0x1a, 0x1a, 0x22, 0x27, 0x12, 0x07, 0x0d, 0x12, 0x05, + 0x05, 0x3e, 0x1d, 0x15, 0x40, 0x0f, 0x15, 0x1a, 0x00, 0x15, 0x03, 0x00, 0x00, 0x15, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x01, 0x44, 0x59, 0x40, 0x1e, 0x01, 0x41, 0x23, 0x40, 0x44, 0x40, 0x40, 0x11, 0x0f, + 0x44, 0x58, 0x40, 0x0b, 0x5b, 0x58, 0x55, 0x4f, 0x4f, 0x07, 0x07, 0x0c, 0x3e, 0x14, 0x06, 0x07, + 0x5e, 0x27, 0x43, 0x14, 0x40, 0x04, 0x16, 0x40, 0x40, 0x40, 0x44, 0x44, 0x51, 0x56, 0x49, 0x56, + 0x5b, 0x53, 0x51, 0x5e, 0x5e, 0x58, 0x51, 0x59, 0x5e, 0x5e, 0x58, 0x46, 0x41, 0x4b, 0x51, 0x56, + 0x49, 0x56, 0x5b, 0x53, 0x51, 0x5e, 0x5e, 0x58, 0x51, 0x59, 0x5e, 0x5e, 0x58, 0x46, 0x41, 0x4b, + 0x0e, 0x4c, 0x45, 0x40, 0x43, 0x40, 0x44, 0x07, 0x44, 0x41, 0x41, 0x55, 0x49, 0x1c, 0x11, 0x4c, + 0x13, 0x07, 0x40, 0x1c, 0x11, 0x4c, 0x13, 0x07, 0x40, 0x1c, 0x11, 0x4c, 0x13, 0x07, 0x40, 0x43, + 0x07, 0x03, 0x03, 0x06, 0x0e, 0x06, 0x0e, 0x14, 0x17, 0x11, 0x4c, 0x17, 0x11, 0x4c, 0x40, 0x40, + 0x40, 0x26, 0x14, 0x14, 0x40, 0x0f, 0x14, 0x19, 0x19, 0x23, 0x27, 0x13, 0x07, 0x0e, 0x13, 0x06, + 0x04, 0x3e, 0x1c, 0x14, 0x40, 0x0f, 0x14, 0x19, 0x01, 0x14, 0x04, 0x01, 0x01, 0x14, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x02, 0x44, 0x59, 0x40, 0x1d, 0x01, 0x42, 0x23, 0x40, 0x44, 0x40, 0x40, 0x11, 0x0f, + 0x44, 0x56, 0x40, 0x0b, 0x5a, 0x56, 0x53, 0x4c, 0x4c, 0x07, 0x07, 0x0c, 0x3e, 0x14, 0x06, 0x07, + 0x5d, 0x27, 0x42, 0x14, 0x40, 0x04, 0x15, 0x40, 0x40, 0x40, 0x44, 0x44, 0x51, 0x55, 0x49, 0x55, + 0x5a, 0x52, 0x51, 0x5d, 0x5d, 0x56, 0x51, 0x59, 0x5d, 0x5d, 0x56, 0x45, 0x41, 0x4a, 0x51, 0x55, + 0x49, 0x55, 0x5a, 0x52, 0x51, 0x5d, 0x5d, 0x56, 0x51, 0x59, 0x5d, 0x5d, 0x56, 0x45, 0x41, 0x4a, + 0x0e, 0x4c, 0x43, 0x40, 0x43, 0x40, 0x44, 0x07, 0x44, 0x41, 0x41, 0x53, 0x49, 0x1c, 0x11, 0x4c, + 0x13, 0x07, 0x40, 0x1c, 0x11, 0x4c, 0x13, 0x07, 0x40, 0x1c, 0x11, 0x4c, 0x13, 0x07, 0x40, 0x43, + 0x07, 0x03, 0x03, 0x06, 0x0e, 0x06, 0x0e, 0x14, 0x17, 0x11, 0x4c, 0x17, 0x11, 0x4c, 0x40, 0x40, + 0x40, 0x25, 0x14, 0x14, 0x40, 0x0f, 0x14, 0x19, 0x19, 0x23, 0x27, 0x13, 0x07, 0x0e, 0x13, 0x06, + 0x04, 0x3e, 0x1c, 0x14, 0x40, 0x0f, 0x14, 0x19, 0x02, 0x14, 0x05, 0x02, 0x02, 0x14, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x03, 0x44, 0x58, 0x40, 0x1c, 0x00, 0x43, 0x23, 0x40, 0x44, 0x40, 0x40, 0x10, 0x0f, + 0x44, 0x55, 0x40, 0x0b, 0x59, 0x55, 0x51, 0x4a, 0x4a, 0x07, 0x07, 0x0c, 0x3d, 0x14, 0x07, 0x07, + 0x5c, 0x27, 0x41, 0x14, 0x40, 0x04, 0x14, 0x40, 0x40, 0x40, 0x44, 0x44, 0x50, 0x54, 0x48, 0x54, + 0x59, 0x51, 0x50, 0x5c, 0x5c, 0x55, 0x50, 0x58, 0x5c, 0x5c, 0x55, 0x44, 0x40, 0x49, 0x50, 0x54, + 0x48, 0x54, 0x59, 0x51, 0x50, 0x5c, 0x5c, 0x55, 0x50, 0x58, 0x5c, 0x5c, 0x55, 0x44, 0x40, 0x49, + 0x0f, 0x4c, 0x41, 0x40, 0x43, 0x40, 0x44, 0x07, 0x44, 0x40, 0x40, 0x51, 0x48, 0x1c, 0x10, 0x4c, + 0x13, 0x07, 0x40, 0x1c, 0x10, 0x4c, 0x13, 0x07, 0x40, 0x1c, 0x10, 0x4c, 0x13, 0x07, 0x40, 0x43, + 0x07, 0x03, 0x03, 0x07, 0x0f, 0x07, 0x0f, 0x14, 0x17, 0x10, 0x4c, 0x17, 0x10, 0x4c, 0x40, 0x40, + 0x40, 0x24, 0x14, 0x14, 0x40, 0x0f, 0x14, 0x18, 0x18, 0x23, 0x27, 0x13, 0x07, 0x0f, 0x13, 0x07, + 0x04, 0x3e, 0x1c, 0x14, 0x40, 0x0f, 0x14, 0x18, 0x03, 0x14, 0x06, 0x03, 0x03, 0x14, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x04, 0x43, 0x57, 0x40, 0x1b, 0x40, 0x44, 0x24, 0x40, 0x43, 0x40, 0x40, 0x0f, 0x0f, + 0x43, 0x53, 0x40, 0x0c, 0x57, 0x53, 0x4f, 0x47, 0x47, 0x07, 0x07, 0x0b, 0x3b, 0x13, 0x08, 0x07, + 0x5b, 0x27, 0x00, 0x13, 0x40, 0x03, 0x13, 0x40, 0x40, 0x40, 0x43, 0x43, 0x4f, 0x53, 0x47, 0x53, + 0x57, 0x4f, 0x4f, 0x5b, 0x5b, 0x53, 0x4f, 0x57, 0x5b, 0x5b, 0x53, 0x43, 0x00, 0x47, 0x4f, 0x53, + 0x47, 0x53, 0x57, 0x4f, 0x4f, 0x5b, 0x5b, 0x53, 0x4f, 0x57, 0x5b, 0x5b, 0x53, 0x43, 0x00, 0x47, + 0x10, 0x4b, 0x00, 0x40, 0x44, 0x40, 0x43, 0x07, 0x43, 0x00, 0x00, 0x4f, 0x47, 0x1b, 0x0f, 0x4b, + 0x14, 0x07, 0x40, 0x1b, 0x0f, 0x4b, 0x14, 0x07, 0x40, 0x1b, 0x0f, 0x4b, 0x14, 0x07, 0x40, 0x44, + 0x07, 0x04, 0x04, 0x08, 0x10, 0x08, 0x10, 0x13, 0x17, 0x0f, 0x4b, 0x17, 0x0f, 0x4b, 0x40, 0x40, + 0x40, 0x23, 0x13, 0x13, 0x40, 0x0f, 0x13, 0x17, 0x17, 0x24, 0x27, 0x14, 0x07, 0x10, 0x14, 0x08, + 0x03, 0x3e, 0x1b, 0x13, 0x40, 0x0f, 0x13, 0x17, 0x04, 0x13, 0x08, 0x04, 0x04, 0x13, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x05, 0x43, 0x57, 0x40, 0x1a, 0x40, 0x45, 0x24, 0x40, 0x43, 0x40, 0x40, 0x0f, 0x0f, + 0x43, 0x52, 0x40, 0x0c, 0x56, 0x52, 0x4d, 0x45, 0x45, 0x07, 0x07, 0x0b, 0x3a, 0x13, 0x08, 0x07, + 0x5a, 0x27, 0x01, 0x13, 0x40, 0x03, 0x12, 0x40, 0x40, 0x40, 0x43, 0x43, 0x4f, 0x52, 0x47, 0x52, + 0x56, 0x4e, 0x4f, 0x5a, 0x5a, 0x52, 0x4f, 0x57, 0x5a, 0x5a, 0x52, 0x42, 0x00, 0x46, 0x4f, 0x52, + 0x47, 0x52, 0x56, 0x4e, 0x4f, 0x5a, 0x5a, 0x52, 0x4f, 0x57, 0x5a, 0x5a, 0x52, 0x42, 0x00, 0x46, + 0x10, 0x4b, 0x02, 0x40, 0x44, 0x40, 0x43, 0x07, 0x43, 0x00, 0x00, 0x4d, 0x47, 0x1b, 0x0f, 0x4b, + 0x14, 0x07, 0x40, 0x1b, 0x0f, 0x4b, 0x14, 0x07, 0x40, 0x1b, 0x0f, 0x4b, 0x14, 0x07, 0x40, 0x44, + 0x07, 0x04, 0x04, 0x08, 0x10, 0x08, 0x10, 0x13, 0x17, 0x0f, 0x4b, 0x17, 0x0f, 0x4b, 0x40, 0x40, + 0x40, 0x22, 0x13, 0x13, 0x40, 0x0f, 0x13, 0x17, 0x17, 0x24, 0x27, 0x14, 0x07, 0x10, 0x14, 0x08, + 0x03, 0x3e, 0x1b, 0x13, 0x40, 0x0f, 0x13, 0x17, 0x05, 0x13, 0x09, 0x05, 0x05, 0x13, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x06, 0x43, 0x56, 0x40, 0x19, 0x41, 0x46, 0x24, 0x40, 0x43, 0x40, 0x40, 0x0e, 0x0f, + 0x43, 0x50, 0x40, 0x0c, 0x55, 0x50, 0x4b, 0x42, 0x42, 0x07, 0x07, 0x0b, 0x38, 0x13, 0x09, 0x07, + 0x59, 0x27, 0x02, 0x13, 0x40, 0x03, 0x11, 0x40, 0x40, 0x40, 0x43, 0x43, 0x4e, 0x51, 0x46, 0x51, + 0x55, 0x4d, 0x4e, 0x59, 0x59, 0x50, 0x4e, 0x56, 0x59, 0x59, 0x50, 0x41, 0x01, 0x45, 0x4e, 0x51, + 0x46, 0x51, 0x55, 0x4d, 0x4e, 0x59, 0x59, 0x50, 0x4e, 0x56, 0x59, 0x59, 0x50, 0x41, 0x01, 0x45, + 0x11, 0x4b, 0x04, 0x40, 0x44, 0x40, 0x43, 0x07, 0x43, 0x01, 0x01, 0x4b, 0x46, 0x1b, 0x0e, 0x4b, + 0x14, 0x07, 0x40, 0x1b, 0x0e, 0x4b, 0x14, 0x07, 0x40, 0x1b, 0x0e, 0x4b, 0x14, 0x07, 0x40, 0x44, + 0x07, 0x04, 0x04, 0x09, 0x11, 0x09, 0x11, 0x13, 0x17, 0x0e, 0x4b, 0x17, 0x0e, 0x4b, 0x40, 0x40, + 0x40, 0x21, 0x13, 0x13, 0x40, 0x0f, 0x13, 0x16, 0x16, 0x24, 0x27, 0x14, 0x07, 0x11, 0x14, 0x09, + 0x03, 0x3d, 0x1b, 0x13, 0x40, 0x0f, 0x13, 0x16, 0x06, 0x13, 0x0a, 0x06, 0x06, 0x13, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x06, 0x43, 0x56, 0x40, 0x18, 0x42, 0x47, 0x24, 0x40, 0x43, 0x40, 0x40, 0x0d, 0x0f, + 0x43, 0x4f, 0x40, 0x0c, 0x54, 0x4f, 0x4a, 0x40, 0x40, 0x07, 0x07, 0x0a, 0x36, 0x12, 0x09, 0x07, + 0x59, 0x27, 0x03, 0x12, 0x40, 0x02, 0x10, 0x40, 0x40, 0x40, 0x43, 0x43, 0x4e, 0x51, 0x46, 0x51, + 0x54, 0x4c, 0x4e, 0x59, 0x59, 0x4f, 0x4e, 0x56, 0x59, 0x59, 0x4f, 0x41, 0x01, 0x44, 0x4e, 0x51, + 0x46, 0x51, 0x54, 0x4c, 0x4e, 0x59, 0x59, 0x4f, 0x4e, 0x56, 0x59, 0x59, 0x4f, 0x41, 0x01, 0x44, + 0x11, 0x4b, 0x05, 0x40, 0x45, 0x40, 0x43, 0x07, 0x43, 0x01, 0x01, 0x4a, 0x46, 0x1a, 0x0d, 0x4b, + 0x14, 0x07, 0x40, 0x1a, 0x0d, 0x4b, 0x14, 0x07, 0x40, 0x1a, 0x0d, 0x4b, 0x14, 0x07, 0x40, 0x45, + 0x07, 0x04, 0x04, 0x09, 0x11, 0x09, 0x11, 0x12, 0x17, 0x0d, 0x4b, 0x17, 0x0d, 0x4b, 0x40, 0x40, + 0x40, 0x20, 0x12, 0x12, 0x40, 0x0f, 0x12, 0x15, 0x15, 0x24, 0x27, 0x14, 0x07, 0x11, 0x14, 0x09, + 0x02, 0x3b, 0x1a, 0x12, 0x40, 0x0f, 0x12, 0x15, 0x06, 0x12, 0x0b, 0x06, 0x06, 0x12, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x07, 0x42, 0x55, 0x40, 0x18, 0x42, 0x47, 0x25, 0x40, 0x42, 0x40, 0x40, 0x0d, 0x0f, + 0x42, 0x4d, 0x40, 0x0d, 0x52, 0x4d, 0x48, 0x02, 0x02, 0x07, 0x07, 0x0a, 0x35, 0x12, 0x0a, 0x07, + 0x58, 0x27, 0x05, 0x12, 0x40, 0x02, 0x10, 0x40, 0x40, 0x40, 0x42, 0x42, 0x4d, 0x50, 0x45, 0x50, + 0x52, 0x4a, 0x4d, 0x58, 0x58, 0x4d, 0x4d, 0x55, 0x58, 0x58, 0x4d, 0x40, 0x02, 0x42, 0x4d, 0x50, + 0x45, 0x50, 0x52, 0x4a, 0x4d, 0x58, 0x58, 0x4d, 0x4d, 0x55, 0x58, 0x58, 0x4d, 0x40, 0x02, 0x42, + 0x12, 0x4a, 0x07, 0x40, 0x45, 0x40, 0x42, 0x07, 0x42, 0x02, 0x02, 0x48, 0x45, 0x1a, 0x0d, 0x4a, + 0x15, 0x07, 0x40, 0x1a, 0x0d, 0x4a, 0x15, 0x07, 0x40, 0x1a, 0x0d, 0x4a, 0x15, 0x07, 0x40, 0x45, + 0x07, 0x05, 0x05, 0x0a, 0x12, 0x0a, 0x12, 0x12, 0x17, 0x0d, 0x4a, 0x17, 0x0d, 0x4a, 0x40, 0x40, + 0x40, 0x20, 0x12, 0x12, 0x40, 0x0f, 0x12, 0x15, 0x15, 0x25, 0x27, 0x15, 0x07, 0x12, 0x15, 0x0a, + 0x02, 0x3a, 0x1a, 0x12, 0x40, 0x0f, 0x12, 0x15, 0x07, 0x12, 0x0d, 0x07, 0x07, 0x12, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x08, 0x42, 0x54, 0x40, 0x17, 0x43, 0x48, 0x25, 0x40, 0x42, 0x40, 0x40, 0x0c, 0x0f, + 0x42, 0x4b, 0x40, 0x0d, 0x51, 0x4b, 0x46, 0x04, 0x04, 0x07, 0x07, 0x0a, 0x33, 0x12, 0x0b, 0x07, + 0x57, 0x27, 0x06, 0x12, 0x40, 0x02, 0x0f, 0x40, 0x40, 0x40, 0x42, 0x42, 0x4c, 0x4f, 0x44, 0x4f, + 0x51, 0x49, 0x4c, 0x57, 0x57, 0x4b, 0x4c, 0x54, 0x57, 0x57, 0x4b, 0x00, 0x03, 0x41, 0x4c, 0x4f, + 0x44, 0x4f, 0x51, 0x49, 0x4c, 0x57, 0x57, 0x4b, 0x4c, 0x54, 0x57, 0x57, 0x4b, 0x00, 0x03, 0x41, + 0x13, 0x4a, 0x09, 0x40, 0x45, 0x40, 0x42, 0x07, 0x42, 0x03, 0x03, 0x46, 0x44, 0x1a, 0x0c, 0x4a, + 0x15, 0x07, 0x40, 0x1a, 0x0c, 0x4a, 0x15, 0x07, 0x40, 0x1a, 0x0c, 0x4a, 0x15, 0x07, 0x40, 0x45, + 0x07, 0x05, 0x05, 0x0b, 0x13, 0x0b, 0x13, 0x12, 0x17, 0x0c, 0x4a, 0x17, 0x0c, 0x4a, 0x40, 0x40, + 0x40, 0x1f, 0x12, 0x12, 0x40, 0x0f, 0x12, 0x14, 0x14, 0x25, 0x27, 0x15, 0x07, 0x13, 0x15, 0x0b, + 0x02, 0x39, 0x1a, 0x12, 0x40, 0x0f, 0x12, 0x14, 0x08, 0x12, 0x0e, 0x08, 0x08, 0x12, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x09, 0x42, 0x54, 0x40, 0x16, 0x43, 0x49, 0x25, 0x40, 0x42, 0x40, 0x40, 0x0c, 0x0f, + 0x42, 0x4a, 0x40, 0x0d, 0x50, 0x4a, 0x44, 0x07, 0x07, 0x07, 0x07, 0x0a, 0x32, 0x12, 0x0b, 0x07, + 0x56, 0x27, 0x07, 0x12, 0x40, 0x02, 0x0e, 0x40, 0x40, 0x40, 0x42, 0x42, 0x4c, 0x4e, 0x44, 0x4e, + 0x50, 0x48, 0x4c, 0x56, 0x56, 0x4a, 0x4c, 0x54, 0x56, 0x56, 0x4a, 0x01, 0x03, 0x40, 0x4c, 0x4e, + 0x44, 0x4e, 0x50, 0x48, 0x4c, 0x56, 0x56, 0x4a, 0x4c, 0x54, 0x56, 0x56, 0x4a, 0x01, 0x03, 0x40, + 0x13, 0x4a, 0x0b, 0x40, 0x45, 0x40, 0x42, 0x07, 0x42, 0x03, 0x03, 0x44, 0x44, 0x1a, 0x0c, 0x4a, + 0x15, 0x07, 0x40, 0x1a, 0x0c, 0x4a, 0x15, 0x07, 0x40, 0x1a, 0x0c, 0x4a, 0x15, 0x07, 0x40, 0x45, + 0x07, 0x05, 0x05, 0x0b, 0x13, 0x0b, 0x13, 0x12, 0x17, 0x0c, 0x4a, 0x17, 0x0c, 0x4a, 0x40, 0x40, + 0x40, 0x1e, 0x12, 0x12, 0x40, 0x0f, 0x12, 0x14, 0x14, 0x25, 0x27, 0x15, 0x07, 0x13, 0x15, 0x0b, + 0x02, 0x38, 0x1a, 0x12, 0x40, 0x0f, 0x12, 0x14, 0x09, 0x12, 0x0f, 0x09, 0x09, 0x12, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x0a, 0x41, 0x53, 0x40, 0x15, 0x44, 0x4a, 0x26, 0x40, 0x41, 0x40, 0x40, 0x0b, 0x0f, + 0x41, 0x48, 0x40, 0x0e, 0x4f, 0x48, 0x42, 0x09, 0x09, 0x07, 0x07, 0x09, 0x30, 0x11, 0x0c, 0x07, + 0x55, 0x27, 0x08, 0x11, 0x40, 0x01, 0x0d, 0x40, 0x40, 0x40, 0x41, 0x41, 0x4b, 0x4d, 0x43, 0x4d, + 0x4f, 0x47, 0x4b, 0x55, 0x55, 0x48, 0x4b, 0x53, 0x55, 0x55, 0x48, 0x02, 0x04, 0x00, 0x4b, 0x4d, + 0x43, 0x4d, 0x4f, 0x47, 0x4b, 0x55, 0x55, 0x48, 0x4b, 0x53, 0x55, 0x55, 0x48, 0x02, 0x04, 0x00, + 0x14, 0x49, 0x0d, 0x40, 0x46, 0x40, 0x41, 0x07, 0x41, 0x04, 0x04, 0x42, 0x43, 0x19, 0x0b, 0x49, + 0x16, 0x07, 0x40, 0x19, 0x0b, 0x49, 0x16, 0x07, 0x40, 0x19, 0x0b, 0x49, 0x16, 0x07, 0x40, 0x46, + 0x07, 0x06, 0x06, 0x0c, 0x14, 0x0c, 0x14, 0x11, 0x17, 0x0b, 0x49, 0x17, 0x0b, 0x49, 0x40, 0x40, + 0x40, 0x1d, 0x11, 0x11, 0x40, 0x0f, 0x11, 0x13, 0x13, 0x26, 0x27, 0x16, 0x07, 0x14, 0x16, 0x0c, + 0x01, 0x36, 0x19, 0x11, 0x40, 0x0f, 0x11, 0x13, 0x0a, 0x11, 0x10, 0x0a, 0x0a, 0x11, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x0b, 0x41, 0x52, 0x40, 0x14, 0x45, 0x4b, 0x26, 0x40, 0x41, 0x40, 0x40, 0x0a, 0x0f, + 0x41, 0x47, 0x40, 0x0e, 0x4d, 0x47, 0x40, 0x0c, 0x0c, 0x07, 0x07, 0x09, 0x2f, 0x11, 0x0d, 0x07, + 0x54, 0x27, 0x0a, 0x11, 0x40, 0x01, 0x0c, 0x40, 0x40, 0x40, 0x41, 0x41, 0x4a, 0x4c, 0x42, 0x4c, + 0x4d, 0x45, 0x4a, 0x54, 0x54, 0x47, 0x4a, 0x52, 0x54, 0x54, 0x47, 0x03, 0x05, 0x02, 0x4a, 0x4c, + 0x42, 0x4c, 0x4d, 0x45, 0x4a, 0x54, 0x54, 0x47, 0x4a, 0x52, 0x54, 0x54, 0x47, 0x03, 0x05, 0x02, + 0x15, 0x49, 0x0f, 0x40, 0x46, 0x40, 0x41, 0x07, 0x41, 0x05, 0x05, 0x40, 0x42, 0x19, 0x0a, 0x49, + 0x16, 0x07, 0x40, 0x19, 0x0a, 0x49, 0x16, 0x07, 0x40, 0x19, 0x0a, 0x49, 0x16, 0x07, 0x40, 0x46, + 0x07, 0x06, 0x06, 0x0d, 0x15, 0x0d, 0x15, 0x11, 0x17, 0x0a, 0x49, 0x17, 0x0a, 0x49, 0x40, 0x40, + 0x40, 0x1c, 0x11, 0x11, 0x40, 0x0f, 0x11, 0x12, 0x12, 0x26, 0x27, 0x16, 0x07, 0x15, 0x16, 0x0d, + 0x01, 0x35, 0x19, 0x11, 0x40, 0x0f, 0x11, 0x12, 0x0b, 0x11, 0x12, 0x0b, 0x0b, 0x11, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x0c, 0x41, 0x52, 0x40, 0x13, 0x45, 0x4c, 0x26, 0x40, 0x41, 0x40, 0x40, 0x0a, 0x0f, + 0x41, 0x45, 0x40, 0x0e, 0x4c, 0x45, 0x01, 0x0e, 0x0e, 0x07, 0x07, 0x09, 0x2d, 0x11, 0x0d, 0x07, + 0x53, 0x27, 0x0b, 0x11, 0x40, 0x01, 0x0b, 0x40, 0x40, 0x40, 0x41, 0x41, 0x4a, 0x4b, 0x42, 0x4b, + 0x4c, 0x44, 0x4a, 0x53, 0x53, 0x45, 0x4a, 0x52, 0x53, 0x53, 0x45, 0x04, 0x05, 0x03, 0x4a, 0x4b, + 0x42, 0x4b, 0x4c, 0x44, 0x4a, 0x53, 0x53, 0x45, 0x4a, 0x52, 0x53, 0x53, 0x45, 0x04, 0x05, 0x03, + 0x15, 0x49, 0x11, 0x40, 0x46, 0x40, 0x41, 0x07, 0x41, 0x05, 0x05, 0x01, 0x42, 0x19, 0x0a, 0x49, + 0x16, 0x07, 0x40, 0x19, 0x0a, 0x49, 0x16, 0x07, 0x40, 0x19, 0x0a, 0x49, 0x16, 0x07, 0x40, 0x46, + 0x07, 0x06, 0x06, 0x0d, 0x15, 0x0d, 0x15, 0x11, 0x17, 0x0a, 0x49, 0x17, 0x0a, 0x49, 0x40, 0x40, + 0x40, 0x1b, 0x11, 0x11, 0x40, 0x0f, 0x11, 0x12, 0x12, 0x26, 0x27, 0x16, 0x07, 0x15, 0x16, 0x0d, + 0x01, 0x34, 0x19, 0x11, 0x40, 0x0f, 0x11, 0x12, 0x0c, 0x11, 0x13, 0x0c, 0x0c, 0x11, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x0d, 0x40, 0x51, 0x40, 0x12, 0x46, 0x4d, 0x27, 0x40, 0x40, 0x40, 0x40, 0x09, 0x0f, + 0x40, 0x44, 0x40, 0x0f, 0x4b, 0x44, 0x03, 0x11, 0x11, 0x07, 0x07, 0x08, 0x2c, 0x10, 0x0e, 0x07, + 0x52, 0x27, 0x0c, 0x10, 0x40, 0x00, 0x0a, 0x40, 0x40, 0x40, 0x40, 0x40, 0x49, 0x4a, 0x41, 0x4a, + 0x4b, 0x43, 0x49, 0x52, 0x52, 0x44, 0x49, 0x51, 0x52, 0x52, 0x44, 0x05, 0x06, 0x04, 0x49, 0x4a, + 0x41, 0x4a, 0x4b, 0x43, 0x49, 0x52, 0x52, 0x44, 0x49, 0x51, 0x52, 0x52, 0x44, 0x05, 0x06, 0x04, + 0x16, 0x48, 0x13, 0x40, 0x47, 0x40, 0x40, 0x07, 0x40, 0x06, 0x06, 0x03, 0x41, 0x18, 0x09, 0x48, + 0x17, 0x07, 0x40, 0x18, 0x09, 0x48, 0x17, 0x07, 0x40, 0x18, 0x09, 0x48, 0x17, 0x07, 0x40, 0x47, + 0x07, 0x07, 0x07, 0x0e, 0x16, 0x0e, 0x16, 0x10, 0x17, 0x09, 0x48, 0x17, 0x09, 0x48, 0x40, 0x40, + 0x40, 0x1a, 0x10, 0x10, 0x40, 0x0f, 0x10, 0x11, 0x11, 0x27, 0x27, 0x17, 0x07, 0x16, 0x17, 0x0e, + 0x00, 0x33, 0x18, 0x10, 0x40, 0x0f, 0x10, 0x11, 0x0d, 0x10, 0x14, 0x0d, 0x0d, 0x10, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x0e, 0x40, 0x51, 0x40, 0x11, 0x47, 0x4e, 0x27, 0x40, 0x40, 0x40, 0x40, 0x08, 0x0f, + 0x40, 0x42, 0x40, 0x0f, 0x4a, 0x42, 0x04, 0x13, 0x13, 0x07, 0x07, 0x08, 0x2a, 0x10, 0x0e, 0x07, + 0x51, 0x27, 0x0d, 0x10, 0x40, 0x00, 0x09, 0x40, 0x40, 0x40, 0x40, 0x40, 0x49, 0x49, 0x41, 0x49, + 0x4a, 0x42, 0x49, 0x51, 0x51, 0x42, 0x49, 0x51, 0x51, 0x51, 0x42, 0x06, 0x06, 0x05, 0x49, 0x49, + 0x41, 0x49, 0x4a, 0x42, 0x49, 0x51, 0x51, 0x42, 0x49, 0x51, 0x51, 0x51, 0x42, 0x06, 0x06, 0x05, + 0x16, 0x48, 0x14, 0x40, 0x47, 0x40, 0x40, 0x07, 0x40, 0x06, 0x06, 0x04, 0x41, 0x18, 0x08, 0x48, + 0x17, 0x07, 0x40, 0x18, 0x08, 0x48, 0x17, 0x07, 0x40, 0x18, 0x08, 0x48, 0x17, 0x07, 0x40, 0x47, + 0x07, 0x07, 0x07, 0x0e, 0x16, 0x0e, 0x16, 0x10, 0x17, 0x08, 0x48, 0x17, 0x08, 0x48, 0x40, 0x40, + 0x40, 0x19, 0x10, 0x10, 0x40, 0x0f, 0x10, 0x10, 0x10, 0x27, 0x27, 0x17, 0x07, 0x16, 0x17, 0x0e, + 0x00, 0x31, 0x18, 0x10, 0x40, 0x0f, 0x10, 0x10, 0x0e, 0x10, 0x15, 0x0e, 0x0e, 0x10, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x0f, 0x40, 0x50, 0x40, 0x10, 0x47, 0x4f, 0x27, 0x40, 0x40, 0x40, 0x40, 0x08, 0x0f, + 0x40, 0x40, 0x40, 0x0f, 0x48, 0x40, 0x06, 0x16, 0x16, 0x07, 0x07, 0x08, 0x28, 0x10, 0x0f, 0x07, + 0x50, 0x27, 0x0f, 0x10, 0x40, 0x00, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x48, 0x48, 0x40, 0x48, + 0x48, 0x40, 0x48, 0x50, 0x50, 0x40, 0x48, 0x50, 0x50, 0x50, 0x40, 0x07, 0x07, 0x07, 0x48, 0x48, + 0x40, 0x48, 0x48, 0x40, 0x48, 0x50, 0x50, 0x40, 0x48, 0x50, 0x50, 0x50, 0x40, 0x07, 0x07, 0x07, + 0x17, 0x48, 0x16, 0x40, 0x47, 0x40, 0x40, 0x07, 0x40, 0x07, 0x07, 0x06, 0x40, 0x18, 0x08, 0x48, + 0x17, 0x07, 0x40, 0x18, 0x08, 0x48, 0x17, 0x07, 0x40, 0x18, 0x08, 0x48, 0x17, 0x07, 0x40, 0x47, + 0x07, 0x07, 0x07, 0x0f, 0x17, 0x0f, 0x17, 0x10, 0x17, 0x08, 0x48, 0x17, 0x08, 0x48, 0x40, 0x40, + 0x40, 0x18, 0x10, 0x10, 0x40, 0x0f, 0x10, 0x10, 0x10, 0x27, 0x27, 0x17, 0x07, 0x17, 0x17, 0x0f, + 0x00, 0x30, 0x18, 0x10, 0x40, 0x0f, 0x10, 0x10, 0x0f, 0x10, 0x17, 0x0f, 0x0f, 0x10, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x10, 0x00, 0x4f, 0x40, 0x0f, 0x48, 0x50, 0x28, 0x40, 0x00, 0x40, 0x40, 0x07, 0x0f, + 0x00, 0x00, 0x40, 0x10, 0x47, 0x00, 0x08, 0x18, 0x18, 0x07, 0x07, 0x07, 0x27, 0x0f, 0x10, 0x07, + 0x4f, 0x27, 0x10, 0x0f, 0x40, 0x40, 0x07, 0x40, 0x40, 0x40, 0x00, 0x00, 0x47, 0x47, 0x00, 0x47, + 0x47, 0x00, 0x47, 0x4f, 0x4f, 0x00, 0x47, 0x4f, 0x4f, 0x4f, 0x00, 0x08, 0x08, 0x08, 0x47, 0x47, + 0x00, 0x47, 0x47, 0x00, 0x47, 0x4f, 0x4f, 0x00, 0x47, 0x4f, 0x4f, 0x4f, 0x00, 0x08, 0x08, 0x08, + 0x18, 0x47, 0x18, 0x40, 0x48, 0x40, 0x00, 0x07, 0x00, 0x08, 0x08, 0x08, 0x00, 0x17, 0x07, 0x47, + 0x18, 0x07, 0x40, 0x17, 0x07, 0x47, 0x18, 0x07, 0x40, 0x17, 0x07, 0x47, 0x18, 0x07, 0x40, 0x48, + 0x07, 0x08, 0x08, 0x10, 0x18, 0x10, 0x18, 0x0f, 0x17, 0x07, 0x47, 0x17, 0x07, 0x47, 0x40, 0x40, + 0x40, 0x17, 0x0f, 0x0f, 0x40, 0x0f, 0x0f, 0x0f, 0x0f, 0x28, 0x27, 0x18, 0x07, 0x18, 0x18, 0x10, + 0x40, 0x2f, 0x17, 0x0f, 0x40, 0x0f, 0x0f, 0x0f, 0x10, 0x0f, 0x18, 0x10, 0x10, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x11, 0x00, 0x4f, 0x40, 0x0e, 0x48, 0x51, 0x28, 0x40, 0x00, 0x40, 0x40, 0x07, 0x0f, + 0x00, 0x02, 0x40, 0x10, 0x46, 0x02, 0x0a, 0x1b, 0x1b, 0x07, 0x07, 0x07, 0x25, 0x0f, 0x10, 0x07, + 0x4e, 0x27, 0x11, 0x0f, 0x40, 0x40, 0x06, 0x40, 0x40, 0x40, 0x00, 0x00, 0x47, 0x46, 0x00, 0x46, + 0x46, 0x01, 0x47, 0x4e, 0x4e, 0x02, 0x47, 0x4f, 0x4e, 0x4e, 0x02, 0x09, 0x08, 0x09, 0x47, 0x46, + 0x00, 0x46, 0x46, 0x01, 0x47, 0x4e, 0x4e, 0x02, 0x47, 0x4f, 0x4e, 0x4e, 0x02, 0x09, 0x08, 0x09, + 0x18, 0x47, 0x1a, 0x40, 0x48, 0x40, 0x00, 0x07, 0x00, 0x08, 0x08, 0x0a, 0x00, 0x17, 0x07, 0x47, + 0x18, 0x07, 0x40, 0x17, 0x07, 0x47, 0x18, 0x07, 0x40, 0x17, 0x07, 0x47, 0x18, 0x07, 0x40, 0x48, + 0x07, 0x08, 0x08, 0x10, 0x18, 0x10, 0x18, 0x0f, 0x17, 0x07, 0x47, 0x17, 0x07, 0x47, 0x40, 0x40, + 0x40, 0x16, 0x0f, 0x0f, 0x40, 0x0f, 0x0f, 0x0f, 0x0f, 0x28, 0x27, 0x18, 0x07, 0x18, 0x18, 0x10, + 0x40, 0x2e, 0x17, 0x0f, 0x40, 0x0f, 0x0f, 0x0f, 0x11, 0x0f, 0x19, 0x11, 0x11, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x12, 0x00, 0x4e, 0x40, 0x0d, 0x49, 0x52, 0x28, 0x40, 0x00, 0x40, 0x40, 0x06, 0x0f, + 0x00, 0x03, 0x40, 0x10, 0x45, 0x03, 0x0c, 0x1d, 0x1d, 0x07, 0x07, 0x07, 0x24, 0x0f, 0x11, 0x07, + 0x4d, 0x27, 0x12, 0x0f, 0x40, 0x40, 0x05, 0x40, 0x40, 0x40, 0x00, 0x00, 0x46, 0x45, 0x01, 0x45, + 0x45, 0x02, 0x46, 0x4d, 0x4d, 0x03, 0x46, 0x4e, 0x4d, 0x4d, 0x03, 0x0a, 0x09, 0x0a, 0x46, 0x45, + 0x01, 0x45, 0x45, 0x02, 0x46, 0x4d, 0x4d, 0x03, 0x46, 0x4e, 0x4d, 0x4d, 0x03, 0x0a, 0x09, 0x0a, + 0x19, 0x47, 0x1c, 0x40, 0x48, 0x40, 0x00, 0x07, 0x00, 0x09, 0x09, 0x0c, 0x01, 0x17, 0x06, 0x47, + 0x18, 0x07, 0x40, 0x17, 0x06, 0x47, 0x18, 0x07, 0x40, 0x17, 0x06, 0x47, 0x18, 0x07, 0x40, 0x48, + 0x07, 0x08, 0x08, 0x11, 0x19, 0x11, 0x19, 0x0f, 0x17, 0x06, 0x47, 0x17, 0x06, 0x47, 0x40, 0x40, + 0x40, 0x15, 0x0f, 0x0f, 0x40, 0x0f, 0x0f, 0x0e, 0x0e, 0x28, 0x27, 0x18, 0x07, 0x19, 0x18, 0x11, + 0x40, 0x2c, 0x17, 0x0f, 0x40, 0x0f, 0x0f, 0x0e, 0x12, 0x0f, 0x1a, 0x12, 0x12, 0x0f, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x13, 0x01, 0x4d, 0x40, 0x0c, 0x4a, 0x53, 0x29, 0x40, 0x01, 0x40, 0x40, 0x05, 0x0f, + 0x01, 0x05, 0x40, 0x11, 0x43, 0x05, 0x0e, 0x20, 0x20, 0x07, 0x07, 0x06, 0x22, 0x0e, 0x12, 0x07, + 0x4c, 0x27, 0x14, 0x0e, 0x40, 0x41, 0x04, 0x40, 0x40, 0x40, 0x01, 0x01, 0x45, 0x44, 0x02, 0x44, + 0x43, 0x04, 0x45, 0x4c, 0x4c, 0x05, 0x45, 0x4d, 0x4c, 0x4c, 0x05, 0x0b, 0x0a, 0x0c, 0x45, 0x44, + 0x02, 0x44, 0x43, 0x04, 0x45, 0x4c, 0x4c, 0x05, 0x45, 0x4d, 0x4c, 0x4c, 0x05, 0x0b, 0x0a, 0x0c, + 0x1a, 0x46, 0x1e, 0x40, 0x49, 0x40, 0x01, 0x07, 0x01, 0x0a, 0x0a, 0x0e, 0x02, 0x16, 0x05, 0x46, + 0x19, 0x07, 0x40, 0x16, 0x05, 0x46, 0x19, 0x07, 0x40, 0x16, 0x05, 0x46, 0x19, 0x07, 0x40, 0x49, + 0x07, 0x09, 0x09, 0x12, 0x1a, 0x12, 0x1a, 0x0e, 0x17, 0x05, 0x46, 0x17, 0x05, 0x46, 0x40, 0x40, + 0x40, 0x14, 0x0e, 0x0e, 0x40, 0x0f, 0x0e, 0x0d, 0x0d, 0x29, 0x27, 0x19, 0x07, 0x1a, 0x19, 0x12, + 0x41, 0x2b, 0x16, 0x0e, 0x40, 0x0f, 0x0e, 0x0d, 0x13, 0x0e, 0x1c, 0x13, 0x13, 0x0e, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x14, 0x01, 0x4d, 0x40, 0x0b, 0x4a, 0x54, 0x29, 0x40, 0x01, 0x40, 0x40, 0x05, 0x0f, + 0x01, 0x06, 0x40, 0x11, 0x42, 0x06, 0x10, 0x22, 0x22, 0x07, 0x07, 0x06, 0x21, 0x0e, 0x12, 0x07, + 0x4b, 0x27, 0x15, 0x0e, 0x40, 0x41, 0x03, 0x40, 0x40, 0x40, 0x01, 0x01, 0x45, 0x43, 0x02, 0x43, + 0x42, 0x05, 0x45, 0x4b, 0x4b, 0x06, 0x45, 0x4d, 0x4b, 0x4b, 0x06, 0x0c, 0x0a, 0x0d, 0x45, 0x43, + 0x02, 0x43, 0x42, 0x05, 0x45, 0x4b, 0x4b, 0x06, 0x45, 0x4d, 0x4b, 0x4b, 0x06, 0x0c, 0x0a, 0x0d, + 0x1a, 0x46, 0x20, 0x40, 0x49, 0x40, 0x01, 0x07, 0x01, 0x0a, 0x0a, 0x10, 0x02, 0x16, 0x05, 0x46, + 0x19, 0x07, 0x40, 0x16, 0x05, 0x46, 0x19, 0x07, 0x40, 0x16, 0x05, 0x46, 0x19, 0x07, 0x40, 0x49, + 0x07, 0x09, 0x09, 0x12, 0x1a, 0x12, 0x1a, 0x0e, 0x17, 0x05, 0x46, 0x17, 0x05, 0x46, 0x40, 0x40, + 0x40, 0x13, 0x0e, 0x0e, 0x40, 0x0f, 0x0e, 0x0d, 0x0d, 0x29, 0x27, 0x19, 0x07, 0x1a, 0x19, 0x12, + 0x41, 0x2a, 0x16, 0x0e, 0x40, 0x0f, 0x0e, 0x0d, 0x14, 0x0e, 0x1d, 0x14, 0x14, 0x0e, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x15, 0x01, 0x4c, 0x40, 0x0a, 0x4b, 0x55, 0x29, 0x40, 0x01, 0x40, 0x40, 0x04, 0x0f, + 0x01, 0x08, 0x40, 0x11, 0x41, 0x08, 0x12, 0x25, 0x25, 0x07, 0x07, 0x06, 0x1f, 0x0e, 0x13, 0x07, + 0x4a, 0x27, 0x16, 0x0e, 0x40, 0x41, 0x02, 0x40, 0x40, 0x40, 0x01, 0x01, 0x44, 0x42, 0x03, 0x42, + 0x41, 0x06, 0x44, 0x4a, 0x4a, 0x08, 0x44, 0x4c, 0x4a, 0x4a, 0x08, 0x0d, 0x0b, 0x0e, 0x44, 0x42, + 0x03, 0x42, 0x41, 0x06, 0x44, 0x4a, 0x4a, 0x08, 0x44, 0x4c, 0x4a, 0x4a, 0x08, 0x0d, 0x0b, 0x0e, + 0x1b, 0x46, 0x22, 0x40, 0x49, 0x40, 0x01, 0x07, 0x01, 0x0b, 0x0b, 0x12, 0x03, 0x16, 0x04, 0x46, + 0x19, 0x07, 0x40, 0x16, 0x04, 0x46, 0x19, 0x07, 0x40, 0x16, 0x04, 0x46, 0x19, 0x07, 0x40, 0x49, + 0x07, 0x09, 0x09, 0x13, 0x1b, 0x13, 0x1b, 0x0e, 0x17, 0x04, 0x46, 0x17, 0x04, 0x46, 0x40, 0x40, + 0x40, 0x12, 0x0e, 0x0e, 0x40, 0x0f, 0x0e, 0x0c, 0x0c, 0x29, 0x27, 0x19, 0x07, 0x1b, 0x19, 0x13, + 0x41, 0x29, 0x16, 0x0e, 0x40, 0x0f, 0x0e, 0x0c, 0x15, 0x0e, 0x1e, 0x15, 0x15, 0x0e, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x15, 0x01, 0x4c, 0x40, 0x09, 0x4c, 0x56, 0x29, 0x40, 0x01, 0x40, 0x40, 0x03, 0x0f, + 0x01, 0x09, 0x40, 0x11, 0x40, 0x09, 0x13, 0x27, 0x27, 0x07, 0x07, 0x05, 0x1d, 0x0d, 0x13, 0x07, + 0x4a, 0x27, 0x17, 0x0d, 0x40, 0x42, 0x01, 0x40, 0x40, 0x40, 0x01, 0x01, 0x44, 0x42, 0x03, 0x42, + 0x40, 0x07, 0x44, 0x4a, 0x4a, 0x09, 0x44, 0x4c, 0x4a, 0x4a, 0x09, 0x0d, 0x0b, 0x0f, 0x44, 0x42, + 0x03, 0x42, 0x40, 0x07, 0x44, 0x4a, 0x4a, 0x09, 0x44, 0x4c, 0x4a, 0x4a, 0x09, 0x0d, 0x0b, 0x0f, + 0x1b, 0x46, 0x23, 0x40, 0x4a, 0x40, 0x01, 0x07, 0x01, 0x0b, 0x0b, 0x13, 0x03, 0x15, 0x03, 0x46, + 0x19, 0x07, 0x40, 0x15, 0x03, 0x46, 0x19, 0x07, 0x40, 0x15, 0x03, 0x46, 0x19, 0x07, 0x40, 0x4a, + 0x07, 0x09, 0x09, 0x13, 0x1b, 0x13, 0x1b, 0x0d, 0x17, 0x03, 0x46, 0x17, 0x03, 0x46, 0x40, 0x40, + 0x40, 0x11, 0x0d, 0x0d, 0x40, 0x0f, 0x0d, 0x0b, 0x0b, 0x29, 0x27, 0x19, 0x07, 0x1b, 0x19, 0x13, + 0x42, 0x27, 0x15, 0x0d, 0x40, 0x0f, 0x0d, 0x0b, 0x15, 0x0d, 0x1f, 0x15, 0x15, 0x0d, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x16, 0x02, 0x4b, 0x40, 0x09, 0x4c, 0x56, 0x2a, 0x40, 0x02, 0x40, 0x40, 0x03, 0x0f, + 0x02, 0x0b, 0x40, 0x12, 0x01, 0x0b, 0x15, 0x2a, 0x2a, 0x07, 0x07, 0x05, 0x1c, 0x0d, 0x14, 0x07, + 0x49, 0x27, 0x19, 0x0d, 0x40, 0x42, 0x01, 0x40, 0x40, 0x40, 0x02, 0x02, 0x43, 0x41, 0x04, 0x41, + 0x01, 0x09, 0x43, 0x49, 0x49, 0x0b, 0x43, 0x4b, 0x49, 0x49, 0x0b, 0x0e, 0x0c, 0x11, 0x43, 0x41, + 0x04, 0x41, 0x01, 0x09, 0x43, 0x49, 0x49, 0x0b, 0x43, 0x4b, 0x49, 0x49, 0x0b, 0x0e, 0x0c, 0x11, + 0x1c, 0x45, 0x25, 0x40, 0x4a, 0x40, 0x02, 0x07, 0x02, 0x0c, 0x0c, 0x15, 0x04, 0x15, 0x03, 0x45, + 0x1a, 0x07, 0x40, 0x15, 0x03, 0x45, 0x1a, 0x07, 0x40, 0x15, 0x03, 0x45, 0x1a, 0x07, 0x40, 0x4a, + 0x07, 0x0a, 0x0a, 0x14, 0x1c, 0x14, 0x1c, 0x0d, 0x17, 0x03, 0x45, 0x17, 0x03, 0x45, 0x40, 0x40, + 0x40, 0x11, 0x0d, 0x0d, 0x40, 0x0f, 0x0d, 0x0b, 0x0b, 0x2a, 0x27, 0x1a, 0x07, 0x1c, 0x1a, 0x14, + 0x42, 0x26, 0x15, 0x0d, 0x40, 0x0f, 0x0d, 0x0b, 0x16, 0x0d, 0x21, 0x16, 0x16, 0x0d, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x17, 0x02, 0x4a, 0x40, 0x08, 0x4d, 0x57, 0x2a, 0x40, 0x02, 0x40, 0x40, 0x02, 0x0f, + 0x02, 0x0d, 0x40, 0x12, 0x02, 0x0d, 0x17, 0x2c, 0x2c, 0x07, 0x07, 0x05, 0x1a, 0x0d, 0x15, 0x07, + 0x48, 0x27, 0x1a, 0x0d, 0x40, 0x42, 0x00, 0x40, 0x40, 0x40, 0x02, 0x02, 0x42, 0x40, 0x05, 0x40, + 0x02, 0x0a, 0x42, 0x48, 0x48, 0x0d, 0x42, 0x4a, 0x48, 0x48, 0x0d, 0x0f, 0x0d, 0x12, 0x42, 0x40, + 0x05, 0x40, 0x02, 0x0a, 0x42, 0x48, 0x48, 0x0d, 0x42, 0x4a, 0x48, 0x48, 0x0d, 0x0f, 0x0d, 0x12, + 0x1d, 0x45, 0x27, 0x40, 0x4a, 0x40, 0x02, 0x07, 0x02, 0x0d, 0x0d, 0x17, 0x05, 0x15, 0x02, 0x45, + 0x1a, 0x07, 0x40, 0x15, 0x02, 0x45, 0x1a, 0x07, 0x40, 0x15, 0x02, 0x45, 0x1a, 0x07, 0x40, 0x4a, + 0x07, 0x0a, 0x0a, 0x15, 0x1d, 0x15, 0x1d, 0x0d, 0x17, 0x02, 0x45, 0x17, 0x02, 0x45, 0x40, 0x40, + 0x40, 0x10, 0x0d, 0x0d, 0x40, 0x0f, 0x0d, 0x0a, 0x0a, 0x2a, 0x27, 0x1a, 0x07, 0x1d, 0x1a, 0x15, + 0x42, 0x25, 0x15, 0x0d, 0x40, 0x0f, 0x0d, 0x0a, 0x17, 0x0d, 0x22, 0x17, 0x17, 0x0d, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x18, 0x02, 0x4a, 0x40, 0x07, 0x4d, 0x58, 0x2a, 0x40, 0x02, 0x40, 0x40, 0x02, 0x0f, + 0x02, 0x0e, 0x40, 0x12, 0x03, 0x0e, 0x19, 0x2f, 0x2f, 0x07, 0x07, 0x05, 0x19, 0x0d, 0x15, 0x07, + 0x47, 0x27, 0x1b, 0x0d, 0x40, 0x42, 0x40, 0x40, 0x40, 0x40, 0x02, 0x02, 0x42, 0x00, 0x05, 0x00, + 0x03, 0x0b, 0x42, 0x47, 0x47, 0x0e, 0x42, 0x4a, 0x47, 0x47, 0x0e, 0x10, 0x0d, 0x13, 0x42, 0x00, + 0x05, 0x00, 0x03, 0x0b, 0x42, 0x47, 0x47, 0x0e, 0x42, 0x4a, 0x47, 0x47, 0x0e, 0x10, 0x0d, 0x13, + 0x1d, 0x45, 0x29, 0x40, 0x4a, 0x40, 0x02, 0x07, 0x02, 0x0d, 0x0d, 0x19, 0x05, 0x15, 0x02, 0x45, + 0x1a, 0x07, 0x40, 0x15, 0x02, 0x45, 0x1a, 0x07, 0x40, 0x15, 0x02, 0x45, 0x1a, 0x07, 0x40, 0x4a, + 0x07, 0x0a, 0x0a, 0x15, 0x1d, 0x15, 0x1d, 0x0d, 0x17, 0x02, 0x45, 0x17, 0x02, 0x45, 0x40, 0x40, + 0x40, 0x0f, 0x0d, 0x0d, 0x40, 0x0f, 0x0d, 0x0a, 0x0a, 0x2a, 0x27, 0x1a, 0x07, 0x1d, 0x1a, 0x15, + 0x42, 0x24, 0x15, 0x0d, 0x40, 0x0f, 0x0d, 0x0a, 0x18, 0x0d, 0x23, 0x18, 0x18, 0x0d, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x19, 0x03, 0x49, 0x40, 0x06, 0x4e, 0x59, 0x2b, 0x40, 0x03, 0x40, 0x40, 0x01, 0x0f, + 0x03, 0x10, 0x40, 0x13, 0x04, 0x10, 0x1b, 0x31, 0x31, 0x07, 0x07, 0x04, 0x17, 0x0c, 0x16, 0x07, + 0x46, 0x27, 0x1c, 0x0c, 0x40, 0x43, 0x41, 0x40, 0x40, 0x40, 0x03, 0x03, 0x41, 0x01, 0x06, 0x01, + 0x04, 0x0c, 0x41, 0x46, 0x46, 0x10, 0x41, 0x49, 0x46, 0x46, 0x10, 0x11, 0x0e, 0x14, 0x41, 0x01, + 0x06, 0x01, 0x04, 0x0c, 0x41, 0x46, 0x46, 0x10, 0x41, 0x49, 0x46, 0x46, 0x10, 0x11, 0x0e, 0x14, + 0x1e, 0x44, 0x2b, 0x40, 0x4b, 0x40, 0x03, 0x07, 0x03, 0x0e, 0x0e, 0x1b, 0x06, 0x14, 0x01, 0x44, + 0x1b, 0x07, 0x40, 0x14, 0x01, 0x44, 0x1b, 0x07, 0x40, 0x14, 0x01, 0x44, 0x1b, 0x07, 0x40, 0x4b, + 0x07, 0x0b, 0x0b, 0x16, 0x1e, 0x16, 0x1e, 0x0c, 0x17, 0x01, 0x44, 0x17, 0x01, 0x44, 0x40, 0x40, + 0x40, 0x0e, 0x0c, 0x0c, 0x40, 0x0f, 0x0c, 0x09, 0x09, 0x2b, 0x27, 0x1b, 0x07, 0x1e, 0x1b, 0x16, + 0x43, 0x22, 0x14, 0x0c, 0x40, 0x0f, 0x0c, 0x09, 0x19, 0x0c, 0x24, 0x19, 0x19, 0x0c, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x1a, 0x03, 0x48, 0x40, 0x05, 0x4f, 0x5a, 0x2b, 0x40, 0x03, 0x40, 0x40, 0x00, 0x0f, + 0x03, 0x11, 0x40, 0x13, 0x06, 0x11, 0x1d, 0x34, 0x34, 0x07, 0x07, 0x04, 0x16, 0x0c, 0x17, 0x07, + 0x45, 0x27, 0x1e, 0x0c, 0x40, 0x43, 0x42, 0x40, 0x40, 0x40, 0x03, 0x03, 0x40, 0x02, 0x07, 0x02, + 0x06, 0x0e, 0x40, 0x45, 0x45, 0x11, 0x40, 0x48, 0x45, 0x45, 0x11, 0x12, 0x0f, 0x16, 0x40, 0x02, + 0x07, 0x02, 0x06, 0x0e, 0x40, 0x45, 0x45, 0x11, 0x40, 0x48, 0x45, 0x45, 0x11, 0x12, 0x0f, 0x16, + 0x1f, 0x44, 0x2d, 0x40, 0x4b, 0x40, 0x03, 0x07, 0x03, 0x0f, 0x0f, 0x1d, 0x07, 0x14, 0x00, 0x44, + 0x1b, 0x07, 0x40, 0x14, 0x00, 0x44, 0x1b, 0x07, 0x40, 0x14, 0x00, 0x44, 0x1b, 0x07, 0x40, 0x4b, + 0x07, 0x0b, 0x0b, 0x17, 0x1f, 0x17, 0x1f, 0x0c, 0x17, 0x00, 0x44, 0x17, 0x00, 0x44, 0x40, 0x40, + 0x40, 0x0d, 0x0c, 0x0c, 0x40, 0x0f, 0x0c, 0x08, 0x08, 0x2b, 0x27, 0x1b, 0x07, 0x1f, 0x1b, 0x17, + 0x43, 0x21, 0x14, 0x0c, 0x40, 0x0f, 0x0c, 0x08, 0x1a, 0x0c, 0x26, 0x1a, 0x1a, 0x0c, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x1b, 0x03, 0x48, 0x40, 0x04, 0x4f, 0x5b, 0x2b, 0x40, 0x03, 0x40, 0x40, 0x00, 0x0f, + 0x03, 0x13, 0x40, 0x13, 0x07, 0x13, 0x1f, 0x36, 0x36, 0x07, 0x07, 0x04, 0x14, 0x0c, 0x17, 0x07, + 0x44, 0x27, 0x1f, 0x0c, 0x40, 0x43, 0x43, 0x40, 0x40, 0x40, 0x03, 0x03, 0x40, 0x03, 0x07, 0x03, + 0x07, 0x0f, 0x40, 0x44, 0x44, 0x13, 0x40, 0x48, 0x44, 0x44, 0x13, 0x13, 0x0f, 0x17, 0x40, 0x03, + 0x07, 0x03, 0x07, 0x0f, 0x40, 0x44, 0x44, 0x13, 0x40, 0x48, 0x44, 0x44, 0x13, 0x13, 0x0f, 0x17, + 0x1f, 0x44, 0x2f, 0x40, 0x4b, 0x40, 0x03, 0x07, 0x03, 0x0f, 0x0f, 0x1f, 0x07, 0x14, 0x00, 0x44, + 0x1b, 0x07, 0x40, 0x14, 0x00, 0x44, 0x1b, 0x07, 0x40, 0x14, 0x00, 0x44, 0x1b, 0x07, 0x40, 0x4b, + 0x07, 0x0b, 0x0b, 0x17, 0x1f, 0x17, 0x1f, 0x0c, 0x17, 0x00, 0x44, 0x17, 0x00, 0x44, 0x40, 0x40, + 0x40, 0x0c, 0x0c, 0x0c, 0x40, 0x0f, 0x0c, 0x08, 0x08, 0x2b, 0x27, 0x1b, 0x07, 0x1f, 0x1b, 0x17, + 0x43, 0x20, 0x14, 0x0c, 0x40, 0x0f, 0x0c, 0x08, 0x1b, 0x0c, 0x27, 0x1b, 0x1b, 0x0c, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x1c, 0x04, 0x47, 0x40, 0x03, 0x50, 0x5c, 0x2c, 0x40, 0x04, 0x40, 0x40, 0x40, 0x0f, + 0x04, 0x14, 0x40, 0x14, 0x08, 0x14, 0x21, 0x39, 0x39, 0x07, 0x07, 0x03, 0x13, 0x0b, 0x18, 0x07, + 0x43, 0x27, 0x20, 0x0b, 0x40, 0x44, 0x44, 0x40, 0x40, 0x40, 0x04, 0x04, 0x00, 0x04, 0x08, 0x04, + 0x08, 0x10, 0x00, 0x43, 0x43, 0x14, 0x00, 0x47, 0x43, 0x43, 0x14, 0x14, 0x10, 0x18, 0x00, 0x04, + 0x08, 0x04, 0x08, 0x10, 0x00, 0x43, 0x43, 0x14, 0x00, 0x47, 0x43, 0x43, 0x14, 0x14, 0x10, 0x18, + 0x20, 0x43, 0x31, 0x40, 0x4c, 0x40, 0x04, 0x07, 0x04, 0x10, 0x10, 0x21, 0x08, 0x13, 0x40, 0x43, + 0x1c, 0x07, 0x40, 0x13, 0x40, 0x43, 0x1c, 0x07, 0x40, 0x13, 0x40, 0x43, 0x1c, 0x07, 0x40, 0x4c, + 0x07, 0x0c, 0x0c, 0x18, 0x20, 0x18, 0x20, 0x0b, 0x17, 0x40, 0x43, 0x17, 0x40, 0x43, 0x40, 0x40, + 0x40, 0x0b, 0x0b, 0x0b, 0x40, 0x0f, 0x0b, 0x07, 0x07, 0x2c, 0x27, 0x1c, 0x07, 0x20, 0x1c, 0x18, + 0x44, 0x1f, 0x13, 0x0b, 0x40, 0x0f, 0x0b, 0x07, 0x1c, 0x0b, 0x28, 0x1c, 0x1c, 0x0b, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x1d, 0x04, 0x47, 0x40, 0x02, 0x51, 0x5d, 0x2c, 0x40, 0x04, 0x40, 0x40, 0x41, 0x0f, + 0x04, 0x16, 0x40, 0x14, 0x09, 0x16, 0x22, 0x3b, 0x3b, 0x07, 0x07, 0x03, 0x11, 0x0b, 0x18, 0x07, + 0x42, 0x27, 0x21, 0x0b, 0x40, 0x44, 0x45, 0x40, 0x40, 0x40, 0x04, 0x04, 0x00, 0x05, 0x08, 0x05, + 0x09, 0x11, 0x00, 0x42, 0x42, 0x16, 0x00, 0x47, 0x42, 0x42, 0x16, 0x15, 0x10, 0x19, 0x00, 0x05, + 0x08, 0x05, 0x09, 0x11, 0x00, 0x42, 0x42, 0x16, 0x00, 0x47, 0x42, 0x42, 0x16, 0x15, 0x10, 0x19, + 0x20, 0x43, 0x32, 0x40, 0x4c, 0x40, 0x04, 0x07, 0x04, 0x10, 0x10, 0x22, 0x08, 0x13, 0x41, 0x43, + 0x1c, 0x07, 0x40, 0x13, 0x41, 0x43, 0x1c, 0x07, 0x40, 0x13, 0x41, 0x43, 0x1c, 0x07, 0x40, 0x4c, + 0x07, 0x0c, 0x0c, 0x18, 0x20, 0x18, 0x20, 0x0b, 0x17, 0x41, 0x43, 0x17, 0x41, 0x43, 0x40, 0x40, + 0x40, 0x0a, 0x0b, 0x0b, 0x40, 0x0f, 0x0b, 0x06, 0x06, 0x2c, 0x27, 0x1c, 0x07, 0x20, 0x1c, 0x18, + 0x44, 0x1d, 0x13, 0x0b, 0x40, 0x0f, 0x0b, 0x06, 0x1d, 0x0b, 0x29, 0x1d, 0x1d, 0x0b, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x1e, 0x04, 0x46, 0x40, 0x01, 0x51, 0x5e, 0x2c, 0x40, 0x04, 0x40, 0x40, 0x41, 0x0f, + 0x04, 0x18, 0x40, 0x14, 0x0b, 0x18, 0x24, 0x3e, 0x3e, 0x07, 0x07, 0x03, 0x0f, 0x0b, 0x19, 0x07, + 0x41, 0x27, 0x23, 0x0b, 0x40, 0x44, 0x46, 0x40, 0x40, 0x40, 0x04, 0x04, 0x01, 0x06, 0x09, 0x06, + 0x0b, 0x13, 0x01, 0x41, 0x41, 0x18, 0x01, 0x46, 0x41, 0x41, 0x18, 0x16, 0x11, 0x1b, 0x01, 0x06, + 0x09, 0x06, 0x0b, 0x13, 0x01, 0x41, 0x41, 0x18, 0x01, 0x46, 0x41, 0x41, 0x18, 0x16, 0x11, 0x1b, + 0x21, 0x43, 0x34, 0x40, 0x4c, 0x40, 0x04, 0x07, 0x04, 0x11, 0x11, 0x24, 0x09, 0x13, 0x41, 0x43, + 0x1c, 0x07, 0x40, 0x13, 0x41, 0x43, 0x1c, 0x07, 0x40, 0x13, 0x41, 0x43, 0x1c, 0x07, 0x40, 0x4c, + 0x07, 0x0c, 0x0c, 0x19, 0x21, 0x19, 0x21, 0x0b, 0x17, 0x41, 0x43, 0x17, 0x41, 0x43, 0x40, 0x40, + 0x40, 0x09, 0x0b, 0x0b, 0x40, 0x0f, 0x0b, 0x06, 0x06, 0x2c, 0x27, 0x1c, 0x07, 0x21, 0x1c, 0x19, + 0x44, 0x1c, 0x13, 0x0b, 0x40, 0x0f, 0x0b, 0x06, 0x1e, 0x0b, 0x2b, 0x1e, 0x1e, 0x0b, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x1f, 0x05, 0x45, 0x40, 0x00, 0x52, 0x5f, 0x2d, 0x40, 0x05, 0x40, 0x40, 0x42, 0x0f, + 0x05, 0x19, 0x40, 0x15, 0x0c, 0x19, 0x26, 0x3e, 0x3e, 0x07, 0x07, 0x02, 0x0e, 0x0a, 0x1a, 0x07, + 0x40, 0x27, 0x24, 0x0a, 0x40, 0x45, 0x47, 0x40, 0x40, 0x40, 0x05, 0x05, 0x02, 0x07, 0x0a, 0x07, + 0x0c, 0x14, 0x02, 0x40, 0x40, 0x19, 0x02, 0x45, 0x40, 0x40, 0x19, 0x17, 0x12, 0x1c, 0x02, 0x07, + 0x0a, 0x07, 0x0c, 0x14, 0x02, 0x40, 0x40, 0x19, 0x02, 0x45, 0x40, 0x40, 0x19, 0x17, 0x12, 0x1c, + 0x22, 0x42, 0x36, 0x40, 0x4d, 0x40, 0x05, 0x07, 0x05, 0x12, 0x12, 0x26, 0x0a, 0x12, 0x42, 0x42, + 0x1d, 0x07, 0x40, 0x12, 0x42, 0x42, 0x1d, 0x07, 0x40, 0x12, 0x42, 0x42, 0x1d, 0x07, 0x40, 0x4d, + 0x07, 0x0d, 0x0d, 0x1a, 0x22, 0x1a, 0x22, 0x0a, 0x17, 0x42, 0x42, 0x17, 0x42, 0x42, 0x40, 0x40, + 0x40, 0x08, 0x0a, 0x0a, 0x40, 0x0f, 0x0a, 0x05, 0x05, 0x2d, 0x27, 0x1d, 0x07, 0x22, 0x1d, 0x1a, + 0x45, 0x1b, 0x12, 0x0a, 0x40, 0x0f, 0x0a, 0x05, 0x1f, 0x0a, 0x2c, 0x1f, 0x1f, 0x0a, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x20, 0x05, 0x45, 0x40, 0x40, 0x52, 0x60, 0x2d, 0x40, 0x05, 0x40, 0x40, 0x42, 0x0f, + 0x05, 0x1b, 0x40, 0x15, 0x0d, 0x1b, 0x28, 0x3e, 0x3e, 0x07, 0x07, 0x02, 0x0c, 0x0a, 0x1a, 0x07, + 0x00, 0x27, 0x25, 0x0a, 0x40, 0x45, 0x48, 0x40, 0x40, 0x40, 0x05, 0x05, 0x02, 0x08, 0x0a, 0x08, + 0x0d, 0x15, 0x02, 0x00, 0x00, 0x1b, 0x02, 0x45, 0x00, 0x00, 0x1b, 0x18, 0x12, 0x1d, 0x02, 0x08, + 0x0a, 0x08, 0x0d, 0x15, 0x02, 0x00, 0x00, 0x1b, 0x02, 0x45, 0x00, 0x00, 0x1b, 0x18, 0x12, 0x1d, + 0x22, 0x42, 0x38, 0x40, 0x4d, 0x40, 0x05, 0x07, 0x05, 0x12, 0x12, 0x28, 0x0a, 0x12, 0x42, 0x42, + 0x1d, 0x07, 0x40, 0x12, 0x42, 0x42, 0x1d, 0x07, 0x40, 0x12, 0x42, 0x42, 0x1d, 0x07, 0x40, 0x4d, + 0x07, 0x0d, 0x0d, 0x1a, 0x22, 0x1a, 0x22, 0x0a, 0x17, 0x42, 0x42, 0x17, 0x42, 0x42, 0x40, 0x40, + 0x40, 0x07, 0x0a, 0x0a, 0x40, 0x0f, 0x0a, 0x05, 0x05, 0x2d, 0x27, 0x1d, 0x07, 0x22, 0x1d, 0x1a, + 0x45, 0x1a, 0x12, 0x0a, 0x40, 0x0f, 0x0a, 0x05, 0x20, 0x0a, 0x2d, 0x20, 0x20, 0x0a, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x21, 0x05, 0x44, 0x40, 0x41, 0x53, 0x61, 0x2d, 0x40, 0x05, 0x40, 0x40, 0x43, 0x0f, + 0x05, 0x1c, 0x40, 0x15, 0x0e, 0x1c, 0x2a, 0x3e, 0x3e, 0x07, 0x07, 0x02, 0x0b, 0x0a, 0x1b, 0x07, + 0x01, 0x27, 0x26, 0x0a, 0x40, 0x45, 0x49, 0x40, 0x40, 0x40, 0x05, 0x05, 0x03, 0x09, 0x0b, 0x09, + 0x0e, 0x16, 0x03, 0x01, 0x01, 0x1c, 0x03, 0x44, 0x01, 0x01, 0x1c, 0x19, 0x13, 0x1e, 0x03, 0x09, + 0x0b, 0x09, 0x0e, 0x16, 0x03, 0x01, 0x01, 0x1c, 0x03, 0x44, 0x01, 0x01, 0x1c, 0x19, 0x13, 0x1e, + 0x23, 0x42, 0x3a, 0x40, 0x4d, 0x40, 0x05, 0x07, 0x05, 0x13, 0x13, 0x2a, 0x0b, 0x12, 0x43, 0x42, + 0x1d, 0x07, 0x40, 0x12, 0x43, 0x42, 0x1d, 0x07, 0x40, 0x12, 0x43, 0x42, 0x1d, 0x07, 0x40, 0x4d, + 0x07, 0x0d, 0x0d, 0x1b, 0x23, 0x1b, 0x23, 0x0a, 0x17, 0x43, 0x42, 0x17, 0x43, 0x42, 0x40, 0x40, + 0x40, 0x06, 0x0a, 0x0a, 0x40, 0x0f, 0x0a, 0x04, 0x04, 0x2d, 0x27, 0x1d, 0x07, 0x23, 0x1d, 0x1b, + 0x45, 0x18, 0x12, 0x0a, 0x40, 0x0f, 0x0a, 0x04, 0x21, 0x0a, 0x2e, 0x21, 0x21, 0x0a, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x22, 0x06, 0x43, 0x40, 0x42, 0x54, 0x62, 0x2e, 0x40, 0x06, 0x40, 0x40, 0x44, 0x0f, + 0x06, 0x1e, 0x40, 0x16, 0x10, 0x1e, 0x2c, 0x3e, 0x3e, 0x07, 0x07, 0x01, 0x09, 0x09, 0x1c, 0x07, + 0x02, 0x27, 0x28, 0x09, 0x40, 0x46, 0x4a, 0x40, 0x40, 0x40, 0x06, 0x06, 0x04, 0x0a, 0x0c, 0x0a, + 0x10, 0x18, 0x04, 0x02, 0x02, 0x1e, 0x04, 0x43, 0x02, 0x02, 0x1e, 0x1a, 0x14, 0x20, 0x04, 0x0a, + 0x0c, 0x0a, 0x10, 0x18, 0x04, 0x02, 0x02, 0x1e, 0x04, 0x43, 0x02, 0x02, 0x1e, 0x1a, 0x14, 0x20, + 0x24, 0x41, 0x3c, 0x40, 0x4e, 0x40, 0x06, 0x07, 0x06, 0x14, 0x14, 0x2c, 0x0c, 0x11, 0x44, 0x41, + 0x1e, 0x07, 0x40, 0x11, 0x44, 0x41, 0x1e, 0x07, 0x40, 0x11, 0x44, 0x41, 0x1e, 0x07, 0x40, 0x4e, + 0x07, 0x0e, 0x0e, 0x1c, 0x24, 0x1c, 0x24, 0x09, 0x17, 0x44, 0x41, 0x17, 0x44, 0x41, 0x40, 0x40, + 0x40, 0x05, 0x09, 0x09, 0x40, 0x0f, 0x09, 0x03, 0x03, 0x2e, 0x27, 0x1e, 0x07, 0x24, 0x1e, 0x1c, + 0x46, 0x17, 0x11, 0x09, 0x40, 0x0f, 0x09, 0x03, 0x22, 0x09, 0x30, 0x22, 0x22, 0x09, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x23, 0x06, 0x43, 0x40, 0x43, 0x54, 0x63, 0x2e, 0x40, 0x06, 0x40, 0x40, 0x44, 0x0f, + 0x06, 0x1f, 0x40, 0x16, 0x11, 0x1f, 0x2e, 0x3e, 0x3e, 0x07, 0x07, 0x01, 0x08, 0x09, 0x1c, 0x07, + 0x03, 0x27, 0x29, 0x09, 0x40, 0x46, 0x4b, 0x40, 0x40, 0x40, 0x06, 0x06, 0x04, 0x0b, 0x0c, 0x0b, + 0x11, 0x19, 0x04, 0x03, 0x03, 0x1f, 0x04, 0x43, 0x03, 0x03, 0x1f, 0x1b, 0x14, 0x21, 0x04, 0x0b, + 0x0c, 0x0b, 0x11, 0x19, 0x04, 0x03, 0x03, 0x1f, 0x04, 0x43, 0x03, 0x03, 0x1f, 0x1b, 0x14, 0x21, + 0x24, 0x41, 0x3e, 0x40, 0x4e, 0x40, 0x06, 0x07, 0x06, 0x14, 0x14, 0x2e, 0x0c, 0x11, 0x44, 0x41, + 0x1e, 0x07, 0x40, 0x11, 0x44, 0x41, 0x1e, 0x07, 0x40, 0x11, 0x44, 0x41, 0x1e, 0x07, 0x40, 0x4e, + 0x07, 0x0e, 0x0e, 0x1c, 0x24, 0x1c, 0x24, 0x09, 0x17, 0x44, 0x41, 0x17, 0x44, 0x41, 0x40, 0x40, + 0x40, 0x04, 0x09, 0x09, 0x40, 0x0f, 0x09, 0x03, 0x03, 0x2e, 0x27, 0x1e, 0x07, 0x24, 0x1e, 0x1c, + 0x46, 0x16, 0x11, 0x09, 0x40, 0x0f, 0x09, 0x03, 0x23, 0x09, 0x31, 0x23, 0x23, 0x09, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x24, 0x06, 0x42, 0x40, 0x44, 0x55, 0x64, 0x2e, 0x40, 0x06, 0x40, 0x40, 0x45, 0x0f, + 0x06, 0x21, 0x40, 0x16, 0x12, 0x21, 0x30, 0x3e, 0x3e, 0x07, 0x07, 0x01, 0x06, 0x09, 0x1d, 0x07, + 0x04, 0x27, 0x2a, 0x09, 0x40, 0x46, 0x4c, 0x40, 0x40, 0x40, 0x06, 0x06, 0x05, 0x0c, 0x0d, 0x0c, + 0x12, 0x1a, 0x05, 0x04, 0x04, 0x21, 0x05, 0x42, 0x04, 0x04, 0x21, 0x1c, 0x15, 0x22, 0x05, 0x0c, + 0x0d, 0x0c, 0x12, 0x1a, 0x05, 0x04, 0x04, 0x21, 0x05, 0x42, 0x04, 0x04, 0x21, 0x1c, 0x15, 0x22, + 0x25, 0x41, 0x3e, 0x40, 0x4e, 0x40, 0x06, 0x07, 0x06, 0x15, 0x15, 0x30, 0x0d, 0x11, 0x45, 0x41, + 0x1e, 0x07, 0x40, 0x11, 0x45, 0x41, 0x1e, 0x07, 0x40, 0x11, 0x45, 0x41, 0x1e, 0x07, 0x40, 0x4e, + 0x07, 0x0e, 0x0e, 0x1d, 0x25, 0x1d, 0x25, 0x09, 0x17, 0x45, 0x41, 0x17, 0x45, 0x41, 0x40, 0x40, + 0x40, 0x03, 0x09, 0x09, 0x40, 0x0f, 0x09, 0x02, 0x02, 0x2e, 0x27, 0x1e, 0x07, 0x25, 0x1e, 0x1d, + 0x46, 0x15, 0x11, 0x09, 0x40, 0x0f, 0x09, 0x02, 0x24, 0x09, 0x32, 0x24, 0x24, 0x09, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x24, 0x06, 0x42, 0x40, 0x45, 0x56, 0x65, 0x2e, 0x40, 0x06, 0x40, 0x40, 0x46, 0x0f, + 0x06, 0x22, 0x40, 0x16, 0x13, 0x22, 0x31, 0x3e, 0x3e, 0x07, 0x07, 0x00, 0x04, 0x08, 0x1d, 0x07, + 0x04, 0x27, 0x2b, 0x08, 0x40, 0x47, 0x4d, 0x40, 0x40, 0x40, 0x06, 0x06, 0x05, 0x0c, 0x0d, 0x0c, + 0x13, 0x1b, 0x05, 0x04, 0x04, 0x22, 0x05, 0x42, 0x04, 0x04, 0x22, 0x1c, 0x15, 0x23, 0x05, 0x0c, + 0x0d, 0x0c, 0x13, 0x1b, 0x05, 0x04, 0x04, 0x22, 0x05, 0x42, 0x04, 0x04, 0x22, 0x1c, 0x15, 0x23, + 0x25, 0x41, 0x3e, 0x40, 0x4f, 0x40, 0x06, 0x07, 0x06, 0x15, 0x15, 0x31, 0x0d, 0x10, 0x46, 0x41, + 0x1e, 0x07, 0x40, 0x10, 0x46, 0x41, 0x1e, 0x07, 0x40, 0x10, 0x46, 0x41, 0x1e, 0x07, 0x40, 0x4f, + 0x07, 0x0e, 0x0e, 0x1d, 0x25, 0x1d, 0x25, 0x08, 0x17, 0x46, 0x41, 0x17, 0x46, 0x41, 0x40, 0x40, + 0x40, 0x02, 0x08, 0x08, 0x40, 0x0f, 0x08, 0x01, 0x01, 0x2e, 0x27, 0x1e, 0x07, 0x25, 0x1e, 0x1d, + 0x47, 0x13, 0x10, 0x08, 0x40, 0x0f, 0x08, 0x01, 0x24, 0x08, 0x33, 0x24, 0x24, 0x08, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x25, 0x07, 0x41, 0x40, 0x45, 0x56, 0x65, 0x2f, 0x40, 0x07, 0x40, 0x40, 0x46, 0x0f, + 0x07, 0x24, 0x40, 0x17, 0x15, 0x24, 0x33, 0x3e, 0x3e, 0x07, 0x07, 0x00, 0x03, 0x08, 0x1e, 0x07, + 0x05, 0x27, 0x2d, 0x08, 0x40, 0x47, 0x4d, 0x40, 0x40, 0x40, 0x07, 0x07, 0x06, 0x0d, 0x0e, 0x0d, + 0x15, 0x1d, 0x06, 0x05, 0x05, 0x24, 0x06, 0x41, 0x05, 0x05, 0x24, 0x1d, 0x16, 0x25, 0x06, 0x0d, + 0x0e, 0x0d, 0x15, 0x1d, 0x06, 0x05, 0x05, 0x24, 0x06, 0x41, 0x05, 0x05, 0x24, 0x1d, 0x16, 0x25, + 0x26, 0x40, 0x3e, 0x40, 0x4f, 0x40, 0x07, 0x07, 0x07, 0x16, 0x16, 0x33, 0x0e, 0x10, 0x46, 0x40, + 0x1f, 0x07, 0x40, 0x10, 0x46, 0x40, 0x1f, 0x07, 0x40, 0x10, 0x46, 0x40, 0x1f, 0x07, 0x40, 0x4f, + 0x07, 0x0f, 0x0f, 0x1e, 0x26, 0x1e, 0x26, 0x08, 0x17, 0x46, 0x40, 0x17, 0x46, 0x40, 0x40, 0x40, + 0x40, 0x02, 0x08, 0x08, 0x40, 0x0f, 0x08, 0x01, 0x01, 0x2f, 0x27, 0x1f, 0x07, 0x26, 0x1f, 0x1e, + 0x47, 0x12, 0x10, 0x08, 0x40, 0x0f, 0x08, 0x01, 0x25, 0x08, 0x35, 0x25, 0x25, 0x08, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x26, 0x07, 0x40, 0x40, 0x46, 0x57, 0x66, 0x2f, 0x40, 0x07, 0x40, 0x40, 0x47, 0x0f, + 0x07, 0x26, 0x40, 0x17, 0x16, 0x26, 0x35, 0x3e, 0x3e, 0x07, 0x07, 0x00, 0x01, 0x08, 0x1f, 0x07, + 0x06, 0x27, 0x2e, 0x08, 0x40, 0x47, 0x4e, 0x40, 0x40, 0x40, 0x07, 0x07, 0x07, 0x0e, 0x0f, 0x0e, + 0x16, 0x1e, 0x07, 0x06, 0x06, 0x26, 0x07, 0x40, 0x06, 0x06, 0x26, 0x1e, 0x17, 0x26, 0x07, 0x0e, + 0x0f, 0x0e, 0x16, 0x1e, 0x07, 0x06, 0x06, 0x26, 0x07, 0x40, 0x06, 0x06, 0x26, 0x1e, 0x17, 0x26, + 0x27, 0x40, 0x3e, 0x40, 0x4f, 0x40, 0x07, 0x07, 0x07, 0x17, 0x17, 0x35, 0x0f, 0x10, 0x47, 0x40, + 0x1f, 0x07, 0x40, 0x10, 0x47, 0x40, 0x1f, 0x07, 0x40, 0x10, 0x47, 0x40, 0x1f, 0x07, 0x40, 0x4f, + 0x07, 0x0f, 0x0f, 0x1f, 0x27, 0x1f, 0x27, 0x08, 0x17, 0x47, 0x40, 0x17, 0x47, 0x40, 0x40, 0x40, + 0x40, 0x01, 0x08, 0x08, 0x40, 0x0f, 0x08, 0x00, 0x00, 0x2f, 0x27, 0x1f, 0x07, 0x27, 0x1f, 0x1f, + 0x47, 0x11, 0x10, 0x08, 0x40, 0x0f, 0x08, 0x00, 0x26, 0x08, 0x36, 0x26, 0x26, 0x08, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x3e, 0x27, 0x07, 0x40, 0x40, 0x47, 0x57, 0x67, 0x2f, 0x40, 0x07, 0x40, 0x40, 0x47, 0x0f, + 0x07, 0x27, 0x40, 0x17, 0x17, 0x27, 0x37, 0x3e, 0x3e, 0x07, 0x07, 0x00, 0x00, 0x08, 0x1f, 0x07, + 0x07, 0x27, 0x2f, 0x08, 0x40, 0x47, 0x4f, 0x40, 0x40, 0x40, 0x07, 0x07, 0x07, 0x0f, 0x0f, 0x0f, + 0x17, 0x1f, 0x07, 0x07, 0x07, 0x27, 0x07, 0x40, 0x07, 0x07, 0x27, 0x1f, 0x17, 0x27, 0x07, 0x0f, + 0x0f, 0x0f, 0x17, 0x1f, 0x07, 0x07, 0x07, 0x27, 0x07, 0x40, 0x07, 0x07, 0x27, 0x1f, 0x17, 0x27, + 0x27, 0x40, 0x3e, 0x40, 0x4f, 0x40, 0x07, 0x07, 0x07, 0x17, 0x17, 0x37, 0x0f, 0x10, 0x47, 0x40, + 0x1f, 0x07, 0x40, 0x10, 0x47, 0x40, 0x1f, 0x07, 0x40, 0x10, 0x47, 0x40, 0x1f, 0x07, 0x40, 0x4f, + 0x07, 0x0f, 0x0f, 0x1f, 0x27, 0x1f, 0x27, 0x08, 0x17, 0x47, 0x40, 0x17, 0x47, 0x40, 0x40, 0x40, + 0x40, 0x00, 0x08, 0x08, 0x40, 0x0f, 0x08, 0x00, 0x00, 0x2f, 0x27, 0x1f, 0x07, 0x27, 0x1f, 0x1f, + 0x47, 0x10, 0x10, 0x08, 0x40, 0x0f, 0x08, 0x00, 0x27, 0x08, 0x37, 0x27, 0x27, 0x08, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static void set_ps_field(u32 *buf, struct rkvdec_ps_field field, u32 value) +{ + u8 bit = field.offset % 32, word = field.offset / 32; + u64 mask = GENMASK_ULL(bit + field.len - 1, bit); + u64 val = ((u64)value << bit) & mask; + + buf[word] &= ~mask; + buf[word] |= val; + if (bit + field.len > 32) { + buf[word + 1] &= ~(mask >> 32); + buf[word + 1] |= val >> 32; + } +} + +static void assemble_hw_pps(struct rkvdec_ctx *ctx, + struct rkvdec_hevc_run *run) +{ + struct rkvdec_hevc_ctx *hevc_ctx = ctx->priv; + const struct v4l2_ctrl_hevc_sps *sps = run->sps; + const struct v4l2_ctrl_hevc_pps *pps = run->pps; + struct rkvdec_hevc_priv_tbl *priv_tbl = hevc_ctx->priv_tbl.cpu; + struct rkvdec_sps_pps_packet *hw_ps; + u32 min_cb_log2_size_y, ctb_log2_size_y, ctb_size_y; + u32 log2_min_cu_qp_delta_size; + dma_addr_t scaling_list_address; + u32 scaling_distance; + int i; + + /* + * HW read the SPS/PPS information from PPS packet index by PPS id. + * offset from the base can be calculated by PPS_id * 80 (size per PPS + * packet unit). so the driver copy SPS/PPS information to the exact PPS + * packet unit for HW accessing. + */ + hw_ps = &priv_tbl->param_set[pps->pic_parameter_set_id]; + memset(hw_ps, 0, sizeof(*hw_ps)); + + min_cb_log2_size_y = sps->log2_min_luma_coding_block_size_minus3 + 3; + ctb_log2_size_y = min_cb_log2_size_y + + sps->log2_diff_max_min_luma_coding_block_size; + ctb_size_y = 1 << ctb_log2_size_y; + +#define WRITE_PPS(value, field) set_ps_field(hw_ps->info, field, value) + /* write sps */ + WRITE_PPS(sps->video_parameter_set_id, VIDEO_PARAMETER_SET_ID); + WRITE_PPS(sps->seq_parameter_set_id, SEQ_PARAMETER_SET_ID); + WRITE_PPS(sps->chroma_format_idc, CHROMA_FORMAT_IDC); + WRITE_PPS(sps->pic_width_in_luma_samples, PIC_WIDTH_IN_LUMA_SAMPLES); + WRITE_PPS(sps->pic_height_in_luma_samples, PIC_HEIGHT_IN_LUMA_SAMPLES); + WRITE_PPS(sps->bit_depth_luma_minus8 + 8, BIT_DEPTH_LUMA); + WRITE_PPS(sps->bit_depth_chroma_minus8 + 8, BIT_DEPTH_CHROMA); + WRITE_PPS(sps->log2_max_pic_order_cnt_lsb_minus4 + 4, + LOG2_MAX_PIC_ORDER_CNT_LSB); + WRITE_PPS(sps->log2_diff_max_min_luma_coding_block_size, + LOG2_DIFF_MAX_MIN_LUMA_CODING_BLOCK_SIZE); + WRITE_PPS(sps->log2_min_luma_coding_block_size_minus3 + 3, + LOG2_MIN_LUMA_CODING_BLOCK_SIZE); + WRITE_PPS(sps->log2_min_luma_transform_block_size_minus2 + 2, + LOG2_MIN_TRANSFORM_BLOCK_SIZE); + WRITE_PPS(sps->log2_diff_max_min_luma_transform_block_size, + LOG2_DIFF_MAX_MIN_LUMA_TRANSFORM_BLOCK_SIZE); + WRITE_PPS(sps->max_transform_hierarchy_depth_inter, + MAX_TRANSFORM_HIERARCHY_DEPTH_INTER); + WRITE_PPS(sps->max_transform_hierarchy_depth_intra, + MAX_TRANSFORM_HIERARCHY_DEPTH_INTRA); + WRITE_PPS(!!(sps->flags & V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED), + SCALING_LIST_ENABLED_FLAG); + WRITE_PPS(!!(sps->flags & V4L2_HEVC_SPS_FLAG_AMP_ENABLED), + AMP_ENABLED_FLAG); + WRITE_PPS(!!(sps->flags & V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET), + SAMPLE_ADAPTIVE_OFFSET_ENABLED_FLAG); + if (sps->flags & V4L2_HEVC_SPS_FLAG_PCM_ENABLED) { + WRITE_PPS(1, PCM_ENABLED_FLAG); + WRITE_PPS(sps->pcm_sample_bit_depth_luma_minus1 + 1, + PCM_SAMPLE_BIT_DEPTH_LUMA); + WRITE_PPS(sps->pcm_sample_bit_depth_chroma_minus1 + 1, + PCM_SAMPLE_BIT_DEPTH_CHROMA); + WRITE_PPS(!!(sps->flags & V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED), + PCM_LOOP_FILTER_DISABLED_FLAG); + WRITE_PPS(sps->log2_diff_max_min_pcm_luma_coding_block_size, + LOG2_DIFF_MAX_MIN_PCM_LUMA_CODING_BLOCK_SIZE); + WRITE_PPS(sps->log2_min_pcm_luma_coding_block_size_minus3 + 3, + LOG2_MIN_PCM_LUMA_CODING_BLOCK_SIZE); + } + WRITE_PPS(sps->num_short_term_ref_pic_sets, NUM_SHORT_TERM_REF_PIC_SETS); + WRITE_PPS(!!(sps->flags & V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT), + LONG_TERM_REF_PICS_PRESENT_FLAG); + WRITE_PPS(sps->num_long_term_ref_pics_sps, NUM_LONG_TERM_REF_PICS_SPS); + WRITE_PPS(!!(sps->flags & V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED), + SPS_TEMPORAL_MVP_ENABLED_FLAG); + WRITE_PPS(!!(sps->flags & V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED), + STRONG_INTRA_SMOOTHING_ENABLED_FLAG); + + /* write pps */ + WRITE_PPS(pps->pic_parameter_set_id, PIC_PARAMETER_SET_ID); + WRITE_PPS(sps->seq_parameter_set_id, PPS_SEQ_PARAMETER_SET_ID); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED), + DEPENDENT_SLICE_SEGMENTS_ENABLED_FLAG); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT), + OUTPUT_FLAG_PRESENT_FLAG); + WRITE_PPS(pps->num_extra_slice_header_bits, NUM_EXTRA_SLICE_HEADER_BITS); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED), + SIGN_DATA_HIDING_ENABLED_FLAG); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT), + CABAC_INIT_PRESENT_FLAG); + WRITE_PPS(pps->num_ref_idx_l0_default_active_minus1 + 1, + NUM_REF_IDX_L0_DEFAULT_ACTIVE); + WRITE_PPS(pps->num_ref_idx_l1_default_active_minus1 + 1, + NUM_REF_IDX_L1_DEFAULT_ACTIVE); + WRITE_PPS(pps->init_qp_minus26, INIT_QP_MINUS26); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED), + CONSTRAINED_INTRA_PRED_FLAG); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED), + TRANSFORM_SKIP_ENABLED_FLAG); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED), + CU_QP_DELTA_ENABLED_FLAG); + + log2_min_cu_qp_delta_size = ctb_log2_size_y - pps->diff_cu_qp_delta_depth; + WRITE_PPS(log2_min_cu_qp_delta_size, LOG2_MIN_CU_QP_DELTA_SIZE); + + WRITE_PPS(pps->pps_cb_qp_offset, PPS_CB_QP_OFFSET); + WRITE_PPS(pps->pps_cr_qp_offset, PPS_CR_QP_OFFSET); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT), + PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT_FLAG); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED), + WEIGHTED_PRED_FLAG); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED), + WEIGHTED_BIPRED_FLAG); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED), + TRANSQUANT_BYPASS_ENABLED_FLAG); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_TILES_ENABLED), + TILES_ENABLED_FLAG); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED), + ENTROPY_CODING_SYNC_ENABLED_FLAG); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED), + PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED_FLAG); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED), + LOOP_FILTER_ACROSS_TILES_ENABLED_FLAG); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED), + DEBLOCKING_FILTER_OVERRIDE_ENABLED_FLAG); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER), + PPS_DEBLOCKING_FILTER_DISABLED_FLAG); + WRITE_PPS(pps->pps_beta_offset_div2, PPS_BETA_OFFSET_DIV2); + WRITE_PPS(pps->pps_tc_offset_div2, PPS_TC_OFFSET_DIV2); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT), + LISTS_MODIFICATION_PRESENT_FLAG); + WRITE_PPS(pps->log2_parallel_merge_level_minus2 + 2, LOG2_PARALLEL_MERGE_LEVEL); + WRITE_PPS(!!(pps->flags & V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT), + SLICE_SEGMENT_HEADER_EXTENSION_PRESENT_FLAG); + WRITE_PPS(pps->num_tile_columns_minus1 + 1, NUM_TILE_COLUMNS); + WRITE_PPS(pps->num_tile_rows_minus1 + 1, NUM_TILE_ROWS); + + if (pps->flags & V4L2_HEVC_PPS_FLAG_TILES_ENABLED) { + for (i = 0; i <= pps->num_tile_columns_minus1; i++) + WRITE_PPS(pps->column_width_minus1[i], COLUMN_WIDTH(i)); + for (i = 0; i <= pps->num_tile_rows_minus1; i++) + WRITE_PPS(pps->row_height_minus1[i], ROW_HEIGHT(i)); + } else { + WRITE_PPS(((sps->pic_width_in_luma_samples + ctb_size_y - 1) / ctb_size_y) - 1, + COLUMN_WIDTH(0)); + WRITE_PPS(((sps->pic_height_in_luma_samples + ctb_size_y - 1) / ctb_size_y) - 1, + ROW_HEIGHT(0)); + } + + scaling_distance = offsetof(struct rkvdec_hevc_priv_tbl, scaling_list); + scaling_list_address = hevc_ctx->priv_tbl.dma + scaling_distance; + WRITE_PPS(scaling_list_address, SCALING_LIST_ADDRESS); +} + +static void assemble_hw_rps(struct rkvdec_ctx *ctx, + struct rkvdec_hevc_run *run) +{ + const struct v4l2_ctrl_hevc_decode_params *decode_params = run->decode_params; + const struct v4l2_ctrl_hevc_slice_params *sl_params; + const struct v4l2_hevc_dpb_entry *dpb; + struct rkvdec_hevc_ctx *hevc_ctx = ctx->priv; + struct rkvdec_hevc_priv_tbl *priv_tbl = hevc_ctx->priv_tbl.cpu; + struct rkvdec_rps_packet *hw_ps; + int i, j; + unsigned int lowdelay; + +#define WRITE_RPS(value, field) set_ps_field(hw_ps->info, field, value) + +#define REF_PIC_LONG_TERM_L0(i) PS_FIELD(i * 5, 1) +#define REF_PIC_IDX_L0(i) PS_FIELD(1 + (i * 5), 4) +#define REF_PIC_LONG_TERM_L1(i) PS_FIELD((i < 5 ? 75 : 132) + (i * 5), 1) +#define REF_PIC_IDX_L1(i) PS_FIELD((i < 4 ? 76 : 128) + (i * 5), 4) + +#define LOWDELAY PS_FIELD(182, 1) +#define LONG_TERM_RPS_BIT_OFFSET PS_FIELD(183, 10) +#define SHORT_TERM_RPS_BIT_OFFSET PS_FIELD(193, 9) +#define NUM_RPS_POC PS_FIELD(202, 4) + + for (j = 0; j < run->num_slices; j++) { + sl_params = &run->slices_params[j]; + dpb = decode_params->dpb; + lowdelay = (sl_params->slice_type == V4L2_HEVC_SLICE_TYPE_I) ? 0 : 1; + + hw_ps = &priv_tbl->rps[j]; + memset(hw_ps, 0, sizeof(*hw_ps)); + + for (i = 0; i <= sl_params->num_ref_idx_l0_active_minus1; i++) { + WRITE_RPS(!!(dpb[sl_params->ref_idx_l0[i]].flags & V4L2_HEVC_DPB_ENTRY_LONG_TERM_REFERENCE), + REF_PIC_LONG_TERM_L0(i)); + WRITE_RPS(sl_params->ref_idx_l0[i], REF_PIC_IDX_L0(i)); + + if (dpb[sl_params->ref_idx_l0[i]].pic_order_cnt_val > sl_params->slice_pic_order_cnt) + lowdelay = 0; + + } + + for (i = 0; i <= sl_params->num_ref_idx_l1_active_minus1; i++) { + WRITE_RPS(!!(dpb[sl_params->ref_idx_l1[i]].flags & V4L2_HEVC_DPB_ENTRY_LONG_TERM_REFERENCE), + REF_PIC_LONG_TERM_L1(i)); + WRITE_RPS(sl_params->ref_idx_l1[i], REF_PIC_IDX_L1(i)); + + if (dpb[sl_params->ref_idx_l1[i]].pic_order_cnt_val > sl_params->slice_pic_order_cnt) + lowdelay = 0; + } + + WRITE_RPS(lowdelay, LOWDELAY); + + WRITE_RPS(sl_params->long_term_ref_pic_set_size + + sl_params->short_term_ref_pic_set_size, + LONG_TERM_RPS_BIT_OFFSET); + WRITE_RPS(sl_params->short_term_ref_pic_set_size, + SHORT_TERM_RPS_BIT_OFFSET); + + WRITE_RPS(decode_params->num_poc_st_curr_before + + decode_params->num_poc_st_curr_after + + decode_params->num_poc_lt_curr, + NUM_RPS_POC); + } +} + +static void assemble_hw_scaling_list(struct rkvdec_ctx *ctx, + struct rkvdec_hevc_run *run) +{ + const struct v4l2_ctrl_hevc_scaling_matrix *scaling = run->scaling_matrix; + struct rkvdec_hevc_ctx *hevc_ctx = ctx->priv; + struct rkvdec_hevc_priv_tbl *tbl = hevc_ctx->priv_tbl.cpu; + u8 *dst; + scalingList_t sl; + int i, j; + + if (!memcmp((void*)&hevc_ctx->scaling_matrix_cache, scaling, + sizeof(struct v4l2_ctrl_hevc_scaling_matrix))) + return; + + memset(&sl, 0, sizeof(scalingList_t)); + + for (i = 0; i < 6; i++) { + for (j = 0; j < 16; j++) + sl.sl[0][i][j] = scaling->scaling_list_4x4[i][j]; + for (j = 0; j < 64; j++) { + sl.sl[1][i][j] = scaling->scaling_list_8x8[i][j]; + sl.sl[2][i][j] = scaling->scaling_list_16x16[i][j]; + if (i < 2) + sl.sl[3][i][j] = scaling->scaling_list_32x32[i][j]; + } + sl.sl_dc[0][i] = scaling->scaling_list_dc_coef_16x16[i]; + if (i < 2) + sl.sl_dc[1][i] = scaling->scaling_list_dc_coef_32x32[i]; + } + + dst = tbl->scaling_list; + hal_record_scaling_list((scalingFactor_t *)dst, &sl); + + memcpy((void*)&hevc_ctx->scaling_matrix_cache, scaling, + sizeof(struct v4l2_ctrl_hevc_scaling_matrix)); +} + +static struct vb2_buffer * +get_ref_buf(struct rkvdec_ctx *ctx, struct rkvdec_hevc_run *run, + unsigned int dpb_idx) +{ + struct v4l2_m2m_ctx *m2m_ctx = ctx->fh.m2m_ctx; + const struct v4l2_ctrl_hevc_decode_params *decode_params = run->decode_params; + const struct v4l2_hevc_dpb_entry *dpb = decode_params->dpb; + struct vb2_queue *cap_q = &m2m_ctx->cap_q_ctx.q; + struct vb2_buffer *vb2_buf = NULL; + + if (dpb_idx < decode_params->num_active_dpb_entries) + vb2_buf = vb2_find_buffer(cap_q, dpb[dpb_idx].timestamp); + + /* + * If a DPB entry is unused or invalid, address of current destination + * buffer is returned. + */ + if (!vb2_buf) + return &run->base.bufs.dst->vb2_buf; + + return vb2_buf; +} + +static void config_registers(struct rkvdec_ctx *ctx, + struct rkvdec_hevc_run *run) +{ + struct rkvdec_dev *rkvdec = ctx->dev; + const struct v4l2_ctrl_hevc_decode_params *decode_params = run->decode_params; + const struct v4l2_ctrl_hevc_slice_params *sl_params = &run->slices_params[0]; + const struct v4l2_hevc_dpb_entry *dpb = decode_params->dpb; + struct rkvdec_hevc_ctx *hevc_ctx = ctx->priv; + dma_addr_t priv_start_addr = hevc_ctx->priv_tbl.dma; + const struct v4l2_pix_format_mplane *dst_fmt; + struct vb2_v4l2_buffer *src_buf = run->base.bufs.src; + struct vb2_v4l2_buffer *dst_buf = run->base.bufs.dst; + const struct v4l2_format *f; + dma_addr_t rlc_addr; + dma_addr_t refer_addr; + u32 rlc_len; + u32 hor_virstride; + u32 ver_virstride; + u32 y_virstride; + u32 uv_virstride; + u32 yuv_virstride; + u32 offset; + dma_addr_t dst_addr; + u32 reg, i; + + reg = RKVDEC_MODE(RKVDEC_MODE_HEVC); + writel_relaxed(reg, rkvdec->regs + RKVDEC_REG_SYSCTRL); + + f = &ctx->decoded_fmt; + dst_fmt = &f->fmt.pix_mp; + hor_virstride = dst_fmt->plane_fmt[0].bytesperline; + ver_virstride = dst_fmt->height; + y_virstride = hor_virstride * ver_virstride; + uv_virstride = y_virstride / 2; + yuv_virstride = y_virstride + uv_virstride; + + reg = RKVDEC_Y_HOR_VIRSTRIDE(hor_virstride / 16) | + RKVDEC_UV_HOR_VIRSTRIDE(hor_virstride / 16) | + RKVDEC_SLICE_NUM_LOWBITS(run->num_slices); + writel_relaxed(reg, rkvdec->regs + RKVDEC_REG_PICPAR); + + /* config rlc base address */ + rlc_addr = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0); + writel_relaxed(rlc_addr, rkvdec->regs + RKVDEC_REG_STRM_RLC_BASE); + + rlc_len = vb2_get_plane_payload(&src_buf->vb2_buf, 0); + reg = RKVDEC_STRM_LEN(round_up(rlc_len, 16) + 64); + writel_relaxed(reg, rkvdec->regs + RKVDEC_REG_STRM_LEN); + + /* config cabac table */ + offset = offsetof(struct rkvdec_hevc_priv_tbl, cabac_table); + writel_relaxed(priv_start_addr + offset, + rkvdec->regs + RKVDEC_REG_CABACTBL_PROB_BASE); + + /* config output base address */ + dst_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0); + writel_relaxed(dst_addr, rkvdec->regs + RKVDEC_REG_DECOUT_BASE); + + reg = RKVDEC_Y_VIRSTRIDE(y_virstride / 16); + writel_relaxed(reg, rkvdec->regs + RKVDEC_REG_Y_VIRSTRIDE); + + reg = RKVDEC_YUV_VIRSTRIDE(yuv_virstride / 16); + writel_relaxed(reg, rkvdec->regs + RKVDEC_REG_YUV_VIRSTRIDE); + + /* config ref pic address */ + for (i = 0; i < 15; i++) { + struct vb2_buffer *vb_buf = get_ref_buf(ctx, run, i); + + if (i < 4 && decode_params->num_active_dpb_entries) { + reg = GENMASK(decode_params->num_active_dpb_entries - 1, 0); + reg = (reg >> (i * 4)) & 0xf; + } else + reg = 0; + + refer_addr = vb2_dma_contig_plane_dma_addr(vb_buf, 0); + writel_relaxed(refer_addr | reg, + rkvdec->regs + RKVDEC_REG_H264_BASE_REFER(i)); + + reg = RKVDEC_POC_REFER(i < decode_params->num_active_dpb_entries ? dpb[i].pic_order_cnt_val : 0); + writel_relaxed(reg, + rkvdec->regs + RKVDEC_REG_H264_POC_REFER0(i)); + } + + reg = RKVDEC_CUR_POC(sl_params->slice_pic_order_cnt); + writel_relaxed(reg, rkvdec->regs + RKVDEC_REG_CUR_POC0); + + /* config hw pps address */ + offset = offsetof(struct rkvdec_hevc_priv_tbl, param_set); + writel_relaxed(priv_start_addr + offset, + rkvdec->regs + RKVDEC_REG_PPS_BASE); + + /* config hw rps address */ + offset = offsetof(struct rkvdec_hevc_priv_tbl, rps); + writel_relaxed(priv_start_addr + offset, + rkvdec->regs + RKVDEC_REG_RPS_BASE); + + reg = RKVDEC_AXI_DDR_RDATA(0); + writel_relaxed(reg, rkvdec->regs + RKVDEC_REG_AXI_DDR_RDATA); + + reg = RKVDEC_AXI_DDR_WDATA(0); + writel_relaxed(reg, rkvdec->regs + RKVDEC_REG_AXI_DDR_WDATA); +} + +#define RKVDEC_HEVC_MAX_DEPTH_IN_BYTES 2 + +static int rkvdec_hevc_adjust_fmt(struct rkvdec_ctx *ctx, + struct v4l2_format *f) +{ + struct v4l2_pix_format_mplane *fmt = &f->fmt.pix_mp; + + fmt->num_planes = 1; + if (!fmt->plane_fmt[0].sizeimage) + fmt->plane_fmt[0].sizeimage = fmt->width * fmt->height * + RKVDEC_HEVC_MAX_DEPTH_IN_BYTES; + return 0; +} + +static int rkvdec_hevc_validate_sps(struct rkvdec_ctx *ctx, + const struct v4l2_ctrl_hevc_sps *sps) +{ + if (sps->chroma_format_idc > 1) + /* Only 4:0:0 and 4:2:0 are supported */ + return -EINVAL; + if (sps->bit_depth_luma_minus8 != sps->bit_depth_chroma_minus8) + /* Luma and chroma bit depth mismatch */ + return -EINVAL; + if (sps->bit_depth_luma_minus8 != 0 && sps->bit_depth_luma_minus8 != 2) + /* Only 8-bit and 10-bit is supported */ + return -EINVAL; + + if (sps->pic_width_in_luma_samples > ctx->coded_fmt.fmt.pix_mp.width || + sps->pic_height_in_luma_samples > ctx->coded_fmt.fmt.pix_mp.height) + return -EINVAL; + + return 0; +} + +static u32 rkvdec_hevc_valid_fmt(struct rkvdec_ctx *ctx, struct v4l2_ctrl *ctrl) +{ + const struct v4l2_ctrl_hevc_sps *sps = ctrl->p_new.p_hevc_sps; + + if (sps->bit_depth_luma_minus8 == 2) + return V4L2_PIX_FMT_NV15; + else + return V4L2_PIX_FMT_NV12; +} + +static int rkvdec_hevc_start(struct rkvdec_ctx *ctx) +{ + struct rkvdec_dev *rkvdec = ctx->dev; + struct rkvdec_hevc_priv_tbl *priv_tbl; + struct rkvdec_hevc_ctx *hevc_ctx; + struct v4l2_ctrl *ctrl; + int ret; + + ctrl = v4l2_ctrl_find(&ctx->ctrl_hdl, + V4L2_CID_STATELESS_HEVC_SPS); + if (!ctrl) + return -EINVAL; + + ret = rkvdec_hevc_validate_sps(ctx, ctrl->p_new.p_hevc_sps); + if (ret) + return ret; + + hevc_ctx = kzalloc(sizeof(*hevc_ctx), GFP_KERNEL); + if (!hevc_ctx) + return -ENOMEM; + + + priv_tbl = dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl), + &hevc_ctx->priv_tbl.dma, GFP_KERNEL); + if (!priv_tbl) { + ret = -ENOMEM; + goto err_free_ctx; + } + + hevc_ctx->priv_tbl.size = sizeof(*priv_tbl); + hevc_ctx->priv_tbl.cpu = priv_tbl; + memset(priv_tbl, 0, sizeof(*priv_tbl)); + memcpy(priv_tbl->cabac_table, rkvdec_hevc_cabac_table, + sizeof(rkvdec_hevc_cabac_table)); + + ctx->priv = hevc_ctx; + return 0; + +err_free_ctx: + kfree(hevc_ctx); + return ret; +} + +static void rkvdec_hevc_stop(struct rkvdec_ctx *ctx) +{ + struct rkvdec_hevc_ctx *hevc_ctx = ctx->priv; + struct rkvdec_dev *rkvdec = ctx->dev; + + dma_free_coherent(rkvdec->dev, hevc_ctx->priv_tbl.size, + hevc_ctx->priv_tbl.cpu, hevc_ctx->priv_tbl.dma); + kfree(hevc_ctx); +} + +static void rkvdec_hevc_run_preamble(struct rkvdec_ctx *ctx, + struct rkvdec_hevc_run *run) +{ + struct v4l2_ctrl *ctrl; + ctrl = v4l2_ctrl_find(&ctx->ctrl_hdl, + V4L2_CID_STATELESS_HEVC_DECODE_PARAMS); + run->decode_params = ctrl ? ctrl->p_cur.p : NULL; + ctrl = v4l2_ctrl_find(&ctx->ctrl_hdl, + V4L2_CID_STATELESS_HEVC_SLICE_PARAMS); + run->slices_params = ctrl ? ctrl->p_cur.p : NULL; + run->num_slices = ctrl->new_elems; + ctrl = v4l2_ctrl_find(&ctx->ctrl_hdl, + V4L2_CID_STATELESS_HEVC_SPS); + run->sps = ctrl ? ctrl->p_cur.p : NULL; + ctrl = v4l2_ctrl_find(&ctx->ctrl_hdl, + V4L2_CID_STATELESS_HEVC_PPS); + run->pps = ctrl ? ctrl->p_cur.p : NULL; + ctrl = v4l2_ctrl_find(&ctx->ctrl_hdl, + V4L2_CID_STATELESS_HEVC_SCALING_MATRIX); + run->scaling_matrix = ctrl ? ctrl->p_cur.p : NULL; + + rkvdec_run_preamble(ctx, &run->base); +} + +static int rkvdec_hevc_run(struct rkvdec_ctx *ctx) +{ + struct rkvdec_dev *rkvdec = ctx->dev; + struct rkvdec_hevc_run run; + + rkvdec_hevc_run_preamble(ctx, &run); + + assemble_hw_scaling_list(ctx, &run); + assemble_hw_pps(ctx, &run); + assemble_hw_rps(ctx, &run); + config_registers(ctx, &run); + + rkvdec_run_postamble(ctx, &run.base); + + // sw_cabac_error_e - cabac error enable + writel_relaxed(0xfdfffffd, rkvdec->regs + RKVDEC_REG_STRMD_ERR_EN); + // slice end error enable = BIT(28) + // frame end error enable = BIT(29) + writel_relaxed(0x30000000, rkvdec->regs + RKVDEC_REG_H264_ERR_E); + + schedule_delayed_work(&rkvdec->watchdog_work, msecs_to_jiffies(2000)); + + writel(1, rkvdec->regs + RKVDEC_REG_PREF_LUMA_CACHE_COMMAND); + writel(1, rkvdec->regs + RKVDEC_REG_PREF_CHR_CACHE_COMMAND); + + /* Start decoding! */ + writel(RKVDEC_INTERRUPT_DEC_E | RKVDEC_CONFIG_DEC_CLK_GATE_E | + RKVDEC_TIMEOUT_E | RKVDEC_BUF_EMPTY_E, + rkvdec->regs + RKVDEC_REG_INTERRUPT); + + return 0; +} + +static int rkvdec_hevc_try_ctrl(struct rkvdec_ctx *ctx, struct v4l2_ctrl *ctrl) +{ + if (ctrl->id == V4L2_CID_STATELESS_HEVC_SPS) + return rkvdec_hevc_validate_sps(ctx, ctrl->p_new.p_hevc_sps); + + return 0; +} + +const struct rkvdec_coded_fmt_ops rkvdec_hevc_fmt_ops = { + .adjust_fmt = rkvdec_hevc_adjust_fmt, + .start = rkvdec_hevc_start, + .stop = rkvdec_hevc_stop, + .run = rkvdec_hevc_run, + .try_ctrl = rkvdec_hevc_try_ctrl, + .valid_fmt = rkvdec_hevc_valid_fmt, +}; diff --git a/drivers/staging/media/rkvdec/rkvdec-regs.h b/drivers/staging/media/rkvdec/rkvdec-regs.h index 265f5234f4eb..4319ee3ccbbc 100644 --- a/drivers/staging/media/rkvdec/rkvdec-regs.h +++ b/drivers/staging/media/rkvdec/rkvdec-regs.h @@ -48,6 +48,7 @@ #define RKVDEC_RLC_MODE BIT(11) #define RKVDEC_STRM_START_BIT(x) (((x) & 0x7f) << 12) #define RKVDEC_MODE(x) (((x) & 0x03) << 20) +#define RKVDEC_MODE_HEVC 0 #define RKVDEC_MODE_H264 1 #define RKVDEC_MODE_VP9 2 #define RKVDEC_RPS_MODE BIT(24) diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c index f55abb7c377f..00a9bf583596 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c @@ -74,7 +74,7 @@ static int rkvdec_s_ctrl(struct v4l2_ctrl *ctrl) { struct rkvdec_ctx *ctx = container_of(ctrl->handler, struct rkvdec_ctx, ctrl_hdl); - if (ctrl->id == V4L2_CID_STATELESS_H264_SPS && !ctx->valid_fmt) { + if (!ctx->valid_fmt) { ctx->valid_fmt = rkvdec_valid_fmt(ctx, ctrl); if (ctx->valid_fmt) { struct v4l2_pix_format_mplane *pix_mp; @@ -134,6 +134,62 @@ static const struct rkvdec_ctrl_desc rkvdec_h264_ctrl_descs[] = { }, }; +static const struct rkvdec_ctrl_desc rkvdec_hevc_ctrl_descs[] = { + { + .cfg.id = V4L2_CID_STATELESS_HEVC_SLICE_PARAMS, + .cfg.flags = V4L2_CTRL_FLAG_DYNAMIC_ARRAY, + .cfg.type = V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS, + .cfg.dims = { 600 }, + }, + { + .cfg.id = V4L2_CID_STATELESS_HEVC_SPS, + .cfg.ops = &rkvdec_ctrl_ops, + }, + { + .cfg.id = V4L2_CID_STATELESS_HEVC_PPS, + }, + { + .cfg.id = V4L2_CID_STATELESS_HEVC_SCALING_MATRIX, + }, + { + .cfg.id = V4L2_CID_STATELESS_HEVC_DECODE_PARAMS, + }, + { + .cfg.id = V4L2_CID_STATELESS_HEVC_DECODE_MODE, + .cfg.min = V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED, + .cfg.max = V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED, + .cfg.def = V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED, + }, + { + .cfg.id = V4L2_CID_STATELESS_HEVC_START_CODE, + .cfg.min = V4L2_STATELESS_HEVC_START_CODE_ANNEX_B, + .cfg.def = V4L2_STATELESS_HEVC_START_CODE_ANNEX_B, + .cfg.max = V4L2_STATELESS_HEVC_START_CODE_ANNEX_B, + }, + { + .cfg.id = V4L2_CID_MPEG_VIDEO_HEVC_PROFILE, + .cfg.min = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN, + .cfg.max = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10, + .cfg.def = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN, + }, + { + .cfg.id = V4L2_CID_MPEG_VIDEO_HEVC_LEVEL, + .cfg.min = V4L2_MPEG_VIDEO_HEVC_LEVEL_1, + .cfg.max = V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1, + }, +}; + +static const struct rkvdec_ctrls rkvdec_hevc_ctrls = { + .ctrls = rkvdec_hevc_ctrl_descs, + .num_ctrls = ARRAY_SIZE(rkvdec_hevc_ctrl_descs), +}; + +static const u32 rkvdec_hevc_decoded_fmts[] = { + V4L2_PIX_FMT_NV12, + V4L2_PIX_FMT_NV15, +}; + + static const struct rkvdec_ctrls rkvdec_h264_ctrls = { .ctrls = rkvdec_h264_ctrl_descs, .num_ctrls = ARRAY_SIZE(rkvdec_h264_ctrl_descs), @@ -187,6 +243,21 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = { .decoded_fmts = rkvdec_h264_decoded_fmts, .subsystem_flags = VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF, }, + { + .fourcc = V4L2_PIX_FMT_HEVC_SLICE, + .frmsize = { + .min_width = 64, + .max_width = 4096, + .step_width = 64, + .min_height = 64, + .max_height = 2304, + .step_height = 16, + }, + .ctrls = &rkvdec_hevc_ctrls, + .ops = &rkvdec_hevc_fmt_ops, + .num_decoded_fmts = ARRAY_SIZE(rkvdec_hevc_decoded_fmts), + .decoded_fmts = rkvdec_hevc_decoded_fmts, + }, { .fourcc = V4L2_PIX_FMT_VP9_FRAME, .frmsize = { diff --git a/drivers/staging/media/rkvdec/rkvdec.h b/drivers/staging/media/rkvdec/rkvdec.h index f02f79c405f0..d6222a2588be 100644 --- a/drivers/staging/media/rkvdec/rkvdec.h +++ b/drivers/staging/media/rkvdec/rkvdec.h @@ -133,6 +133,7 @@ void rkvdec_run_preamble(struct rkvdec_ctx *ctx, struct rkvdec_run *run); void rkvdec_run_postamble(struct rkvdec_ctx *ctx, struct rkvdec_run *run); extern const struct rkvdec_coded_fmt_ops rkvdec_h264_fmt_ops; +extern const struct rkvdec_coded_fmt_ops rkvdec_hevc_fmt_ops; extern const struct rkvdec_coded_fmt_ops rkvdec_vp9_fmt_ops; #endif /* RKVDEC_H_ */ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Sat, 30 Jan 2021 18:16:39 +0100 Subject: [PATCH] media: rkvdec: add variants support rkvdec IP has different versions which among others differ in the supported decoding formats. This adds an variant implementation in order support other than the currently supported RK3399 version. Note: Since matching of supported codecs is index-based the available codec options have been reordered here: from supported by all versions to not commonly supported. This seems the better soultion than duplicatiing code for every newly added IP. Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/staging/media/rkvdec/rkvdec.c | 105 ++++++++++++++++++-------- drivers/staging/media/rkvdec/rkvdec.h | 10 +++ 2 files changed, 85 insertions(+), 30 deletions(-) diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c index 00a9bf583596..955c53afe20f 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c @@ -14,6 +14,7 @@ #include <linux/interrupt.h> #include <linux/module.h> #include <linux/of.h> +#include <linux/of_device.h> #include <linux/platform_device.h> #include <linux/pm.h> #include <linux/pm_runtime.h> @@ -227,6 +228,22 @@ static const u32 rkvdec_vp9_decoded_fmts[] = { }; static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = { + { + .fourcc = V4L2_PIX_FMT_HEVC_SLICE, + .frmsize = { + .min_width = 64, + .max_width = 4096, + .step_width = 64, + .min_height = 64, + .max_height = 2304, + .step_height = 16, + }, + .ctrls = &rkvdec_hevc_ctrls, + .ops = &rkvdec_hevc_fmt_ops, + .num_decoded_fmts = ARRAY_SIZE(rkvdec_hevc_decoded_fmts), + .decoded_fmts = rkvdec_hevc_decoded_fmts, + .capability = RKVDEC_CAPABILITY_HEVC, + }, { .fourcc = V4L2_PIX_FMT_H264_SLICE, .frmsize = { @@ -242,21 +259,7 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = { .num_decoded_fmts = ARRAY_SIZE(rkvdec_h264_decoded_fmts), .decoded_fmts = rkvdec_h264_decoded_fmts, .subsystem_flags = VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF, - }, - { - .fourcc = V4L2_PIX_FMT_HEVC_SLICE, - .frmsize = { - .min_width = 64, - .max_width = 4096, - .step_width = 64, - .min_height = 64, - .max_height = 2304, - .step_height = 16, - }, - .ctrls = &rkvdec_hevc_ctrls, - .ops = &rkvdec_hevc_fmt_ops, - .num_decoded_fmts = ARRAY_SIZE(rkvdec_hevc_decoded_fmts), - .decoded_fmts = rkvdec_hevc_decoded_fmts, + .capability = RKVDEC_CAPABILITY_H264, }, { .fourcc = V4L2_PIX_FMT_VP9_FRAME, @@ -272,16 +275,31 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = { .ops = &rkvdec_vp9_fmt_ops, .num_decoded_fmts = ARRAY_SIZE(rkvdec_vp9_decoded_fmts), .decoded_fmts = rkvdec_vp9_decoded_fmts, - } + .capability = RKVDEC_CAPABILITY_VP9, + }, }; static const struct rkvdec_coded_fmt_desc * -rkvdec_find_coded_fmt_desc(u32 fourcc) +rkvdec_default_coded_fmt_desc(unsigned int capabilities) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(rkvdec_coded_fmts); i++) { + if (rkvdec_coded_fmts[i].capability & capabilities) + return &rkvdec_coded_fmts[i]; + } + + return NULL; +} + +static const struct rkvdec_coded_fmt_desc * +rkvdec_find_coded_fmt_desc(u32 fourcc, unsigned int capabilities) { unsigned int i; for (i = 0; i < ARRAY_SIZE(rkvdec_coded_fmts); i++) { - if (rkvdec_coded_fmts[i].fourcc == fourcc) + if (rkvdec_coded_fmts[i].fourcc == fourcc && + (rkvdec_coded_fmts[i].capability & capabilities)) return &rkvdec_coded_fmts[i]; } @@ -304,7 +322,7 @@ static void rkvdec_reset_coded_fmt(struct rkvdec_ctx *ctx) { struct v4l2_format *f = &ctx->coded_fmt; - ctx->coded_fmt_desc = &rkvdec_coded_fmts[0]; + ctx->coded_fmt_desc = rkvdec_default_coded_fmt_desc(ctx->dev->capabilities); rkvdec_reset_fmt(ctx, f, ctx->coded_fmt_desc->fourcc); f->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; @@ -331,11 +349,13 @@ static int rkvdec_enum_framesizes(struct file *file, void *priv, struct v4l2_frmsizeenum *fsize) { const struct rkvdec_coded_fmt_desc *fmt; + struct rkvdec_dev *rkvdec = video_drvdata(file); if (fsize->index != 0) return -EINVAL; - fmt = rkvdec_find_coded_fmt_desc(fsize->pixel_format); + fmt = rkvdec_find_coded_fmt_desc(fsize->pixel_format, + rkvdec->capabilities); if (!fmt) return -EINVAL; @@ -406,10 +426,11 @@ static int rkvdec_try_output_fmt(struct file *file, void *priv, struct rkvdec_ctx *ctx = fh_to_rkvdec_ctx(priv); const struct rkvdec_coded_fmt_desc *desc; - desc = rkvdec_find_coded_fmt_desc(pix_mp->pixelformat); + desc = rkvdec_find_coded_fmt_desc(pix_mp->pixelformat, + ctx->dev->capabilities); if (!desc) { - pix_mp->pixelformat = rkvdec_coded_fmts[0].fourcc; - desc = &rkvdec_coded_fmts[0]; + desc = rkvdec_default_coded_fmt_desc(ctx->dev->capabilities); + pix_mp->pixelformat = desc->fourcc; } v4l2_apply_frmsize_constraints(&pix_mp->width, @@ -487,7 +508,8 @@ static int rkvdec_s_output_fmt(struct file *file, void *priv, if (ret) return ret; - desc = rkvdec_find_coded_fmt_desc(f->fmt.pix_mp.pixelformat); + desc = rkvdec_find_coded_fmt_desc(f->fmt.pix_mp.pixelformat, + ctx->dev->capabilities); if (!desc) return -EINVAL; ctx->coded_fmt_desc = desc; @@ -538,7 +560,10 @@ static int rkvdec_g_capture_fmt(struct file *file, void *priv, static int rkvdec_enum_output_fmt(struct file *file, void *priv, struct v4l2_fmtdesc *f) { - if (f->index >= ARRAY_SIZE(rkvdec_coded_fmts)) + struct rkvdec_ctx *ctx = fh_to_rkvdec_ctx(priv); + + if (f->index >= ARRAY_SIZE(rkvdec_coded_fmts) || + !(ctx->dev->capabilities & rkvdec_coded_fmts[f->index].capability)) return -EINVAL; f->pixelformat = rkvdec_coded_fmts[f->index].fourcc; @@ -946,14 +971,17 @@ static int rkvdec_init_ctrls(struct rkvdec_ctx *ctx) int ret; for (i = 0; i < ARRAY_SIZE(rkvdec_coded_fmts); i++) - nctrls += rkvdec_coded_fmts[i].ctrls->num_ctrls; + if (rkvdec_coded_fmts[i].capability & ctx->dev->capabilities) + nctrls += rkvdec_coded_fmts[i].ctrls->num_ctrls; v4l2_ctrl_handler_init(&ctx->ctrl_hdl, nctrls); for (i = 0; i < ARRAY_SIZE(rkvdec_coded_fmts); i++) { - ret = rkvdec_add_ctrls(ctx, rkvdec_coded_fmts[i].ctrls); - if (ret) - goto err_free_handler; + if (rkvdec_coded_fmts[i].capability & ctx->dev->capabilities) { + ret = rkvdec_add_ctrls(ctx, rkvdec_coded_fmts[i].ctrls); + if (ret) + goto err_free_handler; + } } ret = v4l2_ctrl_handler_setup(&ctx->ctrl_hdl); @@ -1155,8 +1183,17 @@ static void rkvdec_watchdog_func(struct work_struct *work) } } +static const struct rkvdec_variant rk3399_rkvdec_variant = { + .capabilities = RKVDEC_CAPABILITY_H264 | + RKVDEC_CAPABILITY_HEVC | + RKVDEC_CAPABILITY_VP9 +}; + static const struct of_device_id of_rkvdec_match[] = { - { .compatible = "rockchip,rk3399-vdec" }, + { + .compatible = "rockchip,rk3399-vdec", + .data = &rk3399_rkvdec_variant, + }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, of_rkvdec_match); @@ -1168,6 +1205,7 @@ static const char * const rkvdec_clk_names[] = { static int rkvdec_probe(struct platform_device *pdev) { struct rkvdec_dev *rkvdec; + const struct rkvdec_variant *variant; unsigned int i; int ret, irq; @@ -1193,6 +1231,13 @@ static int rkvdec_probe(struct platform_device *pdev) if (ret) return ret; + variant = of_device_get_match_data(rkvdec->dev); + if (!variant) + return -EINVAL; + + rkvdec->capabilities = variant->capabilities; + + rkvdec->regs = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(rkvdec->regs)) return PTR_ERR(rkvdec->regs); diff --git a/drivers/staging/media/rkvdec/rkvdec.h b/drivers/staging/media/rkvdec/rkvdec.h index d6222a2588be..ad8e83884121 100644 --- a/drivers/staging/media/rkvdec/rkvdec.h +++ b/drivers/staging/media/rkvdec/rkvdec.h @@ -29,6 +29,10 @@ #define RKVDEC_RESET_DELAY 5 +#define RKVDEC_CAPABILITY_H264 BIT(0) +#define RKVDEC_CAPABILITY_HEVC BIT(1) +#define RKVDEC_CAPABILITY_VP9 BIT(2) + struct rkvdec_ctx; struct rkvdec_ctrl_desc { @@ -70,6 +74,10 @@ vb2_to_rkvdec_decoded_buf(struct vb2_buffer *buf) base.vb.vb2_buf); } +struct rkvdec_variant { + unsigned int capabilities; +}; + struct rkvdec_coded_fmt_ops { int (*adjust_fmt)(struct rkvdec_ctx *ctx, struct v4l2_format *f); @@ -91,6 +99,7 @@ struct rkvdec_coded_fmt_desc { unsigned int num_decoded_fmts; const u32 *decoded_fmts; u32 subsystem_flags; + unsigned int capability; }; struct rkvdec_dev { @@ -105,6 +114,7 @@ struct rkvdec_dev { struct delayed_work watchdog_work; struct reset_control *rstc; u8 reset_mask; + unsigned int capabilities; }; struct rkvdec_ctx { From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Sat, 30 Jan 2021 18:21:59 +0100 Subject: [PATCH] media: rkvdec: add RK3288 variant This adds RK3288 variant to rkvdec driver. In this earlier version of the IP only HEVC decoding is supported. Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/staging/media/rkvdec/rkvdec.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c index 955c53afe20f..4e228cd82f21 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c @@ -1189,11 +1189,19 @@ static const struct rkvdec_variant rk3399_rkvdec_variant = { RKVDEC_CAPABILITY_VP9 }; +static const struct rkvdec_variant rk3288_hevc_variant = { + .capabilities = RKVDEC_CAPABILITY_HEVC +}; + static const struct of_device_id of_rkvdec_match[] = { { .compatible = "rockchip,rk3399-vdec", .data = &rk3399_rkvdec_variant, }, + { + .compatible = "rockchip,rk3288-hevc", + .data = &rk3288_hevc_variant, + }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, of_rkvdec_match); From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Sat, 30 Jan 2021 18:27:30 +0100 Subject: [PATCH] ARM: dts: RK3288: add hevc node Signed-off-by: Alex Bee <knaerzche@gmail.com> --- arch/arm/boot/dts/rk3288.dtsi | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi index 7b2cde230b87..59fba3ac6aae 100644 --- a/arch/arm/boot/dts/rk3288.dtsi +++ b/arch/arm/boot/dts/rk3288.dtsi @@ -1248,6 +1248,25 @@ vpu_mmu: iommu@ff9a0800 { power-domains = <&power RK3288_PD_VIDEO>; }; + hevc: hevc@ff9c0000 { + compatible = "rockchip,rk3288-hevc"; + reg = <0x0 0xff9c0000 0x0 0x400>; + interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "irq_dec"; + clocks = <&cru ACLK_HEVC>, <&cru HCLK_HEVC>, <&cru SCLK_HEVC_CABAC>, + <&cru SCLK_HEVC_CORE>; + clock-names = "axi", "ahb", "cabac", "core"; + assigned-clocks = <&cru ACLK_HEVC>, <&cru HCLK_HEVC>, + <&cru SCLK_HEVC_CORE>, + <&cru SCLK_HEVC_CABAC>; + assigned-clock-rates = <400000000>, <100000000>, + <300000000>, <300000000>; + iommus = <&hevc_mmu>; + power-domains = <&power RK3288_PD_HEVC>; + resets = <&cru SRST_HEVC>; + reset-names = "video_core"; + }; + hevc_mmu: iommu@ff9c0440 { compatible = "rockchip,iommu"; reg = <0x0 0xff9c0440 0x0 0x40>, <0x0 0xff9c0480 0x0 0x40>; @@ -1255,7 +1274,7 @@ hevc_mmu: iommu@ff9c0440 { clocks = <&cru ACLK_HEVC>, <&cru HCLK_HEVC>; clock-names = "aclk", "iface"; #iommu-cells = <0>; - status = "disabled"; + power-domains = <&power RK3288_PD_HEVC>; }; gpu: gpu@ffa30000 { From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne <nicolas.dufresne@collabora.com> Date: Tue, 10 May 2022 14:37:29 -0400 Subject: [PATCH] media: rkvdec: Fix HEVC RPS bit offsets The offsets from the uAPI need to be extended to include some bits that can be calculated from the parameters. This has been compared to match with the vendor bit sizes (which simply parse again the data to calcualte it). Fixed by this change: - LTRPSPS_A_Qualcomm_1 - RPS_C_ericsson_5 - RPS_D_ericsson_6 - RPS_E_qualcomm_5 Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> --- drivers/staging/media/rkvdec/rkvdec-hevc.c | 26 +++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/drivers/staging/media/rkvdec/rkvdec-hevc.c b/drivers/staging/media/rkvdec/rkvdec-hevc.c index 7a375a23eaf1..580073d49b6a 100644 --- a/drivers/staging/media/rkvdec/rkvdec-hevc.c +++ b/drivers/staging/media/rkvdec/rkvdec-hevc.c @@ -10,6 +10,7 @@ */ #include <media/v4l2-mem2mem.h> +#include <linux/bitops.h> #include "rkvdec.h" #include "rkvdec-regs.h" @@ -2175,6 +2176,7 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, struct rkvdec_hevc_run *run) { const struct v4l2_ctrl_hevc_decode_params *decode_params = run->decode_params; + const struct v4l2_ctrl_hevc_sps *sps = run->sps; const struct v4l2_ctrl_hevc_slice_params *sl_params; const struct v4l2_hevc_dpb_entry *dpb; struct rkvdec_hevc_ctx *hevc_ctx = ctx->priv; @@ -2196,9 +2198,21 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, #define NUM_RPS_POC PS_FIELD(202, 4) for (j = 0; j < run->num_slices; j++) { + uint st_bit_offset = 0; + sl_params = &run->slices_params[j]; dpb = decode_params->dpb; - lowdelay = (sl_params->slice_type == V4L2_HEVC_SLICE_TYPE_I) ? 0 : 1; + + if (sl_params->slice_type != V4L2_HEVC_SLICE_TYPE_I) { + num_l0_refs = sl_params->num_ref_idx_l0_active_minus1 + 1; + + if (sl_params->slice_type == V4L2_HEVC_SLICE_TYPE_B) + num_l1_refs = sl_params->num_ref_idx_l1_active_minus1 + 1; + + lowdelay = 1; + } else { + lowdelay = 0; + } hw_ps = &priv_tbl->rps[j]; memset(hw_ps, 0, sizeof(*hw_ps)); @@ -2224,8 +2238,14 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, WRITE_RPS(lowdelay, LOWDELAY); - WRITE_RPS(sl_params->long_term_ref_pic_set_size + - sl_params->short_term_ref_pic_set_size, + if (!(decode_params->flags & V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC)) { + if (sl_params->short_term_ref_pic_set_size) + st_bit_offset = sl_params->short_term_ref_pic_set_size; + else if (sps->num_short_term_ref_pic_sets > 1) + st_bit_offset = fls(sps->num_short_term_ref_pic_sets - 1); + } + + WRITE_RPS(st_bit_offset + sl_params->long_term_ref_pic_set_size, LONG_TERM_RPS_BIT_OFFSET); WRITE_RPS(sl_params->short_term_ref_pic_set_size, SHORT_TERM_RPS_BIT_OFFSET); From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne <nicolas.dufresne@collabora.com> Date: Tue, 10 May 2022 15:12:03 -0400 Subject: [PATCH] media: rkvdec: Fix number of HEVC references being set in RPS The numbers from the bitstream are values between 1 - 16 (as they are the number - 1). The difference between 0 and 1 needs to be determined base on the slice type. I frames have no reference, P frames only have L0 reference, and B frames have both. Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> --- drivers/staging/media/rkvdec/rkvdec-hevc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/staging/media/rkvdec/rkvdec-hevc.c b/drivers/staging/media/rkvdec/rkvdec-hevc.c index 580073d49b6a..ce15028918b2 100644 --- a/drivers/staging/media/rkvdec/rkvdec-hevc.c +++ b/drivers/staging/media/rkvdec/rkvdec-hevc.c @@ -2199,6 +2199,8 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, for (j = 0; j < run->num_slices; j++) { uint st_bit_offset = 0; + uint num_l0_refs = 0; + uint num_l1_refs = 0; sl_params = &run->slices_params[j]; dpb = decode_params->dpb; @@ -2217,7 +2219,7 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, hw_ps = &priv_tbl->rps[j]; memset(hw_ps, 0, sizeof(*hw_ps)); - for (i = 0; i <= sl_params->num_ref_idx_l0_active_minus1; i++) { + for (i = 0; i < num_l0_refs; i++) { WRITE_RPS(!!(dpb[sl_params->ref_idx_l0[i]].flags & V4L2_HEVC_DPB_ENTRY_LONG_TERM_REFERENCE), REF_PIC_LONG_TERM_L0(i)); WRITE_RPS(sl_params->ref_idx_l0[i], REF_PIC_IDX_L0(i)); @@ -2227,7 +2229,7 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, } - for (i = 0; i <= sl_params->num_ref_idx_l1_active_minus1; i++) { + for (i = 0; i < num_l1_refs; i++) { WRITE_RPS(!!(dpb[sl_params->ref_idx_l1[i]].flags & V4L2_HEVC_DPB_ENTRY_LONG_TERM_REFERENCE), REF_PIC_LONG_TERM_L1(i)); WRITE_RPS(sl_params->ref_idx_l1[i], REF_PIC_IDX_L1(i)); ================================================ FILE: projects/Rockchip/patches/linux/default/linux-2001-v4l2-wip-iep-driver.patch ================================================ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Sun, 11 Oct 2020 17:03:12 +0200 Subject: [PATCH] dt-bindings: media: Add Rockchip IEP binding Signed-off-by: Alex Bee <knaerzche@gmail.com> --- .../bindings/media/rockchip-iep.yaml | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 Documentation/devicetree/bindings/media/rockchip-iep.yaml diff --git a/Documentation/devicetree/bindings/media/rockchip-iep.yaml b/Documentation/devicetree/bindings/media/rockchip-iep.yaml new file mode 100644 index 000000000000..a9efcda13fc1 --- /dev/null +++ b/Documentation/devicetree/bindings/media/rockchip-iep.yaml @@ -0,0 +1,73 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/media/rockchip-iep.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Rockchip Image Enhancement Processor (IEP) + +description: + Rockchip IEP supports various image enhancement operations for YUV and RGB domains. + Deinterlacing, spatial and temporal sampling noise reduction are supported by the + YUV block. Gamma adjustment, edge enhancement, detail enhancement are supported in + the RGB block. Brightness, Saturation, Contrast, Hue adjustment is supported for + both domains. Furthermore it supports converting RGB to YUV / YUV to RGB. + +maintainers: + - Heiko Stuebner <heiko@sntech.de> + +properties: + compatible: + oneOf: + - const: rockchip,rk3228-iep + - items: + - enum: + - rockchip,rk3288-iep + - rockchip,rk3328-iep + - rockchip,rk3368-iep + - rockchip,rk3399-iep + - const: rockchip,rk3228-iep + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + clocks: + maxItems: 2 + + clock-names: + items: + - const: axi + - const: ahb + + power-domains: + maxItems: 1 + + iommus: + maxItems: 1 + +required: + - compatible + - reg + - interrupts + - clocks + - clock-names + +additionalProperties: false + +examples: + - | + #include <dt-bindings/clock/rk3228-cru.h> + #include <dt-bindings/interrupt-controller/arm-gic.h> + #include <dt-bindings/power/rk3228-power.h> + iep: iep@20070000 { + compatible = "rockchip,rk3228-iep"; + reg = <0x20070000 0x800>; + interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru ACLK_IEP>, <&cru HCLK_IEP>; + clock-names = "axi", "ahb"; + iommus = <&iep_mmu>; + power-domains = <&power RK3228_PD_VIO>; + }; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Sun, 11 Oct 2020 21:24:10 +0200 Subject: [PATCH] media: rockchip: Add Rockchip IEP driver Signed-off-by: Alex Bee <knaerzche@gmail.com> --- drivers/media/platform/rockchip/Kconfig | 1 + drivers/media/platform/rockchip/Makefile | 1 + drivers/media/platform/rockchip/iep/Kconfig | 16 + drivers/media/platform/rockchip/iep/Makefile | 5 + .../media/platform/rockchip/iep/iep-regs.h | 291 +++++ drivers/media/platform/rockchip/iep/iep.c | 1089 +++++++++++++++++ drivers/media/platform/rockchip/iep/iep.h | 112 ++ 7 files changed, 1515 insertions(+) create mode 100644 drivers/media/platform/rockchip/iep/Kconfig create mode 100644 drivers/media/platform/rockchip/iep/Makefile create mode 100644 drivers/media/platform/rockchip/iep/iep-regs.h create mode 100644 drivers/media/platform/rockchip/iep/iep.c create mode 100644 drivers/media/platform/rockchip/iep/iep.h diff --git a/drivers/media/platform/rockchip/Kconfig b/drivers/media/platform/rockchip/Kconfig index b41d3960c1b4..9ff362805ded 100644 --- a/drivers/media/platform/rockchip/Kconfig +++ b/drivers/media/platform/rockchip/Kconfig @@ -2,5 +2,6 @@ comment "Rockchip media platform drivers" +source "drivers/media/platform/rockchip/iep/Kconfig" source "drivers/media/platform/rockchip/rga/Kconfig" source "drivers/media/platform/rockchip/rkisp1/Kconfig" diff --git a/drivers/media/platform/rockchip/Makefile b/drivers/media/platform/rockchip/Makefile index 4f782b876ac9..c075ecc2fa14 100644 --- a/drivers/media/platform/rockchip/Makefile +++ b/drivers/media/platform/rockchip/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0-only +obj-y += iep/ obj-y += rga/ obj-y += rkisp1/ diff --git a/drivers/media/platform/rockchip/iep/Kconfig b/drivers/media/platform/rockchip/iep/Kconfig new file mode 100644 index 000000000000..d95155a95133 --- /dev/null +++ b/drivers/media/platform/rockchip/iep/Kconfig @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: GPL-2.0-only + +config VIDEO_ROCKCHIP_IEP + tristate "Rockchip Image Enhancement Processor" + depends on V4L_MEM2MEM_DRIVERS + depends on VIDEO_DEV + depends on ARCH_ROCKCHIP || COMPILE_TEST + select VIDEOBUF2_DMA_CONTIG + select V4L2_MEM2MEM_DEV + help + This is a v4l2 driver for Rockchip Image Enhancement Processor (IEP) + found in most Rockchip RK3xxx SoCs. + Rockchip IEP supports various enhancement operations for RGB and YUV + images. The driver currently implements YUV deinterlacing only. + To compile this driver as a module, choose M here: the module + will be called rockchip-iep diff --git a/drivers/media/platform/rockchip/iep/Makefile b/drivers/media/platform/rockchip/iep/Makefile new file mode 100644 index 000000000000..5c89b3277469 --- /dev/null +++ b/drivers/media/platform/rockchip/iep/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0-only + +rockchip-iep-objs := iep.o + +obj-$(CONFIG_VIDEO_ROCKCHIP_IEP) += rockchip-iep.o diff --git a/drivers/media/platform/rockchip/iep/iep-regs.h b/drivers/media/platform/rockchip/iep/iep-regs.h new file mode 100644 index 000000000000..a68685ef3604 --- /dev/null +++ b/drivers/media/platform/rockchip/iep/iep-regs.h @@ -0,0 +1,291 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Rockchip Image Enhancement Processor (IEP) driver + * + * Copyright (C) 2020 Alex Bee <knaerzche@gmail.com> + * + */ + +#ifndef __IEP_REGS_H__ +#define __IEP_REGS_H__ + +/* IEP Registers addresses */ +#define IEP_CONFIG0 0x000 /* Configuration register0 */ +#define IEP_VOP_DIRECT_PATH BIT(0) +#define IEP_DEIN_HIGH_FREQ_SHFT 1 +#define IEP_DEIN_HIGH_FREQ_MASK (0x7f << IEP_DEIN_HIGH_FREQ_SHFT) +#define IEP_DEIN_MODE_SHFT 8 +#define IEP_DEIN_MODE_MASK (7 << IEP_DEIN_MODE_SHFT) +#define IEP_DEIN_HIGH_FREQ_EN BIT(11) +#define IEP_DEIN_EDGE_INTPOL_EN BIT(12) +#define IEP_YUV_DENOISE_EN BIT(13) +#define IEP_YUV_ENHNC_EN BIT(14) +#define IEP_DEIN_EDGE_INTPOL_SMTH_EN BIT(15) +#define IEP_RGB_CLR_ENHNC_EN BIT(16) +#define IEP_RGB_CNTRST_ENHNC_EN BIT(17) +#define IEP_RGB_ENHNC_MODE_BYPASS (0 << 18) +#define IEP_RGB_ENHNC_MODE_DNS BIT(18) +#define IEP_RGB_ENHNC_MODE_DTL (2 << 18) +#define IEP_RGB_ENHNC_MODE_EDG (3 << 18) +#define IEP_RGB_ENHNC_MODE_MASK (3 << 18) +#define IEP_RGB_CNTRST_ENHNC_DDE_FRST BIT(20) +#define IEP_DEIN_EDGE_INTPOL_RADIUS_SHFT 21 +#define IEP_DEIN_EDGE_INTPOL_RADIUS_MASK (3 << IEP_DEIN_EDGE_INTPOL_RADIUS_SHFT) +#define IEP_DEIN_EDGE_INTPOL_SELECT BIT(23) + +#define IEP_CONFIG1 0x004 /* Configuration register1 */ +#define IEP_SRC_FMT_SHFT 0 +#define IEP_SRC_FMT_MASK (3 << IEP_SRC_FMT_SHFT) +#define IEP_SRC_RGB_SWP_SHFT 2 +#define IEP_SRC_RGB_SWP_MASK (2 << IEP_SRC_RGB_SWP_SHFT) +#define IEP_SRC_YUV_SWP_SHFT 4 +#define IEP_SRC_YUV_SWP_MASK (3 << IEP_SRC_YUV_SWP_SHFT) +#define IEP_DST_FMT_SHFT 8 +#define IEP_DST_FMT_MASK (3 << IEP_DST_FMT_SHFT) +#define IEP_DST_RGB_SWP_SHFT 10 +#define IEP_DST_RGB_SWP_MASK (2 << IEP_DST_RGB_SWP_SHFT) +#define IEP_DST_YUV_SWP_SHFT 12 +#define IEP_DST_YUV_SWP_MASK (3 << IEP_DST_YUV_SWP_SHFT) +#define IEP_DTH_UP_EN BIT(14) +#define IEP_DTH_DWN_EN BIT(15) +#define IEP_YUV2RGB_COE_BT601_1 (0 << 16) +#define IEP_YUV2RGB_COE_BT601_F BIT(16) +#define IEP_YUV2RGB_COE_BT709_1 (2 << 16) +#define IEP_YUV2RGB_COE_BT709_F (3 << 16) +#define IEP_YUV2RGB_COE_MASK (3 << 16) +#define IEP_RGB2YUV_COE_BT601_1 (0 << 18) +#define IEP_RGB2YUV_COE_BT601_F BIT(18) +#define IEP_RGB2YUV_COE_BT709_1 (2 << 18) +#define IEP_RGB2YUV_COE_BT709_F (3 << 18) +#define IEP_RGB2YUV_COE_MASK (3 << 18) +#define IEP_YUV2RGB_EN BIT(20) +#define IEP_RGB2YUV_EN BIT(21) +#define IEP_YUV2RGB_CLIP_EN BIT(22) +#define IEP_RGB2YUV_CLIP_EN BIT(23) +#define IEP_GLB_ALPHA_SHFT 24 +#define IEP_GLB_ALPHA_MASK (0x7f << IEP_GLB_ALPHA_SHFT) + +#define IEP_STATUS 0x008 /* Status register */ +#define IEP_STATUS_YUV_DNS BIT(0) +#define IEP_STATUS_SCL BIT(1) +#define IEP_STATUS_DIL BIT(2) +#define IEP_STATUS_DDE BIT(3) +#define IEP_STATUS_DMA_WR_YUV BIT(4) +#define IEP_STATUS_DMA_RE_YUV BIT(5) +#define IEP_STATUS_DMA_WR_RGB BIT(6) +#define IEP_STATUS_DMA_RE_RGB BIT(7) +#define IEP_STATUS_VOP_DIRECT_PATH BIT(8) +#define IEP_STATUS_DMA_IA_WR_YUV BIT(16) +#define IEP_STATUS_DMA_IA_RE_YUV BIT(17) +#define IEP_STATUS_DMA_IA_WR_RGB BIT(18) +#define IEP_STATUS_DMA_IA_RE_RGB BIT(19) + +#define IEP_INT 0x00c /* Interrupt register*/ +#define IEP_INT_FRAME_DONE BIT(0) /* Frame process done interrupt */ +#define IEP_INT_FRAME_DONE_EN BIT(8) /* Frame process done interrupt enable */ +#define IEP_INT_FRAME_DONE_CLR BIT(16) /* Frame process done interrupt clear */ + +#define IEP_FRM_START 0x010 /* Frame start */ +#define IEP_SRST 0x014 /* Soft reset */ +#define IEP_CONFIG_DONE 0x018 /* Configuration done */ +#define IEP_FRM_CNT 0x01c /* Frame counter */ + +#define IEP_VIR_IMG_WIDTH 0x020 /* Image virtual width */ +#define IEP_IMG_SCL_FCT 0x024 /* Scaling factor */ +#define IEP_SRC_IMG_SIZE 0x028 /* src image width/height */ +#define IEP_DST_IMG_SIZE 0x02c /* dst image width/height */ +#define IEP_DST_IMG_WIDTH_TILE0 0x030 /* dst image tile0 width */ +#define IEP_DST_IMG_WIDTH_TILE1 0x034 /* dst image tile1 width */ +#define IEP_DST_IMG_WIDTH_TILE2 0x038 /* dst image tile2 width */ +#define IEP_DST_IMG_WIDTH_TILE3 0x03c /* dst image tile3 width */ + +#define IEP_ENH_YUV_CNFG_0 0x040 /* Brightness, contrast, saturation adjustment */ +#define IEP_YUV_BRIGHTNESS_SHFT 0 +#define IEP_YUV_BRIGHTNESS_MASK (0x3f << IEP_YUV_BRIGHTNESS_SHFT) +#define IEP_YUV_CONTRAST_SHFT 8 +#define IEP_YUV_CONTRAST_MASK (0xff << IEP_YUV_CONTRAST_SHFT) +#define IEP_YUV_SATURATION_SHFT 16 +#define IEP_YUV_SATURATION_MASK (0x1ff << IEP_YUV_SATURATION_SHFT) + +#define IEP_ENH_YUV_CNFG_1 0x044 /* Hue configuration */ +#define IEP_YUV_COS_HUE_SHFT 0 +#define IEP_YUV_COS_HUE_MASK (0xff << IEP_YUV_COS_HUE_SHFT) +#define IEP_YUV_SIN_HUE_SHFT 8 +#define IEP_YUV_SIN_HUE_MASK (0xff << IEP_YUV_SIN_HUE_SHFT) + +#define IEP_ENH_YUV_CNFG_2 0x048 /* Color bar configuration */ +#define IEP_YUV_COLOR_BAR_Y_SHFT 0 +#define IEP_YUV_COLOR_BAR_Y_MASK (0xff << IEP_YUV_COLOR_BAR_Y_SHFT) +#define IEP_YUV_COLOR_BAR_U_SHFT 8 +#define IEP_YUV_COLOR_BAR_U_MASK (0xff << IEP_YUV_COLOR_BAR_U_SHFT) +#define IEP_YUV_COLOR_BAR_V_SHFT 16 +#define IEP_YUV_COLOR_BAR_V_MASK (0xff << IEP_YUV_COLOR_BAR_V_SHFT) +#define IEP_YUV_VIDEO_MODE_SHFT 24 +#define IEP_YUV_VIDEO_MODE_MASK (3 << IEP_YUV_VIDEO_MODE_SHFT) + +#define IEP_ENH_RGB_CNFG 0x04c /* RGB enhancement configuration */ +#define IEP_ENH_RGB_C_COE 0x050 /* RGB color enhancement coefficient */ + +#define IEP_RAW_CONFIG0 0x058 /* Raw configuration register0 */ +#define IEP_RAW_CONFIG1 0x05c /* Raw configuration register1 */ +#define IEP_RAW_VIR_IMG_WIDTH 0x060 /* Raw image virtual width */ +#define IEP_RAW_IMG_SCL_FCT 0x064 /* Raw scaling factor */ +#define IEP_RAW_SRC_IMG_SIZE 0x068 /* Raw src image width/height */ +#define IEP_RAW_DST_IMG_SIZE 0x06c /* Raw src image width/height */ +#define IEP_RAW_ENH_YUV_CNFG_0 0x070 /* Raw brightness,contrast,saturation adjustment */ +#define IEP_RAW_ENH_YUV_CNFG_1 0x074 /* Raw hue configuration */ +#define IEP_RAW_ENH_YUV_CNFG_2 0x078 /* Raw color bar configuration */ +#define IEP_RAW_ENH_RGB_CNFG 0x07c /* Raw RGB enhancement configuration */ + +#define IEP_SRC_ADDR_Y_RGB 0x080 /* Start addr. of src image 0 (Y/RGB) */ +#define IEP_SRC_ADDR_CBCR 0x084 /* Start addr. of src image 0 (Cb/Cr) */ +#define IEP_SRC_ADDR_CR 0x088 /* Start addr. of src image 0 (Cr) */ +#define IEP_SRC_ADDR_Y1 0x08c /* Start addr. of src image 1 (Y) */ +#define IEP_SRC_ADDR_CBCR1 0x090 /* Start addr. of src image 1 (Cb/Cr) */ +#define IEP_SRC_ADDR_CR1 0x094 /* Start addr. of src image 1 (Cr) */ +#define IEP_SRC_ADDR_Y_ITEMP 0x098 /* Start addr. of src image(Y int part) */ +#define IEP_SRC_ADDR_CBCR_ITEMP 0x09c /* Start addr. of src image(CBCR int part) */ +#define IEP_SRC_ADDR_CR_ITEMP 0x0a0 /* Start addr. of src image(CR int part) */ +#define IEP_SRC_ADDR_Y_FTEMP 0x0a4 /* Start addr. of src image(Y frac part) */ +#define IEP_SRC_ADDR_CBCR_FTEMP 0x0a8 /* Start addr. of src image(CBCR frac part) */ +#define IEP_SRC_ADDR_CR_FTEMP 0x0ac /* Start addr. of src image(CR frac part) */ + +#define IEP_DST_ADDR_Y_RGB 0x0b0 /* Start addr. of dst image 0 (Y/RGB) */ +#define IEP_DST_ADDR_CBCR 0x0b4 /* Start addr. of dst image 0 (Cb/Cr) */ +#define IEP_DST_ADDR_CR 0x0b8 /* Start addr. of dst image 0 (Cr) */ +#define IEP_DST_ADDR_Y1 0x0bc /* Start addr. of dst image 1 (Y) */ +#define IEP_DST_ADDR_CBCR1 0x0c0 /* Start addr. of dst image 1 (Cb/Cr) */ +#define IEP_DST_ADDR_CR1 0x0c4 /* Start addr. of dst image 1 (Cr) */ +#define IEP_DST_ADDR_Y_ITEMP 0x0c8 /* Start addr. of dst image(Y int part) */ +#define IEP_DST_ADDR_CBCR_ITEMP 0x0cc /* Start addr. of dst image(CBCR int part)*/ +#define IEP_DST_ADDR_CR_ITEMP 0x0d0 /* Start addr. of dst image(CR int part) */ +#define IEP_DST_ADDR_Y_FTEMP 0x0d4 /* Start addr. of dst image(Y frac part) */ +#define IEP_DST_ADDR_CBCR_FTEMP 0x0d8 /* Start addr. of dst image(CBCR frac part) */ +#define IEP_DST_ADDR_CR_FTEMP 0x0dc /* Start addr. of dst image(CR frac part)*/ + +#define IEP_DEIN_MTN_TAB0 0x0e0 /* Deinterlace motion table0 */ +#define IEP_DEIN_MTN_TAB1 0x0e4 /* Deinterlace motion table1 */ +#define IEP_DEIN_MTN_TAB2 0x0e8 /* Deinterlace motion table2 */ +#define IEP_DEIN_MTN_TAB3 0x0ec /* Deinterlace motion table3 */ +#define IEP_DEIN_MTN_TAB4 0x0f0 /* Deinterlace motion table4 */ +#define IEP_DEIN_MTN_TAB5 0x0f4 /* Deinterlace motion table5 */ +#define IEP_DEIN_MTN_TAB6 0x0f8 /* Deinterlace motion table6 */ +#define IEP_DEIN_MTN_TAB7 0x0fc /* Deinterlace motion table7 */ + +#define IEP_ENH_CG_TAB 0x100 /* Contrast and gamma enhancement table */ +#define IEP_ENH_DDE_COE0 0x400 /* Denoise,detail and edge enhancement coefficient */ +#define IEP_ENH_DDE_COE1 0x500 /* Denoise,detail and edge enhancement coefficient1 */ + +#define IEP_INT_MASK (IEP_INT_FRAME_DONE) + +/* IEP colorformats */ +#define IEP_COLOR_FMT_XRGB 0U +#define IEP_COLOR_FMT_RGB565 1U +#define IEP_COLOR_FMT_YUV422 2U +#define IEP_COLOR_FMT_YUV420 3U + +/* IEP YUV color swaps */ +#define IEP_YUV_SWP_SP_UV 0U +#define IEP_YUV_SWP_SP_VU 1U +#define IEP_YUV_SWP_P 2U + +/* IEP XRGB color swaps */ +#define XRGB_SWP_XRGB 0U +#define XRGB_SWP_XBGR 1U +#define XRGB_SWP_BGRX 2U + +/* IEP RGB565 color swaps */ +#define RGB565_SWP_RGB 0U +#define RGB565_SWP_BGR 1U + +#define FMT_IS_YUV(fmt) (fmt == IEP_COLOR_FMT_XRGB || fmt == IEP_COLOR_FMT_RGB565 ? 0 : 1) + +#define IEP_IMG_SIZE(w, h) (((w - 1) & 0x1fff) << 0 | \ + ((h - 1) & 0x1fff) << 16) + +#define IEP_VIR_WIDTH(src_w, dst_w) (((src_w / 4) & 0x1fff) << 0 | \ + ((dst_w / 4) & 0x1fff) << 16) + +#define IEP_Y_STRIDE(w, h) (w * h) +#define IEP_UV_STRIDE(w, h, fac) (w * h + w * h / fac) + +#define IEP_SRC_FMT_SWP_MASK(f) (FMT_IS_YUV(f) ? IEP_SRC_YUV_SWP_MASK : IEP_SRC_RGB_SWP_MASK) +#define IEP_DST_FMT_SWP_MASK(f) (FMT_IS_YUV(f) ? IEP_DST_YUV_SWP_MASK : IEP_DST_RGB_SWP_MASK) + +#define IEP_SRC_FMT(f, swp) (f << IEP_SRC_FMT_SHFT | \ + (swp << (FMT_IS_YUV(f) ? IEP_SRC_YUV_SWP_SHFT : IEP_SRC_RGB_SWP_SHFT))) +#define IEP_DST_FMT(f, swp) (f << IEP_DST_FMT_SHFT | \ + (swp << (FMT_IS_YUV(f) ? IEP_DST_YUV_SWP_SHFT : IEP_DST_RGB_SWP_SHFT))) + +/* IEP DEINTERLACE MODES */ +#define IEP_DEIN_MODE_YUV 0U +#define IEP_DEIN_MODE_I4O2 1U +#define IEP_DEIN_MODE_I4O1B 2U +#define IEP_DEIN_MODE_I4O1T 3U +#define IEP_DEIN_MODE_I2O1B 4U +#define IEP_DEIN_MODE_I2O1T 5U +#define IEP_DEIN_MODE_BYPASS 6U + +#define IEP_DEIN_IN_FIELDS_2 2U +#define IEP_DEIN_IN_FIELDS_4 4U + +#define IEP_DEIN_OUT_FRAMES_1 1U +#define IEP_DEIN_OUT_FRAMES_2 2U + +/* values taken from BSP driver */ +static const u32 default_dein_motion_tbl[][2] = { + { IEP_DEIN_MTN_TAB0, 0x40404040 }, + { IEP_DEIN_MTN_TAB1, 0x3c3e3f3f }, + { IEP_DEIN_MTN_TAB2, 0x3336393b }, + { IEP_DEIN_MTN_TAB3, 0x272a2d31 }, + { IEP_DEIN_MTN_TAB4, 0x181c2023 }, + { IEP_DEIN_MTN_TAB5, 0x0c0e1215 }, + { IEP_DEIN_MTN_TAB6, 0x03040609 }, + { IEP_DEIN_MTN_TAB7, 0x00000001 }, + +}; + +#define IEP_DEIN_IN_IMG0_Y(bff) (bff ? IEP_SRC_ADDR_Y_RGB : IEP_SRC_ADDR_Y1) +#define IEP_DEIN_IN_IMG0_CBCR(bff) (bff ? IEP_SRC_ADDR_CBCR : IEP_SRC_ADDR_CBCR1) +#define IEP_DEIN_IN_IMG0_CR(bff) (bff ? IEP_SRC_ADDR_CR : IEP_SRC_ADDR_CR1) +#define IEP_DEIN_IN_IMG1_Y(bff) (IEP_DEIN_IN_IMG0_Y(!bff)) +#define IEP_DEIN_IN_IMG1_CBCR(bff) (IEP_DEIN_IN_IMG0_CBCR(!bff)) +#define IEP_DEIN_IN_IMG1_CR(bff) (IEP_DEIN_IN_IMG0_CR(!bff)) + +#define IEP_DEIN_OUT_IMG0_Y(bff) (bff ? IEP_DST_ADDR_Y1 : IEP_DST_ADDR_Y_RGB) +#define IEP_DEIN_OUT_IMG0_CBCR(bff) (bff ? IEP_DST_ADDR_CBCR1 : IEP_DST_ADDR_CBCR) +#define IEP_DEIN_OUT_IMG0_CR(bff) (bff ? IEP_DST_ADDR_CR1 : IEP_DST_ADDR_CR) +#define IEP_DEIN_OUT_IMG1_Y(bff) (IEP_DEIN_OUT_IMG0_Y(!bff)) +#define IEP_DEIN_OUT_IMG1_CBCR(bff) (IEP_DEIN_OUT_IMG0_CBCR(!bff)) +#define IEP_DEIN_OUT_IMG1_CR(bff) (IEP_DEIN_OUT_IMG0_CR(!bff)) + +#define IEP_DEIN_MODE(m) (m << IEP_DEIN_MODE_SHFT) + +#define IEP_DEIN_IN_MODE_FIELDS(m) ((m == IEP_DEIN_MODE_I4O1T || m == IEP_DEIN_MODE_I4O1B \ + || m == IEP_DEIN_MODE_I4O2) \ + ? IEP_DEIN_IN_FIELDS_4 : IEP_DEIN_IN_FIELDS_2) + +#define IEP_DEIN_OUT_MODE_FRAMES(m) (m == IEP_DEIN_MODE_I4O2 \ + ? IEP_DEIN_OUT_FRAMES_2 : IEP_DEIN_OUT_FRAMES_1) + +#define IEP_DEIN_OUT_MODE_1FRM_TOP_FIELD(m) (m == IEP_DEIN_MODE_I4O1T || IEP_DEIN_MODE_I2O1T \ + ? 1 : 0) + +#define IEP_DEIN_EDGE_INTPOL_RADIUS(r) (r << IEP_DEIN_EDGE_INTPOL_RADIUS_SHFT) + +#define IEP_DEIN_HIGH_FREQ(f) (f << IEP_DEIN_HIGH_FREQ_SHFT) + +/* YUV Enhance video modes */ +#define VIDEO_MODE_BLACK_SCREEN 0U +#define VIDEO_MODE_BLUE_SCREEN 1U +#define VIDEO_MODE_COLOR_BARS 2U +#define VIDEO_MODE_NORMAL_VIDEO 3U + +#define YUV_VIDEO_MODE(m) ((m << IEP_YUV_VIDEO_MODE_SHFT) & IEP_YUV_VIDEO_MODE_MASK) +#define YUV_BRIGHTNESS(v) ((v << IEP_YUV_BRIGHTNESS_SHFT) & IEP_YUV_BRIGHTNESS_MASK) +#define YUV_CONTRAST(v) ((v << IEP_YUV_CONTRAST_SHFT) & IEP_YUV_CONTRAST_MASK) +#define YUV_SATURATION(v) ((v << IEP_YUV_SATURATION_SHFT) & IEP_YUV_SATURATION_MASK) +#define YUV_COS_HUE(v) ((v << IEP_YUV_COS_HUE_SHFT) & IEP_YUV_COS_HUE_MASK) +#define YUV_SIN_HUE(v) ((v << IEP_YUV_SIN_HUE_SHFT) & IEP_YUV_SIN_HUE_MASK) + +#endif diff --git a/drivers/media/platform/rockchip/iep/iep.c b/drivers/media/platform/rockchip/iep/iep.c new file mode 100644 index 000000000000..f4b9320733be --- /dev/null +++ b/drivers/media/platform/rockchip/iep/iep.c @@ -0,0 +1,1089 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Rockchip Image Enhancement Processor (IEP) driver + * + * Copyright (C) 2020 Alex Bee <knaerzche@gmail.com> + * + * Based on Allwinner sun8i deinterlacer with scaler driver + * Copyright (C) 2019 Jernej Skrabec <jernej.skrabec@siol.net> + * + */ + +#include <linux/clk.h> +#include <linux/delay.h> +#include <linux/interrupt.h> +#include <linux/io.h> +#include <linux/iopoll.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/platform_device.h> +#include <linux/pm_runtime.h> + +#include <media/v4l2-device.h> +#include <media/v4l2-ctrls.h> +#include <media/v4l2-ioctl.h> +#include <media/v4l2-mem2mem.h> +#include <media/videobuf2-v4l2.h> +#include <media/videobuf2-core.h> +#include <media/videobuf2-dma-contig.h> +#include <linux/videodev2.h> + +#include "iep-regs.h" +#include "iep.h" + +static struct iep_fmt formats[] = { + { + .fourcc = V4L2_PIX_FMT_NV12, + .color_swap = IEP_YUV_SWP_SP_UV, + .hw_format = IEP_COLOR_FMT_YUV420, + .depth = 12, + .uv_factor = 4, + }, + { + .fourcc = V4L2_PIX_FMT_NV21, + .color_swap = IEP_YUV_SWP_SP_VU, + .hw_format = IEP_COLOR_FMT_YUV420, + .depth = 12, + .uv_factor = 4, + }, + { + .fourcc = V4L2_PIX_FMT_NV16, + .color_swap = IEP_YUV_SWP_SP_UV, + .hw_format = IEP_COLOR_FMT_YUV422, + .depth = 16, + .uv_factor = 2, + }, + { + .fourcc = V4L2_PIX_FMT_NV61, + .color_swap = IEP_YUV_SWP_SP_VU, + .hw_format = IEP_COLOR_FMT_YUV422, + .depth = 16, + .uv_factor = 2, + }, + { + .fourcc = V4L2_PIX_FMT_YUV420, + .color_swap = IEP_YUV_SWP_P, + .hw_format = IEP_COLOR_FMT_YUV420, + .depth = 12, + .uv_factor = 4, + }, + { + .fourcc = V4L2_PIX_FMT_YUV422P, + .color_swap = IEP_YUV_SWP_P, + .hw_format = IEP_COLOR_FMT_YUV422, + .depth = 16, + .uv_factor = 2, + }, +}; + +static struct iep_fmt *iep_fmt_find(struct v4l2_pix_format *pix_fmt) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(formats); i++) { + if (formats[i].fourcc == pix_fmt->pixelformat) + return &formats[i]; + } + + return NULL; +} + +static bool iep_check_pix_format(u32 pixelformat) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(formats); i++) + if (formats[i].fourcc == pixelformat) + return true; + + return false; +} + +static struct vb2_v4l2_buffer *iep_m2m_next_dst_buf(struct iep_ctx *ctx) +{ + struct vb2_v4l2_buffer *dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); + + /* application has set a dst sequence: take it as start point */ + if (ctx->dst_sequence == 0 && dst_buf->sequence > 0) + ctx->dst_sequence = dst_buf->sequence; + + dst_buf->sequence = ctx->dst_sequence++; + + return dst_buf; +} + +static void iep_m2m_dst_bufs_done(struct iep_ctx *ctx, enum vb2_buffer_state state) +{ + if (ctx->dst0_buf) { + v4l2_m2m_buf_done(ctx->dst0_buf, state); + ctx->dst_buffs_done++; + ctx->dst0_buf = NULL; + } + + if (ctx->dst1_buf) { + v4l2_m2m_buf_done(ctx->dst1_buf, state); + ctx->dst_buffs_done++; + ctx->dst1_buf = NULL; + } +} + +static void iep_setup_formats(struct iep_ctx *ctx) +{ + /* setup src dimensions */ + iep_write(ctx->iep, IEP_SRC_IMG_SIZE, + IEP_IMG_SIZE(ctx->src_fmt.pix.width, ctx->src_fmt.pix.height)); + + /* setup dst dimensions */ + iep_write(ctx->iep, IEP_DST_IMG_SIZE, + IEP_IMG_SIZE(ctx->dst_fmt.pix.width, ctx->dst_fmt.pix.height)); + + /* setup virtual width */ + iep_write(ctx->iep, IEP_VIR_IMG_WIDTH, + IEP_VIR_WIDTH(ctx->src_fmt.pix.width, ctx->dst_fmt.pix.width)); + + /* setup src format */ + iep_shadow_mod(ctx->iep, IEP_CONFIG1, IEP_RAW_CONFIG1, + IEP_SRC_FMT_MASK | IEP_SRC_FMT_SWP_MASK(ctx->src_fmt.hw_fmt->hw_format), + IEP_SRC_FMT(ctx->src_fmt.hw_fmt->hw_format, + ctx->src_fmt.hw_fmt->color_swap)); + /* setup dst format */ + iep_shadow_mod(ctx->iep, IEP_CONFIG1, IEP_RAW_CONFIG1, + IEP_DST_FMT_MASK | IEP_DST_FMT_SWP_MASK(ctx->dst_fmt.hw_fmt->hw_format), + IEP_DST_FMT(ctx->dst_fmt.hw_fmt->hw_format, + ctx->dst_fmt.hw_fmt->color_swap)); + + ctx->fmt_changed = false; +} + +static void iep_dein_init(struct rockchip_iep *iep) +{ + unsigned int i; + + /* values taken from BSP driver */ + iep_shadow_mod(iep, IEP_CONFIG0, IEP_RAW_CONFIG0, + (IEP_DEIN_EDGE_INTPOL_SMTH_EN | + IEP_DEIN_EDGE_INTPOL_RADIUS_MASK | + IEP_DEIN_HIGH_FREQ_EN | + IEP_DEIN_HIGH_FREQ_MASK), + (IEP_DEIN_EDGE_INTPOL_SMTH_EN | + IEP_DEIN_EDGE_INTPOL_RADIUS(3) | + IEP_DEIN_HIGH_FREQ_EN | + IEP_DEIN_HIGH_FREQ(64))); + + for (i = 0; i < ARRAY_SIZE(default_dein_motion_tbl); i++) + iep_write(iep, default_dein_motion_tbl[i][0], + default_dein_motion_tbl[i][1]); +} + +static void iep_init(struct rockchip_iep *iep) +{ + iep_write(iep, IEP_CONFIG0, + IEP_DEIN_MODE(IEP_DEIN_MODE_BYPASS) // | + //IEP_YUV_ENHNC_EN + ); + + /* TODO: B/S/C/H works + * only in 1-frame-out modes + iep_write(iep, IEP_ENH_YUV_CNFG_0, + YUV_BRIGHTNESS(0) | + YUV_CONTRAST(128) | + YUV_SATURATION(128)); + + iep_write(iep, IEP_ENH_YUV_CNFG_1, + YUV_COS_HUE(255) | + YUV_SIN_HUE(255)); + + iep_write(iep, IEP_ENH_YUV_CNFG_2, + YUV_VIDEO_MODE(VIDEO_MODE_NORMAL_VIDEO)); + + */ + + /* reset frame counter */ + iep_write(iep, IEP_FRM_CNT, 0); +} + +static void iep_device_run(void *priv) +{ + struct iep_ctx *ctx = priv; + struct rockchip_iep *iep = ctx->iep; + struct vb2_v4l2_buffer *src, *dst; + unsigned int dein_mode; + dma_addr_t addr; + + if (ctx->fmt_changed) + iep_setup_formats(ctx); + + if (ctx->prev_src_buf) + dein_mode = IEP_DEIN_MODE_I4O2; + else + dein_mode = ctx->field_bff ? IEP_DEIN_MODE_I2O1B : IEP_DEIN_MODE_I2O1T; + + iep_shadow_mod(iep, IEP_CONFIG0, IEP_RAW_CONFIG0, + IEP_DEIN_MODE_MASK, IEP_DEIN_MODE(dein_mode)); + + /* sync RAW_xxx registers with actual used */ + iep_write(iep, IEP_CONFIG_DONE, 1); + + /* setup src buff(s)/addresses */ + src = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); + addr = vb2_dma_contig_plane_dma_addr(&src->vb2_buf, 0); + + iep_write(iep, IEP_DEIN_IN_IMG0_Y(ctx->field_bff), addr); + + iep_write(iep, IEP_DEIN_IN_IMG0_CBCR(ctx->field_bff), + addr + ctx->src_fmt.y_stride); + + iep_write(iep, IEP_DEIN_IN_IMG0_CR(ctx->field_bff), + addr + ctx->src_fmt.uv_stride); + + if (IEP_DEIN_IN_MODE_FIELDS(dein_mode) == IEP_DEIN_IN_FIELDS_4) + addr = vb2_dma_contig_plane_dma_addr(&ctx->prev_src_buf->vb2_buf, 0); + + iep_write(iep, IEP_DEIN_IN_IMG1_Y(ctx->field_bff), addr); + + iep_write(iep, IEP_DEIN_IN_IMG1_CBCR(ctx->field_bff), + addr + ctx->src_fmt.y_stride); + + iep_write(iep, IEP_DEIN_IN_IMG1_CR(ctx->field_bff), + addr + ctx->src_fmt.uv_stride); + + /* setup dst buff(s)/addresses */ + dst = iep_m2m_next_dst_buf(ctx); + addr = vb2_dma_contig_plane_dma_addr(&dst->vb2_buf, 0); + + if (IEP_DEIN_OUT_MODE_FRAMES(dein_mode) == IEP_DEIN_OUT_FRAMES_2) { + v4l2_m2m_buf_copy_metadata(ctx->prev_src_buf, dst, true); + + iep_write(iep, IEP_DEIN_OUT_IMG0_Y(ctx->field_bff), addr); + + iep_write(iep, IEP_DEIN_OUT_IMG0_CBCR(ctx->field_bff), + addr + ctx->dst_fmt.y_stride); + + iep_write(iep, IEP_DEIN_OUT_IMG0_CR(ctx->field_bff), + addr + ctx->dst_fmt.uv_stride); + + ctx->dst0_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); + + dst = iep_m2m_next_dst_buf(ctx); + addr = vb2_dma_contig_plane_dma_addr(&dst->vb2_buf, 0); + } + + v4l2_m2m_buf_copy_metadata(src, dst, true); + + iep_write(iep, IEP_DEIN_OUT_IMG1_Y(ctx->field_bff), addr); + + iep_write(iep, IEP_DEIN_OUT_IMG1_CBCR(ctx->field_bff), + addr + ctx->dst_fmt.y_stride); + + iep_write(iep, IEP_DEIN_OUT_IMG1_CR(ctx->field_bff), + addr + ctx->dst_fmt.uv_stride); + + ctx->dst1_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); + + iep_mod(ctx->iep, IEP_INT, IEP_INT_FRAME_DONE_EN, + IEP_INT_FRAME_DONE_EN); + + /* start HW */ + iep_write(iep, IEP_FRM_START, 1); +} + +static int iep_job_ready(void *priv) +{ + struct iep_ctx *ctx = priv; + + return v4l2_m2m_num_dst_bufs_ready(ctx->fh.m2m_ctx) >= 2 && + v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx) >= 1; +} + +static void iep_job_abort(void *priv) +{ + struct iep_ctx *ctx = priv; + + /* Will cancel the transaction in the next interrupt handler */ + ctx->job_abort = true; +} + +static const struct v4l2_m2m_ops iep_m2m_ops = { + .device_run = iep_device_run, + .job_ready = iep_job_ready, + .job_abort = iep_job_abort, +}; + +static int iep_queue_setup(struct vb2_queue *vq, unsigned int *nbuffers, + unsigned int *nplanes, unsigned int sizes[], + struct device *alloc_devs[]) +{ + struct iep_ctx *ctx = vb2_get_drv_priv(vq); + struct v4l2_pix_format *pix_fmt; + + if (V4L2_TYPE_IS_OUTPUT(vq->type)) + pix_fmt = &ctx->src_fmt.pix; + else + pix_fmt = &ctx->dst_fmt.pix; + + if (*nplanes) { + if (sizes[0] < pix_fmt->sizeimage) + return -EINVAL; + } else { + sizes[0] = pix_fmt->sizeimage; + *nplanes = 1; + } + + return 0; +} + +static int iep_buf_prepare(struct vb2_buffer *vb) +{ + struct vb2_queue *vq = vb->vb2_queue; + struct iep_ctx *ctx = vb2_get_drv_priv(vq); + struct v4l2_pix_format *pix_fmt; + + if (V4L2_TYPE_IS_OUTPUT(vq->type)) + pix_fmt = &ctx->src_fmt.pix; + else + pix_fmt = &ctx->dst_fmt.pix; + + if (vb2_plane_size(vb, 0) < pix_fmt->sizeimage) + return -EINVAL; + + /* set bytesused for capture buffers */ + if (!V4L2_TYPE_IS_OUTPUT(vq->type)) + vb2_set_plane_payload(vb, 0, pix_fmt->sizeimage); + + return 0; +} + +static void iep_buf_queue(struct vb2_buffer *vb) +{ + struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); + struct iep_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue); + + v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf); +} + +static void iep_queue_cleanup(struct vb2_queue *vq, u32 state) +{ + struct iep_ctx *ctx = vb2_get_drv_priv(vq); + struct vb2_v4l2_buffer *vbuf; + + do { + if (V4L2_TYPE_IS_OUTPUT(vq->type)) + vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); + else + vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); + + if (vbuf) + v4l2_m2m_buf_done(vbuf, state); + } while (vbuf); + + if (V4L2_TYPE_IS_OUTPUT(vq->type) && ctx->prev_src_buf) + v4l2_m2m_buf_done(ctx->prev_src_buf, state); + else + iep_m2m_dst_bufs_done(ctx, state); +} + +static int iep_start_streaming(struct vb2_queue *vq, unsigned int count) +{ + struct iep_ctx *ctx = vb2_get_drv_priv(vq); + struct device *dev = ctx->iep->dev; + int ret; + + if (V4L2_TYPE_IS_OUTPUT(vq->type)) { + ret = pm_runtime_get_sync(dev); + if (ret < 0) { + dev_err(dev, "Failed to enable module\n"); + goto err_runtime_get; + } + + ctx->field_order_bff = + ctx->src_fmt.pix.field == V4L2_FIELD_INTERLACED_BT; + ctx->field_bff = ctx->field_order_bff; + + ctx->src_sequence = 0; + ctx->dst_sequence = 0; + + ctx->prev_src_buf = NULL; + + ctx->dst0_buf = NULL; + ctx->dst1_buf = NULL; + ctx->dst_buffs_done = 0; + + ctx->job_abort = false; + + iep_init(ctx->iep); + //if (ctx->src_fmt.pix.field != ctx->dst_fmt.pix.field) + iep_dein_init(ctx->iep); + } + + return 0; + +err_runtime_get: + iep_queue_cleanup(vq, VB2_BUF_STATE_QUEUED); + + return ret; +} + +static void iep_stop_streaming(struct vb2_queue *vq) +{ + struct iep_ctx *ctx = vb2_get_drv_priv(vq); + + if (V4L2_TYPE_IS_OUTPUT(vq->type)) { + pm_runtime_mark_last_busy(ctx->iep->dev); + pm_runtime_put_autosuspend(ctx->iep->dev); + } + + iep_queue_cleanup(vq, VB2_BUF_STATE_ERROR); +} + +static const struct vb2_ops iep_qops = { + .queue_setup = iep_queue_setup, + .buf_prepare = iep_buf_prepare, + .buf_queue = iep_buf_queue, + .start_streaming = iep_start_streaming, + .stop_streaming = iep_stop_streaming, + .wait_prepare = vb2_ops_wait_prepare, + .wait_finish = vb2_ops_wait_finish, +}; + +static int iep_queue_init(void *priv, struct vb2_queue *src_vq, + struct vb2_queue *dst_vq) +{ + struct iep_ctx *ctx = priv; + int ret; + + src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT; + src_vq->dma_attrs = DMA_ATTR_ALLOC_SINGLE_PAGES | + DMA_ATTR_NO_KERNEL_MAPPING; + src_vq->io_modes = VB2_MMAP | VB2_DMABUF; + src_vq->drv_priv = ctx; + src_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer); + src_vq->min_buffers_needed = 1; + src_vq->ops = &iep_qops; + src_vq->mem_ops = &vb2_dma_contig_memops; + src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; + src_vq->lock = &ctx->iep->mutex; + src_vq->dev = ctx->iep->v4l2_dev.dev; + + ret = vb2_queue_init(src_vq); + if (ret) + return ret; + + dst_vq->dma_attrs = DMA_ATTR_ALLOC_SINGLE_PAGES | + DMA_ATTR_NO_KERNEL_MAPPING; + dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + dst_vq->io_modes = VB2_MMAP | VB2_DMABUF; + dst_vq->drv_priv = ctx; + dst_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer); + dst_vq->min_buffers_needed = 2; + dst_vq->ops = &iep_qops; + dst_vq->mem_ops = &vb2_dma_contig_memops; + dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; + dst_vq->lock = &ctx->iep->mutex; + dst_vq->dev = ctx->iep->v4l2_dev.dev; + + ret = vb2_queue_init(dst_vq); + if (ret) + return ret; + + return 0; +} + +static void iep_prepare_format(struct v4l2_pix_format *pix_fmt) +{ + unsigned int height = pix_fmt->height; + unsigned int width = pix_fmt->width; + unsigned int sizeimage, bytesperline; + + struct iep_fmt *hw_fmt = iep_fmt_find(pix_fmt); + + if (!hw_fmt) { + hw_fmt = &formats[0]; + pix_fmt->pixelformat = hw_fmt->fourcc; + } + + width = ALIGN(clamp(width, IEP_MIN_WIDTH, + IEP_MAX_WIDTH), 16); + height = ALIGN(clamp(height, IEP_MIN_HEIGHT, + IEP_MAX_HEIGHT), 16); + + bytesperline = FMT_IS_YUV(hw_fmt->hw_format) + ? width : (width * hw_fmt->depth) >> 3; + + sizeimage = height * (width * hw_fmt->depth) >> 3; + + pix_fmt->width = width; + pix_fmt->height = height; + pix_fmt->bytesperline = bytesperline; + pix_fmt->sizeimage = sizeimage; +} + +static int iep_open(struct file *file) +{ + struct rockchip_iep *iep = video_drvdata(file); + struct iep_ctx *ctx = NULL; + + int ret; + + if (mutex_lock_interruptible(&iep->mutex)) + return -ERESTARTSYS; + + ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) { + mutex_unlock(&iep->mutex); + return -ENOMEM; + } + + /* default output format */ + ctx->src_fmt.pix.pixelformat = formats[0].fourcc; + ctx->src_fmt.pix.field = V4L2_FIELD_INTERLACED; + ctx->src_fmt.pix.width = IEP_DEFAULT_WIDTH; + ctx->src_fmt.pix.height = IEP_DEFAULT_HEIGHT; + iep_prepare_format(&ctx->src_fmt.pix); + ctx->src_fmt.hw_fmt = &formats[0]; + ctx->dst_fmt.y_stride = IEP_Y_STRIDE(ctx->src_fmt.pix.width, ctx->src_fmt.pix.height); + ctx->dst_fmt.uv_stride = IEP_UV_STRIDE(ctx->src_fmt.pix.width, ctx->src_fmt.pix.height, + ctx->src_fmt.hw_fmt->uv_factor); + + /* default capture format */ + ctx->dst_fmt.pix.pixelformat = formats[0].fourcc; + ctx->dst_fmt.pix.field = V4L2_FIELD_NONE; + ctx->dst_fmt.pix.width = IEP_DEFAULT_WIDTH; + ctx->dst_fmt.pix.height = IEP_DEFAULT_HEIGHT; + iep_prepare_format(&ctx->dst_fmt.pix); + ctx->dst_fmt.hw_fmt = &formats[0]; + ctx->dst_fmt.y_stride = IEP_Y_STRIDE(ctx->dst_fmt.pix.width, ctx->dst_fmt.pix.height); + ctx->dst_fmt.uv_stride = IEP_UV_STRIDE(ctx->dst_fmt.pix.width, ctx->dst_fmt.pix.height, + ctx->dst_fmt.hw_fmt->uv_factor); + /* ensure fmts are written to HW */ + ctx->fmt_changed = true; + + v4l2_fh_init(&ctx->fh, video_devdata(file)); + file->private_data = &ctx->fh; + ctx->iep = iep; + + ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(iep->m2m_dev, ctx, + &iep_queue_init); + + if (IS_ERR(ctx->fh.m2m_ctx)) { + ret = PTR_ERR(ctx->fh.m2m_ctx); + goto err_free; + } + + v4l2_fh_add(&ctx->fh); + + mutex_unlock(&iep->mutex); + + return 0; + +err_free: + kfree(ctx); + mutex_unlock(&iep->mutex); + + return ret; +} + +static int iep_release(struct file *file) +{ + struct rockchip_iep *iep = video_drvdata(file); + struct iep_ctx *ctx = container_of(file->private_data, + struct iep_ctx, fh); + + mutex_lock(&iep->mutex); + + v4l2_fh_del(&ctx->fh); + v4l2_fh_exit(&ctx->fh); + v4l2_m2m_ctx_release(ctx->fh.m2m_ctx); + kfree(ctx); + + mutex_unlock(&iep->mutex); + return 0; +} + +static const struct v4l2_file_operations iep_fops = { + .owner = THIS_MODULE, + .open = iep_open, + .release = iep_release, + .poll = v4l2_m2m_fop_poll, + .unlocked_ioctl = video_ioctl2, + .mmap = v4l2_m2m_fop_mmap, +}; + +static int iep_querycap(struct file *file, void *priv, + struct v4l2_capability *cap) +{ + strscpy(cap->driver, IEP_NAME, sizeof(cap->driver)); + strscpy(cap->card, IEP_NAME, sizeof(cap->card)); + snprintf(cap->bus_info, sizeof(cap->bus_info), + "platform:%s", IEP_NAME); + + return 0; +} + +static int iep_enum_fmt(struct file *file, void *priv, + struct v4l2_fmtdesc *f) +{ + struct iep_fmt *fmt; + + if (f->index < ARRAY_SIZE(formats)) { + fmt = &formats[f->index]; + f->pixelformat = fmt->fourcc; + + return 0; + } + + return -EINVAL; +} + +static int iep_enum_framesizes(struct file *file, void *priv, + struct v4l2_frmsizeenum *fsize) +{ + if (fsize->index != 0) + return -EINVAL; + + if (!iep_check_pix_format(fsize->pixel_format)) + return -EINVAL; + + fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; + + fsize->stepwise.min_width = IEP_MIN_WIDTH; + fsize->stepwise.max_width = IEP_MAX_WIDTH; + fsize->stepwise.step_width = 16; + + fsize->stepwise.min_height = IEP_MIN_HEIGHT; + fsize->stepwise.max_height = IEP_MAX_HEIGHT; + fsize->stepwise.step_height = 16; + + return 0; +} + +static inline struct iep_ctx *iep_file2ctx(struct file *file) +{ + return container_of(file->private_data, struct iep_ctx, fh); +} + +static int iep_g_fmt_vid_cap(struct file *file, void *priv, + struct v4l2_format *f) +{ + struct iep_ctx *ctx = iep_file2ctx(file); + + f->fmt.pix = ctx->dst_fmt.pix; + + return 0; +} + +static int iep_g_fmt_vid_out(struct file *file, void *priv, + struct v4l2_format *f) +{ + struct iep_ctx *ctx = iep_file2ctx(file); + + f->fmt.pix = ctx->src_fmt.pix; + + return 0; +} + +static int iep_try_fmt_vid_cap(struct file *file, void *priv, + struct v4l2_format *f) +{ + f->fmt.pix.field = V4L2_FIELD_NONE; + iep_prepare_format(&f->fmt.pix); + + return 0; +} + +static int iep_try_fmt_vid_out(struct file *file, void *priv, + struct v4l2_format *f) +{ + if (f->fmt.pix.field != V4L2_FIELD_INTERLACED_TB && + f->fmt.pix.field != V4L2_FIELD_INTERLACED_BT && + f->fmt.pix.field != V4L2_FIELD_INTERLACED) + f->fmt.pix.field = V4L2_FIELD_INTERLACED; + + iep_prepare_format(&f->fmt.pix); + + return 0; +} + +static int iep_s_fmt_vid_out(struct file *file, void *priv, + struct v4l2_format *f) +{ + struct iep_ctx *ctx = iep_file2ctx(file); + struct vb2_queue *vq; + + int ret; + + ret = iep_try_fmt_vid_out(file, priv, f); + if (ret) + return ret; + + vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type); + if (vb2_is_busy(vq)) + return -EBUSY; + + ctx->src_fmt.pix = f->fmt.pix; + ctx->src_fmt.hw_fmt = iep_fmt_find(&f->fmt.pix); + ctx->src_fmt.y_stride = IEP_Y_STRIDE(f->fmt.pix.width, f->fmt.pix.height); + ctx->src_fmt.uv_stride = IEP_UV_STRIDE(f->fmt.pix.width, f->fmt.pix.height, + ctx->src_fmt.hw_fmt->uv_factor); + + /* Propagate colorspace information to capture. */ + ctx->dst_fmt.pix.colorspace = f->fmt.pix.colorspace; + ctx->dst_fmt.pix.xfer_func = f->fmt.pix.xfer_func; + ctx->dst_fmt.pix.ycbcr_enc = f->fmt.pix.ycbcr_enc; + ctx->dst_fmt.pix.quantization = f->fmt.pix.quantization; + + /* scaling is not supported */ + ctx->dst_fmt.pix.width = f->fmt.pix.width; + ctx->dst_fmt.pix.height = f->fmt.pix.height; + ctx->dst_fmt.y_stride = IEP_Y_STRIDE(f->fmt.pix.width, f->fmt.pix.height); + ctx->dst_fmt.uv_stride = IEP_UV_STRIDE(f->fmt.pix.width, f->fmt.pix.height, + ctx->dst_fmt.hw_fmt->uv_factor); + + ctx->fmt_changed = true; + + return 0; +} + +static int iep_s_fmt_vid_cap(struct file *file, void *priv, + struct v4l2_format *f) +{ + struct iep_ctx *ctx = iep_file2ctx(file); + struct vb2_queue *vq; + int ret; + + ret = iep_try_fmt_vid_cap(file, priv, f); + if (ret) + return ret; + + vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type); + if (vb2_is_busy(vq)) + return -EBUSY; + + /* scaling is not supported */ + f->fmt.pix.width = ctx->src_fmt.pix.width; + f->fmt.pix.height = ctx->src_fmt.pix.height; + + ctx->dst_fmt.pix = f->fmt.pix; + ctx->dst_fmt.hw_fmt = iep_fmt_find(&f->fmt.pix); + + ctx->dst_fmt.y_stride = IEP_Y_STRIDE(f->fmt.pix.width, f->fmt.pix.height); + ctx->dst_fmt.uv_stride = IEP_UV_STRIDE(f->fmt.pix.width, f->fmt.pix.height, + ctx->dst_fmt.hw_fmt->uv_factor); + + ctx->fmt_changed = true; + + return 0; +} + +static const struct v4l2_ioctl_ops iep_ioctl_ops = { + .vidioc_querycap = iep_querycap, + + .vidioc_enum_framesizes = iep_enum_framesizes, + + .vidioc_enum_fmt_vid_cap = iep_enum_fmt, + .vidioc_g_fmt_vid_cap = iep_g_fmt_vid_cap, + .vidioc_try_fmt_vid_cap = iep_try_fmt_vid_cap, + .vidioc_s_fmt_vid_cap = iep_s_fmt_vid_cap, + + .vidioc_enum_fmt_vid_out = iep_enum_fmt, + .vidioc_g_fmt_vid_out = iep_g_fmt_vid_out, + .vidioc_try_fmt_vid_out = iep_try_fmt_vid_out, + .vidioc_s_fmt_vid_out = iep_s_fmt_vid_out, + + .vidioc_reqbufs = v4l2_m2m_ioctl_reqbufs, + .vidioc_querybuf = v4l2_m2m_ioctl_querybuf, + .vidioc_qbuf = v4l2_m2m_ioctl_qbuf, + .vidioc_dqbuf = v4l2_m2m_ioctl_dqbuf, + .vidioc_prepare_buf = v4l2_m2m_ioctl_prepare_buf, + .vidioc_create_bufs = v4l2_m2m_ioctl_create_bufs, + .vidioc_expbuf = v4l2_m2m_ioctl_expbuf, + + .vidioc_streamon = v4l2_m2m_ioctl_streamon, + .vidioc_streamoff = v4l2_m2m_ioctl_streamoff, +}; + +static const struct video_device iep_video_device = { + .name = IEP_NAME, + .vfl_dir = VFL_DIR_M2M, + .fops = &iep_fops, + .ioctl_ops = &iep_ioctl_ops, + .minor = -1, + .release = video_device_release_empty, + .device_caps = V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING, +}; + +static int iep_parse_dt(struct rockchip_iep *iep) +{ + int ret = 0; + + iep->axi_clk = devm_clk_get(iep->dev, "axi"); + if (IS_ERR(iep->axi_clk)) { + dev_err(iep->dev, "failed to get aclk clock\n"); + return PTR_ERR(iep->axi_clk); + } + + iep->ahb_clk = devm_clk_get(iep->dev, "ahb"); + if (IS_ERR(iep->ahb_clk)) { + dev_err(iep->dev, "failed to get hclk clock\n"); + return PTR_ERR(iep->ahb_clk); + } + + ret = clk_set_rate(iep->axi_clk, 300000000); + + if (ret) + dev_err(iep->dev, "failed to set axi clock rate to 300 MHz\n"); + + return ret; +} + +static irqreturn_t iep_isr(int irq, void *prv) +{ + struct rockchip_iep *iep = prv; + struct iep_ctx *ctx; + u32 val; + enum vb2_buffer_state state = VB2_BUF_STATE_DONE; + + ctx = v4l2_m2m_get_curr_priv(iep->m2m_dev); + if (!ctx) { + v4l2_err(&iep->v4l2_dev, + "Instance released before the end of transaction\n"); + return IRQ_NONE; + } + + /* + * The irq is shared with the iommu. If the runtime-pm state of the + * iep-device is disabled or the interrupt status doesn't match the + * expeceted mask the irq has been targeted to the iommu. + */ + + if (!pm_runtime_active(iep->dev) || + !(iep_read(iep, IEP_INT) & IEP_INT_MASK)) + return IRQ_NONE; + + /* disable interrupt - will be re-enabled at next iep_device_run */ + iep_mod(ctx->iep, IEP_INT, + IEP_INT_FRAME_DONE_EN, 0); + + iep_mod(iep, IEP_INT, IEP_INT_FRAME_DONE_CLR, + IEP_INT_FRAME_DONE_CLR); + + /* wait for all status regs to show "idle" */ + val = readl_poll_timeout(iep->regs + IEP_STATUS, val, + (val == 0), 100, IEP_TIMEOUT); + + if (val) { + dev_err(iep->dev, + "Failed to wait for job to finish: status: %u\n", val); + state = VB2_BUF_STATE_ERROR; + ctx->job_abort = true; + } + + iep_m2m_dst_bufs_done(ctx, state); + + ctx->field_bff = (ctx->dst_buffs_done % 2 == 0) + ? ctx->field_order_bff : !ctx->field_order_bff; + + if (ctx->dst_buffs_done == 2 || ctx->job_abort) { + if (ctx->prev_src_buf) + v4l2_m2m_buf_done(ctx->prev_src_buf, state); + + /* current src buff will be next prev */ + ctx->prev_src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); + + v4l2_m2m_job_finish(ctx->iep->m2m_dev, ctx->fh.m2m_ctx); + ctx->dst_buffs_done = 0; + + } else { + iep_device_run(ctx); + } + + return IRQ_HANDLED; +} + +static int iep_probe(struct platform_device *pdev) +{ + struct rockchip_iep *iep; + struct video_device *vfd; + struct resource *res; + int ret = 0; + int irq; + + if (!pdev->dev.of_node) + return -ENODEV; + + iep = devm_kzalloc(&pdev->dev, sizeof(*iep), GFP_KERNEL); + if (!iep) + return -ENOMEM; + + platform_set_drvdata(pdev, iep); + iep->dev = &pdev->dev; + iep->vfd = iep_video_device; + + ret = iep_parse_dt(iep); + if (ret) + dev_err(&pdev->dev, "Unable to parse OF data\n"); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + + iep->regs = devm_ioremap_resource(iep->dev, res); + if (IS_ERR(iep->regs)) { + ret = PTR_ERR(iep->regs); + goto err_put_clk; + } + + ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); + if (ret) { + dev_err(&pdev->dev, "Could not set DMA coherent mask.\n"); + goto err_put_clk; + } + + vb2_dma_contig_set_max_seg_size(&pdev->dev, DMA_BIT_MASK(32)); + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + ret = irq; + goto err_put_clk; + } + + /* IRQ is shared with IOMMU */ + ret = devm_request_irq(iep->dev, irq, iep_isr, IRQF_SHARED, + dev_name(iep->dev), iep); + if (ret < 0) { + dev_err(iep->dev, "failed to request irq\n"); + goto err_put_clk; + } + + mutex_init(&iep->mutex); + + ret = v4l2_device_register(&pdev->dev, &iep->v4l2_dev); + if (ret) { + dev_err(iep->dev, "Failed to register V4L2 device\n"); + + return ret; + } + + vfd = &iep->vfd; + vfd->lock = &iep->mutex; + vfd->v4l2_dev = &iep->v4l2_dev; + + snprintf(vfd->name, sizeof(vfd->name), "%s", + iep_video_device.name); + + video_set_drvdata(vfd, iep); + + ret = video_register_device(vfd, VFL_TYPE_VIDEO, 0); + if (ret) { + v4l2_err(&iep->v4l2_dev, "Failed to register video device\n"); + + goto err_v4l2; + } + + v4l2_info(&iep->v4l2_dev, + "Device %s registered as /dev/video%d\n", vfd->name, vfd->num); + + iep->m2m_dev = v4l2_m2m_init(&iep_m2m_ops); + if (IS_ERR(iep->m2m_dev)) { + v4l2_err(&iep->v4l2_dev, + "Failed to initialize V4L2 M2M device\n"); + ret = PTR_ERR(iep->m2m_dev); + + goto err_video; + } + + pm_runtime_set_autosuspend_delay(iep->dev, 100); + pm_runtime_use_autosuspend(iep->dev); + pm_runtime_enable(iep->dev); + + return ret; + +err_video: + video_unregister_device(&iep->vfd); +err_v4l2: + v4l2_device_unregister(&iep->v4l2_dev); +err_put_clk: + pm_runtime_dont_use_autosuspend(iep->dev); + pm_runtime_disable(iep->dev); + +return ret; +} + +static int iep_remove(struct platform_device *pdev) +{ + struct rockchip_iep *iep = platform_get_drvdata(pdev); + + pm_runtime_dont_use_autosuspend(iep->dev); + pm_runtime_disable(iep->dev); + + v4l2_m2m_release(iep->m2m_dev); + video_unregister_device(&iep->vfd); + v4l2_device_unregister(&iep->v4l2_dev); + + return 0; +} + +static int __maybe_unused iep_runtime_suspend(struct device *dev) +{ + struct rockchip_iep *iep = dev_get_drvdata(dev); + + clk_disable_unprepare(iep->ahb_clk); + clk_disable_unprepare(iep->axi_clk); + + return 0; +} + +static int __maybe_unused iep_runtime_resume(struct device *dev) +{ + struct rockchip_iep *iep; + int ret = 0; + + iep = dev_get_drvdata(dev); + + ret = clk_prepare_enable(iep->axi_clk); + if (ret) { + dev_err(iep->dev, "Cannot enable axi clock: %d\n", ret); + return ret; + } + + ret = clk_prepare_enable(iep->ahb_clk); + if (ret) { + dev_err(iep->dev, "Cannot enable ahb clock: %d\n", ret); + goto err_disable_axi_clk; + } + + return ret; + +err_disable_axi_clk: + clk_disable_unprepare(iep->axi_clk); + return ret; +} + +static const struct dev_pm_ops iep_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume) + SET_RUNTIME_PM_OPS(iep_runtime_suspend, + iep_runtime_resume, NULL) +}; + +static const struct of_device_id rockchip_iep_match[] = { + { + .compatible = "rockchip,rk3228-iep", + }, + {}, +}; + +MODULE_DEVICE_TABLE(of, rockchip_iep_match); + +static struct platform_driver iep_pdrv = { + .probe = iep_probe, + .remove = iep_remove, + .driver = { + .name = IEP_NAME, + .pm = &iep_pm_ops, + .of_match_table = rockchip_iep_match, + }, +}; + +module_platform_driver(iep_pdrv); + +MODULE_AUTHOR("Alex Bee <knaerzche@gmail.com>"); +MODULE_DESCRIPTION("Rockchip Image Enhancement Processor"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/media/platform/rockchip/iep/iep.h b/drivers/media/platform/rockchip/iep/iep.h new file mode 100644 index 000000000000..7d9fc61624b6 --- /dev/null +++ b/drivers/media/platform/rockchip/iep/iep.h @@ -0,0 +1,112 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Rockchip Image Enhancement Processor (IEP) driver + * + * Copyright (C) 2020 Alex Bee <knaerzche@gmail.com> + * + */ +#ifndef __IEP_H__ +#define __IEP_H__ + +#include <linux/platform_device.h> +#include <media/videobuf2-v4l2.h> +#include <media/v4l2-ctrls.h> +#include <media/v4l2-device.h> + +#define IEP_NAME "rockchip-iep" + +/* Hardware limits */ +#define IEP_MIN_WIDTH 320U +#define IEP_MAX_WIDTH 1920U + +#define IEP_MIN_HEIGHT 240U +#define IEP_MAX_HEIGHT 1088U + +/* Hardware defaults */ +#define IEP_DEFAULT_WIDTH 320U +#define IEP_DEFAULT_HEIGHT 240U + +//ns +#define IEP_TIMEOUT 250000 + +struct iep_fmt { + u32 fourcc; + u8 depth; + u8 uv_factor; + u8 color_swap; + u8 hw_format; +}; + +struct iep_frm_fmt { + struct iep_fmt *hw_fmt; + struct v4l2_pix_format pix; + + unsigned int y_stride; + unsigned int uv_stride; +}; + +struct iep_ctx { + struct v4l2_fh fh; + struct rockchip_iep *iep; + + struct iep_frm_fmt src_fmt; + struct iep_frm_fmt dst_fmt; + + struct vb2_v4l2_buffer *prev_src_buf; + struct vb2_v4l2_buffer *dst0_buf; + struct vb2_v4l2_buffer *dst1_buf; + + u32 dst_sequence; + u32 src_sequence; + + /* bff = bottom field first */ + bool field_order_bff; + bool field_bff; + + unsigned int dst_buffs_done; + + bool fmt_changed; + bool job_abort; +}; + +struct rockchip_iep { + struct v4l2_device v4l2_dev; + struct v4l2_m2m_dev *m2m_dev; + struct video_device vfd; + + struct device *dev; + + void __iomem *regs; + + struct clk *axi_clk; + struct clk *ahb_clk; + + /* vfd lock */ + struct mutex mutex; +}; + +static inline void iep_write(struct rockchip_iep *iep, u32 reg, u32 value) +{ + writel(value, iep->regs + reg); +}; + +static inline u32 iep_read(struct rockchip_iep *iep, u32 reg) +{ + return readl(iep->regs + reg); +}; + +static inline void iep_shadow_mod(struct rockchip_iep *iep, u32 reg, + u32 shadow_reg, u32 mask, u32 val) +{ + u32 temp = iep_read(iep, shadow_reg) & ~(mask); + + temp |= val & mask; + iep_write(iep, reg, temp); +}; + +static inline void iep_mod(struct rockchip_iep *iep, u32 reg, u32 mask, u32 val) +{ + iep_shadow_mod(iep, reg, reg, mask, val); +}; + +#endif From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Wed, 14 Oct 2020 20:22:38 +0200 Subject: [PATCH] ARM64: dts: rockchip: Add IEP node for RK3328 while at that also add the mmu required Signed-off-by: Alex Bee <knaerzche@gmail.com> --- arch/arm64/boot/dts/rockchip/rk3328.dtsi | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi index eec03adf0902..5455a46c9a6b 100644 --- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi @@ -760,6 +760,28 @@ vop_mmu: iommu@ff373f00 { status = "disabled"; }; + iep: iep@ff3a0000 { + compatible = "rockchip,rk3328-iep", "rockchip,rk3228-iep"; + reg = <0x0 0xff3a0000 0x0 0x800>; + interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "iep"; + clocks = <&cru ACLK_IEP>, <&cru HCLK_IEP>; + clock-names = "axi", "ahb"; + power-domains = <&power RK3328_PD_VIDEO>; + iommus = <&iep_mmu>; + }; + + iep_mmu: iommu@ff3a0800 { + compatible = "rockchip,iommu"; + reg = <0x0 0xff3a0800 0x0 0x40>; + interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "iep_mmu"; + clocks = <&cru ACLK_IEP>, <&cru HCLK_IEP>; + clock-names = "aclk", "iface"; + power-domains = <&power RK3328_PD_VIDEO>; + #iommu-cells = <0>; + }; + hdmi: hdmi@ff3c0000 { compatible = "rockchip,rk3328-dw-hdmi"; reg = <0x0 0xff3c0000 0x0 0x20000>; From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Wed, 14 Oct 2020 20:43:12 +0200 Subject: [PATCH] ARM64: dts: rockchip: Add IEP node for RK3399 Signed-off-by: Alex Bee <knaerzche@gmail.com> --- arch/arm64/boot/dts/rockchip/rk3399.dtsi | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi index dbe6a9cb98a5..f0629b7a81c6 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi @@ -1365,14 +1365,25 @@ vdec_mmu: iommu@ff660480 { #iommu-cells = <0>; }; + iep: iep@ff670000 { + compatible = "rockchip,rk3399-iep", "rockchip,rk3228-iep"; + reg = <0x0 0xff670000 0x0 0x800>; + interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH 0>; + interrupt-names = "iep"; + clocks = <&cru ACLK_IEP>, <&cru HCLK_IEP>; + clock-names = "axi", "ahb"; + power-domains = <&power RK3399_PD_IEP>; + iommus = <&iep_mmu>; + }; + iep_mmu: iommu@ff670800 { compatible = "rockchip,iommu"; reg = <0x0 0xff670800 0x0 0x40>; interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH 0>; clocks = <&cru ACLK_IEP>, <&cru HCLK_IEP>; clock-names = "aclk", "iface"; + power-domains = <&power RK3399_PD_IEP>; #iommu-cells = <0>; - status = "disabled"; }; rga: rga@ff680000 { From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee <knaerzche@gmail.com> Date: Wed, 14 Oct 2020 20:53:56 +0200 Subject: [PATCH] ARM: dts: rockchip: Add IEP node for RK3288 Signed-off-by: Alex Bee <knaerzche@gmail.com> --- arch/arm/boot/dts/rk3288.dtsi | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi index 59fba3ac6aae..06545f423de2 100644 --- a/arch/arm/boot/dts/rk3288.dtsi +++ b/arch/arm/boot/dts/rk3288.dtsi @@ -984,14 +984,25 @@ crypto: crypto@ff8a0000 { reset-names = "crypto-rst"; }; + iep: iep@ff90000 { + compatible = "rockchip,rk3288-iep", "rockchip,rk3228-iep"; + reg = <0x0 0xff900000 0x0 0x800>; + interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "iep"; + clocks = <&cru ACLK_IEP>, <&cru HCLK_IEP>; + clock-names = "axi", "ahb"; + power-domains = <&power RK3288_PD_VIO>; + iommus = <&iep_mmu>; + }; + iep_mmu: iommu@ff900800 { compatible = "rockchip,iommu"; reg = <0x0 0xff900800 0x0 0x40>; interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru ACLK_IEP>, <&cru HCLK_IEP>; clock-names = "aclk", "iface"; + power-domains = <&power RK3288_PD_VIO>; #iommu-cells = <0>; - status = "disabled"; }; isp_mmu: iommu@ff914000 { ================================================ FILE: projects/Rockchip/patches/u-boot/0001-202301-arm-rockchip-rk3399-Program-PLL-clock-for-DDR-at-50-.patch ================================================ From 2cb23b80e4169e121c520ff33cb6a60e0a0ded21 Mon Sep 17 00:00:00 2001 From: Xavier Drudis Ferran <xdrudis@tinet.cat> Date: Sat, 16 Jul 2022 12:31:45 +0200 Subject: [PATCH] arm: rockchip: rk3399: Program PLL clock for DDR at 50 MHz in documented range MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The original code set up the DDR clock to 48 MHz, not 50MHz as requested, and did it in a way that didn't satisfy the Application Notes in RK3399 TRM [1]. 2.9.2.B says: PLL frequency range requirement [...] FOUTVCO: 800MHz to 3.2GHz 2.9.2.A : PLL output frequency configuration [...] FOUTVCO = FREF / REFDIV * FBDIV FOUTPOSTDIV = FOUTVCO / POSTDIV1 / POSTDIV2 FREF = 24 MHz The original code gives FOUTVCO: 24MHz/1 * 12 = 288MHz < 800MHz And the resulting FOUTPOSTDIV is 288MHz / 3 / 2 = 48MHz but the requested frequency was 50MHz Note: 2.7.2 Detail Register Description PMUCRU_PPLL_CON0 says fbdiv Feedback Divide Value Valid divider settings are: [16, 3200] in integer mode So .fbdiv = 12 wouldn't be right. But 2.9.2.C says: PLL setting consideration [...] The following settings are valid for FBDIV: DSMPD=1 (Integer Mode): 12,13,14,16-4095 (practical value is limited to 3200, 2400, or 1600 (FVCOMAX / FREFMIN)) [...] So .fbdiv = 12 would be right. In any case FOUTVCO is still wrong. I thank YouMin Chen for confirmation and explanation. Despite documentation, I don't seem to be able to reproduce a practical problem with the wrong FOUTVCO. When I initially found it I thought some problems with detecting the RAM capacity in my Rock Pi 4B could be related to it and my patch seemed to help. But since I'm no longer able to reproduce the issue, it works with or without this patch. And meanwhile a patch[2] by Lee Jones and YouMin Chen addresses this issue. Btw, shouldn't that be commited? So this patches solves no visible problem. Yet, to prevent future problems, I think it'd be best to stick to spec. An alternative to this patch could be {.refdiv = 1, .fbdiv = 75, .postdiv1 = 6, .postdiv2 = 6}; This would theoretically consume more power and yield less jitter, according to 2.9.2.C : PLL setting consideration [...] For lowest power operation, the minimum VCO and FREF frequencies should be used. For minimum jitter operation, the highest VCO and FREF frequencies should be used. [...] But I haven't tried it because I don't think it matters much. 50MHz for DDR is only shortly used by TPL at RAM init. Normal operation is at 800MHz. Maybe it's better to use less power until later when more complex software can control batteries or charging or whatever ? Cc: Simon Glass <sjg@chromium.org> Cc: Philipp Tomsich <philipp.tomsich@vrull.eu> Cc: Kever Yang <kever.yang@rock-chips.com> Cc: Lukasz Majewski <lukma@denx.de> Cc: Sean Anderson <seanga2@gmail.com> Link: [1] https://opensource.rock-chips.com/images/e/ee/Rockchip_RK3399TRM_V1.4_Part1-20170408.pdf Link: [2] https://patchwork.ozlabs.org/project/uboot/list/?series=305766 Signed-off-by: Xavier Drudis Ferran <xdrudis@tinet.cat> Tested-by: Michal Suchánek <msuchanek@suse.de> Reviewed-by: Kever Yang <kever.yang@rock-chips.com> --- drivers/clk/rockchip/clk_rk3399.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/clk/rockchip/clk_rk3399.c b/drivers/clk/rockchip/clk_rk3399.c index 97bf1c6e15..eaeac451df 100644 --- a/drivers/clk/rockchip/clk_rk3399.c +++ b/drivers/clk/rockchip/clk_rk3399.c @@ -856,7 +856,7 @@ static ulong rk3399_ddr_set_clk(struct rockchip_cru *cru, switch (set_rate) { case 50 * MHz: dpll_cfg = (struct pll_div) - {.refdiv = 1, .fbdiv = 12, .postdiv1 = 3, .postdiv2 = 2}; + {.refdiv = 2, .fbdiv = 75, .postdiv1 = 3, .postdiv2 = 6}; break; case 200 * MHz: dpll_cfg = (struct pll_div) -- 2.39.0 ================================================ FILE: projects/Samsung/bootloader/config ================================================ CONFIG_LZ4=y CONFIG_LZO=y CONFIG_LZMA=y CONFIG_BOOTDELAY=0 #CC_OPTIMIZE_FOR_SIZE=n #CC_OPTIMIZE_LIBS_FOR_SPEED=y ================================================ FILE: projects/Samsung/bootloader/install ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) echo "$BOOTLOADER: copying u-boot-dtb.bin" cp -av u-boot-dtb.bin $INSTALL/usr/share/bootloader echo "$BOOTLOADER: copying odroid firmware" FIPDIR="$(get_build_dir exynos-boot-fip)" cp -av $FIPDIR/bl1.bin.hardkernel $INSTALL/usr/share/bootloader cp -av $FIPDIR/bl2.bin.hardkernel.720k_uboot $INSTALL/usr/share/bootloader cp -av $FIPDIR/tzsw.bin.hardkernel $INSTALL/usr/share/bootloader ================================================ FILE: projects/Samsung/bootloader/mkimage ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) . config/options "" mkimage_uboot(){ echo "image: writing u-boot to $(basename $DISK)" dd if="$INSTALL/usr/share/bootloader/bl1.bin.hardkernel" of="$DISK" bs=512 seek=1 conv=notrunc >"$SAVE_ERROR" 2>&1 || show_error dd if="$INSTALL/usr/share/bootloader/bl2.bin.hardkernel.720k_uboot" of="$DISK" bs=512 seek=31 conv=notrunc >"$SAVE_ERROR" 2>&1 || show_error dd if="$INSTALL/usr/share/bootloader/u-boot-dtb.bin" of="$DISK" bs=512 seek=63 conv=notrunc >"$SAVE_ERROR" 2>&1 || show_error dd if="$INSTALL/usr/share/bootloader/tzsw.bin.hardkernel" of="$DISK" bs=512 seek=1503 conv=notrunc >"$SAVE_ERROR" 2>&1 || show_error mcopy -s -o "$INSTALL/usr/share/bootloader/u-boot-dtb.bin" :: } mkimage_extlinux(){ echo "image: copying exlinux.conf" mkdir -p "${LE_TMP}/extlinux" cat << EOF > "${LE_TMP}/extlinux/extlinux.conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDT /${DTB} APPEND boot=LABEL=${DISTRO_BOOTLABEL} disk=LABEL=${DISTRO_DISKLABEL} ${EXTRA_CMDLINE} EOF mcopy -s -o "${LE_TMP}/extlinux" :: } mkimage_dtb(){ if [ "$DTB" != "@@DTB_NAME@@" ]; then echo "image: copying device tree" mcopy -s -o "${RELEASE_DIR}/3rdparty/bootloader/dtb/$DTB" :: else echo "image: copying device trees" mcopy -s -o "${RELEASE_DIR}/3rdparty/bootloader/dtb" :: fi } case "${UBOOT_SYSTEM}" in odroid*) mkimage_uboot mkimage_extlinux mkimage_dtb ;; esac ================================================ FILE: projects/Samsung/bootloader/release ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) SRCDIR="$BUILD/image/system/usr/share/bootloader" DSTDIR="$RELEASE_DIR/3rdparty/bootloader" mkdir -p "$DSTDIR/dtb" cp -a "$SRCDIR"/*xu{3,4}.dtb "$DSTDIR/dtb" ================================================ FILE: projects/Samsung/bootloader/update.sh ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) [ -z "$SYSTEM_ROOT" ] && SYSTEM_ROOT="" [ -z "$BOOT_ROOT" ] && BOOT_ROOT="/flash" [ -z "$BOOT_PART" ] && BOOT_PART=$(df "$BOOT_ROOT" | tail -1 | awk {' print $1 '}) # identify the boot device if [ -z "$BOOT_DISK" ]; then case $BOOT_PART in /dev/sd[a-z][0-9]*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,[0-9]*,,g") ;; /dev/mmcblk*) BOOT_DISK=$(echo $BOOT_PART | sed -e "s,p[0-9]*,,g") ;; esac fi # mount $BOOT_ROOT rw mount -o remount,rw $BOOT_ROOT # update extlinux device trees if [ -f $BOOT_ROOT/extlinux/extlinux.conf ]; then for dtbfile in $BOOT_ROOT/*.dtb ; do dtb=$(basename $dtbfile) echo "Updating $dtb" cp -p $SYSTEM_ROOT/usr/share/bootloader/$dtb $BOOT_ROOT/ 2>/dev/null || true done fi # mount $BOOT_ROOT ro sync mount -o remount,ro $BOOT_ROOT ================================================ FILE: projects/Samsung/devices/Exynos/options ================================================ ################################################################################ # setup device defaults ################################################################################ # The TARGET_CPU variable controls which processor should be targeted for # generated code. case $TARGET_ARCH in arm) TARGET_CPU="cortex-a15.cortex-a7" TARGET_FLOAT="hard" TARGET_FPU="neon-vfpv4" ;; esac # OpenGL-ES implementation to use OPENGLES="mesa" # Graphic drivers to use GRAPHIC_DRIVERS="panfrost" # KODI Player implementation to use KODIPLAYER_DRIVER="$OPENGLES" # Mali GPU family MALI_FAMILY="t620" ================================================ FILE: projects/Samsung/filesystem/usr/bin/cputemp ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) # XU4 has 5x sensors so read them all and report the highest value TEMP=$(cat /sys/devices/virtual/thermal/thermal_zone*/temp | sort -n | tail -1) TEMP="$(( $TEMP / 1000 ))" echo "${TEMP} C" ================================================ FILE: projects/Samsung/filesystem/usr/config/pulse-daemon.conf.d/daemon.conf ================================================ load-default-script-file = yes default-script-file = /storage/.config/pulse-daemon.conf.d/system.pa default-sample-rate = 48000 ================================================ FILE: projects/Samsung/filesystem/usr/config/pulse-daemon.conf.d/system.pa ================================================ #!/usr/bin/pulseaudio -nF # # This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. # This startup script is used only if PulseAudio is started in system # mode. ### Load several protocols .ifexists module-esound-protocol-unix.so load-module module-esound-protocol-unix .endif load-module module-native-protocol-unix ### Automatically restore the volume of streams and devices load-module module-stream-restore load-module module-device-restore ### Automatically restore the default sink/source when changed by the user ### during runtime ### NOTE: This should be loaded as early as possible so that subsequent modules ### that look up the default sink/source get the right value load-module module-default-device-restore ### Automatically move streams to the default sink if the sink they are ### connected to dies, similar for sources load-module module-rescue-streams ### Make sure we always have a sink around, even if it is a null sink. load-module module-always-sink ### Automatically suspend sinks/sources that become idle for too long load-module module-suspend-on-idle ### Enable positioned event sounds load-module module-position-event-sounds # Set ALSA audio device manually # load-module module-alsa-sink device=hw:0,1 # Detect ALSA audio devices using udev load-module module-udev-detect # Ensures that passthrough streams are always allowed to play on sinks load-module module-allow-passthrough ### Automatically load modules for dbus .ifexists module-dbus-protocol.so load-module module-dbus-protocol .endif ### Automatically load modules for bluetooth .ifexists module-bluetooth-policy.so load-module module-bluetooth-policy .endif .ifexists module-bluetooth-discover.so load-module module-bluetooth-discover .endif .ifexists module-zeroconf-publish.so load-module module-zeroconf-publish .endif load-module module-native-protocol-tcp auth-anonymous=1 load-module module-switch-on-connect ================================================ FILE: projects/Samsung/linux/linux.arm.conf ================================================ # # Automatically generated file; DO NOT EDIT. # Linux/arm 6.1.0-rc6 Kernel Configuration # CONFIG_CC_VERSION_TEXT="armv7ve-libreelec-linux-gnueabihf-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION_AUTO=y CONFIG_BUILD_SALT="" CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_LZMA=y CONFIG_HAVE_KERNEL_XZ=y CONFIG_HAVE_KERNEL_LZO=y CONFIG_HAVE_KERNEL_LZ4=y # CONFIG_KERNEL_GZIP is not set # CONFIG_KERNEL_LZMA is not set # CONFIG_KERNEL_XZ is not set # CONFIG_KERNEL_LZO is not set CONFIG_KERNEL_LZ4=y CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="@DISTRONAME@" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set CONFIG_HAVE_ARCH_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_SHOW_LEVEL=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_IRQ_IPI=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_GENERIC_IRQ_MULTI_HANDLER=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_CONTEXT_TRACKING=y CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y # CONFIG_BPF_JIT is not set # CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_BPF_PRELOAD is not set # end of BPF subsystem CONFIG_PREEMPT_BUILD=y # CONFIG_PREEMPT_NONE is not set # CONFIG_PREEMPT_VOLUNTARY is not set CONFIG_PREEMPT=y CONFIG_PREEMPT_COUNT=y CONFIG_PREEMPTION=y # # CPU/Task time and stats accounting # CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set CONFIG_SCHED_THERMAL_PRESSURE=y # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_TASKSTATS is not set # CONFIG_PSI is not set # end of CPU/Task time and stats accounting CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y CONFIG_PREEMPT_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_RCU=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem # CONFIG_IKCONFIG is not set # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=17 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 # CONFIG_PRINTK_INDEX is not set CONFIG_GENERIC_SCHED_CLOCK=y # # Scheduler features # # end of Scheduler features CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set CONFIG_CGROUP_PIDS=y # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y # CONFIG_CGROUP_MISC is not set # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set # CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 CONFIG_RD_GZIP=y CONFIG_RD_BZIP2=y CONFIG_RD_LZMA=y CONFIG_RD_XZ=y CONFIG_RD_LZO=y CONFIG_RD_LZ4=y CONFIG_RD_ZSTD=y # CONFIG_INITRAMFS_COMPRESSION_GZIP is not set # CONFIG_INITRAMFS_COMPRESSION_BZIP2 is not set # CONFIG_INITRAMFS_COMPRESSION_LZMA is not set # CONFIG_INITRAMFS_COMPRESSION_XZ is not set # CONFIG_INITRAMFS_COMPRESSION_LZO is not set # CONFIG_INITRAMFS_COMPRESSION_LZ4 is not set # CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set CONFIG_INITRAMFS_COMPRESSION_NONE=y # CONFIG_BOOT_CONFIG is not set CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y # CONFIG_EXPERT is not set CONFIG_UID16=y CONFIG_MULTIUSER=y CONFIG_SYSFS_SYSCALL=y CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y 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 CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_EMBEDDED is not set CONFIG_HAVE_PERF_EVENTS=y CONFIG_PERF_USE_VMALLOC=y # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_SYSTEM_DATA_VERIFICATION=y # CONFIG_PROFILING is not set CONFIG_TRACEPOINTS=y # end of General setup CONFIG_ARM=y CONFIG_ARM_HAS_GROUP_RELOCS=y CONFIG_ARM_DMA_USE_IOMMU=y CONFIG_ARM_DMA_IOMMU_ALIGNMENT=8 CONFIG_SYS_SUPPORTS_APM_EMULATION=y CONFIG_HAVE_PROC_CPU=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_LOCKDEP_SUPPORT=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_ARM_PATCH_PHYS_VIRT=y CONFIG_GENERIC_BUG=y CONFIG_PGTABLE_LEVELS=2 # # System Type # CONFIG_MMU=y CONFIG_ARCH_MMAP_RND_BITS_MIN=8 CONFIG_ARCH_MMAP_RND_BITS_MAX=16 CONFIG_ARCH_MULTIPLATFORM=y # # Platform selection # # # CPU Core family selection # # CONFIG_ARCH_MULTI_V6 is not set CONFIG_ARCH_MULTI_V7=y CONFIG_ARCH_MULTI_V6_V7=y # end of Platform selection # CONFIG_ARCH_VIRT is not set # CONFIG_ARCH_AIROHA is not set # CONFIG_ARCH_ACTIONS is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_ARTPEC is not set # CONFIG_ARCH_ASPEED is not set # CONFIG_ARCH_AT91 is not set # CONFIG_ARCH_BCM is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_DIGICOLOR is not set # CONFIG_ARCH_DOVE is not set CONFIG_ARCH_EXYNOS=y CONFIG_S5P_DEV_MFC=y # CONFIG_ARCH_EXYNOS3 is not set # CONFIG_ARCH_EXYNOS4 is not set CONFIG_ARCH_EXYNOS5=y # # Exynos SoCs # # CONFIG_SOC_EXYNOS5250 is not set # CONFIG_SOC_EXYNOS5260 is not set # CONFIG_SOC_EXYNOS5410 is not set CONFIG_SOC_EXYNOS5420=y # CONFIG_SOC_EXYNOS5800 is not set CONFIG_EXYNOS_MCPM=y CONFIG_EXYNOS_CPU_SUSPEND=y # CONFIG_ARCH_HIGHBANK is not set # CONFIG_ARCH_HISI is not set # CONFIG_ARCH_HPE is not set # CONFIG_ARCH_MXC is not set # 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_MSTARV7 is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_NPCM is not set # # TI OMAP/AM/DM/DRA Family # # CONFIG_ARCH_OMAP3 is not set # CONFIG_ARCH_OMAP4 is not set # CONFIG_SOC_OMAP5 is not set # CONFIG_SOC_AM33XX is not set # CONFIG_SOC_AM43XX is not set # CONFIG_SOC_DRA7XX is not set # end of TI OMAP/AM/DM/DRA Family # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_RDA is not set # CONFIG_ARCH_REALTEK is not set # CONFIG_ARCH_ROCKCHIP is not set # CONFIG_ARCH_S5PV210 is not set # CONFIG_ARCH_RENESAS is not set # CONFIG_ARCH_INTEL_SOCFPGA is not set # CONFIG_PLAT_SPEAR is not set # CONFIG_ARCH_STI is not set # CONFIG_ARCH_STM32 is not set # CONFIG_ARCH_SUNPLUS is not set # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_U8500 is not set # CONFIG_ARCH_REALVIEW is not set # CONFIG_ARCH_VEXPRESS is not set # CONFIG_ARCH_WM8850 is not set # CONFIG_ARCH_ZYNQ is not set # # Processor Type # CONFIG_CPU_V7=y CONFIG_CPU_THUMB_CAPABLE=y CONFIG_CPU_32v6K=y CONFIG_CPU_32v7=y CONFIG_CPU_ABRT_EV7=y CONFIG_CPU_PABRT_V7=y CONFIG_CPU_CACHE_V7=y CONFIG_CPU_CACHE_VIPT=y CONFIG_CPU_COPY_V6=y CONFIG_CPU_TLB_V7=y CONFIG_CPU_HAS_ASID=y CONFIG_CPU_CP15=y CONFIG_CPU_CP15_MMU=y # # Processor Features # # CONFIG_ARM_LPAE is not set CONFIG_ARM_THUMB=y # CONFIG_ARM_THUMBEE is not set CONFIG_ARM_VIRT_EXT=y CONFIG_SWP_EMULATE=y CONFIG_CPU_LITTLE_ENDIAN=y # CONFIG_CPU_BIG_ENDIAN is not set # CONFIG_CPU_ICACHE_DISABLE is not set CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND=y # CONFIG_CPU_BPREDICT_DISABLE is not set CONFIG_CPU_SPECTRE=y CONFIG_HARDEN_BRANCH_PREDICTOR=y CONFIG_HARDEN_BRANCH_HISTORY=y CONFIG_KUSER_HELPERS=y CONFIG_VDSO=y CONFIG_OUTER_CACHE=y CONFIG_OUTER_CACHE_SYNC=y CONFIG_MIGHT_HAVE_CACHE_L2X0=y CONFIG_CACHE_L2X0=y # CONFIG_CACHE_L2X0_PMU is not set # CONFIG_PL310_ERRATA_588369 is not set # CONFIG_PL310_ERRATA_727915 is not set # CONFIG_PL310_ERRATA_753970 is not set # CONFIG_PL310_ERRATA_769419 is not set CONFIG_ARM_L1_CACHE_SHIFT_6=y CONFIG_ARM_L1_CACHE_SHIFT=6 CONFIG_ARM_DMA_MEM_BUFFERABLE=y CONFIG_ARM_HEAVY_MB=y CONFIG_DEBUG_ALIGN_RODATA=y # CONFIG_ARM_ERRATA_430973 is not set # CONFIG_ARM_ERRATA_643719 is not set # CONFIG_ARM_ERRATA_720789 is not set # CONFIG_ARM_ERRATA_754322 is not set # CONFIG_ARM_ERRATA_754327 is not set # CONFIG_ARM_ERRATA_764369 is not set # CONFIG_ARM_ERRATA_764319 is not set # CONFIG_ARM_ERRATA_775420 is not set CONFIG_ARM_ERRATA_798181=y CONFIG_ARM_ERRATA_773022=y # CONFIG_ARM_ERRATA_818325_852422 is not set # CONFIG_ARM_ERRATA_821420 is not set # CONFIG_ARM_ERRATA_825619 is not set # CONFIG_ARM_ERRATA_857271 is not set # CONFIG_ARM_ERRATA_852421 is not set # CONFIG_ARM_ERRATA_852423 is not set # CONFIG_ARM_ERRATA_857272 is not set # end of System Type # # Bus support # # CONFIG_ARM_ERRATA_814220 is not set # end of Bus support # # Kernel Features # CONFIG_HAVE_SMP=y CONFIG_SMP=y CONFIG_SMP_ON_UP=y CONFIG_CURRENT_POINTER_IN_TPIDRURO=y CONFIG_IRQSTACKS=y CONFIG_ARM_CPU_TOPOLOGY=y CONFIG_SCHED_MC=y # CONFIG_SCHED_SMT is not set CONFIG_HAVE_ARM_SCU=y CONFIG_HAVE_ARM_ARCH_TIMER=y CONFIG_MCPM=y CONFIG_BIG_LITTLE=y # CONFIG_BL_SWITCHER is not set CONFIG_VMSPLIT_3G=y # CONFIG_VMSPLIT_3G_OPT is not set # CONFIG_VMSPLIT_2G is not set # CONFIG_VMSPLIT_1G is not set CONFIG_PAGE_OFFSET=0xC0000000 CONFIG_NR_CPUS=8 CONFIG_HOTPLUG_CPU=y # CONFIG_ARM_PSCI is not set CONFIG_ARCH_NR_GPIO=512 CONFIG_HZ_FIXED=0 CONFIG_HZ_100=y # CONFIG_HZ_200 is not set # CONFIG_HZ_250 is not set # CONFIG_HZ_300 is not set # CONFIG_HZ_500 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=100 CONFIG_SCHED_HRTICK=y # CONFIG_THUMB2_KERNEL is not set CONFIG_ARM_PATCH_IDIV=y CONFIG_AEABI=y # CONFIG_OABI_COMPAT is not set CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ARCH_FLATMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_HIGHMEM=y CONFIG_HIGHPTE=y CONFIG_CPU_SW_DOMAIN_PAN=y CONFIG_HW_PERF_EVENTS=y CONFIG_ARM_MODULE_PLTS=y CONFIG_ARCH_FORCE_MAX_ORDER=11 CONFIG_ALIGNMENT_TRAP=y # CONFIG_UACCESS_WITH_MEMCPY is not set # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_XEN is not set CONFIG_CC_HAVE_STACKPROTECTOR_TLS=y CONFIG_STACKPROTECTOR_PER_TASK=y # end of Kernel Features # # Boot options # CONFIG_USE_OF=y CONFIG_ATAGS=y # CONFIG_UNUSED_BOARD_FILES is not set # CONFIG_DEPRECATED_PARAM_STRUCT is not set CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_BSS=0x0 CONFIG_ARM_APPENDED_DTB=y CONFIG_ARM_ATAG_DTB_COMPAT=y CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y # CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND is not set CONFIG_CMDLINE="" # CONFIG_KEXEC is not set # CONFIG_CRASH_DUMP is not set CONFIG_AUTO_ZRELADDR=y # CONFIG_EFI is not set # end of Boot options # # CPU Power Management # # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_GOV_USERSPACE is not set CONFIG_CPU_FREQ_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set # # CPU frequency scaling drivers # CONFIG_CPUFREQ_DT=y CONFIG_CPUFREQ_DT_PLATDEV=y # end of CPU Frequency scaling # # CPU Idle # CONFIG_CPU_IDLE=y # CONFIG_CPU_IDLE_GOV_LADDER is not set CONFIG_CPU_IDLE_GOV_MENU=y # CONFIG_CPU_IDLE_GOV_TEO is not set # # ARM CPU Idle Drivers # # CONFIG_ARM_CPUIDLE is not set # CONFIG_ARM_BIG_LITTLE_CPUIDLE is not set CONFIG_ARM_EXYNOS_CPUIDLE=y # end of ARM CPU Idle Drivers CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED=y # end of CPU Idle # end of CPU Power Management # # Floating point emulation # # # At least one emulation must be selected # CONFIG_VFP=y CONFIG_VFPv3=y CONFIG_NEON=y CONFIG_KERNEL_MODE_NEON=y # end of Floating point emulation # # Power management options # CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_USERSPACE_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y CONFIG_PM_DEBUG=y CONFIG_PM_ADVANCED_DEBUG=y # CONFIG_PM_TEST_SUSPEND is not set CONFIG_PM_SLEEP_DEBUG=y # CONFIG_APM_EMULATION is not set CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_PM_GENERIC_DOMAINS_SLEEP=y CONFIG_PM_GENERIC_DOMAINS_OF=y CONFIG_CPU_PM=y CONFIG_ENERGY_MODEL=y CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ARM_CPU_SUSPEND=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y # end of Power management options CONFIG_AS_VFP_VMRS_FPINST=y # # General architecture-dependent options # # CONFIG_KPROBES is not set # CONFIG_JUMP_LABEL is not set CONFIG_UPROBES=y CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_ARCH_USE_BUILTIN_BSWAP=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_KEEPINITRD=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_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_LTO_NONE=y CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_REL=y CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=8 CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_HAVE_ARCH_PFN_VALID=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_GZIP is not set # CONFIG_MODULE_COMPRESS_XZ is not set # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y # CONFIG_BLOCK_LEGACY_AUTOLOAD is not set CONFIG_BLK_CGROUP_RWSTAT=y CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_DEV_THROTTLING_LOW is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_CGROUP_IOLATENCY is not set # CONFIG_BLK_CGROUP_IOCOST is not set # CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set # end of Partition Types CONFIG_BLK_PM=y CONFIG_BLOCK_HOLDER_DEPRECATED=y CONFIG_BLK_MQ_STACKING=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y # CONFIG_IOSCHED_BFQ is not set # end of IO Schedulers CONFIG_ASN1=y CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_ELF_FDPIC is not set CONFIG_ELFCORE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y CONFIG_ARCH_HAS_BINFMT_FLAT=y # CONFIG_BINFMT_FLAT is not set CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # CONFIG_SWAP=y # CONFIG_ZSWAP is not set # # SLAB allocator options # # CONFIG_SLAB is not set CONFIG_SLUB=y CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y # end of SLAB allocator options # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set CONFIG_COMPAT_BRK=y CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_ARCH_KEEP_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_COMPACTION=y CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 # CONFIG_PAGE_REPORTING is not set CONFIG_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_BOUNCE=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set # CONFIG_CMA_DEBUGFS is not set # CONFIG_CMA_SYSFS is not set CONFIG_CMA_AREAS=7 CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set CONFIG_KMAP_LOCAL=y CONFIG_KMAP_LOCAL_NON_LINEAR_PTE_ARRAY=y # CONFIG_ANON_VMA_NAME is not set # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y CONFIG_NET_INGRESS=y CONFIG_NET_EGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y # CONFIG_XFRM_INTERFACE is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_ESP=y CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set # CONFIG_XDP_SOCKETS is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y CONFIG_IP_PNP_RARP=y # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=y # CONFIG_IP_MROUTE is not set # CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set CONFIG_INET_ESP=y # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=y CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_INET_UDP_DIAG is not set # CONFIG_INET_RAW_DIAG is not set # CONFIG_INET_DIAG_DESTROY is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_IPV6_VTI is not set CONFIG_IPV6_SIT=y # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set CONFIG_IPV6_FOU=m # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set # CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=m # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_EGRESS=y CONFIG_NETFILTER_FAMILY_BRIDGE=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set # CONFIG_NETFILTER_NETLINK_LOG is not set # CONFIG_NETFILTER_NETLINK_OSF is not set CONFIG_NF_CONNTRACK=m # CONFIG_NF_LOG_SYSLOG is not set # CONFIG_NF_CONNTRACK_MARK is not set # CONFIG_NF_CONNTRACK_ZONES is not set # CONFIG_NF_CONNTRACK_PROCFS is not set # CONFIG_NF_CONNTRACK_EVENTS is not set # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y # CONFIG_NF_CONNTRACK_AMANDA is not set CONFIG_NF_CONNTRACK_FTP=m # CONFIG_NF_CONNTRACK_H323 is not set # CONFIG_NF_CONNTRACK_IRC is not set # CONFIG_NF_CONNTRACK_NETBIOS_NS is not set # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set # CONFIG_NF_CONNTRACK_SIP is not set CONFIG_NF_CONNTRACK_TFTP=m # CONFIG_NF_CT_NETLINK is not set CONFIG_NF_NAT=m 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 # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=m # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set CONFIG_NETFILTER_XT_MATCH_IPVS=m # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_NETFILTER_XT_MATCH_OWNER is not set # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set # CONFIG_NETFILTER_XT_MATCH_STATE is not set # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set CONFIG_IP_VS=m # CONFIG_IP_VS_IPV6 is not set # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # CONFIG_IP_VS_PROTO_ESP is not set # CONFIG_IP_VS_PROTO_AH is not set # CONFIG_IP_VS_PROTO_SCTP is not set # # IPVS scheduler # CONFIG_IP_VS_RR=m # CONFIG_IP_VS_WRR is not set # CONFIG_IP_VS_LC is not set # CONFIG_IP_VS_WLC is not set # CONFIG_IP_VS_FO is not set # CONFIG_IP_VS_OVF is not set # CONFIG_IP_VS_LBLC is not set # CONFIG_IP_VS_LBLCR is not set # CONFIG_IP_VS_DH is not set # CONFIG_IP_VS_SH is not set # CONFIG_IP_VS_MH is not set # CONFIG_IP_VS_SED is not set # CONFIG_IP_VS_NQ is not set # CONFIG_IP_VS_TWOS is not set # # IPVS SH scheduler # CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS MH scheduler # CONFIG_IP_VS_MH_TAB_INDEX=12 # # IPVS application helper # # CONFIG_IP_VS_FTP is not set CONFIG_IP_VS_NFCT=y # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set CONFIG_NF_REJECT_IPV4=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_ARPTABLES is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m # CONFIG_NF_LOG_IPV6 is not set CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set # CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_MATCH_SRH is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m # CONFIG_IP6_NF_RAW is not set CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_TARGET_MASQUERADE=m # CONFIG_IP6_NF_TARGET_NPT is not set # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_CONNTRACK_BRIDGE is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y # CONFIG_BRIDGE_MRP is not set # CONFIG_BRIDGE_CFM is not set # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=m # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_VLAN_8021Q_MVRP is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set # CONFIG_NET_SCH_FQ_CODEL is not set # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set # CONFIG_NET_SCH_DEFAULT is not set # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_TCINDEX is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_RSVP is not set # CONFIG_NET_CLS_RSVP6 is not set # CONFIG_NET_CLS_FLOW is not set CONFIG_NET_CLS_CGROUP=m # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set # CONFIG_NET_EMATCH is not set # CONFIG_NET_CLS_ACT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set # CONFIG_MPLS is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set CONFIG_NET_L3_MASTER_DEV=y # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_STREAM_PARSER is not set CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # end of Network testing # end of Networking options # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=m CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y CONFIG_BT_BNEP=m CONFIG_BT_BNEP_MC_FILTER=y CONFIG_BT_BNEP_PROTO_FILTER=y CONFIG_BT_HIDP=m CONFIG_BT_HS=y CONFIG_BT_LE=y CONFIG_BT_LEDS=y # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set CONFIG_BT_DEBUGFS=y # CONFIG_BT_SELFTEST is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_HCIBTUSB=m # CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set CONFIG_BT_HCIBTUSB_BCM=y # CONFIG_BT_HCIBTUSB_MTK is not set CONFIG_BT_HCIBTUSB_RTL=y CONFIG_BT_HCIBTSDIO=m CONFIG_BT_HCIUART=m CONFIG_BT_HCIUART_H4=y CONFIG_BT_HCIUART_BCSP=y CONFIG_BT_HCIUART_ATH3K=y CONFIG_BT_HCIUART_INTEL=y CONFIG_BT_HCIUART_AG6XX=y CONFIG_BT_HCIBCM203X=m CONFIG_BT_HCIBPA10X=m CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIVHCI=m CONFIG_BT_MRVL=m CONFIG_BT_MRVL_SDIO=m CONFIG_BT_ATH3K=m # CONFIG_BT_MTKSDIO is not set # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set CONFIG_CFG80211_CRDA_SUPPORT=y CONFIG_CFG80211_WEXT=y CONFIG_LIB80211=m CONFIG_LIB80211_CRYPT_WEP=m CONFIG_LIB80211_CRYPT_CCMP=m # CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=m CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" # CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set # CONFIG_LWTUNNEL is not set CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_PAGE_POOL=y # CONFIG_PAGE_POOL_STATS is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y # # Device Drivers # CONFIG_ARM_AMBA=y CONFIG_HAVE_PCI=y # CONFIG_PCI is not set # CONFIG_PCCARD is not set # # Generic Driver Options # # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y # CONFIG_DEVTMPFS_SAFE is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set CONFIG_FW_CACHE=y # CONFIG_FW_UPLOAD is not set # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y CONFIG_ALLOW_DEV_COREDUMP=y CONFIG_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_SOC_BUS=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set CONFIG_GENERIC_ARCH_TOPOLOGY=y # end of Generic Driver Options # # Bus devices # CONFIG_ARM_CCI=y CONFIG_ARM_CCI400_COMMON=y CONFIG_ARM_CCI400_PORT_CTRL=y # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_MOXTET is not set # CONFIG_VEXPRESS_CONFIG is not set # CONFIG_MHI_BUS is not set # CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # # CONFIG_ARM_SCMI_PROTOCOL is not set # end of ARM System Control and Management Interface Protocol # CONFIG_FW_CFG_SYSFS is not set # CONFIG_TRUSTED_FOUNDATIONS is not set # CONFIG_GOOGLE_FIRMWARE is not set CONFIG_HAVE_ARM_SMCCC=y # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set # CONFIG_MTD is not set CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set CONFIG_OF_FLATTREE=y CONFIG_OF_EARLY_FLATTREE=y CONFIG_OF_KOBJ=y CONFIG_OF_DYNAMIC=y CONFIG_OF_ADDRESS=y CONFIG_OF_IRQ=y CONFIG_OF_RESERVED_MEM=y CONFIG_OF_RESOLVE=y CONFIG_OF_OVERLAY=y CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_CDROM=y # CONFIG_ZRAM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_DRBD is not set CONFIG_BLK_DEV_NBD=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=4096 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_UBLK is not set # # NVME Support # # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set # CONFIG_NVME_TARGET is not set # end of NVME Support # # Misc devices # # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set CONFIG_SRAM=y CONFIG_SRAM_EXEC=y # CONFIG_XILINX_SDFEC is not set # CONFIG_HISI_HIKEY_USB is not set # CONFIG_OPEN_DICE is not set # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # CONFIG_ECHO is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_UACCE is not set # CONFIG_PVPANIC is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=m CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_SCAN_ASYNC is not set # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_DH is not set # end of SCSI device support # CONFIG_ATA is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=m # CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m # CONFIG_DM_UNSTRIPED is not set # CONFIG_DM_CRYPT is not set # CONFIG_DM_SNAPSHOT is not set CONFIG_DM_THIN_PROVISIONING=m # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_ERA is not set # CONFIG_DM_CLONE is not set # CONFIG_DM_MIRROR is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_DUST is not set # CONFIG_DM_UEVENT is not set # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_DM_INTEGRITY is not set # CONFIG_TARGET_CORE is not set CONFIG_NETDEVICES=y CONFIG_MII=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set CONFIG_DUMMY=m CONFIG_WIREGUARD=m # CONFIG_WIREGUARD_DEBUG is not set # CONFIG_EQUALIZER is not set # 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 # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_AMT is not set # CONFIG_MACSEC is not set CONFIG_NETCONSOLE=y CONFIG_NETCONSOLE_DYNAMIC=y CONFIG_NETPOLL=y CONFIG_NET_POLL_CONTROLLER=y CONFIG_TUN=y # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m CONFIG_NLMON=m CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_ALACRITECH is not set # CONFIG_ALTERA_TSE is not set # CONFIG_NET_VENDOR_AMAZON is not set # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set # CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_BROADCOM is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CIRRUS is not set # CONFIG_NET_VENDOR_CORTINA is not set # CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_ENGLEDER is not set # CONFIG_NET_VENDOR_EZCHIP is not set # CONFIG_NET_VENDOR_FARADAY is not set # CONFIG_NET_VENDOR_FUNGIBLE is not set # CONFIG_NET_VENDOR_GOOGLE is not set # CONFIG_NET_VENDOR_HISILICON is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_INTEL is not set # CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_NET_VENDOR_ADI is not set # CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set # CONFIG_NET_VENDOR_MICROSOFT is not set # CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NETRONOME is not set # CONFIG_ETHOC is not set # CONFIG_NET_VENDOR_PENSANDO is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RENESAS is not set # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set # CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set # CONFIG_NET_VENDOR_STMICRO is not set # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set CONFIG_PHYLINK=y CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_SFP is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_ADIN_PHY is not set # CONFIG_ADIN1100_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=y # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM54140_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set # CONFIG_MAXLINEAR_GPHY is not set # CONFIG_MEDIATEK_GE_PHY is not set # CONFIG_MICREL_PHY is not set CONFIG_MICROCHIP_PHY=m # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set # CONFIG_MOTORCOMM_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_QSEMI_PHY is not set # CONFIG_REALTEK_PHY is not set # CONFIG_RENESAS_PHY is not set # CONFIG_ROCKCHIP_PHY is not set CONFIG_SMSC_PHY=y # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_DP83TD510_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set # CONFIG_PSE_CONTROLLER is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_OF_MDIO=y CONFIG_MDIO_DEVRES=y # CONFIG_MDIO_BITBANG is not set # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_IPQ4019 is not set # CONFIG_MDIO_IPQ8064 is not set # # MDIO Multiplexers # # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set # # PCS device drivers # # end of PCS device drivers # CONFIG_PPP is not set # CONFIG_SLIP is not set CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set CONFIG_USB_RTL8150=m CONFIG_USB_RTL8152=y CONFIG_USB_LAN78XX=m CONFIG_USB_USBNET=y CONFIG_USB_NET_AX8817X=y CONFIG_USB_NET_AX88179_178A=y CONFIG_USB_NET_CDCETHER=y # CONFIG_USB_NET_CDC_EEM is not set # CONFIG_USB_NET_CDC_NCM is not set # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set CONFIG_USB_NET_DM9601=y # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=y # CONFIG_USB_NET_GL620A is not set # CONFIG_USB_NET_NET1080 is not set # CONFIG_USB_NET_PLUSB is not set CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m # CONFIG_USB_NET_CDC_SUBSET is not set # CONFIG_USB_NET_ZAURUS is not set # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set # CONFIG_USB_HSO is not set # CONFIG_USB_NET_INT51X1 is not set CONFIG_USB_IPHETH=m # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set CONFIG_USB_RTL8153_ECM=y CONFIG_WLAN=y # CONFIG_WLAN_VENDOR_ADMTEK is not set CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m CONFIG_ATH9K_AHB=y # CONFIG_ATH9K_DEBUGFS is not set # CONFIG_ATH9K_DYNACK is not set # CONFIG_ATH9K_WOW is not set CONFIG_ATH9K_RFKILL=y CONFIG_ATH9K_CHANNEL_CONTEXT=y CONFIG_ATH9K_PCOEM=y CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_ATH9K_HWRNG=y CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y CONFIG_CARL9170_HWRNG=y CONFIG_ATH6KL=m # CONFIG_ATH6KL_SDIO is not set CONFIG_ATH6KL_USB=m # CONFIG_ATH6KL_DEBUG is not set # CONFIG_ATH6KL_TRACING is not set CONFIG_AR5523=m # CONFIG_ATH10K is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set # CONFIG_WLAN_VENDOR_ATMEL is not set CONFIG_WLAN_VENDOR_BROADCOM=y CONFIG_B43=m CONFIG_B43_BCMA=y CONFIG_B43_SSB=y CONFIG_B43_BUSES_BCMA_AND_SSB=y # CONFIG_B43_BUSES_BCMA is not set # CONFIG_B43_BUSES_SSB is not set # CONFIG_B43_SDIO is not set CONFIG_B43_BCMA_PIO=y CONFIG_B43_PIO=y CONFIG_B43_PHY_G=y CONFIG_B43_PHY_N=y CONFIG_B43_PHY_LP=y CONFIG_B43_PHY_HT=y CONFIG_B43_LEDS=y CONFIG_B43_HWRNG=y # CONFIG_B43_DEBUG is not set # CONFIG_B43LEGACY is not set CONFIG_BRCMUTIL=m CONFIG_BRCMSMAC=m CONFIG_BRCMFMAC=m # CONFIG_BRCMFMAC_SDIO is not set # CONFIG_BRCMFMAC_USB is not set # CONFIG_BRCM_TRACING is not set # CONFIG_BRCMDBG is not set # CONFIG_WLAN_VENDOR_CISCO is not set # CONFIG_WLAN_VENDOR_INTEL is not set # CONFIG_WLAN_VENDOR_INTERSIL is not set CONFIG_WLAN_VENDOR_MARVELL=y # CONFIG_LIBERTAS is not set # CONFIG_LIBERTAS_THINFIRM is not set # CONFIG_MWIFIEX is not set CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m CONFIG_MT76_CORE=m CONFIG_MT76_LEDS=y CONFIG_MT76_USB=m CONFIG_MT76x02_LIB=m CONFIG_MT76x02_USB=m CONFIG_MT76x0_COMMON=m CONFIG_MT76x0U=m CONFIG_MT76x2_COMMON=m CONFIG_MT76x2U=m # CONFIG_MT7663U is not set # CONFIG_MT7663S is not set # CONFIG_MT7921S is not set # CONFIG_MT7921U is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set # CONFIG_WLAN_VENDOR_PURELIFI is not set CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m CONFIG_RT2500USB=m CONFIG_RT73USB=m CONFIG_RT2800USB=m CONFIG_RT2800USB_RT33XX=y CONFIG_RT2800USB_RT35XX=y CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y CONFIG_RT2800_LIB=m CONFIG_RT2X00_LIB_USB=m CONFIG_RT2X00_LIB=m CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_WLAN_VENDOR_REALTEK=y CONFIG_RTL8187=m CONFIG_RTL8187_LEDS=y CONFIG_RTL_CARDS=m # CONFIG_RTL8192CU is not set CONFIG_RTL8XXXU=m CONFIG_RTL8XXXU_UNTESTED=y CONFIG_RTW88=m CONFIG_RTW88_CORE=m CONFIG_RTW88_USB=m CONFIG_RTW88_8822B=m CONFIG_RTW88_8822C=m CONFIG_RTW88_8723D=m CONFIG_RTW88_8821C=m # CONFIG_RTW88_8822BS is not set CONFIG_RTW88_8822BU=m # CONFIG_RTW88_8822CS is not set CONFIG_RTW88_8822CU=m CONFIG_RTW88_8723DU=m # CONFIG_RTW88_8821CS is not set CONFIG_RTW88_8821CU=m # CONFIG_RTW88_DEBUG is not set # CONFIG_RTW88_DEBUGFS is not set # CONFIG_RTW89 is not set # CONFIG_WLAN_VENDOR_RSI is not set # CONFIG_WLAN_VENDOR_SILABS is not set # CONFIG_WLAN_VENDOR_ST is not set # CONFIG_WLAN_VENDOR_TI is not set # CONFIG_WLAN_VENDOR_ZYDAS is not set # CONFIG_WLAN_VENDOR_QUANTENNA is not set # CONFIG_MAC80211_HWSIM is not set CONFIG_USB_NET_RNDIS_WLAN=m # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_SPARSEKMAP is not set CONFIG_INPUT_MATRIXKMAP=y # # Userland interfaces # # CONFIG_INPUT_MOUSEDEV is not set # CONFIG_INPUT_JOYDEV is not set CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADC is not set # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set # CONFIG_KEYBOARD_ATKBD is not set # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=y # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_PINEPHONE is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set # CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_ADS7846=m # CONFIG_TOUCHSCREEN_AD7877 is not set # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_ADC is not set # CONFIG_TOUCHSCREEN_AR1021_I2C is not set # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_BU21029 is not set # CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set # CONFIG_TOUCHSCREEN_CY8CTMA140 is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set CONFIG_TOUCHSCREEN_EGALAX=m # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set # CONFIG_TOUCHSCREEN_EXC3000 is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_HIDEEP is not set # CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_ILITEK is not set # CONFIG_TOUCHSCREEN_S6SY761 is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set # CONFIG_TOUCHSCREEN_ELAN is not set # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MSG2638 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_IMAGIS is not set # CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set # CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2004 is not set # CONFIG_TOUCHSCREEN_TSC2005 is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_RM_TS is not set # CONFIG_TOUCHSCREEN_SILEAD is not set # CONFIG_TOUCHSCREEN_SIS_I2C is not set # CONFIG_TOUCHSCREEN_ST1232 is not set # CONFIG_TOUCHSCREEN_STMFTS is not set # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set # CONFIG_TOUCHSCREEN_SX8654 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZET6223 is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set # CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_IQS5XX is not set # CONFIG_TOUCHSCREEN_ZINITIX is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set # CONFIG_INPUT_MAX77693_HAPTIC is not set # CONFIG_INPUT_MAX8997_HAPTIC is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set CONFIG_INPUT_GPIO_ROTARY_ENCODER=m # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_RMI4_CORE is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_AMBAKMI is not set # CONFIG_SERIO_LIBPS2 is not set # CONFIG_SERIO_RAW is not set # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_APBPS2 is not set # CONFIG_SERIO_GPIO_PS2 is not set # CONFIG_USERIO is not set # CONFIG_GAMEPORT is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y # CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set # CONFIG_SERIAL_8250_16550A_VARIANTS is not set # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_DMA=y CONFIG_SERIAL_8250_NR_UARTS=1 CONFIG_SERIAL_8250_RUNTIME_UARTS=0 CONFIG_SERIAL_8250_EXTENDED=y # CONFIG_SERIAL_8250_MANY_PORTS is not set # CONFIG_SERIAL_8250_SHARE_IRQ is not set # CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_RSA is not set CONFIG_SERIAL_8250_FSL=y # CONFIG_SERIAL_8250_DW is not set # CONFIG_SERIAL_8250_RT288X is not set CONFIG_SERIAL_OF_PLATFORM=y # # Non-8250 serial port support # # CONFIG_SERIAL_AMBA_PL010 is not set # CONFIG_SERIAL_AMBA_PL011 is not set # CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set CONFIG_SERIAL_SAMSUNG=y CONFIG_SERIAL_SAMSUNG_UARTS_4=y CONFIG_SERIAL_SAMSUNG_UARTS=4 CONFIG_SERIAL_SAMSUNG_CONSOLE=y # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_SIFIVE is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_XILINX_PS_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_ST_ASC is not set # CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_NULL_TTY is not set # CONFIG_HVC_DCC is not set # CONFIG_SERIAL_DEV_BUS is not set # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_BA431 is not set CONFIG_HW_RANDOM_EXYNOS=y # CONFIG_HW_RANDOM_CCTRNG is not set # CONFIG_HW_RANDOM_XIPHERA is not set CONFIG_DEVMEM=y CONFIG_TCG_TPM=y CONFIG_HW_RANDOM_TPM=y # CONFIG_TCG_TIS is not set # CONFIG_TCG_TIS_SPI is not set # CONFIG_TCG_TIS_I2C is not set # CONFIG_TCG_TIS_I2C_CR50 is not set # CONFIG_TCG_TIS_I2C_ATMEL is not set CONFIG_TCG_TIS_I2C_INFINEON=y # CONFIG_TCG_TIS_I2C_NUVOTON is not set # CONFIG_TCG_ATMEL is not set # CONFIG_TCG_VTPM_PROXY is not set # CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TCG_TIS_ST33ZP24_SPI is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_MUX=y # # Multiplexer I2C Chip support # CONFIG_I2C_ARB_GPIO_CHALLENGE=y # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_GPMUX is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set # CONFIG_I2C_MUX_PINCTRL is not set # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_DEMUX_PINCTRL is not set # CONFIG_I2C_MUX_MLXCPLD is not set # end of Multiplexer I2C Chip support CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CBUS_GPIO is not set # CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_EMEV2 is not set CONFIG_I2C_EXYNOS5=y CONFIG_I2C_GPIO=y # CONFIG_I2C_GPIO_FAULT_INJECTOR is not set # CONFIG_I2C_NOMADIK is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_RK3X is not set CONFIG_I2C_S3C2410=y # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y # CONFIG_SPI_MEM is not set # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set CONFIG_SPI_BITBANG=y # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_CADENCE_QUADSPI is not set # CONFIG_SPI_DESIGNWARE is not set # CONFIG_SPI_NXP_FLEXSPI is not set CONFIG_SPI_GPIO=y # CONFIG_SPI_FSL_SPI is not set # CONFIG_SPI_MICROCHIP_CORE is not set # CONFIG_SPI_MICROCHIP_CORE_QSPI is not set # CONFIG_SPI_OC_TINY is not set # CONFIG_SPI_PL022 is not set # CONFIG_SPI_ROCKCHIP is not set CONFIG_SPI_S3C64XX=y # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_SIFIVE is not set # CONFIG_SPI_MXIC is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_AMD is not set # # SPI Multiplexer support # # CONFIG_SPI_MUX is not set # # SPI Protocol Masters # # CONFIG_SPI_SPIDEV is not set # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set CONFIG_SPI_DYNAMIC=y # CONFIG_SPMI is not set # CONFIG_HSI is not set # CONFIG_PPS is not set # # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # # end of PTP clock support CONFIG_PINCTRL=y CONFIG_PINMUX=y CONFIG_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_CY8C95X0 is not set # CONFIG_PINCTRL_MCP23S08 is not set # CONFIG_PINCTRL_MICROCHIP_SGPIO is not set # CONFIG_PINCTRL_OCELOT is not set # CONFIG_PINCTRL_SINGLE is not set # CONFIG_PINCTRL_STMFX is not set # CONFIG_PINCTRL_SX150X is not set # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers CONFIG_PINCTRL_SAMSUNG=y CONFIG_PINCTRL_EXYNOS=y CONFIG_PINCTRL_EXYNOS_ARM=y CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y CONFIG_DEBUG_GPIO=y CONFIG_GPIO_CDEV=y CONFIG_GPIO_CDEV_V1=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_74XX_MMIO is not set # CONFIG_GPIO_ALTERA is not set # CONFIG_GPIO_CADENCE is not set # CONFIG_GPIO_DWAPB is not set # CONFIG_GPIO_FTGPIO010 is not set # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_GRGPIO is not set # CONFIG_GPIO_HLWD is not set # CONFIG_GPIO_LOGICVC is not set # CONFIG_GPIO_MB86S7X is not set # CONFIG_GPIO_MPC8XXX is not set # CONFIG_GPIO_PL061 is not set # CONFIG_GPIO_SIFIVE is not set # 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 # end of Memory mapped GPIO drivers # # I2C GPIO expanders # # 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 # CONFIG_GPIO_PCA9570 is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # # CONFIG_HTC_EGPIO is not set CONFIG_GPIO_WM8994=y # end of MFD GPIO expanders # # SPI GPIO expanders # # CONFIG_GPIO_74X164 is not set # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # end of SPI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers # CONFIG_W1 is not set CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_BRCMKONA is not set # CONFIG_POWER_RESET_BRCMSTB is not set # CONFIG_POWER_RESET_GPIO is not set # CONFIG_POWER_RESET_GPIO_RESTART is not set # CONFIG_POWER_RESET_LTC2952 is not set CONFIG_POWER_RESET_REGULATOR=y # CONFIG_POWER_RESET_RESTART is not set # CONFIG_POWER_RESET_VERSATILE is not set CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_RESET_SYSCON_POWEROFF=y # CONFIG_SYSCON_REBOOT_MODE is not set # CONFIG_NVMEM_REBOOT_MODE is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SAMSUNG_SDI is not set CONFIG_BATTERY_SBS=y # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set CONFIG_BATTERY_MAX17040=y CONFIG_BATTERY_MAX17042=y # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set CONFIG_CHARGER_MAX14577=y # CONFIG_CHARGER_DETECTOR_MAX14656 is not set CONFIG_CHARGER_MAX77693=y # CONFIG_CHARGER_MAX77976 is not set CONFIG_CHARGER_MAX8997=y CONFIG_CHARGER_MAX8998=y # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_SMB347 is not set CONFIG_CHARGER_TPS65090=y # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_UCS1002 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_GPIO_FAN is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_IIO_HWMON is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX31730 is not set # CONFIG_SENSORS_MAX31760 is not set # CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set CONFIG_SENSORS_LM90=y # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set CONFIG_SENSORS_NTC_THERMISTOR=y # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_NZXT_KRAKEN2 is not set # CONFIG_SENSORS_NZXT_SMART2 is not set # CONFIG_SENSORS_OCC_P8_I2C is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set CONFIG_SENSORS_PWM_FAN=y # CONFIG_SENSORS_SBTSI is not set # CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set CONFIG_SENSORS_INA2XX=y # CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set # CONFIG_THERMAL_STATISTICS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y CONFIG_THERMAL_WRITABLE_TRIPS=y CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set # CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set CONFIG_CPU_THERMAL=y CONFIG_CPU_FREQ_THERMAL=y CONFIG_DEVFREQ_THERMAL=y CONFIG_THERMAL_EMULATION=y # CONFIG_THERMAL_MMIO is not set # # Samsung thermal drivers # CONFIG_EXYNOS_THERMAL=y # end of Samsung thermal drivers # CONFIG_GENERIC_ADC_THERMAL is not set CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 # CONFIG_WATCHDOG_SYSFS is not set # CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_FTWDT010_WATCHDOG is not set CONFIG_S3C2410_WATCHDOG=y # CONFIG_DW_WATCHDOG is not set # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_ARM_SMC_WATCHDOG is not set # CONFIG_MEN_A21_WDT is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y CONFIG_SSB=m CONFIG_SSB_BLOCKIO=y CONFIG_SSB_SDIOHOST_POSSIBLE=y # CONFIG_SSB_SDIOHOST is not set # CONFIG_SSB_DRIVER_GPIO is not set CONFIG_BCMA_POSSIBLE=y CONFIG_BCMA=m CONFIG_BCMA_BLOCKIO=y # CONFIG_BCMA_HOST_SOC is not set # CONFIG_BCMA_DRIVER_GMAC_CMN is not set # CONFIG_BCMA_DRIVER_GPIO is not set # CONFIG_BCMA_DEBUG is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set # CONFIG_MFD_ASIC3 is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_EXYNOS_LPASS is not set # CONFIG_MFD_GATEWORKS_GSC is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_MFD_HI6421_PMIC is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_I2CPLD is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set CONFIG_MFD_MAX14577=y # CONFIG_MFD_MAX77620 is not set # CONFIG_MFD_MAX77650 is not set CONFIG_MFD_MAX77686=y CONFIG_MFD_MAX77693=y # CONFIG_MFD_MAX77714 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set CONFIG_MFD_MAX8997=y CONFIG_MFD_MAX8998=y # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_OCELOT is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_CPCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_NTXEC is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_PM8XXX is not set # CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_RK808 is not set # CONFIG_MFD_RN5T618 is not set CONFIG_MFD_SEC_CORE=y # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set CONFIG_MFD_TPS65090=y # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TC3589X is not set # 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 # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set CONFIG_MFD_WM8994=y # CONFIG_MFD_ROHM_BD718XX is not set # CONFIG_MFD_ROHM_BD71828 is not set # CONFIG_MFD_ROHM_BD957XMUF is not set # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_MFD_QCOM_PM8008 is not set # CONFIG_MFD_INTEL_M10_BMC is not set # CONFIG_MFD_RSMU_I2C is not set # CONFIG_MFD_RSMU_SPI is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_88PG86X is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_DA9121 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set # CONFIG_REGULATOR_FAN53880 is not set CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set CONFIG_REGULATOR_MAX14577=y # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set CONFIG_REGULATOR_MAX8952=y # CONFIG_REGULATOR_MAX8973 is not set CONFIG_REGULATOR_MAX8997=y CONFIG_REGULATOR_MAX8998=y # CONFIG_REGULATOR_MAX20086 is not set CONFIG_REGULATOR_MAX77686=y CONFIG_REGULATOR_MAX77693=y CONFIG_REGULATOR_MAX77802=y # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MCP16502 is not set # CONFIG_REGULATOR_MP5416 is not set # CONFIG_REGULATOR_MP8859 is not set # CONFIG_REGULATOR_MP886X is not set # CONFIG_REGULATOR_MPQ7920 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PF8X00 is not set # CONFIG_REGULATOR_PFUZE100 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set # CONFIG_REGULATOR_PWM is not set # CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set CONFIG_REGULATOR_S2MPA01=y CONFIG_REGULATOR_S2MPS11=y CONFIG_REGULATOR_S5M8767=y # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_SY8106A is not set # CONFIG_REGULATOR_SY8824X is not set # CONFIG_REGULATOR_SY8827N is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS6286X is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set CONFIG_REGULATOR_TPS65090=y # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_VCTRL is not set CONFIG_REGULATOR_WM8994=y # CONFIG_RC_CORE is not set # # CEC support # CONFIG_MEDIA_CEC_SUPPORT=y # CONFIG_CEC_CH7322 is not set # CONFIG_CEC_GPIO is not set # CONFIG_CEC_SAMSUNG_S5P is not set # CONFIG_USB_PULSE8_CEC is not set # CONFIG_USB_RAINSHADOW_CEC is not set # end of CEC support CONFIG_MEDIA_SUPPORT=m CONFIG_MEDIA_SUPPORT_FILTER=y # CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y # CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set # CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set # CONFIG_MEDIA_RADIO_SUPPORT is not set # CONFIG_MEDIA_SDR_SUPPORT is not set CONFIG_MEDIA_PLATFORM_SUPPORT=y # CONFIG_MEDIA_TEST_SUPPORT is not set # end of Media device types CONFIG_VIDEO_DEV=m CONFIG_MEDIA_CONTROLLER=y # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y CONFIG_VIDEO_V4L2_SUBDEV_API=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_V4L2_MEM2MEM_DEV=m # CONFIG_V4L2_FLASH_LED_CLASS is not set CONFIG_V4L2_FWNODE=m CONFIG_V4L2_ASYNC=m # end of Video4Linux options # # Media controller options # # end of Media controller options # # Media drivers # # # Drivers filtered as selected at 'Filter media drivers' # # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # CONFIG_USB_GSPCA=m # CONFIG_USB_GSPCA_BENQ is not set # CONFIG_USB_GSPCA_CONEX is not set # CONFIG_USB_GSPCA_CPIA1 is not set # CONFIG_USB_GSPCA_DTCS033 is not set # CONFIG_USB_GSPCA_ETOMS is not set # CONFIG_USB_GSPCA_FINEPIX is not set # CONFIG_USB_GSPCA_JEILINJ is not set # CONFIG_USB_GSPCA_JL2005BCD is not set # CONFIG_USB_GSPCA_KINECT is not set # CONFIG_USB_GSPCA_KONICA is not set # CONFIG_USB_GSPCA_MARS is not set # CONFIG_USB_GSPCA_MR97310A is not set # CONFIG_USB_GSPCA_NW80X is not set # CONFIG_USB_GSPCA_OV519 is not set # CONFIG_USB_GSPCA_OV534 is not set # CONFIG_USB_GSPCA_OV534_9 is not set # CONFIG_USB_GSPCA_PAC207 is not set # CONFIG_USB_GSPCA_PAC7302 is not set # CONFIG_USB_GSPCA_PAC7311 is not set # CONFIG_USB_GSPCA_SE401 is not set # CONFIG_USB_GSPCA_SN9C2028 is not set # CONFIG_USB_GSPCA_SN9C20X is not set # CONFIG_USB_GSPCA_SONIXB is not set # CONFIG_USB_GSPCA_SONIXJ is not set # CONFIG_USB_GSPCA_SPCA1528 is not set # CONFIG_USB_GSPCA_SPCA500 is not set # CONFIG_USB_GSPCA_SPCA501 is not set # CONFIG_USB_GSPCA_SPCA505 is not set # CONFIG_USB_GSPCA_SPCA506 is not set # CONFIG_USB_GSPCA_SPCA508 is not set # CONFIG_USB_GSPCA_SPCA561 is not set # CONFIG_USB_GSPCA_SQ905 is not set # CONFIG_USB_GSPCA_SQ905C is not set # CONFIG_USB_GSPCA_SQ930X is not set # CONFIG_USB_GSPCA_STK014 is not set # CONFIG_USB_GSPCA_STK1135 is not set # CONFIG_USB_GSPCA_STV0680 is not set # CONFIG_USB_GSPCA_SUNPLUS is not set # CONFIG_USB_GSPCA_T613 is not set # CONFIG_USB_GSPCA_TOPRO is not set # CONFIG_USB_GSPCA_TOUPTEK is not set # CONFIG_USB_GSPCA_TV8532 is not set # CONFIG_USB_GSPCA_VC032X is not set # CONFIG_USB_GSPCA_VICAM is not set # CONFIG_USB_GSPCA_XIRLINK_CIT is not set # CONFIG_USB_GSPCA_ZC3XX is not set # CONFIG_USB_GL860 is not set # CONFIG_USB_M5602 is not set # CONFIG_USB_STV06XX is not set # CONFIG_USB_PWC is not set # CONFIG_USB_S2255 is not set # CONFIG_VIDEO_USBTV is not set CONFIG_USB_VIDEO_CLASS=m CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y # # Webcam, TV (analog/digital) USB devices # # CONFIG_VIDEO_EM28XX is not set CONFIG_MEDIA_PLATFORM_DRIVERS=y CONFIG_V4L_PLATFORM_DRIVERS=y CONFIG_V4L_MEM2MEM_DRIVERS=y # CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set # CONFIG_VIDEO_MUX is not set # # Allegro DVT media platform drivers # # # Amlogic media platform drivers # # # Amphion drivers # # # Aspeed media platform drivers # # CONFIG_VIDEO_ASPEED is not set # # Atmel media platform drivers # # # Cadence media platform drivers # # CONFIG_VIDEO_CADENCE_CSI2RX is not set # CONFIG_VIDEO_CADENCE_CSI2TX is not set # # Chips&Media media platform drivers # # # Intel media platform drivers # # # Marvell media platform drivers # # # Mediatek media platform drivers # # # NVidia media platform drivers # # # NXP media platform drivers # # # Qualcomm media platform drivers # # # Renesas media platform drivers # # # Rockchip media platform drivers # # # Samsung media platform drivers # CONFIG_VIDEO_SAMSUNG_EXYNOS_GSC=m # CONFIG_VIDEO_SAMSUNG_EXYNOS4_IS is not set CONFIG_VIDEO_SAMSUNG_S5P_G2D=m CONFIG_VIDEO_SAMSUNG_S5P_JPEG=m CONFIG_VIDEO_SAMSUNG_S5P_MFC=m # # STMicroelectronics media platform drivers # # # Sunxi media platform drivers # # # Texas Instruments drivers # # # Verisilicon media platform drivers # # # VIA media platform drivers # # # Xilinx media platform drivers # # CONFIG_VIDEO_XILINX is not set CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_DMA_CONTIG=m CONFIG_VIDEOBUF2_VMALLOC=m # end of Media drivers # # Media ancillary drivers # # # Camera sensor devices # # CONFIG_VIDEO_AR0521 is not set # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_HI846 is not set # CONFIG_VIDEO_HI847 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_IMX412 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T001 is not set # CONFIG_VIDEO_MT9T112 is not set # CONFIG_VIDEO_MT9V011 is not set # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_NOON010PC30 is not set # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set # CONFIG_VIDEO_OV2640 is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5693 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV7251 is not set # CONFIG_VIDEO_OV7640 is not set # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9282 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set CONFIG_VIDEO_S5C73M3=m # CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set CONFIG_VIDEO_S5K6A3=m # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_SR030PC30 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # CONFIG_VIDEO_M5MOLS is not set # end of Camera sensor devices # # Lens drivers # # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # Audio decoders, processors and mixers # # CONFIG_VIDEO_CS3308 is not set # CONFIG_VIDEO_CS5345 is not set # CONFIG_VIDEO_CS53L32A is not set # CONFIG_VIDEO_MSP3400 is not set # CONFIG_VIDEO_SONY_BTF_MPX is not set # CONFIG_VIDEO_TDA1997X is not set # CONFIG_VIDEO_TDA7432 is not set # CONFIG_VIDEO_TDA9840 is not set # CONFIG_VIDEO_TEA6415C is not set # CONFIG_VIDEO_TEA6420 is not set # CONFIG_VIDEO_TLV320AIC23B is not set # CONFIG_VIDEO_TVAUDIO is not set # CONFIG_VIDEO_UDA1342 is not set # CONFIG_VIDEO_VP27SMPX is not set # CONFIG_VIDEO_WM8739 is not set # CONFIG_VIDEO_WM8775 is not set # end of Audio decoders, processors and mixers # # RDS decoders # # CONFIG_VIDEO_SAA6588 is not set # end of RDS decoders # # Video decoders # # CONFIG_VIDEO_ADV7180 is not set # CONFIG_VIDEO_ADV7183 is not set # CONFIG_VIDEO_ADV748X is not set # CONFIG_VIDEO_ADV7604 is not set # CONFIG_VIDEO_ADV7842 is not set # CONFIG_VIDEO_BT819 is not set # CONFIG_VIDEO_BT856 is not set # CONFIG_VIDEO_BT866 is not set # CONFIG_VIDEO_ISL7998X is not set # CONFIG_VIDEO_KS0127 is not set # CONFIG_VIDEO_MAX9286 is not set # CONFIG_VIDEO_ML86V7667 is not set # CONFIG_VIDEO_SAA7110 is not set # CONFIG_VIDEO_SAA711X is not set # CONFIG_VIDEO_TC358743 is not set # CONFIG_VIDEO_TVP514X is not set # CONFIG_VIDEO_TVP5150 is not set # CONFIG_VIDEO_TVP7002 is not set # CONFIG_VIDEO_TW2804 is not set # CONFIG_VIDEO_TW9903 is not set # CONFIG_VIDEO_TW9906 is not set # CONFIG_VIDEO_TW9910 is not set # CONFIG_VIDEO_VPX3220 is not set # # Video and audio decoders # # CONFIG_VIDEO_SAA717X is not set # CONFIG_VIDEO_CX25840 is not set # end of Video decoders # # Video encoders # # CONFIG_VIDEO_AD9389B is not set # CONFIG_VIDEO_ADV7170 is not set # CONFIG_VIDEO_ADV7175 is not set # CONFIG_VIDEO_ADV7343 is not set # CONFIG_VIDEO_ADV7393 is not set # CONFIG_VIDEO_ADV7511 is not set # CONFIG_VIDEO_AK881X is not set # CONFIG_VIDEO_SAA7127 is not set # CONFIG_VIDEO_SAA7185 is not set # CONFIG_VIDEO_THS8200 is not set # end of Video encoders # # Video improvement chips # # CONFIG_VIDEO_UPD64031A is not set # CONFIG_VIDEO_UPD64083 is not set # end of Video improvement chips # # Audio/Video compression chips # # CONFIG_VIDEO_SAA6752HS is not set # end of Audio/Video compression chips # # SDR tuner chips # # end of SDR tuner chips # # Miscellaneous helper chips # # CONFIG_VIDEO_I2C is not set # CONFIG_VIDEO_M52790 is not set # CONFIG_VIDEO_ST_MIPID02 is not set # CONFIG_VIDEO_THS7303 is not set # end of Miscellaneous helper chips # # Media SPI Adapters # # CONFIG_VIDEO_GS1662 is not set # end of Media SPI Adapters # end of Media ancillary drivers # # Graphics support # # CONFIG_IMX_IPUV3_CORE is not set CONFIG_DRM=y CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DEBUG_MM is not set CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_LOAD_EDID_FIRMWARE is not set CONFIG_DRM_DP_AUX_BUS=y CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_DISPLAY_DP_HELPER=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_GEM_SHMEM_HELPER=m CONFIG_DRM_SCHED=m # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # end of I2C encoder or helper chips # # ARM devices # # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set # CONFIG_DRM_KOMEDA is not set # end of ARM devices # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set CONFIG_DRM_EXYNOS=y # # CRTCs # CONFIG_DRM_EXYNOS_FIMD=y # CONFIG_DRM_EXYNOS5433_DECON is not set # CONFIG_DRM_EXYNOS7_DECON is not set CONFIG_DRM_EXYNOS_MIXER=y # CONFIG_DRM_EXYNOS_VIDI is not set # # Encoders and Bridges # CONFIG_DRM_EXYNOS_DPI=y CONFIG_DRM_EXYNOS_DSI=y CONFIG_DRM_EXYNOS_DP=y CONFIG_DRM_EXYNOS_HDMI=y # # Sub-drivers # CONFIG_DRM_EXYNOS_IPP=y CONFIG_DRM_EXYNOS_FIMC=y # CONFIG_DRM_EXYNOS_ROTATOR is not set CONFIG_DRM_EXYNOS_SCALER=y # CONFIG_DRM_UDL is not set # CONFIG_DRM_ARMADA is not set # CONFIG_DRM_RCAR_DW_HDMI is not set # CONFIG_DRM_RCAR_USE_LVDS is not set # CONFIG_DRM_RCAR_USE_MIPI_DSI is not set # CONFIG_DRM_OMAP is not set # CONFIG_DRM_TILCDC is not set # CONFIG_DRM_FSL_DCU is not set # CONFIG_DRM_STM is not set CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_ABT_Y030XX067A is not set # CONFIG_DRM_PANEL_ARM_VERSATILE is not set # CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set # CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set # CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set # CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set # CONFIG_DRM_PANEL_DSI_CM is not set # CONFIG_DRM_PANEL_LVDS is not set CONFIG_DRM_PANEL_SIMPLE=y CONFIG_DRM_PANEL_EDP=y # CONFIG_DRM_PANEL_EBBG_FT8719 is not set # CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set # CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set # CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set # CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set # CONFIG_DRM_PANEL_JDI_R63452 is not set # CONFIG_DRM_PANEL_KHADAS_TS050 is not set # CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set # CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set # CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set CONFIG_DRM_PANEL_SAMSUNG_LD9040=y # CONFIG_DRM_PANEL_LG_LB035Q02 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set # CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set # CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set # CONFIG_DRM_PANEL_NOVATEK_NT35560 is not set # CONFIG_DRM_PANEL_NOVATEK_NT35950 is not set # CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set # CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set # CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set # CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set # CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set # CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set # CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set # CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set # CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set # CONFIG_DRM_PANEL_RONBO_RB070D30 is not set # CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set # CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03=y # CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0=y # CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set # CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set # CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set # CONFIG_DRM_PANEL_SHARP_LS060T1SX01 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set # CONFIG_DRM_PANEL_SONY_ACX565AKM is not set # CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 is not set # CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set # CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set # CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set # CONFIG_DRM_PANEL_TPO_TPG110 is not set # CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set # CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set # CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set # CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set # CONFIG_DRM_LONTIUM_LT9611 is not set # CONFIG_DRM_LONTIUM_LT9611UXC is not set # CONFIG_DRM_ITE_IT66121 is not set # CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NWL_MIPI_DSI is not set CONFIG_DRM_NXP_PTN3460=y CONFIG_DRM_PARADE_PS8622=y # CONFIG_DRM_PARADE_PS8640 is not set # CONFIG_DRM_SIL_SII8620 is not set # CONFIG_DRM_SII902X is not set CONFIG_DRM_SII9234=y # CONFIG_DRM_SIMPLE_BRIDGE is not set # CONFIG_DRM_THINE_THC63LVD1024 is not set # CONFIG_DRM_TOSHIBA_TC358762 is not set CONFIG_DRM_TOSHIBA_TC358764=y # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TOSHIBA_TC358768 is not set # CONFIG_DRM_TOSHIBA_TC358775 is not set # CONFIG_DRM_TI_DLPC3433 is not set # CONFIG_DRM_TI_TFP410 is not set # CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set # CONFIG_DRM_ANALOGIX_ANX78XX is not set CONFIG_DRM_ANALOGIX_DP=y # CONFIG_DRM_ANALOGIX_ANX7625 is not set # CONFIG_DRM_I2C_ADV7511 is not set # CONFIG_DRM_CDNS_MHDP8546 is not set # end of Display Interface Bridges # CONFIG_DRM_STI is not set # CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_LOGICVC is not set # CONFIG_DRM_MXSFB is not set # CONFIG_DRM_IMX_LCDIF is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_PANEL_MIPI_DBI is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9163 is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set # CONFIG_TINYDRM_ILI9486 is not set # CONFIG_TINYDRM_MI0283QT is not set # CONFIG_TINYDRM_REPAPER is not set # CONFIG_TINYDRM_ST7586 is not set # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_TVE200 is not set # CONFIG_DRM_LIMA is not set CONFIG_DRM_PANFROST=m # CONFIG_DRM_MCDE is not set # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_DRM_NOMODESET=y # # Frame buffer Devices # CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y # CONFIG_FB_MODE_HELPERS is not set # CONFIG_FB_TILEBLITTING is not set # # Frame buffer hardware drivers # # CONFIG_FB_ARMCLCD is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SSD1307 is not set # end of Frame buffer Devices # # Backlight & LCD device support # CONFIG_LCD_CLASS_DEVICE=y # CONFIG_LCD_L4F00242T03 is not set # CONFIG_LCD_LMS283GF05 is not set # CONFIG_LCD_LTV350QV is not set # CONFIG_LCD_ILI922X is not set # CONFIG_LCD_ILI9320 is not set # CONFIG_LCD_TDO24M is not set # CONFIG_LCD_VGG2432A4 is not set # CONFIG_LCD_PLATFORM is not set # CONFIG_LCD_AMS369FG06 is not set # CONFIG_LCD_LMS501KF03 is not set # CONFIG_LCD_HX8357 is not set # CONFIG_LCD_OTM3225A is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_KTD253 is not set CONFIG_BACKLIGHT_PWM=y # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # CONFIG_BACKLIGHT_LED is not set # end of Backlight & LCD device support CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y # # Console display driver support # CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support CONFIG_LOGO=y CONFIG_LOGO_LINUX_MONO=y CONFIG_LOGO_LINUX_VGA16=y CONFIG_LOGO_LINUX_CLUT224=y # end of Graphics support CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_PCM_ELD=y CONFIG_SND_PCM_IEC958=y CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_OSSEMUL is not set CONFIG_SND_PCM_TIMER=y # CONFIG_SND_HRTIMER is not set # CONFIG_SND_DYNAMIC_MINORS is not set CONFIG_SND_SUPPORT_OLD_API=y CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_CTL_INPUT_VALIDATION is not set # CONFIG_SND_SEQUENCER is not set CONFIG_SND_DRIVERS=y # CONFIG_SND_DUMMY is not set # CONFIG_SND_ALOOP is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_MPU401 is not set # # HD-Audio # # end of HD-Audio CONFIG_SND_HDA_PREALLOC_SIZE=64 CONFIG_SND_ARM=y # CONFIG_SND_ARMAACI is not set CONFIG_SND_SPI=y CONFIG_SND_USB=y # CONFIG_SND_USB_AUDIO is not set # CONFIG_SND_USB_UA101 is not set # CONFIG_SND_USB_CAIAQ is not set # CONFIG_SND_USB_6FIRE is not set # CONFIG_SND_USB_HIFACE is not set # CONFIG_SND_BCD2000 is not set # CONFIG_SND_USB_POD is not set # CONFIG_SND_USB_PODHD is not set # CONFIG_SND_USB_TONEPORT is not set # CONFIG_SND_USB_VARIAX is not set CONFIG_SND_SOC=y CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y # CONFIG_SND_SOC_ADI is not set # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_AMD_ACP_CONFIG is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # CONFIG_SND_SOC_FSL_AUDMIX is not set # 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_FSL_XCVR is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # end of SoC Audio for Freescale CPUs # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set # CONFIG_SND_SOC_MTK_BTCVSD is not set CONFIG_SND_SOC_SAMSUNG=y CONFIG_SND_SAMSUNG_PCM=y # CONFIG_SND_SAMSUNG_SPDIF is not set CONFIG_SND_SAMSUNG_I2S=y CONFIG_SND_SOC_SAMSUNG_SMDK_WM8994=y # CONFIG_SND_SOC_SAMSUNG_SMDK_SPDIF is not set CONFIG_SND_SOC_SMDK_WM8994_PCM=y # CONFIG_SND_SOC_SNOW is not set CONFIG_SND_SOC_ODROID=y # CONFIG_SND_SOC_ARNDALE is not set # CONFIG_SND_SOC_SAMSUNG_ARIES_WM8994 is not set # CONFIG_SND_SOC_SAMSUNG_MIDAS_WM1811 is not set # CONFIG_SND_SOC_SOF_TOPLEVEL is not set # # STMicroelectronics STM32 SOC audio support # # end of 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_SND_SOC_I2C_AND_SPI=y # # CODEC drivers # CONFIG_SND_SOC_WM_HUBS=y # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1372_SPI is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set # CONFIG_SND_SOC_ADAU7002 is not set # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4375 is not set # CONFIG_SND_SOC_AK4458 is not set # CONFIG_SND_SOC_AK4554 is not set # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set # 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_CS35L41_SPI is not set # CONFIG_SND_SOC_CS35L41_I2C is not set # CONFIG_SND_SOC_CS35L45_SPI is not set # CONFIG_SND_SOC_CS35L45_I2C 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 # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS42L83 is not set # CONFIG_SND_SOC_CS4234 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # 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_CX2072X is not set # CONFIG_SND_SOC_DA7213 is not set # CONFIG_SND_SOC_DMIC is not set CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_ES7134 is not set # CONFIG_SND_SOC_ES7241 is not set # CONFIG_SND_SOC_ES8316 is not set # CONFIG_SND_SOC_ES8326 is not set # CONFIG_SND_SOC_ES8328_I2C is not set # CONFIG_SND_SOC_ES8328_SPI is not set # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_HDA is not set # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set # CONFIG_SND_SOC_MAX98088 is not set CONFIG_SND_SOC_MAX98090=y # CONFIG_SND_SOC_MAX98357A is not set # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98520 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX98396 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set # CONFIG_SND_SOC_PCM186X_I2C is not set # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set # CONFIG_SND_SOC_PCM5102A 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=y # CONFIG_SND_SOC_RT5640 is not set # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_RT9120 is not set # CONFIG_SND_SOC_SGTL5000 is not set # CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set # CONFIG_SND_SOC_SIMPLE_MUX is not set # CONFIG_SND_SOC_SPDIF is not set # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS2780 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805M is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320ADC3XXX is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set # CONFIG_SND_SOC_TLV320AIC3X_I2C is not set # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731_I2C is not set # CONFIG_SND_SOC_WM8731_SPI is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set # 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_WM8940 is not set # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set CONFIG_SND_SOC_WM8994=y # CONFIG_SND_SOC_ZL38060 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_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8821 is not set # CONFIG_SND_SOC_NAU8822 is not set # CONFIG_SND_SOC_NAU8824 is not set # CONFIG_SND_SOC_TPA6130A2 is not set # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set # end of CODEC drivers CONFIG_SND_SIMPLE_CARD_UTILS=y CONFIG_SND_SIMPLE_CARD=y # CONFIG_SND_AUDIO_GRAPH_CARD is not set # CONFIG_SND_AUDIO_GRAPH_CARD2 is not set # CONFIG_SND_TEST_COMPONENT is not set # # HID support # CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set # CONFIG_HIDRAW is not set # CONFIG_UHID is not set CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set # CONFIG_HID_ASUS is not set # CONFIG_HID_AUREAL is not set CONFIG_HID_BELKIN=y # CONFIG_HID_BETOP_FF is not set # CONFIG_HID_BIGBEN_FF is not set CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CREATIVE_SB0540 is not set CONFIG_HID_CYPRESS=y # CONFIG_HID_DRAGONRISE is not set # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_GLORIOUS is not set # CONFIG_HID_HOLTEK is not set # CONFIG_HID_VIVALDI 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_VRC2 is not set # CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set CONFIG_HID_ITE=y # CONFIG_HID_JABRA is not set # CONFIG_HID_TWINHAN is not set CONFIG_HID_KENSINGTON=y # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LED is not set # CONFIG_HID_LENOVO is not set # CONFIG_HID_LETSKETCH is not set CONFIG_HID_LOGITECH=y # CONFIG_HID_LOGITECH_HIDPP is not set # CONFIG_LOGITECH_FF is not set # CONFIG_LOGIRUMBLEPAD2_FF is not set # 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_MEGAWORLD_FF is not set CONFIG_HID_REDRAGON=y CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y # CONFIG_HID_MULTITOUCH is not set CONFIG_HID_NINTENDO=m CONFIG_NINTENDO_FF=y # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set # CONFIG_HID_ORTEK is not set # CONFIG_HID_OUYA is not set # CONFIG_HID_PANTHERLORD is not set # CONFIG_HID_PENMOUNT is not set # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PXRC is not set # CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set # CONFIG_HID_SEMITEK is not set # CONFIG_HID_SIGMAMICRO is not set # CONFIG_HID_SONY is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set # CONFIG_HID_SUNPLUS is not set # CONFIG_HID_RMI is not set # CONFIG_HID_GREENASIA is not set # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set # CONFIG_HID_TOPRE is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set # CONFIG_HID_WIIMOTE is not set # CONFIG_HID_XINMO is not set # CONFIG_HID_ZEROPLUS is not set # CONFIG_HID_ZYDACRON is not set # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # USB HID support # CONFIG_USB_HID=y # CONFIG_HID_PID is not set # CONFIG_USB_HIDDEV is not set # end of USB HID support # # I2C HID support # # CONFIG_I2C_HID_OF is not set # CONFIG_I2C_HID_OF_ELAN is not set # CONFIG_I2C_HID_OF_GOODIX is not set # end of I2C HID support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y # CONFIG_USB_LED_TRIG is not set # CONFIG_USB_ULPI_BUS is not set # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_OTG is not set # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_LEDS_TRIGGER_USBPORT is not set CONFIG_USB_AUTOSUSPEND_DELAY=2 # CONFIG_USB_MON is not set # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y # CONFIG_USB_XHCI_DBGCAP is not set # CONFIG_USB_XHCI_PCI_RENESAS is not set CONFIG_USB_XHCI_PLATFORM=y 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_EXYNOS=y # CONFIG_USB_EHCI_HCD_PLATFORM is not set # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_FOTG210_HCD is not set # CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_EXYNOS=y # CONFIG_USB_OHCI_HCD_PLATFORM is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_BCMA is not set # CONFIG_USB_HCD_SSB is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # CONFIG_USB_ACM=m CONFIG_USB_PRINTER=m CONFIG_USB_WDM=m CONFIG_USB_TMC=m # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set CONFIG_USB_STORAGE_REALTEK=m CONFIG_REALTEK_AUTOPM=y # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set # CONFIG_USB_UAS is not set # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set CONFIG_USB_DWC3=y # CONFIG_USB_DWC3_HOST is not set # CONFIG_USB_DWC3_GADGET is not set CONFIG_USB_DWC3_DUAL_ROLE=y # # Platform Glue Driver Support # CONFIG_USB_DWC3_EXYNOS=y CONFIG_USB_DWC3_OF_SIMPLE=y CONFIG_USB_DWC2=y # CONFIG_USB_DWC2_HOST is not set # # Gadget/Dual-role mode requires USB Gadget support to be enabled # # CONFIG_USB_DWC2_PERIPHERAL is not set CONFIG_USB_DWC2_DUAL_ROLE=y # CONFIG_USB_DWC2_DEBUG is not set # CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set # CONFIG_USB_CHIPIDEA is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # # CONFIG_USB_SERIAL is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HUB_USB251XB is not set CONFIG_USB_HSIC_USB3503=y # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # CONFIG_USB_ONBOARD_HUB is not set # # USB Physical Layer drivers # # CONFIG_NOP_USB_XCEIV is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set # CONFIG_USB_ULPI is not set # end of USB Physical Layer drivers CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GADGET_DEBUG_FILES is not set # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # # USB Peripheral Controller # # CONFIG_USB_FUSB300 is not set # CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set # CONFIG_USB_SNP_UDC_PLAT is not set # CONFIG_USB_M66592 is not set # CONFIG_USB_BDC_UDC is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_GADGET_XILINX is not set # CONFIG_USB_MAX3420_UDC is not set # CONFIG_USB_DUMMY_HCD is not set # end of USB Peripheral Controller CONFIG_USB_LIBCOMPOSITE=y CONFIG_USB_U_ETHER=y CONFIG_USB_F_ECM=y CONFIG_USB_F_SUBSET=y CONFIG_USB_F_RNDIS=y # CONFIG_USB_CONFIGFS is not set # # USB Gadget precomposed configurations # # CONFIG_USB_ZERO is not set # CONFIG_USB_AUDIO is not set CONFIG_USB_ETH=y CONFIG_USB_ETH_RNDIS=y # CONFIG_USB_ETH_EEM is not set # CONFIG_USB_G_NCM is not set # CONFIG_USB_GADGETFS is not set # CONFIG_USB_FUNCTIONFS is not set # CONFIG_USB_MASS_STORAGE is not set # CONFIG_USB_G_SERIAL is not set # CONFIG_USB_MIDI_GADGET is not set # CONFIG_USB_G_PRINTER is not set # CONFIG_USB_CDC_COMPOSITE is not set # CONFIG_USB_G_ACM_MS is not set # CONFIG_USB_G_MULTI is not set # CONFIG_USB_G_HID is not set # CONFIG_USB_G_DBGP is not set # CONFIG_USB_G_WEBCAM is not set # CONFIG_USB_RAW_GADGET is not set # end of USB Gadget precomposed configurations # CONFIG_TYPEC is not set CONFIG_USB_ROLE_SWITCH=y CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y # CONFIG_PWRSEQ_SD8787 is not set CONFIG_PWRSEQ_SIMPLE=y CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=16 # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_DEBUG is not set # CONFIG_MMC_ARMMMCI is not set CONFIG_MMC_SDHCI=y # CONFIG_MMC_SDHCI_PLTFM is not set CONFIG_MMC_SDHCI_S3C=y CONFIG_MMC_SDHCI_S3C_DMA=y # CONFIG_MMC_SPI is not set CONFIG_MMC_DW=y CONFIG_MMC_DW_PLTFM=y # CONFIG_MMC_DW_BLUEFIELD is not set CONFIG_MMC_DW_EXYNOS=y # CONFIG_MMC_DW_HI3798CV200 is not set # CONFIG_MMC_DW_K3 is not set # CONFIG_MMC_VUB300 is not set # CONFIG_MMC_USHC is not set # CONFIG_MMC_USDHI6ROL0 is not set # CONFIG_MMC_CQHCI is not set # CONFIG_MMC_HSQ is not set # CONFIG_MMC_MTK is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y CONFIG_LEDS_CLASS_FLASH=y # CONFIG_LEDS_CLASS_MULTICOLOR is not set # CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set # # LED drivers # # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_AW2013 is not set # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CR0014114 is not set # CONFIG_LEDS_EL15203000 is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_LM3692X is not set # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP50XX is not set # CONFIG_LEDS_LP55XX_COMMON is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_DAC124S085 is not set CONFIG_LEDS_PWM=y # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set CONFIG_LEDS_MAX8997=y # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # CONFIG_LEDS_IS31FL32XX is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_SYSCON is not set # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_SPI_BYTE is not set # CONFIG_LEDS_TI_LMU_COMMON is not set # # Flash and Torch LED drivers # CONFIG_LEDS_AAT1290=y # CONFIG_LEDS_AS3645A is not set # CONFIG_LEDS_KTD2692 is not set # CONFIG_LEDS_LM3601X is not set CONFIG_LEDS_MAX77693=y # CONFIG_LEDS_RT4505 is not set # CONFIG_LEDS_RT8515 is not set # CONFIG_LEDS_SGM3140 is not set # # RGB LED drivers # # # LED Triggers # CONFIG_LEDS_TRIGGERS=y # CONFIG_LEDS_TRIGGER_TIMER is not set # CONFIG_LEDS_TRIGGER_ONESHOT is not set CONFIG_LEDS_TRIGGER_HEARTBEAT=y # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set # CONFIG_LEDS_TRIGGER_CPU is not set # CONFIG_LEDS_TRIGGER_ACTIVITY is not set # CONFIG_LEDS_TRIGGER_GPIO is not set # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set # CONFIG_LEDS_TRIGGER_PANIC is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set # CONFIG_LEDS_TRIGGER_AUDIO is not set # CONFIG_LEDS_TRIGGER_TTY is not set # # Simple LED drivers # # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_ATOMIC_SCRUB=y CONFIG_EDAC_SUPPORT=y CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # 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 # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_HYM8563 is not set # CONFIG_RTC_DRV_MAX6900 is not set CONFIG_RTC_DRV_MAX8998=y CONFIG_RTC_DRV_MAX8997=y CONFIG_RTC_DRV_MAX77686=y # CONFIG_RTC_DRV_NCT3018Y is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # 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_RV3032 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 # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # # CONFIG_RTC_DRV_CMOS is not set # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_ZYNQMP is not set # # on-CPU RTC drivers # CONFIG_RTC_DRV_S3C=y # CONFIG_RTC_DRV_PL030 is not set # CONFIG_RTC_DRV_PL031 is not set # CONFIG_RTC_DRV_CADENCE is not set # CONFIG_RTC_DRV_FTRTC010 is not set # CONFIG_RTC_DRV_R7301 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_OF=y # CONFIG_ALTERA_MSGDMA is not set # CONFIG_AMBA_PL08X is not set # 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_PL330_DMA=y # CONFIG_XILINX_ZYNQMP_DPDMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set # CONFIG_DW_DMAC is not set # CONFIG_SF_PDMA is not set # # DMA Clients # # CONFIG_ASYNC_TX_DMA is not set # CONFIG_DMATEST is not set # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set CONFIG_UDMABUF=y # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set CONFIG_DMABUF_HEAPS=y # CONFIG_DMABUF_SYSFS_STATS is not set CONFIG_DMABUF_HEAPS_SYSTEM=y CONFIG_DMABUF_HEAPS_CMA=y # end of DMABUF options # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set # CONFIG_VIRTIO_MENU is not set # CONFIG_VDPA is not set # CONFIG_VHOST_MENU is not set # # Microsoft Hyper-V guest support # # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_RTLLIB is not set CONFIG_RTL8723BS=m CONFIG_R8712U=m CONFIG_R8188EU=m CONFIG_VT6656=m # # IIO staging drivers # # # Accelerometers # # CONFIG_ADIS16203 is not set # CONFIG_ADIS16240 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7816 is not set # end of Analog to digital converters # # Analog digital bi-direction converters # # CONFIG_ADT7316 is not set # end of Analog digital bi-direction converters # # Direct Digital Synthesis # # CONFIG_AD9832 is not set # CONFIG_AD9834 is not set # end of Direct Digital Synthesis # # Network Analyzer, Impedance Converters # # CONFIG_AD5933 is not set # end of Network Analyzer, Impedance Converters # # Active energy metering IC # # CONFIG_ADE7854 is not set # end of Active energy metering IC # # Resolver to digital converters # # CONFIG_AD2S1210 is not set # end of Resolver to digital converters # end of IIO staging drivers # CONFIG_STAGING_MEDIA is not set # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_FB_TFT is not set # CONFIG_KS7010 is not set # CONFIG_PI433 is not set # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_FIELDBUS_DEV is not set # CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Clock driver for ARM Reference designs # # CONFIG_CLK_ICST is not set # CONFIG_CLK_SP810 is not set # end of Clock driver for ARM Reference designs # CONFIG_LMK04832 is not set CONFIG_COMMON_CLK_MAX77686=y # CONFIG_COMMON_CLK_MAX9485 is not set # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CDCE925 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set CONFIG_COMMON_CLK_S2MPS11=y # CONFIG_COMMON_CLK_AXI_CLKGEN is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_RS9_PCIE is not set # CONFIG_COMMON_CLK_VC5 is not set # CONFIG_COMMON_CLK_VC7 is not set # CONFIG_COMMON_CLK_FIXED_MMIO is not set CONFIG_COMMON_CLK_SAMSUNG=y CONFIG_EXYNOS_5420_COMMON_CLK=y CONFIG_EXYNOS_AUDSS_CLK_CON=y CONFIG_EXYNOS_CLKOUT=m # CONFIG_XILINX_VCU is not set # CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set # CONFIG_HWSPINLOCK is not set # # Clock Source drivers # CONFIG_TIMER_OF=y CONFIG_TIMER_PROBE=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y CONFIG_CLKSRC_EXYNOS_MCT=y # CONFIG_MICROCHIP_PIT64B is not set # end of Clock Source drivers # CONFIG_MAILBOX is not set CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # CONFIG_IOMMU_IO_PGTABLE=y CONFIG_IOMMU_IO_PGTABLE_LPAE=y # CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set # CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set CONFIG_IOMMU_DEFAULT_DMA_STRICT=y # CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_OF_IOMMU=y CONFIG_EXYNOS_IOMMU=y # CONFIG_EXYNOS_IOMMU_DEBUG is not set # CONFIG_ARM_SMMU is not set # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # end of Remoteproc drivers # # Rpmsg drivers # # CONFIG_RPMSG_VIRTIO is not set # end of Rpmsg drivers # CONFIG_SOUNDWIRE is not set # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # end of Amlogic SoC drivers # # Broadcom SoC drivers # # CONFIG_SOC_BRCMSTB is not set # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # CONFIG_QUICC_ENGINE is not set # CONFIG_FSL_RCPM is not set # end of NXP/Freescale QorIQ SoC drivers # # fujitsu SoC drivers # # end of fujitsu SoC drivers # # i.MX SoC drivers # # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # CONFIG_LITEX_SOC_CONTROLLER is not set # end of Enable LiteX SoC Builder specific drivers # # Qualcomm SoC drivers # # end of Qualcomm SoC drivers CONFIG_SOC_SAMSUNG=y CONFIG_EXYNOS_ASV_ARM=y CONFIG_EXYNOS_CHIPID=y # CONFIG_EXYNOS_USI is not set CONFIG_EXYNOS_PMU=y CONFIG_EXYNOS_PMU_ARM_DRIVERS=y CONFIG_EXYNOS_PM_DOMAINS=y # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y CONFIG_DEVFREQ_GOV_PERFORMANCE=y CONFIG_DEVFREQ_GOV_POWERSAVE=y CONFIG_DEVFREQ_GOV_USERSPACE=y CONFIG_DEVFREQ_GOV_PASSIVE=y # # DEVFREQ Drivers # CONFIG_ARM_EXYNOS_BUS_DEVFREQ=y CONFIG_PM_DEVFREQ_EVENT=y CONFIG_DEVFREQ_EVENT_EXYNOS_NOCP=y CONFIG_DEVFREQ_EVENT_EXYNOS_PPMU=y CONFIG_EXTCON=y # # Extcon Device Drivers # # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_FSA9480 is not set # CONFIG_EXTCON_GPIO is not set CONFIG_EXTCON_MAX14577=y # CONFIG_EXTCON_MAX3355 is not set CONFIG_EXTCON_MAX77693=y CONFIG_EXTCON_MAX8997=y # 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 CONFIG_MEMORY=y CONFIG_DDR=y # CONFIG_ARM_PL172_MPMC is not set CONFIG_PL353_SMC=y CONFIG_SAMSUNG_MC=y CONFIG_EXYNOS5422_DMC=y CONFIG_EXYNOS_SROM=y CONFIG_IIO=y CONFIG_IIO_BUFFER=y # CONFIG_IIO_BUFFER_CB is not set # CONFIG_IIO_BUFFER_DMA is not set # CONFIG_IIO_BUFFER_DMAENGINE is not set # CONFIG_IIO_BUFFER_HW_CONSUMER is not set CONFIG_IIO_KFIFO_BUF=y CONFIG_IIO_TRIGGERED_BUFFER=y # CONFIG_IIO_CONFIGFS is not set CONFIG_IIO_TRIGGER=y CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # CONFIG_IIO_SW_DEVICE is not set # CONFIG_IIO_SW_TRIGGER is not set # CONFIG_IIO_TRIGGERED_EVENT is not set # # Accelerometers # # CONFIG_ADIS16201 is not set # CONFIG_ADIS16209 is not set # CONFIG_ADXL313_I2C is not set # CONFIG_ADXL313_SPI is not set # CONFIG_ADXL345_I2C is not set # CONFIG_ADXL345_SPI is not set # CONFIG_ADXL355_I2C is not set # CONFIG_ADXL355_SPI is not set # CONFIG_ADXL367_SPI is not set # CONFIG_ADXL367_I2C is not set # CONFIG_ADXL372_SPI is not set # CONFIG_ADXL372_I2C is not set # CONFIG_BMA180 is not set # CONFIG_BMA220 is not set # CONFIG_BMA400 is not set # CONFIG_BMC150_ACCEL is not set # CONFIG_BMI088_ACCEL is not set # CONFIG_DA280 is not set # CONFIG_DA311 is not set # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_DMARD10 is not set # CONFIG_FXLS8962AF_I2C is not set # CONFIG_FXLS8962AF_SPI is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MC3230 is not set # CONFIG_MMA7455_I2C is not set # CONFIG_MMA7455_SPI is not set # CONFIG_MMA7660 is not set # CONFIG_MMA8452 is not set # CONFIG_MMA9551 is not set # CONFIG_MMA9553 is not set # CONFIG_MSA311 is not set # CONFIG_MXC4005 is not set # CONFIG_MXC6255 is not set # CONFIG_SCA3000 is not set # CONFIG_SCA3300 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # end of Accelerometers # # Analog to digital converters # # CONFIG_AD7091R5 is not set # CONFIG_AD7124 is not set # CONFIG_AD7192 is not set # CONFIG_AD7266 is not set # CONFIG_AD7280 is not set # CONFIG_AD7291 is not set # CONFIG_AD7292 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_AD7780 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set # CONFIG_AD7923 is not set # CONFIG_AD7949 is not set # CONFIG_AD799X is not set # CONFIG_ADI_AXI_ADC is not set # CONFIG_CC10001_ADC is not set # CONFIG_ENVELOPE_DETECTOR is not set CONFIG_EXYNOS_ADC=y # CONFIG_HI8435 is not set # CONFIG_HX711 is not set # CONFIG_LTC2471 is not set # CONFIG_LTC2485 is not set # CONFIG_LTC2496 is not set # CONFIG_LTC2497 is not set # CONFIG_MAX1027 is not set # CONFIG_MAX11100 is not set # CONFIG_MAX1118 is not set # CONFIG_MAX11205 is not set # CONFIG_MAX1241 is not set # CONFIG_MAX1363 is not set # CONFIG_MAX9611 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set # CONFIG_MCP3911 is not set # CONFIG_NAU7802 is not set # CONFIG_RICHTEK_RTQ6056 is not set # CONFIG_SD_ADC_MODULATOR is not set # CONFIG_TI_ADC081C is not set # CONFIG_TI_ADC0832 is not set # CONFIG_TI_ADC084S021 is not set # CONFIG_TI_ADC12138 is not set # CONFIG_TI_ADC108S102 is not set # CONFIG_TI_ADC128S052 is not set # CONFIG_TI_ADC161S626 is not set # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS7950 is not set # CONFIG_TI_ADS8344 is not set # CONFIG_TI_ADS8688 is not set # CONFIG_TI_ADS124S08 is not set # CONFIG_TI_ADS131E08 is not set # CONFIG_TI_TLC4541 is not set # CONFIG_TI_TSC2046 is not set # CONFIG_VF610_ADC is not set # CONFIG_XILINX_XADC is not set # end of Analog to digital converters # # Analog to digital and digital to analog converters # # CONFIG_AD74413R is not set # end of Analog to digital and digital to analog converters # # Analog Front Ends # # CONFIG_IIO_RESCALE is not set # end of Analog Front Ends # # Amplifiers # # CONFIG_AD8366 is not set # CONFIG_ADA4250 is not set # CONFIG_HMC425 is not set # end of Amplifiers # # Capacitance to digital converters # # CONFIG_AD7150 is not set # CONFIG_AD7746 is not set # end of Capacitance to digital converters # # Chemical Sensors # # CONFIG_ATLAS_PH_SENSOR is not set # CONFIG_ATLAS_EZO_SENSOR is not set # CONFIG_BME680 is not set # CONFIG_CCS811 is not set # CONFIG_IAQCORE is not set # CONFIG_SCD30_CORE is not set # CONFIG_SCD4X is not set # CONFIG_SENSIRION_SGP30 is not set # CONFIG_SENSIRION_SGP40 is not set # CONFIG_SPS30_I2C is not set # CONFIG_SENSEAIR_SUNRISE_CO2 is not set # CONFIG_VZ89X is not set # end of Chemical Sensors # # Hid Sensor IIO Common # # end of Hid Sensor IIO Common # # IIO SCMI Sensors # # end of IIO SCMI Sensors # # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set # end of SSP Sensor Common # # Digital to analog converters # # CONFIG_AD3552R is not set # CONFIG_AD5064 is not set # CONFIG_AD5360 is not set # CONFIG_AD5380 is not set # CONFIG_AD5421 is not set # CONFIG_AD5446 is not set # CONFIG_AD5449 is not set # CONFIG_AD5592R is not set # CONFIG_AD5593R is not set # CONFIG_AD5504 is not set # CONFIG_AD5624R_SPI is not set # CONFIG_LTC2688 is not set # CONFIG_AD5686_SPI is not set # CONFIG_AD5696_I2C is not set # CONFIG_AD5755 is not set # CONFIG_AD5758 is not set # CONFIG_AD5761 is not set # CONFIG_AD5764 is not set # CONFIG_AD5766 is not set # CONFIG_AD5770R is not set # CONFIG_AD5791 is not set # CONFIG_AD7293 is not set # CONFIG_AD7303 is not set # CONFIG_AD8801 is not set # CONFIG_DPOT_DAC is not set # CONFIG_DS4424 is not set # CONFIG_LTC1660 is not set # CONFIG_LTC2632 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set # 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 # end of Digital to analog converters # # IIO dummy driver # # end of IIO dummy driver # # Filters # # end of Filters # # Frequency Synthesizers DDS/PLL # # # Clock Generator/Distribution # # CONFIG_AD9523 is not set # end of Clock Generator/Distribution # # Phase-Locked Loop (PLL) frequency synthesizers # # CONFIG_ADF4350 is not set # CONFIG_ADF4371 is not set # CONFIG_ADMV1013 is not set # CONFIG_ADMV4420 is not set # CONFIG_ADRF6780 is not set # end of Phase-Locked Loop (PLL) frequency synthesizers # end of Frequency Synthesizers DDS/PLL # # Digital gyroscope sensors # # CONFIG_ADIS16080 is not set # CONFIG_ADIS16130 is not set # CONFIG_ADIS16136 is not set # CONFIG_ADIS16260 is not set # CONFIG_ADXRS290 is not set # CONFIG_ADXRS450 is not set # CONFIG_BMG160 is not set # CONFIG_FXAS21002C is not set # CONFIG_MPU3050_I2C is not set # CONFIG_IIO_ST_GYRO_3AXIS is not set # CONFIG_ITG3200 is not set # end of Digital gyroscope sensors # # Health Sensors # # # Heart Rate Monitors # # CONFIG_AFE4403 is not set # CONFIG_AFE4404 is not set # CONFIG_MAX30100 is not set # CONFIG_MAX30102 is not set # end of Heart Rate Monitors # end of Health Sensors # # Humidity sensors # # CONFIG_AM2315 is not set # CONFIG_DHT11 is not set # CONFIG_HDC100X is not set # CONFIG_HDC2010 is not set # CONFIG_HTS221 is not set # CONFIG_HTU21 is not set # CONFIG_SI7005 is not set # CONFIG_SI7020 is not set # end of Humidity sensors # # Inertial measurement units # # CONFIG_ADIS16400 is not set # CONFIG_ADIS16460 is not set # CONFIG_ADIS16475 is not set # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set # CONFIG_BOSCH_BNO055_I2C is not set # CONFIG_FXOS8700_I2C is not set # CONFIG_FXOS8700_SPI is not set # CONFIG_KMX61 is not set # CONFIG_INV_ICM42600_I2C is not set # CONFIG_INV_ICM42600_SPI is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set # CONFIG_IIO_ST_LSM6DSX is not set # CONFIG_IIO_ST_LSM9DS0 is not set # end of Inertial measurement units # # Light sensors # # CONFIG_ADJD_S311 is not set # CONFIG_ADUX1020 is not set # CONFIG_AL3010 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set # CONFIG_AS73211 is not set # CONFIG_BH1750 is not set # CONFIG_BH1780 is not set # CONFIG_CM32181 is not set # CONFIG_CM3232 is not set # CONFIG_CM3323 is not set # CONFIG_CM3605 is not set CONFIG_CM36651=y # CONFIG_GP2AP002 is not set # CONFIG_GP2AP020A00F is not set # CONFIG_SENSORS_ISL29018 is not set # CONFIG_SENSORS_ISL29028 is not set # CONFIG_ISL29125 is not set # CONFIG_JSA1212 is not set # CONFIG_RPR0521 is not set # CONFIG_LTR501 is not set # CONFIG_LTRF216A is not set # CONFIG_LV0104CS is not set # CONFIG_MAX44000 is not set # CONFIG_MAX44009 is not set # CONFIG_NOA1305 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1133 is not set # CONFIG_SI1145 is not set # CONFIG_STK3310 is not set # CONFIG_ST_UVIS25 is not set # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set # CONFIG_SENSORS_TSL2563 is not set # CONFIG_TSL2583 is not set # CONFIG_TSL2591 is not set # CONFIG_TSL2772 is not set # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VCNL4035 is not set # CONFIG_VEML6030 is not set # CONFIG_VEML6070 is not set # CONFIG_VL6180 is not set # CONFIG_ZOPT2201 is not set # end of Light sensors # # Magnetometer sensors # # CONFIG_AK8974 is not set CONFIG_AK8975=y # CONFIG_AK09911 is not set # CONFIG_BMC150_MAGN_I2C is not set # CONFIG_BMC150_MAGN_SPI is not set # CONFIG_MAG3110 is not set # CONFIG_MMC35240 is not set # CONFIG_IIO_ST_MAGN_3AXIS is not set # CONFIG_SENSORS_HMC5843_I2C is not set # CONFIG_SENSORS_HMC5843_SPI is not set # CONFIG_SENSORS_RM3100_I2C is not set # CONFIG_SENSORS_RM3100_SPI is not set # CONFIG_YAMAHA_YAS530 is not set # end of Magnetometer sensors # # Multiplexers # # CONFIG_IIO_MUX is not set # end of Multiplexers # # Inclinometer sensors # # end of Inclinometer sensors # # Triggers - standalone # # CONFIG_IIO_INTERRUPT_TRIGGER is not set # CONFIG_IIO_SYSFS_TRIGGER is not set # end of Triggers - standalone # # Linear and angular position sensors # # end of Linear and angular position sensors # # Digital potentiometers # # CONFIG_AD5110 is not set # CONFIG_AD5272 is not set # CONFIG_DS1803 is not set # CONFIG_MAX5432 is not set # CONFIG_MAX5481 is not set # CONFIG_MAX5487 is not set # CONFIG_MCP4018 is not set # CONFIG_MCP4131 is not set # CONFIG_MCP4531 is not set # CONFIG_MCP41010 is not set # CONFIG_TPL0102 is not set # end of Digital potentiometers # # Digital potentiostats # # CONFIG_LMP91000 is not set # end of Digital potentiostats # # Pressure sensors # # CONFIG_ABP060MG is not set # CONFIG_BMP280 is not set # CONFIG_DLHL60D is not set # CONFIG_DPS310 is not set # CONFIG_HP03 is not set # CONFIG_ICP10100 is not set # CONFIG_MPL115_I2C is not set # CONFIG_MPL115_SPI is not set # CONFIG_MPL3115 is not set # CONFIG_MS5611 is not set # CONFIG_MS5637 is not set # CONFIG_IIO_ST_PRESS is not set # CONFIG_T5403 is not set # CONFIG_HP206C is not set # CONFIG_ZPA2326 is not set # end of Pressure sensors # # Lightning sensors # # CONFIG_AS3935 is not set # end of Lightning sensors # # Proximity and distance sensors # # CONFIG_ISL29501 is not set # CONFIG_LIDAR_LITE_V2 is not set # CONFIG_MB1232 is not set # CONFIG_PING is not set # CONFIG_RFD77402 is not set # CONFIG_SRF04 is not set # CONFIG_SX9310 is not set # CONFIG_SX9324 is not set # CONFIG_SX9360 is not set # CONFIG_SX9500 is not set # CONFIG_SRF08 is not set # CONFIG_VCNL3020 is not set # CONFIG_VL53L0X_I2C is not set # end of Proximity and distance sensors # # Resolver to digital converters # # CONFIG_AD2S90 is not set # CONFIG_AD2S1200 is not set # end of Resolver to digital converters # # Temperature sensors # # CONFIG_LTC2983 is not set # CONFIG_MAXIM_THERMOCOUPLE is not set # CONFIG_MLX90614 is not set # CONFIG_MLX90632 is not set # CONFIG_TMP006 is not set # CONFIG_TMP007 is not set # CONFIG_TMP117 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_MAX31856 is not set # CONFIG_MAX31865 is not set # end of Temperature sensors CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_DEBUG is not set # CONFIG_PWM_ATMEL_TCB is not set # CONFIG_PWM_CLK is not set # CONFIG_PWM_FSL_FTM is not set # CONFIG_PWM_PCA9685 is not set CONFIG_PWM_SAMSUNG=y # CONFIG_PWM_XILINX is not set # # IRQ chip support # CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 # CONFIG_AL_FIC is not set # CONFIG_XILINX_INTC is not set CONFIG_EXYNOS_IRQ_COMBINER=y # end of IRQ chip support # CONFIG_IPACK_BUS is not set # CONFIG_RESET_CONTROLLER is not set # # PHY Subsystem # CONFIG_GENERIC_PHY=y # CONFIG_PHY_CAN_TRANSCEIVER is not set # # PHY drivers for Broadcom platforms # # CONFIG_BCM_KONA_USB2_PHY is not set # end of PHY drivers for Broadcom platforms # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_DPHY_RX is not set # CONFIG_PHY_CADENCE_SALVO is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_LAN966X_SERDES is not set # CONFIG_PHY_CPCAP_USB is not set # CONFIG_PHY_MAPPHONE_MDM6600 is not set # CONFIG_PHY_OCELOT_SERDES is not set CONFIG_PHY_EXYNOS_DP_VIDEO=y CONFIG_PHY_EXYNOS_MIPI_VIDEO=y # CONFIG_PHY_EXYNOS_PCIE is not set # CONFIG_PHY_SAMSUNG_UFS is not set CONFIG_PHY_SAMSUNG_USB2=y CONFIG_PHY_EXYNOS5250_USB2=y CONFIG_PHY_EXYNOS5_USBDRD=y # end of PHY Subsystem # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_ARM_CCI_PMU is not set # CONFIG_ARM_CCN is not set CONFIG_ARM_PMU=y # end of Performance monitor support # CONFIG_RAS is not set # # Android # # CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y # CONFIG_NVMEM_RMEM is not set # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_FSI is not set # CONFIG_TEE is not set CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set # CONFIG_PECI is not set # CONFIG_HTE is not set # end of Device Drivers # # 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 CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=m CONFIG_XFS_SUPPORT_V4=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_RT is not set # CONFIG_XFS_ONLINE_SCRUB is not set # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_BTRFS_FS_REF_VERIFY is not set # CONFIG_NILFS2_FS is not set CONFIG_F2FS_FS=y CONFIG_F2FS_STAT_FS=y # CONFIG_F2FS_FS_XATTR is not set CONFIG_F2FS_CHECK_FS=y # CONFIG_F2FS_FAULT_INJECTION is not set # CONFIG_F2FS_FS_COMPRESSION is not set CONFIG_F2FS_IOSTAT=y # CONFIG_F2FS_UNFAIR_RWSEM is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y # CONFIG_QUOTA is not set CONFIG_AUTOFS4_FS=y CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=m # CONFIG_CUSE is not set # CONFIG_VIRTIO_FS is not set CONFIG_OVERLAY_FS=m # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y # CONFIG_OVERLAY_FS_INDEX is not set # CONFIG_OVERLAY_FS_METACOPY is not set # # Caches # CONFIG_NETFS_SUPPORT=y # CONFIG_NETFS_STATS is not set CONFIG_FSCACHE=y # CONFIG_FSCACHE_STATS is not set # CONFIG_FSCACHE_DEBUG is not set # CONFIG_CACHEFILES is not set # end of Caches # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=y # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=m CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set CONFIG_NTFS3_FS=m # CONFIG_NTFS3_LZX_XPRESS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y CONFIG_MEMFD_CREATE=y CONFIG_CONFIGFS_FS=y # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set CONFIG_HFS_FS=y CONFIG_HFSPLUS_FS=y # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y # CONFIG_SQUASHFS_FILE_CACHE is not set CONFIG_SQUASHFS_FILE_DIRECT=y # CONFIG_SQUASHFS_DECOMP_SINGLE is not set # CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_PSTORE is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y CONFIG_NFS_SWAP=y CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=m CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" CONFIG_NFS_V4_1_MIGRATION=y CONFIG_ROOT_NFS=y CONFIG_NFS_FSCACHE=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFS_DISABLE_UDP_SUPPORT=y # CONFIG_NFS_V4_2_READ_PLUS is not set # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_COMMON=y CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y CONFIG_SUNRPC_SWAP=y # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS2=y CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y # CONFIG_CIFS_UPCALL is not set # CONFIG_CIFS_XATTR is not set CONFIG_CIFS_DEBUG=y # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DEBUG_DUMP_KEYS is not set # CONFIG_CIFS_DFS_UPCALL is not set # CONFIG_CIFS_SWN_UPCALL is not set CONFIG_CIFS_FSCACHE=y # CONFIG_CIFS_ROOT is not set # CONFIG_SMB_SERVER is not set CONFIG_SMBFS_COMMON=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_BIG_KEYS is not set # CONFIG_TRUSTED_KEYS is not set # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEY_DH_OPERATIONS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set CONFIG_SECURITYFS=y CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y # CONFIG_INIT_STACK_ALL_PATTERN is not set # CONFIG_INIT_STACK_ALL_ZERO is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization CONFIG_RANDSTRUCT_NONE=y # CONFIG_RANDSTRUCT_FULL is not set # CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y CONFIG_CRYPTO_USER=m CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_CRYPTD=m CONFIG_CRYPTO_AUTHENC=y CONFIG_CRYPTO_TEST=m CONFIG_CRYPTO_SIMD=m # end of Crypto core or helper # # Public-key cryptography # CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y # CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set CONFIG_CRYPTO_ECC=m CONFIG_CRYPTO_ECDH=m # CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set # end of Public-key cryptography # # Block ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SM4_GENERIC is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set CONFIG_CRYPTO_CTR=y # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set # CONFIG_CRYPTO_KEYWRAP is not set CONFIG_CRYPTO_LRW=m # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=m # end of Length-preserving ciphers and modes # # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y CONFIG_CRYPTO_ESSIV=m # end of AEAD (authenticated encryption with associated data) ciphers # # Hashes, digests, and MACs # CONFIG_CRYPTO_BLAKE2B=m CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y CONFIG_CRYPTO_SHA3=m # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_XCBC is not set CONFIG_CRYPTO_XXHASH=m # end of Hashes, digests, and MACs # # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y # CONFIG_CRYPTO_CRCT10DIF is not set # end of CRCs (cyclic redundancy checks) # # Compression # # CONFIG_CRYPTO_DEFLATE is not set CONFIG_CRYPTO_LZO=m # CONFIG_CRYPTO_842 is not set CONFIG_CRYPTO_LZ4=m # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # end of Compression # # Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_HASH is not set # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation # # Userspace interface # CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y CONFIG_CRYPTO_USER_API_RNG=m # CONFIG_CRYPTO_USER_API_RNG_CAVP is not set CONFIG_CRYPTO_USER_API_AEAD=m CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # CONFIG_CRYPTO_STATS is not set # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y # # Accelerated Cryptographic Algorithms for CPU (arm) # CONFIG_CRYPTO_CURVE25519_NEON=y CONFIG_CRYPTO_GHASH_ARM_CE=m # CONFIG_CRYPTO_NHPOLY1305_NEON is not set CONFIG_CRYPTO_POLY1305_ARM=y CONFIG_CRYPTO_BLAKE2S_ARM=y CONFIG_CRYPTO_BLAKE2B_NEON=m CONFIG_CRYPTO_SHA1_ARM=m CONFIG_CRYPTO_SHA1_ARM_NEON=m # CONFIG_CRYPTO_SHA1_ARM_CE is not set # CONFIG_CRYPTO_SHA2_ARM_CE is not set CONFIG_CRYPTO_SHA256_ARM=m CONFIG_CRYPTO_SHA512_ARM=m CONFIG_CRYPTO_AES_ARM=m CONFIG_CRYPTO_AES_ARM_BS=m # CONFIG_CRYPTO_AES_ARM_CE is not set CONFIG_CRYPTO_CHACHA20_NEON=y CONFIG_CRYPTO_CRC32_ARM_CE=m # end of Accelerated Cryptographic Algorithms for CPU (arm) CONFIG_CRYPTO_HW=y CONFIG_CRYPTO_DEV_EXYNOS_RNG=y CONFIG_CRYPTO_DEV_S5P=y # CONFIG_CRYPTO_DEV_ATMEL_ECC is not set # CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set # CONFIG_CRYPTO_DEV_SAFEXCEL is not set # CONFIG_CRYPTO_DEV_CCREE is not set # CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS8_PRIVATE_KEY_PARSER=m CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set # CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_RAID6_PQ=m # CONFIG_RAID6_PQ_BENCHMARK is not set CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_HAVE_ARCH_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_CORDIC=m # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y # # Crypto library routines # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CHACHA=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=y CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=y CONFIG_CRYPTO_LIB_CURVE25519=y CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y CONFIG_CRYPTO_LIB_POLY1305=y CONFIG_CRYPTO_LIB_CHACHA20POLY1305=y CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_CRC_CCITT=y CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC64_ROCKSOFT is not set CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=m # CONFIG_CRC8 is not set CONFIG_XXHASH=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=m CONFIG_LZO_COMPRESS=m CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_COMPRESS=m CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=m CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y CONFIG_XZ_DEC_POWERPC=y CONFIG_XZ_DEC_IA64=y CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y CONFIG_XZ_DEC_SPARC=y # CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_GZIP=y CONFIG_DECOMPRESS_BZIP2=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DECOMPRESS_XZ=y CONFIG_DECOMPRESS_LZO=y CONFIG_DECOMPRESS_LZ4=y CONFIG_DECOMPRESS_ZSTD=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_DMA_DECLARE_COHERENT=y CONFIG_ARCH_HAS_SETUP_DMA_OPS=y CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_CMA=y # CONFIG_DMA_PERNUMA_CMA is not set # # Default contiguous memory area size: # CONFIG_CMA_SIZE_MBYTES=96 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_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y # CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_32=y CONFIG_FONT_SUPPORT=y CONFIG_FONTS=y # CONFIG_FONT_8x8 is not set CONFIG_FONT_8x16=y # CONFIG_FONT_6x11 is not set CONFIG_FONT_7x14=y # CONFIG_FONT_PEARL_8x8 is not set # CONFIG_FONT_ACORN_8x8 is not set # CONFIG_FONT_MINI_4x6 is not set # CONFIG_FONT_6x10 is not set # CONFIG_FONT_10x18 is not set # CONFIG_FONT_SUN8x16 is not set # CONFIG_FONT_SUN12x22 is not set # CONFIG_FONT_TER16x32 is not set # CONFIG_FONT_6x8 is not set CONFIG_SG_POOL=y CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y # end of Library routines CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set # CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_SYMBOLIC_ERRNAME=y CONFIG_DEBUG_BUGVERBOSE=y # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Compile-time checks and compiler options # CONFIG_DEBUG_INFO=y CONFIG_AS_HAS_NON_CONST_LEB128=y # CONFIG_DEBUG_INFO_NONE is not set CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_INFO_COMPRESSED is not set # CONFIG_DEBUG_INFO_SPLIT is not set # CONFIG_DEBUG_INFO_BTF is not set # CONFIG_GDB_SCRIPTS is not set CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set # CONFIG_UBSAN is not set CONFIG_HAVE_KCSAN_COMPILER=y # end of Generic Kernel Debugging Instruments # # Networking Debugging # # CONFIG_NET_DEV_REFCNT_TRACKER is not set # CONFIG_NET_NS_REFCNT_TRACKER is not set # CONFIG_DEBUG_NET is not set # end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_DEBUG_ON 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 # CONFIG_DEBUG_WX is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set # CONFIG_DEBUG_VM is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_DEBUG_PER_CPU_MAPS is not set # CONFIG_DEBUG_KMAP_LOCAL is not set # CONFIG_DEBUG_HIGHMEM is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y # CONFIG_KFENCE is not set # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # CONFIG_SCHED_DEBUG=y # CONFIG_SCHEDSTATS is not set # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set CONFIG_DEBUG_PREEMPT=y # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y CONFIG_PROVE_LOCKING=y # CONFIG_PROVE_RAW_LOCK_NESTING is not set # CONFIG_LOCK_STAT is not set CONFIG_DEBUG_RT_MUTEXES=y CONFIG_DEBUG_SPINLOCK=y CONFIG_DEBUG_MUTEXES=y CONFIG_DEBUG_WW_MUTEX_SLOWPATH=y CONFIG_DEBUG_RWSEMS=y CONFIG_DEBUG_LOCK_ALLOC=y CONFIG_LOCKDEP=y CONFIG_LOCKDEP_BITS=15 CONFIG_LOCKDEP_CHAINS_BITS=16 CONFIG_LOCKDEP_STACK_TRACE_BITS=19 CONFIG_LOCKDEP_STACK_TRACE_HASH_BITS=14 CONFIG_LOCKDEP_CIRCULAR_QUEUE_BITS=12 # CONFIG_DEBUG_LOCKDEP is not set CONFIG_DEBUG_ATOMIC_SLEEP=y # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # end of Lock Debugging (spinlocks, mutexes, etc...) CONFIG_TRACE_IRQFLAGS=y # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set # # RCU Debugging # CONFIG_PROVE_RCU=y # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 CONFIG_RCU_TRACE=y # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_PREEMPTIRQ_TRACEPOINTS=y CONFIG_TRACING=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y # CONFIG_BOOTTIME_TRACING is not set # CONFIG_FUNCTION_TRACER is not set # CONFIG_STACK_TRACER is not set # CONFIG_IRQSOFF_TRACER is not set # CONFIG_PREEMPT_TRACER is not set # CONFIG_SCHED_TRACER is not set # CONFIG_HWLAT_TRACER is not set # CONFIG_OSNOISE_TRACER is not set # CONFIG_TIMERLAT_TRACER is not set # CONFIG_ENABLE_DEFAULT_TRACERS is not set # CONFIG_FTRACE_SYSCALLS is not set # CONFIG_TRACER_SNAPSHOT is not set CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set # CONFIG_BLK_DEV_IO_TRACE is not set CONFIG_UPROBE_EVENTS=y CONFIG_BPF_EVENTS=y CONFIG_DYNAMIC_EVENTS=y CONFIG_PROBE_EVENTS=y # CONFIG_SYNTH_EVENTS is not set # CONFIG_HIST_TRIGGERS is not set # CONFIG_TRACE_EVENT_INJECT is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_TRACE_EVAL_MAP_FILE is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set # CONFIG_PREEMPTIRQ_DELAY_TEST is not set # CONFIG_RV is not set # CONFIG_SAMPLES is not set # CONFIG_STRICT_DEVMEM is not set # # arm Debugging # # CONFIG_ARM_PTDUMP_DEBUGFS is not set # CONFIG_UNWINDER_FRAME_POINTER is not set CONFIG_UNWINDER_ARM=y CONFIG_ARM_UNWIND=y CONFIG_DEBUG_USER=y # CONFIG_DEBUG_LL is not set CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_CORESIGHT is not set # end of arm Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set # CONFIG_TEST_MIN_HEAP is not set # CONFIG_TEST_DIV64 is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_TEST_REF_TRACKER is not set # CONFIG_RBTREE_TEST is not set # CONFIG_REED_SOLOMON_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set # CONFIG_STRING_SELFTEST is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_STRSCPY is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_SCANF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_XARRAY is not set # CONFIG_TEST_MAPLE_TREE is not set # CONFIG_TEST_RHASHTABLE is not set # CONFIG_TEST_SIPHASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_BITOPS is not set # CONFIG_TEST_VMALLOC is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_TEST_BLACKHOLE_DEV is not set # CONFIG_FIND_BIT_BENCHMARK is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_SYSCTL is not set # CONFIG_TEST_UDELAY is not set # CONFIG_TEST_STATIC_KEYS is not set # CONFIG_TEST_DYNAMIC_DEBUG is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMCAT_P is not set # CONFIG_TEST_MEMINIT is not set # CONFIG_TEST_FREE_PAGES is not set CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage # # Rust hacking # # end of Rust hacking # end of Kernel hacking ================================================ FILE: projects/Samsung/options ================================================ ################################################################################ # setup system defaults ################################################################################ # Bootloader to use (syslinux / u-boot / bcm2835-bootloader) BOOTLOADER="u-boot" # U-Boot firmware package(s) to use UBOOT_FIRMWARE="exynos-boot-fip" # Kernel target for u-boot (default 'uImage' if BOOTLOADER=u-boot) (uImage / zImage) KERNEL_TARGET="zImage" # Additional kernel dependencies KERNEL_EXTRA_DEPENDS_TARGET="lz4:host" # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="dtbs" # Kernel to use: LINUX="samsung" # kernel serial console EXTRA_CMDLINE="quiet systemd.debug_shell=ttySAC2 console=ttySAC2,115200n8 console=tty0" # Default system partition offset in sectors SYSTEM_PART_START=3072 ################################################################################ # setup build defaults ################################################################################ # Project CFLAGS PROJECT_CFLAGS="" # SquashFS compression method (gzip / lzo / xz) SQUASHFS_COMPRESSION="zstd" ################################################################################ # setup project defaults ################################################################################ # OpenGL(X) implementation to use (no / mesa) OPENGL="no" # Vulkan implementation to use (vulkan-loader / no) VULKAN="no" # Displayserver to use (wl / no) DISPLAYSERVER="no" # Windowmanager to use (weston / no) WINDOWMANAGER="no" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" FIRMWARE="kernel-firmware wlan-firmware" # build with installer (yes / no) INSTALLER_SUPPORT="no" # additional packages to install: # Space separated list is supported, # e.g. ADDITIONAL_PACKAGES+=" PACKAGE1 PACKAGE2" ADDITIONAL_PACKAGES+=" dtc emmctool" # additional drivers to install: # for a list of additional drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS+=" DRIVER1 DRIVER2" ADDITIONAL_DRIVERS+="" # build and install driver addons (yes / no) DRIVER_ADDONS_SUPPORT="no" # driver addons to install: # for a list of additional drivers see packages/linux-driver-addons # Space separated list is supported, DRIVER_ADDONS="crazycat dvb-latest" # use the kernel CEC framework for libcec (yes / no) CEC_FRAMEWORK_SUPPORT="yes" # debug tty path DEBUG_TTY="/dev/ttySAC2" # set the addon project ADDON_PROJECT="ARMv7" ================================================ FILE: projects/Samsung/patches/kodi/kodi-0001-LOCAL-WinSystemGbmGLESContext-wait-longer-for-vsync.patch ================================================ From b89fb39cb0e28456016828f37ae4756bf66101b6 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Sun, 23 Jan 2022 07:38:32 +0000 Subject: [PATCH 1/2] LOCAL: WinSystemGbmGLESContext: wait longer for vsync Waiting longer for vsync improves idle CPU consumption on ARM devices Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- xbmc/windowing/gbm/WinSystemGbmGLESContext.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xbmc/windowing/gbm/WinSystemGbmGLESContext.cpp b/xbmc/windowing/gbm/WinSystemGbmGLESContext.cpp index 0d071c31f1..52ae4c1ef2 100644 --- a/xbmc/windowing/gbm/WinSystemGbmGLESContext.cpp +++ b/xbmc/windowing/gbm/WinSystemGbmGLESContext.cpp @@ -149,7 +149,7 @@ void CWinSystemGbmGLESContext::PresentRender(bool rendered, bool videoLayer) } else { - KODI::TIME::Sleep(10ms); + KODI::TIME::Sleep(40ms); } } -- 2.17.1 ================================================ FILE: projects/Samsung/patches/kodi/kodi-0002-LOCAL-changes-for-Odroid-XU3-XU4.patch ================================================ From eb476ae718b8433402547bad0e3fa2ba69e1c1ee Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Fri, 24 Jun 2022 18:04:13 +0000 Subject: [PATCH 2/2] LOCAL: changes for Odroid XU3/XU4 --- cmake/modules/FindGBM.cmake | 12 ++-- system/settings/linux.xml | 2 +- .../DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 66 +++++++++++++++++-- .../DVDCodecs/Video/DVDVideoCodecFFmpeg.h | 1 + xbmc/windowing/Resolution.cpp | 2 + xbmc/windowing/gbm/GBMUtils.cpp | 28 ++++---- xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp | 2 +- xbmc/windowing/gbm/drm/DRMUtils.cpp | 2 +- 8 files changed, 90 insertions(+), 25 deletions(-) diff --git a/cmake/modules/FindGBM.cmake b/cmake/modules/FindGBM.cmake index 37a26a7bc4..53cc04663e 100644 --- a/cmake/modules/FindGBM.cmake +++ b/cmake/modules/FindGBM.cmake @@ -51,12 +51,12 @@ if(GBM_FOUND) set(GBM_LIBRARIES ${GBM_LIBRARY}) set(GBM_INCLUDE_DIRS ${GBM_INCLUDE_DIR}) set(GBM_DEFINITIONS -DHAVE_GBM=1) - if(GBM_HAS_BO_MAP) - list(APPEND GBM_DEFINITIONS -DHAS_GBM_BO_MAP=1) - endif() - if(GBM_HAS_MODIFIERS) - list(APPEND GBM_DEFINITIONS -DHAS_GBM_MODIFIERS=1) - endif() + #if(GBM_HAS_BO_MAP) + # list(APPEND GBM_DEFINITIONS -DHAS_GBM_BO_MAP=1) + #endif() + #if(GBM_HAS_MODIFIERS) + # list(APPEND GBM_DEFINITIONS -DHAS_GBM_MODIFIERS=1) + #endif() if(NOT TARGET GBM::GBM) add_library(GBM::GBM UNKNOWN IMPORTED) set_target_properties(GBM::GBM PROPERTIES diff --git a/system/settings/linux.xml b/system/settings/linux.xml index 531974f3f4..6244ef7515 100644 --- a/system/settings/linux.xml +++ b/system/settings/linux.xml @@ -177,7 +177,7 @@ </dependency> </dependencies> <level>3</level> - <default>true</default> + <default>false</default> <control type="toggle" /> </setting> <setting id="videoplayer.useprimerenderer" type="integer" label="13462" help="13463"> diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp index a7dc0890e8..ad8c41dcf0 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp @@ -42,6 +42,16 @@ extern "C" { #define RINT lrint #endif +/* define the FFMPEG codecs to use */ +#define MPEG2TS_FFMPEG_CODEC "mpeg2_v4l2m2m" +#define H263_FFMPEG_CODEC "h263_v4l2m2m" +#define H264_FFMPEG_CODEC "h264_v4l2m2m" +#define MPEG4_FFMPEG_CODEC "mpeg4_v4l2m2m" +#define MPEG1_FFMPEG_CODEC "mpeg1_v4l2m2m" +#define MPEG2_FFMPEG_CODEC "mpeg2_v4l2m2m" +#define VC1_FFMPEG_CODEC "vc1_v4l2m2m" +#define VP8_FFMPEG_CODEC "vp8_v4l2m2m" + enum DecoderState { STATE_NONE, @@ -346,6 +356,41 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options pCodec = avcodec_find_decoder_by_name("av1"); if (!pCodec) + if(!m_useSoftDecoder) + { + switch(hints.codec) + { + case AV_CODEC_ID_MPEG4: + pCodec = avcodec_find_decoder_by_name(MPEG4_FFMPEG_CODEC); + break; + case AV_CODEC_ID_MPEG2TS: + pCodec = avcodec_find_decoder_by_name(MPEG2TS_FFMPEG_CODEC); + break; + case AV_CODEC_ID_H263: + pCodec = avcodec_find_decoder_by_name(H263_FFMPEG_CODEC); + break; + case AV_CODEC_ID_H264: + pCodec = avcodec_find_decoder_by_name(H264_FFMPEG_CODEC); + break; + case AV_CODEC_ID_MPEG1VIDEO: + pCodec = avcodec_find_decoder_by_name(MPEG1_FFMPEG_CODEC); + break; + case AV_CODEC_ID_MPEG2VIDEO: + pCodec = avcodec_find_decoder_by_name(MPEG2_FFMPEG_CODEC); + break; + case AV_CODEC_ID_VC1: + pCodec = avcodec_find_decoder_by_name(VC1_FFMPEG_CODEC); + break; + case AV_CODEC_ID_VP8: + pCodec = avcodec_find_decoder_by_name(VP8_FFMPEG_CODEC); + break; + default: + pCodec = avcodec_find_decoder(hints.codec); + break; + } + } + + if(pCodec == NULL) pCodec = avcodec_find_decoder(hints.codec); if(pCodec == NULL) @@ -446,7 +491,7 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options } UpdateName(); - const char* pixFmtName = av_get_pix_fmt_name(m_pCodecContext->pix_fmt); + const char* pixFmtName = av_get_pix_fmt_name(GetFormat(m_pCodecContext, &m_pCodecContext->pix_fmt)); m_processInfo.SetVideoDimensions(m_pCodecContext->coded_width, m_pCodecContext->coded_height); m_processInfo.SetVideoPixelFormat(pixFmtName ? pixFmtName : ""); @@ -529,15 +574,22 @@ void CDVDVideoCodecFFmpeg::SetFilters() void CDVDVideoCodecFFmpeg::UpdateName() { + bool isHW = false; if(m_pCodecContext->codec->name) + { m_name = std::string("ff-") + m_pCodecContext->codec->name; + if(strstr(m_pCodecContext->codec->name, "v4l2m2m") != NULL) + isHW = true; + } else m_name = "ffmpeg"; if(m_pHardware) + { m_name += "-" + m_pHardware->Name(); - - m_processInfo.SetVideoDecoderName(m_name, m_pHardware ? true : false); + isHW = true; + } + m_processInfo.SetVideoDecoderName(m_name, isHW ? true : false); CLog::Log(LOGDEBUG, "CDVDVideoCodecFFmpeg - Updated codec: {}", m_name); } @@ -784,8 +836,14 @@ CDVDVideoCodec::VCReturn CDVDVideoCodecFFmpeg::GetPicture(VideoPicture* pVideoPi if (m_pDecodedFrame->interlaced_frame) m_interlaced = true; else + { m_interlaced = false; - + if (m_useSoftDecoder) + { + m_useSoftDecoder = false; + return VC_REOPEN; + } + } if (!m_processInfo.GetVideoInterlaced() && m_interlaced) m_processInfo.SetVideoInterlaced(m_interlaced); diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h index 86c83cd1a0..a5552d3350 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h @@ -95,6 +95,7 @@ protected: bool m_requestSkipDeint = false; int m_codecControlFlags = 0; bool m_interlaced = false; + bool m_useSoftDecoder = true; double m_DAR = 1.0; CDVDStreamInfo m_hints; CDVDCodecOptions m_options; diff --git a/xbmc/windowing/Resolution.cpp b/xbmc/windowing/Resolution.cpp index 4dcd2480ff..78e37add98 100644 --- a/xbmc/windowing/Resolution.cpp +++ b/xbmc/windowing/Resolution.cpp @@ -70,6 +70,8 @@ float RESOLUTION_INFO::DisplayRatio() const RESOLUTION CResolutionUtils::ChooseBestResolution(float fps, int width, int height, bool is3D) { + fps = static_cast<float>(std::round(fps)); + RESOLUTION res = CServiceBroker::GetWinSystem()->GetGfxContext().GetVideoResolution(); float weight; diff --git a/xbmc/windowing/gbm/GBMUtils.cpp b/xbmc/windowing/gbm/GBMUtils.cpp index 5267c93c8f..bc0a9b1c96 100644 --- a/xbmc/windowing/gbm/GBMUtils.cpp +++ b/xbmc/windowing/gbm/GBMUtils.cpp @@ -74,24 +74,28 @@ CGBMUtils::CGBMDevice::CGBMSurface::CGBMSurface(gbm_surface* surface) : m_surfac { } +#define MAX_SURFACE_BUFFERS 3 CGBMUtils::CGBMDevice::CGBMSurface::CGBMSurfaceBuffer* CGBMUtils::CGBMDevice::CGBMSurface:: LockFrontBuffer() { - m_buffers.emplace(std::make_unique<CGBMSurfaceBuffer>(m_surface)); - - if (!static_cast<bool>(gbm_surface_has_free_buffers(m_surface))) + /* Fix for ODROID XU4, gbm_surface_has_free_buffers doesn't seem to report if there + * are no buffers available instead GEM buffers are running out, so we manually empty + * the buffers here for a maximum of three + */ + std::call_once( + flag, [this]() { CLog::Log(LOGDEBUG, "CGBMUtils - using {} buffers", MAX_SURFACE_BUFFERS); }); + + if (m_buffers.size() >= MAX_SURFACE_BUFFERS) { - /* - * We want to use call_once here because we want it to be logged the first time that - * we have to release buffers. This means that the maximum amount of buffers had been reached. - * For mesa this should be 4 buffers but it may vary across other implementations. - */ - std::call_once( - flag, [this]() { CLog::Log(LOGDEBUG, "CGBMUtils - using {} buffers", m_buffers.size()); }); - - m_buffers.pop(); + while (!m_buffers.empty()) + { + m_buffers.front(); + m_buffers.pop(); + } } + m_buffers.emplace(std::make_unique<CGBMSurfaceBuffer>(m_surface)); + return m_buffers.back().get(); } diff --git a/xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp b/xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp index 83a59413f7..dbddbbbd55 100644 --- a/xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp +++ b/xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp @@ -23,7 +23,7 @@ bool CWinSystemGbmEGLContext::InitWindowSystemEGL(EGLint renderableType, EGLint return false; } - if (!m_eglContext.CreatePlatformDisplay(m_GBM->GetDevice()->Get(), m_GBM->GetDevice()->Get())) + if (!m_eglContext.CreatePlatformDisplay(m_GBM->GetDevice()->Get(), reinterpret_cast<EGLNativeDisplayType>(m_GBM->GetDevice()->Get()))) { return false; } diff --git a/xbmc/windowing/gbm/drm/DRMUtils.cpp b/xbmc/windowing/gbm/drm/DRMUtils.cpp index b424dffe80..9924756b7a 100644 --- a/xbmc/windowing/gbm/drm/DRMUtils.cpp +++ b/xbmc/windowing/gbm/drm/DRMUtils.cpp @@ -189,7 +189,7 @@ bool CDRMUtils::FindPlanes() auto videoPlane = std::find_if(m_planes.begin(), m_planes.end(), [&i](auto& plane) { if (plane->GetPossibleCrtcs() & (1 << i)) { - return plane->SupportsFormat(DRM_FORMAT_NV12); + return (plane->SupportsFormat(DRM_FORMAT_NV12) || plane->SupportsFormat(DRM_FORMAT_XRGB8888)); } return false; }); -- 2.17.1 ================================================ FILE: projects/Samsung/patches/linux/samsung-0001-HACK-drm-set-DRM_RENDER_ALLOW-flag-on-DRM_IOCTL_MODE.patch ================================================ From 009b15525e53e5d96dd75c43543b57f3505c7081 Mon Sep 17 00:00:00 2001 From: Dongwon Kim <dongwon.kim@intel.com> Date: Fri, 24 Jun 2022 12:48:38 +0000 Subject: [PATCH 01/21] HACK: drm: set DRM_RENDER_ALLOW flag on DRM_IOCTL_MODE_CREATE/DESTROY_DUMB ioctls Render clients should be able to create/destroy dumb object to import and use it as render buffer in case the default DRM device is different from the render device (i.e. kmsro). Signed-off-by: Dongwon Kim <dongwon.kim@intel.com> --- drivers/gpu/drm/drm_ioctl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c index 51fcf1298023..8984c60037b2 100644 --- a/drivers/gpu/drm/drm_ioctl.c +++ b/drivers/gpu/drm/drm_ioctl.c @@ -672,9 +672,9 @@ static const struct drm_ioctl_desc drm_ioctls[] = { DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb_ioctl, 0), DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER), DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER), - DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, 0), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, DRM_RENDER_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, 0), - DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, 0), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_RENDER_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, drm_mode_obj_get_properties_ioctl, 0), DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_SETPROPERTY, drm_mode_obj_set_property_ioctl, DRM_MASTER), DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR2, drm_mode_cursor2_ioctl, DRM_MASTER), -- 2.17.1 ================================================ FILE: projects/Samsung/patches/linux/samsung-0002-WIP-media-videobuf2-always-enable-V4L2_MEMORY_FLAG_N.patch ================================================ From 4aca48cc2517dcd5abab9b0cca22c65c54d75a03 Mon Sep 17 00:00:00 2001 From: Pavel Golikov <Paullo612@ya.ru> Date: Fri, 24 Jun 2022 15:42:59 +0000 Subject: [PATCH 02/21] WIP: media: videobuf2: always enable V4L2_MEMORY_FLAG_NON_COHERENT Always enable V4L2_MEMORY_FLAG_NON_COHERENT for all V4L queues. Signed-off-by: Pavel Golikov <Paullo612@ya.ru> --- drivers/media/common/videobuf2/videobuf2-v4l2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c index 075d24ebf44c..ecbb5f7d3f23 100644 --- a/drivers/media/common/videobuf2/videobuf2-v4l2.c +++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c @@ -704,7 +704,7 @@ static void validate_memory_flags(struct vb2_queue *q, *flags = 0; } else { /* Clear all unknown flags. */ - *flags &= V4L2_MEMORY_FLAG_NON_COHERENT; + *flags |= V4L2_MEMORY_FLAG_NON_COHERENT; } } -- 2.17.1 ================================================ FILE: projects/Samsung/patches/linux/samsung-0003-WIP-iommu-io-pgtable-arm-Fix-coherency-support-for-M.patch ================================================ From 530424bde16e74a8542d34709ac13be3c426afe1 Mon Sep 17 00:00:00 2001 From: Pavel Golikov <Paullo612@ya.ru> Date: Fri, 24 Jun 2022 15:54:16 +0000 Subject: [PATCH 03/21] WIP: iommu/io-pgtable-arm: Fix coherency support for Mali LPAE Mali T628r0p1 which may be found in Samsung Exynos 5422 SOC is definitely not dma coherent, and it is not happy with PTE_SH_OS bit set by default in commit 728da60da7c1 ("iommu/io-pgtable-arm: Support coherency for Mali LPAE"). Use PTE_SH_IS by default for non dma coherent Mali GPUs. Signed-off-by: Pavel Golikov <Paullo612@ya.ru> --- drivers/iommu/io-pgtable-arm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c index 94ff319ae8ac..9ac55085e141 100644 --- a/drivers/iommu/io-pgtable-arm.c +++ b/drivers/iommu/io-pgtable-arm.c @@ -457,9 +457,10 @@ static arm_lpae_iopte arm_lpae_prot_to_pte(struct arm_lpae_io_pgtable *data, * "outside the GPU" (i.e. either the Inner or System domain in CPU * terms, depending on coherency). */ - if (prot & IOMMU_CACHE && data->iop.fmt != ARM_MALI_LPAE) + if (prot & IOMMU_CACHE || + (data->iop.fmt == ARM_MALI_LPAE && !data->iop.cfg.coherent_walk)) pte |= ARM_LPAE_PTE_SH_IS; - else + else if (data->iop.fmt == ARM_MALI_LPAE) pte |= ARM_LPAE_PTE_SH_OS; if (prot & IOMMU_NOEXEC) -- 2.17.1 ================================================ FILE: projects/Samsung/patches/linux/samsung-0004-WIP-soc-samsung-pm_domains-Bring-back-old-driver-imp.patch ================================================ From 77acb18b46a9464521f4f9af26f87d8a5f644515 Mon Sep 17 00:00:00 2001 From: Pavel Golikov <Paullo612@ya.ru> Date: Fri, 24 Jun 2022 15:56:41 +0000 Subject: [PATCH 04/21] WIP: soc: samsung: pm_domains: Bring back old driver implementation Using new implementation decreases Mali GPU performance significantly (with both KBase and Panfrost drivers). Signed-off-by: Pavel Golikov <Paullo612@ya.ru> --- drivers/soc/samsung/pm_domains.c | 97 ++++++++++++++++---------------- 1 file changed, 49 insertions(+), 48 deletions(-) diff --git a/drivers/soc/samsung/pm_domains.c b/drivers/soc/samsung/pm_domains.c index d07f3c9d6903..1022d40eb700 100644 --- a/drivers/soc/samsung/pm_domains.c +++ b/drivers/soc/samsung/pm_domains.c @@ -16,7 +16,7 @@ #include <linux/delay.h> #include <linux/of_address.h> #include <linux/of_platform.h> -#include <linux/pm_runtime.h> +#include <linux/sched.h> struct exynos_pm_domain_config { /* Value for LOCAL_PWR_CFG and STATUS fields for each domain */ @@ -72,15 +72,15 @@ static int exynos_pd_power_off(struct generic_pm_domain *domain) return exynos_pd_power(domain, false); } -static const struct exynos_pm_domain_config exynos4210_cfg = { +static const struct exynos_pm_domain_config exynos4210_cfg __initconst = { .local_pwr_cfg = 0x7, }; -static const struct exynos_pm_domain_config exynos5433_cfg = { +static const struct exynos_pm_domain_config exynos5433_cfg __initconst = { .local_pwr_cfg = 0xf, }; -static const struct of_device_id exynos_pm_domain_of_match[] = { +static const struct of_device_id exynos_pm_domain_of_match[] __initconst = { { .compatible = "samsung,exynos4210-pd", .data = &exynos4210_cfg, @@ -91,7 +91,7 @@ static const struct of_device_id exynos_pm_domain_of_match[] = { { }, }; -static const char *exynos_get_domain_name(struct device_node *node) +static __init const char *exynos_get_domain_name(struct device_node *node) { const char *name; @@ -100,44 +100,60 @@ static const char *exynos_get_domain_name(struct device_node *node) return kstrdup_const(name, GFP_KERNEL); } -static int exynos_pd_probe(struct platform_device *pdev) +static __init int exynos4_pm_init_power_domain(void) { - const struct exynos_pm_domain_config *pm_domain_cfg; - struct device *dev = &pdev->dev; - struct device_node *np = dev->of_node; - struct of_phandle_args child, parent; - struct exynos_pm_domain *pd; - int on, ret; + struct device_node *np; + const struct of_device_id *match; - pm_domain_cfg = of_device_get_match_data(dev); - pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL); - if (!pd) - return -ENOMEM; + for_each_matching_node_and_match(np, exynos_pm_domain_of_match, &match) { + const struct exynos_pm_domain_config *pm_domain_cfg; + struct exynos_pm_domain *pd; + int on; - pd->pd.name = exynos_get_domain_name(np); - if (!pd->pd.name) - return -ENOMEM; + pm_domain_cfg = match->data; - pd->base = of_iomap(np, 0); - if (!pd->base) { - kfree_const(pd->pd.name); - return -ENODEV; - } + pd = kzalloc(sizeof(*pd), GFP_KERNEL); + if (!pd) { + of_node_put(np); + return -ENOMEM; + } + pd->pd.name = exynos_get_domain_name(np); + if (!pd->pd.name) { + kfree(pd); + of_node_put(np); + return -ENOMEM; + } - pd->pd.power_off = exynos_pd_power_off; - pd->pd.power_on = exynos_pd_power_on; - pd->local_pwr_cfg = pm_domain_cfg->local_pwr_cfg; + pd->base = of_iomap(np, 0); + if (!pd->base) { + pr_warn("%s: failed to map memory\n", __func__); + kfree_const(pd->pd.name); + kfree(pd); + continue; + } + + pd->pd.power_off = exynos_pd_power_off; + pd->pd.power_on = exynos_pd_power_on; + pd->local_pwr_cfg = pm_domain_cfg->local_pwr_cfg; - on = readl_relaxed(pd->base + 0x4) & pd->local_pwr_cfg; + on = readl_relaxed(pd->base + 0x4) & pd->local_pwr_cfg; + + pm_genpd_init(&pd->pd, NULL, !on); + of_genpd_add_provider_simple(np, &pd->pd); + } - pm_genpd_init(&pd->pd, NULL, !on); - ret = of_genpd_add_provider_simple(np, &pd->pd); + /* Assign the child power domains to their parents */ + for_each_matching_node(np, exynos_pm_domain_of_match) { + struct of_phandle_args child, parent; - if (ret == 0 && of_parse_phandle_with_args(np, "power-domains", - "#power-domain-cells", 0, &parent) == 0) { child.np = np; child.args_count = 0; + if (of_parse_phandle_with_args(np, "power-domains", + "#power-domain-cells", 0, + &parent) != 0) + continue; + if (of_genpd_add_subdomain(&parent, &child)) pr_warn("%pOF failed to add subdomain: %pOF\n", parent.np, child.np); @@ -146,21 +162,6 @@ static int exynos_pd_probe(struct platform_device *pdev) parent.np, child.np); } - pm_runtime_enable(dev); - return ret; -} - -static struct platform_driver exynos_pd_driver = { - .probe = exynos_pd_probe, - .driver = { - .name = "exynos-pd", - .of_match_table = exynos_pm_domain_of_match, - .suppress_bind_attrs = true, - } -}; - -static __init int exynos4_pm_init_power_domain(void) -{ - return platform_driver_register(&exynos_pd_driver); + return 0; } core_initcall(exynos4_pm_init_power_domain); -- 2.17.1 ================================================ FILE: projects/Samsung/patches/linux/samsung-0005-WIP-arm-dts-exynos5422-HC1-XU3-XU4-model-name-is-ODR.patch ================================================ From 34cfc53ec99e6e3356bb6e06ecd68faa4d2e4bac Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Wed, 29 Apr 2020 10:37:08 +0000 Subject: [PATCH 05/21] WIP: arm: dts: exynos5422: HC1/XU3/XU4 model name is ODROID not Odroid Cosmetic change to model and audio card name for HC1/XU3/XU4 to put ODROID in capitals (as per Hardkernel branding). Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- arch/arm/boot/dts/exynos5422-odroidhc1.dts | 5 ++--- arch/arm/boot/dts/exynos5422-odroidxu3-audio.dtsi | 2 +- arch/arm/boot/dts/exynos5422-odroidxu3-lite.dts | 2 +- arch/arm/boot/dts/exynos5422-odroidxu3.dts | 2 +- arch/arm/boot/dts/exynos5422-odroidxu4.dts | 7 +++---- 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/arch/arm/boot/dts/exynos5422-odroidhc1.dts b/arch/arm/boot/dts/exynos5422-odroidhc1.dts index d91f7fa2cf80..6550d59ce3d8 100644 --- a/arch/arm/boot/dts/exynos5422-odroidhc1.dts +++ b/arch/arm/boot/dts/exynos5422-odroidhc1.dts @@ -11,9 +11,8 @@ #include "exynos5422-odroid-core.dtsi" / { - model = "Hardkernel Odroid HC1"; - compatible = "hardkernel,odroid-hc1", "samsung,exynos5800", \ - "samsung,exynos5"; + model = "Hardkernel ODROID HC1"; + compatible = "hardkernel,odroid-hc1", "samsung,exynos5800", "samsung,exynos5"; led-controller { compatible = "pwm-leds"; diff --git a/arch/arm/boot/dts/exynos5422-odroidxu3-audio.dtsi b/arch/arm/boot/dts/exynos5422-odroidxu3-audio.dtsi index 86b96f9706db..1a3940f2ead2 100644 --- a/arch/arm/boot/dts/exynos5422-odroidxu3-audio.dtsi +++ b/arch/arm/boot/dts/exynos5422-odroidxu3-audio.dtsi @@ -13,7 +13,7 @@ / { sound: sound { compatible = "samsung,odroid-xu3-audio"; - model = "Odroid-XU3"; + model = "ODROID-XU3"; samsung,audio-widgets = "Headphone", "Headphone Jack", diff --git a/arch/arm/boot/dts/exynos5422-odroidxu3-lite.dts b/arch/arm/boot/dts/exynos5422-odroidxu3-lite.dts index e3154a1cae23..4d337f9e79b8 100644 --- a/arch/arm/boot/dts/exynos5422-odroidxu3-lite.dts +++ b/arch/arm/boot/dts/exynos5422-odroidxu3-lite.dts @@ -14,7 +14,7 @@ #include "exynos54xx-odroidxu-leds.dtsi" / { - model = "Hardkernel Odroid XU3 Lite"; + model = "Hardkernel ODROID XU3 Lite"; compatible = "hardkernel,odroid-xu3-lite", "samsung,exynos5800", "samsung,exynos5"; aliases { diff --git a/arch/arm/boot/dts/exynos5422-odroidxu3.dts b/arch/arm/boot/dts/exynos5422-odroidxu3.dts index a378d4937ff7..21cf909b9cc8 100644 --- a/arch/arm/boot/dts/exynos5422-odroidxu3.dts +++ b/arch/arm/boot/dts/exynos5422-odroidxu3.dts @@ -13,7 +13,7 @@ #include "exynos54xx-odroidxu-leds.dtsi" / { - model = "Hardkernel Odroid XU3"; + model = "Hardkernel ODROID XU3"; compatible = "hardkernel,odroid-xu3", "samsung,exynos5800", "samsung,exynos5"; aliases { diff --git a/arch/arm/boot/dts/exynos5422-odroidxu4.dts b/arch/arm/boot/dts/exynos5422-odroidxu4.dts index 1c24f9b35973..caf4f50e91df 100644 --- a/arch/arm/boot/dts/exynos5422-odroidxu4.dts +++ b/arch/arm/boot/dts/exynos5422-odroidxu4.dts @@ -13,9 +13,8 @@ #include "exynos5422-odroidxu3-common.dtsi" / { - model = "Hardkernel Odroid XU4"; - compatible = "hardkernel,odroid-xu4", "samsung,exynos5800", \ - "samsung,exynos5"; + model = "Hardkernel ODROID XU4"; + compatible = "hardkernel,odroid-xu4", "samsung,exynos5800", "samsung,exynos5"; led-controller { compatible = "pwm-leds"; @@ -31,7 +30,7 @@ sound: sound { compatible = "samsung,odroid-xu3-audio"; - model = "Odroid-XU4"; + model = "ODROID-XU4"; samsung,audio-routing = "I2S Playback", "Mixer DAI TX"; -- 2.17.1 ================================================ FILE: projects/Samsung/patches/linux/samsung-0006-WIP-media-s5p-mfc-Allow-cache-hints-for-queues.patch ================================================ From f07c3dc233b36997c3dcd679fa24fb4040a57d4f Mon Sep 17 00:00:00 2001 From: Pavel Golikov <Paullo612@ya.ru> Date: Fri, 24 Jun 2022 15:56:05 +0000 Subject: [PATCH 06/21] WIP: media: s5p-mfc: Allow cache hints for queues Passing V4L2_MEMORY_FLAG_NON_COHERENT from userspace significantly improves video rendering performance on Exynos 5422 (Odroid XU4). Signed-off-by: Pavel Golikov <Paullo612@ya.ru> --- drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c index 761341934925..e33863d9ae2d 100644 --- a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c +++ b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c @@ -861,6 +861,7 @@ static int s5p_mfc_open(struct file *file) q->dma_attrs = DMA_ATTR_ALLOC_SINGLE_PAGES; q->mem_ops = &vb2_dma_contig_memops; q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; + q->allow_cache_hints = 1; ret = vb2_queue_init(q); if (ret) { mfc_err("Failed to initialize videobuf2 queue(capture)\n"); @@ -896,6 +897,7 @@ static int s5p_mfc_open(struct file *file) q->dma_attrs = DMA_ATTR_ALLOC_SINGLE_PAGES; q->mem_ops = &vb2_dma_contig_memops; q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; + q->allow_cache_hints = 1; ret = vb2_queue_init(q); if (ret) { mfc_err("Failed to initialize videobuf2 queue(output)\n"); -- 2.17.1 ================================================ FILE: projects/Samsung/patches/linux/samsung-0007-WIP-media-s5p-mfc-use-EAGAIN-not-EIO-for-MFCINST_ERR.patch ================================================ From a31044355812a2e9e0df4edd3a1c503c7c77eee0 Mon Sep 17 00:00:00 2001 From: Christian Hewitt <christianshewitt@gmail.com> Date: Tue, 28 Jun 2022 07:34:21 +0000 Subject: [PATCH 07/21] WIP: media: s5p-mfc: use EAGAIN not EIO for MFCINST_ERROR Patch from https://forum.odroid.com/viewtopic.php?p=319025&sid=1fbdb9d8f7ea0ebee30dc8824f76d308#p319025 Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> --- drivers/media/platform/samsung/s5p-mfc/s5p_mfc_dec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_dec.c b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_dec.c index 268ffe4da53c..ff5756e446d6 100644 --- a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_dec.c +++ b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_dec.c @@ -632,7 +632,7 @@ static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *buf) if (ctx->state == MFCINST_ERROR) { mfc_err("Call on QBUF after unrecoverable error\n"); - return -EIO; + return -EAGAIN; } if (buf->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) return vb2_qbuf(&ctx->vq_src, NULL, buf); @@ -652,7 +652,7 @@ static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf) if (ctx->state == MFCINST_ERROR) { mfc_err_limited("Call on DQBUF after unrecoverable error\n"); - return -EIO; + return -EAGAIN; } switch (buf->type) { -- 2.17.1 ================================================ FILE: projects/Samsung/patches/linux/samsung-0008-WIP-ARM-dma-mapping-implement-alloc_noncontiguous.patch ================================================ From a3760f539508e81d47b21321aa42a09ce96555d3 Mon Sep 17 00:00:00 2001 From: Pavel Golikov <Paullo612@ya.ru> Date: Fri, 24 Jun 2022 15:52:58 +0000 Subject: [PATCH 08/21] WIP: ARM/dma-mapping: implement ->alloc_noncontiguous Implement support for allocating a non-contiguous DMA region. The implementation is based on the ma-iommu driver. Signed-off-by: Pavel Golikov <Paullo612@ya.ru> --- arch/arm/mm/dma-mapping.c | 59 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 059cce018570..8f867cb9fe75 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -1759,6 +1759,63 @@ static void arm_iommu_unmap_sg(struct device *dev, } } +static struct sg_table *arm_iommu_alloc_noncontiguous(struct device *dev, + size_t size, enum dma_data_direction dir, gfp_t gfp, + unsigned long attrs) +{ + struct dma_sgt_handle *sh; + int count; + + sh = kmalloc(sizeof(*sh), gfp); + if (!sh) + return NULL; + + size = PAGE_ALIGN(size); + count = size >> PAGE_SHIFT; + + /* + * Following is a work-around (a.k.a. hack) to prevent pages + * with __GFP_COMP being passed to split_page() which cannot + * handle them. The real problem is that this flag probably + * should be 0 on ARM as it is not supported on this + * platform; see CONFIG_HUGETLBFS. + */ + gfp &= ~(__GFP_COMP); + + sh->pages = __iommu_alloc_buffer(dev, size, gfp, attrs, false); + if (!sh->pages) + goto err_sh; + + if (sg_alloc_table_from_pages(&sh->sgt, sh->pages, count, 0, size, + GFP_KERNEL)) + goto err_buffer; + + if (arm_iommu_map_sg(dev, sh->sgt.sgl, sh->sgt.orig_nents, dir, attrs + ) < 1) + goto err_free_sg; + + return &sh->sgt; + +err_free_sg: + sg_free_table(&sh->sgt); +err_buffer: + __iommu_free_buffer(dev, sh->pages, size, attrs); +err_sh: + kfree(sh); + return NULL; +} + +static void arm_iommu_free_noncontiguous(struct device *dev, size_t size, + struct sg_table *sgt, enum dma_data_direction dir) +{ + struct dma_sgt_handle *sh = sgt_handle(sgt); + + arm_iommu_unmap_sg(dev, sgt->sgl, sgt->orig_nents, dir, 0); + __iommu_free_buffer(dev, sh->pages, PAGE_ALIGN(size), 0); + sg_free_table(&sh->sgt); + kfree(sh); +} + /** * arm_iommu_sync_sg_for_cpu * @dev: valid struct device pointer @@ -1996,6 +2053,8 @@ static const struct dma_map_ops iommu_ops = { .map_page = arm_iommu_map_page, .unmap_page = arm_iommu_unmap_page, + .alloc_noncontiguous = arm_iommu_alloc_noncontiguous, + .free_noncontiguous = arm_iommu_free_noncontiguous, .sync_single_for_cpu = arm_iommu_sync_single_for_cpu, .sync_single_for_device = arm_iommu_sync_single_for_device, -- 2.17.1 ================================================ FILE: projects/Samsung/patches/linux/samsung-0009-MEMEKA-ARM-dma-mapping-increase-DMA-coherent-pool-si.patch ================================================ From 3062d6e0008928c46388d6b118d4ae2137d5d0f4 Mon Sep 17 00:00:00 2001 From: memeka <mihailescu2m@gmail.com> Date: Mon, 21 Oct 2019 10:58:47 +1030 Subject: [PATCH 09/21] MEMEKA: ARM: dma-mapping: increase DMA coherent pool size to 2M --- arch/arm/mm/dma-mapping.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 8f867cb9fe75..7493dcf0567a 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -315,7 +315,7 @@ static void *__alloc_remap_buffer(struct device *dev, size_t size, gfp_t gfp, pgprot_t prot, struct page **ret_page, const void *caller, bool want_vaddr); -#define DEFAULT_DMA_COHERENT_POOL_SIZE SZ_256K +#define DEFAULT_DMA_COHERENT_POOL_SIZE SZ_2M static struct gen_pool *atomic_pool __ro_after_init; static size_t atomic_pool_size __initdata = DEFAULT_DMA_COHERENT_POOL_SIZE; -- 2.17.1 ================================================ FILE: projects/Samsung/patches/linux/samsung-0010-MEMEKA-drm-exynos-mixer-never-blend-the-base-layer.patch ================================================ From 16718487d729416d1f6c371c1cb524f817f2d019 Mon Sep 17 00:00:00 2001 From: OtherCrashOverride <OtherCrashOverride@users.noreply.github.com> Date: Sun, 9 Apr 2017 17:31:25 +0000 Subject: [PATCH 10/21] MEMEKA: drm/exynos/mixer: never blend the base layer On Exynos there is a solid color plane that is logically below all the other display planes. This causes display artifacts due to alpha. The patch disables blending the base plane with the solid color plane (no alpha). Reviewed-by: memeka <mihailescu2m@gmail.com> Signed-off-by: memeka <mihailescu2m@gmail.com> --- drivers/gpu/drm/exynos/exynos_mixer.c | 33 +++++++++++++++------------ 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index e5204be86093..430622e0d8d4 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c @@ -315,23 +315,26 @@ static void mixer_cfg_gfx_blend(struct mixer_context *ctx, unsigned int win, u32 val; val = MXR_GRP_CFG_COLOR_KEY_DISABLE; /* no blank key */ - switch (pixel_alpha) { - case DRM_MODE_BLEND_PIXEL_NONE: - break; - case DRM_MODE_BLEND_COVERAGE: - val |= MXR_GRP_CFG_PIXEL_BLEND_EN; - break; - case DRM_MODE_BLEND_PREMULTI: - default: - val |= MXR_GRP_CFG_BLEND_PRE_MUL; - val |= MXR_GRP_CFG_PIXEL_BLEND_EN; - break; - } + if (win) { + switch (pixel_alpha) { + case DRM_MODE_BLEND_PIXEL_NONE: + break; + case DRM_MODE_BLEND_COVERAGE: + val |= MXR_GRP_CFG_PIXEL_BLEND_EN; + break; + case DRM_MODE_BLEND_PREMULTI: + default: + val |= MXR_GRP_CFG_BLEND_PRE_MUL; + val |= MXR_GRP_CFG_PIXEL_BLEND_EN; + break; + } - if (alpha != DRM_BLEND_ALPHA_OPAQUE) { - val |= MXR_GRP_CFG_WIN_BLEND_EN; - val |= win_alpha; + if (alpha != DRM_BLEND_ALPHA_OPAQUE) { + val |= MXR_GRP_CFG_WIN_BLEND_EN; + val |= win_alpha; + } } + mixer_reg_writemask(ctx, MXR_GRAPHIC_CFG(win), val, MXR_GRP_CFG_MISC_MASK); } -- 2.17.1 ================================================ FILE: projects/Samsung/patches/linux/samsung-0011-MEMEKA-media-exynos-gsc-fix-v4l2-SELECTION-api.patch ================================================ From 8078cb106c24c415f96c21f0a3e91b8d28741045 Mon Sep 17 00:00:00 2001 From: Marian Mihailescu <mihailescu2m@gmail.com> Date: Fri, 24 Jun 2022 17:30:42 +0000 Subject: [PATCH 11/21] MEMEKA: media: exynos-gsc: fix v4l2 SELECTION api Signed-off-by: Marian Mihailescu <mihailescu2m@gmail.com> --- drivers/media/platform/samsung/exynos-gsc/gsc-core.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/samsung/exynos-gsc/gsc-core.h b/drivers/media/platform/samsung/exynos-gsc/gsc-core.h index e894e85e84a4..95fda27de0a3 100644 --- a/drivers/media/platform/samsung/exynos-gsc/gsc-core.h +++ b/drivers/media/platform/samsung/exynos-gsc/gsc-core.h @@ -481,9 +481,9 @@ static inline struct gsc_frame *ctx_get_frame(struct gsc_ctx *ctx, { struct gsc_frame *frame; - if (V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE == type) { + if (V4L2_BUF_TYPE_VIDEO_OUTPUT == type || V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE == type) { frame = &ctx->s_frame; - } else if (V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE == type) { + } else if (V4L2_BUF_TYPE_VIDEO_CAPTURE == type || V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE == type) { frame = &ctx->d_frame; } else { pr_err("Wrong buffer/video queue type (%d)", type); -- 2.17.1 ================================================ FILE: projects/Samsung/patches/linux/samsung-0012-MEMEKA-media-s5p-mfc-copy-timestamp-and-timecode-in-.patch ================================================ From ddff825a6c234556d761c8cb23d6c28c97d85339 Mon Sep 17 00:00:00 2001 From: Marian Mihailescu <mihailescu2m@gmail.com> Date: Fri, 24 Jun 2022 17:36:37 +0000 Subject: [PATCH 12/21] MEMEKA: media: s5p-mfc: copy timestamp and timecode in encoder output Signed-off-by: Marian Mihailescu <mihailescu2m@gmail.com> --- drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c index b65e506665af..d445466046eb 100644 --- a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c +++ b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c @@ -1214,6 +1214,7 @@ static int enc_post_frame_start(struct s5p_mfc_ctx *ctx) { struct s5p_mfc_dev *dev = ctx->dev; struct s5p_mfc_buf *mb_entry; + struct s5p_mfc_buf *dst_buf; unsigned long enc_y_addr = 0, enc_c_addr = 0; unsigned long mb_y_addr, mb_c_addr; int slice_type; @@ -1233,8 +1234,12 @@ static int enc_post_frame_start(struct s5p_mfc_ctx *ctx) &mb_entry->b->vb2_buf, 0); mb_c_addr = vb2_dma_contig_plane_dma_addr( &mb_entry->b->vb2_buf, 1); + dst_buf = list_entry(ctx->dst_queue.next, + struct s5p_mfc_buf, list); if ((enc_y_addr == mb_y_addr) && (enc_c_addr == mb_c_addr)) { + dst_buf->b->timecode = mb_entry->b->timecode; + dst_buf->b->vb2_buf.timestamp = mb_entry->b->vb2_buf.timestamp; list_del(&mb_entry->list); ctx->src_queue_cnt--; vb2_buffer_done(&mb_entry->b->vb2_buf, @@ -1247,8 +1252,12 @@ static int enc_post_frame_start(struct s5p_mfc_ctx *ctx) &mb_entry->b->vb2_buf, 0); mb_c_addr = vb2_dma_contig_plane_dma_addr( &mb_entry->b->vb2_buf, 1); + dst_buf = list_entry(ctx->dst_queue.next, + struct s5p_mfc_buf, list); if ((enc_y_addr == mb_y_addr) && (enc_c_addr == mb_c_addr)) { + dst_buf->b->timecode = mb_entry->b->timecode; + dst_buf->b->vb2_buf.timestamp = mb_entry->b->vb2_buf.timestamp; list_del(&mb_entry->list); ctx->ref_queue_cnt--; vb2_buffer_done(&mb_entry->b->vb2_buf, -- 2.17.1 ================================================ FILE: projects/Samsung/patches/linux/samsung-0013-MEMEKA-media-s5p-mfc-stop-streaming-before-releasing.patch ================================================ From 30b928690575651687ae46f4bdbc946efd9cc0bd Mon Sep 17 00:00:00 2001 From: Marian Mihailescu <mihailescu2m@gmail.com> Date: Fri, 24 Jun 2022 17:38:45 +0000 Subject: [PATCH 13/21] MEMEKA: media: s5p-mfc: stop streaming before releasing queues If streaming is active when the MFC device is closed, it will generate an IOMMU page-fault. Signed-off-by: Marian Mihailescu <mihailescu2m@gmail.com> --- drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c index e33863d9ae2d..f9b4b506c04c 100644 --- a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c +++ b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c @@ -943,6 +943,11 @@ static int s5p_mfc_release(struct file *file) mfc_debug_enter(); if (dev) mutex_lock(&dev->mfc_mutex); + + /* stop streaming */ + vb2_streamoff(&ctx->vq_src, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); + vb2_streamoff(&ctx->vq_dst, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); + vb2_queue_release(&ctx->vq_src); vb2_queue_release(&ctx->vq_dst); if (dev) { -- 2.17.1 ================================================ FILE: projects/Samsung/patches/u-boot/u-boot-0001-add-xu4-defconfig.patch ================================================ From 2ef9471bc9bfe516649a7b3c3debd6c95d2290c4 Mon Sep 17 00:00:00 2001 From: chewitt <christianshewitt@gmail.com> Date: Mon, 27 Apr 2020 03:02:53 +0000 Subject: [PATCH] add xu4 defconfig --- configs/odroid-xu4_defconfig | 68 ++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 configs/odroid-xu4_defconfig diff --git a/configs/odroid-xu4_defconfig b/configs/odroid-xu4_defconfig new file mode 100644 index 0000000000..097f03b243 --- /dev/null +++ b/configs/odroid-xu4_defconfig @@ -0,0 +1,70 @@ +CONFIG_ARM=y +CONFIG_ARCH_CPU_INIT=y +CONFIG_ARCH_EXYNOS=y +CONFIG_SYS_TEXT_BASE=0x43E00000 +CONFIG_ARCH_EXYNOS5=y +CONFIG_ENV_SIZE=0x4000 +CONFIG_ENV_OFFSET=0x310000 +CONFIG_NR_DRAM_BANKS=8 +CONFIG_IDENT_STRING=" for ODROID-XU4" +CONFIG_DISTRO_DEFAULTS=y +# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set +CONFIG_SYS_LOAD_ADDR=0x43e00000 +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x42e00000 +CONFIG_FIT=y +CONFIG_FIT_BEST_MATCH=y +CONFIG_SILENT_CONSOLE=y +CONFIG_CONSOLE_MUX=y +CONFIG_MISC_INIT_R=y +CONFIG_BOARD_LATE_INIT=y +# CONFIG_DISPLAY_BOARDINFO is not set +CONFIG_DISPLAY_BOARDINFO_LATE=y +CONFIG_BOARD_TYPES=y +CONFIG_SYS_PROMPT="ODROID# " +CONFIG_CMD_THOR_DOWNLOAD=y +CONFIG_CMD_DFU=y +CONFIG_CMD_GPIO=y +CONFIG_CMD_I2C=y +CONFIG_CMD_MMC=y +CONFIG_CMD_USB=y +CONFIG_CMD_USB_MASS_STORAGE=y +# CONFIG_CMD_SETEXPR is not set +CONFIG_CMD_CACHE=y +CONFIG_CMD_TIME=y +CONFIG_CMD_PMIC=y +CONFIG_CMD_REGULATOR=y +CONFIG_CMD_EXT4_WRITE=y +CONFIG_DEFAULT_DEVICE_TREE="exynos5422-odroidxu3" +#CONFIG_ENV_IS_IN_MMC is not set +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y +CONFIG_ADC=y +CONFIG_ADC_EXYNOS=y +CONFIG_DFU_MMC=y +CONFIG_SUPPORT_EMMC_BOOT=y +CONFIG_MMC_DW=y +CONFIG_MTD=y +CONFIG_SMC911X=y +CONFIG_SMC911X_BASE=0x5000000 +CONFIG_DM_ETH=y +CONFIG_DM_PMIC=y +CONFIG_PMIC_S2MPS11=y +CONFIG_DM_REGULATOR=y +CONFIG_DM_REGULATOR_S2MPS11=y +CONFIG_USB=y +CONFIG_DM_USB=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_DWC3=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_DWC3=y +CONFIG_USB_DWC3_PHY_SAMSUNG=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_MANUFACTURER="Samsung" +CONFIG_USB_GADGET_VENDOR_NUM=0x04e8 +CONFIG_USB_GADGET_PRODUCT_NUM=0x6601 +CONFIG_USB_GADGET_DOWNLOAD=y +CONFIG_USB_FUNCTION_THOR=y +CONFIG_USB_HOST_ETHER=y +CONFIG_VIDEO_BRIDGE=y +CONFIG_ERRNO_STR=y -- 2.17.1 ================================================ FILE: scripts/autoreconf ================================================ #!/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 "${1}" RECONF_DIR="${3}" if [ ! -f "${RECONF_DIR}/configure.in" \ -a ! -f "${RECONF_DIR}/configure.ac" ]; then die "configure.in or configure.ac not found" fi if [ ! -f "${RECONF_DIR}/.autoreconf-done" ]; then PARENT_PKG="${2}" # lock package during autoreconf otherwise it is racy, eg. glib:host/glib:target building concurrently pkg_lock "${PKG_NAME}" "reconf" "${PARENT_PKG}" if [ ! -f "${RECONF_DIR}/.autoreconf-done" ]; then pkg_lock_status "ACTIVE" "${PKG_NAME}" "reconf" touch "${RECONF_DIR}/NEWS" "${RECONF_DIR}/AUTHORS" "${RECONF_DIR}/ChangeLog" mkdir -p "${RECONF_DIR}/m4" build_msg "CLR_AUTORECONF" "AUTORECONF" "${PKG_NAME}" "indent" do_autoreconf "${RECONF_DIR}" touch "${RECONF_DIR}/.autoreconf-done" pkg_lock_status "UNLOCK" "${PKG_NAME}" "reconf" "configured" else pkg_lock_status "UNLOCK" "${PKG_NAME}" "reconf" "already configured" fi fi ================================================ FILE: scripts/autoremove ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) . config/options "${1}" if [ -d "${PKG_BUILD}" -a "${PKG_SECTION}" != "virtual" ]; then print_color CLR_AUTOREMOVE "AUTOREMOVE ${PKG_BUILD}" echo rm -r "${PKG_BUILD}" fi ================================================ FILE: scripts/build ================================================ #!/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 "${1}" record_timestamp BUILD_BEGIN if [ -z "${1}" ]; then die "usage: ${0} package_name[:<host|target|init|bootstrap>] [parent_pkg]" fi if [ "${1}" = "--all" ]; then if [ -n "${2}" ]; then for build_dir in $(ls -1d ${BUILD_ROOT}/${BUILD_BASE}.*); do load_build_config ${build_dir} && ${SCRIPTS}/build "${2}" done fi exit 0 fi if [ -z "${PKG_NAME}" ]; then die "$(print_color CLR_ERROR "${1}: no package.mk file found")" fi if [ -n "${PKG_ARCH}" ]; then listcontains "${PKG_ARCH}" "!${TARGET_ARCH}" && exit 0 listcontains "${PKG_ARCH}" "${TARGET_ARCH}" || listcontains "${PKG_ARCH}" "any" || exit 0 fi if [ "${1//:/}" != "${1}" ]; then TARGET="${1#*:}" else TARGET= fi TARGET="${TARGET:-target}" PARENT_PKG="${2:-${PKG_NAME}:${TARGET}}" pkg_lock "${PKG_NAME}:${TARGET}" "build" "${PARENT_PKG}" mkdir -p ${STAMPS}/${PKG_NAME} STAMP=${STAMPS}/${PKG_NAME}/build_${TARGET} if [ -f ${STAMP} ]; then . ${STAMP} PKG_DEEPHASH=$(calculate_stamp) if [ "${PKG_DEEPHASH}" = "${STAMP_PKG_DEEPHASH}" -a "${BUILD_WITH_DEBUG}" = "${STAMP_BUILD_WITH_DEBUG}" ]; then # stamp matched: already built, do nothing pkg_lock_status "UNLOCK" "${PKG_NAME}:${TARGET}" "build" "already built" exit 0 fi rm -f ${STAMP} fi ${SCRIPTS}/unpack "${PKG_NAME}" "${PARENT_PKG}" # build dependencies, only when PKG_DEPENDS_? is filled unset _pkg_depends case "${TARGET}" in "target") _pkg_depends="${PKG_DEPENDS_TARGET}";; "host") _pkg_depends="${PKG_DEPENDS_HOST}";; "init") _pkg_depends="${PKG_DEPENDS_INIT}";; "bootstrap") _pkg_depends="${PKG_DEPENDS_BOOTSTRAP}";; esac if is_sequential_build; then for p in ${_pkg_depends}; do ${SCRIPTS}/build "${p}" "${PARENT_PKG}" done fi # virtual packages are not built as they only contain dependencies, so dont go further here if [ "${PKG_SECTION}" = "virtual" ]; then PKG_DEEPHASH=$(calculate_stamp) for i in PKG_NAME PKG_DEEPHASH BUILD_WITH_DEBUG; do echo "STAMP_${i}=\"${!i}\"" >> ${STAMP} done pkg_lock_status "UNLOCK" "${PKG_NAME}:${TARGET}" "build" "built" exit 0 fi # build this package if [ "${BUILD_WITH_DEBUG}" = "yes" ]; then build_msg "CLR_BUILD" "BUILD" "${PKG_NAME} $(print_color "CLR_TARGET" "(${TARGET})") [DEBUG]" "indent" else build_msg "CLR_BUILD" "BUILD" "${PKG_NAME} $(print_color "CLR_TARGET" "(${TARGET})")" "indent" fi # setup configure scripts PKG_CONFIGURE_SCRIPT="${PKG_CONFIGURE_SCRIPT:-${PKG_BUILD}/configure}" PKG_CMAKE_SCRIPT="${PKG_CMAKE_SCRIPT:-${PKG_BUILD}/CMakeLists.txt}" PKG_MESON_SCRIPT="${PKG_MESON_SCRIPT:-${PKG_BUILD}/meson.build}" # auto detect toolchain _auto_toolchain="" if [ -z "${PKG_TOOLCHAIN}" -o "${PKG_TOOLCHAIN}" = "auto" ]; then if [ -f "${PKG_MESON_SCRIPT}" ]; then PKG_TOOLCHAIN="meson" elif [ -f "${PKG_CMAKE_SCRIPT}" ]; then PKG_TOOLCHAIN="cmake" elif [ -f "${PKG_CONFIGURE_SCRIPT}" ]; then PKG_TOOLCHAIN="configure" elif [ -f "${PKG_BUILD}/Makefile" ]; then PKG_TOOLCHAIN="make" else die "Not possible to detect toolchain automatically. Add PKG_TOOLCHAIN= to package.mk" fi _auto_toolchain=" (auto-detect)" fi if ! listcontains "meson cmake cmake-make configure ninja make autotools manual" "${PKG_TOOLCHAIN}"; then die "$(print_color "CLR_ERROR" "ERROR:") unknown toolchain ${PKG_TOOLCHAIN}" fi build_msg "CLR_TOOLCHAIN" "TOOLCHAIN" "${PKG_TOOLCHAIN}${_auto_toolchain}" # check wrong toolchain configuration check_toolchain_config ${TARGET} ${PKG_TOOLCHAIN} # multilib support if flag_enabled "lib32" "no"; then use_32_options elif flag_enabled "lib32:${TARGET}" "no"; then use_32_options fi # setup toolchain setup_toolchain ${TARGET} ${PKG_TOOLCHAIN} # configure install directory [ -n "${PKG_INSTALL}" ] && INSTALL="${PKG_INSTALL}" || unset INSTALL # remove previous install files if [ -n "${INSTALL}" -a -d "${INSTALL}" ]; then rm -rf "${INSTALL}" fi # configure debug build defaults if [ "${BUILD_WITH_DEBUG}" = "yes" ]; then CMAKE_BUILD_TYPE="Debug" MESON_BUILD_TYPE="debug" else CMAKE_BUILD_TYPE="MinSizeRel" MESON_BUILD_TYPE="plain" fi CMAKE_GENERATOR_NINJA="-GNinja \ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON" # configure TARGET build defaults TARGET_CONFIGURE_OPTS="--host=${TARGET_NAME} \ --build=${HOST_NAME} \ --prefix=/usr \ --bindir=/usr/bin \ --sbindir=/usr/sbin \ --sysconfdir=/etc \ --libdir=/usr/lib \ --libexecdir=/usr/lib \ --localstatedir=/var \ --disable-static \ --enable-shared" TARGET_CMAKE_OPTS="-DCMAKE_TOOLCHAIN_FILE=${CMAKE_CONF} \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" TARGET_MESON_OPTS="--prefix=/usr \ --bindir=/usr/bin \ --sbindir=/usr/sbin \ --sysconfdir=/etc \ --libdir=/usr/lib \ --libexecdir=/usr/lib \ --localstatedir=/var \ --buildtype=${MESON_BUILD_TYPE}" if [ "${BUILD_WITH_DEBUG}" != "yes" ] && flag_enabled "strip" "yes"; then TARGET_MESON_OPTS+=" -Dstrip=true" fi # configure HOST build defaults HOST_CONFIGURE_OPTS="--host=${HOST_NAME} \ --build=${HOST_NAME} \ --prefix=${TOOLCHAIN} \ --bindir=${TOOLCHAIN}/bin \ --sbindir=${TOOLCHAIN}/sbin \ --sysconfdir=${TOOLCHAIN}/etc \ --libexecdir=${TOOLCHAIN}/lib \ --localstatedir=${TOOLCHAIN}/var \ --disable-static \ --enable-shared" HOST_CMAKE_OPTS="${CMAKE_GENERATOR} \ -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CONF} \ -DCMAKE_INSTALL_PREFIX=${TOOLCHAIN} \ -DCMAKE_BUILD_TYPE=Release" HOST_MESON_OPTS="--prefix=${TOOLCHAIN} \ --bindir=${TOOLCHAIN}/bin \ --sbindir=${TOOLCHAIN}/sbin \ --sysconfdir=${TOOLCHAIN}/etc \ --libdir=${TOOLCHAIN}/lib \ --libexecdir=${TOOLCHAIN}/lib \ --localstatedir=${TOOLCHAIN}/var \ --buildtype=plain" # configure INIT build defaults INIT_CONFIGURE_OPTS="${TARGET_CONFIGURE_OPTS}" INIT_CMAKE_OPTS="${TARGET_CMAKE_OPTS}" INIT_MESON_OPTS="${TARGET_MESON_OPTS}" # configure BOOTSTRAP build defaults BOOTSTRAP_CONFIGURE_OPTS="${HOST_CONFIGURE_OPTS}" BOOTSTRAP_CMAKE_OPTS="${HOST_CMAKE_OPTS}" BOOTSTRAP_MESON_OPTS="${HOST_MESON_OPTS}" record_timestamp BUILD_START # make autoreconf if [ "${PKG_TOOLCHAIN}" = "autotools" ]; then ${SCRIPTS}/autoreconf "${PKG_NAME}" "${PARENT_PKG}" $(dirname "${PKG_CONFIGURE_SCRIPT}") fi pkg_lock_status "ACTIVE" "${PKG_NAME}:${TARGET}" "build" # include build template and build pkg_call_exists_opt pre_build_${TARGET} && pkg_call # ensure ${PKG_BUILD} is there. (installer? PKG_URL="") mkdir -p "${PKG_BUILD}" cd "${PKG_BUILD}" if [ -f "${PKG_CONFIGURE_SCRIPT}" -o -f "${PKG_CMAKE_SCRIPT}" -o -f "${PKG_MESON_SCRIPT}" ]; then case "${TARGET}" in "target") PKG_REAL_BUILD="${PKG_BUILD}/.${TARGET_NAME}" ;; "host") PKG_REAL_BUILD="${PKG_BUILD}/.${HOST_NAME}" ;; "init") PKG_REAL_BUILD="${PKG_BUILD}/.${TARGET_NAME}-${TARGET}" ;; "bootstrap") PKG_REAL_BUILD="${PKG_BUILD}/.${HOST_NAME}-${TARGET}" ;; esac mkdir -p "${PKG_REAL_BUILD}" cd "${PKG_REAL_BUILD}" MESON_CONF="${PKG_REAL_BUILD}/meson.conf" fi # create wrapper scripts in build dir and use them for CC/CXX when # building for host and local-cc build flag is set if [ "${TARGET}" = "host" ] && flag_enabled "local-cc" "no"; then cat > libreelec-local-cc << EOF #!/bin/sh exec ${CC} "\$@" EOF chmod +x libreelec-local-cc export CC=$(pwd)/libreelec-local-cc cat > libreelec-local-cxx << EOF #!/bin/sh exec ${CXX} "\$@" EOF chmod +x libreelec-local-cxx export CXX=$(pwd)/libreelec-local-cxx fi # configure if [ -n "${PKG_DEPENDS_CONFIG}" -a -n "${PKG_INSTALL}" ]; then for pkg in ${PKG_DEPENDS_CONFIG}; do for dir in "$(get_install_dir ${pkg})"/{usr/local/,usr/,}{lib/,share/}pkgconfig; do if [ -d "${dir}" ]; then build_msg "CLR_TOOLCHAIN" "PKG_CONFIG_PATH" "${dir}" [ -n "${PKG_CONFIG_PATH}" ] && PKG_CONFIG_PATH+=":" PKG_CONFIG_PATH+="${dir}" fi done done export PKG_CONFIG_PATH fi record_timestamp BUILD_CONFIGURE pkg_call_exists_opt pre_configure && pkg_call pkg_call_exists_opt pre_configure_${TARGET} && pkg_call if pkg_call_exists configure_${TARGET}; then pkg_call else case "${PKG_TOOLCHAIN}:${TARGET}" in # meson builds "meson:target") create_meson_conf_target ${TARGET} ${MESON_CONF} echo "Executing (target): meson setup ${TARGET_MESON_OPTS} --cross-file=${MESON_CONF} ${PKG_MESON_OPTS_TARGET} ${PKG_MESON_SCRIPT%/*}" | tr -s " " CC="${HOST_CC}" CXX="${HOST_CXX}" meson setup ${TARGET_MESON_OPTS} --cross-file=${MESON_CONF} ${PKG_MESON_OPTS_TARGET} ${PKG_MESON_SCRIPT%/*} ;; "meson:host") create_meson_conf_host ${TARGET} ${MESON_CONF} echo "Executing (host): meson setup ${HOST_MESON_OPTS} --native-file=${MESON_CONF} ${PKG_MESON_OPTS_HOST} ${PKG_MESON_SCRIPT%/*}" | tr -s " " meson setup ${HOST_MESON_OPTS} --native-file=${MESON_CONF} ${PKG_MESON_OPTS_HOST} ${PKG_MESON_SCRIPT%/*} ;; "meson:init") create_meson_conf_target ${TARGET} ${MESON_CONF} echo "Executing (init): meson setup ${INIT_MESON_OPTS} --cross-file=${MESON_CONF} ${PKG_MESON_OPTS_INIT} ${PKG_MESON_SCRIPT%/*}" | tr -s " " meson setup ${INIT_MESON_OPTS} --cross-file=${MESON_CONF} ${PKG_MESON_OPTS_INIT} ${PKG_MESON_SCRIPT%/*} ;; "meson:bootstrap") create_meson_conf_host ${TARGET} ${MESON_CONF} echo "Executing (bootstrap): meson setup ${BOOTSTRAP_MESON_OPTS} ----native-file=${MESON_CONF} ${PKG_MESON_OPTS_BOOTSTRAP} ${PKG_MESON_SCRIPT%/*}" | tr -s " " meson setup ${BOOTSTRAP_MESON_OPTS} --native-file=${MESON_CONF} ${PKG_MESON_OPTS_BOOTSTRAP} ${PKG_MESON_SCRIPT%/*} ;; # cmake builds with ninja "cmake:target") echo "Executing (target): cmake ${CMAKE_GENERATOR_NINJA} ${TARGET_CMAKE_OPTS} ${PKG_CMAKE_OPTS_TARGET} ${PKG_CMAKE_SCRIPT%/*}" | tr -s " " cmake ${CMAKE_GENERATOR_NINJA} ${TARGET_CMAKE_OPTS} ${PKG_CMAKE_OPTS_TARGET} ${PKG_CMAKE_SCRIPT%/*} ;; "cmake:host") echo "Executing (host): cmake ${CMAKE_GENERATOR_NINJA} ${HOST_CMAKE_OPTS} ${PKG_CMAKE_OPTS_HOST} ${PKG_CMAKE_SCRIPT%/*}" | tr -s " " cmake ${CMAKE_GENERATOR_NINJA} ${HOST_CMAKE_OPTS} ${PKG_CMAKE_OPTS_HOST} ${PKG_CMAKE_SCRIPT%/*} ;; "cmake:init") echo "Executing (init): cmake ${CMAKE_GENERATOR_NINJA} ${INIT_CMAKE_OPTS} ${PKG_CMAKE_OPTS_INIT} ${PKG_CMAKE_SCRIPT%/*}" | tr -s " " cmake ${CMAKE_GENERATOR_NINJA} ${INIT_CMAKE_OPTS} ${PKG_CMAKE_OPTS_INIT} ${PKG_CMAKE_SCRIPT%/*} ;; "cmake:bootstrap") echo "Executing (bootstrap): cmake ${CMAKE_GENERATOR_NINJA} ${BOOTSTRAP_CMAKE_OPTS} ${PKG_CMAKE_OPTS_BOOTSTRAP} ${PKG_CMAKE_SCRIPT%/*}" | tr -s " " cmake ${CMAKE_GENERATOR_NINJA} ${BOOTSTRAP_CMAKE_OPTS} ${PKG_CMAKE_OPTS_BOOTSTRAP} ${PKG_CMAKE_SCRIPT%/*} ;; # cmake builds with make "cmake-make:target") echo "Executing (target): cmake ${TARGET_CMAKE_OPTS} ${PKG_CMAKE_OPTS_TARGET} ${PKG_CMAKE_SCRIPT%/*}" | tr -s " " cmake ${TARGET_CMAKE_OPTS} ${PKG_CMAKE_OPTS_TARGET} ${PKG_CMAKE_SCRIPT%/*} ;; "cmake-make:host") echo "Executing (host): cmake ${HOST_CMAKE_OPTS} ${PKG_CMAKE_OPTS_HOST} ${PKG_CMAKE_SCRIPT%/*}" | tr -s " " cmake ${HOST_CMAKE_OPTS} ${PKG_CMAKE_OPTS_HOST} ${PKG_CMAKE_SCRIPT%/*} ;; "cmake-make:init") echo "Executing (init): cmake ${INIT_CMAKE_OPTS} ${PKG_CMAKE_OPTS_INIT} ${PKG_CMAKE_SCRIPT%/*}" | tr -s " " cmake ${INIT_CMAKE_OPTS} ${PKG_CMAKE_OPTS_INIT} ${PKG_CMAKE_SCRIPT%/*} ;; "cmake-make:bootstrap") echo "Executing (bootstrap): cmake ${BOOTSTRAP_CMAKE_OPTS} ${PKG_CMAKE_OPTS_BOOTSTRAP} ${PKG_CMAKE_SCRIPT%/*}" | tr -s " " cmake ${BOOTSTRAP_CMAKE_OPTS} ${PKG_CMAKE_OPTS_BOOTSTRAP} ${PKG_CMAKE_SCRIPT%/*} ;; # configure builds "configure:target"|"autotools:target") echo "Executing (target): ${PKG_CONFIGURE_SCRIPT} ${TARGET_CONFIGURE_OPTS} ${PKG_CONFIGURE_OPTS_TARGET}" | tr -s " " ${PKG_CONFIGURE_SCRIPT} ${TARGET_CONFIGURE_OPTS} ${PKG_CONFIGURE_OPTS_TARGET} ;; "configure:host"|"autotools:host") echo "Executing (host): ${PKG_CONFIGURE_SCRIPT} ${HOST_CONFIGURE_OPTS} ${PKG_CONFIGURE_OPTS_HOST}" | tr -s " " ${PKG_CONFIGURE_SCRIPT} ${HOST_CONFIGURE_OPTS} ${PKG_CONFIGURE_OPTS_HOST} ;; "configure:init"|"autotools:init") echo "Executing (init): ${PKG_CONFIGURE_SCRIPT} ${INIT_CONFIGURE_OPTS} ${PKG_CONFIGURE_OPTS_INIT}" | tr -s " " ${PKG_CONFIGURE_SCRIPT} ${INIT_CONFIGURE_OPTS} ${PKG_CONFIGURE_OPTS_INIT} ;; "configure:bootstrap"|"autotools:bootstrap") echo "Executing (bootstrap): ${PKG_CONFIGURE_SCRIPT} ${BOOTSTRAP_CONFIGURE_OPTS} ${PKG_CONFIGURE_OPTS_BOOTSTRAP}" | tr -s " " ${PKG_CONFIGURE_SCRIPT} ${BOOTSTRAP_CONFIGURE_OPTS} ${PKG_CONFIGURE_OPTS_BOOTSTRAP} ;; esac fi pkg_call_exists_opt post_configure_${TARGET} && pkg_call record_timestamp BUILD_MAKE # make pkg_call_exists_opt pre_make_${TARGET} && pkg_call if pkg_call_exists make_${TARGET}; then pkg_call else case "${PKG_TOOLCHAIN}:${TARGET}" in # ninja based builds "meson:target"|"cmake:target"|"ninja:target") echo "Executing (target): ninja ${PKG_MAKE_OPTS_TARGET}" | tr -s " " ninja ${NINJA_OPTS} ${PKG_MAKE_OPTS_TARGET} ;; "meson:host"|"cmake:host"|"ninja:host") echo "Executing (host): ninja ${PKG_MAKE_OPTS_HOST}" | tr -s " " ninja ${NINJA_OPTS} ${PKG_MAKE_OPTS_HOST} ;; "meson:init"|"cmake:init"|"ninja:init") echo "Executing (init): ninja ${PKG_MAKE_OPTS_INIT}" | tr -s " " ninja ${NINJA_OPTS} ${PKG_MAKE_OPTS_INIT} ;; "meson:bootstrap"|"cmake:bootstrap"|"ninja:bootstrap") echo "Executing (bootstrap): ninja ${PKG_MAKE_OPTS_BOOTSTRAP}" | tr -s " " ninja ${NINJA_OPTS} ${PKG_MAKE_OPTS_BOOTSTRAP} ;; # make based builds "configure:target"|"cmake-make:target"|"autotools:target"|"make:target") echo "Executing (target): make ${PKG_MAKE_OPTS_TARGET}" | tr -s " " make ${PKG_MAKE_OPTS_TARGET} ;; "configure:host"|"cmake-make:host"|"autotools:host"|"make:host") echo "Executing (host): make ${PKG_MAKE_OPTS_HOST}" | tr -s " " make ${PKG_MAKE_OPTS_HOST} ;; "configure:init"|"cmake-make:init"|"autotools:init"|"make:init") echo "Executing (init): make ${PKG_MAKE_OPTS_INIT}" | tr -s " " make ${PKG_MAKE_OPTS_INIT} ;; "configure:bootstrap"|"cmake-make:bootstrap"|"autotools:bootstrap"|"make:bootstrap") echo "Executing (bootstrap): make ${PKG_MAKE_OPTS_BOOTSTRAP}" | tr -s " " make ${PKG_MAKE_OPTS_BOOTSTRAP} ;; esac fi pkg_call_exists_opt post_make_${TARGET} && pkg_call # Hack around directly writing/modifying the content of a shared sysroot # by temporarily installing new files to a package specific sysroot export PKG_ORIG_SYSROOT_PREFIX="${SYSROOT_PREFIX}" export SYSROOT_PREFIX="${BUILD}/.sysroot/${PKG_NAME}.${TARGET}" rm -rf "${SYSROOT_PREFIX}" # Create common sysroot directories as some packages expect them to exist. # TODO: Fix those packages so we don't need to pre-create directories. for d in /usr/lib /usr/include /usr/bin /usr/lib/pkgconfig; do mkdir -p "${SYSROOT_PREFIX}${d}" done record_timestamp BUILD_MAKEINSTALL # make install pkg_call_exists_opt pre_makeinstall_${TARGET} && pkg_call if pkg_call_exists makeinstall_${TARGET}; then pkg_call else flag_enabled "sysroot" "yes" && INSTALL_TO_SYSROOT="yes" || INSTALL_TO_SYSROOT="no" case "${PKG_TOOLCHAIN}:${TARGET}" in # ninja based builds "meson:target"|"cmake:target") [ "${INSTALL_TO_SYSROOT}" = "yes" ] && \ DESTDIR=${SYSROOT_PREFIX} ninja install ${PKG_MAKEINSTALL_OPTS_TARGET} DESTDIR=${INSTALL} ninja install ${PKG_MAKEINSTALL_OPTS_TARGET} ;; "meson:host"|"cmake:host") ninja install ${PKG_MAKEINSTALL_OPTS_HOST} ;; "meson:init"|"cmake:init") DESTDIR=${INSTALL} ninja install ${PKG_MAKEINSTALL_OPTS_INIT} ;; "meson:bootstrap"|"cmake:bootstrap") ninja install ${PKG_MAKEINSTALL_OPTS_BOOTSTRAP} ;; # make based builds "configure:target"|"cmake-make:target"|"autotools:target"|"make:target") [ "${INSTALL_TO_SYSROOT}" = "yes" ] && \ make install DESTDIR=${SYSROOT_PREFIX} -j1 ${PKG_MAKEINSTALL_OPTS_TARGET} make install DESTDIR=${INSTALL} ${PKG_MAKEINSTALL_OPTS_TARGET} ;; "configure:host"|"cmake-make:host"|"autotools:host"|"make:host") make install ${PKG_MAKEINSTALL_OPTS_HOST} ;; "configure:init"|"cmake-make:init"|"autotools:init"|"make:init") make install DESTDIR=${INSTALL} ${PKG_MAKEINSTALL_OPTS_INIT} ;; "configure:bootstrap"|"cmake-make:bootstrap"|"autotools:bootstrap"|"make:bootstrap") make install ${PKG_MAKEINSTALL_OPTS_BOOTSTRAP} ;; esac fi pkg_call_exists_opt post_makeinstall_${TARGET} && pkg_call record_timestamp BUILD_COPY_SYSROOT # Fixup temporary sysroot references to the shared sysroot for i in $(find "${SYSROOT_PREFIX}/usr/lib" -type f -name "*.la" 2>/dev/null); do sed -e "s:\(['= ]\)/usr:\\1${PKG_ORIG_SYSROOT_PREFIX}/usr:g" -i "${i}" done for i in $(find "${SYSROOT_PREFIX}/usr/bin" -type f -name "*-config" 2>/dev/null); do sed -e "s#${SYSROOT_PREFIX}/usr#${PKG_ORIG_SYSROOT_PREFIX}/usr#g" -i "${i}" done for i in $(find "${SYSROOT_PREFIX}/usr/lib" -type f -name "*.pc" 2>/dev/null); do sed -e "s#${SYSROOT_PREFIX}/usr#${PKG_ORIG_SYSROOT_PREFIX}/usr#g" -i "${i}" done for i in $(find "${SYSROOT_PREFIX}/usr"/{lib,share} -type f -name "*.cmake" 2>/dev/null); do sed -e "s#${SYSROOT_PREFIX}/usr#${PKG_ORIG_SYSROOT_PREFIX}/usr#g" -i "${i}" done for i in $(find "${SYSROOT_PREFIX}" -type l 2>/dev/null); do _tmp="$(readlink -m "${i}")" [[ ${_tmp} =~ ^/usr ]] && _tmp="${SYSROOT_PREFIX}${_tmp}" if [[ ${_tmp} =~ ^${SYSROOT_PREFIX}/ ]]; then ln -sfn "${_tmp/${SYSROOT_PREFIX}\//${PKG_ORIG_SYSROOT_PREFIX}\/}" "${i}" fi done # Transfer the new sysroot content to the shared sysroot acquire_update_lock sysroot mkdir -p "${PKG_ORIG_SYSROOT_PREFIX}" cp -PRf "${SYSROOT_PREFIX}"/* "${PKG_ORIG_SYSROOT_PREFIX}" release_update_lock rm -rf "${SYSROOT_PREFIX}" export SYSROOT_PREFIX="${PKG_ORIG_SYSROOT_PREFIX}" record_timestamp BUILD_CLEANUP_INSTALL if [ "${TARGET}" = "target" -o "${TARGET}" = "init" ]; then if [ -d ${INSTALL} ]; then rm -rf ${INSTALL}/{usr/local/,usr/,}man rm -rf ${INSTALL}/{usr/local/,usr/,}share/bash-completion rm -rf ${INSTALL}/{usr/local/,usr/,}share/doc rm -rf ${INSTALL}/{usr/local/,usr/,}share/gtk-doc rm -rf ${INSTALL}/{usr/local/,usr/,}share/info rm -rf ${INSTALL}/{usr/local/,usr/,}share/locale rm -rf ${INSTALL}/{usr/local/,usr/,}share/man rm -rf ${INSTALL}/{usr/local/,usr/,}share/zsh rm -rf ${INSTALL}/{usr/local/,usr/,}var find ${INSTALL} \( -name "*.orig" \ -o -name "*.rej" \ -o -name "*.in" \ -o -name ".git*" \) \ -exec rm -f {} \; 2>/dev/null || : find ${INSTALL} -type d -exec rmdir -p {} \; 2>/dev/null || : python_fix_abi "${INSTALL}" if [ "${BUILD_WITH_DEBUG}" != "yes" ] && flag_enabled "strip" "yes"; then ${STRIP} $(find ${INSTALL} \ -type f -name "*.so*" \ ! -name "ld-*.so" \ ! -name "libc-*.so" \ ! -name "libpthread-*.so" \ ! -name "libthread_db-*so" \ 2>/dev/null) 2>/dev/null || : if [ "${TARGET}" = "init" ]; then ${STRIP} $(find ${INSTALL} -type f -name "*.so*" 2>/dev/null) 2>/dev/null || : fi ${STRIP} $(find ${INSTALL} ! -name "*.so*" ! -name "*.ko" \ -type f -executable 2>/dev/null) 2>/dev/null || : fi fi fi if [ -n "${INSTALL}" -a -d "${INSTALL}" ]; then echo "INFO_PKG_NAME=\"${PKG_NAME}\"" > "${INSTALL}/.libreelec-package" fi cd ${ROOT} PKG_DEEPHASH=$(calculate_stamp) for i in PKG_NAME PKG_DEEPHASH BUILD_WITH_DEBUG; do echo "STAMP_${i}=\"${!i}\"" >> ${STAMP} done pkg_lock_status "UNLOCK" "${PKG_NAME}:${TARGET}" "build" "built" record_timestamp BUILD_END if [ -n "${TRACE_BUILD_TIMING}" ]; then ( print_color "CLR_AUTOREMOVE" "\nBuild timing details:" print_color "CLR_TARGET" "\n================================\n" show_timestamp_diff "unpack" BUILD_BEGIN BUILD_START show_timestamp_diff "pre-build setup" BUILD_START BUILD_CONFIGURE show_timestamp_diff "configure" BUILD_CONFIGURE BUILD_MAKE show_timestamp_diff "make" BUILD_MAKE BUILD_MAKEINSTALL show_timestamp_diff "make install" BUILD_MAKEINSTALL BUILD_COPY_SYSROOT show_timestamp_diff "copy sysroot" BUILD_COPY_SYSROOT BUILD_CLEANUP_INSTALL show_timestamp_diff "cleanup install" BUILD_CLEANUP_INSTALL BUILD_END print_color "CLR_TARGET" "--------------------------------\n" show_timestamp_diff "total time" BUILD_BEGIN BUILD_END echo -e ) >&${VERBOSE_OUT} fi ================================================ FILE: scripts/build_mt ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) . config/options "" . config/multithread ${SCRIPTS}/checkdeps # Setup both toolchain cmake configs to avoid potentially racy behaviour later. # Use a fork for host to isolate any variable modifications. ( setup_toolchain host ) setup_toolchain target MTADDONBUILD=no start_multithread_build ${@} ================================================ FILE: scripts/ccache_stats ================================================ #!/bin/bash # 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) . config/options "" ${TOOLCHAIN}/bin/ccache -s ================================================ FILE: scripts/checkdeps ================================================ #!/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) set -e # set up variables declare -A dep_map file_map perl_map need_map DEBUG="false" get_deps() { # start from a blank slate need_map=() for key in "${!dep_map[@]}"; do if ! command -v "${key}" >/dev/null; then need_map["${key}"]="${dep_map[${key}]}" fi done for key in "${!file_map[@]}"; do if [ ! -f "${key}" ]; then need_map["${key}"]="${file_map[${key}]}" fi done for key in "${!perl_map[@]}"; do if ! perl -M"${key}" -e exit 2>/dev/null; then need_map["perl::${key}"]="${perl_map[${key}]}" fi done } get_yes_no() { local ans read -p "Would you like to install the needed tools? (y/n)" ans [ "${ans,,}" = "y" ] && return 0 [ "${ans,,}" = "yes" ] && return 0 return 1 } if [ -f /etc/lsb-release ]; then DISTRO=$(grep DISTRIB_ID /etc/lsb-release | cut -d "=" -f 2) fi if [ -f /etc/os-release ]; then DISTRO=$(grep ^ID= /etc/os-release | cut -d "=" -f 2) fi DISTRO=${DISTRO,,} # [program]=package dep_map=( [bash]=bash [bc]=bc [bzip2]=bzip2 [diff]=diffutils [gawk]=gawk [gcc]=gcc [gperf]=gperf [gzip]=gzip [file]=file [lsdiff]=patchutils [lzop]=lzop [make]=make [patch]=patch [perl]=perl [sed]=sed [tar]=tar [unzip]=unzip [wget]=wget [xz]=xz-utils [zip]=zip [zstd]=zstd ) # [file]=package file_map=( [/usr/include/ncurses.h]=libncurses5-dev [/usr/include/stdio.h]=libc6-dev ) # [module]=package perl_map=( [JSON]=libjson-perl [Parse::Yapp::Driver]=libparse-yapp-perl [Thread::Queue]=perl [XML::Parser]=libxml-parser-perl ) ### PROJECT SPECIFIC REQUIREMENTS ### # Extend build scripts to look for distro/project/device checkdep scripts before adding further checks here # Native aarch64 on debian host needs to support rkbin (Rockchip) and aml_encrypt_* (Amlogic) if [ "$(uname -m)" = "aarch64" ] && [ "${PROJECT}" = "Rockchip" -o "${PROJECT}" = "Amlogic" ]; then dep_map[qemu-x86_64]=qemu-user-binfmt if [ ! -f /lib64/ld-linux-x86-64.so.2 -o ! -f /lib/x86_64-linux-gnu/libc.so.6 ]; then echo -e "Copy from a working x86_64 system:\n\t/lib64/ld-linux-x86-64.so.2\n\t/lib/x86_64-linux-gnu/libc.so.6" fi file_map[/lib64/ld-linux-x86-64.so.2]="libc6:amd64" file_map[/lib/x86_64-linux-gnu/libc.so.6]="libc6:amd64" fi if [ "$(uname -m)" = "aarch64" -a "${PROJECT}" = "Amlogic-ce" ]; then dep_map[qemu-x86_64]=qemu-user-binfmt fi # remap or add [depend]=package needs based on host distro case "${DISTRO}" in fedora|centos|rhel) dep_map+=( [g++]=gcc-c++ [mkfontscale]=xorg-x11-font-utils [mkfontdir]=xorg-x11-font-utils [xsltproc]=libxslt [java]=java-1.8.0-openjdk [python3]=python3 [rpcgen]=rpcgen ) if [ "${DISTRO}" = "fedora" ]; then dep_map+=( [bdftopcf]=bdftopcf ) else dep_map+=( [bdftopcf]=xorg-x11-font-utils ) fi if [[ ! $(rpm -qa glibc-static) ]]; then dep_map+=( [glibc-static]=glibc-static ) fi if [[ ! $(rpm -qa libstdc++-static) ]]; then dep_map+=( [libstdc++-static]=libstdc++-static ) fi file_map+=( [/usr/include/ncurses.h]=ncurses-devel [/usr/include/stdio.h]=glibc-headers ) perl_map+=( [JSON]=perl-JSON [Parse::Yapp::Driver]=perl-Parse-Yapp [Thread::Queue]=perl-Thread-Queue [XML::Parser]=perl-XML-Parser [FindBin]=perl-FindBin [File::Compare]=perl-File-Compare [File::Copy]=perl-File-Copy ) ;; gentoo|sabayon) dep_map+=( [g++]="gcc[cxx]" [mkfontscale]=mkfontscale [bdftopcf]=bdftopcf [xsltproc]=libxslt [java]=virtual/jre [python3]=python [rpcgen]=net-libs/rpcsvc-proto ) file_map+=( [/usr/include/stdio.h]=glibc [/usr/include/ncurses.h]=ncurses ) perl_map+=( [JSON]=JSON [Parse::Yapp::Driver]=perl-Parse-Yapp [Thread::Queue]=perl-Thread-Queue [XML::Parser]=XML-Parser ) ;; arch|endeavouros) dep_map+=( [g++]=g++ [mkfontscale]=xorg-mkfontscale [mkfontdir]=xorg-mkfontdir [bdftopcf]=xorg-bdftopcf [xsltproc]=libxslt [java]=jdk8-openjdk [python3]=python3 [rpcgen]=rpcsvc-proto ) perl_map+=( [JSON]=perl-json [XML::Parser]=perl-xml-parser [Thread::Queue]=perl [Parse::Yapp::Driver]=perl-parse-yapp ) ;; opensuse) dep_map+=( [g++]=gcc-c++ [mkfontscale]=mkfontscale [mkfontdir]=mkfontdir [bdftopcf]=bdftopcf [xsltproc]=libxslt-tools [java]=java-1_8_0-openjdk [python3]=python3 ) if [[ ! $(rpm -qa glibc-devel-static) ]]; then dep_map+=( [glibc-devel-static]=glibc-devel-static ) fi perl_map+=( [JSON]=perl-JSON [XML::Parser]=perl-XML-Parser [Thread::Queue]=perl [Parse::Yapp::Driver]=perl-Parse-Yapp ) ;; *) dep_map+=( [g++]=g++ [mkfontscale]=xfonts-utils [mkfontdir]=xfonts-utils [bdftopcf]=xfonts-utils [xsltproc]=xsltproc [java]=default-jre [python3]=python3 ) ;; esac if [ "${DEBUG}" = "true" ]; then echo "DEP MAP" for key in "${!dep_map[@]}"; do echo "${key}:${dep_map[${key}]}" done echo "FILE MAP" for key in "${!file_map[@]}"; do echo "${key}:${file_map[${key}]}" done echo "PERL MAP" for key in "${!perl_map[@]}"; do echo "${key}:${perl_map[${key}]}" done fi ### DEPENDENCY CHECKING AND INSTALLATION ### get_deps if [ "${DEBUG}" = "true" ]; then echo "NEED MAP" for key in "${!need_map[@]}"; do echo "${key}:${need_map[${key}]}" done fi if [ "${#need_map[@]}" -gt 0 ]; then echo "**** This system lacks the following tools needed to build ${DISTRONAME} ****" for key in "${!need_map[@]}"; do echo "${key} provided by ${need_map[${key}]}" done echo "**** The system appears to be a ${DISTRO} system ****" if command -v sudo >/dev/null; then case "${DISTRO}" in ubuntu|debian|linuxmint|\"elementary\") get_yes_no && sudo apt-get install "${need_map[@]}" ;; fedora|centos|rhel) command -v dnf >/dev/null && YUM=dnf || YUM=yum get_yes_no && sudo ${YUM} install "${need_map[@]}" ;; gentoo) get_yes_no && sudo emerge --ask --deep "${need_map[@]}" ;; sabayon) get_yes_no && sudo equo install --ask "${need_map[@]}" ;; mageia) get_yes_no && sudo urpmi "${need_map[@]}" ;; arch|endeavouros) get_yes_no && sudo pacman -Sy "${need_map[@]}" ;; opensuse) get_yes_no && sudo zypper install -y --no-recommends "${need_map[@]}" ;; *) echo "**** unsupported distro ${DISTRO} ****" exit 1 ;; esac else echo "The command 'sudo' was not found. Please install necessary packages manually." exit 1 fi fi # check if installed packages satisifed deps get_deps if [ "${#need_map[@]}" -gt 0 ]; then echo "**** The following packages were not installed correctly ****" for key in "${!need_map[@]}"; do echo "${key} provided by ${need_map[${key}]}" done echo "********" exit 1 fi ================================================ FILE: scripts/clean ================================================ #!/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 "${1}" clean_package() { build_msg "CLR_CLEAN" "CLEAN" "${1}" "indent" if [ "${CLEAN_SOURCES}" = "true" ]; then rm -rf "${SOURCES}/${1}" return fi # Use a wildcard here to remove all versions of the package for i in "${BUILD}/build/${1}-"* \ "${BUILD}/install_pkg/${1}-"* \ "${BUILD}/install_init/${1}-"*; do if [ -d "${i}" -a -f "${i}/.libreelec-unpack" ]; then . "${i}/.libreelec-unpack" if [ "${STAMP_PKG_NAME}" = "${1}" ]; then build_msg "CLR_WARNING" "*" "$(print_color "CLR_WARNING_DIM" "Removing ${i} ...")" rm -rf "${i}" fi elif [ -d "${i}" -a -f "${i}/.libreelec-package" ]; then # force clean if no stamp found (previous unpack failed) . "${i}/.libreelec-package" if [ "${INFO_PKG_NAME}" = "${1}" ]; then build_msg "CLR_WARNING" "*" "$(print_color "CLR_WARNING_DIM" "Removing ${i} ...")" rm -rf "${i}" fi fi done for i in "${BUILD}/qa_checks/${1}-"*; do build_msg "CLR_WARNING" "*" "$(print_color "CLR_WARNING_DIM" "Removing ${i} ...")" rm -rf "${i}" done rm -f "${STAMPS}/${1}/build_"* } if [ "${1}" = "--all" -a -n "${2}" ]; then for build_dir in $(ls -1d "${BUILD_ROOT}/${BUILD_BASE}."*); do load_build_config "${build_dir}" && "${SCRIPTS}/clean" "${2}" done elif [ -n "${1}" ]; then clean_package "${1}" fi ================================================ FILE: scripts/create_addon ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) . config/options "" . config/multithread usage() { cat - >&2 <<EOF SYNOPSIS ./script/create_addon [OPTION] [addons]... DESCRIPTION create_addon builds one or more addons. --show-only output the list of packages, which are intented to build --help shows this message [addons] list of addons to build. The addons can identified by: - the name of the addon - a group name of addons * all - all addons found under packages and project/*/packages * official - all addons found under packages/addons * binary - all addons found under packages/mediacenter/kodi-binary-addons - a regex term (grep styled), the term is automatic sorounded with string begin and end (^[term]$) addons can removed from list with a leading minus. EXAMPLE build all addons > ./script/create_addon all build audio encoders and decoders, only > ./script/create_addon audioencoder.* audiodecoder.* build all, but not binary > ./script/create_addon all -binary EOF exit ${1:-0} } # Get list of addon packages get_addons() { local paths filter local pkgpath exited local count=0 validpkg 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 exit() { exited=1; } for pkgpath in $(cat "${_CACHE_PACKAGE_LOCAL_DEVICE}" "${_CACHE_PACKAGE_LOCAL}" "${_CACHE_PACKAGE_GLOBAL}" | grep -E "${paths}"); do if [ -n "${filter}" ]; then [[ ${pkgpath} =~ ^.*/${filter}@?+?@ ]] || continue fi exited=0 source_package "${pkgpath%%@*}/package.mk" &>/dev/null [ ${exited} -eq 1 ] && continue validpkg="no" VERIFY_FAIL= # Should only build embedded addons when they are explictly specified in the addon list if [ "${PKG_IS_ADDON}" = "embedded" ]; then if [ -n "${filter}" ]; then verify_addon && validpkg="yes" fi elif [ "${PKG_IS_ADDON}" = "yes" ]; then verify_addon && validpkg="yes" fi if [ "${validpkg}" = "yes" ]; then echo "${PKG_NAME}" count=$((count + 1)) elif [ -n "${VERIFY_FAIL}" -a -n "${filter}" ]; then echo "$(print_color CLR_ERROR "${PKG_NAME}"): ${VERIFY_FAIL}" >&2 fi done unset -f exit if [ ${count} -eq 0 -a -n "${filter}" ]; then echo "$(print_color CLR_ERROR "ERROR: no addons matched for filter ${filter}")" >&2 echo "For more information type: ./scripts/create_addon --help" >&2 die fi } # Return 0 if package is a suitable addon, 1 otherwise verify_addon() { if [ -n "${PKG_ARCH}" ]; then VERIFY_FAIL="Incompatible arch: \"${TARGET_ARCH}\" not in [ ${PKG_ARCH} ]" listcontains "${PKG_ARCH}" "!${TARGET_ARCH}" && return 1 listcontains "${PKG_ARCH}" "${TARGET_ARCH}" || listcontains "${PKG_ARCH}" "any" || return 1 fi if [ -n "${PKG_ADDON_PROJECTS}" ]; then [ "${DEVICE}" = "RPi" ] && _DEVICE="RPi1" || _DEVICE="${DEVICE}" VERIFY_FAIL="Incompatible project or device: \"${_DEVICE:-${PROJECT}}\" not in [ ${PKG_ADDON_PROJECTS} ]" if listcontains "${PKG_ADDON_PROJECTS}" "!${_DEVICE:-${PROJECT}}" || listcontains "${PKG_ADDON_PROJECTS}" "!${PROJECT}"; then return 1 fi if ! listcontains "${PKG_ADDON_PROJECTS}" "${_DEVICE:-${PROJECT}}" && ! listcontains "${PKG_ADDON_PROJECTS}" "${PROJECT}" && ! listcontains "${PKG_ADDON_PROJECTS}" "any"; then return 1 fi fi return 0 } # need parameter if [ $# -eq 0 ]; then usage 1 fi # check environment and configure toolchains ${SCRIPTS}/checkdeps ( setup_toolchain host ) setup_toolchain target # collect list of addons for building addons= addons_drop= show_only="no" # read addons from parameter list while [ $# -gt 0 ]; do case ${1} in --help) usage 0;; --show-only) show_only="yes";; --*) usage 1;; -*) addons_drop+=" $(get_addons ${1:1})";; *) addons+=" $(get_addons ${1})";; esac shift done # Build a new list containing only those addons we want to build wanted_addons= for addon in $(echo ${addons} | tr ' ' '\n' | sort -u); do listcontains "${addons_drop}" "${addon}" || wanted_addons+=" ${addon}" done if [ "${show_only}" = "yes" ]; then for addon in ${wanted_addons}; do echo ${addon} done exit 0 fi # Build all addons at once using a single plan if MTADDONBUILD=yes start_multithread_build "${wanted_addons:1}"; then echo echo "$(print_color CLR_INFO "ALL ADDONS BUILT SUCCESSFULLY")" exit 0 elif [ -f "${THREAD_CONTROL}/addons.failed" ]; then echo >&2 print_color CLR_ERROR "FAILED ADDONS:\n" >&2 while read -r addon logfile; do if [ -n "${addon}" ]; then if [ -n "${logfile}" ]; then echo " $(print_color CLR_ERROR "${addon}"): ${logfile}" >&2 else echo " $(print_color CLR_ERROR "${addon}")" >&2 fi fi done < "${THREAD_CONTROL}/addons.failed" die else die "$(print_color CLR_ERROR "UNKNOWN BUILD FAILURE OR INABILITY TO GENERATE PLAN")" fi ================================================ FILE: scripts/create_docker_package ================================================ #!/bin/sh FIRST_LABEL=30002 LABEL_DEVICE="D" LABEL_ENV="E_" LABEL_PORT="P_" LABEL_VOLUME="V" STRING_DEVICE="-d " STRING_ENV="-e " STRING_PORT="-p " STRING_VOLUME="-v " add_default() { defaults="${defaults} <setting id=\"${1}\" value=\"${2}\" />\n" } add_device() { add_label default="${1%:*}" docker="${1#*:}" id="${LABEL_DEVICE}${docker//\//_}" add_default "${id}" "${default}" add_option "--device=\"\$${id}\"" add_setting "<setting label=\"${label}\" type=\"folder\" id=\"${id}\" default=\"${default}\" />" add_string "${STRING_DEVICE}${docker}" } add_env() { add_label default="${1#*=}" docker="${1%%=*}" id="${LABEL_ENV}${docker}" add_default "${id}" "${default}" add_option "-e ${docker}=\"${id}\"" add_setting "<setting label=\"${label}\" type=\"text\" id=\"${id}\" default=\"${default}\" />" add_string "${STRING_ENV}${docker}" } add_label() { if [ -z ${label} ]; then label=${FIRST_LABEL} else label=$((label+1)) fi } add_option() { if [ ! -z "${options}" ]; then options="${options} "'\\\n' fi options="${options} ${1}" } add_port() { add_label default="${1%:*}" docker="${1#*:}" port="${docker%/*}" id="${LABEL_PORT}${port}" add_default "${id}" "${default}" add_option "-p \"\$${id}\":${docker}" add_setting "<setting label=\"${label}\" type=\"number\" id=\"${id}\" default=\"${default}\" />" add_string "${STRING_PORT}${port}" } add_setting() { settings="${settings} ${1}\n" } add_string() { strings="${strings}\nmsgctxt \"${label}\"\nmsgid \"${1}\"\nmsgstr \"\"\n" } add_volume() { add_label default="${1%:*}" docker="${1#*:}" id="${LABEL_VOLUME}${docker//\//_}" add_default "${id}" "${default}" add_option "-v \"\$${id}\":${docker}" add_setting "<setting label=\"${label}\" type=\"folder\" id=\"${id}\" default=\"${default}\" />" add_string "${STRING_VOLUME}${docker}" } case "${ARCH}" in arm) projects="imx6 RPi RPi2" ;; x86_64) projects="Generic" ;; *) echo "Unkown project" exit 1 ;; esac while [[ $# -gt 0 ]]; do option="${1}" shift case "${option}" in --device=*) add_device "${option#--device=}" ;; --name=*) ;; --port=*) add_port "${option#--port=}" ;; --volume=*) add_volume "${option#--volume=}" ;; -e) add_env "${1}" shift ;; -p) add_port "${1}" shift ;; -v) add_volume "${1}" shift ;; -*) add_option "${option}" ;; */*) add_option "${option}" image="${option%:*}" version="${option#*:}" if [ "${version}" = "${option}" ]; then version="latest" fi if [ ! -z "$*" ]; then add_option "$*" fi break ;; *) add_option "${option}" ;; esac done if [ -z "${image}" ]; then echo "Failed to parse image" exit 1 fi name="${image//\//.}" dir="packages/addons/docker/${name}" if [ -d "${dir}" ]; then echo "Package already exists" exit 1 fi cp -R config/docker "${dir}" sed -e "s|@NAME@|${name}|g" \ -e "s|@VERSION@|${version}|g" \ -e "s|@ARCH@|${arch}|g" \ -e "s|@IMAGE@|${image}|g" \ -e "s|@PROJECTS@|${projects}|g" \ -i "${dir}/package.mk" defaults="$(echo -en "${defaults}" | sort)" echo -en "<settings>\n${defaults}\n</settings>" > "${dir}/source/settings-default.xml" echo -en "${options}" >> "${dir}/source/bin/docker" sed -e "s|@SETTINGS@|${settings}|g" \ -i "${dir}/source/resources/settings.xml" echo -en "${strings}" >> "${dir}/source/resources/language/English/strings.po" mv "${dir}/source/bin/docker" "${dir}/source/bin/docker.${name}" mv "${dir}/source/system.d/docker.service" "${dir}/source/system.d/docker.${name}.service" ================================================ FILE: scripts/extract ================================================ #!/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 "${1}" if [ -z "${2}" ]; then die "usage: ${0} package_name target_dir" fi [ -z "${PKG_URL}" -o -z "${PKG_SOURCE_NAME}" ] && die "${PKG_NAME}: PKG_URL or PKG_SOURCE_NAME undefined" [ ! -d "${SOURCES}/${1}" ] && die "${PKG_NAME}: ${SOURCES}/${1} not found" [ ! -d "${2}" ] && die "${PKG_NAME}: target ${2} not found" if [[ "${PKG_URL}" =~ ^file:// ]]; then FULL_SOURCE_PATH="${PKG_SOURCE_NAME}" else FULL_SOURCE_PATH="${SOURCES}/${1}/${PKG_SOURCE_NAME}" fi if [ ! -f "${FULL_SOURCE_PATH}" -a ! -d "${FULL_SOURCE_PATH}" ]; then echo "error: File ${PKG_SOURCE_NAME} doesn't exist for package ${1}" echo "Have you called scripts/extract before scripts/get?" die fi # The build system expects packages to be extracted to # ${PKG_BUILD}. # Try to strip the top level dir from the archive and extract to # the correct directory if possible so packages don't need to # set PKG_SOURCE_DIR and scripts/unpack doesn't need to rename # the directory. # Currently this is only supported for tar archives. # If PKG_SOURCE_DIR is set don't apply any directory mangling # so advanced renaming (eg stripping more than one directory level) # can be performed by scripts/unpack. # If the archive does not contain a top level folder the strip components # can be disabled by PKG_TAR_STRIP_COMPONENTS="no" in package.mk TAR_OPTS="" if [ -z "${PKG_SOURCE_DIR}" ]; then [ -z "${PKG_TAR_STRIP_COMPONENTS}" ] && TAR_OPTS="--strip-components=1" || : DESTDIR="${2}/${PKG_NAME}-${PKG_VERSION}" else DESTDIR="${2}" fi case "${PKG_SOURCE_NAME}" in *.tar | *.tar.bz2 | *.tbz | *.tar.gz | *.tgz | *.tar.xz | *.txz) mkdir -p "${DESTDIR}" tar xf "${FULL_SOURCE_PATH}" ${TAR_OPTS} -C "${DESTDIR}" ;; *.tar.zst | *.tzst) mkdir -p "${DESTDIR}" zstdcat "${FULL_SOURCE_PATH}" | tar xf - ${TAR_OPTS} -C "${DESTDIR}" ;; *.7z) mkdir -p "${2}/${1}" 7z x -o"${2}/${1}" "${FULL_SOURCE_PATH}" ;; *.zip) unzip -o -q "${FULL_SOURCE_PATH}" -d "${2}" ;; *.diff | *.patch) patch -d "${2}" -p1 < "${FULL_SOURCE_PATH}" ;; *.diff.bz2 | *.patch.bz2 | patch-*.bz2) bzcat "${FULL_SOURCE_PATH}" | patch -d "${2}" -p1 ;; *.diff.gz | *.patch.gz | patch-*.gz) zcat "${FULL_SOURCE_PATH}" | patch -d "${2}" -p1 ;; *) FULL_DEST_PATH="${2}/${PKG_NAME}-${PKG_VERSION}" mkdir "${FULL_DEST_PATH}" tar cf - -C "${FULL_SOURCE_PATH}" ${PKG_TAR_COPY_OPTS} . | tar xf - -C "${FULL_DEST_PATH}" ;; esac ================================================ FILE: scripts/genbuildplan.py ================================================ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) import sys, os, codecs, json, argparse, re ROOT_PKG = "__root__" class LibreELEC_Package: def __init__(self, name, section): self.name = name self.section = section self.deps = {"bootstrap": [], "init": [], "host": [], "target": []} self.wants = [] self.wantedby = [] self.unpacks = [] def __repr__(self): s = f"{name:<9}: {self.name}" s = f"{s}\n{section:<9}: {self.section}" for t in self.deps: s = f"{s}\n{t:<9}: {self.deps[t]}" s = f"{s}\n{'UNPACKS':<9}: {self.unpacks}" s = f"{s}\n{'NEEDS':<9}: {self.wants}" s = f"{s}\n{'WANTED BY':<9}: {self.wantedby}" return s def addDependencies(self, target, packages): for d in " ".join(packages.split()).split(): self.deps[target].append(d) name = d.split(":")[0] if name not in self.wants and name != self.name: self.wants.append(name) def delDependency(self, target, package): if package in self.deps[target]: self.deps[target].remove(package) name = package.split(":")[0] if name in self.wants: self.wants.remove(name) def addReference(self, package): name = package.split(":")[0] if name not in self.wantedby: self.wantedby.append(name) def delReference(self, package): name = package.split(":")[0] if name in self.wantedby: self.wantedby.remove(name) def addUnpack(self, packages): if packages.strip(): self.unpacks = packages.strip().split() def isReferenced(self): return False if self.wants == [] else True def isWanted(self): return False if self.wantedby == [] else True def references(self, package): return package in self.wants # Reference material: # https://www.electricmonk.nl/docs/dependency_resolving_algorithm/dependency_resolving_algorithm.html class Node: def __init__(self, name, target, section): self.name = name self.target = target self.section = section self.fqname = f"{name}:{target}" self.edges = [] def appendEdges(self, node): # Add the node itself... if node not in self.edges: self.edges.append(node) # as well as its edges for e in node.edges: if e not in self.edges: self.edges.append(e) # Return True if the dependencies of the specified node are met by this node def satisfies(self, node): for e in node.edges: if e not in self.edges: return False return True def __repr__(self): s = f"{'name':<9}: {self.name}" s = f"{s}\n{'target':<9}: {self.target}" s = f"{s}\n{'fqname':<9}: {self.fqname}" s = f"{s}\n{'common':<9}: {self.commonName()}" s = f"{s}\n{'section':<9}: {self.section}" for e in self.edges: s = f"{s}\nEDGE: {e.fqname}" return s def commonName(self): return self.name if self.target == "target" else f"{self.name}:{self.target}" def addEdge(self, node): if node not in self.edges: self.edges.append(node) def eprint(*args, **kwargs): print(*args, file=sys.stderr, **kwargs) # Read a JSON list of all possible packages from stdin, removing newlines def loadPackages(): jdata = json.loads(f"[{sys.stdin.read().replace(chr(10),'')[:-1]}]") map = {} # Load "global" packages first for pkg in jdata: if pkg["hierarchy"] == "global": map[pkg["name"]] = initPackage(pkg) # Then the "project" packages, as these will replace any matching "global" packages for pkg in jdata: if pkg["hierarchy"] == "project": map[pkg["name"]] = initPackage(pkg) # Then the "device" packages, as these will replace any matching "project" or "global" packages for pkg in jdata: if pkg["hierarchy"] == "device": map[pkg["name"]] = initPackage(pkg) return map # Create a fully formed LibreELEC_Package object def initPackage(package): pkg = LibreELEC_Package(package["name"], package["section"]) for target in ["bootstrap", "init", "host", "target"]: pkg.addDependencies(target, package[target]) pkg.addUnpack(package["unpack"]) return pkg # Split name:target into components def split_package(name): parts = name.split(":") pn = parts[0] pt = parts[1] if len(parts) != 1 else "target" return (pn, pt) # Return a list of packages of the specified type def get_packages_by_target(target, list): newlist = [] for p in list: (pn, pt) = split_package(p) if target in ["target", "init"] and pt in ["target", "init"]: newlist.append(p) elif target in ["bootstrap", "host"] and pt in ["bootstrap", "host"]: newlist.append(p) return newlist # For the specified node iterate over the list of scheduled nodes and return the first # position where we could possibly build this node (ie. all dependencies satisfied). def findbuildpos(node, list): # Keep a running total of all dependencies as we progress through the list alldeps = Node("", "", "") candidate = None for n in list: alldeps.appendEdges(n) if alldeps.satisfies(node): if len(n.edges) > len(node.edges): if candidate == None: candidate = n break candidate = n return list.index(candidate) + 1 if candidate else -1 # Resolve dependencies for a node def dep_resolve(node, resolved, unresolved): unresolved.append(node) for edge in node.edges: if edge not in resolved: if edge in unresolved: raise Exception(( f"Circular reference detected: {node.fqname} -> {edge.commonName()}\n" f"Remove {edge.commonName()} from {node.name} package.mk::PKG_DEPENDS_{node.target.upper()}" )) dep_resolve(edge, resolved, unresolved) if node not in resolved: resolved.append(node) unresolved.remove(node) # Return a list of build steps for the trigger packages def get_build_steps(args, nodes): resolved = [] unresolved = [] # When building the image the :target packages must be installed. # # However, if we are not building the image then only build the packages # and don't install them as it's likely we will be building discrete add-ons # which are installed outside of the image. # install = True if "image" in args.build else False for pkgname in [x for x in args.build if x]: if pkgname.find(":") == -1: pkgname = f"{pkgname}:target" if pkgname in nodes: dep_resolve(nodes[pkgname], resolved, unresolved) # Abort if any references remain unresolved if unresolved != []: eprint("The following dependencies have not been resolved:") for dep in unresolved: eprint(f" {dep}") raise("Unresolved references") # Output list of resolved dependencies for pkg in resolved: task = "build" if pkg.fqname.endswith(":host") or pkg.fqname.endswith(":init") or not install else "install" yield(task, pkg.fqname) # Reduce the complete list of packages to a map of those packages that will # be needed for the build. def processPackages(args, packages): # Add dummy package to ensure build/install dependencies are not culled pkg = { "name": ROOT_PKG, "section": "virtual", "hierarchy": "global", "bootstrap": "", "init": "", "host": " ".join(get_packages_by_target("host", args.build)), "target": " ".join(get_packages_by_target("target", args.build)), "unpack": "" } packages[pkg["name"]] = initPackage(pkg) # Resolve reverse references that we can use to ignore unreferenced packages for pkgname in packages: for opkgname in packages: opkg = packages[opkgname] if opkg.references(pkgname): if pkgname in packages: packages[pkgname].addReference(opkgname) # Identify unused packages while True: changed = False for pkgname in packages: pkg = packages[pkgname] if pkg.isWanted(): for opkgname in pkg.wantedby: if opkgname != ROOT_PKG: if not packages[opkgname].isWanted(): pkg.delReference(opkgname) changed = True if not changed: break # Create a new map of "needed" packages needed_map = {} for pkgname in packages: pkg = packages[pkgname] if pkg.isWanted() or pkgname == ROOT_PKG: needed_map[pkgname] = pkg # Validate package dependency references if not args.ignore_invalid: for pkgname in needed_map: pkg = needed_map[pkgname] for t in pkg.deps: for d in pkg.deps[t]: if split_package(d)[0] not in needed_map: msg = f'Invalid package reference: dependency {d} in package {pkgname}::PKG_DEPENDS_{t.upper()} is not valid' if args.warn_invalid: eprint(f"WARNING: {msg}") else: raise Exception(msg) node_map = {} # Convert all packages to target-specific nodes for pkgname in needed_map: pkg = needed_map[pkgname] for target in pkg.deps: if pkg.deps[target]: node = Node(pkgname, target, pkg.section) node_map[node.fqname] = node # Ensure all referenced dependencies exist as a basic node for pkgname in needed_map: pkg = needed_map[pkgname] for target in pkg.deps: for dep in pkg.deps[target]: dfq = dep if dep.find(":") != -1 else f"{dep}:target" if dfq not in node_map: (dfq_p, dfq_t) = split_package(dfq) if dfq_p in packages: dpkg = packages[dfq_p] node_map[dfq] = Node(dfq_p, dfq_t, dpkg.section) elif not args.ignore_invalid: raise Exception(f"Invalid package! Package {dfq_p} cannot be found for this PROJECT/DEVICE/ARCH") # To each target-specific node, add the corresponding # target-specific dependency nodes ("edges") for name in node_map: node = node_map[name] if node.name not in needed_map: if args.warn_invalid: continue else: raise Exception(f"Invalid package! Package {node.name} cannot be found for this PROJECT/DEVICE/ARCH") for dep in needed_map[node.name].deps[node.target]: dfq = dep if dep.find(":") != -1 else f"{dep}:target" if dfq in node_map: node.addEdge(node_map[dfq]) return node_map #--------------------------------------------- parser = argparse.ArgumentParser(description="Generate package dependency list for the requested build/install packages. \ Package data will be read from stdin in JSON format.", \ formatter_class=lambda prog: argparse.HelpFormatter(prog,max_help_position=25,width=90)) parser.add_argument("-b", "--build", nargs="+", metavar="PACKAGE", required=True, \ help="Space-separated list of build trigger packages, either for host or target. Required property - specify at least one package.") parser.add_argument("--warn-invalid", action="store_true", default=False, \ help="Warn about invalid/missing dependency packages, perhaps excluded by a PKG_ARCH incompatability. Default is to abort.") parser.add_argument("--ignore-invalid", action="store_true", default=False, \ help="Ignore invalid packages.") group = parser.add_mutually_exclusive_group() group.add_argument("--show-wants", action="store_true", \ help="Output \"wants\" dependencies for each step.") group.add_argument("--hide-wants", action="store_false", dest="show_wants", default=True, \ help="Disable --show-wants. This is the default.") parser.add_argument("--with-json", metavar="FILE", \ help="File into which JSON formatted plan will be written.") args = parser.parse_args() ALL_PACKAGES = loadPackages() loaded = len(ALL_PACKAGES) REQUIRED_PKGS = processPackages(args, ALL_PACKAGES) # Identify list of packages to build/install steps = [step for step in get_build_steps(args, REQUIRED_PKGS)] eprint(f"Packages loaded : {loaded}") eprint(f"Build trigger(s): {len(args.build)} [{' '.join(args.build)}]") eprint(f"Package steps : {len(steps)}") eprint("") # Write the JSON build plan (with dependencies) if args.with_json: plan = [] for step in steps: (pkg_name, target) = split_package(step[1]) plan.append({"task": step[0], "name": step[1], "section": ALL_PACKAGES[pkg_name].section, "wants": [d.fqname for d in REQUIRED_PKGS[step[1]].edges], "unpacks": ALL_PACKAGES[pkg_name].unpacks if pkg_name in ALL_PACKAGES else []}) with open(args.with_json, "w") as out: print(json.dumps(plan, indent=2, sort_keys=False), file=out) # Output build/install steps if args.show_wants: for step in steps: node = (REQUIRED_PKGS[step[1]]) wants = [edge.fqname for edge in node.edges] print(f"{step[0]:<7} {step[1].replace(':target',''):<25} (wants: {', '.join(wants).replace(':target','')})") else: for step in steps: print(f"{step[0]:<7} {step[1].replace(':target','')}") ================================================ FILE: scripts/get ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) . config/options "${1}" if [ -z "${1}" ]; then for i in $(find "${PACKAGES}/" -type f -name "package.mk"); do GET_PKG=$(grep "^PKG_NAME=" "${i}" | sed -e "s,\",,g" -e "s,PKG_NAME=,,") "${SCRIPTS}"/get "${GET_PKG}" done fi # Avoid concurrent processing of the same package lock_source_dir() { exec 99<"${SOURCES}/${1}" if ! flock --nonblock --exclusive 99; then echo "Project/Device ${DEVICE:-${PROJECT}} waiting, to avoid concurrent processing of ${1}..." flock --exclusive 99 fi } if [ -n "${PKG_URL}" -a -n "${PKG_SOURCE_NAME}" ]; then mkdir -p "${SOURCES}/${1}" PACKAGE="${SOURCES}/${1}/${PKG_SOURCE_NAME}" STAMP_URL="${PACKAGE}.url" STAMP_SHA="${PACKAGE}.sha256" # determine get handler based on protocol and/or filename case "${PKG_URL}" in git://*|*.git) get_handler="git";; file://*) get_handler="file";; *) get_handler="archive";; esac if ! listcontains "${GET_HANDLER_SUPPORT}" "${get_handler}"; then die "ERROR: get handler \"${get_handler}\" is not supported, unable to get package ${1} - aborting!" else get_handler="${SCRIPTS}/get_${get_handler}" if [ ! -f "${get_handler}" ]; then die "ERROR: get handler \"${get_handler}\" does not exist, unable to get package ${1} - aborting!" fi . "${get_handler}" fi fi exit 0 ================================================ FILE: scripts/get_archive ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) _get_file_already_downloaded() { [ ! -f "${PACKAGE}" -o ! -f "${STAMP_URL}" -o ! -f "${STAMP_SHA}" ] && return 1 [ -n "${PKG_SHA256}" -a "$(cat ${STAMP_SHA} 2>/dev/null)" != "${PKG_SHA256}" ] && return 1 return 0 } # Latest file already present, exit now... _get_file_already_downloaded && exit 0 lock_source_dir "${1}" # Check again in case of concurrent access - if nothing needs to be downloaded, exit now... _get_file_already_downloaded && exit 0 # At this point, we need to download something... build_msg "CLR_GET" "GET" "${1} (archive)" "indent" pkg_lock_status "GETPKG" "${PKG_NAME}" "unpack" "downloading package..." PACKAGE_MIRROR="" for mirror in ${DISTRO_MIRROR}; do PACKAGE_MIRROR="${PACKAGE_MIRROR} ${mirror}/${PKG_NAME}/${PKG_SOURCE_NAME}" done [ "${VERBOSE}" != "yes" ] && WGET_OPT=-q WGET_CMD="wget --output-file=- --timeout=30 --tries=3 --passive-ftp --no-check-certificate -c ${WGET_OPT} --progress=bar:force --show-progress -O ${PACKAGE}" # unset LD_LIBRARY_PATH to stop wget from using toolchain/lib and loading libssl.so/libcrypto.so instead of host libraries unset LD_LIBRARY_PATH rm -f "${STAMP_URL}" "${STAMP_SHA}" NBWGET=10 NBCHKS=2 while [ ${NBWGET} -gt 0 -a ${NBCHKS} -gt 0 ]; do for url in "${PKG_URL}" ${PACKAGE_MIRROR}; do if [[ "$PKG_USETOKEN" == "yes" ]]; then if [[ $url == https://github.com/* ]] && [[ -n $COREELEC_GHTOKEN ]]; then WGET_HEADER=--header="Authorization: token $COREELEC_GHTOKEN" fi else WGET_HEADER=--header="" fi rm -f "${PACKAGE}" if ${WGET_CMD} "$WGET_HEADER" "${url}"; then CALC_SHA256=$(sha256sum "${PACKAGE}" | cut -d" " -f1) [ -z "${PKG_SHA256}" -o "${PKG_SHA256}" = "${CALC_SHA256}" ] && break 2 if [ "${CHANGE_HASH}" = "yes" ]; then sed -e "s|^PKG_SHA256=.*|PKG_SHA256=\"${CALC_SHA256}\"|" -i "${PKG_DIR}/package.mk" break 2 else build_msg "CLR_WARNING" "WARNING" "Incorrect checksum calculated on downloaded file: got ${CALC_SHA256} wanted ${PKG_SHA256}" NBCHKS=$((NBCHKS - 1)) fi fi done NBWGET=$((NBWGET - 1)) done if [ ${NBWGET} -eq 0 -o ${NBCHKS} -eq 0 ]; then die "\nCannot get ${1} sources : ${PKG_URL}\nTry later!" else build_msg "CLR_INFO" "INFO" "Calculated checksum: ${CALC_SHA256}" echo "${PKG_URL}" > "${STAMP_URL}" echo "${CALC_SHA256}" > "${STAMP_SHA}" fi ================================================ FILE: scripts/get_file ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) build_msg "CLR_GET" "GET" "${1} (file)" "indent" pkg_lock_status "GETPKG" "${PKG_NAME}" "unpack" "processing package file..." ================================================ FILE: scripts/get_git ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) # Handler for git # Usage (in package.mk): # PKG_URL (mandatory) must point to a git repository (git://... or https://example.com/repo.git) # PKG_VERSION (mandatory) must point to a commit SHA, e.g. a1b2c3d # PKG_GIT_SHA (optional) full hash of git commit # PKG_GIT_CLONE_BRANCH (optional) clone specific branch # PKG_GIT_CLONE_SINGLE (optional) clone single branch only (set to yes) # PKG_GIT_CLONE_DEPTH (optional) history to clone, must be a number # PKG_GIT_SUBMODULE_DEPTH (optional) history of submodules to clone, must be a number _get_repo_already_downloaded() { if [ -d "${PACKAGE}" ]; then ( cd "${PACKAGE}" _get_repo_clean [ -n "$(git ls-remote . | grep -m1 HEAD | awk "/^${PKG_VERSION}/ {print \$1;}")" ] || die "ERROR: ${PACKAGE}: failed to determine git HEAD" [ "${PKG_URL}" = "$(git remote get-url origin)" ] || die "ERROR: ${PACKAGE}: failed to obtain URL of origin" [ -z "${PKG_GIT_CLONE_BRANCH}" ] && exit 0 [ "${PKG_GIT_CLONE_BRANCH}" = "$(git branch | grep ^\* | cut -d ' ' -f2)" ] || die "ERROR: ${PACKAGE}: failed to determine current git branch" exit 0 ) return else return 1 fi } _get_repo_clean() { git clean -fdx git checkout -- . } # Latest file already present, exit now... _get_repo_already_downloaded && exit 0 lock_source_dir "${1}" # Check again in case of concurrent access - if nothing needs to be downloaded, exit now... _get_repo_already_downloaded && exit 0 # At this point, we need to download something... build_msg "CLR_GET" "GET" "${1} (git)" "indent" pkg_lock_status "GETPKG" "${PKG_NAME}" "unpack" "processing package repository..." rm -f "${STAMP_URL}" "${STAMP_SHA}" GIT_CLONE_PARAMS="" GIT_SUBMODULE_PARAMS="" [ -n "${PKG_GIT_CLONE_BRANCH}" ] && GIT_CLONE_PARAMS="${GIT_CLONE_PARAMS} --branch ${PKG_GIT_CLONE_BRANCH}" [ "${PKG_GIT_CLONE_SINGLE}" = "yes" ] && GIT_CLONE_PARAMS="${GIT_CLONE_PARAMS} --single-branch" if [ -n "${PKG_GIT_CLONE_DEPTH}" ]; then if [[ "${PKG_GIT_CLONE_DEPTH}" =~ ^[0-9]+$ ]]; then GIT_CLONE_PARAMS="${GIT_CLONE_PARAMS} --depth ${PKG_GIT_CLONE_DEPTH}" else die "ERROR: PKG_GIT_CLONE_DEPTH is not a number! (${PKG_GIT_CLONE_DEPTH})" fi fi if [ -n "${PKG_GIT_SUBMODULE_DEPTH}" ]; then if [[ "${PKG_GIT_SUBMODULE_DEPTH}" =~ ^[0-9]+$ ]]; then GIT_SUBMODULE_PARAMS="${GIT_SUBMODULE_PARAMS} --depth ${PKG_GIT_SUBMODULE_DEPTH}" else die "ERROR: PKG_GIT_SUBMODULE_DEPTH is not a number! (${PKG_GIT_SUBMODULE_DEPTH})" fi fi GIT_FOUND="no" opwd="$(pwd)" for d in "${SOURCES}/${1}/${1}-"*/ ; do if [ -d "${d}.git" ]; then if [ "${GIT_FOUND}" = "no" ]; then cd "${d}" if [ "${PKG_URL}" = "$(git remote get-url origin)" ]; then if [[ -z "${PKG_GIT_CLONE_BRANCH}" ]] || [[ $(git branch | grep "^\* ${PKG_GIT_CLONE_BRANCH}$" | wc -l) -eq 1 ]]; then GIT_FOUND="yes" GIT_DIR="${d}" _get_repo_clean elif [ $(git branch | grep "^ ${PKG_GIT_CLONE_BRANCH}$" | wc -l) -eq 1 ]; then GIT_FOUND="yes" GIT_DIR="${d}" _get_repo_clean git checkout "${PKG_GIT_CLONE_BRANCH}" elif [ $(git branch -a | grep "^ remotes/origin/${PKG_GIT_CLONE_BRANCH}$" | wc -l) -eq 1 ]; then GIT_FOUND="yes" GIT_DIR="${d}" _get_repo_clean git checkout -b "${PKG_GIT_CLONE_BRANCH}" "origin/${PKG_GIT_CLONE_BRANCH}" else build_msg "CLR_CLEAN" "DELETE" "(${d})" cd "${opwd}" rm -rf "${d}" fi if [ "${GIT_FOUND}" = "yes" ]; then build_msg "CLR_GET" "GIT PULL" "${1}" git pull cd "${opwd}" fi else build_msg "CLR_CLEAN" "DELETE" "(${d})" cd "${opwd}" rm -rf "${d}" fi fi else build_msg "CLR_CLEAN" "DELETE" "(${d})" rm -rf "${d}" fi done cd "${opwd}" if [ "${GIT_FOUND}" = "no" ]; then build_msg "CLR_GET" "GIT CLONE" "${1}" git clone ${GIT_CLONE_PARAMS} "${PKG_URL}" "${PACKAGE}" elif [ ! "${GIT_DIR}" = "${PACKAGE}/" ]; then mv "${GIT_DIR}" "${PACKAGE}" fi ( cd "${PACKAGE}" [ $(git log --oneline --pretty=tformat:"%H" | grep "^${PKG_VERSION}" | wc -l) -eq 1 ] || die "There is no commit '${PKG_VERSION}' on branch '$(git branch | grep ^\* | cut -d ' ' -f2)' of package '${1}'! Aborting!" git reset --hard "${PKG_VERSION}" build_msg "CLR_GET" "GIT SUBMODULE" "${1}" git submodule update --init --recursive ${GIT_SUBMODULE_PARAMS} ) GIT_SHA="$(git ls-remote "${PACKAGE}" | grep -m1 HEAD | awk '{print $1;}')" if [ -n "${PKG_GIT_SHA}" -a "${PKG_GIT_SHA}" != "${GIT_SHA}" ]; then build_msg "CLR_WARNING" "WARNING" "Incorrect git hash in repository: got ${GIT_SHA}, wanted ${PKG_GIT_SHA}" fi ================================================ FILE: scripts/image ================================================ #!/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_DEVICE _CACHE_PACKAGE_LOCAL _CACHE_PACKAGE_GLOBAL _DEBUG_DEPENDS_LIST _DEBUG_PACKAGE_LIST . config/options "" . config/multithread . config/show_config # Validate UBOOT_SYSTEM if it is specified if [ "${BOOTLOADER}" = "u-boot" -a -n "${DEVICE}" ]; then if [ -z "${UBOOT_SYSTEM}" ]; then ${SCRIPTS}/uboot_helper ${PROJECT} ${DEVICE} >/dev/null else ${SCRIPTS}/uboot_helper ${PROJECT} ${DEVICE} ${UBOOT_SYSTEM} dtb >/dev/null fi fi ${SCRIPTS}/checkdeps # Setup both toolchain cmake configs to avoid potentially racy behaviour later. # Use a fork for host to isolate any variable modifications. ( setup_toolchain host ) setup_toolchain target show_config function do_mkimage() { # Variables used in mkimage script must be passed env \ 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}}" \ 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}" \ EXTRA_CMDLINE="${EXTRA_CMDLINE}" \ SYSTEM_SIZE="${SYSTEM_SIZE}" \ SYSTEM_PART_START="${SYSTEM_PART_START}" \ OVA_SIZE="${OVA_SIZE}" \ SUBDEVICE="${SUBDEVICE}" \ ${SCRIPTS}/mkimage } if [ -n "${CUSTOM_GIT_HASH}" ]; then GIT_HASH="${CUSTOM_GIT_HASH}" else GIT_HASH=$(git rev-parse HEAD) fi case "${BUILD_PERIODIC}" in nightly) OS_STAGE="nightly" BUILD_NUM="_$(date +%Y%m%d)" ;; daily) OS_STAGE="daily" BUILD_NUM="_$(date +%Y%j)" ;; weekly) OS_STAGE="weekly" BUILD_NUM="_$(date +%G%V)" ;; monthly) OS_STAGE="monthly" BUILD_NUM="_$(date +%Y%m)" ;; *) NON_PERIODIC=true ;; esac # 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 -e 's#\.git$##' -e 's#^git:#https:#' -e 's#^git@github\.com:#https://github.com/#' -e 's#://.*@#://#')" [ "${BUILDER_NAME,,}" = "official" ] && BUILDER_NAME= if [ "${OFFICIAL}" = "yes" ]; then LIBREELEC_BUILD=$(echo `echo VDJabWFXTnBZV3dnTFNCRmJYVkZURVZESUdseklFWlNSVVVoSUU1UFZDQkdUMUlnVTBGTVJTRT0= | base64 --decode` | base64 --decode) else if [ ${NON_PERIODIC} ]; then OS_STAGE="devel" BUILD_NUM="_$(date +%Y%m%d%H%M%S)" fi if [ -n "${BUILDER_NAME}" ]; then LIBREELEC_BUILD="${BUILDER_NAME}" else LIBREELEC_BUILD=$(echo `echo UTI5dGJYVnVhWFI1SUMwZ1JXMTFSVXhGUXlCcGN5QkdVa1ZGSVNCT1QxUWdSazlTSUZOQlRFVWg= | base64 --decode` | base64 --decode) fi fi if [ -n "${OS_STAGE}" -a ! "${OS_STAGE}${BUILD_NUM}" = "build0" ]; then EXTRA_VERSION="_${OS_STAGE}${BUILD_NUM}" fi LIBREELEC_VERSION="${OS_VERSION}-${OS_CODENAME}${EXTRA_VERSION}" 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 IMAGE_NAME="${DISTRONAME}-${TARGET_VERSION}" 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 ${BUILD}/qa_checks/general rm -rf ${INSTALL} rm -rf ${STAMPS_INSTALL} mkdir -p ${INSTALL} # Create base layout of LibreELEC read-only file system for directory in etc dev proc run sys tmp usr var flash storage; do mkdir -p ${INSTALL}/${directory} done # Build image contents MTADDONBUILD=no start_multithread_build image || die "Parallel build failure - see log for details. Time of failure: $(date)" echo echo "Successful build, creating image..." >&2 # Create legacy sym links 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 cat <<EOF >${INSTALL}/etc/os-release NAME="${DISTRONAME}" VERSION="${LIBREELEC_VERSION}" ID="${DISTRONAME,,}" VERSION_ID="${OS_VERSION}" PRETTY_NAME="${DISTRONAME} (${LIBREELEC_BUILD}): ${LIBREELEC_VERSION}" HOME_URL="https://emuelec.org" BUG_REPORT_URL="${ORIGIN_URL}" BUILD_ID="${GIT_HASH}" LIBREELEC_ARCH="${LIBREELEC_ARCH}" LIBREELEC_BUILD="${LIBREELEC_BUILD}" LIBREELEC_PROJECT="${PROJECT}" COREELEC_ARCH="${LIBREELEC_ARCH}" COREELEC_BUILD="${LIBREELEC_BUILD}" COREELEC_PROJECT="${PROJECT}" EOF [ -n "${DEVICE}" ] && echo "COREELEC_DEVICE=\"${DEVICE}\"" >> ${INSTALL}/etc/os-release [ -n "${BUILDER_NAME}" ] && echo "BUILDER_NAME=\"${BUILDER_NAME}\"" >> ${INSTALL}/etc/os-release [ -n "${BUILDER_VERSION}" ] && echo "BUILDER_VERSION=\"${BUILDER_VERSION}\"" >> ${INSTALL}/etc/os-release # Add release notes / changelog if [ -n "${RELEASE_NOTES}" ] && [ -f "${RELEASE_NOTES}" ]; then cp "${RELEASE_NOTES}" ${INSTALL}/etc/release-notes else echo "" > ${INSTALL}/etc/release-notes fi # Create /etc/issue cat <<EOF >${INSTALL}/etc/issue ${GREETING0} ${GREETING1} ${GREETING2} ${GREETING3} ${GREETING4} ${DISTRONAME} (${LIBREELEC_BUILD}): ${LIBREELEC_VERSION} (${LIBREELEC_ARCH}) EOF ln -sf /etc/issue ${INSTALL}/etc/motd # Copy PROJECT related files to filesystem if [ -d "${PROJECT_DIR}/${PROJECT}/filesystem" ]; then cp -PR --remove-destination ${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 ${service##*/} fi done fi # Copy DEVICE related files to filesystem if [ -n "${DEVICE}" -a -d "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/filesystem" ]; then cp -PR --remove-destination ${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 ${service##*/} fi done fi # Replace placeholders with values in install script to eMMC if [ -f ${INSTALL}/usr/bin/install2emmc ]; then sed -e "s%@SYSTEM_SIZE@%${SYSTEM_SIZE}%g" \ -i ${INSTALL}/usr/bin/install2emmc sed -e "s%@DISTRONAME@%${DISTRONAME}%g" \ -i ${INSTALL}/usr/bin/install2emmc 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 "$(get_install_dir linux)/.image/System.map" ${MODVER} 2>&1 # 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 /run/kernel-overlays/modules ${INSTALL}/usr/lib/modules # Symlink overlayed firmware to /usr/lib/firmware ln -sT /run/kernel-overlays/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 $(get_install_dir linux)/.image/${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 19 -b 1048576" 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}" = "noobs" ]; then RELEASE_DIR="target/${IMAGE_NAME}" # Cleanup rm -rf ${RELEASE_DIR} # Create release dir mkdir -p ${RELEASE_DIR} # Remove any previously created release images 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 any previously created release tarballs 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}" = "noobs" || "${1}" = "mkimage" ) && -n "${BOOTLOADER}" ]]; then UUID_SYSTEM="$(date '+%d%m')-$(date '+%M%S')" UUID_STORAGE="$(uuidgen)" DEVICE_BOARDS= if [ "${BOOTLOADER}" = "u-boot" -a -z "${UBOOT_SYSTEM}" -a -n "${DEVICE}" ]; then DEVICE_BOARDS=$(${SCRIPTS}/uboot_helper "${PROJECT}" "${DEVICE}") fi if [ -n "${DEVICE_BOARDS}" ]; then for UBOOT_SYSTEM in ${DEVICE_BOARDS}; do echo "Installing u-boot for board ${UBOOT_SYSTEM}..." # Re-install u-boot package rm ${STAMPS_INSTALL}/u-boot/install_target UBOOT_SYSTEM="${UBOOT_SYSTEM}" ${SCRIPTS}/install u-boot 2>&1 # 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 if [ -n "${SUBDEVICES}" ]; then [ "${PROJECT}" = "Amlogic-ce" ] && SUBDEVICES+=" Generic" for SUBDEVICE in ${SUBDEVICES}; do do_mkimage "${IMAGE_NAME}" done else do_mkimage fi fi fi # Cleanup release dir rm -rf ${RELEASE_DIR} if [ "${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 if [ -n "${NOOBS_HEX}" ]; then sed -e "s%@NOOBS_HEX@%${NOOBS_HEX}%g" \ -i ${RELEASE_DIR}/${NOOBS_DISTRO}/os.json else sed -e "/@NOOBS_HEX@/d" \ -i ${RELEASE_DIR}/${NOOBS_DISTRO}/os.json fi 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" \ -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 sed -e "s%@EXTRA_CMDLINE@%${EXTRA_CMDLINE}%g" \ -i ${RELEASE_DIR}/${NOOBS_DISTRO}/partition_setup.sh # Create System dir mkdir -p ${RELEASE_DIR}/${NOOBS_DISTRO}/System # Copy Bootloader cp -PR ${INSTALL}/usr/share/bootloader/config.txt ${RELEASE_DIR}/${NOOBS_DISTRO}/System/ for distro in "${INSTALL}/usr/share/bootloader/distroconfig"*.txt ; do if [ -f "${distro}" ]; then cp -PR "${distro}" ${RELEASE_DIR}/${NOOBS_DISTRO}/System/ fi done cp -PR ${INSTALL}/usr/share/bootloader/LICENCE* ${RELEASE_DIR}/${NOOBS_DISTRO}/System/ for f in bootcode.bin fixup.dat start.elf ; do if [ -f "${INSTALL}/usr/share/bootloader/$f" ]; then cp -PR "${INSTALL}/usr/share/bootloader/$f" "${RELEASE_DIR}/${NOOBS_DISTRO}/System/" fi done # 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 ${TOOLCHAIN}/bin/fakeroot tar cJf ${RELEASE_DIR}/${NOOBS_DISTRO}/System.tar.xz -C ${RELEASE_DIR}/${NOOBS_DISTRO}/System/ . ${TOOLCHAIN}/bin/fakeroot 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 if [ -n "$(ls -1 ${BUILD}/qa_checks/ 2>/dev/null)" ]; then log_qa_check "qa_issues" "QA issues present, please fix!\n$(find ${BUILD}/qa_checks/* -type f ! -name qa_issues)\n" fi # remove unneeded files in target folder if [ "$COREELEC_TARGET_REMOVE" = "kernel_system" ]; then rm -f ${TARGET_IMG}/*.kernel rm -f ${TARGET_IMG}/*.system elif [ "$COREELEC_TARGET_REMOVE" = "kernel_system_sha256" ]; then rm -f ${TARGET_IMG}/*.kernel rm -f ${TARGET_IMG}/*.system rm -f ${TARGET_IMG}/*.sha256 fi ================================================ FILE: scripts/install ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2010-2011 Roman Weber (roman@openelec.tv) # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) . config/options "${1}" if [ -z "${1}" ]; then die "usage: ${0} package_name [parent_pkg]" fi if [ -z "${PKG_NAME}" ]; then die "$(print_color CLR_ERROR "${1}: no package.mk file found")" fi if [ -z "${INSTALL}" ] ; then die "error: '\${INSTALL}' not set! this script is not intended to be run manually" fi if [ -n "${PKG_ARCH}" ]; then listcontains "${PKG_ARCH}" "!${TARGET_ARCH}" && exit 0 listcontains "${PKG_ARCH}" "${TARGET_ARCH}" || listcontains "${PKG_ARCH}" "any" || exit 0 fi # set defaults if [ "${1//:/}" != "${1}" ]; then TARGET="${1#*:}" else TARGET= fi [ -z "${TARGET}" ] && TARGET="target" PARENT_PKG="${2:-${PKG_NAME}:${TARGET}}" pkg_lock "${PKG_NAME}:${TARGET}" "install" "${PARENT_PKG}" STAMP=${STAMPS_INSTALL}/${PKG_NAME}/install_${TARGET} if [ -f ${STAMP} ]; then pkg_lock_status "UNLOCK" "${PKG_NAME}:${TARGET}" "install" "already installed" exit 0 fi mkdir -p ${STAMPS_INSTALL}/${PKG_NAME} ${SCRIPTS}/build "${1}" "${PARENT_PKG}" if is_sequential_build || [ "${PARENT_PKG}" = "initramfs:target" ]; then if [ "${TARGET}" = "target" ] ; then for p in ${PKG_DEPENDS_TARGET}; do ${SCRIPTS}/install "${p}" "${PARENT_PKG}" done elif [ "${TARGET}" = "init" ] ; then for p in ${PKG_DEPENDS_INIT}; do ${SCRIPTS}/install "${p}" "${PARENT_PKG}" done fi fi if [ "${TARGET}" = "init" ] ; then INSTALL=${BUILD}/initramfs fi pkg_lock_status "ACTIVE" "${PKG_NAME}:${TARGET}" "install" build_msg "CLR_INSTALL" "INSTALL" "${PKG_NAME} $(print_color CLR_TARGET "(${TARGET})")" "indent" print_qa_checks acquire_update_lock image mkdir -p ${INSTALL} if [ "${TARGET}" = "target" ] ; then for PKG_TMP_DIR in ${PKG_DIR} \ ${PROJECT_DIR}/${PROJECT}/packages/${PKG_NAME} \ ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/packages/${PKG_NAME} \ ; do [ -d ${PKG_TMP_DIR} ] || continue if [ -d ${PKG_TMP_DIR}/profile.d ]; then mkdir -p ${INSTALL}/etc/profile.d cp ${PKG_TMP_DIR}/profile.d/*.conf ${INSTALL}/etc/profile.d fi if [ -d ${PKG_TMP_DIR}/tmpfiles.d ]; then mkdir -p ${INSTALL}/usr/lib/tmpfiles.d cp ${PKG_TMP_DIR}/tmpfiles.d/*.conf ${INSTALL}/usr/lib/tmpfiles.d fi if [ -d ${PKG_TMP_DIR}/system.d ]; then mkdir -p ${INSTALL}/usr/lib/systemd/system cp -Pr ${PKG_TMP_DIR}/system.d/*.* ${INSTALL}/usr/lib/systemd/system fi if [ -d ${PKG_TMP_DIR}/udev.d ]; then mkdir -p ${INSTALL}/usr/lib/udev/rules.d cp ${PKG_TMP_DIR}/udev.d/*.rules ${INSTALL}/usr/lib/udev/rules.d fi if [ -d ${PKG_TMP_DIR}/hwdb.d ]; then mkdir -p ${INSTALL}/usr/lib/udev/hwdb.d cp ${PKG_TMP_DIR}/hwdb.d/*.hwdb ${INSTALL}/usr/lib/udev/hwdb.d fi if [ -d ${PKG_TMP_DIR}/sleep.d ]; then mkdir -p ${INSTALL}/usr/lib/systemd/system-sleep cp ${PKG_TMP_DIR}/sleep.d/* ${INSTALL}/usr/lib/systemd/system-sleep fi if [ -d ${PKG_TMP_DIR}/sleep.d.serial ]; then mkdir -p ${INSTALL}/usr/lib/systemd/system-sleep.serial cp ${PKG_TMP_DIR}/sleep.d.serial/* ${INSTALL}/usr/lib/systemd/system-sleep.serial fi if [ -d ${PKG_TMP_DIR}/sysctl.d ]; then mkdir -p ${INSTALL}/usr/lib/sysctl.d cp ${PKG_TMP_DIR}/sysctl.d/*.conf ${INSTALL}/usr/lib/sysctl.d fi if [ -d ${PKG_TMP_DIR}/modules-load.d ]; then mkdir -p ${INSTALL}/usr/lib/modules-load.d cp ${PKG_TMP_DIR}/modules-load.d/*.conf ${INSTALL}/usr/lib/modules-load.d fi if [ -d ${PKG_TMP_DIR}/sysconf.d ]; then mkdir -p ${INSTALL}/etc/sysconf.d cp ${PKG_TMP_DIR}/sysconf.d/*.conf ${INSTALL}/etc/sysconf.d fi if [ -d ${PKG_TMP_DIR}/debug.d ]; then mkdir -p ${INSTALL}/usr/share/debugconf cp ${PKG_TMP_DIR}/debug.d/*.conf ${INSTALL}/usr/share/debugconf fi if [ -d ${PKG_TMP_DIR}/modprobe.d ]; then mkdir -p ${INSTALL}/usr/lib/modprobe.d cp ${PKG_TMP_DIR}/modprobe.d/*.conf ${INSTALL}/usr/lib/modprobe.d fi done fi # install if [ "${TARGET}" = "target" ] ; then pkg_call_exists_opt pre_install && pkg_call fi if [ -n "${PKG_INSTALL}" -a -d "${PKG_INSTALL}" ]; then tar \ -C "${PKG_INSTALL}" \ --exclude=./usr/local/include \ --exclude=./usr/local/lib/cmake \ --exclude=./usr/local/lib/pkgconfig \ --exclude=./usr/local/share/aclocal \ --exclude=./usr/local/share/pkgconfig \ --exclude=./usr/include \ --exclude=./usr/lib/cmake \ --exclude=./usr/lib/pkgconfig \ --exclude=./usr/lib32/cmake \ --exclude=./usr/lib32/pkgconfig \ --exclude=./usr/share/aclocal \ --exclude=./usr/share/pkgconfig \ --exclude=./include \ --exclude=./lib/cmake \ --exclude=./lib/pkgconfig \ --exclude=./share/aclocal \ --exclude=./share/pkgconfig \ --exclude=./.* \ --exclude='*.a' \ --exclude='*.la' \ -cf - . | tar -C "${INSTALL}" -xf - fi if [ "${TARGET}" = "target" ] ; then pkg_call_exists_opt post_install && pkg_call fi release_update_lock touch ${STAMP} pkg_lock_status "UNLOCK" "${PKG_NAME}:${TARGET}" "install" "installed" ================================================ FILE: scripts/install_addon ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) . config/options "${1}" pkg_lock "${PKG_NAME}" "packadd" pkg_lock_status "ACTIVE" "${PKG_NAME}" "packadd" # cleanup old install path rm -rf "${ADDON_BUILD}" # install addon parts if pkg_call_exists addon; then pkg_call else install_binary_addon "${PKG_ADDON_ID}" pkg_call_finish fi # Make sure we have a value for STRIP setup_toolchain target ADDON_DIRECTORY="${ADDON_BUILD}/${PKG_ADDON_ID}" install_addon_files "${ADDON_DIRECTORY}" debug_strip "${ADDON_DIRECTORY}" # pack_addon() ADDON_INSTALL_DIR="${TARGET_ADDONS}/${PKG_ADDON_ID}" ADDONVER="$(xmlstarlet sel -t -v "/addon/@version" ${ADDON_BUILD}/${PKG_ADDON_ID}/addon.xml)" if [ -f ${ADDON_INSTALL_DIR}/${PKG_ADDON_ID}-${ADDONVER}.zip ]; then if [ "${ADDON_OVERWRITE}" = "yes" ]; then rm ${ADDON_INSTALL_DIR}/${PKG_ADDON_ID}-${ADDONVER}.zip else build_msg "CLR_WARNING" "*** WARNING: ${PKG_ADDON_ID}-${ADDONVER}.zip already exists. Not overwriting it. ***" pkg_lock_status "UNLOCK" "${PKG_NAME}" "packadd" "already packed" exit 0 fi fi cd ${ADDON_BUILD}/${PKG_ADDON_ID} # move icon and fanart image into resources folder ADDON_ICON=$(xmlstarlet sel -t -v "//addon/extension/assets/icon" addon.xml || :) ADDON_FANART=$(xmlstarlet sel -t -v "//addon/extension/assets/fanart" addon.xml || :) if [ -n "${ADDON_ICON}" ] && [[ ${ADDON_ICON} != resources/* ]]; then rm -f resources/icon.png mv ${ADDON_ICON} resources xmlstarlet ed -L -u "//addon/extension/assets/icon" -v "resources/${ADDON_ICON}" addon.xml fi if [ -n "${ADDON_FANART}" ] && [[ ${ADDON_FANART} != resources/* ]]; then rm -f resources/fanart.png mv ${ADDON_FANART} resources xmlstarlet ed -L -u "//addon/extension/assets/fanart" -v "resources/${ADDON_FANART}" addon.xml fi # remove unused distro fanart in case addon has it's own in .jpg format [ -f resources/fanart.jpg -a -f resources/fanart.png ] && rm resources/fanart.png cd ${ADDON_BUILD} build_msg "CLR_INFO" "*** compressing addon ${PKG_ADDON_ID} ... ***" ${TOOLCHAIN}/bin/7za a -l -mx9 -bsp0 -bso0 -tzip ${PKG_ADDON_ID}-${ADDONVER}.zip ${PKG_ADDON_ID} cd - &>/dev/null mkdir -p ${ADDON_INSTALL_DIR} cp ${ADDON_BUILD}/${PKG_ADDON_ID}-${ADDONVER}.zip ${ADDON_INSTALL_DIR} if [ -f ${ADDON_BUILD}/${PKG_ADDON_ID}/changelog.txt ]; then cp ${ADDON_BUILD}/${PKG_ADDON_ID}/changelog.txt ${ADDON_INSTALL_DIR}/changelog-${ADDONVER}.txt fi for f in ${ADDON_BUILD}/${PKG_ADDON_ID}/resources/{icon,fanart,screenshot-*}.{jpg,png}; do if [ -f "${f}" ]; then mkdir -p ${ADDON_INSTALL_DIR}/resources cp ${f} ${ADDON_INSTALL_DIR}/resources fi done # Jenkins add-on build if [ "${ADDON_JENKINS}" = "yes" ]; then ADDON_JENKINS_DIR="${TARGET_IMG}/jenkins" ADDON_JENKINS_ADDON_NAME="${ADDON_VERSION}-${DEVICE:-${PROJECT}}-${TARGET_ARCH}-${PKG_ADDON_ID}-${ADDONVER}" mkdir -p "${ADDON_JENKINS_DIR}" cd ${ADDON_INSTALL_DIR} ${TOOLCHAIN}/bin/7za a -l -mx0 -bsp0 -bso0 -tzip ${ADDON_JENKINS_DIR}/${ADDON_JENKINS_ADDON_NAME}.zip ${PKG_ADDON_ID}-${ADDONVER}.zip resources/ ( cd ${ADDON_JENKINS_DIR} sha256sum ${ADDON_JENKINS_ADDON_NAME}.zip > ${ADDON_JENKINS_ADDON_NAME}.zip.sha256 ) build_msg "CLR_INFO" "*** creating ${ADDON_JENKINS_ADDON_NAME}.zip for Jenkins complete ***" else build_msg "CLR_INFO" "*** creating ${PKG_ADDON_ID} complete ***" fi pkg_lock_status "UNLOCK" "${PKG_NAME}" "packadd" "packed" ================================================ FILE: scripts/makefile_helper ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) set -e # If config/options can't be sourced, abort. PWD isn't the expected ROOT. # Only source from config/options what will be used BUILD_ROOT=$(PROJECT= DEVICE= ARCH= . config/options "" && echo "${BUILD_ROOT}") BUILD_BASE=$(PROJECT= DEVICE= ARCH= . config/options "" && echo "${BUILD_BASE}") if [ -z "${BUILD_BASE}" -o -z "${BUILD_ROOT}" ]; then # make sure variables are set before running an rm echo "error: ${0}: both BUILD_BASE and BUILD_ROOT must be set when running \"[clean|distclean]\"; aborting" exit 1 fi # task handling case $1 in --clean) rm -rf "${BUILD_ROOT}/${BUILD_BASE}."*/* "${BUILD_ROOT}/${BUILD_BASE}."*/.stamps ;; --distclean) rm -rf "${BUILD_ROOT}/.ccache" "${BUILD_ROOT}/${BUILD_BASE}."* ;; *) echo "error: ${0}: unsupported option on CLI; aborting" exit 1 ;; esac ================================================ FILE: scripts/mkimage ================================================ #!/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) ################################################################################ # variables such as ${ROOT} ${PATH} etc... that are required for this # script to work must be passed via env ... in scripts/image ################################################################################ # set variables LE_TMP=$(mktemp -d -p ${TARGET_IMG}) SAVE_ERROR="${LE_TMP}/save_error" if [ -z "${SYSTEM_SIZE}" -o -z "${SYSTEM_PART_START}" ]; then echo "mkimage: SYSTEM_SIZE and SYSTEM_PART_START must be configured!" exit 1 fi if [ "${BOOTLOADER}" = "syslinux" ]; then DISK_GPT_PADDING=1 DISK_LABEL=gpt else DISK_GPT_PADDING=0 DISK_LABEL=msdos fi STORAGE_SIZE=32 # STORAGE_SIZE must be >= 32 ! DISK_START_PADDING=$(( (${SYSTEM_PART_START} + 2048 - 1) / 2048 )) DISK_SIZE=$(( ${DISK_START_PADDING} + ${SYSTEM_SIZE} + ${STORAGE_SIZE} + ${DISK_GPT_PADDING} )) DISK_BASENAME="${TARGET_IMG}/${IMAGE_NAME}" if [ -n "${SUBDEVICE}" ]; then DISK_BASENAME="${DISK_BASENAME}-${SUBDEVICE}" fi DISK="${DISK_BASENAME}.img" # functions cleanup() { echo -e "image: cleanup...\n" rm -rf "${LE_TMP}" } show_error() { echo "image: An error has occurred..." echo if [ -s "${SAVE_ERROR}" ]; then cat "${SAVE_ERROR}" else echo "Folder ${LE_TMP} might be out of free space..." fi echo cleanup exit 1 } trap cleanup SIGINT # create an image echo -e "\nimage: creating sparse file for disk image ${DISK##*/}..." dd if=/dev/zero of="${DISK}" bs=1M count=0 seek="${DISK_SIZE}" conv=fsync >"${SAVE_ERROR}" 2>&1 || show_error # write a disklabel echo "image: creating ${DISK_LABEL} partition table..." parted -s "${DISK}" mklabel ${DISK_LABEL} sync # create partitions echo "image: creating partitions..." SYSTEM_PART_END=$(( ${SYSTEM_PART_START} + (${SYSTEM_SIZE} * 1024 * 1024 / 512) - 1 )) STORAGE_PART_START=$(( ${SYSTEM_PART_END} + 1 )) STORAGE_PART_END=$(( ${STORAGE_PART_START} + (${STORAGE_SIZE} * 1024 * 1024 / 512) - 1 )) if [ "${DISK_LABEL}" = "gpt" ]; then parted -s "${DISK}" -a min unit s mkpart system fat32 ${SYSTEM_PART_START} ${SYSTEM_PART_END} parted -s "${DISK}" -a min unit s mkpart storage ext4 ${STORAGE_PART_START} ${STORAGE_PART_END} parted -s "${DISK}" set 1 legacy_boot on else parted -s "${DISK}" -a min unit s mkpart primary fat32 ${SYSTEM_PART_START} ${SYSTEM_PART_END} parted -s "${DISK}" -a min unit s mkpart primary ext4 ${STORAGE_PART_START} ${STORAGE_PART_END} parted -s "${DISK}" set 1 boot on fi sync if [ "${BOOTLOADER}" = "syslinux" ]; then # write mbr echo "image: writing mbr..." dd bs=440 count=1 conv=fsync,notrunc if="${TOOLCHAIN}/share/syslinux/gptmbr.bin" of="${DISK}" >"${SAVE_ERROR}" 2>&1 || show_error fi # create part2 to format and copy files echo "image: creating sparse file for part2..." STORAGE_PART_COUNT=$(( ${STORAGE_PART_END} - ${STORAGE_PART_START} + 1 )) sync dd if="${DISK}" of="${LE_TMP}/part2.ext4" bs=512 count=0 seek="${STORAGE_PART_COUNT}" conv=fsync >"${SAVE_ERROR}" 2>&1 || show_error # create filesystem on part2 echo "image: creating filesystem on part2..." mke2fs -F -q -t ext4 -m 0 "${LE_TMP}/part2.ext4" tune2fs -L "${DISTRO_DISKLABEL}" -U ${UUID_STORAGE} "${LE_TMP}/part2.ext4" >"${SAVE_ERROR}" 2>&1 || show_error e2fsck -n "${LE_TMP}/part2.ext4" >"${SAVE_ERROR}" 2>&1 || show_error sync # add resize mark mkdir "${LE_TMP}/part2.fs" touch "${LE_TMP}/part2.fs/.please_resize_me" echo "image: populating filesystem on part2..." populatefs -U -d "${LE_TMP}/part2.fs" "${LE_TMP}/part2.ext4" >"${SAVE_ERROR}" 2>&1 || show_error sync e2fsck -n "${LE_TMP}/part2.ext4" >"${SAVE_ERROR}" 2>&1 || show_error # merge part2 into disk image echo "image: merging part2 into disk image..." dd if="${LE_TMP}/part2.ext4" of="${DISK}" bs=512 seek="${STORAGE_PART_START}" conv=fsync,notrunc >"${SAVE_ERROR}" 2>&1 || show_error # create disk image for virtual appliance if [ "${PROJECT}" = "Generic" ]; then echo "image: creating open virtual appliance..." # duplicate ${DISK} so anything we do to it directly doesn't effect original dd if="${DISK}" of="${DISK_BASENAME}.tmp" bs=1M conv=fsync >"${SAVE_ERROR}" 2>&1 || show_error fi # create part1 to format and copy files echo "image: creating sparse file for part1..." SYSTEM_PART_COUNT=$(( ${SYSTEM_PART_END} - ${SYSTEM_PART_START} + 1 )) sync dd if=/dev/zero of="${LE_TMP}/part1.fat" bs=512 count=0 seek="${SYSTEM_PART_COUNT}" conv=fsync >"${SAVE_ERROR}" 2>&1 || show_error shopt -s expand_aliases # enables alias expansion in script alias mcopy='mcopy -i "${LE_TMP}/part1.fat" -o' alias mmd='mmd -i "${LE_TMP}/part1.fat"' # create filesystem on part1 echo "image: creating filesystem on part1..." if [ "${BOOTLOADER}" = "syslinux" -o "${BOOTLOADER}" = "bcm2835-bootloader" -o "${BOOTLOADER}" = "u-boot" ]; then mformat -i "${LE_TMP}/part1.fat" -v "${DISTRO_BOOTLABEL}" -N "${UUID_SYSTEM//-/}" :: >"${SAVE_ERROR}" 2>&1 || show_error fi sync if [ "${BOOTLOADER}" = "syslinux" ]; then # create bootloader configuration echo "image: creating bootloader configuration..." cat << EOF > "${LE_TMP}/syslinux.cfg" SAY Wait for installer mode to start automatically in 5 seconds... SAY SAY Options SAY ======= SAY installer: permanently install ${DISTRO} to HDD/SSD SAY live: boot ${DISTRO} using RAM for temporary storage SAY run: boot ${DISTRO} using this USB memory device for storage SAY DEFAULT installer TIMEOUT 50 PROMPT 1 LABEL installer KERNEL /${KERNEL_NAME} APPEND boot=UUID=${UUID_SYSTEM} installer quiet systemd.debug_shell vga=current LABEL live KERNEL /${KERNEL_NAME} APPEND boot=UUID=${UUID_SYSTEM} live quiet vga=current LABEL run KERNEL /${KERNEL_NAME} APPEND boot=UUID=${UUID_SYSTEM} disk=UUID=${UUID_STORAGE} portable quiet EOF cat << EOF > "${LE_TMP}/grub.cfg" set timeout="25" set default="Installer" menuentry "Installer" { search --set -f /KERNEL linux /KERNEL boot=UUID=${UUID_SYSTEM} installer quiet systemd.debug_shell vga=current } menuentry "Live" { search --set -f /KERNEL linux /KERNEL boot=UUID=${UUID_SYSTEM} grub_live quiet vga=current } menuentry "Run" { search --set -f /KERNEL linux /KERNEL boot=UUID=${UUID_SYSTEM} disk=UUID=${UUID_STORAGE} grub_portable quiet } EOF mcopy "${LE_TMP}/syslinux.cfg" :: >"${SAVE_ERROR}" 2>&1 || show_error # install syslinux echo "image: installing syslinux to part1..." syslinux.mtools -i "${LE_TMP}/part1.fat" >"${SAVE_ERROR}" 2>&1 || show_error # copy files echo "image: copying files to part1..." mcopy "${TARGET_IMG}/${BUILD_NAME}.kernel" "::/${KERNEL_NAME}" >"${SAVE_ERROR}" 2>&1 || show_error mcopy "${TARGET_IMG}/${BUILD_NAME}.system" ::/SYSTEM >"${SAVE_ERROR}" 2>&1 || show_error mcopy "${RELEASE_DIR}/target/KERNEL.md5" "::/${KERNEL_NAME}.md5" >"${SAVE_ERROR}" 2>&1 || show_error mcopy "${RELEASE_DIR}/target/SYSTEM.md5" ::/SYSTEM.md5 >"${SAVE_ERROR}" 2>&1 || show_error mmd EFI EFI/BOOT >"${SAVE_ERROR}" 2>&1 || show_error mcopy "${TOOLCHAIN}/share/syslinux/bootx64.efi" ::/EFI/BOOT >"${SAVE_ERROR}" 2>&1 || show_error mcopy "${TOOLCHAIN}/share/syslinux/ldlinux.e64" ::/EFI/BOOT >"${SAVE_ERROR}" 2>&1 || show_error mcopy "${TOOLCHAIN}/share/grub/bootia32.efi" ::/EFI/BOOT >"${SAVE_ERROR}" 2>&1 || show_error mcopy "${LE_TMP}/grub.cfg" ::/EFI/BOOT >"${SAVE_ERROR}" 2>&1 || show_error elif [ "${BOOTLOADER}" = "bcm2835-bootloader" ]; then # create bootloader configuration echo "image: creating bootloader configuration..." cat << EOF > "${LE_TMP}/cmdline.txt" boot=UUID=${UUID_SYSTEM} disk=UUID=${UUID_STORAGE} quiet ${EXTRA_CMDLINE} EOF mcopy "${LE_TMP}/cmdline.txt" :: >"${SAVE_ERROR}" 2>&1 || show_error # copy files echo "image: copying files to part1..." mcopy "${TARGET_IMG}/${BUILD_NAME}.kernel" "::/${KERNEL_NAME}" >"${SAVE_ERROR}" 2>&1 || show_error mcopy "${TARGET_IMG}/${BUILD_NAME}.system" ::/SYSTEM >"${SAVE_ERROR}" 2>&1 || show_error mcopy "${RELEASE_DIR}/target/KERNEL.md5" "::/${KERNEL_NAME}.md5" >"${SAVE_ERROR}" 2>&1 || show_error mcopy "${RELEASE_DIR}/target/SYSTEM.md5" ::/SYSTEM.md5 >"${SAVE_ERROR}" 2>&1 || show_error for f in bootcode.bin fixup.dat start.elf ; do if [ -f "${RELEASE_DIR}/3rdparty/bootloader/$f" ]; then mcopy "${RELEASE_DIR}/3rdparty/bootloader/$f" :: >"${SAVE_ERROR}" 2>&1 || show_error fi done mcopy "${RELEASE_DIR}/3rdparty/bootloader/config.txt" :: >"${SAVE_ERROR}" 2>&1 || show_error for distro in "${RELEASE_DIR}/3rdparty/bootloader/distroconfig"*.txt ; do if [ -f "${distro}" ]; then mcopy "${distro}" ::/"${distro##*/}" >"${SAVE_ERROR}" 2>&1 || show_error fi done for dtb in "${RELEASE_DIR}/3rdparty/bootloader/"*.dtb ; do if [ -f "${dtb}" ]; then mcopy "${dtb}" ::/"${dtb##*/}" >"${SAVE_ERROR}" 2>&1 || show_error fi done if [ -d "${RELEASE_DIR}/3rdparty/bootloader/overlays" ]; then mcopy -s "${RELEASE_DIR}/3rdparty/bootloader/overlays" :: >"${SAVE_ERROR}" 2>&1 || show_error fi elif [ "${BOOTLOADER}" = "u-boot" -a \( -n "${UBOOT_SYSTEM}" -o -n "${SUBDEVICE}" \) ]; then # create bootloader configuration echo "image: creating bootloader configuration..." [ -n "${UBOOT_SYSTEM}" ] && DTB="$(${SCRIPTS}/uboot_helper ${PROJECT} ${DEVICE} ${UBOOT_SYSTEM} dtb)" || : if [ -n "${DTB}" ]; then if [ -f "${RELEASE_DIR}/3rdparty/bootloader/${DTB}" ]; then mcopy "${RELEASE_DIR}/3rdparty/bootloader/${DTB}" :: >"${SAVE_ERROR}" 2>&1 || show_error fi if [ -d "${RELEASE_DIR}/3rdparty/bootloader/overlays" ]; then mcopy -s "${RELEASE_DIR}/3rdparty/bootloader/overlays" :: >"${SAVE_ERROR}" 2>&1 || show_error fi mkdir -p "${LE_TMP}/extlinux" cat << EOF > "${LE_TMP}/extlinux/extlinux.conf" LABEL ${DISTRO} LINUX /${KERNEL_NAME} FDT /${DTB} APPEND boot=UUID=${UUID_SYSTEM} disk=UUID=${UUID_STORAGE} quiet ${EXTRA_CMDLINE} EOF mcopy -s "${LE_TMP}/extlinux" :: >"${SAVE_ERROR}" 2>&1 || show_error fi if [ -f "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/bootloader/mkimage" ]; then . "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/bootloader/mkimage" elif [ -f "${PROJECT_DIR}/${PROJECT}/bootloader/mkimage" ]; then . "${PROJECT_DIR}/${PROJECT}/bootloader/mkimage" else echo "image: skipping u-boot. no mkimage script found" fi echo "image: copying files to part1..." mcopy "${TARGET_IMG}/${BUILD_NAME}.kernel" "::/${KERNEL_NAME}" >"${SAVE_ERROR}" 2>&1 || show_error mcopy "${TARGET_IMG}/${BUILD_NAME}.system" ::/SYSTEM >"${SAVE_ERROR}" 2>&1 || show_error mcopy "${RELEASE_DIR}/target/KERNEL.md5" "::/${KERNEL_NAME}.md5" >"${SAVE_ERROR}" 2>&1 || show_error mcopy "${RELEASE_DIR}/target/SYSTEM.md5" ::/SYSTEM.md5 >"${SAVE_ERROR}" 2>&1 || show_error elif [ "${BOOTLOADER}" = "u-boot" ]; then echo "to make an image using u-boot UBOOT_SYSTEM must be set" cleanup exit fi # bootloader # run fsck echo "image: checking filesystem on part1..." sync fsck.fat -n "${LE_TMP}/part1.fat" >"${SAVE_ERROR}" 2>&1 || show_error # merge part1 into disk image echo "image: merging part1 into disk image..." dd if="${LE_TMP}/part1.fat" of="${DISK}" bs=512 seek="${SYSTEM_PART_START}" conv=fsync,notrunc >"${SAVE_ERROR}" 2>&1 || show_error # finalize virtual appliance if [ "${PROJECT}" = "Generic" ]; then # change syslinux default to 'run' echo "image: modifying files on part1 for open virtual appliance..." sed -e "/DEFAULT/ s/installer/run/" -i "${LE_TMP}/syslinux.cfg" sed -e "/set default=/s/\"Installer\"/\"Run\"/" -i "${LE_TMP}/grub.cfg" mcopy "${LE_TMP}/syslinux.cfg" :: >"${SAVE_ERROR}" 2>&1 || show_error mcopy "${LE_TMP}/grub.cfg" ::/EFI/BOOT >"${SAVE_ERROR}" 2>&1 || show_error sync # run fsck echo "image: checking filesystem on part1..." fsck.fat -n "${LE_TMP}/part1.fat" >"${SAVE_ERROR}" 2>&1 || show_error # merge modified part1 into tmp disk image echo "image: merging part1 into open virtual appliance..." dd if="${LE_TMP}/part1.fat" of="${DISK_BASENAME}.tmp" bs=512 seek="${SYSTEM_PART_START}" conv=fsync,notrunc >"${SAVE_ERROR}" 2>&1 || show_error # create vmdk from tmp ${DISK} echo "image: creating vmdk for open virtual appliance..." qemu-img convert -O vmdk -o subformat=streamOptimized "${DISK_BASENAME}.tmp" "${DISK_BASENAME}.vmdk" # generate ovf from template sed -e "s,@DISTRO@,${DISTRO},g" -e "s,@DISK@,${IMAGE_NAME},g" \ -e "s,@OVA_SIZE@,$((${OVA_SIZE}*1024*1024)),g" \ "${PROJECT_DIR}/${PROJECT}/config/ovf.template" > "${DISK_BASENAME}.ovf" # combine ovf and vmdk into official ova tar -C "${TARGET_IMG}" -cf "${DISK_BASENAME}.ova" "${IMAGE_NAME}.ovf" "${IMAGE_NAME}.vmdk" # create sha256 checksum of ova image ( cd "${TARGET_IMG}" sha256sum "${IMAGE_NAME}.ova" > "${IMAGE_NAME}.ova.sha256" ) echo "image: cleaning up open virtual appliance..." # remove tmp ${DISK}, vmdk and ovf rm "${DISK_BASENAME}.tmp" "${DISK_BASENAME}.vmdk" "${DISK_BASENAME}.ovf" fi # gzip echo "image: compressing..." pigz --best --force "${DISK}" # create sha256 checksum of image ( cd "${TARGET_IMG}" sha256sum "${DISK##*/}.gz" > "${DISK##*/}.gz.sha256" ) # cleanup cleanup exit ================================================ FILE: scripts/pkgbuild ================================================ #!/bin/bash # This function is passed the build instruction for a single job. # The function will run either "build <package>" or "install <package>". # ${slot} is the job slot number, ie. 1-8 when THREADCOUNT=8. # ${job} is the sequence within the total number of ${jobs}. package_worker() { local slot=$1 job=$2 jobs=$3 maxslot=$4 task="$5" pkgname="$6" oseqinfo="$7" local result status local addon istarget isaddon export MTJOBID=${slot} PARALLEL_SEQ=${job} MTMAXJOBS=${jobs} MTMAXSLOT=${maxslot} . config/options "${pkgname}" if [ -z "${oseqinfo}" ]; then ${SCRIPTS}/${task} ${pkgname} 2>&1 && result=0 || result=1 else print_color CLR_ERROR "FAILURE [${task} ${pkgname}]: a previous dependency process has already failed!" echo echo num=0 for failed_items in ${oseqinfo//;/ }; do num=$((num + 1)) read -r ftask fpkgname fseq <<< "${failed_items//,/ }" if [ -n "${fseq}" ]; then [ ${num} -eq 1 ] && echo "The following log(s) for already failed dependencies are available:" printf " %-7s %s => %s\n" "${ftask}" "${fpkgname}" "${THREAD_CONTROL}/logs/${fseq}.log" else print_color CLR_ERROR "ALREADY FAILED [${ftask} ${fpkg}]" echo fi done echo result=1 fi [[ ${pkgname} =~ :target$ || "${pkgname//:/}" = "${pkgname}" ]] && istarget="yes" || istarget="no" [[ "${MTADDONBUILD}" = "yes" && ( "${PKG_IS_ADDON}" = "yes" || "${PKG_IS_ADDON}" = "embedded" ) ]] && isaddon="yes" || isaddon="no" if [ "${isaddon}" = "yes" -a "${istarget}" = "yes" ]; then if [ ${result} -eq 0 ]; then ${SCRIPTS}/install_addon ${pkgname} 2>&1 && result=0 || result=1 fi if [ ${result} -ne 0 ]; then if [ -d "${THREAD_CONTROL}/logs" ]; then echo "${PKG_NAME} ${THREAD_CONTROL}/logs/${job}.log" >>"${THREAD_CONTROL}/addons.failed" else echo "${PKG_NAME}" >>"${THREAD_CONTROL}/addons.failed" fi fi fi ( flock --exclusive 95 [ ${result} -eq 0 ] && status="DONE" || status="FAIL" num=$(< "${THREAD_CONTROL}/progress") mv "${THREAD_CONTROL}/progress" "${THREAD_CONTROL}/progress.prev" num=$((num + 1)) echo ${num} >"${THREAD_CONTROL}/progress" ) 95>"${THREAD_CONTROL}/locks/.progress" if [ ${result} -eq 0 ]; then pkg_lock_status "IDLE" else pkg_lock_status "FAILED" "${pkgname}" "${task}" print_color CLR_ERROR "FAILURE: $SCRIPTS/${task} ${pkgname} has failed!" echo fi return ${result} } package_worker "$1" "$2" "$3" "$4" "$5" "$6" "$7" ================================================ FILE: scripts/pkgbuilder.py ================================================ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) import sys import os import datetime, time import argparse import json import codecs import threading import queue import subprocess import multiprocessing import signal import fcntl, termios, struct # Ensure we can output any old crap to stdout and stderr sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) sys.stderr = codecs.getwriter("utf-8")(sys.stderr.detach()) # derive from subprocess to utilize wait4() for rusage stats class RusagePopen(subprocess.Popen): def _try_wait(self, wait_flags): try: (pid, sts, ru) = os.wait4(self.pid, wait_flags) except OSError as e: if e.errno != errno.ECHILD: raise pid = self.pid sts = 0 else: self.rusage = ru return (pid, sts) def rusage_run(*popenargs, parent=None, timeout=None, **kwargs): with RusagePopen(*popenargs, **kwargs) as process: try: parent.child = process stdout, stderr = process.communicate(None, timeout=timeout) except subprocess.TimeoutExpired as exc: process.kill() process.wait() raise except: process.kill() raise retcode = process.poll() res = subprocess.CompletedProcess(process.args, retcode, stdout, stderr) res.rusage = process.rusage parent.child = None return res class GeneratorEmpty(Exception): pass class GeneratorStalled(Exception): pass class Generator: def __init__(self, plan): self.work = plan self.totalJobs = len(plan) self.building = {} self.built = {} self.failed = {} self.removedPackages = {} self.check_no_deps = True # Transform unpack info from package:target to just package - simplifying refcount generation # Create a map for sections, as we don't autoremove "virtual" packages self.unpacks = {} self.sections = {} for job in self.work: (pkg_name, target) = job["name"].split(":") if pkg_name not in self.unpacks: self.unpacks[pkg_name] = job["unpacks"] self.sections[pkg_name] = job["section"] for unpack in job["unpacks"]: if unpack not in self.sections: self.sections[unpack] = "" # don't know section, assume not virtual # Count number of times each package is referenced by package:target (including itself) and # then recursively accumulate counts for any other packages that may be referenced # by "PKG_DEPENDS_UNPACK". # Once the refcount is zero for a package, the source directory can be removed. self.refcount = {} for job in self.work: (pkg_name, target) = job["name"].split(":") self.refcount[pkg_name] = self.refcount.get(pkg_name, 0) + 1 for pkg_name in job["unpacks"]: self.addRefCounts(pkg_name) def canBuildJob(self, job): for dep in job["wants"]: if dep not in self.built: return False return True def getPackagesToRemove(self, job): packages = {} pkg_name = job["name"].split(":")[0] packages[pkg_name] = True for pkg_name in job["unpacks"]: self.addUnpackPackages(pkg_name, packages) for pkg_name in packages: if self.refcount[pkg_name] == 0 and \ self.sections[pkg_name] != "virtual" and \ pkg_name not in self.removedPackages: yield pkg_name def getPackageReferenceCounts(self, job): packages = {} pkg_name = job["name"].split(":")[0] packages[pkg_name] = True for pkg_name in job["unpacks"]: self.addUnpackPackages(pkg_name, packages) for pkg_name in packages: tokens = "" tokens += "[v]" if self.sections[pkg_name] == "virtual" else "" tokens += "[r]" if pkg_name in self.removedPackages else "" yield("%s:%d%s" % (pkg_name, self.refcount[pkg_name], tokens)) def getFirstFailedJob(self, job): for dep in job["wants"]: if dep in self.failed: failedjob = self.getFirstFailedJob(self.failed[dep]) if not failedjob: return self.failed[dep] else: return failedjob return None def getAllFailedJobs(self, job): flist = {} for dep in job["wants"]: if dep in self.failed: failedjob = self.getFirstFailedJob(self.failed[dep]) if failedjob: flist[failedjob["name"]] = failedjob else: flist[dep] = self.failed[dep] return [flist[x] for x in flist] def getNextJob(self): if self.work == []: raise GeneratorEmpty # Always process jobs without dependencies first # until we're sure there's none left... if self.check_no_deps: for i, job in enumerate(self.work): if job["wants"] == []: self.building[job["name"]] = True del self.work[i] job["failedjobs"] = self.getAllFailedJobs(job) job["logfile"] = None job["cmdproc"] = None job["failed"] = False return job self.check_no_deps = False # Process remaining jobs, trying to schedule # only those jobs with all their dependencies satisifed for i, job in enumerate(self.work): if self.canBuildJob(job): self.building[job["name"]] = True del self.work[i] job["failedjobs"] = self.getAllFailedJobs(job) job["logfile"] = None job["cmdproc"] = None job["failed"] = False return job raise GeneratorStalled # Return details about stalled jobs that can't build until the # currently building jobs are complete. def getStallInfo(self): for job in self.work: for dep in job["wants"]: if dep not in self.building and dep not in self.built: break else: yield (job["name"], [d for d in job["wants"] if d in self.building]) def activeJobCount(self): return len(self.building) def activeJobNames(self): for name in self.building: yield name def failedJobCount(self): return len(self.failed) def failedJobs(self): for name in self.failed: yield self.failed[name] def completedJobCount(self): return len(self.built) def totalJobCount(self): return self.totalJobs def completed(self, job): self.built[job["name"]] = job del self.building[job["name"]] if job["failed"]: self.failed[job["name"]] = job else: self.refcount[job["name"].split(":")[0]] -= 1 for pkg_name in job["unpacks"]: self.delRefCounts(pkg_name) def removed(self, pkg_name): self.removedPackages[pkg_name] = True def addUnpackPackages(self, pkg_name, packages): packages[pkg_name] = True if pkg_name in self.unpacks: for p in self.unpacks[pkg_name]: self.addUnpackPackages(p, packages) def addRefCounts(self, pkg_name): self.refcount[pkg_name] = self.refcount.get(pkg_name, 0) + 1 if pkg_name in self.unpacks: for p in self.unpacks[pkg_name]: self.addRefCounts(p) def delRefCounts(self, pkg_name): self.refcount[pkg_name] = self.refcount.get(pkg_name, 0) - 1 if pkg_name in self.unpacks: for p in self.unpacks[pkg_name]: self.delRefCounts(p) class BuildProcess(threading.Thread): def __init__(self, slot, maxslot, jobtotal, haltonerror, work, complete): threading.Thread.__init__(self, daemon=True) self.slot = slot self.maxslot = maxslot self.jobtotal = jobtotal self.haltonerror = haltonerror self.work = work self.complete = complete self.active = False self.child = None self.stopping = False def stop(self): self.stopping = True self.work.put(None) if self.child: try: os.killpg(os.getpgid(self.child.pid), signal.SIGTERM) self.child.wait() except: pass def isActive(self): return self.active == True def run(self): while not self.stopping: job = self.work.get(block=True) if job == None or self.stopping: break self.active = True job["slot"] = self.slot job["failed"] = self.execute(job) job["status"] = "FAIL" if job["failed"] else "DONE" self.complete.put(job) self.active = False if job["failed"] and self.haltonerror: break def execute(self, job): if job["failedjobs"]: flist = [] for fjob in job["failedjobs"]: failedinfo = "%s,%s" % (fjob["task"], fjob["name"]) if fjob["logfile"]: failedinfo = "%s,%s" % (failedinfo, fjob["seq"]) flist.append(failedinfo) failedinfo = ";".join(flist) else: failedinfo = "" job["args"] = ["%s/%s/pkgbuild" % (ROOT, SCRIPTS), "%d" % self.slot, "%d" % job["seq"], "%d" % self.jobtotal, "%d" % self.maxslot, job["task"], job["name"], failedinfo] job["start"] = time.time() returncode = 1 try: if job["logfile"]: with open(job["logfile"], "w") as logfile: cmd = rusage_run(job["args"], cwd=ROOT, stdin=subprocess.PIPE, stdout=logfile, stderr=subprocess.STDOUT, universal_newlines=True, shell=False, parent=self, start_new_session=True) returncode = cmd.returncode job["cmdproc"] = cmd else: try: cmd = rusage_run(job["args"], cwd=ROOT, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, shell=False, parent=self, start_new_session=True, encoding="utf-8", errors="replace") returncode = cmd.returncode job["cmdproc"] = cmd except UnicodeDecodeError: print('\nPKGBUILDER ERROR: UnicodeDecodeError while reading cmd.stdout from "%s %s"\n' % (job["task"], job["name"]), file=sys.stderr, flush=True) except Exception as e: print("\nPKGBUILDER ERROR: %s exception while executing: %s\n" % (str(e), job["args"]), file=sys.stderr, flush=True) job["end"] = time.time() job["elapsed"] = job["end"] - job["start"] if job["cmdproc"]: job["utime"] = job["cmdproc"].rusage.ru_utime job["stime"] = job["cmdproc"].rusage.ru_stime else: job["utime"] = job["stime"] = 0 if job["elapsed"] == 0.0: job["cpu"] = 0.0 else: job["cpu"] = round((job["utime"] + job["stime"]) * 100 / job["elapsed"]) return (returncode != 0) class Builder: def __init__(self, maxthreadcount, inputfilename, jobglog, loadstats, stats_interval, \ haltonerror=True, failimmediately=True, log_burst=True, log_combine="always", \ bookends=True, autoremove=False, colors=False, progress=False, debug=False, verbose=False): if inputfilename == "-": plan = json.load(sys.stdin) else: with open(inputfilename, "r") as infile: plan = json.load(infile) self.generator = Generator(plan) self.jobtotal = self.generator.totalJobCount() self.twidth = len("%d" % self.jobtotal) # parse threadcount if maxthreadcount.endswith("%"): self.threadcount = int(multiprocessing.cpu_count() / 100 * int(args.max_procs.replace("%",""))) else: if args.max_procs == "0": self.threadcount = 256 else: self.threadcount = int(maxthreadcount) self.threadcount = min(self.jobtotal, self.threadcount) self.threadcount = max(1, self.threadcount) if args.debug: DEBUG("THREADCOUNT#: input arg: %s, computed: %d" % (maxthreadcount, self.threadcount)) self.joblog = jobglog self.loadstats = loadstats self.stats_interval = int(stats_interval) if self.stats_interval < 1: self.stats_interval = 60 self.haltonerror = haltonerror self.failimmediately = failimmediately self.log_burst = log_burst self.log_combine = log_combine self.debug = debug self.verbose = verbose self.bookends = bookends self.autoremove = autoremove self.stdout_dirty = False self.stderr_dirty = False self.progress_dirty = False self.joblogfile = None self.loadstatsfile = None self.nextstats = 0 self.build_start = 0 self.work = queue.Queue() self.complete = queue.Queue() self.processes = [] # Init all processes self.processes = [] for i in range(1, self.threadcount + 1): self.processes.append(BuildProcess(i, self.threadcount, self.jobtotal, self.haltonerror, self.work, self.complete)) # work and completion sequences self.wseq = 0 self.cseq = 0 self.progress = progress and sys.stderr.isatty() self.progress_glitch_fix = "" self.rows = self.columns = -1 self.original_resize_handler = None if self.progress: self.getTerminalSize() self.resize_handler = signal.signal(signal.SIGWINCH, self.getTerminalSize) self.colors = (colors == "always" or (colors == "auto" and sys.stderr.isatty())) self.color_code = {} self.color_code["DONE"] = "\033[0;32m" #green self.color_code["FAIL"] = "\033[1;31m" #bold red self.color_code["ACTV"] = "\033[0;33m" #yellow self.color_code["IDLE"] = "\033[0;35m" #magenta self.color_code["INIT"] = "\033[0;36m" #cyan self.color_code["WAIT"] = "\033[0;35m" #magenta def build(self): if self.joblog: self.joblogfile = open(self.joblog, "w") if self.loadstats: self.loadstatsfile = open(self.loadstats, "w") self.build_start = time.time() for process in self.processes: process.start() # Queue new work until no more work is available, and all queued jobs have completed. while self.queueWork(): job = self.getCompletedJob() self.writeJobLog(job) self.autoRemovePackages(job) self.processJobOutput(job) self.displayJobStatus(job) job["cmdproc"] = None job = None self.captureStats(finished=True) if self.joblogfile: self.joblogfile.close() if self.loadstatsfile: self.loadstatsfile.close() if self.generator.failedJobCount() != 0: if self.haltonerror and not self.failimmediately: failed = [job for job in self.generator.failedJobs() if job["logfile"]] if failed != []: self.oprint("\nThe following log(s) for this failure are available:") for job in failed: self.oprint(" %s => %s" % (job["name"], job["logfile"])) self.oprint("", flush=True) return False return True # Fill work queue with enough jobs to keep all processes busy. # Return True while jobs remain available to build, or queued jobs are still building. # Return False once all jobs have been queued, and finished building. def queueWork(self): # If an error has occurred and we are not ignoring errors, then return True # (but don't schedule new work) if we are to exit after all currently # active jobs have finished, otherwise return False. if self.haltonerror and self.generator.failedJobCount() != 0: if not self.failimmediately and self.generator.activeJobCount() != 0: freeslots = self.threadcount - self.generator.activeJobCount() self.show_status("WAIT", "waiting", ", ".join(self.generator.activeJobNames())) DEBUG("Waiting for : %d active, %d idle [%s]" % (self.generator.activeJobCount(), freeslots, ", ".join(self.generator.activeJobNames()))) return True else: return False try: for i in range(self.generator.activeJobCount(), self.threadcount): job = self.generator.getNextJob() if self.verbose: self.show_status("INIT", "submit", job["name"]) if self.debug: DEBUG("Queueing Job: %s %s" % (job["task"], job["name"])) self.wseq += 1 job["seq"] = self.wseq if self.log_burst: job["logfile"] = "%s/logs/%d.log" % (THREAD_CONTROL, job["seq"]) self.work.put(job) if self.verbose: self.show_status("ACTV", "active", ", ".join(self.generator.activeJobNames())) if self.debug: freeslots = self.threadcount - self.generator.activeJobCount() DEBUG("Building Now: %d active, %d idle [%s]" % (self.generator.activeJobCount(), freeslots, ", ".join(self.generator.activeJobNames()))) except GeneratorStalled: if self.verbose: freeslots = self.threadcount - self.generator.activeJobCount() pending = [] for (i, (package, wants)) in enumerate(self.generator.getStallInfo()): pending.append("%s (wants: %s)" % (package, ", ".join(wants))) self.show_status("ACTV", "active", ", ".join(self.generator.activeJobNames())) self.show_status("IDLE", "stalled", "; ".join(pending), p1=len(pending)) if self.debug: freeslots = self.threadcount - self.generator.activeJobCount() DEBUG("Building Now: %d active, %d idle [%s]" % (self.generator.activeJobCount(), freeslots, ", ".join(self.generator.activeJobNames()))) for (i, (package, wants)) in enumerate(self.generator.getStallInfo()): item = "%-25s wants: %s" % (package, ", ".join(wants)) if i == 0: DEBUG("Stalled Jobs: %s" % item) else: DEBUG(" %s" % item) except GeneratorEmpty: if self.generator.activeJobCount() == 0: if self.debug: DEBUG("NO MORE JOBS: All jobs have completed - exiting.") return False else: if self.debug: n = self.generator.activeJobCount() DEBUG("NO MORE JOBS: Waiting on %d job%s to complete..." % (n, ["s",""][n == 1])) return True # Wait until a new job is available def getCompletedJob(self): while True: try: job = self.complete.get(block=True, timeout=self.captureStats(finished=False)) self.generator.completed(job) if self.debug: DEBUG("Finished Job: %s %s [%s] after %0.3f seconds" % (job["task"], job["name"], job["status"], job["elapsed"])) return job except queue.Empty: pass def captureStats(self, finished=False): self.displayProgress() if finished: self.clearProgress() self.flush() if not self.loadstatsfile: if self.progress: now = time.time() return int(now + 1) - now else: return None now = time.time() if now >= self.nextstats or finished: self.nextstats = int(now - (now % self.stats_interval)) + self.stats_interval loadavg = self.getLoad() procs = loadavg[3].split("/") meminfo = self.getMemory() print("%d %06d %5s %5s %5s %3s %4s %9d %2d %s" % (now, now - self.build_start, \ loadavg[0], loadavg[1], loadavg[2], procs[0], procs[1], meminfo["MemAvailable"], \ self.generator.activeJobCount(), ",".join(self.generator.activeJobNames())), \ file=self.loadstatsfile, flush=True) if self.progress: return min((self.nextstats - now), int(now + 1) - now) else: return (self.nextstats - now) def displayProgress(self): if self.progress: freeslots = self.threadcount - self.generator.activeJobCount() if self.jobtotal != self.generator.completedJobCount(): percent = "%0.2f" % (100 / self.jobtotal * self.generator.completedJobCount()) else: percent = "100" loadavg = self.getLoad() meminfo = self.getMemory() available = int(meminfo["MemAvailable"]) / 1024 lines = [ "", "%s: %5s%% | load: %s mem: %d MB | failed: %d idle: %d active: %d" % \ (self.secs2hms(time.time() - self.build_start), percent, \ loadavg[0], available, \ self.generator.failedJobCount(), freeslots, self.generator.activeJobCount()), "Building: %s" % ", ".join(self.generator.activeJobNames()) ] columns = self.columns # in theory could change mid-loop output = [] for line in lines: output.append(line if len(line) < columns else "%s+" % line[0:columns - 2]) if not self.progress_glitch_fix: self.progress_glitch_fix = "%s\033[%dA" % ("\n" * len(output), len(output)) # \033[?7l: disable linewrap # \033[0K: clear cursor to end of line (every line but last) # \033[0J: clear cursor to end of screen (last line) # \033%dA: move cursor up %d lines (move back to "home" position) # \033[?7h: re-enable linewrap # # When the console is resized to a narrower width, lines wider than the # new console width may be wrapped to a second line (depends on console # software, for example PuTTY) so disable line wrapping to prevent this. # self.eprint("\033[?7l%s\033[0J\r\033[%dA\033[?7h" % ("\033[0K\n".join(output), len(output) - 1), end="\r", isProgress=True) self.progress_dirty = True def clearProgress(self): if self.progress and self.progress_dirty: self.progress_dirty = False self.eprint("\033[0J", end="") # Output completion info, and links to any relevant logs def displayJobStatus(self, job): self.cseq += 1 self.show_status(job["status"], job["task"], job["name"], p1=self.cseq, p2=self.jobtotal) if job["failed"]: if job["logfile"]: self.eprint("\nThe following log for this failure is available:\n %s\n" % job["logfile"]) if job["failedjobs"] and job["failedjobs"][0]["logfile"]: if len(job["failedjobs"]) == 1: self.eprint("The following log from the failed dependency may be relevant:") else: self.eprint("The following logs from the failed dependencies may be relevant:") for fjob in job["failedjobs"]: self.eprint(" %-7s %s => %s" % (fjob["task"], fjob["name"], fjob["logfile"])) self.eprint("") # If configured, send output for a job (either a logfile, or captured stdout) to stdout def processJobOutput(self, job): log_processed = False log_size = 0 log_start = time.time() if job["logfile"]: if self.log_combine == "always" or (job["failed"] and self.log_combine == "fail"): if self.bookends: self.oprint("<<< %s seq %s <<<" % (job["name"], job["seq"])) try: with open(job["logfile"], "r", encoding="utf-8", errors="replace") as logfile: for line in logfile: self.oprint(line, end="") log_size += len(line) except UnicodeDecodeError: self.eprint("\nPKGBUILDER ERROR: UnicodeDecodeError while reading log file %s\n" % job["logfile"]) if job["failed"]: self.oprint("\nThe following log for this failure is available:\n %s\n" % job["logfile"]) if self.bookends: self.oprint(">>> %s seq %s >>>" % (job["name"], job["seq"])) log_processed = True elif job["cmdproc"]: if self.log_combine == "always" or (job["failed"] and self.log_combine == "fail"): if self.bookends: self.oprint("<<< %s" % job["name"]) for line in job["cmdproc"].stdout: self.oprint(line, end="") log_size += len(line) if "autoremove" in job: for line in job["autoremove"].stdout: self.oprint(line, end="") log_size += len(line) job["autoremove"] = None if self.bookends: self.oprint(">>> %s" % job["name"]) log_processed = True if log_processed: self.flush() if self.debug: log_elapsed = time.time() - log_start log_rate = int(log_size / log_elapsed) if log_elapsed != 0 else 0 log_data = ", %s" % "/".join(job["logfile"].split("/")[-2:]) if job["logfile"] else "" DEBUG("WRITING LOG : {0:,} bytes in {1:0.3f} seconds ({2:,d} bytes/sec{3:})".format(log_size, log_elapsed, log_rate, log_data)) # Log completion stats for job def writeJobLog(self, job): if self.joblogfile: print("{j[status]} {j[seq]:0{width}} {j[slot]} {j[task]} {j[name]} " \ "{j[utime]:.{prec}f} {j[stime]:.{prec}f} {j[cpu]} " \ "{j[elapsed]:.{prec}f} {j[start]:.{prec}f} {j[end]:.{prec}f} {0}" \ .format(job["logfile"] if job["logfile"] else "", j=job, prec=4, width=self.twidth), file=self.joblogfile, flush=True) # Remove any source code directories that are no longer required. # Output from the subprocess is either appended to the burst logfile # or is captured for later output to stdout (after the correspnding logfile). def autoRemovePackages(self, job): if self.autoremove: if self.debug: DEBUG("Cleaning Pkg: %s (%s)" % (job["name"], ", ".join(self.generator.getPackageReferenceCounts(job)))) for pkg_name in self.generator.getPackagesToRemove(job): DEBUG("Removing Pkg: %s" % pkg_name) args = ["%s/%s/autoremove" % (ROOT, SCRIPTS), pkg_name] if job["logfile"]: with open(job["logfile"], "a") as logfile: cmd = subprocess.run(args, cwd=ROOT, stdin=subprocess.PIPE, stdout=logfile, stderr=subprocess.STDOUT, universal_newlines=True, shell=False) else: job["autoremove"] = subprocess.run(args, cwd=ROOT, stdin=subprocess.PIPE, capture_output=True, universal_newlines=True, shell=False) self.generator.removed(pkg_name) def show_status(self, status, task, data, p1=None, p2=None): p1 = (self.threadcount - self.generator.activeJobCount()) if p1 == None else p1 p2 = self.generator.activeJobCount() if p2 == None else p2 colored_status = "%s%-4s\033[0m" % (self.color_code[status], status) if self.colors else "%-4s" % status self.eprint("%s[%0*d/%0*d] [%s] %-7s %s" % \ (self.progress_glitch_fix, self.twidth, p1, self.twidth, p2, colored_status, task, data)) def stopProcesses(self): if self.processes: for process in self.processes: process.stop() self.processes = None def cleanup(self): self.clearProgress() self.flush() if self.original_resize_handler != None: signal.signal(signal.SIGWINCH, self.original_resize_handler) self.stopProcesses() def flush(self): if self.stdout_dirty: sys.stdout.flush() self.stdout_dirty = False if self.stderr_dirty: sys.stderr.flush() self.stderr_dirty = False def oprint(self, *args, flush=False, **kwargs): if self.progress_dirty: self.clearProgress() if self.stderr_dirty: sys.stderr.flush() self.stderr_dirty = False print(*args, **kwargs, file=sys.stdout, flush=flush) self.stdout_dirty = not flush def eprint(self, *args, flush=False, isProgress=False, **kwargs): if self.stdout_dirty: sys.stdout.flush() self.stdout_dirty = False if not isProgress and self.progress_dirty: self.clearProgress() print(*args, **kwargs, file=sys.stderr, flush=flush) self.stderr_dirty = not flush def getLoad(self): return open("/proc/loadavg", "r").readline().split() def getMemory(self): return dict((i.split()[0].rstrip(':'),int(i.split()[1])) for i in open("/proc/meminfo", "r").readlines()) def getTerminalSize(self, signum = None, frame = None): h, w, hp, wp = struct.unpack('HHHH', fcntl.ioctl(sys.stderr.fileno(), termios.TIOCGWINSZ, struct.pack('HHHH', 0, 0, 0, 0))) self.rows = h self.columns = w def secs2hms(self, seconds): min, sec = divmod(seconds, 60) hour, min = divmod(min, 60) return "%02d:%02d:%02d" % (hour, min, sec) def DEBUG(msg): if DEBUG_LOG: print("%s: %s" % (datetime.datetime.now(), msg), file=DEBUG_LOG, flush=True) parser = argparse.ArgumentParser(description="Run processes to build the specified JSON plan", \ formatter_class=lambda prog: argparse.HelpFormatter(prog,max_help_position=25,width=90)) parser.add_argument("--max-procs", required=False, default="100%", \ help="Maximum number of processes to use. 0 is unlimited. Can be expressed as " \ "a percentage, for example 50%% (of $(nproc)). Default is 100%%.") parser.add_argument("--plan", metavar="FILE", default="-", \ help="JSON formatted plan to be processed (default is to read from stdin).") parser.add_argument("--joblog", metavar="FILE", default=None, \ help="File into which job completion information will be written.") parser.add_argument("--loadstats", metavar="FILE", default=None, \ help="File into which load average and memory statistics will be written.") parser.add_argument("--stats-interval", metavar="SECONDS", type=int, default=60, \ help="Sampling interval in seconds for --loadstats. Default is 60.") group = parser.add_mutually_exclusive_group() group.add_argument("--log-burst", action="store_true", default=True, \ help="Burst job output into individual log files. This is the default.") group.add_argument("--no-log-burst", action="store_false", dest="log_burst", \ help="Disable --log-burst, job output is only written to stdout.") parser.add_argument("--log-combine", choices=["always", "never", "fail"], default="always", \ help='Choose when to send job output to stdout. "fail" will send to stdout the ' \ 'log of failed jobs only, while "never" will not send any logs to stdout. ' \ 'Default is "always".') group = parser.add_mutually_exclusive_group() group.add_argument("--with-bookends", action="store_true", default=True, \ help="Top & tail combined logs with searchable markers. Default is enabled.") group.add_argument("--without-bookends", action="store_false", dest="with_bookends", \ help="Disable --with-bookends") group = parser.add_mutually_exclusive_group() group.add_argument("--halt-on-error", action="store_true", default=True, \ help="Halt on first build failure. This is the default.") group.add_argument("--continue-on-error", action="store_false", dest="halt_on_error", \ help="Disable --halt-on-error and continue building.") group = parser.add_mutually_exclusive_group() group.add_argument("--fail-immediately", action="store_true", default=True, \ help="With --halt-on-error, the build can either fail immediately or only after all " \ "other active jobs have finished. Default is to fail immediately.") group.add_argument("--fail-after-active", action="store_false", dest="fail_immediately", \ help="With --halt-on-error, when an error occurs fail after all other active jobs have finished.") parser.add_argument("--auto-remove", action="store_true", default=False, \ help="Automatically remove redundant source code directories. Default is disabled.") parser.add_argument("--progress", action="store_true", default=False, \ help="Display progress information. Default is disabled") parser.add_argument("--verbose", action="store_true", default=False, \ help="Output verbose information to stderr.") parser.add_argument("--debug", action="store_true", default=False, \ help="Enable debug information.") parser.add_argument("--colors", choices=["always", "never", "auto"], default="auto", \ help="Color code status (DONE, FAIL, etc) labels.") args = parser.parse_args() #--------------------------- ROOT = os.environ.get("ROOT", os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) SCRIPTS = os.environ.get("SCRIPTS", "scripts") THREAD_CONTROL = os.environ["THREAD_CONTROL"] if args.debug: debug_log = "%s/debug.log" % THREAD_CONTROL DEBUG_LOG = open(debug_log, "w") print("Debug information is being written to: %s\n" % debug_log, file=sys.stderr, flush=True) else: DEBUG_LOG = None with open("%s/parallel.pid" % THREAD_CONTROL, "w") as pid: print("%d" % os.getpid(), file=pid) try: builder = Builder(args.max_procs, args.plan, args.joblog, args.loadstats, args.stats_interval, \ haltonerror=args.halt_on_error, failimmediately=args.fail_immediately, \ log_burst=args.log_burst, log_combine=args.log_combine, bookends=args.with_bookends, \ autoremove=args.auto_remove, colors=args.colors, progress=args.progress, \ debug=args.debug, verbose=args.verbose) result = builder.build() if DEBUG_LOG: DEBUG_LOG.close() sys.exit(0 if result else 1) except (KeyboardInterrupt, SystemExit) as e: if builder: builder.cleanup() if type(e) == SystemExit: sys.exit(int(str(e))) else: sys.exit(1) ================================================ FILE: scripts/pkgjson ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) . config/options "" # This function is passed a list of package.mk paths to be processed. # Each package.mk is sourced with relevant variables output in JSON format. json_worker() { local packages="$@" local pkgpath hierarchy exited exit() { exited=1; } for pkgpath in ${packages}; do pkgpath="${pkgpath%%@*}" exited=0 if ! source_package "${pkgpath}/package.mk" &>/dev/null; then unset -f exit die "$(print_color CLR_ERROR "FAILURE: sourcing package ${pkgpath}/package.mk")" fi [ ${exited} -eq 1 ] && continue if [[ "${pkgpath}" =~ ^${ROOT}/${PACKAGES}/* ]]; then hierarchy="global" elif [[ "${pkgpath}" =~ ^${ROOT}/projects/${PROJECT}/${PACKAGES}/* ]]; then hierarchy="project" elif [[ "${pkgpath}" =~ ^${ROOT}/projects/${PROJECT}/devices/${DEVICE}/* ]]; then hierarchy="device" fi cat <<EOF { "name": "${PKG_NAME}", "hierarchy": "${hierarchy}", "section": "${PKG_SECTION}", "bootstrap": "${PKG_DEPENDS_BOOTSTRAP}", "init": "${PKG_DEPENDS_INIT}", "host": "${PKG_DEPENDS_HOST}", "target": "${PKG_DEPENDS_TARGET}", "unpack": "${PKG_DEPENDS_UNPACK}" }, EOF done unset -f exit } if [ "$1" = "--worker" ]; then shift json_worker "$*" exit $? fi # pipefail: return value of a pipeline is the value of the last (rightmost) command to exit with a non-zero status set -o pipefail cat ${_CACHE_PACKAGE_GLOBAL} ${_CACHE_PACKAGE_LOCAL} ${_CACHE_PACKAGE_LOCAL_DEVICE} | \ xargs --max-args=64 --max-procs="$(nproc)" "$0" --worker exit $? ================================================ FILE: scripts/uboot_helper ================================================ #!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) import argparse # When adding new devices to the list please keep them in alphabetical order # board-name should contain 'dashes' (-) not 'underscores' (_) and shouldn't contain capitals # you can check the formating using an online tool such as https://codebeautify.org/python-formatter-beautifier # 'project' : { # 'device' : { # 'board-name' : { # 'dtb' : 'board-name.dtb', # 'config' : 'board_name_defconfig' # }, # }, # }, devices = \ { 'Allwinner': { 'A64': { 'orangepi-win': { 'dtb': 'sun50i-a64-orangepi-win.dtb', 'config': 'orangepi_win_defconfig', 'crust_config': 'orangepi_win_defconfig', }, 'pine64': { 'dtb': 'sun50i-a64-pine64.dtb', 'config': 'pine64_plus_defconfig', 'crust_config': 'pine64_plus_defconfig' }, 'pine64-lts': { 'dtb': 'sun50i-a64-pine64-lts.dtb', 'config': 'pine64-lts_defconfig', 'crust_config': 'pine64_plus_defconfig' }, 'pine64-plus': { 'dtb': 'sun50i-a64-pine64-plus.dtb', 'config': 'pine64_plus_defconfig', 'crust_config': 'pine64_plus_defconfig', }, }, 'H2-plus': { 'bananapi-m2-zero': { 'dtb': 'sun8i-h2-plus-bananapi-m2-zero.dtb', 'config': 'bananapi_m2_zero_defconfig', 'crust_config': 'orangepi_one_defconfig' }, }, 'H3': { 'bananapi-m2p': { 'dtb': 'sun8i-h3-bananapi-m2-plus.dtb', 'config': 'bananapi_m2_plus_h3_defconfig', 'crust_config': 'bananapi_m2_plus_h3_defconfig' }, 'beelink-x2': { 'dtb': 'sun8i-h3-beelink-x2.dtb', 'config': 'beelink_x2_defconfig', 'crust_config': 'beelink_x2_defconfig' }, 'libretech-h3': { 'dtb': 'sun8i-h3-libretech-all-h3-cc.dtb', 'config': 'libretech_all_h3_cc_h3_defconfig', 'crust_config': 'libretech_all_h3_cc_h3_defconfig', }, 'nanopi-m1': { 'dtb': 'sun8i-h3-nanopi-m1.dtb', 'config': 'nanopi_m1_defconfig', 'crust_config': 'nanopi_m1_defconfig' }, 'orangepi-2': { 'dtb': 'sun8i-h3-orangepi-2.dtb', 'config': 'orangepi_2_defconfig', 'crust_config': 'orangepi_2_defconfig', }, 'orangepi-pc': { 'dtb': 'sun8i-h3-orangepi-pc.dtb', 'config': 'orangepi_pc_defconfig', 'crust_config': 'orangepi_pc_defconfig', }, 'orangepi-pc-plus': { 'dtb': 'sun8i-h3-orangepi-pc-plus.dtb', 'config': 'orangepi_pc_plus_defconfig', 'crust_config': 'orangepi_pc_plus_defconfig', }, 'orangepi-plus2e': { 'dtb': 'sun8i-h3-orangepi-plus2e.dtb', 'config': 'orangepi_plus2e_defconfig', 'crust_config': 'orangepi_plus2e_defconfig', }, 'orangepi-plus': { 'dtb': 'sun8i-h3-orangepi-plus.dtb', 'config': 'orangepi_plus_defconfig', 'crust_config': 'orangepi_plus_defconfig', }, }, 'H5' : { 'orangepi-pc2': { 'dtb': 'sun50i-h5-orangepi-pc2.dtb', 'config': 'orangepi_pc2_defconfig', 'crust_config': 'orangepi_pc2_defconfig', }, 'tritium-h5': { 'dtb': 'sun50i-h5-libretech-all-h3-cc.dtb', 'config': 'libretech_all_h3_cc_h5_defconfig', 'crust_config': 'libretech_all_h3_cc_h5_defconfig' }, }, 'H6': { 'beelink-gs1' : { 'dtb' : 'sun50i-h6-beelink-gs1.dtb', 'config' : 'beelink_gs1_defconfig', 'crust_config' : 'beelink_gs1_defconfig' }, 'orangepi-3': { 'dtb': 'sun50i-h6-orangepi-3.dtb', 'config': 'orangepi_3_defconfig', 'crust_config': 'orangepi_3_defconfig' }, 'orangepi-3-lts': { 'dtb': 'sun50i-h6-orangepi-3-lts.dtb', 'config': 'orangepi_3_lts_defconfig', 'crust_config': 'pine_h64_defconfig' }, 'orangepi-lite2': { 'dtb': 'sun50i-h6-orangepi-lite2.dtb', 'config': 'orangepi_lite2_defconfig', 'crust_config': 'orangepi_3_defconfig' }, 'orangepi-one-plus': { 'dtb': 'sun50i-h6-orangepi-one-plus.dtb', 'config': 'orangepi_one_plus_defconfig', 'crust_config': 'orangepi_3_defconfig' }, 'pine-h64': { 'dtb': 'sun50i-h6-pine-h64.dtb', 'config': 'pine_h64_defconfig', 'crust_config': 'pine_h64_defconfig', }, 'pine-h64-model-b': { 'dtb': 'sun50i-h6-pine-h64-model-b.dtb', 'config': 'pine_h64_defconfig', 'crust_config': 'pine_h64_defconfig' }, 'tanix-tx6' : { 'dtb' : 'sun50i-h6-tanix-tx6.dtb', 'config' : 'tanix_tx6_defconfig', 'crust_config' : 'tanix_tx6_defconfig' }, }, 'R40' : { 'bananapi-m2u' : { 'dtb' : 'sun8i-r40-bananapi-m2-ultra.dtb', 'config' : 'Bananapi_M2_Ultra_defconfig' }, }, }, 'Amlogic': { 'AMLGX': { 'box': { 'dtb': '', 'config': 'p212_defconfig' }, 'bananapi-cm4io': { 'dtb': 'meson-g12b-bananapi-cm4-cm4io.dtb', 'config': 'bananapi-cm4io_defconfig' }, 'bananapi-m2s': { 'dtb': 'meson-g12b-a311d-bananapi-m2s.dtb', 'config': 'bananapi-m2s_defconfig' }, 'bananapi-m2-pro': { 'dtb': 'meson-sm1-bananapi-m2-pro.dtb', 'config': 'bananapi-m2-pro_defconfig' }, 'bananapi-m5': { 'dtb': 'meson-sm1-bananapi-m5.dtb', 'config': 'bananapi-m5_defconfig' }, 'khadas-vim': { 'dtb': 'meson-gxl-s905x-khadas-vim.dtb', 'config': 'khadas-vim_defconfig' }, 'khadas-vim2': { 'dtb': 'meson-gxm-khadas-vim2.dtb', 'config': 'khadas-vim2_defconfig' }, 'khadas-vim3': { 'dtb': 'meson-g12b-a311d-khadas-vim3.dtb', 'config': 'khadas-vim3_defconfig' }, 'khadas-vim3l': { 'dtb': 'meson-sm1-khadas-vim3l.dtb', 'config': 'khadas-vim3l_defconfig' }, 'lafrite': { 'dtb': 'meson-gxl-s805x-libretech-ac.dtb', 'config': 'libretech-ac_defconfig' }, 'lepotato': { 'dtb': 'meson-gxl-s905x-libretech-cc.dtb', 'config': 'libretech-cc_defconfig' }, 'nanopi-k2': { 'dtb': 'meson-gxbb-nanopi-k2.dtb', 'config': 'nanopi-k2_defconfig' }, 'odroid-c2': { 'dtb': 'meson-gxbb-odroidc2.dtb', 'config': 'odroid-c2_defconfig' }, 'odroid-c4': { 'dtb': 'meson-sm1-odroid-c4.dtb', 'config': 'odroid-c4_defconfig' }, 'odroid-hc4': { 'dtb': 'meson-sm1-odroid-hc4.dtb', 'config': 'odroid-hc4_defconfig' }, 'odroid-n2': { 'dtb': 'meson-g12b-odroid-n2.dtb', 'config': 'odroid-n2_defconfig' }, 'radxa-zero': { 'dtb': 'meson-g12a-radxa-zero.dtb', 'config': 'radxa-zero_defconfig' }, 'radxa-zero2': { 'dtb': 'meson-g12b-radxa-zero2.dtb', 'config': 'radxa-zero2_defconfig' }, 'wetek-core2': { 'dtb': 'meson-gxm-wetek-core2.dtb', 'config': 'wetek-core2_defconfig' }, 'wetek-hub': { 'dtb': 'meson-gxbb-wetek-hub.dtb', 'config': 'wetek-hub_defconfig' }, 'wetek-play2': { 'dtb': 'meson-gxbb-wetek-play2.dtb', 'config': 'wetek-play2_defconfig' }, }, }, 'NXP': { 'iMX6': { 'cubox': { 'dtb': '', 'config': 'mx6cuboxi_defconfig' }, 'udoo': { 'dtb': '', 'config': 'udoo_defconfig' }, 'wandboard': { 'dtb': '', 'config': 'wandboard_defconfig' }, }, 'iMX8' : { 'mq-evk' : { 'dtb' : 'imx8mq-evk.dtb', 'config' : 'imx8mq_evk_defconfig' }, 'pico-mq' : { 'dtb' : 'imx8mq-pico-pi.dtb', 'config' : 'pico-imx8mq_defconfig' }, }, }, 'Qualcomm': { 'Dragonboard': { '410c': { 'dtb': 'apq8016-sbc.dtb', 'config': 'dragonboard410c_defconfig' }, }, }, 'Rockchip': { 'GameForce' : { 'chi' : { 'dtb' : 'rk3326-gameforce-linux.dtb', 'config' : 'odroidgoa_defconfig' }, }, 'OdroidGoAdvance' : { 'odroidgo2_v11' : { 'dtb' : 'rk3326-odroidgo2-linux-v11.dtb', 'config' : 'odroidgoa_defconfig' }, 'odroidgo2' : { 'dtb' : 'rk3326-odroidgo2-linux.dtb', 'config' : 'odroidgoa_defconfig' }, }, 'RK356x': { 'rk356x': { 'dtb': 'rk3568-firefly-roc-pc.dtb', 'config' : 'firefly-rk3568_defconfig' }, }, 'OdroidM1': { 'OdroidM1': { 'dtb': 'rk3568-odroid-m1.dtb', 'config' : 'odroid_rk3568_defconfig' }, }, 'RK3288': { 'miqi': { 'dtb': 'rk3288-miqi.dtb', 'config': 'miqi-rk3288_defconfig' }, 'tinker': { 'dtb': 'rk3288-tinker-s.dtb', 'config': 'tinker-s-rk3288_defconfig' }, }, 'RK3328': { 'a1': { 'dtb': 'rk3328-a1.dtb', 'config': 'evb-rk3328_defconfig', 'rockchip_legacy_boot': '1' }, 'roc-cc': { 'dtb': 'rk3328-roc-cc.dtb', 'config': 'roc-cc-rk3328_defconfig' }, 'rock64': { 'dtb': 'rk3328-rock64.dtb', 'config': 'rock64-rk3328_defconfig' }, }, 'RK3399': { 'hugsun-x99': { 'dtb': 'rk3399-hugsun-x99.dtb', 'config': 'evb-rk3399_defconfig', 'rockchip_legacy_boot': '1' }, 'khadas-edge': { 'dtb': 'rk3399-khadas-edge.dtb', 'config': 'khadas-edge-rk3399_defconfig' }, 'nanopc-t4': { 'dtb': 'rk3399-nanopc-t4.dtb', 'config': 'nanopc-t4-rk3399_defconfig' }, 'nanopi-m4': { 'dtb': 'rk3399-nanopi-m4.dtb', 'config': 'nanopi-m4-rk3399_defconfig' }, 'orangepi': { 'dtb': 'rk3399-orangepi.dtb', 'config': 'orangepi-rk3399_defconfig' }, 'rock960': { 'dtb': 'rk3399-rock960.dtb', 'config': 'rock960-rk3399_defconfig' }, 'rock-pi-4': { 'dtb': 'rk3399-rock-pi-4b.dtb', 'config': 'rock-pi-4-rk3399_defconfig' }, 'rock-pi-4-plus': { 'dtb': 'rk3399-rock-pi-4b-plus.dtb', 'config': 'rock-pi-4-rk3399_defconfig' }, 'rock-pi-n10': { 'dtb': 'rk3399pro-rock-pi-n10.dtb', 'config': 'rock-pi-n10-rk3399pro_defconfig' }, 'rockpro64': { 'dtb': 'rk3399-rockpro64.dtb', 'config': 'rockpro64-rk3399_defconfig' }, 'roc-pc': { 'dtb': 'rk3399-roc-pc-mezzanine.dtb', 'config': 'roc-pc-mezzanine-rk3399_defconfig' }, 'roc-pc-plus': { 'dtb': 'rk3399-roc-pc-plus.dtb', 'config': 'roc-pc-rk3399_defconfig' }, 'sapphire': { 'dtb': 'rk3399-sapphire.dtb', 'config': 'evb-rk3399_defconfig', 'rockchip_legacy_boot': '1' }, }, }, 'Samsung': { 'Exynos': { 'odroid-xu3': { 'dtb': 'exynos5422-odroidxu3.dtb', 'config': 'odroid-xu3_defconfig' }, 'odroid-xu4': { 'dtb': 'exynos5422-odroidxu4.dtb', 'config': 'odroid-xu4_defconfig' }, }, }, 'Amlogic-ce': { 'Amlogic-ng': { }, 'Amlogic-ng-dv': { }, 'Amlogic-no': { }, 'Amlogic-ne': { }, }, } class OptionsAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): message = None if self.dest == 'project': if values is None: print(' '.join(project for project in sorted(devices))) parser.exit() if values not in devices.keys(): message = "invalid choice: {0!r} (choose from {1})".format(values, ', '.join([repr(project) for project in devices])) if self.dest == 'soc': project = getattr(namespace, 'project') if values is None: print(' '.join(soc for soc in sorted(devices[project]))) parser.exit() if values not in devices[project].keys(): message = "invalid choice: {0!r} (choose from {1})".format(values, ', '.join([repr(soc) for soc in devices[project]])) if self.dest == 'board': project = getattr(namespace, 'project') soc = getattr(namespace, 'soc') if values is None: print(' '.join(board for board in sorted(devices[project][soc]))) parser.exit() if values not in devices[project][soc].keys(): message = "invalid choice: {0!r} (choose from {1})".format(values, ', '.join([repr(board) for board in devices[project][soc]])) if self.dest == 'value': project = getattr(namespace, 'project') soc = getattr(namespace, 'soc') board = getattr(namespace, 'board') if values is None: print(' '.join(value for value in sorted(devices[project][soc][board].keys()))) parser.exit() if values not in devices[project][soc][board].keys(): parser.exit() if message is not None: raise argparse.ArgumentError(self, message) setattr(namespace, self.dest, values) parser = argparse.ArgumentParser(description='Script to help with u-boot configuration') parser.add_argument('project', nargs='?', action=OptionsAction) parser.add_argument('soc', nargs='?', action=OptionsAction) parser.add_argument('board', nargs='?', action=OptionsAction) parser.add_argument('value', nargs='?', action=OptionsAction) options = parser.parse_args() if options.project != 'Amlogic-ce': print(devices[options.project][options.soc][options.board][options.value]) parser.exit() ================================================ FILE: scripts/unpack ================================================ #!/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 "${1}" if [ -z "${1}" ]; then die "usage: ${0} package_name [parent_pkg]" fi if [ -z "${PKG_NAME}" ]; then die "$(print_color CLR_ERROR "${1}: no package.mk file found")" fi PARENT_PKG="${2:-${PKG_NAME}}" pkg_lock "${PKG_NAME}" "unpack" "${PARENT_PKG}" ${SCRIPTS}/get "${PKG_NAME}" if [ -n "${PKG_DEPENDS_UNPACK}" ]; then export _unpack_recursive_cnt=$((_unpack_recursive_cnt+1)) if [ ${_unpack_recursive_cnt} -gt 2 ]; then die "unpack recursive limit hit: ${PKG_DEPENDS_UNPACK}, ${PARENT_PKG}" fi for p in ${PKG_DEPENDS_UNPACK}; do ${SCRIPTS}/unpack "${p}" "${PARENT_PKG}" done unset _unpack_recursive_cnt fi STAMP="${PKG_BUILD}/.libreelec-unpack" mkdir -p ${BUILD}/build # Perform a wildcard match on the package to ensure old versions are cleaned too PKG_DEEPHASH= for i in ${BUILD}/build/${PKG_NAME}-*; do if [ -d ${i} -a -f "${i}/.libreelec-unpack" ] ; then . "${i}/.libreelec-unpack" if [ "${STAMP_PKG_NAME}" = "${PKG_NAME}" ]; then [ -z "${PKG_DEEPHASH}" ] && PKG_DEEPHASH=$(calculate_stamp) if [ ! "${PKG_DEEPHASH}" = "${STAMP_PKG_DEEPHASH}" ] ; then ${SCRIPTS}/clean "${PKG_NAME}" fi fi fi done if [ -d "${PKG_BUILD}" -a ! -f "${STAMP}" ]; then # stale pkg build dir ${SCRIPTS}/clean "${PKG_NAME}" fi if [ -f "${STAMP}" ]; then pkg_lock_status "UNLOCK" "${PKG_NAME}" "unpack" "already unpacked" exit 0 fi pkg_lock_status "ACTIVE" "${PKG_NAME}" "unpack" if [ -d "${SOURCES}/${PKG_NAME}" -o -d "${PKG_DIR}/sources" ] || pkg_call_exists_opt unpack; then pkg_call_finish build_msg "CLR_UNPACK" "UNPACK" "${PKG_NAME}" "indent" # unpack into a unique location as unpacking into a single ${BUILD} directory is not thread-safe PKG_UNPACK_DIR="${BUILD}/.unpack/${PKG_NAME}" rm -rf "${PKG_UNPACK_DIR}" mkdir -p "${PKG_UNPACK_DIR}" # Save PKG_BUILD and point at our private unpack directory so that any # modifications to the content of ${PKG_BUILD} will be "safe". PKG_BUILD_ORIG="${PKG_BUILD}" PKG_BUILD="${PKG_UNPACK_DIR}/${PKG_NAME}-${PKG_VERSION}" pkg_call_exists_opt pre_unpack && pkg_call if pkg_call_exists unpack; then pkg_call else if [ -n "${PKG_URL}" ]; then ${SCRIPTS}/extract "${PKG_NAME}" "${PKG_UNPACK_DIR}" fi pkg_call_finish fi if [ -z "${PKG_SOURCE_DIR}" -a -d "${PKG_UNPACK_DIR}/${PKG_NAME}-${PKG_VERSION}"* ]; then mv "${PKG_UNPACK_DIR}/${PKG_NAME}-${PKG_VERSION}"* "${PKG_UNPACK_DIR}/.intermediate" fi if [ ! -d "${PKG_UNPACK_DIR}/.intermediate" ]; then if [ -n "${PKG_SOURCE_DIR}" ]; then if [ -d "${PKG_UNPACK_DIR}"/${PKG_SOURCE_DIR} ]; then mv "${PKG_UNPACK_DIR}"/${PKG_SOURCE_DIR} "${PKG_UNPACK_DIR}/.intermediate" else # fallback mv "${BUILD}"/${PKG_SOURCE_DIR} "${PKG_UNPACK_DIR}/.intermediate" fi fi fi [ ! -d "${PKG_UNPACK_DIR}/.intermediate" ] && mkdir -p "${PKG_UNPACK_DIR}/.intermediate" if [ -d "${PKG_DIR}/sources" ]; then cp -PRf "${PKG_DIR}/sources/"* "${PKG_UNPACK_DIR}/.intermediate" fi # Add a tag to the unpacked folder before transferring into the shared build folder echo "INFO_PKG_NAME=\"${PKG_NAME}\"" > "${PKG_UNPACK_DIR}/.intermediate/.libreelec-package" # Restore original PKG_BUILD, and transfer the unpacked folder PKG_BUILD="${PKG_BUILD_ORIG}" rm -fr "${PKG_BUILD}" mv "${PKG_UNPACK_DIR}/.intermediate" "${PKG_BUILD}" # cleanup rm -rf "${PKG_UNPACK_DIR}" pkg_call_exists_opt post_unpack && pkg_call if [ "${PKG_SKIP_PATCHES}" != "yes" ]; then pkg_call_exists_opt pre_patch && pkg_call if [ "${TARGET_ARCH}" = "x86_64" ]; then PATCH_ARCH="x86" elif [ "${PKG_IS_KERNEL_PKG}" = "yes" ]; then PATCH_ARCH="${TARGET_KERNEL_PATCH_ARCH:-${TARGET_ARCH}}" else PATCH_ARCH="${TARGET_PATCH_ARCH:-${TARGET_ARCH}}" fi PATCH_DIRS_PKG="" PATCH_DIRS_PRJ="" if [ -n "${PKG_PATCH_DIRS}" ]; then for patch_dir in ${PKG_PATCH_DIRS}; do if [[ ${patch_dir} =~ ^/ ]]; then [ -f ${patch_dir} ] && PATCH_DIRS_PKG+=" ${patch_dir}" [ -d ${patch_dir} ] && PATCH_DIRS_PKG+=" ${patch_dir}/*.patch" else [ -d ${PKG_DIR}/patches/${patch_dir} ] && PATCH_DIRS_PKG+=" ${PKG_DIR}/patches/${patch_dir}/*.patch" [ -d ${PROJECT_DIR}/${PROJECT}/patches/${PKG_NAME}/${patch_dir} ] && PATCH_DIRS_PRJ+=" ${PROJECT_DIR}/${PROJECT}/patches/${PKG_NAME}/${patch_dir}/*.patch" [ -d ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/patches/${PKG_NAME}/${patch_dir} ] && PATCH_DIRS_PRJ+=" ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/patches/${PKG_NAME}/${patch_dir}/*.patch" fi done fi for i in ${PKG_DIR}/patches/*.patch \ ${PKG_DIR}/patches/${PATCH_ARCH}/*.patch \ ${PATCH_DIRS_PKG} \ ${PKG_DIR}/patches/${PKG_VERSION}/*.patch \ ${PKG_DIR}/patches/${PKG_VERSION}/${PATCH_ARCH}/*.patch \ ${PROJECT_DIR}/${PROJECT}/patches/${PKG_NAME}/*.patch \ ${PROJECT_DIR}/${PROJECT}/patches/${PKG_NAME}/${PATCH_ARCH}/*.patch \ ${PATCH_DIRS_PRJ} \ ${PROJECT_DIR}/${PROJECT}/patches/${PKG_NAME}/${PKG_VERSION}/*.patch \ ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/patches/${PKG_NAME}/*.patch; do thisdir="${i%/*}" if [ "${thisdir}" = "${PKG_DIR}/patches" ]; then PATCH_DESC="(common)" elif [ "${thisdir}" = "${PKG_DIR}/patches/${PATCH_ARCH}" ]; then PATCH_DESC="(common - ${PATCH_ARCH})" elif [ "${thisdir}" = "${PKG_DIR}/patches/${PKG_VERSION}" ]; then PATCH_DESC="(common - ${PKG_VERSION})" elif [ "${thisdir}" = "${PKG_DIR}/patches/${PKG_VERSION}/${PATCH_ARCH}" ]; then PATCH_DESC="(${PKG_VERSION} - ${PATCH_ARCH})" elif [ "${thisdir}" = "${PROJECT_DIR}/${PROJECT}/patches/${PKG_NAME}" ]; then PATCH_DESC="(project)" elif [ "${thisdir}" = "${PROJECT_DIR}/${PROJECT}/patches/${PKG_NAME}/${PATCH_ARCH}" ]; then PATCH_DESC="(project - ${PATCH_ARCH})" elif [ "${thisdir}" = "${PROJECT_DIR}/${PROJECT}/patches/${PKG_NAME}/${PKG_VERSION}" ]; then PATCH_DESC="(project - ${PKG_VERSION})" elif [ "${thisdir}" = "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/patches/${PKG_NAME}" ]; then PATCH_DESC="(device)" else if [[ "${thisdir}" =~ ^${PKG_DIR}/.* ]]; then PATCH_DESC="(common - ${thisdir##*/})" elif [[ "${thisdir}" =~ ^${PROJECT_DIR}/.*/devices/.* ]]; then PATCH_DESC="(device - ${thisdir##*/})" elif [[ "${thisdir}" =~ ^${PROJECT_DIR}/.* ]]; then PATCH_DESC="(project - ${thisdir##*/})" else PATCH_DESC="(absolute - ${i})" fi fi if [ -f "${i}" ]; then build_msg "CLR_APPLY_PATCH" "APPLY PATCH $(print_color "CLR_PATCH_DESC" "${PATCH_DESC}")" "${i#${ROOT}/}" if grep -qE '^GIT binary patch$|^rename from|^rename to' ${i}; then git apply --directory="${PKG_BUILD}" -p1 --verbose --whitespace=nowarn --unsafe-paths < ${i} >&${VERBOSE_OUT} else patch -d "${PKG_BUILD}" -p1 < ${i} >&${VERBOSE_OUT} fi fi done pkg_call_exists_opt post_patch && pkg_call fi if [ "${PKG_NAME}" != "configtools" ] ; then for config in $(find "${PKG_BUILD}" -name config.guess | sed 's/config.guess//'); do build_msg "CLR_FIXCONFIG" "FIXCONFIG" "${config}" [ -f "${config}/config.guess" -a -f ${TOOLCHAIN}/configtools/config.guess ] && \ cp -f ${TOOLCHAIN}/configtools/config.guess ${config} [ -f "${config}/config.sub" -a -f ${TOOLCHAIN}/configtools/config.sub ] && \ cp -f ${TOOLCHAIN}/configtools/config.sub ${config} done fi fi pkg_call_finish if [ "${PKG_SECTION}" != "virtual" ]; then mkdir -p "${PKG_BUILD}" echo "INFO_PKG_NAME=\"${PKG_NAME}\"" > "${PKG_BUILD}/.libreelec-package" PKG_DEEPHASH=$(calculate_stamp) for i in PKG_NAME PKG_DEEPHASH; do echo "STAMP_${i}=\"${!i}\"" >> ${STAMP} done fi pkg_lock_status "UNLOCK" "${PKG_NAME}" "unpack" "unpacked" ================================================ FILE: tools/RPi/gen-rpi-kodi-patch.sh ================================================ #!/bin/bash set -e BIN=$(readlink -f $(dirname $0)) if git rev-parse --is-inside-work-tree &>/dev/null; then echo "Don't run this script inside a git reppository!" exit 1 fi DEPTH=1000 usage() { local me="$(basename $0)" echo "Usage: ${me} <popcornmix-branch> <sha>|<xbmc branch>" echo echo "Example: ${me} jarvis_rbp_backports d11fabefb909e75e7186bd9ecd0cbff9e8b24577" echo "Example: ${me} jarvis_rbp_backports Jarvis" echo "Example: ${me} newclock5 master" echo echo "For sha, see https://github.com/xbmc/xbmc/compare/Jarvis...popcornmix:jarvis_rbp_backports (replace branches as appropriate)" exit 1 } if [ -z "${1}" ]; then echo "ERROR: popcornmix branch must be specified!" echo usage fi if [ -z "${2}" ]; then echo "ERROR: First popcornmix revision (sha) or name of xbmc branch must be specified!" echo usage fi BRANCH="$1" BASEREV="$2" rm -fr raspberrypi-kodi # If we have a persisted version of the repo, quickly copy it if [ -d raspberrypi-kodi.stash ]; then echo "Copying raspberrypi-kodi.stash raspberrypi-kodi..." cp -r raspberrypi-kodi.stash raspberrypi-kodi cd raspberrypi-kodi git checkout ${BRANCH} else git clone -b ${BRANCH} --depth=${DEPTH} --single-branch https://github.com/popcornmix/xbmc.git raspberrypi-kodi cd raspberrypi-kodi fi if [[ ${BASEREV} =~ [0-9a-f]{40} ]]; then BASEREV="${BASEREV}~1" else git remote add -t ${BASEREV} xbmc https://github.com/xbmc/xbmc.git BASEREV="xbmc/${BASEREV}" fi # Apply the following config change to reduce chance of duplicate hashes git config --local core.abbrev 40 git fetch --all --depth=${DEPTH} git reset --hard origin/${BRANCH} TOPREV="$(git log --oneline --grep "UNSTABLE: This is a placeholder. Commits after this point are considered experimental." | awk '{print $1}')" if [ -n "${TOPREV}" ]; then echo "Found UNSTABLE placeholder with rev ${TOPREV}, making this the new HEAD" git reset --hard ${TOPREV} else echo "WARNING: UNSTABLE placeholder not found, assuming it is not present in branch ${BRANCH}" fi if [ -d addons/skin.confluence ]; then SKIN1=skin.confluence SKIN2=kodi-theme-Confluence else SKIN1=skin.estuary SKIN2=kodi-theme-Estuary fi GIT_SEQUENCE_EDITOR=${BIN}/rpi-kodi-rebase.sh git rebase -i ${BASEREV} git format-patch --no-signature --stdout ${BASEREV} >/tmp/kodi.patch cd .. && rm -fr raspberrypi-kodi echo echo "New kodi patch: /tmp/kodi.patch" echo echo "## LibreELEC Update Notes ##" echo echo "cd LibreELEC.tv" echo "git checkout master" echo "git pull upstream master" echo "git checkout -b somebranch" BRANCH="${BRANCH//_/-}" echo if [ -s /tmp/kodi.patch ]; then echo "cp /tmp/kodi.patch projects/RPi/patches/kodi/kodi-001-backport.patch" echo "git commit -am \"RPi: Update kodi support patch\"" else echo "NO KODI PATCH REQUIRED" fi echo ================================================ FILE: tools/RPi/rpi-kodi-rebase.sh ================================================ #!/bin/bash TODO=$1 # Drop commits not used DROP_COMMITS=" UNSTABLE\: This is a placeholder\. Commits after this point are considered experimental\. " IFS=$'\n' for COMMIT in $DROP_COMMITS; do sed -i -E "s/^pick ([0-9a-f]+) (${COMMIT}.*)/drop \1 \2/g" $TODO done grep -E "^drop " $TODO > /tmp/dropped sed -i -E "/^drop /d" $TODO ================================================ FILE: tools/adjust_kernel_config ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) if [ -z "${1}" -o "${1}" == "help" -o "${1}" == "--help" -o "${1}" == "h" -o "${1}" == "-h" ]; then echo -e "A kernel config command must be specified:\n" echo -e "${0} menuconfig" echo -e "" echo -e "To see all available config commands use:\n" echo -e "${0} commands" exit fi KERNEL_CONFIG_COMMAND="$1" . config/options linux ${SCRIPTS}/unpack linux AVAILABLE_KERNEL_CONFIG_COMMANDS="$(kernel_make -C ${PKG_BUILD} help | sed -n '/Configuration targets:/,/Other generic targets:/p' | sed -n -E 's/^ ([a-z0-9]+)[ -]*.*/\1/p')" print_config_commands() { echo -e "Available kernel config commands are:\n\n${AVAILABLE_KERNEL_CONFIG_COMMANDS}" } if [ "${1}" == "commands" ]; then print_config_commands exit fi if [ -z "$(echo ${AVAILABLE_KERNEL_CONFIG_COMMANDS} | grep ${KERNEL_CONFIG_COMMAND})" ]; then echo -e "\"${KERNEL_CONFIG_COMMAND}\" is not an available kernel config command\n" print_config_commands exit fi tools/check_kernel_config kernel_make KCONFIG_CONFIG=${PKG_KERNEL_CFG_FILE} -C ${PKG_BUILD} ${KERNEL_CONFIG_COMMAND} ================================================ FILE: tools/change_addon_version ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) # path to the version file DISTRIBUTION_PATH="distributions/LibreELEC/version" # prevents executing from wrong folder [ -f ${DISTRIBUTION_PATH} ] || { echo "${DISTRIBUTION_PATH}: No such file or directory" && exit; } # current addon-version DISTRO_ADDON_VERSION=$(grep -oP '(?<=ADDON_VERSION=\").*(?=\")' ${DISTRIBUTION_PATH}) # increase addon-version x.y.z to x.y.(z+1) BUMP_ADDON_VERSION="${DISTRO_ADDON_VERSION%.*}.$((${DISTRO_ADDON_VERSION##*.} + 1))" # update ADDON-VERSION update_addon_version() { sed -e "s|ADDON_VERSION=.*|ADDON_VERSION=\"${BUMP_ADDON_VERSION}\"|" -i "${DISTRIBUTION_PATH}" echo "git commit \"distro: bump ADDON_VERSION to ${BUMP_ADDON_VERSION}\"" git commit -qs -m "distro: bump ADDON_VERSION to ${BUMP_ADDON_VERSION}" "${DISTRIBUTION_PATH}" } update_package() { # update package.mk for package_mk in $(find packages/addons -type f -name "package.mk" -not -path "packages/addons/addon-depends/*"); do sed -e "s|PKG_REV=.*|PKG_REV=\"0\"|" -i "${package_mk}" done # update changelog.txt for changelog_txt in $(find packages/addons -type f -name "changelog.txt" -not -path "packages/addons/addon-depends/*"); do echo -e "initial release" >"${changelog_txt}" done # commit changes # avoid errors at commit by checking if changes are available git diff --quiet HEAD $REF -- packages/addons || { echo "git commit \"addons: reset version\"" && git commit -qs -m "addons: reset version" "packages/addons"; } } # check if whiptail is installed and directly execute script when argument is supplied if [ -z "$1" ]; then if ! command -v whiptail >/dev/null 2>&1; then echo "whiptail not installed, use the command line instead" echo "Usage: $0 1.2.3" exit fi else BUMP_ADDON_VERSION="$1" update_addon_version update_package exit fi OPTION=$(whiptail --title "Update ADDON-VERSION" --menu "" 12 60 4 \ "1" "Update to ${BUMP_ADDON_VERSION}" \ "2" "Update to custom version" \ "3" "Exit" 3>&1 1>&2 2>&3) case $OPTION in "1") update_addon_version update_package ;; "2") BUMP_ADDON_VERSION=$(whiptail --inputbox "Enter ADDON-VERSION:" 10 25 ${DISTRO_ADDON_VERSION} 3>&1 1>&2 2>&3) EXITSTATUS=$? if [ $EXITSTATUS = 0 ]; then update_addon_version update_package else exit fi ;; "3") exit ;; esac ================================================ FILE: tools/check_kernel_config ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) . config/options linux ${SCRIPTS}/unpack linux if [ -f "${DISTRO_DIR}/${DISTRO}/kernel_options" ]; then while read OPTION; do [ -z "$OPTION" -o -n "$(echo "$OPTION" | grep '^#')" ] && continue if [ "${OPTION##*=}" == "m" ]; then echo "[m] ${OPTION%%=*}" $PKG_BUILD/scripts/config --file $PKG_KERNEL_CFG_FILE --module ${OPTION%%=*} fi if [ "${OPTION##*=}" == "y" ]; then echo "[y] ${OPTION%%=*}" $PKG_BUILD/scripts/config --file $PKG_KERNEL_CFG_FILE --enable ${OPTION%%=*} fi if [ "${OPTION##*=}" == "n" ]; then echo "[n] ${OPTION%%=*}" $PKG_BUILD/scripts/config --file $PKG_KERNEL_CFG_FILE --disable ${OPTION%%=*} fi # must be a string if it contains double quotes if [ -n "$(echo ${OPTION##*=} | grep '"')" ]; then echo "[${OPTION##*=}] ${OPTION%%=*}" $PKG_BUILD/scripts/config --file $PKG_KERNEL_CFG_FILE --set-str ${OPTION%%=*} $(echo ${OPTION##*=} | tr -d '"') fi done < ${DISTRO_DIR}/${DISTRO}/kernel_options else echo "kernel options file doesn't exist: ${DISTRO_DIR}/${DISTRO}/kernel_options" fi ================================================ FILE: tools/checkunpack ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) . ./config/options "" MD5SUM="$(echo ${BUILD} | md5sum | awk '{ print $1 }')" RESTART_FILE=/tmp/checkunpack.progress.${MD5SUM} usage() { cat <<EOF Usage: $0 [-f "regex"] [-c] [-v] [-S] [-h] -f regex Filter based on regex, eg. -f "RTL.*|^kodi-" would match all Realtek drivers and any package beginning with kodi-. Using a filter ignores any existing progress file. -c Remove restartable progress file at beginning of this run -v Verbose output, view failed output from scripts/unpack -S Display skipped/ignored packages -h This help message By default previously processed packages that unpacked successfully will be skipped, unless their stamp has been subsequently modified. Use -c to ignore any previous progress, and (re-)process every package again. Current progress file: ${RESTART_FILE} EOF exit } FILTER="." RMPROGRESS="no" VERBOSE="no" SHOW_SKIPPED="no" USING_FILTER="no" while getopts "f:cvSh" opt; do case ${opt} in f) FILTER="${OPTARG}"; USING_FILTER="yes";; c) RMPROGRESS="yes";; v) VERBOSE="yes";; S) SHOW_SKIPPED="yes";; h) usage;; *) usage;; esac done TMP_FILE=$(mktemp) trap "rm -f ${TMP_FILE}" EXIT [ "${RMPROGRESS}" = "yes" ] && rm -f "${RESTART_FILE}" TXRED="$(tput setaf 1 bold)" TXGREEN="$(tput setaf 2 bold)" TXRESET="$(tput sgr0)" SKIPPED="$(cut -d' ' -f1 ${RESTART_FILE} 2>/dev/null | sort -u | wc -l || true)" [ "${USING_FILTER}" = "no" -a "${SKIPPED:-0}" -ne 0 ] && echo -e "WARNING: skipping ${SKIPPED} packages.\n" >&2 for pkg_name in $(get_all_package_names | grep -E "${FILTER}"); do stamp=$(source_package ${pkg_name}; calculate_stamp) if [ -z "${stamp}" ]; then [ "${SHOW_SKIPPED}" = "yes" ] && printf "Checking: %-40s IGNORED\n" "${pkg_name}" continue fi if [ "${USING_FILTER}" = "no" ] && grep -qE "^${pkg_name} ${stamp}$" ${RESTART_FILE} 2>/dev/null; then [ "${SHOW_SKIPPED}" = "yes" ] && printf "Checking: %-40s SKIPPED\n" "${pkg_name}" continue fi printf "Checking: %-40s" "${pkg_name}" rm -rf "${BUILD}/"* ${BUILD}/.unpack OUTPUT="$(scripts/unpack "${pkg_name}" 2>&1)" && res=0 || res=1 if [ ${res} -eq 0 ]; then echo " ${TXGREEN}OK${TXRESET}" [ "${USING_FILTER}" = "no" ] && echo "${pkg_name} ${stamp}" >>${RESTART_FILE} else echo " ${TXRED}FAILED${TXRESET}" echo "${pkg_name}" >>${TMP_FILE} [ "${VERBOSE}" = "yes" -a -n "${OUTPUT}" ] && echo "${OUTPUT}" fi rm -rf "${BUILD}/"* ${BUILD}/.unpack done if [ -s "${TMP_FILE}" ]; then echo echo "The following packages failed to unpack:" cat ${TMP_FILE} exit 1 fi ================================================ FILE: tools/dashboard ================================================ #!/bin/bash -e # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) export NOONEXIT=yes cd "$(readlink -f "$(dirname "$0")")/.." export _CACHE_PACKAGE_LOCAL_DEVICE=none _CACHE_PACKAGE_LOCAL=none _CACHE_PACKAGE_GLOBAL=none _DEBUG_DEPENDS_LIST=none DEFAULT_PYTHON_VERSION=none if [ -n "${PROJECT}" -a "$1" != "auto" ]; then # loads project config and sets THREAD_CONTROL . config/options "" else BUILD_PREFIX=$(. config/options "" && echo ${BUILD_ROOT}/${BUILD_BASE}) fi _find_latest_tcdir() { local IFS=$'\n' if [ -n "${THREAD_CONTROL}" ]; then echo "${THREAD_CONTROL}" else for dir in $(ls -1td ${BUILD_PREFIX}.*/.threads 2>/dev/null); do [ -f "${dir}/parallel.pid" ] && echo "${dir}" && break done fi return 0 } while [ : ]; do echo "Waiting for build to start..." while [ : ]; do tcdir="$(_find_latest_tcdir)" if [ -n "${tcdir}" ]; then pid="$(cat "${tcdir}/parallel.pid" 2>/dev/null || true)" [ -n "${pid}" ] && ps -p ${pid} &>/dev/null && break fi sleep 1.0 done if [ "${THREADCOUNT}" = "0" ]; then tail -Fn+0 --pid=${pid} "${tcdir}/status" 2>/dev/null | grep -vE "STALLED|IDLE" else tail -Fn+0 --pid=${pid} "${tcdir}/status" 2>/dev/null fi echo done ================================================ FILE: tools/distro-tool ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) set -e export NOONEXIT=yes [ -z "${DEBUG_LOG}" ] && DEBUG_LOG=/tmp/distro-tool.log LIBREELEC_DIR=$HOME/LibreELEC.tv TARGET_DIR=$HOME/sources DOWNLOAD_DIR=$HOME/download REVISION= PACKAGE= DRY_RUN=no IGNORE_ERRORS=no DOGIT=no CHECK_NEWER=yes CHECK_FILTER_TYPE=All CHECK_FILTER_CLASS=All PROGRESS=yes IS_MIRROR=yes VERBOSE=0 PATH_FILTER= VERIFY_CHECKSUM=no WORKER_THREADS=16 LOCKFILE=/tmp/distro_tool.lock WORKFILES_I=/tmp/distro_tool.in WORKFILES_O=/tmp/distro_tool.out WORKER_MAX=${WORKER_MAX:-$(grep "^processor[[:space:]]*:" /proc/cpuinfo | wc -l)} # Source in GIT_USERNAME and GIT_PASSWORD to avoid API limitations [ -f ~/.git.conf ] && source ~/.git.conf PYTHON_PROG=' from __future__ import print_function import sys, os, json, codecs, re, threading, subprocess, glob, datetime, shutil, hashlib if sys.version_info >= (3, 0): import queue as Queue basestring = (str, bytes) else: import Queue class MyUtility(object): isPython3 = (sys.version_info >= (3, 0)) if sys.version_info >= (3, 1): sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) sys.stderr = codecs.getwriter("utf-8")(sys.stderr.detach()) else: sys.stdout = codecs.getwriter("utf-8")(sys.stdout) sys.stderr = codecs.getwriter("utf-8")(sys.stderr) search_major_minor_patch = re.compile("[0-9]+\.[0-9]+\.[0-9]+") extract_major_minor_patch = re.compile(".*([0-9]+\.[0-9]+\.[0-9]+).*") search_major_minor = re.compile("[0-9]+\.[0-9]+") extract_major_minor = re.compile(".*([0-9]+\.[0-9]+).*") leading_zeros = re.compile("^0[0-9]") search_HTTP_OK = re.compile("HTTP\/[1-9]\.[0-9] 200 OK", flags=re.IGNORECASE) search_HTTP_NOT_FOUND = re.compile("404 not found", flags=re.IGNORECASE) search_HTTP_NOT_ALLOWED = re.compile("405 method not allowed", flags=re.IGNORECASE) search_HTTP_CODE = re.compile("__HTTP_CODE__@([0-9]*)@") search_CONTENT_TYPE = re.compile("__CONTENT_TYPE__@(.*)@") colours = {} colours["red"] = "\x1b[31m" colours["green"] = "\x1b[32m" colours["yellow"] = "\x1b[33m" colours["blue"] = "\x1b[34m" colours["magenta"]= "\x1b[35m" colours["cyan"] = "\x1b[36m" colours["reset"] = "\x1b(B\x1b[m" @staticmethod def colour(colour, text): return "%s%s%s" % (MyUtility.colours[colour], text, MyUtility.colours["reset"]) @staticmethod def logmsg(msgs, level, text): msgs.append({"level": level, "text": text}) @staticmethod def show(msgs, level, colour, prefix, text): if colour: tc = MyUtility.colours[colour] tr = MyUtility.colours["reset"] else: tc = tr = "" MyUtility.logmsg(msgs, level, "%s%-21s%s: %s" % (tc, prefix, tr, text)) @staticmethod def runcommand(msgs, command, logfile=None, redacted=None): MyUtility.logmsg(msgs, 3, "Running command: [%s]" % (redacted if redacted else command)) _logfile = open(logfile, "w") if logfile else subprocess.STDOUT try: if MyUtility.isPython3: return (0, subprocess.check_output(command.split(" "), stderr=_logfile).decode("utf-8")) else: return (0, subprocess.check_output(command.split(" "), stderr=_logfile)) except subprocess.CalledProcessError as cpe: if MyUtility.isPython3: # Clean up undecodable garbage in response (eg. libftdi1 error page) output = bytearray() for c in cpe.output: if c <= 127: output.append(c) return (cpe.returncode, output.decode("utf-8")) else: return (cpe.returncode, cpe.output) finally: if logfile and _logfile: _logfile.close() @staticmethod def readfile(filename): inputfile = codecs.open(filename, "rb", encoding="utf-8") data = inputfile.read() inputfile.close() return data @staticmethod def get_alternate_versions(package_version): if not package_version: return if MyUtility.search_major_minor_patch.search(package_version): mmp = True ver = MyUtility.extract_major_minor_patch.search(package_version).group(1) elif MyUtility.search_major_minor.search(package_version): mmp = False ver = MyUtility.extract_major_minor.search(package_version).group(1) else: return # Split parts parts_p0 = ver.split(".") parts_p0_lz = ["", "", ""] parts_p1 = [0, 0, 0] parts_p1_lz = ["", "", ""] c = 0 for p in parts_p0: if c > 2: break parts_p1[c] = int(p) + 1 # Add leading zeros if originally present if MyUtility.leading_zeros.search(parts_p0[c]): parts_p0_lz[c] = "0" if parts_p0_lz[c] == "0" and parts_p1[c] < 10: parts_p1_lz[c] = "0" c += 1 if mmp: tmp1 = "%s%d.%s%d.%s%d" % (parts_p1_lz[0], parts_p1[0], parts_p0_lz[1], 0, parts_p0_lz[2], 0) yield package_version.replace(ver, tmp1) # If minor or patch >= 10, then we are not sure if leading zeros are # required, so try them anyway if int(parts_p0[1]) >= 10 or int(parts_p0[2]) >= 10: tmp2 = "%s%d.00.00" % (parts_p1_lz[0], parts_p1[0]) if tmp1 != tmp2: yield package_version.replace(ver, tmp2) tmp1 = "%s.%s%d.%s%d" % (parts_p0[0], parts_p1_lz[1], parts_p1[1], parts_p0_lz[2], 0) yield package_version.replace(ver, tmp1) if int(parts_p0[2]) >= 10: tmp2 = "%s.%s%d.00" % (parts_p0[0], parts_p1_lz[1], parts_p1[1]) if tmp1 != tmp2: yield package_version.replace(ver, tmp2) tmp1 = "%s.%s.%s%d" % (parts_p0[0], parts_p0[1], parts_p1_lz[2], parts_p1[2]) yield package_version.replace(ver, tmp1) else: tmp1 = "%s%d.%s%d" % (parts_p1_lz[0], parts_p1[0], parts_p0_lz[1], 0) yield package_version.replace(ver, tmp1) # If minor or patch >= 10, then we are not sure if leading zeros are # required, so try them anyway if int(parts_p0[1]) >= 10: tmp2 = "%s%d.00" % (parts_p1_lz[0], parts_p1[0]) if tmp1 != tmp2: yield package_version.replace(ver, tmp2) tmp1 = "%s.%s%d" % (parts_p0[0], parts_p1_lz[1], parts_p1[1]) yield package_version.replace(ver, tmp1) @staticmethod def get_latest_commit(msgs, package_url): urlfields = package_url.split("/") urlapi = "https://api.github.com/repos/%s/%s/commits" % (urlfields[3], urlfields[4]) tmpfile_data = "%s/%s" % (SCRATCH_DIR, threading.current_thread().name) curl_args = "curl --verbose --silent --fail --location --connect-timeout 15 --max-time 60 --retry 3 --write-out __HTTP_CODE__@%{http_code}@\\n__CONTENT_TYPE__@%{content_type}@" if GIT_USERNAME and GIT_PASSWORD: curl_args += " -u %s:%s" % (GIT_USERNAME, GIT_PASSWORD) if os.path.exists(tmpfile_data): os.remove(tmpfile_data) (result, headers) = MyUtility.runcommand(msgs, "%s --output %s --url %s" % (curl_args, tmpfile_data, urlapi), redacted=curl_args) search_obj = MyUtility.search_HTTP_CODE.search(headers) http_code = search_obj.group(1) if search_obj else "" search_obj = MyUtility.search_CONTENT_TYPE.search(headers) content_type = search_obj.group(1) if search_obj else "" MyUtility.logmsg(msgs, 3, "CURL exit code: %d, http_code: %s, content type: [%s]" % (result, http_code, content_type)) MyUtility.logmsg(msgs, 3, "[\n%s]" % headers) if os.path.exists(tmpfile_data): data = MyUtility.readfile(tmpfile_data) os.remove(tmpfile_data) MyUtility.logmsg(msgs, 3, "GITHUB RESPONSE (first 1024 bytes): [\n%s\n]" % data[0:1024]) if http_code == "200" and data and content_type.startswith("application/json"): jdata = json.loads(data) if "message" not in jdata: return jdata[0]["sha"] return "" @staticmethod def have_package(package_name, package_source): if IS_MIRROR: return os.path.exists("%s/%s/%s" % (TARGET_DIR, package_name, package_source)) or \ os.path.exists("%s/%s/%s" % (DOWNLOAD_DIR, package_name, package_source)) else: return os.path.exists("%s/%s" % (TARGET_DIR, package_source)) or \ os.path.exists("%s/%s" % (DOWNLOAD_DIR, package_source)) return False @staticmethod def remote_file_exists(msgs, url): retry = 5 maxattempts = retry * 3 headers = "" result = 0 HEAD_supported = True ts = datetime.datetime.now() curl_args = "curl --verbose --silent --fail --location --connect-timeout 15 --max-time 60 --retry 0 --write-out __HTTP_CODE__@%{http_code}@\\n__CONTENT_TYPE__@%{content_type}@" http_code = "" content_type = "" MyUtility.logmsg(msgs, 3, "Remote headers for %s..." % url) # Retry up to $retry times in case of transient errors. Do not count # 35/56 as retries, could have several of these before a successful # request - limit total number of retries as ${retry} * 3. while retry > 0 and maxattempts > 0: maxattempts -= 1 if stopped.is_set(): break ts_cmd = datetime.datetime.now() if HEAD_supported: MyUtility.logmsg(msgs, 3, "%s --head --output - --url %s" % (curl_args, url)) (result, headers) = MyUtility.runcommand(msgs, "%s --head --output - --url %s" % (curl_args, url)) else: MyUtility.logmsg(msgs, 3, "%s --range 0-1024 --output /dev/null --url %s" % (curl_args, url)) (result, headers) = MyUtility.runcommand(msgs, "%s --range 0-1024 --output /dev/null --url %s" % (curl_args, url)) search_obj = MyUtility.search_HTTP_CODE.search(headers) http_code = search_obj.group(1) if search_obj else "" search_obj = MyUtility.search_CONTENT_TYPE.search(headers) content_type = search_obj.group(1) if search_obj else "" tDelta = (datetime.datetime.now() - ts_cmd) MyUtility.logmsg(msgs, 3, \ "CURL exit code: %d, http_code: %s, content type: [%s], remaining retries %d, time taken %f seconds" % \ (result, http_code, content_type, retry, tDelta.total_seconds())) if result == 22: # 404 Not Found if http_code == "404" or MyUtility.search_HTTP_NOT_FOUND.search(headers): break # 403/405 Server does not support HEAD elif HEAD_supported and (http_code in ["403", "405"] or MyUtility.search_HTTP_NOT_ALLOWED.search(headers)): MyUtility.logmsg(msgs, 3, "HEAD not supported - retrying with range-limited GET") HEAD_supported = False continue # Success or fatal error - no point continuing # 0: CURLE_OK # 6: CURLE_COULDNT_RESOLVE_HOST # 7: CURLE_COULDNT_CONNECT # 9: CURLE_REMOTE_ACCESS_DENIED # 10: CURLE_FTP_ACCEPT_FAILED # 19: CURLE_FTP_COULDNT_RETR_FILE # 28: CURLE_OPERATION_TIMEDOUT if result in [0, 6, 7, 9, 10, 19, 28]: break # Keep retrying following errors until success or failure. # 35: CURLE_SSL_CONNECT_ERROR # 56: CURLE_RECV_ERROR if result not in [35, 56]: retry -= 1 MyUtility.logmsg(msgs, 3, "[\n%s]" % headers) # Success if HTTP 200 or 206 (partial content when using ranged request) # A content_type of "text/html" indicates we were served an error page of # some kind (eg. iperf) and not the requested file, which would be "application/<something>". # "text/plain" indicates a misconfigured server (eg. libgcrypt, libgpg-error) so accept this. # Some servers (eg. files.pythonhosted.org) will respond with "binary/octet-stream". if http_code in ["200", "206"] or MyUtility.search_HTTP_OK.search(headers): result = True if (content_type.startswith("application/") or \ content_type.startswith("text/plain") or \ content_type.startswith("binary/octet-stream")) else False elif http_code == "350" and url.startswith("ftp:"): result = True else: result = False tDelta = (datetime.datetime.now() - ts) MyUtility.show(msgs, 2 if VERBOSE == 2 else 3, None, "Remote File Exists", "%s (%s) %f seconds" % (result, url, tDelta.total_seconds())) return result # Calculate hash for chunked data @staticmethod def hash_bytestr_iter(bytesiter, hasher, ashexstr=True): for block in bytesiter: hasher.update(block) return (hasher.hexdigest() if ashexstr else hasher.digest()) # Read file in blocks/chunks to be memory efficient @staticmethod def file_as_blockiter(afile, blocksize=65536): with afile: block = afile.read(blocksize) while len(block) > 0: yield block block = afile.read(blocksize) # Calculate sha256 hash for a file @staticmethod def calculate_sha256(fname): try: return MyUtility.hash_bytestr_iter(MyUtility.file_as_blockiter(open(fname, "rb")), hashlib.sha256()) except: raise return "" # Use wget with same parameters as scripts/get is using @staticmethod def download_file(msgs, filename_data, filename_log, url): retries=10 attempts=0 while attempts < retries: if stopped.is_set(): break attempts += 1 (result, output) = MyUtility.runcommand(msgs, "wget --output-file=- --timeout=30 --tries=3 --passive-ftp --no-check-certificate -O %s %s" % (filename_data, url), logfile=filename_log) if result == 0: return True return False @staticmethod def get_package(msgs, package_name, package_source, package_url, package_sha): onsource = MyUtility.remote_file_exists(msgs, package_url) onmirror = MyUtility.remote_file_exists(msgs, "%s/%s/%s" % (DISTRO_MIRROR, package_name, package_source)) # If the only PKG_URL source is the DISTRO_SRC server... if package_url.startswith(DISTRO_SOURCE): # Warn the user if package is not found on either source or mirror if not onsource and not onmirror: MyUtility.show(msgs, 0, "magenta", "MKPKG REQUIRED?", "%s (%s) unable to download from DISTRO_SRC %s - we have no source!" % \ (package_name, package_url, MyUtility.colour("red", "and not on mirror"))) return False if DRY_RUN: text = "Package status: %s (%s)" % (package_name, package_source) if not onsource and onmirror: text = "%s %s" % (text, MyUtility.colour("yellow", "(found on mirror)")) if onsource or onmirror: MyUtility.show(msgs, 0, "green", "PACKAGE AVAILABLE", text) return True else: MyUtility.show(msgs, 0, "red", "PACKAGE NOT AVAILABLE", text) return False tmpfile_data = "%s/%s" % (SCRATCH_DIR, threading.current_thread().name) tmpfile_log = "%s.log" % tmpfile_data if os.path.exists(tmpfile_data): os.remove(tmpfile_data) if os.path.exists(tmpfile_log): os.remove(tmpfile_log) if VERIFY_CHECKSUM == True and package_sha and onmirror: result = MyUtility.download_file(msgs, tmpfile_data, tmpfile_log, "%s/%s/%s" % (DISTRO_MIRROR, package_name, package_source)) calc_sha = MyUtility.calculate_sha256(tmpfile_data) if os.path.exists(tmpfile_data): os.remove(tmpfile_data) if os.path.exists(tmpfile_log): os.remove(tmpfile_log) if calc_sha != package_sha: MyUtility.show(msgs, 0, "yellow", "CHECKSUM MISMATCH FROM MIRROR - REFRESHING FROM SOURCE", "%s (%s)" % (package_name, package_url)) MyUtility.logmsg(msgs, 0, "Checksum mismatch - got [%s], expected [%s]" % (calc_sha, package_sha)) onmirror = False else: MyUtility.show(msgs, 1, "green", "Mirror checksum valid", "%s (%s)" % (package_name, package_source)) return True if onsource: result = MyUtility.download_file(msgs, tmpfile_data, tmpfile_log, package_url) elif onmirror: result = MyUtility.download_file(msgs, tmpfile_data, tmpfile_log, "%s/%s/%s" % (DISTRO_MIRROR, package_name, package_source)) else: result = False if result == False or not os.path.exists(tmpfile_data): result = False MyUtility.show(msgs, 0, "red", "DOWNLOAD FAILED!!", "%s (%s)" % (package_name, package_url)) if os.path.exists(tmpfile_log): MyUtility.logmsg(msgs, 0, MyUtility.readfile(tmpfile_log)) else: if package_sha: calc_sha = MyUtility.calculate_sha256(tmpfile_data) if calc_sha != package_sha: result = False MyUtility.show(msgs, 0, "red", "DOWNLOAD FAILED!!", "%s (%s)" % (package_name, package_url)) MyUtility.logmsg(msgs, 0, "Checksum mismatch - got [%s], wanted [%s]" % (calc_sha, package_sha)) if result == True: MyUtility.show(msgs, 0, "green", "Successful Download", "%s (%s)" % (package_name, package_source)) if IS_MIRROR: if not os.path.exists("%s/%s" % (DOWNLOAD_DIR, package_name)): os.makedirs("%s/%s" % (DOWNLOAD_DIR, package_name)) shutil.move(tmpfile_data, "%s/%s/%s" % (DOWNLOAD_DIR, package_name, package_source)) else: shutil.move(tmpfile_data, "%s/%s" % (DOWNLOAD_DIR, package_source)) if os.path.exists(tmpfile_data): os.remove(tmpfile_data) if os.path.exists(tmpfile_log): os.remove(tmpfile_log) return result # Check for newer versions: "X+1.[0]0[.[0]0]" "X.[0]Y+1[.[0]0]" "X.[0]Y.[0]Z+1" @staticmethod def check_newer(msgs, package_name, package_url, package_ver): alt_versions = [] is_git_rev = False for v in MyUtility.get_alternate_versions(package_ver): if v: alt_versions.append(v) if alt_versions == []: if not package_url.startswith("https://github.com/"): return if CHECK_FILTER_TYPE == "Ver": return is_git_rev = True latestrev = MyUtility.get_latest_commit(msgs, package_url) MyUtility.logmsg(msgs, 3, "Github latest commit [%s]" % latestrev) if latestrev == "" or latestrev.startswith(package_ver): return alt_versions.append(latestrev[0:len(package_ver)]) elif CHECK_FILTER_TYPE == "Rev": return MyUtility.show(msgs, 2 if VERBOSE == 2 else 3, None, "Checking for newer", "%s, current version %s - checking %s" % (package_name, package_ver, ", ".join(alt_versions))) newurl = package_url.replace(package_ver, "@@VER@@") for newver in alt_versions: url = newurl.replace("@@VER@@", newver) if MyUtility.remote_file_exists(msgs, url): if is_git_rev: MyUtility.show(msgs, 0, "yellow", "New Rev Pkg available", "%s (%s => %s) %s" % (package_name, package_ver, newver, url)) else: MyUtility.show(msgs, 0, "magenta","New Ver Pkg available", "%s (%s => %s) %s" % (package_name, package_ver, newver, url)) break @staticmethod def toUnicode(data): if MyUtility.isPython3: return data if isinstance(data, basestring): if not isinstance(data, unicode): try: data = unicode(data, encoding="utf-8", errors="ignore") except UnicodeDecodeError: pass return data @staticmethod def printout(data, end="\n"): sys.stdout.write("%s%s" % (MyUtility.toUnicode(data), end)) sys.stdout.flush() @staticmethod def printerr(data, end="\n"): sys.stderr.write("%s%s" % (MyUtility.toUnicode(data), end)) sys.stderr.flush() # # Thread # class MyThread(threading.Thread): def __init__(self, input_queue, output_queue): threading.Thread.__init__(self) self.input_queue = input_queue self.output_queue = output_queue def run(self): while not stopped.is_set(): try: qItem = self.input_queue.get(block=False) self.input_queue.task_done() pkg_is_addon = (qItem["PKG_IS_ADDON"] == "Yes") pkg_name = qItem["PKG_NAME"] pkg_version = qItem["PKG_VERSION"] pkg_url = qItem["PKG_URL"] pkg_sha = qItem["PKG_SHA256"] pkg_section = qItem["PKG_SECTION"] pkg_source_name = qItem["PKG_SOURCE_NAME"] msgs = [] if pkg_version == "" or pkg_version == "0.0invalid" or pkg_url == "": if pkg_section != "virtual" and CHECK_FILTER_CLASS == "All" and CHECK_FILTER_TYPE == "All": MyUtility.show(msgs, 0, "cyan", "UNKNOWN VER OR URL", "%s (ver [%s], url [%s])" % (pkg_name, pkg_version, pkg_url)) self.output_queue.put(msgs) continue tDelta_get_package = datetime.timedelta(0) tDelta_check_newer = datetime.timedelta(0) self.output_queue.put([{"start": True, "name": threading.current_thread().name, "data": {"url": pkg_url, "tstamp": datetime.datetime.now()}}]) MyUtility.logmsg(msgs, 3, ">>>>>>>>>>>>>>>>> %s, %s, %s, wanted sha256 %s" % (pkg_name, pkg_version, pkg_url, pkg_sha)) if not MyUtility.have_package(pkg_name, pkg_source_name) or (VERIFY_CHECKSUM and pkg_sha): tStart = datetime.datetime.now() if not stopped.is_set() and \ not MyUtility.get_package(msgs, pkg_name, pkg_source_name, pkg_url, pkg_sha): if not IGNORE_ERRORS: stopped.set() tDelta_get_package = datetime.datetime.now() - tStart else: MyUtility.show(msgs, 1, "green", "Already downloaded", "%s (%s)" % (pkg_name, pkg_source_name)) if CHECK_NEWER and not stopped.is_set(): if (CHECK_FILTER_CLASS == "All") or \ (CHECK_FILTER_CLASS == "Main" and pkg_is_addon == False) or \ (CHECK_FILTER_CLASS == "Addons" and pkg_is_addon == True): tStart = datetime.datetime.now() MyUtility.check_newer(msgs, pkg_name, pkg_url, pkg_version) tDelta_check_newer = datetime.datetime.now() - tStart self.output_queue.put([{"stop": True, "name": threading.current_thread().name, "url": pkg_url}]) MyUtility.logmsg(msgs, 3, "<<<<<<<<<<<<<<<<< %s %s %s get_package %f check_newer %f" % \ (pkg_name, pkg_version, pkg_url, tDelta_get_package.total_seconds(), tDelta_check_newer.total_seconds())) self.output_queue.put(msgs) except Queue.Empty: break # This thread is going down... self.output_queue.put(None) def main(): if not os.path.exists(SCRATCH_DIR): os.makedirs(SCRATCH_DIR) else: for file in glob.glob("%s/*" % SCRATCH_DIR): os.remove(file) data = [] for line in sys.stdin: data.append(line) if data == []: sys.exit(1) input_queue = Queue.Queue() output_queue = Queue.Queue() for item in sorted(json.loads("".join(data)), key=lambda k: k["PKG_NAME"]): input_queue.put(item) pcount = 0 pmax = input_queue.qsize() # Create threads to process input queue threadcount = input_queue.qsize() if input_queue.qsize() <= WORKER_THREADS else WORKER_THREADS threads = [] for i in range(threadcount): t = MyThread(input_queue, output_queue) threads.append(t) t.setDaemon(False) # Start the threads... for t in threads: t.start() qtimeout = 10 running = {} stopping = False while threadcount > 0: try: qItem = output_queue.get(block=True, timeout=qtimeout) output_queue.task_done() if qItem is None: threadcount -= 1 continue finished = False for msg in qItem: if msg.get("start", False): running[msg["name"]] = msg["data"] elif msg.get("stop", False): del running[msg["name"]] elif "level" in msg: finished = True if VERBOSE >= msg["level"]: if msg["level"] <= 2: MyUtility.printout(msg["text"]) else: MyUtility.printerr(msg["text"]) if not stopping and stopped.is_set(): stopping = True MyUtility.printout(MyUtility.colour("red", "** STOPPING DUE TO FAILURE - WAITING FOR %d THREADS TO FINISH **" % threadcount)) # Do not enable progress when detailed debug logging is enabled as # this will most likely be redirected to a file if finished and PROGRESS and VERBOSE <= 2: pcount += 1 MyUtility.printerr("Processing... %3d%% (%d threads active)\x1b[K\r" % ((pcount * 100 / pmax), threadcount), end="") except Queue.Empty: if VERBOSE >= 3 and len(running) != 0: MyUtility.printerr("============ WAITING ON FOLLOWING %d THREADS ============" % len(running)) for t in running: data = running[t] MyUtility.printerr("SLOW RUNNING THREAD %s for %f secs: %s" % (t, (datetime.datetime.now() - data["tstamp"]).total_seconds(), data["url"])) if PROGRESS and VERBOSE <= 2: MyUtility.printerr("\r\x1b[K", end="") sys.exit(1 if stopped.is_set() else 0) if __name__ == "__main__": try: args = sys.argv[1:] DOWNLOAD_DIR = args[0] TARGET_DIR = args[1] DISTRO_SOURCE = args[2] DISTRO_MIRROR = args[3] IS_MIRROR = True if args[4] == "yes" else False IGNORE_ERRORS = True if args[5] == "yes" else False DRY_RUN = True if args[6] == "yes" else False CHECK_NEWER = True if args[7] == "yes" else False PROGRESS=True if args[8] == "yes" else False WORKER_THREADS=int(args[9]) GIT_USERNAME = args[10] GIT_PASSWORD = args[11] CHECK_FILTER_CLASS = args[12] CHECK_FILTER_TYPE = args[13] VERIFY_CHECKSUM = True if args[14] == "yes" else False VERBOSE = int(args[15]) SCRATCH_DIR="%s/.tmp" % DOWNLOAD_DIR stopped = threading.Event() main() except (KeyboardInterrupt, SystemExit) as e: if type(e) == SystemExit: sys.exit(int(str(e))) except Exception: raise ' [ -z "${PROJECT}" ] && PROJECT=Generic [ -z "${ARCH}" ] && ARCH=x86_64 help() { [ -n "$1" ] && echo -e "ERROR: Unknown argument [$1]\n" cat <<EOF Usage: $(basename $0) -d|--download <path> [-t|--target <path>] [-l|--libreelec <path>] [-m|--mirror] [-s|--source] [-a|-all] [-p|--package <package_name> [-r|--revision <revision>]] [--git] [-n|--notnewer] [--check-main | --check-addons] [--check-ver | --check-rev] [--no-progress] [-T #|--threads #] [-U|--gituser] [-P|--gitpass] [--dry-run] [--path-filter path] [--verify-checksum] [-v|--verbose] [-h|--help] Options: -d, --download: Directory path into which new package files will be downloaded - default is $HOME/download[1] -t, --target: Directory path for existing packages that are to be refreshed, default is $HOME/sources[2] -l, --libreelec: LibreELEC.tv repo, default is ${HOME}/LibreELEC.tv -m, --mirror: Target is mirror not source - mirror uses a hierarchical per-package folder structure -s, --source: Target is source not mirror - source uses a flattened file structure. Default is mirror -a, --all: Ignore download failures, continue processing all packages -p, --package: Package to process, otherwise process all packages -r, --revision: Version to use in place of PKG_VERSION, only applicable in conjunction with -p --git: Clone (if not available) or pull the LibreELEC.tv repository -n, --notnewer: Don't check for newer packages ('X.Y.Z+1' 'X.Y+1.0' 'X+1.0.0') --check-main: Check newer for main packages, ignore add-on packages --check-addons: Check newer for add-on packages, ignore main packages --check-ver: Check newer for version-based packages, ignore rev-based/github packages --check-rev: Check newer for rev-based/github packages, ignore version-based packages --no-progress: Do not show progress indicator -T, --threads: Number of download worker threads, default is 16 -U, --gituser: Git username (or source from ~/.git.conf) - avoids API limits -P, --gitpass: Git password (or source from ~/.git.conf) - avoids API limits --dry-run: Don't actually download anything (will still git clone/pull if configured) --path-filter Restrict workload to specified path, eg. packages/x11 (recursive) --verify-checksum: If checksum on mirror is no longer valid, attempt re-download of package from source -v, --verbose: Output more verbose sync information. Repeat for more detail -h, --help: This message Note#1. The download directory will have the LibreELEC version appended (eg. /devel) unless it is a mirror, in which case "/mirror" will be appended. Note#2. The target directory will have the LibreELEC version appended (eg. /devel) unless it is a mirror, in which case "/mirror" will be appended. EOF } get_libreelec_branch() { cd $LIBREELEC_DIR git rev-parse --abbrev-ref HEAD } # 1: LibreELEC variable, eg. LIBREELEC_VERSION get_libreelec_option() { local variable="$1" cd $LIBREELEC_DIR source config/options "" echo "${!variable}" } generate_work() { local package_name="$1" revision="$2" path_filter="$3" local packages pcount local workfile_o local tcount=0 [ ${PROGRESS} = yes ] && echo -en "Acquiring packages...\r" >&2 packages="$(get_packages "${package_name}" "${path_filter}")" pcount="$(echo "${packages}" | wc -l)" if [ -n "${package_name}" -a -z "${packages}" ]; then if [ -n "${path_filter}" ]; then echo "ERROR: ${package_name} is not a valid package when using filter ${path_filter} - package.mk does not exist" >&2 else echo "ERROR: ${package_name} is not a valid package - package.mk does not exist" >&2 fi exit 1 fi rm -f ${WORKFILES_I}.* ${WORKFILES_O}.* # Distribute packages across workers tcount=0 for package_name in ${packages}; do tcount=$((tcount + 1)) [ ${tcount} -gt ${WORKER_MAX} ] && tcount=1 echo "$package_name" >>$(printf "%s.%02d" "${WORKFILES_I}" ${tcount}) done # Generate workload using multiple "threads" (cores, hopefully...) init_progress tcount=0 while [ : ]; do tcount=$((tcount + 1)) [ ${tcount} -gt ${WORKER_MAX} ] && break generate_work_worker ${pcount} ${tcount} ${revision} & done wait end_progress # Combine workloads echo "[" tcount=0 while [ : ]; do tcount=$((tcount + 1)) [ ${tcount} -gt ${WORKER_MAX} ] && break workfile_o=$(printf "%s.%02d" "${WORKFILES_O}" ${tcount}) if [ -s ${workfile_o} ]; then [ ${tcount} -ne 1 ] && echo "," # Strip comma from line of file - not valid if this is the last file sed '$ s/ },/ }/' ${workfile_o} fi done echo "]" # Clean up rm -f ${WORKFILES_I}.* ${WORKFILES_O}.* } generate_work_worker() { local pcount=$1 worker="$2" revision="$3" local workfile_i="$(printf "%s.%02d" "${WORKFILES_I}" ${worker})" local workfile_o="$(printf "%s.%02d" "${WORKFILES_O}" ${worker})" local wanted_vars="PKG_NAME PKG_VERSION PKG_URL PKG_SHA256 PKG_DIR PKG_SECTION PKG_IS_ADDON PKG_SOURCE_NAME" local package_name var comma PKG_URL PKG_SOURCE_NAME PKG_VERSION PKG_IS_ADDON [ -f "${workfile_i}" ] || return 0 ( # Override exit function so that packages calling exit don't terminate this sub-shell exit() { : } cd $LIBREELEC_DIR source config/options "" while read -r package_name; do [ ${PROGRESS} = yes ] && progress ${pcount} source_package ${package_name} &>/dev/null || true [ -z "${PKG_DIR}" ] && continue if [ -n "${revision}" ]; then PKG_URL="${PKG_URL/${PKG_VERSION}/${revision}}" PKG_SOURCE_NAME="${PKG_SOURCE_NAME/${PKG_VERSION}/${revision}}" PKG_VERSION="${revision}" PKG_SHA256= fi PKG_IS_ADDON=No [[ ${PKG_DIR/${LIBREELEC_DIR}/} =~ ^/packages/addons/.* ]] && PKG_IS_ADDON=Yes [[ ${PKG_DIR/${LIBREELEC_DIR}/} =~ ^/packages/mediacenter/kodi-binary-addons/.* ]] && PKG_IS_ADDON=Yes echo " {" >>${workfile_o} for var in ${wanted_vars}; do [ "${var}" != "PKG_SOURCE_NAME" ] && comma="," || comma= echo " \"${var}\": \"${!var}\"${comma}" >>${workfile_o} done echo " }," >>${workfile_o} done < ${workfile_i} ) } check_exists() { if [ -z "${!1}" ]; then echo "ERROR: ${1} must not be undefined" return 1 fi [ -d ${!1} ] && return 0 echo "ERROR: ${1} ${!1} does not exist" return 1 } get_abs_path() { echo "$(readlink -f $1)" } get_package_path() { echo "$(basename "$(dirname "$0")") $0" } get_packages() { local package_name="$1" path_filter="$2" local anchor="@?+?@" ( cd $LIBREELEC_DIR # Generate package caches... source config/options "" cache_data="${BUILD}/.cache_package_global ${BUILD}/.cache_package_local" if [ -n "${path_filter}" ]; then if [ -n "${package_name}" ]; then grep -F "/${path_filter}/" ${cache_data} | grep -F "/${package_name}${anchor}" else grep -F "/${path_filter}/" ${cache_data} fi else if [ -n "${package_name}" ]; then grep -F "/${package_name}${anchor}" ${cache_data} else cat ${cache_data} fi fi ) | sed "s#${anchor}\$##g;s#/# #g" | awk '{print $NF}' | sort -u return 0 } init_progress() { echo 0 > ${LOCKFILE} } progress() { local count ( flock -x 9 count=$(($(< ${LOCKFILE}) + 1)) echo "${count}" >${LOCKFILE} printf "Generating workload... %3d%% (%d of %d)\r" $((count * 100 / $1)) ${count} $1 >&2 ) 9< "${LOCKFILE}" } end_progress() { rm -f ${LOCKFILE} printf "\033[K\r" >&2 } exec_worker_prog() { echo "${PYTHON_PROG}" >/tmp/distro-tool.py python3 /tmp/distro-tool.py "${DOWNLOAD_DIR}" "${TARGET_DIR}" "${DISTRO_SOURCE}" "${DISTRO_MIRROR}" \ "${IS_MIRROR}" "${IGNORE_ERRORS}" "${DRY_RUN}" "${CHECK_NEWER}" \ "${PROGRESS}" "${WORKER_THREADS}" "${GIT_USERNAME}" "${GIT_PASSWORD}" \ "${CHECK_FILTER_CLASS}" "${CHECK_FILTER_TYPE}" ${VERIFY_CHECKSUM} "${VERBOSE}" rm -f /tmp/distro-tool.py } while [ : ]; do [ -z "$1" ] && break case $1 in -d|--download) shift DOWNLOAD_DIR=$1 ;; -l|--libreelec) shift LIBREELEC_DIR=$1 ;; -t|--target) shift TARGET_DIR=$1 ;; -a|--all) IGNORE_ERRORS=yes ;; -p|--package) shift PACKAGE=$1 ;; -r|--revision) shift REVISION=$1 ;; -m|--mirror) IS_MIRROR=yes ;; -s|--source) IS_MIRROR=no ;; --dry-run|--dryrun) DRY_RUN=yes LINE_PREFIX="**DRY-RUN** " ;; --git) DOGIT=yes ;; -n|--notnewer) CHECK_NEWER=no ;; --check-ver) CHECK_FILTER_TYPE=Ver ;; --check-rev) CHECK_FILTER_TYPE=Rev ;; --check-addons) CHECK_FILTER_CLASS=Addons ;; --check-main) CHECK_FILTER_CLASS=Main ;; -T|--threads) shift [ $1 -gt 0 ] && WORKER_THREADS=$1 ;; -U|--gituser) shift GIT_USERNAME=$1 ;; -P|--gitpass) shift GIT_PASSWORD=$1 ;; -v|--verbose) VERBOSE=$((VERBOSE + 1)) ;; --no-progress) PROGRESS=no ;; --path-filter) shift PATH_FILTER=$1 ;; --verify-checksum) VERIFY_CHECKSUM=yes ;; -h|--help) help exit 0 ;; *) help "$1" exit 0 ;; esac shift done [ -n "${PACKAGE}" -a ${VERBOSE} -eq 0 ] && VERBOSE=1 if [ ${DOGIT} = yes ]; then ( if [ -d ${LIBREELEC_DIR}/.git ]; then cd ${LIBREELEC_DIR} git pull else mkdir -p $(dirname "${LIBREELEC_DIR}") 2>/dev/null cd $(dirname "${LIBREELEC_DIR}") git clone https://github.com/LibreELEC/LibreELEC.tv.git $(basename "${LIBREELEC_DIR}") fi ) fi check_exists LIBREELEC_DIR || exit LIBREELEC_DIR="$(get_abs_path "${LIBREELEC_DIR}")" DISTRO_SOURCE="$(get_libreelec_option DISTRO_SRC)" DISTRO_MIRROR="$(get_libreelec_option DISTRO_MIRROR)" LIBREELEC_VER="$(get_libreelec_option LIBREELEC_VERSION)" if [ ${IS_MIRROR} = no ]; then TARGET_DIR="$(get_abs_path "${TARGET_DIR}/${LIBREELEC_VER}")" else TARGET_DIR="$(get_abs_path "${TARGET_DIR}/mirror")" fi check_exists TARGET_DIR || exit if [ ${IS_MIRROR} = no ]; then DOWNLOAD_DIR="$(get_abs_path "${DOWNLOAD_DIR}/${LIBREELEC_VER}")" else DOWNLOAD_DIR="$(get_abs_path "${DOWNLOAD_DIR}/mirror")" fi check_exists DOWNLOAD_DIR || exit if [ -n "${REVISION}" -a -z "${PACKAGE}" ]; then echo "ERROR: A single package must be specified with custom revision" exit 1 fi echo if [ ${IS_MIRROR} = yes ]; then echo "Synchronising LibreELEC.tv (branch: $(get_libreelec_branch), version: ${LIBREELEC_VER}) with MIRROR server ${TARGET_DIR}" else echo "Synchronising LibreELEC.tv (branch: $(get_libreelec_branch), version: ${LIBREELEC_VER}) with SOURCE server ${TARGET_DIR}" fi echo echo "Distro Source is: ${DISTRO_SOURCE}" echo "Distro Mirror is: ${DISTRO_MIRROR}" echo " Syncing against: ${TARGET_DIR}" echo " Downloading to: ${DOWNLOAD_DIR}" if [ -n "${PATH_FILTER}" ]; then echo " Path filter: ${PATH_FILTER}" fi echo " Check Newer: ${CHECK_NEWER^} Class/Type: ${CHECK_FILTER_CLASS} / ${CHECK_FILTER_TYPE}" echo " Dry run: ${DRY_RUN^}" if [ ${VERBOSE} -gt 2 ]; then echo " Debugging level: ${VERBOSE} (${DEBUG_LOG})" echo " Worker Threads: ${WORKER_THREADS}" fi echo if [ ${VERBOSE} -gt 2 -a -n "${DEBUG_LOG}" ]; then generate_work "${PACKAGE}" "${REVISION}" "${PATH_FILTER}" | exec_worker_prog 2>${DEBUG_LOG} else generate_work "${PACKAGE}" "${REVISION}" "${PATH_FILTER}" | exec_worker_prog fi ================================================ FILE: tools/docker/README.md ================================================ # Build container **Docker containers** - Ubuntu - bionic (Ubuntu 18.04) - focal (Ubuntu 20.04) - jammy (Ubuntu 22.04) - kinetic (Ubuntu 22.10) - Debian - stretch (Debian 9.0) - buster (Debian 10.0) - sid (Debian unstable) **Build docker image** Use the following command to create a docker image and tag it with `coreelec`. ``` docker build --pull -t coreelec tools/docker/focal ``` See https://docs.docker.com/engine/reference/commandline/build/ for details on `docker build` usage. **Build CoreELEC image inside a container** Use the following command to build CoreELEC images inside a new container based on the docker image tagged with `coreelec`. ``` docker run --rm -v `pwd`:/build -w /build -it coreelec make image ``` Use `--env`, `-e` or `--env-file` to pass environment variables used by the CoreELEC buildsystem. ``` docker run --rm -v `pwd`:/build -w /build -it -e PROJECT=Amlogic-ce -e DEVICE=Amlogic-ng -e ARCH=arm coreelec make image ``` See https://docs.docker.com/engine/reference/commandline/run/ for details on `docker run` usage. Note: `dockerd` is set to send all its logs to journald using the setting `--log-driver=journald` (so if you don't set the `--log-driver none` for your `docker run` these logs will be sent through to your log. Refer: https://github.com/LibreELEC/LibreELEC.tv/blob/140ad28a258167e0e87daf1e474db37215b2caf3/packages/addons/service/docker/source/system.d/service.system.docker.service#L12 ================================================ FILE: tools/docker/aarch64/bionic/Dockerfile ================================================ FROM arm64v8/ubuntu:bionic ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get dist-upgrade -y \ && apt-get install -y locales sudo \ && rm -rf /var/lib/apt/lists/* RUN locale-gen en_US.UTF-8 \ && update-locale LANG=en_US.UTF-8 LANGUAGE=en_US:en ENV LANG=en_US.UTF-8 \ LANGUAGE=en_US:en \ LC_ALL=en_US.UTF-8 RUN adduser --disabled-password --gecos '' docker \ && adduser docker sudo \ && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers RUN apt-get update && apt-get install -y \ wget bash bc gcc sed patch patchutils tar bzip2 gzip perl gawk gperf zip unzip diffutils texinfo lzop python python3 \ g++ xfonts-utils xfonts-utils xfonts-utils xsltproc default-jre-headless cpio \ libc6-dev libncurses5-dev libssl-dev \ u-boot-tools \ xz-utils make file libxml-parser-perl \ libjson-perl libparse-yapp-perl \ golang-go \ git openssh-client \ qemu-user-binfmt \ --no-install-recommends \ && rm -rf /var/lib/apt/lists/* USER docker ================================================ FILE: tools/docker/aarch64/focal/Dockerfile ================================================ FROM arm64v8/ubuntu:focal ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get dist-upgrade -y \ && apt-get install -y locales sudo \ && rm -rf /var/lib/apt/lists/* RUN locale-gen en_US.UTF-8 \ && update-locale LANG=en_US.UTF-8 LANGUAGE=en_US:en ENV LANG=en_US.UTF-8 \ LANGUAGE=en_US:en \ LC_ALL=en_US.UTF-8 RUN adduser --disabled-password --gecos '' docker \ && adduser docker sudo \ && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers RUN apt-get update && apt-get install -y \ wget bash bc gcc sed patch patchutils tar bzip2 gzip perl gawk gperf zip unzip diffutils texinfo lzop python python3 \ g++ xfonts-utils xfonts-utils xfonts-utils xsltproc default-jre-headless cpio \ libc6-dev libncurses5-dev libssl-dev \ u-boot-tools \ xz-utils make file libxml-parser-perl \ libjson-perl libparse-yapp-perl \ golang-go \ git openssh-client \ qemu-user-binfmt \ --no-install-recommends \ && rm -rf /var/lib/apt/lists/* USER docker ================================================ FILE: tools/docker/bionic/Dockerfile ================================================ FROM ubuntu:bionic ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get dist-upgrade -y \ && apt-get install -y locales sudo \ && rm -rf /var/lib/apt/lists/* RUN locale-gen en_US.UTF-8 \ && update-locale LANG=en_US.UTF-8 LANGUAGE=en_US:en ENV LANG=en_US.UTF-8 \ LANGUAGE=en_US:en \ LC_ALL=en_US.UTF-8 RUN adduser --disabled-password --gecos '' docker \ && adduser docker sudo \ && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers RUN apt-get update && apt-get install -y \ wget bash bc gcc sed patch patchutils tar bzip2 gzip xz-utils zstd perl gawk gperf zip unzip diffutils lzop make file \ g++ xfonts-utils xsltproc default-jre-headless python3 \ libc6-dev libncurses5-dev \ libjson-perl libxml-parser-perl libparse-yapp-perl \ golang-go \ git openssh-client \ --no-install-recommends \ && rm -rf /var/lib/apt/lists/* USER docker ================================================ FILE: tools/docker/buster/Dockerfile ================================================ FROM debian:buster ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get dist-upgrade -y \ && apt-get install -y locales sudo \ && rm -rf /var/lib/apt/lists/* RUN echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen \ && locale-gen en_US.UTF-8 \ && update-locale LANG=en_US.UTF-8 LANGUAGE=en_US:en ENV LANG=en_US.UTF-8 \ LANGUAGE=en_US:en \ LC_ALL=en_US.UTF-8 RUN adduser --disabled-password --gecos '' docker \ && adduser docker sudo \ && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers RUN apt-get update && apt-get install -y \ wget bash bc gcc sed patch patchutils tar bzip2 gzip xz-utils zstd perl gawk gperf zip unzip diffutils lzop make file \ g++ xfonts-utils xsltproc default-jre-headless python3 \ libc6-dev libncurses5-dev \ libjson-perl libxml-parser-perl libparse-yapp-perl \ golang-go \ git openssh-client \ --no-install-recommends \ && rm -rf /var/lib/apt/lists/* USER docker ================================================ FILE: tools/docker/focal/Dockerfile ================================================ FROM ubuntu:focal ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get dist-upgrade -y \ && apt-get install -y locales sudo \ && rm -rf /var/lib/apt/lists/* RUN locale-gen en_US.UTF-8 \ && update-locale LANG=en_US.UTF-8 LANGUAGE=en_US:en ENV LANG=en_US.UTF-8 \ LANGUAGE=en_US:en \ LC_ALL=en_US.UTF-8 RUN adduser --disabled-password --gecos '' docker \ && adduser docker sudo \ && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers RUN apt-get update && apt-get install -y \ wget bash bc gcc-10 sed patch patchutils tar bzip2 gzip xz-utils zstd perl gawk gperf zip \ unzip diffutils lzop make file g++-10 xfonts-utils xsltproc default-jre-headless python3 \ libc6-dev libncurses5-dev libjson-perl libxml-parser-perl libparse-yapp-perl \ golang-1.18-go git openssh-client \ --no-install-recommends \ && ln -s /usr/lib/go-1.18 /usr/lib/go \ && rm -rf /var/lib/apt/lists/* RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 \ --slave /usr/bin/cpp cpp /usr/bin/cpp-10 \ --slave /usr/bin/g++ g++ /usr/bin/g++-10 \ --slave /usr/bin/gcov gcov /usr/bin/gcov-10 RUN update-alternatives --config gcc USER docker ================================================ FILE: tools/docker/jammy/Dockerfile ================================================ FROM ubuntu:jammy ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get dist-upgrade -y \ && apt-get install -y locales sudo \ && rm -rf /var/lib/apt/lists/* RUN locale-gen en_US.UTF-8 \ && update-locale LANG=en_US.UTF-8 LANGUAGE=en_US:en ENV LANG=en_US.UTF-8 \ LANGUAGE=en_US:en \ LC_ALL=en_US.UTF-8 RUN adduser --disabled-password --gecos '' docker \ && adduser docker sudo \ && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers RUN apt-get update && apt-get install -y \ wget bash bc gcc sed patch patchutils tar bzip2 gzip xz-utils zstd perl gawk gperf zip unzip diffutils lzop make file \ g++ xfonts-utils xsltproc default-jre-headless python3 \ libc6-dev libncurses5-dev \ libjson-perl libxml-parser-perl libparse-yapp-perl \ golang-go \ git openssh-client \ --no-install-recommends \ && rm -rf /var/lib/apt/lists/* USER docker ================================================ FILE: tools/docker/kinetic/Dockerfile ================================================ FROM ubuntu:kinetic ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get dist-upgrade -y \ && apt-get install -y locales sudo \ && rm -rf /var/lib/apt/lists/* RUN locale-gen en_US.UTF-8 \ && update-locale LANG=en_US.UTF-8 LANGUAGE=en_US:en ENV LANG=en_US.UTF-8 \ LANGUAGE=en_US:en \ LC_ALL=en_US.UTF-8 RUN adduser --disabled-password --gecos '' docker \ && adduser docker sudo \ && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers RUN apt-get update && apt-get install -y \ wget bash bc gcc sed patch patchutils tar bzip2 gzip xz-utils zstd perl gawk gperf zip unzip diffutils lzop make file \ g++ xfonts-utils xsltproc default-jre-headless python3 \ libc6-dev libncurses5-dev \ libjson-perl libxml-parser-perl libparse-yapp-perl \ golang-go \ git openssh-client \ --no-install-recommends \ && rm -rf /var/lib/apt/lists/* USER docker ================================================ FILE: tools/docker/sid/Dockerfile ================================================ FROM debian:sid ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get dist-upgrade -y \ && apt-get install -y locales sudo \ && rm -rf /var/lib/apt/lists/* RUN echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen \ && locale-gen en_US.UTF-8 \ && update-locale LANG=en_US.UTF-8 LANGUAGE=en_US:en ENV LANG=en_US.UTF-8 \ LANGUAGE=en_US:en \ LC_ALL=en_US.UTF-8 RUN adduser --disabled-password --gecos '' docker \ && adduser docker sudo \ && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers RUN apt-get update && apt-get install -y \ wget bash bc gcc sed patch patchutils tar bzip2 gzip xz-utils zstd perl gawk gperf zip unzip diffutils lzop make file \ g++ xfonts-utils xsltproc default-jre-headless python3 \ libc6-dev libncurses5-dev \ libjson-perl libxml-parser-perl libparse-yapp-perl \ golang-go \ git openssh-client \ --no-install-recommends \ && rm -rf /var/lib/apt/lists/* USER docker ================================================ FILE: tools/docker/stretch/Dockerfile ================================================ FROM debian:stretch ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get dist-upgrade -y \ && apt-get install -y locales sudo \ && rm -rf /var/lib/apt/lists/* RUN echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen \ && locale-gen en_US.UTF-8 \ && update-locale LANG=en_US.UTF-8 LANGUAGE=en_US:en ENV LANG=en_US.UTF-8 \ LANGUAGE=en_US:en \ LC_ALL=en_US.UTF-8 RUN adduser --disabled-password --gecos '' docker \ && adduser docker sudo \ && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers RUN apt-get update && apt-get install -y \ wget bash bc gcc sed patch patchutils tar bzip2 gzip xz-utils zstd perl gawk gperf zip unzip diffutils lzop make file \ g++ xfonts-utils xsltproc default-jre-headless python3 \ libc6-dev libncurses5-dev \ libjson-perl libxml-parser-perl libparse-yapp-perl \ golang-go \ git openssh-client \ --no-install-recommends \ && rm -rf /var/lib/apt/lists/* USER docker ================================================ FILE: tools/download-cleaner ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-2020 Ian Leonard (antonlacon@gmail.com) # # Scan through the given directory looking for out of date source packages. # If a source tarball is found that is different from what is currently in # tree, then print out the discovered files. # # If -d is passed, also delete obsolete files. # If -f is passed, fetch updated source tarballs. # If -b is passed, build a new SOURCES, populated from the old SOURCES # Set NEW_SOURCES_DIR to customize the temp dir to use in building # If -r is passed, replace the old SOURCES when finished building new SOURCES set -e . config/options "" # default variables DESTRUCTIVE_RUN="false" FETCH_UPDATES="false" PACKAGES_TO_UPDATE=() BUILD_SOURCES="false" REPLACE_OLD="false" NEW_SOURCES="${NEW_SOURCES_DIR:-${SOURCES}.new}" # helper functions help(){ echo "Usage: ${0} [-hdfbr]" echo "Set PROJECT, DEVICE and ARCH as required." echo " -h this help" echo " -d delete obsolete source packages (default no)" echo " -f fetch updated source packages (default: no)" echo " -b build new SOURCES content (default: no)" echo " -r replace old SOURCES when rebuilding (default: no)" } # command line opts while getopts hdfrb OPT; do case "${OPT}" in h) help exit 0 ;; d) DESTRUCTIVE_RUN="true" ;; f) FETCH_UPDATES="true" ;; b) BUILD_SOURCES="true" ;; r) REPLACE_OLD="true" ;; \?) # error and output help on unknown help die ;; esac done shift $((${OPTIND}-1)) # sanity checking if [ ! -d "${SOURCES}" ]; then die "error: ${SOURCES} is not a directory" elif [ "${DESTRUCTIVE_RUN}" = "true" -a "${BUILD_SOURCES}" = "true" ]; then die "error: options '-d' and '-b' are mutually exclusive" fi # main # process files in SOURCES for SOURCE_PACKAGE in $(find "${SOURCES}/" -mindepth 1 -type d); do PACKAGE_NAME=$(basename "${SOURCE_PACKAGE}") # check if package is still in the tree to selectively prune, or delete the dir PACKAGE_DIR=$(get_pkg_directory "${PACKAGE_NAME}" || true) if [ -n "${PACKAGE_DIR}" ]; then PACKAGE_SOURCE_FILE=$(get_pkg_variable "${PACKAGE_NAME}" "PKG_SOURCE_NAME") fi # PACKAGE_DIR is null if not in tree, PACKAGE_SOURCE_FILE is null if PKG_ARCH mismatch if [ -n "${PACKAGE_DIR}" -a -n "${PACKAGE_SOURCE_FILE}" ]; then CUR_PACKAGE_FILE=$(basename "${PACKAGE_SOURCE_FILE}") for FILE in $(find "${SOURCE_PACKAGE}/" -type f); do # don't test auxilliary files if [[ "${FILE}" = *.url ]] || [[ "${FILE}" = *.sha256 ]]; then continue fi # obsolete file handling if [ "${FILE}" != "${SOURCES}/${PACKAGE_NAME}/${CUR_PACKAGE_FILE}" ]; then ls -1 "${FILE}"* PACKAGES_TO_UPDATE+="${PACKAGE_NAME}" if [ "${DESTRUCTIVE_RUN}" = "true" ]; then rm -f "${FILE}"* fi # current file handling elif [ "${BUILD_SOURCES}" = "true" ]; then echo "Relocating ${PACKAGE_NAME} files..." mkdir -p "${NEW_SOURCES}/${PACKAGE_NAME}" mv "${FILE}"* "${NEW_SOURCES}/${PACKAGE_NAME}/" fi done else echo "info: ${PACKAGE_NAME} no longer in tree" if [ "${DESTRUCTIVE_RUN}" = "true" ]; then rm -rf "${SOURCE_PACKAGE}" fi fi done if [ "${BUILD_SOURCES}" = "true" -a "${REPLACE_OLD}" = "true" ]; then rm -rf "${SOURCES}" mv "${NEW_SOURCES}" "${SOURCES}" fi if [ "${FETCH_UPDATES}" = "true" ]; then if "${BUILD_SOURCES}" = "true" -a "${REPLACE_OLD}" = "false" ]; then SOURCES="${NEW_SOURCES}" fi for PACKAGE in "${PACKAGES_TO_UPDATE[@]}"; do # scripts/get determines if tarball is present before downloading SOURCES_DIR="${SOURCES}" "${SCRIPTS}/get" "${PACKAGE}" done fi exit ================================================ FILE: tools/download-tool ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Lukas Rusak (lrusak@libreelec.tv) # Copyright (C) 2020-present Team CoreELEC (https://coreelec.org) . config/options "" help() { echo "Usage: PROJECT=<project> DEVICE=<device> ARCH=<arch> [JOBS=<num>] ${0} [package|-a|--all]" echo "Options:" echo " package: name of single package what should be downloaded" echo " -a, --all: download all packages needed to build PROJECT=\"${PROJECT}\" DEVICE=\"${DEVICE}\"" } if [ -z "${PROJECT}" -a -z "${ARCH}" -o -z "${1}" ]; then help exit 0 fi case ${1} in -a|--all) shift LIST=$(scripts/pkgjson|scripts/genbuildplan.py --hide-wants --build ${@:-image} 2>/dev/null | awk '{ split($2,a,":"); print a[1] }' | sort -u) ;; -h|--help) help exit 0 ;; *) LIST="${1}" shift ;; esac if [ -z $(which parallel) ]; then echo "'parallel' is not installed, packages will be download one at a time" for package in ${LIST}; do echo "download package: ${package}" ./scripts/get $package done else [ -z "${JOBS}" ] && JOBS=0 parallel --jobs ${JOBS} ./scripts/get {} ::: ${LIST} fi ================================================ FILE: tools/ffmpeg/gen-patches.sh ================================================ #!/bin/bash # base ffmpeg version FFMPEG_REPO="git://source.ffmpeg.org/ffmpeg.git" FFMPEG_VERSION="n4.4.1" KODI_FFMPEG_REPO="https://github.com/xbmc/FFmpeg" KODI_FFMPEG_VERSION="4.4.1-Nexus-Alpha1" ALL_FEATURE_SETS="v4l2-drmprime v4l2-request libreelec rpi kodi" if [ $# -eq 0 ]; then echo "usage: $0 all|featureset [githash]" echo "available feature sets: ${ALL_FEATURE_SETS}" exit 1 fi FFMPEG_ROOT="$(pwd)" LE_ROOT="$(cd $(dirname $0)/../.. ; pwd)" create_patch() { FEATURE_SET="$1" REFTYPE="branch" BASE_REPO="${FFMPEG_REPO}" BASE_VERSION="${FFMPEG_VERSION}" PATCH_CREATE_DIFF="no" case "${FEATURE_SET}" in v4l2-drmprime) REPO="https://github.com/jernejsk/FFmpeg" REFSPEC="v4l2-drmprime-v6-4.4.1-Nexus-Alpha1" BASE_REPO="${KODI_FFMPEG_REPO}" BASE_VERSION="${KODI_FFMPEG_VERSION}" ;; v4l2-request) REPO="https://github.com/jernejsk/FFmpeg" REFSPEC="v4l2-request-hwaccel-4.4.1-Nexus-Alpha1" BASE_REPO="${KODI_FFMPEG_REPO}" BASE_VERSION="${KODI_FFMPEG_VERSION}" ;; libreelec) REPO="https://github.com/LibreELEC/FFmpeg" REFSPEC="4.4-libreelec-misc" ;; rpi) REPO="https://github.com/jc-kynesim/rpi-ffmpeg" REFSPEC="test/4.4.1/main" PATCH_CREATE_DIFF="yes" ;; kodi) REPO="${KODI_FFMPEG_REPO}" REFSPEC="${KODI_FFMPEG_VERSION}" REFTYPE="tag" ;; *) echo "illegal feature set ${FEATURE_SET}" exit 1 ;; esac # get base ffmpeg version git fetch "${BASE_REPO}" "${BASE_VERSION}" BASE_REV=$(git rev-parse FETCH_HEAD) PATCH_DIR="packages/multimedia/ffmpeg/patches/${FEATURE_SET}" PATCH_FILE="${PATCH_DIR}/ffmpeg-001-${FEATURE_SET}.patch" mkdir -p "${LE_ROOT}/${PATCH_DIR}" git fetch "${REPO}" "${REFSPEC}" if [ $# -ge 2 ]; then REV="$2" else REV=$(git rev-parse FETCH_HEAD) fi BASE_REV=$(git merge-base "${BASE_REV}" "${REV}") if [ -f "${LE_ROOT}/${PATCH_FILE}" ]; then ACTION="update" else ACTION="create" fi if [ "${PATCH_CREATE_DIFF}" = "yes" ]; then # create diff in case format-patch doesn't work, eg when we have non-linear history git diff "${BASE_REV}..${REV}" > "${LE_ROOT}/${PATCH_FILE}" else git format-patch --stdout --no-signature "${BASE_REV}..${REV}" > "${LE_ROOT}/${PATCH_FILE}" fi MSG=$(mktemp) cat << EOF > "${MSG}" ffmpeg: ${ACTION} ${FEATURE_SET} patch Patch created using revisions ${BASE_REV:0:7}..${REV:0:7} from ${REFTYPE} ${REFSPEC} of ${REPO} EOF cd "${LE_ROOT}" git add "${PATCH_FILE}" git commit -F "${MSG}" ${GIT_COMMIT_ARGS} cd "${FFMPEG_ROOT}" rm "${MSG}" } if [ "$1" = "all" ]; then for SET in ${ALL_FEATURE_SETS}; do create_patch "${SET}" done else create_patch "$@" fi ================================================ FILE: tools/fixlecode.py ================================================ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) import os import sys import re import argparse import subprocess import tempfile VAR_VALID_CHARS = '[A-Za-z_0-9]' RE_VAR_VALID_CHARS = re.compile(VAR_VALID_CHARS) RE_APPEND_WITH_BRACES = re.compile(r'^\s*(%s*)="(\${%s*})' % (VAR_VALID_CHARS, VAR_VALID_CHARS)) RE_APPEND_WITHOUT_BRACES = re.compile(r'^\s*(%s*)="(\$%s*)' % (VAR_VALID_CHARS, VAR_VALID_CHARS)) RE_AWK_SQUOTE1 = re.compile(r".*\s*awk -F'.' [^']*\s'([^']*)'") RE_AWK_SQUOTE2 = re.compile(r".*\s*awk[^']*\s'([^']*)'") RE_AWK_DQUOTE = re.compile(r'.*\s*awk[^"]*\s"([^"]*)"') RE_SEMICOLON_THEN = re.compile(r'\s*;\s*then\s*$') RE_SEMICOLON_DO = re.compile(r'\s*;\s*do\s*$') RE_CONTINUATION = re.compile(r'.*\\\s*') RE_SIMPLE_ASSIGN = re.compile(r'\s*%s*="[^"]*"\s*$' % VAR_VALID_CHARS) # # From: # PKG_XYZ="$PKG_XYZ blah" (or PKG_XYZ="${PKG_XYZ} blah") # to # PKG_XYZ+=" blah" # def fix_appends(line, changed): changes = 0 newline = line replace = False # If it doesn't look like a simple 'PKG_XYZ="<something>"' then ignore it if not RE_SIMPLE_ASSIGN.match(line): return newline # Ignore continuations, likely not a simple assignment if RE_CONTINUATION.match(line): return newline match = RE_APPEND_WITH_BRACES.match(line) if match: replace = (match.groups()[1] == ('${%s}' % match.groups()[0])) else: match = RE_APPEND_WITHOUT_BRACES.match(line) if match: replace = (match.groups()[1] == ('$%s' % match.groups()[0])) # If we want to replace this, but we're replacing the var # with only itself, then it's not a concat but something else, # so ignore it (eg. when populating /etc/os-release in /scripts/image). if replace and line.endswith('%s"\n' % match.groups()[1]): replace = False if replace: newline = line.replace('="%s' % match.groups()[1], '+="') changes += 1 changed['appends'] += changes changed['isdirty'] = (changed['isdirty'] or changes != 0) return newline # # From: # $PKG_XYZ # to: # ${PKG_XYZ} # def fix_braces(line, changed): changes = 0 newline = '' invar = False c = 0 # Try and identify awk progs, so that they can be ignored awk = None for r in [RE_AWK_SQUOTE1, RE_AWK_SQUOTE2, RE_AWK_DQUOTE]: awk = r.match(line) if awk: break while c < len(line): char = line[c:c+1] charn = line[c+1:c+2] # ignore $0, $1, $2 etc. in simple one-line awk progs if awk and c >= awk.start(1) and c <= awk.end(1): newline += char c += 1 continue if not invar and char == '$' and RE_VAR_VALID_CHARS.search(charn): invar = True newline += char + '{' changes += 1 elif invar and not RE_VAR_VALID_CHARS.search(char): invar = False newline += '}' if char == '$': continue newline += char else: newline += char c +=1 changed['braces'] += changes changed['isdirty'] = (changed['isdirty'] or changes != 0) return newline # # From # blah=`cat filename | wc -l` # to: # blah=$(cat filename | wc -l) # def fix_backticks(line, changed): changes = 0 newline = '' intick = False iscomment = False c = 0 # Don't fix backticks in comments as more likely to be markdown if line.startswith('#'): return line while c < len(line): char = line[c:c+1] charn = line[c+1:c+2] # Don't convert "embedded" comments such as `# blah blah` if not intick and char == '`' and charn == '#': iscomment = True if char == '`' and (intick or charn != '#'): if iscomment: newline += char iscomment = False elif not intick: newline += '$(' changes += 1 else: newline += ')' intick = not intick else: newline += char c += 1 changed['backticks'] += changes changed['isdirty'] = (changed['isdirty'] or changes != 0) return newline # # 1. From: # if [ test ] ; then # to: # if [ test ]; then # # 2. From: # for dtb in $(find . -name '*.dtb') ; do # to: # for dtb in $(find . -name '*.dtb'); do # def fix_semicolons(line, changed): changes = 0 newline = line oldline = newline newline = RE_SEMICOLON_THEN.sub('; then\n', newline) if newline != oldline: changes += 1 oldline = newline newline = RE_SEMICOLON_DO.sub('; do\n', newline) # Hack around dangling ' ; do' statements if newline == '; do\n': newline = oldline if newline != oldline: changes += 1 changed['semicolons'] += changes changed['isdirty'] = (changed['isdirty'] or changes != 0) return newline # # Validate args. # Iterate over files. # def process_args(args): files = [] if args.filename: for filename in args.filename: if os.path.exists(filename): if os.path.isfile(filename): files.append(filename) else: print('ERROR: %s does not exist' % filename) sys.exit(1) else: if args.write: print('ERROR: --write not valid when input is stdin.') sys.exit(1) files.append(None) #read from stdin if len(files) > 1 and args.output: print('ERROR: --output not valid with multiple inputs.') sys.exit(1) for filename in sorted(files): (oldlines, newlines, changed) = process_file(filename, args) if args.output: output_file(args.output, newlines) elif args.write: output_file(filename, newlines) if args.diff and changed['isdirty']: show_diff(filename, oldlines, newlines) if not args.quiet and (not args.dirty or changed['isdirty']): show_summary(filename, changed) def process_file(filename, args): oldlines = [] newlines = [] changed = {'isdirty': False, 'appends': 0, 'backticks': 0, 'braces': 0, 'semicolons': 0} if filename: file = open(filename, 'r') else: file = sys.stdin oldline = file.readline() while oldline: oldlines.append(oldline) oldline = file.readline() file.close() for oldline in oldlines: newline = oldline if not args.no_appends: newline = fix_appends(newline, changed) if not args.no_braces: newline = fix_braces(newline, changed) if not args.no_backticks: newline = fix_backticks(newline, changed) if not args.no_semicolons: newline = fix_semicolons(newline, changed) newlines.append(newline) return(''.join(oldlines), ''.join(newlines), changed) def run_command(command): result = '' process = subprocess.Popen(command, shell=True, close_fds=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) process.wait() for line in process.stdout.readlines(): result = '%s%s' % (result, line.decode('utf-8')) return result # # Run 'diff -Naur' on two inputs. # # Since we support input from stdin, write # both sets of data to temporary files and # then compare them. # def show_diff(filename, oldlines, newlines): if not filename: filename = 'stdin' with tempfile.NamedTemporaryFile(mode='w') as file: oldfile = file.name with tempfile.NamedTemporaryFile(mode='w') as file: newfile = file.name output_file(oldfile, oldlines) output_file(newfile, newlines) diff = run_command('diff -Naur "%s" "%s"' % (oldfile, newfile)) os.remove(oldfile) os.remove(newfile) diff = diff.split('\n') if len(diff) > 2: # fix filenames diff[0] = diff[0].replace(oldfile, 'a/%s' % filename) diff[1] = diff[1].replace(newfile, 'b/%s' % filename) print('\n'.join(diff), file=sys.stderr) def output_file(filename, lines): if filename == '-': print(lines, end='') else: with open(filename, 'w') as file: print(lines, end='', file=file) def show_summary(filename, changed): print() if not filename: print('Summary of changes', file=sys.stderr) else: print('Summary of changes [%s]' % filename, file=sys.stderr) print('==================', file=sys.stderr) print('Appends : %4d' % changed['appends'], file=sys.stderr) print('Braces : %4d' % changed['braces'], file=sys.stderr) print('Backticks : %4d' % changed['backticks'], file=sys.stderr) print('Semicolons: %4d' % changed['semicolons'], file=sys.stderr) #--------------------------------------------- parser = argparse.ArgumentParser(description='Update build system shell-script source ' \ 'code to comply with LibreELEC coding standards.\n\n' \ 'Should work with package.mk, and other build system shell ' \ 'scripts (scripts/*, config/* etc.).\n\n' \ 'WARNING: May produce unusable results when run on ' \ 'non-shell script code!', \ formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument('-f', '--filename', nargs='+', metavar='FILENAME', required=False, \ help='Filename to be read. If not supplied, read from stdin.') group = parser.add_mutually_exclusive_group() group.add_argument('-o', '--output', metavar='FILENAME', required=False, \ help='Optional filename into which output will be written. ' \ 'Use - for stdout. Not valid with more than one input, or --write.') group.add_argument('-w', '--write', action='store_true', \ help='Overwrite --filename with changes. Default is not to overwrite. ' \ 'Not valid if --output is specified, or reading from stdin.') parser.add_argument('-d', '--diff', action='store_true', \ help='Output diff of changes to stderr (diff -Naur).') group = parser.add_mutually_exclusive_group() group.add_argument('-q', '--quiet', action='store_true', help='Disable summary.') group.add_argument('-Q', '--dirty', action='store_true', help='Output summary only for modified files.') parser.add_argument('-xa', '--no-appends', action='store_true', help='Disable "append" (+=) conversion.') parser.add_argument('-xb', '--no-braces', action='store_true', help='Disable "brace" ({}) addition.') parser.add_argument('-xs', '--no-semicolons', action='store_true', help='Disable "semicolon squeezing" ( ;/;).') parser.add_argument('-xt', '--no-backticks', action='store_true', help='Disable "backtick" (``/$()) replacement.') args = parser.parse_args() if __name__ == '__main__': process_args(args) ================================================ FILE: tools/mkpkg/mkpkg_bcm2835-driver ================================================ #!/bin/sh # 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) echo "getting sources..." if [ ! -d bcm2835-driver.git ]; then git clone git://github.com/raspberrypi/firmware.git --depth=1 -b master bcm2835-driver.git fi cd bcm2835-driver.git git pull GIT_REV=`git log -n1 --format=%H` cd .. echo "copying sources..." rm -rf bcm2835-driver-$GIT_REV cp -R bcm2835-driver.git bcm2835-driver-$GIT_REV rm -rf bcm2835-bootloader-$GIT_REV cp -R bcm2835-driver.git/boot bcm2835-bootloader-$GIT_REV echo "cleaning sources..." rm -rf bcm2835-driver-$GIT_REV/.git mkdir bcm2835-driver-$GIT_REV/softfp mv bcm2835-driver-$GIT_REV/opt bcm2835-driver-$GIT_REV/softfp rm -rf bcm2835-driver-$GIT_REV/*/opt/vc/src rm -rf bcm2835-driver-$GIT_REV/debug rm -rf bcm2835-driver-$GIT_REV/extra rm -rf bcm2835-driver-$GIT_REV/modules rm -rf bcm2835-driver-$GIT_REV/cutdown rm -rf bcm2835-driver-$GIT_REV/boot chmod 644 bcm2835-driver-$GIT_REV/*/opt/vc/include/bcm_host.h rm -rf bcm2835-bootloader-$GIT_REV/kernel*.img echo "packing sources..." tar cvJf bcm2835-driver-$GIT_REV.tar.xz bcm2835-driver-$GIT_REV tar cvJf bcm2835-bootloader-$GIT_REV.tar.xz bcm2835-bootloader-$GIT_REV echo "remove temporary sourcedir..." rm -rf bcm2835-driver-$GIT_REV rm -rf bcm2835-bootloader-$GIT_REV ================================================ FILE: tools/mkpkg/mkpkg_boblightd ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) echo "getting sources..." svn checkout http://boblight.googlecode.com/svn/trunk/ boblightd-latest echo "getting version..." cd boblightd-latest SVN_REV=`LANG=C svn info 2>/dev/null | grep Revision: | sed -e 's/.*\: //'` echo $SVN_REV cd .. echo "copying sources..." rm -rf boblightd-$SVN_REV cp -R boblightd-latest boblightd-$SVN_REV #echo "cleaning sources..." find boblightd-$SVN_REV -name ".svn" -exec rm -rf {} \; 2>/dev/null echo "packing sources..." tar cvJf boblightd-$SVN_REV.tar.xz boblightd-$SVN_REV echo "remove temporary sourcedir..." rm -rf boblightd-$SVN_REV ================================================ FILE: tools/mkpkg/mkpkg_libcec ================================================ #!/bin/sh # 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) echo "getting sources..." if [ ! -d libcec.git ]; then git clone --depth=1 https://github.com/Pulse-Eight/libcec.git libcec.git fi cd libcec.git git pull GIT_REV=`git log -n1 --format=%H` cd .. echo "copying sources..." rm -rf libcec-$GIT_REV cp -R libcec.git libcec-$GIT_REV echo "cleaning sources..." rm -rf libcec-$GIT_REV/.git echo "packing sources..." tar cvJf libcec-$GIT_REV.tar.xz libcec-$GIT_REV echo "remove temporary sourcedir..." rm -rf libcec-$GIT_REV ================================================ FILE: tools/mkpkg/mkpkg_media_build ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) # set media_build version you want to use if [ -z "$1" ]; then MEDIA_BUILD_HASH="master" else MEDIA_BUILD_HASH="$1" fi # name of the package DVB_MKPKG_FOLDER="$(pwd)" # remove old files echo "removing old sources ..." rm -rf media_build*/ rm -rf media_tree/ ################################################################################ # media_build dl echo "getting media_build sources ..." if [ ! -d media_build.git ]; then git clone https://bitbucket.org/CrazyCat/media_build.git media_build/ fi #get log cd media_build/ git pull git checkout $MEDIA_BUILD_HASH GIT_LOG_MEDIA_BUILD=`git log --pretty=oneline -n1` cd $DVB_MKPKG_FOLDER/ # media_tree dl echo "getting sources ..." if [ ! -d linux_media.git ]; then git clone --depth=1 https://bitbucket.org/CrazyCat/linux_media.git -b latest media_tree fi #get log cd media_tree/ git pull GIT_LOG_MEDIA_TREE=`git log --pretty=oneline -n1` GIT_REV=`git log -n1 --pretty=format:"%ad" --date=short` cd $DVB_MKPKG_FOLDER/ ################################################################################ # collecting files from media_tree echo "create media_tree tar" cd media_build/linux make tar DIR="$DVB_MKPKG_FOLDER/media_tree/" cd $DVB_MKPKG_FOLDER # cleanup rm -rf media_tree/ rm -rf media_build/.git/ # log used versions into LE_versions echo "package include: \n\nmedia_build:\n$GIT_LOG_MEDIA_BUILD \n\nmedia_tree:\n$GIT_LOG_MEDIA_TREE \n" > media_build/LE_versions # rename buildfolder mv media_build/ media_build-$GIT_REV/ ################################################################################ # pack sources echo "packing sources ..." tar cvJf media_build-$GIT_REV.tar.xz media_build-$GIT_REV echo "remove temporary sourcedir ..." rm -rf media_build-$GIT_REV ================================================ FILE: tools/mkpkg/mkpkg_pvr ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) # set media_build version you want to use if [ -z "$1" ]; then echo "Usage: $0 crazycat | tbs" exit 0 else MEDIA_BUILD_PROJECT="$1" fi # name of the package DVB_MKPKG_FOLDER="$(pwd)" # crazycat if [ "$MEDIA_BUILD_PROJECT" = "crazycat" ]; then MEDIA_BUILD_URL="https://github.com/crazycat69/media_build.git" MEDIA_TREE_URL="https://github.com/crazycat69/linux_media.git" MEDIA_TREE_BRANCH="latest" MEDIA_BUILD_NAME="crazycat" # tbs oss elif [ "$MEDIA_BUILD_PROJECT" = "tbs" ]; then MEDIA_BUILD_URL="https://github.com/tbsdtv/media_build.git" MEDIA_TREE_URL="https://github.com/tbsdtv/linux_media.git" MEDIA_TREE_BRANCH="latest" MEDIA_BUILD_NAME="tbs" # exit else echo "exit: no valid project" exit 0 fi # remove old files echo "removing old sources ..." rm -rf $MEDIA_BUILD_NAME*/ ################################################################################ # media_build dl echo "getting media_build sources ..." if [ ! -d media_build.git ]; then git clone $MEDIA_BUILD_URL media_build/ fi #get log cd media_build/ git pull git checkout $MEDIA_BUILD_HASH GIT_LOG_MEDIA_BUILD=`git log --pretty=oneline -n1` cd $DVB_MKPKG_FOLDER/ # media_tree dl echo "getting sources ..." if [ ! -d linux_media.git ]; then git clone --depth=1 $MEDIA_TREE_URL -b $MEDIA_TREE_BRANCH media_tree fi #get log cd media_tree/ git pull GIT_LOG_MEDIA_TREE=`git log --pretty=oneline -n1` GIT_REV=`git log -n1 --pretty=format:"%ad" --date=short` # hack/workaround for borked upstream kernel/media_build # without removing atomisp there a lot additional includes that # slowdown build process after modpost from 3min to 6min # even if atomisp is disabled via kernel.conf rm -rf drivers/staging/media/atomisp sed -i 's|^.*drivers/staging/media/atomisp.*$||' $DVB_MKPKG_FOLDER/media_tree/drivers/staging/media/Kconfig cd $DVB_MKPKG_FOLDER/ ################################################################################ # collecting files from media_tree echo "create media_tree tar" cd media_build/linux make tar DIR="$DVB_MKPKG_FOLDER/media_tree/" cd $DVB_MKPKG_FOLDER # cleanup rm -rf media_tree/ rm -rf media_build/.git/ # rename buildfolder mv media_build/ $MEDIA_BUILD_NAME-$GIT_REV/ # log used versions into LE_versions echo "package include: $MEDIA_BUILD_NAME\n media_build commit: $GIT_LOG_MEDIA_BUILD media_build url: $MEDIA_BUILD_URL \n media_tree commit: $GIT_LOG_MEDIA_TREE media_tree url: $MEDIA_TREE_URL \n package date: $(date +%F_%H:%M:%S)" > $MEDIA_BUILD_NAME-$GIT_REV/LE_versions ################################################################################ # pack sources echo "packing sources ..." tar cvJf $MEDIA_BUILD_NAME-$GIT_REV.tar.xz $MEDIA_BUILD_NAME-$GIT_REV echo "remove temporary sourcedir ..." rm -rf $MEDIA_BUILD_NAME-$GIT_REV ================================================ FILE: tools/mkpkg/mkpkg_rtmpdump ================================================ #!/bin/sh # 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) echo "getting sources..." if [ ! -d rtmpdump.git ]; then git clone git://git.ffmpeg.org/rtmpdump rtmpdump.git fi cd rtmpdump.git git pull GIT_REV=`git log -n1 --format=%H` cd .. echo "copying sources..." rm -rf rtmpdump-$GIT_REV cp -R rtmpdump.git rtmpdump-$GIT_REV echo "cleaning sources..." rm -rf rtmpdump-$GIT_REV/.git echo "packing sources..." tar cvJf rtmpdump-$GIT_REV.tar.xz rtmpdump-$GIT_REV echo "remove temporary sourcedir..." rm -rf rtmpdump-$GIT_REV ================================================ FILE: tools/mkpkg/mkpkg_vboxguest ================================================ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) # the script uses 7z to extract the iso to avoid root # sudo apt-get install p7zip-full # set version you want to use if [ -z "$1" ]; then echo "Usage: $0 5.0.123" exit 0 fi VBOX_VERSION="$1" echo "getting sources..." mkdir vbox && cd vbox/ wget http://download.virtualbox.org/virtualbox/${VBOX_VERSION}/VBoxGuestAdditions_${VBOX_VERSION}.iso echo "extracting iso..." 7z e VBoxGuestAdditions_${VBOX_VERSION}.iso VBoxLinuxAdditions.run -r chmod 0755 VBoxLinuxAdditions.run echo "extract VBoxLinuxAdditions.run..." ./VBoxLinuxAdditions.run --tar xf echo "extract VBoxGuestAdditions-amd64..." mkdir xf86-video-virtualbox-${VBOX_VERSION} tar -jxvf VBoxGuestAdditions-amd64.tar.bz2 -C xf86-video-virtualbox-${VBOX_VERSION}/ echo "packing sources..." tar cvJf xf86-video-virtualbox-${VBOX_VERSION}.tar.xz xf86-video-virtualbox-${VBOX_VERSION} mv xf86-video-virtualbox-${VBOX_VERSION}.tar.xz ../xf86-video-virtualbox-${VBOX_VERSION}.tar.xz echo "remove temporary sourcedir..." cd .. rm -rf vbox/ ================================================ FILE: tools/mkpkg/update_adafruit-libraries ================================================ #!/bin/bash -e # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) # set defaults GIT_USERNAME="" GIT_PASSWORD="" # Source in GIT_USERNAME and GIT_PASSWORD to avoid API limitations [ -f ~/.git.conf ] && source ~/.git.conf # set http login for curl CURL_LOGIN="" if [ ! -z "$GIT_USERNAME" -a ! -z "$GIT_PASSWORD" ]; then CURL_LOGIN="--user $GIT_USERNAME:$GIT_PASSWORD" fi # get the realpath to LE Root ROOT=$(realpath $(dirname $(realpath $0))/../../) cd "$ROOT" # make tmp dir mkdir -p $ROOT/mkpkg-temp/adafruit # load adafruit-libraries settings . config/options adafruit-libraries # iterate over all depend packages and try update ADAFRUIT_PACKAGES=$PKG_DEPENDS_TARGET CHANGED="" for PKG in $ADAFRUIT_PACKAGES; do echo -n "check: $PKG... " . config/options $PKG # filter out, all non github packages if [[ $PKG_URL != https://github.com/* ]]; then echo "ignore, not on github" continue fi # get new hash from master branch URL=$(sed "s|\(www\.\)*github.com/|api.github.com/repos/|;s|/archive/.*|/commits/master|" <<< $PKG_URL) GIT_HASH=$(curl --silent --header "Accept: application/vnd.github.v3.sha" $CURL_LOGIN $URL) # check rate limit if [[ "$GIT_HASH" == *rate\ limit* ]]; then echo "abort, rate limit of api reached. try later or use your github account" exit 1 fi # compare hash if [ $PKG_VERSION == $GIT_HASH ]; then echo "unchanged" continue fi # replace old with new hash sed "s|^PKG_VERSION=.*$|PKG_VERSION=\"${GIT_HASH}\"|" -i ${PKG_DIR}/package.mk echo -n "updated to $GIT_HASH " CHANGED="${CHANGED}#$PKG_SHORTDESC" # get new package . config/options $PKG TMP_FILE=$ROOT/mkpkg-temp/adafruit/pkg wget --timeout=30 --tries=3 --passive-ftp --no-check-certificate -c -q -O $TMP_FILE $PKG_URL # calc new sha256 and replace the old NEW_SHA256="$(sha256sum $TMP_FILE | cut -d" " -f1)" sed "s|^PKG_SHA256=.*$|PKG_SHA256=\"${NEW_SHA256}\"|" -i ${PKG_DIR}/package.mk echo "(sha: ${NEW_SHA256})" # remove tmp download rm -f $TMP_FILE done # prepare revision and changelog . config/options adafruit-libraries if [ ! -z "$CHANGED" ]; then # revision REV=$(( $PKG_REV + 1 )) echo "increase revision $PKG_REV -> $REV" sed "s|^PKG_REV=.*$|PKG_REV=\"${REV}\"|" -i ${PKG_DIR}/package.mk # changelog echo -en "${REV}\n updated libraries:" > ${PKG_DIR}/changelog.txt.new sed "s|#|\n - |g" <<< ${CHANGED} >> ${PKG_DIR}/changelog.txt.new echo "" >> ${PKG_DIR}/changelog.txt.new cat ${PKG_DIR}/changelog.txt >> ${PKG_DIR}/changelog.txt.new mv ${PKG_DIR}/changelog.txt.new ${PKG_DIR}/changelog.txt fi # cleanup temp rm -rf $ROOT/mkpkg-temp/adafruit ================================================ FILE: tools/mkpkg/update_binary-addons ================================================ #!/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) BUMP_PKG_REV="" KEEP_GIT_DIRS="yes" usage() { echo "Usage: $0 [options] <kodi-branch> [<unofficial-addon-branch>]" echo " -b, --bump-pkg-rev: bump PKG_REV if package was not updated" echo " -d, --delete-git-dirs: delete cloned git dirs after update" echo " -h, --help: display help and exit" exit 1 } while [ $# -ne 0 ]; do case "$1" in -b|--bump-pkg-rev) BUMP_PKG_REV="yes" shift ;; -d|--delete-git-dirs) KEEP_GIT_DIRS="" shift ;; -h|--help) usage exit 1 ;; -*) echo "illegal option $1" usage exit 1 ;; *) break ;; esac done if [ $# -eq 0 -o $# -gt 2 ]; then usage exit 1 fi # list of packages to exclude from update EXCLUDED_PACKAGES="vfs.sacd" MY_DIR="$(dirname "$0")" ROOT="$(cd "${MY_DIR}"/../.. && pwd)" TMPDIR="$(pwd)/.update-binary-addons-tmp" TMP_PKG_FILE="${TMPDIR}/package.tar.gz" TMP_PKG_DIR="${TMPDIR}/package" rm -rf "${TMPDIR}" mkdir -p "${TMPDIR}" KODI_BRANCH="$1" KODI_DIR="kodi.git" if [ $# -eq 1 ]; then UNOFFICIAL_ADDON_BRANCH="${KODI_BRANCH}" else UNOFFICIAL_ADDON_BRANCH="$2" fi . "${MY_DIR}/update_common_functions" get_gh_token if [ -z "${GITHUB_API_TOKEN}" ]; then git_clone https://github.com/xbmc/xbmc ${KODI_DIR} ${KODI_BRANCH} ADDONS_REPO_LOCATION="${KODI_DIR}/cmake/addons/bootstrap/repositories" else # check if depends are available command -v curl >/dev/null 2>&1 || die "please install curl" command -v jq >/dev/null 2>&1 || die "please install jq" TMP_REPO_DIR="${TMPDIR}/bootstrap-repos" curl -s -L -H "Authorization: token ${GITHUB_API_TOKEN}" \ "https://api.github.com/repos/xbmc/xbmc/contents/cmake/addons/bootstrap/repositories?ref=${KODI_BRANCH}" | awk \ '/download_url/ { gsub("\"|,", "", $2); system("mkdir -p '${TMP_REPO_DIR}'; (cd '${TMP_REPO_DIR}'; curl -O "$2")"); }' \ 2>/dev/null ADDONS_REPO_LOCATION=${TMP_REPO_DIR} fi if ! ls ${ADDONS_REPO_LOCATION}/*-addons.txt &> /dev/null; then echo "No binary addon repo description found, nothing to do!" echo "Path searched: ${ADDONS_REPO_LOCATION}" exit 0 fi # addons for addontxt in ${ADDONS_REPO_LOCATION}/*-addons.txt ; do ADDONS=$(cat $addontxt | awk '{print $1}') ADDONS_GIT_DIR="${ADDONS}.git" ADDONS_GIT_REPO=$(cat $addontxt | awk '{print $2}') ADDONS_GIT_BRANCH=$(cat $addontxt | awk '{print $3}') git_clone $ADDONS_GIT_REPO $ADDONS_GIT_DIR ${ADDONS_GIT_BRANCH} for addon in $ADDONS_GIT_DIR/*.*/ ; do ADDON=$(basename $addon) [[ ${ADDON} =~ ^game.* ]] && continue # ignore game.* addons - handled by update_retroplayer-addons check_package_excluded "${ADDON}" "${EXCLUDED_PACKAGES}" && continue GIT_DIR="${ADDON}.git" GIT_REPO=$(cat ${addon}/${ADDON}.txt | awk '{print $2}') GIT_BRANCH=$(cat ${addon}/${ADDON}.txt | awk '{print $3}') if ! grep -q all ${addon}/platforms.txt && ! grep -q linux ${addon}/platforms.txt && ! grep -q ! ${addon}/platforms.txt; then continue fi ADDON_PATH="${ROOT}/packages/mediacenter/kodi-binary-addons/${ADDON}/" if [ -f "${ADDON_PATH}/package.mk" ] ; then # Verify the Kodi repo matches our package repo # If different, ignore the addon and process it later as an "unofficial" addon validate_pkg_url "${ADDON}" "${GIT_REPO}" || continue NO_TAG="" if [ -z "${GITHUB_API_TOKEN}" ]; then git_clone ${GIT_REPO} ${GIT_DIR} ${GIT_BRANCH} PARAMS="resolve_tag_in_branch ${GIT_DIR} ${GIT_BRANCH}" else REPO=$(basename "${GIT_REPO}") OWNER=$(basename "${GIT_REPO%/${REPO}*}") PARAMS="resolve_tag_on_gh ${OWNER} ${REPO} ${GIT_BRANCH}" fi NEW_VERSION=$(${PARAMS}) if [ -z "${NEW_VERSION}" ]; then NO_TAG="yes" echo "========================================================================" msg_warn "WARNING: no tag found for addon ${ADDON}, falling back to HEAD" echo "========================================================================" if [ -z "${GITHUB_API_TOKEN}" ]; then PARAMS="resolve_hash_in_branch ${GIT_DIR} ${GIT_BRANCH}" else PARAMS="resolve_hash_on_gh ${GIT_REPO} ${GIT_BRANCH}" fi NEW_VERSION=$(${PARAMS}) fi echo "Resolved version for ${ADDON}: ${GIT_BRANCH} => ${NEW_VERSION}" if update_pkg "${ADDON_PATH}" ${ADDON} ${NEW_VERSION}; then if [ -n "${NO_TAG}" ]; then # always bump PKG_REV on updates as we have no info if version changed bump_pkg_rev "${ADDON_PATH}" "${ADDON}" else reset_pkg_rev "${ADDON_PATH}" "${ADDON}" fi else [ "${BUMP_PKG_REV}" = "yes" ] && bump_pkg_rev "${ADDON_PATH}" "${ADDON}" fi if [ "${KEEP_GIT_DIRS}" != "yes" ]; then [ -d "${GIT_DIR}" ] && rm -rf "${GIT_DIR}" fi else echo "[mkpkg] Skipped $ADDON" SKIPPED_ADDONS="$SKIPPED_ADDONS $ADDON" fi PROCESSED="${PROCESSED}${ADDON}\n" done if [ "${KEEP_GIT_DIRS}" != "yes" ]; then [ -d "${ADDONS_GIT_DIR}" ] && rm -rf "${ADDONS_GIT_DIR}" fi echo echo "The following addons were skipped, please add packages for these addons:" echo "[${SKIPPED_ADDONS}]" echo done # finally, any other unofficial addons for ADDON in $(ls -1 "${ROOT}/packages/mediacenter/kodi-binary-addons"); do [[ ${ADDON} =~ ^game.* ]] && continue # ignore game.* addons - handled by update_retroplayer-addons # ignore already processed addons echo -e "${PROCESSED}" | grep -qE "^${ADDON}$" && continue check_package_excluded "${ADDON}" "${EXCLUDED_PACKAGES}" && continue ADDON_PATH="${ROOT}/packages/mediacenter/kodi-binary-addons/${ADDON}/" # Obtain git url - ignore if not a suitable repo GIT_DIR="${ADDON}.git" GIT_REPO="$(geturl "${ADDON}")" || continue if [ -z "${GITHUB_API_TOKEN}" ]; then git_clone ${GIT_REPO} ${GIT_DIR} RESOLVE_UNOFFICIAL_BRANCH="resolve_hash_in_branch ${ADDON}.git ${UNOFFICIAL_ADDON_BRANCH}" RESOLVE_HEAD="resolve_hash_in_branch ${ADDON}.git HEAD" else RESOLVE_UNOFFICIAL_BRANCH="resolve_hash_on_gh ${GIT_REPO%.git} ${UNOFFICIAL_ADDON_BRANCH}" RESOLVE_HEAD="resolve_hash_on_gh ${GIT_REPO%.git} HEAD" fi if RESOLVED_HASH=$(${RESOLVE_UNOFFICIAL_BRANCH}); then echo "Resolved hash for ${ADDON}: ${UNOFFICIAL_ADDON_BRANCH} => ${RESOLVED_HASH}" elif RESOLVED_HASH=$(${RESOLVE_HEAD}); then echo "Resolved hash for ${ADDON}: HEAD => ${RESOLVED_HASH}" else msg_warn "WARNING: Could not resolve hash for ${ADDON}" continue fi if update_pkg "${ADDON_PATH}" "${ADDON}" "${RESOLVED_HASH}"; then # always bump PKG_REV when updating untagged addons bump_pkg_rev "${ADDON_PATH}" "${ADDON}" else [ "${BUMP_PKG_REV}" = "yes" ] && bump_pkg_rev "${ADDON_PATH}" "${ADDON}" fi if [ "${KEEP_GIT_DIRS}" != "yes" ]; then [ -d "${GIT_DIR}" ] && rm -rf ${GIT_DIR} fi done rm -rf "${TMPDIR}" [ -d "${TMP_REPO_DIR}" ] && rm -rf "${TMP_REPO_DIR}" ================================================ FILE: tools/mkpkg/update_common_functions ================================================ # 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) msg_color() { echo $( cd "${ROOT}" PROJECT="${PROJECT:-Generic}" ARCH="${ARCH:-x86_64}" . config/options "" echo $(print_color "$1" "$2") ) } msg_warn() { msg_color CLR_WARNING "$1" } msg_error() { msg_color CLR_ERROR "$1" } msg_info() { echo "$1" } git_clone() { # git_clone https://repo.url target_dir [branch] echo "[mkpkg] Checking out $1 ..." if [ ! -d "$2" ]; then git clone "$1" "$2" else cd "$2" git fetch cd .. fi if [ -n "$3" ]; then cd "$2" git checkout -q origin/"$3"; cd .. fi } get_pkg_var() { local pkg_name="$1" pkg_var="$2" cd "${ROOT}" PROJECT="${PROJECT:-Generic}" ARCH="${ARCH:-x86_64}" source config/options "${pkg_name}" &>/dev/null echo "${!pkg_var}" } resolve_hash() { if [ -d "$1" ] ; then cd "$1" git rev-parse "$2" 2>/dev/null fi } resolve_hash_in_branch() { if [ -d "$1" ] ; then cd "$1" git rev-parse "origin/$2" 2>/dev/null fi } resolve_hash_on_gh() { curl -s -L -H "Authorization: token ${GITHUB_API_TOKEN}" \ -H "Accept: application/vnd.github.VERSION.sha" \ "${1/*github.com/https:\/\/api.github.com\/repos}/commits/$2" } resolve_tag_in_branch() { local tag tags if [ -d "$1" ] ; then cd "$1" tag=$(git describe --abbrev=0 --tags "origin/$2" 2>/dev/null) if [ -z "${tag}" ]; then return fi tags=( $(git tag --points-at "${tag}" | sort -r -n) ) if [ $# -eq 3 -a ${#tags[@]} -gt 1 ]; then for tag in "${tags[@]}"; do if [[ "${tag}" =~ $3 ]]; then echo "$tag" return fi done fi echo "${tags[0]}" fi } resolve_tag_on_gh() { local tag local QUERY=$(tr '\n' ' ' <<EOF { repository(owner: \\"${1}\\", name: \\"${2}\\") { refs(refPrefix: \\"refs/tags/\\", first: 100, orderBy: {field: TAG_COMMIT_DATE, direction: DESC}) { edges { node { name } } } } } EOF ) tag=$(curl -s -L -H 'Content-Type: application/json' \ -H "Authorization: bearer ${GITHUB_API_TOKEN}" \ -X POST -d "{ \"query\": \"${QUERY}\" }" https://api.github.com/graphql | \ jq -r '[.data.repository.refs.edges[] | select(.node.name | contains("'${3}'"))][0].node.name | select (.!=null)') echo "${tag}" } check_package_excluded() { local package="$1" packages_to_exclude="$2" pkg [ -z "${package}" -o -z "${packages_to_exclude}" ] && return 1 if [[ ${packages_to_exclude} =~ (^|[[:space:]])${package}($|[[:space:]]) ]]; then msg_info "SKIPPING excluded package ${package}" return 0 fi return 1 } # args: path var value set_pkg_var() { local package_mk="$1/package.mk" pkg_var="$2" pkg_value="$3" sed -e "s|${pkg_var}=.*|${pkg_var}=\"${pkg_value}\"|" -i "${package_mk}" } set_pkg_version() { set_pkg_var "$1" "PKG_VERSION" "$2" } download_pkg_file() { local pkg_name="$1" local pkg_url=$(get_pkg_var "${pkg_name}" PKG_URL) wget -q -O "${TMP_PKG_FILE}" "${pkg_url}" } extract_pkg_file() { mkdir -p "${TMP_PKG_DIR}" tar xf "${TMP_PKG_FILE}" --strip-components=1 -C "${TMP_PKG_DIR}" } cleanup_pkg_tmp() { rm -rf "${TMP_PKG_FILE}" "${TMP_PKG_DIR}" } set_pkg_sha256() { local new_sha256=$(sha256sum < "${TMP_PKG_FILE}" | awk '{print $1}') set_pkg_var "$1" "PKG_SHA256" "${new_sha256}" } bump_pkg_rev() { local pkg_name="$2" local pkg_rev=$(get_pkg_var "${pkg_name}" PKG_REV) local new_pkg_rev=$((pkg_rev+1)) set_pkg_var "$1" "PKG_REV" "${new_pkg_rev}" msg_info "BUMPED ${pkg_name} PKG_REV from ${pkg_rev} to ${new_pkg_rev}" } reset_pkg_rev() { local pkg_name="$2" local pkg_rev=$(get_pkg_var "${pkg_name}" PKG_REV) local new_pkg_rev="1" set_pkg_var "$1" "PKG_REV" "${new_pkg_rev}" msg_info "RESET ${pkg_name} PKG_REV from ${pkg_rev} to ${new_pkg_rev}" } update_pkg() { local pkg_path="$1" pkg_name="$2" pkg_version="$3" local old_version pkg_url new_sha256 pkg_rev old_version=$(get_pkg_var "${pkg_name}" PKG_VERSION) if [ "${old_version}" != "${pkg_version}" ]; then [ -n "${pkg_version}" ] && set_pkg_version "${pkg_path}" "${pkg_version}" download_pkg_file "${pkg_name}" set_pkg_sha256 "${pkg_path}" msg_info "UPDATED ${pkg_name} from ${old_version} to ${pkg_version}" return 0 else return 1 fi } update_pkg_and_url() { local pkg_path="$1" pkg_name="$2" pkg_version="$3" pkg_url="$4" local old_version old_url new_sha256 local changed=0 old_url=$(grep "^PKG_URL=" "${pkg_path}/package.mk" | sed -e 's|^PKG_URL="||' -e 's|"$||') if [ "${old_url}" != "${pkg_url}" ]; then set_pkg_var "${pkg_path}" "PKG_URL" "${pkg_url}" msg_info "CHANGED ${pkg_name} PKG_URL from ${old_url} to ${pkg_url}" changed=1 fi old_version=$(get_pkg_var "${pkg_name}" PKG_VERSION) if [ "${old_version}" != "${pkg_version}" ]; then set_pkg_var "${pkg_path}" "PKG_VERSION" "${pkg_version}" msg_info "UPDATED ${pkg_name} from ${old_version} to ${pkg_version}" changed=1 fi if [ $changed -eq 1 ]; then download_pkg_file "${pkg_name}" set_pkg_sha256 "${pkg_path}" return 0 else return 1 fi } # Get url in git:// notation for a package.mk, assuming it is a github.com url # Return 1 if not a github domain geturl() { local addon="$1" local domain owner repo PKG_URL PKG_URL="$(get_pkg_var "${addon}" PKG_URL)" domain="$(echo "${PKG_URL}" | cut -d/ -f3)" [ "${domain}" = "github.com" ] || return 1 owner="$(echo "${PKG_URL}" | cut -d/ -f4)" repo="$(echo "${PKG_URL}" | cut -d/ -f5)" echo "git://${domain}/${owner}/${repo}.git" return 0 } # For the specified addon, verify that the package url # matches the url retrieved from Kodi validate_pkg_url() { local addon="$1" url1="$2" local domain owner repo url2 domain="$(echo "${url1}" | cut -d/ -f3)" owner="$(echo "${url1}" | cut -d/ -f4)" repo="$(echo "${url1}" | cut -d/ -f5)" url1="git://${domain}/${owner}/${repo}.git" url2="$(geturl "${addon}")" [ "${url1}" = "${url2}" ] && return 0 || return 1 } # Get user Github token if available get_gh_token() { if [ -z "${GITHUB_API_TOKEN}" ]; then GITHUB_API_TOKEN=$(get_pkg_var "" GITHUB_API_TOKEN) fi } ================================================ FILE: tools/mkpkg/update_retroplayer-addons ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) BUMP_PKG_REV="" FORCE_LIBRETRO_BUMP="" KEEP_GIT_DIRS="yes" usage() { echo "Usage: $0 [options] <kodi-branch> [<tag-suffix>]" echo " -b, --bump-pkg-rev: bump PKG_REV if package was not updated" echo " -d, --delete-git-dirs: delete cloned git dirs after update" echo " -f, --force-libretro-bump: check for new libretro package" echo " even if kodi game package version has not changed" echo " -h, --help: display help" } while [ $# -ne 0 ]; do case "$1" in -b|--bump-pkg-rev) BUMP_PKG_REV="yes" shift ;; -d|--delete-git-dirs) KEEP_GIT_DIRS="" shift ;; -f|--force-libretro-bump) FORCE_LIBRETRO_BUMP="yes" shift ;; -h|--help) usage exit 1 ;; -*) echo "illegal option $1" usage exit 1 ;; *) break ;; esac done if [ $# -eq 0 -o $# -gt 2 ]; then usage exit 1 fi KODI_BRANCH="$1" if [ $# -eq 2 ]; then TAG_SUFFIX="$2" else TAG_SUFFIX="${KODI_BRANCH}" fi # list of packages to exclude from update EXCLUDED_PACKAGES="game.libretro.chailove game.libretro.fbalpha2012 game.libretro.lutro game.libretro.parallel_n64 game.libretro.pcem game.libretro.picodrive game.libretro.theodore game.netplay game.shader.presets" MY_DIR="$(dirname "$0")" ROOT="$(cd "${MY_DIR}"/../.. && pwd)" TMPDIR="$(pwd)/.update-retroplayer-tmp" TMP_PKG_FILE="${TMPDIR}/package.tar.gz" TMP_PKG_DIR="${TMPDIR}/package" rm -rf "${TMPDIR}" mkdir -p "${TMPDIR}" . "${MY_DIR}/update_common_functions" get_gh_token # check if depends are available if [ -n "${GITHUB_API_TOKEN}" ]; then command -v curl >/dev/null 2>&1 || die "please install curl" command -v jq >/dev/null 2>&1 || die "please install jq" fi ADDONS="game-binary-addons" ADDONS_DIR="${ADDONS}.git" ADDONS_REPO="https://github.com/kodi-game/repo-binary-addons.git" git_clone ${ADDONS_REPO} ${ADDONS_DIR} ${KODI_BRANCH} for addon in ${ADDONS_DIR}/*.*/ ; do GAME_ADDON=$(basename ${addon}) [[ "${GAME_ADDON}" =~ ^game. ]] || continue check_package_excluded "${GAME_ADDON}" "${EXCLUDED_PACKAGES}" && continue if ! grep -q all $addon/platforms.txt && ! grep -q linux $addon/platforms.txt && ! grep -q ! $addon/platforms.txt; then continue fi GAME_GIT_DIR="${GAME_ADDON}.git" GAME_GIT_REPO=$(cat $addon/${GAME_ADDON}.txt | awk '{print $2}') GAME_GIT_BRANCH=$(cat $addon/${GAME_ADDON}.txt | awk '{print $3}') GAME_PATH="${ROOT}/packages/mediacenter/kodi-binary-addons/${GAME_ADDON}" if [ ! -d "$GAME_PATH" ] ; then msg_warn "SKIPPING ${GAME_ADDON}, not present in LE" continue fi if [[ "${GAME_ADDON}" =~ ^game.libretro. ]]; then RETRO_NAME="${GAME_ADDON#game.libretro.}" RETRO_ADDON="libretro-${RETRO_NAME}" RETRO_PATH="${ROOT}/packages/emulation/${RETRO_ADDON}" else RETRO_NAME="" RETRO_ADDON="" RETRO_PATH="" fi BUMPED_ADDON="" BUMPED_RETRO="" NO_TAG="" CHECK_RETRO="" if [ -z "$GITHUB_API_TOKEN" ]; then git_clone "${GAME_GIT_REPO}" "${GAME_GIT_DIR}" if [ -n "${TAG_SUFFIX}" ]; then GAME_NEW_VERSION=$(resolve_tag_in_branch "${GAME_GIT_DIR}" "${GAME_GIT_BRANCH}" ".*-${TAG_SUFFIX}$") else GAME_NEW_VERSION=$(resolve_tag_in_branch "${GAME_GIT_DIR}" "${GAME_GIT_BRANCH}") fi else REPO=$(basename "${GAME_GIT_REPO}") OWNER=$(basename "${GAME_GIT_REPO%/${REPO}*}") if [ -n "${TAG_SUFFIX}" ]; then GAME_NEW_VERSION=$(resolve_tag_on_gh "${OWNER}" "${REPO}" "-${TAG_SUFFIX}") else GAME_NEW_VERSION=$(resolve_tag_on_gh "${OWNER}" "${REPO}") fi fi if [ -z "${GAME_NEW_VERSION}" ]; then NO_TAG="yes" echo "========================================================================" msg_warn "WARNING: no tag found for addon ${GAME_ADDON}, falling back to HEAD" echo "========================================================================" if [ -z "$GITHUB_API_TOKEN" ]; then GAME_NEW_VERSION=$(resolve_hash_in_branch "${GAME_GIT_DIR}" "${GAME_GIT_BRANCH}") else GAME_NEW_VERSION=$(resolve_hash_on_gh "${GAME_GIT_REPO}" "${GAME_GIT_BRANCH}") fi fi if [ "${KEEP_GIT_DIRS}" != "yes" ]; then rm -rf "${GAME_GIT_DIR}" fi if update_pkg "${GAME_PATH}" "${GAME_ADDON}" "${GAME_NEW_VERSION}"; then BUMPED_ADDON="yes" [ -n "${RETRO_NAME}" ] && CHECK_RETRO="yes" else if [ -n "${FORCE_LIBRETRO_BUMP}" -a -n "${RETRO_NAME}" ]; then download_pkg_file "${GAME_ADDON}" CHECK_RETRO="yes" fi fi if [ -n "${CHECK_RETRO}" ]; then if [ ! -d "${RETRO_PATH}" ]; then msg_error "ERROR: ${RETRO_PATH} doesn't exist" cleanup_pkg_tmp exit 1 fi extract_pkg_file RETRO_VERSION_FILE="${TMP_PKG_DIR}/depends/common/${RETRO_NAME}/${RETRO_NAME}.txt" if [ ! -f "${RETRO_VERSION_FILE}" ]; then msg_error "ERROR: ${RETRO_VERSION_FILE} does not exist" cleanup_pkg_tmp exit 1 fi VERSION_INFO=$(grep "^${RETRO_NAME}" "${RETRO_VERSION_FILE}" | head -1) if [[ "$VERSION_INFO" =~ github\.com/[^/]+/[^/]+/archive/[^/]+\.tar\..*$ ]] ; then # version referenced by githash RETRO_NEW_VERSION=$(echo "${VERSION_INFO}" | sed -E -e 's|^(.+/archive/)([^/]+)(\.tar.*)$|\2|') RETRO_NEW_REPO=$(echo "${VERSION_INFO}" | sed -E -e 's|^(.+github\.com/)([^/]+/[^/]+)(/archive/.*)$|\2|') RETRO_NEW_URL="https://github.com/${RETRO_NEW_REPO}/archive/\${PKG_VERSION}.tar.gz" else msg_warn "UNSUPPORTED ${RETRO_ADDON} version info, update manually: ${VERSION_INFO}" RETRO_NEW_VERSION="" RETRO_NEW_REPO="" RETRO_NEW_URL="" fi if [ -n "${RETRO_NEW_VERSION}" ] && update_pkg_and_url "${RETRO_PATH}" "${RETRO_ADDON}" "${RETRO_NEW_VERSION}" "${RETRO_NEW_URL}"; then BUMPED_RETRO="yes" fi fi if [ -n "${NO_TAG}" ]; then # always bump PKG_REV on updates as we have no info if version changed if [ -n "${BUMPED_ADDON}" -o -n "${BUMPED_RETRO}" -o -n "${BUMP_PKG_REV}" ]; then bump_pkg_rev "${GAME_PATH}" "${GAME_ADDON}" fi else if [ -n "${BUMPED_ADDON}" ]; then # reset PKG_REV if version changed reset_pkg_rev "${GAME_PATH}" "${GAME_ADDON}" else # if addon version is unchanged but libretro changed bump PKG_REV if [ -n "${BUMPED_RETRO}" -o -n "${BUMP_PKG_REV}" ]; then bump_pkg_rev "${GAME_PATH}" "${GAME_ADDON}" fi fi fi cleanup_pkg_tmp done msg_info "Checking for orphaned addon packages in LE" for addon in ${ROOT}/packages/mediacenter/kodi-binary-addons/game.libretro.* ; do GAME_ADDON=$(basename ${addon}) if [ ! -d "${ADDONS_DIR}/${GAME_ADDON}" ] ; then msg_warn "ORHPANED ${GAME_ADDON}, not present in kodi game repo" fi done rm -rf "${TMPDIR}" ================================================ FILE: tools/mtstats.py ================================================ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) import sys, os, codecs, datetime, time import copy ALL_STATUSES = ["ACTIVE", "FAILED", "GETPKG", "IDLE", "LOCKED", "MUTEX", "MUTEX/W", "STALLED", "UNLOCK"] BUSY_STATUSES = ["ACTIVE", "MUTEX", "GETPKG"] STALLED_STATUSES = ["STALLED", "MUTEX/W"] EPOCH = datetime.datetime(1970, 1, 1) MAXSLOTS = None class HistoryEvent: def __init__(self, event): # squash spaces, then split by space items = ' '.join(event.replace("\n", "").split()).split(" ") self.datetime = "%s %s" % (items[0], items[1][:-4]) (self.slot, self.seq) = items[3][1:-1].split("/") self.status = items[4] self.task = items[5] if len(items) > 5 else "" self.task = items[5] if len(items) > 5 else "" self.package = items[6] if len(items) > 6 else "" self.msg = ' '.join(items[7:]) if len(items) > 7 else "" self.secs = None def __repr__(self): return "%s; %s; %s; %s; %s; %s; %s;" % (self.datetime, self.slot, self.seq, self.status, self.task, self.package, self.msg) def get_time_secs(self): if self.secs == None: self.secs = (datetime.datetime.strptime(self.datetime, "%Y-%m-%d %H:%M:%S.%f") - EPOCH).total_seconds() return self.secs def isConfig(self): return (self.task == "config") def getConfig(self, item, default=None): if self.isConfig(): pairs = self.msg.split(";") for pair in pairs: (key, value) = pair.split("=") if key == item: return(value) return default def calc_pct(a, b): if b > 0.0: return (a / b) * 100 else: return 0.0 def pct_brackets(pct): spct = "%04.1f" % pct if float(spct) >= 100.0: return "( %s%%)" % spct[:-2] else: return "(%s%%)" % spct def secs_to_hms(seconds, blankzero=False): hours = "%02d" % int(seconds / 3600) mins = "%02d" % int(seconds / 60 % 60) secs = "%06.3f" % (seconds % 60) if blankzero and hours == "00": hours = " " if mins == "00": mins = " " return "%2s:%2s:%s" % (hours, mins, secs) def get_busy_total(slot): return summary[slot]["busy"]["total"] def get_concurrent_val(concurrent): return concurrency[concurrent]["total"] #--------------------------- events = [] for event in sys.stdin: events.append(HistoryEvent(event)) if len(events) > 0 and events[0].isConfig(): MAXSLOTS = events[0].getConfig("slots") del events[0] if len(events) == 0: sys.exit(1) started = events[0].get_time_secs() ended = events[-1].get_time_secs() now = time.time() last_active = ended incomplete = False concurrency = {} active = peak = 0 slotn = {} if MAXSLOTS: for s in range(1, int(MAXSLOTS) + 1): slotn["%0*d" % (len(events[0].slot),s)] = 0 else: for event in events: slotn[event.slot] = 0 # Acumulate information in this hash - meh data = {"previous_status": None, "isactive": False, "statuses": {}} for status in ALL_STATUSES: data["statuses"][status] = {"enabled": False, "count": 0, "start": 0.0, "total": 0.0} data["statuses"]["IDLE"]["start"] = started # For each slot allocate data storage slots = {} for slot in slotn: slots[slot] = copy.deepcopy(data) # Process all events, accumulating counts and elapsed time for each status by slot for event in events: slot = slots[event.slot] # Record accumulated time for the previous event previous = slot["previous_status"] if previous and slot["statuses"][previous]["enabled"] == True: prev_status = slot["statuses"][previous] prev_status["enabled"] = False prev_status["total"] += (event.get_time_secs() - prev_status["start"]) # Determine max concurrency if event.status in BUSY_STATUSES: if previous == None or previous not in BUSY_STATUSES: active += 1 concurrent = concurrency.get(active, {"start": 0.0, "total": 0.0}) concurrent["start"] = event.get_time_secs() concurrency[active] = concurrent if active > peak: peak = active elif previous in BUSY_STATUSES: concurrency[active]["total"] += (event.get_time_secs() - concurrency[active]["start"]) active -= 1 # Record details for the new event this_status = slot["statuses"][event.status] this_status["enabled"] = True this_status["count"] += 1 this_status["start"] = event.get_time_secs() slot["previous_status"] = event.status # If any slots remain active then either the build has failed or the build is # ongoing in which case "close" the active slots with the current time. # For IDLE states, "close" the event with the elapsed time to the last known event. for slot in slots: for status in slots[slot]["statuses"]: if status == "IDLE": if slots[slot]["statuses"]["FAILED"]["enabled"] == True: slots[slot]["statuses"][status]["total"] += (last_active - slots[slot]["statuses"]["FAILED"]["start"]) else: slots[slot]["statuses"][status]["total"] += (last_active - slots[slot]["statuses"][status]["start"]) elif slots[slot]["statuses"][status]["enabled"] == True: if status != "FAILED": incomplete = True slots[slot]["isactive"] = True slots[slot]["statuses"][status]["total"] += (now - slots[slot]["statuses"][status]["start"]) ended = now # Summarise slot data by various criteria summary = {} cumulative_count = cumulative_total = 0 for slot in slots: acount = atotal = 0 scount = stotal = 0 ccount = ctotal = 0 for status in BUSY_STATUSES: if status in slots[slot]["statuses"]: acount += slots[slot]["statuses"][status]["count"] atotal += slots[slot]["statuses"][status]["total"] for status in STALLED_STATUSES: if status in slots[slot]["statuses"]: scount += slots[slot]["statuses"][status]["count"] stotal += slots[slot]["statuses"][status]["total"] for status in slots[slot]["statuses"]: ccount += slots[slot]["statuses"][status]["count"] ctotal += slots[slot]["statuses"][status]["total"] cumulative_count += ccount cumulative_total += ctotal summary[slot] = {"busy": {"count": acount, "total": atotal}, "stalled": {"count": scount, "total": stotal}, "cumulative": {"count": ccount, "total": ctotal}} # Accumulate stalled stats stalled_count = stalled_total = 0 for slot in summary: stalled_count += summary[slot]["stalled"]["count"] stalled_total += summary[slot]["stalled"]["total"] elapsed = (ended - started) print("Total Build Time: %s (wall clock)" % secs_to_hms(elapsed, blankzero=False)) print("Accum Build Time: %s (%d slots)\n" % (secs_to_hms(cumulative_total, blankzero=False), len(slots))) if incomplete: print("*** WARNING: active slots detected - build may be in progress/incomplete ***\n") cum_total = 0.0 print("Breakdown by status (all slots):\n") print(" Status Usage ( Pct ) Count State") for status in sorted(ALL_STATUSES): total = 0 count = 0 for slot in slots: if status in slots[slot]["statuses"]: count += slots[slot]["statuses"][status]["count"] total += slots[slot]["statuses"][status]["total"] pct = calc_pct(total, cumulative_total) cum_total += total if status in BUSY_STATUSES: stype = "busy" elif status in STALLED_STATUSES: stype = "stall" else: stype = "" print(" %-7s %12s %-7s %-5d %-5s" % (status, secs_to_hms(total, blankzero=True), pct_brackets(pct), count, stype)) print(" -------------------------------------") print(" %-7s %12s %-7s %-5d" % ("TOTAL", secs_to_hms(cumulative_total, blankzero=True), \ pct_brackets(calc_pct(cum_total, cumulative_total)), cumulative_count)) print("") print("Peak concurrency: %d out of %d slots\n" % (peak, len(slots))) print("%d job slots were held in a \"stall\" state for %s\n" % (stalled_count, secs_to_hms(stalled_total))) print('Slot usage (time in a "busy" state): | Concurrency breakdown ("busy"):') print(" |") print("#Rank Slot Usage ( Pct ) | # of Slots Usage ( Pct )") lines = [] busy_total = 0 for rank, slot in enumerate(sorted(summary, key=get_busy_total, reverse=True)): pct = calc_pct(summary[slot]["busy"]["total"], cumulative_total) state = "active" if slots[slot]["isactive"] == True else " " stime = secs_to_hms(summary[slot]["busy"]["total"], blankzero=True) busy_total += summary[slot]["busy"]["total"] lines.append("%s %s %-7s %6s |" % (slot, stime, pct_brackets(pct), state)) concurrent_total = 0 for rank, concurrentn in enumerate(sorted(concurrency, key=get_concurrent_val, reverse=True)): concurrent = concurrency[concurrentn] pct = calc_pct(concurrent["total"], cumulative_total) stime = secs_to_hms(concurrent["total"], blankzero=True) concurrent_total += concurrent["total"] lines[rank] += " %02d %s %-7s" % (concurrentn, stime, pct_brackets(pct)) for rank, line in enumerate(lines): print(" #%02d %s" % (rank + 1, line)) print("-----------------------------------------+---------------------------------") print(" TOTALS %s %-7s %s %-7s" % (secs_to_hms(busy_total, blankzero=True), pct_brackets(calc_pct(busy_total, cumulative_total)), secs_to_hms(concurrent_total, blankzero=True), pct_brackets(calc_pct(concurrent_total, cumulative_total)))) ================================================ FILE: tools/packages-checker ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-2021 Ian Leonard (antonlacon@gmail.com) # This performs an automated scan with corrections to the packages feed to # follow certain coding standards used in the project. Corrections are grouped # by the subdirectory within the packages feed, and then commited. # Corrections made: # PKG_VAR="$PKG_VAR stuff" -> PKG_VAR+=" stuff" # $PKG_VAR -> ${PKG_VAR} # result=`subcommand` -> result=$(subcommand) # [ test ] ; then -> [ test ]; then # trailing whitespace at end of line for directory in $(find packages/ -mindepth 1 -maxdepth 1 -type d | sort); do for file in $(find "${directory}" -type f -name "package.mk" | sort); do tools/fixlecode.py -qw -f "${file}" sed -i 's/[[:blank:]]*$//g' "${file}" done git commit -qs -m "${directory##*/}: automated code cleanup" "${directory}" done ================================================ FILE: tools/pkgcheck ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) TXRED="$(tput setaf 1 bold)" TXGREEN="$(tput setaf 2 bold)" TXYELLOW="$(tput setaf 3 bold)" TXBLUE="$(tput setaf 4 bold)" TXMAGENTA="$(tput setaf 5 bold)" TXCYAN="$(tput setaf 6 bold)" TXRESET="$(tput sgr0)" TXCLR="$(tput el)" log() { local filename="$1" lc=$2 level="$3" msg="$4" data="$5" local txcolour flc colw [ "${level}" = "FAIL" ] && txcolour="${TXRED}" || txcolour="${TXYELLOW}" [[ ${filename} =~ ^\./ ]] && filename="${filename:2}" [ ${lc} -eq 0 ] && flc="---" || flc="$(printf "%03d" ${lc})" [[ ${filename} =~ packages/addons/addon-depends ]] && colw=80 || colw=50 printf "[%s] %3s: %-*s: %-25s: %s\n" "${txcolour}${level}${TXRESET}" "${flc}" ${colw} "${filename}" "${msg}" "${data}" } process_line() { local filename="$1" lc="$2" line="$3" inassign="$4" funcname="$5" local var matches assignallowed=Y if [ -n "${funcname}" -a "${funcname}" != "configure_package" -a "${inassign}" = "Y" ]; then if [[ ${line} =~ PKG_DEPENDS_.*= ]]; then log "${filename}" ${lc} "WARN" "ignored depends assign" "${funcname}() => ${line//[[:space:]]*PKG_DEPENDS_/PKG_DEPENDS_}" fi fi [ -n "${funcname}" ] && return 0 rightside="${line#*=}" for var in PKG_SHORTDESC PKG_LONGDESC PKG_IS_ADDON PKG_NEED_UNPACK PKG_SOURCE_NAME PKG_ADDON_IS_STANDALONE \ PKG_CONFIGURE_SCRIPT PKG_CMAKE_SCRIPT PKG_MESON_SCRIPT \ PKG_DIR PKG_ADDON_ID PKG_BUILD \ DESTIMAGE CC CXX CPP LD AS AR NM \ RANLIB OBJCOPY OBJDUMP STRIP \ CPPFLAGS CFLAGS CXXFLAGS LDFLAGS \ PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PKG_CONFIG_SYSROOT_BASE PKG_CONFIG_SYSROOT_DIR PKG_CONFIG_ALLOW_SYSTEM_CFLAGS PKG_CONFIG_ALLOW_SYSTEM_LIBS \ CMAKE_CONF CMAKE \ HOST_CC HOST_CXX HOSTCC HOSTCXX \ CC_FOR_BUILD CXX_FOR_BUILD BUILD_CC BUILD_CXX \ _python_sysroot _python_prefix _python_exec_prefix \ TARGET_CONFIGURE_OPTS CMAKE_GENERATOR_NINJA TARGET_CMAKE_OPTS TARGET_MESON_OPTS \ HOST_CONFIGURE_OPTS HOST_CMAKE_OPTS HOST_MESON_OPTS \ INIT_CONFIGURE_OPTS INIT_CMAKE_OPTS INIT_MESON_OPTS \ BOOTSTRAP_CONFIGURE_OPTS BOOTSTRAP_CMAKE_OPTS BOOTSTRAP_MESON_OPTS \ ; do # After PKG_DIR, treat assigns to var as invalid [ "${var}" = "PKG_DIR" ] && assignallowed=N if [ "${assignallowed}" = "N" ]; then if [[ ${line} =~ (^|[[:space:]])${var}= ]]; then [ "${inassign}" = "N" ] && matches+=", assign to ${var}" fi fi if [[ ${line} =~ \$\{${var}} ]] || [[ ${line} =~ \$${var}[^A-Za-z0-9_] ]]; then matches+=", ref ${var}" fi if [[ ${line} =~ (^|[[:space:]])unset\ ${var}($|[[:space:]]) ]]; then matches+=", unset ${var}" fi done [ -n "${matches}" ] && log "${filename}" ${lc} "FAIL" "late binding violation" "${matches:2}" } init_target_funcs() { local f t funcs for t in target host init bootstrap; do for f in pre_build \ pre_configure configure post_configure \ pre_make make post_make \ pre_makeinstall makeinstall post_makeinstall \ ; do funcs+=" ${f}_${t}" done done echo "${funcs:1}" } check_func_name() { local filename="$1" lc="$2" line="$3" local f for f in configure_package \ pre_unpack unpack post_unpack \ pre_patch post_patch \ pre_configure \ ${TARGET_FUNCS} \ pre_install post_install \ addon post_install_addon \ ; do [[ ${line} =~ ^${f} ]] && return 0 done log "${filename}" ${lc} "WARN" "unknown function" "${line// *{*/}" } process_pkg() { local filename="$1" local lc=0 isassign=N funcname= fc=0 intertwined=N while IFS= read -r line; do lc=$((lc + 1)) [[ ${line} =~ ^[[:space:]]*$ ]] && continue [[ ${line} =~ ^(|[[:space:]]*)# ]] && continue if [[ "${line}" =~ ^[^#]*\(\)[[:space:]]*$ ]]; then log "${filename}" ${lc} "FAIL" "bad func - missing brace" "${line}" fi if [[ "${line}" =~ \(\)[[:space:]]*\{ ]]; then funcname="${line//(*/}" fc=$((fc+1)) check_func_name "${filename}" "${lc}" "${line}" fi if [ "${intertwined}" = "N" -a -z "${funcname}" -a ${fc} -ge 1 ]; then log "${filename}" ${lc} "WARN" "intertwined vars & funcs" "${line}" intertwined=Y fi [[ "${line}" =~ ^[[:space:]]*PKG_.*=\" ]] && isassign=Y process_line "$1" "${lc}" "${line}" "${isassign}" "${funcname}" [[ "${line}" =~ (\"$|\"[[:space:]]*$|\"[[:space:]]*#.*$) ]] && isassign=N [[ "${line}" =~ (^}|^[[:space:]]*}) ]] && funcname= done < "${filename}" # Duplicate function check while read -r count line; do [ -n "${line}" ] && log "${filename}" 0 "FAIL" "duplicate function def" "${line}" done <<< "$(grep -E ".*() {" "${filename}" | sed 's/[[:space:]]*{.*//' | sort | uniq -c | grep -v ^[[:space:]]*1[[:space:]])" } TARGET_FUNCS="$(init_target_funcs)" if [ $# -ne 0 ]; then for arg in ${@}; do for p in $(find packages projects -type f -path */${arg}/package.mk | sort); do echo -en "${TXCLR}${p}...\r" >&2 process_pkg "${p}" done done else for p in $(find packages projects -type f -name package.mk | sort); do echo -en "${TXCLR}${p}...\r" >&2 process_pkg "${p}" done fi echo -en "${TXCLR}" >&2 ================================================ FILE: tools/pkginfo ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) STRIP=no if [ "$1" = "--strip" -o "$1" = "-s" ]; then shift STRIP=yes fi . config/options "$1" shift echo "PROJECT=${PROJECT}, DEVICE=${DEVICE}, ARCH=${ARCH}" for v in PKG_NAME PKG_VERSION PKG_SITE PKG_URL PKG_DIR \ PKG_NEED_UNPACK PKG_DEPENDS_UNPACK \ PKG_DEPENDS_BOOTSTRAP PKG_DEPENDS_INIT PKG_DEPENDS_HOST PKG_DEPENDS_TARGET \ PKG_IS_ADDON PKG_IS_KERNEL_PKG $@; do if [ "${STRIP}" = "yes" ]; then echo "${v}=\"${!v}\"" | sed "s#${ROOT}/##g" else echo "${v}=\"${!v}\"" fi done ================================================ FILE: tools/refresh-patches ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) . config/options "${1}" command -v quilt >/dev/null 2>&1 || die "please install quilt" if [ -z "${1}" ]; then die "usage: ${0} package_name" fi if [ -z "${PKG_NAME}" ]; then die "$(print_color CLR_ERROR "${1}: no package.mk file found")" fi ${SCRIPTS}/get "${PKG_NAME}" mkdir -p ${BUILD}/build build_msg "CLR_UNPACK" "REFRESH" "${PKG_NAME}" PKG_UNPACK_DIR="${BUILD}/.unpack/${PKG_NAME}" rm -rf "${PKG_UNPACK_DIR}" mkdir -p "${PKG_UNPACK_DIR}" PKG_BUILD="${PKG_UNPACK_DIR}/refresh-${PKG_NAME}-${PKG_VERSION}" pkg_call_exists_opt pre_unpack && pkg_call if pkg_call_exists unpack; then pkg_call else if [ -n "${PKG_URL}" ]; then ${SCRIPTS}/extract "${PKG_NAME}" "${PKG_UNPACK_DIR}" fi pkg_call_finish fi if [ -z "${PKG_SOURCE_DIR}" -a -d "${PKG_UNPACK_DIR}/${PKG_NAME}-${PKG_VERSION}"* ]; then mv "${PKG_UNPACK_DIR}/${PKG_NAME}-${PKG_VERSION}"* "${PKG_UNPACK_DIR}/.intermediate" fi if [ ! -d "${PKG_UNPACK_DIR}/.intermediate" ]; then if [ -n "${PKG_SOURCE_DIR}" ]; then if [ -d "${PKG_UNPACK_DIR}"/${PKG_SOURCE_DIR} ]; then mv "${PKG_UNPACK_DIR}"/${PKG_SOURCE_DIR} "${PKG_UNPACK_DIR}/.intermediate" else # fallback mv "${BUILD}"/${PKG_SOURCE_DIR} "${PKG_UNPACK_DIR}/.intermediate" fi fi fi [ ! -d "${PKG_UNPACK_DIR}/.intermediate" ] && mkdir -p "${PKG_UNPACK_DIR}/.intermediate" if [ -d "${PKG_DIR}/sources" ]; then cp -PRf "${PKG_DIR}/sources/"* "${PKG_UNPACK_DIR}/.intermediate" fi mv "${PKG_UNPACK_DIR}/.intermediate" "${PKG_BUILD}" pkg_call_exists_opt post_unpack && pkg_call pkg_call_exists_opt pre_patch && pkg_call if [ "${TARGET_ARCH}" = "x86_64" ]; then PATCH_ARCH="x86" elif [ "${PKG_IS_KERNEL_PKG}" = "yes" ]; then PATCH_ARCH="${TARGET_KERNEL_PATCH_ARCH:-${TARGET_ARCH}}" else PATCH_ARCH="${TARGET_PATCH_ARCH:-${TARGET_ARCH}}" fi PATCH_DIRS_PKG="" PATCH_DIRS_PRJ="" if [ -n "${PKG_PATCH_DIRS}" ]; then for patch_dir in ${PKG_PATCH_DIRS}; do if [[ ${patch_dir} =~ ^/ ]]; then [ -f ${patch_dir} ] && PATCH_DIRS_PKG+=" ${patch_dir}" [ -d ${patch_dir} ] && PATCH_DIRS_PKG+=" ${patch_dir}/*.patch" else [ -d ${PKG_DIR}/patches/${patch_dir} ] && PATCH_DIRS_PKG+=" ${PKG_DIR}/patches/${patch_dir}/*.patch" [ -d ${PROJECT_DIR}/${PROJECT}/patches/${PKG_NAME}/${patch_dir} ] && PATCH_DIRS_PRJ+=" ${PROJECT_DIR}/${PROJECT}/patches/${PKG_NAME}/${patch_dir}/*.patch" [ -d ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/patches/${PKG_NAME}/${patch_dir} ] && PATCH_DIRS_PRJ+=" ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/patches/${PKG_NAME}/${patch_dir}/*.patch" fi done fi rm -rf "${PKG_BUILD}/patches" mkdir -p "${PKG_BUILD}/patches" for i in ${PKG_DIR}/patches/*.patch \ ${PKG_DIR}/patches/${PATCH_ARCH}/*.patch \ ${PATCH_DIRS_PKG} \ ${PKG_DIR}/patches/${PKG_VERSION}/*.patch \ ${PKG_DIR}/patches/${PKG_VERSION}/${PATCH_ARCH}/*.patch \ ${PROJECT_DIR}/${PROJECT}/patches/${PKG_NAME}/*.patch \ ${PROJECT_DIR}/${PROJECT}/patches/${PKG_NAME}/${PATCH_ARCH}/*.patch \ ${PATCH_DIRS_PRJ} \ ${PROJECT_DIR}/${PROJECT}/patches/${PKG_NAME}/${PKG_VERSION}/*.patch \ ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/patches/${PKG_NAME}/*.patch; do if [ -f "${i}" ]; then PATCH="${i#${ROOT}/}" mkdir -p "$(dirname ${PKG_BUILD}/patches/${PATCH})" ln -s "${i}" "${PKG_BUILD}/patches/${PATCH}" echo "${PATCH}" >> "${PKG_BUILD}/patches/series" fi done quilt_cmd() { quilt --quiltrc=- $* } cd "${PKG_BUILD}" while quilt_cmd next >/dev/null 2>&1; do if ! quilt_cmd push; then PATCH="$(quilt_cmd next)" if patch -R -f --dry-run -p1 -i "patches/${PATCH}" >/dev/null 2>&1; then build_msg "CLR_UNPACK" "REFRESH" "${PKG_NAME} Removing already applied patch ${PATCH}\n" rm -f $(readlink "patches/${PATCH}") quilt_cmd delete -n -r continue else exit 1 fi fi QUILT_DIFF_OPTS="-p" quilt_cmd refresh -p ab --no-index --no-timestamps done # cleanup rm -rf "${PKG_UNPACK_DIR}" ================================================ FILE: tools/repo-tool ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Lukas Rusak (lrusak@libreelec.tv) . config/options update_addons_xml() { echo "[*] cleanup addons ..." olddir="" find target/addons/$ADDON_VERSION -iname 'changelog*.txt' | sort -rV | while read line ; do dir=$(dirname $line) if [ "$olddir" = "$dir" ] ; then rm -f $line fi olddir=$dir done olddir="" find target/addons/$ADDON_VERSION -iname '*.zip' | sort -rV | while read line ; do dir=$(dirname $line) if [ "$olddir" = "$dir" ] ; then rm -f $line fi olddir=$dir done echo "[*] updating addons.xml* ..." rm -rf .addons pwd=`pwd` find target/addons/$ADDON_VERSION -iname addons.xml | while read line ; do localdir=`echo $line | sed s/addons.xml//g` echo " [*] updating $line..." echo '<?xml version="1.0" encoding="UTF-8"?> <addons> ' > $line.tmp for zip in $localdir/*/*.zip ; do mkdir -p ".addons/$localdir" unzip $zip "*/addon.xml" -d ".addons/$localdir" &>/dev/null done find .addons/$localdir -iname addon.xml | grep -v resources/ | while read xml ; do cat $xml | grep -v "<?" >> $line.tmp done echo ' </addons>' >> $line.tmp mv $line.tmp $line cd $localdir md5sum addons.xml > addons.xml.md5 cd $pwd done rm -rf .addons } touch_addons_xml() { for PROJECT in $(ls -1 projects); do if [ -d "projects/$PROJECT/devices" ]; then for DEVICE in $(ls -1 projects/$PROJECT/devices); do for archfile in projects/$PROJECT/devices/$DEVICE/linux/linux.*.conf; do ARCH=`echo $archfile | sed -n '$s/\.conf//;$s/.*\.//p'` if [ ! -d target/addons/$ADDON_VERSION/$DEVICE/$ARCH ]; then break fi if [ ! -f target/addons/$ADDON_VERSION/$DEVICE/$ARCH/addons.xml ]; then touch target/addons/$ADDON_VERSION/$DEVICE/$ARCH/addons.xml fi done done else for archfile in projects/$PROJECT/linux/linux.*.conf; do ARCH=`echo $archfile | sed -n '$s/\.conf//;$s/.*\.//p'` if [ ! -d target/addons/$ADDON_VERSION/$PROJECT/$ARCH ]; then break fi if [ ! -f target/addons/$ADDON_VERSION/$PROJECT/$ARCH/addons.xml ]; then touch target/addons/$ADDON_VERSION/$PROJECT/$ARCH/addons.xml fi done fi done } upload() { if [ -f .work/repoconfig ] ; then . .work/repoconfig fi if [ -z "$RSYNC_REPO" ] ; then echo "*** ERROR: \$RSYNC_REPO not set. see .work/repoconfig ***" exit 0 fi touch_addons_xml update_addons_xml rsync -av --progress --delete "$RSYNC_SHELL" target/addons/$ADDON_VERSION $RSYNC_REPO } build() { [ -n "$3" ] && DEVICE="$3" || DEVICE="" for PROJECT in $2; do if [ -n "$DEVICE" ]; then for archfile in projects/$PROJECT/devices/$DEVICE/linux/linux.*.conf; do ARCH=`echo $archfile | sed -n '$s/\.conf//;$s/.*\.//p'` done else for archfile in projects/$PROJECT/linux/linux.*.conf; do ARCH=`echo $archfile | sed -n '$s/\.conf//;$s/.*\.//p'` done fi for package in $(find $1 -iname package.mk) ; do ( . $package if [ "$PKG_IS_ADDON" = "yes" ] ; then ADDON=$PKG_NAME PROJECT=$PROJECT DEVICE=$DEVICE ARCH=$ARCH ./scripts/create_addon $ADDON fi ) done done } update_revision() { for package in $(find $1 -iname package.mk) ; do [[ "$2" == "Y" && $package =~ .*/game.libretro.* ]] && continue ( . $package if [ "$PKG_IS_ADDON" = "yes" ] ; then sed -i -e "s|PKG_REV=.*|PKG_REV=\"$((PKG_REV+1))\"|" $package fi ) done } update_repo_version() { for package in $(find packages/addons -iname package.mk) ; do ( . $package if [ "$PKG_IS_ADDON" = "yes" ] ; then sed -i -e "s|PKG_ADDON_REPOVERSION=.*|PKG_ADDON_REPOVERSION=\"$ADDON_VERSION\"|" $package sed -i -e "s|PKG_REV=.*|PKG_REV=\"100\"|" $package changelog="$(echo $package | sed 's/package.mk/changelog.txt/')" sed -i "1i${ADDON_VERSION}.100\n- Update for LibreELEC ${ADDON_VERSION}\n" $changelog fi ) done } usage() { echo " usage: $0 -u to upload" echo " $0 -b binary|retroplayer|official|all [project-name] to build [for a single project]" echo " $0 -ru binary|retroplayer|official|all to update PKG_REV" echo " $0 -rv to update PKG_ADDON_REPOVERSION" echo " $0 -xml to update the addons.xml" } if [ "$1" = "-b" -o "$1" = "-ru" ]; then if [ -z "$2" ]; then usage exit 0 fi fi if [ "$1" = "-b" -o "$1" = "-ru" ]; then exclude_games=N case $2 in binary) repo="packages/mediacenter/kodi-binary-addons" exclude_games=Y ;; retroplayer) repo="packages/mediacenter/kodi-binary-addons/game.libretro.*" ;; official) repo="packages/addons" ;; all) repo="packages/addons packages/mediacenter/kodi-binary-addons" ;; *) usage exit 0 ;; esac if [ "$1" = "-b" ]; then [ -n "$3" ] && project="$3" || project="$(ls -1 projects)" if [ "$3" == "RPi" ]; then project="RPi" device="RPi" elif [ "$3" == "RPi2" ]; then project="RPi" device="RPi2" fi fi fi case $1 in -b) build "$repo" "$project" "$device" ;; -u) upload ;; -ru) update_revision "$repo" "$exclude_games" ;; -rv) update_repo_version ;; -xml) touch_addons_xml update_addons_xml ;; *) usage exit 0 ;; esac ================================================ FILE: tools/update-scan ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) set -e . config/options "" # check if depends are available command -v curl >/dev/null 2>&1 || die "please install curl" command -v jq >/dev/null 2>&1 || die "please install jq" # global vars PACKAGES_CURRENT="" PACKAGES_IGNORED="" PACKAGES_NOT_REGISTERED="" github_api_token="" github_api="no" test_github_api() { # check for github user and token present at ~/.libreelec/options to activate github api checks if [[ -n "${github_token}" || -n "${github_user}" ]]; then github_api_token="-u ${github_user}:${github_token}" # check if token works if curl -sL -I "${github_api_token}" https://api.github.com/user | grep -q -e "^[Ss]tatus: 200" -e "^HTTP/2 200"; then echo "Github api usage activated" github_api="yes" else message="\n your Github token is not working\n" message+=" github_token=${github_token}\n" message+=" github_user=${github_user}\n" die "${message}" fi else message="\n | Github API not in use. Some features are disabled.\n" message+=" |==============================================================================\n" message+=" | Create your \"Personal access token\" here: https://github.com/settings/tokens\n" message+=" | Add your token and username to ~/.libreelec/options\n" message+=" | github_token=\"your_github_token_here\"\n" message+=" | github_user=\"your_github_username_here\"\n" echo -e "${message}" fi } check_for_update() { local PKG_NAME PKG_URL PKG_VERSION RMO_API_RESPONSE GH_API_TAG # source variables from package.mk PKG_NAME="$(grep -oP -m 1 '(?<=PKG_NAME=\").*(?=\")' ${1} || true)" PKG_VERSION="$(grep -oP -m 1 '(?<=PKG_VERSION=\").*(?=\")' ${1} || true)" eval PKG_URL="$(grep -oP -m 1 '(?<=PKG_URL=\").*(?=\")' ${1} || true)" # check if version and url are empty or self hosted by us and ignore those packages if [ -z "${PKG_VERSION}" ] || [ -z "${PKG_URL}" ] || [[ "${PKG_URL}" == "$DISTRO_SRC"* ]]; then PACKAGES_IGNORED+="${PKG_NAME} " return fi # check if package exists at tracker RMO_API_RESPONSE=$(curl -sL "https://release-monitoring.org/api/project/LibreELEC/${PKG_NAME}" || true) upstream_version=$(echo "${RMO_API_RESPONSE}" | jq -r '.version') # look for alternative versions if necessary if [ "${upstream_version}" = "null" ]; then if [[ $(echo "${RMO_API_RESPONSE}" | jq -r '.error') =~ "No package" ]]; then # pkg is on github, uses githash for version, and github api available if [[ ${PKG_URL} =~ ^.*(github\.com).*$ ]] && \ [[ ${PKG_VERSION} =~ ^[a-z0-9]{40} ]] && \ [[ "${github_api}" = "yes" ]]; then github_repos=$(echo "${PKG_URL}" | grep -oP '(?<=https:\/\/github.com\/)?[0-9A-Za-z._-]+\/[0-9A-Za-z._-]+(?=/archive|/tags|/releases)') le_master_version_date="Commit date: $(curl -sL ${github_api_token} https://api.github.com/repos/${github_repos}/git/commits/${PKG_VERSION} | jq -r '.committer.date')" upstream_latest_commit=$(curl -sL "${github_api_token}" "https://api.github.com/repos/${github_repos}/git/refs/heads/master" | jq -r '.object.url') upstream_latest_commit_date=$(curl -sL "${github_api_token}" "${upstream_latest_commit}" | jq -r '.committer.date') GH_API_TAG=$(curl -sL "${github_api_token}" "https://api.github.com/repos/${github_repos}/tags") upstream_latest_tag=$(echo "${GH_API_TAG}" | jq -r '.[0].name') upstream_latest_tag_url=$(echo "${GH_API_TAG}" | jq -r '.[0].commit.url') upstream_latest_tag_date=$(curl -sL "${github_api_token}" "${upstream_latest_tag_url}" | jq -r '.commit.committer.date') # compare upstream with local version if [ "${PKG_VERSION}" != "${upstream_latest_commit##*/}" ]; then # get upstream tag informations if [ "${upstream_latest_tag}" != "null" ]; then tag=" | TAG: ${upstream_latest_tag} (${upstream_latest_tag_date%T*})" else tag=" | TAG: no tags" fi upstream_version="Master: ${upstream_latest_commit_date%T*}${tag}" PKG_VERSION="${le_master_version_date%T*}" else upstream_version="${upstream_latest_commit##*/}" fi else # package is not on tracker or github PACKAGES_NOT_REGISTERED+="${PKG_NAME} " return fi else # package exist at tracker but has no version upstream_version="! broken at release tracker !" fi fi # print version output line if [ "${PKG_VERSION}" != "${upstream_version}" ]; then printf "%-35s | %-40s | %-20s" "${PKG_NAME}" "${PKG_VERSION}" "${upstream_version}"; printf '\n' else PACKAGES_CURRENT+="${PKG_NAME} " fi } # create list of packages if [ -n "${1}" ]; then PACKAGE_LIST="$(find packages/ -type d -name ${1})/package.mk" if [ ! -f "${PACKAGE_LIST}" ]; then die "Package not found: ${1}" fi else PACKAGE_LIST="$(find packages/ -type f -name package.mk \ ! -path "packages/addons/addon-depends/adafruit-libraries-depends/*" \ ! -path "packages/emulation/*" \ ! -path "packages/linux/*" \ ! -path "packages/mediacenter/*" \ | awk '{FS="/" ; $0=$0 ; print $(NF-1)"|"$0}' | sort | cut -d"|" -f2 \ )" fi # test github api availability test_github_api # output echo -e "\nUpdates found:\n" printf "%-35s | %-40s | %-20s" "Package" "LE git master" "upstream location"; printf '\n' echo -e ''$_{1..140}'\b-' for check_version in ${PACKAGE_LIST}; do check_for_update "${check_version}" done echo "" if [ -n "${PACKAGES_CURRENT}" ]; then echo -e "\nCurrent $(echo ${PACKAGES_CURRENT} | wc -w):\n${PACKAGES_CURRENT}\n" fi if [ -n "${PACKAGES_IGNORED}" ]; then echo -e "\nIgnored $(echo ${PACKAGES_IGNORED} | wc -w):\n${PACKAGES_IGNORED}" fi if [ -n "${PACKAGES_NOT_REGISTERED}" ]; then echo -e "\nPackages not known at tracker $(echo ${PACKAGES_NOT_REGISTERED} | wc -w):\n${PACKAGES_NOT_REGISTERED}\n" fi ================================================ FILE: tools/viewconfig ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) . config/options "" . config/show_config # Needed to obtain some CFLAGS/LDFLAGS setup_toolchain target show_config ================================================ FILE: tools/viewplan ================================================ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) unset _CACHE_PACKAGE_LOCAL_DEVICE CACHE_PACKAGE_LOCAL _CACHE_PACKAGE_GLOBAL _DEBUG_DEPENDS_LIST _DEBUG_PACKAGE_LIST . config/options "" ${SCRIPTS}/pkgjson | ${SCRIPTS}/genbuildplan.py --show-wants --build ${@:-image} --warn-invalid ${GENFLAGS} || \ die "FAILURE: Unable to generate plan"